From 70e2cefd9894d1768bdfffc313abeda1ab9add17 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Mon, 16 Nov 2020 08:56:04 +0800 Subject: [PATCH] go mod vendor --- script/send_voice | 0 vendor/github.com/BurntSushi/toml/.gitignore | 5 + vendor/github.com/BurntSushi/toml/.travis.yml | 15 + vendor/github.com/BurntSushi/toml/COMPATIBLE | 3 + vendor/github.com/BurntSushi/toml/COPYING | 21 + vendor/github.com/BurntSushi/toml/Makefile | 19 + vendor/github.com/BurntSushi/toml/README.md | 218 + vendor/github.com/BurntSushi/toml/decode.go | 509 + .../github.com/BurntSushi/toml/decode_meta.go | 121 + vendor/github.com/BurntSushi/toml/doc.go | 27 + vendor/github.com/BurntSushi/toml/encode.go | 568 + .../BurntSushi/toml/encoding_types.go | 19 + .../BurntSushi/toml/encoding_types_1.1.go | 18 + vendor/github.com/BurntSushi/toml/lex.go | 953 + vendor/github.com/BurntSushi/toml/parse.go | 592 + vendor/github.com/BurntSushi/toml/session.vim | 1 + .../github.com/BurntSushi/toml/type_check.go | 91 + .../github.com/BurntSushi/toml/type_fields.go | 242 + vendor/github.com/MichaelTJones/pcg/LICENSE | 201 + vendor/github.com/MichaelTJones/pcg/README.md | 51 + vendor/github.com/MichaelTJones/pcg/pcg32.go | 86 + vendor/github.com/MichaelTJones/pcg/pcg64.go | 63 + vendor/github.com/apache/thrift/LICENSE | 253 + vendor/github.com/apache/thrift/NOTICE | 5 + .../lib/go/thrift/application_exception.go | 142 + .../thrift/lib/go/thrift/binary_protocol.go | 560 + .../lib/go/thrift/buffered_transport.go | 75 + .../thrift/lib/go/thrift/compact_protocol.go | 815 + .../thrift/lib/go/thrift/debug_protocol.go | 269 + .../thrift/lib/go/thrift/deserializer.go | 58 + .../apache/thrift/lib/go/thrift/exception.go | 44 + .../apache/thrift/lib/go/thrift/field.go | 79 + .../thrift/lib/go/thrift/framed_transport.go | 167 + .../thrift/lib/go/thrift/http_client.go | 212 + .../lib/go/thrift/iostream_transport.go | 214 + .../thrift/lib/go/thrift/json_protocol.go | 580 + .../thrift/lib/go/thrift/memory_buffer.go | 79 + .../thrift/lib/go/thrift/messagetype.go | 31 + .../lib/go/thrift/multiplexed_protocol.go | 169 + .../apache/thrift/lib/go/thrift/numeric.go | 164 + .../apache/thrift/lib/go/thrift/pointerize.go | 50 + .../apache/thrift/lib/go/thrift/processor.go | 30 + .../thrift/lib/go/thrift/processor_factory.go | 58 + .../apache/thrift/lib/go/thrift/protocol.go | 175 + .../lib/go/thrift/protocol_exception.go | 78 + .../thrift/lib/go/thrift/protocol_factory.go | 25 + .../thrift/lib/go/thrift/rich_transport.go | 69 + .../apache/thrift/lib/go/thrift/serializer.go | 75 + .../apache/thrift/lib/go/thrift/server.go | 35 + .../thrift/lib/go/thrift/server_socket.go | 121 + .../thrift/lib/go/thrift/server_transport.go | 34 + .../lib/go/thrift/simple_json_protocol.go | 1320 + .../thrift/lib/go/thrift/simple_server.go | 187 + .../apache/thrift/lib/go/thrift/socket.go | 166 + .../thrift/lib/go/thrift/ssl_server_socket.go | 109 + .../apache/thrift/lib/go/thrift/ssl_socket.go | 171 + .../apache/thrift/lib/go/thrift/transport.go | 68 + .../lib/go/thrift/transport_exception.go | 90 + .../thrift/lib/go/thrift/transport_factory.go | 39 + .../apache/thrift/lib/go/thrift/type.go | 68 + .../thrift/lib/go/thrift/zlib_transport.go | 117 + vendor/github.com/beorn7/perks/LICENSE | 20 + .../beorn7/perks/quantile/exampledata.txt | 2388 ++ .../beorn7/perks/quantile/stream.go | 316 + .../github.com/cespare/xxhash/v2/.travis.yml | 8 + .../github.com/cespare/xxhash/v2/LICENSE.txt | 22 + vendor/github.com/cespare/xxhash/v2/README.md | 67 + vendor/github.com/cespare/xxhash/v2/go.mod | 3 + vendor/github.com/cespare/xxhash/v2/go.sum | 0 vendor/github.com/cespare/xxhash/v2/xxhash.go | 236 + .../cespare/xxhash/v2/xxhash_amd64.go | 13 + .../cespare/xxhash/v2/xxhash_amd64.s | 215 + .../cespare/xxhash/v2/xxhash_other.go | 76 + .../cespare/xxhash/v2/xxhash_safe.go | 15 + .../cespare/xxhash/v2/xxhash_unsafe.go | 46 + .../coreos/go-semver}/LICENSE | 0 vendor/github.com/coreos/go-semver/NOTICE | 5 + .../coreos/go-semver/semver/semver.go | 296 + .../coreos/go-semver/semver/sort.go | 38 + vendor/github.com/coreos/go-systemd/LICENSE | 191 + vendor/github.com/coreos/go-systemd/NOTICE | 5 + .../coreos/go-systemd/journal/journal.go | 225 + vendor/github.com/coreos/pkg/LICENSE | 202 + vendor/github.com/coreos/pkg/NOTICE | 5 + .../github.com/coreos/pkg/capnslog/README.md | 39 + .../coreos/pkg/capnslog/formatters.go | 157 + .../coreos/pkg/capnslog/glog_formatter.go | 96 + vendor/github.com/coreos/pkg/capnslog/init.go | 49 + .../coreos/pkg/capnslog/init_windows.go | 25 + .../coreos/pkg/capnslog/journald_formatter.go | 68 + .../coreos/pkg/capnslog/log_hijack.go | 39 + .../github.com/coreos/pkg/capnslog/logmap.go | 245 + .../coreos/pkg/capnslog/pkg_logger.go | 191 + .../coreos/pkg/capnslog/syslog_formatter.go | 65 + vendor/github.com/edsrzf/mmap-go/.gitignore | 8 + vendor/github.com/edsrzf/mmap-go/LICENSE | 25 + vendor/github.com/edsrzf/mmap-go/README.md | 12 + vendor/github.com/edsrzf/mmap-go/mmap.go | 117 + vendor/github.com/edsrzf/mmap-go/mmap_unix.go | 51 + .../github.com/edsrzf/mmap-go/mmap_windows.go | 143 + vendor/github.com/gogo/protobuf/AUTHORS | 15 + vendor/github.com/gogo/protobuf/CONTRIBUTORS | 23 + vendor/github.com/gogo/protobuf/LICENSE | 35 + .../gogo/protobuf/gogoproto/Makefile | 37 + .../github.com/gogo/protobuf/gogoproto/doc.go | 169 + .../gogo/protobuf/gogoproto/gogo.pb.go | 874 + .../gogo/protobuf/gogoproto/gogo.pb.golden | 45 + .../gogo/protobuf/gogoproto/gogo.proto | 144 + .../gogo/protobuf/gogoproto/helper.go | 415 + .../github.com/gogo/protobuf/proto/Makefile | 43 + .../github.com/gogo/protobuf/proto/clone.go | 258 + .../gogo/protobuf/proto/custom_gogo.go | 39 + .../github.com/gogo/protobuf/proto/decode.go | 427 + .../gogo/protobuf/proto/deprecated.go | 63 + .../github.com/gogo/protobuf/proto/discard.go | 350 + .../gogo/protobuf/proto/duration.go | 100 + .../gogo/protobuf/proto/duration_gogo.go | 49 + .../github.com/gogo/protobuf/proto/encode.go | 205 + .../gogo/protobuf/proto/encode_gogo.go | 33 + .../github.com/gogo/protobuf/proto/equal.go | 300 + .../gogo/protobuf/proto/extensions.go | 605 + .../gogo/protobuf/proto/extensions_gogo.go | 389 + vendor/github.com/gogo/protobuf/proto/lib.go | 973 + .../gogo/protobuf/proto/lib_gogo.go | 50 + .../gogo/protobuf/proto/message_set.go | 181 + .../gogo/protobuf/proto/pointer_reflect.go | 357 + .../protobuf/proto/pointer_reflect_gogo.go | 59 + .../gogo/protobuf/proto/pointer_unsafe.go | 308 + .../protobuf/proto/pointer_unsafe_gogo.go | 56 + .../gogo/protobuf/proto/properties.go | 610 + .../gogo/protobuf/proto/properties_gogo.go | 36 + .../gogo/protobuf/proto/skip_gogo.go | 119 + .../gogo/protobuf/proto/table_marshal.go | 3009 ++ .../gogo/protobuf/proto/table_marshal_gogo.go | 388 + .../gogo/protobuf/proto/table_merge.go | 676 + .../gogo/protobuf/proto/table_unmarshal.go | 2249 ++ .../protobuf/proto/table_unmarshal_gogo.go | 385 + vendor/github.com/gogo/protobuf/proto/text.go | 930 + .../gogo/protobuf/proto/text_gogo.go | 57 + .../gogo/protobuf/proto/text_parser.go | 1018 + .../gogo/protobuf/proto/timestamp.go | 113 + .../gogo/protobuf/proto/timestamp_gogo.go | 49 + .../gogo/protobuf/proto/wrappers.go | 1888 + .../gogo/protobuf/proto/wrappers_gogo.go | 113 + .../protoc-gen-gogo/descriptor/Makefile | 36 + .../protoc-gen-gogo/descriptor/descriptor.go | 118 + .../descriptor/descriptor.pb.go | 2865 ++ .../descriptor/descriptor_gostring.gen.go | 752 + .../protoc-gen-gogo/descriptor/helper.go | 390 + .../gogo/protobuf/sortkeys/sortkeys.go | 101 + vendor/github.com/gogo/protobuf/types/any.go | 140 + .../github.com/gogo/protobuf/types/any.pb.go | 697 + .../github.com/gogo/protobuf/types/api.pb.go | 2143 ++ vendor/github.com/gogo/protobuf/types/doc.go | 35 + .../gogo/protobuf/types/duration.go | 100 + .../gogo/protobuf/types/duration.pb.go | 520 + .../gogo/protobuf/types/duration_gogo.go | 100 + .../gogo/protobuf/types/empty.pb.go | 465 + .../gogo/protobuf/types/field_mask.pb.go | 741 + .../gogo/protobuf/types/protosize.go | 34 + .../gogo/protobuf/types/source_context.pb.go | 527 + .../gogo/protobuf/types/struct.pb.go | 2280 ++ .../gogo/protobuf/types/timestamp.go | 130 + .../gogo/protobuf/types/timestamp.pb.go | 542 + .../gogo/protobuf/types/timestamp_gogo.go | 94 + .../github.com/gogo/protobuf/types/type.pb.go | 3370 ++ .../gogo/protobuf/types/wrappers.pb.go | 2730 ++ .../gogo/protobuf/types/wrappers_gogo.go | 300 + vendor/github.com/golang/freetype/AUTHORS | 20 + .../github.com/golang/freetype/CONTRIBUTORS | 38 + vendor/github.com/golang/freetype/LICENSE | 12 + vendor/github.com/golang/freetype/README | 21 + vendor/github.com/golang/freetype/freetype.go | 341 + .../github.com/golang/freetype/raster/geom.go | 245 + .../golang/freetype/raster/paint.go | 287 + .../golang/freetype/raster/raster.go | 601 + .../golang/freetype/raster/stroke.go | 483 + .../golang/freetype/truetype/face.go | 507 + .../golang/freetype/truetype/glyph.go | 522 + .../golang/freetype/truetype/hint.go | 1770 + .../golang/freetype/truetype/opcodes.go | 289 + .../golang/freetype/truetype/truetype.go | 653 + vendor/github.com/golang/mock/AUTHORS | 12 + vendor/github.com/golang/mock/CONTRIBUTORS | 37 + vendor/github.com/golang/mock/LICENSE | 202 + vendor/github.com/golang/mock/gomock/call.go | 427 + .../github.com/golang/mock/gomock/callset.go | 108 + .../golang/mock/gomock/controller.go | 264 + .../github.com/golang/mock/gomock/matchers.go | 255 + .../golang/protobuf/jsonpb/jsonpb.go | 1290 + .../protoc-gen-go/descriptor/descriptor.pb.go | 2887 ++ .../protoc-gen-go/descriptor/descriptor.proto | 883 + .../protoc-gen-go/plugin/plugin.pb.go | 369 + .../protoc-gen-go/plugin/plugin.pb.golden | 83 + .../protoc-gen-go/plugin/plugin.proto | 167 + .../github.com/golang/protobuf/ptypes/any.go | 141 + .../golang/protobuf/ptypes/any/any.pb.go | 200 + .../golang/protobuf/ptypes/any/any.proto | 154 + .../github.com/golang/protobuf/ptypes/doc.go | 35 + .../golang/protobuf/ptypes/duration.go | 102 + .../protobuf/ptypes/duration/duration.pb.go | 161 + .../protobuf/ptypes/duration/duration.proto | 117 + .../golang/protobuf/ptypes/empty/empty.pb.go | 83 + .../golang/protobuf/ptypes/empty/empty.proto | 52 + .../protobuf/ptypes/struct/struct.pb.go | 336 + .../protobuf/ptypes/struct/struct.proto | 96 + .../golang/protobuf/ptypes/timestamp.go | 132 + .../protobuf/ptypes/timestamp/timestamp.pb.go | 179 + .../protobuf/ptypes/timestamp/timestamp.proto | 135 + .../protobuf/ptypes/wrappers/wrappers.pb.go | 461 + .../protobuf/ptypes/wrappers/wrappers.proto | 118 + vendor/github.com/golang/snappy/go.mod | 1 + vendor/github.com/google/uuid/README.md | 2 +- vendor/github.com/google/uuid/marshal.go | 7 +- vendor/github.com/google/uuid/version1.go | 12 +- vendor/github.com/google/uuid/version4.go | 2 +- vendor/github.com/gorilla/context/.travis.yml | 19 - vendor/github.com/gorilla/context/README.md | 10 - vendor/github.com/gorilla/context/context.go | 143 - vendor/github.com/gorilla/context/doc.go | 88 - vendor/github.com/gorilla/mux/.travis.yml | 23 - vendor/github.com/gorilla/mux/AUTHORS | 8 + .../github.com/gorilla/mux/ISSUE_TEMPLATE.md | 11 - vendor/github.com/gorilla/mux/LICENSE | 2 +- vendor/github.com/gorilla/mux/README.md | 85 +- .../mux/{context_native.go => context.go} | 6 - .../github.com/gorilla/mux/context_gorilla.go | 26 - vendor/github.com/gorilla/mux/doc.go | 2 +- vendor/github.com/gorilla/mux/go.mod | 1 + vendor/github.com/gorilla/mux/middleware.go | 61 +- vendor/github.com/gorilla/mux/mux.go | 129 +- vendor/github.com/gorilla/mux/regexp.go | 51 +- vendor/github.com/gorilla/mux/route.go | 141 +- vendor/github.com/hashicorp/golang-lru/go.mod | 2 + vendor/github.com/hashicorp/golang-lru/lru.go | 50 +- .../hashicorp/golang-lru/simplelru/lru.go | 16 + .../golang-lru/simplelru/lru_interface.go | 7 +- vendor/github.com/hashicorp/hcl/decoder.go | 56 +- .../hydrogen18/stalecucumber/.gitignore | 2 + .../hydrogen18/stalecucumber/LICENSE | 10 + .../hydrogen18/stalecucumber/README.md | 65 + .../hydrogen18/stalecucumber/fuzz.go | 14 + .../hydrogen18/stalecucumber/helpers.go | 201 + .../hydrogen18/stalecucumber/jump_list.go | 22 + .../hydrogen18/stalecucumber/opcodes.go | 55 + .../stalecucumber/pickle_machine.go | 598 + .../hydrogen18/stalecucumber/pickle_writer.go | 514 + .../stalecucumber/populate_jump_list.go | 58 + .../hydrogen18/stalecucumber/protocol_0.go | 723 + .../hydrogen18/stalecucumber/protocol_1.go | 523 + .../hydrogen18/stalecucumber/protocol_2.go | 322 + .../hydrogen18/stalecucumber/python_types.go | 22 + .../hydrogen18/stalecucumber/tuple.go | 7 + .../hydrogen18/stalecucumber/unpack.go | 329 + vendor/github.com/jhump/protoreflect/LICENSE | 202 + .../jhump/protoreflect/codec/buffer.go | 112 + .../jhump/protoreflect/codec/decode.go | 372 + .../jhump/protoreflect/codec/decode_fields.go | 283 + .../jhump/protoreflect/codec/doc.go | 7 + .../jhump/protoreflect/codec/encode.go | 161 + .../jhump/protoreflect/codec/encode_fields.go | 273 + .../jhump/protoreflect/desc/convert.go | 231 + .../jhump/protoreflect/desc/descriptor.go | 1701 + .../protoreflect/desc/descriptor_no_unsafe.go | 28 + .../protoreflect/desc/descriptor_unsafe.go | 57 + .../github.com/jhump/protoreflect/desc/doc.go | 41 + .../jhump/protoreflect/desc/imports.go | 313 + .../protoreflect/desc/internal/source_info.go | 107 + .../jhump/protoreflect/desc/internal/util.go | 288 + .../jhump/protoreflect/desc/load.go | 341 + .../protoreflect/desc/protoparse/.gitignore | 1 + .../jhump/protoreflect/desc/protoparse/ast.go | 1118 + .../desc/protoparse/descriptor_protos.go | 527 + .../jhump/protoreflect/desc/protoparse/doc.go | 10 + .../protoreflect/desc/protoparse/errors.go | 117 + .../protoreflect/desc/protoparse/lexer.go | 781 + .../protoreflect/desc/protoparse/linker.go | 736 + .../protoreflect/desc/protoparse/options.go | 1410 + .../protoreflect/desc/protoparse/parser.go | 826 + .../protoreflect/desc/protoparse/proto.y | 920 + .../protoreflect/desc/protoparse/proto.y.go | 2310 ++ .../desc/protoparse/resolve_files.go | 175 + .../desc/protoparse/source_code_info.go | 532 + .../desc/protoparse/std_imports.go | 50 + .../desc/protoparse/test-source-info.txt | 6159 ++++ .../protoreflect/desc/protoparse/validate.go | 347 + .../jhump/protoreflect/dynamic/binary.go | 185 + .../jhump/protoreflect/dynamic/doc.go | 163 + .../protoreflect/dynamic/dynamic_message.go | 2741 ++ .../jhump/protoreflect/dynamic/equal.go | 157 + .../jhump/protoreflect/dynamic/extension.go | 46 + .../dynamic/extension_registry.go | 241 + .../jhump/protoreflect/dynamic/indent.go | 76 + .../jhump/protoreflect/dynamic/json.go | 1254 + .../jhump/protoreflect/dynamic/maps_1.11.go | 129 + .../jhump/protoreflect/dynamic/maps_1.12.go | 137 + .../jhump/protoreflect/dynamic/merge.go | 100 + .../protoreflect/dynamic/message_factory.go | 201 + .../jhump/protoreflect/dynamic/text.go | 1177 + .../protoreflect/internal/standard_files.go | 127 + .../protoreflect/internal/unrecognized.go | 86 + .../golang/gogo/collectorpb/collector.pb.go | 3870 +++ .../golang/gogo/collectorpb/collector.proto | 117 + .../golang/gogo/lightsteppb/lightstep.pb.go | 714 + .../golang/gogo/lightsteppb/lightstep.proto | 23 + .../lightstep/lightstep-tracer-go/.gitignore | 6 + .../lightstep/lightstep-tracer-go/.gitmodules | 3 + .../lightstep-tracer-go/CHANGELOG.md | 78 + .../lightstep/lightstep-tracer-go/Gopkg.lock | 258 + .../lightstep/lightstep-tracer-go/Gopkg.toml | 27 + .../lightstep/lightstep-tracer-go/LICENSE | 21 + .../lightstep/lightstep-tracer-go/Makefile | 27 + .../lightstep/lightstep-tracer-go/README.md | 117 + .../lightstep/lightstep-tracer-go/VERSION | 1 + .../lightstep-tracer-go/collector_client.go | 59 + .../collector_client_custom.go | 41 + .../collector_client_grpc.go | 157 + .../collector_client_http.go | 199 + .../lightstep-tracer-go/event_handlers.go | 97 + .../lightstep/lightstep-tracer-go/events.go | 330 + .../lightstep/lightstep-tracer-go/go.mod | 14 + .../lightstep/lightstep-tracer-go/go.sum | 144 + .../lightstep/rand/locked_rand.go | 138 + .../lightstep/rand/num_gen.go | 7 + .../lightstep/rand/pool.go | 59 + .../lightstep-tracer-go/meta_events.go | 15 + .../lightstep/lightstep-tracer-go/options.go | 352 + .../lightstep-tracer-go/propagation.go | 10 + .../lightstep-tracer-go/propagation_b3.go | 82 + .../lightstep-tracer-go/propagation_binary.go | 112 + .../propagation_lightstep.go | 58 + .../lightstep-tracer-go/propagation_stack.go | 52 + .../lightstep-tracer-go/propagation_text.go | 110 + .../lightstep-tracer-go/proto_converter.go | 191 + .../lightstep-tracer-go/proto_logencoder.go | 155 + .../lightstep/lightstep-tracer-go/raw_span.go | 79 + .../lightstep-tracer-go/report_buffer.go | 79 + .../lightstep/lightstep-tracer-go/span.go | 302 + .../lightstep-tracer-go/tag_version.sh | 10 + .../lightstep/lightstep-tracer-go/tracer.go | 447 + .../lightstep-tracer-go/tracer_0_14.go | 45 + .../lightstep-tracer-go/tracer_helpers.go | 83 + .../lightstep/lightstep-tracer-go/util.go | 32 + .../lightstep/lightstep-tracer-go/version.go | 4 + vendor/github.com/m3db/m3/LICENSE | 201 + vendor/github.com/m3db/m3/NOTICES.txt | 19 + .../m3db/m3/src/cluster/client/client.go | 47 + .../m3db/m3/src/cluster/client/client_mock.go | 132 + .../m3db/m3/src/cluster/client/etcd/client.go | 380 + .../m3db/m3/src/cluster/client/etcd/config.go | 135 + .../m3/src/cluster/client/etcd/options.go | 375 + .../m3db/m3/src/cluster/client/etcd/types.go | 134 + .../src/cluster/etcd/watchmanager/manager.go | 173 + .../src/cluster/etcd/watchmanager/options.go | 170 + .../m3/src/cluster/etcd/watchmanager/types.go | 89 + .../generated/proto/commonpb/common.pb.go | 831 + .../generated/proto/commonpb/common.proto | 43 + .../generated/proto/metadatapb/metadata.pb.go | 388 + .../generated/proto/metadatapb/metadata.proto | 28 + .../proto/placementpb/placement.pb.go | 1808 + .../proto/placementpb/placement.proto | 81 + .../m3db/m3/src/cluster/kv/config.go | 36 + .../m3db/m3/src/cluster/kv/etcd/options.go | 242 + .../m3db/m3/src/cluster/kv/etcd/store.go | 712 + .../m3db/m3/src/cluster/kv/kv_mock.go | 1031 + .../m3db/m3/src/cluster/kv/mem/store.go | 295 + .../github.com/m3db/m3/src/cluster/kv/op.go | 91 + .../m3db/m3/src/cluster/kv/store.go | 151 + .../m3db/m3/src/cluster/kv/types.go | 233 + .../m3db/m3/src/cluster/kv/util/atomic.go | 107 + .../m3db/m3/src/cluster/kv/util/lock.go | 232 + .../m3/src/cluster/kv/util/runtime/options.go | 131 + .../m3/src/cluster/kv/util/runtime/value.go | 119 + .../m3db/m3/src/cluster/kv/util/types.go | 87 + .../m3db/m3/src/cluster/kv/util/util.go | 331 + .../m3/src/cluster/placement/algo/algo.go | 41 + .../m3/src/cluster/placement/algo/mirrored.go | 569 + .../src/cluster/placement/algo/non_sharded.go | 159 + .../m3/src/cluster/placement/algo/sharded.go | 220 + .../cluster/placement/algo/sharded_helper.go | 864 + .../m3db/m3/src/cluster/placement/config.go | 94 + .../m3db/m3/src/cluster/placement/options.go | 261 + .../m3/src/cluster/placement/placement.go | 659 + .../src/cluster/placement/placement_mock.go | 3010 ++ .../src/cluster/placement/selector/common.go | 87 + .../cluster/placement/selector/mirrored.go | 547 + .../selector/mirrored_custom_groups.go | 232 + .../placement/selector/non_mirrored.go | 311 + .../cluster/placement/selector/selector.go | 34 + .../src/cluster/placement/service/operator.go | 100 + .../src/cluster/placement/service/service.go | 344 + .../src/cluster/placement/staged_placement.go | 220 + .../placement/staged_placement_options.go | 68 + .../placement/staged_placement_watcher.go | 156 + .../staged_placement_watcher_options.go | 112 + .../src/cluster/placement/storage/helper.go | 278 + .../src/cluster/placement/storage/storage.go | 187 + .../m3/src/cluster/placement/storage/watch.go | 63 + .../m3db/m3/src/cluster/placement/types.go | 637 + .../m3db/m3/src/cluster/services/config.go | 100 + .../services/heartbeat/etcd/options.go | 181 + .../cluster/services/heartbeat/etcd/store.go | 424 + .../cluster/services/leader/campaign/state.go | 63 + .../services/leader/campaign/state_string.go | 36 + .../m3/src/cluster/services/leader/client.go | 273 + .../m3/src/cluster/services/leader/doc.go | 61 + .../services/leader/election/client.go | 254 + .../services/leader/election/options.go | 41 + .../m3/src/cluster/services/leader/options.go | 87 + .../m3/src/cluster/services/leader/service.go | 207 + .../m3db/m3/src/cluster/services/options.go | 258 + .../m3db/m3/src/cluster/services/services.go | 894 + .../m3/src/cluster/services/services_mock.go | 1772 + .../m3db/m3/src/cluster/services/types.go | 397 + .../m3db/m3/src/cluster/services/util.go | 101 + .../m3db/m3/src/cluster/services/watch.go | 81 + .../m3db/m3/src/cluster/shard/shard.go | 338 + .../m3db/m3/src/cluster/shard/state_string.go | 36 + .../m3db/m3/src/cluster/shard/types.go | 135 + .../m3db/m3/src/dbnode/client/README.md | 52 + .../m3/src/dbnode/client/aggregate_attempt.go | 99 + .../m3db/m3/src/dbnode/client/aggregate_op.go | 100 + .../dbnode/client/aggregate_tags_iterator.go | 107 + .../m3/src/dbnode/client/calc_transport.go | 188 + .../m3db/m3/src/dbnode/client/client.go | 117 + .../m3db/m3/src/dbnode/client/client_mock.go | 5144 +++ .../m3db/m3/src/dbnode/client/config.go | 458 + .../m3/src/dbnode/client/connection_pool.go | 322 + .../m3/src/dbnode/client/consistency_level.go | 83 + .../m3db/m3/src/dbnode/client/errors.go | 223 + .../m3/src/dbnode/client/fetch_attempt.go | 101 + .../m3db/m3/src/dbnode/client/fetch_batch.go | 154 + .../client/fetch_batch_element_array_pool.go | 67 + .../m3/src/dbnode/client/fetch_batch_pool.go | 65 + .../m3db/m3/src/dbnode/client/fetch_state.go | 274 + .../m3/src/dbnode/client/fetch_state_pool.go | 53 + .../src/dbnode/client/fetch_tagged_attempt.go | 114 + .../m3/src/dbnode/client/fetch_tagged_op.go | 100 + .../fetch_tagged_results_accumulator.go | 613 + .../fetch_tagged_results_index_iterator.go | 120 + .../m3db/m3/src/dbnode/client/host_queue.go | 1167 + .../m3/src/dbnode/client/iterator_matcher.go | 125 + .../m3db/m3/src/dbnode/client/op.go | 29 + .../m3/src/dbnode/client/op_array_pool.go | 103 + .../m3db/m3/src/dbnode/client/options.go | 1075 + .../m3db/m3/src/dbnode/client/peer.go | 43 + .../m3db/m3/src/dbnode/client/rc.go | 42 + .../client/reader_slice_of_slices_iterator.go | 214 + .../reader_slice_of_slices_iterator_pool.go | 48 + .../dbnode/client/received_blocks_map_gen.go | 271 + .../dbnode/client/received_blocks_new_map.go | 58 + .../src/dbnode/client/replicated_session.go | 349 + .../m3db/m3/src/dbnode/client/session.go | 4135 +++ .../m3/src/dbnode/client/session_pools.go | 93 + .../m3db/m3/src/dbnode/client/truncate.go | 39 + .../m3db/m3/src/dbnode/client/types.go | 756 + .../m3/src/dbnode/client/write_attempt.go | 111 + .../client/write_batch_element_array_pool.go | 108 + .../m3/src/dbnode/client/write_batch_pool.go | 101 + .../write_batch_tagged_element_array_pool.go | 108 + .../dbnode/client/write_batch_tagged_pool.go | 101 + .../m3db/m3/src/dbnode/client/write_op.go | 103 + .../m3db/m3/src/dbnode/client/write_state.go | 208 + .../m3/src/dbnode/client/write_tagged_op.go | 103 + .../m3db/m3/src/dbnode/clock/options.go | 46 + .../m3db/m3/src/dbnode/clock/types.go | 37 + .../m3db/m3/src/dbnode/digest/README.md | 9 + .../m3db/m3/src/dbnode/digest/buffer.go | 75 + .../m3db/m3/src/dbnode/digest/digest.go | 38 + .../m3db/m3/src/dbnode/digest/digest_mock.go | 111 + .../m3db/m3/src/dbnode/digest/fd_digest.go | 77 + .../m3db/m3/src/dbnode/digest/reader.go | 233 + .../m3db/m3/src/dbnode/digest/test_util.go | 62 + .../m3db/m3/src/dbnode/digest/writer.go | 111 + .../m3/src/dbnode/encoding/encoder_pool.go | 48 + .../m3db/m3/src/dbnode/encoding/encoding.go | 58 + .../m3/src/dbnode/encoding/encoding_mock.go | 2304 ++ .../m3db/m3/src/dbnode/encoding/istream.go | 189 + .../m3/src/dbnode/encoding/iterator_pool.go | 71 + .../m3db/m3/src/dbnode/encoding/iterators.go | 244 + .../m3/src/dbnode/encoding/iterators_types.go | 124 + .../m3/src/dbnode/encoding/m3tsz/decoder.go | 45 + .../m3/src/dbnode/encoding/m3tsz/encoder.go | 445 + .../encoding/m3tsz/float_encoder_iterator.go | 166 + .../encoding/m3tsz/int_sig_bits_tracker.go | 91 + .../m3/src/dbnode/encoding/m3tsz/iterator.go | 243 + .../m3/src/dbnode/encoding/m3tsz/m3tsz.go | 139 + .../encoding/m3tsz/timestamp_encoder.go | 219 + .../encoding/m3tsz/timestamp_iterator.go | 325 + .../dbnode/encoding/multi_reader_iterator.go | 252 + .../multi_reader_iterator_array_pool.go | 115 + .../encoding/mutable_series_iterators_pool.go | 104 + .../m3db/m3/src/dbnode/encoding/null.go | 80 + .../m3db/m3/src/dbnode/encoding/options.go | 180 + .../m3db/m3/src/dbnode/encoding/ostream.go | 264 + .../dbnode/encoding/proto/buffer_decode.go | 291 + .../dbnode/encoding/proto/buffer_encode.go | 87 + .../m3/src/dbnode/encoding/proto/common.go | 337 + .../dbnode/encoding/proto/custom_marshal.go | 157 + .../dbnode/encoding/proto/custom_unmarshal.go | 438 + .../m3/src/dbnode/encoding/proto/encoder.go | 935 + .../m3/src/dbnode/encoding/proto/equal.go | 175 + .../encoding/proto/int_encoder_iterator.go | 260 + .../m3/src/dbnode/encoding/proto/iterator.go | 915 + .../src/dbnode/encoding/proto/parse_schema.go | 55 + .../m3db/m3/src/dbnode/encoding/scheme.go | 273 + .../m3/src/dbnode/encoding/series_iterator.go | 221 + .../encoding/series_iterator_accumulator.go | 260 + .../dbnode/encoding/series_iterator_pool.go | 48 + .../src/dbnode/encoding/series_iterators.go | 83 + .../m3db/m3/src/dbnode/encoding/types.go | 509 + .../m3db/m3/src/dbnode/environment/config.go | 427 + .../generated/proto/namespace/namespace.pb.go | 2583 ++ .../generated/proto/namespace/namespace.proto | 82 + .../generated/proto/namespace/schema.pb.go | 753 + .../generated/proto/namespace/schema.proto | 27 + .../thrift/rpc/GoUnusedProtection__.go | 26 + .../dbnode/generated/thrift/rpc/rpc-consts.go | 38 + .../m3/src/dbnode/generated/thrift/rpc/rpc.go | 28562 ++++++++++++++++ .../dbnode/generated/thrift/rpc/rpc_mock.go | 654 + .../dbnode/generated/thrift/rpc/tchan-rpc.go | 2058 ++ .../m3db/m3/src/dbnode/kvconfig/keys.go | 52 + .../m3/src/dbnode/namespace/aggregation.go | 90 + .../m3db/m3/src/dbnode/namespace/config.go | 105 + .../m3db/m3/src/dbnode/namespace/context.go | 46 + .../m3db/m3/src/dbnode/namespace/convert.go | 384 + .../m3db/m3/src/dbnode/namespace/dynamic.go | 264 + .../src/dbnode/namespace/dynamic_options.go | 110 + .../m3/src/dbnode/namespace/index_options.go | 71 + .../m3db/m3/src/dbnode/namespace/map.go | 120 + .../m3db/m3/src/dbnode/namespace/metadata.go | 85 + .../src/dbnode/namespace/metadata_map_gen.go | 299 + .../src/dbnode/namespace/metadata_matcher.go | 53 + .../dbnode/namespace/metadata_new_map_gen.go | 95 + .../m3/src/dbnode/namespace/namespace_mock.go | 1509 + .../namespace/namespace_runtime_options.go | 254 + .../src/dbnode/namespace/namespace_watch.go | 191 + .../m3db/m3/src/dbnode/namespace/options.go | 296 + .../m3db/m3/src/dbnode/namespace/schema.go | 411 + .../src/dbnode/namespace/schema_registry.go | 188 + .../namespace/schema_registry_updater.go | 92 + .../m3db/m3/src/dbnode/namespace/static.go | 69 + .../m3db/m3/src/dbnode/namespace/types.go | 359 + .../m3db/m3/src/dbnode/namespace/utils.go | 45 + .../m3db/m3/src/dbnode/namespace/watch.go | 52 + .../server/tchannelthrift/convert/convert.go | 628 + .../server/tchannelthrift/errors/errors.go | 70 + .../tchannelthrift/node/channel/channel.go | 26 + .../m3/src/dbnode/persist/persist_mock.go | 343 + .../m3db/m3/src/dbnode/persist/types.go | 346 + .../m3db/m3/src/dbnode/ratelimit/options.go | 78 + .../m3db/m3/src/dbnode/ratelimit/types.go | 42 + .../m3db/m3/src/dbnode/retention/config.go | 53 + .../m3db/m3/src/dbnode/retention/options.go | 186 + .../m3/src/dbnode/retention/retention_mock.go | 279 + .../m3db/m3/src/dbnode/retention/times.go | 44 + .../m3db/m3/src/dbnode/retention/types.go | 80 + .../m3/src/dbnode/runtime/runtime_mock.go | 549 + .../m3/src/dbnode/runtime/runtime_options.go | 252 + .../dbnode/runtime/runtime_options_manager.go | 114 + .../m3db/m3/src/dbnode/runtime/types.go | 209 + .../m3db/m3/src/dbnode/sharding/shardset.go | 165 + .../m3db/m3/src/dbnode/sharding/types.go | 57 + .../m3db/m3/src/dbnode/storage/block/block.go | 561 + .../m3/src/dbnode/storage/block/block_mock.go | 1865 + .../m3/src/dbnode/storage/block/block_pool.go | 48 + .../m3db/m3/src/dbnode/storage/block/lease.go | 212 + .../m3/src/dbnode/storage/block/lease_noop.go | 58 + .../storage/block/merged_block_reader.go | 246 + .../m3/src/dbnode/storage/block/metadata.go | 58 + .../m3/src/dbnode/storage/block/options.go | 217 + .../m3/src/dbnode/storage/block/result.go | 252 + .../src/dbnode/storage/block/result_pool.go | 81 + .../dbnode/storage/block/retriever_manager.go | 154 + .../dbnode/storage/block/retriever_map_gen.go | 299 + .../storage/block/retriever_new_map_gen.go | 95 + .../m3db/m3/src/dbnode/storage/block/types.go | 539 + .../m3/src/dbnode/storage/block/wired_list.go | 377 + .../storage/bootstrap/result/map_gen.go | 299 + .../storage/bootstrap/result/new_map_gen.go | 95 + .../storage/bootstrap/result/options.go | 113 + .../storage/bootstrap/result/result_data.go | 258 + .../storage/bootstrap/result/result_index.go | 333 + .../storage/bootstrap/result/shard_ranges.go | 314 + .../dbnode/storage/bootstrap/result/types.go | 251 + .../m3/src/dbnode/storage/index/README.md | 9 + .../dbnode/storage/index/aggregate_results.go | 323 + .../aggregate_results_entry_arraypool_gen.go | 127 + .../index/aggregate_results_map_gen.go | 299 + .../index/aggregate_results_new_map.go | 49 + .../storage/index/aggregate_results_pool.go | 47 + .../dbnode/storage/index/aggregate_values.go | 100 + .../storage/index/aggregate_values_map_gen.go | 275 + .../storage/index/aggregate_values_new_map.go | 51 + .../storage/index/aggregate_values_pool.go | 47 + .../storage/index/aggregated_term_filter.go | 77 + .../m3/src/dbnode/storage/index/allocator.go | 37 + .../m3db/m3/src/dbnode/storage/index/block.go | 1187 + .../storage/index/compaction/compactor.go | 409 + .../dbnode/storage/index/compaction/plan.go | 240 + .../dbnode/storage/index/compaction/types.go | 93 + .../dbnode/storage/index/convert/convert.go | 406 + .../storage/index/fields_terms_iterator.go | 267 + .../storage/index/filter_fields_iterator.go | 86 + .../m3/src/dbnode/storage/index/index_mock.go | 1696 + .../dbnode/storage/index/mutable_segments.go | 841 + .../m3/src/dbnode/storage/index/options.go | 430 + .../storage/index/postings_list_cache.go | 301 + .../storage/index/postings_list_cache_lru.go | 216 + .../src/dbnode/storage/index/query_matcher.go | 60 + .../storage/index/read_through_segment.go | 293 + .../m3/src/dbnode/storage/index/results.go | 195 + .../dbnode/storage/index/results_map_gen.go | 275 + .../dbnode/storage/index/results_new_map.go | 49 + .../src/dbnode/storage/index/results_pool.go | 46 + .../m3/src/dbnode/storage/index/segments.go | 51 + .../dbnode/storage/index/segments/types.go | 41 + .../m3db/m3/src/dbnode/storage/index/types.go | 970 + .../storage/limits/noop_query_limits.go | 59 + .../src/dbnode/storage/limits/query_limits.go | 218 + .../m3/src/dbnode/storage/limits/types.go | 54 + .../m3/src/dbnode/storage/series/README.md | 23 + .../m3/src/dbnode/storage/series/buffer.go | 1637 + .../src/dbnode/storage/series/buffer_mock.go | 276 + .../m3/src/dbnode/storage/series/options.go | 232 + .../m3/src/dbnode/storage/series/policy.go | 118 + .../m3/src/dbnode/storage/series/reader.go | 346 + .../m3/src/dbnode/storage/series/series.go | 731 + .../src/dbnode/storage/series/series_mock.go | 442 + .../src/dbnode/storage/series/series_pool.go | 44 + .../dbnode/storage/series/truncate_type.go | 82 + .../m3/src/dbnode/storage/series/types.go | 478 + .../m3db/m3/src/dbnode/storage/series/util.go | 94 + .../src/dbnode/topology/consistency_level.go | 400 + .../m3db/m3/src/dbnode/topology/dynamic.go | 291 + .../m3db/m3/src/dbnode/topology/host.go | 98 + .../m3db/m3/src/dbnode/topology/map.go | 165 + .../m3db/m3/src/dbnode/topology/options.go | 204 + .../m3db/m3/src/dbnode/topology/static.go | 78 + .../m3/src/dbnode/topology/topology_mock.go | 961 + .../m3db/m3/src/dbnode/topology/types.go | 247 + .../m3/src/dbnode/tracepoint/tracepoint.go | 126 + .../m3db/m3/src/dbnode/ts/segment.go | 188 + .../github.com/m3db/m3/src/dbnode/ts/types.go | 66 + .../m3db/m3/src/dbnode/x/xio/block_reader.go | 97 + .../m3db/m3/src/dbnode/x/xio/io_mock.go | 187 + .../m3db/m3/src/dbnode/x/xio/null.go | 38 + ...e_of_slices_from_block_readers_iterator.go | 114 + .../m3/src/dbnode/x/xio/segment_reader.go | 104 + .../src/dbnode/x/xio/segment_reader_pool.go | 51 + .../m3db/m3/src/dbnode/x/xio/types.go | 102 + .../m3db/m3/src/dbnode/x/xpool/pool.go | 63 + .../m3db/m3/src/dbnode/x/xpool/types.go | 37 + .../m3/src/m3ninx/doc/doc_arraypool_gen.go | 127 + .../m3db/m3/src/m3ninx/doc/doc_mock.go | 110 + .../m3db/m3/src/m3ninx/doc/document.go | 214 + .../m3/src/m3ninx/doc/document_matcher.go | 51 + .../m3db/m3/src/m3ninx/doc/types.go | 41 + .../generated/proto/fswriter/fswriter.pb.go | 554 + .../generated/proto/fswriter/fswriter.proto | 50 + .../generated/proto/querypb/query.pb.go | 1963 ++ .../generated/proto/querypb/query.proto | 65 + .../m3db/m3/src/m3ninx/idx/codec.go | 39 + .../m3db/m3/src/m3ninx/idx/query.go | 136 + .../m3db/m3/src/m3ninx/idx/query_matcher.go | 55 + .../m3db/m3/src/m3ninx/idx/types.go | 44 + .../m3db/m3/src/m3ninx/index/batch.go | 169 + .../m3db/m3/src/m3ninx/index/batch_matcher.go | 50 + .../m3db/m3/src/m3ninx/index/index_mock.go | 214 + .../m3db/m3/src/m3ninx/index/iterator.go | 89 + .../m3db/m3/src/m3ninx/index/regexp.go | 390 + .../m3ninx/index/segment/builder/builder.go | 565 + .../index/segment/builder/bytes_slice_iter.go | 144 + .../index/segment/builder/fields_map_gen.go | 295 + .../index/segment/builder/fields_map_new.go | 91 + .../index/segment/builder/ids_map_gen.go | 295 + .../index/segment/builder/ids_map_new.go | 91 + .../segment/builder/multi_segments_builder.go | 200 + .../builder/multi_segments_field_iter.go | 53 + ...multi_segments_field_postings_list_iter.go | 80 + .../builder/multi_segments_multi_key_iter.go | 164 + ...i_segments_multi_key_postings_list_iter.go | 247 + .../builder/multi_segments_terms_iter.go | 228 + .../m3ninx/index/segment/builder/options.go | 121 + .../index/segment/builder/postings_map_gen.go | 299 + .../index/segment/builder/postings_map_new.go | 91 + .../segment/builder/sharded_fields_map.go | 65 + .../src/m3ninx/index/segment/builder/terms.go | 138 + .../index/segment/builder/terms_iter.go | 77 + .../m3db/m3/src/m3ninx/index/segment/empty.go | 45 + .../m3/src/m3ninx/index/segment/fst/README.md | 94 + .../m3ninx/index/segment/fst/docs_writer.go | 95 + .../index/segment/fst/encoding/docs/README.md | 128 + .../index/segment/fst/encoding/docs/data.go | 130 + .../index/segment/fst/encoding/docs/index.go | 169 + .../index/segment/fst/encoding/docs/slice.go | 73 + .../index/segment/fst/encoding/docs/types.go | 37 + .../index/segment/fst/encoding/encoding.go | 150 + .../src/m3ninx/index/segment/fst/fst_mock.go | 445 + .../index/segment/fst/fst_terms_iterator.go | 134 + .../fst/fst_terms_postings_iterator.go | 117 + .../m3ninx/index/segment/fst/fst_writer.go | 109 + .../src/m3ninx/index/segment/fst/options.go | 134 + .../m3ninx/index/segment/fst/regexp/regexp.go | 89 + .../src/m3ninx/index/segment/fst/segment.go | 1013 + .../m3/src/m3ninx/index/segment/fst/types.go | 115 + .../m3/src/m3ninx/index/segment/fst/utils.go | 80 + .../m3/src/m3ninx/index/segment/fst/writer.go | 517 + .../index/segment/mem/bytes_slice_iterator.go | 86 + .../segment/mem/concurrent_postings_map.go | 124 + .../index/segment/mem/fields_map_gen.go | 295 + .../index/segment/mem/fields_map_new.go | 91 + .../m3ninx/index/segment/mem/ids_map_gen.go | 271 + .../m3ninx/index/segment/mem/ids_map_new.go | 48 + .../src/m3ninx/index/segment/mem/iterator.go | 62 + .../src/m3ninx/index/segment/mem/mem_mock.go | 149 + .../m3/src/m3ninx/index/segment/mem/merge.go | 81 + .../src/m3ninx/index/segment/mem/options.go | 151 + .../index/segment/mem/postings_map_gen.go | 275 + .../index/segment/mem/postings_map_new.go | 52 + .../m3/src/m3ninx/index/segment/mem/reader.go | 175 + .../src/m3ninx/index/segment/mem/segment.go | 501 + .../m3ninx/index/segment/mem/terms_dict.go | 191 + .../index/segment/mem/terms_iterator.go | 97 + .../m3/src/m3ninx/index/segment/mem/types.go | 78 + .../segment/mem/unique_fields_iterator.go | 91 + .../src/m3ninx/index/segment/segment_mock.go | 1788 + .../m3db/m3/src/m3ninx/index/segment/types.go | 224 + .../m3db/m3/src/m3ninx/index/types.go | 152 + .../m3/src/m3ninx/persist/persist_mock.go | 540 + .../m3db/m3/src/m3ninx/persist/reader.go | 120 + .../m3db/m3/src/m3ninx/persist/types.go | 185 + .../m3db/m3/src/m3ninx/persist/writer.go | 210 + .../m3db/m3/src/m3ninx/postings/atomic.go | 50 + .../m3/src/m3ninx/postings/pilosa/codec.go | 96 + .../m3/src/m3ninx/postings/pilosa/iterator.go | 70 + .../m3db/m3/src/m3ninx/postings/pool.go | 67 + .../m3/src/m3ninx/postings/postings_mock.go | 527 + .../m3/src/m3ninx/postings/range_iterator.go | 69 + .../m3/src/m3ninx/postings/roaring/roaring.go | 262 + .../m3db/m3/src/m3ninx/postings/types.go | 131 + .../m3/src/m3ninx/search/executor/executor.go | 84 + .../m3/src/m3ninx/search/executor/iterator.go | 131 + .../m3db/m3/src/m3ninx/search/query/all.go | 66 + .../m3db/m3/src/m3ninx/search/query/codec.go | 97 + .../m3/src/m3ninx/search/query/conjunction.go | 160 + .../m3/src/m3ninx/search/query/disjunction.go | 116 + .../m3db/m3/src/m3ninx/search/query/field.go | 82 + .../m3/src/m3ninx/search/query/negation.go | 79 + .../m3db/m3/src/m3ninx/search/query/regexp.go | 97 + .../m3db/m3/src/m3ninx/search/query/term.go | 80 + .../m3db/m3/src/m3ninx/search/query/util.go | 93 + .../m3db/m3/src/m3ninx/search/search_mock.go | 206 + .../m3db/m3/src/m3ninx/search/searcher/all.go | 38 + .../src/m3ninx/search/searcher/conjunction.go | 88 + .../src/m3ninx/search/searcher/disjunction.go | 61 + .../m3/src/m3ninx/search/searcher/empty.go | 43 + .../m3/src/m3ninx/search/searcher/errors.go | 29 + .../m3/src/m3ninx/search/searcher/field.go | 42 + .../m3/src/m3ninx/search/searcher/negation.go | 54 + .../m3/src/m3ninx/search/searcher/regexp.go | 45 + .../m3/src/m3ninx/search/searcher/term.go | 43 + .../m3db/m3/src/m3ninx/search/types.go | 63 + .../m3db/m3/src/m3ninx/util/docs.go | 87 + .../m3db/m3/src/m3ninx/util/uuid.go | 56 + .../src/m3ninx/x/bytes/slice_arraypool_gen.go | 127 + .../m3db/m3/src/m3ninx/x/safe_closer.go | 70 + .../m3db/m3/src/metrics/aggregation/id.go | 174 + .../m3/src/metrics/aggregation/id_compress.go | 145 + .../m3db/m3/src/metrics/aggregation/type.go | 419 + .../m3/src/metrics/aggregation/type_config.go | 156 + .../m3/src/metrics/aggregation/type_string.go | 45 + .../src/metrics/aggregation/types_options.go | 409 + .../m3/src/metrics/aggregation/types_pool.go | 61 + .../proto/aggregationpb/aggregation.pb.go | 412 + .../proto/aggregationpb/aggregation.proto | 57 + .../generated/proto/metricpb/composite.pb.go | 2238 ++ .../generated/proto/metricpb/composite.proto | 97 + .../generated/proto/metricpb/metadata.pb.go | 1445 + .../generated/proto/metricpb/metadata.proto | 64 + .../generated/proto/metricpb/metric.pb.go | 1431 + .../generated/proto/metricpb/metric.proto | 66 + .../generated/proto/pipelinepb/pipeline.pb.go | 1784 + .../generated/proto/pipelinepb/pipeline.proto | 86 + .../generated/proto/policypb/policy.pb.go | 937 + .../generated/proto/policypb/policy.proto | 52 + .../transformationpb/transformation.pb.go | 104 + .../transformationpb/transformation.proto | 33 + .../m3db/m3/src/metrics/metric/id/id.go | 59 + .../m3db/m3/src/metrics/metric/id/id_mock.go | 83 + .../m3db/m3/src/metrics/metric/id/tag.go | 102 + .../m3db/m3/src/metrics/metric/types.go | 146 + .../m3db/m3/src/metrics/policy/drop_policy.go | 78 + .../m3db/m3/src/metrics/policy/policy.go | 218 + .../m3db/m3/src/metrics/policy/pool.go | 59 + .../m3db/m3/src/metrics/policy/resolution.go | 188 + .../m3db/m3/src/metrics/policy/retention.go | 150 + .../m3/src/metrics/policy/staged_policy.go | 153 + .../m3/src/metrics/policy/storage_policy.go | 273 + .../m3db/m3/src/query/block/accounted.go | 49 + .../m3db/m3/src/query/block/block_mock.go | 522 + .../m3db/m3/src/query/block/column.go | 290 + .../m3db/m3/src/query/block/container.go | 388 + .../m3db/m3/src/query/block/empty.go | 82 + .../m3db/m3/src/query/block/info.go | 96 + .../m3db/m3/src/query/block/lazy.go | 151 + .../m3db/m3/src/query/block/meta.go | 253 + .../m3db/m3/src/query/block/options.go | 89 + .../m3db/m3/src/query/block/scalar.go | 149 + .../m3db/m3/src/query/block/series.go | 94 + .../m3db/m3/src/query/block/types.go | 193 + .../github.com/m3db/m3/src/query/cost/cost.go | 208 + .../m3db/m3/src/query/cost/cost_mock.go | 236 + .../m3/src/query/graphite/errors/errors.go | 99 + .../m3/src/query/graphite/graphite/glob.go | 182 + .../query/graphite/graphite/graphite_types.go | 263 + .../src/query/graphite/graphite/identify.go | 86 + .../m3/src/query/graphite/graphite/tags.go | 109 + .../src/query/graphite/graphite/timespec.go | 341 + .../m3db/m3/src/query/models/block_type.go | 39 + .../m3db/m3/src/query/models/bounds.go | 141 + .../m3db/m3/src/query/models/config.go | 90 + .../m3db/m3/src/query/models/matcher.go | 152 + .../m3db/m3/src/query/models/options.go | 140 + .../m3db/m3/src/query/models/params.go | 97 + .../m3db/m3/src/query/models/query_context.go | 97 + .../m3/src/query/models/strconv/checker.go | 108 + .../m3db/m3/src/query/models/strconv/quote.go | 304 + .../m3db/m3/src/query/models/tags.go | 434 + .../m3/src/query/models/tags_id_schemes.go | 249 + .../m3db/m3/src/query/models/types.go | 189 + .../m3db/m3/src/query/models/unsafe.go | 39 + .../m3/consolidators/complete_tags_result.go | 140 + .../m3/consolidators/completed_tags.go | 166 + .../query/storage/m3/consolidators/convert.go | 47 + .../m3/consolidators/fetch_result_map_gen.go | 275 + .../consolidators/fetch_result_map_wrapper.go | 90 + .../query/storage/m3/consolidators/filter.go | 149 + .../storage/m3/consolidators/id_dedupe_map.go | 107 + .../storage/m3/consolidators/match_type.go | 71 + .../m3/consolidators/multi_fetch_result.go | 255 + .../m3/consolidators/series_fetch_result.go | 141 + .../m3/consolidators/tag_dedupe_map.go | 133 + .../query/storage/m3/consolidators/types.go | 172 + .../storage/m3/storagemetadata/config.go | 82 + .../query/storage/m3/storagemetadata/types.go | 57 + .../m3db/m3/src/query/ts/metadata.go | 95 + .../github.com/m3db/m3/src/query/ts/series.go | 55 + .../m3db/m3/src/query/ts/ts_mock.go | 141 + .../github.com/m3db/m3/src/query/ts/values.go | 314 + .../m3db/m3/src/query/util/memset.go | 59 + .../m3db/m3/src/query/util/strings.go | 31 + .../m3db/m3/src/query/util/timing.go | 96 + .../m3/src/query/util/writer/int_writer.go | 88 + .../github.com/m3db/m3/src/x/checked/bytes.go | 150 + .../m3db/m3/src/x/checked/checked_mock.go | 298 + .../github.com/m3db/m3/src/x/checked/debug.go | 317 + .../github.com/m3db/m3/src/x/checked/ref.go | 229 + .../github.com/m3db/m3/src/x/checked/types.go | 116 + .../github.com/m3db/m3/src/x/clock/config.go | 46 + .../github.com/m3db/m3/src/x/clock/options.go | 68 + .../github.com/m3db/m3/src/x/clock/types.go | 70 + .../github.com/m3db/m3/src/x/close/close.go | 72 + .../m3db/m3/src/x/context/cancel.go | 47 + .../m3db/m3/src/x/context/context.go | 383 + .../m3/src/x/context/finalizeable_list_gen.go | 353 + .../m3db/m3/src/x/context/options.go | 56 + .../github.com/m3db/m3/src/x/context/pool.go | 69 + .../github.com/m3db/m3/src/x/context/types.go | 123 + .../github.com/m3db/m3/src/x/cost/enforcer.go | 176 + .../m3db/m3/src/x/cost/limit_manager.go | 177 + .../github.com/m3db/m3/src/x/cost/options.go | 167 + .../github.com/m3db/m3/src/x/cost/tracker.go | 40 + vendor/github.com/m3db/m3/src/x/cost/types.go | 85 + .../github.com/m3db/m3/src/x/errors/errors.go | 309 + .../m3db/m3/src/x/ident/bytes_id.go | 113 + .../m3db/m3/src/x/ident/id_matcher.go | 53 + .../m3db/m3/src/x/ident/ident_mock.go | 279 + .../m3db/m3/src/x/ident/identifier.go | 85 + .../m3db/m3/src/x/ident/identifier_pool.go | 226 + .../m3db/m3/src/x/ident/iterator.go | 161 + vendor/github.com/m3db/m3/src/x/ident/tag.go | 41 + .../m3db/m3/src/x/ident/tag_arraypool_gen.go | 127 + .../m3db/m3/src/x/ident/tag_iterator.go | 221 + .../m3/src/x/ident/tag_iterator_matcher.go | 72 + .../m3db/m3/src/x/ident/tag_matcher.go | 53 + .../github.com/m3db/m3/src/x/ident/types.go | 312 + .../m3db/m3/src/x/instrument/build.go | 174 + .../m3db/m3/src/x/instrument/config.go | 268 + .../m3/src/x/instrument/config_prometheus.go | 330 + .../m3db/m3/src/x/instrument/extended.go | 260 + .../m3db/m3/src/x/instrument/invariant.go | 105 + .../m3db/m3/src/x/instrument/logging.go | 46 + .../m3db/m3/src/x/instrument/methods.go | 351 + .../m3db/m3/src/x/instrument/options.go | 108 + .../m3db/m3/src/x/instrument/process.go | 68 + .../x/instrument/prom_process_collector.go | 214 + .../m3db/m3/src/x/instrument/reporter.go | 112 + .../m3db/m3/src/x/instrument/sanitize.go | 102 + .../src/x/instrument/string_list_emitter.go | 146 + .../m3db/m3/src/x/instrument/types.go | 74 + vendor/github.com/m3db/m3/src/x/mmap/mmap.go | 167 + .../m3db/m3/src/x/mmap/mmap_linux.go | 146 + .../m3db/m3/src/x/mmap/mmap_other.go | 128 + .../m3db/m3/src/x/opentracing/context.go | 81 + .../m3db/m3/src/x/opentracing/tracing.go | 165 + .../m3db/m3/src/x/pool/bucketized.go | 124 + vendor/github.com/m3db/m3/src/x/pool/bytes.go | 62 + .../m3db/m3/src/x/pool/checked_bytes.go | 107 + .../github.com/m3db/m3/src/x/pool/config.go | 102 + .../github.com/m3db/m3/src/x/pool/floats.go | 45 + .../github.com/m3db/m3/src/x/pool/object.go | 169 + .../github.com/m3db/m3/src/x/pool/options.go | 98 + .../m3db/m3/src/x/pool/pool_mock.go | 157 + vendor/github.com/m3db/m3/src/x/pool/types.go | 170 + .../m3/src/x/process/count_dirent_linux.go | 116 + .../m3db/m3/src/x/process/process_linux.go | 123 + .../m3db/m3/src/x/process/process_notlinux.go | 48 + .../m3db/m3/src/x/resource/lifetime.go | 72 + .../m3db/m3/src/x/resource/types.go | 52 + .../github.com/m3db/m3/src/x/retry/config.go | 79 + .../github.com/m3db/m3/src/x/retry/options.go | 143 + .../github.com/m3db/m3/src/x/retry/retry.go | 218 + .../github.com/m3db/m3/src/x/retry/types.go | 117 + .../m3db/m3/src/x/sampler/sampler.go | 99 + .../m3db/m3/src/x/serialize/decoder.go | 248 + .../m3/src/x/serialize/decoder_options.go | 105 + .../m3db/m3/src/x/serialize/decoder_pool.go | 56 + .../m3db/m3/src/x/serialize/encoder.go | 213 + .../m3/src/x/serialize/encoder_options.go | 60 + .../m3db/m3/src/x/serialize/encoder_pool.go | 53 + .../m3db/m3/src/x/serialize/limits.go | 64 + .../src/x/serialize/metric_tags_iterator.go | 129 + .../m3db/m3/src/x/serialize/serialize_mock.go | 583 + .../m3db/m3/src/x/serialize/types.go | 149 + .../m3db/m3/src/x/sync/cpu_linux_amd64.go | 24 + .../m3db/m3/src/x/sync/cpu_linux_amd64.s | 14 + .../sync/cpu_supported_arch_unsupported_os.go | 28 + .../sync/cpu_unsupported_arch_supported_os.go | 28 + .../cpu_unsupported_arch_unsupported_os.go | 28 + .../m3db/m3/src/x/sync/index_cpu.go | 73 + .../github.com/m3db/m3/src/x/sync/options.go | 110 + .../m3db/m3/src/x/sync/pooled_worker_pool.go | 234 + vendor/github.com/m3db/m3/src/x/sync/types.go | 118 + .../m3db/m3/src/x/sync/worker_pool.go | 90 + .../github.com/m3db/m3/src/x/time/duration.go | 153 + .../github.com/m3db/m3/src/x/time/matcher.go | 54 + vendor/github.com/m3db/m3/src/x/time/range.go | 161 + .../m3db/m3/src/x/time/range_iter.go | 59 + .../github.com/m3db/m3/src/x/time/ranges.go | 191 + vendor/github.com/m3db/m3/src/x/time/time.go | 94 + vendor/github.com/m3db/m3/src/x/time/unit.go | 224 + .../m3db/m3/src/x/time/unix_nano.go | 52 + .../github.com/m3db/m3/src/x/unsafe/bytes.go | 83 + .../github.com/m3db/m3/src/x/unsafe/rand.go | 36 + .../github.com/m3db/m3/src/x/unsafe/string.go | 89 + .../github.com/m3db/m3/src/x/watch/options.go | 147 + .../github.com/m3db/m3/src/x/watch/source.go | 115 + .../github.com/m3db/m3/src/x/watch/value.go | 208 + .../github.com/m3db/m3/src/x/watch/watch.go | 214 + .../m3db/prometheus_client_golang/AUTHORS.md | 18 + .../m3db/prometheus_client_golang/LICENSE | 201 + .../m3db/prometheus_client_golang/NOTICE | 23 + .../prometheus/.gitignore | 1 + .../prometheus/README.md | 1 + .../prometheus/collector.go | 75 + .../prometheus/counter.go | 172 + .../prometheus/desc.go | 205 + .../prometheus/doc.go | 181 + .../prometheus/expvar_collector.go | 119 + .../prometheus/fnv.go | 29 + .../prometheus/gauge.go | 140 + .../prometheus/go_collector.go | 263 + .../prometheus/histogram.go | 444 + .../prometheus/http.go | 490 + .../prometheus/metric.go | 166 + .../prometheus/process_collector.go | 142 + .../prometheus/promhttp/http.go | 201 + .../prometheus/registry.go | 806 + .../prometheus/summary.go | 534 + .../prometheus/untyped.go | 138 + .../prometheus/value.go | 234 + .../prometheus/vec.go | 404 + .../m3db/prometheus_client_model/AUTHORS.md | 13 + .../m3db/prometheus_client_model/LICENSE | 201 + .../m3db/prometheus_client_model/NOTICE | 5 + .../prometheus_client_model/go/metrics.pb.go | 360 + .../m3db/prometheus_common/AUTHORS.md | 11 + .../github.com/m3db/prometheus_common/LICENSE | 201 + .../github.com/m3db/prometheus_common/NOTICE | 5 + .../m3db/prometheus_common/expfmt/decode.go | 412 + .../m3db/prometheus_common/expfmt/encode.go | 88 + .../m3db/prometheus_common/expfmt/expfmt.go | 37 + .../m3db/prometheus_common/expfmt/fuzz.go | 36 + .../prometheus_common/expfmt/text_create.go | 303 + .../prometheus_common/expfmt/text_parse.go | 753 + .../bitbucket.org/ww/goautoneg/README.txt | 67 + .../bitbucket.org/ww/goautoneg/autoneg.go | 162 + .../m3db/prometheus_common/model/alert.go | 136 + .../prometheus_common/model/fingerprinting.go | 105 + .../m3db/prometheus_common/model/fnv.go | 42 + .../m3db/prometheus_common/model/labels.go | 210 + .../m3db/prometheus_common/model/labelset.go | 169 + .../m3db/prometheus_common/model/metric.go | 103 + .../m3db/prometheus_common/model/model.go | 16 + .../m3db/prometheus_common/model/signature.go | 144 + .../m3db/prometheus_common/model/silence.go | 106 + .../m3db/prometheus_common/model/time.go | 249 + .../m3db/prometheus_common/model/value.go | 419 + .../m3db/prometheus_procfs/.travis.yml | 5 + .../m3db/prometheus_procfs/AUTHORS.md | 21 + .../m3db/prometheus_procfs/CONTRIBUTING.md | 18 + .../github.com/m3db/prometheus_procfs/LICENSE | 201 + .../m3db/prometheus_procfs/Makefile | 6 + .../github.com/m3db/prometheus_procfs/NOTICE | 7 + .../m3db/prometheus_procfs/README.md | 10 + .../github.com/m3db/prometheus_procfs/doc.go | 45 + .../github.com/m3db/prometheus_procfs/fs.go | 33 + .../github.com/m3db/prometheus_procfs/ipvs.go | 224 + .../m3db/prometheus_procfs/mdstat.go | 138 + .../m3db/prometheus_procfs/mountstats.go | 552 + .../github.com/m3db/prometheus_procfs/proc.go | 224 + .../m3db/prometheus_procfs/proc_io.go | 55 + .../m3db/prometheus_procfs/proc_limits.go | 137 + .../m3db/prometheus_procfs/proc_stat.go | 175 + .../github.com/m3db/prometheus_procfs/stat.go | 56 + .../github.com/m3db/stackadler32/.gitignore | 14 + vendor/github.com/m3db/stackadler32/LICENSE | 21 + vendor/github.com/m3db/stackadler32/Readme.md | 27 + .../github.com/m3db/stackadler32/adler32.go | 47 + .../m3db/stackmurmur3/v2/.gitignore | 1 + .../github.com/m3db/stackmurmur3/v2/LICENSE | 49 + .../github.com/m3db/stackmurmur3/v2/README.md | 131 + vendor/github.com/m3db/stackmurmur3/v2/go.mod | 5 + vendor/github.com/m3db/stackmurmur3/v2/go.sum | 11 + .../github.com/m3db/stackmurmur3/v2/murmur.go | 72 + .../m3db/stackmurmur3/v2/murmur128.go | 182 + .../m3db/stackmurmur3/v2/murmur128_amd64.s | 246 + .../m3db/stackmurmur3/v2/murmur128_decl.go | 34 + .../m3db/stackmurmur3/v2/murmur128_gen.go | 135 + .../m3db/stackmurmur3/v2/murmur32.go | 100 + .../m3db/stackmurmur3/v2/murmur32_gen.go | 69 + .../m3db/stackmurmur3/v2/murmur64.go | 70 + vendor/github.com/m3dbx/pilosa/LICENSE | 202 + vendor/github.com/m3dbx/pilosa/NOTICE | 87 + .../github.com/m3dbx/pilosa/logger/logger.go | 84 + .../m3dbx/pilosa/roaring/containers.go | 399 + .../m3dbx/pilosa/roaring/roaring.go | 4276 +++ .../m3dbx/pilosa/roaring/roaring_nop_stats.go | 8 + .../m3dbx/pilosa/roaring/roaring_stats.go | 15 + vendor/github.com/m3dbx/pilosa/stats/stats.go | 283 + vendor/github.com/m3dbx/vellum/.travis.yml | 20 + .../github.com/m3dbx/vellum/CONTRIBUTING.md | 16 + vendor/github.com/m3dbx/vellum/LICENSE | 202 + vendor/github.com/m3dbx/vellum/README.md | 183 + vendor/github.com/m3dbx/vellum/automaton.go | 85 + vendor/github.com/m3dbx/vellum/builder.go | 508 + vendor/github.com/m3dbx/vellum/common.go | 547 + vendor/github.com/m3dbx/vellum/decoder_v1.go | 314 + vendor/github.com/m3dbx/vellum/encoder_v1.go | 227 + vendor/github.com/m3dbx/vellum/encoding.go | 87 + vendor/github.com/m3dbx/vellum/fst.go | 294 + .../github.com/m3dbx/vellum/fst_iterator.go | 311 + .../github.com/m3dbx/vellum/merge_iterator.go | 188 + vendor/github.com/m3dbx/vellum/pack.go | 55 + .../github.com/m3dbx/vellum/regexp/compile.go | 343 + vendor/github.com/m3dbx/vellum/regexp/dfa.go | 196 + vendor/github.com/m3dbx/vellum/regexp/inst.go | 62 + .../github.com/m3dbx/vellum/regexp/regexp.go | 119 + .../github.com/m3dbx/vellum/regexp/sparse.go | 54 + vendor/github.com/m3dbx/vellum/registry.go | 128 + vendor/github.com/m3dbx/vellum/transducer.go | 55 + vendor/github.com/m3dbx/vellum/utf8/utf8.go | 268 + vendor/github.com/m3dbx/vellum/vellum.go | 113 + vendor/github.com/m3dbx/vellum/vellum_mmap.go | 60 + .../github.com/m3dbx/vellum/vellum_nommap.go | 27 + vendor/github.com/m3dbx/vellum/writer.go | 92 + .../magiconair/properties/.travis.yml | 3 + .../magiconair/properties/CHANGELOG.md | 23 +- .../properties/{LICENSE => LICENSE.md} | 9 +- .../github.com/magiconair/properties/go.mod | 2 + .../github.com/magiconair/properties/load.go | 5 +- .../magiconair/properties/properties.go | 19 +- .../golang_protobuf_extensions/LICENSE | 201 + .../golang_protobuf_extensions/NOTICE | 1 + .../pbutil/.gitignore | 1 + .../pbutil/Makefile | 7 + .../pbutil/decode.go | 75 + .../golang_protobuf_extensions/pbutil/doc.go | 16 + .../pbutil/encode.go | 46 + .../mitchellh/mapstructure/.travis.yml | 3 +- .../mitchellh/mapstructure/CHANGELOG.md | 40 + .../github.com/mitchellh/mapstructure/go.mod | 2 + .../mitchellh/mapstructure/mapstructure.go | 368 +- .../mojocn/base64Captcha/.gitignore | 11 + .../mojocn/base64Captcha/CODE_OF_CONDUCT.md | 84 + .../mojocn/base64Captcha/LICENSE} | 4 +- .../github.com/mojocn/base64Captcha/README.md | 269 + .../mojocn/base64Captcha/bindata.go | 513 + .../mojocn/base64Captcha/captcha.go | 53 + .../github.com/mojocn/base64Captcha/const.go | 60 + .../mojocn/base64Captcha/driver_audio.go | 36 + .../mojocn/base64Captcha/driver_chinese.go | 131 + .../mojocn/base64Captcha/driver_digit.go | 80 + .../mojocn/base64Captcha/driver_language.go | 119 + .../mojocn/base64Captcha/driver_math.go | 131 + .../mojocn/base64Captcha/driver_string.go | 114 + .../github.com/mojocn/base64Captcha/fonts.go | 257 + vendor/github.com/mojocn/base64Captcha/go.mod | 8 + vendor/github.com/mojocn/base64Captcha/go.sum | 6 + .../mojocn/base64Captcha/interface_driver.go | 9 + .../mojocn/base64Captcha/interface_item.go | 11 + .../mojocn/base64Captcha/interface_store.go | 20 + .../mojocn/base64Captcha/item_audio.go | 169 + .../mojocn/base64Captcha/item_char.go | 260 + .../mojocn/base64Captcha/item_digit.go | 252 + .../mojocn/base64Captcha/main.go.md | 154 + .../mojocn/base64Captcha/random_math.go | 115 + .../github.com/mojocn/base64Captcha/sounds.go | 9726 ++++++ .../mojocn/base64Captcha/store_memory.go | 115 + .../base64Captcha/store_memory_default.go | 12 + .../github.com/mojocn/base64Captcha/util.go | 94 + .../mojocn/base64Captcha/util_audio.go | 77 + .../opentracing/opentracing-go/.gitignore | 1 + .../opentracing/opentracing-go/.travis.yml | 20 + .../opentracing/opentracing-go/CHANGELOG.md | 63 + .../opentracing/opentracing-go/LICENSE | 201 + .../opentracing/opentracing-go/Makefile | 20 + .../opentracing/opentracing-go/README.md | 171 + .../opentracing/opentracing-go/ext.go | 24 + .../opentracing/opentracing-go/ext/field.go | 17 + .../opentracing/opentracing-go/ext/tags.go | 215 + .../opentracing-go/globaltracer.go | 42 + .../opentracing/opentracing-go/go.mod | 5 + .../opentracing/opentracing-go/go.sum | 7 + .../opentracing/opentracing-go/gocontext.go | 65 + .../opentracing/opentracing-go/log/field.go | 282 + .../opentracing/opentracing-go/log/util.go | 61 + .../mocktracer/mocklogrecord.go | 105 + .../opentracing-go/mocktracer/mockspan.go | 284 + .../opentracing-go/mocktracer/mocktracer.go | 105 + .../opentracing-go/mocktracer/propagation.go | 120 + .../opentracing/opentracing-go/noop.go | 64 + .../opentracing/opentracing-go/propagation.go | 176 + .../opentracing/opentracing-go/span.go | 189 + .../opentracing/opentracing-go/tracer.go | 304 + vendor/github.com/pborman/uuid/.travis.yml | 10 + .../github.com/pborman/uuid/CONTRIBUTING.md | 10 + vendor/github.com/pborman/uuid/CONTRIBUTORS | 1 + vendor/github.com/pborman/uuid/LICENSE | 27 + vendor/github.com/pborman/uuid/README.md | 15 + vendor/github.com/pborman/uuid/dce.go | 84 + vendor/github.com/pborman/uuid/doc.go | 13 + vendor/github.com/pborman/uuid/go.mod | 3 + vendor/github.com/pborman/uuid/go.sum | 2 + vendor/github.com/pborman/uuid/hash.go | 53 + vendor/github.com/pborman/uuid/marshal.go | 85 + vendor/github.com/pborman/uuid/node.go | 50 + vendor/github.com/pborman/uuid/sql.go | 68 + vendor/github.com/pborman/uuid/time.go | 57 + vendor/github.com/pborman/uuid/util.go | 32 + vendor/github.com/pborman/uuid/uuid.go | 162 + vendor/github.com/pborman/uuid/version1.go | 23 + vendor/github.com/pborman/uuid/version4.go | 26 + .../pelletier/go-toml/.dockerignore | 2 + .../github.com/pelletier/go-toml/.gitignore | 3 + .../github.com/pelletier/go-toml/.travis.yml | 23 - .../pelletier/go-toml/CONTRIBUTING.md | 132 + .../github.com/pelletier/go-toml/Dockerfile | 11 + .../go-toml/PULL_REQUEST_TEMPLATE.md | 5 + vendor/github.com/pelletier/go-toml/README.md | 36 +- .../pelletier/go-toml/azure-pipelines.yml | 167 + .../github.com/pelletier/go-toml/benchmark.sh | 5 +- vendor/github.com/pelletier/go-toml/fuzzit.sh | 26 + vendor/github.com/pelletier/go-toml/go.mod | 9 + vendor/github.com/pelletier/go-toml/go.sum | 11 + .../pelletier/go-toml/keysparsing.go | 136 +- vendor/github.com/pelletier/go-toml/lexer.go | 8 +- .../github.com/pelletier/go-toml/marshal.go | 338 +- .../go-toml/marshal_OrderPreserve_test.toml | 39 + .../pelletier/go-toml/marshal_test.toml | 1 + vendor/github.com/pelletier/go-toml/parser.go | 32 +- vendor/github.com/pelletier/go-toml/test.sh | 88 - vendor/github.com/pelletier/go-toml/toml.go | 120 +- .../pelletier/go-toml/tomltree_write.go | 304 +- vendor/github.com/pkg/errors/.gitignore | 24 + vendor/github.com/pkg/errors/.travis.yml | 10 + vendor/github.com/pkg/errors/LICENSE | 23 + vendor/github.com/pkg/errors/Makefile | 44 + vendor/github.com/pkg/errors/README.md | 59 + vendor/github.com/pkg/errors/appveyor.yml | 32 + vendor/github.com/pkg/errors/errors.go | 288 + vendor/github.com/pkg/errors/go113.go | 38 + vendor/github.com/pkg/errors/stack.go | 177 + .../prometheus/client_golang/LICENSE | 201 + .../prometheus/client_golang/NOTICE | 23 + .../client_golang/prometheus/.gitignore | 1 + .../client_golang/prometheus/README.md | 1 + .../client_golang/prometheus/build_info.go | 29 + .../prometheus/build_info_pre_1.12.go | 22 + .../client_golang/prometheus/collector.go | 120 + .../client_golang/prometheus/counter.go | 319 + .../client_golang/prometheus/desc.go | 185 + .../client_golang/prometheus/doc.go | 199 + .../prometheus/expvar_collector.go | 119 + .../client_golang/prometheus/fnv.go | 42 + .../client_golang/prometheus/gauge.go | 289 + .../client_golang/prometheus/go_collector.go | 396 + .../client_golang/prometheus/histogram.go | 636 + .../prometheus/internal/metric.go | 85 + .../client_golang/prometheus/labels.go | 87 + .../client_golang/prometheus/metric.go | 175 + .../client_golang/prometheus/observer.go | 64 + .../prometheus/process_collector.go | 151 + .../prometheus/process_collector_other.go | 65 + .../prometheus/process_collector_windows.go | 112 + .../client_golang/prometheus/registry.go | 947 + .../client_golang/prometheus/summary.go | 736 + .../client_golang/prometheus/timer.go | 54 + .../client_golang/prometheus/untyped.go | 42 + .../client_golang/prometheus/value.go | 204 + .../client_golang/prometheus/vec.go | 484 + .../client_golang/prometheus/wrap.go | 200 + .../prometheus/client_model/LICENSE | 201 + .../github.com/prometheus/client_model/NOTICE | 5 + .../prometheus/client_model/go/metrics.pb.go | 723 + vendor/github.com/prometheus/common/LICENSE | 201 + vendor/github.com/prometheus/common/NOTICE | 5 + .../prometheus/common/expfmt/decode.go | 429 + .../prometheus/common/expfmt/encode.go | 162 + .../prometheus/common/expfmt/expfmt.go | 41 + .../prometheus/common/expfmt/fuzz.go | 36 + .../common/expfmt/openmetrics_create.go | 527 + .../prometheus/common/expfmt/text_create.go | 465 + .../prometheus/common/expfmt/text_parse.go | 764 + .../bitbucket.org/ww/goautoneg/README.txt | 67 + .../bitbucket.org/ww/goautoneg/autoneg.go | 162 + .../prometheus/common/model/alert.go | 136 + .../prometheus/common/model/fingerprinting.go | 105 + .../github.com/prometheus/common/model/fnv.go | 42 + .../prometheus/common/model/labels.go | 210 + .../prometheus/common/model/labelset.go | 169 + .../prometheus/common/model/metric.go | 102 + .../prometheus/common/model/model.go | 16 + .../prometheus/common/model/signature.go | 144 + .../prometheus/common/model/silence.go | 106 + .../prometheus/common/model/time.go | 270 + .../prometheus/common/model/value.go | 416 + .../github.com/prometheus/procfs/.gitignore | 1 + .../prometheus/procfs/.golangci.yml | 4 + .../prometheus/procfs/CONTRIBUTING.md | 121 + vendor/github.com/prometheus/procfs/LICENSE | 201 + .../prometheus/procfs/MAINTAINERS.md | 2 + vendor/github.com/prometheus/procfs/Makefile | 29 + .../prometheus/procfs/Makefile.common | 275 + vendor/github.com/prometheus/procfs/NOTICE | 7 + vendor/github.com/prometheus/procfs/README.md | 61 + vendor/github.com/prometheus/procfs/arp.go | 85 + .../github.com/prometheus/procfs/buddyinfo.go | 85 + .../github.com/prometheus/procfs/cpuinfo.go | 167 + vendor/github.com/prometheus/procfs/crypto.go | 131 + vendor/github.com/prometheus/procfs/doc.go | 45 + .../prometheus/procfs/fixtures.ttar | 5318 +++ vendor/github.com/prometheus/procfs/fs.go | 43 + vendor/github.com/prometheus/procfs/go.mod | 8 + vendor/github.com/prometheus/procfs/go.sum | 4 + .../prometheus/procfs/internal/fs/fs.go | 55 + .../prometheus/procfs/internal/util/parse.go | 88 + .../procfs/internal/util/readfile.go | 38 + .../procfs/internal/util/sysreadfile.go | 48 + .../internal/util/sysreadfile_compat.go | 26 + .../procfs/internal/util/valueparser.go | 91 + vendor/github.com/prometheus/procfs/ipvs.go | 241 + vendor/github.com/prometheus/procfs/mdstat.go | 194 + .../github.com/prometheus/procfs/meminfo.go | 277 + .../github.com/prometheus/procfs/mountinfo.go | 180 + .../prometheus/procfs/mountstats.go | 621 + .../github.com/prometheus/procfs/net_dev.go | 205 + .../prometheus/procfs/net_sockstat.go | 163 + .../prometheus/procfs/net_softnet.go | 91 + .../github.com/prometheus/procfs/net_unix.go | 271 + vendor/github.com/prometheus/procfs/proc.go | 298 + .../prometheus/procfs/proc_environ.go | 37 + .../prometheus/procfs/proc_fdinfo.go | 125 + .../github.com/prometheus/procfs/proc_io.go | 59 + .../prometheus/procfs/proc_limits.go | 157 + .../github.com/prometheus/procfs/proc_ns.go | 68 + .../github.com/prometheus/procfs/proc_psi.go | 100 + .../github.com/prometheus/procfs/proc_stat.go | 192 + .../prometheus/procfs/proc_status.go | 161 + .../github.com/prometheus/procfs/schedstat.go | 118 + vendor/github.com/prometheus/procfs/stat.go | 244 + vendor/github.com/prometheus/procfs/ttar | 413 + vendor/github.com/prometheus/procfs/vm.go | 210 + vendor/github.com/prometheus/procfs/xfrm.go | 187 + .../github.com/prometheus/procfs/zoneinfo.go | 196 + vendor/github.com/satori/go.uuid/.travis.yml | 23 + vendor/github.com/satori/go.uuid/LICENSE | 20 + vendor/github.com/satori/go.uuid/README.md | 65 + vendor/github.com/satori/go.uuid/codec.go | 206 + vendor/github.com/satori/go.uuid/generator.go | 239 + vendor/github.com/satori/go.uuid/sql.go | 78 + vendor/github.com/satori/go.uuid/uuid.go | 161 + .../shirou/gopsutil/mem/types_openbsd.go | 34 - .../shirou/gopsutil/process/types_darwin.go | 160 - .../shirou/gopsutil/process/types_freebsd.go | 95 - .../shirou/gopsutil/process/types_openbsd.go | 103 - .../github.com/spf13/afero/copyOnWriteFs.go | 5 +- vendor/github.com/spf13/afero/go.mod | 2 + vendor/github.com/spf13/afero/go.sum | 2 + vendor/github.com/spf13/afero/unionFile.go | 19 +- vendor/github.com/spf13/cast/.travis.yml | 8 +- vendor/github.com/spf13/cast/Makefile | 16 +- vendor/github.com/spf13/cast/cast.go | 8 + vendor/github.com/spf13/cast/caste.go | 121 +- .../spf13/jwalterweatherman/.gitignore | 2 + .../jwalterweatherman/default_notepad.go | 30 +- .../github.com/spf13/jwalterweatherman/go.mod | 6 + .../spf13/jwalterweatherman/log_counter.go | 51 +- .../spf13/jwalterweatherman/notepad.go | 57 +- vendor/github.com/spf13/pflag/.travis.yml | 7 +- vendor/github.com/spf13/pflag/README.md | 4 +- vendor/github.com/spf13/pflag/bool_slice.go | 38 + vendor/github.com/spf13/pflag/count.go | 4 +- .../github.com/spf13/pflag/duration_slice.go | 38 + vendor/github.com/spf13/pflag/flag.go | 16 +- .../github.com/spf13/pflag/float32_slice.go | 174 + .../github.com/spf13/pflag/float64_slice.go | 166 + vendor/github.com/spf13/pflag/go.mod | 3 + vendor/github.com/spf13/pflag/go.sum | 0 vendor/github.com/spf13/pflag/int32_slice.go | 174 + vendor/github.com/spf13/pflag/int64_slice.go | 166 + vendor/github.com/spf13/pflag/int_slice.go | 30 + vendor/github.com/spf13/pflag/ip_slice.go | 40 +- vendor/github.com/spf13/pflag/string_array.go | 26 + vendor/github.com/spf13/pflag/string_slice.go | 22 +- .../github.com/spf13/pflag/string_to_int64.go | 149 + vendor/github.com/spf13/pflag/uint_slice.go | 42 + vendor/github.com/stretchr/testify/LICENSE | 35 +- .../testify/assert/assertion_compare.go | 274 - .../testify/assert/assertion_format.go | 644 - .../testify/assert/assertion_format.go.tmpl | 5 - .../testify/assert/assertion_forward.go | 1161 +- .../testify/assert/assertion_forward.go.tmpl | 1 - .../stretchr/testify/assert/assertions.go | 1159 +- .../testify/assert/forward_assertions.go | 2 +- .../testify/assert/http_assertions.go | 108 +- .../stretchr/testify/require/doc.go | 28 + .../testify/require/forward_requirements.go | 16 + .../stretchr/testify/require/require.go | 464 + .../stretchr/testify/require/require.go.tmpl | 6 + .../testify/require/require_forward.go | 388 + .../testify/require/require_forward.go.tmpl | 4 + .../stretchr/testify/require/requirements.go | 9 + vendor/github.com/subosito/gotenv/.travis.yml | 10 - vendor/github.com/subosito/gotenv/README.md | 5 +- .../github.com/subosito/gotenv/appveyor.yml | 9 - vendor/github.com/subosito/gotenv/go.mod | 5 + vendor/github.com/subosito/gotenv/go.sum | 11 + vendor/github.com/twotwotwo/sorts/LICENSE | 29 + vendor/github.com/twotwotwo/sorts/README.md | 31 + .../github.com/twotwotwo/sorts/interfaces.go | 55 + vendor/github.com/twotwotwo/sorts/parallel.go | 81 + vendor/github.com/twotwotwo/sorts/qsort.go | 261 + .../github.com/twotwotwo/sorts/radixsort.go | 534 + vendor/github.com/uber-go/tally/.gitignore | 33 + vendor/github.com/uber-go/tally/.travis.yml | 23 + vendor/github.com/uber-go/tally/LICENSE | 21 + vendor/github.com/uber-go/tally/Makefile | 61 + vendor/github.com/uber-go/tally/README.md | 212 + .../github.com/uber-go/tally/check_license.sh | 4 + vendor/github.com/uber-go/tally/glide.lock | 74 + vendor/github.com/uber-go/tally/glide.yaml | 44 + vendor/github.com/uber-go/tally/histogram.go | 318 + vendor/github.com/uber-go/tally/key_gen.go | 111 + vendor/github.com/uber-go/tally/m3/config.go | 65 + .../buffered_read_transport.go | 79 + .../m3/customtransports/m3_calc_transport.go | 86 + .../github.com/uber-go/tally/m3/reporter.go | 624 + .../uber-go/tally/m3/resource_pool.go | 223 + .../github.com/uber-go/tally/m3/sanitize.go | 44 + .../uber-go/tally/m3/thrift/Makefile | 9 + .../uber-go/tally/m3/thrift/constants.go | 39 + .../github.com/uber-go/tally/m3/thrift/m3.go | 266 + .../uber-go/tally/m3/thrift/ttypes.go | 1150 + .../tally/m3/thriftudp/multitransport.go | 120 + .../uber-go/tally/m3/thriftudp/transport.go | 153 + .../github.com/uber-go/tally/multi/README.md | 13 + .../uber-go/tally/multi/reporter.go | 272 + vendor/github.com/uber-go/tally/pool.go | 63 + .../uber-go/tally/prometheus/README.md | 118 + .../uber-go/tally/prometheus/config.go | 158 + .../uber-go/tally/prometheus/reporter.go | 610 + .../uber-go/tally/prometheus/sanitize.go | 44 + vendor/github.com/uber-go/tally/reporter.go | 140 + vendor/github.com/uber-go/tally/sanitize.go | 176 + vendor/github.com/uber-go/tally/scope.go | 796 + vendor/github.com/uber-go/tally/stats.go | 475 + .../lib/go/thrift/application_exception.go | 142 + .../thrift/lib/go/thrift/binary_protocol.go | 514 + .../lib/go/thrift/buffered_transport.go | 91 + .../thrift/lib/go/thrift/compact_protocol.go | 815 + .../thrift/lib/go/thrift/debug_protocol.go | 269 + .../thrift/lib/go/thrift/deserializer.go | 58 + .../apache/thrift/lib/go/thrift/exception.go | 44 + .../apache/thrift/lib/go/thrift/field.go | 79 + .../thrift/lib/go/thrift/framed_transport.go | 167 + .../thrift/lib/go/thrift/http_client.go | 258 + .../thrift/lib/go/thrift/http_transport.go | 34 + .../lib/go/thrift/iostream_transport.go | 214 + .../thrift/lib/go/thrift/json_protocol.go | 583 + .../thrift/lib/go/thrift/memory_buffer.go | 79 + .../thrift/lib/go/thrift/messagetype.go | 31 + .../lib/go/thrift/multiplexed_protocol.go | 169 + .../apache/thrift/lib/go/thrift/numeric.go | 164 + .../apache/thrift/lib/go/thrift/pointerize.go | 50 + .../apache/thrift/lib/go/thrift/processor.go | 30 + .../thrift/lib/go/thrift/processor_factory.go | 58 + .../apache/thrift/lib/go/thrift/protocol.go | 175 + .../lib/go/thrift/protocol_exception.go | 78 + .../thrift/lib/go/thrift/protocol_factory.go | 25 + .../thrift/lib/go/thrift/rich_transport.go | 69 + .../apache/thrift/lib/go/thrift/serializer.go | 75 + .../apache/thrift/lib/go/thrift/server.go | 35 + .../thrift/lib/go/thrift/server_socket.go | 122 + .../thrift/lib/go/thrift/server_transport.go | 34 + .../lib/go/thrift/simple_json_protocol.go | 1337 + .../thrift/lib/go/thrift/simple_server.go | 196 + .../apache/thrift/lib/go/thrift/socket.go | 166 + .../thrift/lib/go/thrift/ssl_server_socket.go | 109 + .../apache/thrift/lib/go/thrift/ssl_socket.go | 171 + .../apache/thrift/lib/go/thrift/transport.go | 68 + .../lib/go/thrift/transport_exception.go | 90 + .../thrift/lib/go/thrift/transport_factory.go | 39 + .../apache/thrift/lib/go/thrift/type.go | 69 + .../thrift/lib/go/thrift/zlib_transport.go | 117 + vendor/github.com/uber-go/tally/types.go | 157 + .../uber/jaeger-client-go/.gitignore | 15 + .../uber/jaeger-client-go/.gitmodules | 3 + .../uber/jaeger-client-go/.travis.yml | 56 + .../uber/jaeger-client-go/CHANGELOG.md | 351 + .../uber/jaeger-client-go/CONTRIBUTING.md | 170 + vendor/github.com/uber/jaeger-client-go/DCO | 37 + .../uber/jaeger-client-go/Gopkg.lock | 401 + .../uber/jaeger-client-go/Gopkg.toml | 31 + .../github.com/uber/jaeger-client-go/LICENSE | 201 + .../github.com/uber/jaeger-client-go/Makefile | 134 + .../uber/jaeger-client-go/README.md | 324 + .../uber/jaeger-client-go/RELEASE.md | 12 + .../uber/jaeger-client-go/baggage_setter.go | 77 + .../uber/jaeger-client-go/config/config.go | 434 + .../jaeger-client-go/config/config_env.go | 259 + .../uber/jaeger-client-go/config/options.go | 165 + .../uber/jaeger-client-go/constants.go | 106 + .../uber/jaeger-client-go/contrib_observer.go | 56 + .../github.com/uber/jaeger-client-go/doc.go | 24 + .../uber/jaeger-client-go/glide.lock | 98 + .../uber/jaeger-client-go/glide.yaml | 28 + .../uber/jaeger-client-go/header.go | 65 + .../internal/baggage/remote/options.go | 101 + .../baggage/remote/restriction_manager.go | 157 + .../internal/baggage/restriction_manager.go | 71 + .../internal/reporterstats/stats.go | 25 + .../jaeger-client-go/internal/spanlog/json.go | 81 + .../internal/throttler/remote/options.go | 99 + .../internal/throttler/remote/throttler.go | 216 + .../internal/throttler/throttler.go | 32 + .../uber/jaeger-client-go/interop.go | 55 + .../uber/jaeger-client-go/jaeger_tag.go | 84 + .../jaeger-client-go/jaeger_thrift_span.go | 181 + .../uber/jaeger-client-go/log/logger.go | 141 + .../uber/jaeger-client-go/log/zap/field.go | 207 + .../uber/jaeger-client-go/log/zap/logger.go | 46 + .../uber/jaeger-client-go/log/zap/tracer.go | 168 + .../uber/jaeger-client-go/logger.go | 53 + .../uber/jaeger-client-go/metrics.go | 119 + .../uber/jaeger-client-go/observer.go | 88 + .../uber/jaeger-client-go/process.go | 29 + .../uber/jaeger-client-go/propagation.go | 313 + .../uber/jaeger-client-go/reference.go | 23 + .../uber/jaeger-client-go/reporter.go | 322 + .../uber/jaeger-client-go/reporter_options.go | 71 + .../jaeger-client-go/rpcmetrics/README.md | 5 + .../uber/jaeger-client-go/rpcmetrics/doc.go | 16 + .../jaeger-client-go/rpcmetrics/endpoints.go | 63 + .../jaeger-client-go/rpcmetrics/metrics.go | 124 + .../jaeger-client-go/rpcmetrics/normalizer.go | 101 + .../jaeger-client-go/rpcmetrics/observer.go | 171 + .../uber/jaeger-client-go/sampler.go | 516 + .../uber/jaeger-client-go/sampler_remote.go | 337 + .../sampler_remote_options.go | 162 + .../uber/jaeger-client-go/sampler_v2.go | 93 + .../github.com/uber/jaeger-client-go/span.go | 487 + .../uber/jaeger-client-go/span_allocator.go | 56 + .../uber/jaeger-client-go/span_context.go | 387 + .../thrift-gen/agent/agent.go | 411 + .../thrift-gen/agent/constants.go | 23 + .../thrift-gen/agent/ttypes.go | 21 + .../baggage/baggagerestrictionmanager.go | 435 + .../thrift-gen/baggage/constants.go | 18 + .../thrift-gen/baggage/ttypes.go | 154 + .../thrift-gen/jaeger/agent.go | 242 + .../thrift-gen/jaeger/constants.go | 18 + .../thrift-gen/jaeger/ttypes.go | 2106 ++ .../thrift-gen/sampling/constants.go | 18 + .../thrift-gen/sampling/samplingmanager.go | 410 + .../thrift-gen/sampling/ttypes.go | 873 + .../thrift-gen/zipkincore/constants.go | 35 + .../thrift-gen/zipkincore/ttypes.go | 1337 + .../thrift-gen/zipkincore/zipkincollector.go | 446 + .../uber/jaeger-client-go/thrift/.nocover | 0 .../uber/jaeger-client-go/thrift/README.md | 7 + .../thrift/application_exception.go | 142 + .../thrift/binary_protocol.go | 514 + .../thrift/compact_protocol.go | 815 + .../uber/jaeger-client-go/thrift/exception.go | 44 + .../jaeger-client-go/thrift/memory_buffer.go | 79 + .../jaeger-client-go/thrift/messagetype.go | 31 + .../uber/jaeger-client-go/thrift/numeric.go | 164 + .../uber/jaeger-client-go/thrift/processor.go | 30 + .../uber/jaeger-client-go/thrift/protocol.go | 175 + .../thrift/protocol_exception.go | 78 + .../thrift/protocol_factory.go | 25 + .../jaeger-client-go/thrift/rich_transport.go | 69 + .../jaeger-client-go/thrift/serializer.go | 75 + .../thrift/simple_json_protocol.go | 1337 + .../uber/jaeger-client-go/thrift/transport.go | 68 + .../thrift/transport_exception.go | 90 + .../thrift/transport_factory.go | 39 + .../uber/jaeger-client-go/thrift/type.go | 69 + .../uber/jaeger-client-go/tracer.go | 491 + .../uber/jaeger-client-go/tracer_options.go | 182 + .../uber/jaeger-client-go/transport.go | 38 + .../uber/jaeger-client-go/transport/doc.go | 23 + .../uber/jaeger-client-go/transport/http.go | 174 + .../uber/jaeger-client-go/transport_udp.go | 193 + .../uber/jaeger-client-go/utils/http_json.go | 54 + .../uber/jaeger-client-go/utils/localip.go | 84 + .../uber/jaeger-client-go/utils/rand.go | 46 + .../jaeger-client-go/utils/rate_limiter.go | 112 + .../utils/reconnecting_udp_conn.go | 189 + .../uber/jaeger-client-go/utils/udp_client.go | 149 + .../uber/jaeger-client-go/utils/utils.go | 87 + .../uber/jaeger-client-go/zipkin.go | 77 + .../jaeger-client-go/zipkin_thrift_span.go | 329 + vendor/github.com/uber/jaeger-lib/LICENSE | 201 + .../uber/jaeger-lib/metrics/counter.go | 28 + .../uber/jaeger-lib/metrics/factory.go | 78 + .../uber/jaeger-lib/metrics/gauge.go | 28 + .../uber/jaeger-lib/metrics/histogram.go | 28 + .../uber/jaeger-lib/metrics/keys.go | 35 + .../uber/jaeger-lib/metrics/metrics.go | 137 + .../uber/jaeger-lib/metrics/stopwatch.go | 43 + .../uber/jaeger-lib/metrics/tally/factory.go | 72 + .../uber/jaeger-lib/metrics/tally/metrics.go | 81 + .../uber/jaeger-lib/metrics/timer.go | 33 + vendor/github.com/uber/tchannel-go/.gitignore | 20 + .../github.com/uber/tchannel-go/.travis.yml | 58 + .../github.com/uber/tchannel-go/CHANGELOG.md | 290 + .../uber/tchannel-go/CODE_OF_CONDUCT.md | 75 + .../uber/tchannel-go/CONTRIBUTING.md | 44 + vendor/github.com/uber/tchannel-go/LICENSE.md | 19 + vendor/github.com/uber/tchannel-go/Makefile | 157 + vendor/github.com/uber/tchannel-go/README.md | 67 + vendor/github.com/uber/tchannel-go/RELEASE.md | 52 + .../uber/tchannel-go/all_channels.go | 69 + .../github.com/uber/tchannel-go/arguments.go | 150 + .../uber/tchannel-go/calloptions.go | 94 + vendor/github.com/uber/tchannel-go/channel.go | 851 + .../uber/tchannel-go/channelstate_string.go | 17 + .../github.com/uber/tchannel-go/checksum.go | 175 + .../github.com/uber/tchannel-go/codecov.yml | 15 + .../github.com/uber/tchannel-go/connection.go | 873 + .../uber/tchannel-go/connection_direction.go | 41 + .../tchannel-go/connectionstate_string.go | 17 + vendor/github.com/uber/tchannel-go/context.go | 123 + .../uber/tchannel-go/context_builder.go | 244 + .../uber/tchannel-go/context_header.go | 121 + vendor/github.com/uber/tchannel-go/dial_16.go | 34 + vendor/github.com/uber/tchannel-go/dial_17.go | 33 + vendor/github.com/uber/tchannel-go/doc.go | 26 + vendor/github.com/uber/tchannel-go/errors.go | 236 + .../uber/tchannel-go/fragmenting_reader.go | 316 + .../uber/tchannel-go/fragmenting_writer.go | 296 + vendor/github.com/uber/tchannel-go/frame.go | 209 + .../github.com/uber/tchannel-go/frame_pool.go | 86 + vendor/github.com/uber/tchannel-go/glide.lock | 89 + vendor/github.com/uber/tchannel-go/glide.yaml | 60 + .../github.com/uber/tchannel-go/handlers.go | 127 + vendor/github.com/uber/tchannel-go/health.go | 176 + .../github.com/uber/tchannel-go/idle_sweep.go | 123 + vendor/github.com/uber/tchannel-go/inbound.go | 412 + .../tchannel-go/internal/argreader/empty.go | 50 + .../uber/tchannel-go/introspection.go | 534 + vendor/github.com/uber/tchannel-go/localip.go | 112 + vendor/github.com/uber/tchannel-go/logger.go | 229 + .../github.com/uber/tchannel-go/messages.go | 338 + .../uber/tchannel-go/messagetype_string.go | 37 + vendor/github.com/uber/tchannel-go/mex.go | 492 + .../github.com/uber/tchannel-go/outbound.go | 379 + vendor/github.com/uber/tchannel-go/peer.go | 614 + .../github.com/uber/tchannel-go/peer_heap.go | 122 + .../uber/tchannel-go/peer_strategies.go | 89 + .../uber/tchannel-go/preinit_connection.go | 250 + vendor/github.com/uber/tchannel-go/relay.go | 656 + .../uber/tchannel-go/relay/relay.go | 65 + .../github.com/uber/tchannel-go/relay_api.go | 54 + .../uber/tchannel-go/relay_messages.go | 198 + .../uber/tchannel-go/relay_timer_pool.go | 158 + vendor/github.com/uber/tchannel-go/reqres.go | 296 + .../tchannel-go/reqresreaderstate_string.go | 16 + .../tchannel-go/reqreswriterstate_string.go | 16 + vendor/github.com/uber/tchannel-go/retry.go | 269 + .../uber/tchannel-go/retryon_string.go | 16 + .../uber/tchannel-go/root_peer_list.go | 122 + vendor/github.com/uber/tchannel-go/stats.go | 61 + .../github.com/uber/tchannel-go/subchannel.go | 220 + .../uber/tchannel-go/systemerrcode_string.go | 26 + .../uber/tchannel-go/thrift/client.go | 160 + .../uber/tchannel-go/thrift/context.go | 47 + .../github.com/uber/tchannel-go/thrift/doc.go | 44 + .../thrift/gen-go/meta/constants.go | 18 + .../tchannel-go/thrift/gen-go/meta/meta.go | 972 + .../tchannel-go/thrift/gen-go/meta/ttypes.go | 788 + .../uber/tchannel-go/thrift/headers.go | 90 + .../uber/tchannel-go/thrift/interfaces.go | 46 + .../uber/tchannel-go/thrift/meta.go | 108 + .../uber/tchannel-go/thrift/meta.thrift | 58 + .../uber/tchannel-go/thrift/options.go | 47 + .../uber/tchannel-go/thrift/server.go | 240 + .../uber/tchannel-go/thrift/struct.go | 43 + .../uber/tchannel-go/thrift/tchan-meta.go | 176 + .../uber/tchannel-go/thrift/test.thrift | 33 + .../uber/tchannel-go/thrift/transport.go | 138 + .../uber/tchannel-go/tnet/listener.go | 96 + vendor/github.com/uber/tchannel-go/tos/tos.go | 77 + .../uber/tchannel-go/tos/tos_string.go | 53 + vendor/github.com/uber/tchannel-go/tracing.go | 288 + .../uber/tchannel-go/tracing_keys.go | 103 + .../github.com/uber/tchannel-go/trand/rand.go | 61 + .../uber/tchannel-go/typed/buffer.go | 434 + .../uber/tchannel-go/typed/reader.go | 105 + vendor/github.com/uber/tchannel-go/version.go | 26 + vendor/github.com/ugorji/go/codec/xml.go | 502 - vendor/github.com/willf/bitset/.gitignore | 26 + vendor/github.com/willf/bitset/.travis.yml | 37 + vendor/github.com/willf/bitset/LICENSE | 27 + vendor/github.com/willf/bitset/Makefile | 197 + vendor/github.com/willf/bitset/README.md | 96 + vendor/github.com/willf/bitset/bitset.go | 877 + vendor/github.com/willf/bitset/popcnt.go | 53 + vendor/github.com/willf/bitset/popcnt_19.go | 45 + .../github.com/willf/bitset/popcnt_amd64.go | 68 + vendor/github.com/willf/bitset/popcnt_amd64.s | 104 + .../github.com/willf/bitset/popcnt_generic.go | 24 + .../willf/bitset/trailing_zeros_18.go | 14 + .../willf/bitset/trailing_zeros_19.go | 9 + vendor/go.etcd.io/etcd/LICENSE | 202 + vendor/go.etcd.io/etcd/NOTICE | 5 + vendor/go.etcd.io/etcd/auth/authpb/auth.pb.go | 977 + vendor/go.etcd.io/etcd/auth/authpb/auth.proto | 42 + vendor/go.etcd.io/etcd/clientv3/README.md | 85 + vendor/go.etcd.io/etcd/clientv3/auth.go | 242 + .../etcd/clientv3/balancer/balancer.go | 293 + .../balancer/connectivity/connectivity.go | 93 + .../etcd/clientv3/balancer/picker/doc.go | 16 + .../etcd/clientv3/balancer/picker/err.go | 39 + .../etcd/clientv3/balancer/picker/picker.go | 91 + .../balancer/picker/roundrobin_balanced.go | 95 + .../balancer/resolver/endpoint/endpoint.go | 247 + .../etcd/clientv3/balancer/utils.go | 68 + vendor/go.etcd.io/etcd/clientv3/client.go | 664 + vendor/go.etcd.io/etcd/clientv3/cluster.go | 141 + vendor/go.etcd.io/etcd/clientv3/compact_op.go | 51 + vendor/go.etcd.io/etcd/clientv3/compare.go | 140 + .../etcd/clientv3/concurrency/doc.go | 17 + .../etcd/clientv3/concurrency/election.go | 254 + .../etcd/clientv3/concurrency/key.go | 65 + .../etcd/clientv3/concurrency/mutex.go | 117 + .../etcd/clientv3/concurrency/session.go | 141 + .../etcd/clientv3/concurrency/stm.go | 387 + vendor/go.etcd.io/etcd/clientv3/config.go | 88 + .../etcd/clientv3/credentials/credentials.go | 173 + vendor/go.etcd.io/etcd/clientv3/ctx.go | 64 + vendor/go.etcd.io/etcd/clientv3/doc.go | 106 + vendor/go.etcd.io/etcd/clientv3/kv.go | 177 + vendor/go.etcd.io/etcd/clientv3/lease.go | 596 + vendor/go.etcd.io/etcd/clientv3/logger.go | 101 + .../go.etcd.io/etcd/clientv3/maintenance.go | 243 + vendor/go.etcd.io/etcd/clientv3/op.go | 560 + vendor/go.etcd.io/etcd/clientv3/options.go | 65 + vendor/go.etcd.io/etcd/clientv3/retry.go | 298 + .../etcd/clientv3/retry_interceptor.go | 392 + vendor/go.etcd.io/etcd/clientv3/sort.go | 37 + vendor/go.etcd.io/etcd/clientv3/txn.go | 151 + vendor/go.etcd.io/etcd/clientv3/utils.go | 49 + vendor/go.etcd.io/etcd/clientv3/watch.go | 1035 + .../etcd/etcdserver/api/v3rpc/rpctypes/doc.go | 16 + .../etcdserver/api/v3rpc/rpctypes/error.go | 235 + .../etcd/etcdserver/api/v3rpc/rpctypes/md.go | 22 + .../api/v3rpc/rpctypes/metadatafields.go | 20 + .../etcdserver/etcdserverpb/etcdserver.pb.go | 1041 + .../etcdserver/etcdserverpb/etcdserver.proto | 34 + .../etcdserverpb/raft_internal.pb.go | 2127 ++ .../etcdserverpb/raft_internal.proto | 75 + .../etcdserverpb/raft_internal_stringer.go | 183 + .../etcd/etcdserver/etcdserverpb/rpc.pb.go | 20088 +++++++++++ .../etcd/etcdserver/etcdserverpb/rpc.proto | 1146 + vendor/go.etcd.io/etcd/mvcc/mvccpb/kv.pb.go | 718 + vendor/go.etcd.io/etcd/mvcc/mvccpb/kv.proto | 49 + .../etcd/pkg/logutil/discard_logger.go | 46 + vendor/go.etcd.io/etcd/pkg/logutil/doc.go | 16 + .../go.etcd.io/etcd/pkg/logutil/log_level.go | 70 + vendor/go.etcd.io/etcd/pkg/logutil/logger.go | 64 + .../etcd/pkg/logutil/merge_logger.go | 194 + .../etcd/pkg/logutil/package_logger.go | 60 + vendor/go.etcd.io/etcd/pkg/logutil/zap.go | 91 + .../go.etcd.io/etcd/pkg/logutil/zap_grpc.go | 111 + .../etcd/pkg/logutil/zap_journal.go | 92 + .../go.etcd.io/etcd/pkg/logutil/zap_raft.go | 102 + vendor/go.etcd.io/etcd/pkg/systemd/doc.go | 16 + vendor/go.etcd.io/etcd/pkg/systemd/journal.go | 29 + vendor/go.etcd.io/etcd/pkg/types/doc.go | 17 + vendor/go.etcd.io/etcd/pkg/types/id.go | 39 + vendor/go.etcd.io/etcd/pkg/types/set.go | 195 + vendor/go.etcd.io/etcd/pkg/types/slice.go | 22 + vendor/go.etcd.io/etcd/pkg/types/urls.go | 82 + vendor/go.etcd.io/etcd/pkg/types/urlsmap.go | 107 + vendor/go.etcd.io/etcd/raft/OWNERS | 19 + vendor/go.etcd.io/etcd/raft/README.md | 197 + vendor/go.etcd.io/etcd/raft/bootstrap.go | 80 + .../etcd/raft/confchange/confchange.go | 425 + .../etcd/raft/confchange/restore.go | 155 + vendor/go.etcd.io/etcd/raft/design.md | 57 + vendor/go.etcd.io/etcd/raft/doc.go | 300 + vendor/go.etcd.io/etcd/raft/log.go | 372 + vendor/go.etcd.io/etcd/raft/log_unstable.go | 157 + vendor/go.etcd.io/etcd/raft/logger.go | 132 + vendor/go.etcd.io/etcd/raft/node.go | 584 + vendor/go.etcd.io/etcd/raft/quorum/joint.go | 75 + .../go.etcd.io/etcd/raft/quorum/majority.go | 210 + vendor/go.etcd.io/etcd/raft/quorum/quorum.go | 58 + .../etcd/raft/quorum/voteresult_string.go | 26 + vendor/go.etcd.io/etcd/raft/raft.go | 1656 + .../go.etcd.io/etcd/raft/raftpb/confchange.go | 170 + .../go.etcd.io/etcd/raft/raftpb/confstate.go | 45 + vendor/go.etcd.io/etcd/raft/raftpb/raft.pb.go | 2646 ++ vendor/go.etcd.io/etcd/raft/raftpb/raft.proto | 177 + vendor/go.etcd.io/etcd/raft/rawnode.go | 239 + vendor/go.etcd.io/etcd/raft/read_only.go | 121 + vendor/go.etcd.io/etcd/raft/status.go | 106 + vendor/go.etcd.io/etcd/raft/storage.go | 273 + .../go.etcd.io/etcd/raft/tracker/inflights.go | 132 + .../go.etcd.io/etcd/raft/tracker/progress.go | 259 + vendor/go.etcd.io/etcd/raft/tracker/state.go | 42 + .../go.etcd.io/etcd/raft/tracker/tracker.go | 288 + vendor/go.etcd.io/etcd/raft/util.go | 233 + vendor/go.etcd.io/etcd/version/version.go | 56 + vendor/go.uber.org/atomic/.codecov.yml | 15 + vendor/go.uber.org/atomic/.gitignore | 12 + vendor/go.uber.org/atomic/.travis.yml | 27 + vendor/go.uber.org/atomic/CHANGELOG.md | 64 + vendor/go.uber.org/atomic/LICENSE.txt | 19 + vendor/go.uber.org/atomic/Makefile | 35 + vendor/go.uber.org/atomic/README.md | 63 + vendor/go.uber.org/atomic/atomic.go | 356 + vendor/go.uber.org/atomic/error.go | 55 + vendor/go.uber.org/atomic/go.mod | 10 + vendor/go.uber.org/atomic/go.sum | 22 + vendor/go.uber.org/atomic/string.go | 49 + vendor/go.uber.org/multierr/.codecov.yml | 15 + vendor/go.uber.org/multierr/.gitignore | 4 + vendor/go.uber.org/multierr/.travis.yml | 29 + vendor/go.uber.org/multierr/CHANGELOG.md | 48 + vendor/go.uber.org/multierr/LICENSE.txt | 19 + vendor/go.uber.org/multierr/Makefile | 42 + vendor/go.uber.org/multierr/README.md | 23 + vendor/go.uber.org/multierr/error.go | 449 + vendor/go.uber.org/multierr/glide.yaml | 8 + vendor/go.uber.org/multierr/go.mod | 12 + vendor/go.uber.org/multierr/go.sum | 45 + vendor/go.uber.org/multierr/go113.go | 52 + vendor/go.uber.org/multierr/tools.go | 30 + vendor/go.uber.org/tools/LICENSE | 19 + .../tools/update-license/.gitignore | 1 + .../tools/update-license/README.md | 24 + .../tools/update-license/licenses.go | 56 + .../go.uber.org/tools/update-license/main.go | 228 + vendor/go.uber.org/zap/.codecov.yml | 17 + vendor/go.uber.org/zap/.gitignore | 32 + vendor/go.uber.org/zap/.readme.tmpl | 109 + vendor/go.uber.org/zap/.travis.yml | 23 + vendor/go.uber.org/zap/CHANGELOG.md | 352 + vendor/go.uber.org/zap/CODE_OF_CONDUCT.md | 75 + vendor/go.uber.org/zap/CONTRIBUTING.md | 81 + vendor/go.uber.org/zap/FAQ.md | 155 + vendor/go.uber.org/zap/LICENSE.txt | 19 + vendor/go.uber.org/zap/Makefile | 57 + vendor/go.uber.org/zap/README.md | 134 + vendor/go.uber.org/zap/array.go | 320 + vendor/go.uber.org/zap/buffer/buffer.go | 115 + vendor/go.uber.org/zap/buffer/pool.go | 49 + vendor/go.uber.org/zap/checklicense.sh | 17 + vendor/go.uber.org/zap/config.go | 243 + vendor/go.uber.org/zap/doc.go | 113 + vendor/go.uber.org/zap/encoder.go | 75 + vendor/go.uber.org/zap/error.go | 80 + vendor/go.uber.org/zap/field.go | 525 + vendor/go.uber.org/zap/flag.go | 39 + vendor/go.uber.org/zap/glide.yaml | 34 + vendor/go.uber.org/zap/global.go | 168 + vendor/go.uber.org/zap/global_go112.go | 26 + vendor/go.uber.org/zap/global_prego112.go | 26 + vendor/go.uber.org/zap/go.mod | 11 + vendor/go.uber.org/zap/go.sum | 56 + vendor/go.uber.org/zap/http_handler.go | 81 + .../zap/internal/bufferpool/bufferpool.go | 31 + .../go.uber.org/zap/internal/color/color.go | 44 + vendor/go.uber.org/zap/internal/exit/exit.go | 64 + vendor/go.uber.org/zap/level.go | 132 + vendor/go.uber.org/zap/logger.go | 305 + vendor/go.uber.org/zap/options.go | 109 + vendor/go.uber.org/zap/sink.go | 161 + vendor/go.uber.org/zap/stacktrace.go | 126 + vendor/go.uber.org/zap/sugar.go | 304 + vendor/go.uber.org/zap/time.go | 27 + vendor/go.uber.org/zap/tools.go | 28 + vendor/go.uber.org/zap/writer.go | 99 + .../zap/zapcore/console_encoder.go | 147 + vendor/go.uber.org/zap/zapcore/core.go | 113 + vendor/go.uber.org/zap/zapcore/doc.go | 24 + vendor/go.uber.org/zap/zapcore/encoder.go | 371 + vendor/go.uber.org/zap/zapcore/entry.go | 258 + vendor/go.uber.org/zap/zapcore/error.go | 120 + vendor/go.uber.org/zap/zapcore/field.go | 212 + vendor/go.uber.org/zap/zapcore/hook.go | 68 + .../go.uber.org/zap/zapcore/json_encoder.go | 517 + vendor/go.uber.org/zap/zapcore/level.go | 175 + .../go.uber.org/zap/zapcore/level_strings.go | 46 + vendor/go.uber.org/zap/zapcore/marshaler.go | 53 + .../go.uber.org/zap/zapcore/memory_encoder.go | 179 + vendor/go.uber.org/zap/zapcore/sampler.go | 134 + vendor/go.uber.org/zap/zapcore/tee.go | 81 + .../go.uber.org/zap/zapcore/write_syncer.go | 123 + vendor/golang.org/x/image/AUTHORS | 3 + vendor/golang.org/x/image/CONTRIBUTORS | 3 + .../context => golang.org/x/image}/LICENSE | 8 +- vendor/golang.org/x/image/PATENTS | 22 + vendor/golang.org/x/image/font/font.go | 371 + vendor/golang.org/x/image/math/fixed/fixed.go | 410 + vendor/golang.org/x/lint/.travis.yml | 19 + vendor/golang.org/x/lint/CONTRIBUTING.md | 15 + vendor/golang.org/x/lint/LICENSE | 27 + vendor/golang.org/x/lint/README.md | 88 + vendor/golang.org/x/lint/go.mod | 5 + vendor/golang.org/x/lint/go.sum | 8 + vendor/golang.org/x/lint/golint/golint.go | 159 + vendor/golang.org/x/lint/golint/import.go | 309 + .../golang.org/x/lint/golint/importcomment.go | 13 + vendor/golang.org/x/lint/lint.go | 1614 + vendor/golang.org/x/net/bpf/asm.go | 41 + vendor/golang.org/x/net/bpf/constants.go | 222 + vendor/golang.org/x/net/bpf/doc.go | 82 + vendor/golang.org/x/net/bpf/instructions.go | 726 + vendor/golang.org/x/net/bpf/setter.go | 10 + vendor/golang.org/x/net/bpf/vm.go | 150 + .../golang.org/x/net/bpf/vm_instructions.go | 182 + vendor/golang.org/x/net/http/httpguts/guts.go | 50 + .../golang.org/x/net/http/httpguts/httplex.go | 346 + vendor/golang.org/x/net/http2/.gitignore | 2 + vendor/golang.org/x/net/http2/Dockerfile | 51 + vendor/golang.org/x/net/http2/Makefile | 3 + vendor/golang.org/x/net/http2/README | 20 + vendor/golang.org/x/net/http2/ciphers.go | 641 + .../x/net/http2/client_conn_pool.go | 278 + vendor/golang.org/x/net/http2/databuffer.go | 146 + vendor/golang.org/x/net/http2/errors.go | 133 + vendor/golang.org/x/net/http2/flow.go | 52 + vendor/golang.org/x/net/http2/frame.go | 1614 + vendor/golang.org/x/net/http2/go111.go | 29 + vendor/golang.org/x/net/http2/gotrack.go | 170 + vendor/golang.org/x/net/http2/headermap.go | 88 + vendor/golang.org/x/net/http2/hpack/encode.go | 240 + vendor/golang.org/x/net/http2/hpack/hpack.go | 504 + .../golang.org/x/net/http2/hpack/huffman.go | 229 + vendor/golang.org/x/net/http2/hpack/tables.go | 479 + vendor/golang.org/x/net/http2/http2.go | 385 + vendor/golang.org/x/net/http2/not_go111.go | 20 + vendor/golang.org/x/net/http2/pipe.go | 168 + vendor/golang.org/x/net/http2/server.go | 2964 ++ vendor/golang.org/x/net/http2/transport.go | 2733 ++ vendor/golang.org/x/net/http2/write.go | 365 + vendor/golang.org/x/net/http2/writesched.go | 248 + .../x/net/http2/writesched_priority.go | 452 + .../x/net/http2/writesched_random.go | 77 + vendor/golang.org/x/net/idna/idna10.0.0.go | 734 + vendor/golang.org/x/net/idna/idna9.0.0.go | 682 + vendor/golang.org/x/net/idna/punycode.go | 203 + vendor/golang.org/x/net/idna/tables10.0.0.go | 4559 +++ vendor/golang.org/x/net/idna/tables11.0.0.go | 4653 +++ vendor/golang.org/x/net/idna/tables12.00.go | 4733 +++ vendor/golang.org/x/net/idna/tables9.0.0.go | 4486 +++ vendor/golang.org/x/net/idna/trie.go | 72 + vendor/golang.org/x/net/idna/trieval.go | 119 + .../golang.org/x/net/internal/iana/const.go | 223 + .../x/net/internal/socket/cmsghdr.go | 11 + .../x/net/internal/socket/cmsghdr_bsd.go | 13 + .../internal/socket/cmsghdr_linux_32bit.go | 14 + .../internal/socket/cmsghdr_linux_64bit.go | 14 + .../internal/socket/cmsghdr_solaris_64bit.go | 14 + .../x/net/internal/socket/cmsghdr_stub.go | 17 + .../golang.org/x/net/internal/socket/empty.s | 7 + .../x/net/internal/socket/error_unix.go | 31 + .../x/net/internal/socket/error_windows.go | 26 + .../x/net/internal/socket/iovec_32bit.go | 19 + .../x/net/internal/socket/iovec_64bit.go | 19 + .../internal/socket/iovec_solaris_64bit.go | 19 + .../x/net/internal/socket/iovec_stub.go | 11 + .../x/net/internal/socket/mmsghdr_stub.go | 21 + .../x/net/internal/socket/mmsghdr_unix.go | 42 + .../x/net/internal/socket/msghdr_bsd.go | 39 + .../x/net/internal/socket/msghdr_bsdvar.go | 16 + .../x/net/internal/socket/msghdr_linux.go | 36 + .../net/internal/socket/msghdr_linux_32bit.go | 24 + .../net/internal/socket/msghdr_linux_64bit.go | 24 + .../x/net/internal/socket/msghdr_openbsd.go | 14 + .../internal/socket/msghdr_solaris_64bit.go | 36 + .../x/net/internal/socket/msghdr_stub.go | 14 + .../x/net/internal/socket/norace.go | 12 + .../golang.org/x/net/internal/socket/race.go | 37 + .../x/net/internal/socket/rawconn.go | 64 + .../x/net/internal/socket/rawconn_mmsg.go | 79 + .../x/net/internal/socket/rawconn_msg.go | 78 + .../x/net/internal/socket/rawconn_nommsg.go | 15 + .../x/net/internal/socket/rawconn_nomsg.go | 15 + .../x/net/internal/socket/socket.go | 288 + .../golang.org/x/net/internal/socket/sys.go | 33 + .../x/net/internal/socket/sys_bsd.go | 15 + .../x/net/internal/socket/sys_bsdvar.go | 23 + .../x/net/internal/socket/sys_const_unix.go | 17 + .../x/net/internal/socket/sys_darwin.go | 7 + .../x/net/internal/socket/sys_dragonfly.go | 32 + .../net/internal/socket/sys_go1_11_darwin.go | 33 + .../x/net/internal/socket/sys_linkname.go | 42 + .../x/net/internal/socket/sys_linux.go | 27 + .../x/net/internal/socket/sys_linux_386.go | 55 + .../x/net/internal/socket/sys_linux_386.s | 11 + .../x/net/internal/socket/sys_linux_amd64.go | 10 + .../x/net/internal/socket/sys_linux_arm.go | 10 + .../x/net/internal/socket/sys_linux_arm64.go | 10 + .../x/net/internal/socket/sys_linux_mips.go | 10 + .../x/net/internal/socket/sys_linux_mips64.go | 10 + .../net/internal/socket/sys_linux_mips64le.go | 10 + .../x/net/internal/socket/sys_linux_mipsle.go | 10 + .../x/net/internal/socket/sys_linux_ppc64.go | 10 + .../net/internal/socket/sys_linux_ppc64le.go | 10 + .../net/internal/socket/sys_linux_riscv64.go | 12 + .../x/net/internal/socket/sys_linux_s390x.go | 55 + .../x/net/internal/socket/sys_linux_s390x.s | 11 + .../x/net/internal/socket/sys_netbsd.go | 25 + .../x/net/internal/socket/sys_posix.go | 183 + .../x/net/internal/socket/sys_solaris.go | 70 + .../x/net/internal/socket/sys_solaris_amd64.s | 11 + .../x/net/internal/socket/sys_stub.go | 63 + .../x/net/internal/socket/sys_unix.go | 33 + .../x/net/internal/socket/sys_windows.go | 71 + .../x/net/internal/socket/zsys_aix_ppc64.go | 60 + .../x/net/internal/socket/zsys_darwin_386.go | 51 + .../net/internal/socket/zsys_darwin_amd64.go | 53 + .../x/net/internal/socket/zsys_darwin_arm.go | 51 + .../net/internal/socket/zsys_darwin_arm64.go | 53 + .../internal/socket/zsys_dragonfly_amd64.go | 53 + .../x/net/internal/socket/zsys_freebsd_386.go | 51 + .../net/internal/socket/zsys_freebsd_amd64.go | 53 + .../x/net/internal/socket/zsys_freebsd_arm.go | 51 + .../net/internal/socket/zsys_freebsd_arm64.go | 53 + .../x/net/internal/socket/zsys_linux_386.go | 54 + .../x/net/internal/socket/zsys_linux_amd64.go | 57 + .../x/net/internal/socket/zsys_linux_arm.go | 55 + .../x/net/internal/socket/zsys_linux_arm64.go | 58 + .../x/net/internal/socket/zsys_linux_mips.go | 55 + .../net/internal/socket/zsys_linux_mips64.go | 58 + .../internal/socket/zsys_linux_mips64le.go | 58 + .../net/internal/socket/zsys_linux_mipsle.go | 55 + .../x/net/internal/socket/zsys_linux_ppc64.go | 58 + .../net/internal/socket/zsys_linux_ppc64le.go | 58 + .../net/internal/socket/zsys_linux_riscv64.go | 59 + .../x/net/internal/socket/zsys_linux_s390x.go | 58 + .../x/net/internal/socket/zsys_netbsd_386.go | 57 + .../net/internal/socket/zsys_netbsd_amd64.go | 60 + .../x/net/internal/socket/zsys_netbsd_arm.go | 57 + .../net/internal/socket/zsys_netbsd_arm64.go | 59 + .../x/net/internal/socket/zsys_openbsd_386.go | 51 + .../net/internal/socket/zsys_openbsd_amd64.go | 53 + .../x/net/internal/socket/zsys_openbsd_arm.go | 51 + .../net/internal/socket/zsys_openbsd_arm64.go | 53 + .../net/internal/socket/zsys_solaris_amd64.go | 52 + .../x/net/internal/timeseries/timeseries.go | 525 + vendor/golang.org/x/net/ipv4/batch.go | 194 + vendor/golang.org/x/net/ipv4/control.go | 144 + vendor/golang.org/x/net/ipv4/control_bsd.go | 41 + .../golang.org/x/net/ipv4/control_pktinfo.go | 39 + vendor/golang.org/x/net/ipv4/control_stub.go | 13 + vendor/golang.org/x/net/ipv4/control_unix.go | 73 + .../golang.org/x/net/ipv4/control_windows.go | 12 + vendor/golang.org/x/net/ipv4/dgramopt.go | 264 + vendor/golang.org/x/net/ipv4/doc.go | 244 + vendor/golang.org/x/net/ipv4/endpoint.go | 186 + vendor/golang.org/x/net/ipv4/genericopt.go | 55 + vendor/golang.org/x/net/ipv4/header.go | 172 + vendor/golang.org/x/net/ipv4/helper.go | 77 + vendor/golang.org/x/net/ipv4/iana.go | 38 + vendor/golang.org/x/net/ipv4/icmp.go | 57 + vendor/golang.org/x/net/ipv4/icmp_linux.go | 25 + vendor/golang.org/x/net/ipv4/icmp_stub.go | 25 + vendor/golang.org/x/net/ipv4/packet.go | 117 + vendor/golang.org/x/net/ipv4/payload.go | 23 + vendor/golang.org/x/net/ipv4/payload_cmsg.go | 84 + .../golang.org/x/net/ipv4/payload_nocmsg.go | 39 + vendor/golang.org/x/net/ipv4/sockopt.go | 44 + vendor/golang.org/x/net/ipv4/sockopt_posix.go | 71 + vendor/golang.org/x/net/ipv4/sockopt_stub.go | 42 + vendor/golang.org/x/net/ipv4/sys_aix.go | 38 + vendor/golang.org/x/net/ipv4/sys_asmreq.go | 122 + .../golang.org/x/net/ipv4/sys_asmreq_stub.go | 25 + vendor/golang.org/x/net/ipv4/sys_asmreqn.go | 42 + .../golang.org/x/net/ipv4/sys_asmreqn_stub.go | 21 + vendor/golang.org/x/net/ipv4/sys_bpf.go | 24 + vendor/golang.org/x/net/ipv4/sys_bpf_stub.go | 16 + vendor/golang.org/x/net/ipv4/sys_bsd.go | 37 + vendor/golang.org/x/net/ipv4/sys_darwin.go | 65 + vendor/golang.org/x/net/ipv4/sys_dragonfly.go | 35 + vendor/golang.org/x/net/ipv4/sys_freebsd.go | 76 + vendor/golang.org/x/net/ipv4/sys_linux.go | 60 + vendor/golang.org/x/net/ipv4/sys_solaris.go | 57 + vendor/golang.org/x/net/ipv4/sys_ssmreq.go | 52 + .../golang.org/x/net/ipv4/sys_ssmreq_stub.go | 21 + vendor/golang.org/x/net/ipv4/sys_stub.go | 13 + vendor/golang.org/x/net/ipv4/sys_windows.go | 67 + .../golang.org/x/net/ipv4/zsys_aix_ppc64.go | 33 + vendor/golang.org/x/net/ipv4/zsys_darwin.go | 99 + .../golang.org/x/net/ipv4/zsys_dragonfly.go | 31 + .../golang.org/x/net/ipv4/zsys_freebsd_386.go | 93 + .../x/net/ipv4/zsys_freebsd_amd64.go | 95 + .../golang.org/x/net/ipv4/zsys_freebsd_arm.go | 95 + .../x/net/ipv4/zsys_freebsd_arm64.go | 93 + .../golang.org/x/net/ipv4/zsys_linux_386.go | 130 + .../golang.org/x/net/ipv4/zsys_linux_amd64.go | 132 + .../golang.org/x/net/ipv4/zsys_linux_arm.go | 130 + .../golang.org/x/net/ipv4/zsys_linux_arm64.go | 132 + .../golang.org/x/net/ipv4/zsys_linux_mips.go | 130 + .../x/net/ipv4/zsys_linux_mips64.go | 132 + .../x/net/ipv4/zsys_linux_mips64le.go | 132 + .../x/net/ipv4/zsys_linux_mipsle.go | 130 + .../golang.org/x/net/ipv4/zsys_linux_ppc.go | 130 + .../golang.org/x/net/ipv4/zsys_linux_ppc64.go | 132 + .../x/net/ipv4/zsys_linux_ppc64le.go | 132 + .../x/net/ipv4/zsys_linux_riscv64.go | 134 + .../golang.org/x/net/ipv4/zsys_linux_s390x.go | 132 + vendor/golang.org/x/net/ipv4/zsys_netbsd.go | 30 + vendor/golang.org/x/net/ipv4/zsys_openbsd.go | 30 + vendor/golang.org/x/net/ipv4/zsys_solaris.go | 100 + vendor/golang.org/x/net/ipv6/batch.go | 116 + vendor/golang.org/x/net/ipv6/control.go | 187 + .../x/net/ipv6/control_rfc2292_unix.go | 48 + .../x/net/ipv6/control_rfc3542_unix.go | 94 + vendor/golang.org/x/net/ipv6/control_stub.go | 13 + vendor/golang.org/x/net/ipv6/control_unix.go | 55 + .../golang.org/x/net/ipv6/control_windows.go | 12 + vendor/golang.org/x/net/ipv6/dgramopt.go | 301 + vendor/golang.org/x/net/ipv6/doc.go | 243 + vendor/golang.org/x/net/ipv6/endpoint.go | 127 + vendor/golang.org/x/net/ipv6/genericopt.go | 56 + vendor/golang.org/x/net/ipv6/header.go | 55 + vendor/golang.org/x/net/ipv6/helper.go | 58 + vendor/golang.org/x/net/ipv6/iana.go | 86 + vendor/golang.org/x/net/ipv6/icmp.go | 60 + vendor/golang.org/x/net/ipv6/icmp_bsd.go | 29 + vendor/golang.org/x/net/ipv6/icmp_linux.go | 27 + vendor/golang.org/x/net/ipv6/icmp_solaris.go | 27 + vendor/golang.org/x/net/ipv6/icmp_stub.go | 23 + vendor/golang.org/x/net/ipv6/icmp_windows.go | 22 + vendor/golang.org/x/net/ipv6/payload.go | 23 + vendor/golang.org/x/net/ipv6/payload_cmsg.go | 70 + .../golang.org/x/net/ipv6/payload_nocmsg.go | 38 + vendor/golang.org/x/net/ipv6/sockopt.go | 43 + vendor/golang.org/x/net/ipv6/sockopt_posix.go | 89 + vendor/golang.org/x/net/ipv6/sockopt_stub.go | 46 + vendor/golang.org/x/net/ipv6/sys_aix.go | 77 + vendor/golang.org/x/net/ipv6/sys_asmreq.go | 24 + .../golang.org/x/net/ipv6/sys_asmreq_stub.go | 17 + vendor/golang.org/x/net/ipv6/sys_bpf.go | 24 + vendor/golang.org/x/net/ipv6/sys_bpf_stub.go | 16 + vendor/golang.org/x/net/ipv6/sys_bsd.go | 57 + vendor/golang.org/x/net/ipv6/sys_darwin.go | 78 + vendor/golang.org/x/net/ipv6/sys_freebsd.go | 92 + vendor/golang.org/x/net/ipv6/sys_linux.go | 75 + vendor/golang.org/x/net/ipv6/sys_solaris.go | 74 + vendor/golang.org/x/net/ipv6/sys_ssmreq.go | 54 + .../golang.org/x/net/ipv6/sys_ssmreq_stub.go | 21 + vendor/golang.org/x/net/ipv6/sys_stub.go | 13 + vendor/golang.org/x/net/ipv6/sys_windows.go | 75 + .../golang.org/x/net/ipv6/zsys_aix_ppc64.go | 103 + vendor/golang.org/x/net/ipv6/zsys_darwin.go | 131 + .../golang.org/x/net/ipv6/zsys_dragonfly.go | 88 + .../golang.org/x/net/ipv6/zsys_freebsd_386.go | 122 + .../x/net/ipv6/zsys_freebsd_amd64.go | 124 + .../golang.org/x/net/ipv6/zsys_freebsd_arm.go | 124 + .../x/net/ipv6/zsys_freebsd_arm64.go | 122 + .../golang.org/x/net/ipv6/zsys_linux_386.go | 152 + .../golang.org/x/net/ipv6/zsys_linux_amd64.go | 154 + .../golang.org/x/net/ipv6/zsys_linux_arm.go | 152 + .../golang.org/x/net/ipv6/zsys_linux_arm64.go | 154 + .../golang.org/x/net/ipv6/zsys_linux_mips.go | 152 + .../x/net/ipv6/zsys_linux_mips64.go | 154 + .../x/net/ipv6/zsys_linux_mips64le.go | 154 + .../x/net/ipv6/zsys_linux_mipsle.go | 152 + .../golang.org/x/net/ipv6/zsys_linux_ppc.go | 152 + .../golang.org/x/net/ipv6/zsys_linux_ppc64.go | 154 + .../x/net/ipv6/zsys_linux_ppc64le.go | 154 + .../x/net/ipv6/zsys_linux_riscv64.go | 156 + .../golang.org/x/net/ipv6/zsys_linux_s390x.go | 154 + vendor/golang.org/x/net/ipv6/zsys_netbsd.go | 84 + vendor/golang.org/x/net/ipv6/zsys_openbsd.go | 93 + vendor/golang.org/x/net/ipv6/zsys_solaris.go | 131 + vendor/golang.org/x/net/trace/events.go | 532 + vendor/golang.org/x/net/trace/histogram.go | 365 + vendor/golang.org/x/net/trace/trace.go | 1130 + vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s | 17 + vendor/golang.org/x/sys/cpu/byteorder.go | 65 + vendor/golang.org/x/sys/cpu/cpu.go | 267 + vendor/golang.org/x/sys/cpu/cpu_aix.go | 32 + vendor/golang.org/x/sys/cpu/cpu_arm.go | 73 + vendor/golang.org/x/sys/cpu/cpu_arm64.go | 173 + vendor/golang.org/x/sys/cpu/cpu_arm64.s | 31 + vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go | 11 + vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go | 21 + vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 16 + .../golang.org/x/sys/cpu/cpu_gccgo_arm64.go | 11 + .../golang.org/x/sys/cpu/cpu_gccgo_s390x.go | 22 + vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c | 43 + vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go | 26 + vendor/golang.org/x/sys/cpu/cpu_linux.go | 15 + vendor/golang.org/x/sys/cpu/cpu_linux_arm.go | 39 + .../golang.org/x/sys/cpu/cpu_linux_arm64.go | 71 + .../golang.org/x/sys/cpu/cpu_linux_mips64x.go | 23 + .../golang.org/x/sys/cpu/cpu_linux_noinit.go | 9 + .../golang.org/x/sys/cpu/cpu_linux_ppc64x.go | 31 + .../golang.org/x/sys/cpu/cpu_linux_s390x.go | 159 + vendor/golang.org/x/sys/cpu/cpu_mips64x.go | 15 + vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 11 + vendor/golang.org/x/sys/cpu/cpu_other_arm.go | 9 + .../golang.org/x/sys/cpu/cpu_other_arm64.go | 9 + vendor/golang.org/x/sys/cpu/cpu_ppc64x.go | 16 + vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 11 + vendor/golang.org/x/sys/cpu/cpu_s390x.go | 30 + vendor/golang.org/x/sys/cpu/cpu_s390x.s | 57 + vendor/golang.org/x/sys/cpu/cpu_wasm.go | 17 + vendor/golang.org/x/sys/cpu/cpu_x86.go | 88 + vendor/golang.org/x/sys/cpu/cpu_x86.s | 27 + vendor/golang.org/x/sys/cpu/hwcap_linux.go | 56 + .../golang.org/x/sys/cpu/syscall_aix_gccgo.go | 27 + .../x/sys/cpu/syscall_aix_ppc64_gc.go | 36 + .../x/sys/unix/asm_openbsd_mips64.s | 29 + vendor/golang.org/x/sys/unix/ioctl.go | 9 + vendor/golang.org/x/sys/unix/mkall.sh | 9 + vendor/golang.org/x/sys/unix/mkasm_darwin.go | 78 - vendor/golang.org/x/sys/unix/mkerrors.sh | 2 + vendor/golang.org/x/sys/unix/mkmerge.go | 521 - vendor/golang.org/x/sys/unix/mkpost.go | 127 - vendor/golang.org/x/sys/unix/mksyscall.go | 402 - .../x/sys/unix/mksyscall_aix_ppc.go | 415 - .../x/sys/unix/mksyscall_aix_ppc64.go | 614 - .../x/sys/unix/mksyscall_solaris.go | 341 - .../golang.org/x/sys/unix/mksysctl_openbsd.go | 355 - vendor/golang.org/x/sys/unix/mksysnum.go | 190 - vendor/golang.org/x/sys/unix/syscall_linux.go | 70 +- .../x/sys/unix/syscall_linux_arm.go | 5 - .../x/sys/unix/syscall_linux_gc_arm.go | 13 + .../x/sys/unix/syscall_openbsd_mips64.go | 35 + vendor/golang.org/x/sys/unix/types_aix.go | 237 - vendor/golang.org/x/sys/unix/types_darwin.go | 283 - .../golang.org/x/sys/unix/types_dragonfly.go | 269 - vendor/golang.org/x/sys/unix/types_freebsd.go | 406 - vendor/golang.org/x/sys/unix/types_netbsd.go | 300 - vendor/golang.org/x/sys/unix/types_openbsd.go | 283 - vendor/golang.org/x/sys/unix/types_solaris.go | 269 - vendor/golang.org/x/sys/unix/zerrors_linux.go | 45 + .../x/sys/unix/zerrors_openbsd_mips64.go | 1862 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 1692 + .../x/sys/unix/zsysctl_openbsd_mips64.go | 279 + .../x/sys/unix/zsysnum_openbsd_mips64.go | 220 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 74 + .../golang.org/x/sys/unix/ztypes_linux_386.go | 5 + .../x/sys/unix/ztypes_linux_amd64.go | 7 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 7 + .../x/sys/unix/ztypes_linux_arm64.go | 7 + .../x/sys/unix/ztypes_linux_mips.go | 7 + .../x/sys/unix/ztypes_linux_mips64.go | 7 + .../x/sys/unix/ztypes_linux_mips64le.go | 7 + .../x/sys/unix/ztypes_linux_mipsle.go | 7 + .../x/sys/unix/ztypes_linux_ppc64.go | 7 + .../x/sys/unix/ztypes_linux_ppc64le.go | 7 + .../x/sys/unix/ztypes_linux_riscv64.go | 7 + .../x/sys/unix/ztypes_linux_s390x.go | 7 + .../x/sys/unix/ztypes_linux_sparc64.go | 7 + .../x/sys/unix/ztypes_openbsd_mips64.go | 565 + .../x/text/secure/bidirule/bidirule.go | 336 + .../x/text/secure/bidirule/bidirule10.0.0.go | 11 + .../x/text/secure/bidirule/bidirule9.0.0.go | 14 + .../golang.org/x/text/transform/transform.go | 6 +- vendor/golang.org/x/text/unicode/bidi/bidi.go | 198 + .../golang.org/x/text/unicode/bidi/bracket.go | 335 + vendor/golang.org/x/text/unicode/bidi/core.go | 1058 + vendor/golang.org/x/text/unicode/bidi/prop.go | 206 + .../x/text/unicode/bidi/tables10.0.0.go | 1815 + .../x/text/unicode/bidi/tables11.0.0.go | 1887 + .../x/text/unicode/bidi/tables12.0.0.go | 1923 ++ .../x/text/unicode/bidi/tables9.0.0.go | 1781 + .../golang.org/x/text/unicode/bidi/trieval.go | 60 + .../x/text/unicode/norm/maketables.go | 986 - .../x/text/unicode/norm/tables11.0.0.go | 2 +- .../x/text/unicode/norm/tables12.0.0.go | 7710 +++++ .../golang.org/x/text/unicode/norm/triegen.go | 117 - vendor/golang.org/x/tools/AUTHORS | 3 + vendor/golang.org/x/tools/CONTRIBUTORS | 3 + vendor/golang.org/x/tools/LICENSE | 27 + vendor/golang.org/x/tools/PATENTS | 22 + .../x/tools/go/analysis/analysis.go | 237 + .../x/tools/go/analysis/diagnostic.go | 61 + vendor/golang.org/x/tools/go/analysis/doc.go | 301 + .../go/analysis/passes/inspect/inspect.go | 49 + .../x/tools/go/analysis/validate.go | 97 + .../x/tools/go/ast/astutil/enclosing.go | 627 + .../x/tools/go/ast/astutil/imports.go | 482 + .../x/tools/go/ast/astutil/rewrite.go | 477 + .../golang.org/x/tools/go/ast/astutil/util.go | 14 + .../x/tools/go/ast/inspector/inspector.go | 186 + .../x/tools/go/ast/inspector/typeof.go | 216 + .../x/tools/go/buildutil/allpackages.go | 198 + .../x/tools/go/buildutil/fakecontext.go | 109 + .../x/tools/go/buildutil/overlay.go | 103 + .../golang.org/x/tools/go/buildutil/tags.go | 75 + .../golang.org/x/tools/go/buildutil/util.go | 212 + .../x/tools/go/gcexportdata/gcexportdata.go | 109 + .../x/tools/go/gcexportdata/importer.go | 73 + .../x/tools/go/internal/gcimporter/bexport.go | 852 + .../x/tools/go/internal/gcimporter/bimport.go | 1039 + .../go/internal/gcimporter/exportdata.go | 93 + .../go/internal/gcimporter/gcimporter.go | 1078 + .../x/tools/go/internal/gcimporter/iexport.go | 739 + .../x/tools/go/internal/gcimporter/iimport.go | 630 + .../go/internal/gcimporter/newInterface10.go | 21 + .../go/internal/gcimporter/newInterface11.go | 13 + .../tools/go/internal/packagesdriver/sizes.go | 117 + vendor/golang.org/x/tools/go/packages/doc.go | 221 + .../x/tools/go/packages/external.go | 101 + .../golang.org/x/tools/go/packages/golist.go | 889 + .../x/tools/go/packages/golist_overlay.go | 438 + .../x/tools/go/packages/loadmode_string.go | 57 + .../x/tools/go/packages/packages.go | 1159 + .../golang.org/x/tools/go/packages/visit.go | 55 + .../x/tools/go/types/objectpath/objectpath.go | 523 + .../x/tools/go/types/typeutil/callee.go | 46 + .../x/tools/go/types/typeutil/imports.go | 31 + .../x/tools/go/types/typeutil/map.go | 313 + .../tools/go/types/typeutil/methodsetcache.go | 72 + .../x/tools/go/types/typeutil/ui.go | 52 + .../internal/analysisinternal/analysis.go | 118 + .../x/tools/internal/event/core/event.go | 106 + .../x/tools/internal/event/core/export.go | 70 + .../x/tools/internal/event/core/fast.go | 57 + .../golang.org/x/tools/internal/event/doc.go | 7 + .../x/tools/internal/event/event.go | 69 + .../x/tools/internal/event/keys/keys.go | 542 + .../x/tools/internal/event/keys/standard.go | 14 + .../x/tools/internal/event/label/label.go | 213 + .../x/tools/internal/gocommand/invoke.go | 187 + .../internal/packagesinternal/packages.go | 35 + vendor/golang.org/x/xerrors/LICENSE | 27 + vendor/golang.org/x/xerrors/PATENTS | 22 + vendor/golang.org/x/xerrors/README | 2 + vendor/golang.org/x/xerrors/adaptor.go | 193 + vendor/golang.org/x/xerrors/codereview.cfg | 1 + vendor/golang.org/x/xerrors/doc.go | 22 + vendor/golang.org/x/xerrors/errors.go | 33 + vendor/golang.org/x/xerrors/fmt.go | 187 + vendor/golang.org/x/xerrors/format.go | 34 + vendor/golang.org/x/xerrors/frame.go | 56 + vendor/golang.org/x/xerrors/go.mod | 3 + .../golang.org/x/xerrors/internal/internal.go | 8 + vendor/golang.org/x/xerrors/wrap.go | 106 + vendor/google.golang.org/genproto/LICENSE | 202 + .../api/annotations/annotations.pb.go | 57 + .../googleapis/api/annotations/client.pb.go | 81 + .../api/annotations/field_behavior.pb.go | 124 + .../googleapis/api/annotations/http.pb.go | 635 + .../googleapis/api/annotations/resource.pb.go | 443 + .../googleapis/rpc/status/status.pb.go | 117 + .../genproto/protobuf/api/api.pb.go | 413 + .../protobuf/field_mask/field_mask.pb.go | 284 + .../genproto/protobuf/ptype/type.pb.go | 657 + .../source_context/source_context.pb.go | 89 + vendor/google.golang.org/grpc/.travis.yml | 42 + vendor/google.golang.org/grpc/AUTHORS | 1 + .../google.golang.org/grpc/CODE-OF-CONDUCT.md | 3 + vendor/google.golang.org/grpc/CONTRIBUTING.md | 62 + vendor/google.golang.org/grpc/GOVERNANCE.md | 1 + vendor/google.golang.org/grpc/LICENSE | 202 + vendor/google.golang.org/grpc/MAINTAINERS.md | 27 + vendor/google.golang.org/grpc/Makefile | 63 + vendor/google.golang.org/grpc/README.md | 141 + .../grpc/attributes/attributes.go | 70 + vendor/google.golang.org/grpc/backoff.go | 58 + .../google.golang.org/grpc/backoff/backoff.go | 52 + vendor/google.golang.org/grpc/balancer.go | 391 + .../grpc/balancer/balancer.go | 454 + .../grpc/balancer/base/balancer.go | 286 + .../grpc/balancer/base/base.go | 93 + .../grpc/balancer/roundrobin/roundrobin.go | 81 + .../grpc/balancer_conn_wrappers.go | 271 + .../grpc/balancer_v1_wrapper.go | 334 + .../grpc_binarylog_v1/binarylog.pb.go | 900 + vendor/google.golang.org/grpc/call.go | 74 + vendor/google.golang.org/grpc/clientconn.go | 1534 + vendor/google.golang.org/grpc/codec.go | 50 + vendor/google.golang.org/grpc/codegen.sh | 17 + .../grpc/codes/code_string.go | 62 + vendor/google.golang.org/grpc/codes/codes.go | 198 + .../grpc/connectivity/connectivity.go | 73 + .../grpc/credentials/credentials.go | 255 + .../grpc/credentials/go12.go | 30 + .../grpc/credentials/internal/syscallconn.go | 61 + .../internal/syscallconn_appengine.go | 30 + .../google.golang.org/grpc/credentials/tls.go | 235 + vendor/google.golang.org/grpc/dialoptions.go | 606 + vendor/google.golang.org/grpc/doc.go | 24 + .../grpc/encoding/encoding.go | 122 + .../grpc/encoding/proto/proto.go | 110 + vendor/google.golang.org/grpc/go.mod | 16 + vendor/google.golang.org/grpc/go.sum | 64 + .../google.golang.org/grpc/grpclog/grpclog.go | 132 + .../google.golang.org/grpc/grpclog/logger.go | 87 + .../grpc/grpclog/loggerv2.go | 214 + vendor/google.golang.org/grpc/install_gae.sh | 6 + vendor/google.golang.org/grpc/interceptor.go | 77 + .../grpc/internal/backoff/backoff.go | 73 + .../grpc/internal/balancerload/load.go | 46 + .../grpc/internal/binarylog/binarylog.go | 167 + .../internal/binarylog/binarylog_testutil.go | 42 + .../grpc/internal/binarylog/env_config.go | 210 + .../grpc/internal/binarylog/method_logger.go | 423 + .../grpc/internal/binarylog/regenerate.sh | 33 + .../grpc/internal/binarylog/sink.go | 162 + .../grpc/internal/binarylog/util.go | 41 + .../grpc/internal/buffer/unbounded.go | 85 + .../grpc/internal/channelz/funcs.go | 739 + .../grpc/internal/channelz/logging.go | 100 + .../grpc/internal/channelz/types.go | 702 + .../grpc/internal/channelz/types_linux.go | 53 + .../grpc/internal/channelz/types_nonlinux.go | 44 + .../grpc/internal/channelz/util_linux.go | 39 + .../grpc/internal/channelz/util_nonlinux.go | 26 + .../grpc/internal/envconfig/envconfig.go | 38 + .../grpc/internal/grpclog/grpclog.go | 118 + .../grpc/internal/grpclog/prefixLogger.go | 63 + .../grpc/internal/grpcrand/grpcrand.go | 56 + .../grpc/internal/grpcsync/event.go | 61 + .../grpc/internal/grpcutil/target.go | 55 + .../grpc/internal/internal.go | 67 + .../internal/resolver/dns/dns_resolver.go | 441 + .../grpc/internal/resolver/dns/go113.go | 33 + .../resolver/passthrough/passthrough.go | 57 + .../grpc/internal/status/status.go | 161 + .../grpc/internal/syscall/syscall_linux.go | 114 + .../grpc/internal/syscall/syscall_nonlinux.go | 73 + .../grpc/internal/transport/bdp_estimator.go | 141 + .../grpc/internal/transport/controlbuf.go | 926 + .../grpc/internal/transport/defaults.go | 49 + .../grpc/internal/transport/flowcontrol.go | 217 + .../grpc/internal/transport/handler_server.go | 462 + .../grpc/internal/transport/http2_client.go | 1462 + .../grpc/internal/transport/http2_server.go | 1251 + .../grpc/internal/transport/http_util.go | 677 + .../grpc/internal/transport/log.go | 44 + .../grpc/internal/transport/transport.go | 808 + .../grpc/keepalive/keepalive.go | 85 + .../grpc/metadata/metadata.go | 209 + .../grpc/naming/dns_resolver.go | 293 + .../google.golang.org/grpc/naming/naming.go | 68 + vendor/google.golang.org/grpc/peer/peer.go | 51 + .../google.golang.org/grpc/picker_wrapper.go | 229 + vendor/google.golang.org/grpc/pickfirst.go | 159 + vendor/google.golang.org/grpc/preloader.go | 64 + vendor/google.golang.org/grpc/proxy.go | 152 + .../grpc/resolver/dns/dns_resolver.go | 36 + .../grpc/resolver/passthrough/passthrough.go | 26 + .../grpc/resolver/resolver.go | 253 + .../grpc/resolver_conn_wrapper.go | 222 + vendor/google.golang.org/grpc/rpc_util.go | 889 + vendor/google.golang.org/grpc/server.go | 1640 + .../google.golang.org/grpc/service_config.go | 434 + .../grpc/serviceconfig/serviceconfig.go | 41 + .../google.golang.org/grpc/stats/handlers.go | 63 + vendor/google.golang.org/grpc/stats/stats.go | 314 + .../google.golang.org/grpc/status/status.go | 127 + vendor/google.golang.org/grpc/stream.go | 1528 + vendor/google.golang.org/grpc/tap/tap.go | 51 + vendor/google.golang.org/grpc/trace.go | 123 + vendor/google.golang.org/grpc/version.go | 22 + vendor/google.golang.org/grpc/vet.sh | 163 + vendor/gopkg.in/ini.v1/ini.go | 2 +- vendor/gopkg.in/ini.v1/struct.go | 4 + vendor/gopkg.in/yaml.v3/.travis.yml | 16 - vendor/gopkg.in/yaml.v3/LICENSE | 50 - vendor/gopkg.in/yaml.v3/README.md | 150 - vendor/gopkg.in/yaml.v3/apic.go | 746 - vendor/gopkg.in/yaml.v3/decode.go | 931 - vendor/gopkg.in/yaml.v3/emitterc.go | 1992 -- vendor/gopkg.in/yaml.v3/encode.go | 561 - vendor/gopkg.in/yaml.v3/go.mod | 5 - vendor/gopkg.in/yaml.v3/parserc.go | 1229 - vendor/gopkg.in/yaml.v3/readerc.go | 434 - vendor/gopkg.in/yaml.v3/resolve.go | 326 - vendor/gopkg.in/yaml.v3/scannerc.go | 3025 -- vendor/gopkg.in/yaml.v3/sorter.go | 134 - vendor/gopkg.in/yaml.v3/writerc.go | 48 - vendor/gopkg.in/yaml.v3/yaml.go | 662 - vendor/gopkg.in/yaml.v3/yamlh.go | 805 - vendor/gopkg.in/yaml.v3/yamlprivateh.go | 198 - vendor/honnef.co/go/tools/LICENSE | 20 + vendor/honnef.co/go/tools/LICENSE-THIRD-PARTY | 226 + vendor/honnef.co/go/tools/arg/arg.go | 48 + .../go/tools/cmd/staticcheck/README.md | 15 + .../go/tools/cmd/staticcheck/staticcheck.go | 44 + vendor/honnef.co/go/tools/config/config.go | 224 + vendor/honnef.co/go/tools/config/example.conf | 10 + .../honnef.co/go/tools/deprecated/stdlib.go | 112 + vendor/honnef.co/go/tools/facts/deprecated.go | 144 + vendor/honnef.co/go/tools/facts/generated.go | 86 + vendor/honnef.co/go/tools/facts/purity.go | 175 + vendor/honnef.co/go/tools/facts/token.go | 24 + vendor/honnef.co/go/tools/functions/loops.go | 54 + vendor/honnef.co/go/tools/functions/pure.go | 46 + .../go/tools/functions/terminates.go | 24 + .../go/tools/go/types/typeutil/callee.go | 46 + .../go/tools/go/types/typeutil/identical.go | 75 + .../go/tools/go/types/typeutil/imports.go | 31 + .../go/tools/go/types/typeutil/map.go | 319 + .../tools/go/types/typeutil/methodsetcache.go | 72 + .../go/tools/go/types/typeutil/ui.go | 52 + .../go/tools/internal/cache/cache.go | 474 + .../go/tools/internal/cache/default.go | 85 + .../honnef.co/go/tools/internal/cache/hash.go | 176 + .../internal/passes/buildssa/buildssa.go | 116 + .../go/tools/internal/renameio/renameio.go | 83 + .../go/tools/internal/sharedcheck/lint.go | 70 + vendor/honnef.co/go/tools/lint/LICENSE | 28 + vendor/honnef.co/go/tools/lint/lint.go | 491 + .../go/tools/lint/lintdsl/lintdsl.go | 400 + .../go/tools/lint/lintutil/format/format.go | 135 + .../honnef.co/go/tools/lint/lintutil/stats.go | 7 + .../go/tools/lint/lintutil/stats_bsd.go | 10 + .../go/tools/lint/lintutil/stats_posix.go | 10 + .../honnef.co/go/tools/lint/lintutil/util.go | 392 + vendor/honnef.co/go/tools/lint/runner.go | 970 + vendor/honnef.co/go/tools/lint/stats.go | 20 + vendor/honnef.co/go/tools/loader/loader.go | 197 + vendor/honnef.co/go/tools/printf/fuzz.go | 11 + vendor/honnef.co/go/tools/printf/printf.go | 197 + .../honnef.co/go/tools/simple/CONTRIBUTING.md | 15 + vendor/honnef.co/go/tools/simple/analysis.go | 223 + vendor/honnef.co/go/tools/simple/doc.go | 425 + vendor/honnef.co/go/tools/simple/lint.go | 1816 + vendor/honnef.co/go/tools/ssa/LICENSE | 28 + vendor/honnef.co/go/tools/ssa/blockopt.go | 195 + vendor/honnef.co/go/tools/ssa/builder.go | 2379 ++ vendor/honnef.co/go/tools/ssa/const.go | 169 + vendor/honnef.co/go/tools/ssa/create.go | 270 + vendor/honnef.co/go/tools/ssa/doc.go | 125 + vendor/honnef.co/go/tools/ssa/dom.go | 343 + vendor/honnef.co/go/tools/ssa/emit.go | 469 + vendor/honnef.co/go/tools/ssa/func.go | 765 + vendor/honnef.co/go/tools/ssa/identical.go | 7 + vendor/honnef.co/go/tools/ssa/identical_17.go | 7 + vendor/honnef.co/go/tools/ssa/lift.go | 657 + vendor/honnef.co/go/tools/ssa/lvalue.go | 123 + vendor/honnef.co/go/tools/ssa/methods.go | 239 + vendor/honnef.co/go/tools/ssa/mode.go | 100 + vendor/honnef.co/go/tools/ssa/print.go | 435 + vendor/honnef.co/go/tools/ssa/sanity.go | 535 + vendor/honnef.co/go/tools/ssa/source.go | 293 + vendor/honnef.co/go/tools/ssa/ssa.go | 1745 + .../honnef.co/go/tools/ssa/staticcheck.conf | 3 + vendor/honnef.co/go/tools/ssa/testmain.go | 271 + vendor/honnef.co/go/tools/ssa/util.go | 119 + vendor/honnef.co/go/tools/ssa/wrappers.go | 290 + vendor/honnef.co/go/tools/ssa/write.go | 5 + vendor/honnef.co/go/tools/ssautil/ssautil.go | 58 + .../go/tools/staticcheck/CONTRIBUTING.md | 15 + .../go/tools/staticcheck/analysis.go | 525 + .../go/tools/staticcheck/buildtag.go | 21 + vendor/honnef.co/go/tools/staticcheck/doc.go | 764 + .../go/tools/staticcheck/knowledge.go | 25 + vendor/honnef.co/go/tools/staticcheck/lint.go | 3360 ++ .../honnef.co/go/tools/staticcheck/rules.go | 321 + .../go/tools/staticcheck/structtag.go | 58 + .../go/tools/staticcheck/vrp/channel.go | 73 + .../honnef.co/go/tools/staticcheck/vrp/int.go | 476 + .../go/tools/staticcheck/vrp/slice.go | 273 + .../go/tools/staticcheck/vrp/string.go | 258 + .../honnef.co/go/tools/staticcheck/vrp/vrp.go | 1056 + .../honnef.co/go/tools/stylecheck/analysis.go | 111 + vendor/honnef.co/go/tools/stylecheck/doc.go | 154 + vendor/honnef.co/go/tools/stylecheck/lint.go | 629 + vendor/honnef.co/go/tools/stylecheck/names.go | 264 + vendor/honnef.co/go/tools/unused/edge.go | 54 + .../go/tools/unused/edgekind_string.go | 109 + .../honnef.co/go/tools/unused/implements.go | 82 + vendor/honnef.co/go/tools/unused/unused.go | 1964 ++ .../honnef.co/go/tools/version/buildinfo.go | 46 + .../go/tools/version/buildinfo111.go | 6 + vendor/honnef.co/go/tools/version/version.go | 42 + .../apimachinery/pkg/util/cache/cache.go | 83 - .../pkg/util/cache/lruexpirecache.go | 102 - vendor/modules.txt | 514 +- 2526 files changed, 612255 insertions(+), 22769 deletions(-) create mode 100755 script/send_voice create mode 100644 vendor/github.com/BurntSushi/toml/.gitignore create mode 100644 vendor/github.com/BurntSushi/toml/.travis.yml create mode 100644 vendor/github.com/BurntSushi/toml/COMPATIBLE create mode 100644 vendor/github.com/BurntSushi/toml/COPYING create mode 100644 vendor/github.com/BurntSushi/toml/Makefile create mode 100644 vendor/github.com/BurntSushi/toml/README.md create mode 100644 vendor/github.com/BurntSushi/toml/decode.go create mode 100644 vendor/github.com/BurntSushi/toml/decode_meta.go create mode 100644 vendor/github.com/BurntSushi/toml/doc.go create mode 100644 vendor/github.com/BurntSushi/toml/encode.go create mode 100644 vendor/github.com/BurntSushi/toml/encoding_types.go create mode 100644 vendor/github.com/BurntSushi/toml/encoding_types_1.1.go create mode 100644 vendor/github.com/BurntSushi/toml/lex.go create mode 100644 vendor/github.com/BurntSushi/toml/parse.go create mode 100644 vendor/github.com/BurntSushi/toml/session.vim create mode 100644 vendor/github.com/BurntSushi/toml/type_check.go create mode 100644 vendor/github.com/BurntSushi/toml/type_fields.go create mode 100644 vendor/github.com/MichaelTJones/pcg/LICENSE create mode 100644 vendor/github.com/MichaelTJones/pcg/README.md create mode 100644 vendor/github.com/MichaelTJones/pcg/pcg32.go create mode 100644 vendor/github.com/MichaelTJones/pcg/pcg64.go create mode 100644 vendor/github.com/apache/thrift/LICENSE create mode 100644 vendor/github.com/apache/thrift/NOTICE create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/application_exception.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/binary_protocol.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/buffered_transport.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/compact_protocol.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/debug_protocol.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/deserializer.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/exception.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/field.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/framed_transport.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/http_client.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/iostream_transport.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/json_protocol.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/memory_buffer.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/messagetype.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/multiplexed_protocol.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/numeric.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/pointerize.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/processor.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/processor_factory.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/protocol.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/protocol_exception.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/protocol_factory.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/rich_transport.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/serializer.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/server.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/server_socket.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/server_transport.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/simple_json_protocol.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/simple_server.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/socket.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/ssl_server_socket.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/ssl_socket.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/transport.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/transport_exception.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/transport_factory.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/type.go create mode 100644 vendor/github.com/apache/thrift/lib/go/thrift/zlib_transport.go create mode 100644 vendor/github.com/beorn7/perks/LICENSE create mode 100644 vendor/github.com/beorn7/perks/quantile/exampledata.txt create mode 100644 vendor/github.com/beorn7/perks/quantile/stream.go create mode 100644 vendor/github.com/cespare/xxhash/v2/.travis.yml create mode 100644 vendor/github.com/cespare/xxhash/v2/LICENSE.txt create mode 100644 vendor/github.com/cespare/xxhash/v2/README.md create mode 100644 vendor/github.com/cespare/xxhash/v2/go.mod create mode 100644 vendor/github.com/cespare/xxhash/v2/go.sum create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_other.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_safe.go create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go rename vendor/{k8s.io/apimachinery => github.com/coreos/go-semver}/LICENSE (100%) create mode 100644 vendor/github.com/coreos/go-semver/NOTICE create mode 100644 vendor/github.com/coreos/go-semver/semver/semver.go create mode 100644 vendor/github.com/coreos/go-semver/semver/sort.go create mode 100644 vendor/github.com/coreos/go-systemd/LICENSE create mode 100644 vendor/github.com/coreos/go-systemd/NOTICE create mode 100644 vendor/github.com/coreos/go-systemd/journal/journal.go create mode 100644 vendor/github.com/coreos/pkg/LICENSE create mode 100644 vendor/github.com/coreos/pkg/NOTICE create mode 100644 vendor/github.com/coreos/pkg/capnslog/README.md create mode 100644 vendor/github.com/coreos/pkg/capnslog/formatters.go create mode 100644 vendor/github.com/coreos/pkg/capnslog/glog_formatter.go create mode 100644 vendor/github.com/coreos/pkg/capnslog/init.go create mode 100644 vendor/github.com/coreos/pkg/capnslog/init_windows.go create mode 100644 vendor/github.com/coreos/pkg/capnslog/journald_formatter.go create mode 100644 vendor/github.com/coreos/pkg/capnslog/log_hijack.go create mode 100644 vendor/github.com/coreos/pkg/capnslog/logmap.go create mode 100644 vendor/github.com/coreos/pkg/capnslog/pkg_logger.go create mode 100644 vendor/github.com/coreos/pkg/capnslog/syslog_formatter.go create mode 100644 vendor/github.com/edsrzf/mmap-go/.gitignore create mode 100644 vendor/github.com/edsrzf/mmap-go/LICENSE create mode 100644 vendor/github.com/edsrzf/mmap-go/README.md create mode 100644 vendor/github.com/edsrzf/mmap-go/mmap.go create mode 100644 vendor/github.com/edsrzf/mmap-go/mmap_unix.go create mode 100644 vendor/github.com/edsrzf/mmap-go/mmap_windows.go create mode 100644 vendor/github.com/gogo/protobuf/AUTHORS create mode 100644 vendor/github.com/gogo/protobuf/CONTRIBUTORS create mode 100644 vendor/github.com/gogo/protobuf/LICENSE create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/Makefile create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/doc.go create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.go create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.golden create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/gogo.proto create mode 100644 vendor/github.com/gogo/protobuf/gogoproto/helper.go create mode 100644 vendor/github.com/gogo/protobuf/proto/Makefile create mode 100644 vendor/github.com/gogo/protobuf/proto/clone.go create mode 100644 vendor/github.com/gogo/protobuf/proto/custom_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/decode.go create mode 100644 vendor/github.com/gogo/protobuf/proto/deprecated.go create mode 100644 vendor/github.com/gogo/protobuf/proto/discard.go create mode 100644 vendor/github.com/gogo/protobuf/proto/duration.go create mode 100644 vendor/github.com/gogo/protobuf/proto/duration_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/encode.go create mode 100644 vendor/github.com/gogo/protobuf/proto/encode_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/equal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/extensions.go create mode 100644 vendor/github.com/gogo/protobuf/proto/extensions_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/lib.go create mode 100644 vendor/github.com/gogo/protobuf/proto/lib_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/message_set.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go create mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/properties.go create mode 100644 vendor/github.com/gogo/protobuf/proto/properties_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/skip_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_marshal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_merge.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_unmarshal.go create mode 100644 vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/text_parser.go create mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp.go create mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/proto/wrappers.go create mode 100644 vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile create mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go create mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go create mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go create mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go create mode 100644 vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go create mode 100644 vendor/github.com/gogo/protobuf/types/any.go create mode 100644 vendor/github.com/gogo/protobuf/types/any.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/api.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/doc.go create mode 100644 vendor/github.com/gogo/protobuf/types/duration.go create mode 100644 vendor/github.com/gogo/protobuf/types/duration.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/duration_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/types/empty.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/field_mask.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/protosize.go create mode 100644 vendor/github.com/gogo/protobuf/types/source_context.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/struct.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/timestamp.go create mode 100644 vendor/github.com/gogo/protobuf/types/timestamp.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/timestamp_gogo.go create mode 100644 vendor/github.com/gogo/protobuf/types/type.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/wrappers.pb.go create mode 100644 vendor/github.com/gogo/protobuf/types/wrappers_gogo.go create mode 100644 vendor/github.com/golang/freetype/AUTHORS create mode 100644 vendor/github.com/golang/freetype/CONTRIBUTORS create mode 100644 vendor/github.com/golang/freetype/LICENSE create mode 100644 vendor/github.com/golang/freetype/README create mode 100644 vendor/github.com/golang/freetype/freetype.go create mode 100644 vendor/github.com/golang/freetype/raster/geom.go create mode 100644 vendor/github.com/golang/freetype/raster/paint.go create mode 100644 vendor/github.com/golang/freetype/raster/raster.go create mode 100644 vendor/github.com/golang/freetype/raster/stroke.go create mode 100644 vendor/github.com/golang/freetype/truetype/face.go create mode 100644 vendor/github.com/golang/freetype/truetype/glyph.go create mode 100644 vendor/github.com/golang/freetype/truetype/hint.go create mode 100644 vendor/github.com/golang/freetype/truetype/opcodes.go create mode 100644 vendor/github.com/golang/freetype/truetype/truetype.go create mode 100644 vendor/github.com/golang/mock/AUTHORS create mode 100644 vendor/github.com/golang/mock/CONTRIBUTORS create mode 100644 vendor/github.com/golang/mock/LICENSE create mode 100644 vendor/github.com/golang/mock/gomock/call.go create mode 100644 vendor/github.com/golang/mock/gomock/callset.go create mode 100644 vendor/github.com/golang/mock/gomock/controller.go create mode 100644 vendor/github.com/golang/mock/gomock/matchers.go create mode 100644 vendor/github.com/golang/protobuf/jsonpb/jsonpb.go create mode 100644 vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go create mode 100644 vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto create mode 100644 vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go create mode 100644 vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden create mode 100644 vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto create mode 100644 vendor/github.com/golang/protobuf/ptypes/any.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/any/any.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/any/any.proto create mode 100644 vendor/github.com/golang/protobuf/ptypes/doc.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/duration.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/duration/duration.proto create mode 100644 vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/empty/empty.proto create mode 100644 vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/struct/struct.proto create mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto create mode 100644 vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go create mode 100644 vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto create mode 100644 vendor/github.com/golang/snappy/go.mod delete mode 100644 vendor/github.com/gorilla/context/.travis.yml delete mode 100644 vendor/github.com/gorilla/context/README.md delete mode 100644 vendor/github.com/gorilla/context/context.go delete mode 100644 vendor/github.com/gorilla/context/doc.go delete mode 100644 vendor/github.com/gorilla/mux/.travis.yml create mode 100644 vendor/github.com/gorilla/mux/AUTHORS delete mode 100644 vendor/github.com/gorilla/mux/ISSUE_TEMPLATE.md rename vendor/github.com/gorilla/mux/{context_native.go => context.go} (82%) delete mode 100644 vendor/github.com/gorilla/mux/context_gorilla.go create mode 100644 vendor/github.com/gorilla/mux/go.mod create mode 100644 vendor/github.com/hydrogen18/stalecucumber/.gitignore create mode 100644 vendor/github.com/hydrogen18/stalecucumber/LICENSE create mode 100644 vendor/github.com/hydrogen18/stalecucumber/README.md create mode 100644 vendor/github.com/hydrogen18/stalecucumber/fuzz.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/helpers.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/jump_list.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/opcodes.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/pickle_machine.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/pickle_writer.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/populate_jump_list.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/protocol_0.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/protocol_1.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/protocol_2.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/python_types.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/tuple.go create mode 100644 vendor/github.com/hydrogen18/stalecucumber/unpack.go create mode 100644 vendor/github.com/jhump/protoreflect/LICENSE create mode 100644 vendor/github.com/jhump/protoreflect/codec/buffer.go create mode 100644 vendor/github.com/jhump/protoreflect/codec/decode.go create mode 100644 vendor/github.com/jhump/protoreflect/codec/decode_fields.go create mode 100644 vendor/github.com/jhump/protoreflect/codec/doc.go create mode 100644 vendor/github.com/jhump/protoreflect/codec/encode.go create mode 100644 vendor/github.com/jhump/protoreflect/codec/encode_fields.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/convert.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/descriptor.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/descriptor_no_unsafe.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/descriptor_unsafe.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/doc.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/imports.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/internal/source_info.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/internal/util.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/load.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/.gitignore create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/descriptor_protos.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/doc.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/errors.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/lexer.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/linker.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/options.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/parser.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/proto.y create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/proto.y.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/resolve_files.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/source_code_info.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/std_imports.go create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/test-source-info.txt create mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/validate.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/binary.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/doc.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/dynamic_message.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/equal.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/extension.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/extension_registry.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/indent.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/json.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/maps_1.11.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/maps_1.12.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/merge.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/message_factory.go create mode 100644 vendor/github.com/jhump/protoreflect/dynamic/text.go create mode 100644 vendor/github.com/jhump/protoreflect/internal/standard_files.go create mode 100644 vendor/github.com/jhump/protoreflect/internal/unrecognized.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb/collector.pb.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb/collector.proto create mode 100644 vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb/lightstep.pb.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb/lightstep.proto create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/.gitignore create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/.gitmodules create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/CHANGELOG.md create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/Gopkg.lock create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/Gopkg.toml create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/LICENSE create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/Makefile create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/README.md create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/VERSION create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/collector_client.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/collector_client_custom.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/collector_client_grpc.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/collector_client_http.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/event_handlers.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/events.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/go.mod create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/go.sum create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/locked_rand.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/num_gen.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/pool.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/meta_events.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/options.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/propagation.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/propagation_b3.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/propagation_binary.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/propagation_lightstep.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/propagation_stack.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/propagation_text.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/proto_converter.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/proto_logencoder.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/raw_span.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/report_buffer.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/span.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/tag_version.sh create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/tracer.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/tracer_0_14.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/tracer_helpers.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/util.go create mode 100644 vendor/github.com/lightstep/lightstep-tracer-go/version.go create mode 100644 vendor/github.com/m3db/m3/LICENSE create mode 100644 vendor/github.com/m3db/m3/NOTICES.txt create mode 100644 vendor/github.com/m3db/m3/src/cluster/client/client.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/client/client_mock.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/client/etcd/client.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/client/etcd/config.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/client/etcd/options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/client/etcd/types.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/manager.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/types.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.pb.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.proto create mode 100644 vendor/github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.pb.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.proto create mode 100644 vendor/github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.pb.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.proto create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/config.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/etcd/options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/etcd/store.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/kv_mock.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/mem/store.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/op.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/store.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/types.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/util/atomic.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/util/lock.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/util/runtime/options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/util/runtime/value.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/util/types.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/kv/util/util.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/algo/algo.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/algo/mirrored.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/algo/non_sharded.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/algo/sharded.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/algo/sharded_helper.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/config.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/placement.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/placement_mock.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/selector/common.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/selector/mirrored.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/selector/mirrored_custom_groups.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/selector/non_mirrored.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/selector/selector.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/service/operator.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/service/service.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/staged_placement.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_watcher.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_watcher_options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/storage/helper.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/storage/storage.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/storage/watch.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/placement/types.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/config.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/heartbeat/etcd/options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/heartbeat/etcd/store.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/leader/campaign/state.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/leader/campaign/state_string.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/leader/client.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/leader/doc.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/leader/election/client.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/leader/election/options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/leader/options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/leader/service.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/options.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/services.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/services_mock.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/types.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/util.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/services/watch.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/shard/shard.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/shard/state_string.go create mode 100644 vendor/github.com/m3db/m3/src/cluster/shard/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/README.md create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/aggregate_attempt.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/aggregate_op.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/aggregate_tags_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/calc_transport.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/client.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/client_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/config.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/connection_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/consistency_level.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/errors.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/fetch_attempt.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch_element_array_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/fetch_state.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/fetch_state_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_attempt.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_op.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_results_accumulator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_results_index_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/host_queue.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/iterator_matcher.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/op.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/op_array_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/peer.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/rc.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/reader_slice_of_slices_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/reader_slice_of_slices_iterator_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/received_blocks_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/received_blocks_new_map.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/replicated_session.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/session.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/session_pools.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/truncate.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/write_attempt.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/write_batch_element_array_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/write_batch_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/write_batch_tagged_element_array_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/write_batch_tagged_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/write_op.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/write_state.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/client/write_tagged_op.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/clock/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/clock/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/digest/README.md create mode 100644 vendor/github.com/m3db/m3/src/dbnode/digest/buffer.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/digest/digest.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/digest/digest_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/digest/fd_digest.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/digest/reader.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/digest/test_util.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/digest/writer.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/encoder_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/encoding.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/encoding_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/istream.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/iterator_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/iterators.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/iterators_types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/decoder.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/encoder.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/float_encoder_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/int_sig_bits_tracker.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/m3tsz.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/timestamp_encoder.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/timestamp_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/multi_reader_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/multi_reader_iterator_array_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/mutable_series_iterators_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/null.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/ostream.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/proto/buffer_decode.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/proto/buffer_encode.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/proto/common.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/proto/custom_marshal.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/proto/custom_unmarshal.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/proto/encoder.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/proto/equal.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/proto/int_encoder_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/proto/iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/proto/parse_schema.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/scheme.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator_accumulator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterators.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/encoding/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/environment/config.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.pb.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.proto create mode 100644 vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.pb.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.proto create mode 100644 vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/GoUnusedProtection__.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc-consts.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/tchan-rpc.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/kvconfig/keys.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/aggregation.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/config.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/context.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/convert.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/dynamic.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/dynamic_options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/index_options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/map.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/metadata.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_matcher.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_new_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_runtime_options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_watch.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/schema.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/schema_registry.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/schema_registry_updater.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/static.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/utils.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/namespace/watch.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/convert/convert.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/errors/errors.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/node/channel/channel.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/persist/persist_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/persist/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/ratelimit/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/ratelimit/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/retention/config.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/retention/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/retention/retention_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/retention/times.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/retention/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_options_manager.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/runtime/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/sharding/shardset.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/sharding/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/block.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/block_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/block_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/lease.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/lease_noop.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/merged_block_reader.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/metadata.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/result.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/result_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_manager.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_new_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/block/wired_list.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/new_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/result_data.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/result_index.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/shard_ranges.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/README.md create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_entry_arraypool_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_new_map.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_new_map.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregated_term_filter.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/allocator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/block.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/compactor.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/plan.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/convert/convert.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/fields_terms_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/filter_fields_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/index_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/mutable_segments.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/postings_list_cache.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/postings_list_cache_lru.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/query_matcher.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/read_through_segment.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/results.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/results_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/results_new_map.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/results_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/segments.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/segments/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/index/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/limits/noop_query_limits.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/limits/query_limits.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/limits/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/README.md create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/buffer.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/buffer_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/policy.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/reader.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/series.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/series_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/series_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/truncate_type.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/storage/series/util.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/topology/consistency_level.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/topology/dynamic.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/topology/host.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/topology/map.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/topology/options.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/topology/static.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/topology/topology_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/topology/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/tracepoint/tracepoint.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/ts/segment.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/ts/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/x/xio/block_reader.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/x/xio/io_mock.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/x/xio/null.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/x/xio/reader_slice_of_slices_from_block_readers_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/x/xio/segment_reader.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/x/xio/segment_reader_pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/x/xio/types.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/x/xpool/pool.go create mode 100644 vendor/github.com/m3db/m3/src/dbnode/x/xpool/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/doc/doc_arraypool_gen.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/doc/doc_mock.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/doc/document.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/doc/document_matcher.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/doc/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.pb.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.proto create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.pb.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.proto create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/idx/codec.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/idx/query.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/idx/query_matcher.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/idx/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/batch.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/batch_matcher.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/index_mock.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/iterator.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/regexp.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/builder.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/bytes_slice_iter.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/fields_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/fields_map_new.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/ids_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/ids_map_new.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_builder.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_field_iter.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_field_postings_list_iter.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_multi_key_iter.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_multi_key_postings_list_iter.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_terms_iter.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/options.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/postings_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/postings_map_new.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/sharded_fields_map.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/terms.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/terms_iter.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/empty.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/README.md create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/docs_writer.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/README.md create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/data.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/index.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/slice.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/encoding.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_mock.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_terms_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_terms_postings_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_writer.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/options.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/regexp/regexp.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/segment.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/utils.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/writer.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/bytes_slice_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/concurrent_postings_map.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/fields_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/fields_map_new.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/ids_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/ids_map_new.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/iterator.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/mem_mock.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/merge.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/options.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/postings_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/postings_map_new.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/reader.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/segment.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/terms_dict.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/terms_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/unique_fields_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/segment_mock.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/segment/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/index/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/persist/persist_mock.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/persist/reader.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/persist/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/persist/writer.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/postings/atomic.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/postings/pilosa/codec.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/postings/pilosa/iterator.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/postings/pool.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/postings/postings_mock.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/postings/range_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/postings/roaring/roaring.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/postings/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/executor/executor.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/executor/iterator.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/query/all.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/query/codec.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/query/conjunction.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/query/disjunction.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/query/field.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/query/negation.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/query/regexp.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/query/term.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/query/util.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/search_mock.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/searcher/all.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/searcher/conjunction.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/searcher/disjunction.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/searcher/empty.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/searcher/errors.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/searcher/field.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/searcher/negation.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/searcher/regexp.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/searcher/term.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/search/types.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/util/docs.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/util/uuid.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/x/bytes/slice_arraypool_gen.go create mode 100644 vendor/github.com/m3db/m3/src/m3ninx/x/safe_closer.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/aggregation/id.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/aggregation/id_compress.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/aggregation/type.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/aggregation/type_config.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/aggregation/type_string.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/aggregation/types_options.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/aggregation/types_pool.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.pb.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.proto create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.pb.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.proto create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.pb.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.proto create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.pb.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.proto create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.pb.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.proto create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.pb.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.proto create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.pb.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.proto create mode 100644 vendor/github.com/m3db/m3/src/metrics/metric/id/id.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/metric/id/id_mock.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/metric/id/tag.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/metric/types.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/policy/drop_policy.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/policy/policy.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/policy/pool.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/policy/resolution.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/policy/retention.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/policy/staged_policy.go create mode 100644 vendor/github.com/m3db/m3/src/metrics/policy/storage_policy.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/accounted.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/block_mock.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/column.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/container.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/empty.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/info.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/lazy.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/meta.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/options.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/scalar.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/series.go create mode 100644 vendor/github.com/m3db/m3/src/query/block/types.go create mode 100644 vendor/github.com/m3db/m3/src/query/cost/cost.go create mode 100644 vendor/github.com/m3db/m3/src/query/cost/cost_mock.go create mode 100644 vendor/github.com/m3db/m3/src/query/graphite/errors/errors.go create mode 100644 vendor/github.com/m3db/m3/src/query/graphite/graphite/glob.go create mode 100644 vendor/github.com/m3db/m3/src/query/graphite/graphite/graphite_types.go create mode 100644 vendor/github.com/m3db/m3/src/query/graphite/graphite/identify.go create mode 100644 vendor/github.com/m3db/m3/src/query/graphite/graphite/tags.go create mode 100644 vendor/github.com/m3db/m3/src/query/graphite/graphite/timespec.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/block_type.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/bounds.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/config.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/matcher.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/options.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/params.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/query_context.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/strconv/checker.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/strconv/quote.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/tags.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/tags_id_schemes.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/types.go create mode 100644 vendor/github.com/m3db/m3/src/query/models/unsafe.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/complete_tags_result.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/completed_tags.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/convert.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/fetch_result_map_gen.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/fetch_result_map_wrapper.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/filter.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/id_dedupe_map.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/match_type.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/multi_fetch_result.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/series_fetch_result.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/tag_dedupe_map.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/types.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/storagemetadata/config.go create mode 100644 vendor/github.com/m3db/m3/src/query/storage/m3/storagemetadata/types.go create mode 100644 vendor/github.com/m3db/m3/src/query/ts/metadata.go create mode 100644 vendor/github.com/m3db/m3/src/query/ts/series.go create mode 100644 vendor/github.com/m3db/m3/src/query/ts/ts_mock.go create mode 100644 vendor/github.com/m3db/m3/src/query/ts/values.go create mode 100644 vendor/github.com/m3db/m3/src/query/util/memset.go create mode 100644 vendor/github.com/m3db/m3/src/query/util/strings.go create mode 100644 vendor/github.com/m3db/m3/src/query/util/timing.go create mode 100644 vendor/github.com/m3db/m3/src/query/util/writer/int_writer.go create mode 100644 vendor/github.com/m3db/m3/src/x/checked/bytes.go create mode 100644 vendor/github.com/m3db/m3/src/x/checked/checked_mock.go create mode 100644 vendor/github.com/m3db/m3/src/x/checked/debug.go create mode 100644 vendor/github.com/m3db/m3/src/x/checked/ref.go create mode 100644 vendor/github.com/m3db/m3/src/x/checked/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/clock/config.go create mode 100644 vendor/github.com/m3db/m3/src/x/clock/options.go create mode 100644 vendor/github.com/m3db/m3/src/x/clock/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/close/close.go create mode 100644 vendor/github.com/m3db/m3/src/x/context/cancel.go create mode 100644 vendor/github.com/m3db/m3/src/x/context/context.go create mode 100644 vendor/github.com/m3db/m3/src/x/context/finalizeable_list_gen.go create mode 100644 vendor/github.com/m3db/m3/src/x/context/options.go create mode 100644 vendor/github.com/m3db/m3/src/x/context/pool.go create mode 100644 vendor/github.com/m3db/m3/src/x/context/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/cost/enforcer.go create mode 100644 vendor/github.com/m3db/m3/src/x/cost/limit_manager.go create mode 100644 vendor/github.com/m3db/m3/src/x/cost/options.go create mode 100644 vendor/github.com/m3db/m3/src/x/cost/tracker.go create mode 100644 vendor/github.com/m3db/m3/src/x/cost/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/errors/errors.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/bytes_id.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/id_matcher.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/ident_mock.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/identifier.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/identifier_pool.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/iterator.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/tag.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/tag_arraypool_gen.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/tag_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/tag_iterator_matcher.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/tag_matcher.go create mode 100644 vendor/github.com/m3db/m3/src/x/ident/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/build.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/config.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/config_prometheus.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/extended.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/invariant.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/logging.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/methods.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/options.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/process.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/prom_process_collector.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/reporter.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/sanitize.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/string_list_emitter.go create mode 100644 vendor/github.com/m3db/m3/src/x/instrument/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/mmap/mmap.go create mode 100644 vendor/github.com/m3db/m3/src/x/mmap/mmap_linux.go create mode 100644 vendor/github.com/m3db/m3/src/x/mmap/mmap_other.go create mode 100644 vendor/github.com/m3db/m3/src/x/opentracing/context.go create mode 100644 vendor/github.com/m3db/m3/src/x/opentracing/tracing.go create mode 100644 vendor/github.com/m3db/m3/src/x/pool/bucketized.go create mode 100644 vendor/github.com/m3db/m3/src/x/pool/bytes.go create mode 100644 vendor/github.com/m3db/m3/src/x/pool/checked_bytes.go create mode 100644 vendor/github.com/m3db/m3/src/x/pool/config.go create mode 100644 vendor/github.com/m3db/m3/src/x/pool/floats.go create mode 100644 vendor/github.com/m3db/m3/src/x/pool/object.go create mode 100644 vendor/github.com/m3db/m3/src/x/pool/options.go create mode 100644 vendor/github.com/m3db/m3/src/x/pool/pool_mock.go create mode 100644 vendor/github.com/m3db/m3/src/x/pool/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/process/count_dirent_linux.go create mode 100644 vendor/github.com/m3db/m3/src/x/process/process_linux.go create mode 100644 vendor/github.com/m3db/m3/src/x/process/process_notlinux.go create mode 100644 vendor/github.com/m3db/m3/src/x/resource/lifetime.go create mode 100644 vendor/github.com/m3db/m3/src/x/resource/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/retry/config.go create mode 100644 vendor/github.com/m3db/m3/src/x/retry/options.go create mode 100644 vendor/github.com/m3db/m3/src/x/retry/retry.go create mode 100644 vendor/github.com/m3db/m3/src/x/retry/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/sampler/sampler.go create mode 100644 vendor/github.com/m3db/m3/src/x/serialize/decoder.go create mode 100644 vendor/github.com/m3db/m3/src/x/serialize/decoder_options.go create mode 100644 vendor/github.com/m3db/m3/src/x/serialize/decoder_pool.go create mode 100644 vendor/github.com/m3db/m3/src/x/serialize/encoder.go create mode 100644 vendor/github.com/m3db/m3/src/x/serialize/encoder_options.go create mode 100644 vendor/github.com/m3db/m3/src/x/serialize/encoder_pool.go create mode 100644 vendor/github.com/m3db/m3/src/x/serialize/limits.go create mode 100644 vendor/github.com/m3db/m3/src/x/serialize/metric_tags_iterator.go create mode 100644 vendor/github.com/m3db/m3/src/x/serialize/serialize_mock.go create mode 100644 vendor/github.com/m3db/m3/src/x/serialize/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/sync/cpu_linux_amd64.go create mode 100644 vendor/github.com/m3db/m3/src/x/sync/cpu_linux_amd64.s create mode 100644 vendor/github.com/m3db/m3/src/x/sync/cpu_supported_arch_unsupported_os.go create mode 100644 vendor/github.com/m3db/m3/src/x/sync/cpu_unsupported_arch_supported_os.go create mode 100644 vendor/github.com/m3db/m3/src/x/sync/cpu_unsupported_arch_unsupported_os.go create mode 100644 vendor/github.com/m3db/m3/src/x/sync/index_cpu.go create mode 100644 vendor/github.com/m3db/m3/src/x/sync/options.go create mode 100644 vendor/github.com/m3db/m3/src/x/sync/pooled_worker_pool.go create mode 100644 vendor/github.com/m3db/m3/src/x/sync/types.go create mode 100644 vendor/github.com/m3db/m3/src/x/sync/worker_pool.go create mode 100644 vendor/github.com/m3db/m3/src/x/time/duration.go create mode 100644 vendor/github.com/m3db/m3/src/x/time/matcher.go create mode 100644 vendor/github.com/m3db/m3/src/x/time/range.go create mode 100644 vendor/github.com/m3db/m3/src/x/time/range_iter.go create mode 100644 vendor/github.com/m3db/m3/src/x/time/ranges.go create mode 100644 vendor/github.com/m3db/m3/src/x/time/time.go create mode 100644 vendor/github.com/m3db/m3/src/x/time/unit.go create mode 100644 vendor/github.com/m3db/m3/src/x/time/unix_nano.go create mode 100644 vendor/github.com/m3db/m3/src/x/unsafe/bytes.go create mode 100644 vendor/github.com/m3db/m3/src/x/unsafe/rand.go create mode 100644 vendor/github.com/m3db/m3/src/x/unsafe/string.go create mode 100644 vendor/github.com/m3db/m3/src/x/watch/options.go create mode 100644 vendor/github.com/m3db/m3/src/x/watch/source.go create mode 100644 vendor/github.com/m3db/m3/src/x/watch/value.go create mode 100644 vendor/github.com/m3db/m3/src/x/watch/watch.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/AUTHORS.md create mode 100644 vendor/github.com/m3db/prometheus_client_golang/LICENSE create mode 100644 vendor/github.com/m3db/prometheus_client_golang/NOTICE create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/.gitignore create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/README.md create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/collector.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/counter.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/desc.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/doc.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/expvar_collector.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/fnv.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/gauge.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/go_collector.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/histogram.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/http.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/metric.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/process_collector.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/promhttp/http.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/registry.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/summary.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/untyped.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/value.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/vec.go create mode 100644 vendor/github.com/m3db/prometheus_client_model/AUTHORS.md create mode 100644 vendor/github.com/m3db/prometheus_client_model/LICENSE create mode 100644 vendor/github.com/m3db/prometheus_client_model/NOTICE create mode 100644 vendor/github.com/m3db/prometheus_client_model/go/metrics.pb.go create mode 100644 vendor/github.com/m3db/prometheus_common/AUTHORS.md create mode 100644 vendor/github.com/m3db/prometheus_common/LICENSE create mode 100644 vendor/github.com/m3db/prometheus_common/NOTICE create mode 100644 vendor/github.com/m3db/prometheus_common/expfmt/decode.go create mode 100644 vendor/github.com/m3db/prometheus_common/expfmt/encode.go create mode 100644 vendor/github.com/m3db/prometheus_common/expfmt/expfmt.go create mode 100644 vendor/github.com/m3db/prometheus_common/expfmt/fuzz.go create mode 100644 vendor/github.com/m3db/prometheus_common/expfmt/text_create.go create mode 100644 vendor/github.com/m3db/prometheus_common/expfmt/text_parse.go create mode 100644 vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/README.txt create mode 100644 vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/autoneg.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/alert.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/fingerprinting.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/fnv.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/labels.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/labelset.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/metric.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/model.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/signature.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/silence.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/time.go create mode 100644 vendor/github.com/m3db/prometheus_common/model/value.go create mode 100644 vendor/github.com/m3db/prometheus_procfs/.travis.yml create mode 100644 vendor/github.com/m3db/prometheus_procfs/AUTHORS.md create mode 100644 vendor/github.com/m3db/prometheus_procfs/CONTRIBUTING.md create mode 100644 vendor/github.com/m3db/prometheus_procfs/LICENSE create mode 100644 vendor/github.com/m3db/prometheus_procfs/Makefile create mode 100644 vendor/github.com/m3db/prometheus_procfs/NOTICE create mode 100644 vendor/github.com/m3db/prometheus_procfs/README.md create mode 100644 vendor/github.com/m3db/prometheus_procfs/doc.go create mode 100644 vendor/github.com/m3db/prometheus_procfs/fs.go create mode 100644 vendor/github.com/m3db/prometheus_procfs/ipvs.go create mode 100644 vendor/github.com/m3db/prometheus_procfs/mdstat.go create mode 100644 vendor/github.com/m3db/prometheus_procfs/mountstats.go create mode 100644 vendor/github.com/m3db/prometheus_procfs/proc.go create mode 100644 vendor/github.com/m3db/prometheus_procfs/proc_io.go create mode 100644 vendor/github.com/m3db/prometheus_procfs/proc_limits.go create mode 100644 vendor/github.com/m3db/prometheus_procfs/proc_stat.go create mode 100644 vendor/github.com/m3db/prometheus_procfs/stat.go create mode 100644 vendor/github.com/m3db/stackadler32/.gitignore create mode 100644 vendor/github.com/m3db/stackadler32/LICENSE create mode 100644 vendor/github.com/m3db/stackadler32/Readme.md create mode 100644 vendor/github.com/m3db/stackadler32/adler32.go create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/.gitignore create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/LICENSE create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/README.md create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/go.mod create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/go.sum create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/murmur.go create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/murmur128.go create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/murmur128_amd64.s create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/murmur128_decl.go create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/murmur128_gen.go create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/murmur32.go create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/murmur32_gen.go create mode 100644 vendor/github.com/m3db/stackmurmur3/v2/murmur64.go create mode 100644 vendor/github.com/m3dbx/pilosa/LICENSE create mode 100644 vendor/github.com/m3dbx/pilosa/NOTICE create mode 100644 vendor/github.com/m3dbx/pilosa/logger/logger.go create mode 100644 vendor/github.com/m3dbx/pilosa/roaring/containers.go create mode 100644 vendor/github.com/m3dbx/pilosa/roaring/roaring.go create mode 100644 vendor/github.com/m3dbx/pilosa/roaring/roaring_nop_stats.go create mode 100644 vendor/github.com/m3dbx/pilosa/roaring/roaring_stats.go create mode 100644 vendor/github.com/m3dbx/pilosa/stats/stats.go create mode 100644 vendor/github.com/m3dbx/vellum/.travis.yml create mode 100644 vendor/github.com/m3dbx/vellum/CONTRIBUTING.md create mode 100644 vendor/github.com/m3dbx/vellum/LICENSE create mode 100644 vendor/github.com/m3dbx/vellum/README.md create mode 100644 vendor/github.com/m3dbx/vellum/automaton.go create mode 100644 vendor/github.com/m3dbx/vellum/builder.go create mode 100644 vendor/github.com/m3dbx/vellum/common.go create mode 100644 vendor/github.com/m3dbx/vellum/decoder_v1.go create mode 100644 vendor/github.com/m3dbx/vellum/encoder_v1.go create mode 100644 vendor/github.com/m3dbx/vellum/encoding.go create mode 100644 vendor/github.com/m3dbx/vellum/fst.go create mode 100644 vendor/github.com/m3dbx/vellum/fst_iterator.go create mode 100644 vendor/github.com/m3dbx/vellum/merge_iterator.go create mode 100644 vendor/github.com/m3dbx/vellum/pack.go create mode 100644 vendor/github.com/m3dbx/vellum/regexp/compile.go create mode 100644 vendor/github.com/m3dbx/vellum/regexp/dfa.go create mode 100644 vendor/github.com/m3dbx/vellum/regexp/inst.go create mode 100644 vendor/github.com/m3dbx/vellum/regexp/regexp.go create mode 100644 vendor/github.com/m3dbx/vellum/regexp/sparse.go create mode 100644 vendor/github.com/m3dbx/vellum/registry.go create mode 100644 vendor/github.com/m3dbx/vellum/transducer.go create mode 100644 vendor/github.com/m3dbx/vellum/utf8/utf8.go create mode 100644 vendor/github.com/m3dbx/vellum/vellum.go create mode 100644 vendor/github.com/m3dbx/vellum/vellum_mmap.go create mode 100644 vendor/github.com/m3dbx/vellum/vellum_nommap.go create mode 100644 vendor/github.com/m3dbx/vellum/writer.go rename vendor/github.com/magiconair/properties/{LICENSE => LICENSE.md} (84%) create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go create mode 100644 vendor/github.com/mojocn/base64Captcha/.gitignore create mode 100644 vendor/github.com/mojocn/base64Captcha/CODE_OF_CONDUCT.md rename vendor/{gopkg.in/yaml.v3/NOTICE => github.com/mojocn/base64Captcha/LICENSE} (87%) create mode 100644 vendor/github.com/mojocn/base64Captcha/README.md create mode 100644 vendor/github.com/mojocn/base64Captcha/bindata.go create mode 100644 vendor/github.com/mojocn/base64Captcha/captcha.go create mode 100644 vendor/github.com/mojocn/base64Captcha/const.go create mode 100644 vendor/github.com/mojocn/base64Captcha/driver_audio.go create mode 100644 vendor/github.com/mojocn/base64Captcha/driver_chinese.go create mode 100644 vendor/github.com/mojocn/base64Captcha/driver_digit.go create mode 100644 vendor/github.com/mojocn/base64Captcha/driver_language.go create mode 100644 vendor/github.com/mojocn/base64Captcha/driver_math.go create mode 100644 vendor/github.com/mojocn/base64Captcha/driver_string.go create mode 100644 vendor/github.com/mojocn/base64Captcha/fonts.go create mode 100644 vendor/github.com/mojocn/base64Captcha/go.mod create mode 100644 vendor/github.com/mojocn/base64Captcha/go.sum create mode 100644 vendor/github.com/mojocn/base64Captcha/interface_driver.go create mode 100644 vendor/github.com/mojocn/base64Captcha/interface_item.go create mode 100644 vendor/github.com/mojocn/base64Captcha/interface_store.go create mode 100644 vendor/github.com/mojocn/base64Captcha/item_audio.go create mode 100644 vendor/github.com/mojocn/base64Captcha/item_char.go create mode 100644 vendor/github.com/mojocn/base64Captcha/item_digit.go create mode 100644 vendor/github.com/mojocn/base64Captcha/main.go.md create mode 100644 vendor/github.com/mojocn/base64Captcha/random_math.go create mode 100644 vendor/github.com/mojocn/base64Captcha/sounds.go create mode 100644 vendor/github.com/mojocn/base64Captcha/store_memory.go create mode 100644 vendor/github.com/mojocn/base64Captcha/store_memory_default.go create mode 100644 vendor/github.com/mojocn/base64Captcha/util.go create mode 100644 vendor/github.com/mojocn/base64Captcha/util_audio.go create mode 100644 vendor/github.com/opentracing/opentracing-go/.gitignore create mode 100644 vendor/github.com/opentracing/opentracing-go/.travis.yml create mode 100644 vendor/github.com/opentracing/opentracing-go/CHANGELOG.md create mode 100644 vendor/github.com/opentracing/opentracing-go/LICENSE create mode 100644 vendor/github.com/opentracing/opentracing-go/Makefile create mode 100644 vendor/github.com/opentracing/opentracing-go/README.md create mode 100644 vendor/github.com/opentracing/opentracing-go/ext.go create mode 100644 vendor/github.com/opentracing/opentracing-go/ext/field.go create mode 100644 vendor/github.com/opentracing/opentracing-go/ext/tags.go create mode 100644 vendor/github.com/opentracing/opentracing-go/globaltracer.go create mode 100644 vendor/github.com/opentracing/opentracing-go/go.mod create mode 100644 vendor/github.com/opentracing/opentracing-go/go.sum create mode 100644 vendor/github.com/opentracing/opentracing-go/gocontext.go create mode 100644 vendor/github.com/opentracing/opentracing-go/log/field.go create mode 100644 vendor/github.com/opentracing/opentracing-go/log/util.go create mode 100644 vendor/github.com/opentracing/opentracing-go/mocktracer/mocklogrecord.go create mode 100644 vendor/github.com/opentracing/opentracing-go/mocktracer/mockspan.go create mode 100644 vendor/github.com/opentracing/opentracing-go/mocktracer/mocktracer.go create mode 100644 vendor/github.com/opentracing/opentracing-go/mocktracer/propagation.go create mode 100644 vendor/github.com/opentracing/opentracing-go/noop.go create mode 100644 vendor/github.com/opentracing/opentracing-go/propagation.go create mode 100644 vendor/github.com/opentracing/opentracing-go/span.go create mode 100644 vendor/github.com/opentracing/opentracing-go/tracer.go create mode 100644 vendor/github.com/pborman/uuid/.travis.yml create mode 100644 vendor/github.com/pborman/uuid/CONTRIBUTING.md create mode 100644 vendor/github.com/pborman/uuid/CONTRIBUTORS create mode 100644 vendor/github.com/pborman/uuid/LICENSE create mode 100644 vendor/github.com/pborman/uuid/README.md create mode 100644 vendor/github.com/pborman/uuid/dce.go create mode 100644 vendor/github.com/pborman/uuid/doc.go create mode 100644 vendor/github.com/pborman/uuid/go.mod create mode 100644 vendor/github.com/pborman/uuid/go.sum create mode 100644 vendor/github.com/pborman/uuid/hash.go create mode 100644 vendor/github.com/pborman/uuid/marshal.go create mode 100644 vendor/github.com/pborman/uuid/node.go create mode 100644 vendor/github.com/pborman/uuid/sql.go create mode 100644 vendor/github.com/pborman/uuid/time.go create mode 100644 vendor/github.com/pborman/uuid/util.go create mode 100644 vendor/github.com/pborman/uuid/uuid.go create mode 100644 vendor/github.com/pborman/uuid/version1.go create mode 100644 vendor/github.com/pborman/uuid/version4.go create mode 100644 vendor/github.com/pelletier/go-toml/.dockerignore delete mode 100644 vendor/github.com/pelletier/go-toml/.travis.yml create mode 100644 vendor/github.com/pelletier/go-toml/CONTRIBUTING.md create mode 100644 vendor/github.com/pelletier/go-toml/Dockerfile create mode 100644 vendor/github.com/pelletier/go-toml/PULL_REQUEST_TEMPLATE.md create mode 100644 vendor/github.com/pelletier/go-toml/azure-pipelines.yml create mode 100644 vendor/github.com/pelletier/go-toml/fuzzit.sh create mode 100644 vendor/github.com/pelletier/go-toml/go.mod create mode 100644 vendor/github.com/pelletier/go-toml/go.sum create mode 100644 vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml delete mode 100644 vendor/github.com/pelletier/go-toml/test.sh create mode 100644 vendor/github.com/pkg/errors/.gitignore create mode 100644 vendor/github.com/pkg/errors/.travis.yml create mode 100644 vendor/github.com/pkg/errors/LICENSE create mode 100644 vendor/github.com/pkg/errors/Makefile create mode 100644 vendor/github.com/pkg/errors/README.md create mode 100644 vendor/github.com/pkg/errors/appveyor.yml create mode 100644 vendor/github.com/pkg/errors/errors.go create mode 100644 vendor/github.com/pkg/errors/go113.go create mode 100644 vendor/github.com/pkg/errors/stack.go create mode 100644 vendor/github.com/prometheus/client_golang/LICENSE create mode 100644 vendor/github.com/prometheus/client_golang/NOTICE create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/.gitignore create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/README.md create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/build_info.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/counter.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/desc.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/doc.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/fnv.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/gauge.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/go_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/histogram.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/labels.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/metric.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/observer.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/registry.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/summary.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/timer.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/untyped.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/value.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/vec.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/wrap.go create mode 100644 vendor/github.com/prometheus/client_model/LICENSE create mode 100644 vendor/github.com/prometheus/client_model/NOTICE create mode 100644 vendor/github.com/prometheus/client_model/go/metrics.pb.go create mode 100644 vendor/github.com/prometheus/common/LICENSE create mode 100644 vendor/github.com/prometheus/common/NOTICE create mode 100644 vendor/github.com/prometheus/common/expfmt/decode.go create mode 100644 vendor/github.com/prometheus/common/expfmt/encode.go create mode 100644 vendor/github.com/prometheus/common/expfmt/expfmt.go create mode 100644 vendor/github.com/prometheus/common/expfmt/fuzz.go create mode 100644 vendor/github.com/prometheus/common/expfmt/openmetrics_create.go create mode 100644 vendor/github.com/prometheus/common/expfmt/text_create.go create mode 100644 vendor/github.com/prometheus/common/expfmt/text_parse.go create mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt create mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go create mode 100644 vendor/github.com/prometheus/common/model/alert.go create mode 100644 vendor/github.com/prometheus/common/model/fingerprinting.go create mode 100644 vendor/github.com/prometheus/common/model/fnv.go create mode 100644 vendor/github.com/prometheus/common/model/labels.go create mode 100644 vendor/github.com/prometheus/common/model/labelset.go create mode 100644 vendor/github.com/prometheus/common/model/metric.go create mode 100644 vendor/github.com/prometheus/common/model/model.go create mode 100644 vendor/github.com/prometheus/common/model/signature.go create mode 100644 vendor/github.com/prometheus/common/model/silence.go create mode 100644 vendor/github.com/prometheus/common/model/time.go create mode 100644 vendor/github.com/prometheus/common/model/value.go create mode 100644 vendor/github.com/prometheus/procfs/.gitignore create mode 100644 vendor/github.com/prometheus/procfs/.golangci.yml create mode 100644 vendor/github.com/prometheus/procfs/CONTRIBUTING.md create mode 100644 vendor/github.com/prometheus/procfs/LICENSE create mode 100644 vendor/github.com/prometheus/procfs/MAINTAINERS.md create mode 100644 vendor/github.com/prometheus/procfs/Makefile create mode 100644 vendor/github.com/prometheus/procfs/Makefile.common create mode 100644 vendor/github.com/prometheus/procfs/NOTICE create mode 100644 vendor/github.com/prometheus/procfs/README.md create mode 100644 vendor/github.com/prometheus/procfs/arp.go create mode 100644 vendor/github.com/prometheus/procfs/buddyinfo.go create mode 100644 vendor/github.com/prometheus/procfs/cpuinfo.go create mode 100644 vendor/github.com/prometheus/procfs/crypto.go create mode 100644 vendor/github.com/prometheus/procfs/doc.go create mode 100644 vendor/github.com/prometheus/procfs/fixtures.ttar create mode 100644 vendor/github.com/prometheus/procfs/fs.go create mode 100644 vendor/github.com/prometheus/procfs/go.mod create mode 100644 vendor/github.com/prometheus/procfs/go.sum create mode 100644 vendor/github.com/prometheus/procfs/internal/fs/fs.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/parse.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/readfile.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/valueparser.go create mode 100644 vendor/github.com/prometheus/procfs/ipvs.go create mode 100644 vendor/github.com/prometheus/procfs/mdstat.go create mode 100644 vendor/github.com/prometheus/procfs/meminfo.go create mode 100644 vendor/github.com/prometheus/procfs/mountinfo.go create mode 100644 vendor/github.com/prometheus/procfs/mountstats.go create mode 100644 vendor/github.com/prometheus/procfs/net_dev.go create mode 100644 vendor/github.com/prometheus/procfs/net_sockstat.go create mode 100644 vendor/github.com/prometheus/procfs/net_softnet.go create mode 100644 vendor/github.com/prometheus/procfs/net_unix.go create mode 100644 vendor/github.com/prometheus/procfs/proc.go create mode 100644 vendor/github.com/prometheus/procfs/proc_environ.go create mode 100644 vendor/github.com/prometheus/procfs/proc_fdinfo.go create mode 100644 vendor/github.com/prometheus/procfs/proc_io.go create mode 100644 vendor/github.com/prometheus/procfs/proc_limits.go create mode 100644 vendor/github.com/prometheus/procfs/proc_ns.go create mode 100644 vendor/github.com/prometheus/procfs/proc_psi.go create mode 100644 vendor/github.com/prometheus/procfs/proc_stat.go create mode 100644 vendor/github.com/prometheus/procfs/proc_status.go create mode 100644 vendor/github.com/prometheus/procfs/schedstat.go create mode 100644 vendor/github.com/prometheus/procfs/stat.go create mode 100644 vendor/github.com/prometheus/procfs/ttar create mode 100644 vendor/github.com/prometheus/procfs/vm.go create mode 100644 vendor/github.com/prometheus/procfs/xfrm.go create mode 100644 vendor/github.com/prometheus/procfs/zoneinfo.go create mode 100644 vendor/github.com/satori/go.uuid/.travis.yml create mode 100644 vendor/github.com/satori/go.uuid/LICENSE create mode 100644 vendor/github.com/satori/go.uuid/README.md create mode 100644 vendor/github.com/satori/go.uuid/codec.go create mode 100644 vendor/github.com/satori/go.uuid/generator.go create mode 100644 vendor/github.com/satori/go.uuid/sql.go create mode 100644 vendor/github.com/satori/go.uuid/uuid.go delete mode 100644 vendor/github.com/shirou/gopsutil/mem/types_openbsd.go delete mode 100644 vendor/github.com/shirou/gopsutil/process/types_darwin.go delete mode 100644 vendor/github.com/shirou/gopsutil/process/types_freebsd.go delete mode 100644 vendor/github.com/shirou/gopsutil/process/types_openbsd.go create mode 100644 vendor/github.com/spf13/afero/go.sum create mode 100644 vendor/github.com/spf13/pflag/float32_slice.go create mode 100644 vendor/github.com/spf13/pflag/float64_slice.go create mode 100644 vendor/github.com/spf13/pflag/go.mod create mode 100644 vendor/github.com/spf13/pflag/go.sum create mode 100644 vendor/github.com/spf13/pflag/int32_slice.go create mode 100644 vendor/github.com/spf13/pflag/int64_slice.go create mode 100644 vendor/github.com/spf13/pflag/string_to_int64.go delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_compare.go delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_format.go delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/require/doc.go create mode 100644 vendor/github.com/stretchr/testify/require/forward_requirements.go create mode 100644 vendor/github.com/stretchr/testify/require/require.go create mode 100644 vendor/github.com/stretchr/testify/require/require.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/require/require_forward.go create mode 100644 vendor/github.com/stretchr/testify/require/require_forward.go.tmpl create mode 100644 vendor/github.com/stretchr/testify/require/requirements.go delete mode 100644 vendor/github.com/subosito/gotenv/.travis.yml delete mode 100644 vendor/github.com/subosito/gotenv/appveyor.yml create mode 100644 vendor/github.com/subosito/gotenv/go.mod create mode 100644 vendor/github.com/subosito/gotenv/go.sum create mode 100644 vendor/github.com/twotwotwo/sorts/LICENSE create mode 100644 vendor/github.com/twotwotwo/sorts/README.md create mode 100644 vendor/github.com/twotwotwo/sorts/interfaces.go create mode 100644 vendor/github.com/twotwotwo/sorts/parallel.go create mode 100644 vendor/github.com/twotwotwo/sorts/qsort.go create mode 100644 vendor/github.com/twotwotwo/sorts/radixsort.go create mode 100644 vendor/github.com/uber-go/tally/.gitignore create mode 100644 vendor/github.com/uber-go/tally/.travis.yml create mode 100644 vendor/github.com/uber-go/tally/LICENSE create mode 100644 vendor/github.com/uber-go/tally/Makefile create mode 100644 vendor/github.com/uber-go/tally/README.md create mode 100644 vendor/github.com/uber-go/tally/check_license.sh create mode 100644 vendor/github.com/uber-go/tally/glide.lock create mode 100644 vendor/github.com/uber-go/tally/glide.yaml create mode 100644 vendor/github.com/uber-go/tally/histogram.go create mode 100644 vendor/github.com/uber-go/tally/key_gen.go create mode 100644 vendor/github.com/uber-go/tally/m3/config.go create mode 100644 vendor/github.com/uber-go/tally/m3/customtransports/buffered_read_transport.go create mode 100644 vendor/github.com/uber-go/tally/m3/customtransports/m3_calc_transport.go create mode 100644 vendor/github.com/uber-go/tally/m3/reporter.go create mode 100644 vendor/github.com/uber-go/tally/m3/resource_pool.go create mode 100644 vendor/github.com/uber-go/tally/m3/sanitize.go create mode 100644 vendor/github.com/uber-go/tally/m3/thrift/Makefile create mode 100644 vendor/github.com/uber-go/tally/m3/thrift/constants.go create mode 100644 vendor/github.com/uber-go/tally/m3/thrift/m3.go create mode 100644 vendor/github.com/uber-go/tally/m3/thrift/ttypes.go create mode 100644 vendor/github.com/uber-go/tally/m3/thriftudp/multitransport.go create mode 100644 vendor/github.com/uber-go/tally/m3/thriftudp/transport.go create mode 100644 vendor/github.com/uber-go/tally/multi/README.md create mode 100644 vendor/github.com/uber-go/tally/multi/reporter.go create mode 100644 vendor/github.com/uber-go/tally/pool.go create mode 100644 vendor/github.com/uber-go/tally/prometheus/README.md create mode 100644 vendor/github.com/uber-go/tally/prometheus/config.go create mode 100644 vendor/github.com/uber-go/tally/prometheus/reporter.go create mode 100644 vendor/github.com/uber-go/tally/prometheus/sanitize.go create mode 100644 vendor/github.com/uber-go/tally/reporter.go create mode 100644 vendor/github.com/uber-go/tally/sanitize.go create mode 100644 vendor/github.com/uber-go/tally/scope.go create mode 100644 vendor/github.com/uber-go/tally/stats.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/application_exception.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/binary_protocol.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/buffered_transport.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/compact_protocol.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/debug_protocol.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/deserializer.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/exception.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/field.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/framed_transport.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/http_client.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/http_transport.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/iostream_transport.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/json_protocol.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/memory_buffer.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/messagetype.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/multiplexed_protocol.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/numeric.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/pointerize.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/processor.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/processor_factory.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol_exception.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol_factory.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/rich_transport.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/serializer.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server_socket.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server_transport.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/simple_json_protocol.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/simple_server.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/socket.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/ssl_server_socket.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/ssl_socket.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport_exception.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport_factory.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/type.go create mode 100644 vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/zlib_transport.go create mode 100644 vendor/github.com/uber-go/tally/types.go create mode 100644 vendor/github.com/uber/jaeger-client-go/.gitignore create mode 100644 vendor/github.com/uber/jaeger-client-go/.gitmodules create mode 100644 vendor/github.com/uber/jaeger-client-go/.travis.yml create mode 100644 vendor/github.com/uber/jaeger-client-go/CHANGELOG.md create mode 100644 vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md create mode 100644 vendor/github.com/uber/jaeger-client-go/DCO create mode 100644 vendor/github.com/uber/jaeger-client-go/Gopkg.lock create mode 100644 vendor/github.com/uber/jaeger-client-go/Gopkg.toml create mode 100644 vendor/github.com/uber/jaeger-client-go/LICENSE create mode 100644 vendor/github.com/uber/jaeger-client-go/Makefile create mode 100644 vendor/github.com/uber/jaeger-client-go/README.md create mode 100644 vendor/github.com/uber/jaeger-client-go/RELEASE.md create mode 100644 vendor/github.com/uber/jaeger-client-go/baggage_setter.go create mode 100644 vendor/github.com/uber/jaeger-client-go/config/config.go create mode 100644 vendor/github.com/uber/jaeger-client-go/config/config_env.go create mode 100644 vendor/github.com/uber/jaeger-client-go/config/options.go create mode 100644 vendor/github.com/uber/jaeger-client-go/constants.go create mode 100644 vendor/github.com/uber/jaeger-client-go/contrib_observer.go create mode 100644 vendor/github.com/uber/jaeger-client-go/doc.go create mode 100644 vendor/github.com/uber/jaeger-client-go/glide.lock create mode 100644 vendor/github.com/uber/jaeger-client-go/glide.yaml create mode 100644 vendor/github.com/uber/jaeger-client-go/header.go create mode 100644 vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go create mode 100644 vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go create mode 100644 vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go create mode 100644 vendor/github.com/uber/jaeger-client-go/internal/reporterstats/stats.go create mode 100644 vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go create mode 100644 vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go create mode 100644 vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go create mode 100644 vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go create mode 100644 vendor/github.com/uber/jaeger-client-go/interop.go create mode 100644 vendor/github.com/uber/jaeger-client-go/jaeger_tag.go create mode 100644 vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go create mode 100644 vendor/github.com/uber/jaeger-client-go/log/logger.go create mode 100644 vendor/github.com/uber/jaeger-client-go/log/zap/field.go create mode 100644 vendor/github.com/uber/jaeger-client-go/log/zap/logger.go create mode 100644 vendor/github.com/uber/jaeger-client-go/log/zap/tracer.go create mode 100644 vendor/github.com/uber/jaeger-client-go/logger.go create mode 100644 vendor/github.com/uber/jaeger-client-go/metrics.go create mode 100644 vendor/github.com/uber/jaeger-client-go/observer.go create mode 100644 vendor/github.com/uber/jaeger-client-go/process.go create mode 100644 vendor/github.com/uber/jaeger-client-go/propagation.go create mode 100644 vendor/github.com/uber/jaeger-client-go/reference.go create mode 100644 vendor/github.com/uber/jaeger-client-go/reporter.go create mode 100644 vendor/github.com/uber/jaeger-client-go/reporter_options.go create mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md create mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go create mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go create mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go create mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go create mode 100644 vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go create mode 100644 vendor/github.com/uber/jaeger-client-go/sampler.go create mode 100644 vendor/github.com/uber/jaeger-client-go/sampler_remote.go create mode 100644 vendor/github.com/uber/jaeger-client-go/sampler_remote_options.go create mode 100644 vendor/github.com/uber/jaeger-client-go/sampler_v2.go create mode 100644 vendor/github.com/uber/jaeger-client-go/span.go create mode 100644 vendor/github.com/uber/jaeger-client-go/span_allocator.go create mode 100644 vendor/github.com/uber/jaeger-client-go/span_context.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/.nocover create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/README.md create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/exception.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/numeric.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/processor.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/protocol.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/serializer.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/transport.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go create mode 100644 vendor/github.com/uber/jaeger-client-go/thrift/type.go create mode 100644 vendor/github.com/uber/jaeger-client-go/tracer.go create mode 100644 vendor/github.com/uber/jaeger-client-go/tracer_options.go create mode 100644 vendor/github.com/uber/jaeger-client-go/transport.go create mode 100644 vendor/github.com/uber/jaeger-client-go/transport/doc.go create mode 100644 vendor/github.com/uber/jaeger-client-go/transport/http.go create mode 100644 vendor/github.com/uber/jaeger-client-go/transport_udp.go create mode 100644 vendor/github.com/uber/jaeger-client-go/utils/http_json.go create mode 100644 vendor/github.com/uber/jaeger-client-go/utils/localip.go create mode 100644 vendor/github.com/uber/jaeger-client-go/utils/rand.go create mode 100644 vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go create mode 100644 vendor/github.com/uber/jaeger-client-go/utils/reconnecting_udp_conn.go create mode 100644 vendor/github.com/uber/jaeger-client-go/utils/udp_client.go create mode 100644 vendor/github.com/uber/jaeger-client-go/utils/utils.go create mode 100644 vendor/github.com/uber/jaeger-client-go/zipkin.go create mode 100644 vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go create mode 100644 vendor/github.com/uber/jaeger-lib/LICENSE create mode 100644 vendor/github.com/uber/jaeger-lib/metrics/counter.go create mode 100644 vendor/github.com/uber/jaeger-lib/metrics/factory.go create mode 100644 vendor/github.com/uber/jaeger-lib/metrics/gauge.go create mode 100644 vendor/github.com/uber/jaeger-lib/metrics/histogram.go create mode 100644 vendor/github.com/uber/jaeger-lib/metrics/keys.go create mode 100644 vendor/github.com/uber/jaeger-lib/metrics/metrics.go create mode 100644 vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go create mode 100644 vendor/github.com/uber/jaeger-lib/metrics/tally/factory.go create mode 100644 vendor/github.com/uber/jaeger-lib/metrics/tally/metrics.go create mode 100644 vendor/github.com/uber/jaeger-lib/metrics/timer.go create mode 100644 vendor/github.com/uber/tchannel-go/.gitignore create mode 100644 vendor/github.com/uber/tchannel-go/.travis.yml create mode 100644 vendor/github.com/uber/tchannel-go/CHANGELOG.md create mode 100644 vendor/github.com/uber/tchannel-go/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/uber/tchannel-go/CONTRIBUTING.md create mode 100644 vendor/github.com/uber/tchannel-go/LICENSE.md create mode 100644 vendor/github.com/uber/tchannel-go/Makefile create mode 100644 vendor/github.com/uber/tchannel-go/README.md create mode 100644 vendor/github.com/uber/tchannel-go/RELEASE.md create mode 100644 vendor/github.com/uber/tchannel-go/all_channels.go create mode 100644 vendor/github.com/uber/tchannel-go/arguments.go create mode 100644 vendor/github.com/uber/tchannel-go/calloptions.go create mode 100644 vendor/github.com/uber/tchannel-go/channel.go create mode 100644 vendor/github.com/uber/tchannel-go/channelstate_string.go create mode 100644 vendor/github.com/uber/tchannel-go/checksum.go create mode 100644 vendor/github.com/uber/tchannel-go/codecov.yml create mode 100644 vendor/github.com/uber/tchannel-go/connection.go create mode 100644 vendor/github.com/uber/tchannel-go/connection_direction.go create mode 100644 vendor/github.com/uber/tchannel-go/connectionstate_string.go create mode 100644 vendor/github.com/uber/tchannel-go/context.go create mode 100644 vendor/github.com/uber/tchannel-go/context_builder.go create mode 100644 vendor/github.com/uber/tchannel-go/context_header.go create mode 100644 vendor/github.com/uber/tchannel-go/dial_16.go create mode 100644 vendor/github.com/uber/tchannel-go/dial_17.go create mode 100644 vendor/github.com/uber/tchannel-go/doc.go create mode 100644 vendor/github.com/uber/tchannel-go/errors.go create mode 100644 vendor/github.com/uber/tchannel-go/fragmenting_reader.go create mode 100644 vendor/github.com/uber/tchannel-go/fragmenting_writer.go create mode 100644 vendor/github.com/uber/tchannel-go/frame.go create mode 100644 vendor/github.com/uber/tchannel-go/frame_pool.go create mode 100644 vendor/github.com/uber/tchannel-go/glide.lock create mode 100644 vendor/github.com/uber/tchannel-go/glide.yaml create mode 100644 vendor/github.com/uber/tchannel-go/handlers.go create mode 100644 vendor/github.com/uber/tchannel-go/health.go create mode 100644 vendor/github.com/uber/tchannel-go/idle_sweep.go create mode 100644 vendor/github.com/uber/tchannel-go/inbound.go create mode 100644 vendor/github.com/uber/tchannel-go/internal/argreader/empty.go create mode 100644 vendor/github.com/uber/tchannel-go/introspection.go create mode 100644 vendor/github.com/uber/tchannel-go/localip.go create mode 100644 vendor/github.com/uber/tchannel-go/logger.go create mode 100644 vendor/github.com/uber/tchannel-go/messages.go create mode 100644 vendor/github.com/uber/tchannel-go/messagetype_string.go create mode 100644 vendor/github.com/uber/tchannel-go/mex.go create mode 100644 vendor/github.com/uber/tchannel-go/outbound.go create mode 100644 vendor/github.com/uber/tchannel-go/peer.go create mode 100644 vendor/github.com/uber/tchannel-go/peer_heap.go create mode 100644 vendor/github.com/uber/tchannel-go/peer_strategies.go create mode 100644 vendor/github.com/uber/tchannel-go/preinit_connection.go create mode 100644 vendor/github.com/uber/tchannel-go/relay.go create mode 100644 vendor/github.com/uber/tchannel-go/relay/relay.go create mode 100644 vendor/github.com/uber/tchannel-go/relay_api.go create mode 100644 vendor/github.com/uber/tchannel-go/relay_messages.go create mode 100644 vendor/github.com/uber/tchannel-go/relay_timer_pool.go create mode 100644 vendor/github.com/uber/tchannel-go/reqres.go create mode 100644 vendor/github.com/uber/tchannel-go/reqresreaderstate_string.go create mode 100644 vendor/github.com/uber/tchannel-go/reqreswriterstate_string.go create mode 100644 vendor/github.com/uber/tchannel-go/retry.go create mode 100644 vendor/github.com/uber/tchannel-go/retryon_string.go create mode 100644 vendor/github.com/uber/tchannel-go/root_peer_list.go create mode 100644 vendor/github.com/uber/tchannel-go/stats.go create mode 100644 vendor/github.com/uber/tchannel-go/subchannel.go create mode 100644 vendor/github.com/uber/tchannel-go/systemerrcode_string.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/client.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/context.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/doc.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/constants.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/meta.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/ttypes.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/headers.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/interfaces.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/meta.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/meta.thrift create mode 100644 vendor/github.com/uber/tchannel-go/thrift/options.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/server.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/struct.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/tchan-meta.go create mode 100644 vendor/github.com/uber/tchannel-go/thrift/test.thrift create mode 100644 vendor/github.com/uber/tchannel-go/thrift/transport.go create mode 100644 vendor/github.com/uber/tchannel-go/tnet/listener.go create mode 100644 vendor/github.com/uber/tchannel-go/tos/tos.go create mode 100644 vendor/github.com/uber/tchannel-go/tos/tos_string.go create mode 100644 vendor/github.com/uber/tchannel-go/tracing.go create mode 100644 vendor/github.com/uber/tchannel-go/tracing_keys.go create mode 100644 vendor/github.com/uber/tchannel-go/trand/rand.go create mode 100644 vendor/github.com/uber/tchannel-go/typed/buffer.go create mode 100644 vendor/github.com/uber/tchannel-go/typed/reader.go create mode 100644 vendor/github.com/uber/tchannel-go/version.go delete mode 100644 vendor/github.com/ugorji/go/codec/xml.go create mode 100644 vendor/github.com/willf/bitset/.gitignore create mode 100644 vendor/github.com/willf/bitset/.travis.yml create mode 100644 vendor/github.com/willf/bitset/LICENSE create mode 100644 vendor/github.com/willf/bitset/Makefile create mode 100644 vendor/github.com/willf/bitset/README.md create mode 100644 vendor/github.com/willf/bitset/bitset.go create mode 100644 vendor/github.com/willf/bitset/popcnt.go create mode 100644 vendor/github.com/willf/bitset/popcnt_19.go create mode 100644 vendor/github.com/willf/bitset/popcnt_amd64.go create mode 100644 vendor/github.com/willf/bitset/popcnt_amd64.s create mode 100644 vendor/github.com/willf/bitset/popcnt_generic.go create mode 100644 vendor/github.com/willf/bitset/trailing_zeros_18.go create mode 100644 vendor/github.com/willf/bitset/trailing_zeros_19.go create mode 100644 vendor/go.etcd.io/etcd/LICENSE create mode 100644 vendor/go.etcd.io/etcd/NOTICE create mode 100644 vendor/go.etcd.io/etcd/auth/authpb/auth.pb.go create mode 100644 vendor/go.etcd.io/etcd/auth/authpb/auth.proto create mode 100644 vendor/go.etcd.io/etcd/clientv3/README.md create mode 100644 vendor/go.etcd.io/etcd/clientv3/auth.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/balancer/balancer.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/balancer/connectivity/connectivity.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/balancer/picker/doc.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/balancer/picker/err.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/balancer/picker/picker.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/balancer/picker/roundrobin_balanced.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/balancer/resolver/endpoint/endpoint.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/balancer/utils.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/client.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/cluster.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/compact_op.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/compare.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/concurrency/doc.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/concurrency/election.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/concurrency/key.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/concurrency/mutex.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/concurrency/session.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/concurrency/stm.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/config.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/credentials/credentials.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/ctx.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/doc.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/kv.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/lease.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/logger.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/maintenance.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/op.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/options.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/retry.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/retry_interceptor.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/sort.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/txn.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/utils.go create mode 100644 vendor/go.etcd.io/etcd/clientv3/watch.go create mode 100644 vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/doc.go create mode 100644 vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/error.go create mode 100644 vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/md.go create mode 100644 vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/metadatafields.go create mode 100644 vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/etcdserver.pb.go create mode 100644 vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/etcdserver.proto create mode 100644 vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal.pb.go create mode 100644 vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal.proto create mode 100644 vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal_stringer.go create mode 100644 vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/rpc.pb.go create mode 100644 vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/rpc.proto create mode 100644 vendor/go.etcd.io/etcd/mvcc/mvccpb/kv.pb.go create mode 100644 vendor/go.etcd.io/etcd/mvcc/mvccpb/kv.proto create mode 100644 vendor/go.etcd.io/etcd/pkg/logutil/discard_logger.go create mode 100644 vendor/go.etcd.io/etcd/pkg/logutil/doc.go create mode 100644 vendor/go.etcd.io/etcd/pkg/logutil/log_level.go create mode 100644 vendor/go.etcd.io/etcd/pkg/logutil/logger.go create mode 100644 vendor/go.etcd.io/etcd/pkg/logutil/merge_logger.go create mode 100644 vendor/go.etcd.io/etcd/pkg/logutil/package_logger.go create mode 100644 vendor/go.etcd.io/etcd/pkg/logutil/zap.go create mode 100644 vendor/go.etcd.io/etcd/pkg/logutil/zap_grpc.go create mode 100644 vendor/go.etcd.io/etcd/pkg/logutil/zap_journal.go create mode 100644 vendor/go.etcd.io/etcd/pkg/logutil/zap_raft.go create mode 100644 vendor/go.etcd.io/etcd/pkg/systemd/doc.go create mode 100644 vendor/go.etcd.io/etcd/pkg/systemd/journal.go create mode 100644 vendor/go.etcd.io/etcd/pkg/types/doc.go create mode 100644 vendor/go.etcd.io/etcd/pkg/types/id.go create mode 100644 vendor/go.etcd.io/etcd/pkg/types/set.go create mode 100644 vendor/go.etcd.io/etcd/pkg/types/slice.go create mode 100644 vendor/go.etcd.io/etcd/pkg/types/urls.go create mode 100644 vendor/go.etcd.io/etcd/pkg/types/urlsmap.go create mode 100644 vendor/go.etcd.io/etcd/raft/OWNERS create mode 100644 vendor/go.etcd.io/etcd/raft/README.md create mode 100644 vendor/go.etcd.io/etcd/raft/bootstrap.go create mode 100644 vendor/go.etcd.io/etcd/raft/confchange/confchange.go create mode 100644 vendor/go.etcd.io/etcd/raft/confchange/restore.go create mode 100644 vendor/go.etcd.io/etcd/raft/design.md create mode 100644 vendor/go.etcd.io/etcd/raft/doc.go create mode 100644 vendor/go.etcd.io/etcd/raft/log.go create mode 100644 vendor/go.etcd.io/etcd/raft/log_unstable.go create mode 100644 vendor/go.etcd.io/etcd/raft/logger.go create mode 100644 vendor/go.etcd.io/etcd/raft/node.go create mode 100644 vendor/go.etcd.io/etcd/raft/quorum/joint.go create mode 100644 vendor/go.etcd.io/etcd/raft/quorum/majority.go create mode 100644 vendor/go.etcd.io/etcd/raft/quorum/quorum.go create mode 100644 vendor/go.etcd.io/etcd/raft/quorum/voteresult_string.go create mode 100644 vendor/go.etcd.io/etcd/raft/raft.go create mode 100644 vendor/go.etcd.io/etcd/raft/raftpb/confchange.go create mode 100644 vendor/go.etcd.io/etcd/raft/raftpb/confstate.go create mode 100644 vendor/go.etcd.io/etcd/raft/raftpb/raft.pb.go create mode 100644 vendor/go.etcd.io/etcd/raft/raftpb/raft.proto create mode 100644 vendor/go.etcd.io/etcd/raft/rawnode.go create mode 100644 vendor/go.etcd.io/etcd/raft/read_only.go create mode 100644 vendor/go.etcd.io/etcd/raft/status.go create mode 100644 vendor/go.etcd.io/etcd/raft/storage.go create mode 100644 vendor/go.etcd.io/etcd/raft/tracker/inflights.go create mode 100644 vendor/go.etcd.io/etcd/raft/tracker/progress.go create mode 100644 vendor/go.etcd.io/etcd/raft/tracker/state.go create mode 100644 vendor/go.etcd.io/etcd/raft/tracker/tracker.go create mode 100644 vendor/go.etcd.io/etcd/raft/util.go create mode 100644 vendor/go.etcd.io/etcd/version/version.go create mode 100644 vendor/go.uber.org/atomic/.codecov.yml create mode 100644 vendor/go.uber.org/atomic/.gitignore create mode 100644 vendor/go.uber.org/atomic/.travis.yml create mode 100644 vendor/go.uber.org/atomic/CHANGELOG.md create mode 100644 vendor/go.uber.org/atomic/LICENSE.txt create mode 100644 vendor/go.uber.org/atomic/Makefile create mode 100644 vendor/go.uber.org/atomic/README.md create mode 100644 vendor/go.uber.org/atomic/atomic.go create mode 100644 vendor/go.uber.org/atomic/error.go create mode 100644 vendor/go.uber.org/atomic/go.mod create mode 100644 vendor/go.uber.org/atomic/go.sum create mode 100644 vendor/go.uber.org/atomic/string.go create mode 100644 vendor/go.uber.org/multierr/.codecov.yml create mode 100644 vendor/go.uber.org/multierr/.gitignore create mode 100644 vendor/go.uber.org/multierr/.travis.yml create mode 100644 vendor/go.uber.org/multierr/CHANGELOG.md create mode 100644 vendor/go.uber.org/multierr/LICENSE.txt create mode 100644 vendor/go.uber.org/multierr/Makefile create mode 100644 vendor/go.uber.org/multierr/README.md create mode 100644 vendor/go.uber.org/multierr/error.go create mode 100644 vendor/go.uber.org/multierr/glide.yaml create mode 100644 vendor/go.uber.org/multierr/go.mod create mode 100644 vendor/go.uber.org/multierr/go.sum create mode 100644 vendor/go.uber.org/multierr/go113.go create mode 100644 vendor/go.uber.org/multierr/tools.go create mode 100644 vendor/go.uber.org/tools/LICENSE create mode 100644 vendor/go.uber.org/tools/update-license/.gitignore create mode 100644 vendor/go.uber.org/tools/update-license/README.md create mode 100644 vendor/go.uber.org/tools/update-license/licenses.go create mode 100644 vendor/go.uber.org/tools/update-license/main.go create mode 100644 vendor/go.uber.org/zap/.codecov.yml create mode 100644 vendor/go.uber.org/zap/.gitignore create mode 100644 vendor/go.uber.org/zap/.readme.tmpl create mode 100644 vendor/go.uber.org/zap/.travis.yml create mode 100644 vendor/go.uber.org/zap/CHANGELOG.md create mode 100644 vendor/go.uber.org/zap/CODE_OF_CONDUCT.md create mode 100644 vendor/go.uber.org/zap/CONTRIBUTING.md create mode 100644 vendor/go.uber.org/zap/FAQ.md create mode 100644 vendor/go.uber.org/zap/LICENSE.txt create mode 100644 vendor/go.uber.org/zap/Makefile create mode 100644 vendor/go.uber.org/zap/README.md create mode 100644 vendor/go.uber.org/zap/array.go create mode 100644 vendor/go.uber.org/zap/buffer/buffer.go create mode 100644 vendor/go.uber.org/zap/buffer/pool.go create mode 100644 vendor/go.uber.org/zap/checklicense.sh create mode 100644 vendor/go.uber.org/zap/config.go create mode 100644 vendor/go.uber.org/zap/doc.go create mode 100644 vendor/go.uber.org/zap/encoder.go create mode 100644 vendor/go.uber.org/zap/error.go create mode 100644 vendor/go.uber.org/zap/field.go create mode 100644 vendor/go.uber.org/zap/flag.go create mode 100644 vendor/go.uber.org/zap/glide.yaml create mode 100644 vendor/go.uber.org/zap/global.go create mode 100644 vendor/go.uber.org/zap/global_go112.go create mode 100644 vendor/go.uber.org/zap/global_prego112.go create mode 100644 vendor/go.uber.org/zap/go.mod create mode 100644 vendor/go.uber.org/zap/go.sum create mode 100644 vendor/go.uber.org/zap/http_handler.go create mode 100644 vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go create mode 100644 vendor/go.uber.org/zap/internal/color/color.go create mode 100644 vendor/go.uber.org/zap/internal/exit/exit.go create mode 100644 vendor/go.uber.org/zap/level.go create mode 100644 vendor/go.uber.org/zap/logger.go create mode 100644 vendor/go.uber.org/zap/options.go create mode 100644 vendor/go.uber.org/zap/sink.go create mode 100644 vendor/go.uber.org/zap/stacktrace.go create mode 100644 vendor/go.uber.org/zap/sugar.go create mode 100644 vendor/go.uber.org/zap/time.go create mode 100644 vendor/go.uber.org/zap/tools.go create mode 100644 vendor/go.uber.org/zap/writer.go create mode 100644 vendor/go.uber.org/zap/zapcore/console_encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/core.go create mode 100644 vendor/go.uber.org/zap/zapcore/doc.go create mode 100644 vendor/go.uber.org/zap/zapcore/encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/entry.go create mode 100644 vendor/go.uber.org/zap/zapcore/error.go create mode 100644 vendor/go.uber.org/zap/zapcore/field.go create mode 100644 vendor/go.uber.org/zap/zapcore/hook.go create mode 100644 vendor/go.uber.org/zap/zapcore/json_encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/level.go create mode 100644 vendor/go.uber.org/zap/zapcore/level_strings.go create mode 100644 vendor/go.uber.org/zap/zapcore/marshaler.go create mode 100644 vendor/go.uber.org/zap/zapcore/memory_encoder.go create mode 100644 vendor/go.uber.org/zap/zapcore/sampler.go create mode 100644 vendor/go.uber.org/zap/zapcore/tee.go create mode 100644 vendor/go.uber.org/zap/zapcore/write_syncer.go create mode 100644 vendor/golang.org/x/image/AUTHORS create mode 100644 vendor/golang.org/x/image/CONTRIBUTORS rename vendor/{github.com/gorilla/context => golang.org/x/image}/LICENSE (83%) create mode 100644 vendor/golang.org/x/image/PATENTS create mode 100644 vendor/golang.org/x/image/font/font.go create mode 100644 vendor/golang.org/x/image/math/fixed/fixed.go create mode 100644 vendor/golang.org/x/lint/.travis.yml create mode 100644 vendor/golang.org/x/lint/CONTRIBUTING.md create mode 100644 vendor/golang.org/x/lint/LICENSE create mode 100644 vendor/golang.org/x/lint/README.md create mode 100644 vendor/golang.org/x/lint/go.mod create mode 100644 vendor/golang.org/x/lint/go.sum create mode 100644 vendor/golang.org/x/lint/golint/golint.go create mode 100644 vendor/golang.org/x/lint/golint/import.go create mode 100644 vendor/golang.org/x/lint/golint/importcomment.go create mode 100644 vendor/golang.org/x/lint/lint.go create mode 100644 vendor/golang.org/x/net/bpf/asm.go create mode 100644 vendor/golang.org/x/net/bpf/constants.go create mode 100644 vendor/golang.org/x/net/bpf/doc.go create mode 100644 vendor/golang.org/x/net/bpf/instructions.go create mode 100644 vendor/golang.org/x/net/bpf/setter.go create mode 100644 vendor/golang.org/x/net/bpf/vm.go create mode 100644 vendor/golang.org/x/net/bpf/vm_instructions.go create mode 100644 vendor/golang.org/x/net/http/httpguts/guts.go create mode 100644 vendor/golang.org/x/net/http/httpguts/httplex.go create mode 100644 vendor/golang.org/x/net/http2/.gitignore create mode 100644 vendor/golang.org/x/net/http2/Dockerfile create mode 100644 vendor/golang.org/x/net/http2/Makefile create mode 100644 vendor/golang.org/x/net/http2/README create mode 100644 vendor/golang.org/x/net/http2/ciphers.go create mode 100644 vendor/golang.org/x/net/http2/client_conn_pool.go create mode 100644 vendor/golang.org/x/net/http2/databuffer.go create mode 100644 vendor/golang.org/x/net/http2/errors.go create mode 100644 vendor/golang.org/x/net/http2/flow.go create mode 100644 vendor/golang.org/x/net/http2/frame.go create mode 100644 vendor/golang.org/x/net/http2/go111.go create mode 100644 vendor/golang.org/x/net/http2/gotrack.go create mode 100644 vendor/golang.org/x/net/http2/headermap.go create mode 100644 vendor/golang.org/x/net/http2/hpack/encode.go create mode 100644 vendor/golang.org/x/net/http2/hpack/hpack.go create mode 100644 vendor/golang.org/x/net/http2/hpack/huffman.go create mode 100644 vendor/golang.org/x/net/http2/hpack/tables.go create mode 100644 vendor/golang.org/x/net/http2/http2.go create mode 100644 vendor/golang.org/x/net/http2/not_go111.go create mode 100644 vendor/golang.org/x/net/http2/pipe.go create mode 100644 vendor/golang.org/x/net/http2/server.go create mode 100644 vendor/golang.org/x/net/http2/transport.go create mode 100644 vendor/golang.org/x/net/http2/write.go create mode 100644 vendor/golang.org/x/net/http2/writesched.go create mode 100644 vendor/golang.org/x/net/http2/writesched_priority.go create mode 100644 vendor/golang.org/x/net/http2/writesched_random.go create mode 100644 vendor/golang.org/x/net/idna/idna10.0.0.go create mode 100644 vendor/golang.org/x/net/idna/idna9.0.0.go create mode 100644 vendor/golang.org/x/net/idna/punycode.go create mode 100644 vendor/golang.org/x/net/idna/tables10.0.0.go create mode 100644 vendor/golang.org/x/net/idna/tables11.0.0.go create mode 100644 vendor/golang.org/x/net/idna/tables12.00.go create mode 100644 vendor/golang.org/x/net/idna/tables9.0.0.go create mode 100644 vendor/golang.org/x/net/idna/trie.go create mode 100644 vendor/golang.org/x/net/idna/trieval.go create mode 100644 vendor/golang.org/x/net/internal/iana/const.go create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr.go create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go create mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go create mode 100644 vendor/golang.org/x/net/internal/socket/empty.s create mode 100644 vendor/golang.org/x/net/internal/socket/error_unix.go create mode 100644 vendor/golang.org/x/net/internal/socket/error_windows.go create mode 100644 vendor/golang.org/x/net/internal/socket/iovec_32bit.go create mode 100644 vendor/golang.org/x/net/internal/socket/iovec_64bit.go create mode 100644 vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go create mode 100644 vendor/golang.org/x/net/internal/socket/iovec_stub.go create mode 100644 vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go create mode 100644 vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_bsd.go create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_linux.go create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go create mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_stub.go create mode 100644 vendor/golang.org/x/net/internal/socket/norace.go create mode 100644 vendor/golang.org/x/net/internal/socket/race.go create mode 100644 vendor/golang.org/x/net/internal/socket/rawconn.go create mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go create mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_msg.go create mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go create mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go create mode 100644 vendor/golang.org/x/net/internal/socket/socket.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_bsd.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_bsdvar.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_const_unix.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_darwin.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_dragonfly.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linkname.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_386.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_386.s create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_arm.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mips.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s create mode 100644 vendor/golang.org/x/net/internal/socket/sys_netbsd.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_posix.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_solaris.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s create mode 100644 vendor/golang.org/x/net/internal/socket/sys_stub.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_unix.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_windows.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_386.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go create mode 100644 vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go create mode 100644 vendor/golang.org/x/net/internal/timeseries/timeseries.go create mode 100644 vendor/golang.org/x/net/ipv4/batch.go create mode 100644 vendor/golang.org/x/net/ipv4/control.go create mode 100644 vendor/golang.org/x/net/ipv4/control_bsd.go create mode 100644 vendor/golang.org/x/net/ipv4/control_pktinfo.go create mode 100644 vendor/golang.org/x/net/ipv4/control_stub.go create mode 100644 vendor/golang.org/x/net/ipv4/control_unix.go create mode 100644 vendor/golang.org/x/net/ipv4/control_windows.go create mode 100644 vendor/golang.org/x/net/ipv4/dgramopt.go create mode 100644 vendor/golang.org/x/net/ipv4/doc.go create mode 100644 vendor/golang.org/x/net/ipv4/endpoint.go create mode 100644 vendor/golang.org/x/net/ipv4/genericopt.go create mode 100644 vendor/golang.org/x/net/ipv4/header.go create mode 100644 vendor/golang.org/x/net/ipv4/helper.go create mode 100644 vendor/golang.org/x/net/ipv4/iana.go create mode 100644 vendor/golang.org/x/net/ipv4/icmp.go create mode 100644 vendor/golang.org/x/net/ipv4/icmp_linux.go create mode 100644 vendor/golang.org/x/net/ipv4/icmp_stub.go create mode 100644 vendor/golang.org/x/net/ipv4/packet.go create mode 100644 vendor/golang.org/x/net/ipv4/payload.go create mode 100644 vendor/golang.org/x/net/ipv4/payload_cmsg.go create mode 100644 vendor/golang.org/x/net/ipv4/payload_nocmsg.go create mode 100644 vendor/golang.org/x/net/ipv4/sockopt.go create mode 100644 vendor/golang.org/x/net/ipv4/sockopt_posix.go create mode 100644 vendor/golang.org/x/net/ipv4/sockopt_stub.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_aix.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreq.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreqn.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_bpf.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_bpf_stub.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_bsd.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_darwin.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_dragonfly.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_freebsd.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_linux.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_solaris.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_ssmreq.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_stub.go create mode 100644 vendor/golang.org/x/net/ipv4/sys_windows.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_darwin.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_dragonfly.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_arm64.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_386.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_arm.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mips.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_netbsd.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_openbsd.go create mode 100644 vendor/golang.org/x/net/ipv4/zsys_solaris.go create mode 100644 vendor/golang.org/x/net/ipv6/batch.go create mode 100644 vendor/golang.org/x/net/ipv6/control.go create mode 100644 vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go create mode 100644 vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go create mode 100644 vendor/golang.org/x/net/ipv6/control_stub.go create mode 100644 vendor/golang.org/x/net/ipv6/control_unix.go create mode 100644 vendor/golang.org/x/net/ipv6/control_windows.go create mode 100644 vendor/golang.org/x/net/ipv6/dgramopt.go create mode 100644 vendor/golang.org/x/net/ipv6/doc.go create mode 100644 vendor/golang.org/x/net/ipv6/endpoint.go create mode 100644 vendor/golang.org/x/net/ipv6/genericopt.go create mode 100644 vendor/golang.org/x/net/ipv6/header.go create mode 100644 vendor/golang.org/x/net/ipv6/helper.go create mode 100644 vendor/golang.org/x/net/ipv6/iana.go create mode 100644 vendor/golang.org/x/net/ipv6/icmp.go create mode 100644 vendor/golang.org/x/net/ipv6/icmp_bsd.go create mode 100644 vendor/golang.org/x/net/ipv6/icmp_linux.go create mode 100644 vendor/golang.org/x/net/ipv6/icmp_solaris.go create mode 100644 vendor/golang.org/x/net/ipv6/icmp_stub.go create mode 100644 vendor/golang.org/x/net/ipv6/icmp_windows.go create mode 100644 vendor/golang.org/x/net/ipv6/payload.go create mode 100644 vendor/golang.org/x/net/ipv6/payload_cmsg.go create mode 100644 vendor/golang.org/x/net/ipv6/payload_nocmsg.go create mode 100644 vendor/golang.org/x/net/ipv6/sockopt.go create mode 100644 vendor/golang.org/x/net/ipv6/sockopt_posix.go create mode 100644 vendor/golang.org/x/net/ipv6/sockopt_stub.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_aix.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_asmreq.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_bpf.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_bpf_stub.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_bsd.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_darwin.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_freebsd.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_linux.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_solaris.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_ssmreq.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_stub.go create mode 100644 vendor/golang.org/x/net/ipv6/sys_windows.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_darwin.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_dragonfly.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_arm64.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_386.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_arm.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mips.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_netbsd.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_openbsd.go create mode 100644 vendor/golang.org/x/net/ipv6/zsys_solaris.go create mode 100644 vendor/golang.org/x/net/trace/events.go create mode 100644 vendor/golang.org/x/net/trace/histogram.go create mode 100644 vendor/golang.org/x/net/trace/trace.go create mode 100644 vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s create mode 100644 vendor/golang.org/x/sys/cpu/byteorder.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_aix.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_mipsx.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_ppc64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_riscv64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_wasm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.s create mode 100644 vendor/golang.org/x/sys/cpu/hwcap_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s delete mode 100644 vendor/golang.org/x/sys/unix/mkasm_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/mkmerge.go delete mode 100644 vendor/golang.org/x/sys/unix/mkpost.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall_solaris.go delete mode 100644 vendor/golang.org/x/sys/unix/mksysctl_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/mksysnum.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/types_aix.go delete mode 100644 vendor/golang.org/x/sys/unix/types_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/types_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/types_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_netbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_solaris.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule.go create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/bidi.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/bracket.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/core.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/prop.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/trieval.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/maketables.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables12.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/triegen.go create mode 100644 vendor/golang.org/x/tools/AUTHORS create mode 100644 vendor/golang.org/x/tools/CONTRIBUTORS create mode 100644 vendor/golang.org/x/tools/LICENSE create mode 100644 vendor/golang.org/x/tools/PATENTS create mode 100644 vendor/golang.org/x/tools/go/analysis/analysis.go create mode 100644 vendor/golang.org/x/tools/go/analysis/diagnostic.go create mode 100644 vendor/golang.org/x/tools/go/analysis/doc.go create mode 100644 vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go create mode 100644 vendor/golang.org/x/tools/go/analysis/validate.go create mode 100644 vendor/golang.org/x/tools/go/ast/astutil/enclosing.go create mode 100644 vendor/golang.org/x/tools/go/ast/astutil/imports.go create mode 100644 vendor/golang.org/x/tools/go/ast/astutil/rewrite.go create mode 100644 vendor/golang.org/x/tools/go/ast/astutil/util.go create mode 100644 vendor/golang.org/x/tools/go/ast/inspector/inspector.go create mode 100644 vendor/golang.org/x/tools/go/ast/inspector/typeof.go create mode 100644 vendor/golang.org/x/tools/go/buildutil/allpackages.go create mode 100644 vendor/golang.org/x/tools/go/buildutil/fakecontext.go create mode 100644 vendor/golang.org/x/tools/go/buildutil/overlay.go create mode 100644 vendor/golang.org/x/tools/go/buildutil/tags.go create mode 100644 vendor/golang.org/x/tools/go/buildutil/util.go create mode 100644 vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go create mode 100644 vendor/golang.org/x/tools/go/gcexportdata/importer.go create mode 100644 vendor/golang.org/x/tools/go/internal/gcimporter/bexport.go create mode 100644 vendor/golang.org/x/tools/go/internal/gcimporter/bimport.go create mode 100644 vendor/golang.org/x/tools/go/internal/gcimporter/exportdata.go create mode 100644 vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go create mode 100644 vendor/golang.org/x/tools/go/internal/gcimporter/iexport.go create mode 100644 vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go create mode 100644 vendor/golang.org/x/tools/go/internal/gcimporter/newInterface10.go create mode 100644 vendor/golang.org/x/tools/go/internal/gcimporter/newInterface11.go create mode 100644 vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go create mode 100644 vendor/golang.org/x/tools/go/packages/doc.go create mode 100644 vendor/golang.org/x/tools/go/packages/external.go create mode 100644 vendor/golang.org/x/tools/go/packages/golist.go create mode 100644 vendor/golang.org/x/tools/go/packages/golist_overlay.go create mode 100644 vendor/golang.org/x/tools/go/packages/loadmode_string.go create mode 100644 vendor/golang.org/x/tools/go/packages/packages.go create mode 100644 vendor/golang.org/x/tools/go/packages/visit.go create mode 100644 vendor/golang.org/x/tools/go/types/objectpath/objectpath.go create mode 100644 vendor/golang.org/x/tools/go/types/typeutil/callee.go create mode 100644 vendor/golang.org/x/tools/go/types/typeutil/imports.go create mode 100644 vendor/golang.org/x/tools/go/types/typeutil/map.go create mode 100644 vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go create mode 100644 vendor/golang.org/x/tools/go/types/typeutil/ui.go create mode 100644 vendor/golang.org/x/tools/internal/analysisinternal/analysis.go create mode 100644 vendor/golang.org/x/tools/internal/event/core/event.go create mode 100644 vendor/golang.org/x/tools/internal/event/core/export.go create mode 100644 vendor/golang.org/x/tools/internal/event/core/fast.go create mode 100644 vendor/golang.org/x/tools/internal/event/doc.go create mode 100644 vendor/golang.org/x/tools/internal/event/event.go create mode 100644 vendor/golang.org/x/tools/internal/event/keys/keys.go create mode 100644 vendor/golang.org/x/tools/internal/event/keys/standard.go create mode 100644 vendor/golang.org/x/tools/internal/event/label/label.go create mode 100644 vendor/golang.org/x/tools/internal/gocommand/invoke.go create mode 100644 vendor/golang.org/x/tools/internal/packagesinternal/packages.go create mode 100644 vendor/golang.org/x/xerrors/LICENSE create mode 100644 vendor/golang.org/x/xerrors/PATENTS create mode 100644 vendor/golang.org/x/xerrors/README create mode 100644 vendor/golang.org/x/xerrors/adaptor.go create mode 100644 vendor/golang.org/x/xerrors/codereview.cfg create mode 100644 vendor/golang.org/x/xerrors/doc.go create mode 100644 vendor/golang.org/x/xerrors/errors.go create mode 100644 vendor/golang.org/x/xerrors/fmt.go create mode 100644 vendor/golang.org/x/xerrors/format.go create mode 100644 vendor/golang.org/x/xerrors/frame.go create mode 100644 vendor/golang.org/x/xerrors/go.mod create mode 100644 vendor/golang.org/x/xerrors/internal/internal.go create mode 100644 vendor/golang.org/x/xerrors/wrap.go create mode 100644 vendor/google.golang.org/genproto/LICENSE create mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/field_behavior.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/resource.pb.go create mode 100644 vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go create mode 100644 vendor/google.golang.org/genproto/protobuf/api/api.pb.go create mode 100644 vendor/google.golang.org/genproto/protobuf/field_mask/field_mask.pb.go create mode 100644 vendor/google.golang.org/genproto/protobuf/ptype/type.pb.go create mode 100644 vendor/google.golang.org/genproto/protobuf/source_context/source_context.pb.go create mode 100644 vendor/google.golang.org/grpc/.travis.yml create mode 100644 vendor/google.golang.org/grpc/AUTHORS create mode 100644 vendor/google.golang.org/grpc/CODE-OF-CONDUCT.md create mode 100644 vendor/google.golang.org/grpc/CONTRIBUTING.md create mode 100644 vendor/google.golang.org/grpc/GOVERNANCE.md create mode 100644 vendor/google.golang.org/grpc/LICENSE create mode 100644 vendor/google.golang.org/grpc/MAINTAINERS.md create mode 100644 vendor/google.golang.org/grpc/Makefile create mode 100644 vendor/google.golang.org/grpc/README.md create mode 100644 vendor/google.golang.org/grpc/attributes/attributes.go create mode 100644 vendor/google.golang.org/grpc/backoff.go create mode 100644 vendor/google.golang.org/grpc/backoff/backoff.go create mode 100644 vendor/google.golang.org/grpc/balancer.go create mode 100644 vendor/google.golang.org/grpc/balancer/balancer.go create mode 100644 vendor/google.golang.org/grpc/balancer/base/balancer.go create mode 100644 vendor/google.golang.org/grpc/balancer/base/base.go create mode 100644 vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go create mode 100644 vendor/google.golang.org/grpc/balancer_conn_wrappers.go create mode 100644 vendor/google.golang.org/grpc/balancer_v1_wrapper.go create mode 100644 vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go create mode 100644 vendor/google.golang.org/grpc/call.go create mode 100644 vendor/google.golang.org/grpc/clientconn.go create mode 100644 vendor/google.golang.org/grpc/codec.go create mode 100644 vendor/google.golang.org/grpc/codegen.sh create mode 100644 vendor/google.golang.org/grpc/codes/code_string.go create mode 100644 vendor/google.golang.org/grpc/codes/codes.go create mode 100644 vendor/google.golang.org/grpc/connectivity/connectivity.go create mode 100644 vendor/google.golang.org/grpc/credentials/credentials.go create mode 100644 vendor/google.golang.org/grpc/credentials/go12.go create mode 100644 vendor/google.golang.org/grpc/credentials/internal/syscallconn.go create mode 100644 vendor/google.golang.org/grpc/credentials/internal/syscallconn_appengine.go create mode 100644 vendor/google.golang.org/grpc/credentials/tls.go create mode 100644 vendor/google.golang.org/grpc/dialoptions.go create mode 100644 vendor/google.golang.org/grpc/doc.go create mode 100644 vendor/google.golang.org/grpc/encoding/encoding.go create mode 100644 vendor/google.golang.org/grpc/encoding/proto/proto.go create mode 100644 vendor/google.golang.org/grpc/go.mod create mode 100644 vendor/google.golang.org/grpc/go.sum create mode 100644 vendor/google.golang.org/grpc/grpclog/grpclog.go create mode 100644 vendor/google.golang.org/grpc/grpclog/logger.go create mode 100644 vendor/google.golang.org/grpc/grpclog/loggerv2.go create mode 100644 vendor/google.golang.org/grpc/install_gae.sh create mode 100644 vendor/google.golang.org/grpc/interceptor.go create mode 100644 vendor/google.golang.org/grpc/internal/backoff/backoff.go create mode 100644 vendor/google.golang.org/grpc/internal/balancerload/load.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/binarylog.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/binarylog_testutil.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/env_config.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/method_logger.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/regenerate.sh create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/sink.go create mode 100644 vendor/google.golang.org/grpc/internal/binarylog/util.go create mode 100644 vendor/google.golang.org/grpc/internal/buffer/unbounded.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/funcs.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/logging.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/types.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/types_linux.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/util_linux.go create mode 100644 vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go create mode 100644 vendor/google.golang.org/grpc/internal/envconfig/envconfig.go create mode 100644 vendor/google.golang.org/grpc/internal/grpclog/grpclog.go create mode 100644 vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go create mode 100644 vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go create mode 100644 vendor/google.golang.org/grpc/internal/grpcsync/event.go create mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/target.go create mode 100644 vendor/google.golang.org/grpc/internal/internal.go create mode 100644 vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go create mode 100644 vendor/google.golang.org/grpc/internal/resolver/dns/go113.go create mode 100644 vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go create mode 100644 vendor/google.golang.org/grpc/internal/status/status.go create mode 100644 vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go create mode 100644 vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/bdp_estimator.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/controlbuf.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/defaults.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/flowcontrol.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/handler_server.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/http2_client.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/http2_server.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/http_util.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/log.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/transport.go create mode 100644 vendor/google.golang.org/grpc/keepalive/keepalive.go create mode 100644 vendor/google.golang.org/grpc/metadata/metadata.go create mode 100644 vendor/google.golang.org/grpc/naming/dns_resolver.go create mode 100644 vendor/google.golang.org/grpc/naming/naming.go create mode 100644 vendor/google.golang.org/grpc/peer/peer.go create mode 100644 vendor/google.golang.org/grpc/picker_wrapper.go create mode 100644 vendor/google.golang.org/grpc/pickfirst.go create mode 100644 vendor/google.golang.org/grpc/preloader.go create mode 100644 vendor/google.golang.org/grpc/proxy.go create mode 100644 vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go create mode 100644 vendor/google.golang.org/grpc/resolver/passthrough/passthrough.go create mode 100644 vendor/google.golang.org/grpc/resolver/resolver.go create mode 100644 vendor/google.golang.org/grpc/resolver_conn_wrapper.go create mode 100644 vendor/google.golang.org/grpc/rpc_util.go create mode 100644 vendor/google.golang.org/grpc/server.go create mode 100644 vendor/google.golang.org/grpc/service_config.go create mode 100644 vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go create mode 100644 vendor/google.golang.org/grpc/stats/handlers.go create mode 100644 vendor/google.golang.org/grpc/stats/stats.go create mode 100644 vendor/google.golang.org/grpc/status/status.go create mode 100644 vendor/google.golang.org/grpc/stream.go create mode 100644 vendor/google.golang.org/grpc/tap/tap.go create mode 100644 vendor/google.golang.org/grpc/trace.go create mode 100644 vendor/google.golang.org/grpc/version.go create mode 100644 vendor/google.golang.org/grpc/vet.sh delete mode 100644 vendor/gopkg.in/yaml.v3/.travis.yml delete mode 100644 vendor/gopkg.in/yaml.v3/LICENSE delete mode 100644 vendor/gopkg.in/yaml.v3/README.md delete mode 100644 vendor/gopkg.in/yaml.v3/apic.go delete mode 100644 vendor/gopkg.in/yaml.v3/decode.go delete mode 100644 vendor/gopkg.in/yaml.v3/emitterc.go delete mode 100644 vendor/gopkg.in/yaml.v3/encode.go delete mode 100644 vendor/gopkg.in/yaml.v3/go.mod delete mode 100644 vendor/gopkg.in/yaml.v3/parserc.go delete mode 100644 vendor/gopkg.in/yaml.v3/readerc.go delete mode 100644 vendor/gopkg.in/yaml.v3/resolve.go delete mode 100644 vendor/gopkg.in/yaml.v3/scannerc.go delete mode 100644 vendor/gopkg.in/yaml.v3/sorter.go delete mode 100644 vendor/gopkg.in/yaml.v3/writerc.go delete mode 100644 vendor/gopkg.in/yaml.v3/yaml.go delete mode 100644 vendor/gopkg.in/yaml.v3/yamlh.go delete mode 100644 vendor/gopkg.in/yaml.v3/yamlprivateh.go create mode 100644 vendor/honnef.co/go/tools/LICENSE create mode 100644 vendor/honnef.co/go/tools/LICENSE-THIRD-PARTY create mode 100644 vendor/honnef.co/go/tools/arg/arg.go create mode 100644 vendor/honnef.co/go/tools/cmd/staticcheck/README.md create mode 100644 vendor/honnef.co/go/tools/cmd/staticcheck/staticcheck.go create mode 100644 vendor/honnef.co/go/tools/config/config.go create mode 100644 vendor/honnef.co/go/tools/config/example.conf create mode 100644 vendor/honnef.co/go/tools/deprecated/stdlib.go create mode 100644 vendor/honnef.co/go/tools/facts/deprecated.go create mode 100644 vendor/honnef.co/go/tools/facts/generated.go create mode 100644 vendor/honnef.co/go/tools/facts/purity.go create mode 100644 vendor/honnef.co/go/tools/facts/token.go create mode 100644 vendor/honnef.co/go/tools/functions/loops.go create mode 100644 vendor/honnef.co/go/tools/functions/pure.go create mode 100644 vendor/honnef.co/go/tools/functions/terminates.go create mode 100644 vendor/honnef.co/go/tools/go/types/typeutil/callee.go create mode 100644 vendor/honnef.co/go/tools/go/types/typeutil/identical.go create mode 100644 vendor/honnef.co/go/tools/go/types/typeutil/imports.go create mode 100644 vendor/honnef.co/go/tools/go/types/typeutil/map.go create mode 100644 vendor/honnef.co/go/tools/go/types/typeutil/methodsetcache.go create mode 100644 vendor/honnef.co/go/tools/go/types/typeutil/ui.go create mode 100644 vendor/honnef.co/go/tools/internal/cache/cache.go create mode 100644 vendor/honnef.co/go/tools/internal/cache/default.go create mode 100644 vendor/honnef.co/go/tools/internal/cache/hash.go create mode 100644 vendor/honnef.co/go/tools/internal/passes/buildssa/buildssa.go create mode 100644 vendor/honnef.co/go/tools/internal/renameio/renameio.go create mode 100644 vendor/honnef.co/go/tools/internal/sharedcheck/lint.go create mode 100644 vendor/honnef.co/go/tools/lint/LICENSE create mode 100644 vendor/honnef.co/go/tools/lint/lint.go create mode 100644 vendor/honnef.co/go/tools/lint/lintdsl/lintdsl.go create mode 100644 vendor/honnef.co/go/tools/lint/lintutil/format/format.go create mode 100644 vendor/honnef.co/go/tools/lint/lintutil/stats.go create mode 100644 vendor/honnef.co/go/tools/lint/lintutil/stats_bsd.go create mode 100644 vendor/honnef.co/go/tools/lint/lintutil/stats_posix.go create mode 100644 vendor/honnef.co/go/tools/lint/lintutil/util.go create mode 100644 vendor/honnef.co/go/tools/lint/runner.go create mode 100644 vendor/honnef.co/go/tools/lint/stats.go create mode 100644 vendor/honnef.co/go/tools/loader/loader.go create mode 100644 vendor/honnef.co/go/tools/printf/fuzz.go create mode 100644 vendor/honnef.co/go/tools/printf/printf.go create mode 100644 vendor/honnef.co/go/tools/simple/CONTRIBUTING.md create mode 100644 vendor/honnef.co/go/tools/simple/analysis.go create mode 100644 vendor/honnef.co/go/tools/simple/doc.go create mode 100644 vendor/honnef.co/go/tools/simple/lint.go create mode 100644 vendor/honnef.co/go/tools/ssa/LICENSE create mode 100644 vendor/honnef.co/go/tools/ssa/blockopt.go create mode 100644 vendor/honnef.co/go/tools/ssa/builder.go create mode 100644 vendor/honnef.co/go/tools/ssa/const.go create mode 100644 vendor/honnef.co/go/tools/ssa/create.go create mode 100644 vendor/honnef.co/go/tools/ssa/doc.go create mode 100644 vendor/honnef.co/go/tools/ssa/dom.go create mode 100644 vendor/honnef.co/go/tools/ssa/emit.go create mode 100644 vendor/honnef.co/go/tools/ssa/func.go create mode 100644 vendor/honnef.co/go/tools/ssa/identical.go create mode 100644 vendor/honnef.co/go/tools/ssa/identical_17.go create mode 100644 vendor/honnef.co/go/tools/ssa/lift.go create mode 100644 vendor/honnef.co/go/tools/ssa/lvalue.go create mode 100644 vendor/honnef.co/go/tools/ssa/methods.go create mode 100644 vendor/honnef.co/go/tools/ssa/mode.go create mode 100644 vendor/honnef.co/go/tools/ssa/print.go create mode 100644 vendor/honnef.co/go/tools/ssa/sanity.go create mode 100644 vendor/honnef.co/go/tools/ssa/source.go create mode 100644 vendor/honnef.co/go/tools/ssa/ssa.go create mode 100644 vendor/honnef.co/go/tools/ssa/staticcheck.conf create mode 100644 vendor/honnef.co/go/tools/ssa/testmain.go create mode 100644 vendor/honnef.co/go/tools/ssa/util.go create mode 100644 vendor/honnef.co/go/tools/ssa/wrappers.go create mode 100644 vendor/honnef.co/go/tools/ssa/write.go create mode 100644 vendor/honnef.co/go/tools/ssautil/ssautil.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/CONTRIBUTING.md create mode 100644 vendor/honnef.co/go/tools/staticcheck/analysis.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/buildtag.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/doc.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/knowledge.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/lint.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/rules.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/structtag.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/vrp/channel.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/vrp/int.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/vrp/slice.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/vrp/string.go create mode 100644 vendor/honnef.co/go/tools/staticcheck/vrp/vrp.go create mode 100644 vendor/honnef.co/go/tools/stylecheck/analysis.go create mode 100644 vendor/honnef.co/go/tools/stylecheck/doc.go create mode 100644 vendor/honnef.co/go/tools/stylecheck/lint.go create mode 100644 vendor/honnef.co/go/tools/stylecheck/names.go create mode 100644 vendor/honnef.co/go/tools/unused/edge.go create mode 100644 vendor/honnef.co/go/tools/unused/edgekind_string.go create mode 100644 vendor/honnef.co/go/tools/unused/implements.go create mode 100644 vendor/honnef.co/go/tools/unused/unused.go create mode 100644 vendor/honnef.co/go/tools/version/buildinfo.go create mode 100644 vendor/honnef.co/go/tools/version/buildinfo111.go create mode 100644 vendor/honnef.co/go/tools/version/version.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/cache.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/lruexpirecache.go diff --git a/script/send_voice b/script/send_voice new file mode 100755 index 00000000..e69de29b diff --git a/vendor/github.com/BurntSushi/toml/.gitignore b/vendor/github.com/BurntSushi/toml/.gitignore new file mode 100644 index 00000000..0cd38003 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/.gitignore @@ -0,0 +1,5 @@ +TAGS +tags +.*.swp +tomlcheck/tomlcheck +toml.test diff --git a/vendor/github.com/BurntSushi/toml/.travis.yml b/vendor/github.com/BurntSushi/toml/.travis.yml new file mode 100644 index 00000000..8b8afc4f --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/.travis.yml @@ -0,0 +1,15 @@ +language: go +go: + - 1.1 + - 1.2 + - 1.3 + - 1.4 + - 1.5 + - 1.6 + - tip +install: + - go install ./... + - go get github.com/BurntSushi/toml-test +script: + - export PATH="$PATH:$HOME/gopath/bin" + - make test diff --git a/vendor/github.com/BurntSushi/toml/COMPATIBLE b/vendor/github.com/BurntSushi/toml/COMPATIBLE new file mode 100644 index 00000000..6efcfd0c --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/COMPATIBLE @@ -0,0 +1,3 @@ +Compatible with TOML version +[v0.4.0](https://github.com/toml-lang/toml/blob/v0.4.0/versions/en/toml-v0.4.0.md) + diff --git a/vendor/github.com/BurntSushi/toml/COPYING b/vendor/github.com/BurntSushi/toml/COPYING new file mode 100644 index 00000000..01b57432 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/COPYING @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 TOML authors + +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/BurntSushi/toml/Makefile b/vendor/github.com/BurntSushi/toml/Makefile new file mode 100644 index 00000000..3600848d --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/Makefile @@ -0,0 +1,19 @@ +install: + go install ./... + +test: install + go test -v + toml-test toml-test-decoder + toml-test -encoder toml-test-encoder + +fmt: + gofmt -w *.go */*.go + colcheck *.go */*.go + +tags: + find ./ -name '*.go' -print0 | xargs -0 gotags > TAGS + +push: + git push origin master + git push github master + diff --git a/vendor/github.com/BurntSushi/toml/README.md b/vendor/github.com/BurntSushi/toml/README.md new file mode 100644 index 00000000..7c1b37ec --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/README.md @@ -0,0 +1,218 @@ +## TOML parser and encoder for Go with reflection + +TOML stands for Tom's Obvious, Minimal Language. This Go package provides a +reflection interface similar to Go's standard library `json` and `xml` +packages. This package also supports the `encoding.TextUnmarshaler` and +`encoding.TextMarshaler` interfaces so that you can define custom data +representations. (There is an example of this below.) + +Spec: https://github.com/toml-lang/toml + +Compatible with TOML version +[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) + +Documentation: https://godoc.org/github.com/BurntSushi/toml + +Installation: + +```bash +go get github.com/BurntSushi/toml +``` + +Try the toml validator: + +```bash +go get github.com/BurntSushi/toml/cmd/tomlv +tomlv some-toml-file.toml +``` + +[![Build Status](https://travis-ci.org/BurntSushi/toml.svg?branch=master)](https://travis-ci.org/BurntSushi/toml) [![GoDoc](https://godoc.org/github.com/BurntSushi/toml?status.svg)](https://godoc.org/github.com/BurntSushi/toml) + +### Testing + +This package passes all tests in +[toml-test](https://github.com/BurntSushi/toml-test) for both the decoder +and the encoder. + +### Examples + +This package works similarly to how the Go standard library handles `XML` +and `JSON`. Namely, data is loaded into Go values via reflection. + +For the simplest example, consider some TOML file as just a list of keys +and values: + +```toml +Age = 25 +Cats = [ "Cauchy", "Plato" ] +Pi = 3.14 +Perfection = [ 6, 28, 496, 8128 ] +DOB = 1987-07-05T05:45:00Z +``` + +Which could be defined in Go as: + +```go +type Config struct { + Age int + Cats []string + Pi float64 + Perfection []int + DOB time.Time // requires `import time` +} +``` + +And then decoded with: + +```go +var conf Config +if _, err := toml.Decode(tomlData, &conf); err != nil { + // handle error +} +``` + +You can also use struct tags if your struct field name doesn't map to a TOML +key value directly: + +```toml +some_key_NAME = "wat" +``` + +```go +type TOML struct { + ObscureKey string `toml:"some_key_NAME"` +} +``` + +### Using the `encoding.TextUnmarshaler` interface + +Here's an example that automatically parses duration strings into +`time.Duration` values: + +```toml +[[song]] +name = "Thunder Road" +duration = "4m49s" + +[[song]] +name = "Stairway to Heaven" +duration = "8m03s" +``` + +Which can be decoded with: + +```go +type song struct { + Name string + Duration duration +} +type songs struct { + Song []song +} +var favorites songs +if _, err := toml.Decode(blob, &favorites); err != nil { + log.Fatal(err) +} + +for _, s := range favorites.Song { + fmt.Printf("%s (%s)\n", s.Name, s.Duration) +} +``` + +And you'll also need a `duration` type that satisfies the +`encoding.TextUnmarshaler` interface: + +```go +type duration struct { + time.Duration +} + +func (d *duration) UnmarshalText(text []byte) error { + var err error + d.Duration, err = time.ParseDuration(string(text)) + return err +} +``` + +### More complex usage + +Here's an example of how to load the example from the official spec page: + +```toml +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it + +# Line breaks are OK when inside arrays +hosts = [ + "alpha", + "omega" +] +``` + +And the corresponding Go types are: + +```go +type tomlConfig struct { + Title string + Owner ownerInfo + DB database `toml:"database"` + Servers map[string]server + Clients clients +} + +type ownerInfo struct { + Name string + Org string `toml:"organization"` + Bio string + DOB time.Time +} + +type database struct { + Server string + Ports []int + ConnMax int `toml:"connection_max"` + Enabled bool +} + +type server struct { + IP string + DC string +} + +type clients struct { + Data [][]interface{} + Hosts []string +} +``` + +Note that a case insensitive match will be tried if an exact match can't be +found. + +A working example of the above can be found in `_examples/example.{go,toml}`. diff --git a/vendor/github.com/BurntSushi/toml/decode.go b/vendor/github.com/BurntSushi/toml/decode.go new file mode 100644 index 00000000..b0fd51d5 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/decode.go @@ -0,0 +1,509 @@ +package toml + +import ( + "fmt" + "io" + "io/ioutil" + "math" + "reflect" + "strings" + "time" +) + +func e(format string, args ...interface{}) error { + return fmt.Errorf("toml: "+format, args...) +} + +// Unmarshaler is the interface implemented by objects that can unmarshal a +// TOML description of themselves. +type Unmarshaler interface { + UnmarshalTOML(interface{}) error +} + +// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`. +func Unmarshal(p []byte, v interface{}) error { + _, err := Decode(string(p), v) + return err +} + +// Primitive is a TOML value that hasn't been decoded into a Go value. +// When using the various `Decode*` functions, the type `Primitive` may +// be given to any value, and its decoding will be delayed. +// +// A `Primitive` value can be decoded using the `PrimitiveDecode` function. +// +// The underlying representation of a `Primitive` value is subject to change. +// Do not rely on it. +// +// N.B. Primitive values are still parsed, so using them will only avoid +// the overhead of reflection. They can be useful when you don't know the +// exact type of TOML data until run time. +type Primitive struct { + undecoded interface{} + context Key +} + +// DEPRECATED! +// +// Use MetaData.PrimitiveDecode instead. +func PrimitiveDecode(primValue Primitive, v interface{}) error { + md := MetaData{decoded: make(map[string]bool)} + return md.unify(primValue.undecoded, rvalue(v)) +} + +// PrimitiveDecode is just like the other `Decode*` functions, except it +// decodes a TOML value that has already been parsed. Valid primitive values +// can *only* be obtained from values filled by the decoder functions, +// including this method. (i.e., `v` may contain more `Primitive` +// values.) +// +// Meta data for primitive values is included in the meta data returned by +// the `Decode*` functions with one exception: keys returned by the Undecoded +// method will only reflect keys that were decoded. Namely, any keys hidden +// behind a Primitive will be considered undecoded. Executing this method will +// update the undecoded keys in the meta data. (See the example.) +func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error { + md.context = primValue.context + defer func() { md.context = nil }() + return md.unify(primValue.undecoded, rvalue(v)) +} + +// Decode will decode the contents of `data` in TOML format into a pointer +// `v`. +// +// TOML hashes correspond to Go structs or maps. (Dealer's choice. They can be +// used interchangeably.) +// +// TOML arrays of tables correspond to either a slice of structs or a slice +// of maps. +// +// TOML datetimes correspond to Go `time.Time` values. +// +// All other TOML types (float, string, int, bool and array) correspond +// to the obvious Go types. +// +// An exception to the above rules is if a type implements the +// encoding.TextUnmarshaler interface. In this case, any primitive TOML value +// (floats, strings, integers, booleans and datetimes) will be converted to +// a byte string and given to the value's UnmarshalText method. See the +// Unmarshaler example for a demonstration with time duration strings. +// +// Key mapping +// +// TOML keys can map to either keys in a Go map or field names in a Go +// struct. The special `toml` struct tag may be used to map TOML keys to +// struct fields that don't match the key name exactly. (See the example.) +// A case insensitive match to struct names will be tried if an exact match +// can't be found. +// +// The mapping between TOML values and Go values is loose. That is, there +// may exist TOML values that cannot be placed into your representation, and +// there may be parts of your representation that do not correspond to +// TOML values. This loose mapping can be made stricter by using the IsDefined +// and/or Undecoded methods on the MetaData returned. +// +// This decoder will not handle cyclic types. If a cyclic type is passed, +// `Decode` will not terminate. +func Decode(data string, v interface{}) (MetaData, error) { + rv := reflect.ValueOf(v) + if rv.Kind() != reflect.Ptr { + return MetaData{}, e("Decode of non-pointer %s", reflect.TypeOf(v)) + } + if rv.IsNil() { + return MetaData{}, e("Decode of nil %s", reflect.TypeOf(v)) + } + p, err := parse(data) + if err != nil { + return MetaData{}, err + } + md := MetaData{ + p.mapping, p.types, p.ordered, + make(map[string]bool, len(p.ordered)), nil, + } + return md, md.unify(p.mapping, indirect(rv)) +} + +// DecodeFile is just like Decode, except it will automatically read the +// contents of the file at `fpath` and decode it for you. +func DecodeFile(fpath string, v interface{}) (MetaData, error) { + bs, err := ioutil.ReadFile(fpath) + if err != nil { + return MetaData{}, err + } + return Decode(string(bs), v) +} + +// DecodeReader is just like Decode, except it will consume all bytes +// from the reader and decode it for you. +func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { + bs, err := ioutil.ReadAll(r) + if err != nil { + return MetaData{}, err + } + return Decode(string(bs), v) +} + +// unify performs a sort of type unification based on the structure of `rv`, +// which is the client representation. +// +// Any type mismatch produces an error. Finding a type that we don't know +// how to handle produces an unsupported type error. +func (md *MetaData) unify(data interface{}, rv reflect.Value) error { + + // Special case. Look for a `Primitive` value. + if rv.Type() == reflect.TypeOf((*Primitive)(nil)).Elem() { + // Save the undecoded data and the key context into the primitive + // value. + context := make(Key, len(md.context)) + copy(context, md.context) + rv.Set(reflect.ValueOf(Primitive{ + undecoded: data, + context: context, + })) + return nil + } + + // Special case. Unmarshaler Interface support. + if rv.CanAddr() { + if v, ok := rv.Addr().Interface().(Unmarshaler); ok { + return v.UnmarshalTOML(data) + } + } + + // Special case. Handle time.Time values specifically. + // TODO: Remove this code when we decide to drop support for Go 1.1. + // This isn't necessary in Go 1.2 because time.Time satisfies the encoding + // interfaces. + if rv.Type().AssignableTo(rvalue(time.Time{}).Type()) { + return md.unifyDatetime(data, rv) + } + + // Special case. Look for a value satisfying the TextUnmarshaler interface. + if v, ok := rv.Interface().(TextUnmarshaler); ok { + return md.unifyText(data, v) + } + // BUG(burntsushi) + // The behavior here is incorrect whenever a Go type satisfies the + // encoding.TextUnmarshaler interface but also corresponds to a TOML + // hash or array. In particular, the unmarshaler should only be applied + // to primitive TOML values. But at this point, it will be applied to + // all kinds of values and produce an incorrect error whenever those values + // are hashes or arrays (including arrays of tables). + + k := rv.Kind() + + // laziness + if k >= reflect.Int && k <= reflect.Uint64 { + return md.unifyInt(data, rv) + } + switch k { + case reflect.Ptr: + elem := reflect.New(rv.Type().Elem()) + err := md.unify(data, reflect.Indirect(elem)) + if err != nil { + return err + } + rv.Set(elem) + return nil + case reflect.Struct: + return md.unifyStruct(data, rv) + case reflect.Map: + return md.unifyMap(data, rv) + case reflect.Array: + return md.unifyArray(data, rv) + case reflect.Slice: + return md.unifySlice(data, rv) + case reflect.String: + return md.unifyString(data, rv) + case reflect.Bool: + return md.unifyBool(data, rv) + case reflect.Interface: + // we only support empty interfaces. + if rv.NumMethod() > 0 { + return e("unsupported type %s", rv.Type()) + } + return md.unifyAnything(data, rv) + case reflect.Float32: + fallthrough + case reflect.Float64: + return md.unifyFloat64(data, rv) + } + return e("unsupported type %s", rv.Kind()) +} + +func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error { + tmap, ok := mapping.(map[string]interface{}) + if !ok { + if mapping == nil { + return nil + } + return e("type mismatch for %s: expected table but found %T", + rv.Type().String(), mapping) + } + + for key, datum := range tmap { + var f *field + fields := cachedTypeFields(rv.Type()) + for i := range fields { + ff := &fields[i] + if ff.name == key { + f = ff + break + } + if f == nil && strings.EqualFold(ff.name, key) { + f = ff + } + } + if f != nil { + subv := rv + for _, i := range f.index { + subv = indirect(subv.Field(i)) + } + if isUnifiable(subv) { + md.decoded[md.context.add(key).String()] = true + md.context = append(md.context, key) + if err := md.unify(datum, subv); err != nil { + return err + } + md.context = md.context[0 : len(md.context)-1] + } else if f.name != "" { + // Bad user! No soup for you! + return e("cannot write unexported field %s.%s", + rv.Type().String(), f.name) + } + } + } + return nil +} + +func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error { + tmap, ok := mapping.(map[string]interface{}) + if !ok { + if tmap == nil { + return nil + } + return badtype("map", mapping) + } + if rv.IsNil() { + rv.Set(reflect.MakeMap(rv.Type())) + } + for k, v := range tmap { + md.decoded[md.context.add(k).String()] = true + md.context = append(md.context, k) + + rvkey := indirect(reflect.New(rv.Type().Key())) + rvval := reflect.Indirect(reflect.New(rv.Type().Elem())) + if err := md.unify(v, rvval); err != nil { + return err + } + md.context = md.context[0 : len(md.context)-1] + + rvkey.SetString(k) + rv.SetMapIndex(rvkey, rvval) + } + return nil +} + +func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error { + datav := reflect.ValueOf(data) + if datav.Kind() != reflect.Slice { + if !datav.IsValid() { + return nil + } + return badtype("slice", data) + } + sliceLen := datav.Len() + if sliceLen != rv.Len() { + return e("expected array length %d; got TOML array of length %d", + rv.Len(), sliceLen) + } + return md.unifySliceArray(datav, rv) +} + +func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error { + datav := reflect.ValueOf(data) + if datav.Kind() != reflect.Slice { + if !datav.IsValid() { + return nil + } + return badtype("slice", data) + } + n := datav.Len() + if rv.IsNil() || rv.Cap() < n { + rv.Set(reflect.MakeSlice(rv.Type(), n, n)) + } + rv.SetLen(n) + return md.unifySliceArray(datav, rv) +} + +func (md *MetaData) unifySliceArray(data, rv reflect.Value) error { + sliceLen := data.Len() + for i := 0; i < sliceLen; i++ { + v := data.Index(i).Interface() + sliceval := indirect(rv.Index(i)) + if err := md.unify(v, sliceval); err != nil { + return err + } + } + return nil +} + +func (md *MetaData) unifyDatetime(data interface{}, rv reflect.Value) error { + if _, ok := data.(time.Time); ok { + rv.Set(reflect.ValueOf(data)) + return nil + } + return badtype("time.Time", data) +} + +func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error { + if s, ok := data.(string); ok { + rv.SetString(s) + return nil + } + return badtype("string", data) +} + +func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error { + if num, ok := data.(float64); ok { + switch rv.Kind() { + case reflect.Float32: + fallthrough + case reflect.Float64: + rv.SetFloat(num) + default: + panic("bug") + } + return nil + } + return badtype("float", data) +} + +func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error { + if num, ok := data.(int64); ok { + if rv.Kind() >= reflect.Int && rv.Kind() <= reflect.Int64 { + switch rv.Kind() { + case reflect.Int, reflect.Int64: + // No bounds checking necessary. + case reflect.Int8: + if num < math.MinInt8 || num > math.MaxInt8 { + return e("value %d is out of range for int8", num) + } + case reflect.Int16: + if num < math.MinInt16 || num > math.MaxInt16 { + return e("value %d is out of range for int16", num) + } + case reflect.Int32: + if num < math.MinInt32 || num > math.MaxInt32 { + return e("value %d is out of range for int32", num) + } + } + rv.SetInt(num) + } else if rv.Kind() >= reflect.Uint && rv.Kind() <= reflect.Uint64 { + unum := uint64(num) + switch rv.Kind() { + case reflect.Uint, reflect.Uint64: + // No bounds checking necessary. + case reflect.Uint8: + if num < 0 || unum > math.MaxUint8 { + return e("value %d is out of range for uint8", num) + } + case reflect.Uint16: + if num < 0 || unum > math.MaxUint16 { + return e("value %d is out of range for uint16", num) + } + case reflect.Uint32: + if num < 0 || unum > math.MaxUint32 { + return e("value %d is out of range for uint32", num) + } + } + rv.SetUint(unum) + } else { + panic("unreachable") + } + return nil + } + return badtype("integer", data) +} + +func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error { + if b, ok := data.(bool); ok { + rv.SetBool(b) + return nil + } + return badtype("boolean", data) +} + +func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error { + rv.Set(reflect.ValueOf(data)) + return nil +} + +func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error { + var s string + switch sdata := data.(type) { + case TextMarshaler: + text, err := sdata.MarshalText() + if err != nil { + return err + } + s = string(text) + case fmt.Stringer: + s = sdata.String() + case string: + s = sdata + case bool: + s = fmt.Sprintf("%v", sdata) + case int64: + s = fmt.Sprintf("%d", sdata) + case float64: + s = fmt.Sprintf("%f", sdata) + default: + return badtype("primitive (string-like)", data) + } + if err := v.UnmarshalText([]byte(s)); err != nil { + return err + } + return nil +} + +// rvalue returns a reflect.Value of `v`. All pointers are resolved. +func rvalue(v interface{}) reflect.Value { + return indirect(reflect.ValueOf(v)) +} + +// indirect returns the value pointed to by a pointer. +// Pointers are followed until the value is not a pointer. +// New values are allocated for each nil pointer. +// +// An exception to this rule is if the value satisfies an interface of +// interest to us (like encoding.TextUnmarshaler). +func indirect(v reflect.Value) reflect.Value { + if v.Kind() != reflect.Ptr { + if v.CanSet() { + pv := v.Addr() + if _, ok := pv.Interface().(TextUnmarshaler); ok { + return pv + } + } + return v + } + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + return indirect(reflect.Indirect(v)) +} + +func isUnifiable(rv reflect.Value) bool { + if rv.CanSet() { + return true + } + if _, ok := rv.Interface().(TextUnmarshaler); ok { + return true + } + return false +} + +func badtype(expected string, data interface{}) error { + return e("cannot load TOML value of type %T into a Go %s", data, expected) +} diff --git a/vendor/github.com/BurntSushi/toml/decode_meta.go b/vendor/github.com/BurntSushi/toml/decode_meta.go new file mode 100644 index 00000000..b9914a67 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/decode_meta.go @@ -0,0 +1,121 @@ +package toml + +import "strings" + +// MetaData allows access to meta information about TOML data that may not +// be inferrable via reflection. In particular, whether a key has been defined +// and the TOML type of a key. +type MetaData struct { + mapping map[string]interface{} + types map[string]tomlType + keys []Key + decoded map[string]bool + context Key // Used only during decoding. +} + +// IsDefined returns true if the key given exists in the TOML data. The key +// should be specified hierarchially. e.g., +// +// // access the TOML key 'a.b.c' +// IsDefined("a", "b", "c") +// +// IsDefined will return false if an empty key given. Keys are case sensitive. +func (md *MetaData) IsDefined(key ...string) bool { + if len(key) == 0 { + return false + } + + var hash map[string]interface{} + var ok bool + var hashOrVal interface{} = md.mapping + for _, k := range key { + if hash, ok = hashOrVal.(map[string]interface{}); !ok { + return false + } + if hashOrVal, ok = hash[k]; !ok { + return false + } + } + return true +} + +// Type returns a string representation of the type of the key specified. +// +// Type will return the empty string if given an empty key or a key that +// does not exist. Keys are case sensitive. +func (md *MetaData) Type(key ...string) string { + fullkey := strings.Join(key, ".") + if typ, ok := md.types[fullkey]; ok { + return typ.typeString() + } + return "" +} + +// Key is the type of any TOML key, including key groups. Use (MetaData).Keys +// to get values of this type. +type Key []string + +func (k Key) String() string { + return strings.Join(k, ".") +} + +func (k Key) maybeQuotedAll() string { + var ss []string + for i := range k { + ss = append(ss, k.maybeQuoted(i)) + } + return strings.Join(ss, ".") +} + +func (k Key) maybeQuoted(i int) string { + quote := false + for _, c := range k[i] { + if !isBareKeyChar(c) { + quote = true + break + } + } + if quote { + return "\"" + strings.Replace(k[i], "\"", "\\\"", -1) + "\"" + } + return k[i] +} + +func (k Key) add(piece string) Key { + newKey := make(Key, len(k)+1) + copy(newKey, k) + newKey[len(k)] = piece + return newKey +} + +// Keys returns a slice of every key in the TOML data, including key groups. +// Each key is itself a slice, where the first element is the top of the +// hierarchy and the last is the most specific. +// +// The list will have the same order as the keys appeared in the TOML data. +// +// All keys returned are non-empty. +func (md *MetaData) Keys() []Key { + return md.keys +} + +// Undecoded returns all keys that have not been decoded in the order in which +// they appear in the original TOML document. +// +// This includes keys that haven't been decoded because of a Primitive value. +// Once the Primitive value is decoded, the keys will be considered decoded. +// +// Also note that decoding into an empty interface will result in no decoding, +// and so no keys will be considered decoded. +// +// In this sense, the Undecoded keys correspond to keys in the TOML document +// that do not have a concrete type in your representation. +func (md *MetaData) Undecoded() []Key { + undecoded := make([]Key, 0, len(md.keys)) + for _, key := range md.keys { + if !md.decoded[key.String()] { + undecoded = append(undecoded, key) + } + } + return undecoded +} diff --git a/vendor/github.com/BurntSushi/toml/doc.go b/vendor/github.com/BurntSushi/toml/doc.go new file mode 100644 index 00000000..b371f396 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/doc.go @@ -0,0 +1,27 @@ +/* +Package toml provides facilities for decoding and encoding TOML configuration +files via reflection. There is also support for delaying decoding with +the Primitive type, and querying the set of keys in a TOML document with the +MetaData type. + +The specification implemented: https://github.com/toml-lang/toml + +The sub-command github.com/BurntSushi/toml/cmd/tomlv can be used to verify +whether a file is a valid TOML document. It can also be used to print the +type of each key in a TOML document. + +Testing + +There are two important types of tests used for this package. The first is +contained inside '*_test.go' files and uses the standard Go unit testing +framework. These tests are primarily devoted to holistically testing the +decoder and encoder. + +The second type of testing is used to verify the implementation's adherence +to the TOML specification. These tests have been factored into their own +project: https://github.com/BurntSushi/toml-test + +The reason the tests are in a separate project is so that they can be used by +any implementation of TOML. Namely, it is language agnostic. +*/ +package toml diff --git a/vendor/github.com/BurntSushi/toml/encode.go b/vendor/github.com/BurntSushi/toml/encode.go new file mode 100644 index 00000000..d905c21a --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/encode.go @@ -0,0 +1,568 @@ +package toml + +import ( + "bufio" + "errors" + "fmt" + "io" + "reflect" + "sort" + "strconv" + "strings" + "time" +) + +type tomlEncodeError struct{ error } + +var ( + errArrayMixedElementTypes = errors.New( + "toml: cannot encode array with mixed element types") + errArrayNilElement = errors.New( + "toml: cannot encode array with nil element") + errNonString = errors.New( + "toml: cannot encode a map with non-string key type") + errAnonNonStruct = errors.New( + "toml: cannot encode an anonymous field that is not a struct") + errArrayNoTable = errors.New( + "toml: TOML array element cannot contain a table") + errNoKey = errors.New( + "toml: top-level values must be Go maps or structs") + errAnything = errors.New("") // used in testing +) + +var quotedReplacer = strings.NewReplacer( + "\t", "\\t", + "\n", "\\n", + "\r", "\\r", + "\"", "\\\"", + "\\", "\\\\", +) + +// Encoder controls the encoding of Go values to a TOML document to some +// io.Writer. +// +// The indentation level can be controlled with the Indent field. +type Encoder struct { + // A single indentation level. By default it is two spaces. + Indent string + + // hasWritten is whether we have written any output to w yet. + hasWritten bool + w *bufio.Writer +} + +// NewEncoder returns a TOML encoder that encodes Go values to the io.Writer +// given. By default, a single indentation level is 2 spaces. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + w: bufio.NewWriter(w), + Indent: " ", + } +} + +// Encode writes a TOML representation of the Go value to the underlying +// io.Writer. If the value given cannot be encoded to a valid TOML document, +// then an error is returned. +// +// The mapping between Go values and TOML values should be precisely the same +// as for the Decode* functions. Similarly, the TextMarshaler interface is +// supported by encoding the resulting bytes as strings. (If you want to write +// arbitrary binary data then you will need to use something like base64 since +// TOML does not have any binary types.) +// +// When encoding TOML hashes (i.e., Go maps or structs), keys without any +// sub-hashes are encoded first. +// +// If a Go map is encoded, then its keys are sorted alphabetically for +// deterministic output. More control over this behavior may be provided if +// there is demand for it. +// +// Encoding Go values without a corresponding TOML representation---like map +// types with non-string keys---will cause an error to be returned. Similarly +// for mixed arrays/slices, arrays/slices with nil elements, embedded +// non-struct types and nested slices containing maps or structs. +// (e.g., [][]map[string]string is not allowed but []map[string]string is OK +// and so is []map[string][]string.) +func (enc *Encoder) Encode(v interface{}) error { + rv := eindirect(reflect.ValueOf(v)) + if err := enc.safeEncode(Key([]string{}), rv); err != nil { + return err + } + return enc.w.Flush() +} + +func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) { + defer func() { + if r := recover(); r != nil { + if terr, ok := r.(tomlEncodeError); ok { + err = terr.error + return + } + panic(r) + } + }() + enc.encode(key, rv) + return nil +} + +func (enc *Encoder) encode(key Key, rv reflect.Value) { + // Special case. Time needs to be in ISO8601 format. + // Special case. If we can marshal the type to text, then we used that. + // Basically, this prevents the encoder for handling these types as + // generic structs (or whatever the underlying type of a TextMarshaler is). + switch rv.Interface().(type) { + case time.Time, TextMarshaler: + enc.keyEqElement(key, rv) + return + } + + k := rv.Kind() + switch k { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, + reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, + reflect.Uint64, + reflect.Float32, reflect.Float64, reflect.String, reflect.Bool: + enc.keyEqElement(key, rv) + case reflect.Array, reflect.Slice: + if typeEqual(tomlArrayHash, tomlTypeOfGo(rv)) { + enc.eArrayOfTables(key, rv) + } else { + enc.keyEqElement(key, rv) + } + case reflect.Interface: + if rv.IsNil() { + return + } + enc.encode(key, rv.Elem()) + case reflect.Map: + if rv.IsNil() { + return + } + enc.eTable(key, rv) + case reflect.Ptr: + if rv.IsNil() { + return + } + enc.encode(key, rv.Elem()) + case reflect.Struct: + enc.eTable(key, rv) + default: + panic(e("unsupported type for key '%s': %s", key, k)) + } +} + +// eElement encodes any value that can be an array element (primitives and +// arrays). +func (enc *Encoder) eElement(rv reflect.Value) { + switch v := rv.Interface().(type) { + case time.Time: + // Special case time.Time as a primitive. Has to come before + // TextMarshaler below because time.Time implements + // encoding.TextMarshaler, but we need to always use UTC. + enc.wf(v.UTC().Format("2006-01-02T15:04:05Z")) + return + case TextMarshaler: + // Special case. Use text marshaler if it's available for this value. + if s, err := v.MarshalText(); err != nil { + encPanic(err) + } else { + enc.writeQuoted(string(s)) + } + return + } + switch rv.Kind() { + case reflect.Bool: + enc.wf(strconv.FormatBool(rv.Bool())) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, + reflect.Int64: + enc.wf(strconv.FormatInt(rv.Int(), 10)) + case reflect.Uint, reflect.Uint8, reflect.Uint16, + reflect.Uint32, reflect.Uint64: + enc.wf(strconv.FormatUint(rv.Uint(), 10)) + case reflect.Float32: + enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 32))) + case reflect.Float64: + enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 64))) + case reflect.Array, reflect.Slice: + enc.eArrayOrSliceElement(rv) + case reflect.Interface: + enc.eElement(rv.Elem()) + case reflect.String: + enc.writeQuoted(rv.String()) + default: + panic(e("unexpected primitive type: %s", rv.Kind())) + } +} + +// By the TOML spec, all floats must have a decimal with at least one +// number on either side. +func floatAddDecimal(fstr string) string { + if !strings.Contains(fstr, ".") { + return fstr + ".0" + } + return fstr +} + +func (enc *Encoder) writeQuoted(s string) { + enc.wf("\"%s\"", quotedReplacer.Replace(s)) +} + +func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) { + length := rv.Len() + enc.wf("[") + for i := 0; i < length; i++ { + elem := rv.Index(i) + enc.eElement(elem) + if i != length-1 { + enc.wf(", ") + } + } + enc.wf("]") +} + +func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) { + if len(key) == 0 { + encPanic(errNoKey) + } + for i := 0; i < rv.Len(); i++ { + trv := rv.Index(i) + if isNil(trv) { + continue + } + panicIfInvalidKey(key) + enc.newline() + enc.wf("%s[[%s]]", enc.indentStr(key), key.maybeQuotedAll()) + enc.newline() + enc.eMapOrStruct(key, trv) + } +} + +func (enc *Encoder) eTable(key Key, rv reflect.Value) { + panicIfInvalidKey(key) + if len(key) == 1 { + // Output an extra newline between top-level tables. + // (The newline isn't written if nothing else has been written though.) + enc.newline() + } + if len(key) > 0 { + enc.wf("%s[%s]", enc.indentStr(key), key.maybeQuotedAll()) + enc.newline() + } + enc.eMapOrStruct(key, rv) +} + +func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value) { + switch rv := eindirect(rv); rv.Kind() { + case reflect.Map: + enc.eMap(key, rv) + case reflect.Struct: + enc.eStruct(key, rv) + default: + panic("eTable: unhandled reflect.Value Kind: " + rv.Kind().String()) + } +} + +func (enc *Encoder) eMap(key Key, rv reflect.Value) { + rt := rv.Type() + if rt.Key().Kind() != reflect.String { + encPanic(errNonString) + } + + // Sort keys so that we have deterministic output. And write keys directly + // underneath this key first, before writing sub-structs or sub-maps. + var mapKeysDirect, mapKeysSub []string + for _, mapKey := range rv.MapKeys() { + k := mapKey.String() + if typeIsHash(tomlTypeOfGo(rv.MapIndex(mapKey))) { + mapKeysSub = append(mapKeysSub, k) + } else { + mapKeysDirect = append(mapKeysDirect, k) + } + } + + var writeMapKeys = func(mapKeys []string) { + sort.Strings(mapKeys) + for _, mapKey := range mapKeys { + mrv := rv.MapIndex(reflect.ValueOf(mapKey)) + if isNil(mrv) { + // Don't write anything for nil fields. + continue + } + enc.encode(key.add(mapKey), mrv) + } + } + writeMapKeys(mapKeysDirect) + writeMapKeys(mapKeysSub) +} + +func (enc *Encoder) eStruct(key Key, rv reflect.Value) { + // Write keys for fields directly under this key first, because if we write + // a field that creates a new table, then all keys under it will be in that + // table (not the one we're writing here). + rt := rv.Type() + var fieldsDirect, fieldsSub [][]int + var addFields func(rt reflect.Type, rv reflect.Value, start []int) + addFields = func(rt reflect.Type, rv reflect.Value, start []int) { + for i := 0; i < rt.NumField(); i++ { + f := rt.Field(i) + // skip unexported fields + if f.PkgPath != "" && !f.Anonymous { + continue + } + frv := rv.Field(i) + if f.Anonymous { + t := f.Type + switch t.Kind() { + case reflect.Struct: + // Treat anonymous struct fields with + // tag names as though they are not + // anonymous, like encoding/json does. + if getOptions(f.Tag).name == "" { + addFields(t, frv, f.Index) + continue + } + case reflect.Ptr: + if t.Elem().Kind() == reflect.Struct && + getOptions(f.Tag).name == "" { + if !frv.IsNil() { + addFields(t.Elem(), frv.Elem(), f.Index) + } + continue + } + // Fall through to the normal field encoding logic below + // for non-struct anonymous fields. + } + } + + if typeIsHash(tomlTypeOfGo(frv)) { + fieldsSub = append(fieldsSub, append(start, f.Index...)) + } else { + fieldsDirect = append(fieldsDirect, append(start, f.Index...)) + } + } + } + addFields(rt, rv, nil) + + var writeFields = func(fields [][]int) { + for _, fieldIndex := range fields { + sft := rt.FieldByIndex(fieldIndex) + sf := rv.FieldByIndex(fieldIndex) + if isNil(sf) { + // Don't write anything for nil fields. + continue + } + + opts := getOptions(sft.Tag) + if opts.skip { + continue + } + keyName := sft.Name + if opts.name != "" { + keyName = opts.name + } + if opts.omitempty && isEmpty(sf) { + continue + } + if opts.omitzero && isZero(sf) { + continue + } + + enc.encode(key.add(keyName), sf) + } + } + writeFields(fieldsDirect) + writeFields(fieldsSub) +} + +// tomlTypeName returns the TOML type name of the Go value's type. It is +// used to determine whether the types of array elements are mixed (which is +// forbidden). If the Go value is nil, then it is illegal for it to be an array +// element, and valueIsNil is returned as true. + +// Returns the TOML type of a Go value. The type may be `nil`, which means +// no concrete TOML type could be found. +func tomlTypeOfGo(rv reflect.Value) tomlType { + if isNil(rv) || !rv.IsValid() { + return nil + } + switch rv.Kind() { + case reflect.Bool: + return tomlBool + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, + reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, + reflect.Uint64: + return tomlInteger + case reflect.Float32, reflect.Float64: + return tomlFloat + case reflect.Array, reflect.Slice: + if typeEqual(tomlHash, tomlArrayType(rv)) { + return tomlArrayHash + } + return tomlArray + case reflect.Ptr, reflect.Interface: + return tomlTypeOfGo(rv.Elem()) + case reflect.String: + return tomlString + case reflect.Map: + return tomlHash + case reflect.Struct: + switch rv.Interface().(type) { + case time.Time: + return tomlDatetime + case TextMarshaler: + return tomlString + default: + return tomlHash + } + default: + panic("unexpected reflect.Kind: " + rv.Kind().String()) + } +} + +// tomlArrayType returns the element type of a TOML array. The type returned +// may be nil if it cannot be determined (e.g., a nil slice or a zero length +// slize). This function may also panic if it finds a type that cannot be +// expressed in TOML (such as nil elements, heterogeneous arrays or directly +// nested arrays of tables). +func tomlArrayType(rv reflect.Value) tomlType { + if isNil(rv) || !rv.IsValid() || rv.Len() == 0 { + return nil + } + firstType := tomlTypeOfGo(rv.Index(0)) + if firstType == nil { + encPanic(errArrayNilElement) + } + + rvlen := rv.Len() + for i := 1; i < rvlen; i++ { + elem := rv.Index(i) + switch elemType := tomlTypeOfGo(elem); { + case elemType == nil: + encPanic(errArrayNilElement) + case !typeEqual(firstType, elemType): + encPanic(errArrayMixedElementTypes) + } + } + // If we have a nested array, then we must make sure that the nested + // array contains ONLY primitives. + // This checks arbitrarily nested arrays. + if typeEqual(firstType, tomlArray) || typeEqual(firstType, tomlArrayHash) { + nest := tomlArrayType(eindirect(rv.Index(0))) + if typeEqual(nest, tomlHash) || typeEqual(nest, tomlArrayHash) { + encPanic(errArrayNoTable) + } + } + return firstType +} + +type tagOptions struct { + skip bool // "-" + name string + omitempty bool + omitzero bool +} + +func getOptions(tag reflect.StructTag) tagOptions { + t := tag.Get("toml") + if t == "-" { + return tagOptions{skip: true} + } + var opts tagOptions + parts := strings.Split(t, ",") + opts.name = parts[0] + for _, s := range parts[1:] { + switch s { + case "omitempty": + opts.omitempty = true + case "omitzero": + opts.omitzero = true + } + } + return opts +} + +func isZero(rv reflect.Value) bool { + switch rv.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return rv.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return rv.Uint() == 0 + case reflect.Float32, reflect.Float64: + return rv.Float() == 0.0 + } + return false +} + +func isEmpty(rv reflect.Value) bool { + switch rv.Kind() { + case reflect.Array, reflect.Slice, reflect.Map, reflect.String: + return rv.Len() == 0 + case reflect.Bool: + return !rv.Bool() + } + return false +} + +func (enc *Encoder) newline() { + if enc.hasWritten { + enc.wf("\n") + } +} + +func (enc *Encoder) keyEqElement(key Key, val reflect.Value) { + if len(key) == 0 { + encPanic(errNoKey) + } + panicIfInvalidKey(key) + enc.wf("%s%s = ", enc.indentStr(key), key.maybeQuoted(len(key)-1)) + enc.eElement(val) + enc.newline() +} + +func (enc *Encoder) wf(format string, v ...interface{}) { + if _, err := fmt.Fprintf(enc.w, format, v...); err != nil { + encPanic(err) + } + enc.hasWritten = true +} + +func (enc *Encoder) indentStr(key Key) string { + return strings.Repeat(enc.Indent, len(key)-1) +} + +func encPanic(err error) { + panic(tomlEncodeError{err}) +} + +func eindirect(v reflect.Value) reflect.Value { + switch v.Kind() { + case reflect.Ptr, reflect.Interface: + return eindirect(v.Elem()) + default: + return v + } +} + +func isNil(rv reflect.Value) bool { + switch rv.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return rv.IsNil() + default: + return false + } +} + +func panicIfInvalidKey(key Key) { + for _, k := range key { + if len(k) == 0 { + encPanic(e("Key '%s' is not a valid table name. Key names "+ + "cannot be empty.", key.maybeQuotedAll())) + } + } +} + +func isValidKeyName(s string) bool { + return len(s) != 0 +} diff --git a/vendor/github.com/BurntSushi/toml/encoding_types.go b/vendor/github.com/BurntSushi/toml/encoding_types.go new file mode 100644 index 00000000..d36e1dd6 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/encoding_types.go @@ -0,0 +1,19 @@ +// +build go1.2 + +package toml + +// In order to support Go 1.1, we define our own TextMarshaler and +// TextUnmarshaler types. For Go 1.2+, we just alias them with the +// standard library interfaces. + +import ( + "encoding" +) + +// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here +// so that Go 1.1 can be supported. +type TextMarshaler encoding.TextMarshaler + +// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined +// here so that Go 1.1 can be supported. +type TextUnmarshaler encoding.TextUnmarshaler diff --git a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go new file mode 100644 index 00000000..e8d503d0 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go @@ -0,0 +1,18 @@ +// +build !go1.2 + +package toml + +// These interfaces were introduced in Go 1.2, so we add them manually when +// compiling for Go 1.1. + +// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here +// so that Go 1.1 can be supported. +type TextMarshaler interface { + MarshalText() (text []byte, err error) +} + +// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined +// here so that Go 1.1 can be supported. +type TextUnmarshaler interface { + UnmarshalText(text []byte) error +} diff --git a/vendor/github.com/BurntSushi/toml/lex.go b/vendor/github.com/BurntSushi/toml/lex.go new file mode 100644 index 00000000..e0a742a8 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/lex.go @@ -0,0 +1,953 @@ +package toml + +import ( + "fmt" + "strings" + "unicode" + "unicode/utf8" +) + +type itemType int + +const ( + itemError itemType = iota + itemNIL // used in the parser to indicate no type + itemEOF + itemText + itemString + itemRawString + itemMultilineString + itemRawMultilineString + itemBool + itemInteger + itemFloat + itemDatetime + itemArray // the start of an array + itemArrayEnd + itemTableStart + itemTableEnd + itemArrayTableStart + itemArrayTableEnd + itemKeyStart + itemCommentStart + itemInlineTableStart + itemInlineTableEnd +) + +const ( + eof = 0 + comma = ',' + tableStart = '[' + tableEnd = ']' + arrayTableStart = '[' + arrayTableEnd = ']' + tableSep = '.' + keySep = '=' + arrayStart = '[' + arrayEnd = ']' + commentStart = '#' + stringStart = '"' + stringEnd = '"' + rawStringStart = '\'' + rawStringEnd = '\'' + inlineTableStart = '{' + inlineTableEnd = '}' +) + +type stateFn func(lx *lexer) stateFn + +type lexer struct { + input string + start int + pos int + line int + state stateFn + items chan item + + // Allow for backing up up to three runes. + // This is necessary because TOML contains 3-rune tokens (""" and '''). + prevWidths [3]int + nprev int // how many of prevWidths are in use + // If we emit an eof, we can still back up, but it is not OK to call + // next again. + atEOF bool + + // A stack of state functions used to maintain context. + // The idea is to reuse parts of the state machine in various places. + // For example, values can appear at the top level or within arbitrarily + // nested arrays. The last state on the stack is used after a value has + // been lexed. Similarly for comments. + stack []stateFn +} + +type item struct { + typ itemType + val string + line int +} + +func (lx *lexer) nextItem() item { + for { + select { + case item := <-lx.items: + return item + default: + lx.state = lx.state(lx) + } + } +} + +func lex(input string) *lexer { + lx := &lexer{ + input: input, + state: lexTop, + line: 1, + items: make(chan item, 10), + stack: make([]stateFn, 0, 10), + } + return lx +} + +func (lx *lexer) push(state stateFn) { + lx.stack = append(lx.stack, state) +} + +func (lx *lexer) pop() stateFn { + if len(lx.stack) == 0 { + return lx.errorf("BUG in lexer: no states to pop") + } + last := lx.stack[len(lx.stack)-1] + lx.stack = lx.stack[0 : len(lx.stack)-1] + return last +} + +func (lx *lexer) current() string { + return lx.input[lx.start:lx.pos] +} + +func (lx *lexer) emit(typ itemType) { + lx.items <- item{typ, lx.current(), lx.line} + lx.start = lx.pos +} + +func (lx *lexer) emitTrim(typ itemType) { + lx.items <- item{typ, strings.TrimSpace(lx.current()), lx.line} + lx.start = lx.pos +} + +func (lx *lexer) next() (r rune) { + if lx.atEOF { + panic("next called after EOF") + } + if lx.pos >= len(lx.input) { + lx.atEOF = true + return eof + } + + if lx.input[lx.pos] == '\n' { + lx.line++ + } + lx.prevWidths[2] = lx.prevWidths[1] + lx.prevWidths[1] = lx.prevWidths[0] + if lx.nprev < 3 { + lx.nprev++ + } + r, w := utf8.DecodeRuneInString(lx.input[lx.pos:]) + lx.prevWidths[0] = w + lx.pos += w + return r +} + +// ignore skips over the pending input before this point. +func (lx *lexer) ignore() { + lx.start = lx.pos +} + +// backup steps back one rune. Can be called only twice between calls to next. +func (lx *lexer) backup() { + if lx.atEOF { + lx.atEOF = false + return + } + if lx.nprev < 1 { + panic("backed up too far") + } + w := lx.prevWidths[0] + lx.prevWidths[0] = lx.prevWidths[1] + lx.prevWidths[1] = lx.prevWidths[2] + lx.nprev-- + lx.pos -= w + if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' { + lx.line-- + } +} + +// accept consumes the next rune if it's equal to `valid`. +func (lx *lexer) accept(valid rune) bool { + if lx.next() == valid { + return true + } + lx.backup() + return false +} + +// peek returns but does not consume the next rune in the input. +func (lx *lexer) peek() rune { + r := lx.next() + lx.backup() + return r +} + +// skip ignores all input that matches the given predicate. +func (lx *lexer) skip(pred func(rune) bool) { + for { + r := lx.next() + if pred(r) { + continue + } + lx.backup() + lx.ignore() + return + } +} + +// errorf stops all lexing by emitting an error and returning `nil`. +// Note that any value that is a character is escaped if it's a special +// character (newlines, tabs, etc.). +func (lx *lexer) errorf(format string, values ...interface{}) stateFn { + lx.items <- item{ + itemError, + fmt.Sprintf(format, values...), + lx.line, + } + return nil +} + +// lexTop consumes elements at the top level of TOML data. +func lexTop(lx *lexer) stateFn { + r := lx.next() + if isWhitespace(r) || isNL(r) { + return lexSkip(lx, lexTop) + } + switch r { + case commentStart: + lx.push(lexTop) + return lexCommentStart + case tableStart: + return lexTableStart + case eof: + if lx.pos > lx.start { + return lx.errorf("unexpected EOF") + } + lx.emit(itemEOF) + return nil + } + + // At this point, the only valid item can be a key, so we back up + // and let the key lexer do the rest. + lx.backup() + lx.push(lexTopEnd) + return lexKeyStart +} + +// lexTopEnd is entered whenever a top-level item has been consumed. (A value +// or a table.) It must see only whitespace, and will turn back to lexTop +// upon a newline. If it sees EOF, it will quit the lexer successfully. +func lexTopEnd(lx *lexer) stateFn { + r := lx.next() + switch { + case r == commentStart: + // a comment will read to a newline for us. + lx.push(lexTop) + return lexCommentStart + case isWhitespace(r): + return lexTopEnd + case isNL(r): + lx.ignore() + return lexTop + case r == eof: + lx.emit(itemEOF) + return nil + } + return lx.errorf("expected a top-level item to end with a newline, "+ + "comment, or EOF, but got %q instead", r) +} + +// lexTable lexes the beginning of a table. Namely, it makes sure that +// it starts with a character other than '.' and ']'. +// It assumes that '[' has already been consumed. +// It also handles the case that this is an item in an array of tables. +// e.g., '[[name]]'. +func lexTableStart(lx *lexer) stateFn { + if lx.peek() == arrayTableStart { + lx.next() + lx.emit(itemArrayTableStart) + lx.push(lexArrayTableEnd) + } else { + lx.emit(itemTableStart) + lx.push(lexTableEnd) + } + return lexTableNameStart +} + +func lexTableEnd(lx *lexer) stateFn { + lx.emit(itemTableEnd) + return lexTopEnd +} + +func lexArrayTableEnd(lx *lexer) stateFn { + if r := lx.next(); r != arrayTableEnd { + return lx.errorf("expected end of table array name delimiter %q, "+ + "but got %q instead", arrayTableEnd, r) + } + lx.emit(itemArrayTableEnd) + return lexTopEnd +} + +func lexTableNameStart(lx *lexer) stateFn { + lx.skip(isWhitespace) + switch r := lx.peek(); { + case r == tableEnd || r == eof: + return lx.errorf("unexpected end of table name " + + "(table names cannot be empty)") + case r == tableSep: + return lx.errorf("unexpected table separator " + + "(table names cannot be empty)") + case r == stringStart || r == rawStringStart: + lx.ignore() + lx.push(lexTableNameEnd) + return lexValue // reuse string lexing + default: + return lexBareTableName + } +} + +// lexBareTableName lexes the name of a table. It assumes that at least one +// valid character for the table has already been read. +func lexBareTableName(lx *lexer) stateFn { + r := lx.next() + if isBareKeyChar(r) { + return lexBareTableName + } + lx.backup() + lx.emit(itemText) + return lexTableNameEnd +} + +// lexTableNameEnd reads the end of a piece of a table name, optionally +// consuming whitespace. +func lexTableNameEnd(lx *lexer) stateFn { + lx.skip(isWhitespace) + switch r := lx.next(); { + case isWhitespace(r): + return lexTableNameEnd + case r == tableSep: + lx.ignore() + return lexTableNameStart + case r == tableEnd: + return lx.pop() + default: + return lx.errorf("expected '.' or ']' to end table name, "+ + "but got %q instead", r) + } +} + +// lexKeyStart consumes a key name up until the first non-whitespace character. +// lexKeyStart will ignore whitespace. +func lexKeyStart(lx *lexer) stateFn { + r := lx.peek() + switch { + case r == keySep: + return lx.errorf("unexpected key separator %q", keySep) + case isWhitespace(r) || isNL(r): + lx.next() + return lexSkip(lx, lexKeyStart) + case r == stringStart || r == rawStringStart: + lx.ignore() + lx.emit(itemKeyStart) + lx.push(lexKeyEnd) + return lexValue // reuse string lexing + default: + lx.ignore() + lx.emit(itemKeyStart) + return lexBareKey + } +} + +// lexBareKey consumes the text of a bare key. Assumes that the first character +// (which is not whitespace) has not yet been consumed. +func lexBareKey(lx *lexer) stateFn { + switch r := lx.next(); { + case isBareKeyChar(r): + return lexBareKey + case isWhitespace(r): + lx.backup() + lx.emit(itemText) + return lexKeyEnd + case r == keySep: + lx.backup() + lx.emit(itemText) + return lexKeyEnd + default: + return lx.errorf("bare keys cannot contain %q", r) + } +} + +// lexKeyEnd consumes the end of a key and trims whitespace (up to the key +// separator). +func lexKeyEnd(lx *lexer) stateFn { + switch r := lx.next(); { + case r == keySep: + return lexSkip(lx, lexValue) + case isWhitespace(r): + return lexSkip(lx, lexKeyEnd) + default: + return lx.errorf("expected key separator %q, but got %q instead", + keySep, r) + } +} + +// lexValue starts the consumption of a value anywhere a value is expected. +// lexValue will ignore whitespace. +// After a value is lexed, the last state on the next is popped and returned. +func lexValue(lx *lexer) stateFn { + // We allow whitespace to precede a value, but NOT newlines. + // In array syntax, the array states are responsible for ignoring newlines. + r := lx.next() + switch { + case isWhitespace(r): + return lexSkip(lx, lexValue) + case isDigit(r): + lx.backup() // avoid an extra state and use the same as above + return lexNumberOrDateStart + } + switch r { + case arrayStart: + lx.ignore() + lx.emit(itemArray) + return lexArrayValue + case inlineTableStart: + lx.ignore() + lx.emit(itemInlineTableStart) + return lexInlineTableValue + case stringStart: + if lx.accept(stringStart) { + if lx.accept(stringStart) { + lx.ignore() // Ignore """ + return lexMultilineString + } + lx.backup() + } + lx.ignore() // ignore the '"' + return lexString + case rawStringStart: + if lx.accept(rawStringStart) { + if lx.accept(rawStringStart) { + lx.ignore() // Ignore """ + return lexMultilineRawString + } + lx.backup() + } + lx.ignore() // ignore the "'" + return lexRawString + case '+', '-': + return lexNumberStart + case '.': // special error case, be kind to users + return lx.errorf("floats must start with a digit, not '.'") + } + if unicode.IsLetter(r) { + // Be permissive here; lexBool will give a nice error if the + // user wrote something like + // x = foo + // (i.e. not 'true' or 'false' but is something else word-like.) + lx.backup() + return lexBool + } + return lx.errorf("expected value but found %q instead", r) +} + +// lexArrayValue consumes one value in an array. It assumes that '[' or ',' +// have already been consumed. All whitespace and newlines are ignored. +func lexArrayValue(lx *lexer) stateFn { + r := lx.next() + switch { + case isWhitespace(r) || isNL(r): + return lexSkip(lx, lexArrayValue) + case r == commentStart: + lx.push(lexArrayValue) + return lexCommentStart + case r == comma: + return lx.errorf("unexpected comma") + case r == arrayEnd: + // NOTE(caleb): The spec isn't clear about whether you can have + // a trailing comma or not, so we'll allow it. + return lexArrayEnd + } + + lx.backup() + lx.push(lexArrayValueEnd) + return lexValue +} + +// lexArrayValueEnd consumes everything between the end of an array value and +// the next value (or the end of the array): it ignores whitespace and newlines +// and expects either a ',' or a ']'. +func lexArrayValueEnd(lx *lexer) stateFn { + r := lx.next() + switch { + case isWhitespace(r) || isNL(r): + return lexSkip(lx, lexArrayValueEnd) + case r == commentStart: + lx.push(lexArrayValueEnd) + return lexCommentStart + case r == comma: + lx.ignore() + return lexArrayValue // move on to the next value + case r == arrayEnd: + return lexArrayEnd + } + return lx.errorf( + "expected a comma or array terminator %q, but got %q instead", + arrayEnd, r, + ) +} + +// lexArrayEnd finishes the lexing of an array. +// It assumes that a ']' has just been consumed. +func lexArrayEnd(lx *lexer) stateFn { + lx.ignore() + lx.emit(itemArrayEnd) + return lx.pop() +} + +// lexInlineTableValue consumes one key/value pair in an inline table. +// It assumes that '{' or ',' have already been consumed. Whitespace is ignored. +func lexInlineTableValue(lx *lexer) stateFn { + r := lx.next() + switch { + case isWhitespace(r): + return lexSkip(lx, lexInlineTableValue) + case isNL(r): + return lx.errorf("newlines not allowed within inline tables") + case r == commentStart: + lx.push(lexInlineTableValue) + return lexCommentStart + case r == comma: + return lx.errorf("unexpected comma") + case r == inlineTableEnd: + return lexInlineTableEnd + } + lx.backup() + lx.push(lexInlineTableValueEnd) + return lexKeyStart +} + +// lexInlineTableValueEnd consumes everything between the end of an inline table +// key/value pair and the next pair (or the end of the table): +// it ignores whitespace and expects either a ',' or a '}'. +func lexInlineTableValueEnd(lx *lexer) stateFn { + r := lx.next() + switch { + case isWhitespace(r): + return lexSkip(lx, lexInlineTableValueEnd) + case isNL(r): + return lx.errorf("newlines not allowed within inline tables") + case r == commentStart: + lx.push(lexInlineTableValueEnd) + return lexCommentStart + case r == comma: + lx.ignore() + return lexInlineTableValue + case r == inlineTableEnd: + return lexInlineTableEnd + } + return lx.errorf("expected a comma or an inline table terminator %q, "+ + "but got %q instead", inlineTableEnd, r) +} + +// lexInlineTableEnd finishes the lexing of an inline table. +// It assumes that a '}' has just been consumed. +func lexInlineTableEnd(lx *lexer) stateFn { + lx.ignore() + lx.emit(itemInlineTableEnd) + return lx.pop() +} + +// lexString consumes the inner contents of a string. It assumes that the +// beginning '"' has already been consumed and ignored. +func lexString(lx *lexer) stateFn { + r := lx.next() + switch { + case r == eof: + return lx.errorf("unexpected EOF") + case isNL(r): + return lx.errorf("strings cannot contain newlines") + case r == '\\': + lx.push(lexString) + return lexStringEscape + case r == stringEnd: + lx.backup() + lx.emit(itemString) + lx.next() + lx.ignore() + return lx.pop() + } + return lexString +} + +// lexMultilineString consumes the inner contents of a string. It assumes that +// the beginning '"""' has already been consumed and ignored. +func lexMultilineString(lx *lexer) stateFn { + switch lx.next() { + case eof: + return lx.errorf("unexpected EOF") + case '\\': + return lexMultilineStringEscape + case stringEnd: + if lx.accept(stringEnd) { + if lx.accept(stringEnd) { + lx.backup() + lx.backup() + lx.backup() + lx.emit(itemMultilineString) + lx.next() + lx.next() + lx.next() + lx.ignore() + return lx.pop() + } + lx.backup() + } + } + return lexMultilineString +} + +// lexRawString consumes a raw string. Nothing can be escaped in such a string. +// It assumes that the beginning "'" has already been consumed and ignored. +func lexRawString(lx *lexer) stateFn { + r := lx.next() + switch { + case r == eof: + return lx.errorf("unexpected EOF") + case isNL(r): + return lx.errorf("strings cannot contain newlines") + case r == rawStringEnd: + lx.backup() + lx.emit(itemRawString) + lx.next() + lx.ignore() + return lx.pop() + } + return lexRawString +} + +// lexMultilineRawString consumes a raw string. Nothing can be escaped in such +// a string. It assumes that the beginning "'''" has already been consumed and +// ignored. +func lexMultilineRawString(lx *lexer) stateFn { + switch lx.next() { + case eof: + return lx.errorf("unexpected EOF") + case rawStringEnd: + if lx.accept(rawStringEnd) { + if lx.accept(rawStringEnd) { + lx.backup() + lx.backup() + lx.backup() + lx.emit(itemRawMultilineString) + lx.next() + lx.next() + lx.next() + lx.ignore() + return lx.pop() + } + lx.backup() + } + } + return lexMultilineRawString +} + +// lexMultilineStringEscape consumes an escaped character. It assumes that the +// preceding '\\' has already been consumed. +func lexMultilineStringEscape(lx *lexer) stateFn { + // Handle the special case first: + if isNL(lx.next()) { + return lexMultilineString + } + lx.backup() + lx.push(lexMultilineString) + return lexStringEscape(lx) +} + +func lexStringEscape(lx *lexer) stateFn { + r := lx.next() + switch r { + case 'b': + fallthrough + case 't': + fallthrough + case 'n': + fallthrough + case 'f': + fallthrough + case 'r': + fallthrough + case '"': + fallthrough + case '\\': + return lx.pop() + case 'u': + return lexShortUnicodeEscape + case 'U': + return lexLongUnicodeEscape + } + return lx.errorf("invalid escape character %q; only the following "+ + "escape characters are allowed: "+ + `\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX`, r) +} + +func lexShortUnicodeEscape(lx *lexer) stateFn { + var r rune + for i := 0; i < 4; i++ { + r = lx.next() + if !isHexadecimal(r) { + return lx.errorf(`expected four hexadecimal digits after '\u', `+ + "but got %q instead", lx.current()) + } + } + return lx.pop() +} + +func lexLongUnicodeEscape(lx *lexer) stateFn { + var r rune + for i := 0; i < 8; i++ { + r = lx.next() + if !isHexadecimal(r) { + return lx.errorf(`expected eight hexadecimal digits after '\U', `+ + "but got %q instead", lx.current()) + } + } + return lx.pop() +} + +// lexNumberOrDateStart consumes either an integer, a float, or datetime. +func lexNumberOrDateStart(lx *lexer) stateFn { + r := lx.next() + if isDigit(r) { + return lexNumberOrDate + } + switch r { + case '_': + return lexNumber + case 'e', 'E': + return lexFloat + case '.': + return lx.errorf("floats must start with a digit, not '.'") + } + return lx.errorf("expected a digit but got %q", r) +} + +// lexNumberOrDate consumes either an integer, float or datetime. +func lexNumberOrDate(lx *lexer) stateFn { + r := lx.next() + if isDigit(r) { + return lexNumberOrDate + } + switch r { + case '-': + return lexDatetime + case '_': + return lexNumber + case '.', 'e', 'E': + return lexFloat + } + + lx.backup() + lx.emit(itemInteger) + return lx.pop() +} + +// lexDatetime consumes a Datetime, to a first approximation. +// The parser validates that it matches one of the accepted formats. +func lexDatetime(lx *lexer) stateFn { + r := lx.next() + if isDigit(r) { + return lexDatetime + } + switch r { + case '-', 'T', ':', '.', 'Z', '+': + return lexDatetime + } + + lx.backup() + lx.emit(itemDatetime) + return lx.pop() +} + +// lexNumberStart consumes either an integer or a float. It assumes that a sign +// has already been read, but that *no* digits have been consumed. +// lexNumberStart will move to the appropriate integer or float states. +func lexNumberStart(lx *lexer) stateFn { + // We MUST see a digit. Even floats have to start with a digit. + r := lx.next() + if !isDigit(r) { + if r == '.' { + return lx.errorf("floats must start with a digit, not '.'") + } + return lx.errorf("expected a digit but got %q", r) + } + return lexNumber +} + +// lexNumber consumes an integer or a float after seeing the first digit. +func lexNumber(lx *lexer) stateFn { + r := lx.next() + if isDigit(r) { + return lexNumber + } + switch r { + case '_': + return lexNumber + case '.', 'e', 'E': + return lexFloat + } + + lx.backup() + lx.emit(itemInteger) + return lx.pop() +} + +// lexFloat consumes the elements of a float. It allows any sequence of +// float-like characters, so floats emitted by the lexer are only a first +// approximation and must be validated by the parser. +func lexFloat(lx *lexer) stateFn { + r := lx.next() + if isDigit(r) { + return lexFloat + } + switch r { + case '_', '.', '-', '+', 'e', 'E': + return lexFloat + } + + lx.backup() + lx.emit(itemFloat) + return lx.pop() +} + +// lexBool consumes a bool string: 'true' or 'false. +func lexBool(lx *lexer) stateFn { + var rs []rune + for { + r := lx.next() + if !unicode.IsLetter(r) { + lx.backup() + break + } + rs = append(rs, r) + } + s := string(rs) + switch s { + case "true", "false": + lx.emit(itemBool) + return lx.pop() + } + return lx.errorf("expected value but found %q instead", s) +} + +// lexCommentStart begins the lexing of a comment. It will emit +// itemCommentStart and consume no characters, passing control to lexComment. +func lexCommentStart(lx *lexer) stateFn { + lx.ignore() + lx.emit(itemCommentStart) + return lexComment +} + +// lexComment lexes an entire comment. It assumes that '#' has been consumed. +// It will consume *up to* the first newline character, and pass control +// back to the last state on the stack. +func lexComment(lx *lexer) stateFn { + r := lx.peek() + if isNL(r) || r == eof { + lx.emit(itemText) + return lx.pop() + } + lx.next() + return lexComment +} + +// lexSkip ignores all slurped input and moves on to the next state. +func lexSkip(lx *lexer, nextState stateFn) stateFn { + return func(lx *lexer) stateFn { + lx.ignore() + return nextState + } +} + +// isWhitespace returns true if `r` is a whitespace character according +// to the spec. +func isWhitespace(r rune) bool { + return r == '\t' || r == ' ' +} + +func isNL(r rune) bool { + return r == '\n' || r == '\r' +} + +func isDigit(r rune) bool { + return r >= '0' && r <= '9' +} + +func isHexadecimal(r rune) bool { + return (r >= '0' && r <= '9') || + (r >= 'a' && r <= 'f') || + (r >= 'A' && r <= 'F') +} + +func isBareKeyChar(r rune) bool { + return (r >= 'A' && r <= 'Z') || + (r >= 'a' && r <= 'z') || + (r >= '0' && r <= '9') || + r == '_' || + r == '-' +} + +func (itype itemType) String() string { + switch itype { + case itemError: + return "Error" + case itemNIL: + return "NIL" + case itemEOF: + return "EOF" + case itemText: + return "Text" + case itemString, itemRawString, itemMultilineString, itemRawMultilineString: + return "String" + case itemBool: + return "Bool" + case itemInteger: + return "Integer" + case itemFloat: + return "Float" + case itemDatetime: + return "DateTime" + case itemTableStart: + return "TableStart" + case itemTableEnd: + return "TableEnd" + case itemKeyStart: + return "KeyStart" + case itemArray: + return "Array" + case itemArrayEnd: + return "ArrayEnd" + case itemCommentStart: + return "CommentStart" + } + panic(fmt.Sprintf("BUG: Unknown type '%d'.", int(itype))) +} + +func (item item) String() string { + return fmt.Sprintf("(%s, %s)", item.typ.String(), item.val) +} diff --git a/vendor/github.com/BurntSushi/toml/parse.go b/vendor/github.com/BurntSushi/toml/parse.go new file mode 100644 index 00000000..50869ef9 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/parse.go @@ -0,0 +1,592 @@ +package toml + +import ( + "fmt" + "strconv" + "strings" + "time" + "unicode" + "unicode/utf8" +) + +type parser struct { + mapping map[string]interface{} + types map[string]tomlType + lx *lexer + + // A list of keys in the order that they appear in the TOML data. + ordered []Key + + // the full key for the current hash in scope + context Key + + // the base key name for everything except hashes + currentKey string + + // rough approximation of line number + approxLine int + + // A map of 'key.group.names' to whether they were created implicitly. + implicits map[string]bool +} + +type parseError string + +func (pe parseError) Error() string { + return string(pe) +} + +func parse(data string) (p *parser, err error) { + defer func() { + if r := recover(); r != nil { + var ok bool + if err, ok = r.(parseError); ok { + return + } + panic(r) + } + }() + + p = &parser{ + mapping: make(map[string]interface{}), + types: make(map[string]tomlType), + lx: lex(data), + ordered: make([]Key, 0), + implicits: make(map[string]bool), + } + for { + item := p.next() + if item.typ == itemEOF { + break + } + p.topLevel(item) + } + + return p, nil +} + +func (p *parser) panicf(format string, v ...interface{}) { + msg := fmt.Sprintf("Near line %d (last key parsed '%s'): %s", + p.approxLine, p.current(), fmt.Sprintf(format, v...)) + panic(parseError(msg)) +} + +func (p *parser) next() item { + it := p.lx.nextItem() + if it.typ == itemError { + p.panicf("%s", it.val) + } + return it +} + +func (p *parser) bug(format string, v ...interface{}) { + panic(fmt.Sprintf("BUG: "+format+"\n\n", v...)) +} + +func (p *parser) expect(typ itemType) item { + it := p.next() + p.assertEqual(typ, it.typ) + return it +} + +func (p *parser) assertEqual(expected, got itemType) { + if expected != got { + p.bug("Expected '%s' but got '%s'.", expected, got) + } +} + +func (p *parser) topLevel(item item) { + switch item.typ { + case itemCommentStart: + p.approxLine = item.line + p.expect(itemText) + case itemTableStart: + kg := p.next() + p.approxLine = kg.line + + var key Key + for ; kg.typ != itemTableEnd && kg.typ != itemEOF; kg = p.next() { + key = append(key, p.keyString(kg)) + } + p.assertEqual(itemTableEnd, kg.typ) + + p.establishContext(key, false) + p.setType("", tomlHash) + p.ordered = append(p.ordered, key) + case itemArrayTableStart: + kg := p.next() + p.approxLine = kg.line + + var key Key + for ; kg.typ != itemArrayTableEnd && kg.typ != itemEOF; kg = p.next() { + key = append(key, p.keyString(kg)) + } + p.assertEqual(itemArrayTableEnd, kg.typ) + + p.establishContext(key, true) + p.setType("", tomlArrayHash) + p.ordered = append(p.ordered, key) + case itemKeyStart: + kname := p.next() + p.approxLine = kname.line + p.currentKey = p.keyString(kname) + + val, typ := p.value(p.next()) + p.setValue(p.currentKey, val) + p.setType(p.currentKey, typ) + p.ordered = append(p.ordered, p.context.add(p.currentKey)) + p.currentKey = "" + default: + p.bug("Unexpected type at top level: %s", item.typ) + } +} + +// Gets a string for a key (or part of a key in a table name). +func (p *parser) keyString(it item) string { + switch it.typ { + case itemText: + return it.val + case itemString, itemMultilineString, + itemRawString, itemRawMultilineString: + s, _ := p.value(it) + return s.(string) + default: + p.bug("Unexpected key type: %s", it.typ) + panic("unreachable") + } +} + +// value translates an expected value from the lexer into a Go value wrapped +// as an empty interface. +func (p *parser) value(it item) (interface{}, tomlType) { + switch it.typ { + case itemString: + return p.replaceEscapes(it.val), p.typeOfPrimitive(it) + case itemMultilineString: + trimmed := stripFirstNewline(stripEscapedWhitespace(it.val)) + return p.replaceEscapes(trimmed), p.typeOfPrimitive(it) + case itemRawString: + return it.val, p.typeOfPrimitive(it) + case itemRawMultilineString: + return stripFirstNewline(it.val), p.typeOfPrimitive(it) + case itemBool: + switch it.val { + case "true": + return true, p.typeOfPrimitive(it) + case "false": + return false, p.typeOfPrimitive(it) + } + p.bug("Expected boolean value, but got '%s'.", it.val) + case itemInteger: + if !numUnderscoresOK(it.val) { + p.panicf("Invalid integer %q: underscores must be surrounded by digits", + it.val) + } + val := strings.Replace(it.val, "_", "", -1) + num, err := strconv.ParseInt(val, 10, 64) + if err != nil { + // Distinguish integer values. Normally, it'd be a bug if the lexer + // provides an invalid integer, but it's possible that the number is + // out of range of valid values (which the lexer cannot determine). + // So mark the former as a bug but the latter as a legitimate user + // error. + if e, ok := err.(*strconv.NumError); ok && + e.Err == strconv.ErrRange { + + p.panicf("Integer '%s' is out of the range of 64-bit "+ + "signed integers.", it.val) + } else { + p.bug("Expected integer value, but got '%s'.", it.val) + } + } + return num, p.typeOfPrimitive(it) + case itemFloat: + parts := strings.FieldsFunc(it.val, func(r rune) bool { + switch r { + case '.', 'e', 'E': + return true + } + return false + }) + for _, part := range parts { + if !numUnderscoresOK(part) { + p.panicf("Invalid float %q: underscores must be "+ + "surrounded by digits", it.val) + } + } + if !numPeriodsOK(it.val) { + // As a special case, numbers like '123.' or '1.e2', + // which are valid as far as Go/strconv are concerned, + // must be rejected because TOML says that a fractional + // part consists of '.' followed by 1+ digits. + p.panicf("Invalid float %q: '.' must be followed "+ + "by one or more digits", it.val) + } + val := strings.Replace(it.val, "_", "", -1) + num, err := strconv.ParseFloat(val, 64) + if err != nil { + if e, ok := err.(*strconv.NumError); ok && + e.Err == strconv.ErrRange { + + p.panicf("Float '%s' is out of the range of 64-bit "+ + "IEEE-754 floating-point numbers.", it.val) + } else { + p.panicf("Invalid float value: %q", it.val) + } + } + return num, p.typeOfPrimitive(it) + case itemDatetime: + var t time.Time + var ok bool + var err error + for _, format := range []string{ + "2006-01-02T15:04:05Z07:00", + "2006-01-02T15:04:05", + "2006-01-02", + } { + t, err = time.ParseInLocation(format, it.val, time.Local) + if err == nil { + ok = true + break + } + } + if !ok { + p.panicf("Invalid TOML Datetime: %q.", it.val) + } + return t, p.typeOfPrimitive(it) + case itemArray: + array := make([]interface{}, 0) + types := make([]tomlType, 0) + + for it = p.next(); it.typ != itemArrayEnd; it = p.next() { + if it.typ == itemCommentStart { + p.expect(itemText) + continue + } + + val, typ := p.value(it) + array = append(array, val) + types = append(types, typ) + } + return array, p.typeOfArray(types) + case itemInlineTableStart: + var ( + hash = make(map[string]interface{}) + outerContext = p.context + outerKey = p.currentKey + ) + + p.context = append(p.context, p.currentKey) + p.currentKey = "" + for it := p.next(); it.typ != itemInlineTableEnd; it = p.next() { + if it.typ != itemKeyStart { + p.bug("Expected key start but instead found %q, around line %d", + it.val, p.approxLine) + } + if it.typ == itemCommentStart { + p.expect(itemText) + continue + } + + // retrieve key + k := p.next() + p.approxLine = k.line + kname := p.keyString(k) + + // retrieve value + p.currentKey = kname + val, typ := p.value(p.next()) + // make sure we keep metadata up to date + p.setType(kname, typ) + p.ordered = append(p.ordered, p.context.add(p.currentKey)) + hash[kname] = val + } + p.context = outerContext + p.currentKey = outerKey + return hash, tomlHash + } + p.bug("Unexpected value type: %s", it.typ) + panic("unreachable") +} + +// numUnderscoresOK checks whether each underscore in s is surrounded by +// characters that are not underscores. +func numUnderscoresOK(s string) bool { + accept := false + for _, r := range s { + if r == '_' { + if !accept { + return false + } + accept = false + continue + } + accept = true + } + return accept +} + +// numPeriodsOK checks whether every period in s is followed by a digit. +func numPeriodsOK(s string) bool { + period := false + for _, r := range s { + if period && !isDigit(r) { + return false + } + period = r == '.' + } + return !period +} + +// establishContext sets the current context of the parser, +// where the context is either a hash or an array of hashes. Which one is +// set depends on the value of the `array` parameter. +// +// Establishing the context also makes sure that the key isn't a duplicate, and +// will create implicit hashes automatically. +func (p *parser) establishContext(key Key, array bool) { + var ok bool + + // Always start at the top level and drill down for our context. + hashContext := p.mapping + keyContext := make(Key, 0) + + // We only need implicit hashes for key[0:-1] + for _, k := range key[0 : len(key)-1] { + _, ok = hashContext[k] + keyContext = append(keyContext, k) + + // No key? Make an implicit hash and move on. + if !ok { + p.addImplicit(keyContext) + hashContext[k] = make(map[string]interface{}) + } + + // If the hash context is actually an array of tables, then set + // the hash context to the last element in that array. + // + // Otherwise, it better be a table, since this MUST be a key group (by + // virtue of it not being the last element in a key). + switch t := hashContext[k].(type) { + case []map[string]interface{}: + hashContext = t[len(t)-1] + case map[string]interface{}: + hashContext = t + default: + p.panicf("Key '%s' was already created as a hash.", keyContext) + } + } + + p.context = keyContext + if array { + // If this is the first element for this array, then allocate a new + // list of tables for it. + k := key[len(key)-1] + if _, ok := hashContext[k]; !ok { + hashContext[k] = make([]map[string]interface{}, 0, 5) + } + + // Add a new table. But make sure the key hasn't already been used + // for something else. + if hash, ok := hashContext[k].([]map[string]interface{}); ok { + hashContext[k] = append(hash, make(map[string]interface{})) + } else { + p.panicf("Key '%s' was already created and cannot be used as "+ + "an array.", keyContext) + } + } else { + p.setValue(key[len(key)-1], make(map[string]interface{})) + } + p.context = append(p.context, key[len(key)-1]) +} + +// setValue sets the given key to the given value in the current context. +// It will make sure that the key hasn't already been defined, account for +// implicit key groups. +func (p *parser) setValue(key string, value interface{}) { + var tmpHash interface{} + var ok bool + + hash := p.mapping + keyContext := make(Key, 0) + for _, k := range p.context { + keyContext = append(keyContext, k) + if tmpHash, ok = hash[k]; !ok { + p.bug("Context for key '%s' has not been established.", keyContext) + } + switch t := tmpHash.(type) { + case []map[string]interface{}: + // The context is a table of hashes. Pick the most recent table + // defined as the current hash. + hash = t[len(t)-1] + case map[string]interface{}: + hash = t + default: + p.bug("Expected hash to have type 'map[string]interface{}', but "+ + "it has '%T' instead.", tmpHash) + } + } + keyContext = append(keyContext, key) + + if _, ok := hash[key]; ok { + // Typically, if the given key has already been set, then we have + // to raise an error since duplicate keys are disallowed. However, + // it's possible that a key was previously defined implicitly. In this + // case, it is allowed to be redefined concretely. (See the + // `tests/valid/implicit-and-explicit-after.toml` test in `toml-test`.) + // + // But we have to make sure to stop marking it as an implicit. (So that + // another redefinition provokes an error.) + // + // Note that since it has already been defined (as a hash), we don't + // want to overwrite it. So our business is done. + if p.isImplicit(keyContext) { + p.removeImplicit(keyContext) + return + } + + // Otherwise, we have a concrete key trying to override a previous + // key, which is *always* wrong. + p.panicf("Key '%s' has already been defined.", keyContext) + } + hash[key] = value +} + +// setType sets the type of a particular value at a given key. +// It should be called immediately AFTER setValue. +// +// Note that if `key` is empty, then the type given will be applied to the +// current context (which is either a table or an array of tables). +func (p *parser) setType(key string, typ tomlType) { + keyContext := make(Key, 0, len(p.context)+1) + for _, k := range p.context { + keyContext = append(keyContext, k) + } + if len(key) > 0 { // allow type setting for hashes + keyContext = append(keyContext, key) + } + p.types[keyContext.String()] = typ +} + +// addImplicit sets the given Key as having been created implicitly. +func (p *parser) addImplicit(key Key) { + p.implicits[key.String()] = true +} + +// removeImplicit stops tagging the given key as having been implicitly +// created. +func (p *parser) removeImplicit(key Key) { + p.implicits[key.String()] = false +} + +// isImplicit returns true if the key group pointed to by the key was created +// implicitly. +func (p *parser) isImplicit(key Key) bool { + return p.implicits[key.String()] +} + +// current returns the full key name of the current context. +func (p *parser) current() string { + if len(p.currentKey) == 0 { + return p.context.String() + } + if len(p.context) == 0 { + return p.currentKey + } + return fmt.Sprintf("%s.%s", p.context, p.currentKey) +} + +func stripFirstNewline(s string) string { + if len(s) == 0 || s[0] != '\n' { + return s + } + return s[1:] +} + +func stripEscapedWhitespace(s string) string { + esc := strings.Split(s, "\\\n") + if len(esc) > 1 { + for i := 1; i < len(esc); i++ { + esc[i] = strings.TrimLeftFunc(esc[i], unicode.IsSpace) + } + } + return strings.Join(esc, "") +} + +func (p *parser) replaceEscapes(str string) string { + var replaced []rune + s := []byte(str) + r := 0 + for r < len(s) { + if s[r] != '\\' { + c, size := utf8.DecodeRune(s[r:]) + r += size + replaced = append(replaced, c) + continue + } + r += 1 + if r >= len(s) { + p.bug("Escape sequence at end of string.") + return "" + } + switch s[r] { + default: + p.bug("Expected valid escape code after \\, but got %q.", s[r]) + return "" + case 'b': + replaced = append(replaced, rune(0x0008)) + r += 1 + case 't': + replaced = append(replaced, rune(0x0009)) + r += 1 + case 'n': + replaced = append(replaced, rune(0x000A)) + r += 1 + case 'f': + replaced = append(replaced, rune(0x000C)) + r += 1 + case 'r': + replaced = append(replaced, rune(0x000D)) + r += 1 + case '"': + replaced = append(replaced, rune(0x0022)) + r += 1 + case '\\': + replaced = append(replaced, rune(0x005C)) + r += 1 + case 'u': + // At this point, we know we have a Unicode escape of the form + // `uXXXX` at [r, r+5). (Because the lexer guarantees this + // for us.) + escaped := p.asciiEscapeToUnicode(s[r+1 : r+5]) + replaced = append(replaced, escaped) + r += 5 + case 'U': + // At this point, we know we have a Unicode escape of the form + // `uXXXX` at [r, r+9). (Because the lexer guarantees this + // for us.) + escaped := p.asciiEscapeToUnicode(s[r+1 : r+9]) + replaced = append(replaced, escaped) + r += 9 + } + } + return string(replaced) +} + +func (p *parser) asciiEscapeToUnicode(bs []byte) rune { + s := string(bs) + hex, err := strconv.ParseUint(strings.ToLower(s), 16, 32) + if err != nil { + p.bug("Could not parse '%s' as a hexadecimal number, but the "+ + "lexer claims it's OK: %s", s, err) + } + if !utf8.ValidRune(rune(hex)) { + p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s) + } + return rune(hex) +} + +func isStringType(ty itemType) bool { + return ty == itemString || ty == itemMultilineString || + ty == itemRawString || ty == itemRawMultilineString +} diff --git a/vendor/github.com/BurntSushi/toml/session.vim b/vendor/github.com/BurntSushi/toml/session.vim new file mode 100644 index 00000000..562164be --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/session.vim @@ -0,0 +1 @@ +au BufWritePost *.go silent!make tags > /dev/null 2>&1 diff --git a/vendor/github.com/BurntSushi/toml/type_check.go b/vendor/github.com/BurntSushi/toml/type_check.go new file mode 100644 index 00000000..c73f8afc --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/type_check.go @@ -0,0 +1,91 @@ +package toml + +// tomlType represents any Go type that corresponds to a TOML type. +// While the first draft of the TOML spec has a simplistic type system that +// probably doesn't need this level of sophistication, we seem to be militating +// toward adding real composite types. +type tomlType interface { + typeString() string +} + +// typeEqual accepts any two types and returns true if they are equal. +func typeEqual(t1, t2 tomlType) bool { + if t1 == nil || t2 == nil { + return false + } + return t1.typeString() == t2.typeString() +} + +func typeIsHash(t tomlType) bool { + return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash) +} + +type tomlBaseType string + +func (btype tomlBaseType) typeString() string { + return string(btype) +} + +func (btype tomlBaseType) String() string { + return btype.typeString() +} + +var ( + tomlInteger tomlBaseType = "Integer" + tomlFloat tomlBaseType = "Float" + tomlDatetime tomlBaseType = "Datetime" + tomlString tomlBaseType = "String" + tomlBool tomlBaseType = "Bool" + tomlArray tomlBaseType = "Array" + tomlHash tomlBaseType = "Hash" + tomlArrayHash tomlBaseType = "ArrayHash" +) + +// typeOfPrimitive returns a tomlType of any primitive value in TOML. +// Primitive values are: Integer, Float, Datetime, String and Bool. +// +// Passing a lexer item other than the following will cause a BUG message +// to occur: itemString, itemBool, itemInteger, itemFloat, itemDatetime. +func (p *parser) typeOfPrimitive(lexItem item) tomlType { + switch lexItem.typ { + case itemInteger: + return tomlInteger + case itemFloat: + return tomlFloat + case itemDatetime: + return tomlDatetime + case itemString: + return tomlString + case itemMultilineString: + return tomlString + case itemRawString: + return tomlString + case itemRawMultilineString: + return tomlString + case itemBool: + return tomlBool + } + p.bug("Cannot infer primitive type of lex item '%s'.", lexItem) + panic("unreachable") +} + +// typeOfArray returns a tomlType for an array given a list of types of its +// values. +// +// In the current spec, if an array is homogeneous, then its type is always +// "Array". If the array is not homogeneous, an error is generated. +func (p *parser) typeOfArray(types []tomlType) tomlType { + // Empty arrays are cool. + if len(types) == 0 { + return tomlArray + } + + theType := types[0] + for _, t := range types[1:] { + if !typeEqual(theType, t) { + p.panicf("Array contains values of type '%s' and '%s', but "+ + "arrays must be homogeneous.", theType, t) + } + } + return tomlArray +} diff --git a/vendor/github.com/BurntSushi/toml/type_fields.go b/vendor/github.com/BurntSushi/toml/type_fields.go new file mode 100644 index 00000000..608997c2 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/type_fields.go @@ -0,0 +1,242 @@ +package toml + +// Struct field handling is adapted from code in encoding/json: +// +// 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 Go distribution. + +import ( + "reflect" + "sort" + "sync" +) + +// A field represents a single field found in a struct. +type field struct { + name string // the name of the field (`toml` tag included) + tag bool // whether field has a `toml` tag + index []int // represents the depth of an anonymous field + typ reflect.Type // the type of the field +} + +// byName sorts field by name, breaking ties with depth, +// then breaking ties with "name came from toml tag", then +// breaking ties with index sequence. +type byName []field + +func (x byName) Len() int { return len(x) } + +func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } + +func (x byName) Less(i, j int) bool { + if x[i].name != x[j].name { + return x[i].name < x[j].name + } + if len(x[i].index) != len(x[j].index) { + return len(x[i].index) < len(x[j].index) + } + if x[i].tag != x[j].tag { + return x[i].tag + } + return byIndex(x).Less(i, j) +} + +// byIndex sorts field by index sequence. +type byIndex []field + +func (x byIndex) Len() int { return len(x) } + +func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] } + +func (x byIndex) Less(i, j int) bool { + for k, xik := range x[i].index { + if k >= len(x[j].index) { + return false + } + if xik != x[j].index[k] { + return xik < x[j].index[k] + } + } + return len(x[i].index) < len(x[j].index) +} + +// typeFields returns a list of fields that TOML should recognize for the given +// type. The algorithm is breadth-first search over the set of structs to +// include - the top struct and then any reachable anonymous structs. +func typeFields(t reflect.Type) []field { + // Anonymous fields to explore at the current level and the next. + current := []field{} + next := []field{{typ: t}} + + // Count of queued names for current level and the next. + count := map[reflect.Type]int{} + nextCount := map[reflect.Type]int{} + + // Types already visited at an earlier level. + visited := map[reflect.Type]bool{} + + // Fields found. + var fields []field + + for len(next) > 0 { + current, next = next, current[:0] + count, nextCount = nextCount, map[reflect.Type]int{} + + for _, f := range current { + if visited[f.typ] { + continue + } + visited[f.typ] = true + + // Scan f.typ for fields to include. + for i := 0; i < f.typ.NumField(); i++ { + sf := f.typ.Field(i) + if sf.PkgPath != "" && !sf.Anonymous { // unexported + continue + } + opts := getOptions(sf.Tag) + if opts.skip { + continue + } + index := make([]int, len(f.index)+1) + copy(index, f.index) + index[len(f.index)] = i + + ft := sf.Type + if ft.Name() == "" && ft.Kind() == reflect.Ptr { + // Follow pointer. + ft = ft.Elem() + } + + // Record found field and index sequence. + if opts.name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct { + tagged := opts.name != "" + name := opts.name + if name == "" { + name = sf.Name + } + fields = append(fields, field{name, tagged, index, ft}) + if count[f.typ] > 1 { + // If there were multiple instances, add a second, + // so that the annihilation code will see a duplicate. + // It only cares about the distinction between 1 or 2, + // so don't bother generating any more copies. + fields = append(fields, fields[len(fields)-1]) + } + continue + } + + // Record new anonymous struct to explore in next round. + nextCount[ft]++ + if nextCount[ft] == 1 { + f := field{name: ft.Name(), index: index, typ: ft} + next = append(next, f) + } + } + } + } + + sort.Sort(byName(fields)) + + // Delete all fields that are hidden by the Go rules for embedded fields, + // except that fields with TOML tags are promoted. + + // The fields are sorted in primary order of name, secondary order + // of field index length. Loop over names; for each name, delete + // hidden fields by choosing the one dominant field that survives. + out := fields[:0] + for advance, i := 0, 0; i < len(fields); i += advance { + // One iteration per name. + // Find the sequence of fields with the name of this first field. + fi := fields[i] + name := fi.name + for advance = 1; i+advance < len(fields); advance++ { + fj := fields[i+advance] + if fj.name != name { + break + } + } + if advance == 1 { // Only one field with this name + out = append(out, fi) + continue + } + dominant, ok := dominantField(fields[i : i+advance]) + if ok { + out = append(out, dominant) + } + } + + fields = out + sort.Sort(byIndex(fields)) + + return fields +} + +// dominantField looks through the fields, all of which are known to +// have the same name, to find the single field that dominates the +// others using Go's embedding rules, modified by the presence of +// TOML tags. If there are multiple top-level fields, the boolean +// will be false: This condition is an error in Go and we skip all +// the fields. +func dominantField(fields []field) (field, bool) { + // The fields are sorted in increasing index-length order. The winner + // must therefore be one with the shortest index length. Drop all + // longer entries, which is easy: just truncate the slice. + length := len(fields[0].index) + tagged := -1 // Index of first tagged field. + for i, f := range fields { + if len(f.index) > length { + fields = fields[:i] + break + } + if f.tag { + if tagged >= 0 { + // Multiple tagged fields at the same level: conflict. + // Return no field. + return field{}, false + } + tagged = i + } + } + if tagged >= 0 { + return fields[tagged], true + } + // All remaining fields have the same length. If there's more than one, + // we have a conflict (two fields named "X" at the same level) and we + // return no field. + if len(fields) > 1 { + return field{}, false + } + return fields[0], true +} + +var fieldCache struct { + sync.RWMutex + m map[reflect.Type][]field +} + +// cachedTypeFields is like typeFields but uses a cache to avoid repeated work. +func cachedTypeFields(t reflect.Type) []field { + fieldCache.RLock() + f := fieldCache.m[t] + fieldCache.RUnlock() + if f != nil { + return f + } + + // Compute fields without lock. + // Might duplicate effort but won't hold other computations back. + f = typeFields(t) + if f == nil { + f = []field{} + } + + fieldCache.Lock() + if fieldCache.m == nil { + fieldCache.m = map[reflect.Type][]field{} + } + fieldCache.m[t] = f + fieldCache.Unlock() + return f +} diff --git a/vendor/github.com/MichaelTJones/pcg/LICENSE b/vendor/github.com/MichaelTJones/pcg/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/MichaelTJones/pcg/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/MichaelTJones/pcg/README.md b/vendor/github.com/MichaelTJones/pcg/README.md new file mode 100644 index 00000000..a9afca43 --- /dev/null +++ b/vendor/github.com/MichaelTJones/pcg/README.md @@ -0,0 +1,51 @@ +# pcg +Go implementation of Melissa O'Neill's excellent PCG pseudorandom number generator, which is +well-studied, excellent, and fast both to create and in execution. + +```` + Performance on a MacBook Pro: + + $ go test -v -bench=. + === RUN TestSanity32 + --- PASS: TestSanity32 (0.00s) + === RUN TestSum32 + --- PASS: TestSum32 (0.00s) + === RUN TestAdvance32 + --- PASS: TestAdvance32 (0.00s) + === RUN TestRetreat32 + --- PASS: TestRetreat32 (0.00s) + === RUN TestSanity64 + --- PASS: TestSanity64 (0.00s) + === RUN TestSum64 + --- PASS: TestSum64 (0.00s) + === RUN TestAdvance64 + --- PASS: TestAdvance64 (0.00s) + === RUN TestRetreat64 + --- PASS: TestRetreat64 (0.00s) + === RUN ExampleReport32 + --- PASS: ExampleReport32 (0.00s) + === RUN ExampleReport64 + --- PASS: ExampleReport64 (0.00s) + BenchmarkNew32-8 2000000000 1.09 ns/op + BenchmarkRandom32-8 1000000000 2.49 ns/op + BenchmarkBounded32-8 200000000 9.75 ns/op + BenchmarkNew64-8 200000000 6.89 ns/op + BenchmarkRandom64-8 200000000 7.58 ns/op + BenchmarkBounded64-8 50000000 25.5 ns/op +```` + +Provided under terms of the Apache license in keeping with Melissa O'Neill's original from which this was ported. + +Copyright 2018 Michael T. Jones + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/MichaelTJones/pcg/pcg32.go b/vendor/github.com/MichaelTJones/pcg/pcg32.go new file mode 100644 index 00000000..f4beb408 --- /dev/null +++ b/vendor/github.com/MichaelTJones/pcg/pcg32.go @@ -0,0 +1,86 @@ +package pcg + +// PCG Random Number Generation +// Developed by Melissa O'Neill +// Paper and details at http://www.pcg-random.org +// Ported to Go by Michael Jones + +// Copyright 2018 Michael T. Jones +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed +// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for +// the specific language governing permissions and limitations under the License. + +const ( + pcg32State = 0x853c49e6748fea9b // 9600629759793949339 + pcg32Increment = 0xda3e39cb94b95bdb // 15726070495360670683 + pcg32Multiplier = 0x5851f42d4c957f2d // 6364136223846793005 +) + +type PCG32 struct { + state uint64 + increment uint64 +} + +func NewPCG32() *PCG32 { + return &PCG32{pcg32State, pcg32Increment} +} + +func (p *PCG32) Seed(state, sequence uint64) *PCG32 { + p.increment = (sequence << 1) | 1 + p.state = (state+p.increment)*pcg32Multiplier + p.increment + return p +} + +func (p *PCG32) Random() uint32 { + // Advance 64-bit linear congruential generator to new state + oldState := p.state + p.state = oldState*pcg32Multiplier + p.increment + + // Confuse and permute 32-bit output from old state + xorShifted := uint32(((oldState >> 18) ^ oldState) >> 27) + rot := uint32(oldState >> 59) + return (xorShifted >> rot) | (xorShifted << ((-rot) & 31)) +} + +func (p *PCG32) Bounded(bound uint32) uint32 { + if bound == 0 { + return 0 + } + threshold := -bound % bound + for { + r := p.Random() + if r >= threshold { + return r % bound + } + } +} + +func (p *PCG32) Advance(delta uint64) *PCG32 { + p.state = p.advanceLCG64(p.state, delta, pcg32Multiplier, p.increment) + return p +} + +func (p *PCG32) Retreat(delta uint64) *PCG32 { + return p.Advance(-delta) +} + +func (p *PCG32) advanceLCG64(state, delta, curMult, curPlus uint64) uint64 { + accMult := uint64(1) + accPlus := uint64(0) + for delta > 0 { + if delta&1 != 0 { + accMult *= curMult + accPlus = accPlus*curMult + curPlus + } + curPlus = (curMult + 1) * curPlus + curMult *= curMult + delta /= 2 + } + return accMult*state + accPlus +} diff --git a/vendor/github.com/MichaelTJones/pcg/pcg64.go b/vendor/github.com/MichaelTJones/pcg/pcg64.go new file mode 100644 index 00000000..2190dafd --- /dev/null +++ b/vendor/github.com/MichaelTJones/pcg/pcg64.go @@ -0,0 +1,63 @@ +package pcg + +// PCG Random Number Generation +// Developed by Melissa O'Neill +// Paper and details at http://www.pcg-random.org +// Ported to Go by Michael Jones + +// Copyright 2018 Michael T. Jones +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed +// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for +// the specific language governing permissions and limitations under the License. + +type PCG64 struct { + lo *PCG32 + hi *PCG32 +} + +func NewPCG64() *PCG64 { + return &PCG64{NewPCG32(), NewPCG32()} +} + +func (p *PCG64) Seed(state1, state2, sequence1, sequence2 uint64) *PCG64 { + mask := ^uint64(0) >> 1 + if sequence1&mask == sequence2&mask { + sequence2 = ^sequence2 + } + p.lo.Seed(state1, sequence1) + p.hi.Seed(state2, sequence2) + return p +} + +func (p *PCG64) Random() uint64 { + return uint64(p.hi.Random())<<32 | uint64(p.lo.Random()) +} + +func (p *PCG64) Bounded(bound uint64) uint64 { + if bound == 0 { + return 0 + } + threshold := -bound % bound + for { + r := p.Random() + if r >= threshold { + return r % bound + } + } +} + +func (p *PCG64) Advance(delta uint64) *PCG64 { + p.lo.Advance(delta) + p.hi.Advance(delta) + return p +} + +func (p *PCG64) Retreat(delta uint64) *PCG64 { + return p.Advance(-delta) +} diff --git a/vendor/github.com/apache/thrift/LICENSE b/vendor/github.com/apache/thrift/LICENSE new file mode 100644 index 00000000..8d5e0822 --- /dev/null +++ b/vendor/github.com/apache/thrift/LICENSE @@ -0,0 +1,253 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +-------------------------------------------------- +SOFTWARE DISTRIBUTED WITH THRIFT: + +The Apache Thrift software includes a number of subcomponents with +separate copyright notices and license terms. Your use of the source +code for the these subcomponents is subject to the terms and +conditions of the following licenses. + +-------------------------------------------------- +Portions of the following files are licensed under the MIT License: + + lib/erl/src/Makefile.am + +Please see doc/otp-base-license.txt for the full terms of this license. + +-------------------------------------------------- +For the aclocal/ax_boost_base.m4 and contrib/fb303/aclocal/ax_boost_base.m4 components: + +# Copyright (c) 2007 Thomas Porschberg +# +# Copying and distribution of this file, with or without +# modification, are permitted in any medium without royalty provided +# the copyright notice and this notice are preserved. + +-------------------------------------------------- +For the compiler/cpp/src/thrift/md5.[ch] components: + +/* + Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@aladdin.com + + */ diff --git a/vendor/github.com/apache/thrift/NOTICE b/vendor/github.com/apache/thrift/NOTICE new file mode 100644 index 00000000..c23995a2 --- /dev/null +++ b/vendor/github.com/apache/thrift/NOTICE @@ -0,0 +1,5 @@ +Apache Thrift +Copyright 2006-2010 The Apache Software Foundation. + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). \ No newline at end of file diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/application_exception.go b/vendor/github.com/apache/thrift/lib/go/thrift/application_exception.go new file mode 100644 index 00000000..6655cc5a --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/application_exception.go @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +const ( + UNKNOWN_APPLICATION_EXCEPTION = 0 + UNKNOWN_METHOD = 1 + INVALID_MESSAGE_TYPE_EXCEPTION = 2 + WRONG_METHOD_NAME = 3 + BAD_SEQUENCE_ID = 4 + MISSING_RESULT = 5 + INTERNAL_ERROR = 6 + PROTOCOL_ERROR = 7 +) + +// Application level Thrift exception +type TApplicationException interface { + TException + TypeId() int32 + Read(iprot TProtocol) (TApplicationException, error) + Write(oprot TProtocol) error +} + +type tApplicationException struct { + message string + type_ int32 +} + +func (e tApplicationException) Error() string { + return e.message +} + +func NewTApplicationException(type_ int32, message string) TApplicationException { + return &tApplicationException{message, type_} +} + +func (p *tApplicationException) TypeId() int32 { + return p.type_ +} + +func (p *tApplicationException) Read(iprot TProtocol) (TApplicationException, error) { + _, err := iprot.ReadStructBegin() + if err != nil { + return nil, err + } + + message := "" + type_ := int32(UNKNOWN_APPLICATION_EXCEPTION) + + for { + _, ttype, id, err := iprot.ReadFieldBegin() + if err != nil { + return nil, err + } + if ttype == STOP { + break + } + switch id { + case 1: + if ttype == STRING { + if message, err = iprot.ReadString(); err != nil { + return nil, err + } + } else { + if err = SkipDefaultDepth(iprot, ttype); err != nil { + return nil, err + } + } + case 2: + if ttype == I32 { + if type_, err = iprot.ReadI32(); err != nil { + return nil, err + } + } else { + if err = SkipDefaultDepth(iprot, ttype); err != nil { + return nil, err + } + } + default: + if err = SkipDefaultDepth(iprot, ttype); err != nil { + return nil, err + } + } + if err = iprot.ReadFieldEnd(); err != nil { + return nil, err + } + } + return NewTApplicationException(type_, message), iprot.ReadStructEnd() +} + +func (p *tApplicationException) Write(oprot TProtocol) (err error) { + err = oprot.WriteStructBegin("TApplicationException") + if len(p.Error()) > 0 { + err = oprot.WriteFieldBegin("message", STRING, 1) + if err != nil { + return + } + err = oprot.WriteString(p.Error()) + if err != nil { + return + } + err = oprot.WriteFieldEnd() + if err != nil { + return + } + } + err = oprot.WriteFieldBegin("type", I32, 2) + if err != nil { + return + } + err = oprot.WriteI32(p.type_) + if err != nil { + return + } + err = oprot.WriteFieldEnd() + if err != nil { + return + } + err = oprot.WriteFieldStop() + if err != nil { + return + } + err = oprot.WriteStructEnd() + return +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/binary_protocol.go b/vendor/github.com/apache/thrift/lib/go/thrift/binary_protocol.go new file mode 100644 index 00000000..3dc42e45 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/binary_protocol.go @@ -0,0 +1,560 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "math" + "sync" +) + +// maxBytesPoolAlloc is the constant for how big the slices being allocated +// from the bytes pool are, if the bytes required is larger then they should +// not come from the pool. +var maxBytesPoolAlloc = 1024 + +// SetMaxBytesPoolAlloc sets the max bytes that are pooled for binary thrift +// fields and must be called before any thrift binary protocols are used +// since it is a global and is not thread safe to edit. +func SetMaxBytesPoolAlloc(size int) { + maxBytesPoolAlloc = size +} + +// MaxBytesPoolAlloc returns the current max bytes that are pooled for binary +// thrift fields. +func MaxBytesPoolAlloc() int { + return maxBytesPoolAlloc +} + +// BytesPoolPut is a public func to call to return pooled bytes to, each +// the capacity of BytesPoolAlloc. TBinaryProtocol.ReadBinary uses this pool +// to allocate from if the size of the bytes required to return is is equal or +// less than BytesPoolAlloc. +func BytesPoolPut(b []byte) bool { + if cap(b) != maxBytesPoolAlloc { + return false + } + element := bytesWrapperPool.Get().(*bytesWrapper) + element.value = b + bytesPool.Put(element) + return true +} + +// BytesPoolGet returns a pooled byte slice of capacity BytesPoolAlloc. +func BytesPoolGet() []byte { + element := bytesPool.Get().(*bytesWrapper) + result := element.value + element.value = nil + bytesWrapperPool.Put(element) + return result +} + +// bytesWrapper is used to wrap a byte slice to avoid allocing a interface{} +// when wrapping a byte slice which is usually passed on the stack +type bytesWrapper struct { + value []byte +} + +var bytesWrapperPool = sync.Pool{ + New: func() interface{} { + return &bytesWrapper{} + }, +} + +var bytesPool = sync.Pool{ + New: func() interface{} { + element := bytesWrapperPool.Get().(*bytesWrapper) + element.value = make([]byte, maxBytesPoolAlloc) + return element + }, +} + +type TBinaryProtocol struct { + trans TRichTransport + origTransport TTransport + reader io.Reader + writer io.Writer + strictRead bool + strictWrite bool + buffer [64]byte +} + +type TBinaryProtocolFactory struct { + strictRead bool + strictWrite bool +} + +func NewTBinaryProtocolTransport(t TTransport) *TBinaryProtocol { + return NewTBinaryProtocol(t, false, true) +} + +func NewTBinaryProtocol(t TTransport, strictRead, strictWrite bool) *TBinaryProtocol { + p := &TBinaryProtocol{origTransport: t, strictRead: strictRead, strictWrite: strictWrite} + if et, ok := t.(TRichTransport); ok { + p.trans = et + } else { + p.trans = NewTRichTransport(t) + } + p.reader = p.trans + p.writer = p.trans + return p +} + +func NewTBinaryProtocolFactoryDefault() *TBinaryProtocolFactory { + return NewTBinaryProtocolFactory(false, true) +} + +func NewTBinaryProtocolFactory(strictRead, strictWrite bool) *TBinaryProtocolFactory { + return &TBinaryProtocolFactory{strictRead: strictRead, strictWrite: strictWrite} +} + +func (p *TBinaryProtocolFactory) GetProtocol(t TTransport) TProtocol { + return NewTBinaryProtocol(t, p.strictRead, p.strictWrite) +} + +/** + * Writing Methods + */ + +func (p *TBinaryProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { + if p.strictWrite { + version := uint32(VERSION_1) | uint32(typeId) + e := p.WriteI32(int32(version)) + if e != nil { + return e + } + e = p.WriteString(name) + if e != nil { + return e + } + e = p.WriteI32(seqId) + return e + } else { + e := p.WriteString(name) + if e != nil { + return e + } + e = p.WriteByte(int8(typeId)) + if e != nil { + return e + } + e = p.WriteI32(seqId) + return e + } + return nil +} + +func (p *TBinaryProtocol) WriteMessageEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteStructBegin(name string) error { + return nil +} + +func (p *TBinaryProtocol) WriteStructEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + e := p.WriteByte(int8(typeId)) + if e != nil { + return e + } + e = p.WriteI16(id) + return e +} + +func (p *TBinaryProtocol) WriteFieldEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteFieldStop() error { + e := p.WriteByte(STOP) + return e +} + +func (p *TBinaryProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + e := p.WriteByte(int8(keyType)) + if e != nil { + return e + } + e = p.WriteByte(int8(valueType)) + if e != nil { + return e + } + e = p.WriteI32(int32(size)) + return e +} + +func (p *TBinaryProtocol) WriteMapEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteListBegin(elemType TType, size int) error { + e := p.WriteByte(int8(elemType)) + if e != nil { + return e + } + e = p.WriteI32(int32(size)) + return e +} + +func (p *TBinaryProtocol) WriteListEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteSetBegin(elemType TType, size int) error { + e := p.WriteByte(int8(elemType)) + if e != nil { + return e + } + e = p.WriteI32(int32(size)) + return e +} + +func (p *TBinaryProtocol) WriteSetEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteBool(value bool) error { + if value { + return p.WriteByte(1) + } + return p.WriteByte(0) +} + +func (p *TBinaryProtocol) WriteByte(value int8) error { + e := p.trans.WriteByte(byte(value)) + return NewTProtocolException(e) +} + +func (p *TBinaryProtocol) WriteI16(value int16) error { + v := p.buffer[0:2] + binary.BigEndian.PutUint16(v, uint16(value)) + _, e := p.writer.Write(v) + return NewTProtocolException(e) +} + +func (p *TBinaryProtocol) WriteI32(value int32) error { + v := p.buffer[0:4] + binary.BigEndian.PutUint32(v, uint32(value)) + _, e := p.writer.Write(v) + return NewTProtocolException(e) +} + +func (p *TBinaryProtocol) WriteI64(value int64) error { + v := p.buffer[0:8] + binary.BigEndian.PutUint64(v, uint64(value)) + _, err := p.writer.Write(v) + return NewTProtocolException(err) +} + +func (p *TBinaryProtocol) WriteDouble(value float64) error { + return p.WriteI64(int64(math.Float64bits(value))) +} + +func (p *TBinaryProtocol) WriteString(value string) error { + e := p.WriteI32(int32(len(value))) + if e != nil { + return e + } + _, err := p.trans.WriteString(value) + return NewTProtocolException(err) +} + +func (p *TBinaryProtocol) WriteBinary(value []byte) error { + e := p.WriteI32(int32(len(value))) + if e != nil { + return e + } + _, err := p.writer.Write(value) + return NewTProtocolException(err) +} + +/** + * Reading methods + */ + +func (p *TBinaryProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + size, e := p.ReadI32() + if e != nil { + return "", typeId, 0, NewTProtocolException(e) + } + if size < 0 { + typeId = TMessageType(size & 0x0ff) + version := int64(int64(size) & VERSION_MASK) + if version != VERSION_1 { + return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Bad version in ReadMessageBegin")) + } + name, e = p.ReadString() + if e != nil { + return name, typeId, seqId, NewTProtocolException(e) + } + seqId, e = p.ReadI32() + if e != nil { + return name, typeId, seqId, NewTProtocolException(e) + } + return name, typeId, seqId, nil + } + if p.strictRead { + return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Missing version in ReadMessageBegin")) + } + name, e2 := p.readStringBody(size) + if e2 != nil { + return name, typeId, seqId, e2 + } + b, e3 := p.ReadByte() + if e3 != nil { + return name, typeId, seqId, e3 + } + typeId = TMessageType(b) + seqId, e4 := p.ReadI32() + if e4 != nil { + return name, typeId, seqId, e4 + } + return name, typeId, seqId, nil +} + +func (p *TBinaryProtocol) ReadMessageEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadStructBegin() (name string, err error) { + return +} + +func (p *TBinaryProtocol) ReadStructEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadFieldBegin() (name string, typeId TType, seqId int16, err error) { + t, err := p.ReadByte() + typeId = TType(t) + if err != nil { + return name, typeId, seqId, err + } + if t != STOP { + seqId, err = p.ReadI16() + } + return name, typeId, seqId, err +} + +func (p *TBinaryProtocol) ReadFieldEnd() error { + return nil +} + +var invalidDataLength = NewTProtocolExceptionWithType(INVALID_DATA, errors.New("Invalid data length")) + +func (p *TBinaryProtocol) ReadMapBegin() (kType, vType TType, size int, err error) { + k, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + kType = TType(k) + v, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + vType = TType(v) + size32, e := p.ReadI32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + return kType, vType, size, nil +} + +func (p *TBinaryProtocol) ReadMapEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadListBegin() (elemType TType, size int, err error) { + b, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + elemType = TType(b) + size32, e := p.ReadI32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + + return +} + +func (p *TBinaryProtocol) ReadListEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadSetBegin() (elemType TType, size int, err error) { + b, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + elemType = TType(b) + size32, e := p.ReadI32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + return elemType, size, nil +} + +func (p *TBinaryProtocol) ReadSetEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadBool() (bool, error) { + b, e := p.ReadByte() + v := true + if b != 1 { + v = false + } + return v, e +} + +func (p *TBinaryProtocol) ReadByte() (int8, error) { + v, err := p.trans.ReadByte() + return int8(v), err +} + +func (p *TBinaryProtocol) ReadI16() (value int16, err error) { + buf := p.buffer[0:2] + err = p.readAll(buf) + value = int16(binary.BigEndian.Uint16(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadI32() (value int32, err error) { + buf := p.buffer[0:4] + err = p.readAll(buf) + value = int32(binary.BigEndian.Uint32(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadI64() (value int64, err error) { + buf := p.buffer[0:8] + err = p.readAll(buf) + value = int64(binary.BigEndian.Uint64(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadDouble() (value float64, err error) { + buf := p.buffer[0:8] + err = p.readAll(buf) + value = math.Float64frombits(binary.BigEndian.Uint64(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadString() (value string, err error) { + size, e := p.ReadI32() + if e != nil { + return "", e + } + if size < 0 { + err = invalidDataLength + return + } + + return p.readStringBody(size) +} + +func (p *TBinaryProtocol) ReadBinary() ([]byte, error) { + size, e := p.ReadI32() + if e != nil { + return nil, e + } + if size < 0 { + return nil, invalidDataLength + } + if uint64(size) > p.trans.RemainingBytes() { + return nil, invalidDataLength + } + + isize := int(size) + + var buf []byte + if isize <= maxBytesPoolAlloc { + buf = BytesPoolGet()[:isize] + } else { + buf = make([]byte, isize) + } + + _, err := io.ReadFull(p.trans, buf) + return buf, NewTProtocolException(err) +} + +func (p *TBinaryProtocol) Flush() (err error) { + return NewTProtocolException(p.trans.Flush()) +} + +func (p *TBinaryProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TBinaryProtocol) Transport() TTransport { + return p.origTransport +} + +func (p *TBinaryProtocol) readAll(buf []byte) error { + _, err := io.ReadFull(p.reader, buf) + return NewTProtocolException(err) +} + +func (p *TBinaryProtocol) readStringBody(size int32) (value string, err error) { + if size < 0 { + return "", nil + } + if uint64(size) > p.trans.RemainingBytes() { + return "", invalidDataLength + } + var buf []byte + if int(size) <= len(p.buffer) { + buf = p.buffer[0:size] + } else { + buf = make([]byte, size) + } + _, e := io.ReadFull(p.trans, buf) + return string(buf), NewTProtocolException(e) +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/buffered_transport.go b/vendor/github.com/apache/thrift/lib/go/thrift/buffered_transport.go new file mode 100644 index 00000000..8bcad1e8 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/buffered_transport.go @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bufio" +) + +type TBufferedTransportFactory struct { + size int +} + +type TBufferedTransport struct { + bufio.ReadWriter + tp TTransport +} + +func (p *TBufferedTransportFactory) GetTransport(trans TTransport) TTransport { + return NewTBufferedTransport(trans, p.size) +} + +func NewTBufferedTransportFactory(bufferSize int) *TBufferedTransportFactory { + return &TBufferedTransportFactory{size: bufferSize} +} + +func NewTBufferedTransport(trans TTransport, bufferSize int) *TBufferedTransport { + return &TBufferedTransport{ + ReadWriter: bufio.ReadWriter{ + Reader: bufio.NewReaderSize(trans, bufferSize), + Writer: bufio.NewWriterSize(trans, bufferSize), + }, + tp: trans, + } +} + +func (p *TBufferedTransport) IsOpen() bool { + return p.tp.IsOpen() +} + +func (p *TBufferedTransport) Open() (err error) { + return p.tp.Open() +} + +func (p *TBufferedTransport) Close() (err error) { + return p.tp.Close() +} + +func (p *TBufferedTransport) Flush() error { + if err := p.ReadWriter.Flush(); err != nil { + return err + } + return p.tp.Flush() +} + +func (p *TBufferedTransport) RemainingBytes() (num_bytes uint64) { + return p.tp.RemainingBytes() +} + diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/compact_protocol.go b/vendor/github.com/apache/thrift/lib/go/thrift/compact_protocol.go new file mode 100644 index 00000000..0bc5fdde --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/compact_protocol.go @@ -0,0 +1,815 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "encoding/binary" + "fmt" + "io" + "math" +) + +const ( + COMPACT_PROTOCOL_ID = 0x082 + COMPACT_VERSION = 1 + COMPACT_VERSION_MASK = 0x1f + COMPACT_TYPE_MASK = 0x0E0 + COMPACT_TYPE_BITS = 0x07 + COMPACT_TYPE_SHIFT_AMOUNT = 5 +) + +type tCompactType byte + +const ( + COMPACT_BOOLEAN_TRUE = 0x01 + COMPACT_BOOLEAN_FALSE = 0x02 + COMPACT_BYTE = 0x03 + COMPACT_I16 = 0x04 + COMPACT_I32 = 0x05 + COMPACT_I64 = 0x06 + COMPACT_DOUBLE = 0x07 + COMPACT_BINARY = 0x08 + COMPACT_LIST = 0x09 + COMPACT_SET = 0x0A + COMPACT_MAP = 0x0B + COMPACT_STRUCT = 0x0C +) + +var ( + ttypeToCompactType map[TType]tCompactType +) + +func init() { + ttypeToCompactType = map[TType]tCompactType{ + STOP: STOP, + BOOL: COMPACT_BOOLEAN_TRUE, + BYTE: COMPACT_BYTE, + I16: COMPACT_I16, + I32: COMPACT_I32, + I64: COMPACT_I64, + DOUBLE: COMPACT_DOUBLE, + STRING: COMPACT_BINARY, + LIST: COMPACT_LIST, + SET: COMPACT_SET, + MAP: COMPACT_MAP, + STRUCT: COMPACT_STRUCT, + } +} + +type TCompactProtocolFactory struct{} + +func NewTCompactProtocolFactory() *TCompactProtocolFactory { + return &TCompactProtocolFactory{} +} + +func (p *TCompactProtocolFactory) GetProtocol(trans TTransport) TProtocol { + return NewTCompactProtocol(trans) +} + +type TCompactProtocol struct { + trans TRichTransport + origTransport TTransport + + // Used to keep track of the last field for the current and previous structs, + // so we can do the delta stuff. + lastField []int + lastFieldId int + + // If we encounter a boolean field begin, save the TField here so it can + // have the value incorporated. + booleanFieldName string + booleanFieldId int16 + booleanFieldPending bool + + // If we read a field header, and it's a boolean field, save the boolean + // value here so that readBool can use it. + boolValue bool + boolValueIsNotNull bool + buffer [64]byte +} + +// Create a TCompactProtocol given a TTransport +func NewTCompactProtocol(trans TTransport) *TCompactProtocol { + p := &TCompactProtocol{origTransport: trans, lastField: []int{}} + if et, ok := trans.(TRichTransport); ok { + p.trans = et + } else { + p.trans = NewTRichTransport(trans) + } + + return p + +} + +// +// Public Writing methods. +// + +// Write a message header to the wire. Compact Protocol messages contain the +// protocol version so we can migrate forwards in the future if need be. +func (p *TCompactProtocol) WriteMessageBegin(name string, typeId TMessageType, seqid int32) error { + err := p.writeByteDirect(COMPACT_PROTOCOL_ID) + if err != nil { + return NewTProtocolException(err) + } + err = p.writeByteDirect((COMPACT_VERSION & COMPACT_VERSION_MASK) | ((byte(typeId) << COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_MASK)) + if err != nil { + return NewTProtocolException(err) + } + _, err = p.writeVarint32(seqid) + if err != nil { + return NewTProtocolException(err) + } + e := p.WriteString(name) + return e + +} + +func (p *TCompactProtocol) WriteMessageEnd() error { return nil } + +// Write a struct begin. This doesn't actually put anything on the wire. We +// use it as an opportunity to put special placeholder markers on the field +// stack so we can get the field id deltas correct. +func (p *TCompactProtocol) WriteStructBegin(name string) error { + p.lastField = append(p.lastField, p.lastFieldId) + p.lastFieldId = 0 + return nil +} + +// Write a struct end. This doesn't actually put anything on the wire. We use +// this as an opportunity to pop the last field from the current struct off +// of the field stack. +func (p *TCompactProtocol) WriteStructEnd() error { + p.lastFieldId = p.lastField[len(p.lastField)-1] + p.lastField = p.lastField[:len(p.lastField)-1] + return nil +} + +func (p *TCompactProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + if typeId == BOOL { + // we want to possibly include the value, so we'll wait. + p.booleanFieldName, p.booleanFieldId, p.booleanFieldPending = name, id, true + return nil + } + _, err := p.writeFieldBeginInternal(name, typeId, id, 0xFF) + return NewTProtocolException(err) +} + +// The workhorse of writeFieldBegin. It has the option of doing a +// 'type override' of the type header. This is used specifically in the +// boolean field case. +func (p *TCompactProtocol) writeFieldBeginInternal(name string, typeId TType, id int16, typeOverride byte) (int, error) { + // short lastField = lastField_.pop(); + + // if there's a type override, use that. + var typeToWrite byte + if typeOverride == 0xFF { + typeToWrite = byte(p.getCompactType(typeId)) + } else { + typeToWrite = typeOverride + } + // check if we can use delta encoding for the field id + fieldId := int(id) + written := 0 + if fieldId > p.lastFieldId && fieldId-p.lastFieldId <= 15 { + // write them together + err := p.writeByteDirect(byte((fieldId-p.lastFieldId)<<4) | typeToWrite) + if err != nil { + return 0, err + } + } else { + // write them separate + err := p.writeByteDirect(typeToWrite) + if err != nil { + return 0, err + } + err = p.WriteI16(id) + written = 1 + 2 + if err != nil { + return 0, err + } + } + + p.lastFieldId = fieldId + // p.lastField.Push(field.id); + return written, nil +} + +func (p *TCompactProtocol) WriteFieldEnd() error { return nil } + +func (p *TCompactProtocol) WriteFieldStop() error { + err := p.writeByteDirect(STOP) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + if size == 0 { + err := p.writeByteDirect(0) + return NewTProtocolException(err) + } + _, err := p.writeVarint32(int32(size)) + if err != nil { + return NewTProtocolException(err) + } + err = p.writeByteDirect(byte(p.getCompactType(keyType))<<4 | byte(p.getCompactType(valueType))) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteMapEnd() error { return nil } + +// Write a list header. +func (p *TCompactProtocol) WriteListBegin(elemType TType, size int) error { + _, err := p.writeCollectionBegin(elemType, size) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteListEnd() error { return nil } + +// Write a set header. +func (p *TCompactProtocol) WriteSetBegin(elemType TType, size int) error { + _, err := p.writeCollectionBegin(elemType, size) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteSetEnd() error { return nil } + +func (p *TCompactProtocol) WriteBool(value bool) error { + v := byte(COMPACT_BOOLEAN_FALSE) + if value { + v = byte(COMPACT_BOOLEAN_TRUE) + } + if p.booleanFieldPending { + // we haven't written the field header yet + _, err := p.writeFieldBeginInternal(p.booleanFieldName, BOOL, p.booleanFieldId, v) + p.booleanFieldPending = false + return NewTProtocolException(err) + } + // we're not part of a field, so just write the value. + err := p.writeByteDirect(v) + return NewTProtocolException(err) +} + +// Write a byte. Nothing to see here! +func (p *TCompactProtocol) WriteByte(value int8) error { + err := p.writeByteDirect(byte(value)) + return NewTProtocolException(err) +} + +// Write an I16 as a zigzag varint. +func (p *TCompactProtocol) WriteI16(value int16) error { + _, err := p.writeVarint32(p.int32ToZigzag(int32(value))) + return NewTProtocolException(err) +} + +// Write an i32 as a zigzag varint. +func (p *TCompactProtocol) WriteI32(value int32) error { + _, err := p.writeVarint32(p.int32ToZigzag(value)) + return NewTProtocolException(err) +} + +// Write an i64 as a zigzag varint. +func (p *TCompactProtocol) WriteI64(value int64) error { + _, err := p.writeVarint64(p.int64ToZigzag(value)) + return NewTProtocolException(err) +} + +// Write a double to the wire as 8 bytes. +func (p *TCompactProtocol) WriteDouble(value float64) error { + buf := p.buffer[0:8] + binary.LittleEndian.PutUint64(buf, math.Float64bits(value)) + _, err := p.trans.Write(buf) + return NewTProtocolException(err) +} + +// Write a string to the wire with a varint size preceding. +func (p *TCompactProtocol) WriteString(value string) error { + _, e := p.writeVarint32(int32(len(value))) + if e != nil { + return NewTProtocolException(e) + } + if len(value) > 0 { + } + _, e = p.trans.WriteString(value) + return e +} + +// Write a byte array, using a varint for the size. +func (p *TCompactProtocol) WriteBinary(bin []byte) error { + _, e := p.writeVarint32(int32(len(bin))) + if e != nil { + return NewTProtocolException(e) + } + if len(bin) > 0 { + _, e = p.trans.Write(bin) + return NewTProtocolException(e) + } + return nil +} + +// +// Reading methods. +// + +// Read a message header. +func (p *TCompactProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + + protocolId, err := p.readByteDirect() + if err != nil { + return + } + + if protocolId != COMPACT_PROTOCOL_ID { + e := fmt.Errorf("Expected protocol id %02x but got %02x", COMPACT_PROTOCOL_ID, protocolId) + return "", typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, e) + } + + versionAndType, err := p.readByteDirect() + if err != nil { + return + } + + version := versionAndType & COMPACT_VERSION_MASK + typeId = TMessageType((versionAndType >> COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_BITS) + if version != COMPACT_VERSION { + e := fmt.Errorf("Expected version %02x but got %02x", COMPACT_VERSION, version) + err = NewTProtocolExceptionWithType(BAD_VERSION, e) + return + } + seqId, e := p.readVarint32() + if e != nil { + err = NewTProtocolException(e) + return + } + name, err = p.ReadString() + return +} + +func (p *TCompactProtocol) ReadMessageEnd() error { return nil } + +// Read a struct begin. There's nothing on the wire for this, but it is our +// opportunity to push a new struct begin marker onto the field stack. +func (p *TCompactProtocol) ReadStructBegin() (name string, err error) { + p.lastField = append(p.lastField, p.lastFieldId) + p.lastFieldId = 0 + return +} + +// Doesn't actually consume any wire data, just removes the last field for +// this struct from the field stack. +func (p *TCompactProtocol) ReadStructEnd() error { + // consume the last field we read off the wire. + p.lastFieldId = p.lastField[len(p.lastField)-1] + p.lastField = p.lastField[:len(p.lastField)-1] + return nil +} + +// Read a field header off the wire. +func (p *TCompactProtocol) ReadFieldBegin() (name string, typeId TType, id int16, err error) { + t, err := p.readByteDirect() + if err != nil { + return + } + + // if it's a stop, then we can return immediately, as the struct is over. + if (t & 0x0f) == STOP { + return "", STOP, 0, nil + } + + // mask off the 4 MSB of the type header. it could contain a field id delta. + modifier := int16((t & 0xf0) >> 4) + if modifier == 0 { + // not a delta. look ahead for the zigzag varint field id. + id, err = p.ReadI16() + if err != nil { + return + } + } else { + // has a delta. add the delta to the last read field id. + id = int16(p.lastFieldId) + modifier + } + typeId, e := p.getTType(tCompactType(t & 0x0f)) + if e != nil { + err = NewTProtocolException(e) + return + } + + // if this happens to be a boolean field, the value is encoded in the type + if p.isBoolType(t) { + // save the boolean value in a special instance variable. + p.boolValue = (byte(t)&0x0f == COMPACT_BOOLEAN_TRUE) + p.boolValueIsNotNull = true + } + + // push the new field onto the field stack so we can keep the deltas going. + p.lastFieldId = int(id) + return +} + +func (p *TCompactProtocol) ReadFieldEnd() error { return nil } + +// Read a map header off the wire. If the size is zero, skip reading the key +// and value type. This means that 0-length maps will yield TMaps without the +// "correct" types. +func (p *TCompactProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, err error) { + size32, e := p.readVarint32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + + keyAndValueType := byte(STOP) + if size != 0 { + keyAndValueType, err = p.readByteDirect() + if err != nil { + return + } + } + keyType, _ = p.getTType(tCompactType(keyAndValueType >> 4)) + valueType, _ = p.getTType(tCompactType(keyAndValueType & 0xf)) + return +} + +func (p *TCompactProtocol) ReadMapEnd() error { return nil } + +// Read a list header off the wire. If the list size is 0-14, the size will +// be packed into the element type header. If it's a longer list, the 4 MSB +// of the element type header will be 0xF, and a varint will follow with the +// true size. +func (p *TCompactProtocol) ReadListBegin() (elemType TType, size int, err error) { + size_and_type, err := p.readByteDirect() + if err != nil { + return + } + size = int((size_and_type >> 4) & 0x0f) + if size == 15 { + size2, e := p.readVarint32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size2 < 0 { + err = invalidDataLength + return + } + size = int(size2) + } + elemType, e := p.getTType(tCompactType(size_and_type)) + if e != nil { + err = NewTProtocolException(e) + return + } + return +} + +func (p *TCompactProtocol) ReadListEnd() error { return nil } + +// Read a set header off the wire. If the set size is 0-14, the size will +// be packed into the element type header. If it's a longer set, the 4 MSB +// of the element type header will be 0xF, and a varint will follow with the +// true size. +func (p *TCompactProtocol) ReadSetBegin() (elemType TType, size int, err error) { + return p.ReadListBegin() +} + +func (p *TCompactProtocol) ReadSetEnd() error { return nil } + +// Read a boolean off the wire. If this is a boolean field, the value should +// already have been read during readFieldBegin, so we'll just consume the +// pre-stored value. Otherwise, read a byte. +func (p *TCompactProtocol) ReadBool() (value bool, err error) { + if p.boolValueIsNotNull { + p.boolValueIsNotNull = false + return p.boolValue, nil + } + v, err := p.readByteDirect() + return v == COMPACT_BOOLEAN_TRUE, err +} + +// Read a single byte off the wire. Nothing interesting here. +func (p *TCompactProtocol) ReadByte() (int8, error) { + v, err := p.readByteDirect() + if err != nil { + return 0, NewTProtocolException(err) + } + return int8(v), err +} + +// Read an i16 from the wire as a zigzag varint. +func (p *TCompactProtocol) ReadI16() (value int16, err error) { + v, err := p.ReadI32() + return int16(v), err +} + +// Read an i32 from the wire as a zigzag varint. +func (p *TCompactProtocol) ReadI32() (value int32, err error) { + v, e := p.readVarint32() + if e != nil { + return 0, NewTProtocolException(e) + } + value = p.zigzagToInt32(v) + return value, nil +} + +// Read an i64 from the wire as a zigzag varint. +func (p *TCompactProtocol) ReadI64() (value int64, err error) { + v, e := p.readVarint64() + if e != nil { + return 0, NewTProtocolException(e) + } + value = p.zigzagToInt64(v) + return value, nil +} + +// No magic here - just read a double off the wire. +func (p *TCompactProtocol) ReadDouble() (value float64, err error) { + longBits := p.buffer[0:8] + _, e := io.ReadFull(p.trans, longBits) + if e != nil { + return 0.0, NewTProtocolException(e) + } + return math.Float64frombits(p.bytesToUint64(longBits)), nil +} + +// Reads a []byte (via readBinary), and then UTF-8 decodes it. +func (p *TCompactProtocol) ReadString() (value string, err error) { + length, e := p.readVarint32() + if e != nil { + return "", NewTProtocolException(e) + } + if length < 0 { + return "", invalidDataLength + } + if uint64(length) > p.trans.RemainingBytes() { + return "", invalidDataLength + } + + if length == 0 { + return "", nil + } + var buf []byte + if length <= int32(len(p.buffer)) { + buf = p.buffer[0:length] + } else { + buf = make([]byte, length) + } + _, e = io.ReadFull(p.trans, buf) + return string(buf), NewTProtocolException(e) +} + +// Read a []byte from the wire. +func (p *TCompactProtocol) ReadBinary() (value []byte, err error) { + length, e := p.readVarint32() + if e != nil { + return nil, NewTProtocolException(e) + } + if length == 0 { + return []byte{}, nil + } + if length < 0 { + return nil, invalidDataLength + } + if uint64(length) > p.trans.RemainingBytes() { + return nil, invalidDataLength + } + + buf := make([]byte, length) + _, e = io.ReadFull(p.trans, buf) + return buf, NewTProtocolException(e) +} + +func (p *TCompactProtocol) Flush() (err error) { + return NewTProtocolException(p.trans.Flush()) +} + +func (p *TCompactProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TCompactProtocol) Transport() TTransport { + return p.origTransport +} + +// +// Internal writing methods +// + +// Abstract method for writing the start of lists and sets. List and sets on +// the wire differ only by the type indicator. +func (p *TCompactProtocol) writeCollectionBegin(elemType TType, size int) (int, error) { + if size <= 14 { + return 1, p.writeByteDirect(byte(int32(size<<4) | int32(p.getCompactType(elemType)))) + } + err := p.writeByteDirect(0xf0 | byte(p.getCompactType(elemType))) + if err != nil { + return 0, err + } + m, err := p.writeVarint32(int32(size)) + return 1 + m, err +} + +// Write an i32 as a varint. Results in 1-5 bytes on the wire. +// TODO(pomack): make a permanent buffer like writeVarint64? +func (p *TCompactProtocol) writeVarint32(n int32) (int, error) { + i32buf := p.buffer[0:5] + idx := 0 + for { + if (n & ^0x7F) == 0 { + i32buf[idx] = byte(n) + idx++ + // p.writeByteDirect(byte(n)); + break + // return; + } else { + i32buf[idx] = byte((n & 0x7F) | 0x80) + idx++ + // p.writeByteDirect(byte(((n & 0x7F) | 0x80))); + u := uint32(n) + n = int32(u >> 7) + } + } + return p.trans.Write(i32buf[0:idx]) +} + +// Write an i64 as a varint. Results in 1-10 bytes on the wire. +func (p *TCompactProtocol) writeVarint64(n int64) (int, error) { + varint64out := p.buffer[0:10] + idx := 0 + for { + if (n & ^0x7F) == 0 { + varint64out[idx] = byte(n) + idx++ + break + } else { + varint64out[idx] = byte((n & 0x7F) | 0x80) + idx++ + u := uint64(n) + n = int64(u >> 7) + } + } + return p.trans.Write(varint64out[0:idx]) +} + +// Convert l into a zigzag long. This allows negative numbers to be +// represented compactly as a varint. +func (p *TCompactProtocol) int64ToZigzag(l int64) int64 { + return (l << 1) ^ (l >> 63) +} + +// Convert l into a zigzag long. This allows negative numbers to be +// represented compactly as a varint. +func (p *TCompactProtocol) int32ToZigzag(n int32) int32 { + return (n << 1) ^ (n >> 31) +} + +func (p *TCompactProtocol) fixedUint64ToBytes(n uint64, buf []byte) { + binary.LittleEndian.PutUint64(buf, n) +} + +func (p *TCompactProtocol) fixedInt64ToBytes(n int64, buf []byte) { + binary.LittleEndian.PutUint64(buf, uint64(n)) +} + +// Writes a byte without any possibility of all that field header nonsense. +// Used internally by other writing methods that know they need to write a byte. +func (p *TCompactProtocol) writeByteDirect(b byte) error { + return p.trans.WriteByte(b) +} + +// Writes a byte without any possibility of all that field header nonsense. +func (p *TCompactProtocol) writeIntAsByteDirect(n int) (int, error) { + return 1, p.writeByteDirect(byte(n)) +} + +// +// Internal reading methods +// + +// Read an i32 from the wire as a varint. The MSB of each byte is set +// if there is another byte to follow. This can read up to 5 bytes. +func (p *TCompactProtocol) readVarint32() (int32, error) { + // if the wire contains the right stuff, this will just truncate the i64 we + // read and get us the right sign. + v, err := p.readVarint64() + return int32(v), err +} + +// Read an i64 from the wire as a proper varint. The MSB of each byte is set +// if there is another byte to follow. This can read up to 10 bytes. +func (p *TCompactProtocol) readVarint64() (int64, error) { + shift := uint(0) + result := int64(0) + for { + b, err := p.readByteDirect() + if err != nil { + return 0, err + } + result |= int64(b&0x7f) << shift + if (b & 0x80) != 0x80 { + break + } + shift += 7 + } + return result, nil +} + +// Read a byte, unlike ReadByte that reads Thrift-byte that is i8. +func (p *TCompactProtocol) readByteDirect() (byte, error) { + return p.trans.ReadByte() +} + +// +// encoding helpers +// + +// Convert from zigzag int to int. +func (p *TCompactProtocol) zigzagToInt32(n int32) int32 { + u := uint32(n) + return int32(u>>1) ^ -(n & 1) +} + +// Convert from zigzag long to long. +func (p *TCompactProtocol) zigzagToInt64(n int64) int64 { + u := uint64(n) + return int64(u>>1) ^ -(n & 1) +} + +// Note that it's important that the mask bytes are long literals, +// otherwise they'll default to ints, and when you shift an int left 56 bits, +// you just get a messed up int. +func (p *TCompactProtocol) bytesToInt64(b []byte) int64 { + return int64(binary.LittleEndian.Uint64(b)) +} + +// Note that it's important that the mask bytes are long literals, +// otherwise they'll default to ints, and when you shift an int left 56 bits, +// you just get a messed up int. +func (p *TCompactProtocol) bytesToUint64(b []byte) uint64 { + return binary.LittleEndian.Uint64(b) +} + +// +// type testing and converting +// + +func (p *TCompactProtocol) isBoolType(b byte) bool { + return (b&0x0f) == COMPACT_BOOLEAN_TRUE || (b&0x0f) == COMPACT_BOOLEAN_FALSE +} + +// Given a tCompactType constant, convert it to its corresponding +// TType value. +func (p *TCompactProtocol) getTType(t tCompactType) (TType, error) { + switch byte(t) & 0x0f { + case STOP: + return STOP, nil + case COMPACT_BOOLEAN_FALSE, COMPACT_BOOLEAN_TRUE: + return BOOL, nil + case COMPACT_BYTE: + return BYTE, nil + case COMPACT_I16: + return I16, nil + case COMPACT_I32: + return I32, nil + case COMPACT_I64: + return I64, nil + case COMPACT_DOUBLE: + return DOUBLE, nil + case COMPACT_BINARY: + return STRING, nil + case COMPACT_LIST: + return LIST, nil + case COMPACT_SET: + return SET, nil + case COMPACT_MAP: + return MAP, nil + case COMPACT_STRUCT: + return STRUCT, nil + } + return STOP, TException(fmt.Errorf("don't know what type: %s", t&0x0f)) +} + +// Given a TType value, find the appropriate TCompactProtocol.Types constant. +func (p *TCompactProtocol) getCompactType(t TType) tCompactType { + return ttypeToCompactType[t] +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/debug_protocol.go b/vendor/github.com/apache/thrift/lib/go/thrift/debug_protocol.go new file mode 100644 index 00000000..d37252cc --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/debug_protocol.go @@ -0,0 +1,269 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "log" +) + +type TDebugProtocol struct { + Delegate TProtocol + LogPrefix string +} + +type TDebugProtocolFactory struct { + Underlying TProtocolFactory + LogPrefix string +} + +func NewTDebugProtocolFactory(underlying TProtocolFactory, logPrefix string) *TDebugProtocolFactory { + return &TDebugProtocolFactory{ + Underlying: underlying, + LogPrefix: logPrefix, + } +} + +func (t *TDebugProtocolFactory) GetProtocol(trans TTransport) TProtocol { + return &TDebugProtocol{ + Delegate: t.Underlying.GetProtocol(trans), + LogPrefix: t.LogPrefix, + } +} + +func (tdp *TDebugProtocol) WriteMessageBegin(name string, typeId TMessageType, seqid int32) error { + err := tdp.Delegate.WriteMessageBegin(name, typeId, seqid) + log.Printf("%sWriteMessageBegin(name=%#v, typeId=%#v, seqid=%#v) => %#v", tdp.LogPrefix, name, typeId, seqid, err) + return err +} +func (tdp *TDebugProtocol) WriteMessageEnd() error { + err := tdp.Delegate.WriteMessageEnd() + log.Printf("%sWriteMessageEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteStructBegin(name string) error { + err := tdp.Delegate.WriteStructBegin(name) + log.Printf("%sWriteStructBegin(name=%#v) => %#v", tdp.LogPrefix, name, err) + return err +} +func (tdp *TDebugProtocol) WriteStructEnd() error { + err := tdp.Delegate.WriteStructEnd() + log.Printf("%sWriteStructEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + err := tdp.Delegate.WriteFieldBegin(name, typeId, id) + log.Printf("%sWriteFieldBegin(name=%#v, typeId=%#v, id%#v) => %#v", tdp.LogPrefix, name, typeId, id, err) + return err +} +func (tdp *TDebugProtocol) WriteFieldEnd() error { + err := tdp.Delegate.WriteFieldEnd() + log.Printf("%sWriteFieldEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteFieldStop() error { + err := tdp.Delegate.WriteFieldStop() + log.Printf("%sWriteFieldStop() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + err := tdp.Delegate.WriteMapBegin(keyType, valueType, size) + log.Printf("%sWriteMapBegin(keyType=%#v, valueType=%#v, size=%#v) => %#v", tdp.LogPrefix, keyType, valueType, size, err) + return err +} +func (tdp *TDebugProtocol) WriteMapEnd() error { + err := tdp.Delegate.WriteMapEnd() + log.Printf("%sWriteMapEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteListBegin(elemType TType, size int) error { + err := tdp.Delegate.WriteListBegin(elemType, size) + log.Printf("%sWriteListBegin(elemType=%#v, size=%#v) => %#v", tdp.LogPrefix, elemType, size, err) + return err +} +func (tdp *TDebugProtocol) WriteListEnd() error { + err := tdp.Delegate.WriteListEnd() + log.Printf("%sWriteListEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteSetBegin(elemType TType, size int) error { + err := tdp.Delegate.WriteSetBegin(elemType, size) + log.Printf("%sWriteSetBegin(elemType=%#v, size=%#v) => %#v", tdp.LogPrefix, elemType, size, err) + return err +} +func (tdp *TDebugProtocol) WriteSetEnd() error { + err := tdp.Delegate.WriteSetEnd() + log.Printf("%sWriteSetEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteBool(value bool) error { + err := tdp.Delegate.WriteBool(value) + log.Printf("%sWriteBool(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteByte(value int8) error { + err := tdp.Delegate.WriteByte(value) + log.Printf("%sWriteByte(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteI16(value int16) error { + err := tdp.Delegate.WriteI16(value) + log.Printf("%sWriteI16(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteI32(value int32) error { + err := tdp.Delegate.WriteI32(value) + log.Printf("%sWriteI32(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteI64(value int64) error { + err := tdp.Delegate.WriteI64(value) + log.Printf("%sWriteI64(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteDouble(value float64) error { + err := tdp.Delegate.WriteDouble(value) + log.Printf("%sWriteDouble(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteString(value string) error { + err := tdp.Delegate.WriteString(value) + log.Printf("%sWriteString(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteBinary(value []byte) error { + err := tdp.Delegate.WriteBinary(value) + log.Printf("%sWriteBinary(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} + +func (tdp *TDebugProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error) { + name, typeId, seqid, err = tdp.Delegate.ReadMessageBegin() + log.Printf("%sReadMessageBegin() (name=%#v, typeId=%#v, seqid=%#v, err=%#v)", tdp.LogPrefix, name, typeId, seqid, err) + return +} +func (tdp *TDebugProtocol) ReadMessageEnd() (err error) { + err = tdp.Delegate.ReadMessageEnd() + log.Printf("%sReadMessageEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadStructBegin() (name string, err error) { + name, err = tdp.Delegate.ReadStructBegin() + log.Printf("%sReadStructBegin() (name%#v, err=%#v)", tdp.LogPrefix, name, err) + return +} +func (tdp *TDebugProtocol) ReadStructEnd() (err error) { + err = tdp.Delegate.ReadStructEnd() + log.Printf("%sReadStructEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadFieldBegin() (name string, typeId TType, id int16, err error) { + name, typeId, id, err = tdp.Delegate.ReadFieldBegin() + log.Printf("%sReadFieldBegin() (name=%#v, typeId=%#v, id=%#v, err=%#v)", tdp.LogPrefix, name, typeId, id, err) + return +} +func (tdp *TDebugProtocol) ReadFieldEnd() (err error) { + err = tdp.Delegate.ReadFieldEnd() + log.Printf("%sReadFieldEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, err error) { + keyType, valueType, size, err = tdp.Delegate.ReadMapBegin() + log.Printf("%sReadMapBegin() (keyType=%#v, valueType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, keyType, valueType, size, err) + return +} +func (tdp *TDebugProtocol) ReadMapEnd() (err error) { + err = tdp.Delegate.ReadMapEnd() + log.Printf("%sReadMapEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadListBegin() (elemType TType, size int, err error) { + elemType, size, err = tdp.Delegate.ReadListBegin() + log.Printf("%sReadListBegin() (elemType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, elemType, size, err) + return +} +func (tdp *TDebugProtocol) ReadListEnd() (err error) { + err = tdp.Delegate.ReadListEnd() + log.Printf("%sReadListEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadSetBegin() (elemType TType, size int, err error) { + elemType, size, err = tdp.Delegate.ReadSetBegin() + log.Printf("%sReadSetBegin() (elemType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, elemType, size, err) + return +} +func (tdp *TDebugProtocol) ReadSetEnd() (err error) { + err = tdp.Delegate.ReadSetEnd() + log.Printf("%sReadSetEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadBool() (value bool, err error) { + value, err = tdp.Delegate.ReadBool() + log.Printf("%sReadBool() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadByte() (value int8, err error) { + value, err = tdp.Delegate.ReadByte() + log.Printf("%sReadByte() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadI16() (value int16, err error) { + value, err = tdp.Delegate.ReadI16() + log.Printf("%sReadI16() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadI32() (value int32, err error) { + value, err = tdp.Delegate.ReadI32() + log.Printf("%sReadI32() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadI64() (value int64, err error) { + value, err = tdp.Delegate.ReadI64() + log.Printf("%sReadI64() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadDouble() (value float64, err error) { + value, err = tdp.Delegate.ReadDouble() + log.Printf("%sReadDouble() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadString() (value string, err error) { + value, err = tdp.Delegate.ReadString() + log.Printf("%sReadString() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadBinary() (value []byte, err error) { + value, err = tdp.Delegate.ReadBinary() + log.Printf("%sReadBinary() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) Skip(fieldType TType) (err error) { + err = tdp.Delegate.Skip(fieldType) + log.Printf("%sSkip(fieldType=%#v) (err=%#v)", tdp.LogPrefix, fieldType, err) + return +} +func (tdp *TDebugProtocol) Flush() (err error) { + err = tdp.Delegate.Flush() + log.Printf("%sFlush() (err=%#v)", tdp.LogPrefix, err) + return +} + +func (tdp *TDebugProtocol) Transport() TTransport { + return tdp.Delegate.Transport() +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/deserializer.go b/vendor/github.com/apache/thrift/lib/go/thrift/deserializer.go new file mode 100644 index 00000000..91a0983a --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/deserializer.go @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +type TDeserializer struct { + Transport TTransport + Protocol TProtocol +} + +func NewTDeserializer() *TDeserializer { + var transport TTransport + transport = NewTMemoryBufferLen(1024) + + protocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport) + + return &TDeserializer{ + transport, + protocol} +} + +func (t *TDeserializer) ReadString(msg TStruct, s string) (err error) { + err = nil + if _, err = t.Transport.Write([]byte(s)); err != nil { + return + } + if err = msg.Read(t.Protocol); err != nil { + return + } + return +} + +func (t *TDeserializer) Read(msg TStruct, b []byte) (err error) { + err = nil + if _, err = t.Transport.Write(b); err != nil { + return + } + if err = msg.Read(t.Protocol); err != nil { + return + } + return +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/exception.go b/vendor/github.com/apache/thrift/lib/go/thrift/exception.go new file mode 100644 index 00000000..ea8d6f66 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/exception.go @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" +) + +// Generic Thrift exception +type TException interface { + error +} + +// Prepends additional information to an error without losing the Thrift exception interface +func PrependError(prepend string, err error) error { + if t, ok := err.(TTransportException); ok { + return NewTTransportException(t.TypeId(), prepend+t.Error()) + } + if t, ok := err.(TProtocolException); ok { + return NewTProtocolExceptionWithType(t.TypeId(), errors.New(prepend+err.Error())) + } + if t, ok := err.(TApplicationException); ok { + return NewTApplicationException(t.TypeId(), prepend+t.Error()) + } + + return errors.New(prepend + err.Error()) +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/field.go b/vendor/github.com/apache/thrift/lib/go/thrift/field.go new file mode 100644 index 00000000..9d665255 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/field.go @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Helper class that encapsulates field metadata. +type field struct { + name string + typeId TType + id int +} + +func newField(n string, t TType, i int) *field { + return &field{name: n, typeId: t, id: i} +} + +func (p *field) Name() string { + if p == nil { + return "" + } + return p.name +} + +func (p *field) TypeId() TType { + if p == nil { + return TType(VOID) + } + return p.typeId +} + +func (p *field) Id() int { + if p == nil { + return -1 + } + return p.id +} + +func (p *field) String() string { + if p == nil { + return "" + } + return "" +} + +var ANONYMOUS_FIELD *field + +type fieldSlice []field + +func (p fieldSlice) Len() int { + return len(p) +} + +func (p fieldSlice) Less(i, j int) bool { + return p[i].Id() < p[j].Id() +} + +func (p fieldSlice) Swap(i, j int) { + p[i], p[j] = p[j], p[i] +} + +func init() { + ANONYMOUS_FIELD = newField("", STOP, 0) +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/framed_transport.go b/vendor/github.com/apache/thrift/lib/go/thrift/framed_transport.go new file mode 100644 index 00000000..d0bae21b --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/framed_transport.go @@ -0,0 +1,167 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bufio" + "bytes" + "encoding/binary" + "fmt" + "io" +) + +const DEFAULT_MAX_LENGTH = 16384000 + +type TFramedTransport struct { + transport TTransport + buf bytes.Buffer + reader *bufio.Reader + frameSize uint32 //Current remaining size of the frame. if ==0 read next frame header + buffer [4]byte + maxLength uint32 +} + +type tFramedTransportFactory struct { + factory TTransportFactory + maxLength uint32 +} + +func NewTFramedTransportFactory(factory TTransportFactory) TTransportFactory { + return &tFramedTransportFactory{factory: factory, maxLength: DEFAULT_MAX_LENGTH} +} + +func NewTFramedTransportFactoryMaxLength(factory TTransportFactory, maxLength uint32) TTransportFactory { + return &tFramedTransportFactory{factory: factory, maxLength: maxLength} +} + +func (p *tFramedTransportFactory) GetTransport(base TTransport) TTransport { + return NewTFramedTransportMaxLength(p.factory.GetTransport(base), p.maxLength) +} + +func NewTFramedTransport(transport TTransport) *TFramedTransport { + return &TFramedTransport{transport: transport, reader: bufio.NewReader(transport), maxLength: DEFAULT_MAX_LENGTH} +} + +func NewTFramedTransportMaxLength(transport TTransport, maxLength uint32) *TFramedTransport { + return &TFramedTransport{transport: transport, reader: bufio.NewReader(transport), maxLength: maxLength} +} + +func (p *TFramedTransport) Open() error { + return p.transport.Open() +} + +func (p *TFramedTransport) IsOpen() bool { + return p.transport.IsOpen() +} + +func (p *TFramedTransport) Close() error { + return p.transport.Close() +} + +func (p *TFramedTransport) Read(buf []byte) (l int, err error) { + if p.frameSize == 0 { + p.frameSize, err = p.readFrameHeader() + if err != nil { + return + } + } + if p.frameSize < uint32(len(buf)) { + frameSize := p.frameSize + tmp := make([]byte, p.frameSize) + l, err = p.Read(tmp) + copy(buf, tmp) + if err == nil { + err = NewTTransportExceptionFromError(fmt.Errorf("Not enough frame size %d to read %d bytes", frameSize, len(buf))) + return + } + } + got, err := p.reader.Read(buf) + p.frameSize = p.frameSize - uint32(got) + //sanity check + if p.frameSize < 0 { + return 0, NewTTransportException(UNKNOWN_TRANSPORT_EXCEPTION, "Negative frame size") + } + return got, NewTTransportExceptionFromError(err) +} + +func (p *TFramedTransport) ReadByte() (c byte, err error) { + if p.frameSize == 0 { + p.frameSize, err = p.readFrameHeader() + if err != nil { + return + } + } + if p.frameSize < 1 { + return 0, NewTTransportExceptionFromError(fmt.Errorf("Not enough frame size %d to read %d bytes", p.frameSize, 1)) + } + c, err = p.reader.ReadByte() + if err == nil { + p.frameSize-- + } + return +} + +func (p *TFramedTransport) Write(buf []byte) (int, error) { + n, err := p.buf.Write(buf) + return n, NewTTransportExceptionFromError(err) +} + +func (p *TFramedTransport) WriteByte(c byte) error { + return p.buf.WriteByte(c) +} + +func (p *TFramedTransport) WriteString(s string) (n int, err error) { + return p.buf.WriteString(s) +} + +func (p *TFramedTransport) Flush() error { + size := p.buf.Len() + buf := p.buffer[:4] + binary.BigEndian.PutUint32(buf, uint32(size)) + _, err := p.transport.Write(buf) + if err != nil { + return NewTTransportExceptionFromError(err) + } + if size > 0 { + if n, err := p.buf.WriteTo(p.transport); err != nil { + print("Error while flushing write buffer of size ", size, " to transport, only wrote ", n, " bytes: ", err.Error(), "\n") + return NewTTransportExceptionFromError(err) + } + } + err = p.transport.Flush() + return NewTTransportExceptionFromError(err) +} + +func (p *TFramedTransport) readFrameHeader() (uint32, error) { + buf := p.buffer[:4] + if _, err := io.ReadFull(p.reader, buf); err != nil { + return 0, err + } + size := binary.BigEndian.Uint32(buf) + if size < 0 || size > p.maxLength { + return 0, NewTTransportException(UNKNOWN_TRANSPORT_EXCEPTION, fmt.Sprintf("Incorrect frame size (%d)", size)) + } + return size, nil +} + +func (p *TFramedTransport) RemainingBytes() (num_bytes uint64) { + return uint64(p.frameSize) +} + diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/http_client.go b/vendor/github.com/apache/thrift/lib/go/thrift/http_client.go new file mode 100644 index 00000000..bf0ed625 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/http_client.go @@ -0,0 +1,212 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bytes" + "io" + "net/http" + "net/url" + "strconv" +) + +type THttpClient struct { + response *http.Response + url *url.URL + requestBuffer *bytes.Buffer + header http.Header + nsecConnectTimeout int64 + nsecReadTimeout int64 +} + +type THttpClientTransportFactory struct { + url string + isPost bool +} + +func (p *THttpClientTransportFactory) GetTransport(trans TTransport) TTransport { + if trans != nil { + t, ok := trans.(*THttpClient) + if ok && t.url != nil { + if t.requestBuffer != nil { + t2, _ := NewTHttpPostClient(t.url.String()) + return t2 + } + t2, _ := NewTHttpClient(t.url.String()) + return t2 + } + } + if p.isPost { + s, _ := NewTHttpPostClient(p.url) + return s + } + s, _ := NewTHttpClient(p.url) + return s +} + +func NewTHttpClientTransportFactory(url string) *THttpClientTransportFactory { + return &THttpClientTransportFactory{url: url, isPost: false} +} + +func NewTHttpPostClientTransportFactory(url string) *THttpClientTransportFactory { + return &THttpClientTransportFactory{url: url, isPost: true} +} + +func NewTHttpClient(urlstr string) (TTransport, error) { + parsedURL, err := url.Parse(urlstr) + if err != nil { + return nil, err + } + response, err := http.Get(urlstr) + if err != nil { + return nil, err + } + return &THttpClient{response: response, url: parsedURL}, nil +} + +func NewTHttpPostClient(urlstr string) (TTransport, error) { + parsedURL, err := url.Parse(urlstr) + if err != nil { + return nil, err + } + buf := make([]byte, 0, 1024) + return &THttpClient{url: parsedURL, requestBuffer: bytes.NewBuffer(buf), header: http.Header{}}, nil +} + +// Set the HTTP Header for this specific Thrift Transport +// It is important that you first assert the TTransport as a THttpClient type +// like so: +// +// httpTrans := trans.(THttpClient) +// httpTrans.SetHeader("User-Agent","Thrift Client 1.0") +func (p *THttpClient) SetHeader(key string, value string) { + p.header.Add(key, value) +} + +// Get the HTTP Header represented by the supplied Header Key for this specific Thrift Transport +// It is important that you first assert the TTransport as a THttpClient type +// like so: +// +// httpTrans := trans.(THttpClient) +// hdrValue := httpTrans.GetHeader("User-Agent") +func (p *THttpClient) GetHeader(key string) string { + return p.header.Get(key) +} + +// Deletes the HTTP Header given a Header Key for this specific Thrift Transport +// It is important that you first assert the TTransport as a THttpClient type +// like so: +// +// httpTrans := trans.(THttpClient) +// httpTrans.DelHeader("User-Agent") +func (p *THttpClient) DelHeader(key string) { + p.header.Del(key) +} + +func (p *THttpClient) Open() error { + // do nothing + return nil +} + +func (p *THttpClient) IsOpen() bool { + return p.response != nil || p.requestBuffer != nil +} + +func (p *THttpClient) closeResponse() error { + var err error + if p.response != nil && p.response.Body != nil { + err = p.response.Body.Close() + } + + p.response = nil + return err +} + +func (p *THttpClient) Close() error { + if p.requestBuffer != nil { + p.requestBuffer.Reset() + p.requestBuffer = nil + } + return p.closeResponse() +} + +func (p *THttpClient) Read(buf []byte) (int, error) { + if p.response == nil { + return 0, NewTTransportException(NOT_OPEN, "Response buffer is empty, no request.") + } + n, err := p.response.Body.Read(buf) + if n > 0 && (err == nil || err == io.EOF) { + return n, nil + } + return n, NewTTransportExceptionFromError(err) +} + +func (p *THttpClient) ReadByte() (c byte, err error) { + return readByte(p.response.Body) +} + +func (p *THttpClient) Write(buf []byte) (int, error) { + n, err := p.requestBuffer.Write(buf) + return n, err +} + +func (p *THttpClient) WriteByte(c byte) error { + return p.requestBuffer.WriteByte(c) +} + +func (p *THttpClient) WriteString(s string) (n int, err error) { + return p.requestBuffer.WriteString(s) +} + +func (p *THttpClient) Flush() error { + // Close any previous response body to avoid leaking connections. + p.closeResponse() + + client := &http.Client{} + req, err := http.NewRequest("POST", p.url.String(), p.requestBuffer) + if err != nil { + return NewTTransportExceptionFromError(err) + } + p.header.Add("Content-Type", "application/x-thrift") + req.Header = p.header + response, err := client.Do(req) + if err != nil { + return NewTTransportExceptionFromError(err) + } + if response.StatusCode != http.StatusOK { + // Close the response to avoid leaking file descriptors. + response.Body.Close() + // TODO(pomack) log bad response + return NewTTransportException(UNKNOWN_TRANSPORT_EXCEPTION, "HTTP Response code: "+strconv.Itoa(response.StatusCode)) + } + p.response = response + return nil +} + +func (p *THttpClient) RemainingBytes() (num_bytes uint64) { + len := p.response.ContentLength + if len >= 0 { + return uint64(len) + } + + const maxSize = ^uint64(0) + return maxSize // the thruth is, we just don't know unless framed is used +} + diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/iostream_transport.go b/vendor/github.com/apache/thrift/lib/go/thrift/iostream_transport.go new file mode 100644 index 00000000..794872ff --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/iostream_transport.go @@ -0,0 +1,214 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bufio" + "io" +) + +// StreamTransport is a Transport made of an io.Reader and/or an io.Writer +type StreamTransport struct { + io.Reader + io.Writer + isReadWriter bool + closed bool +} + +type StreamTransportFactory struct { + Reader io.Reader + Writer io.Writer + isReadWriter bool +} + +func (p *StreamTransportFactory) GetTransport(trans TTransport) TTransport { + if trans != nil { + t, ok := trans.(*StreamTransport) + if ok { + if t.isReadWriter { + return NewStreamTransportRW(t.Reader.(io.ReadWriter)) + } + if t.Reader != nil && t.Writer != nil { + return NewStreamTransport(t.Reader, t.Writer) + } + if t.Reader != nil && t.Writer == nil { + return NewStreamTransportR(t.Reader) + } + if t.Reader == nil && t.Writer != nil { + return NewStreamTransportW(t.Writer) + } + return &StreamTransport{} + } + } + if p.isReadWriter { + return NewStreamTransportRW(p.Reader.(io.ReadWriter)) + } + if p.Reader != nil && p.Writer != nil { + return NewStreamTransport(p.Reader, p.Writer) + } + if p.Reader != nil && p.Writer == nil { + return NewStreamTransportR(p.Reader) + } + if p.Reader == nil && p.Writer != nil { + return NewStreamTransportW(p.Writer) + } + return &StreamTransport{} +} + +func NewStreamTransportFactory(reader io.Reader, writer io.Writer, isReadWriter bool) *StreamTransportFactory { + return &StreamTransportFactory{Reader: reader, Writer: writer, isReadWriter: isReadWriter} +} + +func NewStreamTransport(r io.Reader, w io.Writer) *StreamTransport { + return &StreamTransport{Reader: bufio.NewReader(r), Writer: bufio.NewWriter(w)} +} + +func NewStreamTransportR(r io.Reader) *StreamTransport { + return &StreamTransport{Reader: bufio.NewReader(r)} +} + +func NewStreamTransportW(w io.Writer) *StreamTransport { + return &StreamTransport{Writer: bufio.NewWriter(w)} +} + +func NewStreamTransportRW(rw io.ReadWriter) *StreamTransport { + bufrw := bufio.NewReadWriter(bufio.NewReader(rw), bufio.NewWriter(rw)) + return &StreamTransport{Reader: bufrw, Writer: bufrw, isReadWriter: true} +} + +func (p *StreamTransport) IsOpen() bool { + return !p.closed +} + +// implicitly opened on creation, can't be reopened once closed +func (p *StreamTransport) Open() error { + if !p.closed { + return NewTTransportException(ALREADY_OPEN, "StreamTransport already open.") + } else { + return NewTTransportException(NOT_OPEN, "cannot reopen StreamTransport.") + } +} + +// Closes both the input and output streams. +func (p *StreamTransport) Close() error { + if p.closed { + return NewTTransportException(NOT_OPEN, "StreamTransport already closed.") + } + p.closed = true + closedReader := false + if p.Reader != nil { + c, ok := p.Reader.(io.Closer) + if ok { + e := c.Close() + closedReader = true + if e != nil { + return e + } + } + p.Reader = nil + } + if p.Writer != nil && (!closedReader || !p.isReadWriter) { + c, ok := p.Writer.(io.Closer) + if ok { + e := c.Close() + if e != nil { + return e + } + } + p.Writer = nil + } + return nil +} + +// Flushes the underlying output stream if not null. +func (p *StreamTransport) Flush() error { + if p.Writer == nil { + return NewTTransportException(NOT_OPEN, "Cannot flush null outputStream") + } + f, ok := p.Writer.(Flusher) + if ok { + err := f.Flush() + if err != nil { + return NewTTransportExceptionFromError(err) + } + } + return nil +} + +func (p *StreamTransport) Read(c []byte) (n int, err error) { + n, err = p.Reader.Read(c) + if err != nil { + err = NewTTransportExceptionFromError(err) + } + return +} + +func (p *StreamTransport) ReadByte() (c byte, err error) { + f, ok := p.Reader.(io.ByteReader) + if ok { + c, err = f.ReadByte() + } else { + c, err = readByte(p.Reader) + } + if err != nil { + err = NewTTransportExceptionFromError(err) + } + return +} + +func (p *StreamTransport) Write(c []byte) (n int, err error) { + n, err = p.Writer.Write(c) + if err != nil { + err = NewTTransportExceptionFromError(err) + } + return +} + +func (p *StreamTransport) WriteByte(c byte) (err error) { + f, ok := p.Writer.(io.ByteWriter) + if ok { + err = f.WriteByte(c) + } else { + err = writeByte(p.Writer, c) + } + if err != nil { + err = NewTTransportExceptionFromError(err) + } + return +} + +func (p *StreamTransport) WriteString(s string) (n int, err error) { + f, ok := p.Writer.(stringWriter) + if ok { + n, err = f.WriteString(s) + } else { + n, err = p.Writer.Write([]byte(s)) + } + if err != nil { + err = NewTTransportExceptionFromError(err) + } + return +} + +func (p *StreamTransport) RemainingBytes() (num_bytes uint64) { + const maxSize = ^uint64(0) + return maxSize // the thruth is, we just don't know unless framed is used +} + diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/json_protocol.go b/vendor/github.com/apache/thrift/lib/go/thrift/json_protocol.go new file mode 100644 index 00000000..669a7bdd --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/json_protocol.go @@ -0,0 +1,580 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "encoding/base64" + "fmt" +) + +const ( + THRIFT_JSON_PROTOCOL_VERSION = 1 +) + +// for references to _ParseContext see tsimplejson_protocol.go + +// JSON protocol implementation for thrift. +// +// This protocol produces/consumes a simple output format +// suitable for parsing by scripting languages. It should not be +// confused with the full-featured TJSONProtocol. +// +type TJSONProtocol struct { + *TSimpleJSONProtocol +} + +// Constructor +func NewTJSONProtocol(t TTransport) *TJSONProtocol { + v := &TJSONProtocol{TSimpleJSONProtocol: NewTSimpleJSONProtocol(t)} + v.parseContextStack = append(v.parseContextStack, int(_CONTEXT_IN_TOPLEVEL)) + v.dumpContext = append(v.dumpContext, int(_CONTEXT_IN_TOPLEVEL)) + return v +} + +// Factory +type TJSONProtocolFactory struct{} + +func (p *TJSONProtocolFactory) GetProtocol(trans TTransport) TProtocol { + return NewTJSONProtocol(trans) +} + +func NewTJSONProtocolFactory() *TJSONProtocolFactory { + return &TJSONProtocolFactory{} +} + +func (p *TJSONProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteI32(THRIFT_JSON_PROTOCOL_VERSION); e != nil { + return e + } + if e := p.WriteString(name); e != nil { + return e + } + if e := p.WriteByte(int8(typeId)); e != nil { + return e + } + if e := p.WriteI32(seqId); e != nil { + return e + } + return nil +} + +func (p *TJSONProtocol) WriteMessageEnd() error { + return p.OutputListEnd() +} + +func (p *TJSONProtocol) WriteStructBegin(name string) error { + if e := p.OutputObjectBegin(); e != nil { + return e + } + return nil +} + +func (p *TJSONProtocol) WriteStructEnd() error { + return p.OutputObjectEnd() +} + +func (p *TJSONProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + if e := p.WriteI16(id); e != nil { + return e + } + if e := p.OutputObjectBegin(); e != nil { + return e + } + s, e1 := p.TypeIdToString(typeId) + if e1 != nil { + return e1 + } + if e := p.WriteString(s); e != nil { + return e + } + return nil +} + +func (p *TJSONProtocol) WriteFieldEnd() error { + return p.OutputObjectEnd() +} + +func (p *TJSONProtocol) WriteFieldStop() error { return nil } + +func (p *TJSONProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + s, e1 := p.TypeIdToString(keyType) + if e1 != nil { + return e1 + } + if e := p.WriteString(s); e != nil { + return e + } + s, e1 = p.TypeIdToString(valueType) + if e1 != nil { + return e1 + } + if e := p.WriteString(s); e != nil { + return e + } + if e := p.WriteI64(int64(size)); e != nil { + return e + } + return p.OutputObjectBegin() +} + +func (p *TJSONProtocol) WriteMapEnd() error { + if e := p.OutputObjectEnd(); e != nil { + return e + } + return p.OutputListEnd() +} + +func (p *TJSONProtocol) WriteListBegin(elemType TType, size int) error { + return p.OutputElemListBegin(elemType, size) +} + +func (p *TJSONProtocol) WriteListEnd() error { + return p.OutputListEnd() +} + +func (p *TJSONProtocol) WriteSetBegin(elemType TType, size int) error { + return p.OutputElemListBegin(elemType, size) +} + +func (p *TJSONProtocol) WriteSetEnd() error { + return p.OutputListEnd() +} + +func (p *TJSONProtocol) WriteBool(b bool) error { + if b { + return p.WriteI32(1) + } + return p.WriteI32(0) +} + +func (p *TJSONProtocol) WriteByte(b int8) error { + return p.WriteI32(int32(b)) +} + +func (p *TJSONProtocol) WriteI16(v int16) error { + return p.WriteI32(int32(v)) +} + +func (p *TJSONProtocol) WriteI32(v int32) error { + return p.OutputI64(int64(v)) +} + +func (p *TJSONProtocol) WriteI64(v int64) error { + return p.OutputI64(int64(v)) +} + +func (p *TJSONProtocol) WriteDouble(v float64) error { + return p.OutputF64(v) +} + +func (p *TJSONProtocol) WriteString(v string) error { + return p.OutputString(v) +} + +func (p *TJSONProtocol) WriteBinary(v []byte) error { + // JSON library only takes in a string, + // not an arbitrary byte array, to ensure bytes are transmitted + // efficiently we must convert this into a valid JSON string + // therefore we use base64 encoding to avoid excessive escaping/quoting + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.writer.Write(JSON_QUOTE_BYTES); e != nil { + return NewTProtocolException(e) + } + writer := base64.NewEncoder(base64.StdEncoding, p.writer) + if _, e := writer.Write(v); e != nil { + return NewTProtocolException(e) + } + if e := writer.Close(); e != nil { + return NewTProtocolException(e) + } + if _, e := p.writer.Write(JSON_QUOTE_BYTES); e != nil { + return NewTProtocolException(e) + } + return p.OutputPostValue() +} + +// Reading methods. +func (p *TJSONProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + if isNull, err := p.ParseListBegin(); isNull || err != nil { + return name, typeId, seqId, err + } + version, err := p.ReadI32() + if err != nil { + return name, typeId, seqId, err + } + if version != THRIFT_JSON_PROTOCOL_VERSION { + e := fmt.Errorf("Unknown Protocol version %d, expected version %d", version, THRIFT_JSON_PROTOCOL_VERSION) + return name, typeId, seqId, NewTProtocolExceptionWithType(INVALID_DATA, e) + + } + if name, err = p.ReadString(); err != nil { + return name, typeId, seqId, err + } + bTypeId, err := p.ReadByte() + typeId = TMessageType(bTypeId) + if err != nil { + return name, typeId, seqId, err + } + if seqId, err = p.ReadI32(); err != nil { + return name, typeId, seqId, err + } + return name, typeId, seqId, nil +} + +func (p *TJSONProtocol) ReadMessageEnd() error { + err := p.ParseListEnd() + return err +} + +func (p *TJSONProtocol) ReadStructBegin() (name string, err error) { + _, err = p.ParseObjectStart() + return "", err +} + +func (p *TJSONProtocol) ReadStructEnd() error { + return p.ParseObjectEnd() +} + +func (p *TJSONProtocol) ReadFieldBegin() (string, TType, int16, error) { + b, _ := p.reader.Peek(1) + if len(b) < 1 || b[0] == JSON_RBRACE[0] || b[0] == JSON_RBRACKET[0] { + return "", STOP, -1, nil + } + fieldId, err := p.ReadI16() + if err != nil { + return "", STOP, fieldId, err + } + if _, err = p.ParseObjectStart(); err != nil { + return "", STOP, fieldId, err + } + sType, err := p.ReadString() + if err != nil { + return "", STOP, fieldId, err + } + fType, err := p.StringToTypeId(sType) + return "", fType, fieldId, err +} + +func (p *TJSONProtocol) ReadFieldEnd() error { + return p.ParseObjectEnd() +} + +func (p *TJSONProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, VOID, 0, e + } + + // read keyType + sKeyType, e := p.ReadString() + if e != nil { + return keyType, valueType, size, e + } + keyType, e = p.StringToTypeId(sKeyType) + if e != nil { + return keyType, valueType, size, e + } + + // read valueType + sValueType, e := p.ReadString() + if e != nil { + return keyType, valueType, size, e + } + valueType, e = p.StringToTypeId(sValueType) + if e != nil { + return keyType, valueType, size, e + } + + // read size + iSize, e := p.ReadI64() + if e != nil { + return keyType, valueType, size, e + } + size = int(iSize) + + _, e = p.ParseObjectStart() + return keyType, valueType, size, e +} + +func (p *TJSONProtocol) ReadMapEnd() error { + e := p.ParseObjectEnd() + if e != nil { + return e + } + return p.ParseListEnd() +} + +func (p *TJSONProtocol) ReadListBegin() (elemType TType, size int, e error) { + return p.ParseElemListBegin() +} + +func (p *TJSONProtocol) ReadListEnd() error { + return p.ParseListEnd() +} + +func (p *TJSONProtocol) ReadSetBegin() (elemType TType, size int, e error) { + return p.ParseElemListBegin() +} + +func (p *TJSONProtocol) ReadSetEnd() error { + return p.ParseListEnd() +} + +func (p *TJSONProtocol) ReadBool() (bool, error) { + value, err := p.ReadI32() + return (value != 0), err +} + +func (p *TJSONProtocol) ReadByte() (int8, error) { + v, err := p.ReadI64() + return int8(v), err +} + +func (p *TJSONProtocol) ReadI16() (int16, error) { + v, err := p.ReadI64() + return int16(v), err +} + +func (p *TJSONProtocol) ReadI32() (int32, error) { + v, err := p.ReadI64() + return int32(v), err +} + +func (p *TJSONProtocol) ReadI64() (int64, error) { + v, _, err := p.ParseI64() + return v, err +} + +func (p *TJSONProtocol) ReadDouble() (float64, error) { + v, _, err := p.ParseF64() + return v, err +} + +func (p *TJSONProtocol) ReadString() (string, error) { + var v string + if err := p.ParsePreValue(); err != nil { + return v, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 && f[0] == JSON_QUOTE { + p.reader.ReadByte() + value, err := p.ParseStringBody() + v = value + if err != nil { + return v, err + } + } else if len(f) >= 0 && f[0] == JSON_NULL[0] { + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return v, NewTProtocolException(err) + } + if string(b) != string(JSON_NULL) { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } else { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return v, p.ParsePostValue() +} + +func (p *TJSONProtocol) ReadBinary() ([]byte, error) { + var v []byte + if err := p.ParsePreValue(); err != nil { + return nil, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 && f[0] == JSON_QUOTE { + p.reader.ReadByte() + value, err := p.ParseBase64EncodedBody() + v = value + if err != nil { + return v, err + } + } else if len(f) >= 0 && f[0] == JSON_NULL[0] { + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return v, NewTProtocolException(err) + } + if string(b) != string(JSON_NULL) { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } else { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + + return v, p.ParsePostValue() +} + +func (p *TJSONProtocol) Flush() (err error) { + err = p.writer.Flush() + if err == nil { + err = p.trans.Flush() + } + return NewTProtocolException(err) +} + +func (p *TJSONProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TJSONProtocol) Transport() TTransport { + return p.trans +} + +func (p *TJSONProtocol) OutputElemListBegin(elemType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + s, e1 := p.TypeIdToString(elemType) + if e1 != nil { + return e1 + } + if e := p.WriteString(s); e != nil { + return e + } + if e := p.WriteI64(int64(size)); e != nil { + return e + } + return nil +} + +func (p *TJSONProtocol) ParseElemListBegin() (elemType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, 0, e + } + sElemType, err := p.ReadString() + if err != nil { + return VOID, size, err + } + elemType, err = p.StringToTypeId(sElemType) + if err != nil { + return elemType, size, err + } + nSize, err2 := p.ReadI64() + size = int(nSize) + return elemType, size, err2 +} + +func (p *TJSONProtocol) readElemListBegin() (elemType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, 0, e + } + sElemType, err := p.ReadString() + if err != nil { + return VOID, size, err + } + elemType, err = p.StringToTypeId(sElemType) + if err != nil { + return elemType, size, err + } + nSize, err2 := p.ReadI64() + size = int(nSize) + return elemType, size, err2 +} + +func (p *TJSONProtocol) writeElemListBegin(elemType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + s, e1 := p.TypeIdToString(elemType) + if e1 != nil { + return e1 + } + if e := p.OutputString(s); e != nil { + return e + } + if e := p.OutputI64(int64(size)); e != nil { + return e + } + return nil +} + +func (p *TJSONProtocol) TypeIdToString(fieldType TType) (string, error) { + switch byte(fieldType) { + case BOOL: + return "tf", nil + case BYTE: + return "i8", nil + case I16: + return "i16", nil + case I32: + return "i32", nil + case I64: + return "i64", nil + case DOUBLE: + return "dbl", nil + case STRING: + return "str", nil + case STRUCT: + return "rec", nil + case MAP: + return "map", nil + case SET: + return "set", nil + case LIST: + return "lst", nil + } + + e := fmt.Errorf("Unknown fieldType: %d", int(fieldType)) + return "", NewTProtocolExceptionWithType(INVALID_DATA, e) +} + +func (p *TJSONProtocol) StringToTypeId(fieldType string) (TType, error) { + switch fieldType { + case "tf": + return TType(BOOL), nil + case "i8": + return TType(BYTE), nil + case "i16": + return TType(I16), nil + case "i32": + return TType(I32), nil + case "i64": + return TType(I64), nil + case "dbl": + return TType(DOUBLE), nil + case "str": + return TType(STRING), nil + case "rec": + return TType(STRUCT), nil + case "map": + return TType(MAP), nil + case "set": + return TType(SET), nil + case "lst": + return TType(LIST), nil + } + + e := fmt.Errorf("Unknown type identifier: %s", fieldType) + return TType(STOP), NewTProtocolExceptionWithType(INVALID_DATA, e) +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/memory_buffer.go b/vendor/github.com/apache/thrift/lib/go/thrift/memory_buffer.go new file mode 100644 index 00000000..b62fd56f --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/memory_buffer.go @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bytes" +) + +// Memory buffer-based implementation of the TTransport interface. +type TMemoryBuffer struct { + *bytes.Buffer + size int +} + +type TMemoryBufferTransportFactory struct { + size int +} + +func (p *TMemoryBufferTransportFactory) GetTransport(trans TTransport) TTransport { + if trans != nil { + t, ok := trans.(*TMemoryBuffer) + if ok && t.size > 0 { + return NewTMemoryBufferLen(t.size) + } + } + return NewTMemoryBufferLen(p.size) +} + +func NewTMemoryBufferTransportFactory(size int) *TMemoryBufferTransportFactory { + return &TMemoryBufferTransportFactory{size: size} +} + +func NewTMemoryBuffer() *TMemoryBuffer { + return &TMemoryBuffer{Buffer: &bytes.Buffer{}, size: 0} +} + +func NewTMemoryBufferLen(size int) *TMemoryBuffer { + buf := make([]byte, 0, size) + return &TMemoryBuffer{Buffer: bytes.NewBuffer(buf), size: size} +} + +func (p *TMemoryBuffer) IsOpen() bool { + return true +} + +func (p *TMemoryBuffer) Open() error { + return nil +} + +func (p *TMemoryBuffer) Close() error { + p.Buffer.Reset() + return nil +} + +// Flushing a memory buffer is a no-op +func (p *TMemoryBuffer) Flush() error { + return nil +} + +func (p *TMemoryBuffer) RemainingBytes() (num_bytes uint64) { + return uint64(p.Buffer.Len()) +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/messagetype.go b/vendor/github.com/apache/thrift/lib/go/thrift/messagetype.go new file mode 100644 index 00000000..25ab2e98 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/messagetype.go @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Message type constants in the Thrift protocol. +type TMessageType int32 + +const ( + INVALID_TMESSAGE_TYPE TMessageType = 0 + CALL TMessageType = 1 + REPLY TMessageType = 2 + EXCEPTION TMessageType = 3 + ONEWAY TMessageType = 4 +) diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/multiplexed_protocol.go b/vendor/github.com/apache/thrift/lib/go/thrift/multiplexed_protocol.go new file mode 100644 index 00000000..3157e0d5 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/multiplexed_protocol.go @@ -0,0 +1,169 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "fmt" + "strings" +) + +/* +TMultiplexedProtocol is a protocol-independent concrete decorator +that allows a Thrift client to communicate with a multiplexing Thrift server, +by prepending the service name to the function name during function calls. + +NOTE: THIS IS NOT USED BY SERVERS. On the server, use TMultiplexedProcessor to handle request +from a multiplexing client. + +This example uses a single socket transport to invoke two services: + +socket := thrift.NewTSocketFromAddrTimeout(addr, TIMEOUT) +transport := thrift.NewTFramedTransport(socket) +protocol := thrift.NewTBinaryProtocolTransport(transport) + +mp := thrift.NewTMultiplexedProtocol(protocol, "Calculator") +service := Calculator.NewCalculatorClient(mp) + +mp2 := thrift.NewTMultiplexedProtocol(protocol, "WeatherReport") +service2 := WeatherReport.NewWeatherReportClient(mp2) + +err := transport.Open() +if err != nil { + t.Fatal("Unable to open client socket", err) +} + +fmt.Println(service.Add(2,2)) +fmt.Println(service2.GetTemperature()) +*/ + +type TMultiplexedProtocol struct { + TProtocol + serviceName string +} + +const MULTIPLEXED_SEPARATOR = ":" + +func NewTMultiplexedProtocol(protocol TProtocol, serviceName string) *TMultiplexedProtocol { + return &TMultiplexedProtocol{ + TProtocol: protocol, + serviceName: serviceName, + } +} + +func (t *TMultiplexedProtocol) WriteMessageBegin(name string, typeId TMessageType, seqid int32) error { + if typeId == CALL || typeId == ONEWAY { + return t.TProtocol.WriteMessageBegin(t.serviceName+MULTIPLEXED_SEPARATOR+name, typeId, seqid) + } else { + return t.TProtocol.WriteMessageBegin(name, typeId, seqid) + } +} + +/* +TMultiplexedProcessor is a TProcessor allowing +a single TServer to provide multiple services. + +To do so, you instantiate the processor and then register additional +processors with it, as shown in the following example: + +var processor = thrift.NewTMultiplexedProcessor() + +firstProcessor := +processor.RegisterProcessor("FirstService", firstProcessor) + +processor.registerProcessor( + "Calculator", + Calculator.NewCalculatorProcessor(&CalculatorHandler{}), +) + +processor.registerProcessor( + "WeatherReport", + WeatherReport.NewWeatherReportProcessor(&WeatherReportHandler{}), +) + +serverTransport, err := thrift.NewTServerSocketTimeout(addr, TIMEOUT) +if err != nil { + t.Fatal("Unable to create server socket", err) +} +server := thrift.NewTSimpleServer2(processor, serverTransport) +server.Serve(); +*/ + +type TMultiplexedProcessor struct { + serviceProcessorMap map[string]TProcessor + DefaultProcessor TProcessor +} + +func NewTMultiplexedProcessor() *TMultiplexedProcessor { + return &TMultiplexedProcessor{ + serviceProcessorMap: make(map[string]TProcessor), + } +} + +func (t *TMultiplexedProcessor) RegisterDefault(processor TProcessor) { + t.DefaultProcessor = processor +} + +func (t *TMultiplexedProcessor) RegisterProcessor(name string, processor TProcessor) { + if t.serviceProcessorMap == nil { + t.serviceProcessorMap = make(map[string]TProcessor) + } + t.serviceProcessorMap[name] = processor +} + +func (t *TMultiplexedProcessor) Process(in, out TProtocol) (bool, TException) { + name, typeId, seqid, err := in.ReadMessageBegin() + if err != nil { + return false, err + } + if typeId != CALL && typeId != ONEWAY { + return false, fmt.Errorf("Unexpected message type %v", typeId) + } + //extract the service name + v := strings.SplitN(name, MULTIPLEXED_SEPARATOR, 2) + if len(v) != 2 { + if t.DefaultProcessor != nil { + smb := NewStoredMessageProtocol(in, name, typeId, seqid) + return t.DefaultProcessor.Process(smb, out) + } + return false, fmt.Errorf("Service name not found in message name: %s. Did you forget to use a TMultiplexProtocol in your client?", name) + } + actualProcessor, ok := t.serviceProcessorMap[v[0]] + if !ok { + return false, fmt.Errorf("Service name not found: %s. Did you forget to call registerProcessor()?", v[0]) + } + smb := NewStoredMessageProtocol(in, v[1], typeId, seqid) + return actualProcessor.Process(smb, out) +} + +//Protocol that use stored message for ReadMessageBegin +type storedMessageProtocol struct { + TProtocol + name string + typeId TMessageType + seqid int32 +} + +func NewStoredMessageProtocol(protocol TProtocol, name string, typeId TMessageType, seqid int32) *storedMessageProtocol { + return &storedMessageProtocol{protocol, name, typeId, seqid} +} + +func (s *storedMessageProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error) { + return s.name, s.typeId, s.seqid, nil +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/numeric.go b/vendor/github.com/apache/thrift/lib/go/thrift/numeric.go new file mode 100644 index 00000000..aa8daa9b --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/numeric.go @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "math" + "strconv" +) + +type Numeric interface { + Int64() int64 + Int32() int32 + Int16() int16 + Byte() byte + Int() int + Float64() float64 + Float32() float32 + String() string + isNull() bool +} + +type numeric struct { + iValue int64 + dValue float64 + sValue string + isNil bool +} + +var ( + INFINITY Numeric + NEGATIVE_INFINITY Numeric + NAN Numeric + ZERO Numeric + NUMERIC_NULL Numeric +) + +func NewNumericFromDouble(dValue float64) Numeric { + if math.IsInf(dValue, 1) { + return INFINITY + } + if math.IsInf(dValue, -1) { + return NEGATIVE_INFINITY + } + if math.IsNaN(dValue) { + return NAN + } + iValue := int64(dValue) + sValue := strconv.FormatFloat(dValue, 'g', 10, 64) + isNil := false + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromI64(iValue int64) Numeric { + dValue := float64(iValue) + sValue := string(iValue) + isNil := false + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromI32(iValue int32) Numeric { + dValue := float64(iValue) + sValue := string(iValue) + isNil := false + return &numeric{iValue: int64(iValue), dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromString(sValue string) Numeric { + if sValue == INFINITY.String() { + return INFINITY + } + if sValue == NEGATIVE_INFINITY.String() { + return NEGATIVE_INFINITY + } + if sValue == NAN.String() { + return NAN + } + iValue, _ := strconv.ParseInt(sValue, 10, 64) + dValue, _ := strconv.ParseFloat(sValue, 64) + isNil := len(sValue) == 0 + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromJSONString(sValue string, isNull bool) Numeric { + if isNull { + return NewNullNumeric() + } + if sValue == JSON_INFINITY { + return INFINITY + } + if sValue == JSON_NEGATIVE_INFINITY { + return NEGATIVE_INFINITY + } + if sValue == JSON_NAN { + return NAN + } + iValue, _ := strconv.ParseInt(sValue, 10, 64) + dValue, _ := strconv.ParseFloat(sValue, 64) + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNull} +} + +func NewNullNumeric() Numeric { + return &numeric{iValue: 0, dValue: 0.0, sValue: "", isNil: true} +} + +func (p *numeric) Int64() int64 { + return p.iValue +} + +func (p *numeric) Int32() int32 { + return int32(p.iValue) +} + +func (p *numeric) Int16() int16 { + return int16(p.iValue) +} + +func (p *numeric) Byte() byte { + return byte(p.iValue) +} + +func (p *numeric) Int() int { + return int(p.iValue) +} + +func (p *numeric) Float64() float64 { + return p.dValue +} + +func (p *numeric) Float32() float32 { + return float32(p.dValue) +} + +func (p *numeric) String() string { + return p.sValue +} + +func (p *numeric) isNull() bool { + return p.isNil +} + +func init() { + INFINITY = &numeric{iValue: 0, dValue: math.Inf(1), sValue: "Infinity", isNil: false} + NEGATIVE_INFINITY = &numeric{iValue: 0, dValue: math.Inf(-1), sValue: "-Infinity", isNil: false} + NAN = &numeric{iValue: 0, dValue: math.NaN(), sValue: "NaN", isNil: false} + ZERO = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: false} + NUMERIC_NULL = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: true} +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/pointerize.go b/vendor/github.com/apache/thrift/lib/go/thrift/pointerize.go new file mode 100644 index 00000000..8d6b2c21 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/pointerize.go @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +/////////////////////////////////////////////////////////////////////////////// +// This file is home to helpers that convert from various base types to +// respective pointer types. This is necessary because Go does not permit +// references to constants, nor can a pointer type to base type be allocated +// and initialized in a single expression. +// +// E.g., this is not allowed: +// +// var ip *int = &5 +// +// But this *is* allowed: +// +// func IntPtr(i int) *int { return &i } +// var ip *int = IntPtr(5) +// +// Since pointers to base types are commonplace as [optional] fields in +// exported thrift structs, we factor such helpers here. +/////////////////////////////////////////////////////////////////////////////// + +func Float32Ptr(v float32) *float32 { return &v } +func Float64Ptr(v float64) *float64 { return &v } +func IntPtr(v int) *int { return &v } +func Int32Ptr(v int32) *int32 { return &v } +func Int64Ptr(v int64) *int64 { return &v } +func StringPtr(v string) *string { return &v } +func Uint32Ptr(v uint32) *uint32 { return &v } +func Uint64Ptr(v uint64) *uint64 { return &v } +func BoolPtr(v bool) *bool { return &v } +func ByteSlicePtr(v []byte) *[]byte { return &v } diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/processor.go b/vendor/github.com/apache/thrift/lib/go/thrift/processor.go new file mode 100644 index 00000000..ca0d3faf --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/processor.go @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// A processor is a generic object which operates upon an input stream and +// writes to some output stream. +type TProcessor interface { + Process(in, out TProtocol) (bool, TException) +} + +type TProcessorFunction interface { + Process(seqId int32, in, out TProtocol) (bool, TException) +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/processor_factory.go b/vendor/github.com/apache/thrift/lib/go/thrift/processor_factory.go new file mode 100644 index 00000000..9d645df2 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/processor_factory.go @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// The default processor factory just returns a singleton +// instance. +type TProcessorFactory interface { + GetProcessor(trans TTransport) TProcessor +} + +type tProcessorFactory struct { + processor TProcessor +} + +func NewTProcessorFactory(p TProcessor) TProcessorFactory { + return &tProcessorFactory{processor: p} +} + +func (p *tProcessorFactory) GetProcessor(trans TTransport) TProcessor { + return p.processor +} + +/** + * The default processor factory just returns a singleton + * instance. + */ +type TProcessorFunctionFactory interface { + GetProcessorFunction(trans TTransport) TProcessorFunction +} + +type tProcessorFunctionFactory struct { + processor TProcessorFunction +} + +func NewTProcessorFunctionFactory(p TProcessorFunction) TProcessorFunctionFactory { + return &tProcessorFunctionFactory{processor: p} +} + +func (p *tProcessorFunctionFactory) GetProcessorFunction(trans TTransport) TProcessorFunction { + return p.processor +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/protocol.go b/vendor/github.com/apache/thrift/lib/go/thrift/protocol.go new file mode 100644 index 00000000..45fa202e --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/protocol.go @@ -0,0 +1,175 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" +) + +const ( + VERSION_MASK = 0xffff0000 + VERSION_1 = 0x80010000 +) + +type TProtocol interface { + WriteMessageBegin(name string, typeId TMessageType, seqid int32) error + WriteMessageEnd() error + WriteStructBegin(name string) error + WriteStructEnd() error + WriteFieldBegin(name string, typeId TType, id int16) error + WriteFieldEnd() error + WriteFieldStop() error + WriteMapBegin(keyType TType, valueType TType, size int) error + WriteMapEnd() error + WriteListBegin(elemType TType, size int) error + WriteListEnd() error + WriteSetBegin(elemType TType, size int) error + WriteSetEnd() error + WriteBool(value bool) error + WriteByte(value int8) error + WriteI16(value int16) error + WriteI32(value int32) error + WriteI64(value int64) error + WriteDouble(value float64) error + WriteString(value string) error + WriteBinary(value []byte) error + + ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error) + ReadMessageEnd() error + ReadStructBegin() (name string, err error) + ReadStructEnd() error + ReadFieldBegin() (name string, typeId TType, id int16, err error) + ReadFieldEnd() error + ReadMapBegin() (keyType TType, valueType TType, size int, err error) + ReadMapEnd() error + ReadListBegin() (elemType TType, size int, err error) + ReadListEnd() error + ReadSetBegin() (elemType TType, size int, err error) + ReadSetEnd() error + ReadBool() (value bool, err error) + ReadByte() (value int8, err error) + ReadI16() (value int16, err error) + ReadI32() (value int32, err error) + ReadI64() (value int64, err error) + ReadDouble() (value float64, err error) + ReadString() (value string, err error) + ReadBinary() (value []byte, err error) + + Skip(fieldType TType) (err error) + Flush() (err error) + + Transport() TTransport +} + +// The maximum recursive depth the skip() function will traverse +const DEFAULT_RECURSION_DEPTH = 64 + +// Skips over the next data element from the provided input TProtocol object. +func SkipDefaultDepth(prot TProtocol, typeId TType) (err error) { + return Skip(prot, typeId, DEFAULT_RECURSION_DEPTH) +} + +// Skips over the next data element from the provided input TProtocol object. +func Skip(self TProtocol, fieldType TType, maxDepth int) (err error) { + + if maxDepth <= 0 { + return NewTProtocolExceptionWithType( DEPTH_LIMIT, errors.New("Depth limit exceeded")) + } + + switch fieldType { + case STOP: + return + case BOOL: + _, err = self.ReadBool() + return + case BYTE: + _, err = self.ReadByte() + return + case I16: + _, err = self.ReadI16() + return + case I32: + _, err = self.ReadI32() + return + case I64: + _, err = self.ReadI64() + return + case DOUBLE: + _, err = self.ReadDouble() + return + case STRING: + _, err = self.ReadString() + return + case STRUCT: + if _, err = self.ReadStructBegin(); err != nil { + return err + } + for { + _, typeId, _, _ := self.ReadFieldBegin() + if typeId == STOP { + break + } + err := Skip(self, typeId, maxDepth-1) + if err != nil { + return err + } + self.ReadFieldEnd() + } + return self.ReadStructEnd() + case MAP: + keyType, valueType, size, err := self.ReadMapBegin() + if err != nil { + return err + } + for i := 0; i < size; i++ { + err := Skip(self, keyType, maxDepth-1) + if err != nil { + return err + } + self.Skip(valueType) + } + return self.ReadMapEnd() + case SET: + elemType, size, err := self.ReadSetBegin() + if err != nil { + return err + } + for i := 0; i < size; i++ { + err := Skip(self, elemType, maxDepth-1) + if err != nil { + return err + } + } + return self.ReadSetEnd() + case LIST: + elemType, size, err := self.ReadListBegin() + if err != nil { + return err + } + for i := 0; i < size; i++ { + err := Skip(self, elemType, maxDepth-1) + if err != nil { + return err + } + } + return self.ReadListEnd() + } + return nil +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/protocol_exception.go b/vendor/github.com/apache/thrift/lib/go/thrift/protocol_exception.go new file mode 100644 index 00000000..6e357ee8 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/protocol_exception.go @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "encoding/base64" +) + +// Thrift Protocol exception +type TProtocolException interface { + TException + TypeId() int +} + +const ( + UNKNOWN_PROTOCOL_EXCEPTION = 0 + INVALID_DATA = 1 + NEGATIVE_SIZE = 2 + SIZE_LIMIT = 3 + BAD_VERSION = 4 + NOT_IMPLEMENTED = 5 + DEPTH_LIMIT = 6 +) + +type tProtocolException struct { + typeId int + message string +} + +func (p *tProtocolException) TypeId() int { + return p.typeId +} + +func (p *tProtocolException) String() string { + return p.message +} + +func (p *tProtocolException) Error() string { + return p.message +} + +func NewTProtocolException(err error) TProtocolException { + if err == nil { + return nil + } + if e,ok := err.(TProtocolException); ok { + return e + } + if _, ok := err.(base64.CorruptInputError); ok { + return &tProtocolException{INVALID_DATA, err.Error()} + } + return &tProtocolException{UNKNOWN_PROTOCOL_EXCEPTION, err.Error()} +} + +func NewTProtocolExceptionWithType(errType int, err error) TProtocolException { + if err == nil { + return nil + } + return &tProtocolException{errType, err.Error()} +} + diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/protocol_factory.go b/vendor/github.com/apache/thrift/lib/go/thrift/protocol_factory.go new file mode 100644 index 00000000..c40f796d --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/protocol_factory.go @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Factory interface for constructing protocol instances. +type TProtocolFactory interface { + GetProtocol(trans TTransport) TProtocol +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/rich_transport.go b/vendor/github.com/apache/thrift/lib/go/thrift/rich_transport.go new file mode 100644 index 00000000..8e296a99 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/rich_transport.go @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import "io" + +type RichTransport struct { + TTransport +} + +// Wraps Transport to provide TRichTransport interface +func NewTRichTransport(trans TTransport) *RichTransport { + return &RichTransport{trans} +} + +func (r *RichTransport) ReadByte() (c byte, err error) { + return readByte(r.TTransport) +} + +func (r *RichTransport) WriteByte(c byte) error { + return writeByte(r.TTransport, c) +} + +func (r *RichTransport) WriteString(s string) (n int, err error) { + return r.Write([]byte(s)) +} + +func (r *RichTransport) RemainingBytes() (num_bytes uint64) { + return r.TTransport.RemainingBytes() +} + +func readByte(r io.Reader) (c byte, err error) { + v := [1]byte{0} + n, err := r.Read(v[0:1]) + if n > 0 && (err == nil || err == io.EOF) { + return v[0], nil + } + if n > 0 && err != nil { + return v[0], err + } + if err != nil { + return 0, err + } + return v[0], nil +} + +func writeByte(w io.Writer, c byte) error { + v := [1]byte{c} + _, err := w.Write(v[0:1]) + return err +} + diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/serializer.go b/vendor/github.com/apache/thrift/lib/go/thrift/serializer.go new file mode 100644 index 00000000..77122299 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/serializer.go @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +type TSerializer struct { + Transport *TMemoryBuffer + Protocol TProtocol +} + +type TStruct interface { + Write(p TProtocol) error + Read(p TProtocol) error +} + +func NewTSerializer() *TSerializer { + transport := NewTMemoryBufferLen(1024) + protocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport) + + return &TSerializer{ + transport, + protocol} +} + +func (t *TSerializer) WriteString(msg TStruct) (s string, err error) { + t.Transport.Reset() + + if err = msg.Write(t.Protocol); err != nil { + return + } + + if err = t.Protocol.Flush(); err != nil { + return + } + if err = t.Transport.Flush(); err != nil { + return + } + + return t.Transport.String(), nil +} + +func (t *TSerializer) Write(msg TStruct) (b []byte, err error) { + t.Transport.Reset() + + if err = msg.Write(t.Protocol); err != nil { + return + } + + if err = t.Protocol.Flush(); err != nil { + return + } + + if err = t.Transport.Flush(); err != nil { + return + } + + b = append(b, t.Transport.Bytes()...) + return +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/server.go b/vendor/github.com/apache/thrift/lib/go/thrift/server.go new file mode 100644 index 00000000..f813fa35 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/server.go @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +type TServer interface { + ProcessorFactory() TProcessorFactory + ServerTransport() TServerTransport + InputTransportFactory() TTransportFactory + OutputTransportFactory() TTransportFactory + InputProtocolFactory() TProtocolFactory + OutputProtocolFactory() TProtocolFactory + + // Starts the server + Serve() error + // Stops the server. This is optional on a per-implementation basis. Not + // all servers are required to be cleanly stoppable. + Stop() error +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/server_socket.go b/vendor/github.com/apache/thrift/lib/go/thrift/server_socket.go new file mode 100644 index 00000000..2581056b --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/server_socket.go @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "net" + "sync" + "time" +) + +type TServerSocket struct { + listener net.Listener + addr net.Addr + clientTimeout time.Duration + + // Protects the interrupted value to make it thread safe. + mu sync.RWMutex + interrupted bool +} + +func NewTServerSocket(listenAddr string) (*TServerSocket, error) { + return NewTServerSocketTimeout(listenAddr, 0) +} + +func NewTServerSocketTimeout(listenAddr string, clientTimeout time.Duration) (*TServerSocket, error) { + addr, err := net.ResolveTCPAddr("tcp", listenAddr) + if err != nil { + return nil, err + } + return &TServerSocket{addr: addr, clientTimeout: clientTimeout}, nil +} + +func (p *TServerSocket) Listen() error { + if p.IsListening() { + return nil + } + l, err := net.Listen(p.addr.Network(), p.addr.String()) + if err != nil { + return err + } + p.listener = l + return nil +} + +func (p *TServerSocket) Accept() (TTransport, error) { + p.mu.RLock() + interrupted := p.interrupted + p.mu.RUnlock() + + if interrupted { + return nil, errTransportInterrupted + } + if p.listener == nil { + return nil, NewTTransportException(NOT_OPEN, "No underlying server socket") + } + conn, err := p.listener.Accept() + if err != nil { + return nil, NewTTransportExceptionFromError(err) + } + return NewTSocketFromConnTimeout(conn, p.clientTimeout), nil +} + +// Checks whether the socket is listening. +func (p *TServerSocket) IsListening() bool { + return p.listener != nil +} + +// Connects the socket, creating a new socket object if necessary. +func (p *TServerSocket) Open() error { + if p.IsListening() { + return NewTTransportException(ALREADY_OPEN, "Server socket already open") + } + if l, err := net.Listen(p.addr.Network(), p.addr.String()); err != nil { + return err + } else { + p.listener = l + } + return nil +} + +func (p *TServerSocket) Addr() net.Addr { + if p.listener != nil { + return p.listener.Addr() + } + return p.addr +} + +func (p *TServerSocket) Close() error { + defer func() { + p.listener = nil + }() + if p.IsListening() { + return p.listener.Close() + } + return nil +} + +func (p *TServerSocket) Interrupt() error { + p.mu.Lock() + p.interrupted = true + p.mu.Unlock() + + return nil +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/server_transport.go b/vendor/github.com/apache/thrift/lib/go/thrift/server_transport.go new file mode 100644 index 00000000..51c40b64 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/server_transport.go @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Server transport. Object which provides client transports. +type TServerTransport interface { + Listen() error + Accept() (TTransport, error) + Close() error + + // Optional method implementation. This signals to the server transport + // that it should break out of any accept() or listen() that it is currently + // blocked on. This method, if implemented, MUST be thread safe, as it may + // be called from a different thread context than the other TServerTransport + // methods. + Interrupt() error +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/simple_json_protocol.go b/vendor/github.com/apache/thrift/lib/go/thrift/simple_json_protocol.go new file mode 100644 index 00000000..d30e2bc0 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/simple_json_protocol.go @@ -0,0 +1,1320 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bufio" + "bytes" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "math" + "strconv" +) + +type _ParseContext int + +const ( + _CONTEXT_IN_TOPLEVEL _ParseContext = 1 + _CONTEXT_IN_LIST_FIRST _ParseContext = 2 + _CONTEXT_IN_LIST _ParseContext = 3 + _CONTEXT_IN_OBJECT_FIRST _ParseContext = 4 + _CONTEXT_IN_OBJECT_NEXT_KEY _ParseContext = 5 + _CONTEXT_IN_OBJECT_NEXT_VALUE _ParseContext = 6 +) + +func (p _ParseContext) String() string { + switch p { + case _CONTEXT_IN_TOPLEVEL: + return "TOPLEVEL" + case _CONTEXT_IN_LIST_FIRST: + return "LIST-FIRST" + case _CONTEXT_IN_LIST: + return "LIST" + case _CONTEXT_IN_OBJECT_FIRST: + return "OBJECT-FIRST" + case _CONTEXT_IN_OBJECT_NEXT_KEY: + return "OBJECT-NEXT-KEY" + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + return "OBJECT-NEXT-VALUE" + } + return "UNKNOWN-PARSE-CONTEXT" +} + +// JSON protocol implementation for thrift. +// +// This protocol produces/consumes a simple output format +// suitable for parsing by scripting languages. It should not be +// confused with the full-featured TJSONProtocol. +// +type TSimpleJSONProtocol struct { + trans TTransport + + parseContextStack []int + dumpContext []int + + writer *bufio.Writer + reader *bufio.Reader +} + +// Constructor +func NewTSimpleJSONProtocol(t TTransport) *TSimpleJSONProtocol { + v := &TSimpleJSONProtocol{trans: t, + writer: bufio.NewWriter(t), + reader: bufio.NewReader(t), + } + v.parseContextStack = append(v.parseContextStack, int(_CONTEXT_IN_TOPLEVEL)) + v.dumpContext = append(v.dumpContext, int(_CONTEXT_IN_TOPLEVEL)) + return v +} + +// Factory +type TSimpleJSONProtocolFactory struct{} + +func (p *TSimpleJSONProtocolFactory) GetProtocol(trans TTransport) TProtocol { + return NewTSimpleJSONProtocol(trans) +} + +func NewTSimpleJSONProtocolFactory() *TSimpleJSONProtocolFactory { + return &TSimpleJSONProtocolFactory{} +} + +var ( + JSON_COMMA []byte + JSON_COLON []byte + JSON_LBRACE []byte + JSON_RBRACE []byte + JSON_LBRACKET []byte + JSON_RBRACKET []byte + JSON_QUOTE byte + JSON_QUOTE_BYTES []byte + JSON_NULL []byte + JSON_TRUE []byte + JSON_FALSE []byte + JSON_INFINITY string + JSON_NEGATIVE_INFINITY string + JSON_NAN string + JSON_INFINITY_BYTES []byte + JSON_NEGATIVE_INFINITY_BYTES []byte + JSON_NAN_BYTES []byte + json_nonbase_map_elem_bytes []byte +) + +func init() { + JSON_COMMA = []byte{','} + JSON_COLON = []byte{':'} + JSON_LBRACE = []byte{'{'} + JSON_RBRACE = []byte{'}'} + JSON_LBRACKET = []byte{'['} + JSON_RBRACKET = []byte{']'} + JSON_QUOTE = '"' + JSON_QUOTE_BYTES = []byte{'"'} + JSON_NULL = []byte{'n', 'u', 'l', 'l'} + JSON_TRUE = []byte{'t', 'r', 'u', 'e'} + JSON_FALSE = []byte{'f', 'a', 'l', 's', 'e'} + JSON_INFINITY = "Infinity" + JSON_NEGATIVE_INFINITY = "-Infinity" + JSON_NAN = "NaN" + JSON_INFINITY_BYTES = []byte{'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'} + JSON_NEGATIVE_INFINITY_BYTES = []byte{'-', 'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'} + JSON_NAN_BYTES = []byte{'N', 'a', 'N'} + json_nonbase_map_elem_bytes = []byte{']', ',', '['} +} + +func jsonQuote(s string) string { + b, _ := json.Marshal(s) + s1 := string(b) + return s1 +} + +func jsonUnquote(s string) (string, bool) { + s1 := new(string) + err := json.Unmarshal([]byte(s), s1) + return *s1, err == nil +} + +func mismatch(expected, actual string) error { + return fmt.Errorf("Expected '%s' but found '%s' while parsing JSON.", expected, actual) +} + +func (p *TSimpleJSONProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteString(name); e != nil { + return e + } + if e := p.WriteByte(int8(typeId)); e != nil { + return e + } + if e := p.WriteI32(seqId); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) WriteMessageEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteStructBegin(name string) error { + if e := p.OutputObjectBegin(); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) WriteStructEnd() error { + return p.OutputObjectEnd() +} + +func (p *TSimpleJSONProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + if e := p.WriteString(name); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) WriteFieldEnd() error { + //return p.OutputListEnd() + return nil +} + +func (p *TSimpleJSONProtocol) WriteFieldStop() error { return nil } + +func (p *TSimpleJSONProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteByte(int8(keyType)); e != nil { + return e + } + if e := p.WriteByte(int8(valueType)); e != nil { + return e + } + return p.WriteI32(int32(size)) +} + +func (p *TSimpleJSONProtocol) WriteMapEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteListBegin(elemType TType, size int) error { + return p.OutputElemListBegin(elemType, size) +} + +func (p *TSimpleJSONProtocol) WriteListEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteSetBegin(elemType TType, size int) error { + return p.OutputElemListBegin(elemType, size) +} + +func (p *TSimpleJSONProtocol) WriteSetEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteBool(b bool) error { + return p.OutputBool(b) +} + +func (p *TSimpleJSONProtocol) WriteByte(b int8) error { + return p.WriteI32(int32(b)) +} + +func (p *TSimpleJSONProtocol) WriteI16(v int16) error { + return p.WriteI32(int32(v)) +} + +func (p *TSimpleJSONProtocol) WriteI32(v int32) error { + return p.OutputI64(int64(v)) +} + +func (p *TSimpleJSONProtocol) WriteI64(v int64) error { + return p.OutputI64(int64(v)) +} + +func (p *TSimpleJSONProtocol) WriteDouble(v float64) error { + return p.OutputF64(v) +} + +func (p *TSimpleJSONProtocol) WriteString(v string) error { + return p.OutputString(v) +} + +func (p *TSimpleJSONProtocol) WriteBinary(v []byte) error { + // JSON library only takes in a string, + // not an arbitrary byte array, to ensure bytes are transmitted + // efficiently we must convert this into a valid JSON string + // therefore we use base64 encoding to avoid excessive escaping/quoting + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.writer.Write(JSON_QUOTE_BYTES); e != nil { + return NewTProtocolException(e) + } + writer := base64.NewEncoder(base64.StdEncoding, p.writer) + if _, e := writer.Write(v); e != nil { + return NewTProtocolException(e) + } + if e := writer.Close(); e != nil { + return NewTProtocolException(e) + } + if _, e := p.writer.Write(JSON_QUOTE_BYTES); e != nil { + return NewTProtocolException(e) + } + return p.OutputPostValue() +} + +// Reading methods. +func (p *TSimpleJSONProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + if isNull, err := p.ParseListBegin(); isNull || err != nil { + return name, typeId, seqId, err + } + if name, err = p.ReadString(); err != nil { + return name, typeId, seqId, err + } + bTypeId, err := p.ReadByte() + typeId = TMessageType(bTypeId) + if err != nil { + return name, typeId, seqId, err + } + if seqId, err = p.ReadI32(); err != nil { + return name, typeId, seqId, err + } + return name, typeId, seqId, nil +} + +func (p *TSimpleJSONProtocol) ReadMessageEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadStructBegin() (name string, err error) { + _, err = p.ParseObjectStart() + return "", err +} + +func (p *TSimpleJSONProtocol) ReadStructEnd() error { + return p.ParseObjectEnd() +} + +func (p *TSimpleJSONProtocol) ReadFieldBegin() (string, TType, int16, error) { + if err := p.ParsePreValue(); err != nil { + return "", STOP, 0, err + } + b, _ := p.reader.Peek(1) + if len(b) > 0 { + switch b[0] { + case JSON_RBRACE[0]: + return "", STOP, 0, nil + case JSON_QUOTE: + p.reader.ReadByte() + name, err := p.ParseStringBody() + // simplejson is not meant to be read back into thrift + // - see http://wiki.apache.org/thrift/ThriftUsageJava + // - use JSON instead + if err != nil { + return name, STOP, 0, err + } + return name, STOP, -1, p.ParsePostValue() + /* + if err = p.ParsePostValue(); err != nil { + return name, STOP, 0, err + } + if isNull, err := p.ParseListBegin(); isNull || err != nil { + return name, STOP, 0, err + } + bType, err := p.ReadByte() + thetype := TType(bType) + if err != nil { + return name, thetype, 0, err + } + id, err := p.ReadI16() + return name, thetype, id, err + */ + } + e := fmt.Errorf("Expected \"}\" or '\"', but found: '%s'", string(b)) + return "", STOP, 0, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return "", STOP, 0, NewTProtocolException(io.EOF) +} + +func (p *TSimpleJSONProtocol) ReadFieldEnd() error { + return nil + //return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, VOID, 0, e + } + + // read keyType + bKeyType, e := p.ReadByte() + keyType = TType(bKeyType) + if e != nil { + return keyType, valueType, size, e + } + + // read valueType + bValueType, e := p.ReadByte() + valueType = TType(bValueType) + if e != nil { + return keyType, valueType, size, e + } + + // read size + iSize, err := p.ReadI64() + size = int(iSize) + return keyType, valueType, size, err +} + +func (p *TSimpleJSONProtocol) ReadMapEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadListBegin() (elemType TType, size int, e error) { + return p.ParseElemListBegin() +} + +func (p *TSimpleJSONProtocol) ReadListEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadSetBegin() (elemType TType, size int, e error) { + return p.ParseElemListBegin() +} + +func (p *TSimpleJSONProtocol) ReadSetEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadBool() (bool, error) { + var value bool + + if err := p.ParsePreValue(); err != nil { + return value, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 { + switch f[0] { + case JSON_TRUE[0]: + b := make([]byte, len(JSON_TRUE)) + _, err := p.reader.Read(b) + if err != nil { + return false, NewTProtocolException(err) + } + if string(b) == string(JSON_TRUE) { + value = true + } else { + e := fmt.Errorf("Expected \"true\" but found: %s", string(b)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + break + case JSON_FALSE[0]: + b := make([]byte, len(JSON_FALSE)) + _, err := p.reader.Read(b) + if err != nil { + return false, NewTProtocolException(err) + } + if string(b) == string(JSON_FALSE) { + value = false + } else { + e := fmt.Errorf("Expected \"false\" but found: %s", string(b)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + break + case JSON_NULL[0]: + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return false, NewTProtocolException(err) + } + if string(b) == string(JSON_NULL) { + value = false + } else { + e := fmt.Errorf("Expected \"null\" but found: %s", string(b)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + default: + e := fmt.Errorf("Expected \"true\", \"false\", or \"null\" but found: %s", string(f)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + return value, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ReadByte() (int8, error) { + v, err := p.ReadI64() + return int8(v), err +} + +func (p *TSimpleJSONProtocol) ReadI16() (int16, error) { + v, err := p.ReadI64() + return int16(v), err +} + +func (p *TSimpleJSONProtocol) ReadI32() (int32, error) { + v, err := p.ReadI64() + return int32(v), err +} + +func (p *TSimpleJSONProtocol) ReadI64() (int64, error) { + v, _, err := p.ParseI64() + return v, err +} + +func (p *TSimpleJSONProtocol) ReadDouble() (float64, error) { + v, _, err := p.ParseF64() + return v, err +} + +func (p *TSimpleJSONProtocol) ReadString() (string, error) { + var v string + if err := p.ParsePreValue(); err != nil { + return v, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 && f[0] == JSON_QUOTE { + p.reader.ReadByte() + value, err := p.ParseStringBody() + v = value + if err != nil { + return v, err + } + } else if len(f) >= 0 && f[0] == JSON_NULL[0] { + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return v, NewTProtocolException(err) + } + if string(b) != string(JSON_NULL) { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } else { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return v, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ReadBinary() ([]byte, error) { + var v []byte + if err := p.ParsePreValue(); err != nil { + return nil, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 && f[0] == JSON_QUOTE { + p.reader.ReadByte() + value, err := p.ParseBase64EncodedBody() + v = value + if err != nil { + return v, err + } + } else if len(f) >= 0 && f[0] == JSON_NULL[0] { + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return v, NewTProtocolException(err) + } + if string(b) != string(JSON_NULL) { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } else { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + + return v, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) Flush() (err error) { + return NewTProtocolException(p.writer.Flush()) +} + +func (p *TSimpleJSONProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TSimpleJSONProtocol) Transport() TTransport { + return p.trans +} + +func (p *TSimpleJSONProtocol) OutputPreValue() error { + cxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1]) + switch cxt { + case _CONTEXT_IN_LIST, _CONTEXT_IN_OBJECT_NEXT_KEY: + if _, e := p.writer.Write(JSON_COMMA); e != nil { + return NewTProtocolException(e) + } + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + if _, e := p.writer.Write(JSON_COLON); e != nil { + return NewTProtocolException(e) + } + break + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputPostValue() error { + cxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1]) + switch cxt { + case _CONTEXT_IN_LIST_FIRST: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST)) + break + case _CONTEXT_IN_OBJECT_FIRST: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) + break + case _CONTEXT_IN_OBJECT_NEXT_KEY: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_KEY)) + break + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputBool(value bool) error { + if e := p.OutputPreValue(); e != nil { + return e + } + var v string + if value { + v = string(JSON_TRUE) + } else { + v = string(JSON_FALSE) + } + switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + v = jsonQuote(v) + default: + } + if e := p.OutputStringData(v); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputNull() error { + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.writer.Write(JSON_NULL); e != nil { + return NewTProtocolException(e) + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputF64(value float64) error { + if e := p.OutputPreValue(); e != nil { + return e + } + var v string + if math.IsNaN(value) { + v = string(JSON_QUOTE) + JSON_NAN + string(JSON_QUOTE) + } else if math.IsInf(value, 1) { + v = string(JSON_QUOTE) + JSON_INFINITY + string(JSON_QUOTE) + } else if math.IsInf(value, -1) { + v = string(JSON_QUOTE) + JSON_NEGATIVE_INFINITY + string(JSON_QUOTE) + } else { + v = strconv.FormatFloat(value, 'g', -1, 64) + switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + v = string(JSON_QUOTE) + v + string(JSON_QUOTE) + default: + } + } + if e := p.OutputStringData(v); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputI64(value int64) error { + if e := p.OutputPreValue(); e != nil { + return e + } + v := strconv.FormatInt(value, 10) + switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + v = jsonQuote(v) + default: + } + if e := p.OutputStringData(v); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputString(s string) error { + if e := p.OutputPreValue(); e != nil { + return e + } + if e := p.OutputStringData(jsonQuote(s)); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputStringData(s string) error { + _, e := p.writer.Write([]byte(s)) + return NewTProtocolException(e) +} + +func (p *TSimpleJSONProtocol) OutputObjectBegin() error { + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.writer.Write(JSON_LBRACE); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_FIRST)) + return nil +} + +func (p *TSimpleJSONProtocol) OutputObjectEnd() error { + if _, e := p.writer.Write(JSON_RBRACE); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + if e := p.OutputPostValue(); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputListBegin() error { + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.writer.Write(JSON_LBRACKET); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST_FIRST)) + return nil +} + +func (p *TSimpleJSONProtocol) OutputListEnd() error { + if _, e := p.writer.Write(JSON_RBRACKET); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + if e := p.OutputPostValue(); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputElemListBegin(elemType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteByte(int8(elemType)); e != nil { + return e + } + if e := p.WriteI64(int64(size)); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) ParsePreValue() error { + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + b, _ := p.reader.Peek(1) + switch cxt { + case _CONTEXT_IN_LIST: + if len(b) > 0 { + switch b[0] { + case JSON_RBRACKET[0]: + return nil + case JSON_COMMA[0]: + p.reader.ReadByte() + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + return nil + default: + e := fmt.Errorf("Expected \"]\" or \",\" in list context, but found \"%s\"", string(b)) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + break + case _CONTEXT_IN_OBJECT_NEXT_KEY: + if len(b) > 0 { + switch b[0] { + case JSON_RBRACE[0]: + return nil + case JSON_COMMA[0]: + p.reader.ReadByte() + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + return nil + default: + e := fmt.Errorf("Expected \"}\" or \",\" in object context, but found \"%s\"", string(b)) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + if len(b) > 0 { + switch b[0] { + case JSON_COLON[0]: + p.reader.ReadByte() + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + return nil + default: + e := fmt.Errorf("Expected \":\" in object context, but found \"%s\"", string(b)) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + break + } + return nil +} + +func (p *TSimpleJSONProtocol) ParsePostValue() error { + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + switch cxt { + case _CONTEXT_IN_LIST_FIRST: + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST)) + break + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_KEY)) + break + } + return nil +} + +func (p *TSimpleJSONProtocol) readNonSignificantWhitespace() error { + for { + b, _ := p.reader.Peek(1) + if len(b) < 1 { + return nil + } + switch b[0] { + case ' ', '\r', '\n', '\t': + p.reader.ReadByte() + continue + default: + break + } + break + } + return nil +} + +func (p *TSimpleJSONProtocol) ParseStringBody() (string, error) { + line, err := p.reader.ReadString(JSON_QUOTE) + if err != nil { + return "", NewTProtocolException(err) + } + l := len(line) + // count number of escapes to see if we need to keep going + i := 1 + for ; i < l; i++ { + if line[l-i-1] != '\\' { + break + } + } + if i&0x01 == 1 { + v, ok := jsonUnquote(string(JSON_QUOTE) + line) + if !ok { + return "", NewTProtocolException(err) + } + return v, nil + } + s, err := p.ParseQuotedStringBody() + if err != nil { + return "", NewTProtocolException(err) + } + str := string(JSON_QUOTE) + line + s + v, ok := jsonUnquote(str) + if !ok { + e := fmt.Errorf("Unable to parse as JSON string %s", str) + return "", NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return v, nil +} + +func (p *TSimpleJSONProtocol) ParseQuotedStringBody() (string, error) { + line, err := p.reader.ReadString(JSON_QUOTE) + if err != nil { + return "", NewTProtocolException(err) + } + l := len(line) + // count number of escapes to see if we need to keep going + i := 1 + for ; i < l; i++ { + if line[l-i-1] != '\\' { + break + } + } + if i&0x01 == 1 { + return line, nil + } + s, err := p.ParseQuotedStringBody() + if err != nil { + return "", NewTProtocolException(err) + } + v := line + s + return v, nil +} + +func (p *TSimpleJSONProtocol) ParseBase64EncodedBody() ([]byte, error) { + line, err := p.reader.ReadBytes(JSON_QUOTE) + if err != nil { + return line, NewTProtocolException(err) + } + line2 := line[0 : len(line)-1] + l := len(line2) + if (l % 4) != 0 { + pad := 4 - (l % 4) + fill := [...]byte{'=', '=', '='} + line2 = append(line2, fill[:pad]...) + l = len(line2) + } + output := make([]byte, base64.StdEncoding.DecodedLen(l)) + n, err := base64.StdEncoding.Decode(output, line2) + return output[0:n], NewTProtocolException(err) +} + +func (p *TSimpleJSONProtocol) ParseI64() (int64, bool, error) { + if err := p.ParsePreValue(); err != nil { + return 0, false, err + } + var value int64 + var isnull bool + if p.safePeekContains(JSON_NULL) { + p.reader.Read(make([]byte, len(JSON_NULL))) + isnull = true + } else { + num, err := p.readNumeric() + isnull = (num == nil) + if !isnull { + value = num.Int64() + } + if err != nil { + return value, isnull, err + } + } + return value, isnull, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ParseF64() (float64, bool, error) { + if err := p.ParsePreValue(); err != nil { + return 0, false, err + } + var value float64 + var isnull bool + if p.safePeekContains(JSON_NULL) { + p.reader.Read(make([]byte, len(JSON_NULL))) + isnull = true + } else { + num, err := p.readNumeric() + isnull = (num == nil) + if !isnull { + value = num.Float64() + } + if err != nil { + return value, isnull, err + } + } + return value, isnull, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ParseObjectStart() (bool, error) { + if err := p.ParsePreValue(); err != nil { + return false, err + } + var b []byte + b, err := p.reader.Peek(1) + if err != nil { + return false, err + } + if len(b) > 0 && b[0] == JSON_LBRACE[0] { + p.reader.ReadByte() + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_FIRST)) + return false, nil + } else if p.safePeekContains(JSON_NULL) { + return true, nil + } + e := fmt.Errorf("Expected '{' or null, but found '%s'", string(b)) + return false, NewTProtocolExceptionWithType(INVALID_DATA, e) +} + +func (p *TSimpleJSONProtocol) ParseObjectEnd() error { + if isNull, err := p.readIfNull(); isNull || err != nil { + return err + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + if (cxt != _CONTEXT_IN_OBJECT_FIRST) && (cxt != _CONTEXT_IN_OBJECT_NEXT_KEY) { + e := fmt.Errorf("Expected to be in the Object Context, but not in Object Context (%d)", cxt) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + line, err := p.reader.ReadString(JSON_RBRACE[0]) + if err != nil { + return NewTProtocolException(err) + } + for _, char := range line { + switch char { + default: + e := fmt.Errorf("Expecting end of object \"}\", but found: \"%s\"", line) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + case ' ', '\n', '\r', '\t', '}': + break + } + } + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + return p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ParseListBegin() (isNull bool, err error) { + if e := p.ParsePreValue(); e != nil { + return false, e + } + var b []byte + b, err = p.reader.Peek(1) + if err != nil { + return false, err + } + if len(b) >= 1 && b[0] == JSON_LBRACKET[0] { + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST_FIRST)) + p.reader.ReadByte() + isNull = false + } else if p.safePeekContains(JSON_NULL) { + isNull = true + } else { + err = fmt.Errorf("Expected \"null\" or \"[\", received %q", b) + } + return isNull, NewTProtocolExceptionWithType(INVALID_DATA, err) +} + +func (p *TSimpleJSONProtocol) ParseElemListBegin() (elemType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, 0, e + } + bElemType, err := p.ReadByte() + elemType = TType(bElemType) + if err != nil { + return elemType, size, err + } + nSize, err2 := p.ReadI64() + size = int(nSize) + return elemType, size, err2 +} + +func (p *TSimpleJSONProtocol) ParseListEnd() error { + if isNull, err := p.readIfNull(); isNull || err != nil { + return err + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + if cxt != _CONTEXT_IN_LIST { + e := fmt.Errorf("Expected to be in the List Context, but not in List Context (%d)", cxt) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + line, err := p.reader.ReadString(JSON_RBRACKET[0]) + if err != nil { + return NewTProtocolException(err) + } + for _, char := range line { + switch char { + default: + e := fmt.Errorf("Expecting end of list \"]\", but found: \"", line, "\"") + return NewTProtocolExceptionWithType(INVALID_DATA, e) + case ' ', '\n', '\r', '\t', rune(JSON_RBRACKET[0]): + break + } + } + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + if _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) == _CONTEXT_IN_TOPLEVEL { + return nil + } + return p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) readSingleValue() (interface{}, TType, error) { + e := p.readNonSignificantWhitespace() + if e != nil { + return nil, VOID, NewTProtocolException(e) + } + b, e := p.reader.Peek(1) + if len(b) > 0 { + c := b[0] + switch c { + case JSON_NULL[0]: + buf := make([]byte, len(JSON_NULL)) + _, e := p.reader.Read(buf) + if e != nil { + return nil, VOID, NewTProtocolException(e) + } + if string(JSON_NULL) != string(buf) { + e = mismatch(string(JSON_NULL), string(buf)) + return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return nil, VOID, nil + case JSON_QUOTE: + p.reader.ReadByte() + v, e := p.ParseStringBody() + if e != nil { + return v, UTF8, NewTProtocolException(e) + } + if v == JSON_INFINITY { + return INFINITY, DOUBLE, nil + } else if v == JSON_NEGATIVE_INFINITY { + return NEGATIVE_INFINITY, DOUBLE, nil + } else if v == JSON_NAN { + return NAN, DOUBLE, nil + } + return v, UTF8, nil + case JSON_TRUE[0]: + buf := make([]byte, len(JSON_TRUE)) + _, e := p.reader.Read(buf) + if e != nil { + return true, BOOL, NewTProtocolException(e) + } + if string(JSON_TRUE) != string(buf) { + e := mismatch(string(JSON_TRUE), string(buf)) + return true, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return true, BOOL, nil + case JSON_FALSE[0]: + buf := make([]byte, len(JSON_FALSE)) + _, e := p.reader.Read(buf) + if e != nil { + return false, BOOL, NewTProtocolException(e) + } + if string(JSON_FALSE) != string(buf) { + e := mismatch(string(JSON_FALSE), string(buf)) + return false, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return false, BOOL, nil + case JSON_LBRACKET[0]: + _, e := p.reader.ReadByte() + return make([]interface{}, 0), LIST, NewTProtocolException(e) + case JSON_LBRACE[0]: + _, e := p.reader.ReadByte() + return make(map[string]interface{}), STRUCT, NewTProtocolException(e) + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'e', 'E', '.', '+', '-', JSON_INFINITY[0], JSON_NAN[0]: + // assume numeric + v, e := p.readNumeric() + return v, DOUBLE, e + default: + e := fmt.Errorf("Expected element in list but found '%s' while parsing JSON.", string(c)) + return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + e = fmt.Errorf("Cannot read a single element while parsing JSON.") + return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) + +} + +func (p *TSimpleJSONProtocol) readIfNull() (bool, error) { + cont := true + for cont { + b, _ := p.reader.Peek(1) + if len(b) < 1 { + return false, nil + } + switch b[0] { + default: + return false, nil + case JSON_NULL[0]: + cont = false + break + case ' ', '\n', '\r', '\t': + p.reader.ReadByte() + break + } + } + if p.safePeekContains(JSON_NULL) { + p.reader.Read(make([]byte, len(JSON_NULL))) + return true, nil + } + return false, nil +} + +func (p *TSimpleJSONProtocol) readQuoteIfNext() { + b, _ := p.reader.Peek(1) + if len(b) > 0 && b[0] == JSON_QUOTE { + p.reader.ReadByte() + } +} + +func (p *TSimpleJSONProtocol) readNumeric() (Numeric, error) { + isNull, err := p.readIfNull() + if isNull || err != nil { + return NUMERIC_NULL, err + } + hasDecimalPoint := false + nextCanBeSign := true + hasE := false + MAX_LEN := 40 + buf := bytes.NewBuffer(make([]byte, 0, MAX_LEN)) + continueFor := true + inQuotes := false + for continueFor { + c, err := p.reader.ReadByte() + if err != nil { + if err == io.EOF { + break + } + return NUMERIC_NULL, NewTProtocolException(err) + } + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + buf.WriteByte(c) + nextCanBeSign = false + case '.': + if hasDecimalPoint { + e := fmt.Errorf("Unable to parse number with multiple decimal points '%s.'", buf.String()) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if hasE { + e := fmt.Errorf("Unable to parse number with decimal points in the exponent '%s.'", buf.String()) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + buf.WriteByte(c) + hasDecimalPoint, nextCanBeSign = true, false + case 'e', 'E': + if hasE { + e := fmt.Errorf("Unable to parse number with multiple exponents '%s%c'", buf.String(), c) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + buf.WriteByte(c) + hasE, nextCanBeSign = true, true + case '-', '+': + if !nextCanBeSign { + e := fmt.Errorf("Negative sign within number") + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + buf.WriteByte(c) + nextCanBeSign = false + case ' ', 0, '\t', '\n', '\r', JSON_RBRACE[0], JSON_RBRACKET[0], JSON_COMMA[0], JSON_COLON[0]: + p.reader.UnreadByte() + continueFor = false + case JSON_NAN[0]: + if buf.Len() == 0 { + buffer := make([]byte, len(JSON_NAN)) + buffer[0] = c + _, e := p.reader.Read(buffer[1:]) + if e != nil { + return NUMERIC_NULL, NewTProtocolException(e) + } + if JSON_NAN != string(buffer) { + e := mismatch(JSON_NAN, string(buffer)) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if inQuotes { + p.readQuoteIfNext() + } + return NAN, nil + } else { + e := fmt.Errorf("Unable to parse number starting with character '%c'", c) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + case JSON_INFINITY[0]: + if buf.Len() == 0 || (buf.Len() == 1 && buf.Bytes()[0] == '+') { + buffer := make([]byte, len(JSON_INFINITY)) + buffer[0] = c + _, e := p.reader.Read(buffer[1:]) + if e != nil { + return NUMERIC_NULL, NewTProtocolException(e) + } + if JSON_INFINITY != string(buffer) { + e := mismatch(JSON_INFINITY, string(buffer)) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if inQuotes { + p.readQuoteIfNext() + } + return INFINITY, nil + } else if buf.Len() == 1 && buf.Bytes()[0] == JSON_NEGATIVE_INFINITY[0] { + buffer := make([]byte, len(JSON_NEGATIVE_INFINITY)) + buffer[0] = JSON_NEGATIVE_INFINITY[0] + buffer[1] = c + _, e := p.reader.Read(buffer[2:]) + if e != nil { + return NUMERIC_NULL, NewTProtocolException(e) + } + if JSON_NEGATIVE_INFINITY != string(buffer) { + e := mismatch(JSON_NEGATIVE_INFINITY, string(buffer)) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if inQuotes { + p.readQuoteIfNext() + } + return NEGATIVE_INFINITY, nil + } else { + e := fmt.Errorf("Unable to parse number starting with character '%c' due to existing buffer %s", c, buf.String()) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + case JSON_QUOTE: + if !inQuotes { + inQuotes = true + } else { + break + } + default: + e := fmt.Errorf("Unable to parse number starting with character '%c'", c) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + if buf.Len() == 0 { + e := fmt.Errorf("Unable to parse number from empty string ''") + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return NewNumericFromJSONString(buf.String(), false), nil +} + +// Safely peeks into the buffer, reading only what is necessary +func (p *TSimpleJSONProtocol) safePeekContains(b []byte) bool { + for i := 0; i < len(b); i++ { + a, _ := p.reader.Peek(i + 1) + if len(a) == 0 || a[i] != b[i] { + return false + } + } + return true +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/simple_server.go b/vendor/github.com/apache/thrift/lib/go/thrift/simple_server.go new file mode 100644 index 00000000..a54d8041 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/simple_server.go @@ -0,0 +1,187 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "log" + "runtime/debug" +) + +// Simple, non-concurrent server for testing. +type TSimpleServer struct { + quit chan struct{} + + processorFactory TProcessorFactory + serverTransport TServerTransport + inputTransportFactory TTransportFactory + outputTransportFactory TTransportFactory + inputProtocolFactory TProtocolFactory + outputProtocolFactory TProtocolFactory +} + +func NewTSimpleServer2(processor TProcessor, serverTransport TServerTransport) *TSimpleServer { + return NewTSimpleServerFactory2(NewTProcessorFactory(processor), serverTransport) +} + +func NewTSimpleServer4(processor TProcessor, serverTransport TServerTransport, transportFactory TTransportFactory, protocolFactory TProtocolFactory) *TSimpleServer { + return NewTSimpleServerFactory4(NewTProcessorFactory(processor), + serverTransport, + transportFactory, + protocolFactory, + ) +} + +func NewTSimpleServer6(processor TProcessor, serverTransport TServerTransport, inputTransportFactory TTransportFactory, outputTransportFactory TTransportFactory, inputProtocolFactory TProtocolFactory, outputProtocolFactory TProtocolFactory) *TSimpleServer { + return NewTSimpleServerFactory6(NewTProcessorFactory(processor), + serverTransport, + inputTransportFactory, + outputTransportFactory, + inputProtocolFactory, + outputProtocolFactory, + ) +} + +func NewTSimpleServerFactory2(processorFactory TProcessorFactory, serverTransport TServerTransport) *TSimpleServer { + return NewTSimpleServerFactory6(processorFactory, + serverTransport, + NewTTransportFactory(), + NewTTransportFactory(), + NewTBinaryProtocolFactoryDefault(), + NewTBinaryProtocolFactoryDefault(), + ) +} + +func NewTSimpleServerFactory4(processorFactory TProcessorFactory, serverTransport TServerTransport, transportFactory TTransportFactory, protocolFactory TProtocolFactory) *TSimpleServer { + return NewTSimpleServerFactory6(processorFactory, + serverTransport, + transportFactory, + transportFactory, + protocolFactory, + protocolFactory, + ) +} + +func NewTSimpleServerFactory6(processorFactory TProcessorFactory, serverTransport TServerTransport, inputTransportFactory TTransportFactory, outputTransportFactory TTransportFactory, inputProtocolFactory TProtocolFactory, outputProtocolFactory TProtocolFactory) *TSimpleServer { + return &TSimpleServer{ + processorFactory: processorFactory, + serverTransport: serverTransport, + inputTransportFactory: inputTransportFactory, + outputTransportFactory: outputTransportFactory, + inputProtocolFactory: inputProtocolFactory, + outputProtocolFactory: outputProtocolFactory, + quit: make(chan struct{}, 1), + } +} + +func (p *TSimpleServer) ProcessorFactory() TProcessorFactory { + return p.processorFactory +} + +func (p *TSimpleServer) ServerTransport() TServerTransport { + return p.serverTransport +} + +func (p *TSimpleServer) InputTransportFactory() TTransportFactory { + return p.inputTransportFactory +} + +func (p *TSimpleServer) OutputTransportFactory() TTransportFactory { + return p.outputTransportFactory +} + +func (p *TSimpleServer) InputProtocolFactory() TProtocolFactory { + return p.inputProtocolFactory +} + +func (p *TSimpleServer) OutputProtocolFactory() TProtocolFactory { + return p.outputProtocolFactory +} + +func (p *TSimpleServer) Listen() error { + return p.serverTransport.Listen() +} + +func (p *TSimpleServer) AcceptLoop() error { + for { + client, err := p.serverTransport.Accept() + if err != nil { + select { + case <-p.quit: + return nil + default: + } + return err + } + if client != nil { + go func() { + if err := p.processRequests(client); err != nil { + log.Println("error processing request:", err) + } + }() + } + } +} + +func (p *TSimpleServer) Serve() error { + err := p.Listen() + if err != nil { + return err + } + p.AcceptLoop() + return nil +} + +func (p *TSimpleServer) Stop() error { + p.quit <- struct{}{} + p.serverTransport.Interrupt() + return nil +} + +func (p *TSimpleServer) processRequests(client TTransport) error { + processor := p.processorFactory.GetProcessor(client) + inputTransport := p.inputTransportFactory.GetTransport(client) + outputTransport := p.outputTransportFactory.GetTransport(client) + inputProtocol := p.inputProtocolFactory.GetProtocol(inputTransport) + outputProtocol := p.outputProtocolFactory.GetProtocol(outputTransport) + defer func() { + if e := recover(); e != nil { + log.Printf("panic in processor: %s: %s", e, debug.Stack()) + } + }() + if inputTransport != nil { + defer inputTransport.Close() + } + if outputTransport != nil { + defer outputTransport.Close() + } + for { + ok, err := processor.Process(inputProtocol, outputProtocol) + if err, ok := err.(TTransportException); ok && err.TypeId() == END_OF_FILE { + return nil + } else if err != nil { + log.Printf("error processing request: %s", err) + return err + } + if !ok { + break + } + } + return nil +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/socket.go b/vendor/github.com/apache/thrift/lib/go/thrift/socket.go new file mode 100644 index 00000000..82e28b4b --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/socket.go @@ -0,0 +1,166 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "net" + "time" +) + +type TSocket struct { + conn net.Conn + addr net.Addr + timeout time.Duration +} + +// NewTSocket creates a net.Conn-backed TTransport, given a host and port +// +// Example: +// trans, err := thrift.NewTSocket("localhost:9090") +func NewTSocket(hostPort string) (*TSocket, error) { + return NewTSocketTimeout(hostPort, 0) +} + +// NewTSocketTimeout creates a net.Conn-backed TTransport, given a host and port +// it also accepts a timeout as a time.Duration +func NewTSocketTimeout(hostPort string, timeout time.Duration) (*TSocket, error) { + //conn, err := net.DialTimeout(network, address, timeout) + addr, err := net.ResolveTCPAddr("tcp", hostPort) + if err != nil { + return nil, err + } + return NewTSocketFromAddrTimeout(addr, timeout), nil +} + +// Creates a TSocket from a net.Addr +func NewTSocketFromAddrTimeout(addr net.Addr, timeout time.Duration) *TSocket { + return &TSocket{addr: addr, timeout: timeout} +} + +// Creates a TSocket from an existing net.Conn +func NewTSocketFromConnTimeout(conn net.Conn, timeout time.Duration) *TSocket { + return &TSocket{conn: conn, addr: conn.RemoteAddr(), timeout: timeout} +} + +// Sets the socket timeout +func (p *TSocket) SetTimeout(timeout time.Duration) error { + p.timeout = timeout + return nil +} + +func (p *TSocket) pushDeadline(read, write bool) { + var t time.Time + if p.timeout > 0 { + t = time.Now().Add(time.Duration(p.timeout)) + } + if read && write { + p.conn.SetDeadline(t) + } else if read { + p.conn.SetReadDeadline(t) + } else if write { + p.conn.SetWriteDeadline(t) + } +} + +// Connects the socket, creating a new socket object if necessary. +func (p *TSocket) Open() error { + if p.IsOpen() { + return NewTTransportException(ALREADY_OPEN, "Socket already connected.") + } + if p.addr == nil { + return NewTTransportException(NOT_OPEN, "Cannot open nil address.") + } + if len(p.addr.Network()) == 0 { + return NewTTransportException(NOT_OPEN, "Cannot open bad network name.") + } + if len(p.addr.String()) == 0 { + return NewTTransportException(NOT_OPEN, "Cannot open bad address.") + } + var err error + if p.conn, err = net.DialTimeout(p.addr.Network(), p.addr.String(), p.timeout); err != nil { + return NewTTransportException(NOT_OPEN, err.Error()) + } + return nil +} + +// Retrieve the underlying net.Conn +func (p *TSocket) Conn() net.Conn { + return p.conn +} + +// Returns true if the connection is open +func (p *TSocket) IsOpen() bool { + if p.conn == nil { + return false + } + return true +} + +// Closes the socket. +func (p *TSocket) Close() error { + // Close the socket + if p.conn != nil { + err := p.conn.Close() + if err != nil { + return err + } + p.conn = nil + } + return nil +} + +//Returns the remote address of the socket. +func (p *TSocket) Addr() net.Addr { + return p.addr +} + +func (p *TSocket) Read(buf []byte) (int, error) { + if !p.IsOpen() { + return 0, NewTTransportException(NOT_OPEN, "Connection not open") + } + p.pushDeadline(true, false) + n, err := p.conn.Read(buf) + return n, NewTTransportExceptionFromError(err) +} + +func (p *TSocket) Write(buf []byte) (int, error) { + if !p.IsOpen() { + return 0, NewTTransportException(NOT_OPEN, "Connection not open") + } + p.pushDeadline(false, true) + return p.conn.Write(buf) +} + +func (p *TSocket) Flush() error { + return nil +} + +func (p *TSocket) Interrupt() error { + if !p.IsOpen() { + return nil + } + return p.conn.Close() +} + +func (p *TSocket) RemainingBytes() (num_bytes uint64) { + const maxSize = ^uint64(0) + return maxSize // the thruth is, we just don't know unless framed is used +} + diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/ssl_server_socket.go b/vendor/github.com/apache/thrift/lib/go/thrift/ssl_server_socket.go new file mode 100644 index 00000000..58f859b0 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/ssl_server_socket.go @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "net" + "time" + "crypto/tls" +) + +type TSSLServerSocket struct { + listener net.Listener + addr net.Addr + clientTimeout time.Duration + interrupted bool + cfg *tls.Config +} + +func NewTSSLServerSocket(listenAddr string, cfg *tls.Config) (*TSSLServerSocket, error) { + return NewTSSLServerSocketTimeout(listenAddr, cfg, 0) +} + +func NewTSSLServerSocketTimeout(listenAddr string, cfg *tls.Config, clientTimeout time.Duration) (*TSSLServerSocket, error) { + addr, err := net.ResolveTCPAddr("tcp", listenAddr) + if err != nil { + return nil, err + } + return &TSSLServerSocket{addr: addr, clientTimeout: clientTimeout, cfg: cfg}, nil +} + +func (p *TSSLServerSocket) Listen() error { + if p.IsListening() { + return nil + } + l, err := tls.Listen(p.addr.Network(), p.addr.String(), p.cfg) + if err != nil { + return err + } + p.listener = l + return nil +} + +func (p *TSSLServerSocket) Accept() (TTransport, error) { + if p.interrupted { + return nil, errTransportInterrupted + } + if p.listener == nil { + return nil, NewTTransportException(NOT_OPEN, "No underlying server socket") + } + conn, err := p.listener.Accept() + if err != nil { + return nil, NewTTransportExceptionFromError(err) + } + return NewTSSLSocketFromConnTimeout(conn, p.cfg, p.clientTimeout), nil +} + +// Checks whether the socket is listening. +func (p *TSSLServerSocket) IsListening() bool { + return p.listener != nil +} + +// Connects the socket, creating a new socket object if necessary. +func (p *TSSLServerSocket) Open() error { + if p.IsListening() { + return NewTTransportException(ALREADY_OPEN, "Server socket already open") + } + if l, err := tls.Listen(p.addr.Network(), p.addr.String(), p.cfg); err != nil { + return err + } else { + p.listener = l + } + return nil +} + +func (p *TSSLServerSocket) Addr() net.Addr { + return p.addr +} + +func (p *TSSLServerSocket) Close() error { + defer func() { + p.listener = nil + }() + if p.IsListening() { + return p.listener.Close() + } + return nil +} + +func (p *TSSLServerSocket) Interrupt() error { + p.interrupted = true + return nil +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/ssl_socket.go b/vendor/github.com/apache/thrift/lib/go/thrift/ssl_socket.go new file mode 100644 index 00000000..04d38508 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/ssl_socket.go @@ -0,0 +1,171 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "crypto/tls" + "net" + "time" +) + +type TSSLSocket struct { + conn net.Conn + // hostPort contains host:port (e.g. "asdf.com:12345"). The field is + // only valid if addr is nil. + hostPort string + // addr is nil when hostPort is not "", and is only used when the + // TSSLSocket is constructed from a net.Addr. + addr net.Addr + timeout time.Duration + cfg *tls.Config +} + +// NewTSSLSocket creates a net.Conn-backed TTransport, given a host and port and tls Configuration +// +// Example: +// trans, err := thrift.NewTSSLSocket("localhost:9090", nil) +func NewTSSLSocket(hostPort string, cfg *tls.Config) (*TSSLSocket, error) { + return NewTSSLSocketTimeout(hostPort, cfg, 0) +} + +// NewTSSLSocketTimeout creates a net.Conn-backed TTransport, given a host and port +// it also accepts a tls Configuration and a timeout as a time.Duration +func NewTSSLSocketTimeout(hostPort string, cfg *tls.Config, timeout time.Duration) (*TSSLSocket, error) { + return &TSSLSocket{hostPort: hostPort, timeout: timeout, cfg: cfg}, nil +} + +// Creates a TSSLSocket from a net.Addr +func NewTSSLSocketFromAddrTimeout(addr net.Addr, cfg *tls.Config, timeout time.Duration) *TSSLSocket { + return &TSSLSocket{addr: addr, timeout: timeout, cfg: cfg} +} + +// Creates a TSSLSocket from an existing net.Conn +func NewTSSLSocketFromConnTimeout(conn net.Conn, cfg *tls.Config, timeout time.Duration) *TSSLSocket { + return &TSSLSocket{conn: conn, addr: conn.RemoteAddr(), timeout: timeout, cfg: cfg} +} + +// Sets the socket timeout +func (p *TSSLSocket) SetTimeout(timeout time.Duration) error { + p.timeout = timeout + return nil +} + +func (p *TSSLSocket) pushDeadline(read, write bool) { + var t time.Time + if p.timeout > 0 { + t = time.Now().Add(time.Duration(p.timeout)) + } + if read && write { + p.conn.SetDeadline(t) + } else if read { + p.conn.SetReadDeadline(t) + } else if write { + p.conn.SetWriteDeadline(t) + } +} + +// Connects the socket, creating a new socket object if necessary. +func (p *TSSLSocket) Open() error { + var err error + // If we have a hostname, we need to pass the hostname to tls.Dial for + // certificate hostname checks. + if p.hostPort != "" { + if p.conn, err = tls.Dial("tcp", p.hostPort, p.cfg); err != nil { + return NewTTransportException(NOT_OPEN, err.Error()) + } + } else { + if p.IsOpen() { + return NewTTransportException(ALREADY_OPEN, "Socket already connected.") + } + if p.addr == nil { + return NewTTransportException(NOT_OPEN, "Cannot open nil address.") + } + if len(p.addr.Network()) == 0 { + return NewTTransportException(NOT_OPEN, "Cannot open bad network name.") + } + if len(p.addr.String()) == 0 { + return NewTTransportException(NOT_OPEN, "Cannot open bad address.") + } + if p.conn, err = tls.Dial(p.addr.Network(), p.addr.String(), p.cfg); err != nil { + return NewTTransportException(NOT_OPEN, err.Error()) + } + } + return nil +} + +// Retrieve the underlying net.Conn +func (p *TSSLSocket) Conn() net.Conn { + return p.conn +} + +// Returns true if the connection is open +func (p *TSSLSocket) IsOpen() bool { + if p.conn == nil { + return false + } + return true +} + +// Closes the socket. +func (p *TSSLSocket) Close() error { + // Close the socket + if p.conn != nil { + err := p.conn.Close() + if err != nil { + return err + } + p.conn = nil + } + return nil +} + +func (p *TSSLSocket) Read(buf []byte) (int, error) { + if !p.IsOpen() { + return 0, NewTTransportException(NOT_OPEN, "Connection not open") + } + p.pushDeadline(true, false) + n, err := p.conn.Read(buf) + return n, NewTTransportExceptionFromError(err) +} + +func (p *TSSLSocket) Write(buf []byte) (int, error) { + if !p.IsOpen() { + return 0, NewTTransportException(NOT_OPEN, "Connection not open") + } + p.pushDeadline(false, true) + return p.conn.Write(buf) +} + +func (p *TSSLSocket) Flush() error { + return nil +} + +func (p *TSSLSocket) Interrupt() error { + if !p.IsOpen() { + return nil + } + return p.conn.Close() +} + +func (p *TSSLSocket) RemainingBytes() (num_bytes uint64) { + const maxSize = ^uint64(0) + return maxSize // the thruth is, we just don't know unless framed is used +} + diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/transport.go b/vendor/github.com/apache/thrift/lib/go/thrift/transport.go new file mode 100644 index 00000000..45389965 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/transport.go @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" + "io" +) + +var errTransportInterrupted = errors.New("Transport Interrupted") + +type Flusher interface { + Flush() (err error) +} + +type ReadSizeProvider interface { + RemainingBytes() (num_bytes uint64) +} + + +// Encapsulates the I/O layer +type TTransport interface { + io.ReadWriteCloser + Flusher + ReadSizeProvider + + // Opens the transport for communication + Open() error + + // Returns true if the transport is open + IsOpen() bool +} + +type stringWriter interface { + WriteString(s string) (n int, err error) +} + + +// This is "enchanced" transport with extra capabilities. You need to use one of these +// to construct protocol. +// Notably, TSocket does not implement this interface, and it is always a mistake to use +// TSocket directly in protocol. +type TRichTransport interface { + io.ReadWriter + io.ByteReader + io.ByteWriter + stringWriter + Flusher + ReadSizeProvider +} + diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/transport_exception.go b/vendor/github.com/apache/thrift/lib/go/thrift/transport_exception.go new file mode 100644 index 00000000..9505b446 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/transport_exception.go @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" + "io" +) + +type timeoutable interface { + Timeout() bool +} + +// Thrift Transport exception +type TTransportException interface { + TException + TypeId() int + Err() error +} + +const ( + UNKNOWN_TRANSPORT_EXCEPTION = 0 + NOT_OPEN = 1 + ALREADY_OPEN = 2 + TIMED_OUT = 3 + END_OF_FILE = 4 +) + +type tTransportException struct { + typeId int + err error +} + +func (p *tTransportException) TypeId() int { + return p.typeId +} + +func (p *tTransportException) Error() string { + return p.err.Error() +} + +func (p *tTransportException) Err() error { + return p.err +} + +func NewTTransportException(t int, e string) TTransportException { + return &tTransportException{typeId: t, err: errors.New(e)} +} + +func NewTTransportExceptionFromError(e error) TTransportException { + if e == nil { + return nil + } + + if t, ok := e.(TTransportException); ok { + return t + } + + switch v := e.(type) { + case TTransportException: + return v + case timeoutable: + if v.Timeout() { + return &tTransportException{typeId: TIMED_OUT, err: e} + } + } + + if e == io.EOF { + return &tTransportException{typeId: END_OF_FILE, err: e} + } + + return &tTransportException{typeId: UNKNOWN_TRANSPORT_EXCEPTION, err: e} +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/transport_factory.go b/vendor/github.com/apache/thrift/lib/go/thrift/transport_factory.go new file mode 100644 index 00000000..533d1b43 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/transport_factory.go @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Factory class used to create wrapped instance of Transports. +// This is used primarily in servers, which get Transports from +// a ServerTransport and then may want to mutate them (i.e. create +// a BufferedTransport from the underlying base transport) +type TTransportFactory interface { + GetTransport(trans TTransport) TTransport +} + +type tTransportFactory struct{} + +// Return a wrapped instance of the base Transport. +func (p *tTransportFactory) GetTransport(trans TTransport) TTransport { + return trans +} + +func NewTTransportFactory() TTransportFactory { + return &tTransportFactory{} +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/type.go b/vendor/github.com/apache/thrift/lib/go/thrift/type.go new file mode 100644 index 00000000..7c68c2b9 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/type.go @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Type constants in the Thrift protocol +type TType byte + +const ( + STOP = 0 + VOID = 1 + BOOL = 2 + BYTE = 3 + I08 = 3 + DOUBLE = 4 + I16 = 6 + I32 = 8 + I64 = 10 + STRING = 11 + UTF7 = 11 + STRUCT = 12 + MAP = 13 + SET = 14 + LIST = 15 + UTF8 = 16 + UTF16 = 17 + BINARY = 18 +) + +var typeNames = map[int]string{ + STOP: "STOP", + VOID: "VOID", + BOOL: "BOOL", + BYTE: "BYTE", + I16: "I16", + I32: "I32", + I64: "I64", + STRING: "STRING", + STRUCT: "STRUCT", + MAP: "MAP", + SET: "SET", + LIST: "LIST", + UTF8: "UTF8", + UTF16: "UTF16", +} + +func (p TType) String() string { + if s, ok := typeNames[int(p)]; ok { + return s + } + return "Unknown" +} diff --git a/vendor/github.com/apache/thrift/lib/go/thrift/zlib_transport.go b/vendor/github.com/apache/thrift/lib/go/thrift/zlib_transport.go new file mode 100644 index 00000000..e47455fe --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/go/thrift/zlib_transport.go @@ -0,0 +1,117 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. + */ + +package thrift + +import ( + "compress/zlib" + "io" + "log" +) + +// TZlibTransportFactory is a factory for TZlibTransport instances +type TZlibTransportFactory struct { + level int +} + +// TZlibTransport is a TTransport implementation that makes use of zlib compression. +type TZlibTransport struct { + reader io.ReadCloser + transport TTransport + writer *zlib.Writer +} + +// GetTransport constructs a new instance of NewTZlibTransport +func (p *TZlibTransportFactory) GetTransport(trans TTransport) TTransport { + t, _ := NewTZlibTransport(trans, p.level) + return t +} + +// NewTZlibTransportFactory constructs a new instance of NewTZlibTransportFactory +func NewTZlibTransportFactory(level int) *TZlibTransportFactory { + return &TZlibTransportFactory{level: level} +} + +// NewTZlibTransport constructs a new instance of TZlibTransport +func NewTZlibTransport(trans TTransport, level int) (*TZlibTransport, error) { + w, err := zlib.NewWriterLevel(trans, level) + if err != nil { + log.Println(err) + return nil, err + } + + return &TZlibTransport{ + writer: w, + transport: trans, + }, nil +} + +// Close closes the reader and writer (flushing any unwritten data) and closes +// the underlying transport. +func (z *TZlibTransport) Close() error { + if z.reader != nil { + if err := z.reader.Close(); err != nil { + return err + } + } + if err := z.writer.Close(); err != nil { + return err + } + return z.transport.Close() +} + +// Flush flushes the writer and its underlying transport. +func (z *TZlibTransport) Flush() error { + if err := z.writer.Flush(); err != nil { + return err + } + return z.transport.Flush() +} + +// IsOpen returns true if the transport is open +func (z *TZlibTransport) IsOpen() bool { + return z.transport.IsOpen() +} + +// Open opens the transport for communication +func (z *TZlibTransport) Open() error { + return z.transport.Open() +} + +func (z *TZlibTransport) Read(p []byte) (int, error) { + if z.reader == nil { + r, err := zlib.NewReader(z.transport) + if err != nil { + return 0, NewTTransportExceptionFromError(err) + } + z.reader = r + } + + return z.reader.Read(p) +} + +// RemainingBytes returns the size in bytes of the data that is still to be +// read. +func (z *TZlibTransport) RemainingBytes() uint64 { + return z.transport.RemainingBytes() +} + +func (z *TZlibTransport) Write(p []byte) (int, error) { + return z.writer.Write(p) +} diff --git a/vendor/github.com/beorn7/perks/LICENSE b/vendor/github.com/beorn7/perks/LICENSE new file mode 100644 index 00000000..339177be --- /dev/null +++ b/vendor/github.com/beorn7/perks/LICENSE @@ -0,0 +1,20 @@ +Copyright (C) 2013 Blake Mizerany + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/beorn7/perks/quantile/exampledata.txt b/vendor/github.com/beorn7/perks/quantile/exampledata.txt new file mode 100644 index 00000000..1602287d --- /dev/null +++ b/vendor/github.com/beorn7/perks/quantile/exampledata.txt @@ -0,0 +1,2388 @@ +8 +5 +26 +12 +5 +235 +13 +6 +28 +30 +3 +3 +3 +3 +5 +2 +33 +7 +2 +4 +7 +12 +14 +5 +8 +3 +10 +4 +5 +3 +6 +6 +209 +20 +3 +10 +14 +3 +4 +6 +8 +5 +11 +7 +3 +2 +3 +3 +212 +5 +222 +4 +10 +10 +5 +6 +3 +8 +3 +10 +254 +220 +2 +3 +5 +24 +5 +4 +222 +7 +3 +3 +223 +8 +15 +12 +14 +14 +3 +2 +2 +3 +13 +3 +11 +4 +4 +6 +5 +7 +13 +5 +3 +5 +2 +5 +3 +5 +2 +7 +15 +17 +14 +3 +6 +6 +3 +17 +5 +4 +7 +6 +4 +4 +8 +6 +8 +3 +9 +3 +6 +3 +4 +5 +3 +3 +660 +4 +6 +10 +3 +6 +3 +2 +5 +13 +2 +4 +4 +10 +4 +8 +4 +3 +7 +9 +9 +3 +10 +37 +3 +13 +4 +12 +3 +6 +10 +8 +5 +21 +2 +3 +8 +3 +2 +3 +3 +4 +12 +2 +4 +8 +8 +4 +3 +2 +20 +1 +6 +32 +2 +11 +6 +18 +3 +8 +11 +3 +212 +3 +4 +2 +6 +7 +12 +11 +3 +2 +16 +10 +6 +4 +6 +3 +2 +7 +3 +2 +2 +2 +2 +5 +6 +4 +3 +10 +3 +4 +6 +5 +3 +4 +4 +5 +6 +4 +3 +4 +4 +5 +7 +5 +5 +3 +2 +7 +2 +4 +12 +4 +5 +6 +2 +4 +4 +8 +4 +15 +13 +7 +16 +5 +3 +23 +5 +5 +7 +3 +2 +9 +8 +7 +5 +8 +11 +4 +10 +76 +4 +47 +4 +3 +2 +7 +4 +2 +3 +37 +10 +4 +2 +20 +5 +4 +4 +10 +10 +4 +3 +7 +23 +240 +7 +13 +5 +5 +3 +3 +2 +5 +4 +2 +8 +7 +19 +2 +23 +8 +7 +2 +5 +3 +8 +3 +8 +13 +5 +5 +5 +2 +3 +23 +4 +9 +8 +4 +3 +3 +5 +220 +2 +3 +4 +6 +14 +3 +53 +6 +2 +5 +18 +6 +3 +219 +6 +5 +2 +5 +3 +6 +5 +15 +4 +3 +17 +3 +2 +4 +7 +2 +3 +3 +4 +4 +3 +2 +664 +6 +3 +23 +5 +5 +16 +5 +8 +2 +4 +2 +24 +12 +3 +2 +3 +5 +8 +3 +5 +4 +3 +14 +3 +5 +8 +2 +3 +7 +9 +4 +2 +3 +6 +8 +4 +3 +4 +6 +5 +3 +3 +6 +3 +19 +4 +4 +6 +3 +6 +3 +5 +22 +5 +4 +4 +3 +8 +11 +4 +9 +7 +6 +13 +4 +4 +4 +6 +17 +9 +3 +3 +3 +4 +3 +221 +5 +11 +3 +4 +2 +12 +6 +3 +5 +7 +5 +7 +4 +9 +7 +14 +37 +19 +217 +16 +3 +5 +2 +2 +7 +19 +7 +6 +7 +4 +24 +5 +11 +4 +7 +7 +9 +13 +3 +4 +3 +6 +28 +4 +4 +5 +5 +2 +5 +6 +4 +4 +6 +10 +5 +4 +3 +2 +3 +3 +6 +5 +5 +4 +3 +2 +3 +7 +4 +6 +18 +16 +8 +16 +4 +5 +8 +6 +9 +13 +1545 +6 +215 +6 +5 +6 +3 +45 +31 +5 +2 +2 +4 +3 +3 +2 +5 +4 +3 +5 +7 +7 +4 +5 +8 +5 +4 +749 +2 +31 +9 +11 +2 +11 +5 +4 +4 +7 +9 +11 +4 +5 +4 +7 +3 +4 +6 +2 +15 +3 +4 +3 +4 +3 +5 +2 +13 +5 +5 +3 +3 +23 +4 +4 +5 +7 +4 +13 +2 +4 +3 +4 +2 +6 +2 +7 +3 +5 +5 +3 +29 +5 +4 +4 +3 +10 +2 +3 +79 +16 +6 +6 +7 +7 +3 +5 +5 +7 +4 +3 +7 +9 +5 +6 +5 +9 +6 +3 +6 +4 +17 +2 +10 +9 +3 +6 +2 +3 +21 +22 +5 +11 +4 +2 +17 +2 +224 +2 +14 +3 +4 +4 +2 +4 +4 +4 +4 +5 +3 +4 +4 +10 +2 +6 +3 +3 +5 +7 +2 +7 +5 +6 +3 +218 +2 +2 +5 +2 +6 +3 +5 +222 +14 +6 +33 +3 +2 +5 +3 +3 +3 +9 +5 +3 +3 +2 +7 +4 +3 +4 +3 +5 +6 +5 +26 +4 +13 +9 +7 +3 +221 +3 +3 +4 +4 +4 +4 +2 +18 +5 +3 +7 +9 +6 +8 +3 +10 +3 +11 +9 +5 +4 +17 +5 +5 +6 +6 +3 +2 +4 +12 +17 +6 +7 +218 +4 +2 +4 +10 +3 +5 +15 +3 +9 +4 +3 +3 +6 +29 +3 +3 +4 +5 +5 +3 +8 +5 +6 +6 +7 +5 +3 +5 +3 +29 +2 +31 +5 +15 +24 +16 +5 +207 +4 +3 +3 +2 +15 +4 +4 +13 +5 +5 +4 +6 +10 +2 +7 +8 +4 +6 +20 +5 +3 +4 +3 +12 +12 +5 +17 +7 +3 +3 +3 +6 +10 +3 +5 +25 +80 +4 +9 +3 +2 +11 +3 +3 +2 +3 +8 +7 +5 +5 +19 +5 +3 +3 +12 +11 +2 +6 +5 +5 +5 +3 +3 +3 +4 +209 +14 +3 +2 +5 +19 +4 +4 +3 +4 +14 +5 +6 +4 +13 +9 +7 +4 +7 +10 +2 +9 +5 +7 +2 +8 +4 +6 +5 +5 +222 +8 +7 +12 +5 +216 +3 +4 +4 +6 +3 +14 +8 +7 +13 +4 +3 +3 +3 +3 +17 +5 +4 +3 +33 +6 +6 +33 +7 +5 +3 +8 +7 +5 +2 +9 +4 +2 +233 +24 +7 +4 +8 +10 +3 +4 +15 +2 +16 +3 +3 +13 +12 +7 +5 +4 +207 +4 +2 +4 +27 +15 +2 +5 +2 +25 +6 +5 +5 +6 +13 +6 +18 +6 +4 +12 +225 +10 +7 +5 +2 +2 +11 +4 +14 +21 +8 +10 +3 +5 +4 +232 +2 +5 +5 +3 +7 +17 +11 +6 +6 +23 +4 +6 +3 +5 +4 +2 +17 +3 +6 +5 +8 +3 +2 +2 +14 +9 +4 +4 +2 +5 +5 +3 +7 +6 +12 +6 +10 +3 +6 +2 +2 +19 +5 +4 +4 +9 +2 +4 +13 +3 +5 +6 +3 +6 +5 +4 +9 +6 +3 +5 +7 +3 +6 +6 +4 +3 +10 +6 +3 +221 +3 +5 +3 +6 +4 +8 +5 +3 +6 +4 +4 +2 +54 +5 +6 +11 +3 +3 +4 +4 +4 +3 +7 +3 +11 +11 +7 +10 +6 +13 +223 +213 +15 +231 +7 +3 +7 +228 +2 +3 +4 +4 +5 +6 +7 +4 +13 +3 +4 +5 +3 +6 +4 +6 +7 +2 +4 +3 +4 +3 +3 +6 +3 +7 +3 +5 +18 +5 +6 +8 +10 +3 +3 +3 +2 +4 +2 +4 +4 +5 +6 +6 +4 +10 +13 +3 +12 +5 +12 +16 +8 +4 +19 +11 +2 +4 +5 +6 +8 +5 +6 +4 +18 +10 +4 +2 +216 +6 +6 +6 +2 +4 +12 +8 +3 +11 +5 +6 +14 +5 +3 +13 +4 +5 +4 +5 +3 +28 +6 +3 +7 +219 +3 +9 +7 +3 +10 +6 +3 +4 +19 +5 +7 +11 +6 +15 +19 +4 +13 +11 +3 +7 +5 +10 +2 +8 +11 +2 +6 +4 +6 +24 +6 +3 +3 +3 +3 +6 +18 +4 +11 +4 +2 +5 +10 +8 +3 +9 +5 +3 +4 +5 +6 +2 +5 +7 +4 +4 +14 +6 +4 +4 +5 +5 +7 +2 +4 +3 +7 +3 +3 +6 +4 +5 +4 +4 +4 +3 +3 +3 +3 +8 +14 +2 +3 +5 +3 +2 +4 +5 +3 +7 +3 +3 +18 +3 +4 +4 +5 +7 +3 +3 +3 +13 +5 +4 +8 +211 +5 +5 +3 +5 +2 +5 +4 +2 +655 +6 +3 +5 +11 +2 +5 +3 +12 +9 +15 +11 +5 +12 +217 +2 +6 +17 +3 +3 +207 +5 +5 +4 +5 +9 +3 +2 +8 +5 +4 +3 +2 +5 +12 +4 +14 +5 +4 +2 +13 +5 +8 +4 +225 +4 +3 +4 +5 +4 +3 +3 +6 +23 +9 +2 +6 +7 +233 +4 +4 +6 +18 +3 +4 +6 +3 +4 +4 +2 +3 +7 +4 +13 +227 +4 +3 +5 +4 +2 +12 +9 +17 +3 +7 +14 +6 +4 +5 +21 +4 +8 +9 +2 +9 +25 +16 +3 +6 +4 +7 +8 +5 +2 +3 +5 +4 +3 +3 +5 +3 +3 +3 +2 +3 +19 +2 +4 +3 +4 +2 +3 +4 +4 +2 +4 +3 +3 +3 +2 +6 +3 +17 +5 +6 +4 +3 +13 +5 +3 +3 +3 +4 +9 +4 +2 +14 +12 +4 +5 +24 +4 +3 +37 +12 +11 +21 +3 +4 +3 +13 +4 +2 +3 +15 +4 +11 +4 +4 +3 +8 +3 +4 +4 +12 +8 +5 +3 +3 +4 +2 +220 +3 +5 +223 +3 +3 +3 +10 +3 +15 +4 +241 +9 +7 +3 +6 +6 +23 +4 +13 +7 +3 +4 +7 +4 +9 +3 +3 +4 +10 +5 +5 +1 +5 +24 +2 +4 +5 +5 +6 +14 +3 +8 +2 +3 +5 +13 +13 +3 +5 +2 +3 +15 +3 +4 +2 +10 +4 +4 +4 +5 +5 +3 +5 +3 +4 +7 +4 +27 +3 +6 +4 +15 +3 +5 +6 +6 +5 +4 +8 +3 +9 +2 +6 +3 +4 +3 +7 +4 +18 +3 +11 +3 +3 +8 +9 +7 +24 +3 +219 +7 +10 +4 +5 +9 +12 +2 +5 +4 +4 +4 +3 +3 +19 +5 +8 +16 +8 +6 +22 +3 +23 +3 +242 +9 +4 +3 +3 +5 +7 +3 +3 +5 +8 +3 +7 +5 +14 +8 +10 +3 +4 +3 +7 +4 +6 +7 +4 +10 +4 +3 +11 +3 +7 +10 +3 +13 +6 +8 +12 +10 +5 +7 +9 +3 +4 +7 +7 +10 +8 +30 +9 +19 +4 +3 +19 +15 +4 +13 +3 +215 +223 +4 +7 +4 +8 +17 +16 +3 +7 +6 +5 +5 +4 +12 +3 +7 +4 +4 +13 +4 +5 +2 +5 +6 +5 +6 +6 +7 +10 +18 +23 +9 +3 +3 +6 +5 +2 +4 +2 +7 +3 +3 +2 +5 +5 +14 +10 +224 +6 +3 +4 +3 +7 +5 +9 +3 +6 +4 +2 +5 +11 +4 +3 +3 +2 +8 +4 +7 +4 +10 +7 +3 +3 +18 +18 +17 +3 +3 +3 +4 +5 +3 +3 +4 +12 +7 +3 +11 +13 +5 +4 +7 +13 +5 +4 +11 +3 +12 +3 +6 +4 +4 +21 +4 +6 +9 +5 +3 +10 +8 +4 +6 +4 +4 +6 +5 +4 +8 +6 +4 +6 +4 +4 +5 +9 +6 +3 +4 +2 +9 +3 +18 +2 +4 +3 +13 +3 +6 +6 +8 +7 +9 +3 +2 +16 +3 +4 +6 +3 +2 +33 +22 +14 +4 +9 +12 +4 +5 +6 +3 +23 +9 +4 +3 +5 +5 +3 +4 +5 +3 +5 +3 +10 +4 +5 +5 +8 +4 +4 +6 +8 +5 +4 +3 +4 +6 +3 +3 +3 +5 +9 +12 +6 +5 +9 +3 +5 +3 +2 +2 +2 +18 +3 +2 +21 +2 +5 +4 +6 +4 +5 +10 +3 +9 +3 +2 +10 +7 +3 +6 +6 +4 +4 +8 +12 +7 +3 +7 +3 +3 +9 +3 +4 +5 +4 +4 +5 +5 +10 +15 +4 +4 +14 +6 +227 +3 +14 +5 +216 +22 +5 +4 +2 +2 +6 +3 +4 +2 +9 +9 +4 +3 +28 +13 +11 +4 +5 +3 +3 +2 +3 +3 +5 +3 +4 +3 +5 +23 +26 +3 +4 +5 +6 +4 +6 +3 +5 +5 +3 +4 +3 +2 +2 +2 +7 +14 +3 +6 +7 +17 +2 +2 +15 +14 +16 +4 +6 +7 +13 +6 +4 +5 +6 +16 +3 +3 +28 +3 +6 +15 +3 +9 +2 +4 +6 +3 +3 +22 +4 +12 +6 +7 +2 +5 +4 +10 +3 +16 +6 +9 +2 +5 +12 +7 +5 +5 +5 +5 +2 +11 +9 +17 +4 +3 +11 +7 +3 +5 +15 +4 +3 +4 +211 +8 +7 +5 +4 +7 +6 +7 +6 +3 +6 +5 +6 +5 +3 +4 +4 +26 +4 +6 +10 +4 +4 +3 +2 +3 +3 +4 +5 +9 +3 +9 +4 +4 +5 +5 +8 +2 +4 +2 +3 +8 +4 +11 +19 +5 +8 +6 +3 +5 +6 +12 +3 +2 +4 +16 +12 +3 +4 +4 +8 +6 +5 +6 +6 +219 +8 +222 +6 +16 +3 +13 +19 +5 +4 +3 +11 +6 +10 +4 +7 +7 +12 +5 +3 +3 +5 +6 +10 +3 +8 +2 +5 +4 +7 +2 +4 +4 +2 +12 +9 +6 +4 +2 +40 +2 +4 +10 +4 +223 +4 +2 +20 +6 +7 +24 +5 +4 +5 +2 +20 +16 +6 +5 +13 +2 +3 +3 +19 +3 +2 +4 +5 +6 +7 +11 +12 +5 +6 +7 +7 +3 +5 +3 +5 +3 +14 +3 +4 +4 +2 +11 +1 +7 +3 +9 +6 +11 +12 +5 +8 +6 +221 +4 +2 +12 +4 +3 +15 +4 +5 +226 +7 +218 +7 +5 +4 +5 +18 +4 +5 +9 +4 +4 +2 +9 +18 +18 +9 +5 +6 +6 +3 +3 +7 +3 +5 +4 +4 +4 +12 +3 +6 +31 +5 +4 +7 +3 +6 +5 +6 +5 +11 +2 +2 +11 +11 +6 +7 +5 +8 +7 +10 +5 +23 +7 +4 +3 +5 +34 +2 +5 +23 +7 +3 +6 +8 +4 +4 +4 +2 +5 +3 +8 +5 +4 +8 +25 +2 +3 +17 +8 +3 +4 +8 +7 +3 +15 +6 +5 +7 +21 +9 +5 +6 +6 +5 +3 +2 +3 +10 +3 +6 +3 +14 +7 +4 +4 +8 +7 +8 +2 +6 +12 +4 +213 +6 +5 +21 +8 +2 +5 +23 +3 +11 +2 +3 +6 +25 +2 +3 +6 +7 +6 +6 +4 +4 +6 +3 +17 +9 +7 +6 +4 +3 +10 +7 +2 +3 +3 +3 +11 +8 +3 +7 +6 +4 +14 +36 +3 +4 +3 +3 +22 +13 +21 +4 +2 +7 +4 +4 +17 +15 +3 +7 +11 +2 +4 +7 +6 +209 +6 +3 +2 +2 +24 +4 +9 +4 +3 +3 +3 +29 +2 +2 +4 +3 +3 +5 +4 +6 +3 +3 +2 +4 diff --git a/vendor/github.com/beorn7/perks/quantile/stream.go b/vendor/github.com/beorn7/perks/quantile/stream.go new file mode 100644 index 00000000..d7d14f8e --- /dev/null +++ b/vendor/github.com/beorn7/perks/quantile/stream.go @@ -0,0 +1,316 @@ +// Package quantile computes approximate quantiles over an unbounded data +// stream within low memory and CPU bounds. +// +// A small amount of accuracy is traded to achieve the above properties. +// +// Multiple streams can be merged before calling Query to generate a single set +// of results. This is meaningful when the streams represent the same type of +// data. See Merge and Samples. +// +// For more detailed information about the algorithm used, see: +// +// Effective Computation of Biased Quantiles over Data Streams +// +// http://www.cs.rutgers.edu/~muthu/bquant.pdf +package quantile + +import ( + "math" + "sort" +) + +// Sample holds an observed value and meta information for compression. JSON +// tags have been added for convenience. +type Sample struct { + Value float64 `json:",string"` + Width float64 `json:",string"` + Delta float64 `json:",string"` +} + +// Samples represents a slice of samples. It implements sort.Interface. +type Samples []Sample + +func (a Samples) Len() int { return len(a) } +func (a Samples) Less(i, j int) bool { return a[i].Value < a[j].Value } +func (a Samples) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type invariant func(s *stream, r float64) float64 + +// NewLowBiased returns an initialized Stream for low-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the lower ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within (1±Epsilon)*Quantile. +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewLowBiased(epsilon float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + return 2 * epsilon * r + } + return newStream(ƒ) +} + +// NewHighBiased returns an initialized Stream for high-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the higher ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within 1-(1±Epsilon)*(1-Quantile). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewHighBiased(epsilon float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + return 2 * epsilon * (s.n - r) + } + return newStream(ƒ) +} + +// NewTargeted returns an initialized Stream concerned with a particular set of +// quantile values that are supplied a priori. Knowing these a priori reduces +// space and computation time. The targets map maps the desired quantiles to +// their absolute errors, i.e. the true quantile of a value returned by a query +// is guaranteed to be within (Quantile±Epsilon). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error properties. +func NewTargeted(targetMap map[float64]float64) *Stream { + // Convert map to slice to avoid slow iterations on a map. + // ƒ is called on the hot path, so converting the map to a slice + // beforehand results in significant CPU savings. + targets := targetMapToSlice(targetMap) + + ƒ := func(s *stream, r float64) float64 { + var m = math.MaxFloat64 + var f float64 + for _, t := range targets { + if t.quantile*s.n <= r { + f = (2 * t.epsilon * r) / t.quantile + } else { + f = (2 * t.epsilon * (s.n - r)) / (1 - t.quantile) + } + if f < m { + m = f + } + } + return m + } + return newStream(ƒ) +} + +type target struct { + quantile float64 + epsilon float64 +} + +func targetMapToSlice(targetMap map[float64]float64) []target { + targets := make([]target, 0, len(targetMap)) + + for quantile, epsilon := range targetMap { + t := target{ + quantile: quantile, + epsilon: epsilon, + } + targets = append(targets, t) + } + + return targets +} + +// Stream computes quantiles for a stream of float64s. It is not thread-safe by +// design. Take care when using across multiple goroutines. +type Stream struct { + *stream + b Samples + sorted bool +} + +func newStream(ƒ invariant) *Stream { + x := &stream{ƒ: ƒ} + return &Stream{x, make(Samples, 0, 500), true} +} + +// Insert inserts v into the stream. +func (s *Stream) Insert(v float64) { + s.insert(Sample{Value: v, Width: 1}) +} + +func (s *Stream) insert(sample Sample) { + s.b = append(s.b, sample) + s.sorted = false + if len(s.b) == cap(s.b) { + s.flush() + } +} + +// Query returns the computed qth percentiles value. If s was created with +// NewTargeted, and q is not in the set of quantiles provided a priori, Query +// will return an unspecified result. +func (s *Stream) Query(q float64) float64 { + if !s.flushed() { + // Fast path when there hasn't been enough data for a flush; + // this also yields better accuracy for small sets of data. + l := len(s.b) + if l == 0 { + return 0 + } + i := int(math.Ceil(float64(l) * q)) + if i > 0 { + i -= 1 + } + s.maybeSort() + return s.b[i].Value + } + s.flush() + return s.stream.query(q) +} + +// Merge merges samples into the underlying streams samples. This is handy when +// merging multiple streams from separate threads, database shards, etc. +// +// ATTENTION: This method is broken and does not yield correct results. The +// underlying algorithm is not capable of merging streams correctly. +func (s *Stream) Merge(samples Samples) { + sort.Sort(samples) + s.stream.merge(samples) +} + +// Reset reinitializes and clears the list reusing the samples buffer memory. +func (s *Stream) Reset() { + s.stream.reset() + s.b = s.b[:0] +} + +// Samples returns stream samples held by s. +func (s *Stream) Samples() Samples { + if !s.flushed() { + return s.b + } + s.flush() + return s.stream.samples() +} + +// Count returns the total number of samples observed in the stream +// since initialization. +func (s *Stream) Count() int { + return len(s.b) + s.stream.count() +} + +func (s *Stream) flush() { + s.maybeSort() + s.stream.merge(s.b) + s.b = s.b[:0] +} + +func (s *Stream) maybeSort() { + if !s.sorted { + s.sorted = true + sort.Sort(s.b) + } +} + +func (s *Stream) flushed() bool { + return len(s.stream.l) > 0 +} + +type stream struct { + n float64 + l []Sample + ƒ invariant +} + +func (s *stream) reset() { + s.l = s.l[:0] + s.n = 0 +} + +func (s *stream) insert(v float64) { + s.merge(Samples{{v, 1, 0}}) +} + +func (s *stream) merge(samples Samples) { + // TODO(beorn7): This tries to merge not only individual samples, but + // whole summaries. The paper doesn't mention merging summaries at + // all. Unittests show that the merging is inaccurate. Find out how to + // do merges properly. + var r float64 + i := 0 + for _, sample := range samples { + for ; i < len(s.l); i++ { + c := s.l[i] + if c.Value > sample.Value { + // Insert at position i. + s.l = append(s.l, Sample{}) + copy(s.l[i+1:], s.l[i:]) + s.l[i] = Sample{ + sample.Value, + sample.Width, + math.Max(sample.Delta, math.Floor(s.ƒ(s, r))-1), + // TODO(beorn7): How to calculate delta correctly? + } + i++ + goto inserted + } + r += c.Width + } + s.l = append(s.l, Sample{sample.Value, sample.Width, 0}) + i++ + inserted: + s.n += sample.Width + r += sample.Width + } + s.compress() +} + +func (s *stream) count() int { + return int(s.n) +} + +func (s *stream) query(q float64) float64 { + t := math.Ceil(q * s.n) + t += math.Ceil(s.ƒ(s, t) / 2) + p := s.l[0] + var r float64 + for _, c := range s.l[1:] { + r += p.Width + if r+c.Width+c.Delta > t { + return p.Value + } + p = c + } + return p.Value +} + +func (s *stream) compress() { + if len(s.l) < 2 { + return + } + x := s.l[len(s.l)-1] + xi := len(s.l) - 1 + r := s.n - 1 - x.Width + + for i := len(s.l) - 2; i >= 0; i-- { + c := s.l[i] + if c.Width+x.Width+x.Delta <= s.ƒ(s, r) { + x.Width += c.Width + s.l[xi] = x + // Remove element at i. + copy(s.l[i:], s.l[i+1:]) + s.l = s.l[:len(s.l)-1] + xi -= 1 + } else { + x = c + xi = i + } + r -= c.Width + } +} + +func (s *stream) samples() Samples { + samples := make(Samples, len(s.l)) + copy(samples, s.l) + return samples +} diff --git a/vendor/github.com/cespare/xxhash/v2/.travis.yml b/vendor/github.com/cespare/xxhash/v2/.travis.yml new file mode 100644 index 00000000..c516ea88 --- /dev/null +++ b/vendor/github.com/cespare/xxhash/v2/.travis.yml @@ -0,0 +1,8 @@ +language: go +go: + - "1.x" + - master +env: + - TAGS="" + - TAGS="-tags purego" +script: go test $TAGS -v ./... diff --git a/vendor/github.com/cespare/xxhash/v2/LICENSE.txt b/vendor/github.com/cespare/xxhash/v2/LICENSE.txt new file mode 100644 index 00000000..24b53065 --- /dev/null +++ b/vendor/github.com/cespare/xxhash/v2/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2016 Caleb Spare + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/cespare/xxhash/v2/README.md b/vendor/github.com/cespare/xxhash/v2/README.md new file mode 100644 index 00000000..2fd8693c --- /dev/null +++ b/vendor/github.com/cespare/xxhash/v2/README.md @@ -0,0 +1,67 @@ +# xxhash + +[![GoDoc](https://godoc.org/github.com/cespare/xxhash?status.svg)](https://godoc.org/github.com/cespare/xxhash) +[![Build Status](https://travis-ci.org/cespare/xxhash.svg?branch=master)](https://travis-ci.org/cespare/xxhash) + +xxhash is a Go implementation of the 64-bit +[xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a +high-quality hashing algorithm that is much faster than anything in the Go +standard library. + +This package provides a straightforward API: + +``` +func Sum64(b []byte) uint64 +func Sum64String(s string) uint64 +type Digest struct{ ... } + func New() *Digest +``` + +The `Digest` type implements hash.Hash64. Its key methods are: + +``` +func (*Digest) Write([]byte) (int, error) +func (*Digest) WriteString(string) (int, error) +func (*Digest) Sum64() uint64 +``` + +This implementation provides a fast pure-Go implementation and an even faster +assembly implementation for amd64. + +## Compatibility + +This package is in a module and the latest code is in version 2 of the module. +You need a version of Go with at least "minimal module compatibility" to use +github.com/cespare/xxhash/v2: + +* 1.9.7+ for Go 1.9 +* 1.10.3+ for Go 1.10 +* Go 1.11 or later + +I recommend using the latest release of Go. + +## Benchmarks + +Here are some quick benchmarks comparing the pure-Go and assembly +implementations of Sum64. + +| input size | purego | asm | +| --- | --- | --- | +| 5 B | 979.66 MB/s | 1291.17 MB/s | +| 100 B | 7475.26 MB/s | 7973.40 MB/s | +| 4 KB | 17573.46 MB/s | 17602.65 MB/s | +| 10 MB | 17131.46 MB/s | 17142.16 MB/s | + +These numbers were generated on Ubuntu 18.04 with an Intel i7-8700K CPU using +the following commands under Go 1.11.2: + +``` +$ go test -tags purego -benchtime 10s -bench '/xxhash,direct,bytes' +$ go test -benchtime 10s -bench '/xxhash,direct,bytes' +``` + +## Projects using this package + +- [InfluxDB](https://github.com/influxdata/influxdb) +- [Prometheus](https://github.com/prometheus/prometheus) +- [FreeCache](https://github.com/coocood/freecache) diff --git a/vendor/github.com/cespare/xxhash/v2/go.mod b/vendor/github.com/cespare/xxhash/v2/go.mod new file mode 100644 index 00000000..49f67608 --- /dev/null +++ b/vendor/github.com/cespare/xxhash/v2/go.mod @@ -0,0 +1,3 @@ +module github.com/cespare/xxhash/v2 + +go 1.11 diff --git a/vendor/github.com/cespare/xxhash/v2/go.sum b/vendor/github.com/cespare/xxhash/v2/go.sum new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash.go b/vendor/github.com/cespare/xxhash/v2/xxhash.go new file mode 100644 index 00000000..db0b35fb --- /dev/null +++ b/vendor/github.com/cespare/xxhash/v2/xxhash.go @@ -0,0 +1,236 @@ +// Package xxhash implements the 64-bit variant of xxHash (XXH64) as described +// at http://cyan4973.github.io/xxHash/. +package xxhash + +import ( + "encoding/binary" + "errors" + "math/bits" +) + +const ( + prime1 uint64 = 11400714785074694791 + prime2 uint64 = 14029467366897019727 + prime3 uint64 = 1609587929392839161 + prime4 uint64 = 9650029242287828579 + prime5 uint64 = 2870177450012600261 +) + +// NOTE(caleb): I'm using both consts and vars of the primes. Using consts where +// possible in the Go code is worth a small (but measurable) performance boost +// by avoiding some MOVQs. Vars are needed for the asm and also are useful for +// convenience in the Go code in a few places where we need to intentionally +// avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the +// result overflows a uint64). +var ( + prime1v = prime1 + prime2v = prime2 + prime3v = prime3 + prime4v = prime4 + prime5v = prime5 +) + +// Digest implements hash.Hash64. +type Digest struct { + v1 uint64 + v2 uint64 + v3 uint64 + v4 uint64 + total uint64 + mem [32]byte + n int // how much of mem is used +} + +// New creates a new Digest that computes the 64-bit xxHash algorithm. +func New() *Digest { + var d Digest + d.Reset() + return &d +} + +// Reset clears the Digest's state so that it can be reused. +func (d *Digest) Reset() { + d.v1 = prime1v + prime2 + d.v2 = prime2 + d.v3 = 0 + d.v4 = -prime1v + d.total = 0 + d.n = 0 +} + +// Size always returns 8 bytes. +func (d *Digest) Size() int { return 8 } + +// BlockSize always returns 32 bytes. +func (d *Digest) BlockSize() int { return 32 } + +// Write adds more data to d. It always returns len(b), nil. +func (d *Digest) Write(b []byte) (n int, err error) { + n = len(b) + d.total += uint64(n) + + if d.n+n < 32 { + // This new data doesn't even fill the current block. + copy(d.mem[d.n:], b) + d.n += n + return + } + + if d.n > 0 { + // Finish off the partial block. + copy(d.mem[d.n:], b) + d.v1 = round(d.v1, u64(d.mem[0:8])) + d.v2 = round(d.v2, u64(d.mem[8:16])) + d.v3 = round(d.v3, u64(d.mem[16:24])) + d.v4 = round(d.v4, u64(d.mem[24:32])) + b = b[32-d.n:] + d.n = 0 + } + + if len(b) >= 32 { + // One or more full blocks left. + nw := writeBlocks(d, b) + b = b[nw:] + } + + // Store any remaining partial block. + copy(d.mem[:], b) + d.n = len(b) + + return +} + +// Sum appends the current hash to b and returns the resulting slice. +func (d *Digest) Sum(b []byte) []byte { + s := d.Sum64() + return append( + b, + byte(s>>56), + byte(s>>48), + byte(s>>40), + byte(s>>32), + byte(s>>24), + byte(s>>16), + byte(s>>8), + byte(s), + ) +} + +// Sum64 returns the current hash. +func (d *Digest) Sum64() uint64 { + var h uint64 + + if d.total >= 32 { + v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4 + h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4) + h = mergeRound(h, v1) + h = mergeRound(h, v2) + h = mergeRound(h, v3) + h = mergeRound(h, v4) + } else { + h = d.v3 + prime5 + } + + h += d.total + + i, end := 0, d.n + for ; i+8 <= end; i += 8 { + k1 := round(0, u64(d.mem[i:i+8])) + h ^= k1 + h = rol27(h)*prime1 + prime4 + } + if i+4 <= end { + h ^= uint64(u32(d.mem[i:i+4])) * prime1 + h = rol23(h)*prime2 + prime3 + i += 4 + } + for i < end { + h ^= uint64(d.mem[i]) * prime5 + h = rol11(h) * prime1 + i++ + } + + h ^= h >> 33 + h *= prime2 + h ^= h >> 29 + h *= prime3 + h ^= h >> 32 + + return h +} + +const ( + magic = "xxh\x06" + marshaledSize = len(magic) + 8*5 + 32 +) + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (d *Digest) MarshalBinary() ([]byte, error) { + b := make([]byte, 0, marshaledSize) + b = append(b, magic...) + b = appendUint64(b, d.v1) + b = appendUint64(b, d.v2) + b = appendUint64(b, d.v3) + b = appendUint64(b, d.v4) + b = appendUint64(b, d.total) + b = append(b, d.mem[:d.n]...) + b = b[:len(b)+len(d.mem)-d.n] + return b, nil +} + +// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. +func (d *Digest) UnmarshalBinary(b []byte) error { + if len(b) < len(magic) || string(b[:len(magic)]) != magic { + return errors.New("xxhash: invalid hash state identifier") + } + if len(b) != marshaledSize { + return errors.New("xxhash: invalid hash state size") + } + b = b[len(magic):] + b, d.v1 = consumeUint64(b) + b, d.v2 = consumeUint64(b) + b, d.v3 = consumeUint64(b) + b, d.v4 = consumeUint64(b) + b, d.total = consumeUint64(b) + copy(d.mem[:], b) + b = b[len(d.mem):] + d.n = int(d.total % uint64(len(d.mem))) + return nil +} + +func appendUint64(b []byte, x uint64) []byte { + var a [8]byte + binary.LittleEndian.PutUint64(a[:], x) + return append(b, a[:]...) +} + +func consumeUint64(b []byte) ([]byte, uint64) { + x := u64(b) + return b[8:], x +} + +func u64(b []byte) uint64 { return binary.LittleEndian.Uint64(b) } +func u32(b []byte) uint32 { return binary.LittleEndian.Uint32(b) } + +func round(acc, input uint64) uint64 { + acc += input * prime2 + acc = rol31(acc) + acc *= prime1 + return acc +} + +func mergeRound(acc, val uint64) uint64 { + val = round(0, val) + acc ^= val + acc = acc*prime1 + prime4 + return acc +} + +func rol1(x uint64) uint64 { return bits.RotateLeft64(x, 1) } +func rol7(x uint64) uint64 { return bits.RotateLeft64(x, 7) } +func rol11(x uint64) uint64 { return bits.RotateLeft64(x, 11) } +func rol12(x uint64) uint64 { return bits.RotateLeft64(x, 12) } +func rol18(x uint64) uint64 { return bits.RotateLeft64(x, 18) } +func rol23(x uint64) uint64 { return bits.RotateLeft64(x, 23) } +func rol27(x uint64) uint64 { return bits.RotateLeft64(x, 27) } +func rol31(x uint64) uint64 { return bits.RotateLeft64(x, 31) } diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go new file mode 100644 index 00000000..ad14b807 --- /dev/null +++ b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go @@ -0,0 +1,13 @@ +// +build !appengine +// +build gc +// +build !purego + +package xxhash + +// Sum64 computes the 64-bit xxHash digest of b. +// +//go:noescape +func Sum64(b []byte) uint64 + +//go:noescape +func writeBlocks(d *Digest, b []byte) int diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s new file mode 100644 index 00000000..d580e32a --- /dev/null +++ b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s @@ -0,0 +1,215 @@ +// +build !appengine +// +build gc +// +build !purego + +#include "textflag.h" + +// Register allocation: +// AX h +// CX pointer to advance through b +// DX n +// BX loop end +// R8 v1, k1 +// R9 v2 +// R10 v3 +// R11 v4 +// R12 tmp +// R13 prime1v +// R14 prime2v +// R15 prime4v + +// round reads from and advances the buffer pointer in CX. +// It assumes that R13 has prime1v and R14 has prime2v. +#define round(r) \ + MOVQ (CX), R12 \ + ADDQ $8, CX \ + IMULQ R14, R12 \ + ADDQ R12, r \ + ROLQ $31, r \ + IMULQ R13, r + +// mergeRound applies a merge round on the two registers acc and val. +// It assumes that R13 has prime1v, R14 has prime2v, and R15 has prime4v. +#define mergeRound(acc, val) \ + IMULQ R14, val \ + ROLQ $31, val \ + IMULQ R13, val \ + XORQ val, acc \ + IMULQ R13, acc \ + ADDQ R15, acc + +// func Sum64(b []byte) uint64 +TEXT ·Sum64(SB), NOSPLIT, $0-32 + // Load fixed primes. + MOVQ ·prime1v(SB), R13 + MOVQ ·prime2v(SB), R14 + MOVQ ·prime4v(SB), R15 + + // Load slice. + MOVQ b_base+0(FP), CX + MOVQ b_len+8(FP), DX + LEAQ (CX)(DX*1), BX + + // The first loop limit will be len(b)-32. + SUBQ $32, BX + + // Check whether we have at least one block. + CMPQ DX, $32 + JLT noBlocks + + // Set up initial state (v1, v2, v3, v4). + MOVQ R13, R8 + ADDQ R14, R8 + MOVQ R14, R9 + XORQ R10, R10 + XORQ R11, R11 + SUBQ R13, R11 + + // Loop until CX > BX. +blockLoop: + round(R8) + round(R9) + round(R10) + round(R11) + + CMPQ CX, BX + JLE blockLoop + + MOVQ R8, AX + ROLQ $1, AX + MOVQ R9, R12 + ROLQ $7, R12 + ADDQ R12, AX + MOVQ R10, R12 + ROLQ $12, R12 + ADDQ R12, AX + MOVQ R11, R12 + ROLQ $18, R12 + ADDQ R12, AX + + mergeRound(AX, R8) + mergeRound(AX, R9) + mergeRound(AX, R10) + mergeRound(AX, R11) + + JMP afterBlocks + +noBlocks: + MOVQ ·prime5v(SB), AX + +afterBlocks: + ADDQ DX, AX + + // Right now BX has len(b)-32, and we want to loop until CX > len(b)-8. + ADDQ $24, BX + + CMPQ CX, BX + JG fourByte + +wordLoop: + // Calculate k1. + MOVQ (CX), R8 + ADDQ $8, CX + IMULQ R14, R8 + ROLQ $31, R8 + IMULQ R13, R8 + + XORQ R8, AX + ROLQ $27, AX + IMULQ R13, AX + ADDQ R15, AX + + CMPQ CX, BX + JLE wordLoop + +fourByte: + ADDQ $4, BX + CMPQ CX, BX + JG singles + + MOVL (CX), R8 + ADDQ $4, CX + IMULQ R13, R8 + XORQ R8, AX + + ROLQ $23, AX + IMULQ R14, AX + ADDQ ·prime3v(SB), AX + +singles: + ADDQ $4, BX + CMPQ CX, BX + JGE finalize + +singlesLoop: + MOVBQZX (CX), R12 + ADDQ $1, CX + IMULQ ·prime5v(SB), R12 + XORQ R12, AX + + ROLQ $11, AX + IMULQ R13, AX + + CMPQ CX, BX + JL singlesLoop + +finalize: + MOVQ AX, R12 + SHRQ $33, R12 + XORQ R12, AX + IMULQ R14, AX + MOVQ AX, R12 + SHRQ $29, R12 + XORQ R12, AX + IMULQ ·prime3v(SB), AX + MOVQ AX, R12 + SHRQ $32, R12 + XORQ R12, AX + + MOVQ AX, ret+24(FP) + RET + +// writeBlocks uses the same registers as above except that it uses AX to store +// the d pointer. + +// func writeBlocks(d *Digest, b []byte) int +TEXT ·writeBlocks(SB), NOSPLIT, $0-40 + // Load fixed primes needed for round. + MOVQ ·prime1v(SB), R13 + MOVQ ·prime2v(SB), R14 + + // Load slice. + MOVQ b_base+8(FP), CX + MOVQ b_len+16(FP), DX + LEAQ (CX)(DX*1), BX + SUBQ $32, BX + + // Load vN from d. + MOVQ d+0(FP), AX + MOVQ 0(AX), R8 // v1 + MOVQ 8(AX), R9 // v2 + MOVQ 16(AX), R10 // v3 + MOVQ 24(AX), R11 // v4 + + // We don't need to check the loop condition here; this function is + // always called with at least one block of data to process. +blockLoop: + round(R8) + round(R9) + round(R10) + round(R11) + + CMPQ CX, BX + JLE blockLoop + + // Copy vN back to d. + MOVQ R8, 0(AX) + MOVQ R9, 8(AX) + MOVQ R10, 16(AX) + MOVQ R11, 24(AX) + + // The number of bytes written is CX minus the old base pointer. + SUBQ b_base+8(FP), CX + MOVQ CX, ret+32(FP) + + RET diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go new file mode 100644 index 00000000..4a5a8216 --- /dev/null +++ b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go @@ -0,0 +1,76 @@ +// +build !amd64 appengine !gc purego + +package xxhash + +// Sum64 computes the 64-bit xxHash digest of b. +func Sum64(b []byte) uint64 { + // A simpler version would be + // d := New() + // d.Write(b) + // return d.Sum64() + // but this is faster, particularly for small inputs. + + n := len(b) + var h uint64 + + if n >= 32 { + v1 := prime1v + prime2 + v2 := prime2 + v3 := uint64(0) + v4 := -prime1v + for len(b) >= 32 { + v1 = round(v1, u64(b[0:8:len(b)])) + v2 = round(v2, u64(b[8:16:len(b)])) + v3 = round(v3, u64(b[16:24:len(b)])) + v4 = round(v4, u64(b[24:32:len(b)])) + b = b[32:len(b):len(b)] + } + h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4) + h = mergeRound(h, v1) + h = mergeRound(h, v2) + h = mergeRound(h, v3) + h = mergeRound(h, v4) + } else { + h = prime5 + } + + h += uint64(n) + + i, end := 0, len(b) + for ; i+8 <= end; i += 8 { + k1 := round(0, u64(b[i:i+8:len(b)])) + h ^= k1 + h = rol27(h)*prime1 + prime4 + } + if i+4 <= end { + h ^= uint64(u32(b[i:i+4:len(b)])) * prime1 + h = rol23(h)*prime2 + prime3 + i += 4 + } + for ; i < end; i++ { + h ^= uint64(b[i]) * prime5 + h = rol11(h) * prime1 + } + + h ^= h >> 33 + h *= prime2 + h ^= h >> 29 + h *= prime3 + h ^= h >> 32 + + return h +} + +func writeBlocks(d *Digest, b []byte) int { + v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4 + n := len(b) + for len(b) >= 32 { + v1 = round(v1, u64(b[0:8:len(b)])) + v2 = round(v2, u64(b[8:16:len(b)])) + v3 = round(v3, u64(b[16:24:len(b)])) + v4 = round(v4, u64(b[24:32:len(b)])) + b = b[32:len(b):len(b)] + } + d.v1, d.v2, d.v3, d.v4 = v1, v2, v3, v4 + return n - len(b) +} diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go new file mode 100644 index 00000000..fc9bea7a --- /dev/null +++ b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go @@ -0,0 +1,15 @@ +// +build appengine + +// This file contains the safe implementations of otherwise unsafe-using code. + +package xxhash + +// Sum64String computes the 64-bit xxHash digest of s. +func Sum64String(s string) uint64 { + return Sum64([]byte(s)) +} + +// WriteString adds more data to d. It always returns len(s), nil. +func (d *Digest) WriteString(s string) (n int, err error) { + return d.Write([]byte(s)) +} diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go new file mode 100644 index 00000000..53bf76ef --- /dev/null +++ b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go @@ -0,0 +1,46 @@ +// +build !appengine + +// This file encapsulates usage of unsafe. +// xxhash_safe.go contains the safe implementations. + +package xxhash + +import ( + "reflect" + "unsafe" +) + +// Notes: +// +// See https://groups.google.com/d/msg/golang-nuts/dcjzJy-bSpw/tcZYBzQqAQAJ +// for some discussion about these unsafe conversions. +// +// In the future it's possible that compiler optimizations will make these +// unsafe operations unnecessary: https://golang.org/issue/2205. +// +// Both of these wrapper functions still incur function call overhead since they +// will not be inlined. We could write Go/asm copies of Sum64 and Digest.Write +// for strings to squeeze out a bit more speed. Mid-stack inlining should +// eventually fix this. + +// Sum64String computes the 64-bit xxHash digest of s. +// It may be faster than Sum64([]byte(s)) by avoiding a copy. +func Sum64String(s string) uint64 { + var b []byte + bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + bh.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data + bh.Len = len(s) + bh.Cap = len(s) + return Sum64(b) +} + +// WriteString adds more data to d. It always returns len(s), nil. +// It may be faster than Write([]byte(s)) by avoiding a copy. +func (d *Digest) WriteString(s string) (n int, err error) { + var b []byte + bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + bh.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data + bh.Len = len(s) + bh.Cap = len(s) + return d.Write(b) +} diff --git a/vendor/k8s.io/apimachinery/LICENSE b/vendor/github.com/coreos/go-semver/LICENSE similarity index 100% rename from vendor/k8s.io/apimachinery/LICENSE rename to vendor/github.com/coreos/go-semver/LICENSE diff --git a/vendor/github.com/coreos/go-semver/NOTICE b/vendor/github.com/coreos/go-semver/NOTICE new file mode 100644 index 00000000..23a0ada2 --- /dev/null +++ b/vendor/github.com/coreos/go-semver/NOTICE @@ -0,0 +1,5 @@ +CoreOS Project +Copyright 2018 CoreOS, Inc + +This product includes software developed at CoreOS, Inc. +(http://www.coreos.com/). diff --git a/vendor/github.com/coreos/go-semver/semver/semver.go b/vendor/github.com/coreos/go-semver/semver/semver.go new file mode 100644 index 00000000..76cf4852 --- /dev/null +++ b/vendor/github.com/coreos/go-semver/semver/semver.go @@ -0,0 +1,296 @@ +// Copyright 2013-2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Semantic Versions http://semver.org +package semver + +import ( + "bytes" + "errors" + "fmt" + "regexp" + "strconv" + "strings" +) + +type Version struct { + Major int64 + Minor int64 + Patch int64 + PreRelease PreRelease + Metadata string +} + +type PreRelease string + +func splitOff(input *string, delim string) (val string) { + parts := strings.SplitN(*input, delim, 2) + + if len(parts) == 2 { + *input = parts[0] + val = parts[1] + } + + return val +} + +func New(version string) *Version { + return Must(NewVersion(version)) +} + +func NewVersion(version string) (*Version, error) { + v := Version{} + + if err := v.Set(version); err != nil { + return nil, err + } + + return &v, nil +} + +// Must is a helper for wrapping NewVersion and will panic if err is not nil. +func Must(v *Version, err error) *Version { + if err != nil { + panic(err) + } + return v +} + +// Set parses and updates v from the given version string. Implements flag.Value +func (v *Version) Set(version string) error { + metadata := splitOff(&version, "+") + preRelease := PreRelease(splitOff(&version, "-")) + dotParts := strings.SplitN(version, ".", 3) + + if len(dotParts) != 3 { + return fmt.Errorf("%s is not in dotted-tri format", version) + } + + if err := validateIdentifier(string(preRelease)); err != nil { + return fmt.Errorf("failed to validate pre-release: %v", err) + } + + if err := validateIdentifier(metadata); err != nil { + return fmt.Errorf("failed to validate metadata: %v", err) + } + + parsed := make([]int64, 3, 3) + + for i, v := range dotParts[:3] { + val, err := strconv.ParseInt(v, 10, 64) + parsed[i] = val + if err != nil { + return err + } + } + + v.Metadata = metadata + v.PreRelease = preRelease + v.Major = parsed[0] + v.Minor = parsed[1] + v.Patch = parsed[2] + return nil +} + +func (v Version) String() string { + var buffer bytes.Buffer + + fmt.Fprintf(&buffer, "%d.%d.%d", v.Major, v.Minor, v.Patch) + + if v.PreRelease != "" { + fmt.Fprintf(&buffer, "-%s", v.PreRelease) + } + + if v.Metadata != "" { + fmt.Fprintf(&buffer, "+%s", v.Metadata) + } + + return buffer.String() +} + +func (v *Version) UnmarshalYAML(unmarshal func(interface{}) error) error { + var data string + if err := unmarshal(&data); err != nil { + return err + } + return v.Set(data) +} + +func (v Version) MarshalJSON() ([]byte, error) { + return []byte(`"` + v.String() + `"`), nil +} + +func (v *Version) UnmarshalJSON(data []byte) error { + l := len(data) + if l == 0 || string(data) == `""` { + return nil + } + if l < 2 || data[0] != '"' || data[l-1] != '"' { + return errors.New("invalid semver string") + } + return v.Set(string(data[1 : l-1])) +} + +// Compare tests if v is less than, equal to, or greater than versionB, +// returning -1, 0, or +1 respectively. +func (v Version) Compare(versionB Version) int { + if cmp := recursiveCompare(v.Slice(), versionB.Slice()); cmp != 0 { + return cmp + } + return preReleaseCompare(v, versionB) +} + +// Equal tests if v is equal to versionB. +func (v Version) Equal(versionB Version) bool { + return v.Compare(versionB) == 0 +} + +// LessThan tests if v is less than versionB. +func (v Version) LessThan(versionB Version) bool { + return v.Compare(versionB) < 0 +} + +// Slice converts the comparable parts of the semver into a slice of integers. +func (v Version) Slice() []int64 { + return []int64{v.Major, v.Minor, v.Patch} +} + +func (p PreRelease) Slice() []string { + preRelease := string(p) + return strings.Split(preRelease, ".") +} + +func preReleaseCompare(versionA Version, versionB Version) int { + a := versionA.PreRelease + b := versionB.PreRelease + + /* Handle the case where if two versions are otherwise equal it is the + * one without a PreRelease that is greater */ + if len(a) == 0 && (len(b) > 0) { + return 1 + } else if len(b) == 0 && (len(a) > 0) { + return -1 + } + + // If there is a prerelease, check and compare each part. + return recursivePreReleaseCompare(a.Slice(), b.Slice()) +} + +func recursiveCompare(versionA []int64, versionB []int64) int { + if len(versionA) == 0 { + return 0 + } + + a := versionA[0] + b := versionB[0] + + if a > b { + return 1 + } else if a < b { + return -1 + } + + return recursiveCompare(versionA[1:], versionB[1:]) +} + +func recursivePreReleaseCompare(versionA []string, versionB []string) int { + // A larger set of pre-release fields has a higher precedence than a smaller set, + // if all of the preceding identifiers are equal. + if len(versionA) == 0 { + if len(versionB) > 0 { + return -1 + } + return 0 + } else if len(versionB) == 0 { + // We're longer than versionB so return 1. + return 1 + } + + a := versionA[0] + b := versionB[0] + + aInt := false + bInt := false + + aI, err := strconv.Atoi(versionA[0]) + if err == nil { + aInt = true + } + + bI, err := strconv.Atoi(versionB[0]) + if err == nil { + bInt = true + } + + // Numeric identifiers always have lower precedence than non-numeric identifiers. + if aInt && !bInt { + return -1 + } else if !aInt && bInt { + return 1 + } + + // Handle Integer Comparison + if aInt && bInt { + if aI > bI { + return 1 + } else if aI < bI { + return -1 + } + } + + // Handle String Comparison + if a > b { + return 1 + } else if a < b { + return -1 + } + + return recursivePreReleaseCompare(versionA[1:], versionB[1:]) +} + +// BumpMajor increments the Major field by 1 and resets all other fields to their default values +func (v *Version) BumpMajor() { + v.Major += 1 + v.Minor = 0 + v.Patch = 0 + v.PreRelease = PreRelease("") + v.Metadata = "" +} + +// BumpMinor increments the Minor field by 1 and resets all other fields to their default values +func (v *Version) BumpMinor() { + v.Minor += 1 + v.Patch = 0 + v.PreRelease = PreRelease("") + v.Metadata = "" +} + +// BumpPatch increments the Patch field by 1 and resets all other fields to their default values +func (v *Version) BumpPatch() { + v.Patch += 1 + v.PreRelease = PreRelease("") + v.Metadata = "" +} + +// validateIdentifier makes sure the provided identifier satisfies semver spec +func validateIdentifier(id string) error { + if id != "" && !reIdentifier.MatchString(id) { + return fmt.Errorf("%s is not a valid semver identifier", id) + } + return nil +} + +// reIdentifier is a regular expression used to check that pre-release and metadata +// identifiers satisfy the spec requirements +var reIdentifier = regexp.MustCompile(`^[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*$`) diff --git a/vendor/github.com/coreos/go-semver/semver/sort.go b/vendor/github.com/coreos/go-semver/semver/sort.go new file mode 100644 index 00000000..e256b41a --- /dev/null +++ b/vendor/github.com/coreos/go-semver/semver/sort.go @@ -0,0 +1,38 @@ +// Copyright 2013-2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package semver + +import ( + "sort" +) + +type Versions []*Version + +func (s Versions) Len() int { + return len(s) +} + +func (s Versions) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s Versions) Less(i, j int) bool { + return s[i].LessThan(*s[j]) +} + +// Sort sorts the given slice of Version +func Sort(versions []*Version) { + sort.Sort(Versions(versions)) +} diff --git a/vendor/github.com/coreos/go-systemd/LICENSE b/vendor/github.com/coreos/go-systemd/LICENSE new file mode 100644 index 00000000..37ec93a1 --- /dev/null +++ b/vendor/github.com/coreos/go-systemd/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/coreos/go-systemd/NOTICE b/vendor/github.com/coreos/go-systemd/NOTICE new file mode 100644 index 00000000..23a0ada2 --- /dev/null +++ b/vendor/github.com/coreos/go-systemd/NOTICE @@ -0,0 +1,5 @@ +CoreOS Project +Copyright 2018 CoreOS, Inc + +This product includes software developed at CoreOS, Inc. +(http://www.coreos.com/). diff --git a/vendor/github.com/coreos/go-systemd/journal/journal.go b/vendor/github.com/coreos/go-systemd/journal/journal.go new file mode 100644 index 00000000..a0f4837a --- /dev/null +++ b/vendor/github.com/coreos/go-systemd/journal/journal.go @@ -0,0 +1,225 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package journal provides write bindings to the local systemd journal. +// It is implemented in pure Go and connects to the journal directly over its +// unix socket. +// +// To read from the journal, see the "sdjournal" package, which wraps the +// sd-journal a C API. +// +// http://www.freedesktop.org/software/systemd/man/systemd-journald.service.html +package journal + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "os" + "strconv" + "strings" + "sync" + "sync/atomic" + "syscall" + "unsafe" +) + +// Priority of a journal message +type Priority int + +const ( + PriEmerg Priority = iota + PriAlert + PriCrit + PriErr + PriWarning + PriNotice + PriInfo + PriDebug +) + +var ( + // This can be overridden at build-time: + // https://github.com/golang/go/wiki/GcToolchainTricks#including-build-information-in-the-executable + journalSocket = "/run/systemd/journal/socket" + + // unixConnPtr atomically holds the local unconnected Unix-domain socket. + // Concrete safe pointer type: *net.UnixConn + unixConnPtr unsafe.Pointer + // onceConn ensures that unixConnPtr is initialized exactly once. + onceConn sync.Once +) + +func init() { + onceConn.Do(initConn) +} + +// Enabled checks whether the local systemd journal is available for logging. +func Enabled() bool { + onceConn.Do(initConn) + + if (*net.UnixConn)(atomic.LoadPointer(&unixConnPtr)) == nil { + return false + } + + if _, err := net.Dial("unixgram", journalSocket); err != nil { + return false + } + + return true +} + +// Send a message to the local systemd journal. vars is a map of journald +// fields to values. Fields must be composed of uppercase letters, numbers, +// and underscores, but must not start with an underscore. Within these +// restrictions, any arbitrary field name may be used. Some names have special +// significance: see the journalctl documentation +// (http://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html) +// for more details. vars may be nil. +func Send(message string, priority Priority, vars map[string]string) error { + conn := (*net.UnixConn)(atomic.LoadPointer(&unixConnPtr)) + if conn == nil { + return errors.New("could not initialize socket to journald") + } + + socketAddr := &net.UnixAddr{ + Name: journalSocket, + Net: "unixgram", + } + + data := new(bytes.Buffer) + appendVariable(data, "PRIORITY", strconv.Itoa(int(priority))) + appendVariable(data, "MESSAGE", message) + for k, v := range vars { + appendVariable(data, k, v) + } + + _, _, err := conn.WriteMsgUnix(data.Bytes(), nil, socketAddr) + if err == nil { + return nil + } + if !isSocketSpaceError(err) { + return err + } + + // Large log entry, send it via tempfile and ancillary-fd. + file, err := tempFd() + if err != nil { + return err + } + defer file.Close() + _, err = io.Copy(file, data) + if err != nil { + return err + } + rights := syscall.UnixRights(int(file.Fd())) + _, _, err = conn.WriteMsgUnix([]byte{}, rights, socketAddr) + if err != nil { + return err + } + + return nil +} + +// Print prints a message to the local systemd journal using Send(). +func Print(priority Priority, format string, a ...interface{}) error { + return Send(fmt.Sprintf(format, a...), priority, nil) +} + +func appendVariable(w io.Writer, name, value string) { + if err := validVarName(name); err != nil { + fmt.Fprintf(os.Stderr, "variable name %s contains invalid character, ignoring\n", name) + } + if strings.ContainsRune(value, '\n') { + /* When the value contains a newline, we write: + * - the variable name, followed by a newline + * - the size (in 64bit little endian format) + * - the data, followed by a newline + */ + fmt.Fprintln(w, name) + binary.Write(w, binary.LittleEndian, uint64(len(value))) + fmt.Fprintln(w, value) + } else { + /* just write the variable and value all on one line */ + fmt.Fprintf(w, "%s=%s\n", name, value) + } +} + +// validVarName validates a variable name to make sure journald will accept it. +// The variable name must be in uppercase and consist only of characters, +// numbers and underscores, and may not begin with an underscore: +// https://www.freedesktop.org/software/systemd/man/sd_journal_print.html +func validVarName(name string) error { + if name == "" { + return errors.New("Empty variable name") + } else if name[0] == '_' { + return errors.New("Variable name begins with an underscore") + } + + for _, c := range name { + if !(('A' <= c && c <= 'Z') || ('0' <= c && c <= '9') || c == '_') { + return errors.New("Variable name contains invalid characters") + } + } + return nil +} + +// isSocketSpaceError checks whether the error is signaling +// an "overlarge message" condition. +func isSocketSpaceError(err error) bool { + opErr, ok := err.(*net.OpError) + if !ok || opErr == nil { + return false + } + + sysErr, ok := opErr.Err.(*os.SyscallError) + if !ok || sysErr == nil { + return false + } + + return sysErr.Err == syscall.EMSGSIZE || sysErr.Err == syscall.ENOBUFS +} + +// tempFd creates a temporary, unlinked file under `/dev/shm`. +func tempFd() (*os.File, error) { + file, err := ioutil.TempFile("/dev/shm/", "journal.XXXXX") + if err != nil { + return nil, err + } + err = syscall.Unlink(file.Name()) + if err != nil { + return nil, err + } + return file, nil +} + +// initConn initializes the global `unixConnPtr` socket. +// It is meant to be called exactly once, at program startup. +func initConn() { + autobind, err := net.ResolveUnixAddr("unixgram", "") + if err != nil { + return + } + + sock, err := net.ListenUnixgram("unixgram", autobind) + if err != nil { + return + } + + atomic.StorePointer(&unixConnPtr, unsafe.Pointer(sock)) +} diff --git a/vendor/github.com/coreos/pkg/LICENSE b/vendor/github.com/coreos/pkg/LICENSE new file mode 100644 index 00000000..e06d2081 --- /dev/null +++ b/vendor/github.com/coreos/pkg/LICENSE @@ -0,0 +1,202 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/vendor/github.com/coreos/pkg/NOTICE b/vendor/github.com/coreos/pkg/NOTICE new file mode 100644 index 00000000..b39ddfa5 --- /dev/null +++ b/vendor/github.com/coreos/pkg/NOTICE @@ -0,0 +1,5 @@ +CoreOS Project +Copyright 2014 CoreOS, Inc + +This product includes software developed at CoreOS, Inc. +(http://www.coreos.com/). diff --git a/vendor/github.com/coreos/pkg/capnslog/README.md b/vendor/github.com/coreos/pkg/capnslog/README.md new file mode 100644 index 00000000..f79dbfca --- /dev/null +++ b/vendor/github.com/coreos/pkg/capnslog/README.md @@ -0,0 +1,39 @@ +# capnslog, the CoreOS logging package + +There are far too many logging packages out there, with varying degrees of licenses, far too many features (colorization, all sorts of log frameworks) or are just a pain to use (lack of `Fatalln()`?). +capnslog provides a simple but consistent logging interface suitable for all kinds of projects. + +### Design Principles + +##### `package main` is the place where logging gets turned on and routed + +A library should not touch log options, only generate log entries. Libraries are silent until main lets them speak. + +##### All log options are runtime-configurable. + +Still the job of `main` to expose these configurations. `main` may delegate this to, say, a configuration webhook, but does so explicitly. + +##### There is one log object per package. It is registered under its repository and package name. + +`main` activates logging for its repository and any dependency repositories it would also like to have output in its logstream. `main` also dictates at which level each subpackage logs. + +##### There is *one* output stream, and it is an `io.Writer` composed with a formatter. + +Splitting streams is probably not the job of your program, but rather, your log aggregation framework. If you must split output streams, again, `main` configures this and you can write a very simple two-output struct that satisfies io.Writer. + +Fancy colorful formatting and JSON output are beyond the scope of a basic logging framework -- they're application/log-collector dependent. These are, at best, provided as options, but more likely, provided by your application. + +##### Log objects are an interface + +An object knows best how to print itself. Log objects can collect more interesting metadata if they wish, however, because text isn't going away anytime soon, they must all be marshalable to text. The simplest log object is a string, which returns itself. If you wish to do more fancy tricks for printing your log objects, see also JSON output -- introspect and write a formatter which can handle your advanced log interface. Making strings is the only thing guaranteed. + +##### Log levels have specific meanings: + + * Critical: Unrecoverable. Must fail. + * Error: Data has been lost, a request has failed for a bad reason, or a required resource has been lost + * Warning: (Hopefully) Temporary conditions that may cause errors, but may work fine. A replica disappearing (that may reconnect) is a warning. + * Notice: Normal, but important (uncommon) log information. + * Info: Normal, working log information, everything is fine, but helpful notices for auditing or common operations. + * Debug: Everything is still fine, but even common operations may be logged, and less helpful but more quantity of notices. + * Trace: Anything goes, from logging every function call as part of a common operation, to tracing execution of a query. + diff --git a/vendor/github.com/coreos/pkg/capnslog/formatters.go b/vendor/github.com/coreos/pkg/capnslog/formatters.go new file mode 100644 index 00000000..b305a845 --- /dev/null +++ b/vendor/github.com/coreos/pkg/capnslog/formatters.go @@ -0,0 +1,157 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package capnslog + +import ( + "bufio" + "fmt" + "io" + "log" + "runtime" + "strings" + "time" +) + +type Formatter interface { + Format(pkg string, level LogLevel, depth int, entries ...interface{}) + Flush() +} + +func NewStringFormatter(w io.Writer) Formatter { + return &StringFormatter{ + w: bufio.NewWriter(w), + } +} + +type StringFormatter struct { + w *bufio.Writer +} + +func (s *StringFormatter) Format(pkg string, l LogLevel, i int, entries ...interface{}) { + now := time.Now().UTC() + s.w.WriteString(now.Format(time.RFC3339)) + s.w.WriteByte(' ') + writeEntries(s.w, pkg, l, i, entries...) + s.Flush() +} + +func writeEntries(w *bufio.Writer, pkg string, _ LogLevel, _ int, entries ...interface{}) { + if pkg != "" { + w.WriteString(pkg + ": ") + } + str := fmt.Sprint(entries...) + endsInNL := strings.HasSuffix(str, "\n") + w.WriteString(str) + if !endsInNL { + w.WriteString("\n") + } +} + +func (s *StringFormatter) Flush() { + s.w.Flush() +} + +func NewPrettyFormatter(w io.Writer, debug bool) Formatter { + return &PrettyFormatter{ + w: bufio.NewWriter(w), + debug: debug, + } +} + +type PrettyFormatter struct { + w *bufio.Writer + debug bool +} + +func (c *PrettyFormatter) Format(pkg string, l LogLevel, depth int, entries ...interface{}) { + now := time.Now() + ts := now.Format("2006-01-02 15:04:05") + c.w.WriteString(ts) + ms := now.Nanosecond() / 1000 + c.w.WriteString(fmt.Sprintf(".%06d", ms)) + if c.debug { + _, file, line, ok := runtime.Caller(depth) // It's always the same number of frames to the user's call. + if !ok { + file = "???" + line = 1 + } else { + slash := strings.LastIndex(file, "/") + if slash >= 0 { + file = file[slash+1:] + } + } + if line < 0 { + line = 0 // not a real line number + } + c.w.WriteString(fmt.Sprintf(" [%s:%d]", file, line)) + } + c.w.WriteString(fmt.Sprint(" ", l.Char(), " | ")) + writeEntries(c.w, pkg, l, depth, entries...) + c.Flush() +} + +func (c *PrettyFormatter) Flush() { + c.w.Flush() +} + +// LogFormatter emulates the form of the traditional built-in logger. +type LogFormatter struct { + logger *log.Logger + prefix string +} + +// NewLogFormatter is a helper to produce a new LogFormatter struct. It uses the +// golang log package to actually do the logging work so that logs look similar. +func NewLogFormatter(w io.Writer, prefix string, flag int) Formatter { + return &LogFormatter{ + logger: log.New(w, "", flag), // don't use prefix here + prefix: prefix, // save it instead + } +} + +// Format builds a log message for the LogFormatter. The LogLevel is ignored. +func (lf *LogFormatter) Format(pkg string, _ LogLevel, _ int, entries ...interface{}) { + str := fmt.Sprint(entries...) + prefix := lf.prefix + if pkg != "" { + prefix = fmt.Sprintf("%s%s: ", prefix, pkg) + } + lf.logger.Output(5, fmt.Sprintf("%s%v", prefix, str)) // call depth is 5 +} + +// Flush is included so that the interface is complete, but is a no-op. +func (lf *LogFormatter) Flush() { + // noop +} + +// NilFormatter is a no-op log formatter that does nothing. +type NilFormatter struct { +} + +// NewNilFormatter is a helper to produce a new LogFormatter struct. It logs no +// messages so that you can cause part of your logging to be silent. +func NewNilFormatter() Formatter { + return &NilFormatter{} +} + +// Format does nothing. +func (_ *NilFormatter) Format(_ string, _ LogLevel, _ int, _ ...interface{}) { + // noop +} + +// Flush is included so that the interface is complete, but is a no-op. +func (_ *NilFormatter) Flush() { + // noop +} diff --git a/vendor/github.com/coreos/pkg/capnslog/glog_formatter.go b/vendor/github.com/coreos/pkg/capnslog/glog_formatter.go new file mode 100644 index 00000000..426603ef --- /dev/null +++ b/vendor/github.com/coreos/pkg/capnslog/glog_formatter.go @@ -0,0 +1,96 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package capnslog + +import ( + "bufio" + "bytes" + "io" + "os" + "runtime" + "strconv" + "strings" + "time" +) + +var pid = os.Getpid() + +type GlogFormatter struct { + StringFormatter +} + +func NewGlogFormatter(w io.Writer) *GlogFormatter { + g := &GlogFormatter{} + g.w = bufio.NewWriter(w) + return g +} + +func (g GlogFormatter) Format(pkg string, level LogLevel, depth int, entries ...interface{}) { + g.w.Write(GlogHeader(level, depth+1)) + g.StringFormatter.Format(pkg, level, depth+1, entries...) +} + +func GlogHeader(level LogLevel, depth int) []byte { + // Lmmdd hh:mm:ss.uuuuuu threadid file:line] + now := time.Now().UTC() + _, file, line, ok := runtime.Caller(depth) // It's always the same number of frames to the user's call. + if !ok { + file = "???" + line = 1 + } else { + slash := strings.LastIndex(file, "/") + if slash >= 0 { + file = file[slash+1:] + } + } + if line < 0 { + line = 0 // not a real line number + } + buf := &bytes.Buffer{} + buf.Grow(30) + _, month, day := now.Date() + hour, minute, second := now.Clock() + buf.WriteString(level.Char()) + twoDigits(buf, int(month)) + twoDigits(buf, day) + buf.WriteByte(' ') + twoDigits(buf, hour) + buf.WriteByte(':') + twoDigits(buf, minute) + buf.WriteByte(':') + twoDigits(buf, second) + buf.WriteByte('.') + buf.WriteString(strconv.Itoa(now.Nanosecond() / 1000)) + buf.WriteByte('Z') + buf.WriteByte(' ') + buf.WriteString(strconv.Itoa(pid)) + buf.WriteByte(' ') + buf.WriteString(file) + buf.WriteByte(':') + buf.WriteString(strconv.Itoa(line)) + buf.WriteByte(']') + buf.WriteByte(' ') + return buf.Bytes() +} + +const digits = "0123456789" + +func twoDigits(b *bytes.Buffer, d int) { + c2 := digits[d%10] + d /= 10 + c1 := digits[d%10] + b.WriteByte(c1) + b.WriteByte(c2) +} diff --git a/vendor/github.com/coreos/pkg/capnslog/init.go b/vendor/github.com/coreos/pkg/capnslog/init.go new file mode 100644 index 00000000..38ce6d26 --- /dev/null +++ b/vendor/github.com/coreos/pkg/capnslog/init.go @@ -0,0 +1,49 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +build !windows + +package capnslog + +import ( + "io" + "os" + "syscall" +) + +// Here's where the opinionation comes in. We need some sensible defaults, +// especially after taking over the log package. Your project (whatever it may +// be) may see things differently. That's okay; there should be no defaults in +// the main package that cannot be controlled or overridden programatically, +// otherwise it's a bug. Doing so is creating your own init_log.go file much +// like this one. + +func init() { + initHijack() + + // Go `log` package uses os.Stderr. + SetFormatter(NewDefaultFormatter(os.Stderr)) + SetGlobalLogLevel(INFO) +} + +func NewDefaultFormatter(out io.Writer) Formatter { + if syscall.Getppid() == 1 { + // We're running under init, which may be systemd. + f, err := NewJournaldFormatter() + if err == nil { + return f + } + } + return NewPrettyFormatter(out, false) +} diff --git a/vendor/github.com/coreos/pkg/capnslog/init_windows.go b/vendor/github.com/coreos/pkg/capnslog/init_windows.go new file mode 100644 index 00000000..45530506 --- /dev/null +++ b/vendor/github.com/coreos/pkg/capnslog/init_windows.go @@ -0,0 +1,25 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package capnslog + +import "os" + +func init() { + initHijack() + + // Go `log` package uses os.Stderr. + SetFormatter(NewPrettyFormatter(os.Stderr, false)) + SetGlobalLogLevel(INFO) +} diff --git a/vendor/github.com/coreos/pkg/capnslog/journald_formatter.go b/vendor/github.com/coreos/pkg/capnslog/journald_formatter.go new file mode 100644 index 00000000..72e05207 --- /dev/null +++ b/vendor/github.com/coreos/pkg/capnslog/journald_formatter.go @@ -0,0 +1,68 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +build !windows + +package capnslog + +import ( + "errors" + "fmt" + "os" + "path/filepath" + + "github.com/coreos/go-systemd/journal" +) + +func NewJournaldFormatter() (Formatter, error) { + if !journal.Enabled() { + return nil, errors.New("No systemd detected") + } + return &journaldFormatter{}, nil +} + +type journaldFormatter struct{} + +func (j *journaldFormatter) Format(pkg string, l LogLevel, _ int, entries ...interface{}) { + var pri journal.Priority + switch l { + case CRITICAL: + pri = journal.PriCrit + case ERROR: + pri = journal.PriErr + case WARNING: + pri = journal.PriWarning + case NOTICE: + pri = journal.PriNotice + case INFO: + pri = journal.PriInfo + case DEBUG: + pri = journal.PriDebug + case TRACE: + pri = journal.PriDebug + default: + panic("Unhandled loglevel") + } + msg := fmt.Sprint(entries...) + tags := map[string]string{ + "PACKAGE": pkg, + "SYSLOG_IDENTIFIER": filepath.Base(os.Args[0]), + } + err := journal.Send(msg, pri, tags) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } +} + +func (j *journaldFormatter) Flush() {} diff --git a/vendor/github.com/coreos/pkg/capnslog/log_hijack.go b/vendor/github.com/coreos/pkg/capnslog/log_hijack.go new file mode 100644 index 00000000..970086b9 --- /dev/null +++ b/vendor/github.com/coreos/pkg/capnslog/log_hijack.go @@ -0,0 +1,39 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package capnslog + +import ( + "log" +) + +func initHijack() { + pkg := NewPackageLogger("log", "") + w := packageWriter{pkg} + log.SetFlags(0) + log.SetPrefix("") + log.SetOutput(w) +} + +type packageWriter struct { + pl *PackageLogger +} + +func (p packageWriter) Write(b []byte) (int, error) { + if p.pl.level < INFO { + return 0, nil + } + p.pl.internalLog(calldepth+2, INFO, string(b)) + return len(b), nil +} diff --git a/vendor/github.com/coreos/pkg/capnslog/logmap.go b/vendor/github.com/coreos/pkg/capnslog/logmap.go new file mode 100644 index 00000000..226b60c2 --- /dev/null +++ b/vendor/github.com/coreos/pkg/capnslog/logmap.go @@ -0,0 +1,245 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package capnslog + +import ( + "errors" + "strings" + "sync" +) + +// LogLevel is the set of all log levels. +type LogLevel int8 + +const ( + // CRITICAL is the lowest log level; only errors which will end the program will be propagated. + CRITICAL LogLevel = iota - 1 + // ERROR is for errors that are not fatal but lead to troubling behavior. + ERROR + // WARNING is for errors which are not fatal and not errors, but are unusual. Often sourced from misconfigurations. + WARNING + // NOTICE is for normal but significant conditions. + NOTICE + // INFO is a log level for common, everyday log updates. + INFO + // DEBUG is the default hidden level for more verbose updates about internal processes. + DEBUG + // TRACE is for (potentially) call by call tracing of programs. + TRACE +) + +// Char returns a single-character representation of the log level. +func (l LogLevel) Char() string { + switch l { + case CRITICAL: + return "C" + case ERROR: + return "E" + case WARNING: + return "W" + case NOTICE: + return "N" + case INFO: + return "I" + case DEBUG: + return "D" + case TRACE: + return "T" + default: + panic("Unhandled loglevel") + } +} + +// String returns a multi-character representation of the log level. +func (l LogLevel) String() string { + switch l { + case CRITICAL: + return "CRITICAL" + case ERROR: + return "ERROR" + case WARNING: + return "WARNING" + case NOTICE: + return "NOTICE" + case INFO: + return "INFO" + case DEBUG: + return "DEBUG" + case TRACE: + return "TRACE" + default: + panic("Unhandled loglevel") + } +} + +// Update using the given string value. Fulfills the flag.Value interface. +func (l *LogLevel) Set(s string) error { + value, err := ParseLevel(s) + if err != nil { + return err + } + + *l = value + return nil +} + +// Returns an empty string, only here to fulfill the pflag.Value interface. +func (l *LogLevel) Type() string { + return "" +} + +// ParseLevel translates some potential loglevel strings into their corresponding levels. +func ParseLevel(s string) (LogLevel, error) { + switch s { + case "CRITICAL", "C": + return CRITICAL, nil + case "ERROR", "0", "E": + return ERROR, nil + case "WARNING", "1", "W": + return WARNING, nil + case "NOTICE", "2", "N": + return NOTICE, nil + case "INFO", "3", "I": + return INFO, nil + case "DEBUG", "4", "D": + return DEBUG, nil + case "TRACE", "5", "T": + return TRACE, nil + } + return CRITICAL, errors.New("couldn't parse log level " + s) +} + +type RepoLogger map[string]*PackageLogger + +type loggerStruct struct { + sync.Mutex + repoMap map[string]RepoLogger + formatter Formatter +} + +// logger is the global logger +var logger = new(loggerStruct) + +// SetGlobalLogLevel sets the log level for all packages in all repositories +// registered with capnslog. +func SetGlobalLogLevel(l LogLevel) { + logger.Lock() + defer logger.Unlock() + for _, r := range logger.repoMap { + r.setRepoLogLevelInternal(l) + } +} + +// GetRepoLogger may return the handle to the repository's set of packages' loggers. +func GetRepoLogger(repo string) (RepoLogger, error) { + logger.Lock() + defer logger.Unlock() + r, ok := logger.repoMap[repo] + if !ok { + return nil, errors.New("no packages registered for repo " + repo) + } + return r, nil +} + +// MustRepoLogger returns the handle to the repository's packages' loggers. +func MustRepoLogger(repo string) RepoLogger { + r, err := GetRepoLogger(repo) + if err != nil { + panic(err) + } + return r +} + +// SetRepoLogLevel sets the log level for all packages in the repository. +func (r RepoLogger) SetRepoLogLevel(l LogLevel) { + logger.Lock() + defer logger.Unlock() + r.setRepoLogLevelInternal(l) +} + +func (r RepoLogger) setRepoLogLevelInternal(l LogLevel) { + for _, v := range r { + v.level = l + } +} + +// ParseLogLevelConfig parses a comma-separated string of "package=loglevel", in +// order, and returns a map of the results, for use in SetLogLevel. +func (r RepoLogger) ParseLogLevelConfig(conf string) (map[string]LogLevel, error) { + setlist := strings.Split(conf, ",") + out := make(map[string]LogLevel) + for _, setstring := range setlist { + setting := strings.Split(setstring, "=") + if len(setting) != 2 { + return nil, errors.New("oddly structured `pkg=level` option: " + setstring) + } + l, err := ParseLevel(setting[1]) + if err != nil { + return nil, err + } + out[setting[0]] = l + } + return out, nil +} + +// SetLogLevel takes a map of package names within a repository to their desired +// loglevel, and sets the levels appropriately. Unknown packages are ignored. +// "*" is a special package name that corresponds to all packages, and will be +// processed first. +func (r RepoLogger) SetLogLevel(m map[string]LogLevel) { + logger.Lock() + defer logger.Unlock() + if l, ok := m["*"]; ok { + r.setRepoLogLevelInternal(l) + } + for k, v := range m { + l, ok := r[k] + if !ok { + continue + } + l.level = v + } +} + +// SetFormatter sets the formatting function for all logs. +func SetFormatter(f Formatter) { + logger.Lock() + defer logger.Unlock() + logger.formatter = f +} + +// NewPackageLogger creates a package logger object. +// This should be defined as a global var in your package, referencing your repo. +func NewPackageLogger(repo string, pkg string) (p *PackageLogger) { + logger.Lock() + defer logger.Unlock() + if logger.repoMap == nil { + logger.repoMap = make(map[string]RepoLogger) + } + r, rok := logger.repoMap[repo] + if !rok { + logger.repoMap[repo] = make(RepoLogger) + r = logger.repoMap[repo] + } + p, pok := r[pkg] + if !pok { + r[pkg] = &PackageLogger{ + pkg: pkg, + level: INFO, + } + p = r[pkg] + } + return +} diff --git a/vendor/github.com/coreos/pkg/capnslog/pkg_logger.go b/vendor/github.com/coreos/pkg/capnslog/pkg_logger.go new file mode 100644 index 00000000..00ff3714 --- /dev/null +++ b/vendor/github.com/coreos/pkg/capnslog/pkg_logger.go @@ -0,0 +1,191 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package capnslog + +import ( + "fmt" + "os" +) + +type PackageLogger struct { + pkg string + level LogLevel +} + +const calldepth = 2 + +func (p *PackageLogger) internalLog(depth int, inLevel LogLevel, entries ...interface{}) { + logger.Lock() + defer logger.Unlock() + if inLevel != CRITICAL && p.level < inLevel { + return + } + if logger.formatter != nil { + logger.formatter.Format(p.pkg, inLevel, depth+1, entries...) + } +} + +// SetLevel allows users to change the current logging level. +func (p *PackageLogger) SetLevel(l LogLevel) { + logger.Lock() + defer logger.Unlock() + p.level = l +} + +// LevelAt checks if the given log level will be outputted under current setting. +func (p *PackageLogger) LevelAt(l LogLevel) bool { + logger.Lock() + defer logger.Unlock() + return p.level >= l +} + +// Log a formatted string at any level between ERROR and TRACE +func (p *PackageLogger) Logf(l LogLevel, format string, args ...interface{}) { + p.internalLog(calldepth, l, fmt.Sprintf(format, args...)) +} + +// Log a message at any level between ERROR and TRACE +func (p *PackageLogger) Log(l LogLevel, args ...interface{}) { + p.internalLog(calldepth, l, fmt.Sprint(args...)) +} + +// log stdlib compatibility + +func (p *PackageLogger) Println(args ...interface{}) { + p.internalLog(calldepth, INFO, fmt.Sprintln(args...)) +} + +func (p *PackageLogger) Printf(format string, args ...interface{}) { + p.Logf(INFO, format, args...) +} + +func (p *PackageLogger) Print(args ...interface{}) { + p.internalLog(calldepth, INFO, fmt.Sprint(args...)) +} + +// Panic and fatal + +func (p *PackageLogger) Panicf(format string, args ...interface{}) { + s := fmt.Sprintf(format, args...) + p.internalLog(calldepth, CRITICAL, s) + panic(s) +} + +func (p *PackageLogger) Panic(args ...interface{}) { + s := fmt.Sprint(args...) + p.internalLog(calldepth, CRITICAL, s) + panic(s) +} + +func (p *PackageLogger) Panicln(args ...interface{}) { + s := fmt.Sprintln(args...) + p.internalLog(calldepth, CRITICAL, s) + panic(s) +} + +func (p *PackageLogger) Fatalf(format string, args ...interface{}) { + p.Logf(CRITICAL, format, args...) + os.Exit(1) +} + +func (p *PackageLogger) Fatal(args ...interface{}) { + s := fmt.Sprint(args...) + p.internalLog(calldepth, CRITICAL, s) + os.Exit(1) +} + +func (p *PackageLogger) Fatalln(args ...interface{}) { + s := fmt.Sprintln(args...) + p.internalLog(calldepth, CRITICAL, s) + os.Exit(1) +} + +// Error Functions + +func (p *PackageLogger) Errorf(format string, args ...interface{}) { + p.Logf(ERROR, format, args...) +} + +func (p *PackageLogger) Error(entries ...interface{}) { + p.internalLog(calldepth, ERROR, entries...) +} + +// Warning Functions + +func (p *PackageLogger) Warningf(format string, args ...interface{}) { + p.Logf(WARNING, format, args...) +} + +func (p *PackageLogger) Warning(entries ...interface{}) { + p.internalLog(calldepth, WARNING, entries...) +} + +// Notice Functions + +func (p *PackageLogger) Noticef(format string, args ...interface{}) { + p.Logf(NOTICE, format, args...) +} + +func (p *PackageLogger) Notice(entries ...interface{}) { + p.internalLog(calldepth, NOTICE, entries...) +} + +// Info Functions + +func (p *PackageLogger) Infof(format string, args ...interface{}) { + p.Logf(INFO, format, args...) +} + +func (p *PackageLogger) Info(entries ...interface{}) { + p.internalLog(calldepth, INFO, entries...) +} + +// Debug Functions + +func (p *PackageLogger) Debugf(format string, args ...interface{}) { + if p.level < DEBUG { + return + } + p.Logf(DEBUG, format, args...) +} + +func (p *PackageLogger) Debug(entries ...interface{}) { + if p.level < DEBUG { + return + } + p.internalLog(calldepth, DEBUG, entries...) +} + +// Trace Functions + +func (p *PackageLogger) Tracef(format string, args ...interface{}) { + if p.level < TRACE { + return + } + p.Logf(TRACE, format, args...) +} + +func (p *PackageLogger) Trace(entries ...interface{}) { + if p.level < TRACE { + return + } + p.internalLog(calldepth, TRACE, entries...) +} + +func (p *PackageLogger) Flush() { + logger.Lock() + defer logger.Unlock() + logger.formatter.Flush() +} diff --git a/vendor/github.com/coreos/pkg/capnslog/syslog_formatter.go b/vendor/github.com/coreos/pkg/capnslog/syslog_formatter.go new file mode 100644 index 00000000..4be5a1f2 --- /dev/null +++ b/vendor/github.com/coreos/pkg/capnslog/syslog_formatter.go @@ -0,0 +1,65 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +build !windows + +package capnslog + +import ( + "fmt" + "log/syslog" +) + +func NewSyslogFormatter(w *syslog.Writer) Formatter { + return &syslogFormatter{w} +} + +func NewDefaultSyslogFormatter(tag string) (Formatter, error) { + w, err := syslog.New(syslog.LOG_DEBUG, tag) + if err != nil { + return nil, err + } + return NewSyslogFormatter(w), nil +} + +type syslogFormatter struct { + w *syslog.Writer +} + +func (s *syslogFormatter) Format(pkg string, l LogLevel, _ int, entries ...interface{}) { + for _, entry := range entries { + str := fmt.Sprint(entry) + switch l { + case CRITICAL: + s.w.Crit(str) + case ERROR: + s.w.Err(str) + case WARNING: + s.w.Warning(str) + case NOTICE: + s.w.Notice(str) + case INFO: + s.w.Info(str) + case DEBUG: + s.w.Debug(str) + case TRACE: + s.w.Debug(str) + default: + panic("Unhandled loglevel") + } + } +} + +func (s *syslogFormatter) Flush() { +} diff --git a/vendor/github.com/edsrzf/mmap-go/.gitignore b/vendor/github.com/edsrzf/mmap-go/.gitignore new file mode 100644 index 00000000..9aa02c1e --- /dev/null +++ b/vendor/github.com/edsrzf/mmap-go/.gitignore @@ -0,0 +1,8 @@ +*.out +*.5 +*.6 +*.8 +*.swp +_obj +_test +testdata diff --git a/vendor/github.com/edsrzf/mmap-go/LICENSE b/vendor/github.com/edsrzf/mmap-go/LICENSE new file mode 100644 index 00000000..8f05f338 --- /dev/null +++ b/vendor/github.com/edsrzf/mmap-go/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2011, Evan Shaw +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder 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 BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/edsrzf/mmap-go/README.md b/vendor/github.com/edsrzf/mmap-go/README.md new file mode 100644 index 00000000..4cc2bfe1 --- /dev/null +++ b/vendor/github.com/edsrzf/mmap-go/README.md @@ -0,0 +1,12 @@ +mmap-go +======= + +mmap-go is a portable mmap package for the [Go programming language](http://golang.org). +It has been tested on Linux (386, amd64), OS X, and Windows (386). It should also +work on other Unix-like platforms, but hasn't been tested with them. I'm interested +to hear about the results. + +I haven't been able to add more features without adding significant complexity, +so mmap-go doesn't support mprotect, mincore, and maybe a few other things. +If you're running on a Unix-like platform and need some of these features, +I suggest Gustavo Niemeyer's [gommap](http://labix.org/gommap). diff --git a/vendor/github.com/edsrzf/mmap-go/mmap.go b/vendor/github.com/edsrzf/mmap-go/mmap.go new file mode 100644 index 00000000..29655bd2 --- /dev/null +++ b/vendor/github.com/edsrzf/mmap-go/mmap.go @@ -0,0 +1,117 @@ +// Copyright 2011 Evan Shaw. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file defines the common package interface and contains a little bit of +// factored out logic. + +// Package mmap allows mapping files into memory. It tries to provide a simple, reasonably portable interface, +// but doesn't go out of its way to abstract away every little platform detail. +// This specifically means: +// * forked processes may or may not inherit mappings +// * a file's timestamp may or may not be updated by writes through mappings +// * specifying a size larger than the file's actual size can increase the file's size +// * If the mapped file is being modified by another process while your program's running, don't expect consistent results between platforms +package mmap + +import ( + "errors" + "os" + "reflect" + "unsafe" +) + +const ( + // RDONLY maps the memory read-only. + // Attempts to write to the MMap object will result in undefined behavior. + RDONLY = 0 + // RDWR maps the memory as read-write. Writes to the MMap object will update the + // underlying file. + RDWR = 1 << iota + // COPY maps the memory as copy-on-write. Writes to the MMap object will affect + // memory, but the underlying file will remain unchanged. + COPY + // If EXEC is set, the mapped memory is marked as executable. + EXEC +) + +const ( + // If the ANON flag is set, the mapped memory will not be backed by a file. + ANON = 1 << iota +) + +// MMap represents a file mapped into memory. +type MMap []byte + +// Map maps an entire file into memory. +// If ANON is set in flags, f is ignored. +func Map(f *os.File, prot, flags int) (MMap, error) { + return MapRegion(f, -1, prot, flags, 0) +} + +// MapRegion maps part of a file into memory. +// The offset parameter must be a multiple of the system's page size. +// If length < 0, the entire file will be mapped. +// If ANON is set in flags, f is ignored. +func MapRegion(f *os.File, length int, prot, flags int, offset int64) (MMap, error) { + if offset%int64(os.Getpagesize()) != 0 { + return nil, errors.New("offset parameter must be a multiple of the system's page size") + } + + var fd uintptr + if flags&ANON == 0 { + fd = uintptr(f.Fd()) + if length < 0 { + fi, err := f.Stat() + if err != nil { + return nil, err + } + length = int(fi.Size()) + } + } else { + if length <= 0 { + return nil, errors.New("anonymous mapping requires non-zero length") + } + fd = ^uintptr(0) + } + return mmap(length, uintptr(prot), uintptr(flags), fd, offset) +} + +func (m *MMap) header() *reflect.SliceHeader { + return (*reflect.SliceHeader)(unsafe.Pointer(m)) +} + +func (m *MMap) addrLen() (uintptr, uintptr) { + header := m.header() + return header.Data, uintptr(header.Len) +} + +// Lock keeps the mapped region in physical memory, ensuring that it will not be +// swapped out. +func (m MMap) Lock() error { + return m.lock() +} + +// Unlock reverses the effect of Lock, allowing the mapped region to potentially +// be swapped out. +// If m is already unlocked, aan error will result. +func (m MMap) Unlock() error { + return m.unlock() +} + +// Flush synchronizes the mapping's contents to the file's contents on disk. +func (m MMap) Flush() error { + return m.flush() +} + +// Unmap deletes the memory mapped region, flushes any remaining changes, and sets +// m to nil. +// Trying to read or write any remaining references to m after Unmap is called will +// result in undefined behavior. +// Unmap should only be called on the slice value that was originally returned from +// a call to Map. Calling Unmap on a derived slice may cause errors. +func (m *MMap) Unmap() error { + err := m.unmap() + *m = nil + return err +} diff --git a/vendor/github.com/edsrzf/mmap-go/mmap_unix.go b/vendor/github.com/edsrzf/mmap-go/mmap_unix.go new file mode 100644 index 00000000..25b13e51 --- /dev/null +++ b/vendor/github.com/edsrzf/mmap-go/mmap_unix.go @@ -0,0 +1,51 @@ +// Copyright 2011 Evan Shaw. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux openbsd solaris netbsd + +package mmap + +import ( + "golang.org/x/sys/unix" +) + +func mmap(len int, inprot, inflags, fd uintptr, off int64) ([]byte, error) { + flags := unix.MAP_SHARED + prot := unix.PROT_READ + switch { + case inprot© != 0: + prot |= unix.PROT_WRITE + flags = unix.MAP_PRIVATE + case inprot&RDWR != 0: + prot |= unix.PROT_WRITE + } + if inprot&EXEC != 0 { + prot |= unix.PROT_EXEC + } + if inflags&ANON != 0 { + flags |= unix.MAP_ANON + } + + b, err := unix.Mmap(int(fd), off, len, prot, flags) + if err != nil { + return nil, err + } + return b, nil +} + +func (m MMap) flush() error { + return unix.Msync([]byte(m), unix.MS_SYNC) +} + +func (m MMap) lock() error { + return unix.Mlock([]byte(m)) +} + +func (m MMap) unlock() error { + return unix.Munlock([]byte(m)) +} + +func (m MMap) unmap() error { + return unix.Munmap([]byte(m)) +} diff --git a/vendor/github.com/edsrzf/mmap-go/mmap_windows.go b/vendor/github.com/edsrzf/mmap-go/mmap_windows.go new file mode 100644 index 00000000..7910da25 --- /dev/null +++ b/vendor/github.com/edsrzf/mmap-go/mmap_windows.go @@ -0,0 +1,143 @@ +// Copyright 2011 Evan Shaw. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mmap + +import ( + "errors" + "os" + "sync" + + "golang.org/x/sys/windows" +) + +// mmap on Windows is a two-step process. +// First, we call CreateFileMapping to get a handle. +// Then, we call MapviewToFile to get an actual pointer into memory. +// Because we want to emulate a POSIX-style mmap, we don't want to expose +// the handle -- only the pointer. We also want to return only a byte slice, +// not a struct, so it's convenient to manipulate. + +// We keep this map so that we can get back the original handle from the memory address. + +type addrinfo struct { + file windows.Handle + mapview windows.Handle +} + +var handleLock sync.Mutex +var handleMap = map[uintptr]*addrinfo{} + +func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) { + flProtect := uint32(windows.PAGE_READONLY) + dwDesiredAccess := uint32(windows.FILE_MAP_READ) + switch { + case prot© != 0: + flProtect = windows.PAGE_WRITECOPY + dwDesiredAccess = windows.FILE_MAP_COPY + case prot&RDWR != 0: + flProtect = windows.PAGE_READWRITE + dwDesiredAccess = windows.FILE_MAP_WRITE + } + if prot&EXEC != 0 { + flProtect <<= 4 + dwDesiredAccess |= windows.FILE_MAP_EXECUTE + } + + // The maximum size is the area of the file, starting from 0, + // that we wish to allow to be mappable. It is the sum of + // the length the user requested, plus the offset where that length + // is starting from. This does not map the data into memory. + maxSizeHigh := uint32((off + int64(len)) >> 32) + maxSizeLow := uint32((off + int64(len)) & 0xFFFFFFFF) + // TODO: Do we need to set some security attributes? It might help portability. + h, errno := windows.CreateFileMapping(windows.Handle(hfile), nil, flProtect, maxSizeHigh, maxSizeLow, nil) + if h == 0 { + return nil, os.NewSyscallError("CreateFileMapping", errno) + } + + // Actually map a view of the data into memory. The view's size + // is the length the user requested. + fileOffsetHigh := uint32(off >> 32) + fileOffsetLow := uint32(off & 0xFFFFFFFF) + addr, errno := windows.MapViewOfFile(h, dwDesiredAccess, fileOffsetHigh, fileOffsetLow, uintptr(len)) + if addr == 0 { + return nil, os.NewSyscallError("MapViewOfFile", errno) + } + handleLock.Lock() + handleMap[addr] = &addrinfo{ + file: windows.Handle(hfile), + mapview: h, + } + handleLock.Unlock() + + m := MMap{} + dh := m.header() + dh.Data = addr + dh.Len = len + dh.Cap = dh.Len + + return m, nil +} + +func (m MMap) flush() error { + addr, len := m.addrLen() + errno := windows.FlushViewOfFile(addr, len) + if errno != nil { + return os.NewSyscallError("FlushViewOfFile", errno) + } + + handleLock.Lock() + defer handleLock.Unlock() + handle, ok := handleMap[addr] + if !ok { + // should be impossible; we would've errored above + return errors.New("unknown base address") + } + + errno = windows.FlushFileBuffers(handle.file) + return os.NewSyscallError("FlushFileBuffers", errno) +} + +func (m MMap) lock() error { + addr, len := m.addrLen() + errno := windows.VirtualLock(addr, len) + return os.NewSyscallError("VirtualLock", errno) +} + +func (m MMap) unlock() error { + addr, len := m.addrLen() + errno := windows.VirtualUnlock(addr, len) + return os.NewSyscallError("VirtualUnlock", errno) +} + +func (m MMap) unmap() error { + err := m.flush() + if err != nil { + return err + } + + addr := m.header().Data + // Lock the UnmapViewOfFile along with the handleMap deletion. + // As soon as we unmap the view, the OS is free to give the + // same addr to another new map. We don't want another goroutine + // to insert and remove the same addr into handleMap while + // we're trying to remove our old addr/handle pair. + handleLock.Lock() + defer handleLock.Unlock() + err = windows.UnmapViewOfFile(addr) + if err != nil { + return err + } + + handle, ok := handleMap[addr] + if !ok { + // should be impossible; we would've errored above + return errors.New("unknown base address") + } + delete(handleMap, addr) + + e := windows.CloseHandle(windows.Handle(handle.mapview)) + return os.NewSyscallError("CloseHandle", e) +} diff --git a/vendor/github.com/gogo/protobuf/AUTHORS b/vendor/github.com/gogo/protobuf/AUTHORS new file mode 100644 index 00000000..3d97fc7a --- /dev/null +++ b/vendor/github.com/gogo/protobuf/AUTHORS @@ -0,0 +1,15 @@ +# This is the official list of GoGo authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS file, which +# lists people. For example, employees are listed in CONTRIBUTORS, +# but not in AUTHORS, because the employer holds the copyright. + +# Names should be added to this file as one of +# Organization's name +# Individual's name +# Individual's name + +# Please keep the list sorted. + +Sendgrid, Inc +Vastech SA (PTY) LTD +Walter Schulze diff --git a/vendor/github.com/gogo/protobuf/CONTRIBUTORS b/vendor/github.com/gogo/protobuf/CONTRIBUTORS new file mode 100644 index 00000000..1b4f6c20 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/CONTRIBUTORS @@ -0,0 +1,23 @@ +Anton Povarov +Brian Goff +Clayton Coleman +Denis Smirnov +DongYun Kang +Dwayne Schultz +Georg Apitz +Gustav Paul +Johan Brandhorst +John Shahid +John Tuley +Laurent +Patrick Lee +Peter Edge +Roger Johansson +Sam Nguyen +Sergio Arbeo +Stephen J Day +Tamir Duberstein +Todd Eisenberger +Tormod Erevik Lea +Vyacheslav Kim +Walter Schulze diff --git a/vendor/github.com/gogo/protobuf/LICENSE b/vendor/github.com/gogo/protobuf/LICENSE new file mode 100644 index 00000000..f57de90d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/LICENSE @@ -0,0 +1,35 @@ +Copyright (c) 2013, The GoGo Authors. All rights reserved. + +Protocol Buffers for Go with Gadgets + +Go support for Protocol Buffers - Google's data interchange format + +Copyright 2010 The Go Authors. All rights reserved. +https://github.com/golang/protobuf + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/gogo/protobuf/gogoproto/Makefile b/vendor/github.com/gogo/protobuf/gogoproto/Makefile new file mode 100644 index 00000000..0b4659b7 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/gogoproto/Makefile @@ -0,0 +1,37 @@ +# Protocol Buffers for Go with Gadgets +# +# Copyright (c) 2013, The GoGo Authors. All rights reserved. +# http://github.com/gogo/protobuf +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +regenerate: + go install github.com/gogo/protobuf/protoc-gen-gogo + protoc --gogo_out=Mgoogle/protobuf/descriptor.proto=github.com/gogo/protobuf/protoc-gen-gogo/descriptor:../../../../ --proto_path=../../../../:../protobuf/:. *.proto + +restore: + cp gogo.pb.golden gogo.pb.go + +preserve: + cp gogo.pb.go gogo.pb.golden diff --git a/vendor/github.com/gogo/protobuf/gogoproto/doc.go b/vendor/github.com/gogo/protobuf/gogoproto/doc.go new file mode 100644 index 00000000..081c86fa --- /dev/null +++ b/vendor/github.com/gogo/protobuf/gogoproto/doc.go @@ -0,0 +1,169 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package gogoproto provides extensions for protocol buffers to achieve: + + - fast marshalling and unmarshalling. + - peace of mind by optionally generating test and benchmark code. + - more canonical Go structures. + - less typing by optionally generating extra helper code. + - goprotobuf compatibility + +More Canonical Go Structures + +A lot of time working with a goprotobuf struct will lead you to a place where you create another struct that is easier to work with and then have a function to copy the values between the two structs. +You might also find that basic structs that started their life as part of an API need to be sent over the wire. With gob, you could just send it. With goprotobuf, you need to make a parallel struct. +Gogoprotobuf tries to fix these problems with the nullable, embed, customtype and customname field extensions. + + - nullable, if false, a field is generated without a pointer (see warning below). + - embed, if true, the field is generated as an embedded field. + - customtype, It works with the Marshal and Unmarshal methods, to allow you to have your own types in your struct, but marshal to bytes. For example, custom.Uuid or custom.Fixed128 + - customname (beta), Changes the generated fieldname. This is especially useful when generated methods conflict with fieldnames. + - casttype (beta), Changes the generated fieldtype. All generated code assumes that this type is castable to the protocol buffer field type. It does not work for structs or enums. + - castkey (beta), Changes the generated fieldtype for a map key. All generated code assumes that this type is castable to the protocol buffer field type. Only supported on maps. + - castvalue (beta), Changes the generated fieldtype for a map value. All generated code assumes that this type is castable to the protocol buffer field type. Only supported on maps. + +Warning about nullable: According to the Protocol Buffer specification, you should be able to tell whether a field is set or unset. With the option nullable=false this feature is lost, since your non-nullable fields will always be set. It can be seen as a layer on top of Protocol Buffers, where before and after marshalling all non-nullable fields are set and they cannot be unset. + +Let us look at: + + github.com/gogo/protobuf/test/example/example.proto + +for a quicker overview. + +The following message: + + package test; + + import "github.com/gogo/protobuf/gogoproto/gogo.proto"; + + message A { + optional string Description = 1 [(gogoproto.nullable) = false]; + optional int64 Number = 2 [(gogoproto.nullable) = false]; + optional bytes Id = 3 [(gogoproto.customtype) = "github.com/gogo/protobuf/test/custom.Uuid", (gogoproto.nullable) = false]; + } + +Will generate a go struct which looks a lot like this: + + type A struct { + Description string + Number int64 + Id github_com_gogo_protobuf_test_custom.Uuid + } + +You will see there are no pointers, since all fields are non-nullable. +You will also see a custom type which marshals to a string. +Be warned it is your responsibility to test your custom types thoroughly. +You should think of every possible empty and nil case for your marshaling, unmarshaling and size methods. + +Next we will embed the message A in message B. + + message B { + optional A A = 1 [(gogoproto.nullable) = false, (gogoproto.embed) = true]; + repeated bytes G = 2 [(gogoproto.customtype) = "github.com/gogo/protobuf/test/custom.Uint128", (gogoproto.nullable) = false]; + } + +See below that A is embedded in B. + + type B struct { + A + G []github_com_gogo_protobuf_test_custom.Uint128 + } + +Also see the repeated custom type. + + type Uint128 [2]uint64 + +Next we will create a custom name for one of our fields. + + message C { + optional int64 size = 1 [(gogoproto.customname) = "MySize"]; + } + +See below that the field's name is MySize and not Size. + + type C struct { + MySize *int64 + } + +The is useful when having a protocol buffer message with a field name which conflicts with a generated method. +As an example, having a field name size and using the sizer plugin to generate a Size method will cause a go compiler error. +Using customname you can fix this error without changing the field name. +This is typically useful when working with a protocol buffer that was designed before these methods and/or the go language were avialable. + +Gogoprotobuf also has some more subtle changes, these could be changed back: + + - the generated package name for imports do not have the extra /filename.pb, + but are actually the imports specified in the .proto file. + +Gogoprotobuf also has lost some features which should be brought back with time: + + - Marshalling and unmarshalling with reflect and without the unsafe package, + this requires work in pointer_reflect.go + +Why does nullable break protocol buffer specifications: + +The protocol buffer specification states, somewhere, that you should be able to tell whether a +field is set or unset. With the option nullable=false this feature is lost, +since your non-nullable fields will always be set. It can be seen as a layer on top of +protocol buffers, where before and after marshalling all non-nullable fields are set +and they cannot be unset. + +Goprotobuf Compatibility: + +Gogoprotobuf is compatible with Goprotobuf, because it is compatible with protocol buffers. +Gogoprotobuf generates the same code as goprotobuf if no extensions are used. +The enumprefix, getters and stringer extensions can be used to remove some of the unnecessary code generated by goprotobuf: + + - gogoproto_import, if false, the generated code imports github.com/golang/protobuf/proto instead of github.com/gogo/protobuf/proto. + - goproto_enum_prefix, if false, generates the enum constant names without the messagetype prefix + - goproto_enum_stringer (experimental), if false, the enum is generated without the default string method, this is useful for rather using enum_stringer, or allowing you to write your own string method. + - goproto_getters, if false, the message is generated without get methods, this is useful when you would rather want to use face + - goproto_stringer, if false, the message is generated without the default string method, this is useful for rather using stringer, or allowing you to write your own string method. + - goproto_extensions_map (beta), if false, the extensions field is generated as type []byte instead of type map[int32]proto.Extension + - goproto_unrecognized (beta), if false, XXX_unrecognized field is not generated. This is useful in conjunction with gogoproto.nullable=false, to generate structures completely devoid of pointers and reduce GC pressure at the cost of losing information about unrecognized fields. + - goproto_registration (beta), if true, the generated files will register all messages and types against both gogo/protobuf and golang/protobuf. This is necessary when using third-party packages which read registrations from golang/protobuf (such as the grpc-gateway). + +Less Typing and Peace of Mind is explained in their specific plugin folders godoc: + + - github.com/gogo/protobuf/plugin/ + +If you do not use any of these extension the code that is generated +will be the same as if goprotobuf has generated it. + +The most complete way to see examples is to look at + + github.com/gogo/protobuf/test/thetest.proto + +Gogoprototest is a seperate project, +because we want to keep gogoprotobuf independent of goprotobuf, +but we still want to test it thoroughly. + +*/ +package gogoproto diff --git a/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.go b/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.go new file mode 100644 index 00000000..1e91766a --- /dev/null +++ b/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.go @@ -0,0 +1,874 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: gogo.proto + +package gogoproto + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + descriptor "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +var E_GoprotoEnumPrefix = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 62001, + Name: "gogoproto.goproto_enum_prefix", + Tag: "varint,62001,opt,name=goproto_enum_prefix", + Filename: "gogo.proto", +} + +var E_GoprotoEnumStringer = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 62021, + Name: "gogoproto.goproto_enum_stringer", + Tag: "varint,62021,opt,name=goproto_enum_stringer", + Filename: "gogo.proto", +} + +var E_EnumStringer = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 62022, + Name: "gogoproto.enum_stringer", + Tag: "varint,62022,opt,name=enum_stringer", + Filename: "gogo.proto", +} + +var E_EnumCustomname = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumOptions)(nil), + ExtensionType: (*string)(nil), + Field: 62023, + Name: "gogoproto.enum_customname", + Tag: "bytes,62023,opt,name=enum_customname", + Filename: "gogo.proto", +} + +var E_Enumdecl = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 62024, + Name: "gogoproto.enumdecl", + Tag: "varint,62024,opt,name=enumdecl", + Filename: "gogo.proto", +} + +var E_EnumvalueCustomname = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*string)(nil), + Field: 66001, + Name: "gogoproto.enumvalue_customname", + Tag: "bytes,66001,opt,name=enumvalue_customname", + Filename: "gogo.proto", +} + +var E_GoprotoGettersAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63001, + Name: "gogoproto.goproto_getters_all", + Tag: "varint,63001,opt,name=goproto_getters_all", + Filename: "gogo.proto", +} + +var E_GoprotoEnumPrefixAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63002, + Name: "gogoproto.goproto_enum_prefix_all", + Tag: "varint,63002,opt,name=goproto_enum_prefix_all", + Filename: "gogo.proto", +} + +var E_GoprotoStringerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63003, + Name: "gogoproto.goproto_stringer_all", + Tag: "varint,63003,opt,name=goproto_stringer_all", + Filename: "gogo.proto", +} + +var E_VerboseEqualAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63004, + Name: "gogoproto.verbose_equal_all", + Tag: "varint,63004,opt,name=verbose_equal_all", + Filename: "gogo.proto", +} + +var E_FaceAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63005, + Name: "gogoproto.face_all", + Tag: "varint,63005,opt,name=face_all", + Filename: "gogo.proto", +} + +var E_GostringAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63006, + Name: "gogoproto.gostring_all", + Tag: "varint,63006,opt,name=gostring_all", + Filename: "gogo.proto", +} + +var E_PopulateAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63007, + Name: "gogoproto.populate_all", + Tag: "varint,63007,opt,name=populate_all", + Filename: "gogo.proto", +} + +var E_StringerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63008, + Name: "gogoproto.stringer_all", + Tag: "varint,63008,opt,name=stringer_all", + Filename: "gogo.proto", +} + +var E_OnlyoneAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63009, + Name: "gogoproto.onlyone_all", + Tag: "varint,63009,opt,name=onlyone_all", + Filename: "gogo.proto", +} + +var E_EqualAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63013, + Name: "gogoproto.equal_all", + Tag: "varint,63013,opt,name=equal_all", + Filename: "gogo.proto", +} + +var E_DescriptionAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63014, + Name: "gogoproto.description_all", + Tag: "varint,63014,opt,name=description_all", + Filename: "gogo.proto", +} + +var E_TestgenAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63015, + Name: "gogoproto.testgen_all", + Tag: "varint,63015,opt,name=testgen_all", + Filename: "gogo.proto", +} + +var E_BenchgenAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63016, + Name: "gogoproto.benchgen_all", + Tag: "varint,63016,opt,name=benchgen_all", + Filename: "gogo.proto", +} + +var E_MarshalerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63017, + Name: "gogoproto.marshaler_all", + Tag: "varint,63017,opt,name=marshaler_all", + Filename: "gogo.proto", +} + +var E_UnmarshalerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63018, + Name: "gogoproto.unmarshaler_all", + Tag: "varint,63018,opt,name=unmarshaler_all", + Filename: "gogo.proto", +} + +var E_StableMarshalerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63019, + Name: "gogoproto.stable_marshaler_all", + Tag: "varint,63019,opt,name=stable_marshaler_all", + Filename: "gogo.proto", +} + +var E_SizerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63020, + Name: "gogoproto.sizer_all", + Tag: "varint,63020,opt,name=sizer_all", + Filename: "gogo.proto", +} + +var E_GoprotoEnumStringerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63021, + Name: "gogoproto.goproto_enum_stringer_all", + Tag: "varint,63021,opt,name=goproto_enum_stringer_all", + Filename: "gogo.proto", +} + +var E_EnumStringerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63022, + Name: "gogoproto.enum_stringer_all", + Tag: "varint,63022,opt,name=enum_stringer_all", + Filename: "gogo.proto", +} + +var E_UnsafeMarshalerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63023, + Name: "gogoproto.unsafe_marshaler_all", + Tag: "varint,63023,opt,name=unsafe_marshaler_all", + Filename: "gogo.proto", +} + +var E_UnsafeUnmarshalerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63024, + Name: "gogoproto.unsafe_unmarshaler_all", + Tag: "varint,63024,opt,name=unsafe_unmarshaler_all", + Filename: "gogo.proto", +} + +var E_GoprotoExtensionsMapAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63025, + Name: "gogoproto.goproto_extensions_map_all", + Tag: "varint,63025,opt,name=goproto_extensions_map_all", + Filename: "gogo.proto", +} + +var E_GoprotoUnrecognizedAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63026, + Name: "gogoproto.goproto_unrecognized_all", + Tag: "varint,63026,opt,name=goproto_unrecognized_all", + Filename: "gogo.proto", +} + +var E_GogoprotoImport = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63027, + Name: "gogoproto.gogoproto_import", + Tag: "varint,63027,opt,name=gogoproto_import", + Filename: "gogo.proto", +} + +var E_ProtosizerAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63028, + Name: "gogoproto.protosizer_all", + Tag: "varint,63028,opt,name=protosizer_all", + Filename: "gogo.proto", +} + +var E_CompareAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63029, + Name: "gogoproto.compare_all", + Tag: "varint,63029,opt,name=compare_all", + Filename: "gogo.proto", +} + +var E_TypedeclAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63030, + Name: "gogoproto.typedecl_all", + Tag: "varint,63030,opt,name=typedecl_all", + Filename: "gogo.proto", +} + +var E_EnumdeclAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63031, + Name: "gogoproto.enumdecl_all", + Tag: "varint,63031,opt,name=enumdecl_all", + Filename: "gogo.proto", +} + +var E_GoprotoRegistration = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63032, + Name: "gogoproto.goproto_registration", + Tag: "varint,63032,opt,name=goproto_registration", + Filename: "gogo.proto", +} + +var E_MessagenameAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63033, + Name: "gogoproto.messagename_all", + Tag: "varint,63033,opt,name=messagename_all", + Filename: "gogo.proto", +} + +var E_GoprotoSizecacheAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63034, + Name: "gogoproto.goproto_sizecache_all", + Tag: "varint,63034,opt,name=goproto_sizecache_all", + Filename: "gogo.proto", +} + +var E_GoprotoUnkeyedAll = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 63035, + Name: "gogoproto.goproto_unkeyed_all", + Tag: "varint,63035,opt,name=goproto_unkeyed_all", + Filename: "gogo.proto", +} + +var E_GoprotoGetters = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64001, + Name: "gogoproto.goproto_getters", + Tag: "varint,64001,opt,name=goproto_getters", + Filename: "gogo.proto", +} + +var E_GoprotoStringer = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64003, + Name: "gogoproto.goproto_stringer", + Tag: "varint,64003,opt,name=goproto_stringer", + Filename: "gogo.proto", +} + +var E_VerboseEqual = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64004, + Name: "gogoproto.verbose_equal", + Tag: "varint,64004,opt,name=verbose_equal", + Filename: "gogo.proto", +} + +var E_Face = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64005, + Name: "gogoproto.face", + Tag: "varint,64005,opt,name=face", + Filename: "gogo.proto", +} + +var E_Gostring = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64006, + Name: "gogoproto.gostring", + Tag: "varint,64006,opt,name=gostring", + Filename: "gogo.proto", +} + +var E_Populate = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64007, + Name: "gogoproto.populate", + Tag: "varint,64007,opt,name=populate", + Filename: "gogo.proto", +} + +var E_Stringer = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 67008, + Name: "gogoproto.stringer", + Tag: "varint,67008,opt,name=stringer", + Filename: "gogo.proto", +} + +var E_Onlyone = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64009, + Name: "gogoproto.onlyone", + Tag: "varint,64009,opt,name=onlyone", + Filename: "gogo.proto", +} + +var E_Equal = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64013, + Name: "gogoproto.equal", + Tag: "varint,64013,opt,name=equal", + Filename: "gogo.proto", +} + +var E_Description = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64014, + Name: "gogoproto.description", + Tag: "varint,64014,opt,name=description", + Filename: "gogo.proto", +} + +var E_Testgen = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64015, + Name: "gogoproto.testgen", + Tag: "varint,64015,opt,name=testgen", + Filename: "gogo.proto", +} + +var E_Benchgen = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64016, + Name: "gogoproto.benchgen", + Tag: "varint,64016,opt,name=benchgen", + Filename: "gogo.proto", +} + +var E_Marshaler = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64017, + Name: "gogoproto.marshaler", + Tag: "varint,64017,opt,name=marshaler", + Filename: "gogo.proto", +} + +var E_Unmarshaler = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64018, + Name: "gogoproto.unmarshaler", + Tag: "varint,64018,opt,name=unmarshaler", + Filename: "gogo.proto", +} + +var E_StableMarshaler = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64019, + Name: "gogoproto.stable_marshaler", + Tag: "varint,64019,opt,name=stable_marshaler", + Filename: "gogo.proto", +} + +var E_Sizer = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64020, + Name: "gogoproto.sizer", + Tag: "varint,64020,opt,name=sizer", + Filename: "gogo.proto", +} + +var E_UnsafeMarshaler = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64023, + Name: "gogoproto.unsafe_marshaler", + Tag: "varint,64023,opt,name=unsafe_marshaler", + Filename: "gogo.proto", +} + +var E_UnsafeUnmarshaler = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64024, + Name: "gogoproto.unsafe_unmarshaler", + Tag: "varint,64024,opt,name=unsafe_unmarshaler", + Filename: "gogo.proto", +} + +var E_GoprotoExtensionsMap = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64025, + Name: "gogoproto.goproto_extensions_map", + Tag: "varint,64025,opt,name=goproto_extensions_map", + Filename: "gogo.proto", +} + +var E_GoprotoUnrecognized = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64026, + Name: "gogoproto.goproto_unrecognized", + Tag: "varint,64026,opt,name=goproto_unrecognized", + Filename: "gogo.proto", +} + +var E_Protosizer = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64028, + Name: "gogoproto.protosizer", + Tag: "varint,64028,opt,name=protosizer", + Filename: "gogo.proto", +} + +var E_Compare = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64029, + Name: "gogoproto.compare", + Tag: "varint,64029,opt,name=compare", + Filename: "gogo.proto", +} + +var E_Typedecl = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64030, + Name: "gogoproto.typedecl", + Tag: "varint,64030,opt,name=typedecl", + Filename: "gogo.proto", +} + +var E_Messagename = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64033, + Name: "gogoproto.messagename", + Tag: "varint,64033,opt,name=messagename", + Filename: "gogo.proto", +} + +var E_GoprotoSizecache = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64034, + Name: "gogoproto.goproto_sizecache", + Tag: "varint,64034,opt,name=goproto_sizecache", + Filename: "gogo.proto", +} + +var E_GoprotoUnkeyed = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 64035, + Name: "gogoproto.goproto_unkeyed", + Tag: "varint,64035,opt,name=goproto_unkeyed", + Filename: "gogo.proto", +} + +var E_Nullable = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 65001, + Name: "gogoproto.nullable", + Tag: "varint,65001,opt,name=nullable", + Filename: "gogo.proto", +} + +var E_Embed = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 65002, + Name: "gogoproto.embed", + Tag: "varint,65002,opt,name=embed", + Filename: "gogo.proto", +} + +var E_Customtype = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 65003, + Name: "gogoproto.customtype", + Tag: "bytes,65003,opt,name=customtype", + Filename: "gogo.proto", +} + +var E_Customname = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 65004, + Name: "gogoproto.customname", + Tag: "bytes,65004,opt,name=customname", + Filename: "gogo.proto", +} + +var E_Jsontag = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 65005, + Name: "gogoproto.jsontag", + Tag: "bytes,65005,opt,name=jsontag", + Filename: "gogo.proto", +} + +var E_Moretags = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 65006, + Name: "gogoproto.moretags", + Tag: "bytes,65006,opt,name=moretags", + Filename: "gogo.proto", +} + +var E_Casttype = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 65007, + Name: "gogoproto.casttype", + Tag: "bytes,65007,opt,name=casttype", + Filename: "gogo.proto", +} + +var E_Castkey = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 65008, + Name: "gogoproto.castkey", + Tag: "bytes,65008,opt,name=castkey", + Filename: "gogo.proto", +} + +var E_Castvalue = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 65009, + Name: "gogoproto.castvalue", + Tag: "bytes,65009,opt,name=castvalue", + Filename: "gogo.proto", +} + +var E_Stdtime = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 65010, + Name: "gogoproto.stdtime", + Tag: "varint,65010,opt,name=stdtime", + Filename: "gogo.proto", +} + +var E_Stdduration = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 65011, + Name: "gogoproto.stdduration", + Tag: "varint,65011,opt,name=stdduration", + Filename: "gogo.proto", +} + +var E_Wktpointer = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 65012, + Name: "gogoproto.wktpointer", + Tag: "varint,65012,opt,name=wktpointer", + Filename: "gogo.proto", +} + +func init() { + proto.RegisterExtension(E_GoprotoEnumPrefix) + proto.RegisterExtension(E_GoprotoEnumStringer) + proto.RegisterExtension(E_EnumStringer) + proto.RegisterExtension(E_EnumCustomname) + proto.RegisterExtension(E_Enumdecl) + proto.RegisterExtension(E_EnumvalueCustomname) + proto.RegisterExtension(E_GoprotoGettersAll) + proto.RegisterExtension(E_GoprotoEnumPrefixAll) + proto.RegisterExtension(E_GoprotoStringerAll) + proto.RegisterExtension(E_VerboseEqualAll) + proto.RegisterExtension(E_FaceAll) + proto.RegisterExtension(E_GostringAll) + proto.RegisterExtension(E_PopulateAll) + proto.RegisterExtension(E_StringerAll) + proto.RegisterExtension(E_OnlyoneAll) + proto.RegisterExtension(E_EqualAll) + proto.RegisterExtension(E_DescriptionAll) + proto.RegisterExtension(E_TestgenAll) + proto.RegisterExtension(E_BenchgenAll) + proto.RegisterExtension(E_MarshalerAll) + proto.RegisterExtension(E_UnmarshalerAll) + proto.RegisterExtension(E_StableMarshalerAll) + proto.RegisterExtension(E_SizerAll) + proto.RegisterExtension(E_GoprotoEnumStringerAll) + proto.RegisterExtension(E_EnumStringerAll) + proto.RegisterExtension(E_UnsafeMarshalerAll) + proto.RegisterExtension(E_UnsafeUnmarshalerAll) + proto.RegisterExtension(E_GoprotoExtensionsMapAll) + proto.RegisterExtension(E_GoprotoUnrecognizedAll) + proto.RegisterExtension(E_GogoprotoImport) + proto.RegisterExtension(E_ProtosizerAll) + proto.RegisterExtension(E_CompareAll) + proto.RegisterExtension(E_TypedeclAll) + proto.RegisterExtension(E_EnumdeclAll) + proto.RegisterExtension(E_GoprotoRegistration) + proto.RegisterExtension(E_MessagenameAll) + proto.RegisterExtension(E_GoprotoSizecacheAll) + proto.RegisterExtension(E_GoprotoUnkeyedAll) + proto.RegisterExtension(E_GoprotoGetters) + proto.RegisterExtension(E_GoprotoStringer) + proto.RegisterExtension(E_VerboseEqual) + proto.RegisterExtension(E_Face) + proto.RegisterExtension(E_Gostring) + proto.RegisterExtension(E_Populate) + proto.RegisterExtension(E_Stringer) + proto.RegisterExtension(E_Onlyone) + proto.RegisterExtension(E_Equal) + proto.RegisterExtension(E_Description) + proto.RegisterExtension(E_Testgen) + proto.RegisterExtension(E_Benchgen) + proto.RegisterExtension(E_Marshaler) + proto.RegisterExtension(E_Unmarshaler) + proto.RegisterExtension(E_StableMarshaler) + proto.RegisterExtension(E_Sizer) + proto.RegisterExtension(E_UnsafeMarshaler) + proto.RegisterExtension(E_UnsafeUnmarshaler) + proto.RegisterExtension(E_GoprotoExtensionsMap) + proto.RegisterExtension(E_GoprotoUnrecognized) + proto.RegisterExtension(E_Protosizer) + proto.RegisterExtension(E_Compare) + proto.RegisterExtension(E_Typedecl) + proto.RegisterExtension(E_Messagename) + proto.RegisterExtension(E_GoprotoSizecache) + proto.RegisterExtension(E_GoprotoUnkeyed) + proto.RegisterExtension(E_Nullable) + proto.RegisterExtension(E_Embed) + proto.RegisterExtension(E_Customtype) + proto.RegisterExtension(E_Customname) + proto.RegisterExtension(E_Jsontag) + proto.RegisterExtension(E_Moretags) + proto.RegisterExtension(E_Casttype) + proto.RegisterExtension(E_Castkey) + proto.RegisterExtension(E_Castvalue) + proto.RegisterExtension(E_Stdtime) + proto.RegisterExtension(E_Stdduration) + proto.RegisterExtension(E_Wktpointer) +} + +func init() { proto.RegisterFile("gogo.proto", fileDescriptor_592445b5231bc2b9) } + +var fileDescriptor_592445b5231bc2b9 = []byte{ + // 1328 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x98, 0x49, 0x6f, 0x1c, 0x45, + 0x14, 0x80, 0x85, 0x48, 0x64, 0x4f, 0x79, 0x8b, 0xc7, 0xc6, 0x84, 0x08, 0x44, 0xe0, 0xc4, 0xc9, + 0x3e, 0x45, 0x28, 0x65, 0x45, 0x96, 0x63, 0x39, 0x56, 0x10, 0x0e, 0xc6, 0x89, 0xc3, 0x76, 0x18, + 0xf5, 0xf4, 0x94, 0xdb, 0x8d, 0xbb, 0xbb, 0x9a, 0xee, 0xea, 0x10, 0xe7, 0x86, 0xc2, 0x22, 0x84, + 0xd8, 0x91, 0x20, 0x21, 0x09, 0x04, 0xc4, 0xbe, 0x86, 0x7d, 0xb9, 0x70, 0x61, 0xb9, 0xf2, 0x1f, + 0xb8, 0x00, 0x66, 0xf7, 0xcd, 0x17, 0xf4, 0xba, 0xdf, 0xeb, 0xa9, 0x69, 0x8f, 0x54, 0x35, 0xb7, + 0xf6, 0xb8, 0xbe, 0x6f, 0xaa, 0xdf, 0xeb, 0x7a, 0xef, 0x4d, 0x33, 0xe6, 0x49, 0x4f, 0x4e, 0xc6, + 0x89, 0x54, 0xb2, 0x5e, 0x83, 0xeb, 0xfc, 0x72, 0xdf, 0x7e, 0x4f, 0x4a, 0x2f, 0x10, 0x53, 0xf9, + 0x5f, 0xcd, 0x6c, 0x75, 0xaa, 0x25, 0x52, 0x37, 0xf1, 0x63, 0x25, 0x93, 0x62, 0x31, 0x3f, 0xc6, + 0xc6, 0x70, 0x71, 0x43, 0x44, 0x59, 0xd8, 0x88, 0x13, 0xb1, 0xea, 0x9f, 0xae, 0x5f, 0x3f, 0x59, + 0x90, 0x93, 0x44, 0x4e, 0xce, 0x47, 0x59, 0x78, 0x47, 0xac, 0x7c, 0x19, 0xa5, 0x7b, 0xaf, 0xfc, + 0x72, 0xf5, 0xfe, 0xab, 0x6e, 0xe9, 0x5f, 0x1e, 0x45, 0x14, 0xfe, 0xb7, 0x94, 0x83, 0x7c, 0x99, + 0x5d, 0xd3, 0xe1, 0x4b, 0x55, 0xe2, 0x47, 0x9e, 0x48, 0x0c, 0xc6, 0xef, 0xd1, 0x38, 0xa6, 0x19, + 0x8f, 0x23, 0xca, 0xe7, 0xd8, 0x50, 0x2f, 0xae, 0x1f, 0xd0, 0x35, 0x28, 0x74, 0xc9, 0x02, 0x1b, + 0xc9, 0x25, 0x6e, 0x96, 0x2a, 0x19, 0x46, 0x4e, 0x28, 0x0c, 0x9a, 0x1f, 0x73, 0x4d, 0x6d, 0x79, + 0x18, 0xb0, 0xb9, 0x92, 0xe2, 0x9c, 0xf5, 0xc3, 0x27, 0x2d, 0xe1, 0x06, 0x06, 0xc3, 0x4f, 0xb8, + 0x91, 0x72, 0x3d, 0x3f, 0xc9, 0xc6, 0xe1, 0xfa, 0x94, 0x13, 0x64, 0x42, 0xdf, 0xc9, 0x4d, 0x5d, + 0x3d, 0x27, 0x61, 0x19, 0xc9, 0x7e, 0x3e, 0xbb, 0x2b, 0xdf, 0xce, 0x58, 0x29, 0xd0, 0xf6, 0xa4, + 0x65, 0xd1, 0x13, 0x4a, 0x89, 0x24, 0x6d, 0x38, 0x41, 0xb7, 0xed, 0x1d, 0xf1, 0x83, 0xd2, 0x78, + 0x6e, 0xb3, 0x33, 0x8b, 0x0b, 0x05, 0x39, 0x1b, 0x04, 0x7c, 0x85, 0x5d, 0xdb, 0xe5, 0xa9, 0xb0, + 0x70, 0x9e, 0x47, 0xe7, 0xf8, 0x8e, 0x27, 0x03, 0xb4, 0x4b, 0x8c, 0x3e, 0x2f, 0x73, 0x69, 0xe1, + 0x7c, 0x19, 0x9d, 0x75, 0x64, 0x29, 0xa5, 0x60, 0xbc, 0x8d, 0x8d, 0x9e, 0x12, 0x49, 0x53, 0xa6, + 0xa2, 0x21, 0x1e, 0xc8, 0x9c, 0xc0, 0x42, 0x77, 0x01, 0x75, 0x23, 0x08, 0xce, 0x03, 0x07, 0xae, + 0x83, 0xac, 0x7f, 0xd5, 0x71, 0x85, 0x85, 0xe2, 0x22, 0x2a, 0xfa, 0x60, 0x3d, 0xa0, 0xb3, 0x6c, + 0xd0, 0x93, 0xc5, 0x2d, 0x59, 0xe0, 0x97, 0x10, 0x1f, 0x20, 0x06, 0x15, 0xb1, 0x8c, 0xb3, 0xc0, + 0x51, 0x36, 0x3b, 0x78, 0x85, 0x14, 0xc4, 0xa0, 0xa2, 0x87, 0xb0, 0xbe, 0x4a, 0x8a, 0x54, 0x8b, + 0xe7, 0x0c, 0x1b, 0x90, 0x51, 0xb0, 0x21, 0x23, 0x9b, 0x4d, 0x5c, 0x46, 0x03, 0x43, 0x04, 0x04, + 0xd3, 0xac, 0x66, 0x9b, 0x88, 0x37, 0x36, 0xe9, 0x78, 0x50, 0x06, 0x16, 0xd8, 0x08, 0x15, 0x28, + 0x5f, 0x46, 0x16, 0x8a, 0x37, 0x51, 0x31, 0xac, 0x61, 0x78, 0x1b, 0x4a, 0xa4, 0xca, 0x13, 0x36, + 0x92, 0xb7, 0xe8, 0x36, 0x10, 0xc1, 0x50, 0x36, 0x45, 0xe4, 0xae, 0xd9, 0x19, 0xde, 0xa6, 0x50, + 0x12, 0x03, 0x8a, 0x39, 0x36, 0x14, 0x3a, 0x49, 0xba, 0xe6, 0x04, 0x56, 0xe9, 0x78, 0x07, 0x1d, + 0x83, 0x25, 0x84, 0x11, 0xc9, 0xa2, 0x5e, 0x34, 0xef, 0x52, 0x44, 0x34, 0x0c, 0x8f, 0x5e, 0xaa, + 0x9c, 0x66, 0x20, 0x1a, 0xbd, 0xd8, 0xde, 0xa3, 0xa3, 0x57, 0xb0, 0x8b, 0xba, 0x71, 0x9a, 0xd5, + 0x52, 0xff, 0x8c, 0x95, 0xe6, 0x7d, 0xca, 0x74, 0x0e, 0x00, 0x7c, 0x0f, 0xbb, 0xae, 0x6b, 0x9b, + 0xb0, 0x90, 0x7d, 0x80, 0xb2, 0x89, 0x2e, 0xad, 0x02, 0x4b, 0x42, 0xaf, 0xca, 0x0f, 0xa9, 0x24, + 0x88, 0x8a, 0x6b, 0x89, 0x8d, 0x67, 0x51, 0xea, 0xac, 0xf6, 0x16, 0xb5, 0x8f, 0x28, 0x6a, 0x05, + 0xdb, 0x11, 0xb5, 0x13, 0x6c, 0x02, 0x8d, 0xbd, 0xe5, 0xf5, 0x63, 0x2a, 0xac, 0x05, 0xbd, 0xd2, + 0x99, 0xdd, 0xfb, 0xd8, 0xbe, 0x32, 0x9c, 0xa7, 0x95, 0x88, 0x52, 0x60, 0x1a, 0xa1, 0x13, 0x5b, + 0x98, 0xaf, 0xa0, 0x99, 0x2a, 0xfe, 0x7c, 0x29, 0x58, 0x74, 0x62, 0x90, 0xdf, 0xcd, 0xf6, 0x92, + 0x3c, 0x8b, 0x12, 0xe1, 0x4a, 0x2f, 0xf2, 0xcf, 0x88, 0x96, 0x85, 0xfa, 0x93, 0x4a, 0xaa, 0x56, + 0x34, 0x1c, 0xcc, 0x47, 0xd9, 0x9e, 0x72, 0x56, 0x69, 0xf8, 0x61, 0x2c, 0x13, 0x65, 0x30, 0x7e, + 0x4a, 0x99, 0x2a, 0xb9, 0xa3, 0x39, 0xc6, 0xe7, 0xd9, 0x70, 0xfe, 0xa7, 0xed, 0x23, 0xf9, 0x19, + 0x8a, 0x86, 0xda, 0x14, 0x16, 0x0e, 0x57, 0x86, 0xb1, 0x93, 0xd8, 0xd4, 0xbf, 0xcf, 0xa9, 0x70, + 0x20, 0x82, 0x85, 0x43, 0x6d, 0xc4, 0x02, 0xba, 0xbd, 0x85, 0xe1, 0x0b, 0x2a, 0x1c, 0xc4, 0xa0, + 0x82, 0x06, 0x06, 0x0b, 0xc5, 0x97, 0xa4, 0x20, 0x06, 0x14, 0x77, 0xb6, 0x1b, 0x6d, 0x22, 0x3c, + 0x3f, 0x55, 0x89, 0x03, 0xab, 0x0d, 0xaa, 0xaf, 0x36, 0x3b, 0x87, 0xb0, 0x65, 0x0d, 0x85, 0x4a, + 0x14, 0x8a, 0x34, 0x75, 0x3c, 0x01, 0x13, 0x87, 0xc5, 0xc6, 0xbe, 0xa6, 0x4a, 0xa4, 0x61, 0xb0, + 0x37, 0x6d, 0x42, 0x84, 0xb0, 0xbb, 0x8e, 0xbb, 0x66, 0xa3, 0xfb, 0xa6, 0xb2, 0xb9, 0xe3, 0xc4, + 0x82, 0x53, 0x9b, 0x7f, 0xb2, 0x68, 0x5d, 0x6c, 0x58, 0x3d, 0x9d, 0xdf, 0x56, 0xe6, 0x9f, 0x95, + 0x82, 0x2c, 0x6a, 0xc8, 0x48, 0x65, 0x9e, 0xaa, 0xdf, 0xb8, 0xc3, 0xb5, 0x58, 0xdc, 0x17, 0xe9, + 0x1e, 0xda, 0xc2, 0xfb, 0xed, 0x1c, 0xa7, 0xf8, 0xed, 0xf0, 0x90, 0x77, 0x0e, 0x3d, 0x66, 0xd9, + 0xd9, 0xad, 0xf2, 0x39, 0xef, 0x98, 0x79, 0xf8, 0x11, 0x36, 0xd4, 0x31, 0xf0, 0x98, 0x55, 0x0f, + 0xa3, 0x6a, 0x50, 0x9f, 0x77, 0xf8, 0x01, 0xb6, 0x0b, 0x86, 0x17, 0x33, 0xfe, 0x08, 0xe2, 0xf9, + 0x72, 0x7e, 0x88, 0xf5, 0xd3, 0xd0, 0x62, 0x46, 0x1f, 0x45, 0xb4, 0x44, 0x00, 0xa7, 0x81, 0xc5, + 0x8c, 0x3f, 0x46, 0x38, 0x21, 0x80, 0xdb, 0x87, 0xf0, 0xbb, 0x27, 0x76, 0x61, 0xd3, 0xa1, 0xd8, + 0x4d, 0xb3, 0x3e, 0x9c, 0x54, 0xcc, 0xf4, 0xe3, 0xf8, 0xe5, 0x44, 0xf0, 0x5b, 0xd9, 0x6e, 0xcb, + 0x80, 0x3f, 0x89, 0x68, 0xb1, 0x9e, 0xcf, 0xb1, 0x01, 0x6d, 0x3a, 0x31, 0xe3, 0x4f, 0x21, 0xae, + 0x53, 0xb0, 0x75, 0x9c, 0x4e, 0xcc, 0x82, 0xa7, 0x69, 0xeb, 0x48, 0x40, 0xd8, 0x68, 0x30, 0x31, + 0xd3, 0xcf, 0x50, 0xd4, 0x09, 0xe1, 0x33, 0xac, 0x56, 0x36, 0x1b, 0x33, 0xff, 0x2c, 0xf2, 0x6d, + 0x06, 0x22, 0xa0, 0x35, 0x3b, 0xb3, 0xe2, 0x39, 0x8a, 0x80, 0x46, 0xc1, 0x31, 0xaa, 0x0e, 0x30, + 0x66, 0xd3, 0xf3, 0x74, 0x8c, 0x2a, 0xf3, 0x0b, 0x64, 0x33, 0xaf, 0xf9, 0x66, 0xc5, 0x0b, 0x94, + 0xcd, 0x7c, 0x3d, 0x6c, 0xa3, 0x3a, 0x11, 0x98, 0x1d, 0x2f, 0xd2, 0x36, 0x2a, 0x03, 0x01, 0x5f, + 0x62, 0xf5, 0x9d, 0xd3, 0x80, 0xd9, 0xf7, 0x12, 0xfa, 0x46, 0x77, 0x0c, 0x03, 0xfc, 0x2e, 0x36, + 0xd1, 0x7d, 0x12, 0x30, 0x5b, 0xcf, 0x6d, 0x55, 0x7e, 0xbb, 0xe9, 0x83, 0x00, 0x3f, 0xd1, 0x6e, + 0x29, 0xfa, 0x14, 0x60, 0xd6, 0x9e, 0xdf, 0xea, 0x2c, 0xdc, 0xfa, 0x10, 0xc0, 0x67, 0x19, 0x6b, + 0x37, 0x60, 0xb3, 0xeb, 0x02, 0xba, 0x34, 0x08, 0x8e, 0x06, 0xf6, 0x5f, 0x33, 0x7f, 0x91, 0x8e, + 0x06, 0x12, 0x70, 0x34, 0xa8, 0xf5, 0x9a, 0xe9, 0x4b, 0x74, 0x34, 0x08, 0x81, 0x27, 0x5b, 0xeb, + 0x6e, 0x66, 0xc3, 0x65, 0x7a, 0xb2, 0x35, 0x8a, 0x1f, 0x63, 0xa3, 0x3b, 0x1a, 0xa2, 0x59, 0xf5, + 0x1a, 0xaa, 0xf6, 0x54, 0xfb, 0xa1, 0xde, 0xbc, 0xb0, 0x19, 0x9a, 0x6d, 0xaf, 0x57, 0x9a, 0x17, + 0xf6, 0x42, 0x3e, 0xcd, 0xfa, 0xa3, 0x2c, 0x08, 0xe0, 0xf0, 0xd4, 0x6f, 0xe8, 0xd2, 0x4d, 0x45, + 0xd0, 0x22, 0xc5, 0xaf, 0xdb, 0x18, 0x1d, 0x02, 0xf8, 0x01, 0xb6, 0x5b, 0x84, 0x4d, 0xd1, 0x32, + 0x91, 0xbf, 0x6d, 0x53, 0xc1, 0x84, 0xd5, 0x7c, 0x86, 0xb1, 0xe2, 0xd5, 0x08, 0x84, 0xd9, 0xc4, + 0xfe, 0xbe, 0x5d, 0xbc, 0xa5, 0xd1, 0x90, 0xb6, 0x20, 0x4f, 0x8a, 0x41, 0xb0, 0xd9, 0x29, 0xc8, + 0x33, 0x72, 0x90, 0xf5, 0xdd, 0x9f, 0xca, 0x48, 0x39, 0x9e, 0x89, 0xfe, 0x03, 0x69, 0x5a, 0x0f, + 0x01, 0x0b, 0x65, 0x22, 0x94, 0xe3, 0xa5, 0x26, 0xf6, 0x4f, 0x64, 0x4b, 0x00, 0x60, 0xd7, 0x49, + 0x95, 0xcd, 0x7d, 0xff, 0x45, 0x30, 0x01, 0xb0, 0x69, 0xb8, 0x5e, 0x17, 0x1b, 0x26, 0xf6, 0x6f, + 0xda, 0x34, 0xae, 0xe7, 0x87, 0x58, 0x0d, 0x2e, 0xf3, 0xb7, 0x4a, 0x26, 0xf8, 0x1f, 0x84, 0xdb, + 0x04, 0x7c, 0x73, 0xaa, 0x5a, 0xca, 0x37, 0x07, 0xfb, 0x5f, 0xcc, 0x34, 0xad, 0xe7, 0xb3, 0x6c, + 0x20, 0x55, 0xad, 0x56, 0x86, 0xf3, 0xa9, 0x01, 0xff, 0x6f, 0xbb, 0x7c, 0x65, 0x51, 0x32, 0x90, + 0xed, 0x07, 0xd7, 0x55, 0x2c, 0xfd, 0x48, 0x89, 0xc4, 0x64, 0xd8, 0x42, 0x83, 0x86, 0x1c, 0x9e, + 0x67, 0x63, 0xae, 0x0c, 0xab, 0xdc, 0x61, 0xb6, 0x20, 0x17, 0xe4, 0x52, 0x5e, 0x67, 0xee, 0xbd, + 0xd9, 0xf3, 0xd5, 0x5a, 0xd6, 0x9c, 0x74, 0x65, 0x38, 0x05, 0xbf, 0x3c, 0xda, 0x2f, 0x54, 0xcb, + 0xdf, 0x21, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x9c, 0xaf, 0x70, 0x4e, 0x83, 0x15, 0x00, 0x00, +} diff --git a/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.golden b/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.golden new file mode 100644 index 00000000..f6502e4b --- /dev/null +++ b/vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.golden @@ -0,0 +1,45 @@ +// Code generated by protoc-gen-go. +// source: gogo.proto +// DO NOT EDIT! + +package gogoproto + +import proto "github.com/gogo/protobuf/proto" +import json "encoding/json" +import math "math" +import google_protobuf "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" + +// Reference proto, json, and math imports to suppress error if they are not otherwise used. +var _ = proto.Marshal +var _ = &json.SyntaxError{} +var _ = math.Inf + +var E_Nullable = &proto.ExtensionDesc{ + ExtendedType: (*google_protobuf.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 51235, + Name: "gogoproto.nullable", + Tag: "varint,51235,opt,name=nullable", +} + +var E_Embed = &proto.ExtensionDesc{ + ExtendedType: (*google_protobuf.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 51236, + Name: "gogoproto.embed", + Tag: "varint,51236,opt,name=embed", +} + +var E_Customtype = &proto.ExtensionDesc{ + ExtendedType: (*google_protobuf.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 51237, + Name: "gogoproto.customtype", + Tag: "bytes,51237,opt,name=customtype", +} + +func init() { + proto.RegisterExtension(E_Nullable) + proto.RegisterExtension(E_Embed) + proto.RegisterExtension(E_Customtype) +} diff --git a/vendor/github.com/gogo/protobuf/gogoproto/gogo.proto b/vendor/github.com/gogo/protobuf/gogoproto/gogo.proto new file mode 100644 index 00000000..b80c8565 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/gogoproto/gogo.proto @@ -0,0 +1,144 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto2"; +package gogoproto; + +import "google/protobuf/descriptor.proto"; + +option java_package = "com.google.protobuf"; +option java_outer_classname = "GoGoProtos"; +option go_package = "github.com/gogo/protobuf/gogoproto"; + +extend google.protobuf.EnumOptions { + optional bool goproto_enum_prefix = 62001; + optional bool goproto_enum_stringer = 62021; + optional bool enum_stringer = 62022; + optional string enum_customname = 62023; + optional bool enumdecl = 62024; +} + +extend google.protobuf.EnumValueOptions { + optional string enumvalue_customname = 66001; +} + +extend google.protobuf.FileOptions { + optional bool goproto_getters_all = 63001; + optional bool goproto_enum_prefix_all = 63002; + optional bool goproto_stringer_all = 63003; + optional bool verbose_equal_all = 63004; + optional bool face_all = 63005; + optional bool gostring_all = 63006; + optional bool populate_all = 63007; + optional bool stringer_all = 63008; + optional bool onlyone_all = 63009; + + optional bool equal_all = 63013; + optional bool description_all = 63014; + optional bool testgen_all = 63015; + optional bool benchgen_all = 63016; + optional bool marshaler_all = 63017; + optional bool unmarshaler_all = 63018; + optional bool stable_marshaler_all = 63019; + + optional bool sizer_all = 63020; + + optional bool goproto_enum_stringer_all = 63021; + optional bool enum_stringer_all = 63022; + + optional bool unsafe_marshaler_all = 63023; + optional bool unsafe_unmarshaler_all = 63024; + + optional bool goproto_extensions_map_all = 63025; + optional bool goproto_unrecognized_all = 63026; + optional bool gogoproto_import = 63027; + optional bool protosizer_all = 63028; + optional bool compare_all = 63029; + optional bool typedecl_all = 63030; + optional bool enumdecl_all = 63031; + + optional bool goproto_registration = 63032; + optional bool messagename_all = 63033; + + optional bool goproto_sizecache_all = 63034; + optional bool goproto_unkeyed_all = 63035; +} + +extend google.protobuf.MessageOptions { + optional bool goproto_getters = 64001; + optional bool goproto_stringer = 64003; + optional bool verbose_equal = 64004; + optional bool face = 64005; + optional bool gostring = 64006; + optional bool populate = 64007; + optional bool stringer = 67008; + optional bool onlyone = 64009; + + optional bool equal = 64013; + optional bool description = 64014; + optional bool testgen = 64015; + optional bool benchgen = 64016; + optional bool marshaler = 64017; + optional bool unmarshaler = 64018; + optional bool stable_marshaler = 64019; + + optional bool sizer = 64020; + + optional bool unsafe_marshaler = 64023; + optional bool unsafe_unmarshaler = 64024; + + optional bool goproto_extensions_map = 64025; + optional bool goproto_unrecognized = 64026; + + optional bool protosizer = 64028; + optional bool compare = 64029; + + optional bool typedecl = 64030; + + optional bool messagename = 64033; + + optional bool goproto_sizecache = 64034; + optional bool goproto_unkeyed = 64035; +} + +extend google.protobuf.FieldOptions { + optional bool nullable = 65001; + optional bool embed = 65002; + optional string customtype = 65003; + optional string customname = 65004; + optional string jsontag = 65005; + optional string moretags = 65006; + optional string casttype = 65007; + optional string castkey = 65008; + optional string castvalue = 65009; + + optional bool stdtime = 65010; + optional bool stdduration = 65011; + optional bool wktpointer = 65012; + +} diff --git a/vendor/github.com/gogo/protobuf/gogoproto/helper.go b/vendor/github.com/gogo/protobuf/gogoproto/helper.go new file mode 100644 index 00000000..390d4e4b --- /dev/null +++ b/vendor/github.com/gogo/protobuf/gogoproto/helper.go @@ -0,0 +1,415 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package gogoproto + +import google_protobuf "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" +import proto "github.com/gogo/protobuf/proto" + +func IsEmbed(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Embed, false) +} + +func IsNullable(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Nullable, true) +} + +func IsStdTime(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Stdtime, false) +} + +func IsStdDuration(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Stdduration, false) +} + +func IsStdDouble(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.DoubleValue" +} + +func IsStdFloat(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.FloatValue" +} + +func IsStdInt64(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.Int64Value" +} + +func IsStdUInt64(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.UInt64Value" +} + +func IsStdInt32(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.Int32Value" +} + +func IsStdUInt32(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.UInt32Value" +} + +func IsStdBool(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.BoolValue" +} + +func IsStdString(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.StringValue" +} + +func IsStdBytes(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Wktpointer, false) && *field.TypeName == ".google.protobuf.BytesValue" +} + +func IsStdType(field *google_protobuf.FieldDescriptorProto) bool { + return (IsStdTime(field) || IsStdDuration(field) || + IsStdDouble(field) || IsStdFloat(field) || + IsStdInt64(field) || IsStdUInt64(field) || + IsStdInt32(field) || IsStdUInt32(field) || + IsStdBool(field) || + IsStdString(field) || IsStdBytes(field)) +} + +func IsWktPtr(field *google_protobuf.FieldDescriptorProto) bool { + return proto.GetBoolExtension(field.Options, E_Wktpointer, false) +} + +func NeedsNilCheck(proto3 bool, field *google_protobuf.FieldDescriptorProto) bool { + nullable := IsNullable(field) + if field.IsMessage() || IsCustomType(field) { + return nullable + } + if proto3 { + return false + } + return nullable || *field.Type == google_protobuf.FieldDescriptorProto_TYPE_BYTES +} + +func IsCustomType(field *google_protobuf.FieldDescriptorProto) bool { + typ := GetCustomType(field) + if len(typ) > 0 { + return true + } + return false +} + +func IsCastType(field *google_protobuf.FieldDescriptorProto) bool { + typ := GetCastType(field) + if len(typ) > 0 { + return true + } + return false +} + +func IsCastKey(field *google_protobuf.FieldDescriptorProto) bool { + typ := GetCastKey(field) + if len(typ) > 0 { + return true + } + return false +} + +func IsCastValue(field *google_protobuf.FieldDescriptorProto) bool { + typ := GetCastValue(field) + if len(typ) > 0 { + return true + } + return false +} + +func HasEnumDecl(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool { + return proto.GetBoolExtension(enum.Options, E_Enumdecl, proto.GetBoolExtension(file.Options, E_EnumdeclAll, true)) +} + +func HasTypeDecl(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Typedecl, proto.GetBoolExtension(file.Options, E_TypedeclAll, true)) +} + +func GetCustomType(field *google_protobuf.FieldDescriptorProto) string { + if field == nil { + return "" + } + if field.Options != nil { + v, err := proto.GetExtension(field.Options, E_Customtype) + if err == nil && v.(*string) != nil { + return *(v.(*string)) + } + } + return "" +} + +func GetCastType(field *google_protobuf.FieldDescriptorProto) string { + if field == nil { + return "" + } + if field.Options != nil { + v, err := proto.GetExtension(field.Options, E_Casttype) + if err == nil && v.(*string) != nil { + return *(v.(*string)) + } + } + return "" +} + +func GetCastKey(field *google_protobuf.FieldDescriptorProto) string { + if field == nil { + return "" + } + if field.Options != nil { + v, err := proto.GetExtension(field.Options, E_Castkey) + if err == nil && v.(*string) != nil { + return *(v.(*string)) + } + } + return "" +} + +func GetCastValue(field *google_protobuf.FieldDescriptorProto) string { + if field == nil { + return "" + } + if field.Options != nil { + v, err := proto.GetExtension(field.Options, E_Castvalue) + if err == nil && v.(*string) != nil { + return *(v.(*string)) + } + } + return "" +} + +func IsCustomName(field *google_protobuf.FieldDescriptorProto) bool { + name := GetCustomName(field) + if len(name) > 0 { + return true + } + return false +} + +func IsEnumCustomName(field *google_protobuf.EnumDescriptorProto) bool { + name := GetEnumCustomName(field) + if len(name) > 0 { + return true + } + return false +} + +func IsEnumValueCustomName(field *google_protobuf.EnumValueDescriptorProto) bool { + name := GetEnumValueCustomName(field) + if len(name) > 0 { + return true + } + return false +} + +func GetCustomName(field *google_protobuf.FieldDescriptorProto) string { + if field == nil { + return "" + } + if field.Options != nil { + v, err := proto.GetExtension(field.Options, E_Customname) + if err == nil && v.(*string) != nil { + return *(v.(*string)) + } + } + return "" +} + +func GetEnumCustomName(field *google_protobuf.EnumDescriptorProto) string { + if field == nil { + return "" + } + if field.Options != nil { + v, err := proto.GetExtension(field.Options, E_EnumCustomname) + if err == nil && v.(*string) != nil { + return *(v.(*string)) + } + } + return "" +} + +func GetEnumValueCustomName(field *google_protobuf.EnumValueDescriptorProto) string { + if field == nil { + return "" + } + if field.Options != nil { + v, err := proto.GetExtension(field.Options, E_EnumvalueCustomname) + if err == nil && v.(*string) != nil { + return *(v.(*string)) + } + } + return "" +} + +func GetJsonTag(field *google_protobuf.FieldDescriptorProto) *string { + if field == nil { + return nil + } + if field.Options != nil { + v, err := proto.GetExtension(field.Options, E_Jsontag) + if err == nil && v.(*string) != nil { + return (v.(*string)) + } + } + return nil +} + +func GetMoreTags(field *google_protobuf.FieldDescriptorProto) *string { + if field == nil { + return nil + } + if field.Options != nil { + v, err := proto.GetExtension(field.Options, E_Moretags) + if err == nil && v.(*string) != nil { + return (v.(*string)) + } + } + return nil +} + +type EnableFunc func(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool + +func EnabledGoEnumPrefix(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool { + return proto.GetBoolExtension(enum.Options, E_GoprotoEnumPrefix, proto.GetBoolExtension(file.Options, E_GoprotoEnumPrefixAll, true)) +} + +func EnabledGoStringer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_GoprotoStringer, proto.GetBoolExtension(file.Options, E_GoprotoStringerAll, true)) +} + +func HasGoGetters(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_GoprotoGetters, proto.GetBoolExtension(file.Options, E_GoprotoGettersAll, true)) +} + +func IsUnion(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Onlyone, proto.GetBoolExtension(file.Options, E_OnlyoneAll, false)) +} + +func HasGoString(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Gostring, proto.GetBoolExtension(file.Options, E_GostringAll, false)) +} + +func HasEqual(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Equal, proto.GetBoolExtension(file.Options, E_EqualAll, false)) +} + +func HasVerboseEqual(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_VerboseEqual, proto.GetBoolExtension(file.Options, E_VerboseEqualAll, false)) +} + +func IsStringer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Stringer, proto.GetBoolExtension(file.Options, E_StringerAll, false)) +} + +func IsFace(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Face, proto.GetBoolExtension(file.Options, E_FaceAll, false)) +} + +func HasDescription(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Description, proto.GetBoolExtension(file.Options, E_DescriptionAll, false)) +} + +func HasPopulate(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Populate, proto.GetBoolExtension(file.Options, E_PopulateAll, false)) +} + +func HasTestGen(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Testgen, proto.GetBoolExtension(file.Options, E_TestgenAll, false)) +} + +func HasBenchGen(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Benchgen, proto.GetBoolExtension(file.Options, E_BenchgenAll, false)) +} + +func IsMarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Marshaler, proto.GetBoolExtension(file.Options, E_MarshalerAll, false)) +} + +func IsUnmarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Unmarshaler, proto.GetBoolExtension(file.Options, E_UnmarshalerAll, false)) +} + +func IsStableMarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_StableMarshaler, proto.GetBoolExtension(file.Options, E_StableMarshalerAll, false)) +} + +func IsSizer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Sizer, proto.GetBoolExtension(file.Options, E_SizerAll, false)) +} + +func IsProtoSizer(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Protosizer, proto.GetBoolExtension(file.Options, E_ProtosizerAll, false)) +} + +func IsGoEnumStringer(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool { + return proto.GetBoolExtension(enum.Options, E_GoprotoEnumStringer, proto.GetBoolExtension(file.Options, E_GoprotoEnumStringerAll, true)) +} + +func IsEnumStringer(file *google_protobuf.FileDescriptorProto, enum *google_protobuf.EnumDescriptorProto) bool { + return proto.GetBoolExtension(enum.Options, E_EnumStringer, proto.GetBoolExtension(file.Options, E_EnumStringerAll, false)) +} + +func IsUnsafeMarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_UnsafeMarshaler, proto.GetBoolExtension(file.Options, E_UnsafeMarshalerAll, false)) +} + +func IsUnsafeUnmarshaler(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_UnsafeUnmarshaler, proto.GetBoolExtension(file.Options, E_UnsafeUnmarshalerAll, false)) +} + +func HasExtensionsMap(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_GoprotoExtensionsMap, proto.GetBoolExtension(file.Options, E_GoprotoExtensionsMapAll, true)) +} + +func HasUnrecognized(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_GoprotoUnrecognized, proto.GetBoolExtension(file.Options, E_GoprotoUnrecognizedAll, true)) +} + +func IsProto3(file *google_protobuf.FileDescriptorProto) bool { + return file.GetSyntax() == "proto3" +} + +func ImportsGoGoProto(file *google_protobuf.FileDescriptorProto) bool { + return proto.GetBoolExtension(file.Options, E_GogoprotoImport, true) +} + +func HasCompare(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Compare, proto.GetBoolExtension(file.Options, E_CompareAll, false)) +} + +func RegistersGolangProto(file *google_protobuf.FileDescriptorProto) bool { + return proto.GetBoolExtension(file.Options, E_GoprotoRegistration, false) +} + +func HasMessageName(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_Messagename, proto.GetBoolExtension(file.Options, E_MessagenameAll, false)) +} + +func HasSizecache(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_GoprotoSizecache, proto.GetBoolExtension(file.Options, E_GoprotoSizecacheAll, true)) +} + +func HasUnkeyed(file *google_protobuf.FileDescriptorProto, message *google_protobuf.DescriptorProto) bool { + return proto.GetBoolExtension(message.Options, E_GoprotoUnkeyed, proto.GetBoolExtension(file.Options, E_GoprotoUnkeyedAll, true)) +} diff --git a/vendor/github.com/gogo/protobuf/proto/Makefile b/vendor/github.com/gogo/protobuf/proto/Makefile new file mode 100644 index 00000000..00d65f32 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/Makefile @@ -0,0 +1,43 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +install: + go install + +test: install generate-test-pbs + go test + + +generate-test-pbs: + make install + make -C test_proto + make -C proto3_proto + make diff --git a/vendor/github.com/gogo/protobuf/proto/clone.go b/vendor/github.com/gogo/protobuf/proto/clone.go new file mode 100644 index 00000000..a26b046d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/clone.go @@ -0,0 +1,258 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer deep copy and merge. +// TODO: RawMessage. + +package proto + +import ( + "fmt" + "log" + "reflect" + "strings" +) + +// Clone returns a deep copy of a protocol buffer. +func Clone(src Message) Message { + in := reflect.ValueOf(src) + if in.IsNil() { + return src + } + out := reflect.New(in.Type().Elem()) + dst := out.Interface().(Message) + Merge(dst, src) + return dst +} + +// Merger is the interface representing objects that can merge messages of the same type. +type Merger interface { + // Merge merges src into this message. + // Required and optional fields that are set in src will be set to that value in dst. + // Elements of repeated fields will be appended. + // + // Merge may panic if called with a different argument type than the receiver. + Merge(src Message) +} + +// generatedMerger is the custom merge method that generated protos will have. +// We must add this method since a generate Merge method will conflict with +// many existing protos that have a Merge data field already defined. +type generatedMerger interface { + XXX_Merge(src Message) +} + +// Merge merges src into dst. +// Required and optional fields that are set in src will be set to that value in dst. +// Elements of repeated fields will be appended. +// Merge panics if src and dst are not the same type, or if dst is nil. +func Merge(dst, src Message) { + if m, ok := dst.(Merger); ok { + m.Merge(src) + return + } + + in := reflect.ValueOf(src) + out := reflect.ValueOf(dst) + if out.IsNil() { + panic("proto: nil destination") + } + if in.Type() != out.Type() { + panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) + } + if in.IsNil() { + return // Merge from nil src is a noop + } + if m, ok := dst.(generatedMerger); ok { + m.XXX_Merge(src) + return + } + mergeStruct(out.Elem(), in.Elem()) +} + +func mergeStruct(out, in reflect.Value) { + sprop := GetProperties(in.Type()) + for i := 0; i < in.NumField(); i++ { + f := in.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) + } + + if emIn, ok := in.Addr().Interface().(extensionsBytes); ok { + emOut := out.Addr().Interface().(extensionsBytes) + bIn := emIn.GetExtensions() + bOut := emOut.GetExtensions() + *bOut = append(*bOut, *bIn...) + } else if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + uf := in.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return + } + uin := uf.Bytes() + if len(uin) > 0 { + out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) + } +} + +// mergeAny performs a merge between two values of the same type. +// viaPtr indicates whether the values were indirected through a pointer (implying proto2). +// prop is set if this is a struct field (it may be nil). +func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { + if in.Type() == protoMessageType { + if !in.IsNil() { + if out.IsNil() { + out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) + } else { + Merge(out.Interface().(Message), in.Interface().(Message)) + } + } + return + } + switch in.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + if !viaPtr && isProto3Zero(in) { + return + } + out.Set(in) + case reflect.Interface: + // Probably a oneof field; copy non-nil values. + if in.IsNil() { + return + } + // Allocate destination if it is not set, or set to a different type. + // Otherwise we will merge as normal. + if out.IsNil() || out.Elem().Type() != in.Elem().Type() { + out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) + } + mergeAny(out.Elem(), in.Elem(), false, nil) + case reflect.Map: + if in.Len() == 0 { + return + } + if out.IsNil() { + out.Set(reflect.MakeMap(in.Type())) + } + // For maps with value types of *T or []byte we need to deep copy each value. + elemKind := in.Type().Elem().Kind() + for _, key := range in.MapKeys() { + var val reflect.Value + switch elemKind { + case reflect.Ptr: + val = reflect.New(in.Type().Elem().Elem()) + mergeAny(val, in.MapIndex(key), false, nil) + case reflect.Slice: + val = in.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + default: + val = in.MapIndex(key) + } + out.SetMapIndex(key, val) + } + case reflect.Ptr: + if in.IsNil() { + return + } + if out.IsNil() { + out.Set(reflect.New(in.Elem().Type())) + } + mergeAny(out.Elem(), in.Elem(), true, nil) + case reflect.Slice: + if in.IsNil() { + return + } + if in.Type().Elem().Kind() == reflect.Uint8 { + // []byte is a scalar bytes field, not a repeated field. + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value, and should not + // be merged. + if prop != nil && prop.proto3 && in.Len() == 0 { + return + } + + // Make a deep copy. + // Append to []byte{} instead of []byte(nil) so that we never end up + // with a nil result. + out.SetBytes(append([]byte{}, in.Bytes()...)) + return + } + n := in.Len() + if out.IsNil() { + out.Set(reflect.MakeSlice(in.Type(), 0, n)) + } + switch in.Type().Elem().Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + out.Set(reflect.AppendSlice(out, in)) + default: + for i := 0; i < n; i++ { + x := reflect.Indirect(reflect.New(in.Type().Elem())) + mergeAny(x, in.Index(i), false, nil) + out.Set(reflect.Append(out, x)) + } + } + case reflect.Struct: + mergeStruct(out, in) + default: + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to copy %v", in) + } +} + +func mergeExtension(out, in map[int32]Extension) { + for extNum, eIn := range in { + eOut := Extension{desc: eIn.desc} + if eIn.value != nil { + v := reflect.New(reflect.TypeOf(eIn.value)).Elem() + mergeAny(v, reflect.ValueOf(eIn.value), false, nil) + eOut.value = v.Interface() + } + if eIn.enc != nil { + eOut.enc = make([]byte, len(eIn.enc)) + copy(eOut.enc, eIn.enc) + } + + out[extNum] = eOut + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/custom_gogo.go b/vendor/github.com/gogo/protobuf/proto/custom_gogo.go new file mode 100644 index 00000000..24552483 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/custom_gogo.go @@ -0,0 +1,39 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import "reflect" + +type custom interface { + Marshal() ([]byte, error) + Unmarshal(data []byte) error + Size() int +} + +var customType = reflect.TypeOf((*custom)(nil)).Elem() diff --git a/vendor/github.com/gogo/protobuf/proto/decode.go b/vendor/github.com/gogo/protobuf/proto/decode.go new file mode 100644 index 00000000..63b0f08b --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/decode.go @@ -0,0 +1,427 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for decoding protocol buffer data to construct in-memory representations. + */ + +import ( + "errors" + "fmt" + "io" +) + +// errOverflow is returned when an integer is too large to be represented. +var errOverflow = errors.New("proto: integer overflow") + +// ErrInternalBadWireType is returned by generated code when an incorrect +// wire type is encountered. It does not get returned to user code. +var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") + +// DecodeVarint reads a varint-encoded integer from the slice. +// It returns the integer and the number of bytes consumed, or +// zero if there is not enough. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func DecodeVarint(buf []byte) (x uint64, n int) { + for shift := uint(0); shift < 64; shift += 7 { + if n >= len(buf) { + return 0, 0 + } + b := uint64(buf[n]) + n++ + x |= (b & 0x7F) << shift + if (b & 0x80) == 0 { + return x, n + } + } + + // The number is too large to represent in a 64-bit value. + return 0, 0 +} + +func (p *Buffer) decodeVarintSlow() (x uint64, err error) { + i := p.index + l := len(p.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := p.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + p.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + i := p.index + buf := p.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + p.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return p.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x = uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + + return 0, errOverflow + +done: + p.index = i + return x, nil +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := p.index + 8 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-8]) + x |= uint64(p.buf[i-7]) << 8 + x |= uint64(p.buf[i-6]) << 16 + x |= uint64(p.buf[i-5]) << 24 + x |= uint64(p.buf[i-4]) << 32 + x |= uint64(p.buf[i-3]) << 40 + x |= uint64(p.buf[i-2]) << 48 + x |= uint64(p.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := p.index + 4 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-4]) + x |= uint64(p.buf[i-3]) << 8 + x |= uint64(p.buf[i-2]) << 16 + x |= uint64(p.buf[i-1]) << 24 + return +} + +// DecodeZigzag64 reads a zigzag-encoded 64-bit integer +// from the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) DecodeZigzag64() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) + return +} + +// DecodeZigzag32 reads a zigzag-encoded 32-bit integer +// from the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) DecodeZigzag32() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) + return +} + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := p.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := p.index + nb + if end < p.index || end > len(p.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + // todo: check if can get more uses of alloc=false + buf = p.buf[p.index:end] + p.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, p.buf[p.index:]) + p.index += nb + return +} + +// DecodeStringBytes reads an encoded string from the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) DecodeStringBytes() (s string, err error) { + buf, err := p.DecodeRawBytes(false) + if err != nil { + return + } + return string(buf), nil +} + +// Unmarshaler is the interface representing objects that can +// unmarshal themselves. The argument points to data that may be +// overwritten, so implementations should not keep references to the +// buffer. +// Unmarshal implementations should not clear the receiver. +// Any unmarshaled data should be merged into the receiver. +// Callers of Unmarshal that do not want to retain existing data +// should Reset the receiver before calling Unmarshal. +type Unmarshaler interface { + Unmarshal([]byte) error +} + +// newUnmarshaler is the interface representing objects that can +// unmarshal themselves. The semantics are identical to Unmarshaler. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newUnmarshaler interface { + XXX_Unmarshal([]byte) error +} + +// Unmarshal parses the protocol buffer representation in buf and places the +// decoded result in pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// Unmarshal resets pb before starting to unmarshal, so any +// existing data in pb is always removed. Use UnmarshalMerge +// to preserve and append to existing data. +func Unmarshal(buf []byte, pb Message) error { + pb.Reset() + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// UnmarshalMerge parses the protocol buffer representation in buf and +// writes the decoded result to pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// UnmarshalMerge merges into existing data in pb. +// Most code should use Unmarshal instead. +func UnmarshalMerge(buf []byte, pb Message) error { + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// DecodeMessage reads a count-delimited message from the Buffer. +func (p *Buffer) DecodeMessage(pb Message) error { + enc, err := p.DecodeRawBytes(false) + if err != nil { + return err + } + return NewBuffer(enc).Unmarshal(pb) +} + +// DecodeGroup reads a tag-delimited group from the Buffer. +// StartGroup tag is already consumed. This function consumes +// EndGroup tag. +func (p *Buffer) DecodeGroup(pb Message) error { + b := p.buf[p.index:] + x, y := findEndGroup(b) + if x < 0 { + return io.ErrUnexpectedEOF + } + err := Unmarshal(b[:x], pb) + p.index += y + return err +} + +// Unmarshal parses the protocol buffer representation in the +// Buffer and places the decoded result in pb. If the struct +// underlying pb does not match the data in the buffer, the results can be +// unpredictable. +// +// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. +func (p *Buffer) Unmarshal(pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(newUnmarshaler); ok { + err := u.XXX_Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + + // Slow workaround for messages that aren't Unmarshalers. + // This includes some hand-coded .pb.go files and + // bootstrap protos. + // TODO: fix all of those and then add Unmarshal to + // the Message interface. Then: + // The cast above and code below can be deleted. + // The old unmarshaler can be deleted. + // Clients can call Unmarshal directly (can already do that, actually). + var info InternalMessageInfo + err := info.Unmarshal(pb, p.buf[p.index:]) + p.index = len(p.buf) + return err +} diff --git a/vendor/github.com/gogo/protobuf/proto/deprecated.go b/vendor/github.com/gogo/protobuf/proto/deprecated.go new file mode 100644 index 00000000..35b882c0 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/deprecated.go @@ -0,0 +1,63 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import "errors" + +// Deprecated: do not use. +type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 } + +// Deprecated: do not use. +func GetStats() Stats { return Stats{} } + +// Deprecated: do not use. +func MarshalMessageSet(interface{}) ([]byte, error) { + return nil, errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func UnmarshalMessageSet([]byte, interface{}) error { + return errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func MarshalMessageSetJSON(interface{}) ([]byte, error) { + return nil, errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func UnmarshalMessageSetJSON([]byte, interface{}) error { + return errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func RegisterMessageSetType(Message, int32, string) {} diff --git a/vendor/github.com/gogo/protobuf/proto/discard.go b/vendor/github.com/gogo/protobuf/proto/discard.go new file mode 100644 index 00000000..fe1bd7d9 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/discard.go @@ -0,0 +1,350 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2017 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +type generatedDiscarder interface { + XXX_DiscardUnknown() +} + +// DiscardUnknown recursively discards all unknown fields from this message +// and all embedded messages. +// +// When unmarshaling a message with unrecognized fields, the tags and values +// of such fields are preserved in the Message. This allows a later call to +// marshal to be able to produce a message that continues to have those +// unrecognized fields. To avoid this, DiscardUnknown is used to +// explicitly clear the unknown fields after unmarshaling. +// +// For proto2 messages, the unknown fields of message extensions are only +// discarded from messages that have been accessed via GetExtension. +func DiscardUnknown(m Message) { + if m, ok := m.(generatedDiscarder); ok { + m.XXX_DiscardUnknown() + return + } + // TODO: Dynamically populate a InternalMessageInfo for legacy messages, + // but the master branch has no implementation for InternalMessageInfo, + // so it would be more work to replicate that approach. + discardLegacy(m) +} + +// DiscardUnknown recursively discards all unknown fields. +func (a *InternalMessageInfo) DiscardUnknown(m Message) { + di := atomicLoadDiscardInfo(&a.discard) + if di == nil { + di = getDiscardInfo(reflect.TypeOf(m).Elem()) + atomicStoreDiscardInfo(&a.discard, di) + } + di.discard(toPointer(&m)) +} + +type discardInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []discardFieldInfo + unrecognized field +} + +type discardFieldInfo struct { + field field // Offset of field, guaranteed to be valid + discard func(src pointer) +} + +var ( + discardInfoMap = map[reflect.Type]*discardInfo{} + discardInfoLock sync.Mutex +) + +func getDiscardInfo(t reflect.Type) *discardInfo { + discardInfoLock.Lock() + defer discardInfoLock.Unlock() + di := discardInfoMap[t] + if di == nil { + di = &discardInfo{typ: t} + discardInfoMap[t] = di + } + return di +} + +func (di *discardInfo) discard(src pointer) { + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&di.initialized) == 0 { + di.computeDiscardInfo() + } + + for _, fi := range di.fields { + sfp := src.offset(fi.field) + fi.discard(sfp) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { + // Ignore lock since DiscardUnknown is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + DiscardUnknown(m) + } + } + } + + if di.unrecognized.IsValid() { + *src.offset(di.unrecognized).toBytes() = nil + } +} + +func (di *discardInfo) computeDiscardInfo() { + di.lock.Lock() + defer di.lock.Unlock() + if di.initialized != 0 { + return + } + t := di.typ + n := t.NumField() + + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + dfi := discardFieldInfo{field: toField(&f)} + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) + case isSlice: // E.g., []*pb.T + discardInfo := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sps := src.getPointerSlice() + for _, sp := range sps { + if !sp.isNil() { + discardInfo.discard(sp) + } + } + } + default: // E.g., *pb.T + discardInfo := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sp := src.getPointer() + if !sp.isNil() { + discardInfo.discard(sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) + default: // E.g., map[K]V + if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) + dfi.discard = func(src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + DiscardUnknown(val.Interface().(Message)) + } + } + } else { + dfi.discard = func(pointer) {} // Noop + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) + default: // E.g., interface{} + // TODO: Make this faster? + dfi.discard = func(src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + DiscardUnknown(sv.Interface().(Message)) + } + } + } + } + default: + continue + } + di.fields = append(di.fields, dfi) + } + + di.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + di.unrecognized = toField(&f) + } + + atomic.StoreInt32(&di.initialized, 1) +} + +func discardLegacy(m Message) { + v := reflect.ValueOf(m) + if v.Kind() != reflect.Ptr || v.IsNil() { + return + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return + } + t := v.Type() + + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + vf := v.Field(i) + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) + case isSlice: // E.g., []*pb.T + for j := 0; j < vf.Len(); j++ { + discardLegacy(vf.Index(j).Interface().(Message)) + } + default: // E.g., *pb.T + discardLegacy(vf.Interface().(Message)) + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) + default: // E.g., map[K]V + tv := vf.Type().Elem() + if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) + for _, key := range vf.MapKeys() { + val := vf.MapIndex(key) + discardLegacy(val.Interface().(Message)) + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) + default: // E.g., test_proto.isCommunique_Union interface + if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { + vf = vf.Elem() // E.g., *test_proto.Communique_Msg + if !vf.IsNil() { + vf = vf.Elem() // E.g., test_proto.Communique_Msg + vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value + if vf.Kind() == reflect.Ptr { + discardLegacy(vf.Interface().(Message)) + } + } + } + } + } + } + + if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { + if vf.Type() != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + vf.Set(reflect.ValueOf([]byte(nil))) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(m); err == nil { + // Ignore lock since discardLegacy is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + discardLegacy(m) + } + } + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/duration.go b/vendor/github.com/gogo/protobuf/proto/duration.go new file mode 100644 index 00000000..93464c91 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/duration.go @@ -0,0 +1,100 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// This file implements conversions between google.protobuf.Duration +// and time.Duration. + +import ( + "errors" + "fmt" + "time" +) + +const ( + // Range of a Duration in seconds, as specified in + // google/protobuf/duration.proto. This is about 10,000 years in seconds. + maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) + minSeconds = -maxSeconds +) + +// validateDuration determines whether the Duration is valid according to the +// definition in google/protobuf/duration.proto. A valid Duration +// may still be too large to fit into a time.Duration (the range of Duration +// is about 10,000 years, and the range of time.Duration is about 290). +func validateDuration(d *duration) error { + if d == nil { + return errors.New("duration: nil Duration") + } + if d.Seconds < minSeconds || d.Seconds > maxSeconds { + return fmt.Errorf("duration: %#v: seconds out of range", d) + } + if d.Nanos <= -1e9 || d.Nanos >= 1e9 { + return fmt.Errorf("duration: %#v: nanos out of range", d) + } + // Seconds and Nanos must have the same sign, unless d.Nanos is zero. + if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { + return fmt.Errorf("duration: %#v: seconds and nanos have different signs", d) + } + return nil +} + +// DurationFromProto converts a Duration to a time.Duration. DurationFromProto +// returns an error if the Duration is invalid or is too large to be +// represented in a time.Duration. +func durationFromProto(p *duration) (time.Duration, error) { + if err := validateDuration(p); err != nil { + return 0, err + } + d := time.Duration(p.Seconds) * time.Second + if int64(d/time.Second) != p.Seconds { + return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) + } + if p.Nanos != 0 { + d += time.Duration(p.Nanos) + if (d < 0) != (p.Nanos < 0) { + return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) + } + } + return d, nil +} + +// DurationProto converts a time.Duration to a Duration. +func durationProto(d time.Duration) *duration { + nanos := d.Nanoseconds() + secs := nanos / 1e9 + nanos -= secs * 1e9 + return &duration{ + Seconds: secs, + Nanos: int32(nanos), + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/duration_gogo.go b/vendor/github.com/gogo/protobuf/proto/duration_gogo.go new file mode 100644 index 00000000..e748e173 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/duration_gogo.go @@ -0,0 +1,49 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2016, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" + "time" +) + +var durationType = reflect.TypeOf((*time.Duration)(nil)).Elem() + +type duration struct { + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` +} + +func (m *duration) Reset() { *m = duration{} } +func (*duration) ProtoMessage() {} +func (*duration) String() string { return "duration" } + +func init() { + RegisterType((*duration)(nil), "gogo.protobuf.proto.duration") +} diff --git a/vendor/github.com/gogo/protobuf/proto/encode.go b/vendor/github.com/gogo/protobuf/proto/encode.go new file mode 100644 index 00000000..9581ccd3 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/encode.go @@ -0,0 +1,205 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "errors" + "reflect" +) + +var ( + // errRepeatedHasNil is the error returned if Marshal is called with + // a struct with a repeated field containing a nil element. + errRepeatedHasNil = errors.New("proto: repeated field has nil element") + + // errOneofHasNil is the error returned if Marshal is called with + // a struct with a oneof field containing a nil element. + errOneofHasNil = errors.New("proto: oneof field has nil value") + + // ErrNil is the error returned if Marshal is called with nil. + ErrNil = errors.New("proto: Marshal called with nil") + + // ErrTooLarge is the error returned if Marshal is called with a + // message that encodes to >2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") +) + +// The fundamental encoders that put bytes on the wire. +// Those that take integer types all accept uint64 and are +// therefore of type valueEncoder. + +const maxVarintBytes = 10 // maximum length of a varint + +// EncodeVarint returns the varint encoding of x. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +// Not used by the package itself, but helpful to clients +// wishing to use the same encoding. +func EncodeVarint(x uint64) []byte { + var buf [maxVarintBytes]byte + var n int + for n = 0; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return buf[0:n] +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + p.buf = append(p.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + p.buf = append(p.buf, uint8(x)) + return nil +} + +// SizeVarint returns the varint encoding size of an integer. +func SizeVarint(x uint64) int { + switch { + case x < 1<<7: + return 1 + case x < 1<<14: + return 2 + case x < 1<<21: + return 3 + case x < 1<<28: + return 4 + case x < 1<<35: + return 5 + case x < 1<<42: + return 6 + case x < 1<<49: + return 7 + case x < 1<<56: + return 8 + case x < 1<<63: + return 9 + } + return 10 +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) EncodeFixed64(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) EncodeFixed32(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +// EncodeZigzag64 writes a zigzag-encoded 64-bit integer +// to the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) EncodeZigzag64(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + +// EncodeZigzag32 writes a zigzag-encoded 32-bit integer +// to the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) EncodeZigzag32(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) EncodeRawBytes(b []byte) error { + p.EncodeVarint(uint64(len(b))) + p.buf = append(p.buf, b...) + return nil +} + +// EncodeStringBytes writes an encoded string to the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) EncodeStringBytes(s string) error { + p.EncodeVarint(uint64(len(s))) + p.buf = append(p.buf, s...) + return nil +} + +// Marshaler is the interface representing objects that can marshal themselves. +type Marshaler interface { + Marshal() ([]byte, error) +} + +// EncodeMessage writes the protocol buffer to the Buffer, +// prefixed by a varint-encoded length. +func (p *Buffer) EncodeMessage(pb Message) error { + siz := Size(pb) + sizVar := SizeVarint(uint64(siz)) + p.grow(siz + sizVar) + p.EncodeVarint(uint64(siz)) + return p.Marshal(pb) +} + +// All protocol buffer fields are nillable, but be careful. +func isNil(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + return false +} diff --git a/vendor/github.com/gogo/protobuf/proto/encode_gogo.go b/vendor/github.com/gogo/protobuf/proto/encode_gogo.go new file mode 100644 index 00000000..0f5fb173 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/encode_gogo.go @@ -0,0 +1,33 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +func NewRequiredNotSetError(field string) *RequiredNotSetError { + return &RequiredNotSetError{field} +} diff --git a/vendor/github.com/gogo/protobuf/proto/equal.go b/vendor/github.com/gogo/protobuf/proto/equal.go new file mode 100644 index 00000000..d4db5a1c --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/equal.go @@ -0,0 +1,300 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer comparison. + +package proto + +import ( + "bytes" + "log" + "reflect" + "strings" +) + +/* +Equal returns true iff protocol buffers a and b are equal. +The arguments must both be pointers to protocol buffer structs. + +Equality is defined in this way: + - Two messages are equal iff they are the same type, + corresponding fields are equal, unknown field sets + are equal, and extensions sets are equal. + - Two set scalar fields are equal iff their values are equal. + If the fields are of a floating-point type, remember that + NaN != x for all x, including NaN. If the message is defined + in a proto3 .proto file, fields are not "set"; specifically, + zero length proto3 "bytes" fields are equal (nil == {}). + - Two repeated fields are equal iff their lengths are the same, + and their corresponding elements are equal. Note a "bytes" field, + although represented by []byte, is not a repeated field and the + rule for the scalar fields described above applies. + - Two unset fields are equal. + - Two unknown field sets are equal if their current + encoded state is equal. + - Two extension sets are equal iff they have corresponding + elements that are pairwise equal. + - Two map fields are equal iff their lengths are the same, + and they contain the same set of elements. Zero-length map + fields are equal. + - Every other combination of things are not equal. + +The return value is undefined if a and b are not protocol buffers. +*/ +func Equal(a, b Message) bool { + if a == nil || b == nil { + return a == b + } + v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) + if v1.Type() != v2.Type() { + return false + } + if v1.Kind() == reflect.Ptr { + if v1.IsNil() { + return v2.IsNil() + } + if v2.IsNil() { + return false + } + v1, v2 = v1.Elem(), v2.Elem() + } + if v1.Kind() != reflect.Struct { + return false + } + return equalStruct(v1, v2) +} + +// v1 and v2 are known to have the same type. +func equalStruct(v1, v2 reflect.Value) bool { + sprop := GetProperties(v1.Type()) + for i := 0; i < v1.NumField(); i++ { + f := v1.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + f1, f2 := v1.Field(i), v2.Field(i) + if f.Type.Kind() == reflect.Ptr { + if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { + // both unset + continue + } else if n1 != n2 { + // set/unset mismatch + return false + } + f1, f2 = f1.Elem(), f2.Elem() + } + if !equalAny(f1, f2, sprop.Prop[i]) { + return false + } + } + + if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_InternalExtensions") + if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { + return false + } + } + + if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_extensions") + if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { + return false + } + } + + uf := v1.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return true + } + + u1 := uf.Bytes() + u2 := v2.FieldByName("XXX_unrecognized").Bytes() + return bytes.Equal(u1, u2) +} + +// v1 and v2 are known to have the same type. +// prop may be nil. +func equalAny(v1, v2 reflect.Value, prop *Properties) bool { + if v1.Type() == protoMessageType { + m1, _ := v1.Interface().(Message) + m2, _ := v2.Interface().(Message) + return Equal(m1, m2) + } + switch v1.Kind() { + case reflect.Bool: + return v1.Bool() == v2.Bool() + case reflect.Float32, reflect.Float64: + return v1.Float() == v2.Float() + case reflect.Int32, reflect.Int64: + return v1.Int() == v2.Int() + case reflect.Interface: + // Probably a oneof field; compare the inner values. + n1, n2 := v1.IsNil(), v2.IsNil() + if n1 || n2 { + return n1 == n2 + } + e1, e2 := v1.Elem(), v2.Elem() + if e1.Type() != e2.Type() { + return false + } + return equalAny(e1, e2, nil) + case reflect.Map: + if v1.Len() != v2.Len() { + return false + } + for _, key := range v1.MapKeys() { + val2 := v2.MapIndex(key) + if !val2.IsValid() { + // This key was not found in the second map. + return false + } + if !equalAny(v1.MapIndex(key), val2, nil) { + return false + } + } + return true + case reflect.Ptr: + // Maps may have nil values in them, so check for nil. + if v1.IsNil() && v2.IsNil() { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return equalAny(v1.Elem(), v2.Elem(), prop) + case reflect.Slice: + if v1.Type().Elem().Kind() == reflect.Uint8 { + // short circuit: []byte + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value. + if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) + } + + if v1.Len() != v2.Len() { + return false + } + for i := 0; i < v1.Len(); i++ { + if !equalAny(v1.Index(i), v2.Index(i), prop) { + return false + } + } + return true + case reflect.String: + return v1.Interface().(string) == v2.Interface().(string) + case reflect.Struct: + return equalStruct(v1, v2) + case reflect.Uint32, reflect.Uint64: + return v1.Uint() == v2.Uint() + } + + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to compare %v", v1) + return false +} + +// base is the struct type that the extensions are based on. +// x1 and x2 are InternalExtensions. +func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { + em1, _ := x1.extensionsRead() + em2, _ := x2.extensionsRead() + return equalExtMap(base, em1, em2) +} + +func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { + if len(em1) != len(em2) { + return false + } + + for extNum, e1 := range em1 { + e2, ok := em2[extNum] + if !ok { + return false + } + + m1, m2 := e1.value, e2.value + + if m1 == nil && m2 == nil { + // Both have only encoded form. + if bytes.Equal(e1.enc, e2.enc) { + continue + } + // The bytes are different, but the extensions might still be + // equal. We need to decode them to compare. + } + + if m1 != nil && m2 != nil { + // Both are unencoded. + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + continue + } + + // At least one is encoded. To do a semantically correct comparison + // we need to unmarshal them first. + var desc *ExtensionDesc + if m := extensionMaps[base]; m != nil { + desc = m[extNum] + } + if desc == nil { + // If both have only encoded form and the bytes are the same, + // it is handled above. We get here when the bytes are different. + // We don't know how to decode it, so just compare them as byte + // slices. + log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) + return false + } + var err error + if m1 == nil { + m1, err = decodeExtension(e1.enc, desc) + } + if m2 == nil && err == nil { + m2, err = decodeExtension(e2.enc, desc) + } + if err != nil { + // The encoded form is invalid. + log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) + return false + } + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + } + + return true +} diff --git a/vendor/github.com/gogo/protobuf/proto/extensions.go b/vendor/github.com/gogo/protobuf/proto/extensions.go new file mode 100644 index 00000000..341c6f57 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/extensions.go @@ -0,0 +1,605 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Types and routines for supporting protocol buffer extensions. + */ + +import ( + "errors" + "fmt" + "io" + "reflect" + "strconv" + "sync" +) + +// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. +var ErrMissingExtension = errors.New("proto: missing extension") + +// ExtensionRange represents a range of message extensions for a protocol buffer. +// Used in code generated by the protocol compiler. +type ExtensionRange struct { + Start, End int32 // both inclusive +} + +// extendableProto is an interface implemented by any protocol buffer generated by the current +// proto compiler that may be extended. +type extendableProto interface { + Message + ExtensionRangeArray() []ExtensionRange + extensionsWrite() map[int32]Extension + extensionsRead() (map[int32]Extension, sync.Locker) +} + +// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous +// version of the proto compiler that may be extended. +type extendableProtoV1 interface { + Message + ExtensionRangeArray() []ExtensionRange + ExtensionMap() map[int32]Extension +} + +// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. +type extensionAdapter struct { + extendableProtoV1 +} + +func (e extensionAdapter) extensionsWrite() map[int32]Extension { + return e.ExtensionMap() +} + +func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + return e.ExtensionMap(), notLocker{} +} + +// notLocker is a sync.Locker whose Lock and Unlock methods are nops. +type notLocker struct{} + +func (n notLocker) Lock() {} +func (n notLocker) Unlock() {} + +// extendable returns the extendableProto interface for the given generated proto message. +// If the proto message has the old extension format, it returns a wrapper that implements +// the extendableProto interface. +func extendable(p interface{}) (extendableProto, error) { + switch p := p.(type) { + case extendableProto: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return p, nil + case extendableProtoV1: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return extensionAdapter{p}, nil + case extensionsBytes: + return slowExtensionAdapter{p}, nil + } + // Don't allocate a specific error containing %T: + // this is the hot path for Clone and MarshalText. + return nil, errNotExtendable +} + +var errNotExtendable = errors.New("proto: not an extendable proto.Message") + +func isNilPtr(x interface{}) bool { + v := reflect.ValueOf(x) + return v.Kind() == reflect.Ptr && v.IsNil() +} + +// XXX_InternalExtensions is an internal representation of proto extensions. +// +// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, +// thus gaining the unexported 'extensions' method, which can be called only from the proto package. +// +// The methods of XXX_InternalExtensions are not concurrency safe in general, +// but calls to logically read-only methods such as has and get may be executed concurrently. +type XXX_InternalExtensions struct { + // The struct must be indirect so that if a user inadvertently copies a + // generated message and its embedded XXX_InternalExtensions, they + // avoid the mayhem of a copied mutex. + // + // The mutex serializes all logically read-only operations to p.extensionMap. + // It is up to the client to ensure that write operations to p.extensionMap are + // mutually exclusive with other accesses. + p *struct { + mu sync.Mutex + extensionMap map[int32]Extension + } +} + +// extensionsWrite returns the extension map, creating it on first use. +func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { + if e.p == nil { + e.p = new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }) + e.p.extensionMap = make(map[int32]Extension) + } + return e.p.extensionMap +} + +// extensionsRead returns the extensions map for read-only use. It may be nil. +// The caller must hold the returned mutex's lock when accessing Elements within the map. +func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { + if e.p == nil { + return nil, nil + } + return e.p.extensionMap, &e.p.mu +} + +// ExtensionDesc represents an extension specification. +// Used in generated code from the protocol compiler. +type ExtensionDesc struct { + ExtendedType Message // nil pointer to the type that is being extended + ExtensionType interface{} // nil pointer to the extension type + Field int32 // field number + Name string // fully-qualified name of extension, for text formatting + Tag string // protobuf tag style + Filename string // name of the file in which the extension is defined +} + +func (ed *ExtensionDesc) repeated() bool { + t := reflect.TypeOf(ed.ExtensionType) + return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 +} + +// Extension represents an extension in a message. +type Extension struct { + // When an extension is stored in a message using SetExtension + // only desc and value are set. When the message is marshaled + // enc will be set to the encoded form of the message. + // + // When a message is unmarshaled and contains extensions, each + // extension will have only enc set. When such an extension is + // accessed using GetExtension (or GetExtensions) desc and value + // will be set. + desc *ExtensionDesc + value interface{} + enc []byte +} + +// SetRawExtension is for testing only. +func SetRawExtension(base Message, id int32, b []byte) { + if ebase, ok := base.(extensionsBytes); ok { + clearExtension(base, id) + ext := ebase.GetExtensions() + *ext = append(*ext, b...) + return + } + epb, err := extendable(base) + if err != nil { + return + } + extmap := epb.extensionsWrite() + extmap[id] = Extension{enc: b} +} + +// isExtensionField returns true iff the given field number is in an extension range. +func isExtensionField(pb extendableProto, field int32) bool { + for _, er := range pb.ExtensionRangeArray() { + if er.Start <= field && field <= er.End { + return true + } + } + return false +} + +// checkExtensionTypes checks that the given extension is valid for pb. +func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { + var pbi interface{} = pb + // Check the extended type. + if ea, ok := pbi.(extensionAdapter); ok { + pbi = ea.extendableProtoV1 + } + if ea, ok := pbi.(slowExtensionAdapter); ok { + pbi = ea.extensionsBytes + } + if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { + return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) + } + // Check the range. + if !isExtensionField(pb, extension.Field) { + return errors.New("proto: bad extension number; not in declared ranges") + } + return nil +} + +// extPropKey is sufficient to uniquely identify an extension. +type extPropKey struct { + base reflect.Type + field int32 +} + +var extProp = struct { + sync.RWMutex + m map[extPropKey]*Properties +}{ + m: make(map[extPropKey]*Properties), +} + +func extensionProperties(ed *ExtensionDesc) *Properties { + key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} + + extProp.RLock() + if prop, ok := extProp.m[key]; ok { + extProp.RUnlock() + return prop + } + extProp.RUnlock() + + extProp.Lock() + defer extProp.Unlock() + // Check again. + if prop, ok := extProp.m[key]; ok { + return prop + } + + prop := new(Properties) + prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) + extProp.m[key] = prop + return prop +} + +// HasExtension returns whether the given extension is present in pb. +func HasExtension(pb Message, extension *ExtensionDesc) bool { + if epb, doki := pb.(extensionsBytes); doki { + ext := epb.GetExtensions() + buf := *ext + o := 0 + for o < len(buf) { + tag, n := DecodeVarint(buf[o:]) + fieldNum := int32(tag >> 3) + if int32(fieldNum) == extension.Field { + return true + } + wireType := int(tag & 0x7) + o += n + l, err := size(buf[o:], wireType) + if err != nil { + return false + } + o += l + } + return false + } + // TODO: Check types, field numbers, etc.? + epb, err := extendable(pb) + if err != nil { + return false + } + extmap, mu := epb.extensionsRead() + if extmap == nil { + return false + } + mu.Lock() + _, ok := extmap[extension.Field] + mu.Unlock() + return ok +} + +// ClearExtension removes the given extension from pb. +func ClearExtension(pb Message, extension *ExtensionDesc) { + clearExtension(pb, extension.Field) +} + +func clearExtension(pb Message, fieldNum int32) { + if epb, ok := pb.(extensionsBytes); ok { + offset := 0 + for offset != -1 { + offset = deleteExtension(epb, fieldNum, offset) + } + return + } + epb, err := extendable(pb) + if err != nil { + return + } + // TODO: Check types, field numbers, etc.? + extmap := epb.extensionsWrite() + delete(extmap, fieldNum) +} + +// GetExtension retrieves a proto2 extended field from pb. +// +// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), +// then GetExtension parses the encoded field and returns a Go value of the specified type. +// If the field is not present, then the default value is returned (if one is specified), +// otherwise ErrMissingExtension is reported. +// +// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), +// then GetExtension returns the raw encoded bytes of the field extension. +func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { + if epb, doki := pb.(extensionsBytes); doki { + ext := epb.GetExtensions() + return decodeExtensionFromBytes(extension, *ext) + } + + epb, err := extendable(pb) + if err != nil { + return nil, err + } + + if extension.ExtendedType != nil { + // can only check type if this is a complete descriptor + if cerr := checkExtensionTypes(epb, extension); cerr != nil { + return nil, cerr + } + } + + emap, mu := epb.extensionsRead() + if emap == nil { + return defaultExtensionValue(extension) + } + mu.Lock() + defer mu.Unlock() + e, ok := emap[extension.Field] + if !ok { + // defaultExtensionValue returns the default value or + // ErrMissingExtension if there is no default. + return defaultExtensionValue(extension) + } + + if e.value != nil { + // Already decoded. Check the descriptor, though. + if e.desc != extension { + // This shouldn't happen. If it does, it means that + // GetExtension was called twice with two different + // descriptors with the same field number. + return nil, errors.New("proto: descriptor conflict") + } + return e.value, nil + } + + if extension.ExtensionType == nil { + // incomplete descriptor + return e.enc, nil + } + + v, err := decodeExtension(e.enc, extension) + if err != nil { + return nil, err + } + + // Remember the decoded version and drop the encoded version. + // That way it is safe to mutate what we return. + e.value = v + e.desc = extension + e.enc = nil + emap[extension.Field] = e + return e.value, nil +} + +// defaultExtensionValue returns the default value for extension. +// If no default for an extension is defined ErrMissingExtension is returned. +func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { + if extension.ExtensionType == nil { + // incomplete descriptor, so no default + return nil, ErrMissingExtension + } + + t := reflect.TypeOf(extension.ExtensionType) + props := extensionProperties(extension) + + sf, _, err := fieldDefault(t, props) + if err != nil { + return nil, err + } + + if sf == nil || sf.value == nil { + // There is no default value. + return nil, ErrMissingExtension + } + + if t.Kind() != reflect.Ptr { + // We do not need to return a Ptr, we can directly return sf.value. + return sf.value, nil + } + + // We need to return an interface{} that is a pointer to sf.value. + value := reflect.New(t).Elem() + value.Set(reflect.New(value.Type().Elem())) + if sf.kind == reflect.Int32 { + // We may have an int32 or an enum, but the underlying data is int32. + // Since we can't set an int32 into a non int32 reflect.value directly + // set it as a int32. + value.Elem().SetInt(int64(sf.value.(int32))) + } else { + value.Elem().Set(reflect.ValueOf(sf.value)) + } + return value.Interface(), nil +} + +// decodeExtension decodes an extension encoded in b. +func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { + t := reflect.TypeOf(extension.ExtensionType) + unmarshal := typeUnmarshaler(t, extension.Tag) + + // t is a pointer to a struct, pointer to basic type or a slice. + // Allocate space to store the pointer/slice. + value := reflect.New(t).Elem() + + var err error + for { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + wire := int(x) & 7 + + b, err = unmarshal(b, valToPointer(value.Addr()), wire) + if err != nil { + return nil, err + } + + if len(b) == 0 { + break + } + } + return value.Interface(), nil +} + +// GetExtensions returns a slice of the extensions present in pb that are also listed in es. +// The returned slice has the same length as es; missing extensions will appear as nil elements. +func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + extensions = make([]interface{}, len(es)) + for i, e := range es { + extensions[i], err = GetExtension(epb, e) + if err == ErrMissingExtension { + err = nil + } + if err != nil { + return + } + } + return +} + +// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. +// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing +// just the Field field, which defines the extension's field number. +func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + registeredExtensions := RegisteredExtensions(pb) + + emap, mu := epb.extensionsRead() + if emap == nil { + return nil, nil + } + mu.Lock() + defer mu.Unlock() + extensions := make([]*ExtensionDesc, 0, len(emap)) + for extid, e := range emap { + desc := e.desc + if desc == nil { + desc = registeredExtensions[extid] + if desc == nil { + desc = &ExtensionDesc{Field: extid} + } + } + + extensions = append(extensions, desc) + } + return extensions, nil +} + +// SetExtension sets the specified extension of pb to the specified value. +func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { + if epb, ok := pb.(extensionsBytes); ok { + ClearExtension(pb, extension) + newb, err := encodeExtension(extension, value) + if err != nil { + return err + } + bb := epb.GetExtensions() + *bb = append(*bb, newb...) + return nil + } + epb, err := extendable(pb) + if err != nil { + return err + } + if err := checkExtensionTypes(epb, extension); err != nil { + return err + } + typ := reflect.TypeOf(extension.ExtensionType) + if typ != reflect.TypeOf(value) { + return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", value, extension.ExtensionType) + } + // nil extension values need to be caught early, because the + // encoder can't distinguish an ErrNil due to a nil extension + // from an ErrNil due to a missing field. Extensions are + // always optional, so the encoder would just swallow the error + // and drop all the extensions from the encoded message. + if reflect.ValueOf(value).IsNil() { + return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) + } + + extmap := epb.extensionsWrite() + extmap[extension.Field] = Extension{desc: extension, value: value} + return nil +} + +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + if epb, doki := pb.(extensionsBytes); doki { + ext := epb.GetExtensions() + *ext = []byte{} + return + } + epb, err := extendable(pb) + if err != nil { + return + } + m := epb.extensionsWrite() + for k := range m { + delete(m, k) + } +} + +// A global registry of extensions. +// The generated code will register the generated descriptors by calling RegisterExtension. + +var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) + +// RegisterExtension is called from the generated code. +func RegisterExtension(desc *ExtensionDesc) { + st := reflect.TypeOf(desc.ExtendedType).Elem() + m := extensionMaps[st] + if m == nil { + m = make(map[int32]*ExtensionDesc) + extensionMaps[st] = m + } + if _, ok := m[desc.Field]; ok { + panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) + } + m[desc.Field] = desc +} + +// RegisteredExtensions returns a map of the registered extensions of a +// protocol buffer struct, indexed by the extension number. +// The argument pb should be a nil pointer to the struct type. +func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { + return extensionMaps[reflect.TypeOf(pb).Elem()] +} diff --git a/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go b/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go new file mode 100644 index 00000000..6f1ae120 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go @@ -0,0 +1,389 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "bytes" + "errors" + "fmt" + "io" + "reflect" + "sort" + "strings" + "sync" +) + +type extensionsBytes interface { + Message + ExtensionRangeArray() []ExtensionRange + GetExtensions() *[]byte +} + +type slowExtensionAdapter struct { + extensionsBytes +} + +func (s slowExtensionAdapter) extensionsWrite() map[int32]Extension { + panic("Please report a bug to github.com/gogo/protobuf if you see this message: Writing extensions is not supported for extensions stored in a byte slice field.") +} + +func (s slowExtensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + b := s.GetExtensions() + m, err := BytesToExtensionsMap(*b) + if err != nil { + panic(err) + } + return m, notLocker{} +} + +func GetBoolExtension(pb Message, extension *ExtensionDesc, ifnotset bool) bool { + if reflect.ValueOf(pb).IsNil() { + return ifnotset + } + value, err := GetExtension(pb, extension) + if err != nil { + return ifnotset + } + if value == nil { + return ifnotset + } + if value.(*bool) == nil { + return ifnotset + } + return *(value.(*bool)) +} + +func (this *Extension) Equal(that *Extension) bool { + if err := this.Encode(); err != nil { + return false + } + if err := that.Encode(); err != nil { + return false + } + return bytes.Equal(this.enc, that.enc) +} + +func (this *Extension) Compare(that *Extension) int { + if err := this.Encode(); err != nil { + return 1 + } + if err := that.Encode(); err != nil { + return -1 + } + return bytes.Compare(this.enc, that.enc) +} + +func SizeOfInternalExtension(m extendableProto) (n int) { + info := getMarshalInfo(reflect.TypeOf(m)) + return info.sizeV1Extensions(m.extensionsWrite()) +} + +type sortableMapElem struct { + field int32 + ext Extension +} + +func newSortableExtensionsFromMap(m map[int32]Extension) sortableExtensions { + s := make(sortableExtensions, 0, len(m)) + for k, v := range m { + s = append(s, &sortableMapElem{field: k, ext: v}) + } + return s +} + +type sortableExtensions []*sortableMapElem + +func (this sortableExtensions) Len() int { return len(this) } + +func (this sortableExtensions) Swap(i, j int) { this[i], this[j] = this[j], this[i] } + +func (this sortableExtensions) Less(i, j int) bool { return this[i].field < this[j].field } + +func (this sortableExtensions) String() string { + sort.Sort(this) + ss := make([]string, len(this)) + for i := range this { + ss[i] = fmt.Sprintf("%d: %v", this[i].field, this[i].ext) + } + return "map[" + strings.Join(ss, ",") + "]" +} + +func StringFromInternalExtension(m extendableProto) string { + return StringFromExtensionsMap(m.extensionsWrite()) +} + +func StringFromExtensionsMap(m map[int32]Extension) string { + return newSortableExtensionsFromMap(m).String() +} + +func StringFromExtensionsBytes(ext []byte) string { + m, err := BytesToExtensionsMap(ext) + if err != nil { + panic(err) + } + return StringFromExtensionsMap(m) +} + +func EncodeInternalExtension(m extendableProto, data []byte) (n int, err error) { + return EncodeExtensionMap(m.extensionsWrite(), data) +} + +func EncodeInternalExtensionBackwards(m extendableProto, data []byte) (n int, err error) { + return EncodeExtensionMapBackwards(m.extensionsWrite(), data) +} + +func EncodeExtensionMap(m map[int32]Extension, data []byte) (n int, err error) { + o := 0 + for _, e := range m { + if err := e.Encode(); err != nil { + return 0, err + } + n := copy(data[o:], e.enc) + if n != len(e.enc) { + return 0, io.ErrShortBuffer + } + o += n + } + return o, nil +} + +func EncodeExtensionMapBackwards(m map[int32]Extension, data []byte) (n int, err error) { + o := 0 + end := len(data) + for _, e := range m { + if err := e.Encode(); err != nil { + return 0, err + } + n := copy(data[end-len(e.enc):], e.enc) + if n != len(e.enc) { + return 0, io.ErrShortBuffer + } + end -= n + o += n + } + return o, nil +} + +func GetRawExtension(m map[int32]Extension, id int32) ([]byte, error) { + e := m[id] + if err := e.Encode(); err != nil { + return nil, err + } + return e.enc, nil +} + +func size(buf []byte, wire int) (int, error) { + switch wire { + case WireVarint: + _, n := DecodeVarint(buf) + return n, nil + case WireFixed64: + return 8, nil + case WireBytes: + v, n := DecodeVarint(buf) + return int(v) + n, nil + case WireFixed32: + return 4, nil + case WireStartGroup: + offset := 0 + for { + u, n := DecodeVarint(buf[offset:]) + fwire := int(u & 0x7) + offset += n + if fwire == WireEndGroup { + return offset, nil + } + s, err := size(buf[offset:], wire) + if err != nil { + return 0, err + } + offset += s + } + } + return 0, fmt.Errorf("proto: can't get size for unknown wire type %d", wire) +} + +func BytesToExtensionsMap(buf []byte) (map[int32]Extension, error) { + m := make(map[int32]Extension) + i := 0 + for i < len(buf) { + tag, n := DecodeVarint(buf[i:]) + if n <= 0 { + return nil, fmt.Errorf("unable to decode varint") + } + fieldNum := int32(tag >> 3) + wireType := int(tag & 0x7) + l, err := size(buf[i+n:], wireType) + if err != nil { + return nil, err + } + end := i + int(l) + n + m[int32(fieldNum)] = Extension{enc: buf[i:end]} + i = end + } + return m, nil +} + +func NewExtension(e []byte) Extension { + ee := Extension{enc: make([]byte, len(e))} + copy(ee.enc, e) + return ee +} + +func AppendExtension(e Message, tag int32, buf []byte) { + if ee, eok := e.(extensionsBytes); eok { + ext := ee.GetExtensions() + *ext = append(*ext, buf...) + return + } + if ee, eok := e.(extendableProto); eok { + m := ee.extensionsWrite() + ext := m[int32(tag)] // may be missing + ext.enc = append(ext.enc, buf...) + m[int32(tag)] = ext + } +} + +func encodeExtension(extension *ExtensionDesc, value interface{}) ([]byte, error) { + u := getMarshalInfo(reflect.TypeOf(extension.ExtendedType)) + ei := u.getExtElemInfo(extension) + v := value + p := toAddrPointer(&v, ei.isptr) + siz := ei.sizer(p, SizeVarint(ei.wiretag)) + buf := make([]byte, 0, siz) + return ei.marshaler(buf, p, ei.wiretag, false) +} + +func decodeExtensionFromBytes(extension *ExtensionDesc, buf []byte) (interface{}, error) { + o := 0 + for o < len(buf) { + tag, n := DecodeVarint((buf)[o:]) + fieldNum := int32(tag >> 3) + wireType := int(tag & 0x7) + if o+n > len(buf) { + return nil, fmt.Errorf("unable to decode extension") + } + l, err := size((buf)[o+n:], wireType) + if err != nil { + return nil, err + } + if int32(fieldNum) == extension.Field { + if o+n+l > len(buf) { + return nil, fmt.Errorf("unable to decode extension") + } + v, err := decodeExtension((buf)[o:o+n+l], extension) + if err != nil { + return nil, err + } + return v, nil + } + o += n + l + } + return defaultExtensionValue(extension) +} + +func (this *Extension) Encode() error { + if this.enc == nil { + var err error + this.enc, err = encodeExtension(this.desc, this.value) + if err != nil { + return err + } + } + return nil +} + +func (this Extension) GoString() string { + if err := this.Encode(); err != nil { + return fmt.Sprintf("error encoding extension: %v", err) + } + return fmt.Sprintf("proto.NewExtension(%#v)", this.enc) +} + +func SetUnsafeExtension(pb Message, fieldNum int32, value interface{}) error { + typ := reflect.TypeOf(pb).Elem() + ext, ok := extensionMaps[typ] + if !ok { + return fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) + } + desc, ok := ext[fieldNum] + if !ok { + return errors.New("proto: bad extension number; not in declared ranges") + } + return SetExtension(pb, desc, value) +} + +func GetUnsafeExtension(pb Message, fieldNum int32) (interface{}, error) { + typ := reflect.TypeOf(pb).Elem() + ext, ok := extensionMaps[typ] + if !ok { + return nil, fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) + } + desc, ok := ext[fieldNum] + if !ok { + return nil, fmt.Errorf("unregistered field number %d", fieldNum) + } + return GetExtension(pb, desc) +} + +func NewUnsafeXXX_InternalExtensions(m map[int32]Extension) XXX_InternalExtensions { + x := &XXX_InternalExtensions{ + p: new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }), + } + x.p.extensionMap = m + return *x +} + +func GetUnsafeExtensionsMap(extendable Message) map[int32]Extension { + pb := extendable.(extendableProto) + return pb.extensionsWrite() +} + +func deleteExtension(pb extensionsBytes, theFieldNum int32, offset int) int { + ext := pb.GetExtensions() + for offset < len(*ext) { + tag, n1 := DecodeVarint((*ext)[offset:]) + fieldNum := int32(tag >> 3) + wireType := int(tag & 0x7) + n2, err := size((*ext)[offset+n1:], wireType) + if err != nil { + panic(err) + } + newOffset := offset + n1 + n2 + if fieldNum == theFieldNum { + *ext = append((*ext)[:offset], (*ext)[newOffset:]...) + return offset + } + offset = newOffset + } + return -1 +} diff --git a/vendor/github.com/gogo/protobuf/proto/lib.go b/vendor/github.com/gogo/protobuf/proto/lib.go new file mode 100644 index 00000000..80db1c15 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/lib.go @@ -0,0 +1,973 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package proto converts data structures to and from the wire format of +protocol buffers. It works in concert with the Go source code generated +for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. + - Nested messages, groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +The simplest way to describe this is to see an example. +Given file test.proto, containing + + package example; + + enum FOO { X = 17; } + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + oneof union { + int32 number = 6; + string name = 7; + } + } + +The resulting file, test.pb.go, is: + + package example + + import proto "github.com/gogo/protobuf/proto" + import math "math" + + type FOO int32 + const ( + FOO_X FOO = 17 + ) + var FOO_name = map[int32]string{ + 17: "X", + } + var FOO_value = map[string]int32{ + "X": 17, + } + + func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p + } + func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) + } + func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data) + if err != nil { + return err + } + *x = FOO(value) + return nil + } + + type Test struct { + Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` + Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` + Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` + Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` + // Types that are valid to be assigned to Union: + // *Test_Number + // *Test_Name + Union isTest_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` + } + func (m *Test) Reset() { *m = Test{} } + func (m *Test) String() string { return proto.CompactTextString(m) } + func (*Test) ProtoMessage() {} + + type isTest_Union interface { + isTest_Union() + } + + type Test_Number struct { + Number int32 `protobuf:"varint,6,opt,name=number"` + } + type Test_Name struct { + Name string `protobuf:"bytes,7,opt,name=name"` + } + + func (*Test_Number) isTest_Union() {} + func (*Test_Name) isTest_Union() {} + + func (m *Test) GetUnion() isTest_Union { + if m != nil { + return m.Union + } + return nil + } + const Default_Test_Type int32 = 77 + + func (m *Test) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" + } + + func (m *Test) GetType() int32 { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Test_Type + } + + func (m *Test) GetOptionalgroup() *Test_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil + } + + type Test_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` + } + func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } + func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } + + func (m *Test_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" + } + + func (m *Test) GetNumber() int32 { + if x, ok := m.GetUnion().(*Test_Number); ok { + return x.Number + } + return 0 + } + + func (m *Test) GetName() string { + if x, ok := m.GetUnion().(*Test_Name); ok { + return x.Name + } + return "" + } + + func init() { + proto.RegisterEnum("example.FOO", FOO_name, FOO_value) + } + +To create and play with a Test object: + + package main + + import ( + "log" + + "github.com/gogo/protobuf/proto" + pb "./example.pb" + ) + + func main() { + test := &pb.Test{ + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &pb.Test_OptionalGroup{ + RequiredField: proto.String("good bye"), + }, + Union: &pb.Test_Name{"fred"}, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &pb.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // Use a type switch to determine which oneof was set. + switch u := test.Union.(type) { + case *pb.Test_Number: // u.Number contains the number. + case *pb.Test_Name: // u.Name contains the string. + } + // etc. + } +*/ +package proto + +import ( + "encoding/json" + "fmt" + "log" + "reflect" + "sort" + "strconv" + "sync" +) + +// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. +// Marshal reports this when a required field is not initialized. +// Unmarshal reports this when a required field is missing from the wire data. +type RequiredNotSetError struct{ field string } + +func (e *RequiredNotSetError) Error() string { + if e.field == "" { + return fmt.Sprintf("proto: required field not set") + } + return fmt.Sprintf("proto: required field %q not set", e.field) +} +func (e *RequiredNotSetError) RequiredNotSet() bool { + return true +} + +type invalidUTF8Error struct{ field string } + +func (e *invalidUTF8Error) Error() string { + if e.field == "" { + return "proto: invalid UTF-8 detected" + } + return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) +} +func (e *invalidUTF8Error) InvalidUTF8() bool { + return true +} + +// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. +// This error should not be exposed to the external API as such errors should +// be recreated with the field information. +var errInvalidUTF8 = &invalidUTF8Error{} + +// isNonFatal reports whether the error is either a RequiredNotSet error +// or a InvalidUTF8 error. +func isNonFatal(err error) bool { + if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { + return true + } + if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { + return true + } + return false +} + +type nonFatal struct{ E error } + +// Merge merges err into nf and reports whether it was successful. +// Otherwise it returns false for any fatal non-nil errors. +func (nf *nonFatal) Merge(err error) (ok bool) { + if err == nil { + return true // not an error + } + if !isNonFatal(err) { + return false // fatal error + } + if nf.E == nil { + nf.E = err // store first instance of non-fatal error + } + return true +} + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} + +// A Buffer is a buffer manager for marshaling and unmarshaling +// protocol buffers. It may be reused between invocations to +// reduce memory usage. It is not necessary to use a Buffer; +// the global functions Marshal and Unmarshal create a +// temporary Buffer and are fine for most applications. +type Buffer struct { + buf []byte // encode/decode byte stream + index int // read point + + deterministic bool +} + +// NewBuffer allocates a new Buffer and initializes its internal data to +// the contents of the argument slice. +func NewBuffer(e []byte) *Buffer { + return &Buffer{buf: e} +} + +// Reset resets the Buffer, ready for marshaling a new protocol buffer. +func (p *Buffer) Reset() { + p.buf = p.buf[0:0] // for reading/writing + p.index = 0 // for reading +} + +// SetBuf replaces the internal buffer with the slice, +// ready for unmarshaling the contents of the slice. +func (p *Buffer) SetBuf(s []byte) { + p.buf = s + p.index = 0 +} + +// Bytes returns the contents of the Buffer. +func (p *Buffer) Bytes() []byte { return p.buf } + +// SetDeterministic sets whether to use deterministic serialization. +// +// Deterministic serialization guarantees that for a given binary, equal +// messages will always be serialized to the same bytes. This implies: +// +// - Repeated serialization of a message will return the same bytes. +// - Different processes of the same binary (which may be executing on +// different machines) will serialize equal messages to the same bytes. +// +// Note that the deterministic serialization is NOT canonical across +// languages. It is not guaranteed to remain stable over time. It is unstable +// across different builds with schema changes due to unknown fields. +// Users who need canonical serialization (e.g., persistent storage in a +// canonical form, fingerprinting, etc.) should define their own +// canonicalization specification and implement their own serializer rather +// than relying on this API. +// +// If deterministic serialization is requested, map entries will be sorted +// by keys in lexographical order. This is an implementation detail and +// subject to change. +func (p *Buffer) SetDeterministic(deterministic bool) { + p.deterministic = deterministic +} + +/* + * Helper routines for simplifying the creation of optional fields of basic type. + */ + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + return &v +} + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { + return &v +} + +// Int is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it, but unlike Int32 +// its argument value is an int. +func Int(v int) *int32 { + p := new(int32) + *p = int32(v) + return p +} + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { + return &v +} + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { + return &v +} + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { + return &v +} + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { + return &v +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + return &v +} + +// EnumName is a helper function to simplify printing protocol buffer enums +// by name. Given an enum map and a value, it returns a useful string. +func EnumName(m map[int32]string, v int32) string { + s, ok := m[v] + if ok { + return s + } + return strconv.Itoa(int(v)) +} + +// UnmarshalJSONEnum is a helper function to simplify recovering enum int values +// from their JSON-encoded representation. Given a map from the enum's symbolic +// names to its int values, and a byte buffer containing the JSON-encoded +// value, it returns an int32 that can be cast to the enum type by the caller. +// +// The function can deal with both JSON representations, numeric and symbolic. +func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { + if data[0] == '"' { + // New style: enums are strings. + var repr string + if err := json.Unmarshal(data, &repr); err != nil { + return -1, err + } + val, ok := m[repr] + if !ok { + return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) + } + return val, nil + } + // Old style: enums are ints. + var val int32 + if err := json.Unmarshal(data, &val); err != nil { + return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) + } + return val, nil +} + +// DebugPrint dumps the encoded data in b in a debugging format with a header +// including the string s. Used in testing but made available for general debugging. +func (p *Buffer) DebugPrint(s string, b []byte) { + var u uint64 + + obuf := p.buf + sindex := p.index + p.buf = b + p.index = 0 + depth := 0 + + fmt.Printf("\n--- %s ---\n", s) + +out: + for { + for i := 0; i < depth; i++ { + fmt.Print(" ") + } + + index := p.index + if index == len(p.buf) { + break + } + + op, err := p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: fetching op err %v\n", index, err) + break out + } + tag := op >> 3 + wire := op & 7 + + switch wire { + default: + fmt.Printf("%3d: t=%3d unknown wire=%d\n", + index, tag, wire) + break out + + case WireBytes: + var r []byte + + r, err = p.DecodeRawBytes(false) + if err != nil { + break out + } + fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) + if len(r) <= 6 { + for i := 0; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } else { + for i := 0; i < 3; i++ { + fmt.Printf(" %.2x", r[i]) + } + fmt.Printf(" ..") + for i := len(r) - 3; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } + fmt.Printf("\n") + + case WireFixed32: + u, err = p.DecodeFixed32() + if err != nil { + fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) + + case WireFixed64: + u, err = p.DecodeFixed64() + if err != nil { + fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) + + case WireVarint: + u, err = p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) + + case WireStartGroup: + fmt.Printf("%3d: t=%3d start\n", index, tag) + depth++ + + case WireEndGroup: + depth-- + fmt.Printf("%3d: t=%3d end\n", index, tag) + } + } + + if depth != 0 { + fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) + } + fmt.Printf("\n") + + p.buf = obuf + p.index = sindex +} + +// SetDefaults sets unset protocol buffer fields to their default values. +// It only modifies fields that are both unset and have defined defaults. +// It recursively sets default values in any non-nil sub-messages. +func SetDefaults(pb Message) { + setDefaults(reflect.ValueOf(pb), true, false) +} + +// v is a struct. +func setDefaults(v reflect.Value, recur, zeros bool) { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + + defaultMu.RLock() + dm, ok := defaults[v.Type()] + defaultMu.RUnlock() + if !ok { + dm = buildDefaultMessage(v.Type()) + defaultMu.Lock() + defaults[v.Type()] = dm + defaultMu.Unlock() + } + + for _, sf := range dm.scalars { + f := v.Field(sf.index) + if !f.IsNil() { + // field already set + continue + } + dv := sf.value + if dv == nil && !zeros { + // no explicit default, and don't want to set zeros + continue + } + fptr := f.Addr().Interface() // **T + // TODO: Consider batching the allocations we do here. + switch sf.kind { + case reflect.Bool: + b := new(bool) + if dv != nil { + *b = dv.(bool) + } + *(fptr.(**bool)) = b + case reflect.Float32: + f := new(float32) + if dv != nil { + *f = dv.(float32) + } + *(fptr.(**float32)) = f + case reflect.Float64: + f := new(float64) + if dv != nil { + *f = dv.(float64) + } + *(fptr.(**float64)) = f + case reflect.Int32: + // might be an enum + if ft := f.Type(); ft != int32PtrType { + // enum + f.Set(reflect.New(ft.Elem())) + if dv != nil { + f.Elem().SetInt(int64(dv.(int32))) + } + } else { + // int32 field + i := new(int32) + if dv != nil { + *i = dv.(int32) + } + *(fptr.(**int32)) = i + } + case reflect.Int64: + i := new(int64) + if dv != nil { + *i = dv.(int64) + } + *(fptr.(**int64)) = i + case reflect.String: + s := new(string) + if dv != nil { + *s = dv.(string) + } + *(fptr.(**string)) = s + case reflect.Uint8: + // exceptional case: []byte + var b []byte + if dv != nil { + db := dv.([]byte) + b = make([]byte, len(db)) + copy(b, db) + } else { + b = []byte{} + } + *(fptr.(*[]byte)) = b + case reflect.Uint32: + u := new(uint32) + if dv != nil { + *u = dv.(uint32) + } + *(fptr.(**uint32)) = u + case reflect.Uint64: + u := new(uint64) + if dv != nil { + *u = dv.(uint64) + } + *(fptr.(**uint64)) = u + default: + log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) + } + } + + for _, ni := range dm.nested { + f := v.Field(ni) + // f is *T or T or []*T or []T + switch f.Kind() { + case reflect.Struct: + setDefaults(f, recur, zeros) + + case reflect.Ptr: + if f.IsNil() { + continue + } + setDefaults(f, recur, zeros) + + case reflect.Slice: + for i := 0; i < f.Len(); i++ { + e := f.Index(i) + if e.Kind() == reflect.Ptr && e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + + case reflect.Map: + for _, k := range f.MapKeys() { + e := f.MapIndex(k) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + } + } +} + +var ( + // defaults maps a protocol buffer struct type to a slice of the fields, + // with its scalar fields set to their proto-declared non-zero default values. + defaultMu sync.RWMutex + defaults = make(map[reflect.Type]defaultMessage) + + int32PtrType = reflect.TypeOf((*int32)(nil)) +) + +// defaultMessage represents information about the default values of a message. +type defaultMessage struct { + scalars []scalarField + nested []int // struct field index of nested messages +} + +type scalarField struct { + index int // struct field index + kind reflect.Kind // element type (the T in *T or []T) + value interface{} // the proto-declared default value, or nil +} + +// t is a struct type. +func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { + sprop := GetProperties(t) + for _, prop := range sprop.Prop { + fi, ok := sprop.decoderTags.get(prop.Tag) + if !ok { + // XXX_unrecognized + continue + } + ft := t.Field(fi).Type + + sf, nested, err := fieldDefault(ft, prop) + switch { + case err != nil: + log.Print(err) + case nested: + dm.nested = append(dm.nested, fi) + case sf != nil: + sf.index = fi + dm.scalars = append(dm.scalars, *sf) + } + } + + return dm +} + +// fieldDefault returns the scalarField for field type ft. +// sf will be nil if the field can not have a default. +// nestedMessage will be true if this is a nested message. +// Note that sf.index is not set on return. +func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { + var canHaveDefault bool + switch ft.Kind() { + case reflect.Struct: + nestedMessage = true // non-nullable + + case reflect.Ptr: + if ft.Elem().Kind() == reflect.Struct { + nestedMessage = true + } else { + canHaveDefault = true // proto2 scalar field + } + + case reflect.Slice: + switch ft.Elem().Kind() { + case reflect.Ptr, reflect.Struct: + nestedMessage = true // repeated message + case reflect.Uint8: + canHaveDefault = true // bytes field + } + + case reflect.Map: + if ft.Elem().Kind() == reflect.Ptr { + nestedMessage = true // map with message values + } + } + + if !canHaveDefault { + if nestedMessage { + return nil, true, nil + } + return nil, false, nil + } + + // We now know that ft is a pointer or slice. + sf = &scalarField{kind: ft.Elem().Kind()} + + // scalar fields without defaults + if !prop.HasDefault { + return sf, false, nil + } + + // a scalar field: either *T or []byte + switch ft.Elem().Kind() { + case reflect.Bool: + x, err := strconv.ParseBool(prop.Default) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Float32: + x, err := strconv.ParseFloat(prop.Default, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) + } + sf.value = float32(x) + case reflect.Float64: + x, err := strconv.ParseFloat(prop.Default, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Int32: + x, err := strconv.ParseInt(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) + } + sf.value = int32(x) + case reflect.Int64: + x, err := strconv.ParseInt(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.String: + sf.value = prop.Default + case reflect.Uint8: + // []byte (not *uint8) + sf.value = []byte(prop.Default) + case reflect.Uint32: + x, err := strconv.ParseUint(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) + } + sf.value = uint32(x) + case reflect.Uint64: + x, err := strconv.ParseUint(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) + } + sf.value = x + default: + return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) + } + + return sf, false, nil +} + +// mapKeys returns a sort.Interface to be used for sorting the map keys. +// Map fields may have key types of non-float scalars, strings and enums. +func mapKeys(vs []reflect.Value) sort.Interface { + s := mapKeySorter{vs: vs} + + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. + if len(vs) == 0 { + return s + } + switch vs[0].Kind() { + case reflect.Int32, reflect.Int64: + s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } + case reflect.Uint32, reflect.Uint64: + s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + case reflect.Bool: + s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true + case reflect.String: + s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } + default: + panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) + } + + return s +} + +type mapKeySorter struct { + vs []reflect.Value + less func(a, b reflect.Value) bool +} + +func (s mapKeySorter) Len() int { return len(s.vs) } +func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } +func (s mapKeySorter) Less(i, j int) bool { + return s.less(s.vs[i], s.vs[j]) +} + +// isProto3Zero reports whether v is a zero proto3 value. +func isProto3Zero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return !v.Bool() + case reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.String: + return v.String() == "" + } + return false +} + +const ( + // ProtoPackageIsVersion3 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + GoGoProtoPackageIsVersion3 = true + + // ProtoPackageIsVersion2 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + GoGoProtoPackageIsVersion2 = true + + // ProtoPackageIsVersion1 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + GoGoProtoPackageIsVersion1 = true +) + +// InternalMessageInfo is a type used internally by generated .pb.go files. +// This type is not intended to be used by non-generated code. +// This type is not subject to any compatibility guarantee. +type InternalMessageInfo struct { + marshal *marshalInfo + unmarshal *unmarshalInfo + merge *mergeInfo + discard *discardInfo +} diff --git a/vendor/github.com/gogo/protobuf/proto/lib_gogo.go b/vendor/github.com/gogo/protobuf/proto/lib_gogo.go new file mode 100644 index 00000000..b3aa3919 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/lib_gogo.go @@ -0,0 +1,50 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "encoding/json" + "strconv" +) + +type Sizer interface { + Size() int +} + +type ProtoSizer interface { + ProtoSize() int +} + +func MarshalJSONEnum(m map[int32]string, value int32) ([]byte, error) { + s, ok := m[value] + if !ok { + s = strconv.Itoa(int(value)) + } + return json.Marshal(s) +} diff --git a/vendor/github.com/gogo/protobuf/proto/message_set.go b/vendor/github.com/gogo/protobuf/proto/message_set.go new file mode 100644 index 00000000..f48a7567 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/message_set.go @@ -0,0 +1,181 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Support for message sets. + */ + +import ( + "errors" +) + +// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. +// A message type ID is required for storing a protocol buffer in a message set. +var errNoMessageTypeID = errors.New("proto does not have a message type ID") + +// The first two types (_MessageSet_Item and messageSet) +// model what the protocol compiler produces for the following protocol message: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } +// That is the MessageSet wire format. We can't use a proto to generate these +// because that would introduce a circular dependency between it and this package. + +type _MessageSet_Item struct { + TypeId *int32 `protobuf:"varint,2,req,name=type_id"` + Message []byte `protobuf:"bytes,3,req,name=message"` +} + +type messageSet struct { + Item []*_MessageSet_Item `protobuf:"group,1,rep"` + XXX_unrecognized []byte + // TODO: caching? +} + +// Make sure messageSet is a Message. +var _ Message = (*messageSet)(nil) + +// messageTypeIder is an interface satisfied by a protocol buffer type +// that may be stored in a MessageSet. +type messageTypeIder interface { + MessageTypeId() int32 +} + +func (ms *messageSet) find(pb Message) *_MessageSet_Item { + mti, ok := pb.(messageTypeIder) + if !ok { + return nil + } + id := mti.MessageTypeId() + for _, item := range ms.Item { + if *item.TypeId == id { + return item + } + } + return nil +} + +func (ms *messageSet) Has(pb Message) bool { + return ms.find(pb) != nil +} + +func (ms *messageSet) Unmarshal(pb Message) error { + if item := ms.find(pb); item != nil { + return Unmarshal(item.Message, pb) + } + if _, ok := pb.(messageTypeIder); !ok { + return errNoMessageTypeID + } + return nil // TODO: return error instead? +} + +func (ms *messageSet) Marshal(pb Message) error { + msg, err := Marshal(pb) + if err != nil { + return err + } + if item := ms.find(pb); item != nil { + // reuse existing item + item.Message = msg + return nil + } + + mti, ok := pb.(messageTypeIder) + if !ok { + return errNoMessageTypeID + } + + mtid := mti.MessageTypeId() + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: &mtid, + Message: msg, + }) + return nil +} + +func (ms *messageSet) Reset() { *ms = messageSet{} } +func (ms *messageSet) String() string { return CompactTextString(ms) } +func (*messageSet) ProtoMessage() {} + +// Support for the message_set_wire_format message option. + +func skipVarint(buf []byte) []byte { + i := 0 + for ; buf[i]&0x80 != 0; i++ { + } + return buf[i+1:] +} + +// unmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func unmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + + ms := new(messageSet) + if err := Unmarshal(buf, ms); err != nil { + return err + } + for _, item := range ms.Item { + id := *item.TypeId + msg := item.Message + + // Restore wire type and field number varint, plus length varint. + // Be careful to preserve duplicate items. + b := EncodeVarint(uint64(id)<<3 | WireBytes) + if ext, ok := m[id]; ok { + // Existing data; rip off the tag and length varint + // so we join the new data correctly. + // We can assume that ext.enc is set because we are unmarshaling. + o := ext.enc[len(b):] // skip wire type and field number + _, n := DecodeVarint(o) // calculate length of length varint + o = o[n:] // skip length varint + msg = append(o, msg...) // join old data and new data + } + b = append(b, EncodeVarint(uint64(len(msg)))...) + b = append(b, msg...) + + m[id] = Extension{enc: b} + } + return nil +} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go new file mode 100644 index 00000000..b6cad908 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go @@ -0,0 +1,357 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build purego appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "reflect" + "sync" +) + +const unsafeAllowed = false + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by the sequence of field indices +// passed to reflect's FieldByIndex. +type field []int + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return f.Index +} + +// invalidField is an invalid field identifier. +var invalidField = field(nil) + +// zeroField is a noop when calling pointer.offset. +var zeroField = field([]int{}) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { return f != nil } + +// The pointer type is for the table-driven decoder. +// The implementation here uses a reflect.Value of pointer type to +// create a generic pointer. In pointer_unsafe.go we use unsafe +// instead of reflect to implement the same (but faster) interface. +type pointer struct { + v reflect.Value +} + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + return pointer{v: reflect.ValueOf(*i)} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + v := reflect.ValueOf(*i) + u := reflect.New(v.Type()) + u.Elem().Set(v) + return pointer{v: u} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{v: v} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} +} + +func (p pointer) isNil() bool { + return p.v.IsNil() +} + +// grow updates the slice s in place to make it one element longer. +// s must be addressable. +// Returns the (addressable) new element. +func grow(s reflect.Value) reflect.Value { + n, m := s.Len(), s.Cap() + if n < m { + s.SetLen(n + 1) + } else { + s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) + } + return s.Index(n) +} + +func (p pointer) toInt64() *int64 { + return p.v.Interface().(*int64) +} +func (p pointer) toInt64Ptr() **int64 { + return p.v.Interface().(**int64) +} +func (p pointer) toInt64Slice() *[]int64 { + return p.v.Interface().(*[]int64) +} + +var int32ptr = reflect.TypeOf((*int32)(nil)) + +func (p pointer) toInt32() *int32 { + return p.v.Convert(int32ptr).Interface().(*int32) +} + +// The toInt32Ptr/Slice methods don't work because of enums. +// Instead, we must use set/get methods for the int32ptr/slice case. +/* + func (p pointer) toInt32Ptr() **int32 { + return p.v.Interface().(**int32) +} + func (p pointer) toInt32Slice() *[]int32 { + return p.v.Interface().(*[]int32) +} +*/ +func (p pointer) getInt32Ptr() *int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().(*int32) + } + // an enum + return p.v.Elem().Convert(int32PtrType).Interface().(*int32) +} +func (p pointer) setInt32Ptr(v int32) { + // Allocate value in a *int32. Possibly convert that to a *enum. + // Then assign it to a **int32 or **enum. + // Note: we can convert *int32 to *enum, but we can't convert + // **int32 to **enum! + p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) +} + +// getInt32Slice copies []int32 from p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getInt32Slice() []int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().([]int32) + } + // an enum + // Allocate a []int32, then assign []enum's values into it. + // Note: we can't convert []enum to []int32. + slice := p.v.Elem() + s := make([]int32, slice.Len()) + for i := 0; i < slice.Len(); i++ { + s[i] = int32(slice.Index(i).Int()) + } + return s +} + +// setInt32Slice copies []int32 into p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setInt32Slice(v []int32) { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + p.v.Elem().Set(reflect.ValueOf(v)) + return + } + // an enum + // Allocate a []enum, then assign []int32's values into it. + // Note: we can't convert []enum to []int32. + slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) + for i, x := range v { + slice.Index(i).SetInt(int64(x)) + } + p.v.Elem().Set(slice) +} +func (p pointer) appendInt32Slice(v int32) { + grow(p.v.Elem()).SetInt(int64(v)) +} + +func (p pointer) toUint64() *uint64 { + return p.v.Interface().(*uint64) +} +func (p pointer) toUint64Ptr() **uint64 { + return p.v.Interface().(**uint64) +} +func (p pointer) toUint64Slice() *[]uint64 { + return p.v.Interface().(*[]uint64) +} +func (p pointer) toUint32() *uint32 { + return p.v.Interface().(*uint32) +} +func (p pointer) toUint32Ptr() **uint32 { + return p.v.Interface().(**uint32) +} +func (p pointer) toUint32Slice() *[]uint32 { + return p.v.Interface().(*[]uint32) +} +func (p pointer) toBool() *bool { + return p.v.Interface().(*bool) +} +func (p pointer) toBoolPtr() **bool { + return p.v.Interface().(**bool) +} +func (p pointer) toBoolSlice() *[]bool { + return p.v.Interface().(*[]bool) +} +func (p pointer) toFloat64() *float64 { + return p.v.Interface().(*float64) +} +func (p pointer) toFloat64Ptr() **float64 { + return p.v.Interface().(**float64) +} +func (p pointer) toFloat64Slice() *[]float64 { + return p.v.Interface().(*[]float64) +} +func (p pointer) toFloat32() *float32 { + return p.v.Interface().(*float32) +} +func (p pointer) toFloat32Ptr() **float32 { + return p.v.Interface().(**float32) +} +func (p pointer) toFloat32Slice() *[]float32 { + return p.v.Interface().(*[]float32) +} +func (p pointer) toString() *string { + return p.v.Interface().(*string) +} +func (p pointer) toStringPtr() **string { + return p.v.Interface().(**string) +} +func (p pointer) toStringSlice() *[]string { + return p.v.Interface().(*[]string) +} +func (p pointer) toBytes() *[]byte { + return p.v.Interface().(*[]byte) +} +func (p pointer) toBytesSlice() *[][]byte { + return p.v.Interface().(*[][]byte) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return p.v.Interface().(*XXX_InternalExtensions) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return p.v.Interface().(*map[int32]Extension) +} +func (p pointer) getPointer() pointer { + return pointer{v: p.v.Elem()} +} +func (p pointer) setPointer(q pointer) { + p.v.Elem().Set(q.v) +} +func (p pointer) appendPointer(q pointer) { + grow(p.v.Elem()).Set(q.v) +} + +// getPointerSlice copies []*T from p as a new []pointer. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getPointerSlice() []pointer { + if p.v.IsNil() { + return nil + } + n := p.v.Elem().Len() + s := make([]pointer, n) + for i := 0; i < n; i++ { + s[i] = pointer{v: p.v.Elem().Index(i)} + } + return s +} + +// setPointerSlice copies []pointer into p as a new []*T. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setPointerSlice(v []pointer) { + if v == nil { + p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) + return + } + s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) + for _, p := range v { + s = reflect.Append(s, p.v) + } + p.v.Elem().Set(s) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + if p.v.Elem().IsNil() { + return pointer{v: p.v.Elem()} + } + return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct +} + +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + // TODO: check that p.v.Type().Elem() == t? + return p.v +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} + +var atomicLock sync.Mutex diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go new file mode 100644 index 00000000..7ffd3c29 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go @@ -0,0 +1,59 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build purego appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "reflect" +) + +// TODO: untested, so probably incorrect. + +func (p pointer) getRef() pointer { + return pointer{v: p.v.Addr()} +} + +func (p pointer) appendRef(v pointer, typ reflect.Type) { + slice := p.getSlice(typ) + elem := v.asPointerTo(typ).Elem() + newSlice := reflect.Append(slice, elem) + slice.Set(newSlice) +} + +func (p pointer) getSlice(typ reflect.Type) reflect.Value { + sliceTyp := reflect.SliceOf(typ) + slice := p.asPointerTo(sliceTyp) + slice = slice.Elem() + return slice +} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go new file mode 100644 index 00000000..d55a335d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go @@ -0,0 +1,308 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !purego,!appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "sync/atomic" + "unsafe" +) + +const unsafeAllowed = true + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by its byte offset from the start of the struct. +type field uintptr + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return field(f.Offset) +} + +// invalidField is an invalid field identifier. +const invalidField = ^field(0) + +// zeroField is a noop when calling pointer.offset. +const zeroField = field(0) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { + return f != invalidField +} + +// The pointer type below is for the new table-driven encoder/decoder. +// The implementation here uses unsafe.Pointer to create a generic pointer. +// In pointer_reflect.go we use reflect instead of unsafe to implement +// the same (but slower) interface. +type pointer struct { + p unsafe.Pointer +} + +// size of pointer +var ptrSize = unsafe.Sizeof(uintptr(0)) + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + // Super-tricky - read pointer out of data word of interface value. + // Saves ~25ns over the equivalent: + // return valToPointer(reflect.ValueOf(*i)) + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + // Super-tricky - read or get the address of data word of interface value. + if isptr { + // The interface is of pointer type, thus it is a direct interface. + // The data word is the pointer data itself. We take its address. + return pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} + } + // The interface is not of pointer type. The data word is the pointer + // to the data. + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{p: unsafe.Pointer(v.Pointer())} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + // For safety, we should panic if !f.IsValid, however calling panic causes + // this to no longer be inlineable, which is a serious performance cost. + /* + if !f.IsValid() { + panic("invalid field") + } + */ + return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} +} + +func (p pointer) isNil() bool { + return p.p == nil +} + +func (p pointer) toInt64() *int64 { + return (*int64)(p.p) +} +func (p pointer) toInt64Ptr() **int64 { + return (**int64)(p.p) +} +func (p pointer) toInt64Slice() *[]int64 { + return (*[]int64)(p.p) +} +func (p pointer) toInt32() *int32 { + return (*int32)(p.p) +} + +// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. +/* + func (p pointer) toInt32Ptr() **int32 { + return (**int32)(p.p) + } + func (p pointer) toInt32Slice() *[]int32 { + return (*[]int32)(p.p) + } +*/ +func (p pointer) getInt32Ptr() *int32 { + return *(**int32)(p.p) +} +func (p pointer) setInt32Ptr(v int32) { + *(**int32)(p.p) = &v +} + +// getInt32Slice loads a []int32 from p. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getInt32Slice() []int32 { + return *(*[]int32)(p.p) +} + +// setInt32Slice stores a []int32 to p. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setInt32Slice(v []int32) { + *(*[]int32)(p.p) = v +} + +// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? +func (p pointer) appendInt32Slice(v int32) { + s := (*[]int32)(p.p) + *s = append(*s, v) +} + +func (p pointer) toUint64() *uint64 { + return (*uint64)(p.p) +} +func (p pointer) toUint64Ptr() **uint64 { + return (**uint64)(p.p) +} +func (p pointer) toUint64Slice() *[]uint64 { + return (*[]uint64)(p.p) +} +func (p pointer) toUint32() *uint32 { + return (*uint32)(p.p) +} +func (p pointer) toUint32Ptr() **uint32 { + return (**uint32)(p.p) +} +func (p pointer) toUint32Slice() *[]uint32 { + return (*[]uint32)(p.p) +} +func (p pointer) toBool() *bool { + return (*bool)(p.p) +} +func (p pointer) toBoolPtr() **bool { + return (**bool)(p.p) +} +func (p pointer) toBoolSlice() *[]bool { + return (*[]bool)(p.p) +} +func (p pointer) toFloat64() *float64 { + return (*float64)(p.p) +} +func (p pointer) toFloat64Ptr() **float64 { + return (**float64)(p.p) +} +func (p pointer) toFloat64Slice() *[]float64 { + return (*[]float64)(p.p) +} +func (p pointer) toFloat32() *float32 { + return (*float32)(p.p) +} +func (p pointer) toFloat32Ptr() **float32 { + return (**float32)(p.p) +} +func (p pointer) toFloat32Slice() *[]float32 { + return (*[]float32)(p.p) +} +func (p pointer) toString() *string { + return (*string)(p.p) +} +func (p pointer) toStringPtr() **string { + return (**string)(p.p) +} +func (p pointer) toStringSlice() *[]string { + return (*[]string)(p.p) +} +func (p pointer) toBytes() *[]byte { + return (*[]byte)(p.p) +} +func (p pointer) toBytesSlice() *[][]byte { + return (*[][]byte)(p.p) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(p.p) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return (*map[int32]Extension)(p.p) +} + +// getPointerSlice loads []*T from p as a []pointer. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getPointerSlice() []pointer { + // Super-tricky - p should point to a []*T where T is a + // message type. We load it as []pointer. + return *(*[]pointer)(p.p) +} + +// setPointerSlice stores []pointer into p as a []*T. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setPointerSlice(v []pointer) { + // Super-tricky - p should point to a []*T where T is a + // message type. We store it as []pointer. + *(*[]pointer)(p.p) = v +} + +// getPointer loads the pointer at p and returns it. +func (p pointer) getPointer() pointer { + return pointer{p: *(*unsafe.Pointer)(p.p)} +} + +// setPointer stores the pointer q at p. +func (p pointer) setPointer(q pointer) { + *(*unsafe.Pointer)(p.p) = q.p +} + +// append q to the slice pointed to by p. +func (p pointer) appendPointer(q pointer) { + s := (*[]unsafe.Pointer)(p.p) + *s = append(*s, q.p) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + // Super-tricky - read pointer out of data word of interface value. + return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} +} + +// asPointerTo returns a reflect.Value that is a pointer to an +// object of type t stored at p. +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + return reflect.NewAt(t, p.p) +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go new file mode 100644 index 00000000..aca8eed0 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go @@ -0,0 +1,56 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !purego,!appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "unsafe" +) + +func (p pointer) getRef() pointer { + return pointer{p: (unsafe.Pointer)(&p.p)} +} + +func (p pointer) appendRef(v pointer, typ reflect.Type) { + slice := p.getSlice(typ) + elem := v.asPointerTo(typ).Elem() + newSlice := reflect.Append(slice, elem) + slice.Set(newSlice) +} + +func (p pointer) getSlice(typ reflect.Type) reflect.Value { + sliceTyp := reflect.SliceOf(typ) + slice := p.asPointerTo(sliceTyp) + slice = slice.Elem() + return slice +} diff --git a/vendor/github.com/gogo/protobuf/proto/properties.go b/vendor/github.com/gogo/protobuf/proto/properties.go new file mode 100644 index 00000000..28da1475 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/properties.go @@ -0,0 +1,610 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "fmt" + "log" + "reflect" + "sort" + "strconv" + "strings" + "sync" +) + +const debug bool = false + +// Constants that identify the encoding of a value on the wire. +const ( + WireVarint = 0 + WireFixed64 = 1 + WireBytes = 2 + WireStartGroup = 3 + WireEndGroup = 4 + WireFixed32 = 5 +) + +// tagMap is an optimization over map[int]int for typical protocol buffer +// use-cases. Encoded protocol buffers are often in tag order with small tag +// numbers. +type tagMap struct { + fastTags []int + slowTags map[int]int +} + +// tagMapFastLimit is the upper bound on the tag number that will be stored in +// the tagMap slice rather than its map. +const tagMapFastLimit = 1024 + +func (p *tagMap) get(t int) (int, bool) { + if t > 0 && t < tagMapFastLimit { + if t >= len(p.fastTags) { + return 0, false + } + fi := p.fastTags[t] + return fi, fi >= 0 + } + fi, ok := p.slowTags[t] + return fi, ok +} + +func (p *tagMap) put(t int, fi int) { + if t > 0 && t < tagMapFastLimit { + for len(p.fastTags) < t+1 { + p.fastTags = append(p.fastTags, -1) + } + p.fastTags[t] = fi + return + } + if p.slowTags == nil { + p.slowTags = make(map[int]int) + } + p.slowTags[t] = fi +} + +// StructProperties represents properties for all the fields of a struct. +// decoderTags and decoderOrigNames should only be used by the decoder. +type StructProperties struct { + Prop []*Properties // properties for each field + reqCount int // required count + decoderTags tagMap // map from proto tag to struct field number + decoderOrigNames map[string]int // map from original name to struct field number + order []int // list of struct field numbers in tag order + + // OneofTypes contains information about the oneof fields in this message. + // It is keyed by the original name of a field. + OneofTypes map[string]*OneofProperties +} + +// OneofProperties represents information about a specific field in a oneof. +type OneofProperties struct { + Type reflect.Type // pointer to generated struct type for this oneof field + Field int // struct field number of the containing oneof in the message + Prop *Properties +} + +// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. +// See encode.go, (*Buffer).enc_struct. + +func (sp *StructProperties) Len() int { return len(sp.order) } +func (sp *StructProperties) Less(i, j int) bool { + return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag +} +func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } + +// Properties represents the protocol-specific behavior of a single struct field. +type Properties struct { + Name string // name of the field, for error messages + OrigName string // original name before protocol compiler (always set) + JSONName string // name to use for JSON; determined by protoc + Wire string + WireType int + Tag int + Required bool + Optional bool + Repeated bool + Packed bool // relevant for repeated primitives only + Enum string // set for enum types only + proto3 bool // whether this is known to be a proto3 field + oneof bool // whether this is a oneof field + + Default string // default value + HasDefault bool // whether an explicit default was provided + CustomType string + CastType string + StdTime bool + StdDuration bool + WktPointer bool + + stype reflect.Type // set for struct types only + ctype reflect.Type // set for custom types only + sprop *StructProperties // set for struct types only + + mtype reflect.Type // set for map types only + MapKeyProp *Properties // set for map types only + MapValProp *Properties // set for map types only +} + +// String formats the properties in the protobuf struct field tag style. +func (p *Properties) String() string { + s := p.Wire + s += "," + s += strconv.Itoa(p.Tag) + if p.Required { + s += ",req" + } + if p.Optional { + s += ",opt" + } + if p.Repeated { + s += ",rep" + } + if p.Packed { + s += ",packed" + } + s += ",name=" + p.OrigName + if p.JSONName != p.OrigName { + s += ",json=" + p.JSONName + } + if p.proto3 { + s += ",proto3" + } + if p.oneof { + s += ",oneof" + } + if len(p.Enum) > 0 { + s += ",enum=" + p.Enum + } + if p.HasDefault { + s += ",def=" + p.Default + } + return s +} + +// Parse populates p by parsing a string in the protobuf struct field tag style. +func (p *Properties) Parse(s string) { + // "bytes,49,opt,name=foo,def=hello!" + fields := strings.Split(s, ",") // breaks def=, but handled below. + if len(fields) < 2 { + log.Printf("proto: tag has too few fields: %q", s) + return + } + + p.Wire = fields[0] + switch p.Wire { + case "varint": + p.WireType = WireVarint + case "fixed32": + p.WireType = WireFixed32 + case "fixed64": + p.WireType = WireFixed64 + case "zigzag32": + p.WireType = WireVarint + case "zigzag64": + p.WireType = WireVarint + case "bytes", "group": + p.WireType = WireBytes + // no numeric converter for non-numeric types + default: + log.Printf("proto: tag has unknown wire type: %q", s) + return + } + + var err error + p.Tag, err = strconv.Atoi(fields[1]) + if err != nil { + return + } + +outer: + for i := 2; i < len(fields); i++ { + f := fields[i] + switch { + case f == "req": + p.Required = true + case f == "opt": + p.Optional = true + case f == "rep": + p.Repeated = true + case f == "packed": + p.Packed = true + case strings.HasPrefix(f, "name="): + p.OrigName = f[5:] + case strings.HasPrefix(f, "json="): + p.JSONName = f[5:] + case strings.HasPrefix(f, "enum="): + p.Enum = f[5:] + case f == "proto3": + p.proto3 = true + case f == "oneof": + p.oneof = true + case strings.HasPrefix(f, "def="): + p.HasDefault = true + p.Default = f[4:] // rest of string + if i+1 < len(fields) { + // Commas aren't escaped, and def is always last. + p.Default += "," + strings.Join(fields[i+1:], ",") + break outer + } + case strings.HasPrefix(f, "embedded="): + p.OrigName = strings.Split(f, "=")[1] + case strings.HasPrefix(f, "customtype="): + p.CustomType = strings.Split(f, "=")[1] + case strings.HasPrefix(f, "casttype="): + p.CastType = strings.Split(f, "=")[1] + case f == "stdtime": + p.StdTime = true + case f == "stdduration": + p.StdDuration = true + case f == "wktptr": + p.WktPointer = true + } + } +} + +var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() + +// setFieldProps initializes the field properties for submessages and maps. +func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + isMap := typ.Kind() == reflect.Map + if len(p.CustomType) > 0 && !isMap { + p.ctype = typ + p.setTag(lockGetProp) + return + } + if p.StdTime && !isMap { + p.setTag(lockGetProp) + return + } + if p.StdDuration && !isMap { + p.setTag(lockGetProp) + return + } + if p.WktPointer && !isMap { + p.setTag(lockGetProp) + return + } + switch t1 := typ; t1.Kind() { + case reflect.Struct: + p.stype = typ + case reflect.Ptr: + if t1.Elem().Kind() == reflect.Struct { + p.stype = t1.Elem() + } + case reflect.Slice: + switch t2 := t1.Elem(); t2.Kind() { + case reflect.Ptr: + switch t3 := t2.Elem(); t3.Kind() { + case reflect.Struct: + p.stype = t3 + } + case reflect.Struct: + p.stype = t2 + } + + case reflect.Map: + + p.mtype = t1 + p.MapKeyProp = &Properties{} + p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.MapValProp = &Properties{} + vtype := p.mtype.Elem() + if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { + // The value type is not a message (*T) or bytes ([]byte), + // so we need encoders for the pointer to this type. + vtype = reflect.PtrTo(vtype) + } + + p.MapValProp.CustomType = p.CustomType + p.MapValProp.StdDuration = p.StdDuration + p.MapValProp.StdTime = p.StdTime + p.MapValProp.WktPointer = p.WktPointer + p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + } + p.setTag(lockGetProp) +} + +func (p *Properties) setTag(lockGetProp bool) { + if p.stype != nil { + if lockGetProp { + p.sprop = GetProperties(p.stype) + } else { + p.sprop = getPropertiesLocked(p.stype) + } + } +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() +) + +// Init populates the properties from a protocol buffer struct tag. +func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { + p.init(typ, name, tag, f, true) +} + +func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { + // "bytes,49,opt,def=hello!" + p.Name = name + p.OrigName = name + if tag == "" { + return + } + p.Parse(tag) + p.setFieldProps(typ, f, lockGetProp) +} + +var ( + propertiesMu sync.RWMutex + propertiesMap = make(map[reflect.Type]*StructProperties) +) + +// GetProperties returns the list of properties for the type represented by t. +// t must represent a generated struct type of a protocol message. +func GetProperties(t reflect.Type) *StructProperties { + if t.Kind() != reflect.Struct { + panic("proto: type must have kind struct") + } + + // Most calls to GetProperties in a long-running program will be + // retrieving details for types we have seen before. + propertiesMu.RLock() + sprop, ok := propertiesMap[t] + propertiesMu.RUnlock() + if ok { + return sprop + } + + propertiesMu.Lock() + sprop = getPropertiesLocked(t) + propertiesMu.Unlock() + return sprop +} + +type ( + oneofFuncsIface interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + oneofWrappersIface interface { + XXX_OneofWrappers() []interface{} + } +) + +// getPropertiesLocked requires that propertiesMu is held. +func getPropertiesLocked(t reflect.Type) *StructProperties { + if prop, ok := propertiesMap[t]; ok { + return prop + } + + prop := new(StructProperties) + // in case of recursive protos, fill this in now. + propertiesMap[t] = prop + + // build properties + prop.Prop = make([]*Properties, t.NumField()) + prop.order = make([]int, t.NumField()) + + isOneofMessage := false + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + p := new(Properties) + name := f.Name + p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + isOneofMessage = true + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof + } + prop.Prop[i] = p + prop.order[i] = i + if debug { + print(i, " ", f.Name, " ", t.String(), " ") + if p.Tag > 0 { + print(p.String()) + } + print("\n") + } + } + + // Re-order prop.order. + sort.Sort(prop) + + if isOneofMessage { + var oots []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oots = m.XXX_OneofFuncs() + case oneofWrappersIface: + oots = m.XXX_OneofWrappers() + } + if len(oots) > 0 { + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), + } + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break + } + prop.OneofTypes[oop.Prop.OrigName] = oop + } + } + } + + // build required counts + // build tags + reqCount := 0 + prop.decoderOrigNames = make(map[string]int) + for i, p := range prop.Prop { + if strings.HasPrefix(p.Name, "XXX_") { + // Internal fields should not appear in tags/origNames maps. + // They are handled specially when encoding and decoding. + continue + } + if p.Required { + reqCount++ + } + prop.decoderTags.put(p.Tag, i) + prop.decoderOrigNames[p.OrigName] = i + } + prop.reqCount = reqCount + + return prop +} + +// A global registry of enum types. +// The generated code will register the generated maps by calling RegisterEnum. + +var enumValueMaps = make(map[string]map[string]int32) +var enumStringMaps = make(map[string]map[int32]string) + +// RegisterEnum is called from the generated code to install the enum descriptor +// maps into the global table to aid parsing text format protocol buffers. +func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { + if _, ok := enumValueMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumValueMaps[typeName] = valueMap + if _, ok := enumStringMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumStringMaps[typeName] = unusedNameMap +} + +// EnumValueMap returns the mapping from names to integers of the +// enum type enumType, or a nil if not found. +func EnumValueMap(enumType string) map[string]int32 { + return enumValueMaps[enumType] +} + +// A registry of all linked message types. +// The string is a fully-qualified proto name ("pkg.Message"). +var ( + protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers + protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types + revProtoTypes = make(map[reflect.Type]string) +) + +// RegisterType is called from generated code and maps from the fully qualified +// proto name to the type (pointer to struct) of the protocol buffer. +func RegisterType(x Message, name string) { + if _, ok := protoTypedNils[name]; ok { + // TODO: Some day, make this a panic. + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { + // Generated code always calls RegisterType with nil x. + // This check is just for extra safety. + protoTypedNils[name] = x + } else { + protoTypedNils[name] = reflect.Zero(t).Interface().(Message) + } + revProtoTypes[t] = name +} + +// RegisterMapType is called from generated code and maps from the fully qualified +// proto name to the native map type of the proto map definition. +func RegisterMapType(x interface{}, name string) { + if reflect.TypeOf(x).Kind() != reflect.Map { + panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) + } + if _, ok := protoMapTypes[name]; ok { + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoMapTypes[name] = t + revProtoTypes[t] = name +} + +// MessageName returns the fully-qualified proto name for the given message type. +func MessageName(x Message) string { + type xname interface { + XXX_MessageName() string + } + if m, ok := x.(xname); ok { + return m.XXX_MessageName() + } + return revProtoTypes[reflect.TypeOf(x)] +} + +// MessageType returns the message type (pointer to struct) for a named message. +// The type is not guaranteed to implement proto.Message if the name refers to a +// map entry. +func MessageType(name string) reflect.Type { + if t, ok := protoTypedNils[name]; ok { + return reflect.TypeOf(t) + } + return protoMapTypes[name] +} + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/gogo/protobuf/proto/properties_gogo.go b/vendor/github.com/gogo/protobuf/proto/properties_gogo.go new file mode 100644 index 00000000..40ea3dd9 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/properties_gogo.go @@ -0,0 +1,36 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" +) + +var sizerType = reflect.TypeOf((*Sizer)(nil)).Elem() +var protosizerType = reflect.TypeOf((*ProtoSizer)(nil)).Elem() diff --git a/vendor/github.com/gogo/protobuf/proto/skip_gogo.go b/vendor/github.com/gogo/protobuf/proto/skip_gogo.go new file mode 100644 index 00000000..5a5fd93f --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/skip_gogo.go @@ -0,0 +1,119 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "io" +) + +func Skip(data []byte) (n int, err error) { + l := len(data) + index := 0 + for index < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + b := data[index] + index++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + index++ + if data[index-1] < 0x80 { + break + } + } + return index, nil + case 1: + index += 8 + return index, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + b := data[index] + index++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + index += length + return index, nil + case 3: + for { + var innerWire uint64 + var start int = index + for shift := uint(0); ; shift += 7 { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + b := data[index] + index++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := Skip(data[start:]) + if err != nil { + return 0, err + } + index = start + next + } + return index, nil + case 4: + return index, nil + case 5: + index += 4 + return index, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_marshal.go b/vendor/github.com/gogo/protobuf/proto/table_marshal.go new file mode 100644 index 00000000..f8babdef --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_marshal.go @@ -0,0 +1,3009 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// a sizer takes a pointer to a field and the size of its tag, computes the size of +// the encoded data. +type sizer func(pointer, int) int + +// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), +// marshals the field to the end of the slice, returns the slice and error (if any). +type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) + +// marshalInfo is the information used for marshaling a message. +type marshalInfo struct { + typ reflect.Type + fields []*marshalFieldInfo + unrecognized field // offset of XXX_unrecognized + extensions field // offset of XXX_InternalExtensions + v1extensions field // offset of XXX_extensions + sizecache field // offset of XXX_sizecache + initialized int32 // 0 -- only typ is set, 1 -- fully initialized + messageset bool // uses message set wire format + hasmarshaler bool // has custom marshaler + sync.RWMutex // protect extElems map, also for initialization + extElems map[int32]*marshalElemInfo // info of extension elements + + hassizer bool // has custom sizer + hasprotosizer bool // has custom protosizer + + bytesExtensions field // offset of XXX_extensions where the field type is []byte +} + +// marshalFieldInfo is the information used for marshaling a field of a message. +type marshalFieldInfo struct { + field field + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isPointer bool + required bool // field is required + name string // name of the field, for error reporting + oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements +} + +// marshalElemInfo is the information used for marshaling an extension or oneof element. +type marshalElemInfo struct { + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) +} + +var ( + marshalInfoMap = map[reflect.Type]*marshalInfo{} + marshalInfoLock sync.Mutex + + uint8SliceType = reflect.TypeOf(([]uint8)(nil)).Kind() +) + +// getMarshalInfo returns the information to marshal a given type of message. +// The info it returns may not necessarily initialized. +// t is the type of the message (NOT the pointer to it). +func getMarshalInfo(t reflect.Type) *marshalInfo { + marshalInfoLock.Lock() + u, ok := marshalInfoMap[t] + if !ok { + u = &marshalInfo{typ: t} + marshalInfoMap[t] = u + } + marshalInfoLock.Unlock() + return u +} + +// Size is the entry point from generated code, +// and should be ONLY called by generated code. +// It computes the size of encoded data of msg. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Size(msg Message) int { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return 0 + } + return u.size(ptr) +} + +// Marshal is the entry point from generated code, +// and should be ONLY called by generated code. +// It marshals msg to the end of b. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return b, ErrNil + } + return u.marshal(b, ptr, deterministic) +} + +func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { + // u := a.marshal, but atomically. + // We use an atomic here to ensure memory consistency. + u := atomicLoadMarshalInfo(&a.marshal) + if u == nil { + // Get marshal information from type of message. + t := reflect.ValueOf(msg).Type() + if t.Kind() != reflect.Ptr { + panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) + } + u = getMarshalInfo(t.Elem()) + // Store it in the cache for later users. + // a.marshal = u, but atomically. + atomicStoreMarshalInfo(&a.marshal, u) + } + return u +} + +// size is the main function to compute the size of the encoded data of a message. +// ptr is the pointer to the message. +func (u *marshalInfo) size(ptr pointer) int { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + // Uses the message's Size method if available + if u.hassizer { + s := ptr.asPointerTo(u.typ).Interface().(Sizer) + return s.Size() + } + // Uses the message's ProtoSize method if available + if u.hasprotosizer { + s := ptr.asPointerTo(u.typ).Interface().(ProtoSizer) + return s.ProtoSize() + } + + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b, _ := m.Marshal() + return len(b) + } + + n := 0 + for _, f := range u.fields { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + n += f.sizer(ptr.offset(f.field), f.tagsize) + } + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + n += u.sizeMessageSet(e) + } else { + n += u.sizeExtensions(e) + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + n += u.sizeV1Extensions(m) + } + if u.bytesExtensions.IsValid() { + s := *ptr.offset(u.bytesExtensions).toBytes() + n += len(s) + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + n += len(s) + } + + // cache the result for use in marshal + if u.sizecache.IsValid() { + atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) + } + return n +} + +// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), +// fall back to compute the size. +func (u *marshalInfo) cachedsize(ptr pointer) int { + if u.sizecache.IsValid() { + return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) + } + return u.size(ptr) +} + +// marshal is the main function to marshal a message. It takes a byte slice and appends +// the encoded data to the end of the slice, returns the slice and error (if any). +// ptr is the pointer to the message. +// If deterministic is true, map is marshaled in deterministic order. +func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b1, err := m.Marshal() + b = append(b, b1...) + return b, err + } + + var err, errLater error + // The old marshaler encodes extensions at beginning. + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + b, err = u.appendMessageSet(b, e, deterministic) + } else { + b, err = u.appendExtensions(b, e, deterministic) + } + if err != nil { + return b, err + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + b, err = u.appendV1Extensions(b, m, deterministic) + if err != nil { + return b, err + } + } + if u.bytesExtensions.IsValid() { + s := *ptr.offset(u.bytesExtensions).toBytes() + b = append(b, s...) + } + for _, f := range u.fields { + if f.required { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // Required field is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name} + } + continue + } + } + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) + if err != nil { + if err1, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name + "." + err1.field} + } + continue + } + if err == errRepeatedHasNil { + err = errors.New("proto: repeated field " + f.name + " has nil element") + } + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return b, err + } + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + b = append(b, s...) + } + return b, errLater +} + +// computeMarshalInfo initializes the marshal info. +func (u *marshalInfo) computeMarshalInfo() { + u.Lock() + defer u.Unlock() + if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock + return + } + + t := u.typ + u.unrecognized = invalidField + u.extensions = invalidField + u.v1extensions = invalidField + u.bytesExtensions = invalidField + u.sizecache = invalidField + isOneofMessage := false + + if reflect.PtrTo(t).Implements(sizerType) { + u.hassizer = true + } + if reflect.PtrTo(t).Implements(protosizerType) { + u.hasprotosizer = true + } + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if reflect.PtrTo(t).Implements(marshalerType) { + u.hasmarshaler = true + atomic.StoreInt32(&u.initialized, 1) + return + } + + n := t.NumField() + + // deal with XXX fields first + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Tag.Get("protobuf_oneof") != "" { + isOneofMessage = true + } + if !strings.HasPrefix(f.Name, "XXX_") { + continue + } + switch f.Name { + case "XXX_sizecache": + u.sizecache = toField(&f) + case "XXX_unrecognized": + u.unrecognized = toField(&f) + case "XXX_InternalExtensions": + u.extensions = toField(&f) + u.messageset = f.Tag.Get("protobuf_messageset") == "1" + case "XXX_extensions": + if f.Type.Kind() == reflect.Map { + u.v1extensions = toField(&f) + } else { + u.bytesExtensions = toField(&f) + } + case "XXX_NoUnkeyedLiteral": + // nothing to do + default: + panic("unknown XXX field: " + f.Name) + } + n-- + } + + // get oneof implementers + var oneofImplementers []interface{} + // gogo: isOneofMessage is needed for embedded oneof messages, without a marshaler and unmarshaler + if isOneofMessage { + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + } + + // normal fields + fields := make([]marshalFieldInfo, n) // batch allocation + u.fields = make([]*marshalFieldInfo, 0, n) + for i, j := 0, 0; i < t.NumField(); i++ { + f := t.Field(i) + + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + field := &fields[j] + j++ + field.name = f.Name + u.fields = append(u.fields, field) + if f.Tag.Get("protobuf_oneof") != "" { + field.computeOneofFieldInfo(&f, oneofImplementers) + continue + } + if f.Tag.Get("protobuf") == "" { + // field has no tag (not in generated message), ignore it + u.fields = u.fields[:len(u.fields)-1] + j-- + continue + } + field.computeMarshalFieldInfo(&f) + } + + // fields are marshaled in tag order on the wire. + sort.Sort(byTag(u.fields)) + + atomic.StoreInt32(&u.initialized, 1) +} + +// helper for sorting fields by tag +type byTag []*marshalFieldInfo + +func (a byTag) Len() int { return len(a) } +func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } + +// getExtElemInfo returns the information to marshal an extension element. +// The info it returns is initialized. +func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { + // get from cache first + u.RLock() + e, ok := u.extElems[desc.Field] + u.RUnlock() + if ok { + return e + } + + t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct + tags := strings.Split(desc.Tag, ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizr, marshalr := typeMarshaler(t, tags, false, false) + e = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizr, + marshaler: marshalr, + isptr: t.Kind() == reflect.Ptr, + } + + // update cache + u.Lock() + if u.extElems == nil { + u.extElems = make(map[int32]*marshalElemInfo) + } + u.extElems[desc.Field] = e + u.Unlock() + return e +} + +// computeMarshalFieldInfo fills up the information to marshal a field. +func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { + // parse protobuf tag of the field. + // tag has format of "bytes,49,opt,name=foo,def=hello!" + tags := strings.Split(f.Tag.Get("protobuf"), ",") + if tags[0] == "" { + return + } + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if tags[2] == "req" { + fi.required = true + } + fi.setTag(f, tag, wt) + fi.setMarshaler(f, tags) +} + +func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { + fi.field = toField(f) + fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. + fi.isPointer = true + fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) + fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) + + ityp := f.Type // interface type + for _, o := range oneofImplementers { + t := reflect.TypeOf(o) + if !t.Implements(ityp) { + continue + } + sf := t.Elem().Field(0) // oneof implementer is a struct with a single field + tags := strings.Split(sf.Tag.Get("protobuf"), ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizr, marshalr := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value + fi.oneofElems[t.Elem()] = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizr, + marshaler: marshalr, + } + } +} + +// wiretype returns the wire encoding of the type. +func wiretype(encoding string) uint64 { + switch encoding { + case "fixed32": + return WireFixed32 + case "fixed64": + return WireFixed64 + case "varint", "zigzag32", "zigzag64": + return WireVarint + case "bytes": + return WireBytes + case "group": + return WireStartGroup + } + panic("unknown wire type " + encoding) +} + +// setTag fills up the tag (in wire format) and its size in the info of a field. +func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { + fi.field = toField(f) + fi.wiretag = uint64(tag)<<3 | wt + fi.tagsize = SizeVarint(uint64(tag) << 3) +} + +// setMarshaler fills up the sizer and marshaler in the info of a field. +func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { + switch f.Type.Kind() { + case reflect.Map: + // map field + fi.isPointer = true + fi.sizer, fi.marshaler = makeMapMarshaler(f) + return + case reflect.Ptr, reflect.Slice: + fi.isPointer = true + } + fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) +} + +// typeMarshaler returns the sizer and marshaler of a given field. +// t is the type of the field. +// tags is the generated "protobuf" tag of the field. +// If nozero is true, zero value is not marshaled to the wire. +// If oneof is true, it is a oneof field. +func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { + encoding := tags[0] + + pointer := false + slice := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + packed := false + proto3 := false + ctype := false + isTime := false + isDuration := false + isWktPointer := false + validateUTF8 := true + for i := 2; i < len(tags); i++ { + if tags[i] == "packed" { + packed = true + } + if tags[i] == "proto3" { + proto3 = true + } + if strings.HasPrefix(tags[i], "customtype=") { + ctype = true + } + if tags[i] == "stdtime" { + isTime = true + } + if tags[i] == "stdduration" { + isDuration = true + } + if tags[i] == "wktptr" { + isWktPointer = true + } + } + validateUTF8 = validateUTF8 && proto3 + if !proto3 && !pointer && !slice { + nozero = false + } + + if ctype { + if reflect.PtrTo(t).Implements(customType) { + if slice { + return makeMessageRefSliceMarshaler(getMarshalInfo(t)) + } + if pointer { + return makeCustomPtrMarshaler(getMarshalInfo(t)) + } + return makeCustomMarshaler(getMarshalInfo(t)) + } else { + panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t)) + } + } + + if isTime { + if pointer { + if slice { + return makeTimePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeTimePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeTimeSliceMarshaler(getMarshalInfo(t)) + } + return makeTimeMarshaler(getMarshalInfo(t)) + } + + if isDuration { + if pointer { + if slice { + return makeDurationPtrSliceMarshaler(getMarshalInfo(t)) + } + return makeDurationPtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeDurationSliceMarshaler(getMarshalInfo(t)) + } + return makeDurationMarshaler(getMarshalInfo(t)) + } + + if isWktPointer { + switch t.Kind() { + case reflect.Float64: + if pointer { + if slice { + return makeStdDoubleValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdDoubleValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdDoubleValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdDoubleValueMarshaler(getMarshalInfo(t)) + case reflect.Float32: + if pointer { + if slice { + return makeStdFloatValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdFloatValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdFloatValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdFloatValueMarshaler(getMarshalInfo(t)) + case reflect.Int64: + if pointer { + if slice { + return makeStdInt64ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt64ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdInt64ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt64ValueMarshaler(getMarshalInfo(t)) + case reflect.Uint64: + if pointer { + if slice { + return makeStdUInt64ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt64ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdUInt64ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt64ValueMarshaler(getMarshalInfo(t)) + case reflect.Int32: + if pointer { + if slice { + return makeStdInt32ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt32ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdInt32ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt32ValueMarshaler(getMarshalInfo(t)) + case reflect.Uint32: + if pointer { + if slice { + return makeStdUInt32ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt32ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdUInt32ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt32ValueMarshaler(getMarshalInfo(t)) + case reflect.Bool: + if pointer { + if slice { + return makeStdBoolValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBoolValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdBoolValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBoolValueMarshaler(getMarshalInfo(t)) + case reflect.String: + if pointer { + if slice { + return makeStdStringValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdStringValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdStringValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdStringValueMarshaler(getMarshalInfo(t)) + case uint8SliceType: + if pointer { + if slice { + return makeStdBytesValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBytesValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdBytesValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBytesValueMarshaler(getMarshalInfo(t)) + default: + panic(fmt.Sprintf("unknown wktpointer type %#v", t)) + } + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return sizeBoolPtr, appendBoolPtr + } + if slice { + if packed { + return sizeBoolPackedSlice, appendBoolPackedSlice + } + return sizeBoolSlice, appendBoolSlice + } + if nozero { + return sizeBoolValueNoZero, appendBoolValueNoZero + } + return sizeBoolValue, appendBoolValue + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixed32Ptr, appendFixed32Ptr + } + if slice { + if packed { + return sizeFixed32PackedSlice, appendFixed32PackedSlice + } + return sizeFixed32Slice, appendFixed32Slice + } + if nozero { + return sizeFixed32ValueNoZero, appendFixed32ValueNoZero + } + return sizeFixed32Value, appendFixed32Value + case "varint": + if pointer { + return sizeVarint32Ptr, appendVarint32Ptr + } + if slice { + if packed { + return sizeVarint32PackedSlice, appendVarint32PackedSlice + } + return sizeVarint32Slice, appendVarint32Slice + } + if nozero { + return sizeVarint32ValueNoZero, appendVarint32ValueNoZero + } + return sizeVarint32Value, appendVarint32Value + } + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixedS32Ptr, appendFixedS32Ptr + } + if slice { + if packed { + return sizeFixedS32PackedSlice, appendFixedS32PackedSlice + } + return sizeFixedS32Slice, appendFixedS32Slice + } + if nozero { + return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero + } + return sizeFixedS32Value, appendFixedS32Value + case "varint": + if pointer { + return sizeVarintS32Ptr, appendVarintS32Ptr + } + if slice { + if packed { + return sizeVarintS32PackedSlice, appendVarintS32PackedSlice + } + return sizeVarintS32Slice, appendVarintS32Slice + } + if nozero { + return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero + } + return sizeVarintS32Value, appendVarintS32Value + case "zigzag32": + if pointer { + return sizeZigzag32Ptr, appendZigzag32Ptr + } + if slice { + if packed { + return sizeZigzag32PackedSlice, appendZigzag32PackedSlice + } + return sizeZigzag32Slice, appendZigzag32Slice + } + if nozero { + return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero + } + return sizeZigzag32Value, appendZigzag32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixed64Ptr, appendFixed64Ptr + } + if slice { + if packed { + return sizeFixed64PackedSlice, appendFixed64PackedSlice + } + return sizeFixed64Slice, appendFixed64Slice + } + if nozero { + return sizeFixed64ValueNoZero, appendFixed64ValueNoZero + } + return sizeFixed64Value, appendFixed64Value + case "varint": + if pointer { + return sizeVarint64Ptr, appendVarint64Ptr + } + if slice { + if packed { + return sizeVarint64PackedSlice, appendVarint64PackedSlice + } + return sizeVarint64Slice, appendVarint64Slice + } + if nozero { + return sizeVarint64ValueNoZero, appendVarint64ValueNoZero + } + return sizeVarint64Value, appendVarint64Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixedS64Ptr, appendFixedS64Ptr + } + if slice { + if packed { + return sizeFixedS64PackedSlice, appendFixedS64PackedSlice + } + return sizeFixedS64Slice, appendFixedS64Slice + } + if nozero { + return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero + } + return sizeFixedS64Value, appendFixedS64Value + case "varint": + if pointer { + return sizeVarintS64Ptr, appendVarintS64Ptr + } + if slice { + if packed { + return sizeVarintS64PackedSlice, appendVarintS64PackedSlice + } + return sizeVarintS64Slice, appendVarintS64Slice + } + if nozero { + return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero + } + return sizeVarintS64Value, appendVarintS64Value + case "zigzag64": + if pointer { + return sizeZigzag64Ptr, appendZigzag64Ptr + } + if slice { + if packed { + return sizeZigzag64PackedSlice, appendZigzag64PackedSlice + } + return sizeZigzag64Slice, appendZigzag64Slice + } + if nozero { + return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero + } + return sizeZigzag64Value, appendZigzag64Value + } + case reflect.Float32: + if pointer { + return sizeFloat32Ptr, appendFloat32Ptr + } + if slice { + if packed { + return sizeFloat32PackedSlice, appendFloat32PackedSlice + } + return sizeFloat32Slice, appendFloat32Slice + } + if nozero { + return sizeFloat32ValueNoZero, appendFloat32ValueNoZero + } + return sizeFloat32Value, appendFloat32Value + case reflect.Float64: + if pointer { + return sizeFloat64Ptr, appendFloat64Ptr + } + if slice { + if packed { + return sizeFloat64PackedSlice, appendFloat64PackedSlice + } + return sizeFloat64Slice, appendFloat64Slice + } + if nozero { + return sizeFloat64ValueNoZero, appendFloat64ValueNoZero + } + return sizeFloat64Value, appendFloat64Value + case reflect.String: + if validateUTF8 { + if pointer { + return sizeStringPtr, appendUTF8StringPtr + } + if slice { + return sizeStringSlice, appendUTF8StringSlice + } + if nozero { + return sizeStringValueNoZero, appendUTF8StringValueNoZero + } + return sizeStringValue, appendUTF8StringValue + } + if pointer { + return sizeStringPtr, appendStringPtr + } + if slice { + return sizeStringSlice, appendStringSlice + } + if nozero { + return sizeStringValueNoZero, appendStringValueNoZero + } + return sizeStringValue, appendStringValue + case reflect.Slice: + if slice { + return sizeBytesSlice, appendBytesSlice + } + if oneof { + // Oneof bytes field may also have "proto3" tag. + // We want to marshal it as a oneof field. Do this + // check before the proto3 check. + return sizeBytesOneof, appendBytesOneof + } + if proto3 { + return sizeBytes3, appendBytes3 + } + return sizeBytes, appendBytes + case reflect.Struct: + switch encoding { + case "group": + if slice { + return makeGroupSliceMarshaler(getMarshalInfo(t)) + } + return makeGroupMarshaler(getMarshalInfo(t)) + case "bytes": + if pointer { + if slice { + return makeMessageSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageMarshaler(getMarshalInfo(t)) + } else { + if slice { + return makeMessageRefSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageRefMarshaler(getMarshalInfo(t)) + } + } + } + panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) +} + +// Below are functions to size/marshal a specific type of a field. +// They are stored in the field's info, and called by function pointers. +// They have type sizer or marshaler. + +func sizeFixed32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixedS32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFloat32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + return (4 + tagsize) * len(s) +} +func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixed64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFixedS64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFloat64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + return (8 + tagsize) * len(s) +} +func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeVarint32Value(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarint32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarint64Value(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + return SizeVarint(v) + tagsize +} +func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return SizeVarint(v) + tagsize +} +func sizeVarint64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return SizeVarint(*p) + tagsize +} +func sizeVarint64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(v) + tagsize + } + return n +} +func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize + } + return n +} +func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize + } + return n +} +func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeBoolValue(_ pointer, tagsize int) int { + return 1 + tagsize +} +func sizeBoolValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toBool() + if !v { + return 0 + } + return 1 + tagsize +} +func sizeBoolPtr(ptr pointer, tagsize int) int { + p := *ptr.toBoolPtr() + if p == nil { + return 0 + } + return 1 + tagsize +} +func sizeBoolSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + return (1 + tagsize) * len(s) +} +func sizeBoolPackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return 0 + } + return len(s) + SizeVarint(uint64(len(s))) + tagsize +} +func sizeStringValue(ptr pointer, tagsize int) int { + v := *ptr.toString() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toString() + if v == "" { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringPtr(ptr pointer, tagsize int) int { + p := *ptr.toStringPtr() + if p == nil { + return 0 + } + v := *p + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringSlice(ptr pointer, tagsize int) int { + s := *ptr.toStringSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} +func sizeBytes(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if v == nil { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytes3(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if len(v) == 0 { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesOneof(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesSlice(ptr pointer, tagsize int) int { + s := *ptr.toBytesSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} + +// appendFixed32 appends an encoded fixed32 to b. +func appendFixed32(b []byte, v uint32) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24)) + return b +} + +// appendFixed64 appends an encoded fixed64 to b. +func appendFixed64(b []byte, v uint64) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24), + byte(v>>32), + byte(v>>40), + byte(v>>48), + byte(v>>56)) + return b +} + +// appendVarint appends an encoded varint to b. +func appendVarint(b []byte, v uint64) []byte { + // TODO: make 1-byte (maybe 2-byte) case inline-able, once we + // have non-leaf inliner. + switch { + case v < 1<<7: + b = append(b, byte(v)) + case v < 1<<14: + b = append(b, + byte(v&0x7f|0x80), + byte(v>>7)) + case v < 1<<21: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte(v>>14)) + case v < 1<<28: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte(v>>21)) + case v < 1<<35: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte(v>>28)) + case v < 1<<42: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte(v>>35)) + case v < 1<<49: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte(v>>42)) + case v < 1<<56: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte(v>>49)) + case v < 1<<63: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte(v>>56)) + default: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte((v>>56)&0x7f|0x80), + 1) + } + return b +} + +func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, *p) + return b, nil +} +func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(*p)) + return b, nil +} +func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(*p)) + return b, nil +} +func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, *p) + return b, nil +} +func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(*p)) + return b, nil +} +func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(*p)) + return b, nil +} +func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, *p) + return b, nil +} +func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + } + return b, nil +} +func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, v) + } + return b, nil +} +func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + if !v { + return b, nil + } + b = appendVarint(b, wiretag) + b = append(b, 1) + return b, nil +} + +func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toBoolPtr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + if *p { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(len(s))) + for _, v := range s { + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + if v == "" { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toStringSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} +func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if v == "" { + return b, nil + } + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + s := *ptr.toStringSlice() + for _, v := range s { + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if v == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if len(v) == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBytesSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} + +// makeGroupMarshaler returns the sizer and marshaler for a group. +// u is the marshal info of the underlying message. +func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + return u.size(p) + 2*tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + var err error + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, p, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + return b, err + } +} + +// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. +// u is the marshal info of the underlying message. +func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + n += u.size(v) + 2*tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, v, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMessageMarshaler returns the sizer and marshaler for a message field. +// u is the marshal info of the message. +func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.size(p) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(p) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, p, deterministic) + } +} + +// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. +// u is the marshal info of the message. +func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMapMarshaler returns the sizer and marshaler for a map field. +// f is the pointer to the reflect data structure of the field. +func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { + // figure out key and value type + t := f.Type + keyType := t.Key() + valType := t.Elem() + tags := strings.Split(f.Tag.Get("protobuf"), ",") + keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + stdOptions := false + for _, t := range tags { + if strings.HasPrefix(t, "customtype=") { + valTags = append(valTags, t) + } + if t == "stdtime" { + valTags = append(valTags, t) + stdOptions = true + } + if t == "stdduration" { + valTags = append(valTags, t) + stdOptions = true + } + if t == "wktptr" { + valTags = append(valTags, t) + } + } + keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map + valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map + keyWireTag := 1<<3 | wiretype(keyTags[0]) + valWireTag := 2<<3 | wiretype(valTags[0]) + + // We create an interface to get the addresses of the map key and value. + // If value is pointer-typed, the interface is a direct interface, the + // idata itself is the value. Otherwise, the idata is the pointer to the + // value. + // Key cannot be pointer-typed. + valIsPtr := valType.Kind() == reflect.Ptr + + // If value is a message with nested maps, calling + // valSizer in marshal may be quadratic. We should use + // cached version in marshal (but not in size). + // If value is not message type, we don't have size cache, + // but it cannot be nested either. Just use valSizer. + valCachedSizer := valSizer + if valIsPtr && !stdOptions && valType.Elem().Kind() == reflect.Struct { + u := getMarshalInfo(valType.Elem()) + valCachedSizer = func(ptr pointer, tagsize int) int { + // Same as message sizer, but use cache. + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.cachedsize(p) + return siz + SizeVarint(uint64(siz)) + tagsize + } + } + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(t).Elem() // the map + n := 0 + for _, k := range m.MapKeys() { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(t).Elem() // the map + var err error + keys := m.MapKeys() + if len(keys) > 1 && deterministic { + sort.Sort(mapKeys(keys)) + } + + var nerr nonFatal + for _, k := range keys { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + b = appendVarint(b, tag) + siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + b = appendVarint(b, uint64(siz)) + b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) + if !nerr.Merge(err) { + return b, err + } + b, err = valMarshaler(b, vaddr, valWireTag, deterministic) + if err != ErrNil && !nerr.Merge(err) { // allow nil value in map + return b, err + } + } + return b, nerr.E + } +} + +// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. +// fi is the marshal info of the field. +// f is the pointer to the reflect data structure of the field. +func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { + // Oneof field is an interface. We need to get the actual data type on the fly. + t := f.Type + return func(ptr pointer, _ int) int { + p := ptr.getInterfacePointer() + if p.isNil() { + return 0 + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + e := fi.oneofElems[telem] + return e.sizer(p, e.tagsize) + }, + func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { + p := ptr.getInterfacePointer() + if p.isNil() { + return b, nil + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { + return b, errOneofHasNil + } + e := fi.oneofElems[telem] + return e.marshaler(b, p, e.wiretag, deterministic) + } +} + +// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. +func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + mu.Unlock() + return n +} + +// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. +func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + // Not sure this is required, but the old code does it. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// message set format is: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } + +// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field +// in message set format (above). +func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for id, e := range m { + n += 2 // start group, end group. tag = 1 (size=1) + n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + siz := len(msgWithLen) + n += siz + 1 // message, tag = 3 (size=1) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, 1) // message, tag = 3 (size=1) + } + mu.Unlock() + return n +} + +// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) +// to the end of byte slice b. +func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for id, e := range m { + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + if !nerr.Merge(err) { + return b, err + } + b = append(b, 1<<3|WireEndGroup) + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, id := range keys { + e := m[int32(id)] + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + b = append(b, 1<<3|WireEndGroup) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// sizeV1Extensions computes the size of encoded data for a V1-API extension field. +func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { + if m == nil { + return 0 + } + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + return n +} + +// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. +func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { + if m == nil { + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + var err error + var nerr nonFatal + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// newMarshaler is the interface representing objects that can marshal themselves. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newMarshaler interface { + XXX_Size() int + XXX_Marshal(b []byte, deterministic bool) ([]byte, error) +} + +// Size returns the encoded size of a protocol buffer message. +// This is the main entry point. +func Size(pb Message) int { + if m, ok := pb.(newMarshaler); ok { + return m.XXX_Size() + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, _ := m.Marshal() + return len(b) + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return 0 + } + var info InternalMessageInfo + return info.Size(pb) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, returning the data. +// This is the main entry point. +func Marshal(pb Message) ([]byte, error) { + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + b := make([]byte, 0, siz) + return m.XXX_Marshal(b, false) + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + return m.Marshal() + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return nil, ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + b := make([]byte, 0, siz) + return info.Marshal(b, pb, false) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, writing the result to the +// Buffer. +// This is an alternative entry point. It is not necessary to use +// a Buffer for most applications. +func (p *Buffer) Marshal(pb Message) error { + var err error + if p.deterministic { + if _, ok := pb.(Marshaler); ok { + return fmt.Errorf("proto: deterministic not supported by the Marshal method of %T", pb) + } + } + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + p.grow(siz) // make sure buf has enough capacity + pp := p.buf[len(p.buf) : len(p.buf) : len(p.buf)+siz] + pp, err = m.XXX_Marshal(pp, p.deterministic) + p.buf = append(p.buf, pp...) + return err + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + var b []byte + b, err = m.Marshal() + p.buf = append(p.buf, b...) + return err + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + p.grow(siz) // make sure buf has enough capacity + p.buf, err = info.Marshal(p.buf, pb, p.deterministic) + return err +} + +// grow grows the buffer's capacity, if necessary, to guarantee space for +// another n bytes. After grow(n), at least n bytes can be written to the +// buffer without another allocation. +func (p *Buffer) grow(n int) { + need := len(p.buf) + n + if need <= cap(p.buf) { + return + } + newCap := len(p.buf) * 2 + if newCap < need { + newCap = need + } + p.buf = append(make([]byte, 0, newCap), p.buf...) +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go b/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go new file mode 100644 index 00000000..997f57c1 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go @@ -0,0 +1,388 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" + "time" +) + +// makeMessageRefMarshaler differs a bit from makeMessageMarshaler +// It marshal a message T instead of a *T +func makeMessageRefMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + siz := u.size(ptr) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + b = appendVarint(b, wiretag) + siz := u.cachedsize(ptr) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, ptr, deterministic) + } +} + +// makeMessageRefSliceMarshaler differs quite a lot from makeMessageSliceMarshaler +// It marshals a slice of messages []T instead of []*T +func makeMessageRefSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + e := elem.Interface() + v := toAddrPointer(&e, false) + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + var err, errreq error + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + e := elem.Interface() + v := toAddrPointer(&e, false) + b = appendVarint(b, wiretag) + siz := u.size(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if err != nil { + if _, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errreq == nil { + errreq = err + } + continue + } + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + + return b, errreq + } +} + +func makeCustomPtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + m := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(custom) + siz := m.Size() + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + m := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(custom) + siz := m.Size() + buf, err := m.Marshal() + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + return b, nil + } +} + +func makeCustomMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(u.typ).Interface().(custom) + siz := m.Size() + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(u.typ).Interface().(custom) + siz := m.Size() + buf, err := m.Marshal() + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + return b, nil + } +} + +func makeTimeMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return 0 + } + siz := Size(ts) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return nil, err + } + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeTimePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return 0 + } + siz := Size(ts) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return nil, err + } + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeTimeSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(time.Time) + ts, err := timestampProto(t) + if err != nil { + return 0 + } + siz := Size(ts) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(time.Time) + ts, err := timestampProto(t) + if err != nil { + return nil, err + } + siz := Size(ts) + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeTimePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return 0 + } + siz := Size(ts) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return nil, err + } + siz := Size(ts) + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeDurationMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + d := ptr.asPointerTo(u.typ).Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + d := ptr.asPointerTo(u.typ).Interface().(*time.Duration) + dur := durationProto(*d) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeDurationPtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + d := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + d := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Duration) + dur := durationProto(*d) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeDurationSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(time.Duration) + dur := durationProto(d) + siz := Size(dur) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(time.Duration) + dur := durationProto(d) + siz := Size(dur) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeDurationPtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_merge.go b/vendor/github.com/gogo/protobuf/proto/table_merge.go new file mode 100644 index 00000000..60dcf70d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_merge.go @@ -0,0 +1,676 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +// Merge merges the src message into dst. +// This assumes that dst and src of the same type and are non-nil. +func (a *InternalMessageInfo) Merge(dst, src Message) { + mi := atomicLoadMergeInfo(&a.merge) + if mi == nil { + mi = getMergeInfo(reflect.TypeOf(dst).Elem()) + atomicStoreMergeInfo(&a.merge, mi) + } + mi.merge(toPointer(&dst), toPointer(&src)) +} + +type mergeInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []mergeFieldInfo + unrecognized field // Offset of XXX_unrecognized +} + +type mergeFieldInfo struct { + field field // Offset of field, guaranteed to be valid + + // isPointer reports whether the value in the field is a pointer. + // This is true for the following situations: + // * Pointer to struct + // * Pointer to basic type (proto2 only) + // * Slice (first value in slice header is a pointer) + // * String (first value in string header is a pointer) + isPointer bool + + // basicWidth reports the width of the field assuming that it is directly + // embedded in the struct (as is the case for basic types in proto3). + // The possible values are: + // 0: invalid + // 1: bool + // 4: int32, uint32, float32 + // 8: int64, uint64, float64 + basicWidth int + + // Where dst and src are pointers to the types being merged. + merge func(dst, src pointer) +} + +var ( + mergeInfoMap = map[reflect.Type]*mergeInfo{} + mergeInfoLock sync.Mutex +) + +func getMergeInfo(t reflect.Type) *mergeInfo { + mergeInfoLock.Lock() + defer mergeInfoLock.Unlock() + mi := mergeInfoMap[t] + if mi == nil { + mi = &mergeInfo{typ: t} + mergeInfoMap[t] = mi + } + return mi +} + +// merge merges src into dst assuming they are both of type *mi.typ. +func (mi *mergeInfo) merge(dst, src pointer) { + if dst.isNil() { + panic("proto: nil destination") + } + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&mi.initialized) == 0 { + mi.computeMergeInfo() + } + + for _, fi := range mi.fields { + sfp := src.offset(fi.field) + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string + continue + } + if fi.basicWidth > 0 { + switch { + case fi.basicWidth == 1 && !*sfp.toBool(): + continue + case fi.basicWidth == 4 && *sfp.toUint32() == 0: + continue + case fi.basicWidth == 8 && *sfp.toUint64() == 0: + continue + } + } + } + + dfp := dst.offset(fi.field) + fi.merge(dfp, sfp) + } + + // TODO: Make this faster? + out := dst.asPointerTo(mi.typ).Elem() + in := src.asPointerTo(mi.typ).Elem() + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + if mi.unrecognized.IsValid() { + if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { + *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) + } + } +} + +func (mi *mergeInfo) computeMergeInfo() { + mi.lock.Lock() + defer mi.lock.Unlock() + if mi.initialized != 0 { + return + } + t := mi.typ + n := t.NumField() + + props := GetProperties(t) + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + mfi := mergeFieldInfo{field: toField(&f)} + tf := f.Type + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + switch tf.Kind() { + case reflect.Ptr, reflect.Slice, reflect.String: + // As a special case, we assume slices and strings are pointers + // since we know that the first field in the SliceSlice or + // StringHeader is a data pointer. + mfi.isPointer = true + case reflect.Bool: + mfi.basicWidth = 1 + case reflect.Int32, reflect.Uint32, reflect.Float32: + mfi.basicWidth = 4 + case reflect.Int64, reflect.Uint64, reflect.Float64: + mfi.basicWidth = 8 + } + } + + // Unwrap tf to get at its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + tf.Name()) + } + + switch tf.Kind() { + case reflect.Int32: + switch { + case isSlice: // E.g., []int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Slice is not defined (see pointer_reflect.go). + /* + sfsp := src.toInt32Slice() + if *sfsp != nil { + dfsp := dst.toInt32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + */ + sfs := src.getInt32Slice() + if sfs != nil { + dfs := dst.getInt32Slice() + dfs = append(dfs, sfs...) + if dfs == nil { + dfs = []int32{} + } + dst.setInt32Slice(dfs) + } + } + case isPointer: // E.g., *int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). + /* + sfpp := src.toInt32Ptr() + if *sfpp != nil { + dfpp := dst.toInt32Ptr() + if *dfpp == nil { + *dfpp = Int32(**sfpp) + } else { + **dfpp = **sfpp + } + } + */ + sfp := src.getInt32Ptr() + if sfp != nil { + dfp := dst.getInt32Ptr() + if dfp == nil { + dst.setInt32Ptr(*sfp) + } else { + *dfp = *sfp + } + } + } + default: // E.g., int32 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt32(); v != 0 { + *dst.toInt32() = v + } + } + } + case reflect.Int64: + switch { + case isSlice: // E.g., []int64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toInt64Slice() + if *sfsp != nil { + dfsp := dst.toInt64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + } + case isPointer: // E.g., *int64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toInt64Ptr() + if *sfpp != nil { + dfpp := dst.toInt64Ptr() + if *dfpp == nil { + *dfpp = Int64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., int64 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt64(); v != 0 { + *dst.toInt64() = v + } + } + } + case reflect.Uint32: + switch { + case isSlice: // E.g., []uint32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint32Slice() + if *sfsp != nil { + dfsp := dst.toUint32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint32{} + } + } + } + case isPointer: // E.g., *uint32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint32Ptr() + if *sfpp != nil { + dfpp := dst.toUint32Ptr() + if *dfpp == nil { + *dfpp = Uint32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint32 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint32(); v != 0 { + *dst.toUint32() = v + } + } + } + case reflect.Uint64: + switch { + case isSlice: // E.g., []uint64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint64Slice() + if *sfsp != nil { + dfsp := dst.toUint64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint64{} + } + } + } + case isPointer: // E.g., *uint64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint64Ptr() + if *sfpp != nil { + dfpp := dst.toUint64Ptr() + if *dfpp == nil { + *dfpp = Uint64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint64 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint64(); v != 0 { + *dst.toUint64() = v + } + } + } + case reflect.Float32: + switch { + case isSlice: // E.g., []float32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat32Slice() + if *sfsp != nil { + dfsp := dst.toFloat32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float32{} + } + } + } + case isPointer: // E.g., *float32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat32Ptr() + if *sfpp != nil { + dfpp := dst.toFloat32Ptr() + if *dfpp == nil { + *dfpp = Float32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float32 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat32(); v != 0 { + *dst.toFloat32() = v + } + } + } + case reflect.Float64: + switch { + case isSlice: // E.g., []float64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat64Slice() + if *sfsp != nil { + dfsp := dst.toFloat64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float64{} + } + } + } + case isPointer: // E.g., *float64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat64Ptr() + if *sfpp != nil { + dfpp := dst.toFloat64Ptr() + if *dfpp == nil { + *dfpp = Float64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float64 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat64(); v != 0 { + *dst.toFloat64() = v + } + } + } + case reflect.Bool: + switch { + case isSlice: // E.g., []bool + mfi.merge = func(dst, src pointer) { + sfsp := src.toBoolSlice() + if *sfsp != nil { + dfsp := dst.toBoolSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []bool{} + } + } + } + case isPointer: // E.g., *bool + mfi.merge = func(dst, src pointer) { + sfpp := src.toBoolPtr() + if *sfpp != nil { + dfpp := dst.toBoolPtr() + if *dfpp == nil { + *dfpp = Bool(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., bool + mfi.merge = func(dst, src pointer) { + if v := *src.toBool(); v { + *dst.toBool() = v + } + } + } + case reflect.String: + switch { + case isSlice: // E.g., []string + mfi.merge = func(dst, src pointer) { + sfsp := src.toStringSlice() + if *sfsp != nil { + dfsp := dst.toStringSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []string{} + } + } + } + case isPointer: // E.g., *string + mfi.merge = func(dst, src pointer) { + sfpp := src.toStringPtr() + if *sfpp != nil { + dfpp := dst.toStringPtr() + if *dfpp == nil { + *dfpp = String(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., string + mfi.merge = func(dst, src pointer) { + if v := *src.toString(); v != "" { + *dst.toString() = v + } + } + } + case reflect.Slice: + isProto3 := props.Prop[i].proto3 + switch { + case isPointer: + panic("bad pointer in byte slice case in " + tf.Name()) + case tf.Elem().Kind() != reflect.Uint8: + panic("bad element kind in byte slice case in " + tf.Name()) + case isSlice: // E.g., [][]byte + mfi.merge = func(dst, src pointer) { + sbsp := src.toBytesSlice() + if *sbsp != nil { + dbsp := dst.toBytesSlice() + for _, sb := range *sbsp { + if sb == nil { + *dbsp = append(*dbsp, nil) + } else { + *dbsp = append(*dbsp, append([]byte{}, sb...)) + } + } + if *dbsp == nil { + *dbsp = [][]byte{} + } + } + } + default: // E.g., []byte + mfi.merge = func(dst, src pointer) { + sbp := src.toBytes() + if *sbp != nil { + dbp := dst.toBytes() + if !isProto3 || len(*sbp) > 0 { + *dbp = append([]byte{}, *sbp...) + } + } + } + } + case reflect.Struct: + switch { + case isSlice && !isPointer: // E.g. []pb.T + mergeInfo := getMergeInfo(tf) + zero := reflect.Zero(tf) + mfi.merge = func(dst, src pointer) { + // TODO: Make this faster? + dstsp := dst.asPointerTo(f.Type) + dsts := dstsp.Elem() + srcs := src.asPointerTo(f.Type).Elem() + for i := 0; i < srcs.Len(); i++ { + dsts = reflect.Append(dsts, zero) + srcElement := srcs.Index(i).Addr() + dstElement := dsts.Index(dsts.Len() - 1).Addr() + mergeInfo.merge(valToPointer(dstElement), valToPointer(srcElement)) + } + if dsts.IsNil() { + dsts = reflect.MakeSlice(f.Type, 0, 0) + } + dstsp.Elem().Set(dsts) + } + case !isPointer: + mergeInfo := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + mergeInfo.merge(dst, src) + } + case isSlice: // E.g., []*pb.T + mergeInfo := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sps := src.getPointerSlice() + if sps != nil { + dps := dst.getPointerSlice() + for _, sp := range sps { + var dp pointer + if !sp.isNil() { + dp = valToPointer(reflect.New(tf)) + mergeInfo.merge(dp, sp) + } + dps = append(dps, dp) + } + if dps == nil { + dps = []pointer{} + } + dst.setPointerSlice(dps) + } + } + default: // E.g., *pb.T + mergeInfo := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sp := src.getPointer() + if !sp.isNil() { + dp := dst.getPointer() + if dp.isNil() { + dp = valToPointer(reflect.New(tf)) + dst.setPointer(dp) + } + mergeInfo.merge(dp, sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic("bad pointer or slice in map case in " + tf.Name()) + default: // E.g., map[K]V + mfi.merge = func(dst, src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + dm := dst.asPointerTo(tf).Elem() + if dm.IsNil() { + dm.Set(reflect.MakeMap(tf)) + } + + switch tf.Elem().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(Clone(val.Interface().(Message))) + dm.SetMapIndex(key, val) + } + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + dm.SetMapIndex(key, val) + } + default: // Basic type (e.g., string) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + dm.SetMapIndex(key, val) + } + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic("bad pointer or slice in interface case in " + tf.Name()) + default: // E.g., interface{} + // TODO: Make this faster? + mfi.merge = func(dst, src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + du := dst.asPointerTo(tf).Elem() + typ := su.Elem().Type() + if du.IsNil() || du.Elem().Type() != typ { + du.Set(reflect.New(typ.Elem())) // Initialize interface if empty + } + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + dv := du.Elem().Elem().Field(0) + if dv.Kind() == reflect.Ptr && dv.IsNil() { + dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + Merge(dv.Interface().(Message), sv.Interface().(Message)) + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) + default: // Basic type (e.g., string) + dv.Set(sv) + } + } + } + } + default: + panic(fmt.Sprintf("merger not found for type:%s", tf)) + } + mi.fields = append(mi.fields, mfi) + } + + mi.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + mi.unrecognized = toField(&f) + } + + atomic.StoreInt32(&mi.initialized, 1) +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go new file mode 100644 index 00000000..93722938 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go @@ -0,0 +1,2249 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "io" + "math" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// Unmarshal is the entry point from the generated .pb.go files. +// This function is not intended to be used by non-generated code. +// This function is not subject to any compatibility guarantee. +// msg contains a pointer to a protocol buffer struct. +// b is the data to be unmarshaled into the protocol buffer. +// a is a pointer to a place to store cached unmarshal information. +func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { + // Load the unmarshal information for this message type. + // The atomic load ensures memory consistency. + u := atomicLoadUnmarshalInfo(&a.unmarshal) + if u == nil { + // Slow path: find unmarshal info for msg, update a with it. + u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) + atomicStoreUnmarshalInfo(&a.unmarshal, u) + } + // Then do the unmarshaling. + err := u.unmarshal(toPointer(&msg), b) + return err +} + +type unmarshalInfo struct { + typ reflect.Type // type of the protobuf struct + + // 0 = only typ field is initialized + // 1 = completely initialized + initialized int32 + lock sync.Mutex // prevents double initialization + dense []unmarshalFieldInfo // fields indexed by tag # + sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # + reqFields []string // names of required fields + reqMask uint64 // 1< 0 { + // Read tag and wire type. + // Special case 1 and 2 byte varints. + var x uint64 + if b[0] < 128 { + x = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + x = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + x, n = decodeVarint(b) + if n == 0 { + return io.ErrUnexpectedEOF + } + b = b[n:] + } + tag := x >> 3 + wire := int(x) & 7 + + // Dispatch on the tag to one of the unmarshal* functions below. + var f unmarshalFieldInfo + if tag < uint64(len(u.dense)) { + f = u.dense[tag] + } else { + f = u.sparse[tag] + } + if fn := f.unmarshal; fn != nil { + var err error + b, err = fn(b, m.offset(f.field), wire) + if err == nil { + reqMask |= f.reqMask + continue + } + if r, ok := err.(*RequiredNotSetError); ok { + // Remember this error, but keep parsing. We need to produce + // a full parse even if a required field is missing. + if errLater == nil { + errLater = r + } + reqMask |= f.reqMask + continue + } + if err != errInternalBadWireType { + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return err + } + // Fragments with bad wire type are treated as unknown fields. + } + + // Unknown tag. + if !u.unrecognized.IsValid() { + // Don't keep unrecognized data; just skip it. + var err error + b, err = skipField(b, wire) + if err != nil { + return err + } + continue + } + // Keep unrecognized data around. + // maybe in extensions, maybe in the unrecognized field. + z := m.offset(u.unrecognized).toBytes() + var emap map[int32]Extension + var e Extension + for _, r := range u.extensionRanges { + if uint64(r.Start) <= tag && tag <= uint64(r.End) { + if u.extensions.IsValid() { + mp := m.offset(u.extensions).toExtensions() + emap = mp.extensionsWrite() + e = emap[int32(tag)] + z = &e.enc + break + } + if u.oldExtensions.IsValid() { + p := m.offset(u.oldExtensions).toOldExtensions() + emap = *p + if emap == nil { + emap = map[int32]Extension{} + *p = emap + } + e = emap[int32(tag)] + z = &e.enc + break + } + if u.bytesExtensions.IsValid() { + z = m.offset(u.bytesExtensions).toBytes() + break + } + panic("no extensions field available") + } + } + // Use wire type to skip data. + var err error + b0 := b + b, err = skipField(b, wire) + if err != nil { + return err + } + *z = encodeVarint(*z, tag<<3|uint64(wire)) + *z = append(*z, b0[:len(b0)-len(b)]...) + + if emap != nil { + emap[int32(tag)] = e + } + } + if reqMask != u.reqMask && errLater == nil { + // A required field of this message is missing. + for _, n := range u.reqFields { + if reqMask&1 == 0 { + errLater = &RequiredNotSetError{n} + } + reqMask >>= 1 + } + } + return errLater +} + +// computeUnmarshalInfo fills in u with information for use +// in unmarshaling protocol buffers of type u.typ. +func (u *unmarshalInfo) computeUnmarshalInfo() { + u.lock.Lock() + defer u.lock.Unlock() + if u.initialized != 0 { + return + } + t := u.typ + n := t.NumField() + + // Set up the "not found" value for the unrecognized byte buffer. + // This is the default for proto3. + u.unrecognized = invalidField + u.extensions = invalidField + u.oldExtensions = invalidField + u.bytesExtensions = invalidField + + // List of the generated type and offset for each oneof field. + type oneofField struct { + ityp reflect.Type // interface type of oneof field + field field // offset in containing message + } + var oneofFields []oneofField + + for i := 0; i < n; i++ { + f := t.Field(i) + if f.Name == "XXX_unrecognized" { + // The byte slice used to hold unrecognized input is special. + if f.Type != reflect.TypeOf(([]byte)(nil)) { + panic("bad type for XXX_unrecognized field: " + f.Type.Name()) + } + u.unrecognized = toField(&f) + continue + } + if f.Name == "XXX_InternalExtensions" { + // Ditto here. + if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { + panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) + } + u.extensions = toField(&f) + if f.Tag.Get("protobuf_messageset") == "1" { + u.isMessageSet = true + } + continue + } + if f.Name == "XXX_extensions" { + // An older form of the extensions field. + if f.Type == reflect.TypeOf((map[int32]Extension)(nil)) { + u.oldExtensions = toField(&f) + continue + } else if f.Type == reflect.TypeOf(([]byte)(nil)) { + u.bytesExtensions = toField(&f) + continue + } + panic("bad type for XXX_extensions field: " + f.Type.Name()) + } + if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { + continue + } + + oneof := f.Tag.Get("protobuf_oneof") + if oneof != "" { + oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) + // The rest of oneof processing happens below. + continue + } + + tags := f.Tag.Get("protobuf") + tagArray := strings.Split(tags, ",") + if len(tagArray) < 2 { + panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) + } + tag, err := strconv.Atoi(tagArray[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tagArray[1]) + } + + name := "" + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + } + + // Extract unmarshaling function from the field (its type and tags). + unmarshal := fieldUnmarshaler(&f) + + // Required field? + var reqMask uint64 + if tagArray[2] == "req" { + bit := len(u.reqFields) + u.reqFields = append(u.reqFields, name) + reqMask = uint64(1) << uint(bit) + // TODO: if we have more than 64 required fields, we end up + // not verifying that all required fields are present. + // Fix this, perhaps using a count of required fields? + } + + // Store the info in the correct slot in the message. + u.setTag(tag, toField(&f), unmarshal, reqMask, name) + } + + // Find any types associated with oneof fields. + // gogo: len(oneofFields) > 0 is needed for embedded oneof messages, without a marshaler and unmarshaler + if len(oneofFields) > 0 { + var oneofImplementers []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + for _, v := range oneofImplementers { + tptr := reflect.TypeOf(v) // *Msg_X + typ := tptr.Elem() // Msg_X + + f := typ.Field(0) // oneof implementers have one field + baseUnmarshal := fieldUnmarshaler(&f) + tags := strings.Split(f.Tag.Get("protobuf"), ",") + fieldNum, err := strconv.Atoi(tags[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tags[1]) + } + var name string + for _, tag := range tags { + if strings.HasPrefix(tag, "name=") { + name = strings.TrimPrefix(tag, "name=") + break + } + } + + // Find the oneof field that this struct implements. + // Might take O(n^2) to process all of the oneofs, but who cares. + for _, of := range oneofFields { + if tptr.Implements(of.ityp) { + // We have found the corresponding interface for this struct. + // That lets us know where this struct should be stored + // when we encounter it during unmarshaling. + unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) + u.setTag(fieldNum, of.field, unmarshal, 0, name) + } + } + + } + } + + // Get extension ranges, if any. + fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") + if fn.IsValid() { + if !u.extensions.IsValid() && !u.oldExtensions.IsValid() && !u.bytesExtensions.IsValid() { + panic("a message with extensions, but no extensions field in " + t.Name()) + } + u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) + } + + // Explicitly disallow tag 0. This will ensure we flag an error + // when decoding a buffer of all zeros. Without this code, we + // would decode and skip an all-zero buffer of even length. + // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. + u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { + return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) + }, 0, "") + + // Set mask for required field check. + u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? + for len(u.dense) <= tag { + u.dense = append(u.dense, unmarshalFieldInfo{}) + } + u.dense[tag] = i + return + } + if u.sparse == nil { + u.sparse = map[uint64]unmarshalFieldInfo{} + } + u.sparse[uint64(tag)] = i +} + +// fieldUnmarshaler returns an unmarshaler for the given field. +func fieldUnmarshaler(f *reflect.StructField) unmarshaler { + if f.Type.Kind() == reflect.Map { + return makeUnmarshalMap(f) + } + return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) +} + +// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. +func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { + tagArray := strings.Split(tags, ",") + encoding := tagArray[0] + name := "unknown" + ctype := false + isTime := false + isDuration := false + isWktPointer := false + proto3 := false + validateUTF8 := true + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + if tag == "proto3" { + proto3 = true + } + if strings.HasPrefix(tag, "customtype=") { + ctype = true + } + if tag == "stdtime" { + isTime = true + } + if tag == "stdduration" { + isDuration = true + } + if tag == "wktptr" { + isWktPointer = true + } + } + validateUTF8 = validateUTF8 && proto3 + + // Figure out packaging (pointer, slice, or both) + slice := false + pointer := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + if ctype { + if reflect.PtrTo(t).Implements(customType) { + if slice { + return makeUnmarshalCustomSlice(getUnmarshalInfo(t), name) + } + if pointer { + return makeUnmarshalCustomPtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalCustom(getUnmarshalInfo(t), name) + } else { + panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t)) + } + } + + if isTime { + if pointer { + if slice { + return makeUnmarshalTimePtrSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalTimePtr(getUnmarshalInfo(t), name) + } + if slice { + return makeUnmarshalTimeSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalTime(getUnmarshalInfo(t), name) + } + + if isDuration { + if pointer { + if slice { + return makeUnmarshalDurationPtrSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalDurationPtr(getUnmarshalInfo(t), name) + } + if slice { + return makeUnmarshalDurationSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalDuration(getUnmarshalInfo(t), name) + } + + if isWktPointer { + switch t.Kind() { + case reflect.Float64: + if pointer { + if slice { + return makeStdDoubleValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdDoubleValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdDoubleValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdDoubleValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Float32: + if pointer { + if slice { + return makeStdFloatValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdFloatValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdFloatValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdFloatValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Int64: + if pointer { + if slice { + return makeStdInt64ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt64ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdInt64ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt64ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Uint64: + if pointer { + if slice { + return makeStdUInt64ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt64ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdUInt64ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt64ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Int32: + if pointer { + if slice { + return makeStdInt32ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt32ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdInt32ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt32ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Uint32: + if pointer { + if slice { + return makeStdUInt32ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt32ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdUInt32ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt32ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Bool: + if pointer { + if slice { + return makeStdBoolValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBoolValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdBoolValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBoolValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.String: + if pointer { + if slice { + return makeStdStringValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdStringValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdStringValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdStringValueUnmarshaler(getUnmarshalInfo(t), name) + case uint8SliceType: + if pointer { + if slice { + return makeStdBytesValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBytesValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdBytesValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBytesValueUnmarshaler(getUnmarshalInfo(t), name) + default: + panic(fmt.Sprintf("unknown wktpointer type %#v", t)) + } + } + + // We'll never have both pointer and slice for basic types. + if pointer && slice && t.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + t.Name()) + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return unmarshalBoolPtr + } + if slice { + return unmarshalBoolSlice + } + return unmarshalBoolValue + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixedS32Ptr + } + if slice { + return unmarshalFixedS32Slice + } + return unmarshalFixedS32Value + case "varint": + // this could be int32 or enum + if pointer { + return unmarshalInt32Ptr + } + if slice { + return unmarshalInt32Slice + } + return unmarshalInt32Value + case "zigzag32": + if pointer { + return unmarshalSint32Ptr + } + if slice { + return unmarshalSint32Slice + } + return unmarshalSint32Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixedS64Ptr + } + if slice { + return unmarshalFixedS64Slice + } + return unmarshalFixedS64Value + case "varint": + if pointer { + return unmarshalInt64Ptr + } + if slice { + return unmarshalInt64Slice + } + return unmarshalInt64Value + case "zigzag64": + if pointer { + return unmarshalSint64Ptr + } + if slice { + return unmarshalSint64Slice + } + return unmarshalSint64Value + } + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixed32Ptr + } + if slice { + return unmarshalFixed32Slice + } + return unmarshalFixed32Value + case "varint": + if pointer { + return unmarshalUint32Ptr + } + if slice { + return unmarshalUint32Slice + } + return unmarshalUint32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixed64Ptr + } + if slice { + return unmarshalFixed64Slice + } + return unmarshalFixed64Value + case "varint": + if pointer { + return unmarshalUint64Ptr + } + if slice { + return unmarshalUint64Slice + } + return unmarshalUint64Value + } + case reflect.Float32: + if pointer { + return unmarshalFloat32Ptr + } + if slice { + return unmarshalFloat32Slice + } + return unmarshalFloat32Value + case reflect.Float64: + if pointer { + return unmarshalFloat64Ptr + } + if slice { + return unmarshalFloat64Slice + } + return unmarshalFloat64Value + case reflect.Map: + panic("map type in typeUnmarshaler in " + t.Name()) + case reflect.Slice: + if pointer { + panic("bad pointer in slice case in " + t.Name()) + } + if slice { + return unmarshalBytesSlice + } + return unmarshalBytesValue + case reflect.String: + if validateUTF8 { + if pointer { + return unmarshalUTF8StringPtr + } + if slice { + return unmarshalUTF8StringSlice + } + return unmarshalUTF8StringValue + } + if pointer { + return unmarshalStringPtr + } + if slice { + return unmarshalStringSlice + } + return unmarshalStringValue + case reflect.Struct: + // message or group field + if !pointer { + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessage(getUnmarshalInfo(t), name) + } + } + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) + case "group": + if slice { + return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) + } + } + panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) +} + +// Below are all the unmarshalers for individual fields of various types. + +func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64() = v + return b, nil +} + +func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64() = v + return b, nil +} + +func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64() = v + return b, nil +} + +func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64Ptr() = &v + return b, nil +} + +func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + *f.toInt32() = v + return b, nil +} + +func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + *f.toInt32() = v + return b, nil +} + +func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32() = v + return b, nil +} + +func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32Ptr() = &v + return b, nil +} + +func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64() = v + return b[8:], nil +} + +func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64() = v + return b[8:], nil +} + +func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32() = v + return b[4:], nil +} + +func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32Ptr() = &v + return b[4:], nil +} + +func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + *f.toInt32() = v + return b[4:], nil +} + +func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.setInt32Ptr(v) + return b[4:], nil +} + +func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + return b[4:], nil +} + +func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + // Note: any length varint is allowed, even though any sane + // encoder will use one byte. + // See https://github.com/golang/protobuf/issues/76 + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + // TODO: check if x>1? Tests seem to indicate no. + v := x != 0 + *f.toBool() = v + return b[n:], nil +} + +func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + *f.toBoolPtr() = &v + return b[n:], nil +} + +func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + b = b[n:] + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + return b[n:], nil +} + +func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64() = v + return b[8:], nil +} + +func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64Ptr() = &v + return b[8:], nil +} + +func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32() = v + return b[4:], nil +} + +func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32Ptr() = &v + return b[4:], nil +} + +func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + return b[x:], nil +} + +func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + return b[x:], nil +} + +func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + return b[x:], nil +} + +func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +var emptyBuf [0]byte + +func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // The use of append here is a trick which avoids the zeroing + // that would be required if we used a make/copy pair. + // We append to emptyBuf instead of nil because we want + // a non-nil result even when the length is 0. + v := append(emptyBuf[:], b[:x]...) + *f.toBytes() = v + return b[x:], nil +} + +func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := append(emptyBuf[:], b[:x]...) + s := f.toBytesSlice() + *s = append(*s, v) + return b[x:], nil +} + +func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[y:], err + } +} + +func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[y:], err + } +} + +func makeUnmarshalMap(f *reflect.StructField) unmarshaler { + t := f.Type + kt := t.Key() + vt := t.Elem() + tagArray := strings.Split(f.Tag.Get("protobuf"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + for _, t := range tagArray { + if strings.HasPrefix(t, "customtype=") { + valTags = append(valTags, t) + } + if t == "stdtime" { + valTags = append(valTags, t) + } + if t == "stdduration" { + valTags = append(valTags, t) + } + if t == "wktptr" { + valTags = append(valTags, t) + } + } + unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) + unmarshalVal := typeUnmarshaler(vt, strings.Join(valTags, ",")) + return func(b []byte, f pointer, w int) ([]byte, error) { + // The map entry is a submessage. Figure out how big it is. + if w != WireBytes { + return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + r := b[x:] // unused data to return + b = b[:x] // data for map entry + + // Note: we could use #keys * #values ~= 200 functions + // to do map decoding without reflection. Probably not worth it. + // Maps will be somewhat slow. Oh well. + + // Read key and value from data. + var nerr nonFatal + k := reflect.New(kt) + v := reflect.New(vt) + for len(b) > 0 { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + wire := int(x) & 7 + b = b[n:] + + var err error + switch x >> 3 { + case 1: + b, err = unmarshalKey(b, valToPointer(k), wire) + case 2: + b, err = unmarshalVal(b, valToPointer(v), wire) + default: + err = errInternalBadWireType // skip unknown tag + } + + if nerr.Merge(err) { + continue + } + if err != errInternalBadWireType { + return nil, err + } + + // Skip past unknown fields. + b, err = skipField(b, wire) + if err != nil { + return nil, err + } + } + + // Get map, allocate if needed. + m := f.asPointerTo(t).Elem() // an addressable map[K]T + if m.IsNil() { + m.Set(reflect.MakeMap(t)) + } + + // Insert into map. + m.SetMapIndex(k.Elem(), v.Elem()) + + return r, nerr.E + } +} + +// makeUnmarshalOneof makes an unmarshaler for oneof fields. +// for: +// message Msg { +// oneof F { +// int64 X = 1; +// float64 Y = 2; +// } +// } +// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). +// ityp is the interface type of the oneof field (e.g. isMsg_F). +// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). +// Note that this function will be called once for each case in the oneof. +func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { + sf := typ.Field(0) + field0 := toField(&sf) + return func(b []byte, f pointer, w int) ([]byte, error) { + // Allocate holder for value. + v := reflect.New(typ) + + // Unmarshal data into holder. + // We unmarshal into the first field of the holder object. + var err error + var nerr nonFatal + b, err = unmarshal(b, valToPointer(v).offset(field0), w) + if !nerr.Merge(err) { + return nil, err + } + + // Write pointer to holder into target field. + f.asPointerTo(ityp).Elem().Set(v) + + return b, nerr.E + } +} + +// Error used by decode internally. +var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") + +// skipField skips past a field of type wire and returns the remaining bytes. +func skipField(b []byte, wire int) ([]byte, error) { + switch wire { + case WireVarint: + _, k := decodeVarint(b) + if k == 0 { + return b, io.ErrUnexpectedEOF + } + b = b[k:] + case WireFixed32: + if len(b) < 4 { + return b, io.ErrUnexpectedEOF + } + b = b[4:] + case WireFixed64: + if len(b) < 8 { + return b, io.ErrUnexpectedEOF + } + b = b[8:] + case WireBytes: + m, k := decodeVarint(b) + if k == 0 || uint64(len(b)-k) < m { + return b, io.ErrUnexpectedEOF + } + b = b[uint64(k)+m:] + case WireStartGroup: + _, i := findEndGroup(b) + if i == -1 { + return b, io.ErrUnexpectedEOF + } + b = b[i:] + default: + return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) + } + return b, nil +} + +// findEndGroup finds the index of the next EndGroup tag. +// Groups may be nested, so the "next" EndGroup tag is the first +// unpaired EndGroup. +// findEndGroup returns the indexes of the start and end of the EndGroup tag. +// Returns (-1,-1) if it can't find one. +func findEndGroup(b []byte) (int, int) { + depth := 1 + i := 0 + for { + x, n := decodeVarint(b[i:]) + if n == 0 { + return -1, -1 + } + j := i + i += n + switch x & 7 { + case WireVarint: + _, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + case WireFixed32: + if len(b)-4 < i { + return -1, -1 + } + i += 4 + case WireFixed64: + if len(b)-8 < i { + return -1, -1 + } + i += 8 + case WireBytes: + m, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + if uint64(len(b)-i) < m { + return -1, -1 + } + i += int(m) + case WireStartGroup: + depth++ + case WireEndGroup: + depth-- + if depth == 0 { + return j, i + } + default: + return -1, -1 + } + } +} + +// encodeVarint appends a varint-encoded integer to b and returns the result. +func encodeVarint(b []byte, x uint64) []byte { + for x >= 1<<7 { + b = append(b, byte(x&0x7f|0x80)) + x >>= 7 + } + return append(b, byte(x)) +} + +// decodeVarint reads a varint-encoded integer from b. +// Returns the decoded integer and the number of bytes read. +// If there is an error, it returns 0,0. +func decodeVarint(b []byte) (uint64, int) { + var x, y uint64 + if len(b) == 0 { + goto bad + } + x = uint64(b[0]) + if x < 0x80 { + return x, 1 + } + x -= 0x80 + + if len(b) <= 1 { + goto bad + } + y = uint64(b[1]) + x += y << 7 + if y < 0x80 { + return x, 2 + } + x -= 0x80 << 7 + + if len(b) <= 2 { + goto bad + } + y = uint64(b[2]) + x += y << 14 + if y < 0x80 { + return x, 3 + } + x -= 0x80 << 14 + + if len(b) <= 3 { + goto bad + } + y = uint64(b[3]) + x += y << 21 + if y < 0x80 { + return x, 4 + } + x -= 0x80 << 21 + + if len(b) <= 4 { + goto bad + } + y = uint64(b[4]) + x += y << 28 + if y < 0x80 { + return x, 5 + } + x -= 0x80 << 28 + + if len(b) <= 5 { + goto bad + } + y = uint64(b[5]) + x += y << 35 + if y < 0x80 { + return x, 6 + } + x -= 0x80 << 35 + + if len(b) <= 6 { + goto bad + } + y = uint64(b[6]) + x += y << 42 + if y < 0x80 { + return x, 7 + } + x -= 0x80 << 42 + + if len(b) <= 7 { + goto bad + } + y = uint64(b[7]) + x += y << 49 + if y < 0x80 { + return x, 8 + } + x -= 0x80 << 49 + + if len(b) <= 8 { + goto bad + } + y = uint64(b[8]) + x += y << 56 + if y < 0x80 { + return x, 9 + } + x -= 0x80 << 56 + + if len(b) <= 9 { + goto bad + } + y = uint64(b[9]) + x += y << 63 + if y < 2 { + return x, 10 + } + +bad: + return 0, 0 +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go b/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go new file mode 100644 index 00000000..00d6c7ad --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go @@ -0,0 +1,385 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "io" + "reflect" +) + +func makeUnmarshalMessage(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f // gogo: changed from v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendRef(v, sub.typ) // gogo: changed from f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalCustomPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.New(sub.typ)) + m := s.Interface().(custom) + if err := m.Unmarshal(b[:x]); err != nil { + return nil, err + } + return b[x:], nil + } +} + +func makeUnmarshalCustomSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := reflect.New(sub.typ) + c := m.Interface().(custom) + if err := c.Unmarshal(b[:x]); err != nil { + return nil, err + } + v := valToPointer(m) + f.appendRef(v, sub.typ) + return b[x:], nil + } +} + +func makeUnmarshalCustom(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + + m := f.asPointerTo(sub.typ).Interface().(custom) + if err := m.Unmarshal(b[:x]); err != nil { + return nil, err + } + return b[x:], nil + } +} + +func makeUnmarshalTime(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(t)) + return b[x:], nil + } +} + +func makeUnmarshalTimePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&t)) + return b[x:], nil + } +} + +func makeUnmarshalTimePtrSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&t)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeUnmarshalTimeSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(t)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeUnmarshalDurationPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&d)) + return b[x:], nil + } +} + +func makeUnmarshalDuration(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(d)) + return b[x:], nil + } +} + +func makeUnmarshalDurationPtrSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&d)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeUnmarshalDurationSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(d)) + slice.Set(newSlice) + return b[x:], nil + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/text.go b/vendor/github.com/gogo/protobuf/proto/text.go new file mode 100644 index 00000000..87416afe --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/text.go @@ -0,0 +1,930 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for writing the text protocol buffer format. + +import ( + "bufio" + "bytes" + "encoding" + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "sort" + "strings" + "sync" + "time" +) + +var ( + newline = []byte("\n") + spaces = []byte(" ") + endBraceNewline = []byte("}\n") + backslashN = []byte{'\\', 'n'} + backslashR = []byte{'\\', 'r'} + backslashT = []byte{'\\', 't'} + backslashDQ = []byte{'\\', '"'} + backslashBS = []byte{'\\', '\\'} + posInf = []byte("inf") + negInf = []byte("-inf") + nan = []byte("nan") +) + +type writer interface { + io.Writer + WriteByte(byte) error +} + +// textWriter is an io.Writer that tracks its indentation level. +type textWriter struct { + ind int + complete bool // if the current position is a complete line + compact bool // whether to write out as a one-liner + w writer +} + +func (w *textWriter) WriteString(s string) (n int, err error) { + if !strings.Contains(s, "\n") { + if !w.compact && w.complete { + w.writeIndent() + } + w.complete = false + return io.WriteString(w.w, s) + } + // WriteString is typically called without newlines, so this + // codepath and its copy are rare. We copy to avoid + // duplicating all of Write's logic here. + return w.Write([]byte(s)) +} + +func (w *textWriter) Write(p []byte) (n int, err error) { + newlines := bytes.Count(p, newline) + if newlines == 0 { + if !w.compact && w.complete { + w.writeIndent() + } + n, err = w.w.Write(p) + w.complete = false + return n, err + } + + frags := bytes.SplitN(p, newline, newlines+1) + if w.compact { + for i, frag := range frags { + if i > 0 { + if err := w.w.WriteByte(' '); err != nil { + return n, err + } + n++ + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + } + return n, nil + } + + for i, frag := range frags { + if w.complete { + w.writeIndent() + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + if i+1 < len(frags) { + if err := w.w.WriteByte('\n'); err != nil { + return n, err + } + n++ + } + } + w.complete = len(frags[len(frags)-1]) == 0 + return n, nil +} + +func (w *textWriter) WriteByte(c byte) error { + if w.compact && c == '\n' { + c = ' ' + } + if !w.compact && w.complete { + w.writeIndent() + } + err := w.w.WriteByte(c) + w.complete = c == '\n' + return err +} + +func (w *textWriter) indent() { w.ind++ } + +func (w *textWriter) unindent() { + if w.ind == 0 { + log.Print("proto: textWriter unindented too far") + return + } + w.ind-- +} + +func writeName(w *textWriter, props *Properties) error { + if _, err := w.WriteString(props.OrigName); err != nil { + return err + } + if props.Wire != "group" { + return w.WriteByte(':') + } + return nil +} + +func requiresQuotes(u string) bool { + // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. + for _, ch := range u { + switch { + case ch == '.' || ch == '/' || ch == '_': + continue + case '0' <= ch && ch <= '9': + continue + case 'A' <= ch && ch <= 'Z': + continue + case 'a' <= ch && ch <= 'z': + continue + default: + return true + } + } + return false +} + +// isAny reports whether sv is a google.protobuf.Any message +func isAny(sv reflect.Value) bool { + type wkt interface { + XXX_WellKnownType() string + } + t, ok := sv.Addr().Interface().(wkt) + return ok && t.XXX_WellKnownType() == "Any" +} + +// writeProto3Any writes an expanded google.protobuf.Any message. +// +// It returns (false, nil) if sv value can't be unmarshaled (e.g. because +// required messages are not linked in). +// +// It returns (true, error) when sv was written in expanded format or an error +// was encountered. +func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { + turl := sv.FieldByName("TypeUrl") + val := sv.FieldByName("Value") + if !turl.IsValid() || !val.IsValid() { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + b, ok := val.Interface().([]byte) + if !ok { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + parts := strings.Split(turl.String(), "/") + mt := MessageType(parts[len(parts)-1]) + if mt == nil { + return false, nil + } + m := reflect.New(mt.Elem()) + if err := Unmarshal(b, m.Interface().(Message)); err != nil { + return false, nil + } + w.Write([]byte("[")) + u := turl.String() + if requiresQuotes(u) { + writeString(w, u) + } else { + w.Write([]byte(u)) + } + if w.compact { + w.Write([]byte("]:<")) + } else { + w.Write([]byte("]: <\n")) + w.ind++ + } + if err := tm.writeStruct(w, m.Elem()); err != nil { + return true, err + } + if w.compact { + w.Write([]byte("> ")) + } else { + w.ind-- + w.Write([]byte(">\n")) + } + return true, nil +} + +func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { + if tm.ExpandAny && isAny(sv) { + if canExpand, err := tm.writeProto3Any(w, sv); canExpand { + return err + } + } + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < sv.NumField(); i++ { + fv := sv.Field(i) + props := sprops.Prop[i] + name := st.Field(i).Name + + if name == "XXX_NoUnkeyedLiteral" { + continue + } + + if strings.HasPrefix(name, "XXX_") { + // There are two XXX_ fields: + // XXX_unrecognized []byte + // XXX_extensions map[int32]proto.Extension + // The first is handled here; + // the second is handled at the bottom of this function. + if name == "XXX_unrecognized" && !fv.IsNil() { + if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Field not filled in. This could be an optional field or + // a required field that wasn't filled in. Either way, there + // isn't anything we can show for it. + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + // Repeated field that is empty, or a bytes field that is unused. + continue + } + + if props.Repeated && fv.Kind() == reflect.Slice { + // Repeated field. + for j := 0; j < fv.Len(); j++ { + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + v := fv.Index(j) + if v.Kind() == reflect.Ptr && v.IsNil() { + // A nil message in a repeated field is not valid, + // but we can handle that more gracefully than panicking. + if _, err := w.Write([]byte("\n")); err != nil { + return err + } + continue + } + if len(props.Enum) > 0 { + if err := tm.writeEnum(w, v, props); err != nil { + return err + } + } else if err := tm.writeAny(w, v, props); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Map { + // Map fields are rendered as a repeated struct with key/value fields. + keys := fv.MapKeys() + sort.Sort(mapKeys(keys)) + for _, key := range keys { + val := fv.MapIndex(key) + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + // open struct + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + // key + if _, err := w.WriteString("key:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + // nil values aren't legal, but we can avoid panicking because of them. + if val.Kind() != reflect.Ptr || !val.IsNil() { + // value + if _, err := w.WriteString("value:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, val, props.MapValProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + // close struct + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { + // empty bytes field + continue + } + if props.proto3 && fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { + // proto3 non-repeated scalar field; skip if zero value + if isProto3Zero(fv) { + continue + } + } + + if fv.Kind() == reflect.Interface { + // Check if it is a oneof. + if st.Field(i).Tag.Get("protobuf_oneof") != "" { + // fv is nil, or holds a pointer to generated struct. + // That generated struct has exactly one field, + // which has a protobuf struct tag. + if fv.IsNil() { + continue + } + inner := fv.Elem().Elem() // interface -> *T -> T + tag := inner.Type().Field(0).Tag.Get("protobuf") + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) + // Write the value in the oneof, not the oneof itself. + fv = inner.Field(0) + + // Special case to cope with malformed messages gracefully: + // If the value in the oneof is a nil pointer, don't panic + // in writeAny. + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Use errors.New so writeAny won't render quotes. + msg := errors.New("/* nil */") + fv = reflect.ValueOf(&msg).Elem() + } + } + } + + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + + if len(props.Enum) > 0 { + if err := tm.writeEnum(w, fv, props); err != nil { + return err + } + } else if err := tm.writeAny(w, fv, props); err != nil { + return err + } + + if err := w.WriteByte('\n'); err != nil { + return err + } + } + + // Extensions (the XXX_extensions field). + pv := sv + if pv.CanAddr() { + pv = sv.Addr() + } else { + pv = reflect.New(sv.Type()) + pv.Elem().Set(sv) + } + if _, err := extendable(pv.Interface()); err == nil { + if err := tm.writeExtensions(w, pv); err != nil { + return err + } + } + + return nil +} + +var textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() + +// writeAny writes an arbitrary field. +func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { + v = reflect.Indirect(v) + + if props != nil { + if len(props.CustomType) > 0 { + custom, ok := v.Interface().(Marshaler) + if ok { + data, err := custom.Marshal() + if err != nil { + return err + } + if err := writeString(w, string(data)); err != nil { + return err + } + return nil + } + } else if len(props.CastType) > 0 { + if _, ok := v.Interface().(interface { + String() string + }); ok { + switch v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + _, err := fmt.Fprintf(w, "%d", v.Interface()) + return err + } + } + } else if props.StdTime { + t, ok := v.Interface().(time.Time) + if !ok { + return fmt.Errorf("stdtime is not time.Time, but %T", v.Interface()) + } + tproto, err := timestampProto(t) + if err != nil { + return err + } + propsCopy := *props // Make a copy so that this is goroutine-safe + propsCopy.StdTime = false + err = tm.writeAny(w, reflect.ValueOf(tproto), &propsCopy) + return err + } else if props.StdDuration { + d, ok := v.Interface().(time.Duration) + if !ok { + return fmt.Errorf("stdtime is not time.Duration, but %T", v.Interface()) + } + dproto := durationProto(d) + propsCopy := *props // Make a copy so that this is goroutine-safe + propsCopy.StdDuration = false + err := tm.writeAny(w, reflect.ValueOf(dproto), &propsCopy) + return err + } + } + + // Floats have special cases. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + x := v.Float() + var b []byte + switch { + case math.IsInf(x, 1): + b = posInf + case math.IsInf(x, -1): + b = negInf + case math.IsNaN(x): + b = nan + } + if b != nil { + _, err := w.Write(b) + return err + } + // Other values are handled below. + } + + // We don't attempt to serialise every possible value type; only those + // that can occur in protocol buffers. + switch v.Kind() { + case reflect.Slice: + // Should only be a []byte; repeated fields are handled in writeStruct. + if err := writeString(w, string(v.Bytes())); err != nil { + return err + } + case reflect.String: + if err := writeString(w, v.String()); err != nil { + return err + } + case reflect.Struct: + // Required/optional group/message. + var bra, ket byte = '<', '>' + if props != nil && props.Wire == "group" { + bra, ket = '{', '}' + } + if err := w.WriteByte(bra); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if v.CanAddr() { + // Calling v.Interface on a struct causes the reflect package to + // copy the entire struct. This is racy with the new Marshaler + // since we atomically update the XXX_sizecache. + // + // Thus, we retrieve a pointer to the struct if possible to avoid + // a race since v.Interface on the pointer doesn't copy the struct. + // + // If v is not addressable, then we are not worried about a race + // since it implies that the binary Marshaler cannot possibly be + // mutating this value. + v = v.Addr() + } + if v.Type().Implements(textMarshalerType) { + text, err := v.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return err + } + if _, err = w.Write(text); err != nil { + return err + } + } else { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if err := tm.writeStruct(w, v); err != nil { + return err + } + } + w.unindent() + if err := w.WriteByte(ket); err != nil { + return err + } + default: + _, err := fmt.Fprint(w, v.Interface()) + return err + } + return nil +} + +// equivalent to C's isprint. +func isprint(c byte) bool { + return c >= 0x20 && c < 0x7f +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(w *textWriter, s string) error { + // use WriteByte here to get any needed indent + if err := w.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = w.w.Write(backslashN) + case '\r': + _, err = w.w.Write(backslashR) + case '\t': + _, err = w.w.Write(backslashT) + case '"': + _, err = w.w.Write(backslashDQ) + case '\\': + _, err = w.w.Write(backslashBS) + default: + if isprint(c) { + err = w.w.WriteByte(c) + } else { + _, err = fmt.Fprintf(w.w, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return w.WriteByte('"') +} + +func writeUnknownStruct(w *textWriter, data []byte) (err error) { + if !w.compact { + if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { + return err + } + } + b := NewBuffer(data) + for b.index < len(b.buf) { + x, err := b.DecodeVarint() + if err != nil { + _, ferr := fmt.Fprintf(w, "/* %v */\n", err) + return ferr + } + wire, tag := x&7, x>>3 + if wire == WireEndGroup { + w.unindent() + if _, werr := w.Write(endBraceNewline); werr != nil { + return werr + } + continue + } + if _, ferr := fmt.Fprint(w, tag); ferr != nil { + return ferr + } + if wire != WireStartGroup { + if err = w.WriteByte(':'); err != nil { + return err + } + } + if !w.compact || wire == WireStartGroup { + if err = w.WriteByte(' '); err != nil { + return err + } + } + switch wire { + case WireBytes: + buf, e := b.DecodeRawBytes(false) + if e == nil { + _, err = fmt.Fprintf(w, "%q", buf) + } else { + _, err = fmt.Fprintf(w, "/* %v */", e) + } + case WireFixed32: + x, err = b.DecodeFixed32() + err = writeUnknownInt(w, x, err) + case WireFixed64: + x, err = b.DecodeFixed64() + err = writeUnknownInt(w, x, err) + case WireStartGroup: + err = w.WriteByte('{') + w.indent() + case WireVarint: + x, err = b.DecodeVarint() + err = writeUnknownInt(w, x, err) + default: + _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) + } + if err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + return nil +} + +func writeUnknownInt(w *textWriter, x uint64, err error) error { + if err == nil { + _, err = fmt.Fprint(w, x) + } else { + _, err = fmt.Fprintf(w, "/* %v */", err) + } + return err +} + +type int32Slice []int32 + +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// writeExtensions writes all the extensions in pv. +// pv is assumed to be a pointer to a protocol message struct that is extendable. +func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { + emap := extensionMaps[pv.Type().Elem()] + e := pv.Interface().(Message) + + var m map[int32]Extension + var mu sync.Locker + if em, ok := e.(extensionsBytes); ok { + eb := em.GetExtensions() + var err error + m, err = BytesToExtensionsMap(*eb) + if err != nil { + return err + } + mu = notLocker{} + } else if _, ok := e.(extendableProto); ok { + ep, _ := extendable(e) + m, mu = ep.extensionsRead() + if m == nil { + return nil + } + } + + // Order the extensions by ID. + // This isn't strictly necessary, but it will give us + // canonical output, which will also make testing easier. + + mu.Lock() + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + mu.Unlock() + + for _, extNum := range ids { + ext := m[extNum] + var desc *ExtensionDesc + if emap != nil { + desc = emap[extNum] + } + if desc == nil { + // Unknown extension. + if err := writeUnknownStruct(w, ext.enc); err != nil { + return err + } + continue + } + + pb, err := GetExtension(e, desc) + if err != nil { + return fmt.Errorf("failed getting extension: %v", err) + } + + // Repeated extensions will appear as a slice. + if !desc.repeated() { + if err := tm.writeExtension(w, desc.Name, pb); err != nil { + return err + } + } else { + v := reflect.ValueOf(pb) + for i := 0; i < v.Len(); i++ { + if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { + return err + } + } + } + } + return nil +} + +func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { + if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + return nil +} + +func (w *textWriter) writeIndent() { + if !w.complete { + return + } + remain := w.ind * 2 + for remain > 0 { + n := remain + if n > len(spaces) { + n = len(spaces) + } + w.w.Write(spaces[:n]) + remain -= n + } + w.complete = false +} + +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). + ExpandAny bool // expand google.protobuf.Any messages of known types +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { + w.Write([]byte("")) + return nil + } + var bw *bufio.Writer + ww, ok := w.(writer) + if !ok { + bw = bufio.NewWriter(w) + ww = bw + } + aw := &textWriter{ + w: ww, + complete: true, + compact: tm.Compact, + } + + if etm, ok := pb.(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = aw.Write(text); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil + } + // Dereference the received pointer so we don't have outer < and >. + v := reflect.Indirect(val) + if err := tm.writeStruct(aw, v); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil +} + +// Text is the same as Marshal, but returns the string directly. +func (tm *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + tm.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + +// MarshalText writes a given protocol buffer in text format. +// The only errors returned are from w. +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } + +// MarshalTextString is the same as MarshalText, but returns the string directly. +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } + +// CompactText writes a given protocol buffer in compact text format (one line). +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } + +// CompactTextString is the same as CompactText, but returns the string directly. +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/gogo/protobuf/proto/text_gogo.go b/vendor/github.com/gogo/protobuf/proto/text_gogo.go new file mode 100644 index 00000000..1d6c6aa0 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/text_gogo.go @@ -0,0 +1,57 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" +) + +func (tm *TextMarshaler) writeEnum(w *textWriter, v reflect.Value, props *Properties) error { + m, ok := enumStringMaps[props.Enum] + if !ok { + if err := tm.writeAny(w, v, props); err != nil { + return err + } + } + key := int32(0) + if v.Kind() == reflect.Ptr { + key = int32(v.Elem().Int()) + } else { + key = int32(v.Int()) + } + s, ok := m[key] + if !ok { + if err := tm.writeAny(w, v, props); err != nil { + return err + } + } + _, err := fmt.Fprint(w, s) + return err +} diff --git a/vendor/github.com/gogo/protobuf/proto/text_parser.go b/vendor/github.com/gogo/protobuf/proto/text_parser.go new file mode 100644 index 00000000..1ce0be2f --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/text_parser.go @@ -0,0 +1,1018 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for parsing the Text protocol buffer format. +// TODO: message sets. + +import ( + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +// Error string emitted when deserializing Any and fields are already set +const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" + +type ParseError struct { + Message string + Line int // 1-based line number + Offset int // 0-based byte offset from start of input +} + +func (p *ParseError) Error() string { + if p.Line == 1 { + // show offset only for first line + return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) + } + return fmt.Sprintf("line %d: %v", p.Line, p.Message) +} + +type token struct { + value string + err *ParseError + line int // line number + offset int // byte number from start of input, not start of line + unquoted string // the unquoted version of value, if it was a quoted string +} + +func (t *token) String() string { + if t.err == nil { + return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) + } + return fmt.Sprintf("parse error: %v", t.err) +} + +type textParser struct { + s string // remaining input + done bool // whether the parsing is finished (success or error) + backed bool // whether back() was called + offset, line int + cur token +} + +func newTextParser(s string) *textParser { + p := new(textParser) + p.s = s + p.line = 1 + p.cur.line = 1 + return p +} + +func (p *textParser) errorf(format string, a ...interface{}) *ParseError { + pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} + p.cur.err = pe + p.done = true + return pe +} + +// Numbers and identifiers are matched by [-+._A-Za-z0-9] +func isIdentOrNumberChar(c byte) bool { + switch { + case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': + return true + case '0' <= c && c <= '9': + return true + } + switch c { + case '-', '+', '.', '_': + return true + } + return false +} + +func isWhitespace(c byte) bool { + switch c { + case ' ', '\t', '\n', '\r': + return true + } + return false +} + +func isQuote(c byte) bool { + switch c { + case '"', '\'': + return true + } + return false +} + +func (p *textParser) skipWhitespace() { + i := 0 + for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { + if p.s[i] == '#' { + // comment; skip to end of line or input + for i < len(p.s) && p.s[i] != '\n' { + i++ + } + if i == len(p.s) { + break + } + } + if p.s[i] == '\n' { + p.line++ + } + i++ + } + p.offset += i + p.s = p.s[i:len(p.s)] + if len(p.s) == 0 { + p.done = true + } +} + +func (p *textParser) advance() { + // Skip whitespace + p.skipWhitespace() + if p.done { + return + } + + // Start of non-whitespace + p.cur.err = nil + p.cur.offset, p.cur.line = p.offset, p.line + p.cur.unquoted = "" + switch p.s[0] { + case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': + // Single symbol + p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] + case '"', '\'': + // Quoted string + i := 1 + for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { + if p.s[i] == '\\' && i+1 < len(p.s) { + // skip escaped char + i++ + } + i++ + } + if i >= len(p.s) || p.s[i] != p.s[0] { + p.errorf("unmatched quote") + return + } + unq, err := unquoteC(p.s[1:i], rune(p.s[0])) + if err != nil { + p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) + return + } + p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] + p.cur.unquoted = unq + default: + i := 0 + for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { + i++ + } + if i == 0 { + p.errorf("unexpected byte %#x", p.s[0]) + return + } + p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] + } + p.offset += len(p.cur.value) +} + +var ( + errBadUTF8 = errors.New("proto: bad UTF-8") +) + +func unquoteC(s string, quote rune) (string, error) { + // This is based on C++'s tokenizer.cc. + // Despite its name, this is *not* parsing C syntax. + // For instance, "\0" is an invalid quoted string. + + // Avoid allocation in trivial cases. + simple := true + for _, r := range s { + if r == '\\' || r == quote { + simple = false + break + } + } + if simple { + return s, nil + } + + buf := make([]byte, 0, 3*len(s)/2) + for len(s) > 0 { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", errBadUTF8 + } + s = s[n:] + if r != '\\' { + if r < utf8.RuneSelf { + buf = append(buf, byte(r)) + } else { + buf = append(buf, string(r)...) + } + continue + } + + ch, tail, err := unescape(s) + if err != nil { + return "", err + } + buf = append(buf, ch...) + s = tail + } + return string(buf), nil +} + +func unescape(s string) (ch string, tail string, err error) { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", "", errBadUTF8 + } + s = s[n:] + switch r { + case 'a': + return "\a", s, nil + case 'b': + return "\b", s, nil + case 'f': + return "\f", s, nil + case 'n': + return "\n", s, nil + case 'r': + return "\r", s, nil + case 't': + return "\t", s, nil + case 'v': + return "\v", s, nil + case '?': + return "?", s, nil // trigraph workaround + case '\'', '"', '\\': + return string(r), s, nil + case '0', '1', '2', '3', '4', '5', '6', '7': + if len(s) < 2 { + return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) + } + ss := string(r) + s[:2] + s = s[2:] + i, err := strconv.ParseUint(ss, 8, 8) + if err != nil { + return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) + } + return string([]byte{byte(i)}), s, nil + case 'x', 'X', 'u', 'U': + var n int + switch r { + case 'x', 'X': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + if len(s) < n { + return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) + } + ss := s[:n] + s = s[n:] + i, err := strconv.ParseUint(ss, 16, 64) + if err != nil { + return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) + } + if r == 'x' || r == 'X' { + return string([]byte{byte(i)}), s, nil + } + if i > utf8.MaxRune { + return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) + } + return string(i), s, nil + } + return "", "", fmt.Errorf(`unknown escape \%c`, r) +} + +// Back off the parser by one token. Can only be done between calls to next(). +// It makes the next advance() a no-op. +func (p *textParser) back() { p.backed = true } + +// Advances the parser and returns the new current token. +func (p *textParser) next() *token { + if p.backed || p.done { + p.backed = false + return &p.cur + } + p.advance() + if p.done { + p.cur.value = "" + } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { + // Look for multiple quoted strings separated by whitespace, + // and concatenate them. + cat := p.cur + for { + p.skipWhitespace() + if p.done || !isQuote(p.s[0]) { + break + } + p.advance() + if p.cur.err != nil { + return &p.cur + } + cat.value += " " + p.cur.value + cat.unquoted += p.cur.unquoted + } + p.done = false // parser may have seen EOF, but we want to return cat + p.cur = cat + } + return &p.cur +} + +func (p *textParser) consumeToken(s string) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != s { + p.back() + return p.errorf("expected %q, found %q", s, tok.value) + } + return nil +} + +// Return a RequiredNotSetError indicating which required field was not set. +func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < st.NumField(); i++ { + if !isNil(sv.Field(i)) { + continue + } + + props := sprops.Prop[i] + if props.Required { + return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} + } + } + return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen +} + +// Returns the index in the struct for the named field, as well as the parsed tag properties. +func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { + i, ok := sprops.decoderOrigNames[name] + if ok { + return i, sprops.Prop[i], true + } + return -1, nil, false +} + +// Consume a ':' from the input stream (if the next token is a colon), +// returning an error if a colon is needed but not present. +func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ":" { + // Colon is optional when the field is a group or message. + needColon := true + switch props.Wire { + case "group": + needColon = false + case "bytes": + // A "bytes" field is either a message, a string, or a repeated field; + // those three become *T, *string and []T respectively, so we can check for + // this field being a pointer to a non-string. + if typ.Kind() == reflect.Ptr { + // *T or *string + if typ.Elem().Kind() == reflect.String { + break + } + } else if typ.Kind() == reflect.Slice { + // []T or []*T + if typ.Elem().Kind() != reflect.Ptr { + break + } + } else if typ.Kind() == reflect.String { + // The proto3 exception is for a string field, + // which requires a colon. + break + } + needColon = false + } + if needColon { + return p.errorf("expected ':', found %q", tok.value) + } + p.back() + } + return nil +} + +func (p *textParser) readStruct(sv reflect.Value, terminator string) error { + st := sv.Type() + sprops := GetProperties(st) + reqCount := sprops.reqCount + var reqFieldErr error + fieldSet := make(map[string]bool) + // A struct is a sequence of "name: value", terminated by one of + // '>' or '}', or the end of the input. A name may also be + // "[extension]" or "[type/url]". + // + // The whole struct can also be an expanded Any message, like: + // [type/url] < ... struct contents ... > + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + if tok.value == "[" { + // Looks like an extension or an Any. + // + // TODO: Check whether we need to handle + // namespace rooted names (e.g. ".something.Foo"). + extName, err := p.consumeExtName() + if err != nil { + return err + } + + if s := strings.LastIndex(extName, "/"); s >= 0 { + // If it contains a slash, it's an Any type URL. + messageName := extName[s+1:] + mt := MessageType(messageName) + if mt == nil { + return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) + } + tok = p.next() + if tok.err != nil { + return tok.err + } + // consume an optional colon + if tok.value == ":" { + tok = p.next() + if tok.err != nil { + return tok.err + } + } + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + v := reflect.New(mt.Elem()) + if pe := p.readStruct(v.Elem(), terminator); pe != nil { + return pe + } + b, err := Marshal(v.Interface().(Message)) + if err != nil { + return p.errorf("failed to marshal message of type %q: %v", messageName, err) + } + if fieldSet["type_url"] { + return p.errorf(anyRepeatedlyUnpacked, "type_url") + } + if fieldSet["value"] { + return p.errorf(anyRepeatedlyUnpacked, "value") + } + sv.FieldByName("TypeUrl").SetString(extName) + sv.FieldByName("Value").SetBytes(b) + fieldSet["type_url"] = true + fieldSet["value"] = true + continue + } + + var desc *ExtensionDesc + // This could be faster, but it's functional. + // TODO: Do something smarter than a linear scan. + for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { + if d.Name == extName { + desc = d + break + } + } + if desc == nil { + return p.errorf("unrecognized extension %q", extName) + } + + props := &Properties{} + props.Parse(desc.Tag) + + typ := reflect.TypeOf(desc.ExtensionType) + if err := p.checkForColon(props, typ); err != nil { + return err + } + + rep := desc.repeated() + + // Read the extension structure, and set it in + // the value we're constructing. + var ext reflect.Value + if !rep { + ext = reflect.New(typ).Elem() + } else { + ext = reflect.New(typ.Elem()).Elem() + } + if err := p.readAny(ext, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + ep := sv.Addr().Interface().(Message) + if !rep { + SetExtension(ep, desc, ext.Interface()) + } else { + old, err := GetExtension(ep, desc) + var sl reflect.Value + if err == nil { + sl = reflect.ValueOf(old) // existing slice + } else { + sl = reflect.MakeSlice(typ, 0, 1) + } + sl = reflect.Append(sl, ext) + SetExtension(ep, desc, sl.Interface()) + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + continue + } + + // This is a normal, non-extension field. + name := tok.value + var dst reflect.Value + fi, props, ok := structFieldByName(sprops, name) + if ok { + dst = sv.Field(fi) + } else if oop, ok := sprops.OneofTypes[name]; ok { + // It is a oneof. + props = oop.Prop + nv := reflect.New(oop.Type.Elem()) + dst = nv.Elem().Field(0) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) + } + field.Set(nv) + } + if !dst.IsValid() { + return p.errorf("unknown field name %q in %v", name, st) + } + + if dst.Kind() == reflect.Map { + // Consume any colon. + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Construct the map if it doesn't already exist. + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + key := reflect.New(dst.Type().Key()).Elem() + val := reflect.New(dst.Type().Elem()).Elem() + + // The map entry should be this sequence of tokens: + // < key : KEY value : VALUE > + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. + + tok := p.next() + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.MapKeyProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.MapValProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } + } + + dst.SetMapIndex(key, val) + continue + } + + // Check that it's not already set if it's not a repeated field. + if !props.Repeated && fieldSet[name] { + return p.errorf("non-repeated field %q was repeated", name) + } + + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Parse into the field. + fieldSet[name] = true + if err := p.readAny(dst, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + if props.Required { + reqCount-- + } + + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + + } + + if reqCount > 0 { + return p.missingRequiredFieldError(sv) + } + return reqFieldErr +} + +// consumeExtName consumes extension name or expanded Any type URL and the +// following ']'. It returns the name or URL consumed. +func (p *textParser) consumeExtName() (string, error) { + tok := p.next() + if tok.err != nil { + return "", tok.err + } + + // If extension name or type url is quoted, it's a single token. + if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { + name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) + if err != nil { + return "", err + } + return name, p.consumeToken("]") + } + + // Consume everything up to "]" + var parts []string + for tok.value != "]" { + parts = append(parts, tok.value) + tok = p.next() + if tok.err != nil { + return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) + } + if p.done && tok.value != "]" { + return "", p.errorf("unclosed type_url or extension name") + } + } + return strings.Join(parts, ""), nil +} + +// consumeOptionalSeparator consumes an optional semicolon or comma. +// It is used in readStruct to provide backward compatibility. +func (p *textParser) consumeOptionalSeparator() error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ";" && tok.value != "," { + p.back() + } + return nil +} + +func (p *textParser) readAny(v reflect.Value, props *Properties) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "" { + return p.errorf("unexpected EOF") + } + if len(props.CustomType) > 0 { + if props.Repeated { + t := reflect.TypeOf(v.Interface()) + if t.Kind() == reflect.Slice { + tc := reflect.TypeOf(new(Marshaler)) + ok := t.Elem().Implements(tc.Elem()) + if ok { + fv := v + flen := fv.Len() + if flen == fv.Cap() { + nav := reflect.MakeSlice(v.Type(), flen, 2*flen+1) + reflect.Copy(nav, fv) + fv.Set(nav) + } + fv.SetLen(flen + 1) + + // Read one. + p.back() + return p.readAny(fv.Index(flen), props) + } + } + } + if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { + custom := reflect.New(props.ctype.Elem()).Interface().(Unmarshaler) + err := custom.Unmarshal([]byte(tok.unquoted)) + if err != nil { + return p.errorf("%v %v: %v", err, v.Type(), tok.value) + } + v.Set(reflect.ValueOf(custom)) + } else { + custom := reflect.New(reflect.TypeOf(v.Interface())).Interface().(Unmarshaler) + err := custom.Unmarshal([]byte(tok.unquoted)) + if err != nil { + return p.errorf("%v %v: %v", err, v.Type(), tok.value) + } + v.Set(reflect.Indirect(reflect.ValueOf(custom))) + } + return nil + } + if props.StdTime { + fv := v + p.back() + props.StdTime = false + tproto := ×tamp{} + err := p.readAny(reflect.ValueOf(tproto).Elem(), props) + props.StdTime = true + if err != nil { + return err + } + tim, err := timestampFromProto(tproto) + if err != nil { + return err + } + if props.Repeated { + t := reflect.TypeOf(v.Interface()) + if t.Kind() == reflect.Slice { + if t.Elem().Kind() == reflect.Ptr { + ts := fv.Interface().([]*time.Time) + ts = append(ts, &tim) + fv.Set(reflect.ValueOf(ts)) + return nil + } else { + ts := fv.Interface().([]time.Time) + ts = append(ts, tim) + fv.Set(reflect.ValueOf(ts)) + return nil + } + } + } + if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { + v.Set(reflect.ValueOf(&tim)) + } else { + v.Set(reflect.Indirect(reflect.ValueOf(&tim))) + } + return nil + } + if props.StdDuration { + fv := v + p.back() + props.StdDuration = false + dproto := &duration{} + err := p.readAny(reflect.ValueOf(dproto).Elem(), props) + props.StdDuration = true + if err != nil { + return err + } + dur, err := durationFromProto(dproto) + if err != nil { + return err + } + if props.Repeated { + t := reflect.TypeOf(v.Interface()) + if t.Kind() == reflect.Slice { + if t.Elem().Kind() == reflect.Ptr { + ds := fv.Interface().([]*time.Duration) + ds = append(ds, &dur) + fv.Set(reflect.ValueOf(ds)) + return nil + } else { + ds := fv.Interface().([]time.Duration) + ds = append(ds, dur) + fv.Set(reflect.ValueOf(ds)) + return nil + } + } + } + if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { + v.Set(reflect.ValueOf(&dur)) + } else { + v.Set(reflect.Indirect(reflect.ValueOf(&dur))) + } + return nil + } + switch fv := v; fv.Kind() { + case reflect.Slice: + at := v.Type() + if at.Elem().Kind() == reflect.Uint8 { + // Special case for []byte + if tok.value[0] != '"' && tok.value[0] != '\'' { + // Deliberately written out here, as the error after + // this switch statement would write "invalid []byte: ...", + // which is not as user-friendly. + return p.errorf("invalid string: %v", tok.value) + } + bytes := []byte(tok.unquoted) + fv.Set(reflect.ValueOf(bytes)) + return nil + } + // Repeated field. + if tok.value == "[" { + // Repeated field with list notation, like [1,2,3]. + for { + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + err := p.readAny(fv.Index(fv.Len()-1), props) + if err != nil { + return err + } + ntok := p.next() + if ntok.err != nil { + return ntok.err + } + if ntok.value == "]" { + break + } + if ntok.value != "," { + return p.errorf("Expected ']' or ',' found %q", ntok.value) + } + } + return nil + } + // One value of the repeated field. + p.back() + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + return p.readAny(fv.Index(fv.Len()-1), props) + case reflect.Bool: + // true/1/t/True or false/f/0/False. + switch tok.value { + case "true", "1", "t", "True": + fv.SetBool(true) + return nil + case "false", "0", "f", "False": + fv.SetBool(false) + return nil + } + case reflect.Float32, reflect.Float64: + v := tok.value + // Ignore 'f' for compatibility with output generated by C++, but don't + // remove 'f' when the value is "-inf" or "inf". + if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { + v = v[:len(v)-1] + } + if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { + fv.SetFloat(f) + return nil + } + case reflect.Int8: + if x, err := strconv.ParseInt(tok.value, 0, 8); err == nil { + fv.SetInt(x) + return nil + } + case reflect.Int16: + if x, err := strconv.ParseInt(tok.value, 0, 16); err == nil { + fv.SetInt(x) + return nil + } + case reflect.Int32: + if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { + fv.SetInt(x) + return nil + } + + if len(props.Enum) == 0 { + break + } + m, ok := enumValueMaps[props.Enum] + if !ok { + break + } + x, ok := m[tok.value] + if !ok { + break + } + fv.SetInt(int64(x)) + return nil + case reflect.Int64: + if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { + fv.SetInt(x) + return nil + } + + case reflect.Ptr: + // A basic field (indirected through pointer), or a repeated message/group + p.back() + fv.Set(reflect.New(fv.Type().Elem())) + return p.readAny(fv.Elem(), props) + case reflect.String: + if tok.value[0] == '"' || tok.value[0] == '\'' { + fv.SetString(tok.unquoted) + return nil + } + case reflect.Struct: + var terminator string + switch tok.value { + case "{": + terminator = "}" + case "<": + terminator = ">" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + // TODO: Handle nested messages which implement encoding.TextUnmarshaler. + return p.readStruct(fv, terminator) + case reflect.Uint8: + if x, err := strconv.ParseUint(tok.value, 0, 8); err == nil { + fv.SetUint(x) + return nil + } + case reflect.Uint16: + if x, err := strconv.ParseUint(tok.value, 0, 16); err == nil { + fv.SetUint(x) + return nil + } + case reflect.Uint32: + if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { + fv.SetUint(uint64(x)) + return nil + } + case reflect.Uint64: + if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { + fv.SetUint(x) + return nil + } + } + return p.errorf("invalid %v: %v", v.Type(), tok.value) +} + +// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb +// before starting to unmarshal, so any existing data in pb is always removed. +// If a required field is not set and no other error occurs, +// UnmarshalText returns *RequiredNotSetError. +func UnmarshalText(s string, pb Message) error { + if um, ok := pb.(encoding.TextUnmarshaler); ok { + return um.UnmarshalText([]byte(s)) + } + pb.Reset() + v := reflect.ValueOf(pb) + return newTextParser(s).readStruct(v.Elem(), "") +} diff --git a/vendor/github.com/gogo/protobuf/proto/timestamp.go b/vendor/github.com/gogo/protobuf/proto/timestamp.go new file mode 100644 index 00000000..9324f654 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/timestamp.go @@ -0,0 +1,113 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// This file implements operations on google.protobuf.Timestamp. + +import ( + "errors" + "fmt" + "time" +) + +const ( + // Seconds field of the earliest valid Timestamp. + // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + minValidSeconds = -62135596800 + // Seconds field just after the latest valid Timestamp. + // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + maxValidSeconds = 253402300800 +) + +// validateTimestamp determines whether a Timestamp is valid. +// A valid timestamp represents a time in the range +// [0001-01-01, 10000-01-01) and has a Nanos field +// in the range [0, 1e9). +// +// If the Timestamp is valid, validateTimestamp returns nil. +// Otherwise, it returns an error that describes +// the problem. +// +// Every valid Timestamp can be represented by a time.Time, but the converse is not true. +func validateTimestamp(ts *timestamp) error { + if ts == nil { + return errors.New("timestamp: nil Timestamp") + } + if ts.Seconds < minValidSeconds { + return fmt.Errorf("timestamp: %#v before 0001-01-01", ts) + } + if ts.Seconds >= maxValidSeconds { + return fmt.Errorf("timestamp: %#v after 10000-01-01", ts) + } + if ts.Nanos < 0 || ts.Nanos >= 1e9 { + return fmt.Errorf("timestamp: %#v: nanos not in range [0, 1e9)", ts) + } + return nil +} + +// TimestampFromProto converts a google.protobuf.Timestamp proto to a time.Time. +// It returns an error if the argument is invalid. +// +// Unlike most Go functions, if Timestamp returns an error, the first return value +// is not the zero time.Time. Instead, it is the value obtained from the +// time.Unix function when passed the contents of the Timestamp, in the UTC +// locale. This may or may not be a meaningful time; many invalid Timestamps +// do map to valid time.Times. +// +// A nil Timestamp returns an error. The first return value in that case is +// undefined. +func timestampFromProto(ts *timestamp) (time.Time, error) { + // Don't return the zero value on error, because corresponds to a valid + // timestamp. Instead return whatever time.Unix gives us. + var t time.Time + if ts == nil { + t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp + } else { + t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() + } + return t, validateTimestamp(ts) +} + +// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. +// It returns an error if the resulting Timestamp is invalid. +func timestampProto(t time.Time) (*timestamp, error) { + seconds := t.Unix() + nanos := int32(t.Sub(time.Unix(seconds, 0))) + ts := ×tamp{ + Seconds: seconds, + Nanos: nanos, + } + if err := validateTimestamp(ts); err != nil { + return nil, err + } + return ts, nil +} diff --git a/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go b/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go new file mode 100644 index 00000000..38439fa9 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go @@ -0,0 +1,49 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2016, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" + "time" +) + +var timeType = reflect.TypeOf((*time.Time)(nil)).Elem() + +type timestamp struct { + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` +} + +func (m *timestamp) Reset() { *m = timestamp{} } +func (*timestamp) ProtoMessage() {} +func (*timestamp) String() string { return "timestamp" } + +func init() { + RegisterType((*timestamp)(nil), "gogo.protobuf.proto.timestamp") +} diff --git a/vendor/github.com/gogo/protobuf/proto/wrappers.go b/vendor/github.com/gogo/protobuf/proto/wrappers.go new file mode 100644 index 00000000..b175d1b6 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/wrappers.go @@ -0,0 +1,1888 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "io" + "reflect" +) + +func makeStdDoubleValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*float64) + v := &float64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdDoubleValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float64) + v := &float64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdDoubleValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float64) + v := &float64Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float64) + v := &float64Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdDoubleValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdDoubleValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdDoubleValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdDoubleValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdDoubleValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdFloatValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*float32) + v := &float32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdFloatValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float32) + v := &float32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdFloatValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float32) + v := &float32Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float32) + v := &float32Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdFloatValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdFloatValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdFloatValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdFloatValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdFloatValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt64ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*int64) + v := &int64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt64ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int64) + v := &int64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt64ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int64) + v := &int64Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int64) + v := &int64Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt64ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt64ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdInt64ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdInt64ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt64ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt64ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*uint64) + v := &uint64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt64ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint64) + v := &uint64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt64ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint64) + v := &uint64Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint64) + v := &uint64Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt64ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt64ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdUInt64ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdUInt64ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt64ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt32ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*int32) + v := &int32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt32ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int32) + v := &int32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt32ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int32) + v := &int32Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int32) + v := &int32Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt32ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt32ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdInt32ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdInt32ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt32ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt32ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*uint32) + v := &uint32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt32ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint32) + v := &uint32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt32ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint32) + v := &uint32Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint32) + v := &uint32Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt32ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt32ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdUInt32ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdUInt32ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt32ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBoolValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*bool) + v := &boolValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBoolValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*bool) + v := &boolValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBoolValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(bool) + v := &boolValue{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(bool) + v := &boolValue{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBoolValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBoolValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdBoolValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdBoolValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBoolValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdStringValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*string) + v := &stringValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdStringValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*string) + v := &stringValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdStringValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(string) + v := &stringValue{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(string) + v := &stringValue{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdStringValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdStringValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdStringValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdStringValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdStringValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBytesValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*[]byte) + v := &bytesValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBytesValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*[]byte) + v := &bytesValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBytesValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().([]byte) + v := &bytesValue{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().([]byte) + v := &bytesValue{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBytesValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBytesValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdBytesValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdBytesValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBytesValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go b/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go new file mode 100644 index 00000000..c1cf7bf8 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go @@ -0,0 +1,113 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +type float64Value struct { + Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *float64Value) Reset() { *m = float64Value{} } +func (*float64Value) ProtoMessage() {} +func (*float64Value) String() string { return "float64" } + +type float32Value struct { + Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *float32Value) Reset() { *m = float32Value{} } +func (*float32Value) ProtoMessage() {} +func (*float32Value) String() string { return "float32" } + +type int64Value struct { + Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *int64Value) Reset() { *m = int64Value{} } +func (*int64Value) ProtoMessage() {} +func (*int64Value) String() string { return "int64" } + +type uint64Value struct { + Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *uint64Value) Reset() { *m = uint64Value{} } +func (*uint64Value) ProtoMessage() {} +func (*uint64Value) String() string { return "uint64" } + +type int32Value struct { + Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *int32Value) Reset() { *m = int32Value{} } +func (*int32Value) ProtoMessage() {} +func (*int32Value) String() string { return "int32" } + +type uint32Value struct { + Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *uint32Value) Reset() { *m = uint32Value{} } +func (*uint32Value) ProtoMessage() {} +func (*uint32Value) String() string { return "uint32" } + +type boolValue struct { + Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *boolValue) Reset() { *m = boolValue{} } +func (*boolValue) ProtoMessage() {} +func (*boolValue) String() string { return "bool" } + +type stringValue struct { + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *stringValue) Reset() { *m = stringValue{} } +func (*stringValue) ProtoMessage() {} +func (*stringValue) String() string { return "string" } + +type bytesValue struct { + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *bytesValue) Reset() { *m = bytesValue{} } +func (*bytesValue) ProtoMessage() {} +func (*bytesValue) String() string { return "[]byte" } + +func init() { + RegisterType((*float64Value)(nil), "gogo.protobuf.proto.DoubleValue") + RegisterType((*float32Value)(nil), "gogo.protobuf.proto.FloatValue") + RegisterType((*int64Value)(nil), "gogo.protobuf.proto.Int64Value") + RegisterType((*uint64Value)(nil), "gogo.protobuf.proto.UInt64Value") + RegisterType((*int32Value)(nil), "gogo.protobuf.proto.Int32Value") + RegisterType((*uint32Value)(nil), "gogo.protobuf.proto.UInt32Value") + RegisterType((*boolValue)(nil), "gogo.protobuf.proto.BoolValue") + RegisterType((*stringValue)(nil), "gogo.protobuf.proto.StringValue") + RegisterType((*bytesValue)(nil), "gogo.protobuf.proto.BytesValue") +} diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile new file mode 100644 index 00000000..3496dc99 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile @@ -0,0 +1,36 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +regenerate: + go install github.com/gogo/protobuf/protoc-gen-gogo + go install github.com/gogo/protobuf/protoc-gen-gostring + protoc --gogo_out=. -I=../../protobuf/google/protobuf ../../protobuf/google/protobuf/descriptor.proto + protoc --gostring_out=. -I=../../protobuf/google/protobuf ../../protobuf/google/protobuf/descriptor.proto diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go new file mode 100644 index 00000000..a85bf198 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go @@ -0,0 +1,118 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Package descriptor provides functions for obtaining protocol buffer +// descriptors for generated Go types. +// +// These functions cannot go in package proto because they depend on the +// generated protobuf descriptor messages, which themselves depend on proto. +package descriptor + +import ( + "bytes" + "compress/gzip" + "fmt" + "io/ioutil" + + "github.com/gogo/protobuf/proto" +) + +// extractFile extracts a FileDescriptorProto from a gzip'd buffer. +func extractFile(gz []byte) (*FileDescriptorProto, error) { + r, err := gzip.NewReader(bytes.NewReader(gz)) + if err != nil { + return nil, fmt.Errorf("failed to open gzip reader: %v", err) + } + defer r.Close() + + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, fmt.Errorf("failed to uncompress descriptor: %v", err) + } + + fd := new(FileDescriptorProto) + if err := proto.Unmarshal(b, fd); err != nil { + return nil, fmt.Errorf("malformed FileDescriptorProto: %v", err) + } + + return fd, nil +} + +// Message is a proto.Message with a method to return its descriptor. +// +// Message types generated by the protocol compiler always satisfy +// the Message interface. +type Message interface { + proto.Message + Descriptor() ([]byte, []int) +} + +// ForMessage returns a FileDescriptorProto and a DescriptorProto from within it +// describing the given message. +func ForMessage(msg Message) (fd *FileDescriptorProto, md *DescriptorProto) { + gz, path := msg.Descriptor() + fd, err := extractFile(gz) + if err != nil { + panic(fmt.Sprintf("invalid FileDescriptorProto for %T: %v", msg, err)) + } + + md = fd.MessageType[path[0]] + for _, i := range path[1:] { + md = md.NestedType[i] + } + return fd, md +} + +// Is this field a scalar numeric type? +func (field *FieldDescriptorProto) IsScalar() bool { + if field.Type == nil { + return false + } + switch *field.Type { + case FieldDescriptorProto_TYPE_DOUBLE, + FieldDescriptorProto_TYPE_FLOAT, + FieldDescriptorProto_TYPE_INT64, + FieldDescriptorProto_TYPE_UINT64, + FieldDescriptorProto_TYPE_INT32, + FieldDescriptorProto_TYPE_FIXED64, + FieldDescriptorProto_TYPE_FIXED32, + FieldDescriptorProto_TYPE_BOOL, + FieldDescriptorProto_TYPE_UINT32, + FieldDescriptorProto_TYPE_ENUM, + FieldDescriptorProto_TYPE_SFIXED32, + FieldDescriptorProto_TYPE_SFIXED64, + FieldDescriptorProto_TYPE_SINT32, + FieldDescriptorProto_TYPE_SINT64: + return true + default: + return false + } +} diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go new file mode 100644 index 00000000..18b2a331 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go @@ -0,0 +1,2865 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: descriptor.proto + +package descriptor + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type FieldDescriptorProto_Type int32 + +const ( + // 0 is reserved for errors. + // Order is weird for historical reasons. + FieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1 + FieldDescriptorProto_TYPE_FLOAT FieldDescriptorProto_Type = 2 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT64 FieldDescriptorProto_Type = 3 + FieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT32 FieldDescriptorProto_Type = 5 + FieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6 + FieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7 + FieldDescriptorProto_TYPE_BOOL FieldDescriptorProto_Type = 8 + FieldDescriptorProto_TYPE_STRING FieldDescriptorProto_Type = 9 + // Tag-delimited aggregate. + // Group type is deprecated and not supported in proto3. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. + FieldDescriptorProto_TYPE_GROUP FieldDescriptorProto_Type = 10 + FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11 + // New in version 2. + FieldDescriptorProto_TYPE_BYTES FieldDescriptorProto_Type = 12 + FieldDescriptorProto_TYPE_UINT32 FieldDescriptorProto_Type = 13 + FieldDescriptorProto_TYPE_ENUM FieldDescriptorProto_Type = 14 + FieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15 + FieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16 + FieldDescriptorProto_TYPE_SINT32 FieldDescriptorProto_Type = 17 + FieldDescriptorProto_TYPE_SINT64 FieldDescriptorProto_Type = 18 +) + +var FieldDescriptorProto_Type_name = map[int32]string{ + 1: "TYPE_DOUBLE", + 2: "TYPE_FLOAT", + 3: "TYPE_INT64", + 4: "TYPE_UINT64", + 5: "TYPE_INT32", + 6: "TYPE_FIXED64", + 7: "TYPE_FIXED32", + 8: "TYPE_BOOL", + 9: "TYPE_STRING", + 10: "TYPE_GROUP", + 11: "TYPE_MESSAGE", + 12: "TYPE_BYTES", + 13: "TYPE_UINT32", + 14: "TYPE_ENUM", + 15: "TYPE_SFIXED32", + 16: "TYPE_SFIXED64", + 17: "TYPE_SINT32", + 18: "TYPE_SINT64", +} + +var FieldDescriptorProto_Type_value = map[string]int32{ + "TYPE_DOUBLE": 1, + "TYPE_FLOAT": 2, + "TYPE_INT64": 3, + "TYPE_UINT64": 4, + "TYPE_INT32": 5, + "TYPE_FIXED64": 6, + "TYPE_FIXED32": 7, + "TYPE_BOOL": 8, + "TYPE_STRING": 9, + "TYPE_GROUP": 10, + "TYPE_MESSAGE": 11, + "TYPE_BYTES": 12, + "TYPE_UINT32": 13, + "TYPE_ENUM": 14, + "TYPE_SFIXED32": 15, + "TYPE_SFIXED64": 16, + "TYPE_SINT32": 17, + "TYPE_SINT64": 18, +} + +func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type { + p := new(FieldDescriptorProto_Type) + *p = x + return p +} + +func (x FieldDescriptorProto_Type) String() string { + return proto.EnumName(FieldDescriptorProto_Type_name, int32(x)) +} + +func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type") + if err != nil { + return err + } + *x = FieldDescriptorProto_Type(value) + return nil +} + +func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{4, 0} +} + +type FieldDescriptorProto_Label int32 + +const ( + // 0 is reserved for errors + FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1 + FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2 + FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3 +) + +var FieldDescriptorProto_Label_name = map[int32]string{ + 1: "LABEL_OPTIONAL", + 2: "LABEL_REQUIRED", + 3: "LABEL_REPEATED", +} + +var FieldDescriptorProto_Label_value = map[string]int32{ + "LABEL_OPTIONAL": 1, + "LABEL_REQUIRED": 2, + "LABEL_REPEATED": 3, +} + +func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label { + p := new(FieldDescriptorProto_Label) + *p = x + return p +} + +func (x FieldDescriptorProto_Label) String() string { + return proto.EnumName(FieldDescriptorProto_Label_name, int32(x)) +} + +func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label") + if err != nil { + return err + } + *x = FieldDescriptorProto_Label(value) + return nil +} + +func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{4, 1} +} + +// Generated classes can be optimized for speed or code size. +type FileOptions_OptimizeMode int32 + +const ( + FileOptions_SPEED FileOptions_OptimizeMode = 1 + // etc. + FileOptions_CODE_SIZE FileOptions_OptimizeMode = 2 + FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3 +) + +var FileOptions_OptimizeMode_name = map[int32]string{ + 1: "SPEED", + 2: "CODE_SIZE", + 3: "LITE_RUNTIME", +} + +var FileOptions_OptimizeMode_value = map[string]int32{ + "SPEED": 1, + "CODE_SIZE": 2, + "LITE_RUNTIME": 3, +} + +func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode { + p := new(FileOptions_OptimizeMode) + *p = x + return p +} + +func (x FileOptions_OptimizeMode) String() string { + return proto.EnumName(FileOptions_OptimizeMode_name, int32(x)) +} + +func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode") + if err != nil { + return err + } + *x = FileOptions_OptimizeMode(value) + return nil +} + +func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{10, 0} +} + +type FieldOptions_CType int32 + +const ( + // Default mode. + FieldOptions_STRING FieldOptions_CType = 0 + FieldOptions_CORD FieldOptions_CType = 1 + FieldOptions_STRING_PIECE FieldOptions_CType = 2 +) + +var FieldOptions_CType_name = map[int32]string{ + 0: "STRING", + 1: "CORD", + 2: "STRING_PIECE", +} + +var FieldOptions_CType_value = map[string]int32{ + "STRING": 0, + "CORD": 1, + "STRING_PIECE": 2, +} + +func (x FieldOptions_CType) Enum() *FieldOptions_CType { + p := new(FieldOptions_CType) + *p = x + return p +} + +func (x FieldOptions_CType) String() string { + return proto.EnumName(FieldOptions_CType_name, int32(x)) +} + +func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType") + if err != nil { + return err + } + *x = FieldOptions_CType(value) + return nil +} + +func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{12, 0} +} + +type FieldOptions_JSType int32 + +const ( + // Use the default type. + FieldOptions_JS_NORMAL FieldOptions_JSType = 0 + // Use JavaScript strings. + FieldOptions_JS_STRING FieldOptions_JSType = 1 + // Use JavaScript numbers. + FieldOptions_JS_NUMBER FieldOptions_JSType = 2 +) + +var FieldOptions_JSType_name = map[int32]string{ + 0: "JS_NORMAL", + 1: "JS_STRING", + 2: "JS_NUMBER", +} + +var FieldOptions_JSType_value = map[string]int32{ + "JS_NORMAL": 0, + "JS_STRING": 1, + "JS_NUMBER": 2, +} + +func (x FieldOptions_JSType) Enum() *FieldOptions_JSType { + p := new(FieldOptions_JSType) + *p = x + return p +} + +func (x FieldOptions_JSType) String() string { + return proto.EnumName(FieldOptions_JSType_name, int32(x)) +} + +func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_JSType_value, data, "FieldOptions_JSType") + if err != nil { + return err + } + *x = FieldOptions_JSType(value) + return nil +} + +func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{12, 1} +} + +// Is this method side-effect-free (or safe in HTTP parlance), or idempotent, +// or neither? HTTP based RPC implementation may choose GET verb for safe +// methods, and PUT verb for idempotent methods instead of the default POST. +type MethodOptions_IdempotencyLevel int32 + +const ( + MethodOptions_IDEMPOTENCY_UNKNOWN MethodOptions_IdempotencyLevel = 0 + MethodOptions_NO_SIDE_EFFECTS MethodOptions_IdempotencyLevel = 1 + MethodOptions_IDEMPOTENT MethodOptions_IdempotencyLevel = 2 +) + +var MethodOptions_IdempotencyLevel_name = map[int32]string{ + 0: "IDEMPOTENCY_UNKNOWN", + 1: "NO_SIDE_EFFECTS", + 2: "IDEMPOTENT", +} + +var MethodOptions_IdempotencyLevel_value = map[string]int32{ + "IDEMPOTENCY_UNKNOWN": 0, + "NO_SIDE_EFFECTS": 1, + "IDEMPOTENT": 2, +} + +func (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel { + p := new(MethodOptions_IdempotencyLevel) + *p = x + return p +} + +func (x MethodOptions_IdempotencyLevel) String() string { + return proto.EnumName(MethodOptions_IdempotencyLevel_name, int32(x)) +} + +func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, "MethodOptions_IdempotencyLevel") + if err != nil { + return err + } + *x = MethodOptions_IdempotencyLevel(value) + return nil +} + +func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{17, 0} +} + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +type FileDescriptorSet struct { + File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } +func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorSet) ProtoMessage() {} +func (*FileDescriptorSet) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{0} +} +func (m *FileDescriptorSet) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorSet.Unmarshal(m, b) +} +func (m *FileDescriptorSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorSet.Marshal(b, m, deterministic) +} +func (m *FileDescriptorSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorSet.Merge(m, src) +} +func (m *FileDescriptorSet) XXX_Size() int { + return xxx_messageInfo_FileDescriptorSet.Size(m) +} +func (m *FileDescriptorSet) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorSet.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDescriptorSet proto.InternalMessageInfo + +func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto { + if m != nil { + return m.File + } + return nil +} + +// Describes a complete .proto file. +type FileDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` + // Names of files imported by this file. + Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"` + // Indexes of the public imported files in the dependency list above. + PublicDependency []int32 `protobuf:"varint,10,rep,name=public_dependency,json=publicDependency" json:"public_dependency,omitempty"` + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + WeakDependency []int32 `protobuf:"varint,11,rep,name=weak_dependency,json=weakDependency" json:"weak_dependency,omitempty"` + // All top-level definitions in this file. + MessageType []*DescriptorProto `protobuf:"bytes,4,rep,name=message_type,json=messageType" json:"message_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,5,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + Service []*ServiceDescriptorProto `protobuf:"bytes,6,rep,name=service" json:"service,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,7,rep,name=extension" json:"extension,omitempty"` + Options *FileOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} } +func (m *FileDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorProto) ProtoMessage() {} +func (*FileDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{1} +} +func (m *FileDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorProto.Unmarshal(m, b) +} +func (m *FileDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorProto.Marshal(b, m, deterministic) +} +func (m *FileDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorProto.Merge(m, src) +} +func (m *FileDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FileDescriptorProto.Size(m) +} +func (m *FileDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDescriptorProto proto.InternalMessageInfo + +func (m *FileDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FileDescriptorProto) GetPackage() string { + if m != nil && m.Package != nil { + return *m.Package + } + return "" +} + +func (m *FileDescriptorProto) GetDependency() []string { + if m != nil { + return m.Dependency + } + return nil +} + +func (m *FileDescriptorProto) GetPublicDependency() []int32 { + if m != nil { + return m.PublicDependency + } + return nil +} + +func (m *FileDescriptorProto) GetWeakDependency() []int32 { + if m != nil { + return m.WeakDependency + } + return nil +} + +func (m *FileDescriptorProto) GetMessageType() []*DescriptorProto { + if m != nil { + return m.MessageType + } + return nil +} + +func (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto { + if m != nil { + return m.Service + } + return nil +} + +func (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *FileDescriptorProto) GetOptions() *FileOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo { + if m != nil { + return m.SourceCodeInfo + } + return nil +} + +func (m *FileDescriptorProto) GetSyntax() string { + if m != nil && m.Syntax != nil { + return *m.Syntax + } + return "" +} + +// Describes a message type. +type DescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Field []*FieldDescriptorProto `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"` + NestedType []*DescriptorProto `protobuf:"bytes,3,rep,name=nested_type,json=nestedType" json:"nested_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,4,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + ExtensionRange []*DescriptorProto_ExtensionRange `protobuf:"bytes,5,rep,name=extension_range,json=extensionRange" json:"extension_range,omitempty"` + OneofDecl []*OneofDescriptorProto `protobuf:"bytes,8,rep,name=oneof_decl,json=oneofDecl" json:"oneof_decl,omitempty"` + Options *MessageOptions `protobuf:"bytes,7,opt,name=options" json:"options,omitempty"` + ReservedRange []*DescriptorProto_ReservedRange `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto) Reset() { *m = DescriptorProto{} } +func (m *DescriptorProto) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto) ProtoMessage() {} +func (*DescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{2} +} +func (m *DescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto.Unmarshal(m, b) +} +func (m *DescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto.Marshal(b, m, deterministic) +} +func (m *DescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto.Merge(m, src) +} +func (m *DescriptorProto) XXX_Size() int { + return xxx_messageInfo_DescriptorProto.Size(m) +} +func (m *DescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto proto.InternalMessageInfo + +func (m *DescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *DescriptorProto) GetField() []*FieldDescriptorProto { + if m != nil { + return m.Field + } + return nil +} + +func (m *DescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *DescriptorProto) GetNestedType() []*DescriptorProto { + if m != nil { + return m.NestedType + } + return nil +} + +func (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange { + if m != nil { + return m.ExtensionRange + } + return nil +} + +func (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto { + if m != nil { + return m.OneofDecl + } + return nil +} + +func (m *DescriptorProto) GetOptions() *MessageOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *DescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +type DescriptorProto_ExtensionRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + Options *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto_ExtensionRange) Reset() { *m = DescriptorProto_ExtensionRange{} } +func (m *DescriptorProto_ExtensionRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ExtensionRange) ProtoMessage() {} +func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{2, 0} +} +func (m *DescriptorProto_ExtensionRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Unmarshal(m, b) +} +func (m *DescriptorProto_ExtensionRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Marshal(b, m, deterministic) +} +func (m *DescriptorProto_ExtensionRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ExtensionRange.Merge(m, src) +} +func (m *DescriptorProto_ExtensionRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Size(m) +} +func (m *DescriptorProto_ExtensionRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ExtensionRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ExtensionRange proto.InternalMessageInfo + +func (m *DescriptorProto_ExtensionRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions { + if m != nil { + return m.Options + } + return nil +} + +// Range of reserved tag numbers. Reserved tag numbers may not be used by +// fields or extension ranges in the same message. Reserved ranges may +// not overlap. +type DescriptorProto_ReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto_ReservedRange) Reset() { *m = DescriptorProto_ReservedRange{} } +func (m *DescriptorProto_ReservedRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ReservedRange) ProtoMessage() {} +func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{2, 1} +} +func (m *DescriptorProto_ReservedRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ReservedRange.Unmarshal(m, b) +} +func (m *DescriptorProto_ReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ReservedRange.Marshal(b, m, deterministic) +} +func (m *DescriptorProto_ReservedRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ReservedRange.Merge(m, src) +} +func (m *DescriptorProto_ReservedRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ReservedRange.Size(m) +} +func (m *DescriptorProto_ReservedRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ReservedRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ReservedRange proto.InternalMessageInfo + +func (m *DescriptorProto_ReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +type ExtensionRangeOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExtensionRangeOptions) Reset() { *m = ExtensionRangeOptions{} } +func (m *ExtensionRangeOptions) String() string { return proto.CompactTextString(m) } +func (*ExtensionRangeOptions) ProtoMessage() {} +func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{3} +} + +var extRange_ExtensionRangeOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*ExtensionRangeOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ExtensionRangeOptions +} + +func (m *ExtensionRangeOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExtensionRangeOptions.Unmarshal(m, b) +} +func (m *ExtensionRangeOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExtensionRangeOptions.Marshal(b, m, deterministic) +} +func (m *ExtensionRangeOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExtensionRangeOptions.Merge(m, src) +} +func (m *ExtensionRangeOptions) XXX_Size() int { + return xxx_messageInfo_ExtensionRangeOptions.Size(m) +} +func (m *ExtensionRangeOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ExtensionRangeOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ExtensionRangeOptions proto.InternalMessageInfo + +func (m *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// Describes a field within a message. +type FieldDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,3,opt,name=number" json:"number,omitempty"` + Label *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"` + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + Type *FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type" json:"type,omitempty"` + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + TypeName *string `protobuf:"bytes,6,opt,name=type_name,json=typeName" json:"type_name,omitempty"` + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + Extendee *string `protobuf:"bytes,2,opt,name=extendee" json:"extendee,omitempty"` + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + OneofIndex *int32 `protobuf:"varint,9,opt,name=oneof_index,json=oneofIndex" json:"oneof_index,omitempty"` + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + JsonName *string `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"` + Options *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} } +func (m *FieldDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FieldDescriptorProto) ProtoMessage() {} +func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{4} +} +func (m *FieldDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldDescriptorProto.Unmarshal(m, b) +} +func (m *FieldDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldDescriptorProto.Marshal(b, m, deterministic) +} +func (m *FieldDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldDescriptorProto.Merge(m, src) +} +func (m *FieldDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FieldDescriptorProto.Size(m) +} +func (m *FieldDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FieldDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldDescriptorProto proto.InternalMessageInfo + +func (m *FieldDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FieldDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label { + if m != nil && m.Label != nil { + return *m.Label + } + return FieldDescriptorProto_LABEL_OPTIONAL +} + +func (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return FieldDescriptorProto_TYPE_DOUBLE +} + +func (m *FieldDescriptorProto) GetTypeName() string { + if m != nil && m.TypeName != nil { + return *m.TypeName + } + return "" +} + +func (m *FieldDescriptorProto) GetExtendee() string { + if m != nil && m.Extendee != nil { + return *m.Extendee + } + return "" +} + +func (m *FieldDescriptorProto) GetDefaultValue() string { + if m != nil && m.DefaultValue != nil { + return *m.DefaultValue + } + return "" +} + +func (m *FieldDescriptorProto) GetOneofIndex() int32 { + if m != nil && m.OneofIndex != nil { + return *m.OneofIndex + } + return 0 +} + +func (m *FieldDescriptorProto) GetJsonName() string { + if m != nil && m.JsonName != nil { + return *m.JsonName + } + return "" +} + +func (m *FieldDescriptorProto) GetOptions() *FieldOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a oneof. +type OneofDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} } +func (m *OneofDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*OneofDescriptorProto) ProtoMessage() {} +func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{5} +} +func (m *OneofDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofDescriptorProto.Unmarshal(m, b) +} +func (m *OneofDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofDescriptorProto.Marshal(b, m, deterministic) +} +func (m *OneofDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofDescriptorProto.Merge(m, src) +} +func (m *OneofDescriptorProto) XXX_Size() int { + return xxx_messageInfo_OneofDescriptorProto.Size(m) +} +func (m *OneofDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_OneofDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_OneofDescriptorProto proto.InternalMessageInfo + +func (m *OneofDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *OneofDescriptorProto) GetOptions() *OneofOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes an enum type. +type EnumDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` + Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + // Range of reserved numeric values. Reserved numeric values may not be used + // by enum values in the same enum declaration. Reserved ranges may not + // overlap. + ReservedRange []*EnumDescriptorProto_EnumReservedRange `protobuf:"bytes,4,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved enum value names, which may not be reused. A given name may only + // be reserved once. + ReservedName []string `protobuf:"bytes,5,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} } +func (m *EnumDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto) ProtoMessage() {} +func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{6} +} +func (m *EnumDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto.Unmarshal(m, b) +} +func (m *EnumDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto.Marshal(b, m, deterministic) +} +func (m *EnumDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto.Merge(m, src) +} +func (m *EnumDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto.Size(m) +} +func (m *EnumDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumDescriptorProto proto.InternalMessageInfo + +func (m *EnumDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto { + if m != nil { + return m.Value + } + return nil +} + +func (m *EnumDescriptorProto) GetOptions() *EnumOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *EnumDescriptorProto) GetReservedRange() []*EnumDescriptorProto_EnumReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *EnumDescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +// Range of reserved numeric values. Reserved values may not be used by +// entries in the same enum. Reserved ranges may not overlap. +// +// Note that this is distinct from DescriptorProto.ReservedRange in that it +// is inclusive such that it can appropriately represent the entire int32 +// domain. +type EnumDescriptorProto_EnumReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto_EnumReservedRange) Reset() { *m = EnumDescriptorProto_EnumReservedRange{} } +func (m *EnumDescriptorProto_EnumReservedRange) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {} +func (*EnumDescriptorProto_EnumReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{6, 0} +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Unmarshal(m, b) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Marshal(b, m, deterministic) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Merge(m, src) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Size(m) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumDescriptorProto_EnumReservedRange proto.InternalMessageInfo + +func (m *EnumDescriptorProto_EnumReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +// Describes a value within an enum. +type EnumValueDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` + Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} } +func (m *EnumValueDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumValueDescriptorProto) ProtoMessage() {} +func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{7} +} +func (m *EnumValueDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueDescriptorProto.Unmarshal(m, b) +} +func (m *EnumValueDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueDescriptorProto.Marshal(b, m, deterministic) +} +func (m *EnumValueDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueDescriptorProto.Merge(m, src) +} +func (m *EnumValueDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumValueDescriptorProto.Size(m) +} +func (m *EnumValueDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueDescriptorProto proto.InternalMessageInfo + +func (m *EnumValueDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumValueDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a service. +type ServiceDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` + Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} } +func (m *ServiceDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*ServiceDescriptorProto) ProtoMessage() {} +func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{8} +} +func (m *ServiceDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceDescriptorProto.Unmarshal(m, b) +} +func (m *ServiceDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceDescriptorProto.Marshal(b, m, deterministic) +} +func (m *ServiceDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceDescriptorProto.Merge(m, src) +} +func (m *ServiceDescriptorProto) XXX_Size() int { + return xxx_messageInfo_ServiceDescriptorProto.Size(m) +} +func (m *ServiceDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceDescriptorProto proto.InternalMessageInfo + +func (m *ServiceDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto { + if m != nil { + return m.Method + } + return nil +} + +func (m *ServiceDescriptorProto) GetOptions() *ServiceOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a method of a service. +type MethodDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + InputType *string `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"` + OutputType *string `protobuf:"bytes,3,opt,name=output_type,json=outputType" json:"output_type,omitempty"` + Options *MethodOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"` + // Identifies if client streams multiple client messages + ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"` + // Identifies if server streams multiple server messages + ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} } +func (m *MethodDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*MethodDescriptorProto) ProtoMessage() {} +func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{9} +} +func (m *MethodDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodDescriptorProto.Unmarshal(m, b) +} +func (m *MethodDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodDescriptorProto.Marshal(b, m, deterministic) +} +func (m *MethodDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodDescriptorProto.Merge(m, src) +} +func (m *MethodDescriptorProto) XXX_Size() int { + return xxx_messageInfo_MethodDescriptorProto.Size(m) +} +func (m *MethodDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_MethodDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodDescriptorProto proto.InternalMessageInfo + +const Default_MethodDescriptorProto_ClientStreaming bool = false +const Default_MethodDescriptorProto_ServerStreaming bool = false + +func (m *MethodDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MethodDescriptorProto) GetInputType() string { + if m != nil && m.InputType != nil { + return *m.InputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOutputType() string { + if m != nil && m.OutputType != nil { + return *m.OutputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOptions() *MethodOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *MethodDescriptorProto) GetClientStreaming() bool { + if m != nil && m.ClientStreaming != nil { + return *m.ClientStreaming + } + return Default_MethodDescriptorProto_ClientStreaming +} + +func (m *MethodDescriptorProto) GetServerStreaming() bool { + if m != nil && m.ServerStreaming != nil { + return *m.ServerStreaming + } + return Default_MethodDescriptorProto_ServerStreaming +} + +type FileOptions struct { + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` + // This option does nothing. + JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` // Deprecated: Do not use. + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + JavaStringCheckUtf8 *bool `protobuf:"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0" json:"java_string_check_utf8,omitempty"` + OptimizeFor *FileOptions_OptimizeMode `protobuf:"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1" json:"optimize_for,omitempty"` + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + GoPackage *string `protobuf:"bytes,11,opt,name=go_package,json=goPackage" json:"go_package,omitempty"` + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + CcGenericServices *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"` + JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"` + PyGenericServices *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"` + PhpGenericServices *bool `protobuf:"varint,42,opt,name=php_generic_services,json=phpGenericServices,def=0" json:"php_generic_services,omitempty"` + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + Deprecated *bool `protobuf:"varint,23,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + CcEnableArenas *bool `protobuf:"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0" json:"cc_enable_arenas,omitempty"` + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + ObjcClassPrefix *string `protobuf:"bytes,36,opt,name=objc_class_prefix,json=objcClassPrefix" json:"objc_class_prefix,omitempty"` + // Namespace for generated classes; defaults to the package. + CsharpNamespace *string `protobuf:"bytes,37,opt,name=csharp_namespace,json=csharpNamespace" json:"csharp_namespace,omitempty"` + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + SwiftPrefix *string `protobuf:"bytes,39,opt,name=swift_prefix,json=swiftPrefix" json:"swift_prefix,omitempty"` + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + PhpClassPrefix *string `protobuf:"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix" json:"php_class_prefix,omitempty"` + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + PhpNamespace *string `protobuf:"bytes,41,opt,name=php_namespace,json=phpNamespace" json:"php_namespace,omitempty"` + // Use this option to change the namespace of php generated metadata classes. + // Default is empty. When this option is empty, the proto file name will be + // used for determining the namespace. + PhpMetadataNamespace *string `protobuf:"bytes,44,opt,name=php_metadata_namespace,json=phpMetadataNamespace" json:"php_metadata_namespace,omitempty"` + // Use this option to change the package of ruby generated classes. Default + // is empty. When this option is not set, the package name will be used for + // determining the ruby package. + RubyPackage *string `protobuf:"bytes,45,opt,name=ruby_package,json=rubyPackage" json:"ruby_package,omitempty"` + // The parser stores options it doesn't recognize here. + // See the documentation for the "Options" section above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileOptions) Reset() { *m = FileOptions{} } +func (m *FileOptions) String() string { return proto.CompactTextString(m) } +func (*FileOptions) ProtoMessage() {} +func (*FileOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{10} +} + +var extRange_FileOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*FileOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FileOptions +} + +func (m *FileOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileOptions.Unmarshal(m, b) +} +func (m *FileOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileOptions.Marshal(b, m, deterministic) +} +func (m *FileOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileOptions.Merge(m, src) +} +func (m *FileOptions) XXX_Size() int { + return xxx_messageInfo_FileOptions.Size(m) +} +func (m *FileOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FileOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FileOptions proto.InternalMessageInfo + +const Default_FileOptions_JavaMultipleFiles bool = false +const Default_FileOptions_JavaStringCheckUtf8 bool = false +const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED +const Default_FileOptions_CcGenericServices bool = false +const Default_FileOptions_JavaGenericServices bool = false +const Default_FileOptions_PyGenericServices bool = false +const Default_FileOptions_PhpGenericServices bool = false +const Default_FileOptions_Deprecated bool = false +const Default_FileOptions_CcEnableArenas bool = false + +func (m *FileOptions) GetJavaPackage() string { + if m != nil && m.JavaPackage != nil { + return *m.JavaPackage + } + return "" +} + +func (m *FileOptions) GetJavaOuterClassname() string { + if m != nil && m.JavaOuterClassname != nil { + return *m.JavaOuterClassname + } + return "" +} + +func (m *FileOptions) GetJavaMultipleFiles() bool { + if m != nil && m.JavaMultipleFiles != nil { + return *m.JavaMultipleFiles + } + return Default_FileOptions_JavaMultipleFiles +} + +// Deprecated: Do not use. +func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool { + if m != nil && m.JavaGenerateEqualsAndHash != nil { + return *m.JavaGenerateEqualsAndHash + } + return false +} + +func (m *FileOptions) GetJavaStringCheckUtf8() bool { + if m != nil && m.JavaStringCheckUtf8 != nil { + return *m.JavaStringCheckUtf8 + } + return Default_FileOptions_JavaStringCheckUtf8 +} + +func (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode { + if m != nil && m.OptimizeFor != nil { + return *m.OptimizeFor + } + return Default_FileOptions_OptimizeFor +} + +func (m *FileOptions) GetGoPackage() string { + if m != nil && m.GoPackage != nil { + return *m.GoPackage + } + return "" +} + +func (m *FileOptions) GetCcGenericServices() bool { + if m != nil && m.CcGenericServices != nil { + return *m.CcGenericServices + } + return Default_FileOptions_CcGenericServices +} + +func (m *FileOptions) GetJavaGenericServices() bool { + if m != nil && m.JavaGenericServices != nil { + return *m.JavaGenericServices + } + return Default_FileOptions_JavaGenericServices +} + +func (m *FileOptions) GetPyGenericServices() bool { + if m != nil && m.PyGenericServices != nil { + return *m.PyGenericServices + } + return Default_FileOptions_PyGenericServices +} + +func (m *FileOptions) GetPhpGenericServices() bool { + if m != nil && m.PhpGenericServices != nil { + return *m.PhpGenericServices + } + return Default_FileOptions_PhpGenericServices +} + +func (m *FileOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FileOptions_Deprecated +} + +func (m *FileOptions) GetCcEnableArenas() bool { + if m != nil && m.CcEnableArenas != nil { + return *m.CcEnableArenas + } + return Default_FileOptions_CcEnableArenas +} + +func (m *FileOptions) GetObjcClassPrefix() string { + if m != nil && m.ObjcClassPrefix != nil { + return *m.ObjcClassPrefix + } + return "" +} + +func (m *FileOptions) GetCsharpNamespace() string { + if m != nil && m.CsharpNamespace != nil { + return *m.CsharpNamespace + } + return "" +} + +func (m *FileOptions) GetSwiftPrefix() string { + if m != nil && m.SwiftPrefix != nil { + return *m.SwiftPrefix + } + return "" +} + +func (m *FileOptions) GetPhpClassPrefix() string { + if m != nil && m.PhpClassPrefix != nil { + return *m.PhpClassPrefix + } + return "" +} + +func (m *FileOptions) GetPhpNamespace() string { + if m != nil && m.PhpNamespace != nil { + return *m.PhpNamespace + } + return "" +} + +func (m *FileOptions) GetPhpMetadataNamespace() string { + if m != nil && m.PhpMetadataNamespace != nil { + return *m.PhpMetadataNamespace + } + return "" +} + +func (m *FileOptions) GetRubyPackage() string { + if m != nil && m.RubyPackage != nil { + return *m.RubyPackage + } + return "" +} + +func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MessageOptions struct { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + MessageSetWireFormat *bool `protobuf:"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0" json:"message_set_wire_format,omitempty"` + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + NoStandardDescriptorAccessor *bool `protobuf:"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0" json:"no_standard_descriptor_accessor,omitempty"` + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementations still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MessageOptions) Reset() { *m = MessageOptions{} } +func (m *MessageOptions) String() string { return proto.CompactTextString(m) } +func (*MessageOptions) ProtoMessage() {} +func (*MessageOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{11} +} + +var extRange_MessageOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*MessageOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MessageOptions +} + +func (m *MessageOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MessageOptions.Unmarshal(m, b) +} +func (m *MessageOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MessageOptions.Marshal(b, m, deterministic) +} +func (m *MessageOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MessageOptions.Merge(m, src) +} +func (m *MessageOptions) XXX_Size() int { + return xxx_messageInfo_MessageOptions.Size(m) +} +func (m *MessageOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MessageOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MessageOptions proto.InternalMessageInfo + +const Default_MessageOptions_MessageSetWireFormat bool = false +const Default_MessageOptions_NoStandardDescriptorAccessor bool = false +const Default_MessageOptions_Deprecated bool = false + +func (m *MessageOptions) GetMessageSetWireFormat() bool { + if m != nil && m.MessageSetWireFormat != nil { + return *m.MessageSetWireFormat + } + return Default_MessageOptions_MessageSetWireFormat +} + +func (m *MessageOptions) GetNoStandardDescriptorAccessor() bool { + if m != nil && m.NoStandardDescriptorAccessor != nil { + return *m.NoStandardDescriptorAccessor + } + return Default_MessageOptions_NoStandardDescriptorAccessor +} + +func (m *MessageOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MessageOptions_Deprecated +} + +func (m *MessageOptions) GetMapEntry() bool { + if m != nil && m.MapEntry != nil { + return *m.MapEntry + } + return false +} + +func (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type FieldOptions struct { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. + Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"` + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. + Jstype *FieldOptions_JSType `protobuf:"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0" json:"jstype,omitempty"` + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // For Google-internal migration only. Do not use. + Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldOptions) Reset() { *m = FieldOptions{} } +func (m *FieldOptions) String() string { return proto.CompactTextString(m) } +func (*FieldOptions) ProtoMessage() {} +func (*FieldOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{12} +} + +var extRange_FieldOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*FieldOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FieldOptions +} + +func (m *FieldOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldOptions.Unmarshal(m, b) +} +func (m *FieldOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldOptions.Marshal(b, m, deterministic) +} +func (m *FieldOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldOptions.Merge(m, src) +} +func (m *FieldOptions) XXX_Size() int { + return xxx_messageInfo_FieldOptions.Size(m) +} +func (m *FieldOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FieldOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldOptions proto.InternalMessageInfo + +const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING +const Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL +const Default_FieldOptions_Lazy bool = false +const Default_FieldOptions_Deprecated bool = false +const Default_FieldOptions_Weak bool = false + +func (m *FieldOptions) GetCtype() FieldOptions_CType { + if m != nil && m.Ctype != nil { + return *m.Ctype + } + return Default_FieldOptions_Ctype +} + +func (m *FieldOptions) GetPacked() bool { + if m != nil && m.Packed != nil { + return *m.Packed + } + return false +} + +func (m *FieldOptions) GetJstype() FieldOptions_JSType { + if m != nil && m.Jstype != nil { + return *m.Jstype + } + return Default_FieldOptions_Jstype +} + +func (m *FieldOptions) GetLazy() bool { + if m != nil && m.Lazy != nil { + return *m.Lazy + } + return Default_FieldOptions_Lazy +} + +func (m *FieldOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FieldOptions_Deprecated +} + +func (m *FieldOptions) GetWeak() bool { + if m != nil && m.Weak != nil { + return *m.Weak + } + return Default_FieldOptions_Weak +} + +func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type OneofOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OneofOptions) Reset() { *m = OneofOptions{} } +func (m *OneofOptions) String() string { return proto.CompactTextString(m) } +func (*OneofOptions) ProtoMessage() {} +func (*OneofOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{13} +} + +var extRange_OneofOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*OneofOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OneofOptions +} + +func (m *OneofOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofOptions.Unmarshal(m, b) +} +func (m *OneofOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofOptions.Marshal(b, m, deterministic) +} +func (m *OneofOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofOptions.Merge(m, src) +} +func (m *OneofOptions) XXX_Size() int { + return xxx_messageInfo_OneofOptions.Size(m) +} +func (m *OneofOptions) XXX_DiscardUnknown() { + xxx_messageInfo_OneofOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_OneofOptions proto.InternalMessageInfo + +func (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumOptions struct { + // Set this option to true to allow mapping different tag names to the same + // value. + AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"` + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumOptions) Reset() { *m = EnumOptions{} } +func (m *EnumOptions) String() string { return proto.CompactTextString(m) } +func (*EnumOptions) ProtoMessage() {} +func (*EnumOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{14} +} + +var extRange_EnumOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*EnumOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumOptions +} + +func (m *EnumOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumOptions.Unmarshal(m, b) +} +func (m *EnumOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumOptions.Marshal(b, m, deterministic) +} +func (m *EnumOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumOptions.Merge(m, src) +} +func (m *EnumOptions) XXX_Size() int { + return xxx_messageInfo_EnumOptions.Size(m) +} +func (m *EnumOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumOptions proto.InternalMessageInfo + +const Default_EnumOptions_Deprecated bool = false + +func (m *EnumOptions) GetAllowAlias() bool { + if m != nil && m.AllowAlias != nil { + return *m.AllowAlias + } + return false +} + +func (m *EnumOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumOptions_Deprecated +} + +func (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumValueOptions struct { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} } +func (m *EnumValueOptions) String() string { return proto.CompactTextString(m) } +func (*EnumValueOptions) ProtoMessage() {} +func (*EnumValueOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{15} +} + +var extRange_EnumValueOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*EnumValueOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumValueOptions +} + +func (m *EnumValueOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueOptions.Unmarshal(m, b) +} +func (m *EnumValueOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueOptions.Marshal(b, m, deterministic) +} +func (m *EnumValueOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueOptions.Merge(m, src) +} +func (m *EnumValueOptions) XXX_Size() int { + return xxx_messageInfo_EnumValueOptions.Size(m) +} +func (m *EnumValueOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueOptions proto.InternalMessageInfo + +const Default_EnumValueOptions_Deprecated bool = false + +func (m *EnumValueOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumValueOptions_Deprecated +} + +func (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type ServiceOptions struct { + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceOptions) Reset() { *m = ServiceOptions{} } +func (m *ServiceOptions) String() string { return proto.CompactTextString(m) } +func (*ServiceOptions) ProtoMessage() {} +func (*ServiceOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{16} +} + +var extRange_ServiceOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*ServiceOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ServiceOptions +} + +func (m *ServiceOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceOptions.Unmarshal(m, b) +} +func (m *ServiceOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceOptions.Marshal(b, m, deterministic) +} +func (m *ServiceOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceOptions.Merge(m, src) +} +func (m *ServiceOptions) XXX_Size() int { + return xxx_messageInfo_ServiceOptions.Size(m) +} +func (m *ServiceOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceOptions proto.InternalMessageInfo + +const Default_ServiceOptions_Deprecated bool = false + +func (m *ServiceOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_ServiceOptions_Deprecated +} + +func (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MethodOptions struct { + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodOptions) Reset() { *m = MethodOptions{} } +func (m *MethodOptions) String() string { return proto.CompactTextString(m) } +func (*MethodOptions) ProtoMessage() {} +func (*MethodOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{17} +} + +var extRange_MethodOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*MethodOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MethodOptions +} + +func (m *MethodOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodOptions.Unmarshal(m, b) +} +func (m *MethodOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodOptions.Marshal(b, m, deterministic) +} +func (m *MethodOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodOptions.Merge(m, src) +} +func (m *MethodOptions) XXX_Size() int { + return xxx_messageInfo_MethodOptions.Size(m) +} +func (m *MethodOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MethodOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodOptions proto.InternalMessageInfo + +const Default_MethodOptions_Deprecated bool = false +const Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN + +func (m *MethodOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MethodOptions_Deprecated +} + +func (m *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel { + if m != nil && m.IdempotencyLevel != nil { + return *m.IdempotencyLevel + } + return Default_MethodOptions_IdempotencyLevel +} + +func (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +type UninterpretedOption struct { + Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` + PositiveIntValue *uint64 `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"` + NegativeIntValue *int64 `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"` + DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` + StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` + AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} } +func (m *UninterpretedOption) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption) ProtoMessage() {} +func (*UninterpretedOption) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{18} +} +func (m *UninterpretedOption) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption.Unmarshal(m, b) +} +func (m *UninterpretedOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption.Marshal(b, m, deterministic) +} +func (m *UninterpretedOption) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption.Merge(m, src) +} +func (m *UninterpretedOption) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption.Size(m) +} +func (m *UninterpretedOption) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption proto.InternalMessageInfo + +func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart { + if m != nil { + return m.Name + } + return nil +} + +func (m *UninterpretedOption) GetIdentifierValue() string { + if m != nil && m.IdentifierValue != nil { + return *m.IdentifierValue + } + return "" +} + +func (m *UninterpretedOption) GetPositiveIntValue() uint64 { + if m != nil && m.PositiveIntValue != nil { + return *m.PositiveIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetNegativeIntValue() int64 { + if m != nil && m.NegativeIntValue != nil { + return *m.NegativeIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetDoubleValue() float64 { + if m != nil && m.DoubleValue != nil { + return *m.DoubleValue + } + return 0 +} + +func (m *UninterpretedOption) GetStringValue() []byte { + if m != nil { + return m.StringValue + } + return nil +} + +func (m *UninterpretedOption) GetAggregateValue() string { + if m != nil && m.AggregateValue != nil { + return *m.AggregateValue + } + return "" +} + +// The name of the uninterpreted option. Each string represents a segment in +// a dot-separated name. is_extension is true iff a segment represents an +// extension (denoted with parentheses in options specs in .proto files). +// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents +// "foo.(bar.baz).qux". +type UninterpretedOption_NamePart struct { + NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` + IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption_NamePart) Reset() { *m = UninterpretedOption_NamePart{} } +func (m *UninterpretedOption_NamePart) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption_NamePart) ProtoMessage() {} +func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{18, 0} +} +func (m *UninterpretedOption_NamePart) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption_NamePart.Unmarshal(m, b) +} +func (m *UninterpretedOption_NamePart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption_NamePart.Marshal(b, m, deterministic) +} +func (m *UninterpretedOption_NamePart) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption_NamePart.Merge(m, src) +} +func (m *UninterpretedOption_NamePart) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption_NamePart.Size(m) +} +func (m *UninterpretedOption_NamePart) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption_NamePart.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption_NamePart proto.InternalMessageInfo + +func (m *UninterpretedOption_NamePart) GetNamePart() string { + if m != nil && m.NamePart != nil { + return *m.NamePart + } + return "" +} + +func (m *UninterpretedOption_NamePart) GetIsExtension() bool { + if m != nil && m.IsExtension != nil { + return *m.IsExtension + } + return false +} + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +type SourceCodeInfo struct { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendant. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} } +func (m *SourceCodeInfo) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo) ProtoMessage() {} +func (*SourceCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{19} +} +func (m *SourceCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo.Unmarshal(m, b) +} +func (m *SourceCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo.Marshal(b, m, deterministic) +} +func (m *SourceCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo.Merge(m, src) +} +func (m *SourceCodeInfo) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo.Size(m) +} +func (m *SourceCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceCodeInfo proto.InternalMessageInfo + +func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { + if m != nil { + return m.Location + } + return nil +} + +type SourceCodeInfo_Location struct { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + Span []int32 `protobuf:"varint,2,rep,packed,name=span" json:"span,omitempty"` + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to qux or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` + TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` + LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} } +func (m *SourceCodeInfo_Location) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo_Location) ProtoMessage() {} +func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{19, 0} +} +func (m *SourceCodeInfo_Location) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo_Location.Unmarshal(m, b) +} +func (m *SourceCodeInfo_Location) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo_Location.Marshal(b, m, deterministic) +} +func (m *SourceCodeInfo_Location) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo_Location.Merge(m, src) +} +func (m *SourceCodeInfo_Location) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo_Location.Size(m) +} +func (m *SourceCodeInfo_Location) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo_Location.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceCodeInfo_Location proto.InternalMessageInfo + +func (m *SourceCodeInfo_Location) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *SourceCodeInfo_Location) GetSpan() []int32 { + if m != nil { + return m.Span + } + return nil +} + +func (m *SourceCodeInfo_Location) GetLeadingComments() string { + if m != nil && m.LeadingComments != nil { + return *m.LeadingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetTrailingComments() string { + if m != nil && m.TrailingComments != nil { + return *m.TrailingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string { + if m != nil { + return m.LeadingDetachedComments + } + return nil +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +type GeneratedCodeInfo struct { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GeneratedCodeInfo) Reset() { *m = GeneratedCodeInfo{} } +func (m *GeneratedCodeInfo) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo) ProtoMessage() {} +func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{20} +} +func (m *GeneratedCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GeneratedCodeInfo.Unmarshal(m, b) +} +func (m *GeneratedCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GeneratedCodeInfo.Marshal(b, m, deterministic) +} +func (m *GeneratedCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneratedCodeInfo.Merge(m, src) +} +func (m *GeneratedCodeInfo) XXX_Size() int { + return xxx_messageInfo_GeneratedCodeInfo.Size(m) +} +func (m *GeneratedCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_GeneratedCodeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_GeneratedCodeInfo proto.InternalMessageInfo + +func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { + if m != nil { + return m.Annotation + } + return nil +} + +type GeneratedCodeInfo_Annotation struct { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Identifies the filesystem path to the original source .proto. + SourceFile *string `protobuf:"bytes,2,opt,name=source_file,json=sourceFile" json:"source_file,omitempty"` + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"` + // Identifies the ending offset in bytes in the generated code that + // relates to the identified offset. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GeneratedCodeInfo_Annotation) Reset() { *m = GeneratedCodeInfo_Annotation{} } +func (m *GeneratedCodeInfo_Annotation) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} +func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) { + return fileDescriptor_308767df5ffe18af, []int{20, 0} +} +func (m *GeneratedCodeInfo_Annotation) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Unmarshal(m, b) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Marshal(b, m, deterministic) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneratedCodeInfo_Annotation.Merge(m, src) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Size() int { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Size(m) +} +func (m *GeneratedCodeInfo_Annotation) XXX_DiscardUnknown() { + xxx_messageInfo_GeneratedCodeInfo_Annotation.DiscardUnknown(m) +} + +var xxx_messageInfo_GeneratedCodeInfo_Annotation proto.InternalMessageInfo + +func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *GeneratedCodeInfo_Annotation) GetSourceFile() string { + if m != nil && m.SourceFile != nil { + return *m.SourceFile + } + return "" +} + +func (m *GeneratedCodeInfo_Annotation) GetBegin() int32 { + if m != nil && m.Begin != nil { + return *m.Begin + } + return 0 +} + +func (m *GeneratedCodeInfo_Annotation) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func init() { + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value) + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value) + proto.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value) + proto.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value) + proto.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value) + proto.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value) + proto.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet") + proto.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto") + proto.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto") + proto.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange") + proto.RegisterType((*DescriptorProto_ReservedRange)(nil), "google.protobuf.DescriptorProto.ReservedRange") + proto.RegisterType((*ExtensionRangeOptions)(nil), "google.protobuf.ExtensionRangeOptions") + proto.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto") + proto.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto") + proto.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto") + proto.RegisterType((*EnumDescriptorProto_EnumReservedRange)(nil), "google.protobuf.EnumDescriptorProto.EnumReservedRange") + proto.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto") + proto.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto") + proto.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto") + proto.RegisterType((*FileOptions)(nil), "google.protobuf.FileOptions") + proto.RegisterType((*MessageOptions)(nil), "google.protobuf.MessageOptions") + proto.RegisterType((*FieldOptions)(nil), "google.protobuf.FieldOptions") + proto.RegisterType((*OneofOptions)(nil), "google.protobuf.OneofOptions") + proto.RegisterType((*EnumOptions)(nil), "google.protobuf.EnumOptions") + proto.RegisterType((*EnumValueOptions)(nil), "google.protobuf.EnumValueOptions") + proto.RegisterType((*ServiceOptions)(nil), "google.protobuf.ServiceOptions") + proto.RegisterType((*MethodOptions)(nil), "google.protobuf.MethodOptions") + proto.RegisterType((*UninterpretedOption)(nil), "google.protobuf.UninterpretedOption") + proto.RegisterType((*UninterpretedOption_NamePart)(nil), "google.protobuf.UninterpretedOption.NamePart") + proto.RegisterType((*SourceCodeInfo)(nil), "google.protobuf.SourceCodeInfo") + proto.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location") + proto.RegisterType((*GeneratedCodeInfo)(nil), "google.protobuf.GeneratedCodeInfo") + proto.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation") +} + +func init() { proto.RegisterFile("descriptor.proto", fileDescriptor_308767df5ffe18af) } + +var fileDescriptor_308767df5ffe18af = []byte{ + // 2522 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xcd, 0x6f, 0xdb, 0xc8, + 0x15, 0x5f, 0x7d, 0x5a, 0x7a, 0x92, 0x65, 0x7a, 0xec, 0x75, 0x18, 0xef, 0x47, 0x1c, 0xed, 0x66, + 0xe3, 0x24, 0xbb, 0xca, 0xc2, 0x49, 0x9c, 0xac, 0x53, 0x6c, 0x2b, 0x4b, 0x8c, 0x57, 0xa9, 0xbe, + 0x4a, 0xc9, 0xdd, 0x64, 0x8b, 0x82, 0x18, 0x93, 0x23, 0x89, 0x09, 0x45, 0x72, 0x49, 0x2a, 0x89, + 0x83, 0x1e, 0x02, 0xf4, 0x54, 0xa0, 0x7f, 0x40, 0x51, 0x14, 0x3d, 0xf4, 0xb2, 0x40, 0xff, 0x80, + 0x02, 0xed, 0xbd, 0xd7, 0x02, 0xbd, 0xf7, 0x50, 0xa0, 0x05, 0xda, 0x3f, 0xa1, 0xc7, 0x62, 0x66, + 0x48, 0x8a, 0xd4, 0x47, 0xe2, 0x5d, 0x20, 0xd9, 0x93, 0x3d, 0xef, 0xfd, 0xde, 0x9b, 0x37, 0x8f, + 0xbf, 0x79, 0xf3, 0x66, 0x04, 0x82, 0x46, 0x5c, 0xd5, 0xd1, 0x6d, 0xcf, 0x72, 0x2a, 0xb6, 0x63, + 0x79, 0x16, 0x5a, 0x1b, 0x5a, 0xd6, 0xd0, 0x20, 0x7c, 0x74, 0x32, 0x19, 0x94, 0x5b, 0xb0, 0x7e, + 0x4f, 0x37, 0x48, 0x3d, 0x04, 0xf6, 0x88, 0x87, 0xee, 0x40, 0x7a, 0xa0, 0x1b, 0x44, 0x4c, 0xec, + 0xa4, 0x76, 0x0b, 0x7b, 0x1f, 0x56, 0x66, 0x8c, 0x2a, 0x71, 0x8b, 0x2e, 0x15, 0xcb, 0xcc, 0xa2, + 0xfc, 0xef, 0x34, 0x6c, 0x2c, 0xd0, 0x22, 0x04, 0x69, 0x13, 0x8f, 0xa9, 0xc7, 0xc4, 0x6e, 0x5e, + 0x66, 0xff, 0x23, 0x11, 0x56, 0x6c, 0xac, 0x3e, 0xc6, 0x43, 0x22, 0x26, 0x99, 0x38, 0x18, 0xa2, + 0xf7, 0x01, 0x34, 0x62, 0x13, 0x53, 0x23, 0xa6, 0x7a, 0x2a, 0xa6, 0x76, 0x52, 0xbb, 0x79, 0x39, + 0x22, 0x41, 0xd7, 0x60, 0xdd, 0x9e, 0x9c, 0x18, 0xba, 0xaa, 0x44, 0x60, 0xb0, 0x93, 0xda, 0xcd, + 0xc8, 0x02, 0x57, 0xd4, 0xa7, 0xe0, 0xcb, 0xb0, 0xf6, 0x94, 0xe0, 0xc7, 0x51, 0x68, 0x81, 0x41, + 0x4b, 0x54, 0x1c, 0x01, 0xd6, 0xa0, 0x38, 0x26, 0xae, 0x8b, 0x87, 0x44, 0xf1, 0x4e, 0x6d, 0x22, + 0xa6, 0xd9, 0xea, 0x77, 0xe6, 0x56, 0x3f, 0xbb, 0xf2, 0x82, 0x6f, 0xd5, 0x3f, 0xb5, 0x09, 0xaa, + 0x42, 0x9e, 0x98, 0x93, 0x31, 0xf7, 0x90, 0x59, 0x92, 0x3f, 0xc9, 0x9c, 0x8c, 0x67, 0xbd, 0xe4, + 0xa8, 0x99, 0xef, 0x62, 0xc5, 0x25, 0xce, 0x13, 0x5d, 0x25, 0x62, 0x96, 0x39, 0xb8, 0x3c, 0xe7, + 0xa0, 0xc7, 0xf5, 0xb3, 0x3e, 0x02, 0x3b, 0x54, 0x83, 0x3c, 0x79, 0xe6, 0x11, 0xd3, 0xd5, 0x2d, + 0x53, 0x5c, 0x61, 0x4e, 0x2e, 0x2d, 0xf8, 0x8a, 0xc4, 0xd0, 0x66, 0x5d, 0x4c, 0xed, 0xd0, 0x3e, + 0xac, 0x58, 0xb6, 0xa7, 0x5b, 0xa6, 0x2b, 0xe6, 0x76, 0x12, 0xbb, 0x85, 0xbd, 0x77, 0x17, 0x12, + 0xa1, 0xc3, 0x31, 0x72, 0x00, 0x46, 0x0d, 0x10, 0x5c, 0x6b, 0xe2, 0xa8, 0x44, 0x51, 0x2d, 0x8d, + 0x28, 0xba, 0x39, 0xb0, 0xc4, 0x3c, 0x73, 0x70, 0x61, 0x7e, 0x21, 0x0c, 0x58, 0xb3, 0x34, 0xd2, + 0x30, 0x07, 0x96, 0x5c, 0x72, 0x63, 0x63, 0xb4, 0x05, 0x59, 0xf7, 0xd4, 0xf4, 0xf0, 0x33, 0xb1, + 0xc8, 0x18, 0xe2, 0x8f, 0xca, 0x7f, 0xce, 0xc2, 0xda, 0x59, 0x28, 0x76, 0x17, 0x32, 0x03, 0xba, + 0x4a, 0x31, 0xf9, 0x6d, 0x72, 0xc0, 0x6d, 0xe2, 0x49, 0xcc, 0x7e, 0xc7, 0x24, 0x56, 0xa1, 0x60, + 0x12, 0xd7, 0x23, 0x1a, 0x67, 0x44, 0xea, 0x8c, 0x9c, 0x02, 0x6e, 0x34, 0x4f, 0xa9, 0xf4, 0x77, + 0xa2, 0xd4, 0x03, 0x58, 0x0b, 0x43, 0x52, 0x1c, 0x6c, 0x0e, 0x03, 0x6e, 0x5e, 0x7f, 0x55, 0x24, + 0x15, 0x29, 0xb0, 0x93, 0xa9, 0x99, 0x5c, 0x22, 0xb1, 0x31, 0xaa, 0x03, 0x58, 0x26, 0xb1, 0x06, + 0x8a, 0x46, 0x54, 0x43, 0xcc, 0x2d, 0xc9, 0x52, 0x87, 0x42, 0xe6, 0xb2, 0x64, 0x71, 0xa9, 0x6a, + 0xa0, 0xcf, 0xa6, 0x54, 0x5b, 0x59, 0xc2, 0x94, 0x16, 0xdf, 0x64, 0x73, 0x6c, 0x3b, 0x86, 0x92, + 0x43, 0x28, 0xef, 0x89, 0xe6, 0xaf, 0x2c, 0xcf, 0x82, 0xa8, 0xbc, 0x72, 0x65, 0xb2, 0x6f, 0xc6, + 0x17, 0xb6, 0xea, 0x44, 0x87, 0xe8, 0x03, 0x08, 0x05, 0x0a, 0xa3, 0x15, 0xb0, 0x2a, 0x54, 0x0c, + 0x84, 0x6d, 0x3c, 0x26, 0xdb, 0xcf, 0xa1, 0x14, 0x4f, 0x0f, 0xda, 0x84, 0x8c, 0xeb, 0x61, 0xc7, + 0x63, 0x2c, 0xcc, 0xc8, 0x7c, 0x80, 0x04, 0x48, 0x11, 0x53, 0x63, 0x55, 0x2e, 0x23, 0xd3, 0x7f, + 0xd1, 0x8f, 0xa6, 0x0b, 0x4e, 0xb1, 0x05, 0x7f, 0x34, 0xff, 0x45, 0x63, 0x9e, 0x67, 0xd7, 0xbd, + 0x7d, 0x1b, 0x56, 0x63, 0x0b, 0x38, 0xeb, 0xd4, 0xe5, 0x5f, 0xc0, 0xdb, 0x0b, 0x5d, 0xa3, 0x07, + 0xb0, 0x39, 0x31, 0x75, 0xd3, 0x23, 0x8e, 0xed, 0x10, 0xca, 0x58, 0x3e, 0x95, 0xf8, 0x9f, 0x95, + 0x25, 0x9c, 0x3b, 0x8e, 0xa2, 0xb9, 0x17, 0x79, 0x63, 0x32, 0x2f, 0xbc, 0x9a, 0xcf, 0xfd, 0x77, + 0x45, 0x78, 0xf1, 0xe2, 0xc5, 0x8b, 0x64, 0xf9, 0x37, 0x59, 0xd8, 0x5c, 0xb4, 0x67, 0x16, 0x6e, + 0xdf, 0x2d, 0xc8, 0x9a, 0x93, 0xf1, 0x09, 0x71, 0x58, 0x92, 0x32, 0xb2, 0x3f, 0x42, 0x55, 0xc8, + 0x18, 0xf8, 0x84, 0x18, 0x62, 0x7a, 0x27, 0xb1, 0x5b, 0xda, 0xbb, 0x76, 0xa6, 0x5d, 0x59, 0x69, + 0x52, 0x13, 0x99, 0x5b, 0xa2, 0xcf, 0x21, 0xed, 0x97, 0x68, 0xea, 0xe1, 0xea, 0xd9, 0x3c, 0xd0, + 0xbd, 0x24, 0x33, 0x3b, 0xf4, 0x0e, 0xe4, 0xe9, 0x5f, 0xce, 0x8d, 0x2c, 0x8b, 0x39, 0x47, 0x05, + 0x94, 0x17, 0x68, 0x1b, 0x72, 0x6c, 0x9b, 0x68, 0x24, 0x38, 0xda, 0xc2, 0x31, 0x25, 0x96, 0x46, + 0x06, 0x78, 0x62, 0x78, 0xca, 0x13, 0x6c, 0x4c, 0x08, 0x23, 0x7c, 0x5e, 0x2e, 0xfa, 0xc2, 0x9f, + 0x52, 0x19, 0xba, 0x00, 0x05, 0xbe, 0xab, 0x74, 0x53, 0x23, 0xcf, 0x58, 0xf5, 0xcc, 0xc8, 0x7c, + 0xa3, 0x35, 0xa8, 0x84, 0x4e, 0xff, 0xc8, 0xb5, 0xcc, 0x80, 0x9a, 0x6c, 0x0a, 0x2a, 0x60, 0xd3, + 0xdf, 0x9e, 0x2d, 0xdc, 0xef, 0x2d, 0x5e, 0xde, 0x2c, 0xa7, 0xca, 0x7f, 0x4a, 0x42, 0x9a, 0xd5, + 0x8b, 0x35, 0x28, 0xf4, 0x1f, 0x76, 0x25, 0xa5, 0xde, 0x39, 0x3e, 0x6c, 0x4a, 0x42, 0x02, 0x95, + 0x00, 0x98, 0xe0, 0x5e, 0xb3, 0x53, 0xed, 0x0b, 0xc9, 0x70, 0xdc, 0x68, 0xf7, 0xf7, 0x6f, 0x0a, + 0xa9, 0xd0, 0xe0, 0x98, 0x0b, 0xd2, 0x51, 0xc0, 0x8d, 0x3d, 0x21, 0x83, 0x04, 0x28, 0x72, 0x07, + 0x8d, 0x07, 0x52, 0x7d, 0xff, 0xa6, 0x90, 0x8d, 0x4b, 0x6e, 0xec, 0x09, 0x2b, 0x68, 0x15, 0xf2, + 0x4c, 0x72, 0xd8, 0xe9, 0x34, 0x85, 0x5c, 0xe8, 0xb3, 0xd7, 0x97, 0x1b, 0xed, 0x23, 0x21, 0x1f, + 0xfa, 0x3c, 0x92, 0x3b, 0xc7, 0x5d, 0x01, 0x42, 0x0f, 0x2d, 0xa9, 0xd7, 0xab, 0x1e, 0x49, 0x42, + 0x21, 0x44, 0x1c, 0x3e, 0xec, 0x4b, 0x3d, 0xa1, 0x18, 0x0b, 0xeb, 0xc6, 0x9e, 0xb0, 0x1a, 0x4e, + 0x21, 0xb5, 0x8f, 0x5b, 0x42, 0x09, 0xad, 0xc3, 0x2a, 0x9f, 0x22, 0x08, 0x62, 0x6d, 0x46, 0xb4, + 0x7f, 0x53, 0x10, 0xa6, 0x81, 0x70, 0x2f, 0xeb, 0x31, 0xc1, 0xfe, 0x4d, 0x01, 0x95, 0x6b, 0x90, + 0x61, 0xec, 0x42, 0x08, 0x4a, 0xcd, 0xea, 0xa1, 0xd4, 0x54, 0x3a, 0xdd, 0x7e, 0xa3, 0xd3, 0xae, + 0x36, 0x85, 0xc4, 0x54, 0x26, 0x4b, 0x3f, 0x39, 0x6e, 0xc8, 0x52, 0x5d, 0x48, 0x46, 0x65, 0x5d, + 0xa9, 0xda, 0x97, 0xea, 0x42, 0xaa, 0xac, 0xc2, 0xe6, 0xa2, 0x3a, 0xb9, 0x70, 0x67, 0x44, 0x3e, + 0x71, 0x72, 0xc9, 0x27, 0x66, 0xbe, 0xe6, 0x3e, 0xf1, 0xbf, 0x92, 0xb0, 0xb1, 0xe0, 0xac, 0x58, + 0x38, 0xc9, 0x0f, 0x21, 0xc3, 0x29, 0xca, 0x4f, 0xcf, 0x2b, 0x0b, 0x0f, 0x1d, 0x46, 0xd8, 0xb9, + 0x13, 0x94, 0xd9, 0x45, 0x3b, 0x88, 0xd4, 0x92, 0x0e, 0x82, 0xba, 0x98, 0xab, 0xe9, 0x3f, 0x9f, + 0xab, 0xe9, 0xfc, 0xd8, 0xdb, 0x3f, 0xcb, 0xb1, 0xc7, 0x64, 0xdf, 0xae, 0xb6, 0x67, 0x16, 0xd4, + 0xf6, 0xbb, 0xb0, 0x3e, 0xe7, 0xe8, 0xcc, 0x35, 0xf6, 0x97, 0x09, 0x10, 0x97, 0x25, 0xe7, 0x15, + 0x95, 0x2e, 0x19, 0xab, 0x74, 0x77, 0x67, 0x33, 0x78, 0x71, 0xf9, 0x47, 0x98, 0xfb, 0xd6, 0xdf, + 0x24, 0x60, 0x6b, 0x71, 0xa7, 0xb8, 0x30, 0x86, 0xcf, 0x21, 0x3b, 0x26, 0xde, 0xc8, 0x0a, 0xba, + 0xa5, 0x8f, 0x16, 0x9c, 0xc1, 0x54, 0x3d, 0xfb, 0xb1, 0x7d, 0xab, 0xe8, 0x21, 0x9e, 0x5a, 0xd6, + 0xee, 0xf1, 0x68, 0xe6, 0x22, 0xfd, 0x55, 0x12, 0xde, 0x5e, 0xe8, 0x7c, 0x61, 0xa0, 0xef, 0x01, + 0xe8, 0xa6, 0x3d, 0xf1, 0x78, 0x47, 0xc4, 0x0b, 0x6c, 0x9e, 0x49, 0x58, 0xf1, 0xa2, 0xc5, 0x73, + 0xe2, 0x85, 0xfa, 0x14, 0xd3, 0x03, 0x17, 0x31, 0xc0, 0x9d, 0x69, 0xa0, 0x69, 0x16, 0xe8, 0xfb, + 0x4b, 0x56, 0x3a, 0x47, 0xcc, 0x4f, 0x41, 0x50, 0x0d, 0x9d, 0x98, 0x9e, 0xe2, 0x7a, 0x0e, 0xc1, + 0x63, 0xdd, 0x1c, 0xb2, 0x13, 0x24, 0x77, 0x90, 0x19, 0x60, 0xc3, 0x25, 0xf2, 0x1a, 0x57, 0xf7, + 0x02, 0x2d, 0xb5, 0x60, 0x04, 0x72, 0x22, 0x16, 0xd9, 0x98, 0x05, 0x57, 0x87, 0x16, 0xe5, 0x5f, + 0xe7, 0xa1, 0x10, 0xe9, 0xab, 0xd1, 0x45, 0x28, 0x3e, 0xc2, 0x4f, 0xb0, 0x12, 0xdc, 0x95, 0x78, + 0x26, 0x0a, 0x54, 0xd6, 0xf5, 0xef, 0x4b, 0x9f, 0xc2, 0x26, 0x83, 0x58, 0x13, 0x8f, 0x38, 0x8a, + 0x6a, 0x60, 0xd7, 0x65, 0x49, 0xcb, 0x31, 0x28, 0xa2, 0xba, 0x0e, 0x55, 0xd5, 0x02, 0x0d, 0xba, + 0x05, 0x1b, 0xcc, 0x62, 0x3c, 0x31, 0x3c, 0xdd, 0x36, 0x88, 0x42, 0x6f, 0x6f, 0x2e, 0x3b, 0x49, + 0xc2, 0xc8, 0xd6, 0x29, 0xa2, 0xe5, 0x03, 0x68, 0x44, 0x2e, 0xaa, 0xc3, 0x7b, 0xcc, 0x6c, 0x48, + 0x4c, 0xe2, 0x60, 0x8f, 0x28, 0xe4, 0xeb, 0x09, 0x36, 0x5c, 0x05, 0x9b, 0x9a, 0x32, 0xc2, 0xee, + 0x48, 0xdc, 0xa4, 0x0e, 0x0e, 0x93, 0x62, 0x42, 0x3e, 0x4f, 0x81, 0x47, 0x3e, 0x4e, 0x62, 0xb0, + 0xaa, 0xa9, 0x7d, 0x81, 0xdd, 0x11, 0x3a, 0x80, 0x2d, 0xe6, 0xc5, 0xf5, 0x1c, 0xdd, 0x1c, 0x2a, + 0xea, 0x88, 0xa8, 0x8f, 0x95, 0x89, 0x37, 0xb8, 0x23, 0xbe, 0x13, 0x9d, 0x9f, 0x45, 0xd8, 0x63, + 0x98, 0x1a, 0x85, 0x1c, 0x7b, 0x83, 0x3b, 0xa8, 0x07, 0x45, 0xfa, 0x31, 0xc6, 0xfa, 0x73, 0xa2, + 0x0c, 0x2c, 0x87, 0x1d, 0x8d, 0xa5, 0x05, 0xa5, 0x29, 0x92, 0xc1, 0x4a, 0xc7, 0x37, 0x68, 0x59, + 0x1a, 0x39, 0xc8, 0xf4, 0xba, 0x92, 0x54, 0x97, 0x0b, 0x81, 0x97, 0x7b, 0x96, 0x43, 0x09, 0x35, + 0xb4, 0xc2, 0x04, 0x17, 0x38, 0xa1, 0x86, 0x56, 0x90, 0xde, 0x5b, 0xb0, 0xa1, 0xaa, 0x7c, 0xcd, + 0xba, 0xaa, 0xf8, 0x77, 0x2c, 0x57, 0x14, 0x62, 0xc9, 0x52, 0xd5, 0x23, 0x0e, 0xf0, 0x39, 0xee, + 0xa2, 0xcf, 0xe0, 0xed, 0x69, 0xb2, 0xa2, 0x86, 0xeb, 0x73, 0xab, 0x9c, 0x35, 0xbd, 0x05, 0x1b, + 0xf6, 0xe9, 0xbc, 0x21, 0x8a, 0xcd, 0x68, 0x9f, 0xce, 0x9a, 0xdd, 0x86, 0x4d, 0x7b, 0x64, 0xcf, + 0xdb, 0x5d, 0x8d, 0xda, 0x21, 0x7b, 0x64, 0xcf, 0x1a, 0x5e, 0x62, 0x17, 0x6e, 0x87, 0xa8, 0xd8, + 0x23, 0x9a, 0x78, 0x2e, 0x0a, 0x8f, 0x28, 0xd0, 0x75, 0x10, 0x54, 0x55, 0x21, 0x26, 0x3e, 0x31, + 0x88, 0x82, 0x1d, 0x62, 0x62, 0x57, 0xbc, 0x10, 0x05, 0x97, 0x54, 0x55, 0x62, 0xda, 0x2a, 0x53, + 0xa2, 0xab, 0xb0, 0x6e, 0x9d, 0x3c, 0x52, 0x39, 0x25, 0x15, 0xdb, 0x21, 0x03, 0xfd, 0x99, 0xf8, + 0x21, 0xcb, 0xef, 0x1a, 0x55, 0x30, 0x42, 0x76, 0x99, 0x18, 0x5d, 0x01, 0x41, 0x75, 0x47, 0xd8, + 0xb1, 0x59, 0x4d, 0x76, 0x6d, 0xac, 0x12, 0xf1, 0x12, 0x87, 0x72, 0x79, 0x3b, 0x10, 0xd3, 0x2d, + 0xe1, 0x3e, 0xd5, 0x07, 0x5e, 0xe0, 0xf1, 0x32, 0xdf, 0x12, 0x4c, 0xe6, 0x7b, 0xdb, 0x05, 0x81, + 0xa6, 0x22, 0x36, 0xf1, 0x2e, 0x83, 0x95, 0xec, 0x91, 0x1d, 0x9d, 0xf7, 0x03, 0x58, 0xa5, 0xc8, + 0xe9, 0xa4, 0x57, 0x78, 0x43, 0x66, 0x8f, 0x22, 0x33, 0xde, 0x84, 0x2d, 0x0a, 0x1a, 0x13, 0x0f, + 0x6b, 0xd8, 0xc3, 0x11, 0xf4, 0xc7, 0x0c, 0x4d, 0xf3, 0xde, 0xf2, 0x95, 0xb1, 0x38, 0x9d, 0xc9, + 0xc9, 0x69, 0xc8, 0xac, 0x4f, 0x78, 0x9c, 0x54, 0x16, 0x70, 0xeb, 0xb5, 0x35, 0xdd, 0xe5, 0x03, + 0x28, 0x46, 0x89, 0x8f, 0xf2, 0xc0, 0xa9, 0x2f, 0x24, 0x68, 0x17, 0x54, 0xeb, 0xd4, 0x69, 0xff, + 0xf2, 0x95, 0x24, 0x24, 0x69, 0x1f, 0xd5, 0x6c, 0xf4, 0x25, 0x45, 0x3e, 0x6e, 0xf7, 0x1b, 0x2d, + 0x49, 0x48, 0x45, 0x1b, 0xf6, 0xbf, 0x26, 0xa1, 0x14, 0xbf, 0x7b, 0xa1, 0x1f, 0xc0, 0xb9, 0xe0, + 0xa1, 0xc4, 0x25, 0x9e, 0xf2, 0x54, 0x77, 0xd8, 0x5e, 0x1c, 0x63, 0x7e, 0x2e, 0x86, 0x6c, 0xd8, + 0xf4, 0x51, 0x3d, 0xe2, 0x7d, 0xa9, 0x3b, 0x74, 0xa7, 0x8d, 0xb1, 0x87, 0x9a, 0x70, 0xc1, 0xb4, + 0x14, 0xd7, 0xc3, 0xa6, 0x86, 0x1d, 0x4d, 0x99, 0x3e, 0x51, 0x29, 0x58, 0x55, 0x89, 0xeb, 0x5a, + 0xfc, 0x0c, 0x0c, 0xbd, 0xbc, 0x6b, 0x5a, 0x3d, 0x1f, 0x3c, 0x3d, 0x1c, 0xaa, 0x3e, 0x74, 0x86, + 0xb9, 0xa9, 0x65, 0xcc, 0x7d, 0x07, 0xf2, 0x63, 0x6c, 0x2b, 0xc4, 0xf4, 0x9c, 0x53, 0xd6, 0x71, + 0xe7, 0xe4, 0xdc, 0x18, 0xdb, 0x12, 0x1d, 0xbf, 0x99, 0x8b, 0xcf, 0x3f, 0x52, 0x50, 0x8c, 0x76, + 0xdd, 0xf4, 0x12, 0xa3, 0xb2, 0x03, 0x2a, 0xc1, 0x4a, 0xd8, 0x07, 0x2f, 0xed, 0xd1, 0x2b, 0x35, + 0x7a, 0x72, 0x1d, 0x64, 0x79, 0x2f, 0x2c, 0x73, 0x4b, 0xda, 0x35, 0x50, 0x6a, 0x11, 0xde, 0x7b, + 0xe4, 0x64, 0x7f, 0x84, 0x8e, 0x20, 0xfb, 0xc8, 0x65, 0xbe, 0xb3, 0xcc, 0xf7, 0x87, 0x2f, 0xf7, + 0x7d, 0xbf, 0xc7, 0x9c, 0xe7, 0xef, 0xf7, 0x94, 0x76, 0x47, 0x6e, 0x55, 0x9b, 0xb2, 0x6f, 0x8e, + 0xce, 0x43, 0xda, 0xc0, 0xcf, 0x4f, 0xe3, 0x67, 0x1c, 0x13, 0x9d, 0x35, 0xf1, 0xe7, 0x21, 0xfd, + 0x94, 0xe0, 0xc7, 0xf1, 0x93, 0x85, 0x89, 0x5e, 0x23, 0xf5, 0xaf, 0x43, 0x86, 0xe5, 0x0b, 0x01, + 0xf8, 0x19, 0x13, 0xde, 0x42, 0x39, 0x48, 0xd7, 0x3a, 0x32, 0xa5, 0xbf, 0x00, 0x45, 0x2e, 0x55, + 0xba, 0x0d, 0xa9, 0x26, 0x09, 0xc9, 0xf2, 0x2d, 0xc8, 0xf2, 0x24, 0xd0, 0xad, 0x11, 0xa6, 0x41, + 0x78, 0xcb, 0x1f, 0xfa, 0x3e, 0x12, 0x81, 0xf6, 0xb8, 0x75, 0x28, 0xc9, 0x42, 0x32, 0xfa, 0x79, + 0x5d, 0x28, 0x46, 0x1b, 0xee, 0x37, 0xc3, 0xa9, 0xbf, 0x24, 0xa0, 0x10, 0x69, 0xa0, 0x69, 0xe7, + 0x83, 0x0d, 0xc3, 0x7a, 0xaa, 0x60, 0x43, 0xc7, 0xae, 0x4f, 0x0a, 0x60, 0xa2, 0x2a, 0x95, 0x9c, + 0xf5, 0xa3, 0xbd, 0x91, 0xe0, 0x7f, 0x9f, 0x00, 0x61, 0xb6, 0x77, 0x9d, 0x09, 0x30, 0xf1, 0xbd, + 0x06, 0xf8, 0xbb, 0x04, 0x94, 0xe2, 0x0d, 0xeb, 0x4c, 0x78, 0x17, 0xbf, 0xd7, 0xf0, 0xfe, 0x99, + 0x84, 0xd5, 0x58, 0x9b, 0x7a, 0xd6, 0xe8, 0xbe, 0x86, 0x75, 0x5d, 0x23, 0x63, 0xdb, 0xf2, 0x88, + 0xa9, 0x9e, 0x2a, 0x06, 0x79, 0x42, 0x0c, 0xb1, 0xcc, 0x0a, 0xc5, 0xf5, 0x97, 0x37, 0xc2, 0x95, + 0xc6, 0xd4, 0xae, 0x49, 0xcd, 0x0e, 0x36, 0x1a, 0x75, 0xa9, 0xd5, 0xed, 0xf4, 0xa5, 0x76, 0xed, + 0xa1, 0x72, 0xdc, 0xfe, 0x71, 0xbb, 0xf3, 0x65, 0x5b, 0x16, 0xf4, 0x19, 0xd8, 0x6b, 0xdc, 0xea, + 0x5d, 0x10, 0x66, 0x83, 0x42, 0xe7, 0x60, 0x51, 0x58, 0xc2, 0x5b, 0x68, 0x03, 0xd6, 0xda, 0x1d, + 0xa5, 0xd7, 0xa8, 0x4b, 0x8a, 0x74, 0xef, 0x9e, 0x54, 0xeb, 0xf7, 0xf8, 0xd3, 0x46, 0x88, 0xee, + 0xc7, 0x37, 0xf5, 0x6f, 0x53, 0xb0, 0xb1, 0x20, 0x12, 0x54, 0xf5, 0x2f, 0x25, 0xfc, 0x9e, 0xf4, + 0xc9, 0x59, 0xa2, 0xaf, 0xd0, 0xae, 0xa0, 0x8b, 0x1d, 0xcf, 0xbf, 0xc3, 0x5c, 0x01, 0x9a, 0x25, + 0xd3, 0xd3, 0x07, 0x3a, 0x71, 0xfc, 0x97, 0x20, 0x7e, 0x53, 0x59, 0x9b, 0xca, 0xf9, 0x63, 0xd0, + 0xc7, 0x80, 0x6c, 0xcb, 0xd5, 0x3d, 0xfd, 0x09, 0x51, 0x74, 0x33, 0x78, 0x36, 0xa2, 0x37, 0x97, + 0xb4, 0x2c, 0x04, 0x9a, 0x86, 0xe9, 0x85, 0x68, 0x93, 0x0c, 0xf1, 0x0c, 0x9a, 0x16, 0xf0, 0x94, + 0x2c, 0x04, 0x9a, 0x10, 0x7d, 0x11, 0x8a, 0x9a, 0x35, 0xa1, 0xed, 0x1c, 0xc7, 0xd1, 0xf3, 0x22, + 0x21, 0x17, 0xb8, 0x2c, 0x84, 0xf8, 0x8d, 0xfa, 0xf4, 0xbd, 0xaa, 0x28, 0x17, 0xb8, 0x8c, 0x43, + 0x2e, 0xc3, 0x1a, 0x1e, 0x0e, 0x1d, 0xea, 0x3c, 0x70, 0xc4, 0xaf, 0x1e, 0xa5, 0x50, 0xcc, 0x80, + 0xdb, 0xf7, 0x21, 0x17, 0xe4, 0x81, 0x1e, 0xc9, 0x34, 0x13, 0x8a, 0xcd, 0xef, 0xd3, 0xc9, 0xdd, + 0xbc, 0x9c, 0x33, 0x03, 0xe5, 0x45, 0x28, 0xea, 0xae, 0x32, 0x7d, 0x7e, 0x4f, 0xee, 0x24, 0x77, + 0x73, 0x72, 0x41, 0x77, 0xc3, 0xa7, 0xcb, 0xf2, 0x37, 0x49, 0x28, 0xc5, 0x7f, 0x3e, 0x40, 0x75, + 0xc8, 0x19, 0x96, 0x8a, 0x19, 0xb5, 0xf8, 0x6f, 0x57, 0xbb, 0xaf, 0xf8, 0xc5, 0xa1, 0xd2, 0xf4, + 0xf1, 0x72, 0x68, 0xb9, 0xfd, 0xb7, 0x04, 0xe4, 0x02, 0x31, 0xda, 0x82, 0xb4, 0x8d, 0xbd, 0x11, + 0x73, 0x97, 0x39, 0x4c, 0x0a, 0x09, 0x99, 0x8d, 0xa9, 0xdc, 0xb5, 0xb1, 0xc9, 0x28, 0xe0, 0xcb, + 0xe9, 0x98, 0x7e, 0x57, 0x83, 0x60, 0x8d, 0xdd, 0x6b, 0xac, 0xf1, 0x98, 0x98, 0x9e, 0x1b, 0x7c, + 0x57, 0x5f, 0x5e, 0xf3, 0xc5, 0xe8, 0x1a, 0xac, 0x7b, 0x0e, 0xd6, 0x8d, 0x18, 0x36, 0xcd, 0xb0, + 0x42, 0xa0, 0x08, 0xc1, 0x07, 0x70, 0x3e, 0xf0, 0xab, 0x11, 0x0f, 0xab, 0x23, 0xa2, 0x4d, 0x8d, + 0xb2, 0xec, 0xfd, 0xe2, 0x9c, 0x0f, 0xa8, 0xfb, 0xfa, 0xc0, 0xb6, 0xfc, 0xf7, 0x04, 0xac, 0x07, + 0x37, 0x31, 0x2d, 0x4c, 0x56, 0x0b, 0x00, 0x9b, 0xa6, 0xe5, 0x45, 0xd3, 0x35, 0x4f, 0xe5, 0x39, + 0xbb, 0x4a, 0x35, 0x34, 0x92, 0x23, 0x0e, 0xb6, 0xc7, 0x00, 0x53, 0xcd, 0xd2, 0xb4, 0x5d, 0x80, + 0x82, 0xff, 0xdb, 0x10, 0xfb, 0x81, 0x91, 0xdf, 0xdd, 0x81, 0x8b, 0xe8, 0x95, 0x0d, 0x6d, 0x42, + 0xe6, 0x84, 0x0c, 0x75, 0xd3, 0x7f, 0xf1, 0xe5, 0x83, 0xe0, 0x85, 0x25, 0x1d, 0xbe, 0xb0, 0x1c, + 0xfe, 0x0c, 0x36, 0x54, 0x6b, 0x3c, 0x1b, 0xee, 0xa1, 0x30, 0xf3, 0x7e, 0xe0, 0x7e, 0x91, 0xf8, + 0x0a, 0xa6, 0x2d, 0xe6, 0xff, 0x12, 0x89, 0x3f, 0x24, 0x53, 0x47, 0xdd, 0xc3, 0x3f, 0x26, 0xb7, + 0x8f, 0xb8, 0x69, 0x37, 0x58, 0xa9, 0x4c, 0x06, 0x06, 0x51, 0x69, 0xf4, 0xff, 0x0f, 0x00, 0x00, + 0xff, 0xff, 0x88, 0x17, 0xc1, 0xbe, 0x38, 0x1d, 0x00, 0x00, +} diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go new file mode 100644 index 00000000..165b2110 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go @@ -0,0 +1,752 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: descriptor.proto + +package descriptor + +import ( + fmt "fmt" + github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" + proto "github.com/gogo/protobuf/proto" + math "math" + reflect "reflect" + sort "sort" + strconv "strconv" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +func (this *FileDescriptorSet) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&descriptor.FileDescriptorSet{") + if this.File != nil { + s = append(s, "File: "+fmt.Sprintf("%#v", this.File)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *FileDescriptorProto) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 16) + s = append(s, "&descriptor.FileDescriptorProto{") + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") + } + if this.Package != nil { + s = append(s, "Package: "+valueToGoStringDescriptor(this.Package, "string")+",\n") + } + if this.Dependency != nil { + s = append(s, "Dependency: "+fmt.Sprintf("%#v", this.Dependency)+",\n") + } + if this.PublicDependency != nil { + s = append(s, "PublicDependency: "+fmt.Sprintf("%#v", this.PublicDependency)+",\n") + } + if this.WeakDependency != nil { + s = append(s, "WeakDependency: "+fmt.Sprintf("%#v", this.WeakDependency)+",\n") + } + if this.MessageType != nil { + s = append(s, "MessageType: "+fmt.Sprintf("%#v", this.MessageType)+",\n") + } + if this.EnumType != nil { + s = append(s, "EnumType: "+fmt.Sprintf("%#v", this.EnumType)+",\n") + } + if this.Service != nil { + s = append(s, "Service: "+fmt.Sprintf("%#v", this.Service)+",\n") + } + if this.Extension != nil { + s = append(s, "Extension: "+fmt.Sprintf("%#v", this.Extension)+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.SourceCodeInfo != nil { + s = append(s, "SourceCodeInfo: "+fmt.Sprintf("%#v", this.SourceCodeInfo)+",\n") + } + if this.Syntax != nil { + s = append(s, "Syntax: "+valueToGoStringDescriptor(this.Syntax, "string")+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DescriptorProto) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 14) + s = append(s, "&descriptor.DescriptorProto{") + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") + } + if this.Field != nil { + s = append(s, "Field: "+fmt.Sprintf("%#v", this.Field)+",\n") + } + if this.Extension != nil { + s = append(s, "Extension: "+fmt.Sprintf("%#v", this.Extension)+",\n") + } + if this.NestedType != nil { + s = append(s, "NestedType: "+fmt.Sprintf("%#v", this.NestedType)+",\n") + } + if this.EnumType != nil { + s = append(s, "EnumType: "+fmt.Sprintf("%#v", this.EnumType)+",\n") + } + if this.ExtensionRange != nil { + s = append(s, "ExtensionRange: "+fmt.Sprintf("%#v", this.ExtensionRange)+",\n") + } + if this.OneofDecl != nil { + s = append(s, "OneofDecl: "+fmt.Sprintf("%#v", this.OneofDecl)+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.ReservedRange != nil { + s = append(s, "ReservedRange: "+fmt.Sprintf("%#v", this.ReservedRange)+",\n") + } + if this.ReservedName != nil { + s = append(s, "ReservedName: "+fmt.Sprintf("%#v", this.ReservedName)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DescriptorProto_ExtensionRange) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&descriptor.DescriptorProto_ExtensionRange{") + if this.Start != nil { + s = append(s, "Start: "+valueToGoStringDescriptor(this.Start, "int32")+",\n") + } + if this.End != nil { + s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DescriptorProto_ReservedRange) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&descriptor.DescriptorProto_ReservedRange{") + if this.Start != nil { + s = append(s, "Start: "+valueToGoStringDescriptor(this.Start, "int32")+",\n") + } + if this.End != nil { + s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ExtensionRangeOptions) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&descriptor.ExtensionRangeOptions{") + if this.UninterpretedOption != nil { + s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") + } + s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *FieldDescriptorProto) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 14) + s = append(s, "&descriptor.FieldDescriptorProto{") + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") + } + if this.Number != nil { + s = append(s, "Number: "+valueToGoStringDescriptor(this.Number, "int32")+",\n") + } + if this.Label != nil { + s = append(s, "Label: "+valueToGoStringDescriptor(this.Label, "FieldDescriptorProto_Label")+",\n") + } + if this.Type != nil { + s = append(s, "Type: "+valueToGoStringDescriptor(this.Type, "FieldDescriptorProto_Type")+",\n") + } + if this.TypeName != nil { + s = append(s, "TypeName: "+valueToGoStringDescriptor(this.TypeName, "string")+",\n") + } + if this.Extendee != nil { + s = append(s, "Extendee: "+valueToGoStringDescriptor(this.Extendee, "string")+",\n") + } + if this.DefaultValue != nil { + s = append(s, "DefaultValue: "+valueToGoStringDescriptor(this.DefaultValue, "string")+",\n") + } + if this.OneofIndex != nil { + s = append(s, "OneofIndex: "+valueToGoStringDescriptor(this.OneofIndex, "int32")+",\n") + } + if this.JsonName != nil { + s = append(s, "JsonName: "+valueToGoStringDescriptor(this.JsonName, "string")+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *OneofDescriptorProto) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&descriptor.OneofDescriptorProto{") + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *EnumDescriptorProto) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&descriptor.EnumDescriptorProto{") + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") + } + if this.Value != nil { + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.ReservedRange != nil { + s = append(s, "ReservedRange: "+fmt.Sprintf("%#v", this.ReservedRange)+",\n") + } + if this.ReservedName != nil { + s = append(s, "ReservedName: "+fmt.Sprintf("%#v", this.ReservedName)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *EnumDescriptorProto_EnumReservedRange) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&descriptor.EnumDescriptorProto_EnumReservedRange{") + if this.Start != nil { + s = append(s, "Start: "+valueToGoStringDescriptor(this.Start, "int32")+",\n") + } + if this.End != nil { + s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *EnumValueDescriptorProto) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&descriptor.EnumValueDescriptorProto{") + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") + } + if this.Number != nil { + s = append(s, "Number: "+valueToGoStringDescriptor(this.Number, "int32")+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ServiceDescriptorProto) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&descriptor.ServiceDescriptorProto{") + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") + } + if this.Method != nil { + s = append(s, "Method: "+fmt.Sprintf("%#v", this.Method)+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *MethodDescriptorProto) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&descriptor.MethodDescriptorProto{") + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n") + } + if this.InputType != nil { + s = append(s, "InputType: "+valueToGoStringDescriptor(this.InputType, "string")+",\n") + } + if this.OutputType != nil { + s = append(s, "OutputType: "+valueToGoStringDescriptor(this.OutputType, "string")+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.ClientStreaming != nil { + s = append(s, "ClientStreaming: "+valueToGoStringDescriptor(this.ClientStreaming, "bool")+",\n") + } + if this.ServerStreaming != nil { + s = append(s, "ServerStreaming: "+valueToGoStringDescriptor(this.ServerStreaming, "bool")+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *FileOptions) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 25) + s = append(s, "&descriptor.FileOptions{") + if this.JavaPackage != nil { + s = append(s, "JavaPackage: "+valueToGoStringDescriptor(this.JavaPackage, "string")+",\n") + } + if this.JavaOuterClassname != nil { + s = append(s, "JavaOuterClassname: "+valueToGoStringDescriptor(this.JavaOuterClassname, "string")+",\n") + } + if this.JavaMultipleFiles != nil { + s = append(s, "JavaMultipleFiles: "+valueToGoStringDescriptor(this.JavaMultipleFiles, "bool")+",\n") + } + if this.JavaGenerateEqualsAndHash != nil { + s = append(s, "JavaGenerateEqualsAndHash: "+valueToGoStringDescriptor(this.JavaGenerateEqualsAndHash, "bool")+",\n") + } + if this.JavaStringCheckUtf8 != nil { + s = append(s, "JavaStringCheckUtf8: "+valueToGoStringDescriptor(this.JavaStringCheckUtf8, "bool")+",\n") + } + if this.OptimizeFor != nil { + s = append(s, "OptimizeFor: "+valueToGoStringDescriptor(this.OptimizeFor, "FileOptions_OptimizeMode")+",\n") + } + if this.GoPackage != nil { + s = append(s, "GoPackage: "+valueToGoStringDescriptor(this.GoPackage, "string")+",\n") + } + if this.CcGenericServices != nil { + s = append(s, "CcGenericServices: "+valueToGoStringDescriptor(this.CcGenericServices, "bool")+",\n") + } + if this.JavaGenericServices != nil { + s = append(s, "JavaGenericServices: "+valueToGoStringDescriptor(this.JavaGenericServices, "bool")+",\n") + } + if this.PyGenericServices != nil { + s = append(s, "PyGenericServices: "+valueToGoStringDescriptor(this.PyGenericServices, "bool")+",\n") + } + if this.PhpGenericServices != nil { + s = append(s, "PhpGenericServices: "+valueToGoStringDescriptor(this.PhpGenericServices, "bool")+",\n") + } + if this.Deprecated != nil { + s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") + } + if this.CcEnableArenas != nil { + s = append(s, "CcEnableArenas: "+valueToGoStringDescriptor(this.CcEnableArenas, "bool")+",\n") + } + if this.ObjcClassPrefix != nil { + s = append(s, "ObjcClassPrefix: "+valueToGoStringDescriptor(this.ObjcClassPrefix, "string")+",\n") + } + if this.CsharpNamespace != nil { + s = append(s, "CsharpNamespace: "+valueToGoStringDescriptor(this.CsharpNamespace, "string")+",\n") + } + if this.SwiftPrefix != nil { + s = append(s, "SwiftPrefix: "+valueToGoStringDescriptor(this.SwiftPrefix, "string")+",\n") + } + if this.PhpClassPrefix != nil { + s = append(s, "PhpClassPrefix: "+valueToGoStringDescriptor(this.PhpClassPrefix, "string")+",\n") + } + if this.PhpNamespace != nil { + s = append(s, "PhpNamespace: "+valueToGoStringDescriptor(this.PhpNamespace, "string")+",\n") + } + if this.PhpMetadataNamespace != nil { + s = append(s, "PhpMetadataNamespace: "+valueToGoStringDescriptor(this.PhpMetadataNamespace, "string")+",\n") + } + if this.RubyPackage != nil { + s = append(s, "RubyPackage: "+valueToGoStringDescriptor(this.RubyPackage, "string")+",\n") + } + if this.UninterpretedOption != nil { + s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") + } + s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *MessageOptions) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&descriptor.MessageOptions{") + if this.MessageSetWireFormat != nil { + s = append(s, "MessageSetWireFormat: "+valueToGoStringDescriptor(this.MessageSetWireFormat, "bool")+",\n") + } + if this.NoStandardDescriptorAccessor != nil { + s = append(s, "NoStandardDescriptorAccessor: "+valueToGoStringDescriptor(this.NoStandardDescriptorAccessor, "bool")+",\n") + } + if this.Deprecated != nil { + s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") + } + if this.MapEntry != nil { + s = append(s, "MapEntry: "+valueToGoStringDescriptor(this.MapEntry, "bool")+",\n") + } + if this.UninterpretedOption != nil { + s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") + } + s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *FieldOptions) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 11) + s = append(s, "&descriptor.FieldOptions{") + if this.Ctype != nil { + s = append(s, "Ctype: "+valueToGoStringDescriptor(this.Ctype, "FieldOptions_CType")+",\n") + } + if this.Packed != nil { + s = append(s, "Packed: "+valueToGoStringDescriptor(this.Packed, "bool")+",\n") + } + if this.Jstype != nil { + s = append(s, "Jstype: "+valueToGoStringDescriptor(this.Jstype, "FieldOptions_JSType")+",\n") + } + if this.Lazy != nil { + s = append(s, "Lazy: "+valueToGoStringDescriptor(this.Lazy, "bool")+",\n") + } + if this.Deprecated != nil { + s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") + } + if this.Weak != nil { + s = append(s, "Weak: "+valueToGoStringDescriptor(this.Weak, "bool")+",\n") + } + if this.UninterpretedOption != nil { + s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") + } + s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *OneofOptions) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&descriptor.OneofOptions{") + if this.UninterpretedOption != nil { + s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") + } + s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *EnumOptions) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&descriptor.EnumOptions{") + if this.AllowAlias != nil { + s = append(s, "AllowAlias: "+valueToGoStringDescriptor(this.AllowAlias, "bool")+",\n") + } + if this.Deprecated != nil { + s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") + } + if this.UninterpretedOption != nil { + s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") + } + s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *EnumValueOptions) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&descriptor.EnumValueOptions{") + if this.Deprecated != nil { + s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") + } + if this.UninterpretedOption != nil { + s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") + } + s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ServiceOptions) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&descriptor.ServiceOptions{") + if this.Deprecated != nil { + s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") + } + if this.UninterpretedOption != nil { + s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") + } + s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *MethodOptions) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&descriptor.MethodOptions{") + if this.Deprecated != nil { + s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n") + } + if this.IdempotencyLevel != nil { + s = append(s, "IdempotencyLevel: "+valueToGoStringDescriptor(this.IdempotencyLevel, "MethodOptions_IdempotencyLevel")+",\n") + } + if this.UninterpretedOption != nil { + s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n") + } + s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *UninterpretedOption) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 11) + s = append(s, "&descriptor.UninterpretedOption{") + if this.Name != nil { + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + } + if this.IdentifierValue != nil { + s = append(s, "IdentifierValue: "+valueToGoStringDescriptor(this.IdentifierValue, "string")+",\n") + } + if this.PositiveIntValue != nil { + s = append(s, "PositiveIntValue: "+valueToGoStringDescriptor(this.PositiveIntValue, "uint64")+",\n") + } + if this.NegativeIntValue != nil { + s = append(s, "NegativeIntValue: "+valueToGoStringDescriptor(this.NegativeIntValue, "int64")+",\n") + } + if this.DoubleValue != nil { + s = append(s, "DoubleValue: "+valueToGoStringDescriptor(this.DoubleValue, "float64")+",\n") + } + if this.StringValue != nil { + s = append(s, "StringValue: "+valueToGoStringDescriptor(this.StringValue, "byte")+",\n") + } + if this.AggregateValue != nil { + s = append(s, "AggregateValue: "+valueToGoStringDescriptor(this.AggregateValue, "string")+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *UninterpretedOption_NamePart) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&descriptor.UninterpretedOption_NamePart{") + if this.NamePart != nil { + s = append(s, "NamePart: "+valueToGoStringDescriptor(this.NamePart, "string")+",\n") + } + if this.IsExtension != nil { + s = append(s, "IsExtension: "+valueToGoStringDescriptor(this.IsExtension, "bool")+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *SourceCodeInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&descriptor.SourceCodeInfo{") + if this.Location != nil { + s = append(s, "Location: "+fmt.Sprintf("%#v", this.Location)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *SourceCodeInfo_Location) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&descriptor.SourceCodeInfo_Location{") + if this.Path != nil { + s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") + } + if this.Span != nil { + s = append(s, "Span: "+fmt.Sprintf("%#v", this.Span)+",\n") + } + if this.LeadingComments != nil { + s = append(s, "LeadingComments: "+valueToGoStringDescriptor(this.LeadingComments, "string")+",\n") + } + if this.TrailingComments != nil { + s = append(s, "TrailingComments: "+valueToGoStringDescriptor(this.TrailingComments, "string")+",\n") + } + if this.LeadingDetachedComments != nil { + s = append(s, "LeadingDetachedComments: "+fmt.Sprintf("%#v", this.LeadingDetachedComments)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *GeneratedCodeInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&descriptor.GeneratedCodeInfo{") + if this.Annotation != nil { + s = append(s, "Annotation: "+fmt.Sprintf("%#v", this.Annotation)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *GeneratedCodeInfo_Annotation) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&descriptor.GeneratedCodeInfo_Annotation{") + if this.Path != nil { + s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") + } + if this.SourceFile != nil { + s = append(s, "SourceFile: "+valueToGoStringDescriptor(this.SourceFile, "string")+",\n") + } + if this.Begin != nil { + s = append(s, "Begin: "+valueToGoStringDescriptor(this.Begin, "int32")+",\n") + } + if this.End != nil { + s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringDescriptor(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func extensionToGoStringDescriptor(m github_com_gogo_protobuf_proto.Message) string { + e := github_com_gogo_protobuf_proto.GetUnsafeExtensionsMap(m) + if e == nil { + return "nil" + } + s := "proto.NewUnsafeXXX_InternalExtensions(map[int32]proto.Extension{" + keys := make([]int, 0, len(e)) + for k := range e { + keys = append(keys, int(k)) + } + sort.Ints(keys) + ss := []string{} + for _, k := range keys { + ss = append(ss, strconv.Itoa(k)+": "+e[int32(k)].GoString()) + } + s += strings.Join(ss, ",") + "})" + return s +} diff --git a/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go new file mode 100644 index 00000000..e0846a35 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go @@ -0,0 +1,390 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package descriptor + +import ( + "strings" +) + +func (msg *DescriptorProto) GetMapFields() (*FieldDescriptorProto, *FieldDescriptorProto) { + if !msg.GetOptions().GetMapEntry() { + return nil, nil + } + return msg.GetField()[0], msg.GetField()[1] +} + +func dotToUnderscore(r rune) rune { + if r == '.' { + return '_' + } + return r +} + +func (field *FieldDescriptorProto) WireType() (wire int) { + switch *field.Type { + case FieldDescriptorProto_TYPE_DOUBLE: + return 1 + case FieldDescriptorProto_TYPE_FLOAT: + return 5 + case FieldDescriptorProto_TYPE_INT64: + return 0 + case FieldDescriptorProto_TYPE_UINT64: + return 0 + case FieldDescriptorProto_TYPE_INT32: + return 0 + case FieldDescriptorProto_TYPE_UINT32: + return 0 + case FieldDescriptorProto_TYPE_FIXED64: + return 1 + case FieldDescriptorProto_TYPE_FIXED32: + return 5 + case FieldDescriptorProto_TYPE_BOOL: + return 0 + case FieldDescriptorProto_TYPE_STRING: + return 2 + case FieldDescriptorProto_TYPE_GROUP: + return 2 + case FieldDescriptorProto_TYPE_MESSAGE: + return 2 + case FieldDescriptorProto_TYPE_BYTES: + return 2 + case FieldDescriptorProto_TYPE_ENUM: + return 0 + case FieldDescriptorProto_TYPE_SFIXED32: + return 5 + case FieldDescriptorProto_TYPE_SFIXED64: + return 1 + case FieldDescriptorProto_TYPE_SINT32: + return 0 + case FieldDescriptorProto_TYPE_SINT64: + return 0 + } + panic("unreachable") +} + +func (field *FieldDescriptorProto) GetKeyUint64() (x uint64) { + packed := field.IsPacked() + wireType := field.WireType() + fieldNumber := field.GetNumber() + if packed { + wireType = 2 + } + x = uint64(uint32(fieldNumber)<<3 | uint32(wireType)) + return x +} + +func (field *FieldDescriptorProto) GetKey3Uint64() (x uint64) { + packed := field.IsPacked3() + wireType := field.WireType() + fieldNumber := field.GetNumber() + if packed { + wireType = 2 + } + x = uint64(uint32(fieldNumber)<<3 | uint32(wireType)) + return x +} + +func (field *FieldDescriptorProto) GetKey() []byte { + x := field.GetKeyUint64() + i := 0 + keybuf := make([]byte, 0) + for i = 0; x > 127; i++ { + keybuf = append(keybuf, 0x80|uint8(x&0x7F)) + x >>= 7 + } + keybuf = append(keybuf, uint8(x)) + return keybuf +} + +func (field *FieldDescriptorProto) GetKey3() []byte { + x := field.GetKey3Uint64() + i := 0 + keybuf := make([]byte, 0) + for i = 0; x > 127; i++ { + keybuf = append(keybuf, 0x80|uint8(x&0x7F)) + x >>= 7 + } + keybuf = append(keybuf, uint8(x)) + return keybuf +} + +func (desc *FileDescriptorSet) GetField(packageName, messageName, fieldName string) *FieldDescriptorProto { + msg := desc.GetMessage(packageName, messageName) + if msg == nil { + return nil + } + for _, field := range msg.GetField() { + if field.GetName() == fieldName { + return field + } + } + return nil +} + +func (file *FileDescriptorProto) GetMessage(typeName string) *DescriptorProto { + for _, msg := range file.GetMessageType() { + if msg.GetName() == typeName { + return msg + } + nes := file.GetNestedMessage(msg, strings.TrimPrefix(typeName, msg.GetName()+".")) + if nes != nil { + return nes + } + } + return nil +} + +func (file *FileDescriptorProto) GetNestedMessage(msg *DescriptorProto, typeName string) *DescriptorProto { + for _, nes := range msg.GetNestedType() { + if nes.GetName() == typeName { + return nes + } + res := file.GetNestedMessage(nes, strings.TrimPrefix(typeName, nes.GetName()+".")) + if res != nil { + return res + } + } + return nil +} + +func (desc *FileDescriptorSet) GetMessage(packageName string, typeName string) *DescriptorProto { + for _, file := range desc.GetFile() { + if strings.Map(dotToUnderscore, file.GetPackage()) != strings.Map(dotToUnderscore, packageName) { + continue + } + for _, msg := range file.GetMessageType() { + if msg.GetName() == typeName { + return msg + } + } + for _, msg := range file.GetMessageType() { + for _, nes := range msg.GetNestedType() { + if nes.GetName() == typeName { + return nes + } + if msg.GetName()+"."+nes.GetName() == typeName { + return nes + } + } + } + } + return nil +} + +func (desc *FileDescriptorSet) IsProto3(packageName string, typeName string) bool { + for _, file := range desc.GetFile() { + if strings.Map(dotToUnderscore, file.GetPackage()) != strings.Map(dotToUnderscore, packageName) { + continue + } + for _, msg := range file.GetMessageType() { + if msg.GetName() == typeName { + return file.GetSyntax() == "proto3" + } + } + for _, msg := range file.GetMessageType() { + for _, nes := range msg.GetNestedType() { + if nes.GetName() == typeName { + return file.GetSyntax() == "proto3" + } + if msg.GetName()+"."+nes.GetName() == typeName { + return file.GetSyntax() == "proto3" + } + } + } + } + return false +} + +func (msg *DescriptorProto) IsExtendable() bool { + return len(msg.GetExtensionRange()) > 0 +} + +func (desc *FileDescriptorSet) FindExtension(packageName string, typeName string, fieldName string) (extPackageName string, field *FieldDescriptorProto) { + parent := desc.GetMessage(packageName, typeName) + if parent == nil { + return "", nil + } + if !parent.IsExtendable() { + return "", nil + } + extendee := "." + packageName + "." + typeName + for _, file := range desc.GetFile() { + for _, ext := range file.GetExtension() { + if strings.Map(dotToUnderscore, file.GetPackage()) == strings.Map(dotToUnderscore, packageName) { + if !(ext.GetExtendee() == typeName || ext.GetExtendee() == extendee) { + continue + } + } else { + if ext.GetExtendee() != extendee { + continue + } + } + if ext.GetName() == fieldName { + return file.GetPackage(), ext + } + } + } + return "", nil +} + +func (desc *FileDescriptorSet) FindExtensionByFieldNumber(packageName string, typeName string, fieldNum int32) (extPackageName string, field *FieldDescriptorProto) { + parent := desc.GetMessage(packageName, typeName) + if parent == nil { + return "", nil + } + if !parent.IsExtendable() { + return "", nil + } + extendee := "." + packageName + "." + typeName + for _, file := range desc.GetFile() { + for _, ext := range file.GetExtension() { + if strings.Map(dotToUnderscore, file.GetPackage()) == strings.Map(dotToUnderscore, packageName) { + if !(ext.GetExtendee() == typeName || ext.GetExtendee() == extendee) { + continue + } + } else { + if ext.GetExtendee() != extendee { + continue + } + } + if ext.GetNumber() == fieldNum { + return file.GetPackage(), ext + } + } + } + return "", nil +} + +func (desc *FileDescriptorSet) FindMessage(packageName string, typeName string, fieldName string) (msgPackageName string, msgName string) { + parent := desc.GetMessage(packageName, typeName) + if parent == nil { + return "", "" + } + field := parent.GetFieldDescriptor(fieldName) + if field == nil { + var extPackageName string + extPackageName, field = desc.FindExtension(packageName, typeName, fieldName) + if field == nil { + return "", "" + } + packageName = extPackageName + } + typeNames := strings.Split(field.GetTypeName(), ".") + if len(typeNames) == 1 { + msg := desc.GetMessage(packageName, typeName) + if msg == nil { + return "", "" + } + return packageName, msg.GetName() + } + if len(typeNames) > 2 { + for i := 1; i < len(typeNames)-1; i++ { + packageName = strings.Join(typeNames[1:len(typeNames)-i], ".") + typeName = strings.Join(typeNames[len(typeNames)-i:], ".") + msg := desc.GetMessage(packageName, typeName) + if msg != nil { + typeNames := strings.Split(msg.GetName(), ".") + if len(typeNames) == 1 { + return packageName, msg.GetName() + } + return strings.Join(typeNames[1:len(typeNames)-1], "."), typeNames[len(typeNames)-1] + } + } + } + return "", "" +} + +func (msg *DescriptorProto) GetFieldDescriptor(fieldName string) *FieldDescriptorProto { + for _, field := range msg.GetField() { + if field.GetName() == fieldName { + return field + } + } + return nil +} + +func (desc *FileDescriptorSet) GetEnum(packageName string, typeName string) *EnumDescriptorProto { + for _, file := range desc.GetFile() { + if strings.Map(dotToUnderscore, file.GetPackage()) != strings.Map(dotToUnderscore, packageName) { + continue + } + for _, enum := range file.GetEnumType() { + if enum.GetName() == typeName { + return enum + } + } + } + return nil +} + +func (f *FieldDescriptorProto) IsEnum() bool { + return *f.Type == FieldDescriptorProto_TYPE_ENUM +} + +func (f *FieldDescriptorProto) IsMessage() bool { + return *f.Type == FieldDescriptorProto_TYPE_MESSAGE +} + +func (f *FieldDescriptorProto) IsBytes() bool { + return *f.Type == FieldDescriptorProto_TYPE_BYTES +} + +func (f *FieldDescriptorProto) IsRepeated() bool { + return f.Label != nil && *f.Label == FieldDescriptorProto_LABEL_REPEATED +} + +func (f *FieldDescriptorProto) IsString() bool { + return *f.Type == FieldDescriptorProto_TYPE_STRING +} + +func (f *FieldDescriptorProto) IsBool() bool { + return *f.Type == FieldDescriptorProto_TYPE_BOOL +} + +func (f *FieldDescriptorProto) IsRequired() bool { + return f.Label != nil && *f.Label == FieldDescriptorProto_LABEL_REQUIRED +} + +func (f *FieldDescriptorProto) IsPacked() bool { + return f.Options != nil && f.GetOptions().GetPacked() +} + +func (f *FieldDescriptorProto) IsPacked3() bool { + if f.IsRepeated() && f.IsScalar() { + if f.Options == nil || f.GetOptions().Packed == nil { + return true + } + return f.Options != nil && f.GetOptions().GetPacked() + } + return false +} + +func (m *DescriptorProto) HasExtension() bool { + return len(m.ExtensionRange) > 0 +} diff --git a/vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go b/vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go new file mode 100644 index 00000000..ceadde6a --- /dev/null +++ b/vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go @@ -0,0 +1,101 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package sortkeys + +import ( + "sort" +) + +func Strings(l []string) { + sort.Strings(l) +} + +func Float64s(l []float64) { + sort.Float64s(l) +} + +func Float32s(l []float32) { + sort.Sort(Float32Slice(l)) +} + +func Int64s(l []int64) { + sort.Sort(Int64Slice(l)) +} + +func Int32s(l []int32) { + sort.Sort(Int32Slice(l)) +} + +func Uint64s(l []uint64) { + sort.Sort(Uint64Slice(l)) +} + +func Uint32s(l []uint32) { + sort.Sort(Uint32Slice(l)) +} + +func Bools(l []bool) { + sort.Sort(BoolSlice(l)) +} + +type BoolSlice []bool + +func (p BoolSlice) Len() int { return len(p) } +func (p BoolSlice) Less(i, j int) bool { return p[j] } +func (p BoolSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Int64Slice []int64 + +func (p Int64Slice) Len() int { return len(p) } +func (p Int64Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Int64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Int32Slice []int32 + +func (p Int32Slice) Len() int { return len(p) } +func (p Int32Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Int32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Uint64Slice []uint64 + +func (p Uint64Slice) Len() int { return len(p) } +func (p Uint64Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Uint64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Uint32Slice []uint32 + +func (p Uint32Slice) Len() int { return len(p) } +func (p Uint32Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Uint32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +type Float32Slice []float32 + +func (p Float32Slice) Len() int { return len(p) } +func (p Float32Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Float32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/github.com/gogo/protobuf/types/any.go b/vendor/github.com/gogo/protobuf/types/any.go new file mode 100644 index 00000000..df4787de --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/any.go @@ -0,0 +1,140 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package types + +// This file implements functions to marshal proto.Message to/from +// google.protobuf.Any message. + +import ( + "fmt" + "reflect" + "strings" + + "github.com/gogo/protobuf/proto" +) + +const googleApis = "type.googleapis.com/" + +// AnyMessageName returns the name of the message contained in a google.protobuf.Any message. +// +// Note that regular type assertions should be done using the Is +// function. AnyMessageName is provided for less common use cases like filtering a +// sequence of Any messages based on a set of allowed message type names. +func AnyMessageName(any *Any) (string, error) { + if any == nil { + return "", fmt.Errorf("message is nil") + } + slash := strings.LastIndex(any.TypeUrl, "/") + if slash < 0 { + return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) + } + return any.TypeUrl[slash+1:], nil +} + +// MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any. +func MarshalAny(pb proto.Message) (*Any, error) { + value, err := proto.Marshal(pb) + if err != nil { + return nil, err + } + return &Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil +} + +// DynamicAny is a value that can be passed to UnmarshalAny to automatically +// allocate a proto.Message for the type specified in a google.protobuf.Any +// message. The allocated message is stored in the embedded proto.Message. +// +// Example: +// +// var x ptypes.DynamicAny +// if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } +// fmt.Printf("unmarshaled message: %v", x.Message) +type DynamicAny struct { + proto.Message +} + +// Empty returns a new proto.Message of the type specified in a +// google.protobuf.Any message. It returns an error if corresponding message +// type isn't linked in. +func EmptyAny(any *Any) (proto.Message, error) { + aname, err := AnyMessageName(any) + if err != nil { + return nil, err + } + + t := proto.MessageType(aname) + if t == nil { + return nil, fmt.Errorf("any: message type %q isn't linked in", aname) + } + return reflect.New(t.Elem()).Interface().(proto.Message), nil +} + +// UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any +// message and places the decoded result in pb. It returns an error if type of +// contents of Any message does not match type of pb message. +// +// pb can be a proto.Message, or a *DynamicAny. +func UnmarshalAny(any *Any, pb proto.Message) error { + if d, ok := pb.(*DynamicAny); ok { + if d.Message == nil { + var err error + d.Message, err = EmptyAny(any) + if err != nil { + return err + } + } + return UnmarshalAny(any, d.Message) + } + + aname, err := AnyMessageName(any) + if err != nil { + return err + } + + mname := proto.MessageName(pb) + if aname != mname { + return fmt.Errorf("mismatched message type: got %q want %q", aname, mname) + } + return proto.Unmarshal(any.Value, pb) +} + +// Is returns true if any value contains a given message type. +func Is(any *Any, pb proto.Message) bool { + // The following is equivalent to AnyMessageName(any) == proto.MessageName(pb), + // but it avoids scanning TypeUrl for the slash. + if any == nil { + return false + } + name := proto.MessageName(pb) + prefix := len(any.TypeUrl) - len(name) + return prefix >= 1 && any.TypeUrl[prefix-1] == '/' && any.TypeUrl[prefix:] == name +} diff --git a/vendor/github.com/gogo/protobuf/types/any.pb.go b/vendor/github.com/gogo/protobuf/types/any.pb.go new file mode 100644 index 00000000..98e269d5 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/any.pb.go @@ -0,0 +1,697 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/any.proto + +package types + +import ( + bytes "bytes" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +type Any struct { + // A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. This string must contain at least + // one "/" character. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` + // Must be a valid serialized protocol buffer of the above specified type. + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Any) Reset() { *m = Any{} } +func (*Any) ProtoMessage() {} +func (*Any) Descriptor() ([]byte, []int) { + return fileDescriptor_b53526c13ae22eb4, []int{0} +} +func (*Any) XXX_WellKnownType() string { return "Any" } +func (m *Any) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Any.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Any) XXX_Merge(src proto.Message) { + xxx_messageInfo_Any.Merge(m, src) +} +func (m *Any) XXX_Size() int { + return m.Size() +} +func (m *Any) XXX_DiscardUnknown() { + xxx_messageInfo_Any.DiscardUnknown(m) +} + +var xxx_messageInfo_Any proto.InternalMessageInfo + +func (m *Any) GetTypeUrl() string { + if m != nil { + return m.TypeUrl + } + return "" +} + +func (m *Any) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (*Any) XXX_MessageName() string { + return "google.protobuf.Any" +} +func init() { + proto.RegisterType((*Any)(nil), "google.protobuf.Any") +} + +func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor_b53526c13ae22eb4) } + +var fileDescriptor_b53526c13ae22eb4 = []byte{ + // 211 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4, + 0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x25, 0x33, 0x2e, 0x66, 0xc7, 0xbc, 0x4a, + 0x21, 0x49, 0x2e, 0x8e, 0x92, 0xca, 0x82, 0xd4, 0xf8, 0xd2, 0xa2, 0x1c, 0x09, 0x46, 0x05, 0x46, + 0x0d, 0xce, 0x20, 0x76, 0x10, 0x3f, 0xb4, 0x28, 0x47, 0x48, 0x84, 0x8b, 0xb5, 0x2c, 0x31, 0xa7, + 0x34, 0x55, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xc2, 0x71, 0xaa, 0xbf, 0xf1, 0x50, 0x8e, + 0xe1, 0xc3, 0x43, 0x39, 0xc6, 0x1f, 0x0f, 0xe5, 0x18, 0x1b, 0x1e, 0xc9, 0x31, 0xae, 0x78, 0x24, + 0xc7, 0x78, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0xbe, 0x78, + 0x24, 0xc7, 0xf0, 0x01, 0x24, 0xfe, 0x58, 0x8e, 0xf1, 0xc4, 0x63, 0x39, 0x46, 0x2e, 0xe1, 0xe4, + 0xfc, 0x5c, 0x3d, 0x34, 0xeb, 0x9d, 0x38, 0x1c, 0xf3, 0x2a, 0x03, 0x40, 0x9c, 0x00, 0xc6, 0x28, + 0x56, 0x90, 0x8d, 0xc5, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x94, + 0x06, 0x40, 0x95, 0xea, 0x85, 0xa7, 0xe6, 0xe4, 0x78, 0xe7, 0xe5, 0x97, 0xe7, 0x85, 0x80, 0x94, + 0x25, 0xb1, 0x81, 0xcd, 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x81, 0x82, 0xd3, 0xed, + 0x00, 0x00, 0x00, +} + +func (this *Any) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Any) + if !ok { + that2, ok := that.(Any) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.TypeUrl != that1.TypeUrl { + if this.TypeUrl < that1.TypeUrl { + return -1 + } + return 1 + } + if c := bytes.Compare(this.Value, that1.Value); c != 0 { + return c + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Any) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Any) + if !ok { + that2, ok := that.(Any) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.TypeUrl != that1.TypeUrl { + return false + } + if !bytes.Equal(this.Value, that1.Value) { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Any) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&types.Any{") + s = append(s, "TypeUrl: "+fmt.Sprintf("%#v", this.TypeUrl)+",\n") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringAny(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *Any) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Any) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Any) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintAny(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.TypeUrl) > 0 { + i -= len(m.TypeUrl) + copy(dAtA[i:], m.TypeUrl) + i = encodeVarintAny(dAtA, i, uint64(len(m.TypeUrl))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintAny(dAtA []byte, offset int, v uint64) int { + offset -= sovAny(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func NewPopulatedAny(r randyAny, easy bool) *Any { + this := &Any{} + this.TypeUrl = string(randStringAny(r)) + v1 := r.Intn(100) + this.Value = make([]byte, v1) + for i := 0; i < v1; i++ { + this.Value[i] = byte(r.Intn(256)) + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedAny(r, 3) + } + return this +} + +type randyAny interface { + Float32() float32 + Float64() float64 + Int63() int64 + Int31() int32 + Uint32() uint32 + Intn(n int) int +} + +func randUTF8RuneAny(r randyAny) rune { + ru := r.Intn(62) + if ru < 10 { + return rune(ru + 48) + } else if ru < 36 { + return rune(ru + 55) + } + return rune(ru + 61) +} +func randStringAny(r randyAny) string { + v2 := r.Intn(100) + tmps := make([]rune, v2) + for i := 0; i < v2; i++ { + tmps[i] = randUTF8RuneAny(r) + } + return string(tmps) +} +func randUnrecognizedAny(r randyAny, maxFieldNumber int) (dAtA []byte) { + l := r.Intn(5) + for i := 0; i < l; i++ { + wire := r.Intn(4) + if wire == 3 { + wire = 5 + } + fieldNumber := maxFieldNumber + r.Intn(100) + dAtA = randFieldAny(dAtA, r, fieldNumber, wire) + } + return dAtA +} +func randFieldAny(dAtA []byte, r randyAny, fieldNumber int, wire int) []byte { + key := uint32(fieldNumber)<<3 | uint32(wire) + switch wire { + case 0: + dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) + v3 := r.Int63() + if r.Intn(2) == 0 { + v3 *= -1 + } + dAtA = encodeVarintPopulateAny(dAtA, uint64(v3)) + case 1: + dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + case 2: + dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) + ll := r.Intn(100) + dAtA = encodeVarintPopulateAny(dAtA, uint64(ll)) + for j := 0; j < ll; j++ { + dAtA = append(dAtA, byte(r.Intn(256))) + } + default: + dAtA = encodeVarintPopulateAny(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + } + return dAtA +} +func encodeVarintPopulateAny(dAtA []byte, v uint64) []byte { + for v >= 1<<7 { + dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) + v >>= 7 + } + dAtA = append(dAtA, uint8(v)) + return dAtA +} +func (m *Any) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TypeUrl) + if l > 0 { + n += 1 + l + sovAny(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovAny(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovAny(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozAny(x uint64) (n int) { + return sovAny(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *Any) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Any{`, + `TypeUrl:` + fmt.Sprintf("%v", this.TypeUrl) + `,`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func valueToStringAny(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *Any) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAny + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Any: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Any: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TypeUrl", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAny + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAny + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAny + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TypeUrl = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAny + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAny + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAny + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAny(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAny + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthAny + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipAny(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAny + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAny + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAny + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthAny + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupAny + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthAny + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthAny = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowAny = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupAny = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/gogo/protobuf/types/api.pb.go b/vendor/github.com/gogo/protobuf/types/api.pb.go new file mode 100644 index 00000000..58bf4b53 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/api.pb.go @@ -0,0 +1,2143 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/api.proto + +package types + +import ( + bytes "bytes" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// Api is a light-weight descriptor for an API Interface. +// +// Interfaces are also described as "protocol buffer services" in some contexts, +// such as by the "service" keyword in a .proto file, but they are different +// from API Services, which represent a concrete implementation of an interface +// as opposed to simply a description of methods and bindings. They are also +// sometimes simply referred to as "APIs" in other contexts, such as the name of +// this message itself. See https://cloud.google.com/apis/design/glossary for +// detailed terminology. +type Api struct { + // The fully qualified name of this interface, including package name + // followed by the interface's simple name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The methods of this interface, in unspecified order. + Methods []*Method `protobuf:"bytes,2,rep,name=methods,proto3" json:"methods,omitempty"` + // Any metadata attached to the interface. + Options []*Option `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` + // A version string for this interface. If specified, must have the form + // `major-version.minor-version`, as in `1.10`. If the minor version is + // omitted, it defaults to zero. If the entire version field is empty, the + // major version is derived from the package name, as outlined below. If the + // field is not empty, the version in the package name will be verified to be + // consistent with what is provided here. + // + // The versioning schema uses [semantic + // versioning](http://semver.org) where the major version number + // indicates a breaking change and the minor version an additive, + // non-breaking change. Both version numbers are signals to users + // what to expect from different versions, and should be carefully + // chosen based on the product plan. + // + // The major version is also reflected in the package name of the + // interface, which must end in `v`, as in + // `google.feature.v1`. For major versions 0 and 1, the suffix can + // be omitted. Zero major versions must only be used for + // experimental, non-GA interfaces. + // + // + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` + // Source context for the protocol buffer service represented by this + // message. + SourceContext *SourceContext `protobuf:"bytes,5,opt,name=source_context,json=sourceContext,proto3" json:"source_context,omitempty"` + // Included interfaces. See [Mixin][]. + Mixins []*Mixin `protobuf:"bytes,6,rep,name=mixins,proto3" json:"mixins,omitempty"` + // The source syntax of the service. + Syntax Syntax `protobuf:"varint,7,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Api) Reset() { *m = Api{} } +func (*Api) ProtoMessage() {} +func (*Api) Descriptor() ([]byte, []int) { + return fileDescriptor_a2ec32096296c143, []int{0} +} +func (m *Api) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Api) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Api.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Api) XXX_Merge(src proto.Message) { + xxx_messageInfo_Api.Merge(m, src) +} +func (m *Api) XXX_Size() int { + return m.Size() +} +func (m *Api) XXX_DiscardUnknown() { + xxx_messageInfo_Api.DiscardUnknown(m) +} + +var xxx_messageInfo_Api proto.InternalMessageInfo + +func (m *Api) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Api) GetMethods() []*Method { + if m != nil { + return m.Methods + } + return nil +} + +func (m *Api) GetOptions() []*Option { + if m != nil { + return m.Options + } + return nil +} + +func (m *Api) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + +func (m *Api) GetSourceContext() *SourceContext { + if m != nil { + return m.SourceContext + } + return nil +} + +func (m *Api) GetMixins() []*Mixin { + if m != nil { + return m.Mixins + } + return nil +} + +func (m *Api) GetSyntax() Syntax { + if m != nil { + return m.Syntax + } + return Syntax_SYNTAX_PROTO2 +} + +func (*Api) XXX_MessageName() string { + return "google.protobuf.Api" +} + +// Method represents a method of an API interface. +type Method struct { + // The simple name of this method. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A URL of the input message type. + RequestTypeUrl string `protobuf:"bytes,2,opt,name=request_type_url,json=requestTypeUrl,proto3" json:"request_type_url,omitempty"` + // If true, the request is streamed. + RequestStreaming bool `protobuf:"varint,3,opt,name=request_streaming,json=requestStreaming,proto3" json:"request_streaming,omitempty"` + // The URL of the output message type. + ResponseTypeUrl string `protobuf:"bytes,4,opt,name=response_type_url,json=responseTypeUrl,proto3" json:"response_type_url,omitempty"` + // If true, the response is streamed. + ResponseStreaming bool `protobuf:"varint,5,opt,name=response_streaming,json=responseStreaming,proto3" json:"response_streaming,omitempty"` + // Any metadata attached to the method. + Options []*Option `protobuf:"bytes,6,rep,name=options,proto3" json:"options,omitempty"` + // The source syntax of this method. + Syntax Syntax `protobuf:"varint,7,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Method) Reset() { *m = Method{} } +func (*Method) ProtoMessage() {} +func (*Method) Descriptor() ([]byte, []int) { + return fileDescriptor_a2ec32096296c143, []int{1} +} +func (m *Method) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Method) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Method.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Method) XXX_Merge(src proto.Message) { + xxx_messageInfo_Method.Merge(m, src) +} +func (m *Method) XXX_Size() int { + return m.Size() +} +func (m *Method) XXX_DiscardUnknown() { + xxx_messageInfo_Method.DiscardUnknown(m) +} + +var xxx_messageInfo_Method proto.InternalMessageInfo + +func (m *Method) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Method) GetRequestTypeUrl() string { + if m != nil { + return m.RequestTypeUrl + } + return "" +} + +func (m *Method) GetRequestStreaming() bool { + if m != nil { + return m.RequestStreaming + } + return false +} + +func (m *Method) GetResponseTypeUrl() string { + if m != nil { + return m.ResponseTypeUrl + } + return "" +} + +func (m *Method) GetResponseStreaming() bool { + if m != nil { + return m.ResponseStreaming + } + return false +} + +func (m *Method) GetOptions() []*Option { + if m != nil { + return m.Options + } + return nil +} + +func (m *Method) GetSyntax() Syntax { + if m != nil { + return m.Syntax + } + return Syntax_SYNTAX_PROTO2 +} + +func (*Method) XXX_MessageName() string { + return "google.protobuf.Method" +} + +// Declares an API Interface to be included in this interface. The including +// interface must redeclare all the methods from the included interface, but +// documentation and options are inherited as follows: +// +// - If after comment and whitespace stripping, the documentation +// string of the redeclared method is empty, it will be inherited +// from the original method. +// +// - Each annotation belonging to the service config (http, +// visibility) which is not set in the redeclared method will be +// inherited. +// +// - If an http annotation is inherited, the path pattern will be +// modified as follows. Any version prefix will be replaced by the +// version of the including interface plus the [root][] path if +// specified. +// +// Example of a simple mixin: +// +// package google.acl.v1; +// service AccessControl { +// // Get the underlying ACL object. +// rpc GetAcl(GetAclRequest) returns (Acl) { +// option (google.api.http).get = "/v1/{resource=**}:getAcl"; +// } +// } +// +// package google.storage.v2; +// service Storage { +// rpc GetAcl(GetAclRequest) returns (Acl); +// +// // Get a data record. +// rpc GetData(GetDataRequest) returns (Data) { +// option (google.api.http).get = "/v2/{resource=**}"; +// } +// } +// +// Example of a mixin configuration: +// +// apis: +// - name: google.storage.v2.Storage +// mixins: +// - name: google.acl.v1.AccessControl +// +// The mixin construct implies that all methods in `AccessControl` are +// also declared with same name and request/response types in +// `Storage`. A documentation generator or annotation processor will +// see the effective `Storage.GetAcl` method after inherting +// documentation and annotations as follows: +// +// service Storage { +// // Get the underlying ACL object. +// rpc GetAcl(GetAclRequest) returns (Acl) { +// option (google.api.http).get = "/v2/{resource=**}:getAcl"; +// } +// ... +// } +// +// Note how the version in the path pattern changed from `v1` to `v2`. +// +// If the `root` field in the mixin is specified, it should be a +// relative path under which inherited HTTP paths are placed. Example: +// +// apis: +// - name: google.storage.v2.Storage +// mixins: +// - name: google.acl.v1.AccessControl +// root: acls +// +// This implies the following inherited HTTP annotation: +// +// service Storage { +// // Get the underlying ACL object. +// rpc GetAcl(GetAclRequest) returns (Acl) { +// option (google.api.http).get = "/v2/acls/{resource=**}:getAcl"; +// } +// ... +// } +type Mixin struct { + // The fully qualified name of the interface which is included. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // If non-empty specifies a path under which inherited HTTP paths + // are rooted. + Root string `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Mixin) Reset() { *m = Mixin{} } +func (*Mixin) ProtoMessage() {} +func (*Mixin) Descriptor() ([]byte, []int) { + return fileDescriptor_a2ec32096296c143, []int{2} +} +func (m *Mixin) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Mixin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Mixin.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Mixin) XXX_Merge(src proto.Message) { + xxx_messageInfo_Mixin.Merge(m, src) +} +func (m *Mixin) XXX_Size() int { + return m.Size() +} +func (m *Mixin) XXX_DiscardUnknown() { + xxx_messageInfo_Mixin.DiscardUnknown(m) +} + +var xxx_messageInfo_Mixin proto.InternalMessageInfo + +func (m *Mixin) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Mixin) GetRoot() string { + if m != nil { + return m.Root + } + return "" +} + +func (*Mixin) XXX_MessageName() string { + return "google.protobuf.Mixin" +} +func init() { + proto.RegisterType((*Api)(nil), "google.protobuf.Api") + proto.RegisterType((*Method)(nil), "google.protobuf.Method") + proto.RegisterType((*Mixin)(nil), "google.protobuf.Mixin") +} + +func init() { proto.RegisterFile("google/protobuf/api.proto", fileDescriptor_a2ec32096296c143) } + +var fileDescriptor_a2ec32096296c143 = []byte{ + // 467 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0x31, 0x6f, 0x13, 0x31, + 0x14, 0xc7, 0xeb, 0xbb, 0xe4, 0x52, 0x5c, 0x91, 0x82, 0x91, 0xc0, 0x64, 0xb0, 0x4e, 0x15, 0xc3, + 0x09, 0xc4, 0x45, 0x94, 0x4f, 0xd0, 0x20, 0xd4, 0x01, 0x21, 0xa2, 0x0b, 0x08, 0x89, 0x25, 0x4a, + 0x83, 0x09, 0x96, 0xee, 0x6c, 0x63, 0x3b, 0x90, 0x4c, 0xf0, 0x59, 0x98, 0x10, 0x23, 0xdf, 0x80, + 0xad, 0x23, 0x23, 0x23, 0xb9, 0x2e, 0x8c, 0x1d, 0x19, 0x91, 0x7d, 0xe7, 0xa6, 0x5c, 0x83, 0x04, + 0x9b, 0xdf, 0xfb, 0xff, 0xfc, 0xf7, 0x7b, 0x7f, 0xc3, 0x9b, 0x33, 0x21, 0x66, 0x39, 0xed, 0x4b, + 0x25, 0x8c, 0x38, 0x9a, 0xbf, 0xea, 0x4f, 0x24, 0x4b, 0x5d, 0x81, 0x76, 0x2b, 0x29, 0xf5, 0x52, + 0xef, 0x56, 0x93, 0xd5, 0x62, 0xae, 0xa6, 0x74, 0x3c, 0x15, 0xdc, 0xd0, 0x85, 0xa9, 0xc0, 0x5e, + 0xaf, 0x49, 0x99, 0xa5, 0xac, 0x4d, 0xf6, 0xbe, 0x06, 0x30, 0x3c, 0x90, 0x0c, 0x21, 0xd8, 0xe2, + 0x93, 0x82, 0x62, 0x10, 0x83, 0xe4, 0x52, 0xe6, 0xce, 0xe8, 0x1e, 0xec, 0x14, 0xd4, 0xbc, 0x16, + 0x2f, 0x35, 0x0e, 0xe2, 0x30, 0xd9, 0xd9, 0xbf, 0x91, 0x36, 0x06, 0x48, 0x1f, 0x3b, 0x3d, 0xf3, + 0x9c, 0xbd, 0x22, 0xa4, 0x61, 0x82, 0x6b, 0x1c, 0xfe, 0xe5, 0xca, 0x13, 0xa7, 0x67, 0x9e, 0x43, + 0x18, 0x76, 0xde, 0x52, 0xa5, 0x99, 0xe0, 0xb8, 0xe5, 0x1e, 0xf7, 0x25, 0x7a, 0x08, 0xbb, 0x7f, + 0xee, 0x83, 0xdb, 0x31, 0x48, 0x76, 0xf6, 0xc9, 0x05, 0xcf, 0x91, 0xc3, 0x1e, 0x54, 0x54, 0x76, + 0x59, 0x9f, 0x2f, 0x51, 0x0a, 0xa3, 0x82, 0x2d, 0x18, 0xd7, 0x38, 0x72, 0x23, 0x5d, 0xbf, 0xb8, + 0x85, 0x95, 0xb3, 0x9a, 0x42, 0x7d, 0x18, 0xe9, 0x25, 0x37, 0x93, 0x05, 0xee, 0xc4, 0x20, 0xe9, + 0x6e, 0x58, 0x61, 0xe4, 0xe4, 0xac, 0xc6, 0xf6, 0xbe, 0x04, 0x30, 0xaa, 0x82, 0xd8, 0x18, 0x63, + 0x02, 0xaf, 0x28, 0xfa, 0x66, 0x4e, 0xb5, 0x19, 0xdb, 0xe0, 0xc7, 0x73, 0x95, 0xe3, 0xc0, 0xe9, + 0xdd, 0xba, 0xff, 0x74, 0x29, 0xe9, 0x33, 0x95, 0xa3, 0x3b, 0xf0, 0xaa, 0x27, 0xb5, 0x51, 0x74, + 0x52, 0x30, 0x3e, 0xc3, 0x61, 0x0c, 0x92, 0xed, 0xcc, 0x5b, 0x8c, 0x7c, 0x1f, 0xdd, 0xb6, 0xb0, + 0x96, 0x82, 0x6b, 0xba, 0xf6, 0xad, 0x12, 0xdc, 0xf5, 0x82, 0x37, 0xbe, 0x0b, 0xd1, 0x19, 0xbb, + 0x76, 0x6e, 0x3b, 0xe7, 0x33, 0x97, 0xb5, 0xf5, 0xb9, 0x5f, 0x8c, 0xfe, 0xf1, 0x17, 0xff, 0x3b, + 0xb4, 0x3e, 0x6c, 0xbb, 0xd8, 0x37, 0x46, 0x86, 0x60, 0x4b, 0x09, 0x61, 0xea, 0x98, 0xdc, 0x79, + 0xf0, 0xfe, 0xfb, 0x8a, 0x6c, 0x9d, 0xae, 0x08, 0xf8, 0xb5, 0x22, 0xe0, 0x43, 0x49, 0xc0, 0xa7, + 0x92, 0x80, 0xe3, 0x92, 0x80, 0x6f, 0x25, 0x01, 0x3f, 0x4a, 0x02, 0x7e, 0x96, 0x64, 0xeb, 0xd4, + 0xf6, 0x4f, 0x08, 0x38, 0x3e, 0x21, 0x00, 0x5e, 0x9b, 0x8a, 0xa2, 0x39, 0xc6, 0x60, 0xfb, 0x40, + 0xb2, 0xa1, 0x2d, 0x86, 0xe0, 0x45, 0xdb, 0xe6, 0xa6, 0x3f, 0x06, 0xe1, 0xe1, 0x70, 0xf0, 0x39, + 0x20, 0x87, 0x15, 0x3a, 0xf4, 0x13, 0x3f, 0xa7, 0x79, 0xfe, 0x88, 0x8b, 0x77, 0xdc, 0xc6, 0xa8, + 0x8f, 0x22, 0xe7, 0x71, 0xff, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x64, 0x40, 0x40, 0xa1, + 0x03, 0x00, 0x00, +} + +func (this *Api) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Api) + if !ok { + that2, ok := that.(Api) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Name != that1.Name { + if this.Name < that1.Name { + return -1 + } + return 1 + } + if len(this.Methods) != len(that1.Methods) { + if len(this.Methods) < len(that1.Methods) { + return -1 + } + return 1 + } + for i := range this.Methods { + if c := this.Methods[i].Compare(that1.Methods[i]); c != 0 { + return c + } + } + if len(this.Options) != len(that1.Options) { + if len(this.Options) < len(that1.Options) { + return -1 + } + return 1 + } + for i := range this.Options { + if c := this.Options[i].Compare(that1.Options[i]); c != 0 { + return c + } + } + if this.Version != that1.Version { + if this.Version < that1.Version { + return -1 + } + return 1 + } + if c := this.SourceContext.Compare(that1.SourceContext); c != 0 { + return c + } + if len(this.Mixins) != len(that1.Mixins) { + if len(this.Mixins) < len(that1.Mixins) { + return -1 + } + return 1 + } + for i := range this.Mixins { + if c := this.Mixins[i].Compare(that1.Mixins[i]); c != 0 { + return c + } + } + if this.Syntax != that1.Syntax { + if this.Syntax < that1.Syntax { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Method) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Method) + if !ok { + that2, ok := that.(Method) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Name != that1.Name { + if this.Name < that1.Name { + return -1 + } + return 1 + } + if this.RequestTypeUrl != that1.RequestTypeUrl { + if this.RequestTypeUrl < that1.RequestTypeUrl { + return -1 + } + return 1 + } + if this.RequestStreaming != that1.RequestStreaming { + if !this.RequestStreaming { + return -1 + } + return 1 + } + if this.ResponseTypeUrl != that1.ResponseTypeUrl { + if this.ResponseTypeUrl < that1.ResponseTypeUrl { + return -1 + } + return 1 + } + if this.ResponseStreaming != that1.ResponseStreaming { + if !this.ResponseStreaming { + return -1 + } + return 1 + } + if len(this.Options) != len(that1.Options) { + if len(this.Options) < len(that1.Options) { + return -1 + } + return 1 + } + for i := range this.Options { + if c := this.Options[i].Compare(that1.Options[i]); c != 0 { + return c + } + } + if this.Syntax != that1.Syntax { + if this.Syntax < that1.Syntax { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Mixin) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Mixin) + if !ok { + that2, ok := that.(Mixin) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Name != that1.Name { + if this.Name < that1.Name { + return -1 + } + return 1 + } + if this.Root != that1.Root { + if this.Root < that1.Root { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Api) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Api) + if !ok { + that2, ok := that.(Api) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if len(this.Methods) != len(that1.Methods) { + return false + } + for i := range this.Methods { + if !this.Methods[i].Equal(that1.Methods[i]) { + return false + } + } + if len(this.Options) != len(that1.Options) { + return false + } + for i := range this.Options { + if !this.Options[i].Equal(that1.Options[i]) { + return false + } + } + if this.Version != that1.Version { + return false + } + if !this.SourceContext.Equal(that1.SourceContext) { + return false + } + if len(this.Mixins) != len(that1.Mixins) { + return false + } + for i := range this.Mixins { + if !this.Mixins[i].Equal(that1.Mixins[i]) { + return false + } + } + if this.Syntax != that1.Syntax { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Method) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Method) + if !ok { + that2, ok := that.(Method) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if this.RequestTypeUrl != that1.RequestTypeUrl { + return false + } + if this.RequestStreaming != that1.RequestStreaming { + return false + } + if this.ResponseTypeUrl != that1.ResponseTypeUrl { + return false + } + if this.ResponseStreaming != that1.ResponseStreaming { + return false + } + if len(this.Options) != len(that1.Options) { + return false + } + for i := range this.Options { + if !this.Options[i].Equal(that1.Options[i]) { + return false + } + } + if this.Syntax != that1.Syntax { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Mixin) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Mixin) + if !ok { + that2, ok := that.(Mixin) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if this.Root != that1.Root { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Api) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 11) + s = append(s, "&types.Api{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Methods != nil { + s = append(s, "Methods: "+fmt.Sprintf("%#v", this.Methods)+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + s = append(s, "Version: "+fmt.Sprintf("%#v", this.Version)+",\n") + if this.SourceContext != nil { + s = append(s, "SourceContext: "+fmt.Sprintf("%#v", this.SourceContext)+",\n") + } + if this.Mixins != nil { + s = append(s, "Mixins: "+fmt.Sprintf("%#v", this.Mixins)+",\n") + } + s = append(s, "Syntax: "+fmt.Sprintf("%#v", this.Syntax)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Method) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 11) + s = append(s, "&types.Method{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "RequestTypeUrl: "+fmt.Sprintf("%#v", this.RequestTypeUrl)+",\n") + s = append(s, "RequestStreaming: "+fmt.Sprintf("%#v", this.RequestStreaming)+",\n") + s = append(s, "ResponseTypeUrl: "+fmt.Sprintf("%#v", this.ResponseTypeUrl)+",\n") + s = append(s, "ResponseStreaming: "+fmt.Sprintf("%#v", this.ResponseStreaming)+",\n") + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + s = append(s, "Syntax: "+fmt.Sprintf("%#v", this.Syntax)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Mixin) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&types.Mixin{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "Root: "+fmt.Sprintf("%#v", this.Root)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringApi(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *Api) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Api) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Api) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Syntax != 0 { + i = encodeVarintApi(dAtA, i, uint64(m.Syntax)) + i-- + dAtA[i] = 0x38 + } + if len(m.Mixins) > 0 { + for iNdEx := len(m.Mixins) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Mixins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.SourceContext != nil { + { + size, err := m.SourceContext.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = encodeVarintApi(dAtA, i, uint64(len(m.Version))) + i-- + dAtA[i] = 0x22 + } + if len(m.Options) > 0 { + for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Methods) > 0 { + for iNdEx := len(m.Methods) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Methods[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintApi(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Method) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Method) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Method) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Syntax != 0 { + i = encodeVarintApi(dAtA, i, uint64(m.Syntax)) + i-- + dAtA[i] = 0x38 + } + if len(m.Options) > 0 { + for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.ResponseStreaming { + i-- + if m.ResponseStreaming { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if len(m.ResponseTypeUrl) > 0 { + i -= len(m.ResponseTypeUrl) + copy(dAtA[i:], m.ResponseTypeUrl) + i = encodeVarintApi(dAtA, i, uint64(len(m.ResponseTypeUrl))) + i-- + dAtA[i] = 0x22 + } + if m.RequestStreaming { + i-- + if m.RequestStreaming { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.RequestTypeUrl) > 0 { + i -= len(m.RequestTypeUrl) + copy(dAtA[i:], m.RequestTypeUrl) + i = encodeVarintApi(dAtA, i, uint64(len(m.RequestTypeUrl))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintApi(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Mixin) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Mixin) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Mixin) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Root) > 0 { + i -= len(m.Root) + copy(dAtA[i:], m.Root) + i = encodeVarintApi(dAtA, i, uint64(len(m.Root))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintApi(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintApi(dAtA []byte, offset int, v uint64) int { + offset -= sovApi(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func NewPopulatedApi(r randyApi, easy bool) *Api { + this := &Api{} + this.Name = string(randStringApi(r)) + if r.Intn(5) != 0 { + v1 := r.Intn(5) + this.Methods = make([]*Method, v1) + for i := 0; i < v1; i++ { + this.Methods[i] = NewPopulatedMethod(r, easy) + } + } + if r.Intn(5) != 0 { + v2 := r.Intn(5) + this.Options = make([]*Option, v2) + for i := 0; i < v2; i++ { + this.Options[i] = NewPopulatedOption(r, easy) + } + } + this.Version = string(randStringApi(r)) + if r.Intn(5) != 0 { + this.SourceContext = NewPopulatedSourceContext(r, easy) + } + if r.Intn(5) != 0 { + v3 := r.Intn(5) + this.Mixins = make([]*Mixin, v3) + for i := 0; i < v3; i++ { + this.Mixins[i] = NewPopulatedMixin(r, easy) + } + } + this.Syntax = Syntax([]int32{0, 1}[r.Intn(2)]) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedApi(r, 8) + } + return this +} + +func NewPopulatedMethod(r randyApi, easy bool) *Method { + this := &Method{} + this.Name = string(randStringApi(r)) + this.RequestTypeUrl = string(randStringApi(r)) + this.RequestStreaming = bool(bool(r.Intn(2) == 0)) + this.ResponseTypeUrl = string(randStringApi(r)) + this.ResponseStreaming = bool(bool(r.Intn(2) == 0)) + if r.Intn(5) != 0 { + v4 := r.Intn(5) + this.Options = make([]*Option, v4) + for i := 0; i < v4; i++ { + this.Options[i] = NewPopulatedOption(r, easy) + } + } + this.Syntax = Syntax([]int32{0, 1}[r.Intn(2)]) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedApi(r, 8) + } + return this +} + +func NewPopulatedMixin(r randyApi, easy bool) *Mixin { + this := &Mixin{} + this.Name = string(randStringApi(r)) + this.Root = string(randStringApi(r)) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedApi(r, 3) + } + return this +} + +type randyApi interface { + Float32() float32 + Float64() float64 + Int63() int64 + Int31() int32 + Uint32() uint32 + Intn(n int) int +} + +func randUTF8RuneApi(r randyApi) rune { + ru := r.Intn(62) + if ru < 10 { + return rune(ru + 48) + } else if ru < 36 { + return rune(ru + 55) + } + return rune(ru + 61) +} +func randStringApi(r randyApi) string { + v5 := r.Intn(100) + tmps := make([]rune, v5) + for i := 0; i < v5; i++ { + tmps[i] = randUTF8RuneApi(r) + } + return string(tmps) +} +func randUnrecognizedApi(r randyApi, maxFieldNumber int) (dAtA []byte) { + l := r.Intn(5) + for i := 0; i < l; i++ { + wire := r.Intn(4) + if wire == 3 { + wire = 5 + } + fieldNumber := maxFieldNumber + r.Intn(100) + dAtA = randFieldApi(dAtA, r, fieldNumber, wire) + } + return dAtA +} +func randFieldApi(dAtA []byte, r randyApi, fieldNumber int, wire int) []byte { + key := uint32(fieldNumber)<<3 | uint32(wire) + switch wire { + case 0: + dAtA = encodeVarintPopulateApi(dAtA, uint64(key)) + v6 := r.Int63() + if r.Intn(2) == 0 { + v6 *= -1 + } + dAtA = encodeVarintPopulateApi(dAtA, uint64(v6)) + case 1: + dAtA = encodeVarintPopulateApi(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + case 2: + dAtA = encodeVarintPopulateApi(dAtA, uint64(key)) + ll := r.Intn(100) + dAtA = encodeVarintPopulateApi(dAtA, uint64(ll)) + for j := 0; j < ll; j++ { + dAtA = append(dAtA, byte(r.Intn(256))) + } + default: + dAtA = encodeVarintPopulateApi(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + } + return dAtA +} +func encodeVarintPopulateApi(dAtA []byte, v uint64) []byte { + for v >= 1<<7 { + dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) + v >>= 7 + } + dAtA = append(dAtA, uint8(v)) + return dAtA +} +func (m *Api) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + if len(m.Methods) > 0 { + for _, e := range m.Methods { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } + if len(m.Options) > 0 { + for _, e := range m.Options { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } + l = len(m.Version) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + if m.SourceContext != nil { + l = m.SourceContext.Size() + n += 1 + l + sovApi(uint64(l)) + } + if len(m.Mixins) > 0 { + for _, e := range m.Mixins { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } + if m.Syntax != 0 { + n += 1 + sovApi(uint64(m.Syntax)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Method) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + l = len(m.RequestTypeUrl) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + if m.RequestStreaming { + n += 2 + } + l = len(m.ResponseTypeUrl) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + if m.ResponseStreaming { + n += 2 + } + if len(m.Options) > 0 { + for _, e := range m.Options { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } + if m.Syntax != 0 { + n += 1 + sovApi(uint64(m.Syntax)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Mixin) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + l = len(m.Root) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovApi(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozApi(x uint64) (n int) { + return sovApi(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *Api) String() string { + if this == nil { + return "nil" + } + repeatedStringForMethods := "[]*Method{" + for _, f := range this.Methods { + repeatedStringForMethods += strings.Replace(f.String(), "Method", "Method", 1) + "," + } + repeatedStringForMethods += "}" + repeatedStringForOptions := "[]*Option{" + for _, f := range this.Options { + repeatedStringForOptions += strings.Replace(fmt.Sprintf("%v", f), "Option", "Option", 1) + "," + } + repeatedStringForOptions += "}" + repeatedStringForMixins := "[]*Mixin{" + for _, f := range this.Mixins { + repeatedStringForMixins += strings.Replace(f.String(), "Mixin", "Mixin", 1) + "," + } + repeatedStringForMixins += "}" + s := strings.Join([]string{`&Api{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Methods:` + repeatedStringForMethods + `,`, + `Options:` + repeatedStringForOptions + `,`, + `Version:` + fmt.Sprintf("%v", this.Version) + `,`, + `SourceContext:` + strings.Replace(fmt.Sprintf("%v", this.SourceContext), "SourceContext", "SourceContext", 1) + `,`, + `Mixins:` + repeatedStringForMixins + `,`, + `Syntax:` + fmt.Sprintf("%v", this.Syntax) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *Method) String() string { + if this == nil { + return "nil" + } + repeatedStringForOptions := "[]*Option{" + for _, f := range this.Options { + repeatedStringForOptions += strings.Replace(fmt.Sprintf("%v", f), "Option", "Option", 1) + "," + } + repeatedStringForOptions += "}" + s := strings.Join([]string{`&Method{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `RequestTypeUrl:` + fmt.Sprintf("%v", this.RequestTypeUrl) + `,`, + `RequestStreaming:` + fmt.Sprintf("%v", this.RequestStreaming) + `,`, + `ResponseTypeUrl:` + fmt.Sprintf("%v", this.ResponseTypeUrl) + `,`, + `ResponseStreaming:` + fmt.Sprintf("%v", this.ResponseStreaming) + `,`, + `Options:` + repeatedStringForOptions + `,`, + `Syntax:` + fmt.Sprintf("%v", this.Syntax) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *Mixin) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Mixin{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Root:` + fmt.Sprintf("%v", this.Root) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func valueToStringApi(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *Api) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Api: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Api: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Methods", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Methods = append(m.Methods, &Method{}) + if err := m.Methods[len(m.Methods)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Options = append(m.Options, &Option{}) + if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SourceContext", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SourceContext == nil { + m.SourceContext = &SourceContext{} + } + if err := m.SourceContext.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Mixins", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Mixins = append(m.Mixins, &Mixin{}) + if err := m.Mixins[len(m.Mixins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Syntax", wireType) + } + m.Syntax = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Syntax |= Syntax(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Method) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Method: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Method: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestTypeUrl", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RequestTypeUrl = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestStreaming", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.RequestStreaming = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponseTypeUrl", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResponseTypeUrl = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponseStreaming", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ResponseStreaming = bool(v != 0) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Options = append(m.Options, &Option{}) + if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Syntax", wireType) + } + m.Syntax = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Syntax |= Syntax(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Mixin) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Mixin: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Mixin: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Root", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Root = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipApi(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowApi + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowApi + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowApi + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthApi + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupApi + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthApi + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthApi = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowApi = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupApi = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/gogo/protobuf/types/doc.go b/vendor/github.com/gogo/protobuf/types/doc.go new file mode 100644 index 00000000..ff2810af --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/doc.go @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package types contains code for interacting with well-known types. +*/ +package types diff --git a/vendor/github.com/gogo/protobuf/types/duration.go b/vendor/github.com/gogo/protobuf/types/duration.go new file mode 100644 index 00000000..979b8e78 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/duration.go @@ -0,0 +1,100 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package types + +// This file implements conversions between google.protobuf.Duration +// and time.Duration. + +import ( + "errors" + "fmt" + "time" +) + +const ( + // Range of a Duration in seconds, as specified in + // google/protobuf/duration.proto. This is about 10,000 years in seconds. + maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) + minSeconds = -maxSeconds +) + +// validateDuration determines whether the Duration is valid according to the +// definition in google/protobuf/duration.proto. A valid Duration +// may still be too large to fit into a time.Duration (the range of Duration +// is about 10,000 years, and the range of time.Duration is about 290). +func validateDuration(d *Duration) error { + if d == nil { + return errors.New("duration: nil Duration") + } + if d.Seconds < minSeconds || d.Seconds > maxSeconds { + return fmt.Errorf("duration: %#v: seconds out of range", d) + } + if d.Nanos <= -1e9 || d.Nanos >= 1e9 { + return fmt.Errorf("duration: %#v: nanos out of range", d) + } + // Seconds and Nanos must have the same sign, unless d.Nanos is zero. + if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { + return fmt.Errorf("duration: %#v: seconds and nanos have different signs", d) + } + return nil +} + +// DurationFromProto converts a Duration to a time.Duration. DurationFromProto +// returns an error if the Duration is invalid or is too large to be +// represented in a time.Duration. +func DurationFromProto(p *Duration) (time.Duration, error) { + if err := validateDuration(p); err != nil { + return 0, err + } + d := time.Duration(p.Seconds) * time.Second + if int64(d/time.Second) != p.Seconds { + return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) + } + if p.Nanos != 0 { + d += time.Duration(p.Nanos) * time.Nanosecond + if (d < 0) != (p.Nanos < 0) { + return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) + } + } + return d, nil +} + +// DurationProto converts a time.Duration to a Duration. +func DurationProto(d time.Duration) *Duration { + nanos := d.Nanoseconds() + secs := nanos / 1e9 + nanos -= secs * 1e9 + return &Duration{ + Seconds: secs, + Nanos: int32(nanos), + } +} diff --git a/vendor/github.com/gogo/protobuf/types/duration.pb.go b/vendor/github.com/gogo/protobuf/types/duration.pb.go new file mode 100644 index 00000000..3959f066 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/duration.pb.go @@ -0,0 +1,520 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/duration.proto + +package types + +import ( + bytes "bytes" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (durations.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +// +type Duration struct { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Duration) Reset() { *m = Duration{} } +func (*Duration) ProtoMessage() {} +func (*Duration) Descriptor() ([]byte, []int) { + return fileDescriptor_23597b2ebd7ac6c5, []int{0} +} +func (*Duration) XXX_WellKnownType() string { return "Duration" } +func (m *Duration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Duration.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Duration) XXX_Merge(src proto.Message) { + xxx_messageInfo_Duration.Merge(m, src) +} +func (m *Duration) XXX_Size() int { + return m.Size() +} +func (m *Duration) XXX_DiscardUnknown() { + xxx_messageInfo_Duration.DiscardUnknown(m) +} + +var xxx_messageInfo_Duration proto.InternalMessageInfo + +func (m *Duration) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Duration) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func (*Duration) XXX_MessageName() string { + return "google.protobuf.Duration" +} +func init() { + proto.RegisterType((*Duration)(nil), "google.protobuf.Duration") +} + +func init() { proto.RegisterFile("google/protobuf/duration.proto", fileDescriptor_23597b2ebd7ac6c5) } + +var fileDescriptor_23597b2ebd7ac6c5 = []byte{ + // 209 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0x29, 0x2d, 0x4a, + 0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0x56, + 0x5c, 0x1c, 0x2e, 0x50, 0x25, 0x42, 0x12, 0x5c, 0xec, 0xc5, 0xa9, 0xc9, 0xf9, 0x79, 0x29, 0xc5, + 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x30, 0xae, 0x90, 0x08, 0x17, 0x6b, 0x5e, 0x62, 0x5e, + 0x7e, 0xb1, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x6b, 0x10, 0x84, 0xe3, 0x54, 0x7f, 0xe3, 0xa1, 0x1c, + 0xc3, 0x87, 0x87, 0x72, 0x8c, 0x2b, 0x1e, 0xc9, 0x31, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, + 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x2f, 0x1e, 0xc9, 0x31, 0x7c, 0x78, 0x24, 0xc7, 0xb8, 0xe2, + 0xb1, 0x1c, 0xe3, 0x89, 0xc7, 0x72, 0x8c, 0x5c, 0xc2, 0xc9, 0xf9, 0xb9, 0x7a, 0x68, 0x56, 0x3b, + 0xf1, 0xc2, 0x2c, 0x0e, 0x00, 0x89, 0x04, 0x30, 0x46, 0xb1, 0x96, 0x54, 0x16, 0xa4, 0x16, 0xff, + 0x60, 0x64, 0x5c, 0xc4, 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0xa2, 0x25, 0x00, + 0xaa, 0x45, 0x2f, 0x3c, 0x35, 0x27, 0xc7, 0x3b, 0x2f, 0xbf, 0x3c, 0x2f, 0x04, 0xa4, 0x32, 0x89, + 0x0d, 0x6c, 0x96, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x1c, 0x64, 0x4e, 0xf6, 0x00, 0x00, + 0x00, +} + +func (this *Duration) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Duration) + if !ok { + that2, ok := that.(Duration) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Seconds != that1.Seconds { + if this.Seconds < that1.Seconds { + return -1 + } + return 1 + } + if this.Nanos != that1.Nanos { + if this.Nanos < that1.Nanos { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Duration) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Duration) + if !ok { + that2, ok := that.(Duration) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Seconds != that1.Seconds { + return false + } + if this.Nanos != that1.Nanos { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Duration) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&types.Duration{") + s = append(s, "Seconds: "+fmt.Sprintf("%#v", this.Seconds)+",\n") + s = append(s, "Nanos: "+fmt.Sprintf("%#v", this.Nanos)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringDuration(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *Duration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Duration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Duration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Nanos != 0 { + i = encodeVarintDuration(dAtA, i, uint64(m.Nanos)) + i-- + dAtA[i] = 0x10 + } + if m.Seconds != 0 { + i = encodeVarintDuration(dAtA, i, uint64(m.Seconds)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintDuration(dAtA []byte, offset int, v uint64) int { + offset -= sovDuration(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Duration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Seconds != 0 { + n += 1 + sovDuration(uint64(m.Seconds)) + } + if m.Nanos != 0 { + n += 1 + sovDuration(uint64(m.Nanos)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovDuration(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozDuration(x uint64) (n int) { + return sovDuration(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Duration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDuration + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Duration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Duration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType) + } + m.Seconds = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDuration + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Seconds |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType) + } + m.Nanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDuration + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nanos |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipDuration(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthDuration + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthDuration + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipDuration(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDuration + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDuration + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowDuration + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthDuration + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupDuration + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthDuration + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthDuration = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowDuration = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupDuration = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/gogo/protobuf/types/duration_gogo.go b/vendor/github.com/gogo/protobuf/types/duration_gogo.go new file mode 100644 index 00000000..90e7670e --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/duration_gogo.go @@ -0,0 +1,100 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2016, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package types + +import ( + "fmt" + "time" +) + +func NewPopulatedDuration(r interface { + Int63() int64 +}, easy bool) *Duration { + this := &Duration{} + maxSecs := time.Hour.Nanoseconds() / 1e9 + max := 2 * maxSecs + s := int64(r.Int63()) % max + s -= maxSecs + neg := int64(1) + if s < 0 { + neg = -1 + } + this.Seconds = s + this.Nanos = int32(neg * (r.Int63() % 1e9)) + return this +} + +func (d *Duration) String() string { + td, err := DurationFromProto(d) + if err != nil { + return fmt.Sprintf("(%v)", err) + } + return td.String() +} + +func NewPopulatedStdDuration(r interface { + Int63() int64 +}, easy bool) *time.Duration { + dur := NewPopulatedDuration(r, easy) + d, err := DurationFromProto(dur) + if err != nil { + return nil + } + return &d +} + +func SizeOfStdDuration(d time.Duration) int { + dur := DurationProto(d) + return dur.Size() +} + +func StdDurationMarshal(d time.Duration) ([]byte, error) { + size := SizeOfStdDuration(d) + buf := make([]byte, size) + _, err := StdDurationMarshalTo(d, buf) + return buf, err +} + +func StdDurationMarshalTo(d time.Duration, data []byte) (int, error) { + dur := DurationProto(d) + return dur.MarshalTo(data) +} + +func StdDurationUnmarshal(d *time.Duration, data []byte) error { + dur := &Duration{} + if err := dur.Unmarshal(data); err != nil { + return err + } + dd, err := DurationFromProto(dur) + if err != nil { + return err + } + *d = dd + return nil +} diff --git a/vendor/github.com/gogo/protobuf/types/empty.pb.go b/vendor/github.com/gogo/protobuf/types/empty.pb.go new file mode 100644 index 00000000..17e3aa55 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/empty.pb.go @@ -0,0 +1,465 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/empty.proto + +package types + +import ( + bytes "bytes" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +// The JSON representation for `Empty` is empty JSON object `{}`. +type Empty struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Empty) Reset() { *m = Empty{} } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { + return fileDescriptor_900544acb223d5b8, []int{0} +} +func (*Empty) XXX_WellKnownType() string { return "Empty" } +func (m *Empty) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Empty.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Empty) XXX_Merge(src proto.Message) { + xxx_messageInfo_Empty.Merge(m, src) +} +func (m *Empty) XXX_Size() int { + return m.Size() +} +func (m *Empty) XXX_DiscardUnknown() { + xxx_messageInfo_Empty.DiscardUnknown(m) +} + +var xxx_messageInfo_Empty proto.InternalMessageInfo + +func (*Empty) XXX_MessageName() string { + return "google.protobuf.Empty" +} +func init() { + proto.RegisterType((*Empty)(nil), "google.protobuf.Empty") +} + +func init() { proto.RegisterFile("google/protobuf/empty.proto", fileDescriptor_900544acb223d5b8) } + +var fileDescriptor_900544acb223d5b8 = []byte{ + // 176 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcd, 0x2d, 0x28, + 0xa9, 0xd4, 0x03, 0x73, 0x85, 0xf8, 0x21, 0x92, 0x7a, 0x30, 0x49, 0x25, 0x76, 0x2e, 0x56, 0x57, + 0x90, 0xbc, 0x53, 0x0b, 0xe3, 0x8d, 0x87, 0x72, 0x0c, 0x1f, 0x1e, 0xca, 0x31, 0xfe, 0x78, 0x28, + 0xc7, 0xd8, 0xf0, 0x48, 0x8e, 0x71, 0xc5, 0x23, 0x39, 0xc6, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, + 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0xf1, 0xc5, 0x23, 0x39, 0x86, 0x0f, 0x20, 0xf1, 0xc7, 0x72, + 0x8c, 0x27, 0x1e, 0xcb, 0x31, 0x72, 0x09, 0x27, 0xe7, 0xe7, 0xea, 0xa1, 0x19, 0xe8, 0xc4, 0x05, + 0x36, 0x2e, 0x00, 0xc4, 0x0d, 0x60, 0x8c, 0x62, 0x2d, 0xa9, 0x2c, 0x48, 0x2d, 0xfe, 0xc1, 0xc8, + 0xb8, 0x88, 0x89, 0xd9, 0x3d, 0xc0, 0x69, 0x15, 0x93, 0x9c, 0x3b, 0x44, 0x7d, 0x00, 0x54, 0xbd, + 0x5e, 0x78, 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x65, 0x12, 0x1b, 0xd8, + 0x20, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x21, 0xbe, 0xb6, 0x31, 0xc6, 0x00, 0x00, 0x00, +} + +func (this *Empty) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Empty) + if !ok { + that2, ok := that.(Empty) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Empty) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Empty) + if !ok { + that2, ok := that.(Empty) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Empty) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 4) + s = append(s, "&types.Empty{") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringEmpty(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *Empty) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Empty) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func encodeVarintEmpty(dAtA []byte, offset int, v uint64) int { + offset -= sovEmpty(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func NewPopulatedEmpty(r randyEmpty, easy bool) *Empty { + this := &Empty{} + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedEmpty(r, 1) + } + return this +} + +type randyEmpty interface { + Float32() float32 + Float64() float64 + Int63() int64 + Int31() int32 + Uint32() uint32 + Intn(n int) int +} + +func randUTF8RuneEmpty(r randyEmpty) rune { + ru := r.Intn(62) + if ru < 10 { + return rune(ru + 48) + } else if ru < 36 { + return rune(ru + 55) + } + return rune(ru + 61) +} +func randStringEmpty(r randyEmpty) string { + v1 := r.Intn(100) + tmps := make([]rune, v1) + for i := 0; i < v1; i++ { + tmps[i] = randUTF8RuneEmpty(r) + } + return string(tmps) +} +func randUnrecognizedEmpty(r randyEmpty, maxFieldNumber int) (dAtA []byte) { + l := r.Intn(5) + for i := 0; i < l; i++ { + wire := r.Intn(4) + if wire == 3 { + wire = 5 + } + fieldNumber := maxFieldNumber + r.Intn(100) + dAtA = randFieldEmpty(dAtA, r, fieldNumber, wire) + } + return dAtA +} +func randFieldEmpty(dAtA []byte, r randyEmpty, fieldNumber int, wire int) []byte { + key := uint32(fieldNumber)<<3 | uint32(wire) + switch wire { + case 0: + dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) + v2 := r.Int63() + if r.Intn(2) == 0 { + v2 *= -1 + } + dAtA = encodeVarintPopulateEmpty(dAtA, uint64(v2)) + case 1: + dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + case 2: + dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) + ll := r.Intn(100) + dAtA = encodeVarintPopulateEmpty(dAtA, uint64(ll)) + for j := 0; j < ll; j++ { + dAtA = append(dAtA, byte(r.Intn(256))) + } + default: + dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + } + return dAtA +} +func encodeVarintPopulateEmpty(dAtA []byte, v uint64) []byte { + for v >= 1<<7 { + dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) + v >>= 7 + } + dAtA = append(dAtA, uint8(v)) + return dAtA +} +func (m *Empty) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovEmpty(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozEmpty(x uint64) (n int) { + return sovEmpty(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *Empty) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Empty{`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func valueToStringEmpty(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *Empty) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEmpty + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Empty: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipEmpty(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthEmpty + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthEmpty + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipEmpty(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEmpty + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEmpty + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEmpty + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthEmpty + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupEmpty + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthEmpty + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthEmpty = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowEmpty = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupEmpty = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/gogo/protobuf/types/field_mask.pb.go b/vendor/github.com/gogo/protobuf/types/field_mask.pb.go new file mode 100644 index 00000000..7226b57f --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/field_mask.pb.go @@ -0,0 +1,741 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/field_mask.proto + +package types + +import ( + bytes "bytes" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// `FieldMask` represents a set of symbolic field paths, for example: +// +// paths: "f.a" +// paths: "f.b.d" +// +// Here `f` represents a field in some root message, `a` and `b` +// fields in the message found in `f`, and `d` a field found in the +// message in `f.b`. +// +// Field masks are used to specify a subset of fields that should be +// returned by a get operation or modified by an update operation. +// Field masks also have a custom JSON encoding (see below). +// +// # Field Masks in Projections +// +// When used in the context of a projection, a response message or +// sub-message is filtered by the API to only contain those fields as +// specified in the mask. For example, if the mask in the previous +// example is applied to a response message as follows: +// +// f { +// a : 22 +// b { +// d : 1 +// x : 2 +// } +// y : 13 +// } +// z: 8 +// +// The result will not contain specific values for fields x,y and z +// (their value will be set to the default, and omitted in proto text +// output): +// +// +// f { +// a : 22 +// b { +// d : 1 +// } +// } +// +// A repeated field is not allowed except at the last position of a +// paths string. +// +// If a FieldMask object is not present in a get operation, the +// operation applies to all fields (as if a FieldMask of all fields +// had been specified). +// +// Note that a field mask does not necessarily apply to the +// top-level response message. In case of a REST get operation, the +// field mask applies directly to the response, but in case of a REST +// list operation, the mask instead applies to each individual message +// in the returned resource list. In case of a REST custom method, +// other definitions may be used. Where the mask applies will be +// clearly documented together with its declaration in the API. In +// any case, the effect on the returned resource/resources is required +// behavior for APIs. +// +// # Field Masks in Update Operations +// +// A field mask in update operations specifies which fields of the +// targeted resource are going to be updated. The API is required +// to only change the values of the fields as specified in the mask +// and leave the others untouched. If a resource is passed in to +// describe the updated values, the API ignores the values of all +// fields not covered by the mask. +// +// If a repeated field is specified for an update operation, new values will +// be appended to the existing repeated field in the target resource. Note that +// a repeated field is only allowed in the last position of a `paths` string. +// +// If a sub-message is specified in the last position of the field mask for an +// update operation, then new value will be merged into the existing sub-message +// in the target resource. +// +// For example, given the target message: +// +// f { +// b { +// d: 1 +// x: 2 +// } +// c: [1] +// } +// +// And an update message: +// +// f { +// b { +// d: 10 +// } +// c: [2] +// } +// +// then if the field mask is: +// +// paths: ["f.b", "f.c"] +// +// then the result will be: +// +// f { +// b { +// d: 10 +// x: 2 +// } +// c: [1, 2] +// } +// +// An implementation may provide options to override this default behavior for +// repeated and message fields. +// +// In order to reset a field's value to the default, the field must +// be in the mask and set to the default value in the provided resource. +// Hence, in order to reset all fields of a resource, provide a default +// instance of the resource and set all fields in the mask, or do +// not provide a mask as described below. +// +// If a field mask is not present on update, the operation applies to +// all fields (as if a field mask of all fields has been specified). +// Note that in the presence of schema evolution, this may mean that +// fields the client does not know and has therefore not filled into +// the request will be reset to their default. If this is unwanted +// behavior, a specific service may require a client to always specify +// a field mask, producing an error if not. +// +// As with get operations, the location of the resource which +// describes the updated values in the request message depends on the +// operation kind. In any case, the effect of the field mask is +// required to be honored by the API. +// +// ## Considerations for HTTP REST +// +// The HTTP kind of an update operation which uses a field mask must +// be set to PATCH instead of PUT in order to satisfy HTTP semantics +// (PUT must only be used for full updates). +// +// # JSON Encoding of Field Masks +// +// In JSON, a field mask is encoded as a single string where paths are +// separated by a comma. Fields name in each path are converted +// to/from lower-camel naming conventions. +// +// As an example, consider the following message declarations: +// +// message Profile { +// User user = 1; +// Photo photo = 2; +// } +// message User { +// string display_name = 1; +// string address = 2; +// } +// +// In proto a field mask for `Profile` may look as such: +// +// mask { +// paths: "user.display_name" +// paths: "photo" +// } +// +// In JSON, the same mask is represented as below: +// +// { +// mask: "user.displayName,photo" +// } +// +// # Field Masks and Oneof Fields +// +// Field masks treat fields in oneofs just as regular fields. Consider the +// following message: +// +// message SampleMessage { +// oneof test_oneof { +// string name = 4; +// SubMessage sub_message = 9; +// } +// } +// +// The field mask can be: +// +// mask { +// paths: "name" +// } +// +// Or: +// +// mask { +// paths: "sub_message" +// } +// +// Note that oneof type names ("test_oneof" in this case) cannot be used in +// paths. +// +// ## Field Mask Verification +// +// The implementation of any API method which has a FieldMask type field in the +// request should verify the included field paths, and return an +// `INVALID_ARGUMENT` error if any path is duplicated or unmappable. +type FieldMask struct { + // The set of field mask paths. + Paths []string `protobuf:"bytes,1,rep,name=paths,proto3" json:"paths,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldMask) Reset() { *m = FieldMask{} } +func (*FieldMask) ProtoMessage() {} +func (*FieldMask) Descriptor() ([]byte, []int) { + return fileDescriptor_5158202634f0da48, []int{0} +} +func (m *FieldMask) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *FieldMask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_FieldMask.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *FieldMask) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldMask.Merge(m, src) +} +func (m *FieldMask) XXX_Size() int { + return m.Size() +} +func (m *FieldMask) XXX_DiscardUnknown() { + xxx_messageInfo_FieldMask.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldMask proto.InternalMessageInfo + +func (m *FieldMask) GetPaths() []string { + if m != nil { + return m.Paths + } + return nil +} + +func (*FieldMask) XXX_MessageName() string { + return "google.protobuf.FieldMask" +} +func init() { + proto.RegisterType((*FieldMask)(nil), "google.protobuf.FieldMask") +} + +func init() { proto.RegisterFile("google/protobuf/field_mask.proto", fileDescriptor_5158202634f0da48) } + +var fileDescriptor_5158202634f0da48 = []byte{ + // 203 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcb, 0x4c, 0xcd, + 0x49, 0x89, 0xcf, 0x4d, 0x2c, 0xce, 0xd6, 0x03, 0x8b, 0x09, 0xf1, 0x43, 0x54, 0xe8, 0xc1, 0x54, + 0x28, 0x29, 0x72, 0x71, 0xba, 0x81, 0x14, 0xf9, 0x26, 0x16, 0x67, 0x0b, 0x89, 0x70, 0xb1, 0x16, + 0x24, 0x96, 0x64, 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6b, 0x70, 0x06, 0x41, 0x38, 0x4e, 0x1d, 0x8c, + 0x37, 0x1e, 0xca, 0x31, 0x7c, 0x78, 0x28, 0xc7, 0xf8, 0xe3, 0xa1, 0x1c, 0x63, 0xc3, 0x23, 0x39, + 0xc6, 0x15, 0x8f, 0xe4, 0x18, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, + 0x39, 0xc6, 0x17, 0x8f, 0xe4, 0x18, 0x3e, 0x80, 0xc4, 0x1f, 0xcb, 0x31, 0x9e, 0x78, 0x2c, 0xc7, + 0xc8, 0x25, 0x9c, 0x9c, 0x9f, 0xab, 0x87, 0x66, 0x95, 0x13, 0x1f, 0xdc, 0xa2, 0x00, 0x90, 0x50, + 0x00, 0x63, 0x14, 0x6b, 0x49, 0x65, 0x41, 0x6a, 0xf1, 0x0f, 0x46, 0xc6, 0x45, 0x4c, 0xcc, 0xee, + 0x01, 0x4e, 0xab, 0x98, 0xe4, 0xdc, 0x21, 0x7a, 0x02, 0xa0, 0x7a, 0xf4, 0xc2, 0x53, 0x73, 0x72, + 0xbc, 0xf3, 0xf2, 0xcb, 0xf3, 0x42, 0x40, 0x2a, 0x93, 0xd8, 0xc0, 0x86, 0x19, 0x03, 0x02, 0x00, + 0x00, 0xff, 0xff, 0x43, 0xa0, 0x83, 0xd0, 0xe9, 0x00, 0x00, 0x00, +} + +func (this *FieldMask) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*FieldMask) + if !ok { + that2, ok := that.(FieldMask) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if len(this.Paths) != len(that1.Paths) { + if len(this.Paths) < len(that1.Paths) { + return -1 + } + return 1 + } + for i := range this.Paths { + if this.Paths[i] != that1.Paths[i] { + if this.Paths[i] < that1.Paths[i] { + return -1 + } + return 1 + } + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *FieldMask) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*FieldMask) + if !ok { + that2, ok := that.(FieldMask) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if len(this.Paths) != len(that1.Paths) { + return false + } + for i := range this.Paths { + if this.Paths[i] != that1.Paths[i] { + return false + } + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *FieldMask) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.FieldMask{") + s = append(s, "Paths: "+fmt.Sprintf("%#v", this.Paths)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringFieldMask(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *FieldMask) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FieldMask) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *FieldMask) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Paths) > 0 { + for iNdEx := len(m.Paths) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Paths[iNdEx]) + copy(dAtA[i:], m.Paths[iNdEx]) + i = encodeVarintFieldMask(dAtA, i, uint64(len(m.Paths[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintFieldMask(dAtA []byte, offset int, v uint64) int { + offset -= sovFieldMask(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func NewPopulatedFieldMask(r randyFieldMask, easy bool) *FieldMask { + this := &FieldMask{} + v1 := r.Intn(10) + this.Paths = make([]string, v1) + for i := 0; i < v1; i++ { + this.Paths[i] = string(randStringFieldMask(r)) + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedFieldMask(r, 2) + } + return this +} + +type randyFieldMask interface { + Float32() float32 + Float64() float64 + Int63() int64 + Int31() int32 + Uint32() uint32 + Intn(n int) int +} + +func randUTF8RuneFieldMask(r randyFieldMask) rune { + ru := r.Intn(62) + if ru < 10 { + return rune(ru + 48) + } else if ru < 36 { + return rune(ru + 55) + } + return rune(ru + 61) +} +func randStringFieldMask(r randyFieldMask) string { + v2 := r.Intn(100) + tmps := make([]rune, v2) + for i := 0; i < v2; i++ { + tmps[i] = randUTF8RuneFieldMask(r) + } + return string(tmps) +} +func randUnrecognizedFieldMask(r randyFieldMask, maxFieldNumber int) (dAtA []byte) { + l := r.Intn(5) + for i := 0; i < l; i++ { + wire := r.Intn(4) + if wire == 3 { + wire = 5 + } + fieldNumber := maxFieldNumber + r.Intn(100) + dAtA = randFieldFieldMask(dAtA, r, fieldNumber, wire) + } + return dAtA +} +func randFieldFieldMask(dAtA []byte, r randyFieldMask, fieldNumber int, wire int) []byte { + key := uint32(fieldNumber)<<3 | uint32(wire) + switch wire { + case 0: + dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) + v3 := r.Int63() + if r.Intn(2) == 0 { + v3 *= -1 + } + dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(v3)) + case 1: + dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + case 2: + dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) + ll := r.Intn(100) + dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(ll)) + for j := 0; j < ll; j++ { + dAtA = append(dAtA, byte(r.Intn(256))) + } + default: + dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + } + return dAtA +} +func encodeVarintPopulateFieldMask(dAtA []byte, v uint64) []byte { + for v >= 1<<7 { + dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) + v >>= 7 + } + dAtA = append(dAtA, uint8(v)) + return dAtA +} +func (m *FieldMask) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Paths) > 0 { + for _, s := range m.Paths { + l = len(s) + n += 1 + l + sovFieldMask(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovFieldMask(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozFieldMask(x uint64) (n int) { + return sovFieldMask(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *FieldMask) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&FieldMask{`, + `Paths:` + fmt.Sprintf("%v", this.Paths) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func valueToStringFieldMask(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *FieldMask) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFieldMask + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FieldMask: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FieldMask: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Paths", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFieldMask + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthFieldMask + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthFieldMask + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Paths = append(m.Paths, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipFieldMask(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthFieldMask + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthFieldMask + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipFieldMask(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFieldMask + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFieldMask + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFieldMask + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthFieldMask + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupFieldMask + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthFieldMask + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthFieldMask = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowFieldMask = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupFieldMask = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/gogo/protobuf/types/protosize.go b/vendor/github.com/gogo/protobuf/types/protosize.go new file mode 100644 index 00000000..3a2d1b7e --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/protosize.go @@ -0,0 +1,34 @@ +package types + +func (m *Any) ProtoSize() (n int) { return m.Size() } +func (m *Api) ProtoSize() (n int) { return m.Size() } +func (m *Method) ProtoSize() (n int) { return m.Size() } +func (m *Mixin) ProtoSize() (n int) { return m.Size() } +func (m *Duration) ProtoSize() (n int) { return m.Size() } +func (m *Empty) ProtoSize() (n int) { return m.Size() } +func (m *FieldMask) ProtoSize() (n int) { return m.Size() } +func (m *SourceContext) ProtoSize() (n int) { return m.Size() } +func (m *Struct) ProtoSize() (n int) { return m.Size() } +func (m *Value) ProtoSize() (n int) { return m.Size() } +func (m *Value_NullValue) ProtoSize() (n int) { return m.Size() } +func (m *Value_NumberValue) ProtoSize() (n int) { return m.Size() } +func (m *Value_StringValue) ProtoSize() (n int) { return m.Size() } +func (m *Value_BoolValue) ProtoSize() (n int) { return m.Size() } +func (m *Value_StructValue) ProtoSize() (n int) { return m.Size() } +func (m *Value_ListValue) ProtoSize() (n int) { return m.Size() } +func (m *ListValue) ProtoSize() (n int) { return m.Size() } +func (m *Timestamp) ProtoSize() (n int) { return m.Size() } +func (m *Type) ProtoSize() (n int) { return m.Size() } +func (m *Field) ProtoSize() (n int) { return m.Size() } +func (m *Enum) ProtoSize() (n int) { return m.Size() } +func (m *EnumValue) ProtoSize() (n int) { return m.Size() } +func (m *Option) ProtoSize() (n int) { return m.Size() } +func (m *DoubleValue) ProtoSize() (n int) { return m.Size() } +func (m *FloatValue) ProtoSize() (n int) { return m.Size() } +func (m *Int64Value) ProtoSize() (n int) { return m.Size() } +func (m *UInt64Value) ProtoSize() (n int) { return m.Size() } +func (m *Int32Value) ProtoSize() (n int) { return m.Size() } +func (m *UInt32Value) ProtoSize() (n int) { return m.Size() } +func (m *BoolValue) ProtoSize() (n int) { return m.Size() } +func (m *StringValue) ProtoSize() (n int) { return m.Size() } +func (m *BytesValue) ProtoSize() (n int) { return m.Size() } diff --git a/vendor/github.com/gogo/protobuf/types/source_context.pb.go b/vendor/github.com/gogo/protobuf/types/source_context.pb.go new file mode 100644 index 00000000..61045ce1 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/source_context.pb.go @@ -0,0 +1,527 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/source_context.proto + +package types + +import ( + bytes "bytes" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// `SourceContext` represents information about the source of a +// protobuf element, like the file in which it is defined. +type SourceContext struct { + // The path-qualified name of the .proto file that contained the associated + // protobuf element. For example: `"google/protobuf/source_context.proto"`. + FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceContext) Reset() { *m = SourceContext{} } +func (*SourceContext) ProtoMessage() {} +func (*SourceContext) Descriptor() ([]byte, []int) { + return fileDescriptor_b686cdb126d509db, []int{0} +} +func (m *SourceContext) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SourceContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SourceContext.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SourceContext) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceContext.Merge(m, src) +} +func (m *SourceContext) XXX_Size() int { + return m.Size() +} +func (m *SourceContext) XXX_DiscardUnknown() { + xxx_messageInfo_SourceContext.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceContext proto.InternalMessageInfo + +func (m *SourceContext) GetFileName() string { + if m != nil { + return m.FileName + } + return "" +} + +func (*SourceContext) XXX_MessageName() string { + return "google.protobuf.SourceContext" +} +func init() { + proto.RegisterType((*SourceContext)(nil), "google.protobuf.SourceContext") +} + +func init() { + proto.RegisterFile("google/protobuf/source_context.proto", fileDescriptor_b686cdb126d509db) +} + +var fileDescriptor_b686cdb126d509db = []byte{ + // 212 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xce, 0x2f, 0x2d, + 0x4a, 0x4e, 0x8d, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xad, 0x28, 0xd1, 0x03, 0x8b, 0x0b, 0xf1, 0x43, + 0x54, 0xe9, 0xc1, 0x54, 0x29, 0xe9, 0x70, 0xf1, 0x06, 0x83, 0x15, 0x3a, 0x43, 0xd4, 0x09, 0x49, + 0x73, 0x71, 0xa6, 0x65, 0xe6, 0xa4, 0xc6, 0xe7, 0x25, 0xe6, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x6a, + 0x70, 0x06, 0x71, 0x80, 0x04, 0xfc, 0x12, 0x73, 0x53, 0x9d, 0x3a, 0x19, 0x6f, 0x3c, 0x94, 0x63, + 0xf8, 0xf0, 0x50, 0x8e, 0xf1, 0xc7, 0x43, 0x39, 0xc6, 0x86, 0x47, 0x72, 0x8c, 0x2b, 0x1e, 0xc9, + 0x31, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x2f, 0x1e, + 0xc9, 0x31, 0x7c, 0x00, 0x89, 0x3f, 0x96, 0x63, 0x3c, 0xf1, 0x58, 0x8e, 0x91, 0x4b, 0x38, 0x39, + 0x3f, 0x57, 0x0f, 0xcd, 0x56, 0x27, 0x21, 0x14, 0x3b, 0x03, 0x40, 0xc2, 0x01, 0x8c, 0x51, 0xac, + 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, 0x56, 0x31, 0xc9, 0xb9, 0x43, + 0x34, 0x05, 0x40, 0x35, 0xe9, 0x85, 0xa7, 0xe6, 0xe4, 0x78, 0xe7, 0xe5, 0x97, 0xe7, 0x85, 0x80, + 0x94, 0x25, 0xb1, 0x81, 0x4d, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x37, 0x2a, 0xa1, + 0xf9, 0x00, 0x00, 0x00, +} + +func (this *SourceContext) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*SourceContext) + if !ok { + that2, ok := that.(SourceContext) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.FileName != that1.FileName { + if this.FileName < that1.FileName { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *SourceContext) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*SourceContext) + if !ok { + that2, ok := that.(SourceContext) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.FileName != that1.FileName { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *SourceContext) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.SourceContext{") + s = append(s, "FileName: "+fmt.Sprintf("%#v", this.FileName)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringSourceContext(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *SourceContext) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SourceContext) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SourceContext) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.FileName) > 0 { + i -= len(m.FileName) + copy(dAtA[i:], m.FileName) + i = encodeVarintSourceContext(dAtA, i, uint64(len(m.FileName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintSourceContext(dAtA []byte, offset int, v uint64) int { + offset -= sovSourceContext(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func NewPopulatedSourceContext(r randySourceContext, easy bool) *SourceContext { + this := &SourceContext{} + this.FileName = string(randStringSourceContext(r)) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedSourceContext(r, 2) + } + return this +} + +type randySourceContext interface { + Float32() float32 + Float64() float64 + Int63() int64 + Int31() int32 + Uint32() uint32 + Intn(n int) int +} + +func randUTF8RuneSourceContext(r randySourceContext) rune { + ru := r.Intn(62) + if ru < 10 { + return rune(ru + 48) + } else if ru < 36 { + return rune(ru + 55) + } + return rune(ru + 61) +} +func randStringSourceContext(r randySourceContext) string { + v1 := r.Intn(100) + tmps := make([]rune, v1) + for i := 0; i < v1; i++ { + tmps[i] = randUTF8RuneSourceContext(r) + } + return string(tmps) +} +func randUnrecognizedSourceContext(r randySourceContext, maxFieldNumber int) (dAtA []byte) { + l := r.Intn(5) + for i := 0; i < l; i++ { + wire := r.Intn(4) + if wire == 3 { + wire = 5 + } + fieldNumber := maxFieldNumber + r.Intn(100) + dAtA = randFieldSourceContext(dAtA, r, fieldNumber, wire) + } + return dAtA +} +func randFieldSourceContext(dAtA []byte, r randySourceContext, fieldNumber int, wire int) []byte { + key := uint32(fieldNumber)<<3 | uint32(wire) + switch wire { + case 0: + dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key)) + v2 := r.Int63() + if r.Intn(2) == 0 { + v2 *= -1 + } + dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(v2)) + case 1: + dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + case 2: + dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key)) + ll := r.Intn(100) + dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(ll)) + for j := 0; j < ll; j++ { + dAtA = append(dAtA, byte(r.Intn(256))) + } + default: + dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + } + return dAtA +} +func encodeVarintPopulateSourceContext(dAtA []byte, v uint64) []byte { + for v >= 1<<7 { + dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) + v >>= 7 + } + dAtA = append(dAtA, uint8(v)) + return dAtA +} +func (m *SourceContext) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FileName) + if l > 0 { + n += 1 + l + sovSourceContext(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovSourceContext(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozSourceContext(x uint64) (n int) { + return sovSourceContext(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *SourceContext) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SourceContext{`, + `FileName:` + fmt.Sprintf("%v", this.FileName) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func valueToStringSourceContext(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *SourceContext) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSourceContext + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SourceContext: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SourceContext: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FileName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSourceContext + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSourceContext + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSourceContext + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FileName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSourceContext(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSourceContext + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthSourceContext + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipSourceContext(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSourceContext + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSourceContext + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSourceContext + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthSourceContext + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupSourceContext + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthSourceContext + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthSourceContext = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowSourceContext = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupSourceContext = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/gogo/protobuf/types/struct.pb.go b/vendor/github.com/gogo/protobuf/types/struct.pb.go new file mode 100644 index 00000000..cea553ee --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/struct.pb.go @@ -0,0 +1,2280 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/struct.proto + +package types + +import ( + bytes "bytes" + encoding_binary "encoding/binary" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" + io "io" + math "math" + math_bits "math/bits" + reflect "reflect" + strconv "strconv" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// `NullValue` is a singleton enumeration to represent the null value for the +// `Value` type union. +// +// The JSON representation for `NullValue` is JSON `null`. +type NullValue int32 + +const ( + // Null value. + NullValue_NULL_VALUE NullValue = 0 +) + +var NullValue_name = map[int32]string{ + 0: "NULL_VALUE", +} + +var NullValue_value = map[string]int32{ + "NULL_VALUE": 0, +} + +func (NullValue) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{0} +} + +func (NullValue) XXX_WellKnownType() string { return "NullValue" } + +// `Struct` represents a structured data value, consisting of fields +// which map to dynamically typed values. In some languages, `Struct` +// might be supported by a native representation. For example, in +// scripting languages like JS a struct is represented as an +// object. The details of that representation are described together +// with the proto support for the language. +// +// The JSON representation for `Struct` is JSON object. +type Struct struct { + // Unordered map of dynamically typed values. + Fields map[string]*Value `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Struct) Reset() { *m = Struct{} } +func (*Struct) ProtoMessage() {} +func (*Struct) Descriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{0} +} +func (*Struct) XXX_WellKnownType() string { return "Struct" } +func (m *Struct) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Struct) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Struct.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Struct) XXX_Merge(src proto.Message) { + xxx_messageInfo_Struct.Merge(m, src) +} +func (m *Struct) XXX_Size() int { + return m.Size() +} +func (m *Struct) XXX_DiscardUnknown() { + xxx_messageInfo_Struct.DiscardUnknown(m) +} + +var xxx_messageInfo_Struct proto.InternalMessageInfo + +func (m *Struct) GetFields() map[string]*Value { + if m != nil { + return m.Fields + } + return nil +} + +func (*Struct) XXX_MessageName() string { + return "google.protobuf.Struct" +} + +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of that +// variants, absence of any variant indicates an error. +// +// The JSON representation for `Value` is JSON value. +type Value struct { + // The kind of value. + // + // Types that are valid to be assigned to Kind: + // *Value_NullValue + // *Value_NumberValue + // *Value_StringValue + // *Value_BoolValue + // *Value_StructValue + // *Value_ListValue + Kind isValue_Kind `protobuf_oneof:"kind"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Value) Reset() { *m = Value{} } +func (*Value) ProtoMessage() {} +func (*Value) Descriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{1} +} +func (*Value) XXX_WellKnownType() string { return "Value" } +func (m *Value) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Value.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Value.Merge(m, src) +} +func (m *Value) XXX_Size() int { + return m.Size() +} +func (m *Value) XXX_DiscardUnknown() { + xxx_messageInfo_Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Value proto.InternalMessageInfo + +type isValue_Kind interface { + isValue_Kind() + Equal(interface{}) bool + MarshalTo([]byte) (int, error) + Size() int + Compare(interface{}) int +} + +type Value_NullValue struct { + NullValue NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof" json:"null_value,omitempty"` +} +type Value_NumberValue struct { + NumberValue float64 `protobuf:"fixed64,2,opt,name=number_value,json=numberValue,proto3,oneof" json:"number_value,omitempty"` +} +type Value_StringValue struct { + StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,proto3,oneof" json:"string_value,omitempty"` +} +type Value_BoolValue struct { + BoolValue bool `protobuf:"varint,4,opt,name=bool_value,json=boolValue,proto3,oneof" json:"bool_value,omitempty"` +} +type Value_StructValue struct { + StructValue *Struct `protobuf:"bytes,5,opt,name=struct_value,json=structValue,proto3,oneof" json:"struct_value,omitempty"` +} +type Value_ListValue struct { + ListValue *ListValue `protobuf:"bytes,6,opt,name=list_value,json=listValue,proto3,oneof" json:"list_value,omitempty"` +} + +func (*Value_NullValue) isValue_Kind() {} +func (*Value_NumberValue) isValue_Kind() {} +func (*Value_StringValue) isValue_Kind() {} +func (*Value_BoolValue) isValue_Kind() {} +func (*Value_StructValue) isValue_Kind() {} +func (*Value_ListValue) isValue_Kind() {} + +func (m *Value) GetKind() isValue_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (m *Value) GetNullValue() NullValue { + if x, ok := m.GetKind().(*Value_NullValue); ok { + return x.NullValue + } + return NullValue_NULL_VALUE +} + +func (m *Value) GetNumberValue() float64 { + if x, ok := m.GetKind().(*Value_NumberValue); ok { + return x.NumberValue + } + return 0 +} + +func (m *Value) GetStringValue() string { + if x, ok := m.GetKind().(*Value_StringValue); ok { + return x.StringValue + } + return "" +} + +func (m *Value) GetBoolValue() bool { + if x, ok := m.GetKind().(*Value_BoolValue); ok { + return x.BoolValue + } + return false +} + +func (m *Value) GetStructValue() *Struct { + if x, ok := m.GetKind().(*Value_StructValue); ok { + return x.StructValue + } + return nil +} + +func (m *Value) GetListValue() *ListValue { + if x, ok := m.GetKind().(*Value_ListValue); ok { + return x.ListValue + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*Value) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*Value_NullValue)(nil), + (*Value_NumberValue)(nil), + (*Value_StringValue)(nil), + (*Value_BoolValue)(nil), + (*Value_StructValue)(nil), + (*Value_ListValue)(nil), + } +} + +func (*Value) XXX_MessageName() string { + return "google.protobuf.Value" +} + +// `ListValue` is a wrapper around a repeated field of values. +// +// The JSON representation for `ListValue` is JSON array. +type ListValue struct { + // Repeated field of dynamically typed values. + Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListValue) Reset() { *m = ListValue{} } +func (*ListValue) ProtoMessage() {} +func (*ListValue) Descriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{2} +} +func (*ListValue) XXX_WellKnownType() string { return "ListValue" } +func (m *ListValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ListValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ListValue.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ListValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListValue.Merge(m, src) +} +func (m *ListValue) XXX_Size() int { + return m.Size() +} +func (m *ListValue) XXX_DiscardUnknown() { + xxx_messageInfo_ListValue.DiscardUnknown(m) +} + +var xxx_messageInfo_ListValue proto.InternalMessageInfo + +func (m *ListValue) GetValues() []*Value { + if m != nil { + return m.Values + } + return nil +} + +func (*ListValue) XXX_MessageName() string { + return "google.protobuf.ListValue" +} +func init() { + proto.RegisterEnum("google.protobuf.NullValue", NullValue_name, NullValue_value) + proto.RegisterType((*Struct)(nil), "google.protobuf.Struct") + proto.RegisterMapType((map[string]*Value)(nil), "google.protobuf.Struct.FieldsEntry") + proto.RegisterType((*Value)(nil), "google.protobuf.Value") + proto.RegisterType((*ListValue)(nil), "google.protobuf.ListValue") +} + +func init() { proto.RegisterFile("google/protobuf/struct.proto", fileDescriptor_df322afd6c9fb402) } + +var fileDescriptor_df322afd6c9fb402 = []byte{ + // 443 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0xb1, 0x6f, 0xd3, 0x40, + 0x14, 0xc6, 0xfd, 0x9c, 0xc6, 0x22, 0xcf, 0xa8, 0x54, 0x87, 0x04, 0x51, 0x41, 0x47, 0x94, 0x2e, + 0x11, 0x42, 0xae, 0x14, 0x16, 0x44, 0x58, 0x88, 0x54, 0x5a, 0x89, 0xa8, 0x32, 0x86, 0x16, 0x89, + 0x25, 0xc2, 0xae, 0x1b, 0x59, 0xbd, 0xde, 0x55, 0xf6, 0x1d, 0x28, 0x1b, 0x0b, 0xff, 0x03, 0x33, + 0x13, 0x62, 0xe4, 0xaf, 0xe8, 0xc8, 0xc8, 0x48, 0xdc, 0x85, 0xb1, 0x63, 0x47, 0x74, 0x77, 0xb6, + 0x41, 0x8d, 0xb2, 0xf9, 0x7d, 0xf7, 0x7b, 0xdf, 0x7b, 0xdf, 0x33, 0xde, 0x9f, 0x09, 0x31, 0x63, + 0xe9, 0xf6, 0x59, 0x2e, 0xa4, 0x88, 0xd5, 0xf1, 0x76, 0x21, 0x73, 0x95, 0xc8, 0xc0, 0xd4, 0xe4, + 0x96, 0x7d, 0x0d, 0xea, 0xd7, 0xfe, 0x17, 0x40, 0xef, 0xb5, 0x21, 0xc8, 0x08, 0xbd, 0xe3, 0x2c, + 0x65, 0x47, 0x45, 0x17, 0x7a, 0xad, 0x81, 0x3f, 0xdc, 0x0a, 0xae, 0xc1, 0x81, 0x05, 0x83, 0x17, + 0x86, 0xda, 0xe1, 0x32, 0x9f, 0x47, 0x55, 0xcb, 0xe6, 0x2b, 0xf4, 0xff, 0x93, 0xc9, 0x06, 0xb6, + 0x4e, 0xd2, 0x79, 0x17, 0x7a, 0x30, 0xe8, 0x44, 0xfa, 0x93, 0x3c, 0xc2, 0xf6, 0x87, 0xf7, 0x4c, + 0xa5, 0x5d, 0xb7, 0x07, 0x03, 0x7f, 0x78, 0x67, 0xc9, 0xfc, 0x50, 0xbf, 0x46, 0x16, 0x7a, 0xea, + 0x3e, 0x81, 0xfe, 0x0f, 0x17, 0xdb, 0x46, 0x24, 0x23, 0x44, 0xae, 0x18, 0x9b, 0x5a, 0x03, 0x6d, + 0xba, 0x3e, 0xdc, 0x5c, 0x32, 0xd8, 0x57, 0x8c, 0x19, 0x7e, 0xcf, 0x89, 0x3a, 0xbc, 0x2e, 0xc8, + 0x16, 0xde, 0xe4, 0xea, 0x34, 0x4e, 0xf3, 0xe9, 0xbf, 0xf9, 0xb0, 0xe7, 0x44, 0xbe, 0x55, 0x1b, + 0xa8, 0x90, 0x79, 0xc6, 0x67, 0x15, 0xd4, 0xd2, 0x8b, 0x6b, 0xc8, 0xaa, 0x16, 0x7a, 0x80, 0x18, + 0x0b, 0x51, 0xaf, 0xb1, 0xd6, 0x83, 0xc1, 0x0d, 0x3d, 0x4a, 0x6b, 0x16, 0x78, 0x66, 0x5c, 0x54, + 0x22, 0x2b, 0xa4, 0x6d, 0xa2, 0xde, 0x5d, 0x71, 0xc7, 0xca, 0x5e, 0x25, 0xb2, 0x49, 0xc9, 0xb2, + 0xa2, 0xee, 0xf5, 0x4c, 0xef, 0x72, 0xca, 0x49, 0x56, 0xc8, 0x26, 0x25, 0xab, 0x8b, 0xb1, 0x87, + 0x6b, 0x27, 0x19, 0x3f, 0xea, 0x8f, 0xb0, 0xd3, 0x10, 0x24, 0x40, 0xcf, 0x98, 0xd5, 0x7f, 0x74, + 0xd5, 0xd1, 0x2b, 0xea, 0xe1, 0x3d, 0xec, 0x34, 0x47, 0x24, 0xeb, 0x88, 0xfb, 0x07, 0x93, 0xc9, + 0xf4, 0xf0, 0xf9, 0xe4, 0x60, 0x67, 0xc3, 0x19, 0x7f, 0x86, 0x5f, 0x0b, 0xea, 0x5c, 0x2e, 0x28, + 0x5c, 0x2d, 0x28, 0x7c, 0x2a, 0x29, 0x7c, 0x2b, 0x29, 0x9c, 0x97, 0x14, 0x7e, 0x96, 0x14, 0x7e, + 0x97, 0x14, 0xfe, 0x94, 0xd4, 0xb9, 0xd4, 0xfa, 0x05, 0x85, 0xf3, 0x0b, 0x0a, 0x78, 0x3b, 0x11, + 0xa7, 0xd7, 0x47, 0x8e, 0x7d, 0x9b, 0x3e, 0xd4, 0x75, 0x08, 0xef, 0xda, 0x72, 0x7e, 0x96, 0x16, + 0x57, 0x00, 0x5f, 0xdd, 0xd6, 0x6e, 0x38, 0xfe, 0xee, 0xd2, 0x5d, 0xdb, 0x10, 0xd6, 0x3b, 0xbe, + 0x4d, 0x19, 0x7b, 0xc9, 0xc5, 0x47, 0xfe, 0x46, 0x93, 0xb1, 0x67, 0x9c, 0x1e, 0xff, 0x0d, 0x00, + 0x00, 0xff, 0xff, 0x26, 0x30, 0xdb, 0xbe, 0xe9, 0x02, 0x00, 0x00, +} + +func (this *Struct) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Struct) + if !ok { + that2, ok := that.(Struct) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if len(this.Fields) != len(that1.Fields) { + if len(this.Fields) < len(that1.Fields) { + return -1 + } + return 1 + } + for i := range this.Fields { + if c := this.Fields[i].Compare(that1.Fields[i]); c != 0 { + return c + } + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Value) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Value) + if !ok { + that2, ok := that.(Value) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if that1.Kind == nil { + if this.Kind != nil { + return 1 + } + } else if this.Kind == nil { + return -1 + } else { + thisType := -1 + switch this.Kind.(type) { + case *Value_NullValue: + thisType = 0 + case *Value_NumberValue: + thisType = 1 + case *Value_StringValue: + thisType = 2 + case *Value_BoolValue: + thisType = 3 + case *Value_StructValue: + thisType = 4 + case *Value_ListValue: + thisType = 5 + default: + panic(fmt.Sprintf("compare: unexpected type %T in oneof", this.Kind)) + } + that1Type := -1 + switch that1.Kind.(type) { + case *Value_NullValue: + that1Type = 0 + case *Value_NumberValue: + that1Type = 1 + case *Value_StringValue: + that1Type = 2 + case *Value_BoolValue: + that1Type = 3 + case *Value_StructValue: + that1Type = 4 + case *Value_ListValue: + that1Type = 5 + default: + panic(fmt.Sprintf("compare: unexpected type %T in oneof", that1.Kind)) + } + if thisType == that1Type { + if c := this.Kind.Compare(that1.Kind); c != 0 { + return c + } + } else if thisType < that1Type { + return -1 + } else if thisType > that1Type { + return 1 + } + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Value_NullValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Value_NullValue) + if !ok { + that2, ok := that.(Value_NullValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.NullValue != that1.NullValue { + if this.NullValue < that1.NullValue { + return -1 + } + return 1 + } + return 0 +} +func (this *Value_NumberValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Value_NumberValue) + if !ok { + that2, ok := that.(Value_NumberValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.NumberValue != that1.NumberValue { + if this.NumberValue < that1.NumberValue { + return -1 + } + return 1 + } + return 0 +} +func (this *Value_StringValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Value_StringValue) + if !ok { + that2, ok := that.(Value_StringValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.StringValue != that1.StringValue { + if this.StringValue < that1.StringValue { + return -1 + } + return 1 + } + return 0 +} +func (this *Value_BoolValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Value_BoolValue) + if !ok { + that2, ok := that.(Value_BoolValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.BoolValue != that1.BoolValue { + if !this.BoolValue { + return -1 + } + return 1 + } + return 0 +} +func (this *Value_StructValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Value_StructValue) + if !ok { + that2, ok := that.(Value_StructValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if c := this.StructValue.Compare(that1.StructValue); c != 0 { + return c + } + return 0 +} +func (this *Value_ListValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Value_ListValue) + if !ok { + that2, ok := that.(Value_ListValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if c := this.ListValue.Compare(that1.ListValue); c != 0 { + return c + } + return 0 +} +func (this *ListValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*ListValue) + if !ok { + that2, ok := that.(ListValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if len(this.Values) != len(that1.Values) { + if len(this.Values) < len(that1.Values) { + return -1 + } + return 1 + } + for i := range this.Values { + if c := this.Values[i].Compare(that1.Values[i]); c != 0 { + return c + } + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (x NullValue) String() string { + s, ok := NullValue_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (this *Struct) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Struct) + if !ok { + that2, ok := that.(Struct) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if len(this.Fields) != len(that1.Fields) { + return false + } + for i := range this.Fields { + if !this.Fields[i].Equal(that1.Fields[i]) { + return false + } + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Value) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Value) + if !ok { + that2, ok := that.(Value) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if that1.Kind == nil { + if this.Kind != nil { + return false + } + } else if this.Kind == nil { + return false + } else if !this.Kind.Equal(that1.Kind) { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Value_NullValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Value_NullValue) + if !ok { + that2, ok := that.(Value_NullValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.NullValue != that1.NullValue { + return false + } + return true +} +func (this *Value_NumberValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Value_NumberValue) + if !ok { + that2, ok := that.(Value_NumberValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.NumberValue != that1.NumberValue { + return false + } + return true +} +func (this *Value_StringValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Value_StringValue) + if !ok { + that2, ok := that.(Value_StringValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.StringValue != that1.StringValue { + return false + } + return true +} +func (this *Value_BoolValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Value_BoolValue) + if !ok { + that2, ok := that.(Value_BoolValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.BoolValue != that1.BoolValue { + return false + } + return true +} +func (this *Value_StructValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Value_StructValue) + if !ok { + that2, ok := that.(Value_StructValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.StructValue.Equal(that1.StructValue) { + return false + } + return true +} +func (this *Value_ListValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Value_ListValue) + if !ok { + that2, ok := that.(Value_ListValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.ListValue.Equal(that1.ListValue) { + return false + } + return true +} +func (this *ListValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*ListValue) + if !ok { + that2, ok := that.(ListValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if len(this.Values) != len(that1.Values) { + return false + } + for i := range this.Values { + if !this.Values[i].Equal(that1.Values[i]) { + return false + } + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Struct) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.Struct{") + keysForFields := make([]string, 0, len(this.Fields)) + for k := range this.Fields { + keysForFields = append(keysForFields, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForFields) + mapStringForFields := "map[string]*Value{" + for _, k := range keysForFields { + mapStringForFields += fmt.Sprintf("%#v: %#v,", k, this.Fields[k]) + } + mapStringForFields += "}" + if this.Fields != nil { + s = append(s, "Fields: "+mapStringForFields+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Value) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&types.Value{") + if this.Kind != nil { + s = append(s, "Kind: "+fmt.Sprintf("%#v", this.Kind)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Value_NullValue) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&types.Value_NullValue{` + + `NullValue:` + fmt.Sprintf("%#v", this.NullValue) + `}`}, ", ") + return s +} +func (this *Value_NumberValue) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&types.Value_NumberValue{` + + `NumberValue:` + fmt.Sprintf("%#v", this.NumberValue) + `}`}, ", ") + return s +} +func (this *Value_StringValue) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&types.Value_StringValue{` + + `StringValue:` + fmt.Sprintf("%#v", this.StringValue) + `}`}, ", ") + return s +} +func (this *Value_BoolValue) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&types.Value_BoolValue{` + + `BoolValue:` + fmt.Sprintf("%#v", this.BoolValue) + `}`}, ", ") + return s +} +func (this *Value_StructValue) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&types.Value_StructValue{` + + `StructValue:` + fmt.Sprintf("%#v", this.StructValue) + `}`}, ", ") + return s +} +func (this *Value_ListValue) GoString() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&types.Value_ListValue{` + + `ListValue:` + fmt.Sprintf("%#v", this.ListValue) + `}`}, ", ") + return s +} +func (this *ListValue) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.ListValue{") + if this.Values != nil { + s = append(s, "Values: "+fmt.Sprintf("%#v", this.Values)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringStruct(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *Struct) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Struct) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Struct) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Fields) > 0 { + for k := range m.Fields { + v := m.Fields[k] + baseI := i + if v != nil { + { + size, err := v.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStruct(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintStruct(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintStruct(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *Value) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Value) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Value) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Kind != nil { + { + size := m.Kind.Size() + i -= size + if _, err := m.Kind.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *Value_NullValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Value_NullValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + i = encodeVarintStruct(dAtA, i, uint64(m.NullValue)) + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} +func (m *Value_NumberValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Value_NumberValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + i -= 8 + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.NumberValue)))) + i-- + dAtA[i] = 0x11 + return len(dAtA) - i, nil +} +func (m *Value_StringValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Value_StringValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + i -= len(m.StringValue) + copy(dAtA[i:], m.StringValue) + i = encodeVarintStruct(dAtA, i, uint64(len(m.StringValue))) + i-- + dAtA[i] = 0x1a + return len(dAtA) - i, nil +} +func (m *Value_BoolValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Value_BoolValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + i-- + if m.BoolValue { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + return len(dAtA) - i, nil +} +func (m *Value_StructValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Value_StructValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.StructValue != nil { + { + size, err := m.StructValue.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStruct(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + return len(dAtA) - i, nil +} +func (m *Value_ListValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Value_ListValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ListValue != nil { + { + size, err := m.ListValue.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStruct(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + return len(dAtA) - i, nil +} +func (m *ListValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Values) > 0 { + for iNdEx := len(m.Values) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Values[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStruct(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintStruct(dAtA []byte, offset int, v uint64) int { + offset -= sovStruct(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func NewPopulatedStruct(r randyStruct, easy bool) *Struct { + this := &Struct{} + if r.Intn(5) == 0 { + v1 := r.Intn(10) + this.Fields = make(map[string]*Value) + for i := 0; i < v1; i++ { + this.Fields[randStringStruct(r)] = NewPopulatedValue(r, easy) + } + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedStruct(r, 2) + } + return this +} + +func NewPopulatedValue(r randyStruct, easy bool) *Value { + this := &Value{} + oneofNumber_Kind := []int32{1, 2, 3, 4, 5, 6}[r.Intn(6)] + switch oneofNumber_Kind { + case 1: + this.Kind = NewPopulatedValue_NullValue(r, easy) + case 2: + this.Kind = NewPopulatedValue_NumberValue(r, easy) + case 3: + this.Kind = NewPopulatedValue_StringValue(r, easy) + case 4: + this.Kind = NewPopulatedValue_BoolValue(r, easy) + case 5: + this.Kind = NewPopulatedValue_StructValue(r, easy) + case 6: + this.Kind = NewPopulatedValue_ListValue(r, easy) + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedStruct(r, 7) + } + return this +} + +func NewPopulatedValue_NullValue(r randyStruct, easy bool) *Value_NullValue { + this := &Value_NullValue{} + this.NullValue = NullValue([]int32{0}[r.Intn(1)]) + return this +} +func NewPopulatedValue_NumberValue(r randyStruct, easy bool) *Value_NumberValue { + this := &Value_NumberValue{} + this.NumberValue = float64(r.Float64()) + if r.Intn(2) == 0 { + this.NumberValue *= -1 + } + return this +} +func NewPopulatedValue_StringValue(r randyStruct, easy bool) *Value_StringValue { + this := &Value_StringValue{} + this.StringValue = string(randStringStruct(r)) + return this +} +func NewPopulatedValue_BoolValue(r randyStruct, easy bool) *Value_BoolValue { + this := &Value_BoolValue{} + this.BoolValue = bool(bool(r.Intn(2) == 0)) + return this +} +func NewPopulatedValue_StructValue(r randyStruct, easy bool) *Value_StructValue { + this := &Value_StructValue{} + this.StructValue = NewPopulatedStruct(r, easy) + return this +} +func NewPopulatedValue_ListValue(r randyStruct, easy bool) *Value_ListValue { + this := &Value_ListValue{} + this.ListValue = NewPopulatedListValue(r, easy) + return this +} +func NewPopulatedListValue(r randyStruct, easy bool) *ListValue { + this := &ListValue{} + if r.Intn(5) == 0 { + v2 := r.Intn(5) + this.Values = make([]*Value, v2) + for i := 0; i < v2; i++ { + this.Values[i] = NewPopulatedValue(r, easy) + } + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedStruct(r, 2) + } + return this +} + +type randyStruct interface { + Float32() float32 + Float64() float64 + Int63() int64 + Int31() int32 + Uint32() uint32 + Intn(n int) int +} + +func randUTF8RuneStruct(r randyStruct) rune { + ru := r.Intn(62) + if ru < 10 { + return rune(ru + 48) + } else if ru < 36 { + return rune(ru + 55) + } + return rune(ru + 61) +} +func randStringStruct(r randyStruct) string { + v3 := r.Intn(100) + tmps := make([]rune, v3) + for i := 0; i < v3; i++ { + tmps[i] = randUTF8RuneStruct(r) + } + return string(tmps) +} +func randUnrecognizedStruct(r randyStruct, maxFieldNumber int) (dAtA []byte) { + l := r.Intn(5) + for i := 0; i < l; i++ { + wire := r.Intn(4) + if wire == 3 { + wire = 5 + } + fieldNumber := maxFieldNumber + r.Intn(100) + dAtA = randFieldStruct(dAtA, r, fieldNumber, wire) + } + return dAtA +} +func randFieldStruct(dAtA []byte, r randyStruct, fieldNumber int, wire int) []byte { + key := uint32(fieldNumber)<<3 | uint32(wire) + switch wire { + case 0: + dAtA = encodeVarintPopulateStruct(dAtA, uint64(key)) + v4 := r.Int63() + if r.Intn(2) == 0 { + v4 *= -1 + } + dAtA = encodeVarintPopulateStruct(dAtA, uint64(v4)) + case 1: + dAtA = encodeVarintPopulateStruct(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + case 2: + dAtA = encodeVarintPopulateStruct(dAtA, uint64(key)) + ll := r.Intn(100) + dAtA = encodeVarintPopulateStruct(dAtA, uint64(ll)) + for j := 0; j < ll; j++ { + dAtA = append(dAtA, byte(r.Intn(256))) + } + default: + dAtA = encodeVarintPopulateStruct(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + } + return dAtA +} +func encodeVarintPopulateStruct(dAtA []byte, v uint64) []byte { + for v >= 1<<7 { + dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) + v >>= 7 + } + dAtA = append(dAtA, uint8(v)) + return dAtA +} +func (m *Struct) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Fields) > 0 { + for k, v := range m.Fields { + _ = k + _ = v + l = 0 + if v != nil { + l = v.Size() + l += 1 + sovStruct(uint64(l)) + } + mapEntrySize := 1 + len(k) + sovStruct(uint64(len(k))) + l + n += mapEntrySize + 1 + sovStruct(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Value) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Kind != nil { + n += m.Kind.Size() + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Value_NullValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 1 + sovStruct(uint64(m.NullValue)) + return n +} +func (m *Value_NumberValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 9 + return n +} +func (m *Value_StringValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.StringValue) + n += 1 + l + sovStruct(uint64(l)) + return n +} +func (m *Value_BoolValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 2 + return n +} +func (m *Value_StructValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.StructValue != nil { + l = m.StructValue.Size() + n += 1 + l + sovStruct(uint64(l)) + } + return n +} +func (m *Value_ListValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ListValue != nil { + l = m.ListValue.Size() + n += 1 + l + sovStruct(uint64(l)) + } + return n +} +func (m *ListValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Values) > 0 { + for _, e := range m.Values { + l = e.Size() + n += 1 + l + sovStruct(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovStruct(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozStruct(x uint64) (n int) { + return sovStruct(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *Struct) String() string { + if this == nil { + return "nil" + } + keysForFields := make([]string, 0, len(this.Fields)) + for k := range this.Fields { + keysForFields = append(keysForFields, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForFields) + mapStringForFields := "map[string]*Value{" + for _, k := range keysForFields { + mapStringForFields += fmt.Sprintf("%v: %v,", k, this.Fields[k]) + } + mapStringForFields += "}" + s := strings.Join([]string{`&Struct{`, + `Fields:` + mapStringForFields + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *Value) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value{`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *Value_NullValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_NullValue{`, + `NullValue:` + fmt.Sprintf("%v", this.NullValue) + `,`, + `}`, + }, "") + return s +} +func (this *Value_NumberValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_NumberValue{`, + `NumberValue:` + fmt.Sprintf("%v", this.NumberValue) + `,`, + `}`, + }, "") + return s +} +func (this *Value_StringValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_StringValue{`, + `StringValue:` + fmt.Sprintf("%v", this.StringValue) + `,`, + `}`, + }, "") + return s +} +func (this *Value_BoolValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_BoolValue{`, + `BoolValue:` + fmt.Sprintf("%v", this.BoolValue) + `,`, + `}`, + }, "") + return s +} +func (this *Value_StructValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_StructValue{`, + `StructValue:` + strings.Replace(fmt.Sprintf("%v", this.StructValue), "Struct", "Struct", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Value_ListValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_ListValue{`, + `ListValue:` + strings.Replace(fmt.Sprintf("%v", this.ListValue), "ListValue", "ListValue", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ListValue) String() string { + if this == nil { + return "nil" + } + repeatedStringForValues := "[]*Value{" + for _, f := range this.Values { + repeatedStringForValues += strings.Replace(f.String(), "Value", "Value", 1) + "," + } + repeatedStringForValues += "}" + s := strings.Join([]string{`&ListValue{`, + `Values:` + repeatedStringForValues + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func valueToStringStruct(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *Struct) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Struct: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Struct: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fields", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStruct + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStruct + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Fields == nil { + m.Fields = make(map[string]*Value) + } + var mapkey string + var mapvalue *Value + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthStruct + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthStruct + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthStruct + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthStruct + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &Value{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipStruct(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthStruct + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Fields[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStruct(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthStruct + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthStruct + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Value) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Value: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Value: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NullValue", wireType) + } + var v NullValue + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= NullValue(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Kind = &Value_NullValue{v} + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field NumberValue", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Kind = &Value_NumberValue{float64(math.Float64frombits(v))} + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StringValue", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthStruct + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStruct + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = &Value_StringValue{string(dAtA[iNdEx:postIndex])} + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BoolValue", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Kind = &Value_BoolValue{b} + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StructValue", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStruct + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStruct + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Struct{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Kind = &Value_StructValue{v} + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListValue", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStruct + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStruct + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ListValue{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Kind = &Value_ListValue{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStruct(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthStruct + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthStruct + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ListValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStruct + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStruct + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStruct + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Values = append(m.Values, &Value{}) + if err := m.Values[len(m.Values)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStruct(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthStruct + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthStruct + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipStruct(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowStruct + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowStruct + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowStruct + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthStruct + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupStruct + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthStruct + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthStruct = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowStruct = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupStruct = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/gogo/protobuf/types/timestamp.go b/vendor/github.com/gogo/protobuf/types/timestamp.go new file mode 100644 index 00000000..232ada57 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/timestamp.go @@ -0,0 +1,130 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package types + +// This file implements operations on google.protobuf.Timestamp. + +import ( + "errors" + "fmt" + "time" +) + +const ( + // Seconds field of the earliest valid Timestamp. + // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + minValidSeconds = -62135596800 + // Seconds field just after the latest valid Timestamp. + // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + maxValidSeconds = 253402300800 +) + +// validateTimestamp determines whether a Timestamp is valid. +// A valid timestamp represents a time in the range +// [0001-01-01, 10000-01-01) and has a Nanos field +// in the range [0, 1e9). +// +// If the Timestamp is valid, validateTimestamp returns nil. +// Otherwise, it returns an error that describes +// the problem. +// +// Every valid Timestamp can be represented by a time.Time, but the converse is not true. +func validateTimestamp(ts *Timestamp) error { + if ts == nil { + return errors.New("timestamp: nil Timestamp") + } + if ts.Seconds < minValidSeconds { + return fmt.Errorf("timestamp: %#v before 0001-01-01", ts) + } + if ts.Seconds >= maxValidSeconds { + return fmt.Errorf("timestamp: %#v after 10000-01-01", ts) + } + if ts.Nanos < 0 || ts.Nanos >= 1e9 { + return fmt.Errorf("timestamp: %#v: nanos not in range [0, 1e9)", ts) + } + return nil +} + +// TimestampFromProto converts a google.protobuf.Timestamp proto to a time.Time. +// It returns an error if the argument is invalid. +// +// Unlike most Go functions, if Timestamp returns an error, the first return value +// is not the zero time.Time. Instead, it is the value obtained from the +// time.Unix function when passed the contents of the Timestamp, in the UTC +// locale. This may or may not be a meaningful time; many invalid Timestamps +// do map to valid time.Times. +// +// A nil Timestamp returns an error. The first return value in that case is +// undefined. +func TimestampFromProto(ts *Timestamp) (time.Time, error) { + // Don't return the zero value on error, because corresponds to a valid + // timestamp. Instead return whatever time.Unix gives us. + var t time.Time + if ts == nil { + t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp + } else { + t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() + } + return t, validateTimestamp(ts) +} + +// TimestampNow returns a google.protobuf.Timestamp for the current time. +func TimestampNow() *Timestamp { + ts, err := TimestampProto(time.Now()) + if err != nil { + panic("ptypes: time.Now() out of Timestamp range") + } + return ts +} + +// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. +// It returns an error if the resulting Timestamp is invalid. +func TimestampProto(t time.Time) (*Timestamp, error) { + ts := &Timestamp{ + Seconds: t.Unix(), + Nanos: int32(t.Nanosecond()), + } + if err := validateTimestamp(ts); err != nil { + return nil, err + } + return ts, nil +} + +// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid +// Timestamps, it returns an error message in parentheses. +func TimestampString(ts *Timestamp) string { + t, err := TimestampFromProto(ts) + if err != nil { + return fmt.Sprintf("(%v)", err) + } + return t.Format(time.RFC3339Nano) +} diff --git a/vendor/github.com/gogo/protobuf/types/timestamp.pb.go b/vendor/github.com/gogo/protobuf/types/timestamp.pb.go new file mode 100644 index 00000000..b8187526 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/timestamp.pb.go @@ -0,0 +1,542 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/timestamp.proto + +package types + +import ( + bytes "bytes" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// A Timestamp represents a point in time independent of any time zone or local +// calendar, encoded as a count of seconds and fractions of seconds at +// nanosecond resolution. The count is relative to an epoch at UTC midnight on +// January 1, 1970, in the proleptic Gregorian calendar which extends the +// Gregorian calendar backwards to year one. +// +// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap +// second table is needed for interpretation, using a [24-hour linear +// smear](https://developers.google.com/time/smear). +// +// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By +// restricting to that range, we ensure that we can convert to and from [RFC +// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// +// Example 5: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required. A proto3 JSON serializer should always use UTC (as indicated by +// "Z") when printing the Timestamp type and a proto3 JSON parser should be +// able to accept both UTC and other timezones (as indicated by an offset). +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard +// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using +// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with +// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use +// the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D +// ) to obtain a formatter capable of generating timestamps in this format. +// +// +type Timestamp struct { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Timestamp) Reset() { *m = Timestamp{} } +func (*Timestamp) ProtoMessage() {} +func (*Timestamp) Descriptor() ([]byte, []int) { + return fileDescriptor_292007bbfe81227e, []int{0} +} +func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" } +func (m *Timestamp) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Timestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Timestamp.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Timestamp) XXX_Merge(src proto.Message) { + xxx_messageInfo_Timestamp.Merge(m, src) +} +func (m *Timestamp) XXX_Size() int { + return m.Size() +} +func (m *Timestamp) XXX_DiscardUnknown() { + xxx_messageInfo_Timestamp.DiscardUnknown(m) +} + +var xxx_messageInfo_Timestamp proto.InternalMessageInfo + +func (m *Timestamp) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Timestamp) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func (*Timestamp) XXX_MessageName() string { + return "google.protobuf.Timestamp" +} +func init() { + proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp") +} + +func init() { proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_292007bbfe81227e) } + +var fileDescriptor_292007bbfe81227e = []byte{ + // 212 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d, + 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x03, 0x0b, 0x09, 0xf1, 0x43, 0x14, 0xe8, 0xc1, 0x14, 0x28, + 0x59, 0x73, 0x71, 0x86, 0xc0, 0xd4, 0x08, 0x49, 0x70, 0xb1, 0x17, 0xa7, 0x26, 0xe7, 0xe7, 0xa5, + 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0xc1, 0xb8, 0x42, 0x22, 0x5c, 0xac, 0x79, 0x89, + 0x79, 0xf9, 0xc5, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x53, 0x03, 0xe3, 0x8d, + 0x87, 0x72, 0x0c, 0x1f, 0x1e, 0xca, 0x31, 0xae, 0x78, 0x24, 0xc7, 0x78, 0xe2, 0x91, 0x1c, 0xe3, + 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0xbe, 0x78, 0x24, 0xc7, 0xf0, 0xe1, 0x91, 0x1c, + 0xe3, 0x8a, 0xc7, 0x72, 0x8c, 0x27, 0x1e, 0xcb, 0x31, 0x72, 0x09, 0x27, 0xe7, 0xe7, 0xea, 0xa1, + 0x59, 0xee, 0xc4, 0x07, 0xb7, 0x3a, 0x00, 0x24, 0x14, 0xc0, 0x18, 0xc5, 0x5a, 0x52, 0x59, 0x90, + 0x5a, 0xfc, 0x83, 0x91, 0x71, 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, + 0x9e, 0x00, 0xa8, 0x1e, 0xbd, 0xf0, 0xd4, 0x9c, 0x1c, 0xef, 0xbc, 0xfc, 0xf2, 0xbc, 0x10, 0x90, + 0xca, 0x24, 0x36, 0xb0, 0x61, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x23, 0x83, 0xdd, + 0xfa, 0x00, 0x00, 0x00, +} + +func (this *Timestamp) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Timestamp) + if !ok { + that2, ok := that.(Timestamp) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Seconds != that1.Seconds { + if this.Seconds < that1.Seconds { + return -1 + } + return 1 + } + if this.Nanos != that1.Nanos { + if this.Nanos < that1.Nanos { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Timestamp) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Timestamp) + if !ok { + that2, ok := that.(Timestamp) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Seconds != that1.Seconds { + return false + } + if this.Nanos != that1.Nanos { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Timestamp) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&types.Timestamp{") + s = append(s, "Seconds: "+fmt.Sprintf("%#v", this.Seconds)+",\n") + s = append(s, "Nanos: "+fmt.Sprintf("%#v", this.Nanos)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringTimestamp(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *Timestamp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Timestamp) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Timestamp) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Nanos != 0 { + i = encodeVarintTimestamp(dAtA, i, uint64(m.Nanos)) + i-- + dAtA[i] = 0x10 + } + if m.Seconds != 0 { + i = encodeVarintTimestamp(dAtA, i, uint64(m.Seconds)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintTimestamp(dAtA []byte, offset int, v uint64) int { + offset -= sovTimestamp(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Timestamp) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Seconds != 0 { + n += 1 + sovTimestamp(uint64(m.Seconds)) + } + if m.Nanos != 0 { + n += 1 + sovTimestamp(uint64(m.Nanos)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovTimestamp(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTimestamp(x uint64) (n int) { + return sovTimestamp(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Timestamp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimestamp + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Timestamp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Timestamp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType) + } + m.Seconds = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimestamp + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Seconds |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType) + } + m.Nanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimestamp + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nanos |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTimestamp(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTimestamp + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTimestamp + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTimestamp(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTimestamp + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTimestamp + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTimestamp + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTimestamp + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTimestamp + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTimestamp + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTimestamp = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTimestamp = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTimestamp = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/gogo/protobuf/types/timestamp_gogo.go b/vendor/github.com/gogo/protobuf/types/timestamp_gogo.go new file mode 100644 index 00000000..e03fa131 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/timestamp_gogo.go @@ -0,0 +1,94 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2016, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package types + +import ( + "time" +) + +func NewPopulatedTimestamp(r interface { + Int63() int64 +}, easy bool) *Timestamp { + this := &Timestamp{} + ns := int64(r.Int63()) + this.Seconds = ns / 1e9 + this.Nanos = int32(ns % 1e9) + return this +} + +func (ts *Timestamp) String() string { + return TimestampString(ts) +} + +func NewPopulatedStdTime(r interface { + Int63() int64 +}, easy bool) *time.Time { + timestamp := NewPopulatedTimestamp(r, easy) + t, err := TimestampFromProto(timestamp) + if err != nil { + return nil + } + return &t +} + +func SizeOfStdTime(t time.Time) int { + ts, err := TimestampProto(t) + if err != nil { + return 0 + } + return ts.Size() +} + +func StdTimeMarshal(t time.Time) ([]byte, error) { + size := SizeOfStdTime(t) + buf := make([]byte, size) + _, err := StdTimeMarshalTo(t, buf) + return buf, err +} + +func StdTimeMarshalTo(t time.Time, data []byte) (int, error) { + ts, err := TimestampProto(t) + if err != nil { + return 0, err + } + return ts.MarshalTo(data) +} + +func StdTimeUnmarshal(t *time.Time, data []byte) error { + ts := &Timestamp{} + if err := ts.Unmarshal(data); err != nil { + return err + } + tt, err := TimestampFromProto(ts) + if err != nil { + return err + } + *t = tt + return nil +} diff --git a/vendor/github.com/gogo/protobuf/types/type.pb.go b/vendor/github.com/gogo/protobuf/types/type.pb.go new file mode 100644 index 00000000..13b7ec02 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/type.pb.go @@ -0,0 +1,3370 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/type.proto + +package types + +import ( + bytes "bytes" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" + reflect "reflect" + strconv "strconv" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// The syntax in which a protocol buffer element is defined. +type Syntax int32 + +const ( + // Syntax `proto2`. + Syntax_SYNTAX_PROTO2 Syntax = 0 + // Syntax `proto3`. + Syntax_SYNTAX_PROTO3 Syntax = 1 +) + +var Syntax_name = map[int32]string{ + 0: "SYNTAX_PROTO2", + 1: "SYNTAX_PROTO3", +} + +var Syntax_value = map[string]int32{ + "SYNTAX_PROTO2": 0, + "SYNTAX_PROTO3": 1, +} + +func (Syntax) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{0} +} + +// Basic field types. +type Field_Kind int32 + +const ( + // Field type unknown. + Field_TYPE_UNKNOWN Field_Kind = 0 + // Field type double. + Field_TYPE_DOUBLE Field_Kind = 1 + // Field type float. + Field_TYPE_FLOAT Field_Kind = 2 + // Field type int64. + Field_TYPE_INT64 Field_Kind = 3 + // Field type uint64. + Field_TYPE_UINT64 Field_Kind = 4 + // Field type int32. + Field_TYPE_INT32 Field_Kind = 5 + // Field type fixed64. + Field_TYPE_FIXED64 Field_Kind = 6 + // Field type fixed32. + Field_TYPE_FIXED32 Field_Kind = 7 + // Field type bool. + Field_TYPE_BOOL Field_Kind = 8 + // Field type string. + Field_TYPE_STRING Field_Kind = 9 + // Field type group. Proto2 syntax only, and deprecated. + Field_TYPE_GROUP Field_Kind = 10 + // Field type message. + Field_TYPE_MESSAGE Field_Kind = 11 + // Field type bytes. + Field_TYPE_BYTES Field_Kind = 12 + // Field type uint32. + Field_TYPE_UINT32 Field_Kind = 13 + // Field type enum. + Field_TYPE_ENUM Field_Kind = 14 + // Field type sfixed32. + Field_TYPE_SFIXED32 Field_Kind = 15 + // Field type sfixed64. + Field_TYPE_SFIXED64 Field_Kind = 16 + // Field type sint32. + Field_TYPE_SINT32 Field_Kind = 17 + // Field type sint64. + Field_TYPE_SINT64 Field_Kind = 18 +) + +var Field_Kind_name = map[int32]string{ + 0: "TYPE_UNKNOWN", + 1: "TYPE_DOUBLE", + 2: "TYPE_FLOAT", + 3: "TYPE_INT64", + 4: "TYPE_UINT64", + 5: "TYPE_INT32", + 6: "TYPE_FIXED64", + 7: "TYPE_FIXED32", + 8: "TYPE_BOOL", + 9: "TYPE_STRING", + 10: "TYPE_GROUP", + 11: "TYPE_MESSAGE", + 12: "TYPE_BYTES", + 13: "TYPE_UINT32", + 14: "TYPE_ENUM", + 15: "TYPE_SFIXED32", + 16: "TYPE_SFIXED64", + 17: "TYPE_SINT32", + 18: "TYPE_SINT64", +} + +var Field_Kind_value = map[string]int32{ + "TYPE_UNKNOWN": 0, + "TYPE_DOUBLE": 1, + "TYPE_FLOAT": 2, + "TYPE_INT64": 3, + "TYPE_UINT64": 4, + "TYPE_INT32": 5, + "TYPE_FIXED64": 6, + "TYPE_FIXED32": 7, + "TYPE_BOOL": 8, + "TYPE_STRING": 9, + "TYPE_GROUP": 10, + "TYPE_MESSAGE": 11, + "TYPE_BYTES": 12, + "TYPE_UINT32": 13, + "TYPE_ENUM": 14, + "TYPE_SFIXED32": 15, + "TYPE_SFIXED64": 16, + "TYPE_SINT32": 17, + "TYPE_SINT64": 18, +} + +func (Field_Kind) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{1, 0} +} + +// Whether a field is optional, required, or repeated. +type Field_Cardinality int32 + +const ( + // For fields with unknown cardinality. + Field_CARDINALITY_UNKNOWN Field_Cardinality = 0 + // For optional fields. + Field_CARDINALITY_OPTIONAL Field_Cardinality = 1 + // For required fields. Proto2 syntax only. + Field_CARDINALITY_REQUIRED Field_Cardinality = 2 + // For repeated fields. + Field_CARDINALITY_REPEATED Field_Cardinality = 3 +) + +var Field_Cardinality_name = map[int32]string{ + 0: "CARDINALITY_UNKNOWN", + 1: "CARDINALITY_OPTIONAL", + 2: "CARDINALITY_REQUIRED", + 3: "CARDINALITY_REPEATED", +} + +var Field_Cardinality_value = map[string]int32{ + "CARDINALITY_UNKNOWN": 0, + "CARDINALITY_OPTIONAL": 1, + "CARDINALITY_REQUIRED": 2, + "CARDINALITY_REPEATED": 3, +} + +func (Field_Cardinality) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{1, 1} +} + +// A protocol buffer message type. +type Type struct { + // The fully qualified message name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The list of fields. + Fields []*Field `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` + // The list of types appearing in `oneof` definitions in this type. + Oneofs []string `protobuf:"bytes,3,rep,name=oneofs,proto3" json:"oneofs,omitempty"` + // The protocol buffer options. + Options []*Option `protobuf:"bytes,4,rep,name=options,proto3" json:"options,omitempty"` + // The source context. + SourceContext *SourceContext `protobuf:"bytes,5,opt,name=source_context,json=sourceContext,proto3" json:"source_context,omitempty"` + // The source syntax. + Syntax Syntax `protobuf:"varint,6,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Type) Reset() { *m = Type{} } +func (*Type) ProtoMessage() {} +func (*Type) Descriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{0} +} +func (m *Type) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Type) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Type.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Type) XXX_Merge(src proto.Message) { + xxx_messageInfo_Type.Merge(m, src) +} +func (m *Type) XXX_Size() int { + return m.Size() +} +func (m *Type) XXX_DiscardUnknown() { + xxx_messageInfo_Type.DiscardUnknown(m) +} + +var xxx_messageInfo_Type proto.InternalMessageInfo + +func (m *Type) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Type) GetFields() []*Field { + if m != nil { + return m.Fields + } + return nil +} + +func (m *Type) GetOneofs() []string { + if m != nil { + return m.Oneofs + } + return nil +} + +func (m *Type) GetOptions() []*Option { + if m != nil { + return m.Options + } + return nil +} + +func (m *Type) GetSourceContext() *SourceContext { + if m != nil { + return m.SourceContext + } + return nil +} + +func (m *Type) GetSyntax() Syntax { + if m != nil { + return m.Syntax + } + return Syntax_SYNTAX_PROTO2 +} + +func (*Type) XXX_MessageName() string { + return "google.protobuf.Type" +} + +// A single field of a message type. +type Field struct { + // The field type. + Kind Field_Kind `protobuf:"varint,1,opt,name=kind,proto3,enum=google.protobuf.Field_Kind" json:"kind,omitempty"` + // The field cardinality. + Cardinality Field_Cardinality `protobuf:"varint,2,opt,name=cardinality,proto3,enum=google.protobuf.Field_Cardinality" json:"cardinality,omitempty"` + // The field number. + Number int32 `protobuf:"varint,3,opt,name=number,proto3" json:"number,omitempty"` + // The field name. + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // The field type URL, without the scheme, for message or enumeration + // types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`. + TypeUrl string `protobuf:"bytes,6,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` + // The index of the field type in `Type.oneofs`, for message or enumeration + // types. The first type has index 1; zero means the type is not in the list. + OneofIndex int32 `protobuf:"varint,7,opt,name=oneof_index,json=oneofIndex,proto3" json:"oneof_index,omitempty"` + // Whether to use alternative packed wire representation. + Packed bool `protobuf:"varint,8,opt,name=packed,proto3" json:"packed,omitempty"` + // The protocol buffer options. + Options []*Option `protobuf:"bytes,9,rep,name=options,proto3" json:"options,omitempty"` + // The field JSON name. + JsonName string `protobuf:"bytes,10,opt,name=json_name,json=jsonName,proto3" json:"json_name,omitempty"` + // The string value of the default value of this field. Proto2 syntax only. + DefaultValue string `protobuf:"bytes,11,opt,name=default_value,json=defaultValue,proto3" json:"default_value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Field) Reset() { *m = Field{} } +func (*Field) ProtoMessage() {} +func (*Field) Descriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{1} +} +func (m *Field) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Field) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Field.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Field) XXX_Merge(src proto.Message) { + xxx_messageInfo_Field.Merge(m, src) +} +func (m *Field) XXX_Size() int { + return m.Size() +} +func (m *Field) XXX_DiscardUnknown() { + xxx_messageInfo_Field.DiscardUnknown(m) +} + +var xxx_messageInfo_Field proto.InternalMessageInfo + +func (m *Field) GetKind() Field_Kind { + if m != nil { + return m.Kind + } + return Field_TYPE_UNKNOWN +} + +func (m *Field) GetCardinality() Field_Cardinality { + if m != nil { + return m.Cardinality + } + return Field_CARDINALITY_UNKNOWN +} + +func (m *Field) GetNumber() int32 { + if m != nil { + return m.Number + } + return 0 +} + +func (m *Field) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Field) GetTypeUrl() string { + if m != nil { + return m.TypeUrl + } + return "" +} + +func (m *Field) GetOneofIndex() int32 { + if m != nil { + return m.OneofIndex + } + return 0 +} + +func (m *Field) GetPacked() bool { + if m != nil { + return m.Packed + } + return false +} + +func (m *Field) GetOptions() []*Option { + if m != nil { + return m.Options + } + return nil +} + +func (m *Field) GetJsonName() string { + if m != nil { + return m.JsonName + } + return "" +} + +func (m *Field) GetDefaultValue() string { + if m != nil { + return m.DefaultValue + } + return "" +} + +func (*Field) XXX_MessageName() string { + return "google.protobuf.Field" +} + +// Enum type definition. +type Enum struct { + // Enum type name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Enum value definitions. + Enumvalue []*EnumValue `protobuf:"bytes,2,rep,name=enumvalue,proto3" json:"enumvalue,omitempty"` + // Protocol buffer options. + Options []*Option `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` + // The source context. + SourceContext *SourceContext `protobuf:"bytes,4,opt,name=source_context,json=sourceContext,proto3" json:"source_context,omitempty"` + // The source syntax. + Syntax Syntax `protobuf:"varint,5,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Enum) Reset() { *m = Enum{} } +func (*Enum) ProtoMessage() {} +func (*Enum) Descriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{2} +} +func (m *Enum) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Enum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Enum.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Enum) XXX_Merge(src proto.Message) { + xxx_messageInfo_Enum.Merge(m, src) +} +func (m *Enum) XXX_Size() int { + return m.Size() +} +func (m *Enum) XXX_DiscardUnknown() { + xxx_messageInfo_Enum.DiscardUnknown(m) +} + +var xxx_messageInfo_Enum proto.InternalMessageInfo + +func (m *Enum) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Enum) GetEnumvalue() []*EnumValue { + if m != nil { + return m.Enumvalue + } + return nil +} + +func (m *Enum) GetOptions() []*Option { + if m != nil { + return m.Options + } + return nil +} + +func (m *Enum) GetSourceContext() *SourceContext { + if m != nil { + return m.SourceContext + } + return nil +} + +func (m *Enum) GetSyntax() Syntax { + if m != nil { + return m.Syntax + } + return Syntax_SYNTAX_PROTO2 +} + +func (*Enum) XXX_MessageName() string { + return "google.protobuf.Enum" +} + +// Enum value definition. +type EnumValue struct { + // Enum value name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Enum value number. + Number int32 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"` + // Protocol buffer options. + Options []*Option `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValue) Reset() { *m = EnumValue{} } +func (*EnumValue) ProtoMessage() {} +func (*EnumValue) Descriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{3} +} +func (m *EnumValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EnumValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EnumValue.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *EnumValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValue.Merge(m, src) +} +func (m *EnumValue) XXX_Size() int { + return m.Size() +} +func (m *EnumValue) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValue.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValue proto.InternalMessageInfo + +func (m *EnumValue) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *EnumValue) GetNumber() int32 { + if m != nil { + return m.Number + } + return 0 +} + +func (m *EnumValue) GetOptions() []*Option { + if m != nil { + return m.Options + } + return nil +} + +func (*EnumValue) XXX_MessageName() string { + return "google.protobuf.EnumValue" +} + +// A protocol buffer option, which can be attached to a message, field, +// enumeration, etc. +type Option struct { + // The option's name. For protobuf built-in options (options defined in + // descriptor.proto), this is the short name. For example, `"map_entry"`. + // For custom options, it should be the fully-qualified name. For example, + // `"google.api.http"`. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The option's value packed in an Any message. If the value is a primitive, + // the corresponding wrapper type defined in google/protobuf/wrappers.proto + // should be used. If the value is an enum, it should be stored as an int32 + // value using the google.protobuf.Int32Value type. + Value *Any `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Option) Reset() { *m = Option{} } +func (*Option) ProtoMessage() {} +func (*Option) Descriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{4} +} +func (m *Option) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Option) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Option.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Option) XXX_Merge(src proto.Message) { + xxx_messageInfo_Option.Merge(m, src) +} +func (m *Option) XXX_Size() int { + return m.Size() +} +func (m *Option) XXX_DiscardUnknown() { + xxx_messageInfo_Option.DiscardUnknown(m) +} + +var xxx_messageInfo_Option proto.InternalMessageInfo + +func (m *Option) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Option) GetValue() *Any { + if m != nil { + return m.Value + } + return nil +} + +func (*Option) XXX_MessageName() string { + return "google.protobuf.Option" +} +func init() { + proto.RegisterEnum("google.protobuf.Syntax", Syntax_name, Syntax_value) + proto.RegisterEnum("google.protobuf.Field_Kind", Field_Kind_name, Field_Kind_value) + proto.RegisterEnum("google.protobuf.Field_Cardinality", Field_Cardinality_name, Field_Cardinality_value) + proto.RegisterType((*Type)(nil), "google.protobuf.Type") + proto.RegisterType((*Field)(nil), "google.protobuf.Field") + proto.RegisterType((*Enum)(nil), "google.protobuf.Enum") + proto.RegisterType((*EnumValue)(nil), "google.protobuf.EnumValue") + proto.RegisterType((*Option)(nil), "google.protobuf.Option") +} + +func init() { proto.RegisterFile("google/protobuf/type.proto", fileDescriptor_dd271cc1e348c538) } + +var fileDescriptor_dd271cc1e348c538 = []byte{ + // 840 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcf, 0x73, 0xda, 0x46, + 0x14, 0xf6, 0x0a, 0x21, 0xa3, 0x87, 0xc1, 0x9b, 0x4d, 0x26, 0x51, 0x9c, 0x19, 0x95, 0xa1, 0x3d, + 0x30, 0x39, 0xe0, 0x29, 0x78, 0x3c, 0xbd, 0x82, 0x91, 0x29, 0x63, 0x22, 0xa9, 0x8b, 0x68, 0xe2, + 0x5e, 0x18, 0x0c, 0x72, 0x86, 0x44, 0xac, 0x18, 0x24, 0x5a, 0x73, 0xeb, 0x4c, 0xcf, 0xfd, 0x27, + 0x7a, 0xea, 0xf4, 0xdc, 0x3f, 0xc2, 0xc7, 0x1e, 0x7b, 0xac, 0xc9, 0xa5, 0xc7, 0x1c, 0x73, 0x6b, + 0x67, 0x57, 0x20, 0x8b, 0x1f, 0x9d, 0x49, 0xdb, 0x1b, 0xef, 0xfb, 0xbe, 0xf7, 0x73, 0x9f, 0x1e, + 0x70, 0xf4, 0xda, 0xf7, 0x5f, 0x7b, 0xee, 0xf1, 0x64, 0xea, 0x87, 0xfe, 0xd5, 0xec, 0xfa, 0x38, + 0x9c, 0x4f, 0xdc, 0xb2, 0xb0, 0xc8, 0x61, 0xc4, 0x95, 0x57, 0xdc, 0xd1, 0xd3, 0x4d, 0x71, 0x9f, + 0xcd, 0x23, 0xf6, 0xe8, 0xb3, 0x4d, 0x2a, 0xf0, 0x67, 0xd3, 0x81, 0xdb, 0x1b, 0xf8, 0x2c, 0x74, + 0x6f, 0xc2, 0x48, 0x55, 0xfc, 0x51, 0x02, 0xd9, 0x99, 0x4f, 0x5c, 0x42, 0x40, 0x66, 0xfd, 0xb1, + 0xab, 0xa1, 0x02, 0x2a, 0xa9, 0x54, 0xfc, 0x26, 0x65, 0x50, 0xae, 0x47, 0xae, 0x37, 0x0c, 0x34, + 0xa9, 0x90, 0x2a, 0x65, 0x2b, 0x8f, 0xcb, 0x1b, 0xf9, 0xcb, 0xe7, 0x9c, 0xa6, 0x4b, 0x15, 0x79, + 0x0c, 0x8a, 0xcf, 0x5c, 0xff, 0x3a, 0xd0, 0x52, 0x85, 0x54, 0x49, 0xa5, 0x4b, 0x8b, 0x7c, 0x0e, + 0xfb, 0xfe, 0x24, 0x1c, 0xf9, 0x2c, 0xd0, 0x64, 0x11, 0xe8, 0xc9, 0x56, 0x20, 0x4b, 0xf0, 0x74, + 0xa5, 0x23, 0x06, 0xe4, 0xd7, 0xeb, 0xd5, 0xd2, 0x05, 0x54, 0xca, 0x56, 0xf4, 0x2d, 0xcf, 0x8e, + 0x90, 0x9d, 0x45, 0x2a, 0x9a, 0x0b, 0x92, 0x26, 0x39, 0x06, 0x25, 0x98, 0xb3, 0xb0, 0x7f, 0xa3, + 0x29, 0x05, 0x54, 0xca, 0xef, 0x48, 0xdc, 0x11, 0x34, 0x5d, 0xca, 0x8a, 0xbf, 0x2a, 0x90, 0x16, + 0x4d, 0x91, 0x63, 0x90, 0xdf, 0x8e, 0xd8, 0x50, 0x0c, 0x24, 0x5f, 0x79, 0xb6, 0xbb, 0xf5, 0xf2, + 0xc5, 0x88, 0x0d, 0xa9, 0x10, 0x92, 0x06, 0x64, 0x07, 0xfd, 0xe9, 0x70, 0xc4, 0xfa, 0xde, 0x28, + 0x9c, 0x6b, 0x92, 0xf0, 0x2b, 0xfe, 0x83, 0xdf, 0xd9, 0xbd, 0x92, 0x26, 0xdd, 0xf8, 0x0c, 0xd9, + 0x6c, 0x7c, 0xe5, 0x4e, 0xb5, 0x54, 0x01, 0x95, 0xd2, 0x74, 0x69, 0xc5, 0xef, 0x23, 0x27, 0xde, + 0xe7, 0x29, 0x64, 0xf8, 0x72, 0xf4, 0x66, 0x53, 0x4f, 0xf4, 0xa7, 0xd2, 0x7d, 0x6e, 0x77, 0xa7, + 0x1e, 0xf9, 0x04, 0xb2, 0x62, 0xf8, 0xbd, 0x11, 0x1b, 0xba, 0x37, 0xda, 0xbe, 0x88, 0x05, 0x02, + 0x6a, 0x71, 0x84, 0xe7, 0x99, 0xf4, 0x07, 0x6f, 0xdd, 0xa1, 0x96, 0x29, 0xa0, 0x52, 0x86, 0x2e, + 0xad, 0xe4, 0x5b, 0xa9, 0x1f, 0xf9, 0x56, 0xcf, 0x40, 0x7d, 0x13, 0xf8, 0xac, 0x27, 0xea, 0x03, + 0x51, 0x47, 0x86, 0x03, 0x26, 0xaf, 0xf1, 0x53, 0xc8, 0x0d, 0xdd, 0xeb, 0xfe, 0xcc, 0x0b, 0x7b, + 0xdf, 0xf6, 0xbd, 0x99, 0xab, 0x65, 0x85, 0xe0, 0x60, 0x09, 0x7e, 0xcd, 0xb1, 0xe2, 0xad, 0x04, + 0x32, 0x9f, 0x24, 0xc1, 0x70, 0xe0, 0x5c, 0xda, 0x46, 0xaf, 0x6b, 0x5e, 0x98, 0xd6, 0x4b, 0x13, + 0xef, 0x91, 0x43, 0xc8, 0x0a, 0xa4, 0x61, 0x75, 0xeb, 0x6d, 0x03, 0x23, 0x92, 0x07, 0x10, 0xc0, + 0x79, 0xdb, 0xaa, 0x39, 0x58, 0x8a, 0xed, 0x96, 0xe9, 0x9c, 0x9e, 0xe0, 0x54, 0xec, 0xd0, 0x8d, + 0x00, 0x39, 0x29, 0xa8, 0x56, 0x70, 0x3a, 0xce, 0x71, 0xde, 0x7a, 0x65, 0x34, 0x4e, 0x4f, 0xb0, + 0xb2, 0x8e, 0x54, 0x2b, 0x78, 0x9f, 0xe4, 0x40, 0x15, 0x48, 0xdd, 0xb2, 0xda, 0x38, 0x13, 0xc7, + 0xec, 0x38, 0xb4, 0x65, 0x36, 0xb1, 0x1a, 0xc7, 0x6c, 0x52, 0xab, 0x6b, 0x63, 0x88, 0x23, 0xbc, + 0x30, 0x3a, 0x9d, 0x5a, 0xd3, 0xc0, 0xd9, 0x58, 0x51, 0xbf, 0x74, 0x8c, 0x0e, 0x3e, 0x58, 0x2b, + 0xab, 0x5a, 0xc1, 0xb9, 0x38, 0x85, 0x61, 0x76, 0x5f, 0xe0, 0x3c, 0x79, 0x00, 0xb9, 0x28, 0xc5, + 0xaa, 0x88, 0xc3, 0x0d, 0xe8, 0xf4, 0x04, 0xe3, 0xfb, 0x42, 0xa2, 0x28, 0x0f, 0xd6, 0x80, 0xd3, + 0x13, 0x4c, 0x8a, 0x21, 0x64, 0x13, 0xbb, 0x45, 0x9e, 0xc0, 0xc3, 0xb3, 0x1a, 0x6d, 0xb4, 0xcc, + 0x5a, 0xbb, 0xe5, 0x5c, 0x26, 0xe6, 0xaa, 0xc1, 0xa3, 0x24, 0x61, 0xd9, 0x4e, 0xcb, 0x32, 0x6b, + 0x6d, 0x8c, 0x36, 0x19, 0x6a, 0x7c, 0xd5, 0x6d, 0x51, 0xa3, 0x81, 0xa5, 0x6d, 0xc6, 0x36, 0x6a, + 0x8e, 0xd1, 0xc0, 0xa9, 0xe2, 0x5f, 0x08, 0x64, 0x83, 0xcd, 0xc6, 0x3b, 0xcf, 0xc8, 0x17, 0xa0, + 0xba, 0x6c, 0x36, 0x8e, 0x9e, 0x3f, 0xba, 0x24, 0x47, 0x5b, 0x4b, 0xc5, 0xbd, 0xc5, 0x32, 0xd0, + 0x7b, 0x71, 0x72, 0x19, 0x53, 0xff, 0xf9, 0x70, 0xc8, 0xff, 0xef, 0x70, 0xa4, 0x3f, 0xee, 0x70, + 0xbc, 0x01, 0x35, 0x6e, 0x61, 0xe7, 0x14, 0xee, 0x3f, 0x6c, 0x69, 0xed, 0xc3, 0xfe, 0xf7, 0x3d, + 0x16, 0xbf, 0x04, 0x25, 0x82, 0x76, 0x26, 0x7a, 0x0e, 0xe9, 0xd5, 0xa8, 0x79, 0xe3, 0x8f, 0xb6, + 0xc2, 0xd5, 0xd8, 0x9c, 0x46, 0x92, 0xe7, 0x65, 0x50, 0xa2, 0x3e, 0xf8, 0xb2, 0x75, 0x2e, 0x4d, + 0xa7, 0xf6, 0xaa, 0x67, 0x53, 0xcb, 0xb1, 0x2a, 0x78, 0x6f, 0x13, 0xaa, 0x62, 0x54, 0xff, 0x01, + 0xfd, 0x7e, 0xa7, 0xef, 0xbd, 0xbf, 0xd3, 0xd1, 0x87, 0x3b, 0x1d, 0x7d, 0xbf, 0xd0, 0xd1, 0xcf, + 0x0b, 0x1d, 0xdd, 0x2e, 0x74, 0xf4, 0xdb, 0x42, 0x47, 0x7f, 0x2c, 0x74, 0xf4, 0xe7, 0x42, 0xdf, + 0x7b, 0xcf, 0xf1, 0x77, 0x3a, 0xba, 0x7d, 0xa7, 0x23, 0x78, 0x38, 0xf0, 0xc7, 0x9b, 0x25, 0xd4, + 0x55, 0xfe, 0x9f, 0x63, 0x73, 0xcb, 0x46, 0xdf, 0xa4, 0xf9, 0xd1, 0x0a, 0x3e, 0x20, 0xf4, 0x93, + 0x94, 0x6a, 0xda, 0xf5, 0x5f, 0x24, 0xbd, 0x19, 0xc9, 0xed, 0x55, 0xc5, 0x2f, 0x5d, 0xcf, 0xbb, + 0x60, 0xfe, 0x77, 0x8c, 0xbb, 0x05, 0x57, 0x8a, 0x88, 0x53, 0xfd, 0x3b, 0x00, 0x00, 0xff, 0xff, + 0xbc, 0x2a, 0x5e, 0x82, 0x2b, 0x07, 0x00, 0x00, +} + +func (this *Type) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Type) + if !ok { + that2, ok := that.(Type) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Name != that1.Name { + if this.Name < that1.Name { + return -1 + } + return 1 + } + if len(this.Fields) != len(that1.Fields) { + if len(this.Fields) < len(that1.Fields) { + return -1 + } + return 1 + } + for i := range this.Fields { + if c := this.Fields[i].Compare(that1.Fields[i]); c != 0 { + return c + } + } + if len(this.Oneofs) != len(that1.Oneofs) { + if len(this.Oneofs) < len(that1.Oneofs) { + return -1 + } + return 1 + } + for i := range this.Oneofs { + if this.Oneofs[i] != that1.Oneofs[i] { + if this.Oneofs[i] < that1.Oneofs[i] { + return -1 + } + return 1 + } + } + if len(this.Options) != len(that1.Options) { + if len(this.Options) < len(that1.Options) { + return -1 + } + return 1 + } + for i := range this.Options { + if c := this.Options[i].Compare(that1.Options[i]); c != 0 { + return c + } + } + if c := this.SourceContext.Compare(that1.SourceContext); c != 0 { + return c + } + if this.Syntax != that1.Syntax { + if this.Syntax < that1.Syntax { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Field) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Field) + if !ok { + that2, ok := that.(Field) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Kind != that1.Kind { + if this.Kind < that1.Kind { + return -1 + } + return 1 + } + if this.Cardinality != that1.Cardinality { + if this.Cardinality < that1.Cardinality { + return -1 + } + return 1 + } + if this.Number != that1.Number { + if this.Number < that1.Number { + return -1 + } + return 1 + } + if this.Name != that1.Name { + if this.Name < that1.Name { + return -1 + } + return 1 + } + if this.TypeUrl != that1.TypeUrl { + if this.TypeUrl < that1.TypeUrl { + return -1 + } + return 1 + } + if this.OneofIndex != that1.OneofIndex { + if this.OneofIndex < that1.OneofIndex { + return -1 + } + return 1 + } + if this.Packed != that1.Packed { + if !this.Packed { + return -1 + } + return 1 + } + if len(this.Options) != len(that1.Options) { + if len(this.Options) < len(that1.Options) { + return -1 + } + return 1 + } + for i := range this.Options { + if c := this.Options[i].Compare(that1.Options[i]); c != 0 { + return c + } + } + if this.JsonName != that1.JsonName { + if this.JsonName < that1.JsonName { + return -1 + } + return 1 + } + if this.DefaultValue != that1.DefaultValue { + if this.DefaultValue < that1.DefaultValue { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Enum) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Enum) + if !ok { + that2, ok := that.(Enum) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Name != that1.Name { + if this.Name < that1.Name { + return -1 + } + return 1 + } + if len(this.Enumvalue) != len(that1.Enumvalue) { + if len(this.Enumvalue) < len(that1.Enumvalue) { + return -1 + } + return 1 + } + for i := range this.Enumvalue { + if c := this.Enumvalue[i].Compare(that1.Enumvalue[i]); c != 0 { + return c + } + } + if len(this.Options) != len(that1.Options) { + if len(this.Options) < len(that1.Options) { + return -1 + } + return 1 + } + for i := range this.Options { + if c := this.Options[i].Compare(that1.Options[i]); c != 0 { + return c + } + } + if c := this.SourceContext.Compare(that1.SourceContext); c != 0 { + return c + } + if this.Syntax != that1.Syntax { + if this.Syntax < that1.Syntax { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *EnumValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*EnumValue) + if !ok { + that2, ok := that.(EnumValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Name != that1.Name { + if this.Name < that1.Name { + return -1 + } + return 1 + } + if this.Number != that1.Number { + if this.Number < that1.Number { + return -1 + } + return 1 + } + if len(this.Options) != len(that1.Options) { + if len(this.Options) < len(that1.Options) { + return -1 + } + return 1 + } + for i := range this.Options { + if c := this.Options[i].Compare(that1.Options[i]); c != 0 { + return c + } + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Option) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Option) + if !ok { + that2, ok := that.(Option) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Name != that1.Name { + if this.Name < that1.Name { + return -1 + } + return 1 + } + if c := this.Value.Compare(that1.Value); c != 0 { + return c + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (x Syntax) String() string { + s, ok := Syntax_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Field_Kind) String() string { + s, ok := Field_Kind_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Field_Cardinality) String() string { + s, ok := Field_Cardinality_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (this *Type) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Type) + if !ok { + that2, ok := that.(Type) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if len(this.Fields) != len(that1.Fields) { + return false + } + for i := range this.Fields { + if !this.Fields[i].Equal(that1.Fields[i]) { + return false + } + } + if len(this.Oneofs) != len(that1.Oneofs) { + return false + } + for i := range this.Oneofs { + if this.Oneofs[i] != that1.Oneofs[i] { + return false + } + } + if len(this.Options) != len(that1.Options) { + return false + } + for i := range this.Options { + if !this.Options[i].Equal(that1.Options[i]) { + return false + } + } + if !this.SourceContext.Equal(that1.SourceContext) { + return false + } + if this.Syntax != that1.Syntax { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Field) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Field) + if !ok { + that2, ok := that.(Field) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Kind != that1.Kind { + return false + } + if this.Cardinality != that1.Cardinality { + return false + } + if this.Number != that1.Number { + return false + } + if this.Name != that1.Name { + return false + } + if this.TypeUrl != that1.TypeUrl { + return false + } + if this.OneofIndex != that1.OneofIndex { + return false + } + if this.Packed != that1.Packed { + return false + } + if len(this.Options) != len(that1.Options) { + return false + } + for i := range this.Options { + if !this.Options[i].Equal(that1.Options[i]) { + return false + } + } + if this.JsonName != that1.JsonName { + return false + } + if this.DefaultValue != that1.DefaultValue { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Enum) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Enum) + if !ok { + that2, ok := that.(Enum) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if len(this.Enumvalue) != len(that1.Enumvalue) { + return false + } + for i := range this.Enumvalue { + if !this.Enumvalue[i].Equal(that1.Enumvalue[i]) { + return false + } + } + if len(this.Options) != len(that1.Options) { + return false + } + for i := range this.Options { + if !this.Options[i].Equal(that1.Options[i]) { + return false + } + } + if !this.SourceContext.Equal(that1.SourceContext) { + return false + } + if this.Syntax != that1.Syntax { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *EnumValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*EnumValue) + if !ok { + that2, ok := that.(EnumValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if this.Number != that1.Number { + return false + } + if len(this.Options) != len(that1.Options) { + return false + } + for i := range this.Options { + if !this.Options[i].Equal(that1.Options[i]) { + return false + } + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Option) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Option) + if !ok { + that2, ok := that.(Option) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if !this.Value.Equal(that1.Value) { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Type) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&types.Type{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Fields != nil { + s = append(s, "Fields: "+fmt.Sprintf("%#v", this.Fields)+",\n") + } + s = append(s, "Oneofs: "+fmt.Sprintf("%#v", this.Oneofs)+",\n") + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.SourceContext != nil { + s = append(s, "SourceContext: "+fmt.Sprintf("%#v", this.SourceContext)+",\n") + } + s = append(s, "Syntax: "+fmt.Sprintf("%#v", this.Syntax)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Field) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 14) + s = append(s, "&types.Field{") + s = append(s, "Kind: "+fmt.Sprintf("%#v", this.Kind)+",\n") + s = append(s, "Cardinality: "+fmt.Sprintf("%#v", this.Cardinality)+",\n") + s = append(s, "Number: "+fmt.Sprintf("%#v", this.Number)+",\n") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "TypeUrl: "+fmt.Sprintf("%#v", this.TypeUrl)+",\n") + s = append(s, "OneofIndex: "+fmt.Sprintf("%#v", this.OneofIndex)+",\n") + s = append(s, "Packed: "+fmt.Sprintf("%#v", this.Packed)+",\n") + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + s = append(s, "JsonName: "+fmt.Sprintf("%#v", this.JsonName)+",\n") + s = append(s, "DefaultValue: "+fmt.Sprintf("%#v", this.DefaultValue)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Enum) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&types.Enum{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Enumvalue != nil { + s = append(s, "Enumvalue: "+fmt.Sprintf("%#v", this.Enumvalue)+",\n") + } + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.SourceContext != nil { + s = append(s, "SourceContext: "+fmt.Sprintf("%#v", this.SourceContext)+",\n") + } + s = append(s, "Syntax: "+fmt.Sprintf("%#v", this.Syntax)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *EnumValue) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&types.EnumValue{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "Number: "+fmt.Sprintf("%#v", this.Number)+",\n") + if this.Options != nil { + s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Option) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&types.Option{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Value != nil { + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + } + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringType(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *Type) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Type) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Type) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Syntax != 0 { + i = encodeVarintType(dAtA, i, uint64(m.Syntax)) + i-- + dAtA[i] = 0x30 + } + if m.SourceContext != nil { + { + size, err := m.SourceContext.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintType(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.Options) > 0 { + for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintType(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.Oneofs) > 0 { + for iNdEx := len(m.Oneofs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Oneofs[iNdEx]) + copy(dAtA[i:], m.Oneofs[iNdEx]) + i = encodeVarintType(dAtA, i, uint64(len(m.Oneofs[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Fields) > 0 { + for iNdEx := len(m.Fields) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Fields[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintType(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintType(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Field) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Field) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Field) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.DefaultValue) > 0 { + i -= len(m.DefaultValue) + copy(dAtA[i:], m.DefaultValue) + i = encodeVarintType(dAtA, i, uint64(len(m.DefaultValue))) + i-- + dAtA[i] = 0x5a + } + if len(m.JsonName) > 0 { + i -= len(m.JsonName) + copy(dAtA[i:], m.JsonName) + i = encodeVarintType(dAtA, i, uint64(len(m.JsonName))) + i-- + dAtA[i] = 0x52 + } + if len(m.Options) > 0 { + for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintType(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + } + if m.Packed { + i-- + if m.Packed { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } + if m.OneofIndex != 0 { + i = encodeVarintType(dAtA, i, uint64(m.OneofIndex)) + i-- + dAtA[i] = 0x38 + } + if len(m.TypeUrl) > 0 { + i -= len(m.TypeUrl) + copy(dAtA[i:], m.TypeUrl) + i = encodeVarintType(dAtA, i, uint64(len(m.TypeUrl))) + i-- + dAtA[i] = 0x32 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintType(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x22 + } + if m.Number != 0 { + i = encodeVarintType(dAtA, i, uint64(m.Number)) + i-- + dAtA[i] = 0x18 + } + if m.Cardinality != 0 { + i = encodeVarintType(dAtA, i, uint64(m.Cardinality)) + i-- + dAtA[i] = 0x10 + } + if m.Kind != 0 { + i = encodeVarintType(dAtA, i, uint64(m.Kind)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Enum) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Enum) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Enum) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Syntax != 0 { + i = encodeVarintType(dAtA, i, uint64(m.Syntax)) + i-- + dAtA[i] = 0x28 + } + if m.SourceContext != nil { + { + size, err := m.SourceContext.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintType(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if len(m.Options) > 0 { + for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintType(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Enumvalue) > 0 { + for iNdEx := len(m.Enumvalue) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Enumvalue[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintType(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintType(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EnumValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EnumValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnumValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Options) > 0 { + for iNdEx := len(m.Options) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Options[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintType(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.Number != 0 { + i = encodeVarintType(dAtA, i, uint64(m.Number)) + i-- + dAtA[i] = 0x10 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintType(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Option) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Option) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Option) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Value != nil { + { + size, err := m.Value.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintType(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintType(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintType(dAtA []byte, offset int, v uint64) int { + offset -= sovType(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func NewPopulatedType(r randyType, easy bool) *Type { + this := &Type{} + this.Name = string(randStringType(r)) + if r.Intn(5) != 0 { + v1 := r.Intn(5) + this.Fields = make([]*Field, v1) + for i := 0; i < v1; i++ { + this.Fields[i] = NewPopulatedField(r, easy) + } + } + v2 := r.Intn(10) + this.Oneofs = make([]string, v2) + for i := 0; i < v2; i++ { + this.Oneofs[i] = string(randStringType(r)) + } + if r.Intn(5) != 0 { + v3 := r.Intn(5) + this.Options = make([]*Option, v3) + for i := 0; i < v3; i++ { + this.Options[i] = NewPopulatedOption(r, easy) + } + } + if r.Intn(5) != 0 { + this.SourceContext = NewPopulatedSourceContext(r, easy) + } + this.Syntax = Syntax([]int32{0, 1}[r.Intn(2)]) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedType(r, 7) + } + return this +} + +func NewPopulatedField(r randyType, easy bool) *Field { + this := &Field{} + this.Kind = Field_Kind([]int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}[r.Intn(19)]) + this.Cardinality = Field_Cardinality([]int32{0, 1, 2, 3}[r.Intn(4)]) + this.Number = int32(r.Int31()) + if r.Intn(2) == 0 { + this.Number *= -1 + } + this.Name = string(randStringType(r)) + this.TypeUrl = string(randStringType(r)) + this.OneofIndex = int32(r.Int31()) + if r.Intn(2) == 0 { + this.OneofIndex *= -1 + } + this.Packed = bool(bool(r.Intn(2) == 0)) + if r.Intn(5) != 0 { + v4 := r.Intn(5) + this.Options = make([]*Option, v4) + for i := 0; i < v4; i++ { + this.Options[i] = NewPopulatedOption(r, easy) + } + } + this.JsonName = string(randStringType(r)) + this.DefaultValue = string(randStringType(r)) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedType(r, 12) + } + return this +} + +func NewPopulatedEnum(r randyType, easy bool) *Enum { + this := &Enum{} + this.Name = string(randStringType(r)) + if r.Intn(5) != 0 { + v5 := r.Intn(5) + this.Enumvalue = make([]*EnumValue, v5) + for i := 0; i < v5; i++ { + this.Enumvalue[i] = NewPopulatedEnumValue(r, easy) + } + } + if r.Intn(5) != 0 { + v6 := r.Intn(5) + this.Options = make([]*Option, v6) + for i := 0; i < v6; i++ { + this.Options[i] = NewPopulatedOption(r, easy) + } + } + if r.Intn(5) != 0 { + this.SourceContext = NewPopulatedSourceContext(r, easy) + } + this.Syntax = Syntax([]int32{0, 1}[r.Intn(2)]) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedType(r, 6) + } + return this +} + +func NewPopulatedEnumValue(r randyType, easy bool) *EnumValue { + this := &EnumValue{} + this.Name = string(randStringType(r)) + this.Number = int32(r.Int31()) + if r.Intn(2) == 0 { + this.Number *= -1 + } + if r.Intn(5) != 0 { + v7 := r.Intn(5) + this.Options = make([]*Option, v7) + for i := 0; i < v7; i++ { + this.Options[i] = NewPopulatedOption(r, easy) + } + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedType(r, 4) + } + return this +} + +func NewPopulatedOption(r randyType, easy bool) *Option { + this := &Option{} + this.Name = string(randStringType(r)) + if r.Intn(5) != 0 { + this.Value = NewPopulatedAny(r, easy) + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedType(r, 3) + } + return this +} + +type randyType interface { + Float32() float32 + Float64() float64 + Int63() int64 + Int31() int32 + Uint32() uint32 + Intn(n int) int +} + +func randUTF8RuneType(r randyType) rune { + ru := r.Intn(62) + if ru < 10 { + return rune(ru + 48) + } else if ru < 36 { + return rune(ru + 55) + } + return rune(ru + 61) +} +func randStringType(r randyType) string { + v8 := r.Intn(100) + tmps := make([]rune, v8) + for i := 0; i < v8; i++ { + tmps[i] = randUTF8RuneType(r) + } + return string(tmps) +} +func randUnrecognizedType(r randyType, maxFieldNumber int) (dAtA []byte) { + l := r.Intn(5) + for i := 0; i < l; i++ { + wire := r.Intn(4) + if wire == 3 { + wire = 5 + } + fieldNumber := maxFieldNumber + r.Intn(100) + dAtA = randFieldType(dAtA, r, fieldNumber, wire) + } + return dAtA +} +func randFieldType(dAtA []byte, r randyType, fieldNumber int, wire int) []byte { + key := uint32(fieldNumber)<<3 | uint32(wire) + switch wire { + case 0: + dAtA = encodeVarintPopulateType(dAtA, uint64(key)) + v9 := r.Int63() + if r.Intn(2) == 0 { + v9 *= -1 + } + dAtA = encodeVarintPopulateType(dAtA, uint64(v9)) + case 1: + dAtA = encodeVarintPopulateType(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + case 2: + dAtA = encodeVarintPopulateType(dAtA, uint64(key)) + ll := r.Intn(100) + dAtA = encodeVarintPopulateType(dAtA, uint64(ll)) + for j := 0; j < ll; j++ { + dAtA = append(dAtA, byte(r.Intn(256))) + } + default: + dAtA = encodeVarintPopulateType(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + } + return dAtA +} +func encodeVarintPopulateType(dAtA []byte, v uint64) []byte { + for v >= 1<<7 { + dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) + v >>= 7 + } + dAtA = append(dAtA, uint8(v)) + return dAtA +} +func (m *Type) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovType(uint64(l)) + } + if len(m.Fields) > 0 { + for _, e := range m.Fields { + l = e.Size() + n += 1 + l + sovType(uint64(l)) + } + } + if len(m.Oneofs) > 0 { + for _, s := range m.Oneofs { + l = len(s) + n += 1 + l + sovType(uint64(l)) + } + } + if len(m.Options) > 0 { + for _, e := range m.Options { + l = e.Size() + n += 1 + l + sovType(uint64(l)) + } + } + if m.SourceContext != nil { + l = m.SourceContext.Size() + n += 1 + l + sovType(uint64(l)) + } + if m.Syntax != 0 { + n += 1 + sovType(uint64(m.Syntax)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Field) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Kind != 0 { + n += 1 + sovType(uint64(m.Kind)) + } + if m.Cardinality != 0 { + n += 1 + sovType(uint64(m.Cardinality)) + } + if m.Number != 0 { + n += 1 + sovType(uint64(m.Number)) + } + l = len(m.Name) + if l > 0 { + n += 1 + l + sovType(uint64(l)) + } + l = len(m.TypeUrl) + if l > 0 { + n += 1 + l + sovType(uint64(l)) + } + if m.OneofIndex != 0 { + n += 1 + sovType(uint64(m.OneofIndex)) + } + if m.Packed { + n += 2 + } + if len(m.Options) > 0 { + for _, e := range m.Options { + l = e.Size() + n += 1 + l + sovType(uint64(l)) + } + } + l = len(m.JsonName) + if l > 0 { + n += 1 + l + sovType(uint64(l)) + } + l = len(m.DefaultValue) + if l > 0 { + n += 1 + l + sovType(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Enum) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovType(uint64(l)) + } + if len(m.Enumvalue) > 0 { + for _, e := range m.Enumvalue { + l = e.Size() + n += 1 + l + sovType(uint64(l)) + } + } + if len(m.Options) > 0 { + for _, e := range m.Options { + l = e.Size() + n += 1 + l + sovType(uint64(l)) + } + } + if m.SourceContext != nil { + l = m.SourceContext.Size() + n += 1 + l + sovType(uint64(l)) + } + if m.Syntax != 0 { + n += 1 + sovType(uint64(m.Syntax)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *EnumValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovType(uint64(l)) + } + if m.Number != 0 { + n += 1 + sovType(uint64(m.Number)) + } + if len(m.Options) > 0 { + for _, e := range m.Options { + l = e.Size() + n += 1 + l + sovType(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Option) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovType(uint64(l)) + } + if m.Value != nil { + l = m.Value.Size() + n += 1 + l + sovType(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovType(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozType(x uint64) (n int) { + return sovType(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *Type) String() string { + if this == nil { + return "nil" + } + repeatedStringForFields := "[]*Field{" + for _, f := range this.Fields { + repeatedStringForFields += strings.Replace(f.String(), "Field", "Field", 1) + "," + } + repeatedStringForFields += "}" + repeatedStringForOptions := "[]*Option{" + for _, f := range this.Options { + repeatedStringForOptions += strings.Replace(f.String(), "Option", "Option", 1) + "," + } + repeatedStringForOptions += "}" + s := strings.Join([]string{`&Type{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Fields:` + repeatedStringForFields + `,`, + `Oneofs:` + fmt.Sprintf("%v", this.Oneofs) + `,`, + `Options:` + repeatedStringForOptions + `,`, + `SourceContext:` + strings.Replace(fmt.Sprintf("%v", this.SourceContext), "SourceContext", "SourceContext", 1) + `,`, + `Syntax:` + fmt.Sprintf("%v", this.Syntax) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *Field) String() string { + if this == nil { + return "nil" + } + repeatedStringForOptions := "[]*Option{" + for _, f := range this.Options { + repeatedStringForOptions += strings.Replace(f.String(), "Option", "Option", 1) + "," + } + repeatedStringForOptions += "}" + s := strings.Join([]string{`&Field{`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `Cardinality:` + fmt.Sprintf("%v", this.Cardinality) + `,`, + `Number:` + fmt.Sprintf("%v", this.Number) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `TypeUrl:` + fmt.Sprintf("%v", this.TypeUrl) + `,`, + `OneofIndex:` + fmt.Sprintf("%v", this.OneofIndex) + `,`, + `Packed:` + fmt.Sprintf("%v", this.Packed) + `,`, + `Options:` + repeatedStringForOptions + `,`, + `JsonName:` + fmt.Sprintf("%v", this.JsonName) + `,`, + `DefaultValue:` + fmt.Sprintf("%v", this.DefaultValue) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *Enum) String() string { + if this == nil { + return "nil" + } + repeatedStringForEnumvalue := "[]*EnumValue{" + for _, f := range this.Enumvalue { + repeatedStringForEnumvalue += strings.Replace(f.String(), "EnumValue", "EnumValue", 1) + "," + } + repeatedStringForEnumvalue += "}" + repeatedStringForOptions := "[]*Option{" + for _, f := range this.Options { + repeatedStringForOptions += strings.Replace(f.String(), "Option", "Option", 1) + "," + } + repeatedStringForOptions += "}" + s := strings.Join([]string{`&Enum{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Enumvalue:` + repeatedStringForEnumvalue + `,`, + `Options:` + repeatedStringForOptions + `,`, + `SourceContext:` + strings.Replace(fmt.Sprintf("%v", this.SourceContext), "SourceContext", "SourceContext", 1) + `,`, + `Syntax:` + fmt.Sprintf("%v", this.Syntax) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *EnumValue) String() string { + if this == nil { + return "nil" + } + repeatedStringForOptions := "[]*Option{" + for _, f := range this.Options { + repeatedStringForOptions += strings.Replace(f.String(), "Option", "Option", 1) + "," + } + repeatedStringForOptions += "}" + s := strings.Join([]string{`&EnumValue{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Number:` + fmt.Sprintf("%v", this.Number) + `,`, + `Options:` + repeatedStringForOptions + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *Option) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Option{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Value:` + strings.Replace(fmt.Sprintf("%v", this.Value), "Any", "Any", 1) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func valueToStringType(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *Type) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Type: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Type: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fields", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Fields = append(m.Fields, &Field{}) + if err := m.Fields[len(m.Fields)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Oneofs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Oneofs = append(m.Oneofs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Options = append(m.Options, &Option{}) + if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SourceContext", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SourceContext == nil { + m.SourceContext = &SourceContext{} + } + if err := m.SourceContext.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Syntax", wireType) + } + m.Syntax = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Syntax |= Syntax(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipType(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthType + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthType + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Field) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Field: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Field: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + m.Kind = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Kind |= Field_Kind(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Cardinality", wireType) + } + m.Cardinality = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Cardinality |= Field_Cardinality(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Number", wireType) + } + m.Number = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Number |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TypeUrl", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TypeUrl = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OneofIndex", wireType) + } + m.OneofIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.OneofIndex |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Packed", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Packed = bool(v != 0) + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Options = append(m.Options, &Option{}) + if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JsonName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.JsonName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultValue", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DefaultValue = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipType(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthType + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthType + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Enum) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Enum: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Enum: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Enumvalue", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Enumvalue = append(m.Enumvalue, &EnumValue{}) + if err := m.Enumvalue[len(m.Enumvalue)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Options = append(m.Options, &Option{}) + if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SourceContext", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SourceContext == nil { + m.SourceContext = &SourceContext{} + } + if err := m.SourceContext.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Syntax", wireType) + } + m.Syntax = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Syntax |= Syntax(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipType(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthType + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthType + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EnumValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EnumValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EnumValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Number", wireType) + } + m.Number = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Number |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Options = append(m.Options, &Option{}) + if err := m.Options[len(m.Options)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipType(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthType + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthType + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Option) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Option: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Option: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowType + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthType + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthType + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Value == nil { + m.Value = &Any{} + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipType(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthType + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthType + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipType(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowType + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowType + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowType + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthType + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupType + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthType + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthType = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowType = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupType = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/gogo/protobuf/types/wrappers.pb.go b/vendor/github.com/gogo/protobuf/types/wrappers.pb.go new file mode 100644 index 00000000..8f1edb57 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/wrappers.pb.go @@ -0,0 +1,2730 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/wrappers.proto + +package types + +import ( + bytes "bytes" + encoding_binary "encoding/binary" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// Wrapper message for `double`. +// +// The JSON representation for `DoubleValue` is JSON number. +type DoubleValue struct { + // The double value. + Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DoubleValue) Reset() { *m = DoubleValue{} } +func (*DoubleValue) ProtoMessage() {} +func (*DoubleValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{0} +} +func (*DoubleValue) XXX_WellKnownType() string { return "DoubleValue" } +func (m *DoubleValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DoubleValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DoubleValue.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *DoubleValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_DoubleValue.Merge(m, src) +} +func (m *DoubleValue) XXX_Size() int { + return m.Size() +} +func (m *DoubleValue) XXX_DiscardUnknown() { + xxx_messageInfo_DoubleValue.DiscardUnknown(m) +} + +var xxx_messageInfo_DoubleValue proto.InternalMessageInfo + +func (m *DoubleValue) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +func (*DoubleValue) XXX_MessageName() string { + return "google.protobuf.DoubleValue" +} + +// Wrapper message for `float`. +// +// The JSON representation for `FloatValue` is JSON number. +type FloatValue struct { + // The float value. + Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FloatValue) Reset() { *m = FloatValue{} } +func (*FloatValue) ProtoMessage() {} +func (*FloatValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{1} +} +func (*FloatValue) XXX_WellKnownType() string { return "FloatValue" } +func (m *FloatValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *FloatValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_FloatValue.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *FloatValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_FloatValue.Merge(m, src) +} +func (m *FloatValue) XXX_Size() int { + return m.Size() +} +func (m *FloatValue) XXX_DiscardUnknown() { + xxx_messageInfo_FloatValue.DiscardUnknown(m) +} + +var xxx_messageInfo_FloatValue proto.InternalMessageInfo + +func (m *FloatValue) GetValue() float32 { + if m != nil { + return m.Value + } + return 0 +} + +func (*FloatValue) XXX_MessageName() string { + return "google.protobuf.FloatValue" +} + +// Wrapper message for `int64`. +// +// The JSON representation for `Int64Value` is JSON string. +type Int64Value struct { + // The int64 value. + Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Int64Value) Reset() { *m = Int64Value{} } +func (*Int64Value) ProtoMessage() {} +func (*Int64Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{2} +} +func (*Int64Value) XXX_WellKnownType() string { return "Int64Value" } +func (m *Int64Value) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Int64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Int64Value.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Int64Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Int64Value.Merge(m, src) +} +func (m *Int64Value) XXX_Size() int { + return m.Size() +} +func (m *Int64Value) XXX_DiscardUnknown() { + xxx_messageInfo_Int64Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Int64Value proto.InternalMessageInfo + +func (m *Int64Value) GetValue() int64 { + if m != nil { + return m.Value + } + return 0 +} + +func (*Int64Value) XXX_MessageName() string { + return "google.protobuf.Int64Value" +} + +// Wrapper message for `uint64`. +// +// The JSON representation for `UInt64Value` is JSON string. +type UInt64Value struct { + // The uint64 value. + Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UInt64Value) Reset() { *m = UInt64Value{} } +func (*UInt64Value) ProtoMessage() {} +func (*UInt64Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{3} +} +func (*UInt64Value) XXX_WellKnownType() string { return "UInt64Value" } +func (m *UInt64Value) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *UInt64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_UInt64Value.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *UInt64Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_UInt64Value.Merge(m, src) +} +func (m *UInt64Value) XXX_Size() int { + return m.Size() +} +func (m *UInt64Value) XXX_DiscardUnknown() { + xxx_messageInfo_UInt64Value.DiscardUnknown(m) +} + +var xxx_messageInfo_UInt64Value proto.InternalMessageInfo + +func (m *UInt64Value) GetValue() uint64 { + if m != nil { + return m.Value + } + return 0 +} + +func (*UInt64Value) XXX_MessageName() string { + return "google.protobuf.UInt64Value" +} + +// Wrapper message for `int32`. +// +// The JSON representation for `Int32Value` is JSON number. +type Int32Value struct { + // The int32 value. + Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Int32Value) Reset() { *m = Int32Value{} } +func (*Int32Value) ProtoMessage() {} +func (*Int32Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{4} +} +func (*Int32Value) XXX_WellKnownType() string { return "Int32Value" } +func (m *Int32Value) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Int32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Int32Value.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Int32Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Int32Value.Merge(m, src) +} +func (m *Int32Value) XXX_Size() int { + return m.Size() +} +func (m *Int32Value) XXX_DiscardUnknown() { + xxx_messageInfo_Int32Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Int32Value proto.InternalMessageInfo + +func (m *Int32Value) GetValue() int32 { + if m != nil { + return m.Value + } + return 0 +} + +func (*Int32Value) XXX_MessageName() string { + return "google.protobuf.Int32Value" +} + +// Wrapper message for `uint32`. +// +// The JSON representation for `UInt32Value` is JSON number. +type UInt32Value struct { + // The uint32 value. + Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UInt32Value) Reset() { *m = UInt32Value{} } +func (*UInt32Value) ProtoMessage() {} +func (*UInt32Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{5} +} +func (*UInt32Value) XXX_WellKnownType() string { return "UInt32Value" } +func (m *UInt32Value) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *UInt32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_UInt32Value.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *UInt32Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_UInt32Value.Merge(m, src) +} +func (m *UInt32Value) XXX_Size() int { + return m.Size() +} +func (m *UInt32Value) XXX_DiscardUnknown() { + xxx_messageInfo_UInt32Value.DiscardUnknown(m) +} + +var xxx_messageInfo_UInt32Value proto.InternalMessageInfo + +func (m *UInt32Value) GetValue() uint32 { + if m != nil { + return m.Value + } + return 0 +} + +func (*UInt32Value) XXX_MessageName() string { + return "google.protobuf.UInt32Value" +} + +// Wrapper message for `bool`. +// +// The JSON representation for `BoolValue` is JSON `true` and `false`. +type BoolValue struct { + // The bool value. + Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BoolValue) Reset() { *m = BoolValue{} } +func (*BoolValue) ProtoMessage() {} +func (*BoolValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{6} +} +func (*BoolValue) XXX_WellKnownType() string { return "BoolValue" } +func (m *BoolValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BoolValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BoolValue.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BoolValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_BoolValue.Merge(m, src) +} +func (m *BoolValue) XXX_Size() int { + return m.Size() +} +func (m *BoolValue) XXX_DiscardUnknown() { + xxx_messageInfo_BoolValue.DiscardUnknown(m) +} + +var xxx_messageInfo_BoolValue proto.InternalMessageInfo + +func (m *BoolValue) GetValue() bool { + if m != nil { + return m.Value + } + return false +} + +func (*BoolValue) XXX_MessageName() string { + return "google.protobuf.BoolValue" +} + +// Wrapper message for `string`. +// +// The JSON representation for `StringValue` is JSON string. +type StringValue struct { + // The string value. + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StringValue) Reset() { *m = StringValue{} } +func (*StringValue) ProtoMessage() {} +func (*StringValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{7} +} +func (*StringValue) XXX_WellKnownType() string { return "StringValue" } +func (m *StringValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *StringValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_StringValue.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *StringValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_StringValue.Merge(m, src) +} +func (m *StringValue) XXX_Size() int { + return m.Size() +} +func (m *StringValue) XXX_DiscardUnknown() { + xxx_messageInfo_StringValue.DiscardUnknown(m) +} + +var xxx_messageInfo_StringValue proto.InternalMessageInfo + +func (m *StringValue) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func (*StringValue) XXX_MessageName() string { + return "google.protobuf.StringValue" +} + +// Wrapper message for `bytes`. +// +// The JSON representation for `BytesValue` is JSON string. +type BytesValue struct { + // The bytes value. + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BytesValue) Reset() { *m = BytesValue{} } +func (*BytesValue) ProtoMessage() {} +func (*BytesValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{8} +} +func (*BytesValue) XXX_WellKnownType() string { return "BytesValue" } +func (m *BytesValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BytesValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BytesValue.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BytesValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_BytesValue.Merge(m, src) +} +func (m *BytesValue) XXX_Size() int { + return m.Size() +} +func (m *BytesValue) XXX_DiscardUnknown() { + xxx_messageInfo_BytesValue.DiscardUnknown(m) +} + +var xxx_messageInfo_BytesValue proto.InternalMessageInfo + +func (m *BytesValue) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (*BytesValue) XXX_MessageName() string { + return "google.protobuf.BytesValue" +} +func init() { + proto.RegisterType((*DoubleValue)(nil), "google.protobuf.DoubleValue") + proto.RegisterType((*FloatValue)(nil), "google.protobuf.FloatValue") + proto.RegisterType((*Int64Value)(nil), "google.protobuf.Int64Value") + proto.RegisterType((*UInt64Value)(nil), "google.protobuf.UInt64Value") + proto.RegisterType((*Int32Value)(nil), "google.protobuf.Int32Value") + proto.RegisterType((*UInt32Value)(nil), "google.protobuf.UInt32Value") + proto.RegisterType((*BoolValue)(nil), "google.protobuf.BoolValue") + proto.RegisterType((*StringValue)(nil), "google.protobuf.StringValue") + proto.RegisterType((*BytesValue)(nil), "google.protobuf.BytesValue") +} + +func init() { proto.RegisterFile("google/protobuf/wrappers.proto", fileDescriptor_5377b62bda767935) } + +var fileDescriptor_5377b62bda767935 = []byte{ + // 285 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x2f, 0x4a, 0x2c, + 0x28, 0x48, 0x2d, 0x2a, 0xd6, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0xca, + 0x5c, 0xdc, 0x2e, 0xf9, 0xa5, 0x49, 0x39, 0xa9, 0x61, 0x89, 0x39, 0xa5, 0xa9, 0x42, 0x22, 0x5c, + 0xac, 0x65, 0x20, 0x86, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x63, 0x10, 0x84, 0xa3, 0xa4, 0xc4, 0xc5, + 0xe5, 0x96, 0x93, 0x9f, 0x58, 0x82, 0x45, 0x0d, 0x13, 0x92, 0x1a, 0xcf, 0xbc, 0x12, 0x33, 0x13, + 0x2c, 0x6a, 0x98, 0x61, 0x6a, 0x94, 0xb9, 0xb8, 0x43, 0x71, 0x29, 0x62, 0x41, 0x35, 0xc8, 0xd8, + 0x08, 0x8b, 0x1a, 0x56, 0x34, 0x83, 0xb0, 0x2a, 0xe2, 0x85, 0x29, 0x52, 0xe4, 0xe2, 0x74, 0xca, + 0xcf, 0xcf, 0xc1, 0xa2, 0x84, 0x03, 0xc9, 0x9c, 0xe0, 0x92, 0xa2, 0xcc, 0xbc, 0x74, 0x2c, 0x8a, + 0x38, 0x91, 0x1c, 0xe4, 0x54, 0x59, 0x92, 0x5a, 0x8c, 0x45, 0x0d, 0x0f, 0x54, 0x8d, 0x53, 0x3b, + 0xe3, 0x8d, 0x87, 0x72, 0x0c, 0x1f, 0x1e, 0xca, 0x31, 0xfe, 0x78, 0x28, 0xc7, 0xd8, 0xf0, 0x48, + 0x8e, 0x71, 0xc5, 0x23, 0x39, 0xc6, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, + 0x48, 0x8e, 0xf1, 0xc5, 0x23, 0x39, 0x86, 0x0f, 0x20, 0xf1, 0xc7, 0x72, 0x8c, 0x27, 0x1e, 0xcb, + 0x31, 0x72, 0x09, 0x27, 0xe7, 0xe7, 0xea, 0xa1, 0x45, 0x87, 0x13, 0x6f, 0x38, 0x34, 0xbe, 0x02, + 0x40, 0x22, 0x01, 0x8c, 0x51, 0xac, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x3f, 0x18, 0x19, 0x17, 0x31, + 0x31, 0xbb, 0x07, 0x38, 0xad, 0x62, 0x92, 0x73, 0x87, 0x68, 0x09, 0x80, 0x6a, 0xd1, 0x0b, 0x4f, + 0xcd, 0xc9, 0xf1, 0xce, 0xcb, 0x2f, 0xcf, 0x0b, 0x01, 0xa9, 0x4c, 0x62, 0x03, 0x9b, 0x65, 0x0c, + 0x08, 0x00, 0x00, 0xff, 0xff, 0x31, 0x55, 0x64, 0x90, 0x0a, 0x02, 0x00, 0x00, +} + +func (this *DoubleValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*DoubleValue) + if !ok { + that2, ok := that.(DoubleValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Value != that1.Value { + if this.Value < that1.Value { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *FloatValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*FloatValue) + if !ok { + that2, ok := that.(FloatValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Value != that1.Value { + if this.Value < that1.Value { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Int64Value) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Int64Value) + if !ok { + that2, ok := that.(Int64Value) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Value != that1.Value { + if this.Value < that1.Value { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *UInt64Value) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*UInt64Value) + if !ok { + that2, ok := that.(UInt64Value) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Value != that1.Value { + if this.Value < that1.Value { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *Int32Value) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*Int32Value) + if !ok { + that2, ok := that.(Int32Value) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Value != that1.Value { + if this.Value < that1.Value { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *UInt32Value) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*UInt32Value) + if !ok { + that2, ok := that.(UInt32Value) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Value != that1.Value { + if this.Value < that1.Value { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *BoolValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*BoolValue) + if !ok { + that2, ok := that.(BoolValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Value != that1.Value { + if !this.Value { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *StringValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*StringValue) + if !ok { + that2, ok := that.(StringValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if this.Value != that1.Value { + if this.Value < that1.Value { + return -1 + } + return 1 + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *BytesValue) Compare(that interface{}) int { + if that == nil { + if this == nil { + return 0 + } + return 1 + } + + that1, ok := that.(*BytesValue) + if !ok { + that2, ok := that.(BytesValue) + if ok { + that1 = &that2 + } else { + return 1 + } + } + if that1 == nil { + if this == nil { + return 0 + } + return 1 + } else if this == nil { + return -1 + } + if c := bytes.Compare(this.Value, that1.Value); c != 0 { + return c + } + if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 { + return c + } + return 0 +} +func (this *DoubleValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*DoubleValue) + if !ok { + that2, ok := that.(DoubleValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *FloatValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*FloatValue) + if !ok { + that2, ok := that.(FloatValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Int64Value) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Int64Value) + if !ok { + that2, ok := that.(Int64Value) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *UInt64Value) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*UInt64Value) + if !ok { + that2, ok := that.(UInt64Value) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *Int32Value) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Int32Value) + if !ok { + that2, ok := that.(Int32Value) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *UInt32Value) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*UInt32Value) + if !ok { + that2, ok := that.(UInt32Value) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *BoolValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*BoolValue) + if !ok { + that2, ok := that.(BoolValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *StringValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*StringValue) + if !ok { + that2, ok := that.(StringValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *BytesValue) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*BytesValue) + if !ok { + that2, ok := that.(BytesValue) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !bytes.Equal(this.Value, that1.Value) { + return false + } + if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { + return false + } + return true +} +func (this *DoubleValue) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.DoubleValue{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *FloatValue) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.FloatValue{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Int64Value) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.Int64Value{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *UInt64Value) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.UInt64Value{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Int32Value) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.Int32Value{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *UInt32Value) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.UInt32Value{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *BoolValue) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.BoolValue{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *StringValue) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.StringValue{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *BytesValue) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&types.BytesValue{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.XXX_unrecognized != nil { + s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringWrappers(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *DoubleValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DoubleValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DoubleValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Value != 0 { + i -= 8 + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + i-- + dAtA[i] = 0x9 + } + return len(dAtA) - i, nil +} + +func (m *FloatValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FloatValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *FloatValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Value != 0 { + i -= 4 + encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(math.Float32bits(float32(m.Value)))) + i-- + dAtA[i] = 0xd + } + return len(dAtA) - i, nil +} + +func (m *Int64Value) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Int64Value) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Int64Value) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Value != 0 { + i = encodeVarintWrappers(dAtA, i, uint64(m.Value)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *UInt64Value) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UInt64Value) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UInt64Value) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Value != 0 { + i = encodeVarintWrappers(dAtA, i, uint64(m.Value)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Int32Value) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Int32Value) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Int32Value) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Value != 0 { + i = encodeVarintWrappers(dAtA, i, uint64(m.Value)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *UInt32Value) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UInt32Value) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UInt32Value) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Value != 0 { + i = encodeVarintWrappers(dAtA, i, uint64(m.Value)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *BoolValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BoolValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BoolValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Value { + i-- + if m.Value { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *StringValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StringValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StringValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintWrappers(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *BytesValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BytesValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BytesValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintWrappers(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintWrappers(dAtA []byte, offset int, v uint64) int { + offset -= sovWrappers(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func NewPopulatedDoubleValue(r randyWrappers, easy bool) *DoubleValue { + this := &DoubleValue{} + this.Value = float64(r.Float64()) + if r.Intn(2) == 0 { + this.Value *= -1 + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) + } + return this +} + +func NewPopulatedFloatValue(r randyWrappers, easy bool) *FloatValue { + this := &FloatValue{} + this.Value = float32(r.Float32()) + if r.Intn(2) == 0 { + this.Value *= -1 + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) + } + return this +} + +func NewPopulatedInt64Value(r randyWrappers, easy bool) *Int64Value { + this := &Int64Value{} + this.Value = int64(r.Int63()) + if r.Intn(2) == 0 { + this.Value *= -1 + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) + } + return this +} + +func NewPopulatedUInt64Value(r randyWrappers, easy bool) *UInt64Value { + this := &UInt64Value{} + this.Value = uint64(uint64(r.Uint32())) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) + } + return this +} + +func NewPopulatedInt32Value(r randyWrappers, easy bool) *Int32Value { + this := &Int32Value{} + this.Value = int32(r.Int31()) + if r.Intn(2) == 0 { + this.Value *= -1 + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) + } + return this +} + +func NewPopulatedUInt32Value(r randyWrappers, easy bool) *UInt32Value { + this := &UInt32Value{} + this.Value = uint32(r.Uint32()) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) + } + return this +} + +func NewPopulatedBoolValue(r randyWrappers, easy bool) *BoolValue { + this := &BoolValue{} + this.Value = bool(bool(r.Intn(2) == 0)) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) + } + return this +} + +func NewPopulatedStringValue(r randyWrappers, easy bool) *StringValue { + this := &StringValue{} + this.Value = string(randStringWrappers(r)) + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) + } + return this +} + +func NewPopulatedBytesValue(r randyWrappers, easy bool) *BytesValue { + this := &BytesValue{} + v1 := r.Intn(100) + this.Value = make([]byte, v1) + for i := 0; i < v1; i++ { + this.Value[i] = byte(r.Intn(256)) + } + if !easy && r.Intn(10) != 0 { + this.XXX_unrecognized = randUnrecognizedWrappers(r, 2) + } + return this +} + +type randyWrappers interface { + Float32() float32 + Float64() float64 + Int63() int64 + Int31() int32 + Uint32() uint32 + Intn(n int) int +} + +func randUTF8RuneWrappers(r randyWrappers) rune { + ru := r.Intn(62) + if ru < 10 { + return rune(ru + 48) + } else if ru < 36 { + return rune(ru + 55) + } + return rune(ru + 61) +} +func randStringWrappers(r randyWrappers) string { + v2 := r.Intn(100) + tmps := make([]rune, v2) + for i := 0; i < v2; i++ { + tmps[i] = randUTF8RuneWrappers(r) + } + return string(tmps) +} +func randUnrecognizedWrappers(r randyWrappers, maxFieldNumber int) (dAtA []byte) { + l := r.Intn(5) + for i := 0; i < l; i++ { + wire := r.Intn(4) + if wire == 3 { + wire = 5 + } + fieldNumber := maxFieldNumber + r.Intn(100) + dAtA = randFieldWrappers(dAtA, r, fieldNumber, wire) + } + return dAtA +} +func randFieldWrappers(dAtA []byte, r randyWrappers, fieldNumber int, wire int) []byte { + key := uint32(fieldNumber)<<3 | uint32(wire) + switch wire { + case 0: + dAtA = encodeVarintPopulateWrappers(dAtA, uint64(key)) + v3 := r.Int63() + if r.Intn(2) == 0 { + v3 *= -1 + } + dAtA = encodeVarintPopulateWrappers(dAtA, uint64(v3)) + case 1: + dAtA = encodeVarintPopulateWrappers(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + case 2: + dAtA = encodeVarintPopulateWrappers(dAtA, uint64(key)) + ll := r.Intn(100) + dAtA = encodeVarintPopulateWrappers(dAtA, uint64(ll)) + for j := 0; j < ll; j++ { + dAtA = append(dAtA, byte(r.Intn(256))) + } + default: + dAtA = encodeVarintPopulateWrappers(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + } + return dAtA +} +func encodeVarintPopulateWrappers(dAtA []byte, v uint64) []byte { + for v >= 1<<7 { + dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) + v >>= 7 + } + dAtA = append(dAtA, uint8(v)) + return dAtA +} +func (m *DoubleValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != 0 { + n += 9 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *FloatValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != 0 { + n += 5 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Int64Value) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != 0 { + n += 1 + sovWrappers(uint64(m.Value)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *UInt64Value) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != 0 { + n += 1 + sovWrappers(uint64(m.Value)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Int32Value) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != 0 { + n += 1 + sovWrappers(uint64(m.Value)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *UInt32Value) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != 0 { + n += 1 + sovWrappers(uint64(m.Value)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *BoolValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *StringValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Value) + if l > 0 { + n += 1 + l + sovWrappers(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *BytesValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Value) + if l > 0 { + n += 1 + l + sovWrappers(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovWrappers(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozWrappers(x uint64) (n int) { + return sovWrappers(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *DoubleValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DoubleValue{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *FloatValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&FloatValue{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *Int64Value) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Int64Value{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *UInt64Value) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&UInt64Value{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *Int32Value) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Int32Value{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *UInt32Value) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&UInt32Value{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *BoolValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&BoolValue{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *StringValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&StringValue{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func (this *BytesValue) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&BytesValue{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`, + `}`, + }, "") + return s +} +func valueToStringWrappers(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *DoubleValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DoubleValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DoubleValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Value = float64(math.Float64frombits(v)) + default: + iNdEx = preIndex + skippy, err := skipWrappers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FloatValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FloatValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FloatValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 5 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v uint32 + if (iNdEx + 4) > l { + return io.ErrUnexpectedEOF + } + v = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) + iNdEx += 4 + m.Value = float32(math.Float32frombits(v)) + default: + iNdEx = preIndex + skippy, err := skipWrappers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Int64Value) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Int64Value: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Int64Value: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + m.Value = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Value |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipWrappers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UInt64Value) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UInt64Value: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UInt64Value: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + m.Value = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Value |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipWrappers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Int32Value) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Int32Value: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Int32Value: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + m.Value = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Value |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipWrappers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UInt32Value) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UInt32Value: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UInt32Value: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + m.Value = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Value |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipWrappers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BoolValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BoolValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BoolValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Value = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipWrappers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StringValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StringValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StringValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthWrappers + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthWrappers + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipWrappers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BytesValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BytesValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BytesValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowWrappers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthWrappers + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthWrappers + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipWrappers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthWrappers + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipWrappers(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowWrappers + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowWrappers + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowWrappers + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthWrappers + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupWrappers + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthWrappers + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthWrappers = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowWrappers = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupWrappers = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/gogo/protobuf/types/wrappers_gogo.go b/vendor/github.com/gogo/protobuf/types/wrappers_gogo.go new file mode 100644 index 00000000..d905df36 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/types/wrappers_gogo.go @@ -0,0 +1,300 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package types + +func NewPopulatedStdDouble(r randyWrappers, easy bool) *float64 { + v := NewPopulatedDoubleValue(r, easy) + return &v.Value +} + +func SizeOfStdDouble(v float64) int { + pv := &DoubleValue{Value: v} + return pv.Size() +} + +func StdDoubleMarshal(v float64) ([]byte, error) { + size := SizeOfStdDouble(v) + buf := make([]byte, size) + _, err := StdDoubleMarshalTo(v, buf) + return buf, err +} + +func StdDoubleMarshalTo(v float64, data []byte) (int, error) { + pv := &DoubleValue{Value: v} + return pv.MarshalTo(data) +} + +func StdDoubleUnmarshal(v *float64, data []byte) error { + pv := &DoubleValue{} + if err := pv.Unmarshal(data); err != nil { + return err + } + *v = pv.Value + return nil +} +func NewPopulatedStdFloat(r randyWrappers, easy bool) *float32 { + v := NewPopulatedFloatValue(r, easy) + return &v.Value +} + +func SizeOfStdFloat(v float32) int { + pv := &FloatValue{Value: v} + return pv.Size() +} + +func StdFloatMarshal(v float32) ([]byte, error) { + size := SizeOfStdFloat(v) + buf := make([]byte, size) + _, err := StdFloatMarshalTo(v, buf) + return buf, err +} + +func StdFloatMarshalTo(v float32, data []byte) (int, error) { + pv := &FloatValue{Value: v} + return pv.MarshalTo(data) +} + +func StdFloatUnmarshal(v *float32, data []byte) error { + pv := &FloatValue{} + if err := pv.Unmarshal(data); err != nil { + return err + } + *v = pv.Value + return nil +} +func NewPopulatedStdInt64(r randyWrappers, easy bool) *int64 { + v := NewPopulatedInt64Value(r, easy) + return &v.Value +} + +func SizeOfStdInt64(v int64) int { + pv := &Int64Value{Value: v} + return pv.Size() +} + +func StdInt64Marshal(v int64) ([]byte, error) { + size := SizeOfStdInt64(v) + buf := make([]byte, size) + _, err := StdInt64MarshalTo(v, buf) + return buf, err +} + +func StdInt64MarshalTo(v int64, data []byte) (int, error) { + pv := &Int64Value{Value: v} + return pv.MarshalTo(data) +} + +func StdInt64Unmarshal(v *int64, data []byte) error { + pv := &Int64Value{} + if err := pv.Unmarshal(data); err != nil { + return err + } + *v = pv.Value + return nil +} +func NewPopulatedStdUInt64(r randyWrappers, easy bool) *uint64 { + v := NewPopulatedUInt64Value(r, easy) + return &v.Value +} + +func SizeOfStdUInt64(v uint64) int { + pv := &UInt64Value{Value: v} + return pv.Size() +} + +func StdUInt64Marshal(v uint64) ([]byte, error) { + size := SizeOfStdUInt64(v) + buf := make([]byte, size) + _, err := StdUInt64MarshalTo(v, buf) + return buf, err +} + +func StdUInt64MarshalTo(v uint64, data []byte) (int, error) { + pv := &UInt64Value{Value: v} + return pv.MarshalTo(data) +} + +func StdUInt64Unmarshal(v *uint64, data []byte) error { + pv := &UInt64Value{} + if err := pv.Unmarshal(data); err != nil { + return err + } + *v = pv.Value + return nil +} +func NewPopulatedStdInt32(r randyWrappers, easy bool) *int32 { + v := NewPopulatedInt32Value(r, easy) + return &v.Value +} + +func SizeOfStdInt32(v int32) int { + pv := &Int32Value{Value: v} + return pv.Size() +} + +func StdInt32Marshal(v int32) ([]byte, error) { + size := SizeOfStdInt32(v) + buf := make([]byte, size) + _, err := StdInt32MarshalTo(v, buf) + return buf, err +} + +func StdInt32MarshalTo(v int32, data []byte) (int, error) { + pv := &Int32Value{Value: v} + return pv.MarshalTo(data) +} + +func StdInt32Unmarshal(v *int32, data []byte) error { + pv := &Int32Value{} + if err := pv.Unmarshal(data); err != nil { + return err + } + *v = pv.Value + return nil +} +func NewPopulatedStdUInt32(r randyWrappers, easy bool) *uint32 { + v := NewPopulatedUInt32Value(r, easy) + return &v.Value +} + +func SizeOfStdUInt32(v uint32) int { + pv := &UInt32Value{Value: v} + return pv.Size() +} + +func StdUInt32Marshal(v uint32) ([]byte, error) { + size := SizeOfStdUInt32(v) + buf := make([]byte, size) + _, err := StdUInt32MarshalTo(v, buf) + return buf, err +} + +func StdUInt32MarshalTo(v uint32, data []byte) (int, error) { + pv := &UInt32Value{Value: v} + return pv.MarshalTo(data) +} + +func StdUInt32Unmarshal(v *uint32, data []byte) error { + pv := &UInt32Value{} + if err := pv.Unmarshal(data); err != nil { + return err + } + *v = pv.Value + return nil +} +func NewPopulatedStdBool(r randyWrappers, easy bool) *bool { + v := NewPopulatedBoolValue(r, easy) + return &v.Value +} + +func SizeOfStdBool(v bool) int { + pv := &BoolValue{Value: v} + return pv.Size() +} + +func StdBoolMarshal(v bool) ([]byte, error) { + size := SizeOfStdBool(v) + buf := make([]byte, size) + _, err := StdBoolMarshalTo(v, buf) + return buf, err +} + +func StdBoolMarshalTo(v bool, data []byte) (int, error) { + pv := &BoolValue{Value: v} + return pv.MarshalTo(data) +} + +func StdBoolUnmarshal(v *bool, data []byte) error { + pv := &BoolValue{} + if err := pv.Unmarshal(data); err != nil { + return err + } + *v = pv.Value + return nil +} +func NewPopulatedStdString(r randyWrappers, easy bool) *string { + v := NewPopulatedStringValue(r, easy) + return &v.Value +} + +func SizeOfStdString(v string) int { + pv := &StringValue{Value: v} + return pv.Size() +} + +func StdStringMarshal(v string) ([]byte, error) { + size := SizeOfStdString(v) + buf := make([]byte, size) + _, err := StdStringMarshalTo(v, buf) + return buf, err +} + +func StdStringMarshalTo(v string, data []byte) (int, error) { + pv := &StringValue{Value: v} + return pv.MarshalTo(data) +} + +func StdStringUnmarshal(v *string, data []byte) error { + pv := &StringValue{} + if err := pv.Unmarshal(data); err != nil { + return err + } + *v = pv.Value + return nil +} +func NewPopulatedStdBytes(r randyWrappers, easy bool) *[]byte { + v := NewPopulatedBytesValue(r, easy) + return &v.Value +} + +func SizeOfStdBytes(v []byte) int { + pv := &BytesValue{Value: v} + return pv.Size() +} + +func StdBytesMarshal(v []byte) ([]byte, error) { + size := SizeOfStdBytes(v) + buf := make([]byte, size) + _, err := StdBytesMarshalTo(v, buf) + return buf, err +} + +func StdBytesMarshalTo(v []byte, data []byte) (int, error) { + pv := &BytesValue{Value: v} + return pv.MarshalTo(data) +} + +func StdBytesUnmarshal(v *[]byte, data []byte) error { + pv := &BytesValue{} + if err := pv.Unmarshal(data); err != nil { + return err + } + *v = pv.Value + return nil +} diff --git a/vendor/github.com/golang/freetype/AUTHORS b/vendor/github.com/golang/freetype/AUTHORS new file mode 100644 index 00000000..5773ac7e --- /dev/null +++ b/vendor/github.com/golang/freetype/AUTHORS @@ -0,0 +1,20 @@ +# This is the official list of Freetype-Go authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS files. +# See the latter for an explanation. +# +# Freetype-Go is derived from Freetype, which is written in C. The latter +# is copyright 1996-2010 David Turner, Robert Wilhelm, and Werner Lemberg. + +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# Please keep the list sorted. + +Google Inc. +Jeff R. Allen +Maksim Kochkin +Michael Fogleman +Rémy Oudompheng +Roger Peppe +Steven Edwards diff --git a/vendor/github.com/golang/freetype/CONTRIBUTORS b/vendor/github.com/golang/freetype/CONTRIBUTORS new file mode 100644 index 00000000..7a1b0a27 --- /dev/null +++ b/vendor/github.com/golang/freetype/CONTRIBUTORS @@ -0,0 +1,38 @@ +# This is the official list of people who can contribute +# (and typically have contributed) code to the Freetype-Go repository. +# The AUTHORS file lists the copyright holders; this file +# lists people. For example, Google employees are listed here +# but not in AUTHORS, because Google holds the copyright. +# +# The submission process automatically checks to make sure +# that people submitting code are listed in this file (by email address). +# +# Names should be added to this file only after verifying that +# the individual or the individual's organization has agreed to +# the appropriate Contributor License Agreement, found here: +# +# http://code.google.com/legal/individual-cla-v1.0.html +# http://code.google.com/legal/corporate-cla-v1.0.html +# +# The agreement for individuals can be filled out on the web. +# +# When adding J Random Contributor's name to this file, +# either J's name or J's organization's name should be +# added to the AUTHORS file, depending on whether the +# individual or corporate CLA was used. + +# Names should be added to this file like so: +# Name + +# Please keep the list sorted. + +Andrew Gerrand +Jeff R. Allen +Maksim Kochkin +Michael Fogleman +Nigel Tao +Rémy Oudompheng +Rob Pike +Roger Peppe +Russ Cox +Steven Edwards diff --git a/vendor/github.com/golang/freetype/LICENSE b/vendor/github.com/golang/freetype/LICENSE new file mode 100644 index 00000000..e854ba5d --- /dev/null +++ b/vendor/github.com/golang/freetype/LICENSE @@ -0,0 +1,12 @@ +Use of the Freetype-Go software is subject to your choice of exactly one of +the following two licenses: + * The FreeType License, which is similar to the original BSD license with + an advertising clause, or + * The GNU General Public License (GPL), version 2 or later. + +The text of these licenses are available in the licenses/ftl.txt and the +licenses/gpl.txt files respectively. They are also available at +http://freetype.sourceforge.net/license.html + +The Luxi fonts in the testdata directory are licensed separately. See the +testdata/COPYING file for details. diff --git a/vendor/github.com/golang/freetype/README b/vendor/github.com/golang/freetype/README new file mode 100644 index 00000000..39b3d825 --- /dev/null +++ b/vendor/github.com/golang/freetype/README @@ -0,0 +1,21 @@ +The Freetype font rasterizer in the Go programming language. + +To download and install from source: +$ go get github.com/golang/freetype + +It is an incomplete port: + * It only supports TrueType fonts, and not Type 1 fonts nor bitmap fonts. + * It only supports the Unicode encoding. + +There are also some implementation differences: + * It uses a 26.6 fixed point co-ordinate system everywhere internally, + as opposed to the original Freetype's mix of 26.6 (or 10.6 for 16-bit + systems) in some places, and 24.8 in the "smooth" rasterizer. + +Freetype-Go is derived from Freetype, which is written in C. Freetype is +copyright 1996-2010 David Turner, Robert Wilhelm, and Werner Lemberg. +Freetype-Go is copyright The Freetype-Go Authors, who are listed in the +AUTHORS file. + +Unless otherwise noted, the Freetype-Go source files are distributed +under the BSD-style license found in the LICENSE file. diff --git a/vendor/github.com/golang/freetype/freetype.go b/vendor/github.com/golang/freetype/freetype.go new file mode 100644 index 00000000..96035866 --- /dev/null +++ b/vendor/github.com/golang/freetype/freetype.go @@ -0,0 +1,341 @@ +// Copyright 2010 The Freetype-Go Authors. All rights reserved. +// Use of this source code is governed by your choice of either the +// FreeType License or the GNU General Public License version 2 (or +// any later version), both of which can be found in the LICENSE file. + +// The freetype package provides a convenient API to draw text onto an image. +// Use the freetype/raster and freetype/truetype packages for lower level +// control over rasterization and TrueType parsing. +package freetype // import "github.com/golang/freetype" + +import ( + "errors" + "image" + "image/draw" + + "github.com/golang/freetype/raster" + "github.com/golang/freetype/truetype" + "golang.org/x/image/font" + "golang.org/x/image/math/fixed" +) + +// These constants determine the size of the glyph cache. The cache is keyed +// primarily by the glyph index modulo nGlyphs, and secondarily by sub-pixel +// position for the mask image. Sub-pixel positions are quantized to +// nXFractions possible values in both the x and y directions. +const ( + nGlyphs = 256 + nXFractions = 4 + nYFractions = 1 +) + +// An entry in the glyph cache is keyed explicitly by the glyph index and +// implicitly by the quantized x and y fractional offset. It maps to a mask +// image and an offset. +type cacheEntry struct { + valid bool + glyph truetype.Index + advanceWidth fixed.Int26_6 + mask *image.Alpha + offset image.Point +} + +// ParseFont just calls the Parse function from the freetype/truetype package. +// It is provided here so that code that imports this package doesn't need +// to also include the freetype/truetype package. +func ParseFont(b []byte) (*truetype.Font, error) { + return truetype.Parse(b) +} + +// Pt converts from a co-ordinate pair measured in pixels to a fixed.Point26_6 +// co-ordinate pair measured in fixed.Int26_6 units. +func Pt(x, y int) fixed.Point26_6 { + return fixed.Point26_6{ + X: fixed.Int26_6(x << 6), + Y: fixed.Int26_6(y << 6), + } +} + +// A Context holds the state for drawing text in a given font and size. +type Context struct { + r *raster.Rasterizer + f *truetype.Font + glyphBuf truetype.GlyphBuf + // clip is the clip rectangle for drawing. + clip image.Rectangle + // dst and src are the destination and source images for drawing. + dst draw.Image + src image.Image + // fontSize and dpi are used to calculate scale. scale is the number of + // 26.6 fixed point units in 1 em. hinting is the hinting policy. + fontSize, dpi float64 + scale fixed.Int26_6 + hinting font.Hinting + // cache is the glyph cache. + cache [nGlyphs * nXFractions * nYFractions]cacheEntry +} + +// PointToFixed converts the given number of points (as in "a 12 point font") +// into a 26.6 fixed point number of pixels. +func (c *Context) PointToFixed(x float64) fixed.Int26_6 { + return fixed.Int26_6(x * float64(c.dpi) * (64.0 / 72.0)) +} + +// drawContour draws the given closed contour with the given offset. +func (c *Context) drawContour(ps []truetype.Point, dx, dy fixed.Int26_6) { + if len(ps) == 0 { + return + } + + // The low bit of each point's Flags value is whether the point is on the + // curve. Truetype fonts only have quadratic Bézier curves, not cubics. + // Thus, two consecutive off-curve points imply an on-curve point in the + // middle of those two. + // + // See http://chanae.walon.org/pub/ttf/ttf_glyphs.htm for more details. + + // ps[0] is a truetype.Point measured in FUnits and positive Y going + // upwards. start is the same thing measured in fixed point units and + // positive Y going downwards, and offset by (dx, dy). + start := fixed.Point26_6{ + X: dx + ps[0].X, + Y: dy - ps[0].Y, + } + others := []truetype.Point(nil) + if ps[0].Flags&0x01 != 0 { + others = ps[1:] + } else { + last := fixed.Point26_6{ + X: dx + ps[len(ps)-1].X, + Y: dy - ps[len(ps)-1].Y, + } + if ps[len(ps)-1].Flags&0x01 != 0 { + start = last + others = ps[:len(ps)-1] + } else { + start = fixed.Point26_6{ + X: (start.X + last.X) / 2, + Y: (start.Y + last.Y) / 2, + } + others = ps + } + } + c.r.Start(start) + q0, on0 := start, true + for _, p := range others { + q := fixed.Point26_6{ + X: dx + p.X, + Y: dy - p.Y, + } + on := p.Flags&0x01 != 0 + if on { + if on0 { + c.r.Add1(q) + } else { + c.r.Add2(q0, q) + } + } else { + if on0 { + // No-op. + } else { + mid := fixed.Point26_6{ + X: (q0.X + q.X) / 2, + Y: (q0.Y + q.Y) / 2, + } + c.r.Add2(q0, mid) + } + } + q0, on0 = q, on + } + // Close the curve. + if on0 { + c.r.Add1(start) + } else { + c.r.Add2(q0, start) + } +} + +// rasterize returns the advance width, glyph mask and integer-pixel offset +// to render the given glyph at the given sub-pixel offsets. +// The 26.6 fixed point arguments fx and fy must be in the range [0, 1). +func (c *Context) rasterize(glyph truetype.Index, fx, fy fixed.Int26_6) ( + fixed.Int26_6, *image.Alpha, image.Point, error) { + + if err := c.glyphBuf.Load(c.f, c.scale, glyph, c.hinting); err != nil { + return 0, nil, image.Point{}, err + } + // Calculate the integer-pixel bounds for the glyph. + xmin := int(fx+c.glyphBuf.Bounds.Min.X) >> 6 + ymin := int(fy-c.glyphBuf.Bounds.Max.Y) >> 6 + xmax := int(fx+c.glyphBuf.Bounds.Max.X+0x3f) >> 6 + ymax := int(fy-c.glyphBuf.Bounds.Min.Y+0x3f) >> 6 + if xmin > xmax || ymin > ymax { + return 0, nil, image.Point{}, errors.New("freetype: negative sized glyph") + } + // A TrueType's glyph's nodes can have negative co-ordinates, but the + // rasterizer clips anything left of x=0 or above y=0. xmin and ymin are + // the pixel offsets, based on the font's FUnit metrics, that let a + // negative co-ordinate in TrueType space be non-negative in rasterizer + // space. xmin and ymin are typically <= 0. + fx -= fixed.Int26_6(xmin << 6) + fy -= fixed.Int26_6(ymin << 6) + // Rasterize the glyph's vectors. + c.r.Clear() + e0 := 0 + for _, e1 := range c.glyphBuf.Ends { + c.drawContour(c.glyphBuf.Points[e0:e1], fx, fy) + e0 = e1 + } + a := image.NewAlpha(image.Rect(0, 0, xmax-xmin, ymax-ymin)) + c.r.Rasterize(raster.NewAlphaSrcPainter(a)) + return c.glyphBuf.AdvanceWidth, a, image.Point{xmin, ymin}, nil +} + +// glyph returns the advance width, glyph mask and integer-pixel offset to +// render the given glyph at the given sub-pixel point. It is a cache for the +// rasterize method. Unlike rasterize, p's co-ordinates do not have to be in +// the range [0, 1). +func (c *Context) glyph(glyph truetype.Index, p fixed.Point26_6) ( + fixed.Int26_6, *image.Alpha, image.Point, error) { + + // Split p.X and p.Y into their integer and fractional parts. + ix, fx := int(p.X>>6), p.X&0x3f + iy, fy := int(p.Y>>6), p.Y&0x3f + // Calculate the index t into the cache array. + tg := int(glyph) % nGlyphs + tx := int(fx) / (64 / nXFractions) + ty := int(fy) / (64 / nYFractions) + t := ((tg*nXFractions)+tx)*nYFractions + ty + // Check for a cache hit. + if e := c.cache[t]; e.valid && e.glyph == glyph { + return e.advanceWidth, e.mask, e.offset.Add(image.Point{ix, iy}), nil + } + // Rasterize the glyph and put the result into the cache. + advanceWidth, mask, offset, err := c.rasterize(glyph, fx, fy) + if err != nil { + return 0, nil, image.Point{}, err + } + c.cache[t] = cacheEntry{true, glyph, advanceWidth, mask, offset} + return advanceWidth, mask, offset.Add(image.Point{ix, iy}), nil +} + +// DrawString draws s at p and returns p advanced by the text extent. The text +// is placed so that the left edge of the em square of the first character of s +// and the baseline intersect at p. The majority of the affected pixels will be +// above and to the right of the point, but some may be below or to the left. +// For example, drawing a string that starts with a 'J' in an italic font may +// affect pixels below and left of the point. +// +// p is a fixed.Point26_6 and can therefore represent sub-pixel positions. +func (c *Context) DrawString(s string, p fixed.Point26_6) (fixed.Point26_6, error) { + if c.f == nil { + return fixed.Point26_6{}, errors.New("freetype: DrawText called with a nil font") + } + prev, hasPrev := truetype.Index(0), false + for _, rune := range s { + index := c.f.Index(rune) + if hasPrev { + kern := c.f.Kern(c.scale, prev, index) + if c.hinting != font.HintingNone { + kern = (kern + 32) &^ 63 + } + p.X += kern + } + advanceWidth, mask, offset, err := c.glyph(index, p) + if err != nil { + return fixed.Point26_6{}, err + } + p.X += advanceWidth + glyphRect := mask.Bounds().Add(offset) + dr := c.clip.Intersect(glyphRect) + if !dr.Empty() { + mp := image.Point{0, dr.Min.Y - glyphRect.Min.Y} + draw.DrawMask(c.dst, dr, c.src, image.ZP, mask, mp, draw.Over) + } + prev, hasPrev = index, true + } + return p, nil +} + +// recalc recalculates scale and bounds values from the font size, screen +// resolution and font metrics, and invalidates the glyph cache. +func (c *Context) recalc() { + c.scale = fixed.Int26_6(c.fontSize * c.dpi * (64.0 / 72.0)) + if c.f == nil { + c.r.SetBounds(0, 0) + } else { + // Set the rasterizer's bounds to be big enough to handle the largest glyph. + b := c.f.Bounds(c.scale) + xmin := +int(b.Min.X) >> 6 + ymin := -int(b.Max.Y) >> 6 + xmax := +int(b.Max.X+63) >> 6 + ymax := -int(b.Min.Y-63) >> 6 + c.r.SetBounds(xmax-xmin, ymax-ymin) + } + for i := range c.cache { + c.cache[i] = cacheEntry{} + } +} + +// SetDPI sets the screen resolution in dots per inch. +func (c *Context) SetDPI(dpi float64) { + if c.dpi == dpi { + return + } + c.dpi = dpi + c.recalc() +} + +// SetFont sets the font used to draw text. +func (c *Context) SetFont(f *truetype.Font) { + if c.f == f { + return + } + c.f = f + c.recalc() +} + +// SetFontSize sets the font size in points (as in "a 12 point font"). +func (c *Context) SetFontSize(fontSize float64) { + if c.fontSize == fontSize { + return + } + c.fontSize = fontSize + c.recalc() +} + +// SetHinting sets the hinting policy. +func (c *Context) SetHinting(hinting font.Hinting) { + c.hinting = hinting + for i := range c.cache { + c.cache[i] = cacheEntry{} + } +} + +// SetDst sets the destination image for draw operations. +func (c *Context) SetDst(dst draw.Image) { + c.dst = dst +} + +// SetSrc sets the source image for draw operations. This is typically an +// image.Uniform. +func (c *Context) SetSrc(src image.Image) { + c.src = src +} + +// SetClip sets the clip rectangle for drawing. +func (c *Context) SetClip(clip image.Rectangle) { + c.clip = clip +} + +// TODO(nigeltao): implement Context.SetGamma. + +// NewContext creates a new Context. +func NewContext() *Context { + return &Context{ + r: raster.NewRasterizer(0, 0), + fontSize: 12, + dpi: 72, + scale: 12 << 6, + } +} diff --git a/vendor/github.com/golang/freetype/raster/geom.go b/vendor/github.com/golang/freetype/raster/geom.go new file mode 100644 index 00000000..f3696ea9 --- /dev/null +++ b/vendor/github.com/golang/freetype/raster/geom.go @@ -0,0 +1,245 @@ +// Copyright 2010 The Freetype-Go Authors. All rights reserved. +// Use of this source code is governed by your choice of either the +// FreeType License or the GNU General Public License version 2 (or +// any later version), both of which can be found in the LICENSE file. + +package raster + +import ( + "fmt" + "math" + + "golang.org/x/image/math/fixed" +) + +// maxAbs returns the maximum of abs(a) and abs(b). +func maxAbs(a, b fixed.Int26_6) fixed.Int26_6 { + if a < 0 { + a = -a + } + if b < 0 { + b = -b + } + if a < b { + return b + } + return a +} + +// pNeg returns the vector -p, or equivalently p rotated by 180 degrees. +func pNeg(p fixed.Point26_6) fixed.Point26_6 { + return fixed.Point26_6{-p.X, -p.Y} +} + +// pDot returns the dot product p·q. +func pDot(p fixed.Point26_6, q fixed.Point26_6) fixed.Int52_12 { + px, py := int64(p.X), int64(p.Y) + qx, qy := int64(q.X), int64(q.Y) + return fixed.Int52_12(px*qx + py*qy) +} + +// pLen returns the length of the vector p. +func pLen(p fixed.Point26_6) fixed.Int26_6 { + // TODO(nigeltao): use fixed point math. + x := float64(p.X) + y := float64(p.Y) + return fixed.Int26_6(math.Sqrt(x*x + y*y)) +} + +// pNorm returns the vector p normalized to the given length, or zero if p is +// degenerate. +func pNorm(p fixed.Point26_6, length fixed.Int26_6) fixed.Point26_6 { + d := pLen(p) + if d == 0 { + return fixed.Point26_6{} + } + s, t := int64(length), int64(d) + x := int64(p.X) * s / t + y := int64(p.Y) * s / t + return fixed.Point26_6{fixed.Int26_6(x), fixed.Int26_6(y)} +} + +// pRot45CW returns the vector p rotated clockwise by 45 degrees. +// +// Note that the Y-axis grows downwards, so {1, 0}.Rot45CW is {1/√2, 1/√2}. +func pRot45CW(p fixed.Point26_6) fixed.Point26_6 { + // 181/256 is approximately 1/√2, or sin(π/4). + px, py := int64(p.X), int64(p.Y) + qx := (+px - py) * 181 / 256 + qy := (+px + py) * 181 / 256 + return fixed.Point26_6{fixed.Int26_6(qx), fixed.Int26_6(qy)} +} + +// pRot90CW returns the vector p rotated clockwise by 90 degrees. +// +// Note that the Y-axis grows downwards, so {1, 0}.Rot90CW is {0, 1}. +func pRot90CW(p fixed.Point26_6) fixed.Point26_6 { + return fixed.Point26_6{-p.Y, p.X} +} + +// pRot135CW returns the vector p rotated clockwise by 135 degrees. +// +// Note that the Y-axis grows downwards, so {1, 0}.Rot135CW is {-1/√2, 1/√2}. +func pRot135CW(p fixed.Point26_6) fixed.Point26_6 { + // 181/256 is approximately 1/√2, or sin(π/4). + px, py := int64(p.X), int64(p.Y) + qx := (-px - py) * 181 / 256 + qy := (+px - py) * 181 / 256 + return fixed.Point26_6{fixed.Int26_6(qx), fixed.Int26_6(qy)} +} + +// pRot45CCW returns the vector p rotated counter-clockwise by 45 degrees. +// +// Note that the Y-axis grows downwards, so {1, 0}.Rot45CCW is {1/√2, -1/√2}. +func pRot45CCW(p fixed.Point26_6) fixed.Point26_6 { + // 181/256 is approximately 1/√2, or sin(π/4). + px, py := int64(p.X), int64(p.Y) + qx := (+px + py) * 181 / 256 + qy := (-px + py) * 181 / 256 + return fixed.Point26_6{fixed.Int26_6(qx), fixed.Int26_6(qy)} +} + +// pRot90CCW returns the vector p rotated counter-clockwise by 90 degrees. +// +// Note that the Y-axis grows downwards, so {1, 0}.Rot90CCW is {0, -1}. +func pRot90CCW(p fixed.Point26_6) fixed.Point26_6 { + return fixed.Point26_6{p.Y, -p.X} +} + +// pRot135CCW returns the vector p rotated counter-clockwise by 135 degrees. +// +// Note that the Y-axis grows downwards, so {1, 0}.Rot135CCW is {-1/√2, -1/√2}. +func pRot135CCW(p fixed.Point26_6) fixed.Point26_6 { + // 181/256 is approximately 1/√2, or sin(π/4). + px, py := int64(p.X), int64(p.Y) + qx := (-px + py) * 181 / 256 + qy := (-px - py) * 181 / 256 + return fixed.Point26_6{fixed.Int26_6(qx), fixed.Int26_6(qy)} +} + +// An Adder accumulates points on a curve. +type Adder interface { + // Start starts a new curve at the given point. + Start(a fixed.Point26_6) + // Add1 adds a linear segment to the current curve. + Add1(b fixed.Point26_6) + // Add2 adds a quadratic segment to the current curve. + Add2(b, c fixed.Point26_6) + // Add3 adds a cubic segment to the current curve. + Add3(b, c, d fixed.Point26_6) +} + +// A Path is a sequence of curves, and a curve is a start point followed by a +// sequence of linear, quadratic or cubic segments. +type Path []fixed.Int26_6 + +// String returns a human-readable representation of a Path. +func (p Path) String() string { + s := "" + for i := 0; i < len(p); { + if i != 0 { + s += " " + } + switch p[i] { + case 0: + s += "S0" + fmt.Sprint([]fixed.Int26_6(p[i+1:i+3])) + i += 4 + case 1: + s += "A1" + fmt.Sprint([]fixed.Int26_6(p[i+1:i+3])) + i += 4 + case 2: + s += "A2" + fmt.Sprint([]fixed.Int26_6(p[i+1:i+5])) + i += 6 + case 3: + s += "A3" + fmt.Sprint([]fixed.Int26_6(p[i+1:i+7])) + i += 8 + default: + panic("freetype/raster: bad path") + } + } + return s +} + +// Clear cancels any previous calls to p.Start or p.AddXxx. +func (p *Path) Clear() { + *p = (*p)[:0] +} + +// Start starts a new curve at the given point. +func (p *Path) Start(a fixed.Point26_6) { + *p = append(*p, 0, a.X, a.Y, 0) +} + +// Add1 adds a linear segment to the current curve. +func (p *Path) Add1(b fixed.Point26_6) { + *p = append(*p, 1, b.X, b.Y, 1) +} + +// Add2 adds a quadratic segment to the current curve. +func (p *Path) Add2(b, c fixed.Point26_6) { + *p = append(*p, 2, b.X, b.Y, c.X, c.Y, 2) +} + +// Add3 adds a cubic segment to the current curve. +func (p *Path) Add3(b, c, d fixed.Point26_6) { + *p = append(*p, 3, b.X, b.Y, c.X, c.Y, d.X, d.Y, 3) +} + +// AddPath adds the Path q to p. +func (p *Path) AddPath(q Path) { + *p = append(*p, q...) +} + +// AddStroke adds a stroked Path. +func (p *Path) AddStroke(q Path, width fixed.Int26_6, cr Capper, jr Joiner) { + Stroke(p, q, width, cr, jr) +} + +// firstPoint returns the first point in a non-empty Path. +func (p Path) firstPoint() fixed.Point26_6 { + return fixed.Point26_6{p[1], p[2]} +} + +// lastPoint returns the last point in a non-empty Path. +func (p Path) lastPoint() fixed.Point26_6 { + return fixed.Point26_6{p[len(p)-3], p[len(p)-2]} +} + +// addPathReversed adds q reversed to p. +// For example, if q consists of a linear segment from A to B followed by a +// quadratic segment from B to C to D, then the values of q looks like: +// index: 01234567890123 +// value: 0AA01BB12CCDD2 +// So, when adding q backwards to p, we want to Add2(C, B) followed by Add1(A). +func addPathReversed(p Adder, q Path) { + if len(q) == 0 { + return + } + i := len(q) - 1 + for { + switch q[i] { + case 0: + return + case 1: + i -= 4 + p.Add1( + fixed.Point26_6{q[i-2], q[i-1]}, + ) + case 2: + i -= 6 + p.Add2( + fixed.Point26_6{q[i+2], q[i+3]}, + fixed.Point26_6{q[i-2], q[i-1]}, + ) + case 3: + i -= 8 + p.Add3( + fixed.Point26_6{q[i+4], q[i+5]}, + fixed.Point26_6{q[i+2], q[i+3]}, + fixed.Point26_6{q[i-2], q[i-1]}, + ) + default: + panic("freetype/raster: bad path") + } + } +} diff --git a/vendor/github.com/golang/freetype/raster/paint.go b/vendor/github.com/golang/freetype/raster/paint.go new file mode 100644 index 00000000..652256cc --- /dev/null +++ b/vendor/github.com/golang/freetype/raster/paint.go @@ -0,0 +1,287 @@ +// Copyright 2010 The Freetype-Go Authors. All rights reserved. +// Use of this source code is governed by your choice of either the +// FreeType License or the GNU General Public License version 2 (or +// any later version), both of which can be found in the LICENSE file. + +package raster + +import ( + "image" + "image/color" + "image/draw" + "math" +) + +// A Span is a horizontal segment of pixels with constant alpha. X0 is an +// inclusive bound and X1 is exclusive, the same as for slices. A fully opaque +// Span has Alpha == 0xffff. +type Span struct { + Y, X0, X1 int + Alpha uint32 +} + +// A Painter knows how to paint a batch of Spans. Rasterization may involve +// Painting multiple batches, and done will be true for the final batch. The +// Spans' Y values are monotonically increasing during a rasterization. Paint +// may use all of ss as scratch space during the call. +type Painter interface { + Paint(ss []Span, done bool) +} + +// The PainterFunc type adapts an ordinary function to the Painter interface. +type PainterFunc func(ss []Span, done bool) + +// Paint just delegates the call to f. +func (f PainterFunc) Paint(ss []Span, done bool) { f(ss, done) } + +// An AlphaOverPainter is a Painter that paints Spans onto a *image.Alpha using +// the Over Porter-Duff composition operator. +type AlphaOverPainter struct { + Image *image.Alpha +} + +// Paint satisfies the Painter interface. +func (r AlphaOverPainter) Paint(ss []Span, done bool) { + b := r.Image.Bounds() + for _, s := range ss { + if s.Y < b.Min.Y { + continue + } + if s.Y >= b.Max.Y { + return + } + if s.X0 < b.Min.X { + s.X0 = b.Min.X + } + if s.X1 > b.Max.X { + s.X1 = b.Max.X + } + if s.X0 >= s.X1 { + continue + } + base := (s.Y-r.Image.Rect.Min.Y)*r.Image.Stride - r.Image.Rect.Min.X + p := r.Image.Pix[base+s.X0 : base+s.X1] + a := int(s.Alpha >> 8) + for i, c := range p { + v := int(c) + p[i] = uint8((v*255 + (255-v)*a) / 255) + } + } +} + +// NewAlphaOverPainter creates a new AlphaOverPainter for the given image. +func NewAlphaOverPainter(m *image.Alpha) AlphaOverPainter { + return AlphaOverPainter{m} +} + +// An AlphaSrcPainter is a Painter that paints Spans onto a *image.Alpha using +// the Src Porter-Duff composition operator. +type AlphaSrcPainter struct { + Image *image.Alpha +} + +// Paint satisfies the Painter interface. +func (r AlphaSrcPainter) Paint(ss []Span, done bool) { + b := r.Image.Bounds() + for _, s := range ss { + if s.Y < b.Min.Y { + continue + } + if s.Y >= b.Max.Y { + return + } + if s.X0 < b.Min.X { + s.X0 = b.Min.X + } + if s.X1 > b.Max.X { + s.X1 = b.Max.X + } + if s.X0 >= s.X1 { + continue + } + base := (s.Y-r.Image.Rect.Min.Y)*r.Image.Stride - r.Image.Rect.Min.X + p := r.Image.Pix[base+s.X0 : base+s.X1] + color := uint8(s.Alpha >> 8) + for i := range p { + p[i] = color + } + } +} + +// NewAlphaSrcPainter creates a new AlphaSrcPainter for the given image. +func NewAlphaSrcPainter(m *image.Alpha) AlphaSrcPainter { + return AlphaSrcPainter{m} +} + +// An RGBAPainter is a Painter that paints Spans onto a *image.RGBA. +type RGBAPainter struct { + // Image is the image to compose onto. + Image *image.RGBA + // Op is the Porter-Duff composition operator. + Op draw.Op + // cr, cg, cb and ca are the 16-bit color to paint the spans. + cr, cg, cb, ca uint32 +} + +// Paint satisfies the Painter interface. +func (r *RGBAPainter) Paint(ss []Span, done bool) { + b := r.Image.Bounds() + for _, s := range ss { + if s.Y < b.Min.Y { + continue + } + if s.Y >= b.Max.Y { + return + } + if s.X0 < b.Min.X { + s.X0 = b.Min.X + } + if s.X1 > b.Max.X { + s.X1 = b.Max.X + } + if s.X0 >= s.X1 { + continue + } + // This code mimics drawGlyphOver in $GOROOT/src/image/draw/draw.go. + ma := s.Alpha + const m = 1<<16 - 1 + i0 := (s.Y-r.Image.Rect.Min.Y)*r.Image.Stride + (s.X0-r.Image.Rect.Min.X)*4 + i1 := i0 + (s.X1-s.X0)*4 + if r.Op == draw.Over { + for i := i0; i < i1; i += 4 { + dr := uint32(r.Image.Pix[i+0]) + dg := uint32(r.Image.Pix[i+1]) + db := uint32(r.Image.Pix[i+2]) + da := uint32(r.Image.Pix[i+3]) + a := (m - (r.ca * ma / m)) * 0x101 + r.Image.Pix[i+0] = uint8((dr*a + r.cr*ma) / m >> 8) + r.Image.Pix[i+1] = uint8((dg*a + r.cg*ma) / m >> 8) + r.Image.Pix[i+2] = uint8((db*a + r.cb*ma) / m >> 8) + r.Image.Pix[i+3] = uint8((da*a + r.ca*ma) / m >> 8) + } + } else { + for i := i0; i < i1; i += 4 { + r.Image.Pix[i+0] = uint8(r.cr * ma / m >> 8) + r.Image.Pix[i+1] = uint8(r.cg * ma / m >> 8) + r.Image.Pix[i+2] = uint8(r.cb * ma / m >> 8) + r.Image.Pix[i+3] = uint8(r.ca * ma / m >> 8) + } + } + } +} + +// SetColor sets the color to paint the spans. +func (r *RGBAPainter) SetColor(c color.Color) { + r.cr, r.cg, r.cb, r.ca = c.RGBA() +} + +// NewRGBAPainter creates a new RGBAPainter for the given image. +func NewRGBAPainter(m *image.RGBA) *RGBAPainter { + return &RGBAPainter{Image: m} +} + +// A MonochromePainter wraps another Painter, quantizing each Span's alpha to +// be either fully opaque or fully transparent. +type MonochromePainter struct { + Painter Painter + y, x0, x1 int +} + +// Paint delegates to the wrapped Painter after quantizing each Span's alpha +// value and merging adjacent fully opaque Spans. +func (m *MonochromePainter) Paint(ss []Span, done bool) { + // We compact the ss slice, discarding any Spans whose alpha quantizes to zero. + j := 0 + for _, s := range ss { + if s.Alpha >= 0x8000 { + if m.y == s.Y && m.x1 == s.X0 { + m.x1 = s.X1 + } else { + ss[j] = Span{m.y, m.x0, m.x1, 1<<16 - 1} + j++ + m.y, m.x0, m.x1 = s.Y, s.X0, s.X1 + } + } + } + if done { + // Flush the accumulated Span. + finalSpan := Span{m.y, m.x0, m.x1, 1<<16 - 1} + if j < len(ss) { + ss[j] = finalSpan + j++ + m.Painter.Paint(ss[:j], true) + } else if j == len(ss) { + m.Painter.Paint(ss, false) + if cap(ss) > 0 { + ss = ss[:1] + } else { + ss = make([]Span, 1) + } + ss[0] = finalSpan + m.Painter.Paint(ss, true) + } else { + panic("unreachable") + } + // Reset the accumulator, so that this Painter can be re-used. + m.y, m.x0, m.x1 = 0, 0, 0 + } else { + m.Painter.Paint(ss[:j], false) + } +} + +// NewMonochromePainter creates a new MonochromePainter that wraps the given +// Painter. +func NewMonochromePainter(p Painter) *MonochromePainter { + return &MonochromePainter{Painter: p} +} + +// A GammaCorrectionPainter wraps another Painter, performing gamma-correction +// on each Span's alpha value. +type GammaCorrectionPainter struct { + // Painter is the wrapped Painter. + Painter Painter + // a is the precomputed alpha values for linear interpolation, with fully + // opaque == 0xffff. + a [256]uint16 + // gammaIsOne is whether gamma correction is a no-op. + gammaIsOne bool +} + +// Paint delegates to the wrapped Painter after performing gamma-correction on +// each Span. +func (g *GammaCorrectionPainter) Paint(ss []Span, done bool) { + if !g.gammaIsOne { + const n = 0x101 + for i, s := range ss { + if s.Alpha == 0 || s.Alpha == 0xffff { + continue + } + p, q := s.Alpha/n, s.Alpha%n + // The resultant alpha is a linear interpolation of g.a[p] and g.a[p+1]. + a := uint32(g.a[p])*(n-q) + uint32(g.a[p+1])*q + ss[i].Alpha = (a + n/2) / n + } + } + g.Painter.Paint(ss, done) +} + +// SetGamma sets the gamma value. +func (g *GammaCorrectionPainter) SetGamma(gamma float64) { + g.gammaIsOne = gamma == 1 + if g.gammaIsOne { + return + } + for i := 0; i < 256; i++ { + a := float64(i) / 0xff + a = math.Pow(a, gamma) + g.a[i] = uint16(0xffff * a) + } +} + +// NewGammaCorrectionPainter creates a new GammaCorrectionPainter that wraps +// the given Painter. +func NewGammaCorrectionPainter(p Painter, gamma float64) *GammaCorrectionPainter { + g := &GammaCorrectionPainter{Painter: p} + g.SetGamma(gamma) + return g +} diff --git a/vendor/github.com/golang/freetype/raster/raster.go b/vendor/github.com/golang/freetype/raster/raster.go new file mode 100644 index 00000000..7e6cd4e2 --- /dev/null +++ b/vendor/github.com/golang/freetype/raster/raster.go @@ -0,0 +1,601 @@ +// Copyright 2010 The Freetype-Go Authors. All rights reserved. +// Use of this source code is governed by your choice of either the +// FreeType License or the GNU General Public License version 2 (or +// any later version), both of which can be found in the LICENSE file. + +// Package raster provides an anti-aliasing 2-D rasterizer. +// +// It is part of the larger Freetype suite of font-related packages, but the +// raster package is not specific to font rasterization, and can be used +// standalone without any other Freetype package. +// +// Rasterization is done by the same area/coverage accumulation algorithm as +// the Freetype "smooth" module, and the Anti-Grain Geometry library. A +// description of the area/coverage algorithm is at +// http://projects.tuxee.net/cl-vectors/section-the-cl-aa-algorithm +package raster // import "github.com/golang/freetype/raster" + +import ( + "strconv" + + "golang.org/x/image/math/fixed" +) + +// A cell is part of a linked list (for a given yi co-ordinate) of accumulated +// area/coverage for the pixel at (xi, yi). +type cell struct { + xi int + area, cover int + next int +} + +type Rasterizer struct { + // If false, the default behavior is to use the even-odd winding fill + // rule during Rasterize. + UseNonZeroWinding bool + // An offset (in pixels) to the painted spans. + Dx, Dy int + + // The width of the Rasterizer. The height is implicit in len(cellIndex). + width int + // splitScaleN is the scaling factor used to determine how many times + // to decompose a quadratic or cubic segment into a linear approximation. + splitScale2, splitScale3 int + + // The current pen position. + a fixed.Point26_6 + // The current cell and its area/coverage being accumulated. + xi, yi int + area, cover int + + // Saved cells. + cell []cell + // Linked list of cells, one per row. + cellIndex []int + // Buffers. + cellBuf [256]cell + cellIndexBuf [64]int + spanBuf [64]Span +} + +// findCell returns the index in r.cell for the cell corresponding to +// (r.xi, r.yi). The cell is created if necessary. +func (r *Rasterizer) findCell() int { + if r.yi < 0 || r.yi >= len(r.cellIndex) { + return -1 + } + xi := r.xi + if xi < 0 { + xi = -1 + } else if xi > r.width { + xi = r.width + } + i, prev := r.cellIndex[r.yi], -1 + for i != -1 && r.cell[i].xi <= xi { + if r.cell[i].xi == xi { + return i + } + i, prev = r.cell[i].next, i + } + c := len(r.cell) + if c == cap(r.cell) { + buf := make([]cell, c, 4*c) + copy(buf, r.cell) + r.cell = buf[0 : c+1] + } else { + r.cell = r.cell[0 : c+1] + } + r.cell[c] = cell{xi, 0, 0, i} + if prev == -1 { + r.cellIndex[r.yi] = c + } else { + r.cell[prev].next = c + } + return c +} + +// saveCell saves any accumulated r.area/r.cover for (r.xi, r.yi). +func (r *Rasterizer) saveCell() { + if r.area != 0 || r.cover != 0 { + i := r.findCell() + if i != -1 { + r.cell[i].area += r.area + r.cell[i].cover += r.cover + } + r.area = 0 + r.cover = 0 + } +} + +// setCell sets the (xi, yi) cell that r is accumulating area/coverage for. +func (r *Rasterizer) setCell(xi, yi int) { + if r.xi != xi || r.yi != yi { + r.saveCell() + r.xi, r.yi = xi, yi + } +} + +// scan accumulates area/coverage for the yi'th scanline, going from +// x0 to x1 in the horizontal direction (in 26.6 fixed point co-ordinates) +// and from y0f to y1f fractional vertical units within that scanline. +func (r *Rasterizer) scan(yi int, x0, y0f, x1, y1f fixed.Int26_6) { + // Break the 26.6 fixed point X co-ordinates into integral and fractional parts. + x0i := int(x0) / 64 + x0f := x0 - fixed.Int26_6(64*x0i) + x1i := int(x1) / 64 + x1f := x1 - fixed.Int26_6(64*x1i) + + // A perfectly horizontal scan. + if y0f == y1f { + r.setCell(x1i, yi) + return + } + dx, dy := x1-x0, y1f-y0f + // A single cell scan. + if x0i == x1i { + r.area += int((x0f + x1f) * dy) + r.cover += int(dy) + return + } + // There are at least two cells. Apart from the first and last cells, + // all intermediate cells go through the full width of the cell, + // or 64 units in 26.6 fixed point format. + var ( + p, q, edge0, edge1 fixed.Int26_6 + xiDelta int + ) + if dx > 0 { + p, q = (64-x0f)*dy, dx + edge0, edge1, xiDelta = 0, 64, 1 + } else { + p, q = x0f*dy, -dx + edge0, edge1, xiDelta = 64, 0, -1 + } + yDelta, yRem := p/q, p%q + if yRem < 0 { + yDelta -= 1 + yRem += q + } + // Do the first cell. + xi, y := x0i, y0f + r.area += int((x0f + edge1) * yDelta) + r.cover += int(yDelta) + xi, y = xi+xiDelta, y+yDelta + r.setCell(xi, yi) + if xi != x1i { + // Do all the intermediate cells. + p = 64 * (y1f - y + yDelta) + fullDelta, fullRem := p/q, p%q + if fullRem < 0 { + fullDelta -= 1 + fullRem += q + } + yRem -= q + for xi != x1i { + yDelta = fullDelta + yRem += fullRem + if yRem >= 0 { + yDelta += 1 + yRem -= q + } + r.area += int(64 * yDelta) + r.cover += int(yDelta) + xi, y = xi+xiDelta, y+yDelta + r.setCell(xi, yi) + } + } + // Do the last cell. + yDelta = y1f - y + r.area += int((edge0 + x1f) * yDelta) + r.cover += int(yDelta) +} + +// Start starts a new curve at the given point. +func (r *Rasterizer) Start(a fixed.Point26_6) { + r.setCell(int(a.X/64), int(a.Y/64)) + r.a = a +} + +// Add1 adds a linear segment to the current curve. +func (r *Rasterizer) Add1(b fixed.Point26_6) { + x0, y0 := r.a.X, r.a.Y + x1, y1 := b.X, b.Y + dx, dy := x1-x0, y1-y0 + // Break the 26.6 fixed point Y co-ordinates into integral and fractional + // parts. + y0i := int(y0) / 64 + y0f := y0 - fixed.Int26_6(64*y0i) + y1i := int(y1) / 64 + y1f := y1 - fixed.Int26_6(64*y1i) + + if y0i == y1i { + // There is only one scanline. + r.scan(y0i, x0, y0f, x1, y1f) + + } else if dx == 0 { + // This is a vertical line segment. We avoid calling r.scan and instead + // manipulate r.area and r.cover directly. + var ( + edge0, edge1 fixed.Int26_6 + yiDelta int + ) + if dy > 0 { + edge0, edge1, yiDelta = 0, 64, 1 + } else { + edge0, edge1, yiDelta = 64, 0, -1 + } + x0i, yi := int(x0)/64, y0i + x0fTimes2 := (int(x0) - (64 * x0i)) * 2 + // Do the first pixel. + dcover := int(edge1 - y0f) + darea := int(x0fTimes2 * dcover) + r.area += darea + r.cover += dcover + yi += yiDelta + r.setCell(x0i, yi) + // Do all the intermediate pixels. + dcover = int(edge1 - edge0) + darea = int(x0fTimes2 * dcover) + for yi != y1i { + r.area += darea + r.cover += dcover + yi += yiDelta + r.setCell(x0i, yi) + } + // Do the last pixel. + dcover = int(y1f - edge0) + darea = int(x0fTimes2 * dcover) + r.area += darea + r.cover += dcover + + } else { + // There are at least two scanlines. Apart from the first and last + // scanlines, all intermediate scanlines go through the full height of + // the row, or 64 units in 26.6 fixed point format. + var ( + p, q, edge0, edge1 fixed.Int26_6 + yiDelta int + ) + if dy > 0 { + p, q = (64-y0f)*dx, dy + edge0, edge1, yiDelta = 0, 64, 1 + } else { + p, q = y0f*dx, -dy + edge0, edge1, yiDelta = 64, 0, -1 + } + xDelta, xRem := p/q, p%q + if xRem < 0 { + xDelta -= 1 + xRem += q + } + // Do the first scanline. + x, yi := x0, y0i + r.scan(yi, x, y0f, x+xDelta, edge1) + x, yi = x+xDelta, yi+yiDelta + r.setCell(int(x)/64, yi) + if yi != y1i { + // Do all the intermediate scanlines. + p = 64 * dx + fullDelta, fullRem := p/q, p%q + if fullRem < 0 { + fullDelta -= 1 + fullRem += q + } + xRem -= q + for yi != y1i { + xDelta = fullDelta + xRem += fullRem + if xRem >= 0 { + xDelta += 1 + xRem -= q + } + r.scan(yi, x, edge0, x+xDelta, edge1) + x, yi = x+xDelta, yi+yiDelta + r.setCell(int(x)/64, yi) + } + } + // Do the last scanline. + r.scan(yi, x, edge0, x1, y1f) + } + // The next lineTo starts from b. + r.a = b +} + +// Add2 adds a quadratic segment to the current curve. +func (r *Rasterizer) Add2(b, c fixed.Point26_6) { + // Calculate nSplit (the number of recursive decompositions) based on how + // 'curvy' it is. Specifically, how much the middle point b deviates from + // (a+c)/2. + dev := maxAbs(r.a.X-2*b.X+c.X, r.a.Y-2*b.Y+c.Y) / fixed.Int26_6(r.splitScale2) + nsplit := 0 + for dev > 0 { + dev /= 4 + nsplit++ + } + // dev is 32-bit, and nsplit++ every time we shift off 2 bits, so maxNsplit + // is 16. + const maxNsplit = 16 + if nsplit > maxNsplit { + panic("freetype/raster: Add2 nsplit too large: " + strconv.Itoa(nsplit)) + } + // Recursively decompose the curve nSplit levels deep. + var ( + pStack [2*maxNsplit + 3]fixed.Point26_6 + sStack [maxNsplit + 1]int + i int + ) + sStack[0] = nsplit + pStack[0] = c + pStack[1] = b + pStack[2] = r.a + for i >= 0 { + s := sStack[i] + p := pStack[2*i:] + if s > 0 { + // Split the quadratic curve p[:3] into an equivalent set of two + // shorter curves: p[:3] and p[2:5]. The new p[4] is the old p[2], + // and p[0] is unchanged. + mx := p[1].X + p[4].X = p[2].X + p[3].X = (p[4].X + mx) / 2 + p[1].X = (p[0].X + mx) / 2 + p[2].X = (p[1].X + p[3].X) / 2 + my := p[1].Y + p[4].Y = p[2].Y + p[3].Y = (p[4].Y + my) / 2 + p[1].Y = (p[0].Y + my) / 2 + p[2].Y = (p[1].Y + p[3].Y) / 2 + // The two shorter curves have one less split to do. + sStack[i] = s - 1 + sStack[i+1] = s - 1 + i++ + } else { + // Replace the level-0 quadratic with a two-linear-piece + // approximation. + midx := (p[0].X + 2*p[1].X + p[2].X) / 4 + midy := (p[0].Y + 2*p[1].Y + p[2].Y) / 4 + r.Add1(fixed.Point26_6{midx, midy}) + r.Add1(p[0]) + i-- + } + } +} + +// Add3 adds a cubic segment to the current curve. +func (r *Rasterizer) Add3(b, c, d fixed.Point26_6) { + // Calculate nSplit (the number of recursive decompositions) based on how + // 'curvy' it is. + dev2 := maxAbs(r.a.X-3*(b.X+c.X)+d.X, r.a.Y-3*(b.Y+c.Y)+d.Y) / fixed.Int26_6(r.splitScale2) + dev3 := maxAbs(r.a.X-2*b.X+d.X, r.a.Y-2*b.Y+d.Y) / fixed.Int26_6(r.splitScale3) + nsplit := 0 + for dev2 > 0 || dev3 > 0 { + dev2 /= 8 + dev3 /= 4 + nsplit++ + } + // devN is 32-bit, and nsplit++ every time we shift off 2 bits, so + // maxNsplit is 16. + const maxNsplit = 16 + if nsplit > maxNsplit { + panic("freetype/raster: Add3 nsplit too large: " + strconv.Itoa(nsplit)) + } + // Recursively decompose the curve nSplit levels deep. + var ( + pStack [3*maxNsplit + 4]fixed.Point26_6 + sStack [maxNsplit + 1]int + i int + ) + sStack[0] = nsplit + pStack[0] = d + pStack[1] = c + pStack[2] = b + pStack[3] = r.a + for i >= 0 { + s := sStack[i] + p := pStack[3*i:] + if s > 0 { + // Split the cubic curve p[:4] into an equivalent set of two + // shorter curves: p[:4] and p[3:7]. The new p[6] is the old p[3], + // and p[0] is unchanged. + m01x := (p[0].X + p[1].X) / 2 + m12x := (p[1].X + p[2].X) / 2 + m23x := (p[2].X + p[3].X) / 2 + p[6].X = p[3].X + p[5].X = m23x + p[1].X = m01x + p[2].X = (m01x + m12x) / 2 + p[4].X = (m12x + m23x) / 2 + p[3].X = (p[2].X + p[4].X) / 2 + m01y := (p[0].Y + p[1].Y) / 2 + m12y := (p[1].Y + p[2].Y) / 2 + m23y := (p[2].Y + p[3].Y) / 2 + p[6].Y = p[3].Y + p[5].Y = m23y + p[1].Y = m01y + p[2].Y = (m01y + m12y) / 2 + p[4].Y = (m12y + m23y) / 2 + p[3].Y = (p[2].Y + p[4].Y) / 2 + // The two shorter curves have one less split to do. + sStack[i] = s - 1 + sStack[i+1] = s - 1 + i++ + } else { + // Replace the level-0 cubic with a two-linear-piece approximation. + midx := (p[0].X + 3*(p[1].X+p[2].X) + p[3].X) / 8 + midy := (p[0].Y + 3*(p[1].Y+p[2].Y) + p[3].Y) / 8 + r.Add1(fixed.Point26_6{midx, midy}) + r.Add1(p[0]) + i-- + } + } +} + +// AddPath adds the given Path. +func (r *Rasterizer) AddPath(p Path) { + for i := 0; i < len(p); { + switch p[i] { + case 0: + r.Start( + fixed.Point26_6{p[i+1], p[i+2]}, + ) + i += 4 + case 1: + r.Add1( + fixed.Point26_6{p[i+1], p[i+2]}, + ) + i += 4 + case 2: + r.Add2( + fixed.Point26_6{p[i+1], p[i+2]}, + fixed.Point26_6{p[i+3], p[i+4]}, + ) + i += 6 + case 3: + r.Add3( + fixed.Point26_6{p[i+1], p[i+2]}, + fixed.Point26_6{p[i+3], p[i+4]}, + fixed.Point26_6{p[i+5], p[i+6]}, + ) + i += 8 + default: + panic("freetype/raster: bad path") + } + } +} + +// AddStroke adds a stroked Path. +func (r *Rasterizer) AddStroke(q Path, width fixed.Int26_6, cr Capper, jr Joiner) { + Stroke(r, q, width, cr, jr) +} + +// areaToAlpha converts an area value to a uint32 alpha value. A completely +// filled pixel corresponds to an area of 64*64*2, and an alpha of 0xffff. The +// conversion of area values greater than this depends on the winding rule: +// even-odd or non-zero. +func (r *Rasterizer) areaToAlpha(area int) uint32 { + // The C Freetype implementation (version 2.3.12) does "alpha := area>>1" + // without the +1. Round-to-nearest gives a more symmetric result than + // round-down. The C implementation also returns 8-bit alpha, not 16-bit + // alpha. + a := (area + 1) >> 1 + if a < 0 { + a = -a + } + alpha := uint32(a) + if r.UseNonZeroWinding { + if alpha > 0x0fff { + alpha = 0x0fff + } + } else { + alpha &= 0x1fff + if alpha > 0x1000 { + alpha = 0x2000 - alpha + } else if alpha == 0x1000 { + alpha = 0x0fff + } + } + // alpha is now in the range [0x0000, 0x0fff]. Convert that 12-bit alpha to + // 16-bit alpha. + return alpha<<4 | alpha>>8 +} + +// Rasterize converts r's accumulated curves into Spans for p. The Spans passed +// to p are non-overlapping, and sorted by Y and then X. They all have non-zero +// width (and 0 <= X0 < X1 <= r.width) and non-zero A, except for the final +// Span, which has Y, X0, X1 and A all equal to zero. +func (r *Rasterizer) Rasterize(p Painter) { + r.saveCell() + s := 0 + for yi := 0; yi < len(r.cellIndex); yi++ { + xi, cover := 0, 0 + for c := r.cellIndex[yi]; c != -1; c = r.cell[c].next { + if cover != 0 && r.cell[c].xi > xi { + alpha := r.areaToAlpha(cover * 64 * 2) + if alpha != 0 { + xi0, xi1 := xi, r.cell[c].xi + if xi0 < 0 { + xi0 = 0 + } + if xi1 >= r.width { + xi1 = r.width + } + if xi0 < xi1 { + r.spanBuf[s] = Span{yi + r.Dy, xi0 + r.Dx, xi1 + r.Dx, alpha} + s++ + } + } + } + cover += r.cell[c].cover + alpha := r.areaToAlpha(cover*64*2 - r.cell[c].area) + xi = r.cell[c].xi + 1 + if alpha != 0 { + xi0, xi1 := r.cell[c].xi, xi + if xi0 < 0 { + xi0 = 0 + } + if xi1 >= r.width { + xi1 = r.width + } + if xi0 < xi1 { + r.spanBuf[s] = Span{yi + r.Dy, xi0 + r.Dx, xi1 + r.Dx, alpha} + s++ + } + } + if s > len(r.spanBuf)-2 { + p.Paint(r.spanBuf[:s], false) + s = 0 + } + } + } + p.Paint(r.spanBuf[:s], true) +} + +// Clear cancels any previous calls to r.Start or r.AddXxx. +func (r *Rasterizer) Clear() { + r.a = fixed.Point26_6{} + r.xi = 0 + r.yi = 0 + r.area = 0 + r.cover = 0 + r.cell = r.cell[:0] + for i := 0; i < len(r.cellIndex); i++ { + r.cellIndex[i] = -1 + } +} + +// SetBounds sets the maximum width and height of the rasterized image and +// calls Clear. The width and height are in pixels, not fixed.Int26_6 units. +func (r *Rasterizer) SetBounds(width, height int) { + if width < 0 { + width = 0 + } + if height < 0 { + height = 0 + } + // Use the same ssN heuristic as the C Freetype (version 2.4.0) + // implementation. + ss2, ss3 := 32, 16 + if width > 24 || height > 24 { + ss2, ss3 = 2*ss2, 2*ss3 + if width > 120 || height > 120 { + ss2, ss3 = 2*ss2, 2*ss3 + } + } + r.width = width + r.splitScale2 = ss2 + r.splitScale3 = ss3 + r.cell = r.cellBuf[:0] + if height > len(r.cellIndexBuf) { + r.cellIndex = make([]int, height) + } else { + r.cellIndex = r.cellIndexBuf[:height] + } + r.Clear() +} + +// NewRasterizer creates a new Rasterizer with the given bounds. +func NewRasterizer(width, height int) *Rasterizer { + r := new(Rasterizer) + r.SetBounds(width, height) + return r +} diff --git a/vendor/github.com/golang/freetype/raster/stroke.go b/vendor/github.com/golang/freetype/raster/stroke.go new file mode 100644 index 00000000..bcc66b26 --- /dev/null +++ b/vendor/github.com/golang/freetype/raster/stroke.go @@ -0,0 +1,483 @@ +// Copyright 2010 The Freetype-Go Authors. All rights reserved. +// Use of this source code is governed by your choice of either the +// FreeType License or the GNU General Public License version 2 (or +// any later version), both of which can be found in the LICENSE file. + +package raster + +import ( + "golang.org/x/image/math/fixed" +) + +// Two points are considered practically equal if the square of the distance +// between them is less than one quarter (i.e. 1024 / 4096). +const epsilon = fixed.Int52_12(1024) + +// A Capper signifies how to begin or end a stroked path. +type Capper interface { + // Cap adds a cap to p given a pivot point and the normal vector of a + // terminal segment. The normal's length is half of the stroke width. + Cap(p Adder, halfWidth fixed.Int26_6, pivot, n1 fixed.Point26_6) +} + +// The CapperFunc type adapts an ordinary function to be a Capper. +type CapperFunc func(Adder, fixed.Int26_6, fixed.Point26_6, fixed.Point26_6) + +func (f CapperFunc) Cap(p Adder, halfWidth fixed.Int26_6, pivot, n1 fixed.Point26_6) { + f(p, halfWidth, pivot, n1) +} + +// A Joiner signifies how to join interior nodes of a stroked path. +type Joiner interface { + // Join adds a join to the two sides of a stroked path given a pivot + // point and the normal vectors of the trailing and leading segments. + // Both normals have length equal to half of the stroke width. + Join(lhs, rhs Adder, halfWidth fixed.Int26_6, pivot, n0, n1 fixed.Point26_6) +} + +// The JoinerFunc type adapts an ordinary function to be a Joiner. +type JoinerFunc func(lhs, rhs Adder, halfWidth fixed.Int26_6, pivot, n0, n1 fixed.Point26_6) + +func (f JoinerFunc) Join(lhs, rhs Adder, halfWidth fixed.Int26_6, pivot, n0, n1 fixed.Point26_6) { + f(lhs, rhs, halfWidth, pivot, n0, n1) +} + +// RoundCapper adds round caps to a stroked path. +var RoundCapper Capper = CapperFunc(roundCapper) + +func roundCapper(p Adder, halfWidth fixed.Int26_6, pivot, n1 fixed.Point26_6) { + // The cubic Bézier approximation to a circle involves the magic number + // (√2 - 1) * 4/3, which is approximately 35/64. + const k = 35 + e := pRot90CCW(n1) + side := pivot.Add(e) + start, end := pivot.Sub(n1), pivot.Add(n1) + d, e := n1.Mul(k), e.Mul(k) + p.Add3(start.Add(e), side.Sub(d), side) + p.Add3(side.Add(d), end.Add(e), end) +} + +// ButtCapper adds butt caps to a stroked path. +var ButtCapper Capper = CapperFunc(buttCapper) + +func buttCapper(p Adder, halfWidth fixed.Int26_6, pivot, n1 fixed.Point26_6) { + p.Add1(pivot.Add(n1)) +} + +// SquareCapper adds square caps to a stroked path. +var SquareCapper Capper = CapperFunc(squareCapper) + +func squareCapper(p Adder, halfWidth fixed.Int26_6, pivot, n1 fixed.Point26_6) { + e := pRot90CCW(n1) + side := pivot.Add(e) + p.Add1(side.Sub(n1)) + p.Add1(side.Add(n1)) + p.Add1(pivot.Add(n1)) +} + +// RoundJoiner adds round joins to a stroked path. +var RoundJoiner Joiner = JoinerFunc(roundJoiner) + +func roundJoiner(lhs, rhs Adder, haflWidth fixed.Int26_6, pivot, n0, n1 fixed.Point26_6) { + dot := pDot(pRot90CW(n0), n1) + if dot >= 0 { + addArc(lhs, pivot, n0, n1) + rhs.Add1(pivot.Sub(n1)) + } else { + lhs.Add1(pivot.Add(n1)) + addArc(rhs, pivot, pNeg(n0), pNeg(n1)) + } +} + +// BevelJoiner adds bevel joins to a stroked path. +var BevelJoiner Joiner = JoinerFunc(bevelJoiner) + +func bevelJoiner(lhs, rhs Adder, haflWidth fixed.Int26_6, pivot, n0, n1 fixed.Point26_6) { + lhs.Add1(pivot.Add(n1)) + rhs.Add1(pivot.Sub(n1)) +} + +// addArc adds a circular arc from pivot+n0 to pivot+n1 to p. The shorter of +// the two possible arcs is taken, i.e. the one spanning <= 180 degrees. The +// two vectors n0 and n1 must be of equal length. +func addArc(p Adder, pivot, n0, n1 fixed.Point26_6) { + // r2 is the square of the length of n0. + r2 := pDot(n0, n0) + if r2 < epsilon { + // The arc radius is so small that we collapse to a straight line. + p.Add1(pivot.Add(n1)) + return + } + // We approximate the arc by 0, 1, 2 or 3 45-degree quadratic segments plus + // a final quadratic segment from s to n1. Each 45-degree segment has + // control points {1, 0}, {1, tan(π/8)} and {1/√2, 1/√2} suitably scaled, + // rotated and translated. tan(π/8) is approximately 27/64. + const tpo8 = 27 + var s fixed.Point26_6 + // We determine which octant the angle between n0 and n1 is in via three + // dot products. m0, m1 and m2 are n0 rotated clockwise by 45, 90 and 135 + // degrees. + m0 := pRot45CW(n0) + m1 := pRot90CW(n0) + m2 := pRot90CW(m0) + if pDot(m1, n1) >= 0 { + if pDot(n0, n1) >= 0 { + if pDot(m2, n1) <= 0 { + // n1 is between 0 and 45 degrees clockwise of n0. + s = n0 + } else { + // n1 is between 45 and 90 degrees clockwise of n0. + p.Add2(pivot.Add(n0).Add(m1.Mul(tpo8)), pivot.Add(m0)) + s = m0 + } + } else { + pm1, n0t := pivot.Add(m1), n0.Mul(tpo8) + p.Add2(pivot.Add(n0).Add(m1.Mul(tpo8)), pivot.Add(m0)) + p.Add2(pm1.Add(n0t), pm1) + if pDot(m0, n1) >= 0 { + // n1 is between 90 and 135 degrees clockwise of n0. + s = m1 + } else { + // n1 is between 135 and 180 degrees clockwise of n0. + p.Add2(pm1.Sub(n0t), pivot.Add(m2)) + s = m2 + } + } + } else { + if pDot(n0, n1) >= 0 { + if pDot(m0, n1) >= 0 { + // n1 is between 0 and 45 degrees counter-clockwise of n0. + s = n0 + } else { + // n1 is between 45 and 90 degrees counter-clockwise of n0. + p.Add2(pivot.Add(n0).Sub(m1.Mul(tpo8)), pivot.Sub(m2)) + s = pNeg(m2) + } + } else { + pm1, n0t := pivot.Sub(m1), n0.Mul(tpo8) + p.Add2(pivot.Add(n0).Sub(m1.Mul(tpo8)), pivot.Sub(m2)) + p.Add2(pm1.Add(n0t), pm1) + if pDot(m2, n1) <= 0 { + // n1 is between 90 and 135 degrees counter-clockwise of n0. + s = pNeg(m1) + } else { + // n1 is between 135 and 180 degrees counter-clockwise of n0. + p.Add2(pm1.Sub(n0t), pivot.Sub(m0)) + s = pNeg(m0) + } + } + } + // The final quadratic segment has two endpoints s and n1 and the middle + // control point is a multiple of s.Add(n1), i.e. it is on the angle + // bisector of those two points. The multiple ranges between 128/256 and + // 150/256 as the angle between s and n1 ranges between 0 and 45 degrees. + // + // When the angle is 0 degrees (i.e. s and n1 are coincident) then + // s.Add(n1) is twice s and so the middle control point of the degenerate + // quadratic segment should be half s.Add(n1), and half = 128/256. + // + // When the angle is 45 degrees then 150/256 is the ratio of the lengths of + // the two vectors {1, tan(π/8)} and {1 + 1/√2, 1/√2}. + // + // d is the normalized dot product between s and n1. Since the angle ranges + // between 0 and 45 degrees then d ranges between 256/256 and 181/256. + d := 256 * pDot(s, n1) / r2 + multiple := fixed.Int26_6(150-(150-128)*(d-181)/(256-181)) >> 2 + p.Add2(pivot.Add(s.Add(n1).Mul(multiple)), pivot.Add(n1)) +} + +// midpoint returns the midpoint of two Points. +func midpoint(a, b fixed.Point26_6) fixed.Point26_6 { + return fixed.Point26_6{(a.X + b.X) / 2, (a.Y + b.Y) / 2} +} + +// angleGreaterThan45 returns whether the angle between two vectors is more +// than 45 degrees. +func angleGreaterThan45(v0, v1 fixed.Point26_6) bool { + v := pRot45CCW(v0) + return pDot(v, v1) < 0 || pDot(pRot90CW(v), v1) < 0 +} + +// interpolate returns the point (1-t)*a + t*b. +func interpolate(a, b fixed.Point26_6, t fixed.Int52_12) fixed.Point26_6 { + s := 1<<12 - t + x := s*fixed.Int52_12(a.X) + t*fixed.Int52_12(b.X) + y := s*fixed.Int52_12(a.Y) + t*fixed.Int52_12(b.Y) + return fixed.Point26_6{fixed.Int26_6(x >> 12), fixed.Int26_6(y >> 12)} +} + +// curviest2 returns the value of t for which the quadratic parametric curve +// (1-t)²*a + 2*t*(1-t).b + t²*c has maximum curvature. +// +// The curvature of the parametric curve f(t) = (x(t), y(t)) is +// |x′y″-y′x″| / (x′²+y′²)^(3/2). +// +// Let d = b-a and e = c-2*b+a, so that f′(t) = 2*d+2*e*t and f″(t) = 2*e. +// The curvature's numerator is (2*dx+2*ex*t)*(2*ey)-(2*dy+2*ey*t)*(2*ex), +// which simplifies to 4*dx*ey-4*dy*ex, which is constant with respect to t. +// +// Thus, curvature is extreme where the denominator is extreme, i.e. where +// (x′²+y′²) is extreme. The first order condition is that +// 2*x′*x″+2*y′*y″ = 0, or (dx+ex*t)*ex + (dy+ey*t)*ey = 0. +// Solving for t gives t = -(dx*ex+dy*ey) / (ex*ex+ey*ey). +func curviest2(a, b, c fixed.Point26_6) fixed.Int52_12 { + dx := int64(b.X - a.X) + dy := int64(b.Y - a.Y) + ex := int64(c.X - 2*b.X + a.X) + ey := int64(c.Y - 2*b.Y + a.Y) + if ex == 0 && ey == 0 { + return 2048 + } + return fixed.Int52_12(-4096 * (dx*ex + dy*ey) / (ex*ex + ey*ey)) +} + +// A stroker holds state for stroking a path. +type stroker struct { + // p is the destination that records the stroked path. + p Adder + // u is the half-width of the stroke. + u fixed.Int26_6 + // cr and jr specify how to end and connect path segments. + cr Capper + jr Joiner + // r is the reverse path. Stroking a path involves constructing two + // parallel paths 2*u apart. The first path is added immediately to p, + // the second path is accumulated in r and eventually added in reverse. + r Path + // a is the most recent segment point. anorm is the segment normal of + // length u at that point. + a, anorm fixed.Point26_6 +} + +// addNonCurvy2 adds a quadratic segment to the stroker, where the segment +// defined by (k.a, b, c) achieves maximum curvature at either k.a or c. +func (k *stroker) addNonCurvy2(b, c fixed.Point26_6) { + // We repeatedly divide the segment at its middle until it is straight + // enough to approximate the stroke by just translating the control points. + // ds and ps are stacks of depths and points. t is the top of the stack. + const maxDepth = 5 + var ( + ds [maxDepth + 1]int + ps [2*maxDepth + 3]fixed.Point26_6 + t int + ) + // Initially the ps stack has one quadratic segment of depth zero. + ds[0] = 0 + ps[2] = k.a + ps[1] = b + ps[0] = c + anorm := k.anorm + var cnorm fixed.Point26_6 + + for { + depth := ds[t] + a := ps[2*t+2] + b := ps[2*t+1] + c := ps[2*t+0] + ab := b.Sub(a) + bc := c.Sub(b) + abIsSmall := pDot(ab, ab) < fixed.Int52_12(1<<12) + bcIsSmall := pDot(bc, bc) < fixed.Int52_12(1<<12) + if abIsSmall && bcIsSmall { + // Approximate the segment by a circular arc. + cnorm = pRot90CCW(pNorm(bc, k.u)) + mac := midpoint(a, c) + addArc(k.p, mac, anorm, cnorm) + addArc(&k.r, mac, pNeg(anorm), pNeg(cnorm)) + } else if depth < maxDepth && angleGreaterThan45(ab, bc) { + // Divide the segment in two and push both halves on the stack. + mab := midpoint(a, b) + mbc := midpoint(b, c) + t++ + ds[t+0] = depth + 1 + ds[t-1] = depth + 1 + ps[2*t+2] = a + ps[2*t+1] = mab + ps[2*t+0] = midpoint(mab, mbc) + ps[2*t-1] = mbc + continue + } else { + // Translate the control points. + bnorm := pRot90CCW(pNorm(c.Sub(a), k.u)) + cnorm = pRot90CCW(pNorm(bc, k.u)) + k.p.Add2(b.Add(bnorm), c.Add(cnorm)) + k.r.Add2(b.Sub(bnorm), c.Sub(cnorm)) + } + if t == 0 { + k.a, k.anorm = c, cnorm + return + } + t-- + anorm = cnorm + } + panic("unreachable") +} + +// Add1 adds a linear segment to the stroker. +func (k *stroker) Add1(b fixed.Point26_6) { + bnorm := pRot90CCW(pNorm(b.Sub(k.a), k.u)) + if len(k.r) == 0 { + k.p.Start(k.a.Add(bnorm)) + k.r.Start(k.a.Sub(bnorm)) + } else { + k.jr.Join(k.p, &k.r, k.u, k.a, k.anorm, bnorm) + } + k.p.Add1(b.Add(bnorm)) + k.r.Add1(b.Sub(bnorm)) + k.a, k.anorm = b, bnorm +} + +// Add2 adds a quadratic segment to the stroker. +func (k *stroker) Add2(b, c fixed.Point26_6) { + ab := b.Sub(k.a) + bc := c.Sub(b) + abnorm := pRot90CCW(pNorm(ab, k.u)) + if len(k.r) == 0 { + k.p.Start(k.a.Add(abnorm)) + k.r.Start(k.a.Sub(abnorm)) + } else { + k.jr.Join(k.p, &k.r, k.u, k.a, k.anorm, abnorm) + } + + // Approximate nearly-degenerate quadratics by linear segments. + abIsSmall := pDot(ab, ab) < epsilon + bcIsSmall := pDot(bc, bc) < epsilon + if abIsSmall || bcIsSmall { + acnorm := pRot90CCW(pNorm(c.Sub(k.a), k.u)) + k.p.Add1(c.Add(acnorm)) + k.r.Add1(c.Sub(acnorm)) + k.a, k.anorm = c, acnorm + return + } + + // The quadratic segment (k.a, b, c) has a point of maximum curvature. + // If this occurs at an end point, we process the segment as a whole. + t := curviest2(k.a, b, c) + if t <= 0 || 4096 <= t { + k.addNonCurvy2(b, c) + return + } + + // Otherwise, we perform a de Casteljau decomposition at the point of + // maximum curvature and process the two straighter parts. + mab := interpolate(k.a, b, t) + mbc := interpolate(b, c, t) + mabc := interpolate(mab, mbc, t) + + // If the vectors ab and bc are close to being in opposite directions, + // then the decomposition can become unstable, so we approximate the + // quadratic segment by two linear segments joined by an arc. + bcnorm := pRot90CCW(pNorm(bc, k.u)) + if pDot(abnorm, bcnorm) < -fixed.Int52_12(k.u)*fixed.Int52_12(k.u)*2047/2048 { + pArc := pDot(abnorm, bc) < 0 + + k.p.Add1(mabc.Add(abnorm)) + if pArc { + z := pRot90CW(abnorm) + addArc(k.p, mabc, abnorm, z) + addArc(k.p, mabc, z, bcnorm) + } + k.p.Add1(mabc.Add(bcnorm)) + k.p.Add1(c.Add(bcnorm)) + + k.r.Add1(mabc.Sub(abnorm)) + if !pArc { + z := pRot90CW(abnorm) + addArc(&k.r, mabc, pNeg(abnorm), z) + addArc(&k.r, mabc, z, pNeg(bcnorm)) + } + k.r.Add1(mabc.Sub(bcnorm)) + k.r.Add1(c.Sub(bcnorm)) + + k.a, k.anorm = c, bcnorm + return + } + + // Process the decomposed parts. + k.addNonCurvy2(mab, mabc) + k.addNonCurvy2(mbc, c) +} + +// Add3 adds a cubic segment to the stroker. +func (k *stroker) Add3(b, c, d fixed.Point26_6) { + panic("freetype/raster: stroke unimplemented for cubic segments") +} + +// stroke adds the stroked Path q to p, where q consists of exactly one curve. +func (k *stroker) stroke(q Path) { + // Stroking is implemented by deriving two paths each k.u apart from q. + // The left-hand-side path is added immediately to k.p; the right-hand-side + // path is accumulated in k.r. Once we've finished adding the LHS to k.p, + // we add the RHS in reverse order. + k.r = make(Path, 0, len(q)) + k.a = fixed.Point26_6{q[1], q[2]} + for i := 4; i < len(q); { + switch q[i] { + case 1: + k.Add1( + fixed.Point26_6{q[i+1], q[i+2]}, + ) + i += 4 + case 2: + k.Add2( + fixed.Point26_6{q[i+1], q[i+2]}, + fixed.Point26_6{q[i+3], q[i+4]}, + ) + i += 6 + case 3: + k.Add3( + fixed.Point26_6{q[i+1], q[i+2]}, + fixed.Point26_6{q[i+3], q[i+4]}, + fixed.Point26_6{q[i+5], q[i+6]}, + ) + i += 8 + default: + panic("freetype/raster: bad path") + } + } + if len(k.r) == 0 { + return + } + // TODO(nigeltao): if q is a closed curve then we should join the first and + // last segments instead of capping them. + k.cr.Cap(k.p, k.u, q.lastPoint(), pNeg(k.anorm)) + addPathReversed(k.p, k.r) + pivot := q.firstPoint() + k.cr.Cap(k.p, k.u, pivot, pivot.Sub(fixed.Point26_6{k.r[1], k.r[2]})) +} + +// Stroke adds q stroked with the given width to p. The result is typically +// self-intersecting and should be rasterized with UseNonZeroWinding. +// cr and jr may be nil, which defaults to a RoundCapper or RoundJoiner. +func Stroke(p Adder, q Path, width fixed.Int26_6, cr Capper, jr Joiner) { + if len(q) == 0 { + return + } + if cr == nil { + cr = RoundCapper + } + if jr == nil { + jr = RoundJoiner + } + if q[0] != 0 { + panic("freetype/raster: bad path") + } + s := stroker{p: p, u: width / 2, cr: cr, jr: jr} + i := 0 + for j := 4; j < len(q); { + switch q[j] { + case 0: + s.stroke(q[i:j]) + i, j = j, j+4 + case 1: + j += 4 + case 2: + j += 6 + case 3: + j += 8 + default: + panic("freetype/raster: bad path") + } + } + s.stroke(q[i:]) +} diff --git a/vendor/github.com/golang/freetype/truetype/face.go b/vendor/github.com/golang/freetype/truetype/face.go new file mode 100644 index 00000000..099006f0 --- /dev/null +++ b/vendor/github.com/golang/freetype/truetype/face.go @@ -0,0 +1,507 @@ +// Copyright 2015 The Freetype-Go Authors. All rights reserved. +// Use of this source code is governed by your choice of either the +// FreeType License or the GNU General Public License version 2 (or +// any later version), both of which can be found in the LICENSE file. + +package truetype + +import ( + "image" + "math" + + "github.com/golang/freetype/raster" + "golang.org/x/image/font" + "golang.org/x/image/math/fixed" +) + +func powerOf2(i int) bool { + return i != 0 && (i&(i-1)) == 0 +} + +// Options are optional arguments to NewFace. +type Options struct { + // Size is the font size in points, as in "a 10 point font size". + // + // A zero value means to use a 12 point font size. + Size float64 + + // DPI is the dots-per-inch resolution. + // + // A zero value means to use 72 DPI. + DPI float64 + + // Hinting is how to quantize the glyph nodes. + // + // A zero value means to use no hinting. + Hinting font.Hinting + + // GlyphCacheEntries is the number of entries in the glyph mask image + // cache. + // + // If non-zero, it must be a power of 2. + // + // A zero value means to use 512 entries. + GlyphCacheEntries int + + // SubPixelsX is the number of sub-pixel locations a glyph's dot is + // quantized to, in the horizontal direction. For example, a value of 8 + // means that the dot is quantized to 1/8th of a pixel. This quantization + // only affects the glyph mask image, not its bounding box or advance + // width. A higher value gives a more faithful glyph image, but reduces the + // effectiveness of the glyph cache. + // + // If non-zero, it must be a power of 2, and be between 1 and 64 inclusive. + // + // A zero value means to use 4 sub-pixel locations. + SubPixelsX int + + // SubPixelsY is the number of sub-pixel locations a glyph's dot is + // quantized to, in the vertical direction. For example, a value of 8 + // means that the dot is quantized to 1/8th of a pixel. This quantization + // only affects the glyph mask image, not its bounding box or advance + // width. A higher value gives a more faithful glyph image, but reduces the + // effectiveness of the glyph cache. + // + // If non-zero, it must be a power of 2, and be between 1 and 64 inclusive. + // + // A zero value means to use 1 sub-pixel location. + SubPixelsY int +} + +func (o *Options) size() float64 { + if o != nil && o.Size > 0 { + return o.Size + } + return 12 +} + +func (o *Options) dpi() float64 { + if o != nil && o.DPI > 0 { + return o.DPI + } + return 72 +} + +func (o *Options) hinting() font.Hinting { + if o != nil { + switch o.Hinting { + case font.HintingVertical, font.HintingFull: + // TODO: support vertical hinting. + return font.HintingFull + } + } + return font.HintingNone +} + +func (o *Options) glyphCacheEntries() int { + if o != nil && powerOf2(o.GlyphCacheEntries) { + return o.GlyphCacheEntries + } + // 512 is 128 * 4 * 1, which lets us cache 128 glyphs at 4 * 1 subpixel + // locations in the X and Y direction. + return 512 +} + +func (o *Options) subPixelsX() (value uint32, halfQuantum, mask fixed.Int26_6) { + if o != nil { + switch o.SubPixelsX { + case 1, 2, 4, 8, 16, 32, 64: + return subPixels(o.SubPixelsX) + } + } + // This default value of 4 isn't based on anything scientific, merely as + // small a number as possible that looks almost as good as no quantization, + // or returning subPixels(64). + return subPixels(4) +} + +func (o *Options) subPixelsY() (value uint32, halfQuantum, mask fixed.Int26_6) { + if o != nil { + switch o.SubPixelsX { + case 1, 2, 4, 8, 16, 32, 64: + return subPixels(o.SubPixelsX) + } + } + // This default value of 1 isn't based on anything scientific, merely that + // vertical sub-pixel glyph rendering is pretty rare. Baseline locations + // can usually afford to snap to the pixel grid, so the vertical direction + // doesn't have the deal with the horizontal's fractional advance widths. + return subPixels(1) +} + +// subPixels returns q and the bias and mask that leads to q quantized +// sub-pixel locations per full pixel. +// +// For example, q == 4 leads to a bias of 8 and a mask of 0xfffffff0, or -16, +// because we want to round fractions of fixed.Int26_6 as: +// - 0 to 7 rounds to 0. +// - 8 to 23 rounds to 16. +// - 24 to 39 rounds to 32. +// - 40 to 55 rounds to 48. +// - 56 to 63 rounds to 64. +// which means to add 8 and then bitwise-and with -16, in two's complement +// representation. +// +// When q == 1, we want bias == 32 and mask == -64. +// When q == 2, we want bias == 16 and mask == -32. +// When q == 4, we want bias == 8 and mask == -16. +// ... +// When q == 64, we want bias == 0 and mask == -1. (The no-op case). +// The pattern is clear. +func subPixels(q int) (value uint32, bias, mask fixed.Int26_6) { + return uint32(q), 32 / fixed.Int26_6(q), -64 / fixed.Int26_6(q) +} + +// glyphCacheEntry caches the arguments and return values of rasterize. +type glyphCacheEntry struct { + key glyphCacheKey + val glyphCacheVal +} + +type glyphCacheKey struct { + index Index + fx, fy uint8 +} + +type glyphCacheVal struct { + advanceWidth fixed.Int26_6 + offset image.Point + gw int + gh int +} + +type indexCacheEntry struct { + rune rune + index Index +} + +// NewFace returns a new font.Face for the given Font. +func NewFace(f *Font, opts *Options) font.Face { + a := &face{ + f: f, + hinting: opts.hinting(), + scale: fixed.Int26_6(0.5 + (opts.size() * opts.dpi() * 64 / 72)), + glyphCache: make([]glyphCacheEntry, opts.glyphCacheEntries()), + } + a.subPixelX, a.subPixelBiasX, a.subPixelMaskX = opts.subPixelsX() + a.subPixelY, a.subPixelBiasY, a.subPixelMaskY = opts.subPixelsY() + + // Fill the cache with invalid entries. Valid glyph cache entries have fx + // and fy in the range [0, 64). Valid index cache entries have rune >= 0. + for i := range a.glyphCache { + a.glyphCache[i].key.fy = 0xff + } + for i := range a.indexCache { + a.indexCache[i].rune = -1 + } + + // Set the rasterizer's bounds to be big enough to handle the largest glyph. + b := f.Bounds(a.scale) + xmin := +int(b.Min.X) >> 6 + ymin := -int(b.Max.Y) >> 6 + xmax := +int(b.Max.X+63) >> 6 + ymax := -int(b.Min.Y-63) >> 6 + a.maxw = xmax - xmin + a.maxh = ymax - ymin + a.masks = image.NewAlpha(image.Rect(0, 0, a.maxw, a.maxh*len(a.glyphCache))) + a.r.SetBounds(a.maxw, a.maxh) + a.p = facePainter{a} + + return a +} + +type face struct { + f *Font + hinting font.Hinting + scale fixed.Int26_6 + subPixelX uint32 + subPixelBiasX fixed.Int26_6 + subPixelMaskX fixed.Int26_6 + subPixelY uint32 + subPixelBiasY fixed.Int26_6 + subPixelMaskY fixed.Int26_6 + masks *image.Alpha + glyphCache []glyphCacheEntry + r raster.Rasterizer + p raster.Painter + paintOffset int + maxw int + maxh int + glyphBuf GlyphBuf + indexCache [indexCacheLen]indexCacheEntry + + // TODO: clip rectangle? +} + +const indexCacheLen = 256 + +func (a *face) index(r rune) Index { + const mask = indexCacheLen - 1 + c := &a.indexCache[r&mask] + if c.rune == r { + return c.index + } + i := a.f.Index(r) + c.rune = r + c.index = i + return i +} + +// Close satisfies the font.Face interface. +func (a *face) Close() error { return nil } + +// Metrics satisfies the font.Face interface. +func (a *face) Metrics() font.Metrics { + scale := float64(a.scale) + fupe := float64(a.f.FUnitsPerEm()) + return font.Metrics{ + Height: a.scale, + Ascent: fixed.Int26_6(math.Ceil(scale * float64(+a.f.ascent) / fupe)), + Descent: fixed.Int26_6(math.Ceil(scale * float64(-a.f.descent) / fupe)), + } +} + +// Kern satisfies the font.Face interface. +func (a *face) Kern(r0, r1 rune) fixed.Int26_6 { + i0 := a.index(r0) + i1 := a.index(r1) + kern := a.f.Kern(a.scale, i0, i1) + if a.hinting != font.HintingNone { + kern = (kern + 32) &^ 63 + } + return kern +} + +// Glyph satisfies the font.Face interface. +func (a *face) Glyph(dot fixed.Point26_6, r rune) ( + dr image.Rectangle, mask image.Image, maskp image.Point, advance fixed.Int26_6, ok bool) { + + // Quantize to the sub-pixel granularity. + dotX := (dot.X + a.subPixelBiasX) & a.subPixelMaskX + dotY := (dot.Y + a.subPixelBiasY) & a.subPixelMaskY + + // Split the coordinates into their integer and fractional parts. + ix, fx := int(dotX>>6), dotX&0x3f + iy, fy := int(dotY>>6), dotY&0x3f + + index := a.index(r) + cIndex := uint32(index) + cIndex = cIndex*a.subPixelX - uint32(fx/a.subPixelMaskX) + cIndex = cIndex*a.subPixelY - uint32(fy/a.subPixelMaskY) + cIndex &= uint32(len(a.glyphCache) - 1) + a.paintOffset = a.maxh * int(cIndex) + k := glyphCacheKey{ + index: index, + fx: uint8(fx), + fy: uint8(fy), + } + var v glyphCacheVal + if a.glyphCache[cIndex].key != k { + var ok bool + v, ok = a.rasterize(index, fx, fy) + if !ok { + return image.Rectangle{}, nil, image.Point{}, 0, false + } + a.glyphCache[cIndex] = glyphCacheEntry{k, v} + } else { + v = a.glyphCache[cIndex].val + } + + dr.Min = image.Point{ + X: ix + v.offset.X, + Y: iy + v.offset.Y, + } + dr.Max = image.Point{ + X: dr.Min.X + v.gw, + Y: dr.Min.Y + v.gh, + } + return dr, a.masks, image.Point{Y: a.paintOffset}, v.advanceWidth, true +} + +func (a *face) GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance fixed.Int26_6, ok bool) { + if err := a.glyphBuf.Load(a.f, a.scale, a.index(r), a.hinting); err != nil { + return fixed.Rectangle26_6{}, 0, false + } + xmin := +a.glyphBuf.Bounds.Min.X + ymin := -a.glyphBuf.Bounds.Max.Y + xmax := +a.glyphBuf.Bounds.Max.X + ymax := -a.glyphBuf.Bounds.Min.Y + if xmin > xmax || ymin > ymax { + return fixed.Rectangle26_6{}, 0, false + } + return fixed.Rectangle26_6{ + Min: fixed.Point26_6{ + X: xmin, + Y: ymin, + }, + Max: fixed.Point26_6{ + X: xmax, + Y: ymax, + }, + }, a.glyphBuf.AdvanceWidth, true +} + +func (a *face) GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool) { + if err := a.glyphBuf.Load(a.f, a.scale, a.index(r), a.hinting); err != nil { + return 0, false + } + return a.glyphBuf.AdvanceWidth, true +} + +// rasterize returns the advance width, integer-pixel offset to render at, and +// the width and height of the given glyph at the given sub-pixel offsets. +// +// The 26.6 fixed point arguments fx and fy must be in the range [0, 1). +func (a *face) rasterize(index Index, fx, fy fixed.Int26_6) (v glyphCacheVal, ok bool) { + if err := a.glyphBuf.Load(a.f, a.scale, index, a.hinting); err != nil { + return glyphCacheVal{}, false + } + // Calculate the integer-pixel bounds for the glyph. + xmin := int(fx+a.glyphBuf.Bounds.Min.X) >> 6 + ymin := int(fy-a.glyphBuf.Bounds.Max.Y) >> 6 + xmax := int(fx+a.glyphBuf.Bounds.Max.X+0x3f) >> 6 + ymax := int(fy-a.glyphBuf.Bounds.Min.Y+0x3f) >> 6 + if xmin > xmax || ymin > ymax { + return glyphCacheVal{}, false + } + // A TrueType's glyph's nodes can have negative co-ordinates, but the + // rasterizer clips anything left of x=0 or above y=0. xmin and ymin are + // the pixel offsets, based on the font's FUnit metrics, that let a + // negative co-ordinate in TrueType space be non-negative in rasterizer + // space. xmin and ymin are typically <= 0. + fx -= fixed.Int26_6(xmin << 6) + fy -= fixed.Int26_6(ymin << 6) + // Rasterize the glyph's vectors. + a.r.Clear() + pixOffset := a.paintOffset * a.maxw + clear(a.masks.Pix[pixOffset : pixOffset+a.maxw*a.maxh]) + e0 := 0 + for _, e1 := range a.glyphBuf.Ends { + a.drawContour(a.glyphBuf.Points[e0:e1], fx, fy) + e0 = e1 + } + a.r.Rasterize(a.p) + return glyphCacheVal{ + a.glyphBuf.AdvanceWidth, + image.Point{xmin, ymin}, + xmax - xmin, + ymax - ymin, + }, true +} + +func clear(pix []byte) { + for i := range pix { + pix[i] = 0 + } +} + +// drawContour draws the given closed contour with the given offset. +func (a *face) drawContour(ps []Point, dx, dy fixed.Int26_6) { + if len(ps) == 0 { + return + } + + // The low bit of each point's Flags value is whether the point is on the + // curve. Truetype fonts only have quadratic Bézier curves, not cubics. + // Thus, two consecutive off-curve points imply an on-curve point in the + // middle of those two. + // + // See http://chanae.walon.org/pub/ttf/ttf_glyphs.htm for more details. + + // ps[0] is a truetype.Point measured in FUnits and positive Y going + // upwards. start is the same thing measured in fixed point units and + // positive Y going downwards, and offset by (dx, dy). + start := fixed.Point26_6{ + X: dx + ps[0].X, + Y: dy - ps[0].Y, + } + var others []Point + if ps[0].Flags&0x01 != 0 { + others = ps[1:] + } else { + last := fixed.Point26_6{ + X: dx + ps[len(ps)-1].X, + Y: dy - ps[len(ps)-1].Y, + } + if ps[len(ps)-1].Flags&0x01 != 0 { + start = last + others = ps[:len(ps)-1] + } else { + start = fixed.Point26_6{ + X: (start.X + last.X) / 2, + Y: (start.Y + last.Y) / 2, + } + others = ps + } + } + a.r.Start(start) + q0, on0 := start, true + for _, p := range others { + q := fixed.Point26_6{ + X: dx + p.X, + Y: dy - p.Y, + } + on := p.Flags&0x01 != 0 + if on { + if on0 { + a.r.Add1(q) + } else { + a.r.Add2(q0, q) + } + } else { + if on0 { + // No-op. + } else { + mid := fixed.Point26_6{ + X: (q0.X + q.X) / 2, + Y: (q0.Y + q.Y) / 2, + } + a.r.Add2(q0, mid) + } + } + q0, on0 = q, on + } + // Close the curve. + if on0 { + a.r.Add1(start) + } else { + a.r.Add2(q0, start) + } +} + +// facePainter is like a raster.AlphaSrcPainter, with an additional Y offset +// (face.paintOffset) to the painted spans. +type facePainter struct { + a *face +} + +func (p facePainter) Paint(ss []raster.Span, done bool) { + m := p.a.masks + b := m.Bounds() + b.Min.Y = p.a.paintOffset + b.Max.Y = p.a.paintOffset + p.a.maxh + for _, s := range ss { + s.Y += p.a.paintOffset + if s.Y < b.Min.Y { + continue + } + if s.Y >= b.Max.Y { + return + } + if s.X0 < b.Min.X { + s.X0 = b.Min.X + } + if s.X1 > b.Max.X { + s.X1 = b.Max.X + } + if s.X0 >= s.X1 { + continue + } + base := (s.Y-m.Rect.Min.Y)*m.Stride - m.Rect.Min.X + p := m.Pix[base+s.X0 : base+s.X1] + color := uint8(s.Alpha >> 8) + for i := range p { + p[i] = color + } + } +} diff --git a/vendor/github.com/golang/freetype/truetype/glyph.go b/vendor/github.com/golang/freetype/truetype/glyph.go new file mode 100644 index 00000000..6157ad83 --- /dev/null +++ b/vendor/github.com/golang/freetype/truetype/glyph.go @@ -0,0 +1,522 @@ +// Copyright 2010 The Freetype-Go Authors. All rights reserved. +// Use of this source code is governed by your choice of either the +// FreeType License or the GNU General Public License version 2 (or +// any later version), both of which can be found in the LICENSE file. + +package truetype + +import ( + "golang.org/x/image/font" + "golang.org/x/image/math/fixed" +) + +// TODO: implement VerticalHinting. + +// A Point is a co-ordinate pair plus whether it is 'on' a contour or an 'off' +// control point. +type Point struct { + X, Y fixed.Int26_6 + // The Flags' LSB means whether or not this Point is 'on' the contour. + // Other bits are reserved for internal use. + Flags uint32 +} + +// A GlyphBuf holds a glyph's contours. A GlyphBuf can be re-used to load a +// series of glyphs from a Font. +type GlyphBuf struct { + // AdvanceWidth is the glyph's advance width. + AdvanceWidth fixed.Int26_6 + // Bounds is the glyph's bounding box. + Bounds fixed.Rectangle26_6 + // Points contains all Points from all contours of the glyph. If hinting + // was used to load a glyph then Unhinted contains those Points before they + // were hinted, and InFontUnits contains those Points before they were + // hinted and scaled. + Points, Unhinted, InFontUnits []Point + // Ends is the point indexes of the end point of each contour. The length + // of Ends is the number of contours in the glyph. The i'th contour + // consists of points Points[Ends[i-1]:Ends[i]], where Ends[-1] is + // interpreted to mean zero. + Ends []int + + font *Font + scale fixed.Int26_6 + hinting font.Hinting + hinter hinter + // phantomPoints are the co-ordinates of the synthetic phantom points + // used for hinting and bounding box calculations. + phantomPoints [4]Point + // pp1x is the X co-ordinate of the first phantom point. The '1' is + // using 1-based indexing; pp1x is almost always phantomPoints[0].X. + // TODO: eliminate this and consistently use phantomPoints[0].X. + pp1x fixed.Int26_6 + // metricsSet is whether the glyph's metrics have been set yet. For a + // compound glyph, a sub-glyph may override the outer glyph's metrics. + metricsSet bool + // tmp is a scratch buffer. + tmp []Point +} + +// Flags for decoding a glyph's contours. These flags are documented at +// http://developer.apple.com/fonts/TTRefMan/RM06/Chap6glyf.html. +const ( + flagOnCurve = 1 << iota + flagXShortVector + flagYShortVector + flagRepeat + flagPositiveXShortVector + flagPositiveYShortVector + + // The remaining flags are for internal use. + flagTouchedX + flagTouchedY +) + +// The same flag bits (0x10 and 0x20) are overloaded to have two meanings, +// dependent on the value of the flag{X,Y}ShortVector bits. +const ( + flagThisXIsSame = flagPositiveXShortVector + flagThisYIsSame = flagPositiveYShortVector +) + +// Load loads a glyph's contours from a Font, overwriting any previously loaded +// contours for this GlyphBuf. scale is the number of 26.6 fixed point units in +// 1 em, i is the glyph index, and h is the hinting policy. +func (g *GlyphBuf) Load(f *Font, scale fixed.Int26_6, i Index, h font.Hinting) error { + g.Points = g.Points[:0] + g.Unhinted = g.Unhinted[:0] + g.InFontUnits = g.InFontUnits[:0] + g.Ends = g.Ends[:0] + g.font = f + g.hinting = h + g.scale = scale + g.pp1x = 0 + g.phantomPoints = [4]Point{} + g.metricsSet = false + + if h != font.HintingNone { + if err := g.hinter.init(f, scale); err != nil { + return err + } + } + if err := g.load(0, i, true); err != nil { + return err + } + // TODO: this selection of either g.pp1x or g.phantomPoints[0].X isn't ideal, + // and should be cleaned up once we have all the testScaling tests passing, + // plus additional tests for Freetype-Go's bounding boxes matching C Freetype's. + pp1x := g.pp1x + if h != font.HintingNone { + pp1x = g.phantomPoints[0].X + } + if pp1x != 0 { + for i := range g.Points { + g.Points[i].X -= pp1x + } + } + + advanceWidth := g.phantomPoints[1].X - g.phantomPoints[0].X + if h != font.HintingNone { + if len(f.hdmx) >= 8 { + if n := u32(f.hdmx, 4); n > 3+uint32(i) { + for hdmx := f.hdmx[8:]; uint32(len(hdmx)) >= n; hdmx = hdmx[n:] { + if fixed.Int26_6(hdmx[0]) == scale>>6 { + advanceWidth = fixed.Int26_6(hdmx[2+i]) << 6 + break + } + } + } + } + advanceWidth = (advanceWidth + 32) &^ 63 + } + g.AdvanceWidth = advanceWidth + + // Set g.Bounds to the 'control box', which is the bounding box of the + // Bézier curves' control points. This is easier to calculate, no smaller + // than and often equal to the tightest possible bounding box of the curves + // themselves. This approach is what C Freetype does. We can't just scale + // the nominal bounding box in the glyf data as the hinting process and + // phantom point adjustment may move points outside of that box. + if len(g.Points) == 0 { + g.Bounds = fixed.Rectangle26_6{} + } else { + p := g.Points[0] + g.Bounds.Min.X = p.X + g.Bounds.Max.X = p.X + g.Bounds.Min.Y = p.Y + g.Bounds.Max.Y = p.Y + for _, p := range g.Points[1:] { + if g.Bounds.Min.X > p.X { + g.Bounds.Min.X = p.X + } else if g.Bounds.Max.X < p.X { + g.Bounds.Max.X = p.X + } + if g.Bounds.Min.Y > p.Y { + g.Bounds.Min.Y = p.Y + } else if g.Bounds.Max.Y < p.Y { + g.Bounds.Max.Y = p.Y + } + } + // Snap the box to the grid, if hinting is on. + if h != font.HintingNone { + g.Bounds.Min.X &^= 63 + g.Bounds.Min.Y &^= 63 + g.Bounds.Max.X += 63 + g.Bounds.Max.X &^= 63 + g.Bounds.Max.Y += 63 + g.Bounds.Max.Y &^= 63 + } + } + return nil +} + +func (g *GlyphBuf) load(recursion uint32, i Index, useMyMetrics bool) (err error) { + // The recursion limit here is arbitrary, but defends against malformed glyphs. + if recursion >= 32 { + return UnsupportedError("excessive compound glyph recursion") + } + // Find the relevant slice of g.font.glyf. + var g0, g1 uint32 + if g.font.locaOffsetFormat == locaOffsetFormatShort { + g0 = 2 * uint32(u16(g.font.loca, 2*int(i))) + g1 = 2 * uint32(u16(g.font.loca, 2*int(i)+2)) + } else { + g0 = u32(g.font.loca, 4*int(i)) + g1 = u32(g.font.loca, 4*int(i)+4) + } + + // Decode the contour count and nominal bounding box, from the first + // 10 bytes of the glyf data. boundsYMin and boundsXMax, at offsets 4 + // and 6, are unused. + glyf, ne, boundsXMin, boundsYMax := []byte(nil), 0, fixed.Int26_6(0), fixed.Int26_6(0) + if g0+10 <= g1 { + glyf = g.font.glyf[g0:g1] + ne = int(int16(u16(glyf, 0))) + boundsXMin = fixed.Int26_6(int16(u16(glyf, 2))) + boundsYMax = fixed.Int26_6(int16(u16(glyf, 8))) + } + + // Create the phantom points. + uhm, pp1x := g.font.unscaledHMetric(i), fixed.Int26_6(0) + uvm := g.font.unscaledVMetric(i, boundsYMax) + g.phantomPoints = [4]Point{ + {X: boundsXMin - uhm.LeftSideBearing}, + {X: boundsXMin - uhm.LeftSideBearing + uhm.AdvanceWidth}, + {X: uhm.AdvanceWidth / 2, Y: boundsYMax + uvm.TopSideBearing}, + {X: uhm.AdvanceWidth / 2, Y: boundsYMax + uvm.TopSideBearing - uvm.AdvanceHeight}, + } + if len(glyf) == 0 { + g.addPhantomsAndScale(len(g.Points), len(g.Points), true, true) + copy(g.phantomPoints[:], g.Points[len(g.Points)-4:]) + g.Points = g.Points[:len(g.Points)-4] + // TODO: also trim g.InFontUnits and g.Unhinted? + return nil + } + + // Load and hint the contours. + if ne < 0 { + if ne != -1 { + // http://developer.apple.com/fonts/TTRefMan/RM06/Chap6glyf.html says that + // "the values -2, -3, and so forth, are reserved for future use." + return UnsupportedError("negative number of contours") + } + pp1x = g.font.scale(g.scale * (boundsXMin - uhm.LeftSideBearing)) + if err := g.loadCompound(recursion, uhm, i, glyf, useMyMetrics); err != nil { + return err + } + } else { + np0, ne0 := len(g.Points), len(g.Ends) + program := g.loadSimple(glyf, ne) + g.addPhantomsAndScale(np0, np0, true, true) + pp1x = g.Points[len(g.Points)-4].X + if g.hinting != font.HintingNone { + if len(program) != 0 { + err := g.hinter.run( + program, + g.Points[np0:], + g.Unhinted[np0:], + g.InFontUnits[np0:], + g.Ends[ne0:], + ) + if err != nil { + return err + } + } + // Drop the four phantom points. + g.InFontUnits = g.InFontUnits[:len(g.InFontUnits)-4] + g.Unhinted = g.Unhinted[:len(g.Unhinted)-4] + } + if useMyMetrics { + copy(g.phantomPoints[:], g.Points[len(g.Points)-4:]) + } + g.Points = g.Points[:len(g.Points)-4] + if np0 != 0 { + // The hinting program expects the []Ends values to be indexed + // relative to the inner glyph, not the outer glyph, so we delay + // adding np0 until after the hinting program (if any) has run. + for i := ne0; i < len(g.Ends); i++ { + g.Ends[i] += np0 + } + } + } + if useMyMetrics && !g.metricsSet { + g.metricsSet = true + g.pp1x = pp1x + } + return nil +} + +// loadOffset is the initial offset for loadSimple and loadCompound. The first +// 10 bytes are the number of contours and the bounding box. +const loadOffset = 10 + +func (g *GlyphBuf) loadSimple(glyf []byte, ne int) (program []byte) { + offset := loadOffset + for i := 0; i < ne; i++ { + g.Ends = append(g.Ends, 1+int(u16(glyf, offset))) + offset += 2 + } + + // Note the TrueType hinting instructions. + instrLen := int(u16(glyf, offset)) + offset += 2 + program = glyf[offset : offset+instrLen] + offset += instrLen + + if ne == 0 { + return program + } + + np0 := len(g.Points) + np1 := np0 + int(g.Ends[len(g.Ends)-1]) + + // Decode the flags. + for i := np0; i < np1; { + c := uint32(glyf[offset]) + offset++ + g.Points = append(g.Points, Point{Flags: c}) + i++ + if c&flagRepeat != 0 { + count := glyf[offset] + offset++ + for ; count > 0; count-- { + g.Points = append(g.Points, Point{Flags: c}) + i++ + } + } + } + + // Decode the co-ordinates. + var x int16 + for i := np0; i < np1; i++ { + f := g.Points[i].Flags + if f&flagXShortVector != 0 { + dx := int16(glyf[offset]) + offset++ + if f&flagPositiveXShortVector == 0 { + x -= dx + } else { + x += dx + } + } else if f&flagThisXIsSame == 0 { + x += int16(u16(glyf, offset)) + offset += 2 + } + g.Points[i].X = fixed.Int26_6(x) + } + var y int16 + for i := np0; i < np1; i++ { + f := g.Points[i].Flags + if f&flagYShortVector != 0 { + dy := int16(glyf[offset]) + offset++ + if f&flagPositiveYShortVector == 0 { + y -= dy + } else { + y += dy + } + } else if f&flagThisYIsSame == 0 { + y += int16(u16(glyf, offset)) + offset += 2 + } + g.Points[i].Y = fixed.Int26_6(y) + } + + return program +} + +func (g *GlyphBuf) loadCompound(recursion uint32, uhm HMetric, i Index, + glyf []byte, useMyMetrics bool) error { + + // Flags for decoding a compound glyph. These flags are documented at + // http://developer.apple.com/fonts/TTRefMan/RM06/Chap6glyf.html. + const ( + flagArg1And2AreWords = 1 << iota + flagArgsAreXYValues + flagRoundXYToGrid + flagWeHaveAScale + flagUnused + flagMoreComponents + flagWeHaveAnXAndYScale + flagWeHaveATwoByTwo + flagWeHaveInstructions + flagUseMyMetrics + flagOverlapCompound + ) + np0, ne0 := len(g.Points), len(g.Ends) + offset := loadOffset + for { + flags := u16(glyf, offset) + component := Index(u16(glyf, offset+2)) + dx, dy, transform, hasTransform := fixed.Int26_6(0), fixed.Int26_6(0), [4]int16{}, false + if flags&flagArg1And2AreWords != 0 { + dx = fixed.Int26_6(int16(u16(glyf, offset+4))) + dy = fixed.Int26_6(int16(u16(glyf, offset+6))) + offset += 8 + } else { + dx = fixed.Int26_6(int16(int8(glyf[offset+4]))) + dy = fixed.Int26_6(int16(int8(glyf[offset+5]))) + offset += 6 + } + if flags&flagArgsAreXYValues == 0 { + return UnsupportedError("compound glyph transform vector") + } + if flags&(flagWeHaveAScale|flagWeHaveAnXAndYScale|flagWeHaveATwoByTwo) != 0 { + hasTransform = true + switch { + case flags&flagWeHaveAScale != 0: + transform[0] = int16(u16(glyf, offset+0)) + transform[3] = transform[0] + offset += 2 + case flags&flagWeHaveAnXAndYScale != 0: + transform[0] = int16(u16(glyf, offset+0)) + transform[3] = int16(u16(glyf, offset+2)) + offset += 4 + case flags&flagWeHaveATwoByTwo != 0: + transform[0] = int16(u16(glyf, offset+0)) + transform[1] = int16(u16(glyf, offset+2)) + transform[2] = int16(u16(glyf, offset+4)) + transform[3] = int16(u16(glyf, offset+6)) + offset += 8 + } + } + savedPP := g.phantomPoints + np0 := len(g.Points) + componentUMM := useMyMetrics && (flags&flagUseMyMetrics != 0) + if err := g.load(recursion+1, component, componentUMM); err != nil { + return err + } + if flags&flagUseMyMetrics == 0 { + g.phantomPoints = savedPP + } + if hasTransform { + for j := np0; j < len(g.Points); j++ { + p := &g.Points[j] + newX := 0 + + fixed.Int26_6((int64(p.X)*int64(transform[0])+1<<13)>>14) + + fixed.Int26_6((int64(p.Y)*int64(transform[2])+1<<13)>>14) + newY := 0 + + fixed.Int26_6((int64(p.X)*int64(transform[1])+1<<13)>>14) + + fixed.Int26_6((int64(p.Y)*int64(transform[3])+1<<13)>>14) + p.X, p.Y = newX, newY + } + } + dx = g.font.scale(g.scale * dx) + dy = g.font.scale(g.scale * dy) + if flags&flagRoundXYToGrid != 0 { + dx = (dx + 32) &^ 63 + dy = (dy + 32) &^ 63 + } + for j := np0; j < len(g.Points); j++ { + p := &g.Points[j] + p.X += dx + p.Y += dy + } + // TODO: also adjust g.InFontUnits and g.Unhinted? + if flags&flagMoreComponents == 0 { + break + } + } + + instrLen := 0 + if g.hinting != font.HintingNone && offset+2 <= len(glyf) { + instrLen = int(u16(glyf, offset)) + offset += 2 + } + + g.addPhantomsAndScale(np0, len(g.Points), false, instrLen > 0) + points, ends := g.Points[np0:], g.Ends[ne0:] + g.Points = g.Points[:len(g.Points)-4] + for j := range points { + points[j].Flags &^= flagTouchedX | flagTouchedY + } + + if instrLen == 0 { + if !g.metricsSet { + copy(g.phantomPoints[:], points[len(points)-4:]) + } + return nil + } + + // Hint the compound glyph. + program := glyf[offset : offset+instrLen] + // Temporarily adjust the ends to be relative to this compound glyph. + if np0 != 0 { + for i := range ends { + ends[i] -= np0 + } + } + // Hinting instructions of a composite glyph completely refer to the + // (already) hinted subglyphs. + g.tmp = append(g.tmp[:0], points...) + if err := g.hinter.run(program, points, g.tmp, g.tmp, ends); err != nil { + return err + } + if np0 != 0 { + for i := range ends { + ends[i] += np0 + } + } + if !g.metricsSet { + copy(g.phantomPoints[:], points[len(points)-4:]) + } + return nil +} + +func (g *GlyphBuf) addPhantomsAndScale(np0, np1 int, simple, adjust bool) { + // Add the four phantom points. + g.Points = append(g.Points, g.phantomPoints[:]...) + // Scale the points. + if simple && g.hinting != font.HintingNone { + g.InFontUnits = append(g.InFontUnits, g.Points[np1:]...) + } + for i := np1; i < len(g.Points); i++ { + p := &g.Points[i] + p.X = g.font.scale(g.scale * p.X) + p.Y = g.font.scale(g.scale * p.Y) + } + if g.hinting == font.HintingNone { + return + } + // Round the 1st phantom point to the grid, shifting all other points equally. + // Note that "all other points" starts from np0, not np1. + // TODO: delete this adjustment and the np0/np1 distinction, when + // we update the compatibility tests to C Freetype 2.5.3. + // See http://git.savannah.gnu.org/cgit/freetype/freetype2.git/commit/?id=05c786d990390a7ca18e62962641dac740bacb06 + if adjust { + pp1x := g.Points[len(g.Points)-4].X + if dx := ((pp1x + 32) &^ 63) - pp1x; dx != 0 { + for i := np0; i < len(g.Points); i++ { + g.Points[i].X += dx + } + } + } + if simple { + g.Unhinted = append(g.Unhinted, g.Points[np1:]...) + } + // Round the 2nd and 4th phantom point to the grid. + p := &g.Points[len(g.Points)-3] + p.X = (p.X + 32) &^ 63 + p = &g.Points[len(g.Points)-1] + p.Y = (p.Y + 32) &^ 63 +} diff --git a/vendor/github.com/golang/freetype/truetype/hint.go b/vendor/github.com/golang/freetype/truetype/hint.go new file mode 100644 index 00000000..13f785bc --- /dev/null +++ b/vendor/github.com/golang/freetype/truetype/hint.go @@ -0,0 +1,1770 @@ +// Copyright 2012 The Freetype-Go Authors. All rights reserved. +// Use of this source code is governed by your choice of either the +// FreeType License or the GNU General Public License version 2 (or +// any later version), both of which can be found in the LICENSE file. + +package truetype + +// This file implements a Truetype bytecode interpreter. +// The opcodes are described at https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html + +import ( + "errors" + "math" + + "golang.org/x/image/math/fixed" +) + +const ( + twilightZone = 0 + glyphZone = 1 + numZone = 2 +) + +type pointType uint32 + +const ( + current pointType = 0 + unhinted pointType = 1 + inFontUnits pointType = 2 + numPointType = 3 +) + +// callStackEntry is a bytecode call stack entry. +type callStackEntry struct { + program []byte + pc int + loopCount int32 +} + +// hinter implements bytecode hinting. A hinter can be re-used to hint a series +// of glyphs from a Font. +type hinter struct { + stack, store []int32 + + // functions is a map from function number to bytecode. + functions map[int32][]byte + + // font and scale are the font and scale last used for this hinter. + // Changing the font will require running the new font's fpgm bytecode. + // Changing either will require running the font's prep bytecode. + font *Font + scale fixed.Int26_6 + + // gs and defaultGS are the current and default graphics state. The + // default graphics state is the global default graphics state after + // the font's fpgm and prep programs have been run. + gs, defaultGS graphicsState + + // points and ends are the twilight zone's points, glyph's points + // and glyph's contour boundaries. + points [numZone][numPointType][]Point + ends []int + + // scaledCVT is the lazily initialized scaled Control Value Table. + scaledCVTInitialized bool + scaledCVT []fixed.Int26_6 +} + +// graphicsState is described at https://developer.apple.com/fonts/TTRefMan/RM04/Chap4.html +type graphicsState struct { + // Projection vector, freedom vector and dual projection vector. + pv, fv, dv [2]f2dot14 + // Reference points and zone pointers. + rp, zp [3]int32 + // Control Value / Single Width Cut-In. + controlValueCutIn, singleWidthCutIn, singleWidth fixed.Int26_6 + // Delta base / shift. + deltaBase, deltaShift int32 + // Minimum distance. + minDist fixed.Int26_6 + // Loop count. + loop int32 + // Rounding policy. + roundPeriod, roundPhase, roundThreshold fixed.Int26_6 + roundSuper45 bool + // Auto-flip. + autoFlip bool +} + +var globalDefaultGS = graphicsState{ + pv: [2]f2dot14{0x4000, 0}, // Unit vector along the X axis. + fv: [2]f2dot14{0x4000, 0}, + dv: [2]f2dot14{0x4000, 0}, + zp: [3]int32{1, 1, 1}, + controlValueCutIn: (17 << 6) / 16, // 17/16 as a fixed.Int26_6. + deltaBase: 9, + deltaShift: 3, + minDist: 1 << 6, // 1 as a fixed.Int26_6. + loop: 1, + roundPeriod: 1 << 6, // 1 as a fixed.Int26_6. + roundThreshold: 1 << 5, // 1/2 as a fixed.Int26_6. + roundSuper45: false, + autoFlip: true, +} + +func resetTwilightPoints(f *Font, p []Point) []Point { + if n := int(f.maxTwilightPoints) + 4; n <= cap(p) { + p = p[:n] + for i := range p { + p[i] = Point{} + } + } else { + p = make([]Point, n) + } + return p +} + +func (h *hinter) init(f *Font, scale fixed.Int26_6) error { + h.points[twilightZone][0] = resetTwilightPoints(f, h.points[twilightZone][0]) + h.points[twilightZone][1] = resetTwilightPoints(f, h.points[twilightZone][1]) + h.points[twilightZone][2] = resetTwilightPoints(f, h.points[twilightZone][2]) + + rescale := h.scale != scale + if h.font != f { + h.font, rescale = f, true + if h.functions == nil { + h.functions = make(map[int32][]byte) + } else { + for k := range h.functions { + delete(h.functions, k) + } + } + + if x := int(f.maxStackElements); x > len(h.stack) { + x += 255 + x &^= 255 + h.stack = make([]int32, x) + } + if x := int(f.maxStorage); x > len(h.store) { + x += 15 + x &^= 15 + h.store = make([]int32, x) + } + if len(f.fpgm) != 0 { + if err := h.run(f.fpgm, nil, nil, nil, nil); err != nil { + return err + } + } + } + + if rescale { + h.scale = scale + h.scaledCVTInitialized = false + + h.defaultGS = globalDefaultGS + + if len(f.prep) != 0 { + if err := h.run(f.prep, nil, nil, nil, nil); err != nil { + return err + } + h.defaultGS = h.gs + // The MS rasterizer doesn't allow the following graphics state + // variables to be modified by the CVT program. + h.defaultGS.pv = globalDefaultGS.pv + h.defaultGS.fv = globalDefaultGS.fv + h.defaultGS.dv = globalDefaultGS.dv + h.defaultGS.rp = globalDefaultGS.rp + h.defaultGS.zp = globalDefaultGS.zp + h.defaultGS.loop = globalDefaultGS.loop + } + } + return nil +} + +func (h *hinter) run(program []byte, pCurrent, pUnhinted, pInFontUnits []Point, ends []int) error { + h.gs = h.defaultGS + h.points[glyphZone][current] = pCurrent + h.points[glyphZone][unhinted] = pUnhinted + h.points[glyphZone][inFontUnits] = pInFontUnits + h.ends = ends + + if len(program) > 50000 { + return errors.New("truetype: hinting: too many instructions") + } + var ( + steps, pc, top int + opcode uint8 + + callStack [32]callStackEntry + callStackTop int + ) + + for 0 <= pc && pc < len(program) { + steps++ + if steps == 100000 { + return errors.New("truetype: hinting: too many steps") + } + opcode = program[pc] + if top < int(popCount[opcode]) { + return errors.New("truetype: hinting: stack underflow") + } + switch opcode { + + case opSVTCA0: + h.gs.pv = [2]f2dot14{0, 0x4000} + h.gs.fv = [2]f2dot14{0, 0x4000} + h.gs.dv = [2]f2dot14{0, 0x4000} + + case opSVTCA1: + h.gs.pv = [2]f2dot14{0x4000, 0} + h.gs.fv = [2]f2dot14{0x4000, 0} + h.gs.dv = [2]f2dot14{0x4000, 0} + + case opSPVTCA0: + h.gs.pv = [2]f2dot14{0, 0x4000} + h.gs.dv = [2]f2dot14{0, 0x4000} + + case opSPVTCA1: + h.gs.pv = [2]f2dot14{0x4000, 0} + h.gs.dv = [2]f2dot14{0x4000, 0} + + case opSFVTCA0: + h.gs.fv = [2]f2dot14{0, 0x4000} + + case opSFVTCA1: + h.gs.fv = [2]f2dot14{0x4000, 0} + + case opSPVTL0, opSPVTL1, opSFVTL0, opSFVTL1: + top -= 2 + p1 := h.point(0, current, h.stack[top+0]) + p2 := h.point(0, current, h.stack[top+1]) + if p1 == nil || p2 == nil { + return errors.New("truetype: hinting: point out of range") + } + dx := f2dot14(p1.X - p2.X) + dy := f2dot14(p1.Y - p2.Y) + if dx == 0 && dy == 0 { + dx = 0x4000 + } else if opcode&1 != 0 { + // Counter-clockwise rotation. + dx, dy = -dy, dx + } + v := normalize(dx, dy) + if opcode < opSFVTL0 { + h.gs.pv = v + h.gs.dv = v + } else { + h.gs.fv = v + } + + case opSPVFS: + top -= 2 + h.gs.pv = normalize(f2dot14(h.stack[top]), f2dot14(h.stack[top+1])) + h.gs.dv = h.gs.pv + + case opSFVFS: + top -= 2 + h.gs.fv = normalize(f2dot14(h.stack[top]), f2dot14(h.stack[top+1])) + + case opGPV: + if top+1 >= len(h.stack) { + return errors.New("truetype: hinting: stack overflow") + } + h.stack[top+0] = int32(h.gs.pv[0]) + h.stack[top+1] = int32(h.gs.pv[1]) + top += 2 + + case opGFV: + if top+1 >= len(h.stack) { + return errors.New("truetype: hinting: stack overflow") + } + h.stack[top+0] = int32(h.gs.fv[0]) + h.stack[top+1] = int32(h.gs.fv[1]) + top += 2 + + case opSFVTPV: + h.gs.fv = h.gs.pv + + case opISECT: + top -= 5 + p := h.point(2, current, h.stack[top+0]) + a0 := h.point(1, current, h.stack[top+1]) + a1 := h.point(1, current, h.stack[top+2]) + b0 := h.point(0, current, h.stack[top+3]) + b1 := h.point(0, current, h.stack[top+4]) + if p == nil || a0 == nil || a1 == nil || b0 == nil || b1 == nil { + return errors.New("truetype: hinting: point out of range") + } + + dbx := b1.X - b0.X + dby := b1.Y - b0.Y + dax := a1.X - a0.X + day := a1.Y - a0.Y + dx := b0.X - a0.X + dy := b0.Y - a0.Y + discriminant := mulDiv(int64(dax), int64(-dby), 0x40) + + mulDiv(int64(day), int64(dbx), 0x40) + dotProduct := mulDiv(int64(dax), int64(dbx), 0x40) + + mulDiv(int64(day), int64(dby), 0x40) + // The discriminant above is actually a cross product of vectors + // da and db. Together with the dot product, they can be used as + // surrogates for sine and cosine of the angle between the vectors. + // Indeed, + // dotproduct = |da||db|cos(angle) + // discriminant = |da||db|sin(angle) + // We use these equations to reject grazing intersections by + // thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. + absDisc, absDotP := discriminant, dotProduct + if absDisc < 0 { + absDisc = -absDisc + } + if absDotP < 0 { + absDotP = -absDotP + } + if 19*absDisc > absDotP { + val := mulDiv(int64(dx), int64(-dby), 0x40) + + mulDiv(int64(dy), int64(dbx), 0x40) + rx := mulDiv(val, int64(dax), discriminant) + ry := mulDiv(val, int64(day), discriminant) + p.X = a0.X + fixed.Int26_6(rx) + p.Y = a0.Y + fixed.Int26_6(ry) + } else { + p.X = (a0.X + a1.X + b0.X + b1.X) / 4 + p.Y = (a0.Y + a1.Y + b0.Y + b1.Y) / 4 + } + p.Flags |= flagTouchedX | flagTouchedY + + case opSRP0, opSRP1, opSRP2: + top-- + h.gs.rp[opcode-opSRP0] = h.stack[top] + + case opSZP0, opSZP1, opSZP2: + top-- + h.gs.zp[opcode-opSZP0] = h.stack[top] + + case opSZPS: + top-- + h.gs.zp[0] = h.stack[top] + h.gs.zp[1] = h.stack[top] + h.gs.zp[2] = h.stack[top] + + case opSLOOP: + top-- + // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM05/Chap5.html#SLOOP + // says that "Setting the loop variable to zero is an error". In + // theory, the inequality on the next line should be "<=" instead + // of "<". In practice, some font files' bytecode, such as the '2' + // glyph in the DejaVuSansMono.ttf that comes with Ubuntu 14.04, + // issue SLOOP with a zero on top of the stack. Just like the C + // Freetype code, we allow the zero. + if h.stack[top] < 0 { + return errors.New("truetype: hinting: invalid data") + } + h.gs.loop = h.stack[top] + + case opRTG: + h.gs.roundPeriod = 1 << 6 + h.gs.roundPhase = 0 + h.gs.roundThreshold = 1 << 5 + h.gs.roundSuper45 = false + + case opRTHG: + h.gs.roundPeriod = 1 << 6 + h.gs.roundPhase = 1 << 5 + h.gs.roundThreshold = 1 << 5 + h.gs.roundSuper45 = false + + case opSMD: + top-- + h.gs.minDist = fixed.Int26_6(h.stack[top]) + + case opELSE: + opcode = 1 + goto ifelse + + case opJMPR: + top-- + pc += int(h.stack[top]) + continue + + case opSCVTCI: + top-- + h.gs.controlValueCutIn = fixed.Int26_6(h.stack[top]) + + case opSSWCI: + top-- + h.gs.singleWidthCutIn = fixed.Int26_6(h.stack[top]) + + case opSSW: + top-- + h.gs.singleWidth = h.font.scale(h.scale * fixed.Int26_6(h.stack[top])) + + case opDUP: + if top >= len(h.stack) { + return errors.New("truetype: hinting: stack overflow") + } + h.stack[top] = h.stack[top-1] + top++ + + case opPOP: + top-- + + case opCLEAR: + top = 0 + + case opSWAP: + h.stack[top-1], h.stack[top-2] = h.stack[top-2], h.stack[top-1] + + case opDEPTH: + if top >= len(h.stack) { + return errors.New("truetype: hinting: stack overflow") + } + h.stack[top] = int32(top) + top++ + + case opCINDEX, opMINDEX: + x := int(h.stack[top-1]) + if x <= 0 || x >= top { + return errors.New("truetype: hinting: invalid data") + } + h.stack[top-1] = h.stack[top-1-x] + if opcode == opMINDEX { + copy(h.stack[top-1-x:top-1], h.stack[top-x:top]) + top-- + } + + case opALIGNPTS: + top -= 2 + p := h.point(1, current, h.stack[top]) + q := h.point(0, current, h.stack[top+1]) + if p == nil || q == nil { + return errors.New("truetype: hinting: point out of range") + } + d := dotProduct(fixed.Int26_6(q.X-p.X), fixed.Int26_6(q.Y-p.Y), h.gs.pv) / 2 + h.move(p, +d, true) + h.move(q, -d, true) + + case opUTP: + top-- + p := h.point(0, current, h.stack[top]) + if p == nil { + return errors.New("truetype: hinting: point out of range") + } + p.Flags &^= flagTouchedX | flagTouchedY + + case opLOOPCALL, opCALL: + if callStackTop >= len(callStack) { + return errors.New("truetype: hinting: call stack overflow") + } + top-- + f, ok := h.functions[h.stack[top]] + if !ok { + return errors.New("truetype: hinting: undefined function") + } + callStack[callStackTop] = callStackEntry{program, pc, 1} + if opcode == opLOOPCALL { + top-- + if h.stack[top] == 0 { + break + } + callStack[callStackTop].loopCount = h.stack[top] + } + callStackTop++ + program, pc = f, 0 + continue + + case opFDEF: + // Save all bytecode up until the next ENDF. + startPC := pc + 1 + fdefloop: + for { + pc++ + if pc >= len(program) { + return errors.New("truetype: hinting: unbalanced FDEF") + } + switch program[pc] { + case opFDEF: + return errors.New("truetype: hinting: nested FDEF") + case opENDF: + top-- + h.functions[h.stack[top]] = program[startPC : pc+1] + break fdefloop + default: + var ok bool + pc, ok = skipInstructionPayload(program, pc) + if !ok { + return errors.New("truetype: hinting: unbalanced FDEF") + } + } + } + + case opENDF: + if callStackTop == 0 { + return errors.New("truetype: hinting: call stack underflow") + } + callStackTop-- + callStack[callStackTop].loopCount-- + if callStack[callStackTop].loopCount != 0 { + callStackTop++ + pc = 0 + continue + } + program, pc = callStack[callStackTop].program, callStack[callStackTop].pc + + case opMDAP0, opMDAP1: + top-- + i := h.stack[top] + p := h.point(0, current, i) + if p == nil { + return errors.New("truetype: hinting: point out of range") + } + distance := fixed.Int26_6(0) + if opcode == opMDAP1 { + distance = dotProduct(p.X, p.Y, h.gs.pv) + // TODO: metrics compensation. + distance = h.round(distance) - distance + } + h.move(p, distance, true) + h.gs.rp[0] = i + h.gs.rp[1] = i + + case opIUP0, opIUP1: + iupY, mask := opcode == opIUP0, uint32(flagTouchedX) + if iupY { + mask = flagTouchedY + } + prevEnd := 0 + for _, end := range h.ends { + for i := prevEnd; i < end; i++ { + for i < end && h.points[glyphZone][current][i].Flags&mask == 0 { + i++ + } + if i == end { + break + } + firstTouched, curTouched := i, i + i++ + for ; i < end; i++ { + if h.points[glyphZone][current][i].Flags&mask != 0 { + h.iupInterp(iupY, curTouched+1, i-1, curTouched, i) + curTouched = i + } + } + if curTouched == firstTouched { + h.iupShift(iupY, prevEnd, end, curTouched) + } else { + h.iupInterp(iupY, curTouched+1, end-1, curTouched, firstTouched) + if firstTouched > 0 { + h.iupInterp(iupY, prevEnd, firstTouched-1, curTouched, firstTouched) + } + } + } + prevEnd = end + } + + case opSHP0, opSHP1: + if top < int(h.gs.loop) { + return errors.New("truetype: hinting: stack underflow") + } + _, _, d, ok := h.displacement(opcode&1 == 0) + if !ok { + return errors.New("truetype: hinting: point out of range") + } + for ; h.gs.loop != 0; h.gs.loop-- { + top-- + p := h.point(2, current, h.stack[top]) + if p == nil { + return errors.New("truetype: hinting: point out of range") + } + h.move(p, d, true) + } + h.gs.loop = 1 + + case opSHC0, opSHC1: + top-- + zonePointer, i, d, ok := h.displacement(opcode&1 == 0) + if !ok { + return errors.New("truetype: hinting: point out of range") + } + if h.gs.zp[2] == 0 { + // TODO: implement this when we have a glyph that does this. + return errors.New("hinting: unimplemented SHC instruction") + } + contour := h.stack[top] + if contour < 0 || len(ends) <= int(contour) { + return errors.New("truetype: hinting: contour out of range") + } + j0, j1 := int32(0), int32(h.ends[contour]) + if contour > 0 { + j0 = int32(h.ends[contour-1]) + } + move := h.gs.zp[zonePointer] != h.gs.zp[2] + for j := j0; j < j1; j++ { + if move || j != i { + h.move(h.point(2, current, j), d, true) + } + } + + case opSHZ0, opSHZ1: + top-- + zonePointer, i, d, ok := h.displacement(opcode&1 == 0) + if !ok { + return errors.New("truetype: hinting: point out of range") + } + + // As per C Freetype, SHZ doesn't move the phantom points, or mark + // the points as touched. + limit := int32(len(h.points[h.gs.zp[2]][current])) + if h.gs.zp[2] == glyphZone { + limit -= 4 + } + for j := int32(0); j < limit; j++ { + if i != j || h.gs.zp[zonePointer] != h.gs.zp[2] { + h.move(h.point(2, current, j), d, false) + } + } + + case opSHPIX: + top-- + d := fixed.Int26_6(h.stack[top]) + if top < int(h.gs.loop) { + return errors.New("truetype: hinting: stack underflow") + } + for ; h.gs.loop != 0; h.gs.loop-- { + top-- + p := h.point(2, current, h.stack[top]) + if p == nil { + return errors.New("truetype: hinting: point out of range") + } + h.move(p, d, true) + } + h.gs.loop = 1 + + case opIP: + if top < int(h.gs.loop) { + return errors.New("truetype: hinting: stack underflow") + } + pointType := inFontUnits + twilight := h.gs.zp[0] == 0 || h.gs.zp[1] == 0 || h.gs.zp[2] == 0 + if twilight { + pointType = unhinted + } + p := h.point(1, pointType, h.gs.rp[2]) + oldP := h.point(0, pointType, h.gs.rp[1]) + oldRange := dotProduct(p.X-oldP.X, p.Y-oldP.Y, h.gs.dv) + + p = h.point(1, current, h.gs.rp[2]) + curP := h.point(0, current, h.gs.rp[1]) + curRange := dotProduct(p.X-curP.X, p.Y-curP.Y, h.gs.pv) + for ; h.gs.loop != 0; h.gs.loop-- { + top-- + i := h.stack[top] + p = h.point(2, pointType, i) + oldDist := dotProduct(p.X-oldP.X, p.Y-oldP.Y, h.gs.dv) + p = h.point(2, current, i) + curDist := dotProduct(p.X-curP.X, p.Y-curP.Y, h.gs.pv) + newDist := fixed.Int26_6(0) + if oldDist != 0 { + if oldRange != 0 { + newDist = fixed.Int26_6(mulDiv(int64(oldDist), int64(curRange), int64(oldRange))) + } else { + newDist = -oldDist + } + } + h.move(p, newDist-curDist, true) + } + h.gs.loop = 1 + + case opMSIRP0, opMSIRP1: + top -= 2 + i := h.stack[top] + distance := fixed.Int26_6(h.stack[top+1]) + + // TODO: special case h.gs.zp[1] == 0 in C Freetype. + ref := h.point(0, current, h.gs.rp[0]) + p := h.point(1, current, i) + if ref == nil || p == nil { + return errors.New("truetype: hinting: point out of range") + } + curDist := dotProduct(p.X-ref.X, p.Y-ref.Y, h.gs.pv) + + // Set-RP0 bit. + if opcode == opMSIRP1 { + h.gs.rp[0] = i + } + h.gs.rp[1] = h.gs.rp[0] + h.gs.rp[2] = i + + // Move the point. + h.move(p, distance-curDist, true) + + case opALIGNRP: + if top < int(h.gs.loop) { + return errors.New("truetype: hinting: stack underflow") + } + ref := h.point(0, current, h.gs.rp[0]) + if ref == nil { + return errors.New("truetype: hinting: point out of range") + } + for ; h.gs.loop != 0; h.gs.loop-- { + top-- + p := h.point(1, current, h.stack[top]) + if p == nil { + return errors.New("truetype: hinting: point out of range") + } + h.move(p, -dotProduct(p.X-ref.X, p.Y-ref.Y, h.gs.pv), true) + } + h.gs.loop = 1 + + case opRTDG: + h.gs.roundPeriod = 1 << 5 + h.gs.roundPhase = 0 + h.gs.roundThreshold = 1 << 4 + h.gs.roundSuper45 = false + + case opMIAP0, opMIAP1: + top -= 2 + i := h.stack[top] + distance := h.getScaledCVT(h.stack[top+1]) + if h.gs.zp[0] == 0 { + p := h.point(0, unhinted, i) + q := h.point(0, current, i) + p.X = fixed.Int26_6((int64(distance) * int64(h.gs.fv[0])) >> 14) + p.Y = fixed.Int26_6((int64(distance) * int64(h.gs.fv[1])) >> 14) + *q = *p + } + p := h.point(0, current, i) + oldDist := dotProduct(p.X, p.Y, h.gs.pv) + if opcode == opMIAP1 { + if fabs(distance-oldDist) > h.gs.controlValueCutIn { + distance = oldDist + } + // TODO: metrics compensation. + distance = h.round(distance) + } + h.move(p, distance-oldDist, true) + h.gs.rp[0] = i + h.gs.rp[1] = i + + case opNPUSHB: + opcode = 0 + goto push + + case opNPUSHW: + opcode = 0x80 + goto push + + case opWS: + top -= 2 + i := int(h.stack[top]) + if i < 0 || len(h.store) <= i { + return errors.New("truetype: hinting: invalid data") + } + h.store[i] = h.stack[top+1] + + case opRS: + i := int(h.stack[top-1]) + if i < 0 || len(h.store) <= i { + return errors.New("truetype: hinting: invalid data") + } + h.stack[top-1] = h.store[i] + + case opWCVTP: + top -= 2 + h.setScaledCVT(h.stack[top], fixed.Int26_6(h.stack[top+1])) + + case opRCVT: + h.stack[top-1] = int32(h.getScaledCVT(h.stack[top-1])) + + case opGC0, opGC1: + i := h.stack[top-1] + if opcode == opGC0 { + p := h.point(2, current, i) + h.stack[top-1] = int32(dotProduct(p.X, p.Y, h.gs.pv)) + } else { + p := h.point(2, unhinted, i) + // Using dv as per C Freetype. + h.stack[top-1] = int32(dotProduct(p.X, p.Y, h.gs.dv)) + } + + case opSCFS: + top -= 2 + i := h.stack[top] + p := h.point(2, current, i) + if p == nil { + return errors.New("truetype: hinting: point out of range") + } + c := dotProduct(p.X, p.Y, h.gs.pv) + h.move(p, fixed.Int26_6(h.stack[top+1])-c, true) + if h.gs.zp[2] != 0 { + break + } + q := h.point(2, unhinted, i) + if q == nil { + return errors.New("truetype: hinting: point out of range") + } + q.X = p.X + q.Y = p.Y + + case opMD0, opMD1: + top-- + pt, v, scale := pointType(0), [2]f2dot14{}, false + if opcode == opMD0 { + pt = current + v = h.gs.pv + } else if h.gs.zp[0] == 0 || h.gs.zp[1] == 0 { + pt = unhinted + v = h.gs.dv + } else { + pt = inFontUnits + v = h.gs.dv + scale = true + } + p := h.point(0, pt, h.stack[top-1]) + q := h.point(1, pt, h.stack[top]) + if p == nil || q == nil { + return errors.New("truetype: hinting: point out of range") + } + d := int32(dotProduct(p.X-q.X, p.Y-q.Y, v)) + if scale { + d = int32(int64(d*int32(h.scale)) / int64(h.font.fUnitsPerEm)) + } + h.stack[top-1] = d + + case opMPPEM, opMPS: + if top >= len(h.stack) { + return errors.New("truetype: hinting: stack overflow") + } + // For MPS, point size should be irrelevant; we return the PPEM. + h.stack[top] = int32(h.scale) >> 6 + top++ + + case opFLIPON, opFLIPOFF: + h.gs.autoFlip = opcode == opFLIPON + + case opDEBUG: + // No-op. + + case opLT: + top-- + h.stack[top-1] = bool2int32(h.stack[top-1] < h.stack[top]) + + case opLTEQ: + top-- + h.stack[top-1] = bool2int32(h.stack[top-1] <= h.stack[top]) + + case opGT: + top-- + h.stack[top-1] = bool2int32(h.stack[top-1] > h.stack[top]) + + case opGTEQ: + top-- + h.stack[top-1] = bool2int32(h.stack[top-1] >= h.stack[top]) + + case opEQ: + top-- + h.stack[top-1] = bool2int32(h.stack[top-1] == h.stack[top]) + + case opNEQ: + top-- + h.stack[top-1] = bool2int32(h.stack[top-1] != h.stack[top]) + + case opODD, opEVEN: + i := h.round(fixed.Int26_6(h.stack[top-1])) >> 6 + h.stack[top-1] = int32(i&1) ^ int32(opcode-opODD) + + case opIF: + top-- + if h.stack[top] == 0 { + opcode = 0 + goto ifelse + } + + case opEIF: + // No-op. + + case opAND: + top-- + h.stack[top-1] = bool2int32(h.stack[top-1] != 0 && h.stack[top] != 0) + + case opOR: + top-- + h.stack[top-1] = bool2int32(h.stack[top-1]|h.stack[top] != 0) + + case opNOT: + h.stack[top-1] = bool2int32(h.stack[top-1] == 0) + + case opDELTAP1: + goto delta + + case opSDB: + top-- + h.gs.deltaBase = h.stack[top] + + case opSDS: + top-- + h.gs.deltaShift = h.stack[top] + + case opADD: + top-- + h.stack[top-1] += h.stack[top] + + case opSUB: + top-- + h.stack[top-1] -= h.stack[top] + + case opDIV: + top-- + if h.stack[top] == 0 { + return errors.New("truetype: hinting: division by zero") + } + h.stack[top-1] = int32(fdiv(fixed.Int26_6(h.stack[top-1]), fixed.Int26_6(h.stack[top]))) + + case opMUL: + top-- + h.stack[top-1] = int32(fmul(fixed.Int26_6(h.stack[top-1]), fixed.Int26_6(h.stack[top]))) + + case opABS: + if h.stack[top-1] < 0 { + h.stack[top-1] = -h.stack[top-1] + } + + case opNEG: + h.stack[top-1] = -h.stack[top-1] + + case opFLOOR: + h.stack[top-1] &^= 63 + + case opCEILING: + h.stack[top-1] += 63 + h.stack[top-1] &^= 63 + + case opROUND00, opROUND01, opROUND10, opROUND11: + // The four flavors of opROUND are equivalent. See the comment below on + // opNROUND for the rationale. + h.stack[top-1] = int32(h.round(fixed.Int26_6(h.stack[top-1]))) + + case opNROUND00, opNROUND01, opNROUND10, opNROUND11: + // No-op. The spec says to add one of four "compensations for the engine + // characteristics", to cater for things like "different dot-size printers". + // https://developer.apple.com/fonts/TTRefMan/RM02/Chap2.html#engine_compensation + // This code does not implement engine compensation, as we don't expect to + // be used to output on dot-matrix printers. + + case opWCVTF: + top -= 2 + h.setScaledCVT(h.stack[top], h.font.scale(h.scale*fixed.Int26_6(h.stack[top+1]))) + + case opDELTAP2, opDELTAP3, opDELTAC1, opDELTAC2, opDELTAC3: + goto delta + + case opSROUND, opS45ROUND: + top-- + switch (h.stack[top] >> 6) & 0x03 { + case 0: + h.gs.roundPeriod = 1 << 5 + case 1, 3: + h.gs.roundPeriod = 1 << 6 + case 2: + h.gs.roundPeriod = 1 << 7 + } + h.gs.roundSuper45 = opcode == opS45ROUND + if h.gs.roundSuper45 { + // The spec says to multiply by √2, but the C Freetype code says 1/√2. + // We go with 1/√2. + h.gs.roundPeriod *= 46341 + h.gs.roundPeriod /= 65536 + } + h.gs.roundPhase = h.gs.roundPeriod * fixed.Int26_6((h.stack[top]>>4)&0x03) / 4 + if x := h.stack[top] & 0x0f; x != 0 { + h.gs.roundThreshold = h.gs.roundPeriod * fixed.Int26_6(x-4) / 8 + } else { + h.gs.roundThreshold = h.gs.roundPeriod - 1 + } + + case opJROT: + top -= 2 + if h.stack[top+1] != 0 { + pc += int(h.stack[top]) + continue + } + + case opJROF: + top -= 2 + if h.stack[top+1] == 0 { + pc += int(h.stack[top]) + continue + } + + case opROFF: + h.gs.roundPeriod = 0 + h.gs.roundPhase = 0 + h.gs.roundThreshold = 0 + h.gs.roundSuper45 = false + + case opRUTG: + h.gs.roundPeriod = 1 << 6 + h.gs.roundPhase = 0 + h.gs.roundThreshold = 1<<6 - 1 + h.gs.roundSuper45 = false + + case opRDTG: + h.gs.roundPeriod = 1 << 6 + h.gs.roundPhase = 0 + h.gs.roundThreshold = 0 + h.gs.roundSuper45 = false + + case opSANGW, opAA: + // These ops are "anachronistic" and no longer used. + top-- + + case opFLIPPT: + if top < int(h.gs.loop) { + return errors.New("truetype: hinting: stack underflow") + } + points := h.points[glyphZone][current] + for ; h.gs.loop != 0; h.gs.loop-- { + top-- + i := h.stack[top] + if i < 0 || len(points) <= int(i) { + return errors.New("truetype: hinting: point out of range") + } + points[i].Flags ^= flagOnCurve + } + h.gs.loop = 1 + + case opFLIPRGON, opFLIPRGOFF: + top -= 2 + i, j, points := h.stack[top], h.stack[top+1], h.points[glyphZone][current] + if i < 0 || len(points) <= int(i) || j < 0 || len(points) <= int(j) { + return errors.New("truetype: hinting: point out of range") + } + for ; i <= j; i++ { + if opcode == opFLIPRGON { + points[i].Flags |= flagOnCurve + } else { + points[i].Flags &^= flagOnCurve + } + } + + case opSCANCTRL: + // We do not support dropout control, as we always rasterize grayscale glyphs. + top-- + + case opSDPVTL0, opSDPVTL1: + top -= 2 + for i := 0; i < 2; i++ { + pt := unhinted + if i != 0 { + pt = current + } + p := h.point(1, pt, h.stack[top]) + q := h.point(2, pt, h.stack[top+1]) + if p == nil || q == nil { + return errors.New("truetype: hinting: point out of range") + } + dx := f2dot14(p.X - q.X) + dy := f2dot14(p.Y - q.Y) + if dx == 0 && dy == 0 { + dx = 0x4000 + } else if opcode&1 != 0 { + // Counter-clockwise rotation. + dx, dy = -dy, dx + } + if i == 0 { + h.gs.dv = normalize(dx, dy) + } else { + h.gs.pv = normalize(dx, dy) + } + } + + case opGETINFO: + res := int32(0) + if h.stack[top-1]&(1<<0) != 0 { + // Set the engine version. We hard-code this to 35, the same as + // the C freetype code, which says that "Version~35 corresponds + // to MS rasterizer v.1.7 as used e.g. in Windows~98". + res |= 35 + } + if h.stack[top-1]&(1<<5) != 0 { + // Set that we support grayscale. + res |= 1 << 12 + } + // We set no other bits, as we do not support rotated or stretched glyphs. + h.stack[top-1] = res + + case opIDEF: + // IDEF is for ancient versions of the bytecode interpreter, and is no longer used. + return errors.New("truetype: hinting: unsupported IDEF instruction") + + case opROLL: + h.stack[top-1], h.stack[top-3], h.stack[top-2] = + h.stack[top-3], h.stack[top-2], h.stack[top-1] + + case opMAX: + top-- + if h.stack[top-1] < h.stack[top] { + h.stack[top-1] = h.stack[top] + } + + case opMIN: + top-- + if h.stack[top-1] > h.stack[top] { + h.stack[top-1] = h.stack[top] + } + + case opSCANTYPE: + // We do not support dropout control, as we always rasterize grayscale glyphs. + top-- + + case opINSTCTRL: + // TODO: support instruction execution control? It seems rare, and even when + // nominally used (e.g. Source Sans Pro), it seems conditional on extreme or + // unusual rasterization conditions. For example, the code snippet at + // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html#INSTCTRL + // uses INSTCTRL when grid-fitting a rotated or stretched glyph, but + // freetype-go does not support rotated or stretched glyphs. + top -= 2 + + default: + if opcode < opPUSHB000 { + return errors.New("truetype: hinting: unrecognized instruction") + } + + if opcode < opMDRP00000 { + // PUSHxxxx opcode. + + if opcode < opPUSHW000 { + opcode -= opPUSHB000 - 1 + } else { + opcode -= opPUSHW000 - 1 - 0x80 + } + goto push + } + + if opcode < opMIRP00000 { + // MDRPxxxxx opcode. + + top-- + i := h.stack[top] + ref := h.point(0, current, h.gs.rp[0]) + p := h.point(1, current, i) + if ref == nil || p == nil { + return errors.New("truetype: hinting: point out of range") + } + + oldDist := fixed.Int26_6(0) + if h.gs.zp[0] == 0 || h.gs.zp[1] == 0 { + p0 := h.point(1, unhinted, i) + p1 := h.point(0, unhinted, h.gs.rp[0]) + oldDist = dotProduct(p0.X-p1.X, p0.Y-p1.Y, h.gs.dv) + } else { + p0 := h.point(1, inFontUnits, i) + p1 := h.point(0, inFontUnits, h.gs.rp[0]) + oldDist = dotProduct(p0.X-p1.X, p0.Y-p1.Y, h.gs.dv) + oldDist = h.font.scale(h.scale * oldDist) + } + + // Single-width cut-in test. + if x := fabs(oldDist - h.gs.singleWidth); x < h.gs.singleWidthCutIn { + if oldDist >= 0 { + oldDist = +h.gs.singleWidth + } else { + oldDist = -h.gs.singleWidth + } + } + + // Rounding bit. + // TODO: metrics compensation. + distance := oldDist + if opcode&0x04 != 0 { + distance = h.round(oldDist) + } + + // Minimum distance bit. + if opcode&0x08 != 0 { + if oldDist >= 0 { + if distance < h.gs.minDist { + distance = h.gs.minDist + } + } else { + if distance > -h.gs.minDist { + distance = -h.gs.minDist + } + } + } + + // Set-RP0 bit. + h.gs.rp[1] = h.gs.rp[0] + h.gs.rp[2] = i + if opcode&0x10 != 0 { + h.gs.rp[0] = i + } + + // Move the point. + oldDist = dotProduct(p.X-ref.X, p.Y-ref.Y, h.gs.pv) + h.move(p, distance-oldDist, true) + + } else { + // MIRPxxxxx opcode. + + top -= 2 + i := h.stack[top] + cvtDist := h.getScaledCVT(h.stack[top+1]) + if fabs(cvtDist-h.gs.singleWidth) < h.gs.singleWidthCutIn { + if cvtDist >= 0 { + cvtDist = +h.gs.singleWidth + } else { + cvtDist = -h.gs.singleWidth + } + } + + if h.gs.zp[1] == 0 { + // TODO: implement once we have a .ttf file that triggers + // this, so that we can step through C's freetype. + return errors.New("truetype: hinting: unimplemented twilight point adjustment") + } + + ref := h.point(0, unhinted, h.gs.rp[0]) + p := h.point(1, unhinted, i) + if ref == nil || p == nil { + return errors.New("truetype: hinting: point out of range") + } + oldDist := dotProduct(p.X-ref.X, p.Y-ref.Y, h.gs.dv) + + ref = h.point(0, current, h.gs.rp[0]) + p = h.point(1, current, i) + if ref == nil || p == nil { + return errors.New("truetype: hinting: point out of range") + } + curDist := dotProduct(p.X-ref.X, p.Y-ref.Y, h.gs.pv) + + if h.gs.autoFlip && oldDist^cvtDist < 0 { + cvtDist = -cvtDist + } + + // Rounding bit. + // TODO: metrics compensation. + distance := cvtDist + if opcode&0x04 != 0 { + // The CVT value is only used if close enough to oldDist. + if (h.gs.zp[0] == h.gs.zp[1]) && + (fabs(cvtDist-oldDist) > h.gs.controlValueCutIn) { + + distance = oldDist + } + distance = h.round(distance) + } + + // Minimum distance bit. + if opcode&0x08 != 0 { + if oldDist >= 0 { + if distance < h.gs.minDist { + distance = h.gs.minDist + } + } else { + if distance > -h.gs.minDist { + distance = -h.gs.minDist + } + } + } + + // Set-RP0 bit. + h.gs.rp[1] = h.gs.rp[0] + h.gs.rp[2] = i + if opcode&0x10 != 0 { + h.gs.rp[0] = i + } + + // Move the point. + h.move(p, distance-curDist, true) + } + } + pc++ + continue + + ifelse: + // Skip past bytecode until the next ELSE (if opcode == 0) or the + // next EIF (for all opcodes). Opcode == 0 means that we have come + // from an IF. Opcode == 1 means that we have come from an ELSE. + { + ifelseloop: + for depth := 0; ; { + pc++ + if pc >= len(program) { + return errors.New("truetype: hinting: unbalanced IF or ELSE") + } + switch program[pc] { + case opIF: + depth++ + case opELSE: + if depth == 0 && opcode == 0 { + break ifelseloop + } + case opEIF: + depth-- + if depth < 0 { + break ifelseloop + } + default: + var ok bool + pc, ok = skipInstructionPayload(program, pc) + if !ok { + return errors.New("truetype: hinting: unbalanced IF or ELSE") + } + } + } + pc++ + continue + } + + push: + // Push n elements from the program to the stack, where n is the low 7 bits of + // opcode. If the low 7 bits are zero, then n is the next byte from the program. + // The high bit being 0 means that the elements are zero-extended bytes. + // The high bit being 1 means that the elements are sign-extended words. + { + width := 1 + if opcode&0x80 != 0 { + opcode &^= 0x80 + width = 2 + } + if opcode == 0 { + pc++ + if pc >= len(program) { + return errors.New("truetype: hinting: insufficient data") + } + opcode = program[pc] + } + pc++ + if top+int(opcode) > len(h.stack) { + return errors.New("truetype: hinting: stack overflow") + } + if pc+width*int(opcode) > len(program) { + return errors.New("truetype: hinting: insufficient data") + } + for ; opcode > 0; opcode-- { + if width == 1 { + h.stack[top] = int32(program[pc]) + } else { + h.stack[top] = int32(int8(program[pc]))<<8 | int32(program[pc+1]) + } + top++ + pc += width + } + continue + } + + delta: + { + if opcode >= opDELTAC1 && !h.scaledCVTInitialized { + h.initializeScaledCVT() + } + top-- + n := h.stack[top] + if int32(top) < 2*n { + return errors.New("truetype: hinting: stack underflow") + } + for ; n > 0; n-- { + top -= 2 + b := h.stack[top] + c := (b & 0xf0) >> 4 + switch opcode { + case opDELTAP2, opDELTAC2: + c += 16 + case opDELTAP3, opDELTAC3: + c += 32 + } + c += h.gs.deltaBase + if ppem := (int32(h.scale) + 1<<5) >> 6; ppem != c { + continue + } + b = (b & 0x0f) - 8 + if b >= 0 { + b++ + } + b = b * 64 / (1 << uint32(h.gs.deltaShift)) + if opcode >= opDELTAC1 { + a := h.stack[top+1] + if a < 0 || len(h.scaledCVT) <= int(a) { + return errors.New("truetype: hinting: index out of range") + } + h.scaledCVT[a] += fixed.Int26_6(b) + } else { + p := h.point(0, current, h.stack[top+1]) + if p == nil { + return errors.New("truetype: hinting: point out of range") + } + h.move(p, fixed.Int26_6(b), true) + } + } + pc++ + continue + } + } + return nil +} + +func (h *hinter) initializeScaledCVT() { + h.scaledCVTInitialized = true + if n := len(h.font.cvt) / 2; n <= cap(h.scaledCVT) { + h.scaledCVT = h.scaledCVT[:n] + } else { + if n < 32 { + n = 32 + } + h.scaledCVT = make([]fixed.Int26_6, len(h.font.cvt)/2, n) + } + for i := range h.scaledCVT { + unscaled := uint16(h.font.cvt[2*i])<<8 | uint16(h.font.cvt[2*i+1]) + h.scaledCVT[i] = h.font.scale(h.scale * fixed.Int26_6(int16(unscaled))) + } +} + +// getScaledCVT returns the scaled value from the font's Control Value Table. +func (h *hinter) getScaledCVT(i int32) fixed.Int26_6 { + if !h.scaledCVTInitialized { + h.initializeScaledCVT() + } + if i < 0 || len(h.scaledCVT) <= int(i) { + return 0 + } + return h.scaledCVT[i] +} + +// setScaledCVT overrides the scaled value from the font's Control Value Table. +func (h *hinter) setScaledCVT(i int32, v fixed.Int26_6) { + if !h.scaledCVTInitialized { + h.initializeScaledCVT() + } + if i < 0 || len(h.scaledCVT) <= int(i) { + return + } + h.scaledCVT[i] = v +} + +func (h *hinter) point(zonePointer uint32, pt pointType, i int32) *Point { + points := h.points[h.gs.zp[zonePointer]][pt] + if i < 0 || len(points) <= int(i) { + return nil + } + return &points[i] +} + +func (h *hinter) move(p *Point, distance fixed.Int26_6, touch bool) { + fvx := int64(h.gs.fv[0]) + pvx := int64(h.gs.pv[0]) + if fvx == 0x4000 && pvx == 0x4000 { + p.X += fixed.Int26_6(distance) + if touch { + p.Flags |= flagTouchedX + } + return + } + + fvy := int64(h.gs.fv[1]) + pvy := int64(h.gs.pv[1]) + if fvy == 0x4000 && pvy == 0x4000 { + p.Y += fixed.Int26_6(distance) + if touch { + p.Flags |= flagTouchedY + } + return + } + + fvDotPv := (fvx*pvx + fvy*pvy) >> 14 + + if fvx != 0 { + p.X += fixed.Int26_6(mulDiv(fvx, int64(distance), fvDotPv)) + if touch { + p.Flags |= flagTouchedX + } + } + + if fvy != 0 { + p.Y += fixed.Int26_6(mulDiv(fvy, int64(distance), fvDotPv)) + if touch { + p.Flags |= flagTouchedY + } + } +} + +func (h *hinter) iupInterp(interpY bool, p1, p2, ref1, ref2 int) { + if p1 > p2 { + return + } + if ref1 >= len(h.points[glyphZone][current]) || + ref2 >= len(h.points[glyphZone][current]) { + return + } + + var ifu1, ifu2 fixed.Int26_6 + if interpY { + ifu1 = h.points[glyphZone][inFontUnits][ref1].Y + ifu2 = h.points[glyphZone][inFontUnits][ref2].Y + } else { + ifu1 = h.points[glyphZone][inFontUnits][ref1].X + ifu2 = h.points[glyphZone][inFontUnits][ref2].X + } + if ifu1 > ifu2 { + ifu1, ifu2 = ifu2, ifu1 + ref1, ref2 = ref2, ref1 + } + + var unh1, unh2, delta1, delta2 fixed.Int26_6 + if interpY { + unh1 = h.points[glyphZone][unhinted][ref1].Y + unh2 = h.points[glyphZone][unhinted][ref2].Y + delta1 = h.points[glyphZone][current][ref1].Y - unh1 + delta2 = h.points[glyphZone][current][ref2].Y - unh2 + } else { + unh1 = h.points[glyphZone][unhinted][ref1].X + unh2 = h.points[glyphZone][unhinted][ref2].X + delta1 = h.points[glyphZone][current][ref1].X - unh1 + delta2 = h.points[glyphZone][current][ref2].X - unh2 + } + + var xy, ifuXY fixed.Int26_6 + if ifu1 == ifu2 { + for i := p1; i <= p2; i++ { + if interpY { + xy = h.points[glyphZone][unhinted][i].Y + } else { + xy = h.points[glyphZone][unhinted][i].X + } + + if xy <= unh1 { + xy += delta1 + } else { + xy += delta2 + } + + if interpY { + h.points[glyphZone][current][i].Y = xy + } else { + h.points[glyphZone][current][i].X = xy + } + } + return + } + + scale, scaleOK := int64(0), false + for i := p1; i <= p2; i++ { + if interpY { + xy = h.points[glyphZone][unhinted][i].Y + ifuXY = h.points[glyphZone][inFontUnits][i].Y + } else { + xy = h.points[glyphZone][unhinted][i].X + ifuXY = h.points[glyphZone][inFontUnits][i].X + } + + if xy <= unh1 { + xy += delta1 + } else if xy >= unh2 { + xy += delta2 + } else { + if !scaleOK { + scaleOK = true + scale = mulDiv(int64(unh2+delta2-unh1-delta1), 0x10000, int64(ifu2-ifu1)) + } + numer := int64(ifuXY-ifu1) * scale + if numer >= 0 { + numer += 0x8000 + } else { + numer -= 0x8000 + } + xy = unh1 + delta1 + fixed.Int26_6(numer/0x10000) + } + + if interpY { + h.points[glyphZone][current][i].Y = xy + } else { + h.points[glyphZone][current][i].X = xy + } + } +} + +func (h *hinter) iupShift(interpY bool, p1, p2, p int) { + var delta fixed.Int26_6 + if interpY { + delta = h.points[glyphZone][current][p].Y - h.points[glyphZone][unhinted][p].Y + } else { + delta = h.points[glyphZone][current][p].X - h.points[glyphZone][unhinted][p].X + } + if delta == 0 { + return + } + for i := p1; i < p2; i++ { + if i == p { + continue + } + if interpY { + h.points[glyphZone][current][i].Y += delta + } else { + h.points[glyphZone][current][i].X += delta + } + } +} + +func (h *hinter) displacement(useZP1 bool) (zonePointer uint32, i int32, d fixed.Int26_6, ok bool) { + zonePointer, i = uint32(0), h.gs.rp[1] + if useZP1 { + zonePointer, i = 1, h.gs.rp[2] + } + p := h.point(zonePointer, current, i) + q := h.point(zonePointer, unhinted, i) + if p == nil || q == nil { + return 0, 0, 0, false + } + d = dotProduct(p.X-q.X, p.Y-q.Y, h.gs.pv) + return zonePointer, i, d, true +} + +// skipInstructionPayload increments pc by the extra data that follows a +// variable length PUSHB or PUSHW instruction. +func skipInstructionPayload(program []byte, pc int) (newPC int, ok bool) { + switch program[pc] { + case opNPUSHB: + pc++ + if pc >= len(program) { + return 0, false + } + pc += int(program[pc]) + case opNPUSHW: + pc++ + if pc >= len(program) { + return 0, false + } + pc += 2 * int(program[pc]) + case opPUSHB000, opPUSHB001, opPUSHB010, opPUSHB011, + opPUSHB100, opPUSHB101, opPUSHB110, opPUSHB111: + pc += int(program[pc] - (opPUSHB000 - 1)) + case opPUSHW000, opPUSHW001, opPUSHW010, opPUSHW011, + opPUSHW100, opPUSHW101, opPUSHW110, opPUSHW111: + pc += 2 * int(program[pc]-(opPUSHW000-1)) + } + return pc, true +} + +// f2dot14 is a 2.14 fixed point number. +type f2dot14 int16 + +func normalize(x, y f2dot14) [2]f2dot14 { + fx, fy := float64(x), float64(y) + l := 0x4000 / math.Hypot(fx, fy) + fx *= l + if fx >= 0 { + fx += 0.5 + } else { + fx -= 0.5 + } + fy *= l + if fy >= 0 { + fy += 0.5 + } else { + fy -= 0.5 + } + return [2]f2dot14{f2dot14(fx), f2dot14(fy)} +} + +// fabs returns abs(x) in 26.6 fixed point arithmetic. +func fabs(x fixed.Int26_6) fixed.Int26_6 { + if x < 0 { + return -x + } + return x +} + +// fdiv returns x/y in 26.6 fixed point arithmetic. +func fdiv(x, y fixed.Int26_6) fixed.Int26_6 { + return fixed.Int26_6((int64(x) << 6) / int64(y)) +} + +// fmul returns x*y in 26.6 fixed point arithmetic. +func fmul(x, y fixed.Int26_6) fixed.Int26_6 { + return fixed.Int26_6((int64(x)*int64(y) + 1<<5) >> 6) +} + +// dotProduct returns the dot product of [x, y] and q. It is almost the same as +// px := int64(x) +// py := int64(y) +// qx := int64(q[0]) +// qy := int64(q[1]) +// return fixed.Int26_6((px*qx + py*qy + 1<<13) >> 14) +// except that the computation is done with 32-bit integers to produce exactly +// the same rounding behavior as C Freetype. +func dotProduct(x, y fixed.Int26_6, q [2]f2dot14) fixed.Int26_6 { + // Compute x*q[0] as 64-bit value. + l := uint32((int32(x) & 0xFFFF) * int32(q[0])) + m := (int32(x) >> 16) * int32(q[0]) + + lo1 := l + (uint32(m) << 16) + hi1 := (m >> 16) + (int32(l) >> 31) + bool2int32(lo1 < l) + + // Compute y*q[1] as 64-bit value. + l = uint32((int32(y) & 0xFFFF) * int32(q[1])) + m = (int32(y) >> 16) * int32(q[1]) + + lo2 := l + (uint32(m) << 16) + hi2 := (m >> 16) + (int32(l) >> 31) + bool2int32(lo2 < l) + + // Add them. + lo := lo1 + lo2 + hi := hi1 + hi2 + bool2int32(lo < lo1) + + // Divide the result by 2^14 with rounding. + s := hi >> 31 + l = lo + uint32(s) + hi += s + bool2int32(l < lo) + lo = l + + l = lo + 0x2000 + hi += bool2int32(l < lo) + + return fixed.Int26_6((uint32(hi) << 18) | (l >> 14)) +} + +// mulDiv returns x*y/z, rounded to the nearest integer. +func mulDiv(x, y, z int64) int64 { + xy := x * y + if z < 0 { + xy, z = -xy, -z + } + if xy >= 0 { + xy += z / 2 + } else { + xy -= z / 2 + } + return xy / z +} + +// round rounds the given number. The rounding algorithm is described at +// https://developer.apple.com/fonts/TTRefMan/RM02/Chap2.html#rounding +func (h *hinter) round(x fixed.Int26_6) fixed.Int26_6 { + if h.gs.roundPeriod == 0 { + // Rounding is off. + return x + } + if x >= 0 { + ret := x - h.gs.roundPhase + h.gs.roundThreshold + if h.gs.roundSuper45 { + ret /= h.gs.roundPeriod + ret *= h.gs.roundPeriod + } else { + ret &= -h.gs.roundPeriod + } + if x != 0 && ret < 0 { + ret = 0 + } + return ret + h.gs.roundPhase + } + ret := -x - h.gs.roundPhase + h.gs.roundThreshold + if h.gs.roundSuper45 { + ret /= h.gs.roundPeriod + ret *= h.gs.roundPeriod + } else { + ret &= -h.gs.roundPeriod + } + if ret < 0 { + ret = 0 + } + return -ret - h.gs.roundPhase +} + +func bool2int32(b bool) int32 { + if b { + return 1 + } + return 0 +} diff --git a/vendor/github.com/golang/freetype/truetype/opcodes.go b/vendor/github.com/golang/freetype/truetype/opcodes.go new file mode 100644 index 00000000..1880e1e6 --- /dev/null +++ b/vendor/github.com/golang/freetype/truetype/opcodes.go @@ -0,0 +1,289 @@ +// Copyright 2012 The Freetype-Go Authors. All rights reserved. +// Use of this source code is governed by your choice of either the +// FreeType License or the GNU General Public License version 2 (or +// any later version), both of which can be found in the LICENSE file. + +package truetype + +// The Truetype opcodes are summarized at +// https://developer.apple.com/fonts/TTRefMan/RM07/appendixA.html + +const ( + opSVTCA0 = 0x00 // Set freedom and projection Vectors To Coordinate Axis + opSVTCA1 = 0x01 // . + opSPVTCA0 = 0x02 // Set Projection Vector To Coordinate Axis + opSPVTCA1 = 0x03 // . + opSFVTCA0 = 0x04 // Set Freedom Vector to Coordinate Axis + opSFVTCA1 = 0x05 // . + opSPVTL0 = 0x06 // Set Projection Vector To Line + opSPVTL1 = 0x07 // . + opSFVTL0 = 0x08 // Set Freedom Vector To Line + opSFVTL1 = 0x09 // . + opSPVFS = 0x0a // Set Projection Vector From Stack + opSFVFS = 0x0b // Set Freedom Vector From Stack + opGPV = 0x0c // Get Projection Vector + opGFV = 0x0d // Get Freedom Vector + opSFVTPV = 0x0e // Set Freedom Vector To Projection Vector + opISECT = 0x0f // moves point p to the InterSECTion of two lines + opSRP0 = 0x10 // Set Reference Point 0 + opSRP1 = 0x11 // Set Reference Point 1 + opSRP2 = 0x12 // Set Reference Point 2 + opSZP0 = 0x13 // Set Zone Pointer 0 + opSZP1 = 0x14 // Set Zone Pointer 1 + opSZP2 = 0x15 // Set Zone Pointer 2 + opSZPS = 0x16 // Set Zone PointerS + opSLOOP = 0x17 // Set LOOP variable + opRTG = 0x18 // Round To Grid + opRTHG = 0x19 // Round To Half Grid + opSMD = 0x1a // Set Minimum Distance + opELSE = 0x1b // ELSE clause + opJMPR = 0x1c // JuMP Relative + opSCVTCI = 0x1d // Set Control Value Table Cut-In + opSSWCI = 0x1e // Set Single Width Cut-In + opSSW = 0x1f // Set Single Width + opDUP = 0x20 // DUPlicate top stack element + opPOP = 0x21 // POP top stack element + opCLEAR = 0x22 // CLEAR the stack + opSWAP = 0x23 // SWAP the top two elements on the stack + opDEPTH = 0x24 // DEPTH of the stack + opCINDEX = 0x25 // Copy the INDEXed element to the top of the stack + opMINDEX = 0x26 // Move the INDEXed element to the top of the stack + opALIGNPTS = 0x27 // ALIGN PoinTS + op_0x28 = 0x28 // deprecated + opUTP = 0x29 // UnTouch Point + opLOOPCALL = 0x2a // LOOP and CALL function + opCALL = 0x2b // CALL function + opFDEF = 0x2c // Function DEFinition + opENDF = 0x2d // END Function definition + opMDAP0 = 0x2e // Move Direct Absolute Point + opMDAP1 = 0x2f // . + opIUP0 = 0x30 // Interpolate Untouched Points through the outline + opIUP1 = 0x31 // . + opSHP0 = 0x32 // SHift Point using reference point + opSHP1 = 0x33 // . + opSHC0 = 0x34 // SHift Contour using reference point + opSHC1 = 0x35 // . + opSHZ0 = 0x36 // SHift Zone using reference point + opSHZ1 = 0x37 // . + opSHPIX = 0x38 // SHift point by a PIXel amount + opIP = 0x39 // Interpolate Point + opMSIRP0 = 0x3a // Move Stack Indirect Relative Point + opMSIRP1 = 0x3b // . + opALIGNRP = 0x3c // ALIGN to Reference Point + opRTDG = 0x3d // Round To Double Grid + opMIAP0 = 0x3e // Move Indirect Absolute Point + opMIAP1 = 0x3f // . + opNPUSHB = 0x40 // PUSH N Bytes + opNPUSHW = 0x41 // PUSH N Words + opWS = 0x42 // Write Store + opRS = 0x43 // Read Store + opWCVTP = 0x44 // Write Control Value Table in Pixel units + opRCVT = 0x45 // Read Control Value Table entry + opGC0 = 0x46 // Get Coordinate projected onto the projection vector + opGC1 = 0x47 // . + opSCFS = 0x48 // Sets Coordinate From the Stack using projection vector and freedom vector + opMD0 = 0x49 // Measure Distance + opMD1 = 0x4a // . + opMPPEM = 0x4b // Measure Pixels Per EM + opMPS = 0x4c // Measure Point Size + opFLIPON = 0x4d // set the auto FLIP Boolean to ON + opFLIPOFF = 0x4e // set the auto FLIP Boolean to OFF + opDEBUG = 0x4f // DEBUG call + opLT = 0x50 // Less Than + opLTEQ = 0x51 // Less Than or EQual + opGT = 0x52 // Greater Than + opGTEQ = 0x53 // Greater Than or EQual + opEQ = 0x54 // EQual + opNEQ = 0x55 // Not EQual + opODD = 0x56 // ODD + opEVEN = 0x57 // EVEN + opIF = 0x58 // IF test + opEIF = 0x59 // End IF + opAND = 0x5a // logical AND + opOR = 0x5b // logical OR + opNOT = 0x5c // logical NOT + opDELTAP1 = 0x5d // DELTA exception P1 + opSDB = 0x5e // Set Delta Base in the graphics state + opSDS = 0x5f // Set Delta Shift in the graphics state + opADD = 0x60 // ADD + opSUB = 0x61 // SUBtract + opDIV = 0x62 // DIVide + opMUL = 0x63 // MULtiply + opABS = 0x64 // ABSolute value + opNEG = 0x65 // NEGate + opFLOOR = 0x66 // FLOOR + opCEILING = 0x67 // CEILING + opROUND00 = 0x68 // ROUND value + opROUND01 = 0x69 // . + opROUND10 = 0x6a // . + opROUND11 = 0x6b // . + opNROUND00 = 0x6c // No ROUNDing of value + opNROUND01 = 0x6d // . + opNROUND10 = 0x6e // . + opNROUND11 = 0x6f // . + opWCVTF = 0x70 // Write Control Value Table in Funits + opDELTAP2 = 0x71 // DELTA exception P2 + opDELTAP3 = 0x72 // DELTA exception P3 + opDELTAC1 = 0x73 // DELTA exception C1 + opDELTAC2 = 0x74 // DELTA exception C2 + opDELTAC3 = 0x75 // DELTA exception C3 + opSROUND = 0x76 // Super ROUND + opS45ROUND = 0x77 // Super ROUND 45 degrees + opJROT = 0x78 // Jump Relative On True + opJROF = 0x79 // Jump Relative On False + opROFF = 0x7a // Round OFF + op_0x7b = 0x7b // deprecated + opRUTG = 0x7c // Round Up To Grid + opRDTG = 0x7d // Round Down To Grid + opSANGW = 0x7e // Set ANGle Weight + opAA = 0x7f // Adjust Angle + opFLIPPT = 0x80 // FLIP PoinT + opFLIPRGON = 0x81 // FLIP RanGe ON + opFLIPRGOFF = 0x82 // FLIP RanGe OFF + op_0x83 = 0x83 // deprecated + op_0x84 = 0x84 // deprecated + opSCANCTRL = 0x85 // SCAN conversion ConTRoL + opSDPVTL0 = 0x86 // Set Dual Projection Vector To Line + opSDPVTL1 = 0x87 // . + opGETINFO = 0x88 // GET INFOrmation + opIDEF = 0x89 // Instruction DEFinition + opROLL = 0x8a // ROLL the top three stack elements + opMAX = 0x8b // MAXimum of top two stack elements + opMIN = 0x8c // MINimum of top two stack elements + opSCANTYPE = 0x8d // SCANTYPE + opINSTCTRL = 0x8e // INSTRuction execution ConTRoL + op_0x8f = 0x8f + op_0x90 = 0x90 + op_0x91 = 0x91 + op_0x92 = 0x92 + op_0x93 = 0x93 + op_0x94 = 0x94 + op_0x95 = 0x95 + op_0x96 = 0x96 + op_0x97 = 0x97 + op_0x98 = 0x98 + op_0x99 = 0x99 + op_0x9a = 0x9a + op_0x9b = 0x9b + op_0x9c = 0x9c + op_0x9d = 0x9d + op_0x9e = 0x9e + op_0x9f = 0x9f + op_0xa0 = 0xa0 + op_0xa1 = 0xa1 + op_0xa2 = 0xa2 + op_0xa3 = 0xa3 + op_0xa4 = 0xa4 + op_0xa5 = 0xa5 + op_0xa6 = 0xa6 + op_0xa7 = 0xa7 + op_0xa8 = 0xa8 + op_0xa9 = 0xa9 + op_0xaa = 0xaa + op_0xab = 0xab + op_0xac = 0xac + op_0xad = 0xad + op_0xae = 0xae + op_0xaf = 0xaf + opPUSHB000 = 0xb0 // PUSH Bytes + opPUSHB001 = 0xb1 // . + opPUSHB010 = 0xb2 // . + opPUSHB011 = 0xb3 // . + opPUSHB100 = 0xb4 // . + opPUSHB101 = 0xb5 // . + opPUSHB110 = 0xb6 // . + opPUSHB111 = 0xb7 // . + opPUSHW000 = 0xb8 // PUSH Words + opPUSHW001 = 0xb9 // . + opPUSHW010 = 0xba // . + opPUSHW011 = 0xbb // . + opPUSHW100 = 0xbc // . + opPUSHW101 = 0xbd // . + opPUSHW110 = 0xbe // . + opPUSHW111 = 0xbf // . + opMDRP00000 = 0xc0 // Move Direct Relative Point + opMDRP00001 = 0xc1 // . + opMDRP00010 = 0xc2 // . + opMDRP00011 = 0xc3 // . + opMDRP00100 = 0xc4 // . + opMDRP00101 = 0xc5 // . + opMDRP00110 = 0xc6 // . + opMDRP00111 = 0xc7 // . + opMDRP01000 = 0xc8 // . + opMDRP01001 = 0xc9 // . + opMDRP01010 = 0xca // . + opMDRP01011 = 0xcb // . + opMDRP01100 = 0xcc // . + opMDRP01101 = 0xcd // . + opMDRP01110 = 0xce // . + opMDRP01111 = 0xcf // . + opMDRP10000 = 0xd0 // . + opMDRP10001 = 0xd1 // . + opMDRP10010 = 0xd2 // . + opMDRP10011 = 0xd3 // . + opMDRP10100 = 0xd4 // . + opMDRP10101 = 0xd5 // . + opMDRP10110 = 0xd6 // . + opMDRP10111 = 0xd7 // . + opMDRP11000 = 0xd8 // . + opMDRP11001 = 0xd9 // . + opMDRP11010 = 0xda // . + opMDRP11011 = 0xdb // . + opMDRP11100 = 0xdc // . + opMDRP11101 = 0xdd // . + opMDRP11110 = 0xde // . + opMDRP11111 = 0xdf // . + opMIRP00000 = 0xe0 // Move Indirect Relative Point + opMIRP00001 = 0xe1 // . + opMIRP00010 = 0xe2 // . + opMIRP00011 = 0xe3 // . + opMIRP00100 = 0xe4 // . + opMIRP00101 = 0xe5 // . + opMIRP00110 = 0xe6 // . + opMIRP00111 = 0xe7 // . + opMIRP01000 = 0xe8 // . + opMIRP01001 = 0xe9 // . + opMIRP01010 = 0xea // . + opMIRP01011 = 0xeb // . + opMIRP01100 = 0xec // . + opMIRP01101 = 0xed // . + opMIRP01110 = 0xee // . + opMIRP01111 = 0xef // . + opMIRP10000 = 0xf0 // . + opMIRP10001 = 0xf1 // . + opMIRP10010 = 0xf2 // . + opMIRP10011 = 0xf3 // . + opMIRP10100 = 0xf4 // . + opMIRP10101 = 0xf5 // . + opMIRP10110 = 0xf6 // . + opMIRP10111 = 0xf7 // . + opMIRP11000 = 0xf8 // . + opMIRP11001 = 0xf9 // . + opMIRP11010 = 0xfa // . + opMIRP11011 = 0xfb // . + opMIRP11100 = 0xfc // . + opMIRP11101 = 0xfd // . + opMIRP11110 = 0xfe // . + opMIRP11111 = 0xff // . +) + +// popCount is the number of stack elements that each opcode pops. +var popCount = [256]uint8{ + // 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 5, // 0x00 - 0x0f + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, // 0x10 - 0x1f + 1, 1, 0, 2, 0, 1, 1, 2, 0, 1, 2, 1, 1, 0, 1, 1, // 0x20 - 0x2f + 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 2, 2, 0, 0, 2, 2, // 0x30 - 0x3f + 0, 0, 2, 1, 2, 1, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, // 0x40 - 0x4f + 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 2, 2, 1, 1, 1, 1, // 0x50 - 0x5f + 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 - 0x6f + 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 1, 1, // 0x70 - 0x7f + 0, 2, 2, 0, 0, 1, 2, 2, 1, 1, 3, 2, 2, 1, 2, 0, // 0x80 - 0x8f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x90 - 0x9f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xa0 - 0xaf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xb0 - 0xbf + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xc0 - 0xcf + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xd0 - 0xdf + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xe0 - 0xef + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xf0 - 0xff +} diff --git a/vendor/github.com/golang/freetype/truetype/truetype.go b/vendor/github.com/golang/freetype/truetype/truetype.go new file mode 100644 index 00000000..7270bbf2 --- /dev/null +++ b/vendor/github.com/golang/freetype/truetype/truetype.go @@ -0,0 +1,653 @@ +// Copyright 2010 The Freetype-Go Authors. All rights reserved. +// Use of this source code is governed by your choice of either the +// FreeType License or the GNU General Public License version 2 (or +// any later version), both of which can be found in the LICENSE file. + +// Package truetype provides a parser for the TTF and TTC file formats. +// Those formats are documented at http://developer.apple.com/fonts/TTRefMan/ +// and http://www.microsoft.com/typography/otspec/ +// +// Some of a font's methods provide lengths or co-ordinates, e.g. bounds, font +// metrics and control points. All these methods take a scale parameter, which +// is the number of pixels in 1 em, expressed as a 26.6 fixed point value. For +// example, if 1 em is 10 pixels then scale is fixed.I(10), which is equal to +// fixed.Int26_6(10 << 6). +// +// To measure a TrueType font in ideal FUnit space, use scale equal to +// font.FUnitsPerEm(). +package truetype // import "github.com/golang/freetype/truetype" + +import ( + "fmt" + + "golang.org/x/image/math/fixed" +) + +// An Index is a Font's index of a rune. +type Index uint16 + +// A NameID identifies a name table entry. +// +// See https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html +type NameID uint16 + +const ( + NameIDCopyright NameID = 0 + NameIDFontFamily = 1 + NameIDFontSubfamily = 2 + NameIDUniqueSubfamilyID = 3 + NameIDFontFullName = 4 + NameIDNameTableVersion = 5 + NameIDPostscriptName = 6 + NameIDTrademarkNotice = 7 + NameIDManufacturerName = 8 + NameIDDesignerName = 9 + NameIDFontDescription = 10 + NameIDFontVendorURL = 11 + NameIDFontDesignerURL = 12 + NameIDFontLicense = 13 + NameIDFontLicenseURL = 14 + NameIDPreferredFamily = 16 + NameIDPreferredSubfamily = 17 + NameIDCompatibleName = 18 + NameIDSampleText = 19 +) + +const ( + // A 32-bit encoding consists of a most-significant 16-bit Platform ID and a + // least-significant 16-bit Platform Specific ID. The magic numbers are + // specified at https://www.microsoft.com/typography/otspec/name.htm + unicodeEncodingBMPOnly = 0x00000003 // PID = 0 (Unicode), PSID = 3 (Unicode 2.0 BMP Only) + unicodeEncodingFull = 0x00000004 // PID = 0 (Unicode), PSID = 4 (Unicode 2.0 Full Repertoire) + microsoftSymbolEncoding = 0x00030000 // PID = 3 (Microsoft), PSID = 0 (Symbol) + microsoftUCS2Encoding = 0x00030001 // PID = 3 (Microsoft), PSID = 1 (UCS-2) + microsoftUCS4Encoding = 0x0003000a // PID = 3 (Microsoft), PSID = 10 (UCS-4) +) + +// An HMetric holds the horizontal metrics of a single glyph. +type HMetric struct { + AdvanceWidth, LeftSideBearing fixed.Int26_6 +} + +// A VMetric holds the vertical metrics of a single glyph. +type VMetric struct { + AdvanceHeight, TopSideBearing fixed.Int26_6 +} + +// A FormatError reports that the input is not a valid TrueType font. +type FormatError string + +func (e FormatError) Error() string { + return "freetype: invalid TrueType format: " + string(e) +} + +// An UnsupportedError reports that the input uses a valid but unimplemented +// TrueType feature. +type UnsupportedError string + +func (e UnsupportedError) Error() string { + return "freetype: unsupported TrueType feature: " + string(e) +} + +// u32 returns the big-endian uint32 at b[i:]. +func u32(b []byte, i int) uint32 { + return uint32(b[i])<<24 | uint32(b[i+1])<<16 | uint32(b[i+2])<<8 | uint32(b[i+3]) +} + +// u16 returns the big-endian uint16 at b[i:]. +func u16(b []byte, i int) uint16 { + return uint16(b[i])<<8 | uint16(b[i+1]) +} + +// readTable returns a slice of the TTF data given by a table's directory entry. +func readTable(ttf []byte, offsetLength []byte) ([]byte, error) { + offset := int(u32(offsetLength, 0)) + if offset < 0 { + return nil, FormatError(fmt.Sprintf("offset too large: %d", uint32(offset))) + } + length := int(u32(offsetLength, 4)) + if length < 0 { + return nil, FormatError(fmt.Sprintf("length too large: %d", uint32(length))) + } + end := offset + length + if end < 0 || end > len(ttf) { + return nil, FormatError(fmt.Sprintf("offset + length too large: %d", uint32(offset)+uint32(length))) + } + return ttf[offset:end], nil +} + +// parseSubtables returns the offset and platformID of the best subtable in +// table, where best favors a Unicode cmap encoding, and failing that, a +// Microsoft cmap encoding. offset is the offset of the first subtable in +// table, and size is the size of each subtable. +// +// If pred is non-nil, then only subtables that satisfy that predicate will be +// considered. +func parseSubtables(table []byte, name string, offset, size int, pred func([]byte) bool) ( + bestOffset int, bestPID uint32, retErr error) { + + if len(table) < 4 { + return 0, 0, FormatError(name + " too short") + } + nSubtables := int(u16(table, 2)) + if len(table) < size*nSubtables+offset { + return 0, 0, FormatError(name + " too short") + } + ok := false + for i := 0; i < nSubtables; i, offset = i+1, offset+size { + if pred != nil && !pred(table[offset:]) { + continue + } + // We read the 16-bit Platform ID and 16-bit Platform Specific ID as a single uint32. + // All values are big-endian. + pidPsid := u32(table, offset) + // We prefer the Unicode cmap encoding. Failing to find that, we fall + // back onto the Microsoft cmap encoding. + if pidPsid == unicodeEncodingBMPOnly || pidPsid == unicodeEncodingFull { + bestOffset, bestPID, ok = offset, pidPsid>>16, true + break + + } else if pidPsid == microsoftSymbolEncoding || + pidPsid == microsoftUCS2Encoding || + pidPsid == microsoftUCS4Encoding { + + bestOffset, bestPID, ok = offset, pidPsid>>16, true + // We don't break out of the for loop, so that Unicode can override Microsoft. + } + } + if !ok { + return 0, 0, UnsupportedError(name + " encoding") + } + return bestOffset, bestPID, nil +} + +const ( + locaOffsetFormatUnknown int = iota + locaOffsetFormatShort + locaOffsetFormatLong +) + +// A cm holds a parsed cmap entry. +type cm struct { + start, end, delta, offset uint32 +} + +// A Font represents a Truetype font. +type Font struct { + // Tables sliced from the TTF data. The different tables are documented + // at http://developer.apple.com/fonts/TTRefMan/RM06/Chap6.html + cmap, cvt, fpgm, glyf, hdmx, head, hhea, hmtx, kern, loca, maxp, name, os2, prep, vmtx []byte + + cmapIndexes []byte + + // Cached values derived from the raw ttf data. + cm []cm + locaOffsetFormat int + nGlyph, nHMetric, nKern int + fUnitsPerEm int32 + ascent int32 // In FUnits. + descent int32 // In FUnits; typically negative. + bounds fixed.Rectangle26_6 // In FUnits. + // Values from the maxp section. + maxTwilightPoints, maxStorage, maxFunctionDefs, maxStackElements uint16 +} + +func (f *Font) parseCmap() error { + const ( + cmapFormat4 = 4 + cmapFormat12 = 12 + languageIndependent = 0 + ) + + offset, _, err := parseSubtables(f.cmap, "cmap", 4, 8, nil) + if err != nil { + return err + } + offset = int(u32(f.cmap, offset+4)) + if offset <= 0 || offset > len(f.cmap) { + return FormatError("bad cmap offset") + } + + cmapFormat := u16(f.cmap, offset) + switch cmapFormat { + case cmapFormat4: + language := u16(f.cmap, offset+4) + if language != languageIndependent { + return UnsupportedError(fmt.Sprintf("language: %d", language)) + } + segCountX2 := int(u16(f.cmap, offset+6)) + if segCountX2%2 == 1 { + return FormatError(fmt.Sprintf("bad segCountX2: %d", segCountX2)) + } + segCount := segCountX2 / 2 + offset += 14 + f.cm = make([]cm, segCount) + for i := 0; i < segCount; i++ { + f.cm[i].end = uint32(u16(f.cmap, offset)) + offset += 2 + } + offset += 2 + for i := 0; i < segCount; i++ { + f.cm[i].start = uint32(u16(f.cmap, offset)) + offset += 2 + } + for i := 0; i < segCount; i++ { + f.cm[i].delta = uint32(u16(f.cmap, offset)) + offset += 2 + } + for i := 0; i < segCount; i++ { + f.cm[i].offset = uint32(u16(f.cmap, offset)) + offset += 2 + } + f.cmapIndexes = f.cmap[offset:] + return nil + + case cmapFormat12: + if u16(f.cmap, offset+2) != 0 { + return FormatError(fmt.Sprintf("cmap format: % x", f.cmap[offset:offset+4])) + } + length := u32(f.cmap, offset+4) + language := u32(f.cmap, offset+8) + if language != languageIndependent { + return UnsupportedError(fmt.Sprintf("language: %d", language)) + } + nGroups := u32(f.cmap, offset+12) + if length != 12*nGroups+16 { + return FormatError("inconsistent cmap length") + } + offset += 16 + f.cm = make([]cm, nGroups) + for i := uint32(0); i < nGroups; i++ { + f.cm[i].start = u32(f.cmap, offset+0) + f.cm[i].end = u32(f.cmap, offset+4) + f.cm[i].delta = u32(f.cmap, offset+8) - f.cm[i].start + offset += 12 + } + return nil + } + return UnsupportedError(fmt.Sprintf("cmap format: %d", cmapFormat)) +} + +func (f *Font) parseHead() error { + if len(f.head) != 54 { + return FormatError(fmt.Sprintf("bad head length: %d", len(f.head))) + } + f.fUnitsPerEm = int32(u16(f.head, 18)) + f.bounds.Min.X = fixed.Int26_6(int16(u16(f.head, 36))) + f.bounds.Min.Y = fixed.Int26_6(int16(u16(f.head, 38))) + f.bounds.Max.X = fixed.Int26_6(int16(u16(f.head, 40))) + f.bounds.Max.Y = fixed.Int26_6(int16(u16(f.head, 42))) + switch i := u16(f.head, 50); i { + case 0: + f.locaOffsetFormat = locaOffsetFormatShort + case 1: + f.locaOffsetFormat = locaOffsetFormatLong + default: + return FormatError(fmt.Sprintf("bad indexToLocFormat: %d", i)) + } + return nil +} + +func (f *Font) parseHhea() error { + if len(f.hhea) != 36 { + return FormatError(fmt.Sprintf("bad hhea length: %d", len(f.hhea))) + } + f.ascent = int32(int16(u16(f.hhea, 4))) + f.descent = int32(int16(u16(f.hhea, 6))) + f.nHMetric = int(u16(f.hhea, 34)) + if 4*f.nHMetric+2*(f.nGlyph-f.nHMetric) != len(f.hmtx) { + return FormatError(fmt.Sprintf("bad hmtx length: %d", len(f.hmtx))) + } + return nil +} + +func (f *Font) parseKern() error { + // Apple's TrueType documentation (http://developer.apple.com/fonts/TTRefMan/RM06/Chap6kern.html) says: + // "Previous versions of the 'kern' table defined both the version and nTables fields in the header + // as UInt16 values and not UInt32 values. Use of the older format on the Mac OS is discouraged + // (although AAT can sense an old kerning table and still make correct use of it). Microsoft + // Windows still uses the older format for the 'kern' table and will not recognize the newer one. + // Fonts targeted for the Mac OS only should use the new format; fonts targeted for both the Mac OS + // and Windows should use the old format." + // Since we expect that almost all fonts aim to be Windows-compatible, we only parse the "older" format, + // just like the C Freetype implementation. + if len(f.kern) == 0 { + if f.nKern != 0 { + return FormatError("bad kern table length") + } + return nil + } + if len(f.kern) < 18 { + return FormatError("kern data too short") + } + version, offset := u16(f.kern, 0), 2 + if version != 0 { + return UnsupportedError(fmt.Sprintf("kern version: %d", version)) + } + + n, offset := u16(f.kern, offset), offset+2 + if n == 0 { + return UnsupportedError("kern nTables: 0") + } + // TODO: support multiple subtables. In practice, almost all .ttf files + // have only one subtable, if they have a kern table at all. But it's not + // impossible. Xolonium Regular (https://fontlibrary.org/en/font/xolonium) + // has 3 subtables. Those subtables appear to be disjoint, rather than + // being the same kerning pairs encoded in three different ways. + // + // For now, we'll use only the first subtable. + + offset += 2 // Skip the version. + length, offset := int(u16(f.kern, offset)), offset+2 + coverage, offset := u16(f.kern, offset), offset+2 + if coverage != 0x0001 { + // We only support horizontal kerning. + return UnsupportedError(fmt.Sprintf("kern coverage: 0x%04x", coverage)) + } + f.nKern, offset = int(u16(f.kern, offset)), offset+2 + if 6*f.nKern != length-14 { + return FormatError("bad kern table length") + } + return nil +} + +func (f *Font) parseMaxp() error { + if len(f.maxp) != 32 { + return FormatError(fmt.Sprintf("bad maxp length: %d", len(f.maxp))) + } + f.nGlyph = int(u16(f.maxp, 4)) + f.maxTwilightPoints = u16(f.maxp, 16) + f.maxStorage = u16(f.maxp, 18) + f.maxFunctionDefs = u16(f.maxp, 20) + f.maxStackElements = u16(f.maxp, 24) + return nil +} + +// scale returns x divided by f.fUnitsPerEm, rounded to the nearest integer. +func (f *Font) scale(x fixed.Int26_6) fixed.Int26_6 { + if x >= 0 { + x += fixed.Int26_6(f.fUnitsPerEm) / 2 + } else { + x -= fixed.Int26_6(f.fUnitsPerEm) / 2 + } + return x / fixed.Int26_6(f.fUnitsPerEm) +} + +// Bounds returns the union of a Font's glyphs' bounds. +func (f *Font) Bounds(scale fixed.Int26_6) fixed.Rectangle26_6 { + b := f.bounds + b.Min.X = f.scale(scale * b.Min.X) + b.Min.Y = f.scale(scale * b.Min.Y) + b.Max.X = f.scale(scale * b.Max.X) + b.Max.Y = f.scale(scale * b.Max.Y) + return b +} + +// FUnitsPerEm returns the number of FUnits in a Font's em-square's side. +func (f *Font) FUnitsPerEm() int32 { + return f.fUnitsPerEm +} + +// Index returns a Font's index for the given rune. +func (f *Font) Index(x rune) Index { + c := uint32(x) + for i, j := 0, len(f.cm); i < j; { + h := i + (j-i)/2 + cm := &f.cm[h] + if c < cm.start { + j = h + } else if cm.end < c { + i = h + 1 + } else if cm.offset == 0 { + return Index(c + cm.delta) + } else { + offset := int(cm.offset) + 2*(h-len(f.cm)+int(c-cm.start)) + return Index(u16(f.cmapIndexes, offset)) + } + } + return 0 +} + +// Name returns the Font's name value for the given NameID. It returns "" if +// there was an error, or if that name was not found. +func (f *Font) Name(id NameID) string { + x, platformID, err := parseSubtables(f.name, "name", 6, 12, func(b []byte) bool { + return NameID(u16(b, 6)) == id + }) + if err != nil { + return "" + } + offset, length := u16(f.name, 4)+u16(f.name, x+10), u16(f.name, x+8) + // Return the ASCII value of the encoded string. + // The string is encoded as UTF-16 on non-Apple platformIDs; Apple is platformID 1. + src := f.name[offset : offset+length] + var dst []byte + if platformID != 1 { // UTF-16. + if len(src)&1 != 0 { + return "" + } + dst = make([]byte, len(src)/2) + for i := range dst { + dst[i] = printable(u16(src, 2*i)) + } + } else { // ASCII. + dst = make([]byte, len(src)) + for i, c := range src { + dst[i] = printable(uint16(c)) + } + } + return string(dst) +} + +func printable(r uint16) byte { + if 0x20 <= r && r < 0x7f { + return byte(r) + } + return '?' +} + +// unscaledHMetric returns the unscaled horizontal metrics for the glyph with +// the given index. +func (f *Font) unscaledHMetric(i Index) (h HMetric) { + j := int(i) + if j < 0 || f.nGlyph <= j { + return HMetric{} + } + if j >= f.nHMetric { + p := 4 * (f.nHMetric - 1) + return HMetric{ + AdvanceWidth: fixed.Int26_6(u16(f.hmtx, p)), + LeftSideBearing: fixed.Int26_6(int16(u16(f.hmtx, p+2*(j-f.nHMetric)+4))), + } + } + return HMetric{ + AdvanceWidth: fixed.Int26_6(u16(f.hmtx, 4*j)), + LeftSideBearing: fixed.Int26_6(int16(u16(f.hmtx, 4*j+2))), + } +} + +// HMetric returns the horizontal metrics for the glyph with the given index. +func (f *Font) HMetric(scale fixed.Int26_6, i Index) HMetric { + h := f.unscaledHMetric(i) + h.AdvanceWidth = f.scale(scale * h.AdvanceWidth) + h.LeftSideBearing = f.scale(scale * h.LeftSideBearing) + return h +} + +// unscaledVMetric returns the unscaled vertical metrics for the glyph with +// the given index. yMax is the top of the glyph's bounding box. +func (f *Font) unscaledVMetric(i Index, yMax fixed.Int26_6) (v VMetric) { + j := int(i) + if j < 0 || f.nGlyph <= j { + return VMetric{} + } + if 4*j+4 <= len(f.vmtx) { + return VMetric{ + AdvanceHeight: fixed.Int26_6(u16(f.vmtx, 4*j)), + TopSideBearing: fixed.Int26_6(int16(u16(f.vmtx, 4*j+2))), + } + } + // The OS/2 table has grown over time. + // https://developer.apple.com/fonts/TTRefMan/RM06/Chap6OS2.html + // says that it was originally 68 bytes. Optional fields, including + // the ascender and descender, are described at + // http://www.microsoft.com/typography/otspec/os2.htm + if len(f.os2) >= 72 { + sTypoAscender := fixed.Int26_6(int16(u16(f.os2, 68))) + sTypoDescender := fixed.Int26_6(int16(u16(f.os2, 70))) + return VMetric{ + AdvanceHeight: sTypoAscender - sTypoDescender, + TopSideBearing: sTypoAscender - yMax, + } + } + return VMetric{ + AdvanceHeight: fixed.Int26_6(f.fUnitsPerEm), + TopSideBearing: 0, + } +} + +// VMetric returns the vertical metrics for the glyph with the given index. +func (f *Font) VMetric(scale fixed.Int26_6, i Index) VMetric { + // TODO: should 0 be bounds.YMax? + v := f.unscaledVMetric(i, 0) + v.AdvanceHeight = f.scale(scale * v.AdvanceHeight) + v.TopSideBearing = f.scale(scale * v.TopSideBearing) + return v +} + +// Kern returns the horizontal adjustment for the given glyph pair. A positive +// kern means to move the glyphs further apart. +func (f *Font) Kern(scale fixed.Int26_6, i0, i1 Index) fixed.Int26_6 { + if f.nKern == 0 { + return 0 + } + g := uint32(i0)<<16 | uint32(i1) + lo, hi := 0, f.nKern + for lo < hi { + i := (lo + hi) / 2 + ig := u32(f.kern, 18+6*i) + if ig < g { + lo = i + 1 + } else if ig > g { + hi = i + } else { + return f.scale(scale * fixed.Int26_6(int16(u16(f.kern, 22+6*i)))) + } + } + return 0 +} + +// Parse returns a new Font for the given TTF or TTC data. +// +// For TrueType Collections, the first font in the collection is parsed. +func Parse(ttf []byte) (font *Font, err error) { + return parse(ttf, 0) +} + +func parse(ttf []byte, offset int) (font *Font, err error) { + if len(ttf)-offset < 12 { + err = FormatError("TTF data is too short") + return + } + originalOffset := offset + magic, offset := u32(ttf, offset), offset+4 + switch magic { + case 0x00010000: + // No-op. + case 0x74746366: // "ttcf" as a big-endian uint32. + if originalOffset != 0 { + err = FormatError("recursive TTC") + return + } + ttcVersion, offset := u32(ttf, offset), offset+4 + if ttcVersion != 0x00010000 && ttcVersion != 0x00020000 { + err = FormatError("bad TTC version") + return + } + numFonts, offset := int(u32(ttf, offset)), offset+4 + if numFonts <= 0 { + err = FormatError("bad number of TTC fonts") + return + } + if len(ttf[offset:])/4 < numFonts { + err = FormatError("TTC offset table is too short") + return + } + // TODO: provide an API to select which font in a TrueType collection to return, + // not just the first one. This may require an API to parse a TTC's name tables, + // so users of this package can select the font in a TTC by name. + offset = int(u32(ttf, offset)) + if offset <= 0 || offset > len(ttf) { + err = FormatError("bad TTC offset") + return + } + return parse(ttf, offset) + default: + err = FormatError("bad TTF version") + return + } + n, offset := int(u16(ttf, offset)), offset+2 + offset += 6 // Skip the searchRange, entrySelector and rangeShift. + if len(ttf) < 16*n+offset { + err = FormatError("TTF data is too short") + return + } + f := new(Font) + // Assign the table slices. + for i := 0; i < n; i++ { + x := 16*i + offset + switch string(ttf[x : x+4]) { + case "cmap": + f.cmap, err = readTable(ttf, ttf[x+8:x+16]) + case "cvt ": + f.cvt, err = readTable(ttf, ttf[x+8:x+16]) + case "fpgm": + f.fpgm, err = readTable(ttf, ttf[x+8:x+16]) + case "glyf": + f.glyf, err = readTable(ttf, ttf[x+8:x+16]) + case "hdmx": + f.hdmx, err = readTable(ttf, ttf[x+8:x+16]) + case "head": + f.head, err = readTable(ttf, ttf[x+8:x+16]) + case "hhea": + f.hhea, err = readTable(ttf, ttf[x+8:x+16]) + case "hmtx": + f.hmtx, err = readTable(ttf, ttf[x+8:x+16]) + case "kern": + f.kern, err = readTable(ttf, ttf[x+8:x+16]) + case "loca": + f.loca, err = readTable(ttf, ttf[x+8:x+16]) + case "maxp": + f.maxp, err = readTable(ttf, ttf[x+8:x+16]) + case "name": + f.name, err = readTable(ttf, ttf[x+8:x+16]) + case "OS/2": + f.os2, err = readTable(ttf, ttf[x+8:x+16]) + case "prep": + f.prep, err = readTable(ttf, ttf[x+8:x+16]) + case "vmtx": + f.vmtx, err = readTable(ttf, ttf[x+8:x+16]) + } + if err != nil { + return + } + } + // Parse and sanity-check the TTF data. + if err = f.parseHead(); err != nil { + return + } + if err = f.parseMaxp(); err != nil { + return + } + if err = f.parseCmap(); err != nil { + return + } + if err = f.parseKern(); err != nil { + return + } + if err = f.parseHhea(); err != nil { + return + } + font = f + return +} diff --git a/vendor/github.com/golang/mock/AUTHORS b/vendor/github.com/golang/mock/AUTHORS new file mode 100644 index 00000000..660b8ccc --- /dev/null +++ b/vendor/github.com/golang/mock/AUTHORS @@ -0,0 +1,12 @@ +# This is the official list of GoMock authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS files. +# See the latter for an explanation. + +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# Please keep the list sorted. + +Alex Reece +Google Inc. diff --git a/vendor/github.com/golang/mock/CONTRIBUTORS b/vendor/github.com/golang/mock/CONTRIBUTORS new file mode 100644 index 00000000..def849ca --- /dev/null +++ b/vendor/github.com/golang/mock/CONTRIBUTORS @@ -0,0 +1,37 @@ +# This is the official list of people who can contribute (and typically +# have contributed) code to the gomock repository. +# The AUTHORS file lists the copyright holders; this file +# lists people. For example, Google employees are listed here +# but not in AUTHORS, because Google holds the copyright. +# +# The submission process automatically checks to make sure +# that people submitting code are listed in this file (by email address). +# +# Names should be added to this file only after verifying that +# the individual or the individual's organization has agreed to +# the appropriate Contributor License Agreement, found here: +# +# http://code.google.com/legal/individual-cla-v1.0.html +# http://code.google.com/legal/corporate-cla-v1.0.html +# +# The agreement for individuals can be filled out on the web. +# +# When adding J Random Contributor's name to this file, +# either J's name or J's organization's name should be +# added to the AUTHORS file, depending on whether the +# individual or corporate CLA was used. + +# Names should be added to this file like so: +# Name +# +# An entry with two email addresses specifies that the +# first address should be used in the submit logs and +# that the second address should be recognized as the +# same person when interacting with Rietveld. + +# Please keep the list sorted. + +Aaron Jacobs +Alex Reece +David Symonds +Ryan Barrett diff --git a/vendor/github.com/golang/mock/LICENSE b/vendor/github.com/golang/mock/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/golang/mock/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/golang/mock/gomock/call.go b/vendor/github.com/golang/mock/gomock/call.go new file mode 100644 index 00000000..7345f654 --- /dev/null +++ b/vendor/github.com/golang/mock/gomock/call.go @@ -0,0 +1,427 @@ +// Copyright 2010 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gomock + +import ( + "fmt" + "reflect" + "strconv" + "strings" +) + +// Call represents an expected call to a mock. +type Call struct { + t TestHelper // for triggering test failures on invalid call setup + + receiver interface{} // the receiver of the method call + method string // the name of the method + methodType reflect.Type // the type of the method + args []Matcher // the args + origin string // file and line number of call setup + + preReqs []*Call // prerequisite calls + + // Expectations + minCalls, maxCalls int + + numCalls int // actual number made + + // actions are called when this Call is called. Each action gets the args and + // can set the return values by returning a non-nil slice. Actions run in the + // order they are created. + actions []func([]interface{}) []interface{} +} + +// newCall creates a *Call. It requires the method type in order to support +// unexported methods. +func newCall(t TestHelper, receiver interface{}, method string, methodType reflect.Type, args ...interface{}) *Call { + t.Helper() + + // TODO: check arity, types. + margs := make([]Matcher, len(args)) + for i, arg := range args { + if m, ok := arg.(Matcher); ok { + margs[i] = m + } else if arg == nil { + // Handle nil specially so that passing a nil interface value + // will match the typed nils of concrete args. + margs[i] = Nil() + } else { + margs[i] = Eq(arg) + } + } + + origin := callerInfo(3) + actions := []func([]interface{}) []interface{}{func([]interface{}) []interface{} { + // Synthesize the zero value for each of the return args' types. + rets := make([]interface{}, methodType.NumOut()) + for i := 0; i < methodType.NumOut(); i++ { + rets[i] = reflect.Zero(methodType.Out(i)).Interface() + } + return rets + }} + return &Call{t: t, receiver: receiver, method: method, methodType: methodType, + args: margs, origin: origin, minCalls: 1, maxCalls: 1, actions: actions} +} + +// AnyTimes allows the expectation to be called 0 or more times +func (c *Call) AnyTimes() *Call { + c.minCalls, c.maxCalls = 0, 1e8 // close enough to infinity + return c +} + +// MinTimes requires the call to occur at least n times. If AnyTimes or MaxTimes have not been called or if MaxTimes +// was previously called with 1, MinTimes also sets the maximum number of calls to infinity. +func (c *Call) MinTimes(n int) *Call { + c.minCalls = n + if c.maxCalls == 1 { + c.maxCalls = 1e8 + } + return c +} + +// MaxTimes limits the number of calls to n times. If AnyTimes or MinTimes have not been called or if MinTimes was +// previously called with 1, MaxTimes also sets the minimum number of calls to 0. +func (c *Call) MaxTimes(n int) *Call { + c.maxCalls = n + if c.minCalls == 1 { + c.minCalls = 0 + } + return c +} + +// DoAndReturn declares the action to run when the call is matched. +// The return values from this function are returned by the mocked function. +// It takes an interface{} argument to support n-arity functions. +func (c *Call) DoAndReturn(f interface{}) *Call { + // TODO: Check arity and types here, rather than dying badly elsewhere. + v := reflect.ValueOf(f) + + c.addAction(func(args []interface{}) []interface{} { + vargs := make([]reflect.Value, len(args)) + ft := v.Type() + for i := 0; i < len(args); i++ { + if args[i] != nil { + vargs[i] = reflect.ValueOf(args[i]) + } else { + // Use the zero value for the arg. + vargs[i] = reflect.Zero(ft.In(i)) + } + } + vrets := v.Call(vargs) + rets := make([]interface{}, len(vrets)) + for i, ret := range vrets { + rets[i] = ret.Interface() + } + return rets + }) + return c +} + +// Do declares the action to run when the call is matched. The function's +// return values are ignored to retain backward compatibility. To use the +// return values call DoAndReturn. +// It takes an interface{} argument to support n-arity functions. +func (c *Call) Do(f interface{}) *Call { + // TODO: Check arity and types here, rather than dying badly elsewhere. + v := reflect.ValueOf(f) + + c.addAction(func(args []interface{}) []interface{} { + vargs := make([]reflect.Value, len(args)) + ft := v.Type() + for i := 0; i < len(args); i++ { + if args[i] != nil { + vargs[i] = reflect.ValueOf(args[i]) + } else { + // Use the zero value for the arg. + vargs[i] = reflect.Zero(ft.In(i)) + } + } + v.Call(vargs) + return nil + }) + return c +} + +// Return declares the values to be returned by the mocked function call. +func (c *Call) Return(rets ...interface{}) *Call { + c.t.Helper() + + mt := c.methodType + if len(rets) != mt.NumOut() { + c.t.Fatalf("wrong number of arguments to Return for %T.%v: got %d, want %d [%s]", + c.receiver, c.method, len(rets), mt.NumOut(), c.origin) + } + for i, ret := range rets { + if got, want := reflect.TypeOf(ret), mt.Out(i); got == want { + // Identical types; nothing to do. + } else if got == nil { + // Nil needs special handling. + switch want.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + // ok + default: + c.t.Fatalf("argument %d to Return for %T.%v is nil, but %v is not nillable [%s]", + i, c.receiver, c.method, want, c.origin) + } + } else if got.AssignableTo(want) { + // Assignable type relation. Make the assignment now so that the generated code + // can return the values with a type assertion. + v := reflect.New(want).Elem() + v.Set(reflect.ValueOf(ret)) + rets[i] = v.Interface() + } else { + c.t.Fatalf("wrong type of argument %d to Return for %T.%v: %v is not assignable to %v [%s]", + i, c.receiver, c.method, got, want, c.origin) + } + } + + c.addAction(func([]interface{}) []interface{} { + return rets + }) + + return c +} + +// Times declares the exact number of times a function call is expected to be executed. +func (c *Call) Times(n int) *Call { + c.minCalls, c.maxCalls = n, n + return c +} + +// SetArg declares an action that will set the nth argument's value, +// indirected through a pointer. Or, in the case of a slice, SetArg +// will copy value's elements into the nth argument. +func (c *Call) SetArg(n int, value interface{}) *Call { + c.t.Helper() + + mt := c.methodType + // TODO: This will break on variadic methods. + // We will need to check those at invocation time. + if n < 0 || n >= mt.NumIn() { + c.t.Fatalf("SetArg(%d, ...) called for a method with %d args [%s]", + n, mt.NumIn(), c.origin) + } + // Permit setting argument through an interface. + // In the interface case, we don't (nay, can't) check the type here. + at := mt.In(n) + switch at.Kind() { + case reflect.Ptr: + dt := at.Elem() + if vt := reflect.TypeOf(value); !vt.AssignableTo(dt) { + c.t.Fatalf("SetArg(%d, ...) argument is a %v, not assignable to %v [%s]", + n, vt, dt, c.origin) + } + case reflect.Interface: + // nothing to do + case reflect.Slice: + // nothing to do + default: + c.t.Fatalf("SetArg(%d, ...) referring to argument of non-pointer non-interface non-slice type %v [%s]", + n, at, c.origin) + } + + c.addAction(func(args []interface{}) []interface{} { + v := reflect.ValueOf(value) + switch reflect.TypeOf(args[n]).Kind() { + case reflect.Slice: + setSlice(args[n], v) + default: + reflect.ValueOf(args[n]).Elem().Set(v) + } + return nil + }) + return c +} + +// isPreReq returns true if other is a direct or indirect prerequisite to c. +func (c *Call) isPreReq(other *Call) bool { + for _, preReq := range c.preReqs { + if other == preReq || preReq.isPreReq(other) { + return true + } + } + return false +} + +// After declares that the call may only match after preReq has been exhausted. +func (c *Call) After(preReq *Call) *Call { + c.t.Helper() + + if c == preReq { + c.t.Fatalf("A call isn't allowed to be its own prerequisite") + } + if preReq.isPreReq(c) { + c.t.Fatalf("Loop in call order: %v is a prerequisite to %v (possibly indirectly).", c, preReq) + } + + c.preReqs = append(c.preReqs, preReq) + return c +} + +// Returns true if the minimum number of calls have been made. +func (c *Call) satisfied() bool { + return c.numCalls >= c.minCalls +} + +// Returns true if the maximum number of calls have been made. +func (c *Call) exhausted() bool { + return c.numCalls >= c.maxCalls +} + +func (c *Call) String() string { + args := make([]string, len(c.args)) + for i, arg := range c.args { + args[i] = arg.String() + } + arguments := strings.Join(args, ", ") + return fmt.Sprintf("%T.%v(%s) %s", c.receiver, c.method, arguments, c.origin) +} + +// Tests if the given call matches the expected call. +// If yes, returns nil. If no, returns error with message explaining why it does not match. +func (c *Call) matches(args []interface{}) error { + if !c.methodType.IsVariadic() { + if len(args) != len(c.args) { + return fmt.Errorf("expected call at %s has the wrong number of arguments. Got: %d, want: %d", + c.origin, len(args), len(c.args)) + } + + for i, m := range c.args { + if !m.Matches(args[i]) { + got := fmt.Sprintf("%v", args[i]) + if gs, ok := m.(GotFormatter); ok { + got = gs.Got(args[i]) + } + + return fmt.Errorf( + "expected call at %s doesn't match the argument at index %d.\nGot: %v\nWant: %v", + c.origin, i, got, m, + ) + } + } + } else { + if len(c.args) < c.methodType.NumIn()-1 { + return fmt.Errorf("expected call at %s has the wrong number of matchers. Got: %d, want: %d", + c.origin, len(c.args), c.methodType.NumIn()-1) + } + if len(c.args) != c.methodType.NumIn() && len(args) != len(c.args) { + return fmt.Errorf("expected call at %s has the wrong number of arguments. Got: %d, want: %d", + c.origin, len(args), len(c.args)) + } + if len(args) < len(c.args)-1 { + return fmt.Errorf("expected call at %s has the wrong number of arguments. Got: %d, want: greater than or equal to %d", + c.origin, len(args), len(c.args)-1) + } + + for i, m := range c.args { + if i < c.methodType.NumIn()-1 { + // Non-variadic args + if !m.Matches(args[i]) { + return fmt.Errorf("expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v", + c.origin, strconv.Itoa(i), args[i], m) + } + continue + } + // The last arg has a possibility of a variadic argument, so let it branch + + // sample: Foo(a int, b int, c ...int) + if i < len(c.args) && i < len(args) { + if m.Matches(args[i]) { + // Got Foo(a, b, c) want Foo(matcherA, matcherB, gomock.Any()) + // Got Foo(a, b, c) want Foo(matcherA, matcherB, someSliceMatcher) + // Got Foo(a, b, c) want Foo(matcherA, matcherB, matcherC) + // Got Foo(a, b) want Foo(matcherA, matcherB) + // Got Foo(a, b, c, d) want Foo(matcherA, matcherB, matcherC, matcherD) + continue + } + } + + // The number of actual args don't match the number of matchers, + // or the last matcher is a slice and the last arg is not. + // If this function still matches it is because the last matcher + // matches all the remaining arguments or the lack of any. + // Convert the remaining arguments, if any, into a slice of the + // expected type. + vargsType := c.methodType.In(c.methodType.NumIn() - 1) + vargs := reflect.MakeSlice(vargsType, 0, len(args)-i) + for _, arg := range args[i:] { + vargs = reflect.Append(vargs, reflect.ValueOf(arg)) + } + if m.Matches(vargs.Interface()) { + // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, gomock.Any()) + // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, someSliceMatcher) + // Got Foo(a, b) want Foo(matcherA, matcherB, gomock.Any()) + // Got Foo(a, b) want Foo(matcherA, matcherB, someEmptySliceMatcher) + break + } + // Wrong number of matchers or not match. Fail. + // Got Foo(a, b) want Foo(matcherA, matcherB, matcherC, matcherD) + // Got Foo(a, b, c) want Foo(matcherA, matcherB, matcherC, matcherD) + // Got Foo(a, b, c, d) want Foo(matcherA, matcherB, matcherC, matcherD, matcherE) + // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, matcherC, matcherD) + // Got Foo(a, b, c) want Foo(matcherA, matcherB) + return fmt.Errorf("Expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v", + c.origin, strconv.Itoa(i), args[i:], c.args[i]) + + } + } + + // Check that all prerequisite calls have been satisfied. + for _, preReqCall := range c.preReqs { + if !preReqCall.satisfied() { + return fmt.Errorf("Expected call at %s doesn't have a prerequisite call satisfied:\n%v\nshould be called before:\n%v", + c.origin, preReqCall, c) + } + } + + // Check that the call is not exhausted. + if c.exhausted() { + return fmt.Errorf("expected call at %s has already been called the max number of times", c.origin) + } + + return nil +} + +// dropPrereqs tells the expected Call to not re-check prerequisite calls any +// longer, and to return its current set. +func (c *Call) dropPrereqs() (preReqs []*Call) { + preReqs = c.preReqs + c.preReqs = nil + return +} + +func (c *Call) call() []func([]interface{}) []interface{} { + c.numCalls++ + return c.actions +} + +// InOrder declares that the given calls should occur in order. +func InOrder(calls ...*Call) { + for i := 1; i < len(calls); i++ { + calls[i].After(calls[i-1]) + } +} + +func setSlice(arg interface{}, v reflect.Value) { + va := reflect.ValueOf(arg) + for i := 0; i < v.Len(); i++ { + va.Index(i).Set(v.Index(i)) + } +} + +func (c *Call) addAction(action func([]interface{}) []interface{}) { + c.actions = append(c.actions, action) +} diff --git a/vendor/github.com/golang/mock/gomock/callset.go b/vendor/github.com/golang/mock/gomock/callset.go new file mode 100644 index 00000000..b046b525 --- /dev/null +++ b/vendor/github.com/golang/mock/gomock/callset.go @@ -0,0 +1,108 @@ +// Copyright 2011 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gomock + +import ( + "bytes" + "fmt" +) + +// callSet represents a set of expected calls, indexed by receiver and method +// name. +type callSet struct { + // Calls that are still expected. + expected map[callSetKey][]*Call + // Calls that have been exhausted. + exhausted map[callSetKey][]*Call +} + +// callSetKey is the key in the maps in callSet +type callSetKey struct { + receiver interface{} + fname string +} + +func newCallSet() *callSet { + return &callSet{make(map[callSetKey][]*Call), make(map[callSetKey][]*Call)} +} + +// Add adds a new expected call. +func (cs callSet) Add(call *Call) { + key := callSetKey{call.receiver, call.method} + m := cs.expected + if call.exhausted() { + m = cs.exhausted + } + m[key] = append(m[key], call) +} + +// Remove removes an expected call. +func (cs callSet) Remove(call *Call) { + key := callSetKey{call.receiver, call.method} + calls := cs.expected[key] + for i, c := range calls { + if c == call { + // maintain order for remaining calls + cs.expected[key] = append(calls[:i], calls[i+1:]...) + cs.exhausted[key] = append(cs.exhausted[key], call) + break + } + } +} + +// FindMatch searches for a matching call. Returns error with explanation message if no call matched. +func (cs callSet) FindMatch(receiver interface{}, method string, args []interface{}) (*Call, error) { + key := callSetKey{receiver, method} + + // Search through the expected calls. + expected := cs.expected[key] + var callsErrors bytes.Buffer + for _, call := range expected { + err := call.matches(args) + if err != nil { + _, _ = fmt.Fprintf(&callsErrors, "\n%v", err) + } else { + return call, nil + } + } + + // If we haven't found a match then search through the exhausted calls so we + // get useful error messages. + exhausted := cs.exhausted[key] + for _, call := range exhausted { + if err := call.matches(args); err != nil { + _, _ = fmt.Fprintf(&callsErrors, "\n%v", err) + } + } + + if len(expected)+len(exhausted) == 0 { + _, _ = fmt.Fprintf(&callsErrors, "there are no expected calls of the method %q for that receiver", method) + } + + return nil, fmt.Errorf(callsErrors.String()) +} + +// Failures returns the calls that are not satisfied. +func (cs callSet) Failures() []*Call { + failures := make([]*Call, 0, len(cs.expected)) + for _, calls := range cs.expected { + for _, call := range calls { + if !call.satisfied() { + failures = append(failures, call) + } + } + } + return failures +} diff --git a/vendor/github.com/golang/mock/gomock/controller.go b/vendor/github.com/golang/mock/gomock/controller.go new file mode 100644 index 00000000..d7c3c656 --- /dev/null +++ b/vendor/github.com/golang/mock/gomock/controller.go @@ -0,0 +1,264 @@ +// Copyright 2010 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package gomock is a mock framework for Go. +// +// Standard usage: +// (1) Define an interface that you wish to mock. +// type MyInterface interface { +// SomeMethod(x int64, y string) +// } +// (2) Use mockgen to generate a mock from the interface. +// (3) Use the mock in a test: +// func TestMyThing(t *testing.T) { +// mockCtrl := gomock.NewController(t) +// defer mockCtrl.Finish() +// +// mockObj := something.NewMockMyInterface(mockCtrl) +// mockObj.EXPECT().SomeMethod(4, "blah") +// // pass mockObj to a real object and play with it. +// } +// +// By default, expected calls are not enforced to run in any particular order. +// Call order dependency can be enforced by use of InOrder and/or Call.After. +// Call.After can create more varied call order dependencies, but InOrder is +// often more convenient. +// +// The following examples create equivalent call order dependencies. +// +// Example of using Call.After to chain expected call order: +// +// firstCall := mockObj.EXPECT().SomeMethod(1, "first") +// secondCall := mockObj.EXPECT().SomeMethod(2, "second").After(firstCall) +// mockObj.EXPECT().SomeMethod(3, "third").After(secondCall) +// +// Example of using InOrder to declare expected call order: +// +// gomock.InOrder( +// mockObj.EXPECT().SomeMethod(1, "first"), +// mockObj.EXPECT().SomeMethod(2, "second"), +// mockObj.EXPECT().SomeMethod(3, "third"), +// ) +// +// TODO: +// - Handle different argument/return types (e.g. ..., chan, map, interface). +package gomock + +import ( + "context" + "fmt" + "reflect" + "runtime" + "sync" +) + +// A TestReporter is something that can be used to report test failures. It +// is satisfied by the standard library's *testing.T. +type TestReporter interface { + Errorf(format string, args ...interface{}) + Fatalf(format string, args ...interface{}) +} + +// TestHelper is a TestReporter that has the Helper method. It is satisfied +// by the standard library's *testing.T. +type TestHelper interface { + TestReporter + Helper() +} + +// A Controller represents the top-level control of a mock ecosystem. It +// defines the scope and lifetime of mock objects, as well as their +// expectations. It is safe to call Controller's methods from multiple +// goroutines. Each test should create a new Controller and invoke Finish via +// defer. +// +// func TestFoo(t *testing.T) { +// ctrl := gomock.NewController(t) +// defer ctrl.Finish() +// // .. +// } +// +// func TestBar(t *testing.T) { +// t.Run("Sub-Test-1", st) { +// ctrl := gomock.NewController(st) +// defer ctrl.Finish() +// // .. +// }) +// t.Run("Sub-Test-2", st) { +// ctrl := gomock.NewController(st) +// defer ctrl.Finish() +// // .. +// }) +// }) +type Controller struct { + // T should only be called within a generated mock. It is not intended to + // be used in user code and may be changed in future versions. T is the + // TestReporter passed in when creating the Controller via NewController. + // If the TestReporter does not implement a TestHelper it will be wrapped + // with a nopTestHelper. + T TestHelper + mu sync.Mutex + expectedCalls *callSet + finished bool +} + +// NewController returns a new Controller. It is the preferred way to create a +// Controller. +func NewController(t TestReporter) *Controller { + h, ok := t.(TestHelper) + if !ok { + h = nopTestHelper{t} + } + + return &Controller{ + T: h, + expectedCalls: newCallSet(), + } +} + +type cancelReporter struct { + TestHelper + cancel func() +} + +func (r *cancelReporter) Errorf(format string, args ...interface{}) { + r.TestHelper.Errorf(format, args...) +} +func (r *cancelReporter) Fatalf(format string, args ...interface{}) { + defer r.cancel() + r.TestHelper.Fatalf(format, args...) +} + +// WithContext returns a new Controller and a Context, which is cancelled on any +// fatal failure. +func WithContext(ctx context.Context, t TestReporter) (*Controller, context.Context) { + h, ok := t.(TestHelper) + if !ok { + h = nopTestHelper{t} + } + + ctx, cancel := context.WithCancel(ctx) + return NewController(&cancelReporter{h, cancel}), ctx +} + +type nopTestHelper struct { + TestReporter +} + +func (h nopTestHelper) Helper() {} + +// RecordCall is called by a mock. It should not be called by user code. +func (ctrl *Controller) RecordCall(receiver interface{}, method string, args ...interface{}) *Call { + ctrl.T.Helper() + + recv := reflect.ValueOf(receiver) + for i := 0; i < recv.Type().NumMethod(); i++ { + if recv.Type().Method(i).Name == method { + return ctrl.RecordCallWithMethodType(receiver, method, recv.Method(i).Type(), args...) + } + } + ctrl.T.Fatalf("gomock: failed finding method %s on %T", method, receiver) + panic("unreachable") +} + +// RecordCallWithMethodType is called by a mock. It should not be called by user code. +func (ctrl *Controller) RecordCallWithMethodType(receiver interface{}, method string, methodType reflect.Type, args ...interface{}) *Call { + ctrl.T.Helper() + + call := newCall(ctrl.T, receiver, method, methodType, args...) + + ctrl.mu.Lock() + defer ctrl.mu.Unlock() + ctrl.expectedCalls.Add(call) + + return call +} + +// Call is called by a mock. It should not be called by user code. +func (ctrl *Controller) Call(receiver interface{}, method string, args ...interface{}) []interface{} { + ctrl.T.Helper() + + // Nest this code so we can use defer to make sure the lock is released. + actions := func() []func([]interface{}) []interface{} { + ctrl.T.Helper() + ctrl.mu.Lock() + defer ctrl.mu.Unlock() + + expected, err := ctrl.expectedCalls.FindMatch(receiver, method, args) + if err != nil { + origin := callerInfo(2) + ctrl.T.Fatalf("Unexpected call to %T.%v(%v) at %s because: %s", receiver, method, args, origin, err) + } + + // Two things happen here: + // * the matching call no longer needs to check prerequite calls, + // * and the prerequite calls are no longer expected, so remove them. + preReqCalls := expected.dropPrereqs() + for _, preReqCall := range preReqCalls { + ctrl.expectedCalls.Remove(preReqCall) + } + + actions := expected.call() + if expected.exhausted() { + ctrl.expectedCalls.Remove(expected) + } + return actions + }() + + var rets []interface{} + for _, action := range actions { + if r := action(args); r != nil { + rets = r + } + } + + return rets +} + +// Finish checks to see if all the methods that were expected to be called +// were called. It should be invoked for each Controller. It is not idempotent +// and therefore can only be invoked once. +func (ctrl *Controller) Finish() { + ctrl.T.Helper() + + ctrl.mu.Lock() + defer ctrl.mu.Unlock() + + if ctrl.finished { + ctrl.T.Fatalf("Controller.Finish was called more than once. It has to be called exactly once.") + } + ctrl.finished = true + + // If we're currently panicking, probably because this is a deferred call, + // pass through the panic. + if err := recover(); err != nil { + panic(err) + } + + // Check that all remaining expected calls are satisfied. + failures := ctrl.expectedCalls.Failures() + for _, call := range failures { + ctrl.T.Errorf("missing call(s) to %v", call) + } + if len(failures) != 0 { + ctrl.T.Fatalf("aborting test due to missing call(s)") + } +} + +func callerInfo(skip int) string { + if _, file, line, ok := runtime.Caller(skip + 1); ok { + return fmt.Sprintf("%s:%d", file, line) + } + return "unknown file" +} diff --git a/vendor/github.com/golang/mock/gomock/matchers.go b/vendor/github.com/golang/mock/gomock/matchers.go new file mode 100644 index 00000000..7bfc07be --- /dev/null +++ b/vendor/github.com/golang/mock/gomock/matchers.go @@ -0,0 +1,255 @@ +// Copyright 2010 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gomock + +import ( + "fmt" + "reflect" + "strings" +) + +// A Matcher is a representation of a class of values. +// It is used to represent the valid or expected arguments to a mocked method. +type Matcher interface { + // Matches returns whether x is a match. + Matches(x interface{}) bool + + // String describes what the matcher matches. + String() string +} + +// WantFormatter modifies the given Matcher's String() method to the given +// Stringer. This allows for control on how the "Want" is formatted when +// printing . +func WantFormatter(s fmt.Stringer, m Matcher) Matcher { + type matcher interface { + Matches(x interface{}) bool + } + + return struct { + matcher + fmt.Stringer + }{ + matcher: m, + Stringer: s, + } +} + +// StringerFunc type is an adapter to allow the use of ordinary functions as +// a Stringer. If f is a function with the appropriate signature, +// StringerFunc(f) is a Stringer that calls f. +type StringerFunc func() string + +// String implements fmt.Stringer. +func (f StringerFunc) String() string { + return f() +} + +// GotFormatter is used to better print failure messages. If a matcher +// implements GotFormatter, it will use the result from Got when printing +// the failure message. +type GotFormatter interface { + // Got is invoked with the received value. The result is used when + // printing the failure message. + Got(got interface{}) string +} + +// GotFormatterFunc type is an adapter to allow the use of ordinary +// functions as a GotFormatter. If f is a function with the appropriate +// signature, GotFormatterFunc(f) is a GotFormatter that calls f. +type GotFormatterFunc func(got interface{}) string + +// Got implements GotFormatter. +func (f GotFormatterFunc) Got(got interface{}) string { + return f(got) +} + +// GotFormatterAdapter attaches a GotFormatter to a Matcher. +func GotFormatterAdapter(s GotFormatter, m Matcher) Matcher { + return struct { + GotFormatter + Matcher + }{ + GotFormatter: s, + Matcher: m, + } +} + +type anyMatcher struct{} + +func (anyMatcher) Matches(interface{}) bool { + return true +} + +func (anyMatcher) String() string { + return "is anything" +} + +type eqMatcher struct { + x interface{} +} + +func (e eqMatcher) Matches(x interface{}) bool { + return reflect.DeepEqual(e.x, x) +} + +func (e eqMatcher) String() string { + return fmt.Sprintf("is equal to %v", e.x) +} + +type nilMatcher struct{} + +func (nilMatcher) Matches(x interface{}) bool { + if x == nil { + return true + } + + v := reflect.ValueOf(x) + switch v.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, + reflect.Ptr, reflect.Slice: + return v.IsNil() + } + + return false +} + +func (nilMatcher) String() string { + return "is nil" +} + +type notMatcher struct { + m Matcher +} + +func (n notMatcher) Matches(x interface{}) bool { + return !n.m.Matches(x) +} + +func (n notMatcher) String() string { + // TODO: Improve this if we add a NotString method to the Matcher interface. + return "not(" + n.m.String() + ")" +} + +type assignableToTypeOfMatcher struct { + targetType reflect.Type +} + +func (m assignableToTypeOfMatcher) Matches(x interface{}) bool { + return reflect.TypeOf(x).AssignableTo(m.targetType) +} + +func (m assignableToTypeOfMatcher) String() string { + return "is assignable to " + m.targetType.Name() +} + +type allMatcher struct { + matchers []Matcher +} + +func (am allMatcher) Matches(x interface{}) bool { + for _, m := range am.matchers { + if !m.Matches(x) { + return false + } + } + return true +} + +func (am allMatcher) String() string { + ss := make([]string, 0, len(am.matchers)) + for _, matcher := range am.matchers { + ss = append(ss, matcher.String()) + } + return strings.Join(ss, "; ") +} + +type lenMatcher struct { + i int +} + +func (m lenMatcher) Matches(x interface{}) bool { + v := reflect.ValueOf(x) + switch v.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == m.i + default: + return false + } +} + +func (m lenMatcher) String() string { + return fmt.Sprintf("has length %d", m.i) +} + +// Constructors + +// All returns a composite Matcher that returns true if and only all of the +// matchers return true. +func All(ms ...Matcher) Matcher { return allMatcher{ms} } + +// Any returns a matcher that always matches. +func Any() Matcher { return anyMatcher{} } + +// Eq returns a matcher that matches on equality. +// +// Example usage: +// Eq(5).Matches(5) // returns true +// Eq(5).Matches(4) // returns false +func Eq(x interface{}) Matcher { return eqMatcher{x} } + +// Len returns a matcher that matches on length. This matcher returns false if +// is compared to a type that is not an array, chan, map, slice, or string. +func Len(i int) Matcher { + return lenMatcher{i} +} + +// Nil returns a matcher that matches if the received value is nil. +// +// Example usage: +// var x *bytes.Buffer +// Nil().Matches(x) // returns true +// x = &bytes.Buffer{} +// Nil().Matches(x) // returns false +func Nil() Matcher { return nilMatcher{} } + +// Not reverses the results of its given child matcher. +// +// Example usage: +// Not(Eq(5)).Matches(4) // returns true +// Not(Eq(5)).Matches(5) // returns false +func Not(x interface{}) Matcher { + if m, ok := x.(Matcher); ok { + return notMatcher{m} + } + return notMatcher{Eq(x)} +} + +// AssignableToTypeOf is a Matcher that matches if the parameter to the mock +// function is assignable to the type of the parameter to this function. +// +// Example usage: +// var s fmt.Stringer = &bytes.Buffer{} +// AssignableToTypeOf(s).Matches(time.Second) // returns true +// AssignableToTypeOf(s).Matches(99) // returns false +// +// var ctx = reflect.TypeOf((*context.Context)).Elem() +// AssignableToTypeOf(ctx).Matches(context.Background()) // returns true +func AssignableToTypeOf(x interface{}) Matcher { + if xt, ok := x.(reflect.Type); ok { + return assignableToTypeOfMatcher{xt} + } + return assignableToTypeOfMatcher{reflect.TypeOf(x)} +} diff --git a/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go b/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go new file mode 100644 index 00000000..f0d66bef --- /dev/null +++ b/vendor/github.com/golang/protobuf/jsonpb/jsonpb.go @@ -0,0 +1,1290 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2015 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package jsonpb provides marshaling and unmarshaling between protocol buffers and JSON. +It follows the specification at https://developers.google.com/protocol-buffers/docs/proto3#json. + +This package produces a different output than the standard "encoding/json" package, +which does not operate correctly on protocol buffers. +*/ +package jsonpb + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "math" + "reflect" + "sort" + "strconv" + "strings" + "time" + + "github.com/golang/protobuf/proto" + + stpb "github.com/golang/protobuf/ptypes/struct" +) + +const secondInNanos = int64(time.Second / time.Nanosecond) +const maxSecondsInDuration = 315576000000 + +// Marshaler is a configurable object for converting between +// protocol buffer objects and a JSON representation for them. +type Marshaler struct { + // Whether to render enum values as integers, as opposed to string values. + EnumsAsInts bool + + // Whether to render fields with zero values. + EmitDefaults bool + + // A string to indent each level by. The presence of this field will + // also cause a space to appear between the field separator and + // value, and for newlines to be appear between fields and array + // elements. + Indent string + + // Whether to use the original (.proto) name for fields. + OrigName bool + + // A custom URL resolver to use when marshaling Any messages to JSON. + // If unset, the default resolution strategy is to extract the + // fully-qualified type name from the type URL and pass that to + // proto.MessageType(string). + AnyResolver AnyResolver +} + +// AnyResolver takes a type URL, present in an Any message, and resolves it into +// an instance of the associated message. +type AnyResolver interface { + Resolve(typeUrl string) (proto.Message, error) +} + +func defaultResolveAny(typeUrl string) (proto.Message, error) { + // Only the part of typeUrl after the last slash is relevant. + mname := typeUrl + if slash := strings.LastIndex(mname, "/"); slash >= 0 { + mname = mname[slash+1:] + } + mt := proto.MessageType(mname) + if mt == nil { + return nil, fmt.Errorf("unknown message type %q", mname) + } + return reflect.New(mt.Elem()).Interface().(proto.Message), nil +} + +// JSONPBMarshaler is implemented by protobuf messages that customize the +// way they are marshaled to JSON. Messages that implement this should +// also implement JSONPBUnmarshaler so that the custom format can be +// parsed. +// +// The JSON marshaling must follow the proto to JSON specification: +// https://developers.google.com/protocol-buffers/docs/proto3#json +type JSONPBMarshaler interface { + MarshalJSONPB(*Marshaler) ([]byte, error) +} + +// JSONPBUnmarshaler is implemented by protobuf messages that customize +// the way they are unmarshaled from JSON. Messages that implement this +// should also implement JSONPBMarshaler so that the custom format can be +// produced. +// +// The JSON unmarshaling must follow the JSON to proto specification: +// https://developers.google.com/protocol-buffers/docs/proto3#json +type JSONPBUnmarshaler interface { + UnmarshalJSONPB(*Unmarshaler, []byte) error +} + +// Marshal marshals a protocol buffer into JSON. +func (m *Marshaler) Marshal(out io.Writer, pb proto.Message) error { + v := reflect.ValueOf(pb) + if pb == nil || (v.Kind() == reflect.Ptr && v.IsNil()) { + return errors.New("Marshal called with nil") + } + // Check for unset required fields first. + if err := checkRequiredFields(pb); err != nil { + return err + } + writer := &errWriter{writer: out} + return m.marshalObject(writer, pb, "", "") +} + +// MarshalToString converts a protocol buffer object to JSON string. +func (m *Marshaler) MarshalToString(pb proto.Message) (string, error) { + var buf bytes.Buffer + if err := m.Marshal(&buf, pb); err != nil { + return "", err + } + return buf.String(), nil +} + +type int32Slice []int32 + +var nonFinite = map[string]float64{ + `"NaN"`: math.NaN(), + `"Infinity"`: math.Inf(1), + `"-Infinity"`: math.Inf(-1), +} + +// For sorting extensions ids to ensure stable output. +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +type wkt interface { + XXX_WellKnownType() string +} + +var ( + wktType = reflect.TypeOf((*wkt)(nil)).Elem() + messageType = reflect.TypeOf((*proto.Message)(nil)).Elem() +) + +// marshalObject writes a struct to the Writer. +func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent, typeURL string) error { + if jsm, ok := v.(JSONPBMarshaler); ok { + b, err := jsm.MarshalJSONPB(m) + if err != nil { + return err + } + if typeURL != "" { + // we are marshaling this object to an Any type + var js map[string]*json.RawMessage + if err = json.Unmarshal(b, &js); err != nil { + return fmt.Errorf("type %T produced invalid JSON: %v", v, err) + } + turl, err := json.Marshal(typeURL) + if err != nil { + return fmt.Errorf("failed to marshal type URL %q to JSON: %v", typeURL, err) + } + js["@type"] = (*json.RawMessage)(&turl) + if m.Indent != "" { + b, err = json.MarshalIndent(js, indent, m.Indent) + } else { + b, err = json.Marshal(js) + } + if err != nil { + return err + } + } + + out.write(string(b)) + return out.err + } + + s := reflect.ValueOf(v).Elem() + + // Handle well-known types. + if wkt, ok := v.(wkt); ok { + switch wkt.XXX_WellKnownType() { + case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", + "Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue": + // "Wrappers use the same representation in JSON + // as the wrapped primitive type, ..." + sprop := proto.GetProperties(s.Type()) + return m.marshalValue(out, sprop.Prop[0], s.Field(0), indent) + case "Any": + // Any is a bit more involved. + return m.marshalAny(out, v, indent) + case "Duration": + s, ns := s.Field(0).Int(), s.Field(1).Int() + if s < -maxSecondsInDuration || s > maxSecondsInDuration { + return fmt.Errorf("seconds out of range %v", s) + } + if ns <= -secondInNanos || ns >= secondInNanos { + return fmt.Errorf("ns out of range (%v, %v)", -secondInNanos, secondInNanos) + } + if (s > 0 && ns < 0) || (s < 0 && ns > 0) { + return errors.New("signs of seconds and nanos do not match") + } + // Generated output always contains 0, 3, 6, or 9 fractional digits, + // depending on required precision, followed by the suffix "s". + f := "%d.%09d" + if ns < 0 { + ns = -ns + if s == 0 { + f = "-%d.%09d" + } + } + x := fmt.Sprintf(f, s, ns) + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, ".000") + out.write(`"`) + out.write(x) + out.write(`s"`) + return out.err + case "Struct", "ListValue": + // Let marshalValue handle the `Struct.fields` map or the `ListValue.values` slice. + // TODO: pass the correct Properties if needed. + return m.marshalValue(out, &proto.Properties{}, s.Field(0), indent) + case "Timestamp": + // "RFC 3339, where generated output will always be Z-normalized + // and uses 0, 3, 6 or 9 fractional digits." + s, ns := s.Field(0).Int(), s.Field(1).Int() + if ns < 0 || ns >= secondInNanos { + return fmt.Errorf("ns out of range [0, %v)", secondInNanos) + } + t := time.Unix(s, ns).UTC() + // time.RFC3339Nano isn't exactly right (we need to get 3/6/9 fractional digits). + x := t.Format("2006-01-02T15:04:05.000000000") + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, "000") + x = strings.TrimSuffix(x, ".000") + out.write(`"`) + out.write(x) + out.write(`Z"`) + return out.err + case "Value": + // Value has a single oneof. + kind := s.Field(0) + if kind.IsNil() { + // "absence of any variant indicates an error" + return errors.New("nil Value") + } + // oneof -> *T -> T -> T.F + x := kind.Elem().Elem().Field(0) + // TODO: pass the correct Properties if needed. + return m.marshalValue(out, &proto.Properties{}, x, indent) + } + } + + out.write("{") + if m.Indent != "" { + out.write("\n") + } + + firstField := true + + if typeURL != "" { + if err := m.marshalTypeURL(out, indent, typeURL); err != nil { + return err + } + firstField = false + } + + for i := 0; i < s.NumField(); i++ { + value := s.Field(i) + valueField := s.Type().Field(i) + if strings.HasPrefix(valueField.Name, "XXX_") { + continue + } + + // IsNil will panic on most value kinds. + switch value.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface: + if value.IsNil() { + continue + } + } + + if !m.EmitDefaults { + switch value.Kind() { + case reflect.Bool: + if !value.Bool() { + continue + } + case reflect.Int32, reflect.Int64: + if value.Int() == 0 { + continue + } + case reflect.Uint32, reflect.Uint64: + if value.Uint() == 0 { + continue + } + case reflect.Float32, reflect.Float64: + if value.Float() == 0 { + continue + } + case reflect.String: + if value.Len() == 0 { + continue + } + case reflect.Map, reflect.Ptr, reflect.Slice: + if value.IsNil() { + continue + } + } + } + + // Oneof fields need special handling. + if valueField.Tag.Get("protobuf_oneof") != "" { + // value is an interface containing &T{real_value}. + sv := value.Elem().Elem() // interface -> *T -> T + value = sv.Field(0) + valueField = sv.Type().Field(0) + } + prop := jsonProperties(valueField, m.OrigName) + if !firstField { + m.writeSep(out) + } + if err := m.marshalField(out, prop, value, indent); err != nil { + return err + } + firstField = false + } + + // Handle proto2 extensions. + if ep, ok := v.(proto.Message); ok { + extensions := proto.RegisteredExtensions(v) + // Sort extensions for stable output. + ids := make([]int32, 0, len(extensions)) + for id, desc := range extensions { + if !proto.HasExtension(ep, desc) { + continue + } + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + for _, id := range ids { + desc := extensions[id] + if desc == nil { + // unknown extension + continue + } + ext, extErr := proto.GetExtension(ep, desc) + if extErr != nil { + return extErr + } + value := reflect.ValueOf(ext) + var prop proto.Properties + prop.Parse(desc.Tag) + prop.JSONName = fmt.Sprintf("[%s]", desc.Name) + if !firstField { + m.writeSep(out) + } + if err := m.marshalField(out, &prop, value, indent); err != nil { + return err + } + firstField = false + } + + } + + if m.Indent != "" { + out.write("\n") + out.write(indent) + } + out.write("}") + return out.err +} + +func (m *Marshaler) writeSep(out *errWriter) { + if m.Indent != "" { + out.write(",\n") + } else { + out.write(",") + } +} + +func (m *Marshaler) marshalAny(out *errWriter, any proto.Message, indent string) error { + // "If the Any contains a value that has a special JSON mapping, + // it will be converted as follows: {"@type": xxx, "value": yyy}. + // Otherwise, the value will be converted into a JSON object, + // and the "@type" field will be inserted to indicate the actual data type." + v := reflect.ValueOf(any).Elem() + turl := v.Field(0).String() + val := v.Field(1).Bytes() + + var msg proto.Message + var err error + if m.AnyResolver != nil { + msg, err = m.AnyResolver.Resolve(turl) + } else { + msg, err = defaultResolveAny(turl) + } + if err != nil { + return err + } + + if err := proto.Unmarshal(val, msg); err != nil { + return err + } + + if _, ok := msg.(wkt); ok { + out.write("{") + if m.Indent != "" { + out.write("\n") + } + if err := m.marshalTypeURL(out, indent, turl); err != nil { + return err + } + m.writeSep(out) + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + out.write(`"value": `) + } else { + out.write(`"value":`) + } + if err := m.marshalObject(out, msg, indent+m.Indent, ""); err != nil { + return err + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + } + out.write("}") + return out.err + } + + return m.marshalObject(out, msg, indent, turl) +} + +func (m *Marshaler) marshalTypeURL(out *errWriter, indent, typeURL string) error { + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + } + out.write(`"@type":`) + if m.Indent != "" { + out.write(" ") + } + b, err := json.Marshal(typeURL) + if err != nil { + return err + } + out.write(string(b)) + return out.err +} + +// marshalField writes field description and value to the Writer. +func (m *Marshaler) marshalField(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error { + if m.Indent != "" { + out.write(indent) + out.write(m.Indent) + } + out.write(`"`) + out.write(prop.JSONName) + out.write(`":`) + if m.Indent != "" { + out.write(" ") + } + if err := m.marshalValue(out, prop, v, indent); err != nil { + return err + } + return nil +} + +// marshalValue writes the value to the Writer. +func (m *Marshaler) marshalValue(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error { + var err error + v = reflect.Indirect(v) + + // Handle nil pointer + if v.Kind() == reflect.Invalid { + out.write("null") + return out.err + } + + // Handle repeated elements. + if v.Kind() == reflect.Slice && v.Type().Elem().Kind() != reflect.Uint8 { + out.write("[") + comma := "" + for i := 0; i < v.Len(); i++ { + sliceVal := v.Index(i) + out.write(comma) + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + out.write(m.Indent) + } + if err := m.marshalValue(out, prop, sliceVal, indent+m.Indent); err != nil { + return err + } + comma = "," + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + } + out.write("]") + return out.err + } + + // Handle well-known types. + // Most are handled up in marshalObject (because 99% are messages). + if v.Type().Implements(wktType) { + wkt := v.Interface().(wkt) + switch wkt.XXX_WellKnownType() { + case "NullValue": + out.write("null") + return out.err + } + } + + // Handle enumerations. + if !m.EnumsAsInts && prop.Enum != "" { + // Unknown enum values will are stringified by the proto library as their + // value. Such values should _not_ be quoted or they will be interpreted + // as an enum string instead of their value. + enumStr := v.Interface().(fmt.Stringer).String() + var valStr string + if v.Kind() == reflect.Ptr { + valStr = strconv.Itoa(int(v.Elem().Int())) + } else { + valStr = strconv.Itoa(int(v.Int())) + } + isKnownEnum := enumStr != valStr + if isKnownEnum { + out.write(`"`) + } + out.write(enumStr) + if isKnownEnum { + out.write(`"`) + } + return out.err + } + + // Handle nested messages. + if v.Kind() == reflect.Struct { + return m.marshalObject(out, v.Addr().Interface().(proto.Message), indent+m.Indent, "") + } + + // Handle maps. + // Since Go randomizes map iteration, we sort keys for stable output. + if v.Kind() == reflect.Map { + out.write(`{`) + keys := v.MapKeys() + sort.Sort(mapKeys(keys)) + for i, k := range keys { + if i > 0 { + out.write(`,`) + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + out.write(m.Indent) + } + + // TODO handle map key prop properly + b, err := json.Marshal(k.Interface()) + if err != nil { + return err + } + s := string(b) + + // If the JSON is not a string value, encode it again to make it one. + if !strings.HasPrefix(s, `"`) { + b, err := json.Marshal(s) + if err != nil { + return err + } + s = string(b) + } + + out.write(s) + out.write(`:`) + if m.Indent != "" { + out.write(` `) + } + + vprop := prop + if prop != nil && prop.MapValProp != nil { + vprop = prop.MapValProp + } + if err := m.marshalValue(out, vprop, v.MapIndex(k), indent+m.Indent); err != nil { + return err + } + } + if m.Indent != "" { + out.write("\n") + out.write(indent) + out.write(m.Indent) + } + out.write(`}`) + return out.err + } + + // Handle non-finite floats, e.g. NaN, Infinity and -Infinity. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + f := v.Float() + var sval string + switch { + case math.IsInf(f, 1): + sval = `"Infinity"` + case math.IsInf(f, -1): + sval = `"-Infinity"` + case math.IsNaN(f): + sval = `"NaN"` + } + if sval != "" { + out.write(sval) + return out.err + } + } + + // Default handling defers to the encoding/json library. + b, err := json.Marshal(v.Interface()) + if err != nil { + return err + } + needToQuote := string(b[0]) != `"` && (v.Kind() == reflect.Int64 || v.Kind() == reflect.Uint64) + if needToQuote { + out.write(`"`) + } + out.write(string(b)) + if needToQuote { + out.write(`"`) + } + return out.err +} + +// Unmarshaler is a configurable object for converting from a JSON +// representation to a protocol buffer object. +type Unmarshaler struct { + // Whether to allow messages to contain unknown fields, as opposed to + // failing to unmarshal. + AllowUnknownFields bool + + // A custom URL resolver to use when unmarshaling Any messages from JSON. + // If unset, the default resolution strategy is to extract the + // fully-qualified type name from the type URL and pass that to + // proto.MessageType(string). + AnyResolver AnyResolver +} + +// UnmarshalNext unmarshals the next protocol buffer from a JSON object stream. +// This function is lenient and will decode any options permutations of the +// related Marshaler. +func (u *Unmarshaler) UnmarshalNext(dec *json.Decoder, pb proto.Message) error { + inputValue := json.RawMessage{} + if err := dec.Decode(&inputValue); err != nil { + return err + } + if err := u.unmarshalValue(reflect.ValueOf(pb).Elem(), inputValue, nil); err != nil { + return err + } + return checkRequiredFields(pb) +} + +// Unmarshal unmarshals a JSON object stream into a protocol +// buffer. This function is lenient and will decode any options +// permutations of the related Marshaler. +func (u *Unmarshaler) Unmarshal(r io.Reader, pb proto.Message) error { + dec := json.NewDecoder(r) + return u.UnmarshalNext(dec, pb) +} + +// UnmarshalNext unmarshals the next protocol buffer from a JSON object stream. +// This function is lenient and will decode any options permutations of the +// related Marshaler. +func UnmarshalNext(dec *json.Decoder, pb proto.Message) error { + return new(Unmarshaler).UnmarshalNext(dec, pb) +} + +// Unmarshal unmarshals a JSON object stream into a protocol +// buffer. This function is lenient and will decode any options +// permutations of the related Marshaler. +func Unmarshal(r io.Reader, pb proto.Message) error { + return new(Unmarshaler).Unmarshal(r, pb) +} + +// UnmarshalString will populate the fields of a protocol buffer based +// on a JSON string. This function is lenient and will decode any options +// permutations of the related Marshaler. +func UnmarshalString(str string, pb proto.Message) error { + return new(Unmarshaler).Unmarshal(strings.NewReader(str), pb) +} + +// unmarshalValue converts/copies a value into the target. +// prop may be nil. +func (u *Unmarshaler) unmarshalValue(target reflect.Value, inputValue json.RawMessage, prop *proto.Properties) error { + targetType := target.Type() + + // Allocate memory for pointer fields. + if targetType.Kind() == reflect.Ptr { + // If input value is "null" and target is a pointer type, then the field should be treated as not set + // UNLESS the target is structpb.Value, in which case it should be set to structpb.NullValue. + _, isJSONPBUnmarshaler := target.Interface().(JSONPBUnmarshaler) + if string(inputValue) == "null" && targetType != reflect.TypeOf(&stpb.Value{}) && !isJSONPBUnmarshaler { + return nil + } + target.Set(reflect.New(targetType.Elem())) + + return u.unmarshalValue(target.Elem(), inputValue, prop) + } + + if jsu, ok := target.Addr().Interface().(JSONPBUnmarshaler); ok { + return jsu.UnmarshalJSONPB(u, []byte(inputValue)) + } + + // Handle well-known types that are not pointers. + if w, ok := target.Addr().Interface().(wkt); ok { + switch w.XXX_WellKnownType() { + case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", + "Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue": + return u.unmarshalValue(target.Field(0), inputValue, prop) + case "Any": + // Use json.RawMessage pointer type instead of value to support pre-1.8 version. + // 1.8 changed RawMessage.MarshalJSON from pointer type to value type, see + // https://github.com/golang/go/issues/14493 + var jsonFields map[string]*json.RawMessage + if err := json.Unmarshal(inputValue, &jsonFields); err != nil { + return err + } + + val, ok := jsonFields["@type"] + if !ok || val == nil { + return errors.New("Any JSON doesn't have '@type'") + } + + var turl string + if err := json.Unmarshal([]byte(*val), &turl); err != nil { + return fmt.Errorf("can't unmarshal Any's '@type': %q", *val) + } + target.Field(0).SetString(turl) + + var m proto.Message + var err error + if u.AnyResolver != nil { + m, err = u.AnyResolver.Resolve(turl) + } else { + m, err = defaultResolveAny(turl) + } + if err != nil { + return err + } + + if _, ok := m.(wkt); ok { + val, ok := jsonFields["value"] + if !ok { + return errors.New("Any JSON doesn't have 'value'") + } + + if err := u.unmarshalValue(reflect.ValueOf(m).Elem(), *val, nil); err != nil { + return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err) + } + } else { + delete(jsonFields, "@type") + nestedProto, err := json.Marshal(jsonFields) + if err != nil { + return fmt.Errorf("can't generate JSON for Any's nested proto to be unmarshaled: %v", err) + } + + if err = u.unmarshalValue(reflect.ValueOf(m).Elem(), nestedProto, nil); err != nil { + return fmt.Errorf("can't unmarshal Any nested proto %T: %v", m, err) + } + } + + b, err := proto.Marshal(m) + if err != nil { + return fmt.Errorf("can't marshal proto %T into Any.Value: %v", m, err) + } + target.Field(1).SetBytes(b) + + return nil + case "Duration": + unq, err := unquote(string(inputValue)) + if err != nil { + return err + } + + d, err := time.ParseDuration(unq) + if err != nil { + return fmt.Errorf("bad Duration: %v", err) + } + + ns := d.Nanoseconds() + s := ns / 1e9 + ns %= 1e9 + target.Field(0).SetInt(s) + target.Field(1).SetInt(ns) + return nil + case "Timestamp": + unq, err := unquote(string(inputValue)) + if err != nil { + return err + } + + t, err := time.Parse(time.RFC3339Nano, unq) + if err != nil { + return fmt.Errorf("bad Timestamp: %v", err) + } + + target.Field(0).SetInt(t.Unix()) + target.Field(1).SetInt(int64(t.Nanosecond())) + return nil + case "Struct": + var m map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &m); err != nil { + return fmt.Errorf("bad StructValue: %v", err) + } + + target.Field(0).Set(reflect.ValueOf(map[string]*stpb.Value{})) + for k, jv := range m { + pv := &stpb.Value{} + if err := u.unmarshalValue(reflect.ValueOf(pv).Elem(), jv, prop); err != nil { + return fmt.Errorf("bad value in StructValue for key %q: %v", k, err) + } + target.Field(0).SetMapIndex(reflect.ValueOf(k), reflect.ValueOf(pv)) + } + return nil + case "ListValue": + var s []json.RawMessage + if err := json.Unmarshal(inputValue, &s); err != nil { + return fmt.Errorf("bad ListValue: %v", err) + } + + target.Field(0).Set(reflect.ValueOf(make([]*stpb.Value, len(s)))) + for i, sv := range s { + if err := u.unmarshalValue(target.Field(0).Index(i), sv, prop); err != nil { + return err + } + } + return nil + case "Value": + ivStr := string(inputValue) + if ivStr == "null" { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_NullValue{})) + } else if v, err := strconv.ParseFloat(ivStr, 0); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_NumberValue{v})) + } else if v, err := unquote(ivStr); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_StringValue{v})) + } else if v, err := strconv.ParseBool(ivStr); err == nil { + target.Field(0).Set(reflect.ValueOf(&stpb.Value_BoolValue{v})) + } else if err := json.Unmarshal(inputValue, &[]json.RawMessage{}); err == nil { + lv := &stpb.ListValue{} + target.Field(0).Set(reflect.ValueOf(&stpb.Value_ListValue{lv})) + return u.unmarshalValue(reflect.ValueOf(lv).Elem(), inputValue, prop) + } else if err := json.Unmarshal(inputValue, &map[string]json.RawMessage{}); err == nil { + sv := &stpb.Struct{} + target.Field(0).Set(reflect.ValueOf(&stpb.Value_StructValue{sv})) + return u.unmarshalValue(reflect.ValueOf(sv).Elem(), inputValue, prop) + } else { + return fmt.Errorf("unrecognized type for Value %q", ivStr) + } + return nil + } + } + + // Handle enums, which have an underlying type of int32, + // and may appear as strings. + // The case of an enum appearing as a number is handled + // at the bottom of this function. + if inputValue[0] == '"' && prop != nil && prop.Enum != "" { + vmap := proto.EnumValueMap(prop.Enum) + // Don't need to do unquoting; valid enum names + // are from a limited character set. + s := inputValue[1 : len(inputValue)-1] + n, ok := vmap[string(s)] + if !ok { + return fmt.Errorf("unknown value %q for enum %s", s, prop.Enum) + } + if target.Kind() == reflect.Ptr { // proto2 + target.Set(reflect.New(targetType.Elem())) + target = target.Elem() + } + if targetType.Kind() != reflect.Int32 { + return fmt.Errorf("invalid target %q for enum %s", targetType.Kind(), prop.Enum) + } + target.SetInt(int64(n)) + return nil + } + + // Handle nested messages. + if targetType.Kind() == reflect.Struct { + var jsonFields map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &jsonFields); err != nil { + return err + } + + consumeField := func(prop *proto.Properties) (json.RawMessage, bool) { + // Be liberal in what names we accept; both orig_name and camelName are okay. + fieldNames := acceptedJSONFieldNames(prop) + + vOrig, okOrig := jsonFields[fieldNames.orig] + vCamel, okCamel := jsonFields[fieldNames.camel] + if !okOrig && !okCamel { + return nil, false + } + // If, for some reason, both are present in the data, favour the camelName. + var raw json.RawMessage + if okOrig { + raw = vOrig + delete(jsonFields, fieldNames.orig) + } + if okCamel { + raw = vCamel + delete(jsonFields, fieldNames.camel) + } + return raw, true + } + + sprops := proto.GetProperties(targetType) + for i := 0; i < target.NumField(); i++ { + ft := target.Type().Field(i) + if strings.HasPrefix(ft.Name, "XXX_") { + continue + } + + valueForField, ok := consumeField(sprops.Prop[i]) + if !ok { + continue + } + + if err := u.unmarshalValue(target.Field(i), valueForField, sprops.Prop[i]); err != nil { + return err + } + } + // Check for any oneof fields. + if len(jsonFields) > 0 { + for _, oop := range sprops.OneofTypes { + raw, ok := consumeField(oop.Prop) + if !ok { + continue + } + nv := reflect.New(oop.Type.Elem()) + target.Field(oop.Field).Set(nv) + if err := u.unmarshalValue(nv.Elem().Field(0), raw, oop.Prop); err != nil { + return err + } + } + } + // Handle proto2 extensions. + if len(jsonFields) > 0 { + if ep, ok := target.Addr().Interface().(proto.Message); ok { + for _, ext := range proto.RegisteredExtensions(ep) { + name := fmt.Sprintf("[%s]", ext.Name) + raw, ok := jsonFields[name] + if !ok { + continue + } + delete(jsonFields, name) + nv := reflect.New(reflect.TypeOf(ext.ExtensionType).Elem()) + if err := u.unmarshalValue(nv.Elem(), raw, nil); err != nil { + return err + } + if err := proto.SetExtension(ep, ext, nv.Interface()); err != nil { + return err + } + } + } + } + if !u.AllowUnknownFields && len(jsonFields) > 0 { + // Pick any field to be the scapegoat. + var f string + for fname := range jsonFields { + f = fname + break + } + return fmt.Errorf("unknown field %q in %v", f, targetType) + } + return nil + } + + // Handle arrays (which aren't encoded bytes) + if targetType.Kind() == reflect.Slice && targetType.Elem().Kind() != reflect.Uint8 { + var slc []json.RawMessage + if err := json.Unmarshal(inputValue, &slc); err != nil { + return err + } + if slc != nil { + l := len(slc) + target.Set(reflect.MakeSlice(targetType, l, l)) + for i := 0; i < l; i++ { + if err := u.unmarshalValue(target.Index(i), slc[i], prop); err != nil { + return err + } + } + } + return nil + } + + // Handle maps (whose keys are always strings) + if targetType.Kind() == reflect.Map { + var mp map[string]json.RawMessage + if err := json.Unmarshal(inputValue, &mp); err != nil { + return err + } + if mp != nil { + target.Set(reflect.MakeMap(targetType)) + for ks, raw := range mp { + // Unmarshal map key. The core json library already decoded the key into a + // string, so we handle that specially. Other types were quoted post-serialization. + var k reflect.Value + if targetType.Key().Kind() == reflect.String { + k = reflect.ValueOf(ks) + } else { + k = reflect.New(targetType.Key()).Elem() + var kprop *proto.Properties + if prop != nil && prop.MapKeyProp != nil { + kprop = prop.MapKeyProp + } + if err := u.unmarshalValue(k, json.RawMessage(ks), kprop); err != nil { + return err + } + } + + // Unmarshal map value. + v := reflect.New(targetType.Elem()).Elem() + var vprop *proto.Properties + if prop != nil && prop.MapValProp != nil { + vprop = prop.MapValProp + } + if err := u.unmarshalValue(v, raw, vprop); err != nil { + return err + } + target.SetMapIndex(k, v) + } + } + return nil + } + + // Non-finite numbers can be encoded as strings. + isFloat := targetType.Kind() == reflect.Float32 || targetType.Kind() == reflect.Float64 + if isFloat { + if num, ok := nonFinite[string(inputValue)]; ok { + target.SetFloat(num) + return nil + } + } + + // integers & floats can be encoded as strings. In this case we drop + // the quotes and proceed as normal. + isNum := targetType.Kind() == reflect.Int64 || targetType.Kind() == reflect.Uint64 || + targetType.Kind() == reflect.Int32 || targetType.Kind() == reflect.Uint32 || + targetType.Kind() == reflect.Float32 || targetType.Kind() == reflect.Float64 + if isNum && strings.HasPrefix(string(inputValue), `"`) { + inputValue = inputValue[1 : len(inputValue)-1] + } + + // Use the encoding/json for parsing other value types. + return json.Unmarshal(inputValue, target.Addr().Interface()) +} + +func unquote(s string) (string, error) { + var ret string + err := json.Unmarshal([]byte(s), &ret) + return ret, err +} + +// jsonProperties returns parsed proto.Properties for the field and corrects JSONName attribute. +func jsonProperties(f reflect.StructField, origName bool) *proto.Properties { + var prop proto.Properties + prop.Init(f.Type, f.Name, f.Tag.Get("protobuf"), &f) + if origName || prop.JSONName == "" { + prop.JSONName = prop.OrigName + } + return &prop +} + +type fieldNames struct { + orig, camel string +} + +func acceptedJSONFieldNames(prop *proto.Properties) fieldNames { + opts := fieldNames{orig: prop.OrigName, camel: prop.OrigName} + if prop.JSONName != "" { + opts.camel = prop.JSONName + } + return opts +} + +// Writer wrapper inspired by https://blog.golang.org/errors-are-values +type errWriter struct { + writer io.Writer + err error +} + +func (w *errWriter) write(str string) { + if w.err != nil { + return + } + _, w.err = w.writer.Write([]byte(str)) +} + +// Map fields may have key types of non-float scalars, strings and enums. +// The easiest way to sort them in some deterministic order is to use fmt. +// If this turns out to be inefficient we can always consider other options, +// such as doing a Schwartzian transform. +// +// Numeric keys are sorted in numeric order per +// https://developers.google.com/protocol-buffers/docs/proto#maps. +type mapKeys []reflect.Value + +func (s mapKeys) Len() int { return len(s) } +func (s mapKeys) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s mapKeys) Less(i, j int) bool { + if k := s[i].Kind(); k == s[j].Kind() { + switch k { + case reflect.String: + return s[i].String() < s[j].String() + case reflect.Int32, reflect.Int64: + return s[i].Int() < s[j].Int() + case reflect.Uint32, reflect.Uint64: + return s[i].Uint() < s[j].Uint() + } + } + return fmt.Sprint(s[i].Interface()) < fmt.Sprint(s[j].Interface()) +} + +// checkRequiredFields returns an error if any required field in the given proto message is not set. +// This function is used by both Marshal and Unmarshal. While required fields only exist in a +// proto2 message, a proto3 message can contain proto2 message(s). +func checkRequiredFields(pb proto.Message) error { + // Most well-known type messages do not contain required fields. The "Any" type may contain + // a message that has required fields. + // + // When an Any message is being marshaled, the code will invoked proto.Unmarshal on Any.Value + // field in order to transform that into JSON, and that should have returned an error if a + // required field is not set in the embedded message. + // + // When an Any message is being unmarshaled, the code will have invoked proto.Marshal on the + // embedded message to store the serialized message in Any.Value field, and that should have + // returned an error if a required field is not set. + if _, ok := pb.(wkt); ok { + return nil + } + + v := reflect.ValueOf(pb) + // Skip message if it is not a struct pointer. + if v.Kind() != reflect.Ptr { + return nil + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return nil + } + + for i := 0; i < v.NumField(); i++ { + field := v.Field(i) + sfield := v.Type().Field(i) + + if sfield.PkgPath != "" { + // blank PkgPath means the field is exported; skip if not exported + continue + } + + if strings.HasPrefix(sfield.Name, "XXX_") { + continue + } + + // Oneof field is an interface implemented by wrapper structs containing the actual oneof + // field, i.e. an interface containing &T{real_value}. + if sfield.Tag.Get("protobuf_oneof") != "" { + if field.Kind() != reflect.Interface { + continue + } + v := field.Elem() + if v.Kind() != reflect.Ptr || v.IsNil() { + continue + } + v = v.Elem() + if v.Kind() != reflect.Struct || v.NumField() < 1 { + continue + } + field = v.Field(0) + sfield = v.Type().Field(0) + } + + protoTag := sfield.Tag.Get("protobuf") + if protoTag == "" { + continue + } + var prop proto.Properties + prop.Init(sfield.Type, sfield.Name, protoTag, &sfield) + + switch field.Kind() { + case reflect.Map: + if field.IsNil() { + continue + } + // Check each map value. + keys := field.MapKeys() + for _, k := range keys { + v := field.MapIndex(k) + if err := checkRequiredFieldsInValue(v); err != nil { + return err + } + } + case reflect.Slice: + // Handle non-repeated type, e.g. bytes. + if !prop.Repeated { + if prop.Required && field.IsNil() { + return fmt.Errorf("required field %q is not set", prop.Name) + } + continue + } + + // Handle repeated type. + if field.IsNil() { + continue + } + // Check each slice item. + for i := 0; i < field.Len(); i++ { + v := field.Index(i) + if err := checkRequiredFieldsInValue(v); err != nil { + return err + } + } + case reflect.Ptr: + if field.IsNil() { + if prop.Required { + return fmt.Errorf("required field %q is not set", prop.Name) + } + continue + } + if err := checkRequiredFieldsInValue(field); err != nil { + return err + } + } + } + + // Handle proto2 extensions. + for _, ext := range proto.RegisteredExtensions(pb) { + if !proto.HasExtension(pb, ext) { + continue + } + ep, err := proto.GetExtension(pb, ext) + if err != nil { + return err + } + err = checkRequiredFieldsInValue(reflect.ValueOf(ep)) + if err != nil { + return err + } + } + + return nil +} + +func checkRequiredFieldsInValue(v reflect.Value) error { + if v.Type().Implements(messageType) { + return checkRequiredFields(v.Interface().(proto.Message)) + } + return nil +} diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go new file mode 100644 index 00000000..1ded05bb --- /dev/null +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go @@ -0,0 +1,2887 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/descriptor.proto + +package descriptor + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type FieldDescriptorProto_Type int32 + +const ( + // 0 is reserved for errors. + // Order is weird for historical reasons. + FieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1 + FieldDescriptorProto_TYPE_FLOAT FieldDescriptorProto_Type = 2 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT64 FieldDescriptorProto_Type = 3 + FieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT32 FieldDescriptorProto_Type = 5 + FieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6 + FieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7 + FieldDescriptorProto_TYPE_BOOL FieldDescriptorProto_Type = 8 + FieldDescriptorProto_TYPE_STRING FieldDescriptorProto_Type = 9 + // Tag-delimited aggregate. + // Group type is deprecated and not supported in proto3. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. + FieldDescriptorProto_TYPE_GROUP FieldDescriptorProto_Type = 10 + FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11 + // New in version 2. + FieldDescriptorProto_TYPE_BYTES FieldDescriptorProto_Type = 12 + FieldDescriptorProto_TYPE_UINT32 FieldDescriptorProto_Type = 13 + FieldDescriptorProto_TYPE_ENUM FieldDescriptorProto_Type = 14 + FieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15 + FieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16 + FieldDescriptorProto_TYPE_SINT32 FieldDescriptorProto_Type = 17 + FieldDescriptorProto_TYPE_SINT64 FieldDescriptorProto_Type = 18 +) + +var FieldDescriptorProto_Type_name = map[int32]string{ + 1: "TYPE_DOUBLE", + 2: "TYPE_FLOAT", + 3: "TYPE_INT64", + 4: "TYPE_UINT64", + 5: "TYPE_INT32", + 6: "TYPE_FIXED64", + 7: "TYPE_FIXED32", + 8: "TYPE_BOOL", + 9: "TYPE_STRING", + 10: "TYPE_GROUP", + 11: "TYPE_MESSAGE", + 12: "TYPE_BYTES", + 13: "TYPE_UINT32", + 14: "TYPE_ENUM", + 15: "TYPE_SFIXED32", + 16: "TYPE_SFIXED64", + 17: "TYPE_SINT32", + 18: "TYPE_SINT64", +} + +var FieldDescriptorProto_Type_value = map[string]int32{ + "TYPE_DOUBLE": 1, + "TYPE_FLOAT": 2, + "TYPE_INT64": 3, + "TYPE_UINT64": 4, + "TYPE_INT32": 5, + "TYPE_FIXED64": 6, + "TYPE_FIXED32": 7, + "TYPE_BOOL": 8, + "TYPE_STRING": 9, + "TYPE_GROUP": 10, + "TYPE_MESSAGE": 11, + "TYPE_BYTES": 12, + "TYPE_UINT32": 13, + "TYPE_ENUM": 14, + "TYPE_SFIXED32": 15, + "TYPE_SFIXED64": 16, + "TYPE_SINT32": 17, + "TYPE_SINT64": 18, +} + +func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type { + p := new(FieldDescriptorProto_Type) + *p = x + return p +} + +func (x FieldDescriptorProto_Type) String() string { + return proto.EnumName(FieldDescriptorProto_Type_name, int32(x)) +} + +func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type") + if err != nil { + return err + } + *x = FieldDescriptorProto_Type(value) + return nil +} + +func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{4, 0} +} + +type FieldDescriptorProto_Label int32 + +const ( + // 0 is reserved for errors + FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1 + FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2 + FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3 +) + +var FieldDescriptorProto_Label_name = map[int32]string{ + 1: "LABEL_OPTIONAL", + 2: "LABEL_REQUIRED", + 3: "LABEL_REPEATED", +} + +var FieldDescriptorProto_Label_value = map[string]int32{ + "LABEL_OPTIONAL": 1, + "LABEL_REQUIRED": 2, + "LABEL_REPEATED": 3, +} + +func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label { + p := new(FieldDescriptorProto_Label) + *p = x + return p +} + +func (x FieldDescriptorProto_Label) String() string { + return proto.EnumName(FieldDescriptorProto_Label_name, int32(x)) +} + +func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label") + if err != nil { + return err + } + *x = FieldDescriptorProto_Label(value) + return nil +} + +func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{4, 1} +} + +// Generated classes can be optimized for speed or code size. +type FileOptions_OptimizeMode int32 + +const ( + FileOptions_SPEED FileOptions_OptimizeMode = 1 + // etc. + FileOptions_CODE_SIZE FileOptions_OptimizeMode = 2 + FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3 +) + +var FileOptions_OptimizeMode_name = map[int32]string{ + 1: "SPEED", + 2: "CODE_SIZE", + 3: "LITE_RUNTIME", +} + +var FileOptions_OptimizeMode_value = map[string]int32{ + "SPEED": 1, + "CODE_SIZE": 2, + "LITE_RUNTIME": 3, +} + +func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode { + p := new(FileOptions_OptimizeMode) + *p = x + return p +} + +func (x FileOptions_OptimizeMode) String() string { + return proto.EnumName(FileOptions_OptimizeMode_name, int32(x)) +} + +func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode") + if err != nil { + return err + } + *x = FileOptions_OptimizeMode(value) + return nil +} + +func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{10, 0} +} + +type FieldOptions_CType int32 + +const ( + // Default mode. + FieldOptions_STRING FieldOptions_CType = 0 + FieldOptions_CORD FieldOptions_CType = 1 + FieldOptions_STRING_PIECE FieldOptions_CType = 2 +) + +var FieldOptions_CType_name = map[int32]string{ + 0: "STRING", + 1: "CORD", + 2: "STRING_PIECE", +} + +var FieldOptions_CType_value = map[string]int32{ + "STRING": 0, + "CORD": 1, + "STRING_PIECE": 2, +} + +func (x FieldOptions_CType) Enum() *FieldOptions_CType { + p := new(FieldOptions_CType) + *p = x + return p +} + +func (x FieldOptions_CType) String() string { + return proto.EnumName(FieldOptions_CType_name, int32(x)) +} + +func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType") + if err != nil { + return err + } + *x = FieldOptions_CType(value) + return nil +} + +func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{12, 0} +} + +type FieldOptions_JSType int32 + +const ( + // Use the default type. + FieldOptions_JS_NORMAL FieldOptions_JSType = 0 + // Use JavaScript strings. + FieldOptions_JS_STRING FieldOptions_JSType = 1 + // Use JavaScript numbers. + FieldOptions_JS_NUMBER FieldOptions_JSType = 2 +) + +var FieldOptions_JSType_name = map[int32]string{ + 0: "JS_NORMAL", + 1: "JS_STRING", + 2: "JS_NUMBER", +} + +var FieldOptions_JSType_value = map[string]int32{ + "JS_NORMAL": 0, + "JS_STRING": 1, + "JS_NUMBER": 2, +} + +func (x FieldOptions_JSType) Enum() *FieldOptions_JSType { + p := new(FieldOptions_JSType) + *p = x + return p +} + +func (x FieldOptions_JSType) String() string { + return proto.EnumName(FieldOptions_JSType_name, int32(x)) +} + +func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_JSType_value, data, "FieldOptions_JSType") + if err != nil { + return err + } + *x = FieldOptions_JSType(value) + return nil +} + +func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{12, 1} +} + +// Is this method side-effect-free (or safe in HTTP parlance), or idempotent, +// or neither? HTTP based RPC implementation may choose GET verb for safe +// methods, and PUT verb for idempotent methods instead of the default POST. +type MethodOptions_IdempotencyLevel int32 + +const ( + MethodOptions_IDEMPOTENCY_UNKNOWN MethodOptions_IdempotencyLevel = 0 + MethodOptions_NO_SIDE_EFFECTS MethodOptions_IdempotencyLevel = 1 + MethodOptions_IDEMPOTENT MethodOptions_IdempotencyLevel = 2 +) + +var MethodOptions_IdempotencyLevel_name = map[int32]string{ + 0: "IDEMPOTENCY_UNKNOWN", + 1: "NO_SIDE_EFFECTS", + 2: "IDEMPOTENT", +} + +var MethodOptions_IdempotencyLevel_value = map[string]int32{ + "IDEMPOTENCY_UNKNOWN": 0, + "NO_SIDE_EFFECTS": 1, + "IDEMPOTENT": 2, +} + +func (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel { + p := new(MethodOptions_IdempotencyLevel) + *p = x + return p +} + +func (x MethodOptions_IdempotencyLevel) String() string { + return proto.EnumName(MethodOptions_IdempotencyLevel_name, int32(x)) +} + +func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, "MethodOptions_IdempotencyLevel") + if err != nil { + return err + } + *x = MethodOptions_IdempotencyLevel(value) + return nil +} + +func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{17, 0} +} + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +type FileDescriptorSet struct { + File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } +func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorSet) ProtoMessage() {} +func (*FileDescriptorSet) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{0} +} + +func (m *FileDescriptorSet) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorSet.Unmarshal(m, b) +} +func (m *FileDescriptorSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorSet.Marshal(b, m, deterministic) +} +func (m *FileDescriptorSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorSet.Merge(m, src) +} +func (m *FileDescriptorSet) XXX_Size() int { + return xxx_messageInfo_FileDescriptorSet.Size(m) +} +func (m *FileDescriptorSet) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorSet.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDescriptorSet proto.InternalMessageInfo + +func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto { + if m != nil { + return m.File + } + return nil +} + +// Describes a complete .proto file. +type FileDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` + // Names of files imported by this file. + Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"` + // Indexes of the public imported files in the dependency list above. + PublicDependency []int32 `protobuf:"varint,10,rep,name=public_dependency,json=publicDependency" json:"public_dependency,omitempty"` + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + WeakDependency []int32 `protobuf:"varint,11,rep,name=weak_dependency,json=weakDependency" json:"weak_dependency,omitempty"` + // All top-level definitions in this file. + MessageType []*DescriptorProto `protobuf:"bytes,4,rep,name=message_type,json=messageType" json:"message_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,5,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + Service []*ServiceDescriptorProto `protobuf:"bytes,6,rep,name=service" json:"service,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,7,rep,name=extension" json:"extension,omitempty"` + Options *FileOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} } +func (m *FileDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorProto) ProtoMessage() {} +func (*FileDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{1} +} + +func (m *FileDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorProto.Unmarshal(m, b) +} +func (m *FileDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorProto.Marshal(b, m, deterministic) +} +func (m *FileDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorProto.Merge(m, src) +} +func (m *FileDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FileDescriptorProto.Size(m) +} +func (m *FileDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDescriptorProto proto.InternalMessageInfo + +func (m *FileDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FileDescriptorProto) GetPackage() string { + if m != nil && m.Package != nil { + return *m.Package + } + return "" +} + +func (m *FileDescriptorProto) GetDependency() []string { + if m != nil { + return m.Dependency + } + return nil +} + +func (m *FileDescriptorProto) GetPublicDependency() []int32 { + if m != nil { + return m.PublicDependency + } + return nil +} + +func (m *FileDescriptorProto) GetWeakDependency() []int32 { + if m != nil { + return m.WeakDependency + } + return nil +} + +func (m *FileDescriptorProto) GetMessageType() []*DescriptorProto { + if m != nil { + return m.MessageType + } + return nil +} + +func (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto { + if m != nil { + return m.Service + } + return nil +} + +func (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *FileDescriptorProto) GetOptions() *FileOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo { + if m != nil { + return m.SourceCodeInfo + } + return nil +} + +func (m *FileDescriptorProto) GetSyntax() string { + if m != nil && m.Syntax != nil { + return *m.Syntax + } + return "" +} + +// Describes a message type. +type DescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Field []*FieldDescriptorProto `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"` + NestedType []*DescriptorProto `protobuf:"bytes,3,rep,name=nested_type,json=nestedType" json:"nested_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,4,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + ExtensionRange []*DescriptorProto_ExtensionRange `protobuf:"bytes,5,rep,name=extension_range,json=extensionRange" json:"extension_range,omitempty"` + OneofDecl []*OneofDescriptorProto `protobuf:"bytes,8,rep,name=oneof_decl,json=oneofDecl" json:"oneof_decl,omitempty"` + Options *MessageOptions `protobuf:"bytes,7,opt,name=options" json:"options,omitempty"` + ReservedRange []*DescriptorProto_ReservedRange `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto) Reset() { *m = DescriptorProto{} } +func (m *DescriptorProto) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto) ProtoMessage() {} +func (*DescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{2} +} + +func (m *DescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto.Unmarshal(m, b) +} +func (m *DescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto.Marshal(b, m, deterministic) +} +func (m *DescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto.Merge(m, src) +} +func (m *DescriptorProto) XXX_Size() int { + return xxx_messageInfo_DescriptorProto.Size(m) +} +func (m *DescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto proto.InternalMessageInfo + +func (m *DescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *DescriptorProto) GetField() []*FieldDescriptorProto { + if m != nil { + return m.Field + } + return nil +} + +func (m *DescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *DescriptorProto) GetNestedType() []*DescriptorProto { + if m != nil { + return m.NestedType + } + return nil +} + +func (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange { + if m != nil { + return m.ExtensionRange + } + return nil +} + +func (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto { + if m != nil { + return m.OneofDecl + } + return nil +} + +func (m *DescriptorProto) GetOptions() *MessageOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *DescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +type DescriptorProto_ExtensionRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + Options *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto_ExtensionRange) Reset() { *m = DescriptorProto_ExtensionRange{} } +func (m *DescriptorProto_ExtensionRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ExtensionRange) ProtoMessage() {} +func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{2, 0} +} + +func (m *DescriptorProto_ExtensionRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Unmarshal(m, b) +} +func (m *DescriptorProto_ExtensionRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Marshal(b, m, deterministic) +} +func (m *DescriptorProto_ExtensionRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ExtensionRange.Merge(m, src) +} +func (m *DescriptorProto_ExtensionRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Size(m) +} +func (m *DescriptorProto_ExtensionRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ExtensionRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ExtensionRange proto.InternalMessageInfo + +func (m *DescriptorProto_ExtensionRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions { + if m != nil { + return m.Options + } + return nil +} + +// Range of reserved tag numbers. Reserved tag numbers may not be used by +// fields or extension ranges in the same message. Reserved ranges may +// not overlap. +type DescriptorProto_ReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto_ReservedRange) Reset() { *m = DescriptorProto_ReservedRange{} } +func (m *DescriptorProto_ReservedRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ReservedRange) ProtoMessage() {} +func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{2, 1} +} + +func (m *DescriptorProto_ReservedRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ReservedRange.Unmarshal(m, b) +} +func (m *DescriptorProto_ReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ReservedRange.Marshal(b, m, deterministic) +} +func (m *DescriptorProto_ReservedRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ReservedRange.Merge(m, src) +} +func (m *DescriptorProto_ReservedRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ReservedRange.Size(m) +} +func (m *DescriptorProto_ReservedRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ReservedRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ReservedRange proto.InternalMessageInfo + +func (m *DescriptorProto_ReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +type ExtensionRangeOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ExtensionRangeOptions) Reset() { *m = ExtensionRangeOptions{} } +func (m *ExtensionRangeOptions) String() string { return proto.CompactTextString(m) } +func (*ExtensionRangeOptions) ProtoMessage() {} +func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{3} +} + +var extRange_ExtensionRangeOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*ExtensionRangeOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ExtensionRangeOptions +} + +func (m *ExtensionRangeOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ExtensionRangeOptions.Unmarshal(m, b) +} +func (m *ExtensionRangeOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ExtensionRangeOptions.Marshal(b, m, deterministic) +} +func (m *ExtensionRangeOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExtensionRangeOptions.Merge(m, src) +} +func (m *ExtensionRangeOptions) XXX_Size() int { + return xxx_messageInfo_ExtensionRangeOptions.Size(m) +} +func (m *ExtensionRangeOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ExtensionRangeOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ExtensionRangeOptions proto.InternalMessageInfo + +func (m *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// Describes a field within a message. +type FieldDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,3,opt,name=number" json:"number,omitempty"` + Label *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"` + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + Type *FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type" json:"type,omitempty"` + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + TypeName *string `protobuf:"bytes,6,opt,name=type_name,json=typeName" json:"type_name,omitempty"` + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + Extendee *string `protobuf:"bytes,2,opt,name=extendee" json:"extendee,omitempty"` + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + OneofIndex *int32 `protobuf:"varint,9,opt,name=oneof_index,json=oneofIndex" json:"oneof_index,omitempty"` + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + JsonName *string `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"` + Options *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} } +func (m *FieldDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FieldDescriptorProto) ProtoMessage() {} +func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{4} +} + +func (m *FieldDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldDescriptorProto.Unmarshal(m, b) +} +func (m *FieldDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldDescriptorProto.Marshal(b, m, deterministic) +} +func (m *FieldDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldDescriptorProto.Merge(m, src) +} +func (m *FieldDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FieldDescriptorProto.Size(m) +} +func (m *FieldDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FieldDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldDescriptorProto proto.InternalMessageInfo + +func (m *FieldDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FieldDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label { + if m != nil && m.Label != nil { + return *m.Label + } + return FieldDescriptorProto_LABEL_OPTIONAL +} + +func (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return FieldDescriptorProto_TYPE_DOUBLE +} + +func (m *FieldDescriptorProto) GetTypeName() string { + if m != nil && m.TypeName != nil { + return *m.TypeName + } + return "" +} + +func (m *FieldDescriptorProto) GetExtendee() string { + if m != nil && m.Extendee != nil { + return *m.Extendee + } + return "" +} + +func (m *FieldDescriptorProto) GetDefaultValue() string { + if m != nil && m.DefaultValue != nil { + return *m.DefaultValue + } + return "" +} + +func (m *FieldDescriptorProto) GetOneofIndex() int32 { + if m != nil && m.OneofIndex != nil { + return *m.OneofIndex + } + return 0 +} + +func (m *FieldDescriptorProto) GetJsonName() string { + if m != nil && m.JsonName != nil { + return *m.JsonName + } + return "" +} + +func (m *FieldDescriptorProto) GetOptions() *FieldOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a oneof. +type OneofDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} } +func (m *OneofDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*OneofDescriptorProto) ProtoMessage() {} +func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{5} +} + +func (m *OneofDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofDescriptorProto.Unmarshal(m, b) +} +func (m *OneofDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofDescriptorProto.Marshal(b, m, deterministic) +} +func (m *OneofDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofDescriptorProto.Merge(m, src) +} +func (m *OneofDescriptorProto) XXX_Size() int { + return xxx_messageInfo_OneofDescriptorProto.Size(m) +} +func (m *OneofDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_OneofDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_OneofDescriptorProto proto.InternalMessageInfo + +func (m *OneofDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *OneofDescriptorProto) GetOptions() *OneofOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes an enum type. +type EnumDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` + Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + // Range of reserved numeric values. Reserved numeric values may not be used + // by enum values in the same enum declaration. Reserved ranges may not + // overlap. + ReservedRange []*EnumDescriptorProto_EnumReservedRange `protobuf:"bytes,4,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` + // Reserved enum value names, which may not be reused. A given name may only + // be reserved once. + ReservedName []string `protobuf:"bytes,5,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} } +func (m *EnumDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto) ProtoMessage() {} +func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{6} +} + +func (m *EnumDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto.Unmarshal(m, b) +} +func (m *EnumDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto.Marshal(b, m, deterministic) +} +func (m *EnumDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto.Merge(m, src) +} +func (m *EnumDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto.Size(m) +} +func (m *EnumDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumDescriptorProto proto.InternalMessageInfo + +func (m *EnumDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto { + if m != nil { + return m.Value + } + return nil +} + +func (m *EnumDescriptorProto) GetOptions() *EnumOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *EnumDescriptorProto) GetReservedRange() []*EnumDescriptorProto_EnumReservedRange { + if m != nil { + return m.ReservedRange + } + return nil +} + +func (m *EnumDescriptorProto) GetReservedName() []string { + if m != nil { + return m.ReservedName + } + return nil +} + +// Range of reserved numeric values. Reserved values may not be used by +// entries in the same enum. Reserved ranges may not overlap. +// +// Note that this is distinct from DescriptorProto.ReservedRange in that it +// is inclusive such that it can appropriately represent the entire int32 +// domain. +type EnumDescriptorProto_EnumReservedRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto_EnumReservedRange) Reset() { *m = EnumDescriptorProto_EnumReservedRange{} } +func (m *EnumDescriptorProto_EnumReservedRange) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {} +func (*EnumDescriptorProto_EnumReservedRange) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{6, 0} +} + +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Unmarshal(m, b) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Marshal(b, m, deterministic) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Merge(m, src) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.Size(m) +} +func (m *EnumDescriptorProto_EnumReservedRange) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto_EnumReservedRange.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumDescriptorProto_EnumReservedRange proto.InternalMessageInfo + +func (m *EnumDescriptorProto_EnumReservedRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +// Describes a value within an enum. +type EnumValueDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` + Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} } +func (m *EnumValueDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumValueDescriptorProto) ProtoMessage() {} +func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{7} +} + +func (m *EnumValueDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueDescriptorProto.Unmarshal(m, b) +} +func (m *EnumValueDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueDescriptorProto.Marshal(b, m, deterministic) +} +func (m *EnumValueDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueDescriptorProto.Merge(m, src) +} +func (m *EnumValueDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumValueDescriptorProto.Size(m) +} +func (m *EnumValueDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueDescriptorProto proto.InternalMessageInfo + +func (m *EnumValueDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumValueDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a service. +type ServiceDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` + Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} } +func (m *ServiceDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*ServiceDescriptorProto) ProtoMessage() {} +func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{8} +} + +func (m *ServiceDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceDescriptorProto.Unmarshal(m, b) +} +func (m *ServiceDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceDescriptorProto.Marshal(b, m, deterministic) +} +func (m *ServiceDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceDescriptorProto.Merge(m, src) +} +func (m *ServiceDescriptorProto) XXX_Size() int { + return xxx_messageInfo_ServiceDescriptorProto.Size(m) +} +func (m *ServiceDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceDescriptorProto proto.InternalMessageInfo + +func (m *ServiceDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto { + if m != nil { + return m.Method + } + return nil +} + +func (m *ServiceDescriptorProto) GetOptions() *ServiceOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a method of a service. +type MethodDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + InputType *string `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"` + OutputType *string `protobuf:"bytes,3,opt,name=output_type,json=outputType" json:"output_type,omitempty"` + Options *MethodOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"` + // Identifies if client streams multiple client messages + ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"` + // Identifies if server streams multiple server messages + ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} } +func (m *MethodDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*MethodDescriptorProto) ProtoMessage() {} +func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{9} +} + +func (m *MethodDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodDescriptorProto.Unmarshal(m, b) +} +func (m *MethodDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodDescriptorProto.Marshal(b, m, deterministic) +} +func (m *MethodDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodDescriptorProto.Merge(m, src) +} +func (m *MethodDescriptorProto) XXX_Size() int { + return xxx_messageInfo_MethodDescriptorProto.Size(m) +} +func (m *MethodDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_MethodDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodDescriptorProto proto.InternalMessageInfo + +const Default_MethodDescriptorProto_ClientStreaming bool = false +const Default_MethodDescriptorProto_ServerStreaming bool = false + +func (m *MethodDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MethodDescriptorProto) GetInputType() string { + if m != nil && m.InputType != nil { + return *m.InputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOutputType() string { + if m != nil && m.OutputType != nil { + return *m.OutputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOptions() *MethodOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *MethodDescriptorProto) GetClientStreaming() bool { + if m != nil && m.ClientStreaming != nil { + return *m.ClientStreaming + } + return Default_MethodDescriptorProto_ClientStreaming +} + +func (m *MethodDescriptorProto) GetServerStreaming() bool { + if m != nil && m.ServerStreaming != nil { + return *m.ServerStreaming + } + return Default_MethodDescriptorProto_ServerStreaming +} + +type FileOptions struct { + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` + // This option does nothing. + JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` // Deprecated: Do not use. + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + JavaStringCheckUtf8 *bool `protobuf:"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0" json:"java_string_check_utf8,omitempty"` + OptimizeFor *FileOptions_OptimizeMode `protobuf:"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1" json:"optimize_for,omitempty"` + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + GoPackage *string `protobuf:"bytes,11,opt,name=go_package,json=goPackage" json:"go_package,omitempty"` + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + CcGenericServices *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"` + JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"` + PyGenericServices *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"` + PhpGenericServices *bool `protobuf:"varint,42,opt,name=php_generic_services,json=phpGenericServices,def=0" json:"php_generic_services,omitempty"` + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + Deprecated *bool `protobuf:"varint,23,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + CcEnableArenas *bool `protobuf:"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0" json:"cc_enable_arenas,omitempty"` + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + ObjcClassPrefix *string `protobuf:"bytes,36,opt,name=objc_class_prefix,json=objcClassPrefix" json:"objc_class_prefix,omitempty"` + // Namespace for generated classes; defaults to the package. + CsharpNamespace *string `protobuf:"bytes,37,opt,name=csharp_namespace,json=csharpNamespace" json:"csharp_namespace,omitempty"` + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + SwiftPrefix *string `protobuf:"bytes,39,opt,name=swift_prefix,json=swiftPrefix" json:"swift_prefix,omitempty"` + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + PhpClassPrefix *string `protobuf:"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix" json:"php_class_prefix,omitempty"` + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + PhpNamespace *string `protobuf:"bytes,41,opt,name=php_namespace,json=phpNamespace" json:"php_namespace,omitempty"` + // Use this option to change the namespace of php generated metadata classes. + // Default is empty. When this option is empty, the proto file name will be used + // for determining the namespace. + PhpMetadataNamespace *string `protobuf:"bytes,44,opt,name=php_metadata_namespace,json=phpMetadataNamespace" json:"php_metadata_namespace,omitempty"` + // Use this option to change the package of ruby generated classes. Default + // is empty. When this option is not set, the package name will be used for + // determining the ruby package. + RubyPackage *string `protobuf:"bytes,45,opt,name=ruby_package,json=rubyPackage" json:"ruby_package,omitempty"` + // The parser stores options it doesn't recognize here. + // See the documentation for the "Options" section above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileOptions) Reset() { *m = FileOptions{} } +func (m *FileOptions) String() string { return proto.CompactTextString(m) } +func (*FileOptions) ProtoMessage() {} +func (*FileOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{10} +} + +var extRange_FileOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*FileOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FileOptions +} + +func (m *FileOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileOptions.Unmarshal(m, b) +} +func (m *FileOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileOptions.Marshal(b, m, deterministic) +} +func (m *FileOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileOptions.Merge(m, src) +} +func (m *FileOptions) XXX_Size() int { + return xxx_messageInfo_FileOptions.Size(m) +} +func (m *FileOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FileOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FileOptions proto.InternalMessageInfo + +const Default_FileOptions_JavaMultipleFiles bool = false +const Default_FileOptions_JavaStringCheckUtf8 bool = false +const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED +const Default_FileOptions_CcGenericServices bool = false +const Default_FileOptions_JavaGenericServices bool = false +const Default_FileOptions_PyGenericServices bool = false +const Default_FileOptions_PhpGenericServices bool = false +const Default_FileOptions_Deprecated bool = false +const Default_FileOptions_CcEnableArenas bool = false + +func (m *FileOptions) GetJavaPackage() string { + if m != nil && m.JavaPackage != nil { + return *m.JavaPackage + } + return "" +} + +func (m *FileOptions) GetJavaOuterClassname() string { + if m != nil && m.JavaOuterClassname != nil { + return *m.JavaOuterClassname + } + return "" +} + +func (m *FileOptions) GetJavaMultipleFiles() bool { + if m != nil && m.JavaMultipleFiles != nil { + return *m.JavaMultipleFiles + } + return Default_FileOptions_JavaMultipleFiles +} + +// Deprecated: Do not use. +func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool { + if m != nil && m.JavaGenerateEqualsAndHash != nil { + return *m.JavaGenerateEqualsAndHash + } + return false +} + +func (m *FileOptions) GetJavaStringCheckUtf8() bool { + if m != nil && m.JavaStringCheckUtf8 != nil { + return *m.JavaStringCheckUtf8 + } + return Default_FileOptions_JavaStringCheckUtf8 +} + +func (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode { + if m != nil && m.OptimizeFor != nil { + return *m.OptimizeFor + } + return Default_FileOptions_OptimizeFor +} + +func (m *FileOptions) GetGoPackage() string { + if m != nil && m.GoPackage != nil { + return *m.GoPackage + } + return "" +} + +func (m *FileOptions) GetCcGenericServices() bool { + if m != nil && m.CcGenericServices != nil { + return *m.CcGenericServices + } + return Default_FileOptions_CcGenericServices +} + +func (m *FileOptions) GetJavaGenericServices() bool { + if m != nil && m.JavaGenericServices != nil { + return *m.JavaGenericServices + } + return Default_FileOptions_JavaGenericServices +} + +func (m *FileOptions) GetPyGenericServices() bool { + if m != nil && m.PyGenericServices != nil { + return *m.PyGenericServices + } + return Default_FileOptions_PyGenericServices +} + +func (m *FileOptions) GetPhpGenericServices() bool { + if m != nil && m.PhpGenericServices != nil { + return *m.PhpGenericServices + } + return Default_FileOptions_PhpGenericServices +} + +func (m *FileOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FileOptions_Deprecated +} + +func (m *FileOptions) GetCcEnableArenas() bool { + if m != nil && m.CcEnableArenas != nil { + return *m.CcEnableArenas + } + return Default_FileOptions_CcEnableArenas +} + +func (m *FileOptions) GetObjcClassPrefix() string { + if m != nil && m.ObjcClassPrefix != nil { + return *m.ObjcClassPrefix + } + return "" +} + +func (m *FileOptions) GetCsharpNamespace() string { + if m != nil && m.CsharpNamespace != nil { + return *m.CsharpNamespace + } + return "" +} + +func (m *FileOptions) GetSwiftPrefix() string { + if m != nil && m.SwiftPrefix != nil { + return *m.SwiftPrefix + } + return "" +} + +func (m *FileOptions) GetPhpClassPrefix() string { + if m != nil && m.PhpClassPrefix != nil { + return *m.PhpClassPrefix + } + return "" +} + +func (m *FileOptions) GetPhpNamespace() string { + if m != nil && m.PhpNamespace != nil { + return *m.PhpNamespace + } + return "" +} + +func (m *FileOptions) GetPhpMetadataNamespace() string { + if m != nil && m.PhpMetadataNamespace != nil { + return *m.PhpMetadataNamespace + } + return "" +} + +func (m *FileOptions) GetRubyPackage() string { + if m != nil && m.RubyPackage != nil { + return *m.RubyPackage + } + return "" +} + +func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MessageOptions struct { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + MessageSetWireFormat *bool `protobuf:"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0" json:"message_set_wire_format,omitempty"` + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + NoStandardDescriptorAccessor *bool `protobuf:"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0" json:"no_standard_descriptor_accessor,omitempty"` + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementions still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MessageOptions) Reset() { *m = MessageOptions{} } +func (m *MessageOptions) String() string { return proto.CompactTextString(m) } +func (*MessageOptions) ProtoMessage() {} +func (*MessageOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{11} +} + +var extRange_MessageOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*MessageOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MessageOptions +} + +func (m *MessageOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MessageOptions.Unmarshal(m, b) +} +func (m *MessageOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MessageOptions.Marshal(b, m, deterministic) +} +func (m *MessageOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MessageOptions.Merge(m, src) +} +func (m *MessageOptions) XXX_Size() int { + return xxx_messageInfo_MessageOptions.Size(m) +} +func (m *MessageOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MessageOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MessageOptions proto.InternalMessageInfo + +const Default_MessageOptions_MessageSetWireFormat bool = false +const Default_MessageOptions_NoStandardDescriptorAccessor bool = false +const Default_MessageOptions_Deprecated bool = false + +func (m *MessageOptions) GetMessageSetWireFormat() bool { + if m != nil && m.MessageSetWireFormat != nil { + return *m.MessageSetWireFormat + } + return Default_MessageOptions_MessageSetWireFormat +} + +func (m *MessageOptions) GetNoStandardDescriptorAccessor() bool { + if m != nil && m.NoStandardDescriptorAccessor != nil { + return *m.NoStandardDescriptorAccessor + } + return Default_MessageOptions_NoStandardDescriptorAccessor +} + +func (m *MessageOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MessageOptions_Deprecated +} + +func (m *MessageOptions) GetMapEntry() bool { + if m != nil && m.MapEntry != nil { + return *m.MapEntry + } + return false +} + +func (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type FieldOptions struct { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. + Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"` + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. + Jstype *FieldOptions_JSType `protobuf:"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0" json:"jstype,omitempty"` + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // For Google-internal migration only. Do not use. + Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldOptions) Reset() { *m = FieldOptions{} } +func (m *FieldOptions) String() string { return proto.CompactTextString(m) } +func (*FieldOptions) ProtoMessage() {} +func (*FieldOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{12} +} + +var extRange_FieldOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*FieldOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FieldOptions +} + +func (m *FieldOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldOptions.Unmarshal(m, b) +} +func (m *FieldOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldOptions.Marshal(b, m, deterministic) +} +func (m *FieldOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldOptions.Merge(m, src) +} +func (m *FieldOptions) XXX_Size() int { + return xxx_messageInfo_FieldOptions.Size(m) +} +func (m *FieldOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FieldOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldOptions proto.InternalMessageInfo + +const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING +const Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL +const Default_FieldOptions_Lazy bool = false +const Default_FieldOptions_Deprecated bool = false +const Default_FieldOptions_Weak bool = false + +func (m *FieldOptions) GetCtype() FieldOptions_CType { + if m != nil && m.Ctype != nil { + return *m.Ctype + } + return Default_FieldOptions_Ctype +} + +func (m *FieldOptions) GetPacked() bool { + if m != nil && m.Packed != nil { + return *m.Packed + } + return false +} + +func (m *FieldOptions) GetJstype() FieldOptions_JSType { + if m != nil && m.Jstype != nil { + return *m.Jstype + } + return Default_FieldOptions_Jstype +} + +func (m *FieldOptions) GetLazy() bool { + if m != nil && m.Lazy != nil { + return *m.Lazy + } + return Default_FieldOptions_Lazy +} + +func (m *FieldOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FieldOptions_Deprecated +} + +func (m *FieldOptions) GetWeak() bool { + if m != nil && m.Weak != nil { + return *m.Weak + } + return Default_FieldOptions_Weak +} + +func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type OneofOptions struct { + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OneofOptions) Reset() { *m = OneofOptions{} } +func (m *OneofOptions) String() string { return proto.CompactTextString(m) } +func (*OneofOptions) ProtoMessage() {} +func (*OneofOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{13} +} + +var extRange_OneofOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*OneofOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OneofOptions +} + +func (m *OneofOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofOptions.Unmarshal(m, b) +} +func (m *OneofOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofOptions.Marshal(b, m, deterministic) +} +func (m *OneofOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofOptions.Merge(m, src) +} +func (m *OneofOptions) XXX_Size() int { + return xxx_messageInfo_OneofOptions.Size(m) +} +func (m *OneofOptions) XXX_DiscardUnknown() { + xxx_messageInfo_OneofOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_OneofOptions proto.InternalMessageInfo + +func (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumOptions struct { + // Set this option to true to allow mapping different tag names to the same + // value. + AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"` + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumOptions) Reset() { *m = EnumOptions{} } +func (m *EnumOptions) String() string { return proto.CompactTextString(m) } +func (*EnumOptions) ProtoMessage() {} +func (*EnumOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{14} +} + +var extRange_EnumOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*EnumOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumOptions +} + +func (m *EnumOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumOptions.Unmarshal(m, b) +} +func (m *EnumOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumOptions.Marshal(b, m, deterministic) +} +func (m *EnumOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumOptions.Merge(m, src) +} +func (m *EnumOptions) XXX_Size() int { + return xxx_messageInfo_EnumOptions.Size(m) +} +func (m *EnumOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumOptions proto.InternalMessageInfo + +const Default_EnumOptions_Deprecated bool = false + +func (m *EnumOptions) GetAllowAlias() bool { + if m != nil && m.AllowAlias != nil { + return *m.AllowAlias + } + return false +} + +func (m *EnumOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumOptions_Deprecated +} + +func (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumValueOptions struct { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} } +func (m *EnumValueOptions) String() string { return proto.CompactTextString(m) } +func (*EnumValueOptions) ProtoMessage() {} +func (*EnumValueOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{15} +} + +var extRange_EnumValueOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*EnumValueOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumValueOptions +} + +func (m *EnumValueOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueOptions.Unmarshal(m, b) +} +func (m *EnumValueOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueOptions.Marshal(b, m, deterministic) +} +func (m *EnumValueOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueOptions.Merge(m, src) +} +func (m *EnumValueOptions) XXX_Size() int { + return xxx_messageInfo_EnumValueOptions.Size(m) +} +func (m *EnumValueOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueOptions proto.InternalMessageInfo + +const Default_EnumValueOptions_Deprecated bool = false + +func (m *EnumValueOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumValueOptions_Deprecated +} + +func (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type ServiceOptions struct { + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceOptions) Reset() { *m = ServiceOptions{} } +func (m *ServiceOptions) String() string { return proto.CompactTextString(m) } +func (*ServiceOptions) ProtoMessage() {} +func (*ServiceOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{16} +} + +var extRange_ServiceOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*ServiceOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ServiceOptions +} + +func (m *ServiceOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceOptions.Unmarshal(m, b) +} +func (m *ServiceOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceOptions.Marshal(b, m, deterministic) +} +func (m *ServiceOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceOptions.Merge(m, src) +} +func (m *ServiceOptions) XXX_Size() int { + return xxx_messageInfo_ServiceOptions.Size(m) +} +func (m *ServiceOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceOptions proto.InternalMessageInfo + +const Default_ServiceOptions_Deprecated bool = false + +func (m *ServiceOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_ServiceOptions_Deprecated +} + +func (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MethodOptions struct { + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodOptions) Reset() { *m = MethodOptions{} } +func (m *MethodOptions) String() string { return proto.CompactTextString(m) } +func (*MethodOptions) ProtoMessage() {} +func (*MethodOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{17} +} + +var extRange_MethodOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*MethodOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MethodOptions +} + +func (m *MethodOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodOptions.Unmarshal(m, b) +} +func (m *MethodOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodOptions.Marshal(b, m, deterministic) +} +func (m *MethodOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodOptions.Merge(m, src) +} +func (m *MethodOptions) XXX_Size() int { + return xxx_messageInfo_MethodOptions.Size(m) +} +func (m *MethodOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MethodOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodOptions proto.InternalMessageInfo + +const Default_MethodOptions_Deprecated bool = false +const Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN + +func (m *MethodOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MethodOptions_Deprecated +} + +func (m *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel { + if m != nil && m.IdempotencyLevel != nil { + return *m.IdempotencyLevel + } + return Default_MethodOptions_IdempotencyLevel +} + +func (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +type UninterpretedOption struct { + Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` + PositiveIntValue *uint64 `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"` + NegativeIntValue *int64 `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"` + DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` + StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` + AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} } +func (m *UninterpretedOption) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption) ProtoMessage() {} +func (*UninterpretedOption) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{18} +} + +func (m *UninterpretedOption) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption.Unmarshal(m, b) +} +func (m *UninterpretedOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption.Marshal(b, m, deterministic) +} +func (m *UninterpretedOption) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption.Merge(m, src) +} +func (m *UninterpretedOption) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption.Size(m) +} +func (m *UninterpretedOption) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption proto.InternalMessageInfo + +func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart { + if m != nil { + return m.Name + } + return nil +} + +func (m *UninterpretedOption) GetIdentifierValue() string { + if m != nil && m.IdentifierValue != nil { + return *m.IdentifierValue + } + return "" +} + +func (m *UninterpretedOption) GetPositiveIntValue() uint64 { + if m != nil && m.PositiveIntValue != nil { + return *m.PositiveIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetNegativeIntValue() int64 { + if m != nil && m.NegativeIntValue != nil { + return *m.NegativeIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetDoubleValue() float64 { + if m != nil && m.DoubleValue != nil { + return *m.DoubleValue + } + return 0 +} + +func (m *UninterpretedOption) GetStringValue() []byte { + if m != nil { + return m.StringValue + } + return nil +} + +func (m *UninterpretedOption) GetAggregateValue() string { + if m != nil && m.AggregateValue != nil { + return *m.AggregateValue + } + return "" +} + +// The name of the uninterpreted option. Each string represents a segment in +// a dot-separated name. is_extension is true iff a segment represents an +// extension (denoted with parentheses in options specs in .proto files). +// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents +// "foo.(bar.baz).qux". +type UninterpretedOption_NamePart struct { + NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` + IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption_NamePart) Reset() { *m = UninterpretedOption_NamePart{} } +func (m *UninterpretedOption_NamePart) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption_NamePart) ProtoMessage() {} +func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{18, 0} +} + +func (m *UninterpretedOption_NamePart) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption_NamePart.Unmarshal(m, b) +} +func (m *UninterpretedOption_NamePart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption_NamePart.Marshal(b, m, deterministic) +} +func (m *UninterpretedOption_NamePart) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption_NamePart.Merge(m, src) +} +func (m *UninterpretedOption_NamePart) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption_NamePart.Size(m) +} +func (m *UninterpretedOption_NamePart) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption_NamePart.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption_NamePart proto.InternalMessageInfo + +func (m *UninterpretedOption_NamePart) GetNamePart() string { + if m != nil && m.NamePart != nil { + return *m.NamePart + } + return "" +} + +func (m *UninterpretedOption_NamePart) GetIsExtension() bool { + if m != nil && m.IsExtension != nil { + return *m.IsExtension + } + return false +} + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +type SourceCodeInfo struct { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} } +func (m *SourceCodeInfo) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo) ProtoMessage() {} +func (*SourceCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{19} +} + +func (m *SourceCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo.Unmarshal(m, b) +} +func (m *SourceCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo.Marshal(b, m, deterministic) +} +func (m *SourceCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo.Merge(m, src) +} +func (m *SourceCodeInfo) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo.Size(m) +} +func (m *SourceCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceCodeInfo proto.InternalMessageInfo + +func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { + if m != nil { + return m.Location + } + return nil +} + +type SourceCodeInfo_Location struct { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + Span []int32 `protobuf:"varint,2,rep,packed,name=span" json:"span,omitempty"` + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to qux or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` + TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` + LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} } +func (m *SourceCodeInfo_Location) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo_Location) ProtoMessage() {} +func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{19, 0} +} + +func (m *SourceCodeInfo_Location) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo_Location.Unmarshal(m, b) +} +func (m *SourceCodeInfo_Location) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo_Location.Marshal(b, m, deterministic) +} +func (m *SourceCodeInfo_Location) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo_Location.Merge(m, src) +} +func (m *SourceCodeInfo_Location) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo_Location.Size(m) +} +func (m *SourceCodeInfo_Location) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo_Location.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceCodeInfo_Location proto.InternalMessageInfo + +func (m *SourceCodeInfo_Location) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *SourceCodeInfo_Location) GetSpan() []int32 { + if m != nil { + return m.Span + } + return nil +} + +func (m *SourceCodeInfo_Location) GetLeadingComments() string { + if m != nil && m.LeadingComments != nil { + return *m.LeadingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetTrailingComments() string { + if m != nil && m.TrailingComments != nil { + return *m.TrailingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string { + if m != nil { + return m.LeadingDetachedComments + } + return nil +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +type GeneratedCodeInfo struct { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GeneratedCodeInfo) Reset() { *m = GeneratedCodeInfo{} } +func (m *GeneratedCodeInfo) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo) ProtoMessage() {} +func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{20} +} + +func (m *GeneratedCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GeneratedCodeInfo.Unmarshal(m, b) +} +func (m *GeneratedCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GeneratedCodeInfo.Marshal(b, m, deterministic) +} +func (m *GeneratedCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneratedCodeInfo.Merge(m, src) +} +func (m *GeneratedCodeInfo) XXX_Size() int { + return xxx_messageInfo_GeneratedCodeInfo.Size(m) +} +func (m *GeneratedCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_GeneratedCodeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_GeneratedCodeInfo proto.InternalMessageInfo + +func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { + if m != nil { + return m.Annotation + } + return nil +} + +type GeneratedCodeInfo_Annotation struct { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Identifies the filesystem path to the original source .proto. + SourceFile *string `protobuf:"bytes,2,opt,name=source_file,json=sourceFile" json:"source_file,omitempty"` + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"` + // Identifies the ending offset in bytes in the generated code that + // relates to the identified offset. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GeneratedCodeInfo_Annotation) Reset() { *m = GeneratedCodeInfo_Annotation{} } +func (m *GeneratedCodeInfo_Annotation) String() string { return proto.CompactTextString(m) } +func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} +func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) { + return fileDescriptor_e5baabe45344a177, []int{20, 0} +} + +func (m *GeneratedCodeInfo_Annotation) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Unmarshal(m, b) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Marshal(b, m, deterministic) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneratedCodeInfo_Annotation.Merge(m, src) +} +func (m *GeneratedCodeInfo_Annotation) XXX_Size() int { + return xxx_messageInfo_GeneratedCodeInfo_Annotation.Size(m) +} +func (m *GeneratedCodeInfo_Annotation) XXX_DiscardUnknown() { + xxx_messageInfo_GeneratedCodeInfo_Annotation.DiscardUnknown(m) +} + +var xxx_messageInfo_GeneratedCodeInfo_Annotation proto.InternalMessageInfo + +func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *GeneratedCodeInfo_Annotation) GetSourceFile() string { + if m != nil && m.SourceFile != nil { + return *m.SourceFile + } + return "" +} + +func (m *GeneratedCodeInfo_Annotation) GetBegin() int32 { + if m != nil && m.Begin != nil { + return *m.Begin + } + return 0 +} + +func (m *GeneratedCodeInfo_Annotation) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func init() { + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value) + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value) + proto.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value) + proto.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value) + proto.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value) + proto.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value) + proto.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet") + proto.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto") + proto.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto") + proto.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange") + proto.RegisterType((*DescriptorProto_ReservedRange)(nil), "google.protobuf.DescriptorProto.ReservedRange") + proto.RegisterType((*ExtensionRangeOptions)(nil), "google.protobuf.ExtensionRangeOptions") + proto.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto") + proto.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto") + proto.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto") + proto.RegisterType((*EnumDescriptorProto_EnumReservedRange)(nil), "google.protobuf.EnumDescriptorProto.EnumReservedRange") + proto.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto") + proto.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto") + proto.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto") + proto.RegisterType((*FileOptions)(nil), "google.protobuf.FileOptions") + proto.RegisterType((*MessageOptions)(nil), "google.protobuf.MessageOptions") + proto.RegisterType((*FieldOptions)(nil), "google.protobuf.FieldOptions") + proto.RegisterType((*OneofOptions)(nil), "google.protobuf.OneofOptions") + proto.RegisterType((*EnumOptions)(nil), "google.protobuf.EnumOptions") + proto.RegisterType((*EnumValueOptions)(nil), "google.protobuf.EnumValueOptions") + proto.RegisterType((*ServiceOptions)(nil), "google.protobuf.ServiceOptions") + proto.RegisterType((*MethodOptions)(nil), "google.protobuf.MethodOptions") + proto.RegisterType((*UninterpretedOption)(nil), "google.protobuf.UninterpretedOption") + proto.RegisterType((*UninterpretedOption_NamePart)(nil), "google.protobuf.UninterpretedOption.NamePart") + proto.RegisterType((*SourceCodeInfo)(nil), "google.protobuf.SourceCodeInfo") + proto.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location") + proto.RegisterType((*GeneratedCodeInfo)(nil), "google.protobuf.GeneratedCodeInfo") + proto.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation") +} + +func init() { proto.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor_e5baabe45344a177) } + +var fileDescriptor_e5baabe45344a177 = []byte{ + // 2589 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xdd, 0x8e, 0xdb, 0xc6, + 0x15, 0x0e, 0xf5, 0xb7, 0xd2, 0x91, 0x56, 0x3b, 0x3b, 0xbb, 0xb1, 0xe9, 0xcd, 0x8f, 0xd7, 0xca, + 0x8f, 0xd7, 0x4e, 0xac, 0x0d, 0x1c, 0xdb, 0x71, 0xd6, 0x45, 0x5a, 0xad, 0x44, 0x6f, 0xe4, 0xee, + 0x4a, 0x2a, 0xa5, 0x6d, 0x7e, 0x80, 0x82, 0x98, 0x25, 0x47, 0x12, 0x6d, 0x8a, 0x64, 0x48, 0xca, + 0xf6, 0x06, 0xbd, 0x30, 0xd0, 0xab, 0x5e, 0x15, 0xe8, 0x55, 0x51, 0x14, 0xbd, 0xe8, 0x4d, 0x80, + 0x3e, 0x40, 0x81, 0xde, 0xf5, 0x09, 0x0a, 0xe4, 0x0d, 0x8a, 0xb6, 0x40, 0xfb, 0x08, 0xbd, 0x2c, + 0x66, 0x86, 0xa4, 0x48, 0x49, 0x1b, 0x6f, 0x02, 0xc4, 0xb9, 0x92, 0xe6, 0x3b, 0xdf, 0x39, 0x73, + 0xe6, 0xcc, 0x99, 0x99, 0x33, 0x43, 0xd8, 0x1e, 0x39, 0xce, 0xc8, 0xa2, 0xbb, 0xae, 0xe7, 0x04, + 0xce, 0xc9, 0x74, 0xb8, 0x6b, 0x50, 0x5f, 0xf7, 0x4c, 0x37, 0x70, 0xbc, 0x3a, 0xc7, 0xf0, 0x9a, + 0x60, 0xd4, 0x23, 0x46, 0xed, 0x08, 0xd6, 0xef, 0x9b, 0x16, 0x6d, 0xc5, 0xc4, 0x3e, 0x0d, 0xf0, + 0x5d, 0xc8, 0x0d, 0x4d, 0x8b, 0xca, 0xd2, 0x76, 0x76, 0xa7, 0x7c, 0xf3, 0xcd, 0xfa, 0x9c, 0x52, + 0x3d, 0xad, 0xd1, 0x63, 0xb0, 0xca, 0x35, 0x6a, 0xff, 0xce, 0xc1, 0xc6, 0x12, 0x29, 0xc6, 0x90, + 0xb3, 0xc9, 0x84, 0x59, 0x94, 0x76, 0x4a, 0x2a, 0xff, 0x8f, 0x65, 0x58, 0x71, 0x89, 0xfe, 0x88, + 0x8c, 0xa8, 0x9c, 0xe1, 0x70, 0xd4, 0xc4, 0xaf, 0x03, 0x18, 0xd4, 0xa5, 0xb6, 0x41, 0x6d, 0xfd, + 0x54, 0xce, 0x6e, 0x67, 0x77, 0x4a, 0x6a, 0x02, 0xc1, 0xef, 0xc0, 0xba, 0x3b, 0x3d, 0xb1, 0x4c, + 0x5d, 0x4b, 0xd0, 0x60, 0x3b, 0xbb, 0x93, 0x57, 0x91, 0x10, 0xb4, 0x66, 0xe4, 0xab, 0xb0, 0xf6, + 0x84, 0x92, 0x47, 0x49, 0x6a, 0x99, 0x53, 0xab, 0x0c, 0x4e, 0x10, 0x9b, 0x50, 0x99, 0x50, 0xdf, + 0x27, 0x23, 0xaa, 0x05, 0xa7, 0x2e, 0x95, 0x73, 0x7c, 0xf4, 0xdb, 0x0b, 0xa3, 0x9f, 0x1f, 0x79, + 0x39, 0xd4, 0x1a, 0x9c, 0xba, 0x14, 0x37, 0xa0, 0x44, 0xed, 0xe9, 0x44, 0x58, 0xc8, 0x9f, 0x11, + 0x3f, 0xc5, 0x9e, 0x4e, 0xe6, 0xad, 0x14, 0x99, 0x5a, 0x68, 0x62, 0xc5, 0xa7, 0xde, 0x63, 0x53, + 0xa7, 0x72, 0x81, 0x1b, 0xb8, 0xba, 0x60, 0xa0, 0x2f, 0xe4, 0xf3, 0x36, 0x22, 0x3d, 0xdc, 0x84, + 0x12, 0x7d, 0x1a, 0x50, 0xdb, 0x37, 0x1d, 0x5b, 0x5e, 0xe1, 0x46, 0xde, 0x5a, 0x32, 0x8b, 0xd4, + 0x32, 0xe6, 0x4d, 0xcc, 0xf4, 0xf0, 0x1d, 0x58, 0x71, 0xdc, 0xc0, 0x74, 0x6c, 0x5f, 0x2e, 0x6e, + 0x4b, 0x3b, 0xe5, 0x9b, 0xaf, 0x2e, 0x4d, 0x84, 0xae, 0xe0, 0xa8, 0x11, 0x19, 0xb7, 0x01, 0xf9, + 0xce, 0xd4, 0xd3, 0xa9, 0xa6, 0x3b, 0x06, 0xd5, 0x4c, 0x7b, 0xe8, 0xc8, 0x25, 0x6e, 0xe0, 0xf2, + 0xe2, 0x40, 0x38, 0xb1, 0xe9, 0x18, 0xb4, 0x6d, 0x0f, 0x1d, 0xb5, 0xea, 0xa7, 0xda, 0xf8, 0x02, + 0x14, 0xfc, 0x53, 0x3b, 0x20, 0x4f, 0xe5, 0x0a, 0xcf, 0x90, 0xb0, 0x55, 0xfb, 0x6b, 0x01, 0xd6, + 0xce, 0x93, 0x62, 0xf7, 0x20, 0x3f, 0x64, 0xa3, 0x94, 0x33, 0xdf, 0x26, 0x06, 0x42, 0x27, 0x1d, + 0xc4, 0xc2, 0x77, 0x0c, 0x62, 0x03, 0xca, 0x36, 0xf5, 0x03, 0x6a, 0x88, 0x8c, 0xc8, 0x9e, 0x33, + 0xa7, 0x40, 0x28, 0x2d, 0xa6, 0x54, 0xee, 0x3b, 0xa5, 0xd4, 0xa7, 0xb0, 0x16, 0xbb, 0xa4, 0x79, + 0xc4, 0x1e, 0x45, 0xb9, 0xb9, 0xfb, 0x3c, 0x4f, 0xea, 0x4a, 0xa4, 0xa7, 0x32, 0x35, 0xb5, 0x4a, + 0x53, 0x6d, 0xdc, 0x02, 0x70, 0x6c, 0xea, 0x0c, 0x35, 0x83, 0xea, 0x96, 0x5c, 0x3c, 0x23, 0x4a, + 0x5d, 0x46, 0x59, 0x88, 0x92, 0x23, 0x50, 0xdd, 0xc2, 0x1f, 0xce, 0x52, 0x6d, 0xe5, 0x8c, 0x4c, + 0x39, 0x12, 0x8b, 0x6c, 0x21, 0xdb, 0x8e, 0xa1, 0xea, 0x51, 0x96, 0xf7, 0xd4, 0x08, 0x47, 0x56, + 0xe2, 0x4e, 0xd4, 0x9f, 0x3b, 0x32, 0x35, 0x54, 0x13, 0x03, 0x5b, 0xf5, 0x92, 0x4d, 0xfc, 0x06, + 0xc4, 0x80, 0xc6, 0xd3, 0x0a, 0xf8, 0x2e, 0x54, 0x89, 0xc0, 0x0e, 0x99, 0xd0, 0xad, 0x2f, 0xa1, + 0x9a, 0x0e, 0x0f, 0xde, 0x84, 0xbc, 0x1f, 0x10, 0x2f, 0xe0, 0x59, 0x98, 0x57, 0x45, 0x03, 0x23, + 0xc8, 0x52, 0xdb, 0xe0, 0xbb, 0x5c, 0x5e, 0x65, 0x7f, 0xf1, 0x4f, 0x66, 0x03, 0xce, 0xf2, 0x01, + 0xbf, 0xbd, 0x38, 0xa3, 0x29, 0xcb, 0xf3, 0xe3, 0xde, 0xfa, 0x00, 0x56, 0x53, 0x03, 0x38, 0x6f, + 0xd7, 0xb5, 0x5f, 0xc2, 0xcb, 0x4b, 0x4d, 0xe3, 0x4f, 0x61, 0x73, 0x6a, 0x9b, 0x76, 0x40, 0x3d, + 0xd7, 0xa3, 0x2c, 0x63, 0x45, 0x57, 0xf2, 0x7f, 0x56, 0xce, 0xc8, 0xb9, 0xe3, 0x24, 0x5b, 0x58, + 0x51, 0x37, 0xa6, 0x8b, 0xe0, 0xf5, 0x52, 0xf1, 0xbf, 0x2b, 0xe8, 0xd9, 0xb3, 0x67, 0xcf, 0x32, + 0xb5, 0xdf, 0x15, 0x60, 0x73, 0xd9, 0x9a, 0x59, 0xba, 0x7c, 0x2f, 0x40, 0xc1, 0x9e, 0x4e, 0x4e, + 0xa8, 0xc7, 0x83, 0x94, 0x57, 0xc3, 0x16, 0x6e, 0x40, 0xde, 0x22, 0x27, 0xd4, 0x92, 0x73, 0xdb, + 0xd2, 0x4e, 0xf5, 0xe6, 0x3b, 0xe7, 0x5a, 0x95, 0xf5, 0x43, 0xa6, 0xa2, 0x0a, 0x4d, 0xfc, 0x11, + 0xe4, 0xc2, 0x2d, 0x9a, 0x59, 0xb8, 0x7e, 0x3e, 0x0b, 0x6c, 0x2d, 0xa9, 0x5c, 0x0f, 0xbf, 0x02, + 0x25, 0xf6, 0x2b, 0x72, 0xa3, 0xc0, 0x7d, 0x2e, 0x32, 0x80, 0xe5, 0x05, 0xde, 0x82, 0x22, 0x5f, + 0x26, 0x06, 0x8d, 0x8e, 0xb6, 0xb8, 0xcd, 0x12, 0xcb, 0xa0, 0x43, 0x32, 0xb5, 0x02, 0xed, 0x31, + 0xb1, 0xa6, 0x94, 0x27, 0x7c, 0x49, 0xad, 0x84, 0xe0, 0xcf, 0x19, 0x86, 0x2f, 0x43, 0x59, 0xac, + 0x2a, 0xd3, 0x36, 0xe8, 0x53, 0xbe, 0x7b, 0xe6, 0x55, 0xb1, 0xd0, 0xda, 0x0c, 0x61, 0xdd, 0x3f, + 0xf4, 0x1d, 0x3b, 0x4a, 0x4d, 0xde, 0x05, 0x03, 0x78, 0xf7, 0x1f, 0xcc, 0x6f, 0xdc, 0xaf, 0x2d, + 0x1f, 0xde, 0x7c, 0x4e, 0xd5, 0xfe, 0x92, 0x81, 0x1c, 0xdf, 0x2f, 0xd6, 0xa0, 0x3c, 0xf8, 0xac, + 0xa7, 0x68, 0xad, 0xee, 0xf1, 0xfe, 0xa1, 0x82, 0x24, 0x5c, 0x05, 0xe0, 0xc0, 0xfd, 0xc3, 0x6e, + 0x63, 0x80, 0x32, 0x71, 0xbb, 0xdd, 0x19, 0xdc, 0xb9, 0x85, 0xb2, 0xb1, 0xc2, 0xb1, 0x00, 0x72, + 0x49, 0xc2, 0xfb, 0x37, 0x51, 0x1e, 0x23, 0xa8, 0x08, 0x03, 0xed, 0x4f, 0x95, 0xd6, 0x9d, 0x5b, + 0xa8, 0x90, 0x46, 0xde, 0xbf, 0x89, 0x56, 0xf0, 0x2a, 0x94, 0x38, 0xb2, 0xdf, 0xed, 0x1e, 0xa2, + 0x62, 0x6c, 0xb3, 0x3f, 0x50, 0xdb, 0x9d, 0x03, 0x54, 0x8a, 0x6d, 0x1e, 0xa8, 0xdd, 0xe3, 0x1e, + 0x82, 0xd8, 0xc2, 0x91, 0xd2, 0xef, 0x37, 0x0e, 0x14, 0x54, 0x8e, 0x19, 0xfb, 0x9f, 0x0d, 0x94, + 0x3e, 0xaa, 0xa4, 0xdc, 0x7a, 0xff, 0x26, 0x5a, 0x8d, 0xbb, 0x50, 0x3a, 0xc7, 0x47, 0xa8, 0x8a, + 0xd7, 0x61, 0x55, 0x74, 0x11, 0x39, 0xb1, 0x36, 0x07, 0xdd, 0xb9, 0x85, 0xd0, 0xcc, 0x11, 0x61, + 0x65, 0x3d, 0x05, 0xdc, 0xb9, 0x85, 0x70, 0xad, 0x09, 0x79, 0x9e, 0x5d, 0x18, 0x43, 0xf5, 0xb0, + 0xb1, 0xaf, 0x1c, 0x6a, 0xdd, 0xde, 0xa0, 0xdd, 0xed, 0x34, 0x0e, 0x91, 0x34, 0xc3, 0x54, 0xe5, + 0x67, 0xc7, 0x6d, 0x55, 0x69, 0xa1, 0x4c, 0x12, 0xeb, 0x29, 0x8d, 0x81, 0xd2, 0x42, 0xd9, 0x9a, + 0x0e, 0x9b, 0xcb, 0xf6, 0xc9, 0xa5, 0x2b, 0x23, 0x31, 0xc5, 0x99, 0x33, 0xa6, 0x98, 0xdb, 0x5a, + 0x98, 0xe2, 0x7f, 0x65, 0x60, 0x63, 0xc9, 0x59, 0xb1, 0xb4, 0x93, 0x1f, 0x43, 0x5e, 0xa4, 0xa8, + 0x38, 0x3d, 0xaf, 0x2d, 0x3d, 0x74, 0x78, 0xc2, 0x2e, 0x9c, 0xa0, 0x5c, 0x2f, 0x59, 0x41, 0x64, + 0xcf, 0xa8, 0x20, 0x98, 0x89, 0x85, 0x3d, 0xfd, 0x17, 0x0b, 0x7b, 0xba, 0x38, 0xf6, 0xee, 0x9c, + 0xe7, 0xd8, 0xe3, 0xd8, 0xb7, 0xdb, 0xdb, 0xf3, 0x4b, 0xf6, 0xf6, 0x7b, 0xb0, 0xbe, 0x60, 0xe8, + 0xdc, 0x7b, 0xec, 0xaf, 0x24, 0x90, 0xcf, 0x0a, 0xce, 0x73, 0x76, 0xba, 0x4c, 0x6a, 0xa7, 0xbb, + 0x37, 0x1f, 0xc1, 0x2b, 0x67, 0x4f, 0xc2, 0xc2, 0x5c, 0x7f, 0x25, 0xc1, 0x85, 0xe5, 0x95, 0xe2, + 0x52, 0x1f, 0x3e, 0x82, 0xc2, 0x84, 0x06, 0x63, 0x27, 0xaa, 0x96, 0xde, 0x5e, 0x72, 0x06, 0x33, + 0xf1, 0xfc, 0x64, 0x87, 0x5a, 0xc9, 0x43, 0x3c, 0x7b, 0x56, 0xb9, 0x27, 0xbc, 0x59, 0xf0, 0xf4, + 0xd7, 0x19, 0x78, 0x79, 0xa9, 0xf1, 0xa5, 0x8e, 0xbe, 0x06, 0x60, 0xda, 0xee, 0x34, 0x10, 0x15, + 0x91, 0xd8, 0x60, 0x4b, 0x1c, 0xe1, 0x9b, 0x17, 0xdb, 0x3c, 0xa7, 0x41, 0x2c, 0xcf, 0x72, 0x39, + 0x08, 0x88, 0x13, 0xee, 0xce, 0x1c, 0xcd, 0x71, 0x47, 0x5f, 0x3f, 0x63, 0xa4, 0x0b, 0x89, 0xf9, + 0x1e, 0x20, 0xdd, 0x32, 0xa9, 0x1d, 0x68, 0x7e, 0xe0, 0x51, 0x32, 0x31, 0xed, 0x11, 0x3f, 0x41, + 0x8a, 0x7b, 0xf9, 0x21, 0xb1, 0x7c, 0xaa, 0xae, 0x09, 0x71, 0x3f, 0x92, 0x32, 0x0d, 0x9e, 0x40, + 0x5e, 0x42, 0xa3, 0x90, 0xd2, 0x10, 0xe2, 0x58, 0xa3, 0xf6, 0xdb, 0x12, 0x94, 0x13, 0x75, 0x35, + 0xbe, 0x02, 0x95, 0x87, 0xe4, 0x31, 0xd1, 0xa2, 0xbb, 0x92, 0x88, 0x44, 0x99, 0x61, 0xbd, 0xf0, + 0xbe, 0xf4, 0x1e, 0x6c, 0x72, 0x8a, 0x33, 0x0d, 0xa8, 0xa7, 0xe9, 0x16, 0xf1, 0x7d, 0x1e, 0xb4, + 0x22, 0xa7, 0x62, 0x26, 0xeb, 0x32, 0x51, 0x33, 0x92, 0xe0, 0xdb, 0xb0, 0xc1, 0x35, 0x26, 0x53, + 0x2b, 0x30, 0x5d, 0x8b, 0x6a, 0xec, 0xf6, 0xe6, 0xf3, 0x93, 0x24, 0xf6, 0x6c, 0x9d, 0x31, 0x8e, + 0x42, 0x02, 0xf3, 0xc8, 0xc7, 0x2d, 0x78, 0x8d, 0xab, 0x8d, 0xa8, 0x4d, 0x3d, 0x12, 0x50, 0x8d, + 0x7e, 0x31, 0x25, 0x96, 0xaf, 0x11, 0xdb, 0xd0, 0xc6, 0xc4, 0x1f, 0xcb, 0x9b, 0xcc, 0xc0, 0x7e, + 0x46, 0x96, 0xd4, 0x4b, 0x8c, 0x78, 0x10, 0xf2, 0x14, 0x4e, 0x6b, 0xd8, 0xc6, 0xc7, 0xc4, 0x1f, + 0xe3, 0x3d, 0xb8, 0xc0, 0xad, 0xf8, 0x81, 0x67, 0xda, 0x23, 0x4d, 0x1f, 0x53, 0xfd, 0x91, 0x36, + 0x0d, 0x86, 0x77, 0xe5, 0x57, 0x92, 0xfd, 0x73, 0x0f, 0xfb, 0x9c, 0xd3, 0x64, 0x94, 0xe3, 0x60, + 0x78, 0x17, 0xf7, 0xa1, 0xc2, 0x26, 0x63, 0x62, 0x7e, 0x49, 0xb5, 0xa1, 0xe3, 0xf1, 0xa3, 0xb1, + 0xba, 0x64, 0x6b, 0x4a, 0x44, 0xb0, 0xde, 0x0d, 0x15, 0x8e, 0x1c, 0x83, 0xee, 0xe5, 0xfb, 0x3d, + 0x45, 0x69, 0xa9, 0xe5, 0xc8, 0xca, 0x7d, 0xc7, 0x63, 0x09, 0x35, 0x72, 0xe2, 0x00, 0x97, 0x45, + 0x42, 0x8d, 0x9c, 0x28, 0xbc, 0xb7, 0x61, 0x43, 0xd7, 0xc5, 0x98, 0x4d, 0x5d, 0x0b, 0xef, 0x58, + 0xbe, 0x8c, 0x52, 0xc1, 0xd2, 0xf5, 0x03, 0x41, 0x08, 0x73, 0xdc, 0xc7, 0x1f, 0xc2, 0xcb, 0xb3, + 0x60, 0x25, 0x15, 0xd7, 0x17, 0x46, 0x39, 0xaf, 0x7a, 0x1b, 0x36, 0xdc, 0xd3, 0x45, 0x45, 0x9c, + 0xea, 0xd1, 0x3d, 0x9d, 0x57, 0xfb, 0x00, 0x36, 0xdd, 0xb1, 0xbb, 0xa8, 0x77, 0x3d, 0xa9, 0x87, + 0xdd, 0xb1, 0x3b, 0xaf, 0xf8, 0x16, 0xbf, 0x70, 0x7b, 0x54, 0x27, 0x01, 0x35, 0xe4, 0x8b, 0x49, + 0x7a, 0x42, 0x80, 0x77, 0x01, 0xe9, 0xba, 0x46, 0x6d, 0x72, 0x62, 0x51, 0x8d, 0x78, 0xd4, 0x26, + 0xbe, 0x7c, 0x39, 0x49, 0xae, 0xea, 0xba, 0xc2, 0xa5, 0x0d, 0x2e, 0xc4, 0xd7, 0x61, 0xdd, 0x39, + 0x79, 0xa8, 0x8b, 0x94, 0xd4, 0x5c, 0x8f, 0x0e, 0xcd, 0xa7, 0xf2, 0x9b, 0x3c, 0xbe, 0x6b, 0x4c, + 0xc0, 0x13, 0xb2, 0xc7, 0x61, 0x7c, 0x0d, 0x90, 0xee, 0x8f, 0x89, 0xe7, 0xf2, 0x3d, 0xd9, 0x77, + 0x89, 0x4e, 0xe5, 0xb7, 0x04, 0x55, 0xe0, 0x9d, 0x08, 0x66, 0x4b, 0xc2, 0x7f, 0x62, 0x0e, 0x83, + 0xc8, 0xe2, 0x55, 0xb1, 0x24, 0x38, 0x16, 0x5a, 0xdb, 0x01, 0xc4, 0x42, 0x91, 0xea, 0x78, 0x87, + 0xd3, 0xaa, 0xee, 0xd8, 0x4d, 0xf6, 0xfb, 0x06, 0xac, 0x32, 0xe6, 0xac, 0xd3, 0x6b, 0xa2, 0x20, + 0x73, 0xc7, 0x89, 0x1e, 0x6f, 0xc1, 0x05, 0x46, 0x9a, 0xd0, 0x80, 0x18, 0x24, 0x20, 0x09, 0xf6, + 0xbb, 0x9c, 0xcd, 0xe2, 0x7e, 0x14, 0x0a, 0x53, 0x7e, 0x7a, 0xd3, 0x93, 0xd3, 0x38, 0xb3, 0x6e, + 0x08, 0x3f, 0x19, 0x16, 0xe5, 0xd6, 0xf7, 0x56, 0x74, 0xd7, 0xf6, 0xa0, 0x92, 0x4c, 0x7c, 0x5c, + 0x02, 0x91, 0xfa, 0x48, 0x62, 0x55, 0x50, 0xb3, 0xdb, 0x62, 0xf5, 0xcb, 0xe7, 0x0a, 0xca, 0xb0, + 0x3a, 0xea, 0xb0, 0x3d, 0x50, 0x34, 0xf5, 0xb8, 0x33, 0x68, 0x1f, 0x29, 0x28, 0x9b, 0x28, 0xd8, + 0x1f, 0xe4, 0x8a, 0x6f, 0xa3, 0xab, 0xb5, 0xaf, 0x33, 0x50, 0x4d, 0xdf, 0xc0, 0xf0, 0x8f, 0xe0, + 0x62, 0xf4, 0x5c, 0xe2, 0xd3, 0x40, 0x7b, 0x62, 0x7a, 0x7c, 0x45, 0x4e, 0x88, 0x38, 0x1d, 0xe3, + 0x9c, 0xd8, 0x0c, 0x59, 0x7d, 0x1a, 0x7c, 0x62, 0x7a, 0x6c, 0xbd, 0x4d, 0x48, 0x80, 0x0f, 0xe1, + 0xb2, 0xed, 0x68, 0x7e, 0x40, 0x6c, 0x83, 0x78, 0x86, 0x36, 0x7b, 0xa8, 0xd2, 0x88, 0xae, 0x53, + 0xdf, 0x77, 0xc4, 0x49, 0x18, 0x5b, 0x79, 0xd5, 0x76, 0xfa, 0x21, 0x79, 0x76, 0x44, 0x34, 0x42, + 0xea, 0x5c, 0xfe, 0x66, 0xcf, 0xca, 0xdf, 0x57, 0xa0, 0x34, 0x21, 0xae, 0x46, 0xed, 0xc0, 0x3b, + 0xe5, 0x75, 0x77, 0x51, 0x2d, 0x4e, 0x88, 0xab, 0xb0, 0xf6, 0x0b, 0xb9, 0xfe, 0x3c, 0xc8, 0x15, + 0x8b, 0xa8, 0xf4, 0x20, 0x57, 0x2c, 0x21, 0xa8, 0xfd, 0x33, 0x0b, 0x95, 0x64, 0x1d, 0xce, 0xae, + 0x35, 0x3a, 0x3f, 0xb2, 0x24, 0xbe, 0xa9, 0xbd, 0xf1, 0x8d, 0x55, 0x7b, 0xbd, 0xc9, 0xce, 0xb2, + 0xbd, 0x82, 0xa8, 0x8e, 0x55, 0xa1, 0xc9, 0xea, 0x08, 0x96, 0x6c, 0x54, 0x54, 0x23, 0x45, 0x35, + 0x6c, 0xe1, 0x03, 0x28, 0x3c, 0xf4, 0xb9, 0xed, 0x02, 0xb7, 0xfd, 0xe6, 0x37, 0xdb, 0x7e, 0xd0, + 0xe7, 0xc6, 0x4b, 0x0f, 0xfa, 0x5a, 0xa7, 0xab, 0x1e, 0x35, 0x0e, 0xd5, 0x50, 0x1d, 0x5f, 0x82, + 0x9c, 0x45, 0xbe, 0x3c, 0x4d, 0x9f, 0x7a, 0x1c, 0x3a, 0xef, 0x24, 0x5c, 0x82, 0xdc, 0x13, 0x4a, + 0x1e, 0xa5, 0xcf, 0x1a, 0x0e, 0x7d, 0x8f, 0x8b, 0x61, 0x17, 0xf2, 0x3c, 0x5e, 0x18, 0x20, 0x8c, + 0x18, 0x7a, 0x09, 0x17, 0x21, 0xd7, 0xec, 0xaa, 0x6c, 0x41, 0x20, 0xa8, 0x08, 0x54, 0xeb, 0xb5, + 0x95, 0xa6, 0x82, 0x32, 0xb5, 0xdb, 0x50, 0x10, 0x41, 0x60, 0x8b, 0x25, 0x0e, 0x03, 0x7a, 0x29, + 0x6c, 0x86, 0x36, 0xa4, 0x48, 0x7a, 0x7c, 0xb4, 0xaf, 0xa8, 0x28, 0x93, 0x9e, 0xea, 0x1c, 0xca, + 0xd7, 0x7c, 0xa8, 0x24, 0x0b, 0xf1, 0x17, 0x73, 0xc9, 0xfe, 0x9b, 0x04, 0xe5, 0x44, 0x61, 0xcd, + 0x2a, 0x22, 0x62, 0x59, 0xce, 0x13, 0x8d, 0x58, 0x26, 0xf1, 0xc3, 0xd4, 0x00, 0x0e, 0x35, 0x18, + 0x72, 0xde, 0xa9, 0x7b, 0x41, 0x4b, 0x24, 0x8f, 0x0a, 0xb5, 0x3f, 0x4a, 0x80, 0xe6, 0x2b, 0xdb, + 0x39, 0x37, 0xa5, 0x1f, 0xd2, 0xcd, 0xda, 0x1f, 0x24, 0xa8, 0xa6, 0xcb, 0xd9, 0x39, 0xf7, 0xae, + 0xfc, 0xa0, 0xee, 0xfd, 0x23, 0x03, 0xab, 0xa9, 0x22, 0xf6, 0xbc, 0xde, 0x7d, 0x01, 0xeb, 0xa6, + 0x41, 0x27, 0xae, 0x13, 0x50, 0x5b, 0x3f, 0xd5, 0x2c, 0xfa, 0x98, 0x5a, 0x72, 0x8d, 0x6f, 0x1a, + 0xbb, 0xdf, 0x5c, 0x26, 0xd7, 0xdb, 0x33, 0xbd, 0x43, 0xa6, 0xb6, 0xb7, 0xd1, 0x6e, 0x29, 0x47, + 0xbd, 0xee, 0x40, 0xe9, 0x34, 0x3f, 0xd3, 0x8e, 0x3b, 0x3f, 0xed, 0x74, 0x3f, 0xe9, 0xa8, 0xc8, + 0x9c, 0xa3, 0x7d, 0x8f, 0xcb, 0xbe, 0x07, 0x68, 0xde, 0x29, 0x7c, 0x11, 0x96, 0xb9, 0x85, 0x5e, + 0xc2, 0x1b, 0xb0, 0xd6, 0xe9, 0x6a, 0xfd, 0x76, 0x4b, 0xd1, 0x94, 0xfb, 0xf7, 0x95, 0xe6, 0xa0, + 0x2f, 0x1e, 0x3e, 0x62, 0xf6, 0x20, 0xb5, 0xc0, 0x6b, 0xbf, 0xcf, 0xc2, 0xc6, 0x12, 0x4f, 0x70, + 0x23, 0xbc, 0xb2, 0x88, 0x5b, 0xd4, 0x8d, 0xf3, 0x78, 0x5f, 0x67, 0x35, 0x43, 0x8f, 0x78, 0x41, + 0x78, 0xc3, 0xb9, 0x06, 0x2c, 0x4a, 0x76, 0x60, 0x0e, 0x4d, 0xea, 0x85, 0xef, 0x44, 0xe2, 0x1e, + 0xb3, 0x36, 0xc3, 0xc5, 0x53, 0xd1, 0xbb, 0x80, 0x5d, 0xc7, 0x37, 0x03, 0xf3, 0x31, 0xd5, 0x4c, + 0x3b, 0x7a, 0x54, 0x62, 0xf7, 0x9a, 0x9c, 0x8a, 0x22, 0x49, 0xdb, 0x0e, 0x62, 0xb6, 0x4d, 0x47, + 0x64, 0x8e, 0xcd, 0x36, 0xf3, 0xac, 0x8a, 0x22, 0x49, 0xcc, 0xbe, 0x02, 0x15, 0xc3, 0x99, 0xb2, + 0x62, 0x4f, 0xf0, 0xd8, 0xd9, 0x21, 0xa9, 0x65, 0x81, 0xc5, 0x94, 0xb0, 0x8c, 0x9f, 0xbd, 0x66, + 0x55, 0xd4, 0xb2, 0xc0, 0x04, 0xe5, 0x2a, 0xac, 0x91, 0xd1, 0xc8, 0x63, 0xc6, 0x23, 0x43, 0xe2, + 0x62, 0x52, 0x8d, 0x61, 0x4e, 0xdc, 0x7a, 0x00, 0xc5, 0x28, 0x0e, 0xec, 0xa8, 0x66, 0x91, 0xd0, + 0x5c, 0x71, 0xdb, 0xce, 0xec, 0x94, 0xd4, 0xa2, 0x1d, 0x09, 0xaf, 0x40, 0xc5, 0xf4, 0xb5, 0xd9, + 0xe3, 0x7c, 0x66, 0x3b, 0xb3, 0x53, 0x54, 0xcb, 0xa6, 0x1f, 0x3f, 0x6c, 0xd6, 0xbe, 0xca, 0x40, + 0x35, 0xfd, 0x71, 0x01, 0xb7, 0xa0, 0x68, 0x39, 0x3a, 0xe1, 0xa9, 0x25, 0xbe, 0x6c, 0xed, 0x3c, + 0xe7, 0x7b, 0x44, 0xfd, 0x30, 0xe4, 0xab, 0xb1, 0xe6, 0xd6, 0xdf, 0x25, 0x28, 0x46, 0x30, 0xbe, + 0x00, 0x39, 0x97, 0x04, 0x63, 0x6e, 0x2e, 0xbf, 0x9f, 0x41, 0x92, 0xca, 0xdb, 0x0c, 0xf7, 0x5d, + 0x62, 0xf3, 0x14, 0x08, 0x71, 0xd6, 0x66, 0xf3, 0x6a, 0x51, 0x62, 0xf0, 0x5b, 0x8f, 0x33, 0x99, + 0x50, 0x3b, 0xf0, 0xa3, 0x79, 0x0d, 0xf1, 0x66, 0x08, 0xe3, 0x77, 0x60, 0x3d, 0xf0, 0x88, 0x69, + 0xa5, 0xb8, 0x39, 0xce, 0x45, 0x91, 0x20, 0x26, 0xef, 0xc1, 0xa5, 0xc8, 0xae, 0x41, 0x03, 0xa2, + 0x8f, 0xa9, 0x31, 0x53, 0x2a, 0xf0, 0xd7, 0x8d, 0x8b, 0x21, 0xa1, 0x15, 0xca, 0x23, 0xdd, 0xda, + 0xd7, 0x12, 0xac, 0x47, 0xf7, 0x34, 0x23, 0x0e, 0xd6, 0x11, 0x00, 0xb1, 0x6d, 0x27, 0x48, 0x86, + 0x6b, 0x31, 0x95, 0x17, 0xf4, 0xea, 0x8d, 0x58, 0x49, 0x4d, 0x18, 0xd8, 0x9a, 0x00, 0xcc, 0x24, + 0x67, 0x86, 0xed, 0x32, 0x94, 0xc3, 0x2f, 0x47, 0xfc, 0xf3, 0xa3, 0xb8, 0xd9, 0x83, 0x80, 0xd8, + 0x85, 0x0e, 0x6f, 0x42, 0xfe, 0x84, 0x8e, 0x4c, 0x3b, 0x7c, 0x0f, 0x16, 0x8d, 0xe8, 0xfd, 0x25, + 0x17, 0xbf, 0xbf, 0xec, 0xff, 0x46, 0x82, 0x0d, 0xdd, 0x99, 0xcc, 0xfb, 0xbb, 0x8f, 0xe6, 0x9e, + 0x17, 0xfc, 0x8f, 0xa5, 0xcf, 0x3f, 0x1a, 0x99, 0xc1, 0x78, 0x7a, 0x52, 0xd7, 0x9d, 0xc9, 0xee, + 0xc8, 0xb1, 0x88, 0x3d, 0x9a, 0x7d, 0x3f, 0xe5, 0x7f, 0xf4, 0x1b, 0x23, 0x6a, 0xdf, 0x18, 0x39, + 0x89, 0xaf, 0xa9, 0xf7, 0x66, 0x7f, 0xff, 0x27, 0x49, 0x7f, 0xca, 0x64, 0x0f, 0x7a, 0xfb, 0x7f, + 0xce, 0x6c, 0x1d, 0x88, 0xee, 0x7a, 0x51, 0x78, 0x54, 0x3a, 0xb4, 0xa8, 0xce, 0x86, 0xfc, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x3e, 0xe8, 0xef, 0xc4, 0x9b, 0x1d, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto new file mode 100644 index 00000000..ed08fcbc --- /dev/null +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto @@ -0,0 +1,883 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + + +syntax = "proto2"; + +package google.protobuf; +option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; +option csharp_namespace = "Google.Protobuf.Reflection"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + // Indexes of the public imported files in the dependency list above. + repeated int32 public_dependency = 10; + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + repeated int32 weak_dependency = 11; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; + + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + optional string syntax = 12; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + + optional ExtensionRangeOptions options = 3; + } + repeated ExtensionRange extension_range = 5; + + repeated OneofDescriptorProto oneof_decl = 8; + + optional MessageOptions options = 7; + + // Range of reserved tag numbers. Reserved tag numbers may not be used by + // fields or extension ranges in the same message. Reserved ranges may + // not overlap. + message ReservedRange { + optional int32 start = 1; // Inclusive. + optional int32 end = 2; // Exclusive. + } + repeated ReservedRange reserved_range = 9; + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + repeated string reserved_name = 10; +} + +message ExtensionRangeOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + // Tag-delimited aggregate. + // Group type is deprecated and not supported in proto3. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. + TYPE_GROUP = 10; + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + }; + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + }; + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + optional string default_value = 7; + + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + optional int32 oneof_index = 9; + + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + optional string json_name = 10; + + optional FieldOptions options = 8; +} + +// Describes a oneof. +message OneofDescriptorProto { + optional string name = 1; + optional OneofOptions options = 2; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; + + // Range of reserved numeric values. Reserved values may not be used by + // entries in the same enum. Reserved ranges may not overlap. + // + // Note that this is distinct from DescriptorProto.ReservedRange in that it + // is inclusive such that it can appropriately represent the entire int32 + // domain. + message EnumReservedRange { + optional int32 start = 1; // Inclusive. + optional int32 end = 2; // Inclusive. + } + + // Range of reserved numeric values. Reserved numeric values may not be used + // by enum values in the same enum declaration. Reserved ranges may not + // overlap. + repeated EnumReservedRange reserved_range = 4; + + // Reserved enum value names, which may not be reused. A given name may only + // be reserved once. + repeated string reserved_name = 5; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; + + // Identifies if client streams multiple client messages + optional bool client_streaming = 5 [default=false]; + // Identifies if server streams multiple server messages + optional bool server_streaming = 6 [default=false]; +} + + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail protobuf-global-extension-registry@google.com +// to reserve extension numbers. Simply provide your project name (e.g. +// Objective-C plugin) and your project website (if available) -- there's no +// need to explain how you intend to use them. Usually you only need one +// extension number. You can declare multiple options with only one extension +// number by putting them in a sub-message. See the Custom Options section of +// the docs for examples: +// https://developers.google.com/protocol-buffers/docs/proto#options +// If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + optional string java_outer_classname = 8; + + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default=false]; + + // This option does nothing. + optional bool java_generate_equals_and_hash = 20 [deprecated=true]; + + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + optional bool java_string_check_utf8 = 27 [default=false]; + + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default=SPEED]; + + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + optional string go_package = 11; + + + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default=false]; + optional bool java_generic_services = 17 [default=false]; + optional bool py_generic_services = 18 [default=false]; + optional bool php_generic_services = 42 [default=false]; + + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + optional bool deprecated = 23 [default=false]; + + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + optional bool cc_enable_arenas = 31 [default=false]; + + + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + optional string objc_class_prefix = 36; + + // Namespace for generated classes; defaults to the package. + optional string csharp_namespace = 37; + + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + optional string swift_prefix = 39; + + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + optional string php_class_prefix = 40; + + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + optional string php_namespace = 41; + + + // Use this option to change the namespace of php generated metadata classes. + // Default is empty. When this option is empty, the proto file name will be used + // for determining the namespace. + optional string php_metadata_namespace = 44; + + // Use this option to change the package of ruby generated classes. Default + // is empty. When this option is not set, the package name will be used for + // determining the ruby package. + optional string ruby_package = 45; + + // The parser stores options it doesn't recognize here. + // See the documentation for the "Options" section above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. + // See the documentation for the "Options" section above. + extensions 1000 to max; + + reserved 38; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default=false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default=false]; + + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + optional bool deprecated = 3 [default=false]; + + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementions still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + optional bool map_entry = 7; + + reserved 8; // javalite_serializable + reserved 9; // javanano_as_lite + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. + optional bool packed = 2; + + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. + optional JSType jstype = 6 [default = JS_NORMAL]; + enum JSType { + // Use the default type. + JS_NORMAL = 0; + + // Use JavaScript strings. + JS_STRING = 1; + + // Use JavaScript numbers. + JS_NUMBER = 2; + } + + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + optional bool lazy = 5 [default=false]; + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default=false]; + + // For Google-internal migration only. Do not use. + optional bool weak = 10 [default=false]; + + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; + + reserved 4; // removed jtype +} + +message OneofOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // Set this option to true to allow mapping different tag names to the same + // value. + optional bool allow_alias = 2; + + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + optional bool deprecated = 3 [default=false]; + + reserved 5; // javanano_as_lite + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + optional bool deprecated = 1 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + optional bool deprecated = 33 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + optional bool deprecated = 33 [default=false]; + + // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, + // or neither? HTTP based RPC implementation may choose GET verb for safe + // methods, and PUT verb for idempotent methods instead of the default POST. + enum IdempotencyLevel { + IDEMPOTENCY_UNKNOWN = 0; + NO_SIDE_EFFECTS = 1; // implies idempotent + IDEMPOTENT = 2; // idempotent, but may have side effects + } + optional IdempotencyLevel idempotency_level = + 34 [default=IDEMPOTENCY_UNKNOWN]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents + // "foo.(bar.baz).qux". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed=true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed=true]; + + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to qux or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + optional string leading_comments = 3; + optional string trailing_comments = 4; + repeated string leading_detached_comments = 6; + } +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +message GeneratedCodeInfo { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + repeated Annotation annotation = 1; + message Annotation { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + repeated int32 path = 1 [packed=true]; + + // Identifies the filesystem path to the original source .proto. + optional string source_file = 2; + + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + optional int32 begin = 3; + + // Identifies the ending offset in bytes in the generated code that + // relates to the identified offset. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + optional int32 end = 4; + } +} diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go b/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go new file mode 100644 index 00000000..61bfc10e --- /dev/null +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go @@ -0,0 +1,369 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/compiler/plugin.proto + +/* +Package plugin_go is a generated protocol buffer package. + +It is generated from these files: + google/protobuf/compiler/plugin.proto + +It has these top-level messages: + Version + CodeGeneratorRequest + CodeGeneratorResponse +*/ +package plugin_go + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// The version number of protocol compiler. +type Version struct { + Major *int32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"` + Minor *int32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"` + Patch *int32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"` + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + Suffix *string `protobuf:"bytes,4,opt,name=suffix" json:"suffix,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Version) Reset() { *m = Version{} } +func (m *Version) String() string { return proto.CompactTextString(m) } +func (*Version) ProtoMessage() {} +func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (m *Version) Unmarshal(b []byte) error { + return xxx_messageInfo_Version.Unmarshal(m, b) +} +func (m *Version) Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Version.Marshal(b, m, deterministic) +} +func (dst *Version) XXX_Merge(src proto.Message) { + xxx_messageInfo_Version.Merge(dst, src) +} +func (m *Version) XXX_Size() int { + return xxx_messageInfo_Version.Size(m) +} +func (m *Version) XXX_DiscardUnknown() { + xxx_messageInfo_Version.DiscardUnknown(m) +} + +var xxx_messageInfo_Version proto.InternalMessageInfo + +func (m *Version) GetMajor() int32 { + if m != nil && m.Major != nil { + return *m.Major + } + return 0 +} + +func (m *Version) GetMinor() int32 { + if m != nil && m.Minor != nil { + return *m.Minor + } + return 0 +} + +func (m *Version) GetPatch() int32 { + if m != nil && m.Patch != nil { + return *m.Patch + } + return 0 +} + +func (m *Version) GetSuffix() string { + if m != nil && m.Suffix != nil { + return *m.Suffix + } + return "" +} + +// An encoded CodeGeneratorRequest is written to the plugin's stdin. +type CodeGeneratorRequest struct { + // The .proto files that were explicitly listed on the command-line. The + // code generator should generate code only for these files. Each file's + // descriptor will be included in proto_file, below. + FileToGenerate []string `protobuf:"bytes,1,rep,name=file_to_generate,json=fileToGenerate" json:"file_to_generate,omitempty"` + // The generator parameter passed on the command-line. + Parameter *string `protobuf:"bytes,2,opt,name=parameter" json:"parameter,omitempty"` + // FileDescriptorProtos for all files in files_to_generate and everything + // they import. The files will appear in topological order, so each file + // appears before any file that imports it. + // + // protoc guarantees that all proto_files will be written after + // the fields above, even though this is not technically guaranteed by the + // protobuf wire format. This theoretically could allow a plugin to stream + // in the FileDescriptorProtos and handle them one by one rather than read + // the entire set into memory at once. However, as of this writing, this + // is not similarly optimized on protoc's end -- it will store all fields in + // memory at once before sending them to the plugin. + // + // Type names of fields and extensions in the FileDescriptorProto are always + // fully qualified. + ProtoFile []*google_protobuf.FileDescriptorProto `protobuf:"bytes,15,rep,name=proto_file,json=protoFile" json:"proto_file,omitempty"` + // The version number of protocol compiler. + CompilerVersion *Version `protobuf:"bytes,3,opt,name=compiler_version,json=compilerVersion" json:"compiler_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CodeGeneratorRequest) Reset() { *m = CodeGeneratorRequest{} } +func (m *CodeGeneratorRequest) String() string { return proto.CompactTextString(m) } +func (*CodeGeneratorRequest) ProtoMessage() {} +func (*CodeGeneratorRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } +func (m *CodeGeneratorRequest) Unmarshal(b []byte) error { + return xxx_messageInfo_CodeGeneratorRequest.Unmarshal(m, b) +} +func (m *CodeGeneratorRequest) Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CodeGeneratorRequest.Marshal(b, m, deterministic) +} +func (dst *CodeGeneratorRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CodeGeneratorRequest.Merge(dst, src) +} +func (m *CodeGeneratorRequest) XXX_Size() int { + return xxx_messageInfo_CodeGeneratorRequest.Size(m) +} +func (m *CodeGeneratorRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CodeGeneratorRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_CodeGeneratorRequest proto.InternalMessageInfo + +func (m *CodeGeneratorRequest) GetFileToGenerate() []string { + if m != nil { + return m.FileToGenerate + } + return nil +} + +func (m *CodeGeneratorRequest) GetParameter() string { + if m != nil && m.Parameter != nil { + return *m.Parameter + } + return "" +} + +func (m *CodeGeneratorRequest) GetProtoFile() []*google_protobuf.FileDescriptorProto { + if m != nil { + return m.ProtoFile + } + return nil +} + +func (m *CodeGeneratorRequest) GetCompilerVersion() *Version { + if m != nil { + return m.CompilerVersion + } + return nil +} + +// The plugin writes an encoded CodeGeneratorResponse to stdout. +type CodeGeneratorResponse struct { + // Error message. If non-empty, code generation failed. The plugin process + // should exit with status code zero even if it reports an error in this way. + // + // This should be used to indicate errors in .proto files which prevent the + // code generator from generating correct code. Errors which indicate a + // problem in protoc itself -- such as the input CodeGeneratorRequest being + // unparseable -- should be reported by writing a message to stderr and + // exiting with a non-zero status code. + Error *string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` + File []*CodeGeneratorResponse_File `protobuf:"bytes,15,rep,name=file" json:"file,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CodeGeneratorResponse) Reset() { *m = CodeGeneratorResponse{} } +func (m *CodeGeneratorResponse) String() string { return proto.CompactTextString(m) } +func (*CodeGeneratorResponse) ProtoMessage() {} +func (*CodeGeneratorResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +func (m *CodeGeneratorResponse) Unmarshal(b []byte) error { + return xxx_messageInfo_CodeGeneratorResponse.Unmarshal(m, b) +} +func (m *CodeGeneratorResponse) Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CodeGeneratorResponse.Marshal(b, m, deterministic) +} +func (dst *CodeGeneratorResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_CodeGeneratorResponse.Merge(dst, src) +} +func (m *CodeGeneratorResponse) XXX_Size() int { + return xxx_messageInfo_CodeGeneratorResponse.Size(m) +} +func (m *CodeGeneratorResponse) XXX_DiscardUnknown() { + xxx_messageInfo_CodeGeneratorResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_CodeGeneratorResponse proto.InternalMessageInfo + +func (m *CodeGeneratorResponse) GetError() string { + if m != nil && m.Error != nil { + return *m.Error + } + return "" +} + +func (m *CodeGeneratorResponse) GetFile() []*CodeGeneratorResponse_File { + if m != nil { + return m.File + } + return nil +} + +// Represents a single generated file. +type CodeGeneratorResponse_File struct { + // The file name, relative to the output directory. The name must not + // contain "." or ".." components and must be relative, not be absolute (so, + // the file cannot lie outside the output directory). "/" must be used as + // the path separator, not "\". + // + // If the name is omitted, the content will be appended to the previous + // file. This allows the generator to break large files into small chunks, + // and allows the generated text to be streamed back to protoc so that large + // files need not reside completely in memory at one time. Note that as of + // this writing protoc does not optimize for this -- it will read the entire + // CodeGeneratorResponse before writing files to disk. + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // If non-empty, indicates that the named file should already exist, and the + // content here is to be inserted into that file at a defined insertion + // point. This feature allows a code generator to extend the output + // produced by another code generator. The original generator may provide + // insertion points by placing special annotations in the file that look + // like: + // @@protoc_insertion_point(NAME) + // The annotation can have arbitrary text before and after it on the line, + // which allows it to be placed in a comment. NAME should be replaced with + // an identifier naming the point -- this is what other generators will use + // as the insertion_point. Code inserted at this point will be placed + // immediately above the line containing the insertion point (thus multiple + // insertions to the same point will come out in the order they were added). + // The double-@ is intended to make it unlikely that the generated code + // could contain things that look like insertion points by accident. + // + // For example, the C++ code generator places the following line in the + // .pb.h files that it generates: + // // @@protoc_insertion_point(namespace_scope) + // This line appears within the scope of the file's package namespace, but + // outside of any particular class. Another plugin can then specify the + // insertion_point "namespace_scope" to generate additional classes or + // other declarations that should be placed in this scope. + // + // Note that if the line containing the insertion point begins with + // whitespace, the same whitespace will be added to every line of the + // inserted text. This is useful for languages like Python, where + // indentation matters. In these languages, the insertion point comment + // should be indented the same amount as any inserted code will need to be + // in order to work correctly in that context. + // + // The code generator that generates the initial file and the one which + // inserts into it must both run as part of a single invocation of protoc. + // Code generators are executed in the order in which they appear on the + // command line. + // + // If |insertion_point| is present, |name| must also be present. + InsertionPoint *string `protobuf:"bytes,2,opt,name=insertion_point,json=insertionPoint" json:"insertion_point,omitempty"` + // The file contents. + Content *string `protobuf:"bytes,15,opt,name=content" json:"content,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CodeGeneratorResponse_File) Reset() { *m = CodeGeneratorResponse_File{} } +func (m *CodeGeneratorResponse_File) String() string { return proto.CompactTextString(m) } +func (*CodeGeneratorResponse_File) ProtoMessage() {} +func (*CodeGeneratorResponse_File) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } +func (m *CodeGeneratorResponse_File) Unmarshal(b []byte) error { + return xxx_messageInfo_CodeGeneratorResponse_File.Unmarshal(m, b) +} +func (m *CodeGeneratorResponse_File) Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CodeGeneratorResponse_File.Marshal(b, m, deterministic) +} +func (dst *CodeGeneratorResponse_File) XXX_Merge(src proto.Message) { + xxx_messageInfo_CodeGeneratorResponse_File.Merge(dst, src) +} +func (m *CodeGeneratorResponse_File) XXX_Size() int { + return xxx_messageInfo_CodeGeneratorResponse_File.Size(m) +} +func (m *CodeGeneratorResponse_File) XXX_DiscardUnknown() { + xxx_messageInfo_CodeGeneratorResponse_File.DiscardUnknown(m) +} + +var xxx_messageInfo_CodeGeneratorResponse_File proto.InternalMessageInfo + +func (m *CodeGeneratorResponse_File) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *CodeGeneratorResponse_File) GetInsertionPoint() string { + if m != nil && m.InsertionPoint != nil { + return *m.InsertionPoint + } + return "" +} + +func (m *CodeGeneratorResponse_File) GetContent() string { + if m != nil && m.Content != nil { + return *m.Content + } + return "" +} + +func init() { + proto.RegisterType((*Version)(nil), "google.protobuf.compiler.Version") + proto.RegisterType((*CodeGeneratorRequest)(nil), "google.protobuf.compiler.CodeGeneratorRequest") + proto.RegisterType((*CodeGeneratorResponse)(nil), "google.protobuf.compiler.CodeGeneratorResponse") + proto.RegisterType((*CodeGeneratorResponse_File)(nil), "google.protobuf.compiler.CodeGeneratorResponse.File") +} + +func init() { proto.RegisterFile("google/protobuf/compiler/plugin.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 417 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xcf, 0x6a, 0x14, 0x41, + 0x10, 0xc6, 0x19, 0x77, 0x63, 0x98, 0x8a, 0x64, 0x43, 0x13, 0xa5, 0x09, 0x39, 0x8c, 0x8b, 0xe2, + 0x5c, 0x32, 0x0b, 0xc1, 0x8b, 0x78, 0x4b, 0x44, 0x3d, 0x78, 0x58, 0x1a, 0xf1, 0x20, 0xc8, 0x30, + 0x99, 0xd4, 0x74, 0x5a, 0x66, 0xba, 0xc6, 0xee, 0x1e, 0xf1, 0x49, 0x7d, 0x0f, 0xdf, 0x40, 0xfa, + 0xcf, 0x24, 0xb2, 0xb8, 0xa7, 0xee, 0xef, 0x57, 0xd5, 0xd5, 0x55, 0x1f, 0x05, 0x2f, 0x25, 0x91, + 0xec, 0x71, 0x33, 0x1a, 0x72, 0x74, 0x33, 0x75, 0x9b, 0x96, 0x86, 0x51, 0xf5, 0x68, 0x36, 0x63, + 0x3f, 0x49, 0xa5, 0xab, 0x10, 0x60, 0x3c, 0xa6, 0x55, 0x73, 0x5a, 0x35, 0xa7, 0x9d, 0x15, 0xbb, + 0x05, 0x6e, 0xd1, 0xb6, 0x46, 0x8d, 0x8e, 0x4c, 0xcc, 0x5e, 0xb7, 0x70, 0xf8, 0x05, 0x8d, 0x55, + 0xa4, 0xd9, 0x29, 0x1c, 0x0c, 0xcd, 0x77, 0x32, 0x3c, 0x2b, 0xb2, 0xf2, 0x40, 0x44, 0x11, 0xa8, + 0xd2, 0x64, 0xf8, 0xa3, 0x44, 0xbd, 0xf0, 0x74, 0x6c, 0x5c, 0x7b, 0xc7, 0x17, 0x91, 0x06, 0xc1, + 0x9e, 0xc1, 0x63, 0x3b, 0x75, 0x9d, 0xfa, 0xc5, 0x97, 0x45, 0x56, 0xe6, 0x22, 0xa9, 0xf5, 0x9f, + 0x0c, 0x4e, 0xaf, 0xe9, 0x16, 0x3f, 0xa0, 0x46, 0xd3, 0x38, 0x32, 0x02, 0x7f, 0x4c, 0x68, 0x1d, + 0x2b, 0xe1, 0xa4, 0x53, 0x3d, 0xd6, 0x8e, 0x6a, 0x19, 0x63, 0xc8, 0xb3, 0x62, 0x51, 0xe6, 0xe2, + 0xd8, 0xf3, 0xcf, 0x94, 0x5e, 0x20, 0x3b, 0x87, 0x7c, 0x6c, 0x4c, 0x33, 0xa0, 0xc3, 0xd8, 0x4a, + 0x2e, 0x1e, 0x00, 0xbb, 0x06, 0x08, 0xe3, 0xd4, 0xfe, 0x15, 0x5f, 0x15, 0x8b, 0xf2, 0xe8, 0xf2, + 0x45, 0xb5, 0x6b, 0xcb, 0x7b, 0xd5, 0xe3, 0xbb, 0x7b, 0x03, 0xb6, 0x1e, 0x8b, 0x3c, 0x44, 0x7d, + 0x84, 0x7d, 0x82, 0x93, 0xd9, 0xb8, 0xfa, 0x67, 0xf4, 0x24, 0x8c, 0x77, 0x74, 0xf9, 0xbc, 0xda, + 0xe7, 0x70, 0x95, 0xcc, 0x13, 0xab, 0x99, 0x24, 0xb0, 0xfe, 0x9d, 0xc1, 0xd3, 0x9d, 0x99, 0xed, + 0x48, 0xda, 0xa2, 0xf7, 0x0e, 0x8d, 0x49, 0x3e, 0xe7, 0x22, 0x0a, 0xf6, 0x11, 0x96, 0xff, 0x34, + 0xff, 0x7a, 0xff, 0x8f, 0xff, 0x2d, 0x1a, 0x66, 0x13, 0xa1, 0xc2, 0xd9, 0x37, 0x58, 0x86, 0x79, + 0x18, 0x2c, 0x75, 0x33, 0x60, 0xfa, 0x26, 0xdc, 0xd9, 0x2b, 0x58, 0x29, 0x6d, 0xd1, 0x38, 0x45, + 0xba, 0x1e, 0x49, 0x69, 0x97, 0xcc, 0x3c, 0xbe, 0xc7, 0x5b, 0x4f, 0x19, 0x87, 0xc3, 0x96, 0xb4, + 0x43, 0xed, 0xf8, 0x2a, 0x24, 0xcc, 0xf2, 0x4a, 0xc2, 0x79, 0x4b, 0xc3, 0xde, 0xfe, 0xae, 0x9e, + 0x6c, 0xc3, 0x6e, 0x06, 0x7b, 0xed, 0xd7, 0x37, 0x52, 0xb9, 0xbb, 0xe9, 0xc6, 0x87, 0x37, 0x92, + 0xfa, 0x46, 0xcb, 0x87, 0x65, 0x0c, 0x97, 0xf6, 0x42, 0xa2, 0xbe, 0x90, 0x94, 0x56, 0xfa, 0x6d, + 0x3c, 0x6a, 0x49, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x15, 0x40, 0xc5, 0xfe, 0x02, 0x00, + 0x00, +} diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden b/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden new file mode 100644 index 00000000..8953d0ff --- /dev/null +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden @@ -0,0 +1,83 @@ +// Code generated by protoc-gen-go. +// source: google/protobuf/compiler/plugin.proto +// DO NOT EDIT! + +package google_protobuf_compiler + +import proto "github.com/golang/protobuf/proto" +import "math" +import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" + +// Reference proto and math imports to suppress error if they are not otherwise used. +var _ = proto.GetString +var _ = math.Inf + +type CodeGeneratorRequest struct { + FileToGenerate []string `protobuf:"bytes,1,rep,name=file_to_generate" json:"file_to_generate,omitempty"` + Parameter *string `protobuf:"bytes,2,opt,name=parameter" json:"parameter,omitempty"` + ProtoFile []*google_protobuf.FileDescriptorProto `protobuf:"bytes,15,rep,name=proto_file" json:"proto_file,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (this *CodeGeneratorRequest) Reset() { *this = CodeGeneratorRequest{} } +func (this *CodeGeneratorRequest) String() string { return proto.CompactTextString(this) } +func (*CodeGeneratorRequest) ProtoMessage() {} + +func (this *CodeGeneratorRequest) GetParameter() string { + if this != nil && this.Parameter != nil { + return *this.Parameter + } + return "" +} + +type CodeGeneratorResponse struct { + Error *string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` + File []*CodeGeneratorResponse_File `protobuf:"bytes,15,rep,name=file" json:"file,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (this *CodeGeneratorResponse) Reset() { *this = CodeGeneratorResponse{} } +func (this *CodeGeneratorResponse) String() string { return proto.CompactTextString(this) } +func (*CodeGeneratorResponse) ProtoMessage() {} + +func (this *CodeGeneratorResponse) GetError() string { + if this != nil && this.Error != nil { + return *this.Error + } + return "" +} + +type CodeGeneratorResponse_File struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + InsertionPoint *string `protobuf:"bytes,2,opt,name=insertion_point" json:"insertion_point,omitempty"` + Content *string `protobuf:"bytes,15,opt,name=content" json:"content,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (this *CodeGeneratorResponse_File) Reset() { *this = CodeGeneratorResponse_File{} } +func (this *CodeGeneratorResponse_File) String() string { return proto.CompactTextString(this) } +func (*CodeGeneratorResponse_File) ProtoMessage() {} + +func (this *CodeGeneratorResponse_File) GetName() string { + if this != nil && this.Name != nil { + return *this.Name + } + return "" +} + +func (this *CodeGeneratorResponse_File) GetInsertionPoint() string { + if this != nil && this.InsertionPoint != nil { + return *this.InsertionPoint + } + return "" +} + +func (this *CodeGeneratorResponse_File) GetContent() string { + if this != nil && this.Content != nil { + return *this.Content + } + return "" +} + +func init() { +} diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto b/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto new file mode 100644 index 00000000..5b557452 --- /dev/null +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.proto @@ -0,0 +1,167 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// WARNING: The plugin interface is currently EXPERIMENTAL and is subject to +// change. +// +// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is +// just a program that reads a CodeGeneratorRequest from stdin and writes a +// CodeGeneratorResponse to stdout. +// +// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead +// of dealing with the raw protocol defined here. +// +// A plugin executable needs only to be placed somewhere in the path. The +// plugin should be named "protoc-gen-$NAME", and will then be used when the +// flag "--${NAME}_out" is passed to protoc. + +syntax = "proto2"; +package google.protobuf.compiler; +option java_package = "com.google.protobuf.compiler"; +option java_outer_classname = "PluginProtos"; + +option go_package = "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go"; + +import "google/protobuf/descriptor.proto"; + +// The version number of protocol compiler. +message Version { + optional int32 major = 1; + optional int32 minor = 2; + optional int32 patch = 3; + // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should + // be empty for mainline stable releases. + optional string suffix = 4; +} + +// An encoded CodeGeneratorRequest is written to the plugin's stdin. +message CodeGeneratorRequest { + // The .proto files that were explicitly listed on the command-line. The + // code generator should generate code only for these files. Each file's + // descriptor will be included in proto_file, below. + repeated string file_to_generate = 1; + + // The generator parameter passed on the command-line. + optional string parameter = 2; + + // FileDescriptorProtos for all files in files_to_generate and everything + // they import. The files will appear in topological order, so each file + // appears before any file that imports it. + // + // protoc guarantees that all proto_files will be written after + // the fields above, even though this is not technically guaranteed by the + // protobuf wire format. This theoretically could allow a plugin to stream + // in the FileDescriptorProtos and handle them one by one rather than read + // the entire set into memory at once. However, as of this writing, this + // is not similarly optimized on protoc's end -- it will store all fields in + // memory at once before sending them to the plugin. + // + // Type names of fields and extensions in the FileDescriptorProto are always + // fully qualified. + repeated FileDescriptorProto proto_file = 15; + + // The version number of protocol compiler. + optional Version compiler_version = 3; + +} + +// The plugin writes an encoded CodeGeneratorResponse to stdout. +message CodeGeneratorResponse { + // Error message. If non-empty, code generation failed. The plugin process + // should exit with status code zero even if it reports an error in this way. + // + // This should be used to indicate errors in .proto files which prevent the + // code generator from generating correct code. Errors which indicate a + // problem in protoc itself -- such as the input CodeGeneratorRequest being + // unparseable -- should be reported by writing a message to stderr and + // exiting with a non-zero status code. + optional string error = 1; + + // Represents a single generated file. + message File { + // The file name, relative to the output directory. The name must not + // contain "." or ".." components and must be relative, not be absolute (so, + // the file cannot lie outside the output directory). "/" must be used as + // the path separator, not "\". + // + // If the name is omitted, the content will be appended to the previous + // file. This allows the generator to break large files into small chunks, + // and allows the generated text to be streamed back to protoc so that large + // files need not reside completely in memory at one time. Note that as of + // this writing protoc does not optimize for this -- it will read the entire + // CodeGeneratorResponse before writing files to disk. + optional string name = 1; + + // If non-empty, indicates that the named file should already exist, and the + // content here is to be inserted into that file at a defined insertion + // point. This feature allows a code generator to extend the output + // produced by another code generator. The original generator may provide + // insertion points by placing special annotations in the file that look + // like: + // @@protoc_insertion_point(NAME) + // The annotation can have arbitrary text before and after it on the line, + // which allows it to be placed in a comment. NAME should be replaced with + // an identifier naming the point -- this is what other generators will use + // as the insertion_point. Code inserted at this point will be placed + // immediately above the line containing the insertion point (thus multiple + // insertions to the same point will come out in the order they were added). + // The double-@ is intended to make it unlikely that the generated code + // could contain things that look like insertion points by accident. + // + // For example, the C++ code generator places the following line in the + // .pb.h files that it generates: + // // @@protoc_insertion_point(namespace_scope) + // This line appears within the scope of the file's package namespace, but + // outside of any particular class. Another plugin can then specify the + // insertion_point "namespace_scope" to generate additional classes or + // other declarations that should be placed in this scope. + // + // Note that if the line containing the insertion point begins with + // whitespace, the same whitespace will be added to every line of the + // inserted text. This is useful for languages like Python, where + // indentation matters. In these languages, the insertion point comment + // should be indented the same amount as any inserted code will need to be + // in order to work correctly in that context. + // + // The code generator that generates the initial file and the one which + // inserts into it must both run as part of a single invocation of protoc. + // Code generators are executed in the order in which they appear on the + // command line. + // + // If |insertion_point| is present, |name| must also be present. + optional string insertion_point = 2; + + // The file contents. + optional string content = 15; + } + repeated File file = 15; +} diff --git a/vendor/github.com/golang/protobuf/ptypes/any.go b/vendor/github.com/golang/protobuf/ptypes/any.go new file mode 100644 index 00000000..70276e8f --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/any.go @@ -0,0 +1,141 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package ptypes + +// This file implements functions to marshal proto.Message to/from +// google.protobuf.Any message. + +import ( + "fmt" + "reflect" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/any" +) + +const googleApis = "type.googleapis.com/" + +// AnyMessageName returns the name of the message contained in a google.protobuf.Any message. +// +// Note that regular type assertions should be done using the Is +// function. AnyMessageName is provided for less common use cases like filtering a +// sequence of Any messages based on a set of allowed message type names. +func AnyMessageName(any *any.Any) (string, error) { + if any == nil { + return "", fmt.Errorf("message is nil") + } + slash := strings.LastIndex(any.TypeUrl, "/") + if slash < 0 { + return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) + } + return any.TypeUrl[slash+1:], nil +} + +// MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any. +func MarshalAny(pb proto.Message) (*any.Any, error) { + value, err := proto.Marshal(pb) + if err != nil { + return nil, err + } + return &any.Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil +} + +// DynamicAny is a value that can be passed to UnmarshalAny to automatically +// allocate a proto.Message for the type specified in a google.protobuf.Any +// message. The allocated message is stored in the embedded proto.Message. +// +// Example: +// +// var x ptypes.DynamicAny +// if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } +// fmt.Printf("unmarshaled message: %v", x.Message) +type DynamicAny struct { + proto.Message +} + +// Empty returns a new proto.Message of the type specified in a +// google.protobuf.Any message. It returns an error if corresponding message +// type isn't linked in. +func Empty(any *any.Any) (proto.Message, error) { + aname, err := AnyMessageName(any) + if err != nil { + return nil, err + } + + t := proto.MessageType(aname) + if t == nil { + return nil, fmt.Errorf("any: message type %q isn't linked in", aname) + } + return reflect.New(t.Elem()).Interface().(proto.Message), nil +} + +// UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any +// message and places the decoded result in pb. It returns an error if type of +// contents of Any message does not match type of pb message. +// +// pb can be a proto.Message, or a *DynamicAny. +func UnmarshalAny(any *any.Any, pb proto.Message) error { + if d, ok := pb.(*DynamicAny); ok { + if d.Message == nil { + var err error + d.Message, err = Empty(any) + if err != nil { + return err + } + } + return UnmarshalAny(any, d.Message) + } + + aname, err := AnyMessageName(any) + if err != nil { + return err + } + + mname := proto.MessageName(pb) + if aname != mname { + return fmt.Errorf("mismatched message type: got %q want %q", aname, mname) + } + return proto.Unmarshal(any.Value, pb) +} + +// Is returns true if any value contains a given message type. +func Is(any *any.Any, pb proto.Message) bool { + // The following is equivalent to AnyMessageName(any) == proto.MessageName(pb), + // but it avoids scanning TypeUrl for the slash. + if any == nil { + return false + } + name := proto.MessageName(pb) + prefix := len(any.TypeUrl) - len(name) + return prefix >= 1 && any.TypeUrl[prefix-1] == '/' && any.TypeUrl[prefix:] == name +} diff --git a/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go b/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go new file mode 100644 index 00000000..78ee5233 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go @@ -0,0 +1,200 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/any.proto + +package any + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +type Any struct { + // A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` + // Must be a valid serialized protocol buffer of the above specified type. + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Any) Reset() { *m = Any{} } +func (m *Any) String() string { return proto.CompactTextString(m) } +func (*Any) ProtoMessage() {} +func (*Any) Descriptor() ([]byte, []int) { + return fileDescriptor_b53526c13ae22eb4, []int{0} +} + +func (*Any) XXX_WellKnownType() string { return "Any" } + +func (m *Any) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Any.Unmarshal(m, b) +} +func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Any.Marshal(b, m, deterministic) +} +func (m *Any) XXX_Merge(src proto.Message) { + xxx_messageInfo_Any.Merge(m, src) +} +func (m *Any) XXX_Size() int { + return xxx_messageInfo_Any.Size(m) +} +func (m *Any) XXX_DiscardUnknown() { + xxx_messageInfo_Any.DiscardUnknown(m) +} + +var xxx_messageInfo_Any proto.InternalMessageInfo + +func (m *Any) GetTypeUrl() string { + if m != nil { + return m.TypeUrl + } + return "" +} + +func (m *Any) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*Any)(nil), "google.protobuf.Any") +} + +func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor_b53526c13ae22eb4) } + +var fileDescriptor_b53526c13ae22eb4 = []byte{ + // 185 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4, + 0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x25, 0x33, 0x2e, 0x66, 0xc7, 0xbc, 0x4a, + 0x21, 0x49, 0x2e, 0x8e, 0x92, 0xca, 0x82, 0xd4, 0xf8, 0xd2, 0xa2, 0x1c, 0x09, 0x46, 0x05, 0x46, + 0x0d, 0xce, 0x20, 0x76, 0x10, 0x3f, 0xb4, 0x28, 0x47, 0x48, 0x84, 0x8b, 0xb5, 0x2c, 0x31, 0xa7, + 0x34, 0x55, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xc2, 0x71, 0xca, 0xe7, 0x12, 0x4e, 0xce, + 0xcf, 0xd5, 0x43, 0x33, 0xce, 0x89, 0xc3, 0x31, 0xaf, 0x32, 0x00, 0xc4, 0x09, 0x60, 0x8c, 0x52, + 0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, + 0x4b, 0x47, 0xb8, 0xa8, 0x00, 0x64, 0x7a, 0x31, 0xc8, 0x61, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, + 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x8c, 0x0a, 0x80, 0x2a, 0xd1, 0x0b, 0x4f, 0xcd, 0xc9, 0xf1, 0xce, + 0xcb, 0x2f, 0xcf, 0x0b, 0x01, 0x29, 0x4d, 0x62, 0x03, 0xeb, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, + 0xff, 0x13, 0xf8, 0xe8, 0x42, 0xdd, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/any/any.proto b/vendor/github.com/golang/protobuf/ptypes/any/any.proto new file mode 100644 index 00000000..49329425 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/any/any.proto @@ -0,0 +1,154 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "github.com/golang/protobuf/ptypes/any"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "AnyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +message Any { + // A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + string type_url = 1; + + // Must be a valid serialized protocol buffer of the above specified type. + bytes value = 2; +} diff --git a/vendor/github.com/golang/protobuf/ptypes/doc.go b/vendor/github.com/golang/protobuf/ptypes/doc.go new file mode 100644 index 00000000..c0d595da --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/doc.go @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package ptypes contains code for interacting with well-known types. +*/ +package ptypes diff --git a/vendor/github.com/golang/protobuf/ptypes/duration.go b/vendor/github.com/golang/protobuf/ptypes/duration.go new file mode 100644 index 00000000..26d1ca2f --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/duration.go @@ -0,0 +1,102 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package ptypes + +// This file implements conversions between google.protobuf.Duration +// and time.Duration. + +import ( + "errors" + "fmt" + "time" + + durpb "github.com/golang/protobuf/ptypes/duration" +) + +const ( + // Range of a durpb.Duration in seconds, as specified in + // google/protobuf/duration.proto. This is about 10,000 years in seconds. + maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) + minSeconds = -maxSeconds +) + +// validateDuration determines whether the durpb.Duration is valid according to the +// definition in google/protobuf/duration.proto. A valid durpb.Duration +// may still be too large to fit into a time.Duration (the range of durpb.Duration +// is about 10,000 years, and the range of time.Duration is about 290). +func validateDuration(d *durpb.Duration) error { + if d == nil { + return errors.New("duration: nil Duration") + } + if d.Seconds < minSeconds || d.Seconds > maxSeconds { + return fmt.Errorf("duration: %v: seconds out of range", d) + } + if d.Nanos <= -1e9 || d.Nanos >= 1e9 { + return fmt.Errorf("duration: %v: nanos out of range", d) + } + // Seconds and Nanos must have the same sign, unless d.Nanos is zero. + if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { + return fmt.Errorf("duration: %v: seconds and nanos have different signs", d) + } + return nil +} + +// Duration converts a durpb.Duration to a time.Duration. Duration +// returns an error if the durpb.Duration is invalid or is too large to be +// represented in a time.Duration. +func Duration(p *durpb.Duration) (time.Duration, error) { + if err := validateDuration(p); err != nil { + return 0, err + } + d := time.Duration(p.Seconds) * time.Second + if int64(d/time.Second) != p.Seconds { + return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) + } + if p.Nanos != 0 { + d += time.Duration(p.Nanos) * time.Nanosecond + if (d < 0) != (p.Nanos < 0) { + return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) + } + } + return d, nil +} + +// DurationProto converts a time.Duration to a durpb.Duration. +func DurationProto(d time.Duration) *durpb.Duration { + nanos := d.Nanoseconds() + secs := nanos / 1e9 + nanos -= secs * 1e9 + return &durpb.Duration{ + Seconds: secs, + Nanos: int32(nanos), + } +} diff --git a/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go b/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go new file mode 100644 index 00000000..0d681ee2 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go @@ -0,0 +1,161 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/duration.proto + +package duration + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (durations.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +// +type Duration struct { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Duration) Reset() { *m = Duration{} } +func (m *Duration) String() string { return proto.CompactTextString(m) } +func (*Duration) ProtoMessage() {} +func (*Duration) Descriptor() ([]byte, []int) { + return fileDescriptor_23597b2ebd7ac6c5, []int{0} +} + +func (*Duration) XXX_WellKnownType() string { return "Duration" } + +func (m *Duration) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Duration.Unmarshal(m, b) +} +func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Duration.Marshal(b, m, deterministic) +} +func (m *Duration) XXX_Merge(src proto.Message) { + xxx_messageInfo_Duration.Merge(m, src) +} +func (m *Duration) XXX_Size() int { + return xxx_messageInfo_Duration.Size(m) +} +func (m *Duration) XXX_DiscardUnknown() { + xxx_messageInfo_Duration.DiscardUnknown(m) +} + +var xxx_messageInfo_Duration proto.InternalMessageInfo + +func (m *Duration) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Duration) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func init() { + proto.RegisterType((*Duration)(nil), "google.protobuf.Duration") +} + +func init() { proto.RegisterFile("google/protobuf/duration.proto", fileDescriptor_23597b2ebd7ac6c5) } + +var fileDescriptor_23597b2ebd7ac6c5 = []byte{ + // 190 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0x29, 0x2d, 0x4a, + 0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0x56, + 0x5c, 0x1c, 0x2e, 0x50, 0x25, 0x42, 0x12, 0x5c, 0xec, 0xc5, 0xa9, 0xc9, 0xf9, 0x79, 0x29, 0xc5, + 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x30, 0xae, 0x90, 0x08, 0x17, 0x6b, 0x5e, 0x62, 0x5e, + 0x7e, 0xb1, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x6b, 0x10, 0x84, 0xe3, 0x54, 0xc3, 0x25, 0x9c, 0x9c, + 0x9f, 0xab, 0x87, 0x66, 0xa4, 0x13, 0x2f, 0xcc, 0xc0, 0x00, 0x90, 0x48, 0x00, 0x63, 0x94, 0x56, + 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x7a, 0x7e, 0x4e, 0x62, 0x5e, + 0x3a, 0xc2, 0x7d, 0x05, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x70, 0x67, 0xfe, 0x60, 0x64, 0x5c, 0xc4, + 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, 0x00, 0x54, 0xa9, 0x5e, 0x78, + 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, 0x12, 0x1b, 0xd8, 0x0c, 0x63, + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x84, 0x30, 0xff, 0xf3, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto b/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto new file mode 100644 index 00000000..975fce41 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto @@ -0,0 +1,117 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/duration"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DurationProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (durations.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +// +message Duration { + + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + int64 seconds = 1; + + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + int32 nanos = 2; +} diff --git a/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go b/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go new file mode 100644 index 00000000..b4eb03ec --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go @@ -0,0 +1,83 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/empty.proto + +package empty + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +// The JSON representation for `Empty` is empty JSON object `{}`. +type Empty struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { + return fileDescriptor_900544acb223d5b8, []int{0} +} + +func (*Empty) XXX_WellKnownType() string { return "Empty" } + +func (m *Empty) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Empty.Unmarshal(m, b) +} +func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Empty.Marshal(b, m, deterministic) +} +func (m *Empty) XXX_Merge(src proto.Message) { + xxx_messageInfo_Empty.Merge(m, src) +} +func (m *Empty) XXX_Size() int { + return xxx_messageInfo_Empty.Size(m) +} +func (m *Empty) XXX_DiscardUnknown() { + xxx_messageInfo_Empty.DiscardUnknown(m) +} + +var xxx_messageInfo_Empty proto.InternalMessageInfo + +func init() { + proto.RegisterType((*Empty)(nil), "google.protobuf.Empty") +} + +func init() { proto.RegisterFile("google/protobuf/empty.proto", fileDescriptor_900544acb223d5b8) } + +var fileDescriptor_900544acb223d5b8 = []byte{ + // 148 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcd, 0x2d, 0x28, + 0xa9, 0xd4, 0x03, 0x73, 0x85, 0xf8, 0x21, 0x92, 0x7a, 0x30, 0x49, 0x25, 0x76, 0x2e, 0x56, 0x57, + 0x90, 0xbc, 0x53, 0x19, 0x97, 0x70, 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0xbc, 0x13, 0x17, 0x58, 0x36, + 0x00, 0xc4, 0x0d, 0x60, 0x8c, 0x52, 0x4f, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, + 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0x47, 0x58, 0x53, 0x50, 0x52, 0x59, 0x90, 0x5a, 0x0c, + 0xb1, 0xed, 0x07, 0x23, 0xe3, 0x22, 0x26, 0x66, 0xf7, 0x00, 0xa7, 0x55, 0x4c, 0x72, 0xee, 0x10, + 0x13, 0x03, 0xa0, 0xea, 0xf4, 0xc2, 0x53, 0x73, 0x72, 0xbc, 0xf3, 0xf2, 0xcb, 0xf3, 0x42, 0x40, + 0xea, 0x93, 0xd8, 0xc0, 0x06, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x64, 0xd4, 0xb3, 0xa6, + 0xb7, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto b/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto new file mode 100644 index 00000000..03cacd23 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/empty/empty.proto @@ -0,0 +1,52 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "github.com/golang/protobuf/ptypes/empty"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "EmptyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +// The JSON representation for `Empty` is empty JSON object `{}`. +message Empty {} diff --git a/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go b/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go new file mode 100644 index 00000000..33daa73d --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go @@ -0,0 +1,336 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/struct.proto + +package structpb + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// `NullValue` is a singleton enumeration to represent the null value for the +// `Value` type union. +// +// The JSON representation for `NullValue` is JSON `null`. +type NullValue int32 + +const ( + // Null value. + NullValue_NULL_VALUE NullValue = 0 +) + +var NullValue_name = map[int32]string{ + 0: "NULL_VALUE", +} + +var NullValue_value = map[string]int32{ + "NULL_VALUE": 0, +} + +func (x NullValue) String() string { + return proto.EnumName(NullValue_name, int32(x)) +} + +func (NullValue) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{0} +} + +func (NullValue) XXX_WellKnownType() string { return "NullValue" } + +// `Struct` represents a structured data value, consisting of fields +// which map to dynamically typed values. In some languages, `Struct` +// might be supported by a native representation. For example, in +// scripting languages like JS a struct is represented as an +// object. The details of that representation are described together +// with the proto support for the language. +// +// The JSON representation for `Struct` is JSON object. +type Struct struct { + // Unordered map of dynamically typed values. + Fields map[string]*Value `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Struct) Reset() { *m = Struct{} } +func (m *Struct) String() string { return proto.CompactTextString(m) } +func (*Struct) ProtoMessage() {} +func (*Struct) Descriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{0} +} + +func (*Struct) XXX_WellKnownType() string { return "Struct" } + +func (m *Struct) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Struct.Unmarshal(m, b) +} +func (m *Struct) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Struct.Marshal(b, m, deterministic) +} +func (m *Struct) XXX_Merge(src proto.Message) { + xxx_messageInfo_Struct.Merge(m, src) +} +func (m *Struct) XXX_Size() int { + return xxx_messageInfo_Struct.Size(m) +} +func (m *Struct) XXX_DiscardUnknown() { + xxx_messageInfo_Struct.DiscardUnknown(m) +} + +var xxx_messageInfo_Struct proto.InternalMessageInfo + +func (m *Struct) GetFields() map[string]*Value { + if m != nil { + return m.Fields + } + return nil +} + +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of that +// variants, absence of any variant indicates an error. +// +// The JSON representation for `Value` is JSON value. +type Value struct { + // The kind of value. + // + // Types that are valid to be assigned to Kind: + // *Value_NullValue + // *Value_NumberValue + // *Value_StringValue + // *Value_BoolValue + // *Value_StructValue + // *Value_ListValue + Kind isValue_Kind `protobuf_oneof:"kind"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Value) Reset() { *m = Value{} } +func (m *Value) String() string { return proto.CompactTextString(m) } +func (*Value) ProtoMessage() {} +func (*Value) Descriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{1} +} + +func (*Value) XXX_WellKnownType() string { return "Value" } + +func (m *Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Value.Unmarshal(m, b) +} +func (m *Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Value.Marshal(b, m, deterministic) +} +func (m *Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Value.Merge(m, src) +} +func (m *Value) XXX_Size() int { + return xxx_messageInfo_Value.Size(m) +} +func (m *Value) XXX_DiscardUnknown() { + xxx_messageInfo_Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Value proto.InternalMessageInfo + +type isValue_Kind interface { + isValue_Kind() +} + +type Value_NullValue struct { + NullValue NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"` +} + +type Value_NumberValue struct { + NumberValue float64 `protobuf:"fixed64,2,opt,name=number_value,json=numberValue,proto3,oneof"` +} + +type Value_StringValue struct { + StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,proto3,oneof"` +} + +type Value_BoolValue struct { + BoolValue bool `protobuf:"varint,4,opt,name=bool_value,json=boolValue,proto3,oneof"` +} + +type Value_StructValue struct { + StructValue *Struct `protobuf:"bytes,5,opt,name=struct_value,json=structValue,proto3,oneof"` +} + +type Value_ListValue struct { + ListValue *ListValue `protobuf:"bytes,6,opt,name=list_value,json=listValue,proto3,oneof"` +} + +func (*Value_NullValue) isValue_Kind() {} + +func (*Value_NumberValue) isValue_Kind() {} + +func (*Value_StringValue) isValue_Kind() {} + +func (*Value_BoolValue) isValue_Kind() {} + +func (*Value_StructValue) isValue_Kind() {} + +func (*Value_ListValue) isValue_Kind() {} + +func (m *Value) GetKind() isValue_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (m *Value) GetNullValue() NullValue { + if x, ok := m.GetKind().(*Value_NullValue); ok { + return x.NullValue + } + return NullValue_NULL_VALUE +} + +func (m *Value) GetNumberValue() float64 { + if x, ok := m.GetKind().(*Value_NumberValue); ok { + return x.NumberValue + } + return 0 +} + +func (m *Value) GetStringValue() string { + if x, ok := m.GetKind().(*Value_StringValue); ok { + return x.StringValue + } + return "" +} + +func (m *Value) GetBoolValue() bool { + if x, ok := m.GetKind().(*Value_BoolValue); ok { + return x.BoolValue + } + return false +} + +func (m *Value) GetStructValue() *Struct { + if x, ok := m.GetKind().(*Value_StructValue); ok { + return x.StructValue + } + return nil +} + +func (m *Value) GetListValue() *ListValue { + if x, ok := m.GetKind().(*Value_ListValue); ok { + return x.ListValue + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*Value) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*Value_NullValue)(nil), + (*Value_NumberValue)(nil), + (*Value_StringValue)(nil), + (*Value_BoolValue)(nil), + (*Value_StructValue)(nil), + (*Value_ListValue)(nil), + } +} + +// `ListValue` is a wrapper around a repeated field of values. +// +// The JSON representation for `ListValue` is JSON array. +type ListValue struct { + // Repeated field of dynamically typed values. + Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListValue) Reset() { *m = ListValue{} } +func (m *ListValue) String() string { return proto.CompactTextString(m) } +func (*ListValue) ProtoMessage() {} +func (*ListValue) Descriptor() ([]byte, []int) { + return fileDescriptor_df322afd6c9fb402, []int{2} +} + +func (*ListValue) XXX_WellKnownType() string { return "ListValue" } + +func (m *ListValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListValue.Unmarshal(m, b) +} +func (m *ListValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListValue.Marshal(b, m, deterministic) +} +func (m *ListValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListValue.Merge(m, src) +} +func (m *ListValue) XXX_Size() int { + return xxx_messageInfo_ListValue.Size(m) +} +func (m *ListValue) XXX_DiscardUnknown() { + xxx_messageInfo_ListValue.DiscardUnknown(m) +} + +var xxx_messageInfo_ListValue proto.InternalMessageInfo + +func (m *ListValue) GetValues() []*Value { + if m != nil { + return m.Values + } + return nil +} + +func init() { + proto.RegisterEnum("google.protobuf.NullValue", NullValue_name, NullValue_value) + proto.RegisterType((*Struct)(nil), "google.protobuf.Struct") + proto.RegisterMapType((map[string]*Value)(nil), "google.protobuf.Struct.FieldsEntry") + proto.RegisterType((*Value)(nil), "google.protobuf.Value") + proto.RegisterType((*ListValue)(nil), "google.protobuf.ListValue") +} + +func init() { proto.RegisterFile("google/protobuf/struct.proto", fileDescriptor_df322afd6c9fb402) } + +var fileDescriptor_df322afd6c9fb402 = []byte{ + // 417 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0x41, 0x8b, 0xd3, 0x40, + 0x14, 0xc7, 0x3b, 0xc9, 0x36, 0x98, 0x17, 0x59, 0x97, 0x11, 0xb4, 0xac, 0xa2, 0xa1, 0x7b, 0x09, + 0x22, 0x29, 0xd6, 0x8b, 0x18, 0x2f, 0x06, 0xd6, 0x5d, 0x30, 0x2c, 0x31, 0xba, 0x15, 0xbc, 0x94, + 0x26, 0x4d, 0x63, 0xe8, 0x74, 0x26, 0x24, 0x33, 0x4a, 0x8f, 0x7e, 0x0b, 0xcf, 0x1e, 0x3d, 0xfa, + 0xe9, 0x3c, 0xca, 0xcc, 0x24, 0xa9, 0xb4, 0xf4, 0x94, 0xbc, 0xf7, 0x7e, 0xef, 0x3f, 0xef, 0xff, + 0x66, 0xe0, 0x71, 0xc1, 0x58, 0x41, 0xf2, 0x49, 0x55, 0x33, 0xce, 0x52, 0xb1, 0x9a, 0x34, 0xbc, + 0x16, 0x19, 0xf7, 0x55, 0x8c, 0xef, 0xe9, 0xaa, 0xdf, 0x55, 0xc7, 0x3f, 0x11, 0x58, 0x1f, 0x15, + 0x81, 0x03, 0xb0, 0x56, 0x65, 0x4e, 0x96, 0xcd, 0x08, 0xb9, 0xa6, 0xe7, 0x4c, 0x2f, 0xfc, 0x3d, + 0xd8, 0xd7, 0xa0, 0xff, 0x4e, 0x51, 0x97, 0x94, 0xd7, 0xdb, 0xa4, 0x6d, 0x39, 0xff, 0x00, 0xce, + 0x7f, 0x69, 0x7c, 0x06, 0xe6, 0x3a, 0xdf, 0x8e, 0x90, 0x8b, 0x3c, 0x3b, 0x91, 0xbf, 0xf8, 0x39, + 0x0c, 0xbf, 0x2d, 0x88, 0xc8, 0x47, 0x86, 0x8b, 0x3c, 0x67, 0xfa, 0xe0, 0x40, 0x7c, 0x26, 0xab, + 0x89, 0x86, 0x5e, 0x1b, 0xaf, 0xd0, 0xf8, 0x8f, 0x01, 0x43, 0x95, 0xc4, 0x01, 0x00, 0x15, 0x84, + 0xcc, 0xb5, 0x80, 0x14, 0x3d, 0x9d, 0x9e, 0x1f, 0x08, 0xdc, 0x08, 0x42, 0x14, 0x7f, 0x3d, 0x48, + 0x6c, 0xda, 0x05, 0xf8, 0x02, 0xee, 0x52, 0xb1, 0x49, 0xf3, 0x7a, 0xbe, 0x3b, 0x1f, 0x5d, 0x0f, + 0x12, 0x47, 0x67, 0x7b, 0xa8, 0xe1, 0x75, 0x49, 0x8b, 0x16, 0x32, 0xe5, 0xe0, 0x12, 0xd2, 0x59, + 0x0d, 0x3d, 0x05, 0x48, 0x19, 0xeb, 0xc6, 0x38, 0x71, 0x91, 0x77, 0x47, 0x1e, 0x25, 0x73, 0x1a, + 0x78, 0xa3, 0x54, 0x44, 0xc6, 0x5b, 0x64, 0xa8, 0xac, 0x3e, 0x3c, 0xb2, 0xc7, 0x56, 0x5e, 0x64, + 0xbc, 0x77, 0x49, 0xca, 0xa6, 0xeb, 0xb5, 0x54, 0xef, 0xa1, 0xcb, 0xa8, 0x6c, 0x78, 0xef, 0x92, + 0x74, 0x41, 0x68, 0xc1, 0xc9, 0xba, 0xa4, 0xcb, 0x71, 0x00, 0x76, 0x4f, 0x60, 0x1f, 0x2c, 0x25, + 0xd6, 0xdd, 0xe8, 0xb1, 0xa5, 0xb7, 0xd4, 0xb3, 0x47, 0x60, 0xf7, 0x4b, 0xc4, 0xa7, 0x00, 0x37, + 0xb7, 0x51, 0x34, 0x9f, 0xbd, 0x8d, 0x6e, 0x2f, 0xcf, 0x06, 0xe1, 0x0f, 0x04, 0xf7, 0x33, 0xb6, + 0xd9, 0x97, 0x08, 0x1d, 0xed, 0x26, 0x96, 0x71, 0x8c, 0xbe, 0xbc, 0x28, 0x4a, 0xfe, 0x55, 0xa4, + 0x7e, 0xc6, 0x36, 0x93, 0x82, 0x91, 0x05, 0x2d, 0x76, 0x4f, 0xb1, 0xe2, 0xdb, 0x2a, 0x6f, 0xda, + 0x17, 0x19, 0xe8, 0x4f, 0x95, 0xfe, 0x45, 0xe8, 0x97, 0x61, 0x5e, 0xc5, 0xe1, 0x6f, 0xe3, 0xc9, + 0x95, 0x16, 0x8f, 0xbb, 0xf9, 0x3e, 0xe7, 0x84, 0xbc, 0xa7, 0xec, 0x3b, 0xfd, 0x24, 0x3b, 0x53, + 0x4b, 0x49, 0xbd, 0xfc, 0x17, 0x00, 0x00, 0xff, 0xff, 0xe8, 0x1b, 0x59, 0xf8, 0xe5, 0x02, 0x00, + 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto b/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto new file mode 100644 index 00000000..7d7808e7 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/struct/struct.proto @@ -0,0 +1,96 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/struct;structpb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "StructProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + + +// `Struct` represents a structured data value, consisting of fields +// which map to dynamically typed values. In some languages, `Struct` +// might be supported by a native representation. For example, in +// scripting languages like JS a struct is represented as an +// object. The details of that representation are described together +// with the proto support for the language. +// +// The JSON representation for `Struct` is JSON object. +message Struct { + // Unordered map of dynamically typed values. + map fields = 1; +} + +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of that +// variants, absence of any variant indicates an error. +// +// The JSON representation for `Value` is JSON value. +message Value { + // The kind of value. + oneof kind { + // Represents a null value. + NullValue null_value = 1; + // Represents a double value. + double number_value = 2; + // Represents a string value. + string string_value = 3; + // Represents a boolean value. + bool bool_value = 4; + // Represents a structured value. + Struct struct_value = 5; + // Represents a repeated `Value`. + ListValue list_value = 6; + } +} + +// `NullValue` is a singleton enumeration to represent the null value for the +// `Value` type union. +// +// The JSON representation for `NullValue` is JSON `null`. +enum NullValue { + // Null value. + NULL_VALUE = 0; +} + +// `ListValue` is a wrapper around a repeated field of values. +// +// The JSON representation for `ListValue` is JSON array. +message ListValue { + // Repeated field of dynamically typed values. + repeated Value values = 1; +} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp.go b/vendor/github.com/golang/protobuf/ptypes/timestamp.go new file mode 100644 index 00000000..8da0df01 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/timestamp.go @@ -0,0 +1,132 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package ptypes + +// This file implements operations on google.protobuf.Timestamp. + +import ( + "errors" + "fmt" + "time" + + tspb "github.com/golang/protobuf/ptypes/timestamp" +) + +const ( + // Seconds field of the earliest valid Timestamp. + // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + minValidSeconds = -62135596800 + // Seconds field just after the latest valid Timestamp. + // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + maxValidSeconds = 253402300800 +) + +// validateTimestamp determines whether a Timestamp is valid. +// A valid timestamp represents a time in the range +// [0001-01-01, 10000-01-01) and has a Nanos field +// in the range [0, 1e9). +// +// If the Timestamp is valid, validateTimestamp returns nil. +// Otherwise, it returns an error that describes +// the problem. +// +// Every valid Timestamp can be represented by a time.Time, but the converse is not true. +func validateTimestamp(ts *tspb.Timestamp) error { + if ts == nil { + return errors.New("timestamp: nil Timestamp") + } + if ts.Seconds < minValidSeconds { + return fmt.Errorf("timestamp: %v before 0001-01-01", ts) + } + if ts.Seconds >= maxValidSeconds { + return fmt.Errorf("timestamp: %v after 10000-01-01", ts) + } + if ts.Nanos < 0 || ts.Nanos >= 1e9 { + return fmt.Errorf("timestamp: %v: nanos not in range [0, 1e9)", ts) + } + return nil +} + +// Timestamp converts a google.protobuf.Timestamp proto to a time.Time. +// It returns an error if the argument is invalid. +// +// Unlike most Go functions, if Timestamp returns an error, the first return value +// is not the zero time.Time. Instead, it is the value obtained from the +// time.Unix function when passed the contents of the Timestamp, in the UTC +// locale. This may or may not be a meaningful time; many invalid Timestamps +// do map to valid time.Times. +// +// A nil Timestamp returns an error. The first return value in that case is +// undefined. +func Timestamp(ts *tspb.Timestamp) (time.Time, error) { + // Don't return the zero value on error, because corresponds to a valid + // timestamp. Instead return whatever time.Unix gives us. + var t time.Time + if ts == nil { + t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp + } else { + t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() + } + return t, validateTimestamp(ts) +} + +// TimestampNow returns a google.protobuf.Timestamp for the current time. +func TimestampNow() *tspb.Timestamp { + ts, err := TimestampProto(time.Now()) + if err != nil { + panic("ptypes: time.Now() out of Timestamp range") + } + return ts +} + +// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. +// It returns an error if the resulting Timestamp is invalid. +func TimestampProto(t time.Time) (*tspb.Timestamp, error) { + ts := &tspb.Timestamp{ + Seconds: t.Unix(), + Nanos: int32(t.Nanosecond()), + } + if err := validateTimestamp(ts); err != nil { + return nil, err + } + return ts, nil +} + +// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid +// Timestamps, it returns an error message in parentheses. +func TimestampString(ts *tspb.Timestamp) string { + t, err := Timestamp(ts) + if err != nil { + return fmt.Sprintf("(%v)", err) + } + return t.Format(time.RFC3339Nano) +} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go new file mode 100644 index 00000000..31cd846d --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go @@ -0,0 +1,179 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/timestamp.proto + +package timestamp + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// A Timestamp represents a point in time independent of any time zone +// or calendar, represented as seconds and fractions of seconds at +// nanosecond resolution in UTC Epoch time. It is encoded using the +// Proleptic Gregorian Calendar which extends the Gregorian calendar +// backwards to year one. It is encoded assuming all minutes are 60 +// seconds long, i.e. leap seconds are "smeared" so that no leap second +// table is needed for interpretation. Range is from +// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. +// By restricting to that range, we ensure that we can convert to +// and from RFC 3339 date strings. +// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// +// Example 5: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required. A proto3 JSON serializer should always use UTC (as indicated by +// "Z") when printing the Timestamp type and a proto3 JSON parser should be +// able to accept both UTC and other timezones (as indicated by an offset). +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) +// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one +// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime-- +// ) to obtain a formatter capable of generating timestamps in this format. +// +// +type Timestamp struct { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Timestamp) Reset() { *m = Timestamp{} } +func (m *Timestamp) String() string { return proto.CompactTextString(m) } +func (*Timestamp) ProtoMessage() {} +func (*Timestamp) Descriptor() ([]byte, []int) { + return fileDescriptor_292007bbfe81227e, []int{0} +} + +func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" } + +func (m *Timestamp) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Timestamp.Unmarshal(m, b) +} +func (m *Timestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Timestamp.Marshal(b, m, deterministic) +} +func (m *Timestamp) XXX_Merge(src proto.Message) { + xxx_messageInfo_Timestamp.Merge(m, src) +} +func (m *Timestamp) XXX_Size() int { + return xxx_messageInfo_Timestamp.Size(m) +} +func (m *Timestamp) XXX_DiscardUnknown() { + xxx_messageInfo_Timestamp.DiscardUnknown(m) +} + +var xxx_messageInfo_Timestamp proto.InternalMessageInfo + +func (m *Timestamp) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Timestamp) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func init() { + proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp") +} + +func init() { proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_292007bbfe81227e) } + +var fileDescriptor_292007bbfe81227e = []byte{ + // 191 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d, + 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x03, 0x0b, 0x09, 0xf1, 0x43, 0x14, 0xe8, 0xc1, 0x14, 0x28, + 0x59, 0x73, 0x71, 0x86, 0xc0, 0xd4, 0x08, 0x49, 0x70, 0xb1, 0x17, 0xa7, 0x26, 0xe7, 0xe7, 0xa5, + 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0xc1, 0xb8, 0x42, 0x22, 0x5c, 0xac, 0x79, 0x89, + 0x79, 0xf9, 0xc5, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x53, 0x1d, 0x97, 0x70, + 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0x99, 0x4e, 0x7c, 0x70, 0x13, 0x03, 0x40, 0x42, 0x01, 0x8c, 0x51, + 0xda, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xe9, 0xf9, 0x39, 0x89, + 0x79, 0xe9, 0x08, 0x27, 0x16, 0x94, 0x54, 0x16, 0xa4, 0x16, 0x23, 0x5c, 0xfa, 0x83, 0x91, 0x71, + 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, 0xc9, 0x01, 0x50, 0xb5, 0x7a, + 0xe1, 0xa9, 0x39, 0x39, 0xde, 0x79, 0xf9, 0xe5, 0x79, 0x21, 0x20, 0x3d, 0x49, 0x6c, 0x60, 0x43, + 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x77, 0x4a, 0x07, 0xf7, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto new file mode 100644 index 00000000..eafb3fa0 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto @@ -0,0 +1,135 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/timestamp"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "TimestampProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// A Timestamp represents a point in time independent of any time zone +// or calendar, represented as seconds and fractions of seconds at +// nanosecond resolution in UTC Epoch time. It is encoded using the +// Proleptic Gregorian Calendar which extends the Gregorian calendar +// backwards to year one. It is encoded assuming all minutes are 60 +// seconds long, i.e. leap seconds are "smeared" so that no leap second +// table is needed for interpretation. Range is from +// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. +// By restricting to that range, we ensure that we can convert to +// and from RFC 3339 date strings. +// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// +// Example 5: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required. A proto3 JSON serializer should always use UTC (as indicated by +// "Z") when printing the Timestamp type and a proto3 JSON parser should be +// able to accept both UTC and other timezones (as indicated by an offset). +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) +// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one +// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime-- +// ) to obtain a formatter capable of generating timestamps in this format. +// +// +message Timestamp { + + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + int64 seconds = 1; + + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + int32 nanos = 2; +} diff --git a/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go b/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go new file mode 100644 index 00000000..add19a1a --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go @@ -0,0 +1,461 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/wrappers.proto + +package wrappers + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// Wrapper message for `double`. +// +// The JSON representation for `DoubleValue` is JSON number. +type DoubleValue struct { + // The double value. + Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DoubleValue) Reset() { *m = DoubleValue{} } +func (m *DoubleValue) String() string { return proto.CompactTextString(m) } +func (*DoubleValue) ProtoMessage() {} +func (*DoubleValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{0} +} + +func (*DoubleValue) XXX_WellKnownType() string { return "DoubleValue" } + +func (m *DoubleValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DoubleValue.Unmarshal(m, b) +} +func (m *DoubleValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DoubleValue.Marshal(b, m, deterministic) +} +func (m *DoubleValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_DoubleValue.Merge(m, src) +} +func (m *DoubleValue) XXX_Size() int { + return xxx_messageInfo_DoubleValue.Size(m) +} +func (m *DoubleValue) XXX_DiscardUnknown() { + xxx_messageInfo_DoubleValue.DiscardUnknown(m) +} + +var xxx_messageInfo_DoubleValue proto.InternalMessageInfo + +func (m *DoubleValue) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `float`. +// +// The JSON representation for `FloatValue` is JSON number. +type FloatValue struct { + // The float value. + Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FloatValue) Reset() { *m = FloatValue{} } +func (m *FloatValue) String() string { return proto.CompactTextString(m) } +func (*FloatValue) ProtoMessage() {} +func (*FloatValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{1} +} + +func (*FloatValue) XXX_WellKnownType() string { return "FloatValue" } + +func (m *FloatValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FloatValue.Unmarshal(m, b) +} +func (m *FloatValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FloatValue.Marshal(b, m, deterministic) +} +func (m *FloatValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_FloatValue.Merge(m, src) +} +func (m *FloatValue) XXX_Size() int { + return xxx_messageInfo_FloatValue.Size(m) +} +func (m *FloatValue) XXX_DiscardUnknown() { + xxx_messageInfo_FloatValue.DiscardUnknown(m) +} + +var xxx_messageInfo_FloatValue proto.InternalMessageInfo + +func (m *FloatValue) GetValue() float32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `int64`. +// +// The JSON representation for `Int64Value` is JSON string. +type Int64Value struct { + // The int64 value. + Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Int64Value) Reset() { *m = Int64Value{} } +func (m *Int64Value) String() string { return proto.CompactTextString(m) } +func (*Int64Value) ProtoMessage() {} +func (*Int64Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{2} +} + +func (*Int64Value) XXX_WellKnownType() string { return "Int64Value" } + +func (m *Int64Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Int64Value.Unmarshal(m, b) +} +func (m *Int64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Int64Value.Marshal(b, m, deterministic) +} +func (m *Int64Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Int64Value.Merge(m, src) +} +func (m *Int64Value) XXX_Size() int { + return xxx_messageInfo_Int64Value.Size(m) +} +func (m *Int64Value) XXX_DiscardUnknown() { + xxx_messageInfo_Int64Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Int64Value proto.InternalMessageInfo + +func (m *Int64Value) GetValue() int64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `uint64`. +// +// The JSON representation for `UInt64Value` is JSON string. +type UInt64Value struct { + // The uint64 value. + Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UInt64Value) Reset() { *m = UInt64Value{} } +func (m *UInt64Value) String() string { return proto.CompactTextString(m) } +func (*UInt64Value) ProtoMessage() {} +func (*UInt64Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{3} +} + +func (*UInt64Value) XXX_WellKnownType() string { return "UInt64Value" } + +func (m *UInt64Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UInt64Value.Unmarshal(m, b) +} +func (m *UInt64Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UInt64Value.Marshal(b, m, deterministic) +} +func (m *UInt64Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_UInt64Value.Merge(m, src) +} +func (m *UInt64Value) XXX_Size() int { + return xxx_messageInfo_UInt64Value.Size(m) +} +func (m *UInt64Value) XXX_DiscardUnknown() { + xxx_messageInfo_UInt64Value.DiscardUnknown(m) +} + +var xxx_messageInfo_UInt64Value proto.InternalMessageInfo + +func (m *UInt64Value) GetValue() uint64 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `int32`. +// +// The JSON representation for `Int32Value` is JSON number. +type Int32Value struct { + // The int32 value. + Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Int32Value) Reset() { *m = Int32Value{} } +func (m *Int32Value) String() string { return proto.CompactTextString(m) } +func (*Int32Value) ProtoMessage() {} +func (*Int32Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{4} +} + +func (*Int32Value) XXX_WellKnownType() string { return "Int32Value" } + +func (m *Int32Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Int32Value.Unmarshal(m, b) +} +func (m *Int32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Int32Value.Marshal(b, m, deterministic) +} +func (m *Int32Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_Int32Value.Merge(m, src) +} +func (m *Int32Value) XXX_Size() int { + return xxx_messageInfo_Int32Value.Size(m) +} +func (m *Int32Value) XXX_DiscardUnknown() { + xxx_messageInfo_Int32Value.DiscardUnknown(m) +} + +var xxx_messageInfo_Int32Value proto.InternalMessageInfo + +func (m *Int32Value) GetValue() int32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `uint32`. +// +// The JSON representation for `UInt32Value` is JSON number. +type UInt32Value struct { + // The uint32 value. + Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UInt32Value) Reset() { *m = UInt32Value{} } +func (m *UInt32Value) String() string { return proto.CompactTextString(m) } +func (*UInt32Value) ProtoMessage() {} +func (*UInt32Value) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{5} +} + +func (*UInt32Value) XXX_WellKnownType() string { return "UInt32Value" } + +func (m *UInt32Value) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UInt32Value.Unmarshal(m, b) +} +func (m *UInt32Value) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UInt32Value.Marshal(b, m, deterministic) +} +func (m *UInt32Value) XXX_Merge(src proto.Message) { + xxx_messageInfo_UInt32Value.Merge(m, src) +} +func (m *UInt32Value) XXX_Size() int { + return xxx_messageInfo_UInt32Value.Size(m) +} +func (m *UInt32Value) XXX_DiscardUnknown() { + xxx_messageInfo_UInt32Value.DiscardUnknown(m) +} + +var xxx_messageInfo_UInt32Value proto.InternalMessageInfo + +func (m *UInt32Value) GetValue() uint32 { + if m != nil { + return m.Value + } + return 0 +} + +// Wrapper message for `bool`. +// +// The JSON representation for `BoolValue` is JSON `true` and `false`. +type BoolValue struct { + // The bool value. + Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BoolValue) Reset() { *m = BoolValue{} } +func (m *BoolValue) String() string { return proto.CompactTextString(m) } +func (*BoolValue) ProtoMessage() {} +func (*BoolValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{6} +} + +func (*BoolValue) XXX_WellKnownType() string { return "BoolValue" } + +func (m *BoolValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BoolValue.Unmarshal(m, b) +} +func (m *BoolValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BoolValue.Marshal(b, m, deterministic) +} +func (m *BoolValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_BoolValue.Merge(m, src) +} +func (m *BoolValue) XXX_Size() int { + return xxx_messageInfo_BoolValue.Size(m) +} +func (m *BoolValue) XXX_DiscardUnknown() { + xxx_messageInfo_BoolValue.DiscardUnknown(m) +} + +var xxx_messageInfo_BoolValue proto.InternalMessageInfo + +func (m *BoolValue) GetValue() bool { + if m != nil { + return m.Value + } + return false +} + +// Wrapper message for `string`. +// +// The JSON representation for `StringValue` is JSON string. +type StringValue struct { + // The string value. + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StringValue) Reset() { *m = StringValue{} } +func (m *StringValue) String() string { return proto.CompactTextString(m) } +func (*StringValue) ProtoMessage() {} +func (*StringValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{7} +} + +func (*StringValue) XXX_WellKnownType() string { return "StringValue" } + +func (m *StringValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_StringValue.Unmarshal(m, b) +} +func (m *StringValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_StringValue.Marshal(b, m, deterministic) +} +func (m *StringValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_StringValue.Merge(m, src) +} +func (m *StringValue) XXX_Size() int { + return xxx_messageInfo_StringValue.Size(m) +} +func (m *StringValue) XXX_DiscardUnknown() { + xxx_messageInfo_StringValue.DiscardUnknown(m) +} + +var xxx_messageInfo_StringValue proto.InternalMessageInfo + +func (m *StringValue) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// Wrapper message for `bytes`. +// +// The JSON representation for `BytesValue` is JSON string. +type BytesValue struct { + // The bytes value. + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BytesValue) Reset() { *m = BytesValue{} } +func (m *BytesValue) String() string { return proto.CompactTextString(m) } +func (*BytesValue) ProtoMessage() {} +func (*BytesValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5377b62bda767935, []int{8} +} + +func (*BytesValue) XXX_WellKnownType() string { return "BytesValue" } + +func (m *BytesValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BytesValue.Unmarshal(m, b) +} +func (m *BytesValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BytesValue.Marshal(b, m, deterministic) +} +func (m *BytesValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_BytesValue.Merge(m, src) +} +func (m *BytesValue) XXX_Size() int { + return xxx_messageInfo_BytesValue.Size(m) +} +func (m *BytesValue) XXX_DiscardUnknown() { + xxx_messageInfo_BytesValue.DiscardUnknown(m) +} + +var xxx_messageInfo_BytesValue proto.InternalMessageInfo + +func (m *BytesValue) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*DoubleValue)(nil), "google.protobuf.DoubleValue") + proto.RegisterType((*FloatValue)(nil), "google.protobuf.FloatValue") + proto.RegisterType((*Int64Value)(nil), "google.protobuf.Int64Value") + proto.RegisterType((*UInt64Value)(nil), "google.protobuf.UInt64Value") + proto.RegisterType((*Int32Value)(nil), "google.protobuf.Int32Value") + proto.RegisterType((*UInt32Value)(nil), "google.protobuf.UInt32Value") + proto.RegisterType((*BoolValue)(nil), "google.protobuf.BoolValue") + proto.RegisterType((*StringValue)(nil), "google.protobuf.StringValue") + proto.RegisterType((*BytesValue)(nil), "google.protobuf.BytesValue") +} + +func init() { proto.RegisterFile("google/protobuf/wrappers.proto", fileDescriptor_5377b62bda767935) } + +var fileDescriptor_5377b62bda767935 = []byte{ + // 259 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x2f, 0x4a, 0x2c, + 0x28, 0x48, 0x2d, 0x2a, 0xd6, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0xca, + 0x5c, 0xdc, 0x2e, 0xf9, 0xa5, 0x49, 0x39, 0xa9, 0x61, 0x89, 0x39, 0xa5, 0xa9, 0x42, 0x22, 0x5c, + 0xac, 0x65, 0x20, 0x86, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x63, 0x10, 0x84, 0xa3, 0xa4, 0xc4, 0xc5, + 0xe5, 0x96, 0x93, 0x9f, 0x58, 0x82, 0x45, 0x0d, 0x13, 0x92, 0x1a, 0xcf, 0xbc, 0x12, 0x33, 0x13, + 0x2c, 0x6a, 0x98, 0x61, 0x6a, 0x94, 0xb9, 0xb8, 0x43, 0x71, 0x29, 0x62, 0x41, 0x35, 0xc8, 0xd8, + 0x08, 0x8b, 0x1a, 0x56, 0x34, 0x83, 0xb0, 0x2a, 0xe2, 0x85, 0x29, 0x52, 0xe4, 0xe2, 0x74, 0xca, + 0xcf, 0xcf, 0xc1, 0xa2, 0x84, 0x03, 0xc9, 0x9c, 0xe0, 0x92, 0xa2, 0xcc, 0xbc, 0x74, 0x2c, 0x8a, + 0x38, 0x91, 0x1c, 0xe4, 0x54, 0x59, 0x92, 0x5a, 0x8c, 0x45, 0x0d, 0x0f, 0x54, 0x8d, 0x53, 0x0d, + 0x97, 0x70, 0x72, 0x7e, 0xae, 0x1e, 0x5a, 0xe8, 0x3a, 0xf1, 0x86, 0x43, 0x83, 0x3f, 0x00, 0x24, + 0x12, 0xc0, 0x18, 0xa5, 0x95, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x9f, + 0x9e, 0x9f, 0x93, 0x98, 0x97, 0x8e, 0x88, 0xaa, 0x82, 0x92, 0xca, 0x82, 0xd4, 0x62, 0x78, 0x8c, + 0xfd, 0x60, 0x64, 0x5c, 0xc4, 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, + 0x00, 0x54, 0xa9, 0x5e, 0x78, 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, + 0x12, 0x1b, 0xd8, 0x0c, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0x6c, 0xb9, 0xb8, 0xfe, + 0x01, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto b/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto new file mode 100644 index 00000000..01947639 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.proto @@ -0,0 +1,118 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Wrappers for primitive (non-message) types. These types are useful +// for embedding primitives in the `google.protobuf.Any` type and for places +// where we need to distinguish between the absence of a primitive +// typed field and its default value. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; +option go_package = "github.com/golang/protobuf/ptypes/wrappers"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "WrappersProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; + +// Wrapper message for `double`. +// +// The JSON representation for `DoubleValue` is JSON number. +message DoubleValue { + // The double value. + double value = 1; +} + +// Wrapper message for `float`. +// +// The JSON representation for `FloatValue` is JSON number. +message FloatValue { + // The float value. + float value = 1; +} + +// Wrapper message for `int64`. +// +// The JSON representation for `Int64Value` is JSON string. +message Int64Value { + // The int64 value. + int64 value = 1; +} + +// Wrapper message for `uint64`. +// +// The JSON representation for `UInt64Value` is JSON string. +message UInt64Value { + // The uint64 value. + uint64 value = 1; +} + +// Wrapper message for `int32`. +// +// The JSON representation for `Int32Value` is JSON number. +message Int32Value { + // The int32 value. + int32 value = 1; +} + +// Wrapper message for `uint32`. +// +// The JSON representation for `UInt32Value` is JSON number. +message UInt32Value { + // The uint32 value. + uint32 value = 1; +} + +// Wrapper message for `bool`. +// +// The JSON representation for `BoolValue` is JSON `true` and `false`. +message BoolValue { + // The bool value. + bool value = 1; +} + +// Wrapper message for `string`. +// +// The JSON representation for `StringValue` is JSON string. +message StringValue { + // The string value. + string value = 1; +} + +// Wrapper message for `bytes`. +// +// The JSON representation for `BytesValue` is JSON string. +message BytesValue { + // The bytes value. + bytes value = 1; +} diff --git a/vendor/github.com/golang/snappy/go.mod b/vendor/github.com/golang/snappy/go.mod new file mode 100644 index 00000000..f6406bb2 --- /dev/null +++ b/vendor/github.com/golang/snappy/go.mod @@ -0,0 +1 @@ +module github.com/golang/snappy diff --git a/vendor/github.com/google/uuid/README.md b/vendor/github.com/google/uuid/README.md index f765a46f..9d92c11f 100644 --- a/vendor/github.com/google/uuid/README.md +++ b/vendor/github.com/google/uuid/README.md @@ -16,4 +16,4 @@ change is the ability to represent an invalid UUID (vs a NIL UUID). Full `go doc` style documentation for the package can be viewed online without installing this package by using the GoDoc site here: -http://pkg.go.dev/github.com/google/uuid +http://godoc.org/github.com/google/uuid diff --git a/vendor/github.com/google/uuid/marshal.go b/vendor/github.com/google/uuid/marshal.go index 14bd3407..7f9e0c6c 100644 --- a/vendor/github.com/google/uuid/marshal.go +++ b/vendor/github.com/google/uuid/marshal.go @@ -16,11 +16,10 @@ func (uuid UUID) MarshalText() ([]byte, error) { // UnmarshalText implements encoding.TextUnmarshaler. func (uuid *UUID) UnmarshalText(data []byte) error { id, err := ParseBytes(data) - if err != nil { - return err + if err == nil { + *uuid = id } - *uuid = id - return nil + return err } // MarshalBinary implements encoding.BinaryMarshaler. diff --git a/vendor/github.com/google/uuid/version1.go b/vendor/github.com/google/uuid/version1.go index 46310962..199a1ac6 100644 --- a/vendor/github.com/google/uuid/version1.go +++ b/vendor/github.com/google/uuid/version1.go @@ -17,6 +17,12 @@ import ( // // In most cases, New should be used. func NewUUID() (UUID, error) { + nodeMu.Lock() + if nodeID == zeroID { + setNodeInterface("") + } + nodeMu.Unlock() + var uuid UUID now, seq, err := GetTime() if err != nil { @@ -32,13 +38,7 @@ func NewUUID() (UUID, error) { binary.BigEndian.PutUint16(uuid[4:], timeMid) binary.BigEndian.PutUint16(uuid[6:], timeHi) binary.BigEndian.PutUint16(uuid[8:], seq) - - nodeMu.Lock() - if nodeID == zeroID { - setNodeInterface("") - } copy(uuid[10:], nodeID[:]) - nodeMu.Unlock() return uuid, nil } diff --git a/vendor/github.com/google/uuid/version4.go b/vendor/github.com/google/uuid/version4.go index c110465d..9ad1abad 100644 --- a/vendor/github.com/google/uuid/version4.go +++ b/vendor/github.com/google/uuid/version4.go @@ -30,7 +30,6 @@ func NewRandom() (UUID, error) { return NewRandomFromReader(rander) } -// NewRandomFromReader returns a UUID based on bytes read from a given io.Reader. func NewRandomFromReader(r io.Reader) (UUID, error) { var uuid UUID _, err := io.ReadFull(r, uuid[:]) @@ -41,3 +40,4 @@ func NewRandomFromReader(r io.Reader) (UUID, error) { uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 return uuid, nil } + diff --git a/vendor/github.com/gorilla/context/.travis.yml b/vendor/github.com/gorilla/context/.travis.yml deleted file mode 100644 index 6f440f1e..00000000 --- a/vendor/github.com/gorilla/context/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: go -sudo: false - -matrix: - include: - - go: 1.3 - - go: 1.4 - - go: 1.5 - - go: 1.6 - - go: 1.7 - - go: tip - allow_failures: - - go: tip - -script: - - go get -t -v ./... - - diff -u <(echo -n) <(gofmt -d .) - - go vet $(go list ./... | grep -v /vendor/) - - go test -v -race ./... diff --git a/vendor/github.com/gorilla/context/README.md b/vendor/github.com/gorilla/context/README.md deleted file mode 100644 index 08f86693..00000000 --- a/vendor/github.com/gorilla/context/README.md +++ /dev/null @@ -1,10 +0,0 @@ -context -======= -[![Build Status](https://travis-ci.org/gorilla/context.png?branch=master)](https://travis-ci.org/gorilla/context) - -gorilla/context is a general purpose registry for global request variables. - -> Note: gorilla/context, having been born well before `context.Context` existed, does not play well -> with the shallow copying of the request that [`http.Request.WithContext`](https://golang.org/pkg/net/http/#Request.WithContext) (added to net/http Go 1.7 onwards) performs. You should either use *just* gorilla/context, or moving forward, the new `http.Request.Context()`. - -Read the full documentation here: http://www.gorillatoolkit.org/pkg/context diff --git a/vendor/github.com/gorilla/context/context.go b/vendor/github.com/gorilla/context/context.go deleted file mode 100644 index 81cb128b..00000000 --- a/vendor/github.com/gorilla/context/context.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2012 The Gorilla 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 context - -import ( - "net/http" - "sync" - "time" -) - -var ( - mutex sync.RWMutex - data = make(map[*http.Request]map[interface{}]interface{}) - datat = make(map[*http.Request]int64) -) - -// Set stores a value for a given key in a given request. -func Set(r *http.Request, key, val interface{}) { - mutex.Lock() - if data[r] == nil { - data[r] = make(map[interface{}]interface{}) - datat[r] = time.Now().Unix() - } - data[r][key] = val - mutex.Unlock() -} - -// Get returns a value stored for a given key in a given request. -func Get(r *http.Request, key interface{}) interface{} { - mutex.RLock() - if ctx := data[r]; ctx != nil { - value := ctx[key] - mutex.RUnlock() - return value - } - mutex.RUnlock() - return nil -} - -// GetOk returns stored value and presence state like multi-value return of map access. -func GetOk(r *http.Request, key interface{}) (interface{}, bool) { - mutex.RLock() - if _, ok := data[r]; ok { - value, ok := data[r][key] - mutex.RUnlock() - return value, ok - } - mutex.RUnlock() - return nil, false -} - -// GetAll returns all stored values for the request as a map. Nil is returned for invalid requests. -func GetAll(r *http.Request) map[interface{}]interface{} { - mutex.RLock() - if context, ok := data[r]; ok { - result := make(map[interface{}]interface{}, len(context)) - for k, v := range context { - result[k] = v - } - mutex.RUnlock() - return result - } - mutex.RUnlock() - return nil -} - -// GetAllOk returns all stored values for the request as a map and a boolean value that indicates if -// the request was registered. -func GetAllOk(r *http.Request) (map[interface{}]interface{}, bool) { - mutex.RLock() - context, ok := data[r] - result := make(map[interface{}]interface{}, len(context)) - for k, v := range context { - result[k] = v - } - mutex.RUnlock() - return result, ok -} - -// Delete removes a value stored for a given key in a given request. -func Delete(r *http.Request, key interface{}) { - mutex.Lock() - if data[r] != nil { - delete(data[r], key) - } - mutex.Unlock() -} - -// Clear removes all values stored for a given request. -// -// This is usually called by a handler wrapper to clean up request -// variables at the end of a request lifetime. See ClearHandler(). -func Clear(r *http.Request) { - mutex.Lock() - clear(r) - mutex.Unlock() -} - -// clear is Clear without the lock. -func clear(r *http.Request) { - delete(data, r) - delete(datat, r) -} - -// Purge removes request data stored for longer than maxAge, in seconds. -// It returns the amount of requests removed. -// -// If maxAge <= 0, all request data is removed. -// -// This is only used for sanity check: in case context cleaning was not -// properly set some request data can be kept forever, consuming an increasing -// amount of memory. In case this is detected, Purge() must be called -// periodically until the problem is fixed. -func Purge(maxAge int) int { - mutex.Lock() - count := 0 - if maxAge <= 0 { - count = len(data) - data = make(map[*http.Request]map[interface{}]interface{}) - datat = make(map[*http.Request]int64) - } else { - min := time.Now().Unix() - int64(maxAge) - for r := range data { - if datat[r] < min { - clear(r) - count++ - } - } - } - mutex.Unlock() - return count -} - -// ClearHandler wraps an http.Handler and clears request values at the end -// of a request lifetime. -func ClearHandler(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer Clear(r) - h.ServeHTTP(w, r) - }) -} diff --git a/vendor/github.com/gorilla/context/doc.go b/vendor/github.com/gorilla/context/doc.go deleted file mode 100644 index 448d1bfc..00000000 --- a/vendor/github.com/gorilla/context/doc.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2012 The Gorilla 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 context stores values shared during a request lifetime. - -Note: gorilla/context, having been born well before `context.Context` existed, -does not play well > with the shallow copying of the request that -[`http.Request.WithContext`](https://golang.org/pkg/net/http/#Request.WithContext) -(added to net/http Go 1.7 onwards) performs. You should either use *just* -gorilla/context, or moving forward, the new `http.Request.Context()`. - -For example, a router can set variables extracted from the URL and later -application handlers can access those values, or it can be used to store -sessions values to be saved at the end of a request. There are several -others common uses. - -The idea was posted by Brad Fitzpatrick to the go-nuts mailing list: - - http://groups.google.com/group/golang-nuts/msg/e2d679d303aa5d53 - -Here's the basic usage: first define the keys that you will need. The key -type is interface{} so a key can be of any type that supports equality. -Here we define a key using a custom int type to avoid name collisions: - - package foo - - import ( - "github.com/gorilla/context" - ) - - type key int - - const MyKey key = 0 - -Then set a variable. Variables are bound to an http.Request object, so you -need a request instance to set a value: - - context.Set(r, MyKey, "bar") - -The application can later access the variable using the same key you provided: - - func MyHandler(w http.ResponseWriter, r *http.Request) { - // val is "bar". - val := context.Get(r, foo.MyKey) - - // returns ("bar", true) - val, ok := context.GetOk(r, foo.MyKey) - // ... - } - -And that's all about the basic usage. We discuss some other ideas below. - -Any type can be stored in the context. To enforce a given type, make the key -private and wrap Get() and Set() to accept and return values of a specific -type: - - type key int - - const mykey key = 0 - - // GetMyKey returns a value for this package from the request values. - func GetMyKey(r *http.Request) SomeType { - if rv := context.Get(r, mykey); rv != nil { - return rv.(SomeType) - } - return nil - } - - // SetMyKey sets a value for this package in the request values. - func SetMyKey(r *http.Request, val SomeType) { - context.Set(r, mykey, val) - } - -Variables must be cleared at the end of a request, to remove all values -that were stored. This can be done in an http.Handler, after a request was -served. Just call Clear() passing the request: - - context.Clear(r) - -...or use ClearHandler(), which conveniently wraps an http.Handler to clear -variables at the end of a request lifetime. - -The Routers from the packages gorilla/mux and gorilla/pat call Clear() -so if you are using either of them you don't need to clear the context manually. -*/ -package context diff --git a/vendor/github.com/gorilla/mux/.travis.yml b/vendor/github.com/gorilla/mux/.travis.yml deleted file mode 100644 index ad0935db..00000000 --- a/vendor/github.com/gorilla/mux/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: go -sudo: false - -matrix: - include: - - go: 1.5.x - - go: 1.6.x - - go: 1.7.x - - go: 1.8.x - - go: 1.9.x - - go: 1.10.x - - go: tip - allow_failures: - - go: tip - -install: - - # Skip - -script: - - go get -t -v ./... - - diff -u <(echo -n) <(gofmt -d .) - - go tool vet . - - go test -v -race ./... diff --git a/vendor/github.com/gorilla/mux/AUTHORS b/vendor/github.com/gorilla/mux/AUTHORS new file mode 100644 index 00000000..b722392e --- /dev/null +++ b/vendor/github.com/gorilla/mux/AUTHORS @@ -0,0 +1,8 @@ +# This is the official list of gorilla/mux authors for copyright purposes. +# +# Please keep the list sorted. + +Google LLC (https://opensource.google.com/) +Kamil Kisielk +Matt Silverlock +Rodrigo Moraes (https://github.com/moraes) diff --git a/vendor/github.com/gorilla/mux/ISSUE_TEMPLATE.md b/vendor/github.com/gorilla/mux/ISSUE_TEMPLATE.md deleted file mode 100644 index 232be82e..00000000 --- a/vendor/github.com/gorilla/mux/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,11 +0,0 @@ -**What version of Go are you running?** (Paste the output of `go version`) - - -**What version of gorilla/mux are you at?** (Paste the output of `git rev-parse HEAD` inside `$GOPATH/src/github.com/gorilla/mux`) - - -**Describe your problem** (and what you have tried so far) - - -**Paste a minimal, runnable, reproduction of your issue below** (use backticks to format it) - diff --git a/vendor/github.com/gorilla/mux/LICENSE b/vendor/github.com/gorilla/mux/LICENSE index 0e5fb872..6903df63 100644 --- a/vendor/github.com/gorilla/mux/LICENSE +++ b/vendor/github.com/gorilla/mux/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2012 Rodrigo Moraes. All rights reserved. +Copyright (c) 2012-2018 The Gorilla Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/vendor/github.com/gorilla/mux/README.md b/vendor/github.com/gorilla/mux/README.md index e424397a..92e422ee 100644 --- a/vendor/github.com/gorilla/mux/README.md +++ b/vendor/github.com/gorilla/mux/README.md @@ -2,11 +2,12 @@ [![GoDoc](https://godoc.org/github.com/gorilla/mux?status.svg)](https://godoc.org/github.com/gorilla/mux) [![Build Status](https://travis-ci.org/gorilla/mux.svg?branch=master)](https://travis-ci.org/gorilla/mux) +[![CircleCI](https://circleci.com/gh/gorilla/mux.svg?style=svg)](https://circleci.com/gh/gorilla/mux) [![Sourcegraph](https://sourcegraph.com/github.com/gorilla/mux/-/badge.svg)](https://sourcegraph.com/github.com/gorilla/mux?badge) ![Gorilla Logo](http://www.gorillatoolkit.org/static/images/gorilla-icon-64.png) -http://www.gorillatoolkit.org/pkg/mux +https://www.gorillatoolkit.org/pkg/mux Package `gorilla/mux` implements a request router and dispatcher for matching incoming requests to their respective handler. @@ -29,6 +30,7 @@ The name mux stands for "HTTP request multiplexer". Like the standard `http.Serv * [Walking Routes](#walking-routes) * [Graceful Shutdown](#graceful-shutdown) * [Middleware](#middleware) +* [Handling CORS Requests](#handling-cors-requests) * [Testing Handlers](#testing-handlers) * [Full Example](#full-example) @@ -88,7 +90,7 @@ r := mux.NewRouter() // Only matches if domain is "www.example.com". r.Host("www.example.com") // Matches a dynamic subdomain. -r.Host("{subdomain:[a-z]+}.domain.com") +r.Host("{subdomain:[a-z]+}.example.com") ``` There are several other matchers that can be added. To match path prefixes: @@ -238,13 +240,13 @@ This also works for host and query value variables: ```go r := mux.NewRouter() -r.Host("{subdomain}.domain.com"). +r.Host("{subdomain}.example.com"). Path("/articles/{category}/{id:[0-9]+}"). Queries("filter", "{filter}"). HandlerFunc(ArticleHandler). Name("article") -// url.String() will be "http://news.domain.com/articles/technology/42?filter=gorilla" +// url.String() will be "http://news.example.com/articles/technology/42?filter=gorilla" url, err := r.Get("article").URL("subdomain", "news", "category", "technology", "id", "42", @@ -264,7 +266,7 @@ r.HeadersRegexp("Content-Type", "application/(text|json)") There's also a way to build only the URL host or path for a route: use the methods `URLHost()` or `URLPath()` instead. For the previous route, we would do: ```go -// "http://news.domain.com/" +// "http://news.example.com/" host, err := r.Get("article").URLHost("subdomain", "news") // "/articles/technology/42" @@ -275,12 +277,12 @@ And if you use subrouters, host and path defined separately can be built as well ```go r := mux.NewRouter() -s := r.Host("{subdomain}.domain.com").Subrouter() +s := r.Host("{subdomain}.example.com").Subrouter() s.Path("/articles/{category}/{id:[0-9]+}"). HandlerFunc(ArticleHandler). Name("article") -// "http://news.domain.com/articles/technology/42" +// "http://news.example.com/articles/technology/42" url, err := r.Get("article").URL("subdomain", "news", "category", "technology", "id", "42") @@ -491,6 +493,73 @@ r.Use(amw.Middleware) Note: The handler chain will be stopped if your middleware doesn't call `next.ServeHTTP()` with the corresponding parameters. This can be used to abort a request if the middleware writer wants to. Middlewares _should_ write to `ResponseWriter` if they _are_ going to terminate the request, and they _should not_ write to `ResponseWriter` if they _are not_ going to terminate it. +### Handling CORS Requests + +[CORSMethodMiddleware](https://godoc.org/github.com/gorilla/mux#CORSMethodMiddleware) intends to make it easier to strictly set the `Access-Control-Allow-Methods` response header. + +* You will still need to use your own CORS handler to set the other CORS headers such as `Access-Control-Allow-Origin` +* The middleware will set the `Access-Control-Allow-Methods` header to all the method matchers (e.g. `r.Methods(http.MethodGet, http.MethodPut, http.MethodOptions)` -> `Access-Control-Allow-Methods: GET,PUT,OPTIONS`) on a route +* If you do not specify any methods, then: +> _Important_: there must be an `OPTIONS` method matcher for the middleware to set the headers. + +Here is an example of using `CORSMethodMiddleware` along with a custom `OPTIONS` handler to set all the required CORS headers: + +```go +package main + +import ( + "net/http" + "github.com/gorilla/mux" +) + +func main() { + r := mux.NewRouter() + + // IMPORTANT: you must specify an OPTIONS method matcher for the middleware to set CORS headers + r.HandleFunc("/foo", fooHandler).Methods(http.MethodGet, http.MethodPut, http.MethodPatch, http.MethodOptions) + r.Use(mux.CORSMethodMiddleware(r)) + + http.ListenAndServe(":8080", r) +} + +func fooHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", "*") + if r.Method == http.MethodOptions { + return + } + + w.Write([]byte("foo")) +} +``` + +And an request to `/foo` using something like: + +```bash +curl localhost:8080/foo -v +``` + +Would look like: + +```bash +* Trying ::1... +* TCP_NODELAY set +* Connected to localhost (::1) port 8080 (#0) +> GET /foo HTTP/1.1 +> Host: localhost:8080 +> User-Agent: curl/7.59.0 +> Accept: */* +> +< HTTP/1.1 200 OK +< Access-Control-Allow-Methods: GET,PUT,PATCH,OPTIONS +< Access-Control-Allow-Origin: * +< Date: Fri, 28 Jun 2019 20:13:30 GMT +< Content-Length: 3 +< Content-Type: text/plain; charset=utf-8 +< +* Connection #0 to host localhost left intact +foo +``` + ### Testing Handlers Testing handlers in a Go web application is straightforward, and _mux_ doesn't complicate this any further. Given two files: `endpoints.go` and `endpoints_test.go`, here's how we'd test an application using _mux_. @@ -503,8 +572,8 @@ package main func HealthCheckHandler(w http.ResponseWriter, r *http.Request) { // A very simple health check. - w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) // In the future we could report back on the status of our DB, or our cache // (e.g. Redis) by performing a simple PING, and include them in the response. diff --git a/vendor/github.com/gorilla/mux/context_native.go b/vendor/github.com/gorilla/mux/context.go similarity index 82% rename from vendor/github.com/gorilla/mux/context_native.go rename to vendor/github.com/gorilla/mux/context.go index 209cbea7..665940a2 100644 --- a/vendor/github.com/gorilla/mux/context_native.go +++ b/vendor/github.com/gorilla/mux/context.go @@ -1,5 +1,3 @@ -// +build go1.7 - package mux import ( @@ -18,7 +16,3 @@ func contextSet(r *http.Request, key, val interface{}) *http.Request { return r.WithContext(context.WithValue(r.Context(), key, val)) } - -func contextClear(r *http.Request) { - return -} diff --git a/vendor/github.com/gorilla/mux/context_gorilla.go b/vendor/github.com/gorilla/mux/context_gorilla.go deleted file mode 100644 index d7adaa8f..00000000 --- a/vendor/github.com/gorilla/mux/context_gorilla.go +++ /dev/null @@ -1,26 +0,0 @@ -// +build !go1.7 - -package mux - -import ( - "net/http" - - "github.com/gorilla/context" -) - -func contextGet(r *http.Request, key interface{}) interface{} { - return context.Get(r, key) -} - -func contextSet(r *http.Request, key, val interface{}) *http.Request { - if val == nil { - return r - } - - context.Set(r, key, val) - return r -} - -func contextClear(r *http.Request) { - context.Clear(r) -} diff --git a/vendor/github.com/gorilla/mux/doc.go b/vendor/github.com/gorilla/mux/doc.go index 38957dee..bd5a38b5 100644 --- a/vendor/github.com/gorilla/mux/doc.go +++ b/vendor/github.com/gorilla/mux/doc.go @@ -295,7 +295,7 @@ A more complex authentication middleware, which maps session token to users, cou r := mux.NewRouter() r.HandleFunc("/", handler) - amw := authenticationMiddleware{} + amw := authenticationMiddleware{tokenUsers: make(map[string]string)} amw.Populate() r.Use(amw.Middleware) diff --git a/vendor/github.com/gorilla/mux/go.mod b/vendor/github.com/gorilla/mux/go.mod new file mode 100644 index 00000000..cfc8ede5 --- /dev/null +++ b/vendor/github.com/gorilla/mux/go.mod @@ -0,0 +1 @@ +module github.com/gorilla/mux diff --git a/vendor/github.com/gorilla/mux/middleware.go b/vendor/github.com/gorilla/mux/middleware.go index ceb812ce..cf2b26dc 100644 --- a/vendor/github.com/gorilla/mux/middleware.go +++ b/vendor/github.com/gorilla/mux/middleware.go @@ -32,37 +32,19 @@ func (r *Router) useInterface(mw middleware) { r.middlewares = append(r.middlewares, mw) } -// CORSMethodMiddleware sets the Access-Control-Allow-Methods response header -// on a request, by matching routes based only on paths. It also handles -// OPTIONS requests, by settings Access-Control-Allow-Methods, and then -// returning without calling the next http handler. +// CORSMethodMiddleware automatically sets the Access-Control-Allow-Methods response header +// on requests for routes that have an OPTIONS method matcher to all the method matchers on +// the route. Routes that do not explicitly handle OPTIONS requests will not be processed +// by the middleware. See examples for usage. func CORSMethodMiddleware(r *Router) MiddlewareFunc { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - var allMethods []string - - err := r.Walk(func(route *Route, _ *Router, _ []*Route) error { - for _, m := range route.matchers { - if _, ok := m.(*routeRegexp); ok { - if m.Match(req, &RouteMatch{}) { - methods, err := route.GetMethods() - if err != nil { - return err - } - - allMethods = append(allMethods, methods...) - } - break - } - } - return nil - }) - + allMethods, err := getAllMethodsForRoute(r, req) if err == nil { - w.Header().Set("Access-Control-Allow-Methods", strings.Join(append(allMethods, "OPTIONS"), ",")) - - if req.Method == "OPTIONS" { - return + for _, v := range allMethods { + if v == http.MethodOptions { + w.Header().Set("Access-Control-Allow-Methods", strings.Join(allMethods, ",")) + } } } @@ -70,3 +52,28 @@ func CORSMethodMiddleware(r *Router) MiddlewareFunc { }) } } + +// getAllMethodsForRoute returns all the methods from method matchers matching a given +// request. +func getAllMethodsForRoute(r *Router, req *http.Request) ([]string, error) { + var allMethods []string + + err := r.Walk(func(route *Route, _ *Router, _ []*Route) error { + for _, m := range route.matchers { + if _, ok := m.(*routeRegexp); ok { + if m.Match(req, &RouteMatch{}) { + methods, err := route.GetMethods() + if err != nil { + return err + } + + allMethods = append(allMethods, methods...) + } + break + } + } + return nil + }) + + return allMethods, err +} diff --git a/vendor/github.com/gorilla/mux/mux.go b/vendor/github.com/gorilla/mux/mux.go index 4bbafa51..a2cd193e 100644 --- a/vendor/github.com/gorilla/mux/mux.go +++ b/vendor/github.com/gorilla/mux/mux.go @@ -22,7 +22,7 @@ var ( // NewRouter returns a new router instance. func NewRouter() *Router { - return &Router{namedRoutes: make(map[string]*Route), KeepContext: false} + return &Router{namedRoutes: make(map[string]*Route)} } // Router registers routes to be matched and dispatches a handler. @@ -50,24 +50,78 @@ type Router struct { // Configurable Handler to be used when the request method does not match the route. MethodNotAllowedHandler http.Handler - // Parent route, if this is a subrouter. - parent parentRoute // Routes to be matched, in order. routes []*Route + // Routes by name for URL building. namedRoutes map[string]*Route - // See Router.StrictSlash(). This defines the flag for new routes. - strictSlash bool - // See Router.SkipClean(). This defines the flag for new routes. - skipClean bool + // If true, do not clear the request context after handling the request. - // This has no effect when go1.7+ is used, since the context is stored + // + // Deprecated: No effect when go1.7+ is used, since the context is stored // on the request itself. KeepContext bool - // see Router.UseEncodedPath(). This defines a flag for all routes. - useEncodedPath bool + // Slice of middlewares to be called after a match is found middlewares []middleware + + // configuration shared with `Route` + routeConf +} + +// common route configuration shared between `Router` and `Route` +type routeConf struct { + // If true, "/path/foo%2Fbar/to" will match the path "/path/{var}/to" + useEncodedPath bool + + // If true, when the path pattern is "/path/", accessing "/path" will + // redirect to the former and vice versa. + strictSlash bool + + // If true, when the path pattern is "/path//to", accessing "/path//to" + // will not redirect + skipClean bool + + // Manager for the variables from host and path. + regexp routeRegexpGroup + + // List of matchers. + matchers []matcher + + // The scheme used when building URLs. + buildScheme string + + buildVarsFunc BuildVarsFunc +} + +// returns an effective deep copy of `routeConf` +func copyRouteConf(r routeConf) routeConf { + c := r + + if r.regexp.path != nil { + c.regexp.path = copyRouteRegexp(r.regexp.path) + } + + if r.regexp.host != nil { + c.regexp.host = copyRouteRegexp(r.regexp.host) + } + + c.regexp.queries = make([]*routeRegexp, 0, len(r.regexp.queries)) + for _, q := range r.regexp.queries { + c.regexp.queries = append(c.regexp.queries, copyRouteRegexp(q)) + } + + c.matchers = make([]matcher, 0, len(r.matchers)) + for _, m := range r.matchers { + c.matchers = append(c.matchers, m) + } + + return c +} + +func copyRouteRegexp(r *routeRegexp) *routeRegexp { + c := *r + return &c } // Match attempts to match the given request against the router's registered routes. @@ -155,22 +209,18 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { handler = http.NotFoundHandler() } - if !r.KeepContext { - defer contextClear(req) - } - handler.ServeHTTP(w, req) } // Get returns a route registered with the given name. func (r *Router) Get(name string) *Route { - return r.getNamedRoutes()[name] + return r.namedRoutes[name] } // GetRoute returns a route registered with the given name. This method // was renamed to Get() and remains here for backwards compatibility. func (r *Router) GetRoute(name string) *Route { - return r.getNamedRoutes()[name] + return r.namedRoutes[name] } // StrictSlash defines the trailing slash behavior for new routes. The initial @@ -221,55 +271,24 @@ func (r *Router) UseEncodedPath() *Router { return r } -// ---------------------------------------------------------------------------- -// parentRoute -// ---------------------------------------------------------------------------- - -func (r *Router) getBuildScheme() string { - if r.parent != nil { - return r.parent.getBuildScheme() - } - return "" -} - -// getNamedRoutes returns the map where named routes are registered. -func (r *Router) getNamedRoutes() map[string]*Route { - if r.namedRoutes == nil { - if r.parent != nil { - r.namedRoutes = r.parent.getNamedRoutes() - } else { - r.namedRoutes = make(map[string]*Route) - } - } - return r.namedRoutes -} - -// getRegexpGroup returns regexp definitions from the parent route, if any. -func (r *Router) getRegexpGroup() *routeRegexpGroup { - if r.parent != nil { - return r.parent.getRegexpGroup() - } - return nil -} - -func (r *Router) buildVars(m map[string]string) map[string]string { - if r.parent != nil { - m = r.parent.buildVars(m) - } - return m -} - // ---------------------------------------------------------------------------- // Route factories // ---------------------------------------------------------------------------- // NewRoute registers an empty route. func (r *Router) NewRoute() *Route { - route := &Route{parent: r, strictSlash: r.strictSlash, skipClean: r.skipClean, useEncodedPath: r.useEncodedPath} + // initialize a route with a copy of the parent router's configuration + route := &Route{routeConf: copyRouteConf(r.routeConf), namedRoutes: r.namedRoutes} r.routes = append(r.routes, route) return route } +// Name registers a new route with a name. +// See Route.Name(). +func (r *Router) Name(name string) *Route { + return r.NewRoute().Name(name) +} + // Handle registers a new route with a matcher for the URL path. // See Route.Path() and Route.Handler(). func (r *Router) Handle(path string, handler http.Handler) *Route { diff --git a/vendor/github.com/gorilla/mux/regexp.go b/vendor/github.com/gorilla/mux/regexp.go index 2b57e562..ac1abcd4 100644 --- a/vendor/github.com/gorilla/mux/regexp.go +++ b/vendor/github.com/gorilla/mux/regexp.go @@ -113,6 +113,13 @@ func newRouteRegexp(tpl string, typ regexpType, options routeRegexpOptions) (*ro if typ != regexpTypePrefix { pattern.WriteByte('$') } + + var wildcardHostPort bool + if typ == regexpTypeHost { + if !strings.Contains(pattern.String(), ":") { + wildcardHostPort = true + } + } reverse.WriteString(raw) if endSlash { reverse.WriteByte('/') @@ -131,13 +138,14 @@ func newRouteRegexp(tpl string, typ regexpType, options routeRegexpOptions) (*ro // Done! return &routeRegexp{ - template: template, - regexpType: typ, - options: options, - regexp: reg, - reverse: reverse.String(), - varsN: varsN, - varsR: varsR, + template: template, + regexpType: typ, + options: options, + regexp: reg, + reverse: reverse.String(), + varsN: varsN, + varsR: varsR, + wildcardHostPort: wildcardHostPort, }, nil } @@ -158,11 +166,22 @@ type routeRegexp struct { varsN []string // Variable regexps (validators). varsR []*regexp.Regexp + // Wildcard host-port (no strict port match in hostname) + wildcardHostPort bool } // Match matches the regexp against the URL host or path. func (r *routeRegexp) Match(req *http.Request, match *RouteMatch) bool { - if r.regexpType != regexpTypeHost { + if r.regexpType == regexpTypeHost { + host := getHost(req) + if r.wildcardHostPort { + // Don't be strict on the port match + if i := strings.Index(host, ":"); i != -1 { + host = host[:i] + } + } + return r.regexp.MatchString(host) + } else { if r.regexpType == regexpTypeQuery { return r.matchQueryString(req) } @@ -172,8 +191,6 @@ func (r *routeRegexp) Match(req *http.Request, match *RouteMatch) bool { } return r.regexp.MatchString(path) } - - return r.regexp.MatchString(getHost(req)) } // url builds a URL part using the given values. @@ -267,7 +284,7 @@ type routeRegexpGroup struct { } // setMatch extracts the variables from the URL once a route matches. -func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) { +func (v routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) { // Store host variables. if v.host != nil { host := getHost(req) @@ -296,7 +313,7 @@ func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) } else { u.Path += "/" } - m.Handler = http.RedirectHandler(u.String(), 301) + m.Handler = http.RedirectHandler(u.String(), http.StatusMovedPermanently) } } } @@ -312,17 +329,13 @@ func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) } // getHost tries its best to return the request host. +// According to section 14.23 of RFC 2616 the Host header +// can include the port number if the default value of 80 is not used. func getHost(r *http.Request) string { if r.URL.IsAbs() { return r.URL.Host } - host := r.Host - // Slice off any port information. - if i := strings.Index(host, ":"); i != -1 { - host = host[:i] - } - return host - + return r.Host } func extractVars(input string, matches []int, names []string, output map[string]string) { diff --git a/vendor/github.com/gorilla/mux/route.go b/vendor/github.com/gorilla/mux/route.go index a591d735..8479c68c 100644 --- a/vendor/github.com/gorilla/mux/route.go +++ b/vendor/github.com/gorilla/mux/route.go @@ -15,24 +15,8 @@ import ( // Route stores information to match a request and build URLs. type Route struct { - // Parent where the route was registered (a Router). - parent parentRoute // Request handler for the route. handler http.Handler - // List of matchers. - matchers []matcher - // Manager for the variables from host and path. - regexp *routeRegexpGroup - // If true, when the path pattern is "/path/", accessing "/path" will - // redirect to the former and vice versa. - strictSlash bool - // If true, when the path pattern is "/path//to", accessing "/path//to" - // will not redirect - skipClean bool - // If true, "/path/foo%2Fbar/to" will match the path "/path/{var}/to" - useEncodedPath bool - // The scheme used when building URLs. - buildScheme string // If true, this route never matches: it is only used to build URLs. buildOnly bool // The name used to build URLs. @@ -40,7 +24,11 @@ type Route struct { // Error resulted from building a route. err error - buildVarsFunc BuildVarsFunc + // "global" reference to all named routes + namedRoutes map[string]*Route + + // config possibly passed in from `Router` + routeConf } // SkipClean reports whether path cleaning is enabled for this route via @@ -64,6 +52,18 @@ func (r *Route) Match(req *http.Request, match *RouteMatch) bool { matchErr = ErrMethodMismatch continue } + + // Ignore ErrNotFound errors. These errors arise from match call + // to Subrouters. + // + // This prevents subsequent matching subrouters from failing to + // run middleware. If not ignored, the middleware would see a + // non-nil MatchErr and be skipped, even when there was a + // matching route. + if match.MatchErr == ErrNotFound { + match.MatchErr = nil + } + matchErr = nil return false } @@ -93,9 +93,7 @@ func (r *Route) Match(req *http.Request, match *RouteMatch) bool { } // Set variables. - if r.regexp != nil { - r.regexp.setMatch(req, match, r) - } + r.regexp.setMatch(req, match, r) return true } @@ -137,7 +135,7 @@ func (r *Route) GetHandler() http.Handler { // Name ----------------------------------------------------------------------- // Name sets the name for the route, used to build URLs. -// If the name was registered already it will be overwritten. +// It is an error to call Name more than once on a route. func (r *Route) Name(name string) *Route { if r.name != "" { r.err = fmt.Errorf("mux: route already has name %q, can't set %q", @@ -145,7 +143,7 @@ func (r *Route) Name(name string) *Route { } if r.err == nil { r.name = name - r.getNamedRoutes()[name] = r + r.namedRoutes[name] = r } return r } @@ -177,7 +175,6 @@ func (r *Route) addRegexpMatcher(tpl string, typ regexpType) error { if r.err != nil { return r.err } - r.regexp = r.getRegexpGroup() if typ == regexpTypePath || typ == regexpTypePrefix { if len(tpl) > 0 && tpl[0] != '/' { return fmt.Errorf("mux: path must start with a slash, got %q", tpl) @@ -386,7 +383,7 @@ func (r *Route) PathPrefix(tpl string) *Route { // The above route will only match if the URL contains the defined queries // values, e.g.: ?foo=bar&id=42. // -// It the value is an empty string, it will match any value if the key is set. +// If the value is an empty string, it will match any value if the key is set. // // Variables can define an optional regexp pattern to be matched: // @@ -424,7 +421,7 @@ func (r *Route) Schemes(schemes ...string) *Route { for k, v := range schemes { schemes[k] = strings.ToLower(v) } - if r.buildScheme == "" && len(schemes) > 0 { + if len(schemes) > 0 { r.buildScheme = schemes[0] } return r.addMatcher(schemeMatcher(schemes)) @@ -439,7 +436,15 @@ type BuildVarsFunc func(map[string]string) map[string]string // BuildVarsFunc adds a custom function to be used to modify build variables // before a route's URL is built. func (r *Route) BuildVarsFunc(f BuildVarsFunc) *Route { - r.buildVarsFunc = f + if r.buildVarsFunc != nil { + // compose the old and new functions + old := r.buildVarsFunc + r.buildVarsFunc = func(m map[string]string) map[string]string { + return f(old(m)) + } + } else { + r.buildVarsFunc = f + } return r } @@ -458,7 +463,8 @@ func (r *Route) BuildVarsFunc(f BuildVarsFunc) *Route { // Here, the routes registered in the subrouter won't be tested if the host // doesn't match. func (r *Route) Subrouter() *Router { - router := &Router{parent: r, strictSlash: r.strictSlash} + // initialize a subrouter with a copy of the parent route's configuration + router := &Router{routeConf: copyRouteConf(r.routeConf), namedRoutes: r.namedRoutes} r.addMatcher(router) return router } @@ -502,9 +508,6 @@ func (r *Route) URL(pairs ...string) (*url.URL, error) { if r.err != nil { return nil, r.err } - if r.regexp == nil { - return nil, errors.New("mux: route doesn't have a host or path") - } values, err := r.prepareVars(pairs...) if err != nil { return nil, err @@ -516,8 +519,8 @@ func (r *Route) URL(pairs ...string) (*url.URL, error) { return nil, err } scheme = "http" - if s := r.getBuildScheme(); s != "" { - scheme = s + if r.buildScheme != "" { + scheme = r.buildScheme } } if r.regexp.path != nil { @@ -547,7 +550,7 @@ func (r *Route) URLHost(pairs ...string) (*url.URL, error) { if r.err != nil { return nil, r.err } - if r.regexp == nil || r.regexp.host == nil { + if r.regexp.host == nil { return nil, errors.New("mux: route doesn't have a host") } values, err := r.prepareVars(pairs...) @@ -562,8 +565,8 @@ func (r *Route) URLHost(pairs ...string) (*url.URL, error) { Scheme: "http", Host: host, } - if s := r.getBuildScheme(); s != "" { - u.Scheme = s + if r.buildScheme != "" { + u.Scheme = r.buildScheme } return u, nil } @@ -575,7 +578,7 @@ func (r *Route) URLPath(pairs ...string) (*url.URL, error) { if r.err != nil { return nil, r.err } - if r.regexp == nil || r.regexp.path == nil { + if r.regexp.path == nil { return nil, errors.New("mux: route doesn't have a path") } values, err := r.prepareVars(pairs...) @@ -600,7 +603,7 @@ func (r *Route) GetPathTemplate() (string, error) { if r.err != nil { return "", r.err } - if r.regexp == nil || r.regexp.path == nil { + if r.regexp.path == nil { return "", errors.New("mux: route doesn't have a path") } return r.regexp.path.template, nil @@ -614,7 +617,7 @@ func (r *Route) GetPathRegexp() (string, error) { if r.err != nil { return "", r.err } - if r.regexp == nil || r.regexp.path == nil { + if r.regexp.path == nil { return "", errors.New("mux: route does not have a path") } return r.regexp.path.regexp.String(), nil @@ -629,7 +632,7 @@ func (r *Route) GetQueriesRegexp() ([]string, error) { if r.err != nil { return nil, r.err } - if r.regexp == nil || r.regexp.queries == nil { + if r.regexp.queries == nil { return nil, errors.New("mux: route doesn't have queries") } var queries []string @@ -648,7 +651,7 @@ func (r *Route) GetQueriesTemplates() ([]string, error) { if r.err != nil { return nil, r.err } - if r.regexp == nil || r.regexp.queries == nil { + if r.regexp.queries == nil { return nil, errors.New("mux: route doesn't have queries") } var queries []string @@ -683,7 +686,7 @@ func (r *Route) GetHostTemplate() (string, error) { if r.err != nil { return "", r.err } - if r.regexp == nil || r.regexp.host == nil { + if r.regexp.host == nil { return "", errors.New("mux: route doesn't have a host") } return r.regexp.host.template, nil @@ -700,64 +703,8 @@ func (r *Route) prepareVars(pairs ...string) (map[string]string, error) { } func (r *Route) buildVars(m map[string]string) map[string]string { - if r.parent != nil { - m = r.parent.buildVars(m) - } if r.buildVarsFunc != nil { m = r.buildVarsFunc(m) } return m } - -// ---------------------------------------------------------------------------- -// parentRoute -// ---------------------------------------------------------------------------- - -// parentRoute allows routes to know about parent host and path definitions. -type parentRoute interface { - getBuildScheme() string - getNamedRoutes() map[string]*Route - getRegexpGroup() *routeRegexpGroup - buildVars(map[string]string) map[string]string -} - -func (r *Route) getBuildScheme() string { - if r.buildScheme != "" { - return r.buildScheme - } - if r.parent != nil { - return r.parent.getBuildScheme() - } - return "" -} - -// getNamedRoutes returns the map where named routes are registered. -func (r *Route) getNamedRoutes() map[string]*Route { - if r.parent == nil { - // During tests router is not always set. - r.parent = NewRouter() - } - return r.parent.getNamedRoutes() -} - -// getRegexpGroup returns regexp definitions from this route. -func (r *Route) getRegexpGroup() *routeRegexpGroup { - if r.regexp == nil { - if r.parent == nil { - // During tests router is not always set. - r.parent = NewRouter() - } - regexp := r.parent.getRegexpGroup() - if regexp == nil { - r.regexp = new(routeRegexpGroup) - } else { - // Copy. - r.regexp = &routeRegexpGroup{ - host: regexp.host, - path: regexp.path, - queries: regexp.queries, - } - } - } - return r.regexp -} diff --git a/vendor/github.com/hashicorp/golang-lru/go.mod b/vendor/github.com/hashicorp/golang-lru/go.mod index 824cb97e..8ad8826b 100644 --- a/vendor/github.com/hashicorp/golang-lru/go.mod +++ b/vendor/github.com/hashicorp/golang-lru/go.mod @@ -1 +1,3 @@ module github.com/hashicorp/golang-lru + +go 1.12 diff --git a/vendor/github.com/hashicorp/golang-lru/lru.go b/vendor/github.com/hashicorp/golang-lru/lru.go index 1cbe04b7..4e5e9d8f 100644 --- a/vendor/github.com/hashicorp/golang-lru/lru.go +++ b/vendor/github.com/hashicorp/golang-lru/lru.go @@ -37,7 +37,7 @@ func (c *Cache) Purge() { c.lock.Unlock() } -// Add adds a value to the cache. Returns true if an eviction occurred. +// Add adds a value to the cache. Returns true if an eviction occurred. func (c *Cache) Add(key, value interface{}) (evicted bool) { c.lock.Lock() evicted = c.lru.Add(key, value) @@ -71,8 +71,8 @@ func (c *Cache) Peek(key interface{}) (value interface{}, ok bool) { return value, ok } -// ContainsOrAdd checks if a key is in the cache without updating the -// recent-ness or deleting it for being stale, and if not, adds the value. +// ContainsOrAdd checks if a key is in the cache without updating the +// recent-ness or deleting it for being stale, and if not, adds the value. // Returns whether found and whether an eviction occurred. func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { c.lock.Lock() @@ -85,18 +85,52 @@ func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { return false, evicted } -// Remove removes the provided key from the cache. -func (c *Cache) Remove(key interface{}) { +// PeekOrAdd checks if a key is in the cache without updating the +// recent-ness or deleting it for being stale, and if not, adds the value. +// Returns whether found and whether an eviction occurred. +func (c *Cache) PeekOrAdd(key, value interface{}) (previous interface{}, ok, evicted bool) { c.lock.Lock() - c.lru.Remove(key) + defer c.lock.Unlock() + + previous, ok = c.lru.Peek(key) + if ok { + return previous, true, false + } + + evicted = c.lru.Add(key, value) + return nil, false, evicted +} + +// Remove removes the provided key from the cache. +func (c *Cache) Remove(key interface{}) (present bool) { + c.lock.Lock() + present = c.lru.Remove(key) c.lock.Unlock() + return +} + +// Resize changes the cache size. +func (c *Cache) Resize(size int) (evicted int) { + c.lock.Lock() + evicted = c.lru.Resize(size) + c.lock.Unlock() + return evicted } // RemoveOldest removes the oldest item from the cache. -func (c *Cache) RemoveOldest() { +func (c *Cache) RemoveOldest() (key interface{}, value interface{}, ok bool) { c.lock.Lock() - c.lru.RemoveOldest() + key, value, ok = c.lru.RemoveOldest() c.lock.Unlock() + return +} + +// GetOldest returns the oldest entry +func (c *Cache) GetOldest() (key interface{}, value interface{}, ok bool) { + c.lock.Lock() + key, value, ok = c.lru.GetOldest() + c.lock.Unlock() + return } // Keys returns a slice of the keys in the cache, from oldest to newest. diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go index 5673773b..a86c8539 100644 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go @@ -73,6 +73,9 @@ func (c *LRU) Add(key, value interface{}) (evicted bool) { func (c *LRU) Get(key interface{}) (value interface{}, ok bool) { if ent, ok := c.items[key]; ok { c.evictList.MoveToFront(ent) + if ent.Value.(*entry) == nil { + return nil, false + } return ent.Value.(*entry).value, true } return @@ -142,6 +145,19 @@ func (c *LRU) Len() int { return c.evictList.Len() } +// Resize changes the cache size. +func (c *LRU) Resize(size int) (evicted int) { + diff := c.Len() - size + if diff < 0 { + diff = 0 + } + for i := 0; i < diff; i++ { + c.removeOldest() + } + c.size = size + return diff +} + // removeOldest removes the oldest item from the cache. func (c *LRU) removeOldest() { ent := c.evictList.Back() diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go index 74c70774..92d70934 100644 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go @@ -10,7 +10,7 @@ type LRUCache interface { // updates the "recently used"-ness of the key. #value, isFound Get(key interface{}) (value interface{}, ok bool) - // Check if a key exsists in cache without updating the recent-ness. + // Checks if a key exists in cache without updating the recent-ness. Contains(key interface{}) (ok bool) // Returns key's value without updating the "recently used"-ness of the key. @@ -31,6 +31,9 @@ type LRUCache interface { // Returns the number of items in the cache. Len() int - // Clear all cache entries + // Clears all cache entries. Purge() + + // Resizes cache, returning number evicted + Resize(int) int } diff --git a/vendor/github.com/hashicorp/hcl/decoder.go b/vendor/github.com/hashicorp/hcl/decoder.go index bed9ebbe..6ed2fb9b 100644 --- a/vendor/github.com/hashicorp/hcl/decoder.go +++ b/vendor/github.com/hashicorp/hcl/decoder.go @@ -117,10 +117,17 @@ func (d *decoder) decode(name string, node ast.Node, result reflect.Value) error func (d *decoder) decodeBool(name string, node ast.Node, result reflect.Value) error { switch n := node.(type) { case *ast.LiteralType: - if n.Token.Type == token.BOOL { - v, err := strconv.ParseBool(n.Token.Text) - if err != nil { - return err + switch n.Token.Type { + case token.BOOL, token.STRING, token.NUMBER: + var v bool + s := strings.ToLower(strings.Replace(n.Token.Text, "\"", "", -1)) + switch s { + case "1", "true": + v = true + case "0", "false": + v = false + default: + return fmt.Errorf("decodeBool: Unknown value for boolean: %s", n.Token.Text) } result.Set(reflect.ValueOf(v)) @@ -397,6 +404,11 @@ func (d *decoder) decodeMap(name string, node ast.Node, result reflect.Value) er } func (d *decoder) decodePtr(name string, node ast.Node, result reflect.Value) error { + // if pointer is not nil, decode into existing value + if !result.IsNil() { + return d.decode(name, node, result.Elem()) + } + // Create an element of the concrete (non pointer) type and decode // into that. Then set the value of the pointer to this type. resultType := result.Type() @@ -505,7 +517,7 @@ func expandObject(node ast.Node, result reflect.Value) ast.Node { // we need to un-flatten the ast enough to decode newNode := &ast.ObjectItem{ Keys: []*ast.ObjectKey{ - &ast.ObjectKey{ + { Token: keyToken, }, }, @@ -523,7 +535,7 @@ func (d *decoder) decodeString(name string, node ast.Node, result reflect.Value) switch n := node.(type) { case *ast.LiteralType: switch n.Token.Type { - case token.NUMBER: + case token.NUMBER, token.FLOAT, token.BOOL: result.Set(reflect.ValueOf(n.Token.Text).Convert(result.Type())) return nil case token.STRING, token.HEREDOC: @@ -624,10 +636,19 @@ func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value) } } - usedKeys := make(map[string]struct{}) decodedFields := make([]string, 0, len(fields)) decodedFieldsVal := make([]reflect.Value, 0) unusedKeysVal := make([]reflect.Value, 0) + + // fill unusedNodeKeys with keys from the AST + // a slice because we have to do equals case fold to match Filter + unusedNodeKeys := make([]string, 0) + for _, item := range list.Items { + for _, k := range item.Keys { + unusedNodeKeys = append(unusedNodeKeys, k.Token.Value().(string)) + } + } + for _, f := range fields { field, fieldValue := f.field, f.val if !fieldValue.IsValid() { @@ -682,8 +703,8 @@ func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value) continue } - // Track the used key - usedKeys[fieldName] = struct{}{} + // Track the used keys + unusedNodeKeys = removeCaseFold(unusedNodeKeys, fieldName) // Create the field name and decode. We range over the elements // because we actually want the value. @@ -716,6 +737,14 @@ func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value) } } + if len(unusedNodeKeys) > 0 { + // like decodedFields, populated the unusedKeys field(s) + sort.Strings(unusedNodeKeys) + for _, v := range unusedKeysVal { + v.Set(reflect.ValueOf(unusedNodeKeys)) + } + } + return nil } @@ -727,3 +756,12 @@ func findNodeType() reflect.Type { value := reflect.ValueOf(nodeContainer).FieldByName("Node") return value.Type() } + +func removeCaseFold(xs []string, y string) []string { + for i, x := range xs { + if strings.EqualFold(x, y) { + return append(xs[:i], xs[i+1:]...) + } + } + return xs +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/.gitignore b/vendor/github.com/hydrogen18/stalecucumber/.gitignore new file mode 100644 index 00000000..87c877e7 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/.gitignore @@ -0,0 +1,2 @@ +python/*.pyc +python/*.go diff --git a/vendor/github.com/hydrogen18/stalecucumber/LICENSE b/vendor/github.com/hydrogen18/stalecucumber/LICENSE new file mode 100644 index 00000000..efcb2414 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/LICENSE @@ -0,0 +1,10 @@ +Copyright (c) 2014, Eric Urban +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/vendor/github.com/hydrogen18/stalecucumber/README.md b/vendor/github.com/hydrogen18/stalecucumber/README.md new file mode 100644 index 00000000..06951ea8 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/README.md @@ -0,0 +1,65 @@ +#stalecucumber + +This package reads and writes pickled data. The format is the same +as the Python "pickle" module. + +Protocols 0,1,2 are implemented. These are the versions written by the Python +2.x series. Python 3 defines newer protocol versions, but can write the older +protocol versions so they are readable by this package. + +[Full documentation is available here.](https://godoc.org/github.com/hydrogen18/stalecucumber) + +##TLDR + +Read a pickled string or unicode object +``` +pickle.dumps("foobar") +--- +var somePickledData io.Reader +mystring, err := stalecucumber.String(stalecucumber.Unpickle(somePickledData)) +```` + +Read a pickled integer +``` +pickle.dumps(42) +--- +var somePickledData io.Reader +myint64, err := stalecucumber.Int(stalecucumber.Unpickle(somePickledData)) +``` + +Read a pickled list of numbers into a structure +``` +pickle.dumps([8,8,2005]) +--- +var somePickledData io.Reader +numbers := make([]int64,0) + +err := stalecucumber.UnpackInto(&numbers).From(stalecucumber.Unpickle(somePickledData)) +``` + +Read a pickled dictionary into a structure +``` +pickle.dumps({"apple":1,"banana":2,"cat":"hello","Dog":42.0}) +--- +var somePickledData io.Reader +mystruct := struct{ + Apple int + Banana uint + Cat string + Dog float32}{} + +err := stalecucumber.UnpackInto(&mystruct).From(stalecucumber.Unpickle(somePickledData)) +``` + +Pickle a struct + +``` +buf := new(bytes.Buffer) +mystruct := struct{ + Apple int + Banana uint + Cat string + Dog float32}{} + +err := stalecucumber.NewPickler(buf).Pickle(mystruct) +``` diff --git a/vendor/github.com/hydrogen18/stalecucumber/fuzz.go b/vendor/github.com/hydrogen18/stalecucumber/fuzz.go new file mode 100644 index 00000000..e7106314 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/fuzz.go @@ -0,0 +1,14 @@ +// +build gofuzz + +package stalecucumber + +import ( + "bytes" +) + +func Fuzz(data []byte) int { + if _, err := Unpickle(bytes.NewReader(data)); err != nil { + return 0 + } + return 1 +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/helpers.go b/vendor/github.com/hydrogen18/stalecucumber/helpers.go new file mode 100644 index 00000000..a133ed2b --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/helpers.go @@ -0,0 +1,201 @@ +package stalecucumber + +import "fmt" +import "math/big" + +/* +This type is returned whenever a helper cannot convert the result of +Unpickle into the desired type. +*/ +type WrongTypeError struct { + Result interface{} + Request string +} + +func (wte WrongTypeError) Error() string { + return fmt.Sprintf("Unpickling returned type %T which cannot be converted to %s", wte.Result, wte.Request) +} + +func newWrongTypeError(result interface{}, request interface{}) error { + return WrongTypeError{Result: result, Request: fmt.Sprintf("%T", request)} +} + +/* +This helper attempts to convert the return value of Unpickle into a string. + +If Unpickle returns an error that error is returned immediately. + +If the value cannot be converted an error is returned. +*/ +func String(v interface{}, err error) (string, error) { + if err != nil { + return "", err + } + vs, ok := v.(string) + if ok { + return vs, nil + } + + return "", newWrongTypeError(v, vs) +} + +/* +This helper attempts to convert the return value of Unpickle into a int64. + +If Unpickle returns an error that error is returned immediately. + +If the value cannot be converted an error is returned. +*/ +func Int(v interface{}, err error) (int64, error) { + if err != nil { + return 0, err + } + vi, ok := v.(int64) + if ok { + return vi, nil + } + + vbi, ok := v.(*big.Int) + if ok { + if vbi.BitLen() <= 63 { + return vbi.Int64(), nil + } + } + + return 0, newWrongTypeError(v, vi) + +} + +/* +This helper attempts to convert the return value of Unpickle into a bool. + +If Unpickle returns an error that error is returned immediately. + +If the value cannot be converted an error is returned. +*/ +func Bool(v interface{}, err error) (bool, error) { + if err != nil { + return false, err + } + vb, ok := v.(bool) + if ok { + return vb, nil + } + + return false, newWrongTypeError(v, vb) + +} + +/* +This helper attempts to convert the return value of Unpickle into a *big.Int. + +If Unpickle returns an error that error is returned immediately. + +If the value cannot be converted an error is returned. +*/ +func Big(v interface{}, err error) (*big.Int, error) { + if err != nil { + return nil, err + } + + vb, ok := v.(*big.Int) + if ok { + return vb, nil + } + + return nil, newWrongTypeError(v, vb) + +} + +/* +This helper attempts to convert the return value of Unpickle into a float64. + +If Unpickle returns an error that error is returned immediately. + +If the value cannot be converted an error is returned. +*/ +func Float(v interface{}, err error) (float64, error) { + if err != nil { + return 0.0, err + } + + vf, ok := v.(float64) + if ok { + return vf, nil + } + + return 0.0, newWrongTypeError(v, vf) +} + +/* +This helper attempts to convert the return value of Unpickle into a []interface{}. + +If Unpickle returns an error that error is returned immediately. + +If the value cannot be converted an error is returned. +*/ +func ListOrTuple(v interface{}, err error) ([]interface{}, error) { + if err != nil { + return nil, err + } + + vl, ok := v.([]interface{}) + if ok { + return vl, nil + } + + return nil, newWrongTypeError(v, vl) + +} + +/* +This helper attempts to convert the return value of Unpickle into a map[interface{}]interface{}. + +If Unpickle returns an error that error is returned immediately. + +If the value cannot be converted an error is returned. +*/ +func Dict(v interface{}, err error) (map[interface{}]interface{}, error) { + if err != nil { + return nil, err + } + + vd, ok := v.(map[interface{}]interface{}) + if ok { + return vd, nil + } + + return nil, newWrongTypeError(v, vd) +} + +/* +This helper attempts to convert the return value of Unpickle into a map[string]interface{}. + +If Unpickle returns an error that error is returned immediately. + +If the value cannot be converted an error is returned. +*/ +func DictString(v interface{}, err error) (map[string]interface{}, error) { + var src map[interface{}]interface{} + src, err = Dict(v, err) + if err != nil { + return nil, err + } + + return tryDictToDictString(src) +} + +func tryDictToDictString(src map[interface{}]interface{}) (map[string]interface{}, error) { + dst := make(map[string]interface{}, len(src)) + + for k, v := range src { + kstr, ok := k.(string) + if !ok { + return nil, newWrongTypeError(src, dst) + } + dst[kstr] = v + } + + return dst, nil + +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/jump_list.go b/vendor/github.com/hydrogen18/stalecucumber/jump_list.go new file mode 100644 index 00000000..6f3df294 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/jump_list.go @@ -0,0 +1,22 @@ +package stalecucumber + +import "errors" + +type opcodeFunc func(*PickleMachine) error + +var ErrOpcodeInvalid = errors.New("Opcode is invalid") + +func (pm *PickleMachine) Opcode_Invalid() error { + return ErrOpcodeInvalid +} + +type opcodeJumpList [256]opcodeFunc + +func buildEmptyJumpList() opcodeJumpList { + jl := opcodeJumpList{} + + for i := range jl { + jl[i] = (*PickleMachine).Opcode_Invalid + } + return jl +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/opcodes.go b/vendor/github.com/hydrogen18/stalecucumber/opcodes.go new file mode 100644 index 00000000..5e34d10d --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/opcodes.go @@ -0,0 +1,55 @@ +package stalecucumber + +const OPCODE_INT = 0x49 +const OPCODE_LONG = 0x4c +const OPCODE_STRING = 0x53 +const OPCODE_NONE = 0x4e +const OPCODE_UNICODE = 0x56 +const OPCODE_FLOAT = 0x46 +const OPCODE_APPEND = 0x61 +const OPCODE_LIST = 0x6c +const OPCODE_TUPLE = 0x74 +const OPCODE_DICT = 0x64 +const OPCODE_SETITEM = 0x73 +const OPCODE_POP = 0x30 +const OPCODE_DUP = 0x32 +const OPCODE_MARK = 0x28 +const OPCODE_GET = 0x67 +const OPCODE_PUT = 0x70 +const OPCODE_GLOBAL = 0x63 +const OPCODE_REDUCE = 0x52 +const OPCODE_BUILD = 0x62 +const OPCODE_INST = 0x69 +const OPCODE_STOP = 0x2e +const OPCODE_PERSID = 0x50 +const OPCODE_BININT = 0x4a +const OPCODE_BININT1 = 0x4b +const OPCODE_BININT2 = 0x4d +const OPCODE_BINSTRING = 0x54 +const OPCODE_SHORT_BINSTRING = 0x55 +const OPCODE_BINUNICODE = 0x58 +const OPCODE_BINFLOAT = 0x47 +const OPCODE_EMPTY_LIST = 0x5d +const OPCODE_APPENDS = 0x65 +const OPCODE_EMPTY_TUPLE = 0x29 +const OPCODE_EMPTY_DICT = 0x7d +const OPCODE_SETITEMS = 0x75 +const OPCODE_POP_MARK = 0x31 +const OPCODE_BINGET = 0x68 +const OPCODE_LONG_BINGET = 0x6a +const OPCODE_BINPUT = 0x71 +const OPCODE_LONG_BINPUT = 0x72 +const OPCODE_OBJ = 0x6f +const OPCODE_BINPERSID = 0x51 +const OPCODE_LONG1 = 0x8a +const OPCODE_LONG4 = 0x8b +const OPCODE_NEWTRUE = 0x88 +const OPCODE_NEWFALSE = 0x89 +const OPCODE_TUPLE1 = 0x85 +const OPCODE_TUPLE2 = 0x86 +const OPCODE_TUPLE3 = 0x87 +const OPCODE_EXT1 = 0x82 +const OPCODE_EXT2 = 0x83 +const OPCODE_EXT4 = 0x84 +const OPCODE_NEWOBJ = 0x81 +const OPCODE_PROTO = 0x80 diff --git a/vendor/github.com/hydrogen18/stalecucumber/pickle_machine.go b/vendor/github.com/hydrogen18/stalecucumber/pickle_machine.go new file mode 100644 index 00000000..b302608d --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/pickle_machine.go @@ -0,0 +1,598 @@ +/* +This package reads and writes pickled data. The format is the same +as the Python "pickle" module. + +Protocols 0,1,2 are implemented. These are the versions written by the Python +2.x series. Python 3 defines newer protocol versions, but can write the older +protocol versions so they are readable by this package. + +To read data, see stalecucumber.Unpickle. + +To write data, see stalecucumber.NewPickler. + +TLDR + +Read a pickled string or unicode object + pickle.dumps("foobar") + --- + var somePickledData io.Reader + mystring, err := stalecucumber.String(stalecucumber.Unpickle(somePickledData)) + +Read a pickled integer + pickle.dumps(42) + --- + var somePickledData io.Reader + myint64, err := stalecucumber.Int(stalecucumber.Unpickle(somePickledData)) + +Read a pickled list of numbers into a structure + pickle.dumps([8,8,2005]) + --- + var somePickledData io.Reader + numbers := make([]int64,0) + + err := stalecucumber.UnpackInto(&numbers).From(stalecucumber.Unpickle(somePickledData)) + +Read a pickled dictionary into a structure + pickle.dumps({"apple":1,"banana":2,"cat":"hello","Dog":42.0}) + --- + var somePickledData io.Reader + mystruct := struct{ + Apple int + Banana uint + Cat string + Dog float32}{} + + err := stalecucumber.UnpackInto(&mystruct).From(stalecucumber.Unpickle(somePickledData)) + +Pickle a struct + + buf := new(bytes.Buffer) + mystruct := struct{ + Apple int + Banana uint + Cat string + Dog float32}{} + + err := stalecucumber.NewPickler(buf).Pickle(mystruct) + + + +Recursive objects + +You can pickle recursive objects like so + + a = {} + a["self"] = a + pickle.dumps(a) + +Python's pickler is intelligent enough not to emit an infinite data structure +when a recursive object is pickled. + +I recommend against pickling recursive objects in the first place, but this +library handles unpickling them without a problem. The result of unpickling +the above is map[interface{}]interface{} with a key "a" that contains +a reference to itself. + +Attempting to unpack the result of the above python code into a structure +with UnpackInto would either fail or recurse forever. + +Protocol Performance + +If the version of Python you are using supports protocol version 1 or 2, +you should always specify that protocol version. By default the "pickle" +and "cPickle" modules in Python write using protocol 0. Protocol 0 +requires much more space to represent the same values and is much +slower to parse. + +Unsupported Opcodes + +The pickle format is incredibly flexible and as a result has some +features that are impractical or unimportant when implementing a reader in +another language. + +Each set of opcodes is listed below by protocol version with the impact. + +Protocol 0 + + GLOBAL + +This opcode is equivalent to calling "import foo; foo.bar" in python. It is +generated whenever an object instance, class definition, or method definition +is serialized. As long as the pickled data does not contain an instance +of a python class or a reference to a python callable this opcode is not +emitted by the "pickle" module. + +A few examples of what will definitely cause this opcode to be emitted + + pickle.dumps(range) #Pickling the range function + pickle.dumps(Exception()) #Pickling an instance of a python class + +This opcode will be partially supported in a future revision to this package +that allows the unpickling of instances of Python classes. + + REDUCE + BUILD + INST + +These opcodes are used in recreating pickled python objects. That is currently +not supported by this package. + +These opcodes will be supported in a future revision to this package +that allows the unpickling of instances of Python classes. + + PERSID + +This opcode is used to reference concrete definitions of objects between +a pickler and an unpickler by an ID number. The pickle protocol doesn't define +what a persistent ID means. + +This opcode is unlikely to ever be supported by this package. + +Protocol 1 + + OBJ + +This opcodes is used in recreating pickled python objects. That is currently +not supported by this package. + +This opcode will supported in a future revision to this package +that allows the unpickling of instances of Python classes. + + + BINPERSID + +This opcode is equivalent to PERSID in protocol 0 and won't be supported +for the same reason. + +Protocol 2 + + NEWOBJ + +This opcodes is used in recreating pickled python objects. That is currently +not supported by this package. + +This opcode will supported in a future revision to this package +that allows the unpickling of instances of Python classes. + + EXT1 + EXT2 + EXT4 + +These opcodes allow using a registry +of popular objects that are pickled by name, typically classes. +It is envisioned that through a global negotiation and +registration process, third parties can set up a mapping between +ints and object names. + +These opcodes are unlikely to ever be supported by this package. + +*/ +package stalecucumber + +import "errors" +import "io" +import "bytes" +import "encoding/binary" +import "fmt" + +var ErrOpcodeStopped = errors.New("STOP opcode found") +var ErrStackTooSmall = errors.New("Stack is too small to perform requested operation") +var ErrInputTruncated = errors.New("Input to the pickle machine was truncated") +var ErrOpcodeNotImplemented = errors.New("Input encountered opcode that is not implemented") +var ErrNoResult = errors.New("Input did not place a value onto the stack") +var ErrMarkNotFound = errors.New("Mark could not be found on the stack") + +/* +Unpickle a value from a reader. This function takes a reader and +attempts to read a complete pickle program from it. This is normally +the output of the function "pickle.dump" from Python. + +The returned type is interface{} because unpickling can generate any type. Use +a helper function to convert to another type without an additional type check. + +This function returns an error if +the reader fails, the pickled data is invalid, or if the pickled data contains +an unsupported opcode. See unsupported opcodes in the documentation of +this package for more information. + +Type Conversions + +Types conversion Python types to Go types is performed as followed + int -> int64 + string -> string + unicode -> string + float -> float64 + long -> big.Int from the "math/big" package + lists -> []interface{} + tuples -> []interface{} + dict -> map[interface{}]interface{} + +The following values are converted from Python to the Go types + True & False -> bool + None -> stalecucumber.PickleNone, sets pointers to nil + +Helper Functions + +The following helper functions were inspired by the github.com/garyburd/redigo +package. Each function takes the result of Unpickle as its arguments. If unpickle +fails it does nothing and returns that error. Otherwise it attempts to +convert to the appropriate type. If type conversion fails it returns an error + + String - string from Python string or unicode + Int - int64 from Python int or long + Bool - bool from Python True or False + Big - *big.Int from Python long + ListOrTuple - []interface{} from Python Tuple or List + Float - float64 from Python float + Dict - map[interface{}]interface{} from Python dictionary + DictString - + map[string]interface{} from Python dictionary. + Keys must all be of type unicode or string. + +Unpacking into structures + +If the pickled object is a python dictionary that has only unicode and string +objects for keys, that object can be unpickled into a struct in Go by using +the "UnpackInto" function. The "From" receiver on the return value accepts +the result of "Unpickle" as its actual parameters. + +The keys of the python dictionary are assigned to fields in a structure. +Structures may specify the tag "pickle" on fields. The value of this tag is taken +as the key name of the Python dictionary value to place in this field. If no +field has a matching "pickle" tag the fields are looked up by name. If +the first character of the key is not uppercase, it is uppercased. If a field +matching that name is found, the value in the python dictionary is unpacked +into the value of the field within the structure. + +A list of python dictionaries can be unpickled into a slice of structures in +Go. + +A homogeneous list of python values can be unpickled into a slice in +Go with the appropriate element type. + +A nested python dictionary is unpickled into nested structures in Go. If a +field is of type map[interface{}]interface{} it is of course unpacked into that +as well. + +By default UnpackInto skips any missing fields and fails if a field's +type is not compatible with the object's type. + +This behavior can be changed by setting "AllowMissingFields" and +"AllowMismatchedFields" on the return value of UnpackInto before calling +From. + +*/ +func Unpickle(reader io.Reader) (interface{}, error) { + var pm PickleMachine + pm.buf = &bytes.Buffer{} + pm.Reader = reader + pm.lastMark = -1 + //Pre allocate a small stack + pm.Stack = make([]interface{}, 0, 16) + + err := (&pm).execute() + if err != ErrOpcodeStopped { + return nil, pm.error(err) + } + + if len(pm.Stack) == 0 { + return nil, ErrNoResult + } + + return pm.Stack[0], nil + +} + +var jumpList = buildEmptyJumpList() + +func init() { + populateJumpList(&jumpList) +} + +/* +This type is returned whenever Unpickle encounters an error in pickled data. +*/ +type PickleMachineError struct { + Err error + StackSize int + MemoSize int + Opcode uint8 +} + +/* +This struct is current exposed but not useful. It is likely to be hidden +in the near future. +*/ +type PickleMachine struct { + Stack []interface{} + Memo []interface{} + Reader io.Reader + + currentOpcode uint8 + buf *bytes.Buffer + lastMark int + + memoBuffer [16]memoBufferElement + memoBufferMaxDestination int64 + memoBufferIndex int +} + +type memoBufferElement struct { + Destination int64 + V interface{} +} + +func (pme PickleMachineError) Error() string { + return fmt.Sprintf("Pickle Machine failed on opcode:0x%x. Stack size:%d. Memo size:%d. Cause:%v", pme.Opcode, pme.StackSize, pme.MemoSize, pme.Err) +} + +func (pm *PickleMachine) error(src error) error { + return PickleMachineError{ + StackSize: len(pm.Stack), + MemoSize: len(pm.Memo), + Err: src, + Opcode: pm.currentOpcode, + } +} + +func (pm *PickleMachine) execute() error { + for { + err := binary.Read(pm.Reader, binary.BigEndian, &pm.currentOpcode) + if err != nil { + return err + } + + err = jumpList[int(pm.currentOpcode)](pm) + + if err != nil { + return err + } + } +} + +func (pm *PickleMachine) flushMemoBuffer(vIndex int64, v interface{}) { + //Extend the memo until it is large enough + if pm.memoBufferMaxDestination >= int64(len(pm.Memo)) { + replacement := make([]interface{}, pm.memoBufferMaxDestination<<1) + copy(replacement, pm.Memo) + pm.Memo = replacement + } + + //If a value was passed into this function, write it into the memo + //as well + if vIndex != -1 { + pm.Memo[vIndex] = v + } + + //Write the contents of the buffer into the memo + //in the same order as the puts were issued + for i := 0; i != pm.memoBufferIndex; i++ { + buffered := pm.memoBuffer[i] + pm.Memo[buffered.Destination] = buffered.V + } + + //Reset the buffer + pm.memoBufferIndex = 0 + pm.memoBufferMaxDestination = 0 + + return +} + +func (pm *PickleMachine) storeMemo(index int64, v interface{}) error { + if index < 0 { + return fmt.Errorf("Requested to write to invalid memo index:%v", index) + } + + //If there is space in the memo presently, then store it + //and it is done. + if index < int64(len(pm.Memo)) { + pm.Memo[index] = v + return nil + } + + //Update the maximum index in the buffer if need be + if index > pm.memoBufferMaxDestination { + pm.memoBufferMaxDestination = index + } + + //If the buffer is not full write into it + if pm.memoBufferIndex != len(pm.memoBuffer) { + pm.memoBuffer[pm.memoBufferIndex].V = v + pm.memoBuffer[pm.memoBufferIndex].Destination = index + pm.memoBufferIndex++ + } else { + //If the buffer is full flush it now + pm.flushMemoBuffer(index, v) + } + + return nil +} + +func (pm *PickleMachine) readFromMemo(index int64) (interface{}, error) { + if index < 0 { + return nil, fmt.Errorf("Requested to read from negative memo index %d", index) + + } + + //Test to see if the value is outside the current length of the memo + if index >= int64(len(pm.Memo)) { + pm.flushMemoBuffer(-1, nil) + if index >= int64(len(pm.Memo)) { + return nil, fmt.Errorf("Requested to read from invalid memo index %d", index) + } + } + + //Grab the value + retval := pm.Memo[index] + + //If nil then flush the memo buffer to see if it is within it + if retval == nil { + pm.flushMemoBuffer(-1, nil) + //Grab the value again after the flush + retval = pm.Memo[index] + //If still nil, then this is a read from an invalid position + if retval == nil { + return nil, fmt.Errorf("Requested to read from invalid memo index %d", index) + } + } + + return retval, nil +} + +func (pm *PickleMachine) push(v interface{}) { + pm.Stack = append(pm.Stack, v) +} + +func (pm *PickleMachine) pop() (interface{}, error) { + l := len(pm.Stack) + if l == 0 { + return nil, ErrStackTooSmall + } + + l-- + top := pm.Stack[l] + pm.Stack = pm.Stack[:l] + return top, nil +} + +func (pm *PickleMachine) readFromStack(offset int) (interface{}, error) { + return pm.readFromStackAt(len(pm.Stack) - 1 - offset) +} + +func (pm *PickleMachine) readFromStackAt(position int) (interface{}, error) { + + if position < 0 { + return nil, fmt.Errorf("Request to read from invalid stack position %d", position) + } + + return pm.Stack[position], nil + +} + +func (pm *PickleMachine) readIntFromStack(offset int) (int64, error) { + v, err := pm.readFromStack(offset) + if err != nil { + return 0, err + } + + vi, ok := v.(int64) + if !ok { + return 0, fmt.Errorf("Type %T was requested from stack but found %v(%T)", vi, v, v) + } + + return vi, nil +} + +func (pm *PickleMachine) popAfterIndex(index int) { + //Input to this function must be sane, no checking is done + + /** + if len(pm.Stack)-1 < index { + return ErrStackTooSmall + }**/ + + pm.Stack = pm.Stack[0:index] +} + +func (pm *PickleMachine) findMark() (int, error) { + if pm.lastMark != -1 { + mark := pm.lastMark + pm.lastMark = -1 + if mark < len(pm.Stack) { + if _, ok := pm.Stack[mark].(PickleMark); ok { + return mark, nil + } + } + } + + for i := len(pm.Stack) - 1; i != -1; i-- { + if _, ok := pm.Stack[i].(PickleMark); ok { + return i, nil + } + } + return -1, ErrMarkNotFound +} + +func (pm *PickleMachine) readFixedLengthRaw(l int64) ([]byte, error) { + + pm.buf.Reset() + _, err := io.CopyN(pm.buf, pm.Reader, l) + if err != nil { + return nil, err + } + + return pm.buf.Bytes(), nil +} + +func (pm *PickleMachine) readFixedLengthString(l int64) (string, error) { + + //Avoid getting "" + if l == 0 { + return "", nil + } + + pm.buf.Reset() + _, err := io.CopyN(pm.buf, pm.Reader, l) + if err != nil { + return "", err + } + return pm.buf.String(), nil +} + +func (pm *PickleMachine) readBytes() ([]byte, error) { + //This is slow and protocol 0 only + pm.buf.Reset() + for { + var v [1]byte + n, err := pm.Reader.Read(v[:]) + if n != 1 { + return nil, ErrInputTruncated + } + if err != nil { + return nil, err + } + + if v[0] == '\n' { + break + } + pm.buf.WriteByte(v[0]) + } + + return pm.buf.Bytes(), nil +} + +func (pm *PickleMachine) readString() (string, error) { + //This is slow and protocol 0 only + pm.buf.Reset() + for { + var v [1]byte + n, err := pm.Reader.Read(v[:]) + if n != 1 { + return "", ErrInputTruncated + } + if err != nil { + return "", err + } + + if v[0] == '\n' { + break + } + pm.buf.WriteByte(v[0]) + } + + //Avoid getting "" + if pm.buf.Len() == 0 { + return "", nil + } + return pm.buf.String(), nil +} + +func (pm *PickleMachine) readBinaryInto(dst interface{}, bigEndian bool) error { + var bo binary.ByteOrder + if bigEndian { + bo = binary.BigEndian + } else { + bo = binary.LittleEndian + } + return binary.Read(pm.Reader, bo, dst) +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/pickle_writer.go b/vendor/github.com/hydrogen18/stalecucumber/pickle_writer.go new file mode 100644 index 00000000..1fd316d0 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/pickle_writer.go @@ -0,0 +1,514 @@ +package stalecucumber + +import "io" +import "reflect" +import "errors" +import "encoding/binary" +import "fmt" +import "math/big" + +type pickleProxy interface { + WriteTo(io.Writer) (int, error) +} + +type Pickler struct { + W io.Writer + + program []pickleProxy +} + +/* +This type is used to pickle data.Picklers are created +by calling NewPickler. Each call to Pickle writes a +complete pickle program to the underlying io.Writer object. + +Its safe to assign W to other values in between calls to Pickle. + +Failures return the underlying error or an instance of PicklingError. + +Data is always written using Pickle Protocol 2. This format is +compatible with Python 2.3 and all newer version. + +Type Conversions + +Type conversion from Go types to Python types is as follows + + uint8,uint16,int8,int16,int32 -> Python int + int,int64,uint,uint64 -> Python int if it fits, otherwise Python Long + string -> Python unicode + slices, arrays -> Python list + maps -> Python dict + bool -> Python True and False + big.Int -> Python Long + struct -> Python dict + +Structs are pickled using their field names unless a tag is present on the +field specifying the name. For example + + type MyType struct { + FirstField int + SecondField int `pickle:"meow"` + } + +This struct would be pickled into a dictionary with two keys: "FirstField" +and "meow". + +Embedded structs are marshalled as a nested dictionary. Exported types +are never pickled. + +Pickling Tuples + +There is no equivalent type to Python's tuples in Go. You may not need +to use tuples at all. For example, consider the following Python code + + + a, b, c = pickle.load(data_in) + +This code tries to set to the variables "a", "b", and "c" from the result +of unpickling. In this case it does not matter if the source type +is a Python list or a Python tuple. + +If you really need to write tuples, call NewTuple and pass the data +in as the arguments. This special type exists to inform stalecucumber.Pickle that +a tuple should be pickled. + +*/ +func NewPickler(writer io.Writer) *Pickler { + retval := &Pickler{} + retval.W = writer + return retval +} + +func (p *Pickler) Pickle(v interface{}) (int, error) { + if p.program != nil { + p.program = p.program[0:0] + } + + err := p.dump(v) + if err != nil { + return 0, err + } + + return p.writeProgram() +} + +var programStart = []uint8{OPCODE_PROTO, 0x2} +var programEnd = []uint8{OPCODE_STOP} + +func (p *Pickler) writeProgram() (n int, err error) { + n, err = p.W.Write(programStart) + if err != nil { + return + } + var m int + for _, proxy := range p.program { + m, err = proxy.WriteTo(p.W) + if err != nil { + return + } + + n += m + } + + m, err = p.W.Write(programEnd) + if err != nil { + return + } + n += m + + return +} + +const BININT_MAX = (1 << 31) - 1 +const BININT_MIN = 0 - BININT_MAX + +var ErrTypeNotPickleable = errors.New("Can't pickle this type") +var ErrEmptyInterfaceNotPickleable = errors.New("The empty interface is not pickleable") + +type PicklingError struct { + V interface{} + Err error +} + +func (pe PicklingError) Error() string { + return fmt.Sprintf("Failed pickling (%T)%v:%v", pe.V, pe.V, pe.Err) +} + +func (p *Pickler) dump(input interface{}) error { + if input == nil { + p.pushOpcode(OPCODE_NONE) + return nil + } + + switch input := input.(type) { + case int: + if input <= BININT_MAX && input >= BININT_MIN { + p.dumpInt(int64(input)) + return nil + } + p.dumpIntAsLong(int64(input)) + return nil + case int64: + if input <= BININT_MAX && input >= BININT_MIN { + p.dumpInt(input) + return nil + } + p.dumpIntAsLong(input) + return nil + case int8: + p.dumpInt(int64(input)) + return nil + case int16: + p.dumpInt(int64(input)) + return nil + case int32: + p.dumpInt(int64(input)) + return nil + + case uint8: + p.dumpInt(int64(input)) + return nil + case uint16: + p.dumpInt(int64(input)) + return nil + + case uint32: + if input <= BININT_MAX { + p.dumpInt(int64(input)) + return nil + } + p.dumpUintAsLong(uint64(input)) + return nil + + case uint: + if input <= BININT_MAX { + p.dumpInt(int64(input)) + return nil + } + p.dumpUintAsLong(uint64(input)) + return nil + case uint64: + if input <= BININT_MAX { + p.dumpInt(int64(input)) + return nil + } + p.dumpUintAsLong(input) + return nil + case float32: + p.dumpFloat(float64(input)) + return nil + case float64: + p.dumpFloat(input) + return nil + case string: + p.dumpString(input) + return nil + case bool: + p.dumpBool(input) + return nil + case big.Int: + p.dumpBigInt(input) + return nil + case PickleNone: + p.pushOpcode(OPCODE_NONE) + return nil + case PickleTuple: + l := len(input) + switch l { + case 0: + p.pushOpcode(OPCODE_EMPTY_TUPLE) + return nil + case 1, 2, 3: + default: + p.pushOpcode(OPCODE_MARK) + } + + for _, v := range input { + err := p.dump(v) + if err != nil { + return err + } + } + + switch l { + case 1: + p.pushOpcode(OPCODE_TUPLE1) + case 2: + p.pushOpcode(OPCODE_TUPLE2) + case 3: + p.pushOpcode(OPCODE_TUPLE3) + default: + p.pushOpcode(OPCODE_TUPLE) + } + + return nil + } + + v := reflect.ValueOf(input) + vKind := v.Kind() + + switch vKind { + //Check for pointers. They can't be + //meaningfully written as a pickle unless nil. Dereference + //and recurse. + case reflect.Ptr: + if v.IsNil() { + p.pushOpcode(OPCODE_NONE) + return nil + } + return p.dump(v.Elem().Interface()) + case reflect.Map: + p.pushOpcode(OPCODE_EMPTY_DICT) + p.pushOpcode(OPCODE_MARK) + + keys := v.MapKeys() + for _, key := range keys { + err := p.dump(key.Interface()) + if err != nil { + return err + } + val := v.MapIndex(key) + err = p.dump(val.Interface()) + if err != nil { + return err + } + } + p.pushOpcode(OPCODE_SETITEMS) + return nil + case reflect.Slice, reflect.Array: + p.pushOpcode(OPCODE_EMPTY_LIST) + p.pushOpcode(OPCODE_MARK) + for i := 0; i != v.Len(); i++ { + element := v.Index(i) + p.dump(element.Interface()) + } + p.pushOpcode(OPCODE_APPENDS) + return nil + case reflect.Struct: + return p.dumpStruct(input) + } + + return PicklingError{V: input, Err: ErrTypeNotPickleable} +} + +func (p *Pickler) dumpBool(v bool) { + if v { + p.pushOpcode(OPCODE_NEWTRUE) + } else { + p.pushOpcode(OPCODE_NEWFALSE) + } +} + +func (p *Pickler) dumpStruct(input interface{}) error { + vType := reflect.TypeOf(input) + v := reflect.ValueOf(input) + + p.pushOpcode(OPCODE_EMPTY_DICT) + p.pushOpcode(OPCODE_MARK) + + for i := 0; i != v.NumField(); i++ { + field := vType.Field(i) + //Never attempt to write + //unexported names + if len(field.PkgPath) != 0 { + continue + } + + //Prefer the tagged name of the + //field, fall back to fields actual name + fieldKey := field.Tag.Get(PICKLE_TAG) + if len(fieldKey) == 0 { + fieldKey = field.Name + } + p.dumpString(fieldKey) + + fieldValue := v.Field(i) + err := p.dump(fieldValue.Interface()) + if err != nil { + return err + } + + } + p.pushOpcode(OPCODE_SETITEMS) + return nil +} + +func (p *Pickler) pushProxy(proxy pickleProxy) { + p.program = append(p.program, proxy) +} + +func (p *Pickler) dumpFloat(v float64) { + p.pushProxy(floatProxy(v)) +} + +type opcodeProxy uint8 + +func (proxy opcodeProxy) WriteTo(w io.Writer) (int, error) { + return w.Write([]byte{byte(proxy)}) +} + +func (p *Pickler) pushOpcode(code uint8) { + p.pushProxy(opcodeProxy(code)) +} + +type bigIntProxy struct { + v *big.Int +} + +var zeroPad = []byte{0} +var maxPad = []byte{0xff} + +func (proxy bigIntProxy) WriteTo(w io.Writer) (int, error) { + var negative = proxy.v.Sign() == -1 + var raw []byte + if negative { + offset := big.NewInt(1) + + bitLen := uint(proxy.v.BitLen()) + remainder := bitLen % 8 + bitLen += 8 - remainder + + offset.Lsh(offset, bitLen) + + offset.Add(proxy.v, offset) + + raw = offset.Bytes() + } else { + raw = proxy.v.Bytes() + } + + var pad []byte + var padL int + var highBitSet = (raw[0] & 0x80) != 0 + + if negative && !highBitSet { + pad = maxPad + padL = 1 + } else if !negative && highBitSet { + pad = zeroPad + padL = 1 + } + + l := len(raw) + var header interface{} + if l < 256 { + header = struct { + Opcode uint8 + Length uint8 + }{ + OPCODE_LONG1, + uint8(l + padL), + } + } else { + header = struct { + Opcode uint8 + Length uint32 + }{ + OPCODE_LONG4, + uint32(l + padL), + } + } + + err := binary.Write(w, binary.LittleEndian, header) + if err != nil { + return 0, err + } + + n := binary.Size(header) + n += l + n += padL + + reversed := make([]byte, l) + + for i, v := range raw { + reversed[l-i-1] = v + } + + _, err = w.Write(reversed) + if err != nil { + return n, err + } + + _, err = w.Write(pad) + + return n, err +} + +func (p *Pickler) dumpIntAsLong(v int64) { + p.pushProxy(bigIntProxy{big.NewInt(v)}) +} + +func (p *Pickler) dumpBigInt(v big.Int) { + p.pushProxy(bigIntProxy{&v}) //Note that this is a shallow copy +} + +func (p *Pickler) dumpUintAsLong(v uint64) { + w := big.NewInt(0) + w.SetUint64(v) + p.pushProxy(bigIntProxy{w}) +} + +type floatProxy float64 + +func (proxy floatProxy) WriteTo(w io.Writer) (int, error) { + data := struct { + Opcode uint8 + V float64 + }{ + OPCODE_BINFLOAT, + float64(proxy), + } + + return binary.Size(data), binary.Write(w, binary.BigEndian, data) +} + +type intProxy int32 + +func (proxy intProxy) WriteTo(w io.Writer) (int, error) { + data := struct { + Opcode uint8 + V int32 + }{ + OPCODE_BININT, + int32(proxy), + } + + return binary.Size(data), binary.Write(w, binary.LittleEndian, data) +} + +func (p *Pickler) dumpInt(v int64) { + p.pushProxy(intProxy(v)) +} + +type stringProxy string + +func (proxy stringProxy) V() interface{} { + return proxy +} + +func (proxy stringProxy) WriteTo(w io.Writer) (int, error) { + header := struct { + Opcode uint8 + Length int32 + }{ + OPCODE_BINUNICODE, + int32(len(proxy)), + } + err := binary.Write(w, binary.LittleEndian, header) + if err != nil { + return 0, err + } + n := binary.Size(header) + + m, err := io.WriteString(w, string(proxy)) + if err != nil { + return 0, err + } + + return n + m, nil + +} + +func (p *Pickler) dumpString(v string) { + p.pushProxy(stringProxy(v)) +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/populate_jump_list.go b/vendor/github.com/hydrogen18/stalecucumber/populate_jump_list.go new file mode 100644 index 00000000..a9067ffa --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/populate_jump_list.go @@ -0,0 +1,58 @@ +package stalecucumber + +func populateJumpList(jl *opcodeJumpList) { + jl[OPCODE_INT] = (*PickleMachine).opcode_INT + jl[OPCODE_LONG] = (*PickleMachine).opcode_LONG + jl[OPCODE_STRING] = (*PickleMachine).opcode_STRING + jl[OPCODE_NONE] = (*PickleMachine).opcode_NONE + jl[OPCODE_UNICODE] = (*PickleMachine).opcode_UNICODE + jl[OPCODE_FLOAT] = (*PickleMachine).opcode_FLOAT + jl[OPCODE_APPEND] = (*PickleMachine).opcode_APPEND + jl[OPCODE_LIST] = (*PickleMachine).opcode_LIST + jl[OPCODE_TUPLE] = (*PickleMachine).opcode_TUPLE + jl[OPCODE_DICT] = (*PickleMachine).opcode_DICT + jl[OPCODE_SETITEM] = (*PickleMachine).opcode_SETITEM + jl[OPCODE_POP] = (*PickleMachine).opcode_POP + jl[OPCODE_DUP] = (*PickleMachine).opcode_DUP + jl[OPCODE_MARK] = (*PickleMachine).opcode_MARK + jl[OPCODE_GET] = (*PickleMachine).opcode_GET + jl[OPCODE_PUT] = (*PickleMachine).opcode_PUT + jl[OPCODE_GLOBAL] = (*PickleMachine).opcode_GLOBAL + jl[OPCODE_REDUCE] = (*PickleMachine).opcode_REDUCE + jl[OPCODE_BUILD] = (*PickleMachine).opcode_BUILD + jl[OPCODE_INST] = (*PickleMachine).opcode_INST + jl[OPCODE_STOP] = (*PickleMachine).opcode_STOP + jl[OPCODE_PERSID] = (*PickleMachine).opcode_PERSID + jl[OPCODE_BININT] = (*PickleMachine).opcode_BININT + jl[OPCODE_BININT1] = (*PickleMachine).opcode_BININT1 + jl[OPCODE_BININT2] = (*PickleMachine).opcode_BININT2 + jl[OPCODE_BINSTRING] = (*PickleMachine).opcode_BINSTRING + jl[OPCODE_SHORT_BINSTRING] = (*PickleMachine).opcode_SHORT_BINSTRING + jl[OPCODE_BINUNICODE] = (*PickleMachine).opcode_BINUNICODE + jl[OPCODE_BINFLOAT] = (*PickleMachine).opcode_BINFLOAT + jl[OPCODE_EMPTY_LIST] = (*PickleMachine).opcode_EMPTY_LIST + jl[OPCODE_APPENDS] = (*PickleMachine).opcode_APPENDS + jl[OPCODE_EMPTY_TUPLE] = (*PickleMachine).opcode_EMPTY_TUPLE + jl[OPCODE_EMPTY_DICT] = (*PickleMachine).opcode_EMPTY_DICT + jl[OPCODE_SETITEMS] = (*PickleMachine).opcode_SETITEMS + jl[OPCODE_POP_MARK] = (*PickleMachine).opcode_POP_MARK + jl[OPCODE_BINGET] = (*PickleMachine).opcode_BINGET + jl[OPCODE_LONG_BINGET] = (*PickleMachine).opcode_LONG_BINGET + jl[OPCODE_BINPUT] = (*PickleMachine).opcode_BINPUT + jl[OPCODE_LONG_BINPUT] = (*PickleMachine).opcode_LONG_BINPUT + jl[OPCODE_OBJ] = (*PickleMachine).opcode_OBJ + jl[OPCODE_BINPERSID] = (*PickleMachine).opcode_BINPERSID + jl[OPCODE_LONG1] = (*PickleMachine).opcode_LONG1 + jl[OPCODE_LONG4] = (*PickleMachine).opcode_LONG4 + jl[OPCODE_NEWTRUE] = (*PickleMachine).opcode_NEWTRUE + jl[OPCODE_NEWFALSE] = (*PickleMachine).opcode_NEWFALSE + jl[OPCODE_TUPLE1] = (*PickleMachine).opcode_TUPLE1 + jl[OPCODE_TUPLE2] = (*PickleMachine).opcode_TUPLE2 + jl[OPCODE_TUPLE3] = (*PickleMachine).opcode_TUPLE3 + jl[OPCODE_EXT1] = (*PickleMachine).opcode_EXT1 + jl[OPCODE_EXT2] = (*PickleMachine).opcode_EXT2 + jl[OPCODE_EXT4] = (*PickleMachine).opcode_EXT4 + jl[OPCODE_NEWOBJ] = (*PickleMachine).opcode_NEWOBJ + jl[OPCODE_PROTO] = (*PickleMachine).opcode_PROTO +} + diff --git a/vendor/github.com/hydrogen18/stalecucumber/protocol_0.go b/vendor/github.com/hydrogen18/stalecucumber/protocol_0.go new file mode 100644 index 00000000..e77dcfd4 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/protocol_0.go @@ -0,0 +1,723 @@ +package stalecucumber + +import "strconv" +import "fmt" +import "math/big" +import "errors" + +//import "unicode/utf8" +import "unicode/utf16" + +/** +Opcode: INT +Push an integer or bool. + + The argument is a newline-terminated decimal literal string. + + The intent may have been that this always fit in a short Python int, + but INT can be generated in pickles written on a 64-bit box that + require a Python long on a 32-bit box. The difference between this + and LONG then is that INT skips a trailing 'L', and produces a short + int whenever possible. + + Another difference is due to that, when bool was introduced as a + distinct type in 2.3, builtin names True and False were also added to + 2.2.2, mapping to ints 1 and 0. For compatibility in both directions, + True gets pickled as INT + "I01\n", and False as INT + "I00\n". + Leading zeroes are never produced for a genuine integer. The 2.3 + (and later) unpicklers special-case these and return bool instead; + earlier unpicklers ignore the leading "0" and return the int. + ** +Stack before: [] +Stack after: [int_or_bool] +**/ +func (pm *PickleMachine) opcode_INT() error { + str, err := pm.readString() + if err != nil { + return err + } + + //check for boolean sentinels + if len(str) == 2 { + switch str { + case "01": + pm.push(true) + return nil + case "00": + pm.push(false) + return nil + default: + } + } + + n, err := strconv.ParseInt(str, 10, 64) + if err != nil { + return err + } + + pm.push(n) + return nil +} + +/** +Opcode: LONG +Push a long integer. + + The same as INT, except that the literal ends with 'L', and always + unpickles to a Python long. There doesn't seem a real purpose to the + trailing 'L'. + + Note that LONG takes time quadratic in the number of digits when + unpickling (this is simply due to the nature of decimal->binary + conversion). Proto 2 added linear-time (in C; still quadratic-time + in Python) LONG1 and LONG4 opcodes. + ** +Stack before: [] +Stack after: [long] +**/ +func (pm *PickleMachine) opcode_LONG() error { + i := new(big.Int) + str, err := pm.readString() + if err != nil { + return err + } + if len(str) == 0 { + return fmt.Errorf("String for LONG opcode cannot be zero length") + } + + last := str[len(str)-1] + if last != 'L' { + return fmt.Errorf("String for LONG opcode must end with %q not %q", "L", last) + } + v := str[:len(str)-1] + _, err = fmt.Sscan(v, i) + if err != nil { + return err + } + pm.push(i) + return nil +} + +/** +Opcode: STRING +Push a Python string object. + + The argument is a repr-style string, with bracketing quote characters, + and perhaps embedded escapes. The argument extends until the next + newline character. + ** +Stack before: [] +Stack after: [str] +**/ + +var unquoteInputs = []byte{0x27, 0x22, 0x0} + +func (pm *PickleMachine) opcode_STRING() error { + str, err := pm.readString() + if err != nil { + return err + } + + //For whatever reason, the string is quoted. So the first and last character + //should always be the single quote + if len(str) < 2 { + return fmt.Errorf("For STRING opcode, argument has invalid length %d", len(str)) + } + + if str[0] != '\'' || str[len(str)-1] != '\'' { + return fmt.Errorf("For STRING opcode, argument has poorly formed value %q", str) + } + + v := str[1 : len(str)-1] + + f := make([]rune, 0, len(v)) + + for len(v) != 0 { + var vr rune + var replacement string + for _, i := range unquoteInputs { + vr, _, replacement, err = strconv.UnquoteChar(v, i) + if err == nil { + break + } + } + + if err != nil { + c := v[0] + return fmt.Errorf("Read thus far %q. Failed to unquote character %c error:%v", string(f), c, err) + } + v = replacement + + f = append(f, vr) + } + + pm.push(string(f)) + return nil +} + +/** +Opcode: NONE +Push None on the stack.** +Stack before: [] +Stack after: [None] +**/ +func (pm *PickleMachine) opcode_NONE() error { + pm.push(PickleNone{}) + return nil +} + +/** +Opcode: UNICODE +Push a Python Unicode string object. + + The argument is a raw-unicode-escape encoding of a Unicode string, + and so may contain embedded escape sequences. The argument extends + until the next newline character. + ** +Stack before: [] +Stack after: [unicode] +**/ +func (pm *PickleMachine) opcode_UNICODE() error { + str, err := pm.readBytes() + if err != nil { + return err + } + + f := make([]rune, 0, len(str)) + + var total int + var consumed int + total = len(str) + for total != consumed { + h := str[consumed] + + //Python 'raw-unicode-escape' doesnt + //escape extended ascii + if h > 127 { + ea := utf16.Decode([]uint16{uint16(h)}) + f = append(f, ea...) + consumed += 1 + continue + } + + //Multibyte unicode points are escaped + //so use "UnquoteChar" to handle those + var vr rune + for _, i := range unquoteInputs { + pre := string(str[consumed:]) + var post string + vr, _, post, err = strconv.UnquoteChar(pre, i) + if err == nil { + consumed += len(pre) - len(post) + break + } + + } + + if err != nil { + c := str[0] + return fmt.Errorf("Read thus far %q. Failed to unquote character %c error:%v", string(f), c, err) + } + + f = append(f, vr) + } + + pm.push(string(f)) + + return nil +} + +/** +Opcode: FLOAT +Newline-terminated decimal float literal. + + The argument is repr(a_float), and in general requires 17 significant + digits for roundtrip conversion to be an identity (this is so for + IEEE-754 double precision values, which is what Python float maps to + on most boxes). + + In general, FLOAT cannot be used to transport infinities, NaNs, or + minus zero across boxes (or even on a single box, if the platform C + library can't read the strings it produces for such things -- Windows + is like that), but may do less damage than BINFLOAT on boxes with + greater precision or dynamic range than IEEE-754 double. + ** +Stack before: [] +Stack after: [float] +**/ +func (pm *PickleMachine) opcode_FLOAT() error { + str, err := pm.readString() + if err != nil { + return err + } + var v float64 + _, err = fmt.Sscanf(str, "%f", &v) + if err != nil { + return err + } + pm.push(v) + return nil +} + +/** +Opcode: APPEND +Append an object to a list. + + Stack before: ... pylist anyobject + Stack after: ... pylist+[anyobject] + + although pylist is really extended in-place. + ** +Stack before: [list, any] +Stack after: [list] +**/ +func (pm *PickleMachine) opcode_APPEND() error { + v, err := pm.pop() + if err != nil { + return err + } + + listI, err := pm.pop() + if err != nil { + return err + } + + list, ok := listI.([]interface{}) + if !ok { + fmt.Errorf("Second item on top of stack must be of %T not %T", list, listI) + } + list = append(list, v) + pm.push(list) + return nil +} + +/** +Opcode: LIST +Build a list out of the topmost stack slice, after markobject. + + All the stack entries following the topmost markobject are placed into + a single Python list, which single list object replaces all of the + stack from the topmost markobject onward. For example, + + Stack before: ... markobject 1 2 3 'abc' + Stack after: ... [1, 2, 3, 'abc'] + ** +Stack before: [mark, stackslice] +Stack after: [list] +**/ +func (pm *PickleMachine) opcode_LIST() error { + markIndex, err := pm.findMark() + if err != nil { + return err + } + v := make([]interface{}, 0) + for i := markIndex + 1; i != len(pm.Stack); i++ { + v = append(v, pm.Stack[i]) + } + + //Pop the values off the stack + pm.popAfterIndex(markIndex) + + pm.push(v) + return nil +} + +/** +Opcode: TUPLE +Build a tuple out of the topmost stack slice, after markobject. + + All the stack entries following the topmost markobject are placed into + a single Python tuple, which single tuple object replaces all of the + stack from the topmost markobject onward. For example, + + Stack before: ... markobject 1 2 3 'abc' + Stack after: ... (1, 2, 3, 'abc') + ** +Stack before: [mark, stackslice] +Stack after: [tuple] +**/ +func (pm *PickleMachine) opcode_TUPLE() error { + return pm.opcode_LIST() +} + +/** +Opcode: DICT +Build a dict out of the topmost stack slice, after markobject. + + All the stack entries following the topmost markobject are placed into + a single Python dict, which single dict object replaces all of the + stack from the topmost markobject onward. The stack slice alternates + key, value, key, value, .... For example, + + Stack before: ... markobject 1 2 3 'abc' + Stack after: ... {1: 2, 3: 'abc'} + ** +Stack before: [mark, stackslice] +Stack after: [dict] +**/ +func (pm *PickleMachine) opcode_DICT() (err error) { + defer func() { + if r := recover(); r != nil { + switch x := r.(type) { + case string: + err = errors.New(x) + case error: + err = x + default: + err = errors.New("Unknown panic") + } + } + }() + markIndex, err := pm.findMark() + if err != nil { + return err + } + + v := make(map[interface{}]interface{}) + var key interface{} + for i := markIndex + 1; i != len(pm.Stack); i++ { + if key == nil { + key = pm.Stack[i] + } else { + v[key] = pm.Stack[i] + key = nil + } + } + if key != nil { + return fmt.Errorf("For opcode DICT stack after mark contained an odd number of items, this is not valid") + } + pm.popAfterIndex(markIndex) + + pm.push(v) + return nil +} + +/** +Opcode: SETITEM +Add a key+value pair to an existing dict. + + Stack before: ... pydict key value + Stack after: ... pydict + + where pydict has been modified via pydict[key] = value. + ** +Stack before: [dict, any, any] +Stack after: [dict] +**/ +func (pm *PickleMachine) opcode_SETITEM() (err error) { + defer func() { + if r := recover(); r != nil { + switch x := r.(type) { + case string: + err = errors.New(x) + case error: + err = x + default: + err = errors.New("Unknown panic") + } + } + }() + v, err := pm.pop() + if err != nil { + return err + } + + k, err := pm.pop() + if err != nil { + return err + } + + dictI, err := pm.pop() + if err != nil { + return err + } + + dict, ok := dictI.(map[interface{}]interface{}) + if !ok { + return fmt.Errorf("For opcode SETITEM stack item 2 from top must be of type %T not %T", dict, dictI) + } + + dict[k] = v + pm.push(dict) + + return nil +} + +/** +Opcode: POP +Discard the top stack item, shrinking the stack by one item.** +Stack before: [any] +Stack after: [] +**/ +func (pm *PickleMachine) opcode_POP() error { + _, err := pm.pop() + return err + +} + +/** +Opcode: DUP +Push the top stack item onto the stack again, duplicating it.** +Stack before: [any] +Stack after: [any, any] +**/ +func (pm *PickleMachine) opcode_DUP() error { + return ErrOpcodeNotImplemented +} + +/** +Opcode: MARK +Push markobject onto the stack. + + markobject is a unique object, used by other opcodes to identify a + region of the stack containing a variable number of objects for them + to work on. See markobject.doc for more detail. + ** +Stack before: [] +Stack after: [mark] +**/ +func (pm *PickleMachine) opcode_MARK() error { + pm.lastMark = len(pm.Stack) + pm.push(PickleMark{}) + return nil +} + +/** +Opcode: GET +Read an object from the memo and push it on the stack. + + The index of the memo object to push is given by the newline-terminated + decimal string following. BINGET and LONG_BINGET are space-optimized + versions. + ** +Stack before: [] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_GET() error { + str, err := pm.readString() + if err != nil { + return err + } + + index, err := strconv.Atoi(str) + if err != nil { + return err + } + + v, err := pm.readFromMemo(int64(index)) + if err != nil { + return err + } + + //TODO test if the object we are about to push is mutable + //if so it needs to be somehow deep copied first + pm.push(v) + return nil +} + +/** +Opcode: PUT +Store the stack top into the memo. The stack is not popped. + + The index of the memo location to write into is given by the newline- + terminated decimal string following. BINPUT and LONG_BINPUT are + space-optimized versions. + ** +Stack before: [] +Stack after: [] +**/ +func (pm *PickleMachine) opcode_PUT() error { + if len(pm.Stack) < 1 { + return ErrStackTooSmall + } + + str, err := pm.readString() + if err != nil { + return err + } + + idx, err := strconv.Atoi(str) + if err != nil { + return err + } + + pm.storeMemo(int64(idx), pm.Stack[len(pm.Stack)-1]) + + return nil +} + +/** +Opcode: GLOBAL +Push a global object (module.attr) on the stack. + + Two newline-terminated strings follow the GLOBAL opcode. The first is + taken as a module name, and the second as a class name. The class + object module.class is pushed on the stack. More accurately, the + object returned by self.find_class(module, class) is pushed on the + stack, so unpickling subclasses can override this form of lookup. + ** +Stack before: [] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_GLOBAL() error { + //TODO push an object that represents the result of this operation + return ErrOpcodeNotImplemented +} + +/** +Opcode: REDUCE +Push an object built from a callable and an argument tuple. + + The opcode is named to remind of the __reduce__() method. + + Stack before: ... callable pytuple + Stack after: ... callable(*pytuple) + + The callable and the argument tuple are the first two items returned + by a __reduce__ method. Applying the callable to the argtuple is + supposed to reproduce the original object, or at least get it started. + If the __reduce__ method returns a 3-tuple, the last component is an + argument to be passed to the object's __setstate__, and then the REDUCE + opcode is followed by code to create setstate's argument, and then a + BUILD opcode to apply __setstate__ to that argument. + + If type(callable) is not ClassType, REDUCE complains unless the + callable has been registered with the copy_reg module's + safe_constructors dict, or the callable has a magic + '__safe_for_unpickling__' attribute with a true value. I'm not sure + why it does this, but I've sure seen this complaint often enough when + I didn't want to . + ** +Stack before: [any, any] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_REDUCE() error { + //TODO push an object that represents the result result of this operation + return ErrOpcodeNotImplemented +} + +/** +Opcode: BUILD +Finish building an object, via __setstate__ or dict update. + + Stack before: ... anyobject argument + Stack after: ... anyobject + + where anyobject may have been mutated, as follows: + + If the object has a __setstate__ method, + + anyobject.__setstate__(argument) + + is called. + + Else the argument must be a dict, the object must have a __dict__, and + the object is updated via + + anyobject.__dict__.update(argument) + + This may raise RuntimeError in restricted execution mode (which + disallows access to __dict__ directly); in that case, the object + is updated instead via + + for k, v in argument.items(): + anyobject[k] = v + ** +Stack before: [any, any] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_BUILD() error { + return ErrOpcodeNotImplemented +} + +/** +Opcode: INST +Build a class instance. + + This is the protocol 0 version of protocol 1's OBJ opcode. + INST is followed by two newline-terminated strings, giving a + module and class name, just as for the GLOBAL opcode (and see + GLOBAL for more details about that). self.find_class(module, name) + is used to get a class object. + + In addition, all the objects on the stack following the topmost + markobject are gathered into a tuple and popped (along with the + topmost markobject), just as for the TUPLE opcode. + + Now it gets complicated. If all of these are true: + + + The argtuple is empty (markobject was at the top of the stack + at the start). + + + It's an old-style class object (the type of the class object is + ClassType). + + + The class object does not have a __getinitargs__ attribute. + + then we want to create an old-style class instance without invoking + its __init__() method (pickle has waffled on this over the years; not + calling __init__() is current wisdom). In this case, an instance of + an old-style dummy class is created, and then we try to rebind its + __class__ attribute to the desired class object. If this succeeds, + the new instance object is pushed on the stack, and we're done. In + restricted execution mode it can fail (assignment to __class__ is + disallowed), and I'm not really sure what happens then -- it looks + like the code ends up calling the class object's __init__ anyway, + via falling into the next case. + + Else (the argtuple is not empty, it's not an old-style class object, + or the class object does have a __getinitargs__ attribute), the code + first insists that the class object have a __safe_for_unpickling__ + attribute. Unlike as for the __safe_for_unpickling__ check in REDUCE, + it doesn't matter whether this attribute has a true or false value, it + only matters whether it exists (XXX this is a bug; cPickle + requires the attribute to be true). If __safe_for_unpickling__ + doesn't exist, UnpicklingError is raised. + + Else (the class object does have a __safe_for_unpickling__ attr), + the class object obtained from INST's arguments is applied to the + argtuple obtained from the stack, and the resulting instance object + is pushed on the stack. + + NOTE: checks for __safe_for_unpickling__ went away in Python 2.3. + ** +Stack before: [mark, stackslice] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_INST() error { + return ErrOpcodeNotImplemented +} + +/** +Opcode: STOP +Stop the unpickling machine. + + Every pickle ends with this opcode. The object at the top of the stack + is popped, and that's the result of unpickling. The stack should be + empty then. + ** +Stack before: [any] +Stack after: [] +**/ +func (pm *PickleMachine) opcode_STOP() error { + return ErrOpcodeStopped +} + +/** +Opcode: PERSID +Push an object identified by a persistent ID. + + The pickle module doesn't define what a persistent ID means. PERSID's + argument is a newline-terminated str-style (no embedded escapes, no + bracketing quote characters) string, which *is* "the persistent ID". + The unpickler passes this string to self.persistent_load(). Whatever + object that returns is pushed on the stack. There is no implementation + of persistent_load() in Python's unpickler: it must be supplied by an + unpickler subclass. + ** +Stack before: [] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_PERSID() error { + return ErrOpcodeNotImplemented +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/protocol_1.go b/vendor/github.com/hydrogen18/stalecucumber/protocol_1.go new file mode 100644 index 00000000..80fb5267 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/protocol_1.go @@ -0,0 +1,523 @@ +package stalecucumber + +import "fmt" +import "errors" + +/** +Opcode: BININT (0x4a) +Push a four-byte signed integer. + + This handles the full range of Python (short) integers on a 32-bit + box, directly as binary bytes (1 for the opcode and 4 for the integer). + If the integer is non-negative and fits in 1 or 2 bytes, pickling via + BININT1 or BININT2 saves space. + ** +Stack before: [] +Stack after: [int] +**/ +func (pm *PickleMachine) opcode_BININT() error { + var v int32 + err := pm.readBinaryInto(&v, false) + if err != nil { + return err + } + + pm.push(int64(v)) + return nil +} + +/** +Opcode: BININT1 (0x4b) +Push a one-byte unsigned integer. + + This is a space optimization for pickling very small non-negative ints, + in range(256). + ** +Stack before: [] +Stack after: [int] +**/ +func (pm *PickleMachine) opcode_BININT1() error { + var v uint8 + err := pm.readBinaryInto(&v, false) + if err != nil { + return err + } + pm.push(int64(v)) + return nil +} + +/** +Opcode: BININT2 (0x4d) +Push a two-byte unsigned integer. + + This is a space optimization for pickling small positive ints, in + range(256, 2**16). Integers in range(256) can also be pickled via + BININT2, but BININT1 instead saves a byte. + ** +Stack before: [] +Stack after: [int] +**/ +func (pm *PickleMachine) opcode_BININT2() error { + var v uint16 + err := pm.readBinaryInto(&v, false) + if err != nil { + return err + } + pm.push(int64(v)) + return nil + +} + +/** +Opcode: BINSTRING (0x54) +Push a Python string object. + + There are two arguments: the first is a 4-byte little-endian signed int + giving the number of bytes in the string, and the second is that many + bytes, which are taken literally as the string content. + ** +Stack before: [] +Stack after: [str] +**/ +func (pm *PickleMachine) opcode_BINSTRING() error { + var strlen int32 + err := pm.readBinaryInto(&strlen, false) + if err != nil { + return err + } + + if strlen < 0 { + return fmt.Errorf("BINSTRING specified negative string length of %d", strlen) + } + + str, err := pm.readFixedLengthString(int64(strlen)) + if err != nil { + return err + } + pm.push(str) + return nil +} + +/** +Opcode: SHORT_BINSTRING (0x55) +Push a Python string object. + + There are two arguments: the first is a 1-byte unsigned int giving + the number of bytes in the string, and the second is that many bytes, + which are taken literally as the string content. + ** +Stack before: [] +Stack after: [str] +**/ +func (pm *PickleMachine) opcode_SHORT_BINSTRING() error { + var strlen uint8 + err := pm.readBinaryInto(&strlen, false) + if err != nil { + return err + } + + if strlen < 0 { + return fmt.Errorf("SHORT_BINSTRING specified negative string length of %d", strlen) + } + + str, err := pm.readFixedLengthString(int64(strlen)) + if err != nil { + return err + } + pm.push(str) + return nil +} + +/** +Opcode: BINUNICODE (0x58) +Push a Python Unicode string object. + + There are two arguments: the first is a 4-byte little-endian signed int + giving the number of bytes in the string. The second is that many + bytes, and is the UTF-8 encoding of the Unicode string. + ** +Stack before: [] +Stack after: [unicode] +**/ +func (pm *PickleMachine) opcode_BINUNICODE() error { + var l int32 + err := pm.readBinaryInto(&l, false) + if err != nil { + return err + } + + str, err := pm.readFixedLengthString(int64(l)) + if err != nil { + return err + } + + pm.push(str) + return nil +} + +/** +Opcode: BINFLOAT (0x47) +Float stored in binary form, with 8 bytes of data. + + This generally requires less than half the space of FLOAT encoding. + In general, BINFLOAT cannot be used to transport infinities, NaNs, or + minus zero, raises an exception if the exponent exceeds the range of + an IEEE-754 double, and retains no more than 53 bits of precision (if + there are more than that, "add a half and chop" rounding is used to + cut it back to 53 significant bits). + ** +Stack before: [] +Stack after: [float] +**/ +func (pm *PickleMachine) opcode_BINFLOAT() error { + var v float64 + err := pm.readBinaryInto(&v, true) + if err != nil { + return err + } + + pm.push(v) + return nil + +} + +/** +Opcode: EMPTY_LIST (0x5d) +Push an empty list.** +Stack before: [] +Stack after: [list] +**/ +func (pm *PickleMachine) opcode_EMPTY_LIST() error { + v := make([]interface{}, 0) + pm.push(v) + return nil +} + +/** +Opcode: APPENDS (0x65) +Extend a list by a slice of stack objects. + + Stack before: ... pylist markobject stackslice + Stack after: ... pylist+stackslice + + although pylist is really extended in-place. + ** +Stack before: [list, mark, stackslice] +Stack after: [list] +**/ +func (pm *PickleMachine) opcode_APPENDS() error { + markIndex, err := pm.findMark() + if err != nil { + return err + } + + pyListI, err := pm.readFromStackAt(markIndex - 1) + if err != nil { + return err + } + + pyList, ok := pyListI.([]interface{}) + if !ok { + return fmt.Errorf("APPENDS expected type %T but got (%v)%T", pyList, pyListI, pyListI) + } + + pyList = append(pyList, pm.Stack[markIndex+1:]...) + pm.popAfterIndex(markIndex - 1) + + /** + if err != nil { + return err + }**/ + + pm.push(pyList) + return nil +} + +/** +Opcode: EMPTY_TUPLE (0x29) +Push an empty tuple.** +Stack before: [] +Stack after: [tuple] +**/ +func (pm *PickleMachine) opcode_EMPTY_TUPLE() error { + return pm.opcode_EMPTY_LIST() +} + +/** +Opcode: EMPTY_DICT (0x7d) +Push an empty dict.** +Stack before: [] +Stack after: [dict] +**/ +func (pm *PickleMachine) opcode_EMPTY_DICT() error { + pm.push(make(map[interface{}]interface{})) + return nil +} + +/** +Opcode: SETITEMS (0x75) +Add an arbitrary number of key+value pairs to an existing dict. + + The slice of the stack following the topmost markobject is taken as + an alternating sequence of keys and values, added to the dict + immediately under the topmost markobject. Everything at and after the + topmost markobject is popped, leaving the mutated dict at the top + of the stack. + + Stack before: ... pydict markobject key_1 value_1 ... key_n value_n + Stack after: ... pydict + + where pydict has been modified via pydict[key_i] = value_i for i in + 1, 2, ..., n, and in that order. + ** +Stack before: [dict, mark, stackslice] +Stack after: [dict] +**/ +func (pm *PickleMachine) opcode_SETITEMS() (err error) { + defer func() { + if r := recover(); r != nil { + switch x := r.(type) { + case string: + err = errors.New(x) + case error: + err = x + default: + err = errors.New("Unknown panic") + } + } + }() + markIndex, err := pm.findMark() + if err != nil { + return err + } + + vI, err := pm.readFromStackAt(markIndex - 1) + if err != nil { + return err + } + + v, ok := vI.(map[interface{}]interface{}) + if !ok { + return fmt.Errorf("Opcode SETITEMS expected type %T on stack but found %v(%T)", v, vI, vI) + } + + if ((len(pm.Stack) - markIndex + 1) % 2) != 0 { + return fmt.Errorf("Found odd number of items on stack after mark:%d", len(pm.Stack)-markIndex+1) + } + + for i := markIndex + 1; i != len(pm.Stack); i++ { + key := pm.Stack[i] + i++ + v[key] = pm.Stack[i] + } + + pm.popAfterIndex(markIndex) + + return nil +} + +/** +Opcode: POP_MARK (0x31) +Pop all the stack objects at and above the topmost markobject. + + When an opcode using a variable number of stack objects is done, + POP_MARK is used to remove those objects, and to remove the markobject + that delimited their starting position on the stack. + ** +Stack before: [mark, stackslice] +Stack after: [] +**/ +func (pm *PickleMachine) opcode_POP_MARK() error { + markIndex, err := pm.findMark() + if err != nil { + return nil + } + pm.popAfterIndex(markIndex) + return nil +} + +/** +Opcode: BINGET (0x68) +Read an object from the memo and push it on the stack. + + The index of the memo object to push is given by the 1-byte unsigned + integer following. + ** +Stack before: [] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_BINGET() (err error) { + defer func() { + if r := recover(); r != nil { + switch x := r.(type) { + case string: + err = errors.New(x) + case error: + err = x + default: + err = errors.New("Unknown panic") + } + } + }() + var index uint8 + err = pm.readBinaryInto(&index, false) + if err != nil { + return err + } + + v, err := pm.readFromMemo(int64(index)) + if err != nil { + return err + } + + //TODO test if the object we are about to push is mutable + //if so it needs to be somehow deep copied first + pm.push(v) + + return nil +} + +/** +Opcode: LONG_BINGET (0x6a) +Read an object from the memo and push it on the stack. + + The index of the memo object to push is given by the 4-byte signed + little-endian integer following. + ** +Stack before: [] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_LONG_BINGET() (err error) { + defer func() { + if r := recover(); r != nil { + switch x := r.(type) { + case string: + err = errors.New(x) + case error: + err = x + default: + err = errors.New("Unknown panic") + } + } + }() + var index int32 + err = pm.readBinaryInto(&index, false) + if err != nil { + return err + } + + v, err := pm.readFromMemo(int64(index)) + if err != nil { + return err + } + + //TODO test if the object we are about to push is mutable + //if so it needs to be somehow deep copied first + pm.push(v) + return nil +} + +/** +Opcode: BINPUT (0x71) +Store the stack top into the memo. The stack is not popped. + + The index of the memo location to write into is given by the 1-byte + unsigned integer following. + ** +Stack before: [] +Stack after: [] +**/ +func (pm *PickleMachine) opcode_BINPUT() error { + v, err := pm.readFromStack(0) + if err != nil { + return err + } + + var index uint8 + err = pm.readBinaryInto(&index, false) + if err != nil { + return err + } + + pm.storeMemo(int64(index), v) + return nil +} + +/** +Opcode: LONG_BINPUT (0x72) +Store the stack top into the memo. The stack is not popped. + + The index of the memo location to write into is given by the 4-byte + signed little-endian integer following. + ** +Stack before: [] +Stack after: [] +**/ +func (pm *PickleMachine) opcode_LONG_BINPUT() error { + var index int32 + err := pm.readBinaryInto(&index, false) + if err != nil { + return err + } + + v, err := pm.readFromStack(0) + if err != nil { + return err + } + err = pm.storeMemo(int64(index), v) + if err != nil { + return err + } + return nil +} + +/** +Opcode: OBJ (0x6f) +Build a class instance. + + This is the protocol 1 version of protocol 0's INST opcode, and is + very much like it. The major difference is that the class object + is taken off the stack, allowing it to be retrieved from the memo + repeatedly if several instances of the same class are created. This + can be much more efficient (in both time and space) than repeatedly + embedding the module and class names in INST opcodes. + + Unlike INST, OBJ takes no arguments from the opcode stream. Instead + the class object is taken off the stack, immediately above the + topmost markobject: + + Stack before: ... markobject classobject stackslice + Stack after: ... new_instance_object + + As for INST, the remainder of the stack above the markobject is + gathered into an argument tuple, and then the logic seems identical, + except that no __safe_for_unpickling__ check is done (XXX this is + a bug; cPickle does test __safe_for_unpickling__). See INST for + the gory details. + + NOTE: In Python 2.3, INST and OBJ are identical except for how they + get the class object. That was always the intent; the implementations + had diverged for accidental reasons. + ** +Stack before: [mark, any, stackslice] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_OBJ() error { + return ErrOpcodeNotImplemented +} + +/** +Opcode: BINPERSID (0x51) +Push an object identified by a persistent ID. + + Like PERSID, except the persistent ID is popped off the stack (instead + of being a string embedded in the opcode bytestream). The persistent + ID is passed to self.persistent_load(), and whatever object that + returns is pushed on the stack. See PERSID for more detail. + ** +Stack before: [any] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_BINPERSID() error { + return ErrOpcodeNotImplemented +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/protocol_2.go b/vendor/github.com/hydrogen18/stalecucumber/protocol_2.go new file mode 100644 index 00000000..583dfe88 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/protocol_2.go @@ -0,0 +1,322 @@ +package stalecucumber + +import "fmt" +import "math/big" + +/** +Opcode: LONG1 (0x8a) +Long integer using one-byte length. + An arbitrary length integer encoded as a bytestring. + A single byte following the opcode indicates the length + of the bytestring + If the string length is zero, then the value is zero. + Otherwise the bytestring is 256-complement representation + of an integer in reverse. + ** +Stack before: [] +Stack after: [long] +**/ +func (pm *PickleMachine) opcode_LONG1() error { + var l uint8 + err := pm.readBinaryInto(&l, false) + if err != nil { + return err + } + + if l == 0 { + pm.push(big.NewInt(0)) + return nil + } + + reversedData, err := pm.readFixedLengthRaw(int64(l)) + if err != nil { + return err + } + + //For no obvious reason, the python pickler + //always reverses the bytes. Reverse it here + var data [256]byte + { + var j int + for i := len(reversedData) - 1; i != -1; i-- { + data[j] = reversedData[i] + j++ + } + } + + v := new(big.Int) + v.SetBytes(data[:l]) + + invertIfNegative(data[0], v, int(l)) + + pm.push(v) + + return nil + +} + +func invertIfNegative(first byte, v *big.Int, l int) { + var negative bool + //Check for negative number. + negative = (0x80 & first) != 0x0 + + if negative { + offset := big.NewInt(1) + offset.Lsh(offset, uint(l*8)) + v.Sub(v, offset) + } + +} + +/** +Opcode: LONG4 (0x8b) +Long integer using found-byte length. + + An arbitrary length integer encoded as a bytestring. + A four-byte signed little-endian integer + following the opcode indicates the length of the bytestring. + If the string length is zero, then the value is zero. + Otherwise the bytestring is 256-complement representation + of an integer in reverse.** +Stack before: [] +Stack after: [long] +**/ +func (pm *PickleMachine) opcode_LONG4() error { + var l uint32 + err := pm.readBinaryInto(&l, false) + if err != nil { + return err + } + + if l == 0 { + pm.push(big.NewInt(0)) + return nil + } + + reversedData, err := pm.readFixedLengthRaw(int64(l)) + if err != nil { + return err + } + + //For no obvious reason, the python pickler + //always reverses the bytes. Reverse it here + data := make([]byte, len(reversedData)) + { + var j int + for i := len(reversedData) - 1; i != -1; i-- { + data[j] = reversedData[i] + j++ + } + } + + v := new(big.Int) + v.SetBytes(data[:l]) + + invertIfNegative(data[0], v, len(data)) + + pm.push(v) + + return nil + +} + +/** +Opcode: NEWTRUE (0x88) +True. + + Push True onto the stack.** +Stack before: [] +Stack after: [bool] +**/ +func (pm *PickleMachine) opcode_NEWTRUE() error { + pm.push(true) + return nil +} + +/** +Opcode: NEWFALSE (0x89) +True. + + Push False onto the stack.** +Stack before: [] +Stack after: [bool] +**/ +func (pm *PickleMachine) opcode_NEWFALSE() error { + pm.push(false) + return nil +} + +/** +Opcode: TUPLE1 (0x85) +Build a one-tuple out of the topmost item on the stack. + + This code pops one value off the stack and pushes a tuple of + length 1 whose one item is that value back onto it. In other + words: + + stack[-1] = tuple(stack[-1:]) + ** +Stack before: [any] +Stack after: [tuple] +**/ +func (pm *PickleMachine) opcode_TUPLE1() error { + v, err := pm.pop() + if err != nil { + return err + } + + pm.push([]interface{}{v}) + return nil +} + +/** +Opcode: TUPLE2 (0x86) +Build a two-tuple out of the top two items on the stack. + + This code pops two values off the stack and pushes a tuple of + length 2 whose items are those values back onto it. In other + words: + + stack[-2:] = [tuple(stack[-2:])] + ** +Stack before: [any, any] +Stack after: [tuple] +**/ +func (pm *PickleMachine) opcode_TUPLE2() error { + v := make([]interface{}, 2) + var err error + v[1], err = pm.pop() + if err != nil { + return err + } + v[0], err = pm.pop() + if err != nil { + return err + } + + pm.push(v) + return nil +} + +/** +Opcode: TUPLE3 (0x87) +Build a three-tuple out of the top three items on the stack. + + This code pops three values off the stack and pushes a tuple of + length 3 whose items are those values back onto it. In other + words: + + stack[-3:] = [tuple(stack[-3:])] + ** +Stack before: [any, any, any] +Stack after: [tuple] +**/ +func (pm *PickleMachine) opcode_TUPLE3() error { + v := make([]interface{}, 3) + var err error + v[2], err = pm.pop() + if err != nil { + return err + } + v[1], err = pm.pop() + if err != nil { + return err + } + v[0], err = pm.pop() + if err != nil { + return err + } + + pm.push(v) + return nil +} + +/** +Opcode: EXT1 (0x82) +Extension code. + + This code and the similar EXT2 and EXT4 allow using a registry + of popular objects that are pickled by name, typically classes. + It is envisioned that through a global negotiation and + registration process, third parties can set up a mapping between + ints and object names. + + In order to guarantee pickle interchangeability, the extension + code registry ought to be global, although a range of codes may + be reserved for private use. + + EXT1 has a 1-byte integer argument. This is used to index into the + extension registry, and the object at that index is pushed on the stack. + ** +Stack before: [] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_EXT1() error { + return ErrOpcodeNotImplemented +} + +/** +Opcode: EXT2 (0x83) +Extension code. + + See EXT1. EXT2 has a two-byte integer argument. + ** +Stack before: [] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_EXT2() error { + return ErrOpcodeNotImplemented +} + +/** +Opcode: EXT4 (0x84) +Extension code. + + See EXT1. EXT4 has a four-byte integer argument. + ** +Stack before: [] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_EXT4() error { + return ErrOpcodeNotImplemented +} + +/** +Opcode: NEWOBJ (0x81) +Build an object instance. + + The stack before should be thought of as containing a class + object followed by an argument tuple (the tuple being the stack + top). Call these cls and args. They are popped off the stack, + and the value returned by cls.__new__(cls, *args) is pushed back + onto the stack. + ** +Stack before: [any, any] +Stack after: [any] +**/ +func (pm *PickleMachine) opcode_NEWOBJ() error { + return ErrOpcodeNotImplemented +} + +/** +Opcode: PROTO (0x80) +Protocol version indicator. + + For protocol 2 and above, a pickle must start with this opcode. + The argument is the protocol version, an int in range(2, 256). + ** +Stack before: [] +Stack after: [] +**/ +func (pm *PickleMachine) opcode_PROTO() error { + var version int8 + err := pm.readBinaryInto(&version, false) + if err != nil { + return err + } + if version != 2 { + return fmt.Errorf("Unsupported version #%d detected", version) + } + + return nil +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/python_types.go b/vendor/github.com/hydrogen18/stalecucumber/python_types.go new file mode 100644 index 00000000..5213b2e1 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/python_types.go @@ -0,0 +1,22 @@ +package stalecucumber + +/* +This type is used internally to represent a concept known as a mark +on the Pickle Machine's stack. Oddly formed pickled data could return +this value as the result of Unpickle. In normal usage this type +is needed only internally. +*/ +type PickleMark struct{} + +func (_ PickleMark) String() string { + return "PickleMachine Mark" +} + +/* +This type is used to represent the Python object "None" +*/ +type PickleNone struct{} + +func (_ PickleNone) String() string { + return "Python None" +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/tuple.go b/vendor/github.com/hydrogen18/stalecucumber/tuple.go new file mode 100644 index 00000000..037c2f66 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/tuple.go @@ -0,0 +1,7 @@ +package stalecucumber + +type PickleTuple []interface{} + +func NewTuple(v ...interface{}) PickleTuple { + return PickleTuple(v) +} diff --git a/vendor/github.com/hydrogen18/stalecucumber/unpack.go b/vendor/github.com/hydrogen18/stalecucumber/unpack.go new file mode 100644 index 00000000..64d962a6 --- /dev/null +++ b/vendor/github.com/hydrogen18/stalecucumber/unpack.go @@ -0,0 +1,329 @@ +package stalecucumber + +import "reflect" +import "fmt" +import "errors" +import "strings" +import "math/big" + +const PICKLE_TAG = "pickle" + +type UnpackingError struct { + Source interface{} + Destination reflect.Value + Err error +} + +/* +This type is returned when a call to From() fails. +Setting "AllowMissingFields" and "AllowMismatchedFields" +on the result of "UnpackInto" controls if this error is +returned or not. +*/ +func (ue UnpackingError) Error() string { + var dv string + var dt string + k := ue.Destination.Kind() + switch k { + case reflect.Ptr: + dt = fmt.Sprintf("%s", ue.Destination.Type().Elem()) + if !ue.Destination.IsNil() { + dv = fmt.Sprintf("%v", ue.Destination.Elem().Interface()) + } else { + dv = "nil" + + } + case reflect.Invalid: + dv = "invalid" + dt = dv + default: + dv = fmt.Sprintf("%v", ue.Destination.Interface()) + dt = fmt.Sprintf("%s", ue.Destination.Type()) + } + + return fmt.Sprintf("Error unpacking %v(%T) into %s(%s):%v", + ue.Source, + ue.Source, + dv, + dt, + ue.Err) +} + +var ErrNilPointer = errors.New("Destination cannot be a nil pointer") +var ErrNotPointer = errors.New("Destination must be a pointer type") +var ErrTargetTypeNotPointer = errors.New("Target type must be a pointer to unpack this value") +var ErrTargetTypeOverflow = errors.New("Value overflows target type") +var ErrTargetTypeMismatch = errors.New("Target type does not match source type") + +type unpacker struct { + dest reflect.Value + AllowMissingFields bool + AllowMismatchedFields bool +} + +func UnpackInto(dest interface{}) unpacker { + return unpacker{dest: reflect.ValueOf(dest), + AllowMissingFields: true, + AllowMismatchedFields: false} +} + +func (u unpacker) From(srcI interface{}, err error) error { + //Check if an error occurred + if err != nil { + return err + } + + return u.from(srcI) +} + +func (u unpacker) from(srcI interface{}) error { + + //Get the value of the destination + v := u.dest + + //The destination must always be a pointer + if v.Kind() != reflect.Ptr { + return UnpackingError{Source: srcI, + Destination: u.dest, + Err: ErrNotPointer} + } + + //The destination can never be nil + if v.IsNil() { + return UnpackingError{Source: srcI, + Destination: u.dest, + Err: ErrNilPointer} + + } + + //Indirect the destination. This gets the actual + //value pointed at + vIndirect := v + for vIndirect.Kind() == reflect.Ptr { + if vIndirect.IsNil() { + vIndirect.Set(reflect.New(vIndirect.Type().Elem())) + } + vIndirect = vIndirect.Elem() + } + + //Check the input against known types + switch s := srcI.(type) { + default: + return UnpackingError{Source: srcI, + Destination: u.dest, + Err: errors.New("Unknown source type")} + case PickleNone: + vElem := v.Elem() + for vElem.Kind() == reflect.Ptr { + next := vElem.Elem() + if next.Kind() == reflect.Ptr { + vElem = next + continue + } + + if vElem.CanSet() { + vElem.Set(reflect.Zero(vElem.Type())) + return nil + } + } + + return UnpackingError{Source: srcI, + Destination: u.dest, + Err: ErrTargetTypeNotPointer} + + case int64: + switch vIndirect.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int64, reflect.Int32: + if vIndirect.OverflowInt(s) { + return UnpackingError{Source: srcI, + Destination: u.dest, + Err: ErrTargetTypeOverflow} + } + vIndirect.SetInt(s) + return nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + if s < 0 || vIndirect.OverflowUint(uint64(s)) { + return UnpackingError{Source: srcI, + Destination: u.dest, + Err: ErrTargetTypeOverflow} + } + + vIndirect.SetUint(uint64(s)) + return nil + } + + dstBig, ok := vIndirect.Addr().Interface().(*big.Int) + if ok { + dstBig.SetInt64(s) + return nil + } + + case string: + switch vIndirect.Kind() { + case reflect.String: + vIndirect.SetString(s) + return nil + } + case bool: + switch vIndirect.Kind() { + case reflect.Bool: + vIndirect.SetBool(s) + return nil + } + case float64: + switch vIndirect.Kind() { + case reflect.Float32, reflect.Float64: + vIndirect.SetFloat(s) + return nil + } + case *big.Int: + dstBig, ok := vIndirect.Addr().Interface().(*big.Int) + if ok { + dstBig.Set(s) + return nil + } + + if vi, err := Int(srcI, nil); err == nil { + return unpacker{dest: v, + AllowMismatchedFields: u.AllowMismatchedFields, + AllowMissingFields: u.AllowMissingFields}.From(vi, nil) + } + + case []interface{}: + //Check that the destination is a slice + if vIndirect.Kind() != reflect.Slice { + return UnpackingError{Source: s, + Destination: u.dest, + Err: fmt.Errorf("Cannot unpack slice into destination")} + } + //Check for exact type match + if vIndirect.Type().Elem().Kind() == reflect.Interface { + vIndirect.Set(reflect.ValueOf(s)) + return nil + } + + //Build the value using reflection + var replacement reflect.Value + if vIndirect.IsNil() || vIndirect.Len() < len(s) { + replacement = reflect.MakeSlice(vIndirect.Type(), + len(s), len(s)) + } else { + replacement = vIndirect.Slice(0, len(s)) + } + + for i, srcV := range s { + dstV := replacement.Index(i) + + //Recurse to set the value + err := unpacker{dest: dstV.Addr(), + AllowMissingFields: u.AllowMissingFields, + AllowMismatchedFields: u.AllowMismatchedFields}. + From(srcV, nil) + if err != nil { + return err + } + } + vIndirect.Set(replacement) + return nil + + case map[interface{}]interface{}: + //Check to see if the field is exactly + //of the type + if vIndirect.Kind() == reflect.Map { + dstT := vIndirect.Type() + if dstT.Key().Kind() == reflect.Interface && + dstT.Elem().Kind() == reflect.Interface { + vIndirect.Set(reflect.ValueOf(s)) + return nil + } + } + + var src map[string]interface{} + var err error + src, err = DictString(srcI, err) + if err != nil { + return UnpackingError{Source: srcI, + Destination: u.dest, + Err: fmt.Errorf("Cannot unpack source into struct")} + } + + if vIndirect.Kind() != reflect.Struct { + return UnpackingError{Source: src, + Destination: u.dest, + Err: fmt.Errorf("Cannot unpack into %v", v.Kind().String())} + + } + + var fieldByTag map[string]int + vIndirectType := reflect.TypeOf(vIndirect.Interface()) + numFields := vIndirectType.NumField() + + for i := 0; i != numFields; i++ { + fv := vIndirectType.Field(i) + tag := fv.Tag.Get(PICKLE_TAG) + + if len(tag) != 0 { + if fieldByTag == nil { + fieldByTag = make(map[string]int) + } + fieldByTag[tag] = i + } + } + + for k, kv := range src { + var fv reflect.Value + + if fieldIndex, ok := fieldByTag[k]; ok { + fv = vIndirect.Field(fieldIndex) + } else { + //Try the name verbatim. This catches + //embedded fields as well + fv = vIndirect.FieldByName(k) + + if !fv.IsValid() { + //Capitalize the first character. Structs + //do not export fields with a lower case + //first character + capk := strings.ToUpper(k[0:1]) + k[1:] + fv = vIndirect.FieldByName(capk) + } + } + + if !fv.IsValid() || !fv.CanSet() { + if !u.AllowMissingFields { + return UnpackingError{Source: src, + Destination: u.dest, + Err: fmt.Errorf("Cannot find field for key %q", k)} + } + continue + } + + err := unpacker{dest: fv.Addr(), + AllowMismatchedFields: u.AllowMismatchedFields, + AllowMissingFields: u.AllowMissingFields}.from(kv) + + if err != nil { + if u.AllowMismatchedFields { + if unpackingError, ok := err.(UnpackingError); ok { + switch unpackingError.Err { + case ErrTargetTypeOverflow, + ErrTargetTypeNotPointer, + ErrTargetTypeMismatch: + + fv.Set(reflect.Zero(fv.Type())) + continue + } + + } + } + return err + } + } + + return nil + } + + return UnpackingError{Source: srcI, + Destination: u.dest, + Err: ErrTargetTypeMismatch} +} diff --git a/vendor/github.com/jhump/protoreflect/LICENSE b/vendor/github.com/jhump/protoreflect/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/jhump/protoreflect/codec/buffer.go b/vendor/github.com/jhump/protoreflect/codec/buffer.go new file mode 100644 index 00000000..b9de99c2 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/codec/buffer.go @@ -0,0 +1,112 @@ +package codec + +import ( + "fmt" + "io" +) + +// Buffer is a reader and a writer that wraps a slice of bytes and also +// provides API for decoding and encoding the protobuf binary format. +// +// Its operation is similar to that of a bytes.Buffer: writing pushes +// data to the end of the buffer while reading pops data from the head +// of the buffer. So the same buffer can be used to both read and write. +type Buffer struct { + buf []byte + index int + + // tmp is used when another byte slice is needed, such as when + // serializing messages, since we need to know the length before + // we can write the length prefix; by caching this, including + // after it is grown by serialization operations, we reduce the + // number of allocations needed + tmp []byte + + deterministic bool +} + +// NewBuffer creates a new buffer with the given slice of bytes as the +// buffer's initial contents. +func NewBuffer(buf []byte) *Buffer { + return &Buffer{buf: buf} +} + +// SetDeterministic sets this buffer to encode messages deterministically. This +// is useful for tests. But the overhead is non-zero, so it should not likely be +// used outside of tests. When true, map fields in a message must have their +// keys sorted before serialization to ensure deterministic output. Otherwise, +// values in a map field will be serialized in map iteration order. +func (cb *Buffer) SetDeterministic(deterministic bool) { + cb.deterministic = deterministic +} + +// Reset resets this buffer back to empty. Any subsequent writes/encodes +// to the buffer will allocate a new backing slice of bytes. +func (cb *Buffer) Reset() { + cb.buf = []byte(nil) + cb.index = 0 +} + +// Bytes returns the slice of bytes remaining in the buffer. Note that +// this does not perform a copy: if the contents of the returned slice +// are modified, the modifications will be visible to subsequent reads +// via the buffer. +func (cb *Buffer) Bytes() []byte { + return cb.buf[cb.index:] +} + +// String returns the remaining bytes in the buffer as a string. +func (cb *Buffer) String() string { + return string(cb.Bytes()) +} + +// EOF returns true if there are no more bytes remaining to read. +func (cb *Buffer) EOF() bool { + return cb.index >= len(cb.buf) +} + +// Skip attempts to skip the given number of bytes in the input. If +// the input has fewer bytes than the given count, false is returned +// and the buffer is unchanged. Otherwise, the given number of bytes +// are skipped and true is returned. +func (cb *Buffer) Skip(count int) error { + if count < 0 { + return fmt.Errorf("proto: bad byte length %d", count) + } + newIndex := cb.index + count + if newIndex < cb.index || newIndex > len(cb.buf) { + return io.ErrUnexpectedEOF + } + cb.index = newIndex + return nil +} + +// Len returns the remaining number of bytes in the buffer. +func (cb *Buffer) Len() int { + return len(cb.buf) - cb.index +} + +// Read implements the io.Reader interface. If there are no bytes +// remaining in the buffer, it will return 0, io.EOF. Otherwise, +// it reads max(len(dest), cb.Len()) bytes from input and copies +// them into dest. It returns the number of bytes copied and a nil +// error in this case. +func (cb *Buffer) Read(dest []byte) (int, error) { + if cb.index == len(cb.buf) { + return 0, io.EOF + } + copied := copy(dest, cb.buf[cb.index:]) + cb.index += copied + return copied, nil +} + +var _ io.Reader = (*Buffer)(nil) + +// Write implements the io.Writer interface. It always returns +// len(data), nil. +func (cb *Buffer) Write(data []byte) (int, error) { + cb.buf = append(cb.buf, data...) + return len(data), nil +} + +var _ io.Writer = (*Buffer)(nil) diff --git a/vendor/github.com/jhump/protoreflect/codec/decode.go b/vendor/github.com/jhump/protoreflect/codec/decode.go new file mode 100644 index 00000000..2a7e59f6 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/codec/decode.go @@ -0,0 +1,372 @@ +package codec + +import ( + "errors" + "fmt" + "io" + "math" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// ErrOverflow is returned when an integer is too large to be represented. +var ErrOverflow = errors.New("proto: integer overflow") + +// ErrBadWireType is returned when decoding a wire-type from a buffer that +// is not valid. +var ErrBadWireType = errors.New("proto: bad wiretype") + +var varintTypes = map[descriptor.FieldDescriptorProto_Type]bool{} +var fixed32Types = map[descriptor.FieldDescriptorProto_Type]bool{} +var fixed64Types = map[descriptor.FieldDescriptorProto_Type]bool{} + +func init() { + varintTypes[descriptor.FieldDescriptorProto_TYPE_BOOL] = true + varintTypes[descriptor.FieldDescriptorProto_TYPE_INT32] = true + varintTypes[descriptor.FieldDescriptorProto_TYPE_INT64] = true + varintTypes[descriptor.FieldDescriptorProto_TYPE_UINT32] = true + varintTypes[descriptor.FieldDescriptorProto_TYPE_UINT64] = true + varintTypes[descriptor.FieldDescriptorProto_TYPE_SINT32] = true + varintTypes[descriptor.FieldDescriptorProto_TYPE_SINT64] = true + varintTypes[descriptor.FieldDescriptorProto_TYPE_ENUM] = true + + fixed32Types[descriptor.FieldDescriptorProto_TYPE_FIXED32] = true + fixed32Types[descriptor.FieldDescriptorProto_TYPE_SFIXED32] = true + fixed32Types[descriptor.FieldDescriptorProto_TYPE_FLOAT] = true + + fixed64Types[descriptor.FieldDescriptorProto_TYPE_FIXED64] = true + fixed64Types[descriptor.FieldDescriptorProto_TYPE_SFIXED64] = true + fixed64Types[descriptor.FieldDescriptorProto_TYPE_DOUBLE] = true +} + +func (cb *Buffer) decodeVarintSlow() (x uint64, err error) { + i := cb.index + l := len(cb.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := cb.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + cb.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = ErrOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (cb *Buffer) DecodeVarint() (uint64, error) { + i := cb.index + buf := cb.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + cb.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return cb.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x := uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + // x -= 0x80 << 63 // Always zero. + + return 0, ErrOverflow + +done: + cb.index = i + return x, nil +} + +// DecodeTagAndWireType decodes a field tag and wire type from input. +// This reads a varint and then extracts the two fields from the varint +// value read. +func (cb *Buffer) DecodeTagAndWireType() (tag int32, wireType int8, err error) { + var v uint64 + v, err = cb.DecodeVarint() + if err != nil { + return + } + // low 7 bits is wire type + wireType = int8(v & 7) + // rest is int32 tag number + v = v >> 3 + if v > math.MaxInt32 { + err = fmt.Errorf("tag number out of range: %d", v) + return + } + tag = int32(v) + return +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (cb *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := cb.index + 8 + if i < 0 || i > len(cb.buf) { + err = io.ErrUnexpectedEOF + return + } + cb.index = i + + x = uint64(cb.buf[i-8]) + x |= uint64(cb.buf[i-7]) << 8 + x |= uint64(cb.buf[i-6]) << 16 + x |= uint64(cb.buf[i-5]) << 24 + x |= uint64(cb.buf[i-4]) << 32 + x |= uint64(cb.buf[i-3]) << 40 + x |= uint64(cb.buf[i-2]) << 48 + x |= uint64(cb.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (cb *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := cb.index + 4 + if i < 0 || i > len(cb.buf) { + err = io.ErrUnexpectedEOF + return + } + cb.index = i + + x = uint64(cb.buf[i-4]) + x |= uint64(cb.buf[i-3]) << 8 + x |= uint64(cb.buf[i-2]) << 16 + x |= uint64(cb.buf[i-1]) << 24 + return +} + +// DecodeZigZag32 decodes a signed 32-bit integer from the given +// zig-zag encoded value. +func DecodeZigZag32(v uint64) int32 { + return int32((uint32(v) >> 1) ^ uint32((int32(v&1)<<31)>>31)) +} + +// DecodeZigZag64 decodes a signed 64-bit integer from the given +// zig-zag encoded value. +func DecodeZigZag64(v uint64) int64 { + return int64((v >> 1) ^ uint64((int64(v&1)<<63)>>63)) +} + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (cb *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := cb.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := cb.index + nb + if end < cb.index || end > len(cb.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + buf = cb.buf[cb.index:end] + cb.index = end + return + } + + buf = make([]byte, nb) + copy(buf, cb.buf[cb.index:]) + cb.index = end + return +} + +// ReadGroup reads the input until a "group end" tag is found +// and returns the data up to that point. Subsequent reads from +// the buffer will read data after the group end tag. If alloc +// is true, the data is copied to a new slice before being returned. +// Otherwise, the returned slice is a view into the buffer's +// underlying byte slice. +// +// This function correctly handles nested groups: if a "group start" +// tag is found, then that group's end tag will be included in the +// returned data. +func (cb *Buffer) ReadGroup(alloc bool) ([]byte, error) { + var groupEnd, dataEnd int + groupEnd, dataEnd, err := cb.findGroupEnd() + if err != nil { + return nil, err + } + var results []byte + if !alloc { + results = cb.buf[cb.index:dataEnd] + } else { + results = make([]byte, dataEnd-cb.index) + copy(results, cb.buf[cb.index:]) + } + cb.index = groupEnd + return results, nil +} + +// SkipGroup is like ReadGroup, except that it discards the +// data and just advances the buffer to point to the input +// right *after* the "group end" tag. +func (cb *Buffer) SkipGroup() error { + groupEnd, _, err := cb.findGroupEnd() + if err != nil { + return err + } + cb.index = groupEnd + return nil +} + +func (cb *Buffer) findGroupEnd() (groupEnd int, dataEnd int, err error) { + bs := cb.buf + start := cb.index + defer func() { + cb.index = start + }() + for { + fieldStart := cb.index + // read a field tag + _, wireType, err := cb.DecodeTagAndWireType() + if err != nil { + return 0, 0, err + } + // skip past the field's data + switch wireType { + case proto.WireFixed32: + if err := cb.Skip(4); err != nil { + return 0, 0, err + } + case proto.WireFixed64: + if err := cb.Skip(8); err != nil { + return 0, 0, err + } + case proto.WireVarint: + // skip varint by finding last byte (has high bit unset) + i := cb.index + limit := i + 10 // varint cannot be >10 bytes + for { + if i >= limit { + return 0, 0, ErrOverflow + } + if i >= len(bs) { + return 0, 0, io.ErrUnexpectedEOF + } + if bs[i]&0x80 == 0 { + break + } + i++ + } + // TODO: This would only overflow if buffer length was MaxInt and we + // read the last byte. This is not a real/feasible concern on 64-bit + // systems. Something to worry about for 32-bit systems? Do we care? + cb.index = i + 1 + case proto.WireBytes: + l, err := cb.DecodeVarint() + if err != nil { + return 0, 0, err + } + if err := cb.Skip(int(l)); err != nil { + return 0, 0, err + } + case proto.WireStartGroup: + if err := cb.SkipGroup(); err != nil { + return 0, 0, err + } + case proto.WireEndGroup: + return cb.index, fieldStart, nil + default: + return 0, 0, ErrBadWireType + } + } +} diff --git a/vendor/github.com/jhump/protoreflect/codec/decode_fields.go b/vendor/github.com/jhump/protoreflect/codec/decode_fields.go new file mode 100644 index 00000000..938b4d9d --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/codec/decode_fields.go @@ -0,0 +1,283 @@ +package codec + +import ( + "errors" + "fmt" + "io" + "math" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/desc" +) + +// ErrWireTypeEndGroup is returned from DecodeFieldValue if the tag and wire-type +// it reads indicates an end-group marker. +var ErrWireTypeEndGroup = errors.New("unexpected wire type: end group") + +// MessageFactory is used to instantiate messages when DecodeFieldValue needs to +// decode a message value. +// +// Also see MessageFactory in "github.com/jhump/protoreflect/dynamic", which +// implements this interface. +type MessageFactory interface { + NewMessage(md *desc.MessageDescriptor) proto.Message +} + +// UnknownField represents a field that was parsed from the binary wire +// format for a message, but was not a recognized field number. Enough +// information is preserved so that re-serializing the message won't lose +// any of the unrecognized data. +type UnknownField struct { + // The tag number for the unrecognized field. + Tag int32 + + // Encoding indicates how the unknown field was encoded on the wire. If it + // is proto.WireBytes or proto.WireGroupStart then Contents will be set to + // the raw bytes. If it is proto.WireTypeFixed32 then the data is in the least + // significant 32 bits of Value. Otherwise, the data is in all 64 bits of + // Value. + Encoding int8 + Contents []byte + Value uint64 +} + +// DecodeFieldValue will read a field value from the buffer and return its +// value and the corresponding field descriptor. The given function is used +// to lookup a field descriptor by tag number. The given factory is used to +// instantiate a message if the field value is (or contains) a message value. +// +// On error, the field descriptor and value are typically nil. However, if the +// error returned is ErrWireTypeEndGroup, the returned value will indicate any +// tag number encoded in the end-group marker. +// +// If the field descriptor returned is nil, that means that the given function +// returned nil. This is expected to happen for unrecognized tag numbers. In +// that case, no error is returned, and the value will be an UnknownField. +func (cb *Buffer) DecodeFieldValue(fieldFinder func(int32) *desc.FieldDescriptor, fact MessageFactory) (*desc.FieldDescriptor, interface{}, error) { + if cb.EOF() { + return nil, nil, io.EOF + } + tagNumber, wireType, err := cb.DecodeTagAndWireType() + if err != nil { + return nil, nil, err + } + if wireType == proto.WireEndGroup { + return nil, tagNumber, ErrWireTypeEndGroup + } + fd := fieldFinder(tagNumber) + if fd == nil { + val, err := cb.decodeUnknownField(tagNumber, wireType) + return nil, val, err + } + val, err := cb.decodeKnownField(fd, wireType, fact) + return fd, val, err +} + +// DecodeScalarField extracts a properly-typed value from v. The returned value's +// type depends on the given field descriptor type. It will be the same type as +// generated structs use for the field descriptor's type. Enum types will return +// an int32. If the given field type uses length-delimited encoding (nested +// messages, bytes, and strings), an error is returned. +func DecodeScalarField(fd *desc.FieldDescriptor, v uint64) (interface{}, error) { + switch fd.GetType() { + case descriptor.FieldDescriptorProto_TYPE_BOOL: + return v != 0, nil + case descriptor.FieldDescriptorProto_TYPE_UINT32, + descriptor.FieldDescriptorProto_TYPE_FIXED32: + if v > math.MaxUint32 { + return nil, ErrOverflow + } + return uint32(v), nil + + case descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_ENUM: + s := int64(v) + if s > math.MaxInt32 || s < math.MinInt32 { + return nil, ErrOverflow + } + return int32(s), nil + + case descriptor.FieldDescriptorProto_TYPE_SFIXED32: + if v > math.MaxUint32 { + return nil, ErrOverflow + } + return int32(v), nil + + case descriptor.FieldDescriptorProto_TYPE_SINT32: + if v > math.MaxUint32 { + return nil, ErrOverflow + } + return DecodeZigZag32(v), nil + + case descriptor.FieldDescriptorProto_TYPE_UINT64, + descriptor.FieldDescriptorProto_TYPE_FIXED64: + return v, nil + + case descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_SFIXED64: + return int64(v), nil + + case descriptor.FieldDescriptorProto_TYPE_SINT64: + return DecodeZigZag64(v), nil + + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + if v > math.MaxUint32 { + return nil, ErrOverflow + } + return math.Float32frombits(uint32(v)), nil + + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + return math.Float64frombits(v), nil + + default: + // bytes, string, message, and group cannot be represented as a simple numeric value + return nil, fmt.Errorf("bad input; field %s requires length-delimited wire type", fd.GetFullyQualifiedName()) + } +} + +// DecodeLengthDelimitedField extracts a properly-typed value from bytes. The +// returned value's type will usually be []byte, string, or, for nested messages, +// the type returned from the given message factory. However, since repeated +// scalar fields can be length-delimited, when they used packed encoding, it can +// also return an []interface{}, where each element is a scalar value. Furthermore, +// it could return a scalar type, not in a slice, if the given field descriptor is +// not repeated. This is to support cases where a field is changed from optional +// to repeated. New code may emit a packed repeated representation, but old code +// still expects a single scalar value. In this case, if the actual data in bytes +// contains multiple values, only the last value is returned. +func DecodeLengthDelimitedField(fd *desc.FieldDescriptor, bytes []byte, mf MessageFactory) (interface{}, error) { + switch { + case fd.GetType() == descriptor.FieldDescriptorProto_TYPE_BYTES: + return bytes, nil + + case fd.GetType() == descriptor.FieldDescriptorProto_TYPE_STRING: + return string(bytes), nil + + case fd.GetType() == descriptor.FieldDescriptorProto_TYPE_MESSAGE || + fd.GetType() == descriptor.FieldDescriptorProto_TYPE_GROUP: + msg := mf.NewMessage(fd.GetMessageType()) + err := proto.Unmarshal(bytes, msg) + if err != nil { + return nil, err + } else { + return msg, nil + } + + default: + // even if the field is not repeated or not packed, we still parse it as such for + // backwards compatibility (e.g. message we are de-serializing could have been both + // repeated and packed at the time of serialization) + packedBuf := NewBuffer(bytes) + var slice []interface{} + var val interface{} + for !packedBuf.EOF() { + var v uint64 + var err error + if varintTypes[fd.GetType()] { + v, err = packedBuf.DecodeVarint() + } else if fixed32Types[fd.GetType()] { + v, err = packedBuf.DecodeFixed32() + } else if fixed64Types[fd.GetType()] { + v, err = packedBuf.DecodeFixed64() + } else { + return nil, fmt.Errorf("bad input; cannot parse length-delimited wire type for field %s", fd.GetFullyQualifiedName()) + } + if err != nil { + return nil, err + } + val, err = DecodeScalarField(fd, v) + if err != nil { + return nil, err + } + if fd.IsRepeated() { + slice = append(slice, val) + } + } + if fd.IsRepeated() { + return slice, nil + } else { + // if not a repeated field, last value wins + return val, nil + } + } +} + +func (b *Buffer) decodeKnownField(fd *desc.FieldDescriptor, encoding int8, fact MessageFactory) (interface{}, error) { + var val interface{} + var err error + switch encoding { + case proto.WireFixed32: + var num uint64 + num, err = b.DecodeFixed32() + if err == nil { + val, err = DecodeScalarField(fd, num) + } + case proto.WireFixed64: + var num uint64 + num, err = b.DecodeFixed64() + if err == nil { + val, err = DecodeScalarField(fd, num) + } + case proto.WireVarint: + var num uint64 + num, err = b.DecodeVarint() + if err == nil { + val, err = DecodeScalarField(fd, num) + } + + case proto.WireBytes: + alloc := fd.GetType() == descriptor.FieldDescriptorProto_TYPE_BYTES + var raw []byte + raw, err = b.DecodeRawBytes(alloc) + if err == nil { + val, err = DecodeLengthDelimitedField(fd, raw, fact) + } + + case proto.WireStartGroup: + if fd.GetMessageType() == nil { + return nil, fmt.Errorf("cannot parse field %s from group-encoded wire type", fd.GetFullyQualifiedName()) + } + msg := fact.NewMessage(fd.GetMessageType()) + var data []byte + data, err = b.ReadGroup(false) + if err == nil { + err = proto.Unmarshal(data, msg) + if err == nil { + val = msg + } + } + + default: + return nil, ErrBadWireType + } + if err != nil { + return nil, err + } + + return val, nil +} + +func (b *Buffer) decodeUnknownField(tagNumber int32, encoding int8) (interface{}, error) { + u := UnknownField{Tag: tagNumber, Encoding: encoding} + var err error + switch encoding { + case proto.WireFixed32: + u.Value, err = b.DecodeFixed32() + case proto.WireFixed64: + u.Value, err = b.DecodeFixed64() + case proto.WireVarint: + u.Value, err = b.DecodeVarint() + case proto.WireBytes: + u.Contents, err = b.DecodeRawBytes(true) + case proto.WireStartGroup: + u.Contents, err = b.ReadGroup(true) + default: + err = ErrBadWireType + } + if err != nil { + return nil, err + } + return u, nil +} diff --git a/vendor/github.com/jhump/protoreflect/codec/doc.go b/vendor/github.com/jhump/protoreflect/codec/doc.go new file mode 100644 index 00000000..f76499f6 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/codec/doc.go @@ -0,0 +1,7 @@ +// Package codec contains a reader/write type that assists with encoding +// and decoding protobuf's binary representation. +// +// The code in this package began as a fork of proto.Buffer but provides +// additional API to make it more useful to code that needs to dynamically +// process or produce the protobuf binary format. +package codec diff --git a/vendor/github.com/jhump/protoreflect/codec/encode.go b/vendor/github.com/jhump/protoreflect/codec/encode.go new file mode 100644 index 00000000..aaf9142e --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/codec/encode.go @@ -0,0 +1,161 @@ +package codec + +import ( + "github.com/golang/protobuf/proto" +) + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (cb *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + cb.buf = append(cb.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + cb.buf = append(cb.buf, uint8(x)) + return nil +} + +// EncodeTagAndWireType encodes the given field tag and wire type to the +// buffer. This combines the two values and then writes them as a varint. +func (cb *Buffer) EncodeTagAndWireType(tag int32, wireType int8) error { + v := uint64((int64(tag) << 3) | int64(wireType)) + return cb.EncodeVarint(v) +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (cb *Buffer) EncodeFixed64(x uint64) error { + cb.buf = append(cb.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (cb *Buffer) EncodeFixed32(x uint64) error { + cb.buf = append(cb.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +// EncodeZigZag64 does zig-zag encoding to convert the given +// signed 64-bit integer into a form that can be expressed +// efficiently as a varint, even for negative values. +func EncodeZigZag64(v int64) uint64 { + return (uint64(v) << 1) ^ uint64(v>>63) +} + +// EncodeZigZag32 does zig-zag encoding to convert the given +// signed 32-bit integer into a form that can be expressed +// efficiently as a varint, even for negative values. +func EncodeZigZag32(v int32) uint64 { + return uint64((uint32(v) << 1) ^ uint32((v >> 31))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (cb *Buffer) EncodeRawBytes(b []byte) error { + if err := cb.EncodeVarint(uint64(len(b))); err != nil { + return err + } + cb.buf = append(cb.buf, b...) + return nil +} + +// EncodeMessage writes the given message to the buffer. +func (cb *Buffer) EncodeMessage(pm proto.Message) error { + bytes, err := marshalMessage(cb.buf, pm, cb.deterministic) + if err != nil { + return err + } + cb.buf = bytes + return nil +} + +// EncodeDelimitedMessage writes the given message to the buffer with a +// varint-encoded length prefix (the delimiter). +func (cb *Buffer) EncodeDelimitedMessage(pm proto.Message) error { + bytes, err := marshalMessage(cb.tmp, pm, cb.deterministic) + if err != nil { + return err + } + // save truncated buffer if it was grown (so we can re-use it and + // curtail future allocations) + if cap(bytes) > cap(cb.tmp) { + cb.tmp = bytes[:0] + } + return cb.EncodeRawBytes(bytes) +} + +func marshalMessage(b []byte, pm proto.Message, deterministic bool) ([]byte, error) { + // We try to use the most efficient way to marshal to existing slice. + + if deterministic { + // see if the message has custom deterministic methods, preferring an + // "append" method over one that must always re-allocate + madm, ok := pm.(interface { + MarshalAppendDeterministic(b []byte) ([]byte, error) + }) + if ok { + return madm.MarshalAppendDeterministic(b) + } + + mdm, ok := pm.(interface { + MarshalDeterministic() ([]byte, error) + }) + if ok { + bytes, err := mdm.MarshalDeterministic() + if err != nil { + return nil, err + } + if len(b) == 0 { + return bytes, nil + } + return append(b, bytes...), nil + } + + var buf proto.Buffer + buf.SetDeterministic(true) + if err := buf.Marshal(pm); err != nil { + return nil, err + } + bytes := buf.Bytes() + if len(b) == 0 { + return bytes, nil + } + return append(b, bytes...), nil + } + + mam, ok := pm.(interface { + // see if we can append the message, vs. having to re-allocate + MarshalAppend(b []byte) ([]byte, error) + }) + if ok { + return mam.MarshalAppend(b) + } + + // lowest common denominator + bytes, err := proto.Marshal(pm) + if err != nil { + return nil, err + } + if len(b) == 0 { + return bytes, nil + } + return append(b, bytes...), nil +} diff --git a/vendor/github.com/jhump/protoreflect/codec/encode_fields.go b/vendor/github.com/jhump/protoreflect/codec/encode_fields.go new file mode 100644 index 00000000..3f174547 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/codec/encode_fields.go @@ -0,0 +1,273 @@ +package codec + +import ( + "fmt" + "math" + "reflect" + "sort" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/desc" +) + +func (cb *Buffer) EncodeFieldValue(fd *desc.FieldDescriptor, val interface{}) error { + if fd.IsMap() { + mp := val.(map[interface{}]interface{}) + entryType := fd.GetMessageType() + keyType := entryType.FindFieldByNumber(1) + valType := entryType.FindFieldByNumber(2) + var entryBuffer Buffer + if cb.deterministic { + keys := make([]interface{}, 0, len(mp)) + for k := range mp { + keys = append(keys, k) + } + sort.Sort(sortable(keys)) + for _, k := range keys { + v := mp[k] + entryBuffer.Reset() + if err := entryBuffer.encodeFieldElement(keyType, k); err != nil { + return err + } + rv := reflect.ValueOf(v) + if rv.Kind() != reflect.Ptr || !rv.IsNil() { + if err := entryBuffer.encodeFieldElement(valType, v); err != nil { + return err + } + } + if err := cb.EncodeTagAndWireType(fd.GetNumber(), proto.WireBytes); err != nil { + return err + } + if err := cb.EncodeRawBytes(entryBuffer.Bytes()); err != nil { + return err + } + } + } else { + for k, v := range mp { + entryBuffer.Reset() + if err := entryBuffer.encodeFieldElement(keyType, k); err != nil { + return err + } + rv := reflect.ValueOf(v) + if rv.Kind() != reflect.Ptr || !rv.IsNil() { + if err := entryBuffer.encodeFieldElement(valType, v); err != nil { + return err + } + } + if err := cb.EncodeTagAndWireType(fd.GetNumber(), proto.WireBytes); err != nil { + return err + } + if err := cb.EncodeRawBytes(entryBuffer.Bytes()); err != nil { + return err + } + } + } + return nil + } else if fd.IsRepeated() { + sl := val.([]interface{}) + wt, err := getWireType(fd.GetType()) + if err != nil { + return err + } + if isPacked(fd) && len(sl) > 0 && + (wt == proto.WireVarint || wt == proto.WireFixed32 || wt == proto.WireFixed64) { + // packed repeated field + var packedBuffer Buffer + for _, v := range sl { + if err := packedBuffer.encodeFieldValue(fd, v); err != nil { + return err + } + } + if err := cb.EncodeTagAndWireType(fd.GetNumber(), proto.WireBytes); err != nil { + return err + } + return cb.EncodeRawBytes(packedBuffer.Bytes()) + } else { + // non-packed repeated field + for _, v := range sl { + if err := cb.encodeFieldElement(fd, v); err != nil { + return err + } + } + return nil + } + } else { + return cb.encodeFieldElement(fd, val) + } +} + +func isPacked(fd *desc.FieldDescriptor) bool { + opts := fd.AsFieldDescriptorProto().GetOptions() + // if set, use that value + if opts != nil && opts.Packed != nil { + return opts.GetPacked() + } + // if unset: proto2 defaults to false, proto3 to true + return fd.GetFile().IsProto3() +} + +// sortable is used to sort map keys. Values will be integers (int32, int64, uint32, and uint64), +// bools, or strings. +type sortable []interface{} + +func (s sortable) Len() int { + return len(s) +} + +func (s sortable) Less(i, j int) bool { + vi := s[i] + vj := s[j] + switch reflect.TypeOf(vi).Kind() { + case reflect.Int32: + return vi.(int32) < vj.(int32) + case reflect.Int64: + return vi.(int64) < vj.(int64) + case reflect.Uint32: + return vi.(uint32) < vj.(uint32) + case reflect.Uint64: + return vi.(uint64) < vj.(uint64) + case reflect.String: + return vi.(string) < vj.(string) + case reflect.Bool: + return !vi.(bool) && vj.(bool) + default: + panic(fmt.Sprintf("cannot compare keys of type %v", reflect.TypeOf(vi))) + } +} + +func (s sortable) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (b *Buffer) encodeFieldElement(fd *desc.FieldDescriptor, val interface{}) error { + wt, err := getWireType(fd.GetType()) + if err != nil { + return err + } + if err := b.EncodeTagAndWireType(fd.GetNumber(), wt); err != nil { + return err + } + if err := b.encodeFieldValue(fd, val); err != nil { + return err + } + if wt == proto.WireStartGroup { + return b.EncodeTagAndWireType(fd.GetNumber(), proto.WireEndGroup) + } + return nil +} + +func (b *Buffer) encodeFieldValue(fd *desc.FieldDescriptor, val interface{}) error { + switch fd.GetType() { + case descriptor.FieldDescriptorProto_TYPE_BOOL: + v := val.(bool) + if v { + return b.EncodeVarint(1) + } + return b.EncodeVarint(0) + + case descriptor.FieldDescriptorProto_TYPE_ENUM, + descriptor.FieldDescriptorProto_TYPE_INT32: + v := val.(int32) + return b.EncodeVarint(uint64(v)) + + case descriptor.FieldDescriptorProto_TYPE_SFIXED32: + v := val.(int32) + return b.EncodeFixed32(uint64(v)) + + case descriptor.FieldDescriptorProto_TYPE_SINT32: + v := val.(int32) + return b.EncodeVarint(EncodeZigZag32(v)) + + case descriptor.FieldDescriptorProto_TYPE_UINT32: + v := val.(uint32) + return b.EncodeVarint(uint64(v)) + + case descriptor.FieldDescriptorProto_TYPE_FIXED32: + v := val.(uint32) + return b.EncodeFixed32(uint64(v)) + + case descriptor.FieldDescriptorProto_TYPE_INT64: + v := val.(int64) + return b.EncodeVarint(uint64(v)) + + case descriptor.FieldDescriptorProto_TYPE_SFIXED64: + v := val.(int64) + return b.EncodeFixed64(uint64(v)) + + case descriptor.FieldDescriptorProto_TYPE_SINT64: + v := val.(int64) + return b.EncodeVarint(EncodeZigZag64(v)) + + case descriptor.FieldDescriptorProto_TYPE_UINT64: + v := val.(uint64) + return b.EncodeVarint(v) + + case descriptor.FieldDescriptorProto_TYPE_FIXED64: + v := val.(uint64) + return b.EncodeFixed64(v) + + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + v := val.(float64) + return b.EncodeFixed64(math.Float64bits(v)) + + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + v := val.(float32) + return b.EncodeFixed32(uint64(math.Float32bits(v))) + + case descriptor.FieldDescriptorProto_TYPE_BYTES: + v := val.([]byte) + return b.EncodeRawBytes(v) + + case descriptor.FieldDescriptorProto_TYPE_STRING: + v := val.(string) + return b.EncodeRawBytes(([]byte)(v)) + + case descriptor.FieldDescriptorProto_TYPE_MESSAGE: + return b.EncodeDelimitedMessage(val.(proto.Message)) + + case descriptor.FieldDescriptorProto_TYPE_GROUP: + // just append the nested message to this buffer + return b.EncodeMessage(val.(proto.Message)) + // whosoever writeth start-group tag (e.g. caller) is responsible for writing end-group tag + + default: + return fmt.Errorf("unrecognized field type: %v", fd.GetType()) + } +} + +func getWireType(t descriptor.FieldDescriptorProto_Type) (int8, error) { + switch t { + case descriptor.FieldDescriptorProto_TYPE_ENUM, + descriptor.FieldDescriptorProto_TYPE_BOOL, + descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_SINT32, + descriptor.FieldDescriptorProto_TYPE_UINT32, + descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_SINT64, + descriptor.FieldDescriptorProto_TYPE_UINT64: + return proto.WireVarint, nil + + case descriptor.FieldDescriptorProto_TYPE_FIXED32, + descriptor.FieldDescriptorProto_TYPE_SFIXED32, + descriptor.FieldDescriptorProto_TYPE_FLOAT: + return proto.WireFixed32, nil + + case descriptor.FieldDescriptorProto_TYPE_FIXED64, + descriptor.FieldDescriptorProto_TYPE_SFIXED64, + descriptor.FieldDescriptorProto_TYPE_DOUBLE: + return proto.WireFixed64, nil + + case descriptor.FieldDescriptorProto_TYPE_BYTES, + descriptor.FieldDescriptorProto_TYPE_STRING, + descriptor.FieldDescriptorProto_TYPE_MESSAGE: + return proto.WireBytes, nil + + case descriptor.FieldDescriptorProto_TYPE_GROUP: + return proto.WireStartGroup, nil + + default: + return 0, ErrBadWireType + } +} diff --git a/vendor/github.com/jhump/protoreflect/desc/convert.go b/vendor/github.com/jhump/protoreflect/desc/convert.go new file mode 100644 index 00000000..538820c3 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/convert.go @@ -0,0 +1,231 @@ +package desc + +import ( + "errors" + "fmt" + "strings" + + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/desc/internal" + intn "github.com/jhump/protoreflect/internal" +) + +// CreateFileDescriptor instantiates a new file descriptor for the given descriptor proto. +// The file's direct dependencies must be provided. If the given dependencies do not include +// all of the file's dependencies or if the contents of the descriptors are internally +// inconsistent (e.g. contain unresolvable symbols) then an error is returned. +func CreateFileDescriptor(fd *dpb.FileDescriptorProto, deps ...*FileDescriptor) (*FileDescriptor, error) { + return createFileDescriptor(fd, deps, nil) +} + +func createFileDescriptor(fd *dpb.FileDescriptorProto, deps []*FileDescriptor, r *ImportResolver) (*FileDescriptor, error) { + ret := &FileDescriptor{ + proto: fd, + symbols: map[string]Descriptor{}, + fieldIndex: map[string]map[int32]*FieldDescriptor{}, + } + pkg := fd.GetPackage() + + // populate references to file descriptor dependencies + files := map[string]*FileDescriptor{} + for _, f := range deps { + files[f.proto.GetName()] = f + } + ret.deps = make([]*FileDescriptor, len(fd.GetDependency())) + for i, d := range fd.GetDependency() { + resolved := r.ResolveImport(fd.GetName(), d) + ret.deps[i] = files[resolved] + if ret.deps[i] == nil { + if resolved != d { + ret.deps[i] = files[d] + } + if ret.deps[i] == nil { + return nil, intn.ErrNoSuchFile(d) + } + } + } + ret.publicDeps = make([]*FileDescriptor, len(fd.GetPublicDependency())) + for i, pd := range fd.GetPublicDependency() { + ret.publicDeps[i] = ret.deps[pd] + } + ret.weakDeps = make([]*FileDescriptor, len(fd.GetWeakDependency())) + for i, wd := range fd.GetWeakDependency() { + ret.weakDeps[i] = ret.deps[wd] + } + ret.isProto3 = fd.GetSyntax() == "proto3" + + // populate all tables of child descriptors + for _, m := range fd.GetMessageType() { + md, n := createMessageDescriptor(ret, ret, pkg, m, ret.symbols) + ret.symbols[n] = md + ret.messages = append(ret.messages, md) + } + for _, e := range fd.GetEnumType() { + ed, n := createEnumDescriptor(ret, ret, pkg, e, ret.symbols) + ret.symbols[n] = ed + ret.enums = append(ret.enums, ed) + } + for _, ex := range fd.GetExtension() { + exd, n := createFieldDescriptor(ret, ret, pkg, ex) + ret.symbols[n] = exd + ret.extensions = append(ret.extensions, exd) + } + for _, s := range fd.GetService() { + sd, n := createServiceDescriptor(ret, pkg, s, ret.symbols) + ret.symbols[n] = sd + ret.services = append(ret.services, sd) + } + + ret.sourceInfo = internal.CreateSourceInfoMap(fd) + ret.sourceInfoRecomputeFunc = ret.recomputeSourceInfo + + // now we can resolve all type references and source code info + scopes := []scope{fileScope(ret)} + path := make([]int32, 1, 8) + path[0] = internal.File_messagesTag + for i, md := range ret.messages { + if err := md.resolve(append(path, int32(i)), scopes); err != nil { + return nil, err + } + } + path[0] = internal.File_enumsTag + for i, ed := range ret.enums { + ed.resolve(append(path, int32(i))) + } + path[0] = internal.File_extensionsTag + for i, exd := range ret.extensions { + if err := exd.resolve(append(path, int32(i)), scopes); err != nil { + return nil, err + } + } + path[0] = internal.File_servicesTag + for i, sd := range ret.services { + if err := sd.resolve(append(path, int32(i)), scopes); err != nil { + return nil, err + } + } + + return ret, nil +} + +// CreateFileDescriptors constructs a set of descriptors, one for each of the +// given descriptor protos. The given set of descriptor protos must include all +// transitive dependencies for every file. +func CreateFileDescriptors(fds []*dpb.FileDescriptorProto) (map[string]*FileDescriptor, error) { + return createFileDescriptors(fds, nil) +} + +func createFileDescriptors(fds []*dpb.FileDescriptorProto, r *ImportResolver) (map[string]*FileDescriptor, error) { + if len(fds) == 0 { + return nil, nil + } + files := map[string]*dpb.FileDescriptorProto{} + resolved := map[string]*FileDescriptor{} + var name string + for _, fd := range fds { + name = fd.GetName() + files[name] = fd + } + for _, fd := range fds { + _, err := createFromSet(fd.GetName(), r, nil, files, resolved) + if err != nil { + return nil, err + } + } + return resolved, nil +} + +// ToFileDescriptorSet creates a FileDescriptorSet proto that contains all of the given +// file descriptors and their transitive dependencies. The files are topologically sorted +// so that a file will always appear after its dependencies. +func ToFileDescriptorSet(fds ...*FileDescriptor) *dpb.FileDescriptorSet { + var fdps []*dpb.FileDescriptorProto + addAllFiles(fds, &fdps, map[string]struct{}{}) + return &dpb.FileDescriptorSet{File: fdps} +} + +func addAllFiles(src []*FileDescriptor, results *[]*dpb.FileDescriptorProto, seen map[string]struct{}) { + for _, fd := range src { + if _, ok := seen[fd.GetName()]; ok { + continue + } + seen[fd.GetName()] = struct{}{} + addAllFiles(fd.GetDependencies(), results, seen) + *results = append(*results, fd.AsFileDescriptorProto()) + } +} + +// CreateFileDescriptorFromSet creates a descriptor from the given file descriptor set. The +// set's *last* file will be the returned descriptor. The set's remaining files must comprise +// the full set of transitive dependencies of that last file. This is the same format and +// order used by protoc when emitting a FileDescriptorSet file with an invocation like so: +// protoc --descriptor_set_out=./test.protoset --include_imports -I. test.proto +func CreateFileDescriptorFromSet(fds *dpb.FileDescriptorSet) (*FileDescriptor, error) { + return createFileDescriptorFromSet(fds, nil) +} + +func createFileDescriptorFromSet(fds *dpb.FileDescriptorSet, r *ImportResolver) (*FileDescriptor, error) { + result, err := createFileDescriptorsFromSet(fds, r) + if err != nil { + return nil, err + } + files := fds.GetFile() + lastFilename := files[len(files)-1].GetName() + return result[lastFilename], nil +} + +// CreateFileDescriptorsFromSet creates file descriptors from the given file descriptor set. +// The returned map includes all files in the set, keyed b name. The set must include the +// full set of transitive dependencies for all files therein or else a link error will occur +// and be returned instead of the slice of descriptors. This is the same format used by +// protoc when a FileDescriptorSet file with an invocation like so: +// protoc --descriptor_set_out=./test.protoset --include_imports -I. test.proto +func CreateFileDescriptorsFromSet(fds *dpb.FileDescriptorSet) (map[string]*FileDescriptor, error) { + return createFileDescriptorsFromSet(fds, nil) +} + +func createFileDescriptorsFromSet(fds *dpb.FileDescriptorSet, r *ImportResolver) (map[string]*FileDescriptor, error) { + files := fds.GetFile() + if len(files) == 0 { + return nil, errors.New("file descriptor set is empty") + } + return createFileDescriptors(files, r) +} + +// createFromSet creates a descriptor for the given filename. It recursively +// creates descriptors for the given file's dependencies. +func createFromSet(filename string, r *ImportResolver, seen []string, files map[string]*dpb.FileDescriptorProto, resolved map[string]*FileDescriptor) (*FileDescriptor, error) { + for _, s := range seen { + if filename == s { + return nil, fmt.Errorf("cycle in imports: %s", strings.Join(append(seen, filename), " -> ")) + } + } + seen = append(seen, filename) + + if d, ok := resolved[filename]; ok { + return d, nil + } + fdp := files[filename] + if fdp == nil { + return nil, intn.ErrNoSuchFile(filename) + } + deps := make([]*FileDescriptor, len(fdp.GetDependency())) + for i, depName := range fdp.GetDependency() { + resolvedDep := r.ResolveImport(filename, depName) + dep, err := createFromSet(resolvedDep, r, seen, files, resolved) + if _, ok := err.(intn.ErrNoSuchFile); ok && resolvedDep != depName { + dep, err = createFromSet(depName, r, seen, files, resolved) + } + if err != nil { + return nil, err + } + deps[i] = dep + } + d, err := createFileDescriptor(fdp, deps, r) + if err != nil { + return nil, err + } + resolved[filename] = d + return d, nil +} diff --git a/vendor/github.com/jhump/protoreflect/desc/descriptor.go b/vendor/github.com/jhump/protoreflect/desc/descriptor.go new file mode 100644 index 00000000..2343f824 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/descriptor.go @@ -0,0 +1,1701 @@ +package desc + +import ( + "bytes" + "fmt" + "sort" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/desc/internal" +) + +// Descriptor is the common interface implemented by all descriptor objects. +type Descriptor interface { + // GetName returns the name of the object described by the descriptor. This will + // be a base name that does not include enclosing message names or the package name. + // For file descriptors, this indicates the path and name to the described file. + GetName() string + // GetFullyQualifiedName returns the fully-qualified name of the object described by + // the descriptor. This will include the package name and any enclosing message names. + // For file descriptors, this returns the path and name to the described file (same as + // GetName). + GetFullyQualifiedName() string + // GetParent returns the enclosing element in a proto source file. If the described + // object is a top-level object, this returns the file descriptor. Otherwise, it returns + // the element in which the described object was declared. File descriptors have no + // parent and return nil. + GetParent() Descriptor + // GetFile returns the file descriptor in which this element was declared. File + // descriptors return themselves. + GetFile() *FileDescriptor + // GetOptions returns the options proto containing options for the described element. + GetOptions() proto.Message + // GetSourceInfo returns any source code information that was present in the file + // descriptor. Source code info is optional. If no source code info is available for + // the element (including if there is none at all in the file descriptor) then this + // returns nil + GetSourceInfo() *dpb.SourceCodeInfo_Location + // AsProto returns the underlying descriptor proto for this descriptor. + AsProto() proto.Message +} + +type sourceInfoRecomputeFunc = internal.SourceInfoComputeFunc + +// FileDescriptor describes a proto source file. +type FileDescriptor struct { + proto *dpb.FileDescriptorProto + symbols map[string]Descriptor + deps []*FileDescriptor + publicDeps []*FileDescriptor + weakDeps []*FileDescriptor + messages []*MessageDescriptor + enums []*EnumDescriptor + extensions []*FieldDescriptor + services []*ServiceDescriptor + fieldIndex map[string]map[int32]*FieldDescriptor + isProto3 bool + sourceInfo internal.SourceInfoMap + sourceInfoRecomputeFunc +} + +func (fd *FileDescriptor) recomputeSourceInfo() { + internal.PopulateSourceInfoMap(fd.proto, fd.sourceInfo) +} + +func (fd *FileDescriptor) registerField(field *FieldDescriptor) { + fields := fd.fieldIndex[field.owner.GetFullyQualifiedName()] + if fields == nil { + fields = map[int32]*FieldDescriptor{} + fd.fieldIndex[field.owner.GetFullyQualifiedName()] = fields + } + fields[field.GetNumber()] = field +} + +// GetName returns the name of the file, as it was given to the protoc invocation +// to compile it, possibly including path (relative to a directory in the proto +// import path). +func (fd *FileDescriptor) GetName() string { + return fd.proto.GetName() +} + +// GetFullyQualifiedName returns the name of the file, same as GetName. It is +// present to satisfy the Descriptor interface. +func (fd *FileDescriptor) GetFullyQualifiedName() string { + return fd.proto.GetName() +} + +// GetPackage returns the name of the package declared in the file. +func (fd *FileDescriptor) GetPackage() string { + return fd.proto.GetPackage() +} + +// GetParent always returns nil: files are the root of descriptor hierarchies. +// Is it present to satisfy the Descriptor interface. +func (fd *FileDescriptor) GetParent() Descriptor { + return nil +} + +// GetFile returns the receiver, which is a file descriptor. This is present +// to satisfy the Descriptor interface. +func (fd *FileDescriptor) GetFile() *FileDescriptor { + return fd +} + +// GetOptions returns the file's options. Most usages will be more interested +// in GetFileOptions, which has a concrete return type. This generic version +// is present to satisfy the Descriptor interface. +func (fd *FileDescriptor) GetOptions() proto.Message { + return fd.proto.GetOptions() +} + +// GetFileOptions returns the file's options. +func (fd *FileDescriptor) GetFileOptions() *dpb.FileOptions { + return fd.proto.GetOptions() +} + +// GetSourceInfo returns nil for files. It is present to satisfy the Descriptor +// interface. +func (fd *FileDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location { + return nil +} + +// AsProto returns the underlying descriptor proto. Most usages will be more +// interested in AsFileDescriptorProto, which has a concrete return type. This +// generic version is present to satisfy the Descriptor interface. +func (fd *FileDescriptor) AsProto() proto.Message { + return fd.proto +} + +// AsFileDescriptorProto returns the underlying descriptor proto. +func (fd *FileDescriptor) AsFileDescriptorProto() *dpb.FileDescriptorProto { + return fd.proto +} + +// String returns the underlying descriptor proto, in compact text format. +func (fd *FileDescriptor) String() string { + return fd.proto.String() +} + +// IsProto3 returns true if the file declares a syntax of "proto3". +func (fd *FileDescriptor) IsProto3() bool { + return fd.isProto3 +} + +// GetDependencies returns all of this file's dependencies. These correspond to +// import statements in the file. +func (fd *FileDescriptor) GetDependencies() []*FileDescriptor { + return fd.deps +} + +// GetPublicDependencies returns all of this file's public dependencies. These +// correspond to public import statements in the file. +func (fd *FileDescriptor) GetPublicDependencies() []*FileDescriptor { + return fd.publicDeps +} + +// GetWeakDependencies returns all of this file's weak dependencies. These +// correspond to weak import statements in the file. +func (fd *FileDescriptor) GetWeakDependencies() []*FileDescriptor { + return fd.weakDeps +} + +// GetMessageTypes returns all top-level messages declared in this file. +func (fd *FileDescriptor) GetMessageTypes() []*MessageDescriptor { + return fd.messages +} + +// GetEnumTypes returns all top-level enums declared in this file. +func (fd *FileDescriptor) GetEnumTypes() []*EnumDescriptor { + return fd.enums +} + +// GetExtensions returns all top-level extensions declared in this file. +func (fd *FileDescriptor) GetExtensions() []*FieldDescriptor { + return fd.extensions +} + +// GetServices returns all services declared in this file. +func (fd *FileDescriptor) GetServices() []*ServiceDescriptor { + return fd.services +} + +// FindSymbol returns the descriptor contained within this file for the +// element with the given fully-qualified symbol name. If no such element +// exists then this method returns nil. +func (fd *FileDescriptor) FindSymbol(symbol string) Descriptor { + if symbol[0] == '.' { + symbol = symbol[1:] + } + if ret := fd.symbols[symbol]; ret != nil { + return ret + } + + // allow accessing symbols through public imports, too + for _, dep := range fd.GetPublicDependencies() { + if ret := dep.FindSymbol(symbol); ret != nil { + return ret + } + } + + // not found + return nil +} + +// FindMessage finds the message with the given fully-qualified name. If no +// such element exists in this file then nil is returned. +func (fd *FileDescriptor) FindMessage(msgName string) *MessageDescriptor { + if md, ok := fd.symbols[msgName].(*MessageDescriptor); ok { + return md + } else { + return nil + } +} + +// FindEnum finds the enum with the given fully-qualified name. If no such +// element exists in this file then nil is returned. +func (fd *FileDescriptor) FindEnum(enumName string) *EnumDescriptor { + if ed, ok := fd.symbols[enumName].(*EnumDescriptor); ok { + return ed + } else { + return nil + } +} + +// FindService finds the service with the given fully-qualified name. If no +// such element exists in this file then nil is returned. +func (fd *FileDescriptor) FindService(serviceName string) *ServiceDescriptor { + if sd, ok := fd.symbols[serviceName].(*ServiceDescriptor); ok { + return sd + } else { + return nil + } +} + +// FindExtension finds the extension field for the given extended type name and +// tag number. If no such element exists in this file then nil is returned. +func (fd *FileDescriptor) FindExtension(extendeeName string, tagNumber int32) *FieldDescriptor { + if exd, ok := fd.fieldIndex[extendeeName][tagNumber]; ok && exd.IsExtension() { + return exd + } else { + return nil + } +} + +// FindExtensionByName finds the extension field with the given fully-qualified +// name. If no such element exists in this file then nil is returned. +func (fd *FileDescriptor) FindExtensionByName(extName string) *FieldDescriptor { + if exd, ok := fd.symbols[extName].(*FieldDescriptor); ok && exd.IsExtension() { + return exd + } else { + return nil + } +} + +// MessageDescriptor describes a protocol buffer message. +type MessageDescriptor struct { + proto *dpb.DescriptorProto + parent Descriptor + file *FileDescriptor + fields []*FieldDescriptor + nested []*MessageDescriptor + enums []*EnumDescriptor + extensions []*FieldDescriptor + oneOfs []*OneOfDescriptor + extRanges extRanges + fqn string + sourceInfoPath []int32 + jsonNames jsonNameMap + isProto3 bool + isMapEntry bool +} + +func createMessageDescriptor(fd *FileDescriptor, parent Descriptor, enclosing string, md *dpb.DescriptorProto, symbols map[string]Descriptor) (*MessageDescriptor, string) { + msgName := merge(enclosing, md.GetName()) + ret := &MessageDescriptor{proto: md, parent: parent, file: fd, fqn: msgName} + for _, f := range md.GetField() { + fld, n := createFieldDescriptor(fd, ret, msgName, f) + symbols[n] = fld + ret.fields = append(ret.fields, fld) + } + for _, nm := range md.NestedType { + nmd, n := createMessageDescriptor(fd, ret, msgName, nm, symbols) + symbols[n] = nmd + ret.nested = append(ret.nested, nmd) + } + for _, e := range md.EnumType { + ed, n := createEnumDescriptor(fd, ret, msgName, e, symbols) + symbols[n] = ed + ret.enums = append(ret.enums, ed) + } + for _, ex := range md.GetExtension() { + exd, n := createFieldDescriptor(fd, ret, msgName, ex) + symbols[n] = exd + ret.extensions = append(ret.extensions, exd) + } + for i, o := range md.GetOneofDecl() { + od, n := createOneOfDescriptor(fd, ret, i, msgName, o) + symbols[n] = od + ret.oneOfs = append(ret.oneOfs, od) + } + for _, r := range md.GetExtensionRange() { + // proto.ExtensionRange is inclusive (and that's how extension ranges are defined in code). + // but protoc converts range to exclusive end in descriptor, so we must convert back + end := r.GetEnd() - 1 + ret.extRanges = append(ret.extRanges, proto.ExtensionRange{ + Start: r.GetStart(), + End: end}) + } + sort.Sort(ret.extRanges) + ret.isProto3 = fd.isProto3 + ret.isMapEntry = md.GetOptions().GetMapEntry() && + len(ret.fields) == 2 && + ret.fields[0].GetNumber() == 1 && + ret.fields[1].GetNumber() == 2 + + return ret, msgName +} + +func (md *MessageDescriptor) resolve(path []int32, scopes []scope) error { + md.sourceInfoPath = append([]int32(nil), path...) // defensive copy + path = append(path, internal.Message_nestedMessagesTag) + scopes = append(scopes, messageScope(md)) + for i, nmd := range md.nested { + if err := nmd.resolve(append(path, int32(i)), scopes); err != nil { + return err + } + } + path[len(path)-1] = internal.Message_enumsTag + for i, ed := range md.enums { + ed.resolve(append(path, int32(i))) + } + path[len(path)-1] = internal.Message_fieldsTag + for i, fld := range md.fields { + if err := fld.resolve(append(path, int32(i)), scopes); err != nil { + return err + } + } + path[len(path)-1] = internal.Message_extensionsTag + for i, exd := range md.extensions { + if err := exd.resolve(append(path, int32(i)), scopes); err != nil { + return err + } + } + path[len(path)-1] = internal.Message_oneOfsTag + for i, od := range md.oneOfs { + od.resolve(append(path, int32(i))) + } + return nil +} + +// GetName returns the simple (unqualified) name of the message. +func (md *MessageDescriptor) GetName() string { + return md.proto.GetName() +} + +// GetFullyQualifiedName returns the fully qualified name of the message. This +// includes the package name (if there is one) as well as the names of any +// enclosing messages. +func (md *MessageDescriptor) GetFullyQualifiedName() string { + return md.fqn +} + +// GetParent returns the message's enclosing descriptor. For top-level messages, +// this will be a file descriptor. Otherwise it will be the descriptor for the +// enclosing message. +func (md *MessageDescriptor) GetParent() Descriptor { + return md.parent +} + +// GetFile returns the descriptor for the file in which this message is defined. +func (md *MessageDescriptor) GetFile() *FileDescriptor { + return md.file +} + +// GetOptions returns the message's options. Most usages will be more interested +// in GetMessageOptions, which has a concrete return type. This generic version +// is present to satisfy the Descriptor interface. +func (md *MessageDescriptor) GetOptions() proto.Message { + return md.proto.GetOptions() +} + +// GetMessageOptions returns the message's options. +func (md *MessageDescriptor) GetMessageOptions() *dpb.MessageOptions { + return md.proto.GetOptions() +} + +// GetSourceInfo returns source info for the message, if present in the +// descriptor. Not all descriptors will contain source info. If non-nil, the +// returned info contains information about the location in the file where the +// message was defined and also contains comments associated with the message +// definition. +func (md *MessageDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location { + return md.file.sourceInfo.Get(md.sourceInfoPath) +} + +// AsProto returns the underlying descriptor proto. Most usages will be more +// interested in AsDescriptorProto, which has a concrete return type. This +// generic version is present to satisfy the Descriptor interface. +func (md *MessageDescriptor) AsProto() proto.Message { + return md.proto +} + +// AsDescriptorProto returns the underlying descriptor proto. +func (md *MessageDescriptor) AsDescriptorProto() *dpb.DescriptorProto { + return md.proto +} + +// String returns the underlying descriptor proto, in compact text format. +func (md *MessageDescriptor) String() string { + return md.proto.String() +} + +// IsMapEntry returns true if this is a synthetic message type that represents an entry +// in a map field. +func (md *MessageDescriptor) IsMapEntry() bool { + return md.isMapEntry +} + +// GetFields returns all of the fields for this message. +func (md *MessageDescriptor) GetFields() []*FieldDescriptor { + return md.fields +} + +// GetNestedMessageTypes returns all of the message types declared inside this message. +func (md *MessageDescriptor) GetNestedMessageTypes() []*MessageDescriptor { + return md.nested +} + +// GetNestedEnumTypes returns all of the enums declared inside this message. +func (md *MessageDescriptor) GetNestedEnumTypes() []*EnumDescriptor { + return md.enums +} + +// GetNestedExtensions returns all of the extensions declared inside this message. +func (md *MessageDescriptor) GetNestedExtensions() []*FieldDescriptor { + return md.extensions +} + +// GetOneOfs returns all of the one-of field sets declared inside this message. +func (md *MessageDescriptor) GetOneOfs() []*OneOfDescriptor { + return md.oneOfs +} + +// IsProto3 returns true if the file in which this message is defined declares a syntax of "proto3". +func (md *MessageDescriptor) IsProto3() bool { + return md.isProto3 +} + +// GetExtensionRanges returns the ranges of extension field numbers for this message. +func (md *MessageDescriptor) GetExtensionRanges() []proto.ExtensionRange { + return md.extRanges +} + +// IsExtendable returns true if this message has any extension ranges. +func (md *MessageDescriptor) IsExtendable() bool { + return len(md.extRanges) > 0 +} + +// IsExtension returns true if the given tag number is within any of this message's +// extension ranges. +func (md *MessageDescriptor) IsExtension(tagNumber int32) bool { + return md.extRanges.IsExtension(tagNumber) +} + +type extRanges []proto.ExtensionRange + +func (er extRanges) String() string { + var buf bytes.Buffer + first := true + for _, r := range er { + if first { + first = false + } else { + buf.WriteString(",") + } + fmt.Fprintf(&buf, "%d..%d", r.Start, r.End) + } + return buf.String() +} + +func (er extRanges) IsExtension(tagNumber int32) bool { + i := sort.Search(len(er), func(i int) bool { return er[i].End >= tagNumber }) + return i < len(er) && tagNumber >= er[i].Start +} + +func (er extRanges) Len() int { + return len(er) +} + +func (er extRanges) Less(i, j int) bool { + return er[i].Start < er[j].Start +} + +func (er extRanges) Swap(i, j int) { + er[i], er[j] = er[j], er[i] +} + +// FindFieldByName finds the field with the given name. If no such field exists +// then nil is returned. Only regular fields are returned, not extensions. +func (md *MessageDescriptor) FindFieldByName(fieldName string) *FieldDescriptor { + fqn := fmt.Sprintf("%s.%s", md.fqn, fieldName) + if fd, ok := md.file.symbols[fqn].(*FieldDescriptor); ok && !fd.IsExtension() { + return fd + } else { + return nil + } +} + +// FindFieldByNumber finds the field with the given tag number. If no such field +// exists then nil is returned. Only regular fields are returned, not extensions. +func (md *MessageDescriptor) FindFieldByNumber(tagNumber int32) *FieldDescriptor { + if fd, ok := md.file.fieldIndex[md.fqn][tagNumber]; ok && !fd.IsExtension() { + return fd + } else { + return nil + } +} + +// FieldDescriptor describes a field of a protocol buffer message. +type FieldDescriptor struct { + proto *dpb.FieldDescriptorProto + parent Descriptor + owner *MessageDescriptor + file *FileDescriptor + oneOf *OneOfDescriptor + msgType *MessageDescriptor + enumType *EnumDescriptor + fqn string + sourceInfoPath []int32 + def memoizedDefault + isMap bool +} + +func createFieldDescriptor(fd *FileDescriptor, parent Descriptor, enclosing string, fld *dpb.FieldDescriptorProto) (*FieldDescriptor, string) { + fldName := merge(enclosing, fld.GetName()) + ret := &FieldDescriptor{proto: fld, parent: parent, file: fd, fqn: fldName} + if fld.GetExtendee() == "" { + ret.owner = parent.(*MessageDescriptor) + } + // owner for extensions, field type (be it message or enum), and one-ofs get resolved later + return ret, fldName +} + +func (fd *FieldDescriptor) resolve(path []int32, scopes []scope) error { + if fd.proto.OneofIndex != nil && fd.oneOf == nil { + return fmt.Errorf("could not link field %s to one-of index %d", fd.fqn, *fd.proto.OneofIndex) + } + fd.sourceInfoPath = append([]int32(nil), path...) // defensive copy + if fd.proto.GetType() == dpb.FieldDescriptorProto_TYPE_ENUM { + if desc, err := resolve(fd.file, fd.proto.GetTypeName(), scopes); err != nil { + return err + } else { + fd.enumType = desc.(*EnumDescriptor) + } + } + if fd.proto.GetType() == dpb.FieldDescriptorProto_TYPE_MESSAGE || fd.proto.GetType() == dpb.FieldDescriptorProto_TYPE_GROUP { + if desc, err := resolve(fd.file, fd.proto.GetTypeName(), scopes); err != nil { + return err + } else { + fd.msgType = desc.(*MessageDescriptor) + } + } + if fd.proto.GetExtendee() != "" { + if desc, err := resolve(fd.file, fd.proto.GetExtendee(), scopes); err != nil { + return err + } else { + fd.owner = desc.(*MessageDescriptor) + } + } + fd.file.registerField(fd) + fd.isMap = fd.proto.GetLabel() == dpb.FieldDescriptorProto_LABEL_REPEATED && + fd.proto.GetType() == dpb.FieldDescriptorProto_TYPE_MESSAGE && + fd.GetMessageType().IsMapEntry() + return nil +} + +func (fd *FieldDescriptor) determineDefault() interface{} { + if fd.IsMap() { + return map[interface{}]interface{}(nil) + } else if fd.IsRepeated() { + return []interface{}(nil) + } else if fd.msgType != nil { + return nil + } + + proto3 := fd.file.isProto3 + if !proto3 { + def := fd.AsFieldDescriptorProto().GetDefaultValue() + if def != "" { + ret := parseDefaultValue(fd, def) + if ret != nil { + return ret + } + // if we can't parse default value, fall-through to return normal default... + } + } + + switch fd.GetType() { + case dpb.FieldDescriptorProto_TYPE_FIXED32, + dpb.FieldDescriptorProto_TYPE_UINT32: + return uint32(0) + case dpb.FieldDescriptorProto_TYPE_SFIXED32, + dpb.FieldDescriptorProto_TYPE_INT32, + dpb.FieldDescriptorProto_TYPE_SINT32: + return int32(0) + case dpb.FieldDescriptorProto_TYPE_FIXED64, + dpb.FieldDescriptorProto_TYPE_UINT64: + return uint64(0) + case dpb.FieldDescriptorProto_TYPE_SFIXED64, + dpb.FieldDescriptorProto_TYPE_INT64, + dpb.FieldDescriptorProto_TYPE_SINT64: + return int64(0) + case dpb.FieldDescriptorProto_TYPE_FLOAT: + return float32(0.0) + case dpb.FieldDescriptorProto_TYPE_DOUBLE: + return float64(0.0) + case dpb.FieldDescriptorProto_TYPE_BOOL: + return false + case dpb.FieldDescriptorProto_TYPE_BYTES: + return []byte(nil) + case dpb.FieldDescriptorProto_TYPE_STRING: + return "" + case dpb.FieldDescriptorProto_TYPE_ENUM: + if proto3 { + return int32(0) + } + enumVals := fd.GetEnumType().GetValues() + if len(enumVals) > 0 { + return enumVals[0].GetNumber() + } else { + return int32(0) // WTF? + } + default: + panic(fmt.Sprintf("Unknown field type: %v", fd.GetType())) + } +} + +func parseDefaultValue(fd *FieldDescriptor, val string) interface{} { + switch fd.GetType() { + case dpb.FieldDescriptorProto_TYPE_ENUM: + vd := fd.GetEnumType().FindValueByName(val) + if vd != nil { + return vd.GetNumber() + } + return nil + case dpb.FieldDescriptorProto_TYPE_BOOL: + if val == "true" { + return true + } else if val == "false" { + return false + } + return nil + case dpb.FieldDescriptorProto_TYPE_BYTES: + return []byte(unescape(val)) + case dpb.FieldDescriptorProto_TYPE_STRING: + return val + case dpb.FieldDescriptorProto_TYPE_FLOAT: + if f, err := strconv.ParseFloat(val, 32); err == nil { + return float32(f) + } else { + return float32(0) + } + case dpb.FieldDescriptorProto_TYPE_DOUBLE: + if f, err := strconv.ParseFloat(val, 64); err == nil { + return f + } else { + return float64(0) + } + case dpb.FieldDescriptorProto_TYPE_INT32, + dpb.FieldDescriptorProto_TYPE_SINT32, + dpb.FieldDescriptorProto_TYPE_SFIXED32: + if i, err := strconv.ParseInt(val, 10, 32); err == nil { + return int32(i) + } else { + return int32(0) + } + case dpb.FieldDescriptorProto_TYPE_UINT32, + dpb.FieldDescriptorProto_TYPE_FIXED32: + if i, err := strconv.ParseUint(val, 10, 32); err == nil { + return uint32(i) + } else { + return uint32(0) + } + case dpb.FieldDescriptorProto_TYPE_INT64, + dpb.FieldDescriptorProto_TYPE_SINT64, + dpb.FieldDescriptorProto_TYPE_SFIXED64: + if i, err := strconv.ParseInt(val, 10, 64); err == nil { + return i + } else { + return int64(0) + } + case dpb.FieldDescriptorProto_TYPE_UINT64, + dpb.FieldDescriptorProto_TYPE_FIXED64: + if i, err := strconv.ParseUint(val, 10, 64); err == nil { + return i + } else { + return uint64(0) + } + default: + return nil + } +} + +func unescape(s string) string { + // protoc encodes default values for 'bytes' fields using C escaping, + // so this function reverses that escaping + out := make([]byte, 0, len(s)) + var buf [4]byte + for len(s) > 0 { + if s[0] != '\\' || len(s) < 2 { + // not escape sequence, or too short to be well-formed escape + out = append(out, s[0]) + s = s[1:] + } else if s[1] == 'x' || s[1] == 'X' { + n := matchPrefix(s[2:], 2, isHex) + if n == 0 { + // bad escape + out = append(out, s[:2]...) + s = s[2:] + } else { + c, err := strconv.ParseUint(s[2:2+n], 16, 8) + if err != nil { + // shouldn't really happen... + out = append(out, s[:2+n]...) + } else { + out = append(out, byte(c)) + } + s = s[2+n:] + } + } else if s[1] >= '0' && s[1] <= '7' { + n := 1 + matchPrefix(s[2:], 2, isOctal) + c, err := strconv.ParseUint(s[1:1+n], 8, 8) + if err != nil || c > 0xff { + out = append(out, s[:1+n]...) + } else { + out = append(out, byte(c)) + } + s = s[1+n:] + } else if s[1] == 'u' { + if len(s) < 6 { + // bad escape + out = append(out, s...) + s = s[len(s):] + } else { + c, err := strconv.ParseUint(s[2:6], 16, 16) + if err != nil { + // bad escape + out = append(out, s[:6]...) + } else { + w := utf8.EncodeRune(buf[:], rune(c)) + out = append(out, buf[:w]...) + } + s = s[6:] + } + } else if s[1] == 'U' { + if len(s) < 10 { + // bad escape + out = append(out, s...) + s = s[len(s):] + } else { + c, err := strconv.ParseUint(s[2:10], 16, 32) + if err != nil || c > 0x10ffff { + // bad escape + out = append(out, s[:10]...) + } else { + w := utf8.EncodeRune(buf[:], rune(c)) + out = append(out, buf[:w]...) + } + s = s[10:] + } + } else { + switch s[1] { + case 'a': + out = append(out, '\a') + case 'b': + out = append(out, '\b') + case 'f': + out = append(out, '\f') + case 'n': + out = append(out, '\n') + case 'r': + out = append(out, '\r') + case 't': + out = append(out, '\t') + case 'v': + out = append(out, '\v') + case '\\': + out = append(out, '\\') + case '\'': + out = append(out, '\'') + case '"': + out = append(out, '"') + case '?': + out = append(out, '?') + default: + // invalid escape, just copy it as-is + out = append(out, s[:2]...) + } + s = s[2:] + } + } + return string(out) +} + +func isOctal(b byte) bool { return b >= '0' && b <= '7' } +func isHex(b byte) bool { + return (b >= '0' && b <= '9') || (b >= 'a' && b <= 'f') || (b >= 'A' && b <= 'F') +} +func matchPrefix(s string, limit int, fn func(byte) bool) int { + l := len(s) + if l > limit { + l = limit + } + i := 0 + for ; i < l; i++ { + if !fn(s[i]) { + return i + } + } + return i +} + +// GetName returns the name of the field. +func (fd *FieldDescriptor) GetName() string { + return fd.proto.GetName() +} + +// GetNumber returns the tag number of this field. +func (fd *FieldDescriptor) GetNumber() int32 { + return fd.proto.GetNumber() +} + +// GetFullyQualifiedName returns the fully qualified name of the field. Unlike +// GetName, this includes fully qualified name of the enclosing message for +// regular fields. +// +// For extension fields, this includes the package (if there is one) as well as +// any enclosing messages. The package and/or enclosing messages are for where +// the extension is defined, not the message it extends. +// +// If this field is part of a one-of, the fully qualified name does *not* +// include the name of the one-of, only of the enclosing message. +func (fd *FieldDescriptor) GetFullyQualifiedName() string { + return fd.fqn +} + +// GetParent returns the fields's enclosing descriptor. For normal +// (non-extension) fields, this is the enclosing message. For extensions, this +// is the descriptor in which the extension is defined, not the message that is +// extended. The parent for an extension may be a file descriptor or a message, +// depending on where the extension is defined. +func (fd *FieldDescriptor) GetParent() Descriptor { + return fd.parent +} + +// GetFile returns the descriptor for the file in which this field is defined. +func (fd *FieldDescriptor) GetFile() *FileDescriptor { + return fd.file +} + +// GetOptions returns the field's options. Most usages will be more interested +// in GetFieldOptions, which has a concrete return type. This generic version +// is present to satisfy the Descriptor interface. +func (fd *FieldDescriptor) GetOptions() proto.Message { + return fd.proto.GetOptions() +} + +// GetFieldOptions returns the field's options. +func (fd *FieldDescriptor) GetFieldOptions() *dpb.FieldOptions { + return fd.proto.GetOptions() +} + +// GetSourceInfo returns source info for the field, if present in the +// descriptor. Not all descriptors will contain source info. If non-nil, the +// returned info contains information about the location in the file where the +// field was defined and also contains comments associated with the field +// definition. +func (fd *FieldDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location { + return fd.file.sourceInfo.Get(fd.sourceInfoPath) +} + +// AsProto returns the underlying descriptor proto. Most usages will be more +// interested in AsFieldDescriptorProto, which has a concrete return type. This +// generic version is present to satisfy the Descriptor interface. +func (fd *FieldDescriptor) AsProto() proto.Message { + return fd.proto +} + +// AsFieldDescriptorProto returns the underlying descriptor proto. +func (fd *FieldDescriptor) AsFieldDescriptorProto() *dpb.FieldDescriptorProto { + return fd.proto +} + +// String returns the underlying descriptor proto, in compact text format. +func (fd *FieldDescriptor) String() string { + return fd.proto.String() +} + +// GetJSONName returns the name of the field as referenced in the message's JSON +// format. +func (fd *FieldDescriptor) GetJSONName() string { + if jsonName := fd.proto.JsonName; jsonName != nil { + // if json name is present, use its value + return *jsonName + } + // otherwise, compute the proper JSON name from the field name + return jsonCamelCase(fd.proto.GetName()) +} + +func jsonCamelCase(s string) string { + // This mirrors the implementation in protoc/C++ runtime and in the Java runtime: + // https://github.com/protocolbuffers/protobuf/blob/a104dffcb6b1958a424f5fa6f9e6bdc0ab9b6f9e/src/google/protobuf/descriptor.cc#L276 + // https://github.com/protocolbuffers/protobuf/blob/a1c886834425abb64a966231dd2c9dd84fb289b3/java/core/src/main/java/com/google/protobuf/Descriptors.java#L1286 + var buf bytes.Buffer + prevWasUnderscore := false + for _, r := range s { + if r == '_' { + prevWasUnderscore = true + continue + } + if prevWasUnderscore { + r = unicode.ToUpper(r) + prevWasUnderscore = false + } + buf.WriteRune(r) + } + return buf.String() +} + +// GetFullyQualifiedJSONName returns the JSON format name (same as GetJSONName), +// but includes the fully qualified name of the enclosing message. +// +// If the field is an extension, it will return the package name (if there is +// one) as well as the names of any enclosing messages. The package and/or +// enclosing messages are for where the extension is defined, not the message it +// extends. +func (fd *FieldDescriptor) GetFullyQualifiedJSONName() string { + parent := fd.GetParent() + switch parent := parent.(type) { + case *FileDescriptor: + pkg := parent.GetPackage() + if pkg == "" { + return fd.GetJSONName() + } + return fmt.Sprintf("%s.%s", pkg, fd.GetJSONName()) + default: + return fmt.Sprintf("%s.%s", parent.GetFullyQualifiedName(), fd.GetJSONName()) + } +} + +// GetOwner returns the message type that this field belongs to. If this is a normal +// field then this is the same as GetParent. But for extensions, this will be the +// extendee message whereas GetParent refers to where the extension was declared. +func (fd *FieldDescriptor) GetOwner() *MessageDescriptor { + return fd.owner +} + +// IsExtension returns true if this is an extension field. +func (fd *FieldDescriptor) IsExtension() bool { + return fd.proto.GetExtendee() != "" +} + +// GetOneOf returns the one-of field set to which this field belongs. If this field +// is not part of a one-of then this method returns nil. +func (fd *FieldDescriptor) GetOneOf() *OneOfDescriptor { + return fd.oneOf +} + +// GetType returns the type of this field. If the type indicates an enum, the +// enum type can be queried via GetEnumType. If the type indicates a message, the +// message type can be queried via GetMessageType. +func (fd *FieldDescriptor) GetType() dpb.FieldDescriptorProto_Type { + return fd.proto.GetType() +} + +// GetLabel returns the label for this field. The label can be required (proto2-only), +// optional (default for proto3), or required. +func (fd *FieldDescriptor) GetLabel() dpb.FieldDescriptorProto_Label { + return fd.proto.GetLabel() +} + +// IsRequired returns true if this field has the "required" label. +func (fd *FieldDescriptor) IsRequired() bool { + return fd.proto.GetLabel() == dpb.FieldDescriptorProto_LABEL_REQUIRED +} + +// IsRepeated returns true if this field has the "repeated" label. +func (fd *FieldDescriptor) IsRepeated() bool { + return fd.proto.GetLabel() == dpb.FieldDescriptorProto_LABEL_REPEATED +} + +// IsMap returns true if this is a map field. If so, it will have the "repeated" +// label its type will be a message that represents a map entry. The map entry +// message will have exactly two fields: tag #1 is the key and tag #2 is the value. +func (fd *FieldDescriptor) IsMap() bool { + return fd.isMap +} + +// GetMapKeyType returns the type of the key field if this is a map field. If it is +// not a map field, nil is returned. +func (fd *FieldDescriptor) GetMapKeyType() *FieldDescriptor { + if fd.isMap { + return fd.msgType.FindFieldByNumber(int32(1)) + } + return nil +} + +// GetMapValueType returns the type of the value field if this is a map field. If it +// is not a map field, nil is returned. +func (fd *FieldDescriptor) GetMapValueType() *FieldDescriptor { + if fd.isMap { + return fd.msgType.FindFieldByNumber(int32(2)) + } + return nil +} + +// GetMessageType returns the type of this field if it is a message type. If +// this field is not a message type, it returns nil. +func (fd *FieldDescriptor) GetMessageType() *MessageDescriptor { + return fd.msgType +} + +// GetEnumType returns the type of this field if it is an enum type. If this +// field is not an enum type, it returns nil. +func (fd *FieldDescriptor) GetEnumType() *EnumDescriptor { + return fd.enumType +} + +// GetDefaultValue returns the default value for this field. +// +// If this field represents a message type, this method always returns nil (even though +// for proto2 files, the default value should be a default instance of the message type). +// If the field represents an enum type, this method returns an int32 corresponding to the +// enum value. If this field is a map, it returns a nil map[interface{}]interface{}. If +// this field is repeated (and not a map), it returns a nil []interface{}. +// +// Otherwise, it returns the declared default value for the field or a zero value, if no +// default is declared or if the file is proto3. The type of said return value corresponds +// to the type of the field: +// +-------------------------+-----------+ +// | Declared Type | Go Type | +// +-------------------------+-----------+ +// | int32, sint32, sfixed32 | int32 | +// | int64, sint64, sfixed64 | int64 | +// | uint32, fixed32 | uint32 | +// | uint64, fixed64 | uint64 | +// | float | float32 | +// | double | double32 | +// | bool | bool | +// | string | string | +// | bytes | []byte | +// +-------------------------+-----------+ +func (fd *FieldDescriptor) GetDefaultValue() interface{} { + return fd.getDefaultValue() +} + +// EnumDescriptor describes an enum declared in a proto file. +type EnumDescriptor struct { + proto *dpb.EnumDescriptorProto + parent Descriptor + file *FileDescriptor + values []*EnumValueDescriptor + valuesByNum sortedValues + fqn string + sourceInfoPath []int32 +} + +func createEnumDescriptor(fd *FileDescriptor, parent Descriptor, enclosing string, ed *dpb.EnumDescriptorProto, symbols map[string]Descriptor) (*EnumDescriptor, string) { + enumName := merge(enclosing, ed.GetName()) + ret := &EnumDescriptor{proto: ed, parent: parent, file: fd, fqn: enumName} + for _, ev := range ed.GetValue() { + evd, n := createEnumValueDescriptor(fd, ret, enumName, ev) + symbols[n] = evd + ret.values = append(ret.values, evd) + } + if len(ret.values) > 0 { + ret.valuesByNum = make(sortedValues, len(ret.values)) + copy(ret.valuesByNum, ret.values) + sort.Stable(ret.valuesByNum) + } + return ret, enumName +} + +type sortedValues []*EnumValueDescriptor + +func (sv sortedValues) Len() int { + return len(sv) +} + +func (sv sortedValues) Less(i, j int) bool { + return sv[i].GetNumber() < sv[j].GetNumber() +} + +func (sv sortedValues) Swap(i, j int) { + sv[i], sv[j] = sv[j], sv[i] +} + +func (ed *EnumDescriptor) resolve(path []int32) { + ed.sourceInfoPath = append([]int32(nil), path...) // defensive copy + path = append(path, internal.Enum_valuesTag) + for i, evd := range ed.values { + evd.resolve(append(path, int32(i))) + } +} + +// GetName returns the simple (unqualified) name of the enum type. +func (ed *EnumDescriptor) GetName() string { + return ed.proto.GetName() +} + +// GetFullyQualifiedName returns the fully qualified name of the enum type. +// This includes the package name (if there is one) as well as the names of any +// enclosing messages. +func (ed *EnumDescriptor) GetFullyQualifiedName() string { + return ed.fqn +} + +// GetParent returns the enum type's enclosing descriptor. For top-level enums, +// this will be a file descriptor. Otherwise it will be the descriptor for the +// enclosing message. +func (ed *EnumDescriptor) GetParent() Descriptor { + return ed.parent +} + +// GetFile returns the descriptor for the file in which this enum is defined. +func (ed *EnumDescriptor) GetFile() *FileDescriptor { + return ed.file +} + +// GetOptions returns the enum type's options. Most usages will be more +// interested in GetEnumOptions, which has a concrete return type. This generic +// version is present to satisfy the Descriptor interface. +func (ed *EnumDescriptor) GetOptions() proto.Message { + return ed.proto.GetOptions() +} + +// GetEnumOptions returns the enum type's options. +func (ed *EnumDescriptor) GetEnumOptions() *dpb.EnumOptions { + return ed.proto.GetOptions() +} + +// GetSourceInfo returns source info for the enum type, if present in the +// descriptor. Not all descriptors will contain source info. If non-nil, the +// returned info contains information about the location in the file where the +// enum type was defined and also contains comments associated with the enum +// definition. +func (ed *EnumDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location { + return ed.file.sourceInfo.Get(ed.sourceInfoPath) +} + +// AsProto returns the underlying descriptor proto. Most usages will be more +// interested in AsEnumDescriptorProto, which has a concrete return type. This +// generic version is present to satisfy the Descriptor interface. +func (ed *EnumDescriptor) AsProto() proto.Message { + return ed.proto +} + +// AsEnumDescriptorProto returns the underlying descriptor proto. +func (ed *EnumDescriptor) AsEnumDescriptorProto() *dpb.EnumDescriptorProto { + return ed.proto +} + +// String returns the underlying descriptor proto, in compact text format. +func (ed *EnumDescriptor) String() string { + return ed.proto.String() +} + +// GetValues returns all of the allowed values defined for this enum. +func (ed *EnumDescriptor) GetValues() []*EnumValueDescriptor { + return ed.values +} + +// FindValueByName finds the enum value with the given name. If no such value exists +// then nil is returned. +func (ed *EnumDescriptor) FindValueByName(name string) *EnumValueDescriptor { + fqn := fmt.Sprintf("%s.%s", ed.fqn, name) + if vd, ok := ed.file.symbols[fqn].(*EnumValueDescriptor); ok { + return vd + } else { + return nil + } +} + +// FindValueByNumber finds the value with the given numeric value. If no such value +// exists then nil is returned. If aliases are allowed and multiple values have the +// given number, the first declared value is returned. +func (ed *EnumDescriptor) FindValueByNumber(num int32) *EnumValueDescriptor { + index := sort.Search(len(ed.valuesByNum), func(i int) bool { return ed.valuesByNum[i].GetNumber() >= num }) + if index < len(ed.valuesByNum) { + vd := ed.valuesByNum[index] + if vd.GetNumber() == num { + return vd + } + } + return nil +} + +// EnumValueDescriptor describes an allowed value of an enum declared in a proto file. +type EnumValueDescriptor struct { + proto *dpb.EnumValueDescriptorProto + parent *EnumDescriptor + file *FileDescriptor + fqn string + sourceInfoPath []int32 +} + +func createEnumValueDescriptor(fd *FileDescriptor, parent *EnumDescriptor, enclosing string, evd *dpb.EnumValueDescriptorProto) (*EnumValueDescriptor, string) { + valName := merge(enclosing, evd.GetName()) + return &EnumValueDescriptor{proto: evd, parent: parent, file: fd, fqn: valName}, valName +} + +func (vd *EnumValueDescriptor) resolve(path []int32) { + vd.sourceInfoPath = append([]int32(nil), path...) // defensive copy +} + +// GetName returns the name of the enum value. +func (vd *EnumValueDescriptor) GetName() string { + return vd.proto.GetName() +} + +// GetNumber returns the numeric value associated with this enum value. +func (vd *EnumValueDescriptor) GetNumber() int32 { + return vd.proto.GetNumber() +} + +// GetFullyQualifiedName returns the fully qualified name of the enum value. +// Unlike GetName, this includes fully qualified name of the enclosing enum. +func (vd *EnumValueDescriptor) GetFullyQualifiedName() string { + return vd.fqn +} + +// GetParent returns the descriptor for the enum in which this enum value is +// defined. Most usages will prefer to use GetEnum, which has a concrete return +// type. This more generic method is present to satisfy the Descriptor interface. +func (vd *EnumValueDescriptor) GetParent() Descriptor { + return vd.parent +} + +// GetEnum returns the enum in which this enum value is defined. +func (vd *EnumValueDescriptor) GetEnum() *EnumDescriptor { + return vd.parent +} + +// GetFile returns the descriptor for the file in which this enum value is +// defined. +func (vd *EnumValueDescriptor) GetFile() *FileDescriptor { + return vd.file +} + +// GetOptions returns the enum value's options. Most usages will be more +// interested in GetEnumValueOptions, which has a concrete return type. This +// generic version is present to satisfy the Descriptor interface. +func (vd *EnumValueDescriptor) GetOptions() proto.Message { + return vd.proto.GetOptions() +} + +// GetEnumValueOptions returns the enum value's options. +func (vd *EnumValueDescriptor) GetEnumValueOptions() *dpb.EnumValueOptions { + return vd.proto.GetOptions() +} + +// GetSourceInfo returns source info for the enum value, if present in the +// descriptor. Not all descriptors will contain source info. If non-nil, the +// returned info contains information about the location in the file where the +// enum value was defined and also contains comments associated with the enum +// value definition. +func (vd *EnumValueDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location { + return vd.file.sourceInfo.Get(vd.sourceInfoPath) +} + +// AsProto returns the underlying descriptor proto. Most usages will be more +// interested in AsEnumValueDescriptorProto, which has a concrete return type. +// This generic version is present to satisfy the Descriptor interface. +func (vd *EnumValueDescriptor) AsProto() proto.Message { + return vd.proto +} + +// AsEnumValueDescriptorProto returns the underlying descriptor proto. +func (vd *EnumValueDescriptor) AsEnumValueDescriptorProto() *dpb.EnumValueDescriptorProto { + return vd.proto +} + +// String returns the underlying descriptor proto, in compact text format. +func (vd *EnumValueDescriptor) String() string { + return vd.proto.String() +} + +// ServiceDescriptor describes an RPC service declared in a proto file. +type ServiceDescriptor struct { + proto *dpb.ServiceDescriptorProto + file *FileDescriptor + methods []*MethodDescriptor + fqn string + sourceInfoPath []int32 +} + +func createServiceDescriptor(fd *FileDescriptor, enclosing string, sd *dpb.ServiceDescriptorProto, symbols map[string]Descriptor) (*ServiceDescriptor, string) { + serviceName := merge(enclosing, sd.GetName()) + ret := &ServiceDescriptor{proto: sd, file: fd, fqn: serviceName} + for _, m := range sd.GetMethod() { + md, n := createMethodDescriptor(fd, ret, serviceName, m) + symbols[n] = md + ret.methods = append(ret.methods, md) + } + return ret, serviceName +} + +func (sd *ServiceDescriptor) resolve(path []int32, scopes []scope) error { + sd.sourceInfoPath = append([]int32(nil), path...) // defensive copy + path = append(path, internal.Service_methodsTag) + for i, md := range sd.methods { + if err := md.resolve(append(path, int32(i)), scopes); err != nil { + return err + } + } + return nil +} + +// GetName returns the simple (unqualified) name of the service. +func (sd *ServiceDescriptor) GetName() string { + return sd.proto.GetName() +} + +// GetFullyQualifiedName returns the fully qualified name of the service. This +// includes the package name (if there is one). +func (sd *ServiceDescriptor) GetFullyQualifiedName() string { + return sd.fqn +} + +// GetParent returns the descriptor for the file in which this service is +// defined. Most usages will prefer to use GetFile, which has a concrete return +// type. This more generic method is present to satisfy the Descriptor interface. +func (sd *ServiceDescriptor) GetParent() Descriptor { + return sd.file +} + +// GetFile returns the descriptor for the file in which this service is defined. +func (sd *ServiceDescriptor) GetFile() *FileDescriptor { + return sd.file +} + +// GetOptions returns the service's options. Most usages will be more interested +// in GetServiceOptions, which has a concrete return type. This generic version +// is present to satisfy the Descriptor interface. +func (sd *ServiceDescriptor) GetOptions() proto.Message { + return sd.proto.GetOptions() +} + +// GetServiceOptions returns the service's options. +func (sd *ServiceDescriptor) GetServiceOptions() *dpb.ServiceOptions { + return sd.proto.GetOptions() +} + +// GetSourceInfo returns source info for the service, if present in the +// descriptor. Not all descriptors will contain source info. If non-nil, the +// returned info contains information about the location in the file where the +// service was defined and also contains comments associated with the service +// definition. +func (sd *ServiceDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location { + return sd.file.sourceInfo.Get(sd.sourceInfoPath) +} + +// AsProto returns the underlying descriptor proto. Most usages will be more +// interested in AsServiceDescriptorProto, which has a concrete return type. +// This generic version is present to satisfy the Descriptor interface. +func (sd *ServiceDescriptor) AsProto() proto.Message { + return sd.proto +} + +// AsServiceDescriptorProto returns the underlying descriptor proto. +func (sd *ServiceDescriptor) AsServiceDescriptorProto() *dpb.ServiceDescriptorProto { + return sd.proto +} + +// String returns the underlying descriptor proto, in compact text format. +func (sd *ServiceDescriptor) String() string { + return sd.proto.String() +} + +// GetMethods returns all of the RPC methods for this service. +func (sd *ServiceDescriptor) GetMethods() []*MethodDescriptor { + return sd.methods +} + +// FindMethodByName finds the method with the given name. If no such method exists +// then nil is returned. +func (sd *ServiceDescriptor) FindMethodByName(name string) *MethodDescriptor { + fqn := fmt.Sprintf("%s.%s", sd.fqn, name) + if md, ok := sd.file.symbols[fqn].(*MethodDescriptor); ok { + return md + } else { + return nil + } +} + +// MethodDescriptor describes an RPC method declared in a proto file. +type MethodDescriptor struct { + proto *dpb.MethodDescriptorProto + parent *ServiceDescriptor + file *FileDescriptor + inType *MessageDescriptor + outType *MessageDescriptor + fqn string + sourceInfoPath []int32 +} + +func createMethodDescriptor(fd *FileDescriptor, parent *ServiceDescriptor, enclosing string, md *dpb.MethodDescriptorProto) (*MethodDescriptor, string) { + // request and response types get resolved later + methodName := merge(enclosing, md.GetName()) + return &MethodDescriptor{proto: md, parent: parent, file: fd, fqn: methodName}, methodName +} + +func (md *MethodDescriptor) resolve(path []int32, scopes []scope) error { + md.sourceInfoPath = append([]int32(nil), path...) // defensive copy + if desc, err := resolve(md.file, md.proto.GetInputType(), scopes); err != nil { + return err + } else { + md.inType = desc.(*MessageDescriptor) + } + if desc, err := resolve(md.file, md.proto.GetOutputType(), scopes); err != nil { + return err + } else { + md.outType = desc.(*MessageDescriptor) + } + return nil +} + +// GetName returns the name of the method. +func (md *MethodDescriptor) GetName() string { + return md.proto.GetName() +} + +// GetFullyQualifiedName returns the fully qualified name of the method. Unlike +// GetName, this includes fully qualified name of the enclosing service. +func (md *MethodDescriptor) GetFullyQualifiedName() string { + return md.fqn +} + +// GetParent returns the descriptor for the service in which this method is +// defined. Most usages will prefer to use GetService, which has a concrete +// return type. This more generic method is present to satisfy the Descriptor +// interface. +func (md *MethodDescriptor) GetParent() Descriptor { + return md.parent +} + +// GetService returns the RPC service in which this method is declared. +func (md *MethodDescriptor) GetService() *ServiceDescriptor { + return md.parent +} + +// GetFile returns the descriptor for the file in which this method is defined. +func (md *MethodDescriptor) GetFile() *FileDescriptor { + return md.file +} + +// GetOptions returns the method's options. Most usages will be more interested +// in GetMethodOptions, which has a concrete return type. This generic version +// is present to satisfy the Descriptor interface. +func (md *MethodDescriptor) GetOptions() proto.Message { + return md.proto.GetOptions() +} + +// GetMethodOptions returns the method's options. +func (md *MethodDescriptor) GetMethodOptions() *dpb.MethodOptions { + return md.proto.GetOptions() +} + +// GetSourceInfo returns source info for the method, if present in the +// descriptor. Not all descriptors will contain source info. If non-nil, the +// returned info contains information about the location in the file where the +// method was defined and also contains comments associated with the method +// definition. +func (md *MethodDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location { + return md.file.sourceInfo.Get(md.sourceInfoPath) +} + +// AsProto returns the underlying descriptor proto. Most usages will be more +// interested in AsMethodDescriptorProto, which has a concrete return type. This +// generic version is present to satisfy the Descriptor interface. +func (md *MethodDescriptor) AsProto() proto.Message { + return md.proto +} + +// AsMethodDescriptorProto returns the underlying descriptor proto. +func (md *MethodDescriptor) AsMethodDescriptorProto() *dpb.MethodDescriptorProto { + return md.proto +} + +// String returns the underlying descriptor proto, in compact text format. +func (md *MethodDescriptor) String() string { + return md.proto.String() +} + +// IsServerStreaming returns true if this is a server-streaming method. +func (md *MethodDescriptor) IsServerStreaming() bool { + return md.proto.GetServerStreaming() +} + +// IsClientStreaming returns true if this is a client-streaming method. +func (md *MethodDescriptor) IsClientStreaming() bool { + return md.proto.GetClientStreaming() +} + +// GetInputType returns the input type, or request type, of the RPC method. +func (md *MethodDescriptor) GetInputType() *MessageDescriptor { + return md.inType +} + +// GetOutputType returns the output type, or response type, of the RPC method. +func (md *MethodDescriptor) GetOutputType() *MessageDescriptor { + return md.outType +} + +// OneOfDescriptor describes a one-of field set declared in a protocol buffer message. +type OneOfDescriptor struct { + proto *dpb.OneofDescriptorProto + parent *MessageDescriptor + file *FileDescriptor + choices []*FieldDescriptor + fqn string + sourceInfoPath []int32 +} + +func createOneOfDescriptor(fd *FileDescriptor, parent *MessageDescriptor, index int, enclosing string, od *dpb.OneofDescriptorProto) (*OneOfDescriptor, string) { + oneOfName := merge(enclosing, od.GetName()) + ret := &OneOfDescriptor{proto: od, parent: parent, file: fd, fqn: oneOfName} + for _, f := range parent.fields { + oi := f.proto.OneofIndex + if oi != nil && *oi == int32(index) { + f.oneOf = ret + ret.choices = append(ret.choices, f) + } + } + return ret, oneOfName +} + +func (od *OneOfDescriptor) resolve(path []int32) { + od.sourceInfoPath = append([]int32(nil), path...) // defensive copy +} + +// GetName returns the name of the one-of. +func (od *OneOfDescriptor) GetName() string { + return od.proto.GetName() +} + +// GetFullyQualifiedName returns the fully qualified name of the one-of. Unlike +// GetName, this includes fully qualified name of the enclosing message. +func (od *OneOfDescriptor) GetFullyQualifiedName() string { + return od.fqn +} + +// GetParent returns the descriptor for the message in which this one-of is +// defined. Most usages will prefer to use GetOwner, which has a concrete +// return type. This more generic method is present to satisfy the Descriptor +// interface. +func (od *OneOfDescriptor) GetParent() Descriptor { + return od.parent +} + +// GetOwner returns the message to which this one-of field set belongs. +func (od *OneOfDescriptor) GetOwner() *MessageDescriptor { + return od.parent +} + +// GetFile returns the descriptor for the file in which this one-fof is defined. +func (od *OneOfDescriptor) GetFile() *FileDescriptor { + return od.file +} + +// GetOptions returns the one-of's options. Most usages will be more interested +// in GetOneOfOptions, which has a concrete return type. This generic version +// is present to satisfy the Descriptor interface. +func (od *OneOfDescriptor) GetOptions() proto.Message { + return od.proto.GetOptions() +} + +// GetOneOfOptions returns the one-of's options. +func (od *OneOfDescriptor) GetOneOfOptions() *dpb.OneofOptions { + return od.proto.GetOptions() +} + +// GetSourceInfo returns source info for the one-of, if present in the +// descriptor. Not all descriptors will contain source info. If non-nil, the +// returned info contains information about the location in the file where the +// one-of was defined and also contains comments associated with the one-of +// definition. +func (od *OneOfDescriptor) GetSourceInfo() *dpb.SourceCodeInfo_Location { + return od.file.sourceInfo.Get(od.sourceInfoPath) +} + +// AsProto returns the underlying descriptor proto. Most usages will be more +// interested in AsOneofDescriptorProto, which has a concrete return type. This +// generic version is present to satisfy the Descriptor interface. +func (od *OneOfDescriptor) AsProto() proto.Message { + return od.proto +} + +// AsOneofDescriptorProto returns the underlying descriptor proto. +func (od *OneOfDescriptor) AsOneofDescriptorProto() *dpb.OneofDescriptorProto { + return od.proto +} + +// String returns the underlying descriptor proto, in compact text format. +func (od *OneOfDescriptor) String() string { + return od.proto.String() +} + +// GetChoices returns the fields that are part of the one-of field set. At most one of +// these fields may be set for a given message. +func (od *OneOfDescriptor) GetChoices() []*FieldDescriptor { + return od.choices +} + +// scope represents a lexical scope in a proto file in which messages and enums +// can be declared. +type scope func(string) Descriptor + +func fileScope(fd *FileDescriptor) scope { + // we search symbols in this file, but also symbols in other files that have + // the same package as this file or a "parent" package (in protobuf, + // packages are a hierarchy like C++ namespaces) + prefixes := internal.CreatePrefixList(fd.proto.GetPackage()) + return func(name string) Descriptor { + for _, prefix := range prefixes { + n := merge(prefix, name) + d := findSymbol(fd, n, false) + if d != nil { + return d + } + } + return nil + } +} + +func messageScope(md *MessageDescriptor) scope { + return func(name string) Descriptor { + n := merge(md.fqn, name) + if d, ok := md.file.symbols[n]; ok { + return d + } + return nil + } +} + +func resolve(fd *FileDescriptor, name string, scopes []scope) (Descriptor, error) { + if strings.HasPrefix(name, ".") { + // already fully-qualified + d := findSymbol(fd, name[1:], false) + if d != nil { + return d, nil + } + } else { + // unqualified, so we look in the enclosing (last) scope first and move + // towards outermost (first) scope, trying to resolve the symbol + for i := len(scopes) - 1; i >= 0; i-- { + d := scopes[i](name) + if d != nil { + return d, nil + } + } + } + return nil, fmt.Errorf("file %q included an unresolvable reference to %q", fd.proto.GetName(), name) +} + +func findSymbol(fd *FileDescriptor, name string, public bool) Descriptor { + d := fd.symbols[name] + if d != nil { + return d + } + + // When public = false, we are searching only directly imported symbols. But we + // also need to search transitive public imports due to semantics of public imports. + var deps []*FileDescriptor + if public { + deps = fd.publicDeps + } else { + deps = fd.deps + } + for _, dep := range deps { + d = findSymbol(dep, name, true) + if d != nil { + return d + } + } + + return nil +} + +func merge(a, b string) string { + if a == "" { + return b + } else { + return a + "." + b + } +} diff --git a/vendor/github.com/jhump/protoreflect/desc/descriptor_no_unsafe.go b/vendor/github.com/jhump/protoreflect/desc/descriptor_no_unsafe.go new file mode 100644 index 00000000..6b48865a --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/descriptor_no_unsafe.go @@ -0,0 +1,28 @@ +//+build appengine gopherjs purego +// NB: other environments where unsafe is unappropriate should use "purego" build tag +// https://github.com/golang/go/issues/23172 + +package desc + +type jsonNameMap struct{} +type memoizedDefault struct{} + +// FindFieldByJSONName finds the field with the given JSON field name. If no such +// field exists then nil is returned. Only regular fields are returned, not +// extensions. +func (md *MessageDescriptor) FindFieldByJSONName(jsonName string) *FieldDescriptor { + // NB: With allowed use of unsafe, we use it to atomically define an index + // via atomic.LoadPointer/atomic.StorePointer. Without it, we skip the index + // and must do a linear scan of fields each time. + for _, f := range md.fields { + jn := f.GetJSONName() + if jn == jsonName { + return f + } + } + return nil +} + +func (fd *FieldDescriptor) getDefaultValue() interface{} { + return fd.determineDefault() +} diff --git a/vendor/github.com/jhump/protoreflect/desc/descriptor_unsafe.go b/vendor/github.com/jhump/protoreflect/desc/descriptor_unsafe.go new file mode 100644 index 00000000..52370d84 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/descriptor_unsafe.go @@ -0,0 +1,57 @@ +//+build !appengine,!gopherjs,!purego +// NB: other environments where unsafe is unappropriate should use "purego" build tag +// https://github.com/golang/go/issues/23172 + +package desc + +import ( + "sync/atomic" + "unsafe" +) + +type jsonNameMap map[string]*FieldDescriptor // loaded/stored atomically via atomic+unsafe +type memoizedDefault *interface{} // loaded/stored atomically via atomic+unsafe + +// FindFieldByJSONName finds the field with the given JSON field name. If no such +// field exists then nil is returned. Only regular fields are returned, not +// extensions. +func (md *MessageDescriptor) FindFieldByJSONName(jsonName string) *FieldDescriptor { + // NB: We don't want to eagerly index JSON names because many programs won't use it. + // So we want to do it lazily, but also make sure the result is thread-safe. So we + // atomically load/store the map as if it were a normal pointer. We don't use other + // mechanisms -- like sync.Mutex, sync.RWMutex, sync.Once, or atomic.Value -- to + // do this lazily because those types cannot be copied, and we'd rather not induce + // 'go vet' errors in programs that use descriptors and try to copy them. + // If multiple goroutines try to access the index at the same time, before it is + // built, they will all end up computing the index redundantly. Future reads of + // the index will use whatever was the "last one stored" by those racing goroutines. + // Since building the index is deterministic, this is fine: all indices computed + // will be the same. + addrOfJsonNames := (*unsafe.Pointer)(unsafe.Pointer(&md.jsonNames)) + jsonNames := atomic.LoadPointer(addrOfJsonNames) + var index map[string]*FieldDescriptor + if jsonNames == nil { + // slow path: compute the index + index = map[string]*FieldDescriptor{} + for _, f := range md.fields { + jn := f.GetJSONName() + index[jn] = f + } + atomic.StorePointer(addrOfJsonNames, *(*unsafe.Pointer)(unsafe.Pointer(&index))) + } else { + *(*unsafe.Pointer)(unsafe.Pointer(&index)) = jsonNames + } + return index[jsonName] +} + +func (fd *FieldDescriptor) getDefaultValue() interface{} { + addrOfDef := (*unsafe.Pointer)(unsafe.Pointer(&fd.def)) + def := atomic.LoadPointer(addrOfDef) + if def != nil { + return *(*interface{})(def) + } + // slow path: compute the default, potentially involves decoding value + d := fd.determineDefault() + atomic.StorePointer(addrOfDef, (unsafe.Pointer(&d))) + return d +} diff --git a/vendor/github.com/jhump/protoreflect/desc/doc.go b/vendor/github.com/jhump/protoreflect/desc/doc.go new file mode 100644 index 00000000..1740dce7 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/doc.go @@ -0,0 +1,41 @@ +// Package desc contains "rich descriptors" for protocol buffers. The built-in +// descriptor types are simple protobuf messages, each one representing a +// different kind of element in the AST of a .proto source file. +// +// Because of this inherent "tree" quality, these build-in descriptors cannot +// refer to their enclosing file descriptor. Nor can a field descriptor refer to +// a message or enum descriptor that represents the field's type (for enum and +// nested message fields). All such links must instead be stringly typed. This +// limitation makes them much harder to use for doing interesting things with +// reflection. +// +// Without this package, resolving references to types is particularly complex. +// For example, resolving a field's type, the message type an extension extends, +// or the request and response types of an RPC method all require searching +// through symbols defined not only in the file in which these elements are +// declared but also in its transitive closure of dependencies. +// +// "Rich descriptors" avoid the need to deal with the complexities described +// above. A rich descriptor has all type references resolved and provides +// methods to access other rich descriptors for all referenced elements. Each +// rich descriptor has a usefully broad API, but does not try to mimic the full +// interface of the underlying descriptor proto. Instead, every rich descriptor +// provides access to that underlying proto, for extracting descriptor +// properties that are not immediately accessible through rich descriptor's +// methods. +// +// Rich descriptors can be accessed in similar ways as their "poor" cousins +// (descriptor protos). Instead of using proto.FileDescriptor, use +// desc.LoadFileDescriptor. Message descriptors and extension field descriptors +// can also be easily accessed using desc.LoadMessageDescriptor and +// desc.LoadFieldDescriptorForExtension, respectively. +// +// It is also possible create rich descriptors for proto messages that a given +// Go program doesn't even know about. For example, they could be loaded from a +// FileDescriptorSet file (which can be generated by protoc) or loaded from a +// server. This enables interesting things like dynamic clients: where a Go +// program can be an RPC client of a service it wasn't compiled to know about. +// +// Also see the grpcreflect, dynamic, and grpcdynamic packages in this same +// repo to see just how useful rich descriptors really are. +package desc diff --git a/vendor/github.com/jhump/protoreflect/desc/imports.go b/vendor/github.com/jhump/protoreflect/desc/imports.go new file mode 100644 index 00000000..ab93032d --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/imports.go @@ -0,0 +1,313 @@ +package desc + +import ( + "fmt" + "path/filepath" + "reflect" + "strings" + "sync" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +var ( + globalImportPathConf map[string]string + globalImportPathMu sync.RWMutex +) + +// RegisterImportPath registers an alternate import path for a given registered +// proto file path. For more details on why alternate import paths may need to +// be configured, see ImportResolver. +// +// This method panics if provided invalid input. An empty importPath is invalid. +// An un-registered registerPath is also invalid. For example, if an attempt is +// made to register the import path "foo/bar.proto" as "bar.proto", but there is +// no "bar.proto" registered in the Go protobuf runtime, this method will panic. +// This method also panics if an attempt is made to register the same import +// path more than once. +// +// This function works globally, applying to all descriptors loaded by this +// package. If you instead want more granular support for handling alternate +// import paths -- such as for a single invocation of a function in this +// package or when the alternate path is only used from one file (so you don't +// want the alternate path used when loading every other file), use an +// ImportResolver instead. +func RegisterImportPath(registerPath, importPath string) { + if len(importPath) == 0 { + panic("import path cannot be empty") + } + desc := proto.FileDescriptor(registerPath) + if len(desc) == 0 { + panic(fmt.Sprintf("path %q is not a registered proto file", registerPath)) + } + globalImportPathMu.Lock() + defer globalImportPathMu.Unlock() + if reg := globalImportPathConf[importPath]; reg != "" { + panic(fmt.Sprintf("import path %q already registered for %s", importPath, reg)) + } + if globalImportPathConf == nil { + globalImportPathConf = map[string]string{} + } + globalImportPathConf[importPath] = registerPath +} + +// ResolveImport resolves the given import path. If it has been registered as an +// alternate via RegisterImportPath, the registered path is returned. Otherwise, +// the given import path is returned unchanged. +func ResolveImport(importPath string) string { + importPath = clean(importPath) + globalImportPathMu.RLock() + defer globalImportPathMu.RUnlock() + reg := globalImportPathConf[importPath] + if reg == "" { + return importPath + } + return reg +} + +// ImportResolver lets you work-around linking issues that are caused by +// mismatches between how a particular proto source file is registered in the Go +// protobuf runtime and how that same file is imported by other files. The file +// is registered using the same relative path given to protoc when the file is +// compiled (i.e. when Go code is generated). So if any file tries to import +// that source file, but using a different relative path, then a link error will +// occur when this package tries to load a descriptor for the importing file. +// +// For example, let's say we have two proto source files: "foo/bar.proto" and +// "fubar/baz.proto". The latter imports the former using a line like so: +// import "foo/bar.proto"; +// However, when protoc is invoked, the command-line args looks like so: +// protoc -Ifoo/ --go_out=foo/ bar.proto +// protoc -I./ -Ifubar/ --go_out=fubar/ baz.proto +// Because the path given to protoc is just "bar.proto" and "baz.proto", this is +// how they are registered in the Go protobuf runtime. So, when loading the +// descriptor for "fubar/baz.proto", we'll see an import path of "foo/bar.proto" +// but will find no file registered with that path: +// fd, err := desc.LoadFileDescriptor("baz.proto") +// // err will be non-nil, complaining that there is no such file +// // found named "foo/bar.proto" +// +// This can be remedied by registering alternate import paths using an +// ImportResolver. Continuing with the example above, the code below would fix +// any link issue: +// var r desc.ImportResolver +// r.RegisterImportPath("bar.proto", "foo/bar.proto") +// fd, err := r.LoadFileDescriptor("baz.proto") +// // err will be nil; descriptor successfully loaded! +// +// If there are files that are *always* imported using a different relative +// path then how they are registered, consider using the global +// RegisterImportPath function, so you don't have to use an ImportResolver for +// every file that imports it. +type ImportResolver struct { + children map[string]*ImportResolver + importPaths map[string]string + + // By default, an ImportResolver will fallback to consulting any paths + // registered via the top-level RegisterImportPath function. Setting this + // field to true will cause the ImportResolver to skip that fallback and + // only examine its own locally registered paths. + SkipFallbackRules bool +} + +// ResolveImport resolves the given import path in the context of the given +// source file. If a matching alternate has been registered with this resolver +// via a call to RegisterImportPath or RegisterImportPathFrom, then the +// registered path is returned. Otherwise, the given import path is returned +// unchanged. +func (r *ImportResolver) ResolveImport(source, importPath string) string { + if r != nil { + res := r.resolveImport(clean(source), clean(importPath)) + if res != "" { + return res + } + if r.SkipFallbackRules { + return importPath + } + } + return ResolveImport(importPath) +} + +func (r *ImportResolver) resolveImport(source, importPath string) string { + if source == "" { + return r.importPaths[importPath] + } + var car, cdr string + idx := strings.IndexRune(source, filepath.Separator) + if idx < 0 { + car, cdr = source, "" + } else { + car, cdr = source[:idx], source[idx+1:] + } + ch := r.children[car] + if ch != nil { + if reg := ch.resolveImport(cdr, importPath); reg != "" { + return reg + } + } + return r.importPaths[importPath] +} + +// RegisterImportPath registers an alternate import path for a given registered +// proto file path with this resolver. Any appearance of the given import path +// when linking files will instead try to link the given registered path. If the +// registered path cannot be located, then linking will fallback to the actual +// imported path. +// +// This method will panic if given an empty path or if the same import path is +// registered more than once. +// +// To constrain the contexts where the given import path is to be re-written, +// use RegisterImportPathFrom instead. +func (r *ImportResolver) RegisterImportPath(registerPath, importPath string) { + r.RegisterImportPathFrom(registerPath, importPath, "") +} + +// RegisterImportPathFrom registers an alternate import path for a given +// registered proto file path with this resolver, but only for imports in the +// specified source context. +// +// The source context can be the name of a folder or a proto source file. Any +// appearance of the given import path in that context will instead try to link +// the given registered path. To be in context, the file that is being linked +// (i.e. the one whose import statement is being resolved) must be the same +// relative path of the source context or be a sub-path (i.e. a descendant of +// the source folder). +// +// If the registered path cannot be located, then linking will fallback to the +// actual imported path. +// +// This method will panic if given an empty path. The source context, on the +// other hand, is allowed to be blank. A blank source matches all files. This +// method also panics if the same import path is registered in the same source +// context more than once. +func (r *ImportResolver) RegisterImportPathFrom(registerPath, importPath, source string) { + importPath = clean(importPath) + if len(importPath) == 0 { + panic("import path cannot be empty") + } + registerPath = clean(registerPath) + if len(registerPath) == 0 { + panic("registered path cannot be empty") + } + r.registerImportPathFrom(registerPath, importPath, clean(source)) +} + +func (r *ImportResolver) registerImportPathFrom(registerPath, importPath, source string) { + if source == "" { + if r.importPaths == nil { + r.importPaths = map[string]string{} + } else if reg := r.importPaths[importPath]; reg != "" { + panic(fmt.Sprintf("already registered import path %q as %q", importPath, registerPath)) + } + r.importPaths[importPath] = registerPath + return + } + var car, cdr string + idx := strings.IndexRune(source, filepath.Separator) + if idx < 0 { + car, cdr = source, "" + } else { + car, cdr = source[:idx], source[idx+1:] + } + ch := r.children[car] + if ch == nil { + if r.children == nil { + r.children = map[string]*ImportResolver{} + } + ch = &ImportResolver{} + r.children[car] = ch + } + ch.registerImportPathFrom(registerPath, importPath, cdr) +} + +// LoadFileDescriptor is the same as the package function of the same name, but +// any alternate paths configured in this resolver are used when linking the +// given descriptor proto. +func (r *ImportResolver) LoadFileDescriptor(filePath string) (*FileDescriptor, error) { + return loadFileDescriptor(filePath, r) +} + +// LoadMessageDescriptor is the same as the package function of the same name, +// but any alternate paths configured in this resolver are used when linking +// files for the returned descriptor. +func (r *ImportResolver) LoadMessageDescriptor(msgName string) (*MessageDescriptor, error) { + return loadMessageDescriptor(msgName, r) +} + +// LoadMessageDescriptorForMessage is the same as the package function of the +// same name, but any alternate paths configured in this resolver are used when +// linking files for the returned descriptor. +func (r *ImportResolver) LoadMessageDescriptorForMessage(msg proto.Message) (*MessageDescriptor, error) { + return loadMessageDescriptorForMessage(msg, r) +} + +// LoadMessageDescriptorForType is the same as the package function of the same +// name, but any alternate paths configured in this resolver are used when +// linking files for the returned descriptor. +func (r *ImportResolver) LoadMessageDescriptorForType(msgType reflect.Type) (*MessageDescriptor, error) { + return loadMessageDescriptorForType(msgType, r) +} + +// LoadEnumDescriptorForEnum is the same as the package function of the same +// name, but any alternate paths configured in this resolver are used when +// linking files for the returned descriptor. +func (r *ImportResolver) LoadEnumDescriptorForEnum(enum protoEnum) (*EnumDescriptor, error) { + return loadEnumDescriptorForEnum(enum, r) +} + +// LoadEnumDescriptorForType is the same as the package function of the same +// name, but any alternate paths configured in this resolver are used when +// linking files for the returned descriptor. +func (r *ImportResolver) LoadEnumDescriptorForType(enumType reflect.Type) (*EnumDescriptor, error) { + return loadEnumDescriptorForType(enumType, r) +} + +// LoadFieldDescriptorForExtension is the same as the package function of the +// same name, but any alternate paths configured in this resolver are used when +// linking files for the returned descriptor. +func (r *ImportResolver) LoadFieldDescriptorForExtension(ext *proto.ExtensionDesc) (*FieldDescriptor, error) { + return loadFieldDescriptorForExtension(ext, r) +} + +// CreateFileDescriptor is the same as the package function of the same name, +// but any alternate paths configured in this resolver are used when linking the +// given descriptor proto. +func (r *ImportResolver) CreateFileDescriptor(fdp *dpb.FileDescriptorProto, deps ...*FileDescriptor) (*FileDescriptor, error) { + return createFileDescriptor(fdp, deps, r) +} + +// CreateFileDescriptors is the same as the package function of the same name, +// but any alternate paths configured in this resolver are used when linking the +// given descriptor protos. +func (r *ImportResolver) CreateFileDescriptors(fds []*dpb.FileDescriptorProto) (map[string]*FileDescriptor, error) { + return createFileDescriptors(fds, r) +} + +// CreateFileDescriptorFromSet is the same as the package function of the same +// name, but any alternate paths configured in this resolver are used when +// linking the descriptor protos in the given set. +func (r *ImportResolver) CreateFileDescriptorFromSet(fds *dpb.FileDescriptorSet) (*FileDescriptor, error) { + return createFileDescriptorFromSet(fds, r) +} + +// CreateFileDescriptorsFromSet is the same as the package function of the same +// name, but any alternate paths configured in this resolver are used when +// linking the descriptor protos in the given set. +func (r *ImportResolver) CreateFileDescriptorsFromSet(fds *dpb.FileDescriptorSet) (map[string]*FileDescriptor, error) { + return createFileDescriptorsFromSet(fds, r) +} + +const dotPrefix = "." + string(filepath.Separator) + +func clean(path string) string { + if path == "" { + return "" + } + path = filepath.Clean(path) + if path == "." { + return "" + } + return strings.TrimPrefix(path, dotPrefix) +} diff --git a/vendor/github.com/jhump/protoreflect/desc/internal/source_info.go b/vendor/github.com/jhump/protoreflect/desc/internal/source_info.go new file mode 100644 index 00000000..b4150b83 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/internal/source_info.go @@ -0,0 +1,107 @@ +package internal + +import ( + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// SourceInfoMap is a map of paths in a descriptor to the corresponding source +// code info. +type SourceInfoMap map[string][]*dpb.SourceCodeInfo_Location + +// Get returns the source code info for the given path. If there are +// multiple locations for the same path, the first one is returned. +func (m SourceInfoMap) Get(path []int32) *dpb.SourceCodeInfo_Location { + v := m[asMapKey(path)] + if len(v) > 0 { + return v[0] + } + return nil +} + +// GetAll returns all source code info for the given path. +func (m SourceInfoMap) GetAll(path []int32) []*dpb.SourceCodeInfo_Location { + return m[asMapKey(path)] +} + +// Add stores the given source code info for the given path. +func (m SourceInfoMap) Add(path []int32, loc *dpb.SourceCodeInfo_Location) { + m[asMapKey(path)] = append(m[asMapKey(path)], loc) +} + +// PutIfAbsent stores the given source code info for the given path only if the +// given path does not exist in the map. This method returns true when the value +// is stored, false if the path already exists. +func (m SourceInfoMap) PutIfAbsent(path []int32, loc *dpb.SourceCodeInfo_Location) bool { + k := asMapKey(path) + if _, ok := m[k]; ok { + return false + } + m[k] = []*dpb.SourceCodeInfo_Location{loc} + return true +} + +func asMapKey(slice []int32) string { + // NB: arrays should be usable as map keys, but this does not + // work due to a bug: https://github.com/golang/go/issues/22605 + //rv := reflect.ValueOf(slice) + //arrayType := reflect.ArrayOf(rv.Len(), rv.Type().Elem()) + //array := reflect.New(arrayType).Elem() + //reflect.Copy(array, rv) + //return array.Interface() + + b := make([]byte, len(slice)*4) + j := 0 + for _, s := range slice { + b[j] = byte(s) + b[j+1] = byte(s >> 8) + b[j+2] = byte(s >> 16) + b[j+3] = byte(s >> 24) + j += 4 + } + return string(b) +} + +// CreateSourceInfoMap constructs a new SourceInfoMap and populates it with the +// source code info in the given file descriptor proto. +func CreateSourceInfoMap(fd *dpb.FileDescriptorProto) SourceInfoMap { + res := SourceInfoMap{} + PopulateSourceInfoMap(fd, res) + return res +} + +// PopulateSourceInfoMap populates the given SourceInfoMap with information from +// the given file descriptor. +func PopulateSourceInfoMap(fd *dpb.FileDescriptorProto, m SourceInfoMap) { + for _, l := range fd.GetSourceCodeInfo().GetLocation() { + m.Add(l.Path, l) + } +} + +// NB: This wonkiness allows desc.Descriptor impl to implement an interface that +// is only usable from this package, by embedding a SourceInfoComputeFunc that +// implements the actual logic (which must live in desc package to avoid a +// dependency cycle). + +// SourceInfoComputer is a single method which will be invoked to recompute +// source info. This is needed for the protoparse package, which needs to link +// descriptors without source info in order to interpret options, but then needs +// to re-compute source info after that interpretation so that final linked +// descriptors expose the right info. +type SourceInfoComputer interface { + recomputeSourceInfo() +} + +// SourceInfoComputeFunc is the type that a desc.Descriptor will embed. It will +// be aliased in the desc package to an unexported name so it is not marked as +// an exported field in reflection and not present in Go docs. +type SourceInfoComputeFunc func() + +func (f SourceInfoComputeFunc) recomputeSourceInfo() { + f() +} + +// RecomputeSourceInfo is used to initiate recomputation of source info. This is +// is used by the protoparse package, after it interprets options. +func RecomputeSourceInfo(c SourceInfoComputer) { + c.recomputeSourceInfo() +} diff --git a/vendor/github.com/jhump/protoreflect/desc/internal/util.go b/vendor/github.com/jhump/protoreflect/desc/internal/util.go new file mode 100644 index 00000000..c3ed78a2 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/internal/util.go @@ -0,0 +1,288 @@ +package internal + +import ( + "math" + "unicode" + "unicode/utf8" +) + +const ( + // MaxNormalTag is the maximum allowed tag number for a field in a normal message. + MaxNormalTag = 536870911 // 2^29 - 1 + + // MaxMessageSetTag is the maximum allowed tag number of a field in a message that + // uses the message set wire format. + MaxMessageSetTag = math.MaxInt32 - 1 + + // MaxTag is the maximum allowed tag number. (It is the same as MaxMessageSetTag + // since that is the absolute highest allowed.) + MaxTag = MaxMessageSetTag + + // SpecialReservedStart is the first tag in a range that is reserved and not + // allowed for use in message definitions. + SpecialReservedStart = 19000 + // SpecialReservedEnd is the last tag in a range that is reserved and not + // allowed for use in message definitions. + SpecialReservedEnd = 19999 + + // NB: It would be nice to use constants from generated code instead of + // hard-coding these here. But code-gen does not emit these as constants + // anywhere. The only places they appear in generated code are struct tags + // on fields of the generated descriptor protos. + + // File_packageTag is the tag number of the package element in a file + // descriptor proto. + File_packageTag = 2 + // File_dependencyTag is the tag number of the dependencies element in a + // file descriptor proto. + File_dependencyTag = 3 + // File_messagesTag is the tag number of the messages element in a file + // descriptor proto. + File_messagesTag = 4 + // File_enumsTag is the tag number of the enums element in a file descriptor + // proto. + File_enumsTag = 5 + // File_servicesTag is the tag number of the services element in a file + // descriptor proto. + File_servicesTag = 6 + // File_extensionsTag is the tag number of the extensions element in a file + // descriptor proto. + File_extensionsTag = 7 + // File_optionsTag is the tag number of the options element in a file + // descriptor proto. + File_optionsTag = 8 + // File_syntaxTag is the tag number of the syntax element in a file + // descriptor proto. + File_syntaxTag = 12 + // Message_nameTag is the tag number of the name element in a message + // descriptor proto. + Message_nameTag = 1 + // Message_fieldsTag is the tag number of the fields element in a message + // descriptor proto. + Message_fieldsTag = 2 + // Message_nestedMessagesTag is the tag number of the nested messages + // element in a message descriptor proto. + Message_nestedMessagesTag = 3 + // Message_enumsTag is the tag number of the enums element in a message + // descriptor proto. + Message_enumsTag = 4 + // Message_extensionRangeTag is the tag number of the extension ranges + // element in a message descriptor proto. + Message_extensionRangeTag = 5 + // Message_extensionsTag is the tag number of the extensions element in a + // message descriptor proto. + Message_extensionsTag = 6 + // Message_optionsTag is the tag number of the options element in a message + // descriptor proto. + Message_optionsTag = 7 + // Message_oneOfsTag is the tag number of the one-ofs element in a message + // descriptor proto. + Message_oneOfsTag = 8 + // Message_reservedRangeTag is the tag number of the reserved ranges element + // in a message descriptor proto. + Message_reservedRangeTag = 9 + // Message_reservedNameTag is the tag number of the reserved names element + // in a message descriptor proto. + Message_reservedNameTag = 10 + // ExtensionRange_startTag is the tag number of the start index in an + // extension range proto. + ExtensionRange_startTag = 1 + // ExtensionRange_endTag is the tag number of the end index in an + // extension range proto. + ExtensionRange_endTag = 2 + // ExtensionRange_optionsTag is the tag number of the options element in an + // extension range proto. + ExtensionRange_optionsTag = 3 + // ReservedRange_startTag is the tag number of the start index in a reserved + // range proto. + ReservedRange_startTag = 1 + // ReservedRange_endTag is the tag number of the end index in a reserved + // range proto. + ReservedRange_endTag = 2 + // Field_nameTag is the tag number of the name element in a field descriptor + // proto. + Field_nameTag = 1 + // Field_extendeeTag is the tag number of the extendee element in a field + // descriptor proto. + Field_extendeeTag = 2 + // Field_numberTag is the tag number of the number element in a field + // descriptor proto. + Field_numberTag = 3 + // Field_labelTag is the tag number of the label element in a field + // descriptor proto. + Field_labelTag = 4 + // Field_typeTag is the tag number of the type element in a field descriptor + // proto. + Field_typeTag = 5 + // Field_typeNameTag is the tag number of the type name element in a field + // descriptor proto. + Field_typeNameTag = 6 + // Field_defaultTag is the tag number of the default value element in a + // field descriptor proto. + Field_defaultTag = 7 + // Field_optionsTag is the tag number of the options element in a field + // descriptor proto. + Field_optionsTag = 8 + // Field_jsonNameTag is the tag number of the JSON name element in a field + // descriptor proto. + Field_jsonNameTag = 10 + // OneOf_nameTag is the tag number of the name element in a one-of + // descriptor proto. + OneOf_nameTag = 1 + // OneOf_optionsTag is the tag number of the options element in a one-of + // descriptor proto. + OneOf_optionsTag = 2 + // Enum_nameTag is the tag number of the name element in an enum descriptor + // proto. + Enum_nameTag = 1 + // Enum_valuesTag is the tag number of the values element in an enum + // descriptor proto. + Enum_valuesTag = 2 + // Enum_optionsTag is the tag number of the options element in an enum + // descriptor proto. + Enum_optionsTag = 3 + // Enum_reservedRangeTag is the tag number of the reserved ranges element in + // an enum descriptor proto. + Enum_reservedRangeTag = 4 + // Enum_reservedNameTag is the tag number of the reserved names element in + // an enum descriptor proto. + Enum_reservedNameTag = 5 + // EnumVal_nameTag is the tag number of the name element in an enum value + // descriptor proto. + EnumVal_nameTag = 1 + // EnumVal_numberTag is the tag number of the number element in an enum + // value descriptor proto. + EnumVal_numberTag = 2 + // EnumVal_optionsTag is the tag number of the options element in an enum + // value descriptor proto. + EnumVal_optionsTag = 3 + // Service_nameTag is the tag number of the name element in a service + // descriptor proto. + Service_nameTag = 1 + // Service_methodsTag is the tag number of the methods element in a service + // descriptor proto. + Service_methodsTag = 2 + // Service_optionsTag is the tag number of the options element in a service + // descriptor proto. + Service_optionsTag = 3 + // Method_nameTag is the tag number of the name element in a method + // descriptor proto. + Method_nameTag = 1 + // Method_inputTag is the tag number of the input type element in a method + // descriptor proto. + Method_inputTag = 2 + // Method_outputTag is the tag number of the output type element in a method + // descriptor proto. + Method_outputTag = 3 + // Method_optionsTag is the tag number of the options element in a method + // descriptor proto. + Method_optionsTag = 4 + // Method_inputStreamTag is the tag number of the input stream flag in a + // method descriptor proto. + Method_inputStreamTag = 5 + // Method_outputStreamTag is the tag number of the output stream flag in a + // method descriptor proto. + Method_outputStreamTag = 6 + + // UninterpretedOptionsTag is the tag number of the uninterpreted options + // element. All *Options messages use the same tag for the field that stores + // uninterpreted options. + UninterpretedOptionsTag = 999 + + // Uninterpreted_nameTag is the tag number of the name element in an + // uninterpreted options proto. + Uninterpreted_nameTag = 2 + // Uninterpreted_identTag is the tag number of the identifier value in an + // uninterpreted options proto. + Uninterpreted_identTag = 3 + // Uninterpreted_posIntTag is the tag number of the positive int value in an + // uninterpreted options proto. + Uninterpreted_posIntTag = 4 + // Uninterpreted_negIntTag is the tag number of the negative int value in an + // uninterpreted options proto. + Uninterpreted_negIntTag = 5 + // Uninterpreted_doubleTag is the tag number of the double value in an + // uninterpreted options proto. + Uninterpreted_doubleTag = 6 + // Uninterpreted_stringTag is the tag number of the string value in an + // uninterpreted options proto. + Uninterpreted_stringTag = 7 + // Uninterpreted_aggregateTag is the tag number of the aggregate value in an + // uninterpreted options proto. + Uninterpreted_aggregateTag = 8 + // UninterpretedName_nameTag is the tag number of the name element in an + // uninterpreted option name proto. + UninterpretedName_nameTag = 1 +) + +// JsonName returns the default JSON name for a field with the given name. +func JsonName(name string) string { + var js []rune + nextUpper := false + for i, r := range name { + if r == '_' { + nextUpper = true + continue + } + if i == 0 { + js = append(js, r) + } else if nextUpper { + nextUpper = false + js = append(js, unicode.ToUpper(r)) + } else { + js = append(js, r) + } + } + return string(js) +} + +// InitCap returns the given field name, but with the first letter capitalized. +func InitCap(name string) string { + r, sz := utf8.DecodeRuneInString(name) + return string(unicode.ToUpper(r)) + name[sz:] +} + +// CreatePrefixList returns a list of package prefixes to search when resolving +// a symbol name. If the given package is blank, it returns only the empty +// string. If the given package contains only one token, e.g. "foo", it returns +// that token and the empty string, e.g. ["foo", ""]. Otherwise, it returns +// successively shorter prefixes of the package and then the empty string. For +// example, for a package named "foo.bar.baz" it will return the following list: +// ["foo.bar.baz", "foo.bar", "foo", ""] +func CreatePrefixList(pkg string) []string { + if pkg == "" { + return []string{""} + } + + numDots := 0 + // one pass to pre-allocate the returned slice + for i := 0; i < len(pkg); i++ { + if pkg[i] == '.' { + numDots++ + } + } + if numDots == 0 { + return []string{pkg, ""} + } + + prefixes := make([]string, numDots+2) + // second pass to fill in returned slice + for i := 0; i < len(pkg); i++ { + if pkg[i] == '.' { + prefixes[numDots] = pkg[:i] + numDots-- + } + } + prefixes[0] = pkg + + return prefixes +} + +// GetMaxTag returns the max tag number allowed, based on whether a message uses +// message set wire format or not. +func GetMaxTag(isMessageSet bool) int32 { + if isMessageSet { + return MaxMessageSetTag + } + return MaxNormalTag +} diff --git a/vendor/github.com/jhump/protoreflect/desc/load.go b/vendor/github.com/jhump/protoreflect/desc/load.go new file mode 100644 index 00000000..4a05830d --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/load.go @@ -0,0 +1,341 @@ +package desc + +import ( + "fmt" + "reflect" + "sync" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/internal" +) + +var ( + cacheMu sync.RWMutex + filesCache = map[string]*FileDescriptor{} + messagesCache = map[string]*MessageDescriptor{} + enumCache = map[reflect.Type]*EnumDescriptor{} +) + +// LoadFileDescriptor creates a file descriptor using the bytes returned by +// proto.FileDescriptor. Descriptors are cached so that they do not need to be +// re-processed if the same file is fetched again later. +func LoadFileDescriptor(file string) (*FileDescriptor, error) { + return loadFileDescriptor(file, nil) +} + +func loadFileDescriptor(file string, r *ImportResolver) (*FileDescriptor, error) { + f := getFileFromCache(file) + if f != nil { + return f, nil + } + cacheMu.Lock() + defer cacheMu.Unlock() + return loadFileDescriptorLocked(file, r) +} + +func loadFileDescriptorLocked(file string, r *ImportResolver) (*FileDescriptor, error) { + f := filesCache[file] + if f != nil { + return f, nil + } + fd, err := internal.LoadFileDescriptor(file) + if err != nil { + return nil, err + } + + f, err = toFileDescriptorLocked(fd, r) + if err != nil { + return nil, err + } + putCacheLocked(file, f) + return f, nil +} + +func toFileDescriptorLocked(fd *dpb.FileDescriptorProto, r *ImportResolver) (*FileDescriptor, error) { + deps := make([]*FileDescriptor, len(fd.GetDependency())) + for i, dep := range fd.GetDependency() { + resolvedDep := r.ResolveImport(fd.GetName(), dep) + var err error + deps[i], err = loadFileDescriptorLocked(resolvedDep, r) + if _, ok := err.(internal.ErrNoSuchFile); ok && resolvedDep != dep { + // try original path + deps[i], err = loadFileDescriptorLocked(dep, r) + } + if err != nil { + return nil, err + } + } + return CreateFileDescriptor(fd, deps...) +} + +func getFileFromCache(file string) *FileDescriptor { + cacheMu.RLock() + defer cacheMu.RUnlock() + return filesCache[file] +} + +func putCacheLocked(filename string, fd *FileDescriptor) { + filesCache[filename] = fd + putMessageCacheLocked(fd.messages) +} + +func putMessageCacheLocked(mds []*MessageDescriptor) { + for _, md := range mds { + messagesCache[md.fqn] = md + putMessageCacheLocked(md.nested) + } +} + +// interface implemented by generated messages, which all have a Descriptor() method in +// addition to the methods of proto.Message +type protoMessage interface { + proto.Message + Descriptor() ([]byte, []int) +} + +// LoadMessageDescriptor loads descriptor using the encoded descriptor proto returned by +// Message.Descriptor() for the given message type. If the given type is not recognized, +// then a nil descriptor is returned. +func LoadMessageDescriptor(message string) (*MessageDescriptor, error) { + return loadMessageDescriptor(message, nil) +} + +func loadMessageDescriptor(message string, r *ImportResolver) (*MessageDescriptor, error) { + m := getMessageFromCache(message) + if m != nil { + return m, nil + } + + pt := proto.MessageType(message) + if pt == nil { + return nil, nil + } + msg, err := messageFromType(pt) + if err != nil { + return nil, err + } + + cacheMu.Lock() + defer cacheMu.Unlock() + return loadMessageDescriptorForTypeLocked(message, msg, r) +} + +// LoadMessageDescriptorForType loads descriptor using the encoded descriptor proto returned +// by message.Descriptor() for the given message type. If the given type is not recognized, +// then a nil descriptor is returned. +func LoadMessageDescriptorForType(messageType reflect.Type) (*MessageDescriptor, error) { + return loadMessageDescriptorForType(messageType, nil) +} + +func loadMessageDescriptorForType(messageType reflect.Type, r *ImportResolver) (*MessageDescriptor, error) { + m, err := messageFromType(messageType) + if err != nil { + return nil, err + } + return loadMessageDescriptorForMessage(m, r) +} + +// LoadMessageDescriptorForMessage loads descriptor using the encoded descriptor proto +// returned by message.Descriptor(). If the given type is not recognized, then a nil +// descriptor is returned. +func LoadMessageDescriptorForMessage(message proto.Message) (*MessageDescriptor, error) { + return loadMessageDescriptorForMessage(message, nil) +} + +func loadMessageDescriptorForMessage(message proto.Message, r *ImportResolver) (*MessageDescriptor, error) { + // efficiently handle dynamic messages + type descriptorable interface { + GetMessageDescriptor() *MessageDescriptor + } + if d, ok := message.(descriptorable); ok { + return d.GetMessageDescriptor(), nil + } + + name := proto.MessageName(message) + if name == "" { + return nil, nil + } + m := getMessageFromCache(name) + if m != nil { + return m, nil + } + + cacheMu.Lock() + defer cacheMu.Unlock() + return loadMessageDescriptorForTypeLocked(name, message.(protoMessage), nil) +} + +func messageFromType(mt reflect.Type) (protoMessage, error) { + if mt.Kind() != reflect.Ptr { + mt = reflect.PtrTo(mt) + } + m, ok := reflect.Zero(mt).Interface().(protoMessage) + if !ok { + return nil, fmt.Errorf("failed to create message from type: %v", mt) + } + return m, nil +} + +func loadMessageDescriptorForTypeLocked(name string, message protoMessage, r *ImportResolver) (*MessageDescriptor, error) { + m := messagesCache[name] + if m != nil { + return m, nil + } + + fdb, _ := message.Descriptor() + fd, err := internal.DecodeFileDescriptor(name, fdb) + if err != nil { + return nil, err + } + + f, err := toFileDescriptorLocked(fd, r) + if err != nil { + return nil, err + } + putCacheLocked(fd.GetName(), f) + return f.FindSymbol(name).(*MessageDescriptor), nil +} + +func getMessageFromCache(message string) *MessageDescriptor { + cacheMu.RLock() + defer cacheMu.RUnlock() + return messagesCache[message] +} + +// interface implemented by all generated enums +type protoEnum interface { + EnumDescriptor() ([]byte, []int) +} + +// NB: There is no LoadEnumDescriptor that takes a fully-qualified enum name because +// it is not useful since protoc-gen-go does not expose the name anywhere in generated +// code or register it in a way that is it accessible for reflection code. This also +// means we have to cache enum descriptors differently -- we can only cache them as +// they are requested, as opposed to caching all enum types whenever a file descriptor +// is cached. This is because we need to know the generated type of the enums, and we +// don't know that at the time of caching file descriptors. + +// LoadEnumDescriptorForType loads descriptor using the encoded descriptor proto returned +// by enum.EnumDescriptor() for the given enum type. +func LoadEnumDescriptorForType(enumType reflect.Type) (*EnumDescriptor, error) { + return loadEnumDescriptorForType(enumType, nil) +} + +func loadEnumDescriptorForType(enumType reflect.Type, r *ImportResolver) (*EnumDescriptor, error) { + // we cache descriptors using non-pointer type + if enumType.Kind() == reflect.Ptr { + enumType = enumType.Elem() + } + e := getEnumFromCache(enumType) + if e != nil { + return e, nil + } + enum, err := enumFromType(enumType) + if err != nil { + return nil, err + } + + cacheMu.Lock() + defer cacheMu.Unlock() + return loadEnumDescriptorForTypeLocked(enumType, enum, r) +} + +// LoadEnumDescriptorForEnum loads descriptor using the encoded descriptor proto +// returned by enum.EnumDescriptor(). +func LoadEnumDescriptorForEnum(enum protoEnum) (*EnumDescriptor, error) { + return loadEnumDescriptorForEnum(enum, nil) +} + +func loadEnumDescriptorForEnum(enum protoEnum, r *ImportResolver) (*EnumDescriptor, error) { + et := reflect.TypeOf(enum) + // we cache descriptors using non-pointer type + if et.Kind() == reflect.Ptr { + et = et.Elem() + enum = reflect.Zero(et).Interface().(protoEnum) + } + e := getEnumFromCache(et) + if e != nil { + return e, nil + } + + cacheMu.Lock() + defer cacheMu.Unlock() + return loadEnumDescriptorForTypeLocked(et, enum, r) +} + +func enumFromType(et reflect.Type) (protoEnum, error) { + if et.Kind() != reflect.Int32 { + et = reflect.PtrTo(et) + } + e, ok := reflect.Zero(et).Interface().(protoEnum) + if !ok { + return nil, fmt.Errorf("failed to create enum from type: %v", et) + } + return e, nil +} + +func loadEnumDescriptorForTypeLocked(et reflect.Type, enum protoEnum, r *ImportResolver) (*EnumDescriptor, error) { + e := enumCache[et] + if e != nil { + return e, nil + } + + fdb, path := enum.EnumDescriptor() + name := fmt.Sprintf("%v", et) + fd, err := internal.DecodeFileDescriptor(name, fdb) + if err != nil { + return nil, err + } + // see if we already have cached "rich" descriptor + f, ok := filesCache[fd.GetName()] + if !ok { + f, err = toFileDescriptorLocked(fd, r) + if err != nil { + return nil, err + } + putCacheLocked(fd.GetName(), f) + } + + ed := findEnum(f, path) + enumCache[et] = ed + return ed, nil +} + +func getEnumFromCache(et reflect.Type) *EnumDescriptor { + cacheMu.RLock() + defer cacheMu.RUnlock() + return enumCache[et] +} + +func findEnum(fd *FileDescriptor, path []int) *EnumDescriptor { + if len(path) == 1 { + return fd.GetEnumTypes()[path[0]] + } + md := fd.GetMessageTypes()[path[0]] + for _, i := range path[1 : len(path)-1] { + md = md.GetNestedMessageTypes()[i] + } + return md.GetNestedEnumTypes()[path[len(path)-1]] +} + +// LoadFieldDescriptorForExtension loads the field descriptor that corresponds to the given +// extension description. +func LoadFieldDescriptorForExtension(ext *proto.ExtensionDesc) (*FieldDescriptor, error) { + return loadFieldDescriptorForExtension(ext, nil) +} + +func loadFieldDescriptorForExtension(ext *proto.ExtensionDesc, r *ImportResolver) (*FieldDescriptor, error) { + file, err := loadFileDescriptor(ext.Filename, r) + if err != nil { + return nil, err + } + field, ok := file.FindSymbol(ext.Name).(*FieldDescriptor) + // make sure descriptor agrees with attributes of the ExtensionDesc + if !ok || !field.IsExtension() || field.GetOwner().GetFullyQualifiedName() != proto.MessageName(ext.ExtendedType) || + field.GetNumber() != ext.Field { + return nil, fmt.Errorf("file descriptor contained unexpected object with name %s", ext.Name) + } + return field, nil +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/.gitignore b/vendor/github.com/jhump/protoreflect/desc/protoparse/.gitignore new file mode 100644 index 00000000..26520536 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/.gitignore @@ -0,0 +1 @@ +y.output diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/ast.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/ast.go new file mode 100644 index 00000000..9175ad9b --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/ast.go @@ -0,0 +1,1118 @@ +package protoparse + +// This file defines all of the nodes in the proto AST. + +// SourcePos identifies a location in a proto source file. +type SourcePos struct { + Filename string + Line, Col int + Offset int +} + +func unknownPos(filename string) *SourcePos { + return &SourcePos{Filename: filename} +} + +// node is the interface implemented by all nodes in the AST +type node interface { + start() *SourcePos + end() *SourcePos + leadingComments() []comment + trailingComments() []comment +} + +type terminalNode interface { + node + popLeadingComment() comment + pushTrailingComment(comment) +} + +var _ terminalNode = (*basicNode)(nil) +var _ terminalNode = (*stringLiteralNode)(nil) +var _ terminalNode = (*intLiteralNode)(nil) +var _ terminalNode = (*floatLiteralNode)(nil) +var _ terminalNode = (*identNode)(nil) + +type fileDecl interface { + node + getSyntax() node +} + +var _ fileDecl = (*fileNode)(nil) +var _ fileDecl = (*noSourceNode)(nil) + +type optionDecl interface { + node + getName() node + getValue() valueNode +} + +var _ optionDecl = (*optionNode)(nil) +var _ optionDecl = (*noSourceNode)(nil) + +type fieldDecl interface { + node + fieldLabel() node + fieldName() node + fieldType() node + fieldTag() node + fieldExtendee() node + getGroupKeyword() node +} + +var _ fieldDecl = (*fieldNode)(nil) +var _ fieldDecl = (*groupNode)(nil) +var _ fieldDecl = (*mapFieldNode)(nil) +var _ fieldDecl = (*syntheticMapField)(nil) +var _ fieldDecl = (*noSourceNode)(nil) + +type rangeDecl interface { + node + rangeStart() node + rangeEnd() node +} + +var _ rangeDecl = (*rangeNode)(nil) +var _ rangeDecl = (*noSourceNode)(nil) + +type enumValueDecl interface { + node + getName() node + getNumber() node +} + +var _ enumValueDecl = (*enumValueNode)(nil) +var _ enumValueDecl = (*noSourceNode)(nil) + +type msgDecl interface { + node + messageName() node +} + +var _ msgDecl = (*messageNode)(nil) +var _ msgDecl = (*groupNode)(nil) +var _ msgDecl = (*mapFieldNode)(nil) +var _ msgDecl = (*noSourceNode)(nil) + +type methodDecl interface { + node + getInputType() node + getOutputType() node +} + +var _ methodDecl = (*methodNode)(nil) +var _ methodDecl = (*noSourceNode)(nil) + +type posRange struct { + start, end SourcePos +} + +type basicNode struct { + posRange + leading []comment + trailing []comment +} + +func (n *basicNode) start() *SourcePos { + return &n.posRange.start +} + +func (n *basicNode) end() *SourcePos { + return &n.posRange.end +} + +func (n *basicNode) leadingComments() []comment { + return n.leading +} + +func (n *basicNode) trailingComments() []comment { + return n.trailing +} + +func (n *basicNode) popLeadingComment() comment { + c := n.leading[0] + n.leading = n.leading[1:] + return c +} + +func (n *basicNode) pushTrailingComment(c comment) { + n.trailing = append(n.trailing, c) +} + +type comment struct { + posRange + text string +} + +type basicCompositeNode struct { + first node + last node +} + +func (n *basicCompositeNode) start() *SourcePos { + return n.first.start() +} + +func (n *basicCompositeNode) end() *SourcePos { + return n.last.end() +} + +func (n *basicCompositeNode) leadingComments() []comment { + return n.first.leadingComments() +} + +func (n *basicCompositeNode) trailingComments() []comment { + return n.last.trailingComments() +} + +func (n *basicCompositeNode) setRange(first, last node) { + n.first = first + n.last = last +} + +type fileNode struct { + basicCompositeNode + syntax *syntaxNode + decls []*fileElement + + // This field is populated after parsing, to make it easier to find + // source locations by import name for constructing link errors. + imports []*importNode +} + +func (n *fileNode) getSyntax() node { + return n.syntax +} + +type fileElement struct { + // a discriminated union: only one field will be set + imp *importNode + pkg *packageNode + option *optionNode + message *messageNode + enum *enumNode + extend *extendNode + service *serviceNode + empty *basicNode +} + +func (n *fileElement) start() *SourcePos { + return n.get().start() +} + +func (n *fileElement) end() *SourcePos { + return n.get().end() +} + +func (n *fileElement) leadingComments() []comment { + return n.get().leadingComments() +} + +func (n *fileElement) trailingComments() []comment { + return n.get().trailingComments() +} + +func (n *fileElement) get() node { + switch { + case n.imp != nil: + return n.imp + case n.pkg != nil: + return n.pkg + case n.option != nil: + return n.option + case n.message != nil: + return n.message + case n.enum != nil: + return n.enum + case n.extend != nil: + return n.extend + case n.service != nil: + return n.service + default: + return n.empty + } +} + +type syntaxNode struct { + basicCompositeNode + syntax *compoundStringNode +} + +type importNode struct { + basicCompositeNode + name *compoundStringNode + public bool + weak bool +} + +type packageNode struct { + basicCompositeNode + name *compoundIdentNode +} + +type identifier string + +type identNode struct { + basicNode + val string +} + +func (n *identNode) value() interface{} { + return identifier(n.val) +} + +type compoundIdentNode struct { + basicCompositeNode + val string +} + +func (n *compoundIdentNode) value() interface{} { + return identifier(n.val) +} + +type compactOptionsNode struct { + basicCompositeNode + decls []*optionNode +} + +func (n *compactOptionsNode) Elements() []*optionNode { + if n == nil { + return nil + } + return n.decls +} + +type optionNode struct { + basicCompositeNode + name *optionNameNode + val valueNode +} + +func (n *optionNode) getName() node { + return n.name +} + +func (n *optionNode) getValue() valueNode { + return n.val +} + +type optionNameNode struct { + basicCompositeNode + parts []*optionNamePartNode +} + +type optionNamePartNode struct { + basicCompositeNode + text *compoundIdentNode + offset int + length int + isExtension bool + st, en *SourcePos +} + +func (n *optionNamePartNode) start() *SourcePos { + if n.isExtension { + return n.basicCompositeNode.start() + } + return n.st +} + +func (n *optionNamePartNode) end() *SourcePos { + if n.isExtension { + return n.basicCompositeNode.end() + } + return n.en +} + +func (n *optionNamePartNode) setRange(first, last node) { + n.basicCompositeNode.setRange(first, last) + if !n.isExtension { + st := *first.start() + st.Col += n.offset + n.st = &st + en := st + en.Col += n.length + n.en = &en + } +} + +type valueNode interface { + node + value() interface{} +} + +var _ valueNode = (*identNode)(nil) +var _ valueNode = (*compoundIdentNode)(nil) +var _ valueNode = (*stringLiteralNode)(nil) +var _ valueNode = (*compoundStringNode)(nil) +var _ valueNode = (*intLiteralNode)(nil) +var _ valueNode = (*compoundIntNode)(nil) +var _ valueNode = (*compoundUintNode)(nil) +var _ valueNode = (*floatLiteralNode)(nil) +var _ valueNode = (*compoundFloatNode)(nil) +var _ valueNode = (*boolLiteralNode)(nil) +var _ valueNode = (*sliceLiteralNode)(nil) +var _ valueNode = (*aggregateLiteralNode)(nil) +var _ valueNode = (*noSourceNode)(nil) + +type stringLiteralNode struct { + basicNode + val string +} + +func (n *stringLiteralNode) value() interface{} { + return n.val +} + +type compoundStringNode struct { + basicCompositeNode + val string +} + +func (n *compoundStringNode) value() interface{} { + return n.val +} + +type intLiteral interface { + asInt32(min, max int32) (int32, bool) + value() interface{} +} + +type intLiteralNode struct { + basicNode + val uint64 +} + +var _ intLiteral = (*intLiteralNode)(nil) + +func (n *intLiteralNode) value() interface{} { + return n.val +} + +func (n *intLiteralNode) asInt32(min, max int32) (int32, bool) { + if (min >= 0 && n.val < uint64(min)) || n.val > uint64(max) { + return 0, false + } + return int32(n.val), true +} + +type compoundUintNode struct { + basicCompositeNode + val uint64 +} + +var _ intLiteral = (*compoundUintNode)(nil) + +func (n *compoundUintNode) value() interface{} { + return n.val +} + +func (n *compoundUintNode) asInt32(min, max int32) (int32, bool) { + if (min >= 0 && n.val < uint64(min)) || n.val > uint64(max) { + return 0, false + } + return int32(n.val), true +} + +type compoundIntNode struct { + basicCompositeNode + val int64 +} + +var _ intLiteral = (*compoundIntNode)(nil) + +func (n *compoundIntNode) value() interface{} { + return n.val +} + +func (n *compoundIntNode) asInt32(min, max int32) (int32, bool) { + if n.val < int64(min) || n.val > int64(max) { + return 0, false + } + return int32(n.val), true +} + +type floatLiteralNode struct { + basicNode + val float64 +} + +func (n *floatLiteralNode) value() interface{} { + return n.val +} + +type compoundFloatNode struct { + basicCompositeNode + val float64 +} + +func (n *compoundFloatNode) value() interface{} { + return n.val +} + +type boolLiteralNode struct { + *identNode + val bool +} + +func (n *boolLiteralNode) value() interface{} { + return n.val +} + +type sliceLiteralNode struct { + basicCompositeNode + elements []valueNode +} + +func (n *sliceLiteralNode) value() interface{} { + return n.elements +} + +type aggregateLiteralNode struct { + basicCompositeNode + elements []*aggregateEntryNode +} + +func (n *aggregateLiteralNode) value() interface{} { + return n.elements +} + +type aggregateEntryNode struct { + basicCompositeNode + name *aggregateNameNode + val valueNode +} + +type aggregateNameNode struct { + basicCompositeNode + name *compoundIdentNode + isExtension bool +} + +func (a *aggregateNameNode) value() string { + if a.isExtension { + return "[" + a.name.val + "]" + } else { + return a.name.val + } +} + +type fieldNode struct { + basicCompositeNode + label fieldLabel + fldType *compoundIdentNode + name *identNode + tag *intLiteralNode + options *compactOptionsNode + + // This field is populated after parsing, to allow lookup of extendee source + // locations when field extendees cannot be linked. (Otherwise, this is just + // stored as a string in the field descriptors defined inside the extend + // block). + extendee *extendNode +} + +func (n *fieldNode) fieldLabel() node { + // proto3 fields and fields inside one-ofs will not have a label and we need + // this check in order to return a nil node -- otherwise we'd return a + // non-nil node that has a nil pointer value in it :/ + if n.label.identNode == nil { + return nil + } + return n.label.identNode +} + +func (n *fieldNode) fieldName() node { + return n.name +} + +func (n *fieldNode) fieldType() node { + return n.fldType +} + +func (n *fieldNode) fieldTag() node { + return n.tag +} + +func (n *fieldNode) fieldExtendee() node { + if n.extendee != nil { + return n.extendee.extendee + } + return nil +} + +func (n *fieldNode) getGroupKeyword() node { + return nil +} + +type fieldLabel struct { + *identNode + repeated bool + required bool +} + +type groupNode struct { + basicCompositeNode + groupKeyword *identNode + label fieldLabel + name *identNode + tag *intLiteralNode + decls []*messageElement + options *compactOptionsNode + + // This field is populated after parsing, to allow lookup of extendee source + // locations when field extendees cannot be linked. (Otherwise, this is just + // stored as a string in the field descriptors defined inside the extend + // block). + extendee *extendNode +} + +func (n *groupNode) fieldLabel() node { + if n.label.identNode == nil { + // return nil interface to indicate absence, not a typed nil + return nil + } + return n.label.identNode +} + +func (n *groupNode) fieldName() node { + return n.name +} + +func (n *groupNode) fieldType() node { + return n.groupKeyword +} + +func (n *groupNode) fieldTag() node { + return n.tag +} + +func (n *groupNode) fieldExtendee() node { + if n.extendee != nil { + return n.extendee.extendee + } + return nil +} + +func (n *groupNode) getGroupKeyword() node { + return n.groupKeyword +} + +func (n *groupNode) messageName() node { + return n.name +} + +type oneOfNode struct { + basicCompositeNode + name *identNode + decls []*oneOfElement +} + +type oneOfElement struct { + // a discriminated union: only one field will be set + option *optionNode + field *fieldNode + group *groupNode + empty *basicNode +} + +func (n *oneOfElement) start() *SourcePos { + return n.get().start() +} + +func (n *oneOfElement) end() *SourcePos { + return n.get().end() +} + +func (n *oneOfElement) leadingComments() []comment { + return n.get().leadingComments() +} + +func (n *oneOfElement) trailingComments() []comment { + return n.get().trailingComments() +} + +func (n *oneOfElement) get() node { + switch { + case n.option != nil: + return n.option + case n.field != nil: + return n.field + default: + return n.empty + } +} + +type mapTypeNode struct { + basicCompositeNode + mapKeyword *identNode + keyType *identNode + valueType *compoundIdentNode +} + +type mapFieldNode struct { + basicCompositeNode + mapType *mapTypeNode + name *identNode + tag *intLiteralNode + options *compactOptionsNode +} + +func (n *mapFieldNode) fieldLabel() node { + return nil +} + +func (n *mapFieldNode) fieldName() node { + return n.name +} + +func (n *mapFieldNode) fieldType() node { + return n.mapType +} + +func (n *mapFieldNode) fieldTag() node { + return n.tag +} + +func (n *mapFieldNode) fieldExtendee() node { + return nil +} + +func (n *mapFieldNode) getGroupKeyword() node { + return nil +} + +func (n *mapFieldNode) messageName() node { + return n.name +} + +func (n *mapFieldNode) keyField() *syntheticMapField { + k := n.mapType.keyType + t := &compoundIdentNode{val: k.val} + t.setRange(k, k) + return newSyntheticMapField(t, 1) +} + +func (n *mapFieldNode) valueField() *syntheticMapField { + return newSyntheticMapField(n.mapType.valueType, 2) +} + +func newSyntheticMapField(ident *compoundIdentNode, tagNum uint64) *syntheticMapField { + tag := &intLiteralNode{ + basicNode: basicNode{ + posRange: posRange{start: *ident.start(), end: *ident.end()}, + }, + val: tagNum, + } + return &syntheticMapField{ident: ident, tag: tag} +} + +type syntheticMapField struct { + ident *compoundIdentNode + tag *intLiteralNode +} + +func (n *syntheticMapField) start() *SourcePos { + return n.ident.start() +} + +func (n *syntheticMapField) end() *SourcePos { + return n.ident.end() +} + +func (n *syntheticMapField) leadingComments() []comment { + return nil +} + +func (n *syntheticMapField) trailingComments() []comment { + return nil +} + +func (n *syntheticMapField) fieldLabel() node { + return n.ident +} + +func (n *syntheticMapField) fieldName() node { + return n.ident +} + +func (n *syntheticMapField) fieldType() node { + return n.ident +} + +func (n *syntheticMapField) fieldTag() node { + return n.tag +} + +func (n *syntheticMapField) fieldExtendee() node { + return nil +} + +func (n *syntheticMapField) getGroupKeyword() node { + return nil +} + +type extensionRangeNode struct { + basicCompositeNode + ranges []*rangeNode + options *compactOptionsNode +} + +type rangeNode struct { + basicCompositeNode + startNode, endNode node + endMax bool +} + +func (n *rangeNode) rangeStart() node { + return n.startNode +} + +func (n *rangeNode) rangeEnd() node { + if n.endNode == nil { + return n.startNode + } + return n.endNode +} + +func (n *rangeNode) startValue() interface{} { + return n.startNode.(intLiteral).value() +} + +func (n *rangeNode) startValueAsInt32(min, max int32) (int32, bool) { + return n.startNode.(intLiteral).asInt32(min, max) +} + +func (n *rangeNode) endValue() interface{} { + l, ok := n.endNode.(intLiteral) + if !ok { + return nil + } + return l.value() +} + +func (n *rangeNode) endValueAsInt32(min, max int32) (int32, bool) { + if n.endMax { + return max, true + } + if n.endNode == nil { + return n.startValueAsInt32(min, max) + } + return n.endNode.(intLiteral).asInt32(min, max) +} + +type reservedNode struct { + basicCompositeNode + ranges []*rangeNode + names []*compoundStringNode +} + +type enumNode struct { + basicCompositeNode + name *identNode + decls []*enumElement +} + +type enumElement struct { + // a discriminated union: only one field will be set + option *optionNode + value *enumValueNode + reserved *reservedNode + empty *basicNode +} + +func (n *enumElement) start() *SourcePos { + return n.get().start() +} + +func (n *enumElement) end() *SourcePos { + return n.get().end() +} + +func (n *enumElement) leadingComments() []comment { + return n.get().leadingComments() +} + +func (n *enumElement) trailingComments() []comment { + return n.get().trailingComments() +} + +func (n *enumElement) get() node { + switch { + case n.option != nil: + return n.option + case n.value != nil: + return n.value + default: + return n.empty + } +} + +type enumValueNode struct { + basicCompositeNode + name *identNode + options *compactOptionsNode + number *compoundIntNode +} + +func (n *enumValueNode) getName() node { + return n.name +} + +func (n *enumValueNode) getNumber() node { + return n.number +} + +type messageNode struct { + basicCompositeNode + name *identNode + decls []*messageElement +} + +func (n *messageNode) messageName() node { + return n.name +} + +type messageElement struct { + // a discriminated union: only one field will be set + option *optionNode + field *fieldNode + mapField *mapFieldNode + oneOf *oneOfNode + group *groupNode + nested *messageNode + enum *enumNode + extend *extendNode + extensionRange *extensionRangeNode + reserved *reservedNode + empty *basicNode +} + +func (n *messageElement) start() *SourcePos { + return n.get().start() +} + +func (n *messageElement) end() *SourcePos { + return n.get().end() +} + +func (n *messageElement) leadingComments() []comment { + return n.get().leadingComments() +} + +func (n *messageElement) trailingComments() []comment { + return n.get().trailingComments() +} + +func (n *messageElement) get() node { + switch { + case n.option != nil: + return n.option + case n.field != nil: + return n.field + case n.mapField != nil: + return n.mapField + case n.oneOf != nil: + return n.oneOf + case n.group != nil: + return n.group + case n.nested != nil: + return n.nested + case n.enum != nil: + return n.enum + case n.extend != nil: + return n.extend + case n.extensionRange != nil: + return n.extensionRange + case n.reserved != nil: + return n.reserved + default: + return n.empty + } +} + +type extendNode struct { + basicCompositeNode + extendee *compoundIdentNode + decls []*extendElement +} + +type extendElement struct { + // a discriminated union: only one field will be set + field *fieldNode + group *groupNode + empty *basicNode +} + +func (n *extendElement) start() *SourcePos { + return n.get().start() +} + +func (n *extendElement) end() *SourcePos { + return n.get().end() +} + +func (n *extendElement) leadingComments() []comment { + return n.get().leadingComments() +} + +func (n *extendElement) trailingComments() []comment { + return n.get().trailingComments() +} + +func (n *extendElement) get() node { + switch { + case n.field != nil: + return n.field + case n.group != nil: + return n.group + default: + return n.empty + } +} + +type serviceNode struct { + basicCompositeNode + name *identNode + decls []*serviceElement +} + +type serviceElement struct { + // a discriminated union: only one field will be set + option *optionNode + rpc *methodNode + empty *basicNode +} + +func (n *serviceElement) start() *SourcePos { + return n.get().start() +} + +func (n *serviceElement) end() *SourcePos { + return n.get().end() +} + +func (n *serviceElement) leadingComments() []comment { + return n.get().leadingComments() +} + +func (n *serviceElement) trailingComments() []comment { + return n.get().trailingComments() +} + +func (n *serviceElement) get() node { + switch { + case n.option != nil: + return n.option + case n.rpc != nil: + return n.rpc + default: + return n.empty + } +} + +type methodNode struct { + basicCompositeNode + name *identNode + input *rpcTypeNode + output *rpcTypeNode + options []*optionNode +} + +func (n *methodNode) getInputType() node { + return n.input.msgType +} + +func (n *methodNode) getOutputType() node { + return n.output.msgType +} + +type rpcTypeNode struct { + basicCompositeNode + msgType *compoundIdentNode + streamKeyword node +} + +type noSourceNode struct { + pos *SourcePos +} + +func (n noSourceNode) start() *SourcePos { + return n.pos +} + +func (n noSourceNode) end() *SourcePos { + return n.pos +} + +func (n noSourceNode) leadingComments() []comment { + return nil +} + +func (n noSourceNode) trailingComments() []comment { + return nil +} + +func (n noSourceNode) getSyntax() node { + return n +} + +func (n noSourceNode) getName() node { + return n +} + +func (n noSourceNode) getValue() valueNode { + return n +} + +func (n noSourceNode) fieldLabel() node { + return n +} + +func (n noSourceNode) fieldName() node { + return n +} + +func (n noSourceNode) fieldType() node { + return n +} + +func (n noSourceNode) fieldTag() node { + return n +} + +func (n noSourceNode) fieldExtendee() node { + return n +} + +func (n noSourceNode) getGroupKeyword() node { + return n +} + +func (n noSourceNode) rangeStart() node { + return n +} + +func (n noSourceNode) rangeEnd() node { + return n +} + +func (n noSourceNode) getNumber() node { + return n +} + +func (n noSourceNode) messageName() node { + return n +} + +func (n noSourceNode) getInputType() node { + return n +} + +func (n noSourceNode) getOutputType() node { + return n +} + +func (n noSourceNode) value() interface{} { + return nil +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/descriptor_protos.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/descriptor_protos.go new file mode 100644 index 00000000..6721375e --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/descriptor_protos.go @@ -0,0 +1,527 @@ +package protoparse + +import ( + "bytes" + "math" + "strings" + "unicode" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/desc/internal" +) + +func (r *parseResult) createFileDescriptor(filename string, file *fileNode) { + fd := &dpb.FileDescriptorProto{Name: proto.String(filename)} + r.fd = fd + r.putFileNode(fd, file) + + isProto3 := false + if file.syntax != nil { + if file.syntax.syntax.val == "proto3" { + isProto3 = true + } else if file.syntax.syntax.val != "proto2" { + if r.errs.handleErrorWithPos(file.syntax.syntax.start(), `syntax value must be "proto2" or "proto3"`) != nil { + return + } + } + + // proto2 is the default, so no need to set unless proto3 + if isProto3 { + fd.Syntax = proto.String(file.syntax.syntax.val) + } + } + + for _, decl := range file.decls { + if r.errs.err != nil { + return + } + if decl.enum != nil { + fd.EnumType = append(fd.EnumType, r.asEnumDescriptor(decl.enum)) + } else if decl.extend != nil { + r.addExtensions(decl.extend, &fd.Extension, &fd.MessageType, isProto3) + } else if decl.imp != nil { + file.imports = append(file.imports, decl.imp) + index := len(fd.Dependency) + fd.Dependency = append(fd.Dependency, decl.imp.name.val) + if decl.imp.public { + fd.PublicDependency = append(fd.PublicDependency, int32(index)) + } else if decl.imp.weak { + fd.WeakDependency = append(fd.WeakDependency, int32(index)) + } + } else if decl.message != nil { + fd.MessageType = append(fd.MessageType, r.asMessageDescriptor(decl.message, isProto3)) + } else if decl.option != nil { + if fd.Options == nil { + fd.Options = &dpb.FileOptions{} + } + fd.Options.UninterpretedOption = append(fd.Options.UninterpretedOption, r.asUninterpretedOption(decl.option)) + } else if decl.service != nil { + fd.Service = append(fd.Service, r.asServiceDescriptor(decl.service)) + } else if decl.pkg != nil { + if fd.Package != nil { + if r.errs.handleErrorWithPos(decl.pkg.start(), "files should have only one package declaration") != nil { + return + } + } + fd.Package = proto.String(decl.pkg.name.val) + } + } +} + +func (r *parseResult) asUninterpretedOptions(nodes []*optionNode) []*dpb.UninterpretedOption { + if len(nodes) == 0 { + return nil + } + opts := make([]*dpb.UninterpretedOption, len(nodes)) + for i, n := range nodes { + opts[i] = r.asUninterpretedOption(n) + } + return opts +} + +func (r *parseResult) asUninterpretedOption(node *optionNode) *dpb.UninterpretedOption { + opt := &dpb.UninterpretedOption{Name: r.asUninterpretedOptionName(node.name.parts)} + r.putOptionNode(opt, node) + + switch val := node.val.value().(type) { + case bool: + if val { + opt.IdentifierValue = proto.String("true") + } else { + opt.IdentifierValue = proto.String("false") + } + case int64: + opt.NegativeIntValue = proto.Int64(val) + case uint64: + opt.PositiveIntValue = proto.Uint64(val) + case float64: + opt.DoubleValue = proto.Float64(val) + case string: + opt.StringValue = []byte(val) + case identifier: + opt.IdentifierValue = proto.String(string(val)) + case []*aggregateEntryNode: + var buf bytes.Buffer + aggToString(val, &buf) + aggStr := buf.String() + opt.AggregateValue = proto.String(aggStr) + } + return opt +} + +func (r *parseResult) asUninterpretedOptionName(parts []*optionNamePartNode) []*dpb.UninterpretedOption_NamePart { + ret := make([]*dpb.UninterpretedOption_NamePart, len(parts)) + for i, part := range parts { + txt := part.text.val + if !part.isExtension { + txt = part.text.val[part.offset : part.offset+part.length] + } + np := &dpb.UninterpretedOption_NamePart{ + NamePart: proto.String(txt), + IsExtension: proto.Bool(part.isExtension), + } + r.putOptionNamePartNode(np, part) + ret[i] = np + } + return ret +} + +func (r *parseResult) addExtensions(ext *extendNode, flds *[]*dpb.FieldDescriptorProto, msgs *[]*dpb.DescriptorProto, isProto3 bool) { + extendee := ext.extendee.val + count := 0 + for _, decl := range ext.decls { + if decl.field != nil { + count++ + decl.field.extendee = ext + // use higher limit since we don't know yet whether extendee is messageset wire format + fd := r.asFieldDescriptor(decl.field, internal.MaxTag) + fd.Extendee = proto.String(extendee) + *flds = append(*flds, fd) + } else if decl.group != nil { + count++ + decl.group.extendee = ext + // ditto: use higher limit right now + fd, md := r.asGroupDescriptors(decl.group, isProto3, internal.MaxTag) + fd.Extendee = proto.String(extendee) + *flds = append(*flds, fd) + *msgs = append(*msgs, md) + } + } + if count == 0 { + _ = r.errs.handleErrorWithPos(ext.start(), "extend sections must define at least one extension") + } +} + +func asLabel(lbl *fieldLabel) *dpb.FieldDescriptorProto_Label { + if lbl.identNode == nil { + return nil + } + switch { + case lbl.repeated: + return dpb.FieldDescriptorProto_LABEL_REPEATED.Enum() + case lbl.required: + return dpb.FieldDescriptorProto_LABEL_REQUIRED.Enum() + default: + return dpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum() + } +} + +func (r *parseResult) asFieldDescriptor(node *fieldNode, maxTag int32) *dpb.FieldDescriptorProto { + tag := node.tag.val + if err := checkTag(node.tag.start(), tag, maxTag); err != nil { + _ = r.errs.handleError(err) + } + fd := newFieldDescriptor(node.name.val, node.fldType.val, int32(tag), asLabel(&node.label)) + r.putFieldNode(fd, node) + if opts := node.options.Elements(); len(opts) > 0 { + fd.Options = &dpb.FieldOptions{UninterpretedOption: r.asUninterpretedOptions(opts)} + } + return fd +} + +var fieldTypes = map[string]dpb.FieldDescriptorProto_Type{ + "double": dpb.FieldDescriptorProto_TYPE_DOUBLE, + "float": dpb.FieldDescriptorProto_TYPE_FLOAT, + "int32": dpb.FieldDescriptorProto_TYPE_INT32, + "int64": dpb.FieldDescriptorProto_TYPE_INT64, + "uint32": dpb.FieldDescriptorProto_TYPE_UINT32, + "uint64": dpb.FieldDescriptorProto_TYPE_UINT64, + "sint32": dpb.FieldDescriptorProto_TYPE_SINT32, + "sint64": dpb.FieldDescriptorProto_TYPE_SINT64, + "fixed32": dpb.FieldDescriptorProto_TYPE_FIXED32, + "fixed64": dpb.FieldDescriptorProto_TYPE_FIXED64, + "sfixed32": dpb.FieldDescriptorProto_TYPE_SFIXED32, + "sfixed64": dpb.FieldDescriptorProto_TYPE_SFIXED64, + "bool": dpb.FieldDescriptorProto_TYPE_BOOL, + "string": dpb.FieldDescriptorProto_TYPE_STRING, + "bytes": dpb.FieldDescriptorProto_TYPE_BYTES, +} + +func newFieldDescriptor(name string, fieldType string, tag int32, lbl *dpb.FieldDescriptorProto_Label) *dpb.FieldDescriptorProto { + fd := &dpb.FieldDescriptorProto{ + Name: proto.String(name), + JsonName: proto.String(internal.JsonName(name)), + Number: proto.Int32(tag), + Label: lbl, + } + t, ok := fieldTypes[fieldType] + if ok { + fd.Type = t.Enum() + } else { + // NB: we don't have enough info to determine whether this is an enum + // or a message type, so we'll leave Type nil and set it later + // (during linking) + fd.TypeName = proto.String(fieldType) + } + return fd +} + +func (r *parseResult) asGroupDescriptors(group *groupNode, isProto3 bool, maxTag int32) (*dpb.FieldDescriptorProto, *dpb.DescriptorProto) { + tag := group.tag.val + if err := checkTag(group.tag.start(), tag, maxTag); err != nil { + _ = r.errs.handleError(err) + } + if !unicode.IsUpper(rune(group.name.val[0])) { + _ = r.errs.handleErrorWithPos(group.name.start(), "group %s should have a name that starts with a capital letter", group.name.val) + } + fieldName := strings.ToLower(group.name.val) + fd := &dpb.FieldDescriptorProto{ + Name: proto.String(fieldName), + JsonName: proto.String(internal.JsonName(fieldName)), + Number: proto.Int32(int32(tag)), + Label: asLabel(&group.label), + Type: dpb.FieldDescriptorProto_TYPE_GROUP.Enum(), + TypeName: proto.String(group.name.val), + } + r.putFieldNode(fd, group) + if opts := group.options.Elements(); len(opts) > 0 { + fd.Options = &dpb.FieldOptions{UninterpretedOption: r.asUninterpretedOptions(opts)} + } + md := &dpb.DescriptorProto{Name: proto.String(group.name.val)} + r.putMessageNode(md, group) + r.addMessageDecls(md, group.decls, isProto3) + return fd, md +} + +func (r *parseResult) asMapDescriptors(mapField *mapFieldNode, isProto3 bool, maxTag int32) (*dpb.FieldDescriptorProto, *dpb.DescriptorProto) { + tag := mapField.tag.val + if err := checkTag(mapField.tag.start(), tag, maxTag); err != nil { + _ = r.errs.handleError(err) + } + var lbl *dpb.FieldDescriptorProto_Label + if !isProto3 { + lbl = dpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum() + } + keyFd := newFieldDescriptor("key", mapField.mapType.keyType.val, 1, lbl) + r.putFieldNode(keyFd, mapField.keyField()) + valFd := newFieldDescriptor("value", mapField.mapType.valueType.val, 2, lbl) + r.putFieldNode(valFd, mapField.valueField()) + entryName := internal.InitCap(internal.JsonName(mapField.name.val)) + "Entry" + fd := newFieldDescriptor(mapField.name.val, entryName, int32(tag), dpb.FieldDescriptorProto_LABEL_REPEATED.Enum()) + if opts := mapField.options.Elements(); len(opts) > 0 { + fd.Options = &dpb.FieldOptions{UninterpretedOption: r.asUninterpretedOptions(opts)} + } + r.putFieldNode(fd, mapField) + md := &dpb.DescriptorProto{ + Name: proto.String(entryName), + Options: &dpb.MessageOptions{MapEntry: proto.Bool(true)}, + Field: []*dpb.FieldDescriptorProto{keyFd, valFd}, + } + r.putMessageNode(md, mapField) + return fd, md +} + +func (r *parseResult) asExtensionRanges(node *extensionRangeNode, maxTag int32) []*dpb.DescriptorProto_ExtensionRange { + opts := r.asUninterpretedOptions(node.options.Elements()) + ers := make([]*dpb.DescriptorProto_ExtensionRange, len(node.ranges)) + for i, rng := range node.ranges { + start, end := getRangeBounds(r, rng, 0, maxTag) + er := &dpb.DescriptorProto_ExtensionRange{ + Start: proto.Int32(start), + End: proto.Int32(end + 1), + } + if len(opts) > 0 { + er.Options = &dpb.ExtensionRangeOptions{UninterpretedOption: opts} + } + r.putExtensionRangeNode(er, rng) + ers[i] = er + } + return ers +} + +func (r *parseResult) asEnumValue(ev *enumValueNode) *dpb.EnumValueDescriptorProto { + num, ok := ev.number.asInt32(math.MinInt32, math.MaxInt32) + if !ok { + _ = r.errs.handleErrorWithPos(ev.number.start(), "value %d is out of range: should be between %d and %d", ev.number.value(), math.MinInt32, math.MaxInt32) + } + evd := &dpb.EnumValueDescriptorProto{Name: proto.String(ev.name.val), Number: proto.Int32(num)} + r.putEnumValueNode(evd, ev) + if opts := ev.options.Elements(); len(opts) > 0 { + evd.Options = &dpb.EnumValueOptions{UninterpretedOption: r.asUninterpretedOptions(opts)} + } + return evd +} + +func (r *parseResult) asMethodDescriptor(node *methodNode) *dpb.MethodDescriptorProto { + md := &dpb.MethodDescriptorProto{ + Name: proto.String(node.name.val), + InputType: proto.String(node.input.msgType.val), + OutputType: proto.String(node.output.msgType.val), + } + r.putMethodNode(md, node) + if node.input.streamKeyword != nil { + md.ClientStreaming = proto.Bool(true) + } + if node.output.streamKeyword != nil { + md.ServerStreaming = proto.Bool(true) + } + // protoc always adds a MethodOptions if there are brackets + // We have a non-nil node.options if there are brackets + // We do the same to match protoc as closely as possible + // https://github.com/protocolbuffers/protobuf/blob/0c3f43a6190b77f1f68b7425d1b7e1a8257a8d0c/src/google/protobuf/compiler/parser.cc#L2152 + if node.options != nil { + md.Options = &dpb.MethodOptions{UninterpretedOption: r.asUninterpretedOptions(node.options)} + } + return md +} + +func (r *parseResult) asEnumDescriptor(en *enumNode) *dpb.EnumDescriptorProto { + ed := &dpb.EnumDescriptorProto{Name: proto.String(en.name.val)} + r.putEnumNode(ed, en) + for _, decl := range en.decls { + if decl.option != nil { + if ed.Options == nil { + ed.Options = &dpb.EnumOptions{} + } + ed.Options.UninterpretedOption = append(ed.Options.UninterpretedOption, r.asUninterpretedOption(decl.option)) + } else if decl.value != nil { + ed.Value = append(ed.Value, r.asEnumValue(decl.value)) + } else if decl.reserved != nil { + for _, n := range decl.reserved.names { + ed.ReservedName = append(ed.ReservedName, n.val) + } + for _, rng := range decl.reserved.ranges { + ed.ReservedRange = append(ed.ReservedRange, r.asEnumReservedRange(rng)) + } + } + } + return ed +} + +func (r *parseResult) asEnumReservedRange(rng *rangeNode) *dpb.EnumDescriptorProto_EnumReservedRange { + start, end := getRangeBounds(r, rng, math.MinInt32, math.MaxInt32) + rr := &dpb.EnumDescriptorProto_EnumReservedRange{ + Start: proto.Int32(start), + End: proto.Int32(end), + } + r.putEnumReservedRangeNode(rr, rng) + return rr +} + +func (r *parseResult) asMessageDescriptor(node *messageNode, isProto3 bool) *dpb.DescriptorProto { + msgd := &dpb.DescriptorProto{Name: proto.String(node.name.val)} + r.putMessageNode(msgd, node) + r.addMessageDecls(msgd, node.decls, isProto3) + return msgd +} + +func (r *parseResult) addMessageDecls(msgd *dpb.DescriptorProto, decls []*messageElement, isProto3 bool) { + // first process any options + for _, decl := range decls { + if decl.option != nil { + if msgd.Options == nil { + msgd.Options = &dpb.MessageOptions{} + } + msgd.Options.UninterpretedOption = append(msgd.Options.UninterpretedOption, r.asUninterpretedOption(decl.option)) + } + } + + // now that we have options, we can see if this uses messageset wire format, which + // impacts how we validate tag numbers in any fields in the message + maxTag := int32(internal.MaxNormalTag) + if isMessageSet, err := isMessageSetWireFormat(r, "message "+msgd.GetName(), msgd); err != nil { + return + } else if isMessageSet { + maxTag = internal.MaxTag // higher limit for messageset wire format + } + + rsvdNames := map[string]int{} + + // now we can process the rest + for _, decl := range decls { + if decl.enum != nil { + msgd.EnumType = append(msgd.EnumType, r.asEnumDescriptor(decl.enum)) + } else if decl.extend != nil { + r.addExtensions(decl.extend, &msgd.Extension, &msgd.NestedType, isProto3) + } else if decl.extensionRange != nil { + msgd.ExtensionRange = append(msgd.ExtensionRange, r.asExtensionRanges(decl.extensionRange, maxTag)...) + } else if decl.field != nil { + msgd.Field = append(msgd.Field, r.asFieldDescriptor(decl.field, maxTag)) + } else if decl.mapField != nil { + fd, md := r.asMapDescriptors(decl.mapField, isProto3, maxTag) + msgd.Field = append(msgd.Field, fd) + msgd.NestedType = append(msgd.NestedType, md) + } else if decl.group != nil { + fd, md := r.asGroupDescriptors(decl.group, isProto3, maxTag) + msgd.Field = append(msgd.Field, fd) + msgd.NestedType = append(msgd.NestedType, md) + } else if decl.oneOf != nil { + oodIndex := len(msgd.OneofDecl) + ood := &dpb.OneofDescriptorProto{Name: proto.String(decl.oneOf.name.val)} + r.putOneOfNode(ood, decl.oneOf) + msgd.OneofDecl = append(msgd.OneofDecl, ood) + ooFields := 0 + for _, oodecl := range decl.oneOf.decls { + if oodecl.option != nil { + if ood.Options == nil { + ood.Options = &dpb.OneofOptions{} + } + ood.Options.UninterpretedOption = append(ood.Options.UninterpretedOption, r.asUninterpretedOption(oodecl.option)) + } else if oodecl.field != nil { + fd := r.asFieldDescriptor(oodecl.field, maxTag) + fd.OneofIndex = proto.Int32(int32(oodIndex)) + msgd.Field = append(msgd.Field, fd) + ooFields++ + } else if oodecl.group != nil { + fd, md := r.asGroupDescriptors(oodecl.group, isProto3, maxTag) + fd.OneofIndex = proto.Int32(int32(oodIndex)) + msgd.Field = append(msgd.Field, fd) + msgd.NestedType = append(msgd.NestedType, md) + ooFields++ + } + } + if ooFields == 0 { + _ = r.errs.handleErrorWithPos(decl.oneOf.start(), "oneof must contain at least one field") + } + } else if decl.nested != nil { + msgd.NestedType = append(msgd.NestedType, r.asMessageDescriptor(decl.nested, isProto3)) + } else if decl.reserved != nil { + for _, n := range decl.reserved.names { + count := rsvdNames[n.val] + if count == 1 { // already seen + _ = r.errs.handleErrorWithPos(n.start(), "name %q is reserved multiple times", n.val) + } + rsvdNames[n.val] = count + 1 + msgd.ReservedName = append(msgd.ReservedName, n.val) + } + for _, rng := range decl.reserved.ranges { + msgd.ReservedRange = append(msgd.ReservedRange, r.asMessageReservedRange(rng, maxTag)) + } + } + } +} + +func isMessageSetWireFormat(res *parseResult, scope string, md *dpb.DescriptorProto) (bool, error) { + uo := md.GetOptions().GetUninterpretedOption() + index, err := findOption(res, scope, uo, "message_set_wire_format") + if err != nil { + return false, err + } + if index == -1 { + // no such option, so default to false + return false, nil + } + + opt := uo[index] + optNode := res.getOptionNode(opt) + + switch opt.GetIdentifierValue() { + case "true": + return true, nil + case "false": + return false, nil + default: + return false, res.errs.handleErrorWithPos(optNode.getValue().start(), "%s: expecting bool value for message_set_wire_format option", scope) + } +} + +func (r *parseResult) asMessageReservedRange(rng *rangeNode, maxTag int32) *dpb.DescriptorProto_ReservedRange { + start, end := getRangeBounds(r, rng, 0, maxTag) + rr := &dpb.DescriptorProto_ReservedRange{ + Start: proto.Int32(start), + End: proto.Int32(end + 1), + } + r.putMessageReservedRangeNode(rr, rng) + return rr +} + +func getRangeBounds(res *parseResult, rng *rangeNode, minVal, maxVal int32) (int32, int32) { + checkOrder := true + start, ok := rng.startValueAsInt32(minVal, maxVal) + if !ok { + checkOrder = false + _ = res.errs.handleErrorWithPos(rng.startNode.start(), "range start %d is out of range: should be between %d and %d", rng.startValue(), minVal, maxVal) + } + + end, ok := rng.endValueAsInt32(minVal, maxVal) + if !ok { + checkOrder = false + if rng.endNode != nil { + _ = res.errs.handleErrorWithPos(rng.endNode.start(), "range end %d is out of range: should be between %d and %d", rng.endValue(), minVal, maxVal) + } + } + + if checkOrder && start > end { + _ = res.errs.handleErrorWithPos(rng.rangeStart().start(), "range, %d to %d, is invalid: start must be <= end", start, end) + } + + return start, end +} + +func (r *parseResult) asServiceDescriptor(svc *serviceNode) *dpb.ServiceDescriptorProto { + sd := &dpb.ServiceDescriptorProto{Name: proto.String(svc.name.val)} + r.putServiceNode(sd, svc) + for _, decl := range svc.decls { + if decl.option != nil { + if sd.Options == nil { + sd.Options = &dpb.ServiceOptions{} + } + sd.Options.UninterpretedOption = append(sd.Options.UninterpretedOption, r.asUninterpretedOption(decl.option)) + } else if decl.rpc != nil { + sd.Method = append(sd.Method, r.asMethodDescriptor(decl.rpc)) + } + } + return sd +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/doc.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/doc.go new file mode 100644 index 00000000..c6446d34 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/doc.go @@ -0,0 +1,10 @@ +// Package protoparse provides functionality for parsing *.proto source files +// into descriptors that can be used with other protoreflect packages, like +// dynamic messages and dynamic GRPC clients. +// +// This package links in other packages that include compiled descriptors for +// the various "google/protobuf/*.proto" files that are included with protoc. +// That way, like when invoking protoc, programs need not supply copies of these +// "builtin" files. Though if copies of the files are provided, they will be +// used instead of the builtin descriptors. +package protoparse diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/errors.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/errors.go new file mode 100644 index 00000000..cdad17ff --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/errors.go @@ -0,0 +1,117 @@ +package protoparse + +import ( + "errors" + "fmt" +) + +// ErrInvalidSource is a sentinel error that is returned by calls to +// Parser.ParseFiles and Parser.ParseFilesButDoNotLink in the event that syntax +// or link errors are encountered, but the parser's configured ErrorReporter +// always returns nil. +var ErrInvalidSource = errors.New("parse failed: invalid proto source") + +// ErrorReporter is responsible for reporting the given error. If the reporter +// returns a non-nil error, parsing/linking will abort with that error. If the +// reporter returns nil, parsing will continue, allowing the parser to try to +// report as many syntax and/or link errors as it can find. +type ErrorReporter func(err ErrorWithPos) error + +func defaultErrorReporter(err ErrorWithPos) error { + // abort parsing after first error encountered + return err +} + +type errorHandler struct { + reporter ErrorReporter + errsReported int + err error +} + +func newErrorHandler(reporter ErrorReporter) *errorHandler { + if reporter == nil { + reporter = defaultErrorReporter + } + return &errorHandler{ + reporter: reporter, + } +} + +func (h *errorHandler) handleErrorWithPos(pos *SourcePos, format string, args ...interface{}) error { + if h.err != nil { + return h.err + } + h.errsReported++ + err := h.reporter(errorWithPos(pos, format, args...)) + h.err = err + return err +} + +func (h *errorHandler) handleError(err error) error { + if h.err != nil { + return h.err + } + if ewp, ok := err.(ErrorWithPos); ok { + h.errsReported++ + err = h.reporter(ewp) + } + h.err = err + return err +} + +func (h *errorHandler) getError() error { + if h.errsReported > 0 && h.err == nil { + return ErrInvalidSource + } + return h.err +} + +// ErrorWithPos is an error about a proto source file that includes information +// about the location in the file that caused the error. +// +// The value of Error() will contain both the SourcePos and Underlying error. +// The value of Unwrap() will only be the Underlying error. +type ErrorWithPos interface { + error + GetPosition() SourcePos + Unwrap() error +} + +// ErrorWithSourcePos is an error about a proto source file that includes +// information about the location in the file that caused the error. +// +// Errors that include source location information *might* be of this type. +// However, calling code that is trying to examine errors with location info +// should instead look for instances of the ErrorWithPos interface, which +// will find other kinds of errors. This type is only exported for backwards +// compatibility. +type ErrorWithSourcePos struct { + Underlying error + Pos *SourcePos +} + +// Error implements the error interface +func (e ErrorWithSourcePos) Error() string { + if e.Pos.Line <= 0 || e.Pos.Col <= 0 { + return fmt.Sprintf("%s: %v", e.Pos.Filename, e.Underlying) + } + return fmt.Sprintf("%s:%d:%d: %v", e.Pos.Filename, e.Pos.Line, e.Pos.Col, e.Underlying) +} + +// GetPosition implements the ErrorWithPos interface, supplying a location in +// proto source that caused the error. +func (e ErrorWithSourcePos) GetPosition() SourcePos { + return *e.Pos +} + +// Unwrap implements the ErrorWithPos interface, supplying the underlying +// error. This error will not include location information. +func (e ErrorWithSourcePos) Unwrap() error { + return e.Underlying +} + +var _ ErrorWithPos = ErrorWithSourcePos{} + +func errorWithPos(pos *SourcePos, format string, args ...interface{}) ErrorWithPos { + return ErrorWithSourcePos{Pos: pos, Underlying: fmt.Errorf(format, args...)} +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/lexer.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/lexer.go new file mode 100644 index 00000000..0a697bae --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/lexer.go @@ -0,0 +1,781 @@ +package protoparse + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "strconv" + "strings" + "unicode/utf8" +) + +type runeReader struct { + rr *bufio.Reader + unread []rune + err error +} + +func (rr *runeReader) readRune() (r rune, size int, err error) { + if rr.err != nil { + return 0, 0, rr.err + } + if len(rr.unread) > 0 { + r := rr.unread[len(rr.unread)-1] + rr.unread = rr.unread[:len(rr.unread)-1] + return r, utf8.RuneLen(r), nil + } + r, sz, err := rr.rr.ReadRune() + if err != nil { + rr.err = err + } + return r, sz, err +} + +func (rr *runeReader) unreadRune(r rune) { + rr.unread = append(rr.unread, r) +} + +func lexError(l protoLexer, pos *SourcePos, err string) { + pl := l.(*protoLex) + _ = pl.errs.handleErrorWithPos(pos, err) +} + +type protoLex struct { + filename string + input *runeReader + errs *errorHandler + res *fileNode + + lineNo int + colNo int + offset int + + prevSym terminalNode + + prevLineNo int + prevColNo int + prevOffset int + comments []comment +} + +func newTestLexer(in io.Reader) *protoLex { + return newLexer(in, "test.proto", newErrorHandler(nil)) +} + +func newLexer(in io.Reader, filename string, errs *errorHandler) *protoLex { + return &protoLex{ + input: &runeReader{rr: bufio.NewReader(in)}, + filename: filename, + errs: errs, + } +} + +var keywords = map[string]int{ + "syntax": _SYNTAX, + "import": _IMPORT, + "weak": _WEAK, + "public": _PUBLIC, + "package": _PACKAGE, + "option": _OPTION, + "true": _TRUE, + "false": _FALSE, + "inf": _INF, + "nan": _NAN, + "repeated": _REPEATED, + "optional": _OPTIONAL, + "required": _REQUIRED, + "double": _DOUBLE, + "float": _FLOAT, + "int32": _INT32, + "int64": _INT64, + "uint32": _UINT32, + "uint64": _UINT64, + "sint32": _SINT32, + "sint64": _SINT64, + "fixed32": _FIXED32, + "fixed64": _FIXED64, + "sfixed32": _SFIXED32, + "sfixed64": _SFIXED64, + "bool": _BOOL, + "string": _STRING, + "bytes": _BYTES, + "group": _GROUP, + "oneof": _ONEOF, + "map": _MAP, + "extensions": _EXTENSIONS, + "to": _TO, + "max": _MAX, + "reserved": _RESERVED, + "enum": _ENUM, + "message": _MESSAGE, + "extend": _EXTEND, + "service": _SERVICE, + "rpc": _RPC, + "stream": _STREAM, + "returns": _RETURNS, +} + +func (l *protoLex) cur() SourcePos { + return SourcePos{ + Filename: l.filename, + Offset: l.offset, + Line: l.lineNo + 1, + Col: l.colNo + 1, + } +} + +func (l *protoLex) adjustPos(consumedChars ...rune) { + for _, c := range consumedChars { + switch c { + case '\n': + // new line, back to first column + l.colNo = 0 + l.lineNo++ + case '\r': + // no adjustment + case '\t': + // advance to next tab stop + mod := l.colNo % 8 + l.colNo += 8 - mod + default: + l.colNo++ + } + } +} + +func (l *protoLex) prev() *SourcePos { + if l.prevSym == nil { + return &SourcePos{ + Filename: l.filename, + Offset: 0, + Line: 1, + Col: 1, + } + } + return l.prevSym.start() +} + +func (l *protoLex) Lex(lval *protoSymType) int { + if l.errs.err != nil { + // if error reporter already returned non-nil error, + // we can skip the rest of the input + return 0 + } + + l.prevLineNo = l.lineNo + l.prevColNo = l.colNo + l.prevOffset = l.offset + l.comments = nil + + for { + c, n, err := l.input.readRune() + if err == io.EOF { + // we're not actually returning a rune, but this will associate + // accumulated comments as a trailing comment on last symbol + // (if appropriate) + l.setRune(lval) + return 0 + } else if err != nil { + // we don't call setError because we don't want it wrapped + // with a source position because it's I/O, not syntax + lval.err = err + _ = l.errs.handleError(err) + return _ERROR + } + + l.prevLineNo = l.lineNo + l.prevColNo = l.colNo + l.prevOffset = l.offset + + l.offset += n + l.adjustPos(c) + if strings.ContainsRune("\n\r\t ", c) { + continue + } + + if c == '.' { + // decimal literals could start with a dot + cn, _, err := l.input.readRune() + if err != nil { + l.setDot(lval) + return int(c) + } + if cn >= '0' && cn <= '9' { + l.adjustPos(cn) + token := []rune{c, cn} + token = l.readNumber(token, false, true) + f, err := strconv.ParseFloat(string(token), 64) + if err != nil { + l.setError(lval, err) + return _ERROR + } + l.setFloat(lval, f) + return _FLOAT_LIT + } + l.input.unreadRune(cn) + l.setDot(lval) + return int(c) + } + + if c == '_' || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') { + // identifier + token := []rune{c} + token = l.readIdentifier(token) + str := string(token) + if t, ok := keywords[str]; ok { + l.setIdent(lval, str) + return t + } + l.setIdent(lval, str) + return _NAME + } + + if c >= '0' && c <= '9' { + // integer or float literal + if c == '0' { + cn, _, err := l.input.readRune() + if err != nil { + l.setInt(lval, 0) + return _INT_LIT + } + if cn == 'x' || cn == 'X' { + cnn, _, err := l.input.readRune() + if err != nil { + l.input.unreadRune(cn) + l.setInt(lval, 0) + return _INT_LIT + } + if (cnn >= '0' && cnn <= '9') || (cnn >= 'a' && cnn <= 'f') || (cnn >= 'A' && cnn <= 'F') { + // hexadecimal! + l.adjustPos(cn, cnn) + token := []rune{cnn} + token = l.readHexNumber(token) + ui, err := strconv.ParseUint(string(token), 16, 64) + if err != nil { + l.setError(lval, err) + return _ERROR + } + l.setInt(lval, ui) + return _INT_LIT + } + l.input.unreadRune(cnn) + l.input.unreadRune(cn) + l.setInt(lval, 0) + return _INT_LIT + } else { + l.input.unreadRune(cn) + } + } + token := []rune{c} + token = l.readNumber(token, true, true) + numstr := string(token) + if strings.Contains(numstr, ".") || strings.Contains(numstr, "e") || strings.Contains(numstr, "E") { + // floating point! + f, err := strconv.ParseFloat(numstr, 64) + if err != nil { + l.setError(lval, err) + return _ERROR + } + l.setFloat(lval, f) + return _FLOAT_LIT + } + // integer! (decimal or octal) + ui, err := strconv.ParseUint(numstr, 0, 64) + if err != nil { + if numErr, ok := err.(*strconv.NumError); ok && numErr.Err == strconv.ErrRange { + // if it's too big to be an int, parse it as a float + var f float64 + f, err = strconv.ParseFloat(numstr, 64) + if err == nil { + l.setFloat(lval, f) + return _FLOAT_LIT + } + } + l.setError(lval, err) + return _ERROR + } + l.setInt(lval, ui) + return _INT_LIT + } + + if c == '\'' || c == '"' { + // string literal + str, err := l.readStringLiteral(c) + if err != nil { + l.setError(lval, err) + return _ERROR + } + l.setString(lval, str) + return _STRING_LIT + } + + if c == '/' { + // comment + cn, _, err := l.input.readRune() + if err != nil { + l.setRune(lval) + return int(c) + } + if cn == '/' { + l.adjustPos(cn) + hitNewline, txt := l.skipToEndOfLineComment() + commentPos := l.posRange() + commentPos.end.Col++ + if hitNewline { + // we don't do this inside of skipToEndOfLineComment + // because we want to know the length of previous + // line for calculation above + l.adjustPos('\n') + } + l.comments = append(l.comments, comment{posRange: commentPos, text: txt}) + continue + } + if cn == '*' { + l.adjustPos(cn) + if txt, ok := l.skipToEndOfBlockComment(); !ok { + l.setError(lval, errors.New("block comment never terminates, unexpected EOF")) + return _ERROR + } else { + l.comments = append(l.comments, comment{posRange: l.posRange(), text: txt}) + } + continue + } + l.input.unreadRune(cn) + } + + l.setRune(lval) + return int(c) + } +} + +func (l *protoLex) posRange() posRange { + return posRange{ + start: SourcePos{ + Filename: l.filename, + Offset: l.prevOffset, + Line: l.prevLineNo + 1, + Col: l.prevColNo + 1, + }, + end: l.cur(), + } +} + +func (l *protoLex) newBasicNode() basicNode { + return basicNode{ + posRange: l.posRange(), + leading: l.comments, + } +} + +func (l *protoLex) setPrev(n terminalNode, isDot bool) { + nStart := n.start().Line + if _, ok := n.(*basicNode); ok { + // This is really gross, but there are many cases where we don't want + // to attribute comments to punctuation (like commas, equals, semicolons) + // and would instead prefer to attribute comments to a more meaningful + // element in the AST. + // + // So if it's a simple node OTHER THAN PERIOD (since that is not just + // punctuation but typically part of a qualified identifier), don't + // attribute comments to it. We do that with this TOTAL HACK: adjusting + // the start line makes leading comments appear detached so logic below + // will naturally associated trailing comment to previous symbol + if !isDot { + nStart += 2 + } + } + if l.prevSym != nil && len(n.leadingComments()) > 0 && l.prevSym.end().Line < nStart { + // we may need to re-attribute the first comment to + // instead be previous node's trailing comment + prevEnd := l.prevSym.end().Line + comments := n.leadingComments() + c := comments[0] + commentStart := c.start.Line + if commentStart == prevEnd { + // comment is on same line as previous symbol + n.popLeadingComment() + l.prevSym.pushTrailingComment(c) + } else if commentStart == prevEnd+1 { + // comment is right after previous symbol; see if it is detached + // and if so re-attribute + singleLineStyle := strings.HasPrefix(c.text, "//") + line := c.end.Line + groupEnd := -1 + for i := 1; i < len(comments); i++ { + c := comments[i] + newGroup := false + if !singleLineStyle || c.start.Line > line+1 { + // we've found a gap between comments, which means the + // previous comments were detached + newGroup = true + } else { + line = c.end.Line + singleLineStyle = strings.HasPrefix(comments[i].text, "//") + if !singleLineStyle { + // we've found a switch from // comments to /* + // consider that a new group which means the + // previous comments were detached + newGroup = true + } + } + if newGroup { + groupEnd = i + break + } + } + + if groupEnd == -1 { + // just one group of comments; we'll mark it as a trailing + // comment if it immediately follows previous symbol and is + // detached from current symbol + c1 := comments[0] + c2 := comments[len(comments)-1] + if c1.start.Line <= prevEnd+1 && c2.end.Line < nStart-1 { + groupEnd = len(comments) + } + } + + for i := 0; i < groupEnd; i++ { + l.prevSym.pushTrailingComment(n.popLeadingComment()) + } + } + } + + l.prevSym = n +} + +func (l *protoLex) setString(lval *protoSymType, val string) { + lval.s = &stringLiteralNode{basicNode: l.newBasicNode(), val: val} + l.setPrev(lval.s, false) +} + +func (l *protoLex) setIdent(lval *protoSymType, val string) { + lval.id = &identNode{basicNode: l.newBasicNode(), val: val} + l.setPrev(lval.id, false) +} + +func (l *protoLex) setInt(lval *protoSymType, val uint64) { + lval.i = &intLiteralNode{basicNode: l.newBasicNode(), val: val} + l.setPrev(lval.i, false) +} + +func (l *protoLex) setFloat(lval *protoSymType, val float64) { + lval.f = &floatLiteralNode{basicNode: l.newBasicNode(), val: val} + l.setPrev(lval.f, false) +} + +func (l *protoLex) setRune(lval *protoSymType) { + b := l.newBasicNode() + lval.b = &b + l.setPrev(lval.b, false) +} + +func (l *protoLex) setDot(lval *protoSymType) { + b := l.newBasicNode() + lval.b = &b + l.setPrev(lval.b, true) +} + +func (l *protoLex) setError(lval *protoSymType, err error) { + lval.err = l.addSourceError(err) +} + +func (l *protoLex) readNumber(sofar []rune, allowDot bool, allowExp bool) []rune { + token := sofar + for { + c, _, err := l.input.readRune() + if err != nil { + break + } + if c == '.' { + if !allowDot { + l.input.unreadRune(c) + break + } + allowDot = false + } else if c == 'e' || c == 'E' { + if !allowExp { + l.input.unreadRune(c) + break + } + allowExp = false + cn, _, err := l.input.readRune() + if err != nil { + l.input.unreadRune(c) + break + } + if cn == '-' || cn == '+' { + cnn, _, err := l.input.readRune() + if err != nil { + l.input.unreadRune(cn) + l.input.unreadRune(c) + break + } + if cnn < '0' || cnn > '9' { + l.input.unreadRune(cnn) + l.input.unreadRune(cn) + l.input.unreadRune(c) + break + } + l.adjustPos(c) + token = append(token, c) + c, cn = cn, cnn + } else if cn < '0' || cn > '9' { + l.input.unreadRune(cn) + l.input.unreadRune(c) + break + } + l.adjustPos(c) + token = append(token, c) + c = cn + } else if c < '0' || c > '9' { + l.input.unreadRune(c) + break + } + l.adjustPos(c) + token = append(token, c) + } + return token +} + +func (l *protoLex) readHexNumber(sofar []rune) []rune { + token := sofar + for { + c, _, err := l.input.readRune() + if err != nil { + break + } + if (c < 'a' || c > 'f') && (c < 'A' || c > 'F') && (c < '0' || c > '9') { + l.input.unreadRune(c) + break + } + l.adjustPos(c) + token = append(token, c) + } + return token +} + +func (l *protoLex) readIdentifier(sofar []rune) []rune { + token := sofar + for { + c, _, err := l.input.readRune() + if err != nil { + break + } + if c != '_' && (c < 'a' || c > 'z') && (c < 'A' || c > 'Z') && (c < '0' || c > '9') { + l.input.unreadRune(c) + break + } + l.adjustPos(c) + token = append(token, c) + } + return token +} + +func (l *protoLex) readStringLiteral(quote rune) (string, error) { + var buf bytes.Buffer + for { + c, _, err := l.input.readRune() + if err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + return "", err + } + if c == '\n' { + return "", errors.New("encountered end-of-line before end of string literal") + } + l.adjustPos(c) + if c == quote { + break + } + if c == 0 { + return "", errors.New("null character ('\\0') not allowed in string literal") + } + if c == '\\' { + // escape sequence + c, _, err = l.input.readRune() + if err != nil { + return "", err + } + l.adjustPos(c) + if c == 'x' || c == 'X' { + // hex escape + c, _, err := l.input.readRune() + if err != nil { + return "", err + } + l.adjustPos(c) + c2, _, err := l.input.readRune() + if err != nil { + return "", err + } + var hex string + if (c2 < '0' || c2 > '9') && (c2 < 'a' || c2 > 'f') && (c2 < 'A' || c2 > 'F') { + l.input.unreadRune(c2) + hex = string(c) + } else { + l.adjustPos(c2) + hex = string([]rune{c, c2}) + } + i, err := strconv.ParseInt(hex, 16, 32) + if err != nil { + return "", fmt.Errorf("invalid hex escape: \\x%q", hex) + } + buf.WriteByte(byte(i)) + + } else if c >= '0' && c <= '7' { + // octal escape + c2, _, err := l.input.readRune() + if err != nil { + return "", err + } + var octal string + if c2 < '0' || c2 > '7' { + l.input.unreadRune(c2) + octal = string(c) + } else { + l.adjustPos(c2) + c3, _, err := l.input.readRune() + if err != nil { + return "", err + } + if c3 < '0' || c3 > '7' { + l.input.unreadRune(c3) + octal = string([]rune{c, c2}) + } else { + l.adjustPos(c3) + octal = string([]rune{c, c2, c3}) + } + } + i, err := strconv.ParseInt(octal, 8, 32) + if err != nil { + return "", fmt.Errorf("invalid octal escape: \\%q", octal) + } + if i > 0xff { + return "", fmt.Errorf("octal escape is out range, must be between 0 and 377: \\%q", octal) + } + buf.WriteByte(byte(i)) + + } else if c == 'u' { + // short unicode escape + u := make([]rune, 4) + for i := range u { + c, _, err := l.input.readRune() + if err != nil { + return "", err + } + l.adjustPos(c) + u[i] = c + } + i, err := strconv.ParseInt(string(u), 16, 32) + if err != nil { + return "", fmt.Errorf("invalid unicode escape: \\u%q", string(u)) + } + buf.WriteRune(rune(i)) + + } else if c == 'U' { + // long unicode escape + u := make([]rune, 8) + for i := range u { + c, _, err := l.input.readRune() + if err != nil { + return "", err + } + l.adjustPos(c) + u[i] = c + } + i, err := strconv.ParseInt(string(u), 16, 32) + if err != nil { + return "", fmt.Errorf("invalid unicode escape: \\U%q", string(u)) + } + if i > 0x10ffff || i < 0 { + return "", fmt.Errorf("unicode escape is out of range, must be between 0 and 0x10ffff: \\U%q", string(u)) + } + buf.WriteRune(rune(i)) + + } else if c == 'a' { + buf.WriteByte('\a') + } else if c == 'b' { + buf.WriteByte('\b') + } else if c == 'f' { + buf.WriteByte('\f') + } else if c == 'n' { + buf.WriteByte('\n') + } else if c == 'r' { + buf.WriteByte('\r') + } else if c == 't' { + buf.WriteByte('\t') + } else if c == 'v' { + buf.WriteByte('\v') + } else if c == '\\' { + buf.WriteByte('\\') + } else if c == '\'' { + buf.WriteByte('\'') + } else if c == '"' { + buf.WriteByte('"') + } else if c == '?' { + buf.WriteByte('?') + } else { + return "", fmt.Errorf("invalid escape sequence: %q", "\\"+string(c)) + } + } else { + buf.WriteRune(c) + } + } + return buf.String(), nil +} + +func (l *protoLex) skipToEndOfLineComment() (bool, string) { + txt := []rune{'/', '/'} + for { + c, _, err := l.input.readRune() + if err != nil { + return false, string(txt) + } + if c == '\n' { + return true, string(append(txt, '\n')) + } + l.adjustPos(c) + txt = append(txt, c) + } +} + +func (l *protoLex) skipToEndOfBlockComment() (string, bool) { + txt := []rune{'/', '*'} + for { + c, _, err := l.input.readRune() + if err != nil { + return "", false + } + l.adjustPos(c) + txt = append(txt, c) + if c == '*' { + c, _, err := l.input.readRune() + if err != nil { + return "", false + } + if c == '/' { + l.adjustPos(c) + txt = append(txt, c) + return string(txt), true + } + l.input.unreadRune(c) + } + } +} + +func (l *protoLex) addSourceError(err error) ErrorWithPos { + ewp, ok := err.(ErrorWithPos) + if !ok { + ewp = ErrorWithSourcePos{Pos: l.prev(), Underlying: err} + } + _ = l.errs.handleError(ewp) + return ewp +} + +func (l *protoLex) Error(s string) { + _ = l.addSourceError(errors.New(s)) +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/linker.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/linker.go new file mode 100644 index 00000000..1b42e022 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/linker.go @@ -0,0 +1,736 @@ +package protoparse + +import ( + "bytes" + "fmt" + "sort" + "strings" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/desc" + "github.com/jhump/protoreflect/desc/internal" +) + +type linker struct { + files map[string]*parseResult + filenames []string + errs *errorHandler + descriptorPool map[*dpb.FileDescriptorProto]map[string]proto.Message + extensions map[string]map[int32]string +} + +func newLinker(files *parseResults, errs *errorHandler) *linker { + return &linker{files: files.resultsByFilename, filenames: files.filenames, errs: errs} +} + +func (l *linker) linkFiles() (map[string]*desc.FileDescriptor, error) { + // First, we put all symbols into a single pool, which lets us ensure there + // are no duplicate symbols and will also let us resolve and revise all type + // references in next step. + if err := l.createDescriptorPool(); err != nil { + return nil, err + } + + // After we've populated the pool, we can now try to resolve all type + // references. All references must be checked for correct type, any fields + // with enum types must be corrected (since we parse them as if they are + // message references since we don't actually know message or enum until + // link time), and references will be re-written to be fully-qualified + // references (e.g. start with a dot "."). + if err := l.resolveReferences(); err != nil { + return nil, err + } + + if err := l.errs.getError(); err != nil { + // we won't be able to create real descriptors if we've encountered + // errors up to this point, so bail at this point + return nil, err + } + + // Now we've validated the descriptors, so we can link them into rich + // descriptors. This is a little redundant since that step does similar + // checking of symbols. But, without breaking encapsulation (e.g. exporting + // a lot of fields from desc package that are currently unexported) or + // merging this into the same package, we can't really prevent it. + linked, err := l.createdLinkedDescriptors() + if err != nil { + return nil, err + } + + // Now that we have linked descriptors, we can interpret any uninterpreted + // options that remain. + for _, r := range l.files { + fd := linked[r.fd.GetName()] + if err := interpretFileOptions(r, richFileDescriptorish{FileDescriptor: fd}); err != nil { + return nil, err + } + // we should now have any message_set_wire_format options parsed + // and can do further validation on tag ranges + if err := checkExtensionTagsInFile(fd, r); err != nil { + return nil, err + } + } + + return linked, nil +} + +func (l *linker) createDescriptorPool() error { + l.descriptorPool = map[*dpb.FileDescriptorProto]map[string]proto.Message{} + for _, filename := range l.filenames { + r := l.files[filename] + fd := r.fd + pool := map[string]proto.Message{} + l.descriptorPool[fd] = pool + prefix := fd.GetPackage() + if prefix != "" { + prefix += "." + } + for _, md := range fd.MessageType { + if err := addMessageToPool(r, pool, l.errs, prefix, md); err != nil { + return err + } + } + for _, fld := range fd.Extension { + if err := addFieldToPool(r, pool, l.errs, prefix, fld); err != nil { + return err + } + } + for _, ed := range fd.EnumType { + if err := addEnumToPool(r, pool, l.errs, prefix, ed); err != nil { + return err + } + } + for _, sd := range fd.Service { + if err := addServiceToPool(r, pool, l.errs, prefix, sd); err != nil { + return err + } + } + } + // try putting everything into a single pool, to ensure there are no duplicates + // across files (e.g. same symbol, but declared in two different files) + type entry struct { + file string + msg proto.Message + } + pool := map[string]entry{} + for _, filename := range l.filenames { + f := l.files[filename].fd + p := l.descriptorPool[f] + keys := make([]string, 0, len(p)) + for k := range p { + keys = append(keys, k) + } + sort.Strings(keys) // for deterministic error reporting + for _, k := range keys { + v := p[k] + if e, ok := pool[k]; ok { + desc1 := e.msg + file1 := e.file + desc2 := v + file2 := f.GetName() + if file2 < file1 { + file1, file2 = file2, file1 + desc1, desc2 = desc2, desc1 + } + node := l.files[file2].nodes[desc2] + if err := l.errs.handleErrorWithPos(node.start(), "duplicate symbol %s: already defined as %s in %q", k, descriptorType(desc1), file1); err != nil { + return err + } + } + pool[k] = entry{file: f.GetName(), msg: v} + } + } + + return nil +} + +func addMessageToPool(r *parseResult, pool map[string]proto.Message, errs *errorHandler, prefix string, md *dpb.DescriptorProto) error { + fqn := prefix + md.GetName() + if err := addToPool(r, pool, errs, fqn, md); err != nil { + return err + } + prefix = fqn + "." + for _, fld := range md.Field { + if err := addFieldToPool(r, pool, errs, prefix, fld); err != nil { + return err + } + } + for _, fld := range md.Extension { + if err := addFieldToPool(r, pool, errs, prefix, fld); err != nil { + return err + } + } + for _, nmd := range md.NestedType { + if err := addMessageToPool(r, pool, errs, prefix, nmd); err != nil { + return err + } + } + for _, ed := range md.EnumType { + if err := addEnumToPool(r, pool, errs, prefix, ed); err != nil { + return err + } + } + return nil +} + +func addFieldToPool(r *parseResult, pool map[string]proto.Message, errs *errorHandler, prefix string, fld *dpb.FieldDescriptorProto) error { + fqn := prefix + fld.GetName() + return addToPool(r, pool, errs, fqn, fld) +} + +func addEnumToPool(r *parseResult, pool map[string]proto.Message, errs *errorHandler, prefix string, ed *dpb.EnumDescriptorProto) error { + fqn := prefix + ed.GetName() + if err := addToPool(r, pool, errs, fqn, ed); err != nil { + return err + } + for _, evd := range ed.Value { + vfqn := fqn + "." + evd.GetName() + if err := addToPool(r, pool, errs, vfqn, evd); err != nil { + return err + } + } + return nil +} + +func addServiceToPool(r *parseResult, pool map[string]proto.Message, errs *errorHandler, prefix string, sd *dpb.ServiceDescriptorProto) error { + fqn := prefix + sd.GetName() + if err := addToPool(r, pool, errs, fqn, sd); err != nil { + return err + } + for _, mtd := range sd.Method { + mfqn := fqn + "." + mtd.GetName() + if err := addToPool(r, pool, errs, mfqn, mtd); err != nil { + return err + } + } + return nil +} + +func addToPool(r *parseResult, pool map[string]proto.Message, errs *errorHandler, fqn string, dsc proto.Message) error { + if d, ok := pool[fqn]; ok { + node := r.nodes[dsc] + if err := errs.handleErrorWithPos(node.start(), "duplicate symbol %s: already defined as %s", fqn, descriptorType(d)); err != nil { + return err + } + } + pool[fqn] = dsc + return nil +} + +func descriptorType(m proto.Message) string { + switch m := m.(type) { + case *dpb.DescriptorProto: + return "message" + case *dpb.DescriptorProto_ExtensionRange: + return "extension range" + case *dpb.FieldDescriptorProto: + if m.GetExtendee() == "" { + return "field" + } else { + return "extension" + } + case *dpb.EnumDescriptorProto: + return "enum" + case *dpb.EnumValueDescriptorProto: + return "enum value" + case *dpb.ServiceDescriptorProto: + return "service" + case *dpb.MethodDescriptorProto: + return "method" + case *dpb.FileDescriptorProto: + return "file" + default: + // shouldn't be possible + return fmt.Sprintf("%T", m) + } +} + +func (l *linker) resolveReferences() error { + l.extensions = map[string]map[int32]string{} + for _, filename := range l.filenames { + r := l.files[filename] + fd := r.fd + prefix := fd.GetPackage() + scopes := []scope{fileScope(fd, l)} + if prefix != "" { + prefix += "." + } + if fd.Options != nil { + if err := l.resolveOptions(r, fd, "file", fd.GetName(), proto.MessageName(fd.Options), fd.Options.UninterpretedOption, scopes); err != nil { + return err + } + } + for _, md := range fd.MessageType { + if err := l.resolveMessageTypes(r, fd, prefix, md, scopes); err != nil { + return err + } + } + for _, fld := range fd.Extension { + if err := l.resolveFieldTypes(r, fd, prefix, fld, scopes); err != nil { + return err + } + } + for _, ed := range fd.EnumType { + if err := l.resolveEnumTypes(r, fd, prefix, ed, scopes); err != nil { + return err + } + } + for _, sd := range fd.Service { + if err := l.resolveServiceTypes(r, fd, prefix, sd, scopes); err != nil { + return err + } + } + } + return nil +} + +func (l *linker) resolveEnumTypes(r *parseResult, fd *dpb.FileDescriptorProto, prefix string, ed *dpb.EnumDescriptorProto, scopes []scope) error { + enumFqn := prefix + ed.GetName() + if ed.Options != nil { + if err := l.resolveOptions(r, fd, "enum", enumFqn, proto.MessageName(ed.Options), ed.Options.UninterpretedOption, scopes); err != nil { + return err + } + } + for _, evd := range ed.Value { + if evd.Options != nil { + evFqn := enumFqn + "." + evd.GetName() + if err := l.resolveOptions(r, fd, "enum value", evFqn, proto.MessageName(evd.Options), evd.Options.UninterpretedOption, scopes); err != nil { + return err + } + } + } + return nil +} + +func (l *linker) resolveMessageTypes(r *parseResult, fd *dpb.FileDescriptorProto, prefix string, md *dpb.DescriptorProto, scopes []scope) error { + fqn := prefix + md.GetName() + scope := messageScope(fqn, isProto3(fd), l.descriptorPool[fd]) + scopes = append(scopes, scope) + prefix = fqn + "." + + if md.Options != nil { + if err := l.resolveOptions(r, fd, "message", fqn, proto.MessageName(md.Options), md.Options.UninterpretedOption, scopes); err != nil { + return err + } + } + + for _, nmd := range md.NestedType { + if err := l.resolveMessageTypes(r, fd, prefix, nmd, scopes); err != nil { + return err + } + } + for _, ned := range md.EnumType { + if err := l.resolveEnumTypes(r, fd, prefix, ned, scopes); err != nil { + return err + } + } + for _, fld := range md.Field { + if err := l.resolveFieldTypes(r, fd, prefix, fld, scopes); err != nil { + return err + } + } + for _, fld := range md.Extension { + if err := l.resolveFieldTypes(r, fd, prefix, fld, scopes); err != nil { + return err + } + } + for _, er := range md.ExtensionRange { + if er.Options != nil { + erName := fmt.Sprintf("%s:%d-%d", fqn, er.GetStart(), er.GetEnd()-1) + if err := l.resolveOptions(r, fd, "extension range", erName, proto.MessageName(er.Options), er.Options.UninterpretedOption, scopes); err != nil { + return err + } + } + } + return nil +} + +func (l *linker) resolveFieldTypes(r *parseResult, fd *dpb.FileDescriptorProto, prefix string, fld *dpb.FieldDescriptorProto, scopes []scope) error { + thisName := prefix + fld.GetName() + scope := fmt.Sprintf("field %s", thisName) + node := r.getFieldNode(fld) + elemType := "field" + if fld.GetExtendee() != "" { + elemType = "extension" + fqn, dsc, _ := l.resolve(fd, fld.GetExtendee(), isMessage, scopes) + if dsc == nil { + return l.errs.handleErrorWithPos(node.fieldExtendee().start(), "unknown extendee type %s", fld.GetExtendee()) + } + extd, ok := dsc.(*dpb.DescriptorProto) + if !ok { + otherType := descriptorType(dsc) + return l.errs.handleErrorWithPos(node.fieldExtendee().start(), "extendee is invalid: %s is a %s, not a message", fqn, otherType) + } + fld.Extendee = proto.String("." + fqn) + // make sure the tag number is in range + found := false + tag := fld.GetNumber() + for _, rng := range extd.ExtensionRange { + if tag >= rng.GetStart() && tag < rng.GetEnd() { + found = true + break + } + } + if !found { + if err := l.errs.handleErrorWithPos(node.fieldTag().start(), "%s: tag %d is not in valid range for extended type %s", scope, tag, fqn); err != nil { + return err + } + } else { + // make sure tag is not a duplicate + usedExtTags := l.extensions[fqn] + if usedExtTags == nil { + usedExtTags = map[int32]string{} + l.extensions[fqn] = usedExtTags + } + if other := usedExtTags[fld.GetNumber()]; other != "" { + if err := l.errs.handleErrorWithPos(node.fieldTag().start(), "%s: duplicate extension: %s and %s are both using tag %d", scope, other, thisName, fld.GetNumber()); err != nil { + return err + } + } else { + usedExtTags[fld.GetNumber()] = thisName + } + } + } + + if fld.Options != nil { + if err := l.resolveOptions(r, fd, elemType, thisName, proto.MessageName(fld.Options), fld.Options.UninterpretedOption, scopes); err != nil { + return err + } + } + + if fld.GetTypeName() == "" { + // scalar type; no further resolution required + return nil + } + + fqn, dsc, proto3 := l.resolve(fd, fld.GetTypeName(), isType, scopes) + if dsc == nil { + return l.errs.handleErrorWithPos(node.fieldType().start(), "%s: unknown type %s", scope, fld.GetTypeName()) + } + switch dsc := dsc.(type) { + case *dpb.DescriptorProto: + fld.TypeName = proto.String("." + fqn) + // if type was tentatively unset, we now know it's actually a message + if fld.Type == nil { + fld.Type = dpb.FieldDescriptorProto_TYPE_MESSAGE.Enum() + } + case *dpb.EnumDescriptorProto: + if fld.GetExtendee() == "" && isProto3(fd) && !proto3 { + // fields in a proto3 message cannot refer to proto2 enums + return l.errs.handleErrorWithPos(node.fieldType().start(), "%s: cannot use proto2 enum %s in a proto3 message", scope, fld.GetTypeName()) + } + fld.TypeName = proto.String("." + fqn) + // the type was tentatively unset, but now we know it's actually an enum + fld.Type = dpb.FieldDescriptorProto_TYPE_ENUM.Enum() + default: + otherType := descriptorType(dsc) + return l.errs.handleErrorWithPos(node.fieldType().start(), "%s: invalid type: %s is a %s, not a message or enum", scope, fqn, otherType) + } + return nil +} + +func (l *linker) resolveServiceTypes(r *parseResult, fd *dpb.FileDescriptorProto, prefix string, sd *dpb.ServiceDescriptorProto, scopes []scope) error { + thisName := prefix + sd.GetName() + if sd.Options != nil { + if err := l.resolveOptions(r, fd, "service", thisName, proto.MessageName(sd.Options), sd.Options.UninterpretedOption, scopes); err != nil { + return err + } + } + + for _, mtd := range sd.Method { + if mtd.Options != nil { + if err := l.resolveOptions(r, fd, "method", thisName+"."+mtd.GetName(), proto.MessageName(mtd.Options), mtd.Options.UninterpretedOption, scopes); err != nil { + return err + } + } + scope := fmt.Sprintf("method %s.%s", thisName, mtd.GetName()) + node := r.getMethodNode(mtd) + fqn, dsc, _ := l.resolve(fd, mtd.GetInputType(), isMessage, scopes) + if dsc == nil { + if err := l.errs.handleErrorWithPos(node.getInputType().start(), "%s: unknown request type %s", scope, mtd.GetInputType()); err != nil { + return err + } + } else if _, ok := dsc.(*dpb.DescriptorProto); !ok { + otherType := descriptorType(dsc) + if err := l.errs.handleErrorWithPos(node.getInputType().start(), "%s: invalid request type: %s is a %s, not a message", scope, fqn, otherType); err != nil { + return err + } + } else { + mtd.InputType = proto.String("." + fqn) + } + + fqn, dsc, _ = l.resolve(fd, mtd.GetOutputType(), isMessage, scopes) + if dsc == nil { + if err := l.errs.handleErrorWithPos(node.getOutputType().start(), "%s: unknown response type %s", scope, mtd.GetOutputType()); err != nil { + return err + } + } else if _, ok := dsc.(*dpb.DescriptorProto); !ok { + otherType := descriptorType(dsc) + if err := l.errs.handleErrorWithPos(node.getOutputType().start(), "%s: invalid response type: %s is a %s, not a message", scope, fqn, otherType); err != nil { + return err + } + } else { + mtd.OutputType = proto.String("." + fqn) + } + } + return nil +} + +func (l *linker) resolveOptions(r *parseResult, fd *dpb.FileDescriptorProto, elemType, elemName, optType string, opts []*dpb.UninterpretedOption, scopes []scope) error { + var scope string + if elemType != "file" { + scope = fmt.Sprintf("%s %s: ", elemType, elemName) + } +opts: + for _, opt := range opts { + for _, nm := range opt.Name { + if nm.GetIsExtension() { + node := r.getOptionNamePartNode(nm) + fqn, dsc, _ := l.resolve(fd, nm.GetNamePart(), isField, scopes) + if dsc == nil { + if err := l.errs.handleErrorWithPos(node.start(), "%sunknown extension %s", scope, nm.GetNamePart()); err != nil { + return err + } + continue opts + } + if ext, ok := dsc.(*dpb.FieldDescriptorProto); !ok { + otherType := descriptorType(dsc) + if err := l.errs.handleErrorWithPos(node.start(), "%sinvalid extension: %s is a %s, not an extension", scope, nm.GetNamePart(), otherType); err != nil { + return err + } + continue opts + } else if ext.GetExtendee() == "" { + if err := l.errs.handleErrorWithPos(node.start(), "%sinvalid extension: %s is a field but not an extension", scope, nm.GetNamePart()); err != nil { + return err + } + continue opts + } + nm.NamePart = proto.String("." + fqn) + } + } + } + return nil +} + +func (l *linker) resolve(fd *dpb.FileDescriptorProto, name string, allowed func(proto.Message) bool, scopes []scope) (fqn string, element proto.Message, proto3 bool) { + if strings.HasPrefix(name, ".") { + // already fully-qualified + d, proto3 := l.findSymbol(fd, name[1:], false, map[*dpb.FileDescriptorProto]struct{}{}) + if d != nil { + return name[1:], d, proto3 + } + } else { + // unqualified, so we look in the enclosing (last) scope first and move + // towards outermost (first) scope, trying to resolve the symbol + var bestGuess proto.Message + var bestGuessFqn string + var bestGuessProto3 bool + for i := len(scopes) - 1; i >= 0; i-- { + fqn, d, proto3 := scopes[i](name) + if d != nil { + if allowed(d) { + return fqn, d, proto3 + } else if bestGuess == nil { + bestGuess = d + bestGuessFqn = fqn + bestGuessProto3 = proto3 + } + } + } + // we return best guess, even though it was not an allowed kind of + // descriptor, so caller can print a better error message (e.g. + // indicating that the name was found but that it's the wrong type) + return bestGuessFqn, bestGuess, bestGuessProto3 + } + return "", nil, false +} + +func isField(m proto.Message) bool { + _, ok := m.(*dpb.FieldDescriptorProto) + return ok +} + +func isMessage(m proto.Message) bool { + _, ok := m.(*dpb.DescriptorProto) + return ok +} + +func isType(m proto.Message) bool { + switch m.(type) { + case *dpb.DescriptorProto, *dpb.EnumDescriptorProto: + return true + } + return false +} + +// scope represents a lexical scope in a proto file in which messages and enums +// can be declared. +type scope func(symbol string) (fqn string, element proto.Message, proto3 bool) + +func fileScope(fd *dpb.FileDescriptorProto, l *linker) scope { + // we search symbols in this file, but also symbols in other files that have + // the same package as this file or a "parent" package (in protobuf, + // packages are a hierarchy like C++ namespaces) + prefixes := internal.CreatePrefixList(fd.GetPackage()) + return func(name string) (string, proto.Message, bool) { + for _, prefix := range prefixes { + var n string + if prefix == "" { + n = name + } else { + n = prefix + "." + name + } + d, proto3 := l.findSymbol(fd, n, false, map[*dpb.FileDescriptorProto]struct{}{}) + if d != nil { + return n, d, proto3 + } + } + return "", nil, false + } +} + +func messageScope(messageName string, proto3 bool, filePool map[string]proto.Message) scope { + return func(name string) (string, proto.Message, bool) { + n := messageName + "." + name + if d, ok := filePool[n]; ok { + return n, d, proto3 + } + return "", nil, false + } +} + +func (l *linker) findSymbol(fd *dpb.FileDescriptorProto, name string, public bool, checked map[*dpb.FileDescriptorProto]struct{}) (element proto.Message, proto3 bool) { + if _, ok := checked[fd]; ok { + // already checked this one + return nil, false + } + checked[fd] = struct{}{} + d := l.descriptorPool[fd][name] + if d != nil { + return d, isProto3(fd) + } + + // When public = false, we are searching only directly imported symbols. But we + // also need to search transitive public imports due to semantics of public imports. + if public { + for _, depIndex := range fd.PublicDependency { + dep := fd.Dependency[depIndex] + depres := l.files[dep] + if depres == nil { + // we'll catch this error later + continue + } + if d, proto3 := l.findSymbol(depres.fd, name, true, checked); d != nil { + return d, proto3 + } + } + } else { + for _, dep := range fd.Dependency { + depres := l.files[dep] + if depres == nil { + // we'll catch this error later + continue + } + if d, proto3 := l.findSymbol(depres.fd, name, true, checked); d != nil { + return d, proto3 + } + } + } + + return nil, false +} + +func isProto3(fd *dpb.FileDescriptorProto) bool { + return fd.GetSyntax() == "proto3" +} + +func (l *linker) createdLinkedDescriptors() (map[string]*desc.FileDescriptor, error) { + names := make([]string, 0, len(l.files)) + for name := range l.files { + names = append(names, name) + } + sort.Strings(names) + linked := map[string]*desc.FileDescriptor{} + for _, name := range names { + if _, err := l.linkFile(name, nil, nil, linked); err != nil { + return nil, err + } + } + return linked, nil +} + +func (l *linker) linkFile(name string, rootImportLoc *SourcePos, seen []string, linked map[string]*desc.FileDescriptor) (*desc.FileDescriptor, error) { + // check for import cycle + for _, s := range seen { + if name == s { + var msg bytes.Buffer + first := true + for _, s := range seen { + if first { + first = false + } else { + msg.WriteString(" -> ") + } + _, _ = fmt.Fprintf(&msg, "%q", s) + } + _, _ = fmt.Fprintf(&msg, " -> %q", name) + return nil, ErrorWithSourcePos{ + Underlying: fmt.Errorf("cycle found in imports: %s", msg.String()), + Pos: rootImportLoc, + } + } + } + seen = append(seen, name) + + if lfd, ok := linked[name]; ok { + // already linked + return lfd, nil + } + r := l.files[name] + if r == nil { + importer := seen[len(seen)-2] // len-1 is *this* file, before that is the one that imported it + return nil, fmt.Errorf("no descriptor found for %q, imported by %q", name, importer) + } + var deps []*desc.FileDescriptor + if rootImportLoc == nil { + // try to find a source location for this "root" import + decl := r.getFileNode(r.fd) + fnode, ok := decl.(*fileNode) + if ok { + for _, dep := range fnode.imports { + ldep, err := l.linkFile(dep.name.val, dep.name.start(), seen, linked) + if err != nil { + return nil, err + } + deps = append(deps, ldep) + } + } else { + // no AST? just use the descriptor + for _, dep := range r.fd.Dependency { + ldep, err := l.linkFile(dep, decl.start(), seen, linked) + if err != nil { + return nil, err + } + deps = append(deps, ldep) + } + } + } else { + // we can just use the descriptor since we don't need source location + // (we'll just attribute any import cycles found to the "root" import) + for _, dep := range r.fd.Dependency { + ldep, err := l.linkFile(dep, rootImportLoc, seen, linked) + if err != nil { + return nil, err + } + deps = append(deps, ldep) + } + } + lfd, err := desc.CreateFileDescriptor(r.fd, deps...) + if err != nil { + return nil, fmt.Errorf("error linking %q: %s", name, err) + } + linked[name] = lfd + return lfd, nil +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/options.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/options.go new file mode 100644 index 00000000..403deb99 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/options.go @@ -0,0 +1,1410 @@ +package protoparse + +import ( + "bytes" + "fmt" + "math" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/desc" + "github.com/jhump/protoreflect/desc/internal" + "github.com/jhump/protoreflect/dynamic" +) + +// NB: To process options, we need descriptors, but we may not have rich +// descriptors when trying to interpret options for unlinked parsed files. +// So we define minimal interfaces that can be backed by both rich descriptors +// as well as their poorer cousins, plain ol' descriptor protos. + +type descriptorish interface { + GetFile() fileDescriptorish + GetFullyQualifiedName() string + AsProto() proto.Message +} + +type fileDescriptorish interface { + descriptorish + GetFileOptions() *dpb.FileOptions + GetPackage() string + FindSymbol(name string) desc.Descriptor + GetPublicDependencies() []fileDescriptorish + GetDependencies() []fileDescriptorish + GetMessageTypes() []msgDescriptorish + GetExtensions() []fldDescriptorish + GetEnumTypes() []enumDescriptorish + GetServices() []svcDescriptorish +} + +type msgDescriptorish interface { + descriptorish + GetMessageOptions() *dpb.MessageOptions + GetFields() []fldDescriptorish + GetOneOfs() []oneofDescriptorish + GetExtensionRanges() []extRangeDescriptorish + GetNestedMessageTypes() []msgDescriptorish + GetNestedExtensions() []fldDescriptorish + GetNestedEnumTypes() []enumDescriptorish +} + +type fldDescriptorish interface { + descriptorish + GetFieldOptions() *dpb.FieldOptions + GetMessageType() *desc.MessageDescriptor + GetEnumType() *desc.EnumDescriptor + AsFieldDescriptorProto() *dpb.FieldDescriptorProto +} + +type oneofDescriptorish interface { + descriptorish + GetOneOfOptions() *dpb.OneofOptions +} + +type enumDescriptorish interface { + descriptorish + GetEnumOptions() *dpb.EnumOptions + GetValues() []enumValDescriptorish +} + +type enumValDescriptorish interface { + descriptorish + GetEnumValueOptions() *dpb.EnumValueOptions +} + +type svcDescriptorish interface { + descriptorish + GetServiceOptions() *dpb.ServiceOptions + GetMethods() []methodDescriptorish +} + +type methodDescriptorish interface { + descriptorish + GetMethodOptions() *dpb.MethodOptions +} + +// The hierarchy of descriptorish implementations backed by +// rich descriptors: + +type richFileDescriptorish struct { + *desc.FileDescriptor +} + +func (d richFileDescriptorish) GetFile() fileDescriptorish { + return d +} + +func (d richFileDescriptorish) GetPublicDependencies() []fileDescriptorish { + deps := d.FileDescriptor.GetPublicDependencies() + ret := make([]fileDescriptorish, len(deps)) + for i, d := range deps { + ret[i] = richFileDescriptorish{FileDescriptor: d} + } + return ret +} + +func (d richFileDescriptorish) GetDependencies() []fileDescriptorish { + deps := d.FileDescriptor.GetDependencies() + ret := make([]fileDescriptorish, len(deps)) + for i, d := range deps { + ret[i] = richFileDescriptorish{FileDescriptor: d} + } + return ret +} + +func (d richFileDescriptorish) GetMessageTypes() []msgDescriptorish { + msgs := d.FileDescriptor.GetMessageTypes() + ret := make([]msgDescriptorish, len(msgs)) + for i, m := range msgs { + ret[i] = richMsgDescriptorish{MessageDescriptor: m} + } + return ret +} + +func (d richFileDescriptorish) GetExtensions() []fldDescriptorish { + flds := d.FileDescriptor.GetExtensions() + ret := make([]fldDescriptorish, len(flds)) + for i, f := range flds { + ret[i] = richFldDescriptorish{FieldDescriptor: f} + } + return ret +} + +func (d richFileDescriptorish) GetEnumTypes() []enumDescriptorish { + ens := d.FileDescriptor.GetEnumTypes() + ret := make([]enumDescriptorish, len(ens)) + for i, en := range ens { + ret[i] = richEnumDescriptorish{EnumDescriptor: en} + } + return ret +} + +func (d richFileDescriptorish) GetServices() []svcDescriptorish { + svcs := d.FileDescriptor.GetServices() + ret := make([]svcDescriptorish, len(svcs)) + for i, s := range svcs { + ret[i] = richSvcDescriptorish{ServiceDescriptor: s} + } + return ret +} + +type richMsgDescriptorish struct { + *desc.MessageDescriptor +} + +func (d richMsgDescriptorish) GetFile() fileDescriptorish { + return richFileDescriptorish{FileDescriptor: d.MessageDescriptor.GetFile()} +} + +func (d richMsgDescriptorish) GetFields() []fldDescriptorish { + flds := d.MessageDescriptor.GetFields() + ret := make([]fldDescriptorish, len(flds)) + for i, f := range flds { + ret[i] = richFldDescriptorish{FieldDescriptor: f} + } + return ret +} + +func (d richMsgDescriptorish) GetOneOfs() []oneofDescriptorish { + oos := d.MessageDescriptor.GetOneOfs() + ret := make([]oneofDescriptorish, len(oos)) + for i, oo := range oos { + ret[i] = richOneOfDescriptorish{OneOfDescriptor: oo} + } + return ret +} + +func (d richMsgDescriptorish) GetExtensionRanges() []extRangeDescriptorish { + md := d.MessageDescriptor + mdFqn := md.GetFullyQualifiedName() + extrs := md.AsDescriptorProto().GetExtensionRange() + ret := make([]extRangeDescriptorish, len(extrs)) + for i, extr := range extrs { + ret[i] = extRangeDescriptorish{ + er: extr, + qual: mdFqn, + file: richFileDescriptorish{FileDescriptor: md.GetFile()}, + } + } + return ret +} + +func (d richMsgDescriptorish) GetNestedMessageTypes() []msgDescriptorish { + msgs := d.MessageDescriptor.GetNestedMessageTypes() + ret := make([]msgDescriptorish, len(msgs)) + for i, m := range msgs { + ret[i] = richMsgDescriptorish{MessageDescriptor: m} + } + return ret +} + +func (d richMsgDescriptorish) GetNestedExtensions() []fldDescriptorish { + flds := d.MessageDescriptor.GetNestedExtensions() + ret := make([]fldDescriptorish, len(flds)) + for i, f := range flds { + ret[i] = richFldDescriptorish{FieldDescriptor: f} + } + return ret +} + +func (d richMsgDescriptorish) GetNestedEnumTypes() []enumDescriptorish { + ens := d.MessageDescriptor.GetNestedEnumTypes() + ret := make([]enumDescriptorish, len(ens)) + for i, en := range ens { + ret[i] = richEnumDescriptorish{EnumDescriptor: en} + } + return ret +} + +type richFldDescriptorish struct { + *desc.FieldDescriptor +} + +func (d richFldDescriptorish) GetFile() fileDescriptorish { + return richFileDescriptorish{FileDescriptor: d.FieldDescriptor.GetFile()} +} + +func (d richFldDescriptorish) AsFieldDescriptorProto() *dpb.FieldDescriptorProto { + return d.FieldDescriptor.AsFieldDescriptorProto() +} + +type richOneOfDescriptorish struct { + *desc.OneOfDescriptor +} + +func (d richOneOfDescriptorish) GetFile() fileDescriptorish { + return richFileDescriptorish{FileDescriptor: d.OneOfDescriptor.GetFile()} +} + +type richEnumDescriptorish struct { + *desc.EnumDescriptor +} + +func (d richEnumDescriptorish) GetFile() fileDescriptorish { + return richFileDescriptorish{FileDescriptor: d.EnumDescriptor.GetFile()} +} + +func (d richEnumDescriptorish) GetValues() []enumValDescriptorish { + vals := d.EnumDescriptor.GetValues() + ret := make([]enumValDescriptorish, len(vals)) + for i, val := range vals { + ret[i] = richEnumValDescriptorish{EnumValueDescriptor: val} + } + return ret +} + +type richEnumValDescriptorish struct { + *desc.EnumValueDescriptor +} + +func (d richEnumValDescriptorish) GetFile() fileDescriptorish { + return richFileDescriptorish{FileDescriptor: d.EnumValueDescriptor.GetFile()} +} + +type richSvcDescriptorish struct { + *desc.ServiceDescriptor +} + +func (d richSvcDescriptorish) GetFile() fileDescriptorish { + return richFileDescriptorish{FileDescriptor: d.ServiceDescriptor.GetFile()} +} + +func (d richSvcDescriptorish) GetMethods() []methodDescriptorish { + mtds := d.ServiceDescriptor.GetMethods() + ret := make([]methodDescriptorish, len(mtds)) + for i, mtd := range mtds { + ret[i] = richMethodDescriptorish{MethodDescriptor: mtd} + } + return ret +} + +type richMethodDescriptorish struct { + *desc.MethodDescriptor +} + +func (d richMethodDescriptorish) GetFile() fileDescriptorish { + return richFileDescriptorish{FileDescriptor: d.MethodDescriptor.GetFile()} +} + +// The hierarchy of descriptorish implementations backed by +// plain descriptor protos: + +type poorFileDescriptorish struct { + *dpb.FileDescriptorProto +} + +func (d poorFileDescriptorish) GetFile() fileDescriptorish { + return d +} + +func (d poorFileDescriptorish) GetFullyQualifiedName() string { + return d.FileDescriptorProto.GetName() +} + +func (d poorFileDescriptorish) AsProto() proto.Message { + return d.FileDescriptorProto +} + +func (d poorFileDescriptorish) GetFileOptions() *dpb.FileOptions { + return d.FileDescriptorProto.GetOptions() +} + +func (d poorFileDescriptorish) FindSymbol(name string) desc.Descriptor { + return nil +} + +func (d poorFileDescriptorish) GetPublicDependencies() []fileDescriptorish { + return nil +} + +func (d poorFileDescriptorish) GetDependencies() []fileDescriptorish { + return nil +} + +func (d poorFileDescriptorish) GetMessageTypes() []msgDescriptorish { + msgs := d.FileDescriptorProto.GetMessageType() + pkg := d.FileDescriptorProto.GetPackage() + ret := make([]msgDescriptorish, len(msgs)) + for i, m := range msgs { + ret[i] = poorMsgDescriptorish{ + DescriptorProto: m, + qual: pkg, + file: d, + } + } + return ret +} + +func (d poorFileDescriptorish) GetExtensions() []fldDescriptorish { + exts := d.FileDescriptorProto.GetExtension() + pkg := d.FileDescriptorProto.GetPackage() + ret := make([]fldDescriptorish, len(exts)) + for i, e := range exts { + ret[i] = poorFldDescriptorish{ + FieldDescriptorProto: e, + qual: pkg, + file: d, + } + } + return ret +} + +func (d poorFileDescriptorish) GetEnumTypes() []enumDescriptorish { + ens := d.FileDescriptorProto.GetEnumType() + pkg := d.FileDescriptorProto.GetPackage() + ret := make([]enumDescriptorish, len(ens)) + for i, e := range ens { + ret[i] = poorEnumDescriptorish{ + EnumDescriptorProto: e, + qual: pkg, + file: d, + } + } + return ret +} + +func (d poorFileDescriptorish) GetServices() []svcDescriptorish { + svcs := d.FileDescriptorProto.GetService() + pkg := d.FileDescriptorProto.GetPackage() + ret := make([]svcDescriptorish, len(svcs)) + for i, s := range svcs { + ret[i] = poorSvcDescriptorish{ + ServiceDescriptorProto: s, + qual: pkg, + file: d, + } + } + return ret +} + +type poorMsgDescriptorish struct { + *dpb.DescriptorProto + qual string + file fileDescriptorish +} + +func (d poorMsgDescriptorish) GetFile() fileDescriptorish { + return d.file +} + +func (d poorMsgDescriptorish) GetFullyQualifiedName() string { + return qualify(d.qual, d.DescriptorProto.GetName()) +} + +func qualify(qual, name string) string { + if qual == "" { + return name + } else { + return fmt.Sprintf("%s.%s", qual, name) + } +} + +func (d poorMsgDescriptorish) AsProto() proto.Message { + return d.DescriptorProto +} + +func (d poorMsgDescriptorish) GetMessageOptions() *dpb.MessageOptions { + return d.DescriptorProto.GetOptions() +} + +func (d poorMsgDescriptorish) GetFields() []fldDescriptorish { + flds := d.DescriptorProto.GetField() + ret := make([]fldDescriptorish, len(flds)) + for i, f := range flds { + ret[i] = poorFldDescriptorish{ + FieldDescriptorProto: f, + qual: d.GetFullyQualifiedName(), + file: d.file, + } + } + return ret +} + +func (d poorMsgDescriptorish) GetOneOfs() []oneofDescriptorish { + oos := d.DescriptorProto.GetOneofDecl() + ret := make([]oneofDescriptorish, len(oos)) + for i, oo := range oos { + ret[i] = poorOneOfDescriptorish{ + OneofDescriptorProto: oo, + qual: d.GetFullyQualifiedName(), + file: d.file, + } + } + return ret +} + +func (d poorMsgDescriptorish) GetExtensionRanges() []extRangeDescriptorish { + mdFqn := d.GetFullyQualifiedName() + extrs := d.DescriptorProto.GetExtensionRange() + ret := make([]extRangeDescriptorish, len(extrs)) + for i, extr := range extrs { + ret[i] = extRangeDescriptorish{ + er: extr, + qual: mdFqn, + file: d.file, + } + } + return ret +} + +func (d poorMsgDescriptorish) GetNestedMessageTypes() []msgDescriptorish { + msgs := d.DescriptorProto.GetNestedType() + ret := make([]msgDescriptorish, len(msgs)) + for i, m := range msgs { + ret[i] = poorMsgDescriptorish{ + DescriptorProto: m, + qual: d.GetFullyQualifiedName(), + file: d.file, + } + } + return ret +} + +func (d poorMsgDescriptorish) GetNestedExtensions() []fldDescriptorish { + flds := d.DescriptorProto.GetExtension() + ret := make([]fldDescriptorish, len(flds)) + for i, f := range flds { + ret[i] = poorFldDescriptorish{ + FieldDescriptorProto: f, + qual: d.GetFullyQualifiedName(), + file: d.file, + } + } + return ret +} + +func (d poorMsgDescriptorish) GetNestedEnumTypes() []enumDescriptorish { + ens := d.DescriptorProto.GetEnumType() + ret := make([]enumDescriptorish, len(ens)) + for i, en := range ens { + ret[i] = poorEnumDescriptorish{ + EnumDescriptorProto: en, + qual: d.GetFullyQualifiedName(), + file: d.file, + } + } + return ret +} + +type poorFldDescriptorish struct { + *dpb.FieldDescriptorProto + qual string + file fileDescriptorish +} + +func (d poorFldDescriptorish) GetFile() fileDescriptorish { + return d.file +} + +func (d poorFldDescriptorish) GetFullyQualifiedName() string { + return qualify(d.qual, d.FieldDescriptorProto.GetName()) +} + +func (d poorFldDescriptorish) AsProto() proto.Message { + return d.FieldDescriptorProto +} + +func (d poorFldDescriptorish) GetFieldOptions() *dpb.FieldOptions { + return d.FieldDescriptorProto.GetOptions() +} + +func (d poorFldDescriptorish) GetMessageType() *desc.MessageDescriptor { + return nil +} + +func (d poorFldDescriptorish) GetEnumType() *desc.EnumDescriptor { + return nil +} + +type poorOneOfDescriptorish struct { + *dpb.OneofDescriptorProto + qual string + file fileDescriptorish +} + +func (d poorOneOfDescriptorish) GetFile() fileDescriptorish { + return d.file +} + +func (d poorOneOfDescriptorish) GetFullyQualifiedName() string { + return qualify(d.qual, d.OneofDescriptorProto.GetName()) +} + +func (d poorOneOfDescriptorish) AsProto() proto.Message { + return d.OneofDescriptorProto +} + +func (d poorOneOfDescriptorish) GetOneOfOptions() *dpb.OneofOptions { + return d.OneofDescriptorProto.GetOptions() +} + +func (d poorFldDescriptorish) AsFieldDescriptorProto() *dpb.FieldDescriptorProto { + return d.FieldDescriptorProto +} + +type poorEnumDescriptorish struct { + *dpb.EnumDescriptorProto + qual string + file fileDescriptorish +} + +func (d poorEnumDescriptorish) GetFile() fileDescriptorish { + return d.file +} + +func (d poorEnumDescriptorish) GetFullyQualifiedName() string { + return qualify(d.qual, d.EnumDescriptorProto.GetName()) +} + +func (d poorEnumDescriptorish) AsProto() proto.Message { + return d.EnumDescriptorProto +} + +func (d poorEnumDescriptorish) GetEnumOptions() *dpb.EnumOptions { + return d.EnumDescriptorProto.GetOptions() +} + +func (d poorEnumDescriptorish) GetValues() []enumValDescriptorish { + vals := d.EnumDescriptorProto.GetValue() + ret := make([]enumValDescriptorish, len(vals)) + for i, v := range vals { + ret[i] = poorEnumValDescriptorish{ + EnumValueDescriptorProto: v, + qual: d.GetFullyQualifiedName(), + file: d.file, + } + } + return ret +} + +type poorEnumValDescriptorish struct { + *dpb.EnumValueDescriptorProto + qual string + file fileDescriptorish +} + +func (d poorEnumValDescriptorish) GetFile() fileDescriptorish { + return d.file +} + +func (d poorEnumValDescriptorish) GetFullyQualifiedName() string { + return qualify(d.qual, d.EnumValueDescriptorProto.GetName()) +} + +func (d poorEnumValDescriptorish) AsProto() proto.Message { + return d.EnumValueDescriptorProto +} + +func (d poorEnumValDescriptorish) GetEnumValueOptions() *dpb.EnumValueOptions { + return d.EnumValueDescriptorProto.GetOptions() +} + +type poorSvcDescriptorish struct { + *dpb.ServiceDescriptorProto + qual string + file fileDescriptorish +} + +func (d poorSvcDescriptorish) GetFile() fileDescriptorish { + return d.file +} + +func (d poorSvcDescriptorish) GetFullyQualifiedName() string { + return qualify(d.qual, d.ServiceDescriptorProto.GetName()) +} + +func (d poorSvcDescriptorish) AsProto() proto.Message { + return d.ServiceDescriptorProto +} + +func (d poorSvcDescriptorish) GetServiceOptions() *dpb.ServiceOptions { + return d.ServiceDescriptorProto.GetOptions() +} + +func (d poorSvcDescriptorish) GetMethods() []methodDescriptorish { + mtds := d.ServiceDescriptorProto.GetMethod() + ret := make([]methodDescriptorish, len(mtds)) + for i, m := range mtds { + ret[i] = poorMethodDescriptorish{ + MethodDescriptorProto: m, + qual: d.GetFullyQualifiedName(), + file: d.file, + } + } + return ret +} + +type poorMethodDescriptorish struct { + *dpb.MethodDescriptorProto + qual string + file fileDescriptorish +} + +func (d poorMethodDescriptorish) GetFile() fileDescriptorish { + return d.file +} + +func (d poorMethodDescriptorish) GetFullyQualifiedName() string { + return qualify(d.qual, d.MethodDescriptorProto.GetName()) +} + +func (d poorMethodDescriptorish) AsProto() proto.Message { + return d.MethodDescriptorProto +} + +func (d poorMethodDescriptorish) GetMethodOptions() *dpb.MethodOptions { + return d.MethodDescriptorProto.GetOptions() +} + +type extRangeDescriptorish struct { + er *dpb.DescriptorProto_ExtensionRange + qual string + file fileDescriptorish +} + +func (er extRangeDescriptorish) GetFile() fileDescriptorish { + return er.file +} + +func (er extRangeDescriptorish) GetFullyQualifiedName() string { + return qualify(er.qual, fmt.Sprintf("%d-%d", er.er.GetStart(), er.er.GetEnd()-1)) +} + +func (er extRangeDescriptorish) AsProto() proto.Message { + return er.er +} + +func (er extRangeDescriptorish) GetExtensionRangeOptions() *dpb.ExtensionRangeOptions { + return er.er.GetOptions() +} + +func interpretFileOptions(r *parseResult, fd fileDescriptorish) error { + opts := fd.GetFileOptions() + if opts != nil { + if len(opts.UninterpretedOption) > 0 { + if remain, err := interpretOptions(r, fd, opts, opts.UninterpretedOption); err != nil { + return err + } else { + opts.UninterpretedOption = remain + } + } + } + for _, md := range fd.GetMessageTypes() { + if err := interpretMessageOptions(r, md); err != nil { + return err + } + } + for _, fld := range fd.GetExtensions() { + if err := interpretFieldOptions(r, fld); err != nil { + return err + } + } + for _, ed := range fd.GetEnumTypes() { + if err := interpretEnumOptions(r, ed); err != nil { + return err + } + } + for _, sd := range fd.GetServices() { + opts := sd.GetServiceOptions() + if len(opts.GetUninterpretedOption()) > 0 { + if remain, err := interpretOptions(r, sd, opts, opts.UninterpretedOption); err != nil { + return err + } else { + opts.UninterpretedOption = remain + } + } + for _, mtd := range sd.GetMethods() { + opts := mtd.GetMethodOptions() + if len(opts.GetUninterpretedOption()) > 0 { + if remain, err := interpretOptions(r, mtd, opts, opts.UninterpretedOption); err != nil { + return err + } else { + opts.UninterpretedOption = remain + } + } + } + } + return nil +} + +func interpretMessageOptions(r *parseResult, md msgDescriptorish) error { + opts := md.GetMessageOptions() + if opts != nil { + if len(opts.UninterpretedOption) > 0 { + if remain, err := interpretOptions(r, md, opts, opts.UninterpretedOption); err != nil { + return err + } else { + opts.UninterpretedOption = remain + } + } + } + for _, fld := range md.GetFields() { + if err := interpretFieldOptions(r, fld); err != nil { + return err + } + } + for _, ood := range md.GetOneOfs() { + opts := ood.GetOneOfOptions() + if len(opts.GetUninterpretedOption()) > 0 { + if remain, err := interpretOptions(r, ood, opts, opts.UninterpretedOption); err != nil { + return err + } else { + opts.UninterpretedOption = remain + } + } + } + for _, fld := range md.GetNestedExtensions() { + if err := interpretFieldOptions(r, fld); err != nil { + return err + } + } + for _, er := range md.GetExtensionRanges() { + opts := er.GetExtensionRangeOptions() + if len(opts.GetUninterpretedOption()) > 0 { + if remain, err := interpretOptions(r, er, opts, opts.UninterpretedOption); err != nil { + return err + } else { + opts.UninterpretedOption = remain + } + } + } + for _, nmd := range md.GetNestedMessageTypes() { + if err := interpretMessageOptions(r, nmd); err != nil { + return err + } + } + for _, ed := range md.GetNestedEnumTypes() { + if err := interpretEnumOptions(r, ed); err != nil { + return err + } + } + return nil +} + +func interpretFieldOptions(r *parseResult, fld fldDescriptorish) error { + opts := fld.GetFieldOptions() + if len(opts.GetUninterpretedOption()) > 0 { + uo := opts.UninterpretedOption + scope := fmt.Sprintf("field %s", fld.GetFullyQualifiedName()) + + // process json_name pseudo-option + if index, err := findOption(r, scope, uo, "json_name"); err != nil && !r.lenient { + return err + } else if index >= 0 { + opt := uo[index] + optNode := r.getOptionNode(opt) + + // attribute source code info + if on, ok := optNode.(*optionNode); ok { + r.interpretedOptions[on] = []int32{-1, internal.Field_jsonNameTag} + } + uo = removeOption(uo, index) + if opt.StringValue == nil { + if err := r.errs.handleErrorWithPos(optNode.getValue().start(), "%s: expecting string value for json_name option", scope); err != nil { + return err + } + } else { + fld.AsFieldDescriptorProto().JsonName = proto.String(string(opt.StringValue)) + } + } + + // and process default pseudo-option + if index, err := processDefaultOption(r, scope, fld, uo); err != nil && !r.lenient { + return err + } else if index >= 0 { + // attribute source code info + optNode := r.getOptionNode(uo[index]) + if on, ok := optNode.(*optionNode); ok { + r.interpretedOptions[on] = []int32{-1, internal.Field_defaultTag} + } + uo = removeOption(uo, index) + } + + if len(uo) == 0 { + // no real options, only pseudo-options above? clear out options + fld.AsFieldDescriptorProto().Options = nil + } else if remain, err := interpretOptions(r, fld, opts, uo); err != nil { + return err + } else { + opts.UninterpretedOption = remain + } + } + return nil +} + +func processDefaultOption(res *parseResult, scope string, fld fldDescriptorish, uos []*dpb.UninterpretedOption) (defaultIndex int, err error) { + found, err := findOption(res, scope, uos, "default") + if err != nil || found == -1 { + return -1, err + } + opt := uos[found] + optNode := res.getOptionNode(opt) + fdp := fld.AsFieldDescriptorProto() + if fdp.GetLabel() == dpb.FieldDescriptorProto_LABEL_REPEATED { + return -1, res.errs.handleErrorWithPos(optNode.getName().start(), "%s: default value cannot be set because field is repeated", scope) + } + if fdp.GetType() == dpb.FieldDescriptorProto_TYPE_GROUP || fdp.GetType() == dpb.FieldDescriptorProto_TYPE_MESSAGE { + return -1, res.errs.handleErrorWithPos(optNode.getName().start(), "%s: default value cannot be set because field is a message", scope) + } + val := optNode.getValue() + if _, ok := val.(*aggregateLiteralNode); ok { + return -1, res.errs.handleErrorWithPos(val.start(), "%s: default value cannot be an aggregate", scope) + } + mc := &messageContext{ + res: res, + file: fld.GetFile(), + elementName: fld.GetFullyQualifiedName(), + elementType: descriptorType(fld.AsProto()), + option: opt, + } + v, err := fieldValue(res, mc, fld, val, true) + if err != nil { + return -1, res.errs.handleError(err) + } + if str, ok := v.(string); ok { + fld.AsFieldDescriptorProto().DefaultValue = proto.String(str) + } else if b, ok := v.([]byte); ok { + fld.AsFieldDescriptorProto().DefaultValue = proto.String(encodeDefaultBytes(b)) + } else { + var flt float64 + var ok bool + if flt, ok = v.(float64); !ok { + var flt32 float32 + if flt32, ok = v.(float32); ok { + flt = float64(flt32) + } + } + if ok { + if math.IsInf(flt, 1) { + fld.AsFieldDescriptorProto().DefaultValue = proto.String("inf") + } else if ok && math.IsInf(flt, -1) { + fld.AsFieldDescriptorProto().DefaultValue = proto.String("-inf") + } else if ok && math.IsNaN(flt) { + fld.AsFieldDescriptorProto().DefaultValue = proto.String("nan") + } else { + fld.AsFieldDescriptorProto().DefaultValue = proto.String(fmt.Sprintf("%v", v)) + } + } else { + fld.AsFieldDescriptorProto().DefaultValue = proto.String(fmt.Sprintf("%v", v)) + } + } + return found, nil +} + +func encodeDefaultBytes(b []byte) string { + var buf bytes.Buffer + writeEscapedBytes(&buf, b) + return buf.String() +} + +func interpretEnumOptions(r *parseResult, ed enumDescriptorish) error { + opts := ed.GetEnumOptions() + if opts != nil { + if len(opts.UninterpretedOption) > 0 { + if remain, err := interpretOptions(r, ed, opts, opts.UninterpretedOption); err != nil { + return err + } else { + opts.UninterpretedOption = remain + } + } + } + for _, evd := range ed.GetValues() { + opts := evd.GetEnumValueOptions() + if len(opts.GetUninterpretedOption()) > 0 { + if remain, err := interpretOptions(r, evd, opts, opts.UninterpretedOption); err != nil { + return err + } else { + opts.UninterpretedOption = remain + } + } + } + return nil +} + +func interpretOptions(res *parseResult, element descriptorish, opts proto.Message, uninterpreted []*dpb.UninterpretedOption) ([]*dpb.UninterpretedOption, error) { + optsd, err := desc.LoadMessageDescriptorForMessage(opts) + if err != nil { + if res.lenient { + return uninterpreted, nil + } + return nil, res.errs.handleError(err) + } + dm := dynamic.NewMessage(optsd) + err = dm.ConvertFrom(opts) + if err != nil { + if res.lenient { + return uninterpreted, nil + } + node := res.nodes[element.AsProto()] + return nil, res.errs.handleError(ErrorWithSourcePos{Pos: node.start(), Underlying: err}) + } + + mc := &messageContext{res: res, file: element.GetFile(), elementName: element.GetFullyQualifiedName(), elementType: descriptorType(element.AsProto())} + var remain []*dpb.UninterpretedOption + for _, uo := range uninterpreted { + node := res.getOptionNode(uo) + if !uo.Name[0].GetIsExtension() && uo.Name[0].GetNamePart() == "uninterpreted_option" { + if res.lenient { + remain = append(remain, uo) + continue + } + // uninterpreted_option might be found reflectively, but is not actually valid for use + if err := res.errs.handleErrorWithPos(node.getName().start(), "%vinvalid option 'uninterpreted_option'", mc); err != nil { + return nil, err + } + } + mc.option = uo + path, err := interpretField(res, mc, element, dm, uo, 0, nil) + if err != nil { + if res.lenient { + remain = append(remain, uo) + continue + } + return nil, err + } + if optn, ok := node.(*optionNode); ok { + res.interpretedOptions[optn] = path + } + } + + if res.lenient { + // If we're lenient, then we don't want to clobber the passed in message + // and leave it partially populated. So we convert into a copy first + optsClone := proto.Clone(opts) + if err := dm.ConvertToDeterministic(optsClone); err != nil { + // TODO: do this in a more granular way, so we can convert individual + // fields and leave bad ones uninterpreted instead of skipping all of + // the work we've done so far. + return uninterpreted, nil + } + // conversion from dynamic message above worked, so now + // it is safe to overwrite the passed in message + opts.Reset() + proto.Merge(opts, optsClone) + + return remain, nil + } + + if err := dm.ValidateRecursive(); err != nil { + node := res.nodes[element.AsProto()] + if err := res.errs.handleErrorWithPos(node.start(), "error in %s options: %v", descriptorType(element.AsProto()), err); err != nil { + return nil, err + } + } + + // nw try to convert into the passed in message and fail if not successful + if err := dm.ConvertToDeterministic(opts); err != nil { + node := res.nodes[element.AsProto()] + return nil, res.errs.handleError(ErrorWithSourcePos{Pos: node.start(), Underlying: err}) + } + + return nil, nil +} + +func interpretField(res *parseResult, mc *messageContext, element descriptorish, dm *dynamic.Message, opt *dpb.UninterpretedOption, nameIndex int, pathPrefix []int32) (path []int32, err error) { + var fld *desc.FieldDescriptor + nm := opt.GetName()[nameIndex] + node := res.getOptionNamePartNode(nm) + if nm.GetIsExtension() { + extName := nm.GetNamePart() + if extName[0] == '.' { + extName = extName[1:] /* skip leading dot */ + } + fld = findExtension(element.GetFile(), extName, false, map[fileDescriptorish]struct{}{}) + if fld == nil { + return nil, res.errs.handleErrorWithPos(node.start(), + "%vunrecognized extension %s of %s", + mc, extName, dm.GetMessageDescriptor().GetFullyQualifiedName()) + } + if fld.GetOwner().GetFullyQualifiedName() != dm.GetMessageDescriptor().GetFullyQualifiedName() { + return nil, res.errs.handleErrorWithPos(node.start(), + "%vextension %s should extend %s but instead extends %s", + mc, extName, dm.GetMessageDescriptor().GetFullyQualifiedName(), fld.GetOwner().GetFullyQualifiedName()) + } + } else { + fld = dm.GetMessageDescriptor().FindFieldByName(nm.GetNamePart()) + if fld == nil { + return nil, res.errs.handleErrorWithPos(node.start(), + "%vfield %s of %s does not exist", + mc, nm.GetNamePart(), dm.GetMessageDescriptor().GetFullyQualifiedName()) + } + } + + path = append(pathPrefix, fld.GetNumber()) + + if len(opt.GetName()) > nameIndex+1 { + nextnm := opt.GetName()[nameIndex+1] + nextnode := res.getOptionNamePartNode(nextnm) + if fld.GetType() != dpb.FieldDescriptorProto_TYPE_MESSAGE { + return nil, res.errs.handleErrorWithPos(nextnode.start(), + "%vcannot set field %s because %s is not a message", + mc, nextnm.GetNamePart(), nm.GetNamePart()) + } + if fld.IsRepeated() { + return nil, res.errs.handleErrorWithPos(nextnode.start(), + "%vcannot set field %s because %s is repeated (must use an aggregate)", + mc, nextnm.GetNamePart(), nm.GetNamePart()) + } + var fdm *dynamic.Message + var err error + if dm.HasField(fld) { + var v interface{} + v, err = dm.TryGetField(fld) + fdm, _ = v.(*dynamic.Message) + } else { + fdm = dynamic.NewMessage(fld.GetMessageType()) + err = dm.TrySetField(fld, fdm) + } + if err != nil { + return nil, res.errs.handleError(ErrorWithSourcePos{Pos: node.start(), Underlying: err}) + } + // recurse to set next part of name + return interpretField(res, mc, element, fdm, opt, nameIndex+1, path) + } + + optNode := res.getOptionNode(opt) + if err := setOptionField(res, mc, dm, fld, node, optNode.getValue()); err != nil { + return nil, res.errs.handleError(err) + } + if fld.IsRepeated() { + path = append(path, int32(dm.FieldLength(fld))-1) + } + return path, nil +} + +func findExtension(fd fileDescriptorish, name string, public bool, checked map[fileDescriptorish]struct{}) *desc.FieldDescriptor { + if _, ok := checked[fd]; ok { + return nil + } + checked[fd] = struct{}{} + d := fd.FindSymbol(name) + if d != nil { + if fld, ok := d.(*desc.FieldDescriptor); ok { + return fld + } + return nil + } + + // When public = false, we are searching only directly imported symbols. But we + // also need to search transitive public imports due to semantics of public imports. + if public { + for _, dep := range fd.GetPublicDependencies() { + d := findExtension(dep, name, true, checked) + if d != nil { + return d + } + } + } else { + for _, dep := range fd.GetDependencies() { + d := findExtension(dep, name, true, checked) + if d != nil { + return d + } + } + } + return nil +} + +func setOptionField(res *parseResult, mc *messageContext, dm *dynamic.Message, fld *desc.FieldDescriptor, name node, val valueNode) error { + v := val.value() + if sl, ok := v.([]valueNode); ok { + // handle slices a little differently than the others + if !fld.IsRepeated() { + return errorWithPos(val.start(), "%vvalue is an array but field is not repeated", mc) + } + origPath := mc.optAggPath + defer func() { + mc.optAggPath = origPath + }() + for index, item := range sl { + mc.optAggPath = fmt.Sprintf("%s[%d]", origPath, index) + if v, err := fieldValue(res, mc, richFldDescriptorish{FieldDescriptor: fld}, item, false); err != nil { + return err + } else if err = dm.TryAddRepeatedField(fld, v); err != nil { + return errorWithPos(val.start(), "%verror setting value: %s", mc, err) + } + } + return nil + } + + v, err := fieldValue(res, mc, richFldDescriptorish{FieldDescriptor: fld}, val, false) + if err != nil { + return err + } + if fld.IsRepeated() { + err = dm.TryAddRepeatedField(fld, v) + } else { + if dm.HasField(fld) { + return errorWithPos(name.start(), "%vnon-repeated option field %s already set", mc, fieldName(fld)) + } + err = dm.TrySetField(fld, v) + } + if err != nil { + return errorWithPos(val.start(), "%verror setting value: %s", mc, err) + } + + return nil +} + +func findOption(res *parseResult, scope string, opts []*dpb.UninterpretedOption, name string) (int, error) { + found := -1 + for i, opt := range opts { + if len(opt.Name) != 1 { + continue + } + if opt.Name[0].GetIsExtension() || opt.Name[0].GetNamePart() != name { + continue + } + if found >= 0 { + optNode := res.getOptionNode(opt) + return -1, res.errs.handleErrorWithPos(optNode.getName().start(), "%s: option %s cannot be defined more than once", scope, name) + } + found = i + } + return found, nil +} + +func removeOption(uo []*dpb.UninterpretedOption, indexToRemove int) []*dpb.UninterpretedOption { + if indexToRemove == 0 { + return uo[1:] + } else if int(indexToRemove) == len(uo)-1 { + return uo[:len(uo)-1] + } else { + return append(uo[:indexToRemove], uo[indexToRemove+1:]...) + } +} + +type messageContext struct { + res *parseResult + file fileDescriptorish + elementType string + elementName string + option *dpb.UninterpretedOption + optAggPath string +} + +func (c *messageContext) String() string { + var ctx bytes.Buffer + if c.elementType != "file" { + _, _ = fmt.Fprintf(&ctx, "%s %s: ", c.elementType, c.elementName) + } + if c.option != nil && c.option.Name != nil { + ctx.WriteString("option ") + writeOptionName(&ctx, c.option.Name) + if c.res.nodes == nil { + // if we have no source position info, try to provide as much context + // as possible (if nodes != nil, we don't need this because any errors + // will actually have file and line numbers) + if c.optAggPath != "" { + _, _ = fmt.Fprintf(&ctx, " at %s", c.optAggPath) + } + } + ctx.WriteString(": ") + } + return ctx.String() +} + +func writeOptionName(buf *bytes.Buffer, parts []*dpb.UninterpretedOption_NamePart) { + first := true + for _, p := range parts { + if first { + first = false + } else { + buf.WriteByte('.') + } + nm := p.GetNamePart() + if nm[0] == '.' { + // skip leading dot + nm = nm[1:] + } + if p.GetIsExtension() { + buf.WriteByte('(') + buf.WriteString(nm) + buf.WriteByte(')') + } else { + buf.WriteString(nm) + } + } +} + +func fieldName(fld *desc.FieldDescriptor) string { + if fld.IsExtension() { + return fld.GetFullyQualifiedName() + } else { + return fld.GetName() + } +} + +func valueKind(val interface{}) string { + switch val := val.(type) { + case identifier: + return "identifier" + case bool: + return "bool" + case int64: + if val < 0 { + return "negative integer" + } + return "integer" + case uint64: + return "integer" + case float64: + return "double" + case string, []byte: + return "string" + case []*aggregateEntryNode: + return "message" + default: + return fmt.Sprintf("%T", val) + } +} + +func fieldValue(res *parseResult, mc *messageContext, fld fldDescriptorish, val valueNode, enumAsString bool) (interface{}, error) { + v := val.value() + t := fld.AsFieldDescriptorProto().GetType() + switch t { + case dpb.FieldDescriptorProto_TYPE_ENUM: + if id, ok := v.(identifier); ok { + ev := fld.GetEnumType().FindValueByName(string(id)) + if ev == nil { + return nil, errorWithPos(val.start(), "%venum %s has no value named %s", mc, fld.GetEnumType().GetFullyQualifiedName(), id) + } + if enumAsString { + return ev.GetName(), nil + } else { + return ev.GetNumber(), nil + } + } + return nil, errorWithPos(val.start(), "%vexpecting enum, got %s", mc, valueKind(v)) + case dpb.FieldDescriptorProto_TYPE_MESSAGE, dpb.FieldDescriptorProto_TYPE_GROUP: + if aggs, ok := v.([]*aggregateEntryNode); ok { + fmd := fld.GetMessageType() + fdm := dynamic.NewMessage(fmd) + origPath := mc.optAggPath + defer func() { + mc.optAggPath = origPath + }() + for _, a := range aggs { + if origPath == "" { + mc.optAggPath = a.name.value() + } else { + mc.optAggPath = origPath + "." + a.name.value() + } + var ffld *desc.FieldDescriptor + if a.name.isExtension { + n := a.name.name.val + ffld = findExtension(mc.file, n, false, map[fileDescriptorish]struct{}{}) + if ffld == nil { + // may need to qualify with package name + pkg := mc.file.GetPackage() + if pkg != "" { + ffld = findExtension(mc.file, pkg+"."+n, false, map[fileDescriptorish]struct{}{}) + } + } + } else { + ffld = fmd.FindFieldByName(a.name.value()) + } + if ffld == nil { + return nil, errorWithPos(val.start(), "%vfield %s not found", mc, a.name.name.val) + } + if err := setOptionField(res, mc, fdm, ffld, a.name, a.val); err != nil { + return nil, err + } + } + return fdm, nil + } + return nil, errorWithPos(val.start(), "%vexpecting message, got %s", mc, valueKind(v)) + case dpb.FieldDescriptorProto_TYPE_BOOL: + if b, ok := v.(bool); ok { + return b, nil + } + return nil, errorWithPos(val.start(), "%vexpecting bool, got %s", mc, valueKind(v)) + case dpb.FieldDescriptorProto_TYPE_BYTES: + if str, ok := v.(string); ok { + return []byte(str), nil + } + return nil, errorWithPos(val.start(), "%vexpecting bytes, got %s", mc, valueKind(v)) + case dpb.FieldDescriptorProto_TYPE_STRING: + if str, ok := v.(string); ok { + return str, nil + } + return nil, errorWithPos(val.start(), "%vexpecting string, got %s", mc, valueKind(v)) + case dpb.FieldDescriptorProto_TYPE_INT32, dpb.FieldDescriptorProto_TYPE_SINT32, dpb.FieldDescriptorProto_TYPE_SFIXED32: + if i, ok := v.(int64); ok { + if i > math.MaxInt32 || i < math.MinInt32 { + return nil, errorWithPos(val.start(), "%vvalue %d is out of range for int32", mc, i) + } + return int32(i), nil + } + if ui, ok := v.(uint64); ok { + if ui > math.MaxInt32 { + return nil, errorWithPos(val.start(), "%vvalue %d is out of range for int32", mc, ui) + } + return int32(ui), nil + } + return nil, errorWithPos(val.start(), "%vexpecting int32, got %s", mc, valueKind(v)) + case dpb.FieldDescriptorProto_TYPE_UINT32, dpb.FieldDescriptorProto_TYPE_FIXED32: + if i, ok := v.(int64); ok { + if i > math.MaxUint32 || i < 0 { + return nil, errorWithPos(val.start(), "%vvalue %d is out of range for uint32", mc, i) + } + return uint32(i), nil + } + if ui, ok := v.(uint64); ok { + if ui > math.MaxUint32 { + return nil, errorWithPos(val.start(), "%vvalue %d is out of range for uint32", mc, ui) + } + return uint32(ui), nil + } + return nil, errorWithPos(val.start(), "%vexpecting uint32, got %s", mc, valueKind(v)) + case dpb.FieldDescriptorProto_TYPE_INT64, dpb.FieldDescriptorProto_TYPE_SINT64, dpb.FieldDescriptorProto_TYPE_SFIXED64: + if i, ok := v.(int64); ok { + return i, nil + } + if ui, ok := v.(uint64); ok { + if ui > math.MaxInt64 { + return nil, errorWithPos(val.start(), "%vvalue %d is out of range for int64", mc, ui) + } + return int64(ui), nil + } + return nil, errorWithPos(val.start(), "%vexpecting int64, got %s", mc, valueKind(v)) + case dpb.FieldDescriptorProto_TYPE_UINT64, dpb.FieldDescriptorProto_TYPE_FIXED64: + if i, ok := v.(int64); ok { + if i < 0 { + return nil, errorWithPos(val.start(), "%vvalue %d is out of range for uint64", mc, i) + } + return uint64(i), nil + } + if ui, ok := v.(uint64); ok { + return ui, nil + } + return nil, errorWithPos(val.start(), "%vexpecting uint64, got %s", mc, valueKind(v)) + case dpb.FieldDescriptorProto_TYPE_DOUBLE: + if d, ok := v.(float64); ok { + return d, nil + } + if i, ok := v.(int64); ok { + return float64(i), nil + } + if u, ok := v.(uint64); ok { + return float64(u), nil + } + return nil, errorWithPos(val.start(), "%vexpecting double, got %s", mc, valueKind(v)) + case dpb.FieldDescriptorProto_TYPE_FLOAT: + if d, ok := v.(float64); ok { + if (d > math.MaxFloat32 || d < -math.MaxFloat32) && !math.IsInf(d, 1) && !math.IsInf(d, -1) && !math.IsNaN(d) { + return nil, errorWithPos(val.start(), "%vvalue %f is out of range for float", mc, d) + } + return float32(d), nil + } + if i, ok := v.(int64); ok { + return float32(i), nil + } + if u, ok := v.(uint64); ok { + return float32(u), nil + } + return nil, errorWithPos(val.start(), "%vexpecting float, got %s", mc, valueKind(v)) + default: + return nil, errorWithPos(val.start(), "%vunrecognized field type: %s", mc, t) + } +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/parser.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/parser.go new file mode 100644 index 00000000..c0393013 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/parser.go @@ -0,0 +1,826 @@ +package protoparse + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "math" + "os" + "path/filepath" + "sort" + "strings" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/desc" + "github.com/jhump/protoreflect/desc/internal" +) + +//go:generate goyacc -o proto.y.go -p proto proto.y + +func init() { + protoErrorVerbose = true + + // fix up the generated "token name" array so that error messages are nicer + setTokenName(_STRING_LIT, "string literal") + setTokenName(_INT_LIT, "int literal") + setTokenName(_FLOAT_LIT, "float literal") + setTokenName(_NAME, "identifier") + setTokenName(_ERROR, "error") + // for keywords, just show the keyword itself wrapped in quotes + for str, i := range keywords { + setTokenName(i, fmt.Sprintf(`"%s"`, str)) + } +} + +func setTokenName(token int, text string) { + // NB: this is based on logic in generated parse code that translates the + // int returned from the lexer into an internal token number. + var intern int + if token < len(protoTok1) { + intern = protoTok1[token] + } else { + if token >= protoPrivate { + if token < protoPrivate+len(protoTok2) { + intern = protoTok2[token-protoPrivate] + } + } + if intern == 0 { + for i := 0; i+1 < len(protoTok3); i += 2 { + if protoTok3[i] == token { + intern = protoTok3[i+1] + break + } + } + } + } + + if intern >= 1 && intern-1 < len(protoToknames) { + protoToknames[intern-1] = text + return + } + + panic(fmt.Sprintf("Unknown token value: %d", token)) +} + +// FileAccessor is an abstraction for opening proto source files. It takes the +// name of the file to open and returns either the input reader or an error. +type FileAccessor func(filename string) (io.ReadCloser, error) + +// FileContentsFromMap returns a FileAccessor that uses the given map of file +// contents. This allows proto source files to be constructed in memory and +// easily supplied to a parser. The map keys are the paths to the proto source +// files, and the values are the actual proto source contents. +func FileContentsFromMap(files map[string]string) FileAccessor { + return func(filename string) (io.ReadCloser, error) { + contents, ok := files[filename] + if !ok { + return nil, os.ErrNotExist + } + return ioutil.NopCloser(strings.NewReader(contents)), nil + } +} + +// Parser parses proto source into descriptors. +type Parser struct { + // The paths used to search for dependencies that are referenced in import + // statements in proto source files. If no import paths are provided then + // "." (current directory) is assumed to be the only import path. + // + // This setting is only used during ParseFiles operations. Since calls to + // ParseFilesButDoNotLink do not link, there is no need to load and parse + // dependencies. + ImportPaths []string + + // If true, the supplied file names/paths need not necessarily match how the + // files are referenced in import statements. The parser will attempt to + // match import statements to supplied paths, "guessing" the import paths + // for the files. Note that this inference is not perfect and link errors + // could result. It works best when all proto files are organized such that + // a single import path can be inferred (e.g. all files under a single tree + // with import statements all being relative to the root of this tree). + InferImportPaths bool + + // LookupImport is a function that accepts a filename and + // returns a file descriptor, which will be consulted when resolving imports. + // This allows a compiled Go proto in another Go module to be referenced + // in the proto(s) being parsed. + // + // In the event of a filename collision, Accessor is consulted first, + // then LookupImport is consulted, and finally the well-known protos + // are used. + // + // For example, in order to automatically look up compiled Go protos that + // have been imported and be able to use them as imports, set this to + // desc.LoadFileDescriptor. + LookupImport func(string) (*desc.FileDescriptor, error) + + // Used to create a reader for a given filename, when loading proto source + // file contents. If unset, os.Open is used. If ImportPaths is also empty + // then relative paths are will be relative to the process's current working + // directory. + Accessor FileAccessor + + // If true, the resulting file descriptors will retain source code info, + // that maps elements to their location in the source files as well as + // includes comments found during parsing (and attributed to elements of + // the source file). + IncludeSourceCodeInfo bool + + // If true, the results from ParseFilesButDoNotLink will be passed through + // some additional validations. But only constraints that do not require + // linking can be checked. These include proto2 vs. proto3 language features, + // looking for incorrect usage of reserved names or tags, and ensuring that + // fields have unique tags and that enum values have unique numbers (unless + // the enum allows aliases). + ValidateUnlinkedFiles bool + + // If true, the results from ParseFilesButDoNotLink will have options + // interpreted. Any uninterpretable options (including any custom options or + // options that refer to message and enum types, which can only be + // interpreted after linking) will be left in uninterpreted_options. Also, + // the "default" pseudo-option for fields can only be interpreted for scalar + // fields, excluding enums. (Interpreting default values for enum fields + // requires resolving enum names, which requires linking.) + InterpretOptionsInUnlinkedFiles bool + + // A custom reporter of syntax and link errors. If not specified, the + // default reporter just returns the reported error, which causes parsing + // to abort after encountering a single error. + // + // The reporter is not invoked for system or I/O errors, only for syntax and + // link errors. + ErrorReporter ErrorReporter +} + +// ParseFiles parses the named files into descriptors. The returned slice has +// the same number of entries as the give filenames, in the same order. So the +// first returned descriptor corresponds to the first given name, and so on. +// +// All dependencies for all specified files (including transitive dependencies) +// must be accessible via the parser's Accessor or a link error will occur. The +// exception to this rule is that files can import standard Google-provided +// files -- e.g. google/protobuf/*.proto -- without needing to supply sources +// for these files. Like protoc, this parser has a built-in version of these +// files it can use if they aren't explicitly supplied. +// +// If the Parser has no ErrorReporter set and a syntax or link error occurs, +// parsing will abort with the first such error encountered. If there is an +// ErrorReporter configured and it returns non-nil, parsing will abort with the +// error it returns. If syntax or link errors are encountered but the configured +// ErrorReporter always returns nil, the parse fails with ErrInvalidSource. +func (p Parser) ParseFiles(filenames ...string) ([]*desc.FileDescriptor, error) { + accessor := p.Accessor + if accessor == nil { + accessor = func(name string) (io.ReadCloser, error) { + return os.Open(name) + } + } + paths := p.ImportPaths + if len(paths) > 0 { + acc := accessor + accessor = func(name string) (io.ReadCloser, error) { + var ret error + for _, path := range paths { + f, err := acc(filepath.Join(path, name)) + if err != nil { + if ret == nil { + ret = err + } + continue + } + return f, nil + } + return nil, ret + } + } + + protos := map[string]*parseResult{} + results := &parseResults{resultsByFilename: protos} + errs := newErrorHandler(p.ErrorReporter) + parseProtoFiles(accessor, filenames, errs, true, true, results, p.LookupImport) + if err := errs.getError(); err != nil { + return nil, err + } + if p.InferImportPaths { + // TODO: if this re-writes one of the names in filenames, lookups below will break + protos = fixupFilenames(protos) + } + linkedProtos, err := newLinker(results, errs).linkFiles() + if err != nil { + return nil, err + } + if p.IncludeSourceCodeInfo { + for name, fd := range linkedProtos { + pr := protos[name] + fd.AsFileDescriptorProto().SourceCodeInfo = pr.generateSourceCodeInfo() + internal.RecomputeSourceInfo(fd) + } + } + fds := make([]*desc.FileDescriptor, len(filenames)) + for i, name := range filenames { + fd := linkedProtos[name] + fds[i] = fd + } + return fds, nil +} + +// ParseFilesButDoNotLink parses the named files into descriptor protos. The +// results are just protos, not fully-linked descriptors. It is possible that +// descriptors are invalid and still be returned in parsed form without error +// due to the fact that the linking step is skipped (and thus many validation +// steps omitted). +// +// There are a few side effects to not linking the descriptors: +// 1. No options will be interpreted. Options can refer to extensions or have +// message and enum types. Without linking, these extension and type +// references are not resolved, so the options may not be interpretable. +// So all options will appear in UninterpretedOption fields of the various +// descriptor options messages. +// 2. Type references will not be resolved. This means that the actual type +// names in the descriptors may be unqualified and even relative to the +// scope in which the type reference appears. This goes for fields that +// have message and enum types. It also applies to methods and their +// references to request and response message types. +// 3. Enum fields are not known. Until a field's type reference is resolved +// (during linking), it is not known whether the type refers to a message +// or an enum. So all fields with such type references have their Type set +// to TYPE_MESSAGE. +// +// This method will still validate the syntax of parsed files. If the parser's +// ValidateUnlinkedFiles field is true, additional checks, beyond syntax will +// also be performed. +// +// If the Parser has no ErrorReporter set and a syntax or link error occurs, +// parsing will abort with the first such error encountered. If there is an +// ErrorReporter configured and it returns non-nil, parsing will abort with the +// error it returns. If syntax or link errors are encountered but the configured +// ErrorReporter always returns nil, the parse fails with ErrInvalidSource. +func (p Parser) ParseFilesButDoNotLink(filenames ...string) ([]*dpb.FileDescriptorProto, error) { + accessor := p.Accessor + if accessor == nil { + accessor = func(name string) (io.ReadCloser, error) { + return os.Open(name) + } + } + + protos := map[string]*parseResult{} + errs := newErrorHandler(p.ErrorReporter) + parseProtoFiles(accessor, filenames, errs, false, p.ValidateUnlinkedFiles, &parseResults{resultsByFilename: protos}, p.LookupImport) + if err := errs.getError(); err != nil { + return nil, err + } + if p.InferImportPaths { + // TODO: if this re-writes one of the names in filenames, lookups below will break + protos = fixupFilenames(protos) + } + fds := make([]*dpb.FileDescriptorProto, len(filenames)) + for i, name := range filenames { + pr := protos[name] + fd := pr.fd + if p.InterpretOptionsInUnlinkedFiles { + // parsing options will be best effort + pr.lenient = true + // we don't want the real error reporter see any errors + pr.errs.reporter = func(err ErrorWithPos) error { + return err + } + _ = interpretFileOptions(pr, poorFileDescriptorish{FileDescriptorProto: fd}) + } + if p.IncludeSourceCodeInfo { + fd.SourceCodeInfo = pr.generateSourceCodeInfo() + } + fds[i] = fd + } + return fds, nil +} + +func fixupFilenames(protos map[string]*parseResult) map[string]*parseResult { + // In the event that the given filenames (keys in the supplied map) do not + // match the actual paths used in 'import' statements in the files, we try + // to revise names in the protos so that they will match and be linkable. + revisedProtos := map[string]*parseResult{} + + protoPaths := map[string]struct{}{} + // TODO: this is O(n^2) but could likely be O(n) with a clever data structure (prefix tree that is indexed backwards?) + importCandidates := map[string]map[string]struct{}{} + candidatesAvailable := map[string]struct{}{} + for name := range protos { + candidatesAvailable[name] = struct{}{} + for _, f := range protos { + for _, imp := range f.fd.Dependency { + if strings.HasSuffix(name, imp) { + candidates := importCandidates[imp] + if candidates == nil { + candidates = map[string]struct{}{} + importCandidates[imp] = candidates + } + candidates[name] = struct{}{} + } + } + } + } + for imp, candidates := range importCandidates { + // if we found multiple possible candidates, use the one that is an exact match + // if it exists, and otherwise, guess that it's the shortest path (fewest elements) + var best string + for c := range candidates { + if _, ok := candidatesAvailable[c]; !ok { + // already used this candidate and re-written its filename accordingly + continue + } + if c == imp { + // exact match! + best = c + break + } + if best == "" { + best = c + } else { + // HACK: we can't actually tell which files is supposed to match + // this import, so arbitrarily pick the "shorter" one (fewest + // path elements) or, on a tie, the lexically earlier one + minLen := strings.Count(best, string(filepath.Separator)) + cLen := strings.Count(c, string(filepath.Separator)) + if cLen < minLen || (cLen == minLen && c < best) { + best = c + } + } + } + if best != "" { + prefix := best[:len(best)-len(imp)] + if len(prefix) > 0 { + protoPaths[prefix] = struct{}{} + } + f := protos[best] + f.fd.Name = proto.String(imp) + revisedProtos[imp] = f + delete(candidatesAvailable, best) + } + } + + if len(candidatesAvailable) == 0 { + return revisedProtos + } + + if len(protoPaths) == 0 { + for c := range candidatesAvailable { + revisedProtos[c] = protos[c] + } + return revisedProtos + } + + // Any remaining candidates are entry-points (not imported by others), so + // the best bet to "fixing" their file name is to see if they're in one of + // the proto paths we found, and if so strip that prefix. + protoPathStrs := make([]string, len(protoPaths)) + i := 0 + for p := range protoPaths { + protoPathStrs[i] = p + i++ + } + sort.Strings(protoPathStrs) + // we look at paths in reverse order, so we'll use a longer proto path if + // there is more than one match + for c := range candidatesAvailable { + var imp string + for i := len(protoPathStrs) - 1; i >= 0; i-- { + p := protoPathStrs[i] + if strings.HasPrefix(c, p) { + imp = c[len(p):] + break + } + } + if imp != "" { + f := protos[c] + f.fd.Name = proto.String(imp) + revisedProtos[imp] = f + } else { + revisedProtos[c] = protos[c] + } + } + + return revisedProtos +} + +func parseProtoFiles(acc FileAccessor, filenames []string, errs *errorHandler, recursive, validate bool, parsed *parseResults, lookupImport func(string) (*desc.FileDescriptor, error)) { + for _, name := range filenames { + parseProtoFile(acc, name, nil, errs, recursive, validate, parsed, lookupImport) + if errs.err != nil { + return + } + } +} + +func parseProtoFile(acc FileAccessor, filename string, importLoc *SourcePos, errs *errorHandler, recursive, validate bool, parsed *parseResults, lookupImport func(string) (*desc.FileDescriptor, error)) { + if parsed.has(filename) { + return + } + if lookupImport == nil { + lookupImport = func(string) (*desc.FileDescriptor, error) { + return nil, errors.New("no import lookup function") + } + } + in, err := acc(filename) + var result *parseResult + if err == nil { + // try to parse the bytes accessed + func() { + defer func() { + // if we've already parsed contents, an error + // closing need not fail this operation + _ = in.Close() + }() + result = parseProto(filename, in, errs, validate) + }() + } else if d, lookupErr := lookupImport(filename); lookupErr == nil { + // This is a user-provided descriptor, which is acting similarly to a + // well-known import. + result = &parseResult{fd: proto.Clone(d.AsFileDescriptorProto()).(*dpb.FileDescriptorProto)} + } else if d, ok := standardImports[filename]; ok { + // it's a well-known import + // (we clone it to make sure we're not sharing state with other + // parsers, which could result in unsafe races if multiple + // parsers are trying to access it concurrently) + result = &parseResult{fd: proto.Clone(d).(*dpb.FileDescriptorProto)} + } else { + if !strings.Contains(err.Error(), filename) { + // an error message that doesn't indicate the file is awful! + err = fmt.Errorf("%s: %v", filename, err) + } + // associate the error with the import line + err = ErrorWithSourcePos{ + Pos: importLoc, + Underlying: err, + } + _ = errs.handleError(err) + return + } + + parsed.add(filename, result) + + if errs.err != nil { + return // abort + } + + if recursive { + fd := result.fd + decl := result.getFileNode(fd) + fnode, ok := decl.(*fileNode) + if !ok { + // no AST for this file? use imports in descriptor + for _, dep := range fd.Dependency { + parseProtoFile(acc, dep, decl.start(), errs, true, validate, parsed, lookupImport) + if errs.getError() != nil { + return // abort + } + } + return + } + // we have an AST; use it so we can report import location in errors + for _, dep := range fnode.imports { + parseProtoFile(acc, dep.name.val, dep.name.start(), errs, true, validate, parsed, lookupImport) + if errs.getError() != nil { + return // abort + } + } + } +} + +type parseResults struct { + resultsByFilename map[string]*parseResult + filenames []string +} + +func (r *parseResults) has(filename string) bool { + _, ok := r.resultsByFilename[filename] + return ok +} + +func (r *parseResults) add(filename string, result *parseResult) { + r.resultsByFilename[filename] = result + r.filenames = append(r.filenames, filename) +} + +type parseResult struct { + // handles any errors encountered during parsing, construction of file descriptor, + // or validation + errs *errorHandler + + // the parsed file descriptor + fd *dpb.FileDescriptorProto + + // if set to true, enables lenient interpretation of options, where + // unrecognized options will be left uninterpreted instead of resulting in a + // link error + lenient bool + + // a map of elements in the descriptor to nodes in the AST + // (for extracting position information when validating the descriptor) + nodes map[proto.Message]node + + // a map of uninterpreted option AST nodes to their relative path + // in the resulting options message + interpretedOptions map[*optionNode][]int32 +} + +func (r *parseResult) getFileNode(f *dpb.FileDescriptorProto) fileDecl { + if r.nodes == nil { + return noSourceNode{pos: unknownPos(f.GetName())} + } + return r.nodes[f].(fileDecl) +} + +func (r *parseResult) getOptionNode(o *dpb.UninterpretedOption) optionDecl { + if r.nodes == nil { + return noSourceNode{pos: unknownPos(r.fd.GetName())} + } + return r.nodes[o].(optionDecl) +} + +func (r *parseResult) getOptionNamePartNode(o *dpb.UninterpretedOption_NamePart) node { + if r.nodes == nil { + return noSourceNode{pos: unknownPos(r.fd.GetName())} + } + return r.nodes[o] +} + +func (r *parseResult) getFieldNode(f *dpb.FieldDescriptorProto) fieldDecl { + if r.nodes == nil { + return noSourceNode{pos: unknownPos(r.fd.GetName())} + } + return r.nodes[f].(fieldDecl) +} + +func (r *parseResult) getExtensionRangeNode(e *dpb.DescriptorProto_ExtensionRange) rangeDecl { + if r.nodes == nil { + return noSourceNode{pos: unknownPos(r.fd.GetName())} + } + return r.nodes[e].(rangeDecl) +} + +func (r *parseResult) getMessageReservedRangeNode(rr *dpb.DescriptorProto_ReservedRange) rangeDecl { + if r.nodes == nil { + return noSourceNode{pos: unknownPos(r.fd.GetName())} + } + return r.nodes[rr].(rangeDecl) +} + +func (r *parseResult) getEnumNode(e *dpb.EnumDescriptorProto) node { + if r.nodes == nil { + return noSourceNode{pos: unknownPos(r.fd.GetName())} + } + return r.nodes[e] +} + +func (r *parseResult) getEnumValueNode(e *dpb.EnumValueDescriptorProto) enumValueDecl { + if r.nodes == nil { + return noSourceNode{pos: unknownPos(r.fd.GetName())} + } + return r.nodes[e].(enumValueDecl) +} + +func (r *parseResult) getEnumReservedRangeNode(rr *dpb.EnumDescriptorProto_EnumReservedRange) rangeDecl { + if r.nodes == nil { + return noSourceNode{pos: unknownPos(r.fd.GetName())} + } + return r.nodes[rr].(rangeDecl) +} + +func (r *parseResult) getMethodNode(m *dpb.MethodDescriptorProto) methodDecl { + if r.nodes == nil { + return noSourceNode{pos: unknownPos(r.fd.GetName())} + } + return r.nodes[m].(methodDecl) +} + +func (r *parseResult) putFileNode(f *dpb.FileDescriptorProto, n *fileNode) { + r.nodes[f] = n +} + +func (r *parseResult) putOptionNode(o *dpb.UninterpretedOption, n *optionNode) { + r.nodes[o] = n +} + +func (r *parseResult) putOptionNamePartNode(o *dpb.UninterpretedOption_NamePart, n *optionNamePartNode) { + r.nodes[o] = n +} + +func (r *parseResult) putMessageNode(m *dpb.DescriptorProto, n msgDecl) { + r.nodes[m] = n +} + +func (r *parseResult) putFieldNode(f *dpb.FieldDescriptorProto, n fieldDecl) { + r.nodes[f] = n +} + +func (r *parseResult) putOneOfNode(o *dpb.OneofDescriptorProto, n *oneOfNode) { + r.nodes[o] = n +} + +func (r *parseResult) putExtensionRangeNode(e *dpb.DescriptorProto_ExtensionRange, n *rangeNode) { + r.nodes[e] = n +} + +func (r *parseResult) putMessageReservedRangeNode(rr *dpb.DescriptorProto_ReservedRange, n *rangeNode) { + r.nodes[rr] = n +} + +func (r *parseResult) putEnumNode(e *dpb.EnumDescriptorProto, n *enumNode) { + r.nodes[e] = n +} + +func (r *parseResult) putEnumValueNode(e *dpb.EnumValueDescriptorProto, n *enumValueNode) { + r.nodes[e] = n +} + +func (r *parseResult) putEnumReservedRangeNode(rr *dpb.EnumDescriptorProto_EnumReservedRange, n *rangeNode) { + r.nodes[rr] = n +} + +func (r *parseResult) putServiceNode(s *dpb.ServiceDescriptorProto, n *serviceNode) { + r.nodes[s] = n +} + +func (r *parseResult) putMethodNode(m *dpb.MethodDescriptorProto, n *methodNode) { + r.nodes[m] = n +} + +func parseProto(filename string, r io.Reader, errs *errorHandler, validate bool) *parseResult { + beforeErrs := errs.errsReported + lx := newLexer(r, filename, errs) + protoParse(lx) + + res := createParseResult(filename, lx.res, errs) + if validate && errs.err == nil { + validateBasic(res, errs.errsReported > beforeErrs) + } + + return res +} + +func createParseResult(filename string, file *fileNode, errs *errorHandler) *parseResult { + res := &parseResult{ + errs: errs, + nodes: map[proto.Message]node{}, + interpretedOptions: map[*optionNode][]int32{}, + } + if file == nil { + // nil AST means there was an error that prevented any parsing + // or the file was empty; synthesize empty non-nil AST + file = &fileNode{} + n := noSourceNode{pos: unknownPos(filename)} + file.setRange(&n, &n) + } + res.createFileDescriptor(filename, file) + return res +} + +func toNameParts(ident *compoundIdentNode) []*optionNamePartNode { + parts := strings.Split(ident.val, ".") + ret := make([]*optionNamePartNode, len(parts)) + offset := 0 + for i, p := range parts { + ret[i] = &optionNamePartNode{text: ident, offset: offset, length: len(p)} + ret[i].setRange(ident, ident) + offset += len(p) + 1 + } + return ret +} + +func checkTag(pos *SourcePos, v uint64, maxTag int32) error { + if v < 1 { + return errorWithPos(pos, "tag number %d must be greater than zero", v) + } else if v > uint64(maxTag) { + return errorWithPos(pos, "tag number %d is higher than max allowed tag number (%d)", v, maxTag) + } else if v >= internal.SpecialReservedStart && v <= internal.SpecialReservedEnd { + return errorWithPos(pos, "tag number %d is in disallowed reserved range %d-%d", v, internal.SpecialReservedStart, internal.SpecialReservedEnd) + } + return nil +} + +func checkExtensionTagsInFile(fd *desc.FileDescriptor, res *parseResult) error { + for _, fld := range fd.GetExtensions() { + if err := checkExtensionTag(fld, res); err != nil { + return err + } + } + for _, md := range fd.GetMessageTypes() { + if err := checkExtensionTagsInMessage(md, res); err != nil { + return err + } + } + return nil +} + +func checkExtensionTagsInMessage(md *desc.MessageDescriptor, res *parseResult) error { + for _, fld := range md.GetNestedExtensions() { + if err := checkExtensionTag(fld, res); err != nil { + return err + } + } + for _, nmd := range md.GetNestedMessageTypes() { + if err := checkExtensionTagsInMessage(nmd, res); err != nil { + return err + } + } + return nil +} + +func checkExtensionTag(fld *desc.FieldDescriptor, res *parseResult) error { + // NB: This is kind of gross that we don't enforce this in validateBasic(). But it would + // require doing some minimal linking there (to identify the extendee and locate its + // descriptor). To keep the code simpler, we just wait until things are fully linked. + + // In validateBasic() we just made sure these were within bounds for any message. But + // now that things are linked, we can check if the extendee is messageset wire format + // and, if not, enforce tighter limit. + if !fld.GetOwner().GetMessageOptions().GetMessageSetWireFormat() && fld.GetNumber() > internal.MaxNormalTag { + pos := res.nodes[fld.AsFieldDescriptorProto()].(fieldDecl).fieldTag().start() + return errorWithPos(pos, "tag number %d is higher than max allowed tag number (%d)", fld.GetNumber(), internal.MaxNormalTag) + } + return nil +} + +func aggToString(agg []*aggregateEntryNode, buf *bytes.Buffer) { + buf.WriteString("{") + for _, a := range agg { + buf.WriteString(" ") + buf.WriteString(a.name.value()) + if v, ok := a.val.(*aggregateLiteralNode); ok { + aggToString(v.elements, buf) + } else { + buf.WriteString(": ") + elementToString(a.val.value(), buf) + } + } + buf.WriteString(" }") +} + +func elementToString(v interface{}, buf *bytes.Buffer) { + switch v := v.(type) { + case bool, int64, uint64, identifier: + _, _ = fmt.Fprintf(buf, "%v", v) + case float64: + if math.IsInf(v, 1) { + buf.WriteString(": inf") + } else if math.IsInf(v, -1) { + buf.WriteString(": -inf") + } else if math.IsNaN(v) { + buf.WriteString(": nan") + } else { + _, _ = fmt.Fprintf(buf, ": %v", v) + } + case string: + buf.WriteRune('"') + writeEscapedBytes(buf, []byte(v)) + buf.WriteRune('"') + case []valueNode: + buf.WriteString(": [") + first := true + for _, e := range v { + if first { + first = false + } else { + buf.WriteString(", ") + } + elementToString(e.value(), buf) + } + buf.WriteString("]") + case []*aggregateEntryNode: + aggToString(v, buf) + } +} + +func writeEscapedBytes(buf *bytes.Buffer, b []byte) { + for _, c := range b { + switch c { + case '\n': + buf.WriteString("\\n") + case '\r': + buf.WriteString("\\r") + case '\t': + buf.WriteString("\\t") + case '"': + buf.WriteString("\\\"") + case '\'': + buf.WriteString("\\'") + case '\\': + buf.WriteString("\\\\") + default: + if c >= 0x20 && c <= 0x7f && c != '"' && c != '\\' { + // simple printable characters + buf.WriteByte(c) + } else { + // use octal escape for all other values + buf.WriteRune('\\') + buf.WriteByte('0' + ((c >> 6) & 0x7)) + buf.WriteByte('0' + ((c >> 3) & 0x7)) + buf.WriteByte('0' + (c & 0x7)) + } + } + } +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/proto.y b/vendor/github.com/jhump/protoreflect/desc/protoparse/proto.y new file mode 100644 index 00000000..b7320707 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/proto.y @@ -0,0 +1,920 @@ +%{ +package protoparse + +//lint:file-ignore SA4006 generated parser has unused values + +import ( + "fmt" + "math" +) + +%} + +// fields inside this union end up as the fields in a structure known +// as ${PREFIX}SymType, of which a reference is passed to the lexer. +%union{ + file *fileNode + fileDecls []*fileElement + syn *syntaxNode + pkg *packageNode + imprt *importNode + msg *messageNode + msgDecls []*messageElement + fld *fieldNode + mapFld *mapFieldNode + mapType *mapTypeNode + grp *groupNode + oo *oneOfNode + ooDecls []*oneOfElement + ext *extensionRangeNode + resvd *reservedNode + en *enumNode + enDecls []*enumElement + env *enumValueNode + extend *extendNode + extDecls []*extendElement + svc *serviceNode + svcDecls []*serviceElement + mtd *methodNode + rpcType *rpcTypeNode + opts []*optionNode + optNm []*optionNamePartNode + cmpctOpts *compactOptionsNode + rngs []*rangeNode + names []*compoundStringNode + cid *compoundIdentNode + sl []valueNode + agg []*aggregateEntryNode + aggName *aggregateNameNode + v valueNode + il *compoundIntNode + str *compoundStringNode + s *stringLiteralNode + i *intLiteralNode + f *floatLiteralNode + id *identNode + b *basicNode + err error +} + +// any non-terminal which returns a value needs a type, which is +// really a field name in the above union struct +%type file +%type syntax +%type fileDecl fileDecls +%type import +%type package +%type option compactOption compactOptionDecls rpcOption rpcOptions +%type optionName optionNameComponent +%type compactOptions +%type constant scalarConstant aggregate numLit +%type intLit +%type name keyType +%type ident typeIdent +%type aggName +%type constantList +%type aggFields aggField aggFieldEntry +%type field oneofField +%type oneof +%type group oneofGroup +%type mapField +%type mapType +%type message +%type messageItem messageBody +%type oneofItem oneofBody +%type fieldNames +%type msgReserved enumReserved reservedNames +%type tagRange tagRanges enumRange enumRanges +%type extensions +%type enum +%type enumItem enumBody +%type enumField +%type extend +%type extendItem extendBody +%type stringLit +%type service +%type serviceItem serviceBody +%type rpc +%type rpcType + +// same for terminals +%token _STRING_LIT +%token _INT_LIT +%token _FLOAT_LIT +%token _NAME +%token _SYNTAX _IMPORT _WEAK _PUBLIC _PACKAGE _OPTION _TRUE _FALSE _INF _NAN _REPEATED _OPTIONAL _REQUIRED +%token _DOUBLE _FLOAT _INT32 _INT64 _UINT32 _UINT64 _SINT32 _SINT64 _FIXED32 _FIXED64 _SFIXED32 _SFIXED64 +%token _BOOL _STRING _BYTES _GROUP _ONEOF _MAP _EXTENSIONS _TO _MAX _RESERVED _ENUM _MESSAGE _EXTEND +%token _SERVICE _RPC _STREAM _RETURNS +%token _ERROR +// we define all of these, even ones that aren't used, to improve error messages +// so it shows the unexpected symbol instead of showing "$unk" +%token '=' ';' ':' '{' '}' '\\' '/' '?' '.' ',' '>' '<' '+' '-' '(' ')' '[' ']' '*' '&' '^' '%' '$' '#' '@' '!' '~' '`' + +%% + +file : syntax { + $$ = &fileNode{syntax: $1} + $$.setRange($1, $1) + protolex.(*protoLex).res = $$ + } + | fileDecls { + $$ = &fileNode{decls: $1} + if len($1) > 0 { + $$.setRange($1[0], $1[len($1)-1]) + } + protolex.(*protoLex).res = $$ + } + | syntax fileDecls { + $$ = &fileNode{syntax: $1, decls: $2} + var end node + if len($2) > 0 { + end = $2[len($2)-1] + } else { + end = $1 + } + $$.setRange($1, end) + protolex.(*protoLex).res = $$ + } + | { + } + +fileDecls : fileDecls fileDecl { + $$ = append($1, $2...) + } + | fileDecl + +fileDecl : import { + $$ = []*fileElement{{imp: $1}} + } + | package { + $$ = []*fileElement{{pkg: $1}} + } + | option { + $$ = []*fileElement{{option: $1[0]}} + } + | message { + $$ = []*fileElement{{message: $1}} + } + | enum { + $$ = []*fileElement{{enum: $1}} + } + | extend { + $$ = []*fileElement{{extend: $1}} + } + | service { + $$ = []*fileElement{{service: $1}} + } + | ';' { + $$ = []*fileElement{{empty: $1}} + } + | error ';' { + } + | error { + } + +syntax : _SYNTAX '=' stringLit ';' { + $$ = &syntaxNode{syntax: $3} + $$.setRange($1, $4) + } + +import : _IMPORT stringLit ';' { + $$ = &importNode{ name: $2 } + $$.setRange($1, $3) + } + | _IMPORT _WEAK stringLit ';' { + $$ = &importNode{ name: $3, weak: true } + $$.setRange($1, $4) + } + | _IMPORT _PUBLIC stringLit ';' { + $$ = &importNode{ name: $3, public: true } + $$.setRange($1, $4) + } + +package : _PACKAGE ident ';' { + $$ = &packageNode{name: $2} + $$.setRange($1, $3) + } + +ident : name { + $$ = &compoundIdentNode{val: $1.val} + $$.setRange($1, $1) + } + | ident '.' name { + $$ = &compoundIdentNode{val: $1.val + "." + $3.val} + $$.setRange($1, $3) + } + +option : _OPTION optionName '=' constant ';' { + n := &optionNameNode{parts: $2} + n.setRange($2[0], $2[len($2)-1]) + o := &optionNode{name: n, val: $4} + o.setRange($1, $5) + $$ = []*optionNode{o} + } + +optionName : optionNameComponent + | + optionName '.' optionNameComponent { + $$ = append($1, $3...) + } + + +optionNameComponent : name { + nm := &compoundIdentNode{val: $1.val} + nm.setRange($1, $1) + $$ = toNameParts(nm) + } + | '(' typeIdent ')' { + p := &optionNamePartNode{text: $2, isExtension: true} + p.setRange($1, $3) + $$ = []*optionNamePartNode{p} + } + +constant : scalarConstant + | aggregate + +scalarConstant : stringLit { + $$ = $1 + } + | numLit + | name { + if $1.val == "true" { + $$ = &boolLiteralNode{identNode: $1, val: true} + } else if $1.val == "false" { + $$ = &boolLiteralNode{identNode: $1, val: false} + } else if $1.val == "inf" { + f := &compoundFloatNode{val: math.Inf(1)} + f.setRange($1, $1) + $$ = f + } else if $1.val == "nan" { + f := &compoundFloatNode{val: math.NaN()} + f.setRange($1, $1) + $$ = f + } else { + $$ = $1 + } + } + +numLit : _FLOAT_LIT { + $$ = $1 + } + | '-' _FLOAT_LIT { + f := &compoundFloatNode{val: -$2.val} + f.setRange($1, $2) + $$ = f + } + | '+' _FLOAT_LIT { + f := &compoundFloatNode{val: $2.val} + f.setRange($1, $2) + $$ = f + } + | '+' _INF { + f := &compoundFloatNode{val: math.Inf(1)} + f.setRange($1, $2) + $$ = f + } + | '-' _INF { + f := &compoundFloatNode{val: math.Inf(-1)} + f.setRange($1, $2) + $$ = f + } + | _INT_LIT { + $$ = $1 + } + | '+' _INT_LIT { + i := &compoundUintNode{val: $2.val} + i.setRange($1, $2) + $$ = i + } + | '-' _INT_LIT { + if $2.val > math.MaxInt64 + 1 { + // can't represent as int so treat as float literal + f := &compoundFloatNode{val: -float64($2.val)} + f.setRange($1, $2) + $$ = f + } else { + i := &compoundIntNode{val: -int64($2.val)} + i.setRange($1, $2) + $$ = i + } + } + +stringLit : _STRING_LIT { + $$ = &compoundStringNode{val: $1.val} + $$.setRange($1, $1) + } + | stringLit _STRING_LIT { + $$ = &compoundStringNode{val: $1.val + $2.val} + $$.setRange($1, $2) + } + +aggregate : '{' aggFields '}' { + a := &aggregateLiteralNode{elements: $2} + a.setRange($1, $3) + $$ = a + } + +aggFields : aggField + | aggFields aggField { + $$ = append($1, $2...) + } + | { + $$ = nil + } + +aggField : aggFieldEntry + | aggFieldEntry ',' { + $$ = $1 + } + | aggFieldEntry ';' { + $$ = $1 + } + | error ',' { + } + | error ';' { + } + | error { + } + +aggFieldEntry : aggName ':' scalarConstant { + a := &aggregateEntryNode{name: $1, val: $3} + a.setRange($1, $3) + $$ = []*aggregateEntryNode{a} + } + | aggName ':' '[' ']' { + s := &sliceLiteralNode{} + s.setRange($3, $4) + a := &aggregateEntryNode{name: $1, val: s} + a.setRange($1, $4) + $$ = []*aggregateEntryNode{a} + } + | aggName ':' '[' constantList ']' { + s := &sliceLiteralNode{elements: $4} + s.setRange($3, $5) + a := &aggregateEntryNode{name: $1, val: s} + a.setRange($1, $5) + $$ = []*aggregateEntryNode{a} + } + | aggName ':' '[' error ']' { + } + | aggName ':' aggregate { + a := &aggregateEntryNode{name: $1, val: $3} + a.setRange($1, $3) + $$ = []*aggregateEntryNode{a} + } + | aggName aggregate { + a := &aggregateEntryNode{name: $1, val: $2} + a.setRange($1, $2) + $$ = []*aggregateEntryNode{a} + } + | aggName ':' '<' aggFields '>' { + s := &aggregateLiteralNode{elements: $4} + s.setRange($3, $5) + a := &aggregateEntryNode{name: $1, val: s} + a.setRange($1, $5) + $$ = []*aggregateEntryNode{a} + } + | aggName '<' aggFields '>' { + s := &aggregateLiteralNode{elements: $3} + s.setRange($2, $4) + a := &aggregateEntryNode{name: $1, val: s} + a.setRange($1, $4) + $$ = []*aggregateEntryNode{a} + } + | aggName ':' '<' error '>' { + } + | aggName '<' error '>' { + } + +aggName : name { + n := &compoundIdentNode{val: $1.val} + n.setRange($1, $1) + $$ = &aggregateNameNode{name: n} + $$.setRange($1, $1) + } + | '[' typeIdent ']' { + $$ = &aggregateNameNode{name: $2, isExtension: true} + $$.setRange($1, $3) + } + | '[' error ']' { + } + +constantList : constant { + $$ = []valueNode{$1} + } + | constantList ',' constant { + $$ = append($1, $3) + } + | constantList ';' constant { + $$ = append($1, $3) + } + | '<' aggFields '>' { + s := &aggregateLiteralNode{elements: $2} + s.setRange($1, $3) + $$ = []valueNode{s} + } + | constantList ',' '<' aggFields '>' { + s := &aggregateLiteralNode{elements: $4} + s.setRange($3, $5) + $$ = append($1, s) + } + | constantList ';' '<' aggFields '>' { + s := &aggregateLiteralNode{elements: $4} + s.setRange($3, $5) + $$ = append($1, s) + } + | '<' error '>' { + } + | constantList ',' '<' error '>' { + } + | constantList ';' '<' error '>' { + } + +typeIdent : ident + | '.' ident { + $$ = &compoundIdentNode{val: "." + $2.val} + $$.setRange($1, $2) + } + +field : _REQUIRED typeIdent name '=' _INT_LIT ';' { + lbl := fieldLabel{identNode: $1, required: true} + $$ = &fieldNode{label: lbl, fldType: $2, name: $3, tag: $5} + $$.setRange($1, $6) + } + | _OPTIONAL typeIdent name '=' _INT_LIT ';' { + lbl := fieldLabel{identNode: $1} + $$ = &fieldNode{label: lbl, fldType: $2, name: $3, tag: $5} + $$.setRange($1, $6) + } + | _REPEATED typeIdent name '=' _INT_LIT ';' { + lbl := fieldLabel{identNode: $1, repeated: true} + $$ = &fieldNode{label: lbl, fldType: $2, name: $3, tag: $5} + $$.setRange($1, $6) + } + | typeIdent name '=' _INT_LIT ';' { + $$ = &fieldNode{fldType: $1, name: $2, tag: $4} + $$.setRange($1, $5) + } + | _REQUIRED typeIdent name '=' _INT_LIT compactOptions ';' { + lbl := fieldLabel{identNode: $1, required: true} + $$ = &fieldNode{label: lbl, fldType: $2, name: $3, tag: $5, options: $6} + $$.setRange($1, $7) + } + | _OPTIONAL typeIdent name '=' _INT_LIT compactOptions ';' { + lbl := fieldLabel{identNode: $1} + $$ = &fieldNode{label: lbl, fldType: $2, name: $3, tag: $5, options: $6} + $$.setRange($1, $7) + } + | _REPEATED typeIdent name '=' _INT_LIT compactOptions ';' { + lbl := fieldLabel{identNode: $1, repeated: true} + $$ = &fieldNode{label: lbl, fldType: $2, name: $3, tag: $5, options: $6} + $$.setRange($1, $7) + } + | typeIdent name '=' _INT_LIT compactOptions ';' { + $$ = &fieldNode{fldType: $1, name: $2, tag: $4, options: $5} + $$.setRange($1, $6) + } + +compactOptions: '[' compactOptionDecls ']' { + $$ = &compactOptionsNode{decls: $2} + $$.setRange($1, $3) + } + +compactOptionDecls : compactOptionDecls ',' compactOption { + $$ = append($1, $3...) + } + | compactOption + +compactOption: optionName '=' constant { + n := &optionNameNode{parts: $1} + n.setRange($1[0], $1[len($1)-1]) + o := &optionNode{name: n, val: $3} + o.setRange($1[0], $3) + $$ = []*optionNode{o} + } + +group : _REQUIRED _GROUP name '=' _INT_LIT '{' messageBody '}' { + lbl := fieldLabel{identNode: $1, required: true} + $$ = &groupNode{groupKeyword: $2, label: lbl, name: $3, tag: $5, decls: $7} + $$.setRange($1, $8) + } + | _OPTIONAL _GROUP name '=' _INT_LIT '{' messageBody '}' { + lbl := fieldLabel{identNode: $1} + $$ = &groupNode{groupKeyword: $2, label: lbl, name: $3, tag: $5, decls: $7} + $$.setRange($1, $8) + } + | _REPEATED _GROUP name '=' _INT_LIT '{' messageBody '}' { + lbl := fieldLabel{identNode: $1, repeated: true} + $$ = &groupNode{groupKeyword: $2, label: lbl, name: $3, tag: $5, decls: $7} + $$.setRange($1, $8) + } + | _REQUIRED _GROUP name '=' _INT_LIT compactOptions '{' messageBody '}' { + lbl := fieldLabel{identNode: $1, required: true} + $$ = &groupNode{groupKeyword: $2, label: lbl, name: $3, tag: $5, options: $6, decls: $8} + $$.setRange($1, $9) + } + | _OPTIONAL _GROUP name '=' _INT_LIT compactOptions '{' messageBody '}' { + lbl := fieldLabel{identNode: $1} + $$ = &groupNode{groupKeyword: $2, label: lbl, name: $3, tag: $5, options: $6, decls: $8} + $$.setRange($1, $9) + } + | _REPEATED _GROUP name '=' _INT_LIT compactOptions '{' messageBody '}' { + lbl := fieldLabel{identNode: $1, repeated: true} + $$ = &groupNode{groupKeyword: $2, label: lbl, name: $3, tag: $5, options: $6, decls: $8} + $$.setRange($1, $9) + } + +oneof : _ONEOF name '{' oneofBody '}' { + $$ = &oneOfNode{name: $2, decls: $4} + $$.setRange($1, $5) + } + +oneofBody : oneofBody oneofItem { + $$ = append($1, $2...) + } + | oneofItem + | { + $$ = nil + } + +oneofItem : option { + $$ = []*oneOfElement{{option: $1[0]}} + } + | oneofField { + $$ = []*oneOfElement{{field: $1}} + } + | oneofGroup { + $$ = []*oneOfElement{{group: $1}} + } + | ';' { + $$ = []*oneOfElement{{empty: $1}} + } + | error ';' { + } + | error { + } + +oneofField : typeIdent name '=' _INT_LIT ';' { + $$ = &fieldNode{fldType: $1, name: $2, tag: $4} + $$.setRange($1, $5) + } + | typeIdent name '=' _INT_LIT compactOptions ';' { + $$ = &fieldNode{fldType: $1, name: $2, tag: $4, options: $5} + $$.setRange($1, $6) + } + +oneofGroup : _GROUP name '=' _INT_LIT '{' messageBody '}' { + $$ = &groupNode{groupKeyword: $1, name: $2, tag: $4, decls: $6} + $$.setRange($1, $7) + } + | _GROUP name '=' _INT_LIT compactOptions '{' messageBody '}' { + $$ = &groupNode{groupKeyword: $1, name: $2, tag: $4, options: $5, decls: $7} + $$.setRange($1, $8) + } + +mapField : mapType name '=' _INT_LIT ';' { + $$ = &mapFieldNode{mapType: $1, name: $2, tag: $4} + $$.setRange($1, $5) + } + | mapType name '=' _INT_LIT compactOptions ';' { + $$ = &mapFieldNode{mapType: $1, name: $2, tag: $4, options: $5} + $$.setRange($1, $6) + } + +mapType : _MAP '<' keyType ',' typeIdent '>' { + $$ = &mapTypeNode{mapKeyword: $1, keyType: $3, valueType: $5} + $$.setRange($1, $6) +} + +keyType : _INT32 + | _INT64 + | _UINT32 + | _UINT64 + | _SINT32 + | _SINT64 + | _FIXED32 + | _FIXED64 + | _SFIXED32 + | _SFIXED64 + | _BOOL + | _STRING + +extensions : _EXTENSIONS tagRanges ';' { + $$ = &extensionRangeNode{ranges: $2} + $$.setRange($1, $3) + } + | _EXTENSIONS tagRanges compactOptions ';' { + $$ = &extensionRangeNode{ranges: $2, options: $3} + $$.setRange($1, $4) + } + +tagRanges : tagRanges ',' tagRange { + $$ = append($1, $3...) + } + | tagRange + +tagRange : _INT_LIT { + r := &rangeNode{startNode: $1} + r.setRange($1, $1) + $$ = []*rangeNode{r} + } + | _INT_LIT _TO _INT_LIT { + r := &rangeNode{startNode: $1, endNode: $3} + r.setRange($1, $3) + $$ = []*rangeNode{r} + } + | _INT_LIT _TO _MAX { + r := &rangeNode{startNode: $1, endNode: $3, endMax: true} + r.setRange($1, $3) + $$ = []*rangeNode{r} + } + +enumRanges : enumRanges ',' enumRange { + $$ = append($1, $3...) + } + | enumRange + +enumRange : intLit { + r := &rangeNode{startNode: $1} + r.setRange($1, $1) + $$ = []*rangeNode{r} + } + | intLit _TO intLit { + r := &rangeNode{startNode: $1, endNode: $3} + r.setRange($1, $3) + $$ = []*rangeNode{r} + } + | intLit _TO _MAX { + r := &rangeNode{startNode: $1, endNode: $3, endMax: true} + r.setRange($1, $3) + $$ = []*rangeNode{r} + } + +intLit : _INT_LIT { + i := &compoundIntNode{val: int64($1.val)} + i.setRange($1, $1) + $$ = i + } + | '-' _INT_LIT { + if $2.val > math.MaxInt64 + 1 { + lexError(protolex, $2.start(), fmt.Sprintf("numeric constant %d would underflow 64-bit signed int (allowed range is %d to %d)", $2.val, int64(math.MinInt64), int64(math.MaxInt64))) + } + i := &compoundIntNode{val: -int64($2.val)} + i.setRange($1, $2) + $$ = i + } + +msgReserved : _RESERVED tagRanges ';' { + $$ = &reservedNode{ranges: $2} + $$.setRange($1, $3) + } + | reservedNames + +enumReserved : _RESERVED enumRanges ';' { + $$ = &reservedNode{ranges: $2} + $$.setRange($1, $3) + } + | reservedNames + +reservedNames : _RESERVED fieldNames ';' { + $$ = &reservedNode{names: $2} + $$.setRange($1, $3) + } + +fieldNames : fieldNames ',' stringLit { + $$ = append($1, $3) + } + | stringLit { + $$ = []*compoundStringNode{$1} + } + +enum : _ENUM name '{' enumBody '}' { + $$ = &enumNode{name: $2, decls: $4} + $$.setRange($1, $5) + } + +enumBody : enumBody enumItem { + $$ = append($1, $2...) + } + | enumItem + | { + $$ = nil + } + +enumItem : option { + $$ = []*enumElement{{option: $1[0]}} + } + | enumField { + $$ = []*enumElement{{value: $1}} + } + | enumReserved { + $$ = []*enumElement{{reserved: $1}} + } + | ';' { + $$ = []*enumElement{{empty: $1}} + } + | error ';' { + } + | error { + } + +enumField : name '=' intLit ';' { + $$ = &enumValueNode{name: $1, number: $3} + $$.setRange($1, $4) + } + | name '=' intLit compactOptions ';' { + $$ = &enumValueNode{name: $1, number: $3, options: $4} + $$.setRange($1, $5) + } + +message : _MESSAGE name '{' messageBody '}' { + $$ = &messageNode{name: $2, decls: $4} + $$.setRange($1, $5) + } + +messageBody : messageBody messageItem { + $$ = append($1, $2...) + } + | messageItem + | { + $$ = nil + } + +messageItem : field { + $$ = []*messageElement{{field: $1}} + } + | enum { + $$ = []*messageElement{{enum: $1}} + } + | message { + $$ = []*messageElement{{nested: $1}} + } + | extend { + $$ = []*messageElement{{extend: $1}} + } + | extensions { + $$ = []*messageElement{{extensionRange: $1}} + } + | group { + $$ = []*messageElement{{group: $1}} + } + | option { + $$ = []*messageElement{{option: $1[0]}} + } + | oneof { + $$ = []*messageElement{{oneOf: $1}} + } + | mapField { + $$ = []*messageElement{{mapField: $1}} + } + | msgReserved { + $$ = []*messageElement{{reserved: $1}} + } + | ';' { + $$ = []*messageElement{{empty: $1}} + } + | error ';' { + } + | error { + } + +extend : _EXTEND typeIdent '{' extendBody '}' { + $$ = &extendNode{extendee: $2, decls: $4} + $$.setRange($1, $5) + } + +extendBody : extendBody extendItem { + $$ = append($1, $2...) + } + | extendItem + | { + $$ = nil + } + +extendItem : field { + $$ = []*extendElement{{field: $1}} + } + | group { + $$ = []*extendElement{{group: $1}} + } + | ';' { + $$ = []*extendElement{{empty: $1}} + } + | error ';' { + } + | error { + } + +service : _SERVICE name '{' serviceBody '}' { + $$ = &serviceNode{name: $2, decls: $4} + $$.setRange($1, $5) + } + +serviceBody : serviceBody serviceItem { + $$ = append($1, $2...) + } + | serviceItem + | { + $$ = nil + } + +// NB: doc suggests support for "stream" declaration, separate from "rpc", but +// it does not appear to be supported in protoc (doc is likely from grammar for +// Google-internal version of protoc, with support for streaming stubby) +serviceItem : option { + $$ = []*serviceElement{{option: $1[0]}} + } + | rpc { + $$ = []*serviceElement{{rpc: $1}} + } + | ';' { + $$ = []*serviceElement{{empty: $1}} + } + | error ';' { + } + | error { + } + +rpc : _RPC name '(' rpcType ')' _RETURNS '(' rpcType ')' ';' { + $$ = &methodNode{name: $2, input: $4, output: $8} + $$.setRange($1, $10) + } + | _RPC name '(' rpcType ')' _RETURNS '(' rpcType ')' '{' rpcOptions '}' { + $$ = &methodNode{name: $2, input: $4, output: $8, options: $11} + $$.setRange($1, $12) + } + +rpcType : _STREAM typeIdent { + $$ = &rpcTypeNode{msgType: $2, streamKeyword: $1} + $$.setRange($1, $2) + } + | typeIdent { + $$ = &rpcTypeNode{msgType: $1} + $$.setRange($1, $1) + } + +rpcOptions : rpcOptions rpcOption { + $$ = append($1, $2...) + } + | rpcOption + | { + $$ = []*optionNode{} + } + +rpcOption : option { + $$ = $1 + } + | ';' { + $$ = []*optionNode{} + } + | error ';' { + } + | error { + } + +name : _NAME + | _SYNTAX + | _IMPORT + | _WEAK + | _PUBLIC + | _PACKAGE + | _OPTION + | _TRUE + | _FALSE + | _INF + | _NAN + | _REPEATED + | _OPTIONAL + | _REQUIRED + | _DOUBLE + | _FLOAT + | _INT32 + | _INT64 + | _UINT32 + | _UINT64 + | _SINT32 + | _SINT64 + | _FIXED32 + | _FIXED64 + | _SFIXED32 + | _SFIXED64 + | _BOOL + | _STRING + | _BYTES + | _GROUP + | _ONEOF + | _MAP + | _EXTENSIONS + | _TO + | _MAX + | _RESERVED + | _ENUM + | _MESSAGE + | _EXTEND + | _SERVICE + | _RPC + | _STREAM + | _RETURNS + +%% diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/proto.y.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/proto.y.go new file mode 100644 index 00000000..1c91002a --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/proto.y.go @@ -0,0 +1,2310 @@ +// Code generated by goyacc -o proto.y.go -p proto proto.y. DO NOT EDIT. + +//line proto.y:2 +package protoparse + +import __yyfmt__ "fmt" + +//line proto.y:2 + +//lint:file-ignore SA4006 generated parser has unused values + +import ( + "fmt" + "math" +) + +//line proto.y:15 +type protoSymType struct { + yys int + file *fileNode + fileDecls []*fileElement + syn *syntaxNode + pkg *packageNode + imprt *importNode + msg *messageNode + msgDecls []*messageElement + fld *fieldNode + mapFld *mapFieldNode + mapType *mapTypeNode + grp *groupNode + oo *oneOfNode + ooDecls []*oneOfElement + ext *extensionRangeNode + resvd *reservedNode + en *enumNode + enDecls []*enumElement + env *enumValueNode + extend *extendNode + extDecls []*extendElement + svc *serviceNode + svcDecls []*serviceElement + mtd *methodNode + rpcType *rpcTypeNode + opts []*optionNode + optNm []*optionNamePartNode + cmpctOpts *compactOptionsNode + rngs []*rangeNode + names []*compoundStringNode + cid *compoundIdentNode + sl []valueNode + agg []*aggregateEntryNode + aggName *aggregateNameNode + v valueNode + il *compoundIntNode + str *compoundStringNode + s *stringLiteralNode + i *intLiteralNode + f *floatLiteralNode + id *identNode + b *basicNode + err error +} + +const _STRING_LIT = 57346 +const _INT_LIT = 57347 +const _FLOAT_LIT = 57348 +const _NAME = 57349 +const _SYNTAX = 57350 +const _IMPORT = 57351 +const _WEAK = 57352 +const _PUBLIC = 57353 +const _PACKAGE = 57354 +const _OPTION = 57355 +const _TRUE = 57356 +const _FALSE = 57357 +const _INF = 57358 +const _NAN = 57359 +const _REPEATED = 57360 +const _OPTIONAL = 57361 +const _REQUIRED = 57362 +const _DOUBLE = 57363 +const _FLOAT = 57364 +const _INT32 = 57365 +const _INT64 = 57366 +const _UINT32 = 57367 +const _UINT64 = 57368 +const _SINT32 = 57369 +const _SINT64 = 57370 +const _FIXED32 = 57371 +const _FIXED64 = 57372 +const _SFIXED32 = 57373 +const _SFIXED64 = 57374 +const _BOOL = 57375 +const _STRING = 57376 +const _BYTES = 57377 +const _GROUP = 57378 +const _ONEOF = 57379 +const _MAP = 57380 +const _EXTENSIONS = 57381 +const _TO = 57382 +const _MAX = 57383 +const _RESERVED = 57384 +const _ENUM = 57385 +const _MESSAGE = 57386 +const _EXTEND = 57387 +const _SERVICE = 57388 +const _RPC = 57389 +const _STREAM = 57390 +const _RETURNS = 57391 +const _ERROR = 57392 + +var protoToknames = [...]string{ + "$end", + "error", + "$unk", + "_STRING_LIT", + "_INT_LIT", + "_FLOAT_LIT", + "_NAME", + "_SYNTAX", + "_IMPORT", + "_WEAK", + "_PUBLIC", + "_PACKAGE", + "_OPTION", + "_TRUE", + "_FALSE", + "_INF", + "_NAN", + "_REPEATED", + "_OPTIONAL", + "_REQUIRED", + "_DOUBLE", + "_FLOAT", + "_INT32", + "_INT64", + "_UINT32", + "_UINT64", + "_SINT32", + "_SINT64", + "_FIXED32", + "_FIXED64", + "_SFIXED32", + "_SFIXED64", + "_BOOL", + "_STRING", + "_BYTES", + "_GROUP", + "_ONEOF", + "_MAP", + "_EXTENSIONS", + "_TO", + "_MAX", + "_RESERVED", + "_ENUM", + "_MESSAGE", + "_EXTEND", + "_SERVICE", + "_RPC", + "_STREAM", + "_RETURNS", + "_ERROR", + "'='", + "';'", + "':'", + "'{'", + "'}'", + "'\\\\'", + "'/'", + "'?'", + "'.'", + "','", + "'>'", + "'<'", + "'+'", + "'-'", + "'('", + "')'", + "'['", + "']'", + "'*'", + "'&'", + "'^'", + "'%'", + "'$'", + "'#'", + "'@'", + "'!'", + "'~'", + "'`'", +} +var protoStatenames = [...]string{} + +const protoEofCode = 1 +const protoErrCode = 2 +const protoInitialStackSize = 16 + +//line proto.y:920 + +//line yacctab:1 +var protoExca = [...]int{ + -1, 0, + 1, 4, + -2, 0, + -1, 1, + 1, -1, + -2, 0, + -1, 2, + 1, 1, + -2, 0, + -1, 3, + 1, 2, + -2, 0, + -1, 22, + 1, 3, + -2, 0, + -1, 95, + 55, 161, + -2, 0, + -1, 96, + 55, 149, + -2, 0, + -1, 97, + 55, 178, + -2, 0, + -1, 99, + 55, 187, + -2, 0, + -1, 110, + 55, 47, + -2, 0, + -1, 225, + 61, 47, + -2, 0, + -1, 240, + 55, 99, + -2, 0, + -1, 267, + 61, 47, + -2, 0, + -1, 310, + 61, 47, + -2, 0, + -1, 347, + 55, 161, + -2, 0, + -1, 351, + 55, 161, + -2, 0, + -1, 355, + 55, 161, + -2, 0, + -1, 366, + 61, 47, + -2, 0, + -1, 368, + 61, 47, + -2, 0, + -1, 373, + 55, 161, + -2, 0, + -1, 376, + 55, 161, + -2, 0, + -1, 379, + 55, 161, + -2, 0, + -1, 395, + 55, 161, + -2, 0, + -1, 407, + 55, 161, + -2, 0, + -1, 412, + 55, 199, + -2, 0, +} + +const protoPrivate = 57344 + +const protoLast = 2738 + +var protoAct = [...]int{ + + 31, 125, 8, 415, 8, 8, 118, 303, 169, 104, + 287, 236, 75, 282, 117, 207, 193, 134, 77, 79, + 80, 106, 84, 206, 8, 105, 107, 124, 119, 156, + 162, 143, 146, 192, 395, 76, 82, 324, 81, 170, + 339, 340, 26, 393, 235, 323, 353, 238, 338, 355, + 351, 85, 237, 30, 88, 89, 337, 349, 238, 238, + 347, 238, 238, 238, 345, 331, 321, 298, 271, 270, + 408, 208, 238, 238, 335, 116, 382, 297, 200, 238, + 238, 238, 238, 29, 208, 208, 263, 363, 91, 407, + 223, 110, 103, 109, 77, 222, 94, 152, 147, 225, + 222, 163, 421, 221, 401, 222, 379, 302, 221, 399, + 222, 174, 405, 221, 370, 90, 376, 377, 221, 344, + 98, 373, 91, 222, 183, 158, 157, 240, 154, 115, + 209, 221, 314, 87, 87, 191, 80, 79, 99, 97, + 77, 195, 196, 209, 209, 260, 152, 147, 243, 185, + 187, 189, 242, 259, 222, 81, 244, 220, 325, 92, + 237, 166, 221, 163, 96, 219, 93, 93, 216, 199, + 174, 411, 17, 412, 95, 87, 197, 154, 202, 87, + 199, 102, 101, 158, 157, 211, 228, 229, 230, 231, + 232, 233, 214, 226, 14, 224, 166, 418, 374, 371, + 4, 15, 418, 362, 16, 17, 167, 17, 17, 218, + 357, 165, 334, 17, 213, 328, 279, 215, 212, 203, + 258, 184, 168, 100, 109, 25, 174, 86, 361, 360, + 277, 276, 275, 274, 268, 19, 18, 20, 21, 77, + 273, 167, 288, 284, 13, 266, 165, 417, 272, 264, + 419, 283, 417, 241, 280, 234, 204, 24, 293, 364, + 261, 239, 381, 5, 29, 194, 109, 23, 174, 174, + 299, 296, 380, 181, 179, 309, 311, 301, 320, 285, + 319, 305, 318, 300, 180, 29, 23, 317, 288, 316, + 322, 27, 28, 315, 329, 330, 295, 327, 122, 11, + 194, 11, 11, 14, 293, 178, 176, 332, 218, 278, + 15, 174, 174, 16, 17, 333, 177, 262, 87, 341, + 29, 11, 336, 164, 161, 77, 109, 346, 348, 350, + 352, 354, 356, 3, 12, 359, 22, 283, 358, 109, + 109, 155, 174, 148, 19, 18, 20, 21, 365, 367, + 145, 218, 123, 13, 205, 120, 10, 149, 10, 10, + 121, 9, 372, 9, 9, 128, 375, 174, 198, 174, + 378, 286, 141, 127, 290, 383, 126, 385, 10, 183, + 289, 218, 183, 9, 174, 183, 174, 171, 388, 307, + 397, 390, 394, 396, 392, 183, 173, 183, 245, 183, + 305, 108, 414, 281, 7, 6, 2, 1, 0, 0, + 406, 0, 0, 183, 416, 0, 416, 183, 420, 0, + 0, 0, 410, 218, 308, 218, 29, 114, 111, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 0, 0, 0, 0, 110, 0, 0, 0, + 0, 0, 0, 0, 310, 113, 112, 0, 0, 0, + 306, 29, 114, 111, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 0, 0, 0, + 0, 110, 0, 0, 0, 0, 0, 0, 0, 267, + 113, 112, 0, 0, 265, 29, 114, 111, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 0, 0, 0, 0, 110, 0, 0, 0, 0, + 0, 0, 0, 368, 113, 112, 29, 114, 111, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 0, 0, 0, 0, 110, 0, 0, 0, + 0, 0, 172, 0, 366, 113, 112, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 400, 0, 172, 0, 0, 0, 175, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 398, 0, 172, 0, 0, 0, 175, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 369, 0, 0, 0, 0, 0, 175, + 29, 114, 111, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 0, 0, 0, 0, + 110, 0, 0, 0, 0, 0, 172, 0, 0, 113, + 112, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 343, 0, 172, 0, 0, + 0, 175, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 313, 0, 172, 0, + 0, 0, 175, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 0, 0, 0, 0, + 0, 217, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 175, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, + 384, 0, 0, 0, 175, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 342, 0, 0, 0, 175, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 312, 0, 0, 0, 175, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 269, 0, 0, 0, 175, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 172, 0, 0, 0, 175, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 130, 0, 0, 0, 78, 32, + 33, 34, 35, 36, 37, 139, 39, 40, 41, 42, + 133, 132, 131, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 140, + 144, 138, 65, 66, 142, 135, 136, 137, 71, 72, + 73, 74, 0, 0, 129, 0, 0, 413, 130, 0, + 0, 83, 0, 32, 33, 34, 35, 36, 37, 139, + 39, 40, 41, 42, 133, 132, 131, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 140, 144, 138, 65, 66, 142, 135, + 136, 137, 71, 72, 73, 74, 0, 0, 129, 0, + 0, 409, 130, 0, 0, 83, 0, 32, 33, 34, + 35, 36, 37, 139, 39, 40, 41, 42, 133, 132, + 131, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 140, 144, 138, + 65, 66, 142, 135, 136, 137, 71, 72, 73, 74, + 0, 0, 129, 0, 0, 404, 130, 0, 0, 83, + 0, 32, 33, 34, 35, 36, 37, 139, 39, 40, + 41, 42, 133, 132, 131, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 140, 144, 138, 65, 66, 142, 135, 136, 137, + 71, 72, 73, 74, 0, 0, 129, 0, 0, 403, + 130, 0, 0, 83, 0, 32, 33, 34, 35, 36, + 37, 139, 39, 40, 41, 42, 133, 132, 131, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 140, 144, 138, 65, 66, + 142, 135, 136, 137, 71, 72, 73, 74, 0, 0, + 129, 0, 0, 402, 130, 0, 0, 83, 0, 32, + 33, 34, 35, 36, 37, 139, 39, 40, 41, 42, + 133, 132, 131, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 140, + 144, 138, 65, 66, 142, 135, 136, 137, 71, 72, + 73, 74, 0, 0, 129, 0, 0, 391, 130, 0, + 0, 83, 0, 32, 33, 34, 35, 36, 37, 139, + 39, 40, 41, 42, 133, 132, 131, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 140, 144, 138, 65, 66, 142, 135, + 136, 137, 71, 72, 73, 74, 0, 0, 129, 0, + 0, 389, 130, 0, 0, 83, 0, 32, 33, 34, + 35, 36, 37, 139, 39, 40, 41, 42, 133, 132, + 131, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 140, 144, 138, + 65, 66, 142, 135, 136, 137, 71, 72, 73, 74, + 0, 0, 129, 0, 0, 387, 292, 0, 0, 83, + 0, 32, 33, 34, 35, 36, 37, 139, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 294, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 0, 0, 291, 0, 0, 326, + 160, 0, 0, 83, 0, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 133, 132, 131, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 0, 0, + 159, 0, 0, 210, 130, 0, 0, 83, 0, 32, + 33, 34, 35, 36, 37, 139, 39, 40, 41, 42, + 133, 132, 131, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 140, + 144, 138, 65, 66, 142, 135, 136, 137, 71, 72, + 73, 74, 0, 0, 129, 0, 0, 182, 130, 0, + 0, 83, 0, 32, 33, 34, 35, 36, 37, 139, + 39, 40, 41, 42, 133, 132, 131, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 140, 144, 138, 65, 66, 142, 135, + 136, 137, 71, 72, 73, 74, 0, 0, 129, 0, + 0, 292, 0, 0, 0, 83, 32, 33, 34, 35, + 36, 37, 139, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 294, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 0, + 0, 291, 0, 0, 160, 0, 0, 0, 83, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 133, 132, 131, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 0, 0, 159, 0, 0, 227, 0, 0, + 0, 83, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 304, 74, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 83, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 83, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 190, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 83, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 188, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 83, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 186, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 0, 0, 0, 0, 0, 151, 0, 0, 0, 83, + 32, 33, 34, 35, 36, 37, 139, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 153, 68, 69, 70, 71, + 72, 73, 74, 0, 151, 150, 0, 0, 201, 32, + 33, 34, 35, 36, 37, 139, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 153, 68, 69, 70, 71, 72, + 73, 74, 0, 0, 150, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, +} +var protoPact = [...]int{ + + 192, -1000, 301, 301, 206, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 173, 281, 2688, 1463, 2688, 2688, + 2381, 2688, 301, -1000, 316, -1000, 175, 316, 316, -1000, + 63, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 108, -1000, -1000, 2381, 120, + 110, 85, 29, 2688, 84, 171, -1000, -1000, 130, 129, + -1000, 2688, 856, 1463, 9, 2116, 2642, 2222, 29, 194, + -1000, -1000, -1000, -1000, 170, -1000, -1000, 314, -1000, -1000, + 1402, -1000, 300, 268, -1000, -1000, -1000, 2062, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 169, 2540, 2487, 2434, 2688, 2688, 2688, 2381, 295, 1463, + 2688, 2688, 260, -1000, 16, 2593, -1000, -1000, -1000, -1000, + -1000, 167, 205, 79, -1000, 2008, -1000, -1000, -1000, -1000, + 166, 159, -1000, -1000, -1000, -1000, 165, 2688, -1000, 1036, + -1000, 105, 102, 37, -1000, 2275, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 2688, 2688, 2688, 2688, 2688, + 2688, 204, -8, -1000, 221, 73, 202, 100, 96, 314, + 1124, -1000, -1000, -1000, 80, 93, -1000, 220, -1000, 312, + -1000, -1000, -1000, -1000, -1000, -1000, 21, -1000, -1000, -1000, + -1000, -1000, -1000, 487, -1000, 1341, 1, 0, 197, 189, + 182, 181, 180, 179, 304, -1000, 164, 295, 1463, 238, + 2169, 291, -1000, -1000, 316, 17, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 15, 80, + -1000, 66, -1000, 2328, -1000, 422, -1000, 1280, 975, 71, + -1000, -1000, 288, 284, 282, 277, 275, 273, 14, -1000, + -1000, -23, -1000, 107, -1000, -1000, 1954, -1000, -1000, -1000, + -1000, -1000, 163, 2688, 2688, 13, 314, 2381, -1000, 160, + -1000, -1000, -1000, 8, 2381, -1000, -1000, -12, -27, -1000, + 1219, 914, 58, -1000, -1000, 12, 6, 5, -4, -6, + -5, -1000, 158, -1000, 1463, 856, -1000, -1000, -1000, 178, + 177, -1000, 151, 26, -1000, 210, -1000, -1000, 612, 551, + -1000, 792, 53, -1000, -1000, -1000, 147, 2116, 67, -1000, + 146, 2116, 62, -1000, 65, 2116, 52, -1000, -1000, -1000, + 267, 257, -1000, -1000, 11, -1000, 1158, -1000, 1097, -1000, + -1000, -1000, 1900, 2116, -1000, 1846, 2116, -1000, 1792, 2116, + -9, -20, 2328, 731, 48, 670, 43, -1000, 1738, -1000, + 1684, -1000, 1630, -1000, 60, 2116, 35, 4, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1576, 2116, 119, -1000, + 1522, -1000, 200, -1000, 195, -1000, -1000, -1000, 50, -1000, + -1000, -1000, +} +var protoPgo = [...]int{ + + 0, 407, 406, 263, 333, 405, 404, 1, 13, 403, + 3, 402, 12, 35, 11, 9, 25, 21, 401, 15, + 0, 398, 36, 17, 396, 389, 8, 39, 387, 28, + 380, 376, 27, 374, 373, 372, 360, 6, 14, 10, + 371, 368, 365, 357, 31, 16, 33, 23, 354, 352, + 355, 32, 350, 343, 298, 29, 341, 26, 334, 30, + 324, 323, 7, +} +var protoR1 = [...]int{ + + 0, 1, 1, 1, 1, 4, 4, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 2, 5, 5, + 5, 6, 22, 22, 7, 12, 12, 13, 13, 15, + 15, 16, 16, 16, 18, 18, 18, 18, 18, 18, + 18, 18, 57, 57, 17, 26, 26, 26, 27, 27, + 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 24, 24, 24, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 23, 23, 29, 29, + 29, 29, 29, 29, 29, 29, 14, 9, 9, 8, + 32, 32, 32, 32, 32, 32, 31, 40, 40, 40, + 39, 39, 39, 39, 39, 39, 30, 30, 33, 33, + 34, 34, 35, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 49, 49, 46, 46, 45, + 45, 45, 48, 48, 47, 47, 47, 19, 19, 42, + 42, 43, 43, 44, 41, 41, 50, 52, 52, 52, + 51, 51, 51, 51, 51, 51, 53, 53, 36, 38, + 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 54, 56, 56, 56, 55, + 55, 55, 55, 55, 58, 60, 60, 60, 59, 59, + 59, 59, 59, 61, 61, 62, 62, 11, 11, 11, + 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, +} +var protoR2 = [...]int{ + + 0, 1, 1, 2, 0, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 4, 3, 4, + 4, 3, 1, 3, 5, 1, 3, 1, 3, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, + 2, 2, 1, 2, 3, 1, 2, 0, 1, 2, + 2, 2, 2, 1, 3, 4, 5, 5, 3, 2, + 5, 4, 5, 4, 1, 3, 3, 1, 3, 3, + 3, 5, 5, 3, 5, 5, 1, 2, 6, 6, + 6, 5, 7, 7, 7, 6, 3, 3, 1, 3, + 8, 8, 8, 9, 9, 9, 5, 2, 1, 0, + 1, 1, 1, 1, 2, 1, 5, 6, 7, 8, + 5, 6, 6, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 4, 3, 1, 1, + 3, 3, 3, 1, 1, 3, 3, 1, 2, 3, + 1, 3, 1, 3, 3, 1, 5, 2, 1, 0, + 1, 1, 1, 1, 2, 1, 4, 5, 5, 2, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 1, 5, 2, 1, 0, 1, + 1, 1, 2, 1, 5, 2, 1, 0, 1, 1, + 1, 2, 1, 10, 12, 2, 1, 2, 1, 0, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, +} +var protoChk = [...]int{ + + -1000, -1, -2, -4, 8, -3, -5, -6, -7, -36, + -50, -54, -58, 52, 2, 9, 12, 13, 44, 43, + 45, 46, -4, -3, 51, 52, -57, 10, 11, 4, + -22, -20, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, -12, -13, -20, 65, -20, + -20, -23, -22, 59, -20, -57, 52, 4, -57, -57, + 52, 59, 51, 59, -23, 54, 54, 54, -22, 54, + 52, 52, 52, -20, -15, -16, -17, -57, -18, -20, + 54, 6, 64, 63, 5, -13, 66, -38, -37, -29, + -50, -36, -54, -49, -32, -7, -31, -34, -42, 52, + 2, 20, 19, 18, -23, 43, 44, 45, 39, 13, + 37, -35, 42, -44, 38, -52, -51, -7, -53, -43, + 52, 2, -20, 42, -44, -56, -55, -29, -32, 52, + 2, -60, -59, -7, -61, 52, 2, 47, 52, -26, + -27, -28, 2, -24, -20, 67, 6, 16, 5, 6, + 16, 5, 55, -37, 52, -23, 36, -23, 36, -23, + 36, -20, -46, -45, 5, -20, -20, -46, -41, -57, + 62, 55, -51, 52, 51, -48, -47, -19, 5, 64, + 55, -55, 52, 55, -59, 52, -20, 55, -27, 60, + 52, 60, 52, 53, -17, 62, -23, 2, -20, -20, + -20, -20, -20, -20, 51, 52, -14, 60, 67, 40, + 54, 51, 52, 52, 60, -21, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, -19, 60, + 52, 40, 5, 65, -16, 67, -17, 62, -26, 2, + 68, 68, 51, 51, 51, 51, 51, 51, 5, 52, + -45, -9, -8, -12, 5, 41, -40, -39, -7, -30, + -33, 52, 2, -23, 36, 5, -57, 60, 52, -14, + -47, -19, 41, -62, 48, -23, 68, -25, 2, -15, + 62, -26, 2, 61, 61, 5, 5, 5, 5, 5, + 5, 52, -14, 68, 60, 51, 55, -39, 52, -20, + -20, 52, -14, -23, 52, 66, -23, 68, 60, 52, + 68, -26, 2, 61, 61, 52, -14, 54, -14, 52, + -14, 54, -14, 52, -14, 54, -14, 52, -8, -15, + 51, 51, 52, 61, 49, -15, 62, -15, 62, 61, + 61, 52, -38, 54, 52, -38, 54, 52, -38, 54, + 5, 5, 65, -26, 2, -26, 2, 55, -38, 55, + -38, 55, -38, 52, -14, 54, -14, -62, 61, 61, + 61, 61, 55, 55, 55, 52, -38, 54, 66, 55, + -38, 52, 54, 55, -11, -10, -7, 52, 2, 55, + -10, 52, +} +var protoDef = [...]int{ + + -2, -2, -2, -2, 0, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 16, 0, 0, 0, 0, 0, + 0, 0, -2, 5, 0, 15, 0, 0, 0, 42, + 0, 22, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 25, 27, 0, 0, + 0, 0, 76, 0, 0, 0, 18, 43, 0, 0, + 21, 0, 0, 0, 0, -2, -2, -2, 77, -2, + 17, 19, 20, 23, 0, 29, 30, 31, 32, 33, + -2, 34, 0, 0, 39, 26, 28, 0, 160, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 174, 0, 0, 0, 0, 240, 241, 0, 236, 210, + 234, 0, 239, 140, 235, 0, 148, 150, 151, 152, + 153, 155, 0, 239, 142, 0, 177, 179, 180, 181, + 183, 0, 186, 188, 189, 190, 192, 0, 24, 0, + 45, 48, 53, 0, 64, 0, 35, 38, 41, 36, + 37, 40, 158, 159, 173, 0, 233, 0, 233, 0, + 233, 0, 0, 128, 129, 0, 0, 0, 0, 145, + 0, 146, 147, 154, 0, 0, 133, 134, 137, 0, + 175, 176, 182, 184, 185, 191, 0, 44, 46, 49, + 50, 51, 52, 0, 59, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, + -2, 0, 139, 143, 0, 0, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 0, 0, + 141, 0, 138, 0, 54, 0, 58, -2, 0, 53, + 65, 66, 0, 0, 0, 0, 0, 0, 0, 126, + 127, 0, 88, 0, 130, 131, 0, 98, 100, 101, + 102, 103, 105, 0, 233, 0, 144, 0, 156, 0, + 132, 135, 136, 0, 245, 196, 55, 0, 0, 67, + -2, 0, 53, 61, 63, 0, 0, 0, 0, 0, + 0, 81, 0, 86, 0, 0, 96, 97, 104, 0, + 0, 110, 0, 0, 157, 0, 195, 56, 0, 0, + 57, 0, 53, 60, 62, 78, 0, -2, 0, 79, + 0, -2, 0, 80, 0, -2, 0, 85, 87, 89, + 0, 0, 111, 112, 0, 68, -2, 69, -2, 70, + 73, 82, 0, -2, 83, 0, -2, 84, 0, -2, + 0, 0, 0, 0, 53, 0, 53, 90, 0, 91, + 0, 92, 0, 106, 0, -2, 0, 0, 71, 74, + 72, 75, 93, 94, 95, 107, 0, -2, 0, 108, + 0, 193, -2, 109, 0, 198, 200, 201, 203, 194, + 197, 202, +} +var protoTok1 = [...]int{ + + 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 76, 3, 74, 73, 72, 70, 3, + 65, 66, 69, 63, 60, 64, 59, 57, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 53, 52, + 62, 51, 61, 58, 75, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 67, 56, 68, 71, 3, 78, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 54, 3, 55, 77, +} +var protoTok2 = [...]int{ + + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, +} +var protoTok3 = [...]int{ + 0, +} + +var protoErrorMessages = [...]struct { + state int + token int + msg string +}{} + +//line yaccpar:1 + +/* parser for yacc output */ + +var ( + protoDebug = 0 + protoErrorVerbose = false +) + +type protoLexer interface { + Lex(lval *protoSymType) int + Error(s string) +} + +type protoParser interface { + Parse(protoLexer) int + Lookahead() int +} + +type protoParserImpl struct { + lval protoSymType + stack [protoInitialStackSize]protoSymType + char int +} + +func (p *protoParserImpl) Lookahead() int { + return p.char +} + +func protoNewParser() protoParser { + return &protoParserImpl{} +} + +const protoFlag = -1000 + +func protoTokname(c int) string { + if c >= 1 && c-1 < len(protoToknames) { + if protoToknames[c-1] != "" { + return protoToknames[c-1] + } + } + return __yyfmt__.Sprintf("tok-%v", c) +} + +func protoStatname(s int) string { + if s >= 0 && s < len(protoStatenames) { + if protoStatenames[s] != "" { + return protoStatenames[s] + } + } + return __yyfmt__.Sprintf("state-%v", s) +} + +func protoErrorMessage(state, lookAhead int) string { + const TOKSTART = 4 + + if !protoErrorVerbose { + return "syntax error" + } + + for _, e := range protoErrorMessages { + if e.state == state && e.token == lookAhead { + return "syntax error: " + e.msg + } + } + + res := "syntax error: unexpected " + protoTokname(lookAhead) + + // To match Bison, suggest at most four expected tokens. + expected := make([]int, 0, 4) + + // Look for shiftable tokens. + base := protoPact[state] + for tok := TOKSTART; tok-1 < len(protoToknames); tok++ { + if n := base + tok; n >= 0 && n < protoLast && protoChk[protoAct[n]] == tok { + if len(expected) == cap(expected) { + return res + } + expected = append(expected, tok) + } + } + + if protoDef[state] == -2 { + i := 0 + for protoExca[i] != -1 || protoExca[i+1] != state { + i += 2 + } + + // Look for tokens that we accept or reduce. + for i += 2; protoExca[i] >= 0; i += 2 { + tok := protoExca[i] + if tok < TOKSTART || protoExca[i+1] == 0 { + continue + } + if len(expected) == cap(expected) { + return res + } + expected = append(expected, tok) + } + + // If the default action is to accept or reduce, give up. + if protoExca[i+1] != 0 { + return res + } + } + + for i, tok := range expected { + if i == 0 { + res += ", expecting " + } else { + res += " or " + } + res += protoTokname(tok) + } + return res +} + +func protolex1(lex protoLexer, lval *protoSymType) (char, token int) { + token = 0 + char = lex.Lex(lval) + if char <= 0 { + token = protoTok1[0] + goto out + } + if char < len(protoTok1) { + token = protoTok1[char] + goto out + } + if char >= protoPrivate { + if char < protoPrivate+len(protoTok2) { + token = protoTok2[char-protoPrivate] + goto out + } + } + for i := 0; i < len(protoTok3); i += 2 { + token = protoTok3[i+0] + if token == char { + token = protoTok3[i+1] + goto out + } + } + +out: + if token == 0 { + token = protoTok2[1] /* unknown char */ + } + if protoDebug >= 3 { + __yyfmt__.Printf("lex %s(%d)\n", protoTokname(token), uint(char)) + } + return char, token +} + +func protoParse(protolex protoLexer) int { + return protoNewParser().Parse(protolex) +} + +func (protorcvr *protoParserImpl) Parse(protolex protoLexer) int { + var proton int + var protoVAL protoSymType + var protoDollar []protoSymType + _ = protoDollar // silence set and not used + protoS := protorcvr.stack[:] + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + protostate := 0 + protorcvr.char = -1 + prototoken := -1 // protorcvr.char translated into internal numbering + defer func() { + // Make sure we report no lookahead when not parsing. + protostate = -1 + protorcvr.char = -1 + prototoken = -1 + }() + protop := -1 + goto protostack + +ret0: + return 0 + +ret1: + return 1 + +protostack: + /* put a state and value onto the stack */ + if protoDebug >= 4 { + __yyfmt__.Printf("char %v in %v\n", protoTokname(prototoken), protoStatname(protostate)) + } + + protop++ + if protop >= len(protoS) { + nyys := make([]protoSymType, len(protoS)*2) + copy(nyys, protoS) + protoS = nyys + } + protoS[protop] = protoVAL + protoS[protop].yys = protostate + +protonewstate: + proton = protoPact[protostate] + if proton <= protoFlag { + goto protodefault /* simple state */ + } + if protorcvr.char < 0 { + protorcvr.char, prototoken = protolex1(protolex, &protorcvr.lval) + } + proton += prototoken + if proton < 0 || proton >= protoLast { + goto protodefault + } + proton = protoAct[proton] + if protoChk[proton] == prototoken { /* valid shift */ + protorcvr.char = -1 + prototoken = -1 + protoVAL = protorcvr.lval + protostate = proton + if Errflag > 0 { + Errflag-- + } + goto protostack + } + +protodefault: + /* default state action */ + proton = protoDef[protostate] + if proton == -2 { + if protorcvr.char < 0 { + protorcvr.char, prototoken = protolex1(protolex, &protorcvr.lval) + } + + /* look through exception table */ + xi := 0 + for { + if protoExca[xi+0] == -1 && protoExca[xi+1] == protostate { + break + } + xi += 2 + } + for xi += 2; ; xi += 2 { + proton = protoExca[xi+0] + if proton < 0 || proton == prototoken { + break + } + } + proton = protoExca[xi+1] + if proton < 0 { + goto ret0 + } + } + if proton == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + protolex.Error(protoErrorMessage(protostate, prototoken)) + Nerrs++ + if protoDebug >= 1 { + __yyfmt__.Printf("%s", protoStatname(protostate)) + __yyfmt__.Printf(" saw %s\n", protoTokname(prototoken)) + } + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for protop >= 0 { + proton = protoPact[protoS[protop].yys] + protoErrCode + if proton >= 0 && proton < protoLast { + protostate = protoAct[proton] /* simulate a shift of "error" */ + if protoChk[protostate] == protoErrCode { + goto protostack + } + } + + /* the current p has no shift on "error", pop stack */ + if protoDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %d\n", protoS[protop].yys) + } + protop-- + } + /* there is no state on the stack with an error shift ... abort */ + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if protoDebug >= 2 { + __yyfmt__.Printf("error recovery discards %s\n", protoTokname(prototoken)) + } + if prototoken == protoEofCode { + goto ret1 + } + protorcvr.char = -1 + prototoken = -1 + goto protonewstate /* try again in the same state */ + } + } + + /* reduction by production proton */ + if protoDebug >= 2 { + __yyfmt__.Printf("reduce %v in:\n\t%v\n", proton, protoStatname(protostate)) + } + + protont := proton + protopt := protop + _ = protopt // guard against "declared and not used" + + protop -= protoR2[proton] + // protop is now the index of $0. Perform the default action. Iff the + // reduced production is ε, $1 is possibly out of range. + if protop+1 >= len(protoS) { + nyys := make([]protoSymType, len(protoS)*2) + copy(nyys, protoS) + protoS = nyys + } + protoVAL = protoS[protop+1] + + /* consult goto table to find next state */ + proton = protoR1[proton] + protog := protoPgo[proton] + protoj := protog + protoS[protop].yys + 1 + + if protoj >= protoLast { + protostate = protoAct[protog] + } else { + protostate = protoAct[protoj] + if protoChk[protostate] != -proton { + protostate = protoAct[protog] + } + } + // dummy call; replaced with literal code + switch protont { + + case 1: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:116 + { + protoVAL.file = &fileNode{syntax: protoDollar[1].syn} + protoVAL.file.setRange(protoDollar[1].syn, protoDollar[1].syn) + protolex.(*protoLex).res = protoVAL.file + } + case 2: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:121 + { + protoVAL.file = &fileNode{decls: protoDollar[1].fileDecls} + if len(protoDollar[1].fileDecls) > 0 { + protoVAL.file.setRange(protoDollar[1].fileDecls[0], protoDollar[1].fileDecls[len(protoDollar[1].fileDecls)-1]) + } + protolex.(*protoLex).res = protoVAL.file + } + case 3: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:128 + { + protoVAL.file = &fileNode{syntax: protoDollar[1].syn, decls: protoDollar[2].fileDecls} + var end node + if len(protoDollar[2].fileDecls) > 0 { + end = protoDollar[2].fileDecls[len(protoDollar[2].fileDecls)-1] + } else { + end = protoDollar[1].syn + } + protoVAL.file.setRange(protoDollar[1].syn, end) + protolex.(*protoLex).res = protoVAL.file + } + case 4: + protoDollar = protoS[protopt-0 : protopt+1] +//line proto.y:139 + { + } + case 5: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:142 + { + protoVAL.fileDecls = append(protoDollar[1].fileDecls, protoDollar[2].fileDecls...) + } + case 7: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:147 + { + protoVAL.fileDecls = []*fileElement{{imp: protoDollar[1].imprt}} + } + case 8: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:150 + { + protoVAL.fileDecls = []*fileElement{{pkg: protoDollar[1].pkg}} + } + case 9: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:153 + { + protoVAL.fileDecls = []*fileElement{{option: protoDollar[1].opts[0]}} + } + case 10: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:156 + { + protoVAL.fileDecls = []*fileElement{{message: protoDollar[1].msg}} + } + case 11: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:159 + { + protoVAL.fileDecls = []*fileElement{{enum: protoDollar[1].en}} + } + case 12: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:162 + { + protoVAL.fileDecls = []*fileElement{{extend: protoDollar[1].extend}} + } + case 13: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:165 + { + protoVAL.fileDecls = []*fileElement{{service: protoDollar[1].svc}} + } + case 14: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:168 + { + protoVAL.fileDecls = []*fileElement{{empty: protoDollar[1].b}} + } + case 15: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:171 + { + } + case 16: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:173 + { + } + case 17: + protoDollar = protoS[protopt-4 : protopt+1] +//line proto.y:176 + { + protoVAL.syn = &syntaxNode{syntax: protoDollar[3].str} + protoVAL.syn.setRange(protoDollar[1].id, protoDollar[4].b) + } + case 18: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:181 + { + protoVAL.imprt = &importNode{name: protoDollar[2].str} + protoVAL.imprt.setRange(protoDollar[1].id, protoDollar[3].b) + } + case 19: + protoDollar = protoS[protopt-4 : protopt+1] +//line proto.y:185 + { + protoVAL.imprt = &importNode{name: protoDollar[3].str, weak: true} + protoVAL.imprt.setRange(protoDollar[1].id, protoDollar[4].b) + } + case 20: + protoDollar = protoS[protopt-4 : protopt+1] +//line proto.y:189 + { + protoVAL.imprt = &importNode{name: protoDollar[3].str, public: true} + protoVAL.imprt.setRange(protoDollar[1].id, protoDollar[4].b) + } + case 21: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:194 + { + protoVAL.pkg = &packageNode{name: protoDollar[2].cid} + protoVAL.pkg.setRange(protoDollar[1].id, protoDollar[3].b) + } + case 22: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:199 + { + protoVAL.cid = &compoundIdentNode{val: protoDollar[1].id.val} + protoVAL.cid.setRange(protoDollar[1].id, protoDollar[1].id) + } + case 23: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:203 + { + protoVAL.cid = &compoundIdentNode{val: protoDollar[1].cid.val + "." + protoDollar[3].id.val} + protoVAL.cid.setRange(protoDollar[1].cid, protoDollar[3].id) + } + case 24: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:208 + { + n := &optionNameNode{parts: protoDollar[2].optNm} + n.setRange(protoDollar[2].optNm[0], protoDollar[2].optNm[len(protoDollar[2].optNm)-1]) + o := &optionNode{name: n, val: protoDollar[4].v} + o.setRange(protoDollar[1].id, protoDollar[5].b) + protoVAL.opts = []*optionNode{o} + } + case 26: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:218 + { + protoVAL.optNm = append(protoDollar[1].optNm, protoDollar[3].optNm...) + } + case 27: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:223 + { + nm := &compoundIdentNode{val: protoDollar[1].id.val} + nm.setRange(protoDollar[1].id, protoDollar[1].id) + protoVAL.optNm = toNameParts(nm) + } + case 28: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:228 + { + p := &optionNamePartNode{text: protoDollar[2].cid, isExtension: true} + p.setRange(protoDollar[1].b, protoDollar[3].b) + protoVAL.optNm = []*optionNamePartNode{p} + } + case 31: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:237 + { + protoVAL.v = protoDollar[1].str + } + case 33: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:241 + { + if protoDollar[1].id.val == "true" { + protoVAL.v = &boolLiteralNode{identNode: protoDollar[1].id, val: true} + } else if protoDollar[1].id.val == "false" { + protoVAL.v = &boolLiteralNode{identNode: protoDollar[1].id, val: false} + } else if protoDollar[1].id.val == "inf" { + f := &compoundFloatNode{val: math.Inf(1)} + f.setRange(protoDollar[1].id, protoDollar[1].id) + protoVAL.v = f + } else if protoDollar[1].id.val == "nan" { + f := &compoundFloatNode{val: math.NaN()} + f.setRange(protoDollar[1].id, protoDollar[1].id) + protoVAL.v = f + } else { + protoVAL.v = protoDollar[1].id + } + } + case 34: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:259 + { + protoVAL.v = protoDollar[1].f + } + case 35: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:262 + { + f := &compoundFloatNode{val: -protoDollar[2].f.val} + f.setRange(protoDollar[1].b, protoDollar[2].f) + protoVAL.v = f + } + case 36: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:267 + { + f := &compoundFloatNode{val: protoDollar[2].f.val} + f.setRange(protoDollar[1].b, protoDollar[2].f) + protoVAL.v = f + } + case 37: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:272 + { + f := &compoundFloatNode{val: math.Inf(1)} + f.setRange(protoDollar[1].b, protoDollar[2].id) + protoVAL.v = f + } + case 38: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:277 + { + f := &compoundFloatNode{val: math.Inf(-1)} + f.setRange(protoDollar[1].b, protoDollar[2].id) + protoVAL.v = f + } + case 39: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:282 + { + protoVAL.v = protoDollar[1].i + } + case 40: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:285 + { + i := &compoundUintNode{val: protoDollar[2].i.val} + i.setRange(protoDollar[1].b, protoDollar[2].i) + protoVAL.v = i + } + case 41: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:290 + { + if protoDollar[2].i.val > math.MaxInt64+1 { + // can't represent as int so treat as float literal + f := &compoundFloatNode{val: -float64(protoDollar[2].i.val)} + f.setRange(protoDollar[1].b, protoDollar[2].i) + protoVAL.v = f + } else { + i := &compoundIntNode{val: -int64(protoDollar[2].i.val)} + i.setRange(protoDollar[1].b, protoDollar[2].i) + protoVAL.v = i + } + } + case 42: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:303 + { + protoVAL.str = &compoundStringNode{val: protoDollar[1].s.val} + protoVAL.str.setRange(protoDollar[1].s, protoDollar[1].s) + } + case 43: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:307 + { + protoVAL.str = &compoundStringNode{val: protoDollar[1].str.val + protoDollar[2].s.val} + protoVAL.str.setRange(protoDollar[1].str, protoDollar[2].s) + } + case 44: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:312 + { + a := &aggregateLiteralNode{elements: protoDollar[2].agg} + a.setRange(protoDollar[1].b, protoDollar[3].b) + protoVAL.v = a + } + case 46: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:319 + { + protoVAL.agg = append(protoDollar[1].agg, protoDollar[2].agg...) + } + case 47: + protoDollar = protoS[protopt-0 : protopt+1] +//line proto.y:322 + { + protoVAL.agg = nil + } + case 49: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:327 + { + protoVAL.agg = protoDollar[1].agg + } + case 50: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:330 + { + protoVAL.agg = protoDollar[1].agg + } + case 51: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:333 + { + } + case 52: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:335 + { + } + case 53: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:337 + { + } + case 54: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:340 + { + a := &aggregateEntryNode{name: protoDollar[1].aggName, val: protoDollar[3].v} + a.setRange(protoDollar[1].aggName, protoDollar[3].v) + protoVAL.agg = []*aggregateEntryNode{a} + } + case 55: + protoDollar = protoS[protopt-4 : protopt+1] +//line proto.y:345 + { + s := &sliceLiteralNode{} + s.setRange(protoDollar[3].b, protoDollar[4].b) + a := &aggregateEntryNode{name: protoDollar[1].aggName, val: s} + a.setRange(protoDollar[1].aggName, protoDollar[4].b) + protoVAL.agg = []*aggregateEntryNode{a} + } + case 56: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:352 + { + s := &sliceLiteralNode{elements: protoDollar[4].sl} + s.setRange(protoDollar[3].b, protoDollar[5].b) + a := &aggregateEntryNode{name: protoDollar[1].aggName, val: s} + a.setRange(protoDollar[1].aggName, protoDollar[5].b) + protoVAL.agg = []*aggregateEntryNode{a} + } + case 57: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:359 + { + } + case 58: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:361 + { + a := &aggregateEntryNode{name: protoDollar[1].aggName, val: protoDollar[3].v} + a.setRange(protoDollar[1].aggName, protoDollar[3].v) + protoVAL.agg = []*aggregateEntryNode{a} + } + case 59: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:366 + { + a := &aggregateEntryNode{name: protoDollar[1].aggName, val: protoDollar[2].v} + a.setRange(protoDollar[1].aggName, protoDollar[2].v) + protoVAL.agg = []*aggregateEntryNode{a} + } + case 60: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:371 + { + s := &aggregateLiteralNode{elements: protoDollar[4].agg} + s.setRange(protoDollar[3].b, protoDollar[5].b) + a := &aggregateEntryNode{name: protoDollar[1].aggName, val: s} + a.setRange(protoDollar[1].aggName, protoDollar[5].b) + protoVAL.agg = []*aggregateEntryNode{a} + } + case 61: + protoDollar = protoS[protopt-4 : protopt+1] +//line proto.y:378 + { + s := &aggregateLiteralNode{elements: protoDollar[3].agg} + s.setRange(protoDollar[2].b, protoDollar[4].b) + a := &aggregateEntryNode{name: protoDollar[1].aggName, val: s} + a.setRange(protoDollar[1].aggName, protoDollar[4].b) + protoVAL.agg = []*aggregateEntryNode{a} + } + case 62: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:385 + { + } + case 63: + protoDollar = protoS[protopt-4 : protopt+1] +//line proto.y:387 + { + } + case 64: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:390 + { + n := &compoundIdentNode{val: protoDollar[1].id.val} + n.setRange(protoDollar[1].id, protoDollar[1].id) + protoVAL.aggName = &aggregateNameNode{name: n} + protoVAL.aggName.setRange(protoDollar[1].id, protoDollar[1].id) + } + case 65: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:396 + { + protoVAL.aggName = &aggregateNameNode{name: protoDollar[2].cid, isExtension: true} + protoVAL.aggName.setRange(protoDollar[1].b, protoDollar[3].b) + } + case 66: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:400 + { + } + case 67: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:403 + { + protoVAL.sl = []valueNode{protoDollar[1].v} + } + case 68: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:406 + { + protoVAL.sl = append(protoDollar[1].sl, protoDollar[3].v) + } + case 69: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:409 + { + protoVAL.sl = append(protoDollar[1].sl, protoDollar[3].v) + } + case 70: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:412 + { + s := &aggregateLiteralNode{elements: protoDollar[2].agg} + s.setRange(protoDollar[1].b, protoDollar[3].b) + protoVAL.sl = []valueNode{s} + } + case 71: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:417 + { + s := &aggregateLiteralNode{elements: protoDollar[4].agg} + s.setRange(protoDollar[3].b, protoDollar[5].b) + protoVAL.sl = append(protoDollar[1].sl, s) + } + case 72: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:422 + { + s := &aggregateLiteralNode{elements: protoDollar[4].agg} + s.setRange(protoDollar[3].b, protoDollar[5].b) + protoVAL.sl = append(protoDollar[1].sl, s) + } + case 73: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:427 + { + } + case 74: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:429 + { + } + case 75: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:431 + { + } + case 77: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:435 + { + protoVAL.cid = &compoundIdentNode{val: "." + protoDollar[2].cid.val} + protoVAL.cid.setRange(protoDollar[1].b, protoDollar[2].cid) + } + case 78: + protoDollar = protoS[protopt-6 : protopt+1] +//line proto.y:440 + { + lbl := fieldLabel{identNode: protoDollar[1].id, required: true} + protoVAL.fld = &fieldNode{label: lbl, fldType: protoDollar[2].cid, name: protoDollar[3].id, tag: protoDollar[5].i} + protoVAL.fld.setRange(protoDollar[1].id, protoDollar[6].b) + } + case 79: + protoDollar = protoS[protopt-6 : protopt+1] +//line proto.y:445 + { + lbl := fieldLabel{identNode: protoDollar[1].id} + protoVAL.fld = &fieldNode{label: lbl, fldType: protoDollar[2].cid, name: protoDollar[3].id, tag: protoDollar[5].i} + protoVAL.fld.setRange(protoDollar[1].id, protoDollar[6].b) + } + case 80: + protoDollar = protoS[protopt-6 : protopt+1] +//line proto.y:450 + { + lbl := fieldLabel{identNode: protoDollar[1].id, repeated: true} + protoVAL.fld = &fieldNode{label: lbl, fldType: protoDollar[2].cid, name: protoDollar[3].id, tag: protoDollar[5].i} + protoVAL.fld.setRange(protoDollar[1].id, protoDollar[6].b) + } + case 81: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:455 + { + protoVAL.fld = &fieldNode{fldType: protoDollar[1].cid, name: protoDollar[2].id, tag: protoDollar[4].i} + protoVAL.fld.setRange(protoDollar[1].cid, protoDollar[5].b) + } + case 82: + protoDollar = protoS[protopt-7 : protopt+1] +//line proto.y:459 + { + lbl := fieldLabel{identNode: protoDollar[1].id, required: true} + protoVAL.fld = &fieldNode{label: lbl, fldType: protoDollar[2].cid, name: protoDollar[3].id, tag: protoDollar[5].i, options: protoDollar[6].cmpctOpts} + protoVAL.fld.setRange(protoDollar[1].id, protoDollar[7].b) + } + case 83: + protoDollar = protoS[protopt-7 : protopt+1] +//line proto.y:464 + { + lbl := fieldLabel{identNode: protoDollar[1].id} + protoVAL.fld = &fieldNode{label: lbl, fldType: protoDollar[2].cid, name: protoDollar[3].id, tag: protoDollar[5].i, options: protoDollar[6].cmpctOpts} + protoVAL.fld.setRange(protoDollar[1].id, protoDollar[7].b) + } + case 84: + protoDollar = protoS[protopt-7 : protopt+1] +//line proto.y:469 + { + lbl := fieldLabel{identNode: protoDollar[1].id, repeated: true} + protoVAL.fld = &fieldNode{label: lbl, fldType: protoDollar[2].cid, name: protoDollar[3].id, tag: protoDollar[5].i, options: protoDollar[6].cmpctOpts} + protoVAL.fld.setRange(protoDollar[1].id, protoDollar[7].b) + } + case 85: + protoDollar = protoS[protopt-6 : protopt+1] +//line proto.y:474 + { + protoVAL.fld = &fieldNode{fldType: protoDollar[1].cid, name: protoDollar[2].id, tag: protoDollar[4].i, options: protoDollar[5].cmpctOpts} + protoVAL.fld.setRange(protoDollar[1].cid, protoDollar[6].b) + } + case 86: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:479 + { + protoVAL.cmpctOpts = &compactOptionsNode{decls: protoDollar[2].opts} + protoVAL.cmpctOpts.setRange(protoDollar[1].b, protoDollar[3].b) + } + case 87: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:484 + { + protoVAL.opts = append(protoDollar[1].opts, protoDollar[3].opts...) + } + case 89: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:489 + { + n := &optionNameNode{parts: protoDollar[1].optNm} + n.setRange(protoDollar[1].optNm[0], protoDollar[1].optNm[len(protoDollar[1].optNm)-1]) + o := &optionNode{name: n, val: protoDollar[3].v} + o.setRange(protoDollar[1].optNm[0], protoDollar[3].v) + protoVAL.opts = []*optionNode{o} + } + case 90: + protoDollar = protoS[protopt-8 : protopt+1] +//line proto.y:497 + { + lbl := fieldLabel{identNode: protoDollar[1].id, required: true} + protoVAL.grp = &groupNode{groupKeyword: protoDollar[2].id, label: lbl, name: protoDollar[3].id, tag: protoDollar[5].i, decls: protoDollar[7].msgDecls} + protoVAL.grp.setRange(protoDollar[1].id, protoDollar[8].b) + } + case 91: + protoDollar = protoS[protopt-8 : protopt+1] +//line proto.y:502 + { + lbl := fieldLabel{identNode: protoDollar[1].id} + protoVAL.grp = &groupNode{groupKeyword: protoDollar[2].id, label: lbl, name: protoDollar[3].id, tag: protoDollar[5].i, decls: protoDollar[7].msgDecls} + protoVAL.grp.setRange(protoDollar[1].id, protoDollar[8].b) + } + case 92: + protoDollar = protoS[protopt-8 : protopt+1] +//line proto.y:507 + { + lbl := fieldLabel{identNode: protoDollar[1].id, repeated: true} + protoVAL.grp = &groupNode{groupKeyword: protoDollar[2].id, label: lbl, name: protoDollar[3].id, tag: protoDollar[5].i, decls: protoDollar[7].msgDecls} + protoVAL.grp.setRange(protoDollar[1].id, protoDollar[8].b) + } + case 93: + protoDollar = protoS[protopt-9 : protopt+1] +//line proto.y:512 + { + lbl := fieldLabel{identNode: protoDollar[1].id, required: true} + protoVAL.grp = &groupNode{groupKeyword: protoDollar[2].id, label: lbl, name: protoDollar[3].id, tag: protoDollar[5].i, options: protoDollar[6].cmpctOpts, decls: protoDollar[8].msgDecls} + protoVAL.grp.setRange(protoDollar[1].id, protoDollar[9].b) + } + case 94: + protoDollar = protoS[protopt-9 : protopt+1] +//line proto.y:517 + { + lbl := fieldLabel{identNode: protoDollar[1].id} + protoVAL.grp = &groupNode{groupKeyword: protoDollar[2].id, label: lbl, name: protoDollar[3].id, tag: protoDollar[5].i, options: protoDollar[6].cmpctOpts, decls: protoDollar[8].msgDecls} + protoVAL.grp.setRange(protoDollar[1].id, protoDollar[9].b) + } + case 95: + protoDollar = protoS[protopt-9 : protopt+1] +//line proto.y:522 + { + lbl := fieldLabel{identNode: protoDollar[1].id, repeated: true} + protoVAL.grp = &groupNode{groupKeyword: protoDollar[2].id, label: lbl, name: protoDollar[3].id, tag: protoDollar[5].i, options: protoDollar[6].cmpctOpts, decls: protoDollar[8].msgDecls} + protoVAL.grp.setRange(protoDollar[1].id, protoDollar[9].b) + } + case 96: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:528 + { + protoVAL.oo = &oneOfNode{name: protoDollar[2].id, decls: protoDollar[4].ooDecls} + protoVAL.oo.setRange(protoDollar[1].id, protoDollar[5].b) + } + case 97: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:533 + { + protoVAL.ooDecls = append(protoDollar[1].ooDecls, protoDollar[2].ooDecls...) + } + case 99: + protoDollar = protoS[protopt-0 : protopt+1] +//line proto.y:537 + { + protoVAL.ooDecls = nil + } + case 100: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:541 + { + protoVAL.ooDecls = []*oneOfElement{{option: protoDollar[1].opts[0]}} + } + case 101: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:544 + { + protoVAL.ooDecls = []*oneOfElement{{field: protoDollar[1].fld}} + } + case 102: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:547 + { + protoVAL.ooDecls = []*oneOfElement{{group: protoDollar[1].grp}} + } + case 103: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:550 + { + protoVAL.ooDecls = []*oneOfElement{{empty: protoDollar[1].b}} + } + case 104: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:553 + { + } + case 105: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:555 + { + } + case 106: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:558 + { + protoVAL.fld = &fieldNode{fldType: protoDollar[1].cid, name: protoDollar[2].id, tag: protoDollar[4].i} + protoVAL.fld.setRange(protoDollar[1].cid, protoDollar[5].b) + } + case 107: + protoDollar = protoS[protopt-6 : protopt+1] +//line proto.y:562 + { + protoVAL.fld = &fieldNode{fldType: protoDollar[1].cid, name: protoDollar[2].id, tag: protoDollar[4].i, options: protoDollar[5].cmpctOpts} + protoVAL.fld.setRange(protoDollar[1].cid, protoDollar[6].b) + } + case 108: + protoDollar = protoS[protopt-7 : protopt+1] +//line proto.y:567 + { + protoVAL.grp = &groupNode{groupKeyword: protoDollar[1].id, name: protoDollar[2].id, tag: protoDollar[4].i, decls: protoDollar[6].msgDecls} + protoVAL.grp.setRange(protoDollar[1].id, protoDollar[7].b) + } + case 109: + protoDollar = protoS[protopt-8 : protopt+1] +//line proto.y:571 + { + protoVAL.grp = &groupNode{groupKeyword: protoDollar[1].id, name: protoDollar[2].id, tag: protoDollar[4].i, options: protoDollar[5].cmpctOpts, decls: protoDollar[7].msgDecls} + protoVAL.grp.setRange(protoDollar[1].id, protoDollar[8].b) + } + case 110: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:576 + { + protoVAL.mapFld = &mapFieldNode{mapType: protoDollar[1].mapType, name: protoDollar[2].id, tag: protoDollar[4].i} + protoVAL.mapFld.setRange(protoDollar[1].mapType, protoDollar[5].b) + } + case 111: + protoDollar = protoS[protopt-6 : protopt+1] +//line proto.y:580 + { + protoVAL.mapFld = &mapFieldNode{mapType: protoDollar[1].mapType, name: protoDollar[2].id, tag: protoDollar[4].i, options: protoDollar[5].cmpctOpts} + protoVAL.mapFld.setRange(protoDollar[1].mapType, protoDollar[6].b) + } + case 112: + protoDollar = protoS[protopt-6 : protopt+1] +//line proto.y:585 + { + protoVAL.mapType = &mapTypeNode{mapKeyword: protoDollar[1].id, keyType: protoDollar[3].id, valueType: protoDollar[5].cid} + protoVAL.mapType.setRange(protoDollar[1].id, protoDollar[6].b) + } + case 125: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:603 + { + protoVAL.ext = &extensionRangeNode{ranges: protoDollar[2].rngs} + protoVAL.ext.setRange(protoDollar[1].id, protoDollar[3].b) + } + case 126: + protoDollar = protoS[protopt-4 : protopt+1] +//line proto.y:607 + { + protoVAL.ext = &extensionRangeNode{ranges: protoDollar[2].rngs, options: protoDollar[3].cmpctOpts} + protoVAL.ext.setRange(protoDollar[1].id, protoDollar[4].b) + } + case 127: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:612 + { + protoVAL.rngs = append(protoDollar[1].rngs, protoDollar[3].rngs...) + } + case 129: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:617 + { + r := &rangeNode{startNode: protoDollar[1].i} + r.setRange(protoDollar[1].i, protoDollar[1].i) + protoVAL.rngs = []*rangeNode{r} + } + case 130: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:622 + { + r := &rangeNode{startNode: protoDollar[1].i, endNode: protoDollar[3].i} + r.setRange(protoDollar[1].i, protoDollar[3].i) + protoVAL.rngs = []*rangeNode{r} + } + case 131: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:627 + { + r := &rangeNode{startNode: protoDollar[1].i, endNode: protoDollar[3].id, endMax: true} + r.setRange(protoDollar[1].i, protoDollar[3].id) + protoVAL.rngs = []*rangeNode{r} + } + case 132: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:633 + { + protoVAL.rngs = append(protoDollar[1].rngs, protoDollar[3].rngs...) + } + case 134: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:638 + { + r := &rangeNode{startNode: protoDollar[1].il} + r.setRange(protoDollar[1].il, protoDollar[1].il) + protoVAL.rngs = []*rangeNode{r} + } + case 135: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:643 + { + r := &rangeNode{startNode: protoDollar[1].il, endNode: protoDollar[3].il} + r.setRange(protoDollar[1].il, protoDollar[3].il) + protoVAL.rngs = []*rangeNode{r} + } + case 136: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:648 + { + r := &rangeNode{startNode: protoDollar[1].il, endNode: protoDollar[3].id, endMax: true} + r.setRange(protoDollar[1].il, protoDollar[3].id) + protoVAL.rngs = []*rangeNode{r} + } + case 137: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:654 + { + i := &compoundIntNode{val: int64(protoDollar[1].i.val)} + i.setRange(protoDollar[1].i, protoDollar[1].i) + protoVAL.il = i + } + case 138: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:659 + { + if protoDollar[2].i.val > math.MaxInt64+1 { + lexError(protolex, protoDollar[2].i.start(), fmt.Sprintf("numeric constant %d would underflow 64-bit signed int (allowed range is %d to %d)", protoDollar[2].i.val, int64(math.MinInt64), int64(math.MaxInt64))) + } + i := &compoundIntNode{val: -int64(protoDollar[2].i.val)} + i.setRange(protoDollar[1].b, protoDollar[2].i) + protoVAL.il = i + } + case 139: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:668 + { + protoVAL.resvd = &reservedNode{ranges: protoDollar[2].rngs} + protoVAL.resvd.setRange(protoDollar[1].id, protoDollar[3].b) + } + case 141: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:674 + { + protoVAL.resvd = &reservedNode{ranges: protoDollar[2].rngs} + protoVAL.resvd.setRange(protoDollar[1].id, protoDollar[3].b) + } + case 143: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:680 + { + protoVAL.resvd = &reservedNode{names: protoDollar[2].names} + protoVAL.resvd.setRange(protoDollar[1].id, protoDollar[3].b) + } + case 144: + protoDollar = protoS[protopt-3 : protopt+1] +//line proto.y:685 + { + protoVAL.names = append(protoDollar[1].names, protoDollar[3].str) + } + case 145: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:688 + { + protoVAL.names = []*compoundStringNode{protoDollar[1].str} + } + case 146: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:692 + { + protoVAL.en = &enumNode{name: protoDollar[2].id, decls: protoDollar[4].enDecls} + protoVAL.en.setRange(protoDollar[1].id, protoDollar[5].b) + } + case 147: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:697 + { + protoVAL.enDecls = append(protoDollar[1].enDecls, protoDollar[2].enDecls...) + } + case 149: + protoDollar = protoS[protopt-0 : protopt+1] +//line proto.y:701 + { + protoVAL.enDecls = nil + } + case 150: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:705 + { + protoVAL.enDecls = []*enumElement{{option: protoDollar[1].opts[0]}} + } + case 151: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:708 + { + protoVAL.enDecls = []*enumElement{{value: protoDollar[1].env}} + } + case 152: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:711 + { + protoVAL.enDecls = []*enumElement{{reserved: protoDollar[1].resvd}} + } + case 153: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:714 + { + protoVAL.enDecls = []*enumElement{{empty: protoDollar[1].b}} + } + case 154: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:717 + { + } + case 155: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:719 + { + } + case 156: + protoDollar = protoS[protopt-4 : protopt+1] +//line proto.y:722 + { + protoVAL.env = &enumValueNode{name: protoDollar[1].id, number: protoDollar[3].il} + protoVAL.env.setRange(protoDollar[1].id, protoDollar[4].b) + } + case 157: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:726 + { + protoVAL.env = &enumValueNode{name: protoDollar[1].id, number: protoDollar[3].il, options: protoDollar[4].cmpctOpts} + protoVAL.env.setRange(protoDollar[1].id, protoDollar[5].b) + } + case 158: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:731 + { + protoVAL.msg = &messageNode{name: protoDollar[2].id, decls: protoDollar[4].msgDecls} + protoVAL.msg.setRange(protoDollar[1].id, protoDollar[5].b) + } + case 159: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:736 + { + protoVAL.msgDecls = append(protoDollar[1].msgDecls, protoDollar[2].msgDecls...) + } + case 161: + protoDollar = protoS[protopt-0 : protopt+1] +//line proto.y:740 + { + protoVAL.msgDecls = nil + } + case 162: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:744 + { + protoVAL.msgDecls = []*messageElement{{field: protoDollar[1].fld}} + } + case 163: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:747 + { + protoVAL.msgDecls = []*messageElement{{enum: protoDollar[1].en}} + } + case 164: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:750 + { + protoVAL.msgDecls = []*messageElement{{nested: protoDollar[1].msg}} + } + case 165: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:753 + { + protoVAL.msgDecls = []*messageElement{{extend: protoDollar[1].extend}} + } + case 166: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:756 + { + protoVAL.msgDecls = []*messageElement{{extensionRange: protoDollar[1].ext}} + } + case 167: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:759 + { + protoVAL.msgDecls = []*messageElement{{group: protoDollar[1].grp}} + } + case 168: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:762 + { + protoVAL.msgDecls = []*messageElement{{option: protoDollar[1].opts[0]}} + } + case 169: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:765 + { + protoVAL.msgDecls = []*messageElement{{oneOf: protoDollar[1].oo}} + } + case 170: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:768 + { + protoVAL.msgDecls = []*messageElement{{mapField: protoDollar[1].mapFld}} + } + case 171: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:771 + { + protoVAL.msgDecls = []*messageElement{{reserved: protoDollar[1].resvd}} + } + case 172: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:774 + { + protoVAL.msgDecls = []*messageElement{{empty: protoDollar[1].b}} + } + case 173: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:777 + { + } + case 174: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:779 + { + } + case 175: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:782 + { + protoVAL.extend = &extendNode{extendee: protoDollar[2].cid, decls: protoDollar[4].extDecls} + protoVAL.extend.setRange(protoDollar[1].id, protoDollar[5].b) + } + case 176: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:787 + { + protoVAL.extDecls = append(protoDollar[1].extDecls, protoDollar[2].extDecls...) + } + case 178: + protoDollar = protoS[protopt-0 : protopt+1] +//line proto.y:791 + { + protoVAL.extDecls = nil + } + case 179: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:795 + { + protoVAL.extDecls = []*extendElement{{field: protoDollar[1].fld}} + } + case 180: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:798 + { + protoVAL.extDecls = []*extendElement{{group: protoDollar[1].grp}} + } + case 181: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:801 + { + protoVAL.extDecls = []*extendElement{{empty: protoDollar[1].b}} + } + case 182: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:804 + { + } + case 183: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:806 + { + } + case 184: + protoDollar = protoS[protopt-5 : protopt+1] +//line proto.y:809 + { + protoVAL.svc = &serviceNode{name: protoDollar[2].id, decls: protoDollar[4].svcDecls} + protoVAL.svc.setRange(protoDollar[1].id, protoDollar[5].b) + } + case 185: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:814 + { + protoVAL.svcDecls = append(protoDollar[1].svcDecls, protoDollar[2].svcDecls...) + } + case 187: + protoDollar = protoS[protopt-0 : protopt+1] +//line proto.y:818 + { + protoVAL.svcDecls = nil + } + case 188: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:825 + { + protoVAL.svcDecls = []*serviceElement{{option: protoDollar[1].opts[0]}} + } + case 189: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:828 + { + protoVAL.svcDecls = []*serviceElement{{rpc: protoDollar[1].mtd}} + } + case 190: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:831 + { + protoVAL.svcDecls = []*serviceElement{{empty: protoDollar[1].b}} + } + case 191: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:834 + { + } + case 192: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:836 + { + } + case 193: + protoDollar = protoS[protopt-10 : protopt+1] +//line proto.y:839 + { + protoVAL.mtd = &methodNode{name: protoDollar[2].id, input: protoDollar[4].rpcType, output: protoDollar[8].rpcType} + protoVAL.mtd.setRange(protoDollar[1].id, protoDollar[10].b) + } + case 194: + protoDollar = protoS[protopt-12 : protopt+1] +//line proto.y:843 + { + protoVAL.mtd = &methodNode{name: protoDollar[2].id, input: protoDollar[4].rpcType, output: protoDollar[8].rpcType, options: protoDollar[11].opts} + protoVAL.mtd.setRange(protoDollar[1].id, protoDollar[12].b) + } + case 195: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:848 + { + protoVAL.rpcType = &rpcTypeNode{msgType: protoDollar[2].cid, streamKeyword: protoDollar[1].id} + protoVAL.rpcType.setRange(protoDollar[1].id, protoDollar[2].cid) + } + case 196: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:852 + { + protoVAL.rpcType = &rpcTypeNode{msgType: protoDollar[1].cid} + protoVAL.rpcType.setRange(protoDollar[1].cid, protoDollar[1].cid) + } + case 197: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:857 + { + protoVAL.opts = append(protoDollar[1].opts, protoDollar[2].opts...) + } + case 199: + protoDollar = protoS[protopt-0 : protopt+1] +//line proto.y:861 + { + protoVAL.opts = []*optionNode{} + } + case 200: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:865 + { + protoVAL.opts = protoDollar[1].opts + } + case 201: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:868 + { + protoVAL.opts = []*optionNode{} + } + case 202: + protoDollar = protoS[protopt-2 : protopt+1] +//line proto.y:871 + { + } + case 203: + protoDollar = protoS[protopt-1 : protopt+1] +//line proto.y:873 + { + } + } + goto protostack /* stack new state and value */ +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/resolve_files.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/resolve_files.go new file mode 100644 index 00000000..3ae1415a --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/resolve_files.go @@ -0,0 +1,175 @@ +package protoparse + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "strings" +) + +var errNoImportPathsForAbsoluteFilePath = errors.New("must specify at least one import path if any absolute file paths are given") + +// ResolveFilenames tries to resolve fileNames into paths that are relative to +// directories in the given importPaths. The returned slice has the results in +// the same order as they are supplied in fileNames. +// +// The resulting names should be suitable for passing to Parser.ParseFiles. +// +// If no import paths are given and any file name is absolute, this returns an +// error. If no import paths are given and all file names are relative, this +// returns the original file names. If a file name is already relative to one +// of the given import paths, it will be unchanged in the returned slice. If a +// file name given is relative to the current working directory, it will be made +// relative to one of the given import paths; but if it cannot be made relative +// (due to no matching import path), an error will be returned. +func ResolveFilenames(importPaths []string, fileNames ...string) ([]string, error) { + if len(importPaths) == 0 { + if containsAbsFilePath(fileNames) { + // We have to do this as otherwise parseProtoFiles can result in duplicate symbols. + // For example, assume we import "foo/bar/bar.proto" in a file "/home/alice/dev/foo/bar/baz.proto" + // as we call ParseFiles("/home/alice/dev/foo/bar/bar.proto","/home/alice/dev/foo/bar/baz.proto") + // with "/home/alice/dev" as our current directory. Due to the recursive nature of parseProtoFiles, + // it will discover the import "foo/bar/bar.proto" in the input file, and call parse on this, + // adding "foo/bar/bar.proto" to the parsed results, as well as "/home/alice/dev/foo/bar/bar.proto" + // from the input file list. This will result in a + // 'duplicate symbol SYMBOL: already defined as field in "/home/alice/dev/foo/bar/bar.proto' + // error being returned from ParseFiles. + return nil, errNoImportPathsForAbsoluteFilePath + } + return fileNames, nil + } + absImportPaths, err := absoluteFilePaths(importPaths) + if err != nil { + return nil, err + } + resolvedFileNames := make([]string, 0, len(fileNames)) + for _, fileName := range fileNames { + resolvedFileName, err := resolveFilename(absImportPaths, fileName) + if err != nil { + return nil, err + } + // On Windows, the resolved paths will use "\", but proto imports + // require the use of "/". So fix up here. + if filepath.Separator != '/' { + resolvedFileName = strings.Replace(resolvedFileName, string(filepath.Separator), "/", -1) + } + resolvedFileNames = append(resolvedFileNames, resolvedFileName) + } + return resolvedFileNames, nil +} + +func containsAbsFilePath(filePaths []string) bool { + for _, filePath := range filePaths { + if filepath.IsAbs(filePath) { + return true + } + } + return false +} + +func absoluteFilePaths(filePaths []string) ([]string, error) { + absFilePaths := make([]string, 0, len(filePaths)) + for _, filePath := range filePaths { + absFilePath, err := canonicalize(filePath) + if err != nil { + return nil, err + } + absFilePaths = append(absFilePaths, absFilePath) + } + return absFilePaths, nil +} + +func canonicalize(filePath string) (string, error) { + absPath, err := filepath.Abs(filePath) + if err != nil { + return "", err + } + // this is kind of gross, but it lets us construct a resolved path even if some + // path elements do not exist (a single call to filepath.EvalSymlinks would just + // return an error, ENOENT, in that case). + head := absPath + tail := "" + for { + noLinks, err := filepath.EvalSymlinks(head) + if err == nil { + if tail != "" { + return filepath.Join(noLinks, tail), nil + } + return noLinks, nil + } + + if tail == "" { + tail = filepath.Base(head) + } else { + tail = filepath.Join(filepath.Base(head), tail) + } + head = filepath.Dir(head) + if head == "." { + // ran out of path elements to try to resolve + return absPath, nil + } + } +} + +const dotPrefix = "." + string(filepath.Separator) +const dotDotPrefix = ".." + string(filepath.Separator) + +func resolveFilename(absImportPaths []string, fileName string) (string, error) { + if filepath.IsAbs(fileName) { + return resolveAbsFilename(absImportPaths, fileName) + } + + if !strings.HasPrefix(fileName, dotPrefix) && !strings.HasPrefix(fileName, dotDotPrefix) { + // Use of . and .. are assumed to be relative to current working + // directory. So if those aren't present, check to see if the file is + // relative to an import path. + for _, absImportPath := range absImportPaths { + absFileName := filepath.Join(absImportPath, fileName) + _, err := os.Stat(absFileName) + if err != nil { + continue + } + // found it! it was relative to this import path + return fileName, nil + } + } + + // must be relative to current working dir + return resolveAbsFilename(absImportPaths, fileName) +} + +func resolveAbsFilename(absImportPaths []string, fileName string) (string, error) { + absFileName, err := canonicalize(fileName) + if err != nil { + return "", err + } + for _, absImportPath := range absImportPaths { + if isDescendant(absImportPath, absFileName) { + resolvedPath, err := filepath.Rel(absImportPath, absFileName) + if err != nil { + return "", err + } + return resolvedPath, nil + } + } + return "", fmt.Errorf("%s does not reside in any import path", fileName) +} + +// isDescendant returns true if file is a descendant of dir. Both dir and file must +// be cleaned, absolute paths. +func isDescendant(dir, file string) bool { + dir = filepath.Clean(dir) + cur := file + for { + d := filepath.Dir(cur) + if d == dir { + return true + } + if d == "." || d == cur { + // we've run out of path elements + return false + } + cur = d + } +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/source_code_info.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/source_code_info.go new file mode 100644 index 00000000..d5cc0471 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/source_code_info.go @@ -0,0 +1,532 @@ +package protoparse + +import ( + "bytes" + "strings" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/desc/internal" +) + +func (r *parseResult) generateSourceCodeInfo() *dpb.SourceCodeInfo { + if r.nodes == nil { + // skip files that do not have AST info (these will be files + // that came from well-known descriptors, instead of from source) + return nil + } + + sci := sourceCodeInfo{commentsUsed: map[*comment]struct{}{}} + path := make([]int32, 0, 10) + + fn := r.getFileNode(r.fd).(*fileNode) + sci.newLocWithoutComments(fn, nil) + + if fn.syntax != nil { + sci.newLoc(fn.syntax, append(path, internal.File_syntaxTag)) + } + + var depIndex, optIndex, msgIndex, enumIndex, extendIndex, svcIndex int32 + + for _, child := range fn.decls { + switch { + case child.imp != nil: + sci.newLoc(child.imp, append(path, internal.File_dependencyTag, int32(depIndex))) + depIndex++ + case child.pkg != nil: + sci.newLoc(child.pkg, append(path, internal.File_packageTag)) + case child.option != nil: + r.generateSourceCodeInfoForOption(&sci, child.option, false, &optIndex, append(path, internal.File_optionsTag)) + case child.message != nil: + r.generateSourceCodeInfoForMessage(&sci, child.message, nil, append(path, internal.File_messagesTag, msgIndex)) + msgIndex++ + case child.enum != nil: + r.generateSourceCodeInfoForEnum(&sci, child.enum, append(path, internal.File_enumsTag, enumIndex)) + enumIndex++ + case child.extend != nil: + r.generateSourceCodeInfoForExtensions(&sci, child.extend, &extendIndex, &msgIndex, append(path, internal.File_extensionsTag), append(dup(path), internal.File_messagesTag)) + case child.service != nil: + r.generateSourceCodeInfoForService(&sci, child.service, append(path, internal.File_servicesTag, svcIndex)) + svcIndex++ + } + } + + return &dpb.SourceCodeInfo{Location: sci.locs} +} + +func (r *parseResult) generateSourceCodeInfoForOption(sci *sourceCodeInfo, n *optionNode, compact bool, uninterpIndex *int32, path []int32) { + if !compact { + sci.newLocWithoutComments(n, path) + } + subPath := r.interpretedOptions[n] + if len(subPath) > 0 { + p := path + if subPath[0] == -1 { + // used by "default" and "json_name" field pseudo-options + // to attribute path to parent element (since those are + // stored directly on the descriptor, not its options) + p = make([]int32, len(path)-1) + copy(p, path) + subPath = subPath[1:] + } + sci.newLoc(n, append(p, subPath...)) + return + } + + // it's an uninterpreted option + optPath := append(path, internal.UninterpretedOptionsTag, *uninterpIndex) + *uninterpIndex++ + sci.newLoc(n, optPath) + var valTag int32 + switch n.val.(type) { + case *compoundIdentNode: + valTag = internal.Uninterpreted_identTag + case *intLiteralNode: + valTag = internal.Uninterpreted_posIntTag + case *compoundIntNode: + valTag = internal.Uninterpreted_negIntTag + case *compoundFloatNode: + valTag = internal.Uninterpreted_doubleTag + case *compoundStringNode: + valTag = internal.Uninterpreted_stringTag + case *aggregateLiteralNode: + valTag = internal.Uninterpreted_aggregateTag + } + if valTag != 0 { + sci.newLoc(n.val, append(optPath, valTag)) + } + for j, nn := range n.name.parts { + optNmPath := append(optPath, internal.Uninterpreted_nameTag, int32(j)) + sci.newLoc(nn, optNmPath) + sci.newLoc(nn.text, append(optNmPath, internal.UninterpretedName_nameTag)) + } +} + +func (r *parseResult) generateSourceCodeInfoForMessage(sci *sourceCodeInfo, n msgDecl, fieldPath []int32, path []int32) { + sci.newLoc(n, path) + + var decls []*messageElement + switch n := n.(type) { + case *messageNode: + decls = n.decls + case *groupNode: + decls = n.decls + case *mapFieldNode: + // map entry so nothing else to do + return + } + + sci.newLoc(n.messageName(), append(path, internal.Message_nameTag)) + // matching protoc, which emits the corresponding field type name (for group fields) + // right after the source location for the group message name + if fieldPath != nil { + sci.newLoc(n.messageName(), append(fieldPath, internal.Field_typeNameTag)) + } + + var optIndex, fieldIndex, oneOfIndex, extendIndex, nestedMsgIndex int32 + var nestedEnumIndex, extRangeIndex, reservedRangeIndex, reservedNameIndex int32 + for _, child := range decls { + switch { + case child.option != nil: + r.generateSourceCodeInfoForOption(sci, child.option, false, &optIndex, append(path, internal.Message_optionsTag)) + case child.field != nil: + r.generateSourceCodeInfoForField(sci, child.field, append(path, internal.Message_fieldsTag, fieldIndex)) + fieldIndex++ + case child.group != nil: + fldPath := append(path, internal.Message_fieldsTag, fieldIndex) + r.generateSourceCodeInfoForField(sci, child.group, fldPath) + fieldIndex++ + r.generateSourceCodeInfoForMessage(sci, child.group, fldPath, append(dup(path), internal.Message_nestedMessagesTag, nestedMsgIndex)) + nestedMsgIndex++ + case child.mapField != nil: + r.generateSourceCodeInfoForField(sci, child.mapField, append(path, internal.Message_fieldsTag, fieldIndex)) + fieldIndex++ + case child.oneOf != nil: + r.generateSourceCodeInfoForOneOf(sci, child.oneOf, &fieldIndex, &nestedMsgIndex, append(path, internal.Message_fieldsTag), append(dup(path), internal.Message_nestedMessagesTag), append(dup(path), internal.Message_oneOfsTag, oneOfIndex)) + oneOfIndex++ + case child.nested != nil: + r.generateSourceCodeInfoForMessage(sci, child.nested, nil, append(path, internal.Message_nestedMessagesTag, nestedMsgIndex)) + nestedMsgIndex++ + case child.enum != nil: + r.generateSourceCodeInfoForEnum(sci, child.enum, append(path, internal.Message_enumsTag, nestedEnumIndex)) + nestedEnumIndex++ + case child.extend != nil: + r.generateSourceCodeInfoForExtensions(sci, child.extend, &extendIndex, &nestedMsgIndex, append(path, internal.Message_extensionsTag), append(dup(path), internal.Message_nestedMessagesTag)) + case child.extensionRange != nil: + r.generateSourceCodeInfoForExtensionRanges(sci, child.extensionRange, &extRangeIndex, append(path, internal.Message_extensionRangeTag)) + case child.reserved != nil: + if len(child.reserved.names) > 0 { + resPath := append(path, internal.Message_reservedNameTag) + sci.newLoc(child.reserved, resPath) + for _, rn := range child.reserved.names { + sci.newLoc(rn, append(resPath, reservedNameIndex)) + reservedNameIndex++ + } + } + if len(child.reserved.ranges) > 0 { + resPath := append(path, internal.Message_reservedRangeTag) + sci.newLoc(child.reserved, resPath) + for _, rr := range child.reserved.ranges { + r.generateSourceCodeInfoForReservedRange(sci, rr, append(resPath, reservedRangeIndex)) + reservedRangeIndex++ + } + } + } + } +} + +func (r *parseResult) generateSourceCodeInfoForEnum(sci *sourceCodeInfo, n *enumNode, path []int32) { + sci.newLoc(n, path) + sci.newLoc(n.name, append(path, internal.Enum_nameTag)) + + var optIndex, valIndex, reservedNameIndex, reservedRangeIndex int32 + for _, child := range n.decls { + switch { + case child.option != nil: + r.generateSourceCodeInfoForOption(sci, child.option, false, &optIndex, append(path, internal.Enum_optionsTag)) + case child.value != nil: + r.generateSourceCodeInfoForEnumValue(sci, child.value, append(path, internal.Enum_valuesTag, valIndex)) + valIndex++ + case child.reserved != nil: + if len(child.reserved.names) > 0 { + resPath := append(path, internal.Enum_reservedNameTag) + sci.newLoc(child.reserved, resPath) + for _, rn := range child.reserved.names { + sci.newLoc(rn, append(resPath, reservedNameIndex)) + reservedNameIndex++ + } + } + if len(child.reserved.ranges) > 0 { + resPath := append(path, internal.Enum_reservedRangeTag) + sci.newLoc(child.reserved, resPath) + for _, rr := range child.reserved.ranges { + r.generateSourceCodeInfoForReservedRange(sci, rr, append(resPath, reservedRangeIndex)) + reservedRangeIndex++ + } + } + } + } +} + +func (r *parseResult) generateSourceCodeInfoForEnumValue(sci *sourceCodeInfo, n *enumValueNode, path []int32) { + sci.newLoc(n, path) + sci.newLoc(n.name, append(path, internal.EnumVal_nameTag)) + sci.newLoc(n.getNumber(), append(path, internal.EnumVal_numberTag)) + + // enum value options + if n.options != nil { + optsPath := append(path, internal.EnumVal_optionsTag) + sci.newLoc(n.options, optsPath) + var optIndex int32 + for _, opt := range n.options.decls { + r.generateSourceCodeInfoForOption(sci, opt, true, &optIndex, optsPath) + } + } +} + +func (r *parseResult) generateSourceCodeInfoForReservedRange(sci *sourceCodeInfo, n *rangeNode, path []int32) { + sci.newLoc(n, path) + sci.newLoc(n.startNode, append(path, internal.ReservedRange_startTag)) + if n.endNode != nil { + sci.newLoc(n.endNode, append(path, internal.ReservedRange_endTag)) + } +} + +func (r *parseResult) generateSourceCodeInfoForExtensions(sci *sourceCodeInfo, n *extendNode, extendIndex, msgIndex *int32, extendPath, msgPath []int32) { + sci.newLoc(n, extendPath) + for _, decl := range n.decls { + switch { + case decl.field != nil: + r.generateSourceCodeInfoForField(sci, decl.field, append(extendPath, *extendIndex)) + *extendIndex++ + case decl.group != nil: + fldPath := append(extendPath, *extendIndex) + r.generateSourceCodeInfoForField(sci, decl.group, fldPath) + *extendIndex++ + r.generateSourceCodeInfoForMessage(sci, decl.group, fldPath, append(msgPath, *msgIndex)) + *msgIndex++ + } + } +} + +func (r *parseResult) generateSourceCodeInfoForOneOf(sci *sourceCodeInfo, n *oneOfNode, fieldIndex, nestedMsgIndex *int32, fieldPath, nestedMsgPath, oneOfPath []int32) { + sci.newLoc(n, oneOfPath) + sci.newLoc(n.name, append(oneOfPath, internal.OneOf_nameTag)) + + var optIndex int32 + for _, child := range n.decls { + switch { + case child.option != nil: + r.generateSourceCodeInfoForOption(sci, child.option, false, &optIndex, append(oneOfPath, internal.OneOf_optionsTag)) + case child.field != nil: + r.generateSourceCodeInfoForField(sci, child.field, append(fieldPath, *fieldIndex)) + *fieldIndex++ + case child.group != nil: + fldPath := append(fieldPath, *fieldIndex) + r.generateSourceCodeInfoForField(sci, child.group, fldPath) + *fieldIndex++ + r.generateSourceCodeInfoForMessage(sci, child.group, fldPath, append(nestedMsgPath, *nestedMsgIndex)) + *nestedMsgIndex++ + } + } +} + +func (r *parseResult) generateSourceCodeInfoForField(sci *sourceCodeInfo, n fieldDecl, path []int32) { + isGroup := false + var opts *compactOptionsNode + var extendee *extendNode + var fieldType string + switch n := n.(type) { + case *fieldNode: + opts = n.options + extendee = n.extendee + fieldType = n.fldType.val + case *mapFieldNode: + opts = n.options + case *groupNode: + isGroup = true + extendee = n.extendee + case *syntheticMapField: + // shouldn't get here since we don't recurse into fields from a mapNode + // in generateSourceCodeInfoForMessage... but just in case + return + } + + if isGroup { + // comments will appear on group message + sci.newLocWithoutComments(n, path) + if extendee != nil { + sci.newLoc(extendee.extendee, append(path, internal.Field_extendeeTag)) + } + if n.fieldLabel() != nil { + // no comments here either (label is first token for group, so we want + // to leave the comments to be associated with the group message instead) + sci.newLocWithoutComments(n.fieldLabel(), append(path, internal.Field_labelTag)) + } + sci.newLoc(n.fieldType(), append(path, internal.Field_typeTag)) + // let the name comments be attributed to the group name + sci.newLocWithoutComments(n.fieldName(), append(path, internal.Field_nameTag)) + } else { + sci.newLoc(n, path) + if extendee != nil { + sci.newLoc(extendee.extendee, append(path, internal.Field_extendeeTag)) + } + if n.fieldLabel() != nil { + sci.newLoc(n.fieldLabel(), append(path, internal.Field_labelTag)) + } + n.fieldType() + var tag int32 + if _, isScalar := fieldTypes[fieldType]; isScalar { + tag = internal.Field_typeTag + } else { + // this is a message or an enum, so attribute type location + // to the type name field + tag = internal.Field_typeNameTag + } + sci.newLoc(n.fieldType(), append(path, tag)) + sci.newLoc(n.fieldName(), append(path, internal.Field_nameTag)) + } + sci.newLoc(n.fieldTag(), append(path, internal.Field_numberTag)) + + if opts != nil { + optsPath := append(path, internal.Field_optionsTag) + sci.newLoc(opts, optsPath) + var optIndex int32 + for _, opt := range opts.decls { + r.generateSourceCodeInfoForOption(sci, opt, true, &optIndex, optsPath) + } + } +} + +func (r *parseResult) generateSourceCodeInfoForExtensionRanges(sci *sourceCodeInfo, n *extensionRangeNode, extRangeIndex *int32, path []int32) { + sci.newLoc(n, path) + for _, child := range n.ranges { + path := append(path, *extRangeIndex) + *extRangeIndex++ + sci.newLoc(child, path) + sci.newLoc(child.startNode, append(path, internal.ExtensionRange_startTag)) + if child.endNode != nil { + sci.newLoc(child.endNode, append(path, internal.ExtensionRange_endTag)) + } + if n.options != nil { + optsPath := append(path, internal.ExtensionRange_optionsTag) + sci.newLoc(n.options, optsPath) + var optIndex int32 + for _, opt := range n.options.decls { + r.generateSourceCodeInfoForOption(sci, opt, true, &optIndex, optsPath) + } + } + } +} + +func (r *parseResult) generateSourceCodeInfoForService(sci *sourceCodeInfo, n *serviceNode, path []int32) { + sci.newLoc(n, path) + sci.newLoc(n.name, append(path, internal.Service_nameTag)) + var optIndex, rpcIndex int32 + for _, child := range n.decls { + switch { + case child.option != nil: + r.generateSourceCodeInfoForOption(sci, child.option, false, &optIndex, append(path, internal.Service_optionsTag)) + case child.rpc != nil: + r.generateSourceCodeInfoForMethod(sci, child.rpc, append(path, internal.Service_methodsTag, rpcIndex)) + rpcIndex++ + } + } +} + +func (r *parseResult) generateSourceCodeInfoForMethod(sci *sourceCodeInfo, n *methodNode, path []int32) { + sci.newLoc(n, path) + sci.newLoc(n.name, append(path, internal.Method_nameTag)) + if n.input.streamKeyword != nil { + sci.newLoc(n.input.streamKeyword, append(path, internal.Method_inputStreamTag)) + } + sci.newLoc(n.input.msgType, append(path, internal.Method_inputTag)) + if n.output.streamKeyword != nil { + sci.newLoc(n.output.streamKeyword, append(path, internal.Method_outputStreamTag)) + } + sci.newLoc(n.output.msgType, append(path, internal.Method_outputTag)) + + optsPath := append(path, internal.Method_optionsTag) + var optIndex int32 + for _, opt := range n.options { + r.generateSourceCodeInfoForOption(sci, opt, false, &optIndex, optsPath) + } +} + +type sourceCodeInfo struct { + locs []*dpb.SourceCodeInfo_Location + commentsUsed map[*comment]struct{} +} + +func (sci *sourceCodeInfo) newLocWithoutComments(n node, path []int32) { + dup := make([]int32, len(path)) + copy(dup, path) + sci.locs = append(sci.locs, &dpb.SourceCodeInfo_Location{ + Path: dup, + Span: makeSpan(n.start(), n.end()), + }) +} + +func (sci *sourceCodeInfo) newLoc(n node, path []int32) { + leadingComments := n.leadingComments() + trailingComments := n.trailingComments() + if sci.commentUsed(leadingComments) { + leadingComments = nil + } + if sci.commentUsed(trailingComments) { + trailingComments = nil + } + detached := groupComments(leadingComments) + var trail *string + if str, ok := combineComments(trailingComments); ok { + trail = proto.String(str) + } + var lead *string + if len(leadingComments) > 0 && leadingComments[len(leadingComments)-1].end.Line >= n.start().Line-1 { + lead = proto.String(detached[len(detached)-1]) + detached = detached[:len(detached)-1] + } + dup := make([]int32, len(path)) + copy(dup, path) + sci.locs = append(sci.locs, &dpb.SourceCodeInfo_Location{ + LeadingDetachedComments: detached, + LeadingComments: lead, + TrailingComments: trail, + Path: dup, + Span: makeSpan(n.start(), n.end()), + }) +} + +func makeSpan(start, end *SourcePos) []int32 { + if start.Line == end.Line { + return []int32{int32(start.Line) - 1, int32(start.Col) - 1, int32(end.Col) - 1} + } + return []int32{int32(start.Line) - 1, int32(start.Col) - 1, int32(end.Line) - 1, int32(end.Col) - 1} +} + +func (sci *sourceCodeInfo) commentUsed(c []comment) bool { + if len(c) == 0 { + return false + } + if _, ok := sci.commentsUsed[&c[0]]; ok { + return true + } + + sci.commentsUsed[&c[0]] = struct{}{} + return false +} + +func groupComments(comments []comment) []string { + if len(comments) == 0 { + return nil + } + + var groups []string + singleLineStyle := comments[0].text[:2] == "//" + line := comments[0].end.Line + start := 0 + for i := 1; i < len(comments); i++ { + c := comments[i] + prevSingleLine := singleLineStyle + singleLineStyle = strings.HasPrefix(comments[i].text, "//") + if !singleLineStyle || prevSingleLine != singleLineStyle || c.start.Line > line+1 { + // new group! + if str, ok := combineComments(comments[start:i]); ok { + groups = append(groups, str) + } + start = i + } + line = c.end.Line + } + // don't forget last group + if str, ok := combineComments(comments[start:]); ok { + groups = append(groups, str) + } + return groups +} + +func combineComments(comments []comment) (string, bool) { + if len(comments) == 0 { + return "", false + } + var buf bytes.Buffer + for _, c := range comments { + if c.text[:2] == "//" { + buf.WriteString(c.text[2:]) + } else { + lines := strings.Split(c.text[2:len(c.text)-2], "\n") + first := true + for _, l := range lines { + if first { + first = false + } else { + buf.WriteByte('\n') + } + + // strip a prefix of whitespace followed by '*' + j := 0 + for j < len(l) { + if l[j] != ' ' && l[j] != '\t' { + break + } + j++ + } + if j == len(l) { + l = "" + } else if l[j] == '*' { + l = l[j+1:] + } else if j > 0 { + l = " " + l[j:] + } + + buf.WriteString(l) + } + } + } + return buf.String(), true +} + +func dup(p []int32) []int32 { + return append(([]int32)(nil), p...) +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/std_imports.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/std_imports.go new file mode 100644 index 00000000..8fbc1fc3 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/std_imports.go @@ -0,0 +1,50 @@ +package protoparse + +import ( + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + // link in packages that include the standard protos included with protoc + _ "github.com/golang/protobuf/protoc-gen-go/plugin" + _ "github.com/golang/protobuf/ptypes/any" + _ "github.com/golang/protobuf/ptypes/duration" + _ "github.com/golang/protobuf/ptypes/empty" + _ "github.com/golang/protobuf/ptypes/struct" + _ "github.com/golang/protobuf/ptypes/timestamp" + _ "github.com/golang/protobuf/ptypes/wrappers" + _ "google.golang.org/genproto/protobuf/api" + _ "google.golang.org/genproto/protobuf/field_mask" + _ "google.golang.org/genproto/protobuf/ptype" + _ "google.golang.org/genproto/protobuf/source_context" + + "github.com/jhump/protoreflect/internal" +) + +// All files that are included with protoc are also included with this package +// so that clients do not need to explicitly supply a copy of these protos (just +// like callers of protoc do not need to supply them). +var standardImports map[string]*dpb.FileDescriptorProto + +func init() { + standardFilenames := []string{ + "google/protobuf/any.proto", + "google/protobuf/api.proto", + "google/protobuf/compiler/plugin.proto", + "google/protobuf/descriptor.proto", + "google/protobuf/duration.proto", + "google/protobuf/empty.proto", + "google/protobuf/field_mask.proto", + "google/protobuf/source_context.proto", + "google/protobuf/struct.proto", + "google/protobuf/timestamp.proto", + "google/protobuf/type.proto", + "google/protobuf/wrappers.proto", + } + + standardImports = map[string]*dpb.FileDescriptorProto{} + for _, fn := range standardFilenames { + fd, err := internal.LoadFileDescriptor(fn) + if err != nil { + panic(err.Error()) + } + standardImports[fn] = fd + } +} diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/test-source-info.txt b/vendor/github.com/jhump/protoreflect/desc/protoparse/test-source-info.txt new file mode 100644 index 00000000..4c1c775f --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/test-source-info.txt @@ -0,0 +1,6159 @@ +---- desc_test_comments.proto ---- + + +: +desc_test_comments.proto:8:1 +desc_test_comments.proto:141:2 + + + > syntax: +desc_test_comments.proto:8:1 +desc_test_comments.proto:8:19 + Leading detached comment [0]: + This is the first detached comment for the syntax. + + Leading detached comment [1]: + + This is a second detached comment. + + Leading detached comment [2]: + This is a third. + + Leading comments: + Syntax comment... + + Trailing comments: + Syntax trailer. + + + + > package: +desc_test_comments.proto:12:1 +desc_test_comments.proto:12:17 + Leading comments: + And now the package declaration + + + + > options: +desc_test_comments.proto:15:1 +desc_test_comments.proto:15:75 + + + > options > go_package: +desc_test_comments.proto:15:1 +desc_test_comments.proto:15:75 + Leading comments: + option comments FTW!!! + + + + > dependency[0]: +desc_test_comments.proto:17:1 +desc_test_comments.proto:17:38 + + + > dependency[1]: +desc_test_comments.proto:18:1 +desc_test_comments.proto:18:34 + + + > message_type[0]: +desc_test_comments.proto:25:1 +desc_test_comments.proto:105:2 + Leading detached comment [0]: + Multiple white space lines (like above) cannot + be preserved... + + Leading comments: + We need a request for our RPC service below. + + Trailing comments: + And next we'll need some extensions... + + + + > message_type[0] > name: +desc_test_comments.proto:25:68 +desc_test_comments.proto:25:75 + Leading detached comment [0]: + detached message name + Leading comments: + request with a capital R + Trailing comments: + trailer + + + + > message_type[0] > options: +desc_test_comments.proto:26:9 +desc_test_comments.proto:26:34 + + + > message_type[0] > options > deprecated: +desc_test_comments.proto:26:9 +desc_test_comments.proto:26:34 + Trailing comments: + deprecated! + + + + > message_type[0] > field[0]: +desc_test_comments.proto:29:9 +desc_test_comments.proto:32:132 + Leading comments: + A field comment + + Trailing comments: + field trailer #1... + + + + > message_type[0] > field[0] > label: +desc_test_comments.proto:29:9 +desc_test_comments.proto:29:17 + + + > message_type[0] > field[0] > type: +desc_test_comments.proto:29:18 +desc_test_comments.proto:29:23 + + + > message_type[0] > field[0] > name: +desc_test_comments.proto:29:24 +desc_test_comments.proto:29:27 + + + > message_type[0] > field[0] > number: +desc_test_comments.proto:29:70 +desc_test_comments.proto:29:71 + Leading detached comment [0]: + detached tag + Leading comments: + tag numero uno + Trailing comments: + tag trailer + that spans multiple lines... + more than two. + + + > message_type[0] > field[0] > options: +desc_test_comments.proto:32:11 +desc_test_comments.proto:32:131 + + + > message_type[0] > field[0] > options > packed: +desc_test_comments.proto:32:12 +desc_test_comments.proto:32:23 + Trailing comments: + packed! + + + > message_type[0] > field[0] > json_name: +desc_test_comments.proto:32:39 +desc_test_comments.proto:32:56 + Trailing comments: + custom JSON! + + + > message_type[0] > field[0] > options > ffubar[0]: +desc_test_comments.proto:32:77 +desc_test_comments.proto:32:102 + + + > message_type[0] > field[0] > options > ffubarb: +desc_test_comments.proto:32:104 +desc_test_comments.proto:32:130 + + + > message_type[0] > options: +desc_test_comments.proto:35:27 +desc_test_comments.proto:35:61 + + + > message_type[0] > options > mfubar: +desc_test_comments.proto:35:27 +desc_test_comments.proto:35:61 + Leading comments: + lead mfubar + Trailing comments: + trailing mfubar + + + + > message_type[0] > field[1]: +desc_test_comments.proto:42:29 +desc_test_comments.proto:43:77 + Leading detached comment [0]: + some detached comments + + Leading detached comment [1]: + some detached comments + + Leading detached comment [2]: + Another field comment + + Leading comments: + label comment + + + > message_type[0] > field[1] > label: +desc_test_comments.proto:42:29 +desc_test_comments.proto:42:37 + + + > message_type[0] > field[1] > type: +desc_test_comments.proto:42:57 +desc_test_comments.proto:42:63 + Leading comments: + type comment + + + > message_type[0] > field[1] > name: +desc_test_comments.proto:42:83 +desc_test_comments.proto:42:87 + Leading comments: + name comment + + + > message_type[0] > field[1] > number: +desc_test_comments.proto:42:90 +desc_test_comments.proto:42:91 + + + > message_type[0] > field[1] > options: +desc_test_comments.proto:43:17 +desc_test_comments.proto:43:76 + + + > message_type[0] > field[1] > default_value: +desc_test_comments.proto:43:37 +desc_test_comments.proto:43:54 + Leading comments: + default lead + Trailing comments: + default trail + + + > message_type[0] > extension_range: +desc_test_comments.proto:46:9 +desc_test_comments.proto:46:31 + Leading comments: + extension range comments are (sadly) not preserved + + + + > message_type[0] > extension_range[0]: +desc_test_comments.proto:46:20 +desc_test_comments.proto:46:30 + + + > message_type[0] > extension_range[0] > start: +desc_test_comments.proto:46:20 +desc_test_comments.proto:46:23 + + + > message_type[0] > extension_range[0] > end: +desc_test_comments.proto:46:27 +desc_test_comments.proto:46:30 + + + > message_type[0] > extension_range: +desc_test_comments.proto:47:9 +desc_test_comments.proto:47:109 + + + > message_type[0] > extension_range[1]: +desc_test_comments.proto:47:20 +desc_test_comments.proto:47:30 + + + > message_type[0] > extension_range[1] > start: +desc_test_comments.proto:47:20 +desc_test_comments.proto:47:23 + + + > message_type[0] > extension_range[1] > end: +desc_test_comments.proto:47:27 +desc_test_comments.proto:47:30 + + + > message_type[0] > extension_range[1] > options: +desc_test_comments.proto:47:31 +desc_test_comments.proto:47:108 + + + > message_type[0] > extension_range[1] > options > exfubarb: +desc_test_comments.proto:47:32 +desc_test_comments.proto:47:74 + + + > message_type[0] > extension_range[1] > options > exfubar[0]: +desc_test_comments.proto:47:76 +desc_test_comments.proto:47:107 + + + > message_type[0] > reserved_range: +desc_test_comments.proto:51:48 +desc_test_comments.proto:51:77 + Leading detached comment [0]: + another detached comment + + Leading comments: + same for reserved range comments + + + > message_type[0] > reserved_range[0]: +desc_test_comments.proto:51:57 +desc_test_comments.proto:51:65 + + + > message_type[0] > reserved_range[0] > start: +desc_test_comments.proto:51:57 +desc_test_comments.proto:51:59 + + + > message_type[0] > reserved_range[0] > end: +desc_test_comments.proto:51:63 +desc_test_comments.proto:51:65 + + + > message_type[0] > reserved_range[1]: +desc_test_comments.proto:51:67 +desc_test_comments.proto:51:75 + + + > message_type[0] > reserved_range[1] > start: +desc_test_comments.proto:51:67 +desc_test_comments.proto:51:69 + + + > message_type[0] > reserved_range[1] > end: +desc_test_comments.proto:51:73 +desc_test_comments.proto:51:75 + + + > message_type[0] > reserved_name: +desc_test_comments.proto:52:9 +desc_test_comments.proto:52:38 + Trailing comments: + reserved trailers + + + > message_type[0] > reserved_name[0]: +desc_test_comments.proto:52:18 +desc_test_comments.proto:52:23 + + + > message_type[0] > reserved_name[1]: +desc_test_comments.proto:52:25 +desc_test_comments.proto:52:30 + + + > message_type[0] > reserved_name[2]: +desc_test_comments.proto:52:32 +desc_test_comments.proto:52:37 + + + > message_type[0] > field[2]: +desc_test_comments.proto:55:9 +desc_test_comments.proto:67:10 + + + > message_type[0] > field[2] > label: +desc_test_comments.proto:55:9 +desc_test_comments.proto:55:17 + + + > message_type[0] > field[2] > type: +desc_test_comments.proto:55:18 +desc_test_comments.proto:55:23 + + + > message_type[0] > field[2] > name: +desc_test_comments.proto:55:41 +desc_test_comments.proto:55:47 + + + > message_type[0] > field[2] > number: +desc_test_comments.proto:55:50 +desc_test_comments.proto:55:51 + + + > message_type[0] > nested_type[0]: +desc_test_comments.proto:55:9 +desc_test_comments.proto:67:10 + Leading comments: + Group comment + + + + > message_type[0] > nested_type[0] > name: +desc_test_comments.proto:55:41 +desc_test_comments.proto:55:47 + Leading comments: + group name + + + > message_type[0] > field[2] > type_name: +desc_test_comments.proto:55:41 +desc_test_comments.proto:55:47 + + + > message_type[0] > nested_type[0] > options: +desc_test_comments.proto:57:17 +desc_test_comments.proto:57:52 + + + > message_type[0] > nested_type[0] > options > mfubar: +desc_test_comments.proto:57:17 +desc_test_comments.proto:57:52 + Leading comments: + this is a custom option + + + + > message_type[0] > nested_type[0] > field[0]: +desc_test_comments.proto:59:17 +desc_test_comments.proto:59:41 + + + > message_type[0] > nested_type[0] > field[0] > label: +desc_test_comments.proto:59:17 +desc_test_comments.proto:59:25 + + + > message_type[0] > nested_type[0] > field[0] > type: +desc_test_comments.proto:59:26 +desc_test_comments.proto:59:32 + + + > message_type[0] > nested_type[0] > field[0] > name: +desc_test_comments.proto:59:33 +desc_test_comments.proto:59:36 + + + > message_type[0] > nested_type[0] > field[0] > number: +desc_test_comments.proto:59:39 +desc_test_comments.proto:59:40 + + + > message_type[0] > nested_type[0] > field[1]: +desc_test_comments.proto:60:17 +desc_test_comments.proto:60:40 + + + > message_type[0] > nested_type[0] > field[1] > label: +desc_test_comments.proto:60:17 +desc_test_comments.proto:60:25 + + + > message_type[0] > nested_type[0] > field[1] > type: +desc_test_comments.proto:60:26 +desc_test_comments.proto:60:31 + + + > message_type[0] > nested_type[0] > field[1] > name: +desc_test_comments.proto:60:32 +desc_test_comments.proto:60:35 + + + > message_type[0] > nested_type[0] > field[1] > number: +desc_test_comments.proto:60:38 +desc_test_comments.proto:60:39 + + + > message_type[0] > nested_type[0] > options: +desc_test_comments.proto:62:17 +desc_test_comments.proto:62:64 + + + > message_type[0] > nested_type[0] > options > no_standard_descriptor_accessor: +desc_test_comments.proto:62:17 +desc_test_comments.proto:62:64 + + + > message_type[0] > nested_type[0] > field[2]: +desc_test_comments.proto:65:17 +desc_test_comments.proto:65:41 + Leading comments: + Leading comment... + + Trailing comments: + Trailing comment... + + + + > message_type[0] > nested_type[0] > field[2] > label: +desc_test_comments.proto:65:17 +desc_test_comments.proto:65:25 + + + > message_type[0] > nested_type[0] > field[2] > type: +desc_test_comments.proto:65:26 +desc_test_comments.proto:65:32 + + + > message_type[0] > nested_type[0] > field[2] > name: +desc_test_comments.proto:65:33 +desc_test_comments.proto:65:36 + + + > message_type[0] > nested_type[0] > field[2] > number: +desc_test_comments.proto:65:39 +desc_test_comments.proto:65:40 + + + > message_type[0] > enum_type[0]: +desc_test_comments.proto:69:9 +desc_test_comments.proto:90:10 + + + > message_type[0] > enum_type[0] > name: +desc_test_comments.proto:69:14 +desc_test_comments.proto:69:29 + Trailing comments: + "super"! + + + + > message_type[0] > enum_type[0] > options: +desc_test_comments.proto:72:17 +desc_test_comments.proto:72:43 + + + > message_type[0] > enum_type[0] > options > allow_alias: +desc_test_comments.proto:72:17 +desc_test_comments.proto:72:43 + Leading comments: + allow_alias comments! + + + + > message_type[0] > enum_type[0] > value[0]: +desc_test_comments.proto:74:17 +desc_test_comments.proto:74:86 + + + > message_type[0] > enum_type[0] > value[0] > name: +desc_test_comments.proto:74:17 +desc_test_comments.proto:74:22 + + + > message_type[0] > enum_type[0] > value[0] > number: +desc_test_comments.proto:74:25 +desc_test_comments.proto:74:26 + + + > message_type[0] > enum_type[0] > value[0] > options: +desc_test_comments.proto:74:27 +desc_test_comments.proto:74:85 + + + > message_type[0] > enum_type[0] > value[0] > options > evfubars: +desc_test_comments.proto:74:28 +desc_test_comments.proto:74:56 + + + > message_type[0] > enum_type[0] > value[0] > options > evfubar: +desc_test_comments.proto:74:58 +desc_test_comments.proto:74:84 + + + > message_type[0] > enum_type[0] > value[1]: +desc_test_comments.proto:75:17 +desc_test_comments.proto:75:100 + + + > message_type[0] > enum_type[0] > value[1] > name: +desc_test_comments.proto:75:17 +desc_test_comments.proto:75:22 + + + > message_type[0] > enum_type[0] > value[1] > number: +desc_test_comments.proto:75:25 +desc_test_comments.proto:75:26 + + + > message_type[0] > enum_type[0] > value[1] > options: +desc_test_comments.proto:75:27 +desc_test_comments.proto:75:99 + + + > message_type[0] > enum_type[0] > value[1] > options > evfubaruf: +desc_test_comments.proto:75:29 +desc_test_comments.proto:75:57 + + + > message_type[0] > enum_type[0] > value[1] > options > evfubaru: +desc_test_comments.proto:75:73 +desc_test_comments.proto:75:98 + + + > message_type[0] > enum_type[0] > value[2]: +desc_test_comments.proto:76:17 +desc_test_comments.proto:76:27 + + + > message_type[0] > enum_type[0] > value[2] > name: +desc_test_comments.proto:76:17 +desc_test_comments.proto:76:22 + + + > message_type[0] > enum_type[0] > value[2] > number: +desc_test_comments.proto:76:25 +desc_test_comments.proto:76:26 + + + > message_type[0] > enum_type[0] > value[3]: +desc_test_comments.proto:77:17 +desc_test_comments.proto:77:28 + + + > message_type[0] > enum_type[0] > value[3] > name: +desc_test_comments.proto:77:17 +desc_test_comments.proto:77:23 + + + > message_type[0] > enum_type[0] > value[3] > number: +desc_test_comments.proto:77:26 +desc_test_comments.proto:77:27 + + + > message_type[0] > enum_type[0] > options: +desc_test_comments.proto:79:17 +desc_test_comments.proto:79:52 + + + > message_type[0] > enum_type[0] > options > efubars: +desc_test_comments.proto:79:17 +desc_test_comments.proto:79:52 + + + > message_type[0] > enum_type[0] > value[4]: +desc_test_comments.proto:81:17 +desc_test_comments.proto:81:27 + + + > message_type[0] > enum_type[0] > value[4] > name: +desc_test_comments.proto:81:17 +desc_test_comments.proto:81:22 + + + > message_type[0] > enum_type[0] > value[4] > number: +desc_test_comments.proto:81:25 +desc_test_comments.proto:81:26 + + + > message_type[0] > enum_type[0] > value[5]: +desc_test_comments.proto:82:17 +desc_test_comments.proto:82:29 + + + > message_type[0] > enum_type[0] > value[5] > name: +desc_test_comments.proto:82:17 +desc_test_comments.proto:82:24 + + + > message_type[0] > enum_type[0] > value[5] > number: +desc_test_comments.proto:82:27 +desc_test_comments.proto:82:28 + + + > message_type[0] > enum_type[0] > value[6]: +desc_test_comments.proto:83:17 +desc_test_comments.proto:83:60 + + + > message_type[0] > enum_type[0] > value[6] > name: +desc_test_comments.proto:83:17 +desc_test_comments.proto:83:24 + + + > message_type[0] > enum_type[0] > value[6] > number: +desc_test_comments.proto:83:27 +desc_test_comments.proto:83:28 + + + > message_type[0] > enum_type[0] > value[6] > options: +desc_test_comments.proto:83:29 +desc_test_comments.proto:83:59 + + + > message_type[0] > enum_type[0] > value[6] > options > evfubarsf: +desc_test_comments.proto:83:30 +desc_test_comments.proto:83:58 + + + > message_type[0] > enum_type[0] > value[7]: +desc_test_comments.proto:84:17 +desc_test_comments.proto:84:28 + + + > message_type[0] > enum_type[0] > value[7] > name: +desc_test_comments.proto:84:17 +desc_test_comments.proto:84:23 + + + > message_type[0] > enum_type[0] > value[7] > number: +desc_test_comments.proto:84:26 +desc_test_comments.proto:84:27 + + + > message_type[0] > enum_type[0] > value[8]: +desc_test_comments.proto:85:17 +desc_test_comments.proto:85:31 + + + > message_type[0] > enum_type[0] > value[8] > name: +desc_test_comments.proto:85:17 +desc_test_comments.proto:85:26 + + + > message_type[0] > enum_type[0] > value[8] > number: +desc_test_comments.proto:85:29 +desc_test_comments.proto:85:30 + + + > message_type[0] > enum_type[0] > value[9]: +desc_test_comments.proto:86:17 +desc_test_comments.proto:86:27 + + + > message_type[0] > enum_type[0] > value[9] > name: +desc_test_comments.proto:86:17 +desc_test_comments.proto:86:22 + + + > message_type[0] > enum_type[0] > value[9] > number: +desc_test_comments.proto:86:25 +desc_test_comments.proto:86:26 + + + > message_type[0] > enum_type[0] > value[10]: +desc_test_comments.proto:87:17 +desc_test_comments.proto:87:31 + + + > message_type[0] > enum_type[0] > value[10] > name: +desc_test_comments.proto:87:17 +desc_test_comments.proto:87:23 + + + > message_type[0] > enum_type[0] > value[10] > number: +desc_test_comments.proto:87:26 +desc_test_comments.proto:87:30 + + + > message_type[0] > enum_type[0] > options: +desc_test_comments.proto:89:17 +desc_test_comments.proto:89:50 + + + > message_type[0] > enum_type[0] > options > efubar: +desc_test_comments.proto:89:17 +desc_test_comments.proto:89:50 + + + > message_type[0] > oneof_decl[0]: +desc_test_comments.proto:93:9 +desc_test_comments.proto:96:10 + Leading comments: + can be this or that + + + + > message_type[0] > oneof_decl[0] > name: +desc_test_comments.proto:93:15 +desc_test_comments.proto:93:18 + + + > message_type[0] > field[3]: +desc_test_comments.proto:94:17 +desc_test_comments.proto:94:33 + + + > message_type[0] > field[3] > type: +desc_test_comments.proto:94:17 +desc_test_comments.proto:94:23 + + + > message_type[0] > field[3] > name: +desc_test_comments.proto:94:24 +desc_test_comments.proto:94:28 + + + > message_type[0] > field[3] > number: +desc_test_comments.proto:94:31 +desc_test_comments.proto:94:32 + + + > message_type[0] > field[4]: +desc_test_comments.proto:95:17 +desc_test_comments.proto:95:32 + + + > message_type[0] > field[4] > type: +desc_test_comments.proto:95:17 +desc_test_comments.proto:95:22 + + + > message_type[0] > field[4] > name: +desc_test_comments.proto:95:23 +desc_test_comments.proto:95:27 + + + > message_type[0] > field[4] > number: +desc_test_comments.proto:95:30 +desc_test_comments.proto:95:31 + + + > message_type[0] > oneof_decl[1]: +desc_test_comments.proto:98:9 +desc_test_comments.proto:101:10 + Leading comments: + can be these or those + + + + > message_type[0] > oneof_decl[1] > name: +desc_test_comments.proto:98:15 +desc_test_comments.proto:98:18 + + + > message_type[0] > field[5]: +desc_test_comments.proto:99:17 +desc_test_comments.proto:99:34 + + + > message_type[0] > field[5] > type: +desc_test_comments.proto:99:17 +desc_test_comments.proto:99:23 + + + > message_type[0] > field[5] > name: +desc_test_comments.proto:99:24 +desc_test_comments.proto:99:29 + + + > message_type[0] > field[5] > number: +desc_test_comments.proto:99:32 +desc_test_comments.proto:99:33 + + + > message_type[0] > field[6]: +desc_test_comments.proto:100:17 +desc_test_comments.proto:100:33 + + + > message_type[0] > field[6] > type: +desc_test_comments.proto:100:17 +desc_test_comments.proto:100:22 + + + > message_type[0] > field[6] > name: +desc_test_comments.proto:100:23 +desc_test_comments.proto:100:28 + + + > message_type[0] > field[6] > number: +desc_test_comments.proto:100:31 +desc_test_comments.proto:100:32 + + + > message_type[0] > field[7]: +desc_test_comments.proto:104:9 +desc_test_comments.proto:104:40 + Leading comments: + map field + + + + > message_type[0] > field[7] > type_name: +desc_test_comments.proto:104:9 +desc_test_comments.proto:104:28 + + + > message_type[0] > field[7] > name: +desc_test_comments.proto:104:29 +desc_test_comments.proto:104:35 + + + > message_type[0] > field[7] > number: +desc_test_comments.proto:104:38 +desc_test_comments.proto:104:39 + + + > extension: +desc_test_comments.proto:108:1 +desc_test_comments.proto:117:2 + Trailing comments: + extend trailer... + + + + > extension[0]: +desc_test_comments.proto:114:9 +desc_test_comments.proto:114:37 + Leading comments: + comment for guid1 + + + + > extension[0] > extendee: +desc_test_comments.proto:110:1 +desc_test_comments.proto:110:8 + Leading comments: + extendee comment + + Trailing comments: + extendee trailer + + + + > extension[0] > label: +desc_test_comments.proto:114:9 +desc_test_comments.proto:114:17 + + + > extension[0] > type: +desc_test_comments.proto:114:18 +desc_test_comments.proto:114:24 + + + > extension[0] > name: +desc_test_comments.proto:114:25 +desc_test_comments.proto:114:30 + + + > extension[0] > number: +desc_test_comments.proto:114:33 +desc_test_comments.proto:114:36 + + + > extension[1]: +desc_test_comments.proto:116:9 +desc_test_comments.proto:116:37 + Leading comments: + ... and a comment for guid2 + + + + > extension[1] > extendee: +desc_test_comments.proto:110:1 +desc_test_comments.proto:110:8 + + + > extension[1] > label: +desc_test_comments.proto:116:9 +desc_test_comments.proto:116:17 + + + > extension[1] > type: +desc_test_comments.proto:116:18 +desc_test_comments.proto:116:24 + + + > extension[1] > name: +desc_test_comments.proto:116:25 +desc_test_comments.proto:116:30 + + + > extension[1] > number: +desc_test_comments.proto:116:33 +desc_test_comments.proto:116:36 + + + > message_type[1]: +desc_test_comments.proto:120:1 +desc_test_comments.proto:120:81 + + + > message_type[1] > name: +desc_test_comments.proto:120:36 +desc_test_comments.proto:120:50 + Leading comments: + name leading comment + Trailing comments: + name trailing comment + + + > service[0]: +desc_test_comments.proto:123:1 +desc_test_comments.proto:141:2 + Leading comments: + Service comment + + Trailing comments: + service trailer + + + + > service[0] > name: +desc_test_comments.proto:123:28 +desc_test_comments.proto:123:38 + Leading comments: + service name + + + > service[0] > options: +desc_test_comments.proto:125:9 +desc_test_comments.proto:125:43 + + + > service[0] > options > sfubar > id: +desc_test_comments.proto:125:9 +desc_test_comments.proto:125:43 + Leading comments: + option that sets field + + + + > service[0] > options: +desc_test_comments.proto:127:9 +desc_test_comments.proto:127:47 + + + > service[0] > options > sfubar > name: +desc_test_comments.proto:127:9 +desc_test_comments.proto:127:47 + Leading comments: + another option that sets field + + + + > service[0] > options: +desc_test_comments.proto:128:9 +desc_test_comments.proto:128:35 + + + > service[0] > options > deprecated: +desc_test_comments.proto:128:9 +desc_test_comments.proto:128:35 + Trailing comments: + DEPRECATED! + + + + > service[0] > options: +desc_test_comments.proto:130:9 +desc_test_comments.proto:130:45 + + + > service[0] > options > sfubare: +desc_test_comments.proto:130:9 +desc_test_comments.proto:130:45 + + + > service[0] > method[0]: +desc_test_comments.proto:133:9 +desc_test_comments.proto:134:84 + Leading comments: + Method comment + + + + > service[0] > method[0] > name: +desc_test_comments.proto:133:28 +desc_test_comments.proto:133:40 + Leading comments: + rpc name + Trailing comments: + comment A + + + > service[0] > method[0] > client_streaming: +desc_test_comments.proto:133:73 +desc_test_comments.proto:133:79 + Leading comments: + comment B + + + > service[0] > method[0] > input_type: +desc_test_comments.proto:133:96 +desc_test_comments.proto:133:103 + Leading comments: + comment C + + + > service[0] > method[0] > output_type: +desc_test_comments.proto:134:57 +desc_test_comments.proto:134:64 + Leading comments: +comment E + + + > service[0] > method[1]: +desc_test_comments.proto:136:9 +desc_test_comments.proto:140:10 + + + > service[0] > method[1] > name: +desc_test_comments.proto:136:13 +desc_test_comments.proto:136:21 + + + > service[0] > method[1] > input_type: +desc_test_comments.proto:136:23 +desc_test_comments.proto:136:30 + + + > service[0] > method[1] > output_type: +desc_test_comments.proto:136:41 +desc_test_comments.proto:136:62 + + + > service[0] > method[1] > options: +desc_test_comments.proto:137:17 +desc_test_comments.proto:137:42 + + + > service[0] > method[1] > options > deprecated: +desc_test_comments.proto:137:17 +desc_test_comments.proto:137:42 + + + > service[0] > method[1] > options: +desc_test_comments.proto:138:17 +desc_test_comments.proto:138:53 + + + > service[0] > method[1] > options > mtfubar[0]: +desc_test_comments.proto:138:17 +desc_test_comments.proto:138:53 + + + > service[0] > method[1] > options: +desc_test_comments.proto:139:17 +desc_test_comments.proto:139:56 + + + > service[0] > method[1] > options > mtfubard: +desc_test_comments.proto:139:17 +desc_test_comments.proto:139:56 +---- desc_test_complex.proto ---- + + +: +desc_test_complex.proto:1:1 +desc_test_complex.proto:287:2 + + + > syntax: +desc_test_complex.proto:1:1 +desc_test_complex.proto:1:19 + + + > package: +desc_test_complex.proto:3:1 +desc_test_complex.proto:3:17 + + + > options: +desc_test_complex.proto:5:1 +desc_test_complex.proto:5:73 + + + > options > go_package: +desc_test_complex.proto:5:1 +desc_test_complex.proto:5:73 + + + > dependency[0]: +desc_test_complex.proto:7:1 +desc_test_complex.proto:7:43 + + + > message_type[0]: +desc_test_complex.proto:9:1 +desc_test_complex.proto:12:2 + + + > message_type[0] > name: +desc_test_complex.proto:9:9 +desc_test_complex.proto:9:15 + + + > message_type[0] > field[0]: +desc_test_complex.proto:10:9 +desc_test_complex.proto:10:34 + + + > message_type[0] > field[0] > label: +desc_test_complex.proto:10:9 +desc_test_complex.proto:10:17 + + + > message_type[0] > field[0] > type: +desc_test_complex.proto:10:18 +desc_test_complex.proto:10:24 + + + > message_type[0] > field[0] > name: +desc_test_complex.proto:10:25 +desc_test_complex.proto:10:29 + + + > message_type[0] > field[0] > number: +desc_test_complex.proto:10:32 +desc_test_complex.proto:10:33 + + + > message_type[0] > field[1]: +desc_test_complex.proto:11:9 +desc_test_complex.proto:11:32 + + + > message_type[0] > field[1] > label: +desc_test_complex.proto:11:9 +desc_test_complex.proto:11:17 + + + > message_type[0] > field[1] > type: +desc_test_complex.proto:11:18 +desc_test_complex.proto:11:24 + + + > message_type[0] > field[1] > name: +desc_test_complex.proto:11:25 +desc_test_complex.proto:11:27 + + + > message_type[0] > field[1] > number: +desc_test_complex.proto:11:30 +desc_test_complex.proto:11:31 + + + > extension: +desc_test_complex.proto:14:1 +desc_test_complex.proto:18:2 + + + > extension[0]: +desc_test_complex.proto:17:9 +desc_test_complex.proto:17:39 + + + > extension[0] > extendee: +desc_test_complex.proto:14:8 +desc_test_complex.proto:16:25 + + + > extension[0] > label: +desc_test_complex.proto:17:9 +desc_test_complex.proto:17:17 + + + > extension[0] > type: +desc_test_complex.proto:17:18 +desc_test_complex.proto:17:24 + + + > extension[0] > name: +desc_test_complex.proto:17:25 +desc_test_complex.proto:17:30 + + + > extension[0] > number: +desc_test_complex.proto:17:33 +desc_test_complex.proto:17:38 + + + > message_type[1]: +desc_test_complex.proto:20:1 +desc_test_complex.proto:59:2 + + + > message_type[1] > name: +desc_test_complex.proto:20:9 +desc_test_complex.proto:20:13 + + + > message_type[1] > field[0]: +desc_test_complex.proto:21:9 +desc_test_complex.proto:21:55 + + + > message_type[1] > field[0] > label: +desc_test_complex.proto:21:9 +desc_test_complex.proto:21:17 + + + > message_type[1] > field[0] > type: +desc_test_complex.proto:21:18 +desc_test_complex.proto:21:24 + + + > message_type[1] > field[0] > name: +desc_test_complex.proto:21:25 +desc_test_complex.proto:21:28 + + + > message_type[1] > field[0] > number: +desc_test_complex.proto:21:31 +desc_test_complex.proto:21:32 + + + > message_type[1] > field[0] > options: +desc_test_complex.proto:21:33 +desc_test_complex.proto:21:54 + + + > message_type[1] > field[0] > json_name: +desc_test_complex.proto:21:34 +desc_test_complex.proto:21:53 + + + > message_type[1] > field[1]: +desc_test_complex.proto:22:9 +desc_test_complex.proto:22:34 + + + > message_type[1] > field[1] > label: +desc_test_complex.proto:22:9 +desc_test_complex.proto:22:17 + + + > message_type[1] > field[1] > type: +desc_test_complex.proto:22:18 +desc_test_complex.proto:22:23 + + + > message_type[1] > field[1] > name: +desc_test_complex.proto:22:24 +desc_test_complex.proto:22:29 + + + > message_type[1] > field[1] > number: +desc_test_complex.proto:22:32 +desc_test_complex.proto:22:33 + + + > message_type[1] > field[2]: +desc_test_complex.proto:23:9 +desc_test_complex.proto:23:31 + + + > message_type[1] > field[2] > label: +desc_test_complex.proto:23:9 +desc_test_complex.proto:23:17 + + + > message_type[1] > field[2] > type_name: +desc_test_complex.proto:23:18 +desc_test_complex.proto:23:24 + + + > message_type[1] > field[2] > name: +desc_test_complex.proto:23:25 +desc_test_complex.proto:23:26 + + + > message_type[1] > field[2] > number: +desc_test_complex.proto:23:29 +desc_test_complex.proto:23:30 + + + > message_type[1] > field[3]: +desc_test_complex.proto:24:9 +desc_test_complex.proto:24:31 + + + > message_type[1] > field[3] > label: +desc_test_complex.proto:24:9 +desc_test_complex.proto:24:17 + + + > message_type[1] > field[3] > type_name: +desc_test_complex.proto:24:18 +desc_test_complex.proto:24:24 + + + > message_type[1] > field[3] > name: +desc_test_complex.proto:24:25 +desc_test_complex.proto:24:26 + + + > message_type[1] > field[3] > number: +desc_test_complex.proto:24:29 +desc_test_complex.proto:24:30 + + + > message_type[1] > field[4]: +desc_test_complex.proto:25:9 +desc_test_complex.proto:25:34 + + + > message_type[1] > field[4] > type_name: +desc_test_complex.proto:25:9 +desc_test_complex.proto:25:27 + + + > message_type[1] > field[4] > name: +desc_test_complex.proto:25:28 +desc_test_complex.proto:25:29 + + + > message_type[1] > field[4] > number: +desc_test_complex.proto:25:32 +desc_test_complex.proto:25:33 + + + > message_type[1] > field[5]: +desc_test_complex.proto:27:9 +desc_test_complex.proto:27:67 + + + > message_type[1] > field[5] > label: +desc_test_complex.proto:27:9 +desc_test_complex.proto:27:17 + + + > message_type[1] > field[5] > type: +desc_test_complex.proto:27:18 +desc_test_complex.proto:27:23 + + + > message_type[1] > field[5] > name: +desc_test_complex.proto:27:24 +desc_test_complex.proto:27:25 + + + > message_type[1] > field[5] > number: +desc_test_complex.proto:27:28 +desc_test_complex.proto:27:29 + + + > message_type[1] > field[5] > options: +desc_test_complex.proto:27:30 +desc_test_complex.proto:27:66 + + + > message_type[1] > field[5] > default_value: +desc_test_complex.proto:27:31 +desc_test_complex.proto:27:65 + + + > message_type[1] > extension_range: +desc_test_complex.proto:29:9 +desc_test_complex.proto:29:31 + + + > message_type[1] > extension_range[0]: +desc_test_complex.proto:29:20 +desc_test_complex.proto:29:30 + + + > message_type[1] > extension_range[0] > start: +desc_test_complex.proto:29:20 +desc_test_complex.proto:29:23 + + + > message_type[1] > extension_range[0] > end: +desc_test_complex.proto:29:27 +desc_test_complex.proto:29:30 + + + > message_type[1] > extension_range: +desc_test_complex.proto:31:9 +desc_test_complex.proto:31:62 + + + > message_type[1] > extension_range[1]: +desc_test_complex.proto:31:20 +desc_test_complex.proto:31:30 + + + > message_type[1] > extension_range[1] > start: +desc_test_complex.proto:31:20 +desc_test_complex.proto:31:23 + + + > message_type[1] > extension_range[1] > end: +desc_test_complex.proto:31:27 +desc_test_complex.proto:31:30 + + + > message_type[1] > extension_range[1] > options: +desc_test_complex.proto:31:43 +desc_test_complex.proto:31:61 + + + > message_type[1] > extension_range[1] > options > label: +desc_test_complex.proto:31:44 +desc_test_complex.proto:31:60 + + + > message_type[1] > extension_range[2]: +desc_test_complex.proto:31:32 +desc_test_complex.proto:31:42 + + + > message_type[1] > extension_range[2] > start: +desc_test_complex.proto:31:32 +desc_test_complex.proto:31:35 + + + > message_type[1] > extension_range[2] > end: +desc_test_complex.proto:31:39 +desc_test_complex.proto:31:42 + + + > message_type[1] > extension_range[2] > options: +desc_test_complex.proto:31:43 +desc_test_complex.proto:31:61 + + + > message_type[1] > extension_range[2] > options > label: +desc_test_complex.proto:31:44 +desc_test_complex.proto:31:60 + + + > message_type[1] > nested_type[0]: +desc_test_complex.proto:33:9 +desc_test_complex.proto:58:10 + + + > message_type[1] > nested_type[0] > name: +desc_test_complex.proto:33:17 +desc_test_complex.proto:33:23 + + + > message_type[1] > nested_type[0] > extension: +desc_test_complex.proto:34:17 +desc_test_complex.proto:36:18 + + + > message_type[1] > nested_type[0] > extension[0]: +desc_test_complex.proto:35:25 +desc_test_complex.proto:35:56 + + + > message_type[1] > nested_type[0] > extension[0] !!! > extendee: +desc_test_complex.proto:34:24 +desc_test_complex.proto:34:54 + + + > message_type[1] > nested_type[0] > extension[0] !!! > label: +desc_test_complex.proto:35:25 +desc_test_complex.proto:35:33 + + + > message_type[1] > nested_type[0] > extension[0] !!! > type: +desc_test_complex.proto:35:34 +desc_test_complex.proto:35:39 + + + > message_type[1] > nested_type[0] > extension[0] !!! > name: +desc_test_complex.proto:35:40 +desc_test_complex.proto:35:47 + + + > message_type[1] > nested_type[0] > extension[0] !!! > number: +desc_test_complex.proto:35:50 +desc_test_complex.proto:35:55 + + + > message_type[1] > nested_type[0] > nested_type[0]: +desc_test_complex.proto:37:17 +desc_test_complex.proto:57:18 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > name: +desc_test_complex.proto:37:25 +desc_test_complex.proto:37:38 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0]: +desc_test_complex.proto:38:25 +desc_test_complex.proto:46:26 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > name: +desc_test_complex.proto:38:30 +desc_test_complex.proto:38:33 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[0]: +desc_test_complex.proto:39:33 +desc_test_complex.proto:39:40 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[0] > name: +desc_test_complex.proto:39:33 +desc_test_complex.proto:39:35 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[0] > number: +desc_test_complex.proto:39:38 +desc_test_complex.proto:39:39 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[1]: +desc_test_complex.proto:40:33 +desc_test_complex.proto:40:40 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[1] > name: +desc_test_complex.proto:40:33 +desc_test_complex.proto:40:35 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[1] > number: +desc_test_complex.proto:40:38 +desc_test_complex.proto:40:39 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[2]: +desc_test_complex.proto:41:33 +desc_test_complex.proto:41:40 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[2] > name: +desc_test_complex.proto:41:33 +desc_test_complex.proto:41:35 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[2] > number: +desc_test_complex.proto:41:38 +desc_test_complex.proto:41:39 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[3]: +desc_test_complex.proto:42:33 +desc_test_complex.proto:42:40 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[3] > name: +desc_test_complex.proto:42:33 +desc_test_complex.proto:42:35 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[3] > number: +desc_test_complex.proto:42:38 +desc_test_complex.proto:42:39 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[4]: +desc_test_complex.proto:43:33 +desc_test_complex.proto:43:40 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[4] > name: +desc_test_complex.proto:43:33 +desc_test_complex.proto:43:35 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[4] > number: +desc_test_complex.proto:43:38 +desc_test_complex.proto:43:39 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[5]: +desc_test_complex.proto:44:33 +desc_test_complex.proto:44:40 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[5] > name: +desc_test_complex.proto:44:33 +desc_test_complex.proto:44:35 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[5] > number: +desc_test_complex.proto:44:38 +desc_test_complex.proto:44:39 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[6]: +desc_test_complex.proto:45:33 +desc_test_complex.proto:45:40 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[6] > name: +desc_test_complex.proto:45:33 +desc_test_complex.proto:45:35 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > enum_type[0] > value[6] > number: +desc_test_complex.proto:45:38 +desc_test_complex.proto:45:39 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > options: +desc_test_complex.proto:47:25 +desc_test_complex.proto:47:50 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > options > fooblez: +desc_test_complex.proto:47:25 +desc_test_complex.proto:47:50 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > extension: +desc_test_complex.proto:48:25 +desc_test_complex.proto:50:26 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > extension[0]: +desc_test_complex.proto:49:33 +desc_test_complex.proto:49:64 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > extension[0] > extendee: +desc_test_complex.proto:48:32 +desc_test_complex.proto:48:36 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > extension[0] > label: +desc_test_complex.proto:49:33 +desc_test_complex.proto:49:41 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > extension[0] > type: +desc_test_complex.proto:49:42 +desc_test_complex.proto:49:48 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > extension[0] > name: +desc_test_complex.proto:49:49 +desc_test_complex.proto:49:57 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > extension[0] > number: +desc_test_complex.proto:49:60 +desc_test_complex.proto:49:63 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > options: +desc_test_complex.proto:51:25 +desc_test_complex.proto:51:108 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > options > rept[0]: +desc_test_complex.proto:51:25 +desc_test_complex.proto:51:108 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > nested_type[0]: +desc_test_complex.proto:52:25 +desc_test_complex.proto:56:26 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > nested_type[0] > name: +desc_test_complex.proto:52:33 +desc_test_complex.proto:52:51 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > nested_type[0] > options: +desc_test_complex.proto:53:33 +desc_test_complex.proto:53:109 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > nested_type[0] > options > rept[0]: +desc_test_complex.proto:53:33 +desc_test_complex.proto:53:109 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > nested_type[0] > field[0]: +desc_test_complex.proto:55:33 +desc_test_complex.proto:55:56 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > nested_type[0] > field[0] > label: +desc_test_complex.proto:55:33 +desc_test_complex.proto:55:41 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > nested_type[0] > field[0] > type_name: +desc_test_complex.proto:55:42 +desc_test_complex.proto:55:46 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > nested_type[0] > field[0] > name: +desc_test_complex.proto:55:47 +desc_test_complex.proto:55:51 + + + > message_type[1] > nested_type[0] > nested_type[0] !!! > nested_type[0] > field[0] > number: +desc_test_complex.proto:55:54 +desc_test_complex.proto:55:55 + + + > enum_type[0]: +desc_test_complex.proto:61:1 +desc_test_complex.proto:70:2 + + + > enum_type[0] > name: +desc_test_complex.proto:61:6 +desc_test_complex.proto:61:26 + + + > enum_type[0] > value[0]: +desc_test_complex.proto:62:9 +desc_test_complex.proto:62:15 + + + > enum_type[0] > value[0] > name: +desc_test_complex.proto:62:9 +desc_test_complex.proto:62:10 + + + > enum_type[0] > value[0] > number: +desc_test_complex.proto:62:13 +desc_test_complex.proto:62:14 + + + > enum_type[0] > value[1]: +desc_test_complex.proto:63:9 +desc_test_complex.proto:63:15 + + + > enum_type[0] > value[1] > name: +desc_test_complex.proto:63:9 +desc_test_complex.proto:63:10 + + + > enum_type[0] > value[1] > number: +desc_test_complex.proto:63:13 +desc_test_complex.proto:63:14 + + + > enum_type[0] > value[2]: +desc_test_complex.proto:64:9 +desc_test_complex.proto:64:15 + + + > enum_type[0] > value[2] > name: +desc_test_complex.proto:64:9 +desc_test_complex.proto:64:10 + + + > enum_type[0] > value[2] > number: +desc_test_complex.proto:64:13 +desc_test_complex.proto:64:14 + + + > enum_type[0] > reserved_range: +desc_test_complex.proto:65:9 +desc_test_complex.proto:65:30 + + + > enum_type[0] > reserved_range[0]: +desc_test_complex.proto:65:18 +desc_test_complex.proto:65:29 + + + > enum_type[0] > reserved_range[0] > start: +desc_test_complex.proto:65:18 +desc_test_complex.proto:65:22 + + + > enum_type[0] > reserved_range[0] > end: +desc_test_complex.proto:65:26 +desc_test_complex.proto:65:29 + + + > enum_type[0] > reserved_range: +desc_test_complex.proto:66:9 +desc_test_complex.proto:66:26 + + + > enum_type[0] > reserved_range[1]: +desc_test_complex.proto:66:18 +desc_test_complex.proto:66:25 + + + > enum_type[0] > reserved_range[1] > start: +desc_test_complex.proto:66:18 +desc_test_complex.proto:66:20 + + + > enum_type[0] > reserved_range[1] > end: +desc_test_complex.proto:66:24 +desc_test_complex.proto:66:25 + + + > enum_type[0] > reserved_range: +desc_test_complex.proto:67:9 +desc_test_complex.proto:67:40 + + + > enum_type[0] > reserved_range[2]: +desc_test_complex.proto:67:18 +desc_test_complex.proto:67:25 + + + > enum_type[0] > reserved_range[2] > start: +desc_test_complex.proto:67:18 +desc_test_complex.proto:67:19 + + + > enum_type[0] > reserved_range[2] > end: +desc_test_complex.proto:67:23 +desc_test_complex.proto:67:25 + + + > enum_type[0] > reserved_range[3]: +desc_test_complex.proto:67:27 +desc_test_complex.proto:67:35 + + + > enum_type[0] > reserved_range[3] > start: +desc_test_complex.proto:67:27 +desc_test_complex.proto:67:29 + + + > enum_type[0] > reserved_range[3] > end: +desc_test_complex.proto:67:33 +desc_test_complex.proto:67:35 + + + > enum_type[0] > reserved_range[4]: +desc_test_complex.proto:67:37 +desc_test_complex.proto:67:39 + + + > enum_type[0] > reserved_range[4] > start: +desc_test_complex.proto:67:37 +desc_test_complex.proto:67:39 + + + > enum_type[0] > reserved_range: +desc_test_complex.proto:68:9 +desc_test_complex.proto:68:27 + + + > enum_type[0] > reserved_range[5]: +desc_test_complex.proto:68:18 +desc_test_complex.proto:68:26 + + + > enum_type[0] > reserved_range[5] > start: +desc_test_complex.proto:68:18 +desc_test_complex.proto:68:20 + + + > enum_type[0] > reserved_range[5] > end: +desc_test_complex.proto:68:24 +desc_test_complex.proto:68:26 + + + > enum_type[0] > reserved_name: +desc_test_complex.proto:69:9 +desc_test_complex.proto:69:32 + + + > enum_type[0] > reserved_name[0]: +desc_test_complex.proto:69:18 +desc_test_complex.proto:69:21 + + + > enum_type[0] > reserved_name[1]: +desc_test_complex.proto:69:23 +desc_test_complex.proto:69:26 + + + > enum_type[0] > reserved_name[2]: +desc_test_complex.proto:69:28 +desc_test_complex.proto:69:31 + + + > message_type[2]: +desc_test_complex.proto:72:1 +desc_test_complex.proto:76:2 + + + > message_type[2] > name: +desc_test_complex.proto:72:9 +desc_test_complex.proto:72:32 + + + > message_type[2] > reserved_range: +desc_test_complex.proto:73:9 +desc_test_complex.proto:73:40 + + + > message_type[2] > reserved_range[0]: +desc_test_complex.proto:73:18 +desc_test_complex.proto:73:25 + + + > message_type[2] > reserved_range[0] > start: +desc_test_complex.proto:73:18 +desc_test_complex.proto:73:19 + + + > message_type[2] > reserved_range[0] > end: +desc_test_complex.proto:73:23 +desc_test_complex.proto:73:25 + + + > message_type[2] > reserved_range[1]: +desc_test_complex.proto:73:27 +desc_test_complex.proto:73:35 + + + > message_type[2] > reserved_range[1] > start: +desc_test_complex.proto:73:27 +desc_test_complex.proto:73:29 + + + > message_type[2] > reserved_range[1] > end: +desc_test_complex.proto:73:33 +desc_test_complex.proto:73:35 + + + > message_type[2] > reserved_range[2]: +desc_test_complex.proto:73:37 +desc_test_complex.proto:73:39 + + + > message_type[2] > reserved_range[2] > start: +desc_test_complex.proto:73:37 +desc_test_complex.proto:73:39 + + + > message_type[2] > reserved_range: +desc_test_complex.proto:74:9 +desc_test_complex.proto:74:30 + + + > message_type[2] > reserved_range[3]: +desc_test_complex.proto:74:18 +desc_test_complex.proto:74:29 + + + > message_type[2] > reserved_range[3] > start: +desc_test_complex.proto:74:18 +desc_test_complex.proto:74:22 + + + > message_type[2] > reserved_range[3] > end: +desc_test_complex.proto:74:26 +desc_test_complex.proto:74:29 + + + > message_type[2] > reserved_name: +desc_test_complex.proto:75:9 +desc_test_complex.proto:75:32 + + + > message_type[2] > reserved_name[0]: +desc_test_complex.proto:75:18 +desc_test_complex.proto:75:21 + + + > message_type[2] > reserved_name[1]: +desc_test_complex.proto:75:23 +desc_test_complex.proto:75:26 + + + > message_type[2] > reserved_name[2]: +desc_test_complex.proto:75:28 +desc_test_complex.proto:75:31 + + + > extension: +desc_test_complex.proto:78:1 +desc_test_complex.proto:82:2 + + + > extension[1]: +desc_test_complex.proto:79:9 +desc_test_complex.proto:79:36 + + + > extension[1] > extendee: +desc_test_complex.proto:78:8 +desc_test_complex.proto:78:38 + + + > extension[1] > label: +desc_test_complex.proto:79:9 +desc_test_complex.proto:79:17 + + + > extension[1] > type_name: +desc_test_complex.proto:79:18 +desc_test_complex.proto:79:22 + + + > extension[1] > name: +desc_test_complex.proto:79:23 +desc_test_complex.proto:79:27 + + + > extension[1] > number: +desc_test_complex.proto:79:30 +desc_test_complex.proto:79:35 + + + > extension[2]: +desc_test_complex.proto:80:9 +desc_test_complex.proto:80:60 + + + > extension[2] > extendee: +desc_test_complex.proto:78:8 +desc_test_complex.proto:78:38 + + + > extension[2] > label: +desc_test_complex.proto:80:9 +desc_test_complex.proto:80:17 + + + > extension[2] > type_name: +desc_test_complex.proto:80:18 +desc_test_complex.proto:80:47 + + + > extension[2] > name: +desc_test_complex.proto:80:48 +desc_test_complex.proto:80:51 + + + > extension[2] > number: +desc_test_complex.proto:80:54 +desc_test_complex.proto:80:59 + + + > extension[3]: +desc_test_complex.proto:81:9 +desc_test_complex.proto:81:36 + + + > extension[3] > extendee: +desc_test_complex.proto:78:8 +desc_test_complex.proto:78:38 + + + > extension[3] > label: +desc_test_complex.proto:81:9 +desc_test_complex.proto:81:17 + + + > extension[3] > type_name: +desc_test_complex.proto:81:18 +desc_test_complex.proto:81:25 + + + > extension[3] > name: +desc_test_complex.proto:81:26 +desc_test_complex.proto:81:27 + + + > extension[3] > number: +desc_test_complex.proto:81:30 +desc_test_complex.proto:81:35 + + + > message_type[3]: +desc_test_complex.proto:84:1 +desc_test_complex.proto:100:2 + + + > message_type[3] > name: +desc_test_complex.proto:84:9 +desc_test_complex.proto:84:16 + + + > message_type[3] > options: +desc_test_complex.proto:85:5 +desc_test_complex.proto:85:130 + + + > message_type[3] > options > rept[0]: +desc_test_complex.proto:85:5 +desc_test_complex.proto:85:130 + + + > message_type[3] > options: +desc_test_complex.proto:86:5 +desc_test_complex.proto:86:115 + + + > message_type[3] > options > rept[1]: +desc_test_complex.proto:86:5 +desc_test_complex.proto:86:115 + + + > message_type[3] > options: +desc_test_complex.proto:87:5 +desc_test_complex.proto:87:36 + + + > message_type[3] > options > rept[2]: +desc_test_complex.proto:87:5 +desc_test_complex.proto:87:36 + + + > message_type[3] > options: +desc_test_complex.proto:88:5 +desc_test_complex.proto:88:23 + + + > message_type[3] > options > eee: +desc_test_complex.proto:88:5 +desc_test_complex.proto:88:23 + + + > message_type[3] > options: +desc_test_complex.proto:89:9 +desc_test_complex.proto:89:34 + + + > message_type[3] > options > a: +desc_test_complex.proto:89:9 +desc_test_complex.proto:89:34 + + + > message_type[3] > options: +desc_test_complex.proto:90:9 +desc_test_complex.proto:90:86 + + + > message_type[3] > options > a > test: +desc_test_complex.proto:90:9 +desc_test_complex.proto:90:86 + + + > message_type[3] > options: +desc_test_complex.proto:91:9 +desc_test_complex.proto:91:37 + + + > message_type[3] > options > a > test > foo: +desc_test_complex.proto:91:9 +desc_test_complex.proto:91:37 + + + > message_type[3] > options: +desc_test_complex.proto:92:9 +desc_test_complex.proto:92:41 + + + > message_type[3] > options > a > test > s > name: +desc_test_complex.proto:92:9 +desc_test_complex.proto:92:41 + + + > message_type[3] > options: +desc_test_complex.proto:93:5 +desc_test_complex.proto:93:34 + + + > message_type[3] > options > a > test > s > id: +desc_test_complex.proto:93:5 +desc_test_complex.proto:93:34 + + + > message_type[3] > options: +desc_test_complex.proto:94:5 +desc_test_complex.proto:94:31 + + + > message_type[3] > options > a > test > array[0]: +desc_test_complex.proto:94:5 +desc_test_complex.proto:94:31 + + + > message_type[3] > options: +desc_test_complex.proto:95:5 +desc_test_complex.proto:95:31 + + + > message_type[3] > options > a > test > array[1]: +desc_test_complex.proto:95:5 +desc_test_complex.proto:95:31 + + + > message_type[3] > options: +desc_test_complex.proto:96:5 +desc_test_complex.proto:96:78 + + + > message_type[3] > options > a > test > _garblez: +desc_test_complex.proto:96:5 +desc_test_complex.proto:96:78 + + + > message_type[3] > field[0]: +desc_test_complex.proto:98:5 +desc_test_complex.proto:98:28 + + + > message_type[3] > field[0] > label: +desc_test_complex.proto:98:5 +desc_test_complex.proto:98:13 + + + > message_type[3] > field[0] > type_name: +desc_test_complex.proto:98:14 +desc_test_complex.proto:98:18 + + + > message_type[3] > field[0] > name: +desc_test_complex.proto:98:19 +desc_test_complex.proto:98:23 + + + > message_type[3] > field[0] > number: +desc_test_complex.proto:98:26 +desc_test_complex.proto:98:27 + + + > message_type[3] > field[1]: +desc_test_complex.proto:99:5 +desc_test_complex.proto:99:67 + + + > message_type[3] > field[1] > label: +desc_test_complex.proto:99:5 +desc_test_complex.proto:99:13 + + + > message_type[3] > field[1] > type_name: +desc_test_complex.proto:99:14 +desc_test_complex.proto:99:43 + + + > message_type[3] > field[1] > name: +desc_test_complex.proto:99:44 +desc_test_complex.proto:99:47 + + + > message_type[3] > field[1] > number: +desc_test_complex.proto:99:50 +desc_test_complex.proto:99:51 + + + > message_type[3] > field[1] > options: +desc_test_complex.proto:99:52 +desc_test_complex.proto:99:66 + + + > message_type[3] > field[1] > default_value: +desc_test_complex.proto:99:53 +desc_test_complex.proto:99:65 + + + > message_type[4]: +desc_test_complex.proto:102:1 +desc_test_complex.proto:116:2 + + + > message_type[4] > name: +desc_test_complex.proto:102:9 +desc_test_complex.proto:102:18 + + + > message_type[4] > field[0]: +desc_test_complex.proto:103:9 +desc_test_complex.proto:103:41 + + + > message_type[4] > field[0] > label: +desc_test_complex.proto:103:9 +desc_test_complex.proto:103:17 + + + > message_type[4] > field[0] > type: +desc_test_complex.proto:103:18 +desc_test_complex.proto:103:22 + + + > message_type[4] > field[0] > name: +desc_test_complex.proto:103:23 +desc_test_complex.proto:103:36 + + + > message_type[4] > field[0] > number: +desc_test_complex.proto:103:39 +desc_test_complex.proto:103:40 + + + > message_type[4] > enum_type[0]: +desc_test_complex.proto:105:9 +desc_test_complex.proto:109:10 + + + > message_type[4] > enum_type[0] > name: +desc_test_complex.proto:105:14 +desc_test_complex.proto:105:20 + + + > message_type[4] > enum_type[0] > value[0]: +desc_test_complex.proto:106:17 +desc_test_complex.proto:106:27 + + + > message_type[4] > enum_type[0] > value[0] > name: +desc_test_complex.proto:106:17 +desc_test_complex.proto:106:22 + + + > message_type[4] > enum_type[0] > value[0] > number: +desc_test_complex.proto:106:25 +desc_test_complex.proto:106:26 + + + > message_type[4] > enum_type[0] > value[1]: +desc_test_complex.proto:107:17 +desc_test_complex.proto:107:26 + + + > message_type[4] > enum_type[0] > value[1] > name: +desc_test_complex.proto:107:17 +desc_test_complex.proto:107:21 + + + > message_type[4] > enum_type[0] > value[1] > number: +desc_test_complex.proto:107:24 +desc_test_complex.proto:107:25 + + + > message_type[4] > enum_type[0] > value[2]: +desc_test_complex.proto:108:17 +desc_test_complex.proto:108:27 + + + > message_type[4] > enum_type[0] > value[2] > name: +desc_test_complex.proto:108:17 +desc_test_complex.proto:108:22 + + + > message_type[4] > enum_type[0] > value[2] > number: +desc_test_complex.proto:108:25 +desc_test_complex.proto:108:26 + + + > message_type[4] > nested_type[0]: +desc_test_complex.proto:110:9 +desc_test_complex.proto:113:10 + + + > message_type[4] > nested_type[0] > name: +desc_test_complex.proto:110:17 +desc_test_complex.proto:110:27 + + + > message_type[4] > nested_type[0] > field[0]: +desc_test_complex.proto:111:17 +desc_test_complex.proto:111:44 + + + > message_type[4] > nested_type[0] > field[0] > label: +desc_test_complex.proto:111:17 +desc_test_complex.proto:111:25 + + + > message_type[4] > nested_type[0] > field[0] > type_name: +desc_test_complex.proto:111:26 +desc_test_complex.proto:111:32 + + + > message_type[4] > nested_type[0] > field[0] > name: +desc_test_complex.proto:111:33 +desc_test_complex.proto:111:39 + + + > message_type[4] > nested_type[0] > field[0] > number: +desc_test_complex.proto:111:42 +desc_test_complex.proto:111:43 + + + > message_type[4] > nested_type[0] > field[1]: +desc_test_complex.proto:112:17 +desc_test_complex.proto:112:44 + + + > message_type[4] > nested_type[0] > field[1] > label: +desc_test_complex.proto:112:17 +desc_test_complex.proto:112:25 + + + > message_type[4] > nested_type[0] > field[1] > type: +desc_test_complex.proto:112:26 +desc_test_complex.proto:112:32 + + + > message_type[4] > nested_type[0] > field[1] > name: +desc_test_complex.proto:112:33 +desc_test_complex.proto:112:39 + + + > message_type[4] > nested_type[0] > field[1] > number: +desc_test_complex.proto:112:42 +desc_test_complex.proto:112:43 + + + > message_type[4] > field[1]: +desc_test_complex.proto:115:9 +desc_test_complex.proto:115:44 + + + > message_type[4] > field[1] > label: +desc_test_complex.proto:115:9 +desc_test_complex.proto:115:17 + + + > message_type[4] > field[1] > type_name: +desc_test_complex.proto:115:18 +desc_test_complex.proto:115:28 + + + > message_type[4] > field[1] > name: +desc_test_complex.proto:115:29 +desc_test_complex.proto:115:39 + + + > message_type[4] > field[1] > number: +desc_test_complex.proto:115:42 +desc_test_complex.proto:115:43 + + + > extension: +desc_test_complex.proto:118:1 +desc_test_complex.proto:120:2 + + + > extension[4]: +desc_test_complex.proto:119:9 +desc_test_complex.proto:119:46 + + + > extension[4] > extendee: +desc_test_complex.proto:118:8 +desc_test_complex.proto:118:37 + + + > extension[4] > label: +desc_test_complex.proto:119:9 +desc_test_complex.proto:119:17 + + + > extension[4] > type_name: +desc_test_complex.proto:119:18 +desc_test_complex.proto:119:27 + + + > extension[4] > name: +desc_test_complex.proto:119:28 +desc_test_complex.proto:119:37 + + + > extension[4] > number: +desc_test_complex.proto:119:40 +desc_test_complex.proto:119:45 + + + > service[0]: +desc_test_complex.proto:122:1 +desc_test_complex.proto:141:2 + + + > service[0] > name: +desc_test_complex.proto:122:9 +desc_test_complex.proto:122:24 + + + > service[0] > method[0]: +desc_test_complex.proto:123:9 +desc_test_complex.proto:131:10 + + + > service[0] > method[0] > name: +desc_test_complex.proto:123:13 +desc_test_complex.proto:123:21 + + + > service[0] > method[0] > input_type: +desc_test_complex.proto:123:22 +desc_test_complex.proto:123:26 + + + > service[0] > method[0] > output_type: +desc_test_complex.proto:123:37 +desc_test_complex.proto:123:41 + + + > service[0] > method[0] > options: +desc_test_complex.proto:124:17 +desc_test_complex.proto:130:19 + + + > service[0] > method[0] > options > validator: +desc_test_complex.proto:124:17 +desc_test_complex.proto:130:19 + + + > service[0] > method[1]: +desc_test_complex.proto:132:9 +desc_test_complex.proto:140:10 + + + > service[0] > method[1] > name: +desc_test_complex.proto:132:13 +desc_test_complex.proto:132:16 + + + > service[0] > method[1] > input_type: +desc_test_complex.proto:132:17 +desc_test_complex.proto:132:21 + + + > service[0] > method[1] > output_type: +desc_test_complex.proto:132:32 +desc_test_complex.proto:132:36 + + + > service[0] > method[1] > options: +desc_test_complex.proto:133:17 +desc_test_complex.proto:139:19 + + + > service[0] > method[1] > options > validator: +desc_test_complex.proto:133:17 +desc_test_complex.proto:139:19 + + + > message_type[5]: +desc_test_complex.proto:143:1 +desc_test_complex.proto:169:2 + + + > message_type[5] > name: +desc_test_complex.proto:143:9 +desc_test_complex.proto:143:13 + + + > message_type[5] > nested_type[0]: +desc_test_complex.proto:144:3 +desc_test_complex.proto:149:4 + + + > message_type[5] > nested_type[0] > name: +desc_test_complex.proto:144:11 +desc_test_complex.proto:144:21 + + + > message_type[5] > nested_type[0] > field[0]: +desc_test_complex.proto:145:5 +desc_test_complex.proto:145:33 + + + > message_type[5] > nested_type[0] > field[0] > label: +desc_test_complex.proto:145:5 +desc_test_complex.proto:145:13 + + + > message_type[5] > nested_type[0] > field[0] > type: +desc_test_complex.proto:145:14 +desc_test_complex.proto:145:20 + + + > message_type[5] > nested_type[0] > field[0] > name: +desc_test_complex.proto:145:21 +desc_test_complex.proto:145:28 + + + > message_type[5] > nested_type[0] > field[0] > number: +desc_test_complex.proto:145:31 +desc_test_complex.proto:145:32 + + + > message_type[5] > nested_type[0] > field[1]: +desc_test_complex.proto:146:5 +desc_test_complex.proto:146:35 + + + > message_type[5] > nested_type[0] > field[1] > label: +desc_test_complex.proto:146:5 +desc_test_complex.proto:146:13 + + + > message_type[5] > nested_type[0] > field[1] > type: +desc_test_complex.proto:146:14 +desc_test_complex.proto:146:18 + + + > message_type[5] > nested_type[0] > field[1] > name: +desc_test_complex.proto:146:19 +desc_test_complex.proto:146:30 + + + > message_type[5] > nested_type[0] > field[1] > number: +desc_test_complex.proto:146:33 +desc_test_complex.proto:146:34 + + + > message_type[5] > nested_type[0] > field[2]: +desc_test_complex.proto:147:5 +desc_test_complex.proto:147:32 + + + > message_type[5] > nested_type[0] > field[2] > label: +desc_test_complex.proto:147:5 +desc_test_complex.proto:147:13 + + + > message_type[5] > nested_type[0] > field[2] > type: +desc_test_complex.proto:147:14 +desc_test_complex.proto:147:19 + + + > message_type[5] > nested_type[0] > field[2] > name: +desc_test_complex.proto:147:20 +desc_test_complex.proto:147:27 + + + > message_type[5] > nested_type[0] > field[2] > number: +desc_test_complex.proto:147:30 +desc_test_complex.proto:147:31 + + + > message_type[5] > nested_type[0] > field[3]: +desc_test_complex.proto:148:5 +desc_test_complex.proto:148:32 + + + > message_type[5] > nested_type[0] > field[3] > label: +desc_test_complex.proto:148:5 +desc_test_complex.proto:148:13 + + + > message_type[5] > nested_type[0] > field[3] > type: +desc_test_complex.proto:148:14 +desc_test_complex.proto:148:19 + + + > message_type[5] > nested_type[0] > field[3] > name: +desc_test_complex.proto:148:20 +desc_test_complex.proto:148:27 + + + > message_type[5] > nested_type[0] > field[3] > number: +desc_test_complex.proto:148:30 +desc_test_complex.proto:148:31 + + + > message_type[5] > nested_type[1]: +desc_test_complex.proto:150:3 +desc_test_complex.proto:153:4 + + + > message_type[5] > nested_type[1] > name: +desc_test_complex.proto:150:11 +desc_test_complex.proto:150:18 + + + > message_type[5] > nested_type[1] > field[0]: +desc_test_complex.proto:151:5 +desc_test_complex.proto:151:32 + + + > message_type[5] > nested_type[1] > field[0] > label: +desc_test_complex.proto:151:5 +desc_test_complex.proto:151:13 + + + > message_type[5] > nested_type[1] > field[0] > type: +desc_test_complex.proto:151:14 +desc_test_complex.proto:151:19 + + + > message_type[5] > nested_type[1] > field[0] > name: +desc_test_complex.proto:151:20 +desc_test_complex.proto:151:27 + + + > message_type[5] > nested_type[1] > field[0] > number: +desc_test_complex.proto:151:30 +desc_test_complex.proto:151:31 + + + > message_type[5] > nested_type[1] > field[1]: +desc_test_complex.proto:152:5 +desc_test_complex.proto:152:33 + + + > message_type[5] > nested_type[1] > field[1] > label: +desc_test_complex.proto:152:5 +desc_test_complex.proto:152:13 + + + > message_type[5] > nested_type[1] > field[1] > type: +desc_test_complex.proto:152:14 +desc_test_complex.proto:152:20 + + + > message_type[5] > nested_type[1] > field[1] > name: +desc_test_complex.proto:152:21 +desc_test_complex.proto:152:28 + + + > message_type[5] > nested_type[1] > field[1] > number: +desc_test_complex.proto:152:31 +desc_test_complex.proto:152:32 + + + > message_type[5] > nested_type[2]: +desc_test_complex.proto:154:3 +desc_test_complex.proto:159:4 + + + > message_type[5] > nested_type[2] > name: +desc_test_complex.proto:154:11 +desc_test_complex.proto:154:23 + + + > message_type[5] > nested_type[2] > field[0]: +desc_test_complex.proto:155:5 +desc_test_complex.proto:155:35 + + + > message_type[5] > nested_type[2] > field[0] > label: +desc_test_complex.proto:155:5 +desc_test_complex.proto:155:13 + + + > message_type[5] > nested_type[2] > field[0] > type: +desc_test_complex.proto:155:14 +desc_test_complex.proto:155:18 + + + > message_type[5] > nested_type[2] > field[0] > name: +desc_test_complex.proto:155:19 +desc_test_complex.proto:155:30 + + + > message_type[5] > nested_type[2] > field[0] > number: +desc_test_complex.proto:155:33 +desc_test_complex.proto:155:34 + + + > message_type[5] > nested_type[2] > field[1]: +desc_test_complex.proto:156:5 +desc_test_complex.proto:156:34 + + + > message_type[5] > nested_type[2] > field[1] > label: +desc_test_complex.proto:156:5 +desc_test_complex.proto:156:13 + + + > message_type[5] > nested_type[2] > field[1] > type: +desc_test_complex.proto:156:14 +desc_test_complex.proto:156:19 + + + > message_type[5] > nested_type[2] > field[1] > name: +desc_test_complex.proto:156:20 +desc_test_complex.proto:156:29 + + + > message_type[5] > nested_type[2] > field[1] > number: +desc_test_complex.proto:156:32 +desc_test_complex.proto:156:33 + + + > message_type[5] > nested_type[2] > field[2]: +desc_test_complex.proto:157:5 +desc_test_complex.proto:157:34 + + + > message_type[5] > nested_type[2] > field[2] > label: +desc_test_complex.proto:157:5 +desc_test_complex.proto:157:13 + + + > message_type[5] > nested_type[2] > field[2] > type: +desc_test_complex.proto:157:14 +desc_test_complex.proto:157:19 + + + > message_type[5] > nested_type[2] > field[2] > name: +desc_test_complex.proto:157:20 +desc_test_complex.proto:157:29 + + + > message_type[5] > nested_type[2] > field[2] > number: +desc_test_complex.proto:157:32 +desc_test_complex.proto:157:33 + + + > message_type[5] > nested_type[2] > field[3]: +desc_test_complex.proto:158:5 +desc_test_complex.proto:158:29 + + + > message_type[5] > nested_type[2] > field[3] > label: +desc_test_complex.proto:158:5 +desc_test_complex.proto:158:13 + + + > message_type[5] > nested_type[2] > field[3] > type_name: +desc_test_complex.proto:158:14 +desc_test_complex.proto:158:18 + + + > message_type[5] > nested_type[2] > field[3] > name: +desc_test_complex.proto:158:19 +desc_test_complex.proto:158:24 + + + > message_type[5] > nested_type[2] > field[3] > number: +desc_test_complex.proto:158:27 +desc_test_complex.proto:158:28 + + + > message_type[5] > oneof_decl[0]: +desc_test_complex.proto:160:3 +desc_test_complex.proto:168:4 + + + > message_type[5] > oneof_decl[0] > name: +desc_test_complex.proto:160:9 +desc_test_complex.proto:160:13 + + + > message_type[5] > field[0]: +desc_test_complex.proto:161:5 +desc_test_complex.proto:161:27 + + + > message_type[5] > field[0] > type_name: +desc_test_complex.proto:161:5 +desc_test_complex.proto:161:15 + + + > message_type[5] > field[0] > name: +desc_test_complex.proto:161:16 +desc_test_complex.proto:161:22 + + + > message_type[5] > field[0] > number: +desc_test_complex.proto:161:25 +desc_test_complex.proto:161:26 + + + > message_type[5] > field[1]: +desc_test_complex.proto:162:5 +desc_test_complex.proto:162:31 + + + > message_type[5] > field[1] > type_name: +desc_test_complex.proto:162:5 +desc_test_complex.proto:162:17 + + + > message_type[5] > field[1] > name: +desc_test_complex.proto:162:18 +desc_test_complex.proto:162:26 + + + > message_type[5] > field[1] > number: +desc_test_complex.proto:162:29 +desc_test_complex.proto:162:30 + + + > message_type[5] > field[2]: +desc_test_complex.proto:163:5 +desc_test_complex.proto:163:21 + + + > message_type[5] > field[2] > type_name: +desc_test_complex.proto:163:5 +desc_test_complex.proto:163:12 + + + > message_type[5] > field[2] > name: +desc_test_complex.proto:163:13 +desc_test_complex.proto:163:16 + + + > message_type[5] > field[2] > number: +desc_test_complex.proto:163:19 +desc_test_complex.proto:163:20 + + + > message_type[5] > field[3]: +desc_test_complex.proto:164:9 +desc_test_complex.proto:167:10 + + + > message_type[5] > field[3] > type: +desc_test_complex.proto:164:9 +desc_test_complex.proto:164:14 + + + > message_type[5] > field[3] > name: +desc_test_complex.proto:164:15 +desc_test_complex.proto:164:24 + + + > message_type[5] > field[3] > number: +desc_test_complex.proto:164:27 +desc_test_complex.proto:164:28 + + + > message_type[5] > nested_type[3]: +desc_test_complex.proto:164:9 +desc_test_complex.proto:167:10 + + + > message_type[5] > nested_type[3] > name: +desc_test_complex.proto:164:15 +desc_test_complex.proto:164:24 + + + > message_type[5] > field[3] > type_name: +desc_test_complex.proto:164:15 +desc_test_complex.proto:164:24 + + + > message_type[5] > nested_type[3] > field[0]: +desc_test_complex.proto:165:17 +desc_test_complex.proto:165:45 + + + > message_type[5] > nested_type[3] > field[0] > label: +desc_test_complex.proto:165:17 +desc_test_complex.proto:165:25 + + + > message_type[5] > nested_type[3] > field[0] > type: +desc_test_complex.proto:165:26 +desc_test_complex.proto:165:32 + + + > message_type[5] > nested_type[3] > field[0] > name: +desc_test_complex.proto:165:33 +desc_test_complex.proto:165:40 + + + > message_type[5] > nested_type[3] > field[0] > number: +desc_test_complex.proto:165:43 +desc_test_complex.proto:165:44 + + + > message_type[5] > nested_type[3] > field[1]: +desc_test_complex.proto:166:17 +desc_test_complex.proto:166:45 + + + > message_type[5] > nested_type[3] > field[1] > label: +desc_test_complex.proto:166:17 +desc_test_complex.proto:166:25 + + + > message_type[5] > nested_type[3] > field[1] > type: +desc_test_complex.proto:166:26 +desc_test_complex.proto:166:32 + + + > message_type[5] > nested_type[3] > field[1] > name: +desc_test_complex.proto:166:33 +desc_test_complex.proto:166:40 + + + > message_type[5] > nested_type[3] > field[1] > number: +desc_test_complex.proto:166:43 +desc_test_complex.proto:166:44 + + + > extension: +desc_test_complex.proto:171:1 +desc_test_complex.proto:173:2 + + + > extension[5]: +desc_test_complex.proto:172:3 +desc_test_complex.proto:172:30 + + + > extension[5] > extendee: +desc_test_complex.proto:171:8 +desc_test_complex.proto:171:36 + + + > extension[5] > label: +desc_test_complex.proto:172:3 +desc_test_complex.proto:172:11 + + + > extension[5] > type_name: +desc_test_complex.proto:172:12 +desc_test_complex.proto:172:16 + + + > extension[5] > name: +desc_test_complex.proto:172:17 +desc_test_complex.proto:172:22 + + + > extension[5] > number: +desc_test_complex.proto:172:25 +desc_test_complex.proto:172:29 + + + > message_type[6]: +desc_test_complex.proto:175:1 +desc_test_complex.proto:181:2 + + + > message_type[6] > name: +desc_test_complex.proto:175:9 +desc_test_complex.proto:175:24 + + + > message_type[6] > field[0]: +desc_test_complex.proto:176:5 +desc_test_complex.proto:180:11 + + + > message_type[6] > field[0] > label: +desc_test_complex.proto:176:5 +desc_test_complex.proto:176:13 + + + > message_type[6] > field[0] > type: +desc_test_complex.proto:176:14 +desc_test_complex.proto:176:20 + + + > message_type[6] > field[0] > name: +desc_test_complex.proto:176:21 +desc_test_complex.proto:176:29 + + + > message_type[6] > field[0] > number: +desc_test_complex.proto:176:32 +desc_test_complex.proto:176:33 + + + > message_type[6] > field[0] > options: +desc_test_complex.proto:177:7 +desc_test_complex.proto:180:10 + + + > message_type[6] > field[0] > options > rules > repeated: +desc_test_complex.proto:177:8 +desc_test_complex.proto:180:9 + + + > message_type[7]: +desc_test_complex.proto:185:1 +desc_test_complex.proto:221:2 + Leading detached comment [0]: + tests cases where field names collide with keywords + + + + > message_type[7] > name: +desc_test_complex.proto:185:9 +desc_test_complex.proto:185:26 + + + > message_type[7] > field[0]: +desc_test_complex.proto:186:9 +desc_test_complex.proto:186:34 + + + > message_type[7] > field[0] > label: +desc_test_complex.proto:186:9 +desc_test_complex.proto:186:17 + + + > message_type[7] > field[0] > type: +desc_test_complex.proto:186:18 +desc_test_complex.proto:186:22 + + + > message_type[7] > field[0] > name: +desc_test_complex.proto:186:23 +desc_test_complex.proto:186:29 + + + > message_type[7] > field[0] > number: +desc_test_complex.proto:186:32 +desc_test_complex.proto:186:33 + + + > message_type[7] > field[1]: +desc_test_complex.proto:187:9 +desc_test_complex.proto:187:34 + + + > message_type[7] > field[1] > label: +desc_test_complex.proto:187:9 +desc_test_complex.proto:187:17 + + + > message_type[7] > field[1] > type: +desc_test_complex.proto:187:18 +desc_test_complex.proto:187:22 + + + > message_type[7] > field[1] > name: +desc_test_complex.proto:187:23 +desc_test_complex.proto:187:29 + + + > message_type[7] > field[1] > number: +desc_test_complex.proto:187:32 +desc_test_complex.proto:187:33 + + + > message_type[7] > field[2]: +desc_test_complex.proto:188:9 +desc_test_complex.proto:188:34 + + + > message_type[7] > field[2] > label: +desc_test_complex.proto:188:9 +desc_test_complex.proto:188:17 + + + > message_type[7] > field[2] > type: +desc_test_complex.proto:188:18 +desc_test_complex.proto:188:22 + + + > message_type[7] > field[2] > name: +desc_test_complex.proto:188:23 +desc_test_complex.proto:188:29 + + + > message_type[7] > field[2] > number: +desc_test_complex.proto:188:32 +desc_test_complex.proto:188:33 + + + > message_type[7] > field[3]: +desc_test_complex.proto:189:9 +desc_test_complex.proto:189:32 + + + > message_type[7] > field[3] > label: +desc_test_complex.proto:189:9 +desc_test_complex.proto:189:17 + + + > message_type[7] > field[3] > type: +desc_test_complex.proto:189:18 +desc_test_complex.proto:189:22 + + + > message_type[7] > field[3] > name: +desc_test_complex.proto:189:23 +desc_test_complex.proto:189:27 + + + > message_type[7] > field[3] > number: +desc_test_complex.proto:189:30 +desc_test_complex.proto:189:31 + + + > message_type[7] > field[4]: +desc_test_complex.proto:190:9 +desc_test_complex.proto:190:35 + + + > message_type[7] > field[4] > label: +desc_test_complex.proto:190:9 +desc_test_complex.proto:190:17 + + + > message_type[7] > field[4] > type: +desc_test_complex.proto:190:18 +desc_test_complex.proto:190:22 + + + > message_type[7] > field[4] > name: +desc_test_complex.proto:190:23 +desc_test_complex.proto:190:30 + + + > message_type[7] > field[4] > number: +desc_test_complex.proto:190:33 +desc_test_complex.proto:190:34 + + + > message_type[7] > field[5]: +desc_test_complex.proto:191:9 +desc_test_complex.proto:191:36 + + + > message_type[7] > field[5] > label: +desc_test_complex.proto:191:9 +desc_test_complex.proto:191:17 + + + > message_type[7] > field[5] > type: +desc_test_complex.proto:191:18 +desc_test_complex.proto:191:24 + + + > message_type[7] > field[5] > name: +desc_test_complex.proto:191:25 +desc_test_complex.proto:191:31 + + + > message_type[7] > field[5] > number: +desc_test_complex.proto:191:34 +desc_test_complex.proto:191:35 + + + > message_type[7] > field[6]: +desc_test_complex.proto:192:9 +desc_test_complex.proto:192:34 + + + > message_type[7] > field[6] > label: +desc_test_complex.proto:192:9 +desc_test_complex.proto:192:17 + + + > message_type[7] > field[6] > type: +desc_test_complex.proto:192:18 +desc_test_complex.proto:192:23 + + + > message_type[7] > field[6] > name: +desc_test_complex.proto:192:24 +desc_test_complex.proto:192:29 + + + > message_type[7] > field[6] > number: +desc_test_complex.proto:192:32 +desc_test_complex.proto:192:33 + + + > message_type[7] > field[7]: +desc_test_complex.proto:193:9 +desc_test_complex.proto:193:34 + + + > message_type[7] > field[7] > label: +desc_test_complex.proto:193:9 +desc_test_complex.proto:193:17 + + + > message_type[7] > field[7] > type: +desc_test_complex.proto:193:18 +desc_test_complex.proto:193:23 + + + > message_type[7] > field[7] > name: +desc_test_complex.proto:193:24 +desc_test_complex.proto:193:29 + + + > message_type[7] > field[7] > number: +desc_test_complex.proto:193:32 +desc_test_complex.proto:193:33 + + + > message_type[7] > field[8]: +desc_test_complex.proto:194:9 +desc_test_complex.proto:194:34 + + + > message_type[7] > field[8] > label: +desc_test_complex.proto:194:9 +desc_test_complex.proto:194:17 + + + > message_type[7] > field[8] > type: +desc_test_complex.proto:194:18 +desc_test_complex.proto:194:23 + + + > message_type[7] > field[8] > name: +desc_test_complex.proto:194:24 +desc_test_complex.proto:194:29 + + + > message_type[7] > field[8] > number: +desc_test_complex.proto:194:32 +desc_test_complex.proto:194:33 + + + > message_type[7] > field[9]: +desc_test_complex.proto:195:9 +desc_test_complex.proto:195:37 + + + > message_type[7] > field[9] > label: +desc_test_complex.proto:195:9 +desc_test_complex.proto:195:17 + + + > message_type[7] > field[9] > type: +desc_test_complex.proto:195:18 +desc_test_complex.proto:195:24 + + + > message_type[7] > field[9] > name: +desc_test_complex.proto:195:25 +desc_test_complex.proto:195:31 + + + > message_type[7] > field[9] > number: +desc_test_complex.proto:195:34 +desc_test_complex.proto:195:36 + + + > message_type[7] > field[10]: +desc_test_complex.proto:196:9 +desc_test_complex.proto:196:37 + + + > message_type[7] > field[10] > label: +desc_test_complex.proto:196:9 +desc_test_complex.proto:196:17 + + + > message_type[7] > field[10] > type: +desc_test_complex.proto:196:18 +desc_test_complex.proto:196:24 + + + > message_type[7] > field[10] > name: +desc_test_complex.proto:196:25 +desc_test_complex.proto:196:31 + + + > message_type[7] > field[10] > number: +desc_test_complex.proto:196:34 +desc_test_complex.proto:196:36 + + + > message_type[7] > field[11]: +desc_test_complex.proto:197:9 +desc_test_complex.proto:197:37 + + + > message_type[7] > field[11] > label: +desc_test_complex.proto:197:9 +desc_test_complex.proto:197:17 + + + > message_type[7] > field[11] > type: +desc_test_complex.proto:197:18 +desc_test_complex.proto:197:24 + + + > message_type[7] > field[11] > name: +desc_test_complex.proto:197:25 +desc_test_complex.proto:197:31 + + + > message_type[7] > field[11] > number: +desc_test_complex.proto:197:34 +desc_test_complex.proto:197:36 + + + > message_type[7] > field[12]: +desc_test_complex.proto:198:9 +desc_test_complex.proto:198:37 + + + > message_type[7] > field[12] > label: +desc_test_complex.proto:198:9 +desc_test_complex.proto:198:17 + + + > message_type[7] > field[12] > type: +desc_test_complex.proto:198:18 +desc_test_complex.proto:198:24 + + + > message_type[7] > field[12] > name: +desc_test_complex.proto:198:25 +desc_test_complex.proto:198:31 + + + > message_type[7] > field[12] > number: +desc_test_complex.proto:198:34 +desc_test_complex.proto:198:36 + + + > message_type[7] > field[13]: +desc_test_complex.proto:199:9 +desc_test_complex.proto:199:39 + + + > message_type[7] > field[13] > label: +desc_test_complex.proto:199:9 +desc_test_complex.proto:199:17 + + + > message_type[7] > field[13] > type: +desc_test_complex.proto:199:18 +desc_test_complex.proto:199:25 + + + > message_type[7] > field[13] > name: +desc_test_complex.proto:199:26 +desc_test_complex.proto:199:33 + + + > message_type[7] > field[13] > number: +desc_test_complex.proto:199:36 +desc_test_complex.proto:199:38 + + + > message_type[7] > field[14]: +desc_test_complex.proto:200:9 +desc_test_complex.proto:200:39 + + + > message_type[7] > field[14] > label: +desc_test_complex.proto:200:9 +desc_test_complex.proto:200:17 + + + > message_type[7] > field[14] > type: +desc_test_complex.proto:200:18 +desc_test_complex.proto:200:25 + + + > message_type[7] > field[14] > name: +desc_test_complex.proto:200:26 +desc_test_complex.proto:200:33 + + + > message_type[7] > field[14] > number: +desc_test_complex.proto:200:36 +desc_test_complex.proto:200:38 + + + > message_type[7] > field[15]: +desc_test_complex.proto:201:9 +desc_test_complex.proto:201:41 + + + > message_type[7] > field[15] > label: +desc_test_complex.proto:201:9 +desc_test_complex.proto:201:17 + + + > message_type[7] > field[15] > type: +desc_test_complex.proto:201:18 +desc_test_complex.proto:201:26 + + + > message_type[7] > field[15] > name: +desc_test_complex.proto:201:27 +desc_test_complex.proto:201:35 + + + > message_type[7] > field[15] > number: +desc_test_complex.proto:201:38 +desc_test_complex.proto:201:40 + + + > message_type[7] > field[16]: +desc_test_complex.proto:202:9 +desc_test_complex.proto:202:41 + + + > message_type[7] > field[16] > label: +desc_test_complex.proto:202:9 +desc_test_complex.proto:202:17 + + + > message_type[7] > field[16] > type: +desc_test_complex.proto:202:18 +desc_test_complex.proto:202:26 + + + > message_type[7] > field[16] > name: +desc_test_complex.proto:202:27 +desc_test_complex.proto:202:35 + + + > message_type[7] > field[16] > number: +desc_test_complex.proto:202:38 +desc_test_complex.proto:202:40 + + + > message_type[7] > field[17]: +desc_test_complex.proto:203:9 +desc_test_complex.proto:203:33 + + + > message_type[7] > field[17] > label: +desc_test_complex.proto:203:9 +desc_test_complex.proto:203:17 + + + > message_type[7] > field[17] > type: +desc_test_complex.proto:203:18 +desc_test_complex.proto:203:22 + + + > message_type[7] > field[17] > name: +desc_test_complex.proto:203:23 +desc_test_complex.proto:203:27 + + + > message_type[7] > field[17] > number: +desc_test_complex.proto:203:30 +desc_test_complex.proto:203:32 + + + > message_type[7] > field[18]: +desc_test_complex.proto:204:9 +desc_test_complex.proto:204:35 + + + > message_type[7] > field[18] > label: +desc_test_complex.proto:204:9 +desc_test_complex.proto:204:17 + + + > message_type[7] > field[18] > type: +desc_test_complex.proto:204:18 +desc_test_complex.proto:204:23 + + + > message_type[7] > field[18] > name: +desc_test_complex.proto:204:24 +desc_test_complex.proto:204:29 + + + > message_type[7] > field[18] > number: +desc_test_complex.proto:204:32 +desc_test_complex.proto:204:34 + + + > message_type[7] > field[19]: +desc_test_complex.proto:205:9 +desc_test_complex.proto:205:37 + + + > message_type[7] > field[19] > label: +desc_test_complex.proto:205:9 +desc_test_complex.proto:205:17 + + + > message_type[7] > field[19] > type: +desc_test_complex.proto:205:18 +desc_test_complex.proto:205:24 + + + > message_type[7] > field[19] > name: +desc_test_complex.proto:205:25 +desc_test_complex.proto:205:31 + + + > message_type[7] > field[19] > number: +desc_test_complex.proto:205:34 +desc_test_complex.proto:205:36 + + + > message_type[7] > field[20]: +desc_test_complex.proto:206:9 +desc_test_complex.proto:206:37 + + + > message_type[7] > field[20] > label: +desc_test_complex.proto:206:9 +desc_test_complex.proto:206:17 + + + > message_type[7] > field[20] > type: +desc_test_complex.proto:206:18 +desc_test_complex.proto:206:22 + + + > message_type[7] > field[20] > name: +desc_test_complex.proto:206:23 +desc_test_complex.proto:206:31 + + + > message_type[7] > field[20] > number: +desc_test_complex.proto:206:34 +desc_test_complex.proto:206:36 + + + > message_type[7] > field[21]: +desc_test_complex.proto:207:9 +desc_test_complex.proto:207:37 + + + > message_type[7] > field[21] > label: +desc_test_complex.proto:207:9 +desc_test_complex.proto:207:17 + + + > message_type[7] > field[21] > type: +desc_test_complex.proto:207:18 +desc_test_complex.proto:207:22 + + + > message_type[7] > field[21] > name: +desc_test_complex.proto:207:23 +desc_test_complex.proto:207:31 + + + > message_type[7] > field[21] > number: +desc_test_complex.proto:207:34 +desc_test_complex.proto:207:36 + + + > message_type[7] > field[22]: +desc_test_complex.proto:208:9 +desc_test_complex.proto:208:37 + + + > message_type[7] > field[22] > label: +desc_test_complex.proto:208:9 +desc_test_complex.proto:208:17 + + + > message_type[7] > field[22] > type: +desc_test_complex.proto:208:18 +desc_test_complex.proto:208:22 + + + > message_type[7] > field[22] > name: +desc_test_complex.proto:208:23 +desc_test_complex.proto:208:31 + + + > message_type[7] > field[22] > number: +desc_test_complex.proto:208:34 +desc_test_complex.proto:208:36 + + + > message_type[7] > field[23]: +desc_test_complex.proto:209:9 +desc_test_complex.proto:209:36 + + + > message_type[7] > field[23] > label: +desc_test_complex.proto:209:9 +desc_test_complex.proto:209:17 + + + > message_type[7] > field[23] > type: +desc_test_complex.proto:209:18 +desc_test_complex.proto:209:22 + + + > message_type[7] > field[23] > name: +desc_test_complex.proto:209:23 +desc_test_complex.proto:209:30 + + + > message_type[7] > field[23] > number: +desc_test_complex.proto:209:33 +desc_test_complex.proto:209:35 + + + > message_type[7] > field[24]: +desc_test_complex.proto:210:9 +desc_test_complex.proto:210:33 + + + > message_type[7] > field[24] > label: +desc_test_complex.proto:210:9 +desc_test_complex.proto:210:17 + + + > message_type[7] > field[24] > type: +desc_test_complex.proto:210:18 +desc_test_complex.proto:210:22 + + + > message_type[7] > field[24] > name: +desc_test_complex.proto:210:23 +desc_test_complex.proto:210:27 + + + > message_type[7] > field[24] > number: +desc_test_complex.proto:210:30 +desc_test_complex.proto:210:32 + + + > message_type[7] > field[25]: +desc_test_complex.proto:211:9 +desc_test_complex.proto:211:36 + + + > message_type[7] > field[25] > label: +desc_test_complex.proto:211:9 +desc_test_complex.proto:211:17 + + + > message_type[7] > field[25] > type: +desc_test_complex.proto:211:18 +desc_test_complex.proto:211:22 + + + > message_type[7] > field[25] > name: +desc_test_complex.proto:211:23 +desc_test_complex.proto:211:30 + + + > message_type[7] > field[25] > number: +desc_test_complex.proto:211:33 +desc_test_complex.proto:211:35 + + + > message_type[7] > field[26]: +desc_test_complex.proto:212:9 +desc_test_complex.proto:212:32 + + + > message_type[7] > field[26] > label: +desc_test_complex.proto:212:9 +desc_test_complex.proto:212:17 + + + > message_type[7] > field[26] > type: +desc_test_complex.proto:212:18 +desc_test_complex.proto:212:22 + + + > message_type[7] > field[26] > name: +desc_test_complex.proto:212:23 +desc_test_complex.proto:212:26 + + + > message_type[7] > field[26] > number: +desc_test_complex.proto:212:29 +desc_test_complex.proto:212:31 + + + > message_type[7] > field[27]: +desc_test_complex.proto:213:9 +desc_test_complex.proto:213:35 + + + > message_type[7] > field[27] > label: +desc_test_complex.proto:213:9 +desc_test_complex.proto:213:17 + + + > message_type[7] > field[27] > type: +desc_test_complex.proto:213:18 +desc_test_complex.proto:213:22 + + + > message_type[7] > field[27] > name: +desc_test_complex.proto:213:23 +desc_test_complex.proto:213:29 + + + > message_type[7] > field[27] > number: +desc_test_complex.proto:213:32 +desc_test_complex.proto:213:34 + + + > message_type[7] > field[28]: +desc_test_complex.proto:214:9 +desc_test_complex.proto:214:35 + + + > message_type[7] > field[28] > label: +desc_test_complex.proto:214:9 +desc_test_complex.proto:214:17 + + + > message_type[7] > field[28] > type: +desc_test_complex.proto:214:18 +desc_test_complex.proto:214:22 + + + > message_type[7] > field[28] > name: +desc_test_complex.proto:214:23 +desc_test_complex.proto:214:29 + + + > message_type[7] > field[28] > number: +desc_test_complex.proto:214:32 +desc_test_complex.proto:214:34 + + + > message_type[7] > field[29]: +desc_test_complex.proto:215:9 +desc_test_complex.proto:215:39 + + + > message_type[7] > field[29] > label: +desc_test_complex.proto:215:9 +desc_test_complex.proto:215:17 + + + > message_type[7] > field[29] > type: +desc_test_complex.proto:215:18 +desc_test_complex.proto:215:22 + + + > message_type[7] > field[29] > name: +desc_test_complex.proto:215:23 +desc_test_complex.proto:215:33 + + + > message_type[7] > field[29] > number: +desc_test_complex.proto:215:36 +desc_test_complex.proto:215:38 + + + > message_type[7] > field[30]: +desc_test_complex.proto:216:9 +desc_test_complex.proto:216:37 + + + > message_type[7] > field[30] > label: +desc_test_complex.proto:216:9 +desc_test_complex.proto:216:17 + + + > message_type[7] > field[30] > type: +desc_test_complex.proto:216:18 +desc_test_complex.proto:216:22 + + + > message_type[7] > field[30] > name: +desc_test_complex.proto:216:23 +desc_test_complex.proto:216:31 + + + > message_type[7] > field[30] > number: +desc_test_complex.proto:216:34 +desc_test_complex.proto:216:36 + + + > message_type[7] > field[31]: +desc_test_complex.proto:217:9 +desc_test_complex.proto:217:31 + + + > message_type[7] > field[31] > label: +desc_test_complex.proto:217:9 +desc_test_complex.proto:217:17 + + + > message_type[7] > field[31] > type: +desc_test_complex.proto:217:18 +desc_test_complex.proto:217:22 + + + > message_type[7] > field[31] > name: +desc_test_complex.proto:217:23 +desc_test_complex.proto:217:25 + + + > message_type[7] > field[31] > number: +desc_test_complex.proto:217:28 +desc_test_complex.proto:217:30 + + + > message_type[7] > field[32]: +desc_test_complex.proto:218:9 +desc_test_complex.proto:218:34 + + + > message_type[7] > field[32] > label: +desc_test_complex.proto:218:9 +desc_test_complex.proto:218:17 + + + > message_type[7] > field[32] > type: +desc_test_complex.proto:218:18 +desc_test_complex.proto:218:23 + + + > message_type[7] > field[32] > name: +desc_test_complex.proto:218:24 +desc_test_complex.proto:218:28 + + + > message_type[7] > field[32] > number: +desc_test_complex.proto:218:31 +desc_test_complex.proto:218:33 + + + > message_type[7] > field[33]: +desc_test_complex.proto:219:9 +desc_test_complex.proto:219:35 + + + > message_type[7] > field[33] > label: +desc_test_complex.proto:219:9 +desc_test_complex.proto:219:17 + + + > message_type[7] > field[33] > type: +desc_test_complex.proto:219:18 +desc_test_complex.proto:219:23 + + + > message_type[7] > field[33] > name: +desc_test_complex.proto:219:24 +desc_test_complex.proto:219:29 + + + > message_type[7] > field[33] > number: +desc_test_complex.proto:219:32 +desc_test_complex.proto:219:34 + + + > message_type[7] > field[34]: +desc_test_complex.proto:220:9 +desc_test_complex.proto:220:37 + + + > message_type[7] > field[34] > label: +desc_test_complex.proto:220:9 +desc_test_complex.proto:220:17 + + + > message_type[7] > field[34] > type: +desc_test_complex.proto:220:18 +desc_test_complex.proto:220:23 + + + > message_type[7] > field[34] > name: +desc_test_complex.proto:220:24 +desc_test_complex.proto:220:31 + + + > message_type[7] > field[34] > number: +desc_test_complex.proto:220:34 +desc_test_complex.proto:220:36 + + + > extension: +desc_test_complex.proto:223:1 +desc_test_complex.proto:260:2 + + + > extension[6]: +desc_test_complex.proto:224:9 +desc_test_complex.proto:224:38 + + + > extension[6] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[6] > label: +desc_test_complex.proto:224:9 +desc_test_complex.proto:224:17 + + + > extension[6] > type: +desc_test_complex.proto:224:18 +desc_test_complex.proto:224:22 + + + > extension[6] > name: +desc_test_complex.proto:224:23 +desc_test_complex.proto:224:29 + + + > extension[6] > number: +desc_test_complex.proto:224:32 +desc_test_complex.proto:224:37 + + + > extension[7]: +desc_test_complex.proto:225:9 +desc_test_complex.proto:225:38 + + + > extension[7] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[7] > label: +desc_test_complex.proto:225:9 +desc_test_complex.proto:225:17 + + + > extension[7] > type: +desc_test_complex.proto:225:18 +desc_test_complex.proto:225:22 + + + > extension[7] > name: +desc_test_complex.proto:225:23 +desc_test_complex.proto:225:29 + + + > extension[7] > number: +desc_test_complex.proto:225:32 +desc_test_complex.proto:225:37 + + + > extension[8]: +desc_test_complex.proto:226:9 +desc_test_complex.proto:226:38 + + + > extension[8] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[8] > label: +desc_test_complex.proto:226:9 +desc_test_complex.proto:226:17 + + + > extension[8] > type: +desc_test_complex.proto:226:18 +desc_test_complex.proto:226:22 + + + > extension[8] > name: +desc_test_complex.proto:226:23 +desc_test_complex.proto:226:29 + + + > extension[8] > number: +desc_test_complex.proto:226:32 +desc_test_complex.proto:226:37 + + + > extension[9]: +desc_test_complex.proto:227:9 +desc_test_complex.proto:227:36 + + + > extension[9] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[9] > label: +desc_test_complex.proto:227:9 +desc_test_complex.proto:227:17 + + + > extension[9] > type: +desc_test_complex.proto:227:18 +desc_test_complex.proto:227:22 + + + > extension[9] > name: +desc_test_complex.proto:227:23 +desc_test_complex.proto:227:27 + + + > extension[9] > number: +desc_test_complex.proto:227:30 +desc_test_complex.proto:227:35 + + + > extension[10]: +desc_test_complex.proto:228:9 +desc_test_complex.proto:228:39 + + + > extension[10] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[10] > label: +desc_test_complex.proto:228:9 +desc_test_complex.proto:228:17 + + + > extension[10] > type: +desc_test_complex.proto:228:18 +desc_test_complex.proto:228:22 + + + > extension[10] > name: +desc_test_complex.proto:228:23 +desc_test_complex.proto:228:30 + + + > extension[10] > number: +desc_test_complex.proto:228:33 +desc_test_complex.proto:228:38 + + + > extension[11]: +desc_test_complex.proto:229:9 +desc_test_complex.proto:229:40 + + + > extension[11] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[11] > label: +desc_test_complex.proto:229:9 +desc_test_complex.proto:229:17 + + + > extension[11] > type: +desc_test_complex.proto:229:18 +desc_test_complex.proto:229:24 + + + > extension[11] > name: +desc_test_complex.proto:229:25 +desc_test_complex.proto:229:31 + + + > extension[11] > number: +desc_test_complex.proto:229:34 +desc_test_complex.proto:229:39 + + + > extension[12]: +desc_test_complex.proto:230:9 +desc_test_complex.proto:230:38 + + + > extension[12] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[12] > label: +desc_test_complex.proto:230:9 +desc_test_complex.proto:230:17 + + + > extension[12] > type: +desc_test_complex.proto:230:18 +desc_test_complex.proto:230:23 + + + > extension[12] > name: +desc_test_complex.proto:230:24 +desc_test_complex.proto:230:29 + + + > extension[12] > number: +desc_test_complex.proto:230:32 +desc_test_complex.proto:230:37 + + + > extension[13]: +desc_test_complex.proto:231:9 +desc_test_complex.proto:231:38 + + + > extension[13] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[13] > label: +desc_test_complex.proto:231:9 +desc_test_complex.proto:231:17 + + + > extension[13] > type: +desc_test_complex.proto:231:18 +desc_test_complex.proto:231:23 + + + > extension[13] > name: +desc_test_complex.proto:231:24 +desc_test_complex.proto:231:29 + + + > extension[13] > number: +desc_test_complex.proto:231:32 +desc_test_complex.proto:231:37 + + + > extension[14]: +desc_test_complex.proto:232:9 +desc_test_complex.proto:232:38 + + + > extension[14] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[14] > label: +desc_test_complex.proto:232:9 +desc_test_complex.proto:232:17 + + + > extension[14] > type: +desc_test_complex.proto:232:18 +desc_test_complex.proto:232:23 + + + > extension[14] > name: +desc_test_complex.proto:232:24 +desc_test_complex.proto:232:29 + + + > extension[14] > number: +desc_test_complex.proto:232:32 +desc_test_complex.proto:232:37 + + + > extension[15]: +desc_test_complex.proto:233:9 +desc_test_complex.proto:233:40 + + + > extension[15] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[15] > label: +desc_test_complex.proto:233:9 +desc_test_complex.proto:233:17 + + + > extension[15] > type: +desc_test_complex.proto:233:18 +desc_test_complex.proto:233:24 + + + > extension[15] > name: +desc_test_complex.proto:233:25 +desc_test_complex.proto:233:31 + + + > extension[15] > number: +desc_test_complex.proto:233:34 +desc_test_complex.proto:233:39 + + + > extension[16]: +desc_test_complex.proto:234:9 +desc_test_complex.proto:234:40 + + + > extension[16] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[16] > label: +desc_test_complex.proto:234:9 +desc_test_complex.proto:234:17 + + + > extension[16] > type: +desc_test_complex.proto:234:18 +desc_test_complex.proto:234:24 + + + > extension[16] > name: +desc_test_complex.proto:234:25 +desc_test_complex.proto:234:31 + + + > extension[16] > number: +desc_test_complex.proto:234:34 +desc_test_complex.proto:234:39 + + + > extension[17]: +desc_test_complex.proto:235:9 +desc_test_complex.proto:235:40 + + + > extension[17] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[17] > label: +desc_test_complex.proto:235:9 +desc_test_complex.proto:235:17 + + + > extension[17] > type: +desc_test_complex.proto:235:18 +desc_test_complex.proto:235:24 + + + > extension[17] > name: +desc_test_complex.proto:235:25 +desc_test_complex.proto:235:31 + + + > extension[17] > number: +desc_test_complex.proto:235:34 +desc_test_complex.proto:235:39 + + + > extension[18]: +desc_test_complex.proto:236:9 +desc_test_complex.proto:236:40 + + + > extension[18] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[18] > label: +desc_test_complex.proto:236:9 +desc_test_complex.proto:236:17 + + + > extension[18] > type: +desc_test_complex.proto:236:18 +desc_test_complex.proto:236:24 + + + > extension[18] > name: +desc_test_complex.proto:236:25 +desc_test_complex.proto:236:31 + + + > extension[18] > number: +desc_test_complex.proto:236:34 +desc_test_complex.proto:236:39 + + + > extension[19]: +desc_test_complex.proto:237:9 +desc_test_complex.proto:237:42 + + + > extension[19] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[19] > label: +desc_test_complex.proto:237:9 +desc_test_complex.proto:237:17 + + + > extension[19] > type: +desc_test_complex.proto:237:18 +desc_test_complex.proto:237:25 + + + > extension[19] > name: +desc_test_complex.proto:237:26 +desc_test_complex.proto:237:33 + + + > extension[19] > number: +desc_test_complex.proto:237:36 +desc_test_complex.proto:237:41 + + + > extension[20]: +desc_test_complex.proto:238:9 +desc_test_complex.proto:238:42 + + + > extension[20] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[20] > label: +desc_test_complex.proto:238:9 +desc_test_complex.proto:238:17 + + + > extension[20] > type: +desc_test_complex.proto:238:18 +desc_test_complex.proto:238:25 + + + > extension[20] > name: +desc_test_complex.proto:238:26 +desc_test_complex.proto:238:33 + + + > extension[20] > number: +desc_test_complex.proto:238:36 +desc_test_complex.proto:238:41 + + + > extension[21]: +desc_test_complex.proto:239:9 +desc_test_complex.proto:239:44 + + + > extension[21] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[21] > label: +desc_test_complex.proto:239:9 +desc_test_complex.proto:239:17 + + + > extension[21] > type: +desc_test_complex.proto:239:18 +desc_test_complex.proto:239:26 + + + > extension[21] > name: +desc_test_complex.proto:239:27 +desc_test_complex.proto:239:35 + + + > extension[21] > number: +desc_test_complex.proto:239:38 +desc_test_complex.proto:239:43 + + + > extension[22]: +desc_test_complex.proto:240:9 +desc_test_complex.proto:240:44 + + + > extension[22] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[22] > label: +desc_test_complex.proto:240:9 +desc_test_complex.proto:240:17 + + + > extension[22] > type: +desc_test_complex.proto:240:18 +desc_test_complex.proto:240:26 + + + > extension[22] > name: +desc_test_complex.proto:240:27 +desc_test_complex.proto:240:35 + + + > extension[22] > number: +desc_test_complex.proto:240:38 +desc_test_complex.proto:240:43 + + + > extension[23]: +desc_test_complex.proto:241:9 +desc_test_complex.proto:241:36 + + + > extension[23] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[23] > label: +desc_test_complex.proto:241:9 +desc_test_complex.proto:241:17 + + + > extension[23] > type: +desc_test_complex.proto:241:18 +desc_test_complex.proto:241:22 + + + > extension[23] > name: +desc_test_complex.proto:241:23 +desc_test_complex.proto:241:27 + + + > extension[23] > number: +desc_test_complex.proto:241:30 +desc_test_complex.proto:241:35 + + + > extension[24]: +desc_test_complex.proto:242:9 +desc_test_complex.proto:242:38 + + + > extension[24] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[24] > label: +desc_test_complex.proto:242:9 +desc_test_complex.proto:242:17 + + + > extension[24] > type: +desc_test_complex.proto:242:18 +desc_test_complex.proto:242:23 + + + > extension[24] > name: +desc_test_complex.proto:242:24 +desc_test_complex.proto:242:29 + + + > extension[24] > number: +desc_test_complex.proto:242:32 +desc_test_complex.proto:242:37 + + + > extension[25]: +desc_test_complex.proto:243:9 +desc_test_complex.proto:243:40 + + + > extension[25] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[25] > label: +desc_test_complex.proto:243:9 +desc_test_complex.proto:243:17 + + + > extension[25] > type: +desc_test_complex.proto:243:18 +desc_test_complex.proto:243:24 + + + > extension[25] > name: +desc_test_complex.proto:243:25 +desc_test_complex.proto:243:31 + + + > extension[25] > number: +desc_test_complex.proto:243:34 +desc_test_complex.proto:243:39 + + + > extension[26]: +desc_test_complex.proto:244:9 +desc_test_complex.proto:244:40 + + + > extension[26] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[26] > label: +desc_test_complex.proto:244:9 +desc_test_complex.proto:244:17 + + + > extension[26] > type: +desc_test_complex.proto:244:18 +desc_test_complex.proto:244:22 + + + > extension[26] > name: +desc_test_complex.proto:244:23 +desc_test_complex.proto:244:31 + + + > extension[26] > number: +desc_test_complex.proto:244:34 +desc_test_complex.proto:244:39 + + + > extension[27]: +desc_test_complex.proto:245:9 +desc_test_complex.proto:245:40 + + + > extension[27] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[27] > label: +desc_test_complex.proto:245:9 +desc_test_complex.proto:245:17 + + + > extension[27] > type: +desc_test_complex.proto:245:18 +desc_test_complex.proto:245:22 + + + > extension[27] > name: +desc_test_complex.proto:245:23 +desc_test_complex.proto:245:31 + + + > extension[27] > number: +desc_test_complex.proto:245:34 +desc_test_complex.proto:245:39 + + + > extension[28]: +desc_test_complex.proto:246:9 +desc_test_complex.proto:246:40 + + + > extension[28] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[28] > label: +desc_test_complex.proto:246:9 +desc_test_complex.proto:246:17 + + + > extension[28] > type: +desc_test_complex.proto:246:18 +desc_test_complex.proto:246:22 + + + > extension[28] > name: +desc_test_complex.proto:246:23 +desc_test_complex.proto:246:31 + + + > extension[28] > number: +desc_test_complex.proto:246:34 +desc_test_complex.proto:246:39 + + + > extension[29]: +desc_test_complex.proto:247:9 +desc_test_complex.proto:247:39 + + + > extension[29] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[29] > label: +desc_test_complex.proto:247:9 +desc_test_complex.proto:247:17 + + + > extension[29] > type: +desc_test_complex.proto:247:18 +desc_test_complex.proto:247:22 + + + > extension[29] > name: +desc_test_complex.proto:247:23 +desc_test_complex.proto:247:30 + + + > extension[29] > number: +desc_test_complex.proto:247:33 +desc_test_complex.proto:247:38 + + + > extension[30]: +desc_test_complex.proto:248:9 +desc_test_complex.proto:248:36 + + + > extension[30] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[30] > label: +desc_test_complex.proto:248:9 +desc_test_complex.proto:248:17 + + + > extension[30] > type: +desc_test_complex.proto:248:18 +desc_test_complex.proto:248:22 + + + > extension[30] > name: +desc_test_complex.proto:248:23 +desc_test_complex.proto:248:27 + + + > extension[30] > number: +desc_test_complex.proto:248:30 +desc_test_complex.proto:248:35 + + + > extension[31]: +desc_test_complex.proto:249:9 +desc_test_complex.proto:249:39 + + + > extension[31] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[31] > label: +desc_test_complex.proto:249:9 +desc_test_complex.proto:249:17 + + + > extension[31] > type: +desc_test_complex.proto:249:18 +desc_test_complex.proto:249:22 + + + > extension[31] > name: +desc_test_complex.proto:249:23 +desc_test_complex.proto:249:30 + + + > extension[31] > number: +desc_test_complex.proto:249:33 +desc_test_complex.proto:249:38 + + + > extension[32]: +desc_test_complex.proto:250:9 +desc_test_complex.proto:250:35 + + + > extension[32] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[32] > label: +desc_test_complex.proto:250:9 +desc_test_complex.proto:250:17 + + + > extension[32] > type: +desc_test_complex.proto:250:18 +desc_test_complex.proto:250:22 + + + > extension[32] > name: +desc_test_complex.proto:250:23 +desc_test_complex.proto:250:26 + + + > extension[32] > number: +desc_test_complex.proto:250:29 +desc_test_complex.proto:250:34 + + + > extension[33]: +desc_test_complex.proto:251:9 +desc_test_complex.proto:251:38 + + + > extension[33] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[33] > label: +desc_test_complex.proto:251:9 +desc_test_complex.proto:251:17 + + + > extension[33] > type: +desc_test_complex.proto:251:18 +desc_test_complex.proto:251:22 + + + > extension[33] > name: +desc_test_complex.proto:251:23 +desc_test_complex.proto:251:29 + + + > extension[33] > number: +desc_test_complex.proto:251:32 +desc_test_complex.proto:251:37 + + + > extension[34]: +desc_test_complex.proto:252:9 +desc_test_complex.proto:252:38 + + + > extension[34] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[34] > label: +desc_test_complex.proto:252:9 +desc_test_complex.proto:252:17 + + + > extension[34] > type: +desc_test_complex.proto:252:18 +desc_test_complex.proto:252:22 + + + > extension[34] > name: +desc_test_complex.proto:252:23 +desc_test_complex.proto:252:29 + + + > extension[34] > number: +desc_test_complex.proto:252:32 +desc_test_complex.proto:252:37 + + + > extension[35]: +desc_test_complex.proto:253:9 +desc_test_complex.proto:253:42 + + + > extension[35] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[35] > label: +desc_test_complex.proto:253:9 +desc_test_complex.proto:253:17 + + + > extension[35] > type: +desc_test_complex.proto:253:18 +desc_test_complex.proto:253:22 + + + > extension[35] > name: +desc_test_complex.proto:253:23 +desc_test_complex.proto:253:33 + + + > extension[35] > number: +desc_test_complex.proto:253:36 +desc_test_complex.proto:253:41 + + + > extension[36]: +desc_test_complex.proto:254:9 +desc_test_complex.proto:254:40 + + + > extension[36] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[36] > label: +desc_test_complex.proto:254:9 +desc_test_complex.proto:254:17 + + + > extension[36] > type: +desc_test_complex.proto:254:18 +desc_test_complex.proto:254:22 + + + > extension[36] > name: +desc_test_complex.proto:254:23 +desc_test_complex.proto:254:31 + + + > extension[36] > number: +desc_test_complex.proto:254:34 +desc_test_complex.proto:254:39 + + + > extension[37]: +desc_test_complex.proto:255:9 +desc_test_complex.proto:255:34 + + + > extension[37] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[37] > label: +desc_test_complex.proto:255:9 +desc_test_complex.proto:255:17 + + + > extension[37] > type: +desc_test_complex.proto:255:18 +desc_test_complex.proto:255:22 + + + > extension[37] > name: +desc_test_complex.proto:255:23 +desc_test_complex.proto:255:25 + + + > extension[37] > number: +desc_test_complex.proto:255:28 +desc_test_complex.proto:255:33 + + + > extension[38]: +desc_test_complex.proto:256:9 +desc_test_complex.proto:256:37 + + + > extension[38] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[38] > label: +desc_test_complex.proto:256:9 +desc_test_complex.proto:256:17 + + + > extension[38] > type: +desc_test_complex.proto:256:18 +desc_test_complex.proto:256:23 + + + > extension[38] > name: +desc_test_complex.proto:256:24 +desc_test_complex.proto:256:28 + + + > extension[38] > number: +desc_test_complex.proto:256:31 +desc_test_complex.proto:256:36 + + + > extension[39]: +desc_test_complex.proto:257:9 +desc_test_complex.proto:257:38 + + + > extension[39] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[39] > label: +desc_test_complex.proto:257:9 +desc_test_complex.proto:257:17 + + + > extension[39] > type: +desc_test_complex.proto:257:18 +desc_test_complex.proto:257:23 + + + > extension[39] > name: +desc_test_complex.proto:257:24 +desc_test_complex.proto:257:29 + + + > extension[39] > number: +desc_test_complex.proto:257:32 +desc_test_complex.proto:257:37 + + + > extension[40]: +desc_test_complex.proto:258:9 +desc_test_complex.proto:258:40 + + + > extension[40] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[40] > label: +desc_test_complex.proto:258:9 +desc_test_complex.proto:258:17 + + + > extension[40] > type: +desc_test_complex.proto:258:18 +desc_test_complex.proto:258:23 + + + > extension[40] > name: +desc_test_complex.proto:258:24 +desc_test_complex.proto:258:31 + + + > extension[40] > number: +desc_test_complex.proto:258:34 +desc_test_complex.proto:258:39 + + + > extension[41]: +desc_test_complex.proto:259:9 +desc_test_complex.proto:259:49 + + + > extension[41] > extendee: +desc_test_complex.proto:223:8 +desc_test_complex.proto:223:36 + + + > extension[41] > label: +desc_test_complex.proto:259:9 +desc_test_complex.proto:259:17 + + + > extension[41] > type_name: +desc_test_complex.proto:259:18 +desc_test_complex.proto:259:35 + + + > extension[41] > name: +desc_test_complex.proto:259:36 +desc_test_complex.proto:259:40 + + + > extension[41] > number: +desc_test_complex.proto:259:43 +desc_test_complex.proto:259:48 + + + > message_type[8]: +desc_test_complex.proto:262:1 +desc_test_complex.proto:287:2 + + + > message_type[8] > name: +desc_test_complex.proto:262:9 +desc_test_complex.proto:262:32 + + + > message_type[8] > field[0]: +desc_test_complex.proto:263:9 +desc_test_complex.proto:273:11 + + + > message_type[8] > field[0] > label: +desc_test_complex.proto:263:9 +desc_test_complex.proto:263:17 + + + > message_type[8] > field[0] > type: +desc_test_complex.proto:263:18 +desc_test_complex.proto:263:24 + + + > message_type[8] > field[0] > name: +desc_test_complex.proto:263:25 +desc_test_complex.proto:263:27 + + + > message_type[8] > field[0] > number: +desc_test_complex.proto:263:30 +desc_test_complex.proto:263:31 + + + > message_type[8] > field[0] > options: +desc_test_complex.proto:263:32 +desc_test_complex.proto:273:10 + + + > message_type[8] > field[0] > options > syntax: +desc_test_complex.proto:264:17 +desc_test_complex.proto:264:32 + + + > message_type[8] > field[0] > options > import: +desc_test_complex.proto:264:34 +desc_test_complex.proto:264:49 + + + > message_type[8] > field[0] > options > public: +desc_test_complex.proto:264:51 +desc_test_complex.proto:264:66 + + + > message_type[8] > field[0] > options > weak: +desc_test_complex.proto:264:68 +desc_test_complex.proto:264:81 + + + > message_type[8] > field[0] > options > package: +desc_test_complex.proto:264:83 +desc_test_complex.proto:264:99 + + + > message_type[8] > field[0] > options > string: +desc_test_complex.proto:265:17 +desc_test_complex.proto:265:36 + + + > message_type[8] > field[0] > options > bytes: +desc_test_complex.proto:265:38 +desc_test_complex.proto:265:55 + + + > message_type[8] > field[0] > options > bool: +desc_test_complex.proto:265:57 +desc_test_complex.proto:265:70 + + + > message_type[8] > field[0] > options > float: +desc_test_complex.proto:266:17 +desc_test_complex.proto:266:31 + + + > message_type[8] > field[0] > options > double: +desc_test_complex.proto:266:33 +desc_test_complex.proto:266:51 + + + > message_type[8] > field[0] > options > int32: +desc_test_complex.proto:267:17 +desc_test_complex.proto:267:29 + + + > message_type[8] > field[0] > options > int64: +desc_test_complex.proto:267:31 +desc_test_complex.proto:267:43 + + + > message_type[8] > field[0] > options > uint32: +desc_test_complex.proto:267:45 +desc_test_complex.proto:267:60 + + + > message_type[8] > field[0] > options > uint64: +desc_test_complex.proto:267:62 +desc_test_complex.proto:267:77 + + + > message_type[8] > field[0] > options > sint32: +desc_test_complex.proto:267:79 +desc_test_complex.proto:267:93 + + + > message_type[8] > field[0] > options > sint64: +desc_test_complex.proto:267:95 +desc_test_complex.proto:267:109 + + + > message_type[8] > field[0] > options > fixed32: +desc_test_complex.proto:268:17 +desc_test_complex.proto:268:33 + + + > message_type[8] > field[0] > options > fixed64: +desc_test_complex.proto:268:35 +desc_test_complex.proto:268:51 + + + > message_type[8] > field[0] > options > sfixed32: +desc_test_complex.proto:268:53 +desc_test_complex.proto:268:71 + + + > message_type[8] > field[0] > options > sfixed64: +desc_test_complex.proto:268:73 +desc_test_complex.proto:268:91 + + + > message_type[8] > field[0] > options > optional: +desc_test_complex.proto:269:17 +desc_test_complex.proto:269:34 + + + > message_type[8] > field[0] > options > repeated: +desc_test_complex.proto:269:36 +desc_test_complex.proto:269:53 + + + > message_type[8] > field[0] > options > required: +desc_test_complex.proto:269:55 +desc_test_complex.proto:269:72 + + + > message_type[8] > field[0] > options > message: +desc_test_complex.proto:270:17 +desc_test_complex.proto:270:33 + + + > message_type[8] > field[0] > options > enum: +desc_test_complex.proto:270:35 +desc_test_complex.proto:270:48 + + + > message_type[8] > field[0] > options > service: +desc_test_complex.proto:270:50 +desc_test_complex.proto:270:66 + + + > message_type[8] > field[0] > options > rpc: +desc_test_complex.proto:270:68 +desc_test_complex.proto:270:80 + + + > message_type[8] > field[0] > options > option: +desc_test_complex.proto:271:17 +desc_test_complex.proto:271:32 + + + > message_type[8] > field[0] > options > extend: +desc_test_complex.proto:271:34 +desc_test_complex.proto:271:49 + + + > message_type[8] > field[0] > options > extensions: +desc_test_complex.proto:271:51 +desc_test_complex.proto:271:70 + + + > message_type[8] > field[0] > options > reserved: +desc_test_complex.proto:271:72 +desc_test_complex.proto:271:89 + + + > message_type[8] > field[0] > options > to: +desc_test_complex.proto:272:17 +desc_test_complex.proto:272:28 + + + > message_type[8] > field[0] > options > true: +desc_test_complex.proto:272:30 +desc_test_complex.proto:272:42 + + + > message_type[8] > field[0] > options > false: +desc_test_complex.proto:272:44 +desc_test_complex.proto:272:58 + + + > message_type[8] > field[0] > options > default: +desc_test_complex.proto:272:60 +desc_test_complex.proto:272:75 + + + > message_type[8] > field[1]: +desc_test_complex.proto:274:9 +desc_test_complex.proto:286:11 + + + > message_type[8] > field[1] > label: +desc_test_complex.proto:274:9 +desc_test_complex.proto:274:17 + + + > message_type[8] > field[1] > type: +desc_test_complex.proto:274:18 +desc_test_complex.proto:274:24 + + + > message_type[8] > field[1] > name: +desc_test_complex.proto:274:25 +desc_test_complex.proto:274:29 + + + > message_type[8] > field[1] > number: +desc_test_complex.proto:274:32 +desc_test_complex.proto:274:33 + + + > message_type[8] > field[1] > options: +desc_test_complex.proto:274:34 +desc_test_complex.proto:286:10 + + + > message_type[8] > field[1] > options > boom: +desc_test_complex.proto:275:17 +desc_test_complex.proto:285:18 +---- desc_test_options.proto ---- + + +: +desc_test_options.proto:1:1 +desc_test_options.proto:63:2 + + + > syntax: +desc_test_options.proto:1:1 +desc_test_options.proto:1:19 + + + > options: +desc_test_options.proto:3:1 +desc_test_options.proto:3:73 + + + > options > go_package: +desc_test_options.proto:3:1 +desc_test_options.proto:3:73 + + + > package: +desc_test_options.proto:5:1 +desc_test_options.proto:5:20 + + + > dependency[0]: +desc_test_options.proto:7:1 +desc_test_options.proto:7:43 + + + > extension: +desc_test_options.proto:9:1 +desc_test_options.proto:11:2 + + + > extension[0]: +desc_test_options.proto:10:9 +desc_test_options.proto:10:38 + + + > extension[0] > extendee: +desc_test_options.proto:9:8 +desc_test_options.proto:9:38 + + + > extension[0] > label: +desc_test_options.proto:10:9 +desc_test_options.proto:10:17 + + + > extension[0] > type: +desc_test_options.proto:10:18 +desc_test_options.proto:10:22 + + + > extension[0] > name: +desc_test_options.proto:10:23 +desc_test_options.proto:10:29 + + + > extension[0] > number: +desc_test_options.proto:10:32 +desc_test_options.proto:10:37 + + + > extension: +desc_test_options.proto:13:1 +desc_test_options.proto:16:2 + + + > extension[1]: +desc_test_options.proto:14:9 +desc_test_options.proto:14:40 + + + > extension[1] > extendee: +desc_test_options.proto:13:8 +desc_test_options.proto:13:36 + + + > extension[1] > label: +desc_test_options.proto:14:9 +desc_test_options.proto:14:17 + + + > extension[1] > type: +desc_test_options.proto:14:18 +desc_test_options.proto:14:24 + + + > extension[1] > name: +desc_test_options.proto:14:25 +desc_test_options.proto:14:31 + + + > extension[1] > number: +desc_test_options.proto:14:34 +desc_test_options.proto:14:39 + + + > extension[2]: +desc_test_options.proto:15:9 +desc_test_options.proto:15:40 + + + > extension[2] > extendee: +desc_test_options.proto:13:8 +desc_test_options.proto:13:36 + + + > extension[2] > label: +desc_test_options.proto:15:9 +desc_test_options.proto:15:17 + + + > extension[2] > type: +desc_test_options.proto:15:18 +desc_test_options.proto:15:23 + + + > extension[2] > name: +desc_test_options.proto:15:24 +desc_test_options.proto:15:31 + + + > extension[2] > number: +desc_test_options.proto:15:34 +desc_test_options.proto:15:39 + + + > extension: +desc_test_options.proto:18:1 +desc_test_options.proto:24:2 + + + > extension[3]: +desc_test_options.proto:19:9 +desc_test_options.proto:19:39 + + + > extension[3] > extendee: +desc_test_options.proto:18:8 +desc_test_options.proto:18:35 + + + > extension[3] > label: +desc_test_options.proto:19:9 +desc_test_options.proto:19:17 + + + > extension[3] > type: +desc_test_options.proto:19:18 +desc_test_options.proto:19:23 + + + > extension[3] > name: +desc_test_options.proto:19:24 +desc_test_options.proto:19:30 + + + > extension[3] > number: +desc_test_options.proto:19:33 +desc_test_options.proto:19:38 + + + > extension[4]: +desc_test_options.proto:20:9 +desc_test_options.proto:20:41 + + + > extension[4] > extendee: +desc_test_options.proto:18:8 +desc_test_options.proto:18:35 + + + > extension[4] > label: +desc_test_options.proto:20:9 +desc_test_options.proto:20:17 + + + > extension[4] > type: +desc_test_options.proto:20:18 +desc_test_options.proto:20:24 + + + > extension[4] > name: +desc_test_options.proto:20:25 +desc_test_options.proto:20:32 + + + > extension[4] > number: +desc_test_options.proto:20:35 +desc_test_options.proto:20:40 + + + > extension[5]: +desc_test_options.proto:21:9 +desc_test_options.proto:21:44 + + + > extension[5] > extendee: +desc_test_options.proto:18:8 +desc_test_options.proto:18:35 + + + > extension[5] > label: +desc_test_options.proto:21:9 +desc_test_options.proto:21:17 + + + > extension[5] > type: +desc_test_options.proto:21:18 +desc_test_options.proto:21:26 + + + > extension[5] > name: +desc_test_options.proto:21:27 +desc_test_options.proto:21:35 + + + > extension[5] > number: +desc_test_options.proto:21:38 +desc_test_options.proto:21:43 + + + > extension[6]: +desc_test_options.proto:22:9 +desc_test_options.proto:22:41 + + + > extension[6] > extendee: +desc_test_options.proto:18:8 +desc_test_options.proto:18:35 + + + > extension[6] > label: +desc_test_options.proto:22:9 +desc_test_options.proto:22:17 + + + > extension[6] > type: +desc_test_options.proto:22:18 +desc_test_options.proto:22:24 + + + > extension[6] > name: +desc_test_options.proto:22:25 +desc_test_options.proto:22:32 + + + > extension[6] > number: +desc_test_options.proto:22:35 +desc_test_options.proto:22:40 + + + > extension[7]: +desc_test_options.proto:23:9 +desc_test_options.proto:23:43 + + + > extension[7] > extendee: +desc_test_options.proto:18:8 +desc_test_options.proto:18:35 + + + > extension[7] > label: +desc_test_options.proto:23:9 +desc_test_options.proto:23:17 + + + > extension[7] > type: +desc_test_options.proto:23:18 +desc_test_options.proto:23:25 + + + > extension[7] > name: +desc_test_options.proto:23:26 +desc_test_options.proto:23:34 + + + > extension[7] > number: +desc_test_options.proto:23:37 +desc_test_options.proto:23:42 + + + > extension: +desc_test_options.proto:26:1 +desc_test_options.proto:32:2 + + + > extension[8]: +desc_test_options.proto:27:9 +desc_test_options.proto:27:40 + + + > extension[8] > extendee: +desc_test_options.proto:26:8 +desc_test_options.proto:26:40 + + + > extension[8] > label: +desc_test_options.proto:27:9 +desc_test_options.proto:27:17 + + + > extension[8] > type: +desc_test_options.proto:27:18 +desc_test_options.proto:27:23 + + + > extension[8] > name: +desc_test_options.proto:27:24 +desc_test_options.proto:27:31 + + + > extension[8] > number: +desc_test_options.proto:27:34 +desc_test_options.proto:27:39 + + + > extension[9]: +desc_test_options.proto:28:9 +desc_test_options.proto:28:42 + + + > extension[9] > extendee: +desc_test_options.proto:26:8 +desc_test_options.proto:26:40 + + + > extension[9] > label: +desc_test_options.proto:28:9 +desc_test_options.proto:28:17 + + + > extension[9] > type: +desc_test_options.proto:28:18 +desc_test_options.proto:28:24 + + + > extension[9] > name: +desc_test_options.proto:28:25 +desc_test_options.proto:28:33 + + + > extension[9] > number: +desc_test_options.proto:28:36 +desc_test_options.proto:28:41 + + + > extension[10]: +desc_test_options.proto:29:9 +desc_test_options.proto:29:45 + + + > extension[10] > extendee: +desc_test_options.proto:26:8 +desc_test_options.proto:26:40 + + + > extension[10] > label: +desc_test_options.proto:29:9 +desc_test_options.proto:29:17 + + + > extension[10] > type: +desc_test_options.proto:29:18 +desc_test_options.proto:29:26 + + + > extension[10] > name: +desc_test_options.proto:29:27 +desc_test_options.proto:29:36 + + + > extension[10] > number: +desc_test_options.proto:29:39 +desc_test_options.proto:29:44 + + + > extension[11]: +desc_test_options.proto:30:9 +desc_test_options.proto:30:42 + + + > extension[11] > extendee: +desc_test_options.proto:26:8 +desc_test_options.proto:26:40 + + + > extension[11] > label: +desc_test_options.proto:30:9 +desc_test_options.proto:30:17 + + + > extension[11] > type: +desc_test_options.proto:30:18 +desc_test_options.proto:30:24 + + + > extension[11] > name: +desc_test_options.proto:30:25 +desc_test_options.proto:30:33 + + + > extension[11] > number: +desc_test_options.proto:30:36 +desc_test_options.proto:30:41 + + + > extension[12]: +desc_test_options.proto:31:9 +desc_test_options.proto:31:44 + + + > extension[12] > extendee: +desc_test_options.proto:26:8 +desc_test_options.proto:26:40 + + + > extension[12] > label: +desc_test_options.proto:31:9 +desc_test_options.proto:31:17 + + + > extension[12] > type: +desc_test_options.proto:31:18 +desc_test_options.proto:31:25 + + + > extension[12] > name: +desc_test_options.proto:31:26 +desc_test_options.proto:31:35 + + + > extension[12] > number: +desc_test_options.proto:31:38 +desc_test_options.proto:31:43 + + + > extension: +desc_test_options.proto:34:1 +desc_test_options.proto:37:2 + + + > extension[13]: +desc_test_options.proto:35:9 +desc_test_options.proto:35:53 + + + > extension[13] > extendee: +desc_test_options.proto:34:8 +desc_test_options.proto:34:38 + + + > extension[13] > label: +desc_test_options.proto:35:9 +desc_test_options.proto:35:17 + + + > extension[13] > type_name: +desc_test_options.proto:35:18 +desc_test_options.proto:35:37 + + + > extension[13] > name: +desc_test_options.proto:35:38 +desc_test_options.proto:35:44 + + + > extension[13] > number: +desc_test_options.proto:35:47 +desc_test_options.proto:35:52 + + + > extension[14]: +desc_test_options.proto:36:9 +desc_test_options.proto:36:51 + + + > extension[14] > extendee: +desc_test_options.proto:34:8 +desc_test_options.proto:34:38 + + + > extension[14] > label: +desc_test_options.proto:36:9 +desc_test_options.proto:36:17 + + + > extension[14] > type_name: +desc_test_options.proto:36:18 +desc_test_options.proto:36:34 + + + > extension[14] > name: +desc_test_options.proto:36:35 +desc_test_options.proto:36:42 + + + > extension[14] > number: +desc_test_options.proto:36:45 +desc_test_options.proto:36:50 + + + > extension: +desc_test_options.proto:39:1 +desc_test_options.proto:42:2 + + + > extension[15]: +desc_test_options.proto:40:9 +desc_test_options.proto:40:40 + + + > extension[15] > extendee: +desc_test_options.proto:39:8 +desc_test_options.proto:39:37 + + + > extension[15] > label: +desc_test_options.proto:40:9 +desc_test_options.proto:40:17 + + + > extension[15] > type: +desc_test_options.proto:40:18 +desc_test_options.proto:40:23 + + + > extension[15] > name: +desc_test_options.proto:40:24 +desc_test_options.proto:40:31 + + + > extension[15] > number: +desc_test_options.proto:40:34 +desc_test_options.proto:40:39 + + + > extension[16]: +desc_test_options.proto:41:9 +desc_test_options.proto:41:42 + + + > extension[16] > extendee: +desc_test_options.proto:39:8 +desc_test_options.proto:39:37 + + + > extension[16] > label: +desc_test_options.proto:41:9 +desc_test_options.proto:41:17 + + + > extension[16] > type: +desc_test_options.proto:41:18 +desc_test_options.proto:41:24 + + + > extension[16] > name: +desc_test_options.proto:41:25 +desc_test_options.proto:41:33 + + + > extension[16] > number: +desc_test_options.proto:41:36 +desc_test_options.proto:41:41 + + + > message_type[0]: +desc_test_options.proto:45:1 +desc_test_options.proto:48:2 + Leading comments: + Test message used by custom options + + + + > message_type[0] > name: +desc_test_options.proto:45:9 +desc_test_options.proto:45:28 + + + > message_type[0] > field[0]: +desc_test_options.proto:46:9 +desc_test_options.proto:46:32 + + + > message_type[0] > field[0] > label: +desc_test_options.proto:46:9 +desc_test_options.proto:46:17 + + + > message_type[0] > field[0] > type: +desc_test_options.proto:46:18 +desc_test_options.proto:46:24 + + + > message_type[0] > field[0] > name: +desc_test_options.proto:46:25 +desc_test_options.proto:46:27 + + + > message_type[0] > field[0] > number: +desc_test_options.proto:46:30 +desc_test_options.proto:46:31 + + + > message_type[0] > field[1]: +desc_test_options.proto:47:9 +desc_test_options.proto:47:34 + + + > message_type[0] > field[1] > label: +desc_test_options.proto:47:9 +desc_test_options.proto:47:17 + + + > message_type[0] > field[1] > type: +desc_test_options.proto:47:18 +desc_test_options.proto:47:24 + + + > message_type[0] > field[1] > name: +desc_test_options.proto:47:25 +desc_test_options.proto:47:29 + + + > message_type[0] > field[1] > number: +desc_test_options.proto:47:32 +desc_test_options.proto:47:33 + + + > enum_type[0]: +desc_test_options.proto:51:1 +desc_test_options.proto:53:2 + Leading comments: + Test enum used by custom options + + + + > enum_type[0] > name: +desc_test_options.proto:51:6 +desc_test_options.proto:51:22 + + + > enum_type[0] > value[0]: +desc_test_options.proto:52:9 +desc_test_options.proto:52:19 + + + > enum_type[0] > value[0] > name: +desc_test_options.proto:52:9 +desc_test_options.proto:52:14 + + + > enum_type[0] > value[0] > number: +desc_test_options.proto:52:17 +desc_test_options.proto:52:18 + + + > extension: +desc_test_options.proto:55:1 +desc_test_options.proto:58:2 + + + > extension[17]: +desc_test_options.proto:56:9 +desc_test_options.proto:56:41 + + + > extension[17] > extendee: +desc_test_options.proto:55:8 +desc_test_options.proto:55:45 + + + > extension[17] > label: +desc_test_options.proto:56:9 +desc_test_options.proto:56:17 + + + > extension[17] > type: +desc_test_options.proto:56:18 +desc_test_options.proto:56:24 + + + > extension[17] > name: +desc_test_options.proto:56:25 +desc_test_options.proto:56:32 + + + > extension[17] > number: +desc_test_options.proto:56:35 +desc_test_options.proto:56:40 + + + > extension[18]: +desc_test_options.proto:57:9 +desc_test_options.proto:57:41 + + + > extension[18] > extendee: +desc_test_options.proto:55:8 +desc_test_options.proto:55:45 + + + > extension[18] > label: +desc_test_options.proto:57:9 +desc_test_options.proto:57:17 + + + > extension[18] > type: +desc_test_options.proto:57:18 +desc_test_options.proto:57:23 + + + > extension[18] > name: +desc_test_options.proto:57:24 +desc_test_options.proto:57:32 + + + > extension[18] > number: +desc_test_options.proto:57:35 +desc_test_options.proto:57:40 + + + > extension: +desc_test_options.proto:60:1 +desc_test_options.proto:63:2 + + + > extension[19]: +desc_test_options.proto:61:9 +desc_test_options.proto:61:41 + + + > extension[19] > extendee: +desc_test_options.proto:60:8 +desc_test_options.proto:60:36 + + + > extension[19] > label: +desc_test_options.proto:61:9 +desc_test_options.proto:61:17 + + + > extension[19] > type: +desc_test_options.proto:61:18 +desc_test_options.proto:61:24 + + + > extension[19] > name: +desc_test_options.proto:61:25 +desc_test_options.proto:61:32 + + + > extension[19] > number: +desc_test_options.proto:61:35 +desc_test_options.proto:61:40 + + + > extension[20]: +desc_test_options.proto:62:9 +desc_test_options.proto:62:41 + + + > extension[20] > extendee: +desc_test_options.proto:60:8 +desc_test_options.proto:60:36 + + + > extension[20] > label: +desc_test_options.proto:62:9 +desc_test_options.proto:62:17 + + + > extension[20] > type: +desc_test_options.proto:62:18 +desc_test_options.proto:62:23 + + + > extension[20] > name: +desc_test_options.proto:62:24 +desc_test_options.proto:62:32 + + + > extension[20] > number: +desc_test_options.proto:62:35 +desc_test_options.proto:62:40 diff --git a/vendor/github.com/jhump/protoreflect/desc/protoparse/validate.go b/vendor/github.com/jhump/protoreflect/desc/protoparse/validate.go new file mode 100644 index 00000000..64c61dd5 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/desc/protoparse/validate.go @@ -0,0 +1,347 @@ +package protoparse + +import ( + "fmt" + "sort" + + "github.com/golang/protobuf/proto" + + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +func validateBasic(res *parseResult, containsErrors bool) { + fd := res.fd + isProto3 := fd.GetSyntax() == "proto3" + + for _, md := range fd.MessageType { + if validateMessage(res, isProto3, "", md, containsErrors) != nil { + return + } + } + + for _, ed := range fd.EnumType { + if validateEnum(res, isProto3, "", ed, containsErrors) != nil { + return + } + } + + for _, fld := range fd.Extension { + if validateField(res, isProto3, "", fld) != nil { + return + } + } +} + +func validateMessage(res *parseResult, isProto3 bool, prefix string, md *dpb.DescriptorProto, containsErrors bool) error { + nextPrefix := md.GetName() + "." + + for _, fld := range md.Field { + if err := validateField(res, isProto3, nextPrefix, fld); err != nil { + return err + } + } + for _, fld := range md.Extension { + if err := validateField(res, isProto3, nextPrefix, fld); err != nil { + return err + } + } + for _, ed := range md.EnumType { + if err := validateEnum(res, isProto3, nextPrefix, ed, containsErrors); err != nil { + return err + } + } + for _, nmd := range md.NestedType { + if err := validateMessage(res, isProto3, nextPrefix, nmd, containsErrors); err != nil { + return err + } + } + + scope := fmt.Sprintf("message %s%s", prefix, md.GetName()) + + if isProto3 && len(md.ExtensionRange) > 0 { + n := res.getExtensionRangeNode(md.ExtensionRange[0]) + if err := res.errs.handleErrorWithPos(n.start(), "%s: extension ranges are not allowed in proto3", scope); err != nil { + return err + } + } + + if index, err := findOption(res, scope, md.Options.GetUninterpretedOption(), "map_entry"); err != nil { + return err + } else if index >= 0 { + opt := md.Options.UninterpretedOption[index] + optn := res.getOptionNode(opt) + md.Options.UninterpretedOption = removeOption(md.Options.UninterpretedOption, index) + valid := false + if opt.IdentifierValue != nil { + if opt.GetIdentifierValue() == "true" { + valid = true + if err := res.errs.handleErrorWithPos(optn.getValue().start(), "%s: map_entry option should not be set explicitly; use map type instead", scope); err != nil { + return err + } + } else if opt.GetIdentifierValue() == "false" { + valid = true + md.Options.MapEntry = proto.Bool(false) + } + } + if !valid { + if err := res.errs.handleErrorWithPos(optn.getValue().start(), "%s: expecting bool value for map_entry option", scope); err != nil { + return err + } + } + } + + // reserved ranges should not overlap + rsvd := make(tagRanges, len(md.ReservedRange)) + for i, r := range md.ReservedRange { + n := res.getMessageReservedRangeNode(r) + rsvd[i] = tagRange{start: r.GetStart(), end: r.GetEnd(), node: n} + + } + sort.Sort(rsvd) + for i := 1; i < len(rsvd); i++ { + if rsvd[i].start < rsvd[i-1].end { + if err := res.errs.handleErrorWithPos(rsvd[i].node.start(), "%s: reserved ranges overlap: %d to %d and %d to %d", scope, rsvd[i-1].start, rsvd[i-1].end-1, rsvd[i].start, rsvd[i].end-1); err != nil { + return err + } + } + } + + // extensions ranges should not overlap + exts := make(tagRanges, len(md.ExtensionRange)) + for i, r := range md.ExtensionRange { + n := res.getExtensionRangeNode(r) + exts[i] = tagRange{start: r.GetStart(), end: r.GetEnd(), node: n} + } + sort.Sort(exts) + for i := 1; i < len(exts); i++ { + if exts[i].start < exts[i-1].end { + if err := res.errs.handleErrorWithPos(exts[i].node.start(), "%s: extension ranges overlap: %d to %d and %d to %d", scope, exts[i-1].start, exts[i-1].end-1, exts[i].start, exts[i].end-1); err != nil { + return err + } + } + } + + // see if any extension range overlaps any reserved range + var i, j int // i indexes rsvd; j indexes exts + for i < len(rsvd) && j < len(exts) { + if rsvd[i].start >= exts[j].start && rsvd[i].start < exts[j].end || + exts[j].start >= rsvd[i].start && exts[j].start < rsvd[i].end { + + var pos *SourcePos + if rsvd[i].start >= exts[j].start && rsvd[i].start < exts[j].end { + pos = rsvd[i].node.start() + } else { + pos = exts[j].node.start() + } + // ranges overlap + if err := res.errs.handleErrorWithPos(pos, "%s: extension range %d to %d overlaps reserved range %d to %d", scope, exts[j].start, exts[j].end-1, rsvd[i].start, rsvd[i].end-1); err != nil { + return err + } + } + if rsvd[i].start < exts[j].start { + i++ + } else { + j++ + } + } + + // now, check that fields don't re-use tags and don't try to use extension + // or reserved ranges or reserved names + rsvdNames := map[string]struct{}{} + for _, n := range md.ReservedName { + rsvdNames[n] = struct{}{} + } + fieldTags := map[int32]string{} + for _, fld := range md.Field { + fn := res.getFieldNode(fld) + if _, ok := rsvdNames[fld.GetName()]; ok { + if err := res.errs.handleErrorWithPos(fn.fieldName().start(), "%s: field %s is using a reserved name", scope, fld.GetName()); err != nil { + return err + } + } + if existing := fieldTags[fld.GetNumber()]; existing != "" { + if err := res.errs.handleErrorWithPos(fn.fieldTag().start(), "%s: fields %s and %s both have the same tag %d", scope, existing, fld.GetName(), fld.GetNumber()); err != nil { + return err + } + } + fieldTags[fld.GetNumber()] = fld.GetName() + // check reserved ranges + r := sort.Search(len(rsvd), func(index int) bool { return rsvd[index].end > fld.GetNumber() }) + if r < len(rsvd) && rsvd[r].start <= fld.GetNumber() { + if err := res.errs.handleErrorWithPos(fn.fieldTag().start(), "%s: field %s is using tag %d which is in reserved range %d to %d", scope, fld.GetName(), fld.GetNumber(), rsvd[r].start, rsvd[r].end-1); err != nil { + return err + } + } + // and check extension ranges + e := sort.Search(len(exts), func(index int) bool { return exts[index].end > fld.GetNumber() }) + if e < len(exts) && exts[e].start <= fld.GetNumber() { + if err := res.errs.handleErrorWithPos(fn.fieldTag().start(), "%s: field %s is using tag %d which is in extension range %d to %d", scope, fld.GetName(), fld.GetNumber(), exts[e].start, exts[e].end-1); err != nil { + return err + } + } + } + + return nil +} + +func validateEnum(res *parseResult, isProto3 bool, prefix string, ed *dpb.EnumDescriptorProto, containsErrors bool) error { + scope := fmt.Sprintf("enum %s%s", prefix, ed.GetName()) + + if !containsErrors && len(ed.Value) == 0 { + // we only check this if file parsing had no errors; otherwise, the file may have + // had an enum value, but the parser encountered an error processing it, in which + // case the value would be absent from the descriptor. In such a case, this error + // would be confusing and incorrect, so we just skip this check. + enNode := res.getEnumNode(ed) + if err := res.errs.handleErrorWithPos(enNode.start(), "%s: enums must define at least one value", scope); err != nil { + return err + } + } + + allowAlias := false + if index, err := findOption(res, scope, ed.Options.GetUninterpretedOption(), "allow_alias"); err != nil { + return err + } else if index >= 0 { + opt := ed.Options.UninterpretedOption[index] + valid := false + if opt.IdentifierValue != nil { + if opt.GetIdentifierValue() == "true" { + allowAlias = true + valid = true + } else if opt.GetIdentifierValue() == "false" { + valid = true + } + } + if !valid { + optNode := res.getOptionNode(opt) + if err := res.errs.handleErrorWithPos(optNode.getValue().start(), "%s: expecting bool value for allow_alias option", scope); err != nil { + return err + } + } + } + + if isProto3 && len(ed.Value) > 0 && ed.Value[0].GetNumber() != 0 { + evNode := res.getEnumValueNode(ed.Value[0]) + if err := res.errs.handleErrorWithPos(evNode.getNumber().start(), "%s: proto3 requires that first value in enum have numeric value of 0", scope); err != nil { + return err + } + } + + if !allowAlias { + // make sure all value numbers are distinct + vals := map[int32]string{} + for _, evd := range ed.Value { + if existing := vals[evd.GetNumber()]; existing != "" { + evNode := res.getEnumValueNode(evd) + if err := res.errs.handleErrorWithPos(evNode.getNumber().start(), "%s: values %s and %s both have the same numeric value %d; use allow_alias option if intentional", scope, existing, evd.GetName(), evd.GetNumber()); err != nil { + return err + } + } + vals[evd.GetNumber()] = evd.GetName() + } + } + + // reserved ranges should not overlap + rsvd := make(tagRanges, len(ed.ReservedRange)) + for i, r := range ed.ReservedRange { + n := res.getEnumReservedRangeNode(r) + rsvd[i] = tagRange{start: r.GetStart(), end: r.GetEnd(), node: n} + } + sort.Sort(rsvd) + for i := 1; i < len(rsvd); i++ { + if rsvd[i].start <= rsvd[i-1].end { + if err := res.errs.handleErrorWithPos(rsvd[i].node.start(), "%s: reserved ranges overlap: %d to %d and %d to %d", scope, rsvd[i-1].start, rsvd[i-1].end, rsvd[i].start, rsvd[i].end); err != nil { + return err + } + } + } + + // now, check that fields don't re-use tags and don't try to use extension + // or reserved ranges or reserved names + rsvdNames := map[string]struct{}{} + for _, n := range ed.ReservedName { + rsvdNames[n] = struct{}{} + } + for _, ev := range ed.Value { + evn := res.getEnumValueNode(ev) + if _, ok := rsvdNames[ev.GetName()]; ok { + if err := res.errs.handleErrorWithPos(evn.getName().start(), "%s: value %s is using a reserved name", scope, ev.GetName()); err != nil { + return err + } + } + // check reserved ranges + r := sort.Search(len(rsvd), func(index int) bool { return rsvd[index].end >= ev.GetNumber() }) + if r < len(rsvd) && rsvd[r].start <= ev.GetNumber() { + if err := res.errs.handleErrorWithPos(evn.getNumber().start(), "%s: value %s is using number %d which is in reserved range %d to %d", scope, ev.GetName(), ev.GetNumber(), rsvd[r].start, rsvd[r].end); err != nil { + return err + } + } + } + + return nil +} + +func validateField(res *parseResult, isProto3 bool, prefix string, fld *dpb.FieldDescriptorProto) error { + scope := fmt.Sprintf("field %s%s", prefix, fld.GetName()) + + node := res.getFieldNode(fld) + if isProto3 { + if fld.GetType() == dpb.FieldDescriptorProto_TYPE_GROUP { + n := node.(*groupNode) + if err := res.errs.handleErrorWithPos(n.groupKeyword.start(), "%s: groups are not allowed in proto3", scope); err != nil { + return err + } + } else if fld.Label != nil && fld.GetLabel() != dpb.FieldDescriptorProto_LABEL_REPEATED { + if err := res.errs.handleErrorWithPos(node.fieldLabel().start(), "%s: field has label %v, but proto3 must omit labels other than 'repeated'", scope, fld.GetLabel()); err != nil { + return err + } + } + if index, err := findOption(res, scope, fld.Options.GetUninterpretedOption(), "default"); err != nil { + return err + } else if index >= 0 { + optNode := res.getOptionNode(fld.Options.GetUninterpretedOption()[index]) + if err := res.errs.handleErrorWithPos(optNode.getName().start(), "%s: default values are not allowed in proto3", scope); err != nil { + return err + } + } + } else { + if fld.Label == nil && fld.OneofIndex == nil { + if err := res.errs.handleErrorWithPos(node.fieldName().start(), "%s: field has no label, but proto2 must indicate 'optional' or 'required'", scope); err != nil { + return err + } + } + if fld.GetExtendee() != "" && fld.Label != nil && fld.GetLabel() == dpb.FieldDescriptorProto_LABEL_REQUIRED { + if err := res.errs.handleErrorWithPos(node.fieldLabel().start(), "%s: extension fields cannot be 'required'", scope); err != nil { + return err + } + } + } + + // finally, set any missing label to optional + if fld.Label == nil { + fld.Label = dpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum() + } + + return nil +} + +type tagRange struct { + start int32 + end int32 + node rangeDecl +} + +type tagRanges []tagRange + +func (r tagRanges) Len() int { + return len(r) +} + +func (r tagRanges) Less(i, j int) bool { + return r[i].start < r[j].start || + (r[i].start == r[j].start && r[i].end < r[j].end) +} + +func (r tagRanges) Swap(i, j int) { + r[i], r[j] = r[j], r[i] +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/binary.go b/vendor/github.com/jhump/protoreflect/dynamic/binary.go new file mode 100644 index 00000000..91fd6723 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/binary.go @@ -0,0 +1,185 @@ +package dynamic + +// Binary serialization and de-serialization for dynamic messages + +import ( + "fmt" + "github.com/golang/protobuf/proto" + "github.com/jhump/protoreflect/codec" + "io" +) + +// defaultDeterminism, if true, will mean that calls to Marshal will produce +// deterministic output. This is used to make the output of proto.Marshal(...) +// deterministic (since there is no way to have that convey determinism intent). +// **This is only used from tests.** +var defaultDeterminism = false + +// Marshal serializes this message to bytes, returning an error if the operation +// fails. The resulting bytes are in the standard protocol buffer binary format. +func (m *Message) Marshal() ([]byte, error) { + var b codec.Buffer + b.SetDeterministic(defaultDeterminism) + if err := m.marshal(&b); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// MarshalAppend behaves exactly the same as Marshal, except instead of allocating a +// new byte slice to marshal into, it uses the provided byte slice. The backing array +// for the returned byte slice *may* be the same as the one that was passed in, but +// it's not guaranteed as a new backing array will automatically be allocated if +// more bytes need to be written than the provided buffer has capacity for. +func (m *Message) MarshalAppend(b []byte) ([]byte, error) { + codedBuf := codec.NewBuffer(b) + codedBuf.SetDeterministic(defaultDeterminism) + if err := m.marshal(codedBuf); err != nil { + return nil, err + } + return codedBuf.Bytes(), nil +} + +// MarshalDeterministic serializes this message to bytes in a deterministic way, +// returning an error if the operation fails. This differs from Marshal in that +// map keys will be sorted before serializing to bytes. The protobuf spec does +// not define ordering for map entries, so Marshal will use standard Go map +// iteration order (which will be random). But for cases where determinism is +// more important than performance, use this method instead. +func (m *Message) MarshalDeterministic() ([]byte, error) { + var b codec.Buffer + b.SetDeterministic(true) + if err := m.marshal(&b); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// MarshalAppendDeterministic behaves exactly the same as MarshalDeterministic, +// except instead of allocating a new byte slice to marshal into, it uses the +// provided byte slice. The backing array for the returned byte slice *may* be +// the same as the one that was passed in, but it's not guaranteed as a new +// backing array will automatically be allocated if more bytes need to be written +// than the provided buffer has capacity for. +func (m *Message) MarshalAppendDeterministic(b []byte) ([]byte, error) { + codedBuf := codec.NewBuffer(b) + codedBuf.SetDeterministic(true) + if err := m.marshal(codedBuf); err != nil { + return nil, err + } + return codedBuf.Bytes(), nil +} + +func (m *Message) marshal(b *codec.Buffer) error { + if err := m.marshalKnownFields(b); err != nil { + return err + } + return m.marshalUnknownFields(b) +} + +func (m *Message) marshalKnownFields(b *codec.Buffer) error { + for _, tag := range m.knownFieldTags() { + itag := int32(tag) + val := m.values[itag] + fd := m.FindFieldDescriptor(itag) + if fd == nil { + panic(fmt.Sprintf("Couldn't find field for tag %d", itag)) + } + if err := b.EncodeFieldValue(fd, val); err != nil { + return err + } + } + return nil +} + +func (m *Message) marshalUnknownFields(b *codec.Buffer) error { + for _, tag := range m.unknownFieldTags() { + itag := int32(tag) + sl := m.unknownFields[itag] + for _, u := range sl { + if err := b.EncodeTagAndWireType(itag, u.Encoding); err != nil { + return err + } + switch u.Encoding { + case proto.WireBytes: + if err := b.EncodeRawBytes(u.Contents); err != nil { + return err + } + case proto.WireStartGroup: + _, _ = b.Write(u.Contents) + if err := b.EncodeTagAndWireType(itag, proto.WireEndGroup); err != nil { + return err + } + case proto.WireFixed32: + if err := b.EncodeFixed32(u.Value); err != nil { + return err + } + case proto.WireFixed64: + if err := b.EncodeFixed64(u.Value); err != nil { + return err + } + case proto.WireVarint: + if err := b.EncodeVarint(u.Value); err != nil { + return err + } + default: + return codec.ErrBadWireType + } + } + } + return nil +} + +// Unmarshal de-serializes the message that is present in the given bytes into +// this message. It first resets the current message. It returns an error if the +// given bytes do not contain a valid encoding of this message type. +func (m *Message) Unmarshal(b []byte) error { + m.Reset() + if err := m.UnmarshalMerge(b); err != nil { + return err + } + return m.Validate() +} + +// UnmarshalMerge de-serializes the message that is present in the given bytes +// into this message. Unlike Unmarshal, it does not first reset the message, +// instead merging the data in the given bytes into the existing data in this +// message. +func (m *Message) UnmarshalMerge(b []byte) error { + return m.unmarshal(codec.NewBuffer(b), false) +} + +func (m *Message) unmarshal(buf *codec.Buffer, isGroup bool) error { + for !buf.EOF() { + fd, val, err := buf.DecodeFieldValue(m.FindFieldDescriptor, m.mf) + if err != nil { + if err == codec.ErrWireTypeEndGroup { + if isGroup { + // finished parsing group + return nil + } + return codec.ErrBadWireType + } + return err + } + + if fd == nil { + if m.unknownFields == nil { + m.unknownFields = map[int32][]UnknownField{} + } + uv := val.(codec.UnknownField) + u := UnknownField{ + Encoding: uv.Encoding, + Value: uv.Value, + Contents: uv.Contents, + } + m.unknownFields[uv.Tag] = append(m.unknownFields[uv.Tag], u) + } else if err := mergeField(m, fd, val); err != nil { + return err + } + } + if isGroup { + return io.ErrUnexpectedEOF + } + return nil +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/doc.go b/vendor/github.com/jhump/protoreflect/dynamic/doc.go new file mode 100644 index 00000000..c329fcdc --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/doc.go @@ -0,0 +1,163 @@ +// Package dynamic provides an implementation for a dynamic protobuf message. +// +// The dynamic message is essentially a message descriptor along with a map of +// tag numbers to values. It has a broad API for interacting with the message, +// including inspection and modification. Generally, most operations have two +// forms: a regular method that panics on bad input or error and a "Try" form +// of the method that will instead return an error. +// +// A dynamic message can optionally be constructed with a MessageFactory. The +// MessageFactory has various registries that may be used by the dynamic message, +// such as during de-serialization. The message factory is "inherited" by any +// other dynamic messages created, such as nested messages that are created +// during de-serialization. Similarly, any dynamic message created using +// MessageFactory.NewMessage will be associated with that factory, which in turn +// will be used to create other messages or parse extension fields during +// de-serialization. +// +// +// Field Types +// +// The types of values expected by setters and returned by getters are the +// same as protoc generates for scalar fields. For repeated fields, there are +// methods for getting and setting values at a particular index or for adding +// an element. Similarly, for map fields, there are methods for getting and +// setting values for a particular key. +// +// If you use GetField for a repeated field, it will return a copy of all +// elements as a slice []interface{}. Similarly, using GetField for a map field +// will return a copy of all mappings as a map[interface{}]interface{}. You can +// also use SetField to supply an entire slice or map for repeated or map fields. +// The slice need not be []interface{} but can actually be typed according to +// the field's expected type. For example, a repeated uint64 field can be set +// using a slice of type []uint64. +// +// Descriptors for map fields describe them as repeated fields with a nested +// message type. The nested message type is a special generated type that +// represents a single mapping: key and value pair. The dynamic message has some +// special affordances for this representation. For example, you can use +// SetField to set a map field using a slice of these entry messages. Internally, +// the slice of entries will be converted to an actual map. Similarly, you can +// use AddRepeatedField with an entry message to add (or overwrite) a mapping. +// However, you cannot use GetRepeatedField or SetRepeatedField to modify maps, +// since those take numeric index arguments which are not relevant to maps +// (since maps in Go have no defined ordering). +// +// When setting field values in dynamic messages, the type-checking is lenient +// in that it accepts any named type with the right kind. So a string field can +// be assigned to any type that is defined as a string. Enum fields require +// int32 values (or any type that is defined as an int32). +// +// Unlike normal use of numeric values in Go, values will be automatically +// widened when assigned. So, for example, an int64 field can be set using an +// int32 value since it can be safely widened without truncation or loss of +// precision. Similar goes for uint32 values being converted to uint64 and +// float32 being converted to float64. Narrowing conversions are not done, +// however. Also, unsigned values will never be automatically converted to +// signed (and vice versa), and floating point values will never be +// automatically converted to integral values (and vice versa). Since the bit +// width of int and uint fields is allowed to be platform dependent, but will +// always be less than or equal to 64, they can only be used as values for +// int64 and uint64 fields, respectively. They cannot be used to set int32 or +// uint32 fields, which includes enums fields. +// +// Fields whose type is a nested message can have values set to either other +// dynamic messages or generated messages (e.g. pointers to structs generated by +// protoc). Getting a value for such a field will return the actual type it is +// set to (e.g. either a dynamic message or a generated message). If the value +// is not set and the message uses proto2 syntax, the default message returned +// will be whatever is returned by the dynamic message's MessageFactory (if the +// dynamic message was not created with a factory, it will use the logic of the +// zero value factory). In most typical cases, it will return a dynamic message, +// but if the factory is configured with a KnownTypeRegistry, or if the field's +// type is a well-known type, it will return a zero value generated message. +// +// +// Unrecognized Fields +// +// Unrecognized fields are preserved by the dynamic message when unmarshaling +// from the standard binary format. If the message's MessageFactory was +// configured with an ExtensionRegistry, it will be used to identify and parse +// extension fields for the message. +// +// Unrecognized fields can dynamically become recognized fields if the +// application attempts to retrieve an unrecognized field's value using a +// FieldDescriptor. In this case, the given FieldDescriptor is used to parse the +// unknown field and move the parsed value into the message's set of known +// fields. This behavior is most suited to the use of extensions, where an +// ExtensionRegistry is not setup with all known extensions ahead of time. But +// it can even happen for non-extension fields! Here's an example scenario where +// a non-extension field can initially be unknown and become known: +// +// 1. A dynamic message is created with a descriptor, A, and then +// de-serialized from a stream of bytes. The stream includes an +// unrecognized tag T. The message will include tag T in its unrecognized +// field set. +// 2. Another call site retrieves a newer descriptor, A', which includes a +// newly added field with tag T. +// 3. That other call site then uses a FieldDescriptor to access the value of +// the new field. This will cause the dynamic message to parse the bytes +// for the unknown tag T and store them as a known field. +// 4. Subsequent operations for tag T, including setting the field using only +// tag number or de-serializing a stream that includes tag T, will operate +// as if that tag were part of the original descriptor, A. +// +// +// Compatibility +// +// In addition to implementing the proto.Message interface, the included +// Message type also provides an XXX_MessageName() method, so it can work with +// proto.MessageName. And it provides a Descriptor() method that behaves just +// like the method of the same signature in messages generated by protoc. +// Because of this, it is actually compatible with proto.Message in many (though +// not all) contexts. In particular, it is compatible with proto.Marshal and +// proto.Unmarshal for serializing and de-serializing messages. +// +// The dynamic message supports binary and text marshaling, using protobuf's +// well-defined binary format and the same text format that protoc-generated +// types use. It also supports JSON serialization/de-serialization by +// implementing the json.Marshaler and json.Unmarshaler interfaces. And dynamic +// messages can safely be used with the jsonpb package for JSON serialization +// and de-serialization. +// +// In addition to implementing the proto.Message interface and numerous related +// methods, it also provides inter-op with generated messages via conversion. +// The ConvertTo, ConvertFrom, MergeInto, and MergeFrom methods copy message +// contents from a dynamic message to a generated message and vice versa. +// +// When copying from a generated message into a dynamic message, if the +// generated message contains fields unknown to the dynamic message (e.g. not +// present in the descriptor used to create the dynamic message), these fields +// become known to the dynamic message (as per behavior described above in +// "Unrecognized Fields"). If the generated message has unrecognized fields of +// its own, including unrecognized extensions, they are preserved in the dynamic +// message. It is possible that the dynamic message knows about fields that the +// generated message did not, like if it has a different version of the +// descriptor or its MessageFactory has an ExtensionRegistry that knows about +// different extensions than were linked into the program. In this case, these +// unrecognized fields in the generated message will be known fields in the +// dynamic message. +// +// Similarly, when copying from a dynamic message into a generated message, if +// the dynamic message has unrecognized fields they can be preserved in the +// generated message (currently only for syntax proto2 since proto3 generated +// messages do not preserve unrecognized fields). If the generated message knows +// about fields that the dynamic message does not, these unrecognized fields may +// become known fields in the generated message. +// +// +// Registries +// +// This package also contains a couple of registries, for managing known types +// and descriptors. +// +// The KnownTypeRegistry allows de-serialization of a dynamic message to use +// generated message types, instead of dynamic messages, for some kinds of +// nested message fields. This is particularly useful for working with proto +// messages that have special encodings as JSON (e.g. the well-known types), +// since the dynamic message does not try to handle these special cases in its +// JSON marshaling facilities. +// +// The ExtensionRegistry allows for recognizing and parsing extensions fields +// (for proto2 messages). +package dynamic diff --git a/vendor/github.com/jhump/protoreflect/dynamic/dynamic_message.go b/vendor/github.com/jhump/protoreflect/dynamic/dynamic_message.go new file mode 100644 index 00000000..513971e7 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/dynamic_message.go @@ -0,0 +1,2741 @@ +package dynamic + +import ( + "bytes" + "compress/gzip" + "errors" + "fmt" + "reflect" + "sort" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/codec" + "github.com/jhump/protoreflect/desc" + "github.com/jhump/protoreflect/internal" +) + +// ErrUnknownTagNumber is an error that is returned when an operation refers +// to an unknown tag number. +var ErrUnknownTagNumber = errors.New("unknown tag number") + +// UnknownTagNumberError is the same as ErrUnknownTagNumber. +// Deprecated: use ErrUnknownTagNumber +var UnknownTagNumberError = ErrUnknownTagNumber + +// ErrUnknownFieldName is an error that is returned when an operation refers +// to an unknown field name. +var ErrUnknownFieldName = errors.New("unknown field name") + +// UnknownFieldNameError is the same as ErrUnknownFieldName. +// Deprecated: use ErrUnknownFieldName +var UnknownFieldNameError = ErrUnknownFieldName + +// ErrFieldIsNotMap is an error that is returned when map-related operations +// are attempted with fields that are not maps. +var ErrFieldIsNotMap = errors.New("field is not a map type") + +// FieldIsNotMapError is the same as ErrFieldIsNotMap. +// Deprecated: use ErrFieldIsNotMap +var FieldIsNotMapError = ErrFieldIsNotMap + +// ErrFieldIsNotRepeated is an error that is returned when repeated field +// operations are attempted with fields that are not repeated. +var ErrFieldIsNotRepeated = errors.New("field is not repeated") + +// FieldIsNotRepeatedError is the same as ErrFieldIsNotRepeated. +// Deprecated: use ErrFieldIsNotRepeated +var FieldIsNotRepeatedError = ErrFieldIsNotRepeated + +// ErrIndexOutOfRange is an error that is returned when an invalid index is +// provided when access a single element of a repeated field. +var ErrIndexOutOfRange = errors.New("index is out of range") + +// IndexOutOfRangeError is the same as ErrIndexOutOfRange. +// Deprecated: use ErrIndexOutOfRange +var IndexOutOfRangeError = ErrIndexOutOfRange + +// ErrNumericOverflow is an error returned by operations that encounter a +// numeric value that is too large, for example de-serializing a value into an +// int32 field when the value is larger that can fit into a 32-bit value. +var ErrNumericOverflow = errors.New("numeric value is out of range") + +// NumericOverflowError is the same as ErrNumericOverflow. +// Deprecated: use ErrNumericOverflow +var NumericOverflowError = ErrNumericOverflow + +var typeOfProtoMessage = reflect.TypeOf((*proto.Message)(nil)).Elem() +var typeOfDynamicMessage = reflect.TypeOf((*Message)(nil)) +var typeOfBytes = reflect.TypeOf(([]byte)(nil)) + +// Message is a dynamic protobuf message. Instead of a generated struct, +// like most protobuf messages, this is a map of field number to values and +// a message descriptor, which is used to validate the field values and +// also to de-serialize messages (from the standard binary format, as well +// as from the text format and from JSON). +type Message struct { + md *desc.MessageDescriptor + er *ExtensionRegistry + mf *MessageFactory + extraFields map[int32]*desc.FieldDescriptor + values map[int32]interface{} + unknownFields map[int32][]UnknownField +} + +// UnknownField represents a field that was parsed from the binary wire +// format for a message, but was not a recognized field number. Enough +// information is preserved so that re-serializing the message won't lose +// any of the unrecognized data. +type UnknownField struct { + // Encoding indicates how the unknown field was encoded on the wire. If it + // is proto.WireBytes or proto.WireGroupStart then Contents will be set to + // the raw bytes. If it is proto.WireTypeFixed32 then the data is in the least + // significant 32 bits of Value. Otherwise, the data is in all 64 bits of + // Value. + Encoding int8 + Contents []byte + Value uint64 +} + +// NewMessage creates a new dynamic message for the type represented by the given +// message descriptor. During de-serialization, a default MessageFactory is used to +// instantiate any nested message fields and no extension fields will be parsed. To +// use a custom MessageFactory or ExtensionRegistry, use MessageFactory.NewMessage. +func NewMessage(md *desc.MessageDescriptor) *Message { + return NewMessageWithMessageFactory(md, nil) +} + +// NewMessageWithExtensionRegistry creates a new dynamic message for the type +// represented by the given message descriptor. During de-serialization, the given +// ExtensionRegistry is used to parse extension fields and nested messages will be +// instantiated using dynamic.NewMessageFactoryWithExtensionRegistry(er). +func NewMessageWithExtensionRegistry(md *desc.MessageDescriptor, er *ExtensionRegistry) *Message { + mf := NewMessageFactoryWithExtensionRegistry(er) + return NewMessageWithMessageFactory(md, mf) +} + +// NewMessageWithMessageFactory creates a new dynamic message for the type +// represented by the given message descriptor. During de-serialization, the given +// MessageFactory is used to instantiate nested messages. +func NewMessageWithMessageFactory(md *desc.MessageDescriptor, mf *MessageFactory) *Message { + var er *ExtensionRegistry + if mf != nil { + er = mf.er + } + return &Message{ + md: md, + mf: mf, + er: er, + } +} + +// AsDynamicMessage converts the given message to a dynamic message. If the +// given message is dynamic, it is returned. Otherwise, a dynamic message is +// created using NewMessage. +func AsDynamicMessage(msg proto.Message) (*Message, error) { + return AsDynamicMessageWithMessageFactory(msg, nil) +} + +// AsDynamicMessageWithExtensionRegistry converts the given message to a dynamic +// message. If the given message is dynamic, it is returned. Otherwise, a +// dynamic message is created using NewMessageWithExtensionRegistry. +func AsDynamicMessageWithExtensionRegistry(msg proto.Message, er *ExtensionRegistry) (*Message, error) { + mf := NewMessageFactoryWithExtensionRegistry(er) + return AsDynamicMessageWithMessageFactory(msg, mf) +} + +// AsDynamicMessageWithMessageFactory converts the given message to a dynamic +// message. If the given message is dynamic, it is returned. Otherwise, a +// dynamic message is created using NewMessageWithMessageFactory. +func AsDynamicMessageWithMessageFactory(msg proto.Message, mf *MessageFactory) (*Message, error) { + if dm, ok := msg.(*Message); ok { + return dm, nil + } + md, err := desc.LoadMessageDescriptorForMessage(msg) + if err != nil { + return nil, err + } + dm := NewMessageWithMessageFactory(md, mf) + err = dm.mergeFrom(msg) + if err != nil { + return nil, err + } + return dm, nil +} + +// GetMessageDescriptor returns a descriptor for this message's type. +func (m *Message) GetMessageDescriptor() *desc.MessageDescriptor { + return m.md +} + +// GetKnownFields returns a slice of descriptors for all known fields. The +// fields will not be in any defined order. +func (m *Message) GetKnownFields() []*desc.FieldDescriptor { + if len(m.extraFields) == 0 { + return m.md.GetFields() + } + flds := make([]*desc.FieldDescriptor, len(m.md.GetFields()), len(m.md.GetFields())+len(m.extraFields)) + copy(flds, m.md.GetFields()) + for _, fld := range m.extraFields { + if !fld.IsExtension() { + flds = append(flds, fld) + } + } + return flds +} + +// GetKnownExtensions returns a slice of descriptors for all extensions known by +// the message's extension registry. The fields will not be in any defined order. +func (m *Message) GetKnownExtensions() []*desc.FieldDescriptor { + if !m.md.IsExtendable() { + return nil + } + exts := m.er.AllExtensionsForType(m.md.GetFullyQualifiedName()) + for _, fld := range m.extraFields { + if fld.IsExtension() { + exts = append(exts, fld) + } + } + return exts +} + +// GetUnknownFields returns a slice of tag numbers for all unknown fields that +// this message contains. The tags will not be in any defined order. +func (m *Message) GetUnknownFields() []int32 { + flds := make([]int32, 0, len(m.unknownFields)) + for tag := range m.unknownFields { + flds = append(flds, tag) + } + return flds +} + +// Descriptor returns the serialized form of the file descriptor in which the +// message was defined and a path to the message type therein. This mimics the +// method of the same name on message types generated by protoc. +func (m *Message) Descriptor() ([]byte, []int) { + // get encoded file descriptor + b, err := proto.Marshal(m.md.GetFile().AsProto()) + if err != nil { + panic(fmt.Sprintf("failed to get encoded descriptor for %s: %v", m.md.GetFile().GetName(), err)) + } + var zippedBytes bytes.Buffer + w := gzip.NewWriter(&zippedBytes) + if _, err := w.Write(b); err != nil { + panic(fmt.Sprintf("failed to get encoded descriptor for %s: %v", m.md.GetFile().GetName(), err)) + } + if err := w.Close(); err != nil { + panic(fmt.Sprintf("failed to get an encoded descriptor for %s: %v", m.md.GetFile().GetName(), err)) + } + + // and path to message + path := []int{} + var d desc.Descriptor + name := m.md.GetFullyQualifiedName() + for d = m.md.GetParent(); d != nil; name, d = d.GetFullyQualifiedName(), d.GetParent() { + found := false + switch d := d.(type) { + case (*desc.FileDescriptor): + for i, md := range d.GetMessageTypes() { + if md.GetFullyQualifiedName() == name { + found = true + path = append(path, i) + } + } + case (*desc.MessageDescriptor): + for i, md := range d.GetNestedMessageTypes() { + if md.GetFullyQualifiedName() == name { + found = true + path = append(path, i) + } + } + } + if !found { + panic(fmt.Sprintf("failed to compute descriptor path for %s", m.md.GetFullyQualifiedName())) + } + } + // reverse the path + i := 0 + j := len(path) - 1 + for i < j { + path[i], path[j] = path[j], path[i] + i++ + j-- + } + + return zippedBytes.Bytes(), path +} + +// XXX_MessageName returns the fully qualified name of this message's type. This +// allows dynamic messages to be used with proto.MessageName. +func (m *Message) XXX_MessageName() string { + return m.md.GetFullyQualifiedName() +} + +// FindFieldDescriptor returns a field descriptor for the given tag number. This +// searches known fields in the descriptor, known fields discovered during calls +// to GetField or SetField, and extension fields known by the message's extension +// registry. It returns nil if the tag is unknown. +func (m *Message) FindFieldDescriptor(tagNumber int32) *desc.FieldDescriptor { + fd := m.md.FindFieldByNumber(tagNumber) + if fd != nil { + return fd + } + fd = m.er.FindExtension(m.md.GetFullyQualifiedName(), tagNumber) + if fd != nil { + return fd + } + return m.extraFields[tagNumber] +} + +// FindFieldDescriptorByName returns a field descriptor for the given field +// name. This searches known fields in the descriptor, known fields discovered +// during calls to GetField or SetField, and extension fields known by the +// message's extension registry. It returns nil if the name is unknown. If the +// given name refers to an extension, it should be fully qualified and may be +// optionally enclosed in parentheses or brackets. +func (m *Message) FindFieldDescriptorByName(name string) *desc.FieldDescriptor { + if name == "" { + return nil + } + fd := m.md.FindFieldByName(name) + if fd != nil { + return fd + } + mustBeExt := false + if name[0] == '(' { + if name[len(name)-1] != ')' { + // malformed name + return nil + } + mustBeExt = true + name = name[1 : len(name)-1] + } else if name[0] == '[' { + if name[len(name)-1] != ']' { + // malformed name + return nil + } + mustBeExt = true + name = name[1 : len(name)-1] + } + fd = m.er.FindExtensionByName(m.md.GetFullyQualifiedName(), name) + if fd != nil { + return fd + } + for _, fd := range m.extraFields { + if fd.IsExtension() && name == fd.GetFullyQualifiedName() { + return fd + } else if !mustBeExt && !fd.IsExtension() && name == fd.GetName() { + return fd + } + } + + return nil +} + +// FindFieldDescriptorByJSONName returns a field descriptor for the given JSON +// name. This searches known fields in the descriptor, known fields discovered +// during calls to GetField or SetField, and extension fields known by the +// message's extension registry. If no field matches the given JSON name, it +// will fall back to searching field names (e.g. FindFieldDescriptorByName). If +// this also yields no match, nil is returned. +func (m *Message) FindFieldDescriptorByJSONName(name string) *desc.FieldDescriptor { + if name == "" { + return nil + } + fd := m.md.FindFieldByJSONName(name) + if fd != nil { + return fd + } + mustBeExt := false + if name[0] == '(' { + if name[len(name)-1] != ')' { + // malformed name + return nil + } + mustBeExt = true + name = name[1 : len(name)-1] + } else if name[0] == '[' { + if name[len(name)-1] != ']' { + // malformed name + return nil + } + mustBeExt = true + name = name[1 : len(name)-1] + } + fd = m.er.FindExtensionByJSONName(m.md.GetFullyQualifiedName(), name) + if fd != nil { + return fd + } + for _, fd := range m.extraFields { + if fd.IsExtension() && name == fd.GetFullyQualifiedJSONName() { + return fd + } else if !mustBeExt && !fd.IsExtension() && name == fd.GetJSONName() { + return fd + } + } + + // try non-JSON names + return m.FindFieldDescriptorByName(name) +} + +func (m *Message) checkField(fd *desc.FieldDescriptor) error { + return checkField(fd, m.md) +} + +func checkField(fd *desc.FieldDescriptor, md *desc.MessageDescriptor) error { + if fd.GetOwner().GetFullyQualifiedName() != md.GetFullyQualifiedName() { + return fmt.Errorf("given field, %s, is for wrong message type: %s; expecting %s", fd.GetName(), fd.GetOwner().GetFullyQualifiedName(), md.GetFullyQualifiedName()) + } + if fd.IsExtension() && !md.IsExtension(fd.GetNumber()) { + return fmt.Errorf("given field, %s, is an extension but is not in message extension range: %v", fd.GetFullyQualifiedName(), md.GetExtensionRanges()) + } + return nil +} + +// GetField returns the value for the given field descriptor. It panics if an +// error is encountered. See TryGetField. +func (m *Message) GetField(fd *desc.FieldDescriptor) interface{} { + if v, err := m.TryGetField(fd); err != nil { + panic(err.Error()) + } else { + return v + } +} + +// TryGetField returns the value for the given field descriptor. An error is +// returned if the given field descriptor does not belong to the right message +// type. +// +// The Go type of the returned value, for scalar fields, is the same as protoc +// would generate for the field (in a non-dynamic message). The table below +// lists the scalar types and the corresponding Go types. +// +-------------------------+-----------+ +// | Declared Type | Go Type | +// +-------------------------+-----------+ +// | int32, sint32, sfixed32 | int32 | +// | int64, sint64, sfixed64 | int64 | +// | uint32, fixed32 | uint32 | +// | uint64, fixed64 | uint64 | +// | float | float32 | +// | double | double32 | +// | bool | bool | +// | string | string | +// | bytes | []byte | +// +-------------------------+-----------+ +// +// Values for enum fields will always be int32 values. You can use the enum +// descriptor associated with the field to lookup value names with those values. +// Values for message type fields may be an instance of the generated type *or* +// may be another *dynamic.Message that represents the type. +// +// If the given field is a map field, the returned type will be +// map[interface{}]interface{}. The actual concrete types of keys and values is +// as described above. If the given field is a (non-map) repeated field, the +// returned type is always []interface{}; the type of the actual elements is as +// described above. +// +// If this message has no value for the given field, its default value is +// returned. If the message is defined in a file with "proto3" syntax, the +// default is always the zero value for the field. The default value for map and +// repeated fields is a nil map or slice (respectively). For field's whose types +// is a message, the default value is an empty message for "proto2" syntax or a +// nil message for "proto3" syntax. Note that the in the latter case, a non-nil +// interface with a nil pointer is returned, not a nil interface. Also note that +// whether the returned value is an empty message or nil depends on if *this* +// message was defined as "proto3" syntax, not the message type referred to by +// the field's type. +// +// If the given field descriptor is not known (e.g. not present in the message +// descriptor) but corresponds to an unknown field, the unknown value will be +// parsed and become known. The parsed value will be returned, or an error will +// be returned if the unknown value cannot be parsed according to the field +// descriptor's type information. +func (m *Message) TryGetField(fd *desc.FieldDescriptor) (interface{}, error) { + if err := m.checkField(fd); err != nil { + return nil, err + } + return m.getField(fd) +} + +// GetFieldByName returns the value for the field with the given name. It panics +// if an error is encountered. See TryGetFieldByName. +func (m *Message) GetFieldByName(name string) interface{} { + if v, err := m.TryGetFieldByName(name); err != nil { + panic(err.Error()) + } else { + return v + } +} + +// TryGetFieldByName returns the value for the field with the given name. An +// error is returned if the given name is unknown. If the given name refers to +// an extension field, it should be fully qualified and optionally enclosed in +// parenthesis or brackets. +// +// If this message has no value for the given field, its default value is +// returned. (See TryGetField for more info on types and default field values.) +func (m *Message) TryGetFieldByName(name string) (interface{}, error) { + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return nil, UnknownFieldNameError + } + return m.getField(fd) +} + +// GetFieldByNumber returns the value for the field with the given tag number. +// It panics if an error is encountered. See TryGetFieldByNumber. +func (m *Message) GetFieldByNumber(tagNumber int) interface{} { + if v, err := m.TryGetFieldByNumber(tagNumber); err != nil { + panic(err.Error()) + } else { + return v + } +} + +// TryGetFieldByNumber returns the value for the field with the given tag +// number. An error is returned if the given tag is unknown. +// +// If this message has no value for the given field, its default value is +// returned. (See TryGetField for more info on types and default field values.) +func (m *Message) TryGetFieldByNumber(tagNumber int) (interface{}, error) { + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return nil, UnknownTagNumberError + } + return m.getField(fd) +} + +func (m *Message) getField(fd *desc.FieldDescriptor) (interface{}, error) { + return m.doGetField(fd, false) +} + +func (m *Message) doGetField(fd *desc.FieldDescriptor, nilIfAbsent bool) (interface{}, error) { + res := m.values[fd.GetNumber()] + if res == nil { + var err error + if res, err = m.parseUnknownField(fd); err != nil { + return nil, err + } + if res == nil { + if nilIfAbsent { + return nil, nil + } else { + def := fd.GetDefaultValue() + if def != nil { + return def, nil + } + // GetDefaultValue only returns nil for message types + md := fd.GetMessageType() + if m.md.IsProto3() { + return nilMessage(md), nil + } else { + // for proto2, return default instance of message + return m.mf.NewMessage(md), nil + } + } + } + } + rt := reflect.TypeOf(res) + if rt.Kind() == reflect.Map { + // make defensive copies to prevent caller from storing illegal keys and values + m := res.(map[interface{}]interface{}) + res := map[interface{}]interface{}{} + for k, v := range m { + res[k] = v + } + return res, nil + } else if rt.Kind() == reflect.Slice && rt != typeOfBytes { + // make defensive copies to prevent caller from storing illegal elements + sl := res.([]interface{}) + res := make([]interface{}, len(sl)) + copy(res, sl) + return res, nil + } + return res, nil +} + +func nilMessage(md *desc.MessageDescriptor) interface{} { + // try to return a proper nil pointer + msgType := proto.MessageType(md.GetFullyQualifiedName()) + if msgType != nil && msgType.Implements(typeOfProtoMessage) { + return reflect.Zero(msgType).Interface().(proto.Message) + } + // fallback to nil dynamic message pointer + return (*Message)(nil) +} + +// HasField returns true if this message has a value for the given field. If the +// given field is not valid (e.g. belongs to a different message type), false is +// returned. If this message is defined in a file with "proto3" syntax, this +// will return false even if a field was explicitly assigned its zero value (the +// zero values for a field are intentionally indistinguishable from absent). +func (m *Message) HasField(fd *desc.FieldDescriptor) bool { + if err := m.checkField(fd); err != nil { + return false + } + return m.HasFieldNumber(int(fd.GetNumber())) +} + +// HasFieldName returns true if this message has a value for a field with the +// given name. If the given name is unknown, this returns false. +func (m *Message) HasFieldName(name string) bool { + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return false + } + return m.HasFieldNumber(int(fd.GetNumber())) +} + +// HasFieldNumber returns true if this message has a value for a field with the +// given tag number. If the given tag is unknown, this returns false. +func (m *Message) HasFieldNumber(tagNumber int) bool { + if _, ok := m.values[int32(tagNumber)]; ok { + return true + } + _, ok := m.unknownFields[int32(tagNumber)] + return ok +} + +// SetField sets the value for the given field descriptor to the given value. It +// panics if an error is encountered. See TrySetField. +func (m *Message) SetField(fd *desc.FieldDescriptor, val interface{}) { + if err := m.TrySetField(fd, val); err != nil { + panic(err.Error()) + } +} + +// TrySetField sets the value for the given field descriptor to the given value. +// An error is returned if the given field descriptor does not belong to the +// right message type or if the given value is not a correct/compatible type for +// the given field. +// +// The Go type expected for a field is the same as TryGetField would return for +// the field. So message values can be supplied as either the correct generated +// message type or as a *dynamic.Message. +// +// Since it is cumbersome to work with dynamic messages, some concessions are +// made to simplify usage regarding types: +// +// 1. If a numeric type is provided that can be converted *without loss or +// overflow*, it is accepted. This allows for setting int64 fields using int +// or int32 values. Similarly for uint64 with uint and uint32 values and for +// float64 fields with float32 values. +// 2. The value can be a named type, as long as its underlying type is correct. +// 3. Map and repeated fields can be set using any kind of concrete map or +// slice type, as long as the values within are all of the correct type. So +// a field defined as a 'map` can be set using a +// map[string]int32, a map[string]interface{}, or even a +// map[interface{}]interface{}. +// 4. Finally, dynamic code that chooses to not treat maps as a special-case +// find that they can set map fields using a slice where each element is a +// message that matches the implicit map-entry field message type. +// +// If the given field descriptor is not known (e.g. not present in the message +// descriptor) it will become known. Subsequent operations using tag numbers or +// names will be able to resolve the newly-known type. If the message has a +// value for the unknown value, it is cleared, replaced by the given known +// value. +func (m *Message) TrySetField(fd *desc.FieldDescriptor, val interface{}) error { + if err := m.checkField(fd); err != nil { + return err + } + return m.setField(fd, val) +} + +// SetFieldByName sets the value for the field with the given name to the given +// value. It panics if an error is encountered. See TrySetFieldByName. +func (m *Message) SetFieldByName(name string, val interface{}) { + if err := m.TrySetFieldByName(name, val); err != nil { + panic(err.Error()) + } +} + +// TrySetFieldByName sets the value for the field with the given name to the +// given value. An error is returned if the given name is unknown or if the +// given value has an incorrect type. If the given name refers to an extension +// field, it should be fully qualified and optionally enclosed in parenthesis or +// brackets. +// +// (See TrySetField for more info on types.) +func (m *Message) TrySetFieldByName(name string, val interface{}) error { + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return UnknownFieldNameError + } + return m.setField(fd, val) +} + +// SetFieldByNumber sets the value for the field with the given tag number to +// the given value. It panics if an error is encountered. See +// TrySetFieldByNumber. +func (m *Message) SetFieldByNumber(tagNumber int, val interface{}) { + if err := m.TrySetFieldByNumber(tagNumber, val); err != nil { + panic(err.Error()) + } +} + +// TrySetFieldByNumber sets the value for the field with the given tag number to +// the given value. An error is returned if the given tag is unknown or if the +// given value has an incorrect type. +// +// (See TrySetField for more info on types.) +func (m *Message) TrySetFieldByNumber(tagNumber int, val interface{}) error { + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return UnknownTagNumberError + } + return m.setField(fd, val) +} + +func (m *Message) setField(fd *desc.FieldDescriptor, val interface{}) error { + var err error + if val, err = validFieldValue(fd, val); err != nil { + return err + } + m.internalSetField(fd, val) + return nil +} + +func (m *Message) internalSetField(fd *desc.FieldDescriptor, val interface{}) { + if fd.IsRepeated() { + // Unset fields and zero-length fields are indistinguishable, in both + // proto2 and proto3 syntax + if reflect.ValueOf(val).Len() == 0 { + if m.values != nil { + delete(m.values, fd.GetNumber()) + } + return + } + } else if m.md.IsProto3() && fd.GetOneOf() == nil { + // proto3 considers fields that are set to their zero value as unset + // (we already handled repeated fields above) + var equal bool + if b, ok := val.([]byte); ok { + // can't compare slices, so we have to special-case []byte values + equal = ok && bytes.Equal(b, fd.GetDefaultValue().([]byte)) + } else { + defVal := fd.GetDefaultValue() + equal = defVal == val + if !equal && defVal == nil { + // above just checks if value is the nil interface, + // but we should also test if the given value is a + // nil pointer + rv := reflect.ValueOf(val) + if rv.Kind() == reflect.Ptr && rv.IsNil() { + equal = true + } + } + } + if equal { + if m.values != nil { + delete(m.values, fd.GetNumber()) + } + return + } + } + if m.values == nil { + m.values = map[int32]interface{}{} + } + m.values[fd.GetNumber()] = val + // if this field is part of a one-of, make sure all other one-of choices are cleared + od := fd.GetOneOf() + if od != nil { + for _, other := range od.GetChoices() { + if other.GetNumber() != fd.GetNumber() { + delete(m.values, other.GetNumber()) + } + } + } + // also clear any unknown fields + if m.unknownFields != nil { + delete(m.unknownFields, fd.GetNumber()) + } + // and add this field if it was previously unknown + if existing := m.FindFieldDescriptor(fd.GetNumber()); existing == nil { + m.addField(fd) + } +} + +func (m *Message) addField(fd *desc.FieldDescriptor) { + if m.extraFields == nil { + m.extraFields = map[int32]*desc.FieldDescriptor{} + } + m.extraFields[fd.GetNumber()] = fd +} + +// ClearField removes any value for the given field. It panics if an error is +// encountered. See TryClearField. +func (m *Message) ClearField(fd *desc.FieldDescriptor) { + if err := m.TryClearField(fd); err != nil { + panic(err.Error()) + } +} + +// TryClearField removes any value for the given field. An error is returned if +// the given field descriptor does not belong to the right message type. +func (m *Message) TryClearField(fd *desc.FieldDescriptor) error { + if err := m.checkField(fd); err != nil { + return err + } + m.clearField(fd) + return nil +} + +// ClearFieldByName removes any value for the field with the given name. It +// panics if an error is encountered. See TryClearFieldByName. +func (m *Message) ClearFieldByName(name string) { + if err := m.TryClearFieldByName(name); err != nil { + panic(err.Error()) + } +} + +// TryClearFieldByName removes any value for the field with the given name. An +// error is returned if the given name is unknown. If the given name refers to +// an extension field, it should be fully qualified and optionally enclosed in +// parenthesis or brackets. +func (m *Message) TryClearFieldByName(name string) error { + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return UnknownFieldNameError + } + m.clearField(fd) + return nil +} + +// ClearFieldByNumber removes any value for the field with the given tag number. +// It panics if an error is encountered. See TryClearFieldByNumber. +func (m *Message) ClearFieldByNumber(tagNumber int) { + if err := m.TryClearFieldByNumber(tagNumber); err != nil { + panic(err.Error()) + } +} + +// TryClearFieldByNumber removes any value for the field with the given tag +// number. An error is returned if the given tag is unknown. +func (m *Message) TryClearFieldByNumber(tagNumber int) error { + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return UnknownTagNumberError + } + m.clearField(fd) + return nil +} + +func (m *Message) clearField(fd *desc.FieldDescriptor) { + // clear value + if m.values != nil { + delete(m.values, fd.GetNumber()) + } + // also clear any unknown fields + if m.unknownFields != nil { + delete(m.unknownFields, fd.GetNumber()) + } + // and add this field if it was previously unknown + if existing := m.FindFieldDescriptor(fd.GetNumber()); existing == nil { + m.addField(fd) + } +} + +// GetOneOfField returns which of the given one-of's fields is set and the +// corresponding value. It panics if an error is encountered. See +// TryGetOneOfField. +func (m *Message) GetOneOfField(od *desc.OneOfDescriptor) (*desc.FieldDescriptor, interface{}) { + if fd, val, err := m.TryGetOneOfField(od); err != nil { + panic(err.Error()) + } else { + return fd, val + } +} + +// TryGetOneOfField returns which of the given one-of's fields is set and the +// corresponding value. An error is returned if the given one-of belongs to the +// wrong message type. If the given one-of has no field set, this method will +// return nil, nil. +// +// The type of the value, if one is set, is the same as would be returned by +// TryGetField using the returned field descriptor. +// +// Like with TryGetField, if the given one-of contains any fields that are not +// known (e.g. not present in this message's descriptor), they will become known +// and any unknown value will be parsed (and become a known value on success). +func (m *Message) TryGetOneOfField(od *desc.OneOfDescriptor) (*desc.FieldDescriptor, interface{}, error) { + if od.GetOwner().GetFullyQualifiedName() != m.md.GetFullyQualifiedName() { + return nil, nil, fmt.Errorf("given one-of, %s, is for wrong message type: %s; expecting %s", od.GetName(), od.GetOwner().GetFullyQualifiedName(), m.md.GetFullyQualifiedName()) + } + for _, fd := range od.GetChoices() { + val, err := m.doGetField(fd, true) + if err != nil { + return nil, nil, err + } + if val != nil { + return fd, val, nil + } + } + return nil, nil, nil +} + +// ClearOneOfField removes any value for any of the given one-of's fields. It +// panics if an error is encountered. See TryClearOneOfField. +func (m *Message) ClearOneOfField(od *desc.OneOfDescriptor) { + if err := m.TryClearOneOfField(od); err != nil { + panic(err.Error()) + } +} + +// TryClearOneOfField removes any value for any of the given one-of's fields. An +// error is returned if the given one-of descriptor does not belong to the right +// message type. +func (m *Message) TryClearOneOfField(od *desc.OneOfDescriptor) error { + if od.GetOwner().GetFullyQualifiedName() != m.md.GetFullyQualifiedName() { + return fmt.Errorf("given one-of, %s, is for wrong message type: %s; expecting %s", od.GetName(), od.GetOwner().GetFullyQualifiedName(), m.md.GetFullyQualifiedName()) + } + for _, fd := range od.GetChoices() { + m.clearField(fd) + } + return nil +} + +// GetMapField returns the value for the given map field descriptor and given +// key. It panics if an error is encountered. See TryGetMapField. +func (m *Message) GetMapField(fd *desc.FieldDescriptor, key interface{}) interface{} { + if v, err := m.TryGetMapField(fd, key); err != nil { + panic(err.Error()) + } else { + return v + } +} + +// TryGetMapField returns the value for the given map field descriptor and given +// key. An error is returned if the given field descriptor does not belong to +// the right message type or if it is not a map field. +// +// If the map field does not contain the requested key, this method returns +// nil, nil. The Go type of the value returned mirrors the type that protoc +// would generate for the field. (See TryGetField for more details on types). +// +// If the given field descriptor is not known (e.g. not present in the message +// descriptor) but corresponds to an unknown field, the unknown value will be +// parsed and become known. The parsed value will be searched for the requested +// key and any value returned. An error will be returned if the unknown value +// cannot be parsed according to the field descriptor's type information. +func (m *Message) TryGetMapField(fd *desc.FieldDescriptor, key interface{}) (interface{}, error) { + if err := m.checkField(fd); err != nil { + return nil, err + } + return m.getMapField(fd, key) +} + +// GetMapFieldByName returns the value for the map field with the given name and +// given key. It panics if an error is encountered. See TryGetMapFieldByName. +func (m *Message) GetMapFieldByName(name string, key interface{}) interface{} { + if v, err := m.TryGetMapFieldByName(name, key); err != nil { + panic(err.Error()) + } else { + return v + } +} + +// TryGetMapFieldByName returns the value for the map field with the given name +// and given key. An error is returned if the given name is unknown or if it +// names a field that is not a map field. +// +// If this message has no value for the given field or the value has no value +// for the requested key, then this method returns nil, nil. +// +// (See TryGetField for more info on types.) +func (m *Message) TryGetMapFieldByName(name string, key interface{}) (interface{}, error) { + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return nil, UnknownFieldNameError + } + return m.getMapField(fd, key) +} + +// GetMapFieldByNumber returns the value for the map field with the given tag +// number and given key. It panics if an error is encountered. See +// TryGetMapFieldByNumber. +func (m *Message) GetMapFieldByNumber(tagNumber int, key interface{}) interface{} { + if v, err := m.TryGetMapFieldByNumber(tagNumber, key); err != nil { + panic(err.Error()) + } else { + return v + } +} + +// TryGetMapFieldByNumber returns the value for the map field with the given tag +// number and given key. An error is returned if the given tag is unknown or if +// it indicates a field that is not a map field. +// +// If this message has no value for the given field or the value has no value +// for the requested key, then this method returns nil, nil. +// +// (See TryGetField for more info on types.) +func (m *Message) TryGetMapFieldByNumber(tagNumber int, key interface{}) (interface{}, error) { + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return nil, UnknownTagNumberError + } + return m.getMapField(fd, key) +} + +func (m *Message) getMapField(fd *desc.FieldDescriptor, key interface{}) (interface{}, error) { + if !fd.IsMap() { + return nil, FieldIsNotMapError + } + kfd := fd.GetMessageType().GetFields()[0] + ki, err := validElementFieldValue(kfd, key, false) + if err != nil { + return nil, err + } + mp := m.values[fd.GetNumber()] + if mp == nil { + if mp, err = m.parseUnknownField(fd); err != nil { + return nil, err + } else if mp == nil { + return nil, nil + } + } + return mp.(map[interface{}]interface{})[ki], nil +} + +// ForEachMapFieldEntry executes the given function for each entry in the map +// value for the given field descriptor. It stops iteration if the function +// returns false. It panics if an error is encountered. See +// TryForEachMapFieldEntry. +func (m *Message) ForEachMapFieldEntry(fd *desc.FieldDescriptor, fn func(key, val interface{}) bool) { + if err := m.TryForEachMapFieldEntry(fd, fn); err != nil { + panic(err.Error()) + } +} + +// TryForEachMapFieldEntry executes the given function for each entry in the map +// value for the given field descriptor. An error is returned if the given field +// descriptor does not belong to the right message type or if it is not a map +// field. +// +// Iteration ends either when all entries have been examined or when the given +// function returns false. So the function is expected to return true for normal +// iteration and false to break out. If this message has no value for the given +// field, it returns without invoking the given function. +// +// The Go type of the key and value supplied to the function mirrors the type +// that protoc would generate for the field. (See TryGetField for more details +// on types). +// +// If the given field descriptor is not known (e.g. not present in the message +// descriptor) but corresponds to an unknown field, the unknown value will be +// parsed and become known. The parsed value will be searched for the requested +// key and any value returned. An error will be returned if the unknown value +// cannot be parsed according to the field descriptor's type information. +func (m *Message) TryForEachMapFieldEntry(fd *desc.FieldDescriptor, fn func(key, val interface{}) bool) error { + if err := m.checkField(fd); err != nil { + return err + } + return m.forEachMapFieldEntry(fd, fn) +} + +// ForEachMapFieldEntryByName executes the given function for each entry in the +// map value for the field with the given name. It stops iteration if the +// function returns false. It panics if an error is encountered. See +// TryForEachMapFieldEntryByName. +func (m *Message) ForEachMapFieldEntryByName(name string, fn func(key, val interface{}) bool) { + if err := m.TryForEachMapFieldEntryByName(name, fn); err != nil { + panic(err.Error()) + } +} + +// TryForEachMapFieldEntryByName executes the given function for each entry in +// the map value for the field with the given name. It stops iteration if the +// function returns false. An error is returned if the given name is unknown or +// if it names a field that is not a map field. +// +// If this message has no value for the given field, it returns without ever +// invoking the given function. +// +// (See TryGetField for more info on types supplied to the function.) +func (m *Message) TryForEachMapFieldEntryByName(name string, fn func(key, val interface{}) bool) error { + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return UnknownFieldNameError + } + return m.forEachMapFieldEntry(fd, fn) +} + +// ForEachMapFieldEntryByNumber executes the given function for each entry in +// the map value for the field with the given tag number. It stops iteration if +// the function returns false. It panics if an error is encountered. See +// TryForEachMapFieldEntryByNumber. +func (m *Message) ForEachMapFieldEntryByNumber(tagNumber int, fn func(key, val interface{}) bool) { + if err := m.TryForEachMapFieldEntryByNumber(tagNumber, fn); err != nil { + panic(err.Error()) + } +} + +// TryForEachMapFieldEntryByNumber executes the given function for each entry in +// the map value for the field with the given tag number. It stops iteration if +// the function returns false. An error is returned if the given tag is unknown +// or if it indicates a field that is not a map field. +// +// If this message has no value for the given field, it returns without ever +// invoking the given function. +// +// (See TryGetField for more info on types supplied to the function.) +func (m *Message) TryForEachMapFieldEntryByNumber(tagNumber int, fn func(key, val interface{}) bool) error { + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return UnknownTagNumberError + } + return m.forEachMapFieldEntry(fd, fn) +} + +func (m *Message) forEachMapFieldEntry(fd *desc.FieldDescriptor, fn func(key, val interface{}) bool) error { + if !fd.IsMap() { + return FieldIsNotMapError + } + mp := m.values[fd.GetNumber()] + if mp == nil { + if mp, err := m.parseUnknownField(fd); err != nil { + return err + } else if mp == nil { + return nil + } + } + for k, v := range mp.(map[interface{}]interface{}) { + if !fn(k, v) { + break + } + } + return nil +} + +// PutMapField sets the value for the given map field descriptor and given key +// to the given value. It panics if an error is encountered. See TryPutMapField. +func (m *Message) PutMapField(fd *desc.FieldDescriptor, key interface{}, val interface{}) { + if err := m.TryPutMapField(fd, key, val); err != nil { + panic(err.Error()) + } +} + +// TryPutMapField sets the value for the given map field descriptor and given +// key to the given value. An error is returned if the given field descriptor +// does not belong to the right message type, if the given field is not a map +// field, or if the given value is not a correct/compatible type for the given +// field. +// +// The Go type expected for a field is the same as required by TrySetField for +// a field with the same type as the map's value type. +// +// If the given field descriptor is not known (e.g. not present in the message +// descriptor) it will become known. Subsequent operations using tag numbers or +// names will be able to resolve the newly-known type. If the message has a +// value for the unknown value, it is cleared, replaced by the given known +// value. +func (m *Message) TryPutMapField(fd *desc.FieldDescriptor, key interface{}, val interface{}) error { + if err := m.checkField(fd); err != nil { + return err + } + return m.putMapField(fd, key, val) +} + +// PutMapFieldByName sets the value for the map field with the given name and +// given key to the given value. It panics if an error is encountered. See +// TryPutMapFieldByName. +func (m *Message) PutMapFieldByName(name string, key interface{}, val interface{}) { + if err := m.TryPutMapFieldByName(name, key, val); err != nil { + panic(err.Error()) + } +} + +// TryPutMapFieldByName sets the value for the map field with the given name and +// the given key to the given value. An error is returned if the given name is +// unknown, if it names a field that is not a map, or if the given value has an +// incorrect type. +// +// (See TrySetField for more info on types.) +func (m *Message) TryPutMapFieldByName(name string, key interface{}, val interface{}) error { + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return UnknownFieldNameError + } + return m.putMapField(fd, key, val) +} + +// PutMapFieldByNumber sets the value for the map field with the given tag +// number and given key to the given value. It panics if an error is +// encountered. See TryPutMapFieldByNumber. +func (m *Message) PutMapFieldByNumber(tagNumber int, key interface{}, val interface{}) { + if err := m.TryPutMapFieldByNumber(tagNumber, key, val); err != nil { + panic(err.Error()) + } +} + +// TryPutMapFieldByNumber sets the value for the map field with the given tag +// number and the given key to the given value. An error is returned if the +// given tag is unknown, if it indicates a field that is not a map, or if the +// given value has an incorrect type. +// +// (See TrySetField for more info on types.) +func (m *Message) TryPutMapFieldByNumber(tagNumber int, key interface{}, val interface{}) error { + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return UnknownTagNumberError + } + return m.putMapField(fd, key, val) +} + +func (m *Message) putMapField(fd *desc.FieldDescriptor, key interface{}, val interface{}) error { + if !fd.IsMap() { + return FieldIsNotMapError + } + kfd := fd.GetMessageType().GetFields()[0] + ki, err := validElementFieldValue(kfd, key, false) + if err != nil { + return err + } + vfd := fd.GetMessageType().GetFields()[1] + vi, err := validElementFieldValue(vfd, val, true) + if err != nil { + return err + } + mp := m.values[fd.GetNumber()] + if mp == nil { + if mp, err = m.parseUnknownField(fd); err != nil { + return err + } else if mp == nil { + m.internalSetField(fd, map[interface{}]interface{}{ki: vi}) + return nil + } + } + mp.(map[interface{}]interface{})[ki] = vi + return nil +} + +// RemoveMapField changes the value for the given field descriptor by removing +// any value associated with the given key. It panics if an error is +// encountered. See TryRemoveMapField. +func (m *Message) RemoveMapField(fd *desc.FieldDescriptor, key interface{}) { + if err := m.TryRemoveMapField(fd, key); err != nil { + panic(err.Error()) + } +} + +// TryRemoveMapField changes the value for the given field descriptor by +// removing any value associated with the given key. An error is returned if the +// given field descriptor does not belong to the right message type or if the +// given field is not a map field. +// +// If the given field descriptor is not known (e.g. not present in the message +// descriptor) it will become known. Subsequent operations using tag numbers or +// names will be able to resolve the newly-known type. If the message has a +// value for the unknown value, it is parsed and any value for the given key +// removed. +func (m *Message) TryRemoveMapField(fd *desc.FieldDescriptor, key interface{}) error { + if err := m.checkField(fd); err != nil { + return err + } + return m.removeMapField(fd, key) +} + +// RemoveMapFieldByName changes the value for the field with the given name by +// removing any value associated with the given key. It panics if an error is +// encountered. See TryRemoveMapFieldByName. +func (m *Message) RemoveMapFieldByName(name string, key interface{}) { + if err := m.TryRemoveMapFieldByName(name, key); err != nil { + panic(err.Error()) + } +} + +// TryRemoveMapFieldByName changes the value for the field with the given name +// by removing any value associated with the given key. An error is returned if +// the given name is unknown or if it names a field that is not a map. +func (m *Message) TryRemoveMapFieldByName(name string, key interface{}) error { + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return UnknownFieldNameError + } + return m.removeMapField(fd, key) +} + +// RemoveMapFieldByNumber changes the value for the field with the given tag +// number by removing any value associated with the given key. It panics if an +// error is encountered. See TryRemoveMapFieldByNumber. +func (m *Message) RemoveMapFieldByNumber(tagNumber int, key interface{}) { + if err := m.TryRemoveMapFieldByNumber(tagNumber, key); err != nil { + panic(err.Error()) + } +} + +// TryRemoveMapFieldByNumber changes the value for the field with the given tag +// number by removing any value associated with the given key. An error is +// returned if the given tag is unknown or if it indicates a field that is not +// a map. +func (m *Message) TryRemoveMapFieldByNumber(tagNumber int, key interface{}) error { + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return UnknownTagNumberError + } + return m.removeMapField(fd, key) +} + +func (m *Message) removeMapField(fd *desc.FieldDescriptor, key interface{}) error { + if !fd.IsMap() { + return FieldIsNotMapError + } + kfd := fd.GetMessageType().GetFields()[0] + ki, err := validElementFieldValue(kfd, key, false) + if err != nil { + return err + } + mp := m.values[fd.GetNumber()] + if mp == nil { + if mp, err = m.parseUnknownField(fd); err != nil { + return err + } else if mp == nil { + return nil + } + } + res := mp.(map[interface{}]interface{}) + delete(res, ki) + if len(res) == 0 { + delete(m.values, fd.GetNumber()) + } + return nil +} + +// FieldLength returns the number of elements in this message for the given +// field descriptor. It panics if an error is encountered. See TryFieldLength. +func (m *Message) FieldLength(fd *desc.FieldDescriptor) int { + l, err := m.TryFieldLength(fd) + if err != nil { + panic(err.Error()) + } + return l +} + +// TryFieldLength returns the number of elements in this message for the given +// field descriptor. An error is returned if the given field descriptor does not +// belong to the right message type or if it is neither a map field nor a +// repeated field. +func (m *Message) TryFieldLength(fd *desc.FieldDescriptor) (int, error) { + if err := m.checkField(fd); err != nil { + return 0, err + } + return m.fieldLength(fd) +} + +// FieldLengthByName returns the number of elements in this message for the +// field with the given name. It panics if an error is encountered. See +// TryFieldLengthByName. +func (m *Message) FieldLengthByName(name string) int { + l, err := m.TryFieldLengthByName(name) + if err != nil { + panic(err.Error()) + } + return l +} + +// TryFieldLengthByName returns the number of elements in this message for the +// field with the given name. An error is returned if the given name is unknown +// or if the named field is neither a map field nor a repeated field. +func (m *Message) TryFieldLengthByName(name string) (int, error) { + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return 0, UnknownFieldNameError + } + return m.fieldLength(fd) +} + +// FieldLengthByNumber returns the number of elements in this message for the +// field with the given tag number. It panics if an error is encountered. See +// TryFieldLengthByNumber. +func (m *Message) FieldLengthByNumber(tagNumber int32) int { + l, err := m.TryFieldLengthByNumber(tagNumber) + if err != nil { + panic(err.Error()) + } + return l +} + +// TryFieldLengthByNumber returns the number of elements in this message for the +// field with the given tag number. An error is returned if the given tag is +// unknown or if the named field is neither a map field nor a repeated field. +func (m *Message) TryFieldLengthByNumber(tagNumber int32) (int, error) { + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return 0, UnknownTagNumberError + } + return m.fieldLength(fd) +} + +func (m *Message) fieldLength(fd *desc.FieldDescriptor) (int, error) { + if !fd.IsRepeated() { + return 0, FieldIsNotRepeatedError + } + val := m.values[fd.GetNumber()] + if val == nil { + var err error + if val, err = m.parseUnknownField(fd); err != nil { + return 0, err + } else if val == nil { + return 0, nil + } + } + if sl, ok := val.([]interface{}); ok { + return len(sl), nil + } else if mp, ok := val.(map[interface{}]interface{}); ok { + return len(mp), nil + } + return 0, nil +} + +// GetRepeatedField returns the value for the given repeated field descriptor at +// the given index. It panics if an error is encountered. See +// TryGetRepeatedField. +func (m *Message) GetRepeatedField(fd *desc.FieldDescriptor, index int) interface{} { + if v, err := m.TryGetRepeatedField(fd, index); err != nil { + panic(err.Error()) + } else { + return v + } +} + +// TryGetRepeatedField returns the value for the given repeated field descriptor +// at the given index. An error is returned if the given field descriptor does +// not belong to the right message type, if it is not a repeated field, or if +// the given index is out of range (less than zero or greater than or equal to +// the length of the repeated field). Also, even though map fields technically +// are repeated fields, if the given field is a map field an error will result: +// map representation does not lend itself to random access by index. +// +// The Go type of the value returned mirrors the type that protoc would generate +// for the field's element type. (See TryGetField for more details on types). +// +// If the given field descriptor is not known (e.g. not present in the message +// descriptor) but corresponds to an unknown field, the unknown value will be +// parsed and become known. The value at the given index in the parsed value +// will be returned. An error will be returned if the unknown value cannot be +// parsed according to the field descriptor's type information. +func (m *Message) TryGetRepeatedField(fd *desc.FieldDescriptor, index int) (interface{}, error) { + if index < 0 { + return nil, IndexOutOfRangeError + } + if err := m.checkField(fd); err != nil { + return nil, err + } + return m.getRepeatedField(fd, index) +} + +// GetRepeatedFieldByName returns the value for the repeated field with the +// given name at the given index. It panics if an error is encountered. See +// TryGetRepeatedFieldByName. +func (m *Message) GetRepeatedFieldByName(name string, index int) interface{} { + if v, err := m.TryGetRepeatedFieldByName(name, index); err != nil { + panic(err.Error()) + } else { + return v + } +} + +// TryGetRepeatedFieldByName returns the value for the repeated field with the +// given name at the given index. An error is returned if the given name is +// unknown, if it names a field that is not a repeated field (or is a map +// field), or if the given index is out of range (less than zero or greater +// than or equal to the length of the repeated field). +// +// (See TryGetField for more info on types.) +func (m *Message) TryGetRepeatedFieldByName(name string, index int) (interface{}, error) { + if index < 0 { + return nil, IndexOutOfRangeError + } + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return nil, UnknownFieldNameError + } + return m.getRepeatedField(fd, index) +} + +// GetRepeatedFieldByNumber returns the value for the repeated field with the +// given tag number at the given index. It panics if an error is encountered. +// See TryGetRepeatedFieldByNumber. +func (m *Message) GetRepeatedFieldByNumber(tagNumber int, index int) interface{} { + if v, err := m.TryGetRepeatedFieldByNumber(tagNumber, index); err != nil { + panic(err.Error()) + } else { + return v + } +} + +// TryGetRepeatedFieldByNumber returns the value for the repeated field with the +// given tag number at the given index. An error is returned if the given tag is +// unknown, if it indicates a field that is not a repeated field (or is a map +// field), or if the given index is out of range (less than zero or greater than +// or equal to the length of the repeated field). +// +// (See TryGetField for more info on types.) +func (m *Message) TryGetRepeatedFieldByNumber(tagNumber int, index int) (interface{}, error) { + if index < 0 { + return nil, IndexOutOfRangeError + } + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return nil, UnknownTagNumberError + } + return m.getRepeatedField(fd, index) +} + +func (m *Message) getRepeatedField(fd *desc.FieldDescriptor, index int) (interface{}, error) { + if fd.IsMap() || !fd.IsRepeated() { + return nil, FieldIsNotRepeatedError + } + sl := m.values[fd.GetNumber()] + if sl == nil { + var err error + if sl, err = m.parseUnknownField(fd); err != nil { + return nil, err + } else if sl == nil { + return nil, IndexOutOfRangeError + } + } + res := sl.([]interface{}) + if index >= len(res) { + return nil, IndexOutOfRangeError + } + return res[index], nil +} + +// AddRepeatedField appends the given value to the given repeated field. It +// panics if an error is encountered. See TryAddRepeatedField. +func (m *Message) AddRepeatedField(fd *desc.FieldDescriptor, val interface{}) { + if err := m.TryAddRepeatedField(fd, val); err != nil { + panic(err.Error()) + } +} + +// TryAddRepeatedField appends the given value to the given repeated field. An +// error is returned if the given field descriptor does not belong to the right +// message type, if the given field is not repeated, or if the given value is +// not a correct/compatible type for the given field. If the given field is a +// map field, the call will succeed if the given value is an instance of the +// map's entry message type. +// +// The Go type expected for a field is the same as required by TrySetField for +// a non-repeated field of the same type. +// +// If the given field descriptor is not known (e.g. not present in the message +// descriptor) it will become known. Subsequent operations using tag numbers or +// names will be able to resolve the newly-known type. If the message has a +// value for the unknown value, it is parsed and the given value is appended to +// it. +func (m *Message) TryAddRepeatedField(fd *desc.FieldDescriptor, val interface{}) error { + if err := m.checkField(fd); err != nil { + return err + } + return m.addRepeatedField(fd, val) +} + +// AddRepeatedFieldByName appends the given value to the repeated field with the +// given name. It panics if an error is encountered. See +// TryAddRepeatedFieldByName. +func (m *Message) AddRepeatedFieldByName(name string, val interface{}) { + if err := m.TryAddRepeatedFieldByName(name, val); err != nil { + panic(err.Error()) + } +} + +// TryAddRepeatedFieldByName appends the given value to the repeated field with +// the given name. An error is returned if the given name is unknown, if it +// names a field that is not repeated, or if the given value has an incorrect +// type. +// +// (See TrySetField for more info on types.) +func (m *Message) TryAddRepeatedFieldByName(name string, val interface{}) error { + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return UnknownFieldNameError + } + return m.addRepeatedField(fd, val) +} + +// AddRepeatedFieldByNumber appends the given value to the repeated field with +// the given tag number. It panics if an error is encountered. See +// TryAddRepeatedFieldByNumber. +func (m *Message) AddRepeatedFieldByNumber(tagNumber int, val interface{}) { + if err := m.TryAddRepeatedFieldByNumber(tagNumber, val); err != nil { + panic(err.Error()) + } +} + +// TryAddRepeatedFieldByNumber appends the given value to the repeated field +// with the given tag number. An error is returned if the given tag is unknown, +// if it indicates a field that is not repeated, or if the given value has an +// incorrect type. +// +// (See TrySetField for more info on types.) +func (m *Message) TryAddRepeatedFieldByNumber(tagNumber int, val interface{}) error { + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return UnknownTagNumberError + } + return m.addRepeatedField(fd, val) +} + +func (m *Message) addRepeatedField(fd *desc.FieldDescriptor, val interface{}) error { + if !fd.IsRepeated() { + return FieldIsNotRepeatedError + } + val, err := validElementFieldValue(fd, val, false) + if err != nil { + return err + } + + if fd.IsMap() { + // We're lenient. Just as we allow setting a map field to a slice of entry messages, we also allow + // adding entries one at a time (as if the field were a normal repeated field). + msg := val.(proto.Message) + dm, err := asDynamicMessage(msg, fd.GetMessageType(), m.mf) + if err != nil { + return err + } + k, err := dm.TryGetFieldByNumber(1) + if err != nil { + return err + } + v, err := dm.TryGetFieldByNumber(2) + if err != nil { + return err + } + return m.putMapField(fd, k, v) + } + + sl := m.values[fd.GetNumber()] + if sl == nil { + if sl, err = m.parseUnknownField(fd); err != nil { + return err + } else if sl == nil { + sl = []interface{}{} + } + } + res := sl.([]interface{}) + res = append(res, val) + m.internalSetField(fd, res) + return nil +} + +// SetRepeatedField sets the value for the given repeated field descriptor and +// given index to the given value. It panics if an error is encountered. See +// SetRepeatedField. +func (m *Message) SetRepeatedField(fd *desc.FieldDescriptor, index int, val interface{}) { + if err := m.TrySetRepeatedField(fd, index, val); err != nil { + panic(err.Error()) + } +} + +// TrySetRepeatedField sets the value for the given repeated field descriptor +// and given index to the given value. An error is returned if the given field +// descriptor does not belong to the right message type, if the given field is +// not repeated, or if the given value is not a correct/compatible type for the +// given field. Also, even though map fields technically are repeated fields, if +// the given field is a map field an error will result: map representation does +// not lend itself to random access by index. +// +// The Go type expected for a field is the same as required by TrySetField for +// a non-repeated field of the same type. +// +// If the given field descriptor is not known (e.g. not present in the message +// descriptor) it will become known. Subsequent operations using tag numbers or +// names will be able to resolve the newly-known type. If the message has a +// value for the unknown value, it is parsed and the element at the given index +// is replaced with the given value. +func (m *Message) TrySetRepeatedField(fd *desc.FieldDescriptor, index int, val interface{}) error { + if index < 0 { + return IndexOutOfRangeError + } + if err := m.checkField(fd); err != nil { + return err + } + return m.setRepeatedField(fd, index, val) +} + +// SetRepeatedFieldByName sets the value for the repeated field with the given +// name and given index to the given value. It panics if an error is +// encountered. See TrySetRepeatedFieldByName. +func (m *Message) SetRepeatedFieldByName(name string, index int, val interface{}) { + if err := m.TrySetRepeatedFieldByName(name, index, val); err != nil { + panic(err.Error()) + } +} + +// TrySetRepeatedFieldByName sets the value for the repeated field with the +// given name and the given index to the given value. An error is returned if +// the given name is unknown, if it names a field that is not repeated (or is a +// map field), or if the given value has an incorrect type. +// +// (See TrySetField for more info on types.) +func (m *Message) TrySetRepeatedFieldByName(name string, index int, val interface{}) error { + if index < 0 { + return IndexOutOfRangeError + } + fd := m.FindFieldDescriptorByName(name) + if fd == nil { + return UnknownFieldNameError + } + return m.setRepeatedField(fd, index, val) +} + +// SetRepeatedFieldByNumber sets the value for the repeated field with the given +// tag number and given index to the given value. It panics if an error is +// encountered. See TrySetRepeatedFieldByNumber. +func (m *Message) SetRepeatedFieldByNumber(tagNumber int, index int, val interface{}) { + if err := m.TrySetRepeatedFieldByNumber(tagNumber, index, val); err != nil { + panic(err.Error()) + } +} + +// TrySetRepeatedFieldByNumber sets the value for the repeated field with the +// given tag number and the given index to the given value. An error is returned +// if the given tag is unknown, if it indicates a field that is not repeated (or +// is a map field), or if the given value has an incorrect type. +// +// (See TrySetField for more info on types.) +func (m *Message) TrySetRepeatedFieldByNumber(tagNumber int, index int, val interface{}) error { + if index < 0 { + return IndexOutOfRangeError + } + fd := m.FindFieldDescriptor(int32(tagNumber)) + if fd == nil { + return UnknownTagNumberError + } + return m.setRepeatedField(fd, index, val) +} + +func (m *Message) setRepeatedField(fd *desc.FieldDescriptor, index int, val interface{}) error { + if fd.IsMap() || !fd.IsRepeated() { + return FieldIsNotRepeatedError + } + val, err := validElementFieldValue(fd, val, false) + if err != nil { + return err + } + sl := m.values[fd.GetNumber()] + if sl == nil { + if sl, err = m.parseUnknownField(fd); err != nil { + return err + } else if sl == nil { + return IndexOutOfRangeError + } + } + res := sl.([]interface{}) + if index >= len(res) { + return IndexOutOfRangeError + } + res[index] = val + return nil +} + +// GetUnknownField gets the value(s) for the given unknown tag number. If this +// message has no unknown fields with the given tag, nil is returned. +func (m *Message) GetUnknownField(tagNumber int32) []UnknownField { + if u, ok := m.unknownFields[tagNumber]; ok { + return u + } else { + return nil + } +} + +func (m *Message) parseUnknownField(fd *desc.FieldDescriptor) (interface{}, error) { + unks, ok := m.unknownFields[fd.GetNumber()] + if !ok { + return nil, nil + } + var v interface{} + var sl []interface{} + var mp map[interface{}]interface{} + if fd.IsMap() { + mp = map[interface{}]interface{}{} + } + var err error + for _, unk := range unks { + var val interface{} + if unk.Encoding == proto.WireBytes || unk.Encoding == proto.WireStartGroup { + val, err = codec.DecodeLengthDelimitedField(fd, unk.Contents, m.mf) + } else { + val, err = codec.DecodeScalarField(fd, unk.Value) + } + if err != nil { + return nil, err + } + if fd.IsMap() { + newEntry := val.(*Message) + kk, err := newEntry.TryGetFieldByNumber(1) + if err != nil { + return nil, err + } + vv, err := newEntry.TryGetFieldByNumber(2) + if err != nil { + return nil, err + } + mp[kk] = vv + v = mp + } else if fd.IsRepeated() { + t := reflect.TypeOf(val) + if t.Kind() == reflect.Slice && t != typeOfBytes { + // append slices if we unmarshalled a packed repeated field + newVals := val.([]interface{}) + sl = append(sl, newVals...) + } else { + sl = append(sl, val) + } + v = sl + } else { + v = val + } + } + m.internalSetField(fd, v) + return v, nil +} + +func validFieldValue(fd *desc.FieldDescriptor, val interface{}) (interface{}, error) { + return validFieldValueForRv(fd, reflect.ValueOf(val)) +} + +func validFieldValueForRv(fd *desc.FieldDescriptor, val reflect.Value) (interface{}, error) { + if fd.IsMap() && val.Kind() == reflect.Map { + return validFieldValueForMapField(fd, val) + } + + if fd.IsRepeated() { // this will also catch map fields where given value was not a map + if val.Kind() != reflect.Array && val.Kind() != reflect.Slice { + if fd.IsMap() { + return nil, fmt.Errorf("value for map field must be a map; instead was %v", val.Type()) + } else { + return nil, fmt.Errorf("value for repeated field must be a slice; instead was %v", val.Type()) + } + } + + if fd.IsMap() { + // value should be a slice of entry messages that we need convert into a map[interface{}]interface{} + m := map[interface{}]interface{}{} + for i := 0; i < val.Len(); i++ { + e, err := validElementFieldValue(fd, val.Index(i).Interface(), false) + if err != nil { + return nil, err + } + msg := e.(proto.Message) + dm, err := asDynamicMessage(msg, fd.GetMessageType(), nil) + if err != nil { + return nil, err + } + k, err := dm.TryGetFieldByNumber(1) + if err != nil { + return nil, err + } + v, err := dm.TryGetFieldByNumber(2) + if err != nil { + return nil, err + } + m[k] = v + } + return m, nil + } + + // make a defensive copy while checking contents (also converts to []interface{}) + s := make([]interface{}, val.Len()) + for i := 0; i < val.Len(); i++ { + ev := val.Index(i) + if ev.Kind() == reflect.Interface { + // unwrap it + ev = reflect.ValueOf(ev.Interface()) + } + e, err := validElementFieldValueForRv(fd, ev, false) + if err != nil { + return nil, err + } + s[i] = e + } + + return s, nil + } + + return validElementFieldValueForRv(fd, val, false) +} + +func asDynamicMessage(m proto.Message, md *desc.MessageDescriptor, mf *MessageFactory) (*Message, error) { + if dm, ok := m.(*Message); ok { + return dm, nil + } + dm := NewMessageWithMessageFactory(md, mf) + if err := dm.mergeFrom(m); err != nil { + return nil, err + } + return dm, nil +} + +func validElementFieldValue(fd *desc.FieldDescriptor, val interface{}, allowNilMessage bool) (interface{}, error) { + return validElementFieldValueForRv(fd, reflect.ValueOf(val), allowNilMessage) +} + +func validElementFieldValueForRv(fd *desc.FieldDescriptor, val reflect.Value, allowNilMessage bool) (interface{}, error) { + t := fd.GetType() + if !val.IsValid() { + return nil, typeError(fd, nil) + } + + switch t { + case descriptor.FieldDescriptorProto_TYPE_SFIXED32, + descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_SINT32, + descriptor.FieldDescriptorProto_TYPE_ENUM: + return toInt32(reflect.Indirect(val), fd) + + case descriptor.FieldDescriptorProto_TYPE_SFIXED64, + descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_SINT64: + return toInt64(reflect.Indirect(val), fd) + + case descriptor.FieldDescriptorProto_TYPE_FIXED32, + descriptor.FieldDescriptorProto_TYPE_UINT32: + return toUint32(reflect.Indirect(val), fd) + + case descriptor.FieldDescriptorProto_TYPE_FIXED64, + descriptor.FieldDescriptorProto_TYPE_UINT64: + return toUint64(reflect.Indirect(val), fd) + + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + return toFloat32(reflect.Indirect(val), fd) + + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + return toFloat64(reflect.Indirect(val), fd) + + case descriptor.FieldDescriptorProto_TYPE_BOOL: + return toBool(reflect.Indirect(val), fd) + + case descriptor.FieldDescriptorProto_TYPE_BYTES: + return toBytes(reflect.Indirect(val), fd) + + case descriptor.FieldDescriptorProto_TYPE_STRING: + return toString(reflect.Indirect(val), fd) + + case descriptor.FieldDescriptorProto_TYPE_MESSAGE, + descriptor.FieldDescriptorProto_TYPE_GROUP: + m, err := asMessage(val, fd.GetFullyQualifiedName()) + // check that message is correct type + if err != nil { + return nil, err + } + var msgType string + if dm, ok := m.(*Message); ok { + if allowNilMessage && dm == nil { + // if dm == nil, we'll panic below, so early out if that is allowed + // (only allowed for map values, to indicate an entry w/ no value) + return m, nil + } + msgType = dm.GetMessageDescriptor().GetFullyQualifiedName() + } else { + msgType = proto.MessageName(m) + } + if msgType != fd.GetMessageType().GetFullyQualifiedName() { + return nil, fmt.Errorf("message field %s requires value of type %s; received %s", fd.GetFullyQualifiedName(), fd.GetMessageType().GetFullyQualifiedName(), msgType) + } + return m, nil + + default: + return nil, fmt.Errorf("unable to handle unrecognized field type: %v", fd.GetType()) + } +} + +func toInt32(v reflect.Value, fd *desc.FieldDescriptor) (int32, error) { + if v.Kind() == reflect.Int32 { + return int32(v.Int()), nil + } + return 0, typeError(fd, v.Type()) +} + +func toUint32(v reflect.Value, fd *desc.FieldDescriptor) (uint32, error) { + if v.Kind() == reflect.Uint32 { + return uint32(v.Uint()), nil + } + return 0, typeError(fd, v.Type()) +} + +func toFloat32(v reflect.Value, fd *desc.FieldDescriptor) (float32, error) { + if v.Kind() == reflect.Float32 { + return float32(v.Float()), nil + } + return 0, typeError(fd, v.Type()) +} + +func toInt64(v reflect.Value, fd *desc.FieldDescriptor) (int64, error) { + if v.Kind() == reflect.Int64 || v.Kind() == reflect.Int || v.Kind() == reflect.Int32 { + return v.Int(), nil + } + return 0, typeError(fd, v.Type()) +} + +func toUint64(v reflect.Value, fd *desc.FieldDescriptor) (uint64, error) { + if v.Kind() == reflect.Uint64 || v.Kind() == reflect.Uint || v.Kind() == reflect.Uint32 { + return v.Uint(), nil + } + return 0, typeError(fd, v.Type()) +} + +func toFloat64(v reflect.Value, fd *desc.FieldDescriptor) (float64, error) { + if v.Kind() == reflect.Float64 || v.Kind() == reflect.Float32 { + return v.Float(), nil + } + return 0, typeError(fd, v.Type()) +} + +func toBool(v reflect.Value, fd *desc.FieldDescriptor) (bool, error) { + if v.Kind() == reflect.Bool { + return v.Bool(), nil + } + return false, typeError(fd, v.Type()) +} + +func toBytes(v reflect.Value, fd *desc.FieldDescriptor) ([]byte, error) { + if v.Kind() == reflect.Slice && v.Type().Elem().Kind() == reflect.Uint8 { + return v.Bytes(), nil + } + return nil, typeError(fd, v.Type()) +} + +func toString(v reflect.Value, fd *desc.FieldDescriptor) (string, error) { + if v.Kind() == reflect.String { + return v.String(), nil + } + return "", typeError(fd, v.Type()) +} + +func typeError(fd *desc.FieldDescriptor, t reflect.Type) error { + return fmt.Errorf( + "%s field %s is not compatible with value of type %v", + getTypeString(fd), fd.GetFullyQualifiedName(), t) +} + +func getTypeString(fd *desc.FieldDescriptor) string { + return strings.ToLower(fd.GetType().String()) +} + +func asMessage(v reflect.Value, fieldName string) (proto.Message, error) { + t := v.Type() + // we need a pointer to a struct that implements proto.Message + if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct || !t.Implements(typeOfProtoMessage) { + return nil, fmt.Errorf("message field %s requires is not compatible with value of type %v", fieldName, v.Type()) + } + return v.Interface().(proto.Message), nil +} + +// Reset resets this message to an empty message. It removes all values set in +// the message. +func (m *Message) Reset() { + for k := range m.values { + delete(m.values, k) + } + for k := range m.unknownFields { + delete(m.unknownFields, k) + } +} + +// String returns this message rendered in compact text format. +func (m *Message) String() string { + b, err := m.MarshalText() + if err != nil { + panic(fmt.Sprintf("Failed to create string representation of message: %s", err.Error())) + } + return string(b) +} + +// ProtoMessage is present to satisfy the proto.Message interface. +func (m *Message) ProtoMessage() { +} + +// ConvertTo converts this dynamic message into the given message. This is +// shorthand for resetting then merging: +// target.Reset() +// m.MergeInto(target) +func (m *Message) ConvertTo(target proto.Message) error { + if err := m.checkType(target); err != nil { + return err + } + + target.Reset() + return m.mergeInto(target, defaultDeterminism) +} + +// ConvertToDeterministic converts this dynamic message into the given message. +// It is just like ConvertTo, but it attempts to produce deterministic results. +// That means that if the target is a generated message (not another dynamic +// message) and the current runtime is unaware of any fields or extensions that +// are present in m, they will be serialized into the target's unrecognized +// fields deterministically. +func (m *Message) ConvertToDeterministic(target proto.Message) error { + if err := m.checkType(target); err != nil { + return err + } + + target.Reset() + return m.mergeInto(target, true) +} + +// ConvertFrom converts the given message into this dynamic message. This is +// shorthand for resetting then merging: +// m.Reset() +// m.MergeFrom(target) +func (m *Message) ConvertFrom(target proto.Message) error { + if err := m.checkType(target); err != nil { + return err + } + + m.Reset() + return m.mergeFrom(target) +} + +// MergeInto merges this dynamic message into the given message. All field +// values in this message will be set on the given message. For map fields, +// entries are added to the given message (if the given message has existing +// values for like keys, they are overwritten). For slice fields, elements are +// added. +// +// If the given message has a different set of known fields, it is possible for +// some known fields in this message to be represented as unknown fields in the +// given message after merging, and vice versa. +func (m *Message) MergeInto(target proto.Message) error { + if err := m.checkType(target); err != nil { + return err + } + return m.mergeInto(target, defaultDeterminism) +} + +// MergeIntoDeterministic merges this dynamic message into the given message. +// It is just like MergeInto, but it attempts to produce deterministic results. +// That means that if the target is a generated message (not another dynamic +// message) and the current runtime is unaware of any fields or extensions that +// are present in m, they will be serialized into the target's unrecognized +// fields deterministically. +func (m *Message) MergeIntoDeterministic(target proto.Message) error { + if err := m.checkType(target); err != nil { + return err + } + return m.mergeInto(target, true) +} + +// MergeFrom merges the given message into this dynamic message. All field +// values in the given message will be set on this message. For map fields, +// entries are added to this message (if this message has existing values for +// like keys, they are overwritten). For slice fields, elements are added. +// +// If the given message has a different set of known fields, it is possible for +// some known fields in that message to be represented as unknown fields in this +// message after merging, and vice versa. +func (m *Message) MergeFrom(source proto.Message) error { + if err := m.checkType(source); err != nil { + return err + } + return m.mergeFrom(source) +} + +// Merge implements the proto.Merger interface so that dynamic messages are +// compatible with the proto.Merge function. It delegates to MergeFrom but will +// panic on error as the proto.Merger interface doesn't allow for returning an +// error. +// +// Unlike nearly all other methods, this method can work if this message's type +// is not defined (such as instantiating the message without using NewMessage). +// This is strictly so that dynamic message's are compatible with the +// proto.Clone function, which instantiates a new message via reflection (thus +// its message descriptor will not be set) and than calls Merge. +func (m *Message) Merge(source proto.Message) { + if m.md == nil { + // To support proto.Clone, initialize the descriptor from the source. + if dm, ok := source.(*Message); ok { + m.md = dm.md + // also make sure the clone uses the same message factory and + // extensions and also knows about the same extra fields (if any) + m.mf = dm.mf + m.er = dm.er + m.extraFields = dm.extraFields + } else if md, err := desc.LoadMessageDescriptorForMessage(source); err != nil { + panic(err.Error()) + } else { + m.md = md + } + } + + if err := m.MergeFrom(source); err != nil { + panic(err.Error()) + } +} + +func (m *Message) checkType(target proto.Message) error { + if dm, ok := target.(*Message); ok { + if dm.md.GetFullyQualifiedName() != m.md.GetFullyQualifiedName() { + return fmt.Errorf("given message has wrong type: %q; expecting %q", dm.md.GetFullyQualifiedName(), m.md.GetFullyQualifiedName()) + } + return nil + } + + msgName := proto.MessageName(target) + if msgName != m.md.GetFullyQualifiedName() { + return fmt.Errorf("given message has wrong type: %q; expecting %q", msgName, m.md.GetFullyQualifiedName()) + } + return nil +} + +func (m *Message) mergeInto(pm proto.Message, deterministic bool) error { + if dm, ok := pm.(*Message); ok { + return dm.mergeFrom(m) + } + + target := reflect.ValueOf(pm) + if target.Kind() == reflect.Ptr { + target = target.Elem() + } + + // track tags for which the dynamic message has data but the given + // message doesn't know about it + unknownTags := map[int32]struct{}{} + for tag := range m.values { + unknownTags[tag] = struct{}{} + } + + // check that we can successfully do the merge + structProps := proto.GetProperties(reflect.TypeOf(pm).Elem()) + for _, prop := range structProps.Prop { + if prop.Tag == 0 { + continue // one-of or special field (such as XXX_unrecognized, etc.) + } + tag := int32(prop.Tag) + v, ok := m.values[tag] + if !ok { + continue + } + if unknownTags != nil { + delete(unknownTags, tag) + } + f := target.FieldByName(prop.Name) + ft := f.Type() + val := reflect.ValueOf(v) + if !canConvert(val, ft) { + return fmt.Errorf("cannot convert %v to %v", val.Type(), ft) + } + } + // check one-of fields + for _, oop := range structProps.OneofTypes { + prop := oop.Prop + tag := int32(prop.Tag) + v, ok := m.values[tag] + if !ok { + continue + } + if unknownTags != nil { + delete(unknownTags, tag) + } + stf, ok := oop.Type.Elem().FieldByName(prop.Name) + if !ok { + return fmt.Errorf("one-of field indicates struct field name %s, but type %v has no such field", prop.Name, oop.Type.Elem()) + } + ft := stf.Type + val := reflect.ValueOf(v) + if !canConvert(val, ft) { + return fmt.Errorf("cannot convert %v to %v", val.Type(), ft) + } + } + // and check extensions, too + for tag, ext := range proto.RegisteredExtensions(pm) { + v, ok := m.values[tag] + if !ok { + continue + } + if unknownTags != nil { + delete(unknownTags, tag) + } + ft := reflect.TypeOf(ext.ExtensionType) + val := reflect.ValueOf(v) + if !canConvert(val, ft) { + return fmt.Errorf("cannot convert %v to %v", val.Type(), ft) + } + } + + // now actually perform the merge + for _, prop := range structProps.Prop { + v, ok := m.values[int32(prop.Tag)] + if !ok { + continue + } + f := target.FieldByName(prop.Name) + if err := mergeVal(reflect.ValueOf(v), f, deterministic); err != nil { + return err + } + } + // merge one-ofs + for _, oop := range structProps.OneofTypes { + prop := oop.Prop + tag := int32(prop.Tag) + v, ok := m.values[tag] + if !ok { + continue + } + oov := reflect.New(oop.Type.Elem()) + f := oov.Elem().FieldByName(prop.Name) + if err := mergeVal(reflect.ValueOf(v), f, deterministic); err != nil { + return err + } + target.Field(oop.Field).Set(oov) + } + // merge extensions, too + for tag, ext := range proto.RegisteredExtensions(pm) { + v, ok := m.values[tag] + if !ok { + continue + } + e := reflect.New(reflect.TypeOf(ext.ExtensionType)).Elem() + if err := mergeVal(reflect.ValueOf(v), e, deterministic); err != nil { + return err + } + if err := proto.SetExtension(pm, ext, e.Interface()); err != nil { + // shouldn't happen since we already checked that the extension type was compatible above + return err + } + } + + // if we have fields that the given message doesn't know about, add to its unknown fields + if len(unknownTags) > 0 { + var b codec.Buffer + b.SetDeterministic(deterministic) + if deterministic { + // if we need to emit things deterministically, sort the + // extensions by their tag number + sortedUnknownTags := make([]int32, 0, len(unknownTags)) + for tag := range unknownTags { + sortedUnknownTags = append(sortedUnknownTags, tag) + } + sort.Slice(sortedUnknownTags, func(i, j int) bool { + return sortedUnknownTags[i] < sortedUnknownTags[j] + }) + for _, tag := range sortedUnknownTags { + fd := m.FindFieldDescriptor(tag) + if err := b.EncodeFieldValue(fd, m.values[tag]); err != nil { + return err + } + } + } else { + for tag := range unknownTags { + fd := m.FindFieldDescriptor(tag) + if err := b.EncodeFieldValue(fd, m.values[tag]); err != nil { + return err + } + } + } + + internal.SetUnrecognized(pm, b.Bytes()) + } + + // finally, convey unknown fields into the given message by letting it unmarshal them + // (this will append to its unknown fields if not known; if somehow the given message recognizes + // a field even though the dynamic message did not, it will get correctly unmarshalled) + if unknownTags != nil && len(m.unknownFields) > 0 { + var b codec.Buffer + _ = m.marshalUnknownFields(&b) + _ = proto.UnmarshalMerge(b.Bytes(), pm) + } + + return nil +} + +func canConvert(src reflect.Value, target reflect.Type) bool { + if src.Kind() == reflect.Interface { + src = reflect.ValueOf(src.Interface()) + } + srcType := src.Type() + // we allow convertible types instead of requiring exact types so that calling + // code can, for example, assign an enum constant to an enum field. In that case, + // one type is the enum type (a sub-type of int32) and the other may be the int32 + // type. So we automatically do the conversion in that case. + if srcType.ConvertibleTo(target) { + return true + } else if target.Kind() == reflect.Ptr && srcType.ConvertibleTo(target.Elem()) { + return true + } else if target.Kind() == reflect.Slice { + if srcType.Kind() != reflect.Slice { + return false + } + et := target.Elem() + for i := 0; i < src.Len(); i++ { + if !canConvert(src.Index(i), et) { + return false + } + } + return true + } else if target.Kind() == reflect.Map { + if srcType.Kind() != reflect.Map { + return false + } + return canConvertMap(src, target) + } else if srcType == typeOfDynamicMessage && target.Implements(typeOfProtoMessage) { + z := reflect.Zero(target).Interface() + msgType := proto.MessageName(z.(proto.Message)) + return msgType == src.Interface().(*Message).GetMessageDescriptor().GetFullyQualifiedName() + } else { + return false + } +} + +func mergeVal(src, target reflect.Value, deterministic bool) error { + if src.Kind() == reflect.Interface && !src.IsNil() { + src = src.Elem() + } + srcType := src.Type() + targetType := target.Type() + if srcType.ConvertibleTo(targetType) { + if targetType.Implements(typeOfProtoMessage) && !target.IsNil() { + Merge(target.Interface().(proto.Message), src.Convert(targetType).Interface().(proto.Message)) + } else { + target.Set(src.Convert(targetType)) + } + } else if targetType.Kind() == reflect.Ptr && srcType.ConvertibleTo(targetType.Elem()) { + if !src.CanAddr() { + target.Set(reflect.New(targetType.Elem())) + target.Elem().Set(src.Convert(targetType.Elem())) + } else { + target.Set(src.Addr().Convert(targetType)) + } + } else if targetType.Kind() == reflect.Slice { + l := target.Len() + newL := l + src.Len() + if target.Cap() < newL { + // expand capacity of the slice and copy + newSl := reflect.MakeSlice(targetType, newL, newL) + for i := 0; i < target.Len(); i++ { + newSl.Index(i).Set(target.Index(i)) + } + target.Set(newSl) + } else { + target.SetLen(newL) + } + for i := 0; i < src.Len(); i++ { + dest := target.Index(l + i) + if dest.Kind() == reflect.Ptr { + dest.Set(reflect.New(dest.Type().Elem())) + } + if err := mergeVal(src.Index(i), dest, deterministic); err != nil { + return err + } + } + } else if targetType.Kind() == reflect.Map { + return mergeMapVal(src, target, targetType, deterministic) + } else if srcType == typeOfDynamicMessage && targetType.Implements(typeOfProtoMessage) { + dm := src.Interface().(*Message) + if target.IsNil() { + target.Set(reflect.New(targetType.Elem())) + } + m := target.Interface().(proto.Message) + if err := dm.mergeInto(m, deterministic); err != nil { + return err + } + } else { + return fmt.Errorf("cannot convert %v to %v", srcType, targetType) + } + return nil +} + +func (m *Message) mergeFrom(pm proto.Message) error { + if dm, ok := pm.(*Message); ok { + // if given message is also a dynamic message, we merge differently + for tag, v := range dm.values { + fd := m.FindFieldDescriptor(tag) + if fd == nil { + fd = dm.FindFieldDescriptor(tag) + } + if err := mergeField(m, fd, v); err != nil { + return err + } + } + return nil + } + + pmrv := reflect.ValueOf(pm) + if pmrv.IsNil() { + // nil is an empty message, so nothing to do + return nil + } + + // check that we can successfully do the merge + src := pmrv.Elem() + values := map[*desc.FieldDescriptor]interface{}{} + props := proto.GetProperties(reflect.TypeOf(pm).Elem()) + if props == nil { + return fmt.Errorf("could not determine message properties to merge for %v", reflect.TypeOf(pm).Elem()) + } + + // regular fields + for _, prop := range props.Prop { + if prop.Tag == 0 { + continue // one-of or special field (such as XXX_unrecognized, etc.) + } + fd := m.FindFieldDescriptor(int32(prop.Tag)) + if fd == nil { + // Our descriptor has different fields than this message object. So + // try to reflect on the message object's fields. + md, err := desc.LoadMessageDescriptorForMessage(pm) + if err != nil { + return err + } + fd = md.FindFieldByNumber(int32(prop.Tag)) + if fd == nil { + return fmt.Errorf("message descriptor %q did not contain field for tag %d (%q)", md.GetFullyQualifiedName(), prop.Tag, prop.Name) + } + } + rv := src.FieldByName(prop.Name) + if (rv.Kind() == reflect.Ptr || rv.Kind() == reflect.Slice) && rv.IsNil() { + continue + } + if v, err := validFieldValueForRv(fd, rv); err != nil { + return err + } else { + values[fd] = v + } + } + + // one-of fields + for _, oop := range props.OneofTypes { + oov := src.Field(oop.Field).Elem() + if !oov.IsValid() || oov.Type() != oop.Type { + // this field is unset (in other words, one-of message field is not currently set to this option) + continue + } + prop := oop.Prop + rv := oov.Elem().FieldByName(prop.Name) + fd := m.FindFieldDescriptor(int32(prop.Tag)) + if fd == nil { + // Our descriptor has different fields than this message object. So + // try to reflect on the message object's fields. + md, err := desc.LoadMessageDescriptorForMessage(pm) + if err != nil { + return err + } + fd = md.FindFieldByNumber(int32(prop.Tag)) + if fd == nil { + return fmt.Errorf("message descriptor %q did not contain field for tag %d (%q in one-of %q)", md.GetFullyQualifiedName(), prop.Tag, prop.Name, src.Type().Field(oop.Field).Name) + } + } + if v, err := validFieldValueForRv(fd, rv); err != nil { + return err + } else { + values[fd] = v + } + } + + // extension fields + rexts, _ := proto.ExtensionDescs(pm) + var unknownExtensions []byte + for _, ed := range rexts { + v, _ := proto.GetExtension(pm, ed) + if v == nil { + continue + } + if ed.ExtensionType == nil { + extBytes, _ := v.([]byte) + if len(extBytes) > 0 { + unknownExtensions = append(unknownExtensions, extBytes...) + } + continue + } + fd := m.er.FindExtension(m.md.GetFullyQualifiedName(), ed.Field) + if fd == nil { + var err error + if fd, err = desc.LoadFieldDescriptorForExtension(ed); err != nil { + return err + } + } + if v, err := validFieldValue(fd, v); err != nil { + return err + } else { + values[fd] = v + } + } + + // now actually perform the merge + for fd, v := range values { + if err := mergeField(m, fd, v); err != nil { + return err + } + } + + data := internal.GetUnrecognized(pm) + if len(data) > 0 { + // ignore any error returned: pulling in unknown fields is best-effort + _ = m.UnmarshalMerge(data) + } + + // lastly, also extract any unknown extensions the message may have (unknown extensions + // are stored with other extensions, not in the XXX_unrecognized field, so we have to do + // more than just the step above...) + if len(unknownExtensions) > 0 { + // pulling in unknown fields is best-effort, so we just ignore errors + _ = m.UnmarshalMerge(unknownExtensions) + } + return nil +} + +// Validate checks that all required fields are present. It returns an error if any are absent. +func (m *Message) Validate() error { + missingFields := m.findMissingFields() + if len(missingFields) == 0 { + return nil + } + return fmt.Errorf("some required fields missing: %v", strings.Join(missingFields, ", ")) +} + +func (m *Message) findMissingFields() []string { + if m.md.IsProto3() { + // proto3 does not allow required fields + return nil + } + var missingFields []string + for _, fd := range m.md.GetFields() { + if fd.IsRequired() { + if _, ok := m.values[fd.GetNumber()]; !ok { + missingFields = append(missingFields, fd.GetName()) + } + } + } + return missingFields +} + +// ValidateRecursive checks that all required fields are present and also +// recursively validates all fields who are also messages. It returns an error +// if any required fields, in this message or nested within, are absent. +func (m *Message) ValidateRecursive() error { + return m.validateRecursive("") +} + +func (m *Message) validateRecursive(prefix string) error { + if missingFields := m.findMissingFields(); len(missingFields) > 0 { + for i := range missingFields { + missingFields[i] = fmt.Sprintf("%s%s", prefix, missingFields[i]) + } + return fmt.Errorf("some required fields missing: %v", strings.Join(missingFields, ", ")) + } + + for tag, fld := range m.values { + fd := m.FindFieldDescriptor(tag) + var chprefix string + var md *desc.MessageDescriptor + checkMsg := func(pm proto.Message) error { + var dm *Message + if d, ok := pm.(*Message); ok { + dm = d + } else { + dm = m.mf.NewDynamicMessage(md) + if err := dm.ConvertFrom(pm); err != nil { + return nil + } + } + if err := dm.validateRecursive(chprefix); err != nil { + return err + } + return nil + } + isMap := fd.IsMap() + if isMap && fd.GetMapValueType().GetMessageType() != nil { + md = fd.GetMapValueType().GetMessageType() + mp := fld.(map[interface{}]interface{}) + for k, v := range mp { + chprefix = fmt.Sprintf("%s%s[%v].", prefix, getName(fd), k) + if err := checkMsg(v.(proto.Message)); err != nil { + return err + } + } + } else if !isMap && fd.GetMessageType() != nil { + md = fd.GetMessageType() + if fd.IsRepeated() { + sl := fld.([]interface{}) + for i, v := range sl { + chprefix = fmt.Sprintf("%s%s[%d].", prefix, getName(fd), i) + if err := checkMsg(v.(proto.Message)); err != nil { + return err + } + } + } else { + chprefix = fmt.Sprintf("%s%s.", prefix, getName(fd)) + if err := checkMsg(fld.(proto.Message)); err != nil { + return err + } + } + } + } + + return nil +} + +func getName(fd *desc.FieldDescriptor) string { + if fd.IsExtension() { + return fmt.Sprintf("(%s)", fd.GetFullyQualifiedName()) + } else { + return fd.GetName() + } +} + +// knownFieldTags return tags of present and recognized fields, in sorted order. +func (m *Message) knownFieldTags() []int { + if len(m.values) == 0 { + return []int(nil) + } + + keys := make([]int, len(m.values)) + i := 0 + for k := range m.values { + keys[i] = int(k) + i++ + } + + sort.Ints(keys) + return keys +} + +// allKnownFieldTags return tags of present and recognized fields, including +// those that are unset, in sorted order. This only includes extensions that are +// present. Known but not-present extensions are not included in the returned +// set of tags. +func (m *Message) allKnownFieldTags() []int { + fds := m.md.GetFields() + keys := make([]int, 0, len(fds)+len(m.extraFields)) + + for k := range m.values { + keys = append(keys, int(k)) + } + + // also include known fields that are not present + for _, fd := range fds { + if _, ok := m.values[fd.GetNumber()]; !ok { + keys = append(keys, int(fd.GetNumber())) + } + } + for _, fd := range m.extraFields { + if !fd.IsExtension() { // skip extensions that are not present + if _, ok := m.values[fd.GetNumber()]; !ok { + keys = append(keys, int(fd.GetNumber())) + } + } + } + + sort.Ints(keys) + return keys +} + +// unknownFieldTags return tags of present but unrecognized fields, in sorted order. +func (m *Message) unknownFieldTags() []int { + if len(m.unknownFields) == 0 { + return []int(nil) + } + keys := make([]int, len(m.unknownFields)) + i := 0 + for k := range m.unknownFields { + keys[i] = int(k) + i++ + } + sort.Ints(keys) + return keys +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/equal.go b/vendor/github.com/jhump/protoreflect/dynamic/equal.go new file mode 100644 index 00000000..e44c6c53 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/equal.go @@ -0,0 +1,157 @@ +package dynamic + +import ( + "bytes" + "reflect" + + "github.com/golang/protobuf/proto" + + "github.com/jhump/protoreflect/desc" +) + +// Equal returns true if the given two dynamic messages are equal. Two messages are equal when they +// have the same message type and same fields set to equal values. For proto3 messages, fields set +// to their zero value are considered unset. +func Equal(a, b *Message) bool { + if a == b { + return true + } + if (a == nil) != (b == nil) { + return false + } + if a.md.GetFullyQualifiedName() != b.md.GetFullyQualifiedName() { + return false + } + if len(a.values) != len(b.values) { + return false + } + if len(a.unknownFields) != len(b.unknownFields) { + return false + } + for tag, aval := range a.values { + bval, ok := b.values[tag] + if !ok { + return false + } + if !fieldsEqual(aval, bval) { + return false + } + } + for tag, au := range a.unknownFields { + bu, ok := b.unknownFields[tag] + if !ok { + return false + } + if len(au) != len(bu) { + return false + } + for i, aval := range au { + bval := bu[i] + if aval.Encoding != bval.Encoding { + return false + } + if aval.Encoding == proto.WireBytes || aval.Encoding == proto.WireStartGroup { + if !bytes.Equal(aval.Contents, bval.Contents) { + return false + } + } else if aval.Value != bval.Value { + return false + } + } + } + // all checks pass! + return true +} + +func fieldsEqual(aval, bval interface{}) bool { + arv := reflect.ValueOf(aval) + brv := reflect.ValueOf(bval) + if arv.Type() != brv.Type() { + // it is possible that one is a dynamic message and one is not + apm, ok := aval.(proto.Message) + if !ok { + return false + } + bpm, ok := bval.(proto.Message) + if !ok { + return false + } + return MessagesEqual(apm, bpm) + + } else { + switch arv.Kind() { + case reflect.Ptr: + apm, ok := aval.(proto.Message) + if !ok { + // Don't know how to compare pointer values that aren't messages! + // Maybe this should panic? + return false + } + bpm := bval.(proto.Message) // we know it will succeed because we know a and b have same type + return MessagesEqual(apm, bpm) + + case reflect.Map: + return mapsEqual(arv, brv) + + case reflect.Slice: + if arv.Type() == typeOfBytes { + return bytes.Equal(aval.([]byte), bval.([]byte)) + } else { + return slicesEqual(arv, brv) + } + + default: + return aval == bval + } + } +} + +func slicesEqual(a, b reflect.Value) bool { + if a.Len() != b.Len() { + return false + } + for i := 0; i < a.Len(); i++ { + ai := a.Index(i) + bi := b.Index(i) + if !fieldsEqual(ai.Interface(), bi.Interface()) { + return false + } + } + return true +} + +// MessagesEqual returns true if the given two messages are equal. Use this instead of proto.Equal +// when one or both of the messages might be a dynamic message. +func MessagesEqual(a, b proto.Message) bool { + da, aok := a.(*Message) + db, bok := b.(*Message) + // Both dynamic messages + if aok && bok { + return Equal(da, db) + } + // Neither dynamic messages + if !aok && !bok { + return proto.Equal(a, b) + } + // Mixed + if bok { + // we want a to be the dynamic one + b, da = a, db + } + + // Instead of panic'ing below if we have a nil dynamic message, check + // now and return false if the input message is not also nil. + if da == nil { + return isNil(b) + } + + md, err := desc.LoadMessageDescriptorForMessage(b) + if err != nil { + return false + } + db = NewMessageWithMessageFactory(md, da.mf) + if db.ConvertFrom(b) != nil { + return false + } + return Equal(da, db) +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/extension.go b/vendor/github.com/jhump/protoreflect/dynamic/extension.go new file mode 100644 index 00000000..1d381610 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/extension.go @@ -0,0 +1,46 @@ +package dynamic + +import ( + "fmt" + + "github.com/golang/protobuf/proto" + + "github.com/jhump/protoreflect/codec" + "github.com/jhump/protoreflect/desc" +) + +// SetExtension sets the given extension value. If the given message is not a +// dynamic message, the given extension may not be recognized (or may differ +// from the compiled and linked in version of the extension. So in that case, +// this function will serialize the given value to bytes and then use +// proto.SetRawExtension to set the value. +func SetExtension(msg proto.Message, extd *desc.FieldDescriptor, val interface{}) error { + if !extd.IsExtension() { + return fmt.Errorf("given field %s is not an extension", extd.GetFullyQualifiedName()) + } + + if dm, ok := msg.(*Message); ok { + return dm.TrySetField(extd, val) + } + + md, err := desc.LoadMessageDescriptorForMessage(msg) + if err != nil { + return err + } + if err := checkField(extd, md); err != nil { + return err + } + + val, err = validFieldValue(extd, val) + if err != nil { + return err + } + + var b codec.Buffer + b.SetDeterministic(defaultDeterminism) + if err := b.EncodeFieldValue(extd, val); err != nil { + return err + } + proto.SetRawExtension(msg, extd.GetNumber(), b.Bytes()) + return nil +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/extension_registry.go b/vendor/github.com/jhump/protoreflect/dynamic/extension_registry.go new file mode 100644 index 00000000..68768278 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/extension_registry.go @@ -0,0 +1,241 @@ +package dynamic + +import ( + "fmt" + "reflect" + "sync" + + "github.com/golang/protobuf/proto" + + "github.com/jhump/protoreflect/desc" +) + +// ExtensionRegistry is a registry of known extension fields. This is used to parse +// extension fields encountered when de-serializing a dynamic message. +type ExtensionRegistry struct { + includeDefault bool + mu sync.RWMutex + exts map[string]map[int32]*desc.FieldDescriptor +} + +// NewExtensionRegistryWithDefaults is a registry that includes all "default" extensions, +// which are those that are statically linked into the current program (e.g. registered by +// protoc-generated code via proto.RegisterExtension). Extensions explicitly added to the +// registry will override any default extensions that are for the same extendee and have the +// same tag number and/or name. +func NewExtensionRegistryWithDefaults() *ExtensionRegistry { + return &ExtensionRegistry{includeDefault: true} +} + +// AddExtensionDesc adds the given extensions to the registry. +func (r *ExtensionRegistry) AddExtensionDesc(exts ...*proto.ExtensionDesc) error { + flds := make([]*desc.FieldDescriptor, len(exts)) + for i, ext := range exts { + fd, err := desc.LoadFieldDescriptorForExtension(ext) + if err != nil { + return err + } + flds[i] = fd + } + r.mu.Lock() + defer r.mu.Unlock() + if r.exts == nil { + r.exts = map[string]map[int32]*desc.FieldDescriptor{} + } + for _, fd := range flds { + r.putExtensionLocked(fd) + } + return nil +} + +// AddExtension adds the given extensions to the registry. The given extensions +// will overwrite any previously added extensions that are for the same extendee +// message and same extension tag number. +func (r *ExtensionRegistry) AddExtension(exts ...*desc.FieldDescriptor) error { + for _, ext := range exts { + if !ext.IsExtension() { + return fmt.Errorf("given field is not an extension: %s", ext.GetFullyQualifiedName()) + } + } + r.mu.Lock() + defer r.mu.Unlock() + if r.exts == nil { + r.exts = map[string]map[int32]*desc.FieldDescriptor{} + } + for _, ext := range exts { + r.putExtensionLocked(ext) + } + return nil +} + +// AddExtensionsFromFile adds to the registry all extension fields defined in the given file descriptor. +func (r *ExtensionRegistry) AddExtensionsFromFile(fd *desc.FileDescriptor) { + r.mu.Lock() + defer r.mu.Unlock() + r.addExtensionsFromFileLocked(fd, false, nil) +} + +// AddExtensionsFromFileRecursively adds to the registry all extension fields defined in the give file +// descriptor and also recursively adds all extensions defined in that file's dependencies. This adds +// extensions from the entire transitive closure for the given file. +func (r *ExtensionRegistry) AddExtensionsFromFileRecursively(fd *desc.FileDescriptor) { + r.mu.Lock() + defer r.mu.Unlock() + already := map[*desc.FileDescriptor]struct{}{} + r.addExtensionsFromFileLocked(fd, true, already) +} + +func (r *ExtensionRegistry) addExtensionsFromFileLocked(fd *desc.FileDescriptor, recursive bool, alreadySeen map[*desc.FileDescriptor]struct{}) { + if _, ok := alreadySeen[fd]; ok { + return + } + + if r.exts == nil { + r.exts = map[string]map[int32]*desc.FieldDescriptor{} + } + for _, ext := range fd.GetExtensions() { + r.putExtensionLocked(ext) + } + for _, msg := range fd.GetMessageTypes() { + r.addExtensionsFromMessageLocked(msg) + } + + if recursive { + alreadySeen[fd] = struct{}{} + for _, dep := range fd.GetDependencies() { + r.addExtensionsFromFileLocked(dep, recursive, alreadySeen) + } + } +} + +func (r *ExtensionRegistry) addExtensionsFromMessageLocked(md *desc.MessageDescriptor) { + for _, ext := range md.GetNestedExtensions() { + r.putExtensionLocked(ext) + } + for _, msg := range md.GetNestedMessageTypes() { + r.addExtensionsFromMessageLocked(msg) + } +} + +func (r *ExtensionRegistry) putExtensionLocked(fd *desc.FieldDescriptor) { + msgName := fd.GetOwner().GetFullyQualifiedName() + m := r.exts[msgName] + if m == nil { + m = map[int32]*desc.FieldDescriptor{} + r.exts[msgName] = m + } + m[fd.GetNumber()] = fd +} + +// FindExtension queries for the extension field with the given extendee name (must be a fully-qualified +// message name) and tag number. If no extension is known, nil is returned. +func (r *ExtensionRegistry) FindExtension(messageName string, tagNumber int32) *desc.FieldDescriptor { + if r == nil { + return nil + } + r.mu.RLock() + defer r.mu.RUnlock() + fd := r.exts[messageName][tagNumber] + if fd == nil && r.includeDefault { + ext := getDefaultExtensions(messageName)[tagNumber] + if ext != nil { + fd, _ = desc.LoadFieldDescriptorForExtension(ext) + } + } + return fd +} + +// FindExtensionByName queries for the extension field with the given extendee name (must be a fully-qualified +// message name) and field name (must also be a fully-qualified extension name). If no extension is known, nil +// is returned. +func (r *ExtensionRegistry) FindExtensionByName(messageName string, fieldName string) *desc.FieldDescriptor { + if r == nil { + return nil + } + r.mu.RLock() + defer r.mu.RUnlock() + for _, fd := range r.exts[messageName] { + if fd.GetFullyQualifiedName() == fieldName { + return fd + } + } + if r.includeDefault { + for _, ext := range getDefaultExtensions(messageName) { + fd, _ := desc.LoadFieldDescriptorForExtension(ext) + if fd.GetFullyQualifiedName() == fieldName { + return fd + } + } + } + return nil +} + +// FindExtensionByJSONName queries for the extension field with the given extendee name (must be a fully-qualified +// message name) and JSON field name (must also be a fully-qualified name). If no extension is known, nil is returned. +// The fully-qualified JSON name is the same as the extension's normal fully-qualified name except that the last +// component uses the field's JSON name (if present). +func (r *ExtensionRegistry) FindExtensionByJSONName(messageName string, fieldName string) *desc.FieldDescriptor { + if r == nil { + return nil + } + r.mu.RLock() + defer r.mu.RUnlock() + for _, fd := range r.exts[messageName] { + if fd.GetFullyQualifiedJSONName() == fieldName { + return fd + } + } + if r.includeDefault { + for _, ext := range getDefaultExtensions(messageName) { + fd, _ := desc.LoadFieldDescriptorForExtension(ext) + if fd.GetFullyQualifiedJSONName() == fieldName { + return fd + } + } + } + return nil +} + +func getDefaultExtensions(messageName string) map[int32]*proto.ExtensionDesc { + t := proto.MessageType(messageName) + if t != nil { + msg := reflect.Zero(t).Interface().(proto.Message) + return proto.RegisteredExtensions(msg) + } + return nil +} + +// AllExtensionsForType returns all known extension fields for the given extendee name (must be a +// fully-qualified message name). +func (r *ExtensionRegistry) AllExtensionsForType(messageName string) []*desc.FieldDescriptor { + if r == nil { + return []*desc.FieldDescriptor(nil) + } + r.mu.RLock() + defer r.mu.RUnlock() + flds := r.exts[messageName] + var ret []*desc.FieldDescriptor + if r.includeDefault { + exts := getDefaultExtensions(messageName) + if len(exts) > 0 || len(flds) > 0 { + ret = make([]*desc.FieldDescriptor, 0, len(exts)+len(flds)) + } + for tag, ext := range exts { + if _, ok := flds[tag]; ok { + // skip default extension and use the one explicitly registered instead + continue + } + fd, _ := desc.LoadFieldDescriptorForExtension(ext) + if fd != nil { + ret = append(ret, fd) + } + } + } else if len(flds) > 0 { + ret = make([]*desc.FieldDescriptor, 0, len(flds)) + } + + for _, ext := range flds { + ret = append(ret, ext) + } + return ret +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/indent.go b/vendor/github.com/jhump/protoreflect/dynamic/indent.go new file mode 100644 index 00000000..bd7fcaa5 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/indent.go @@ -0,0 +1,76 @@ +package dynamic + +import "bytes" + +type indentBuffer struct { + bytes.Buffer + indent string + indentCount int + comma bool +} + +func (b *indentBuffer) start() error { + if b.indentCount >= 0 { + b.indentCount++ + return b.newLine(false) + } + return nil +} + +func (b *indentBuffer) sep() error { + if b.indentCount >= 0 { + _, err := b.WriteString(": ") + return err + } else { + return b.WriteByte(':') + } +} + +func (b *indentBuffer) end() error { + if b.indentCount >= 0 { + b.indentCount-- + return b.newLine(false) + } + return nil +} + +func (b *indentBuffer) maybeNext(first *bool) error { + if *first { + *first = false + return nil + } else { + return b.next() + } +} + +func (b *indentBuffer) next() error { + if b.indentCount >= 0 { + return b.newLine(b.comma) + } else if b.comma { + return b.WriteByte(',') + } else { + return b.WriteByte(' ') + } +} + +func (b *indentBuffer) newLine(comma bool) error { + if comma { + err := b.WriteByte(',') + if err != nil { + return err + } + } + + err := b.WriteByte('\n') + if err != nil { + return err + } + + for i := 0; i < b.indentCount; i++ { + _, err := b.WriteString(b.indent) + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/json.go b/vendor/github.com/jhump/protoreflect/dynamic/json.go new file mode 100644 index 00000000..38e5632e --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/json.go @@ -0,0 +1,1254 @@ +package dynamic + +// JSON marshalling and unmarshalling for dynamic messages + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "math" + "reflect" + "sort" + "strconv" + "strings" + + "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/protoc-gen-go/descriptor" + // link in the well-known-types that have a special JSON format + _ "github.com/golang/protobuf/ptypes/any" + _ "github.com/golang/protobuf/ptypes/duration" + _ "github.com/golang/protobuf/ptypes/empty" + _ "github.com/golang/protobuf/ptypes/struct" + _ "github.com/golang/protobuf/ptypes/timestamp" + _ "github.com/golang/protobuf/ptypes/wrappers" + + "github.com/jhump/protoreflect/desc" +) + +var wellKnownTypeNames = map[string]struct{}{ + "google.protobuf.Any": {}, + "google.protobuf.Empty": {}, + "google.protobuf.Duration": {}, + "google.protobuf.Timestamp": {}, + // struct.proto + "google.protobuf.Struct": {}, + "google.protobuf.Value": {}, + "google.protobuf.ListValue": {}, + // wrappers.proto + "google.protobuf.DoubleValue": {}, + "google.protobuf.FloatValue": {}, + "google.protobuf.Int64Value": {}, + "google.protobuf.UInt64Value": {}, + "google.protobuf.Int32Value": {}, + "google.protobuf.UInt32Value": {}, + "google.protobuf.BoolValue": {}, + "google.protobuf.StringValue": {}, + "google.protobuf.BytesValue": {}, +} + +// MarshalJSON serializes this message to bytes in JSON format, returning an +// error if the operation fails. The resulting bytes will be a valid UTF8 +// string. +// +// This method uses a compact form: no newlines, and spaces between fields and +// between field identifiers and values are elided. +// +// This method is convenient shorthand for invoking MarshalJSONPB with a default +// (zero value) marshaler: +// +// m.MarshalJSONPB(&jsonpb.Marshaler{}) +// +// So enums are serialized using enum value name strings, and values that are +// not present (including those with default/zero value for messages defined in +// "proto3" syntax) are omitted. +func (m *Message) MarshalJSON() ([]byte, error) { + return m.MarshalJSONPB(&jsonpb.Marshaler{}) +} + +// MarshalJSONIndent serializes this message to bytes in JSON format, returning +// an error if the operation fails. The resulting bytes will be a valid UTF8 +// string. +// +// This method uses a "pretty-printed" form, with each field on its own line and +// spaces between field identifiers and values. Indentation of two spaces is +// used. +// +// This method is convenient shorthand for invoking MarshalJSONPB with a default +// (zero value) marshaler: +// +// m.MarshalJSONPB(&jsonpb.Marshaler{Indent: " "}) +// +// So enums are serialized using enum value name strings, and values that are +// not present (including those with default/zero value for messages defined in +// "proto3" syntax) are omitted. +func (m *Message) MarshalJSONIndent() ([]byte, error) { + return m.MarshalJSONPB(&jsonpb.Marshaler{Indent: " "}) +} + +// MarshalJSONPB serializes this message to bytes in JSON format, returning an +// error if the operation fails. The resulting bytes will be a valid UTF8 +// string. The given marshaler is used to convey options used during marshaling. +// +// If this message contains nested messages that are generated message types (as +// opposed to dynamic messages), the given marshaler is used to marshal it. +// +// When marshaling any nested messages, any jsonpb.AnyResolver configured in the +// given marshaler is augmented with knowledge of message types known to this +// message's descriptor (and its enclosing file and set of transitive +// dependencies). +func (m *Message) MarshalJSONPB(opts *jsonpb.Marshaler) ([]byte, error) { + var b indentBuffer + b.indent = opts.Indent + if len(opts.Indent) == 0 { + b.indentCount = -1 + } + b.comma = true + if err := m.marshalJSON(&b, opts); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +func (m *Message) marshalJSON(b *indentBuffer, opts *jsonpb.Marshaler) error { + if m == nil { + _, err := b.WriteString("null") + return err + } + if r, changed := wrapResolver(opts.AnyResolver, m.mf, m.md.GetFile()); changed { + newOpts := *opts + newOpts.AnyResolver = r + opts = &newOpts + } + + if ok, err := marshalWellKnownType(m, b, opts); ok { + return err + } + + err := b.WriteByte('{') + if err != nil { + return err + } + err = b.start() + if err != nil { + return err + } + + var tags []int + if opts.EmitDefaults { + tags = m.allKnownFieldTags() + } else { + tags = m.knownFieldTags() + } + + first := true + + for _, tag := range tags { + itag := int32(tag) + fd := m.FindFieldDescriptor(itag) + + v, ok := m.values[itag] + if !ok { + if fd.GetOneOf() != nil { + // don't print defaults for fields in a oneof + continue + } + v = fd.GetDefaultValue() + } + + err := b.maybeNext(&first) + if err != nil { + return err + } + err = marshalKnownFieldJSON(b, fd, v, opts) + if err != nil { + return err + } + } + + err = b.end() + if err != nil { + return err + } + err = b.WriteByte('}') + if err != nil { + return err + } + + return nil +} + +func marshalWellKnownType(m *Message, b *indentBuffer, opts *jsonpb.Marshaler) (bool, error) { + fqn := m.md.GetFullyQualifiedName() + if _, ok := wellKnownTypeNames[fqn]; !ok { + return false, nil + } + + msgType := proto.MessageType(fqn) + if msgType == nil { + // wtf? + panic(fmt.Sprintf("could not find registered message type for %q", fqn)) + } + + // convert dynamic message to well-known type and let jsonpb marshal it + msg := reflect.New(msgType.Elem()).Interface().(proto.Message) + if err := m.MergeInto(msg); err != nil { + return true, err + } + return true, opts.Marshal(b, msg) +} + +func marshalKnownFieldJSON(b *indentBuffer, fd *desc.FieldDescriptor, v interface{}, opts *jsonpb.Marshaler) error { + var jsonName string + if opts.OrigName { + jsonName = fd.GetName() + } else { + jsonName = fd.AsFieldDescriptorProto().GetJsonName() + if jsonName == "" { + jsonName = fd.GetName() + } + } + if fd.IsExtension() { + var scope string + switch parent := fd.GetParent().(type) { + case *desc.FileDescriptor: + scope = parent.GetPackage() + default: + scope = parent.GetFullyQualifiedName() + } + if scope == "" { + jsonName = fmt.Sprintf("[%s]", jsonName) + } else { + jsonName = fmt.Sprintf("[%s.%s]", scope, jsonName) + } + } + err := writeJsonString(b, jsonName) + if err != nil { + return err + } + err = b.sep() + if err != nil { + return err + } + + if isNil(v) { + _, err := b.WriteString("null") + return err + } + + if fd.IsMap() { + err = b.WriteByte('{') + if err != nil { + return err + } + err = b.start() + if err != nil { + return err + } + + md := fd.GetMessageType() + vfd := md.FindFieldByNumber(2) + + mp := v.(map[interface{}]interface{}) + keys := make([]interface{}, 0, len(mp)) + for k := range mp { + keys = append(keys, k) + } + sort.Sort(sortable(keys)) + first := true + for _, mk := range keys { + mv := mp[mk] + err := b.maybeNext(&first) + if err != nil { + return err + } + + err = marshalKnownFieldMapEntryJSON(b, mk, vfd, mv, opts) + if err != nil { + return err + } + } + + err = b.end() + if err != nil { + return err + } + return b.WriteByte('}') + + } else if fd.IsRepeated() { + err = b.WriteByte('[') + if err != nil { + return err + } + err = b.start() + if err != nil { + return err + } + + sl := v.([]interface{}) + first := true + for _, slv := range sl { + err := b.maybeNext(&first) + if err != nil { + return err + } + err = marshalKnownFieldValueJSON(b, fd, slv, opts) + if err != nil { + return err + } + } + + err = b.end() + if err != nil { + return err + } + return b.WriteByte(']') + + } else { + return marshalKnownFieldValueJSON(b, fd, v, opts) + } +} + +// sortable is used to sort map keys. Values will be integers (int32, int64, uint32, and uint64), +// bools, or strings. +type sortable []interface{} + +func (s sortable) Len() int { + return len(s) +} + +func (s sortable) Less(i, j int) bool { + vi := s[i] + vj := s[j] + switch reflect.TypeOf(vi).Kind() { + case reflect.Int32: + return vi.(int32) < vj.(int32) + case reflect.Int64: + return vi.(int64) < vj.(int64) + case reflect.Uint32: + return vi.(uint32) < vj.(uint32) + case reflect.Uint64: + return vi.(uint64) < vj.(uint64) + case reflect.String: + return vi.(string) < vj.(string) + case reflect.Bool: + return !vi.(bool) && vj.(bool) + default: + panic(fmt.Sprintf("cannot compare keys of type %v", reflect.TypeOf(vi))) + } +} + +func (s sortable) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func isNil(v interface{}) bool { + if v == nil { + return true + } + rv := reflect.ValueOf(v) + return rv.Kind() == reflect.Ptr && rv.IsNil() +} + +func marshalKnownFieldMapEntryJSON(b *indentBuffer, mk interface{}, vfd *desc.FieldDescriptor, mv interface{}, opts *jsonpb.Marshaler) error { + rk := reflect.ValueOf(mk) + var strkey string + switch rk.Kind() { + case reflect.Bool: + strkey = strconv.FormatBool(rk.Bool()) + case reflect.Int32, reflect.Int64: + strkey = strconv.FormatInt(rk.Int(), 10) + case reflect.Uint32, reflect.Uint64: + strkey = strconv.FormatUint(rk.Uint(), 10) + case reflect.String: + strkey = rk.String() + default: + return fmt.Errorf("invalid map key value: %v (%v)", mk, rk.Type()) + } + err := writeString(b, strkey) + if err != nil { + return err + } + err = b.sep() + if err != nil { + return err + } + return marshalKnownFieldValueJSON(b, vfd, mv, opts) +} + +func marshalKnownFieldValueJSON(b *indentBuffer, fd *desc.FieldDescriptor, v interface{}, opts *jsonpb.Marshaler) error { + rv := reflect.ValueOf(v) + switch rv.Kind() { + case reflect.Int64: + return writeJsonString(b, strconv.FormatInt(rv.Int(), 10)) + case reflect.Int32: + ed := fd.GetEnumType() + if !opts.EnumsAsInts && ed != nil { + n := int32(rv.Int()) + vd := ed.FindValueByNumber(n) + if vd == nil { + _, err := b.WriteString(strconv.FormatInt(rv.Int(), 10)) + return err + } else { + return writeJsonString(b, vd.GetName()) + } + } else { + _, err := b.WriteString(strconv.FormatInt(rv.Int(), 10)) + return err + } + case reflect.Uint64: + return writeJsonString(b, strconv.FormatUint(rv.Uint(), 10)) + case reflect.Uint32: + _, err := b.WriteString(strconv.FormatUint(rv.Uint(), 10)) + return err + case reflect.Float32, reflect.Float64: + f := rv.Float() + var str string + if math.IsNaN(f) { + str = `"NaN"` + } else if math.IsInf(f, 1) { + str = `"Infinity"` + } else if math.IsInf(f, -1) { + str = `"-Infinity"` + } else { + var bits int + if rv.Kind() == reflect.Float32 { + bits = 32 + } else { + bits = 64 + } + str = strconv.FormatFloat(rv.Float(), 'g', -1, bits) + } + _, err := b.WriteString(str) + return err + case reflect.Bool: + _, err := b.WriteString(strconv.FormatBool(rv.Bool())) + return err + case reflect.Slice: + bstr := base64.StdEncoding.EncodeToString(rv.Bytes()) + return writeJsonString(b, bstr) + case reflect.String: + return writeJsonString(b, rv.String()) + default: + // must be a message + if isNil(v) { + _, err := b.WriteString("null") + return err + } + + if dm, ok := v.(*Message); ok { + return dm.marshalJSON(b, opts) + } + + var err error + if b.indentCount <= 0 || len(b.indent) == 0 { + err = opts.Marshal(b, v.(proto.Message)) + } else { + str, err := opts.MarshalToString(v.(proto.Message)) + if err != nil { + return err + } + indent := strings.Repeat(b.indent, b.indentCount) + pos := 0 + // add indention prefix to each line + for pos < len(str) { + start := pos + nextPos := strings.Index(str[pos:], "\n") + if nextPos == -1 { + nextPos = len(str) + } else { + nextPos = pos + nextPos + 1 // include newline + } + line := str[start:nextPos] + if pos > 0 { + _, err = b.WriteString(indent) + if err != nil { + return err + } + } + _, err = b.WriteString(line) + if err != nil { + return err + } + pos = nextPos + } + } + return err + } +} + +func writeJsonString(b *indentBuffer, s string) error { + if sbytes, err := json.Marshal(s); err != nil { + return err + } else { + _, err := b.Write(sbytes) + return err + } +} + +// UnmarshalJSON de-serializes the message that is present, in JSON format, in +// the given bytes into this message. It first resets the current message. It +// returns an error if the given bytes do not contain a valid encoding of this +// message type in JSON format. +// +// This method is shorthand for invoking UnmarshalJSONPB with a default (zero +// value) unmarshaler: +// +// m.UnmarshalMergeJSONPB(&jsonpb.Unmarshaler{}, js) +// +// So unknown fields will result in an error, and no provided jsonpb.AnyResolver +// will be used when parsing google.protobuf.Any messages. +func (m *Message) UnmarshalJSON(js []byte) error { + return m.UnmarshalJSONPB(&jsonpb.Unmarshaler{}, js) +} + +// UnmarshalMergeJSON de-serializes the message that is present, in JSON format, +// in the given bytes into this message. Unlike UnmarshalJSON, it does not first +// reset the message, instead merging the data in the given bytes into the +// existing data in this message. +func (m *Message) UnmarshalMergeJSON(js []byte) error { + return m.UnmarshalMergeJSONPB(&jsonpb.Unmarshaler{}, js) +} + +// UnmarshalJSONPB de-serializes the message that is present, in JSON format, in +// the given bytes into this message. The given unmarshaler conveys options used +// when parsing the JSON. This function first resets the current message. It +// returns an error if the given bytes do not contain a valid encoding of this +// message type in JSON format. +// +// The decoding is lenient: +// 1. The JSON can refer to fields either by their JSON name or by their +// declared name. +// 2. The JSON can use either numeric values or string names for enum values. +// +// When instantiating nested messages, if this message's associated factory +// returns a generated message type (as opposed to a dynamic message), the given +// unmarshaler is used to unmarshal it. +// +// When unmarshaling any nested messages, any jsonpb.AnyResolver configured in +// the given unmarshaler is augmented with knowledge of message types known to +// this message's descriptor (and its enclosing file and set of transitive +// dependencies). +func (m *Message) UnmarshalJSONPB(opts *jsonpb.Unmarshaler, js []byte) error { + m.Reset() + if err := m.UnmarshalMergeJSONPB(opts, js); err != nil { + return err + } + return m.Validate() +} + +// UnmarshalMergeJSONPB de-serializes the message that is present, in JSON +// format, in the given bytes into this message. The given unmarshaler conveys +// options used when parsing the JSON. Unlike UnmarshalJSONPB, it does not first +// reset the message, instead merging the data in the given bytes into the +// existing data in this message. +func (m *Message) UnmarshalMergeJSONPB(opts *jsonpb.Unmarshaler, js []byte) error { + r := newJsReader(js) + err := m.unmarshalJson(r, opts) + if err != nil { + return err + } + if t, err := r.poll(); err != io.EOF { + b, _ := ioutil.ReadAll(r.unread()) + s := fmt.Sprintf("%v%s", t, string(b)) + return fmt.Errorf("superfluous data found after JSON object: %q", s) + } + return nil +} + +func unmarshalWellKnownType(m *Message, r *jsReader, opts *jsonpb.Unmarshaler) (bool, error) { + fqn := m.md.GetFullyQualifiedName() + if _, ok := wellKnownTypeNames[fqn]; !ok { + return false, nil + } + + msgType := proto.MessageType(fqn) + if msgType == nil { + // wtf? + panic(fmt.Sprintf("could not find registered message type for %q", fqn)) + } + + // extract json value from r + var js json.RawMessage + if err := json.NewDecoder(r.unread()).Decode(&js); err != nil { + return true, err + } + if err := r.skip(); err != nil { + return true, err + } + + // unmarshal into well-known type and then convert to dynamic message + msg := reflect.New(msgType.Elem()).Interface().(proto.Message) + if err := opts.Unmarshal(bytes.NewReader(js), msg); err != nil { + return true, err + } + return true, m.MergeFrom(msg) +} + +func (m *Message) unmarshalJson(r *jsReader, opts *jsonpb.Unmarshaler) error { + if r, changed := wrapResolver(opts.AnyResolver, m.mf, m.md.GetFile()); changed { + newOpts := *opts + newOpts.AnyResolver = r + opts = &newOpts + } + + if ok, err := unmarshalWellKnownType(m, r, opts); ok { + return err + } + + t, err := r.peek() + if err != nil { + return err + } + if t == nil { + // if json is simply "null" we do nothing + r.poll() + return nil + } + + if err := r.beginObject(); err != nil { + return err + } + + for r.hasNext() { + f, err := r.nextObjectKey() + if err != nil { + return err + } + fd := m.FindFieldDescriptorByJSONName(f) + if fd == nil { + if opts.AllowUnknownFields { + r.skip() + continue + } + return fmt.Errorf("message type %s has no known field named %s", m.md.GetFullyQualifiedName(), f) + } + v, err := unmarshalJsField(fd, r, m.mf, opts) + if err != nil { + return err + } + if v != nil { + if err := mergeField(m, fd, v); err != nil { + return err + } + } else if fd.GetOneOf() != nil { + // preserve explicit null for oneof fields (this is a little odd but + // mimics the behavior of jsonpb with oneofs in generated message types) + if fd.GetMessageType() != nil { + typ := m.mf.GetKnownTypeRegistry().GetKnownType(fd.GetMessageType().GetFullyQualifiedName()) + if typ != nil { + // typed nil + if typ.Kind() != reflect.Ptr { + typ = reflect.PtrTo(typ) + } + v = reflect.Zero(typ).Interface() + } else { + // can't use nil dynamic message, so we just use empty one instead + v = m.mf.NewDynamicMessage(fd.GetMessageType()) + } + if err := m.setField(fd, v); err != nil { + return err + } + } else { + // not a message... explicit null makes no sense + return fmt.Errorf("message type %s cannot set field %s to null: it is not a message type", m.md.GetFullyQualifiedName(), f) + } + } else { + m.clearField(fd) + } + } + + if err := r.endObject(); err != nil { + return err + } + + return nil +} + +func isWellKnownValue(fd *desc.FieldDescriptor) bool { + return !fd.IsRepeated() && fd.GetType() == descriptor.FieldDescriptorProto_TYPE_MESSAGE && + fd.GetMessageType().GetFullyQualifiedName() == "google.protobuf.Value" +} + +func isWellKnownListValue(fd *desc.FieldDescriptor) bool { + return !fd.IsRepeated() && fd.GetType() == descriptor.FieldDescriptorProto_TYPE_MESSAGE && + fd.GetMessageType().GetFullyQualifiedName() == "google.protobuf.ListValue" +} + +func unmarshalJsField(fd *desc.FieldDescriptor, r *jsReader, mf *MessageFactory, opts *jsonpb.Unmarshaler) (interface{}, error) { + t, err := r.peek() + if err != nil { + return nil, err + } + if t == nil && !isWellKnownValue(fd) { + // if value is null, just return nil + // (unless field is google.protobuf.Value, in which case + // we fall through to parse it as an instance where its + // underlying value is set to a NullValue) + r.poll() + return nil, nil + } + + if t == json.Delim('{') && fd.IsMap() { + entryType := fd.GetMessageType() + keyType := entryType.FindFieldByNumber(1) + valueType := entryType.FindFieldByNumber(2) + mp := map[interface{}]interface{}{} + + // TODO: if there are just two map keys "key" and "value" and they have the right type of values, + // treat this JSON object as a single map entry message. (In keeping with support of map fields as + // if they were normal repeated field of entry messages as well as supporting a transition from + // optional to repeated...) + + if err := r.beginObject(); err != nil { + return nil, err + } + for r.hasNext() { + kk, err := unmarshalJsFieldElement(keyType, r, mf, opts, false) + if err != nil { + return nil, err + } + vv, err := unmarshalJsFieldElement(valueType, r, mf, opts, true) + if err != nil { + return nil, err + } + mp[kk] = vv + } + if err := r.endObject(); err != nil { + return nil, err + } + + return mp, nil + } else if t == json.Delim('[') && !isWellKnownListValue(fd) { + // We support parsing an array, even if field is not repeated, to mimic support in proto + // binary wire format that supports changing an optional field to repeated and vice versa. + // If the field is not repeated, we only keep the last value in the array. + + if err := r.beginArray(); err != nil { + return nil, err + } + var sl []interface{} + var v interface{} + for r.hasNext() { + var err error + v, err = unmarshalJsFieldElement(fd, r, mf, opts, false) + if err != nil { + return nil, err + } + if fd.IsRepeated() && v != nil { + sl = append(sl, v) + } + } + if err := r.endArray(); err != nil { + return nil, err + } + if fd.IsMap() { + mp := map[interface{}]interface{}{} + for _, m := range sl { + msg := m.(*Message) + kk, err := msg.TryGetFieldByNumber(1) + if err != nil { + return nil, err + } + vv, err := msg.TryGetFieldByNumber(2) + if err != nil { + return nil, err + } + mp[kk] = vv + } + return mp, nil + } else if fd.IsRepeated() { + return sl, nil + } else { + return v, nil + } + } else { + // We support parsing a singular value, even if field is repeated, to mimic support in proto + // binary wire format that supports changing an optional field to repeated and vice versa. + // If the field is repeated, we store value as singleton slice of that one value. + + v, err := unmarshalJsFieldElement(fd, r, mf, opts, false) + if err != nil { + return nil, err + } + if v == nil { + return nil, nil + } + if fd.IsRepeated() { + return []interface{}{v}, nil + } else { + return v, nil + } + } +} + +func unmarshalJsFieldElement(fd *desc.FieldDescriptor, r *jsReader, mf *MessageFactory, opts *jsonpb.Unmarshaler, allowNilMessage bool) (interface{}, error) { + t, err := r.peek() + if err != nil { + return nil, err + } + + switch fd.GetType() { + case descriptor.FieldDescriptorProto_TYPE_MESSAGE, + descriptor.FieldDescriptorProto_TYPE_GROUP: + + if t == nil && allowNilMessage { + // if json is simply "null" return a nil pointer + r.poll() + return nilMessage(fd.GetMessageType()), nil + } + + m := mf.NewMessage(fd.GetMessageType()) + if dm, ok := m.(*Message); ok { + if err := dm.unmarshalJson(r, opts); err != nil { + return nil, err + } + } else { + var msg json.RawMessage + if err := json.NewDecoder(r.unread()).Decode(&msg); err != nil { + return nil, err + } + if err := r.skip(); err != nil { + return nil, err + } + if err := opts.Unmarshal(bytes.NewReader([]byte(msg)), m); err != nil { + return nil, err + } + } + return m, nil + + case descriptor.FieldDescriptorProto_TYPE_ENUM: + if e, err := r.nextNumber(); err != nil { + return nil, err + } else { + // value could be string or number + if i, err := e.Int64(); err != nil { + // number cannot be parsed, so see if it's an enum value name + vd := fd.GetEnumType().FindValueByName(string(e)) + if vd != nil { + return vd.GetNumber(), nil + } else { + return nil, fmt.Errorf("enum %q does not have value named %q", fd.GetEnumType().GetFullyQualifiedName(), e) + } + } else if i > math.MaxInt32 || i < math.MinInt32 { + return nil, NumericOverflowError + } else { + return int32(i), err + } + } + + case descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_SINT32, + descriptor.FieldDescriptorProto_TYPE_SFIXED32: + if i, err := r.nextInt(); err != nil { + return nil, err + } else if i > math.MaxInt32 || i < math.MinInt32 { + return nil, NumericOverflowError + } else { + return int32(i), err + } + + case descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_SINT64, + descriptor.FieldDescriptorProto_TYPE_SFIXED64: + return r.nextInt() + + case descriptor.FieldDescriptorProto_TYPE_UINT32, + descriptor.FieldDescriptorProto_TYPE_FIXED32: + if i, err := r.nextUint(); err != nil { + return nil, err + } else if i > math.MaxUint32 { + return nil, NumericOverflowError + } else { + return uint32(i), err + } + + case descriptor.FieldDescriptorProto_TYPE_UINT64, + descriptor.FieldDescriptorProto_TYPE_FIXED64: + return r.nextUint() + + case descriptor.FieldDescriptorProto_TYPE_BOOL: + if str, ok := t.(string); ok { + if str == "true" { + r.poll() // consume token + return true, err + } else if str == "false" { + r.poll() // consume token + return false, err + } + } + return r.nextBool() + + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + if f, err := r.nextFloat(); err != nil { + return nil, err + } else { + return float32(f), nil + } + + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + return r.nextFloat() + + case descriptor.FieldDescriptorProto_TYPE_BYTES: + return r.nextBytes() + + case descriptor.FieldDescriptorProto_TYPE_STRING: + return r.nextString() + + default: + return nil, fmt.Errorf("unknown field type: %v", fd.GetType()) + } +} + +type jsReader struct { + reader *bytes.Reader + dec *json.Decoder + current json.Token + peeked bool +} + +func newJsReader(b []byte) *jsReader { + reader := bytes.NewReader(b) + dec := json.NewDecoder(reader) + dec.UseNumber() + return &jsReader{reader: reader, dec: dec} +} + +func (r *jsReader) unread() io.Reader { + bufs := make([]io.Reader, 3) + var peeked []byte + if r.peeked { + if _, ok := r.current.(json.Delim); ok { + peeked = []byte(fmt.Sprintf("%v", r.current)) + } else { + peeked, _ = json.Marshal(r.current) + } + } + readerCopy := *r.reader + decCopy := *r.dec + + bufs[0] = bytes.NewReader(peeked) + bufs[1] = decCopy.Buffered() + bufs[2] = &readerCopy + return &concatReader{bufs: bufs} +} + +func (r *jsReader) hasNext() bool { + return r.dec.More() +} + +func (r *jsReader) peek() (json.Token, error) { + if r.peeked { + return r.current, nil + } + t, err := r.dec.Token() + if err != nil { + return nil, err + } + r.peeked = true + r.current = t + return t, nil +} + +func (r *jsReader) poll() (json.Token, error) { + if r.peeked { + ret := r.current + r.current = nil + r.peeked = false + return ret, nil + } + return r.dec.Token() +} + +func (r *jsReader) beginObject() error { + _, err := r.expect(func(t json.Token) bool { return t == json.Delim('{') }, nil, "start of JSON object: '{'") + return err +} + +func (r *jsReader) endObject() error { + _, err := r.expect(func(t json.Token) bool { return t == json.Delim('}') }, nil, "end of JSON object: '}'") + return err +} + +func (r *jsReader) beginArray() error { + _, err := r.expect(func(t json.Token) bool { return t == json.Delim('[') }, nil, "start of array: '['") + return err +} + +func (r *jsReader) endArray() error { + _, err := r.expect(func(t json.Token) bool { return t == json.Delim(']') }, nil, "end of array: ']'") + return err +} + +func (r *jsReader) nextObjectKey() (string, error) { + return r.nextString() +} + +func (r *jsReader) nextString() (string, error) { + t, err := r.expect(func(t json.Token) bool { _, ok := t.(string); return ok }, "", "string") + if err != nil { + return "", err + } + return t.(string), nil +} + +func (r *jsReader) nextBytes() ([]byte, error) { + str, err := r.nextString() + if err != nil { + return nil, err + } + return base64.StdEncoding.DecodeString(str) +} + +func (r *jsReader) nextBool() (bool, error) { + t, err := r.expect(func(t json.Token) bool { _, ok := t.(bool); return ok }, false, "boolean") + if err != nil { + return false, err + } + return t.(bool), nil +} + +func (r *jsReader) nextInt() (int64, error) { + n, err := r.nextNumber() + if err != nil { + return 0, err + } + return n.Int64() +} + +func (r *jsReader) nextUint() (uint64, error) { + n, err := r.nextNumber() + if err != nil { + return 0, err + } + return strconv.ParseUint(string(n), 10, 64) +} + +func (r *jsReader) nextFloat() (float64, error) { + n, err := r.nextNumber() + if err != nil { + return 0, err + } + return n.Float64() +} + +func (r *jsReader) nextNumber() (json.Number, error) { + t, err := r.expect(func(t json.Token) bool { return reflect.TypeOf(t).Kind() == reflect.String }, "0", "number") + if err != nil { + return "", err + } + switch t := t.(type) { + case json.Number: + return t, nil + case string: + return json.Number(t), nil + } + return "", fmt.Errorf("expecting a number but got %v", t) +} + +func (r *jsReader) skip() error { + t, err := r.poll() + if err != nil { + return err + } + if t == json.Delim('[') { + if err := r.skipArray(); err != nil { + return err + } + } else if t == json.Delim('{') { + if err := r.skipObject(); err != nil { + return err + } + } + return nil +} + +func (r *jsReader) skipArray() error { + for r.hasNext() { + if err := r.skip(); err != nil { + return err + } + } + if err := r.endArray(); err != nil { + return err + } + return nil +} + +func (r *jsReader) skipObject() error { + for r.hasNext() { + // skip object key + if err := r.skip(); err != nil { + return err + } + // and value + if err := r.skip(); err != nil { + return err + } + } + if err := r.endObject(); err != nil { + return err + } + return nil +} + +func (r *jsReader) expect(predicate func(json.Token) bool, ifNil interface{}, expected string) (interface{}, error) { + t, err := r.poll() + if err != nil { + return nil, err + } + if t == nil && ifNil != nil { + return ifNil, nil + } + if !predicate(t) { + return t, fmt.Errorf("bad input: expecting %s ; instead got %v", expected, t) + } + return t, nil +} + +type concatReader struct { + bufs []io.Reader + curr int +} + +func (r *concatReader) Read(p []byte) (n int, err error) { + for { + if r.curr >= len(r.bufs) { + err = io.EOF + return + } + var c int + c, err = r.bufs[r.curr].Read(p) + n += c + if err != io.EOF { + return + } + r.curr++ + p = p[c:] + } +} + +// AnyResolver returns a jsonpb.AnyResolver that uses the given file descriptors +// to resolve message names. It uses the given factory, which may be nil, to +// instantiate messages. The messages that it returns when resolving a type name +// may often be dynamic messages. +func AnyResolver(mf *MessageFactory, files ...*desc.FileDescriptor) jsonpb.AnyResolver { + return &anyResolver{mf: mf, files: files} +} + +type anyResolver struct { + mf *MessageFactory + files []*desc.FileDescriptor + ignored map[*desc.FileDescriptor]struct{} + other jsonpb.AnyResolver +} + +func wrapResolver(r jsonpb.AnyResolver, mf *MessageFactory, f *desc.FileDescriptor) (jsonpb.AnyResolver, bool) { + if r, ok := r.(*anyResolver); ok { + if _, ok := r.ignored[f]; ok { + // if the current resolver is ignoring this file, it's because another + // (upstream) resolver is already handling it, so nothing to do + return r, false + } + for _, file := range r.files { + if file == f { + // no need to wrap! + return r, false + } + } + // ignore files that will be checked by the resolver we're wrapping + // (we'll just delegate and let it search those files) + ignored := map[*desc.FileDescriptor]struct{}{} + for i := range r.ignored { + ignored[i] = struct{}{} + } + ignore(r.files, ignored) + return &anyResolver{mf: mf, files: []*desc.FileDescriptor{f}, ignored: ignored, other: r}, true + } + return &anyResolver{mf: mf, files: []*desc.FileDescriptor{f}, other: r}, true +} + +func ignore(files []*desc.FileDescriptor, ignored map[*desc.FileDescriptor]struct{}) { + for _, f := range files { + if _, ok := ignored[f]; ok { + continue + } + ignored[f] = struct{}{} + ignore(f.GetDependencies(), ignored) + } +} + +func (r *anyResolver) Resolve(typeUrl string) (proto.Message, error) { + mname := typeUrl + if slash := strings.LastIndex(mname, "/"); slash >= 0 { + mname = mname[slash+1:] + } + + // see if the user-specified resolver is able to do the job + if r.other != nil { + msg, err := r.other.Resolve(typeUrl) + if err == nil { + return msg, nil + } + } + + // try to find the message in our known set of files + checked := map[*desc.FileDescriptor]struct{}{} + for _, f := range r.files { + md := r.findMessage(f, mname, checked) + if md != nil { + return r.mf.NewMessage(md), nil + } + } + // failing that, see if the message factory knows about this type + var ktr *KnownTypeRegistry + if r.mf != nil { + ktr = r.mf.ktr + } else { + ktr = (*KnownTypeRegistry)(nil) + } + m := ktr.CreateIfKnown(mname) + if m != nil { + return m, nil + } + + // no other resolver to fallback to? mimic default behavior + mt := proto.MessageType(mname) + if mt == nil { + return nil, fmt.Errorf("unknown message type %q", mname) + } + return reflect.New(mt.Elem()).Interface().(proto.Message), nil +} + +func (r *anyResolver) findMessage(fd *desc.FileDescriptor, msgName string, checked map[*desc.FileDescriptor]struct{}) *desc.MessageDescriptor { + // if this is an ignored descriptor, skip + if _, ok := r.ignored[fd]; ok { + return nil + } + + // bail if we've already checked this file + if _, ok := checked[fd]; ok { + return nil + } + checked[fd] = struct{}{} + + // see if this file has the message + md := fd.FindMessage(msgName) + if md != nil { + return md + } + + // if not, recursively search the file's imports + for _, dep := range fd.GetDependencies() { + md = r.findMessage(dep, msgName, checked) + if md != nil { + return md + } + } + return nil +} + +var _ jsonpb.AnyResolver = (*anyResolver)(nil) diff --git a/vendor/github.com/jhump/protoreflect/dynamic/maps_1.11.go b/vendor/github.com/jhump/protoreflect/dynamic/maps_1.11.go new file mode 100644 index 00000000..43dce67e --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/maps_1.11.go @@ -0,0 +1,129 @@ +//+build !go1.12 + +package dynamic + +import ( + "github.com/jhump/protoreflect/desc" + "reflect" +) + +// Pre-Go-1.12, we must use reflect.Value.MapKeys to reflectively +// iterate a map. (We can be more efficient in Go 1.12 and up...) + +func mapsEqual(a, b reflect.Value) bool { + if a.Len() != b.Len() { + return false + } + if a.Len() == 0 && b.Len() == 0 { + // Optimize the case where maps are frequently empty because MapKeys() + // function allocates heavily. + return true + } + + for _, k := range a.MapKeys() { + av := a.MapIndex(k) + bv := b.MapIndex(k) + if !bv.IsValid() { + return false + } + if !fieldsEqual(av.Interface(), bv.Interface()) { + return false + } + } + return true +} + +func validFieldValueForMapField(fd *desc.FieldDescriptor, val reflect.Value) (interface{}, error) { + // make a defensive copy while we check the contents + // (also converts to map[interface{}]interface{} if it's some other type) + keyField := fd.GetMessageType().GetFields()[0] + valField := fd.GetMessageType().GetFields()[1] + m := map[interface{}]interface{}{} + for _, k := range val.MapKeys() { + if k.Kind() == reflect.Interface { + // unwrap it + k = reflect.ValueOf(k.Interface()) + } + kk, err := validElementFieldValueForRv(keyField, k, false) + if err != nil { + return nil, err + } + v := val.MapIndex(k) + if v.Kind() == reflect.Interface { + // unwrap it + v = reflect.ValueOf(v.Interface()) + } + vv, err := validElementFieldValueForRv(valField, v, true) + if err != nil { + return nil, err + } + m[kk] = vv + } + return m, nil +} + +func canConvertMap(src reflect.Value, target reflect.Type) bool { + kt := target.Key() + vt := target.Elem() + for _, k := range src.MapKeys() { + if !canConvert(k, kt) { + return false + } + if !canConvert(src.MapIndex(k), vt) { + return false + } + } + return true +} + +func mergeMapVal(src, target reflect.Value, targetType reflect.Type, deterministic bool) error { + tkt := targetType.Key() + tvt := targetType.Elem() + for _, k := range src.MapKeys() { + v := src.MapIndex(k) + skt := k.Type() + svt := v.Type() + var nk, nv reflect.Value + if tkt == skt { + nk = k + } else if tkt.Kind() == reflect.Ptr && tkt.Elem() == skt { + nk = k.Addr() + } else { + nk = reflect.New(tkt).Elem() + if err := mergeVal(k, nk, deterministic); err != nil { + return err + } + } + if tvt == svt { + nv = v + } else if tvt.Kind() == reflect.Ptr && tvt.Elem() == svt { + nv = v.Addr() + } else { + nv = reflect.New(tvt).Elem() + if err := mergeVal(v, nv, deterministic); err != nil { + return err + } + } + if target.IsNil() { + target.Set(reflect.MakeMap(targetType)) + } + target.SetMapIndex(nk, nv) + } + return nil +} + +func mergeMapField(m *Message, fd *desc.FieldDescriptor, rv reflect.Value) error { + for _, k := range rv.MapKeys() { + if k.Kind() == reflect.Interface && !k.IsNil() { + k = k.Elem() + } + v := rv.MapIndex(k) + if v.Kind() == reflect.Interface && !v.IsNil() { + v = v.Elem() + } + if err := m.putMapField(fd, k.Interface(), v.Interface()); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/maps_1.12.go b/vendor/github.com/jhump/protoreflect/dynamic/maps_1.12.go new file mode 100644 index 00000000..52eaa82e --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/maps_1.12.go @@ -0,0 +1,137 @@ +//+build go1.12 + +package dynamic + +import ( + "github.com/jhump/protoreflect/desc" + "reflect" +) + +// With Go 1.12 and above, we can use reflect.Value.MapRange to iterate +// over maps more efficiently than using reflect.Value.MapKeys. + +func mapsEqual(a, b reflect.Value) bool { + if a.Len() != b.Len() { + return false + } + if a.Len() == 0 && b.Len() == 0 { + // Optimize the case where maps are frequently empty + return true + } + + iter := a.MapRange() + for iter.Next() { + k := iter.Key() + av := iter.Value() + bv := b.MapIndex(k) + if !bv.IsValid() { + return false + } + if !fieldsEqual(av.Interface(), bv.Interface()) { + return false + } + } + return true +} + +func validFieldValueForMapField(fd *desc.FieldDescriptor, val reflect.Value) (interface{}, error) { + // make a defensive copy while we check the contents + // (also converts to map[interface{}]interface{} if it's some other type) + keyField := fd.GetMessageType().GetFields()[0] + valField := fd.GetMessageType().GetFields()[1] + m := map[interface{}]interface{}{} + iter := val.MapRange() + for iter.Next() { + k := iter.Key() + if k.Kind() == reflect.Interface { + // unwrap it + k = reflect.ValueOf(k.Interface()) + } + kk, err := validElementFieldValueForRv(keyField, k, false) + if err != nil { + return nil, err + } + v := iter.Value() + if v.Kind() == reflect.Interface { + // unwrap it + v = reflect.ValueOf(v.Interface()) + } + vv, err := validElementFieldValueForRv(valField, v, true) + if err != nil { + return nil, err + } + m[kk] = vv + } + return m, nil +} + +func canConvertMap(src reflect.Value, target reflect.Type) bool { + kt := target.Key() + vt := target.Elem() + iter := src.MapRange() + for iter.Next() { + if !canConvert(iter.Key(), kt) { + return false + } + if !canConvert(iter.Value(), vt) { + return false + } + } + return true +} + +func mergeMapVal(src, target reflect.Value, targetType reflect.Type, deterministic bool) error { + tkt := targetType.Key() + tvt := targetType.Elem() + iter := src.MapRange() + for iter.Next() { + k := iter.Key() + v := iter.Value() + skt := k.Type() + svt := v.Type() + var nk, nv reflect.Value + if tkt == skt { + nk = k + } else if tkt.Kind() == reflect.Ptr && tkt.Elem() == skt { + nk = k.Addr() + } else { + nk = reflect.New(tkt).Elem() + if err := mergeVal(k, nk, deterministic); err != nil { + return err + } + } + if tvt == svt { + nv = v + } else if tvt.Kind() == reflect.Ptr && tvt.Elem() == svt { + nv = v.Addr() + } else { + nv = reflect.New(tvt).Elem() + if err := mergeVal(v, nv, deterministic); err != nil { + return err + } + } + if target.IsNil() { + target.Set(reflect.MakeMap(targetType)) + } + target.SetMapIndex(nk, nv) + } + return nil +} + +func mergeMapField(m *Message, fd *desc.FieldDescriptor, rv reflect.Value) error { + iter := rv.MapRange() + for iter.Next() { + k := iter.Key() + v := iter.Value() + if k.Kind() == reflect.Interface && !k.IsNil() { + k = k.Elem() + } + if v.Kind() == reflect.Interface && !v.IsNil() { + v = v.Elem() + } + if err := m.putMapField(fd, k.Interface(), v.Interface()); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/merge.go b/vendor/github.com/jhump/protoreflect/dynamic/merge.go new file mode 100644 index 00000000..ce727fd5 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/merge.go @@ -0,0 +1,100 @@ +package dynamic + +import ( + "errors" + "reflect" + + "github.com/golang/protobuf/proto" + + "github.com/jhump/protoreflect/desc" +) + +// Merge merges the given source message into the given destination message. Use +// use this instead of proto.Merge when one or both of the messages might be a +// a dynamic message. If there is a problem merging the messages, such as the +// two messages having different types, then this method will panic (just as +// proto.Merges does). +func Merge(dst, src proto.Message) { + if dm, ok := dst.(*Message); ok { + if err := dm.MergeFrom(src); err != nil { + panic(err.Error()) + } + } else if dm, ok := src.(*Message); ok { + if err := dm.MergeInto(dst); err != nil { + panic(err.Error()) + } + } else { + proto.Merge(dst, src) + } +} + +// TryMerge merges the given source message into the given destination message. +// You can use this instead of proto.Merge when one or both of the messages +// might be a dynamic message. Unlike proto.Merge, this method will return an +// error on failure instead of panic'ing. +func TryMerge(dst, src proto.Message) error { + if dm, ok := dst.(*Message); ok { + if err := dm.MergeFrom(src); err != nil { + return err + } + } else if dm, ok := src.(*Message); ok { + if err := dm.MergeInto(dst); err != nil { + return err + } + } else { + // proto.Merge panics on bad input, so we first verify + // inputs and return error instead of panic + out := reflect.ValueOf(dst) + if out.IsNil() { + return errors.New("proto: nil destination") + } + in := reflect.ValueOf(src) + if in.Type() != out.Type() { + return errors.New("proto: type mismatch") + } + proto.Merge(dst, src) + } + return nil +} + +func mergeField(m *Message, fd *desc.FieldDescriptor, val interface{}) error { + rv := reflect.ValueOf(val) + + if fd.IsMap() && rv.Kind() == reflect.Map { + return mergeMapField(m, fd, rv) + } + + if fd.IsRepeated() && rv.Kind() == reflect.Slice && rv.Type() != typeOfBytes { + for i := 0; i < rv.Len(); i++ { + e := rv.Index(i) + if e.Kind() == reflect.Interface && !e.IsNil() { + e = e.Elem() + } + if err := m.addRepeatedField(fd, e.Interface()); err != nil { + return err + } + } + return nil + } + + if fd.IsRepeated() { + return m.addRepeatedField(fd, val) + } else if fd.GetMessageType() == nil { + return m.setField(fd, val) + } + + // it's a message type, so we want to merge contents + var err error + if val, err = validFieldValue(fd, val); err != nil { + return err + } + + existing, _ := m.doGetField(fd, true) + if existing != nil && !reflect.ValueOf(existing).IsNil() { + return TryMerge(existing.(proto.Message), val.(proto.Message)) + } + + // no existing message, so just set field + m.internalSetField(fd, val) + return nil +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/message_factory.go b/vendor/github.com/jhump/protoreflect/dynamic/message_factory.go new file mode 100644 index 00000000..9ab8e61b --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/message_factory.go @@ -0,0 +1,201 @@ +package dynamic + +import ( + "reflect" + "sync" + + "github.com/golang/protobuf/proto" + + "github.com/jhump/protoreflect/desc" +) + +// MessageFactory can be used to create new empty message objects. A default instance +// (without extension registry or known-type registry specified) will always return +// dynamic messages (e.g. type will be *dynamic.Message) except for "well-known" types. +// The well-known types include primitive wrapper types and a handful of other special +// types defined in standard protobuf definitions, like Any, Duration, and Timestamp. +type MessageFactory struct { + er *ExtensionRegistry + ktr *KnownTypeRegistry +} + +// NewMessageFactoryWithExtensionRegistry creates a new message factory where any +// dynamic messages produced will use the given extension registry to recognize and +// parse extension fields. +func NewMessageFactoryWithExtensionRegistry(er *ExtensionRegistry) *MessageFactory { + return NewMessageFactoryWithRegistries(er, nil) +} + +// NewMessageFactoryWithKnownTypeRegistry creates a new message factory where the +// known types, per the given registry, will be returned as normal protobuf messages +// (e.g. generated structs, instead of dynamic messages). +func NewMessageFactoryWithKnownTypeRegistry(ktr *KnownTypeRegistry) *MessageFactory { + return NewMessageFactoryWithRegistries(nil, ktr) +} + +// NewMessageFactoryWithDefaults creates a new message factory where all "default" types +// (those for which protoc-generated code is statically linked into the Go program) are +// known types. If any dynamic messages are produced, they will recognize and parse all +// "default" extension fields. This is the equivalent of: +// NewMessageFactoryWithRegistries( +// NewExtensionRegistryWithDefaults(), +// NewKnownTypeRegistryWithDefaults()) +func NewMessageFactoryWithDefaults() *MessageFactory { + return NewMessageFactoryWithRegistries(NewExtensionRegistryWithDefaults(), NewKnownTypeRegistryWithDefaults()) +} + +// NewMessageFactoryWithRegistries creates a new message factory with the given extension +// and known type registries. +func NewMessageFactoryWithRegistries(er *ExtensionRegistry, ktr *KnownTypeRegistry) *MessageFactory { + return &MessageFactory{ + er: er, + ktr: ktr, + } +} + +// NewMessage creates a new empty message that corresponds to the given descriptor. +// If the given descriptor describes a "known type" then that type is instantiated. +// Otherwise, an empty dynamic message is returned. +func (f *MessageFactory) NewMessage(md *desc.MessageDescriptor) proto.Message { + var ktr *KnownTypeRegistry + if f != nil { + ktr = f.ktr + } + if m := ktr.CreateIfKnown(md.GetFullyQualifiedName()); m != nil { + return m + } + return NewMessageWithMessageFactory(md, f) +} + +// NewDynamicMessage creates a new empty dynamic message that corresponds to the given +// descriptor. This is like f.NewMessage(md) except the known type registry is not +// consulted so the return value is always a dynamic message. +// +// This is also like dynamic.NewMessage(md) except that the returned message will use +// this factory when creating other messages, like during de-serialization of fields +// that are themselves message types. +func (f *MessageFactory) NewDynamicMessage(md *desc.MessageDescriptor) *Message { + return NewMessageWithMessageFactory(md, f) +} + +// GetKnownTypeRegistry returns the known type registry that this factory uses to +// instantiate known (e.g. generated) message types. +func (f *MessageFactory) GetKnownTypeRegistry() *KnownTypeRegistry { + if f == nil { + return nil + } + return f.ktr +} + +// GetExtensionRegistry returns the extension registry that this factory uses to +// create dynamic messages. The registry is used by dynamic messages to recognize +// and parse extension fields during de-serialization. +func (f *MessageFactory) GetExtensionRegistry() *ExtensionRegistry { + if f == nil { + return nil + } + return f.er +} + +type wkt interface { + XXX_WellKnownType() string +} + +var typeOfWkt = reflect.TypeOf((*wkt)(nil)).Elem() + +// KnownTypeRegistry is a registry of known message types, as identified by their +// fully-qualified name. A known message type is one for which a protoc-generated +// struct exists, so a dynamic message is not necessary to represent it. A +// MessageFactory uses a KnownTypeRegistry to decide whether to create a generated +// struct or a dynamic message. The zero-value registry (including the behavior of +// a nil pointer) only knows about the "well-known types" in protobuf. These +// include only the wrapper types and a handful of other special types like Any, +// Duration, and Timestamp. +type KnownTypeRegistry struct { + excludeWkt bool + includeDefault bool + mu sync.RWMutex + types map[string]reflect.Type +} + +// NewKnownTypeRegistryWithDefaults creates a new registry that knows about all +// "default" types (those for which protoc-generated code is statically linked +// into the Go program). +func NewKnownTypeRegistryWithDefaults() *KnownTypeRegistry { + return &KnownTypeRegistry{includeDefault: true} +} + +// NewKnownTypeRegistryWithoutWellKnownTypes creates a new registry that does *not* +// include the "well-known types" in protobuf. So even well-known types would be +// represented by a dynamic message. +func NewKnownTypeRegistryWithoutWellKnownTypes() *KnownTypeRegistry { + return &KnownTypeRegistry{excludeWkt: true} +} + +// AddKnownType adds the types of the given messages as known types. +func (r *KnownTypeRegistry) AddKnownType(kts ...proto.Message) { + r.mu.Lock() + defer r.mu.Unlock() + if r.types == nil { + r.types = map[string]reflect.Type{} + } + for _, kt := range kts { + r.types[proto.MessageName(kt)] = reflect.TypeOf(kt) + } +} + +// CreateIfKnown will construct an instance of the given message if it is a known type. +// If the given name is unknown, nil is returned. +func (r *KnownTypeRegistry) CreateIfKnown(messageName string) proto.Message { + msgType := r.GetKnownType(messageName) + if msgType == nil { + return nil + } + + if msgType.Kind() == reflect.Ptr { + return reflect.New(msgType.Elem()).Interface().(proto.Message) + } else { + return reflect.New(msgType).Elem().Interface().(proto.Message) + } +} + +func isWellKnownType(t reflect.Type) bool { + if t.Implements(typeOfWkt) { + return true + } + if msg, ok := reflect.Zero(t).Interface().(proto.Message); ok { + name := proto.MessageName(msg) + _, ok := wellKnownTypeNames[name] + return ok + } + return false +} + +// GetKnownType will return the reflect.Type for the given message name if it is +// known. If it is not known, nil is returned. +func (r *KnownTypeRegistry) GetKnownType(messageName string) reflect.Type { + var msgType reflect.Type + if r == nil { + // a nil registry behaves the same as zero value instance: only know of well-known types + t := proto.MessageType(messageName) + if t != nil && isWellKnownType(t) { + msgType = t + } + } else { + if r.includeDefault { + msgType = proto.MessageType(messageName) + } else if !r.excludeWkt { + t := proto.MessageType(messageName) + if t != nil && isWellKnownType(t) { + msgType = t + } + } + if msgType == nil { + r.mu.RLock() + msgType = r.types[messageName] + r.mu.RUnlock() + } + } + + return msgType +} diff --git a/vendor/github.com/jhump/protoreflect/dynamic/text.go b/vendor/github.com/jhump/protoreflect/dynamic/text.go new file mode 100644 index 00000000..5784d3ef --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/dynamic/text.go @@ -0,0 +1,1177 @@ +package dynamic + +// Marshalling and unmarshalling of dynamic messages to/from proto's standard text format + +import ( + "bytes" + "fmt" + "io" + "math" + "reflect" + "sort" + "strconv" + "strings" + "text/scanner" + "unicode" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/protoc-gen-go/descriptor" + + "github.com/jhump/protoreflect/codec" + "github.com/jhump/protoreflect/desc" +) + +// MarshalText serializes this message to bytes in the standard text format, +// returning an error if the operation fails. The resulting bytes will be a +// valid UTF8 string. +// +// This method uses a compact form: no newlines, and spaces between field +// identifiers and values are elided. +func (m *Message) MarshalText() ([]byte, error) { + var b indentBuffer + b.indentCount = -1 // no indentation + if err := m.marshalText(&b); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// MarshalTextIndent serializes this message to bytes in the standard text +// format, returning an error if the operation fails. The resulting bytes will +// be a valid UTF8 string. +// +// This method uses a "pretty-printed" form, with each field on its own line and +// spaces between field identifiers and values. +func (m *Message) MarshalTextIndent() ([]byte, error) { + var b indentBuffer + b.indent = " " // TODO: option for indent? + if err := m.marshalText(&b); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +func (m *Message) marshalText(b *indentBuffer) error { + // TODO: option for emitting extended Any format? + first := true + // first the known fields + for _, tag := range m.knownFieldTags() { + itag := int32(tag) + v := m.values[itag] + fd := m.FindFieldDescriptor(itag) + if fd.IsMap() { + md := fd.GetMessageType() + kfd := md.FindFieldByNumber(1) + vfd := md.FindFieldByNumber(2) + mp := v.(map[interface{}]interface{}) + keys := make([]interface{}, 0, len(mp)) + for k := range mp { + keys = append(keys, k) + } + sort.Sort(sortable(keys)) + for _, mk := range keys { + mv := mp[mk] + err := b.maybeNext(&first) + if err != nil { + return err + } + err = marshalKnownFieldMapEntryText(b, fd, kfd, mk, vfd, mv) + if err != nil { + return err + } + } + } else if fd.IsRepeated() { + sl := v.([]interface{}) + for _, slv := range sl { + err := b.maybeNext(&first) + if err != nil { + return err + } + err = marshalKnownFieldText(b, fd, slv) + if err != nil { + return err + } + } + } else { + err := b.maybeNext(&first) + if err != nil { + return err + } + err = marshalKnownFieldText(b, fd, v) + if err != nil { + return err + } + } + } + // then the unknown fields + for _, tag := range m.unknownFieldTags() { + itag := int32(tag) + ufs := m.unknownFields[itag] + for _, uf := range ufs { + err := b.maybeNext(&first) + if err != nil { + return err + } + _, err = fmt.Fprintf(b, "%d", tag) + if err != nil { + return err + } + if uf.Encoding == proto.WireStartGroup { + err = b.WriteByte('{') + if err != nil { + return err + } + err = b.start() + if err != nil { + return err + } + in := codec.NewBuffer(uf.Contents) + err = marshalUnknownGroupText(b, in, true) + if err != nil { + return err + } + err = b.end() + if err != nil { + return err + } + err = b.WriteByte('}') + if err != nil { + return err + } + } else { + err = b.sep() + if err != nil { + return err + } + if uf.Encoding == proto.WireBytes { + err = writeString(b, string(uf.Contents)) + if err != nil { + return err + } + } else { + _, err = b.WriteString(strconv.FormatUint(uf.Value, 10)) + if err != nil { + return err + } + } + } + } + } + return nil +} + +func marshalKnownFieldMapEntryText(b *indentBuffer, fd *desc.FieldDescriptor, kfd *desc.FieldDescriptor, mk interface{}, vfd *desc.FieldDescriptor, mv interface{}) error { + var name string + if fd.IsExtension() { + name = fmt.Sprintf("[%s]", fd.GetFullyQualifiedName()) + } else { + name = fd.GetName() + } + _, err := b.WriteString(name) + if err != nil { + return err + } + err = b.sep() + if err != nil { + return err + } + + err = b.WriteByte('<') + if err != nil { + return err + } + err = b.start() + if err != nil { + return err + } + + err = marshalKnownFieldText(b, kfd, mk) + if err != nil { + return err + } + err = b.next() + if err != nil { + return err + } + if !isNil(mv) { + err = marshalKnownFieldText(b, vfd, mv) + if err != nil { + return err + } + } + + err = b.end() + if err != nil { + return err + } + return b.WriteByte('>') +} + +func marshalKnownFieldText(b *indentBuffer, fd *desc.FieldDescriptor, v interface{}) error { + group := fd.GetType() == descriptor.FieldDescriptorProto_TYPE_GROUP + if group { + var name string + if fd.IsExtension() { + name = fmt.Sprintf("[%s]", fd.GetMessageType().GetFullyQualifiedName()) + } else { + name = fd.GetMessageType().GetName() + } + _, err := b.WriteString(name) + if err != nil { + return err + } + } else { + var name string + if fd.IsExtension() { + name = fmt.Sprintf("[%s]", fd.GetFullyQualifiedName()) + } else { + name = fd.GetName() + } + _, err := b.WriteString(name) + if err != nil { + return err + } + err = b.sep() + if err != nil { + return err + } + } + rv := reflect.ValueOf(v) + switch rv.Kind() { + case reflect.Int32, reflect.Int64: + ed := fd.GetEnumType() + if ed != nil { + n := int32(rv.Int()) + vd := ed.FindValueByNumber(n) + if vd == nil { + _, err := b.WriteString(strconv.FormatInt(rv.Int(), 10)) + return err + } else { + _, err := b.WriteString(vd.GetName()) + return err + } + } else { + _, err := b.WriteString(strconv.FormatInt(rv.Int(), 10)) + return err + } + case reflect.Uint32, reflect.Uint64: + _, err := b.WriteString(strconv.FormatUint(rv.Uint(), 10)) + return err + case reflect.Float32, reflect.Float64: + f := rv.Float() + var str string + if math.IsNaN(f) { + str = "nan" + } else if math.IsInf(f, 1) { + str = "inf" + } else if math.IsInf(f, -1) { + str = "-inf" + } else { + var bits int + if rv.Kind() == reflect.Float32 { + bits = 32 + } else { + bits = 64 + } + str = strconv.FormatFloat(rv.Float(), 'g', -1, bits) + } + _, err := b.WriteString(str) + return err + case reflect.Bool: + _, err := b.WriteString(strconv.FormatBool(rv.Bool())) + return err + case reflect.Slice: + return writeString(b, string(rv.Bytes())) + case reflect.String: + return writeString(b, rv.String()) + default: + var err error + if group { + err = b.WriteByte('{') + } else { + err = b.WriteByte('<') + } + if err != nil { + return err + } + err = b.start() + if err != nil { + return err + } + // must be a message + if dm, ok := v.(*Message); ok { + err = dm.marshalText(b) + if err != nil { + return err + } + } else { + err = proto.CompactText(b, v.(proto.Message)) + if err != nil { + return err + } + } + err = b.end() + if err != nil { + return err + } + if group { + return b.WriteByte('}') + } else { + return b.WriteByte('>') + } + } +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(b *indentBuffer, s string) error { + // use WriteByte here to get any needed indent + if err := b.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = b.WriteString("\\n") + case '\r': + _, err = b.WriteString("\\r") + case '\t': + _, err = b.WriteString("\\t") + case '"': + _, err = b.WriteString("\\\"") + case '\\': + _, err = b.WriteString("\\\\") + default: + if c >= 0x20 && c < 0x7f { + err = b.WriteByte(c) + } else { + _, err = fmt.Fprintf(b, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return b.WriteByte('"') +} + +func marshalUnknownGroupText(b *indentBuffer, in *codec.Buffer, topLevel bool) error { + first := true + for { + if in.EOF() { + if topLevel { + return nil + } + // this is a nested message: we are expecting an end-group tag, not EOF! + return io.ErrUnexpectedEOF + } + tag, wireType, err := in.DecodeTagAndWireType() + if err != nil { + return err + } + if wireType == proto.WireEndGroup { + return nil + } + err = b.maybeNext(&first) + if err != nil { + return err + } + _, err = fmt.Fprintf(b, "%d", tag) + if err != nil { + return err + } + if wireType == proto.WireStartGroup { + err = b.WriteByte('{') + if err != nil { + return err + } + err = b.start() + if err != nil { + return err + } + err = marshalUnknownGroupText(b, in, false) + if err != nil { + return err + } + err = b.end() + if err != nil { + return err + } + err = b.WriteByte('}') + if err != nil { + return err + } + continue + } else { + err = b.sep() + if err != nil { + return err + } + if wireType == proto.WireBytes { + contents, err := in.DecodeRawBytes(false) + if err != nil { + return err + } + err = writeString(b, string(contents)) + if err != nil { + return err + } + } else { + var v uint64 + switch wireType { + case proto.WireVarint: + v, err = in.DecodeVarint() + case proto.WireFixed32: + v, err = in.DecodeFixed32() + case proto.WireFixed64: + v, err = in.DecodeFixed64() + default: + return proto.ErrInternalBadWireType + } + if err != nil { + return err + } + _, err = b.WriteString(strconv.FormatUint(v, 10)) + if err != nil { + return err + } + } + } + } +} + +// UnmarshalText de-serializes the message that is present, in text format, in +// the given bytes into this message. It first resets the current message. It +// returns an error if the given bytes do not contain a valid encoding of this +// message type in the standard text format +func (m *Message) UnmarshalText(text []byte) error { + m.Reset() + if err := m.UnmarshalMergeText(text); err != nil { + return err + } + return m.Validate() +} + +// UnmarshalMergeText de-serializes the message that is present, in text format, +// in the given bytes into this message. Unlike UnmarshalText, it does not first +// reset the message, instead merging the data in the given bytes into the +// existing data in this message. +func (m *Message) UnmarshalMergeText(text []byte) error { + return m.unmarshalText(newReader(text), tokenEOF) +} + +func (m *Message) unmarshalText(tr *txtReader, end tokenType) error { + for { + tok := tr.next() + if tok.tokTyp == end { + return nil + } + if tok.tokTyp == tokenEOF { + return io.ErrUnexpectedEOF + } + var fd *desc.FieldDescriptor + var extendedAnyType *desc.MessageDescriptor + if tok.tokTyp == tokenInt { + // tag number (indicates unknown field) + tag, err := strconv.ParseInt(tok.val.(string), 10, 32) + if err != nil { + return err + } + itag := int32(tag) + fd = m.FindFieldDescriptor(itag) + if fd == nil { + // can't parse the value w/out field descriptor, so skip it + tok = tr.next() + if tok.tokTyp == tokenEOF { + return io.ErrUnexpectedEOF + } else if tok.tokTyp == tokenOpenBrace { + if err := skipMessageText(tr, true); err != nil { + return err + } + } else if tok.tokTyp == tokenColon { + if err := skipFieldValueText(tr); err != nil { + return err + } + } else { + return textError(tok, "Expecting a colon ':' or brace '{'; instead got %q", tok.txt) + } + tok = tr.peek() + if tok.tokTyp.IsSep() { + tr.next() // consume separator + } + continue + } + } else { + fieldName, err := unmarshalFieldNameText(tr, tok) + if err != nil { + return err + } + fd = m.FindFieldDescriptorByName(fieldName) + if fd == nil { + // See if it's a group name + for _, field := range m.md.GetFields() { + if field.GetType() == descriptor.FieldDescriptorProto_TYPE_GROUP && field.GetMessageType().GetName() == fieldName { + fd = field + break + } + } + if fd == nil { + // maybe this is an extended Any + if m.md.GetFullyQualifiedName() == "google.protobuf.Any" && fieldName[0] == '[' && strings.Contains(fieldName, "/") { + // strip surrounding "[" and "]" and extract type name from URL + typeUrl := fieldName[1 : len(fieldName)-1] + mname := typeUrl + if slash := strings.LastIndex(mname, "/"); slash >= 0 { + mname = mname[slash+1:] + } + // TODO: add a way to weave an AnyResolver to this point + extendedAnyType = findMessageDescriptor(mname, m.md.GetFile()) + if extendedAnyType == nil { + return textError(tok, "could not parse Any with unknown type URL %q", fieldName) + } + // field 1 is "type_url" + typeUrlField := m.md.FindFieldByNumber(1) + if err := m.TrySetField(typeUrlField, typeUrl); err != nil { + return err + } + } else { + // TODO: add a flag to just ignore unrecognized field names + return textError(tok, "%q is not a recognized field name of %q", fieldName, m.md.GetFullyQualifiedName()) + } + } + } + } + tok = tr.next() + if tok.tokTyp == tokenEOF { + return io.ErrUnexpectedEOF + } + if extendedAnyType != nil { + // consume optional colon; make sure this is a "start message" token + if tok.tokTyp == tokenColon { + tok = tr.next() + if tok.tokTyp == tokenEOF { + return io.ErrUnexpectedEOF + } + } + if tok.tokTyp.EndToken() == tokenError { + return textError(tok, "Expecting a '<' or '{'; instead got %q", tok.txt) + } + + // TODO: use mf.NewMessage and, if not a dynamic message, use proto.UnmarshalText to unmarshal it + g := m.mf.NewDynamicMessage(extendedAnyType) + if err := g.unmarshalText(tr, tok.tokTyp.EndToken()); err != nil { + return err + } + // now we marshal the message to bytes and store in the Any + b, err := g.Marshal() + if err != nil { + return err + } + // field 2 is "value" + anyValueField := m.md.FindFieldByNumber(2) + if err := m.TrySetField(anyValueField, b); err != nil { + return err + } + + } else if (fd.GetType() == descriptor.FieldDescriptorProto_TYPE_GROUP || + fd.GetType() == descriptor.FieldDescriptorProto_TYPE_MESSAGE) && + tok.tokTyp.EndToken() != tokenError { + + // TODO: use mf.NewMessage and, if not a dynamic message, use proto.UnmarshalText to unmarshal it + g := m.mf.NewDynamicMessage(fd.GetMessageType()) + if err := g.unmarshalText(tr, tok.tokTyp.EndToken()); err != nil { + return err + } + if fd.IsRepeated() { + if err := m.TryAddRepeatedField(fd, g); err != nil { + return err + } + } else { + if err := m.TrySetField(fd, g); err != nil { + return err + } + } + } else { + if tok.tokTyp != tokenColon { + return textError(tok, "Expecting a colon ':'; instead got %q", tok.txt) + } + if err := m.unmarshalFieldValueText(fd, tr); err != nil { + return err + } + } + tok = tr.peek() + if tok.tokTyp.IsSep() { + tr.next() // consume separator + } + } +} +func findMessageDescriptor(name string, fd *desc.FileDescriptor) *desc.MessageDescriptor { + md := findMessageInTransitiveDeps(name, fd, map[*desc.FileDescriptor]struct{}{}) + if md == nil { + // couldn't find it; see if we have this message linked in + md, _ = desc.LoadMessageDescriptor(name) + } + return md +} + +func findMessageInTransitiveDeps(name string, fd *desc.FileDescriptor, seen map[*desc.FileDescriptor]struct{}) *desc.MessageDescriptor { + if _, ok := seen[fd]; ok { + // already checked this file + return nil + } + seen[fd] = struct{}{} + md := fd.FindMessage(name) + if md != nil { + return md + } + // not in this file so recursively search its deps + for _, dep := range fd.GetDependencies() { + md = findMessageInTransitiveDeps(name, dep, seen) + if md != nil { + return md + } + } + // couldn't find it + return nil +} + +func textError(tok *token, format string, args ...interface{}) error { + var msg string + if tok.tokTyp == tokenError { + msg = tok.val.(error).Error() + } else { + msg = fmt.Sprintf(format, args...) + } + return fmt.Errorf("line %d, col %d: %s", tok.pos.Line, tok.pos.Column, msg) +} + +type setFunction func(*Message, *desc.FieldDescriptor, interface{}) error + +func (m *Message) unmarshalFieldValueText(fd *desc.FieldDescriptor, tr *txtReader) error { + var set setFunction + if fd.IsRepeated() { + set = (*Message).addRepeatedField + } else { + set = mergeField + } + tok := tr.peek() + if tok.tokTyp == tokenOpenBracket { + tr.next() // consume tok + for { + if err := m.unmarshalFieldElementText(fd, tr, set); err != nil { + return err + } + tok = tr.peek() + if tok.tokTyp == tokenCloseBracket { + tr.next() // consume tok + return nil + } else if tok.tokTyp.IsSep() { + tr.next() // consume separator + } + } + } + return m.unmarshalFieldElementText(fd, tr, set) +} + +func (m *Message) unmarshalFieldElementText(fd *desc.FieldDescriptor, tr *txtReader, set setFunction) error { + tok := tr.next() + if tok.tokTyp == tokenEOF { + return io.ErrUnexpectedEOF + } + + var expected string + switch fd.GetType() { + case descriptor.FieldDescriptorProto_TYPE_BOOL: + if tok.tokTyp == tokenIdent { + if tok.val.(string) == "true" { + return set(m, fd, true) + } else if tok.val.(string) == "false" { + return set(m, fd, false) + } + } + expected = "boolean value" + case descriptor.FieldDescriptorProto_TYPE_BYTES: + if tok.tokTyp == tokenString { + return set(m, fd, []byte(tok.val.(string))) + } + expected = "bytes string value" + case descriptor.FieldDescriptorProto_TYPE_STRING: + if tok.tokTyp == tokenString { + return set(m, fd, tok.val) + } + expected = "string value" + case descriptor.FieldDescriptorProto_TYPE_FLOAT: + switch tok.tokTyp { + case tokenFloat: + return set(m, fd, float32(tok.val.(float64))) + case tokenInt: + if f, err := strconv.ParseFloat(tok.val.(string), 32); err != nil { + return err + } else { + return set(m, fd, float32(f)) + } + case tokenIdent: + ident := strings.ToLower(tok.val.(string)) + if ident == "inf" { + return set(m, fd, float32(math.Inf(1))) + } else if ident == "nan" { + return set(m, fd, float32(math.NaN())) + } + case tokenMinus: + peeked := tr.peek() + if peeked.tokTyp == tokenIdent { + ident := strings.ToLower(peeked.val.(string)) + if ident == "inf" { + tr.next() // consume peeked token + return set(m, fd, float32(math.Inf(-1))) + } + } + } + expected = "float value" + case descriptor.FieldDescriptorProto_TYPE_DOUBLE: + switch tok.tokTyp { + case tokenFloat: + return set(m, fd, tok.val) + case tokenInt: + if f, err := strconv.ParseFloat(tok.val.(string), 64); err != nil { + return err + } else { + return set(m, fd, f) + } + case tokenIdent: + ident := strings.ToLower(tok.val.(string)) + if ident == "inf" { + return set(m, fd, math.Inf(1)) + } else if ident == "nan" { + return set(m, fd, math.NaN()) + } + case tokenMinus: + peeked := tr.peek() + if peeked.tokTyp == tokenIdent { + ident := strings.ToLower(peeked.val.(string)) + if ident == "inf" { + tr.next() // consume peeked token + return set(m, fd, math.Inf(-1)) + } + } + } + expected = "float value" + case descriptor.FieldDescriptorProto_TYPE_INT32, + descriptor.FieldDescriptorProto_TYPE_SINT32, + descriptor.FieldDescriptorProto_TYPE_SFIXED32: + if tok.tokTyp == tokenInt { + if i, err := strconv.ParseInt(tok.val.(string), 10, 32); err != nil { + return err + } else { + return set(m, fd, int32(i)) + } + } + expected = "int value" + case descriptor.FieldDescriptorProto_TYPE_INT64, + descriptor.FieldDescriptorProto_TYPE_SINT64, + descriptor.FieldDescriptorProto_TYPE_SFIXED64: + if tok.tokTyp == tokenInt { + if i, err := strconv.ParseInt(tok.val.(string), 10, 64); err != nil { + return err + } else { + return set(m, fd, i) + } + } + expected = "int value" + case descriptor.FieldDescriptorProto_TYPE_UINT32, + descriptor.FieldDescriptorProto_TYPE_FIXED32: + if tok.tokTyp == tokenInt { + if i, err := strconv.ParseUint(tok.val.(string), 10, 32); err != nil { + return err + } else { + return set(m, fd, uint32(i)) + } + } + expected = "unsigned int value" + case descriptor.FieldDescriptorProto_TYPE_UINT64, + descriptor.FieldDescriptorProto_TYPE_FIXED64: + if tok.tokTyp == tokenInt { + if i, err := strconv.ParseUint(tok.val.(string), 10, 64); err != nil { + return err + } else { + return set(m, fd, i) + } + } + expected = "unsigned int value" + case descriptor.FieldDescriptorProto_TYPE_ENUM: + if tok.tokTyp == tokenIdent { + // TODO: add a flag to just ignore unrecognized enum value names? + vd := fd.GetEnumType().FindValueByName(tok.val.(string)) + if vd != nil { + return set(m, fd, vd.GetNumber()) + } + } else if tok.tokTyp == tokenInt { + if i, err := strconv.ParseInt(tok.val.(string), 10, 32); err != nil { + return err + } else { + return set(m, fd, int32(i)) + } + } + expected = fmt.Sprintf("enum %s value", fd.GetEnumType().GetFullyQualifiedName()) + case descriptor.FieldDescriptorProto_TYPE_MESSAGE, + descriptor.FieldDescriptorProto_TYPE_GROUP: + + endTok := tok.tokTyp.EndToken() + if endTok != tokenError { + dm := m.mf.NewDynamicMessage(fd.GetMessageType()) + if err := dm.unmarshalText(tr, endTok); err != nil { + return err + } + // TODO: ideally we would use mf.NewMessage and, if not a dynamic message, use + // proto package to unmarshal it. But the text parser isn't particularly amenable + // to that, so we instead convert a dynamic message to a generated one if the + // known-type registry knows about the generated type... + var ktr *KnownTypeRegistry + if m.mf != nil { + ktr = m.mf.ktr + } + pm := ktr.CreateIfKnown(fd.GetMessageType().GetFullyQualifiedName()) + if pm != nil { + if err := dm.ConvertTo(pm); err != nil { + return set(m, fd, pm) + } + } + return set(m, fd, dm) + } + expected = fmt.Sprintf("message %s value", fd.GetMessageType().GetFullyQualifiedName()) + default: + return fmt.Errorf("field %q of message %q has unrecognized type: %v", fd.GetFullyQualifiedName(), m.md.GetFullyQualifiedName(), fd.GetType()) + } + + // if we get here, token was wrong type; create error message + var article string + if strings.Contains("aieou", expected[0:1]) { + article = "an" + } else { + article = "a" + } + return textError(tok, "Expecting %s %s; got %q", article, expected, tok.txt) +} + +func unmarshalFieldNameText(tr *txtReader, tok *token) (string, error) { + if tok.tokTyp == tokenOpenBracket || tok.tokTyp == tokenOpenParen { + // extension name + var closeType tokenType + var closeChar string + if tok.tokTyp == tokenOpenBracket { + closeType = tokenCloseBracket + closeChar = "close bracket ']'" + } else { + closeType = tokenCloseParen + closeChar = "close paren ')'" + } + // must be followed by an identifier + idents := make([]string, 0, 1) + for { + tok = tr.next() + if tok.tokTyp == tokenEOF { + return "", io.ErrUnexpectedEOF + } else if tok.tokTyp != tokenIdent { + return "", textError(tok, "Expecting an identifier; instead got %q", tok.txt) + } + idents = append(idents, tok.val.(string)) + // and then close bracket/paren, or "/" to keep adding URL elements to name + tok = tr.next() + if tok.tokTyp == tokenEOF { + return "", io.ErrUnexpectedEOF + } else if tok.tokTyp == closeType { + break + } else if tok.tokTyp != tokenSlash { + return "", textError(tok, "Expecting a %s; instead got %q", closeChar, tok.txt) + } + } + return "[" + strings.Join(idents, "/") + "]", nil + } else if tok.tokTyp == tokenIdent { + // normal field name + return tok.val.(string), nil + } else { + return "", textError(tok, "Expecting an identifier or tag number; instead got %q", tok.txt) + } +} + +func skipFieldNameText(tr *txtReader) error { + tok := tr.next() + if tok.tokTyp == tokenEOF { + return io.ErrUnexpectedEOF + } else if tok.tokTyp == tokenInt || tok.tokTyp == tokenIdent { + return nil + } else { + _, err := unmarshalFieldNameText(tr, tok) + return err + } +} + +func skipFieldValueText(tr *txtReader) error { + tok := tr.peek() + if tok.tokTyp == tokenOpenBracket { + tr.next() // consume tok + for { + if err := skipFieldElementText(tr); err != nil { + return err + } + tok = tr.peek() + if tok.tokTyp == tokenCloseBracket { + tr.next() // consume tok + return nil + } else if tok.tokTyp.IsSep() { + tr.next() // consume separator + } + + } + } + return skipFieldElementText(tr) +} + +func skipFieldElementText(tr *txtReader) error { + tok := tr.next() + switch tok.tokTyp { + case tokenEOF: + return io.ErrUnexpectedEOF + case tokenInt, tokenFloat, tokenString, tokenIdent: + return nil + case tokenOpenAngle: + return skipMessageText(tr, false) + default: + return textError(tok, "Expecting an angle bracket '<' or a value; instead got %q", tok.txt) + } +} + +func skipMessageText(tr *txtReader, isGroup bool) error { + for { + tok := tr.peek() + if tok.tokTyp == tokenEOF { + return io.ErrUnexpectedEOF + } else if isGroup && tok.tokTyp == tokenCloseBrace { + return nil + } else if !isGroup && tok.tokTyp == tokenCloseAngle { + return nil + } + + // field name or tag + if err := skipFieldNameText(tr); err != nil { + return err + } + + // field value + tok = tr.next() + if tok.tokTyp == tokenEOF { + return io.ErrUnexpectedEOF + } else if tok.tokTyp == tokenOpenBrace { + if err := skipMessageText(tr, true); err != nil { + return err + } + } else if tok.tokTyp == tokenColon { + if err := skipFieldValueText(tr); err != nil { + return err + } + } else { + return textError(tok, "Expecting a colon ':' or brace '{'; instead got %q", tok.txt) + } + + tok = tr.peek() + if tok.tokTyp.IsSep() { + tr.next() // consume separator + } + } +} + +type tokenType int + +const ( + tokenError tokenType = iota + tokenEOF + tokenIdent + tokenString + tokenInt + tokenFloat + tokenColon + tokenComma + tokenSemiColon + tokenOpenBrace + tokenCloseBrace + tokenOpenBracket + tokenCloseBracket + tokenOpenAngle + tokenCloseAngle + tokenOpenParen + tokenCloseParen + tokenSlash + tokenMinus +) + +func (t tokenType) IsSep() bool { + return t == tokenComma || t == tokenSemiColon +} + +func (t tokenType) EndToken() tokenType { + switch t { + case tokenOpenAngle: + return tokenCloseAngle + case tokenOpenBrace: + return tokenCloseBrace + default: + return tokenError + } +} + +type token struct { + tokTyp tokenType + val interface{} + txt string + pos scanner.Position +} + +type txtReader struct { + scanner scanner.Scanner + peeked token + havePeeked bool +} + +func newReader(text []byte) *txtReader { + sc := scanner.Scanner{} + sc.Init(bytes.NewReader(text)) + sc.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanFloats | scanner.ScanChars | + scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments + // identifiers are same restrictions as Go identifiers, except we also allow dots since + // we accept fully-qualified names + sc.IsIdentRune = func(ch rune, i int) bool { + return ch == '_' || unicode.IsLetter(ch) || + (i > 0 && unicode.IsDigit(ch)) || + (i > 0 && ch == '.') + } + // ignore errors; we handle them if/when we see malformed tokens + sc.Error = func(s *scanner.Scanner, msg string) {} + return &txtReader{scanner: sc} +} + +func (p *txtReader) peek() *token { + if p.havePeeked { + return &p.peeked + } + t := p.scanner.Scan() + if t == scanner.EOF { + p.peeked.tokTyp = tokenEOF + p.peeked.val = nil + p.peeked.txt = "" + p.peeked.pos = p.scanner.Position + } else if err := p.processToken(t, p.scanner.TokenText(), p.scanner.Position); err != nil { + p.peeked.tokTyp = tokenError + p.peeked.val = err + } + p.havePeeked = true + return &p.peeked +} + +func (p *txtReader) processToken(t rune, text string, pos scanner.Position) error { + p.peeked.pos = pos + p.peeked.txt = text + switch t { + case scanner.Ident: + p.peeked.tokTyp = tokenIdent + p.peeked.val = text + case scanner.Int: + p.peeked.tokTyp = tokenInt + p.peeked.val = text // can't parse the number because we don't know if it's signed or unsigned + case scanner.Float: + p.peeked.tokTyp = tokenFloat + var err error + if p.peeked.val, err = strconv.ParseFloat(text, 64); err != nil { + return err + } + case scanner.Char, scanner.String: + p.peeked.tokTyp = tokenString + var err error + if p.peeked.val, err = strconv.Unquote(text); err != nil { + return err + } + case '-': // unary minus, for negative ints and floats + ch := p.scanner.Peek() + if ch < '0' || ch > '9' { + p.peeked.tokTyp = tokenMinus + p.peeked.val = '-' + } else { + t := p.scanner.Scan() + if t == scanner.EOF { + return io.ErrUnexpectedEOF + } else if t == scanner.Float { + p.peeked.tokTyp = tokenFloat + text += p.scanner.TokenText() + p.peeked.txt = text + var err error + if p.peeked.val, err = strconv.ParseFloat(text, 64); err != nil { + p.peeked.pos = p.scanner.Position + return err + } + } else if t == scanner.Int { + p.peeked.tokTyp = tokenInt + text += p.scanner.TokenText() + p.peeked.txt = text + p.peeked.val = text // can't parse the number because we don't know if it's signed or unsigned + } else { + p.peeked.pos = p.scanner.Position + return fmt.Errorf("expecting an int or float but got %q", p.scanner.TokenText()) + } + } + case ':': + p.peeked.tokTyp = tokenColon + p.peeked.val = ':' + case ',': + p.peeked.tokTyp = tokenComma + p.peeked.val = ',' + case ';': + p.peeked.tokTyp = tokenSemiColon + p.peeked.val = ';' + case '{': + p.peeked.tokTyp = tokenOpenBrace + p.peeked.val = '{' + case '}': + p.peeked.tokTyp = tokenCloseBrace + p.peeked.val = '}' + case '<': + p.peeked.tokTyp = tokenOpenAngle + p.peeked.val = '<' + case '>': + p.peeked.tokTyp = tokenCloseAngle + p.peeked.val = '>' + case '[': + p.peeked.tokTyp = tokenOpenBracket + p.peeked.val = '[' + case ']': + p.peeked.tokTyp = tokenCloseBracket + p.peeked.val = ']' + case '(': + p.peeked.tokTyp = tokenOpenParen + p.peeked.val = '(' + case ')': + p.peeked.tokTyp = tokenCloseParen + p.peeked.val = ')' + case '/': + // only allowed to separate URL components in expanded Any format + p.peeked.tokTyp = tokenSlash + p.peeked.val = '/' + default: + return fmt.Errorf("invalid character: %c", t) + } + return nil +} + +func (p *txtReader) next() *token { + t := p.peek() + if t.tokTyp != tokenEOF && t.tokTyp != tokenError { + p.havePeeked = false + } + return t +} diff --git a/vendor/github.com/jhump/protoreflect/internal/standard_files.go b/vendor/github.com/jhump/protoreflect/internal/standard_files.go new file mode 100644 index 00000000..4a8b47a9 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/internal/standard_files.go @@ -0,0 +1,127 @@ +// Package internal contains some code that should not be exported but needs to +// be shared across more than one of the protoreflect sub-packages. +package internal + +import ( + "bytes" + "compress/gzip" + "fmt" + "io/ioutil" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// TODO: replace this alias configuration with desc.RegisterImportPath? + +// StdFileAliases are the standard protos included with protoc, but older versions of +// their respective packages registered them using incorrect paths. +var StdFileAliases = map[string]string{ + // Files for the github.com/golang/protobuf/ptypes package at one point were + // registered using the path where the proto files are mirrored in GOPATH, + // inside the golang/protobuf repo. + // (Fixed as of https://github.com/golang/protobuf/pull/412) + "google/protobuf/any.proto": "github.com/golang/protobuf/ptypes/any/any.proto", + "google/protobuf/duration.proto": "github.com/golang/protobuf/ptypes/duration/duration.proto", + "google/protobuf/empty.proto": "github.com/golang/protobuf/ptypes/empty/empty.proto", + "google/protobuf/struct.proto": "github.com/golang/protobuf/ptypes/struct/struct.proto", + "google/protobuf/timestamp.proto": "github.com/golang/protobuf/ptypes/timestamp/timestamp.proto", + "google/protobuf/wrappers.proto": "github.com/golang/protobuf/ptypes/wrappers/wrappers.proto", + // Files for the google.golang.org/genproto/protobuf package at one point + // were registered with an anomalous "src/" prefix. + // (Fixed as of https://github.com/google/go-genproto/pull/31) + "google/protobuf/api.proto": "src/google/protobuf/api.proto", + "google/protobuf/field_mask.proto": "src/google/protobuf/field_mask.proto", + "google/protobuf/source_context.proto": "src/google/protobuf/source_context.proto", + "google/protobuf/type.proto": "src/google/protobuf/type.proto", + + // Other standard files (descriptor.proto and compiler/plugin.proto) are + // registered correctly, so we don't need rules for them here. +} + +func init() { + // We provide aliasing in both directions, to support files with the + // proper import path linked against older versions of the generated + // files AND files that used the aliased import path but linked against + // newer versions of the generated files (which register with the + // correct path). + + // Get all files defined above + keys := make([]string, 0, len(StdFileAliases)) + for k := range StdFileAliases { + keys = append(keys, k) + } + // And add inverse mappings + for _, k := range keys { + alias := StdFileAliases[k] + StdFileAliases[alias] = k + } +} + +type ErrNoSuchFile string + +func (e ErrNoSuchFile) Error() string { + return fmt.Sprintf("no such file: %q", string(e)) +} + +// LoadFileDescriptor loads a registered descriptor and decodes it. If the given +// name cannot be loaded but is a known standard name, an alias will be tried, +// so the standard files can be loaded even if linked against older "known bad" +// versions of packages. +func LoadFileDescriptor(file string) (*dpb.FileDescriptorProto, error) { + fdb := proto.FileDescriptor(file) + aliased := false + if fdb == nil { + var ok bool + alias, ok := StdFileAliases[file] + if ok { + aliased = true + if fdb = proto.FileDescriptor(alias); fdb == nil { + return nil, ErrNoSuchFile(file) + } + } else { + return nil, ErrNoSuchFile(file) + } + } + + fd, err := DecodeFileDescriptor(file, fdb) + if err != nil { + return nil, err + } + + if aliased { + // the file descriptor will have the alias used to load it, but + // we need it to have the specified name in order to link it + fd.Name = proto.String(file) + } + + return fd, nil +} + +// DecodeFileDescriptor decodes the bytes of a registered file descriptor. +// Registered file descriptors are first "proto encoded" (e.g. binary format +// for the descriptor protos) and then gzipped. So this function gunzips and +// then unmarshals into a descriptor proto. +func DecodeFileDescriptor(element string, fdb []byte) (*dpb.FileDescriptorProto, error) { + raw, err := decompress(fdb) + if err != nil { + return nil, fmt.Errorf("failed to decompress %q descriptor: %v", element, err) + } + fd := dpb.FileDescriptorProto{} + if err := proto.Unmarshal(raw, &fd); err != nil { + return nil, fmt.Errorf("bad descriptor for %q: %v", element, err) + } + return &fd, nil +} + +func decompress(b []byte) ([]byte, error) { + r, err := gzip.NewReader(bytes.NewReader(b)) + if err != nil { + return nil, fmt.Errorf("bad gzipped descriptor: %v", err) + } + out, err := ioutil.ReadAll(r) + if err != nil { + return nil, fmt.Errorf("bad gzipped descriptor: %v", err) + } + return out, nil +} diff --git a/vendor/github.com/jhump/protoreflect/internal/unrecognized.go b/vendor/github.com/jhump/protoreflect/internal/unrecognized.go new file mode 100644 index 00000000..c903d4b2 --- /dev/null +++ b/vendor/github.com/jhump/protoreflect/internal/unrecognized.go @@ -0,0 +1,86 @@ +package internal + +import ( + "reflect" + + "github.com/golang/protobuf/proto" +) + +var typeOfBytes = reflect.TypeOf([]byte(nil)) + +// GetUnrecognized fetches the bytes of unrecognized fields for the given message. +func GetUnrecognized(msg proto.Message) []byte { + val := reflect.Indirect(reflect.ValueOf(msg)) + u := val.FieldByName("XXX_unrecognized") + if u.IsValid() && u.Type() == typeOfBytes { + return u.Interface().([]byte) + } + + // Fallback to reflection for API v2 messages + get, _, _, ok := unrecognizedGetSetMethods(val) + if !ok { + return nil + } + + return get.Call([]reflect.Value(nil))[0].Convert(typeOfBytes).Interface().([]byte) +} + +// SetUnrecognized adds the given bytes to the unrecognized fields for the given message. +func SetUnrecognized(msg proto.Message, data []byte) { + val := reflect.Indirect(reflect.ValueOf(msg)) + u := val.FieldByName("XXX_unrecognized") + if u.IsValid() && u.Type() == typeOfBytes { + // Just store the bytes in the unrecognized field + ub := u.Interface().([]byte) + ub = append(ub, data...) + u.Set(reflect.ValueOf(ub)) + return + } + + // Fallback to reflection for API v2 messages + get, set, argType, ok := unrecognizedGetSetMethods(val) + if !ok { + return + } + + existing := get.Call([]reflect.Value(nil))[0].Convert(typeOfBytes).Interface().([]byte) + if len(existing) > 0 { + data = append(existing, data...) + } + set.Call([]reflect.Value{reflect.ValueOf(data).Convert(argType)}) +} + +func unrecognizedGetSetMethods(val reflect.Value) (get reflect.Value, set reflect.Value, argType reflect.Type, ok bool) { + // val could be an APIv2 message. We use reflection to interact with + // this message so that we don't have a hard dependency on the new + // version of the protobuf package. + refMethod := val.MethodByName("ProtoReflect") + if !refMethod.IsValid() { + if val.CanAddr() { + refMethod = val.Addr().MethodByName("ProtoReflect") + } + if !refMethod.IsValid() { + return + } + } + refType := refMethod.Type() + if refType.NumIn() != 0 || refType.NumOut() != 1 { + return + } + ref := refMethod.Call([]reflect.Value(nil)) + getMethod, setMethod := ref[0].MethodByName("GetUnknown"), ref[0].MethodByName("SetUnknown") + if !getMethod.IsValid() || !setMethod.IsValid() { + return + } + getType := getMethod.Type() + setType := setMethod.Type() + if getType.NumIn() != 0 || getType.NumOut() != 1 || setType.NumIn() != 1 || setType.NumOut() != 0 { + return + } + arg := setType.In(0) + if !arg.ConvertibleTo(typeOfBytes) || getType.Out(0) != arg { + return + } + + return getMethod, setMethod, arg, true +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb/collector.pb.go b/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb/collector.pb.go new file mode 100644 index 00000000..3da2bc83 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb/collector.pb.go @@ -0,0 +1,3870 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/lightstep/lightstep-tracer-common/tmpgen/collector.proto + +/* + Package collectorpb is a generated protocol buffer package. + + It is generated from these files: + github.com/lightstep/lightstep-tracer-common/tmpgen/collector.proto + + It has these top-level messages: + SpanContext + KeyValue + Log + Reference + Span + Reporter + MetricsSample + InternalMetrics + Auth + ReportRequest + Command + ReportResponse +*/ +package collectorpb // import "github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb" + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/gogo/protobuf/types" +import _ "google.golang.org/genproto/googleapis/api/annotations" + +import ( + context "golang.org/x/net/context" + grpc "google.golang.org/grpc" +) + +import encoding_binary "encoding/binary" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type Reference_Relationship int32 + +const ( + Reference_CHILD_OF Reference_Relationship = 0 + Reference_FOLLOWS_FROM Reference_Relationship = 1 +) + +var Reference_Relationship_name = map[int32]string{ + 0: "CHILD_OF", + 1: "FOLLOWS_FROM", +} +var Reference_Relationship_value = map[string]int32{ + "CHILD_OF": 0, + "FOLLOWS_FROM": 1, +} + +func (x Reference_Relationship) String() string { + return proto.EnumName(Reference_Relationship_name, int32(x)) +} +func (Reference_Relationship) EnumDescriptor() ([]byte, []int) { + return fileDescriptorCollector, []int{3, 0} +} + +type SpanContext struct { + TraceId uint64 `protobuf:"varint,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + SpanId uint64 `protobuf:"varint,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"` + Baggage map[string]string `protobuf:"bytes,3,rep,name=baggage" json:"baggage,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (m *SpanContext) Reset() { *m = SpanContext{} } +func (m *SpanContext) String() string { return proto.CompactTextString(m) } +func (*SpanContext) ProtoMessage() {} +func (*SpanContext) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{0} } + +func (m *SpanContext) GetTraceId() uint64 { + if m != nil { + return m.TraceId + } + return 0 +} + +func (m *SpanContext) GetSpanId() uint64 { + if m != nil { + return m.SpanId + } + return 0 +} + +func (m *SpanContext) GetBaggage() map[string]string { + if m != nil { + return m.Baggage + } + return nil +} + +// Represent both tags and log fields. +type KeyValue struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // Types that are valid to be assigned to Value: + // *KeyValue_StringValue + // *KeyValue_IntValue + // *KeyValue_DoubleValue + // *KeyValue_BoolValue + // *KeyValue_JsonValue + Value isKeyValue_Value `protobuf_oneof:"value"` +} + +func (m *KeyValue) Reset() { *m = KeyValue{} } +func (m *KeyValue) String() string { return proto.CompactTextString(m) } +func (*KeyValue) ProtoMessage() {} +func (*KeyValue) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{1} } + +type isKeyValue_Value interface { + isKeyValue_Value() + MarshalTo([]byte) (int, error) + Size() int +} + +type KeyValue_StringValue struct { + StringValue string `protobuf:"bytes,2,opt,name=string_value,json=stringValue,proto3,oneof"` +} +type KeyValue_IntValue struct { + IntValue int64 `protobuf:"varint,3,opt,name=int_value,json=intValue,proto3,oneof"` +} +type KeyValue_DoubleValue struct { + DoubleValue float64 `protobuf:"fixed64,4,opt,name=double_value,json=doubleValue,proto3,oneof"` +} +type KeyValue_BoolValue struct { + BoolValue bool `protobuf:"varint,5,opt,name=bool_value,json=boolValue,proto3,oneof"` +} +type KeyValue_JsonValue struct { + JsonValue string `protobuf:"bytes,6,opt,name=json_value,json=jsonValue,proto3,oneof"` +} + +func (*KeyValue_StringValue) isKeyValue_Value() {} +func (*KeyValue_IntValue) isKeyValue_Value() {} +func (*KeyValue_DoubleValue) isKeyValue_Value() {} +func (*KeyValue_BoolValue) isKeyValue_Value() {} +func (*KeyValue_JsonValue) isKeyValue_Value() {} + +func (m *KeyValue) GetValue() isKeyValue_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *KeyValue) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *KeyValue) GetStringValue() string { + if x, ok := m.GetValue().(*KeyValue_StringValue); ok { + return x.StringValue + } + return "" +} + +func (m *KeyValue) GetIntValue() int64 { + if x, ok := m.GetValue().(*KeyValue_IntValue); ok { + return x.IntValue + } + return 0 +} + +func (m *KeyValue) GetDoubleValue() float64 { + if x, ok := m.GetValue().(*KeyValue_DoubleValue); ok { + return x.DoubleValue + } + return 0 +} + +func (m *KeyValue) GetBoolValue() bool { + if x, ok := m.GetValue().(*KeyValue_BoolValue); ok { + return x.BoolValue + } + return false +} + +func (m *KeyValue) GetJsonValue() string { + if x, ok := m.GetValue().(*KeyValue_JsonValue); ok { + return x.JsonValue + } + return "" +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*KeyValue) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _KeyValue_OneofMarshaler, _KeyValue_OneofUnmarshaler, _KeyValue_OneofSizer, []interface{}{ + (*KeyValue_StringValue)(nil), + (*KeyValue_IntValue)(nil), + (*KeyValue_DoubleValue)(nil), + (*KeyValue_BoolValue)(nil), + (*KeyValue_JsonValue)(nil), + } +} + +func _KeyValue_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*KeyValue) + // value + switch x := m.Value.(type) { + case *KeyValue_StringValue: + _ = b.EncodeVarint(2<<3 | proto.WireBytes) + _ = b.EncodeStringBytes(x.StringValue) + case *KeyValue_IntValue: + _ = b.EncodeVarint(3<<3 | proto.WireVarint) + _ = b.EncodeVarint(uint64(x.IntValue)) + case *KeyValue_DoubleValue: + _ = b.EncodeVarint(4<<3 | proto.WireFixed64) + _ = b.EncodeFixed64(math.Float64bits(x.DoubleValue)) + case *KeyValue_BoolValue: + t := uint64(0) + if x.BoolValue { + t = 1 + } + _ = b.EncodeVarint(5<<3 | proto.WireVarint) + _ = b.EncodeVarint(t) + case *KeyValue_JsonValue: + _ = b.EncodeVarint(6<<3 | proto.WireBytes) + _ = b.EncodeStringBytes(x.JsonValue) + case nil: + default: + return fmt.Errorf("KeyValue.Value has unexpected type %T", x) + } + return nil +} + +func _KeyValue_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*KeyValue) + switch tag { + case 2: // value.string_value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Value = &KeyValue_StringValue{x} + return true, err + case 3: // value.int_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Value = &KeyValue_IntValue{int64(x)} + return true, err + case 4: // value.double_value + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Value = &KeyValue_DoubleValue{math.Float64frombits(x)} + return true, err + case 5: // value.bool_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Value = &KeyValue_BoolValue{x != 0} + return true, err + case 6: // value.json_value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Value = &KeyValue_JsonValue{x} + return true, err + default: + return false, nil + } +} + +func _KeyValue_OneofSizer(msg proto.Message) (n int) { + m := msg.(*KeyValue) + // value + switch x := m.Value.(type) { + case *KeyValue_StringValue: + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.StringValue))) + n += len(x.StringValue) + case *KeyValue_IntValue: + n += proto.SizeVarint(3<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.IntValue)) + case *KeyValue_DoubleValue: + n += proto.SizeVarint(4<<3 | proto.WireFixed64) + n += 8 + case *KeyValue_BoolValue: + n += proto.SizeVarint(5<<3 | proto.WireVarint) + n += 1 + case *KeyValue_JsonValue: + n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.JsonValue))) + n += len(x.JsonValue) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Log struct { + Timestamp *google_protobuf.Timestamp `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp,omitempty"` + Fields []*KeyValue `protobuf:"bytes,2,rep,name=fields" json:"fields,omitempty"` +} + +func (m *Log) Reset() { *m = Log{} } +func (m *Log) String() string { return proto.CompactTextString(m) } +func (*Log) ProtoMessage() {} +func (*Log) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{2} } + +func (m *Log) GetTimestamp() *google_protobuf.Timestamp { + if m != nil { + return m.Timestamp + } + return nil +} + +func (m *Log) GetFields() []*KeyValue { + if m != nil { + return m.Fields + } + return nil +} + +type Reference struct { + Relationship Reference_Relationship `protobuf:"varint,1,opt,name=relationship,proto3,enum=lightstep.collector.Reference_Relationship" json:"relationship,omitempty"` + SpanContext *SpanContext `protobuf:"bytes,2,opt,name=span_context,json=spanContext" json:"span_context,omitempty"` +} + +func (m *Reference) Reset() { *m = Reference{} } +func (m *Reference) String() string { return proto.CompactTextString(m) } +func (*Reference) ProtoMessage() {} +func (*Reference) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{3} } + +func (m *Reference) GetRelationship() Reference_Relationship { + if m != nil { + return m.Relationship + } + return Reference_CHILD_OF +} + +func (m *Reference) GetSpanContext() *SpanContext { + if m != nil { + return m.SpanContext + } + return nil +} + +type Span struct { + SpanContext *SpanContext `protobuf:"bytes,1,opt,name=span_context,json=spanContext" json:"span_context,omitempty"` + OperationName string `protobuf:"bytes,2,opt,name=operation_name,json=operationName,proto3" json:"operation_name,omitempty"` + References []*Reference `protobuf:"bytes,3,rep,name=references" json:"references,omitempty"` + StartTimestamp *google_protobuf.Timestamp `protobuf:"bytes,4,opt,name=start_timestamp,json=startTimestamp" json:"start_timestamp,omitempty"` + DurationMicros uint64 `protobuf:"varint,5,opt,name=duration_micros,json=durationMicros,proto3" json:"duration_micros,omitempty"` + Tags []*KeyValue `protobuf:"bytes,6,rep,name=tags" json:"tags,omitempty"` + Logs []*Log `protobuf:"bytes,7,rep,name=logs" json:"logs,omitempty"` +} + +func (m *Span) Reset() { *m = Span{} } +func (m *Span) String() string { return proto.CompactTextString(m) } +func (*Span) ProtoMessage() {} +func (*Span) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{4} } + +func (m *Span) GetSpanContext() *SpanContext { + if m != nil { + return m.SpanContext + } + return nil +} + +func (m *Span) GetOperationName() string { + if m != nil { + return m.OperationName + } + return "" +} + +func (m *Span) GetReferences() []*Reference { + if m != nil { + return m.References + } + return nil +} + +func (m *Span) GetStartTimestamp() *google_protobuf.Timestamp { + if m != nil { + return m.StartTimestamp + } + return nil +} + +func (m *Span) GetDurationMicros() uint64 { + if m != nil { + return m.DurationMicros + } + return 0 +} + +func (m *Span) GetTags() []*KeyValue { + if m != nil { + return m.Tags + } + return nil +} + +func (m *Span) GetLogs() []*Log { + if m != nil { + return m.Logs + } + return nil +} + +type Reporter struct { + ReporterId uint64 `protobuf:"varint,1,opt,name=reporter_id,json=reporterId,proto3" json:"reporter_id,omitempty"` + Tags []*KeyValue `protobuf:"bytes,4,rep,name=tags" json:"tags,omitempty"` +} + +func (m *Reporter) Reset() { *m = Reporter{} } +func (m *Reporter) String() string { return proto.CompactTextString(m) } +func (*Reporter) ProtoMessage() {} +func (*Reporter) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{5} } + +func (m *Reporter) GetReporterId() uint64 { + if m != nil { + return m.ReporterId + } + return 0 +} + +func (m *Reporter) GetTags() []*KeyValue { + if m != nil { + return m.Tags + } + return nil +} + +type MetricsSample struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Types that are valid to be assigned to Value: + // *MetricsSample_IntValue + // *MetricsSample_DoubleValue + Value isMetricsSample_Value `protobuf_oneof:"value"` +} + +func (m *MetricsSample) Reset() { *m = MetricsSample{} } +func (m *MetricsSample) String() string { return proto.CompactTextString(m) } +func (*MetricsSample) ProtoMessage() {} +func (*MetricsSample) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{6} } + +type isMetricsSample_Value interface { + isMetricsSample_Value() + MarshalTo([]byte) (int, error) + Size() int +} + +type MetricsSample_IntValue struct { + IntValue int64 `protobuf:"varint,2,opt,name=int_value,json=intValue,proto3,oneof"` +} +type MetricsSample_DoubleValue struct { + DoubleValue float64 `protobuf:"fixed64,3,opt,name=double_value,json=doubleValue,proto3,oneof"` +} + +func (*MetricsSample_IntValue) isMetricsSample_Value() {} +func (*MetricsSample_DoubleValue) isMetricsSample_Value() {} + +func (m *MetricsSample) GetValue() isMetricsSample_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *MetricsSample) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *MetricsSample) GetIntValue() int64 { + if x, ok := m.GetValue().(*MetricsSample_IntValue); ok { + return x.IntValue + } + return 0 +} + +func (m *MetricsSample) GetDoubleValue() float64 { + if x, ok := m.GetValue().(*MetricsSample_DoubleValue); ok { + return x.DoubleValue + } + return 0 +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*MetricsSample) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _MetricsSample_OneofMarshaler, _MetricsSample_OneofUnmarshaler, _MetricsSample_OneofSizer, []interface{}{ + (*MetricsSample_IntValue)(nil), + (*MetricsSample_DoubleValue)(nil), + } +} + +func _MetricsSample_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*MetricsSample) + // value + switch x := m.Value.(type) { + case *MetricsSample_IntValue: + _ = b.EncodeVarint(2<<3 | proto.WireVarint) + _ = b.EncodeVarint(uint64(x.IntValue)) + case *MetricsSample_DoubleValue: + _ = b.EncodeVarint(3<<3 | proto.WireFixed64) + _ = b.EncodeFixed64(math.Float64bits(x.DoubleValue)) + case nil: + default: + return fmt.Errorf("MetricsSample.Value has unexpected type %T", x) + } + return nil +} + +func _MetricsSample_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*MetricsSample) + switch tag { + case 2: // value.int_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Value = &MetricsSample_IntValue{int64(x)} + return true, err + case 3: // value.double_value + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Value = &MetricsSample_DoubleValue{math.Float64frombits(x)} + return true, err + default: + return false, nil + } +} + +func _MetricsSample_OneofSizer(msg proto.Message) (n int) { + m := msg.(*MetricsSample) + // value + switch x := m.Value.(type) { + case *MetricsSample_IntValue: + n += proto.SizeVarint(2<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.IntValue)) + case *MetricsSample_DoubleValue: + n += proto.SizeVarint(3<<3 | proto.WireFixed64) + n += 8 + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type InternalMetrics struct { + StartTimestamp *google_protobuf.Timestamp `protobuf:"bytes,1,opt,name=start_timestamp,json=startTimestamp" json:"start_timestamp,omitempty"` + DurationMicros uint64 `protobuf:"varint,2,opt,name=duration_micros,json=durationMicros,proto3" json:"duration_micros,omitempty"` + Logs []*Log `protobuf:"bytes,3,rep,name=logs" json:"logs,omitempty"` + Counts []*MetricsSample `protobuf:"bytes,4,rep,name=counts" json:"counts,omitempty"` + Gauges []*MetricsSample `protobuf:"bytes,5,rep,name=gauges" json:"gauges,omitempty"` +} + +func (m *InternalMetrics) Reset() { *m = InternalMetrics{} } +func (m *InternalMetrics) String() string { return proto.CompactTextString(m) } +func (*InternalMetrics) ProtoMessage() {} +func (*InternalMetrics) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{7} } + +func (m *InternalMetrics) GetStartTimestamp() *google_protobuf.Timestamp { + if m != nil { + return m.StartTimestamp + } + return nil +} + +func (m *InternalMetrics) GetDurationMicros() uint64 { + if m != nil { + return m.DurationMicros + } + return 0 +} + +func (m *InternalMetrics) GetLogs() []*Log { + if m != nil { + return m.Logs + } + return nil +} + +func (m *InternalMetrics) GetCounts() []*MetricsSample { + if m != nil { + return m.Counts + } + return nil +} + +func (m *InternalMetrics) GetGauges() []*MetricsSample { + if m != nil { + return m.Gauges + } + return nil +} + +type Auth struct { + AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` +} + +func (m *Auth) Reset() { *m = Auth{} } +func (m *Auth) String() string { return proto.CompactTextString(m) } +func (*Auth) ProtoMessage() {} +func (*Auth) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{8} } + +func (m *Auth) GetAccessToken() string { + if m != nil { + return m.AccessToken + } + return "" +} + +type ReportRequest struct { + Reporter *Reporter `protobuf:"bytes,1,opt,name=reporter" json:"reporter,omitempty"` + Auth *Auth `protobuf:"bytes,2,opt,name=auth" json:"auth,omitempty"` + Spans []*Span `protobuf:"bytes,3,rep,name=spans" json:"spans,omitempty"` + TimestampOffsetMicros int64 `protobuf:"varint,5,opt,name=timestamp_offset_micros,json=timestampOffsetMicros,proto3" json:"timestamp_offset_micros,omitempty"` + InternalMetrics *InternalMetrics `protobuf:"bytes,6,opt,name=internal_metrics,json=internalMetrics" json:"internal_metrics,omitempty"` +} + +func (m *ReportRequest) Reset() { *m = ReportRequest{} } +func (m *ReportRequest) String() string { return proto.CompactTextString(m) } +func (*ReportRequest) ProtoMessage() {} +func (*ReportRequest) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{9} } + +func (m *ReportRequest) GetReporter() *Reporter { + if m != nil { + return m.Reporter + } + return nil +} + +func (m *ReportRequest) GetAuth() *Auth { + if m != nil { + return m.Auth + } + return nil +} + +func (m *ReportRequest) GetSpans() []*Span { + if m != nil { + return m.Spans + } + return nil +} + +func (m *ReportRequest) GetTimestampOffsetMicros() int64 { + if m != nil { + return m.TimestampOffsetMicros + } + return 0 +} + +func (m *ReportRequest) GetInternalMetrics() *InternalMetrics { + if m != nil { + return m.InternalMetrics + } + return nil +} + +type Command struct { + Disable bool `protobuf:"varint,1,opt,name=disable,proto3" json:"disable,omitempty"` + DevMode bool `protobuf:"varint,2,opt,name=dev_mode,json=devMode,proto3" json:"dev_mode,omitempty"` +} + +func (m *Command) Reset() { *m = Command{} } +func (m *Command) String() string { return proto.CompactTextString(m) } +func (*Command) ProtoMessage() {} +func (*Command) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{10} } + +func (m *Command) GetDisable() bool { + if m != nil { + return m.Disable + } + return false +} + +func (m *Command) GetDevMode() bool { + if m != nil { + return m.DevMode + } + return false +} + +type ReportResponse struct { + Commands []*Command `protobuf:"bytes,1,rep,name=commands" json:"commands,omitempty"` + ReceiveTimestamp *google_protobuf.Timestamp `protobuf:"bytes,2,opt,name=receive_timestamp,json=receiveTimestamp" json:"receive_timestamp,omitempty"` + TransmitTimestamp *google_protobuf.Timestamp `protobuf:"bytes,3,opt,name=transmit_timestamp,json=transmitTimestamp" json:"transmit_timestamp,omitempty"` + Errors []string `protobuf:"bytes,4,rep,name=errors" json:"errors,omitempty"` + Warnings []string `protobuf:"bytes,5,rep,name=warnings" json:"warnings,omitempty"` + Infos []string `protobuf:"bytes,6,rep,name=infos" json:"infos,omitempty"` +} + +func (m *ReportResponse) Reset() { *m = ReportResponse{} } +func (m *ReportResponse) String() string { return proto.CompactTextString(m) } +func (*ReportResponse) ProtoMessage() {} +func (*ReportResponse) Descriptor() ([]byte, []int) { return fileDescriptorCollector, []int{11} } + +func (m *ReportResponse) GetCommands() []*Command { + if m != nil { + return m.Commands + } + return nil +} + +func (m *ReportResponse) GetReceiveTimestamp() *google_protobuf.Timestamp { + if m != nil { + return m.ReceiveTimestamp + } + return nil +} + +func (m *ReportResponse) GetTransmitTimestamp() *google_protobuf.Timestamp { + if m != nil { + return m.TransmitTimestamp + } + return nil +} + +func (m *ReportResponse) GetErrors() []string { + if m != nil { + return m.Errors + } + return nil +} + +func (m *ReportResponse) GetWarnings() []string { + if m != nil { + return m.Warnings + } + return nil +} + +func (m *ReportResponse) GetInfos() []string { + if m != nil { + return m.Infos + } + return nil +} + +func init() { + proto.RegisterType((*SpanContext)(nil), "lightstep.collector.SpanContext") + proto.RegisterType((*KeyValue)(nil), "lightstep.collector.KeyValue") + proto.RegisterType((*Log)(nil), "lightstep.collector.Log") + proto.RegisterType((*Reference)(nil), "lightstep.collector.Reference") + proto.RegisterType((*Span)(nil), "lightstep.collector.Span") + proto.RegisterType((*Reporter)(nil), "lightstep.collector.Reporter") + proto.RegisterType((*MetricsSample)(nil), "lightstep.collector.MetricsSample") + proto.RegisterType((*InternalMetrics)(nil), "lightstep.collector.InternalMetrics") + proto.RegisterType((*Auth)(nil), "lightstep.collector.Auth") + proto.RegisterType((*ReportRequest)(nil), "lightstep.collector.ReportRequest") + proto.RegisterType((*Command)(nil), "lightstep.collector.Command") + proto.RegisterType((*ReportResponse)(nil), "lightstep.collector.ReportResponse") + proto.RegisterEnum("lightstep.collector.Reference_Relationship", Reference_Relationship_name, Reference_Relationship_value) +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// Client API for CollectorService service + +type CollectorServiceClient interface { + Report(ctx context.Context, in *ReportRequest, opts ...grpc.CallOption) (*ReportResponse, error) +} + +type collectorServiceClient struct { + cc *grpc.ClientConn +} + +func NewCollectorServiceClient(cc *grpc.ClientConn) CollectorServiceClient { + return &collectorServiceClient{cc} +} + +func (c *collectorServiceClient) Report(ctx context.Context, in *ReportRequest, opts ...grpc.CallOption) (*ReportResponse, error) { + out := new(ReportResponse) + err := grpc.Invoke(ctx, "/lightstep.collector.CollectorService/Report", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for CollectorService service + +type CollectorServiceServer interface { + Report(context.Context, *ReportRequest) (*ReportResponse, error) +} + +func RegisterCollectorServiceServer(s *grpc.Server, srv CollectorServiceServer) { + s.RegisterService(&_CollectorService_serviceDesc, srv) +} + +func _CollectorService_Report_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReportRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CollectorServiceServer).Report(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lightstep.collector.CollectorService/Report", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CollectorServiceServer).Report(ctx, req.(*ReportRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _CollectorService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "lightstep.collector.CollectorService", + HandlerType: (*CollectorServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Report", + Handler: _CollectorService_Report_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "github.com/lightstep/lightstep-tracer-common/tmpgen/collector.proto", +} + +func (m *SpanContext) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SpanContext) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.TraceId != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.TraceId)) + } + if m.SpanId != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.SpanId)) + } + if len(m.Baggage) > 0 { + for k, _ := range m.Baggage { + dAtA[i] = 0x1a + i++ + v := m.Baggage[k] + mapSize := 1 + len(k) + sovCollector(uint64(len(k))) + 1 + len(v) + sovCollector(uint64(len(v))) + i = encodeVarintCollector(dAtA, i, uint64(mapSize)) + dAtA[i] = 0xa + i++ + i = encodeVarintCollector(dAtA, i, uint64(len(k))) + i += copy(dAtA[i:], k) + dAtA[i] = 0x12 + i++ + i = encodeVarintCollector(dAtA, i, uint64(len(v))) + i += copy(dAtA[i:], v) + } + } + return i, nil +} + +func (m *KeyValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KeyValue) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintCollector(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if m.Value != nil { + nn1, err := m.Value.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += nn1 + } + return i, nil +} + +func (m *KeyValue_StringValue) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x12 + i++ + i = encodeVarintCollector(dAtA, i, uint64(len(m.StringValue))) + i += copy(dAtA[i:], m.StringValue) + return i, nil +} +func (m *KeyValue_IntValue) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x18 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.IntValue)) + return i, nil +} +func (m *KeyValue_DoubleValue) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x21 + i++ + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.DoubleValue)))) + i += 8 + return i, nil +} +func (m *KeyValue_BoolValue) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x28 + i++ + if m.BoolValue { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + return i, nil +} +func (m *KeyValue_JsonValue) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x32 + i++ + i = encodeVarintCollector(dAtA, i, uint64(len(m.JsonValue))) + i += copy(dAtA[i:], m.JsonValue) + return i, nil +} +func (m *Log) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Log) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Timestamp != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.Timestamp.Size())) + n2, err := m.Timestamp.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + if len(m.Fields) > 0 { + for _, msg := range m.Fields { + dAtA[i] = 0x12 + i++ + i = encodeVarintCollector(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Reference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Reference) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Relationship != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.Relationship)) + } + if m.SpanContext != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.SpanContext.Size())) + n3, err := m.SpanContext.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + return i, nil +} + +func (m *Span) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Span) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.SpanContext != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.SpanContext.Size())) + n4, err := m.SpanContext.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + if len(m.OperationName) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintCollector(dAtA, i, uint64(len(m.OperationName))) + i += copy(dAtA[i:], m.OperationName) + } + if len(m.References) > 0 { + for _, msg := range m.References { + dAtA[i] = 0x1a + i++ + i = encodeVarintCollector(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.StartTimestamp != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.StartTimestamp.Size())) + n5, err := m.StartTimestamp.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + if m.DurationMicros != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.DurationMicros)) + } + if len(m.Tags) > 0 { + for _, msg := range m.Tags { + dAtA[i] = 0x32 + i++ + i = encodeVarintCollector(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Logs) > 0 { + for _, msg := range m.Logs { + dAtA[i] = 0x3a + i++ + i = encodeVarintCollector(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Reporter) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Reporter) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ReporterId != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.ReporterId)) + } + if len(m.Tags) > 0 { + for _, msg := range m.Tags { + dAtA[i] = 0x22 + i++ + i = encodeVarintCollector(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *MetricsSample) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MetricsSample) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintCollector(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if m.Value != nil { + nn6, err := m.Value.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += nn6 + } + return i, nil +} + +func (m *MetricsSample_IntValue) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x10 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.IntValue)) + return i, nil +} +func (m *MetricsSample_DoubleValue) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x19 + i++ + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.DoubleValue)))) + i += 8 + return i, nil +} +func (m *InternalMetrics) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InternalMetrics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.StartTimestamp != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.StartTimestamp.Size())) + n7, err := m.StartTimestamp.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + if m.DurationMicros != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.DurationMicros)) + } + if len(m.Logs) > 0 { + for _, msg := range m.Logs { + dAtA[i] = 0x1a + i++ + i = encodeVarintCollector(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Counts) > 0 { + for _, msg := range m.Counts { + dAtA[i] = 0x22 + i++ + i = encodeVarintCollector(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Gauges) > 0 { + for _, msg := range m.Gauges { + dAtA[i] = 0x2a + i++ + i = encodeVarintCollector(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Auth) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Auth) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.AccessToken) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintCollector(dAtA, i, uint64(len(m.AccessToken))) + i += copy(dAtA[i:], m.AccessToken) + } + return i, nil +} + +func (m *ReportRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ReportRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Reporter != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.Reporter.Size())) + n8, err := m.Reporter.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + } + if m.Auth != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.Auth.Size())) + n9, err := m.Auth.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 + } + if len(m.Spans) > 0 { + for _, msg := range m.Spans { + dAtA[i] = 0x1a + i++ + i = encodeVarintCollector(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.TimestampOffsetMicros != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.TimestampOffsetMicros)) + } + if m.InternalMetrics != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.InternalMetrics.Size())) + n10, err := m.InternalMetrics.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 + } + return i, nil +} + +func (m *Command) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Command) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Disable { + dAtA[i] = 0x8 + i++ + if m.Disable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.DevMode { + dAtA[i] = 0x10 + i++ + if m.DevMode { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *ReportResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ReportResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Commands) > 0 { + for _, msg := range m.Commands { + dAtA[i] = 0xa + i++ + i = encodeVarintCollector(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.ReceiveTimestamp != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.ReceiveTimestamp.Size())) + n11, err := m.ReceiveTimestamp.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 + } + if m.TransmitTimestamp != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintCollector(dAtA, i, uint64(m.TransmitTimestamp.Size())) + n12, err := m.TransmitTimestamp.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + } + if len(m.Errors) > 0 { + for _, s := range m.Errors { + dAtA[i] = 0x22 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.Warnings) > 0 { + for _, s := range m.Warnings { + dAtA[i] = 0x2a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.Infos) > 0 { + for _, s := range m.Infos { + dAtA[i] = 0x32 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func encodeVarintCollector(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *SpanContext) Size() (n int) { + var l int + _ = l + if m.TraceId != 0 { + n += 1 + sovCollector(uint64(m.TraceId)) + } + if m.SpanId != 0 { + n += 1 + sovCollector(uint64(m.SpanId)) + } + if len(m.Baggage) > 0 { + for k, v := range m.Baggage { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovCollector(uint64(len(k))) + 1 + len(v) + sovCollector(uint64(len(v))) + n += mapEntrySize + 1 + sovCollector(uint64(mapEntrySize)) + } + } + return n +} + +func (m *KeyValue) Size() (n int) { + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovCollector(uint64(l)) + } + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *KeyValue_StringValue) Size() (n int) { + var l int + _ = l + l = len(m.StringValue) + n += 1 + l + sovCollector(uint64(l)) + return n +} +func (m *KeyValue_IntValue) Size() (n int) { + var l int + _ = l + n += 1 + sovCollector(uint64(m.IntValue)) + return n +} +func (m *KeyValue_DoubleValue) Size() (n int) { + var l int + _ = l + n += 9 + return n +} +func (m *KeyValue_BoolValue) Size() (n int) { + var l int + _ = l + n += 2 + return n +} +func (m *KeyValue_JsonValue) Size() (n int) { + var l int + _ = l + l = len(m.JsonValue) + n += 1 + l + sovCollector(uint64(l)) + return n +} +func (m *Log) Size() (n int) { + var l int + _ = l + if m.Timestamp != nil { + l = m.Timestamp.Size() + n += 1 + l + sovCollector(uint64(l)) + } + if len(m.Fields) > 0 { + for _, e := range m.Fields { + l = e.Size() + n += 1 + l + sovCollector(uint64(l)) + } + } + return n +} + +func (m *Reference) Size() (n int) { + var l int + _ = l + if m.Relationship != 0 { + n += 1 + sovCollector(uint64(m.Relationship)) + } + if m.SpanContext != nil { + l = m.SpanContext.Size() + n += 1 + l + sovCollector(uint64(l)) + } + return n +} + +func (m *Span) Size() (n int) { + var l int + _ = l + if m.SpanContext != nil { + l = m.SpanContext.Size() + n += 1 + l + sovCollector(uint64(l)) + } + l = len(m.OperationName) + if l > 0 { + n += 1 + l + sovCollector(uint64(l)) + } + if len(m.References) > 0 { + for _, e := range m.References { + l = e.Size() + n += 1 + l + sovCollector(uint64(l)) + } + } + if m.StartTimestamp != nil { + l = m.StartTimestamp.Size() + n += 1 + l + sovCollector(uint64(l)) + } + if m.DurationMicros != 0 { + n += 1 + sovCollector(uint64(m.DurationMicros)) + } + if len(m.Tags) > 0 { + for _, e := range m.Tags { + l = e.Size() + n += 1 + l + sovCollector(uint64(l)) + } + } + if len(m.Logs) > 0 { + for _, e := range m.Logs { + l = e.Size() + n += 1 + l + sovCollector(uint64(l)) + } + } + return n +} + +func (m *Reporter) Size() (n int) { + var l int + _ = l + if m.ReporterId != 0 { + n += 1 + sovCollector(uint64(m.ReporterId)) + } + if len(m.Tags) > 0 { + for _, e := range m.Tags { + l = e.Size() + n += 1 + l + sovCollector(uint64(l)) + } + } + return n +} + +func (m *MetricsSample) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovCollector(uint64(l)) + } + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *MetricsSample_IntValue) Size() (n int) { + var l int + _ = l + n += 1 + sovCollector(uint64(m.IntValue)) + return n +} +func (m *MetricsSample_DoubleValue) Size() (n int) { + var l int + _ = l + n += 9 + return n +} +func (m *InternalMetrics) Size() (n int) { + var l int + _ = l + if m.StartTimestamp != nil { + l = m.StartTimestamp.Size() + n += 1 + l + sovCollector(uint64(l)) + } + if m.DurationMicros != 0 { + n += 1 + sovCollector(uint64(m.DurationMicros)) + } + if len(m.Logs) > 0 { + for _, e := range m.Logs { + l = e.Size() + n += 1 + l + sovCollector(uint64(l)) + } + } + if len(m.Counts) > 0 { + for _, e := range m.Counts { + l = e.Size() + n += 1 + l + sovCollector(uint64(l)) + } + } + if len(m.Gauges) > 0 { + for _, e := range m.Gauges { + l = e.Size() + n += 1 + l + sovCollector(uint64(l)) + } + } + return n +} + +func (m *Auth) Size() (n int) { + var l int + _ = l + l = len(m.AccessToken) + if l > 0 { + n += 1 + l + sovCollector(uint64(l)) + } + return n +} + +func (m *ReportRequest) Size() (n int) { + var l int + _ = l + if m.Reporter != nil { + l = m.Reporter.Size() + n += 1 + l + sovCollector(uint64(l)) + } + if m.Auth != nil { + l = m.Auth.Size() + n += 1 + l + sovCollector(uint64(l)) + } + if len(m.Spans) > 0 { + for _, e := range m.Spans { + l = e.Size() + n += 1 + l + sovCollector(uint64(l)) + } + } + if m.TimestampOffsetMicros != 0 { + n += 1 + sovCollector(uint64(m.TimestampOffsetMicros)) + } + if m.InternalMetrics != nil { + l = m.InternalMetrics.Size() + n += 1 + l + sovCollector(uint64(l)) + } + return n +} + +func (m *Command) Size() (n int) { + var l int + _ = l + if m.Disable { + n += 2 + } + if m.DevMode { + n += 2 + } + return n +} + +func (m *ReportResponse) Size() (n int) { + var l int + _ = l + if len(m.Commands) > 0 { + for _, e := range m.Commands { + l = e.Size() + n += 1 + l + sovCollector(uint64(l)) + } + } + if m.ReceiveTimestamp != nil { + l = m.ReceiveTimestamp.Size() + n += 1 + l + sovCollector(uint64(l)) + } + if m.TransmitTimestamp != nil { + l = m.TransmitTimestamp.Size() + n += 1 + l + sovCollector(uint64(l)) + } + if len(m.Errors) > 0 { + for _, s := range m.Errors { + l = len(s) + n += 1 + l + sovCollector(uint64(l)) + } + } + if len(m.Warnings) > 0 { + for _, s := range m.Warnings { + l = len(s) + n += 1 + l + sovCollector(uint64(l)) + } + } + if len(m.Infos) > 0 { + for _, s := range m.Infos { + l = len(s) + n += 1 + l + sovCollector(uint64(l)) + } + } + return n +} + +func sovCollector(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozCollector(x uint64) (n int) { + return sovCollector(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *SpanContext) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SpanContext: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SpanContext: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TraceId", wireType) + } + m.TraceId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TraceId |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SpanId", wireType) + } + m.SpanId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SpanId |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Baggage", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Baggage == nil { + m.Baggage = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthCollector + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthCollector + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Baggage[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KeyValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KeyValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KeyValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StringValue", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = &KeyValue_StringValue{string(dAtA[iNdEx:postIndex])} + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IntValue", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Value = &KeyValue_IntValue{v} + case 4: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field DoubleValue", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Value = &KeyValue_DoubleValue{float64(math.Float64frombits(v))} + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BoolValue", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Value = &KeyValue_BoolValue{b} + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JsonValue", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = &KeyValue_JsonValue{string(dAtA[iNdEx:postIndex])} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Log) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Log: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Log: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Timestamp == nil { + m.Timestamp = &google_protobuf.Timestamp{} + } + if err := m.Timestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fields", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Fields = append(m.Fields, &KeyValue{}) + if err := m.Fields[len(m.Fields)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Reference) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Reference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Reference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Relationship", wireType) + } + m.Relationship = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Relationship |= (Reference_Relationship(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpanContext", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SpanContext == nil { + m.SpanContext = &SpanContext{} + } + if err := m.SpanContext.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Span) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Span: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Span: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpanContext", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SpanContext == nil { + m.SpanContext = &SpanContext{} + } + if err := m.SpanContext.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OperationName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OperationName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field References", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.References = append(m.References, &Reference{}) + if err := m.References[len(m.References)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTimestamp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.StartTimestamp == nil { + m.StartTimestamp = &google_protobuf.Timestamp{} + } + if err := m.StartTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DurationMicros", wireType) + } + m.DurationMicros = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DurationMicros |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tags", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tags = append(m.Tags, &KeyValue{}) + if err := m.Tags[len(m.Tags)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Logs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Logs = append(m.Logs, &Log{}) + if err := m.Logs[len(m.Logs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Reporter) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Reporter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Reporter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReporterId", wireType) + } + m.ReporterId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ReporterId |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tags", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tags = append(m.Tags, &KeyValue{}) + if err := m.Tags[len(m.Tags)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MetricsSample) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MetricsSample: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MetricsSample: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IntValue", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Value = &MetricsSample_IntValue{v} + case 3: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field DoubleValue", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Value = &MetricsSample_DoubleValue{float64(math.Float64frombits(v))} + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *InternalMetrics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InternalMetrics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InternalMetrics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTimestamp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.StartTimestamp == nil { + m.StartTimestamp = &google_protobuf.Timestamp{} + } + if err := m.StartTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DurationMicros", wireType) + } + m.DurationMicros = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DurationMicros |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Logs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Logs = append(m.Logs, &Log{}) + if err := m.Logs[len(m.Logs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Counts", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Counts = append(m.Counts, &MetricsSample{}) + if err := m.Counts[len(m.Counts)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Gauges", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Gauges = append(m.Gauges, &MetricsSample{}) + if err := m.Gauges[len(m.Gauges)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Auth) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Auth: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Auth: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessToken", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccessToken = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ReportRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReportRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReportRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reporter", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Reporter == nil { + m.Reporter = &Reporter{} + } + if err := m.Reporter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Auth", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Auth == nil { + m.Auth = &Auth{} + } + if err := m.Auth.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spans", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Spans = append(m.Spans, &Span{}) + if err := m.Spans[len(m.Spans)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TimestampOffsetMicros", wireType) + } + m.TimestampOffsetMicros = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TimestampOffsetMicros |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InternalMetrics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.InternalMetrics == nil { + m.InternalMetrics = &InternalMetrics{} + } + if err := m.InternalMetrics.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Command) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Command: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Command: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Disable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Disable = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DevMode", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DevMode = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ReportResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReportResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReportResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Commands", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Commands = append(m.Commands, &Command{}) + if err := m.Commands[len(m.Commands)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReceiveTimestamp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ReceiveTimestamp == nil { + m.ReceiveTimestamp = &google_protobuf.Timestamp{} + } + if err := m.ReceiveTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TransmitTimestamp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TransmitTimestamp == nil { + m.TransmitTimestamp = &google_protobuf.Timestamp{} + } + if err := m.TransmitTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Errors", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Errors = append(m.Errors, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Warnings", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Warnings = append(m.Warnings, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Infos", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCollector + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCollector + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Infos = append(m.Infos, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCollector(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCollector + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipCollector(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCollector + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCollector + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCollector + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthCollector + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCollector + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipCollector(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthCollector = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowCollector = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/lightstep/lightstep-tracer-common/tmpgen/collector.proto", fileDescriptorCollector) +} + +var fileDescriptorCollector = []byte{ + // 1137 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xdd, 0x6e, 0xe3, 0x44, + 0x14, 0xae, 0x9d, 0x6c, 0x7e, 0x4e, 0xb2, 0x6d, 0x76, 0xf8, 0x4b, 0xc3, 0xb6, 0x9b, 0x75, 0x41, + 0x14, 0x96, 0x3a, 0x10, 0x84, 0x54, 0x7a, 0xb1, 0xd2, 0x36, 0xd0, 0x6d, 0x44, 0x4a, 0x56, 0xd3, + 0x15, 0x48, 0x7b, 0x13, 0x39, 0xf6, 0xc4, 0x35, 0x6b, 0xcf, 0x98, 0x99, 0x49, 0xa0, 0x77, 0x08, + 0x89, 0x7b, 0x24, 0xc4, 0x0b, 0x70, 0x05, 0x4f, 0xc0, 0x2b, 0x70, 0x85, 0x40, 0xf0, 0x00, 0xa8, + 0xf0, 0x20, 0xc8, 0x33, 0xb6, 0x93, 0x2e, 0xe9, 0x8f, 0x10, 0x77, 0x9e, 0x33, 0xdf, 0x37, 0xe7, + 0xcc, 0xf9, 0xbe, 0x33, 0x09, 0xf4, 0xfc, 0x40, 0x9e, 0x4c, 0xc7, 0xb6, 0xcb, 0xa2, 0x4e, 0x18, + 0xf8, 0x27, 0x52, 0x48, 0x12, 0xcf, 0xbf, 0x76, 0x24, 0x77, 0x5c, 0xc2, 0x77, 0x5c, 0x16, 0x45, + 0x8c, 0x76, 0x64, 0x14, 0xfb, 0x84, 0x76, 0x5c, 0x16, 0x86, 0xc4, 0x95, 0x8c, 0xdb, 0x31, 0x67, + 0x92, 0xa1, 0xe7, 0x72, 0xbc, 0x9d, 0x6f, 0xb5, 0xee, 0xf8, 0x8c, 0xf9, 0x21, 0xe9, 0x28, 0xc8, + 0x78, 0x3a, 0xe9, 0xc8, 0x20, 0x22, 0x42, 0x3a, 0x51, 0xac, 0x59, 0xad, 0xdb, 0x29, 0xc0, 0x89, + 0x83, 0x8e, 0x43, 0x29, 0x93, 0x8e, 0x0c, 0x18, 0x15, 0x7a, 0xd7, 0xfa, 0xc5, 0x80, 0xda, 0x71, + 0xec, 0xd0, 0x1e, 0xa3, 0x92, 0x7c, 0x21, 0xd1, 0x06, 0x54, 0x54, 0x2d, 0xa3, 0xc0, 0x6b, 0x1a, + 0x6d, 0x63, 0xbb, 0xb8, 0x6f, 0xbe, 0x65, 0xe0, 0xb2, 0x8a, 0xf5, 0x3d, 0xf4, 0x32, 0x94, 0x45, + 0xec, 0xd0, 0x64, 0xd7, 0xcc, 0x77, 0x4b, 0x49, 0xa8, 0xef, 0xa1, 0x87, 0x50, 0x1e, 0x3b, 0xbe, + 0xef, 0xf8, 0xa4, 0x59, 0x68, 0x17, 0xb6, 0x6b, 0xdd, 0x1d, 0x7b, 0x49, 0xc5, 0xf6, 0x42, 0x3a, + 0x7b, 0x5f, 0xe3, 0x3f, 0xa0, 0x92, 0x9f, 0xe2, 0x8c, 0xdd, 0xda, 0x83, 0xfa, 0xe2, 0x06, 0x6a, + 0x40, 0xe1, 0x29, 0x39, 0x55, 0xf5, 0x54, 0x71, 0xf2, 0x89, 0x9e, 0x87, 0x1b, 0x33, 0x27, 0x9c, + 0x12, 0x55, 0x45, 0x15, 0xeb, 0xc5, 0x9e, 0xb9, 0x6b, 0x58, 0x7f, 0x18, 0x50, 0xf9, 0x90, 0x9c, + 0x7e, 0x9c, 0x04, 0x96, 0x10, 0xb7, 0xa0, 0x2e, 0x24, 0x0f, 0xa8, 0x3f, 0x5a, 0xe0, 0x1f, 0xae, + 0xe0, 0x9a, 0x8e, 0x6a, 0xda, 0x5d, 0xa8, 0x06, 0x54, 0xa6, 0x88, 0x42, 0xdb, 0xd8, 0x2e, 0x24, + 0xf7, 0x3c, 0x5c, 0xc1, 0x95, 0x80, 0x4a, 0x0d, 0xd9, 0x82, 0xba, 0xc7, 0xa6, 0xe3, 0x90, 0xa4, + 0xa8, 0x62, 0xdb, 0xd8, 0x4e, 0x10, 0x35, 0x1d, 0xd5, 0xa0, 0x3b, 0x00, 0x63, 0xc6, 0xc2, 0x14, + 0x72, 0xa3, 0x6d, 0x6c, 0x57, 0x0e, 0x57, 0x70, 0x35, 0x89, 0xe5, 0x80, 0x4f, 0x05, 0xa3, 0x29, + 0xa0, 0x94, 0xd6, 0x52, 0x4d, 0x62, 0x0a, 0xb0, 0x5f, 0x4e, 0xef, 0x69, 0xcd, 0xa0, 0x30, 0x60, + 0x3e, 0xda, 0x85, 0x6a, 0xae, 0xaf, 0xba, 0x56, 0xad, 0xdb, 0xb2, 0xb5, 0xc0, 0x76, 0xe6, 0x00, + 0xfb, 0x71, 0x86, 0xc0, 0x73, 0x30, 0x7a, 0x17, 0x4a, 0x93, 0x80, 0x84, 0x9e, 0x68, 0x9a, 0x4a, + 0x9b, 0x8d, 0xa5, 0xda, 0x64, 0x9d, 0xc3, 0x29, 0xd8, 0xfa, 0xcd, 0x80, 0x2a, 0x26, 0x13, 0xc2, + 0x09, 0x75, 0x09, 0x1a, 0x42, 0x9d, 0x93, 0x50, 0x1b, 0xe8, 0x24, 0xd0, 0x15, 0xac, 0x76, 0xef, + 0x2d, 0x3d, 0x2a, 0x67, 0xd9, 0x78, 0x81, 0x82, 0xcf, 0x1d, 0x80, 0x7a, 0x50, 0x57, 0x7e, 0x72, + 0xb5, 0x1f, 0x94, 0x1c, 0xb5, 0x6e, 0xfb, 0x2a, 0xdf, 0xe0, 0x9a, 0x98, 0x2f, 0x2c, 0x1b, 0xea, + 0x8b, 0x29, 0x50, 0x1d, 0x2a, 0xbd, 0xc3, 0xfe, 0xe0, 0xfd, 0xd1, 0xf0, 0xa0, 0xb1, 0x82, 0x1a, + 0x50, 0x3f, 0x18, 0x0e, 0x06, 0xc3, 0x4f, 0x8e, 0x47, 0x07, 0x78, 0x78, 0xd4, 0x30, 0xac, 0xaf, + 0x0b, 0x50, 0x4c, 0x0e, 0xfb, 0x57, 0x76, 0xe3, 0x3f, 0x64, 0x47, 0xaf, 0xc2, 0x2a, 0x8b, 0x09, + 0x57, 0xe9, 0x47, 0xd4, 0x89, 0x32, 0x4f, 0xde, 0xcc, 0xa3, 0x1f, 0x39, 0x11, 0x41, 0xf7, 0x01, + 0x78, 0xd6, 0x11, 0x91, 0xce, 0xc7, 0xe6, 0xe5, 0x8d, 0xc3, 0x0b, 0x0c, 0xd4, 0x83, 0x35, 0x21, + 0x1d, 0x2e, 0x47, 0x73, 0xfd, 0x8b, 0x57, 0xea, 0xbf, 0xaa, 0x28, 0xf9, 0x1a, 0xdd, 0x83, 0x35, + 0x6f, 0x9a, 0x96, 0x1a, 0x05, 0x2e, 0x67, 0x42, 0xb9, 0x52, 0x8f, 0xf1, 0x6a, 0xb6, 0x75, 0xa4, + 0x76, 0xd0, 0xdb, 0x50, 0x94, 0x8e, 0x2f, 0x9a, 0xa5, 0xeb, 0xf8, 0x45, 0x41, 0xd1, 0x9b, 0x50, + 0x0c, 0x99, 0x2f, 0x9a, 0x65, 0x45, 0x69, 0x2e, 0xa5, 0x0c, 0x98, 0x8f, 0x15, 0xca, 0x1a, 0x43, + 0x05, 0x93, 0x98, 0x71, 0x49, 0x38, 0xda, 0x82, 0x1a, 0x4f, 0xbf, 0xcf, 0x3f, 0x3d, 0x90, 0x85, + 0xfb, 0x5e, 0x5e, 0x51, 0xf1, 0xda, 0x15, 0x59, 0x12, 0x6e, 0x1e, 0x11, 0xc9, 0x03, 0x57, 0x1c, + 0x3b, 0x51, 0x1c, 0x12, 0x84, 0xa0, 0xa8, 0x44, 0xd2, 0x6f, 0x82, 0xfa, 0x3e, 0x3f, 0xef, 0xe6, + 0xb5, 0xe6, 0xbd, 0xb0, 0x64, 0xde, 0xe7, 0xd3, 0xfa, 0xa3, 0x09, 0x6b, 0x7d, 0x2a, 0x09, 0xa7, + 0x4e, 0x98, 0xa6, 0x5f, 0x26, 0xa0, 0xf1, 0x7f, 0x08, 0x68, 0x5e, 0x28, 0x60, 0xa6, 0x46, 0xe1, + 0x3a, 0x6a, 0xa0, 0x3d, 0x28, 0xb9, 0x6c, 0x4a, 0x65, 0xd6, 0x5e, 0x6b, 0x29, 0xfe, 0x5c, 0x33, + 0x71, 0xca, 0x48, 0xb8, 0xbe, 0x33, 0xf5, 0x49, 0x62, 0xa7, 0x6b, 0x73, 0x35, 0xc3, 0x7a, 0x1d, + 0x8a, 0x0f, 0xa6, 0xf2, 0x04, 0xdd, 0x85, 0xba, 0xe3, 0xba, 0x44, 0x88, 0x91, 0x64, 0x4f, 0x09, + 0x4d, 0x05, 0xaa, 0xe9, 0xd8, 0xe3, 0x24, 0x64, 0xfd, 0x64, 0xc2, 0x4d, 0xed, 0x18, 0x4c, 0x3e, + 0x9b, 0x12, 0x21, 0xd1, 0x7b, 0x50, 0xc9, 0xfc, 0x91, 0x76, 0x73, 0xe3, 0x82, 0x99, 0xd2, 0x20, + 0x9c, 0xc3, 0xd1, 0x0e, 0x14, 0x9d, 0xa9, 0x3c, 0x49, 0x9f, 0x9c, 0xf5, 0xa5, 0xb4, 0xa4, 0x30, + 0xac, 0x60, 0xa8, 0x03, 0x37, 0x92, 0xa9, 0xcf, 0xba, 0xb9, 0x7e, 0xe1, 0x23, 0x81, 0x35, 0x0e, + 0xed, 0xc1, 0x4b, 0xb9, 0xd2, 0x23, 0x36, 0x99, 0x08, 0x22, 0x17, 0x67, 0x4e, 0x59, 0x0c, 0xbf, + 0x90, 0x43, 0x86, 0x0a, 0x91, 0x2a, 0x37, 0x84, 0x46, 0x90, 0xda, 0x67, 0x14, 0xe9, 0xae, 0xa9, + 0x5f, 0x87, 0x5a, 0xf7, 0x95, 0xa5, 0x79, 0x9f, 0xf1, 0x1a, 0x5e, 0x0b, 0xce, 0x07, 0xac, 0xfb, + 0x50, 0xee, 0xb1, 0x28, 0x72, 0xa8, 0x87, 0x9a, 0x50, 0xf6, 0x02, 0xe1, 0x8c, 0x43, 0x3d, 0x03, + 0x15, 0x9c, 0x2d, 0xd1, 0x3a, 0x54, 0x3c, 0x32, 0x1b, 0x45, 0xcc, 0xd3, 0x53, 0x90, 0x6c, 0x91, + 0xd9, 0x11, 0xf3, 0x88, 0xf5, 0x83, 0x09, 0xab, 0x59, 0xe7, 0x45, 0xcc, 0xa8, 0x20, 0x68, 0x17, + 0x2a, 0xae, 0x3e, 0x52, 0x34, 0x0d, 0xd5, 0x93, 0xdb, 0x4b, 0x6b, 0x4b, 0xf3, 0xe2, 0x1c, 0x8d, + 0x1e, 0xc2, 0x2d, 0x4e, 0x5c, 0x12, 0xcc, 0xc8, 0xc2, 0x2c, 0x98, 0x57, 0xce, 0x42, 0x23, 0x25, + 0xcd, 0xa7, 0xa1, 0x0f, 0x48, 0x72, 0x87, 0x8a, 0x28, 0x58, 0x9c, 0xaa, 0xc2, 0x95, 0x27, 0xdd, + 0xca, 0x58, 0xf3, 0xa3, 0x5e, 0x84, 0x12, 0xe1, 0x9c, 0x71, 0xed, 0xfe, 0x2a, 0x4e, 0x57, 0xa8, + 0x05, 0x95, 0xcf, 0x1d, 0x4e, 0x03, 0xea, 0x6b, 0x6f, 0x57, 0x71, 0xbe, 0x4e, 0xfe, 0x84, 0x04, + 0x74, 0xc2, 0xf4, 0x0b, 0x59, 0xc5, 0x7a, 0xd1, 0xfd, 0xce, 0x80, 0x46, 0x2f, 0xbb, 0xfd, 0x31, + 0xe1, 0xb3, 0xc0, 0x25, 0xe8, 0x4b, 0x03, 0x4a, 0xba, 0x7f, 0xc8, 0xba, 0xc4, 0xa0, 0xa9, 0xad, + 0x5b, 0x5b, 0x97, 0x62, 0xb4, 0x00, 0xd6, 0xce, 0x57, 0xbf, 0xff, 0xfd, 0xad, 0xf9, 0x9a, 0xb5, + 0xa6, 0xfe, 0xda, 0xcd, 0xba, 0x1d, 0x6d, 0x6d, 0xb1, 0x67, 0xbc, 0xf1, 0xe4, 0x16, 0x7a, 0x36, + 0xba, 0xff, 0xe0, 0xe7, 0xb3, 0x4d, 0xe3, 0xd7, 0xb3, 0x4d, 0xe3, 0xcf, 0xb3, 0x4d, 0xe3, 0x9b, + 0xbf, 0x36, 0x57, 0x60, 0xdd, 0x65, 0xd1, 0x42, 0x22, 0xfd, 0x1f, 0xd4, 0xf6, 0x79, 0xec, 0x3e, + 0x32, 0x9e, 0xd4, 0xf2, 0xbc, 0xf1, 0xf8, 0x7b, 0xb3, 0x38, 0x38, 0x7e, 0xb4, 0x3f, 0x2e, 0xa9, + 0x5e, 0xbe, 0xf3, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe3, 0xdd, 0x4c, 0x6a, 0xce, 0x0a, 0x00, + 0x00, +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb/collector.proto b/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb/collector.proto new file mode 100644 index 00000000..2f360784 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb/collector.proto @@ -0,0 +1,117 @@ +// DO NOT EDIT; THIS FILE IS AUTOGENERATED FROM ../../../collector.proto +syntax = "proto3"; + +package lightstep.collector; + +option go_package = "collectorpb"; +option objc_class_prefix = "LSPB"; +option java_multiple_files = true; +option java_package = "com.lightstep.tracer.grpc"; + +import "google/protobuf/timestamp.proto"; +import "google/api/annotations.proto"; + +message SpanContext { + uint64 trace_id = 1 [jstype=JS_STRING]; + uint64 span_id = 2 [jstype=JS_STRING]; + map baggage = 3; +} + +// Represent both tags and log fields. +message KeyValue { + string key = 1; + oneof value { + // Holds arbitrary string data; well-formed JSON strings should go in + // json_value. + string string_value = 2; + int64 int_value = 3 [jstype=JS_STRING]; + double double_value = 4; + bool bool_value = 5; + // Must be a well-formed JSON value. Truncated JSON should go in + // string_value. Should not be used for tags. + string json_value = 6; + } +} + +message Log { + google.protobuf.Timestamp timestamp = 1; + repeated KeyValue fields = 2; +} + +message Reference { + enum Relationship { + CHILD_OF = 0; + FOLLOWS_FROM = 1; + } + Relationship relationship = 1; + SpanContext span_context = 2; +} + +message Span { + SpanContext span_context = 1; + string operation_name = 2; + repeated Reference references = 3; + google.protobuf.Timestamp start_timestamp = 4; + uint64 duration_micros = 5 [jstype=JS_STRING]; + repeated KeyValue tags = 6; + repeated Log logs = 7; +} + +message Reporter { + uint64 reporter_id = 1 [jstype=JS_STRING]; + repeated KeyValue tags = 4; +} + +message MetricsSample { + string name = 1; + oneof value { + int64 int_value = 2 [jstype=JS_STRING]; + double double_value = 3; + } +} + +message InternalMetrics { + google.protobuf.Timestamp start_timestamp = 1; + uint64 duration_micros = 2 [jstype=JS_STRING]; + repeated Log logs = 3; + repeated MetricsSample counts = 4; + repeated MetricsSample gauges = 5; +} + +message Auth { + string access_token = 1; +} + +message ReportRequest { + Reporter reporter = 1; + Auth auth = 2; + repeated Span spans = 3; + int64 timestamp_offset_micros = 5 [jstype=JS_STRING]; + InternalMetrics internal_metrics = 6; +} + +message Command { + bool disable = 1; + bool dev_mode = 2; +} + +message ReportResponse { + repeated Command commands = 1; + google.protobuf.Timestamp receive_timestamp = 2; + google.protobuf.Timestamp transmit_timestamp = 3; + repeated string errors = 4; + repeated string warnings = 5; + repeated string infos = 6; +} + +service CollectorService { + rpc Report(ReportRequest) returns (ReportResponse) { + option (google.api.http) = { + post: "/api/v2/reports" + body: "*" + additional_bindings { + get: "/api/v2/reports" + } + }; + } +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb/lightstep.pb.go b/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb/lightstep.pb.go new file mode 100644 index 00000000..443f1499 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb/lightstep.pb.go @@ -0,0 +1,714 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/lightstep/lightstep-tracer-common/tmpgen/lightstep.proto + +/* + Package lightsteppb is a generated protocol buffer package. + + It is generated from these files: + github.com/lightstep/lightstep-tracer-common/tmpgen/lightstep.proto + + It has these top-level messages: + BinaryCarrier + BasicTracerCarrier +*/ +package lightsteppb // import "github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb" + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import encoding_binary "encoding/binary" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +// The standard carrier for binary context propagation into LightStep. +type BinaryCarrier struct { + // "text_ctx" was deprecated following lightstep-tracer-cpp-0.36 + DeprecatedTextCtx [][]byte `protobuf:"bytes,1,rep,name=deprecated_text_ctx,json=deprecatedTextCtx" json:"deprecated_text_ctx,omitempty"` + // The Opentracing "basictracer" proto. + BasicCtx *BasicTracerCarrier `protobuf:"bytes,2,opt,name=basic_ctx,json=basicCtx" json:"basic_ctx,omitempty"` +} + +func (m *BinaryCarrier) Reset() { *m = BinaryCarrier{} } +func (m *BinaryCarrier) String() string { return proto.CompactTextString(m) } +func (*BinaryCarrier) ProtoMessage() {} +func (*BinaryCarrier) Descriptor() ([]byte, []int) { return fileDescriptorLightstep, []int{0} } + +func (m *BinaryCarrier) GetDeprecatedTextCtx() [][]byte { + if m != nil { + return m.DeprecatedTextCtx + } + return nil +} + +func (m *BinaryCarrier) GetBasicCtx() *BasicTracerCarrier { + if m != nil { + return m.BasicCtx + } + return nil +} + +// Copy of https://github.com/opentracing/basictracer-go/blob/master/wire/wire.proto +type BasicTracerCarrier struct { + TraceId uint64 `protobuf:"fixed64,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + SpanId uint64 `protobuf:"fixed64,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"` + Sampled bool `protobuf:"varint,3,opt,name=sampled,proto3" json:"sampled,omitempty"` + BaggageItems map[string]string `protobuf:"bytes,4,rep,name=baggage_items,json=baggageItems" json:"baggage_items,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (m *BasicTracerCarrier) Reset() { *m = BasicTracerCarrier{} } +func (m *BasicTracerCarrier) String() string { return proto.CompactTextString(m) } +func (*BasicTracerCarrier) ProtoMessage() {} +func (*BasicTracerCarrier) Descriptor() ([]byte, []int) { return fileDescriptorLightstep, []int{1} } + +func (m *BasicTracerCarrier) GetTraceId() uint64 { + if m != nil { + return m.TraceId + } + return 0 +} + +func (m *BasicTracerCarrier) GetSpanId() uint64 { + if m != nil { + return m.SpanId + } + return 0 +} + +func (m *BasicTracerCarrier) GetSampled() bool { + if m != nil { + return m.Sampled + } + return false +} + +func (m *BasicTracerCarrier) GetBaggageItems() map[string]string { + if m != nil { + return m.BaggageItems + } + return nil +} + +func init() { + proto.RegisterType((*BinaryCarrier)(nil), "lightstep.BinaryCarrier") + proto.RegisterType((*BasicTracerCarrier)(nil), "lightstep.BasicTracerCarrier") +} +func (m *BinaryCarrier) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BinaryCarrier) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.DeprecatedTextCtx) > 0 { + for _, b := range m.DeprecatedTextCtx { + dAtA[i] = 0xa + i++ + i = encodeVarintLightstep(dAtA, i, uint64(len(b))) + i += copy(dAtA[i:], b) + } + } + if m.BasicCtx != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintLightstep(dAtA, i, uint64(m.BasicCtx.Size())) + n1, err := m.BasicCtx.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + return i, nil +} + +func (m *BasicTracerCarrier) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BasicTracerCarrier) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.TraceId != 0 { + dAtA[i] = 0x9 + i++ + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(m.TraceId)) + i += 8 + } + if m.SpanId != 0 { + dAtA[i] = 0x11 + i++ + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(m.SpanId)) + i += 8 + } + if m.Sampled { + dAtA[i] = 0x18 + i++ + if m.Sampled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if len(m.BaggageItems) > 0 { + for k, _ := range m.BaggageItems { + dAtA[i] = 0x22 + i++ + v := m.BaggageItems[k] + mapSize := 1 + len(k) + sovLightstep(uint64(len(k))) + 1 + len(v) + sovLightstep(uint64(len(v))) + i = encodeVarintLightstep(dAtA, i, uint64(mapSize)) + dAtA[i] = 0xa + i++ + i = encodeVarintLightstep(dAtA, i, uint64(len(k))) + i += copy(dAtA[i:], k) + dAtA[i] = 0x12 + i++ + i = encodeVarintLightstep(dAtA, i, uint64(len(v))) + i += copy(dAtA[i:], v) + } + } + return i, nil +} + +func encodeVarintLightstep(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *BinaryCarrier) Size() (n int) { + var l int + _ = l + if len(m.DeprecatedTextCtx) > 0 { + for _, b := range m.DeprecatedTextCtx { + l = len(b) + n += 1 + l + sovLightstep(uint64(l)) + } + } + if m.BasicCtx != nil { + l = m.BasicCtx.Size() + n += 1 + l + sovLightstep(uint64(l)) + } + return n +} + +func (m *BasicTracerCarrier) Size() (n int) { + var l int + _ = l + if m.TraceId != 0 { + n += 9 + } + if m.SpanId != 0 { + n += 9 + } + if m.Sampled { + n += 2 + } + if len(m.BaggageItems) > 0 { + for k, v := range m.BaggageItems { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovLightstep(uint64(len(k))) + 1 + len(v) + sovLightstep(uint64(len(v))) + n += mapEntrySize + 1 + sovLightstep(uint64(mapEntrySize)) + } + } + return n +} + +func sovLightstep(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozLightstep(x uint64) (n int) { + return sovLightstep(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *BinaryCarrier) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLightstep + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BinaryCarrier: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BinaryCarrier: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedTextCtx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLightstep + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthLightstep + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DeprecatedTextCtx = append(m.DeprecatedTextCtx, make([]byte, postIndex-iNdEx)) + copy(m.DeprecatedTextCtx[len(m.DeprecatedTextCtx)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BasicCtx", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLightstep + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthLightstep + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BasicCtx == nil { + m.BasicCtx = &BasicTracerCarrier{} + } + if err := m.BasicCtx.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipLightstep(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthLightstep + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BasicTracerCarrier) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLightstep + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BasicTracerCarrier: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BasicTracerCarrier: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field TraceId", wireType) + } + m.TraceId = 0 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + m.TraceId = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field SpanId", wireType) + } + m.SpanId = 0 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + m.SpanId = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Sampled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLightstep + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Sampled = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BaggageItems", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLightstep + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthLightstep + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BaggageItems == nil { + m.BaggageItems = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLightstep + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLightstep + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthLightstep + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLightstep + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthLightstep + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipLightstep(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthLightstep + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.BaggageItems[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipLightstep(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthLightstep + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipLightstep(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowLightstep + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowLightstep + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowLightstep + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthLightstep + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowLightstep + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipLightstep(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthLightstep = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowLightstep = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/lightstep/lightstep-tracer-common/tmpgen/lightstep.proto", fileDescriptorLightstep) +} + +var fileDescriptorLightstep = []byte{ + // 338 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xc1, 0x4a, 0xc3, 0x40, + 0x10, 0x86, 0xdd, 0x46, 0xdb, 0x66, 0xdb, 0x82, 0x5d, 0x05, 0xa3, 0xd0, 0x10, 0x7a, 0xca, 0xa5, + 0x29, 0xd4, 0x8b, 0xf4, 0x22, 0x24, 0x78, 0xe8, 0x35, 0xf4, 0xe4, 0x25, 0x6c, 0x92, 0x21, 0x0d, + 0x36, 0xc9, 0xb2, 0x99, 0x4a, 0x8a, 0x2f, 0xe1, 0x63, 0x79, 0xf4, 0x11, 0xa4, 0x3e, 0x85, 0x37, + 0xc9, 0x56, 0x1b, 0xa1, 0xe0, 0x6d, 0xfe, 0xf9, 0xff, 0xe1, 0xff, 0x96, 0xa5, 0x5e, 0x92, 0xe2, + 0x6a, 0x13, 0x3a, 0x51, 0x91, 0x4d, 0xd7, 0x69, 0xb2, 0xc2, 0x12, 0x41, 0x34, 0xd3, 0x04, 0x25, + 0x8f, 0x40, 0x4e, 0xa2, 0x22, 0xcb, 0x8a, 0x7c, 0x8a, 0x99, 0x48, 0x20, 0x6f, 0x6c, 0x47, 0xc8, + 0x02, 0x0b, 0xa6, 0x1f, 0x16, 0xe3, 0x17, 0x3a, 0x70, 0xd3, 0x9c, 0xcb, 0xad, 0xc7, 0xa5, 0x4c, + 0x41, 0x32, 0x87, 0x5e, 0xc4, 0x20, 0x24, 0x44, 0x1c, 0x21, 0x0e, 0x10, 0x2a, 0x0c, 0x22, 0xac, + 0x0c, 0x62, 0x69, 0x76, 0xdf, 0x1f, 0x36, 0xd6, 0x12, 0x2a, 0xf4, 0xb0, 0x62, 0x73, 0xaa, 0x87, + 0xbc, 0x4c, 0x23, 0x95, 0x6a, 0x59, 0xc4, 0xee, 0xcd, 0x46, 0x4e, 0x53, 0xe8, 0xd6, 0xde, 0x52, + 0x41, 0xfd, 0x34, 0xf8, 0x5d, 0x95, 0xf7, 0xb0, 0x1a, 0x7f, 0x11, 0xca, 0x8e, 0x03, 0xec, 0x9a, + 0x76, 0xd5, 0x33, 0x82, 0x34, 0x36, 0x88, 0x45, 0xec, 0xb6, 0xdf, 0x51, 0x7a, 0x11, 0xb3, 0x2b, + 0xda, 0x29, 0x05, 0xcf, 0x6b, 0xa7, 0xa5, 0x9c, 0x76, 0x2d, 0x17, 0x31, 0x33, 0x68, 0xa7, 0xe4, + 0x99, 0x58, 0x43, 0x6c, 0x68, 0x16, 0xb1, 0xbb, 0xfe, 0xaf, 0x64, 0x4b, 0x3a, 0x08, 0x79, 0x92, + 0xf0, 0x04, 0x82, 0x14, 0x21, 0x2b, 0x8d, 0x53, 0x4b, 0xb3, 0x7b, 0xb3, 0xe9, 0xbf, 0x90, 0x8e, + 0xbb, 0x3f, 0x59, 0xd4, 0x17, 0x0f, 0x39, 0xca, 0xad, 0xdf, 0x0f, 0xff, 0xac, 0x6e, 0xee, 0xe9, + 0xf0, 0x28, 0xc2, 0xce, 0xa9, 0xf6, 0x04, 0x5b, 0xc5, 0xac, 0xfb, 0xf5, 0xc8, 0x2e, 0xe9, 0xd9, + 0x33, 0x5f, 0x6f, 0x40, 0xd1, 0xea, 0xfe, 0x5e, 0xcc, 0x5b, 0x77, 0xc4, 0x1d, 0xbd, 0xed, 0x4c, + 0xf2, 0xbe, 0x33, 0xc9, 0xc7, 0xce, 0x24, 0xaf, 0x9f, 0xe6, 0xc9, 0x63, 0xef, 0x00, 0x24, 0xc2, + 0xb0, 0xad, 0x7e, 0xea, 0xf6, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x95, 0x72, 0x6a, 0xa9, 0xf0, 0x01, + 0x00, 0x00, +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb/lightstep.proto b/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb/lightstep.proto new file mode 100644 index 00000000..b6ce9c4e --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb/lightstep.proto @@ -0,0 +1,23 @@ +// DO NOT EDIT; THIS FILE IS AUTOGENERATED FROM ../../../lightstep.proto +syntax = "proto3"; + +package lightstep; + +option go_package = "lightsteppb"; + +// The standard carrier for binary context propagation into LightStep. +message BinaryCarrier { + // "text_ctx" was deprecated following lightstep-tracer-cpp-0.36 + repeated bytes deprecated_text_ctx = 1; + + // The Opentracing "basictracer" proto. + BasicTracerCarrier basic_ctx = 2; +} + +// Copy of https://github.com/opentracing/basictracer-go/blob/master/wire/wire.proto +message BasicTracerCarrier { + fixed64 trace_id = 1; + fixed64 span_id = 2; + bool sampled = 3; + map baggage_items = 4; +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/.gitignore b/vendor/github.com/lightstep/lightstep-tracer-go/.gitignore new file mode 100644 index 00000000..0af4a7b2 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/.gitignore @@ -0,0 +1,6 @@ +.DS_Store + +.idea/ +*.iml + +vendor/ diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/.gitmodules b/vendor/github.com/lightstep/lightstep-tracer-go/.gitmodules new file mode 100644 index 00000000..d09734f8 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lightstep-tracer-common"] + path = lightstep-tracer-common + url = https://github.com/lightstep/lightstep-tracer-common.git diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/CHANGELOG.md b/vendor/github.com/lightstep/lightstep-tracer-go/CHANGELOG.md new file mode 100644 index 00000000..733816d3 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/CHANGELOG.md @@ -0,0 +1,78 @@ +# Changelog + +## [Pending Release](https://github.com/lightstep/lightstep-tracer-go/compare/v0.18.1...HEAD) + +## [v0.18.1](https://github.com/lightstep/lightstep-tracer-go/compare/v0.18.0...v0.18.1) +* Adding support for configuring custom propagators + +## [v0.18.0](https://github.com/lightstep/lightstep-tracer-go/compare/v0.17.1...v0.18.0) +* Adding support for B3 headers [#224](https://github.com/lightstep/lightstep-tracer-go/issues/224) +* Fix OpenCensus to LighStep ID conversion +* Added new constructor `CreateTracer` to propagate errors [#226](https://github.com/lightstep/lightstep-tracer-go/issues/226) + +## [v0.17.1](https://github.com/lightstep/lightstep-tracer-go/compare/v0.17.0...v0.17.1) +* Fixes [#219](https://github.com/lightstep/lightstep-tracer-go/issues/219) so that there is no longer a data race when reading and writing from spans + +## [v0.17.0](https://github.com/lightstep/lightstep-tracer-go/compare/v0.16.0...v0.17.0) +* Migrate dependency management from dep to gomod +* Lazy loggers can emit 0 -> N log entries instead of just one. +* Refactor Collector Client to allow for user-defined transports. + +## [v0.16.0](https://github.com/lightstep/lightstep-tracer-go/compare/v0.15.6...v0.16.0) +* Thrift transport is eliminated +* If no transport is specified, UseHTTP is now the default (was UseGRPC) +* Requires go >= 1.7 +* Update to gogo-1.2.1, no longer using Google protobuf +* Imports `context` via the standard library instead of `golang.org/x/net/context` +* Fixes [#182](https://github.com/lightstep/lightstep-tracer-go/issues/182), so that `StartSpan` can now take `SpanReference`s to non-LightStep `SpanContext`s use +* Adds experimental OpenCensus exporter +* Access-Tokens are passed as headers to support improved load balancing +* Support for custom TLS certificates. + +## [v0.15.6](https://github.com/lightstep/lightstep-tracer-go/compare/v0.15.5...v0.15.6) + +* Minor update to `sendspan` to make it easier to pick which transport protocol to use. +* Add a new field to Options: DialOptions. These allow setting custom grpc dial options when using grpc. + * This is necessary to have customer balancers or interceptors. + * DialOptions shouldn't be set unless it is needed, it will default correctly. +* Added a new field to Endpoint: Scheme. Scheme can be used to override the default schemes (http/https) or set a custom scheme (for grpc). + * This is necessary for using custom grpc resolvers. + * If callers are using struct construction without field names (i.e. Endpoint{"host", port, ...}), they will need to add a new field (scheme = ""). + * Scheme shouldn't be set unless it needs to overridden, it will default correctly. + +## [v0.15.5](https://github.com/lightstep/lightstep-tracer-go/compare/v0.15.4...v0.15.5) +* Internal performance optimizations and a bug fix for issue [#161](https://github.com/lightstep/lightstep-tracer-go/issues/161) + +## [v0.15.4](https://github.com/lightstep/lightstep-tracer-go/compare/v0.15.3...v0.15.4) +* This change affects LightStep's internal testing, not a functional change. + +## [v0.15.3](https://github.com/lightstep/lightstep-tracer-go/compare/v0.15.2...v0.15.3) +* Adds compatibility for io.Writer and io.Reader in Inject/Extract, as required by Open Tracing. + +## [v0.15.2](https://github.com/lightstep/lightstep-tracer-go/compare/v0.15.1...v0.15.2) +* Adds lightstep.GetLightStepReporterID. + +## [v0.15.1](https://github.com/lightstep/lightstep-tracer-go/compare/v0.15.0...v0.15.1) +* Adds Gopkg.toml + +## [v0.15.0](https://github.com/lightstep/lightstep-tracer-go/compare/v0.14.0...v0.15.0) +* We are replacing the internal diagnostic logging with a more flexible “Event” framework. This enables you to track and understand tracer problems with metrics and logging tools of your choice. +* We are also changed the types of the Close() and Flush() methods to take a context parameter to support cancellation. These changes are *not* backwards compatible and *you will need to update your instrumentation*. We are providing a NewTracerv0_14() method that is a drop-in replacement for the previous version. + +## [v0.14.0](https://github.com/lightstep/lightstep-tracer-go/compare/v0.13.0...v0.14.0) +* Flush buffer syncronously on Close. +* Flush twice if a flush is already in flight. +* Remove gogo in favor of golang/protobuf. +* Requires grpc-go >= 1.4.0. + +## [v0.13.0](https://github.com/lightstep/lightstep-tracer-go/compare/v0.12.0...v0.13.0) +* BasicTracer has been removed. +* Tracer now takes a SpanRecorder as an option. +* Tracer interface now includes Close and Flush. +* Tests redone with ginkgo/gomega. + +## [v0.12.0](https://github.com/lightstep/lightstep-tracer-go/compare/v0.11.0...v0.12.0) +* Added CloseTracer function to flush and close a lightstep recorder. + +## [v0.11.0](https://github.com/lightstep/lightstep-tracer-go/compare/v0.10.0...v0.11.0) +* Thrift transport is now deprecated, gRPC is the default. diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/Gopkg.lock b/vendor/github.com/lightstep/lightstep-tracer-go/Gopkg.lock new file mode 100644 index 00000000..a22213c9 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/Gopkg.lock @@ -0,0 +1,258 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + digest = "1:fd53b471edb4c28c7d297f617f4da0d33402755f58d6301e7ca1197ef0a90937" + name = "github.com/gogo/protobuf" + packages = [ + "proto", + "sortkeys", + "types", + ] + pruneopts = "" + revision = "ba06b47c162d49f2af050fb4c75bcbc86a159d5c" + version = "v1.2.1" + +[[projects]] + digest = "1:d3d38150b6d77b2aad42a9e105170538b6563518993d43df78a1add6e31cce62" + name = "github.com/golang/protobuf" + packages = [ + "proto", + "protoc-gen-go/descriptor", + "ptypes", + "ptypes/any", + "ptypes/duration", + "ptypes/timestamp", + ] + pruneopts = "" + revision = "c823c79ea1570fb5ff454033735a8e68575d1d0f" + version = "v1.3.0" + +[[projects]] + digest = "1:85f8f8d390a03287a563e215ea6bd0610c858042731a8b42062435a0dcbc485f" + name = "github.com/hashicorp/golang-lru" + packages = ["simplelru"] + pruneopts = "" + revision = "7087cb70de9f7a8bc0a10c375cb0d2280a8edf9c" + version = "v0.5.1" + +[[projects]] + digest = "1:f67a28bd3667b609ad09545a66857a1024fc5051616e7e3bccecf21ae3c6c98c" + name = "github.com/lightstep/lightstep-tracer-common" + packages = [ + "golang/gogo/collectorpb", + "golang/gogo/collectorpb/collectorpbfakes", + "golang/gogo/lightsteppb", + ] + pruneopts = "" + revision = "082dbbf1b51a87f008f51a6203c269395ac3fe54" + version = "v1.0.3" + +[[projects]] + digest = "1:32b27072cd55bd2fb7244de0425943d125da6a552ae2b6517cdd965a662baf18" + name = "github.com/onsi/ginkgo" + packages = [ + ".", + "config", + "internal/codelocation", + "internal/containernode", + "internal/failer", + "internal/leafnodes", + "internal/remote", + "internal/spec", + "internal/spec_iterator", + "internal/specrunner", + "internal/suite", + "internal/testingtproxy", + "internal/writer", + "reporters", + "reporters/stenographer", + "reporters/stenographer/support/go-colorable", + "reporters/stenographer/support/go-isatty", + "types", + ] + pruneopts = "" + revision = "9eda700730cba42af70d53180f9dcce9266bc2bc" + version = "v1.4.0" + +[[projects]] + digest = "1:a4e59d0b2821c983b58c317f141cd77df20570979632da8a7a352e5d12698de7" + name = "github.com/onsi/gomega" + packages = [ + ".", + "format", + "internal/assertion", + "internal/asyncassertion", + "internal/oraclematcher", + "internal/testingtsupport", + "matchers", + "matchers/support/goraph/bipartitegraph", + "matchers/support/goraph/edge", + "matchers/support/goraph/node", + "matchers/support/goraph/util", + "types", + ] + pruneopts = "" + revision = "c893efa28eb45626cdaa76c9f653b62488858837" + version = "v1.2.0" + +[[projects]] + digest = "1:78fb99d6011c2ae6c72f3293a83951311147b12b06a5ffa43abf750c4fab6ac5" + name = "github.com/opentracing/opentracing-go" + packages = [ + ".", + "ext", + "log", + ] + pruneopts = "" + revision = "1949ddbfd147afd4d964a9f00b24eb291e0e7c38" + version = "v1.0.2" + +[[projects]] + digest = "1:0eff358cc3a77a6ab721689fa717dc051bffc637346d17330341336f5b61b1e2" + name = "go.opencensus.io" + packages = [ + ".", + "internal", + "trace", + "trace/internal", + "trace/tracestate", + ] + pruneopts = "" + revision = "75c0cca22312e51bfd4fafdbe9197ae399e18b38" + version = "v0.20.2" + +[[projects]] + branch = "master" + digest = "1:950b672f2ee80d0fc4c95a15a976ba9ee573a6fb8ede8a777770b2230776367e" + name = "golang.org/x/net" + packages = [ + "context", + "html", + "html/atom", + "html/charset", + "http2", + "http2/hpack", + "idna", + "internal/timeseries", + "lex/httplex", + "trace", + ] + pruneopts = "" + revision = "dc871a5d77e227f5bbf6545176ef3eeebf87e76e" + +[[projects]] + branch = "master" + digest = "1:5da11ab130476e2736f32140f3c1aed2a3a96e9ba8963711a7d38db783d042bd" + name = "golang.org/x/sys" + packages = ["unix"] + pruneopts = "" + revision = "a0f4589a76f1f83070cb9e5613809e1d07b97c13" + +[[projects]] + branch = "master" + digest = "1:1c70f7bb89783a026dc32920575a3feef48e065ef6e170ad227903e8194d7a36" + name = "golang.org/x/text" + packages = [ + "collate", + "collate/build", + "encoding", + "encoding/charmap", + "encoding/htmlindex", + "encoding/internal", + "encoding/internal/identifier", + "encoding/japanese", + "encoding/korean", + "encoding/simplifiedchinese", + "encoding/traditionalchinese", + "encoding/unicode", + "internal/colltab", + "internal/gen", + "internal/tag", + "internal/triegen", + "internal/ucd", + "internal/utf8internal", + "language", + "runes", + "secure/bidirule", + "transform", + "unicode/bidi", + "unicode/cldr", + "unicode/norm", + "unicode/rangetable", + ] + pruneopts = "" + revision = "be25de41fadfae372d6470bda81ca6beb55ef551" + +[[projects]] + branch = "master" + digest = "1:6c15114fafeac4c833544476dec4207a3476799d50ab5165af79eb97806884cf" + name = "google.golang.org/genproto" + packages = [ + "googleapis/api/annotations", + "googleapis/rpc/status", + ] + pruneopts = "" + revision = "7f0da29060c682909f650ad8ed4e515bd74fa12a" + +[[projects]] + digest = "1:6c00b4702c146631d30396090d40bfc0486f8b3af5c976d6f0daf2bc737cd7b2" + name = "google.golang.org/grpc" + packages = [ + ".", + "balancer", + "balancer/roundrobin", + "codes", + "connectivity", + "credentials", + "encoding", + "grpclb/grpc_lb_v1/messages", + "grpclog", + "internal", + "keepalive", + "metadata", + "naming", + "peer", + "resolver", + "resolver/dns", + "resolver/manual", + "resolver/passthrough", + "stats", + "status", + "tap", + "transport", + ] + pruneopts = "" + revision = "be077907e29fdb945d351e4284eb5361e7f8924e" + version = "v1.8.1" + +[[projects]] + branch = "v2" + digest = "1:f769ed60e075e4221612c2f4162fccc9d3795ef358fa463425e3b3d7a5debb27" + name = "gopkg.in/yaml.v2" + packages = ["."] + pruneopts = "" + revision = "287cf08546ab5e7e37d55a84f7ed3fd1db036de5" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [ + "github.com/gogo/protobuf/proto", + "github.com/gogo/protobuf/types", + "github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb", + "github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb/collectorpbfakes", + "github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb", + "github.com/onsi/ginkgo", + "github.com/onsi/gomega", + "github.com/onsi/gomega/types", + "github.com/opentracing/opentracing-go", + "github.com/opentracing/opentracing-go/ext", + "github.com/opentracing/opentracing-go/log", + "go.opencensus.io/trace", + "google.golang.org/grpc", + "google.golang.org/grpc/credentials", + "google.golang.org/grpc/metadata", + ] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/Gopkg.toml b/vendor/github.com/lightstep/lightstep-tracer-go/Gopkg.toml new file mode 100644 index 00000000..ce88d24a --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/Gopkg.toml @@ -0,0 +1,27 @@ +[[constraint]] + name = "github.com/gogo/protobuf" + version = "1.2.1" + +[[constraint]] + name = "github.com/onsi/ginkgo" + version = "1.4.0" + +[[constraint]] + name = "github.com/onsi/gomega" + version = "1.2.0" + +[[constraint]] + name = "github.com/opentracing/opentracing-go" + version = "1.0.2" + +[[constraint]] + name = "go.opencensus.io" + version = "0.20.2" + +[[constraint]] + name = "google.golang.org/grpc" + version = "1.4.3" + +[[constraint]] + name = "github.com/lightstep/lightstep-tracer-common" + version = "1.0.3" diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/LICENSE b/vendor/github.com/lightstep/lightstep-tracer-go/LICENSE new file mode 100644 index 00000000..853b46db --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 + +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/lightstep/lightstep-tracer-go/Makefile b/vendor/github.com/lightstep/lightstep-tracer-go/Makefile new file mode 100644 index 00000000..8bacfabb --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/Makefile @@ -0,0 +1,27 @@ +# tools +GO = GO111MODULE=on GOPROXY=https://proxy.golang.org go + +.PHONY: default build test install + +default: build + +build: version.go + ${GO} build ./... + +test: build + ${GO} test -v -race ./... + +install: test + ${GO} install ./... + +clean: + ${GO} clean ./... + +# When releasing significant changes, make sure to update the semantic +# version number in `./VERSION`, merge changes, then run `make release_tag`. +version.go: VERSION + ./tag_version.sh + +release_tag: + git tag -a v`cat ./VERSION` + git push origin v`cat ./VERSION` diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/README.md b/vendor/github.com/lightstep/lightstep-tracer-go/README.md new file mode 100644 index 00000000..e9645671 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/README.md @@ -0,0 +1,117 @@ +# lightstep-tracer-go + +[![Circle CI](https://circleci.com/gh/lightstep/lightstep-tracer-go.svg?style=shield)](https://circleci.com/gh/lightstep/lightstep-tracer-go) +[![MIT license](http://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT) +[![GoDoc](https://godoc.org/github.com/lightstep/lightstep-tracer-go?status.svg)](https://godoc.org/github.com/lightstep/lightstep-tracer-go) + +The LightStep distributed tracing library for Go. + +**Looking for the LightStep OpenCensus exporter? Check out the [`lightstepoc` package](./lightstepoc).** + +## Installation + +``` +$ go get 'github.com/lightstep/lightstep-tracer-go' +``` + +## API Documentation + +Godoc: https://godoc.org/github.com/lightstep/lightstep-tracer-go + +## Initialization: Starting a new tracer +To initialize a tracer, configure it with a valid Access Token and optional tuning parameters. Register the tracer as the OpenTracing global tracer so that it will become available to your installed instrumentation libraries. + +```go +import ( + "github.com/opentracing/opentracing-go" + "github.com/lightstep/lightstep-tracer-go" +) + +func main() { + lightstepTracer := lightstep.NewTracer(lightstep.Options{ + AccessToken: "YourAccessToken", + }) + + opentracing.SetGlobalTracer(lightstepTracer) +} +``` + +## Instrumenting Code: Using the OpenTracing API + +All instrumentation should be done through the OpenTracing API, rather than using the lightstep tracer type directly. For API documentation and advice on instrumentation in general, see the opentracing godocs and the opentracing website. + +- https://godoc.org/github.com/opentracing/opentracing-go +- http://opentracing.io + +## Flushing and Closing: Managing the tracer lifecycle + +As part of managing your application lifecycle, the lightstep tracer extends the `opentracing.Tracer` interface with methods for manual flushing and closing. To access these methods, you can take the global tracer and typecast it to a `lightstep.Tracer`. As a convenience, the lightstep package provides static methods which perform the typecasting. + +```go +import ( + "context" + "github.com/opentracing/opentracing-go" + "github.com/lightstep/lightstep-tracer-go" +) + +func shutdown(ctx context.Context) { + // access the running tracer + tracer := opentracing.GlobalTracer() + + // typecast from opentracing.Tracer to lightstep.Tracer + lsTracer, ok := tracer.(lightstep.Tracer) + if (!ok) { + return + } + lsTracer.Close(ctx) + + // or use static methods + lightstep.Close(ctx, tracer) +} +``` + +## Event Handling: Observing the LightStep tracer +In order to connect diagnostic information from the lightstep tracer into an application's logging and metrics systems, inject an event handler using the `OnEvent` static method. Events may be typecast to check for errors or specific events such as status reports. + +```go +import ( + "example/logger" + "example/metrics" + "github.com/lightstep/lightstep-tracer-go" +) + +logAndMetricsHandler := func(event lightstep.Event){ + switch event := event.(type) { + case EventStatusReport: + metrics.Count("tracer.dropped_spans", event.DroppedSpans()) + case ErrorEvent: + logger.Error("LS Tracer error: %s", event) + default: + logger.Info("LS Tracer info: %s", event) + } +} + +func main() { + // setup event handler first to catch startup errors + lightstep.SetGlobalEventHandler(logAndMetricsHandler) + + lightstepTracer := lightstep.NewTracer(lightstep.Options{ + AccessToken: "YourAccessToken", + }) + + opentracing.SetGlobalTracer(lightstepTracer) +} +``` + +Event handlers will receive events from any active tracers, as well as errors in static functions. It is suggested that you set up event handling before initializing your tracer to catch any errors on initialization. + +## Advanced Configuration: Transport and Serialization Protocols + +By following the above configuration, the tracer will send information to LightStep using HTTP and Protocol Buffers which is the recommended configuration. If there are no specific transport protocol needs you have, there is no need to change this default. + +There are two options for transport protocols: + +- [Protocol Buffers](https://developers.google.com/protocol-buffers/) over HTTP - The recommended and default solution. +- [Protocol Buffers](https://developers.google.com/protocol-buffers/) over [GRPC](https://grpc.io/) - This is a more advanced solution that might be desirable if you already have gRPC networking configured. + +You can configure which transport protocol the tracer uses using the `UseGRPC` and `UseHttp` flags in the options. diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/VERSION b/vendor/github.com/lightstep/lightstep-tracer-go/VERSION new file mode 100644 index 00000000..249afd51 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/VERSION @@ -0,0 +1 @@ +0.18.1 diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/collector_client.go b/vendor/github.com/lightstep/lightstep-tracer-go/collector_client.go new file mode 100644 index 00000000..9b755246 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/collector_client.go @@ -0,0 +1,59 @@ +package lightstep + +import ( + "context" + "io" + "net/http" + + "github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb" +) + +var accessTokenHeader = http.CanonicalHeaderKey("Lightstep-Access-Token") + +// Connection describes a closable connection. Exposed for testing. +type Connection interface { + io.Closer +} + +// ConnectorFactory is for testing purposes. +type ConnectorFactory func() (interface{}, Connection, error) + +// collectorResponse encapsulates internal grpc/http responses. +type collectorResponse interface { + GetErrors() []string + Disable() bool + DevMode() bool +} + +// Collector encapsulates custom transport of protobuf messages +type Collector interface { + Report(context.Context, *collectorpb.ReportRequest) (*collectorpb.ReportResponse, error) +} + +type reportRequest struct { + protoRequest *collectorpb.ReportRequest + httpRequest *http.Request +} + +// collectorClient encapsulates internal grpc/http transports. +type collectorClient interface { + Report(context.Context, reportRequest) (collectorResponse, error) + Translate(*collectorpb.ReportRequest) (reportRequest, error) + ConnectClient() (Connection, error) + ShouldReconnect() bool +} + +func newCollectorClient(opts Options) (collectorClient, error) { + if opts.CustomCollector != nil { + return newCustomCollector(opts), nil + } + if opts.UseHttp { + return newHTTPCollectorClient(opts) + } + if opts.UseGRPC { + return newGrpcCollectorClient(opts) + } + + // No transport specified, defaulting to HTTP + return newHTTPCollectorClient(opts) +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/collector_client_custom.go b/vendor/github.com/lightstep/lightstep-tracer-go/collector_client_custom.go new file mode 100644 index 00000000..6e503b5a --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/collector_client_custom.go @@ -0,0 +1,41 @@ +package lightstep + +import ( + "context" + "fmt" + "io/ioutil" + + "github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb" +) + +func newCustomCollector(opts Options) *customCollectorClient { + return &customCollectorClient{collector: opts.CustomCollector} +} + +type customCollectorClient struct { + collector Collector +} + +func (client *customCollectorClient) Report(ctx context.Context, req reportRequest) (collectorResponse, error) { + if req.protoRequest == nil { + return nil, fmt.Errorf("protoRequest cannot be null") + } + + resp, err := client.collector.Report(ctx, req.protoRequest) + if err != nil { + return nil, err + } + return protoResponse{ReportResponse: resp}, nil +} + +func (client *customCollectorClient) Translate(protoRequest *collectorpb.ReportRequest) (reportRequest, error) { + return reportRequest{protoRequest: protoRequest}, nil +} + +func (customCollectorClient) ConnectClient() (Connection, error) { + return ioutil.NopCloser(nil), nil +} + +func (customCollectorClient) ShouldReconnect() bool { + return false +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/collector_client_grpc.go b/vendor/github.com/lightstep/lightstep-tracer-go/collector_client_grpc.go new file mode 100644 index 00000000..a55b9929 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/collector_client_grpc.go @@ -0,0 +1,157 @@ +package lightstep + +import ( + "context" + "fmt" + "reflect" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/metadata" + + // N.B.(jmacd): Do not use google.golang.org/glog in this package. + "github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb" +) + +const ( + spansDropped = "spans.dropped" + logEncoderErrors = "log_encoder.errors" +) + +var ( + intType = reflect.TypeOf(int64(0)) +) + +// grpcCollectorClient specifies how to send reports back to a LightStep +// collector via grpc. +type grpcCollectorClient struct { + // accessToken is the access token used for explicit trace collection requests. + accessToken string + maxReportingPeriod time.Duration // set by GrpcOptions.MaxReportingPeriod + reconnectPeriod time.Duration // set by GrpcOptions.ReconnectPeriod + reportingTimeout time.Duration // set by GrpcOptions.ReportTimeout + + // Remote service that will receive reports. + address string + grpcClient collectorpb.CollectorServiceClient + connTimestamp time.Time + dialOptions []grpc.DialOption + + // For testing purposes only + grpcConnectorFactory ConnectorFactory +} + +func newGrpcCollectorClient(opts Options) (*grpcCollectorClient, error) { + rec := &grpcCollectorClient{ + accessToken: opts.AccessToken, + maxReportingPeriod: opts.ReportingPeriod, + reconnectPeriod: opts.ReconnectPeriod, + reportingTimeout: opts.ReportTimeout, + dialOptions: opts.DialOptions, + grpcConnectorFactory: opts.ConnFactory, + } + + if len(opts.Collector.Scheme) > 0 { + rec.address = opts.Collector.urlWithoutPath() + } else { + rec.address = opts.Collector.SocketAddress() + } + + rec.dialOptions = append(rec.dialOptions, grpc.WithDefaultCallOptions(grpc.MaxCallSendMsgSize(opts.GRPCMaxCallSendMsgSizeBytes))) + if opts.Collector.Plaintext { + rec.dialOptions = append(rec.dialOptions, grpc.WithInsecure()) + return rec, nil + } + + if len(opts.Collector.CustomCACertFile) > 0 { + creds, err := credentials.NewClientTLSFromFile(opts.Collector.CustomCACertFile, "") + if err != nil { + return nil, err + } + rec.dialOptions = append(rec.dialOptions, grpc.WithTransportCredentials(creds)) + } else { + rec.dialOptions = append(rec.dialOptions, grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, ""))) + } + + return rec, nil +} + +func (client *grpcCollectorClient) ConnectClient() (Connection, error) { + now := time.Now() + var conn Connection + if client.grpcConnectorFactory != nil { + uncheckedClient, transport, err := client.grpcConnectorFactory() + if err != nil { + return nil, err + } + + grpcClient, ok := uncheckedClient.(collectorpb.CollectorServiceClient) + if !ok { + return nil, fmt.Errorf("gRPC connector factory did not provide valid client") + } + + conn = transport + client.grpcClient = grpcClient + } else { + transport, err := grpc.Dial(client.address, client.dialOptions...) + if err != nil { + return nil, err + } + + conn = transport + client.grpcClient = collectorpb.NewCollectorServiceClient(transport) + } + client.connTimestamp = now + return conn, nil +} + +func (client *grpcCollectorClient) ShouldReconnect() bool { + return time.Since(client.connTimestamp) > client.reconnectPeriod +} + +func (client *grpcCollectorClient) Report(ctx context.Context, req reportRequest) (collectorResponse, error) { + if req.protoRequest == nil { + return nil, fmt.Errorf("protoRequest cannot be null") + } + + ctx = metadata.NewOutgoingContext( + ctx, + metadata.Pairs( + accessTokenHeader, + client.accessToken, + ), + ) + + resp, err := client.grpcClient.Report(ctx, req.protoRequest) + if err != nil { + return nil, err + } + return protoResponse{ReportResponse: resp}, nil +} + +func (client *grpcCollectorClient) Translate(protoRequest *collectorpb.ReportRequest) (reportRequest, error) { + return reportRequest{protoRequest: protoRequest}, nil +} + +type protoResponse struct { + *collectorpb.ReportResponse +} + +func (res protoResponse) Disable() bool { + for _, command := range res.GetCommands() { + if command.Disable { + return true + } + } + return false +} + +func (res protoResponse) DevMode() bool { + for _, command := range res.GetCommands() { + if command.DevMode { + return true + } + } + return false +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/collector_client_http.go b/vendor/github.com/lightstep/lightstep-tracer-go/collector_client_http.go new file mode 100644 index 00000000..129a5506 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/collector_client_http.go @@ -0,0 +1,199 @@ +package lightstep + +import ( + "bytes" + "context" + "crypto/tls" + "crypto/x509" + "fmt" + "io/ioutil" + "net" + "net/http" + "net/url" + "time" + + "github.com/gogo/protobuf/proto" + "github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb" +) + +var ( + acceptHeader = http.CanonicalHeaderKey("Accept") + contentTypeHeader = http.CanonicalHeaderKey("Content-Type") +) + +const ( + collectorHTTPMethod = "POST" + collectorHTTPPath = "/api/v2/reports" + protoContentType = "application/octet-stream" +) + +// grpcCollectorClient specifies how to send reports back to a LightStep +// collector via grpc. +type httpCollectorClient struct { + // auth and runtime information + accessToken string // accessToken is the access token used for explicit trace collection requests. + + tlsClientConfig *tls.Config + reportTimeout time.Duration + reportingPeriod time.Duration + + // Remote service that will receive reports. + url *url.URL + client *http.Client +} + +type transportCloser struct { + *http.Transport +} + +func (closer transportCloser) Close() error { + closer.CloseIdleConnections() + return nil +} + +func newHTTPCollectorClient(opts Options) (*httpCollectorClient, error) { + url, err := url.Parse(opts.Collector.URL()) + if err != nil { + fmt.Println("collector config does not produce valid url", err) + return nil, err + } + url.Path = collectorHTTPPath + + tlsClientConfig, err := getTLSConfig(opts.Collector.CustomCACertFile) + if err != nil { + fmt.Println("failed to get TLSConfig: ", err) + return nil, err + } + + return &httpCollectorClient{ + accessToken: opts.AccessToken, + tlsClientConfig: tlsClientConfig, + reportTimeout: opts.ReportTimeout, + reportingPeriod: opts.ReportingPeriod, + url: url, + }, nil +} + +// getTLSConfig returns a *tls.Config according to whether a user has supplied a customCACertFile. If they have, +// we return a TLSConfig that uses the custom CA cert as the lone Root CA. If not, we return nil which http.Transport +// will interpret as the default system defined Root CAs. +func getTLSConfig(customCACertFile string) (*tls.Config, error) { + if len(customCACertFile) == 0 { + return nil, nil + } + + caCerts := x509.NewCertPool() + cert, err := ioutil.ReadFile(customCACertFile) + if err != nil { + return nil, err + } + + if !caCerts.AppendCertsFromPEM(cert) { + return nil, fmt.Errorf("credentials: failed to append certificate") + } + + return &tls.Config{RootCAs: caCerts}, nil +} + +func (client *httpCollectorClient) ConnectClient() (Connection, error) { + // Use a transport independent from http.DefaultTransport to provide sane + // defaults that make sense in the context of the lightstep client. The + // differences are mostly on setting timeouts based on the report timeout + // and period. + transport := &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: client.reportTimeout / 2, + DualStack: true, + }).DialContext, + // The collector responses are very small, there is no point asking for + // a compressed payload, explicitly disabling it. + DisableCompression: true, + IdleConnTimeout: 2 * client.reportingPeriod, + TLSHandshakeTimeout: client.reportTimeout / 2, + ResponseHeaderTimeout: client.reportTimeout, + ExpectContinueTimeout: client.reportTimeout, + MaxResponseHeaderBytes: 64 * 1024, // 64 KB, just a safeguard + TLSClientConfig: client.tlsClientConfig, + } + + client.client = &http.Client{ + Transport: transport, + Timeout: client.reportTimeout, + } + + return transportCloser{transport}, nil +} + +func (client *httpCollectorClient) ShouldReconnect() bool { + // http.Transport will handle connection reuse under the hood + return false +} + +func (client *httpCollectorClient) Report(context context.Context, req reportRequest) (collectorResponse, error) { + if req.httpRequest == nil { + return nil, fmt.Errorf("httpRequest cannot be null") + } + + httpResponse, err := client.client.Do(req.httpRequest.WithContext(context)) + if err != nil { + return nil, err + } + defer httpResponse.Body.Close() + + response, err := client.toResponse(httpResponse) + if err != nil { + return nil, err + } + + return response, nil +} + +func (client *httpCollectorClient) Translate(protoRequest *collectorpb.ReportRequest) (reportRequest, error) { + httpRequest, err := client.toRequest(protoRequest) + if err != nil { + return reportRequest{}, err + } + return reportRequest{ + httpRequest: httpRequest, + }, nil +} + +func (client *httpCollectorClient) toRequest( + protoRequest *collectorpb.ReportRequest, +) (*http.Request, error) { + buf, err := proto.Marshal(protoRequest) + if err != nil { + return nil, err + } + + requestBody := bytes.NewReader(buf) + + request, err := http.NewRequest(collectorHTTPMethod, client.url.String(), requestBody) + if err != nil { + return nil, err + } + request.Header.Set(contentTypeHeader, protoContentType) + request.Header.Set(acceptHeader, protoContentType) + request.Header.Set(accessTokenHeader, client.accessToken) + + return request, nil +} + +func (client *httpCollectorClient) toResponse(response *http.Response) (collectorResponse, error) { + if response.StatusCode != http.StatusOK { + return nil, fmt.Errorf("status code (%d) is not ok", response.StatusCode) + } + + body, err := ioutil.ReadAll(response.Body) + if err != nil { + return nil, err + } + + resp := &collectorpb.ReportResponse{} + if err := proto.Unmarshal(body, resp); err != nil { + return nil, err + } + + return protoResponse{ReportResponse: resp}, nil +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/event_handlers.go b/vendor/github.com/lightstep/lightstep-tracer-go/event_handlers.go new file mode 100644 index 00000000..4e4ee5f8 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/event_handlers.go @@ -0,0 +1,97 @@ +package lightstep + +import ( + "log" + "sync" + "sync/atomic" +) + +func init() { + SetGlobalEventHandler(NewEventLogOneError()) +} + +var eventHandler atomic.Value + +// An EventHandler can be registered with SetGlobalEventHandler to +type EventHandler func(Event) + +// emitEvent is a thread-safe function for emiting tracer events. +func emitEvent(event Event) { + handler := eventHandler.Load().(EventHandler) + handler(event) +} + +// SetGlobalEventHandler sets a global handler to receive tracer events as they occur. Events +// may be emitted by the tracer, or by calls to static functions in this package. +// It is suggested that you set your EventHandler before starting your tracer, +// but it is safe to set a new handler at any time. Setting a new handler removes +// the previous one. +// +// The EventHandler is called synchronously – do not block in your handler as it +// may interfere with the tracer. If no EventHandler handler is set, a +// LogOnceOnError handler is set by default. +// +// NOTE: Event handling is for reporting purposes only. It is not intended as a +// mechanism for controling or restarting the tracer. Connection issues, retry +// logic, and other transient errors are handled internally by the tracer. +func SetGlobalEventHandler(handler EventHandler) { + eventHandler.Store(handler) +} + +/* + SetGlobalEventHandler Handlers +*/ + +// NewEventLogger logs events using the standard go logger. +func NewEventLogger() EventHandler { + return logOnEvent +} + +func logOnEvent(event Event) { + switch event := event.(type) { + case ErrorEvent: + log.Println("LS Tracer error: ", event) + default: + log.Println("LS Tracer event: ", event) + } +} + +// NewEventLogOneError logs the first error event that occurs. +func NewEventLogOneError() EventHandler { + logger := logOneError{} + return logger.OnEvent +} + +type logOneError struct { + sync.Once +} + +func (l *logOneError) OnEvent(event Event) { + switch event := event.(type) { + case ErrorEvent: + l.Once.Do(func() { + log.Printf("LS Tracer error: (%s). NOTE: Set the SetGlobalEventHandler handler to log events.\n", event.Error()) + }) + } +} + +// NewEventChannel returns an SetGlobalEventHandler callback handler, and a channel that +// produces the errors. When the channel buffer is full, subsequent errors will +// be dropped. A buffer size of less than one is incorrect, and will be adjusted +// to a buffer size of one. +func NewEventChannel(buffer int) (EventHandler, <-chan Event) { + if buffer < 1 { + buffer = 1 + } + + eventChan := make(chan Event, buffer) + + handler := func(event Event) { + select { + case eventChan <- event: + default: + } + } + + return handler, eventChan +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/events.go b/vendor/github.com/lightstep/lightstep-tracer-go/events.go new file mode 100644 index 00000000..f36ee047 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/events.go @@ -0,0 +1,330 @@ +package lightstep + +import ( + "errors" + "fmt" + "reflect" + "time" + + "github.com/opentracing/opentracing-go" +) + +// An Event is emitted by the LightStep tracer as a reporting mechanism. They are +// handled by registering an EventHandler callback via SetGlobalEventHandler. The +// emitted events may be cast to specific event types in order access additional +// information. +// +// NOTE: To ensure that events can be accurately identified, each event type contains +// a sentinel method matching the name of the type. This method is a no-op, it is +// only used for type coersion. +type Event interface { + Event() + String() string +} + +// The ErrorEvent type can be used to filter events. The `Err` method +// returns the underlying error. +type ErrorEvent interface { + Event + error + Err() error +} + +// EventStartError occurs if the Options passed to NewTracer are invalid, and +// the Tracer has failed to start. +type EventStartError interface { + ErrorEvent + EventStartError() +} + +type eventStartError struct { + err error +} + +func newEventStartError(err error) *eventStartError { + return &eventStartError{err: err} +} + +func (*eventStartError) Event() {} +func (*eventStartError) EventStartError() {} + +func (e *eventStartError) String() string { + return e.err.Error() +} + +func (e *eventStartError) Error() string { + return e.err.Error() +} + +func (e *eventStartError) Err() error { + return e.err +} + +// EventFlushErrorState lists the possible causes for a flush to fail. +type EventFlushErrorState string + +// Constant strings corresponding to flush errors +const ( + FlushErrorTracerClosed EventFlushErrorState = "flush failed, the tracer is closed." + FlushErrorTracerDisabled EventFlushErrorState = "flush failed, the tracer is disabled." + FlushErrorTransport EventFlushErrorState = "flush failed, could not send report to Collector" + FlushErrorReport EventFlushErrorState = "flush failed, report contained errors" + FlushErrorTranslate EventFlushErrorState = "flush failed, could not translate report" +) + +var ( + errFlushFailedTracerClosed = errors.New(string(FlushErrorTracerClosed)) +) + +// EventFlushError occurs when a flush fails to send. Call the `State` method to +// determine the type of error. +type EventFlushError interface { + ErrorEvent + EventFlushError() + State() EventFlushErrorState +} + +type eventFlushError struct { + err error + state EventFlushErrorState +} + +func newEventFlushError(err error, state EventFlushErrorState) *eventFlushError { + return &eventFlushError{err: err, state: state} +} + +func (*eventFlushError) Event() {} +func (*eventFlushError) EventFlushError() {} + +func (e *eventFlushError) State() EventFlushErrorState { + return e.state +} + +func (e *eventFlushError) String() string { + return e.err.Error() +} + +func (e *eventFlushError) Error() string { + return e.err.Error() +} + +func (e *eventFlushError) Err() error { + return e.err +} + +// EventConnectionError occurs when the tracer fails to maintain it's connection +// with the Collector. +type EventConnectionError interface { + ErrorEvent + EventConnectionError() +} + +type eventConnectionError struct { + err error +} + +func newEventConnectionError(err error) *eventConnectionError { + return &eventConnectionError{err: err} +} + +func (*eventConnectionError) Event() {} +func (*eventConnectionError) EventConnectionError() {} + +func (e *eventConnectionError) String() string { + return e.err.Error() +} + +func (e *eventConnectionError) Error() string { + return e.err.Error() +} + +func (e *eventConnectionError) Err() error { + return e.err +} + +// EventStatusReport occurs on every successful flush. It contains all metrics +// collected since the previous successful flush. +type EventStatusReport interface { + Event + EventStatusReport() + StartTime() time.Time + FinishTime() time.Time + Duration() time.Duration + SentSpans() int + DroppedSpans() int + EncodingErrors() int +} + +type eventStatusReport struct { + startTime time.Time + finishTime time.Time + sentSpans int + droppedSpans int + encodingErrors int +} + +func newEventStatusReport( + startTime, finishTime time.Time, + sentSpans, droppedSpans, encodingErrors int, +) *eventStatusReport { + return &eventStatusReport{ + startTime: startTime, + finishTime: finishTime, + sentSpans: sentSpans, + droppedSpans: droppedSpans, + encodingErrors: encodingErrors, + } +} + +func (*eventStatusReport) Event() {} + +func (*eventStatusReport) EventStatusReport() {} + +func (s *eventStatusReport) SetSentSpans(sent int) { + s.sentSpans = sent +} + +func (s *eventStatusReport) StartTime() time.Time { + return s.startTime +} + +func (s *eventStatusReport) FinishTime() time.Time { + return s.finishTime +} + +func (s *eventStatusReport) Duration() time.Duration { + return s.finishTime.Sub(s.startTime) +} + +func (s *eventStatusReport) SentSpans() int { + return s.sentSpans +} + +func (s *eventStatusReport) DroppedSpans() int { + return s.droppedSpans +} + +func (s *eventStatusReport) EncodingErrors() int { + return s.encodingErrors +} + +func (s *eventStatusReport) String() string { + return fmt.Sprint( + "STATUS REPORT start: ", s.startTime, + ", end: ", s.finishTime, + ", dropped spans: ", s.droppedSpans, + ", encoding errors: ", s.encodingErrors, + ) +} + +// EventUnsupportedTracer occurs when a tracer being passed to a helper function +// fails to typecast as a LightStep tracer. +type EventUnsupportedTracer interface { + ErrorEvent + EventUnsupportedTracer() + Tracer() opentracing.Tracer +} + +type eventUnsupportedTracer struct { + tracer opentracing.Tracer + err error +} + +func newEventUnsupportedTracer(tracer opentracing.Tracer) EventUnsupportedTracer { + return &eventUnsupportedTracer{ + tracer: tracer, + err: fmt.Errorf("unsupported tracer type: %v", reflect.TypeOf(tracer)), + } +} + +func (e *eventUnsupportedTracer) Event() {} +func (e *eventUnsupportedTracer) EventUnsupportedTracer() {} + +func (e *eventUnsupportedTracer) Tracer() opentracing.Tracer { + return e.tracer +} + +func (e *eventUnsupportedTracer) String() string { + return e.err.Error() +} + +func (e *eventUnsupportedTracer) Error() string { + return e.err.Error() +} + +func (e *eventUnsupportedTracer) Err() error { + return e.err +} + +// EventUnsupportedValue occurs when a tracer encounters an unserializable tag +// or log field. +type EventUnsupportedValue interface { + ErrorEvent + EventUnsupportedValue() + Key() string + Value() interface{} +} + +type eventUnsupportedValue struct { + key string + value interface{} + err error +} + +func newEventUnsupportedValue(key string, value interface{}, err error) EventUnsupportedValue { + if err == nil { + err = fmt.Errorf( + "value `%v` of type `%T` for key `%s` is an unsupported type", + value, value, key, + ) + } + return &eventUnsupportedValue{ + key: key, + value: value, + err: err, + } +} + +func (e *eventUnsupportedValue) Event() {} +func (e *eventUnsupportedValue) EventUnsupportedValue() {} + +func (e *eventUnsupportedValue) Key() string { + return e.key +} + +func (e *eventUnsupportedValue) Value() interface{} { + return e.value +} + +func (e *eventUnsupportedValue) String() string { + return e.err.Error() +} + +func (e *eventUnsupportedValue) Error() string { + return e.err.Error() +} + +func (e *eventUnsupportedValue) Err() error { + return e.err +} + +const tracerDisabled = "the tracer has been disabled" + +// EventTracerDisabled occurs when a tracer is disabled by either the user or +// the collector. +type EventTracerDisabled interface { + Event + EventTracerDisabled() +} + +type eventTracerDisabled struct{} + +func newEventTracerDisabled() EventTracerDisabled { + return eventTracerDisabled{} +} + +func (eventTracerDisabled) Event() {} +func (eventTracerDisabled) EventTracerDisabled() {} +func (eventTracerDisabled) String() string { + return tracerDisabled +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/go.mod b/vendor/github.com/lightstep/lightstep-tracer-go/go.mod new file mode 100644 index 00000000..5262a5c3 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/go.mod @@ -0,0 +1,14 @@ +module github.com/lightstep/lightstep-tracer-go + +go 1.12 + +require ( + github.com/gogo/protobuf v1.2.1 + github.com/hashicorp/golang-lru v0.5.1 // indirect + github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 + github.com/onsi/ginkgo v1.7.0 + github.com/onsi/gomega v1.4.3 + github.com/opentracing/opentracing-go v1.0.2 + go.opencensus.io v0.20.2 + google.golang.org/grpc v1.21.0 +) diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/go.sum b/vendor/github.com/lightstep/lightstep-tracer-go/go.sum new file mode 100644 index 00000000..136177ef --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/go.sum @@ -0,0 +1,144 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/lightstep/lightstep-tracer-common v1.0.3 h1:U0R1gCSkj/ExuWU6snqonzeZGR1rG8USWVPyUN2ACE0= +github.com/lightstep/lightstep-tracer-common v1.0.3/go.mod h1:7CwX1k70LGI4mW1/J846zvNJ67b16qkx0dfHi3EbXiQ= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2 h1:NAfh7zF0/3/HqtMvJNZ/RFrSlCE6ZTlHmKfhL/Dm1Jk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101 h1:wuGevabY6r+ivPNagjUXGGxF+GqgMd+dBhjsxW4q9u4= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/locked_rand.go b/vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/locked_rand.go new file mode 100644 index 00000000..325c0f2b --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/locked_rand.go @@ -0,0 +1,138 @@ +package rand + +import ( + "math/rand" + "sync" +) + +// LockedRand implements NumberGenerator and embeds Rand that is safe for concurrent use. +type LockedRand struct { + lk sync.Mutex + r *rand.Rand +} + +// NewLockedRand creates a new LockedRand that implements all Rand functions that is safe +// for concurrent use. +func NewLockedRand(seed int64) *LockedRand { + return &LockedRand{ + r: rand.New(rand.NewSource(seed)), + } +} + +// Seed uses the provided seed value to initialize the generator to a deterministic state. +// Seed should not be called concurrently with any other Rand method. +func (lr *LockedRand) Seed(seed int64) { + lr.lk.Lock() + lr.r.Seed(seed) + lr.lk.Unlock() +} + +// TwoInt63 generates 2 random int64 without locking twice. +func (lr *LockedRand) TwoInt63() (n1, n2 int64) { + lr.lk.Lock() + n1 = lr.r.Int63() + n2 = lr.r.Int63() + lr.lk.Unlock() + return +} + +// Int63 returns a non-negative pseudo-random 63-bit integer as an int64. +func (lr *LockedRand) Int63() (n int64) { + lr.lk.Lock() + n = lr.r.Int63() + lr.lk.Unlock() + return +} + +// Uint32 returns a pseudo-random 32-bit value as a uint32. +func (lr *LockedRand) Uint32() (n uint32) { + lr.lk.Lock() + n = lr.r.Uint32() + lr.lk.Unlock() + return +} + +// Uint64 returns a pseudo-random 64-bit value as a uint64. +func (lr *LockedRand) Uint64() (n uint64) { + lr.lk.Lock() + n = lr.r.Uint64() + lr.lk.Unlock() + return +} + +// Int31 returns a non-negative pseudo-random 31-bit integer as an int32. +func (lr *LockedRand) Int31() (n int32) { + lr.lk.Lock() + n = lr.r.Int31() + lr.lk.Unlock() + return +} + +// Int returns a non-negative pseudo-random int. +func (lr *LockedRand) Int() (n int) { + lr.lk.Lock() + n = lr.r.Int() + lr.lk.Unlock() + return +} + +// Int63n returns, as an int64, a non-negative pseudo-random number in [0,n). +// It panics if n <= 0. +func (lr *LockedRand) Int63n(n int64) (r int64) { + lr.lk.Lock() + r = lr.r.Int63n(n) + lr.lk.Unlock() + return +} + +// Int31n returns, as an int32, a non-negative pseudo-random number in [0,n). +// It panics if n <= 0. +func (lr *LockedRand) Int31n(n int32) (r int32) { + lr.lk.Lock() + r = lr.r.Int31n(n) + lr.lk.Unlock() + return +} + +// Intn returns, as an int, a non-negative pseudo-random number in [0,n). +// It panics if n <= 0. +func (lr *LockedRand) Intn(n int) (r int) { + lr.lk.Lock() + r = lr.r.Intn(n) + lr.lk.Unlock() + return +} + +// Float64 returns, as a float64, a pseudo-random number in [0.0,1.0). +func (lr *LockedRand) Float64() (n float64) { + lr.lk.Lock() + n = lr.r.Float64() + lr.lk.Unlock() + return +} + +// Float32 returns, as a float32, a pseudo-random number in [0.0,1.0). +func (lr *LockedRand) Float32() (n float32) { + lr.lk.Lock() + n = lr.r.Float32() + lr.lk.Unlock() + return +} + +// Perm returns, as a slice of n ints, a pseudo-random permutation of the integers [0,n). +func (lr *LockedRand) Perm(n int) (r []int) { + lr.lk.Lock() + r = lr.r.Perm(n) + lr.lk.Unlock() + return +} + +// Read generates len(p) random bytes and writes them into p. It +// always returns len(p) and a nil error. +// Read should not be called concurrently with any other Rand method. +func (lr *LockedRand) Read(p []byte) (n int, err error) { + lr.lk.Lock() + n, err = lr.r.Read(p) + lr.lk.Unlock() + return +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/num_gen.go b/vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/num_gen.go new file mode 100644 index 00000000..6ad94e4b --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/num_gen.go @@ -0,0 +1,7 @@ +package rand + +// NumberGenerator defines an interface to generate numbers. +type NumberGenerator interface { + Int63() int64 + TwoInt63() (int64, int64) +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/pool.go b/vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/pool.go new file mode 100644 index 00000000..c3526bad --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/lightstep/rand/pool.go @@ -0,0 +1,59 @@ +package rand + +import ( + "math/rand" + "sync/atomic" +) + +// Pool represents a pool of random number generators. +// To generate a random id, round robin through the source pool with atomic increment. +// With more and more goroutines, Pool improves the performance of Random vs naive global random +// mutex exponentially. +// Try tests with 20000 goroutines and 500 calls to observe the difference +type Pool struct { + sources []NumberGenerator + counter uint64 // used for round robin + size uint64 +} + +// see bit twiddling hacks: https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 +func nextNearestPow2uint64(v uint64) uint64 { + v-- + v |= v >> 1 + v |= v >> 2 + v |= v >> 4 + v |= v >> 8 + v |= v >> 16 + v |= v >> 32 + v++ + return v +} + +// NewPool takes in a size and creates a pool of random id generators with size equal to next closest power of 2. +// eg: NewPool(10) returns a pool with 2^4 = 16 random sources. +func NewPool(seed int64, size uint64) *Pool { + groupsize := nextNearestPow2uint64(size) + pool := &Pool{ + size: groupsize, + sources: make([]NumberGenerator, groupsize), + } + // seed the pool + pool.seed(seed) + return pool +} + +// seed initializes the pool using a randomized sequence with given seed. +func (r *Pool) seed(seed int64) { + // init a random sequence to seed all sources + seedRan := rand.NewSource(seed) + for i := uint64(0); i < r.size; i++ { + r.sources[i] = NewLockedRand(seedRan.Int63()) + } +} + +// Pick returns a NumberGenerator from a pool of NumberGenerators +func (r *Pool) Pick() NumberGenerator { + // use round robin with fast modulus of pow2 numbers + selection := atomic.AddUint64(&r.counter, 1) & (r.size - 1) + return r.sources[selection] +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/meta_events.go b/vendor/github.com/lightstep/lightstep-tracer-go/meta_events.go new file mode 100644 index 00000000..cee94053 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/meta_events.go @@ -0,0 +1,15 @@ +package lightstep + +// keys for ls meta span events +const LSMetaEvent_MetaEventKey = "lightstep.meta_event" +const LSMetaEvent_PropagationFormatKey = "lightstep.propagation_format" +const LSMetaEvent_TraceIdKey = "lightstep.trace_id" +const LSMetaEvent_SpanIdKey = "lightstep.span_id" +const LSMetaEvent_TracerGuidKey = "lightstep.tracer_guid" + +// operation names for ls meta span events +const LSMetaEvent_ExtractOperation = "lightstep.extract_span" +const LSMetaEvent_InjectOperation = "lightstep.inject_span" +const LSMetaEvent_SpanStartOperation = "lightstep.span_start" +const LSMetaEvent_SpanFinishOperation = "lightstep.span_finish" +const LSMetaEvent_TracerCreateOperation = "lightstep.tracer_create" diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/options.go b/vendor/github.com/lightstep/lightstep-tracer-go/options.go new file mode 100644 index 00000000..c41b0396 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/options.go @@ -0,0 +1,352 @@ +package lightstep + +import ( + "fmt" + "math" + "math/rand" + "os" + "path" + "strings" + "time" // N.B.(jmacd): Do not use google.golang.org/glog in this package. + + "github.com/opentracing/opentracing-go" + "google.golang.org/grpc" +) + +// Default Option values. +const ( + DefaultCollectorPath = "/_rpc/v1/reports/binary" + DefaultPlainPort = 80 + DefaultSecurePort = 443 + DefaultGRPCCollectorHost = "collector-grpc.lightstep.com" + + DefaultMaxReportingPeriod = 2500 * time.Millisecond + DefaultMinReportingPeriod = 500 * time.Millisecond + DefaultMaxSpans = 1000 + DefaultReportTimeout = 30 * time.Second + DefaultReconnectPeriod = 5 * time.Minute + + DefaultMaxLogKeyLen = 256 + DefaultMaxLogValueLen = 1024 + DefaultMaxLogsPerSpan = 500 + + DefaultGRPCMaxCallSendMsgSizeBytes = math.MaxInt32 +) + +// Tag and Tracer Attribute keys. +const ( + ParentSpanGUIDKey = "parent_span_guid" // ParentSpanGUIDKey is the tag key used to record the relationship between child and parent spans. + ComponentNameKey = "lightstep.component_name" + GUIDKey = "lightstep.guid" // <- runtime guid, not span guid + HostnameKey = "lightstep.hostname" + CommandLineKey = "lightstep.command_line" + + TracerPlatformKey = "lightstep.tracer_platform" + TracerPlatformValue = "go" + TracerPlatformVersionKey = "lightstep.tracer_platform_version" + TracerVersionKey = "lightstep.tracer_version" // Note: TracerVersionValue is generated from ./VERSION +) + +const ( + secureScheme = "https" + plaintextScheme = "http" +) + +// Validation Errors +var ( + errInvalidGUIDKey = fmt.Errorf("Options invalid: setting the %v tag is no longer supported", GUIDKey) +) + +// A SpanRecorder handles all of the `RawSpan` data generated via an +// associated `Tracer` instance. +type SpanRecorder interface { + RecordSpan(RawSpan) +} + +// Endpoint describes a collector or web API host/port and whether or +// not to use plaintext communication. +type Endpoint struct { + Scheme string `yaml:"scheme" json:"scheme" usage:"scheme to use for the endpoint, defaults to appropriate one if no custom one is required"` + Host string `yaml:"host" json:"host" usage:"host on which the endpoint is running"` + Port int `yaml:"port" json:"port" usage:"port on which the endpoint is listening"` + Plaintext bool `yaml:"plaintext" json:"plaintext" usage:"whether or not to encrypt data send to the endpoint"` + CustomCACertFile string `yaml:"custom_ca_cert_file" json:"custom_ca_cert_file" usage:"path to a custom CA cert file, defaults to system defined certs if omitted"` +} + +// HostPort use SocketAddress instead. +// DEPRECATED +func (e Endpoint) HostPort() string { + return e.SocketAddress() +} + +// SocketAddress returns an address suitable for dialing grpc connections +func (e Endpoint) SocketAddress() string { + return fmt.Sprintf("%s:%d", e.Host, e.Port) +} + +// URL returns an address suitable for dialing thrift connections +func (e Endpoint) URL() string { + return fmt.Sprintf("%s%s", e.urlWithoutPath(), DefaultCollectorPath) +} + +// urlWithoutPath returns an address suitable for grpc connections if a custom scheme is provided +func (e Endpoint) urlWithoutPath() string { + return fmt.Sprintf("%s://%s", e.scheme(), e.SocketAddress()) +} + +func (e Endpoint) scheme() string { + if len(e.Scheme) > 0 { + return e.Scheme + } + + if e.Plaintext { + return plaintextScheme + } + + return secureScheme +} + +// Options control how the LightStep Tracer behaves. +type Options struct { + // AccessToken is the unique API key for your LightStep project. It is + // available on your account page at https://app.lightstep.com/account + AccessToken string `yaml:"access_token" usage:"access token for reporting to LightStep"` + + // Collector is the host, port, and plaintext option to use + // for the collector. + Collector Endpoint `yaml:"collector"` + + // Tags are arbitrary key-value pairs that apply to all spans generated by + // this Tracer. + Tags opentracing.Tags + + // LightStep is the host, port, and plaintext option to use + // for the LightStep web API. + LightStepAPI Endpoint `yaml:"lightstep_api"` + + // MaxBufferedSpans is the maximum number of spans that will be buffered + // before sending them to a collector. + MaxBufferedSpans int `yaml:"max_buffered_spans"` + + // MaxLogKeyLen is the maximum allowable size (in characters) of an + // OpenTracing logging key. Longer keys are truncated. + MaxLogKeyLen int `yaml:"max_log_key_len"` + + // MaxLogValueLen is the maximum allowable size (in characters) of an + // OpenTracing logging value. Longer values are truncated. Only applies to + // variable-length value types (strings, interface{}, etc). + MaxLogValueLen int `yaml:"max_log_value_len"` + + // MaxLogsPerSpan limits the number of logs in a single span. + MaxLogsPerSpan int `yaml:"max_logs_per_span"` + + // GRPCMaxCallSendMsgSizeBytes limits the size in bytes of grpc messages + // sent by a client. + GRPCMaxCallSendMsgSizeBytes int `yaml:"grpc_max_call_send_msg_size_bytes"` + + // ReportingPeriod is the maximum duration of time between sending spans + // to a collector. If zero, the default will be used. + ReportingPeriod time.Duration `yaml:"reporting_period"` + + // MinReportingPeriod is the minimum duration of time between sending spans + // to a collector. If zero, the default will be used. It is strongly + // recommended to use the default. + MinReportingPeriod time.Duration `yaml:"min_reporting_period"` + + ReportTimeout time.Duration `yaml:"report_timeout"` + + // DropSpanLogs turns log events on all Spans into no-ops. + DropSpanLogs bool `yaml:"drop_span_logs"` + + // DEPRECATED: The LightStep library prints the first error to stdout by default. + // See the documentation on the SetGlobalEventHandler function for guidance on + // how to integrate tracer diagnostics with your application's logging and + // metrics systems. + Verbose bool `yaml:"verbose"` + + // Force the use of a specific transport protocol. If multiple are set to true, + // the following order is used to select for the first option: http, grpc. + // If none are set to true, HTTP is defaulted to. + UseHttp bool `yaml:"use_http"` + UseGRPC bool `yaml:"usegrpc"` + + // Propagators allow inject/extract to use custom propagators for different formats. This + // package includes a `B3Propagator` that supports B3 headers on text maps and http headers. + // Defaults: + // opentracing.HTTPHeaders: LightStepPropagator + // opentracing.TextMap: LightStepPropagator, + // opentracing.Binary: LightStepPropagator + Propagators map[opentracing.BuiltinFormat]Propagator `yaml:"-"` + + // CustomCollector allows customizing the Protobuf transport. + // This is an advanced feature that avoids reconnect logic. + CustomCollector Collector `yaml:"-" json:"-"` + + ReconnectPeriod time.Duration `yaml:"reconnect_period"` + + // DialOptions allows customizing the grpc dial options passed to the grpc.Dial(...) call. + // This is an advanced feature added to allow for a custom balancer or middleware. + // It can be safely ignored if you have no custom dialing requirements. + // If UseGRPC is not set, these dial options are ignored. + DialOptions []grpc.DialOption `yaml:"-" json:"-"` + + // A hook for receiving finished span events + Recorder SpanRecorder `yaml:"-" json:"-"` + + // For testing purposes only + ConnFactory ConnectorFactory `yaml:"-" json:"-"` + + // Enable LightStep Meta Event Logging + MetaEventReportingEnabled bool `yaml:"meta_event_reporting_enabled" json:"meta_event_reporting_enabled"` +} + +// Initialize validates options, and sets default values for unset options. +// This is called automatically when creating a new Tracer. +func (opts *Options) Initialize() error { + err := opts.Validate() + if err != nil { + return err + } + + // Note: opts is a copy of the user's data, ok to modify. + if opts.MaxBufferedSpans == 0 { + opts.MaxBufferedSpans = DefaultMaxSpans + } + if opts.MaxLogKeyLen == 0 { + opts.MaxLogKeyLen = DefaultMaxLogKeyLen + } + if opts.MaxLogValueLen == 0 { + opts.MaxLogValueLen = DefaultMaxLogValueLen + } + if opts.MaxLogsPerSpan == 0 { + opts.MaxLogsPerSpan = DefaultMaxLogsPerSpan + } + if opts.GRPCMaxCallSendMsgSizeBytes == 0 { + opts.GRPCMaxCallSendMsgSizeBytes = DefaultGRPCMaxCallSendMsgSizeBytes + } + if opts.ReportingPeriod == 0 { + opts.ReportingPeriod = DefaultMaxReportingPeriod + } + if opts.MinReportingPeriod == 0 { + opts.MinReportingPeriod = DefaultMinReportingPeriod + } + if opts.ReportTimeout == 0 { + opts.ReportTimeout = DefaultReportTimeout + } + if opts.ReconnectPeriod == 0 { + opts.ReconnectPeriod = DefaultReconnectPeriod + } + if opts.Tags == nil { + opts.Tags = map[string]interface{}{} + } + + // Set some default attributes if not found in options + if _, found := opts.Tags[ComponentNameKey]; !found { + opts.Tags[ComponentNameKey] = path.Base(os.Args[0]) + } + if _, found := opts.Tags[HostnameKey]; !found { + hostname, _ := os.Hostname() + opts.Tags[HostnameKey] = hostname + } + if _, found := opts.Tags[CommandLineKey]; !found { + opts.Tags[CommandLineKey] = strings.Join(os.Args, " ") + } + + opts.ReconnectPeriod = time.Duration(float64(opts.ReconnectPeriod) * (1 + 0.2*rand.Float64())) + + if opts.Collector.Host == "" { + opts.Collector.Host = DefaultGRPCCollectorHost + } + + if opts.Collector.Port <= 0 { + if opts.Collector.Plaintext { + opts.Collector.Port = DefaultPlainPort + } else { + opts.Collector.Port = DefaultSecurePort + } + } + + return nil +} + +// Validate checks that all required fields are set, and no options are incorrectly +// configured. +func (opts *Options) Validate() error { + if _, found := opts.Tags[GUIDKey]; found { + return errInvalidGUIDKey + } + + if len(opts.Collector.CustomCACertFile) != 0 { + if _, err := os.Stat(opts.Collector.CustomCACertFile); os.IsNotExist(err) { + return err + } + } + return nil +} + +// SetSpanID is a opentracing.StartSpanOption that sets an +// explicit SpanID. It must be used in conjunction with +// SetTraceID or the result is undefined. +type SetSpanID uint64 + +// Apply satisfies the StartSpanOption interface. +func (sid SetSpanID) Apply(sso *opentracing.StartSpanOptions) {} +func (sid SetSpanID) applyLS(sso *startSpanOptions) { + sso.SetSpanID = uint64(sid) +} + +// SetTraceID is an opentracing.StartSpanOption that sets an +// explicit TraceID. It must be used in order to set an +// explicit SpanID or ParentSpanID. If a ChildOf or +// FollowsFrom span relation is also set in the start options, +// it will override this value. +type SetTraceID uint64 + +// Apply satisfies the StartSpanOption interface. +func (sid SetTraceID) Apply(sso *opentracing.StartSpanOptions) {} +func (sid SetTraceID) applyLS(sso *startSpanOptions) { + sso.SetTraceID = uint64(sid) +} + +// SetParentSpanID is an opentracing.StartSpanOption that sets +// an explicit parent SpanID. It must be used in conjunction +// with SetTraceID or the result is undefined. If the value +// is zero, it will be disregarded. If a ChildOf or +// FollowsFrom span relation is also set in the start options, +// it will override this value. +type SetParentSpanID uint64 + +// Apply satisfies the StartSpanOption interface. +func (sid SetParentSpanID) Apply(sso *opentracing.StartSpanOptions) {} +func (sid SetParentSpanID) applyLS(sso *startSpanOptions) { + sso.SetParentSpanID = uint64(sid) +} + +// lightStepStartSpanOption is used to identify lightstep-specific Span options. +type lightStepStartSpanOption interface { + applyLS(*startSpanOptions) +} + +type startSpanOptions struct { + Options opentracing.StartSpanOptions + + // Options to explicitly set span_id, trace_id, + // parent_span_id, expected to be used when exporting spans + // from another system into LightStep via opentracing APIs. + SetSpanID uint64 + SetParentSpanID uint64 + SetTraceID uint64 +} + +func newStartSpanOptions(sso []opentracing.StartSpanOption) startSpanOptions { + opts := startSpanOptions{} + for _, o := range sso { + switch o := o.(type) { + case lightStepStartSpanOption: + o.applyLS(&opts) + default: + o.Apply(&opts.Options) + } + } + return opts +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/propagation.go b/vendor/github.com/lightstep/lightstep-tracer-go/propagation.go new file mode 100644 index 00000000..7ab21ef7 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/propagation.go @@ -0,0 +1,10 @@ +package lightstep + +import "github.com/opentracing/opentracing-go" + +// Propagator provides the ability to inject/extract different +// formats of span information. Currently supported: ls, b3 +type Propagator interface { + Inject(opentracing.SpanContext, interface{}) error + Extract(interface{}) (opentracing.SpanContext, error) +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/propagation_b3.go b/vendor/github.com/lightstep/lightstep-tracer-go/propagation_b3.go new file mode 100644 index 00000000..ce695a52 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/propagation_b3.go @@ -0,0 +1,82 @@ +package lightstep + +import ( + "fmt" + "strconv" + + "github.com/opentracing/opentracing-go" +) + +const ( + b3Prefix = "x-b3-" + b3FieldNameTraceID = b3Prefix + "traceid" + b3FieldNameSpanID = b3Prefix + "spanid" + b3FieldNameSampled = b3Prefix + "sampled" +) + +// B3Propagator propagates context in the b3 format +var B3Propagator b3Propagator + +type b3Propagator struct{} + +func b3TraceIDParser(v string) (uint64, uint64, error) { + // handle 128-bit IDs + if len(v) == 32 { + upper, err := strconv.ParseUint(v[:15], 16, 64) + var lower uint64 + if err != nil { + return lower, upper, err + } + lower, err = strconv.ParseUint(v[16:], 16, 64) + return lower, upper, err + } + id, err := strconv.ParseUint(v, 16, 64) + return id, 0, err +} + +func formatTraceID(lower uint64, upper uint64) string { + // check if 64bit + if upper == 0 { + return fmt.Sprintf("%s", strconv.FormatUint(lower, 16)) + } + return fmt.Sprintf("%s%s", strconv.FormatUint(upper, 16), strconv.FormatUint(lower, 16)) +} + +func (b3Propagator) Inject( + spanContext opentracing.SpanContext, + opaqueCarrier interface{}, +) error { + sc, ok := spanContext.(SpanContext) + if !ok { + return opentracing.ErrInvalidSpanContext + } + sample := "1" + if len(sc.Baggage[b3FieldNameSampled]) > 0 { + sample = sc.Baggage[b3FieldNameSampled] + } + + propagator := textMapPropagator{ + traceIDKey: b3FieldNameTraceID, + traceID: formatTraceID(sc.TraceID, sc.TraceIDUpper), + spanIDKey: b3FieldNameSpanID, + spanID: strconv.FormatUint(sc.SpanID, 16), + sampledKey: b3FieldNameSampled, + sampled: sample, + } + + return propagator.Inject(spanContext, opaqueCarrier) +} + +func (b3Propagator) Extract( + opaqueCarrier interface{}, +) (opentracing.SpanContext, error) { + + propagator := textMapPropagator{ + traceIDKey: b3FieldNameTraceID, + spanIDKey: b3FieldNameSpanID, + sampledKey: b3FieldNameSampled, + parseTraceID: b3TraceIDParser, + } + + return propagator.Extract(opaqueCarrier) +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/propagation_binary.go b/vendor/github.com/lightstep/lightstep-tracer-go/propagation_binary.go new file mode 100644 index 00000000..cd4a6f79 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/propagation_binary.go @@ -0,0 +1,112 @@ +package lightstep + +import ( + "encoding/base64" + "io" + "io/ioutil" + + "github.com/gogo/protobuf/proto" + lightstep "github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb" + "github.com/opentracing/opentracing-go" +) + +// BinaryCarrier is used as the format parameter in inject/extract for lighstep binary propagation. +const BinaryCarrier = opentracing.Binary + +// BinaryPropagator propagates context in binary format +var BinaryPropagator binaryPropagator + +type binaryPropagator struct{} + +func (binaryPropagator) Inject( + spanContext opentracing.SpanContext, + opaqueCarrier interface{}, +) error { + sc, ok := spanContext.(SpanContext) + if !ok { + return opentracing.ErrInvalidSpanContext + } + data, err := proto.Marshal(&lightstep.BinaryCarrier{ + BasicCtx: &lightstep.BasicTracerCarrier{ + TraceId: sc.TraceID, + SpanId: sc.SpanID, + Sampled: true, + BaggageItems: sc.Baggage, + }, + }) + if err != nil { + return err + } + + switch carrier := opaqueCarrier.(type) { + case io.Writer: + buf := make([]byte, base64.StdEncoding.EncodedLen(len(data))) + base64.StdEncoding.Encode(buf, data) + _, err = carrier.Write(buf) + return err + case *string: + *carrier = base64.StdEncoding.EncodeToString(data) + case *[]byte: + *carrier = make([]byte, base64.StdEncoding.EncodedLen(len(data))) + base64.StdEncoding.Encode(*carrier, data) + default: + return opentracing.ErrInvalidCarrier + } + return nil +} + +func (binaryPropagator) Extract( + opaqueCarrier interface{}, +) (opentracing.SpanContext, error) { + var data []byte + var err error + + // Decode from string, *string, *[]byte, or []byte + switch carrier := opaqueCarrier.(type) { + case io.Reader: + buf, err := ioutil.ReadAll(carrier) + if err != nil { + return nil, err + } + data, err = decodeBase64Bytes(buf) + case *string: + if carrier != nil { + data, err = base64.StdEncoding.DecodeString(*carrier) + } + case string: + data, err = base64.StdEncoding.DecodeString(carrier) + case *[]byte: + if carrier != nil { + data, err = decodeBase64Bytes(*carrier) + } + case []byte: + data, err = decodeBase64Bytes(carrier) + default: + return nil, opentracing.ErrInvalidCarrier + } + if err != nil { + return nil, err + } + pb := &lightstep.BinaryCarrier{} + if err := proto.Unmarshal(data, pb); err != nil { + return nil, err + } + if pb.BasicCtx == nil { + return nil, opentracing.ErrInvalidCarrier + } + + return SpanContext{ + TraceID: pb.BasicCtx.TraceId, + SpanID: pb.BasicCtx.SpanId, + Baggage: pb.BasicCtx.BaggageItems, + }, nil +} + +func decodeBase64Bytes(in []byte) ([]byte, error) { + data := make([]byte, base64.StdEncoding.DecodedLen(len(in))) + n, err := base64.StdEncoding.Decode(data, in) + if err != nil { + return nil, err + } + return data[:n], nil +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/propagation_lightstep.go b/vendor/github.com/lightstep/lightstep-tracer-go/propagation_lightstep.go new file mode 100644 index 00000000..47fdc368 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/propagation_lightstep.go @@ -0,0 +1,58 @@ +package lightstep + +import ( + "strconv" + + "github.com/opentracing/opentracing-go" +) + +const ( + prefixTracerState = "ot-tracer-" + fieldNameTraceID = prefixTracerState + "traceid" + fieldNameSpanID = prefixTracerState + "spanid" + fieldNameSampled = prefixTracerState + "sampled" +) + +// LightStepPropagator propagates context in the LightStep format +var LightStepPropagator lightstepPropagator + +type lightstepPropagator struct{} + +func lightstepTraceIDParser(v string) (uint64, uint64, error) { + traceID, err := strconv.ParseUint(v, 16, 64) + return traceID, 0, err +} + +func (lightstepPropagator) Inject( + spanContext opentracing.SpanContext, + opaqueCarrier interface{}, +) error { + sc, ok := spanContext.(SpanContext) + if !ok { + return opentracing.ErrInvalidSpanContext + } + propagator := textMapPropagator{ + traceIDKey: fieldNameTraceID, + traceID: strconv.FormatUint(sc.TraceID, 16), + spanIDKey: fieldNameSpanID, + spanID: strconv.FormatUint(sc.SpanID, 16), + sampledKey: fieldNameSampled, + sampled: "true", + } + + return propagator.Inject(spanContext, opaqueCarrier) +} + +func (lightstepPropagator) Extract( + opaqueCarrier interface{}, +) (opentracing.SpanContext, error) { + + propagator := textMapPropagator{ + traceIDKey: fieldNameTraceID, + spanIDKey: fieldNameSpanID, + sampledKey: fieldNameSampled, + parseTraceID: lightstepTraceIDParser, + } + + return propagator.Extract(opaqueCarrier) +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/propagation_stack.go b/vendor/github.com/lightstep/lightstep-tracer-go/propagation_stack.go new file mode 100644 index 00000000..c36749cb --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/propagation_stack.go @@ -0,0 +1,52 @@ +package lightstep + +import ( + "errors" + + "github.com/opentracing/opentracing-go" +) + +// PropagatorStack provides a Propagator interface that supports +// multiple propagators per format. +type PropagatorStack struct { + propagators []Propagator +} + +// PushPropagator adds a Propagator to a list of configured propagators +func (stack *PropagatorStack) PushPropagator(p Propagator) { + stack.propagators = append(stack.propagators, p) +} + +// Inject iterates through configured propagators and calls +// their Inject functions +func (stack PropagatorStack) Inject( + spanContext opentracing.SpanContext, + opaqueCarrier interface{}, +) error { + if len(stack.propagators) == 0 { + return errors.New("No valid propagator configured") + } + for _, propagator := range stack.propagators { + propagator.Inject(spanContext, opaqueCarrier) + } + return nil +} + +// Extract iterates through configured propagators and +// returns the first successfully extracted context +func (stack PropagatorStack) Extract( + opaqueCarrier interface{}, +) (opentracing.SpanContext, error) { + if len(stack.propagators) == 0 { + return nil, errors.New("No valid propagator configured") + } + + for _, propagator := range stack.propagators { + context, err := propagator.Extract(opaqueCarrier) + if err == nil { + return context, nil + } + } + + return nil, errors.New("No valid propagator configured") +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/propagation_text.go b/vendor/github.com/lightstep/lightstep-tracer-go/propagation_text.go new file mode 100644 index 00000000..d3052c20 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/propagation_text.go @@ -0,0 +1,110 @@ +package lightstep + +import ( + "strconv" + "strings" + + "github.com/opentracing/opentracing-go" +) + +const ( + prefixBaggage = "ot-baggage-" + + tracerStateFieldCount = 3 +) + +var theTextMapPropagator textMapPropagator + +type traceIDParser func(string) (uint64, uint64, error) + +type textMapPropagator struct { + traceIDKey string + traceID string + + spanIDKey string + spanID string + + sampledKey string + sampled string + + parseTraceID traceIDParser +} + +func (p textMapPropagator) Inject( + spanContext opentracing.SpanContext, + opaqueCarrier interface{}, +) error { + sc, ok := spanContext.(SpanContext) + if !ok { + return opentracing.ErrInvalidSpanContext + } + carrier, ok := opaqueCarrier.(opentracing.TextMapWriter) + if !ok { + return opentracing.ErrInvalidCarrier + } + carrier.Set(p.traceIDKey, p.traceID) + carrier.Set(p.spanIDKey, p.spanID) + carrier.Set(p.sampledKey, p.sampled) + + for k, v := range sc.Baggage { + carrier.Set(prefixBaggage+k, v) + } + return nil +} + +func (p textMapPropagator) Extract( + opaqueCarrier interface{}, +) (opentracing.SpanContext, error) { + carrier, ok := opaqueCarrier.(opentracing.TextMapReader) + if !ok { + return nil, opentracing.ErrInvalidCarrier + } + + requiredFieldCount := 0 + var traceIDUpper, traceIDLower, spanID uint64 + var sampled string + var err error + decodedBaggage := map[string]string{} + err = carrier.ForeachKey(func(k, v string) error { + switch strings.ToLower(k) { + case p.traceIDKey: + traceIDLower, traceIDUpper, err = p.parseTraceID(v) + if err != nil { + return opentracing.ErrSpanContextCorrupted + } + requiredFieldCount++ + case p.spanIDKey: + spanID, err = strconv.ParseUint(v, 16, 64) + if err != nil { + return opentracing.ErrSpanContextCorrupted + } + requiredFieldCount++ + case p.sampledKey: + sampled = v + requiredFieldCount++ + default: + lowercaseK := strings.ToLower(k) + if strings.HasPrefix(lowercaseK, prefixBaggage) { + decodedBaggage[strings.TrimPrefix(lowercaseK, prefixBaggage)] = v + } + } + return nil + }) + if err != nil { + return nil, err + } + if requiredFieldCount < tracerStateFieldCount { + if requiredFieldCount == 0 { + return nil, opentracing.ErrSpanContextNotFound + } + return nil, opentracing.ErrSpanContextCorrupted + } + + return SpanContext{ + TraceIDUpper: traceIDUpper, + TraceID: traceIDLower, + SpanID: spanID, + Sampled: sampled, + Baggage: decodedBaggage, + }, nil +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/proto_converter.go b/vendor/github.com/lightstep/lightstep-tracer-go/proto_converter.go new file mode 100644 index 00000000..d60dc368 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/proto_converter.go @@ -0,0 +1,191 @@ +package lightstep + +import ( + "fmt" + "reflect" + "time" + + "github.com/gogo/protobuf/types" + "github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb" + "github.com/opentracing/opentracing-go" +) + +type protoConverter struct { + verbose bool + maxLogKeyLen int // see GrpcOptions.MaxLogKeyLen + maxLogValueLen int // see GrpcOptions.MaxLogValueLen +} + +func newProtoConverter(options Options) *protoConverter { + return &protoConverter{ + verbose: options.Verbose, + maxLogKeyLen: options.MaxLogKeyLen, + maxLogValueLen: options.MaxLogValueLen, + } +} + +func (converter *protoConverter) toReportRequest( + reporterID uint64, + attributes map[string]string, + accessToken string, + buffer *reportBuffer, +) *collectorpb.ReportRequest { + return &collectorpb.ReportRequest{ + Reporter: converter.toReporter(reporterID, attributes), + Auth: converter.toAuth(accessToken), + Spans: converter.toSpans(buffer), + InternalMetrics: converter.toInternalMetrics(buffer), + } + +} + +func (converter *protoConverter) toReporter(reporterID uint64, attributes map[string]string) *collectorpb.Reporter { + return &collectorpb.Reporter{ + ReporterId: reporterID, + Tags: converter.toFields(attributes), + } +} + +func (converter *protoConverter) toAuth(accessToken string) *collectorpb.Auth { + return &collectorpb.Auth{ + AccessToken: accessToken, + } +} + +func (converter *protoConverter) toSpans(buffer *reportBuffer) []*collectorpb.Span { + spans := make([]*collectorpb.Span, len(buffer.rawSpans)) + for i, span := range buffer.rawSpans { + spans[i] = converter.toSpan(span, buffer) + } + return spans +} + +func (converter *protoConverter) toSpan(span RawSpan, buffer *reportBuffer) *collectorpb.Span { + return &collectorpb.Span{ + SpanContext: converter.toSpanContext(&span.Context), + OperationName: span.Operation, + References: converter.toReference(span.ParentSpanID), + StartTimestamp: converter.toTimestamp(span.Start), + DurationMicros: converter.fromDuration(span.Duration), + Tags: converter.fromTags(span.Tags), + Logs: converter.toLogs(span.Logs, buffer), + } +} + +func (converter *protoConverter) toInternalMetrics(buffer *reportBuffer) *collectorpb.InternalMetrics { + return &collectorpb.InternalMetrics{ + StartTimestamp: converter.toTimestamp(buffer.reportStart), + DurationMicros: converter.fromTimeRange(buffer.reportStart, buffer.reportEnd), + Counts: converter.toMetricsSample(buffer), + } +} + +func (converter *protoConverter) toMetricsSample(buffer *reportBuffer) []*collectorpb.MetricsSample { + return []*collectorpb.MetricsSample{ + { + Name: spansDropped, + Value: &collectorpb.MetricsSample_IntValue{IntValue: buffer.droppedSpanCount}, + }, + { + Name: logEncoderErrors, + Value: &collectorpb.MetricsSample_IntValue{IntValue: buffer.logEncoderErrorCount}, + }, + } +} + +func (converter *protoConverter) fromTags(tags opentracing.Tags) []*collectorpb.KeyValue { + fields := make([]*collectorpb.KeyValue, 0, len(tags)) + for key, tag := range tags { + fields = append(fields, converter.toField(key, tag)) + } + return fields +} + +func (converter *protoConverter) toField(key string, value interface{}) *collectorpb.KeyValue { + field := collectorpb.KeyValue{Key: key} + reflectedValue := reflect.ValueOf(value) + switch reflectedValue.Kind() { + case reflect.String: + field.Value = &collectorpb.KeyValue_StringValue{StringValue: reflectedValue.String()} + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + field.Value = &collectorpb.KeyValue_IntValue{IntValue: reflectedValue.Convert(intType).Int()} + case reflect.Float32, reflect.Float64: + field.Value = &collectorpb.KeyValue_DoubleValue{DoubleValue: reflectedValue.Float()} + case reflect.Bool: + field.Value = &collectorpb.KeyValue_BoolValue{BoolValue: reflectedValue.Bool()} + default: + var s string + switch value := value.(type) { + case fmt.Stringer: + s = value.String() + case error: + s = value.Error() + default: + s = fmt.Sprintf("%#v", value) + emitEvent(newEventUnsupportedValue(key, value, nil)) + } + field.Value = &collectorpb.KeyValue_StringValue{StringValue: s} + } + return &field +} + +func (converter *protoConverter) toLogs(records []opentracing.LogRecord, buffer *reportBuffer) []*collectorpb.Log { + logs := make([]*collectorpb.Log, len(records)) + for i, record := range records { + logs[i] = converter.toLog(record, buffer) + } + return logs +} + +func (converter *protoConverter) toLog(record opentracing.LogRecord, buffer *reportBuffer) *collectorpb.Log { + log := &collectorpb.Log{ + Timestamp: converter.toTimestamp(record.Timestamp), + } + marshalFields(converter, log, record.Fields, buffer) + return log +} + +func (converter *protoConverter) toFields(attributes map[string]string) []*collectorpb.KeyValue { + tags := make([]*collectorpb.KeyValue, 0, len(attributes)) + for key, value := range attributes { + tags = append(tags, converter.toField(key, value)) + } + return tags +} + +func (converter *protoConverter) toSpanContext(sc *SpanContext) *collectorpb.SpanContext { + return &collectorpb.SpanContext{ + TraceId: sc.TraceID, + SpanId: sc.SpanID, + Baggage: sc.Baggage, + } +} + +func (converter *protoConverter) toReference(parentSpanID uint64) []*collectorpb.Reference { + if parentSpanID == 0 { + return nil + } + return []*collectorpb.Reference{ + { + Relationship: collectorpb.Reference_CHILD_OF, + SpanContext: &collectorpb.SpanContext{ + SpanId: parentSpanID, + }, + }, + } +} + +func (converter *protoConverter) toTimestamp(t time.Time) *types.Timestamp { + return &types.Timestamp{ + Seconds: t.Unix(), + Nanos: int32(t.Nanosecond()), + } +} + +func (converter *protoConverter) fromDuration(d time.Duration) uint64 { + return uint64(d / time.Microsecond) +} + +func (converter *protoConverter) fromTimeRange(oldestTime time.Time, youngestTime time.Time) uint64 { + return converter.fromDuration(youngestTime.Sub(oldestTime)) +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/proto_logencoder.go b/vendor/github.com/lightstep/lightstep-tracer-go/proto_logencoder.go new file mode 100644 index 00000000..4ce3a144 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/proto_logencoder.go @@ -0,0 +1,155 @@ +package lightstep + +import ( + "encoding/json" + "fmt" + + "github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb" + "github.com/opentracing/opentracing-go/log" +) + +const ( + ellipsis = "…" +) + +// An implementation of the log.Encoder interface +type grpcLogFieldEncoder struct { + converter *protoConverter + buffer *reportBuffer + keyValues []*collectorpb.KeyValue +} + +func marshalFields( + converter *protoConverter, + protoLog *collectorpb.Log, + fields []log.Field, + buffer *reportBuffer, +) { + logFieldEncoder := grpcLogFieldEncoder{ + converter: converter, + buffer: buffer, + keyValues: make([]*collectorpb.KeyValue, 0, len(fields)), + } + for _, field := range fields { + field.Marshal(&logFieldEncoder) + } + protoLog.Fields = logFieldEncoder.keyValues +} + +func (lfe *grpcLogFieldEncoder) EmitString(key, value string) { + var keyValue collectorpb.KeyValue + lfe.setSafeKey(&keyValue, key) + lfe.setSafeStringValue(&keyValue, value) + lfe.emitKeyValue(&keyValue) +} + +func (lfe *grpcLogFieldEncoder) EmitBool(key string, value bool) { + var keyValue collectorpb.KeyValue + lfe.setSafeKey(&keyValue, key) + keyValue.Value = &collectorpb.KeyValue_BoolValue{BoolValue: value} + lfe.emitKeyValue(&keyValue) +} + +func (lfe *grpcLogFieldEncoder) EmitInt(key string, value int) { + var keyValue collectorpb.KeyValue + lfe.setSafeKey(&keyValue, key) + keyValue.Value = &collectorpb.KeyValue_IntValue{IntValue: int64(value)} + lfe.emitKeyValue(&keyValue) +} + +func (lfe *grpcLogFieldEncoder) EmitInt32(key string, value int32) { + var keyValue collectorpb.KeyValue + lfe.setSafeKey(&keyValue, key) + keyValue.Value = &collectorpb.KeyValue_IntValue{IntValue: int64(value)} + lfe.emitKeyValue(&keyValue) +} + +func (lfe *grpcLogFieldEncoder) EmitInt64(key string, value int64) { + var keyValue collectorpb.KeyValue + lfe.setSafeKey(&keyValue, key) + keyValue.Value = &collectorpb.KeyValue_IntValue{IntValue: value} + lfe.emitKeyValue(&keyValue) +} + +// N.B. We are using a string encoding for 32- and 64-bit unsigned +// integers because it will require a protocol change to treat this +// properly. Revisit this after the OC/OT merger. LS-1175 +// +// We could safely continue using the int64 value to represent uint32 +// without breaking the stringified representation, but for +// consistency with uint64, we're encoding all unsigned integers as +// strings. +func (lfe *grpcLogFieldEncoder) EmitUint32(key string, value uint32) { + var keyValue collectorpb.KeyValue + lfe.setSafeKey(&keyValue, key) + keyValue.Value = &collectorpb.KeyValue_StringValue{StringValue: fmt.Sprint(value)} + lfe.emitKeyValue(&keyValue) +} + +func (lfe *grpcLogFieldEncoder) EmitUint64(key string, value uint64) { + var keyValue collectorpb.KeyValue + lfe.setSafeKey(&keyValue, key) + keyValue.Value = &collectorpb.KeyValue_StringValue{StringValue: fmt.Sprint(value)} + lfe.emitKeyValue(&keyValue) +} + +func (lfe *grpcLogFieldEncoder) EmitFloat32(key string, value float32) { + var keyValue collectorpb.KeyValue + lfe.setSafeKey(&keyValue, key) + keyValue.Value = &collectorpb.KeyValue_DoubleValue{DoubleValue: float64(value)} + lfe.emitKeyValue(&keyValue) +} + +func (lfe *grpcLogFieldEncoder) EmitFloat64(key string, value float64) { + var keyValue collectorpb.KeyValue + lfe.setSafeKey(&keyValue, key) + keyValue.Value = &collectorpb.KeyValue_DoubleValue{DoubleValue: value} + lfe.emitKeyValue(&keyValue) +} + +func (lfe *grpcLogFieldEncoder) EmitObject(key string, value interface{}) { + var keyValue collectorpb.KeyValue + lfe.setSafeKey(&keyValue, key) + jsonBytes, err := json.Marshal(value) + if err != nil { + emitEvent(newEventUnsupportedValue(key, value, err)) + lfe.buffer.logEncoderErrorCount++ + lfe.setSafeStringValue(&keyValue, "") + lfe.emitKeyValue(&keyValue) + return + } + lfe.setSafeJSONValue(&keyValue, string(jsonBytes)) + lfe.emitKeyValue(&keyValue) +} +func (lfe *grpcLogFieldEncoder) EmitLazyLogger(value log.LazyLogger) { + // Delegate to `value` to do the late-bound encoding. + value(lfe) +} + +func (lfe *grpcLogFieldEncoder) setSafeStringValue(keyValue *collectorpb.KeyValue, str string) { + if lfe.converter.maxLogValueLen > 0 && len(str) > lfe.converter.maxLogValueLen { + str = str[:(lfe.converter.maxLogValueLen-1)] + ellipsis + } + keyValue.Value = &collectorpb.KeyValue_StringValue{StringValue: str} +} + +func (lfe *grpcLogFieldEncoder) setSafeJSONValue(keyValue *collectorpb.KeyValue, json string) { + if lfe.converter.maxLogValueLen > 0 && len(json) > lfe.converter.maxLogValueLen { + str := json[:(lfe.converter.maxLogValueLen-1)] + ellipsis + keyValue.Value = &collectorpb.KeyValue_StringValue{StringValue: str} + return + } + keyValue.Value = &collectorpb.KeyValue_JsonValue{JsonValue: json} +} + +func (lfe *grpcLogFieldEncoder) setSafeKey(keyValue *collectorpb.KeyValue, key string) { + if lfe.converter.maxLogKeyLen > 0 && len(key) > lfe.converter.maxLogKeyLen { + keyValue.Key = key[:(lfe.converter.maxLogKeyLen-1)] + ellipsis + return + } + keyValue.Key = key +} + +func (lfe *grpcLogFieldEncoder) emitKeyValue(keyValue *collectorpb.KeyValue) { + lfe.keyValues = append(lfe.keyValues, keyValue) +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/raw_span.go b/vendor/github.com/lightstep/lightstep-tracer-go/raw_span.go new file mode 100644 index 00000000..f8cc2834 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/raw_span.go @@ -0,0 +1,79 @@ +package lightstep + +import ( + "time" + + "github.com/opentracing/opentracing-go" +) + +// RawSpan encapsulates all state associated with a (finished) LightStep Span. +type RawSpan struct { + // Those recording the RawSpan should also record the contents of its + // SpanContext. + Context SpanContext + + // The SpanID of this SpanContext's first intra-trace reference (i.e., + // "parent"), or 0 if there is no parent. + ParentSpanID uint64 + + // The name of the "operation" this span is an instance of. (Called a "span + // name" in some implementations) + Operation string + + // We store rather than so that only + // one of the timestamps has global clock uncertainty issues. + Start time.Time + Duration time.Duration + + // Essentially an extension mechanism. Can be used for many purposes, + // not to be enumerated here. + Tags opentracing.Tags + + // The span's "microlog". + Logs []opentracing.LogRecord +} + +// SpanContext holds lightstep-specific Span metadata. +type SpanContext struct { + // A probabilistically unique identifier for a [multi-span] trace. + TraceID uint64 + + // Most significant bits of a 128-bit TraceID + TraceIDUpper uint64 + + // A probabilistically unique identifier for a span. + SpanID uint64 + + // Propagates sampling decision + Sampled string + + // The span's associated baggage. + Baggage map[string]string // initialized on first use +} + +// ForeachBaggageItem belongs to the opentracing.SpanContext interface +func (c SpanContext) ForeachBaggageItem(handler func(k, v string) bool) { + for k, v := range c.Baggage { + if !handler(k, v) { + break + } + } +} + +// WithBaggageItem returns an entirely new basictracer SpanContext with the +// given key:value baggage pair set. +func (c SpanContext) WithBaggageItem(key, val string) SpanContext { + var newBaggage map[string]string + if c.Baggage == nil { + newBaggage = map[string]string{key: val} + } else { + newBaggage = make(map[string]string, len(c.Baggage)+1) + for k, v := range c.Baggage { + newBaggage[k] = v + } + newBaggage[key] = val + } + // Use positional parameters so the compiler will help catch new fields. + + return SpanContext{c.TraceID, c.TraceIDUpper, c.SpanID, c.Sampled, newBaggage} +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/report_buffer.go b/vendor/github.com/lightstep/lightstep-tracer-go/report_buffer.go new file mode 100644 index 00000000..ae58a4d2 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/report_buffer.go @@ -0,0 +1,79 @@ +package lightstep + +import ( + "time" +) + +type reportBuffer struct { + rawSpans []RawSpan + droppedSpanCount int64 + logEncoderErrorCount int64 + reportStart time.Time + reportEnd time.Time +} + +func newSpansBuffer(size int) (b reportBuffer) { + b.rawSpans = make([]RawSpan, 0, size) + b.reportStart = time.Time{} + b.reportEnd = time.Time{} + return +} + +func (b *reportBuffer) isHalfFull() bool { + return len(b.rawSpans) > cap(b.rawSpans)/2 +} + +func (b *reportBuffer) setCurrent(now time.Time) { + b.reportStart = now + b.reportEnd = now +} + +func (b *reportBuffer) setFlushing(now time.Time) { + b.reportEnd = now +} + +func (b *reportBuffer) clear() { + b.rawSpans = b.rawSpans[:0] + b.reportStart = time.Time{} + b.reportEnd = time.Time{} + b.droppedSpanCount = 0 + b.logEncoderErrorCount = 0 +} + +func (b *reportBuffer) addSpan(span RawSpan) { + if len(b.rawSpans) == cap(b.rawSpans) { + b.droppedSpanCount++ + return + } + b.rawSpans = append(b.rawSpans, span) +} + +// mergeFrom combines the spans and metadata in `from` with `into`, +// returning with `from` empty and `into` having a subset of the +// combined data. +func (b *reportBuffer) mergeFrom(from *reportBuffer) { + b.droppedSpanCount += from.droppedSpanCount + b.logEncoderErrorCount += from.logEncoderErrorCount + if from.reportStart.Before(b.reportStart) { + b.reportStart = from.reportStart + } + if from.reportEnd.After(b.reportEnd) { + b.reportEnd = from.reportEnd + } + + // Note: Somewhat arbitrarily dropping the spans that won't + // fit; could be more principled here to avoid bias. + have := len(b.rawSpans) + space := cap(b.rawSpans) - have + unreported := len(from.rawSpans) + + if space > unreported { + space = unreported + } + + b.rawSpans = append(b.rawSpans, from.rawSpans[0:space]...) + + b.droppedSpanCount += int64(unreported - space) + + from.clear() +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/span.go b/vendor/github.com/lightstep/lightstep-tracer-go/span.go new file mode 100644 index 00000000..6eb2679e --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/span.go @@ -0,0 +1,302 @@ +package lightstep + +import ( + "sync" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/log" +) + +// Implements the `Span` interface. Created via tracerImpl (see +// `New()`). +type spanImpl struct { + tracer *tracerImpl + sync.Mutex // protects the fields below + finished bool + raw RawSpan + // The number of logs dropped because of MaxLogsPerSpan. + numDroppedLogs int +} + +func newSpan(operationName string, tracer *tracerImpl, sso []opentracing.StartSpanOption) *spanImpl { + opts := newStartSpanOptions(sso) + + // Start time. + startTime := opts.Options.StartTime + if startTime.IsZero() { + startTime = time.Now() + } + + // Build the new span. This is the only allocation: We'll return this as + // an opentracing.Span. + sp := &spanImpl{} + + // It's meaningless to provide either SpanID or ParentSpanID + // without also providing TraceID, so just test for TraceID. + if opts.SetTraceID != 0 { + sp.raw.Context.TraceID = opts.SetTraceID + sp.raw.Context.SpanID = opts.SetSpanID + sp.raw.ParentSpanID = opts.SetParentSpanID + } + + // Look for a parent in the list of References. + // + // TODO: would be nice if we did something with all References, not just + // the first one. +ReferencesLoop: + for _, ref := range opts.Options.References { + switch ref.Type { + case opentracing.ChildOfRef, opentracing.FollowsFromRef: + refCtx, ok := ref.ReferencedContext.(SpanContext) + if !ok { + break ReferencesLoop + } + sp.raw.Context.TraceID = refCtx.TraceID + sp.raw.ParentSpanID = refCtx.SpanID + + if l := len(refCtx.Baggage); l > 0 { + sp.raw.Context.Baggage = make(map[string]string, l) + for k, v := range refCtx.Baggage { + sp.raw.Context.Baggage[k] = v + } + } + break ReferencesLoop + } + } + + if sp.raw.Context.TraceID == 0 { + // TraceID not set by parent reference or explicitly + sp.raw.Context.TraceID, sp.raw.Context.SpanID = genSeededGUID2() + } else if sp.raw.Context.SpanID == 0 { + // TraceID set but SpanID not set + sp.raw.Context.SpanID = genSeededGUID() + } + + sp.tracer = tracer + sp.raw.Operation = operationName + sp.raw.Start = startTime + sp.raw.Duration = -1 + sp.raw.Tags = opts.Options.Tags + + if tracer.opts.MetaEventReportingEnabled && !sp.IsMeta() { + opentracing.StartSpan(LSMetaEvent_SpanStartOperation, + opentracing.Tag{Key: LSMetaEvent_MetaEventKey, Value: true}, + opentracing.Tag{Key: LSMetaEvent_SpanIdKey, Value: sp.raw.Context.SpanID}, + opentracing.Tag{Key: LSMetaEvent_TraceIdKey, Value: sp.raw.Context.TraceID}). + Finish() + } + return sp +} + +func (s *spanImpl) SetOperationName(operationName string) opentracing.Span { + s.Lock() + defer s.Unlock() + + if s.finished { + return s + } + + s.raw.Operation = operationName + return s +} + +func (s *spanImpl) SetTag(key string, value interface{}) opentracing.Span { + s.Lock() + defer s.Unlock() + + if s.finished { + return s + } + + if s.raw.Tags == nil { + s.raw.Tags = opentracing.Tags{} + } + s.raw.Tags[key] = value + return s +} + +func (s *spanImpl) LogKV(keyValues ...interface{}) { + fields, err := log.InterleavedKVToFields(keyValues...) + if err != nil { + s.LogFields(log.Error(err), log.String("function", "LogKV")) + return + } + s.LogFields(fields...) +} + +func (s *spanImpl) appendLog(lr opentracing.LogRecord) { + maxLogs := s.tracer.opts.MaxLogsPerSpan + if maxLogs == 0 || len(s.raw.Logs) < maxLogs { + s.raw.Logs = append(s.raw.Logs, lr) + return + } + + // We have too many logs. We don't touch the first numOld logs; we treat the + // rest as a circular buffer and overwrite the oldest log among those. + numOld := (maxLogs - 1) / 2 + numNew := maxLogs - numOld + s.raw.Logs[numOld+s.numDroppedLogs%numNew] = lr + s.numDroppedLogs++ +} + +func (s *spanImpl) LogFields(fields ...log.Field) { + s.Lock() + defer s.Unlock() + + if s.finished || s.tracer.opts.DropSpanLogs { + return + } + + lr := opentracing.LogRecord{ + Fields: fields, + } + if lr.Timestamp.IsZero() { + lr.Timestamp = time.Now() + } + s.appendLog(lr) +} + +func (s *spanImpl) LogEvent(event string) { + s.Log(opentracing.LogData{ + Event: event, + }) +} + +func (s *spanImpl) LogEventWithPayload(event string, payload interface{}) { + s.Log(opentracing.LogData{ + Event: event, + Payload: payload, + }) +} + +func (s *spanImpl) Log(ld opentracing.LogData) { + s.Lock() + defer s.Unlock() + + if s.finished || s.tracer.opts.DropSpanLogs { + return + } + + if ld.Timestamp.IsZero() { + ld.Timestamp = time.Now() + } + + s.appendLog(ld.ToLogRecord()) +} + +func (s *spanImpl) Finish() { + s.FinishWithOptions(opentracing.FinishOptions{}) +} + +// rotateLogBuffer rotates the records in the buffer: records 0 to pos-1 move at +// the end (i.e. pos circular left shifts). +func rotateLogBuffer(buf []opentracing.LogRecord, pos int) { + // This algorithm is described in: + // http://www.cplusplus.com/reference/algorithm/rotate + for first, middle, next := 0, pos, pos; first != middle; { + buf[first], buf[next] = buf[next], buf[first] + first++ + next++ + if next == len(buf) { + next = middle + } else if first == middle { + middle = next + } + } +} + +func (s *spanImpl) FinishWithOptions(opts opentracing.FinishOptions) { + s.Lock() + defer s.Unlock() + + if s.finished { + return + } + + s.finished = true + + finishTime := opts.FinishTime + if finishTime.IsZero() { + finishTime = time.Now() + } + duration := finishTime.Sub(s.raw.Start) + + for _, lr := range opts.LogRecords { + s.appendLog(lr) + } + for _, ld := range opts.BulkLogData { + s.appendLog(ld.ToLogRecord()) + } + + if s.numDroppedLogs > 0 { + // We dropped some log events, which means that we used part of Logs as a + // circular buffer (see appendLog). De-circularize it. + numOld := (len(s.raw.Logs) - 1) / 2 + numNew := len(s.raw.Logs) - numOld + rotateLogBuffer(s.raw.Logs[numOld:], s.numDroppedLogs%numNew) + + // Replace the log in the middle (the oldest "new" log) with information + // about the dropped logs. This means that we are effectively dropping one + // more "new" log. + numDropped := s.numDroppedLogs + 1 + s.raw.Logs[numOld] = opentracing.LogRecord{ + // Keep the timestamp of the last dropped event. + Timestamp: s.raw.Logs[numOld].Timestamp, + Fields: []log.Field{ + log.String("event", "dropped Span logs"), + log.Int("dropped_log_count", numDropped), + log.String("component", "basictracer"), + }, + } + } + + s.raw.Duration = duration + + s.tracer.RecordSpan(s.raw) + if s.tracer.opts.MetaEventReportingEnabled && !s.IsMeta() { + opentracing.StartSpan(LSMetaEvent_SpanFinishOperation, + opentracing.Tag{Key: LSMetaEvent_MetaEventKey, Value: true}, + opentracing.Tag{Key: LSMetaEvent_SpanIdKey, Value: s.raw.Context.SpanID}, + opentracing.Tag{Key: LSMetaEvent_TraceIdKey, Value: s.raw.Context.TraceID}). + Finish() + } +} + +func (s *spanImpl) Tracer() opentracing.Tracer { + return s.tracer +} + +func (s *spanImpl) Context() opentracing.SpanContext { + return s.raw.Context +} + +func (s *spanImpl) SetBaggageItem(key, val string) opentracing.Span { + s.Lock() + defer s.Unlock() + + if s.finished { + return s + } + + s.raw.Context = s.raw.Context.WithBaggageItem(key, val) + return s +} + +func (s *spanImpl) BaggageItem(key string) string { + s.Lock() + defer s.Unlock() + return s.raw.Context.Baggage[key] +} + +func (s *spanImpl) Operation() string { + return s.raw.Operation +} + +func (s *spanImpl) Start() time.Time { + return s.raw.Start +} + +func (s *spanImpl) IsMeta() bool { + return s.raw.Tags["lightstep.meta_event"] != nil +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/tag_version.sh b/vendor/github.com/lightstep/lightstep-tracer-go/tag_version.sh new file mode 100644 index 00000000..1cab1fc5 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/tag_version.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +VERSION=$(cat ./VERSION) + +cat > version.go < 0 { + reportErrorEvent = newEventFlushError(fmt.Errorf(resp.GetErrors()[0]), FlushErrorReport) + } + + if reportErrorEvent != nil { + emitEvent(reportErrorEvent) + } + emitEvent(tracer.postFlush(reportErrorEvent)) + + if err == nil && resp.DevMode() { + tracer.metaEventReportingEnabled = true + } + + if err == nil && !resp.DevMode() { + tracer.metaEventReportingEnabled = false + } + + if err == nil && resp.Disable() { + tracer.Disable() + } +} + +// preFlush handles lock-protected data manipulation before flushing +func (tracer *tracerImpl) preFlush() *eventFlushError { + tracer.lock.Lock() + defer tracer.lock.Unlock() + + if tracer.disabled { + return newEventFlushError(errFlushFailedTracerClosed, FlushErrorTracerDisabled) + } + + if tracer.connection == nil { + return newEventFlushError(errFlushFailedTracerClosed, FlushErrorTracerClosed) + } + + now := time.Now() + tracer.buffer, tracer.flushing = tracer.flushing, tracer.buffer + tracer.reportInFlight = true + tracer.flushing.setFlushing(now) + tracer.buffer.setCurrent(now) + tracer.lastReportAttempt = now + return nil +} + +// postFlush handles lock-protected data manipulation after flushing +func (tracer *tracerImpl) postFlush(flushEventError *eventFlushError) *eventStatusReport { + tracer.lock.Lock() + defer tracer.lock.Unlock() + + tracer.reportInFlight = false + + statusReportEvent := newEventStatusReport( + tracer.flushing.reportStart, + tracer.flushing.reportEnd, + len(tracer.flushing.rawSpans), + int(tracer.flushing.droppedSpanCount+tracer.buffer.droppedSpanCount), + int(tracer.flushing.logEncoderErrorCount+tracer.buffer.logEncoderErrorCount), + ) + + if flushEventError == nil { + tracer.flushing.clear() + return statusReportEvent + } + + switch flushEventError.State() { + case FlushErrorTranslate: + // When there's a translation error, we do not want to retry. + tracer.flushing.clear() + default: + // Restore the records that did not get sent correctly + tracer.buffer.mergeFrom(&tracer.flushing) + } + + statusReportEvent.SetSentSpans(0) + + return statusReportEvent +} + +func (tracer *tracerImpl) Disable() { + tracer.lock.Lock() + if tracer.disabled { + tracer.lock.Unlock() + return + } + tracer.disabled = true + tracer.buffer.clear() + tracer.lock.Unlock() + + emitEvent(newEventTracerDisabled()) +} + +// Every MinReportingPeriod the reporting loop wakes up and checks to see if +// either (a) the Runtime's max reporting period is about to expire (see +// maxReportingPeriod()), (b) the number of buffered log records is +// approaching kMaxBufferedLogs, or if (c) the number of buffered span records +// is approaching kMaxBufferedSpans. If any of those conditions are true, +// pending data is flushed to the remote peer. If not, the reporting loop waits +// until the next cycle. See Runtime.maybeFlush() for details. +// +// This could alternatively be implemented using flush channels and so forth, +// but that would introduce opportunities for client code to block on the +// runtime library, and we want to avoid that at all costs (even dropping data, +// which can certainly happen with high data rates and/or unresponsive remote +// peers). + +func (tracer *tracerImpl) shouldFlushLocked(now time.Time) bool { + if now.Add(tracer.opts.MinReportingPeriod).Sub(tracer.lastReportAttempt) > tracer.opts.ReportingPeriod { + return true + } else if tracer.buffer.isHalfFull() { + return true + } + return false +} + +func (tracer *tracerImpl) reportLoop() { + tickerChan := time.Tick(tracer.opts.MinReportingPeriod) + for { + select { + case <-tickerChan: + now := time.Now() + + tracer.lock.Lock() + disabled := tracer.disabled + reconnect := !tracer.reportInFlight && tracer.client.ShouldReconnect() + shouldFlush := tracer.shouldFlushLocked(now) + tracer.lock.Unlock() + + if disabled { + return + } + if shouldFlush { + tracer.Flush(context.Background()) + } + if reconnect { + tracer.reconnectClient(now) + } + case <-tracer.closeReportLoopChannel: + close(tracer.reportLoopClosedChannel) + return + } + } +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/tracer_0_14.go b/vendor/github.com/lightstep/lightstep-tracer-go/tracer_0_14.go new file mode 100644 index 00000000..5b5fab66 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/tracer_0_14.go @@ -0,0 +1,45 @@ +package lightstep + +import ( + "context" + + "github.com/opentracing/opentracing-go" +) + +// Tracerv0_14 matches the Tracer interface from v0.14.0 +// DEPRECATED +type Tracerv0_14 interface { + opentracing.Tracer + + // DEPRECATED: error is always nil. Equivalent to Tracer.Close(context.Background()) + Close() error + // DEPRECATED: error is always nil. Equivalent to Tracer.Flush(context.Background()) + Flush() error + // Options gets the Options used in New(). + Options() Options + // Disable prevents the tracer from recording spans or flushing. + Disable() +} + +type tracerv0_14 struct { + Tracer +} + +// NewTracerv0_14 returns a tracer which conforms to the Tracer interface from v0.14.0, +// for backwards compatibility. +// DEPRECATED +func NewTracerv0_14(opts Options) Tracerv0_14 { + return &tracerv0_14{ + Tracer: NewTracer(opts), + } +} + +func (t *tracerv0_14) Close() error { + t.Tracer.Close(context.Background()) + return nil +} + +func (t *tracerv0_14) Flush() error { + t.Tracer.Flush(context.Background()) + return nil +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/tracer_helpers.go b/vendor/github.com/lightstep/lightstep-tracer-go/tracer_helpers.go new file mode 100644 index 00000000..a9419a9b --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/tracer_helpers.go @@ -0,0 +1,83 @@ +package lightstep + +import ( + "context" + + "github.com/opentracing/opentracing-go" +) + +// Flush forces a synchronous Flush. +func Flush(ctx context.Context, tracer opentracing.Tracer) { + switch lsTracer := tracer.(type) { + case Tracer: + lsTracer.Flush(ctx) + case *tracerv0_14: + Flush(ctx, lsTracer.Tracer) + default: + emitEvent(newEventUnsupportedTracer(tracer)) + } +} + +// Close synchronously flushes the tracer, then terminates it. +func Close(ctx context.Context, tracer opentracing.Tracer) { + switch lsTracer := tracer.(type) { + case Tracer: + lsTracer.Close(ctx) + case *tracerv0_14: + Close(ctx, lsTracer.Tracer) + default: + emitEvent(newEventUnsupportedTracer(tracer)) + } +} + +// GetLightStepAccessToken returns the currently configured AccessToken. +func GetLightStepAccessToken(tracer opentracing.Tracer) (string, error) { + switch lsTracer := tracer.(type) { + case Tracer: + return lsTracer.Options().AccessToken, nil + case *tracerv0_14: + return GetLightStepAccessToken(lsTracer.Tracer) + default: + return "", newEventUnsupportedTracer(tracer) + } +} + +// FlushLightStepTracer flushes the tracer +// DEPRECATED: use Flush instead. +func FlushLightStepTracer(tracer opentracing.Tracer) error { + switch lsTracer := tracer.(type) { + case Tracer: + lsTracer.Flush(context.Background()) + return nil + case *tracerv0_14: + return FlushLightStepTracer(lsTracer.Tracer) + default: + return newEventUnsupportedTracer(tracer) + } +} + +// CloseTracer closes the tracer +// DEPRECATED: use Close instead. +func CloseTracer(tracer opentracing.Tracer) error { + switch lsTracer := tracer.(type) { + case Tracer: + lsTracer.Close(context.Background()) + return nil + case *tracerv0_14: + return CloseTracer(lsTracer.Tracer) + default: + return newEventUnsupportedTracer(tracer) + } +} + +// GetLightStepReporterID returns the currently configured Reporter ID. +func GetLightStepReporterID(tracer opentracing.Tracer) (uint64, error) { + switch lsTracer := tracer.(type) { + case *tracerImpl: + return lsTracer.reporterID, nil + case *tracerv0_14: + return GetLightStepReporterID(lsTracer.Tracer) + default: + return 0, newEventUnsupportedTracer(tracer) + } +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/util.go b/vendor/github.com/lightstep/lightstep-tracer-go/util.go new file mode 100644 index 00000000..bc27f9e3 --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/util.go @@ -0,0 +1,32 @@ +package lightstep + +import ( + "runtime" + "time" + + "github.com/lightstep/lightstep-tracer-go/lightstep/rand" +) + +var ( + // create a random pool with size equal to 16 generators or number of CPU Cores which ever is higher to spread + // random int call loads across multiple go routines. This number is obtained via local benchmarking + // where any number more than 16 reaches a point of diminishing return given the test scenario. + randompool = rand.NewPool(time.Now().UnixNano(), uint64(max(16, runtime.NumCPU()))) +) + +// max returns the larger value among a and b +func max(x, y int) int { + if x > y { + return x + } + return y +} + +func genSeededGUID() uint64 { + return uint64(randompool.Pick().Int63()) +} + +func genSeededGUID2() (uint64, uint64) { + n1, n2 := randompool.Pick().TwoInt63() + return uint64(n1), uint64(n2) +} diff --git a/vendor/github.com/lightstep/lightstep-tracer-go/version.go b/vendor/github.com/lightstep/lightstep-tracer-go/version.go new file mode 100644 index 00000000..db3f682f --- /dev/null +++ b/vendor/github.com/lightstep/lightstep-tracer-go/version.go @@ -0,0 +1,4 @@ +package lightstep + +// TracerVersionValue provides the current version of the lightstep-tracer-go release +const TracerVersionValue = "0.18.1" diff --git a/vendor/github.com/m3db/m3/LICENSE b/vendor/github.com/m3db/m3/LICENSE new file mode 100644 index 00000000..eec623bb --- /dev/null +++ b/vendor/github.com/m3db/m3/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2018 Uber Technologies, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/m3db/m3/NOTICES.txt b/vendor/github.com/m3db/m3/NOTICES.txt new file mode 100644 index 00000000..f28b1026 --- /dev/null +++ b/vendor/github.com/m3db/m3/NOTICES.txt @@ -0,0 +1,19 @@ +M3DB includes derived work from etcd (https://github.com/etcd-io/etcd) under the Apache License 2.0: + + Copyright 2015 The etcd Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +The derived work can be found in the files: +- src/x/net/http/cors/cors.go +- src/x/net/http/cors/cors_test.go diff --git a/vendor/github.com/m3db/m3/src/cluster/client/client.go b/vendor/github.com/m3db/m3/src/cluster/client/client.go new file mode 100644 index 00000000..4fbcbd34 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/client/client.go @@ -0,0 +1,47 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/services" +) + +// Client is the base interface into the cluster management system, providing +// access to cluster services. +type Client interface { + // Services returns access to the set of services. + Services(opts services.OverrideOptions) (services.Services, error) + + // KV returns access to the distributed configuration store. + // To be deprecated. + KV() (kv.Store, error) + + // Txn returns access to the transaction store. + // To be deprecated. + Txn() (kv.TxnStore, error) + + // Store returns access to the distributed configuration store with a namespace. + Store(opts kv.OverrideOptions) (kv.Store, error) + + // TxnStore returns access to the transaction store with a namespace. + TxnStore(opts kv.OverrideOptions) (kv.TxnStore, error) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/client/client_mock.go b/vendor/github.com/m3db/m3/src/cluster/client/client_mock.go new file mode 100644 index 00000000..f4314219 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/client/client_mock.go @@ -0,0 +1,132 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/cluster/client (interfaces: Client) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package client is a generated GoMock package. +package client + +import ( + "reflect" + + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/services" + + "github.com/golang/mock/gomock" +) + +// MockClient is a mock of Client interface +type MockClient struct { + ctrl *gomock.Controller + recorder *MockClientMockRecorder +} + +// MockClientMockRecorder is the mock recorder for MockClient +type MockClientMockRecorder struct { + mock *MockClient +} + +// NewMockClient creates a new mock instance +func NewMockClient(ctrl *gomock.Controller) *MockClient { + mock := &MockClient{ctrl: ctrl} + mock.recorder = &MockClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockClient) EXPECT() *MockClientMockRecorder { + return m.recorder +} + +// KV mocks base method +func (m *MockClient) KV() (kv.Store, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "KV") + ret0, _ := ret[0].(kv.Store) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// KV indicates an expected call of KV +func (mr *MockClientMockRecorder) KV() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "KV", reflect.TypeOf((*MockClient)(nil).KV)) +} + +// Services mocks base method +func (m *MockClient) Services(arg0 services.OverrideOptions) (services.Services, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Services", arg0) + ret0, _ := ret[0].(services.Services) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Services indicates an expected call of Services +func (mr *MockClientMockRecorder) Services(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Services", reflect.TypeOf((*MockClient)(nil).Services), arg0) +} + +// Store mocks base method +func (m *MockClient) Store(arg0 kv.OverrideOptions) (kv.Store, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Store", arg0) + ret0, _ := ret[0].(kv.Store) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Store indicates an expected call of Store +func (mr *MockClientMockRecorder) Store(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Store", reflect.TypeOf((*MockClient)(nil).Store), arg0) +} + +// Txn mocks base method +func (m *MockClient) Txn() (kv.TxnStore, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Txn") + ret0, _ := ret[0].(kv.TxnStore) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Txn indicates an expected call of Txn +func (mr *MockClientMockRecorder) Txn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Txn", reflect.TypeOf((*MockClient)(nil).Txn)) +} + +// TxnStore mocks base method +func (m *MockClient) TxnStore(arg0 kv.OverrideOptions) (kv.TxnStore, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TxnStore", arg0) + ret0, _ := ret[0].(kv.TxnStore) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// TxnStore indicates an expected call of TxnStore +func (mr *MockClientMockRecorder) TxnStore(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TxnStore", reflect.TypeOf((*MockClient)(nil).TxnStore), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/client/etcd/client.go b/vendor/github.com/m3db/m3/src/cluster/client/etcd/client.go new file mode 100644 index 00000000..c3218c2e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/client/etcd/client.go @@ -0,0 +1,380 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package etcd + +import ( + "errors" + "fmt" + "math/rand" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/m3db/m3/src/cluster/client" + "github.com/m3db/m3/src/cluster/kv" + etcdkv "github.com/m3db/m3/src/cluster/kv/etcd" + "github.com/m3db/m3/src/cluster/services" + etcdheartbeat "github.com/m3db/m3/src/cluster/services/heartbeat/etcd" + "github.com/m3db/m3/src/cluster/services/leader" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/retry" + + "go.etcd.io/etcd/clientv3" + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +const ( + hierarchySeparator = "/" + internalPrefix = "_" + cacheFileSeparator = "_" + cacheFileSuffix = ".json" + // TODO deprecate this once all keys are migrated to per service namespace + kvPrefix = "_kv" +) + +var errInvalidNamespace = errors.New("invalid namespace") + +type newClientFn func(cluster Cluster) (*clientv3.Client, error) + +type cacheFileForZoneFn func(zone string) etcdkv.CacheFileFn + +// NewConfigServiceClient returns a ConfigServiceClient. +func NewConfigServiceClient(opts Options) (client.Client, error) { + if err := opts.Validate(); err != nil { + return nil, err + } + + scope := opts.InstrumentOptions(). + MetricsScope(). + Tagged(map[string]string{"service": opts.Service()}) + + return &csclient{ + opts: opts, + sdOpts: opts.ServicesOptions(), + kvScope: scope.Tagged(map[string]string{"config_service": "kv"}), + sdScope: scope.Tagged(map[string]string{"config_service": "sd"}), + hbScope: scope.Tagged(map[string]string{"config_service": "hb"}), + clis: make(map[string]*clientv3.Client), + logger: opts.InstrumentOptions().Logger(), + newFn: newClient, + retrier: retry.NewRetrier(opts.RetryOptions()), + stores: make(map[string]kv.TxnStore), + }, nil +} + +type csclient struct { + sync.RWMutex + clis map[string]*clientv3.Client + + opts Options + sdOpts services.Options + kvScope tally.Scope + sdScope tally.Scope + hbScope tally.Scope + logger *zap.Logger + newFn newClientFn + retrier retry.Retrier + + storeLock sync.Mutex + stores map[string]kv.TxnStore +} + +func (c *csclient) Services(opts services.OverrideOptions) (services.Services, error) { + if opts == nil { + opts = services.NewOverrideOptions() + } + return c.createServices(opts) +} + +func (c *csclient) KV() (kv.Store, error) { + return c.Txn() +} + +func (c *csclient) Txn() (kv.TxnStore, error) { + return c.TxnStore(kv.NewOverrideOptions()) +} + +func (c *csclient) Store(opts kv.OverrideOptions) (kv.Store, error) { + return c.TxnStore(opts) +} + +func (c *csclient) TxnStore(opts kv.OverrideOptions) (kv.TxnStore, error) { + opts, err := c.sanitizeOptions(opts) + if err != nil { + return nil, err + } + + return c.createTxnStore(opts) +} + +func (c *csclient) createServices(opts services.OverrideOptions) (services.Services, error) { + nOpts := opts.NamespaceOptions() + cacheFileExtraFields := []string{nOpts.PlacementNamespace(), nOpts.MetadataNamespace()} + return services.NewServices(c.sdOpts. + SetHeartbeatGen(c.heartbeatGen()). + SetKVGen(c.kvGen(c.cacheFileFn(cacheFileExtraFields...))). + SetLeaderGen(c.leaderGen()). + SetNamespaceOptions(nOpts). + SetInstrumentsOptions(instrument.NewOptions(). + SetLogger(c.logger). + SetMetricsScope(c.sdScope), + ), + ) +} + +func (c *csclient) createTxnStore(opts kv.OverrideOptions) (kv.TxnStore, error) { + // validate the override options because they are user supplied. + if err := opts.Validate(); err != nil { + return nil, err + } + return c.txnGen(opts, c.cacheFileFn()) +} + +func (c *csclient) kvGen(fn cacheFileForZoneFn) services.KVGen { + return services.KVGen(func(zone string) (kv.Store, error) { + // we don't validate or sanitize the options here because we're using + // them as a container for zone. + opts := kv.NewOverrideOptions().SetZone(zone) + return c.txnGen(opts, fn) + }) +} + +func (c *csclient) newkvOptions( + opts kv.OverrideOptions, + cacheFileFn cacheFileForZoneFn, +) etcdkv.Options { + kvOpts := etcdkv.NewOptions(). + SetInstrumentsOptions(instrument.NewOptions(). + SetLogger(c.logger). + SetMetricsScope(c.kvScope)). + SetCacheFileFn(cacheFileFn(opts.Zone())). + SetWatchWithRevision(c.opts.WatchWithRevision()). + SetNewDirectoryMode(c.opts.NewDirectoryMode()) + + if ns := opts.Namespace(); ns != "" { + kvOpts = kvOpts.SetPrefix(kvOpts.ApplyPrefix(ns)) + } + + if env := opts.Environment(); env != "" { + kvOpts = kvOpts.SetPrefix(kvOpts.ApplyPrefix(env)) + } + + return kvOpts +} + +// txnGen assumes the caller has validated the options passed if they are +// user-supplied (as opposed to constructed ourselves). +func (c *csclient) txnGen( + opts kv.OverrideOptions, + cacheFileFn cacheFileForZoneFn, +) (kv.TxnStore, error) { + cli, err := c.etcdClientGen(opts.Zone()) + if err != nil { + return nil, err + } + + c.storeLock.Lock() + defer c.storeLock.Unlock() + + key := kvStoreCacheKey(opts.Zone(), opts.Namespace(), opts.Environment()) + store, ok := c.stores[key] + if ok { + return store, nil + } + if store, err = etcdkv.NewStore( + cli.KV, + cli.Watcher, + c.newkvOptions(opts, cacheFileFn), + ); err != nil { + return nil, err + } + + c.stores[key] = store + return store, nil +} + +func (c *csclient) heartbeatGen() services.HeartbeatGen { + return services.HeartbeatGen( + func(sid services.ServiceID) (services.HeartbeatService, error) { + cli, err := c.etcdClientGen(sid.Zone()) + if err != nil { + return nil, err + } + + opts := etcdheartbeat.NewOptions(). + SetInstrumentsOptions(instrument.NewOptions(). + SetLogger(c.logger). + SetMetricsScope(c.hbScope)). + SetServiceID(sid) + return etcdheartbeat.NewStore(cli, opts) + }, + ) +} + +func (c *csclient) leaderGen() services.LeaderGen { + return services.LeaderGen( + func(sid services.ServiceID, eo services.ElectionOptions) (services.LeaderService, error) { + cli, err := c.etcdClientGen(sid.Zone()) + if err != nil { + return nil, err + } + + opts := leader.NewOptions(). + SetServiceID(sid). + SetElectionOpts(eo) + + return leader.NewService(cli, opts) + }, + ) +} + +func (c *csclient) etcdClientGen(zone string) (*clientv3.Client, error) { + c.Lock() + defer c.Unlock() + + cli, ok := c.clis[zone] + if ok { + return cli, nil + } + + cluster, ok := c.opts.ClusterForZone(zone) + if !ok { + return nil, fmt.Errorf("no etcd cluster found for zone: %s", zone) + } + + err := c.retrier.Attempt(func() error { + var tryErr error + cli, tryErr = c.newFn(cluster) + return tryErr + }) + if err != nil { + return nil, err + } + + c.clis[zone] = cli + return cli, nil +} + +func newClient(cluster Cluster) (*clientv3.Client, error) { + tls, err := cluster.TLSOptions().Config() + if err != nil { + return nil, err + } + cfg := clientv3.Config{ + Endpoints: cluster.Endpoints(), + TLS: tls, + AutoSyncInterval: cluster.AutoSyncInterval(), + } + + if opts := cluster.KeepAliveOptions(); opts.KeepAliveEnabled() { + keepAlivePeriod := opts.KeepAlivePeriod() + if maxJitter := opts.KeepAlivePeriodMaxJitter(); maxJitter > 0 { + rnd := rand.New(rand.NewSource(time.Now().UnixNano())) + jitter := rnd.Int63n(int64(maxJitter)) + keepAlivePeriod += time.Duration(jitter) + } + cfg.DialKeepAliveTime = keepAlivePeriod + cfg.DialKeepAliveTimeout = opts.KeepAliveTimeout() + } + + return clientv3.New(cfg) +} + +func (c *csclient) cacheFileFn(extraFields ...string) cacheFileForZoneFn { + return func(zone string) etcdkv.CacheFileFn { + return func(namespace string) string { + if c.opts.CacheDir() == "" { + return "" + } + + cacheFileFields := make([]string, 0, len(extraFields)+3) + cacheFileFields = append(cacheFileFields, namespace, c.opts.Service(), zone) + cacheFileFields = append(cacheFileFields, extraFields...) + return filepath.Join(c.opts.CacheDir(), fileName(cacheFileFields...)) + } + } +} + +func fileName(parts ...string) string { + // get non-empty parts + idx := 0 + for i, part := range parts { + if part == "" { + continue + } + if i != idx { + parts[idx] = part + } + idx++ + } + parts = parts[:idx] + s := strings.Join(parts, cacheFileSeparator) + return strings.Replace(s, string(os.PathSeparator), cacheFileSeparator, -1) + cacheFileSuffix +} + +func validateTopLevelNamespace(namespace string) error { + if namespace == "" || namespace == hierarchySeparator { + return errInvalidNamespace + } + if strings.HasPrefix(namespace, internalPrefix) { + // start with _ + return errInvalidNamespace + } + if strings.HasPrefix(namespace, hierarchySeparator+internalPrefix) { + return errInvalidNamespace + } + return nil +} + +func (c *csclient) sanitizeOptions(opts kv.OverrideOptions) (kv.OverrideOptions, error) { + if opts.Zone() == "" { + opts = opts.SetZone(c.opts.Zone()) + } + + if opts.Environment() == "" { + opts = opts.SetEnvironment(c.opts.Env()) + } + + namespace := opts.Namespace() + if namespace == "" { + return opts.SetNamespace(kvPrefix), nil + } + + if err := validateTopLevelNamespace(namespace); err != nil { + return nil, err + } + + return opts, nil +} + +func kvStoreCacheKey(zone string, namespaces ...string) string { + parts := make([]string, 0, 1+len(namespaces)) + parts = append(parts, zone) + for _, ns := range namespaces { + if ns != "" { + parts = append(parts, ns) + } + } + return strings.Join(parts, hierarchySeparator) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/client/etcd/config.go b/vendor/github.com/m3db/m3/src/cluster/client/etcd/config.go new file mode 100644 index 00000000..539ca483 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/client/etcd/config.go @@ -0,0 +1,135 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package etcd + +import ( + "os" + "time" + + "github.com/m3db/m3/src/cluster/client" + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/x/instrument" +) + +// ClusterConfig is the config for a zoned etcd cluster. +type ClusterConfig struct { + Zone string `yaml:"zone"` + Endpoints []string `yaml:"endpoints"` + KeepAlive *KeepAliveConfig `yaml:"keepAlive"` + TLS *TLSConfig `yaml:"tls"` + AutoSyncInterval time.Duration `yaml:"autoSyncInterval"` +} + +// NewCluster creates a new Cluster. +func (c ClusterConfig) NewCluster() Cluster { + keepAliveOpts := NewKeepAliveOptions() + if c.KeepAlive != nil { + keepAliveOpts = c.KeepAlive.NewOptions() + } + return NewCluster(). + SetZone(c.Zone). + SetEndpoints(c.Endpoints). + SetKeepAliveOptions(keepAliveOpts). + SetTLSOptions(c.TLS.newOptions()). + SetAutoSyncInterval(c.AutoSyncInterval) +} + +// TLSConfig is the config for TLS. +type TLSConfig struct { + CrtPath string `yaml:"crtPath"` + CACrtPath string `yaml:"caCrtPath"` + KeyPath string `yaml:"keyPath"` +} + +func (c *TLSConfig) newOptions() TLSOptions { + opts := NewTLSOptions() + if c == nil { + return opts + } + + return opts. + SetCrtPath(c.CrtPath). + SetKeyPath(c.KeyPath). + SetCACrtPath(c.CACrtPath) +} + +// KeepAliveConfig configures keepAlive behavior. +type KeepAliveConfig struct { + Enabled bool `yaml:"enabled"` + Period time.Duration `yaml:"period"` + Jitter time.Duration `yaml:"jitter"` + Timeout time.Duration `yaml:"timeout"` +} + +// NewOptions constructs options based on the config. +func (c *KeepAliveConfig) NewOptions() KeepAliveOptions { + return NewKeepAliveOptions(). + SetKeepAliveEnabled(c.Enabled). + SetKeepAlivePeriod(c.Period). + SetKeepAlivePeriodMaxJitter(c.Jitter). + SetKeepAliveTimeout(c.Timeout) +} + +// Configuration is for config service client. +type Configuration struct { + Zone string `yaml:"zone"` + Env string `yaml:"env"` + Service string `yaml:"service" validate:"nonzero"` + CacheDir string `yaml:"cacheDir"` + ETCDClusters []ClusterConfig `yaml:"etcdClusters"` + SDConfig services.Configuration `yaml:"m3sd"` + WatchWithRevision int64 `yaml:"watchWithRevision"` + NewDirectoryMode *os.FileMode `yaml:"newDirectoryMode"` +} + +// NewClient creates a new config service client. +func (cfg Configuration) NewClient(iopts instrument.Options) (client.Client, error) { + return NewConfigServiceClient(cfg.NewOptions().SetInstrumentOptions(iopts)) +} + +// NewOptions returns a new Options. +func (cfg Configuration) NewOptions() Options { + opts := NewOptions(). + SetZone(cfg.Zone). + SetEnv(cfg.Env). + SetService(cfg.Service). + SetCacheDir(cfg.CacheDir). + SetClusters(cfg.etcdClusters()). + SetServicesOptions(cfg.SDConfig.NewOptions()). + SetWatchWithRevision(cfg.WatchWithRevision) + + if v := cfg.NewDirectoryMode; v != nil { + opts = opts.SetNewDirectoryMode(*v) + } else { + opts = opts.SetNewDirectoryMode(defaultDirectoryMode) + } + + return opts +} + +func (cfg Configuration) etcdClusters() []Cluster { + res := make([]Cluster, len(cfg.ETCDClusters)) + for i, c := range cfg.ETCDClusters { + res[i] = c.NewCluster() + } + + return res +} diff --git a/vendor/github.com/m3db/m3/src/cluster/client/etcd/options.go b/vendor/github.com/m3db/m3/src/cluster/client/etcd/options.go new file mode 100644 index 00000000..e6e3c719 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/client/etcd/options.go @@ -0,0 +1,375 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package etcd + +import ( + "crypto/tls" + "crypto/x509" + "errors" + "fmt" + "io/ioutil" + "math" + "os" + "time" + + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/retry" +) + +const ( + defaultKeepAliveEnabled = true + defaultKeepAlivePeriod = 5 * time.Minute + defaultKeepAlivePeriodMaxJitter = 5 * time.Minute + defaultKeepAliveTimeout = 20 * time.Second + + defaultRetryInitialBackoff = 2 * time.Second + defaultRetryBackoffFactor = 2.0 + defaultRetryMaxRetries = 3 + defaultRetryMaxBackoff = time.Duration(math.MaxInt64) + defaultRetryJitter = true + + defaultDirectoryMode = os.FileMode(0755) +) + +type keepAliveOptions struct { + keepAliveEnabled bool + keepAlivePeriod time.Duration + keepAlivePeriodMaxJitter time.Duration + keepAliveTimeout time.Duration +} + +// NewKeepAliveOptions provide a set of keepAlive options. +func NewKeepAliveOptions() KeepAliveOptions { + return &keepAliveOptions{ + keepAliveEnabled: defaultKeepAliveEnabled, + keepAlivePeriod: defaultKeepAlivePeriod, + keepAlivePeriodMaxJitter: defaultKeepAlivePeriodMaxJitter, + keepAliveTimeout: defaultKeepAliveTimeout, + } +} + +func (o *keepAliveOptions) KeepAliveEnabled() bool { return o.keepAliveEnabled } + +func (o *keepAliveOptions) SetKeepAliveEnabled(value bool) KeepAliveOptions { + opts := *o + opts.keepAliveEnabled = value + return &opts +} + +func (o *keepAliveOptions) KeepAlivePeriod() time.Duration { return o.keepAlivePeriod } + +func (o *keepAliveOptions) SetKeepAlivePeriod(value time.Duration) KeepAliveOptions { + opts := *o + opts.keepAlivePeriod = value + return &opts +} + +func (o *keepAliveOptions) KeepAlivePeriodMaxJitter() time.Duration { + return o.keepAlivePeriodMaxJitter +} + +func (o *keepAliveOptions) SetKeepAlivePeriodMaxJitter(value time.Duration) KeepAliveOptions { + opts := *o + opts.keepAlivePeriodMaxJitter = value + return &opts +} + +func (o *keepAliveOptions) KeepAliveTimeout() time.Duration { + return o.keepAliveTimeout +} + +func (o *keepAliveOptions) SetKeepAliveTimeout(value time.Duration) KeepAliveOptions { + opts := *o + opts.keepAliveTimeout = value + return &opts +} + +// NewTLSOptions creates a set of TLS Options. +func NewTLSOptions() TLSOptions { + return tlsOptions{} +} + +type tlsOptions struct { + cert string + key string + ca string +} + +func (o tlsOptions) CrtPath() string { + return o.cert +} + +func (o tlsOptions) SetCrtPath(cert string) TLSOptions { + o.cert = cert + return o +} + +func (o tlsOptions) KeyPath() string { + return o.key +} +func (o tlsOptions) SetKeyPath(key string) TLSOptions { + o.key = key + return o +} + +func (o tlsOptions) CACrtPath() string { + return o.ca +} +func (o tlsOptions) SetCACrtPath(ca string) TLSOptions { + o.ca = ca + return o +} + +func (o tlsOptions) Config() (*tls.Config, error) { + if o.cert == "" { + // By default we should use nil config instead of empty config. + return nil, nil + } + + cert, err := tls.LoadX509KeyPair(o.cert, o.key) + if err != nil { + return nil, err + } + caCert, err := ioutil.ReadFile(o.ca) + if err != nil { + return nil, err + } + caPool := x509.NewCertPool() + if ok := caPool.AppendCertsFromPEM(caCert); !ok { + return nil, fmt.Errorf("can't read PEM-formatted certificates from file %s as root CA pool", o.ca) + } + return &tls.Config{ + MinVersion: tls.VersionTLS12, + InsecureSkipVerify: false, + Certificates: []tls.Certificate{cert}, + RootCAs: caPool, + }, nil +} + +// NewOptions creates a set of Options. +func NewOptions() Options { + return options{ + sdOpts: services.NewOptions(), + iopts: instrument.NewOptions(), + // NB(r): Set some default retry options so changes to retry + // option defaults don't change behavior of this client's retry options + retryOpts: retry.NewOptions(). + SetInitialBackoff(defaultRetryInitialBackoff). + SetBackoffFactor(defaultRetryBackoffFactor). + SetMaxBackoff(defaultRetryMaxBackoff). + SetMaxRetries(defaultRetryMaxRetries). + SetJitter(defaultRetryJitter), + newDirectoryMode: defaultDirectoryMode, + } +} + +type options struct { + env string + zone string + service string + cacheDir string + watchWithRevision int64 + sdOpts services.Options + clusters map[string]Cluster + iopts instrument.Options + retryOpts retry.Options + newDirectoryMode os.FileMode +} + +func (o options) Validate() error { + if o.service == "" { + return errors.New("invalid options, no service name set") + } + + if len(o.clusters) == 0 { + return errors.New("invalid options, no etcd clusters set") + } + + if o.iopts == nil { + return errors.New("invalid options, no instrument options set") + } + + return nil +} + +func (o options) Env() string { + return o.env +} + +func (o options) SetEnv(e string) Options { + o.env = e + return o +} + +func (o options) Zone() string { + return o.zone +} + +func (o options) SetZone(z string) Options { + o.zone = z + return o +} + +func (o options) ServicesOptions() services.Options { + return o.sdOpts +} + +func (o options) SetServicesOptions(cfg services.Options) Options { + o.sdOpts = cfg + return o +} + +func (o options) CacheDir() string { + return o.cacheDir +} + +func (o options) SetCacheDir(dir string) Options { + o.cacheDir = dir + return o +} + +func (o options) Service() string { + return o.service +} + +func (o options) SetService(id string) Options { + o.service = id + return o +} + +func (o options) Clusters() []Cluster { + res := make([]Cluster, 0, len(o.clusters)) + for _, c := range o.clusters { + res = append(res, c) + } + return res +} + +func (o options) SetClusters(clusters []Cluster) Options { + o.clusters = make(map[string]Cluster, len(clusters)) + for _, c := range clusters { + o.clusters[c.Zone()] = c + } + return o +} + +func (o options) ClusterForZone(z string) (Cluster, bool) { + c, ok := o.clusters[z] + return c, ok +} + +func (o options) InstrumentOptions() instrument.Options { + return o.iopts +} + +func (o options) SetInstrumentOptions(iopts instrument.Options) Options { + o.iopts = iopts + return o +} + +func (o options) RetryOptions() retry.Options { + return o.retryOpts +} + +func (o options) SetRetryOptions(retryOpts retry.Options) Options { + o.retryOpts = retryOpts + return o +} + +func (o options) WatchWithRevision() int64 { + return o.watchWithRevision +} + +func (o options) SetWatchWithRevision(rev int64) Options { + o.watchWithRevision = rev + return o +} + +func (o options) SetNewDirectoryMode(fm os.FileMode) Options { + o.newDirectoryMode = fm + return o +} + +func (o options) NewDirectoryMode() os.FileMode { + return o.newDirectoryMode +} + +// NewCluster creates a Cluster. +func NewCluster() Cluster { + return cluster{ + keepAliveOpts: NewKeepAliveOptions(), + tlsOpts: NewTLSOptions(), + } +} + +type cluster struct { + zone string + endpoints []string + keepAliveOpts KeepAliveOptions + tlsOpts TLSOptions + autoSyncInterval time.Duration +} + +func (c cluster) Zone() string { + return c.zone +} + +func (c cluster) SetZone(z string) Cluster { + c.zone = z + return c +} + +func (c cluster) Endpoints() []string { + return c.endpoints +} + +func (c cluster) SetEndpoints(endpoints []string) Cluster { + c.endpoints = endpoints + return c +} + +func (c cluster) KeepAliveOptions() KeepAliveOptions { + return c.keepAliveOpts +} + +func (c cluster) SetKeepAliveOptions(value KeepAliveOptions) Cluster { + c.keepAliveOpts = value + return c +} + +func (c cluster) TLSOptions() TLSOptions { + return c.tlsOpts +} + +func (c cluster) SetTLSOptions(opts TLSOptions) Cluster { + c.tlsOpts = opts + return c +} + +func (c cluster) AutoSyncInterval() time.Duration { + return c.autoSyncInterval +} + +func (c cluster) SetAutoSyncInterval(autoSyncInterval time.Duration) Cluster { + c.autoSyncInterval = autoSyncInterval + return c +} diff --git a/vendor/github.com/m3db/m3/src/cluster/client/etcd/types.go b/vendor/github.com/m3db/m3/src/cluster/client/etcd/types.go new file mode 100644 index 00000000..ffdc284b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/client/etcd/types.go @@ -0,0 +1,134 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package etcd + +import ( + "crypto/tls" + "os" + "time" + + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/retry" +) + +// Options is the Options to create a config service client. +type Options interface { + Env() string + SetEnv(e string) Options + + Zone() string + SetZone(z string) Options + + Service() string + SetService(id string) Options + + CacheDir() string + SetCacheDir(dir string) Options + + ServicesOptions() services.Options + SetServicesOptions(opts services.Options) Options + + Clusters() []Cluster + SetClusters(clusters []Cluster) Options + ClusterForZone(z string) (Cluster, bool) + + InstrumentOptions() instrument.Options + SetInstrumentOptions(iopts instrument.Options) Options + + RetryOptions() retry.Options + SetRetryOptions(retryOpts retry.Options) Options + + WatchWithRevision() int64 + SetWatchWithRevision(rev int64) Options + + SetNewDirectoryMode(fm os.FileMode) Options + NewDirectoryMode() os.FileMode + + Validate() error +} + +// KeepAliveOptions provide a set of client-side keepAlive options. +type KeepAliveOptions interface { + // KeepAliveEnabled determines whether keepAlives are enabled. + KeepAliveEnabled() bool + + // SetKeepAliveEnabled sets whether keepAlives are enabled. + SetKeepAliveEnabled(value bool) KeepAliveOptions + + // KeepAlivePeriod is the duration of time after which if the client doesn't see + // any activity the client pings the server to see if transport is alive. + KeepAlivePeriod() time.Duration + + // SetKeepAlivePeriod sets the duration of time after which if the client doesn't see + // any activity the client pings the server to see if transport is alive. + SetKeepAlivePeriod(value time.Duration) KeepAliveOptions + + // KeepAlivePeriodMaxJitter is used to add some jittering to keep alive period + // to avoid a large number of clients all sending keepalive probes at the + // same time. + KeepAlivePeriodMaxJitter() time.Duration + + // SetKeepAlivePeriodMaxJitter sets the maximum jittering to keep alive period + // to avoid a large number of clients all sending keepalive probes at the + // same time. + SetKeepAlivePeriodMaxJitter(value time.Duration) KeepAliveOptions + + // KeepAliveTimeout is the time that the client waits for a response for the + // keep-alive probe. If the response is not received in this time, the connection is closed. + KeepAliveTimeout() time.Duration + + // SetKeepAliveTimeout sets the time that the client waits for a response for the + // keep-alive probe. If the response is not received in this time, the connection is closed. + SetKeepAliveTimeout(value time.Duration) KeepAliveOptions +} + +// TLSOptions defines the options for TLS. +type TLSOptions interface { + CrtPath() string + SetCrtPath(string) TLSOptions + + KeyPath() string + SetKeyPath(string) TLSOptions + + CACrtPath() string + SetCACrtPath(string) TLSOptions + + Config() (*tls.Config, error) +} + +// Cluster defines the configuration for a etcd cluster. +type Cluster interface { + Zone() string + SetZone(z string) Cluster + + Endpoints() []string + SetEndpoints(endpoints []string) Cluster + + KeepAliveOptions() KeepAliveOptions + SetKeepAliveOptions(value KeepAliveOptions) Cluster + + TLSOptions() TLSOptions + SetTLSOptions(TLSOptions) Cluster + + SetAutoSyncInterval(value time.Duration) Cluster + AutoSyncInterval() time.Duration +} diff --git a/vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/manager.go b/vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/manager.go new file mode 100644 index 00000000..9d5837e8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/manager.go @@ -0,0 +1,173 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package watchmanager + +import ( + "context" + "fmt" + "time" + + "go.etcd.io/etcd/clientv3" + "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +// NewWatchManager creates a new watch manager +func NewWatchManager(opts Options) (WatchManager, error) { + if err := opts.Validate(); err != nil { + return nil, err + } + + scope := opts.InstrumentsOptions().MetricsScope() + return &manager{ + opts: opts, + logger: opts.InstrumentsOptions().Logger(), + m: metrics{ + etcdWatchCreate: scope.Counter("etcd-watch-create"), + etcdWatchError: scope.Counter("etcd-watch-error"), + etcdWatchReset: scope.Counter("etcd-watch-reset"), + }, + updateFn: opts.UpdateFn(), + tickAndStopFn: opts.TickAndStopFn(), + }, nil +} + +type manager struct { + opts Options + logger *zap.Logger + m metrics + + updateFn UpdateFn + tickAndStopFn TickAndStopFn +} + +type metrics struct { + etcdWatchCreate tally.Counter + etcdWatchError tally.Counter + etcdWatchReset tally.Counter +} + +func (w *manager) watchChanWithTimeout(key string, rev int64) (clientv3.WatchChan, context.CancelFunc, error) { + doneCh := make(chan struct{}) + + ctx, cancelFn := context.WithCancel(clientv3.WithRequireLeader(context.Background())) + + var watchChan clientv3.WatchChan + go func() { + wOpts := w.opts.WatchOptions() + if rev > 0 { + wOpts = append(wOpts, clientv3.WithRev(rev)) + } + watchChan = w.opts.Watcher().Watch( + ctx, + key, + wOpts..., + ) + close(doneCh) + }() + + timeout := w.opts.WatchChanInitTimeout() + select { + case <-doneCh: + return watchChan, cancelFn, nil + case <-time.After(timeout): + cancelFn() + return nil, nil, fmt.Errorf("etcd watch create timed out after %s for key: %s", timeout.String(), key) + } +} + +func (w *manager) Watch(key string) { + ticker := time.Tick(w.opts.WatchChanCheckInterval()) //nolint: megacheck + + var ( + revOverride int64 + watchChan clientv3.WatchChan + cancelFn context.CancelFunc + err error + ) + for { + if watchChan == nil { + w.m.etcdWatchCreate.Inc(1) + watchChan, cancelFn, err = w.watchChanWithTimeout(key, revOverride) + if err != nil { + w.logger.Error("could not create etcd watch", zap.Error(err)) + + // NB(cw) when we failed to create a etcd watch channel + // we do a get for now and will try to recreate the watch chan later + if err = w.updateFn(key, nil); err != nil { + w.logger.Error("failed to get value for key", zap.String("key", key), zap.Error(err)) + } + // avoid recreating watch channel too frequently + time.Sleep(w.opts.WatchChanResetInterval()) + continue + } + } + + select { + case r, ok := <-watchChan: + if !ok { + // the watch chan is closed, set it to nil so it will be recreated + // this is unlikely to happen but just to be defensive + cancelFn() + watchChan = nil + w.logger.Warn("etcd watch channel closed on key, recreating a watch channel", + zap.String("key", key)) + + // avoid recreating watch channel too frequently + time.Sleep(w.opts.WatchChanResetInterval()) + w.m.etcdWatchReset.Inc(1) + + continue + } + + // handle the update + if err = r.Err(); err != nil { + w.logger.Error("received error on watch channel", zap.Error(err)) + w.m.etcdWatchError.Inc(1) + // do not stop here, even though the update contains an error + // we still take this chance to attempt a Get() for the latest value + + // If the current revision has been compacted, set watchChan to + // nil so the watch is recreated with a valid start revision + if err == rpctypes.ErrCompacted { + w.logger.Warn("recreating watch at revision", zap.Int64("revision", r.CompactRevision)) + revOverride = r.CompactRevision + watchChan = nil + } + } + + if r.IsProgressNotify() { + // Do not call updateFn on ProgressNotify as it happens periodically with no update events + continue + } + if err = w.updateFn(key, r.Events); err != nil { + w.logger.Error("received notification for key, but failed to get value", + zap.String("key", key), zap.Error(err)) + } + case <-ticker: + if w.tickAndStopFn(key) { + w.logger.Info("watch on key ended", zap.String("key", key)) + return + } + } + } +} diff --git a/vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/options.go b/vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/options.go new file mode 100644 index 00000000..7156c273 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/options.go @@ -0,0 +1,170 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package watchmanager + +import ( + "errors" + "time" + + "github.com/m3db/m3/src/x/instrument" + + "go.etcd.io/etcd/clientv3" +) + +const ( + defaultWatchChanCheckInterval = 10 * time.Second + defaultWatchChanResetInterval = 10 * time.Second + defaultWatchChanInitTimeout = 10 * time.Second +) + +var ( + errNilWatch = errors.New("invalid options: nil watcher") + errNilUpdateFn = errors.New("invalid options: nil updateFn") + errNilTickAndStopFn = errors.New("invalid options: nil tickAndStopFn") + errNilInstrumentOptions = errors.New("invalid options: nil instrument options") + errInvalidWatchCheckInterval = errors.New("invalid watch channel check interval") +) + +// NewOptions creates sane options +func NewOptions() Options { + return &options{ + watchChanCheckInterval: defaultWatchChanCheckInterval, + watchChanResetInterval: defaultWatchChanResetInterval, + watchChanInitTimeout: defaultWatchChanInitTimeout, + iopts: instrument.NewOptions(), + } +} + +type options struct { + watcher clientv3.Watcher + updateFn UpdateFn + tickAndStopFn TickAndStopFn + + wopts []clientv3.OpOption + watchChanCheckInterval time.Duration + watchChanResetInterval time.Duration + watchChanInitTimeout time.Duration + iopts instrument.Options +} + +func (o *options) Watcher() clientv3.Watcher { + return o.watcher +} + +func (o *options) SetWatcher(w clientv3.Watcher) Options { + opts := *o + opts.watcher = w + return &opts +} + +func (o *options) WatchChanCheckInterval() time.Duration { + return o.watchChanCheckInterval +} + +func (o *options) SetWatchChanCheckInterval(t time.Duration) Options { + opts := *o + opts.watchChanCheckInterval = t + return &opts +} + +func (o *options) WatchChanResetInterval() time.Duration { + return o.watchChanResetInterval +} + +func (o *options) SetWatchChanResetInterval(t time.Duration) Options { + opts := *o + opts.watchChanResetInterval = t + return &opts +} + +func (o *options) WatchChanInitTimeout() time.Duration { + return o.watchChanInitTimeout +} + +func (o *options) SetWatchChanInitTimeout(t time.Duration) Options { + opts := *o + opts.watchChanInitTimeout = t + return &opts +} + +func (o *options) UpdateFn() UpdateFn { + return o.updateFn +} + +func (o *options) SetUpdateFn(f UpdateFn) Options { + opts := *o + opts.updateFn = f + return &opts +} + +func (o *options) TickAndStopFn() TickAndStopFn { + return o.tickAndStopFn +} + +func (o *options) SetTickAndStopFn(f TickAndStopFn) Options { + opts := *o + opts.tickAndStopFn = f + return &opts +} + +func (o *options) WatchOptions() []clientv3.OpOption { + return o.wopts +} + +func (o *options) SetWatchOptions(options []clientv3.OpOption) Options { + opts := *o + opts.wopts = options + return &opts +} + +func (o *options) InstrumentsOptions() instrument.Options { + return o.iopts +} + +func (o *options) SetInstrumentsOptions(iopts instrument.Options) Options { + opts := *o + opts.iopts = iopts + return &opts +} + +func (o *options) Validate() error { + if o.watcher == nil { + return errNilWatch + } + + if o.updateFn == nil { + return errNilUpdateFn + } + + if o.tickAndStopFn == nil { + return errNilTickAndStopFn + } + + if o.iopts == nil { + return errNilInstrumentOptions + } + + if o.watchChanCheckInterval <= 0 { + return errInvalidWatchCheckInterval + } + + return nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/types.go b/vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/types.go new file mode 100644 index 00000000..753ac141 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/etcd/watchmanager/types.go @@ -0,0 +1,89 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package watchmanager + +import ( + "time" + + "github.com/m3db/m3/src/x/instrument" + + "go.etcd.io/etcd/clientv3" +) + +// WatchManager manages etcd watch on a key +type WatchManager interface { + // Watch watches the key forever until the CheckAndStopFn returns true + Watch(key string) +} + +// UpdateFn is called when an event on the watch channel happens +type UpdateFn func(key string, events []*clientv3.Event) error + +// TickAndStopFn is called every once a while +// to check and stop the watch if needed +type TickAndStopFn func(key string) bool + +// Options are options for the etcd watch helper +type Options interface { + // Watcher is the etcd watcher + Watcher() clientv3.Watcher + // SetWatcher sets the Watcher + SetWatcher(w clientv3.Watcher) Options + + // UpdateFn is the function called when a notification on a key is received + UpdateFn() UpdateFn + // SetUpdateFn sets the UpdateFn + SetUpdateFn(f UpdateFn) Options + + // TickAndStopFn is the function called periodically to check if a watch should be stopped + TickAndStopFn() TickAndStopFn + // SetTickAndStopFn sets the TickAndStopFn + SetTickAndStopFn(f TickAndStopFn) Options + + // WatchOptions is a set of options for the etcd watch + WatchOptions() []clientv3.OpOption + // SetWatchOptions sets the WatchOptions + SetWatchOptions(opts []clientv3.OpOption) Options + + // WatchChanCheckInterval will be used to periodically check if a watch chan + // is no longer being subscribed and should be closed + WatchChanCheckInterval() time.Duration + // SetWatchChanCheckInterval sets the WatchChanCheckInterval + SetWatchChanCheckInterval(t time.Duration) Options + + // WatchChanResetInterval is the delay before resetting the etcd watch chan + WatchChanResetInterval() time.Duration + // SetWatchChanResetInterval sets the WatchChanResetInterval + SetWatchChanResetInterval(t time.Duration) Options + + // WatchChanInitTimeout is the timeout for a watchChan initialization + WatchChanInitTimeout() time.Duration + // SetWatchChanInitTimeout sets the WatchChanInitTimeout + SetWatchChanInitTimeout(t time.Duration) Options + + // InstrumentsOptions is the instrument options + InstrumentsOptions() instrument.Options + // SetInstrumentsOptions sets the InstrumentsOptions + SetInstrumentsOptions(iopts instrument.Options) Options + + // Validate validates the options + Validate() error +} diff --git a/vendor/github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.pb.go b/vendor/github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.pb.go new file mode 100644 index 00000000..071f10a0 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.pb.go @@ -0,0 +1,831 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.proto + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* +Package commonpb is a generated protocol buffer package. + +It is generated from these files: + github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.proto + +It has these top-level messages: + BoolProto + Float64Proto + Int64Proto + StringArrayProto + StringProto +*/ +package commonpb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import binary "encoding/binary" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type BoolProto struct { + Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *BoolProto) Reset() { *m = BoolProto{} } +func (m *BoolProto) String() string { return proto.CompactTextString(m) } +func (*BoolProto) ProtoMessage() {} +func (*BoolProto) Descriptor() ([]byte, []int) { return fileDescriptorCommon, []int{0} } + +func (m *BoolProto) GetValue() bool { + if m != nil { + return m.Value + } + return false +} + +type Float64Proto struct { + Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *Float64Proto) Reset() { *m = Float64Proto{} } +func (m *Float64Proto) String() string { return proto.CompactTextString(m) } +func (*Float64Proto) ProtoMessage() {} +func (*Float64Proto) Descriptor() ([]byte, []int) { return fileDescriptorCommon, []int{1} } + +func (m *Float64Proto) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +type Int64Proto struct { + Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *Int64Proto) Reset() { *m = Int64Proto{} } +func (m *Int64Proto) String() string { return proto.CompactTextString(m) } +func (*Int64Proto) ProtoMessage() {} +func (*Int64Proto) Descriptor() ([]byte, []int) { return fileDescriptorCommon, []int{2} } + +func (m *Int64Proto) GetValue() int64 { + if m != nil { + return m.Value + } + return 0 +} + +type StringArrayProto struct { + Values []string `protobuf:"bytes,1,rep,name=values" json:"values,omitempty"` +} + +func (m *StringArrayProto) Reset() { *m = StringArrayProto{} } +func (m *StringArrayProto) String() string { return proto.CompactTextString(m) } +func (*StringArrayProto) ProtoMessage() {} +func (*StringArrayProto) Descriptor() ([]byte, []int) { return fileDescriptorCommon, []int{3} } + +func (m *StringArrayProto) GetValues() []string { + if m != nil { + return m.Values + } + return nil +} + +type StringProto struct { + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *StringProto) Reset() { *m = StringProto{} } +func (m *StringProto) String() string { return proto.CompactTextString(m) } +func (*StringProto) ProtoMessage() {} +func (*StringProto) Descriptor() ([]byte, []int) { return fileDescriptorCommon, []int{4} } + +func (m *StringProto) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func init() { + proto.RegisterType((*BoolProto)(nil), "commonpb.BoolProto") + proto.RegisterType((*Float64Proto)(nil), "commonpb.Float64Proto") + proto.RegisterType((*Int64Proto)(nil), "commonpb.Int64Proto") + proto.RegisterType((*StringArrayProto)(nil), "commonpb.StringArrayProto") + proto.RegisterType((*StringProto)(nil), "commonpb.StringProto") +} +func (m *BoolProto) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BoolProto) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Value { + dAtA[i] = 0x8 + i++ + if m.Value { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *Float64Proto) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Float64Proto) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Value != 0 { + dAtA[i] = 0x9 + i++ + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + i += 8 + } + return i, nil +} + +func (m *Int64Proto) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Int64Proto) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Value != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintCommon(dAtA, i, uint64(m.Value)) + } + return i, nil +} + +func (m *StringArrayProto) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StringArrayProto) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Values) > 0 { + for _, s := range m.Values { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *StringProto) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StringProto) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Value) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintCommon(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + return i, nil +} + +func encodeVarintCommon(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *BoolProto) Size() (n int) { + var l int + _ = l + if m.Value { + n += 2 + } + return n +} + +func (m *Float64Proto) Size() (n int) { + var l int + _ = l + if m.Value != 0 { + n += 9 + } + return n +} + +func (m *Int64Proto) Size() (n int) { + var l int + _ = l + if m.Value != 0 { + n += 1 + sovCommon(uint64(m.Value)) + } + return n +} + +func (m *StringArrayProto) Size() (n int) { + var l int + _ = l + if len(m.Values) > 0 { + for _, s := range m.Values { + l = len(s) + n += 1 + l + sovCommon(uint64(l)) + } + } + return n +} + +func (m *StringProto) Size() (n int) { + var l int + _ = l + l = len(m.Value) + if l > 0 { + n += 1 + l + sovCommon(uint64(l)) + } + return n +} + +func sovCommon(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozCommon(x uint64) (n int) { + return sovCommon(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *BoolProto) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BoolProto: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BoolProto: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Value = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipCommon(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCommon + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Float64Proto) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Float64Proto: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Float64Proto: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Value = float64(math.Float64frombits(v)) + default: + iNdEx = preIndex + skippy, err := skipCommon(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCommon + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Int64Proto) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Int64Proto: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Int64Proto: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + m.Value = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Value |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipCommon(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCommon + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StringArrayProto) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StringArrayProto: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StringArrayProto: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommon + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Values = append(m.Values, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommon(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCommon + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StringProto) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StringProto: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StringProto: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommon + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommon(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthCommon + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipCommon(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCommon + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCommon + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCommon + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthCommon + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCommon + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipCommon(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthCommon = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowCommon = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.proto", fileDescriptorCommon) +} + +var fileDescriptorCommon = []byte{ + // 210 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x72, 0x49, 0xcf, 0x2c, 0xc9, + 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0xcf, 0x35, 0x4e, 0x49, 0xd2, 0xcf, 0x35, 0xd6, 0x2f, + 0x2e, 0x4a, 0xd6, 0x4f, 0xce, 0x29, 0x2d, 0x2e, 0x49, 0x2d, 0xd2, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, + 0x4a, 0x2c, 0x49, 0x4d, 0xd1, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x4f, 0xce, 0xcf, 0xcd, 0xcd, + 0xcf, 0x2b, 0x48, 0x82, 0x32, 0xf4, 0xc0, 0xa2, 0x42, 0x1c, 0x30, 0x61, 0x25, 0x45, 0x2e, 0x4e, + 0xa7, 0xfc, 0xfc, 0x9c, 0x00, 0xb0, 0xb0, 0x08, 0x17, 0x6b, 0x59, 0x62, 0x4e, 0x69, 0xaa, 0x04, + 0xa3, 0x02, 0xa3, 0x06, 0x47, 0x10, 0x84, 0xa3, 0xa4, 0xc2, 0xc5, 0xe3, 0x96, 0x93, 0x9f, 0x58, + 0x62, 0x66, 0x82, 0x45, 0x15, 0x23, 0x4c, 0x95, 0x12, 0x17, 0x97, 0x67, 0x1e, 0x76, 0x35, 0xcc, + 0x30, 0x35, 0x5a, 0x5c, 0x02, 0xc1, 0x25, 0x45, 0x99, 0x79, 0xe9, 0x8e, 0x45, 0x45, 0x89, 0x95, + 0x10, 0x95, 0x62, 0x5c, 0x6c, 0x60, 0xc9, 0x62, 0x09, 0x46, 0x05, 0x66, 0x0d, 0xce, 0x20, 0x28, + 0x4f, 0x49, 0x99, 0x8b, 0x1b, 0xa2, 0x16, 0x8b, 0x81, 0x9c, 0x50, 0x03, 0x9d, 0x04, 0x4e, 0x3c, + 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x92, + 0xd8, 0xc0, 0x1e, 0x34, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xdf, 0x70, 0x77, 0x28, 0x01, + 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.proto b/vendor/github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.proto new file mode 100644 index 00000000..9fce4c56 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/generated/proto/commonpb/common.proto @@ -0,0 +1,43 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +syntax = "proto3"; + +package commonpb; + +message BoolProto { + bool value = 1; +} + +message Float64Proto { + double value = 1; +} + +message Int64Proto { + int64 value = 1; +} + +message StringArrayProto { + repeated string values = 1; +} + +message StringProto { + string value = 1; +} + diff --git a/vendor/github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.pb.go b/vendor/github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.pb.go new file mode 100644 index 00000000..8691637e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.pb.go @@ -0,0 +1,388 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.proto + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* + Package metadatapb is a generated protocol buffer package. + + It is generated from these files: + github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.proto + + It has these top-level messages: + Metadata +*/ +package metadatapb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type Metadata struct { + Port uint32 `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"` + LivenessInterval int64 `protobuf:"varint,2,opt,name=liveness_interval,json=livenessInterval,proto3" json:"liveness_interval,omitempty"` + HeartbeatInterval int64 `protobuf:"varint,3,opt,name=heartbeat_interval,json=heartbeatInterval,proto3" json:"heartbeat_interval,omitempty"` +} + +func (m *Metadata) Reset() { *m = Metadata{} } +func (m *Metadata) String() string { return proto.CompactTextString(m) } +func (*Metadata) ProtoMessage() {} +func (*Metadata) Descriptor() ([]byte, []int) { return fileDescriptorMetadata, []int{0} } + +func (m *Metadata) GetPort() uint32 { + if m != nil { + return m.Port + } + return 0 +} + +func (m *Metadata) GetLivenessInterval() int64 { + if m != nil { + return m.LivenessInterval + } + return 0 +} + +func (m *Metadata) GetHeartbeatInterval() int64 { + if m != nil { + return m.HeartbeatInterval + } + return 0 +} + +func init() { + proto.RegisterType((*Metadata)(nil), "metadatapb.Metadata") +} +func (m *Metadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Metadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Port != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.Port)) + } + if m.LivenessInterval != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.LivenessInterval)) + } + if m.HeartbeatInterval != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.HeartbeatInterval)) + } + return i, nil +} + +func encodeVarintMetadata(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Metadata) Size() (n int) { + var l int + _ = l + if m.Port != 0 { + n += 1 + sovMetadata(uint64(m.Port)) + } + if m.LivenessInterval != 0 { + n += 1 + sovMetadata(uint64(m.LivenessInterval)) + } + if m.HeartbeatInterval != 0 { + n += 1 + sovMetadata(uint64(m.HeartbeatInterval)) + } + return n +} + +func sovMetadata(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozMetadata(x uint64) (n int) { + return sovMetadata(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Metadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Metadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Metadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LivenessInterval", wireType) + } + m.LivenessInterval = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LivenessInterval |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HeartbeatInterval", wireType) + } + m.HeartbeatInterval = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HeartbeatInterval |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipMetadata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetadata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipMetadata(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthMetadata + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipMetadata(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthMetadata = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowMetadata = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.proto", fileDescriptorMetadata) +} + +var fileDescriptorMetadata = []byte{ + // 196 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xf2, 0x48, 0xcf, 0x2c, 0xc9, + 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0xcf, 0x35, 0x4e, 0x49, 0xd2, 0xcf, 0x35, 0xd6, 0x2f, + 0x2e, 0x4a, 0xd6, 0x4f, 0xce, 0x29, 0x2d, 0x2e, 0x49, 0x2d, 0xd2, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, + 0x4a, 0x2c, 0x49, 0x4d, 0xd1, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0xcf, 0x4d, 0x2d, 0x49, 0x4c, + 0x49, 0x2c, 0x49, 0x2c, 0x48, 0x82, 0x33, 0xf5, 0xc0, 0x32, 0x42, 0x5c, 0x08, 0x29, 0xa5, 0x2a, + 0x2e, 0x0e, 0x5f, 0x28, 0x4f, 0x48, 0x88, 0x8b, 0xa5, 0x20, 0xbf, 0xa8, 0x44, 0x82, 0x51, 0x81, + 0x51, 0x83, 0x37, 0x08, 0xcc, 0x16, 0xd2, 0xe6, 0x12, 0xcc, 0xc9, 0x2c, 0x4b, 0xcd, 0x4b, 0x2d, + 0x2e, 0x8e, 0xcf, 0xcc, 0x2b, 0x49, 0x2d, 0x2a, 0x4b, 0xcc, 0x91, 0x60, 0x52, 0x60, 0xd4, 0x60, + 0x0e, 0x12, 0x80, 0x49, 0x78, 0x42, 0xc5, 0x85, 0x74, 0xb9, 0x84, 0x32, 0x52, 0x13, 0x8b, 0x4a, + 0x92, 0x52, 0x13, 0x4b, 0x10, 0xaa, 0x99, 0xc1, 0xaa, 0x05, 0xe1, 0x32, 0x30, 0xe5, 0x4e, 0x02, + 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, + 0x0c, 0x49, 0x6c, 0x60, 0x07, 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x60, 0x70, 0xca, 0x29, + 0xec, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.proto b/vendor/github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.proto new file mode 100644 index 00000000..fc9e27f1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/generated/proto/metadatapb/metadata.proto @@ -0,0 +1,28 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +syntax = "proto3"; + +package metadatapb; + +message Metadata { + uint32 port = 1; + int64 liveness_interval = 2; + int64 heartbeat_interval = 3; +} diff --git a/vendor/github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.pb.go b/vendor/github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.pb.go new file mode 100644 index 00000000..b90bbd8b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.pb.go @@ -0,0 +1,1808 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.proto + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* + Package placementpb is a generated protocol buffer package. + + It is generated from these files: + github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.proto + + It has these top-level messages: + Placement + Instance + InstanceMetadata + Shard + PlacementSnapshots +*/ +package placementpb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type ShardState int32 + +const ( + ShardState_INITIALIZING ShardState = 0 + ShardState_AVAILABLE ShardState = 1 + ShardState_LEAVING ShardState = 2 +) + +var ShardState_name = map[int32]string{ + 0: "INITIALIZING", + 1: "AVAILABLE", + 2: "LEAVING", +} +var ShardState_value = map[string]int32{ + "INITIALIZING": 0, + "AVAILABLE": 1, + "LEAVING": 2, +} + +func (x ShardState) String() string { + return proto.EnumName(ShardState_name, int32(x)) +} +func (ShardState) EnumDescriptor() ([]byte, []int) { return fileDescriptorPlacement, []int{0} } + +type Placement struct { + Instances map[string]*Instance `protobuf:"bytes,1,rep,name=instances" json:"instances,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value"` + ReplicaFactor uint32 `protobuf:"varint,2,opt,name=replica_factor,json=replicaFactor,proto3" json:"replica_factor,omitempty"` + NumShards uint32 `protobuf:"varint,3,opt,name=num_shards,json=numShards,proto3" json:"num_shards,omitempty"` + IsSharded bool `protobuf:"varint,4,opt,name=is_sharded,json=isSharded,proto3" json:"is_sharded,omitempty"` + // cutover_time is the placement-level cutover time and determines when the clients + // watching the placement deems the placement as "in effect" and can use it to determine + // shard placement. + CutoverTime int64 `protobuf:"varint,5,opt,name=cutover_time,json=cutoverTime,proto3" json:"cutover_time,omitempty"` + IsMirrored bool `protobuf:"varint,6,opt,name=is_mirrored,json=isMirrored,proto3" json:"is_mirrored,omitempty"` + // max_shard_set_id stores the maximum shard set id used to guarantee unique + // shard set id generations across placement changes. + MaxShardSetId uint32 `protobuf:"varint,7,opt,name=max_shard_set_id,json=maxShardSetId,proto3" json:"max_shard_set_id,omitempty"` +} + +func (m *Placement) Reset() { *m = Placement{} } +func (m *Placement) String() string { return proto.CompactTextString(m) } +func (*Placement) ProtoMessage() {} +func (*Placement) Descriptor() ([]byte, []int) { return fileDescriptorPlacement, []int{0} } + +func (m *Placement) GetInstances() map[string]*Instance { + if m != nil { + return m.Instances + } + return nil +} + +func (m *Placement) GetReplicaFactor() uint32 { + if m != nil { + return m.ReplicaFactor + } + return 0 +} + +func (m *Placement) GetNumShards() uint32 { + if m != nil { + return m.NumShards + } + return 0 +} + +func (m *Placement) GetIsSharded() bool { + if m != nil { + return m.IsSharded + } + return false +} + +func (m *Placement) GetCutoverTime() int64 { + if m != nil { + return m.CutoverTime + } + return 0 +} + +func (m *Placement) GetIsMirrored() bool { + if m != nil { + return m.IsMirrored + } + return false +} + +func (m *Placement) GetMaxShardSetId() uint32 { + if m != nil { + return m.MaxShardSetId + } + return 0 +} + +type Instance struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + IsolationGroup string `protobuf:"bytes,2,opt,name=isolation_group,json=isolationGroup,proto3" json:"isolation_group,omitempty"` + Zone string `protobuf:"bytes,3,opt,name=zone,proto3" json:"zone,omitempty"` + Weight uint32 `protobuf:"varint,4,opt,name=weight,proto3" json:"weight,omitempty"` + Endpoint string `protobuf:"bytes,5,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + Shards []*Shard `protobuf:"bytes,6,rep,name=shards" json:"shards,omitempty"` + ShardSetId uint32 `protobuf:"varint,7,opt,name=shard_set_id,json=shardSetId,proto3" json:"shard_set_id,omitempty"` + Hostname string `protobuf:"bytes,8,opt,name=hostname,proto3" json:"hostname,omitempty"` + Port uint32 `protobuf:"varint,9,opt,name=port,proto3" json:"port,omitempty"` + Metadata *InstanceMetadata `protobuf:"bytes,10,opt,name=metadata" json:"metadata,omitempty"` +} + +func (m *Instance) Reset() { *m = Instance{} } +func (m *Instance) String() string { return proto.CompactTextString(m) } +func (*Instance) ProtoMessage() {} +func (*Instance) Descriptor() ([]byte, []int) { return fileDescriptorPlacement, []int{1} } + +func (m *Instance) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *Instance) GetIsolationGroup() string { + if m != nil { + return m.IsolationGroup + } + return "" +} + +func (m *Instance) GetZone() string { + if m != nil { + return m.Zone + } + return "" +} + +func (m *Instance) GetWeight() uint32 { + if m != nil { + return m.Weight + } + return 0 +} + +func (m *Instance) GetEndpoint() string { + if m != nil { + return m.Endpoint + } + return "" +} + +func (m *Instance) GetShards() []*Shard { + if m != nil { + return m.Shards + } + return nil +} + +func (m *Instance) GetShardSetId() uint32 { + if m != nil { + return m.ShardSetId + } + return 0 +} + +func (m *Instance) GetHostname() string { + if m != nil { + return m.Hostname + } + return "" +} + +func (m *Instance) GetPort() uint32 { + if m != nil { + return m.Port + } + return 0 +} + +func (m *Instance) GetMetadata() *InstanceMetadata { + if m != nil { + return m.Metadata + } + return nil +} + +type InstanceMetadata struct { + DebugPort uint32 `protobuf:"varint,1,opt,name=debug_port,json=debugPort,proto3" json:"debug_port,omitempty"` +} + +func (m *InstanceMetadata) Reset() { *m = InstanceMetadata{} } +func (m *InstanceMetadata) String() string { return proto.CompactTextString(m) } +func (*InstanceMetadata) ProtoMessage() {} +func (*InstanceMetadata) Descriptor() ([]byte, []int) { return fileDescriptorPlacement, []int{2} } + +func (m *InstanceMetadata) GetDebugPort() uint32 { + if m != nil { + return m.DebugPort + } + return 0 +} + +type Shard struct { + Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + State ShardState `protobuf:"varint,2,opt,name=state,proto3,enum=placementpb.ShardState" json:"state,omitempty"` + SourceId string `protobuf:"bytes,3,opt,name=source_id,json=sourceId,proto3" json:"source_id,omitempty"` + // Shard-level cutover and cutoff times determine when the shards have been cut over or + // cut off from the source instance to the destination instance. The placement-level + // cutover times are usually (but not required to be) earlier than shard-level cutover + // times if the clients watching the placement need to send traffic to the shards before + // they are ready to cut over or after they are ready to cut off (e.g., for warmup purposes). + CutoverNanos int64 `protobuf:"varint,4,opt,name=cutover_nanos,json=cutoverNanos,proto3" json:"cutover_nanos,omitempty"` + CutoffNanos int64 `protobuf:"varint,5,opt,name=cutoff_nanos,json=cutoffNanos,proto3" json:"cutoff_nanos,omitempty"` +} + +func (m *Shard) Reset() { *m = Shard{} } +func (m *Shard) String() string { return proto.CompactTextString(m) } +func (*Shard) ProtoMessage() {} +func (*Shard) Descriptor() ([]byte, []int) { return fileDescriptorPlacement, []int{3} } + +func (m *Shard) GetId() uint32 { + if m != nil { + return m.Id + } + return 0 +} + +func (m *Shard) GetState() ShardState { + if m != nil { + return m.State + } + return ShardState_INITIALIZING +} + +func (m *Shard) GetSourceId() string { + if m != nil { + return m.SourceId + } + return "" +} + +func (m *Shard) GetCutoverNanos() int64 { + if m != nil { + return m.CutoverNanos + } + return 0 +} + +func (m *Shard) GetCutoffNanos() int64 { + if m != nil { + return m.CutoffNanos + } + return 0 +} + +type PlacementSnapshots struct { + Snapshots []*Placement `protobuf:"bytes,1,rep,name=snapshots" json:"snapshots,omitempty"` +} + +func (m *PlacementSnapshots) Reset() { *m = PlacementSnapshots{} } +func (m *PlacementSnapshots) String() string { return proto.CompactTextString(m) } +func (*PlacementSnapshots) ProtoMessage() {} +func (*PlacementSnapshots) Descriptor() ([]byte, []int) { return fileDescriptorPlacement, []int{4} } + +func (m *PlacementSnapshots) GetSnapshots() []*Placement { + if m != nil { + return m.Snapshots + } + return nil +} + +func init() { + proto.RegisterType((*Placement)(nil), "placementpb.Placement") + proto.RegisterType((*Instance)(nil), "placementpb.Instance") + proto.RegisterType((*InstanceMetadata)(nil), "placementpb.InstanceMetadata") + proto.RegisterType((*Shard)(nil), "placementpb.Shard") + proto.RegisterType((*PlacementSnapshots)(nil), "placementpb.PlacementSnapshots") + proto.RegisterEnum("placementpb.ShardState", ShardState_name, ShardState_value) +} +func (m *Placement) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Placement) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Instances) > 0 { + for k, _ := range m.Instances { + dAtA[i] = 0xa + i++ + v := m.Instances[k] + msgSize := 0 + if v != nil { + msgSize = v.Size() + msgSize += 1 + sovPlacement(uint64(msgSize)) + } + mapSize := 1 + len(k) + sovPlacement(uint64(len(k))) + msgSize + i = encodeVarintPlacement(dAtA, i, uint64(mapSize)) + dAtA[i] = 0xa + i++ + i = encodeVarintPlacement(dAtA, i, uint64(len(k))) + i += copy(dAtA[i:], k) + if v != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(v.Size())) + n1, err := v.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + } + } + if m.ReplicaFactor != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.ReplicaFactor)) + } + if m.NumShards != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.NumShards)) + } + if m.IsSharded { + dAtA[i] = 0x20 + i++ + if m.IsSharded { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.CutoverTime != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.CutoverTime)) + } + if m.IsMirrored { + dAtA[i] = 0x30 + i++ + if m.IsMirrored { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.MaxShardSetId != 0 { + dAtA[i] = 0x38 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.MaxShardSetId)) + } + return i, nil +} + +func (m *Instance) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Instance) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintPlacement(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if len(m.IsolationGroup) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(len(m.IsolationGroup))) + i += copy(dAtA[i:], m.IsolationGroup) + } + if len(m.Zone) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintPlacement(dAtA, i, uint64(len(m.Zone))) + i += copy(dAtA[i:], m.Zone) + } + if m.Weight != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.Weight)) + } + if len(m.Endpoint) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintPlacement(dAtA, i, uint64(len(m.Endpoint))) + i += copy(dAtA[i:], m.Endpoint) + } + if len(m.Shards) > 0 { + for _, msg := range m.Shards { + dAtA[i] = 0x32 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.ShardSetId != 0 { + dAtA[i] = 0x38 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.ShardSetId)) + } + if len(m.Hostname) > 0 { + dAtA[i] = 0x42 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(len(m.Hostname))) + i += copy(dAtA[i:], m.Hostname) + } + if m.Port != 0 { + dAtA[i] = 0x48 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.Port)) + } + if m.Metadata != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.Metadata.Size())) + n2, err := m.Metadata.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + return i, nil +} + +func (m *InstanceMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InstanceMetadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.DebugPort != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.DebugPort)) + } + return i, nil +} + +func (m *Shard) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Shard) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Id != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.Id)) + } + if m.State != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.State)) + } + if len(m.SourceId) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintPlacement(dAtA, i, uint64(len(m.SourceId))) + i += copy(dAtA[i:], m.SourceId) + } + if m.CutoverNanos != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.CutoverNanos)) + } + if m.CutoffNanos != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintPlacement(dAtA, i, uint64(m.CutoffNanos)) + } + return i, nil +} + +func (m *PlacementSnapshots) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PlacementSnapshots) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Snapshots) > 0 { + for _, msg := range m.Snapshots { + dAtA[i] = 0xa + i++ + i = encodeVarintPlacement(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func encodeVarintPlacement(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Placement) Size() (n int) { + var l int + _ = l + if len(m.Instances) > 0 { + for k, v := range m.Instances { + _ = k + _ = v + l = 0 + if v != nil { + l = v.Size() + l += 1 + sovPlacement(uint64(l)) + } + mapEntrySize := 1 + len(k) + sovPlacement(uint64(len(k))) + l + n += mapEntrySize + 1 + sovPlacement(uint64(mapEntrySize)) + } + } + if m.ReplicaFactor != 0 { + n += 1 + sovPlacement(uint64(m.ReplicaFactor)) + } + if m.NumShards != 0 { + n += 1 + sovPlacement(uint64(m.NumShards)) + } + if m.IsSharded { + n += 2 + } + if m.CutoverTime != 0 { + n += 1 + sovPlacement(uint64(m.CutoverTime)) + } + if m.IsMirrored { + n += 2 + } + if m.MaxShardSetId != 0 { + n += 1 + sovPlacement(uint64(m.MaxShardSetId)) + } + return n +} + +func (m *Instance) Size() (n int) { + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovPlacement(uint64(l)) + } + l = len(m.IsolationGroup) + if l > 0 { + n += 1 + l + sovPlacement(uint64(l)) + } + l = len(m.Zone) + if l > 0 { + n += 1 + l + sovPlacement(uint64(l)) + } + if m.Weight != 0 { + n += 1 + sovPlacement(uint64(m.Weight)) + } + l = len(m.Endpoint) + if l > 0 { + n += 1 + l + sovPlacement(uint64(l)) + } + if len(m.Shards) > 0 { + for _, e := range m.Shards { + l = e.Size() + n += 1 + l + sovPlacement(uint64(l)) + } + } + if m.ShardSetId != 0 { + n += 1 + sovPlacement(uint64(m.ShardSetId)) + } + l = len(m.Hostname) + if l > 0 { + n += 1 + l + sovPlacement(uint64(l)) + } + if m.Port != 0 { + n += 1 + sovPlacement(uint64(m.Port)) + } + if m.Metadata != nil { + l = m.Metadata.Size() + n += 1 + l + sovPlacement(uint64(l)) + } + return n +} + +func (m *InstanceMetadata) Size() (n int) { + var l int + _ = l + if m.DebugPort != 0 { + n += 1 + sovPlacement(uint64(m.DebugPort)) + } + return n +} + +func (m *Shard) Size() (n int) { + var l int + _ = l + if m.Id != 0 { + n += 1 + sovPlacement(uint64(m.Id)) + } + if m.State != 0 { + n += 1 + sovPlacement(uint64(m.State)) + } + l = len(m.SourceId) + if l > 0 { + n += 1 + l + sovPlacement(uint64(l)) + } + if m.CutoverNanos != 0 { + n += 1 + sovPlacement(uint64(m.CutoverNanos)) + } + if m.CutoffNanos != 0 { + n += 1 + sovPlacement(uint64(m.CutoffNanos)) + } + return n +} + +func (m *PlacementSnapshots) Size() (n int) { + var l int + _ = l + if len(m.Snapshots) > 0 { + for _, e := range m.Snapshots { + l = e.Size() + n += 1 + l + sovPlacement(uint64(l)) + } + } + return n +} + +func sovPlacement(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozPlacement(x uint64) (n int) { + return sovPlacement(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Placement) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Placement: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Placement: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Instances", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPlacement + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Instances == nil { + m.Instances = make(map[string]*Instance) + } + var mapkey string + var mapvalue *Instance + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthPlacement + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthPlacement + } + postmsgIndex := iNdEx + mapmsglen + if mapmsglen < 0 { + return ErrInvalidLengthPlacement + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &Instance{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipPlacement(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPlacement + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Instances[mapkey] = mapvalue + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReplicaFactor", wireType) + } + m.ReplicaFactor = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ReplicaFactor |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumShards", wireType) + } + m.NumShards = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumShards |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsSharded", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IsSharded = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CutoverTime", wireType) + } + m.CutoverTime = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CutoverTime |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsMirrored", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IsMirrored = bool(v != 0) + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxShardSetId", wireType) + } + m.MaxShardSetId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxShardSetId |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPlacement(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPlacement + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Instance) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Instance: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Instance: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPlacement + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IsolationGroup", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPlacement + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IsolationGroup = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Zone", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPlacement + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Zone = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Weight", wireType) + } + m.Weight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Weight |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPlacement + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Endpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shards", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPlacement + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shards = append(m.Shards, &Shard{}) + if err := m.Shards[len(m.Shards)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ShardSetId", wireType) + } + m.ShardSetId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ShardSetId |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPlacement + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPlacement + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Metadata == nil { + m.Metadata = &InstanceMetadata{} + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPlacement(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPlacement + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *InstanceMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InstanceMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InstanceMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DebugPort", wireType) + } + m.DebugPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DebugPort |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPlacement(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPlacement + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Shard) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Shard: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Shard: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + m.Id = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Id |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + m.State = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.State |= (ShardState(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SourceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPlacement + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SourceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CutoverNanos", wireType) + } + m.CutoverNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CutoverNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CutoffNanos", wireType) + } + m.CutoffNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CutoffNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPlacement(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPlacement + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PlacementSnapshots) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PlacementSnapshots: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PlacementSnapshots: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Snapshots", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPlacement + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPlacement + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Snapshots = append(m.Snapshots, &Placement{}) + if err := m.Snapshots[len(m.Snapshots)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPlacement(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPlacement + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipPlacement(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPlacement + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPlacement + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPlacement + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthPlacement + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPlacement + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipPlacement(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthPlacement = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowPlacement = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.proto", fileDescriptorPlacement) +} + +var fileDescriptorPlacement = []byte{ + // 672 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x54, 0xc1, 0x6e, 0xd3, 0x4c, + 0x10, 0xae, 0x93, 0x26, 0x8d, 0x27, 0x4d, 0xfe, 0x68, 0xa5, 0xbf, 0x58, 0x45, 0x0d, 0x21, 0xa8, + 0x22, 0x2a, 0x22, 0x16, 0x2d, 0x07, 0xe8, 0x2d, 0x45, 0xa5, 0x72, 0x95, 0x56, 0xd5, 0xa6, 0xea, + 0x81, 0x8b, 0xb5, 0xb1, 0x37, 0xc9, 0x8a, 0x78, 0xd7, 0xda, 0x5d, 0x97, 0x96, 0xa7, 0xe0, 0x3d, + 0x78, 0x0d, 0x0e, 0x1c, 0x79, 0x04, 0x54, 0x1e, 0x82, 0x2b, 0xf2, 0xda, 0x4e, 0x52, 0xe8, 0x6d, + 0xe6, 0x9b, 0x6f, 0x77, 0x66, 0xbe, 0x99, 0x5d, 0x38, 0x9d, 0x32, 0x3d, 0x4b, 0xc6, 0xfd, 0x40, + 0x44, 0x6e, 0x74, 0x10, 0x8e, 0xdd, 0xe8, 0xc0, 0x55, 0x32, 0x70, 0x83, 0x79, 0xa2, 0x34, 0x95, + 0xee, 0x94, 0x72, 0x2a, 0x89, 0xa6, 0xa1, 0x1b, 0x4b, 0xa1, 0x85, 0x1b, 0xcf, 0x49, 0x40, 0x23, + 0xca, 0x75, 0x3c, 0x5e, 0xda, 0x7d, 0x13, 0x43, 0xf5, 0x95, 0x60, 0xf7, 0x77, 0x09, 0xec, 0x8b, + 0xc2, 0x47, 0xef, 0xc0, 0x66, 0x5c, 0x69, 0xc2, 0x03, 0xaa, 0x1c, 0xab, 0x53, 0xee, 0xd5, 0xf7, + 0x77, 0xfb, 0x2b, 0xf4, 0xfe, 0x82, 0xda, 0xf7, 0x0a, 0xde, 0x31, 0xd7, 0xf2, 0x16, 0x2f, 0xcf, + 0xa1, 0x5d, 0x68, 0x4a, 0x1a, 0xcf, 0x59, 0x40, 0xfc, 0x09, 0x09, 0xb4, 0x90, 0x4e, 0xa9, 0x63, + 0xf5, 0x1a, 0xb8, 0x91, 0xa3, 0xef, 0x0d, 0x88, 0x76, 0x00, 0x78, 0x12, 0xf9, 0x6a, 0x46, 0x64, + 0xa8, 0x9c, 0xb2, 0xa1, 0xd8, 0x3c, 0x89, 0x46, 0x06, 0x48, 0xc3, 0x4c, 0x65, 0x51, 0x1a, 0x3a, + 0xeb, 0x1d, 0xab, 0x57, 0xc3, 0x36, 0x53, 0xa3, 0x0c, 0x40, 0x4f, 0x61, 0x33, 0x48, 0xb4, 0xb8, + 0xa6, 0xd2, 0xd7, 0x2c, 0xa2, 0x4e, 0xa5, 0x63, 0xf5, 0xca, 0xb8, 0x9e, 0x63, 0x97, 0x2c, 0xa2, + 0xe8, 0x09, 0xd4, 0x99, 0xf2, 0x23, 0x26, 0xa5, 0x90, 0x34, 0x74, 0xaa, 0xe6, 0x0a, 0x60, 0xea, + 0x2c, 0x47, 0xd0, 0x73, 0x68, 0x45, 0xe4, 0x26, 0xcb, 0xe1, 0x2b, 0xaa, 0x7d, 0x16, 0x3a, 0x1b, + 0x59, 0xa9, 0x11, 0xb9, 0x31, 0x99, 0x46, 0x54, 0x7b, 0xe1, 0xf6, 0x08, 0x9a, 0xf7, 0xdb, 0x45, + 0x2d, 0x28, 0x7f, 0xa4, 0xb7, 0x8e, 0xd5, 0xb1, 0x7a, 0x36, 0x4e, 0x4d, 0xf4, 0x02, 0x2a, 0xd7, + 0x64, 0x9e, 0x50, 0xd3, 0x6c, 0x7d, 0xff, 0xff, 0x7b, 0xb2, 0x15, 0xa7, 0x71, 0xc6, 0x39, 0x2c, + 0xbd, 0xb1, 0xba, 0xdf, 0x4a, 0x50, 0x2b, 0x70, 0xd4, 0x84, 0x12, 0x0b, 0xf3, 0xeb, 0x4a, 0x2c, + 0x2d, 0xed, 0x3f, 0xa6, 0xc4, 0x9c, 0x68, 0x26, 0xb8, 0x3f, 0x95, 0x22, 0x89, 0xcd, 0xbd, 0x36, + 0x6e, 0x2e, 0xe0, 0x93, 0x14, 0x45, 0x08, 0xd6, 0x3f, 0x0b, 0x4e, 0x8d, 0x7e, 0x36, 0x36, 0x36, + 0xda, 0x82, 0xea, 0x27, 0xca, 0xa6, 0x33, 0x6d, 0x64, 0x6b, 0xe0, 0xdc, 0x43, 0xdb, 0x50, 0xa3, + 0x3c, 0x8c, 0x05, 0xe3, 0xda, 0xe8, 0x65, 0xe3, 0x85, 0x8f, 0xf6, 0xa0, 0x9a, 0x4f, 0xa2, 0x6a, + 0xc6, 0x8e, 0xee, 0xd5, 0x6f, 0xb4, 0xc0, 0x39, 0x03, 0x75, 0x60, 0xf3, 0x01, 0xcd, 0x40, 0x2d, + 0x04, 0x4b, 0x33, 0xcd, 0x84, 0xd2, 0x9c, 0x44, 0xd4, 0xa9, 0x65, 0x99, 0x0a, 0x3f, 0xad, 0x38, + 0x16, 0x52, 0x3b, 0xb6, 0x39, 0x65, 0x6c, 0xf4, 0x16, 0x6a, 0x11, 0xd5, 0x24, 0x24, 0x9a, 0x38, + 0x60, 0xf4, 0xdb, 0x79, 0x50, 0xbf, 0xb3, 0x9c, 0x84, 0x17, 0xf4, 0xee, 0x2b, 0x68, 0xfd, 0x1d, + 0x4d, 0x77, 0x27, 0xa4, 0xe3, 0x64, 0xea, 0x9b, 0x44, 0x56, 0xb6, 0x5a, 0x06, 0xb9, 0x10, 0x52, + 0x77, 0xbf, 0x5a, 0x50, 0x31, 0x1d, 0xad, 0xc8, 0xde, 0x30, 0xb2, 0xbf, 0x84, 0x8a, 0xd2, 0x44, + 0x67, 0x43, 0x6c, 0xee, 0x3f, 0xfa, 0x57, 0x84, 0x51, 0x1a, 0xc6, 0x19, 0x0b, 0x3d, 0x06, 0x5b, + 0x89, 0x44, 0x06, 0x34, 0x55, 0x21, 0x9b, 0x40, 0x2d, 0x03, 0xbc, 0x10, 0x3d, 0x83, 0x46, 0xb1, + 0xa1, 0x9c, 0x70, 0xa1, 0xcc, 0x30, 0xca, 0xb8, 0x58, 0xdb, 0xf3, 0x14, 0x2b, 0xd6, 0x78, 0x32, + 0xc9, 0x39, 0x2b, 0x6b, 0x3c, 0x99, 0x18, 0x4a, 0xf7, 0x14, 0xd0, 0xe2, 0xd5, 0x8d, 0x38, 0x89, + 0xd5, 0x4c, 0x68, 0x85, 0x5e, 0x83, 0xad, 0x0a, 0x27, 0x7f, 0xa9, 0x5b, 0x0f, 0xbf, 0x54, 0xbc, + 0x24, 0xee, 0x1d, 0x02, 0x2c, 0xbb, 0x40, 0x2d, 0xd8, 0xf4, 0xce, 0xbd, 0x4b, 0x6f, 0x30, 0xf4, + 0x3e, 0x78, 0xe7, 0x27, 0xad, 0x35, 0xd4, 0x00, 0x7b, 0x70, 0x35, 0xf0, 0x86, 0x83, 0xa3, 0xe1, + 0x71, 0xcb, 0x42, 0x75, 0xd8, 0x18, 0x1e, 0x0f, 0xae, 0xd2, 0x58, 0xe9, 0xa8, 0xf5, 0xfd, 0xae, + 0x6d, 0xfd, 0xb8, 0x6b, 0x5b, 0x3f, 0xef, 0xda, 0xd6, 0x97, 0x5f, 0xed, 0xb5, 0x71, 0xd5, 0xfc, + 0x27, 0x07, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x13, 0xbd, 0x6b, 0xbf, 0x9d, 0x04, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.proto b/vendor/github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.proto new file mode 100644 index 00000000..16a4564f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/generated/proto/placementpb/placement.proto @@ -0,0 +1,81 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +syntax = "proto3"; + +package placementpb; + +message Placement { + map instances = 1; + uint32 replica_factor = 2; + uint32 num_shards = 3; + bool is_sharded = 4; + + // cutover_time is the placement-level cutover time and determines when the clients + // watching the placement deems the placement as "in effect" and can use it to determine + // shard placement. + int64 cutover_time = 5; + + bool is_mirrored = 6; + + // max_shard_set_id stores the maximum shard set id used to guarantee unique + // shard set id generations across placement changes. + uint32 max_shard_set_id = 7; +} + +message Instance { + string id = 1; + string isolation_group = 2; + string zone = 3; + uint32 weight = 4; + string endpoint = 5; + repeated Shard shards = 6; + uint32 shard_set_id = 7; + string hostname = 8; + uint32 port = 9; + InstanceMetadata metadata = 10; +} + +message InstanceMetadata { + uint32 debug_port = 1; +} + +message Shard { + uint32 id = 1; + ShardState state = 2; + string source_id = 3; + + // Shard-level cutover and cutoff times determine when the shards have been cut over or + // cut off from the source instance to the destination instance. The placement-level + // cutover times are usually (but not required to be) earlier than shard-level cutover + // times if the clients watching the placement need to send traffic to the shards before + // they are ready to cut over or after they are ready to cut off (e.g., for warmup purposes). + int64 cutover_nanos = 4; + int64 cutoff_nanos = 5; +} + +enum ShardState { + INITIALIZING = 0; + AVAILABLE = 1; + LEAVING = 2; +} + +message PlacementSnapshots { + repeated Placement snapshots = 1; +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/config.go b/vendor/github.com/m3db/m3/src/cluster/kv/config.go new file mode 100644 index 00000000..100f3bd8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/config.go @@ -0,0 +1,36 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package kv + +// OverrideConfiguration is the config for OverrideOptions. +type OverrideConfiguration struct { + Zone string `yaml:"zone"` + Environment string `yaml:"environment"` + Namespace string `yaml:"namespace"` +} + +// NewOverrideOptions creates a OverrideOptions. +func (cfg OverrideConfiguration) NewOverrideOptions() (OverrideOptions, error) { + return NewOverrideOptions(). + SetZone(cfg.Zone). + SetEnvironment(cfg.Environment). + SetNamespace(cfg.Namespace), nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/etcd/options.go b/vendor/github.com/m3db/m3/src/cluster/kv/etcd/options.go new file mode 100644 index 00000000..7b2caa23 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/etcd/options.go @@ -0,0 +1,242 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package etcd + +import ( + "errors" + "fmt" + "os" + "time" + + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/retry" +) + +var ( + defaultRequestTimeout = 10 * time.Second + defaultWatchChanCheckInterval = 10 * time.Second + defaultWatchChanResetInterval = 10 * time.Second + defaultWatchChanInitTimeout = 10 * time.Second + defaultRetryOptions = retry.NewOptions().SetMaxRetries(5) + defaultCacheFileFn = func(string) string { return "" } + defaultNewDirectoryMode = os.FileMode(0755) +) + +// CacheFileFn is a function to generate cache file path +type CacheFileFn func(namespace string) string + +// Options are options for the client of the kv store +type Options interface { + // RequestTimeout is the timeout for etcd requests + RequestTimeout() time.Duration + // SetRequestTimeout sets the RequestTimeout + SetRequestTimeout(t time.Duration) Options + + // InstrumentsOptions is the instrument options + InstrumentsOptions() instrument.Options + // SetInstrumentsOptions sets the InstrumentsOptions + SetInstrumentsOptions(iopts instrument.Options) Options + + // RetryOptions is the retry options + RetryOptions() retry.Options + // SetRetryOptions sets the RetryOptions + SetRetryOptions(ropts retry.Options) Options + + // WatchChanCheckInterval will be used to periodically check if a watch chan + // is no longer being subscribed and should be closed + WatchChanCheckInterval() time.Duration + // SetWatchChanCheckInterval sets the WatchChanCheckInterval + SetWatchChanCheckInterval(t time.Duration) Options + + // WatchChanResetInterval is the delay before resetting the etcd watch chan + WatchChanResetInterval() time.Duration + // SetWatchChanResetInterval sets the WatchChanResetInterval + SetWatchChanResetInterval(t time.Duration) Options + + // WatchChanInitTimeout is the timeout for a watchChan initialization + WatchChanInitTimeout() time.Duration + // SetWatchChanInitTimeout sets the WatchChanInitTimeout + SetWatchChanInitTimeout(t time.Duration) Options + + // WatchWithRevision is the revision that watch requests will start from. + WatchWithRevision() int64 + + // SetWatchWithRevision sets the revision that watch requests will start + // from. + SetWatchWithRevision(rev int64) Options + + // Prefix is the prefix for each key + Prefix() string + // SetPrefix sets the prefix + SetPrefix(s string) Options + // ApplyPrefix applies the prefix to the key + ApplyPrefix(key string) string + + // CacheFileDir is the dir for cache. + CacheFileFn() CacheFileFn + // SetCacheFileDir sets the CacheFileDir + SetCacheFileFn(fn CacheFileFn) Options + + SetNewDirectoryMode(fm os.FileMode) Options + NewDirectoryMode() os.FileMode + + // Validate validates the Options + Validate() error +} + +type options struct { + requestTimeout time.Duration + prefix string + iopts instrument.Options + ropts retry.Options + watchChanCheckInterval time.Duration + watchChanResetInterval time.Duration + watchChanInitTimeout time.Duration + watchWithRevision int64 + cacheFileFn CacheFileFn + newDirectoryMode os.FileMode +} + +// NewOptions creates a sane default Option +func NewOptions() Options { + o := options{} + return o.SetRequestTimeout(defaultRequestTimeout). + SetInstrumentsOptions(instrument.NewOptions()). + SetRetryOptions(defaultRetryOptions). + SetWatchChanCheckInterval(defaultWatchChanCheckInterval). + SetWatchChanResetInterval(defaultWatchChanResetInterval). + SetWatchChanInitTimeout(defaultWatchChanInitTimeout). + SetCacheFileFn(defaultCacheFileFn). + SetNewDirectoryMode(defaultNewDirectoryMode) +} + +func (o options) Validate() error { + if o.iopts == nil { + return errors.New("no instrument options") + } + + if o.ropts == nil { + return errors.New("no retry options") + } + + if o.watchChanCheckInterval <= 0 { + return errors.New("invalid watch channel check interval") + } + + return nil +} + +func (o options) RequestTimeout() time.Duration { + return o.requestTimeout +} + +func (o options) SetRequestTimeout(t time.Duration) Options { + o.requestTimeout = t + return o +} + +func (o options) InstrumentsOptions() instrument.Options { + return o.iopts +} + +func (o options) SetInstrumentsOptions(iopts instrument.Options) Options { + o.iopts = iopts + return o +} + +func (o options) RetryOptions() retry.Options { + return o.ropts +} + +func (o options) SetRetryOptions(ropts retry.Options) Options { + o.ropts = ropts + return o +} + +func (o options) WatchChanCheckInterval() time.Duration { + return o.watchChanCheckInterval +} + +func (o options) SetWatchChanCheckInterval(t time.Duration) Options { + o.watchChanCheckInterval = t + return o +} + +func (o options) WatchChanResetInterval() time.Duration { + return o.watchChanResetInterval +} + +func (o options) SetWatchChanResetInterval(t time.Duration) Options { + o.watchChanResetInterval = t + return o +} + +func (o options) WatchChanInitTimeout() time.Duration { + return o.watchChanInitTimeout +} + +func (o options) SetWatchChanInitTimeout(t time.Duration) Options { + o.watchChanInitTimeout = t + return o +} + +func (o options) WatchWithRevision() int64 { + return o.watchWithRevision +} + +func (o options) SetWatchWithRevision(rev int64) Options { + o.watchWithRevision = rev + return o +} + +func (o options) CacheFileFn() CacheFileFn { + return o.cacheFileFn +} + +func (o options) SetCacheFileFn(fn CacheFileFn) Options { + o.cacheFileFn = fn + return o +} + +func (o options) Prefix() string { + return o.prefix +} + +func (o options) SetPrefix(prefix string) Options { + o.prefix = prefix + return o +} + +func (o options) ApplyPrefix(key string) string { + if o.prefix == "" { + return key + } + return fmt.Sprintf("%s/%s", o.prefix, key) +} + +func (o options) SetNewDirectoryMode(fm os.FileMode) Options { + o.newDirectoryMode = fm + return o +} + +func (o options) NewDirectoryMode() os.FileMode { + return o.newDirectoryMode +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/etcd/store.go b/vendor/github.com/m3db/m3/src/cluster/kv/etcd/store.go new file mode 100644 index 00000000..a144dcc5 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/etcd/store.go @@ -0,0 +1,712 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package etcd + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "path" + "sync" + + "github.com/m3db/m3/src/cluster/etcd/watchmanager" + "github.com/m3db/m3/src/cluster/kv" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/retry" + + "go.etcd.io/etcd/clientv3" + "github.com/golang/protobuf/proto" + "github.com/uber-go/tally" + "go.uber.org/zap" + "golang.org/x/net/context" +) + +const etcdVersionZero = 0 + +var ( + noopCancel func() + emptyCmp clientv3.Cmp + emptyOp clientv3.Op + errInvalidHistoryVersion = errors.New("invalid version range") + errNilPutResponse = errors.New("nil put response from etcd") +) + +// NewStore creates a kv store based on etcd +func NewStore(etcdKV clientv3.KV, etcdWatcher clientv3.Watcher, opts Options) (kv.TxnStore, error) { + scope := opts.InstrumentsOptions().MetricsScope() + + store := &client{ + opts: opts, + kv: etcdKV, + watcher: etcdWatcher, + watchables: map[string]kv.ValueWatchable{}, + retrier: retry.NewRetrier(opts.RetryOptions()), + logger: opts.InstrumentsOptions().Logger(), + cacheFile: opts.CacheFileFn()(opts.Prefix()), + cache: newCache(), + cacheUpdatedCh: make(chan struct{}, 1), + m: clientMetrics{ + etcdGetError: scope.Counter("etcd-get-error"), + etcdPutError: scope.Counter("etcd-put-error"), + etcdTnxError: scope.Counter("etcd-tnx-error"), + diskWriteError: scope.Counter("disk-write-error"), + diskReadError: scope.Counter("disk-read-error"), + }, + } + + clientWatchOpts := []clientv3.OpOption{ + // periodically (appx every 10 mins) checks for the latest data + // with or without any update notification + clientv3.WithProgressNotify(), + // receive initial notification once the watch channel is created + clientv3.WithCreatedNotify(), + } + + if rev := opts.WatchWithRevision(); rev > 0 { + clientWatchOpts = append(clientWatchOpts, clientv3.WithRev(rev)) + } + + wOpts := watchmanager.NewOptions(). + SetWatcher(etcdWatcher). + SetUpdateFn(store.update). + SetTickAndStopFn(store.tickAndStop). + SetWatchOptions(clientWatchOpts). + SetWatchChanCheckInterval(opts.WatchChanCheckInterval()). + SetWatchChanInitTimeout(opts.WatchChanInitTimeout()). + SetWatchChanResetInterval(opts.WatchChanResetInterval()). + SetInstrumentsOptions(opts.InstrumentsOptions()) + + wm, err := watchmanager.NewWatchManager(wOpts) + if err != nil { + return nil, err + } + + store.wm = wm + + if store.cacheFile != "" { + if err := store.initCache(opts.NewDirectoryMode()); err != nil { + store.logger.Warn("could not load cache from file", zap.String("file", store.cacheFile), zap.Error(err)) + } else { + store.logger.Info("successfully loaded cache from file", zap.String("file", store.cacheFile)) + } + + go func() { + for range store.cacheUpdatedCh { + if err := store.writeCacheToFile(); err != nil { + store.logger.Warn("failed to write cache to file", zap.Error(err)) + } + } + }() + } + return store, nil +} + +type client struct { + sync.RWMutex + + opts Options + kv clientv3.KV + watcher clientv3.Watcher + watchables map[string]kv.ValueWatchable + retrier retry.Retrier + logger *zap.Logger + m clientMetrics + cache *valueCache + cacheFile string + cacheUpdatedCh chan struct{} + + wm watchmanager.WatchManager +} + +type clientMetrics struct { + etcdGetError tally.Counter + etcdPutError tally.Counter + etcdTnxError tally.Counter + diskWriteError tally.Counter + diskReadError tally.Counter +} + +// Get returns the latest value from etcd store and only fall back to +// in-memory cache if the remote store is unavailable +func (c *client) Get(key string) (kv.Value, error) { + return c.get(c.opts.ApplyPrefix(key)) +} + +func (c *client) get(key string) (kv.Value, error) { + ctx, cancel := c.context() + defer cancel() + + r, err := c.kv.Get(ctx, key) + if err != nil { + c.m.etcdGetError.Inc(1) + cachedV, ok := c.getCache(key) + if ok { + return cachedV, nil + } + return nil, err + } + + if r.Count == 0 { + c.deleteCache(key) // delete cache entry if it exists + return nil, kv.ErrNotFound + } + + v := newValue(r.Kvs[0].Value, r.Kvs[0].Version, r.Kvs[0].ModRevision) + + c.mergeCache(key, v) + + return v, nil +} + +func (c *client) History(key string, from, to int) ([]kv.Value, error) { + if from > to || from < 0 || to < 0 { + return nil, errInvalidHistoryVersion + } + + if from == to { + return nil, nil + } + + newKey := c.opts.ApplyPrefix(key) + + ctx, cancel := c.context() + defer cancel() + + r, err := c.kv.Get(ctx, newKey) + if err != nil { + return nil, err + } + + if r.Count == 0 { + return nil, kv.ErrNotFound + } + + numValue := to - from + + latestKV := r.Kvs[0] + version := int(latestKV.Version) + modRev := latestKV.ModRevision + + if version < from { + // no value available in the requested version range + return nil, nil + } + + if version-from+1 < numValue { + // get the correct size of the result slice + numValue = version - from + 1 + } + + res := make([]kv.Value, numValue) + + if version < to { + // put it in the last element of the result + res[version-from] = newValue(latestKV.Value, latestKV.Version, modRev) + } + + for version > from { + ctx, cancel := c.context() + defer cancel() + + r, err = c.kv.Get(ctx, newKey, clientv3.WithRev(modRev-1)) + if err != nil { + return nil, err + } + + if r.Count == 0 { + // unexpected + return nil, fmt.Errorf("could not find version %d for key %s", version-1, key) + } + + v := r.Kvs[0] + modRev = v.ModRevision + version = int(v.Version) + if version < to { + res[version-from] = newValue(v.Value, v.Version, v.ModRevision) + } + } + + return res, nil +} + +func (c *client) processCondition(condition kv.Condition) (clientv3.Cmp, error) { + var cmp clientv3.Cmp + switch condition.TargetType() { + case kv.TargetVersion: + cmp = clientv3.Version(c.opts.ApplyPrefix(condition.Key())) + default: + return emptyCmp, kv.ErrUnknownTargetType + } + + var compareStr string + switch condition.CompareType() { + case kv.CompareEqual: + compareStr = condition.CompareType().String() + default: + return emptyCmp, kv.ErrUnknownCompareType + } + + return clientv3.Compare(cmp, compareStr, condition.Value()), nil +} + +func (c *client) processOp(op kv.Op) (clientv3.Op, error) { + switch op.Type() { + case kv.OpSet: + opSet := op.(kv.SetOp) + + value, err := proto.Marshal(opSet.Value) + if err != nil { + return emptyOp, err + } + + return clientv3.OpPut( + c.opts.ApplyPrefix(opSet.Key()), + string(value), + clientv3.WithPrevKV(), + ), nil + default: + return emptyOp, kv.ErrUnknownOpType + } +} + +func (c *client) Commit(conditions []kv.Condition, ops []kv.Op) (kv.Response, error) { + ctx, cancel := c.context() + defer cancel() + + txn := c.kv.Txn(ctx) + + cmps := make([]clientv3.Cmp, len(conditions)) + for i, condition := range conditions { + cmp, err := c.processCondition(condition) + if err != nil { + return nil, err + } + + cmps[i] = cmp + } + + txn = txn.If(cmps...) + + etcdOps := make([]clientv3.Op, len(ops)) + opResponses := make([]kv.OpResponse, len(ops)) + for i, op := range ops { + etcdOp, err := c.processOp(op) + if err != nil { + return nil, err + } + + etcdOps[i] = etcdOp + opResponses[i] = kv.NewOpResponse(op) + } + + txn = txn.Then(etcdOps...) + + r, err := txn.Commit() + if err != nil { + c.m.etcdTnxError.Inc(1) + return nil, err + } + if !r.Succeeded { + return nil, kv.ErrConditionCheckFailed + } + + for i := range r.Responses { + opr := opResponses[i] + switch opr.Type() { + case kv.OpSet: + res := r.Responses[i].GetResponsePut() + if res == nil { + return nil, errNilPutResponse + } + + if res.PrevKv != nil { + opr = opr.SetValue(int(res.PrevKv.Version + 1)) + } else { + opr = opr.SetValue(etcdVersionZero + 1) + } + } + + opResponses[i] = opr + } + + return kv.NewResponse().SetResponses(opResponses), nil +} + +func (c *client) Watch(key string) (kv.ValueWatch, error) { + newKey := c.opts.ApplyPrefix(key) + c.Lock() + watchable, ok := c.watchables[newKey] + if !ok { + watchable = kv.NewValueWatchable() + c.watchables[newKey] = watchable + + go c.wm.Watch(newKey) + + } + c.Unlock() + _, w, err := watchable.Watch() + return w, err +} + +func (c *client) getFromKVStore(key string) (kv.Value, error) { + var ( + nv kv.Value + err error + ) + if execErr := c.retrier.Attempt(func() error { + nv, err = c.get(key) + if err == kv.ErrNotFound { + // do not retry on ErrNotFound + return retry.NonRetryableError(err) + } + return err + }); execErr != nil && xerrors.GetInnerNonRetryableError(execErr) != kv.ErrNotFound { + return nil, execErr + } + + return nv, nil +} + +func (c *client) getFromEtcdEvents(key string, events []*clientv3.Event) kv.Value { + lastEvent := events[len(events)-1] + if lastEvent.Type == clientv3.EventTypeDelete { + c.deleteCache(key) + return nil + } + + nv := newValue(lastEvent.Kv.Value, lastEvent.Kv.Version, lastEvent.Kv.ModRevision) + c.mergeCache(key, nv) + return nv +} + +func (c *client) update(key string, events []*clientv3.Event) error { + var nv kv.Value + if len(events) == 0 { + var err error + if nv, err = c.getFromKVStore(key); err != nil { + // This is triggered by initializing a new watch and no value available for the key. + return nil + } + } else { + nv = c.getFromEtcdEvents(key, events) + } + + c.RLock() + w, ok := c.watchables[key] + c.RUnlock() + if !ok { + return fmt.Errorf("unexpected: no watchable found for key: %s", key) + } + + curValue := w.Get() + + // Both current and new are nil. + if curValue == nil && nv == nil { + return nil + } + + if nv == nil { + // At deletion, just update the watch to nil. + return w.Update(nil) + } + + if curValue == nil || nv.IsNewer(curValue) { + return w.Update(nv) + } + + return nil +} + +func (c *client) tickAndStop(key string) bool { + // fast path + c.RLock() + watchable, ok := c.watchables[key] + c.RUnlock() + if !ok { + c.logger.Warn("unexpected: key is already cleaned up", zap.String("key", key)) + return true + } + + if watchable.NumWatches() != 0 { + return false + } + + // slow path + c.Lock() + defer c.Unlock() + watchable, ok = c.watchables[key] + if !ok { + // not expect this to happen + c.logger.Warn("unexpected: key is already cleaned up", zap.String("key", key)) + return true + } + + if watchable.NumWatches() != 0 { + // a new watch has subscribed to the watchable, do not clean up + return false + } + + watchable.Close() + delete(c.watchables, key) + return true +} + +func (c *client) Set(key string, v proto.Message) (int, error) { + ctx, cancel := c.context() + defer cancel() + + value, err := proto.Marshal(v) + if err != nil { + return 0, err + } + + r, err := c.kv.Put(ctx, c.opts.ApplyPrefix(key), string(value), clientv3.WithPrevKV()) + if err != nil { + c.m.etcdPutError.Inc(1) + return 0, err + } + + // if there is no prev kv, means this is the first version of the key + if r.PrevKv == nil { + return etcdVersionZero + 1, nil + } + + return int(r.PrevKv.Version + 1), nil +} + +func (c *client) SetIfNotExists(key string, v proto.Message) (int, error) { + version, err := c.CheckAndSet(key, etcdVersionZero, v) + if err == kv.ErrVersionMismatch { + err = kv.ErrAlreadyExists + } + return version, err +} + +func (c *client) CheckAndSet(key string, version int, v proto.Message) (int, error) { + ctx, cancel := c.context() + defer cancel() + + value, err := proto.Marshal(v) + if err != nil { + return 0, err + } + + key = c.opts.ApplyPrefix(key) + r, err := c.kv.Txn(ctx). + If(clientv3.Compare(clientv3.Version(key), kv.CompareEqual.String(), version)). + Then(clientv3.OpPut(key, string(value))). + Commit() + if err != nil { + c.m.etcdTnxError.Inc(1) + return 0, err + } + if !r.Succeeded { + return 0, kv.ErrVersionMismatch + } + + return version + 1, nil +} + +func (c *client) Delete(key string) (kv.Value, error) { + ctx, cancel := c.context() + defer cancel() + + key = c.opts.ApplyPrefix(key) + + r, err := c.kv.Delete(ctx, key, clientv3.WithPrevKV()) + if err != nil { + return nil, err + } + + if r.Deleted == 0 { + return nil, kv.ErrNotFound + } + + prevKV := newValue(r.PrevKvs[0].Value, r.PrevKvs[0].Version, r.PrevKvs[0].ModRevision) + + c.deleteCache(key) + + return prevKV, nil +} + +func (c *client) deleteCache(key string) { + c.cache.Lock() + defer c.cache.Unlock() + + // only do a delete if we actually need to + _, found := c.cache.Values[key] + if !found { + return + } + + delete(c.cache.Values, key) + c.notifyCacheUpdate() +} + +func (c *client) getCache(key string) (kv.Value, bool) { + c.cache.RLock() + v, ok := c.cache.Values[key] + c.cache.RUnlock() + + return v, ok +} + +func (c *client) mergeCache(key string, v *value) { + c.cache.Lock() + + cur, ok := c.cache.Values[key] + if !ok || v.IsNewer(cur) { + c.cache.Values[key] = v + c.notifyCacheUpdate() + } + + c.cache.Unlock() +} + +func (c *client) notifyCacheUpdate() { + // notify that cached data is updated + select { + case c.cacheUpdatedCh <- struct{}{}: + default: + } +} + +func (c *client) writeCacheToFile() error { + file, err := os.Create(c.cacheFile) + if err != nil { + c.m.diskWriteError.Inc(1) + c.logger.Warn("error creating cache file", zap.String("file", c.cacheFile), zap.Error(err)) + return fmt.Errorf("invalid cache file: %s", c.cacheFile) + } + + encoder := json.NewEncoder(file) + c.cache.RLock() + err = encoder.Encode(c.cache) + c.cache.RUnlock() + + if err != nil { + c.m.diskWriteError.Inc(1) + c.logger.Warn("error encoding values", zap.Error(err)) + return err + } + + if err = file.Close(); err != nil { + c.m.diskWriteError.Inc(1) + c.logger.Warn("error closing cache file", zap.String("file", c.cacheFile), zap.Error(err)) + } + + return nil +} + +func (c *client) createCacheDir(fm os.FileMode) error { + path := path.Dir(c.opts.CacheFileFn()(c.opts.Prefix())) + if err := os.MkdirAll(path, fm); err != nil { + c.m.diskWriteError.Inc(1) + c.logger.Warn("error creating cache directory", + zap.String("path", path), + zap.Error(err), + ) + return err + } + + c.logger.Info("successfully created new cache dir", + zap.String("path", path), + zap.Int("mode", int(fm)), + ) + + return nil +} + +func (c *client) initCache(fm os.FileMode) error { + if err := c.createCacheDir(fm); err != nil { + c.m.diskWriteError.Inc(1) + return fmt.Errorf("error creating cache directory: %s", err) + } + file, err := os.Open(c.cacheFile) + if err != nil { + c.m.diskReadError.Inc(1) + return fmt.Errorf("error opening cache file %s: %v", c.cacheFile, err) + } + + // Read bootstrap file + decoder := json.NewDecoder(file) + + if err := decoder.Decode(c.cache); err != nil { + c.m.diskReadError.Inc(1) + return fmt.Errorf("error reading cache file %s: %v", c.cacheFile, err) + } + + return nil +} + +func (c *client) context() (context.Context, context.CancelFunc) { + ctx := context.Background() + cancel := noopCancel + if c.opts.RequestTimeout() > 0 { + ctx, cancel = context.WithTimeout(ctx, c.opts.RequestTimeout()) + } + + return ctx, cancel +} + +type valueCache struct { + sync.RWMutex + + Values map[string]*value `json:"values"` +} + +func newCache() *valueCache { + return &valueCache{Values: make(map[string]*value)} +} + +type value struct { + Val []byte `json:"value"` + Ver int64 `json:"version"` + Rev int64 `json:"revision"` +} + +func newValue(val []byte, ver, rev int64) *value { + return &value{ + Val: val, + Ver: ver, + Rev: rev, + } +} + +func (c *value) IsNewer(other kv.Value) bool { + othervalue, ok := other.(*value) + if ok { + return c.Rev > othervalue.Rev + } + + return c.Version() > other.Version() +} + +func (c *value) Unmarshal(v proto.Message) error { + err := proto.Unmarshal(c.Val, v) + + return err +} + +func (c *value) Version() int { + return int(c.Ver) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/kv_mock.go b/vendor/github.com/m3db/m3/src/cluster/kv/kv_mock.go new file mode 100644 index 00000000..0fad5f61 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/kv_mock.go @@ -0,0 +1,1031 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/cluster/kv/types.go + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package kv is a generated GoMock package. +package kv + +import ( + "reflect" + + "github.com/golang/mock/gomock" + "github.com/golang/protobuf/proto" +) + +// MockValue is a mock of Value interface +type MockValue struct { + ctrl *gomock.Controller + recorder *MockValueMockRecorder +} + +// MockValueMockRecorder is the mock recorder for MockValue +type MockValueMockRecorder struct { + mock *MockValue +} + +// NewMockValue creates a new mock instance +func NewMockValue(ctrl *gomock.Controller) *MockValue { + mock := &MockValue{ctrl: ctrl} + mock.recorder = &MockValueMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockValue) EXPECT() *MockValueMockRecorder { + return m.recorder +} + +// Unmarshal mocks base method +func (m *MockValue) Unmarshal(v proto.Message) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Unmarshal", v) + ret0, _ := ret[0].(error) + return ret0 +} + +// Unmarshal indicates an expected call of Unmarshal +func (mr *MockValueMockRecorder) Unmarshal(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unmarshal", reflect.TypeOf((*MockValue)(nil).Unmarshal), v) +} + +// Version mocks base method +func (m *MockValue) Version() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Version") + ret0, _ := ret[0].(int) + return ret0 +} + +// Version indicates an expected call of Version +func (mr *MockValueMockRecorder) Version() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Version", reflect.TypeOf((*MockValue)(nil).Version)) +} + +// IsNewer mocks base method +func (m *MockValue) IsNewer(other Value) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsNewer", other) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsNewer indicates an expected call of IsNewer +func (mr *MockValueMockRecorder) IsNewer(other interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsNewer", reflect.TypeOf((*MockValue)(nil).IsNewer), other) +} + +// MockValueWatch is a mock of ValueWatch interface +type MockValueWatch struct { + ctrl *gomock.Controller + recorder *MockValueWatchMockRecorder +} + +// MockValueWatchMockRecorder is the mock recorder for MockValueWatch +type MockValueWatchMockRecorder struct { + mock *MockValueWatch +} + +// NewMockValueWatch creates a new mock instance +func NewMockValueWatch(ctrl *gomock.Controller) *MockValueWatch { + mock := &MockValueWatch{ctrl: ctrl} + mock.recorder = &MockValueWatchMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockValueWatch) EXPECT() *MockValueWatchMockRecorder { + return m.recorder +} + +// C mocks base method +func (m *MockValueWatch) C() <-chan struct{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "C") + ret0, _ := ret[0].(<-chan struct{}) + return ret0 +} + +// C indicates an expected call of C +func (mr *MockValueWatchMockRecorder) C() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "C", reflect.TypeOf((*MockValueWatch)(nil).C)) +} + +// Get mocks base method +func (m *MockValueWatch) Get() Value { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(Value) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockValueWatchMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockValueWatch)(nil).Get)) +} + +// Close mocks base method +func (m *MockValueWatch) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockValueWatchMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockValueWatch)(nil).Close)) +} + +// MockValueWatchable is a mock of ValueWatchable interface +type MockValueWatchable struct { + ctrl *gomock.Controller + recorder *MockValueWatchableMockRecorder +} + +// MockValueWatchableMockRecorder is the mock recorder for MockValueWatchable +type MockValueWatchableMockRecorder struct { + mock *MockValueWatchable +} + +// NewMockValueWatchable creates a new mock instance +func NewMockValueWatchable(ctrl *gomock.Controller) *MockValueWatchable { + mock := &MockValueWatchable{ctrl: ctrl} + mock.recorder = &MockValueWatchableMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockValueWatchable) EXPECT() *MockValueWatchableMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockValueWatchable) Get() Value { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(Value) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockValueWatchableMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockValueWatchable)(nil).Get)) +} + +// Watch mocks base method +func (m *MockValueWatchable) Watch() (Value, ValueWatch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch") + ret0, _ := ret[0].(Value) + ret1, _ := ret[1].(ValueWatch) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Watch indicates an expected call of Watch +func (mr *MockValueWatchableMockRecorder) Watch() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockValueWatchable)(nil).Watch)) +} + +// NumWatches mocks base method +func (m *MockValueWatchable) NumWatches() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumWatches") + ret0, _ := ret[0].(int) + return ret0 +} + +// NumWatches indicates an expected call of NumWatches +func (mr *MockValueWatchableMockRecorder) NumWatches() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumWatches", reflect.TypeOf((*MockValueWatchable)(nil).NumWatches)) +} + +// Update mocks base method +func (m *MockValueWatchable) Update(arg0 Value) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Update indicates an expected call of Update +func (mr *MockValueWatchableMockRecorder) Update(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockValueWatchable)(nil).Update), arg0) +} + +// IsClosed mocks base method +func (m *MockValueWatchable) IsClosed() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsClosed") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsClosed indicates an expected call of IsClosed +func (mr *MockValueWatchableMockRecorder) IsClosed() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsClosed", reflect.TypeOf((*MockValueWatchable)(nil).IsClosed)) +} + +// Close mocks base method +func (m *MockValueWatchable) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockValueWatchableMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockValueWatchable)(nil).Close)) +} + +// MockOverrideOptions is a mock of OverrideOptions interface +type MockOverrideOptions struct { + ctrl *gomock.Controller + recorder *MockOverrideOptionsMockRecorder +} + +// MockOverrideOptionsMockRecorder is the mock recorder for MockOverrideOptions +type MockOverrideOptionsMockRecorder struct { + mock *MockOverrideOptions +} + +// NewMockOverrideOptions creates a new mock instance +func NewMockOverrideOptions(ctrl *gomock.Controller) *MockOverrideOptions { + mock := &MockOverrideOptions{ctrl: ctrl} + mock.recorder = &MockOverrideOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOverrideOptions) EXPECT() *MockOverrideOptionsMockRecorder { + return m.recorder +} + +// Zone mocks base method +func (m *MockOverrideOptions) Zone() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Zone") + ret0, _ := ret[0].(string) + return ret0 +} + +// Zone indicates an expected call of Zone +func (mr *MockOverrideOptionsMockRecorder) Zone() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Zone", reflect.TypeOf((*MockOverrideOptions)(nil).Zone)) +} + +// SetZone mocks base method +func (m *MockOverrideOptions) SetZone(value string) OverrideOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetZone", value) + ret0, _ := ret[0].(OverrideOptions) + return ret0 +} + +// SetZone indicates an expected call of SetZone +func (mr *MockOverrideOptionsMockRecorder) SetZone(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetZone", reflect.TypeOf((*MockOverrideOptions)(nil).SetZone), value) +} + +// Namespace mocks base method +func (m *MockOverrideOptions) Namespace() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Namespace") + ret0, _ := ret[0].(string) + return ret0 +} + +// Namespace indicates an expected call of Namespace +func (mr *MockOverrideOptionsMockRecorder) Namespace() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Namespace", reflect.TypeOf((*MockOverrideOptions)(nil).Namespace)) +} + +// SetNamespace mocks base method +func (m *MockOverrideOptions) SetNamespace(namespace string) OverrideOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetNamespace", namespace) + ret0, _ := ret[0].(OverrideOptions) + return ret0 +} + +// SetNamespace indicates an expected call of SetNamespace +func (mr *MockOverrideOptionsMockRecorder) SetNamespace(namespace interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNamespace", reflect.TypeOf((*MockOverrideOptions)(nil).SetNamespace), namespace) +} + +// Environment mocks base method +func (m *MockOverrideOptions) Environment() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Environment") + ret0, _ := ret[0].(string) + return ret0 +} + +// Environment indicates an expected call of Environment +func (mr *MockOverrideOptionsMockRecorder) Environment() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Environment", reflect.TypeOf((*MockOverrideOptions)(nil).Environment)) +} + +// SetEnvironment mocks base method +func (m *MockOverrideOptions) SetEnvironment(env string) OverrideOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEnvironment", env) + ret0, _ := ret[0].(OverrideOptions) + return ret0 +} + +// SetEnvironment indicates an expected call of SetEnvironment +func (mr *MockOverrideOptionsMockRecorder) SetEnvironment(env interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEnvironment", reflect.TypeOf((*MockOverrideOptions)(nil).SetEnvironment), env) +} + +// Validate mocks base method +func (m *MockOverrideOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockOverrideOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockOverrideOptions)(nil).Validate)) +} + +// MockStore is a mock of Store interface +type MockStore struct { + ctrl *gomock.Controller + recorder *MockStoreMockRecorder +} + +// MockStoreMockRecorder is the mock recorder for MockStore +type MockStoreMockRecorder struct { + mock *MockStore +} + +// NewMockStore creates a new mock instance +func NewMockStore(ctrl *gomock.Controller) *MockStore { + mock := &MockStore{ctrl: ctrl} + mock.recorder = &MockStoreMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockStore) EXPECT() *MockStoreMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockStore) Get(key string) (Value, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", key) + ret0, _ := ret[0].(Value) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get +func (mr *MockStoreMockRecorder) Get(key interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockStore)(nil).Get), key) +} + +// Watch mocks base method +func (m *MockStore) Watch(key string) (ValueWatch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch", key) + ret0, _ := ret[0].(ValueWatch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Watch indicates an expected call of Watch +func (mr *MockStoreMockRecorder) Watch(key interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockStore)(nil).Watch), key) +} + +// Set mocks base method +func (m *MockStore) Set(key string, v proto.Message) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Set", key, v) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Set indicates an expected call of Set +func (mr *MockStoreMockRecorder) Set(key, v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockStore)(nil).Set), key, v) +} + +// SetIfNotExists mocks base method +func (m *MockStore) SetIfNotExists(key string, v proto.Message) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIfNotExists", key, v) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetIfNotExists indicates an expected call of SetIfNotExists +func (mr *MockStoreMockRecorder) SetIfNotExists(key, v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIfNotExists", reflect.TypeOf((*MockStore)(nil).SetIfNotExists), key, v) +} + +// CheckAndSet mocks base method +func (m *MockStore) CheckAndSet(key string, version int, v proto.Message) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckAndSet", key, version, v) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckAndSet indicates an expected call of CheckAndSet +func (mr *MockStoreMockRecorder) CheckAndSet(key, version, v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckAndSet", reflect.TypeOf((*MockStore)(nil).CheckAndSet), key, version, v) +} + +// Delete mocks base method +func (m *MockStore) Delete(key string) (Value, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", key) + ret0, _ := ret[0].(Value) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Delete indicates an expected call of Delete +func (mr *MockStoreMockRecorder) Delete(key interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockStore)(nil).Delete), key) +} + +// History mocks base method +func (m *MockStore) History(key string, from, to int) ([]Value, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "History", key, from, to) + ret0, _ := ret[0].([]Value) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// History indicates an expected call of History +func (mr *MockStoreMockRecorder) History(key, from, to interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "History", reflect.TypeOf((*MockStore)(nil).History), key, from, to) +} + +// MockCondition is a mock of Condition interface +type MockCondition struct { + ctrl *gomock.Controller + recorder *MockConditionMockRecorder +} + +// MockConditionMockRecorder is the mock recorder for MockCondition +type MockConditionMockRecorder struct { + mock *MockCondition +} + +// NewMockCondition creates a new mock instance +func NewMockCondition(ctrl *gomock.Controller) *MockCondition { + mock := &MockCondition{ctrl: ctrl} + mock.recorder = &MockConditionMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockCondition) EXPECT() *MockConditionMockRecorder { + return m.recorder +} + +// TargetType mocks base method +func (m *MockCondition) TargetType() TargetType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TargetType") + ret0, _ := ret[0].(TargetType) + return ret0 +} + +// TargetType indicates an expected call of TargetType +func (mr *MockConditionMockRecorder) TargetType() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TargetType", reflect.TypeOf((*MockCondition)(nil).TargetType)) +} + +// SetTargetType mocks base method +func (m *MockCondition) SetTargetType(t TargetType) Condition { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTargetType", t) + ret0, _ := ret[0].(Condition) + return ret0 +} + +// SetTargetType indicates an expected call of SetTargetType +func (mr *MockConditionMockRecorder) SetTargetType(t interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTargetType", reflect.TypeOf((*MockCondition)(nil).SetTargetType), t) +} + +// CompareType mocks base method +func (m *MockCondition) CompareType() CompareType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CompareType") + ret0, _ := ret[0].(CompareType) + return ret0 +} + +// CompareType indicates an expected call of CompareType +func (mr *MockConditionMockRecorder) CompareType() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompareType", reflect.TypeOf((*MockCondition)(nil).CompareType)) +} + +// SetCompareType mocks base method +func (m *MockCondition) SetCompareType(t CompareType) Condition { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCompareType", t) + ret0, _ := ret[0].(Condition) + return ret0 +} + +// SetCompareType indicates an expected call of SetCompareType +func (mr *MockConditionMockRecorder) SetCompareType(t interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCompareType", reflect.TypeOf((*MockCondition)(nil).SetCompareType), t) +} + +// Key mocks base method +func (m *MockCondition) Key() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Key") + ret0, _ := ret[0].(string) + return ret0 +} + +// Key indicates an expected call of Key +func (mr *MockConditionMockRecorder) Key() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Key", reflect.TypeOf((*MockCondition)(nil).Key)) +} + +// SetKey mocks base method +func (m *MockCondition) SetKey(key string) Condition { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetKey", key) + ret0, _ := ret[0].(Condition) + return ret0 +} + +// SetKey indicates an expected call of SetKey +func (mr *MockConditionMockRecorder) SetKey(key interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetKey", reflect.TypeOf((*MockCondition)(nil).SetKey), key) +} + +// Value mocks base method +func (m *MockCondition) Value() interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Value") + ret0, _ := ret[0].(interface{}) + return ret0 +} + +// Value indicates an expected call of Value +func (mr *MockConditionMockRecorder) Value() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Value", reflect.TypeOf((*MockCondition)(nil).Value)) +} + +// SetValue mocks base method +func (m *MockCondition) SetValue(value interface{}) Condition { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetValue", value) + ret0, _ := ret[0].(Condition) + return ret0 +} + +// SetValue indicates an expected call of SetValue +func (mr *MockConditionMockRecorder) SetValue(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetValue", reflect.TypeOf((*MockCondition)(nil).SetValue), value) +} + +// MockOp is a mock of Op interface +type MockOp struct { + ctrl *gomock.Controller + recorder *MockOpMockRecorder +} + +// MockOpMockRecorder is the mock recorder for MockOp +type MockOpMockRecorder struct { + mock *MockOp +} + +// NewMockOp creates a new mock instance +func NewMockOp(ctrl *gomock.Controller) *MockOp { + mock := &MockOp{ctrl: ctrl} + mock.recorder = &MockOpMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOp) EXPECT() *MockOpMockRecorder { + return m.recorder +} + +// Type mocks base method +func (m *MockOp) Type() OpType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Type") + ret0, _ := ret[0].(OpType) + return ret0 +} + +// Type indicates an expected call of Type +func (mr *MockOpMockRecorder) Type() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*MockOp)(nil).Type)) +} + +// SetType mocks base method +func (m *MockOp) SetType(ot OpType) Op { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetType", ot) + ret0, _ := ret[0].(Op) + return ret0 +} + +// SetType indicates an expected call of SetType +func (mr *MockOpMockRecorder) SetType(ot interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetType", reflect.TypeOf((*MockOp)(nil).SetType), ot) +} + +// Key mocks base method +func (m *MockOp) Key() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Key") + ret0, _ := ret[0].(string) + return ret0 +} + +// Key indicates an expected call of Key +func (mr *MockOpMockRecorder) Key() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Key", reflect.TypeOf((*MockOp)(nil).Key)) +} + +// SetKey mocks base method +func (m *MockOp) SetKey(key string) Op { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetKey", key) + ret0, _ := ret[0].(Op) + return ret0 +} + +// SetKey indicates an expected call of SetKey +func (mr *MockOpMockRecorder) SetKey(key interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetKey", reflect.TypeOf((*MockOp)(nil).SetKey), key) +} + +// MockOpResponse is a mock of OpResponse interface +type MockOpResponse struct { + ctrl *gomock.Controller + recorder *MockOpResponseMockRecorder +} + +// MockOpResponseMockRecorder is the mock recorder for MockOpResponse +type MockOpResponseMockRecorder struct { + mock *MockOpResponse +} + +// NewMockOpResponse creates a new mock instance +func NewMockOpResponse(ctrl *gomock.Controller) *MockOpResponse { + mock := &MockOpResponse{ctrl: ctrl} + mock.recorder = &MockOpResponseMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOpResponse) EXPECT() *MockOpResponseMockRecorder { + return m.recorder +} + +// Type mocks base method +func (m *MockOpResponse) Type() OpType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Type") + ret0, _ := ret[0].(OpType) + return ret0 +} + +// Type indicates an expected call of Type +func (mr *MockOpResponseMockRecorder) Type() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*MockOpResponse)(nil).Type)) +} + +// SetType mocks base method +func (m *MockOpResponse) SetType(ot OpType) Op { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetType", ot) + ret0, _ := ret[0].(Op) + return ret0 +} + +// SetType indicates an expected call of SetType +func (mr *MockOpResponseMockRecorder) SetType(ot interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetType", reflect.TypeOf((*MockOpResponse)(nil).SetType), ot) +} + +// Key mocks base method +func (m *MockOpResponse) Key() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Key") + ret0, _ := ret[0].(string) + return ret0 +} + +// Key indicates an expected call of Key +func (mr *MockOpResponseMockRecorder) Key() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Key", reflect.TypeOf((*MockOpResponse)(nil).Key)) +} + +// SetKey mocks base method +func (m *MockOpResponse) SetKey(key string) Op { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetKey", key) + ret0, _ := ret[0].(Op) + return ret0 +} + +// SetKey indicates an expected call of SetKey +func (mr *MockOpResponseMockRecorder) SetKey(key interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetKey", reflect.TypeOf((*MockOpResponse)(nil).SetKey), key) +} + +// Value mocks base method +func (m *MockOpResponse) Value() interface{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Value") + ret0, _ := ret[0].(interface{}) + return ret0 +} + +// Value indicates an expected call of Value +func (mr *MockOpResponseMockRecorder) Value() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Value", reflect.TypeOf((*MockOpResponse)(nil).Value)) +} + +// SetValue mocks base method +func (m *MockOpResponse) SetValue(v interface{}) OpResponse { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetValue", v) + ret0, _ := ret[0].(OpResponse) + return ret0 +} + +// SetValue indicates an expected call of SetValue +func (mr *MockOpResponseMockRecorder) SetValue(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetValue", reflect.TypeOf((*MockOpResponse)(nil).SetValue), v) +} + +// MockResponse is a mock of Response interface +type MockResponse struct { + ctrl *gomock.Controller + recorder *MockResponseMockRecorder +} + +// MockResponseMockRecorder is the mock recorder for MockResponse +type MockResponseMockRecorder struct { + mock *MockResponse +} + +// NewMockResponse creates a new mock instance +func NewMockResponse(ctrl *gomock.Controller) *MockResponse { + mock := &MockResponse{ctrl: ctrl} + mock.recorder = &MockResponseMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockResponse) EXPECT() *MockResponseMockRecorder { + return m.recorder +} + +// Responses mocks base method +func (m *MockResponse) Responses() []OpResponse { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Responses") + ret0, _ := ret[0].([]OpResponse) + return ret0 +} + +// Responses indicates an expected call of Responses +func (mr *MockResponseMockRecorder) Responses() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Responses", reflect.TypeOf((*MockResponse)(nil).Responses)) +} + +// SetResponses mocks base method +func (m *MockResponse) SetResponses(oprs []OpResponse) Response { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetResponses", oprs) + ret0, _ := ret[0].(Response) + return ret0 +} + +// SetResponses indicates an expected call of SetResponses +func (mr *MockResponseMockRecorder) SetResponses(oprs interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetResponses", reflect.TypeOf((*MockResponse)(nil).SetResponses), oprs) +} + +// MockTxnStore is a mock of TxnStore interface +type MockTxnStore struct { + ctrl *gomock.Controller + recorder *MockTxnStoreMockRecorder +} + +// MockTxnStoreMockRecorder is the mock recorder for MockTxnStore +type MockTxnStoreMockRecorder struct { + mock *MockTxnStore +} + +// NewMockTxnStore creates a new mock instance +func NewMockTxnStore(ctrl *gomock.Controller) *MockTxnStore { + mock := &MockTxnStore{ctrl: ctrl} + mock.recorder = &MockTxnStoreMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTxnStore) EXPECT() *MockTxnStoreMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockTxnStore) Get(key string) (Value, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", key) + ret0, _ := ret[0].(Value) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get +func (mr *MockTxnStoreMockRecorder) Get(key interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockTxnStore)(nil).Get), key) +} + +// Watch mocks base method +func (m *MockTxnStore) Watch(key string) (ValueWatch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch", key) + ret0, _ := ret[0].(ValueWatch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Watch indicates an expected call of Watch +func (mr *MockTxnStoreMockRecorder) Watch(key interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockTxnStore)(nil).Watch), key) +} + +// Set mocks base method +func (m *MockTxnStore) Set(key string, v proto.Message) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Set", key, v) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Set indicates an expected call of Set +func (mr *MockTxnStoreMockRecorder) Set(key, v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockTxnStore)(nil).Set), key, v) +} + +// SetIfNotExists mocks base method +func (m *MockTxnStore) SetIfNotExists(key string, v proto.Message) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIfNotExists", key, v) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetIfNotExists indicates an expected call of SetIfNotExists +func (mr *MockTxnStoreMockRecorder) SetIfNotExists(key, v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIfNotExists", reflect.TypeOf((*MockTxnStore)(nil).SetIfNotExists), key, v) +} + +// CheckAndSet mocks base method +func (m *MockTxnStore) CheckAndSet(key string, version int, v proto.Message) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckAndSet", key, version, v) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckAndSet indicates an expected call of CheckAndSet +func (mr *MockTxnStoreMockRecorder) CheckAndSet(key, version, v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckAndSet", reflect.TypeOf((*MockTxnStore)(nil).CheckAndSet), key, version, v) +} + +// Delete mocks base method +func (m *MockTxnStore) Delete(key string) (Value, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", key) + ret0, _ := ret[0].(Value) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Delete indicates an expected call of Delete +func (mr *MockTxnStoreMockRecorder) Delete(key interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockTxnStore)(nil).Delete), key) +} + +// History mocks base method +func (m *MockTxnStore) History(key string, from, to int) ([]Value, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "History", key, from, to) + ret0, _ := ret[0].([]Value) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// History indicates an expected call of History +func (mr *MockTxnStoreMockRecorder) History(key, from, to interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "History", reflect.TypeOf((*MockTxnStore)(nil).History), key, from, to) +} + +// Commit mocks base method +func (m *MockTxnStore) Commit(arg0 []Condition, arg1 []Op) (Response, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Commit", arg0, arg1) + ret0, _ := ret[0].(Response) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Commit indicates an expected call of Commit +func (mr *MockTxnStoreMockRecorder) Commit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Commit", reflect.TypeOf((*MockTxnStore)(nil).Commit), arg0, arg1) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/mem/store.go b/vendor/github.com/m3db/m3/src/cluster/kv/mem/store.go new file mode 100644 index 00000000..352df906 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/mem/store.go @@ -0,0 +1,295 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "errors" + "sync" + + "github.com/m3db/m3/src/cluster/kv" + + "github.com/golang/protobuf/proto" +) + +// NewStore returns a new in-process store that can be used for testing +func NewStore() kv.TxnStore { + return &store{ + values: make(map[string][]*value), + watchables: make(map[string]kv.ValueWatchable), + } +} + +// NewValue returns a new fake Value around the given proto +func NewValue(vers int, msg proto.Message) kv.Value { + data, _ := proto.Marshal(msg) + return &value{ + version: vers, + data: data, + } +} + +// NewValueWithData returns a new fake Value around the given data +func NewValueWithData(vers int, data []byte) kv.Value { + return &value{ + version: vers, + data: data, + } +} + +type value struct { + version int + revision int + data []byte +} + +func (v value) Version() int { return v.version } +func (v value) Unmarshal(msg proto.Message) error { return proto.Unmarshal(v.data, msg) } +func (v value) IsNewer(other kv.Value) bool { + otherValue, ok := other.(*value) + if !ok { + return v.version > other.Version() + } + if v.revision == otherValue.revision { + return v.version > other.Version() + } + return v.revision > otherValue.revision +} + +type store struct { + sync.RWMutex + + revision int + values map[string][]*value + watchables map[string]kv.ValueWatchable +} + +func (s *store) Get(key string) (kv.Value, error) { + s.RLock() + defer s.RUnlock() + + return s.getWithLock(key) +} + +func (s *store) getWithLock(key string) (kv.Value, error) { + val, ok := s.values[key] + if !ok { + return nil, kv.ErrNotFound + } + + if len(val) == 0 { + return nil, kv.ErrNotFound + } + + return val[len(val)-1], nil +} + +func (s *store) Watch(key string) (kv.ValueWatch, error) { + s.Lock() + val := s.values[key] + + watchable, ok := s.watchables[key] + if !ok { + watchable = kv.NewValueWatchable() + s.watchables[key] = watchable + } + s.Unlock() + + if !ok && len(val) != 0 { + watchable.Update(val[len(val)-1]) + } + + _, watch, _ := watchable.Watch() + return watch, nil +} + +func (s *store) Set(key string, val proto.Message) (int, error) { + s.Lock() + defer s.Unlock() + + return s.setWithLock(key, val) +} + +func (s *store) setWithLock(key string, val proto.Message) (int, error) { + data, err := proto.Marshal(val) + if err != nil { + return 0, err + } + + lastVersion := 0 + vals := s.values[key] + + if len(vals) != 0 { + lastVersion = vals[len(vals)-1].version + } + newVersion := lastVersion + 1 + s.updateInternalWithLock(key, newVersion, data) + return newVersion, nil +} + +func (s *store) SetIfNotExists(key string, val proto.Message) (int, error) { + data, err := proto.Marshal(val) + if err != nil { + return 0, err + } + + s.Lock() + defer s.Unlock() + + if _, exists := s.values[key]; exists { + return 0, kv.ErrAlreadyExists + } + + s.updateInternalWithLock(key, 1, data) + return 1, nil +} + +func (s *store) CheckAndSet(key string, version int, val proto.Message) (int, error) { + data, err := proto.Marshal(val) + if err != nil { + return 0, err + } + + s.Lock() + defer s.Unlock() + + lastVersion := 0 + vals, exists := s.values[key] + if exists && len(vals) != 0 { + lastVersion = vals[len(vals)-1].version + } + + if version != lastVersion { + return 0, kv.ErrVersionMismatch + } + + newVersion := version + 1 + s.updateInternalWithLock(key, newVersion, data) + return newVersion, nil +} + +func (s *store) updateInternalWithLock(key string, newVersion int, data []byte) { + s.revision++ + fv := &value{ + version: newVersion, + revision: s.revision, + data: data, + } + s.values[key] = append(s.values[key], fv) + s.updateWatchable(key, fv) +} + +func (s *store) Delete(key string) (kv.Value, error) { + s.Lock() + defer s.Unlock() + + val, ok := s.values[key] + if !ok { + return nil, kv.ErrNotFound + } + + prev := val[len(val)-1] + s.updateWatchable(key, nil) + delete(s.values, key) + return prev, nil +} + +func (s *store) History(key string, from, to int) ([]kv.Value, error) { + if from <= 0 || to <= 0 || from > to { + return nil, errors.New("bad request") + } + + if from == to { + return nil, nil + } + + s.RLock() + defer s.RUnlock() + + vals, ok := s.values[key] + if !ok { + return nil, kv.ErrNotFound + } + + l := len(vals) + if l == 0 { + return nil, kv.ErrNotFound + } + + var res []kv.Value + for i := from; i < to; i++ { + idx := i - 1 + if idx >= 0 && idx < l { + res = append(res, vals[idx]) + } + } + + return res, nil +} + +// NB(cw) When there is an error in one of the ops, the finished ops will not be rolled back +func (s *store) Commit(conditions []kv.Condition, ops []kv.Op) (kv.Response, error) { + s.Lock() + defer s.Unlock() + + for _, condition := range conditions { + if condition.CompareType() != kv.CompareEqual || condition.TargetType() != kv.TargetVersion { + return nil, errors.New("invalid condition") + } + + v, err := s.getWithLock(condition.Key()) + expectedVersion := condition.Value().(int) + if err != nil { + if err == kv.ErrNotFound && expectedVersion == 0 { + continue + } + return nil, err + } + + if expectedVersion != v.Version() { + return nil, kv.ErrConditionCheckFailed + } + } + + oprs := make([]kv.OpResponse, len(ops)) + for i, op := range ops { + if op.Type() != kv.OpSet { + return nil, errors.New("invalid op") + } + opSet := op.(kv.SetOp) + + v, err := s.setWithLock(opSet.Key(), opSet.Value) + if err != nil { + return nil, err + } + + oprs[i] = kv.NewOpResponse(op).SetValue(v) + } + + return kv.NewResponse().SetResponses(oprs), nil +} + +// updateWatchable updates all subscriptions for the given key. It assumes +// the fakeStore write lock is acquired outside of this call +func (s *store) updateWatchable(key string, newVal kv.Value) { + if watchable, ok := s.watchables[key]; ok { + watchable.Update(newVal) + } +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/op.go b/vendor/github.com/m3db/m3/src/cluster/kv/op.go new file mode 100644 index 00000000..0870967c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/op.go @@ -0,0 +1,91 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package kv + +import "github.com/golang/protobuf/proto" + +type condition struct { + targetType TargetType + compareType CompareType + key string + value interface{} +} + +// NewCondition returns a new Condition +func NewCondition() Condition { return condition{} } + +func (c condition) TargetType() TargetType { return c.targetType } +func (c condition) CompareType() CompareType { return c.compareType } +func (c condition) Key() string { return c.key } +func (c condition) Value() interface{} { return c.value } +func (c condition) SetTargetType(t TargetType) Condition { c.targetType = t; return c } +func (c condition) SetCompareType(t CompareType) Condition { c.compareType = t; return c } +func (c condition) SetKey(key string) Condition { c.key = key; return c } +func (c condition) SetValue(value interface{}) Condition { c.value = value; return c } + +type opBase struct { + ot OpType + key string +} + +// nolint: unparam +func newOpBase(t OpType, key string) opBase { return opBase{ot: t, key: key} } + +func (r opBase) Type() OpType { return r.ot } +func (r opBase) Key() string { return r.key } +func (r opBase) SetType(t OpType) Op { r.ot = t; return r } +func (r opBase) SetKey(key string) Op { r.key = key; return r } + +// SetOp is a Op with OpType Set +type SetOp struct { + opBase + + Value proto.Message +} + +// NewSetOp returns a SetOp +func NewSetOp(key string, value proto.Message) SetOp { + return SetOp{opBase: newOpBase(OpSet, key), Value: value} +} + +type opResponse struct { + Op + + value interface{} +} + +// NewOpResponse creates a new OpResponse +func NewOpResponse(op Op) OpResponse { + return opResponse{Op: op} +} + +func (r opResponse) Value() interface{} { return r.value } +func (r opResponse) SetValue(v interface{}) OpResponse { r.value = v; return r } + +type response struct { + opr []OpResponse +} + +// NewResponse creates a new transaction Response +func NewResponse() Response { return response{} } + +func (r response) Responses() []OpResponse { return r.opr } +func (r response) SetResponses(oprs []OpResponse) Response { r.opr = oprs; return r } diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/store.go b/vendor/github.com/m3db/m3/src/cluster/kv/store.go new file mode 100644 index 00000000..007eea4e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/store.go @@ -0,0 +1,151 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package kv + +import ( + "errors" + + xwatch "github.com/m3db/m3/src/x/watch" +) + +var ( + errEmptyZone = errors.New("empty kv zone") + errEmptyEnvironment = errors.New("empty kv environment") + errEmptyNamespace = errors.New("empty kv namespace") +) + +type valueWatch struct { + w xwatch.Watch +} + +// newValueWatch creates a new ValueWatch +func newValueWatch(w xwatch.Watch) ValueWatch { + return &valueWatch{w: w} +} + +func (v *valueWatch) Close() { + v.w.Close() +} + +func (v *valueWatch) C() <-chan struct{} { + return v.w.C() +} + +func (v *valueWatch) Get() Value { + return valueFromWatch(v.w.Get()) +} + +type valueWatchable struct { + w xwatch.Watchable +} + +// NewValueWatchable creates a new ValueWatchable +func NewValueWatchable() ValueWatchable { + return &valueWatchable{w: xwatch.NewWatchable()} +} + +func (w *valueWatchable) IsClosed() bool { + return w.w.IsClosed() +} + +func (w *valueWatchable) Close() { + w.w.Close() +} + +func (w *valueWatchable) Get() Value { + return valueFromWatch(w.w.Get()) +} + +func (w *valueWatchable) Watch() (Value, ValueWatch, error) { + value, watch, err := w.w.Watch() + if err != nil { + return nil, nil, err + } + + return valueFromWatch(value), newValueWatch(watch), nil +} + +func (w *valueWatchable) NumWatches() int { + return w.w.NumWatches() +} + +func (w *valueWatchable) Update(v Value) error { + return w.w.Update(v) +} + +func valueFromWatch(value interface{}) Value { + if value != nil { + return value.(Value) + } + + return nil +} + +type overrideOptions struct { + zone string + env string + namespace string +} + +// NewOverrideOptions creates a new kv Options. +func NewOverrideOptions() OverrideOptions { + return overrideOptions{} +} + +func (opts overrideOptions) Zone() string { + return opts.zone +} + +func (opts overrideOptions) SetZone(value string) OverrideOptions { + opts.zone = value + return opts +} + +func (opts overrideOptions) Environment() string { + return opts.env +} + +func (opts overrideOptions) SetEnvironment(env string) OverrideOptions { + opts.env = env + return opts +} + +func (opts overrideOptions) Namespace() string { + return opts.namespace +} + +func (opts overrideOptions) SetNamespace(namespace string) OverrideOptions { + opts.namespace = namespace + return opts +} + +func (opts overrideOptions) Validate() error { + if opts.zone == "" { + return errEmptyZone + } + if opts.env == "" { + return errEmptyEnvironment + } + if opts.namespace == "" { + return errEmptyNamespace + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/types.go b/vendor/github.com/m3db/m3/src/cluster/kv/types.go new file mode 100644 index 00000000..1d8b0003 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/types.go @@ -0,0 +1,233 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package kv + +import ( + "errors" + + "github.com/golang/protobuf/proto" +) + +const ( + // UninitializedVersion is the version of an uninitialized kv value. + UninitializedVersion = 0 +) + +var ( + // ErrVersionMismatch is returned when attempting a CheckAndSet and the + // key is not at the provided version + ErrVersionMismatch = errors.New("key is not at the specified version") + + // ErrAlreadyExists is returned when attempting a SetIfEmpty and the key + // already has a value + ErrAlreadyExists = errors.New("key already has a value") + + // ErrNotFound is returned when attempting a Get but no value is found for + // the given key + ErrNotFound = errors.New("key not found") + + // ErrUnknownTargetType is returned when an unknown TargetType is requested + ErrUnknownTargetType = errors.New("unknown target type") + + // ErrUnknownCompareType is returned when an unknown CompareType is requested + ErrUnknownCompareType = errors.New("unknown compare type") + + // ErrUnknownOpType is returned when an unknown OpType is requested + ErrUnknownOpType = errors.New("unknown op type") + + // ErrConditionCheckFailed is returned when condition check failed + ErrConditionCheckFailed = errors.New("condition check failed") +) + +// A Value provides access to a versioned value in the configuration store +type Value interface { + // Unmarshal retrieves the stored value + Unmarshal(v proto.Message) error + + // Version returns the current version of the value + Version() int + + // IsNewer returns if this Value is newer than the other Value + IsNewer(other Value) bool +} + +// ValueWatch provides updates to a Value +type ValueWatch interface { + // C returns the notification channel + C() <-chan struct{} + // Get returns the latest version of the value + Get() Value + // Close stops watching for value updates + Close() +} + +// ValueWatchable can be watched for Value changes +type ValueWatchable interface { + // Get returns the latest Value + Get() Value + // Watch returns the Value and a ValueWatch that will be notified on updates + Watch() (Value, ValueWatch, error) + // NumWatches returns the number of watches on the Watchable + NumWatches() int + // Update sets the Value and notify Watches + Update(Value) error + // IsClosed returns true if the Watchable is closed + IsClosed() bool + // Close stops watching for value updates + Close() +} + +// OverrideOptions provides a set of options to override the default configurations of a KV store. +type OverrideOptions interface { + // Zone returns the zone of the KV store. + Zone() string + + // SetZone sets the zone of the KV store. + SetZone(value string) OverrideOptions + + // Namespace returns the namespace of the KV store. + Namespace() string + + // SetNamespace sets the namespace of the KV store. + SetNamespace(namespace string) OverrideOptions + + // Environment returns the environment of the KV store. + Environment() string + + // SetEnvironment sets the environment of the KV store. + SetEnvironment(env string) OverrideOptions + + // Validate validates the Options. + Validate() error +} + +// Store provides access to the configuration store +type Store interface { + // Get retrieves the value for the given key + Get(key string) (Value, error) + + // Watch adds a watch for value updates for given key. This is a non-blocking + // call - a notification will be sent to ValueWatch.C() once a value is + // available + Watch(key string) (ValueWatch, error) + + // Set stores the value for the given key + Set(key string, v proto.Message) (int, error) + + // SetIfNotExists sets the value for the given key only if no value already + // exists + SetIfNotExists(key string, v proto.Message) (int, error) + + // CheckAndSet stores the value for the given key if the current version + // matches the provided version + CheckAndSet(key string, version int, v proto.Message) (int, error) + + // Delete deletes a key in the store and returns the last value before deletion + Delete(key string) (Value, error) + + // History returns the value for a key in version range [from, to) + History(key string, from, to int) ([]Value, error) +} + +// TargetType is the type of the comparison target in the condition +type TargetType int + +// list of supported TargetTypes +const ( + TargetVersion TargetType = iota +) + +// CompareType is the type of the comparison in the condition +type CompareType string + +func (t CompareType) String() string { + return string(t) +} + +// list of supported CompareType +const ( + CompareEqual CompareType = "=" +) + +// Condition defines the prerequisite for a transaction +type Condition interface { + // TargetType returns the type of the TargetType + TargetType() TargetType + // SetTargetType sets the type of the TargetType + SetTargetType(t TargetType) Condition + + // CompareType returns the type of the CompareType + CompareType() CompareType + // SetCompareType sets the type of the CompareType + SetCompareType(t CompareType) Condition + + // Key returns the key in the condition + Key() string + // SetKey sets the key in the condition + SetKey(key string) Condition + + // Value returns the value for comparison + Value() interface{} + // SetValue sets the value for comparison + SetValue(value interface{}) Condition +} + +// OpType is the type of the operation +type OpType int + +// list of supported OpTypes +const ( + OpSet OpType = iota +) + +// Op is the operation to be performed in a transaction +type Op interface { + // Type returns the type of the operation + Type() OpType + // SetType sets the type of the operation + SetType(ot OpType) Op + + // Key returns the key used in the operation + Key() string + // SetKey sets the key in the operation + SetKey(key string) Op +} + +// OpResponse is the response of a transaction operation +type OpResponse interface { + Op + + Value() interface{} + SetValue(v interface{}) OpResponse +} + +// Response captures the response of the transaction +type Response interface { + Responses() []OpResponse + SetResponses(oprs []OpResponse) Response +} + +// TxnStore supports transactions on top of Store interface +type TxnStore interface { + Store + + Commit([]Condition, []Op) (Response, error) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/util/atomic.go b/vendor/github.com/m3db/m3/src/cluster/kv/util/atomic.go new file mode 100644 index 00000000..886d86db --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/util/atomic.go @@ -0,0 +1,107 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package util + +import ( + "github.com/m3db/m3/src/cluster/kv" + + "go.uber.org/atomic" +) + +// WatchAndUpdateAtomicBool sets up a watch with validation for an atomic bool +// property. Any malformed or invalid updates are not applied. The default value +// is applied when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateAtomicBool( + store kv.Store, + key string, + property *atomic.Bool, + defaultValue bool, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := func(i interface{}) { property.Store(i.(bool)) } + + return watchAndUpdate( + store, key, getBool, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateAtomicFloat64 sets up a watch with validation for an atomic float64 +// property. Any malformed or invalid updates are not applied. The default value is +// applied when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateAtomicFloat64( + store kv.Store, + key string, + property *atomic.Float64, + defaultValue float64, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := func(i interface{}) { property.Store(i.(float64)) } + + return watchAndUpdate( + store, key, getFloat64, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateAtomicInt64 sets up a watch with validation for an atomic int64 +// property. Anymalformed or invalid updates are not applied. The default value +// is applied when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateAtomicInt64( + store kv.Store, + key string, + property *atomic.Int64, + defaultValue int64, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := func(i interface{}) { property.Store(i.(int64)) } + + return watchAndUpdate( + store, key, getInt64, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateAtomicString sets up a watch with validation for an atomic string +// property. Any malformed or invalid updates are not applied. The default value +// is applied when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateAtomicString( + store kv.Store, + key string, + property *atomic.String, + defaultValue string, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := func(i interface{}) { property.Store(i.(string)) } + + return watchAndUpdate( + store, key, getString, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/util/lock.go b/vendor/github.com/m3db/m3/src/cluster/kv/util/lock.go new file mode 100644 index 00000000..dc7e3a90 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/util/lock.go @@ -0,0 +1,232 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package util + +import ( + "sync" + "time" + + "github.com/m3db/m3/src/cluster/kv" +) + +func lockedUpdate(fn updateFn, lock sync.Locker) updateFn { + return func(i interface{}) { + if lock != nil { + lock.Lock() + } + + fn(i) + + if lock != nil { + lock.Unlock() + } + } +} + +// WatchAndUpdateBool sets up a watch with validation for a bool property. Any +// malformed or invalid updates are not applied. The default value is applied +// when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateBool( + store kv.Store, + key string, + property *bool, + lock sync.Locker, + defaultValue bool, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := lockedUpdate(func(i interface{}) { *property = i.(bool) }, lock) + + return watchAndUpdate( + store, key, getBool, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateFloat64 sets up a watch with validation for a float64 property. +// Any malformed or invalid updates are not applied. The default value is applied +// when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateFloat64( + store kv.Store, + key string, + property *float64, + lock sync.Locker, + defaultValue float64, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := lockedUpdate(func(i interface{}) { *property = i.(float64) }, lock) + + return watchAndUpdate( + store, key, getFloat64, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateInt64 sets up a watch with validation for an int64 property. Any +// malformed or invalid updates are not applied. The default value is applied when +// the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateInt64( + store kv.Store, + key string, + property *int64, + lock sync.Locker, + defaultValue int64, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := lockedUpdate(func(i interface{}) { *property = i.(int64) }, lock) + + return watchAndUpdate( + store, key, getInt64, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateString sets up a watch with validation for a string property. Any +// malformed or invalid updates are not applied. The default value is applied when +// the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateString( + store kv.Store, + key string, + property *string, + lock sync.Locker, + defaultValue string, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := lockedUpdate(func(i interface{}) { *property = i.(string) }, lock) + + return watchAndUpdate( + store, key, getString, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateStringArray sets up a watch with validation for a string array +// property. Any malformed, or invalid updates are not applied. The default value +// is applied when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateStringArray( + store kv.Store, + key string, + property *[]string, + lock sync.Locker, + defaultValue []string, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := lockedUpdate(func(i interface{}) { *property = i.([]string) }, lock) + + return watchAndUpdate( + store, key, getStringArray, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateStringArrayPointer sets up a watch with validation for a string array pointer +// property. Any malformed, or invalid updates are not applied. The default value +// is applied when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateStringArrayPointer( + store kv.Store, + key string, + property **[]string, + lock sync.Locker, + defaultValue *[]string, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := lockedUpdate(func(i interface{}) { *property = i.(*[]string) }, lock) + + return watchAndUpdate( + store, key, getStringArrayPointer, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateTime sets up a watch with validation for a time property. Any +// malformed, or invalid updates are not applied. The default value is applied +// when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateTime( + store kv.Store, + key string, + property *time.Time, + lock sync.Locker, + defaultValue time.Time, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := lockedUpdate(func(i interface{}) { *property = i.(time.Time) }, lock) + + return watchAndUpdate( + store, key, getTime, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateDuration sets up a watch with validation for a time property. Any +// malformed, or invalid updates are not applied. The default value is applied +// when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateDuration( + store kv.Store, + key string, + property *time.Duration, + lock sync.Locker, + defaultValue time.Duration, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + updateFn := lockedUpdate(func(i interface{}) { *property = i.(time.Duration) }, lock) + + return watchAndUpdate( + store, key, getDuration, updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} + +// WatchAndUpdateGeneric sets up a watch with validation for a generic property. +// Any malformed, or invalid updates are not applied. The default value is +// applied when the key does not exist in KV. The watch on the value is returned. +func WatchAndUpdateGeneric( + store kv.Store, + key string, + genericGetFn GenericGetValueFn, + genericUpdateFn GenericUpdateFn, + lock sync.Locker, + defaultValue interface{}, + opts Options, +) (kv.ValueWatch, error) { + if opts == nil { + opts = NewOptions() + } + + updateFn := lockedUpdate(updateFn(genericUpdateFn), lock) + return watchAndUpdate( + store, key, getValueFn(genericGetFn), updateFn, opts.ValidateFn(), defaultValue, opts.Logger(), + ) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/util/runtime/options.go b/vendor/github.com/m3db/m3/src/cluster/kv/util/runtime/options.go new file mode 100644 index 00000000..1dba61f1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/util/runtime/options.go @@ -0,0 +1,131 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package runtime + +import ( + "time" + + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/x/instrument" +) + +const ( + defaultInitWatchTimeout = 10 * time.Second +) + +// Options provide a set of value options. +type Options interface { + // SetInstrumentOptions sets the instrument options. + SetInstrumentOptions(value instrument.Options) Options + + // InstrumentOptions returns the instrument options. + InstrumentOptions() instrument.Options + + // SetInitWatchTimeout sets the initial watch timeout. + SetInitWatchTimeout(value time.Duration) Options + + // InitWatchTimeout returns the initial watch timeout. + InitWatchTimeout() time.Duration + + // SetKVStore sets the kv store. + SetKVStore(value kv.Store) Options + + // KVStore returns the kv store. + KVStore() kv.Store + + // SetUnmarshalFn sets the unmarshal function. + SetUnmarshalFn(value UnmarshalFn) Options + + // UnmarshalFn returns the unmarshal function. + UnmarshalFn() UnmarshalFn + + // SetProcessFn sets the process function. + SetProcessFn(value ProcessFn) Options + + // ProcessFn returns the process function. + ProcessFn() ProcessFn +} + +type options struct { + instrumentOpts instrument.Options + initWatchTimeout time.Duration + kvStore kv.Store + unmarshalFn UnmarshalFn + processFn ProcessFn +} + +// NewOptions creates a new set of options. +func NewOptions() Options { + return &options{ + instrumentOpts: instrument.NewOptions(), + initWatchTimeout: defaultInitWatchTimeout, + } +} + +func (o *options) SetInstrumentOptions(value instrument.Options) Options { + opts := *o + opts.instrumentOpts = value + return &opts +} + +func (o *options) InstrumentOptions() instrument.Options { + return o.instrumentOpts +} + +func (o *options) SetInitWatchTimeout(value time.Duration) Options { + opts := *o + opts.initWatchTimeout = value + return &opts +} + +func (o *options) InitWatchTimeout() time.Duration { + return o.initWatchTimeout +} + +func (o *options) SetKVStore(value kv.Store) Options { + opts := *o + opts.kvStore = value + return &opts +} + +func (o *options) KVStore() kv.Store { + return o.kvStore +} + +func (o *options) SetUnmarshalFn(value UnmarshalFn) Options { + opts := *o + opts.unmarshalFn = value + return &opts +} + +func (o *options) UnmarshalFn() UnmarshalFn { + return o.unmarshalFn +} + +func (o *options) SetProcessFn(value ProcessFn) Options { + opts := *o + opts.processFn = value + return &opts +} + +func (o *options) ProcessFn() ProcessFn { + return o.processFn +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/util/runtime/value.go b/vendor/github.com/m3db/m3/src/cluster/kv/util/runtime/value.go new file mode 100644 index 00000000..44b93a46 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/util/runtime/value.go @@ -0,0 +1,119 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package runtime + +import ( + "fmt" + + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/x/watch" + + "go.uber.org/zap" +) + +// Value is a value that can be updated during runtime. +type Value interface { + watch.Value + + // Key is the key associated with value. + Key() string +} + +// UnmarshalFn unmarshals a kv value and extracts its payload. +type UnmarshalFn func(value kv.Value) (interface{}, error) + +// ProcessFn processes a value. +type ProcessFn func(value interface{}) error + +type value struct { + watch.Value + + key string + store kv.Store + opts Options + log *zap.Logger + unmarshalFn UnmarshalFn + processFn ProcessFn + updateFn watch.ProcessFn + + currValue kv.Value +} + +// NewValue creates a new value. +func NewValue( + key string, + opts Options, +) Value { + v := &value{ + key: key, + store: opts.KVStore(), + opts: opts, + log: opts.InstrumentOptions().Logger(), + unmarshalFn: opts.UnmarshalFn(), + processFn: opts.ProcessFn(), + } + v.updateFn = v.update + v.initValue() + return v +} + +func (v *value) initValue() { + valueOpts := watch.NewOptions(). + SetInstrumentOptions(v.opts.InstrumentOptions()). + SetInitWatchTimeout(v.opts.InitWatchTimeout()). + SetNewUpdatableFn(v.newUpdatableFn). + SetGetUpdateFn(v.getUpdateFn). + SetProcessFn(v.updateFn). + SetKey(v.key) + v.Value = watch.NewValue(valueOpts) +} + +func (v *value) Key() string { return v.key } + +func (v *value) newUpdatableFn() (watch.Updatable, error) { + return v.store.Watch(v.key) +} + +func (v *value) getUpdateFn(updatable watch.Updatable) (interface{}, error) { + return updatable.(kv.ValueWatch).Get(), nil +} + +func (v *value) update(value interface{}) error { + update := value.(kv.Value) + if v.currValue != nil && !update.IsNewer(v.currValue) { + v.log.Warn("ignore kv update with version which is not newer than the version of the current value", + zap.Int("new version", update.Version()), + zap.Int("current version", v.currValue.Version())) + return nil + } + v.log.Info("received kv update", + zap.Int("version", update.Version()), + zap.String("key", v.key)) + latest, err := v.unmarshalFn(update) + if err != nil { + return fmt.Errorf("error unmarshalling value for version %d: %v", update.Version(), err) + } + if err := v.processFn(latest); err != nil { + return err + } + v.currValue = update + return nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/util/types.go b/vendor/github.com/m3db/m3/src/cluster/kv/util/types.go new file mode 100644 index 00000000..cee31378 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/util/types.go @@ -0,0 +1,87 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package util + +import ( + "github.com/m3db/m3/src/cluster/kv" + + "go.uber.org/zap" +) + +// ValidateFn validates an update from KV. +type ValidateFn func(interface{}) error + +type getValueFn func(kv.Value) (interface{}, error) + +type updateFn func(interface{}) + +// GenericGetValueFn runs when a watched value changes to translate the KV +// value to a concrete type. +type GenericGetValueFn getValueFn + +// GenericUpdateFn runs when a watched value changes and receives the output of +// the GenericGetValueFn. +type GenericUpdateFn updateFn + +// Options is a set of options for kv utility functions. +type Options interface { + // SetValidateFn sets the validation function applied to kv values. + SetValidateFn(val ValidateFn) Options + + // ValidateFn returns the validation function applied to kv values. + ValidateFn() ValidateFn + + // SetLogger sets the logger. + SetLogger(val *zap.Logger) Options + + // Logger returns the logger. + Logger() *zap.Logger +} + +type options struct { + validateFn ValidateFn + logger *zap.Logger +} + +// NewOptions returns a new set of options for kv utility functions. +func NewOptions() Options { + return &options{} +} + +func (o *options) SetValidateFn(val ValidateFn) Options { + opts := *o + opts.validateFn = val + return &opts +} + +func (o *options) ValidateFn() ValidateFn { + return o.validateFn +} + +func (o *options) SetLogger(val *zap.Logger) Options { + opts := *o + opts.logger = val + return &opts +} + +func (o *options) Logger() *zap.Logger { + return o.logger +} diff --git a/vendor/github.com/m3db/m3/src/cluster/kv/util/util.go b/vendor/github.com/m3db/m3/src/cluster/kv/util/util.go new file mode 100644 index 00000000..5a8ccda1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/kv/util/util.go @@ -0,0 +1,331 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package util + +import ( + "errors" + "fmt" + "time" + + "github.com/m3db/m3/src/cluster/generated/proto/commonpb" + "github.com/m3db/m3/src/cluster/kv" + + "go.uber.org/zap" +) + +var ( + noopLogger = zap.NewNop() + errNilStore = errors.New("kv store is nil") +) + +// BoolFromValue get a bool from kv.Value. If the value is nil, the default value +// is returned. +func BoolFromValue(v kv.Value, key string, defaultValue bool, opts Options) (bool, error) { + if opts == nil { + opts = NewOptions() + } + + var res bool + updateFn := func(i interface{}) { res = i.(bool) } + + if err := updateWithKV( + getBool, updateFn, opts.ValidateFn(), key, v, defaultValue, opts.Logger(), + ); err != nil { + return false, err + } + + return res, nil +} + +// Float64FromValue gets a float64 from kv.Value. If the value is nil, the default +// value is returned. +func Float64FromValue(v kv.Value, key string, defaultValue float64, opts Options) (float64, error) { + if opts == nil { + opts = NewOptions() + } + + var res float64 + updateFn := func(i interface{}) { res = i.(float64) } + + if err := updateWithKV( + getFloat64, updateFn, opts.ValidateFn(), key, v, defaultValue, opts.Logger(), + ); err != nil { + return 0, err + } + + return res, nil +} + +// Int64FromValue gets an int64 from kv.Value. If the value is nil, the default +// value is returned. +func Int64FromValue(v kv.Value, key string, defaultValue int64, opts Options) (int64, error) { + if opts == nil { + opts = NewOptions() + } + + var res int64 + updateFn := func(i interface{}) { res = i.(int64) } + + if err := updateWithKV( + getInt64, updateFn, opts.ValidateFn(), key, v, defaultValue, opts.Logger(), + ); err != nil { + return 0, err + } + + return res, nil +} + +// StringFromValue gets a string from kv.Value. If the value is nil, the default +// value is returned. +func StringFromValue(v kv.Value, key string, defaultValue string, opts Options) (string, error) { + if opts == nil { + opts = NewOptions() + } + + var res string + updateFn := func(i interface{}) { res = i.(string) } + + if err := updateWithKV( + getString, updateFn, opts.ValidateFn(), key, v, defaultValue, opts.Logger(), + ); err != nil { + return "", err + } + + return res, nil +} + +// StringArrayFromValue gets a string array from kv.Value. If the value is nil, +// the default value is returned. +func StringArrayFromValue( + v kv.Value, key string, defaultValue []string, opts Options, +) ([]string, error) { + if opts == nil { + opts = NewOptions() + } + + var res []string + updateFn := func(i interface{}) { res = i.([]string) } + + if err := updateWithKV( + getStringArray, updateFn, opts.ValidateFn(), key, v, defaultValue, opts.Logger(), + ); err != nil { + return nil, err + } + + return res, nil +} + +// TimeFromValue gets a time.Time from kv.Value. If the value is nil, the +// default value is returned. +func TimeFromValue( + v kv.Value, key string, defaultValue time.Time, opts Options, +) (time.Time, error) { + if opts == nil { + opts = NewOptions() + } + + var res time.Time + updateFn := func(i interface{}) { res = i.(time.Time) } + + if err := updateWithKV( + getTime, updateFn, opts.ValidateFn(), key, v, defaultValue, opts.Logger(), + ); err != nil { + return time.Time{}, err + } + + return res, nil +} + +func getBool(v kv.Value) (interface{}, error) { + var boolProto commonpb.BoolProto + err := v.Unmarshal(&boolProto) + return boolProto.Value, err +} + +func getFloat64(v kv.Value) (interface{}, error) { + var float64proto commonpb.Float64Proto + err := v.Unmarshal(&float64proto) + return float64proto.Value, err +} + +func getInt64(v kv.Value) (interface{}, error) { + var int64Proto commonpb.Int64Proto + if err := v.Unmarshal(&int64Proto); err != nil { + return 0, err + } + + return int64Proto.Value, nil +} + +func getString(v kv.Value) (interface{}, error) { + var stringProto commonpb.StringProto + if err := v.Unmarshal(&stringProto); err != nil { + return 0, err + } + + return stringProto.Value, nil +} + +func getStringArray(v kv.Value) (interface{}, error) { + var stringArrProto commonpb.StringArrayProto + if err := v.Unmarshal(&stringArrProto); err != nil { + return nil, err + } + + return stringArrProto.Values, nil +} + +func getStringArrayPointer(v kv.Value) (interface{}, error) { + var stringArrProto commonpb.StringArrayProto + if err := v.Unmarshal(&stringArrProto); err != nil { + return nil, err + } + + return &stringArrProto.Values, nil +} + +func getTime(v kv.Value) (interface{}, error) { + var int64Proto commonpb.Int64Proto + if err := v.Unmarshal(&int64Proto); err != nil { + return nil, err + } + + return time.Unix(int64Proto.Value, 0), nil +} + +func getDuration(v kv.Value) (interface{}, error) { + var int64Proto commonpb.Int64Proto + if err := v.Unmarshal(&int64Proto); err != nil { + return nil, err + } + + return time.Duration(int64Proto.Value), nil +} + +func watchAndUpdate( + store kv.Store, + key string, + getValue getValueFn, + update updateFn, + validate ValidateFn, + defaultValue interface{}, + logger *zap.Logger, +) (kv.ValueWatch, error) { + if store == nil { + return nil, errNilStore + } + + var ( + watch kv.ValueWatch + err error + ) + + watch, err = store.Watch(key) + if err != nil { + return nil, fmt.Errorf("could not establish initial watch: %v", err) + } + + go func() { + for range watch.C() { + updateWithKV(getValue, update, validate, key, watch.Get(), defaultValue, logger) + } + // The channel for a ValueWatch should never close. + getLogger(logger). + With(zap.String("key", key)). + Error("watch unexpectedly closed") + }() + + return watch, nil +} + +func updateWithKV( + getValue getValueFn, + update updateFn, + validate ValidateFn, + key string, + v kv.Value, + defaultValue interface{}, + logger *zap.Logger, +) error { + if v == nil { + // The key is deleted from kv, use the default value. + update(defaultValue) + logNilUpdate(logger, key, defaultValue) + return nil + } + + newValue, err := getValue(v) + if err != nil { + logMalformedUpdate(logger, key, v.Version(), newValue, err) + return err + } + + if validate != nil { + if err := validate(newValue); err != nil { + logInvalidUpdate(logger, key, v.Version(), newValue, err) + return err + } + } + + update(newValue) + logUpdateSuccess(logger, key, v.Version(), newValue) + return nil +} + +func logNilUpdate(logger *zap.Logger, k string, v interface{}) { + getLogger(logger).Warn("nil value from kv store, applying default value", + zap.String("key", k), + zap.Any("defaultValue", v), + ) +} + +func logMalformedUpdate(logger *zap.Logger, k string, ver int, v interface{}, err error) { + getLogger(logger).Warn("malformed value from kv store, not applying update", + zap.String("key", k), + zap.Any("malformedValue", v), + zap.Int("version", ver), + zap.Error(err), + ) +} + +func logInvalidUpdate(logger *zap.Logger, k string, ver int, v interface{}, err error) { + getLogger(logger).Warn("invalid value from kv store, not applying update", + zap.String("key", k), + zap.Any("invalidValue", v), + zap.Int("version", ver), + zap.Error(err), + ) +} + +func logUpdateSuccess(logger *zap.Logger, k string, ver int, v interface{}) { + getLogger(logger).Info("value update success", + zap.String("key", k), + zap.Any("value", v), + zap.Int("version", ver), + ) +} + +func getLogger(logger *zap.Logger) *zap.Logger { + if logger == nil { + return noopLogger + } + return logger +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/algo/algo.go b/vendor/github.com/m3db/m3/src/cluster/placement/algo/algo.go new file mode 100644 index 00000000..1d1187c4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/algo/algo.go @@ -0,0 +1,41 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package algo + +import ( + "github.com/m3db/m3/src/cluster/placement" +) + +// NewAlgorithm returns a placement algorithm with given options +func NewAlgorithm(opts placement.Options) placement.Algorithm { + if opts == nil { + opts = placement.NewOptions() + } + if opts.IsMirrored() { + return newMirroredAlgorithm(opts) + } + + if opts.IsSharded() { + return newShardedAlgorithm(opts) + } + + return newNonShardedAlgorithm() +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/algo/mirrored.go b/vendor/github.com/m3db/m3/src/cluster/placement/algo/mirrored.go new file mode 100644 index 00000000..161987c7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/algo/mirrored.go @@ -0,0 +1,569 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package algo + +import ( + "errors" + "fmt" + "strconv" + + "github.com/m3db/m3/src/cluster/placement" + "github.com/m3db/m3/src/cluster/shard" +) + +var ( + errIncompatibleWithMirrorAlgo = errors.New("could not apply mirrored algo on the placement") +) + +type mirroredAlgorithm struct { + opts placement.Options + shardedAlgo placement.Algorithm +} + +func newMirroredAlgorithm(opts placement.Options) placement.Algorithm { + return mirroredAlgorithm{ + opts: opts, + // Mirrored algorithm requires full replacement. + shardedAlgo: newShardedAlgorithm(opts.SetAllowPartialReplace(false)), + } +} + +func (a mirroredAlgorithm) IsCompatibleWith(p placement.Placement) error { + if !p.IsMirrored() { + return errIncompatibleWithMirrorAlgo + } + + if !p.IsSharded() { + return errIncompatibleWithMirrorAlgo + } + + return nil +} + +func (a mirroredAlgorithm) InitialPlacement( + instances []placement.Instance, + shards []uint32, + rf int, +) (placement.Placement, error) { + mirrorInstances, err := groupInstancesByShardSetID(instances, rf) + if err != nil { + return nil, err + } + + // We use the sharded algorithm to generate a mirror placement with rf equals 1. + mirrorPlacement, err := a.shardedAlgo.InitialPlacement(mirrorInstances, shards, 1) + if err != nil { + return nil, err + } + + return placementFromMirror(mirrorPlacement, instances, rf) +} + +func (a mirroredAlgorithm) AddReplica(p placement.Placement) (placement.Placement, error) { + // TODO(cw): We could support AddReplica(p placement.Placement, instances []placement.Instance) + // and apply the shards from the new replica to the adding instances in the future. + return nil, errors.New("not supported") +} + +func (a mirroredAlgorithm) RemoveInstances( + p placement.Placement, + instanceIDs []string, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + nowNanos := a.opts.NowFn()().UnixNano() + // If the instances being removed are all the initializing instances in the placement. + // We just need to return these shards back to their sources. + if allInitializing(p, instanceIDs, nowNanos) { + return a.returnInitializingShards(p, instanceIDs) + } + + p, _, err := a.MarkAllShardsAvailable(p) + if err != nil { + return nil, err + } + + removingInstances := make([]placement.Instance, 0, len(instanceIDs)) + for _, id := range instanceIDs { + instance, ok := p.Instance(id) + if !ok { + return nil, fmt.Errorf("instance %s does not exist in the placement", id) + } + removingInstances = append(removingInstances, instance) + } + + mirrorPlacement, err := mirrorFromPlacement(p) + if err != nil { + return nil, err + } + + mirrorInstances, err := groupInstancesByShardSetID(removingInstances, p.ReplicaFactor()) + if err != nil { + return nil, err + } + + for _, instance := range mirrorInstances { + if mirrorPlacement, err = a.shardedAlgo.RemoveInstances( + mirrorPlacement, + []string{instance.ID()}, + ); err != nil { + return nil, err + } + } + return placementFromMirror(mirrorPlacement, p.Instances(), p.ReplicaFactor()) +} + +func (a mirroredAlgorithm) AddInstances( + p placement.Placement, + addingInstances []placement.Instance, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + nowNanos := a.opts.NowFn()().UnixNano() + // If the instances being added are all the leaving instances in the placement. + // We just need to get their shards back. + if allLeaving(p, addingInstances, nowNanos) { + return a.reclaimLeavingShards(p, addingInstances) + } + + p, _, err := a.MarkAllShardsAvailable(p) + if err != nil { + return nil, err + } + + // At this point, all leaving instances in the placement are cleaned up. + if addingInstances, err = validAddingInstances(p, addingInstances); err != nil { + return nil, err + } + + mirrorPlacement, err := mirrorFromPlacement(p) + if err != nil { + return nil, err + } + + mirrorInstances, err := groupInstancesByShardSetID(addingInstances, p.ReplicaFactor()) + if err != nil { + return nil, err + } + + for _, instance := range mirrorInstances { + if mirrorPlacement, err = a.shardedAlgo.AddInstances( + mirrorPlacement, + []placement.Instance{instance}, + ); err != nil { + return nil, err + } + } + + return placementFromMirror(mirrorPlacement, append(p.Instances(), addingInstances...), p.ReplicaFactor()) +} + +func (a mirroredAlgorithm) ReplaceInstances( + p placement.Placement, + leavingInstanceIDs []string, + addingInstances []placement.Instance, +) (placement.Placement, error) { + err := a.IsCompatibleWith(p) + if err != nil { + return nil, err + } + + if len(addingInstances) != len(leavingInstanceIDs) { + return nil, fmt.Errorf("could not replace %d instances with %d instances for mirrored replace", len(leavingInstanceIDs), len(addingInstances)) + } + + nowNanos := a.opts.NowFn()().UnixNano() + if allLeaving(p, addingInstances, nowNanos) && allInitializing(p, leavingInstanceIDs, nowNanos) { + if p, err = a.reclaimLeavingShards(p, addingInstances); err != nil { + return nil, err + } + + // NB(cw) I don't think we will ever get here, but just being defensive. + return a.returnInitializingShards(p, leavingInstanceIDs) + } + + if p, _, err = a.MarkAllShardsAvailable(p); err != nil { + return nil, err + } + + // At this point, all leaving instances in the placement are cleaned up. + if addingInstances, err = validAddingInstances(p, addingInstances); err != nil { + return nil, err + } + for i := range leavingInstanceIDs { + // We want full replacement for each instance. + if p, err = a.shardedAlgo.ReplaceInstances( + p, + leavingInstanceIDs[i:i+1], + addingInstances[i:i+1], + ); err != nil { + return nil, err + } + } + return p, nil +} + +func (a mirroredAlgorithm) MarkShardsAvailable( + p placement.Placement, + instanceID string, + shardIDs ...uint32, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + return a.shardedAlgo.MarkShardsAvailable(p, instanceID, shardIDs...) +} + +func (a mirroredAlgorithm) MarkAllShardsAvailable( + p placement.Placement, +) (placement.Placement, bool, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, false, err + } + + return a.shardedAlgo.MarkAllShardsAvailable(p) +} + +// allInitializing returns true when +// 1: the given list of instances matches all the initializing instances in the placement. +// 2: the shards are not cutover yet. +func allInitializing(p placement.Placement, instances []string, nowNanos int64) bool { + ids := make(map[string]struct{}, len(instances)) + for _, i := range instances { + ids[i] = struct{}{} + } + + return allInstancesInState(ids, p, func(s shard.Shard) bool { + return s.State() == shard.Initializing && s.CutoverNanos() > nowNanos + }) +} + +// allLeaving returns true when +// 1: the given list of instances matches all the leaving instances in the placement. +// 2: the shards are not cutoff yet. +func allLeaving(p placement.Placement, instances []placement.Instance, nowNanos int64) bool { + ids := make(map[string]struct{}, len(instances)) + for _, i := range instances { + ids[i.ID()] = struct{}{} + } + + return allInstancesInState(ids, p, func(s shard.Shard) bool { + return s.State() == shard.Leaving && s.CutoffNanos() > nowNanos + }) +} + +func instanceCheck(instance placement.Instance, shardCheckFn func(s shard.Shard) bool) bool { + for _, s := range instance.Shards().All() { + if !shardCheckFn(s) { + return false + } + } + return true +} + +func allInstancesInState( + instanceIDs map[string]struct{}, + p placement.Placement, + forEachShardFn func(s shard.Shard) bool, +) bool { + for _, instance := range p.Instances() { + if !instanceCheck(instance, forEachShardFn) { + continue + } + if _, ok := instanceIDs[instance.ID()]; !ok { + return false + } + delete(instanceIDs, instance.ID()) + } + + return len(instanceIDs) == 0 +} + +// returnInitializingShards tries to return initializing shards on the given instances +// and retries until no more initializing shards could be returned. +func (a mirroredAlgorithm) returnInitializingShards( + p placement.Placement, + instanceIDs []string, +) (placement.Placement, error) { + for { + madeProgess := false + for _, id := range instanceIDs { + _, exist := p.Instance(id) + if !exist { + continue + } + ph, instance, err := newRemoveInstanceHelper(p, id, a.opts) + if err != nil { + return nil, err + } + numInitShards := instance.Shards().NumShardsForState(shard.Initializing) + ph.returnInitializingShards(instance) + if instance.Shards().NumShardsForState(shard.Initializing) < numInitShards { + // Made some progress on returning shards. + madeProgess = true + } + p = ph.generatePlacement() + if instance.Shards().NumShards() > 0 { + p = p.SetInstances(append(p.Instances(), instance)) + } + } + if !madeProgess { + break + } + } + + for _, id := range instanceIDs { + instance, ok := p.Instance(id) + if !ok { + continue + } + numInitializingShards := instance.Shards().NumShardsForState(shard.Initializing) + if numInitializingShards != 0 { + return nil, fmt.Errorf("there are %d initializing shards could not be returned for instance %s", numInitializingShards, id) + } + } + + return p, nil +} + +// reclaimLeavingShards tries to reclaim leaving shards on the given instances +// and retries until no more leaving shards could be reclaimed. +func (a mirroredAlgorithm) reclaimLeavingShards( + p placement.Placement, + addingInstances []placement.Instance, +) (placement.Placement, error) { + for { + madeProgess := false + for _, instance := range addingInstances { + ph, instance, err := newAddInstanceHelper(p, instance, a.opts, withAvailableOrLeavingShardsOnly) + if err != nil { + return nil, err + } + numLeavingShards := instance.Shards().NumShardsForState(shard.Leaving) + ph.reclaimLeavingShards(instance) + if instance.Shards().NumShardsForState(shard.Leaving) < numLeavingShards { + // Made some progress on reclaiming shards. + madeProgess = true + } + p = ph.generatePlacement() + } + if !madeProgess { + break + } + } + + for _, instance := range addingInstances { + id := instance.ID() + instance, ok := p.Instance(id) + if !ok { + return nil, fmt.Errorf("could not find instance %s in placement after reclaiming leaving shards", id) + } + numLeavingShards := instance.Shards().NumShardsForState(shard.Leaving) + if numLeavingShards != 0 { + return nil, fmt.Errorf("there are %d leaving shards could not be reclaimed for instance %s", numLeavingShards, id) + } + } + + return p, nil +} + +func validAddingInstances(p placement.Placement, addingInstances []placement.Instance) ([]placement.Instance, error) { + for i, instance := range addingInstances { + if _, exist := p.Instance(instance.ID()); exist { + return nil, fmt.Errorf("instance %s already exist in the placement", instance.ID()) + } + if instance.IsLeaving() { + // The instance was leaving in placement, after markAllShardsAsAvailable it is now removed + // from the placement, so we should treat them as fresh new instances. + addingInstances[i] = instance.SetShards(shard.NewShards(nil)) + } + } + return addingInstances, nil +} + +func groupInstancesByShardSetID( + instances []placement.Instance, + rf int, +) ([]placement.Instance, error) { + var ( + shardSetMap = make(map[uint32]*shardSetMetadata, len(instances)) + res = make([]placement.Instance, 0, len(instances)) + ) + for _, instance := range instances { + var ( + ssID = instance.ShardSetID() + weight = instance.Weight() + group = instance.IsolationGroup() + shards = instance.Shards() + ) + meta, ok := shardSetMap[ssID] + if !ok { + meta = &shardSetMetadata{ + weight: weight, + groups: make(map[string]struct{}, rf), + shards: shards, + } + shardSetMap[ssID] = meta + } + if _, ok := meta.groups[group]; ok { + return nil, fmt.Errorf("found duplicated isolation group %s for shardset id %d", group, ssID) + } + + if meta.weight != weight { + return nil, fmt.Errorf("found different weights: %d and %d, for shardset id %d", meta.weight, weight, ssID) + } + + if !meta.shards.Equals(shards) { + return nil, fmt.Errorf("found different shards: %v and %v, for shardset id %d", meta.shards, shards, ssID) + } + + meta.groups[group] = struct{}{} + meta.count++ + } + + for ssID, meta := range shardSetMap { + if meta.count != rf { + return nil, fmt.Errorf("found %d count of shard set id %d, expecting %d", meta.count, ssID, rf) + } + + // NB(cw) The shard set ID should to be assigned in placement service, + // the algorithm does not change the shard set id assigned to each instance. + ssIDStr := strconv.Itoa(int(ssID)) + res = append( + res, + placement.NewInstance(). + SetID(ssIDStr). + SetIsolationGroup(ssIDStr). + SetWeight(meta.weight). + SetShardSetID(ssID). + SetShards(meta.shards.Clone()), + ) + } + + return res, nil +} + +// mirrorFromPlacement zips all instances with the same shardSetID into a virtual instance +// and create a placement with those virtual instance and rf=1. +func mirrorFromPlacement(p placement.Placement) (placement.Placement, error) { + mirrorInstances, err := groupInstancesByShardSetID(p.Instances(), p.ReplicaFactor()) + if err != nil { + return nil, err + } + + return placement.NewPlacement(). + SetInstances(mirrorInstances). + SetReplicaFactor(1). + SetShards(p.Shards()). + SetCutoverNanos(p.CutoverNanos()). + SetIsSharded(true). + SetIsMirrored(true). + SetMaxShardSetID(p.MaxShardSetID()), nil +} + +// placementFromMirror duplicates the shards for each shard set id and assign +// them to the instance with the shard set id. +func placementFromMirror( + mirror placement.Placement, + instances []placement.Instance, + rf int, +) (placement.Placement, error) { + var ( + mirrorInstances = mirror.Instances() + shardSetMap = make(map[uint32][]placement.Instance, len(mirrorInstances)) + instancesWithShards = make([]placement.Instance, 0, len(instances)) + ) + for _, instance := range instances { + instances, ok := shardSetMap[instance.ShardSetID()] + if !ok { + instances = make([]placement.Instance, 0, rf) + } + instances = append(instances, instance) + shardSetMap[instance.ShardSetID()] = instances + } + + for _, mirrorInstance := range mirrorInstances { + instances, err := instancesFromMirror(mirrorInstance, shardSetMap) + if err != nil { + return nil, err + } + instancesWithShards = append(instancesWithShards, instances...) + } + + return placement.NewPlacement(). + SetInstances(instancesWithShards). + SetReplicaFactor(rf). + SetShards(mirror.Shards()). + SetCutoverNanos(mirror.CutoverNanos()). + SetIsMirrored(true). + SetIsSharded(true). + SetMaxShardSetID(mirror.MaxShardSetID()), nil +} + +func instancesFromMirror( + mirrorInstance placement.Instance, + instancesMap map[uint32][]placement.Instance, +) ([]placement.Instance, error) { + ssID := mirrorInstance.ShardSetID() + instances, ok := instancesMap[ssID] + if !ok { + return nil, fmt.Errorf("could not find shard set id %d in placement", ssID) + } + + shards := mirrorInstance.Shards() + for i, instance := range instances { + newShards := make([]shard.Shard, shards.NumShards()) + for j, s := range shards.All() { + // TODO move clone() to shard interface + newShard := shard.NewShard(s.ID()).SetState(s.State()).SetCutoffNanos(s.CutoffNanos()).SetCutoverNanos(s.CutoverNanos()) + sourceID := s.SourceID() + if sourceID != "" { + // The sourceID in the mirror placement is shardSetID, need to be converted + // to instanceID. + shardSetID, err := strconv.Atoi(sourceID) + if err != nil { + return nil, fmt.Errorf("could not convert source id %s to shard set id", sourceID) + } + sourceInstances, ok := instancesMap[uint32(shardSetID)] + if !ok { + return nil, fmt.Errorf("could not find source id %s in placement", sourceID) + } + + sourceID = sourceInstances[i].ID() + } + newShards[j] = newShard.SetSourceID(sourceID) + } + instances[i] = instance.SetShards(shard.NewShards(newShards)) + } + return instances, nil +} + +type shardSetMetadata struct { + weight uint32 + count int + groups map[string]struct{} + shards shard.Shards +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/algo/non_sharded.go b/vendor/github.com/m3db/m3/src/cluster/placement/algo/non_sharded.go new file mode 100644 index 00000000..48062e6a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/algo/non_sharded.go @@ -0,0 +1,159 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package algo + +import ( + "errors" + "fmt" + + "github.com/m3db/m3/src/cluster/placement" +) + +var ( + errShardsOnNonShardedAlgo = errors.New("could not apply shards in non-sharded placement") + errInCompatibleWithNonShardedAlgo = errors.New("could not apply non-sharded algo on the placement") +) + +type nonShardedAlgorithm struct{} + +func newNonShardedAlgorithm() placement.Algorithm { + return nonShardedAlgorithm{} +} + +func (a nonShardedAlgorithm) IsCompatibleWith(p placement.Placement) error { + if p.IsSharded() { + return errInCompatibleWithNonShardedAlgo + } + + if p.IsMirrored() { + return errInCompatibleWithNonShardedAlgo + } + + return nil +} + +func (a nonShardedAlgorithm) InitialPlacement( + instances []placement.Instance, + shards []uint32, + rf int, +) (placement.Placement, error) { + if len(shards) > 0 { + return nil, errShardsOnNonShardedAlgo + } + + return placement.NewPlacement(). + SetInstances(placement.Instances(instances).Clone()). + SetShards(shards). + SetReplicaFactor(rf). + SetIsSharded(false), nil +} + +func (a nonShardedAlgorithm) AddReplica(p placement.Placement) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + return p.Clone().SetReplicaFactor(p.ReplicaFactor() + 1), nil +} + +func (a nonShardedAlgorithm) RemoveInstances( + p placement.Placement, + instanceIDs []string, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + removingInstances := make([]placement.Instance, len(instanceIDs)) + for i, id := range instanceIDs { + instance, ok := p.Instance(id) + if !ok { + return nil, fmt.Errorf("instance %s not found in placement", id) + } + removingInstances[i] = instance + } + + p = p.Clone() + instances := p.Instances() + for _, instance := range removingInstances { + instances = removeInstanceFromList(instances, instance.ID()) + } + return p.SetInstances(instances), nil +} + +func (a nonShardedAlgorithm) AddInstances( + p placement.Placement, + addingInstances []placement.Instance, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + p = p.Clone() + instances := p.Instances() + for _, instance := range addingInstances { + if _, ok := p.Instance(instance.ID()); ok { + return nil, fmt.Errorf("instance %s already exist in placement", instance.ID()) + } + instances = append(instances, instance) + } + + return p.SetInstances(instances), nil +} + +func (a nonShardedAlgorithm) ReplaceInstances( + p placement.Placement, + leavingInstanceIDs []string, + addingInstances []placement.Instance, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + p, err := a.AddInstances(p, addingInstances) + if err != nil { + return nil, err + } + + return a.RemoveInstances(p, leavingInstanceIDs) +} + +func (a nonShardedAlgorithm) MarkShardsAvailable( + p placement.Placement, + instanceID string, + shardIDs ...uint32, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + // There is no shards in non-sharded algorithm. + return p, nil +} + +func (a nonShardedAlgorithm) MarkAllShardsAvailable( + p placement.Placement, +) (placement.Placement, bool, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, false, err + } + // There is no shards in non-sharded algorithm. + return p, false, nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/algo/sharded.go b/vendor/github.com/m3db/m3/src/cluster/placement/algo/sharded.go new file mode 100644 index 00000000..664113eb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/algo/sharded.go @@ -0,0 +1,220 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package algo + +import ( + "errors" + "fmt" + + "github.com/m3db/m3/src/cluster/placement" +) + +var ( + errNotEnoughIsolationGroups = errors.New("not enough isolation groups to take shards, please make sure RF is less than number of isolation groups") + errIncompatibleWithShardedAlgo = errors.New("could not apply sharded algo on the placement") +) + +type shardedPlacementAlgorithm struct { + opts placement.Options +} + +func newShardedAlgorithm(opts placement.Options) placement.Algorithm { + return shardedPlacementAlgorithm{opts: opts} +} + +func (a shardedPlacementAlgorithm) IsCompatibleWith(p placement.Placement) error { + if !p.IsSharded() { + return errIncompatibleWithShardedAlgo + } + + return nil +} + +func (a shardedPlacementAlgorithm) InitialPlacement( + instances []placement.Instance, + shards []uint32, + rf int, +) (placement.Placement, error) { + ph := newInitHelper(placement.Instances(instances).Clone(), shards, a.opts) + if err := ph.placeShards(newShards(shards), nil, ph.Instances()); err != nil { + return nil, err + } + + var ( + p = ph.generatePlacement() + err error + ) + for i := 1; i < rf; i++ { + p, err = a.AddReplica(p) + if err != nil { + return nil, err + } + } + + return tryCleanupShardState(p, a.opts) +} + +func (a shardedPlacementAlgorithm) AddReplica(p placement.Placement) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + p = p.Clone() + ph := newAddReplicaHelper(p, a.opts) + if err := ph.placeShards(newShards(p.Shards()), nil, nonLeavingInstances(ph.Instances())); err != nil { + return nil, err + } + + if err := ph.optimize(safe); err != nil { + return nil, err + } + + return tryCleanupShardState(ph.generatePlacement(), a.opts) +} + +func (a shardedPlacementAlgorithm) RemoveInstances( + p placement.Placement, + instanceIDs []string, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + p = p.Clone() + for _, instanceID := range instanceIDs { + ph, leavingInstance, err := newRemoveInstanceHelper(p, instanceID, a.opts) + if err != nil { + return nil, err + } + // place the shards from the leaving instance to the rest of the cluster + if err := ph.placeShards(leavingInstance.Shards().All(), leavingInstance, ph.Instances()); err != nil { + return nil, err + } + + if err := ph.optimize(safe); err != nil { + return nil, err + } + + if p, _, err = addInstanceToPlacement(ph.generatePlacement(), leavingInstance, withShards); err != nil { + return nil, err + } + } + return tryCleanupShardState(p, a.opts) +} + +func (a shardedPlacementAlgorithm) AddInstances( + p placement.Placement, + instances []placement.Instance, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + p = p.Clone() + for _, instance := range instances { + ph, addingInstance, err := newAddInstanceHelper(p, instance, a.opts, withLeavingShardsOnly) + if err != nil { + return nil, err + } + + if err := ph.addInstance(addingInstance); err != nil { + return nil, err + } + + p = ph.generatePlacement() + } + + return tryCleanupShardState(p, a.opts) +} + +func (a shardedPlacementAlgorithm) ReplaceInstances( + p placement.Placement, + leavingInstanceIDs []string, + addingInstances []placement.Instance, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + p = p.Clone() + ph, leavingInstances, addingInstances, err := newReplaceInstanceHelper(p, leavingInstanceIDs, addingInstances, a.opts) + if err != nil { + return nil, err + } + + for _, leavingInstance := range leavingInstances { + err = ph.placeShards(leavingInstance.Shards().All(), leavingInstance, addingInstances) + if err != nil && err != errNotEnoughIsolationGroups { + // errNotEnoughIsolationGroups means the adding instances do not + // have enough isolation groups to take all the shards, but the rest + // instances might have more isolation groups to take all the shards. + return nil, err + } + load := loadOnInstance(leavingInstance) + if load != 0 && !a.opts.AllowPartialReplace() { + return nil, fmt.Errorf("could not fully replace all shards from %s, %d shards left unassigned", + leavingInstance.ID(), load) + } + } + + if a.opts.AllowPartialReplace() { + // Place the shards left on the leaving instance to the rest of the cluster. + for _, leavingInstance := range leavingInstances { + if err = ph.placeShards(leavingInstance.Shards().All(), leavingInstance, ph.Instances()); err != nil { + return nil, err + } + } + + if err := ph.optimize(unsafe); err != nil { + return nil, err + } + } + + p = ph.generatePlacement() + for _, leavingInstance := range leavingInstances { + if p, _, err = addInstanceToPlacement(p, leavingInstance, withShards); err != nil { + return nil, err + } + } + return tryCleanupShardState(p, a.opts) +} + +func (a shardedPlacementAlgorithm) MarkShardsAvailable( + p placement.Placement, + instanceID string, + shardIDs ...uint32, +) (placement.Placement, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, err + } + + return markShardsAvailable(p.Clone(), instanceID, shardIDs, a.opts) +} + +func (a shardedPlacementAlgorithm) MarkAllShardsAvailable( + p placement.Placement, +) (placement.Placement, bool, error) { + if err := a.IsCompatibleWith(p); err != nil { + return nil, false, err + } + + return markAllShardsAvailable(p, a.opts) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/algo/sharded_helper.go b/vendor/github.com/m3db/m3/src/cluster/placement/algo/sharded_helper.go new file mode 100644 index 00000000..0ce68f06 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/algo/sharded_helper.go @@ -0,0 +1,864 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package algo + +import ( + "container/heap" + "errors" + "fmt" + "math" + + "github.com/m3db/m3/src/cluster/placement" + "github.com/m3db/m3/src/cluster/shard" + + "go.uber.org/zap" +) + +var ( + errAddingInstanceAlreadyExist = errors.New("the adding instance is already in the placement") + errInstanceContainsNonLeavingShards = errors.New("the adding instance contains non leaving shards") + errInstanceContainsInitializingShards = errors.New("the adding instance contains initializing shards") +) + +type instanceType int + +const ( + anyType instanceType = iota + withShards + withLeavingShardsOnly + withAvailableOrLeavingShardsOnly +) + +type optimizeType int + +const ( + // safe optimizes the load distribution without violating + // minimal shard movemoment. + safe optimizeType = iota + // unsafe optimizes the load distribution with the potential of violating + // minimal shard movement in order to reach best shard distribution + unsafe +) + +type assignLoadFn func(instance placement.Instance) error + +type placementHelper interface { + PlacementHelper + + // placeShards distributes shards to the instances in the helper, with aware of where are the shards coming from. + placeShards(shards []shard.Shard, from placement.Instance, candidates []placement.Instance) error + + // addInstance adds an instance to the placement. + addInstance(addingInstance placement.Instance) error + + // optimize rebalances the load distribution in the cluster. + optimize(t optimizeType) error + + // generatePlacement generates a placement. + generatePlacement() placement.Placement + + // reclaimLeavingShards reclaims all the leaving shards on the given instance + // by pulling them back from the rest of the cluster. + reclaimLeavingShards(instance placement.Instance) + + // returnInitializingShards returns all the initializing shards on the given instance + // by returning them back to the original owners. + returnInitializingShards(instance placement.Instance) +} + +// PlacementHelper helps the algorithm to place shards. +type PlacementHelper interface { + // Instances returns the list of instances managed by the PlacementHelper. + Instances() []placement.Instance + + // CanMoveShard checks if the shard can be moved from the instance to the target isolation group. + CanMoveShard(shard uint32, fromInstance placement.Instance, toIsolationGroup string) bool +} + +type helper struct { + targetLoad map[string]int + shardToInstanceMap map[uint32]map[placement.Instance]struct{} + groupToInstancesMap map[string]map[placement.Instance]struct{} + groupToWeightMap map[string]uint32 + rf int + uniqueShards []uint32 + instances map[string]placement.Instance + log *zap.Logger + opts placement.Options + totalWeight uint32 + maxShardSetID uint32 +} + +// NewPlacementHelper returns a placement helper +func NewPlacementHelper(p placement.Placement, opts placement.Options) PlacementHelper { + return newHelper(p, p.ReplicaFactor(), opts) +} + +func newInitHelper(instances []placement.Instance, ids []uint32, opts placement.Options) placementHelper { + emptyPlacement := placement.NewPlacement(). + SetInstances(instances). + SetShards(ids). + SetReplicaFactor(0). + SetIsSharded(true). + SetCutoverNanos(opts.PlacementCutoverNanosFn()()) + return newHelper(emptyPlacement, emptyPlacement.ReplicaFactor()+1, opts) +} + +func newAddReplicaHelper(p placement.Placement, opts placement.Options) placementHelper { + return newHelper(p, p.ReplicaFactor()+1, opts) +} + +func newAddInstanceHelper( + p placement.Placement, + instance placement.Instance, + opts placement.Options, + t instanceType, +) (placementHelper, placement.Instance, error) { + instanceInPlacement, exist := p.Instance(instance.ID()) + if !exist { + return newHelper(p.SetInstances(append(p.Instances(), instance)), p.ReplicaFactor(), opts), instance, nil + } + + switch t { + case withLeavingShardsOnly: + if !instanceInPlacement.IsLeaving() { + return nil, nil, errInstanceContainsNonLeavingShards + } + case withAvailableOrLeavingShardsOnly: + shards := instanceInPlacement.Shards() + if shards.NumShards() != shards.NumShardsForState(shard.Available)+shards.NumShardsForState(shard.Leaving) { + return nil, nil, errInstanceContainsInitializingShards + } + default: + return nil, nil, fmt.Errorf("unexpected type %v", t) + } + + return newHelper(p, p.ReplicaFactor(), opts), instanceInPlacement, nil +} + +func newRemoveInstanceHelper( + p placement.Placement, + instanceID string, + opts placement.Options, +) (placementHelper, placement.Instance, error) { + p, leavingInstance, err := removeInstanceFromPlacement(p, instanceID) + if err != nil { + return nil, nil, err + } + return newHelper(p, p.ReplicaFactor(), opts), leavingInstance, nil +} + +func newReplaceInstanceHelper( + p placement.Placement, + instanceIDs []string, + addingInstances []placement.Instance, + opts placement.Options, +) (placementHelper, []placement.Instance, []placement.Instance, error) { + var ( + leavingInstances = make([]placement.Instance, len(instanceIDs)) + err error + ) + for i, instanceID := range instanceIDs { + p, leavingInstances[i], err = removeInstanceFromPlacement(p, instanceID) + if err != nil { + return nil, nil, nil, err + } + } + + newAddingInstances := make([]placement.Instance, len(addingInstances)) + for i, instance := range addingInstances { + p, newAddingInstances[i], err = addInstanceToPlacement(p, instance, anyType) + if err != nil { + return nil, nil, nil, err + } + } + return newHelper(p, p.ReplicaFactor(), opts), leavingInstances, newAddingInstances, nil +} + +func newHelper(p placement.Placement, targetRF int, opts placement.Options) placementHelper { + ph := &helper{ + rf: targetRF, + instances: make(map[string]placement.Instance, p.NumInstances()), + uniqueShards: p.Shards(), + maxShardSetID: p.MaxShardSetID(), + log: opts.InstrumentOptions().Logger(), + opts: opts, + } + + for _, instance := range p.Instances() { + ph.instances[instance.ID()] = instance + } + + ph.scanCurrentLoad() + ph.buildTargetLoad() + return ph +} + +func (ph *helper) scanCurrentLoad() { + ph.shardToInstanceMap = make(map[uint32]map[placement.Instance]struct{}, len(ph.uniqueShards)) + ph.groupToInstancesMap = make(map[string]map[placement.Instance]struct{}) + ph.groupToWeightMap = make(map[string]uint32) + totalWeight := uint32(0) + for _, instance := range ph.instances { + if _, exist := ph.groupToInstancesMap[instance.IsolationGroup()]; !exist { + ph.groupToInstancesMap[instance.IsolationGroup()] = make(map[placement.Instance]struct{}) + } + ph.groupToInstancesMap[instance.IsolationGroup()][instance] = struct{}{} + + if instance.IsLeaving() { + // Leaving instances are not counted as usable capacities in the placement. + continue + } + + ph.groupToWeightMap[instance.IsolationGroup()] = ph.groupToWeightMap[instance.IsolationGroup()] + instance.Weight() + totalWeight += instance.Weight() + + for _, s := range instance.Shards().All() { + if s.State() == shard.Leaving { + continue + } + ph.assignShardToInstance(s, instance) + } + } + ph.totalWeight = totalWeight +} + +func (ph *helper) buildTargetLoad() { + overWeightedGroups := 0 + overWeight := uint32(0) + for _, weight := range ph.groupToWeightMap { + if isOverWeighted(weight, ph.totalWeight, ph.rf) { + overWeightedGroups++ + overWeight += weight + } + } + + targetLoad := make(map[string]int, len(ph.instances)) + for _, instance := range ph.instances { + if instance.IsLeaving() { + // We should not set a target load for leaving instances. + continue + } + igWeight := ph.groupToWeightMap[instance.IsolationGroup()] + if isOverWeighted(igWeight, ph.totalWeight, ph.rf) { + // If the instance is on a over-sized isolation group, the target load + // equals (shardLen / capacity of the isolation group). + targetLoad[instance.ID()] = int(math.Ceil(float64(ph.getShardLen()) * float64(instance.Weight()) / float64(igWeight))) + } else { + // If the instance is on a normal isolation group, get the target load + // with aware of other over-sized isolation group. + targetLoad[instance.ID()] = ph.getShardLen() * (ph.rf - overWeightedGroups) * int(instance.Weight()) / int(ph.totalWeight-overWeight) + } + } + ph.targetLoad = targetLoad +} + +func (ph *helper) Instances() []placement.Instance { + res := make([]placement.Instance, 0, len(ph.instances)) + for _, instance := range ph.instances { + res = append(res, instance) + } + return res +} + +func (ph *helper) getShardLen() int { + return len(ph.uniqueShards) +} + +func (ph *helper) targetLoadForInstance(id string) int { + return ph.targetLoad[id] +} + +func (ph *helper) moveOneShard(from, to placement.Instance) bool { + // The order matter here: + // The Unknown shards were just moved, so free to be moved around. + // The Initializing shards were still being initialized on the instance, + // so moving them are cheaper than moving those Available shards. + return ph.moveOneShardInState(from, to, shard.Unknown) || + ph.moveOneShardInState(from, to, shard.Initializing) || + ph.moveOneShardInState(from, to, shard.Available) +} + +// nolint: unparam +func (ph *helper) moveOneShardInState(from, to placement.Instance, state shard.State) bool { + for _, s := range from.Shards().ShardsForState(state) { + if ph.moveShard(s, from, to) { + return true + } + } + return false +} + +func (ph *helper) moveShard(candidateShard shard.Shard, from, to placement.Instance) bool { + shardID := candidateShard.ID() + if !ph.canAssignInstance(shardID, from, to) { + return false + } + + if candidateShard.State() == shard.Leaving { + // should not move a Leaving shard, + // Leaving shard will be removed when the Initializing shard is marked as Available + return false + } + + newShard := shard.NewShard(shardID) + + if from != nil { + switch candidateShard.State() { + case shard.Unknown, shard.Initializing: + from.Shards().Remove(shardID) + newShard.SetSourceID(candidateShard.SourceID()) + case shard.Available: + candidateShard. + SetState(shard.Leaving). + SetCutoffNanos(ph.opts.ShardCutoffNanosFn()()) + newShard.SetSourceID(from.ID()) + } + + delete(ph.shardToInstanceMap[shardID], from) + } + + curShard, ok := to.Shards().Shard(shardID) + if ok && curShard.State() == shard.Leaving { + // NB(cw): if the instance already owns the shard in Leaving state, + // simply mark it as Available + newShard = shard.NewShard(shardID).SetState(shard.Available) + // NB(cw): Break the link between new owner of this shard with this Leaving instance + instances := ph.shardToInstanceMap[shardID] + for instance := range instances { + shards := instance.Shards() + initShard, ok := shards.Shard(shardID) + if ok && initShard.SourceID() == to.ID() { + initShard.SetSourceID("") + } + } + + } + + ph.assignShardToInstance(newShard, to) + return true +} + +func (ph *helper) CanMoveShard(shard uint32, from placement.Instance, toIsolationGroup string) bool { + if from != nil { + if from.IsolationGroup() == toIsolationGroup { + return true + } + } + for instance := range ph.shardToInstanceMap[shard] { + if instance.IsolationGroup() == toIsolationGroup { + return false + } + } + return true +} + +func (ph *helper) buildInstanceHeap(instances []placement.Instance, availableCapacityAscending bool) (heap.Interface, error) { + return newHeap(instances, availableCapacityAscending, ph.targetLoad, ph.groupToWeightMap) +} + +func (ph *helper) generatePlacement() placement.Placement { + var instances = make([]placement.Instance, 0, len(ph.instances)) + + for _, instance := range ph.instances { + if instance.Shards().NumShards() > 0 { + instances = append(instances, instance) + } + } + + maxShardSetID := ph.maxShardSetID + for _, instance := range instances { + shards := instance.Shards() + for _, s := range shards.ShardsForState(shard.Unknown) { + shards.Add(shard.NewShard(s.ID()). + SetSourceID(s.SourceID()). + SetState(shard.Initializing). + SetCutoverNanos(ph.opts.ShardCutoverNanosFn()())) + } + if shardSetID := instance.ShardSetID(); shardSetID >= maxShardSetID { + maxShardSetID = shardSetID + } + } + + return placement.NewPlacement(). + SetInstances(instances). + SetShards(ph.uniqueShards). + SetReplicaFactor(ph.rf). + SetIsSharded(true). + SetIsMirrored(ph.opts.IsMirrored()). + SetCutoverNanos(ph.opts.PlacementCutoverNanosFn()()). + SetMaxShardSetID(maxShardSetID) +} + +func (ph *helper) placeShards( + shards []shard.Shard, + from placement.Instance, + candidates []placement.Instance, +) error { + shardSet := getShardMap(shards) + if from != nil { + // NB(cw) when removing an adding instance that has not finished bootstrapping its + // Initializing shards, prefer to return those Initializing shards back to the leaving instance + // to reduce some bootstrapping work in the cluster. + ph.returnInitializingShardsToSource(shardSet, from, candidates) + } + + instanceHeap, err := ph.buildInstanceHeap(nonLeavingInstances(candidates), true) + if err != nil { + return err + } + // if there are shards left to be assigned, distribute them evenly + var triedInstances []placement.Instance + for _, s := range shardSet { + if s.State() == shard.Leaving { + continue + } + moved := false + for instanceHeap.Len() > 0 { + tryInstance := heap.Pop(instanceHeap).(placement.Instance) + triedInstances = append(triedInstances, tryInstance) + if ph.moveShard(s, from, tryInstance) { + moved = true + break + } + } + if !moved { + // This should only happen when RF > number of isolation groups. + return errNotEnoughIsolationGroups + } + for _, triedInstance := range triedInstances { + heap.Push(instanceHeap, triedInstance) + } + triedInstances = triedInstances[:0] + } + return nil +} + +func (ph *helper) returnInitializingShards(instance placement.Instance) { + shardSet := getShardMap(instance.Shards().All()) + ph.returnInitializingShardsToSource(shardSet, instance, ph.Instances()) +} + +func (ph *helper) returnInitializingShardsToSource( + shardSet map[uint32]shard.Shard, + from placement.Instance, + candidates []placement.Instance, +) { + candidateMap := make(map[string]placement.Instance, len(candidates)) + for _, candidate := range candidates { + candidateMap[candidate.ID()] = candidate + } + for _, s := range shardSet { + if s.State() != shard.Initializing { + continue + } + sourceID := s.SourceID() + if sourceID == "" { + continue + } + sourceInstance, ok := candidateMap[sourceID] + if !ok { + // NB(cw): This is not an error because the candidates are not + // necessarily all the instances in the placement. + continue + } + if sourceInstance.IsLeaving() { + continue + } + if ph.moveShard(s, from, sourceInstance) { + delete(shardSet, s.ID()) + } + } +} + +func (ph *helper) mostUnderLoadedInstance() (placement.Instance, bool) { + var ( + res placement.Instance + maxLoadGap int + ) + + for id, instance := range ph.instances { + loadGap := ph.targetLoad[id] - loadOnInstance(instance) + if loadGap > maxLoadGap { + maxLoadGap = loadGap + res = instance + } + } + if maxLoadGap > 0 { + return res, true + } + + return nil, false +} + +func (ph *helper) optimize(t optimizeType) error { + var fn assignLoadFn + switch t { + case safe: + fn = ph.assignLoadToInstanceSafe + case unsafe: + fn = ph.assignLoadToInstanceUnsafe + } + uniq := make(map[string]struct{}, len(ph.instances)) + for { + ins, ok := ph.mostUnderLoadedInstance() + if !ok { + return nil + } + if _, exist := uniq[ins.ID()]; exist { + return nil + } + + uniq[ins.ID()] = struct{}{} + if err := fn(ins); err != nil { + return err + } + } +} + +func (ph *helper) assignLoadToInstanceSafe(addingInstance placement.Instance) error { + return ph.assignTargetLoad(addingInstance, func(from, to placement.Instance) bool { + return ph.moveOneShardInState(from, to, shard.Unknown) + }) +} + +func (ph *helper) assignLoadToInstanceUnsafe(addingInstance placement.Instance) error { + return ph.assignTargetLoad(addingInstance, func(from, to placement.Instance) bool { + return ph.moveOneShard(from, to) + }) +} + +func (ph *helper) reclaimLeavingShards(instance placement.Instance) { + if instance.Shards().NumShardsForState(shard.Leaving) == 0 { + // Shortcut if there is nothing to be reclaimed. + return + } + id := instance.ID() + for _, i := range ph.instances { + for _, s := range i.Shards().ShardsForState(shard.Initializing) { + if s.SourceID() == id { + // NB(cw) in very rare case, the leaving shards could not be taken back. + // For example: in a RF=2 case, instance a and b on ig1, instance c on ig2, + // c took shard1 from instance a, before we tried to assign shard1 back to instance a, + // b got assigned shard1, now if we try to add instance a back to the topology, a can + // no longer take shard1 back. + // But it's fine, the algo will fil up those load with other shards from the cluster + ph.moveShard(s, i, instance) + } + } + } +} + +func (ph *helper) addInstance(addingInstance placement.Instance) error { + ph.reclaimLeavingShards(addingInstance) + return ph.assignLoadToInstanceUnsafe(addingInstance) +} + +func (ph *helper) assignTargetLoad( + targetInstance placement.Instance, + moveOneShardFn func(from, to placement.Instance) bool, +) error { + targetLoad := ph.targetLoadForInstance(targetInstance.ID()) + // try to take shards from the most loaded instances until the adding instance reaches target load + instanceHeap, err := ph.buildInstanceHeap(nonLeavingInstances(ph.Instances()), false) + if err != nil { + return err + } + for targetInstance.Shards().NumShards() < targetLoad && instanceHeap.Len() > 0 { + fromInstance := heap.Pop(instanceHeap).(placement.Instance) + if moved := moveOneShardFn(fromInstance, targetInstance); moved { + heap.Push(instanceHeap, fromInstance) + } + } + return nil +} + +func (ph *helper) canAssignInstance(shardID uint32, from, to placement.Instance) bool { + s, ok := to.Shards().Shard(shardID) + if ok && s.State() != shard.Leaving { + // NB(cw): a Leaving shard is not counted to the load of the instance + // so the instance should be able to take the ownership back if needed + // assuming i1 owns shard 1 as Available, this case can be triggered by: + // 1: add i2, now shard 1 is "Leaving" on i1 and "Initializing" on i2 + // 2: remove i2, now i2 needs to return shard 1 back to i1 + // and i1 should be able to take it and mark it as "Available" + return false + } + return ph.CanMoveShard(shardID, from, to.IsolationGroup()) +} + +func (ph *helper) assignShardToInstance(s shard.Shard, to placement.Instance) { + to.Shards().Add(s) + + if _, exist := ph.shardToInstanceMap[s.ID()]; !exist { + ph.shardToInstanceMap[s.ID()] = make(map[placement.Instance]struct{}) + } + ph.shardToInstanceMap[s.ID()][to] = struct{}{} +} + +// instanceHeap provides an easy way to get best candidate instance to assign/steal a shard +type instanceHeap struct { + instances []placement.Instance + igToWeightMap map[string]uint32 + targetLoad map[string]int + capacityAscending bool +} + +func newHeap( + instances []placement.Instance, + capacityAscending bool, + targetLoad map[string]int, + igToWeightMap map[string]uint32, +) (*instanceHeap, error) { + h := &instanceHeap{ + capacityAscending: capacityAscending, + instances: instances, + targetLoad: targetLoad, + igToWeightMap: igToWeightMap, + } + heap.Init(h) + return h, nil +} + +func (h *instanceHeap) targetLoadForInstance(id string) int { + return h.targetLoad[id] +} + +func (h *instanceHeap) Len() int { + return len(h.instances) +} + +func (h *instanceHeap) Less(i, j int) bool { + instanceI := h.instances[i] + instanceJ := h.instances[j] + leftLoadOnI := h.targetLoadForInstance(instanceI.ID()) - loadOnInstance(instanceI) + leftLoadOnJ := h.targetLoadForInstance(instanceJ.ID()) - loadOnInstance(instanceJ) + // If both instance has tokens to be filled, prefer the one from bigger isolation group + // since it tends to be more picky in accepting shards + if leftLoadOnI > 0 && leftLoadOnJ > 0 { + if instanceI.IsolationGroup() != instanceJ.IsolationGroup() { + return h.igToWeightMap[instanceI.IsolationGroup()] > h.igToWeightMap[instanceJ.IsolationGroup()] + } + } + // compare left capacity on both instances + if h.capacityAscending { + return leftLoadOnI > leftLoadOnJ + } + return leftLoadOnI < leftLoadOnJ +} + +func (h instanceHeap) Swap(i, j int) { + h.instances[i], h.instances[j] = h.instances[j], h.instances[i] +} + +func (h *instanceHeap) Push(i interface{}) { + instance := i.(placement.Instance) + h.instances = append(h.instances, instance) +} + +func (h *instanceHeap) Pop() interface{} { + n := len(h.instances) + instance := h.instances[n-1] + h.instances = h.instances[0 : n-1] + return instance +} + +func isOverWeighted(igWeight, totalWeight uint32, rf int) bool { + return float64(igWeight)/float64(totalWeight) >= 1.0/float64(rf) +} + +func addInstanceToPlacement( + p placement.Placement, + i placement.Instance, + t instanceType, +) (placement.Placement, placement.Instance, error) { + if _, exist := p.Instance(i.ID()); exist { + return nil, nil, errAddingInstanceAlreadyExist + } + + switch t { + case anyType: + case withShards: + if i.Shards().NumShards() == 0 { + return p, i, nil + } + default: + return nil, nil, fmt.Errorf("unexpected type %v", t) + } + + instance := i.Clone() + return p.SetInstances(append(p.Instances(), instance)), instance, nil +} + +func removeInstanceFromPlacement(p placement.Placement, id string) (placement.Placement, placement.Instance, error) { + leavingInstance, exist := p.Instance(id) + if !exist { + return nil, nil, fmt.Errorf("instance %s does not exist in placement", id) + } + return p.SetInstances(removeInstanceFromList(p.Instances(), id)), leavingInstance, nil +} + +func getShardMap(shards []shard.Shard) map[uint32]shard.Shard { + r := make(map[uint32]shard.Shard, len(shards)) + + for _, s := range shards { + r[s.ID()] = s + } + return r +} + +func loadOnInstance(instance placement.Instance) int { + return instance.Shards().NumShards() - instance.Shards().NumShardsForState(shard.Leaving) +} + +func nonLeavingInstances(instances []placement.Instance) []placement.Instance { + r := make([]placement.Instance, 0, len(instances)) + for _, instance := range instances { + if instance.IsLeaving() { + continue + } + r = append(r, instance) + } + + return r +} + +func newShards(shardIDs []uint32) []shard.Shard { + r := make([]shard.Shard, len(shardIDs)) + for i, id := range shardIDs { + r[i] = shard.NewShard(id).SetState(shard.Unknown) + } + return r +} + +func removeInstanceFromList(instances []placement.Instance, instanceID string) []placement.Instance { + for i, instance := range instances { + if instance.ID() == instanceID { + last := len(instances) - 1 + instances[i] = instances[last] + return instances[:last] + } + } + return instances +} + +func markShardsAvailable(p placement.Placement, instanceID string, shardIDs []uint32, opts placement.Options) (placement.Placement, error) { + instance, exist := p.Instance(instanceID) + if !exist { + return nil, fmt.Errorf("instance %s does not exist in placement", instanceID) + } + + shards := instance.Shards() + for _, shardID := range shardIDs { + s, exist := shards.Shard(shardID) + if !exist { + return nil, fmt.Errorf("shard %d does not exist in instance %s", shardID, instanceID) + } + + if s.State() != shard.Initializing { + return nil, fmt.Errorf("could not mark shard %d as available, it's not in Initializing state", s.ID()) + } + + isCutoverFn := opts.IsShardCutoverFn() + if isCutoverFn != nil { + if err := isCutoverFn(s); err != nil { + return nil, err + } + } + + p = p.SetCutoverNanos(opts.PlacementCutoverNanosFn()()) + sourceID := s.SourceID() + shards.Add(shard.NewShard(shardID).SetState(shard.Available)) + + // There could be no source for cases like initial placement. + if sourceID == "" { + continue + } + + sourceInstance, exist := p.Instance(sourceID) + if !exist { + return nil, fmt.Errorf("source instance %s for shard %d does not exist in placement", sourceID, shardID) + } + + sourceShards := sourceInstance.Shards() + leavingShard, exist := sourceShards.Shard(shardID) + if !exist { + return nil, fmt.Errorf("shard %d does not exist in source instance %s", shardID, sourceID) + } + + if leavingShard.State() != shard.Leaving { + return nil, fmt.Errorf("shard %d is not leaving instance %s", shardID, sourceID) + } + + isCutoffFn := opts.IsShardCutoffFn() + if isCutoffFn != nil { + if err := isCutoffFn(leavingShard); err != nil { + return nil, err + } + } + + sourceShards.Remove(shardID) + if sourceShards.NumShards() == 0 { + p = p.SetInstances(removeInstanceFromList(p.Instances(), sourceInstance.ID())) + } + } + + return p, nil +} + +// tryCleanupShardState cleans up the shard states if the user only +// wants to keep stable shard state in the placement. +func tryCleanupShardState( + p placement.Placement, + opts placement.Options, +) (placement.Placement, error) { + if opts.ShardStateMode() == placement.StableShardStateOnly { + p, _, err := markAllShardsAvailable( + p, + opts.SetIsShardCutoverFn(nil).SetIsShardCutoffFn(nil), + ) + return p, err + } + return p, nil +} + +func markAllShardsAvailable( + p placement.Placement, + opts placement.Options, +) (placement.Placement, bool, error) { + var ( + err error + updated = false + ) + p = p.Clone() + for _, instance := range p.Instances() { + for _, s := range instance.Shards().All() { + if s.State() == shard.Initializing { + p, err = markShardsAvailable(p, instance.ID(), []uint32{s.ID()}, opts) + if err != nil { + return nil, false, err + } + updated = true + } + } + } + return p, updated, nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/config.go b/vendor/github.com/m3db/m3/src/cluster/placement/config.go new file mode 100644 index 00000000..801bce8b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/config.go @@ -0,0 +1,94 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package placement + +import ( + "time" + + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/x/instrument" +) + +// Configuration is configuration for placement options. +type Configuration struct { + AllowPartialReplace *bool `yaml:"allowPartialReplace"` + AllowAllZones *bool `yaml:"allowAllZones"` + AddAllCandidates *bool `yaml:"addAllCandidates"` + IsSharded *bool `yaml:"isSharded"` + ShardStateMode *ShardStateMode `yaml:"shardStateMode"` + IsMirrored *bool `yaml:"isMirrored"` + IsStaged *bool `yaml:"isStaged"` + ValidZone *string `yaml:"validZone"` +} + +// NewOptions creates a placement options. +func (c *Configuration) NewOptions() Options { + opts := NewOptions() + if value := c.AllowPartialReplace; value != nil { + opts = opts.SetAllowPartialReplace(*value) + } + if value := c.AllowAllZones; value != nil { + opts = opts.SetAllowAllZones(*value) + } + if value := c.AddAllCandidates; value != nil { + opts = opts.SetAddAllCandidates(*value) + } + if value := c.IsSharded; value != nil { + opts = opts.SetIsSharded(*value) + } + if value := c.ShardStateMode; value != nil { + opts = opts.SetShardStateMode(*value) + } + if value := c.IsMirrored; value != nil { + opts = opts.SetIsMirrored(*value) + } + if value := c.IsStaged; value != nil { + opts = opts.SetIsStaged(*value) + } + if value := c.ValidZone; value != nil { + opts = opts.SetValidZone(*value) + } + return opts +} + +// WatcherConfiguration contains placement watcher configuration. +type WatcherConfiguration struct { + // Placement key. + Key string `yaml:"key" validate:"nonzero"` + + // Initial watch timeout. + InitWatchTimeout time.Duration `yaml:"initWatchTimeout"` +} + +// NewOptions creates a placement watcher option. +func (c *WatcherConfiguration) NewOptions( + store kv.Store, + instrumentOpts instrument.Options, +) StagedPlacementWatcherOptions { + opts := NewStagedPlacementWatcherOptions(). + SetInstrumentOptions(instrumentOpts). + SetStagedPlacementKey(c.Key). + SetStagedPlacementStore(store) + if c.InitWatchTimeout != 0 { + opts = opts.SetInitWatchTimeout(c.InitWatchTimeout) + } + return opts +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/options.go b/vendor/github.com/m3db/m3/src/cluster/placement/options.go new file mode 100644 index 00000000..aa5d0455 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/options.go @@ -0,0 +1,261 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package placement + +import ( + "time" + + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/x/clock" + "github.com/m3db/m3/src/x/instrument" +) + +const ( + defaultMaxStepSize = 3 + defaultIsSharded = true + // By default partial replace should be allowed for better distribution. + defaultAllowPartialReplace = true + // By default the zone of the hosts within a placement should match the zone + // that the placement was created with. + defaultAllowAllZones = false +) + +type deploymentOptions struct { + maxStepSize int +} + +// NewDeploymentOptions returns a default DeploymentOptions +func NewDeploymentOptions() DeploymentOptions { + return deploymentOptions{maxStepSize: defaultMaxStepSize} +} + +func (o deploymentOptions) MaxStepSize() int { + return o.maxStepSize +} + +func (o deploymentOptions) SetMaxStepSize(stepSize int) DeploymentOptions { + o.maxStepSize = stepSize + return o +} + +func defaultTimeNanosFn() int64 { return shard.UnInitializedValue } +func defaultShardValidationFn(s shard.Shard) error { return nil } + +type options struct { + shardStateMode ShardStateMode + iopts instrument.Options + validZone string + placementCutOverFn TimeNanosFn + shardCutOverFn TimeNanosFn + shardCutOffFn TimeNanosFn + isShardCutoverFn ShardValidateFn + isShardCutoffFn ShardValidateFn + validateFn ValidateFn + nowFn clock.NowFn + allowPartialReplace bool + allowAllZones bool + addAllCandidates bool + dryrun bool + isSharded bool + isMirrored bool + isStaged bool + instanceSelector InstanceSelector +} + +// NewOptions returns a default Options. +func NewOptions() Options { + return options{ + allowPartialReplace: defaultAllowPartialReplace, + isSharded: defaultIsSharded, + shardStateMode: IncludeTransitionalShardStates, + iopts: instrument.NewOptions(), + placementCutOverFn: defaultTimeNanosFn, + shardCutOverFn: defaultTimeNanosFn, + shardCutOffFn: defaultTimeNanosFn, + isShardCutoverFn: defaultShardValidationFn, + isShardCutoffFn: defaultShardValidationFn, + validateFn: Validate, + nowFn: time.Now, + allowAllZones: defaultAllowAllZones, + } +} + +func (o options) AllowPartialReplace() bool { + return o.allowPartialReplace +} + +func (o options) SetAllowPartialReplace(allowPartialReplace bool) Options { + o.allowPartialReplace = allowPartialReplace + return o +} + +func (o options) AllowAllZones() bool { + return o.allowAllZones +} + +func (o options) SetAllowAllZones(allowAllZones bool) Options { + o.allowAllZones = allowAllZones + return o +} + +func (o options) AddAllCandidates() bool { + return o.addAllCandidates +} + +func (o options) SetAddAllCandidates(addAllCandidates bool) Options { + o.addAllCandidates = addAllCandidates + return o +} + +func (o options) IsSharded() bool { + return o.isSharded +} + +func (o options) SetIsSharded(sharded bool) Options { + o.isSharded = sharded + return o +} + +func (o options) ShardStateMode() ShardStateMode { + return o.shardStateMode +} + +func (o options) SetShardStateMode(value ShardStateMode) Options { + o.shardStateMode = value + return o +} + +func (o options) IsMirrored() bool { + return o.isMirrored +} + +func (o options) SetIsMirrored(v bool) Options { + o.isMirrored = v + return o +} + +func (o options) IsStaged() bool { + return o.isStaged +} + +func (o options) SetIsStaged(v bool) Options { + o.isStaged = v + return o +} + +func (o options) Dryrun() bool { + return o.dryrun +} + +func (o options) SetDryrun(d bool) Options { + o.dryrun = d + return o +} + +func (o options) InstrumentOptions() instrument.Options { + return o.iopts +} + +func (o options) SetInstrumentOptions(iopts instrument.Options) Options { + o.iopts = iopts + return o +} + +func (o options) ValidZone() string { + return o.validZone +} + +func (o options) SetValidZone(z string) Options { + o.validZone = z + return o +} + +func (o options) PlacementCutoverNanosFn() TimeNanosFn { + return o.placementCutOverFn +} + +func (o options) SetPlacementCutoverNanosFn(fn TimeNanosFn) Options { + o.placementCutOverFn = fn + return o +} + +func (o options) ShardCutoverNanosFn() TimeNanosFn { + return o.shardCutOverFn +} + +func (o options) SetShardCutoverNanosFn(fn TimeNanosFn) Options { + o.shardCutOverFn = fn + return o +} + +func (o options) ShardCutoffNanosFn() TimeNanosFn { + return o.shardCutOffFn +} + +func (o options) SetShardCutoffNanosFn(fn TimeNanosFn) Options { + o.shardCutOffFn = fn + return o +} + +func (o options) IsShardCutoverFn() ShardValidateFn { + return o.isShardCutoverFn +} + +func (o options) SetIsShardCutoverFn(fn ShardValidateFn) Options { + o.isShardCutoverFn = fn + return o +} + +func (o options) IsShardCutoffFn() ShardValidateFn { + return o.isShardCutoffFn +} + +func (o options) SetIsShardCutoffFn(fn ShardValidateFn) Options { + o.isShardCutoffFn = fn + return o +} + +func (o options) NowFn() clock.NowFn { + return o.nowFn +} + +func (o options) SetNowFn(fn clock.NowFn) Options { + o.nowFn = fn + return o +} + +func (o options) ValidateFnBeforeUpdate() ValidateFn { + return o.validateFn +} + +func (o options) SetValidateFnBeforeUpdate(fn ValidateFn) Options { + o.validateFn = fn + return o +} + +func (o options) InstanceSelector() InstanceSelector { + return o.instanceSelector +} + +func (o options) SetInstanceSelector(s InstanceSelector) Options { + o.instanceSelector = s + return o +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/placement.go b/vendor/github.com/m3db/m3/src/cluster/placement/placement.go new file mode 100644 index 00000000..c75e587b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/placement.go @@ -0,0 +1,659 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package placement + +import ( + "errors" + "fmt" + "sort" + "strings" + + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" + "github.com/m3db/m3/src/cluster/shard" +) + +const ( + // uninitializedShardSetID represents uninitialized shard set id. + uninitializedShardSetID = 0 +) + +var ( + errNilPlacementProto = errors.New("nil placement proto") + errNilPlacementSnapshotsProto = errors.New("nil placement snapshots proto") + errNilPlacementInstanceProto = errors.New("nil placement instance proto") + errDuplicatedShards = errors.New("invalid placement, there are duplicated shards in one replica") + errUnexpectedShards = errors.New("invalid placement, there are unexpected shard ids on instance") + errMirrorNotSharded = errors.New("invalid placement, mirrored placement must be sharded") +) + +type placement struct { + instances map[string]Instance + instancesByShard map[uint32][]Instance + rf int + shards []uint32 + cutoverNanos int64 + version int + maxShardSetID uint32 + isSharded bool + isMirrored bool +} + +// NewPlacement returns a ServicePlacement +func NewPlacement() Placement { + return &placement{} +} + +// NewPlacementFromProto creates a new placement from proto. +func NewPlacementFromProto(p *placementpb.Placement) (Placement, error) { + if p == nil { + return nil, errNilPlacementProto + } + + shards := make([]uint32, p.NumShards) + for i := uint32(0); i < p.NumShards; i++ { + shards[i] = i + } + instances := make([]Instance, 0, len(p.Instances)) + for _, instance := range p.Instances { + pi, err := NewInstanceFromProto(instance) + if err != nil { + return nil, err + } + instances = append(instances, pi) + } + + return NewPlacement(). + SetInstances(instances). + SetShards(shards). + SetReplicaFactor(int(p.ReplicaFactor)). + SetIsSharded(p.IsSharded). + SetCutoverNanos(p.CutoverTime). + SetIsMirrored(p.IsMirrored). + SetMaxShardSetID(p.MaxShardSetId), nil +} + +func (p *placement) InstancesForShard(shard uint32) []Instance { + if len(p.instancesByShard) == 0 { + return nil + } + return p.instancesByShard[shard] +} + +func (p *placement) Instances() []Instance { + result := make([]Instance, 0, p.NumInstances()) + for _, instance := range p.instances { + result = append(result, instance) + } + sort.Sort(ByIDAscending(result)) + return result +} + +func (p *placement) SetInstances(instances []Instance) Placement { + instancesMap := make(map[string]Instance, len(instances)) + instancesByShard := make(map[uint32][]Instance) + for _, instance := range instances { + instancesMap[instance.ID()] = instance + for _, shard := range instance.Shards().AllIDs() { + instancesByShard[shard] = append(instancesByShard[shard], instance) + } + } + + // Sort the instances by their ids for deterministic ordering. + for _, instances := range instancesByShard { + sort.Sort(ByIDAscending(instances)) + } + + p.instancesByShard = instancesByShard + p.instances = instancesMap + return p +} + +func (p *placement) NumInstances() int { + return len(p.instances) +} + +func (p *placement) Instance(id string) (Instance, bool) { + instance, ok := p.instances[id] + return instance, ok +} + +func (p *placement) ReplicaFactor() int { + return p.rf +} + +func (p *placement) SetReplicaFactor(rf int) Placement { + p.rf = rf + return p +} + +func (p *placement) Shards() []uint32 { + return p.shards +} + +func (p *placement) SetShards(shards []uint32) Placement { + p.shards = shards + return p +} + +func (p *placement) NumShards() int { + return len(p.shards) +} + +func (p *placement) IsSharded() bool { + return p.isSharded +} + +func (p *placement) SetIsSharded(v bool) Placement { + p.isSharded = v + return p +} + +func (p *placement) IsMirrored() bool { + return p.isMirrored +} + +func (p *placement) SetIsMirrored(v bool) Placement { + p.isMirrored = v + return p +} + +func (p *placement) MaxShardSetID() uint32 { + return p.maxShardSetID +} + +func (p *placement) SetMaxShardSetID(v uint32) Placement { + p.maxShardSetID = v + return p +} + +func (p *placement) CutoverNanos() int64 { + return p.cutoverNanos +} + +func (p *placement) SetCutoverNanos(cutoverNanos int64) Placement { + p.cutoverNanos = cutoverNanos + return p +} + +func (p *placement) Version() int { + return p.version +} + +func (p *placement) SetVersion(v int) Placement { + p.version = v + return p +} + +func (p *placement) String() string { + return fmt.Sprintf( + "Placement[Instances=%s, NumShards=%d, ReplicaFactor=%d, IsSharded=%v, IsMirrored=%v]", + p.Instances(), p.NumShards(), p.ReplicaFactor(), p.IsSharded(), p.IsMirrored(), + ) +} + +func (p *placement) Proto() (*placementpb.Placement, error) { + instances := make(map[string]*placementpb.Instance, p.NumInstances()) + for _, instance := range p.Instances() { + pi, err := instance.Proto() + if err != nil { + return nil, err + } + instances[instance.ID()] = pi + } + + return &placementpb.Placement{ + Instances: instances, + ReplicaFactor: uint32(p.ReplicaFactor()), + NumShards: uint32(p.NumShards()), + IsSharded: p.IsSharded(), + CutoverTime: p.CutoverNanos(), + IsMirrored: p.IsMirrored(), + MaxShardSetId: p.MaxShardSetID(), + }, nil +} + +func (p *placement) Clone() Placement { + return NewPlacement(). + SetInstances(Instances(p.Instances()).Clone()). + SetShards(p.Shards()). + SetReplicaFactor(p.ReplicaFactor()). + SetIsSharded(p.IsSharded()). + SetIsMirrored(p.IsMirrored()). + SetCutoverNanos(p.CutoverNanos()). + SetMaxShardSetID(p.MaxShardSetID()). + SetVersion(p.Version()) +} + +// Placements represents a list of placements. +type Placements []Placement + +// NewPlacementsFromProto creates a list of placements from proto. +func NewPlacementsFromProto(p *placementpb.PlacementSnapshots) (Placements, error) { + if p == nil { + return nil, errNilPlacementSnapshotsProto + } + + placements := make([]Placement, 0, len(p.Snapshots)) + for _, snapshot := range p.Snapshots { + placement, err := NewPlacementFromProto(snapshot) + if err != nil { + return nil, err + } + placements = append(placements, placement) + } + sort.Sort(placementsByCutoverAsc(placements)) + return placements, nil +} + +// Proto converts a list of Placement to a proto. +func (placements Placements) Proto() (*placementpb.PlacementSnapshots, error) { + snapshots := make([]*placementpb.Placement, 0, len(placements)) + for _, p := range placements { + placementProto, err := p.Proto() + if err != nil { + return nil, err + } + snapshots = append(snapshots, placementProto) + } + return &placementpb.PlacementSnapshots{ + Snapshots: snapshots, + }, nil +} + +// ActiveIndex finds the index of the last placement whose cutover time is no +// later than timeNanos (a.k.a. the active placement). Assuming the cutover times +// of the placements are sorted in ascending order (i.e., earliest time first). +func (placements Placements) ActiveIndex(timeNanos int64) int { + idx := 0 + for idx < len(placements) && placements[idx].CutoverNanos() <= timeNanos { + idx++ + } + idx-- + return idx +} + +// Validate validates a placement to ensure: +// - The shards on each instance are in valid state. +// - The total number of shards match rf * num_shards_per_replica. +// - Each shard shows up rf times. +// - There is one Initializing shard for each Leaving shard. +// - The instances with same shard_set_id owns the same shards. +func Validate(p Placement) error { + if p.IsMirrored() && !p.IsSharded() { + return errMirrorNotSharded + } + + shardCountMap := convertShardSliceToMap(p.Shards()) + if len(shardCountMap) != len(p.Shards()) { + return errDuplicatedShards + } + + expectedTotal := len(p.Shards()) * p.ReplicaFactor() + totalCapacity := 0 + totalLeaving := 0 + totalInit := 0 + totalInitWithSourceID := 0 + maxShardSetID := p.MaxShardSetID() + instancesByShardSetID := make(map[uint32]Instance, p.NumInstances()) + for _, instance := range p.Instances() { + if instance.Endpoint() == "" { + return fmt.Errorf("instance %s does not contain valid endpoint", instance.String()) + } + if instance.Shards().NumShards() == 0 && p.IsSharded() { + return fmt.Errorf("instance %s contains no shard in a sharded placement", instance.String()) + } + if instance.Shards().NumShards() != 0 && !p.IsSharded() { + return fmt.Errorf("instance %s contains shards in a non-sharded placement", instance.String()) + } + shardSetID := instance.ShardSetID() + if shardSetID > maxShardSetID { + return fmt.Errorf("instance %s shard set id %d is larger than max shard set id %d in the placement", instance.String(), shardSetID, maxShardSetID) + } + for _, s := range instance.Shards().All() { + count, exist := shardCountMap[s.ID()] + if !exist { + return errUnexpectedShards + } + switch s.State() { + case shard.Available: + shardCountMap[s.ID()] = count + 1 + totalCapacity++ + case shard.Initializing: + totalInit++ + shardCountMap[s.ID()] = count + 1 + totalCapacity++ + if s.SourceID() != "" { + totalInitWithSourceID++ + } + case shard.Leaving: + totalLeaving++ + default: + return fmt.Errorf("invalid shard state %v for shard %d", s.State(), s.ID()) + } + } + if shardSetID == uninitializedShardSetID { + continue + } + existingInstance, exists := instancesByShardSetID[shardSetID] + if !exists { + instancesByShardSetID[shardSetID] = instance + } else { + // Both existing shard ids and current shard ids are sorted in ascending order. + existingShardIDs := existingInstance.Shards().AllIDs() + currShardIDs := instance.Shards().AllIDs() + if len(existingShardIDs) != len(currShardIDs) { + return fmt.Errorf("instance %s and %s have the same shard set id %d but different number of shards", existingInstance.String(), instance.String(), shardSetID) + } + for i := 0; i < len(existingShardIDs); i++ { + if existingShardIDs[i] != currShardIDs[i] { + return fmt.Errorf("instance %s and %s have the same shard set id %d but different shards", existingInstance.String(), instance.String(), shardSetID) + } + } + } + } + + if !p.IsSharded() { + return nil + } + + // initializing could be more than leaving for cases like initial placement + if totalLeaving > totalInit { + return fmt.Errorf("invalid placement, %d shards in Leaving state, more than %d in Initializing state", totalLeaving, totalInit) + } + + if totalLeaving != totalInitWithSourceID { + return fmt.Errorf("invalid placement, %d shards in Leaving state, not equal %d in Initializing state with source id", totalLeaving, totalInitWithSourceID) + } + + if expectedTotal != totalCapacity { + return fmt.Errorf("invalid placement, the total available shards in the placement is %d, expecting %d", totalCapacity, expectedTotal) + } + + for shard, c := range shardCountMap { + if p.ReplicaFactor() != c { + return fmt.Errorf("invalid shard count for shard %d: expected %d, actual %d", shard, p.ReplicaFactor(), c) + } + } + return nil +} + +func convertShardSliceToMap(ids []uint32) map[uint32]int { + shardCounts := make(map[uint32]int) + for _, id := range ids { + shardCounts[id] = 0 + } + return shardCounts +} + +// NewInstance returns a new Instance +func NewInstance() Instance { + return &instance{shards: shard.NewShards(nil)} +} + +// NewEmptyInstance returns a Instance with some basic properties but no shards assigned +func NewEmptyInstance(id, isolationGroup, zone, endpoint string, weight uint32) Instance { + return &instance{ + id: id, + isolationGroup: isolationGroup, + zone: zone, + weight: weight, + endpoint: endpoint, + shards: shard.NewShards(nil), + } +} + +// NewInstanceFromProto creates a new placement instance from proto. +func NewInstanceFromProto(instance *placementpb.Instance) (Instance, error) { + if instance == nil { + return nil, errNilPlacementInstanceProto + } + shards, err := shard.NewShardsFromProto(instance.Shards) + if err != nil { + return nil, err + } + debugPort := uint32(0) + if instance.Metadata != nil { + debugPort = instance.Metadata.DebugPort + } + + return NewInstance(). + SetID(instance.Id). + SetIsolationGroup(instance.IsolationGroup). + SetWeight(instance.Weight). + SetZone(instance.Zone). + SetEndpoint(instance.Endpoint). + SetShards(shards). + SetShardSetID(instance.ShardSetId). + SetHostname(instance.Hostname). + SetPort(instance.Port). + SetMetadata(InstanceMetadata{ + DebugPort: debugPort, + }), nil +} + +type instance struct { + id string + isolationGroup string + zone string + endpoint string + hostname string + shards shard.Shards + port uint32 + weight uint32 + shardSetID uint32 + metadata InstanceMetadata +} + +func (i *instance) String() string { + return fmt.Sprintf( + "Instance[ID=%s, IsolationGroup=%s, Zone=%s, Weight=%d, Endpoint=%s, Hostname=%s, Port=%d, ShardSetID=%d, Shards=%s, Metadata=%+v]", + i.id, i.isolationGroup, i.zone, i.weight, i.endpoint, i.hostname, i.port, i.shardSetID, i.shards.String(), i.metadata, + ) +} + +func (i *instance) ID() string { + return i.id +} + +func (i *instance) SetID(id string) Instance { + i.id = id + return i +} + +func (i *instance) IsolationGroup() string { + return i.isolationGroup +} + +func (i *instance) SetIsolationGroup(r string) Instance { + i.isolationGroup = r + return i +} + +func (i *instance) Zone() string { + return i.zone +} + +func (i *instance) SetZone(z string) Instance { + i.zone = z + return i +} + +func (i *instance) Weight() uint32 { + return i.weight +} + +func (i *instance) SetWeight(w uint32) Instance { + i.weight = w + return i +} + +func (i *instance) Endpoint() string { + return i.endpoint +} + +func (i *instance) SetEndpoint(ip string) Instance { + i.endpoint = ip + return i +} + +func (i *instance) Hostname() string { + return i.hostname +} + +func (i *instance) SetHostname(value string) Instance { + i.hostname = value + return i +} + +func (i *instance) Port() uint32 { + return i.port +} + +func (i *instance) SetPort(value uint32) Instance { + i.port = value + return i +} + +func (i *instance) ShardSetID() uint32 { + return i.shardSetID +} + +func (i *instance) SetShardSetID(value uint32) Instance { + i.shardSetID = value + return i +} + +func (i *instance) Shards() shard.Shards { + return i.shards +} + +func (i *instance) SetShards(s shard.Shards) Instance { + i.shards = s + return i +} + +func (i *instance) Metadata() InstanceMetadata { + return i.metadata +} + +func (i *instance) SetMetadata(value InstanceMetadata) Instance { + i.metadata = value + return i +} + +func (i *instance) Proto() (*placementpb.Instance, error) { + ss, err := i.Shards().Proto() + if err != nil { + return &placementpb.Instance{}, err + } + + return &placementpb.Instance{ + Id: i.ID(), + IsolationGroup: i.IsolationGroup(), + Zone: i.Zone(), + Weight: i.Weight(), + Endpoint: i.Endpoint(), + Shards: ss, + ShardSetId: i.ShardSetID(), + Hostname: i.Hostname(), + Port: i.Port(), + Metadata: &placementpb.InstanceMetadata{ + DebugPort: i.Metadata().DebugPort, + }, + }, nil +} + +func (i *instance) IsLeaving() bool { + return i.allShardsInState(shard.Leaving) +} + +func (i *instance) IsInitializing() bool { + return i.allShardsInState(shard.Initializing) +} + +func (i *instance) IsAvailable() bool { + return i.allShardsInState(shard.Available) +} + +func (i *instance) allShardsInState(s shard.State) bool { + ss := i.Shards() + numShards := ss.NumShards() + if numShards == 0 { + return false + } + return numShards == ss.NumShardsForState(s) +} + +func (i *instance) Clone() Instance { + return NewInstance(). + SetID(i.ID()). + SetIsolationGroup(i.IsolationGroup()). + SetZone(i.Zone()). + SetWeight(i.Weight()). + SetEndpoint(i.Endpoint()). + SetHostname(i.Hostname()). + SetPort(i.Port()). + SetShardSetID(i.ShardSetID()). + SetShards(i.Shards().Clone()). + SetMetadata(i.Metadata()) +} + +// Instances is a slice of instances that can produce a debug string. +type Instances []Instance + +func (instances Instances) String() string { + if len(instances) == 0 { + return "[]" + } + // 256 should be pretty sufficient for the string representation + // of each instance. + strs := make([]string, 0, len(instances)*256) + strs = append(strs, "[\n") + for _, elem := range instances { + strs = append(strs, "\t"+elem.String()+",\n") + } + strs = append(strs, "]") + return strings.Join(strs, "") +} + +// Clone returns a set of cloned instances. +func (instances Instances) Clone() Instances { + cloned := make([]Instance, len(instances)) + for i, instance := range instances { + cloned[i] = instance.Clone() + } + return cloned +} + +// ByIDAscending sorts Instance by ID ascending +type ByIDAscending []Instance + +func (s ByIDAscending) Len() int { + return len(s) +} + +func (s ByIDAscending) Less(i, j int) bool { + return strings.Compare(s[i].ID(), s[j].ID()) < 0 +} + +func (s ByIDAscending) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/placement_mock.go b/vendor/github.com/m3db/m3/src/cluster/placement/placement_mock.go new file mode 100644 index 00000000..f297c8e6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/placement_mock.go @@ -0,0 +1,3010 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/cluster/placement/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package placement is a generated GoMock package. +package placement + +import ( + "reflect" + "time" + + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/x/clock" + "github.com/m3db/m3/src/x/instrument" + + "github.com/golang/mock/gomock" + "github.com/golang/protobuf/proto" +) + +// MockInstance is a mock of Instance interface +type MockInstance struct { + ctrl *gomock.Controller + recorder *MockInstanceMockRecorder +} + +// MockInstanceMockRecorder is the mock recorder for MockInstance +type MockInstanceMockRecorder struct { + mock *MockInstance +} + +// NewMockInstance creates a new mock instance +func NewMockInstance(ctrl *gomock.Controller) *MockInstance { + mock := &MockInstance{ctrl: ctrl} + mock.recorder = &MockInstanceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockInstance) EXPECT() *MockInstanceMockRecorder { + return m.recorder +} + +// String mocks base method +func (m *MockInstance) String() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "String") + ret0, _ := ret[0].(string) + return ret0 +} + +// String indicates an expected call of String +func (mr *MockInstanceMockRecorder) String() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockInstance)(nil).String)) +} + +// ID mocks base method +func (m *MockInstance) ID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(string) + return ret0 +} + +// ID indicates an expected call of ID +func (mr *MockInstanceMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockInstance)(nil).ID)) +} + +// SetID mocks base method +func (m *MockInstance) SetID(id string) Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetID", id) + ret0, _ := ret[0].(Instance) + return ret0 +} + +// SetID indicates an expected call of SetID +func (mr *MockInstanceMockRecorder) SetID(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetID", reflect.TypeOf((*MockInstance)(nil).SetID), id) +} + +// IsolationGroup mocks base method +func (m *MockInstance) IsolationGroup() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsolationGroup") + ret0, _ := ret[0].(string) + return ret0 +} + +// IsolationGroup indicates an expected call of IsolationGroup +func (mr *MockInstanceMockRecorder) IsolationGroup() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsolationGroup", reflect.TypeOf((*MockInstance)(nil).IsolationGroup)) +} + +// SetIsolationGroup mocks base method +func (m *MockInstance) SetIsolationGroup(r string) Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIsolationGroup", r) + ret0, _ := ret[0].(Instance) + return ret0 +} + +// SetIsolationGroup indicates an expected call of SetIsolationGroup +func (mr *MockInstanceMockRecorder) SetIsolationGroup(r interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIsolationGroup", reflect.TypeOf((*MockInstance)(nil).SetIsolationGroup), r) +} + +// Zone mocks base method +func (m *MockInstance) Zone() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Zone") + ret0, _ := ret[0].(string) + return ret0 +} + +// Zone indicates an expected call of Zone +func (mr *MockInstanceMockRecorder) Zone() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Zone", reflect.TypeOf((*MockInstance)(nil).Zone)) +} + +// SetZone mocks base method +func (m *MockInstance) SetZone(z string) Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetZone", z) + ret0, _ := ret[0].(Instance) + return ret0 +} + +// SetZone indicates an expected call of SetZone +func (mr *MockInstanceMockRecorder) SetZone(z interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetZone", reflect.TypeOf((*MockInstance)(nil).SetZone), z) +} + +// Weight mocks base method +func (m *MockInstance) Weight() uint32 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Weight") + ret0, _ := ret[0].(uint32) + return ret0 +} + +// Weight indicates an expected call of Weight +func (mr *MockInstanceMockRecorder) Weight() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Weight", reflect.TypeOf((*MockInstance)(nil).Weight)) +} + +// SetWeight mocks base method +func (m *MockInstance) SetWeight(w uint32) Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWeight", w) + ret0, _ := ret[0].(Instance) + return ret0 +} + +// SetWeight indicates an expected call of SetWeight +func (mr *MockInstanceMockRecorder) SetWeight(w interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWeight", reflect.TypeOf((*MockInstance)(nil).SetWeight), w) +} + +// Endpoint mocks base method +func (m *MockInstance) Endpoint() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Endpoint") + ret0, _ := ret[0].(string) + return ret0 +} + +// Endpoint indicates an expected call of Endpoint +func (mr *MockInstanceMockRecorder) Endpoint() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Endpoint", reflect.TypeOf((*MockInstance)(nil).Endpoint)) +} + +// SetEndpoint mocks base method +func (m *MockInstance) SetEndpoint(ip string) Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEndpoint", ip) + ret0, _ := ret[0].(Instance) + return ret0 +} + +// SetEndpoint indicates an expected call of SetEndpoint +func (mr *MockInstanceMockRecorder) SetEndpoint(ip interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEndpoint", reflect.TypeOf((*MockInstance)(nil).SetEndpoint), ip) +} + +// Shards mocks base method +func (m *MockInstance) Shards() shard.Shards { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Shards") + ret0, _ := ret[0].(shard.Shards) + return ret0 +} + +// Shards indicates an expected call of Shards +func (mr *MockInstanceMockRecorder) Shards() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shards", reflect.TypeOf((*MockInstance)(nil).Shards)) +} + +// SetShards mocks base method +func (m *MockInstance) SetShards(s shard.Shards) Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetShards", s) + ret0, _ := ret[0].(Instance) + return ret0 +} + +// SetShards indicates an expected call of SetShards +func (mr *MockInstanceMockRecorder) SetShards(s interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetShards", reflect.TypeOf((*MockInstance)(nil).SetShards), s) +} + +// ShardSetID mocks base method +func (m *MockInstance) ShardSetID() uint32 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardSetID") + ret0, _ := ret[0].(uint32) + return ret0 +} + +// ShardSetID indicates an expected call of ShardSetID +func (mr *MockInstanceMockRecorder) ShardSetID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardSetID", reflect.TypeOf((*MockInstance)(nil).ShardSetID)) +} + +// SetShardSetID mocks base method +func (m *MockInstance) SetShardSetID(value uint32) Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetShardSetID", value) + ret0, _ := ret[0].(Instance) + return ret0 +} + +// SetShardSetID indicates an expected call of SetShardSetID +func (mr *MockInstanceMockRecorder) SetShardSetID(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetShardSetID", reflect.TypeOf((*MockInstance)(nil).SetShardSetID), value) +} + +// Hostname mocks base method +func (m *MockInstance) Hostname() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Hostname") + ret0, _ := ret[0].(string) + return ret0 +} + +// Hostname indicates an expected call of Hostname +func (mr *MockInstanceMockRecorder) Hostname() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Hostname", reflect.TypeOf((*MockInstance)(nil).Hostname)) +} + +// SetHostname mocks base method +func (m *MockInstance) SetHostname(value string) Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostname", value) + ret0, _ := ret[0].(Instance) + return ret0 +} + +// SetHostname indicates an expected call of SetHostname +func (mr *MockInstanceMockRecorder) SetHostname(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostname", reflect.TypeOf((*MockInstance)(nil).SetHostname), value) +} + +// Port mocks base method +func (m *MockInstance) Port() uint32 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Port") + ret0, _ := ret[0].(uint32) + return ret0 +} + +// Port indicates an expected call of Port +func (mr *MockInstanceMockRecorder) Port() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Port", reflect.TypeOf((*MockInstance)(nil).Port)) +} + +// SetPort mocks base method +func (m *MockInstance) SetPort(value uint32) Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPort", value) + ret0, _ := ret[0].(Instance) + return ret0 +} + +// SetPort indicates an expected call of SetPort +func (mr *MockInstanceMockRecorder) SetPort(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPort", reflect.TypeOf((*MockInstance)(nil).SetPort), value) +} + +// Metadata mocks base method +func (m *MockInstance) Metadata() InstanceMetadata { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Metadata") + ret0, _ := ret[0].(InstanceMetadata) + return ret0 +} + +// Metadata indicates an expected call of Metadata +func (mr *MockInstanceMockRecorder) Metadata() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Metadata", reflect.TypeOf((*MockInstance)(nil).Metadata)) +} + +// SetMetadata mocks base method +func (m *MockInstance) SetMetadata(value InstanceMetadata) Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMetadata", value) + ret0, _ := ret[0].(Instance) + return ret0 +} + +// SetMetadata indicates an expected call of SetMetadata +func (mr *MockInstanceMockRecorder) SetMetadata(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMetadata", reflect.TypeOf((*MockInstance)(nil).SetMetadata), value) +} + +// Proto mocks base method +func (m *MockInstance) Proto() (*placementpb.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Proto") + ret0, _ := ret[0].(*placementpb.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Proto indicates an expected call of Proto +func (mr *MockInstanceMockRecorder) Proto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Proto", reflect.TypeOf((*MockInstance)(nil).Proto)) +} + +// IsLeaving mocks base method +func (m *MockInstance) IsLeaving() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsLeaving") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsLeaving indicates an expected call of IsLeaving +func (mr *MockInstanceMockRecorder) IsLeaving() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsLeaving", reflect.TypeOf((*MockInstance)(nil).IsLeaving)) +} + +// IsInitializing mocks base method +func (m *MockInstance) IsInitializing() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsInitializing") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsInitializing indicates an expected call of IsInitializing +func (mr *MockInstanceMockRecorder) IsInitializing() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsInitializing", reflect.TypeOf((*MockInstance)(nil).IsInitializing)) +} + +// IsAvailable mocks base method +func (m *MockInstance) IsAvailable() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsAvailable") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsAvailable indicates an expected call of IsAvailable +func (mr *MockInstanceMockRecorder) IsAvailable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsAvailable", reflect.TypeOf((*MockInstance)(nil).IsAvailable)) +} + +// Clone mocks base method +func (m *MockInstance) Clone() Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Clone") + ret0, _ := ret[0].(Instance) + return ret0 +} + +// Clone indicates an expected call of Clone +func (mr *MockInstanceMockRecorder) Clone() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockInstance)(nil).Clone)) +} + +// MockPlacement is a mock of Placement interface +type MockPlacement struct { + ctrl *gomock.Controller + recorder *MockPlacementMockRecorder +} + +// MockPlacementMockRecorder is the mock recorder for MockPlacement +type MockPlacementMockRecorder struct { + mock *MockPlacement +} + +// NewMockPlacement creates a new mock instance +func NewMockPlacement(ctrl *gomock.Controller) *MockPlacement { + mock := &MockPlacement{ctrl: ctrl} + mock.recorder = &MockPlacementMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockPlacement) EXPECT() *MockPlacementMockRecorder { + return m.recorder +} + +// InstancesForShard mocks base method +func (m *MockPlacement) InstancesForShard(shard uint32) []Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstancesForShard", shard) + ret0, _ := ret[0].([]Instance) + return ret0 +} + +// InstancesForShard indicates an expected call of InstancesForShard +func (mr *MockPlacementMockRecorder) InstancesForShard(shard interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstancesForShard", reflect.TypeOf((*MockPlacement)(nil).InstancesForShard), shard) +} + +// Instances mocks base method +func (m *MockPlacement) Instances() []Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Instances") + ret0, _ := ret[0].([]Instance) + return ret0 +} + +// Instances indicates an expected call of Instances +func (mr *MockPlacementMockRecorder) Instances() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Instances", reflect.TypeOf((*MockPlacement)(nil).Instances)) +} + +// SetInstances mocks base method +func (m *MockPlacement) SetInstances(instances []Instance) Placement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstances", instances) + ret0, _ := ret[0].(Placement) + return ret0 +} + +// SetInstances indicates an expected call of SetInstances +func (mr *MockPlacementMockRecorder) SetInstances(instances interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstances", reflect.TypeOf((*MockPlacement)(nil).SetInstances), instances) +} + +// NumInstances mocks base method +func (m *MockPlacement) NumInstances() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumInstances") + ret0, _ := ret[0].(int) + return ret0 +} + +// NumInstances indicates an expected call of NumInstances +func (mr *MockPlacementMockRecorder) NumInstances() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumInstances", reflect.TypeOf((*MockPlacement)(nil).NumInstances)) +} + +// Instance mocks base method +func (m *MockPlacement) Instance(id string) (Instance, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Instance", id) + ret0, _ := ret[0].(Instance) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// Instance indicates an expected call of Instance +func (mr *MockPlacementMockRecorder) Instance(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Instance", reflect.TypeOf((*MockPlacement)(nil).Instance), id) +} + +// ReplicaFactor mocks base method +func (m *MockPlacement) ReplicaFactor() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReplicaFactor") + ret0, _ := ret[0].(int) + return ret0 +} + +// ReplicaFactor indicates an expected call of ReplicaFactor +func (mr *MockPlacementMockRecorder) ReplicaFactor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReplicaFactor", reflect.TypeOf((*MockPlacement)(nil).ReplicaFactor)) +} + +// SetReplicaFactor mocks base method +func (m *MockPlacement) SetReplicaFactor(rf int) Placement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReplicaFactor", rf) + ret0, _ := ret[0].(Placement) + return ret0 +} + +// SetReplicaFactor indicates an expected call of SetReplicaFactor +func (mr *MockPlacementMockRecorder) SetReplicaFactor(rf interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReplicaFactor", reflect.TypeOf((*MockPlacement)(nil).SetReplicaFactor), rf) +} + +// Shards mocks base method +func (m *MockPlacement) Shards() []uint32 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Shards") + ret0, _ := ret[0].([]uint32) + return ret0 +} + +// Shards indicates an expected call of Shards +func (mr *MockPlacementMockRecorder) Shards() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shards", reflect.TypeOf((*MockPlacement)(nil).Shards)) +} + +// SetShards mocks base method +func (m *MockPlacement) SetShards(s []uint32) Placement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetShards", s) + ret0, _ := ret[0].(Placement) + return ret0 +} + +// SetShards indicates an expected call of SetShards +func (mr *MockPlacementMockRecorder) SetShards(s interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetShards", reflect.TypeOf((*MockPlacement)(nil).SetShards), s) +} + +// NumShards mocks base method +func (m *MockPlacement) NumShards() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumShards") + ret0, _ := ret[0].(int) + return ret0 +} + +// NumShards indicates an expected call of NumShards +func (mr *MockPlacementMockRecorder) NumShards() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumShards", reflect.TypeOf((*MockPlacement)(nil).NumShards)) +} + +// IsSharded mocks base method +func (m *MockPlacement) IsSharded() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsSharded") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsSharded indicates an expected call of IsSharded +func (mr *MockPlacementMockRecorder) IsSharded() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSharded", reflect.TypeOf((*MockPlacement)(nil).IsSharded)) +} + +// SetIsSharded mocks base method +func (m *MockPlacement) SetIsSharded(v bool) Placement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIsSharded", v) + ret0, _ := ret[0].(Placement) + return ret0 +} + +// SetIsSharded indicates an expected call of SetIsSharded +func (mr *MockPlacementMockRecorder) SetIsSharded(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIsSharded", reflect.TypeOf((*MockPlacement)(nil).SetIsSharded), v) +} + +// CutoverNanos mocks base method +func (m *MockPlacement) CutoverNanos() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CutoverNanos") + ret0, _ := ret[0].(int64) + return ret0 +} + +// CutoverNanos indicates an expected call of CutoverNanos +func (mr *MockPlacementMockRecorder) CutoverNanos() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CutoverNanos", reflect.TypeOf((*MockPlacement)(nil).CutoverNanos)) +} + +// SetCutoverNanos mocks base method +func (m *MockPlacement) SetCutoverNanos(cutoverNanos int64) Placement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCutoverNanos", cutoverNanos) + ret0, _ := ret[0].(Placement) + return ret0 +} + +// SetCutoverNanos indicates an expected call of SetCutoverNanos +func (mr *MockPlacementMockRecorder) SetCutoverNanos(cutoverNanos interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCutoverNanos", reflect.TypeOf((*MockPlacement)(nil).SetCutoverNanos), cutoverNanos) +} + +// IsMirrored mocks base method +func (m *MockPlacement) IsMirrored() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsMirrored") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsMirrored indicates an expected call of IsMirrored +func (mr *MockPlacementMockRecorder) IsMirrored() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsMirrored", reflect.TypeOf((*MockPlacement)(nil).IsMirrored)) +} + +// SetIsMirrored mocks base method +func (m *MockPlacement) SetIsMirrored(v bool) Placement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIsMirrored", v) + ret0, _ := ret[0].(Placement) + return ret0 +} + +// SetIsMirrored indicates an expected call of SetIsMirrored +func (mr *MockPlacementMockRecorder) SetIsMirrored(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIsMirrored", reflect.TypeOf((*MockPlacement)(nil).SetIsMirrored), v) +} + +// MaxShardSetID mocks base method +func (m *MockPlacement) MaxShardSetID() uint32 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MaxShardSetID") + ret0, _ := ret[0].(uint32) + return ret0 +} + +// MaxShardSetID indicates an expected call of MaxShardSetID +func (mr *MockPlacementMockRecorder) MaxShardSetID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MaxShardSetID", reflect.TypeOf((*MockPlacement)(nil).MaxShardSetID)) +} + +// SetMaxShardSetID mocks base method +func (m *MockPlacement) SetMaxShardSetID(value uint32) Placement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMaxShardSetID", value) + ret0, _ := ret[0].(Placement) + return ret0 +} + +// SetMaxShardSetID indicates an expected call of SetMaxShardSetID +func (mr *MockPlacementMockRecorder) SetMaxShardSetID(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMaxShardSetID", reflect.TypeOf((*MockPlacement)(nil).SetMaxShardSetID), value) +} + +// String mocks base method +func (m *MockPlacement) String() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "String") + ret0, _ := ret[0].(string) + return ret0 +} + +// String indicates an expected call of String +func (mr *MockPlacementMockRecorder) String() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockPlacement)(nil).String)) +} + +// Version mocks base method +func (m *MockPlacement) Version() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Version") + ret0, _ := ret[0].(int) + return ret0 +} + +// Version indicates an expected call of Version +func (mr *MockPlacementMockRecorder) Version() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Version", reflect.TypeOf((*MockPlacement)(nil).Version)) +} + +// SetVersion mocks base method +func (m *MockPlacement) SetVersion(v int) Placement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetVersion", v) + ret0, _ := ret[0].(Placement) + return ret0 +} + +// SetVersion indicates an expected call of SetVersion +func (mr *MockPlacementMockRecorder) SetVersion(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetVersion", reflect.TypeOf((*MockPlacement)(nil).SetVersion), v) +} + +// Proto mocks base method +func (m *MockPlacement) Proto() (*placementpb.Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Proto") + ret0, _ := ret[0].(*placementpb.Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Proto indicates an expected call of Proto +func (mr *MockPlacementMockRecorder) Proto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Proto", reflect.TypeOf((*MockPlacement)(nil).Proto)) +} + +// Clone mocks base method +func (m *MockPlacement) Clone() Placement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Clone") + ret0, _ := ret[0].(Placement) + return ret0 +} + +// Clone indicates an expected call of Clone +func (mr *MockPlacementMockRecorder) Clone() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockPlacement)(nil).Clone)) +} + +// MockWatch is a mock of Watch interface +type MockWatch struct { + ctrl *gomock.Controller + recorder *MockWatchMockRecorder +} + +// MockWatchMockRecorder is the mock recorder for MockWatch +type MockWatchMockRecorder struct { + mock *MockWatch +} + +// NewMockWatch creates a new mock instance +func NewMockWatch(ctrl *gomock.Controller) *MockWatch { + mock := &MockWatch{ctrl: ctrl} + mock.recorder = &MockWatchMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockWatch) EXPECT() *MockWatchMockRecorder { + return m.recorder +} + +// C mocks base method +func (m *MockWatch) C() <-chan struct{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "C") + ret0, _ := ret[0].(<-chan struct{}) + return ret0 +} + +// C indicates an expected call of C +func (mr *MockWatchMockRecorder) C() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "C", reflect.TypeOf((*MockWatch)(nil).C)) +} + +// Get mocks base method +func (m *MockWatch) Get() (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get +func (mr *MockWatchMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockWatch)(nil).Get)) +} + +// Close mocks base method +func (m *MockWatch) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockWatchMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockWatch)(nil).Close)) +} + +// MockStagedPlacementWatcher is a mock of StagedPlacementWatcher interface +type MockStagedPlacementWatcher struct { + ctrl *gomock.Controller + recorder *MockStagedPlacementWatcherMockRecorder +} + +// MockStagedPlacementWatcherMockRecorder is the mock recorder for MockStagedPlacementWatcher +type MockStagedPlacementWatcherMockRecorder struct { + mock *MockStagedPlacementWatcher +} + +// NewMockStagedPlacementWatcher creates a new mock instance +func NewMockStagedPlacementWatcher(ctrl *gomock.Controller) *MockStagedPlacementWatcher { + mock := &MockStagedPlacementWatcher{ctrl: ctrl} + mock.recorder = &MockStagedPlacementWatcherMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockStagedPlacementWatcher) EXPECT() *MockStagedPlacementWatcherMockRecorder { + return m.recorder +} + +// Watch mocks base method +func (m *MockStagedPlacementWatcher) Watch() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch") + ret0, _ := ret[0].(error) + return ret0 +} + +// Watch indicates an expected call of Watch +func (mr *MockStagedPlacementWatcherMockRecorder) Watch() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockStagedPlacementWatcher)(nil).Watch)) +} + +// ActiveStagedPlacement mocks base method +func (m *MockStagedPlacementWatcher) ActiveStagedPlacement() (ActiveStagedPlacement, DoneFn, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ActiveStagedPlacement") + ret0, _ := ret[0].(ActiveStagedPlacement) + ret1, _ := ret[1].(DoneFn) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ActiveStagedPlacement indicates an expected call of ActiveStagedPlacement +func (mr *MockStagedPlacementWatcherMockRecorder) ActiveStagedPlacement() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ActiveStagedPlacement", reflect.TypeOf((*MockStagedPlacementWatcher)(nil).ActiveStagedPlacement)) +} + +// Unwatch mocks base method +func (m *MockStagedPlacementWatcher) Unwatch() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Unwatch") + ret0, _ := ret[0].(error) + return ret0 +} + +// Unwatch indicates an expected call of Unwatch +func (mr *MockStagedPlacementWatcherMockRecorder) Unwatch() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unwatch", reflect.TypeOf((*MockStagedPlacementWatcher)(nil).Unwatch)) +} + +// MockStagedPlacementWatcherOptions is a mock of StagedPlacementWatcherOptions interface +type MockStagedPlacementWatcherOptions struct { + ctrl *gomock.Controller + recorder *MockStagedPlacementWatcherOptionsMockRecorder +} + +// MockStagedPlacementWatcherOptionsMockRecorder is the mock recorder for MockStagedPlacementWatcherOptions +type MockStagedPlacementWatcherOptionsMockRecorder struct { + mock *MockStagedPlacementWatcherOptions +} + +// NewMockStagedPlacementWatcherOptions creates a new mock instance +func NewMockStagedPlacementWatcherOptions(ctrl *gomock.Controller) *MockStagedPlacementWatcherOptions { + mock := &MockStagedPlacementWatcherOptions{ctrl: ctrl} + mock.recorder = &MockStagedPlacementWatcherOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockStagedPlacementWatcherOptions) EXPECT() *MockStagedPlacementWatcherOptionsMockRecorder { + return m.recorder +} + +// SetClockOptions mocks base method +func (m *MockStagedPlacementWatcherOptions) SetClockOptions(value clock.Options) StagedPlacementWatcherOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClockOptions", value) + ret0, _ := ret[0].(StagedPlacementWatcherOptions) + return ret0 +} + +// SetClockOptions indicates an expected call of SetClockOptions +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) SetClockOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClockOptions", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).SetClockOptions), value) +} + +// ClockOptions mocks base method +func (m *MockStagedPlacementWatcherOptions) ClockOptions() clock.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClockOptions") + ret0, _ := ret[0].(clock.Options) + return ret0 +} + +// ClockOptions indicates an expected call of ClockOptions +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) ClockOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClockOptions", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).ClockOptions)) +} + +// SetInstrumentOptions mocks base method +func (m *MockStagedPlacementWatcherOptions) SetInstrumentOptions(value instrument.Options) StagedPlacementWatcherOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstrumentOptions", value) + ret0, _ := ret[0].(StagedPlacementWatcherOptions) + return ret0 +} + +// SetInstrumentOptions indicates an expected call of SetInstrumentOptions +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) SetInstrumentOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstrumentOptions", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).SetInstrumentOptions), value) +} + +// InstrumentOptions mocks base method +func (m *MockStagedPlacementWatcherOptions) InstrumentOptions() instrument.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstrumentOptions") + ret0, _ := ret[0].(instrument.Options) + return ret0 +} + +// InstrumentOptions indicates an expected call of InstrumentOptions +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) InstrumentOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstrumentOptions", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).InstrumentOptions)) +} + +// SetActiveStagedPlacementOptions mocks base method +func (m *MockStagedPlacementWatcherOptions) SetActiveStagedPlacementOptions(value ActiveStagedPlacementOptions) StagedPlacementWatcherOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetActiveStagedPlacementOptions", value) + ret0, _ := ret[0].(StagedPlacementWatcherOptions) + return ret0 +} + +// SetActiveStagedPlacementOptions indicates an expected call of SetActiveStagedPlacementOptions +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) SetActiveStagedPlacementOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetActiveStagedPlacementOptions", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).SetActiveStagedPlacementOptions), value) +} + +// ActiveStagedPlacementOptions mocks base method +func (m *MockStagedPlacementWatcherOptions) ActiveStagedPlacementOptions() ActiveStagedPlacementOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ActiveStagedPlacementOptions") + ret0, _ := ret[0].(ActiveStagedPlacementOptions) + return ret0 +} + +// ActiveStagedPlacementOptions indicates an expected call of ActiveStagedPlacementOptions +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) ActiveStagedPlacementOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ActiveStagedPlacementOptions", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).ActiveStagedPlacementOptions)) +} + +// SetStagedPlacementKey mocks base method +func (m *MockStagedPlacementWatcherOptions) SetStagedPlacementKey(value string) StagedPlacementWatcherOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetStagedPlacementKey", value) + ret0, _ := ret[0].(StagedPlacementWatcherOptions) + return ret0 +} + +// SetStagedPlacementKey indicates an expected call of SetStagedPlacementKey +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) SetStagedPlacementKey(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetStagedPlacementKey", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).SetStagedPlacementKey), value) +} + +// StagedPlacementKey mocks base method +func (m *MockStagedPlacementWatcherOptions) StagedPlacementKey() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StagedPlacementKey") + ret0, _ := ret[0].(string) + return ret0 +} + +// StagedPlacementKey indicates an expected call of StagedPlacementKey +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) StagedPlacementKey() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StagedPlacementKey", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).StagedPlacementKey)) +} + +// SetStagedPlacementStore mocks base method +func (m *MockStagedPlacementWatcherOptions) SetStagedPlacementStore(store kv.Store) StagedPlacementWatcherOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetStagedPlacementStore", store) + ret0, _ := ret[0].(StagedPlacementWatcherOptions) + return ret0 +} + +// SetStagedPlacementStore indicates an expected call of SetStagedPlacementStore +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) SetStagedPlacementStore(store interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetStagedPlacementStore", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).SetStagedPlacementStore), store) +} + +// StagedPlacementStore mocks base method +func (m *MockStagedPlacementWatcherOptions) StagedPlacementStore() kv.Store { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StagedPlacementStore") + ret0, _ := ret[0].(kv.Store) + return ret0 +} + +// StagedPlacementStore indicates an expected call of StagedPlacementStore +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) StagedPlacementStore() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StagedPlacementStore", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).StagedPlacementStore)) +} + +// SetInitWatchTimeout mocks base method +func (m *MockStagedPlacementWatcherOptions) SetInitWatchTimeout(value time.Duration) StagedPlacementWatcherOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInitWatchTimeout", value) + ret0, _ := ret[0].(StagedPlacementWatcherOptions) + return ret0 +} + +// SetInitWatchTimeout indicates an expected call of SetInitWatchTimeout +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) SetInitWatchTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInitWatchTimeout", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).SetInitWatchTimeout), value) +} + +// InitWatchTimeout mocks base method +func (m *MockStagedPlacementWatcherOptions) InitWatchTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InitWatchTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// InitWatchTimeout indicates an expected call of InitWatchTimeout +func (mr *MockStagedPlacementWatcherOptionsMockRecorder) InitWatchTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitWatchTimeout", reflect.TypeOf((*MockStagedPlacementWatcherOptions)(nil).InitWatchTimeout)) +} + +// MockActiveStagedPlacement is a mock of ActiveStagedPlacement interface +type MockActiveStagedPlacement struct { + ctrl *gomock.Controller + recorder *MockActiveStagedPlacementMockRecorder +} + +// MockActiveStagedPlacementMockRecorder is the mock recorder for MockActiveStagedPlacement +type MockActiveStagedPlacementMockRecorder struct { + mock *MockActiveStagedPlacement +} + +// NewMockActiveStagedPlacement creates a new mock instance +func NewMockActiveStagedPlacement(ctrl *gomock.Controller) *MockActiveStagedPlacement { + mock := &MockActiveStagedPlacement{ctrl: ctrl} + mock.recorder = &MockActiveStagedPlacementMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockActiveStagedPlacement) EXPECT() *MockActiveStagedPlacementMockRecorder { + return m.recorder +} + +// ActivePlacement mocks base method +func (m *MockActiveStagedPlacement) ActivePlacement() (Placement, DoneFn, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ActivePlacement") + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(DoneFn) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ActivePlacement indicates an expected call of ActivePlacement +func (mr *MockActiveStagedPlacementMockRecorder) ActivePlacement() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ActivePlacement", reflect.TypeOf((*MockActiveStagedPlacement)(nil).ActivePlacement)) +} + +// Close mocks base method +func (m *MockActiveStagedPlacement) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockActiveStagedPlacementMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockActiveStagedPlacement)(nil).Close)) +} + +// MockActiveStagedPlacementOptions is a mock of ActiveStagedPlacementOptions interface +type MockActiveStagedPlacementOptions struct { + ctrl *gomock.Controller + recorder *MockActiveStagedPlacementOptionsMockRecorder +} + +// MockActiveStagedPlacementOptionsMockRecorder is the mock recorder for MockActiveStagedPlacementOptions +type MockActiveStagedPlacementOptionsMockRecorder struct { + mock *MockActiveStagedPlacementOptions +} + +// NewMockActiveStagedPlacementOptions creates a new mock instance +func NewMockActiveStagedPlacementOptions(ctrl *gomock.Controller) *MockActiveStagedPlacementOptions { + mock := &MockActiveStagedPlacementOptions{ctrl: ctrl} + mock.recorder = &MockActiveStagedPlacementOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockActiveStagedPlacementOptions) EXPECT() *MockActiveStagedPlacementOptionsMockRecorder { + return m.recorder +} + +// SetClockOptions mocks base method +func (m *MockActiveStagedPlacementOptions) SetClockOptions(value clock.Options) ActiveStagedPlacementOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClockOptions", value) + ret0, _ := ret[0].(ActiveStagedPlacementOptions) + return ret0 +} + +// SetClockOptions indicates an expected call of SetClockOptions +func (mr *MockActiveStagedPlacementOptionsMockRecorder) SetClockOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClockOptions", reflect.TypeOf((*MockActiveStagedPlacementOptions)(nil).SetClockOptions), value) +} + +// ClockOptions mocks base method +func (m *MockActiveStagedPlacementOptions) ClockOptions() clock.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClockOptions") + ret0, _ := ret[0].(clock.Options) + return ret0 +} + +// ClockOptions indicates an expected call of ClockOptions +func (mr *MockActiveStagedPlacementOptionsMockRecorder) ClockOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClockOptions", reflect.TypeOf((*MockActiveStagedPlacementOptions)(nil).ClockOptions)) +} + +// SetOnPlacementsAddedFn mocks base method +func (m *MockActiveStagedPlacementOptions) SetOnPlacementsAddedFn(value OnPlacementsAddedFn) ActiveStagedPlacementOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetOnPlacementsAddedFn", value) + ret0, _ := ret[0].(ActiveStagedPlacementOptions) + return ret0 +} + +// SetOnPlacementsAddedFn indicates an expected call of SetOnPlacementsAddedFn +func (mr *MockActiveStagedPlacementOptionsMockRecorder) SetOnPlacementsAddedFn(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetOnPlacementsAddedFn", reflect.TypeOf((*MockActiveStagedPlacementOptions)(nil).SetOnPlacementsAddedFn), value) +} + +// OnPlacementsAddedFn mocks base method +func (m *MockActiveStagedPlacementOptions) OnPlacementsAddedFn() OnPlacementsAddedFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OnPlacementsAddedFn") + ret0, _ := ret[0].(OnPlacementsAddedFn) + return ret0 +} + +// OnPlacementsAddedFn indicates an expected call of OnPlacementsAddedFn +func (mr *MockActiveStagedPlacementOptionsMockRecorder) OnPlacementsAddedFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnPlacementsAddedFn", reflect.TypeOf((*MockActiveStagedPlacementOptions)(nil).OnPlacementsAddedFn)) +} + +// SetOnPlacementsRemovedFn mocks base method +func (m *MockActiveStagedPlacementOptions) SetOnPlacementsRemovedFn(value OnPlacementsRemovedFn) ActiveStagedPlacementOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetOnPlacementsRemovedFn", value) + ret0, _ := ret[0].(ActiveStagedPlacementOptions) + return ret0 +} + +// SetOnPlacementsRemovedFn indicates an expected call of SetOnPlacementsRemovedFn +func (mr *MockActiveStagedPlacementOptionsMockRecorder) SetOnPlacementsRemovedFn(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetOnPlacementsRemovedFn", reflect.TypeOf((*MockActiveStagedPlacementOptions)(nil).SetOnPlacementsRemovedFn), value) +} + +// OnPlacementsRemovedFn mocks base method +func (m *MockActiveStagedPlacementOptions) OnPlacementsRemovedFn() OnPlacementsRemovedFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OnPlacementsRemovedFn") + ret0, _ := ret[0].(OnPlacementsRemovedFn) + return ret0 +} + +// OnPlacementsRemovedFn indicates an expected call of OnPlacementsRemovedFn +func (mr *MockActiveStagedPlacementOptionsMockRecorder) OnPlacementsRemovedFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnPlacementsRemovedFn", reflect.TypeOf((*MockActiveStagedPlacementOptions)(nil).OnPlacementsRemovedFn)) +} + +// MockStagedPlacement is a mock of StagedPlacement interface +type MockStagedPlacement struct { + ctrl *gomock.Controller + recorder *MockStagedPlacementMockRecorder +} + +// MockStagedPlacementMockRecorder is the mock recorder for MockStagedPlacement +type MockStagedPlacementMockRecorder struct { + mock *MockStagedPlacement +} + +// NewMockStagedPlacement creates a new mock instance +func NewMockStagedPlacement(ctrl *gomock.Controller) *MockStagedPlacement { + mock := &MockStagedPlacement{ctrl: ctrl} + mock.recorder = &MockStagedPlacementMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockStagedPlacement) EXPECT() *MockStagedPlacementMockRecorder { + return m.recorder +} + +// ActiveStagedPlacement mocks base method +func (m *MockStagedPlacement) ActiveStagedPlacement(timeNanos int64) ActiveStagedPlacement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ActiveStagedPlacement", timeNanos) + ret0, _ := ret[0].(ActiveStagedPlacement) + return ret0 +} + +// ActiveStagedPlacement indicates an expected call of ActiveStagedPlacement +func (mr *MockStagedPlacementMockRecorder) ActiveStagedPlacement(timeNanos interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ActiveStagedPlacement", reflect.TypeOf((*MockStagedPlacement)(nil).ActiveStagedPlacement), timeNanos) +} + +// Version mocks base method +func (m *MockStagedPlacement) Version() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Version") + ret0, _ := ret[0].(int) + return ret0 +} + +// Version indicates an expected call of Version +func (mr *MockStagedPlacementMockRecorder) Version() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Version", reflect.TypeOf((*MockStagedPlacement)(nil).Version)) +} + +// SetVersion mocks base method +func (m *MockStagedPlacement) SetVersion(version int) StagedPlacement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetVersion", version) + ret0, _ := ret[0].(StagedPlacement) + return ret0 +} + +// SetVersion indicates an expected call of SetVersion +func (mr *MockStagedPlacementMockRecorder) SetVersion(version interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetVersion", reflect.TypeOf((*MockStagedPlacement)(nil).SetVersion), version) +} + +// Placements mocks base method +func (m *MockStagedPlacement) Placements() Placements { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Placements") + ret0, _ := ret[0].(Placements) + return ret0 +} + +// Placements indicates an expected call of Placements +func (mr *MockStagedPlacementMockRecorder) Placements() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Placements", reflect.TypeOf((*MockStagedPlacement)(nil).Placements)) +} + +// SetPlacements mocks base method +func (m *MockStagedPlacement) SetPlacements(placements []Placement) StagedPlacement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPlacements", placements) + ret0, _ := ret[0].(StagedPlacement) + return ret0 +} + +// SetPlacements indicates an expected call of SetPlacements +func (mr *MockStagedPlacementMockRecorder) SetPlacements(placements interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPlacements", reflect.TypeOf((*MockStagedPlacement)(nil).SetPlacements), placements) +} + +// ActiveStagedPlacementOptions mocks base method +func (m *MockStagedPlacement) ActiveStagedPlacementOptions() ActiveStagedPlacementOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ActiveStagedPlacementOptions") + ret0, _ := ret[0].(ActiveStagedPlacementOptions) + return ret0 +} + +// ActiveStagedPlacementOptions indicates an expected call of ActiveStagedPlacementOptions +func (mr *MockStagedPlacementMockRecorder) ActiveStagedPlacementOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ActiveStagedPlacementOptions", reflect.TypeOf((*MockStagedPlacement)(nil).ActiveStagedPlacementOptions)) +} + +// SetActiveStagedPlacementOptions mocks base method +func (m *MockStagedPlacement) SetActiveStagedPlacementOptions(opts ActiveStagedPlacementOptions) StagedPlacement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetActiveStagedPlacementOptions", opts) + ret0, _ := ret[0].(StagedPlacement) + return ret0 +} + +// SetActiveStagedPlacementOptions indicates an expected call of SetActiveStagedPlacementOptions +func (mr *MockStagedPlacementMockRecorder) SetActiveStagedPlacementOptions(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetActiveStagedPlacementOptions", reflect.TypeOf((*MockStagedPlacement)(nil).SetActiveStagedPlacementOptions), opts) +} + +// Proto mocks base method +func (m *MockStagedPlacement) Proto() (*placementpb.PlacementSnapshots, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Proto") + ret0, _ := ret[0].(*placementpb.PlacementSnapshots) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Proto indicates an expected call of Proto +func (mr *MockStagedPlacementMockRecorder) Proto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Proto", reflect.TypeOf((*MockStagedPlacement)(nil).Proto)) +} + +// MockOptions is a mock of Options interface +type MockOptions struct { + ctrl *gomock.Controller + recorder *MockOptionsMockRecorder +} + +// MockOptionsMockRecorder is the mock recorder for MockOptions +type MockOptionsMockRecorder struct { + mock *MockOptions +} + +// NewMockOptions creates a new mock instance +func NewMockOptions(ctrl *gomock.Controller) *MockOptions { + mock := &MockOptions{ctrl: ctrl} + mock.recorder = &MockOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptions) EXPECT() *MockOptionsMockRecorder { + return m.recorder +} + +// AllowPartialReplace mocks base method +func (m *MockOptions) AllowPartialReplace() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllowPartialReplace") + ret0, _ := ret[0].(bool) + return ret0 +} + +// AllowPartialReplace indicates an expected call of AllowPartialReplace +func (mr *MockOptionsMockRecorder) AllowPartialReplace() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllowPartialReplace", reflect.TypeOf((*MockOptions)(nil).AllowPartialReplace)) +} + +// SetAllowPartialReplace mocks base method +func (m *MockOptions) SetAllowPartialReplace(allowPartialReplace bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAllowPartialReplace", allowPartialReplace) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAllowPartialReplace indicates an expected call of SetAllowPartialReplace +func (mr *MockOptionsMockRecorder) SetAllowPartialReplace(allowPartialReplace interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAllowPartialReplace", reflect.TypeOf((*MockOptions)(nil).SetAllowPartialReplace), allowPartialReplace) +} + +// AllowAllZones mocks base method +func (m *MockOptions) AllowAllZones() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllowAllZones") + ret0, _ := ret[0].(bool) + return ret0 +} + +// AllowAllZones indicates an expected call of AllowAllZones +func (mr *MockOptionsMockRecorder) AllowAllZones() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllowAllZones", reflect.TypeOf((*MockOptions)(nil).AllowAllZones)) +} + +// SetAllowAllZones mocks base method +func (m *MockOptions) SetAllowAllZones(allowAllZones bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAllowAllZones", allowAllZones) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAllowAllZones indicates an expected call of SetAllowAllZones +func (mr *MockOptionsMockRecorder) SetAllowAllZones(allowAllZones interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAllowAllZones", reflect.TypeOf((*MockOptions)(nil).SetAllowAllZones), allowAllZones) +} + +// AddAllCandidates mocks base method +func (m *MockOptions) AddAllCandidates() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddAllCandidates") + ret0, _ := ret[0].(bool) + return ret0 +} + +// AddAllCandidates indicates an expected call of AddAllCandidates +func (mr *MockOptionsMockRecorder) AddAllCandidates() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddAllCandidates", reflect.TypeOf((*MockOptions)(nil).AddAllCandidates)) +} + +// SetAddAllCandidates mocks base method +func (m *MockOptions) SetAddAllCandidates(addAllCandidates bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAddAllCandidates", addAllCandidates) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAddAllCandidates indicates an expected call of SetAddAllCandidates +func (mr *MockOptionsMockRecorder) SetAddAllCandidates(addAllCandidates interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAddAllCandidates", reflect.TypeOf((*MockOptions)(nil).SetAddAllCandidates), addAllCandidates) +} + +// InstanceSelector mocks base method +func (m *MockOptions) InstanceSelector() InstanceSelector { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstanceSelector") + ret0, _ := ret[0].(InstanceSelector) + return ret0 +} + +// InstanceSelector indicates an expected call of InstanceSelector +func (mr *MockOptionsMockRecorder) InstanceSelector() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstanceSelector", reflect.TypeOf((*MockOptions)(nil).InstanceSelector)) +} + +// SetInstanceSelector mocks base method +func (m *MockOptions) SetInstanceSelector(s InstanceSelector) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstanceSelector", s) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetInstanceSelector indicates an expected call of SetInstanceSelector +func (mr *MockOptionsMockRecorder) SetInstanceSelector(s interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstanceSelector", reflect.TypeOf((*MockOptions)(nil).SetInstanceSelector), s) +} + +// IsSharded mocks base method +func (m *MockOptions) IsSharded() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsSharded") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsSharded indicates an expected call of IsSharded +func (mr *MockOptionsMockRecorder) IsSharded() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSharded", reflect.TypeOf((*MockOptions)(nil).IsSharded)) +} + +// SetIsSharded mocks base method +func (m *MockOptions) SetIsSharded(sharded bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIsSharded", sharded) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIsSharded indicates an expected call of SetIsSharded +func (mr *MockOptionsMockRecorder) SetIsSharded(sharded interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIsSharded", reflect.TypeOf((*MockOptions)(nil).SetIsSharded), sharded) +} + +// ShardStateMode mocks base method +func (m *MockOptions) ShardStateMode() ShardStateMode { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardStateMode") + ret0, _ := ret[0].(ShardStateMode) + return ret0 +} + +// ShardStateMode indicates an expected call of ShardStateMode +func (mr *MockOptionsMockRecorder) ShardStateMode() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardStateMode", reflect.TypeOf((*MockOptions)(nil).ShardStateMode)) +} + +// SetShardStateMode mocks base method +func (m *MockOptions) SetShardStateMode(value ShardStateMode) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetShardStateMode", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetShardStateMode indicates an expected call of SetShardStateMode +func (mr *MockOptionsMockRecorder) SetShardStateMode(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetShardStateMode", reflect.TypeOf((*MockOptions)(nil).SetShardStateMode), value) +} + +// Dryrun mocks base method +func (m *MockOptions) Dryrun() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Dryrun") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Dryrun indicates an expected call of Dryrun +func (mr *MockOptionsMockRecorder) Dryrun() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Dryrun", reflect.TypeOf((*MockOptions)(nil).Dryrun)) +} + +// SetDryrun mocks base method +func (m *MockOptions) SetDryrun(d bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetDryrun", d) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetDryrun indicates an expected call of SetDryrun +func (mr *MockOptionsMockRecorder) SetDryrun(d interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDryrun", reflect.TypeOf((*MockOptions)(nil).SetDryrun), d) +} + +// IsMirrored mocks base method +func (m *MockOptions) IsMirrored() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsMirrored") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsMirrored indicates an expected call of IsMirrored +func (mr *MockOptionsMockRecorder) IsMirrored() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsMirrored", reflect.TypeOf((*MockOptions)(nil).IsMirrored)) +} + +// SetIsMirrored mocks base method +func (m_2 *MockOptions) SetIsMirrored(m bool) Options { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SetIsMirrored", m) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIsMirrored indicates an expected call of SetIsMirrored +func (mr *MockOptionsMockRecorder) SetIsMirrored(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIsMirrored", reflect.TypeOf((*MockOptions)(nil).SetIsMirrored), m) +} + +// IsStaged mocks base method +func (m *MockOptions) IsStaged() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsStaged") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsStaged indicates an expected call of IsStaged +func (mr *MockOptionsMockRecorder) IsStaged() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsStaged", reflect.TypeOf((*MockOptions)(nil).IsStaged)) +} + +// SetIsStaged mocks base method +func (m *MockOptions) SetIsStaged(v bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIsStaged", v) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIsStaged indicates an expected call of SetIsStaged +func (mr *MockOptionsMockRecorder) SetIsStaged(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIsStaged", reflect.TypeOf((*MockOptions)(nil).SetIsStaged), v) +} + +// InstrumentOptions mocks base method +func (m *MockOptions) InstrumentOptions() instrument.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstrumentOptions") + ret0, _ := ret[0].(instrument.Options) + return ret0 +} + +// InstrumentOptions indicates an expected call of InstrumentOptions +func (mr *MockOptionsMockRecorder) InstrumentOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstrumentOptions", reflect.TypeOf((*MockOptions)(nil).InstrumentOptions)) +} + +// SetInstrumentOptions mocks base method +func (m *MockOptions) SetInstrumentOptions(iopts instrument.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstrumentOptions", iopts) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetInstrumentOptions indicates an expected call of SetInstrumentOptions +func (mr *MockOptionsMockRecorder) SetInstrumentOptions(iopts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstrumentOptions", reflect.TypeOf((*MockOptions)(nil).SetInstrumentOptions), iopts) +} + +// ValidZone mocks base method +func (m *MockOptions) ValidZone() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValidZone") + ret0, _ := ret[0].(string) + return ret0 +} + +// ValidZone indicates an expected call of ValidZone +func (mr *MockOptionsMockRecorder) ValidZone() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidZone", reflect.TypeOf((*MockOptions)(nil).ValidZone)) +} + +// SetValidZone mocks base method +func (m *MockOptions) SetValidZone(z string) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetValidZone", z) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetValidZone indicates an expected call of SetValidZone +func (mr *MockOptionsMockRecorder) SetValidZone(z interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetValidZone", reflect.TypeOf((*MockOptions)(nil).SetValidZone), z) +} + +// PlacementCutoverNanosFn mocks base method +func (m *MockOptions) PlacementCutoverNanosFn() TimeNanosFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PlacementCutoverNanosFn") + ret0, _ := ret[0].(TimeNanosFn) + return ret0 +} + +// PlacementCutoverNanosFn indicates an expected call of PlacementCutoverNanosFn +func (mr *MockOptionsMockRecorder) PlacementCutoverNanosFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PlacementCutoverNanosFn", reflect.TypeOf((*MockOptions)(nil).PlacementCutoverNanosFn)) +} + +// SetPlacementCutoverNanosFn mocks base method +func (m *MockOptions) SetPlacementCutoverNanosFn(fn TimeNanosFn) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPlacementCutoverNanosFn", fn) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetPlacementCutoverNanosFn indicates an expected call of SetPlacementCutoverNanosFn +func (mr *MockOptionsMockRecorder) SetPlacementCutoverNanosFn(fn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPlacementCutoverNanosFn", reflect.TypeOf((*MockOptions)(nil).SetPlacementCutoverNanosFn), fn) +} + +// ShardCutoverNanosFn mocks base method +func (m *MockOptions) ShardCutoverNanosFn() TimeNanosFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardCutoverNanosFn") + ret0, _ := ret[0].(TimeNanosFn) + return ret0 +} + +// ShardCutoverNanosFn indicates an expected call of ShardCutoverNanosFn +func (mr *MockOptionsMockRecorder) ShardCutoverNanosFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardCutoverNanosFn", reflect.TypeOf((*MockOptions)(nil).ShardCutoverNanosFn)) +} + +// SetShardCutoverNanosFn mocks base method +func (m *MockOptions) SetShardCutoverNanosFn(fn TimeNanosFn) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetShardCutoverNanosFn", fn) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetShardCutoverNanosFn indicates an expected call of SetShardCutoverNanosFn +func (mr *MockOptionsMockRecorder) SetShardCutoverNanosFn(fn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetShardCutoverNanosFn", reflect.TypeOf((*MockOptions)(nil).SetShardCutoverNanosFn), fn) +} + +// ShardCutoffNanosFn mocks base method +func (m *MockOptions) ShardCutoffNanosFn() TimeNanosFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardCutoffNanosFn") + ret0, _ := ret[0].(TimeNanosFn) + return ret0 +} + +// ShardCutoffNanosFn indicates an expected call of ShardCutoffNanosFn +func (mr *MockOptionsMockRecorder) ShardCutoffNanosFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardCutoffNanosFn", reflect.TypeOf((*MockOptions)(nil).ShardCutoffNanosFn)) +} + +// SetShardCutoffNanosFn mocks base method +func (m *MockOptions) SetShardCutoffNanosFn(fn TimeNanosFn) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetShardCutoffNanosFn", fn) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetShardCutoffNanosFn indicates an expected call of SetShardCutoffNanosFn +func (mr *MockOptionsMockRecorder) SetShardCutoffNanosFn(fn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetShardCutoffNanosFn", reflect.TypeOf((*MockOptions)(nil).SetShardCutoffNanosFn), fn) +} + +// IsShardCutoverFn mocks base method +func (m *MockOptions) IsShardCutoverFn() ShardValidateFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsShardCutoverFn") + ret0, _ := ret[0].(ShardValidateFn) + return ret0 +} + +// IsShardCutoverFn indicates an expected call of IsShardCutoverFn +func (mr *MockOptionsMockRecorder) IsShardCutoverFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsShardCutoverFn", reflect.TypeOf((*MockOptions)(nil).IsShardCutoverFn)) +} + +// SetIsShardCutoverFn mocks base method +func (m *MockOptions) SetIsShardCutoverFn(fn ShardValidateFn) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIsShardCutoverFn", fn) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIsShardCutoverFn indicates an expected call of SetIsShardCutoverFn +func (mr *MockOptionsMockRecorder) SetIsShardCutoverFn(fn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIsShardCutoverFn", reflect.TypeOf((*MockOptions)(nil).SetIsShardCutoverFn), fn) +} + +// IsShardCutoffFn mocks base method +func (m *MockOptions) IsShardCutoffFn() ShardValidateFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsShardCutoffFn") + ret0, _ := ret[0].(ShardValidateFn) + return ret0 +} + +// IsShardCutoffFn indicates an expected call of IsShardCutoffFn +func (mr *MockOptionsMockRecorder) IsShardCutoffFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsShardCutoffFn", reflect.TypeOf((*MockOptions)(nil).IsShardCutoffFn)) +} + +// SetIsShardCutoffFn mocks base method +func (m *MockOptions) SetIsShardCutoffFn(fn ShardValidateFn) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIsShardCutoffFn", fn) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIsShardCutoffFn indicates an expected call of SetIsShardCutoffFn +func (mr *MockOptionsMockRecorder) SetIsShardCutoffFn(fn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIsShardCutoffFn", reflect.TypeOf((*MockOptions)(nil).SetIsShardCutoffFn), fn) +} + +// ValidateFnBeforeUpdate mocks base method +func (m *MockOptions) ValidateFnBeforeUpdate() ValidateFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValidateFnBeforeUpdate") + ret0, _ := ret[0].(ValidateFn) + return ret0 +} + +// ValidateFnBeforeUpdate indicates an expected call of ValidateFnBeforeUpdate +func (mr *MockOptionsMockRecorder) ValidateFnBeforeUpdate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateFnBeforeUpdate", reflect.TypeOf((*MockOptions)(nil).ValidateFnBeforeUpdate)) +} + +// SetValidateFnBeforeUpdate mocks base method +func (m *MockOptions) SetValidateFnBeforeUpdate(fn ValidateFn) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetValidateFnBeforeUpdate", fn) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetValidateFnBeforeUpdate indicates an expected call of SetValidateFnBeforeUpdate +func (mr *MockOptionsMockRecorder) SetValidateFnBeforeUpdate(fn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetValidateFnBeforeUpdate", reflect.TypeOf((*MockOptions)(nil).SetValidateFnBeforeUpdate), fn) +} + +// NowFn mocks base method +func (m *MockOptions) NowFn() clock.NowFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NowFn") + ret0, _ := ret[0].(clock.NowFn) + return ret0 +} + +// NowFn indicates an expected call of NowFn +func (mr *MockOptionsMockRecorder) NowFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NowFn", reflect.TypeOf((*MockOptions)(nil).NowFn)) +} + +// SetNowFn mocks base method +func (m *MockOptions) SetNowFn(fn clock.NowFn) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetNowFn", fn) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetNowFn indicates an expected call of SetNowFn +func (mr *MockOptionsMockRecorder) SetNowFn(fn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNowFn", reflect.TypeOf((*MockOptions)(nil).SetNowFn), fn) +} + +// MockStorage is a mock of Storage interface +type MockStorage struct { + ctrl *gomock.Controller + recorder *MockStorageMockRecorder +} + +// MockStorageMockRecorder is the mock recorder for MockStorage +type MockStorageMockRecorder struct { + mock *MockStorage +} + +// NewMockStorage creates a new mock instance +func NewMockStorage(ctrl *gomock.Controller) *MockStorage { + mock := &MockStorage{ctrl: ctrl} + mock.recorder = &MockStorageMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockStorage) EXPECT() *MockStorageMockRecorder { + return m.recorder +} + +// Set mocks base method +func (m *MockStorage) Set(p Placement) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Set", p) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Set indicates an expected call of Set +func (mr *MockStorageMockRecorder) Set(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockStorage)(nil).Set), p) +} + +// CheckAndSet mocks base method +func (m *MockStorage) CheckAndSet(p Placement, version int) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckAndSet", p, version) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckAndSet indicates an expected call of CheckAndSet +func (mr *MockStorageMockRecorder) CheckAndSet(p, version interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckAndSet", reflect.TypeOf((*MockStorage)(nil).CheckAndSet), p, version) +} + +// SetIfNotExist mocks base method +func (m *MockStorage) SetIfNotExist(p Placement) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIfNotExist", p) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetIfNotExist indicates an expected call of SetIfNotExist +func (mr *MockStorageMockRecorder) SetIfNotExist(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIfNotExist", reflect.TypeOf((*MockStorage)(nil).SetIfNotExist), p) +} + +// Placement mocks base method +func (m *MockStorage) Placement() (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Placement") + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Placement indicates an expected call of Placement +func (mr *MockStorageMockRecorder) Placement() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Placement", reflect.TypeOf((*MockStorage)(nil).Placement)) +} + +// Watch mocks base method +func (m *MockStorage) Watch() (Watch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch") + ret0, _ := ret[0].(Watch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Watch indicates an expected call of Watch +func (mr *MockStorageMockRecorder) Watch() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockStorage)(nil).Watch)) +} + +// Delete mocks base method +func (m *MockStorage) Delete() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete") + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete +func (mr *MockStorageMockRecorder) Delete() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockStorage)(nil).Delete)) +} + +// SetProto mocks base method +func (m *MockStorage) SetProto(p proto.Message) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetProto", p) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetProto indicates an expected call of SetProto +func (mr *MockStorageMockRecorder) SetProto(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetProto", reflect.TypeOf((*MockStorage)(nil).SetProto), p) +} + +// CheckAndSetProto mocks base method +func (m *MockStorage) CheckAndSetProto(p proto.Message, version int) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckAndSetProto", p, version) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckAndSetProto indicates an expected call of CheckAndSetProto +func (mr *MockStorageMockRecorder) CheckAndSetProto(p, version interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckAndSetProto", reflect.TypeOf((*MockStorage)(nil).CheckAndSetProto), p, version) +} + +// Proto mocks base method +func (m *MockStorage) Proto() (proto.Message, int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Proto") + ret0, _ := ret[0].(proto.Message) + ret1, _ := ret[1].(int) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Proto indicates an expected call of Proto +func (mr *MockStorageMockRecorder) Proto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Proto", reflect.TypeOf((*MockStorage)(nil).Proto)) +} + +// PlacementForVersion mocks base method +func (m *MockStorage) PlacementForVersion(version int) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PlacementForVersion", version) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PlacementForVersion indicates an expected call of PlacementForVersion +func (mr *MockStorageMockRecorder) PlacementForVersion(version interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PlacementForVersion", reflect.TypeOf((*MockStorage)(nil).PlacementForVersion), version) +} + +// MockService is a mock of Service interface +type MockService struct { + ctrl *gomock.Controller + recorder *MockServiceMockRecorder +} + +// MockServiceMockRecorder is the mock recorder for MockService +type MockServiceMockRecorder struct { + mock *MockService +} + +// NewMockService creates a new mock instance +func NewMockService(ctrl *gomock.Controller) *MockService { + mock := &MockService{ctrl: ctrl} + mock.recorder = &MockServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockService) EXPECT() *MockServiceMockRecorder { + return m.recorder +} + +// Set mocks base method +func (m *MockService) Set(p Placement) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Set", p) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Set indicates an expected call of Set +func (mr *MockServiceMockRecorder) Set(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockService)(nil).Set), p) +} + +// CheckAndSet mocks base method +func (m *MockService) CheckAndSet(p Placement, version int) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckAndSet", p, version) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckAndSet indicates an expected call of CheckAndSet +func (mr *MockServiceMockRecorder) CheckAndSet(p, version interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckAndSet", reflect.TypeOf((*MockService)(nil).CheckAndSet), p, version) +} + +// SetIfNotExist mocks base method +func (m *MockService) SetIfNotExist(p Placement) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIfNotExist", p) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetIfNotExist indicates an expected call of SetIfNotExist +func (mr *MockServiceMockRecorder) SetIfNotExist(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIfNotExist", reflect.TypeOf((*MockService)(nil).SetIfNotExist), p) +} + +// Placement mocks base method +func (m *MockService) Placement() (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Placement") + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Placement indicates an expected call of Placement +func (mr *MockServiceMockRecorder) Placement() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Placement", reflect.TypeOf((*MockService)(nil).Placement)) +} + +// Watch mocks base method +func (m *MockService) Watch() (Watch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch") + ret0, _ := ret[0].(Watch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Watch indicates an expected call of Watch +func (mr *MockServiceMockRecorder) Watch() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockService)(nil).Watch)) +} + +// Delete mocks base method +func (m *MockService) Delete() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete") + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete +func (mr *MockServiceMockRecorder) Delete() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockService)(nil).Delete)) +} + +// SetProto mocks base method +func (m *MockService) SetProto(p proto.Message) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetProto", p) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetProto indicates an expected call of SetProto +func (mr *MockServiceMockRecorder) SetProto(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetProto", reflect.TypeOf((*MockService)(nil).SetProto), p) +} + +// CheckAndSetProto mocks base method +func (m *MockService) CheckAndSetProto(p proto.Message, version int) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckAndSetProto", p, version) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckAndSetProto indicates an expected call of CheckAndSetProto +func (mr *MockServiceMockRecorder) CheckAndSetProto(p, version interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckAndSetProto", reflect.TypeOf((*MockService)(nil).CheckAndSetProto), p, version) +} + +// Proto mocks base method +func (m *MockService) Proto() (proto.Message, int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Proto") + ret0, _ := ret[0].(proto.Message) + ret1, _ := ret[1].(int) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Proto indicates an expected call of Proto +func (mr *MockServiceMockRecorder) Proto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Proto", reflect.TypeOf((*MockService)(nil).Proto)) +} + +// PlacementForVersion mocks base method +func (m *MockService) PlacementForVersion(version int) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PlacementForVersion", version) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PlacementForVersion indicates an expected call of PlacementForVersion +func (mr *MockServiceMockRecorder) PlacementForVersion(version interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PlacementForVersion", reflect.TypeOf((*MockService)(nil).PlacementForVersion), version) +} + +// BuildInitialPlacement mocks base method +func (m *MockService) BuildInitialPlacement(instances []Instance, numShards, rf int) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BuildInitialPlacement", instances, numShards, rf) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BuildInitialPlacement indicates an expected call of BuildInitialPlacement +func (mr *MockServiceMockRecorder) BuildInitialPlacement(instances, numShards, rf interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BuildInitialPlacement", reflect.TypeOf((*MockService)(nil).BuildInitialPlacement), instances, numShards, rf) +} + +// AddReplica mocks base method +func (m *MockService) AddReplica() (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddReplica") + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddReplica indicates an expected call of AddReplica +func (mr *MockServiceMockRecorder) AddReplica() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddReplica", reflect.TypeOf((*MockService)(nil).AddReplica)) +} + +// AddInstances mocks base method +func (m *MockService) AddInstances(candidates []Instance) (Placement, []Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddInstances", candidates) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].([]Instance) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// AddInstances indicates an expected call of AddInstances +func (mr *MockServiceMockRecorder) AddInstances(candidates interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddInstances", reflect.TypeOf((*MockService)(nil).AddInstances), candidates) +} + +// RemoveInstances mocks base method +func (m *MockService) RemoveInstances(leavingInstanceIDs []string) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveInstances", leavingInstanceIDs) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemoveInstances indicates an expected call of RemoveInstances +func (mr *MockServiceMockRecorder) RemoveInstances(leavingInstanceIDs interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveInstances", reflect.TypeOf((*MockService)(nil).RemoveInstances), leavingInstanceIDs) +} + +// ReplaceInstances mocks base method +func (m *MockService) ReplaceInstances(leavingInstanceIDs []string, candidates []Instance) (Placement, []Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReplaceInstances", leavingInstanceIDs, candidates) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].([]Instance) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ReplaceInstances indicates an expected call of ReplaceInstances +func (mr *MockServiceMockRecorder) ReplaceInstances(leavingInstanceIDs, candidates interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReplaceInstances", reflect.TypeOf((*MockService)(nil).ReplaceInstances), leavingInstanceIDs, candidates) +} + +// MarkShardsAvailable mocks base method +func (m *MockService) MarkShardsAvailable(instanceID string, shardIDs ...uint32) (Placement, error) { + m.ctrl.T.Helper() + varargs := []interface{}{instanceID} + for _, a := range shardIDs { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "MarkShardsAvailable", varargs...) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarkShardsAvailable indicates an expected call of MarkShardsAvailable +func (mr *MockServiceMockRecorder) MarkShardsAvailable(instanceID interface{}, shardIDs ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{instanceID}, shardIDs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkShardsAvailable", reflect.TypeOf((*MockService)(nil).MarkShardsAvailable), varargs...) +} + +// MarkInstanceAvailable mocks base method +func (m *MockService) MarkInstanceAvailable(instanceID string) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarkInstanceAvailable", instanceID) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarkInstanceAvailable indicates an expected call of MarkInstanceAvailable +func (mr *MockServiceMockRecorder) MarkInstanceAvailable(instanceID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkInstanceAvailable", reflect.TypeOf((*MockService)(nil).MarkInstanceAvailable), instanceID) +} + +// MarkAllShardsAvailable mocks base method +func (m *MockService) MarkAllShardsAvailable() (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarkAllShardsAvailable") + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarkAllShardsAvailable indicates an expected call of MarkAllShardsAvailable +func (mr *MockServiceMockRecorder) MarkAllShardsAvailable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkAllShardsAvailable", reflect.TypeOf((*MockService)(nil).MarkAllShardsAvailable)) +} + +// MockOperator is a mock of Operator interface +type MockOperator struct { + ctrl *gomock.Controller + recorder *MockOperatorMockRecorder +} + +// MockOperatorMockRecorder is the mock recorder for MockOperator +type MockOperatorMockRecorder struct { + mock *MockOperator +} + +// NewMockOperator creates a new mock instance +func NewMockOperator(ctrl *gomock.Controller) *MockOperator { + mock := &MockOperator{ctrl: ctrl} + mock.recorder = &MockOperatorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOperator) EXPECT() *MockOperatorMockRecorder { + return m.recorder +} + +// BuildInitialPlacement mocks base method +func (m *MockOperator) BuildInitialPlacement(instances []Instance, numShards, rf int) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BuildInitialPlacement", instances, numShards, rf) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BuildInitialPlacement indicates an expected call of BuildInitialPlacement +func (mr *MockOperatorMockRecorder) BuildInitialPlacement(instances, numShards, rf interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BuildInitialPlacement", reflect.TypeOf((*MockOperator)(nil).BuildInitialPlacement), instances, numShards, rf) +} + +// AddReplica mocks base method +func (m *MockOperator) AddReplica() (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddReplica") + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddReplica indicates an expected call of AddReplica +func (mr *MockOperatorMockRecorder) AddReplica() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddReplica", reflect.TypeOf((*MockOperator)(nil).AddReplica)) +} + +// AddInstances mocks base method +func (m *MockOperator) AddInstances(candidates []Instance) (Placement, []Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddInstances", candidates) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].([]Instance) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// AddInstances indicates an expected call of AddInstances +func (mr *MockOperatorMockRecorder) AddInstances(candidates interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddInstances", reflect.TypeOf((*MockOperator)(nil).AddInstances), candidates) +} + +// RemoveInstances mocks base method +func (m *MockOperator) RemoveInstances(leavingInstanceIDs []string) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveInstances", leavingInstanceIDs) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemoveInstances indicates an expected call of RemoveInstances +func (mr *MockOperatorMockRecorder) RemoveInstances(leavingInstanceIDs interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveInstances", reflect.TypeOf((*MockOperator)(nil).RemoveInstances), leavingInstanceIDs) +} + +// ReplaceInstances mocks base method +func (m *MockOperator) ReplaceInstances(leavingInstanceIDs []string, candidates []Instance) (Placement, []Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReplaceInstances", leavingInstanceIDs, candidates) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].([]Instance) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ReplaceInstances indicates an expected call of ReplaceInstances +func (mr *MockOperatorMockRecorder) ReplaceInstances(leavingInstanceIDs, candidates interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReplaceInstances", reflect.TypeOf((*MockOperator)(nil).ReplaceInstances), leavingInstanceIDs, candidates) +} + +// MarkShardsAvailable mocks base method +func (m *MockOperator) MarkShardsAvailable(instanceID string, shardIDs ...uint32) (Placement, error) { + m.ctrl.T.Helper() + varargs := []interface{}{instanceID} + for _, a := range shardIDs { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "MarkShardsAvailable", varargs...) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarkShardsAvailable indicates an expected call of MarkShardsAvailable +func (mr *MockOperatorMockRecorder) MarkShardsAvailable(instanceID interface{}, shardIDs ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{instanceID}, shardIDs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkShardsAvailable", reflect.TypeOf((*MockOperator)(nil).MarkShardsAvailable), varargs...) +} + +// MarkInstanceAvailable mocks base method +func (m *MockOperator) MarkInstanceAvailable(instanceID string) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarkInstanceAvailable", instanceID) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarkInstanceAvailable indicates an expected call of MarkInstanceAvailable +func (mr *MockOperatorMockRecorder) MarkInstanceAvailable(instanceID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkInstanceAvailable", reflect.TypeOf((*MockOperator)(nil).MarkInstanceAvailable), instanceID) +} + +// MarkAllShardsAvailable mocks base method +func (m *MockOperator) MarkAllShardsAvailable() (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarkAllShardsAvailable") + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarkAllShardsAvailable indicates an expected call of MarkAllShardsAvailable +func (mr *MockOperatorMockRecorder) MarkAllShardsAvailable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkAllShardsAvailable", reflect.TypeOf((*MockOperator)(nil).MarkAllShardsAvailable)) +} + +// Placement mocks base method +func (m *MockOperator) Placement() Placement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Placement") + ret0, _ := ret[0].(Placement) + return ret0 +} + +// Placement indicates an expected call of Placement +func (mr *MockOperatorMockRecorder) Placement() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Placement", reflect.TypeOf((*MockOperator)(nil).Placement)) +} + +// Mockoperations is a mock of operations interface +type Mockoperations struct { + ctrl *gomock.Controller + recorder *MockoperationsMockRecorder +} + +// MockoperationsMockRecorder is the mock recorder for Mockoperations +type MockoperationsMockRecorder struct { + mock *Mockoperations +} + +// NewMockoperations creates a new mock instance +func NewMockoperations(ctrl *gomock.Controller) *Mockoperations { + mock := &Mockoperations{ctrl: ctrl} + mock.recorder = &MockoperationsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *Mockoperations) EXPECT() *MockoperationsMockRecorder { + return m.recorder +} + +// BuildInitialPlacement mocks base method +func (m *Mockoperations) BuildInitialPlacement(instances []Instance, numShards, rf int) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BuildInitialPlacement", instances, numShards, rf) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BuildInitialPlacement indicates an expected call of BuildInitialPlacement +func (mr *MockoperationsMockRecorder) BuildInitialPlacement(instances, numShards, rf interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BuildInitialPlacement", reflect.TypeOf((*Mockoperations)(nil).BuildInitialPlacement), instances, numShards, rf) +} + +// AddReplica mocks base method +func (m *Mockoperations) AddReplica() (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddReplica") + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddReplica indicates an expected call of AddReplica +func (mr *MockoperationsMockRecorder) AddReplica() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddReplica", reflect.TypeOf((*Mockoperations)(nil).AddReplica)) +} + +// AddInstances mocks base method +func (m *Mockoperations) AddInstances(candidates []Instance) (Placement, []Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddInstances", candidates) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].([]Instance) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// AddInstances indicates an expected call of AddInstances +func (mr *MockoperationsMockRecorder) AddInstances(candidates interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddInstances", reflect.TypeOf((*Mockoperations)(nil).AddInstances), candidates) +} + +// RemoveInstances mocks base method +func (m *Mockoperations) RemoveInstances(leavingInstanceIDs []string) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveInstances", leavingInstanceIDs) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemoveInstances indicates an expected call of RemoveInstances +func (mr *MockoperationsMockRecorder) RemoveInstances(leavingInstanceIDs interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveInstances", reflect.TypeOf((*Mockoperations)(nil).RemoveInstances), leavingInstanceIDs) +} + +// ReplaceInstances mocks base method +func (m *Mockoperations) ReplaceInstances(leavingInstanceIDs []string, candidates []Instance) (Placement, []Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReplaceInstances", leavingInstanceIDs, candidates) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].([]Instance) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ReplaceInstances indicates an expected call of ReplaceInstances +func (mr *MockoperationsMockRecorder) ReplaceInstances(leavingInstanceIDs, candidates interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReplaceInstances", reflect.TypeOf((*Mockoperations)(nil).ReplaceInstances), leavingInstanceIDs, candidates) +} + +// MarkShardsAvailable mocks base method +func (m *Mockoperations) MarkShardsAvailable(instanceID string, shardIDs ...uint32) (Placement, error) { + m.ctrl.T.Helper() + varargs := []interface{}{instanceID} + for _, a := range shardIDs { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "MarkShardsAvailable", varargs...) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarkShardsAvailable indicates an expected call of MarkShardsAvailable +func (mr *MockoperationsMockRecorder) MarkShardsAvailable(instanceID interface{}, shardIDs ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{instanceID}, shardIDs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkShardsAvailable", reflect.TypeOf((*Mockoperations)(nil).MarkShardsAvailable), varargs...) +} + +// MarkInstanceAvailable mocks base method +func (m *Mockoperations) MarkInstanceAvailable(instanceID string) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarkInstanceAvailable", instanceID) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarkInstanceAvailable indicates an expected call of MarkInstanceAvailable +func (mr *MockoperationsMockRecorder) MarkInstanceAvailable(instanceID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkInstanceAvailable", reflect.TypeOf((*Mockoperations)(nil).MarkInstanceAvailable), instanceID) +} + +// MarkAllShardsAvailable mocks base method +func (m *Mockoperations) MarkAllShardsAvailable() (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarkAllShardsAvailable") + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarkAllShardsAvailable indicates an expected call of MarkAllShardsAvailable +func (mr *MockoperationsMockRecorder) MarkAllShardsAvailable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkAllShardsAvailable", reflect.TypeOf((*Mockoperations)(nil).MarkAllShardsAvailable)) +} + +// MockAlgorithm is a mock of Algorithm interface +type MockAlgorithm struct { + ctrl *gomock.Controller + recorder *MockAlgorithmMockRecorder +} + +// MockAlgorithmMockRecorder is the mock recorder for MockAlgorithm +type MockAlgorithmMockRecorder struct { + mock *MockAlgorithm +} + +// NewMockAlgorithm creates a new mock instance +func NewMockAlgorithm(ctrl *gomock.Controller) *MockAlgorithm { + mock := &MockAlgorithm{ctrl: ctrl} + mock.recorder = &MockAlgorithmMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAlgorithm) EXPECT() *MockAlgorithmMockRecorder { + return m.recorder +} + +// InitialPlacement mocks base method +func (m *MockAlgorithm) InitialPlacement(instances []Instance, shards []uint32, rf int) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InitialPlacement", instances, shards, rf) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// InitialPlacement indicates an expected call of InitialPlacement +func (mr *MockAlgorithmMockRecorder) InitialPlacement(instances, shards, rf interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitialPlacement", reflect.TypeOf((*MockAlgorithm)(nil).InitialPlacement), instances, shards, rf) +} + +// AddReplica mocks base method +func (m *MockAlgorithm) AddReplica(p Placement) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddReplica", p) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddReplica indicates an expected call of AddReplica +func (mr *MockAlgorithmMockRecorder) AddReplica(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddReplica", reflect.TypeOf((*MockAlgorithm)(nil).AddReplica), p) +} + +// AddInstances mocks base method +func (m *MockAlgorithm) AddInstances(p Placement, instances []Instance) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddInstances", p, instances) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddInstances indicates an expected call of AddInstances +func (mr *MockAlgorithmMockRecorder) AddInstances(p, instances interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddInstances", reflect.TypeOf((*MockAlgorithm)(nil).AddInstances), p, instances) +} + +// RemoveInstances mocks base method +func (m *MockAlgorithm) RemoveInstances(p Placement, leavingInstanceIDs []string) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveInstances", p, leavingInstanceIDs) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemoveInstances indicates an expected call of RemoveInstances +func (mr *MockAlgorithmMockRecorder) RemoveInstances(p, leavingInstanceIDs interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveInstances", reflect.TypeOf((*MockAlgorithm)(nil).RemoveInstances), p, leavingInstanceIDs) +} + +// ReplaceInstances mocks base method +func (m *MockAlgorithm) ReplaceInstances(p Placement, leavingInstanecIDs []string, addingInstances []Instance) (Placement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReplaceInstances", p, leavingInstanecIDs, addingInstances) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReplaceInstances indicates an expected call of ReplaceInstances +func (mr *MockAlgorithmMockRecorder) ReplaceInstances(p, leavingInstanecIDs, addingInstances interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReplaceInstances", reflect.TypeOf((*MockAlgorithm)(nil).ReplaceInstances), p, leavingInstanecIDs, addingInstances) +} + +// IsCompatibleWith mocks base method +func (m *MockAlgorithm) IsCompatibleWith(p Placement) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsCompatibleWith", p) + ret0, _ := ret[0].(error) + return ret0 +} + +// IsCompatibleWith indicates an expected call of IsCompatibleWith +func (mr *MockAlgorithmMockRecorder) IsCompatibleWith(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsCompatibleWith", reflect.TypeOf((*MockAlgorithm)(nil).IsCompatibleWith), p) +} + +// MarkShardsAvailable mocks base method +func (m *MockAlgorithm) MarkShardsAvailable(p Placement, instanceID string, shardIDs ...uint32) (Placement, error) { + m.ctrl.T.Helper() + varargs := []interface{}{p, instanceID} + for _, a := range shardIDs { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "MarkShardsAvailable", varargs...) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarkShardsAvailable indicates an expected call of MarkShardsAvailable +func (mr *MockAlgorithmMockRecorder) MarkShardsAvailable(p, instanceID interface{}, shardIDs ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{p, instanceID}, shardIDs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkShardsAvailable", reflect.TypeOf((*MockAlgorithm)(nil).MarkShardsAvailable), varargs...) +} + +// MarkAllShardsAvailable mocks base method +func (m *MockAlgorithm) MarkAllShardsAvailable(p Placement) (Placement, bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarkAllShardsAvailable", p) + ret0, _ := ret[0].(Placement) + ret1, _ := ret[1].(bool) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// MarkAllShardsAvailable indicates an expected call of MarkAllShardsAvailable +func (mr *MockAlgorithmMockRecorder) MarkAllShardsAvailable(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkAllShardsAvailable", reflect.TypeOf((*MockAlgorithm)(nil).MarkAllShardsAvailable), p) +} + +// MockInstanceSelector is a mock of InstanceSelector interface +type MockInstanceSelector struct { + ctrl *gomock.Controller + recorder *MockInstanceSelectorMockRecorder +} + +// MockInstanceSelectorMockRecorder is the mock recorder for MockInstanceSelector +type MockInstanceSelectorMockRecorder struct { + mock *MockInstanceSelector +} + +// NewMockInstanceSelector creates a new mock instance +func NewMockInstanceSelector(ctrl *gomock.Controller) *MockInstanceSelector { + mock := &MockInstanceSelector{ctrl: ctrl} + mock.recorder = &MockInstanceSelectorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockInstanceSelector) EXPECT() *MockInstanceSelectorMockRecorder { + return m.recorder +} + +// SelectInitialInstances mocks base method +func (m *MockInstanceSelector) SelectInitialInstances(candidates []Instance, rf int) ([]Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SelectInitialInstances", candidates, rf) + ret0, _ := ret[0].([]Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SelectInitialInstances indicates an expected call of SelectInitialInstances +func (mr *MockInstanceSelectorMockRecorder) SelectInitialInstances(candidates, rf interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SelectInitialInstances", reflect.TypeOf((*MockInstanceSelector)(nil).SelectInitialInstances), candidates, rf) +} + +// SelectAddingInstances mocks base method +func (m *MockInstanceSelector) SelectAddingInstances(candidates []Instance, p Placement) ([]Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SelectAddingInstances", candidates, p) + ret0, _ := ret[0].([]Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SelectAddingInstances indicates an expected call of SelectAddingInstances +func (mr *MockInstanceSelectorMockRecorder) SelectAddingInstances(candidates, p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SelectAddingInstances", reflect.TypeOf((*MockInstanceSelector)(nil).SelectAddingInstances), candidates, p) +} + +// SelectReplaceInstances mocks base method +func (m *MockInstanceSelector) SelectReplaceInstances(candidates []Instance, leavingInstanceIDs []string, p Placement) ([]Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SelectReplaceInstances", candidates, leavingInstanceIDs, p) + ret0, _ := ret[0].([]Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SelectReplaceInstances indicates an expected call of SelectReplaceInstances +func (mr *MockInstanceSelectorMockRecorder) SelectReplaceInstances(candidates, leavingInstanceIDs, p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SelectReplaceInstances", reflect.TypeOf((*MockInstanceSelector)(nil).SelectReplaceInstances), candidates, leavingInstanceIDs, p) +} + +// MockDeploymentPlanner is a mock of DeploymentPlanner interface +type MockDeploymentPlanner struct { + ctrl *gomock.Controller + recorder *MockDeploymentPlannerMockRecorder +} + +// MockDeploymentPlannerMockRecorder is the mock recorder for MockDeploymentPlanner +type MockDeploymentPlannerMockRecorder struct { + mock *MockDeploymentPlanner +} + +// NewMockDeploymentPlanner creates a new mock instance +func NewMockDeploymentPlanner(ctrl *gomock.Controller) *MockDeploymentPlanner { + mock := &MockDeploymentPlanner{ctrl: ctrl} + mock.recorder = &MockDeploymentPlannerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDeploymentPlanner) EXPECT() *MockDeploymentPlannerMockRecorder { + return m.recorder +} + +// DeploymentSteps mocks base method +func (m *MockDeploymentPlanner) DeploymentSteps(p Placement) [][]Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeploymentSteps", p) + ret0, _ := ret[0].([][]Instance) + return ret0 +} + +// DeploymentSteps indicates an expected call of DeploymentSteps +func (mr *MockDeploymentPlannerMockRecorder) DeploymentSteps(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeploymentSteps", reflect.TypeOf((*MockDeploymentPlanner)(nil).DeploymentSteps), p) +} + +// MockDeploymentOptions is a mock of DeploymentOptions interface +type MockDeploymentOptions struct { + ctrl *gomock.Controller + recorder *MockDeploymentOptionsMockRecorder +} + +// MockDeploymentOptionsMockRecorder is the mock recorder for MockDeploymentOptions +type MockDeploymentOptionsMockRecorder struct { + mock *MockDeploymentOptions +} + +// NewMockDeploymentOptions creates a new mock instance +func NewMockDeploymentOptions(ctrl *gomock.Controller) *MockDeploymentOptions { + mock := &MockDeploymentOptions{ctrl: ctrl} + mock.recorder = &MockDeploymentOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDeploymentOptions) EXPECT() *MockDeploymentOptionsMockRecorder { + return m.recorder +} + +// MaxStepSize mocks base method +func (m *MockDeploymentOptions) MaxStepSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MaxStepSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// MaxStepSize indicates an expected call of MaxStepSize +func (mr *MockDeploymentOptionsMockRecorder) MaxStepSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MaxStepSize", reflect.TypeOf((*MockDeploymentOptions)(nil).MaxStepSize)) +} + +// SetMaxStepSize mocks base method +func (m *MockDeploymentOptions) SetMaxStepSize(stepSize int) DeploymentOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMaxStepSize", stepSize) + ret0, _ := ret[0].(DeploymentOptions) + return ret0 +} + +// SetMaxStepSize indicates an expected call of SetMaxStepSize +func (mr *MockDeploymentOptionsMockRecorder) SetMaxStepSize(stepSize interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMaxStepSize", reflect.TypeOf((*MockDeploymentOptions)(nil).SetMaxStepSize), stepSize) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/selector/common.go b/vendor/github.com/m3db/m3/src/cluster/placement/selector/common.go new file mode 100644 index 00000000..8f923b43 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/selector/common.go @@ -0,0 +1,87 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package selector + +import ( + "errors" + + "github.com/m3db/m3/src/cluster/placement" +) + +var ( + errNoValidCandidateInstance = errors.New("no new instances found in the valid zone") +) + +// getValidCandidates finds the instances that are not already in +// the placement and in the valid zone. +func getValidCandidates( + p placement.Placement, + candidates []placement.Instance, + opts placement.Options, +) ([]placement.Instance, error) { + var instances = make([]placement.Instance, 0, len(candidates)) + for _, instance := range candidates { + instanceInPlacement, exist := p.Instance(instance.ID()) + if !exist { + instances = append(instances, instance) + continue + } + if instanceInPlacement.IsLeaving() { + instances = append(instances, instanceInPlacement) + } + } + + instances = filterZones(p, instances, opts) + if len(instances) == 0 { + return nil, errNoValidCandidateInstance + } + + return instances, nil +} + +func filterZones( + p placement.Placement, + candidates []placement.Instance, + opts placement.Options, +) []placement.Instance { + if len(candidates) == 0 { + return []placement.Instance{} + } + + var validZone string + if opts != nil { + validZone = opts.ValidZone() + if opts.AllowAllZones() { + return candidates + } + } + if validZone == "" && len(p.Instances()) > 0 { + validZone = p.Instances()[0].Zone() + } + + validInstances := make([]placement.Instance, 0, len(candidates)) + for _, instance := range candidates { + if validZone == instance.Zone() { + validInstances = append(validInstances, instance) + } + } + return validInstances +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/selector/mirrored.go b/vendor/github.com/m3db/m3/src/cluster/placement/selector/mirrored.go new file mode 100644 index 00000000..a89eee35 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/selector/mirrored.go @@ -0,0 +1,547 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package selector + +import ( + "container/heap" + "errors" + "fmt" + "math" + + "github.com/m3db/m3/src/cluster/placement" + + "go.uber.org/zap" +) + +var ( + errNoValidMirrorInstance = errors.New("no valid instance for mirror placement in the candidate list") +) + +// mirroredPortSelector groups instances by their port--see NewPortMirroredSelector for details. +type mirroredPortSelector struct { + opts placement.Options + logger *zap.Logger +} + +// NewPortMirroredSelector returns a placement.InstanceSelector which creates groups of instances +// by their port number and assigns a shardset to each group, taking isolation groups into account +// while creating groups. This is the default behavior used by NewInstanceSelector if IsMirrored +// is true. +func NewPortMirroredSelector(opts placement.Options) placement.InstanceSelector { + return &mirroredPortSelector{ + opts: opts, + logger: opts.InstrumentOptions().Logger(), + } +} + +// SelectInitialInstances tries to make as many groups as possible from +// the candidate instances to make the initial placement. +func (f *mirroredPortSelector) SelectInitialInstances( + candidates []placement.Instance, + rf int, +) ([]placement.Instance, error) { + candidates, err := getValidCandidates( + placement.NewPlacement(), + candidates, + f.opts, + ) + if err != nil { + return nil, err + } + + weightToHostMap, err := groupHostsByWeight(candidates) + if err != nil { + return nil, err + } + + var groups = make([][]placement.Instance, 0, len(candidates)) + for _, hosts := range weightToHostMap { + groupedHosts, ungrouped := groupHostsWithIsolationGroupCheck(hosts, rf) + if len(ungrouped) != 0 { + for _, host := range ungrouped { + f.logger.Warn("could not group", + zap.String("host", host.name), + zap.String("isolationGroup", host.isolationGroup), + zap.Uint32("weight", host.weight)) + } + } + if len(groupedHosts) == 0 { + continue + } + + groupedInstances, err := groupInstancesByHostPort(groupedHosts) + if err != nil { + return nil, err + } + + groups = append(groups, groupedInstances...) + } + + if len(groups) == 0 { + return nil, errNoValidMirrorInstance + } + + return assignShardsetsToGroupedInstances(groups, placement.NewPlacement()), nil +} + +// SelectAddingInstances tries to make just one group of hosts from +// the candidate instances to be added to the placement. +func (f *mirroredPortSelector) SelectAddingInstances( + candidates []placement.Instance, + p placement.Placement, +) ([]placement.Instance, error) { + candidates, err := getValidCandidates(p, candidates, f.opts) + if err != nil { + return nil, err + } + + weightToHostMap, err := groupHostsByWeight(candidates) + if err != nil { + return nil, err + } + + var groups = make([][]placement.Instance, 0, len(candidates)) + for _, hosts := range weightToHostMap { + groupedHosts, _ := groupHostsWithIsolationGroupCheck(hosts, p.ReplicaFactor()) + if len(groupedHosts) == 0 { + continue + } + + if !f.opts.AddAllCandidates() { + // When AddAllCandidates option is disabled, we will only add + // one pair of hosts into the placement. + groups, err = groupInstancesByHostPort(groupedHosts[:1]) + if err != nil { + return nil, err + } + + break + } + + newGroups, err := groupInstancesByHostPort(groupedHosts) + if err != nil { + return nil, err + } + groups = append(groups, newGroups...) + } + + if len(groups) == 0 { + return nil, errNoValidMirrorInstance + } + + return assignShardsetsToGroupedInstances(groups, p), nil +} + +// SelectReplaceInstances for mirror supports replacing multiple instances from one host. +// Two main use cases: +// 1, find a new host from a pool of hosts to replace a host in the placement. +// 2, back out of a replacement, both leaving and adding host are still in the placement. +func (f *mirroredPortSelector) SelectReplaceInstances( + candidates []placement.Instance, + leavingInstanceIDs []string, + p placement.Placement, +) ([]placement.Instance, error) { + candidates, err := getValidCandidates(p, candidates, f.opts) + if err != nil { + return nil, err + } + + leavingInstances, err := getLeavingInstances(p, leavingInstanceIDs) + if err != nil { + return nil, err + } + + // Validate leaving instances. + var ( + h host + ssIDs = make(map[uint32]struct{}, len(leavingInstances)) + ) + for _, instance := range leavingInstances { + if h.name == "" { + h = newHost(instance.Hostname(), instance.IsolationGroup(), instance.Weight()) + } + + err := h.addInstance(instance.Port(), instance) + if err != nil { + return nil, err + } + ssIDs[instance.ShardSetID()] = struct{}{} + } + + weightToHostMap, err := groupHostsByWeight(candidates) + if err != nil { + return nil, err + } + + hosts, ok := weightToHostMap[h.weight] + if !ok { + return nil, fmt.Errorf("could not find instances with weight %d in the candidate list", h.weight) + } + + // Find out the isolation groups that are already in the same shard set id with the leaving instances. + var conflictIGs = make(map[string]struct{}) + for _, instance := range p.Instances() { + if _, ok := ssIDs[instance.ShardSetID()]; !ok { + continue + } + if instance.Hostname() == h.name { + continue + } + if instance.IsLeaving() { + continue + } + + conflictIGs[instance.IsolationGroup()] = struct{}{} + } + + var replacementGroups []mirroredReplacementGroup + for _, candidateHost := range hosts { + if candidateHost.name == h.name { + continue + } + + if _, ok := conflictIGs[candidateHost.isolationGroup]; ok { + continue + } + + groups, err := groupInstancesByHostPort([][]host{[]host{h, candidateHost}}) + if err != nil { + f.logger.Warn("could not match up candidate host with target host", + zap.String("candidate", candidateHost.name), + zap.String("target", h.name), + zap.Error(err)) + continue + } + + for _, group := range groups { + if len(group) != 2 { + return nil, fmt.Errorf( + "unexpected length of instance group for replacement: %d", + len(group), + ) + } + + replacementGroup := mirroredReplacementGroup{} + + // search for leaving + replacement in the group (don't assume anything about the order) + for _, inst := range group { + if inst.Hostname() == h.name { + replacementGroup.Leaving = inst + } else if inst.Hostname() == candidateHost.name { + replacementGroup.Replacement = inst + } + } + if replacementGroup.Replacement == nil { + return nil, fmt.Errorf( + "programming error: failed to find replacement instance for host %s in group", + candidateHost.name, + ) + } + if replacementGroup.Leaving == nil { + return nil, fmt.Errorf( + "programming error: failed to find leaving instance for host %s in group", + h.name, + ) + } + + replacementGroups = append( + replacementGroups, + replacementGroup, + ) + } + + // Successfully grouped candidate with the host in placement. + break + } + + if len(replacementGroups) == 0 { + return nil, errNoValidMirrorInstance + } + + return assignShardsetIDsToReplacements(leavingInstanceIDs, replacementGroups) +} + +// assignShardsetIDsToReplacements assigns the shardset of each leaving instance to each replacement +// instance. The output is ordered in the order of leavingInstanceIDs. +func assignShardsetIDsToReplacements( + leavingInstanceIDs []string, + groups []mirroredReplacementGroup, +) ([]placement.Instance, error) { + if len(groups) != len(leavingInstanceIDs) { + return nil, fmt.Errorf( + "failed to find %d replacement instances to replace %d leaving instances", + len(groups), len(leavingInstanceIDs), + ) + } + // The groups returned from the groupInstances() might not be the same order as + // the instances in leavingInstanceIDs. We need to reorder them to the same order + // as leavingInstanceIDs. + var res = make([]placement.Instance, len(groups)) + for _, group := range groups { + idx := findIndex(leavingInstanceIDs, group.Leaving.ID()) + if idx == -1 { + return nil, fmt.Errorf( + "could not find instance id: '%s' in leaving instances", group.Leaving.ID()) + } + + res[idx] = group.Replacement.SetShardSetID(group.Leaving.ShardSetID()) + } + return res, nil +} + +func getLeavingInstances( + p placement.Placement, + leavingInstanceIDs []string, +) ([]placement.Instance, error) { + leavingInstances := make([]placement.Instance, 0, len(leavingInstanceIDs)) + for _, id := range leavingInstanceIDs { + leavingInstance, exist := p.Instance(id) + if !exist { + return nil, errInstanceAbsent + } + leavingInstances = append(leavingInstances, leavingInstance) + } + return leavingInstances, nil +} + +func findIndex(ids []string, id string) int { + for i := range ids { + if ids[i] == id { + return i + } + } + // Unexpected. + return -1 +} + +func groupHostsByWeight(candidates []placement.Instance) (map[uint32][]host, error) { + var ( + uniqueHosts = make(map[string]host, len(candidates)) + weightToHostsMap = make(map[uint32][]host, len(candidates)) + ) + for _, instance := range candidates { + hostname := instance.Hostname() + weight := instance.Weight() + h, ok := uniqueHosts[hostname] + if !ok { + h = newHost(hostname, instance.IsolationGroup(), weight) + uniqueHosts[hostname] = h + weightToHostsMap[weight] = append(weightToHostsMap[weight], h) + } + err := h.addInstance(instance.Port(), instance) + if err != nil { + return nil, err + } + } + return weightToHostsMap, nil +} + +// groupHostsWithIsolationGroupCheck looks at the isolation groups of the given hosts +// and try to make as many groups as possible. The hosts in each group +// must come from different isolation groups. +func groupHostsWithIsolationGroupCheck(hosts []host, rf int) (groups [][]host, ungrouped []host) { + if len(hosts) < rf { + // When the number of hosts is less than rf, no groups can be made. + return nil, hosts + } + + var ( + uniqIGs = make(map[string]*group, len(hosts)) + rh = groupsByNumHost(make([]*group, 0, len(hosts))) + ) + for _, h := range hosts { + r, ok := uniqIGs[h.isolationGroup] + if !ok { + r = &group{ + isolationGroup: h.isolationGroup, + hosts: make([]host, 0, rf), + } + + uniqIGs[h.isolationGroup] = r + rh = append(rh, r) + } + r.hosts = append(r.hosts, h) + } + + heap.Init(&rh) + + // For each group, always prefer to find one host from the largest isolation group + // in the heap. After a group is filled, push all the checked isolation groups back + // to the heap so they can be used for the next group. + groups = make([][]host, 0, int(math.Ceil(float64(len(hosts))/float64(rf)))) + for rh.Len() >= rf { + // When there are more than rf isolation groups available, try to make a group. + seenIGs := make(map[string]*group, rf) + g := make([]host, 0, rf) + for i := 0; i < rf; i++ { + r := heap.Pop(&rh).(*group) + // Move the host from the isolation group to the group. + // The isolation groups in the heap always have at least one host. + g = append(g, r.hosts[len(r.hosts)-1]) + r.hosts = r.hosts[:len(r.hosts)-1] + seenIGs[r.isolationGroup] = r + } + if len(g) == rf { + groups = append(groups, g) + } + for _, r := range seenIGs { + if len(r.hosts) > 0 { + heap.Push(&rh, r) + } + } + } + + ungrouped = make([]host, 0, rh.Len()) + for _, r := range rh { + ungrouped = append(ungrouped, r.hosts...) + } + return groups, ungrouped +} + +func groupInstancesByHostPort(hostGroups [][]host) ([][]placement.Instance, error) { + var instanceGroups = make([][]placement.Instance, 0, len(hostGroups)) + for _, hostGroup := range hostGroups { + for port, instance := range hostGroup[0].portToInstance { + instanceGroup := make([]placement.Instance, 0, len(hostGroup)) + instanceGroup = append(instanceGroup, instance) + for _, otherHost := range hostGroup[1:] { + otherInstance, ok := otherHost.portToInstance[port] + if !ok { + return nil, fmt.Errorf("could not find port %d on host %s", port, otherHost.name) + } + instanceGroup = append(instanceGroup, otherInstance) + } + instanceGroups = append(instanceGroups, instanceGroup) + } + } + return instanceGroups, nil +} + +// assignShardsetsToGroupedInstances is a helper for mirrored selectors, which assigns shardset +// IDs to the given groups. +func assignShardsetsToGroupedInstances( + groups [][]placement.Instance, + p placement.Placement, +) []placement.Instance { + var ( + instances = make([]placement.Instance, 0, p.ReplicaFactor()*len(groups)) + currShardSetID = p.MaxShardSetID() + 1 + ssID uint32 + ) + for _, group := range groups { + useNewSSID := shouldUseNewShardSetID(group, p) + + if useNewSSID { + ssID = currShardSetID + currShardSetID++ + } + for _, instance := range group { + if useNewSSID { + instance = instance.SetShardSetID(ssID) + } + instances = append(instances, instance) + } + } + return instances +} + +func shouldUseNewShardSetID( + group []placement.Instance, + p placement.Placement, +) bool { + var seenSSID *uint32 + for _, instance := range group { + instanceInPlacement, exist := p.Instance(instance.ID()) + if !exist { + return true + } + currentSSID := instanceInPlacement.ShardSetID() + if seenSSID == nil { + seenSSID = ¤tSSID + continue + } + if *seenSSID != currentSSID { + return true + } + } + return false +} + +type host struct { + name string + isolationGroup string + weight uint32 + portToInstance map[uint32]placement.Instance +} + +func newHost(name, isolationGroup string, weight uint32) host { + return host{ + name: name, + isolationGroup: isolationGroup, + weight: weight, + portToInstance: make(map[uint32]placement.Instance), + } +} + +func (h host) addInstance(port uint32, instance placement.Instance) error { + if h.weight != instance.Weight() { + return fmt.Errorf("could not add instance %s to host %s, weight mismatch: %d and %d", + instance.ID(), h.name, instance.Weight(), h.weight) + } + if h.isolationGroup != instance.IsolationGroup() { + return fmt.Errorf("could not add instance %s to host %s, isolation group mismatch: %s and %s", + instance.ID(), h.name, instance.IsolationGroup(), h.isolationGroup) + } + h.portToInstance[port] = instance + return nil +} + +type group struct { + isolationGroup string + hosts []host +} + +type groupsByNumHost []*group + +func (h groupsByNumHost) Len() int { + return len(h) +} + +func (h groupsByNumHost) Less(i, j int) bool { + return len(h[i].hosts) > len(h[j].hosts) +} + +func (h groupsByNumHost) Swap(i, j int) { + h[i], h[j] = h[j], h[i] +} + +func (h *groupsByNumHost) Push(i interface{}) { + r := i.(*group) + *h = append(*h, r) +} + +func (h *groupsByNumHost) Pop() interface{} { + old := *h + n := len(old) + g := old[n-1] + *h = old[0 : n-1] + return g +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/selector/mirrored_custom_groups.go b/vendor/github.com/m3db/m3/src/cluster/placement/selector/mirrored_custom_groups.go new file mode 100644 index 00000000..6479ed3a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/selector/mirrored_custom_groups.go @@ -0,0 +1,232 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package selector + +import ( + "fmt" + + "github.com/m3db/m3/src/cluster/placement" + "github.com/m3db/m3/src/x/errors" + + "go.uber.org/zap" +) + +type mirroredCustomGroupSelector struct { + instanceIDToGroupID InstanceGroupIDFunc + logger *zap.Logger + opts placement.Options +} + +// InstanceGroupIDFunc maps an instance to its mirrored group. +type InstanceGroupIDFunc func(inst placement.Instance) (string, error) + +// NewMapInstanceGroupIDFunc creates a simple lookup function for an instances group, which +// looks up the group ID for an instance by the instance ID. +func NewMapInstanceGroupIDFunc(instanceToGroup map[string]string) InstanceGroupIDFunc { + return func(inst placement.Instance) (string, error) { + gid, ok := instanceToGroup[inst.ID()] + if !ok { + return "", fmt.Errorf( + "instance %s doesn't have a corresponding group in ID to group map", + inst.ID(), + ) + } + return gid, nil + } +} + +// NewMirroredCustomGroupSelector constructs a placement.InstanceSelector which assigns shardsets +// according to their group ID (provided by instanceToGroupID). That is, instances with the +// same group ID are assigned the same shardset ID, and will receive the same mirrored traffic. +func NewMirroredCustomGroupSelector( + instanceToGroupID InstanceGroupIDFunc, + opts placement.Options, +) placement.InstanceSelector { + return &mirroredCustomGroupSelector{ + logger: opts.InstrumentOptions().Logger(), + instanceIDToGroupID: instanceToGroupID, + opts: opts, + } +} + +func (e *mirroredCustomGroupSelector) SelectInitialInstances( + candidates []placement.Instance, + rf int, +) ([]placement.Instance, error) { + return e.selectInstances( + candidates, + placement.NewPlacement().SetReplicaFactor(rf), + true, + ) +} + +func (e *mirroredCustomGroupSelector) SelectAddingInstances( + candidates []placement.Instance, + p placement.Placement, +) ([]placement.Instance, error) { + return e.selectInstances(candidates, p, e.opts.AddAllCandidates()) +} + +// SelectReplaceInstances attempts to find a replacement instance in the same group +// for each of the leavingInstances +func (e *mirroredCustomGroupSelector) SelectReplaceInstances( + candidates []placement.Instance, + leavingInstanceIDs []string, + p placement.Placement, +) ([]placement.Instance, error) { + candidates, err := getValidCandidates(p, candidates, e.opts) + if err != nil { + return nil, err + } + + // find a replacement for each leaving instance. + candidatesByGroup, err := e.groupInstancesByID(candidates) + if err != nil { + return nil, err + } + + leavingInstances, err := getLeavingInstances(p, leavingInstanceIDs) + if err != nil { + return nil, err + } + + replacementGroups := make([]mirroredReplacementGroup, 0, len(leavingInstances)) + for _, leavingInstance := range leavingInstances { + // try to find an instance in the same group as the leaving instance. + groupID, err := e.getGroup(leavingInstance) + if err != nil { + return nil, err + } + + replacementGroup := candidatesByGroup[groupID] + if len(replacementGroup) == 0 { + return nil, newErrNoValidReplacement(leavingInstance.ID(), groupID) + } + + replacementNode := replacementGroup[len(replacementGroup)-1] + candidatesByGroup[groupID] = replacementGroup[:len(replacementGroup)-1] + + replacementGroups = append( + replacementGroups, + mirroredReplacementGroup{ + Leaving: leavingInstance, + Replacement: replacementNode, + }) + } + + return assignShardsetIDsToReplacements(leavingInstanceIDs, replacementGroups) +} + +type mirroredReplacementGroup struct { + Leaving placement.Instance + Replacement placement.Instance +} + +// selectInstances does the actual work of the class. It groups candidate instances by their +// group ID, and assigns them shardsets. +// N.B. (amains): addAllInstances is a parameter here (instead of using e.opts) because it +// only applies to the SelectAddingInstances case. +func (e *mirroredCustomGroupSelector) selectInstances( + candidates []placement.Instance, + p placement.Placement, + addAllInstances bool, +) ([]placement.Instance, error) { + candidates, err := getValidCandidates(p, candidates, e.opts) + if err != nil { + return nil, err + } + + groups, err := e.groupWithRF(candidates, p.ReplicaFactor()) + if err != nil { + return nil, err + } + + // no groups => no instances + if len(groups) == 0 { + return nil, nil + } + + if !addAllInstances { + groups = groups[:1] + } + return assignShardsetsToGroupedInstances(groups, p), nil +} + +func (e *mirroredCustomGroupSelector) groupWithRF( + candidates []placement.Instance, + rf int) ([][]placement.Instance, error) { + byGroupID, err := e.groupInstancesByID(candidates) + if err != nil { + return nil, err + } + + groups := make([][]placement.Instance, 0, len(byGroupID)) + // validate and convert to slice + for groupID, group := range byGroupID { + if len(group) > rf { + fullGroup := group + group = group[:rf] + + var droppedIDs []string + for _, dropped := range fullGroup[rf:] { + droppedIDs = append(droppedIDs, dropped.ID()) + } + e.logger.Warn( + "mirroredCustomGroupSelector: found more hosts than RF in group; "+ + "using only RF hosts", + zap.Strings("droppedIDs", droppedIDs), + zap.String("groupID", groupID), + ) + } + groups = append(groups, group) + } + return groups, nil +} + +func (e *mirroredCustomGroupSelector) groupInstancesByID(candidates []placement.Instance) (map[string][]placement.Instance, error) { + byGroupID := make(map[string][]placement.Instance) + for _, candidate := range candidates { + groupID, err := e.getGroup(candidate) + if err != nil { + return nil, err + } + + byGroupID[groupID] = append(byGroupID[groupID], candidate) + } + return byGroupID, nil +} + +// small wrapper around e.instanceIDToGroupID providing context on error. +func (e *mirroredCustomGroupSelector) getGroup(inst placement.Instance) (string, error) { + groupID, err := e.instanceIDToGroupID(inst) + if err != nil { + return "", errors.Wrapf(err, "finding group for %s", inst.ID()) + } + return groupID, nil +} + +func newErrNoValidReplacement(leavingInstID string, groupID string) error { + return fmt.Errorf( + "leaving instance %s has no valid replacements in the same group (%s)", + leavingInstID, + groupID, + ) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/selector/non_mirrored.go b/vendor/github.com/m3db/m3/src/cluster/placement/selector/non_mirrored.go new file mode 100644 index 00000000..84606bc3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/selector/non_mirrored.go @@ -0,0 +1,311 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package selector + +import ( + "errors" + "fmt" + "sort" + + "github.com/m3db/m3/src/cluster/placement" + "github.com/m3db/m3/src/cluster/placement/algo" +) + +var ( + errInstanceAbsent = errors.New("could not remove or replace a instance that does not exist") + errNoValidInstance = errors.New("no valid instance in the candidate list") +) + +type nonMirroredSelector struct { + opts placement.Options +} + +// NewNonMirroredSelector constructs an instance selector which doesn't mirror traffic +// (no shardsets) and which takes into account existing +// shard placement and instance weight in order to choose instances. +func NewNonMirroredSelector(opts placement.Options) placement.InstanceSelector { + return &nonMirroredSelector{opts: opts} +} + +func (f *nonMirroredSelector) SelectInitialInstances( + candidates []placement.Instance, + rf int, +) ([]placement.Instance, error) { + return getValidCandidates(placement.NewPlacement(), candidates, f.opts) +} + +func (f *nonMirroredSelector) SelectAddingInstances( + candidates []placement.Instance, + p placement.Placement, +) ([]placement.Instance, error) { + candidates, err := getValidCandidates(p, candidates, f.opts) + if err != nil { + return nil, err + } + + if f.opts.AddAllCandidates() { + return candidates, nil + } + + instance, err := selectSingleCandidate(candidates, p) + if err != nil { + return nil, err + } + return []placement.Instance{instance}, nil +} + +func (f *nonMirroredSelector) SelectReplaceInstances( + candidates []placement.Instance, + leavingInstanceIDs []string, + p placement.Placement, +) ([]placement.Instance, error) { + candidates, err := getValidCandidates(p, candidates, f.opts) + if err != nil { + return nil, err + } + + leavingInstances, err := getLeavingInstances(p, leavingInstanceIDs) + if err != nil { + return nil, err + } + + if f.opts.AddAllCandidates() { + if err := f.validateReplaceInstances(candidates, leavingInstances); err != nil { + return nil, err + } + return candidates, nil + } + + return f.selectReplaceInstances(candidates, leavingInstances, p) +} + +// selectReplaceInstances returns a sufficient number of instances to replace the weight +// of the leaving instances. +func (f *nonMirroredSelector) selectReplaceInstances( + candidates, leavingInstances []placement.Instance, + p placement.Placement, +) ([]placement.Instance, error) { + // Map isolation group to instances. + candidateGroups := buildIsolationGroupMap(candidates) + + // Sort the candidate instances by the number of conflicts. + ph := algo.NewPlacementHelper(p, f.opts) + instances := make([]sortableValue, 0, len(candidateGroups)) + for group, instancesInGroup := range candidateGroups { + conflicts := 0 + for _, leaving := range leavingInstances { + for _, s := range leaving.Shards().All() { + if !ph.CanMoveShard(s.ID(), leaving, group) { + conflicts++ + } + } + } + for _, instance := range instancesInGroup { + instances = append(instances, sortableValue{value: instance, weight: conflicts}) + } + } + + groups := groupInstancesByConflict(instances, f.opts) + if len(groups) == 0 { + return nil, errNoValidInstance + } + + var totalWeight uint32 + for _, instance := range leavingInstances { + totalWeight += instance.Weight() + } + result, leftWeight := fillWeight(groups, int(totalWeight)) + + if leftWeight > 0 && !f.opts.AllowPartialReplace() { + return nil, fmt.Errorf("could not find enough instances to replace %v, %d weight could not be replaced", + leavingInstances, leftWeight) + } + return result, nil +} + +func (f *nonMirroredSelector) validateReplaceInstances( + candidates, leavingInstances []placement.Instance, +) error { + var leavingWeight int + for _, instance := range leavingInstances { + leavingWeight += int(instance.Weight()) + } + var candidateWeight int + for _, instance := range candidates { + candidateWeight += int(instance.Weight()) + } + + if leavingWeight > candidateWeight && !f.opts.AllowPartialReplace() { + return fmt.Errorf("could not find enough instances to replace %v, %d weight could not be replaced", + leavingInstances, leavingWeight) + } + return nil +} + +func groupInstancesByConflict(instancesSortedByConflicts []sortableValue, opts placement.Options) [][]placement.Instance { + allowConflict := opts.AllowPartialReplace() + sort.Sort(sortableValues(instancesSortedByConflicts)) + var groups [][]placement.Instance + lastSeenConflict := -1 + for _, instance := range instancesSortedByConflicts { + if !allowConflict && instance.weight > 0 { + break + } + if instance.weight > lastSeenConflict { + lastSeenConflict = instance.weight + groups = append(groups, []placement.Instance{}) + } + if lastSeenConflict == instance.weight { + groups[len(groups)-1] = append(groups[len(groups)-1], instance.value.(placement.Instance)) + } + } + return groups +} + +func fillWeight(groups [][]placement.Instance, targetWeight int) ([]placement.Instance, int) { + var ( + result []placement.Instance + instancesInGroup []placement.Instance + ) + for _, group := range groups { + sort.Sort(placement.ByIDAscending(group)) + instancesInGroup, targetWeight = knapsack(group, targetWeight) + result = append(result, instancesInGroup...) + if targetWeight <= 0 { + break + } + } + return result, targetWeight +} + +func knapsack(instances []placement.Instance, targetWeight int) ([]placement.Instance, int) { + totalWeight := 0 + for _, instance := range instances { + totalWeight += int(instance.Weight()) + } + if totalWeight <= targetWeight { + return instances[:], targetWeight - totalWeight + } + // totalWeight > targetWeight, there is a combination of instances to meet targetWeight for sure + // we do dp until totalWeight rather than targetWeight here because we need to + // at least cover the targetWeight, which is a little bit different than the knapsack problem + weights := make([]int, totalWeight+1) + combination := make([][]placement.Instance, totalWeight+1) + + // dp: weights[i][j] = max(weights[i-1][j], weights[i-1][j-instance.Weight] + instance.Weight) + // when there are multiple combination to reach a target weight, we prefer the one with less instances + for i := range instances { + weight := int(instances[i].Weight()) + // this loop needs to go from len to 1 because weights is being updated in place + for j := totalWeight; j >= 1; j-- { + if j-weight < 0 { + continue + } + newWeight := weights[j-weight] + weight + if newWeight > weights[j] { + weights[j] = weights[j-weight] + weight + combination[j] = append(combination[j-weight], instances[i]) + } else if newWeight == weights[j] { + // if can reach same weight, find a combination with less instances + if len(combination[j-weight])+1 < len(combination[j]) { + combination[j] = append(combination[j-weight], instances[i]) + } + } + } + } + + for i := targetWeight; i <= totalWeight; i++ { + if weights[i] >= targetWeight { + return combination[i], targetWeight - weights[i] + } + } + + panic("should never reach here") +} + +func buildIsolationGroupMap(candidates []placement.Instance) map[string][]placement.Instance { + result := make(map[string][]placement.Instance, len(candidates)) + for _, instance := range candidates { + if _, exist := result[instance.IsolationGroup()]; !exist { + result[instance.IsolationGroup()] = make([]placement.Instance, 0) + } + result[instance.IsolationGroup()] = append(result[instance.IsolationGroup()], instance) + } + return result +} + +func selectSingleCandidate( + candidates []placement.Instance, + p placement.Placement, +) (placement.Instance, error) { + candidateGroups := buildIsolationGroupMap(candidates) + existingGroups := buildIsolationGroupMap(p.Instances()) + + // If there is an isolation group not in the current placement, prefer the isolation group. + for r, instances := range candidateGroups { + if _, exist := existingGroups[r]; !exist { + // All the isolation groups have at least 1 instance. + return instances[0], nil + } + } + + // Otherwise sort the isolation groups in the current placement + // by capacity and find a instance from least sized isolation group. + groups := make(sortableValues, 0, len(existingGroups)) + for group, instances := range existingGroups { + weight := 0 + for _, i := range instances { + weight += int(i.Weight()) + } + groups = append(groups, sortableValue{value: group, weight: weight}) + } + sort.Sort(groups) + + for _, group := range groups { + if i, exist := candidateGroups[group.value.(string)]; exist { + for _, instance := range i { + return instance, nil + } + } + } + + // no instance in the candidate instances can be added to the placement + return nil, errNoValidInstance +} + +type sortableValue struct { + value interface{} + weight int +} + +type sortableValues []sortableValue + +func (values sortableValues) Len() int { + return len(values) +} + +func (values sortableValues) Less(i, j int) bool { + return values[i].weight < values[j].weight +} + +func (values sortableValues) Swap(i, j int) { + values[i], values[j] = values[j], values[i] +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/selector/selector.go b/vendor/github.com/m3db/m3/src/cluster/placement/selector/selector.go new file mode 100644 index 00000000..0aa6b970 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/selector/selector.go @@ -0,0 +1,34 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package selector + +import ( + "github.com/m3db/m3/src/cluster/placement" +) + +// NewInstanceSelector creates an instance selector. +func NewInstanceSelector(opts placement.Options) placement.InstanceSelector { + if opts.IsMirrored() { + return NewPortMirroredSelector(opts) + } + + return NewNonMirroredSelector(opts) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/service/operator.go b/vendor/github.com/m3db/m3/src/cluster/placement/service/operator.go new file mode 100644 index 00000000..75da980f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/service/operator.go @@ -0,0 +1,100 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +package service + +import ( + "errors" + + "github.com/m3db/m3/src/cluster/placement" +) + +// NewPlacementOperator constructs a placement.Operator which performs transformations on the +// given placement. +// If initialPlacement is nil, BuildInitialPlacement must be called before any operations on the +// placement. +func NewPlacementOperator(initialPlacement placement.Placement, opts placement.Options) placement.Operator { + store := newDummyStore(initialPlacement) + return &placementOperator{ + placementServiceImpl: newPlacementServiceImpl(opts, store), + store: store, + } +} + +// placementOperator is implemented by a placementServiceImpl backed by a dummyStore, which just +// sets in memory state and doesn't touch versions. +type placementOperator struct { + *placementServiceImpl + store *dummyStore +} + +func (p *placementOperator) Placement() placement.Placement { + return p.store.curPlacement +} + +// dummyStore is a helper class for placementOperator. It stores a single placement in memory, +// allowing us to use the same code to implement the actual placement.Service (which typically talks +// to a fully fledged backing store) and placement.Operator, which only operates on memory. +// Unlike proper placement.Storage implementations, all operations are unversioned; +// version arguments are ignored, and the store never calls Placement.SetVersion. This makes it +// distinct from e.g. the implementation in mem.NewStore. +type dummyStore struct { + curPlacement placement.Placement +} + +func newDummyStore(initialPlacement placement.Placement) *dummyStore { + return &dummyStore{curPlacement: initialPlacement} +} + +func (d *dummyStore) Set(p placement.Placement) (placement.Placement, error) { + d.set(p) + return d.curPlacement, nil +} + +func (d *dummyStore) set(p placement.Placement) { + d.curPlacement = p +} + +// CheckAndSet on the dummy store is unconditional (no check). +func (d *dummyStore) CheckAndSet(p placement.Placement, _ int) (placement.Placement, error) { + d.curPlacement = p + return d.curPlacement, nil +} + +func (d *dummyStore) SetIfNotExist(p placement.Placement) (placement.Placement, error) { + if d.curPlacement != nil { + return nil, errors.New( + "placement already exists and can't be rebuilt. Construct a new placement.Operator", + ) + } + d.curPlacement = p + return d.curPlacement, nil +} + +func (d *dummyStore) Placement() (placement.Placement, error) { + if d.curPlacement == nil { + return nil, errors.New( + "no initial placement specified at operator construction; call BuildInitialPlacement or pass one in", + ) + } + return d.curPlacement, nil +} + diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/service/service.go b/vendor/github.com/m3db/m3/src/cluster/placement/service/service.go new file mode 100644 index 00000000..67873db3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/service/service.go @@ -0,0 +1,344 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package service + +import ( + "fmt" + + "github.com/m3db/m3/src/cluster/placement" + "github.com/m3db/m3/src/cluster/placement/algo" + "github.com/m3db/m3/src/cluster/placement/selector" + "github.com/m3db/m3/src/cluster/shard" + + "go.uber.org/zap" +) + +type placementService struct { + placement.Storage + *placementServiceImpl +} + +// NewPlacementService returns an instance of placement service. +func NewPlacementService(s placement.Storage, opts placement.Options) placement.Service { + return &placementService{ + Storage: s, + placementServiceImpl: newPlacementServiceImpl( + opts, + s, + + ), + } +} + +func newPlacementServiceImpl( + opts placement.Options, + storage minimalPlacementStorage, +) *placementServiceImpl { + if opts == nil { + opts = placement.NewOptions() + } + + instanceSelector := opts.InstanceSelector() + if instanceSelector == nil { + instanceSelector = selector.NewInstanceSelector(opts) + } + + return &placementServiceImpl{ + store: storage, + opts: opts, + algo: algo.NewAlgorithm(opts), + selector: instanceSelector, + logger: opts.InstrumentOptions().Logger(), + } +} + +// minimalPlacementStorage is the subset of the placement.Storage interface used by placement.Service +// directly. +type minimalPlacementStorage interface { + + // Set writes a placement. + Set(p placement.Placement) (placement.Placement, error) + + // CheckAndSet writes a placement.Placement if the current version + // matches the expected version. + CheckAndSet(p placement.Placement, version int) (placement.Placement, error) + + // SetIfNotExist writes a placement.Placement. + SetIfNotExist(p placement.Placement) (placement.Placement, error) + + // Placement reads placement.Placement. + Placement() (placement.Placement, error) +} + +// type assertion +var _ minimalPlacementStorage = placement.Storage(nil) + +type placementServiceImpl struct { + store minimalPlacementStorage + + opts placement.Options + algo placement.Algorithm + selector placement.InstanceSelector + logger *zap.Logger +} + +func (ps *placementServiceImpl) BuildInitialPlacement( + candidates []placement.Instance, + numShards int, + rf int, +) (placement.Placement, error) { + if numShards < 0 { + return nil, fmt.Errorf("could not build initial placement, invalid numShards %d", numShards) + } + + if rf <= 0 { + return nil, fmt.Errorf("could not build initial placement, invalid replica factor %d", rf) + } + + instances, err := ps.selector.SelectInitialInstances(candidates, rf) + if err != nil { + return nil, err + } + + ids := make([]uint32, numShards) + for i := 0; i < numShards; i++ { + ids[i] = uint32(i) + } + + tempPlacement, err := ps.algo.InitialPlacement(instances, ids, rf) + if err != nil { + return nil, err + } + + if err := placement.Validate(tempPlacement); err != nil { + return nil, err + } + + return ps.store.SetIfNotExist(tempPlacement) +} + +func (ps *placementServiceImpl) AddReplica() (placement.Placement, error) { + curPlacement, err := ps.store.Placement() + if err != nil { + return nil, err + } + + if err := ps.opts.ValidateFnBeforeUpdate()(curPlacement); err != nil { + return nil, err + } + + tempPlacement, err := ps.algo.AddReplica(curPlacement) + if err != nil { + return nil, err + } + + if err := placement.Validate(tempPlacement); err != nil { + return nil, err + } + + return ps.store.CheckAndSet(tempPlacement, curPlacement.Version()) +} + +func (ps *placementServiceImpl) AddInstances( + candidates []placement.Instance, +) (placement.Placement, []placement.Instance, error) { + curPlacement, err := ps.store.Placement() + if err != nil { + return nil, nil, err + } + + if err := ps.opts.ValidateFnBeforeUpdate()(curPlacement); err != nil { + return nil, nil, err + } + + addingInstances, err := ps.selector.SelectAddingInstances(candidates, curPlacement) + if err != nil { + return nil, nil, err + } + + tempPlacement, err := ps.algo.AddInstances(curPlacement, addingInstances) + if err != nil { + return nil, nil, err + } + + if err := placement.Validate(tempPlacement); err != nil { + return nil, nil, err + } + + for i, instance := range addingInstances { + addingInstance, ok := tempPlacement.Instance(instance.ID()) + if !ok { + return nil, nil, fmt.Errorf("unable to find added instance [%s] in new placement", instance.ID()) + } + addingInstances[i] = addingInstance + } + + newPlacement, err := ps.store.CheckAndSet(tempPlacement, curPlacement.Version()) + if err != nil { + return nil, nil, err + } + return newPlacement, addingInstances, nil +} + +func (ps *placementServiceImpl) RemoveInstances(instanceIDs []string) (placement.Placement, error) { + curPlacement, err := ps.store.Placement() + if err != nil { + return nil, err + } + + if err := ps.opts.ValidateFnBeforeUpdate()(curPlacement); err != nil { + return nil, err + } + + tempPlacement, err := ps.algo.RemoveInstances(curPlacement, instanceIDs) + if err != nil { + return nil, err + } + + if err := placement.Validate(tempPlacement); err != nil { + return nil, err + } + + return ps.store.CheckAndSet(tempPlacement, curPlacement.Version()) +} + +func (ps *placementServiceImpl) ReplaceInstances( + leavingInstanceIDs []string, + candidates []placement.Instance, +) (placement.Placement, []placement.Instance, error) { + curPlacement, err := ps.store.Placement() + if err != nil { + return nil, nil, err + } + + if err := ps.opts.ValidateFnBeforeUpdate()(curPlacement); err != nil { + return nil, nil, err + } + + addingInstances, err := ps.selector.SelectReplaceInstances(candidates, leavingInstanceIDs, curPlacement) + if err != nil { + return nil, nil, err + } + + tempPlacement, err := ps.algo.ReplaceInstances(curPlacement, leavingInstanceIDs, addingInstances) + if err != nil { + return nil, nil, err + } + + if err := placement.Validate(tempPlacement); err != nil { + return nil, nil, err + } + + addedInstances := make([]placement.Instance, 0, len(addingInstances)) + for _, inst := range addingInstances { + addedInstance, ok := tempPlacement.Instance(inst.ID()) + if !ok { + return nil, nil, fmt.Errorf("unable to find added instance [%+v] in new placement [%+v]", inst, curPlacement) + } + addedInstances = append(addedInstances, addedInstance) + } + + newPlacement, err := ps.store.CheckAndSet(tempPlacement, curPlacement.Version()) + if err != nil { + return nil, nil, err + } + return newPlacement, addedInstances, nil +} + +func (ps *placementServiceImpl) MarkShardsAvailable(instanceID string, shardIDs ...uint32) (placement.Placement, error) { + curPlacement, err := ps.store.Placement() + if err != nil { + return nil, err + } + + if err := ps.opts.ValidateFnBeforeUpdate()(curPlacement); err != nil { + return nil, err + } + + tempPlacement, err := ps.algo.MarkShardsAvailable(curPlacement, instanceID, shardIDs...) + if err != nil { + return nil, err + } + + if err := placement.Validate(tempPlacement); err != nil { + return nil, err + } + + return ps.store.CheckAndSet(tempPlacement, curPlacement.Version()) +} + +func (ps *placementServiceImpl) MarkInstanceAvailable(instanceID string) (placement.Placement, error) { + curPlacement, err := ps.store.Placement() + if err != nil { + return nil, err + } + + if err := ps.opts.ValidateFnBeforeUpdate()(curPlacement); err != nil { + return nil, err + } + + instance, exist := curPlacement.Instance(instanceID) + if !exist { + return nil, fmt.Errorf("could not find instance %s in placement", instanceID) + } + + shards := instance.Shards().ShardsForState(shard.Initializing) + shardIDs := make([]uint32, len(shards)) + for i, s := range shards { + shardIDs[i] = s.ID() + } + + tempPlacement, err := ps.algo.MarkShardsAvailable(curPlacement, instanceID, shardIDs...) + if err != nil { + return nil, err + } + + if err := placement.Validate(tempPlacement); err != nil { + return nil, err + } + + return ps.store.CheckAndSet(tempPlacement, curPlacement.Version()) +} + +func (ps *placementServiceImpl) MarkAllShardsAvailable() (placement.Placement, error) { + curPlacement, err := ps.store.Placement() + if err != nil { + return nil, err + } + + if err := ps.opts.ValidateFnBeforeUpdate()(curPlacement); err != nil { + return nil, err + } + + tempPlacement, updated, err := ps.algo.MarkAllShardsAvailable(curPlacement) + if err != nil { + return nil, err + } + if !updated { + return curPlacement, nil + } + + if err := placement.Validate(tempPlacement); err != nil { + return nil, err + } + + return ps.store.CheckAndSet(tempPlacement, curPlacement.Version()) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement.go b/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement.go new file mode 100644 index 00000000..ae4114ca --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement.go @@ -0,0 +1,220 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package placement + +import ( + "errors" + "sort" + "sync" + "sync/atomic" + + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" + "github.com/m3db/m3/src/x/clock" +) + +var ( + errNoApplicablePlacement = errors.New("no applicable placement found") + errActiveStagedPlacementClosed = errors.New("active staged placement is closed") +) + +type activeStagedPlacement struct { + sync.RWMutex + + placements Placements + nowFn clock.NowFn + onPlacementsAddedFn OnPlacementsAddedFn + onPlacementsRemovedFn OnPlacementsRemovedFn + + expiring int32 + closed bool + doneFn DoneFn +} + +func newActiveStagedPlacement( + placements []Placement, + opts ActiveStagedPlacementOptions, +) ActiveStagedPlacement { + if opts == nil { + opts = NewActiveStagedPlacementOptions() + } + p := &activeStagedPlacement{ + placements: placements, + nowFn: opts.ClockOptions().NowFn(), + onPlacementsAddedFn: opts.OnPlacementsAddedFn(), + onPlacementsRemovedFn: opts.OnPlacementsRemovedFn(), + } + p.doneFn = p.onPlacementDone + + if p.onPlacementsAddedFn != nil { + p.onPlacementsAddedFn(placements) + } + + return p +} + +func (p *activeStagedPlacement) ActivePlacement() (Placement, DoneFn, error) { + p.RLock() + placement, err := p.activePlacementWithLock(p.nowFn().UnixNano()) + if err != nil { + p.RUnlock() + return nil, nil, err + } + return placement, p.doneFn, nil +} + +func (p *activeStagedPlacement) Close() error { + p.Lock() + defer p.Unlock() + + if p.closed { + return errActiveStagedPlacementClosed + } + if p.onPlacementsRemovedFn != nil { + p.onPlacementsRemovedFn(p.placements) + } + p.placements = nil + return nil +} + +func (p *activeStagedPlacement) onPlacementDone() { p.RUnlock() } + +func (p *activeStagedPlacement) activePlacementWithLock(timeNanos int64) (Placement, error) { + if p.closed { + return nil, errActiveStagedPlacementClosed + } + idx := p.placements.ActiveIndex(timeNanos) + if idx < 0 { + return nil, errNoApplicablePlacement + } + placement := p.placements[idx] + // If the placement that's in effect is not the first placment, expire the stale ones. + if idx > 0 && atomic.CompareAndSwapInt32(&p.expiring, 0, 1) { + go p.expire() + } + return placement, nil +} + +func (p *activeStagedPlacement) expire() { + // NB(xichen): this improves readability at the slight cost of lambda capture + // because this code path is triggered very infrequently. + cleanup := func() { + p.Unlock() + atomic.StoreInt32(&p.expiring, 0) + } + p.Lock() + defer cleanup() + + if p.closed { + return + } + idx := p.placements.ActiveIndex(p.nowFn().UnixNano()) + if idx <= 0 { + return + } + if p.onPlacementsRemovedFn != nil { + p.onPlacementsRemovedFn(p.placements[:idx]) + } + n := copy(p.placements[0:], p.placements[idx:]) + for i := n; i < len(p.placements); i++ { + p.placements[i] = nil + } + p.placements = p.placements[:n] +} + +type stagedPlacement struct { + version int + placements Placements + opts ActiveStagedPlacementOptions +} + +// NewStagedPlacement creates an empty staged placement. +func NewStagedPlacement() StagedPlacement { + return &stagedPlacement{} +} + +// NewStagedPlacementFromProto creates a new staged placement from proto. +func NewStagedPlacementFromProto( + version int, + p *placementpb.PlacementSnapshots, + opts ActiveStagedPlacementOptions, +) (StagedPlacement, error) { + placements, err := NewPlacementsFromProto(p) + if err != nil { + return nil, err + } + + return &stagedPlacement{ + version: version, + placements: placements, + opts: opts, + }, nil +} + +func (sp *stagedPlacement) ActiveStagedPlacement(timeNanos int64) ActiveStagedPlacement { + idx := len(sp.placements) - 1 + for idx >= 0 && sp.placements[idx].CutoverNanos() > timeNanos { + idx-- + } + if idx < 0 { + return newActiveStagedPlacement(sp.placements, sp.opts) + } + return newActiveStagedPlacement(sp.placements[idx:], sp.opts) +} + +func (sp *stagedPlacement) Version() int { return sp.version } + +func (sp *stagedPlacement) SetVersion(version int) StagedPlacement { + sp.version = version + return sp +} + +func (sp *stagedPlacement) Placements() Placements { return sp.placements } + +func (sp *stagedPlacement) SetPlacements(placements []Placement) StagedPlacement { + sort.Sort(placementsByCutoverAsc(placements)) + sp.placements = placements + return sp +} + +func (sp *stagedPlacement) ActiveStagedPlacementOptions() ActiveStagedPlacementOptions { + return sp.opts +} + +func (sp *stagedPlacement) SetActiveStagedPlacementOptions( + opts ActiveStagedPlacementOptions, +) StagedPlacement { + sp.opts = opts + return sp +} + +func (sp *stagedPlacement) Proto() (*placementpb.PlacementSnapshots, error) { + return sp.Placements().Proto() +} + +type placementsByCutoverAsc []Placement + +func (s placementsByCutoverAsc) Len() int { return len(s) } + +func (s placementsByCutoverAsc) Less(i, j int) bool { + return s[i].CutoverNanos() < s[j].CutoverNanos() +} + +func (s placementsByCutoverAsc) Swap(i, j int) { s[i], s[j] = s[j], s[i] } diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_options.go b/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_options.go new file mode 100644 index 00000000..34138141 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_options.go @@ -0,0 +1,68 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package placement + +import ( + "github.com/m3db/m3/src/x/clock" +) + +type activeStagedPlacementOptions struct { + clockOpts clock.Options + onPlacementsAddedFn OnPlacementsAddedFn + onPlacementsRemovedFn OnPlacementsRemovedFn +} + +// NewActiveStagedPlacementOptions create a new set of active staged placement options. +func NewActiveStagedPlacementOptions() ActiveStagedPlacementOptions { + return &activeStagedPlacementOptions{ + clockOpts: clock.NewOptions(), + } +} + +func (o *activeStagedPlacementOptions) SetClockOptions(value clock.Options) ActiveStagedPlacementOptions { + opts := *o + opts.clockOpts = value + return &opts +} + +func (o *activeStagedPlacementOptions) ClockOptions() clock.Options { + return o.clockOpts +} + +func (o *activeStagedPlacementOptions) SetOnPlacementsAddedFn(value OnPlacementsAddedFn) ActiveStagedPlacementOptions { + opts := *o + opts.onPlacementsAddedFn = value + return &opts +} + +func (o *activeStagedPlacementOptions) OnPlacementsAddedFn() OnPlacementsAddedFn { + return o.onPlacementsAddedFn +} + +func (o *activeStagedPlacementOptions) SetOnPlacementsRemovedFn(value OnPlacementsRemovedFn) ActiveStagedPlacementOptions { + opts := *o + opts.onPlacementsRemovedFn = value + return &opts +} + +func (o *activeStagedPlacementOptions) OnPlacementsRemovedFn() OnPlacementsRemovedFn { + return o.onPlacementsRemovedFn +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_watcher.go b/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_watcher.go new file mode 100644 index 00000000..876934b5 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_watcher.go @@ -0,0 +1,156 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package placement + +import ( + "errors" + "sync" + + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/kv/util/runtime" + "github.com/m3db/m3/src/x/clock" +) + +var ( + errNilValue = errors.New("nil value received") + errPlacementWatcherIsNotWatching = errors.New("placement watcher is not watching") + errPlacementWatcherIsWatching = errors.New("placement watcher is watching") +) + +type placementWatcherState int + +const ( + placementWatcherNotWatching placementWatcherState = iota + placementWatcherWatching +) + +type stagedPlacementWatcher struct { + sync.RWMutex + runtime.Value + + nowFn clock.NowFn + placementOpts ActiveStagedPlacementOptions + doneFn DoneFn + + state placementWatcherState + proto *placementpb.PlacementSnapshots + placement ActiveStagedPlacement +} + +// NewStagedPlacementWatcher creates a new staged placement watcher. +func NewStagedPlacementWatcher(opts StagedPlacementWatcherOptions) StagedPlacementWatcher { + watcher := &stagedPlacementWatcher{ + nowFn: opts.ClockOptions().NowFn(), + placementOpts: opts.ActiveStagedPlacementOptions(), + proto: &placementpb.PlacementSnapshots{}, + } + watcher.doneFn = watcher.onActiveStagedPlacementDone + + valueOpts := runtime.NewOptions(). + SetInstrumentOptions(opts.InstrumentOptions()). + SetInitWatchTimeout(opts.InitWatchTimeout()). + SetKVStore(opts.StagedPlacementStore()). + SetUnmarshalFn(watcher.toStagedPlacement). + SetProcessFn(watcher.process) + watcher.Value = runtime.NewValue(opts.StagedPlacementKey(), valueOpts) + return watcher +} + +func (t *stagedPlacementWatcher) Watch() error { + t.Lock() + if t.state != placementWatcherNotWatching { + t.Unlock() + return errPlacementWatcherIsWatching + } + t.state = placementWatcherWatching + t.Unlock() + + // NB(xichen): we watch the placementWatcher updates outside the lock because + // otherwise the initial update will trigger the process() callback, + // which attempts to acquire the same lock, causing a deadlock. + return t.Value.Watch() +} + +func (t *stagedPlacementWatcher) ActiveStagedPlacement() (ActiveStagedPlacement, DoneFn, error) { + t.RLock() + if t.state != placementWatcherWatching { + t.RUnlock() + return nil, nil, errPlacementWatcherIsNotWatching + } + return t.placement, t.doneFn, nil +} + +func (t *stagedPlacementWatcher) Unwatch() error { + t.Lock() + if t.state != placementWatcherWatching { + t.Unlock() + return errPlacementWatcherIsNotWatching + } + t.state = placementWatcherNotWatching + if t.placement != nil { + t.placement.Close() + } + t.placement = nil + t.Unlock() + + // NB(xichen): we unwatch the updates outside the lock to avoid deadlock + // due to placementWatcher contending for the runtime value lock and the + // runtime updating goroutine attempting to acquire placementWatcher lock. + t.Value.Unwatch() + return nil +} + +func (t *stagedPlacementWatcher) onActiveStagedPlacementDone() { t.RUnlock() } + +func (t *stagedPlacementWatcher) toStagedPlacement(value kv.Value) (interface{}, error) { + t.Lock() + defer t.Unlock() + + if t.state != placementWatcherWatching { + return nil, errPlacementWatcherIsNotWatching + } + if value == nil { + return nil, errNilValue + } + t.proto.Reset() + if err := value.Unmarshal(t.proto); err != nil { + return nil, err + } + version := value.Version() + return NewStagedPlacementFromProto(version, t.proto, t.placementOpts) +} + +func (t *stagedPlacementWatcher) process(value interface{}) error { + t.Lock() + defer t.Unlock() + + if t.state != placementWatcherWatching { + return errPlacementWatcherIsNotWatching + } + ps := value.(StagedPlacement) + placement := ps.ActiveStagedPlacement(t.nowFn().UnixNano()) + if t.placement != nil { + t.placement.Close() + } + t.placement = placement + return nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_watcher_options.go b/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_watcher_options.go new file mode 100644 index 00000000..80b429eb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/staged_placement_watcher_options.go @@ -0,0 +1,112 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package placement + +import ( + "time" + + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/x/clock" + "github.com/m3db/m3/src/x/instrument" +) + +const ( + defaultInitWatchTimeout = 10 * time.Second +) + +type stagedPlacementWatcherOptions struct { + clockOpts clock.Options + instrumentOpts instrument.Options + stagedPlacementOpts ActiveStagedPlacementOptions + stagedPlacementKey string + stagedPlacementStore kv.Store + initWatchTimeout time.Duration +} + +// NewStagedPlacementWatcherOptions create a new set of topology options. +func NewStagedPlacementWatcherOptions() StagedPlacementWatcherOptions { + return &stagedPlacementWatcherOptions{ + clockOpts: clock.NewOptions(), + instrumentOpts: instrument.NewOptions(), + stagedPlacementOpts: NewActiveStagedPlacementOptions(), + initWatchTimeout: defaultInitWatchTimeout, + } +} + +func (o *stagedPlacementWatcherOptions) SetClockOptions(value clock.Options) StagedPlacementWatcherOptions { + opts := *o + opts.clockOpts = value + return &opts +} + +func (o *stagedPlacementWatcherOptions) ClockOptions() clock.Options { + return o.clockOpts +} + +func (o *stagedPlacementWatcherOptions) SetInstrumentOptions(value instrument.Options) StagedPlacementWatcherOptions { + opts := *o + opts.instrumentOpts = value + return &opts +} + +func (o *stagedPlacementWatcherOptions) InstrumentOptions() instrument.Options { + return o.instrumentOpts +} + +func (o *stagedPlacementWatcherOptions) SetActiveStagedPlacementOptions(value ActiveStagedPlacementOptions) StagedPlacementWatcherOptions { + opts := *o + opts.stagedPlacementOpts = value + return &opts +} + +func (o *stagedPlacementWatcherOptions) ActiveStagedPlacementOptions() ActiveStagedPlacementOptions { + return o.stagedPlacementOpts +} + +func (o *stagedPlacementWatcherOptions) SetStagedPlacementKey(value string) StagedPlacementWatcherOptions { + opts := *o + opts.stagedPlacementKey = value + return &opts +} + +func (o *stagedPlacementWatcherOptions) StagedPlacementKey() string { + return o.stagedPlacementKey +} + +func (o *stagedPlacementWatcherOptions) SetStagedPlacementStore(value kv.Store) StagedPlacementWatcherOptions { + opts := *o + opts.stagedPlacementStore = value + return &opts +} + +func (o *stagedPlacementWatcherOptions) StagedPlacementStore() kv.Store { + return o.stagedPlacementStore +} + +func (o *stagedPlacementWatcherOptions) SetInitWatchTimeout(value time.Duration) StagedPlacementWatcherOptions { + opts := *o + opts.initWatchTimeout = value + return &opts +} + +func (o *stagedPlacementWatcherOptions) InitWatchTimeout() time.Duration { + return o.initWatchTimeout +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/storage/helper.go b/vendor/github.com/m3db/m3/src/cluster/placement/storage/helper.go new file mode 100644 index 00000000..7a257dfb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/storage/helper.go @@ -0,0 +1,278 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package storage + +import ( + "errors" + "fmt" + + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/placement" + + "github.com/golang/protobuf/proto" +) + +var ( + errInvalidProtoForSinglePlacement = errors.New("invalid proto for single placement") + errInvalidProtoForPlacementSnapshots = errors.New("invalid proto for placement snapshots") + errNoPlacementInTheSnapshots = errors.New("not placement in the snapshots") +) + +// helper handles placement marshaling and validation. +type helper interface { + // Placement retrieves the placement stored in kv.Store. + Placement() (placement.Placement, int, error) + + // PlacementProto retrieves the proto stored in kv.Store. + PlacementProto() (proto.Message, int, error) + + // GenerateProto generates the proto message for the new placement, it may read the kv.Store + // if existing placement data is needed. + GenerateProto(p placement.Placement) (proto.Message, error) + + // ValidateProto validates if the given proto message is valid for placement. + ValidateProto(proto proto.Message) error + + // PlacementForVersion returns the placement of a specific version. + PlacementForVersion(version int) (placement.Placement, error) +} + +// newHelper returns a new placement storage helper. +func newHelper(store kv.Store, key string, opts placement.Options) helper { + if opts.IsStaged() { + return newStagedPlacementHelper(store, key) + } + + return newPlacementHelper(store, key) +} + +type placementHelper struct { + store kv.Store + key string +} + +func newPlacementHelper(store kv.Store, key string) helper { + return &placementHelper{ + store: store, + key: key, + } +} + +func (h *placementHelper) PlacementForVersion(version int) (placement.Placement, error) { + values, err := h.store.History(h.key, version, version+1) + if err != nil { + return nil, err + } + + if len(values) != 1 { + return nil, fmt.Errorf("invalid number of placements returned: %d, expecting 1", len(values)) + } + + return placementFromValue(values[0]) +} + +func (h *placementHelper) Placement() (placement.Placement, int, error) { + v, err := h.store.Get(h.key) + if err != nil { + return nil, 0, err + } + + p, err := placementFromValue(v) + return p, v.Version(), err +} + +func (h *placementHelper) PlacementProto() (proto.Message, int, error) { + v, err := h.store.Get(h.key) + if err != nil { + return nil, 0, err + } + + p, err := placementProtoFromValue(v) + return p, v.Version(), err +} + +func (h *placementHelper) GenerateProto(p placement.Placement) (proto.Message, error) { + return p.Proto() +} + +func (h *placementHelper) ValidateProto(proto proto.Message) error { + placementProto, ok := proto.(*placementpb.Placement) + if !ok { + return errInvalidProtoForSinglePlacement + } + + p, err := placement.NewPlacementFromProto(placementProto) + if err != nil { + return err + } + + return placement.Validate(p) +} + +type stagedPlacementHelper struct { + store kv.Store + key string +} + +func newStagedPlacementHelper(store kv.Store, key string) helper { + return &stagedPlacementHelper{ + store: store, + key: key, + } +} + +// Placement returns the last placement in the snapshots. +func (h *stagedPlacementHelper) Placement() (placement.Placement, int, error) { + ps, v, err := h.placements() + if err != nil { + return nil, 0, err + } + + l := len(ps) + if l == 0 { + return nil, 0, errNoPlacementInTheSnapshots + } + + return ps[l-1], v, nil +} + +func (h *stagedPlacementHelper) PlacementProto() (proto.Message, int, error) { + value, err := h.store.Get(h.key) + if err != nil { + return nil, 0, err + } + + ps, err := placementSnapshotsProtoFromValue(value) + return ps, value.Version(), err +} + +// GenerateProto generates a proto message with the placement appended to the snapshots. +func (h *stagedPlacementHelper) GenerateProto(p placement.Placement) (proto.Message, error) { + ps, _, err := h.placements() + if err != nil && err != kv.ErrNotFound { + return nil, err + } + + if l := len(ps); l > 0 { + lastCutoverNanos := ps[l-1].CutoverNanos() + // When there is valid placement in the snapshots, the new placement must be scheduled after last placement. + if lastCutoverNanos >= p.CutoverNanos() { + return nil, fmt.Errorf("invalid placement: cutover nanos %d must be later than last placement cutover nanos %d", + p.CutoverNanos(), lastCutoverNanos) + } + } + + ps = append(ps, p) + return ps.Proto() +} + +func (h *stagedPlacementHelper) ValidateProto(proto proto.Message) error { + placementsProto, ok := proto.(*placementpb.PlacementSnapshots) + if !ok { + return errInvalidProtoForPlacementSnapshots + } + + _, err := placement.NewPlacementsFromProto(placementsProto) + return err +} + +func (h *stagedPlacementHelper) placements() (placement.Placements, int, error) { + value, err := h.store.Get(h.key) + if err != nil { + return nil, 0, err + } + + ps, err := placementsFromValue(value) + return ps, value.Version(), err +} + +func (h *stagedPlacementHelper) PlacementForVersion(version int) (placement.Placement, error) { + values, err := h.store.History(h.key, version, version+1) + if err != nil { + return nil, err + } + + if len(values) != 1 { + return nil, fmt.Errorf("invalid number of placements returned: %d, expecting 1", len(values)) + } + + ps, err := placementsFromValue(values[0]) + if err != nil { + return nil, err + } + + l := len(ps) + if l == 0 { + return nil, errNoPlacementInTheSnapshots + } + + return ps[l-1], nil +} + +func placementProtoFromValue(v kv.Value) (*placementpb.Placement, error) { + var placementProto placementpb.Placement + if err := v.Unmarshal(&placementProto); err != nil { + return nil, err + } + + return &placementProto, nil +} + +func placementFromValue(v kv.Value) (placement.Placement, error) { + placementProto, err := placementProtoFromValue(v) + if err != nil { + return nil, err + } + + p, err := placement.NewPlacementFromProto(placementProto) + if err != nil { + return nil, err + } + + return p.SetVersion(v.Version()), nil +} + +func placementSnapshotsProtoFromValue(v kv.Value) (*placementpb.PlacementSnapshots, error) { + var placementsProto placementpb.PlacementSnapshots + if err := v.Unmarshal(&placementsProto); err != nil { + return nil, err + } + + return &placementsProto, nil +} + +func placementsFromValue(v kv.Value) (placement.Placements, error) { + placementsProto, err := placementSnapshotsProtoFromValue(v) + if err != nil { + return nil, err + } + + ps, err := placement.NewPlacementsFromProto(placementsProto) + if err != nil { + return nil, err + } + + for i, p := range ps { + ps[i] = p.SetVersion(v.Version()) + } + return ps, nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/storage/storage.go b/vendor/github.com/m3db/m3/src/cluster/placement/storage/storage.go new file mode 100644 index 00000000..027dd198 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/storage/storage.go @@ -0,0 +1,187 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package storage + +import ( + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/placement" + + "github.com/golang/protobuf/proto" + "go.uber.org/zap" +) + +const errorVersionValue = 0 + +type storage struct { + helper helper + key string + store kv.Store + opts placement.Options + logger *zap.Logger +} + +// NewPlacementStorage creates a placement.Storage. +func NewPlacementStorage(store kv.Store, key string, opts placement.Options) placement.Storage { + if opts == nil { + opts = placement.NewOptions() + } + return &storage{ + key: key, + store: store, + helper: newHelper(store, key, opts), + opts: opts, + logger: opts.InstrumentOptions().Logger(), + } +} + +func (s *storage) CheckAndSetProto(p proto.Message, version int) (int, error) { + if err := s.helper.ValidateProto(p); err != nil { + return errorVersionValue, err + } + + if s.opts.Dryrun() { + s.logger.Info("this is a dryrun, the operation is not persisted") + return version + 1, nil + } + + return s.store.CheckAndSet(s.key, version, p) +} + +func (s *storage) SetProto(p proto.Message) (int, error) { + if err := s.helper.ValidateProto(p); err != nil { + return errorVersionValue, err + } + + if s.opts.Dryrun() { + s.logger.Info("this is a dryrun, the operation is not persisted") + return errorVersionValue, nil + } + return s.store.Set(s.key, p) +} + +func (s *storage) Proto() (proto.Message, int, error) { + return s.helper.PlacementProto() +} + +func (s *storage) Set(p placement.Placement) (placement.Placement, error) { + if err := placement.Validate(p); err != nil { + return nil, err + } + + placementProto, err := s.helper.GenerateProto(p) + if err != nil { + return nil, err + } + + if s.opts.Dryrun() { + s.logger.Info("this is a dryrun, the operation is not persisted") + return p, nil + } + + v, err := s.store.Set(s.key, placementProto) + if err != nil { + return nil, err + } + + return p.Clone().SetVersion(v), nil +} + +func (s *storage) CheckAndSet(p placement.Placement, version int) (placement.Placement, error) { + if err := placement.Validate(p); err != nil { + return nil, err + } + + placementProto, err := s.helper.GenerateProto(p) + if err != nil { + return nil, err + } + + if s.opts.Dryrun() { + s.logger.Info("this is a dryrun, the operation is not persisted") + return p, nil + } + + v, err := s.store.CheckAndSet( + s.key, + version, + placementProto, + ) + + if err != nil { + return nil, err + } + + return p.Clone().SetVersion(v), nil +} + +func (s *storage) SetIfNotExist(p placement.Placement) (placement.Placement, error) { + if err := placement.Validate(p); err != nil { + return nil, err + } + + placementProto, err := s.helper.GenerateProto(p) + if err != nil { + return nil, err + } + + if s.opts.Dryrun() { + s.logger.Info("this is a dryrun, the operation is not persisted") + return p, nil + } + + v, err := s.store.SetIfNotExists( + s.key, + placementProto, + ) + + if err != nil { + return nil, err + } + + return p.Clone().SetVersion(v), nil +} + +func (s *storage) Delete() error { + if s.opts.Dryrun() { + s.logger.Info("this is a dryrun, the operation is not persisted") + return nil + } + + _, err := s.store.Delete(s.key) + return err +} + +func (s *storage) Placement() (placement.Placement, error) { + p, _, err := s.helper.Placement() + return p, err +} + +func (s *storage) Watch() (placement.Watch, error) { + w, err := s.store.Watch(s.key) + if err != nil { + return nil, err + } + return newPlacementWatch(w, s.opts), nil +} + +func (s *storage) PlacementForVersion(version int) (placement.Placement, error) { + return s.helper.PlacementForVersion(version) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/storage/watch.go b/vendor/github.com/m3db/m3/src/cluster/placement/storage/watch.go new file mode 100644 index 00000000..6598ea9c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/storage/watch.go @@ -0,0 +1,63 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package storage + +import ( + "errors" + + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/placement" +) + +var ( + errPlacementNotAvailable = errors.New("placement is not available") + errStagedPlacementNoActivePlacement = errors.New("staged placement with no active placement") +) + +type w struct { + kv.ValueWatch + opts placement.Options +} + +func newPlacementWatch(vw kv.ValueWatch, opts placement.Options) placement.Watch { + return &w{ValueWatch: vw, opts: opts} +} + +func (w *w) Get() (placement.Placement, error) { + v := w.ValueWatch.Get() + if v == nil { + return nil, errPlacementNotAvailable + } + + if w.opts.IsStaged() { + p, err := placementsFromValue(v) + if err != nil { + return nil, err + } + if len(p) == 0 { + return nil, errStagedPlacementNoActivePlacement + } + + return p[len(p)-1], nil + } + + return placementFromValue(v) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/placement/types.go b/vendor/github.com/m3db/m3/src/cluster/placement/types.go new file mode 100644 index 00000000..73b6edc6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/placement/types.go @@ -0,0 +1,637 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package placement + +import ( + "time" + + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/x/clock" + "github.com/m3db/m3/src/x/instrument" + + "github.com/golang/protobuf/proto" +) + +// Instance represents an instance in a placement. +type Instance interface { + // String is for debugging. + String() string + + // ID is the id of the instance. + ID() string + + // SetID sets the id of the instance. + SetID(id string) Instance + + // IsolationGroup is the isolation group of the instance, + // which usually but not necessarily refers to the rack of the instance. + IsolationGroup() string + + // SetIsolationGroup sets the isolation group of the instance. + SetIsolationGroup(r string) Instance + + // Zone is the zone of the instance. + Zone() string + + // SetZone sets the zone of the instance. + SetZone(z string) Instance + + // Weight is the weight of the instance. + Weight() uint32 + + // SetWeight sets the weight of the instance. + SetWeight(w uint32) Instance + + // Endpoint is the endpoint of the instance. + Endpoint() string + + // SetEndpoint sets the endpoint of the instance. + SetEndpoint(ip string) Instance + + // Shards returns the shards owned by the instance. + Shards() shard.Shards + + // SetShards sets the shards owned by the instance. + SetShards(s shard.Shards) Instance + + // ShardSetID returns the shard set id. + ShardSetID() uint32 + + // SetShardSetID sets the shard set id. + SetShardSetID(value uint32) Instance + + // Hostname returns the hostname of the instance. + Hostname() string + + // SetHostname sets the hostname of the instance. + SetHostname(value string) Instance + + // Port returns the port of the instance. + Port() uint32 + + // SetPort sets the port of the instance. + SetPort(value uint32) Instance + + // Metadata returns the metadata of the instance. + Metadata() InstanceMetadata + + // SetMetadata sets the metadata of the instance. + SetMetadata(value InstanceMetadata) Instance + + // Proto returns the proto representation for the Instance. + Proto() (*placementpb.Instance, error) + + // IsLeaving returns whether the instance contains only leaving shards. + IsLeaving() bool + + // IsInitializing returns whether the instance contains only initializing shards. + IsInitializing() bool + + // IsAvailable returns whether the instance contains only available shards. + IsAvailable() bool + + // Clone returns a clone of the Instance. + Clone() Instance +} + +// InstanceMetadata represents the metadata for a single Instance in the placement. +type InstanceMetadata struct { + DebugPort uint32 +} + +// Placement describes how instances are placed. +type Placement interface { + // InstancesForShard returns the instances for a given shard id. + InstancesForShard(shard uint32) []Instance + + // Instances returns all instances in the placement + Instances() []Instance + + // SetInstances sets the instances + SetInstances(instances []Instance) Placement + + // NumInstances returns the number of instances in the placement + NumInstances() int + + // Instance returns the instance for the requested id + Instance(id string) (Instance, bool) + + // ReplicaFactor returns the replica factor in the placement + ReplicaFactor() int + + // SetReplicaFactor sets the ReplicaFactor + SetReplicaFactor(rf int) Placement + + // Shards returns all the unique shard ids for a replica + Shards() []uint32 + + // SetShards sets the unique shard ids for a replica + SetShards(s []uint32) Placement + + // ShardsLen returns the number of shards in a replica + NumShards() int + + // IsSharded() returns whether this placement is sharded + IsSharded() bool + + // SetIsSharded() sets IsSharded + SetIsSharded(v bool) Placement + + // CutoverNanos returns the cutover time in nanoseconds. + CutoverNanos() int64 + + // SetCutoverNanos sets the cutover time in nanoseconds. + SetCutoverNanos(cutoverNanos int64) Placement + + // IsMirrored() returns whether the placement is mirrored. + IsMirrored() bool + + // SetIsMirrored() sets IsMirrored. + SetIsMirrored(v bool) Placement + + // MaxShardSetID returns the maximum shard set id used before to guarantee unique + // shard set id generations across placement changes. + MaxShardSetID() uint32 + + // SetMaxShardSetID sets the maximum shard set id used before to guarantee unique + // shard set id generations across placement changes. + SetMaxShardSetID(value uint32) Placement + + // String returns a description of the placement + String() string + + // Version() returns the version of the placement retreived from the + // backing MVCC store. + Version() int + + // SetVersion() sets the version of the placement object. Since version + // is determined by the backing MVCC store, calling this method has no + // effect in terms of the updated ServicePlacement that is written back + // to the MVCC store. + SetVersion(v int) Placement + + // Proto returns the proto representation for the Placement. + Proto() (*placementpb.Placement, error) + + // Clone returns a clone of the Placement. + Clone() Placement +} + +// Watch watches for updates of a placement. +type Watch interface { + // C returns the notification channel. + C() <-chan struct{} + + // Get returns the latest version of the placement. + Get() (Placement, error) + + // Close stops watching for placement updates. + Close() +} + +// DoneFn is called when caller is done using the resource. +type DoneFn func() + +// StagedPlacementWatcher watches for updates to staged placement. +type StagedPlacementWatcher interface { + // Watch starts watching the updates. + Watch() error + + // ActiveStagedPlacement returns the currently active staged placement, the + // callback function when the caller is done using the active staged placement, + // and any errors encountered. + ActiveStagedPlacement() (ActiveStagedPlacement, DoneFn, error) + + // Unwatch stops watching the updates. + Unwatch() error +} + +// StagedPlacementWatcherOptions provide a set of staged placement watcher options. +type StagedPlacementWatcherOptions interface { + // SetClockOptions sets the clock options. + SetClockOptions(value clock.Options) StagedPlacementWatcherOptions + + // ClockOptions returns the clock options. + ClockOptions() clock.Options + + // SetInstrumentOptions sets the instrument options. + SetInstrumentOptions(value instrument.Options) StagedPlacementWatcherOptions + + // InstrumentOptions returns the instrument options. + InstrumentOptions() instrument.Options + + // SetActiveStagedPlacementOptions sets the active staged placement options. + SetActiveStagedPlacementOptions(value ActiveStagedPlacementOptions) StagedPlacementWatcherOptions + + // ActiveStagedPlacementOptions returns the active staged placement options. + ActiveStagedPlacementOptions() ActiveStagedPlacementOptions + + // SetStagedPlacementKey sets the kv key to watch for staged placement. + SetStagedPlacementKey(value string) StagedPlacementWatcherOptions + + // StagedPlacementKey returns the kv key to watch for staged placement. + StagedPlacementKey() string + + // SetStagedPlacementStore sets the staged placement store. + SetStagedPlacementStore(store kv.Store) StagedPlacementWatcherOptions + + // StagedPlacementStore returns the staged placement store. + StagedPlacementStore() kv.Store + + // SetInitWatchTimeout sets the initial watch timeout. + SetInitWatchTimeout(value time.Duration) StagedPlacementWatcherOptions + + // InitWatchTimeout returns the initial watch timeout. + InitWatchTimeout() time.Duration +} + +// ActiveStagedPlacement describes active staged placement. +type ActiveStagedPlacement interface { + // ActivePlacement returns the currently active placement for a given time, the callback + // function when the caller is done using the placement, and any errors encountered. + ActivePlacement() (Placement, DoneFn, error) + + // Close closes the active staged placement. + Close() error +} + +// OnPlacementsAddedFn is called when placements are added. +type OnPlacementsAddedFn func(placements []Placement) + +// OnPlacementsRemovedFn is called when placements are removed. +type OnPlacementsRemovedFn func(placements []Placement) + +// ActiveStagedPlacementOptions provide a set of options for active staged placement. +type ActiveStagedPlacementOptions interface { + // SetClockOptions sets the clock options. + SetClockOptions(value clock.Options) ActiveStagedPlacementOptions + + // ClockOptions returns the clock options. + ClockOptions() clock.Options + + // SetOnPlacementsAddedFn sets the callback function for adding placement. + SetOnPlacementsAddedFn(value OnPlacementsAddedFn) ActiveStagedPlacementOptions + + // OnPlacementsAddedFn returns the callback function for adding placement. + OnPlacementsAddedFn() OnPlacementsAddedFn + + // SetOnPlacementsRemovedFn sets the callback function for removing placement. + SetOnPlacementsRemovedFn(value OnPlacementsRemovedFn) ActiveStagedPlacementOptions + + // OnPlacementsRemovedFn returns the callback function for removing placement. + OnPlacementsRemovedFn() OnPlacementsRemovedFn +} + +// StagedPlacement describes a series of placements applied in staged fashion. +type StagedPlacement interface { + // ActiveStagedPlacement returns the active staged placement for a given time. + ActiveStagedPlacement(timeNanos int64) ActiveStagedPlacement + + // Version returns the version of the staged placement. + Version() int + + // SetVersion sets the version of the staged placement. + SetVersion(version int) StagedPlacement + + // Placements return the placements in the staged placement. + Placements() Placements + + // SetPlacements sets the placements in the staged placement. + SetPlacements(placements []Placement) StagedPlacement + + // ActiveStagedPlacementOptions returns the active staged placement options. + ActiveStagedPlacementOptions() ActiveStagedPlacementOptions + + // SetActiveStagedPlacementOptions sets the active staged placement options. + SetActiveStagedPlacementOptions(opts ActiveStagedPlacementOptions) StagedPlacement + + // Proto returns the proto representation for the StagedPlacement. + Proto() (*placementpb.PlacementSnapshots, error) +} + +// TimeNanosFn returns the time in the format of Unix nanoseconds. +type TimeNanosFn func() int64 + +// ShardValidateFn validates the shard. +type ShardValidateFn func(s shard.Shard) error + +// ValidateFn validates the placement. +type ValidateFn func(p Placement) error + +// Options is the interface for placement options. +type Options interface { + // AllowPartialReplace allows shards from the leaving instance to be + // placed on instances other than the new instances in a replace operation + AllowPartialReplace() bool + + // SetAllowPartialReplace sets AllowPartialReplace. + SetAllowPartialReplace(allowPartialReplace bool) Options + + // AllowAllZones will enable the placement to contain hosts that + // are not contained within the same zone of the actual placement. This is + // needed for services that require cross zone communication. + AllowAllZones() bool + + // SetAllowAllZones sets AllowAllZones. + SetAllowAllZones(allowAllZones bool) Options + + // AddAllCandidates determines whether the placement will attempt to add all + // candidates when adding instances or just a single one. + AddAllCandidates() bool + + // SetAddAllCandidates sets AddAllCandidates. + SetAddAllCandidates(addAllCandidates bool) Options + + // InstanceSelector defines the strategy used to select new instances from a list of + // candidates when adding or replacing nodes in the placement. The default is determined + // by IsMirrored(); false => selector.NewNonMirroredSelector, true => NewPortMirroredSelector. + InstanceSelector() InstanceSelector + + // SetInstanceSelector -- see InstanceSelector. + SetInstanceSelector(s InstanceSelector) Options + + // IsSharded describes whether a placement needs to be sharded, + // when set to false, no specific shards will be assigned to any instance. + IsSharded() bool + + // SetIsSharded sets IsSharded. + SetIsSharded(sharded bool) Options + + // ShardStateMode describes the mode to manage shard state in the placement. + ShardStateMode() ShardStateMode + + // SetShardStateMode sets ShardStateMode. + SetShardStateMode(value ShardStateMode) Options + + // Dryrun will try to perform the placement operation but will not persist the final result. + Dryrun() bool + + // SetDryrun sets whether the Dryrun value. + SetDryrun(d bool) Options + + // IsMirrored returns whether the shard distribution should be mirrored + // to support master/slave model. + IsMirrored() bool + + // SetIsMirrored sets IsMirrored. + SetIsMirrored(m bool) Options + + // IsStaged returns whether the placement should keep all the snapshots. + IsStaged() bool + + // SetIsStaged sets whether the placement should keep all the snapshots. + SetIsStaged(v bool) Options + + // InstrumentOptions is the options for instrument. + InstrumentOptions() instrument.Options + + // SetInstrumentOptions sets the instrument options. + SetInstrumentOptions(iopts instrument.Options) Options + + // ValidZone returns the zone that added instances must be in in order + // to be added to a placement. + ValidZone() string + + // SetValidZone sets the zone that added instances must be in in order to + // be added to a placement. By default the valid zone will be the zone of + // instances already in a placement, however if a placement is empty then + // it is necessary to specify the valid zone when adding the first + // instance. + SetValidZone(z string) Options + + // PlacementCutoverNanosFn returns the TimeNanosFn for placement cutover time. + PlacementCutoverNanosFn() TimeNanosFn + + // SetPlacementCutoverNanosFn sets the TimeNanosFn for placement cutover time. + SetPlacementCutoverNanosFn(fn TimeNanosFn) Options + + // ShardCutoverNanosFn returns the TimeNanosFn for shard cutover time. + ShardCutoverNanosFn() TimeNanosFn + + // SetShardCutoverNanosFn sets the TimeNanosFn for shard cutover time. + SetShardCutoverNanosFn(fn TimeNanosFn) Options + + // ShardCutoffNanosFn returns the TimeNanosFn for shard cutoff time. + ShardCutoffNanosFn() TimeNanosFn + + // SetShardCutoffNanosFn sets the TimeNanosFn for shard cutoff time. + SetShardCutoffNanosFn(fn TimeNanosFn) Options + + // IsShardCutoverFn returns the validation function for shard cutover. + IsShardCutoverFn() ShardValidateFn + + // SetIsShardCutoverFn sets the validation function for shard cutover. + SetIsShardCutoverFn(fn ShardValidateFn) Options + + // IsShardCutoffFn returns the validation function for shard cutoff. + IsShardCutoffFn() ShardValidateFn + + // SetIsShardCutoffFn sets the validation function for shard cutoff. + SetIsShardCutoffFn(fn ShardValidateFn) Options + + // ValidateFnBeforeUpdate returns the validate function to be applied before + // a placement update. + ValidateFnBeforeUpdate() ValidateFn + + // SetValidateFnBeforeUpdate sets the validate function to be applied before + // a placement update. + SetValidateFnBeforeUpdate(fn ValidateFn) Options + + // NowFn returns the function to get time now. + NowFn() clock.NowFn + + // SetNowFn sets the function to get time now. + SetNowFn(fn clock.NowFn) Options +} + +// ShardStateMode describes the way to manage shard state in the placement. +type ShardStateMode int + +const ( + // StableShardStateOnly means the placement should only keep stable shard state. + StableShardStateOnly ShardStateMode = iota + + // IncludeTransitionalShardStates means the placement will include transitional shard states. + IncludeTransitionalShardStates +) + +// Storage provides read and write access to placement. +type Storage interface { + // Set writes a placement. + Set(p Placement) (Placement, error) + + // CheckAndSet writes a placement if the current version + // matches the expected version. + CheckAndSet(p Placement, version int) (Placement, error) + + // SetIfNotExist writes a placement. + SetIfNotExist(p Placement) (Placement, error) + + // Placement reads placement. + Placement() (Placement, error) + + // Watch returns a watch for the placement updates. + Watch() (Watch, error) + + // Delete deletes the placement. + Delete() error + + // SetProto sets the proto as the placement. + SetProto(p proto.Message) (int, error) + + // CheckAndSetProto writes a proto if the current version + // matches the expected version. + CheckAndSetProto(p proto.Message, version int) (int, error) + + // Proto returns the placement proto. + Proto() (proto.Message, int, error) + + // PlacementForVersion returns the placement of a specific version. + PlacementForVersion(version int) (Placement, error) +} + +// Service handles the placement related operations for registered services +// all write or update operations will persist the generated placement before returning success. +type Service interface { + Storage + operations +} + +// Operator is a purely in-memory version of Service; it applies placement related operations to +// a local copy of a placement without persisting anything to backing storage. This can be useful +// to apply multiple placement operations in a row before persisting them, e.g.: +// +// func DoMultipleOps(opts placement.Options, store placement.Storage) { +// curPlacement := store.Placement() +// op := placement.NewOperator(curPlacement, opts) +// op.ReplaceInstances(...) +// op.MarkAllShardsAvailable() +// store.CheckAndSet(op.Placement()) +// } +type Operator interface { + operations + + Placement() Placement +} + +// operations are the methods shared by Service and Operator. This type is private because it's +// not intended to be implemented directly; Operator and Service are the correct ways to access +// these methods. +type operations interface { + // BuildInitialPlacement initialize a placement. + BuildInitialPlacement(instances []Instance, numShards int, rf int) (Placement, error) + + // AddReplica up the replica factor by 1 in the placement. + AddReplica() (Placement, error) + + // AddInstances adds instances from the candidate list to the placement. + AddInstances(candidates []Instance) (newPlacement Placement, addedInstances []Instance, err error) + + // RemoveInstances removes instances from the placement. + RemoveInstances(leavingInstanceIDs []string) (Placement, error) + + // ReplaceInstances picks instances from the candidate list to replace instances in current placement. + ReplaceInstances( + leavingInstanceIDs []string, + candidates []Instance, + ) ( + newPlacement Placement, + usedInstances []Instance, + err error, + ) + + // MarkShardsAvailable marks given shards as available. + MarkShardsAvailable(instanceID string, shardIDs ...uint32) (Placement, error) + + // MarkInstanceAvailable marks all the shards on a given instance as available. + MarkInstanceAvailable(instanceID string) (Placement, error) + + // MarkAllShardsAvailable marks shard states as available where applicable. + MarkAllShardsAvailable() (Placement, error) +} + +// Algorithm places shards on instances. +type Algorithm interface { + // InitPlacement initialize a sharding placement with given replica factor. + InitialPlacement(instances []Instance, shards []uint32, rf int) (Placement, error) + + // AddReplica up the replica factor by 1 in the placement. + AddReplica(p Placement) (Placement, error) + + // AddInstances adds a list of instance to the placement. + AddInstances(p Placement, instances []Instance) (Placement, error) + + // RemoveInstances removes a list of instances from the placement. + RemoveInstances(p Placement, leavingInstanceIDs []string) (Placement, error) + + // ReplaceInstance replace a list of instances with new instances. + ReplaceInstances( + p Placement, + leavingInstanecIDs []string, + addingInstances []Instance, + ) (Placement, error) + + // IsCompatibleWith checks whether the algorithm could be applied to given placement. + IsCompatibleWith(p Placement) error + + // MarkShardsAvailable marks given shards as available. + MarkShardsAvailable(p Placement, instanceID string, shardIDs ...uint32) (Placement, error) + + // MarkAllShardsAvailable marks shard states as available where applicable. + MarkAllShardsAvailable(p Placement) (Placement, bool, error) +} + +// InstanceSelector selects valid instances for the placement change. +type InstanceSelector interface { + // SelectInitialInstances selects instances for the initial placement. + SelectInitialInstances( + candidates []Instance, + rf int, + ) ([]Instance, error) + + // SelectAddingInstances selects instances to be added to the placement. + SelectAddingInstances( + candidates []Instance, + p Placement, + ) ([]Instance, error) + + // SelectReplaceInstances selects instances to replace existing instances in the placement. + SelectReplaceInstances( + candidates []Instance, + leavingInstanceIDs []string, + p Placement, + ) ([]Instance, error) +} + +// DeploymentPlanner generates deployment steps for a placement +type DeploymentPlanner interface { + // DeploymentSteps returns the deployment steps + DeploymentSteps(p Placement) [][]Instance +} + +// DeploymentOptions provides options for DeploymentPlanner +type DeploymentOptions interface { + // MaxStepSize limits the number of instances to be deployed in one step + MaxStepSize() int + SetMaxStepSize(stepSize int) DeploymentOptions +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/config.go b/vendor/github.com/m3db/m3/src/cluster/services/config.go new file mode 100644 index 00000000..4a93c365 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/config.go @@ -0,0 +1,100 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package services + +import ( + "time" +) + +// OverrideConfiguration configs the override options. +type OverrideConfiguration struct { + Namespaces NamespacesConfiguration `yaml:"namespaces"` +} + +// NewOptions creates a new override options. +func (cfg OverrideConfiguration) NewOptions() OverrideOptions { + return NewOverrideOptions(). + SetNamespaceOptions(cfg.Namespaces.NewOptions()) +} + +// NamespacesConfiguration configs the NamespaceOptions. +type NamespacesConfiguration struct { + Placement string `yaml:"placement"` + Metadata string `yaml:"metadata"` +} + +// NewOptions creates a new NamespaceOptions. +func (cfg NamespacesConfiguration) NewOptions() NamespaceOptions { + return NewNamespaceOptions(). + SetPlacementNamespace(cfg.Placement). + SetMetadataNamespace(cfg.Metadata) +} + +// Configuration is the config for service options. +type Configuration struct { + InitTimeout *time.Duration `yaml:"initTimeout"` +} + +// NewOptions creates an Option. +func (cfg Configuration) NewOptions() Options { + opts := NewOptions() + if cfg.InitTimeout != nil { + opts = opts.SetInitTimeout(*cfg.InitTimeout) + } + return opts +} + +// ElectionConfiguration is for configuring election timeouts and TTLs +type ElectionConfiguration struct { + LeaderTimeout *time.Duration `yaml:"leaderTimeout"` + ResignTimeout *time.Duration `yaml:"resignTimeout"` + TTLSeconds *int `yaml:"TTLSeconds"` +} + +// NewOptions creates an ElectionOptions. +func (cfg ElectionConfiguration) NewOptions() ElectionOptions { + opts := NewElectionOptions() + if cfg.LeaderTimeout != nil { + opts = opts.SetLeaderTimeout(*cfg.LeaderTimeout) + } + if cfg.ResignTimeout != nil { + opts = opts.SetResignTimeout(*cfg.ResignTimeout) + } + if cfg.TTLSeconds != nil { + opts = opts.SetTTLSecs(*cfg.TTLSeconds) + } + return opts +} + +// ServiceIDConfiguration is for configuring serviceID. +type ServiceIDConfiguration struct { + Name string `yaml:"name"` + Environment string `yaml:"environment"` + Zone string `yaml:"zone"` +} + +// NewServiceID creates a ServiceID. +func (cfg ServiceIDConfiguration) NewServiceID() ServiceID { + return NewServiceID(). + SetName(cfg.Name). + SetEnvironment(cfg.Environment). + SetZone(cfg.Zone) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/heartbeat/etcd/options.go b/vendor/github.com/m3db/m3/src/cluster/services/heartbeat/etcd/options.go new file mode 100644 index 00000000..24bb7b0f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/heartbeat/etcd/options.go @@ -0,0 +1,181 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package etcd + +import ( + "errors" + "time" + + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/retry" +) + +var ( + defaultRequestTimeout = 10 * time.Second + defaultWatchChanCheckInterval = 10 * time.Second + defaultWatchChanResetInterval = 10 * time.Second + defaultWatchChanInitTimeout = 10 * time.Second + defaultRetryOptions = retry.NewOptions().SetMaxRetries(3) +) + +// Options are options for the client of the kv store +type Options interface { + // RequestTimeout is the timeout for etcd requests + RequestTimeout() time.Duration + // SetRequestTimeout sets the RequestTimeout + SetRequestTimeout(t time.Duration) Options + + // InstrumentsOptions is the instrument options + InstrumentsOptions() instrument.Options + // SetInstrumentsOptions sets the InstrumentsOptions + SetInstrumentsOptions(iopts instrument.Options) Options + + // RetryOptions is the retry options + RetryOptions() retry.Options + // SetRetryOptions sets the RetryOptions + SetRetryOptions(ropts retry.Options) Options + + // WatchChanCheckInterval will be used to periodically check if a watch chan + // is no longer being subscribed and should be closed + WatchChanCheckInterval() time.Duration + // SetWatchChanCheckInterval sets the WatchChanCheckInterval + SetWatchChanCheckInterval(t time.Duration) Options + + // WatchChanResetInterval is the delay before resetting the etcd watch chan + WatchChanResetInterval() time.Duration + // SetWatchChanResetInterval sets the WatchChanResetInterval + SetWatchChanResetInterval(t time.Duration) Options + + // WatchChanInitTimeout is the timeout for a watchChan initialization + WatchChanInitTimeout() time.Duration + // SetWatchChanInitTimeout sets the WatchChanInitTimeout + SetWatchChanInitTimeout(t time.Duration) Options + + // ServiceID returns the service the heartbeat store is managing heartbeats for. + ServiceID() services.ServiceID + + // SetServiceID sets the service the heartbeat store is managing heartbeats for. + SetServiceID(sid services.ServiceID) Options + + // Validate validates the Options + Validate() error +} + +type options struct { + requestTimeout time.Duration + iopts instrument.Options + ropts retry.Options + watchChanCheckInterval time.Duration + watchChanResetInterval time.Duration + watchChanInitTimeout time.Duration + sid services.ServiceID +} + +// NewOptions creates a sane default Option +func NewOptions() Options { + o := options{} + return o.SetRequestTimeout(defaultRequestTimeout). + SetInstrumentsOptions(instrument.NewOptions()). + SetRetryOptions(defaultRetryOptions). + SetWatchChanCheckInterval(defaultWatchChanCheckInterval). + SetWatchChanInitTimeout(defaultWatchChanInitTimeout). + SetWatchChanResetInterval(defaultWatchChanResetInterval) +} + +func (o options) Validate() error { + if o.iopts == nil { + return errors.New("no instrument options") + } + + if o.ropts == nil { + return errors.New("no retry options") + } + + if o.watchChanCheckInterval <= 0 { + return errors.New("invalid watch channel check interval") + } + + return nil +} + +func (o options) RequestTimeout() time.Duration { + return o.requestTimeout +} + +func (o options) SetRequestTimeout(t time.Duration) Options { + o.requestTimeout = t + return o +} + +func (o options) InstrumentsOptions() instrument.Options { + return o.iopts +} + +func (o options) SetInstrumentsOptions(iopts instrument.Options) Options { + o.iopts = iopts + return o +} + +func (o options) RetryOptions() retry.Options { + return o.ropts +} + +func (o options) SetRetryOptions(ropts retry.Options) Options { + o.ropts = ropts + return o +} + +func (o options) WatchChanCheckInterval() time.Duration { + return o.watchChanCheckInterval +} + +func (o options) SetWatchChanCheckInterval(t time.Duration) Options { + o.watchChanCheckInterval = t + return o +} + +func (o options) WatchChanResetInterval() time.Duration { + return o.watchChanResetInterval +} + +func (o options) SetWatchChanResetInterval(t time.Duration) Options { + o.watchChanResetInterval = t + return o +} + +func (o options) WatchChanInitTimeout() time.Duration { + return o.watchChanInitTimeout +} + +func (o options) SetWatchChanInitTimeout(t time.Duration) Options { + o.watchChanInitTimeout = t + return o +} + +func (o options) ServiceID() services.ServiceID { + return o.sid +} + +func (o options) SetServiceID(sid services.ServiceID) Options { + o.sid = sid + return o +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/heartbeat/etcd/store.go b/vendor/github.com/m3db/m3/src/cluster/services/heartbeat/etcd/store.go new file mode 100644 index 00000000..35fcdcb4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/heartbeat/etcd/store.go @@ -0,0 +1,424 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package etcd + +import ( + "errors" + "fmt" + "strings" + "sync" + "time" + + "github.com/m3db/m3/src/cluster/etcd/watchmanager" + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/placement" + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/x/retry" + "github.com/m3db/m3/src/x/watch" + + "go.etcd.io/etcd/clientv3" + "github.com/golang/protobuf/proto" + "github.com/uber-go/tally" + "go.uber.org/zap" + "golang.org/x/net/context" +) + +const ( + heartbeatKeyPrefix = "_hb" + keySeparator = "/" + keyFormat = "%s/%s" +) + +var ( + noopCancel func() + errNoServiceID = errors.New("ServiceID cannot be empty") +) + +// NewStore creates a heartbeat store based on etcd +func NewStore(c *clientv3.Client, opts Options) (services.HeartbeatService, error) { + if opts.ServiceID() == nil { + return nil, errNoServiceID + } + + scope := opts.InstrumentsOptions().MetricsScope() + + store := &client{ + cache: newLeaseCache(), + watchables: make(map[string]watch.Watchable), + opts: opts, + sid: opts.ServiceID(), + logger: opts.InstrumentsOptions().Logger(), + retrier: retry.NewRetrier(opts.RetryOptions()), + m: clientMetrics{ + etcdGetError: scope.Counter("etcd-get-error"), + etcdPutError: scope.Counter("etcd-put-error"), + etcdLeaseError: scope.Counter("etcd-lease-error"), + }, + + l: c.Lease, + kv: c.KV, + watcher: c.Watcher, + } + + wOpts := watchmanager.NewOptions(). + SetWatcher(c.Watcher). + SetUpdateFn(store.update). + SetTickAndStopFn(store.tickAndStop). + SetWatchOptions([]clientv3.OpOption{ + // WithPrefix so that the watch will receive any changes + // from the instances under the service + clientv3.WithPrefix(), + // periodically (appx every 10 mins) checks for the latest data + // with or without any update notification + clientv3.WithProgressNotify(), + // receive initial notification once the watch channel is created + clientv3.WithCreatedNotify(), + }). + SetWatchChanCheckInterval(opts.WatchChanCheckInterval()). + SetWatchChanInitTimeout(opts.WatchChanInitTimeout()). + SetWatchChanResetInterval(opts.WatchChanResetInterval()). + SetInstrumentsOptions(opts.InstrumentsOptions()) + + wm, err := watchmanager.NewWatchManager(wOpts) + if err != nil { + return nil, err + } + + store.wm = wm + + return store, nil +} + +type client struct { + sync.RWMutex + + cache *leaseCache + watchables map[string]watch.Watchable + opts Options + sid services.ServiceID + logger *zap.Logger + retrier retry.Retrier + m clientMetrics + + l clientv3.Lease + kv clientv3.KV + watcher clientv3.Watcher + + wm watchmanager.WatchManager +} + +type clientMetrics struct { + etcdGetError tally.Counter + etcdPutError tally.Counter + etcdLeaseError tally.Counter +} + +func (c *client) Heartbeat(instance placement.Instance, ttl time.Duration) error { + leaseID, ok := c.cache.get(c.sid, instance.ID(), ttl) + if ok { + ctx, cancel := c.context() + defer cancel() + + _, err := c.l.KeepAliveOnce(ctx, leaseID) + // if err != nil, it could because the old lease has already timedout + // on the server side, we need to try a new lease. + if err == nil { + return nil + } + } + + ctx, cancel := c.context() + defer cancel() + + resp, err := c.l.Grant(ctx, int64(ttl/time.Second)) + if err != nil { + c.m.etcdLeaseError.Inc(1) + return err + } + + ctx, cancel = c.context() + defer cancel() + + instanceProto, err := instance.Proto() + if err != nil { + return err + } + + instanceBytes, err := proto.Marshal(instanceProto) + if err != nil { + return err + } + + _, err = c.kv.Put( + ctx, + heartbeatKey(c.sid, instance.ID()), + string(instanceBytes), + clientv3.WithLease(resp.ID), + ) + if err != nil { + c.m.etcdPutError.Inc(1) + return err + } + + c.cache.put(c.sid, instance.ID(), ttl, resp.ID) + + return nil +} + +func (c *client) Get() ([]string, error) { + return c.get(servicePrefix(c.sid)) +} + +func (c *client) get(key string) ([]string, error) { + ctx, cancel := c.context() + defer cancel() + + resp, err := c.kv.Get( + ctx, + key, + clientv3.WithPrefix(), + clientv3.WithKeysOnly(), + ) + + if err != nil { + c.m.etcdGetError.Inc(1) + return nil, err + } + + r := make([]string, len(resp.Kvs)) + for i, kv := range resp.Kvs { + r[i] = instanceFromKey(string(kv.Key), key) + } + + return r, nil +} + +func (c *client) GetInstances() ([]placement.Instance, error) { + return c.getInstances(servicePrefix(c.sid)) +} + +func (c *client) getInstances(key string) ([]placement.Instance, error) { + ctx, cancel := c.context() + defer cancel() + + gr, err := c.kv.Get(ctx, key, clientv3.WithPrefix()) + if err != nil { + c.m.etcdGetError.Inc(1) + return nil, err + } + + r := make([]placement.Instance, len(gr.Kvs)) + for i, kv := range gr.Kvs { + var p placementpb.Instance + if err := proto.Unmarshal(kv.Value, &p); err != nil { + return nil, err + } + + pi, err := placement.NewInstanceFromProto(&p) + if err != nil { + return nil, err + } + + r[i] = pi + } + return r, nil +} + +func (c *client) Delete(instance string) error { + ctx, cancel := c.context() + defer cancel() + + r, err := c.kv.Delete(ctx, heartbeatKey(c.sid, instance)) + if err != nil { + return err + } + + if r.Deleted == 0 { + return fmt.Errorf("could not find heartbeat for service: %s, env: %s, instance: %s", c.sid.Name(), c.sid.Environment(), instance) + } + + // NB(cw) we need to clean up cached lease ID, if not the next heartbeat might reuse the cached lease + // and keep alive on existing lease wont work since the key is deleted + c.cache.delete(c.sid, instance) + return nil +} + +func (c *client) Watch() (watch.Watch, error) { + serviceKey := servicePrefix(c.sid) + + c.Lock() + watchable, ok := c.watchables[serviceKey] + if !ok { + watchable = watch.NewWatchable() + c.watchables[serviceKey] = watchable + + go c.wm.Watch(serviceKey) + } + c.Unlock() + + _, w, err := watchable.Watch() + return w, err +} + +func (c *client) update(key string, _ []*clientv3.Event) error { + var ( + newValue []string + err error + ) + // we need retry here because if Get() failed on an watch update, + // it has to wait 10 mins to be notified to try again + if execErr := c.retrier.Attempt(func() error { + newValue, err = c.get(key) + if err == kv.ErrNotFound { + // do not retry on ErrNotFound + return retry.NonRetryableError(err) + } + return err + }); execErr != nil { + return execErr + } + + c.RLock() + w, ok := c.watchables[key] + c.RUnlock() + if !ok { + return fmt.Errorf("unexpected: no watchable found for key: %s", key) + } + w.Update(newValue) + + return nil +} + +func (c *client) tickAndStop(key string) bool { + // fast path + c.RLock() + watchable, ok := c.watchables[key] + c.RUnlock() + if !ok { + c.logger.Warn("unexpected: key is already cleaned up", zap.String("key", key)) + return true + } + + if watchable.NumWatches() != 0 { + return false + } + + // slow path + c.Lock() + defer c.Unlock() + watchable, ok = c.watchables[key] + if !ok { + // not expect this to happen + c.logger.Warn("unexpected: key is already cleaned up", zap.String("key", key)) + return true + } + + if watchable.NumWatches() != 0 { + // a new watch has subscribed to the watchable, do not clean up + return false + } + + watchable.Close() + delete(c.watchables, key) + return true +} + +func (c *client) context() (context.Context, context.CancelFunc) { + ctx := context.Background() + cancel := noopCancel + if c.opts.RequestTimeout() > 0 { + ctx, cancel = context.WithTimeout(ctx, c.opts.RequestTimeout()) + } + + return ctx, cancel +} + +func heartbeatKey(sid services.ServiceID, instance string) string { + return fmt.Sprintf(keyFormat, servicePrefix(sid), instance) +} + +func instanceFromKey(key, servicePrefix string) string { + return strings.TrimPrefix( + strings.TrimPrefix(key, servicePrefix), + keySeparator, + ) +} + +// heartbeats for a service "svc" in env "test" should be stored under +// "_hb/test/svc". A service "svc" with no environment will be stored under +// "_hb/svc". +func servicePrefix(sid services.ServiceID) string { + env := sid.Environment() + if env == "" { + return fmt.Sprintf(keyFormat, heartbeatKeyPrefix, sid.Name()) + } + + return fmt.Sprintf( + keyFormat, + heartbeatKeyPrefix, + fmt.Sprintf(keyFormat, env, sid.Name())) +} + +func newLeaseCache() *leaseCache { + return &leaseCache{ + leases: make(map[string]map[time.Duration]clientv3.LeaseID), + } +} + +type leaseCache struct { + sync.RWMutex + + leases map[string]map[time.Duration]clientv3.LeaseID +} + +func (c *leaseCache) get(sid services.ServiceID, instance string, ttl time.Duration) (clientv3.LeaseID, bool) { + c.RLock() + defer c.RUnlock() + + leases, ok := c.leases[heartbeatKey(sid, instance)] + if !ok { + return clientv3.LeaseID(0), false + } + + id, ok := leases[ttl] + return id, ok +} + +func (c *leaseCache) put(sid services.ServiceID, instance string, ttl time.Duration, id clientv3.LeaseID) { + key := heartbeatKey(sid, instance) + + c.Lock() + defer c.Unlock() + + leases, ok := c.leases[key] + if !ok { + leases = make(map[time.Duration]clientv3.LeaseID) + c.leases[key] = leases + } + leases[ttl] = id +} + +func (c *leaseCache) delete(sid services.ServiceID, instance string) { + c.Lock() + delete(c.leases, heartbeatKey(sid, instance)) + c.Unlock() +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/leader/campaign/state.go b/vendor/github.com/m3db/m3/src/cluster/services/leader/campaign/state.go new file mode 100644 index 00000000..c6af69c6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/leader/campaign/state.go @@ -0,0 +1,63 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package campaign encapsulates the state of a campaign. +package campaign + +//go:generate stringer -type State + +// State describes the state of a campaign as its relates to the +// caller's leadership. +type State int + +const ( + // Follower indicates the caller has called Campaign but has not yet been + // elected. + Follower State = iota + + // Leader indicates the caller has called Campaign and was elected. + Leader + + // Error indicates the call to Campaign returned an error. + Error + + // Closed indicates the campaign has been closed. + Closed +) + +// Status encapsulates campaign state and any error encountered to +// provide a consistent type for the campaign watch. +type Status struct { + State State + Err error +} + +// NewStatus returns a non-error status with the given State. +func NewStatus(s State) Status { + return Status{State: s} +} + +// NewErrorStatus returns an error Status with the given State. +func NewErrorStatus(err error) Status { + return Status{ + State: Error, + Err: err, + } +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/leader/campaign/state_string.go b/vendor/github.com/m3db/m3/src/cluster/services/leader/campaign/state_string.go new file mode 100644 index 00000000..74a9a34b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/leader/campaign/state_string.go @@ -0,0 +1,36 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Code generated by "stringer -type State"; DO NOT EDIT + +package campaign + +import "fmt" + +const _State_name = "FollowerLeaderErrorClosed" + +var _State_index = [...]uint8{0, 8, 14, 19, 25} + +func (i State) String() string { + if i < 0 || i >= State(len(_State_index)-1) { + return fmt.Sprintf("State(%d)", i) + } + return _State_name[_State_index[i]:_State_index[i+1]] +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/leader/client.go b/vendor/github.com/m3db/m3/src/cluster/services/leader/client.go new file mode 100644 index 00000000..0031bd29 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/leader/client.go @@ -0,0 +1,273 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package leader + +import ( + "errors" + "fmt" + "sync" + + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/cluster/services/leader/campaign" + "github.com/m3db/m3/src/cluster/services/leader/election" + + "go.etcd.io/etcd/clientv3" + "go.etcd.io/etcd/clientv3/concurrency" + "golang.org/x/net/context" +) + +// Appended to elections with an empty string for electionID to make it easier +// for user to debug etcd keys. +const defaultElectionID = "default" + +var ( + // ErrNoLeader is returned when a call to Leader() is made to an election + // with no leader. We duplicate this error so the user doesn't have to + // import etcd's concurrency package in order to check the cause of the + // error. + ErrNoLeader = concurrency.ErrElectionNoLeader + + // ErrCampaignInProgress is returned when a call to Campaign() is made while + // the caller is either already (a) campaigning or (b) the leader. + ErrCampaignInProgress = errors.New("campaign in progress") +) + +// NB(mschalle): when an etcd leader failover occurs, all current leases have +// their TTLs refreshed: https://github.com/coreos/etcd/issues/2660 + +type client struct { + sync.RWMutex + + client *election.Client + opts services.ElectionOptions + campaignCancelFn context.CancelFunc + observeCancelFn context.CancelFunc + observeCtx context.Context + resignCh chan struct{} + campaigning bool + closed bool +} + +// newClient returns an instance of an client bound to a single election. +func newClient(cli *clientv3.Client, opts Options, electionID string) (*client, error) { + if err := opts.Validate(); err != nil { + return nil, err + } + + ttl := opts.ElectionOpts().TTLSecs() + pfx := electionPrefix(opts.ServiceID(), electionID) + ec, err := election.NewClient(cli, pfx, election.WithSessionOptions(concurrency.WithTTL(ttl))) + if err != nil { + return nil, err + } + + // Allow multiple observe calls with the same parent context, to be cancelled + // when the client is closed. + ctx, cancel := context.WithCancel(context.Background()) + + return &client{ + client: ec, + opts: opts.ElectionOpts(), + resignCh: make(chan struct{}), + observeCtx: ctx, + observeCancelFn: cancel, + }, nil +} + +func (c *client) campaign(opts services.CampaignOptions) (<-chan campaign.Status, error) { + if c.isClosed() { + return nil, errClientClosed + } + + if !c.startCampaign() { + return nil, ErrCampaignInProgress + } + + ctx, cancel := context.WithCancel(context.Background()) + c.Lock() + c.campaignCancelFn = cancel + c.Unlock() + + // buffer 1 to not block initial follower update + sc := make(chan campaign.Status, 1) + + sc <- campaign.NewStatus(campaign.Follower) + + go func() { + defer func() { + close(sc) + cancel() + c.stopCampaign() + }() + + // Campaign blocks until elected. Once we are elected, we get a channel + // that's closed if our session dies. + ch, err := c.client.Campaign(ctx, opts.LeaderValue()) + if err != nil { + sc <- campaign.NewErrorStatus(err) + return + } + + sc <- campaign.NewStatus(campaign.Leader) + select { + case <-ch: + sc <- campaign.NewErrorStatus(election.ErrSessionExpired) + case <-c.resignCh: + sc <- campaign.NewStatus(campaign.Follower) + } + }() + + return sc, nil +} + +func (c *client) resign() error { + if c.isClosed() { + return errClientClosed + } + + // if there's an active blocking call to Campaign() stop it + c.Lock() + if c.campaignCancelFn != nil { + c.campaignCancelFn() + c.campaignCancelFn = nil + } + c.Unlock() + + ctx, cancel := context.WithTimeout(context.Background(), c.opts.ResignTimeout()) + defer cancel() + if err := c.client.Resign(ctx); err != nil { + return err + } + + // if successfully resigned and there was a campaign in Leader state cancel + // it + select { + case c.resignCh <- struct{}{}: + default: + } + + c.stopCampaign() + + return nil +} + +func (c *client) leader() (string, error) { + if c.isClosed() { + return "", errClientClosed + } + + ctx, cancel := context.WithTimeout(context.Background(), c.opts.LeaderTimeout()) + defer cancel() + ld, err := c.client.Leader(ctx) + if err == concurrency.ErrElectionNoLeader { + return ld, ErrNoLeader + } + return ld, err +} + +func (c *client) observe() (<-chan string, error) { + if c.isClosed() { + return nil, errClientClosed + } + + c.RLock() + pCtx := c.observeCtx + c.RUnlock() + + ctx, cancel := context.WithCancel(pCtx) + ch, err := c.client.Observe(ctx) + if err != nil { + cancel() + return nil, err + } + + go func() { + <-ctx.Done() + cancel() + }() + + return ch, nil +} + +func (c *client) startCampaign() bool { + c.Lock() + defer c.Unlock() + + if c.campaigning { + return false + } + + c.campaigning = true + return true +} + +func (c *client) stopCampaign() { + c.Lock() + c.campaigning = false + c.Unlock() +} + +// Close closes the election service client entirely. No more campaigns can be +// started and any outstanding campaigns are closed. +func (c *client) close() error { + c.Lock() + if c.closed { + c.Unlock() + return nil + } + c.observeCancelFn() + c.closed = true + c.Unlock() + return c.client.Close() +} + +func (c *client) isClosed() bool { + c.RLock() + defer c.RUnlock() + return c.closed +} + +// elections for a service "svc" in env "test" should be stored under +// "_ld/test/svc". A service "svc" with no environment will be stored under +// "_ld/svc". +func servicePrefix(sid services.ServiceID) string { + env := sid.Environment() + if env == "" { + return fmt.Sprintf(keyFormat, leaderKeyPrefix, sid.Name()) + } + + return fmt.Sprintf( + keyFormat, + leaderKeyPrefix, + fmt.Sprintf(keyFormat, env, sid.Name())) +} + +func electionPrefix(sid services.ServiceID, electionID string) string { + eid := electionID + if eid == "" { + eid = defaultElectionID + } + + return fmt.Sprintf( + keyFormat, + servicePrefix(sid), + eid) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/leader/doc.go b/vendor/github.com/m3db/m3/src/cluster/services/leader/doc.go new file mode 100644 index 00000000..353c1be7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/leader/doc.go @@ -0,0 +1,61 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* +Package leader provides functionality for etcd-backed leader elections. + +The following diagram illustrates the states of an election: + + FOLLOWER<---------------+ + + ^ + | | + Campaign() blocks +--------------------> + | Resign() | + | | + v | + +--------+ | + | | | + | | Campaign() OK | + | | | + | | | + Campaign() Err | v Resign() | + | LEADER+--------------->+ + | + ^ + | | Lose session | + | | | + | v | + +----->ERROR+-----------------+ + Campaign() again + +An election starts in FOLLOWER state when a call to Campaign() is first made. +The underlying call to etcd will block until the client is either (a) elected +(in which case the election will be in LEADER state) or (b) an error is +encountered (in which case election will be in ERROR state). If an election is +in LEADER state but the session expires in the background it will transition to +ERROR state (and Campaign() will need to be called again to progress). If an +election is in LEADER state and the user calls Resign() it will transition back +to FOLLOWER state. Finally, if an election is in FOLLOWER state and a blocking +call to Campaign() is ongoing and the user calls Resign(), the campaign will be +cancelled and the election back in FOLLOWER state. + +Callers of Campaign() MUST consume the returned channel until it is closed or +risk goroutine leaks. +*/ +package leader diff --git a/vendor/github.com/m3db/m3/src/cluster/services/leader/election/client.go b/vendor/github.com/m3db/m3/src/cluster/services/leader/election/client.go new file mode 100644 index 00000000..c9c34361 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/leader/election/client.go @@ -0,0 +1,254 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package election provides a wrapper around a subset of the Election +// functionality of etcd's concurrency package with error handling for common +// failure scenarios such as lease expiration. +package election + +import ( + "errors" + "sync" + "sync/atomic" + + "go.etcd.io/etcd/clientv3" + "go.etcd.io/etcd/clientv3/concurrency" + "golang.org/x/net/context" +) + +var ( + // ErrSessionExpired is returned by Campaign() if the underlying session + // (lease) has expired. + ErrSessionExpired = errors.New("election: session expired") + + // ErrClientClosed is returned when an election client has been closed and + // cannot be reused. + ErrClientClosed = errors.New("election: client has been closed") +) + +// Client encapsulates a client of etcd-backed leader elections. +type Client struct { + mu sync.RWMutex + cMu sync.RWMutex // campaign lock to protect concurrency.Election.leaderSession + + prefix string + opts clientOpts + + etcdClient *clientv3.Client + election *concurrency.Election + session *concurrency.Session + + closed uint32 +} + +// NewClient returns an election client based on the given etcd client and +// participating in elections rooted at the given prefix. Optional parameters +// can be configured via options, such as configuration of the etcd session TTL. +func NewClient(cli *clientv3.Client, prefix string, options ...ClientOption) (*Client, error) { + var opts clientOpts + for _, opt := range options { + opt(&opts) + } + + cl := &Client{ + prefix: prefix, + opts: opts, + etcdClient: cli, + } + + if err := cl.resetSessionAndElection(); err != nil { + return nil, err + } + + return cl, nil +} + +// Campaign starts a new campaign for val at the prefix configured at client +// creation. It blocks until the etcd Campaign call returns, and returns any +// error encountered or ErrSessionExpired if election.Campaign returned a nil +// error but was due to the underlying session expiring. If the client is +// successfully elected with a valid session, a channel is returned which is +// closed when the session associated with the campaign expires. Callers should +// watch this channel to determine if their presumed leadership from a nil-error +// response is no longer valid. +// +// If the session expires while a Campaign() call is blocking, the campaign will +// be cancelled and return a context.Cancelled error. +// +// If a caller wishes to cancel a current blocking campaign, they must pass a +// context which they are responsible for cancelling otherwise the call to +// Campaign() will block indefinitely until the client is elected (or until the +// associated session expires). +func (c *Client) Campaign(ctx context.Context, val string) (<-chan struct{}, error) { + if c.isClosed() { + return nil, ErrClientClosed + } + + c.cMu.Lock() + defer c.cMu.Unlock() + + c.mu.RLock() + session := c.session + election := c.election + c.mu.RUnlock() + + // if current session is dead we need to create a new one + select { + case <-session.Done(): + err := c.resetSessionAndElection() + if err != nil { + return nil, err + } + + // if created a new session / election need to grab new one + c.mu.RLock() + session = c.session + election = c.election + c.mu.RUnlock() + default: + } + + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + // if session expires in background cancel ongoing campaign call + go func() { + <-session.Done() + cancel() + }() + + if err := election.Campaign(ctx, val); err != nil { + return nil, err + } + + select { + case <-session.Done(): + return nil, ErrSessionExpired + default: + } + + return session.Done(), nil +} + +// Resign gives up leadership if the caller was elected. If a current call to +// Campaign() is ongoing, Resign() will block until that call completes to avoid +// a race in the concurrency.Election type. +func (c *Client) Resign(ctx context.Context) error { + if c.isClosed() { + return ErrClientClosed + } + + c.cMu.RLock() + defer c.cMu.RUnlock() + + return c.election.Resign(ctx) +} + +// Leader returns the value proposed by the currently elected leader of the +// election. +func (c *Client) Leader(ctx context.Context) (string, error) { + if c.isClosed() { + return "", ErrClientClosed + } + + c.mu.RLock() + defer c.mu.RUnlock() + + resp, err := c.election.Leader(ctx) + if err != nil { + return "", err + } + // NB(xichen): resp.Kv is guaranteed to have at least one value, + // otherwise the Leader() call will return ErrElectionNoLeader. + return string(resp.Kvs[0].Value), nil +} + +// Observe returns a channel which receives that value of the latest leader for +// the election. The channel is closed when the context is cancelled. +func (c *Client) Observe(ctx context.Context) (<-chan string, error) { + if c.isClosed() { + return nil, ErrClientClosed + } + + c.mu.RLock() + el := c.election + c.mu.RUnlock() + + leaderCh := el.Observe(ctx) + + ch := make(chan string) + go func() { + for { + select { + case resp, ok := <-leaderCh: + if !ok { + close(ch) + return + } + + // Etcd only sends one value along the receive channel at a time + // https://git.io/fNipr. + if len(resp.Kvs) > 0 { + ch <- string(resp.Kvs[0].Value) + } + + case <-ctx.Done(): + close(ch) + return + } + } + }() + + return ch, nil +} + +// Close closes the client's underlying session and prevents any further +// campaigns from being started. +func (c *Client) Close() error { + if c.setClosed() { + c.mu.RLock() + defer c.mu.RUnlock() + + return c.session.Close() + } + + return nil +} + +func (c *Client) resetSessionAndElection() error { + session, err := concurrency.NewSession(c.etcdClient, c.opts.sessionOpts...) + if err != nil { + return err + } + + c.mu.Lock() + c.session = session + c.election = concurrency.NewElection(session, c.prefix) + c.mu.Unlock() + return nil +} + +func (c *Client) isClosed() bool { + return atomic.LoadUint32(&c.closed) == 1 +} + +func (c *Client) setClosed() bool { + return atomic.CompareAndSwapUint32(&c.closed, 0, 1) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/leader/election/options.go b/vendor/github.com/m3db/m3/src/cluster/services/leader/election/options.go new file mode 100644 index 00000000..2f3a952b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/leader/election/options.go @@ -0,0 +1,41 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package election + +import "go.etcd.io/etcd/clientv3/concurrency" + +type clientOpts struct { + sessionOpts []concurrency.SessionOption +} + +// ClientOption provides a means of configuring optional parameters for a +// client. +type ClientOption func(*clientOpts) + +// WithSessionOptions sets the options passed to all underlying +// concurrency.Session instances associated with elections. If the user wishes +// to override the TTL of sessions, concurrency.WithTTL(ttl) should be passed +// here. +func WithSessionOptions(opts ...concurrency.SessionOption) ClientOption { + return func(o *clientOpts) { + o.sessionOpts = opts + } +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/leader/options.go b/vendor/github.com/m3db/m3/src/cluster/services/leader/options.go new file mode 100644 index 00000000..2c723916 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/leader/options.go @@ -0,0 +1,87 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package leader + +import ( + "errors" + + "github.com/m3db/m3/src/cluster/services" +) + +var ( + errMissingSid = errors.New("leader options must specify service ID") + errMissingEOpts = errors.New("leader options election opts cannot be nil") +) + +// Options describe options for creating a leader service. +type Options interface { + // Service the election is campaigning for. + ServiceID() services.ServiceID + SetServiceID(sid services.ServiceID) Options + + ElectionOpts() services.ElectionOptions + SetElectionOpts(e services.ElectionOptions) Options + + Validate() error +} + +// NewOptions returns an instance of leader options. +func NewOptions() Options { + return options{ + eo: services.NewElectionOptions(), + } +} + +type options struct { + sid services.ServiceID + eo services.ElectionOptions +} + +func (o options) ServiceID() services.ServiceID { + return o.sid +} + +func (o options) SetServiceID(sid services.ServiceID) Options { + o.sid = sid + return o +} + +func (o options) ElectionOpts() services.ElectionOptions { + return o.eo +} + +func (o options) SetElectionOpts(eo services.ElectionOptions) Options { + o.eo = eo + return o +} + +func (o options) Validate() error { + if o.sid == nil { + return errMissingSid + } + + // This shouldn't happen since we have sane defaults but prevents user error. + if o.eo == nil { + return errMissingEOpts + } + + return nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/leader/service.go b/vendor/github.com/m3db/m3/src/cluster/services/leader/service.go new file mode 100644 index 00000000..2fa43363 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/leader/service.go @@ -0,0 +1,207 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package leader + +import ( + "errors" + "fmt" + "sync" + + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/cluster/services/leader/campaign" + + "go.etcd.io/etcd/clientv3" +) + +const ( + leaderKeyPrefix = "_ld" + keyFormat = "%s/%s" +) + +var ( + // errClientClosed indicates the election service client has been closed and + // no more elections can be started. + errClientClosed = errors.New("election client is closed") +) + +type multiClient struct { + sync.RWMutex + + closed bool + clients map[string]*client + opts Options + etcdClient *clientv3.Client +} + +// NewService creates a new leader service client based on an etcd client. +func NewService(cli *clientv3.Client, opts Options) (services.LeaderService, error) { + if err := opts.Validate(); err != nil { + return nil, err + } + + return &multiClient{ + clients: make(map[string]*client), + opts: opts, + etcdClient: cli, + }, nil +} + +// Close closes all underlying election clients and returns all errors +// encountered, if any. +func (s *multiClient) Close() error { + s.Lock() + if s.closed { + s.Unlock() + return nil + } + + s.closed = true + s.Unlock() + + return s.closeClients() +} + +func (s *multiClient) isClosed() bool { + s.RLock() + defer s.RUnlock() + return s.closed +} + +func (s *multiClient) closeClients() error { + s.RLock() + errC := make(chan error, 1) + var wg sync.WaitGroup + + for _, cl := range s.clients { + wg.Add(1) + + go func(cl *client) { + if err := cl.close(); err != nil { + select { + case errC <- err: + default: + } + } + wg.Done() + }(cl) + } + + s.RUnlock() + + wg.Wait() + close(errC) + + select { + case err := <-errC: + return err + default: + return nil + } +} + +func (s *multiClient) getOrCreateClient(electionID string) (*client, error) { + s.RLock() + cl, ok := s.clients[electionID] + s.RUnlock() + if ok { + return cl, nil + } + + clientNew, err := newClient(s.etcdClient, s.opts, electionID) + if err != nil { + return nil, err + } + + s.Lock() + defer s.Unlock() + + cl, ok = s.clients[electionID] + if ok { + // another client was created between RLock and now, close new one + go clientNew.close() + + return cl, nil + } + + s.clients[electionID] = clientNew + return clientNew, nil +} + +func (s *multiClient) Campaign(electionID string, opts services.CampaignOptions) (<-chan campaign.Status, error) { + if opts == nil { + return nil, errors.New("cannot pass nil campaign options") + } + + if s.isClosed() { + return nil, errClientClosed + } + + client, err := s.getOrCreateClient(electionID) + if err != nil { + return nil, err + } + + return client.campaign(opts) +} + +func (s *multiClient) Resign(electionID string) error { + if s.isClosed() { + return errClientClosed + } + + s.RLock() + cl, ok := s.clients[electionID] + s.RUnlock() + + if !ok { + return fmt.Errorf("no election with ID '%s' to resign", electionID) + } + + return cl.resign() +} + +func (s *multiClient) Leader(electionID string) (string, error) { + if s.isClosed() { + return "", errClientClosed + } + + // always create a client so we can check election statuses without + // campaigning + client, err := s.getOrCreateClient(electionID) + if err != nil { + return "", err + } + + return client.leader() +} + +func (s *multiClient) Observe(electionID string) (<-chan string, error) { + if s.isClosed() { + return nil, errClientClosed + } + + cl, err := s.getOrCreateClient(electionID) + if err != nil { + return nil, err + } + + return cl.observe() +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/options.go b/vendor/github.com/m3db/m3/src/cluster/services/options.go new file mode 100644 index 00000000..36d6df10 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/options.go @@ -0,0 +1,258 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package services + +import ( + "errors" + "os" + "time" + + "github.com/m3db/m3/src/x/instrument" +) + +const ( + defaultInitTimeout = 5 * time.Second + defaultLeaderTimeout = 10 * time.Second + defaultResignTimeout = 10 * time.Second +) + +var ( + errNoKVGen = errors.New("no KVGen function set") + errNoHeartbeatGen = errors.New("no HeartbeatGen function set") + errNoLeaderGen = errors.New("no LeaderGen function set") + errInvalidInitTimeout = errors.New("negative init timeout for service watch") +) + +type options struct { + initTimeout time.Duration + nOpts NamespaceOptions + kvGen KVGen + hbGen HeartbeatGen + ldGen LeaderGen + iopts instrument.Options +} + +// NewOptions creates an Option +func NewOptions() Options { + return options{ + iopts: instrument.NewOptions(), + nOpts: NewNamespaceOptions(), + initTimeout: defaultInitTimeout, + } +} + +func (o options) Validate() error { + if o.kvGen == nil { + return errNoKVGen + } + + if o.hbGen == nil { + return errNoHeartbeatGen + } + + if o.ldGen == nil { + return errNoLeaderGen + } + + if o.initTimeout < 0 { + return errInvalidInitTimeout + } + + return nil +} + +func (o options) InitTimeout() time.Duration { + return o.initTimeout +} + +func (o options) SetInitTimeout(t time.Duration) Options { + o.initTimeout = t + return o +} + +func (o options) KVGen() KVGen { + return o.kvGen +} + +func (o options) SetKVGen(gen KVGen) Options { + o.kvGen = gen + return o +} + +func (o options) HeartbeatGen() HeartbeatGen { + return o.hbGen +} + +func (o options) SetHeartbeatGen(gen HeartbeatGen) Options { + o.hbGen = gen + return o +} + +func (o options) LeaderGen() LeaderGen { + return o.ldGen +} + +func (o options) SetLeaderGen(lg LeaderGen) Options { + o.ldGen = lg + return o +} + +func (o options) InstrumentsOptions() instrument.Options { + return o.iopts +} + +func (o options) SetInstrumentsOptions(iopts instrument.Options) Options { + o.iopts = iopts + return o +} + +func (o options) NamespaceOptions() NamespaceOptions { + return o.nOpts +} + +func (o options) SetNamespaceOptions(opts NamespaceOptions) Options { + o.nOpts = opts + return o +} + +// NewElectionOptions returns an empty ElectionOptions. +func NewElectionOptions() ElectionOptions { + eo := electionOpts{ + leaderTimeout: defaultLeaderTimeout, + resignTimeout: defaultResignTimeout, + } + + return eo +} + +type electionOpts struct { + leaderTimeout time.Duration + resignTimeout time.Duration + ttlSecs int +} + +func (e electionOpts) LeaderTimeout() time.Duration { + return e.leaderTimeout +} + +func (e electionOpts) SetLeaderTimeout(t time.Duration) ElectionOptions { + e.leaderTimeout = t + return e +} + +func (e electionOpts) ResignTimeout() time.Duration { + return e.resignTimeout +} + +func (e electionOpts) SetResignTimeout(t time.Duration) ElectionOptions { + e.resignTimeout = t + return e +} + +func (e electionOpts) TTLSecs() int { + return e.ttlSecs +} + +func (e electionOpts) SetTTLSecs(ttl int) ElectionOptions { + e.ttlSecs = ttl + return e +} + +type campaignOpts struct { + val string +} + +// NewCampaignOptions returns an empty CampaignOptions. +func NewCampaignOptions() (CampaignOptions, error) { + h, err := os.Hostname() + if err != nil { + return nil, err + } + + return campaignOpts{val: h}, nil +} + +func (c campaignOpts) LeaderValue() string { + return c.val +} + +func (c campaignOpts) SetLeaderValue(v string) CampaignOptions { + c.val = v + return c +} + +type overrideOptions struct { + namespaceOpts NamespaceOptions +} + +// NewOverrideOptions constructs a new OverrideOptions. +func NewOverrideOptions() OverrideOptions { + return &overrideOptions{ + namespaceOpts: NewNamespaceOptions(), + } +} + +func (o overrideOptions) NamespaceOptions() NamespaceOptions { + return o.namespaceOpts +} + +func (o overrideOptions) SetNamespaceOptions(opts NamespaceOptions) OverrideOptions { + o.namespaceOpts = opts + return o +} + +type namespaceOpts struct { + placement string + metadata string +} + +// NewNamespaceOptions constructs a new NamespaceOptions. +func NewNamespaceOptions() NamespaceOptions { + return &namespaceOpts{} +} + +func (opts namespaceOpts) PlacementNamespace() string { + return opts.placement +} + +func (opts namespaceOpts) SetPlacementNamespace(v string) NamespaceOptions { + opts.placement = v + return opts +} + +func (opts namespaceOpts) MetadataNamespace() string { + return opts.metadata +} + +func (opts namespaceOpts) SetMetadataNamespace(v string) NamespaceOptions { + opts.metadata = v + return opts +} + +// NewQueryOptions creates new QueryOptions. +func NewQueryOptions() QueryOptions { return new(queryOptions) } + +type queryOptions struct { + includeUnhealthy bool +} + +func (qo *queryOptions) IncludeUnhealthy() bool { return qo.includeUnhealthy } +func (qo *queryOptions) SetIncludeUnhealthy(h bool) QueryOptions { qo.includeUnhealthy = h; return qo } diff --git a/vendor/github.com/m3db/m3/src/cluster/services/services.go b/vendor/github.com/m3db/m3/src/cluster/services/services.go new file mode 100644 index 00000000..2bf03263 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/services.go @@ -0,0 +1,894 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package services + +import ( + "errors" + "fmt" + "sync" + "time" + + "github.com/m3db/m3/src/cluster/generated/proto/metadatapb" + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/placement" + ps "github.com/m3db/m3/src/cluster/placement/service" + "github.com/m3db/m3/src/cluster/placement/storage" + "github.com/m3db/m3/src/cluster/shard" + xwatch "github.com/m3db/m3/src/x/watch" + + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +const ( + defaultGaugeInterval = 10 * time.Second +) + +var ( + errNoServiceName = errors.New("no service specified") + errNoServiceID = errors.New("no service id specified") + errNoInstanceID = errors.New("no instance id specified") + errAdPlacementMissing = errors.New("advertisement is missing placement instance") + errInstanceNotFound = errors.New("instance not found") + errNilPlacementProto = errors.New("nil placement proto") + errNilPlacementInstanceProto = errors.New("nil placement instance proto") + errNilMetadataProto = errors.New("nil metadata proto") +) + +// NewServices returns a client of Services. +func NewServices(opts Options) (Services, error) { + if err := opts.Validate(); err != nil { + return nil, err + } + + return &client{ + opts: opts, + placementKeyFn: keyFnWithNamespace(placementNamespace(opts.NamespaceOptions().PlacementNamespace())), + metadataKeyFn: keyFnWithNamespace(metadataNamespace(opts.NamespaceOptions().MetadataNamespace())), + kvManagers: make(map[string]*kvManager), + hbStores: make(map[string]HeartbeatService), + adDoneChs: make(map[string]chan struct{}), + ldSvcs: make(map[leaderKey]LeaderService), + logger: opts.InstrumentsOptions().Logger(), + m: opts.InstrumentsOptions().MetricsScope(), + }, nil +} + +type client struct { + sync.RWMutex + + opts Options + placementKeyFn keyFn + metadataKeyFn keyFn + kvManagers map[string]*kvManager + hbStores map[string]HeartbeatService + ldSvcs map[leaderKey]LeaderService + adDoneChs map[string]chan struct{} + logger *zap.Logger + m tally.Scope +} + +func (c *client) Metadata(sid ServiceID) (Metadata, error) { + if err := validateServiceID(sid); err != nil { + return nil, err + } + + m, err := c.getKVManager(sid.Zone()) + if err != nil { + return nil, err + } + + v, err := m.kv.Get(c.metadataKeyFn(sid)) + if err != nil { + return nil, err + } + + var mp metadatapb.Metadata + if err = v.Unmarshal(&mp); err != nil { + return nil, err + } + + return NewMetadataFromProto(&mp) +} + +func (c *client) SetMetadata(sid ServiceID, meta Metadata) error { + if err := validateServiceID(sid); err != nil { + return err + } + + m, err := c.getKVManager(sid.Zone()) + if err != nil { + return err + } + + mp, err := meta.Proto() + if err != nil { + return err + } + _, err = m.kv.Set(c.metadataKeyFn(sid), mp) + return err +} + +func (c *client) DeleteMetadata(sid ServiceID) error { + if err := validateServiceID(sid); err != nil { + return err + } + + m, err := c.getKVManager(sid.Zone()) + if err != nil { + return err + } + + _, err = m.kv.Delete(c.metadataKeyFn(sid)) + return err +} + +func (c *client) PlacementService(sid ServiceID, opts placement.Options) (placement.Service, error) { + if err := validateServiceID(sid); err != nil { + return nil, err + } + + store, err := c.opts.KVGen()(sid.Zone()) + if err != nil { + return nil, err + } + + return ps.NewPlacementService( + storage.NewPlacementStorage(store, c.placementKeyFn(sid), opts), + opts, + ), nil +} + +func (c *client) Advertise(ad Advertisement) error { + pi := ad.PlacementInstance() + if pi == nil { + return errAdPlacementMissing + } + + if err := validateAdvertisement(ad.ServiceID(), pi.ID()); err != nil { + return err + } + + m, err := c.Metadata(ad.ServiceID()) + if err != nil { + return err + } + + hb, err := c.getHeartbeatService(ad.ServiceID()) + if err != nil { + return err + } + + key := adKey(ad.ServiceID(), pi.ID()) + c.Lock() + ch, ok := c.adDoneChs[key] + if ok { + c.Unlock() + return fmt.Errorf("service %s, instance %s is already being advertised", ad.ServiceID(), pi.ID()) + } + ch = make(chan struct{}) + c.adDoneChs[key] = ch + c.Unlock() + + go func() { + sid := ad.ServiceID() + errCounter := c.serviceTaggedScope(sid).Counter("heartbeat.error") + + tickFn := func() { + if isHealthy(ad) { + if err := hb.Heartbeat(pi, m.LivenessInterval()); err != nil { + c.logger.Error("could not heartbeat service", + zap.String("service", sid.String()), + zap.Error(err)) + errCounter.Inc(1) + } + } + } + + tickFn() + + ticker := time.NewTicker(m.HeartbeatInterval()) + defer ticker.Stop() + for { + select { + case <-ticker.C: + tickFn() + case <-ch: + return + } + } + }() + return nil +} + +func (c *client) Unadvertise(sid ServiceID, id string) error { + if err := validateAdvertisement(sid, id); err != nil { + return err + } + + key := adKey(sid, id) + + c.Lock() + if ch, ok := c.adDoneChs[key]; ok { + // If this client is advertising the instance, stop it. + close(ch) + delete(c.adDoneChs, key) + } + c.Unlock() + + hbStore, err := c.getHeartbeatService(sid) + if err != nil { + return err + } + + return hbStore.Delete(id) +} + +func (c *client) Query(sid ServiceID, opts QueryOptions) (Service, error) { + if err := validateServiceID(sid); err != nil { + return nil, err + } + + v, err := c.getPlacementValue(sid) + if err != nil { + return nil, err + } + + service, err := getServiceFromValue(v, sid) + if err != nil { + return nil, err + } + + if !opts.IncludeUnhealthy() { + hbStore, err := c.getHeartbeatService(sid) + if err != nil { + return nil, err + } + + ids, err := hbStore.Get() + if err != nil { + return nil, err + } + + service = filterInstances(service, ids) + } + + return service, nil +} + +func (c *client) Watch(sid ServiceID, opts QueryOptions) (Watch, error) { + if err := validateServiceID(sid); err != nil { + return nil, err + } + + c.logger.Info("adding a watch", + zap.String("service", sid.Name()), + zap.String("env", sid.Environment()), + zap.String("zone", sid.Zone()), + zap.Bool("includeUnhealthy", opts.IncludeUnhealthy()), + ) + + kvm, err := c.getKVManager(sid.Zone()) + if err != nil { + return nil, err + } + + kvm.RLock() + watchable, exist := kvm.serviceWatchables[sid.String()] + kvm.RUnlock() + if exist { + _, w, err := watchable.watch() + return w, err + } + + // Prepare the watch of placement outside of lock. + key := c.placementKeyFn(sid) + placementWatch, err := kvm.kv.Watch(key) + if err != nil { + return nil, err + } + + initValue, err := c.waitForInitValue(kvm.kv, placementWatch, sid, c.opts.InitTimeout()) + if err != nil { + return nil, fmt.Errorf("could not get init value for '%s' within timeout, err: %v", key, err) + } + + initService, err := getServiceFromValue(initValue, sid) + if err != nil { + placementWatch.Close() + return nil, err + } + + kvm.Lock() + defer kvm.Unlock() + watchable, exist = kvm.serviceWatchables[sid.String()] + if exist { + // If a watchable already exist now, we need to clean up the placement watch we just created. + placementWatch.Close() + _, w, err := watchable.watch() + return w, err + } + + watchable = newServiceWatchable() + sdm := newServiceDiscoveryMetrics(c.serviceTaggedScope(sid)) + + if !opts.IncludeUnhealthy() { + hbStore, err := c.getHeartbeatService(sid) + if err != nil { + placementWatch.Close() + return nil, err + } + heartbeatWatch, err := hbStore.Watch() + if err != nil { + placementWatch.Close() + return nil, err + } + watchable.update(filterInstancesWithWatch(initService, heartbeatWatch)) + go c.watchPlacementAndHeartbeat(watchable, placementWatch, heartbeatWatch, initValue, sid, initService, sdm.serviceUnmalshalErr) + } else { + watchable.update(initService) + go c.watchPlacement(watchable, placementWatch, initValue, sid, sdm.serviceUnmalshalErr) + } + + kvm.serviceWatchables[sid.String()] = watchable + + go updateVersionGauge(placementWatch, sdm.versionGauge) + + _, w, err := watchable.watch() + return w, err +} + +func (c *client) HeartbeatService(sid ServiceID) (HeartbeatService, error) { + if err := validateServiceID(sid); err != nil { + return nil, err + } + + return c.getHeartbeatService(sid) +} + +func (c *client) getPlacementValue(sid ServiceID) (kv.Value, error) { + kvm, err := c.getKVManager(sid.Zone()) + if err != nil { + return nil, err + } + + v, err := kvm.kv.Get(c.placementKeyFn(sid)) + if err != nil { + return nil, err + } + + return v, nil +} + +func (c *client) getHeartbeatService(sid ServiceID) (HeartbeatService, error) { + c.Lock() + defer c.Unlock() + hb, ok := c.hbStores[sid.String()] + if ok { + return hb, nil + } + + hb, err := c.opts.HeartbeatGen()(sid) + if err != nil { + return nil, err + } + + c.hbStores[sid.String()] = hb + return hb, nil +} + +func (c *client) LeaderService(sid ServiceID, opts ElectionOptions) (LeaderService, error) { + if sid == nil { + return nil, errNoServiceID + } + + if opts == nil { + opts = NewElectionOptions() + } + + key := leaderCacheKey(sid, opts) + + c.RLock() + if ld, ok := c.ldSvcs[key]; ok { + c.RUnlock() + return ld, nil + } + c.RUnlock() + + c.Lock() + defer c.Unlock() + + if ld, ok := c.ldSvcs[key]; ok { + return ld, nil + } + + ld, err := c.opts.LeaderGen()(sid, opts) + if err != nil { + return nil, err + } + + c.ldSvcs[key] = ld + return ld, nil +} + +func (c *client) getKVManager(zone string) (*kvManager, error) { + c.Lock() + defer c.Unlock() + m, ok := c.kvManagers[zone] + if ok { + return m, nil + } + + kv, err := c.opts.KVGen()(zone) + if err != nil { + return nil, err + } + + m = &kvManager{ + kv: kv, + serviceWatchables: map[string]serviceWatchable{}, + } + + c.kvManagers[zone] = m + return m, nil +} + +func (c *client) watchPlacement( + w serviceWatchable, + vw kv.ValueWatch, + initValue kv.Value, + sid ServiceID, + errCounter tally.Counter, +) { + for range vw.C() { + newService := c.serviceFromUpdate(vw.Get(), initValue, sid, errCounter) + if newService == nil { + continue + } + + w.update(newService) + } +} + +func (c *client) watchPlacementAndHeartbeat( + w serviceWatchable, + vw kv.ValueWatch, + heartbeatWatch xwatch.Watch, + initValue kv.Value, + sid ServiceID, + service Service, + errCounter tally.Counter, +) { + for { + select { + case <-vw.C(): + newService := c.serviceFromUpdate(vw.Get(), initValue, sid, errCounter) + if newService == nil { + continue + } + + service = newService + case <-heartbeatWatch.C(): + c.logger.Info("received heartbeat update") + } + w.update(filterInstancesWithWatch(service, heartbeatWatch)) + } +} + +func (c *client) serviceFromUpdate( + value kv.Value, + initValue kv.Value, + sid ServiceID, + errCounter tally.Counter, +) Service { + if value == nil { + // NB(cw) this can only happen when the placement has been deleted + // it is safer to let the user keep using the old topology + c.logger.Info("received placement update with nil value") + return nil + } + + if initValue != nil && !value.IsNewer(initValue) { + // NB(cw) this can only happen when the init wait called a Get() itself + // so the init value did not come from the watch, when the watch gets created + // the first update from it may from the same version. + c.logger.Info("received stale placement update, skip", + zap.Int("version", value.Version())) + return nil + } + + newService, err := getServiceFromValue(value, sid) + if err != nil { + c.logger.Error("could not unmarshal update from kv store for placement", + zap.Int("version", value.Version()), + zap.Error(err)) + errCounter.Inc(1) + return nil + } + + c.logger.Info("successfully parsed placement", zap.Int("version", value.Version())) + return newService +} + +func (c *client) serviceTaggedScope(sid ServiceID) tally.Scope { + return c.m.Tagged( + map[string]string{ + "sd_service": sid.Name(), + "sd_env": sid.Environment(), + "sd_zone": sid.Zone(), + }, + ) +} + +func isHealthy(ad Advertisement) bool { + healthFn := ad.Health() + return healthFn == nil || healthFn() == nil +} + +func filterInstances(s Service, ids []string) Service { + if s == nil { + return nil + } + + instances := make([]ServiceInstance, 0, len(s.Instances())) + for _, id := range ids { + if instance, err := s.Instance(id); err == nil { + instances = append(instances, instance) + } + } + + return NewService(). + SetInstances(instances). + SetSharding(s.Sharding()). + SetReplication(s.Replication()) +} + +func filterInstancesWithWatch(s Service, hbw xwatch.Watch) Service { + if hbw.Get() == nil { + return s + } + return filterInstances(s, hbw.Get().([]string)) +} + +func updateVersionGauge(vw kv.ValueWatch, versionGauge tally.Gauge) { + for range time.Tick(defaultGaugeInterval) { + v := vw.Get() + if v != nil { + versionGauge.Update(float64(v.Version())) + } + } +} + +func getServiceFromValue(value kv.Value, sid ServiceID) (Service, error) { + p, err := placementFromValue(value) + if err != nil { + return nil, err + } + + return NewServiceFromPlacement(p, sid), nil +} + +func (c *client) waitForInitValue(kvStore kv.Store, w kv.ValueWatch, sid ServiceID, timeout time.Duration) (kv.Value, error) { + if timeout < 0 { + timeout = defaultInitTimeout + } else if timeout == 0 { + // We want no timeout if specifically asking for none + <-w.C() + return w.Get(), nil + } + select { + case <-w.C(): + return w.Get(), nil + case <-time.After(timeout): + return kvStore.Get(c.placementKeyFn(sid)) + } +} + +func validateAdvertisement(sid ServiceID, id string) error { + if sid == nil { + return errNoServiceID + } + + if id == "" { + return errNoInstanceID + } + + return nil +} + +// cache key for leader service clients +type leaderKey struct { + sid string + leaderTimeout time.Duration + resignTimeout time.Duration + ttl int +} + +func leaderCacheKey(sid ServiceID, opts ElectionOptions) leaderKey { + return leaderKey{ + sid: sid.String(), + leaderTimeout: opts.LeaderTimeout(), + resignTimeout: opts.ResignTimeout(), + ttl: opts.TTLSecs(), + } +} + +type kvManager struct { + sync.RWMutex + + kv kv.Store + serviceWatchables map[string]serviceWatchable +} + +func newServiceDiscoveryMetrics(m tally.Scope) serviceDiscoveryMetrics { + return serviceDiscoveryMetrics{ + versionGauge: m.Gauge("placement.version"), + serviceUnmalshalErr: m.Counter("placement.unmarshal.error"), + } +} + +type serviceDiscoveryMetrics struct { + versionGauge tally.Gauge + serviceUnmalshalErr tally.Counter +} + +// NewService creates a new Service. +func NewService() Service { return new(service) } + +// NewServiceFromProto takes the data from a placement and a service id and +// returns the corresponding Service object. +func NewServiceFromProto( + p *placementpb.Placement, + sid ServiceID, +) (Service, error) { + if p == nil { + return nil, errNilPlacementProto + } + r := make([]ServiceInstance, 0, len(p.Instances)) + for _, instance := range p.Instances { + instance, err := NewServiceInstanceFromProto(instance, sid) + if err != nil { + return nil, err + } + r = append(r, instance) + } + + return NewService(). + SetReplication(NewServiceReplication().SetReplicas(int(p.ReplicaFactor))). + SetSharding(NewServiceSharding().SetNumShards(int(p.NumShards)).SetIsSharded(p.IsSharded)). + SetInstances(r), nil +} + +// NewServiceFromPlacement creates a Service from the placement and service ID. +func NewServiceFromPlacement(p placement.Placement, sid ServiceID) Service { + var ( + placementInstances = p.Instances() + serviceInstances = make([]ServiceInstance, len(placementInstances)) + ) + + for i, placementInstance := range placementInstances { + serviceInstances[i] = NewServiceInstanceFromPlacementInstance(placementInstance, sid) + } + + return NewService(). + SetReplication(NewServiceReplication().SetReplicas(p.ReplicaFactor())). + SetSharding(NewServiceSharding().SetNumShards(p.NumShards()).SetIsSharded(p.IsSharded())). + SetInstances(serviceInstances) +} + +type service struct { + instances []ServiceInstance + replication ServiceReplication + sharding ServiceSharding +} + +func (s *service) Instance(instanceID string) (ServiceInstance, error) { + for _, instance := range s.instances { + if instance.InstanceID() == instanceID { + return instance, nil + } + } + return nil, errInstanceNotFound +} +func (s *service) Instances() []ServiceInstance { return s.instances } +func (s *service) Replication() ServiceReplication { return s.replication } +func (s *service) Sharding() ServiceSharding { return s.sharding } +func (s *service) SetInstances(insts []ServiceInstance) Service { s.instances = insts; return s } +func (s *service) SetReplication(r ServiceReplication) Service { s.replication = r; return s } +func (s *service) SetSharding(ss ServiceSharding) Service { s.sharding = ss; return s } + +// NewServiceReplication creates a new ServiceReplication. +func NewServiceReplication() ServiceReplication { return new(serviceReplication) } + +type serviceReplication struct { + replicas int +} + +func (r *serviceReplication) Replicas() int { return r.replicas } +func (r *serviceReplication) SetReplicas(rep int) ServiceReplication { r.replicas = rep; return r } + +// NewServiceSharding creates a new ServiceSharding. +func NewServiceSharding() ServiceSharding { return new(serviceSharding) } + +type serviceSharding struct { + isSharded bool + numShards int +} + +func (s *serviceSharding) NumShards() int { return s.numShards } +func (s *serviceSharding) IsSharded() bool { return s.isSharded } +func (s *serviceSharding) SetNumShards(n int) ServiceSharding { s.numShards = n; return s } +func (s *serviceSharding) SetIsSharded(v bool) ServiceSharding { s.isSharded = v; return s } + +// NewServiceInstance creates a new ServiceInstance. +func NewServiceInstance() ServiceInstance { return new(serviceInstance) } + +// NewServiceInstanceFromProto creates a new service instance from proto. +func NewServiceInstanceFromProto( + instance *placementpb.Instance, + sid ServiceID, +) (ServiceInstance, error) { + if instance == nil { + return nil, errNilPlacementInstanceProto + } + shards, err := shard.NewShardsFromProto(instance.Shards) + if err != nil { + return nil, err + } + return NewServiceInstance(). + SetServiceID(sid). + SetInstanceID(instance.Id). + SetEndpoint(instance.Endpoint). + SetShards(shards), nil +} + +// NewServiceInstanceFromPlacementInstance creates a new service instance from placement instance. +func NewServiceInstanceFromPlacementInstance( + instance placement.Instance, + sid ServiceID, +) ServiceInstance { + return NewServiceInstance(). + SetServiceID(sid). + SetInstanceID(instance.ID()). + SetEndpoint(instance.Endpoint()). + SetShards(instance.Shards()) +} + +type serviceInstance struct { + service ServiceID + id string + endpoint string + shards shard.Shards +} + +func (i *serviceInstance) InstanceID() string { return i.id } +func (i *serviceInstance) Endpoint() string { return i.endpoint } +func (i *serviceInstance) Shards() shard.Shards { return i.shards } +func (i *serviceInstance) ServiceID() ServiceID { return i.service } +func (i *serviceInstance) SetInstanceID(id string) ServiceInstance { i.id = id; return i } +func (i *serviceInstance) SetEndpoint(e string) ServiceInstance { i.endpoint = e; return i } +func (i *serviceInstance) SetShards(s shard.Shards) ServiceInstance { i.shards = s; return i } + +func (i *serviceInstance) SetServiceID(service ServiceID) ServiceInstance { + i.service = service + return i +} + +// NewAdvertisement creates a new Advertisement. +func NewAdvertisement() Advertisement { return new(advertisement) } + +type advertisement struct { + instance placement.Instance + service ServiceID + health func() error +} + +func (a *advertisement) ServiceID() ServiceID { return a.service } +func (a *advertisement) Health() func() error { return a.health } +func (a *advertisement) PlacementInstance() placement.Instance { return a.instance } +func (a *advertisement) SetServiceID(s ServiceID) Advertisement { a.service = s; return a } +func (a *advertisement) SetHealth(h func() error) Advertisement { a.health = h; return a } +func (a *advertisement) SetPlacementInstance(p placement.Instance) Advertisement { + a.instance = p + return a +} + +// NewServiceID creates new ServiceID. +func NewServiceID() ServiceID { return new(serviceID) } + +type serviceID struct { + name string + env string + zone string +} + +func (sid *serviceID) Name() string { return sid.name } +func (sid *serviceID) Environment() string { return sid.env } +func (sid *serviceID) Zone() string { return sid.zone } +func (sid *serviceID) SetName(n string) ServiceID { sid.name = n; return sid } +func (sid *serviceID) SetEnvironment(e string) ServiceID { sid.env = e; return sid } +func (sid *serviceID) SetZone(z string) ServiceID { sid.zone = z; return sid } + +func (sid *serviceID) Equal(other ServiceID) bool { + if other == nil { + return false + } + return sid.Name() == other.Name() && + sid.Zone() == other.Zone() && + sid.Environment() == other.Environment() +} + +func (sid *serviceID) String() string { + return fmt.Sprintf("[name: %s, env: %s, zone: %s]", sid.name, sid.env, sid.zone) +} + +// NewMetadata creates new Metadata. +func NewMetadata() Metadata { return new(metadata) } + +// NewMetadataFromProto converts a Metadata proto message to an instance of +// Metadata. +func NewMetadataFromProto(m *metadatapb.Metadata) (Metadata, error) { + if m == nil { + return nil, errNilMetadataProto + } + return NewMetadata(). + SetPort(m.Port). + SetLivenessInterval(time.Duration(m.LivenessInterval)). + SetHeartbeatInterval(time.Duration(m.HeartbeatInterval)), nil +} + +type metadata struct { + port uint32 + livenessInterval time.Duration + heartbeatInterval time.Duration +} + +func (m *metadata) Port() uint32 { return m.port } +func (m *metadata) LivenessInterval() time.Duration { return m.livenessInterval } +func (m *metadata) HeartbeatInterval() time.Duration { return m.heartbeatInterval } +func (m *metadata) SetPort(p uint32) Metadata { m.port = p; return m } + +func (m *metadata) SetLivenessInterval(l time.Duration) Metadata { + m.livenessInterval = l + return m +} + +func (m *metadata) SetHeartbeatInterval(l time.Duration) Metadata { + m.heartbeatInterval = l + return m +} + +func (m *metadata) String() string { + return fmt.Sprintf("[port: %d, livenessInterval: %v, heartbeatInterval: %v]", + m.port, + m.livenessInterval, + m.heartbeatInterval, + ) +} + +func (m *metadata) Proto() (*metadatapb.Metadata, error) { + return &metadatapb.Metadata{ + Port: m.Port(), + LivenessInterval: int64(m.LivenessInterval()), + HeartbeatInterval: int64(m.HeartbeatInterval()), + }, nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/services_mock.go b/vendor/github.com/m3db/m3/src/cluster/services/services_mock.go new file mode 100644 index 00000000..f7fb272b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/services_mock.go @@ -0,0 +1,1772 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/cluster/services/types.go + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package services is a generated GoMock package. +package services + +import ( + "reflect" + "time" + + "github.com/m3db/m3/src/cluster/generated/proto/metadatapb" + "github.com/m3db/m3/src/cluster/placement" + "github.com/m3db/m3/src/cluster/services/leader/campaign" + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/watch" + + "github.com/golang/mock/gomock" +) + +// MockServices is a mock of Services interface +type MockServices struct { + ctrl *gomock.Controller + recorder *MockServicesMockRecorder +} + +// MockServicesMockRecorder is the mock recorder for MockServices +type MockServicesMockRecorder struct { + mock *MockServices +} + +// NewMockServices creates a new mock instance +func NewMockServices(ctrl *gomock.Controller) *MockServices { + mock := &MockServices{ctrl: ctrl} + mock.recorder = &MockServicesMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockServices) EXPECT() *MockServicesMockRecorder { + return m.recorder +} + +// Advertise mocks base method +func (m *MockServices) Advertise(ad Advertisement) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Advertise", ad) + ret0, _ := ret[0].(error) + return ret0 +} + +// Advertise indicates an expected call of Advertise +func (mr *MockServicesMockRecorder) Advertise(ad interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Advertise", reflect.TypeOf((*MockServices)(nil).Advertise), ad) +} + +// Unadvertise mocks base method +func (m *MockServices) Unadvertise(service ServiceID, id string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Unadvertise", service, id) + ret0, _ := ret[0].(error) + return ret0 +} + +// Unadvertise indicates an expected call of Unadvertise +func (mr *MockServicesMockRecorder) Unadvertise(service, id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unadvertise", reflect.TypeOf((*MockServices)(nil).Unadvertise), service, id) +} + +// Query mocks base method +func (m *MockServices) Query(service ServiceID, opts QueryOptions) (Service, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", service, opts) + ret0, _ := ret[0].(Service) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Query indicates an expected call of Query +func (mr *MockServicesMockRecorder) Query(service, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockServices)(nil).Query), service, opts) +} + +// Watch mocks base method +func (m *MockServices) Watch(service ServiceID, opts QueryOptions) (Watch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch", service, opts) + ret0, _ := ret[0].(Watch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Watch indicates an expected call of Watch +func (mr *MockServicesMockRecorder) Watch(service, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockServices)(nil).Watch), service, opts) +} + +// Metadata mocks base method +func (m *MockServices) Metadata(sid ServiceID) (Metadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Metadata", sid) + ret0, _ := ret[0].(Metadata) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Metadata indicates an expected call of Metadata +func (mr *MockServicesMockRecorder) Metadata(sid interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Metadata", reflect.TypeOf((*MockServices)(nil).Metadata), sid) +} + +// SetMetadata mocks base method +func (m_2 *MockServices) SetMetadata(sid ServiceID, m Metadata) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SetMetadata", sid, m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetMetadata indicates an expected call of SetMetadata +func (mr *MockServicesMockRecorder) SetMetadata(sid, m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMetadata", reflect.TypeOf((*MockServices)(nil).SetMetadata), sid, m) +} + +// DeleteMetadata mocks base method +func (m *MockServices) DeleteMetadata(sid ServiceID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteMetadata", sid) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteMetadata indicates an expected call of DeleteMetadata +func (mr *MockServicesMockRecorder) DeleteMetadata(sid interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteMetadata", reflect.TypeOf((*MockServices)(nil).DeleteMetadata), sid) +} + +// PlacementService mocks base method +func (m *MockServices) PlacementService(sid ServiceID, popts placement.Options) (placement.Service, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PlacementService", sid, popts) + ret0, _ := ret[0].(placement.Service) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PlacementService indicates an expected call of PlacementService +func (mr *MockServicesMockRecorder) PlacementService(sid, popts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PlacementService", reflect.TypeOf((*MockServices)(nil).PlacementService), sid, popts) +} + +// HeartbeatService mocks base method +func (m *MockServices) HeartbeatService(service ServiceID) (HeartbeatService, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HeartbeatService", service) + ret0, _ := ret[0].(HeartbeatService) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// HeartbeatService indicates an expected call of HeartbeatService +func (mr *MockServicesMockRecorder) HeartbeatService(service interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeartbeatService", reflect.TypeOf((*MockServices)(nil).HeartbeatService), service) +} + +// LeaderService mocks base method +func (m *MockServices) LeaderService(service ServiceID, opts ElectionOptions) (LeaderService, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LeaderService", service, opts) + ret0, _ := ret[0].(LeaderService) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// LeaderService indicates an expected call of LeaderService +func (mr *MockServicesMockRecorder) LeaderService(service, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LeaderService", reflect.TypeOf((*MockServices)(nil).LeaderService), service, opts) +} + +// MockOptions is a mock of Options interface +type MockOptions struct { + ctrl *gomock.Controller + recorder *MockOptionsMockRecorder +} + +// MockOptionsMockRecorder is the mock recorder for MockOptions +type MockOptionsMockRecorder struct { + mock *MockOptions +} + +// NewMockOptions creates a new mock instance +func NewMockOptions(ctrl *gomock.Controller) *MockOptions { + mock := &MockOptions{ctrl: ctrl} + mock.recorder = &MockOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptions) EXPECT() *MockOptionsMockRecorder { + return m.recorder +} + +// InitTimeout mocks base method +func (m *MockOptions) InitTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InitTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// InitTimeout indicates an expected call of InitTimeout +func (mr *MockOptionsMockRecorder) InitTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitTimeout", reflect.TypeOf((*MockOptions)(nil).InitTimeout)) +} + +// SetInitTimeout mocks base method +func (m *MockOptions) SetInitTimeout(t time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInitTimeout", t) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetInitTimeout indicates an expected call of SetInitTimeout +func (mr *MockOptionsMockRecorder) SetInitTimeout(t interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInitTimeout", reflect.TypeOf((*MockOptions)(nil).SetInitTimeout), t) +} + +// KVGen mocks base method +func (m *MockOptions) KVGen() KVGen { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "KVGen") + ret0, _ := ret[0].(KVGen) + return ret0 +} + +// KVGen indicates an expected call of KVGen +func (mr *MockOptionsMockRecorder) KVGen() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "KVGen", reflect.TypeOf((*MockOptions)(nil).KVGen)) +} + +// SetKVGen mocks base method +func (m *MockOptions) SetKVGen(gen KVGen) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetKVGen", gen) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetKVGen indicates an expected call of SetKVGen +func (mr *MockOptionsMockRecorder) SetKVGen(gen interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetKVGen", reflect.TypeOf((*MockOptions)(nil).SetKVGen), gen) +} + +// HeartbeatGen mocks base method +func (m *MockOptions) HeartbeatGen() HeartbeatGen { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HeartbeatGen") + ret0, _ := ret[0].(HeartbeatGen) + return ret0 +} + +// HeartbeatGen indicates an expected call of HeartbeatGen +func (mr *MockOptionsMockRecorder) HeartbeatGen() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeartbeatGen", reflect.TypeOf((*MockOptions)(nil).HeartbeatGen)) +} + +// SetHeartbeatGen mocks base method +func (m *MockOptions) SetHeartbeatGen(gen HeartbeatGen) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHeartbeatGen", gen) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHeartbeatGen indicates an expected call of SetHeartbeatGen +func (mr *MockOptionsMockRecorder) SetHeartbeatGen(gen interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHeartbeatGen", reflect.TypeOf((*MockOptions)(nil).SetHeartbeatGen), gen) +} + +// LeaderGen mocks base method +func (m *MockOptions) LeaderGen() LeaderGen { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LeaderGen") + ret0, _ := ret[0].(LeaderGen) + return ret0 +} + +// LeaderGen indicates an expected call of LeaderGen +func (mr *MockOptionsMockRecorder) LeaderGen() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LeaderGen", reflect.TypeOf((*MockOptions)(nil).LeaderGen)) +} + +// SetLeaderGen mocks base method +func (m *MockOptions) SetLeaderGen(gen LeaderGen) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetLeaderGen", gen) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetLeaderGen indicates an expected call of SetLeaderGen +func (mr *MockOptionsMockRecorder) SetLeaderGen(gen interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLeaderGen", reflect.TypeOf((*MockOptions)(nil).SetLeaderGen), gen) +} + +// InstrumentsOptions mocks base method +func (m *MockOptions) InstrumentsOptions() instrument.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstrumentsOptions") + ret0, _ := ret[0].(instrument.Options) + return ret0 +} + +// InstrumentsOptions indicates an expected call of InstrumentsOptions +func (mr *MockOptionsMockRecorder) InstrumentsOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstrumentsOptions", reflect.TypeOf((*MockOptions)(nil).InstrumentsOptions)) +} + +// SetInstrumentsOptions mocks base method +func (m *MockOptions) SetInstrumentsOptions(iopts instrument.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstrumentsOptions", iopts) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetInstrumentsOptions indicates an expected call of SetInstrumentsOptions +func (mr *MockOptionsMockRecorder) SetInstrumentsOptions(iopts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstrumentsOptions", reflect.TypeOf((*MockOptions)(nil).SetInstrumentsOptions), iopts) +} + +// NamespaceOptions mocks base method +func (m *MockOptions) NamespaceOptions() NamespaceOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NamespaceOptions") + ret0, _ := ret[0].(NamespaceOptions) + return ret0 +} + +// NamespaceOptions indicates an expected call of NamespaceOptions +func (mr *MockOptionsMockRecorder) NamespaceOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NamespaceOptions", reflect.TypeOf((*MockOptions)(nil).NamespaceOptions)) +} + +// SetNamespaceOptions mocks base method +func (m *MockOptions) SetNamespaceOptions(opts NamespaceOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetNamespaceOptions", opts) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetNamespaceOptions indicates an expected call of SetNamespaceOptions +func (mr *MockOptionsMockRecorder) SetNamespaceOptions(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNamespaceOptions", reflect.TypeOf((*MockOptions)(nil).SetNamespaceOptions), opts) +} + +// Validate mocks base method +func (m *MockOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockOptions)(nil).Validate)) +} + +// MockNamespaceOptions is a mock of NamespaceOptions interface +type MockNamespaceOptions struct { + ctrl *gomock.Controller + recorder *MockNamespaceOptionsMockRecorder +} + +// MockNamespaceOptionsMockRecorder is the mock recorder for MockNamespaceOptions +type MockNamespaceOptionsMockRecorder struct { + mock *MockNamespaceOptions +} + +// NewMockNamespaceOptions creates a new mock instance +func NewMockNamespaceOptions(ctrl *gomock.Controller) *MockNamespaceOptions { + mock := &MockNamespaceOptions{ctrl: ctrl} + mock.recorder = &MockNamespaceOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockNamespaceOptions) EXPECT() *MockNamespaceOptionsMockRecorder { + return m.recorder +} + +// PlacementNamespace mocks base method +func (m *MockNamespaceOptions) PlacementNamespace() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PlacementNamespace") + ret0, _ := ret[0].(string) + return ret0 +} + +// PlacementNamespace indicates an expected call of PlacementNamespace +func (mr *MockNamespaceOptionsMockRecorder) PlacementNamespace() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PlacementNamespace", reflect.TypeOf((*MockNamespaceOptions)(nil).PlacementNamespace)) +} + +// SetPlacementNamespace mocks base method +func (m *MockNamespaceOptions) SetPlacementNamespace(v string) NamespaceOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPlacementNamespace", v) + ret0, _ := ret[0].(NamespaceOptions) + return ret0 +} + +// SetPlacementNamespace indicates an expected call of SetPlacementNamespace +func (mr *MockNamespaceOptionsMockRecorder) SetPlacementNamespace(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPlacementNamespace", reflect.TypeOf((*MockNamespaceOptions)(nil).SetPlacementNamespace), v) +} + +// MetadataNamespace mocks base method +func (m *MockNamespaceOptions) MetadataNamespace() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MetadataNamespace") + ret0, _ := ret[0].(string) + return ret0 +} + +// MetadataNamespace indicates an expected call of MetadataNamespace +func (mr *MockNamespaceOptionsMockRecorder) MetadataNamespace() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MetadataNamespace", reflect.TypeOf((*MockNamespaceOptions)(nil).MetadataNamespace)) +} + +// SetMetadataNamespace mocks base method +func (m *MockNamespaceOptions) SetMetadataNamespace(v string) NamespaceOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMetadataNamespace", v) + ret0, _ := ret[0].(NamespaceOptions) + return ret0 +} + +// SetMetadataNamespace indicates an expected call of SetMetadataNamespace +func (mr *MockNamespaceOptionsMockRecorder) SetMetadataNamespace(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMetadataNamespace", reflect.TypeOf((*MockNamespaceOptions)(nil).SetMetadataNamespace), v) +} + +// MockOverrideOptions is a mock of OverrideOptions interface +type MockOverrideOptions struct { + ctrl *gomock.Controller + recorder *MockOverrideOptionsMockRecorder +} + +// MockOverrideOptionsMockRecorder is the mock recorder for MockOverrideOptions +type MockOverrideOptionsMockRecorder struct { + mock *MockOverrideOptions +} + +// NewMockOverrideOptions creates a new mock instance +func NewMockOverrideOptions(ctrl *gomock.Controller) *MockOverrideOptions { + mock := &MockOverrideOptions{ctrl: ctrl} + mock.recorder = &MockOverrideOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOverrideOptions) EXPECT() *MockOverrideOptionsMockRecorder { + return m.recorder +} + +// NamespaceOptions mocks base method +func (m *MockOverrideOptions) NamespaceOptions() NamespaceOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NamespaceOptions") + ret0, _ := ret[0].(NamespaceOptions) + return ret0 +} + +// NamespaceOptions indicates an expected call of NamespaceOptions +func (mr *MockOverrideOptionsMockRecorder) NamespaceOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NamespaceOptions", reflect.TypeOf((*MockOverrideOptions)(nil).NamespaceOptions)) +} + +// SetNamespaceOptions mocks base method +func (m *MockOverrideOptions) SetNamespaceOptions(opts NamespaceOptions) OverrideOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetNamespaceOptions", opts) + ret0, _ := ret[0].(OverrideOptions) + return ret0 +} + +// SetNamespaceOptions indicates an expected call of SetNamespaceOptions +func (mr *MockOverrideOptionsMockRecorder) SetNamespaceOptions(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNamespaceOptions", reflect.TypeOf((*MockOverrideOptions)(nil).SetNamespaceOptions), opts) +} + +// MockWatch is a mock of Watch interface +type MockWatch struct { + ctrl *gomock.Controller + recorder *MockWatchMockRecorder +} + +// MockWatchMockRecorder is the mock recorder for MockWatch +type MockWatchMockRecorder struct { + mock *MockWatch +} + +// NewMockWatch creates a new mock instance +func NewMockWatch(ctrl *gomock.Controller) *MockWatch { + mock := &MockWatch{ctrl: ctrl} + mock.recorder = &MockWatchMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockWatch) EXPECT() *MockWatchMockRecorder { + return m.recorder +} + +// Close mocks base method +func (m *MockWatch) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockWatchMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockWatch)(nil).Close)) +} + +// C mocks base method +func (m *MockWatch) C() <-chan struct{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "C") + ret0, _ := ret[0].(<-chan struct{}) + return ret0 +} + +// C indicates an expected call of C +func (mr *MockWatchMockRecorder) C() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "C", reflect.TypeOf((*MockWatch)(nil).C)) +} + +// Get mocks base method +func (m *MockWatch) Get() Service { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(Service) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockWatchMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockWatch)(nil).Get)) +} + +// MockService is a mock of Service interface +type MockService struct { + ctrl *gomock.Controller + recorder *MockServiceMockRecorder +} + +// MockServiceMockRecorder is the mock recorder for MockService +type MockServiceMockRecorder struct { + mock *MockService +} + +// NewMockService creates a new mock instance +func NewMockService(ctrl *gomock.Controller) *MockService { + mock := &MockService{ctrl: ctrl} + mock.recorder = &MockServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockService) EXPECT() *MockServiceMockRecorder { + return m.recorder +} + +// Instance mocks base method +func (m *MockService) Instance(instanceID string) (ServiceInstance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Instance", instanceID) + ret0, _ := ret[0].(ServiceInstance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Instance indicates an expected call of Instance +func (mr *MockServiceMockRecorder) Instance(instanceID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Instance", reflect.TypeOf((*MockService)(nil).Instance), instanceID) +} + +// Instances mocks base method +func (m *MockService) Instances() []ServiceInstance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Instances") + ret0, _ := ret[0].([]ServiceInstance) + return ret0 +} + +// Instances indicates an expected call of Instances +func (mr *MockServiceMockRecorder) Instances() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Instances", reflect.TypeOf((*MockService)(nil).Instances)) +} + +// SetInstances mocks base method +func (m *MockService) SetInstances(insts []ServiceInstance) Service { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstances", insts) + ret0, _ := ret[0].(Service) + return ret0 +} + +// SetInstances indicates an expected call of SetInstances +func (mr *MockServiceMockRecorder) SetInstances(insts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstances", reflect.TypeOf((*MockService)(nil).SetInstances), insts) +} + +// Replication mocks base method +func (m *MockService) Replication() ServiceReplication { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Replication") + ret0, _ := ret[0].(ServiceReplication) + return ret0 +} + +// Replication indicates an expected call of Replication +func (mr *MockServiceMockRecorder) Replication() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Replication", reflect.TypeOf((*MockService)(nil).Replication)) +} + +// SetReplication mocks base method +func (m *MockService) SetReplication(r ServiceReplication) Service { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReplication", r) + ret0, _ := ret[0].(Service) + return ret0 +} + +// SetReplication indicates an expected call of SetReplication +func (mr *MockServiceMockRecorder) SetReplication(r interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReplication", reflect.TypeOf((*MockService)(nil).SetReplication), r) +} + +// Sharding mocks base method +func (m *MockService) Sharding() ServiceSharding { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Sharding") + ret0, _ := ret[0].(ServiceSharding) + return ret0 +} + +// Sharding indicates an expected call of Sharding +func (mr *MockServiceMockRecorder) Sharding() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Sharding", reflect.TypeOf((*MockService)(nil).Sharding)) +} + +// SetSharding mocks base method +func (m *MockService) SetSharding(s ServiceSharding) Service { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSharding", s) + ret0, _ := ret[0].(Service) + return ret0 +} + +// SetSharding indicates an expected call of SetSharding +func (mr *MockServiceMockRecorder) SetSharding(s interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSharding", reflect.TypeOf((*MockService)(nil).SetSharding), s) +} + +// MockServiceReplication is a mock of ServiceReplication interface +type MockServiceReplication struct { + ctrl *gomock.Controller + recorder *MockServiceReplicationMockRecorder +} + +// MockServiceReplicationMockRecorder is the mock recorder for MockServiceReplication +type MockServiceReplicationMockRecorder struct { + mock *MockServiceReplication +} + +// NewMockServiceReplication creates a new mock instance +func NewMockServiceReplication(ctrl *gomock.Controller) *MockServiceReplication { + mock := &MockServiceReplication{ctrl: ctrl} + mock.recorder = &MockServiceReplicationMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockServiceReplication) EXPECT() *MockServiceReplicationMockRecorder { + return m.recorder +} + +// Replicas mocks base method +func (m *MockServiceReplication) Replicas() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Replicas") + ret0, _ := ret[0].(int) + return ret0 +} + +// Replicas indicates an expected call of Replicas +func (mr *MockServiceReplicationMockRecorder) Replicas() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Replicas", reflect.TypeOf((*MockServiceReplication)(nil).Replicas)) +} + +// SetReplicas mocks base method +func (m *MockServiceReplication) SetReplicas(r int) ServiceReplication { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReplicas", r) + ret0, _ := ret[0].(ServiceReplication) + return ret0 +} + +// SetReplicas indicates an expected call of SetReplicas +func (mr *MockServiceReplicationMockRecorder) SetReplicas(r interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReplicas", reflect.TypeOf((*MockServiceReplication)(nil).SetReplicas), r) +} + +// MockServiceSharding is a mock of ServiceSharding interface +type MockServiceSharding struct { + ctrl *gomock.Controller + recorder *MockServiceShardingMockRecorder +} + +// MockServiceShardingMockRecorder is the mock recorder for MockServiceSharding +type MockServiceShardingMockRecorder struct { + mock *MockServiceSharding +} + +// NewMockServiceSharding creates a new mock instance +func NewMockServiceSharding(ctrl *gomock.Controller) *MockServiceSharding { + mock := &MockServiceSharding{ctrl: ctrl} + mock.recorder = &MockServiceShardingMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockServiceSharding) EXPECT() *MockServiceShardingMockRecorder { + return m.recorder +} + +// NumShards mocks base method +func (m *MockServiceSharding) NumShards() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumShards") + ret0, _ := ret[0].(int) + return ret0 +} + +// NumShards indicates an expected call of NumShards +func (mr *MockServiceShardingMockRecorder) NumShards() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumShards", reflect.TypeOf((*MockServiceSharding)(nil).NumShards)) +} + +// SetNumShards mocks base method +func (m *MockServiceSharding) SetNumShards(n int) ServiceSharding { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetNumShards", n) + ret0, _ := ret[0].(ServiceSharding) + return ret0 +} + +// SetNumShards indicates an expected call of SetNumShards +func (mr *MockServiceShardingMockRecorder) SetNumShards(n interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNumShards", reflect.TypeOf((*MockServiceSharding)(nil).SetNumShards), n) +} + +// IsSharded mocks base method +func (m *MockServiceSharding) IsSharded() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsSharded") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsSharded indicates an expected call of IsSharded +func (mr *MockServiceShardingMockRecorder) IsSharded() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSharded", reflect.TypeOf((*MockServiceSharding)(nil).IsSharded)) +} + +// SetIsSharded mocks base method +func (m *MockServiceSharding) SetIsSharded(s bool) ServiceSharding { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIsSharded", s) + ret0, _ := ret[0].(ServiceSharding) + return ret0 +} + +// SetIsSharded indicates an expected call of SetIsSharded +func (mr *MockServiceShardingMockRecorder) SetIsSharded(s interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIsSharded", reflect.TypeOf((*MockServiceSharding)(nil).SetIsSharded), s) +} + +// MockServiceInstance is a mock of ServiceInstance interface +type MockServiceInstance struct { + ctrl *gomock.Controller + recorder *MockServiceInstanceMockRecorder +} + +// MockServiceInstanceMockRecorder is the mock recorder for MockServiceInstance +type MockServiceInstanceMockRecorder struct { + mock *MockServiceInstance +} + +// NewMockServiceInstance creates a new mock instance +func NewMockServiceInstance(ctrl *gomock.Controller) *MockServiceInstance { + mock := &MockServiceInstance{ctrl: ctrl} + mock.recorder = &MockServiceInstanceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockServiceInstance) EXPECT() *MockServiceInstanceMockRecorder { + return m.recorder +} + +// ServiceID mocks base method +func (m *MockServiceInstance) ServiceID() ServiceID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ServiceID") + ret0, _ := ret[0].(ServiceID) + return ret0 +} + +// ServiceID indicates an expected call of ServiceID +func (mr *MockServiceInstanceMockRecorder) ServiceID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServiceID", reflect.TypeOf((*MockServiceInstance)(nil).ServiceID)) +} + +// SetServiceID mocks base method +func (m *MockServiceInstance) SetServiceID(service ServiceID) ServiceInstance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetServiceID", service) + ret0, _ := ret[0].(ServiceInstance) + return ret0 +} + +// SetServiceID indicates an expected call of SetServiceID +func (mr *MockServiceInstanceMockRecorder) SetServiceID(service interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetServiceID", reflect.TypeOf((*MockServiceInstance)(nil).SetServiceID), service) +} + +// InstanceID mocks base method +func (m *MockServiceInstance) InstanceID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstanceID") + ret0, _ := ret[0].(string) + return ret0 +} + +// InstanceID indicates an expected call of InstanceID +func (mr *MockServiceInstanceMockRecorder) InstanceID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstanceID", reflect.TypeOf((*MockServiceInstance)(nil).InstanceID)) +} + +// SetInstanceID mocks base method +func (m *MockServiceInstance) SetInstanceID(id string) ServiceInstance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstanceID", id) + ret0, _ := ret[0].(ServiceInstance) + return ret0 +} + +// SetInstanceID indicates an expected call of SetInstanceID +func (mr *MockServiceInstanceMockRecorder) SetInstanceID(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstanceID", reflect.TypeOf((*MockServiceInstance)(nil).SetInstanceID), id) +} + +// Endpoint mocks base method +func (m *MockServiceInstance) Endpoint() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Endpoint") + ret0, _ := ret[0].(string) + return ret0 +} + +// Endpoint indicates an expected call of Endpoint +func (mr *MockServiceInstanceMockRecorder) Endpoint() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Endpoint", reflect.TypeOf((*MockServiceInstance)(nil).Endpoint)) +} + +// SetEndpoint mocks base method +func (m *MockServiceInstance) SetEndpoint(e string) ServiceInstance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEndpoint", e) + ret0, _ := ret[0].(ServiceInstance) + return ret0 +} + +// SetEndpoint indicates an expected call of SetEndpoint +func (mr *MockServiceInstanceMockRecorder) SetEndpoint(e interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEndpoint", reflect.TypeOf((*MockServiceInstance)(nil).SetEndpoint), e) +} + +// Shards mocks base method +func (m *MockServiceInstance) Shards() shard.Shards { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Shards") + ret0, _ := ret[0].(shard.Shards) + return ret0 +} + +// Shards indicates an expected call of Shards +func (mr *MockServiceInstanceMockRecorder) Shards() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shards", reflect.TypeOf((*MockServiceInstance)(nil).Shards)) +} + +// SetShards mocks base method +func (m *MockServiceInstance) SetShards(s shard.Shards) ServiceInstance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetShards", s) + ret0, _ := ret[0].(ServiceInstance) + return ret0 +} + +// SetShards indicates an expected call of SetShards +func (mr *MockServiceInstanceMockRecorder) SetShards(s interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetShards", reflect.TypeOf((*MockServiceInstance)(nil).SetShards), s) +} + +// MockAdvertisement is a mock of Advertisement interface +type MockAdvertisement struct { + ctrl *gomock.Controller + recorder *MockAdvertisementMockRecorder +} + +// MockAdvertisementMockRecorder is the mock recorder for MockAdvertisement +type MockAdvertisementMockRecorder struct { + mock *MockAdvertisement +} + +// NewMockAdvertisement creates a new mock instance +func NewMockAdvertisement(ctrl *gomock.Controller) *MockAdvertisement { + mock := &MockAdvertisement{ctrl: ctrl} + mock.recorder = &MockAdvertisementMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAdvertisement) EXPECT() *MockAdvertisementMockRecorder { + return m.recorder +} + +// ServiceID mocks base method +func (m *MockAdvertisement) ServiceID() ServiceID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ServiceID") + ret0, _ := ret[0].(ServiceID) + return ret0 +} + +// ServiceID indicates an expected call of ServiceID +func (mr *MockAdvertisementMockRecorder) ServiceID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServiceID", reflect.TypeOf((*MockAdvertisement)(nil).ServiceID)) +} + +// SetServiceID mocks base method +func (m *MockAdvertisement) SetServiceID(service ServiceID) Advertisement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetServiceID", service) + ret0, _ := ret[0].(Advertisement) + return ret0 +} + +// SetServiceID indicates an expected call of SetServiceID +func (mr *MockAdvertisementMockRecorder) SetServiceID(service interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetServiceID", reflect.TypeOf((*MockAdvertisement)(nil).SetServiceID), service) +} + +// Health mocks base method +func (m *MockAdvertisement) Health() func() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Health") + ret0, _ := ret[0].(func() error) + return ret0 +} + +// Health indicates an expected call of Health +func (mr *MockAdvertisementMockRecorder) Health() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Health", reflect.TypeOf((*MockAdvertisement)(nil).Health)) +} + +// SetHealth mocks base method +func (m *MockAdvertisement) SetHealth(health func() error) Advertisement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHealth", health) + ret0, _ := ret[0].(Advertisement) + return ret0 +} + +// SetHealth indicates an expected call of SetHealth +func (mr *MockAdvertisementMockRecorder) SetHealth(health interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHealth", reflect.TypeOf((*MockAdvertisement)(nil).SetHealth), health) +} + +// PlacementInstance mocks base method +func (m *MockAdvertisement) PlacementInstance() placement.Instance { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PlacementInstance") + ret0, _ := ret[0].(placement.Instance) + return ret0 +} + +// PlacementInstance indicates an expected call of PlacementInstance +func (mr *MockAdvertisementMockRecorder) PlacementInstance() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PlacementInstance", reflect.TypeOf((*MockAdvertisement)(nil).PlacementInstance)) +} + +// SetPlacementInstance mocks base method +func (m *MockAdvertisement) SetPlacementInstance(p placement.Instance) Advertisement { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPlacementInstance", p) + ret0, _ := ret[0].(Advertisement) + return ret0 +} + +// SetPlacementInstance indicates an expected call of SetPlacementInstance +func (mr *MockAdvertisementMockRecorder) SetPlacementInstance(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPlacementInstance", reflect.TypeOf((*MockAdvertisement)(nil).SetPlacementInstance), p) +} + +// MockServiceID is a mock of ServiceID interface +type MockServiceID struct { + ctrl *gomock.Controller + recorder *MockServiceIDMockRecorder +} + +// MockServiceIDMockRecorder is the mock recorder for MockServiceID +type MockServiceIDMockRecorder struct { + mock *MockServiceID +} + +// NewMockServiceID creates a new mock instance +func NewMockServiceID(ctrl *gomock.Controller) *MockServiceID { + mock := &MockServiceID{ctrl: ctrl} + mock.recorder = &MockServiceIDMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockServiceID) EXPECT() *MockServiceIDMockRecorder { + return m.recorder +} + +// Name mocks base method +func (m *MockServiceID) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name +func (mr *MockServiceIDMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockServiceID)(nil).Name)) +} + +// SetName mocks base method +func (m *MockServiceID) SetName(s string) ServiceID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetName", s) + ret0, _ := ret[0].(ServiceID) + return ret0 +} + +// SetName indicates an expected call of SetName +func (mr *MockServiceIDMockRecorder) SetName(s interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetName", reflect.TypeOf((*MockServiceID)(nil).SetName), s) +} + +// Environment mocks base method +func (m *MockServiceID) Environment() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Environment") + ret0, _ := ret[0].(string) + return ret0 +} + +// Environment indicates an expected call of Environment +func (mr *MockServiceIDMockRecorder) Environment() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Environment", reflect.TypeOf((*MockServiceID)(nil).Environment)) +} + +// SetEnvironment mocks base method +func (m *MockServiceID) SetEnvironment(env string) ServiceID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEnvironment", env) + ret0, _ := ret[0].(ServiceID) + return ret0 +} + +// SetEnvironment indicates an expected call of SetEnvironment +func (mr *MockServiceIDMockRecorder) SetEnvironment(env interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEnvironment", reflect.TypeOf((*MockServiceID)(nil).SetEnvironment), env) +} + +// Zone mocks base method +func (m *MockServiceID) Zone() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Zone") + ret0, _ := ret[0].(string) + return ret0 +} + +// Zone indicates an expected call of Zone +func (mr *MockServiceIDMockRecorder) Zone() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Zone", reflect.TypeOf((*MockServiceID)(nil).Zone)) +} + +// SetZone mocks base method +func (m *MockServiceID) SetZone(zone string) ServiceID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetZone", zone) + ret0, _ := ret[0].(ServiceID) + return ret0 +} + +// SetZone indicates an expected call of SetZone +func (mr *MockServiceIDMockRecorder) SetZone(zone interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetZone", reflect.TypeOf((*MockServiceID)(nil).SetZone), zone) +} + +// Equal mocks base method +func (m *MockServiceID) Equal(value ServiceID) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", value) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockServiceIDMockRecorder) Equal(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockServiceID)(nil).Equal), value) +} + +// String mocks base method +func (m *MockServiceID) String() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "String") + ret0, _ := ret[0].(string) + return ret0 +} + +// String indicates an expected call of String +func (mr *MockServiceIDMockRecorder) String() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockServiceID)(nil).String)) +} + +// MockQueryOptions is a mock of QueryOptions interface +type MockQueryOptions struct { + ctrl *gomock.Controller + recorder *MockQueryOptionsMockRecorder +} + +// MockQueryOptionsMockRecorder is the mock recorder for MockQueryOptions +type MockQueryOptionsMockRecorder struct { + mock *MockQueryOptions +} + +// NewMockQueryOptions creates a new mock instance +func NewMockQueryOptions(ctrl *gomock.Controller) *MockQueryOptions { + mock := &MockQueryOptions{ctrl: ctrl} + mock.recorder = &MockQueryOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockQueryOptions) EXPECT() *MockQueryOptionsMockRecorder { + return m.recorder +} + +// IncludeUnhealthy mocks base method +func (m *MockQueryOptions) IncludeUnhealthy() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IncludeUnhealthy") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IncludeUnhealthy indicates an expected call of IncludeUnhealthy +func (mr *MockQueryOptionsMockRecorder) IncludeUnhealthy() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IncludeUnhealthy", reflect.TypeOf((*MockQueryOptions)(nil).IncludeUnhealthy)) +} + +// SetIncludeUnhealthy mocks base method +func (m *MockQueryOptions) SetIncludeUnhealthy(h bool) QueryOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIncludeUnhealthy", h) + ret0, _ := ret[0].(QueryOptions) + return ret0 +} + +// SetIncludeUnhealthy indicates an expected call of SetIncludeUnhealthy +func (mr *MockQueryOptionsMockRecorder) SetIncludeUnhealthy(h interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIncludeUnhealthy", reflect.TypeOf((*MockQueryOptions)(nil).SetIncludeUnhealthy), h) +} + +// MockMetadata is a mock of Metadata interface +type MockMetadata struct { + ctrl *gomock.Controller + recorder *MockMetadataMockRecorder +} + +// MockMetadataMockRecorder is the mock recorder for MockMetadata +type MockMetadataMockRecorder struct { + mock *MockMetadata +} + +// NewMockMetadata creates a new mock instance +func NewMockMetadata(ctrl *gomock.Controller) *MockMetadata { + mock := &MockMetadata{ctrl: ctrl} + mock.recorder = &MockMetadataMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMetadata) EXPECT() *MockMetadataMockRecorder { + return m.recorder +} + +// String mocks base method +func (m *MockMetadata) String() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "String") + ret0, _ := ret[0].(string) + return ret0 +} + +// String indicates an expected call of String +func (mr *MockMetadataMockRecorder) String() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockMetadata)(nil).String)) +} + +// Port mocks base method +func (m *MockMetadata) Port() uint32 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Port") + ret0, _ := ret[0].(uint32) + return ret0 +} + +// Port indicates an expected call of Port +func (mr *MockMetadataMockRecorder) Port() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Port", reflect.TypeOf((*MockMetadata)(nil).Port)) +} + +// SetPort mocks base method +func (m *MockMetadata) SetPort(p uint32) Metadata { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPort", p) + ret0, _ := ret[0].(Metadata) + return ret0 +} + +// SetPort indicates an expected call of SetPort +func (mr *MockMetadataMockRecorder) SetPort(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPort", reflect.TypeOf((*MockMetadata)(nil).SetPort), p) +} + +// LivenessInterval mocks base method +func (m *MockMetadata) LivenessInterval() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LivenessInterval") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// LivenessInterval indicates an expected call of LivenessInterval +func (mr *MockMetadataMockRecorder) LivenessInterval() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LivenessInterval", reflect.TypeOf((*MockMetadata)(nil).LivenessInterval)) +} + +// SetLivenessInterval mocks base method +func (m *MockMetadata) SetLivenessInterval(l time.Duration) Metadata { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetLivenessInterval", l) + ret0, _ := ret[0].(Metadata) + return ret0 +} + +// SetLivenessInterval indicates an expected call of SetLivenessInterval +func (mr *MockMetadataMockRecorder) SetLivenessInterval(l interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLivenessInterval", reflect.TypeOf((*MockMetadata)(nil).SetLivenessInterval), l) +} + +// HeartbeatInterval mocks base method +func (m *MockMetadata) HeartbeatInterval() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HeartbeatInterval") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// HeartbeatInterval indicates an expected call of HeartbeatInterval +func (mr *MockMetadataMockRecorder) HeartbeatInterval() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeartbeatInterval", reflect.TypeOf((*MockMetadata)(nil).HeartbeatInterval)) +} + +// SetHeartbeatInterval mocks base method +func (m *MockMetadata) SetHeartbeatInterval(h time.Duration) Metadata { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHeartbeatInterval", h) + ret0, _ := ret[0].(Metadata) + return ret0 +} + +// SetHeartbeatInterval indicates an expected call of SetHeartbeatInterval +func (mr *MockMetadataMockRecorder) SetHeartbeatInterval(h interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHeartbeatInterval", reflect.TypeOf((*MockMetadata)(nil).SetHeartbeatInterval), h) +} + +// Proto mocks base method +func (m *MockMetadata) Proto() (*metadatapb.Metadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Proto") + ret0, _ := ret[0].(*metadatapb.Metadata) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Proto indicates an expected call of Proto +func (mr *MockMetadataMockRecorder) Proto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Proto", reflect.TypeOf((*MockMetadata)(nil).Proto)) +} + +// MockHeartbeatService is a mock of HeartbeatService interface +type MockHeartbeatService struct { + ctrl *gomock.Controller + recorder *MockHeartbeatServiceMockRecorder +} + +// MockHeartbeatServiceMockRecorder is the mock recorder for MockHeartbeatService +type MockHeartbeatServiceMockRecorder struct { + mock *MockHeartbeatService +} + +// NewMockHeartbeatService creates a new mock instance +func NewMockHeartbeatService(ctrl *gomock.Controller) *MockHeartbeatService { + mock := &MockHeartbeatService{ctrl: ctrl} + mock.recorder = &MockHeartbeatServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockHeartbeatService) EXPECT() *MockHeartbeatServiceMockRecorder { + return m.recorder +} + +// Heartbeat mocks base method +func (m *MockHeartbeatService) Heartbeat(instance placement.Instance, ttl time.Duration) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Heartbeat", instance, ttl) + ret0, _ := ret[0].(error) + return ret0 +} + +// Heartbeat indicates an expected call of Heartbeat +func (mr *MockHeartbeatServiceMockRecorder) Heartbeat(instance, ttl interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Heartbeat", reflect.TypeOf((*MockHeartbeatService)(nil).Heartbeat), instance, ttl) +} + +// Get mocks base method +func (m *MockHeartbeatService) Get() ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get +func (mr *MockHeartbeatServiceMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockHeartbeatService)(nil).Get)) +} + +// GetInstances mocks base method +func (m *MockHeartbeatService) GetInstances() ([]placement.Instance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetInstances") + ret0, _ := ret[0].([]placement.Instance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetInstances indicates an expected call of GetInstances +func (mr *MockHeartbeatServiceMockRecorder) GetInstances() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetInstances", reflect.TypeOf((*MockHeartbeatService)(nil).GetInstances)) +} + +// Delete mocks base method +func (m *MockHeartbeatService) Delete(instance string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", instance) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete +func (mr *MockHeartbeatServiceMockRecorder) Delete(instance interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockHeartbeatService)(nil).Delete), instance) +} + +// Watch mocks base method +func (m *MockHeartbeatService) Watch() (watch.Watch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch") + ret0, _ := ret[0].(watch.Watch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Watch indicates an expected call of Watch +func (mr *MockHeartbeatServiceMockRecorder) Watch() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockHeartbeatService)(nil).Watch)) +} + +// MockElectionOptions is a mock of ElectionOptions interface +type MockElectionOptions struct { + ctrl *gomock.Controller + recorder *MockElectionOptionsMockRecorder +} + +// MockElectionOptionsMockRecorder is the mock recorder for MockElectionOptions +type MockElectionOptionsMockRecorder struct { + mock *MockElectionOptions +} + +// NewMockElectionOptions creates a new mock instance +func NewMockElectionOptions(ctrl *gomock.Controller) *MockElectionOptions { + mock := &MockElectionOptions{ctrl: ctrl} + mock.recorder = &MockElectionOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockElectionOptions) EXPECT() *MockElectionOptionsMockRecorder { + return m.recorder +} + +// LeaderTimeout mocks base method +func (m *MockElectionOptions) LeaderTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LeaderTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// LeaderTimeout indicates an expected call of LeaderTimeout +func (mr *MockElectionOptionsMockRecorder) LeaderTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LeaderTimeout", reflect.TypeOf((*MockElectionOptions)(nil).LeaderTimeout)) +} + +// SetLeaderTimeout mocks base method +func (m *MockElectionOptions) SetLeaderTimeout(t time.Duration) ElectionOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetLeaderTimeout", t) + ret0, _ := ret[0].(ElectionOptions) + return ret0 +} + +// SetLeaderTimeout indicates an expected call of SetLeaderTimeout +func (mr *MockElectionOptionsMockRecorder) SetLeaderTimeout(t interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLeaderTimeout", reflect.TypeOf((*MockElectionOptions)(nil).SetLeaderTimeout), t) +} + +// ResignTimeout mocks base method +func (m *MockElectionOptions) ResignTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ResignTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// ResignTimeout indicates an expected call of ResignTimeout +func (mr *MockElectionOptionsMockRecorder) ResignTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResignTimeout", reflect.TypeOf((*MockElectionOptions)(nil).ResignTimeout)) +} + +// SetResignTimeout mocks base method +func (m *MockElectionOptions) SetResignTimeout(t time.Duration) ElectionOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetResignTimeout", t) + ret0, _ := ret[0].(ElectionOptions) + return ret0 +} + +// SetResignTimeout indicates an expected call of SetResignTimeout +func (mr *MockElectionOptionsMockRecorder) SetResignTimeout(t interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetResignTimeout", reflect.TypeOf((*MockElectionOptions)(nil).SetResignTimeout), t) +} + +// TTLSecs mocks base method +func (m *MockElectionOptions) TTLSecs() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TTLSecs") + ret0, _ := ret[0].(int) + return ret0 +} + +// TTLSecs indicates an expected call of TTLSecs +func (mr *MockElectionOptionsMockRecorder) TTLSecs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TTLSecs", reflect.TypeOf((*MockElectionOptions)(nil).TTLSecs)) +} + +// SetTTLSecs mocks base method +func (m *MockElectionOptions) SetTTLSecs(ttl int) ElectionOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTTLSecs", ttl) + ret0, _ := ret[0].(ElectionOptions) + return ret0 +} + +// SetTTLSecs indicates an expected call of SetTTLSecs +func (mr *MockElectionOptionsMockRecorder) SetTTLSecs(ttl interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTTLSecs", reflect.TypeOf((*MockElectionOptions)(nil).SetTTLSecs), ttl) +} + +// MockCampaignOptions is a mock of CampaignOptions interface +type MockCampaignOptions struct { + ctrl *gomock.Controller + recorder *MockCampaignOptionsMockRecorder +} + +// MockCampaignOptionsMockRecorder is the mock recorder for MockCampaignOptions +type MockCampaignOptionsMockRecorder struct { + mock *MockCampaignOptions +} + +// NewMockCampaignOptions creates a new mock instance +func NewMockCampaignOptions(ctrl *gomock.Controller) *MockCampaignOptions { + mock := &MockCampaignOptions{ctrl: ctrl} + mock.recorder = &MockCampaignOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockCampaignOptions) EXPECT() *MockCampaignOptionsMockRecorder { + return m.recorder +} + +// LeaderValue mocks base method +func (m *MockCampaignOptions) LeaderValue() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LeaderValue") + ret0, _ := ret[0].(string) + return ret0 +} + +// LeaderValue indicates an expected call of LeaderValue +func (mr *MockCampaignOptionsMockRecorder) LeaderValue() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LeaderValue", reflect.TypeOf((*MockCampaignOptions)(nil).LeaderValue)) +} + +// SetLeaderValue mocks base method +func (m *MockCampaignOptions) SetLeaderValue(v string) CampaignOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetLeaderValue", v) + ret0, _ := ret[0].(CampaignOptions) + return ret0 +} + +// SetLeaderValue indicates an expected call of SetLeaderValue +func (mr *MockCampaignOptionsMockRecorder) SetLeaderValue(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLeaderValue", reflect.TypeOf((*MockCampaignOptions)(nil).SetLeaderValue), v) +} + +// MockLeaderService is a mock of LeaderService interface +type MockLeaderService struct { + ctrl *gomock.Controller + recorder *MockLeaderServiceMockRecorder +} + +// MockLeaderServiceMockRecorder is the mock recorder for MockLeaderService +type MockLeaderServiceMockRecorder struct { + mock *MockLeaderService +} + +// NewMockLeaderService creates a new mock instance +func NewMockLeaderService(ctrl *gomock.Controller) *MockLeaderService { + mock := &MockLeaderService{ctrl: ctrl} + mock.recorder = &MockLeaderServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockLeaderService) EXPECT() *MockLeaderServiceMockRecorder { + return m.recorder +} + +// Close mocks base method +func (m *MockLeaderService) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockLeaderServiceMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockLeaderService)(nil).Close)) +} + +// Campaign mocks base method +func (m *MockLeaderService) Campaign(electionID string, opts CampaignOptions) (<-chan campaign.Status, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Campaign", electionID, opts) + ret0, _ := ret[0].(<-chan campaign.Status) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Campaign indicates an expected call of Campaign +func (mr *MockLeaderServiceMockRecorder) Campaign(electionID, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Campaign", reflect.TypeOf((*MockLeaderService)(nil).Campaign), electionID, opts) +} + +// Resign mocks base method +func (m *MockLeaderService) Resign(electionID string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Resign", electionID) + ret0, _ := ret[0].(error) + return ret0 +} + +// Resign indicates an expected call of Resign +func (mr *MockLeaderServiceMockRecorder) Resign(electionID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Resign", reflect.TypeOf((*MockLeaderService)(nil).Resign), electionID) +} + +// Leader mocks base method +func (m *MockLeaderService) Leader(electionID string) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Leader", electionID) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Leader indicates an expected call of Leader +func (mr *MockLeaderServiceMockRecorder) Leader(electionID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Leader", reflect.TypeOf((*MockLeaderService)(nil).Leader), electionID) +} + +// Observe mocks base method +func (m *MockLeaderService) Observe(electionID string) (<-chan string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Observe", electionID) + ret0, _ := ret[0].(<-chan string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Observe indicates an expected call of Observe +func (mr *MockLeaderServiceMockRecorder) Observe(electionID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Observe", reflect.TypeOf((*MockLeaderService)(nil).Observe), electionID) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/types.go b/vendor/github.com/m3db/m3/src/cluster/services/types.go new file mode 100644 index 00000000..964d5688 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/types.go @@ -0,0 +1,397 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package services + +import ( + "time" + + "github.com/m3db/m3/src/cluster/generated/proto/metadatapb" + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/placement" + "github.com/m3db/m3/src/cluster/services/leader/campaign" + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/x/instrument" + xwatch "github.com/m3db/m3/src/x/watch" +) + +// Services provides access to the service topology. +type Services interface { + // Advertise advertises the availability of an instance of a service. + Advertise(ad Advertisement) error + + // Unadvertise indicates a given instance is no longer available. + Unadvertise(service ServiceID, id string) error + + // Query returns the topology for a given service. + Query(service ServiceID, opts QueryOptions) (Service, error) + + // Watch returns a watch on metadata and a list of available instances for a given service. + Watch(service ServiceID, opts QueryOptions) (Watch, error) + + // Metadata returns the metadata for a given service. + Metadata(sid ServiceID) (Metadata, error) + + // SetMetadata sets the metadata for a given service. + SetMetadata(sid ServiceID, m Metadata) error + + // DeleteMetadata deletes the metadata for a given service + DeleteMetadata(sid ServiceID) error + + // PlacementService returns a client of placement.Service. + PlacementService(sid ServiceID, popts placement.Options) (placement.Service, error) + + // HeartbeatService returns a heartbeat store for the given service. + HeartbeatService(service ServiceID) (HeartbeatService, error) + + // LeaderService returns an instance of a leader service for the given + // service ID. + LeaderService(service ServiceID, opts ElectionOptions) (LeaderService, error) +} + +// KVGen generates a kv store for a given zone. +type KVGen func(zone string) (kv.Store, error) + +// HeartbeatGen generates a heartbeat store for a given zone. +type HeartbeatGen func(sid ServiceID) (HeartbeatService, error) + +// LeaderGen generates a leader service instance for a given service. +type LeaderGen func(sid ServiceID, opts ElectionOptions) (LeaderService, error) + +// Options are options for the client of Services. +type Options interface { + // InitTimeout is the max time to wait on a new service watch for a valid initial value. + // If the value is set to 0, then no wait will be done and the watch could return empty value. + InitTimeout() time.Duration + + // SetInitTimeout sets the InitTimeout. + SetInitTimeout(t time.Duration) Options + + // KVGen is the function to generate a kv store for a given zone. + KVGen() KVGen + + // SetKVGen sets the KVGen. + SetKVGen(gen KVGen) Options + + // HeartbeatGen is the function to generate a heartbeat store for a given zone. + HeartbeatGen() HeartbeatGen + + // SetHeartbeatGen sets the HeartbeatGen. + SetHeartbeatGen(gen HeartbeatGen) Options + + // LeaderGen is the function to generate a leader service instance for a + // given service. + LeaderGen() LeaderGen + + // SetLeaderGen sets the leader generation function. + SetLeaderGen(gen LeaderGen) Options + + // InstrumentsOptions is the instrument options. + InstrumentsOptions() instrument.Options + + // SetInstrumentsOptions sets the InstrumentsOptions. + SetInstrumentsOptions(iopts instrument.Options) Options + + // NamespaceOptions is the custom namespaces. + NamespaceOptions() NamespaceOptions + + // SetNamespaceOptions sets the NamespaceOptions. + SetNamespaceOptions(opts NamespaceOptions) Options + + // Validate validates the Options. + Validate() error +} + +// NamespaceOptions are options to provide custom namespaces in service discovery service. +// TODO(cw): Provide overrides for leader service and heartbeat service. +type NamespaceOptions interface { + // PlacementNamespace is the custom namespace for placement. + PlacementNamespace() string + + // SetPlacementNamespace sets the custom namespace for placement. + SetPlacementNamespace(v string) NamespaceOptions + + // MetadataNamespace is the custom namespace for metadata. + MetadataNamespace() string + + // SetMetadataNamespace sets the custom namespace for metadata. + SetMetadataNamespace(v string) NamespaceOptions +} + +// OverrideOptions configs the override for service discovery. +type OverrideOptions interface { + // NamespaceOptions is the namespace options. + NamespaceOptions() NamespaceOptions + + // SetNamespaceOptions sets namespace options. + SetNamespaceOptions(opts NamespaceOptions) OverrideOptions +} + +// Watch is a watcher that issues notification when a service is updated. +type Watch interface { + // Close closes the watch. + Close() + + // C returns the notification channel. + C() <-chan struct{} + + // Get returns the latest service of the service watchable. + Get() Service +} + +// Service describes the metadata and instances of a service. +type Service interface { + // Instance returns the service instance with the instance id. + Instance(instanceID string) (ServiceInstance, error) + + // Instances returns the service instances. + Instances() []ServiceInstance + + // SetInstances sets the service instances. + SetInstances(insts []ServiceInstance) Service + + // Replication returns the service replication description or nil if none. + Replication() ServiceReplication + + // SetReplication sets the service replication description or nil if none. + SetReplication(r ServiceReplication) Service + + // Sharding returns the service sharding description or nil if none. + Sharding() ServiceSharding + + // SetSharding sets the service sharding description or nil if none + SetSharding(s ServiceSharding) Service +} + +// ServiceReplication describes the replication of a service. +type ServiceReplication interface { + // Replicas is the count of replicas. + Replicas() int + + // SetReplicas sets the count of replicas. + SetReplicas(r int) ServiceReplication +} + +// ServiceSharding describes the sharding of a service. +type ServiceSharding interface { + // NumShards is the number of shards to use for sharding. + NumShards() int + + // SetNumShards sets the number of shards to use for sharding. + SetNumShards(n int) ServiceSharding + + // IsSharded() returns whether this service is sharded. + IsSharded() bool + + // SetIsSharded sets IsSharded. + SetIsSharded(s bool) ServiceSharding +} + +// ServiceInstance is a single instance of a service. +type ServiceInstance interface { + // ServiceID returns the service id of the instance. + ServiceID() ServiceID + + // SetServiceID sets the service id of the instance. + SetServiceID(service ServiceID) ServiceInstance + + // InstanceID returns the id of the instance. + InstanceID() string + + // SetInstanceID sets the id of the instance. + SetInstanceID(id string) ServiceInstance + + // Endpoint returns the endpoint of the instance. + Endpoint() string + + // SetEndpoint sets the endpoint of the instance. + SetEndpoint(e string) ServiceInstance + + // Shards returns the shards of the instance. + Shards() shard.Shards + + // SetShards sets the shards of the instance. + SetShards(s shard.Shards) ServiceInstance +} + +// Advertisement advertises the availability of a given instance of a service. +type Advertisement interface { + // the service being advertised. + ServiceID() ServiceID + + // sets the service being advertised. + SetServiceID(service ServiceID) Advertisement + + // optional health function, return an error to indicate unhealthy. + Health() func() error + + // sets the health function for the advertised instance. + SetHealth(health func() error) Advertisement + + // PlacementInstance returns the placement instance associated with this advertisement, which + // contains the ID of the instance advertising and all other relevant fields. + PlacementInstance() placement.Instance + + // SetPlacementInstance sets the Instance that is advertising. + SetPlacementInstance(p placement.Instance) Advertisement +} + +// ServiceID contains the fields required to id a service. +type ServiceID interface { + // Name returns the service name of the ServiceID. + Name() string + + // SetName sets the service name of the ServiceID. + SetName(s string) ServiceID + + // Environment returns the environment of the ServiceID. + Environment() string + + // SetEnvironment sets the environment of the ServiceID. + SetEnvironment(env string) ServiceID + + // Zone returns the zone of the ServiceID. + Zone() string + + // SetZone sets the zone of the ServiceID. + SetZone(zone string) ServiceID + + // Equal retruns if the service IDs are equivalent. + Equal(value ServiceID) bool + + // String returns a description of the ServiceID. + String() string +} + +// QueryOptions are options to service discovery queries. +type QueryOptions interface { + // IncludeUnhealthy decides whether unhealthy instances should be returned. + IncludeUnhealthy() bool + + // SetIncludeUnhealthy sets the value of IncludeUnhealthy. + SetIncludeUnhealthy(h bool) QueryOptions +} + +// Metadata contains the metadata for a service. +type Metadata interface { + // String returns a description of the metadata. + String() string + + // Port returns the port to be used to contact the service. + Port() uint32 + + // SetPort sets the port. + SetPort(p uint32) Metadata + + // LivenessInterval is the ttl interval for an instance to be considered as healthy. + LivenessInterval() time.Duration + + // SetLivenessInterval sets the LivenessInterval. + SetLivenessInterval(l time.Duration) Metadata + + // HeartbeatInterval is the interval for heatbeats. + HeartbeatInterval() time.Duration + + // SetHeartbeatInterval sets the HeartbeatInterval. + SetHeartbeatInterval(h time.Duration) Metadata + + // Proto returns the proto representation for the Metadata. + Proto() (*metadatapb.Metadata, error) +} + +// HeartbeatService manages heartbeating instances. +type HeartbeatService interface { + // Heartbeat sends heartbeat for a service instance with a ttl. + Heartbeat(instance placement.Instance, ttl time.Duration) error + + // Get gets healthy instances for a service. + Get() ([]string, error) + + // GetInstances returns a deserialized list of healthy Instances. + GetInstances() ([]placement.Instance, error) + + // Delete deletes the heartbeat for a service instance. + Delete(instance string) error + + // Watch watches the heartbeats for a service. + Watch() (xwatch.Watch, error) +} + +// ElectionOptions configure specific election-scoped options. +type ElectionOptions interface { + // Duration after which a call to Leader() will timeout if no response + // returned from etcd. Defaults to 30 seconds. + LeaderTimeout() time.Duration + SetLeaderTimeout(t time.Duration) ElectionOptions + + // Duration after which a call to Resign() will timeout if no response + // returned from etcd. Defaults to 30 seconds. + ResignTimeout() time.Duration + SetResignTimeout(t time.Duration) ElectionOptions + + // TTL returns the TTL used for campaigns. By default (ttl == 0), etcd will + // set the TTL to 60s. + TTLSecs() int + SetTTLSecs(ttl int) ElectionOptions +} + +// CampaignOptions provide the ability to override campaign defaults. +type CampaignOptions interface { + // LeaderValue allows the user to override the value a campaign announces + // (that is, the value an observer sees upon calling Leader()). This + // defaults to the hostname of the caller. + LeaderValue() string + SetLeaderValue(v string) CampaignOptions +} + +// LeaderService provides access to etcd-backed leader elections. +type LeaderService interface { + // Close closes the election service client entirely. No more campaigns can be + // started and any outstanding campaigns are closed. + Close() error + + // Campaign proposes that the caller become the leader for a specified + // election, with its leadership being refreshed on an interval according to + // the ElectionOptions the service was created with. It returns a read-only + // channel of campaign status events that is closed when the user resigns + // leadership or the campaign is invalidated due to background session + // expiration (i.e. failing to refresh etcd leadership lease). The caller + // MUST consume this channel until it is closed or risk goroutine leaks. + // Users are encouraged to read the package docs of services/leader for + // advice on proper usage and common gotchas. + // + // The leader will announce its hostname to observers unless opts is non-nil + // and opts.LeaderValue() is non-empty. + Campaign(electionID string, opts CampaignOptions) (<-chan campaign.Status, error) + + // Resign gives up leadership of a specified election if the caller is the + // current leader (if the caller is not the leader an error is returned). + Resign(electionID string) error + + // Leader returns the current leader of a specified election (if there is no + // leader then leader.ErrNoLeader is returned). + Leader(electionID string) (string, error) + + // Observe returns a channel on which leader updates for a specified election + // will be returned. If no one is campaigning for the given election the call + // will still succeed and the channel will receive its first update when an + // election is started. + Observe(electionID string) (<-chan string, error) +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/util.go b/vendor/github.com/m3db/m3/src/cluster/services/util.go new file mode 100644 index 00000000..01b361ce --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/util.go @@ -0,0 +1,101 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package services + +import ( + "fmt" + + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/placement" +) + +const ( + placementPrefix = "_sd.placement" + metadataPrefix = "_sd.metadata" + keyFormat = "%s/%s" +) + +type keyFn func(sid ServiceID) string + +func placementNamespace(ns string) string { + if ns == "" { + ns = placementPrefix + } + + return ns +} + +func metadataNamespace(ns string) string { + if ns == "" { + ns = metadataPrefix + } + + return ns +} + +func keyFnWithNamespace(namespace string) keyFn { + return func(sid ServiceID) string { + return fmt.Sprintf(keyFormat, namespace, serviceKey(sid)) + } +} + +func adKey(sid ServiceID, id string) string { + return fmt.Sprintf(keyFormat, serviceKey(sid), id) +} + +func serviceKey(s ServiceID) string { + if s.Environment() == "" { + return s.Name() + } + return fmt.Sprintf(keyFormat, s.Environment(), s.Name()) +} + +func validateServiceID(sid ServiceID) error { + if sid.Name() == "" { + return errNoServiceName + } + + return nil +} + +func placementProtoFromValue(v kv.Value) (*placementpb.Placement, error) { + var placementProto placementpb.Placement + if err := v.Unmarshal(&placementProto); err != nil { + return nil, err + } + + return &placementProto, nil +} + +func placementFromValue(v kv.Value) (placement.Placement, error) { + placementProto, err := placementProtoFromValue(v) + if err != nil { + return nil, err + } + + p, err := placement.NewPlacementFromProto(placementProto) + if err != nil { + return nil, err + } + + return p.SetVersion(v.Version()), nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/services/watch.go b/vendor/github.com/m3db/m3/src/cluster/services/watch.go new file mode 100644 index 00000000..8abe8a9a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/services/watch.go @@ -0,0 +1,81 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package services + +import ( + "github.com/m3db/m3/src/x/watch" +) + +// NewWatch creates a Watch. +func NewWatch(w watch.Watch) Watch { + return &serviceWatch{value: w} +} + +type serviceWatch struct { + value watch.Watch +} + +func (w *serviceWatch) Close() { + w.value.Close() +} + +func (w *serviceWatch) C() <-chan struct{} { + return w.value.C() +} + +func (w *serviceWatch) Get() Service { + return w.value.Get().(Service) +} + +type serviceWatchable interface { + watches() int + update(v Service) + get() Service + watch() (Service, Watch, error) +} + +type watchable struct { + value watch.Watchable +} + +func newServiceWatchable() serviceWatchable { + return &watchable{value: watch.NewWatchable()} +} + +func (w *watchable) watches() int { + return w.value.NumWatches() +} + +func (w *watchable) update(v Service) { + w.value.Update(v) +} + +func (w *watchable) get() Service { + return w.value.Get().(Service) +} + +func (w *watchable) watch() (Service, Watch, error) { + curr, newWatch, err := w.value.Watch() + if err != nil { + return nil, nil, err + } + return curr.(Service), NewWatch(newWatch), nil +} diff --git a/vendor/github.com/m3db/m3/src/cluster/shard/shard.go b/vendor/github.com/m3db/m3/src/cluster/shard/shard.go new file mode 100644 index 00000000..c6b95aa6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/shard/shard.go @@ -0,0 +1,338 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package shard + +import ( + "errors" + "fmt" + "sort" + "strings" + + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" +) + +var ( + errInvalidProtoShardState = errors.New("invalid proto shard state") + + defaultShardState State + defaultShardStateProto placementpb.ShardState +) + +// NewShardStateFromProto creates new shard state from proto. +func NewShardStateFromProto(state placementpb.ShardState) (State, error) { + switch state { + case placementpb.ShardState_INITIALIZING: + return Initializing, nil + case placementpb.ShardState_AVAILABLE: + return Available, nil + case placementpb.ShardState_LEAVING: + return Leaving, nil + default: + return defaultShardState, errInvalidProtoShardState + } +} + +// Proto returns the proto representation for the shard state. +func (s State) Proto() (placementpb.ShardState, error) { + switch s { + case Initializing: + return placementpb.ShardState_INITIALIZING, nil + case Available: + return placementpb.ShardState_AVAILABLE, nil + case Leaving: + return placementpb.ShardState_LEAVING, nil + default: + return defaultShardStateProto, errInvalidProtoShardState + } +} + +// NewShard returns a new Shard +func NewShard(id uint32) Shard { return &shard{id: id, state: Unknown} } + +// NewShardFromProto create a new shard from proto. +func NewShardFromProto(shard *placementpb.Shard) (Shard, error) { + state, err := NewShardStateFromProto(shard.State) + if err != nil { + return nil, err + } + + return NewShard(shard.Id). + SetState(state). + SetSourceID(shard.SourceId). + SetCutoverNanos(shard.CutoverNanos). + SetCutoffNanos(shard.CutoffNanos), nil +} + +type shard struct { + id uint32 + state State + sourceID string + cutoverNanos int64 + cutoffNanos int64 +} + +func (s *shard) ID() uint32 { return s.id } +func (s *shard) State() State { return s.state } +func (s *shard) SetState(state State) Shard { s.state = state; return s } +func (s *shard) SourceID() string { return s.sourceID } +func (s *shard) SetSourceID(sourceID string) Shard { s.sourceID = sourceID; return s } + +func (s *shard) CutoverNanos() int64 { + if s.cutoverNanos != UnInitializedValue { + return s.cutoverNanos + } + + // NB(xichen): if the value is not set, we return the default cutover nanos. + return DefaultShardCutoverNanos +} + +func (s *shard) SetCutoverNanos(value int64) Shard { + // NB(cw): We use UnInitializedValue to represent the DefaultShardCutoverNanos + // so that we can save some space in the proto representation for the + // default value of cutover time. + if value == DefaultShardCutoverNanos { + value = UnInitializedValue + } + + s.cutoverNanos = value + return s +} + +func (s *shard) CutoffNanos() int64 { + if s.cutoffNanos != UnInitializedValue { + return s.cutoffNanos + } + + // NB(xichen): if the value is not set, we return the default cutoff nanos. + return DefaultShardCutoffNanos +} + +func (s *shard) SetCutoffNanos(value int64) Shard { + // NB(cw): We use UnInitializedValue to represent the DefaultShardCutoffNanos + // so that we can save some space in the proto representation for the + // default value of cutoff time. + if value == DefaultShardCutoffNanos { + value = UnInitializedValue + } + + s.cutoffNanos = value + return s +} + +func (s *shard) Equals(other Shard) bool { + return s.ID() == other.ID() && + s.State() == other.State() && + s.SourceID() == other.SourceID() && + s.CutoverNanos() == other.CutoverNanos() && + s.CutoffNanos() == other.CutoffNanos() +} + +func (s *shard) Proto() (*placementpb.Shard, error) { + ss, err := s.State().Proto() + if err != nil { + return nil, err + } + + return &placementpb.Shard{ + Id: s.ID(), + State: ss, + SourceId: s.SourceID(), + CutoverNanos: s.cutoverNanos, + CutoffNanos: s.cutoffNanos, + }, nil +} + +func (s *shard) Clone() Shard { + return NewShard(s.ID()). + SetState(s.State()). + SetSourceID(s.SourceID()). + SetCutoverNanos(s.CutoverNanos()). + SetCutoffNanos(s.CutoffNanos()) +} + +// SortableShardsByIDAsc are sortable shards by ID in ascending order +type SortableShardsByIDAsc []Shard + +func (s SortableShardsByIDAsc) Len() int { return len(s) } +func (s SortableShardsByIDAsc) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s SortableShardsByIDAsc) Less(i, j int) bool { + return s[i].ID() < s[j].ID() +} + +// SortableIDsAsc are sortable shard IDs in ascending order +type SortableIDsAsc []uint32 + +func (s SortableIDsAsc) Len() int { return len(s) } +func (s SortableIDsAsc) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s SortableIDsAsc) Less(i, j int) bool { + return s[i] < s[j] +} + +// NewShards creates a new instance of Shards +func NewShards(ss []Shard) Shards { + shardMap := make(map[uint32]Shard, len(ss)) + for _, s := range ss { + shardMap[s.ID()] = s + } + return shards{shardsMap: shardMap} +} + +// NewShardsFromProto creates a new set of shards from proto. +func NewShardsFromProto(shards []*placementpb.Shard) (Shards, error) { + allShards := make([]Shard, 0, len(shards)) + for _, s := range shards { + shard, err := NewShardFromProto(s) + if err != nil { + return nil, err + } + allShards = append(allShards, shard) + } + return NewShards(allShards), nil +} + +type shards struct { + shardsMap map[uint32]Shard +} + +func (ss shards) All() []Shard { + shards := make([]Shard, 0, len(ss.shardsMap)) + for _, shard := range ss.shardsMap { + shards = append(shards, shard) + } + sort.Sort(SortableShardsByIDAsc(shards)) + return shards +} + +func (ss shards) AllIDs() []uint32 { + ids := make([]uint32, 0, len(ss.shardsMap)) + for _, shard := range ss.shardsMap { + ids = append(ids, shard.ID()) + } + sort.Sort(SortableIDsAsc(ids)) + return ids +} + +func (ss shards) NumShards() int { + return len(ss.shardsMap) +} + +func (ss shards) Shard(id uint32) (Shard, bool) { + shard, ok := ss.shardsMap[id] + return shard, ok +} + +func (ss shards) Add(shard Shard) { + ss.shardsMap[shard.ID()] = shard +} + +func (ss shards) Remove(shard uint32) { + delete(ss.shardsMap, shard) +} + +func (ss shards) Contains(shard uint32) bool { + _, ok := ss.shardsMap[shard] + return ok +} + +func (ss shards) NumShardsForState(state State) int { + count := 0 + for _, s := range ss.shardsMap { + if s.State() == state { + count++ + } + } + return count +} + +func (ss shards) ShardsForState(state State) []Shard { + var r []Shard + for _, s := range ss.shardsMap { + if s.State() == state { + r = append(r, s) + } + } + return r +} + +func (ss shards) Equals(other Shards) bool { + shards := ss.All() + otherShards := other.All() + if len(shards) != len(otherShards) { + return false + } + + for i, shard := range shards { + otherShard := otherShards[i] + if !shard.Equals(otherShard) { + return false + } + } + return true +} + +func (ss shards) String() string { + var strs []string + for _, state := range validStates() { + ids := NewShards(ss.ShardsForState(state)).AllIDs() + str := fmt.Sprintf("%s=%v", state.String(), ids) + strs = append(strs, str) + } + return fmt.Sprintf("[%s]", strings.Join(strs, ", ")) +} + +func (ss shards) Proto() ([]*placementpb.Shard, error) { + res := make([]*placementpb.Shard, 0, len(ss.shardsMap)) + // All() returns the shards in ID ascending order. + for _, shard := range ss.All() { + sp, err := shard.Proto() + if err != nil { + return nil, err + } + res = append(res, sp) + } + + return res, nil +} + +func (ss shards) Clone() Shards { + shards := make([]Shard, ss.NumShards()) + for i, shard := range ss.All() { + shards[i] = shard.Clone() + } + + return NewShards(shards) +} + +// SortableShardProtosByIDAsc sorts shard protos by their ids in ascending order. +type SortableShardProtosByIDAsc []*placementpb.Shard + +func (su SortableShardProtosByIDAsc) Len() int { return len(su) } +func (su SortableShardProtosByIDAsc) Less(i, j int) bool { return su[i].Id < su[j].Id } +func (su SortableShardProtosByIDAsc) Swap(i, j int) { su[i], su[j] = su[j], su[i] } + +// validStates returns all the valid states. +func validStates() []State { + return []State{ + Initializing, + Available, + Leaving, + } +} diff --git a/vendor/github.com/m3db/m3/src/cluster/shard/state_string.go b/vendor/github.com/m3db/m3/src/cluster/shard/state_string.go new file mode 100644 index 00000000..0c9b8ff9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/shard/state_string.go @@ -0,0 +1,36 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Code generated by "stringer -type State"; DO NOT EDIT + +package shard + +import "fmt" + +const _State_name = "UnknownInitializingAvailableLeaving" + +var _State_index = [...]uint8{0, 7, 19, 28, 35} + +func (i State) String() string { + if i < 0 || i >= State(len(_State_index)-1) { + return fmt.Sprintf("State(%d)", i) + } + return _State_name[_State_index[i]:_State_index[i+1]] +} diff --git a/vendor/github.com/m3db/m3/src/cluster/shard/types.go b/vendor/github.com/m3db/m3/src/cluster/shard/types.go new file mode 100644 index 00000000..78343854 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/cluster/shard/types.go @@ -0,0 +1,135 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package shard + +import ( + "math" + + "github.com/m3db/m3/src/cluster/generated/proto/placementpb" +) + +const ( + // UnInitializedValue is the unintialized value used in proto. + UnInitializedValue int64 = 0 + + // DefaultShardCutoverNanos is the default shard-level cutover nanos + // if the value is not set in the proto message. + DefaultShardCutoverNanos int64 = 0 + + // DefaultShardCutoffNanos is the default shard-level cutoff nanos + // if the value is not set in the proto message. + DefaultShardCutoffNanos int64 = math.MaxInt64 +) + +// State represents the state of a shard. +type State int + +const ( + // Unknown represents a shard in unknown state. + Unknown State = iota + // Initializing represents a shard newly assigned to an instance. + Initializing + // Available represents a shard bootstraped and ready to serve. + Available + // Leaving represents a shard that is intending to be removed. + Leaving +) + +// A Shard represents a piece of data owned by the service. +type Shard interface { + // ID returns the ID of the shard. + ID() uint32 + + // CutoverNanos returns when shard traffic is cut over. + CutoverNanos() int64 + + // SetCutoverNanos sets when shard traffic is cut over. + SetCutoverNanos(value int64) Shard + + // CutoffNanos returns when shard traffic is cut off. + CutoffNanos() int64 + + // SetCutoffNanos sets when shard traffic is cut off. + SetCutoffNanos(value int64) Shard + + // State returns the state of the shard. + State() State + + // SetState sets the state of the shard. + SetState(s State) Shard + + // Source returns the source of the shard. + SourceID() string + + // SetSource sets the source of the shard. + SetSourceID(sourceID string) Shard + + // Equals returns whether the shard equals to another shard. + Equals(s Shard) bool + + // Proto returns the proto representation for the shard. + Proto() (*placementpb.Shard, error) + + // Clone returns a clone of the Shard. + Clone() Shard +} + +// Shards is a collection of shards owned by one ServiceInstance. +type Shards interface { + // All returns the shards sorted ascending. + All() []Shard + + // AllIDs returns the shard IDs sorted ascending. + AllIDs() []uint32 + + // NumShards returns the number of the shards. + NumShards() int + + // ShardsForState returns the shards in a certain state. + ShardsForState(state State) []Shard + + // NumShardsForState returns the number of shards in a certain state. + NumShardsForState(state State) int + + // Add adds a shard. + Add(shard Shard) + + // Remove removes a shard. + Remove(shard uint32) + + // Contains checks if a shard exists. + Contains(shard uint32) bool + + // Shard returns the shard for the id. + Shard(id uint32) (Shard, bool) + + // Equals returns whether the shards equals to another shards. + Equals(s Shards) bool + + // String returns the string representation of the shards. + String() string + + // Proto returns the proto representation for the shards. + Proto() ([]*placementpb.Shard, error) + + // Clone returns a clone of the Shards. + Clone() Shards +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/README.md b/vendor/github.com/m3db/m3/src/dbnode/client/README.md new file mode 100644 index 00000000..fbda5d0b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/README.md @@ -0,0 +1,52 @@ +# `client` Implementation details + +This file lists details and design choices about the implementation of the `client` package. + + +## FetchTagged/FetchTaggedIDs +First point to note, `FetchTagged`/`FetchTaggedIDs` share a majority of code, so the following applies to both. +The document points out where they differ as applicable. + +First a quick glossary of the types used in this flow: +- `session`: the implementation backing the `client.Session` interface, it's topology aware and does +the fan-out/coordination of the request/response lifecycle. +- `op`: generic interface used by the `session` as a unit of work. It has a `completionFn` specified based +on the backing implementation. It is executed by the `hostQueue`. +- `completionFn`: the callback specified on each `op` to return a response to the caller. +- `hostQueue`: work queue maintained per host by the `session`. It does the execution of a rpc request +asynchronously, and executing any callbacks specified on response/timeout. +- `fetchState`: struct corresponding to a single attempt of a `FetchTagged` rpc request. +- `fetchTaggedResultsAccumulator`: struct used by a `fetchState` for accumulating responses and converting to +the appropriate response types eventually. +- `fetchTaggedShardConsistencyResult`: struct used by the `fetchTaggedResultsAccumulator` for response +consistency calculations. +- `fetchTaggedOp`: implementation of `op` for the `FetchTagged` method calls. + +Easiest way to understand this is to follow the control flow for the execution of a FetchTagged method. + +Sequence of steps: +1. A user of the API calls `session.FetchTagged(...)` +2. `session` validates the request, and converts to the rpc type; terminating early if this fails. +3. Once the request is validated, the `session` retrieves a `fetchState`, and `fetchTaggedOp` +from their respective pools. We create a single `fetchState` and `fetchTaggedOp` per attempt. +4. The `fetchTaggedOp` is enqueued into each known host's `hostQueue`. +5. The `session` then calls `fetchState.Wait()`, which is backed by a condition variable, while +waiting for responses to come back. Note: the calling go-routine will keep waiting until sufficient +responses have been received to fullfil the consistency requirement of the request, or if we receive +responses from all hosts and are still unable to meet the constraint. +6. In the background, each `hostQueue` is executing the appropriate rpc and calling the `completionFn` +with success/error/timeout. +7. For each execution of the `completionFn`, the `fetchState` passes the response to the +`fetchTaggedResultsAccumulator` which does the consistency calculation and updates its internal state. +The `fetchTaggedResultsAccumulator` returns whether it's hit a terminating condition to to the `fetchState`, +which acts upon it and if it has, calls `Signal()` to indicate to the original go-routine waiting on the +condition variable that a response is available. + +### Nuances about lifecycle +- The `fetchTaggedOp` retains a reference to the `fetchState`, so the `fetchState` has to remain alive +until all hosts have returned a response/timed-out. +- The `fetchState` created by the session in steps during the execution of a `FetchTagged()` method can +remain alive even after the response. This is because we can return success even if we haven't received +responses from all hosts depending on the consistency requirement. As a result, the final caller to +`fetchState.decRef()` actually cleans it up and returns it to the pool. This will be a hostQueue in case +of early success, or the go-routine calling the the `FetchTagged()` in case of error. diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/aggregate_attempt.go b/vendor/github.com/m3db/m3/src/dbnode/client/aggregate_attempt.go new file mode 100644 index 00000000..ac621a1b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/aggregate_attempt.go @@ -0,0 +1,99 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/storage/index" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + xretry "github.com/m3db/m3/src/x/retry" +) + +var ( + aggregateAttemptArgsZeroed aggregateAttemptArgs +) + +type aggregateAttempt struct { + session *session + attemptFn xretry.Fn + + args aggregateAttemptArgs + resultIter AggregatedTagsIterator + resultMetadata FetchResponseMetadata +} + +type aggregateAttemptArgs struct { + ns ident.ID + query index.Query + opts index.AggregationOptions +} + +func (f *aggregateAttempt) reset() { + f.args = aggregateAttemptArgsZeroed + f.resultIter = nil + f.resultMetadata = FetchResponseMetadata{} +} + +func (f *aggregateAttempt) performAttempt() error { + var err error + f.resultIter, f.resultMetadata, err = f.session.aggregateAttempt( + f.args.ns, f.args.query, f.args.opts) + return err +} + +type aggregateAttemptPool interface { + Init() + Get() *aggregateAttempt + Put(*aggregateAttempt) +} + +type aggregateAttemptPoolImpl struct { + pool pool.ObjectPool + session *session +} + +func newAggregateAttemptPool( + session *session, + opts pool.ObjectPoolOptions, +) aggregateAttemptPool { + p := pool.NewObjectPool(opts) + return &aggregateAttemptPoolImpl{pool: p, session: session} +} + +func (p *aggregateAttemptPoolImpl) Init() { + p.pool.Init(func() interface{} { + f := &aggregateAttempt{session: p.session} + // NB(prateek): Bind fn once to avoid creating receiver + // and function method pointer over and over again + f.attemptFn = f.performAttempt + f.reset() + return f + }) +} + +func (p *aggregateAttemptPoolImpl) Get() *aggregateAttempt { + return p.pool.Get().(*aggregateAttempt) +} + +func (p *aggregateAttemptPoolImpl) Put(f *aggregateAttempt) { + f.reset() + p.pool.Put(f) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/aggregate_op.go b/vendor/github.com/m3db/m3/src/dbnode/client/aggregate_op.go new file mode 100644 index 00000000..2acc042f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/aggregate_op.go @@ -0,0 +1,100 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/pool" +) + +var ( + aggregateOpRequestZeroed = rpc.AggregateQueryRawRequest{} +) + +type aggregateOp struct { + refCounter + request rpc.AggregateQueryRawRequest + completionFn completionFn + + pool aggregateOpPool +} + +func (f *aggregateOp) Size() int { return 1 } +func (f *aggregateOp) CompletionFn() completionFn { return f.completionFn } + +func (f *aggregateOp) update(req rpc.AggregateQueryRawRequest, fn completionFn) { + f.request = req + f.completionFn = fn +} + +func (f *aggregateOp) requestLimit(defaultValue int) int { + if f.request.Limit == nil { + return defaultValue + } + return int(*f.request.Limit) +} + +func (f *aggregateOp) close() { + f.completionFn = nil + f.request = aggregateOpRequestZeroed + // return to pool + if f.pool == nil { + return + } + f.pool.Put(f) +} + +func newAggregateOp(p aggregateOpPool) *aggregateOp { + f := &aggregateOp{pool: p} + f.destructorFn = f.close + return f +} + +type aggregateOpPool interface { + Init() + Get() *aggregateOp + Put(*aggregateOp) +} + +type aggregateOpPoolImpl struct { + pool pool.ObjectPool +} + +func newAggregateOpPool( + opts pool.ObjectPoolOptions, +) aggregateOpPool { + p := pool.NewObjectPool(opts) + return &aggregateOpPoolImpl{pool: p} +} + +func (p *aggregateOpPoolImpl) Init() { + p.pool.Init(func() interface{} { + return newAggregateOp(p) + }) +} + +func (p *aggregateOpPoolImpl) Get() *aggregateOp { + return p.pool.Get().(*aggregateOp) +} + +func (p *aggregateOpPoolImpl) Put(f *aggregateOp) { + p.pool.Put(f) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/aggregate_tags_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/client/aggregate_tags_iterator.go new file mode 100644 index 00000000..cec02132 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/aggregate_tags_iterator.go @@ -0,0 +1,107 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/x/ident" +) + +// FOLLOWUP(r): add pooling for aggregateTagsIterator(s). +type aggregateTagsIterator struct { + currentIdx int + err error + pools fetchTaggedPools + + current struct { + tagName ident.ID + tagValues ident.Iterator + } + + backing []*aggregateTagsIteratorTag +} + +type aggregateTagsIteratorTag struct { + tagName ident.ID + tagValues []ident.ID +} + +// make the compiler ensure the concrete type `&aggregateTagsIterator{}` implements +// the `AggregatedTagsIterator` interface. +var _ AggregatedTagsIterator = &aggregateTagsIterator{} + +func newAggregateTagsIterator(pools fetchTaggedPools) *aggregateTagsIterator { + return &aggregateTagsIterator{ + currentIdx: -1, + pools: pools, + } +} + +func (i *aggregateTagsIterator) Next() bool { + if i.err != nil || i.currentIdx >= len(i.backing) { + return false + } + + i.release() + i.currentIdx++ + if i.currentIdx >= len(i.backing) { + return false + } + + i.current.tagName = i.backing[i.currentIdx].tagName + i.current.tagValues = ident.NewIDSliceIterator(i.backing[i.currentIdx].tagValues) + return true +} + +func (i *aggregateTagsIterator) addTag(tagName []byte) *aggregateTagsIteratorTag { + tag := &aggregateTagsIteratorTag{ + tagName: ident.BytesID(tagName), + } + i.backing = append(i.backing, tag) + return tag +} + +func (i *aggregateTagsIterator) release() { + i.current.tagName = nil + i.current.tagValues = nil +} + +func (i *aggregateTagsIterator) Finalize() { + i.release() + for _, b := range i.backing { + b.tagName.Finalize() + for _, v := range b.tagValues { + v.Finalize() + } + } + i.backing = nil +} + +func (i *aggregateTagsIterator) Remaining() int { + return len(i.backing) - (i.currentIdx + 1) +} + +func (i *aggregateTagsIterator) Current() (tagName ident.ID, tagValues ident.Iterator) { + return i.current.tagName, i.current.tagValues +} + +func (i *aggregateTagsIterator) Err() error { + return i.err +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/calc_transport.go b/vendor/github.com/m3db/m3/src/dbnode/client/calc_transport.go new file mode 100644 index 00000000..baa038e3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/calc_transport.go @@ -0,0 +1,188 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "errors" + + "github.com/apache/thrift/lib/go/thrift" +) + +var ( + errCalcTransportNotImplemented = errors.New("calc transport: not implemented") + // Ensure calc transport implements TProtocol. + _ thrift.TProtocol = (*calcTransport)(nil) +) + +type calcTransport struct { + size int +} + +func (t *calcTransport) Reset() { + if t == nil { + return + } + t.size = 0 +} +func (t *calcTransport) GetSize() int { + if t == nil { + return 0 + } + return t.size +} +func (t *calcTransport) WriteMessageBegin(name string, typeID thrift.TMessageType, seqid int32) error { + return nil +} +func (t *calcTransport) WriteMessageEnd() error { + return nil +} +func (t *calcTransport) WriteStructBegin(name string) error { + return nil +} +func (t *calcTransport) WriteStructEnd() error { + return nil +} +func (t *calcTransport) WriteFieldBegin(name string, typeID thrift.TType, id int16) error { + return nil +} +func (t *calcTransport) WriteFieldEnd() error { + return nil +} +func (t *calcTransport) WriteFieldStop() error { + return nil +} +func (t *calcTransport) WriteMapBegin(keyType thrift.TType, valueType thrift.TType, size int) error { + return nil +} +func (t *calcTransport) WriteMapEnd() error { + return nil +} +func (t *calcTransport) WriteListBegin(elemType thrift.TType, size int) error { + return nil +} +func (t *calcTransport) WriteListEnd() error { + return nil +} +func (t *calcTransport) WriteSetBegin(elemType thrift.TType, size int) error { + return nil +} +func (t *calcTransport) WriteSetEnd() error { + return nil +} +func (t *calcTransport) WriteBool(value bool) error { + t.size++ + return nil +} +func (t *calcTransport) WriteByte(value int8) error { + t.size++ + return nil +} +func (t *calcTransport) WriteI16(value int16) error { + t.size += 2 + return nil +} +func (t *calcTransport) WriteI32(value int32) error { + t.size += 4 + return nil +} +func (t *calcTransport) WriteI64(value int64) error { + t.size += 8 + return nil +} +func (t *calcTransport) WriteDouble(value float64) error { + t.size += 8 + return nil +} +func (t *calcTransport) WriteString(value string) error { + t.size += len(value) + return nil +} +func (t *calcTransport) WriteBinary(value []byte) error { + t.size += len(value) + return nil +} +func (t *calcTransport) ReadMessageBegin() (name string, typeID thrift.TMessageType, seqid int32, err error) { + return "", 0, 0, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadMessageEnd() error { + return errCalcTransportNotImplemented +} +func (t *calcTransport) ReadStructBegin() (name string, err error) { + return "", errCalcTransportNotImplemented +} +func (t *calcTransport) ReadStructEnd() error { + return errCalcTransportNotImplemented +} +func (t *calcTransport) ReadFieldBegin() (name string, typeID thrift.TType, id int16, err error) { + return "", 0, 0, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadFieldEnd() error { + return errCalcTransportNotImplemented +} +func (t *calcTransport) ReadMapBegin() (keyType thrift.TType, valueType thrift.TType, size int, err error) { + return 0, 0, 0, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadMapEnd() error { + return errCalcTransportNotImplemented +} +func (t *calcTransport) ReadListBegin() (elemType thrift.TType, size int, err error) { + return 0, 0, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadListEnd() error { + return errCalcTransportNotImplemented +} +func (t *calcTransport) ReadSetBegin() (elemType thrift.TType, size int, err error) { + return 0, 0, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadSetEnd() error { + return errCalcTransportNotImplemented +} +func (t *calcTransport) ReadBool() (value bool, err error) { + return false, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadByte() (value int8, err error) { + return 0, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadI16() (value int16, err error) { + return 0, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadI32() (value int32, err error) { + return 0, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadI64() (value int64, err error) { + return 0, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadDouble() (value float64, err error) { + return 0, errCalcTransportNotImplemented +} +func (t *calcTransport) ReadString() (value string, err error) { + return "", errCalcTransportNotImplemented +} +func (t *calcTransport) ReadBinary() (value []byte, err error) { + return nil, errCalcTransportNotImplemented +} +func (t *calcTransport) Skip(fieldType thrift.TType) (err error) { + return errCalcTransportNotImplemented +} +func (t *calcTransport) Flush() (err error) { + return errCalcTransportNotImplemented +} +func (t *calcTransport) Transport() thrift.TTransport { return nil } diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/client.go b/vendor/github.com/m3db/m3/src/dbnode/client/client.go new file mode 100644 index 00000000..f658694d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/client.go @@ -0,0 +1,117 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "sync" +) + +type client struct { + sync.Mutex + + opts Options + asyncOpts []Options + newSessionFn newReplicatedSessionFn + session AdminSession // default cached session +} + +// type newReplicatedSessionFn func(Options) (replicatedSession, error) +type newReplicatedSessionFn func(Options, []Options, ...replicatedSessionOption) (clientSession, error) + +// NewClient creates a new client +func NewClient(opts Options, asyncOpts ...Options) (Client, error) { + return newClient(opts, asyncOpts...) +} + +// NewAdminClient creates a new administrative client +func NewAdminClient(opts AdminOptions, asyncOpts ...Options) (AdminClient, error) { + return newClient(opts, asyncOpts...) +} + +func newClient(opts Options, asyncOpts ...Options) (*client, error) { + if err := opts.Validate(); err != nil { + return nil, err + } + return &client{opts: opts, asyncOpts: asyncOpts, newSessionFn: newReplicatedSession}, nil +} + +func (c *client) newSession() (AdminSession, error) { + session, err := c.newSessionFn(c.opts, c.asyncOpts) + if err != nil { + return nil, err + } + if err := session.Open(); err != nil { + return nil, err + } + return session, nil +} + +func (c *client) defaultSession() (AdminSession, error) { + c.Lock() + if c.session != nil { + session := c.session + c.Unlock() + return session, nil + } + c.Unlock() + + session, err := c.newSession() + if err != nil { + return nil, err + } + + c.Lock() + if c.session != nil { + session := c.session + c.Unlock() + return session, nil + } + c.session = session + c.Unlock() + + return session, nil +} + +func (c *client) Options() Options { + return c.opts +} + +func (c *client) NewSession() (Session, error) { + return c.newSession() +} + +func (c *client) DefaultSession() (Session, error) { + return c.defaultSession() +} + +func (c *client) NewAdminSession() (AdminSession, error) { + return c.newSession() +} + +func (c *client) DefaultAdminSession() (AdminSession, error) { + return c.defaultSession() +} + +func (c *client) DefaultSessionActive() bool { + c.Lock() + defer c.Unlock() + return c.session != nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/client_mock.go b/vendor/github.com/m3db/m3/src/dbnode/client/client_mock.go new file mode 100644 index 00000000..541df13d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/client_mock.go @@ -0,0 +1,5144 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/client/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package client is a generated GoMock package. +package client + +import ( + "reflect" + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/runtime" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" + "github.com/m3db/m3/src/dbnode/storage/index" + "github.com/m3db/m3/src/dbnode/topology" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/pool" + "github.com/m3db/m3/src/x/retry" + "github.com/m3db/m3/src/x/sampler" + "github.com/m3db/m3/src/x/serialize" + "github.com/m3db/m3/src/x/sync" + time0 "github.com/m3db/m3/src/x/time" + + "github.com/golang/mock/gomock" + tchannel "github.com/uber/tchannel-go" +) + +// MockClient is a mock of Client interface +type MockClient struct { + ctrl *gomock.Controller + recorder *MockClientMockRecorder +} + +// MockClientMockRecorder is the mock recorder for MockClient +type MockClientMockRecorder struct { + mock *MockClient +} + +// NewMockClient creates a new mock instance +func NewMockClient(ctrl *gomock.Controller) *MockClient { + mock := &MockClient{ctrl: ctrl} + mock.recorder = &MockClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockClient) EXPECT() *MockClientMockRecorder { + return m.recorder +} + +// Options mocks base method +func (m *MockClient) Options() Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Options") + ret0, _ := ret[0].(Options) + return ret0 +} + +// Options indicates an expected call of Options +func (mr *MockClientMockRecorder) Options() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Options", reflect.TypeOf((*MockClient)(nil).Options)) +} + +// NewSession mocks base method +func (m *MockClient) NewSession() (Session, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NewSession") + ret0, _ := ret[0].(Session) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NewSession indicates an expected call of NewSession +func (mr *MockClientMockRecorder) NewSession() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewSession", reflect.TypeOf((*MockClient)(nil).NewSession)) +} + +// DefaultSession mocks base method +func (m *MockClient) DefaultSession() (Session, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DefaultSession") + ret0, _ := ret[0].(Session) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DefaultSession indicates an expected call of DefaultSession +func (mr *MockClientMockRecorder) DefaultSession() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DefaultSession", reflect.TypeOf((*MockClient)(nil).DefaultSession)) +} + +// DefaultSessionActive mocks base method +func (m *MockClient) DefaultSessionActive() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DefaultSessionActive") + ret0, _ := ret[0].(bool) + return ret0 +} + +// DefaultSessionActive indicates an expected call of DefaultSessionActive +func (mr *MockClientMockRecorder) DefaultSessionActive() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DefaultSessionActive", reflect.TypeOf((*MockClient)(nil).DefaultSessionActive)) +} + +// MockSession is a mock of Session interface +type MockSession struct { + ctrl *gomock.Controller + recorder *MockSessionMockRecorder +} + +// MockSessionMockRecorder is the mock recorder for MockSession +type MockSessionMockRecorder struct { + mock *MockSession +} + +// NewMockSession creates a new mock instance +func NewMockSession(ctrl *gomock.Controller) *MockSession { + mock := &MockSession{ctrl: ctrl} + mock.recorder = &MockSessionMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSession) EXPECT() *MockSessionMockRecorder { + return m.recorder +} + +// Write mocks base method +func (m *MockSession) Write(namespace, id ident.ID, t time.Time, value float64, unit time0.Unit, annotation []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", namespace, id, t, value, unit, annotation) + ret0, _ := ret[0].(error) + return ret0 +} + +// Write indicates an expected call of Write +func (mr *MockSessionMockRecorder) Write(namespace, id, t, value, unit, annotation interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockSession)(nil).Write), namespace, id, t, value, unit, annotation) +} + +// WriteTagged mocks base method +func (m *MockSession) WriteTagged(namespace, id ident.ID, tags ident.TagIterator, t time.Time, value float64, unit time0.Unit, annotation []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTagged", namespace, id, tags, t, value, unit, annotation) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTagged indicates an expected call of WriteTagged +func (mr *MockSessionMockRecorder) WriteTagged(namespace, id, tags, t, value, unit, annotation interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTagged", reflect.TypeOf((*MockSession)(nil).WriteTagged), namespace, id, tags, t, value, unit, annotation) +} + +// Fetch mocks base method +func (m *MockSession) Fetch(namespace, id ident.ID, startInclusive, endExclusive time.Time) (encoding.SeriesIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fetch", namespace, id, startInclusive, endExclusive) + ret0, _ := ret[0].(encoding.SeriesIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fetch indicates an expected call of Fetch +func (mr *MockSessionMockRecorder) Fetch(namespace, id, startInclusive, endExclusive interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fetch", reflect.TypeOf((*MockSession)(nil).Fetch), namespace, id, startInclusive, endExclusive) +} + +// FetchIDs mocks base method +func (m *MockSession) FetchIDs(namespace ident.ID, ids ident.Iterator, startInclusive, endExclusive time.Time) (encoding.SeriesIterators, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchIDs", namespace, ids, startInclusive, endExclusive) + ret0, _ := ret[0].(encoding.SeriesIterators) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchIDs indicates an expected call of FetchIDs +func (mr *MockSessionMockRecorder) FetchIDs(namespace, ids, startInclusive, endExclusive interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchIDs", reflect.TypeOf((*MockSession)(nil).FetchIDs), namespace, ids, startInclusive, endExclusive) +} + +// FetchTagged mocks base method +func (m *MockSession) FetchTagged(namespace ident.ID, q index.Query, opts index.QueryOptions) (encoding.SeriesIterators, FetchResponseMetadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchTagged", namespace, q, opts) + ret0, _ := ret[0].(encoding.SeriesIterators) + ret1, _ := ret[1].(FetchResponseMetadata) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// FetchTagged indicates an expected call of FetchTagged +func (mr *MockSessionMockRecorder) FetchTagged(namespace, q, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTagged", reflect.TypeOf((*MockSession)(nil).FetchTagged), namespace, q, opts) +} + +// FetchTaggedIDs mocks base method +func (m *MockSession) FetchTaggedIDs(namespace ident.ID, q index.Query, opts index.QueryOptions) (TaggedIDsIterator, FetchResponseMetadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchTaggedIDs", namespace, q, opts) + ret0, _ := ret[0].(TaggedIDsIterator) + ret1, _ := ret[1].(FetchResponseMetadata) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// FetchTaggedIDs indicates an expected call of FetchTaggedIDs +func (mr *MockSessionMockRecorder) FetchTaggedIDs(namespace, q, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTaggedIDs", reflect.TypeOf((*MockSession)(nil).FetchTaggedIDs), namespace, q, opts) +} + +// Aggregate mocks base method +func (m *MockSession) Aggregate(namespace ident.ID, q index.Query, opts index.AggregationOptions) (AggregatedTagsIterator, FetchResponseMetadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Aggregate", namespace, q, opts) + ret0, _ := ret[0].(AggregatedTagsIterator) + ret1, _ := ret[1].(FetchResponseMetadata) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Aggregate indicates an expected call of Aggregate +func (mr *MockSessionMockRecorder) Aggregate(namespace, q, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockSession)(nil).Aggregate), namespace, q, opts) +} + +// ShardID mocks base method +func (m *MockSession) ShardID(id ident.ID) (uint32, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardID", id) + ret0, _ := ret[0].(uint32) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ShardID indicates an expected call of ShardID +func (mr *MockSessionMockRecorder) ShardID(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardID", reflect.TypeOf((*MockSession)(nil).ShardID), id) +} + +// IteratorPools mocks base method +func (m *MockSession) IteratorPools() (encoding.IteratorPools, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IteratorPools") + ret0, _ := ret[0].(encoding.IteratorPools) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IteratorPools indicates an expected call of IteratorPools +func (mr *MockSessionMockRecorder) IteratorPools() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IteratorPools", reflect.TypeOf((*MockSession)(nil).IteratorPools)) +} + +// Close mocks base method +func (m *MockSession) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockSessionMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSession)(nil).Close)) +} + +// MockAggregatedTagsIterator is a mock of AggregatedTagsIterator interface +type MockAggregatedTagsIterator struct { + ctrl *gomock.Controller + recorder *MockAggregatedTagsIteratorMockRecorder +} + +// MockAggregatedTagsIteratorMockRecorder is the mock recorder for MockAggregatedTagsIterator +type MockAggregatedTagsIteratorMockRecorder struct { + mock *MockAggregatedTagsIterator +} + +// NewMockAggregatedTagsIterator creates a new mock instance +func NewMockAggregatedTagsIterator(ctrl *gomock.Controller) *MockAggregatedTagsIterator { + mock := &MockAggregatedTagsIterator{ctrl: ctrl} + mock.recorder = &MockAggregatedTagsIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAggregatedTagsIterator) EXPECT() *MockAggregatedTagsIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockAggregatedTagsIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockAggregatedTagsIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockAggregatedTagsIterator)(nil).Next)) +} + +// Remaining mocks base method +func (m *MockAggregatedTagsIterator) Remaining() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Remaining") + ret0, _ := ret[0].(int) + return ret0 +} + +// Remaining indicates an expected call of Remaining +func (mr *MockAggregatedTagsIteratorMockRecorder) Remaining() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remaining", reflect.TypeOf((*MockAggregatedTagsIterator)(nil).Remaining)) +} + +// Current mocks base method +func (m *MockAggregatedTagsIterator) Current() (ident.ID, ident.Iterator) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(ident.ID) + ret1, _ := ret[1].(ident.Iterator) + return ret0, ret1 +} + +// Current indicates an expected call of Current +func (mr *MockAggregatedTagsIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockAggregatedTagsIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockAggregatedTagsIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockAggregatedTagsIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockAggregatedTagsIterator)(nil).Err)) +} + +// Finalize mocks base method +func (m *MockAggregatedTagsIterator) Finalize() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Finalize") +} + +// Finalize indicates an expected call of Finalize +func (mr *MockAggregatedTagsIteratorMockRecorder) Finalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finalize", reflect.TypeOf((*MockAggregatedTagsIterator)(nil).Finalize)) +} + +// MockTaggedIDsIterator is a mock of TaggedIDsIterator interface +type MockTaggedIDsIterator struct { + ctrl *gomock.Controller + recorder *MockTaggedIDsIteratorMockRecorder +} + +// MockTaggedIDsIteratorMockRecorder is the mock recorder for MockTaggedIDsIterator +type MockTaggedIDsIteratorMockRecorder struct { + mock *MockTaggedIDsIterator +} + +// NewMockTaggedIDsIterator creates a new mock instance +func NewMockTaggedIDsIterator(ctrl *gomock.Controller) *MockTaggedIDsIterator { + mock := &MockTaggedIDsIterator{ctrl: ctrl} + mock.recorder = &MockTaggedIDsIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTaggedIDsIterator) EXPECT() *MockTaggedIDsIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockTaggedIDsIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockTaggedIDsIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockTaggedIDsIterator)(nil).Next)) +} + +// Remaining mocks base method +func (m *MockTaggedIDsIterator) Remaining() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Remaining") + ret0, _ := ret[0].(int) + return ret0 +} + +// Remaining indicates an expected call of Remaining +func (mr *MockTaggedIDsIteratorMockRecorder) Remaining() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remaining", reflect.TypeOf((*MockTaggedIDsIterator)(nil).Remaining)) +} + +// Current mocks base method +func (m *MockTaggedIDsIterator) Current() (ident.ID, ident.ID, ident.TagIterator) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(ident.ID) + ret1, _ := ret[1].(ident.ID) + ret2, _ := ret[2].(ident.TagIterator) + return ret0, ret1, ret2 +} + +// Current indicates an expected call of Current +func (mr *MockTaggedIDsIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockTaggedIDsIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockTaggedIDsIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockTaggedIDsIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockTaggedIDsIterator)(nil).Err)) +} + +// Finalize mocks base method +func (m *MockTaggedIDsIterator) Finalize() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Finalize") +} + +// Finalize indicates an expected call of Finalize +func (mr *MockTaggedIDsIteratorMockRecorder) Finalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finalize", reflect.TypeOf((*MockTaggedIDsIterator)(nil).Finalize)) +} + +// MockAdminClient is a mock of AdminClient interface +type MockAdminClient struct { + ctrl *gomock.Controller + recorder *MockAdminClientMockRecorder +} + +// MockAdminClientMockRecorder is the mock recorder for MockAdminClient +type MockAdminClientMockRecorder struct { + mock *MockAdminClient +} + +// NewMockAdminClient creates a new mock instance +func NewMockAdminClient(ctrl *gomock.Controller) *MockAdminClient { + mock := &MockAdminClient{ctrl: ctrl} + mock.recorder = &MockAdminClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAdminClient) EXPECT() *MockAdminClientMockRecorder { + return m.recorder +} + +// Options mocks base method +func (m *MockAdminClient) Options() Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Options") + ret0, _ := ret[0].(Options) + return ret0 +} + +// Options indicates an expected call of Options +func (mr *MockAdminClientMockRecorder) Options() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Options", reflect.TypeOf((*MockAdminClient)(nil).Options)) +} + +// NewSession mocks base method +func (m *MockAdminClient) NewSession() (Session, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NewSession") + ret0, _ := ret[0].(Session) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NewSession indicates an expected call of NewSession +func (mr *MockAdminClientMockRecorder) NewSession() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewSession", reflect.TypeOf((*MockAdminClient)(nil).NewSession)) +} + +// DefaultSession mocks base method +func (m *MockAdminClient) DefaultSession() (Session, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DefaultSession") + ret0, _ := ret[0].(Session) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DefaultSession indicates an expected call of DefaultSession +func (mr *MockAdminClientMockRecorder) DefaultSession() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DefaultSession", reflect.TypeOf((*MockAdminClient)(nil).DefaultSession)) +} + +// DefaultSessionActive mocks base method +func (m *MockAdminClient) DefaultSessionActive() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DefaultSessionActive") + ret0, _ := ret[0].(bool) + return ret0 +} + +// DefaultSessionActive indicates an expected call of DefaultSessionActive +func (mr *MockAdminClientMockRecorder) DefaultSessionActive() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DefaultSessionActive", reflect.TypeOf((*MockAdminClient)(nil).DefaultSessionActive)) +} + +// NewAdminSession mocks base method +func (m *MockAdminClient) NewAdminSession() (AdminSession, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NewAdminSession") + ret0, _ := ret[0].(AdminSession) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NewAdminSession indicates an expected call of NewAdminSession +func (mr *MockAdminClientMockRecorder) NewAdminSession() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewAdminSession", reflect.TypeOf((*MockAdminClient)(nil).NewAdminSession)) +} + +// DefaultAdminSession mocks base method +func (m *MockAdminClient) DefaultAdminSession() (AdminSession, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DefaultAdminSession") + ret0, _ := ret[0].(AdminSession) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DefaultAdminSession indicates an expected call of DefaultAdminSession +func (mr *MockAdminClientMockRecorder) DefaultAdminSession() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DefaultAdminSession", reflect.TypeOf((*MockAdminClient)(nil).DefaultAdminSession)) +} + +// MockPeerBlockMetadataIter is a mock of PeerBlockMetadataIter interface +type MockPeerBlockMetadataIter struct { + ctrl *gomock.Controller + recorder *MockPeerBlockMetadataIterMockRecorder +} + +// MockPeerBlockMetadataIterMockRecorder is the mock recorder for MockPeerBlockMetadataIter +type MockPeerBlockMetadataIterMockRecorder struct { + mock *MockPeerBlockMetadataIter +} + +// NewMockPeerBlockMetadataIter creates a new mock instance +func NewMockPeerBlockMetadataIter(ctrl *gomock.Controller) *MockPeerBlockMetadataIter { + mock := &MockPeerBlockMetadataIter{ctrl: ctrl} + mock.recorder = &MockPeerBlockMetadataIterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockPeerBlockMetadataIter) EXPECT() *MockPeerBlockMetadataIterMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockPeerBlockMetadataIter) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockPeerBlockMetadataIterMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockPeerBlockMetadataIter)(nil).Next)) +} + +// Current mocks base method +func (m *MockPeerBlockMetadataIter) Current() (topology.Host, block.Metadata) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(topology.Host) + ret1, _ := ret[1].(block.Metadata) + return ret0, ret1 +} + +// Current indicates an expected call of Current +func (mr *MockPeerBlockMetadataIterMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockPeerBlockMetadataIter)(nil).Current)) +} + +// Err mocks base method +func (m *MockPeerBlockMetadataIter) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockPeerBlockMetadataIterMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockPeerBlockMetadataIter)(nil).Err)) +} + +// MockPeerBlocksIter is a mock of PeerBlocksIter interface +type MockPeerBlocksIter struct { + ctrl *gomock.Controller + recorder *MockPeerBlocksIterMockRecorder +} + +// MockPeerBlocksIterMockRecorder is the mock recorder for MockPeerBlocksIter +type MockPeerBlocksIterMockRecorder struct { + mock *MockPeerBlocksIter +} + +// NewMockPeerBlocksIter creates a new mock instance +func NewMockPeerBlocksIter(ctrl *gomock.Controller) *MockPeerBlocksIter { + mock := &MockPeerBlocksIter{ctrl: ctrl} + mock.recorder = &MockPeerBlocksIterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockPeerBlocksIter) EXPECT() *MockPeerBlocksIterMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockPeerBlocksIter) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockPeerBlocksIterMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockPeerBlocksIter)(nil).Next)) +} + +// Current mocks base method +func (m *MockPeerBlocksIter) Current() (topology.Host, ident.ID, block.DatabaseBlock) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(topology.Host) + ret1, _ := ret[1].(ident.ID) + ret2, _ := ret[2].(block.DatabaseBlock) + return ret0, ret1, ret2 +} + +// Current indicates an expected call of Current +func (mr *MockPeerBlocksIterMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockPeerBlocksIter)(nil).Current)) +} + +// Err mocks base method +func (m *MockPeerBlocksIter) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockPeerBlocksIterMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockPeerBlocksIter)(nil).Err)) +} + +// MockAdminSession is a mock of AdminSession interface +type MockAdminSession struct { + ctrl *gomock.Controller + recorder *MockAdminSessionMockRecorder +} + +// MockAdminSessionMockRecorder is the mock recorder for MockAdminSession +type MockAdminSessionMockRecorder struct { + mock *MockAdminSession +} + +// NewMockAdminSession creates a new mock instance +func NewMockAdminSession(ctrl *gomock.Controller) *MockAdminSession { + mock := &MockAdminSession{ctrl: ctrl} + mock.recorder = &MockAdminSessionMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAdminSession) EXPECT() *MockAdminSessionMockRecorder { + return m.recorder +} + +// Write mocks base method +func (m *MockAdminSession) Write(namespace, id ident.ID, t time.Time, value float64, unit time0.Unit, annotation []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", namespace, id, t, value, unit, annotation) + ret0, _ := ret[0].(error) + return ret0 +} + +// Write indicates an expected call of Write +func (mr *MockAdminSessionMockRecorder) Write(namespace, id, t, value, unit, annotation interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockAdminSession)(nil).Write), namespace, id, t, value, unit, annotation) +} + +// WriteTagged mocks base method +func (m *MockAdminSession) WriteTagged(namespace, id ident.ID, tags ident.TagIterator, t time.Time, value float64, unit time0.Unit, annotation []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTagged", namespace, id, tags, t, value, unit, annotation) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTagged indicates an expected call of WriteTagged +func (mr *MockAdminSessionMockRecorder) WriteTagged(namespace, id, tags, t, value, unit, annotation interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTagged", reflect.TypeOf((*MockAdminSession)(nil).WriteTagged), namespace, id, tags, t, value, unit, annotation) +} + +// Fetch mocks base method +func (m *MockAdminSession) Fetch(namespace, id ident.ID, startInclusive, endExclusive time.Time) (encoding.SeriesIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fetch", namespace, id, startInclusive, endExclusive) + ret0, _ := ret[0].(encoding.SeriesIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fetch indicates an expected call of Fetch +func (mr *MockAdminSessionMockRecorder) Fetch(namespace, id, startInclusive, endExclusive interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fetch", reflect.TypeOf((*MockAdminSession)(nil).Fetch), namespace, id, startInclusive, endExclusive) +} + +// FetchIDs mocks base method +func (m *MockAdminSession) FetchIDs(namespace ident.ID, ids ident.Iterator, startInclusive, endExclusive time.Time) (encoding.SeriesIterators, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchIDs", namespace, ids, startInclusive, endExclusive) + ret0, _ := ret[0].(encoding.SeriesIterators) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchIDs indicates an expected call of FetchIDs +func (mr *MockAdminSessionMockRecorder) FetchIDs(namespace, ids, startInclusive, endExclusive interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchIDs", reflect.TypeOf((*MockAdminSession)(nil).FetchIDs), namespace, ids, startInclusive, endExclusive) +} + +// FetchTagged mocks base method +func (m *MockAdminSession) FetchTagged(namespace ident.ID, q index.Query, opts index.QueryOptions) (encoding.SeriesIterators, FetchResponseMetadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchTagged", namespace, q, opts) + ret0, _ := ret[0].(encoding.SeriesIterators) + ret1, _ := ret[1].(FetchResponseMetadata) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// FetchTagged indicates an expected call of FetchTagged +func (mr *MockAdminSessionMockRecorder) FetchTagged(namespace, q, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTagged", reflect.TypeOf((*MockAdminSession)(nil).FetchTagged), namespace, q, opts) +} + +// FetchTaggedIDs mocks base method +func (m *MockAdminSession) FetchTaggedIDs(namespace ident.ID, q index.Query, opts index.QueryOptions) (TaggedIDsIterator, FetchResponseMetadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchTaggedIDs", namespace, q, opts) + ret0, _ := ret[0].(TaggedIDsIterator) + ret1, _ := ret[1].(FetchResponseMetadata) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// FetchTaggedIDs indicates an expected call of FetchTaggedIDs +func (mr *MockAdminSessionMockRecorder) FetchTaggedIDs(namespace, q, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTaggedIDs", reflect.TypeOf((*MockAdminSession)(nil).FetchTaggedIDs), namespace, q, opts) +} + +// Aggregate mocks base method +func (m *MockAdminSession) Aggregate(namespace ident.ID, q index.Query, opts index.AggregationOptions) (AggregatedTagsIterator, FetchResponseMetadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Aggregate", namespace, q, opts) + ret0, _ := ret[0].(AggregatedTagsIterator) + ret1, _ := ret[1].(FetchResponseMetadata) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Aggregate indicates an expected call of Aggregate +func (mr *MockAdminSessionMockRecorder) Aggregate(namespace, q, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockAdminSession)(nil).Aggregate), namespace, q, opts) +} + +// ShardID mocks base method +func (m *MockAdminSession) ShardID(id ident.ID) (uint32, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardID", id) + ret0, _ := ret[0].(uint32) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ShardID indicates an expected call of ShardID +func (mr *MockAdminSessionMockRecorder) ShardID(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardID", reflect.TypeOf((*MockAdminSession)(nil).ShardID), id) +} + +// IteratorPools mocks base method +func (m *MockAdminSession) IteratorPools() (encoding.IteratorPools, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IteratorPools") + ret0, _ := ret[0].(encoding.IteratorPools) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IteratorPools indicates an expected call of IteratorPools +func (mr *MockAdminSessionMockRecorder) IteratorPools() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IteratorPools", reflect.TypeOf((*MockAdminSession)(nil).IteratorPools)) +} + +// Close mocks base method +func (m *MockAdminSession) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockAdminSessionMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockAdminSession)(nil).Close)) +} + +// Origin mocks base method +func (m *MockAdminSession) Origin() topology.Host { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Origin") + ret0, _ := ret[0].(topology.Host) + return ret0 +} + +// Origin indicates an expected call of Origin +func (mr *MockAdminSessionMockRecorder) Origin() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Origin", reflect.TypeOf((*MockAdminSession)(nil).Origin)) +} + +// Replicas mocks base method +func (m *MockAdminSession) Replicas() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Replicas") + ret0, _ := ret[0].(int) + return ret0 +} + +// Replicas indicates an expected call of Replicas +func (mr *MockAdminSessionMockRecorder) Replicas() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Replicas", reflect.TypeOf((*MockAdminSession)(nil).Replicas)) +} + +// TopologyMap mocks base method +func (m *MockAdminSession) TopologyMap() (topology.Map, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TopologyMap") + ret0, _ := ret[0].(topology.Map) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// TopologyMap indicates an expected call of TopologyMap +func (mr *MockAdminSessionMockRecorder) TopologyMap() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TopologyMap", reflect.TypeOf((*MockAdminSession)(nil).TopologyMap)) +} + +// Truncate mocks base method +func (m *MockAdminSession) Truncate(namespace ident.ID) (int64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Truncate", namespace) + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Truncate indicates an expected call of Truncate +func (mr *MockAdminSessionMockRecorder) Truncate(namespace interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Truncate", reflect.TypeOf((*MockAdminSession)(nil).Truncate), namespace) +} + +// FetchBootstrapBlocksFromPeers mocks base method +func (m *MockAdminSession) FetchBootstrapBlocksFromPeers(namespace namespace.Metadata, shard uint32, start, end time.Time, opts result.Options) (result.ShardResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBootstrapBlocksFromPeers", namespace, shard, start, end, opts) + ret0, _ := ret[0].(result.ShardResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBootstrapBlocksFromPeers indicates an expected call of FetchBootstrapBlocksFromPeers +func (mr *MockAdminSessionMockRecorder) FetchBootstrapBlocksFromPeers(namespace, shard, start, end, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBootstrapBlocksFromPeers", reflect.TypeOf((*MockAdminSession)(nil).FetchBootstrapBlocksFromPeers), namespace, shard, start, end, opts) +} + +// FetchBootstrapBlocksMetadataFromPeers mocks base method +func (m *MockAdminSession) FetchBootstrapBlocksMetadataFromPeers(namespace ident.ID, shard uint32, start, end time.Time, result result.Options) (PeerBlockMetadataIter, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBootstrapBlocksMetadataFromPeers", namespace, shard, start, end, result) + ret0, _ := ret[0].(PeerBlockMetadataIter) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBootstrapBlocksMetadataFromPeers indicates an expected call of FetchBootstrapBlocksMetadataFromPeers +func (mr *MockAdminSessionMockRecorder) FetchBootstrapBlocksMetadataFromPeers(namespace, shard, start, end, result interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBootstrapBlocksMetadataFromPeers", reflect.TypeOf((*MockAdminSession)(nil).FetchBootstrapBlocksMetadataFromPeers), namespace, shard, start, end, result) +} + +// FetchBlocksMetadataFromPeers mocks base method +func (m *MockAdminSession) FetchBlocksMetadataFromPeers(namespace ident.ID, shard uint32, start, end time.Time, consistencyLevel topology.ReadConsistencyLevel, result result.Options) (PeerBlockMetadataIter, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksMetadataFromPeers", namespace, shard, start, end, consistencyLevel, result) + ret0, _ := ret[0].(PeerBlockMetadataIter) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksMetadataFromPeers indicates an expected call of FetchBlocksMetadataFromPeers +func (mr *MockAdminSessionMockRecorder) FetchBlocksMetadataFromPeers(namespace, shard, start, end, consistencyLevel, result interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksMetadataFromPeers", reflect.TypeOf((*MockAdminSession)(nil).FetchBlocksMetadataFromPeers), namespace, shard, start, end, consistencyLevel, result) +} + +// FetchBlocksFromPeers mocks base method +func (m *MockAdminSession) FetchBlocksFromPeers(namespace namespace.Metadata, shard uint32, consistencyLevel topology.ReadConsistencyLevel, metadatas []block.ReplicaMetadata, opts result.Options) (PeerBlocksIter, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksFromPeers", namespace, shard, consistencyLevel, metadatas, opts) + ret0, _ := ret[0].(PeerBlocksIter) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksFromPeers indicates an expected call of FetchBlocksFromPeers +func (mr *MockAdminSessionMockRecorder) FetchBlocksFromPeers(namespace, shard, consistencyLevel, metadatas, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksFromPeers", reflect.TypeOf((*MockAdminSession)(nil).FetchBlocksFromPeers), namespace, shard, consistencyLevel, metadatas, opts) +} + +// MockOptions is a mock of Options interface +type MockOptions struct { + ctrl *gomock.Controller + recorder *MockOptionsMockRecorder +} + +// MockOptionsMockRecorder is the mock recorder for MockOptions +type MockOptionsMockRecorder struct { + mock *MockOptions +} + +// NewMockOptions creates a new mock instance +func NewMockOptions(ctrl *gomock.Controller) *MockOptions { + mock := &MockOptions{ctrl: ctrl} + mock.recorder = &MockOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptions) EXPECT() *MockOptionsMockRecorder { + return m.recorder +} + +// Validate mocks base method +func (m *MockOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockOptions)(nil).Validate)) +} + +// SetEncodingM3TSZ mocks base method +func (m *MockOptions) SetEncodingM3TSZ() Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEncodingM3TSZ") + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetEncodingM3TSZ indicates an expected call of SetEncodingM3TSZ +func (mr *MockOptionsMockRecorder) SetEncodingM3TSZ() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEncodingM3TSZ", reflect.TypeOf((*MockOptions)(nil).SetEncodingM3TSZ)) +} + +// SetEncodingProto mocks base method +func (m *MockOptions) SetEncodingProto(encodingOpts encoding.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEncodingProto", encodingOpts) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetEncodingProto indicates an expected call of SetEncodingProto +func (mr *MockOptionsMockRecorder) SetEncodingProto(encodingOpts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEncodingProto", reflect.TypeOf((*MockOptions)(nil).SetEncodingProto), encodingOpts) +} + +// IsSetEncodingProto mocks base method +func (m *MockOptions) IsSetEncodingProto() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsSetEncodingProto") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsSetEncodingProto indicates an expected call of IsSetEncodingProto +func (mr *MockOptionsMockRecorder) IsSetEncodingProto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSetEncodingProto", reflect.TypeOf((*MockOptions)(nil).IsSetEncodingProto)) +} + +// SetRuntimeOptionsManager mocks base method +func (m *MockOptions) SetRuntimeOptionsManager(value runtime.OptionsManager) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetRuntimeOptionsManager", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetRuntimeOptionsManager indicates an expected call of SetRuntimeOptionsManager +func (mr *MockOptionsMockRecorder) SetRuntimeOptionsManager(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetRuntimeOptionsManager", reflect.TypeOf((*MockOptions)(nil).SetRuntimeOptionsManager), value) +} + +// RuntimeOptionsManager mocks base method +func (m *MockOptions) RuntimeOptionsManager() runtime.OptionsManager { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RuntimeOptionsManager") + ret0, _ := ret[0].(runtime.OptionsManager) + return ret0 +} + +// RuntimeOptionsManager indicates an expected call of RuntimeOptionsManager +func (mr *MockOptionsMockRecorder) RuntimeOptionsManager() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RuntimeOptionsManager", reflect.TypeOf((*MockOptions)(nil).RuntimeOptionsManager)) +} + +// SetClockOptions mocks base method +func (m *MockOptions) SetClockOptions(value clock.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClockOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClockOptions indicates an expected call of SetClockOptions +func (mr *MockOptionsMockRecorder) SetClockOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClockOptions", reflect.TypeOf((*MockOptions)(nil).SetClockOptions), value) +} + +// ClockOptions mocks base method +func (m *MockOptions) ClockOptions() clock.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClockOptions") + ret0, _ := ret[0].(clock.Options) + return ret0 +} + +// ClockOptions indicates an expected call of ClockOptions +func (mr *MockOptionsMockRecorder) ClockOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClockOptions", reflect.TypeOf((*MockOptions)(nil).ClockOptions)) +} + +// SetInstrumentOptions mocks base method +func (m *MockOptions) SetInstrumentOptions(value instrument.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstrumentOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetInstrumentOptions indicates an expected call of SetInstrumentOptions +func (mr *MockOptionsMockRecorder) SetInstrumentOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstrumentOptions", reflect.TypeOf((*MockOptions)(nil).SetInstrumentOptions), value) +} + +// InstrumentOptions mocks base method +func (m *MockOptions) InstrumentOptions() instrument.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstrumentOptions") + ret0, _ := ret[0].(instrument.Options) + return ret0 +} + +// InstrumentOptions indicates an expected call of InstrumentOptions +func (mr *MockOptionsMockRecorder) InstrumentOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstrumentOptions", reflect.TypeOf((*MockOptions)(nil).InstrumentOptions)) +} + +// SetLogErrorSampleRate mocks base method +func (m *MockOptions) SetLogErrorSampleRate(value sampler.Rate) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetLogErrorSampleRate", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetLogErrorSampleRate indicates an expected call of SetLogErrorSampleRate +func (mr *MockOptionsMockRecorder) SetLogErrorSampleRate(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLogErrorSampleRate", reflect.TypeOf((*MockOptions)(nil).SetLogErrorSampleRate), value) +} + +// LogErrorSampleRate mocks base method +func (m *MockOptions) LogErrorSampleRate() sampler.Rate { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LogErrorSampleRate") + ret0, _ := ret[0].(sampler.Rate) + return ret0 +} + +// LogErrorSampleRate indicates an expected call of LogErrorSampleRate +func (mr *MockOptionsMockRecorder) LogErrorSampleRate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LogErrorSampleRate", reflect.TypeOf((*MockOptions)(nil).LogErrorSampleRate)) +} + +// SetTopologyInitializer mocks base method +func (m *MockOptions) SetTopologyInitializer(value topology.Initializer) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTopologyInitializer", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTopologyInitializer indicates an expected call of SetTopologyInitializer +func (mr *MockOptionsMockRecorder) SetTopologyInitializer(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTopologyInitializer", reflect.TypeOf((*MockOptions)(nil).SetTopologyInitializer), value) +} + +// TopologyInitializer mocks base method +func (m *MockOptions) TopologyInitializer() topology.Initializer { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TopologyInitializer") + ret0, _ := ret[0].(topology.Initializer) + return ret0 +} + +// TopologyInitializer indicates an expected call of TopologyInitializer +func (mr *MockOptionsMockRecorder) TopologyInitializer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TopologyInitializer", reflect.TypeOf((*MockOptions)(nil).TopologyInitializer)) +} + +// SetReadConsistencyLevel mocks base method +func (m *MockOptions) SetReadConsistencyLevel(value topology.ReadConsistencyLevel) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReadConsistencyLevel", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetReadConsistencyLevel indicates an expected call of SetReadConsistencyLevel +func (mr *MockOptionsMockRecorder) SetReadConsistencyLevel(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReadConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).SetReadConsistencyLevel), value) +} + +// ReadConsistencyLevel mocks base method +func (m *MockOptions) ReadConsistencyLevel() topology.ReadConsistencyLevel { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadConsistencyLevel") + ret0, _ := ret[0].(topology.ReadConsistencyLevel) + return ret0 +} + +// ReadConsistencyLevel indicates an expected call of ReadConsistencyLevel +func (mr *MockOptionsMockRecorder) ReadConsistencyLevel() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).ReadConsistencyLevel)) +} + +// SetWriteConsistencyLevel mocks base method +func (m *MockOptions) SetWriteConsistencyLevel(value topology.ConsistencyLevel) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteConsistencyLevel", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteConsistencyLevel indicates an expected call of SetWriteConsistencyLevel +func (mr *MockOptionsMockRecorder) SetWriteConsistencyLevel(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).SetWriteConsistencyLevel), value) +} + +// WriteConsistencyLevel mocks base method +func (m *MockOptions) WriteConsistencyLevel() topology.ConsistencyLevel { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteConsistencyLevel") + ret0, _ := ret[0].(topology.ConsistencyLevel) + return ret0 +} + +// WriteConsistencyLevel indicates an expected call of WriteConsistencyLevel +func (mr *MockOptionsMockRecorder) WriteConsistencyLevel() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).WriteConsistencyLevel)) +} + +// SetChannelOptions mocks base method +func (m *MockOptions) SetChannelOptions(value *tchannel.ChannelOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetChannelOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetChannelOptions indicates an expected call of SetChannelOptions +func (mr *MockOptionsMockRecorder) SetChannelOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetChannelOptions", reflect.TypeOf((*MockOptions)(nil).SetChannelOptions), value) +} + +// ChannelOptions mocks base method +func (m *MockOptions) ChannelOptions() *tchannel.ChannelOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChannelOptions") + ret0, _ := ret[0].(*tchannel.ChannelOptions) + return ret0 +} + +// ChannelOptions indicates an expected call of ChannelOptions +func (mr *MockOptionsMockRecorder) ChannelOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChannelOptions", reflect.TypeOf((*MockOptions)(nil).ChannelOptions)) +} + +// SetMaxConnectionCount mocks base method +func (m *MockOptions) SetMaxConnectionCount(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMaxConnectionCount", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetMaxConnectionCount indicates an expected call of SetMaxConnectionCount +func (mr *MockOptionsMockRecorder) SetMaxConnectionCount(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMaxConnectionCount", reflect.TypeOf((*MockOptions)(nil).SetMaxConnectionCount), value) +} + +// MaxConnectionCount mocks base method +func (m *MockOptions) MaxConnectionCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MaxConnectionCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// MaxConnectionCount indicates an expected call of MaxConnectionCount +func (mr *MockOptionsMockRecorder) MaxConnectionCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MaxConnectionCount", reflect.TypeOf((*MockOptions)(nil).MaxConnectionCount)) +} + +// SetMinConnectionCount mocks base method +func (m *MockOptions) SetMinConnectionCount(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMinConnectionCount", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetMinConnectionCount indicates an expected call of SetMinConnectionCount +func (mr *MockOptionsMockRecorder) SetMinConnectionCount(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMinConnectionCount", reflect.TypeOf((*MockOptions)(nil).SetMinConnectionCount), value) +} + +// MinConnectionCount mocks base method +func (m *MockOptions) MinConnectionCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinConnectionCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// MinConnectionCount indicates an expected call of MinConnectionCount +func (mr *MockOptionsMockRecorder) MinConnectionCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinConnectionCount", reflect.TypeOf((*MockOptions)(nil).MinConnectionCount)) +} + +// SetHostConnectTimeout mocks base method +func (m *MockOptions) SetHostConnectTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostConnectTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHostConnectTimeout indicates an expected call of SetHostConnectTimeout +func (mr *MockOptionsMockRecorder) SetHostConnectTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostConnectTimeout", reflect.TypeOf((*MockOptions)(nil).SetHostConnectTimeout), value) +} + +// HostConnectTimeout mocks base method +func (m *MockOptions) HostConnectTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostConnectTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// HostConnectTimeout indicates an expected call of HostConnectTimeout +func (mr *MockOptionsMockRecorder) HostConnectTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostConnectTimeout", reflect.TypeOf((*MockOptions)(nil).HostConnectTimeout)) +} + +// SetClusterConnectTimeout mocks base method +func (m *MockOptions) SetClusterConnectTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClusterConnectTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClusterConnectTimeout indicates an expected call of SetClusterConnectTimeout +func (mr *MockOptionsMockRecorder) SetClusterConnectTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClusterConnectTimeout", reflect.TypeOf((*MockOptions)(nil).SetClusterConnectTimeout), value) +} + +// ClusterConnectTimeout mocks base method +func (m *MockOptions) ClusterConnectTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClusterConnectTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// ClusterConnectTimeout indicates an expected call of ClusterConnectTimeout +func (mr *MockOptionsMockRecorder) ClusterConnectTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClusterConnectTimeout", reflect.TypeOf((*MockOptions)(nil).ClusterConnectTimeout)) +} + +// SetClusterConnectConsistencyLevel mocks base method +func (m *MockOptions) SetClusterConnectConsistencyLevel(value topology.ConnectConsistencyLevel) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClusterConnectConsistencyLevel", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClusterConnectConsistencyLevel indicates an expected call of SetClusterConnectConsistencyLevel +func (mr *MockOptionsMockRecorder) SetClusterConnectConsistencyLevel(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClusterConnectConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).SetClusterConnectConsistencyLevel), value) +} + +// ClusterConnectConsistencyLevel mocks base method +func (m *MockOptions) ClusterConnectConsistencyLevel() topology.ConnectConsistencyLevel { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClusterConnectConsistencyLevel") + ret0, _ := ret[0].(topology.ConnectConsistencyLevel) + return ret0 +} + +// ClusterConnectConsistencyLevel indicates an expected call of ClusterConnectConsistencyLevel +func (mr *MockOptionsMockRecorder) ClusterConnectConsistencyLevel() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClusterConnectConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).ClusterConnectConsistencyLevel)) +} + +// SetWriteRequestTimeout mocks base method +func (m *MockOptions) SetWriteRequestTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteRequestTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteRequestTimeout indicates an expected call of SetWriteRequestTimeout +func (mr *MockOptionsMockRecorder) SetWriteRequestTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteRequestTimeout", reflect.TypeOf((*MockOptions)(nil).SetWriteRequestTimeout), value) +} + +// WriteRequestTimeout mocks base method +func (m *MockOptions) WriteRequestTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteRequestTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// WriteRequestTimeout indicates an expected call of WriteRequestTimeout +func (mr *MockOptionsMockRecorder) WriteRequestTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteRequestTimeout", reflect.TypeOf((*MockOptions)(nil).WriteRequestTimeout)) +} + +// SetFetchRequestTimeout mocks base method +func (m *MockOptions) SetFetchRequestTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchRequestTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFetchRequestTimeout indicates an expected call of SetFetchRequestTimeout +func (mr *MockOptionsMockRecorder) SetFetchRequestTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchRequestTimeout", reflect.TypeOf((*MockOptions)(nil).SetFetchRequestTimeout), value) +} + +// FetchRequestTimeout mocks base method +func (m *MockOptions) FetchRequestTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchRequestTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// FetchRequestTimeout indicates an expected call of FetchRequestTimeout +func (mr *MockOptionsMockRecorder) FetchRequestTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchRequestTimeout", reflect.TypeOf((*MockOptions)(nil).FetchRequestTimeout)) +} + +// SetTruncateRequestTimeout mocks base method +func (m *MockOptions) SetTruncateRequestTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTruncateRequestTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTruncateRequestTimeout indicates an expected call of SetTruncateRequestTimeout +func (mr *MockOptionsMockRecorder) SetTruncateRequestTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTruncateRequestTimeout", reflect.TypeOf((*MockOptions)(nil).SetTruncateRequestTimeout), value) +} + +// TruncateRequestTimeout mocks base method +func (m *MockOptions) TruncateRequestTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TruncateRequestTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// TruncateRequestTimeout indicates an expected call of TruncateRequestTimeout +func (mr *MockOptionsMockRecorder) TruncateRequestTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TruncateRequestTimeout", reflect.TypeOf((*MockOptions)(nil).TruncateRequestTimeout)) +} + +// SetBackgroundConnectInterval mocks base method +func (m *MockOptions) SetBackgroundConnectInterval(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundConnectInterval", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundConnectInterval indicates an expected call of SetBackgroundConnectInterval +func (mr *MockOptionsMockRecorder) SetBackgroundConnectInterval(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundConnectInterval", reflect.TypeOf((*MockOptions)(nil).SetBackgroundConnectInterval), value) +} + +// BackgroundConnectInterval mocks base method +func (m *MockOptions) BackgroundConnectInterval() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundConnectInterval") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BackgroundConnectInterval indicates an expected call of BackgroundConnectInterval +func (mr *MockOptionsMockRecorder) BackgroundConnectInterval() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundConnectInterval", reflect.TypeOf((*MockOptions)(nil).BackgroundConnectInterval)) +} + +// SetBackgroundConnectStutter mocks base method +func (m *MockOptions) SetBackgroundConnectStutter(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundConnectStutter", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundConnectStutter indicates an expected call of SetBackgroundConnectStutter +func (mr *MockOptionsMockRecorder) SetBackgroundConnectStutter(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundConnectStutter", reflect.TypeOf((*MockOptions)(nil).SetBackgroundConnectStutter), value) +} + +// BackgroundConnectStutter mocks base method +func (m *MockOptions) BackgroundConnectStutter() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundConnectStutter") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BackgroundConnectStutter indicates an expected call of BackgroundConnectStutter +func (mr *MockOptionsMockRecorder) BackgroundConnectStutter() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundConnectStutter", reflect.TypeOf((*MockOptions)(nil).BackgroundConnectStutter)) +} + +// SetBackgroundHealthCheckInterval mocks base method +func (m *MockOptions) SetBackgroundHealthCheckInterval(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundHealthCheckInterval", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundHealthCheckInterval indicates an expected call of SetBackgroundHealthCheckInterval +func (mr *MockOptionsMockRecorder) SetBackgroundHealthCheckInterval(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundHealthCheckInterval", reflect.TypeOf((*MockOptions)(nil).SetBackgroundHealthCheckInterval), value) +} + +// BackgroundHealthCheckInterval mocks base method +func (m *MockOptions) BackgroundHealthCheckInterval() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundHealthCheckInterval") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BackgroundHealthCheckInterval indicates an expected call of BackgroundHealthCheckInterval +func (mr *MockOptionsMockRecorder) BackgroundHealthCheckInterval() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundHealthCheckInterval", reflect.TypeOf((*MockOptions)(nil).BackgroundHealthCheckInterval)) +} + +// SetBackgroundHealthCheckStutter mocks base method +func (m *MockOptions) SetBackgroundHealthCheckStutter(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundHealthCheckStutter", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundHealthCheckStutter indicates an expected call of SetBackgroundHealthCheckStutter +func (mr *MockOptionsMockRecorder) SetBackgroundHealthCheckStutter(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundHealthCheckStutter", reflect.TypeOf((*MockOptions)(nil).SetBackgroundHealthCheckStutter), value) +} + +// BackgroundHealthCheckStutter mocks base method +func (m *MockOptions) BackgroundHealthCheckStutter() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundHealthCheckStutter") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BackgroundHealthCheckStutter indicates an expected call of BackgroundHealthCheckStutter +func (mr *MockOptionsMockRecorder) BackgroundHealthCheckStutter() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundHealthCheckStutter", reflect.TypeOf((*MockOptions)(nil).BackgroundHealthCheckStutter)) +} + +// SetBackgroundHealthCheckFailLimit mocks base method +func (m *MockOptions) SetBackgroundHealthCheckFailLimit(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundHealthCheckFailLimit", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundHealthCheckFailLimit indicates an expected call of SetBackgroundHealthCheckFailLimit +func (mr *MockOptionsMockRecorder) SetBackgroundHealthCheckFailLimit(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundHealthCheckFailLimit", reflect.TypeOf((*MockOptions)(nil).SetBackgroundHealthCheckFailLimit), value) +} + +// BackgroundHealthCheckFailLimit mocks base method +func (m *MockOptions) BackgroundHealthCheckFailLimit() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundHealthCheckFailLimit") + ret0, _ := ret[0].(int) + return ret0 +} + +// BackgroundHealthCheckFailLimit indicates an expected call of BackgroundHealthCheckFailLimit +func (mr *MockOptionsMockRecorder) BackgroundHealthCheckFailLimit() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundHealthCheckFailLimit", reflect.TypeOf((*MockOptions)(nil).BackgroundHealthCheckFailLimit)) +} + +// SetBackgroundHealthCheckFailThrottleFactor mocks base method +func (m *MockOptions) SetBackgroundHealthCheckFailThrottleFactor(value float64) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundHealthCheckFailThrottleFactor", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundHealthCheckFailThrottleFactor indicates an expected call of SetBackgroundHealthCheckFailThrottleFactor +func (mr *MockOptionsMockRecorder) SetBackgroundHealthCheckFailThrottleFactor(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundHealthCheckFailThrottleFactor", reflect.TypeOf((*MockOptions)(nil).SetBackgroundHealthCheckFailThrottleFactor), value) +} + +// BackgroundHealthCheckFailThrottleFactor mocks base method +func (m *MockOptions) BackgroundHealthCheckFailThrottleFactor() float64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundHealthCheckFailThrottleFactor") + ret0, _ := ret[0].(float64) + return ret0 +} + +// BackgroundHealthCheckFailThrottleFactor indicates an expected call of BackgroundHealthCheckFailThrottleFactor +func (mr *MockOptionsMockRecorder) BackgroundHealthCheckFailThrottleFactor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundHealthCheckFailThrottleFactor", reflect.TypeOf((*MockOptions)(nil).BackgroundHealthCheckFailThrottleFactor)) +} + +// SetWriteRetrier mocks base method +func (m *MockOptions) SetWriteRetrier(value retry.Retrier) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteRetrier", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteRetrier indicates an expected call of SetWriteRetrier +func (mr *MockOptionsMockRecorder) SetWriteRetrier(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteRetrier", reflect.TypeOf((*MockOptions)(nil).SetWriteRetrier), value) +} + +// WriteRetrier mocks base method +func (m *MockOptions) WriteRetrier() retry.Retrier { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteRetrier") + ret0, _ := ret[0].(retry.Retrier) + return ret0 +} + +// WriteRetrier indicates an expected call of WriteRetrier +func (mr *MockOptionsMockRecorder) WriteRetrier() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteRetrier", reflect.TypeOf((*MockOptions)(nil).WriteRetrier)) +} + +// SetFetchRetrier mocks base method +func (m *MockOptions) SetFetchRetrier(value retry.Retrier) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchRetrier", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFetchRetrier indicates an expected call of SetFetchRetrier +func (mr *MockOptionsMockRecorder) SetFetchRetrier(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchRetrier", reflect.TypeOf((*MockOptions)(nil).SetFetchRetrier), value) +} + +// FetchRetrier mocks base method +func (m *MockOptions) FetchRetrier() retry.Retrier { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchRetrier") + ret0, _ := ret[0].(retry.Retrier) + return ret0 +} + +// FetchRetrier indicates an expected call of FetchRetrier +func (mr *MockOptionsMockRecorder) FetchRetrier() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchRetrier", reflect.TypeOf((*MockOptions)(nil).FetchRetrier)) +} + +// SetWriteShardsInitializing mocks base method +func (m *MockOptions) SetWriteShardsInitializing(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteShardsInitializing", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteShardsInitializing indicates an expected call of SetWriteShardsInitializing +func (mr *MockOptionsMockRecorder) SetWriteShardsInitializing(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteShardsInitializing", reflect.TypeOf((*MockOptions)(nil).SetWriteShardsInitializing), value) +} + +// WriteShardsInitializing mocks base method +func (m *MockOptions) WriteShardsInitializing() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteShardsInitializing") + ret0, _ := ret[0].(bool) + return ret0 +} + +// WriteShardsInitializing indicates an expected call of WriteShardsInitializing +func (mr *MockOptionsMockRecorder) WriteShardsInitializing() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteShardsInitializing", reflect.TypeOf((*MockOptions)(nil).WriteShardsInitializing)) +} + +// SetShardsLeavingCountTowardsConsistency mocks base method +func (m *MockOptions) SetShardsLeavingCountTowardsConsistency(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetShardsLeavingCountTowardsConsistency", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetShardsLeavingCountTowardsConsistency indicates an expected call of SetShardsLeavingCountTowardsConsistency +func (mr *MockOptionsMockRecorder) SetShardsLeavingCountTowardsConsistency(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetShardsLeavingCountTowardsConsistency", reflect.TypeOf((*MockOptions)(nil).SetShardsLeavingCountTowardsConsistency), value) +} + +// ShardsLeavingCountTowardsConsistency mocks base method +func (m *MockOptions) ShardsLeavingCountTowardsConsistency() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardsLeavingCountTowardsConsistency") + ret0, _ := ret[0].(bool) + return ret0 +} + +// ShardsLeavingCountTowardsConsistency indicates an expected call of ShardsLeavingCountTowardsConsistency +func (mr *MockOptionsMockRecorder) ShardsLeavingCountTowardsConsistency() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardsLeavingCountTowardsConsistency", reflect.TypeOf((*MockOptions)(nil).ShardsLeavingCountTowardsConsistency)) +} + +// SetTagEncoderOptions mocks base method +func (m *MockOptions) SetTagEncoderOptions(value serialize.TagEncoderOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTagEncoderOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTagEncoderOptions indicates an expected call of SetTagEncoderOptions +func (mr *MockOptionsMockRecorder) SetTagEncoderOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTagEncoderOptions", reflect.TypeOf((*MockOptions)(nil).SetTagEncoderOptions), value) +} + +// TagEncoderOptions mocks base method +func (m *MockOptions) TagEncoderOptions() serialize.TagEncoderOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagEncoderOptions") + ret0, _ := ret[0].(serialize.TagEncoderOptions) + return ret0 +} + +// TagEncoderOptions indicates an expected call of TagEncoderOptions +func (mr *MockOptionsMockRecorder) TagEncoderOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagEncoderOptions", reflect.TypeOf((*MockOptions)(nil).TagEncoderOptions)) +} + +// SetTagEncoderPoolSize mocks base method +func (m *MockOptions) SetTagEncoderPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTagEncoderPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTagEncoderPoolSize indicates an expected call of SetTagEncoderPoolSize +func (mr *MockOptionsMockRecorder) SetTagEncoderPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTagEncoderPoolSize", reflect.TypeOf((*MockOptions)(nil).SetTagEncoderPoolSize), value) +} + +// TagEncoderPoolSize mocks base method +func (m *MockOptions) TagEncoderPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagEncoderPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// TagEncoderPoolSize indicates an expected call of TagEncoderPoolSize +func (mr *MockOptionsMockRecorder) TagEncoderPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagEncoderPoolSize", reflect.TypeOf((*MockOptions)(nil).TagEncoderPoolSize)) +} + +// SetTagDecoderOptions mocks base method +func (m *MockOptions) SetTagDecoderOptions(value serialize.TagDecoderOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTagDecoderOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTagDecoderOptions indicates an expected call of SetTagDecoderOptions +func (mr *MockOptionsMockRecorder) SetTagDecoderOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTagDecoderOptions", reflect.TypeOf((*MockOptions)(nil).SetTagDecoderOptions), value) +} + +// TagDecoderOptions mocks base method +func (m *MockOptions) TagDecoderOptions() serialize.TagDecoderOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagDecoderOptions") + ret0, _ := ret[0].(serialize.TagDecoderOptions) + return ret0 +} + +// TagDecoderOptions indicates an expected call of TagDecoderOptions +func (mr *MockOptionsMockRecorder) TagDecoderOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagDecoderOptions", reflect.TypeOf((*MockOptions)(nil).TagDecoderOptions)) +} + +// SetTagDecoderPoolSize mocks base method +func (m *MockOptions) SetTagDecoderPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTagDecoderPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTagDecoderPoolSize indicates an expected call of SetTagDecoderPoolSize +func (mr *MockOptionsMockRecorder) SetTagDecoderPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTagDecoderPoolSize", reflect.TypeOf((*MockOptions)(nil).SetTagDecoderPoolSize), value) +} + +// TagDecoderPoolSize mocks base method +func (m *MockOptions) TagDecoderPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagDecoderPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// TagDecoderPoolSize indicates an expected call of TagDecoderPoolSize +func (mr *MockOptionsMockRecorder) TagDecoderPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagDecoderPoolSize", reflect.TypeOf((*MockOptions)(nil).TagDecoderPoolSize)) +} + +// SetWriteBatchSize mocks base method +func (m *MockOptions) SetWriteBatchSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteBatchSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteBatchSize indicates an expected call of SetWriteBatchSize +func (mr *MockOptionsMockRecorder) SetWriteBatchSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteBatchSize", reflect.TypeOf((*MockOptions)(nil).SetWriteBatchSize), value) +} + +// WriteBatchSize mocks base method +func (m *MockOptions) WriteBatchSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteBatchSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// WriteBatchSize indicates an expected call of WriteBatchSize +func (mr *MockOptionsMockRecorder) WriteBatchSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBatchSize", reflect.TypeOf((*MockOptions)(nil).WriteBatchSize)) +} + +// SetFetchBatchSize mocks base method +func (m *MockOptions) SetFetchBatchSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchBatchSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFetchBatchSize indicates an expected call of SetFetchBatchSize +func (mr *MockOptionsMockRecorder) SetFetchBatchSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchBatchSize", reflect.TypeOf((*MockOptions)(nil).SetFetchBatchSize), value) +} + +// FetchBatchSize mocks base method +func (m *MockOptions) FetchBatchSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBatchSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// FetchBatchSize indicates an expected call of FetchBatchSize +func (mr *MockOptionsMockRecorder) FetchBatchSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBatchSize", reflect.TypeOf((*MockOptions)(nil).FetchBatchSize)) +} + +// SetWriteOpPoolSize mocks base method +func (m *MockOptions) SetWriteOpPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteOpPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteOpPoolSize indicates an expected call of SetWriteOpPoolSize +func (mr *MockOptionsMockRecorder) SetWriteOpPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteOpPoolSize", reflect.TypeOf((*MockOptions)(nil).SetWriteOpPoolSize), value) +} + +// WriteOpPoolSize mocks base method +func (m *MockOptions) WriteOpPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteOpPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// WriteOpPoolSize indicates an expected call of WriteOpPoolSize +func (mr *MockOptionsMockRecorder) WriteOpPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteOpPoolSize", reflect.TypeOf((*MockOptions)(nil).WriteOpPoolSize)) +} + +// SetWriteTaggedOpPoolSize mocks base method +func (m *MockOptions) SetWriteTaggedOpPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteTaggedOpPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteTaggedOpPoolSize indicates an expected call of SetWriteTaggedOpPoolSize +func (mr *MockOptionsMockRecorder) SetWriteTaggedOpPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteTaggedOpPoolSize", reflect.TypeOf((*MockOptions)(nil).SetWriteTaggedOpPoolSize), value) +} + +// WriteTaggedOpPoolSize mocks base method +func (m *MockOptions) WriteTaggedOpPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTaggedOpPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// WriteTaggedOpPoolSize indicates an expected call of WriteTaggedOpPoolSize +func (mr *MockOptionsMockRecorder) WriteTaggedOpPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTaggedOpPoolSize", reflect.TypeOf((*MockOptions)(nil).WriteTaggedOpPoolSize)) +} + +// SetFetchBatchOpPoolSize mocks base method +func (m *MockOptions) SetFetchBatchOpPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchBatchOpPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFetchBatchOpPoolSize indicates an expected call of SetFetchBatchOpPoolSize +func (mr *MockOptionsMockRecorder) SetFetchBatchOpPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchBatchOpPoolSize", reflect.TypeOf((*MockOptions)(nil).SetFetchBatchOpPoolSize), value) +} + +// FetchBatchOpPoolSize mocks base method +func (m *MockOptions) FetchBatchOpPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBatchOpPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// FetchBatchOpPoolSize indicates an expected call of FetchBatchOpPoolSize +func (mr *MockOptionsMockRecorder) FetchBatchOpPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBatchOpPoolSize", reflect.TypeOf((*MockOptions)(nil).FetchBatchOpPoolSize)) +} + +// SetCheckedBytesWrapperPoolSize mocks base method +func (m *MockOptions) SetCheckedBytesWrapperPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCheckedBytesWrapperPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetCheckedBytesWrapperPoolSize indicates an expected call of SetCheckedBytesWrapperPoolSize +func (mr *MockOptionsMockRecorder) SetCheckedBytesWrapperPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCheckedBytesWrapperPoolSize", reflect.TypeOf((*MockOptions)(nil).SetCheckedBytesWrapperPoolSize), value) +} + +// CheckedBytesWrapperPoolSize mocks base method +func (m *MockOptions) CheckedBytesWrapperPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckedBytesWrapperPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// CheckedBytesWrapperPoolSize indicates an expected call of CheckedBytesWrapperPoolSize +func (mr *MockOptionsMockRecorder) CheckedBytesWrapperPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckedBytesWrapperPoolSize", reflect.TypeOf((*MockOptions)(nil).CheckedBytesWrapperPoolSize)) +} + +// SetHostQueueOpsFlushSize mocks base method +func (m *MockOptions) SetHostQueueOpsFlushSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostQueueOpsFlushSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHostQueueOpsFlushSize indicates an expected call of SetHostQueueOpsFlushSize +func (mr *MockOptionsMockRecorder) SetHostQueueOpsFlushSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostQueueOpsFlushSize", reflect.TypeOf((*MockOptions)(nil).SetHostQueueOpsFlushSize), value) +} + +// HostQueueOpsFlushSize mocks base method +func (m *MockOptions) HostQueueOpsFlushSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostQueueOpsFlushSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// HostQueueOpsFlushSize indicates an expected call of HostQueueOpsFlushSize +func (mr *MockOptionsMockRecorder) HostQueueOpsFlushSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostQueueOpsFlushSize", reflect.TypeOf((*MockOptions)(nil).HostQueueOpsFlushSize)) +} + +// SetHostQueueOpsFlushInterval mocks base method +func (m *MockOptions) SetHostQueueOpsFlushInterval(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostQueueOpsFlushInterval", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHostQueueOpsFlushInterval indicates an expected call of SetHostQueueOpsFlushInterval +func (mr *MockOptionsMockRecorder) SetHostQueueOpsFlushInterval(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostQueueOpsFlushInterval", reflect.TypeOf((*MockOptions)(nil).SetHostQueueOpsFlushInterval), value) +} + +// HostQueueOpsFlushInterval mocks base method +func (m *MockOptions) HostQueueOpsFlushInterval() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostQueueOpsFlushInterval") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// HostQueueOpsFlushInterval indicates an expected call of HostQueueOpsFlushInterval +func (mr *MockOptionsMockRecorder) HostQueueOpsFlushInterval() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostQueueOpsFlushInterval", reflect.TypeOf((*MockOptions)(nil).HostQueueOpsFlushInterval)) +} + +// SetContextPool mocks base method +func (m *MockOptions) SetContextPool(value context.Pool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetContextPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetContextPool indicates an expected call of SetContextPool +func (mr *MockOptionsMockRecorder) SetContextPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetContextPool", reflect.TypeOf((*MockOptions)(nil).SetContextPool), value) +} + +// ContextPool mocks base method +func (m *MockOptions) ContextPool() context.Pool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContextPool") + ret0, _ := ret[0].(context.Pool) + return ret0 +} + +// ContextPool indicates an expected call of ContextPool +func (mr *MockOptionsMockRecorder) ContextPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContextPool", reflect.TypeOf((*MockOptions)(nil).ContextPool)) +} + +// SetIdentifierPool mocks base method +func (m *MockOptions) SetIdentifierPool(value ident.Pool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIdentifierPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIdentifierPool indicates an expected call of SetIdentifierPool +func (mr *MockOptionsMockRecorder) SetIdentifierPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIdentifierPool", reflect.TypeOf((*MockOptions)(nil).SetIdentifierPool), value) +} + +// IdentifierPool mocks base method +func (m *MockOptions) IdentifierPool() ident.Pool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IdentifierPool") + ret0, _ := ret[0].(ident.Pool) + return ret0 +} + +// IdentifierPool indicates an expected call of IdentifierPool +func (mr *MockOptionsMockRecorder) IdentifierPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IdentifierPool", reflect.TypeOf((*MockOptions)(nil).IdentifierPool)) +} + +// SetHostQueueOpsArrayPoolSize mocks base method +func (m *MockOptions) SetHostQueueOpsArrayPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostQueueOpsArrayPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHostQueueOpsArrayPoolSize indicates an expected call of SetHostQueueOpsArrayPoolSize +func (mr *MockOptionsMockRecorder) SetHostQueueOpsArrayPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostQueueOpsArrayPoolSize", reflect.TypeOf((*MockOptions)(nil).SetHostQueueOpsArrayPoolSize), value) +} + +// HostQueueOpsArrayPoolSize mocks base method +func (m *MockOptions) HostQueueOpsArrayPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostQueueOpsArrayPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// HostQueueOpsArrayPoolSize indicates an expected call of HostQueueOpsArrayPoolSize +func (mr *MockOptionsMockRecorder) HostQueueOpsArrayPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostQueueOpsArrayPoolSize", reflect.TypeOf((*MockOptions)(nil).HostQueueOpsArrayPoolSize)) +} + +// SetHostQueueEmitsHealthStatus mocks base method +func (m *MockOptions) SetHostQueueEmitsHealthStatus(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostQueueEmitsHealthStatus", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHostQueueEmitsHealthStatus indicates an expected call of SetHostQueueEmitsHealthStatus +func (mr *MockOptionsMockRecorder) SetHostQueueEmitsHealthStatus(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostQueueEmitsHealthStatus", reflect.TypeOf((*MockOptions)(nil).SetHostQueueEmitsHealthStatus), value) +} + +// HostQueueEmitsHealthStatus mocks base method +func (m *MockOptions) HostQueueEmitsHealthStatus() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostQueueEmitsHealthStatus") + ret0, _ := ret[0].(bool) + return ret0 +} + +// HostQueueEmitsHealthStatus indicates an expected call of HostQueueEmitsHealthStatus +func (mr *MockOptionsMockRecorder) HostQueueEmitsHealthStatus() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostQueueEmitsHealthStatus", reflect.TypeOf((*MockOptions)(nil).HostQueueEmitsHealthStatus)) +} + +// SetSeriesIteratorPoolSize mocks base method +func (m *MockOptions) SetSeriesIteratorPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSeriesIteratorPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetSeriesIteratorPoolSize indicates an expected call of SetSeriesIteratorPoolSize +func (mr *MockOptionsMockRecorder) SetSeriesIteratorPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSeriesIteratorPoolSize", reflect.TypeOf((*MockOptions)(nil).SetSeriesIteratorPoolSize), value) +} + +// SeriesIteratorPoolSize mocks base method +func (m *MockOptions) SeriesIteratorPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SeriesIteratorPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// SeriesIteratorPoolSize indicates an expected call of SeriesIteratorPoolSize +func (mr *MockOptionsMockRecorder) SeriesIteratorPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SeriesIteratorPoolSize", reflect.TypeOf((*MockOptions)(nil).SeriesIteratorPoolSize)) +} + +// SetSeriesIteratorArrayPoolBuckets mocks base method +func (m *MockOptions) SetSeriesIteratorArrayPoolBuckets(value []pool.Bucket) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSeriesIteratorArrayPoolBuckets", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetSeriesIteratorArrayPoolBuckets indicates an expected call of SetSeriesIteratorArrayPoolBuckets +func (mr *MockOptionsMockRecorder) SetSeriesIteratorArrayPoolBuckets(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSeriesIteratorArrayPoolBuckets", reflect.TypeOf((*MockOptions)(nil).SetSeriesIteratorArrayPoolBuckets), value) +} + +// SeriesIteratorArrayPoolBuckets mocks base method +func (m *MockOptions) SeriesIteratorArrayPoolBuckets() []pool.Bucket { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SeriesIteratorArrayPoolBuckets") + ret0, _ := ret[0].([]pool.Bucket) + return ret0 +} + +// SeriesIteratorArrayPoolBuckets indicates an expected call of SeriesIteratorArrayPoolBuckets +func (mr *MockOptionsMockRecorder) SeriesIteratorArrayPoolBuckets() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SeriesIteratorArrayPoolBuckets", reflect.TypeOf((*MockOptions)(nil).SeriesIteratorArrayPoolBuckets)) +} + +// SetReaderIteratorAllocate mocks base method +func (m *MockOptions) SetReaderIteratorAllocate(value encoding.ReaderIteratorAllocate) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReaderIteratorAllocate", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetReaderIteratorAllocate indicates an expected call of SetReaderIteratorAllocate +func (mr *MockOptionsMockRecorder) SetReaderIteratorAllocate(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReaderIteratorAllocate", reflect.TypeOf((*MockOptions)(nil).SetReaderIteratorAllocate), value) +} + +// ReaderIteratorAllocate mocks base method +func (m *MockOptions) ReaderIteratorAllocate() encoding.ReaderIteratorAllocate { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReaderIteratorAllocate") + ret0, _ := ret[0].(encoding.ReaderIteratorAllocate) + return ret0 +} + +// ReaderIteratorAllocate indicates an expected call of ReaderIteratorAllocate +func (mr *MockOptionsMockRecorder) ReaderIteratorAllocate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReaderIteratorAllocate", reflect.TypeOf((*MockOptions)(nil).ReaderIteratorAllocate)) +} + +// SetSchemaRegistry mocks base method +func (m *MockOptions) SetSchemaRegistry(registry namespace.SchemaRegistry) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSchemaRegistry", registry) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetSchemaRegistry indicates an expected call of SetSchemaRegistry +func (mr *MockOptionsMockRecorder) SetSchemaRegistry(registry interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSchemaRegistry", reflect.TypeOf((*MockOptions)(nil).SetSchemaRegistry), registry) +} + +// SchemaRegistry mocks base method +func (m *MockOptions) SchemaRegistry() namespace.SchemaRegistry { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SchemaRegistry") + ret0, _ := ret[0].(namespace.SchemaRegistry) + return ret0 +} + +// SchemaRegistry indicates an expected call of SchemaRegistry +func (mr *MockOptionsMockRecorder) SchemaRegistry() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SchemaRegistry", reflect.TypeOf((*MockOptions)(nil).SchemaRegistry)) +} + +// SetAsyncTopologyInitializers mocks base method +func (m *MockOptions) SetAsyncTopologyInitializers(value []topology.Initializer) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAsyncTopologyInitializers", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAsyncTopologyInitializers indicates an expected call of SetAsyncTopologyInitializers +func (mr *MockOptionsMockRecorder) SetAsyncTopologyInitializers(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAsyncTopologyInitializers", reflect.TypeOf((*MockOptions)(nil).SetAsyncTopologyInitializers), value) +} + +// AsyncTopologyInitializers mocks base method +func (m *MockOptions) AsyncTopologyInitializers() []topology.Initializer { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AsyncTopologyInitializers") + ret0, _ := ret[0].([]topology.Initializer) + return ret0 +} + +// AsyncTopologyInitializers indicates an expected call of AsyncTopologyInitializers +func (mr *MockOptionsMockRecorder) AsyncTopologyInitializers() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AsyncTopologyInitializers", reflect.TypeOf((*MockOptions)(nil).AsyncTopologyInitializers)) +} + +// SetAsyncWriteWorkerPool mocks base method +func (m *MockOptions) SetAsyncWriteWorkerPool(value sync.PooledWorkerPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAsyncWriteWorkerPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAsyncWriteWorkerPool indicates an expected call of SetAsyncWriteWorkerPool +func (mr *MockOptionsMockRecorder) SetAsyncWriteWorkerPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAsyncWriteWorkerPool", reflect.TypeOf((*MockOptions)(nil).SetAsyncWriteWorkerPool), value) +} + +// AsyncWriteWorkerPool mocks base method +func (m *MockOptions) AsyncWriteWorkerPool() sync.PooledWorkerPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AsyncWriteWorkerPool") + ret0, _ := ret[0].(sync.PooledWorkerPool) + return ret0 +} + +// AsyncWriteWorkerPool indicates an expected call of AsyncWriteWorkerPool +func (mr *MockOptionsMockRecorder) AsyncWriteWorkerPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AsyncWriteWorkerPool", reflect.TypeOf((*MockOptions)(nil).AsyncWriteWorkerPool)) +} + +// SetAsyncWriteMaxConcurrency mocks base method +func (m *MockOptions) SetAsyncWriteMaxConcurrency(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAsyncWriteMaxConcurrency", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAsyncWriteMaxConcurrency indicates an expected call of SetAsyncWriteMaxConcurrency +func (mr *MockOptionsMockRecorder) SetAsyncWriteMaxConcurrency(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAsyncWriteMaxConcurrency", reflect.TypeOf((*MockOptions)(nil).SetAsyncWriteMaxConcurrency), value) +} + +// AsyncWriteMaxConcurrency mocks base method +func (m *MockOptions) AsyncWriteMaxConcurrency() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AsyncWriteMaxConcurrency") + ret0, _ := ret[0].(int) + return ret0 +} + +// AsyncWriteMaxConcurrency indicates an expected call of AsyncWriteMaxConcurrency +func (mr *MockOptionsMockRecorder) AsyncWriteMaxConcurrency() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AsyncWriteMaxConcurrency", reflect.TypeOf((*MockOptions)(nil).AsyncWriteMaxConcurrency)) +} + +// SetUseV2BatchAPIs mocks base method +func (m *MockOptions) SetUseV2BatchAPIs(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetUseV2BatchAPIs", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetUseV2BatchAPIs indicates an expected call of SetUseV2BatchAPIs +func (mr *MockOptionsMockRecorder) SetUseV2BatchAPIs(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetUseV2BatchAPIs", reflect.TypeOf((*MockOptions)(nil).SetUseV2BatchAPIs), value) +} + +// UseV2BatchAPIs mocks base method +func (m *MockOptions) UseV2BatchAPIs() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UseV2BatchAPIs") + ret0, _ := ret[0].(bool) + return ret0 +} + +// UseV2BatchAPIs indicates an expected call of UseV2BatchAPIs +func (mr *MockOptionsMockRecorder) UseV2BatchAPIs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UseV2BatchAPIs", reflect.TypeOf((*MockOptions)(nil).UseV2BatchAPIs)) +} + +// SetIterationOptions mocks base method +func (m *MockOptions) SetIterationOptions(arg0 index.IterationOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIterationOptions", arg0) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIterationOptions indicates an expected call of SetIterationOptions +func (mr *MockOptionsMockRecorder) SetIterationOptions(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIterationOptions", reflect.TypeOf((*MockOptions)(nil).SetIterationOptions), arg0) +} + +// IterationOptions mocks base method +func (m *MockOptions) IterationOptions() index.IterationOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IterationOptions") + ret0, _ := ret[0].(index.IterationOptions) + return ret0 +} + +// IterationOptions indicates an expected call of IterationOptions +func (mr *MockOptionsMockRecorder) IterationOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterationOptions", reflect.TypeOf((*MockOptions)(nil).IterationOptions)) +} + +// SetWriteTimestampOffset mocks base method +func (m *MockOptions) SetWriteTimestampOffset(value time.Duration) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteTimestampOffset", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetWriteTimestampOffset indicates an expected call of SetWriteTimestampOffset +func (mr *MockOptionsMockRecorder) SetWriteTimestampOffset(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteTimestampOffset", reflect.TypeOf((*MockOptions)(nil).SetWriteTimestampOffset), value) +} + +// WriteTimestampOffset mocks base method +func (m *MockOptions) WriteTimestampOffset() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTimestampOffset") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// WriteTimestampOffset indicates an expected call of WriteTimestampOffset +func (mr *MockOptionsMockRecorder) WriteTimestampOffset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTimestampOffset", reflect.TypeOf((*MockOptions)(nil).WriteTimestampOffset)) +} + +// SetNewConnectionFn mocks base method +func (m *MockOptions) SetNewConnectionFn(value NewConnectionFn) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetNewConnectionFn", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetNewConnectionFn indicates an expected call of SetNewConnectionFn +func (mr *MockOptionsMockRecorder) SetNewConnectionFn(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNewConnectionFn", reflect.TypeOf((*MockOptions)(nil).SetNewConnectionFn), value) +} + +// NewConnectionFn mocks base method +func (m *MockOptions) NewConnectionFn() NewConnectionFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NewConnectionFn") + ret0, _ := ret[0].(NewConnectionFn) + return ret0 +} + +// NewConnectionFn indicates an expected call of NewConnectionFn +func (mr *MockOptionsMockRecorder) NewConnectionFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewConnectionFn", reflect.TypeOf((*MockOptions)(nil).NewConnectionFn)) +} + +// MockAdminOptions is a mock of AdminOptions interface +type MockAdminOptions struct { + ctrl *gomock.Controller + recorder *MockAdminOptionsMockRecorder +} + +// MockAdminOptionsMockRecorder is the mock recorder for MockAdminOptions +type MockAdminOptionsMockRecorder struct { + mock *MockAdminOptions +} + +// NewMockAdminOptions creates a new mock instance +func NewMockAdminOptions(ctrl *gomock.Controller) *MockAdminOptions { + mock := &MockAdminOptions{ctrl: ctrl} + mock.recorder = &MockAdminOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAdminOptions) EXPECT() *MockAdminOptionsMockRecorder { + return m.recorder +} + +// Validate mocks base method +func (m *MockAdminOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockAdminOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockAdminOptions)(nil).Validate)) +} + +// SetEncodingM3TSZ mocks base method +func (m *MockAdminOptions) SetEncodingM3TSZ() Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEncodingM3TSZ") + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetEncodingM3TSZ indicates an expected call of SetEncodingM3TSZ +func (mr *MockAdminOptionsMockRecorder) SetEncodingM3TSZ() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEncodingM3TSZ", reflect.TypeOf((*MockAdminOptions)(nil).SetEncodingM3TSZ)) +} + +// SetEncodingProto mocks base method +func (m *MockAdminOptions) SetEncodingProto(encodingOpts encoding.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEncodingProto", encodingOpts) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetEncodingProto indicates an expected call of SetEncodingProto +func (mr *MockAdminOptionsMockRecorder) SetEncodingProto(encodingOpts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEncodingProto", reflect.TypeOf((*MockAdminOptions)(nil).SetEncodingProto), encodingOpts) +} + +// IsSetEncodingProto mocks base method +func (m *MockAdminOptions) IsSetEncodingProto() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsSetEncodingProto") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsSetEncodingProto indicates an expected call of IsSetEncodingProto +func (mr *MockAdminOptionsMockRecorder) IsSetEncodingProto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSetEncodingProto", reflect.TypeOf((*MockAdminOptions)(nil).IsSetEncodingProto)) +} + +// SetRuntimeOptionsManager mocks base method +func (m *MockAdminOptions) SetRuntimeOptionsManager(value runtime.OptionsManager) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetRuntimeOptionsManager", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetRuntimeOptionsManager indicates an expected call of SetRuntimeOptionsManager +func (mr *MockAdminOptionsMockRecorder) SetRuntimeOptionsManager(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetRuntimeOptionsManager", reflect.TypeOf((*MockAdminOptions)(nil).SetRuntimeOptionsManager), value) +} + +// RuntimeOptionsManager mocks base method +func (m *MockAdminOptions) RuntimeOptionsManager() runtime.OptionsManager { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RuntimeOptionsManager") + ret0, _ := ret[0].(runtime.OptionsManager) + return ret0 +} + +// RuntimeOptionsManager indicates an expected call of RuntimeOptionsManager +func (mr *MockAdminOptionsMockRecorder) RuntimeOptionsManager() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RuntimeOptionsManager", reflect.TypeOf((*MockAdminOptions)(nil).RuntimeOptionsManager)) +} + +// SetClockOptions mocks base method +func (m *MockAdminOptions) SetClockOptions(value clock.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClockOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClockOptions indicates an expected call of SetClockOptions +func (mr *MockAdminOptionsMockRecorder) SetClockOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClockOptions", reflect.TypeOf((*MockAdminOptions)(nil).SetClockOptions), value) +} + +// ClockOptions mocks base method +func (m *MockAdminOptions) ClockOptions() clock.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClockOptions") + ret0, _ := ret[0].(clock.Options) + return ret0 +} + +// ClockOptions indicates an expected call of ClockOptions +func (mr *MockAdminOptionsMockRecorder) ClockOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClockOptions", reflect.TypeOf((*MockAdminOptions)(nil).ClockOptions)) +} + +// SetInstrumentOptions mocks base method +func (m *MockAdminOptions) SetInstrumentOptions(value instrument.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstrumentOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetInstrumentOptions indicates an expected call of SetInstrumentOptions +func (mr *MockAdminOptionsMockRecorder) SetInstrumentOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstrumentOptions", reflect.TypeOf((*MockAdminOptions)(nil).SetInstrumentOptions), value) +} + +// InstrumentOptions mocks base method +func (m *MockAdminOptions) InstrumentOptions() instrument.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstrumentOptions") + ret0, _ := ret[0].(instrument.Options) + return ret0 +} + +// InstrumentOptions indicates an expected call of InstrumentOptions +func (mr *MockAdminOptionsMockRecorder) InstrumentOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstrumentOptions", reflect.TypeOf((*MockAdminOptions)(nil).InstrumentOptions)) +} + +// SetLogErrorSampleRate mocks base method +func (m *MockAdminOptions) SetLogErrorSampleRate(value sampler.Rate) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetLogErrorSampleRate", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetLogErrorSampleRate indicates an expected call of SetLogErrorSampleRate +func (mr *MockAdminOptionsMockRecorder) SetLogErrorSampleRate(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLogErrorSampleRate", reflect.TypeOf((*MockAdminOptions)(nil).SetLogErrorSampleRate), value) +} + +// LogErrorSampleRate mocks base method +func (m *MockAdminOptions) LogErrorSampleRate() sampler.Rate { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LogErrorSampleRate") + ret0, _ := ret[0].(sampler.Rate) + return ret0 +} + +// LogErrorSampleRate indicates an expected call of LogErrorSampleRate +func (mr *MockAdminOptionsMockRecorder) LogErrorSampleRate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LogErrorSampleRate", reflect.TypeOf((*MockAdminOptions)(nil).LogErrorSampleRate)) +} + +// SetTopologyInitializer mocks base method +func (m *MockAdminOptions) SetTopologyInitializer(value topology.Initializer) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTopologyInitializer", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTopologyInitializer indicates an expected call of SetTopologyInitializer +func (mr *MockAdminOptionsMockRecorder) SetTopologyInitializer(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTopologyInitializer", reflect.TypeOf((*MockAdminOptions)(nil).SetTopologyInitializer), value) +} + +// TopologyInitializer mocks base method +func (m *MockAdminOptions) TopologyInitializer() topology.Initializer { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TopologyInitializer") + ret0, _ := ret[0].(topology.Initializer) + return ret0 +} + +// TopologyInitializer indicates an expected call of TopologyInitializer +func (mr *MockAdminOptionsMockRecorder) TopologyInitializer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TopologyInitializer", reflect.TypeOf((*MockAdminOptions)(nil).TopologyInitializer)) +} + +// SetReadConsistencyLevel mocks base method +func (m *MockAdminOptions) SetReadConsistencyLevel(value topology.ReadConsistencyLevel) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReadConsistencyLevel", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetReadConsistencyLevel indicates an expected call of SetReadConsistencyLevel +func (mr *MockAdminOptionsMockRecorder) SetReadConsistencyLevel(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReadConsistencyLevel", reflect.TypeOf((*MockAdminOptions)(nil).SetReadConsistencyLevel), value) +} + +// ReadConsistencyLevel mocks base method +func (m *MockAdminOptions) ReadConsistencyLevel() topology.ReadConsistencyLevel { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadConsistencyLevel") + ret0, _ := ret[0].(topology.ReadConsistencyLevel) + return ret0 +} + +// ReadConsistencyLevel indicates an expected call of ReadConsistencyLevel +func (mr *MockAdminOptionsMockRecorder) ReadConsistencyLevel() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadConsistencyLevel", reflect.TypeOf((*MockAdminOptions)(nil).ReadConsistencyLevel)) +} + +// SetWriteConsistencyLevel mocks base method +func (m *MockAdminOptions) SetWriteConsistencyLevel(value topology.ConsistencyLevel) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteConsistencyLevel", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteConsistencyLevel indicates an expected call of SetWriteConsistencyLevel +func (mr *MockAdminOptionsMockRecorder) SetWriteConsistencyLevel(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteConsistencyLevel", reflect.TypeOf((*MockAdminOptions)(nil).SetWriteConsistencyLevel), value) +} + +// WriteConsistencyLevel mocks base method +func (m *MockAdminOptions) WriteConsistencyLevel() topology.ConsistencyLevel { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteConsistencyLevel") + ret0, _ := ret[0].(topology.ConsistencyLevel) + return ret0 +} + +// WriteConsistencyLevel indicates an expected call of WriteConsistencyLevel +func (mr *MockAdminOptionsMockRecorder) WriteConsistencyLevel() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteConsistencyLevel", reflect.TypeOf((*MockAdminOptions)(nil).WriteConsistencyLevel)) +} + +// SetChannelOptions mocks base method +func (m *MockAdminOptions) SetChannelOptions(value *tchannel.ChannelOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetChannelOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetChannelOptions indicates an expected call of SetChannelOptions +func (mr *MockAdminOptionsMockRecorder) SetChannelOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetChannelOptions", reflect.TypeOf((*MockAdminOptions)(nil).SetChannelOptions), value) +} + +// ChannelOptions mocks base method +func (m *MockAdminOptions) ChannelOptions() *tchannel.ChannelOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChannelOptions") + ret0, _ := ret[0].(*tchannel.ChannelOptions) + return ret0 +} + +// ChannelOptions indicates an expected call of ChannelOptions +func (mr *MockAdminOptionsMockRecorder) ChannelOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChannelOptions", reflect.TypeOf((*MockAdminOptions)(nil).ChannelOptions)) +} + +// SetMaxConnectionCount mocks base method +func (m *MockAdminOptions) SetMaxConnectionCount(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMaxConnectionCount", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetMaxConnectionCount indicates an expected call of SetMaxConnectionCount +func (mr *MockAdminOptionsMockRecorder) SetMaxConnectionCount(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMaxConnectionCount", reflect.TypeOf((*MockAdminOptions)(nil).SetMaxConnectionCount), value) +} + +// MaxConnectionCount mocks base method +func (m *MockAdminOptions) MaxConnectionCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MaxConnectionCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// MaxConnectionCount indicates an expected call of MaxConnectionCount +func (mr *MockAdminOptionsMockRecorder) MaxConnectionCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MaxConnectionCount", reflect.TypeOf((*MockAdminOptions)(nil).MaxConnectionCount)) +} + +// SetMinConnectionCount mocks base method +func (m *MockAdminOptions) SetMinConnectionCount(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMinConnectionCount", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetMinConnectionCount indicates an expected call of SetMinConnectionCount +func (mr *MockAdminOptionsMockRecorder) SetMinConnectionCount(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMinConnectionCount", reflect.TypeOf((*MockAdminOptions)(nil).SetMinConnectionCount), value) +} + +// MinConnectionCount mocks base method +func (m *MockAdminOptions) MinConnectionCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinConnectionCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// MinConnectionCount indicates an expected call of MinConnectionCount +func (mr *MockAdminOptionsMockRecorder) MinConnectionCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinConnectionCount", reflect.TypeOf((*MockAdminOptions)(nil).MinConnectionCount)) +} + +// SetHostConnectTimeout mocks base method +func (m *MockAdminOptions) SetHostConnectTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostConnectTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHostConnectTimeout indicates an expected call of SetHostConnectTimeout +func (mr *MockAdminOptionsMockRecorder) SetHostConnectTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostConnectTimeout", reflect.TypeOf((*MockAdminOptions)(nil).SetHostConnectTimeout), value) +} + +// HostConnectTimeout mocks base method +func (m *MockAdminOptions) HostConnectTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostConnectTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// HostConnectTimeout indicates an expected call of HostConnectTimeout +func (mr *MockAdminOptionsMockRecorder) HostConnectTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostConnectTimeout", reflect.TypeOf((*MockAdminOptions)(nil).HostConnectTimeout)) +} + +// SetClusterConnectTimeout mocks base method +func (m *MockAdminOptions) SetClusterConnectTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClusterConnectTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClusterConnectTimeout indicates an expected call of SetClusterConnectTimeout +func (mr *MockAdminOptionsMockRecorder) SetClusterConnectTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClusterConnectTimeout", reflect.TypeOf((*MockAdminOptions)(nil).SetClusterConnectTimeout), value) +} + +// ClusterConnectTimeout mocks base method +func (m *MockAdminOptions) ClusterConnectTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClusterConnectTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// ClusterConnectTimeout indicates an expected call of ClusterConnectTimeout +func (mr *MockAdminOptionsMockRecorder) ClusterConnectTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClusterConnectTimeout", reflect.TypeOf((*MockAdminOptions)(nil).ClusterConnectTimeout)) +} + +// SetClusterConnectConsistencyLevel mocks base method +func (m *MockAdminOptions) SetClusterConnectConsistencyLevel(value topology.ConnectConsistencyLevel) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClusterConnectConsistencyLevel", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClusterConnectConsistencyLevel indicates an expected call of SetClusterConnectConsistencyLevel +func (mr *MockAdminOptionsMockRecorder) SetClusterConnectConsistencyLevel(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClusterConnectConsistencyLevel", reflect.TypeOf((*MockAdminOptions)(nil).SetClusterConnectConsistencyLevel), value) +} + +// ClusterConnectConsistencyLevel mocks base method +func (m *MockAdminOptions) ClusterConnectConsistencyLevel() topology.ConnectConsistencyLevel { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClusterConnectConsistencyLevel") + ret0, _ := ret[0].(topology.ConnectConsistencyLevel) + return ret0 +} + +// ClusterConnectConsistencyLevel indicates an expected call of ClusterConnectConsistencyLevel +func (mr *MockAdminOptionsMockRecorder) ClusterConnectConsistencyLevel() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClusterConnectConsistencyLevel", reflect.TypeOf((*MockAdminOptions)(nil).ClusterConnectConsistencyLevel)) +} + +// SetWriteRequestTimeout mocks base method +func (m *MockAdminOptions) SetWriteRequestTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteRequestTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteRequestTimeout indicates an expected call of SetWriteRequestTimeout +func (mr *MockAdminOptionsMockRecorder) SetWriteRequestTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteRequestTimeout", reflect.TypeOf((*MockAdminOptions)(nil).SetWriteRequestTimeout), value) +} + +// WriteRequestTimeout mocks base method +func (m *MockAdminOptions) WriteRequestTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteRequestTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// WriteRequestTimeout indicates an expected call of WriteRequestTimeout +func (mr *MockAdminOptionsMockRecorder) WriteRequestTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteRequestTimeout", reflect.TypeOf((*MockAdminOptions)(nil).WriteRequestTimeout)) +} + +// SetFetchRequestTimeout mocks base method +func (m *MockAdminOptions) SetFetchRequestTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchRequestTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFetchRequestTimeout indicates an expected call of SetFetchRequestTimeout +func (mr *MockAdminOptionsMockRecorder) SetFetchRequestTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchRequestTimeout", reflect.TypeOf((*MockAdminOptions)(nil).SetFetchRequestTimeout), value) +} + +// FetchRequestTimeout mocks base method +func (m *MockAdminOptions) FetchRequestTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchRequestTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// FetchRequestTimeout indicates an expected call of FetchRequestTimeout +func (mr *MockAdminOptionsMockRecorder) FetchRequestTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchRequestTimeout", reflect.TypeOf((*MockAdminOptions)(nil).FetchRequestTimeout)) +} + +// SetTruncateRequestTimeout mocks base method +func (m *MockAdminOptions) SetTruncateRequestTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTruncateRequestTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTruncateRequestTimeout indicates an expected call of SetTruncateRequestTimeout +func (mr *MockAdminOptionsMockRecorder) SetTruncateRequestTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTruncateRequestTimeout", reflect.TypeOf((*MockAdminOptions)(nil).SetTruncateRequestTimeout), value) +} + +// TruncateRequestTimeout mocks base method +func (m *MockAdminOptions) TruncateRequestTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TruncateRequestTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// TruncateRequestTimeout indicates an expected call of TruncateRequestTimeout +func (mr *MockAdminOptionsMockRecorder) TruncateRequestTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TruncateRequestTimeout", reflect.TypeOf((*MockAdminOptions)(nil).TruncateRequestTimeout)) +} + +// SetBackgroundConnectInterval mocks base method +func (m *MockAdminOptions) SetBackgroundConnectInterval(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundConnectInterval", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundConnectInterval indicates an expected call of SetBackgroundConnectInterval +func (mr *MockAdminOptionsMockRecorder) SetBackgroundConnectInterval(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundConnectInterval", reflect.TypeOf((*MockAdminOptions)(nil).SetBackgroundConnectInterval), value) +} + +// BackgroundConnectInterval mocks base method +func (m *MockAdminOptions) BackgroundConnectInterval() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundConnectInterval") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BackgroundConnectInterval indicates an expected call of BackgroundConnectInterval +func (mr *MockAdminOptionsMockRecorder) BackgroundConnectInterval() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundConnectInterval", reflect.TypeOf((*MockAdminOptions)(nil).BackgroundConnectInterval)) +} + +// SetBackgroundConnectStutter mocks base method +func (m *MockAdminOptions) SetBackgroundConnectStutter(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundConnectStutter", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundConnectStutter indicates an expected call of SetBackgroundConnectStutter +func (mr *MockAdminOptionsMockRecorder) SetBackgroundConnectStutter(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundConnectStutter", reflect.TypeOf((*MockAdminOptions)(nil).SetBackgroundConnectStutter), value) +} + +// BackgroundConnectStutter mocks base method +func (m *MockAdminOptions) BackgroundConnectStutter() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundConnectStutter") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BackgroundConnectStutter indicates an expected call of BackgroundConnectStutter +func (mr *MockAdminOptionsMockRecorder) BackgroundConnectStutter() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundConnectStutter", reflect.TypeOf((*MockAdminOptions)(nil).BackgroundConnectStutter)) +} + +// SetBackgroundHealthCheckInterval mocks base method +func (m *MockAdminOptions) SetBackgroundHealthCheckInterval(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundHealthCheckInterval", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundHealthCheckInterval indicates an expected call of SetBackgroundHealthCheckInterval +func (mr *MockAdminOptionsMockRecorder) SetBackgroundHealthCheckInterval(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundHealthCheckInterval", reflect.TypeOf((*MockAdminOptions)(nil).SetBackgroundHealthCheckInterval), value) +} + +// BackgroundHealthCheckInterval mocks base method +func (m *MockAdminOptions) BackgroundHealthCheckInterval() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundHealthCheckInterval") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BackgroundHealthCheckInterval indicates an expected call of BackgroundHealthCheckInterval +func (mr *MockAdminOptionsMockRecorder) BackgroundHealthCheckInterval() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundHealthCheckInterval", reflect.TypeOf((*MockAdminOptions)(nil).BackgroundHealthCheckInterval)) +} + +// SetBackgroundHealthCheckStutter mocks base method +func (m *MockAdminOptions) SetBackgroundHealthCheckStutter(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundHealthCheckStutter", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundHealthCheckStutter indicates an expected call of SetBackgroundHealthCheckStutter +func (mr *MockAdminOptionsMockRecorder) SetBackgroundHealthCheckStutter(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundHealthCheckStutter", reflect.TypeOf((*MockAdminOptions)(nil).SetBackgroundHealthCheckStutter), value) +} + +// BackgroundHealthCheckStutter mocks base method +func (m *MockAdminOptions) BackgroundHealthCheckStutter() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundHealthCheckStutter") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BackgroundHealthCheckStutter indicates an expected call of BackgroundHealthCheckStutter +func (mr *MockAdminOptionsMockRecorder) BackgroundHealthCheckStutter() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundHealthCheckStutter", reflect.TypeOf((*MockAdminOptions)(nil).BackgroundHealthCheckStutter)) +} + +// SetBackgroundHealthCheckFailLimit mocks base method +func (m *MockAdminOptions) SetBackgroundHealthCheckFailLimit(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundHealthCheckFailLimit", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundHealthCheckFailLimit indicates an expected call of SetBackgroundHealthCheckFailLimit +func (mr *MockAdminOptionsMockRecorder) SetBackgroundHealthCheckFailLimit(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundHealthCheckFailLimit", reflect.TypeOf((*MockAdminOptions)(nil).SetBackgroundHealthCheckFailLimit), value) +} + +// BackgroundHealthCheckFailLimit mocks base method +func (m *MockAdminOptions) BackgroundHealthCheckFailLimit() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundHealthCheckFailLimit") + ret0, _ := ret[0].(int) + return ret0 +} + +// BackgroundHealthCheckFailLimit indicates an expected call of BackgroundHealthCheckFailLimit +func (mr *MockAdminOptionsMockRecorder) BackgroundHealthCheckFailLimit() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundHealthCheckFailLimit", reflect.TypeOf((*MockAdminOptions)(nil).BackgroundHealthCheckFailLimit)) +} + +// SetBackgroundHealthCheckFailThrottleFactor mocks base method +func (m *MockAdminOptions) SetBackgroundHealthCheckFailThrottleFactor(value float64) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundHealthCheckFailThrottleFactor", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundHealthCheckFailThrottleFactor indicates an expected call of SetBackgroundHealthCheckFailThrottleFactor +func (mr *MockAdminOptionsMockRecorder) SetBackgroundHealthCheckFailThrottleFactor(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundHealthCheckFailThrottleFactor", reflect.TypeOf((*MockAdminOptions)(nil).SetBackgroundHealthCheckFailThrottleFactor), value) +} + +// BackgroundHealthCheckFailThrottleFactor mocks base method +func (m *MockAdminOptions) BackgroundHealthCheckFailThrottleFactor() float64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundHealthCheckFailThrottleFactor") + ret0, _ := ret[0].(float64) + return ret0 +} + +// BackgroundHealthCheckFailThrottleFactor indicates an expected call of BackgroundHealthCheckFailThrottleFactor +func (mr *MockAdminOptionsMockRecorder) BackgroundHealthCheckFailThrottleFactor() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundHealthCheckFailThrottleFactor", reflect.TypeOf((*MockAdminOptions)(nil).BackgroundHealthCheckFailThrottleFactor)) +} + +// SetWriteRetrier mocks base method +func (m *MockAdminOptions) SetWriteRetrier(value retry.Retrier) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteRetrier", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteRetrier indicates an expected call of SetWriteRetrier +func (mr *MockAdminOptionsMockRecorder) SetWriteRetrier(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteRetrier", reflect.TypeOf((*MockAdminOptions)(nil).SetWriteRetrier), value) +} + +// WriteRetrier mocks base method +func (m *MockAdminOptions) WriteRetrier() retry.Retrier { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteRetrier") + ret0, _ := ret[0].(retry.Retrier) + return ret0 +} + +// WriteRetrier indicates an expected call of WriteRetrier +func (mr *MockAdminOptionsMockRecorder) WriteRetrier() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteRetrier", reflect.TypeOf((*MockAdminOptions)(nil).WriteRetrier)) +} + +// SetFetchRetrier mocks base method +func (m *MockAdminOptions) SetFetchRetrier(value retry.Retrier) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchRetrier", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFetchRetrier indicates an expected call of SetFetchRetrier +func (mr *MockAdminOptionsMockRecorder) SetFetchRetrier(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchRetrier", reflect.TypeOf((*MockAdminOptions)(nil).SetFetchRetrier), value) +} + +// FetchRetrier mocks base method +func (m *MockAdminOptions) FetchRetrier() retry.Retrier { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchRetrier") + ret0, _ := ret[0].(retry.Retrier) + return ret0 +} + +// FetchRetrier indicates an expected call of FetchRetrier +func (mr *MockAdminOptionsMockRecorder) FetchRetrier() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchRetrier", reflect.TypeOf((*MockAdminOptions)(nil).FetchRetrier)) +} + +// SetWriteShardsInitializing mocks base method +func (m *MockAdminOptions) SetWriteShardsInitializing(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteShardsInitializing", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteShardsInitializing indicates an expected call of SetWriteShardsInitializing +func (mr *MockAdminOptionsMockRecorder) SetWriteShardsInitializing(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteShardsInitializing", reflect.TypeOf((*MockAdminOptions)(nil).SetWriteShardsInitializing), value) +} + +// WriteShardsInitializing mocks base method +func (m *MockAdminOptions) WriteShardsInitializing() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteShardsInitializing") + ret0, _ := ret[0].(bool) + return ret0 +} + +// WriteShardsInitializing indicates an expected call of WriteShardsInitializing +func (mr *MockAdminOptionsMockRecorder) WriteShardsInitializing() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteShardsInitializing", reflect.TypeOf((*MockAdminOptions)(nil).WriteShardsInitializing)) +} + +// SetShardsLeavingCountTowardsConsistency mocks base method +func (m *MockAdminOptions) SetShardsLeavingCountTowardsConsistency(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetShardsLeavingCountTowardsConsistency", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetShardsLeavingCountTowardsConsistency indicates an expected call of SetShardsLeavingCountTowardsConsistency +func (mr *MockAdminOptionsMockRecorder) SetShardsLeavingCountTowardsConsistency(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetShardsLeavingCountTowardsConsistency", reflect.TypeOf((*MockAdminOptions)(nil).SetShardsLeavingCountTowardsConsistency), value) +} + +// ShardsLeavingCountTowardsConsistency mocks base method +func (m *MockAdminOptions) ShardsLeavingCountTowardsConsistency() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardsLeavingCountTowardsConsistency") + ret0, _ := ret[0].(bool) + return ret0 +} + +// ShardsLeavingCountTowardsConsistency indicates an expected call of ShardsLeavingCountTowardsConsistency +func (mr *MockAdminOptionsMockRecorder) ShardsLeavingCountTowardsConsistency() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardsLeavingCountTowardsConsistency", reflect.TypeOf((*MockAdminOptions)(nil).ShardsLeavingCountTowardsConsistency)) +} + +// SetTagEncoderOptions mocks base method +func (m *MockAdminOptions) SetTagEncoderOptions(value serialize.TagEncoderOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTagEncoderOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTagEncoderOptions indicates an expected call of SetTagEncoderOptions +func (mr *MockAdminOptionsMockRecorder) SetTagEncoderOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTagEncoderOptions", reflect.TypeOf((*MockAdminOptions)(nil).SetTagEncoderOptions), value) +} + +// TagEncoderOptions mocks base method +func (m *MockAdminOptions) TagEncoderOptions() serialize.TagEncoderOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagEncoderOptions") + ret0, _ := ret[0].(serialize.TagEncoderOptions) + return ret0 +} + +// TagEncoderOptions indicates an expected call of TagEncoderOptions +func (mr *MockAdminOptionsMockRecorder) TagEncoderOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagEncoderOptions", reflect.TypeOf((*MockAdminOptions)(nil).TagEncoderOptions)) +} + +// SetTagEncoderPoolSize mocks base method +func (m *MockAdminOptions) SetTagEncoderPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTagEncoderPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTagEncoderPoolSize indicates an expected call of SetTagEncoderPoolSize +func (mr *MockAdminOptionsMockRecorder) SetTagEncoderPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTagEncoderPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).SetTagEncoderPoolSize), value) +} + +// TagEncoderPoolSize mocks base method +func (m *MockAdminOptions) TagEncoderPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagEncoderPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// TagEncoderPoolSize indicates an expected call of TagEncoderPoolSize +func (mr *MockAdminOptionsMockRecorder) TagEncoderPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagEncoderPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).TagEncoderPoolSize)) +} + +// SetTagDecoderOptions mocks base method +func (m *MockAdminOptions) SetTagDecoderOptions(value serialize.TagDecoderOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTagDecoderOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTagDecoderOptions indicates an expected call of SetTagDecoderOptions +func (mr *MockAdminOptionsMockRecorder) SetTagDecoderOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTagDecoderOptions", reflect.TypeOf((*MockAdminOptions)(nil).SetTagDecoderOptions), value) +} + +// TagDecoderOptions mocks base method +func (m *MockAdminOptions) TagDecoderOptions() serialize.TagDecoderOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagDecoderOptions") + ret0, _ := ret[0].(serialize.TagDecoderOptions) + return ret0 +} + +// TagDecoderOptions indicates an expected call of TagDecoderOptions +func (mr *MockAdminOptionsMockRecorder) TagDecoderOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagDecoderOptions", reflect.TypeOf((*MockAdminOptions)(nil).TagDecoderOptions)) +} + +// SetTagDecoderPoolSize mocks base method +func (m *MockAdminOptions) SetTagDecoderPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTagDecoderPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTagDecoderPoolSize indicates an expected call of SetTagDecoderPoolSize +func (mr *MockAdminOptionsMockRecorder) SetTagDecoderPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTagDecoderPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).SetTagDecoderPoolSize), value) +} + +// TagDecoderPoolSize mocks base method +func (m *MockAdminOptions) TagDecoderPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagDecoderPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// TagDecoderPoolSize indicates an expected call of TagDecoderPoolSize +func (mr *MockAdminOptionsMockRecorder) TagDecoderPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagDecoderPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).TagDecoderPoolSize)) +} + +// SetWriteBatchSize mocks base method +func (m *MockAdminOptions) SetWriteBatchSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteBatchSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteBatchSize indicates an expected call of SetWriteBatchSize +func (mr *MockAdminOptionsMockRecorder) SetWriteBatchSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteBatchSize", reflect.TypeOf((*MockAdminOptions)(nil).SetWriteBatchSize), value) +} + +// WriteBatchSize mocks base method +func (m *MockAdminOptions) WriteBatchSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteBatchSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// WriteBatchSize indicates an expected call of WriteBatchSize +func (mr *MockAdminOptionsMockRecorder) WriteBatchSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBatchSize", reflect.TypeOf((*MockAdminOptions)(nil).WriteBatchSize)) +} + +// SetFetchBatchSize mocks base method +func (m *MockAdminOptions) SetFetchBatchSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchBatchSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFetchBatchSize indicates an expected call of SetFetchBatchSize +func (mr *MockAdminOptionsMockRecorder) SetFetchBatchSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchBatchSize", reflect.TypeOf((*MockAdminOptions)(nil).SetFetchBatchSize), value) +} + +// FetchBatchSize mocks base method +func (m *MockAdminOptions) FetchBatchSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBatchSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// FetchBatchSize indicates an expected call of FetchBatchSize +func (mr *MockAdminOptionsMockRecorder) FetchBatchSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBatchSize", reflect.TypeOf((*MockAdminOptions)(nil).FetchBatchSize)) +} + +// SetWriteOpPoolSize mocks base method +func (m *MockAdminOptions) SetWriteOpPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteOpPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteOpPoolSize indicates an expected call of SetWriteOpPoolSize +func (mr *MockAdminOptionsMockRecorder) SetWriteOpPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteOpPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).SetWriteOpPoolSize), value) +} + +// WriteOpPoolSize mocks base method +func (m *MockAdminOptions) WriteOpPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteOpPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// WriteOpPoolSize indicates an expected call of WriteOpPoolSize +func (mr *MockAdminOptionsMockRecorder) WriteOpPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteOpPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).WriteOpPoolSize)) +} + +// SetWriteTaggedOpPoolSize mocks base method +func (m *MockAdminOptions) SetWriteTaggedOpPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteTaggedOpPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteTaggedOpPoolSize indicates an expected call of SetWriteTaggedOpPoolSize +func (mr *MockAdminOptionsMockRecorder) SetWriteTaggedOpPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteTaggedOpPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).SetWriteTaggedOpPoolSize), value) +} + +// WriteTaggedOpPoolSize mocks base method +func (m *MockAdminOptions) WriteTaggedOpPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTaggedOpPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// WriteTaggedOpPoolSize indicates an expected call of WriteTaggedOpPoolSize +func (mr *MockAdminOptionsMockRecorder) WriteTaggedOpPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTaggedOpPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).WriteTaggedOpPoolSize)) +} + +// SetFetchBatchOpPoolSize mocks base method +func (m *MockAdminOptions) SetFetchBatchOpPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchBatchOpPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFetchBatchOpPoolSize indicates an expected call of SetFetchBatchOpPoolSize +func (mr *MockAdminOptionsMockRecorder) SetFetchBatchOpPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchBatchOpPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).SetFetchBatchOpPoolSize), value) +} + +// FetchBatchOpPoolSize mocks base method +func (m *MockAdminOptions) FetchBatchOpPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBatchOpPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// FetchBatchOpPoolSize indicates an expected call of FetchBatchOpPoolSize +func (mr *MockAdminOptionsMockRecorder) FetchBatchOpPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBatchOpPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).FetchBatchOpPoolSize)) +} + +// SetCheckedBytesWrapperPoolSize mocks base method +func (m *MockAdminOptions) SetCheckedBytesWrapperPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCheckedBytesWrapperPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetCheckedBytesWrapperPoolSize indicates an expected call of SetCheckedBytesWrapperPoolSize +func (mr *MockAdminOptionsMockRecorder) SetCheckedBytesWrapperPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCheckedBytesWrapperPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).SetCheckedBytesWrapperPoolSize), value) +} + +// CheckedBytesWrapperPoolSize mocks base method +func (m *MockAdminOptions) CheckedBytesWrapperPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckedBytesWrapperPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// CheckedBytesWrapperPoolSize indicates an expected call of CheckedBytesWrapperPoolSize +func (mr *MockAdminOptionsMockRecorder) CheckedBytesWrapperPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckedBytesWrapperPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).CheckedBytesWrapperPoolSize)) +} + +// SetHostQueueOpsFlushSize mocks base method +func (m *MockAdminOptions) SetHostQueueOpsFlushSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostQueueOpsFlushSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHostQueueOpsFlushSize indicates an expected call of SetHostQueueOpsFlushSize +func (mr *MockAdminOptionsMockRecorder) SetHostQueueOpsFlushSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostQueueOpsFlushSize", reflect.TypeOf((*MockAdminOptions)(nil).SetHostQueueOpsFlushSize), value) +} + +// HostQueueOpsFlushSize mocks base method +func (m *MockAdminOptions) HostQueueOpsFlushSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostQueueOpsFlushSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// HostQueueOpsFlushSize indicates an expected call of HostQueueOpsFlushSize +func (mr *MockAdminOptionsMockRecorder) HostQueueOpsFlushSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostQueueOpsFlushSize", reflect.TypeOf((*MockAdminOptions)(nil).HostQueueOpsFlushSize)) +} + +// SetHostQueueOpsFlushInterval mocks base method +func (m *MockAdminOptions) SetHostQueueOpsFlushInterval(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostQueueOpsFlushInterval", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHostQueueOpsFlushInterval indicates an expected call of SetHostQueueOpsFlushInterval +func (mr *MockAdminOptionsMockRecorder) SetHostQueueOpsFlushInterval(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostQueueOpsFlushInterval", reflect.TypeOf((*MockAdminOptions)(nil).SetHostQueueOpsFlushInterval), value) +} + +// HostQueueOpsFlushInterval mocks base method +func (m *MockAdminOptions) HostQueueOpsFlushInterval() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostQueueOpsFlushInterval") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// HostQueueOpsFlushInterval indicates an expected call of HostQueueOpsFlushInterval +func (mr *MockAdminOptionsMockRecorder) HostQueueOpsFlushInterval() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostQueueOpsFlushInterval", reflect.TypeOf((*MockAdminOptions)(nil).HostQueueOpsFlushInterval)) +} + +// SetContextPool mocks base method +func (m *MockAdminOptions) SetContextPool(value context.Pool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetContextPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetContextPool indicates an expected call of SetContextPool +func (mr *MockAdminOptionsMockRecorder) SetContextPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetContextPool", reflect.TypeOf((*MockAdminOptions)(nil).SetContextPool), value) +} + +// ContextPool mocks base method +func (m *MockAdminOptions) ContextPool() context.Pool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContextPool") + ret0, _ := ret[0].(context.Pool) + return ret0 +} + +// ContextPool indicates an expected call of ContextPool +func (mr *MockAdminOptionsMockRecorder) ContextPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContextPool", reflect.TypeOf((*MockAdminOptions)(nil).ContextPool)) +} + +// SetIdentifierPool mocks base method +func (m *MockAdminOptions) SetIdentifierPool(value ident.Pool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIdentifierPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIdentifierPool indicates an expected call of SetIdentifierPool +func (mr *MockAdminOptionsMockRecorder) SetIdentifierPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIdentifierPool", reflect.TypeOf((*MockAdminOptions)(nil).SetIdentifierPool), value) +} + +// IdentifierPool mocks base method +func (m *MockAdminOptions) IdentifierPool() ident.Pool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IdentifierPool") + ret0, _ := ret[0].(ident.Pool) + return ret0 +} + +// IdentifierPool indicates an expected call of IdentifierPool +func (mr *MockAdminOptionsMockRecorder) IdentifierPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IdentifierPool", reflect.TypeOf((*MockAdminOptions)(nil).IdentifierPool)) +} + +// SetHostQueueOpsArrayPoolSize mocks base method +func (m *MockAdminOptions) SetHostQueueOpsArrayPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostQueueOpsArrayPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHostQueueOpsArrayPoolSize indicates an expected call of SetHostQueueOpsArrayPoolSize +func (mr *MockAdminOptionsMockRecorder) SetHostQueueOpsArrayPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostQueueOpsArrayPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).SetHostQueueOpsArrayPoolSize), value) +} + +// HostQueueOpsArrayPoolSize mocks base method +func (m *MockAdminOptions) HostQueueOpsArrayPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostQueueOpsArrayPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// HostQueueOpsArrayPoolSize indicates an expected call of HostQueueOpsArrayPoolSize +func (mr *MockAdminOptionsMockRecorder) HostQueueOpsArrayPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostQueueOpsArrayPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).HostQueueOpsArrayPoolSize)) +} + +// SetHostQueueEmitsHealthStatus mocks base method +func (m *MockAdminOptions) SetHostQueueEmitsHealthStatus(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostQueueEmitsHealthStatus", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetHostQueueEmitsHealthStatus indicates an expected call of SetHostQueueEmitsHealthStatus +func (mr *MockAdminOptionsMockRecorder) SetHostQueueEmitsHealthStatus(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostQueueEmitsHealthStatus", reflect.TypeOf((*MockAdminOptions)(nil).SetHostQueueEmitsHealthStatus), value) +} + +// HostQueueEmitsHealthStatus mocks base method +func (m *MockAdminOptions) HostQueueEmitsHealthStatus() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostQueueEmitsHealthStatus") + ret0, _ := ret[0].(bool) + return ret0 +} + +// HostQueueEmitsHealthStatus indicates an expected call of HostQueueEmitsHealthStatus +func (mr *MockAdminOptionsMockRecorder) HostQueueEmitsHealthStatus() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostQueueEmitsHealthStatus", reflect.TypeOf((*MockAdminOptions)(nil).HostQueueEmitsHealthStatus)) +} + +// SetSeriesIteratorPoolSize mocks base method +func (m *MockAdminOptions) SetSeriesIteratorPoolSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSeriesIteratorPoolSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetSeriesIteratorPoolSize indicates an expected call of SetSeriesIteratorPoolSize +func (mr *MockAdminOptionsMockRecorder) SetSeriesIteratorPoolSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSeriesIteratorPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).SetSeriesIteratorPoolSize), value) +} + +// SeriesIteratorPoolSize mocks base method +func (m *MockAdminOptions) SeriesIteratorPoolSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SeriesIteratorPoolSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// SeriesIteratorPoolSize indicates an expected call of SeriesIteratorPoolSize +func (mr *MockAdminOptionsMockRecorder) SeriesIteratorPoolSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SeriesIteratorPoolSize", reflect.TypeOf((*MockAdminOptions)(nil).SeriesIteratorPoolSize)) +} + +// SetSeriesIteratorArrayPoolBuckets mocks base method +func (m *MockAdminOptions) SetSeriesIteratorArrayPoolBuckets(value []pool.Bucket) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSeriesIteratorArrayPoolBuckets", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetSeriesIteratorArrayPoolBuckets indicates an expected call of SetSeriesIteratorArrayPoolBuckets +func (mr *MockAdminOptionsMockRecorder) SetSeriesIteratorArrayPoolBuckets(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSeriesIteratorArrayPoolBuckets", reflect.TypeOf((*MockAdminOptions)(nil).SetSeriesIteratorArrayPoolBuckets), value) +} + +// SeriesIteratorArrayPoolBuckets mocks base method +func (m *MockAdminOptions) SeriesIteratorArrayPoolBuckets() []pool.Bucket { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SeriesIteratorArrayPoolBuckets") + ret0, _ := ret[0].([]pool.Bucket) + return ret0 +} + +// SeriesIteratorArrayPoolBuckets indicates an expected call of SeriesIteratorArrayPoolBuckets +func (mr *MockAdminOptionsMockRecorder) SeriesIteratorArrayPoolBuckets() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SeriesIteratorArrayPoolBuckets", reflect.TypeOf((*MockAdminOptions)(nil).SeriesIteratorArrayPoolBuckets)) +} + +// SetReaderIteratorAllocate mocks base method +func (m *MockAdminOptions) SetReaderIteratorAllocate(value encoding.ReaderIteratorAllocate) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReaderIteratorAllocate", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetReaderIteratorAllocate indicates an expected call of SetReaderIteratorAllocate +func (mr *MockAdminOptionsMockRecorder) SetReaderIteratorAllocate(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReaderIteratorAllocate", reflect.TypeOf((*MockAdminOptions)(nil).SetReaderIteratorAllocate), value) +} + +// ReaderIteratorAllocate mocks base method +func (m *MockAdminOptions) ReaderIteratorAllocate() encoding.ReaderIteratorAllocate { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReaderIteratorAllocate") + ret0, _ := ret[0].(encoding.ReaderIteratorAllocate) + return ret0 +} + +// ReaderIteratorAllocate indicates an expected call of ReaderIteratorAllocate +func (mr *MockAdminOptionsMockRecorder) ReaderIteratorAllocate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReaderIteratorAllocate", reflect.TypeOf((*MockAdminOptions)(nil).ReaderIteratorAllocate)) +} + +// SetSchemaRegistry mocks base method +func (m *MockAdminOptions) SetSchemaRegistry(registry namespace.SchemaRegistry) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSchemaRegistry", registry) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetSchemaRegistry indicates an expected call of SetSchemaRegistry +func (mr *MockAdminOptionsMockRecorder) SetSchemaRegistry(registry interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSchemaRegistry", reflect.TypeOf((*MockAdminOptions)(nil).SetSchemaRegistry), registry) +} + +// SchemaRegistry mocks base method +func (m *MockAdminOptions) SchemaRegistry() namespace.SchemaRegistry { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SchemaRegistry") + ret0, _ := ret[0].(namespace.SchemaRegistry) + return ret0 +} + +// SchemaRegistry indicates an expected call of SchemaRegistry +func (mr *MockAdminOptionsMockRecorder) SchemaRegistry() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SchemaRegistry", reflect.TypeOf((*MockAdminOptions)(nil).SchemaRegistry)) +} + +// SetAsyncTopologyInitializers mocks base method +func (m *MockAdminOptions) SetAsyncTopologyInitializers(value []topology.Initializer) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAsyncTopologyInitializers", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAsyncTopologyInitializers indicates an expected call of SetAsyncTopologyInitializers +func (mr *MockAdminOptionsMockRecorder) SetAsyncTopologyInitializers(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAsyncTopologyInitializers", reflect.TypeOf((*MockAdminOptions)(nil).SetAsyncTopologyInitializers), value) +} + +// AsyncTopologyInitializers mocks base method +func (m *MockAdminOptions) AsyncTopologyInitializers() []topology.Initializer { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AsyncTopologyInitializers") + ret0, _ := ret[0].([]topology.Initializer) + return ret0 +} + +// AsyncTopologyInitializers indicates an expected call of AsyncTopologyInitializers +func (mr *MockAdminOptionsMockRecorder) AsyncTopologyInitializers() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AsyncTopologyInitializers", reflect.TypeOf((*MockAdminOptions)(nil).AsyncTopologyInitializers)) +} + +// SetAsyncWriteWorkerPool mocks base method +func (m *MockAdminOptions) SetAsyncWriteWorkerPool(value sync.PooledWorkerPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAsyncWriteWorkerPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAsyncWriteWorkerPool indicates an expected call of SetAsyncWriteWorkerPool +func (mr *MockAdminOptionsMockRecorder) SetAsyncWriteWorkerPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAsyncWriteWorkerPool", reflect.TypeOf((*MockAdminOptions)(nil).SetAsyncWriteWorkerPool), value) +} + +// AsyncWriteWorkerPool mocks base method +func (m *MockAdminOptions) AsyncWriteWorkerPool() sync.PooledWorkerPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AsyncWriteWorkerPool") + ret0, _ := ret[0].(sync.PooledWorkerPool) + return ret0 +} + +// AsyncWriteWorkerPool indicates an expected call of AsyncWriteWorkerPool +func (mr *MockAdminOptionsMockRecorder) AsyncWriteWorkerPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AsyncWriteWorkerPool", reflect.TypeOf((*MockAdminOptions)(nil).AsyncWriteWorkerPool)) +} + +// SetAsyncWriteMaxConcurrency mocks base method +func (m *MockAdminOptions) SetAsyncWriteMaxConcurrency(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAsyncWriteMaxConcurrency", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAsyncWriteMaxConcurrency indicates an expected call of SetAsyncWriteMaxConcurrency +func (mr *MockAdminOptionsMockRecorder) SetAsyncWriteMaxConcurrency(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAsyncWriteMaxConcurrency", reflect.TypeOf((*MockAdminOptions)(nil).SetAsyncWriteMaxConcurrency), value) +} + +// AsyncWriteMaxConcurrency mocks base method +func (m *MockAdminOptions) AsyncWriteMaxConcurrency() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AsyncWriteMaxConcurrency") + ret0, _ := ret[0].(int) + return ret0 +} + +// AsyncWriteMaxConcurrency indicates an expected call of AsyncWriteMaxConcurrency +func (mr *MockAdminOptionsMockRecorder) AsyncWriteMaxConcurrency() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AsyncWriteMaxConcurrency", reflect.TypeOf((*MockAdminOptions)(nil).AsyncWriteMaxConcurrency)) +} + +// SetUseV2BatchAPIs mocks base method +func (m *MockAdminOptions) SetUseV2BatchAPIs(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetUseV2BatchAPIs", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetUseV2BatchAPIs indicates an expected call of SetUseV2BatchAPIs +func (mr *MockAdminOptionsMockRecorder) SetUseV2BatchAPIs(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetUseV2BatchAPIs", reflect.TypeOf((*MockAdminOptions)(nil).SetUseV2BatchAPIs), value) +} + +// UseV2BatchAPIs mocks base method +func (m *MockAdminOptions) UseV2BatchAPIs() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UseV2BatchAPIs") + ret0, _ := ret[0].(bool) + return ret0 +} + +// UseV2BatchAPIs indicates an expected call of UseV2BatchAPIs +func (mr *MockAdminOptionsMockRecorder) UseV2BatchAPIs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UseV2BatchAPIs", reflect.TypeOf((*MockAdminOptions)(nil).UseV2BatchAPIs)) +} + +// SetIterationOptions mocks base method +func (m *MockAdminOptions) SetIterationOptions(arg0 index.IterationOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIterationOptions", arg0) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIterationOptions indicates an expected call of SetIterationOptions +func (mr *MockAdminOptionsMockRecorder) SetIterationOptions(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIterationOptions", reflect.TypeOf((*MockAdminOptions)(nil).SetIterationOptions), arg0) +} + +// IterationOptions mocks base method +func (m *MockAdminOptions) IterationOptions() index.IterationOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IterationOptions") + ret0, _ := ret[0].(index.IterationOptions) + return ret0 +} + +// IterationOptions indicates an expected call of IterationOptions +func (mr *MockAdminOptionsMockRecorder) IterationOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterationOptions", reflect.TypeOf((*MockAdminOptions)(nil).IterationOptions)) +} + +// SetWriteTimestampOffset mocks base method +func (m *MockAdminOptions) SetWriteTimestampOffset(value time.Duration) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteTimestampOffset", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetWriteTimestampOffset indicates an expected call of SetWriteTimestampOffset +func (mr *MockAdminOptionsMockRecorder) SetWriteTimestampOffset(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteTimestampOffset", reflect.TypeOf((*MockAdminOptions)(nil).SetWriteTimestampOffset), value) +} + +// WriteTimestampOffset mocks base method +func (m *MockAdminOptions) WriteTimestampOffset() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTimestampOffset") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// WriteTimestampOffset indicates an expected call of WriteTimestampOffset +func (mr *MockAdminOptionsMockRecorder) WriteTimestampOffset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTimestampOffset", reflect.TypeOf((*MockAdminOptions)(nil).WriteTimestampOffset)) +} + +// SetNewConnectionFn mocks base method +func (m *MockAdminOptions) SetNewConnectionFn(value NewConnectionFn) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetNewConnectionFn", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetNewConnectionFn indicates an expected call of SetNewConnectionFn +func (mr *MockAdminOptionsMockRecorder) SetNewConnectionFn(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNewConnectionFn", reflect.TypeOf((*MockAdminOptions)(nil).SetNewConnectionFn), value) +} + +// NewConnectionFn mocks base method +func (m *MockAdminOptions) NewConnectionFn() NewConnectionFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NewConnectionFn") + ret0, _ := ret[0].(NewConnectionFn) + return ret0 +} + +// NewConnectionFn indicates an expected call of NewConnectionFn +func (mr *MockAdminOptionsMockRecorder) NewConnectionFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewConnectionFn", reflect.TypeOf((*MockAdminOptions)(nil).NewConnectionFn)) +} + +// SetOrigin mocks base method +func (m *MockAdminOptions) SetOrigin(value topology.Host) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetOrigin", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetOrigin indicates an expected call of SetOrigin +func (mr *MockAdminOptionsMockRecorder) SetOrigin(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetOrigin", reflect.TypeOf((*MockAdminOptions)(nil).SetOrigin), value) +} + +// Origin mocks base method +func (m *MockAdminOptions) Origin() topology.Host { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Origin") + ret0, _ := ret[0].(topology.Host) + return ret0 +} + +// Origin indicates an expected call of Origin +func (mr *MockAdminOptionsMockRecorder) Origin() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Origin", reflect.TypeOf((*MockAdminOptions)(nil).Origin)) +} + +// SetBootstrapConsistencyLevel mocks base method +func (m *MockAdminOptions) SetBootstrapConsistencyLevel(value topology.ReadConsistencyLevel) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBootstrapConsistencyLevel", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetBootstrapConsistencyLevel indicates an expected call of SetBootstrapConsistencyLevel +func (mr *MockAdminOptionsMockRecorder) SetBootstrapConsistencyLevel(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBootstrapConsistencyLevel", reflect.TypeOf((*MockAdminOptions)(nil).SetBootstrapConsistencyLevel), value) +} + +// BootstrapConsistencyLevel mocks base method +func (m *MockAdminOptions) BootstrapConsistencyLevel() topology.ReadConsistencyLevel { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BootstrapConsistencyLevel") + ret0, _ := ret[0].(topology.ReadConsistencyLevel) + return ret0 +} + +// BootstrapConsistencyLevel indicates an expected call of BootstrapConsistencyLevel +func (mr *MockAdminOptionsMockRecorder) BootstrapConsistencyLevel() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BootstrapConsistencyLevel", reflect.TypeOf((*MockAdminOptions)(nil).BootstrapConsistencyLevel)) +} + +// SetFetchSeriesBlocksMaxBlockRetries mocks base method +func (m *MockAdminOptions) SetFetchSeriesBlocksMaxBlockRetries(value int) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchSeriesBlocksMaxBlockRetries", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetFetchSeriesBlocksMaxBlockRetries indicates an expected call of SetFetchSeriesBlocksMaxBlockRetries +func (mr *MockAdminOptionsMockRecorder) SetFetchSeriesBlocksMaxBlockRetries(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchSeriesBlocksMaxBlockRetries", reflect.TypeOf((*MockAdminOptions)(nil).SetFetchSeriesBlocksMaxBlockRetries), value) +} + +// FetchSeriesBlocksMaxBlockRetries mocks base method +func (m *MockAdminOptions) FetchSeriesBlocksMaxBlockRetries() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchSeriesBlocksMaxBlockRetries") + ret0, _ := ret[0].(int) + return ret0 +} + +// FetchSeriesBlocksMaxBlockRetries indicates an expected call of FetchSeriesBlocksMaxBlockRetries +func (mr *MockAdminOptionsMockRecorder) FetchSeriesBlocksMaxBlockRetries() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchSeriesBlocksMaxBlockRetries", reflect.TypeOf((*MockAdminOptions)(nil).FetchSeriesBlocksMaxBlockRetries)) +} + +// SetFetchSeriesBlocksBatchSize mocks base method +func (m *MockAdminOptions) SetFetchSeriesBlocksBatchSize(value int) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchSeriesBlocksBatchSize", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetFetchSeriesBlocksBatchSize indicates an expected call of SetFetchSeriesBlocksBatchSize +func (mr *MockAdminOptionsMockRecorder) SetFetchSeriesBlocksBatchSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchSeriesBlocksBatchSize", reflect.TypeOf((*MockAdminOptions)(nil).SetFetchSeriesBlocksBatchSize), value) +} + +// FetchSeriesBlocksBatchSize mocks base method +func (m *MockAdminOptions) FetchSeriesBlocksBatchSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchSeriesBlocksBatchSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// FetchSeriesBlocksBatchSize indicates an expected call of FetchSeriesBlocksBatchSize +func (mr *MockAdminOptionsMockRecorder) FetchSeriesBlocksBatchSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchSeriesBlocksBatchSize", reflect.TypeOf((*MockAdminOptions)(nil).FetchSeriesBlocksBatchSize)) +} + +// SetFetchSeriesBlocksMetadataBatchTimeout mocks base method +func (m *MockAdminOptions) SetFetchSeriesBlocksMetadataBatchTimeout(value time.Duration) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchSeriesBlocksMetadataBatchTimeout", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetFetchSeriesBlocksMetadataBatchTimeout indicates an expected call of SetFetchSeriesBlocksMetadataBatchTimeout +func (mr *MockAdminOptionsMockRecorder) SetFetchSeriesBlocksMetadataBatchTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchSeriesBlocksMetadataBatchTimeout", reflect.TypeOf((*MockAdminOptions)(nil).SetFetchSeriesBlocksMetadataBatchTimeout), value) +} + +// FetchSeriesBlocksMetadataBatchTimeout mocks base method +func (m *MockAdminOptions) FetchSeriesBlocksMetadataBatchTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchSeriesBlocksMetadataBatchTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// FetchSeriesBlocksMetadataBatchTimeout indicates an expected call of FetchSeriesBlocksMetadataBatchTimeout +func (mr *MockAdminOptionsMockRecorder) FetchSeriesBlocksMetadataBatchTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchSeriesBlocksMetadataBatchTimeout", reflect.TypeOf((*MockAdminOptions)(nil).FetchSeriesBlocksMetadataBatchTimeout)) +} + +// SetFetchSeriesBlocksBatchTimeout mocks base method +func (m *MockAdminOptions) SetFetchSeriesBlocksBatchTimeout(value time.Duration) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchSeriesBlocksBatchTimeout", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetFetchSeriesBlocksBatchTimeout indicates an expected call of SetFetchSeriesBlocksBatchTimeout +func (mr *MockAdminOptionsMockRecorder) SetFetchSeriesBlocksBatchTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchSeriesBlocksBatchTimeout", reflect.TypeOf((*MockAdminOptions)(nil).SetFetchSeriesBlocksBatchTimeout), value) +} + +// FetchSeriesBlocksBatchTimeout mocks base method +func (m *MockAdminOptions) FetchSeriesBlocksBatchTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchSeriesBlocksBatchTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// FetchSeriesBlocksBatchTimeout indicates an expected call of FetchSeriesBlocksBatchTimeout +func (mr *MockAdminOptionsMockRecorder) FetchSeriesBlocksBatchTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchSeriesBlocksBatchTimeout", reflect.TypeOf((*MockAdminOptions)(nil).FetchSeriesBlocksBatchTimeout)) +} + +// SetFetchSeriesBlocksBatchConcurrency mocks base method +func (m *MockAdminOptions) SetFetchSeriesBlocksBatchConcurrency(value int) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFetchSeriesBlocksBatchConcurrency", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetFetchSeriesBlocksBatchConcurrency indicates an expected call of SetFetchSeriesBlocksBatchConcurrency +func (mr *MockAdminOptionsMockRecorder) SetFetchSeriesBlocksBatchConcurrency(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFetchSeriesBlocksBatchConcurrency", reflect.TypeOf((*MockAdminOptions)(nil).SetFetchSeriesBlocksBatchConcurrency), value) +} + +// FetchSeriesBlocksBatchConcurrency mocks base method +func (m *MockAdminOptions) FetchSeriesBlocksBatchConcurrency() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchSeriesBlocksBatchConcurrency") + ret0, _ := ret[0].(int) + return ret0 +} + +// FetchSeriesBlocksBatchConcurrency indicates an expected call of FetchSeriesBlocksBatchConcurrency +func (mr *MockAdminOptionsMockRecorder) FetchSeriesBlocksBatchConcurrency() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchSeriesBlocksBatchConcurrency", reflect.TypeOf((*MockAdminOptions)(nil).FetchSeriesBlocksBatchConcurrency)) +} + +// SetStreamBlocksRetrier mocks base method +func (m *MockAdminOptions) SetStreamBlocksRetrier(value retry.Retrier) AdminOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetStreamBlocksRetrier", value) + ret0, _ := ret[0].(AdminOptions) + return ret0 +} + +// SetStreamBlocksRetrier indicates an expected call of SetStreamBlocksRetrier +func (mr *MockAdminOptionsMockRecorder) SetStreamBlocksRetrier(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetStreamBlocksRetrier", reflect.TypeOf((*MockAdminOptions)(nil).SetStreamBlocksRetrier), value) +} + +// StreamBlocksRetrier mocks base method +func (m *MockAdminOptions) StreamBlocksRetrier() retry.Retrier { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StreamBlocksRetrier") + ret0, _ := ret[0].(retry.Retrier) + return ret0 +} + +// StreamBlocksRetrier indicates an expected call of StreamBlocksRetrier +func (mr *MockAdminOptionsMockRecorder) StreamBlocksRetrier() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StreamBlocksRetrier", reflect.TypeOf((*MockAdminOptions)(nil).StreamBlocksRetrier)) +} + +// MockclientSession is a mock of clientSession interface +type MockclientSession struct { + ctrl *gomock.Controller + recorder *MockclientSessionMockRecorder +} + +// MockclientSessionMockRecorder is the mock recorder for MockclientSession +type MockclientSessionMockRecorder struct { + mock *MockclientSession +} + +// NewMockclientSession creates a new mock instance +func NewMockclientSession(ctrl *gomock.Controller) *MockclientSession { + mock := &MockclientSession{ctrl: ctrl} + mock.recorder = &MockclientSessionMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockclientSession) EXPECT() *MockclientSessionMockRecorder { + return m.recorder +} + +// Write mocks base method +func (m *MockclientSession) Write(namespace, id ident.ID, t time.Time, value float64, unit time0.Unit, annotation []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", namespace, id, t, value, unit, annotation) + ret0, _ := ret[0].(error) + return ret0 +} + +// Write indicates an expected call of Write +func (mr *MockclientSessionMockRecorder) Write(namespace, id, t, value, unit, annotation interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockclientSession)(nil).Write), namespace, id, t, value, unit, annotation) +} + +// WriteTagged mocks base method +func (m *MockclientSession) WriteTagged(namespace, id ident.ID, tags ident.TagIterator, t time.Time, value float64, unit time0.Unit, annotation []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTagged", namespace, id, tags, t, value, unit, annotation) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTagged indicates an expected call of WriteTagged +func (mr *MockclientSessionMockRecorder) WriteTagged(namespace, id, tags, t, value, unit, annotation interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTagged", reflect.TypeOf((*MockclientSession)(nil).WriteTagged), namespace, id, tags, t, value, unit, annotation) +} + +// Fetch mocks base method +func (m *MockclientSession) Fetch(namespace, id ident.ID, startInclusive, endExclusive time.Time) (encoding.SeriesIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fetch", namespace, id, startInclusive, endExclusive) + ret0, _ := ret[0].(encoding.SeriesIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fetch indicates an expected call of Fetch +func (mr *MockclientSessionMockRecorder) Fetch(namespace, id, startInclusive, endExclusive interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fetch", reflect.TypeOf((*MockclientSession)(nil).Fetch), namespace, id, startInclusive, endExclusive) +} + +// FetchIDs mocks base method +func (m *MockclientSession) FetchIDs(namespace ident.ID, ids ident.Iterator, startInclusive, endExclusive time.Time) (encoding.SeriesIterators, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchIDs", namespace, ids, startInclusive, endExclusive) + ret0, _ := ret[0].(encoding.SeriesIterators) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchIDs indicates an expected call of FetchIDs +func (mr *MockclientSessionMockRecorder) FetchIDs(namespace, ids, startInclusive, endExclusive interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchIDs", reflect.TypeOf((*MockclientSession)(nil).FetchIDs), namespace, ids, startInclusive, endExclusive) +} + +// FetchTagged mocks base method +func (m *MockclientSession) FetchTagged(namespace ident.ID, q index.Query, opts index.QueryOptions) (encoding.SeriesIterators, FetchResponseMetadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchTagged", namespace, q, opts) + ret0, _ := ret[0].(encoding.SeriesIterators) + ret1, _ := ret[1].(FetchResponseMetadata) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// FetchTagged indicates an expected call of FetchTagged +func (mr *MockclientSessionMockRecorder) FetchTagged(namespace, q, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTagged", reflect.TypeOf((*MockclientSession)(nil).FetchTagged), namespace, q, opts) +} + +// FetchTaggedIDs mocks base method +func (m *MockclientSession) FetchTaggedIDs(namespace ident.ID, q index.Query, opts index.QueryOptions) (TaggedIDsIterator, FetchResponseMetadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchTaggedIDs", namespace, q, opts) + ret0, _ := ret[0].(TaggedIDsIterator) + ret1, _ := ret[1].(FetchResponseMetadata) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// FetchTaggedIDs indicates an expected call of FetchTaggedIDs +func (mr *MockclientSessionMockRecorder) FetchTaggedIDs(namespace, q, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTaggedIDs", reflect.TypeOf((*MockclientSession)(nil).FetchTaggedIDs), namespace, q, opts) +} + +// Aggregate mocks base method +func (m *MockclientSession) Aggregate(namespace ident.ID, q index.Query, opts index.AggregationOptions) (AggregatedTagsIterator, FetchResponseMetadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Aggregate", namespace, q, opts) + ret0, _ := ret[0].(AggregatedTagsIterator) + ret1, _ := ret[1].(FetchResponseMetadata) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Aggregate indicates an expected call of Aggregate +func (mr *MockclientSessionMockRecorder) Aggregate(namespace, q, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockclientSession)(nil).Aggregate), namespace, q, opts) +} + +// ShardID mocks base method +func (m *MockclientSession) ShardID(id ident.ID) (uint32, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardID", id) + ret0, _ := ret[0].(uint32) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ShardID indicates an expected call of ShardID +func (mr *MockclientSessionMockRecorder) ShardID(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardID", reflect.TypeOf((*MockclientSession)(nil).ShardID), id) +} + +// IteratorPools mocks base method +func (m *MockclientSession) IteratorPools() (encoding.IteratorPools, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IteratorPools") + ret0, _ := ret[0].(encoding.IteratorPools) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IteratorPools indicates an expected call of IteratorPools +func (mr *MockclientSessionMockRecorder) IteratorPools() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IteratorPools", reflect.TypeOf((*MockclientSession)(nil).IteratorPools)) +} + +// Close mocks base method +func (m *MockclientSession) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockclientSessionMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockclientSession)(nil).Close)) +} + +// Origin mocks base method +func (m *MockclientSession) Origin() topology.Host { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Origin") + ret0, _ := ret[0].(topology.Host) + return ret0 +} + +// Origin indicates an expected call of Origin +func (mr *MockclientSessionMockRecorder) Origin() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Origin", reflect.TypeOf((*MockclientSession)(nil).Origin)) +} + +// Replicas mocks base method +func (m *MockclientSession) Replicas() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Replicas") + ret0, _ := ret[0].(int) + return ret0 +} + +// Replicas indicates an expected call of Replicas +func (mr *MockclientSessionMockRecorder) Replicas() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Replicas", reflect.TypeOf((*MockclientSession)(nil).Replicas)) +} + +// TopologyMap mocks base method +func (m *MockclientSession) TopologyMap() (topology.Map, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TopologyMap") + ret0, _ := ret[0].(topology.Map) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// TopologyMap indicates an expected call of TopologyMap +func (mr *MockclientSessionMockRecorder) TopologyMap() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TopologyMap", reflect.TypeOf((*MockclientSession)(nil).TopologyMap)) +} + +// Truncate mocks base method +func (m *MockclientSession) Truncate(namespace ident.ID) (int64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Truncate", namespace) + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Truncate indicates an expected call of Truncate +func (mr *MockclientSessionMockRecorder) Truncate(namespace interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Truncate", reflect.TypeOf((*MockclientSession)(nil).Truncate), namespace) +} + +// FetchBootstrapBlocksFromPeers mocks base method +func (m *MockclientSession) FetchBootstrapBlocksFromPeers(namespace namespace.Metadata, shard uint32, start, end time.Time, opts result.Options) (result.ShardResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBootstrapBlocksFromPeers", namespace, shard, start, end, opts) + ret0, _ := ret[0].(result.ShardResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBootstrapBlocksFromPeers indicates an expected call of FetchBootstrapBlocksFromPeers +func (mr *MockclientSessionMockRecorder) FetchBootstrapBlocksFromPeers(namespace, shard, start, end, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBootstrapBlocksFromPeers", reflect.TypeOf((*MockclientSession)(nil).FetchBootstrapBlocksFromPeers), namespace, shard, start, end, opts) +} + +// FetchBootstrapBlocksMetadataFromPeers mocks base method +func (m *MockclientSession) FetchBootstrapBlocksMetadataFromPeers(namespace ident.ID, shard uint32, start, end time.Time, result result.Options) (PeerBlockMetadataIter, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBootstrapBlocksMetadataFromPeers", namespace, shard, start, end, result) + ret0, _ := ret[0].(PeerBlockMetadataIter) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBootstrapBlocksMetadataFromPeers indicates an expected call of FetchBootstrapBlocksMetadataFromPeers +func (mr *MockclientSessionMockRecorder) FetchBootstrapBlocksMetadataFromPeers(namespace, shard, start, end, result interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBootstrapBlocksMetadataFromPeers", reflect.TypeOf((*MockclientSession)(nil).FetchBootstrapBlocksMetadataFromPeers), namespace, shard, start, end, result) +} + +// FetchBlocksMetadataFromPeers mocks base method +func (m *MockclientSession) FetchBlocksMetadataFromPeers(namespace ident.ID, shard uint32, start, end time.Time, consistencyLevel topology.ReadConsistencyLevel, result result.Options) (PeerBlockMetadataIter, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksMetadataFromPeers", namespace, shard, start, end, consistencyLevel, result) + ret0, _ := ret[0].(PeerBlockMetadataIter) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksMetadataFromPeers indicates an expected call of FetchBlocksMetadataFromPeers +func (mr *MockclientSessionMockRecorder) FetchBlocksMetadataFromPeers(namespace, shard, start, end, consistencyLevel, result interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksMetadataFromPeers", reflect.TypeOf((*MockclientSession)(nil).FetchBlocksMetadataFromPeers), namespace, shard, start, end, consistencyLevel, result) +} + +// FetchBlocksFromPeers mocks base method +func (m *MockclientSession) FetchBlocksFromPeers(namespace namespace.Metadata, shard uint32, consistencyLevel topology.ReadConsistencyLevel, metadatas []block.ReplicaMetadata, opts result.Options) (PeerBlocksIter, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksFromPeers", namespace, shard, consistencyLevel, metadatas, opts) + ret0, _ := ret[0].(PeerBlocksIter) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksFromPeers indicates an expected call of FetchBlocksFromPeers +func (mr *MockclientSessionMockRecorder) FetchBlocksFromPeers(namespace, shard, consistencyLevel, metadatas, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksFromPeers", reflect.TypeOf((*MockclientSession)(nil).FetchBlocksFromPeers), namespace, shard, consistencyLevel, metadatas, opts) +} + +// Open mocks base method +func (m *MockclientSession) Open() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Open") + ret0, _ := ret[0].(error) + return ret0 +} + +// Open indicates an expected call of Open +func (mr *MockclientSessionMockRecorder) Open() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Open", reflect.TypeOf((*MockclientSession)(nil).Open)) +} + +// MockhostQueue is a mock of hostQueue interface +type MockhostQueue struct { + ctrl *gomock.Controller + recorder *MockhostQueueMockRecorder +} + +// MockhostQueueMockRecorder is the mock recorder for MockhostQueue +type MockhostQueueMockRecorder struct { + mock *MockhostQueue +} + +// NewMockhostQueue creates a new mock instance +func NewMockhostQueue(ctrl *gomock.Controller) *MockhostQueue { + mock := &MockhostQueue{ctrl: ctrl} + mock.recorder = &MockhostQueueMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockhostQueue) EXPECT() *MockhostQueueMockRecorder { + return m.recorder +} + +// Open mocks base method +func (m *MockhostQueue) Open() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Open") +} + +// Open indicates an expected call of Open +func (mr *MockhostQueueMockRecorder) Open() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Open", reflect.TypeOf((*MockhostQueue)(nil).Open)) +} + +// Len mocks base method +func (m *MockhostQueue) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockhostQueueMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockhostQueue)(nil).Len)) +} + +// Enqueue mocks base method +func (m *MockhostQueue) Enqueue(op op) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Enqueue", op) + ret0, _ := ret[0].(error) + return ret0 +} + +// Enqueue indicates an expected call of Enqueue +func (mr *MockhostQueueMockRecorder) Enqueue(op interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Enqueue", reflect.TypeOf((*MockhostQueue)(nil).Enqueue), op) +} + +// Host mocks base method +func (m *MockhostQueue) Host() topology.Host { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Host") + ret0, _ := ret[0].(topology.Host) + return ret0 +} + +// Host indicates an expected call of Host +func (mr *MockhostQueueMockRecorder) Host() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Host", reflect.TypeOf((*MockhostQueue)(nil).Host)) +} + +// ConnectionCount mocks base method +func (m *MockhostQueue) ConnectionCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConnectionCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// ConnectionCount indicates an expected call of ConnectionCount +func (mr *MockhostQueueMockRecorder) ConnectionCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConnectionCount", reflect.TypeOf((*MockhostQueue)(nil).ConnectionCount)) +} + +// ConnectionPool mocks base method +func (m *MockhostQueue) ConnectionPool() connectionPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConnectionPool") + ret0, _ := ret[0].(connectionPool) + return ret0 +} + +// ConnectionPool indicates an expected call of ConnectionPool +func (mr *MockhostQueueMockRecorder) ConnectionPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConnectionPool", reflect.TypeOf((*MockhostQueue)(nil).ConnectionPool)) +} + +// BorrowConnection mocks base method +func (m *MockhostQueue) BorrowConnection(fn withConnectionFn) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BorrowConnection", fn) + ret0, _ := ret[0].(error) + return ret0 +} + +// BorrowConnection indicates an expected call of BorrowConnection +func (mr *MockhostQueueMockRecorder) BorrowConnection(fn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BorrowConnection", reflect.TypeOf((*MockhostQueue)(nil).BorrowConnection), fn) +} + +// Close mocks base method +func (m *MockhostQueue) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockhostQueueMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockhostQueue)(nil).Close)) +} + +// MockconnectionPool is a mock of connectionPool interface +type MockconnectionPool struct { + ctrl *gomock.Controller + recorder *MockconnectionPoolMockRecorder +} + +// MockconnectionPoolMockRecorder is the mock recorder for MockconnectionPool +type MockconnectionPoolMockRecorder struct { + mock *MockconnectionPool +} + +// NewMockconnectionPool creates a new mock instance +func NewMockconnectionPool(ctrl *gomock.Controller) *MockconnectionPool { + mock := &MockconnectionPool{ctrl: ctrl} + mock.recorder = &MockconnectionPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockconnectionPool) EXPECT() *MockconnectionPoolMockRecorder { + return m.recorder +} + +// Open mocks base method +func (m *MockconnectionPool) Open() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Open") +} + +// Open indicates an expected call of Open +func (mr *MockconnectionPoolMockRecorder) Open() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Open", reflect.TypeOf((*MockconnectionPool)(nil).Open)) +} + +// ConnectionCount mocks base method +func (m *MockconnectionPool) ConnectionCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConnectionCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// ConnectionCount indicates an expected call of ConnectionCount +func (mr *MockconnectionPoolMockRecorder) ConnectionCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConnectionCount", reflect.TypeOf((*MockconnectionPool)(nil).ConnectionCount)) +} + +// NextClient mocks base method +func (m *MockconnectionPool) NextClient() (rpc.TChanNode, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NextClient") + ret0, _ := ret[0].(rpc.TChanNode) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NextClient indicates an expected call of NextClient +func (mr *MockconnectionPoolMockRecorder) NextClient() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NextClient", reflect.TypeOf((*MockconnectionPool)(nil).NextClient)) +} + +// Close mocks base method +func (m *MockconnectionPool) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockconnectionPoolMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockconnectionPool)(nil).Close)) +} + +// MockpeerSource is a mock of peerSource interface +type MockpeerSource struct { + ctrl *gomock.Controller + recorder *MockpeerSourceMockRecorder +} + +// MockpeerSourceMockRecorder is the mock recorder for MockpeerSource +type MockpeerSourceMockRecorder struct { + mock *MockpeerSource +} + +// NewMockpeerSource creates a new mock instance +func NewMockpeerSource(ctrl *gomock.Controller) *MockpeerSource { + mock := &MockpeerSource{ctrl: ctrl} + mock.recorder = &MockpeerSourceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockpeerSource) EXPECT() *MockpeerSourceMockRecorder { + return m.recorder +} + +// BorrowConnection mocks base method +func (m *MockpeerSource) BorrowConnection(hostID string, fn withConnectionFn) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BorrowConnection", hostID, fn) + ret0, _ := ret[0].(error) + return ret0 +} + +// BorrowConnection indicates an expected call of BorrowConnection +func (mr *MockpeerSourceMockRecorder) BorrowConnection(hostID, fn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BorrowConnection", reflect.TypeOf((*MockpeerSource)(nil).BorrowConnection), hostID, fn) +} + +// Mockpeer is a mock of peer interface +type Mockpeer struct { + ctrl *gomock.Controller + recorder *MockpeerMockRecorder +} + +// MockpeerMockRecorder is the mock recorder for Mockpeer +type MockpeerMockRecorder struct { + mock *Mockpeer +} + +// NewMockpeer creates a new mock instance +func NewMockpeer(ctrl *gomock.Controller) *Mockpeer { + mock := &Mockpeer{ctrl: ctrl} + mock.recorder = &MockpeerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *Mockpeer) EXPECT() *MockpeerMockRecorder { + return m.recorder +} + +// Host mocks base method +func (m *Mockpeer) Host() topology.Host { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Host") + ret0, _ := ret[0].(topology.Host) + return ret0 +} + +// Host indicates an expected call of Host +func (mr *MockpeerMockRecorder) Host() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Host", reflect.TypeOf((*Mockpeer)(nil).Host)) +} + +// BorrowConnection mocks base method +func (m *Mockpeer) BorrowConnection(fn withConnectionFn) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BorrowConnection", fn) + ret0, _ := ret[0].(error) + return ret0 +} + +// BorrowConnection indicates an expected call of BorrowConnection +func (mr *MockpeerMockRecorder) BorrowConnection(fn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BorrowConnection", reflect.TypeOf((*Mockpeer)(nil).BorrowConnection), fn) +} + +// Mockop is a mock of op interface +type Mockop struct { + ctrl *gomock.Controller + recorder *MockopMockRecorder +} + +// MockopMockRecorder is the mock recorder for Mockop +type MockopMockRecorder struct { + mock *Mockop +} + +// NewMockop creates a new mock instance +func NewMockop(ctrl *gomock.Controller) *Mockop { + mock := &Mockop{ctrl: ctrl} + mock.recorder = &MockopMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *Mockop) EXPECT() *MockopMockRecorder { + return m.recorder +} + +// Size mocks base method +func (m *Mockop) Size() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Size") + ret0, _ := ret[0].(int) + return ret0 +} + +// Size indicates an expected call of Size +func (mr *MockopMockRecorder) Size() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Size", reflect.TypeOf((*Mockop)(nil).Size)) +} + +// CompletionFn mocks base method +func (m *Mockop) CompletionFn() completionFn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CompletionFn") + ret0, _ := ret[0].(completionFn) + return ret0 +} + +// CompletionFn indicates an expected call of CompletionFn +func (mr *MockopMockRecorder) CompletionFn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompletionFn", reflect.TypeOf((*Mockop)(nil).CompletionFn)) +} + +// MockenqueueChannel is a mock of enqueueChannel interface +type MockenqueueChannel struct { + ctrl *gomock.Controller + recorder *MockenqueueChannelMockRecorder +} + +// MockenqueueChannelMockRecorder is the mock recorder for MockenqueueChannel +type MockenqueueChannelMockRecorder struct { + mock *MockenqueueChannel +} + +// NewMockenqueueChannel creates a new mock instance +func NewMockenqueueChannel(ctrl *gomock.Controller) *MockenqueueChannel { + mock := &MockenqueueChannel{ctrl: ctrl} + mock.recorder = &MockenqueueChannelMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockenqueueChannel) EXPECT() *MockenqueueChannelMockRecorder { + return m.recorder +} + +// enqueue mocks base method +func (m *MockenqueueChannel) enqueue(peersMetadata []receivedBlockMetadata) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "enqueue", peersMetadata) + ret0, _ := ret[0].(error) + return ret0 +} + +// enqueue indicates an expected call of enqueue +func (mr *MockenqueueChannelMockRecorder) enqueue(peersMetadata interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "enqueue", reflect.TypeOf((*MockenqueueChannel)(nil).enqueue), peersMetadata) +} + +// enqueueDelayed mocks base method +func (m *MockenqueueChannel) enqueueDelayed(numToEnqueue int) (enqueueDelayedFn, enqueueDelayedDoneFn, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "enqueueDelayed", numToEnqueue) + ret0, _ := ret[0].(enqueueDelayedFn) + ret1, _ := ret[1].(enqueueDelayedDoneFn) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// enqueueDelayed indicates an expected call of enqueueDelayed +func (mr *MockenqueueChannelMockRecorder) enqueueDelayed(numToEnqueue interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "enqueueDelayed", reflect.TypeOf((*MockenqueueChannel)(nil).enqueueDelayed), numToEnqueue) +} + +// read mocks base method +func (m *MockenqueueChannel) read() <-chan []receivedBlockMetadata { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "read") + ret0, _ := ret[0].(<-chan []receivedBlockMetadata) + return ret0 +} + +// read indicates an expected call of read +func (mr *MockenqueueChannelMockRecorder) read() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "read", reflect.TypeOf((*MockenqueueChannel)(nil).read)) +} + +// trackPending mocks base method +func (m *MockenqueueChannel) trackPending(amount int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "trackPending", amount) +} + +// trackPending indicates an expected call of trackPending +func (mr *MockenqueueChannelMockRecorder) trackPending(amount interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "trackPending", reflect.TypeOf((*MockenqueueChannel)(nil).trackPending), amount) +} + +// trackProcessed mocks base method +func (m *MockenqueueChannel) trackProcessed(amount int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "trackProcessed", amount) +} + +// trackProcessed indicates an expected call of trackProcessed +func (mr *MockenqueueChannelMockRecorder) trackProcessed(amount interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "trackProcessed", reflect.TypeOf((*MockenqueueChannel)(nil).trackProcessed), amount) +} + +// unprocessedLen mocks base method +func (m *MockenqueueChannel) unprocessedLen() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "unprocessedLen") + ret0, _ := ret[0].(int) + return ret0 +} + +// unprocessedLen indicates an expected call of unprocessedLen +func (mr *MockenqueueChannelMockRecorder) unprocessedLen() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "unprocessedLen", reflect.TypeOf((*MockenqueueChannel)(nil).unprocessedLen)) +} + +// closeOnAllProcessed mocks base method +func (m *MockenqueueChannel) closeOnAllProcessed() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "closeOnAllProcessed") +} + +// closeOnAllProcessed indicates an expected call of closeOnAllProcessed +func (mr *MockenqueueChannelMockRecorder) closeOnAllProcessed() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "closeOnAllProcessed", reflect.TypeOf((*MockenqueueChannel)(nil).closeOnAllProcessed)) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/config.go b/vendor/github.com/m3db/m3/src/dbnode/client/config.go new file mode 100644 index 00000000..c403ca21 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/config.go @@ -0,0 +1,458 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "errors" + "fmt" + "io" + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/encoding/m3tsz" + "github.com/m3db/m3/src/dbnode/environment" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/topology" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/retry" + "github.com/m3db/m3/src/x/sampler" + xsync "github.com/m3db/m3/src/x/sync" +) + +const ( + asyncWriteWorkerPoolDefaultSize = 128 +) + +var ( + errConfigurationMustSupplyConfig = errors.New( + "must supply config when no topology initializer parameter supplied") +) + +// Configuration is a configuration that can be used to construct a client. +type Configuration struct { + // The environment (static or dynamic) configuration. + EnvironmentConfig *environment.Configuration `yaml:"config"` + + // WriteConsistencyLevel specifies the write consistency level. + WriteConsistencyLevel *topology.ConsistencyLevel `yaml:"writeConsistencyLevel"` + + // ReadConsistencyLevel specifies the read consistency level. + ReadConsistencyLevel *topology.ReadConsistencyLevel `yaml:"readConsistencyLevel"` + + // ConnectConsistencyLevel specifies the cluster connect consistency level. + ConnectConsistencyLevel *topology.ConnectConsistencyLevel `yaml:"connectConsistencyLevel"` + + // WriteTimeout is the write request timeout. + WriteTimeout *time.Duration `yaml:"writeTimeout"` + + // FetchTimeout is the fetch request timeout. + FetchTimeout *time.Duration `yaml:"fetchTimeout"` + + // ConnectTimeout is the cluster connect timeout. + ConnectTimeout *time.Duration `yaml:"connectTimeout"` + + // WriteRetry is the write retry config. + WriteRetry *retry.Configuration `yaml:"writeRetry"` + + // FetchRetry is the fetch retry config. + FetchRetry *retry.Configuration `yaml:"fetchRetry"` + + // LogErrorSampleRate is the log error sample rate. + LogErrorSampleRate sampler.Rate `yaml:"logErrorSampleRate"` + + // BackgroundHealthCheckFailLimit is the amount of times a background check + // must fail before a connection is taken out of consideration. + BackgroundHealthCheckFailLimit *int `yaml:"backgroundHealthCheckFailLimit"` + + // BackgroundHealthCheckFailThrottleFactor is the factor of the host connect + // time to use when sleeping between a failed health check and the next check. + BackgroundHealthCheckFailThrottleFactor *float64 `yaml:"backgroundHealthCheckFailThrottleFactor"` + + // HashingConfiguration is the configuration for hashing of IDs to shards. + HashingConfiguration *HashingConfiguration `yaml:"hashing"` + + // Proto contains the configuration specific to running in the ProtoDataMode. + Proto *ProtoConfiguration `yaml:"proto"` + + // AsyncWriteWorkerPoolSize is the worker pool size for async write requests. + AsyncWriteWorkerPoolSize *int `yaml:"asyncWriteWorkerPoolSize"` + + // AsyncWriteMaxConcurrency is the maximum concurrency for async write requests. + AsyncWriteMaxConcurrency *int `yaml:"asyncWriteMaxConcurrency"` + + // UseV2BatchAPIs determines whether the V2 batch APIs are used. Note that the M3DB nodes must + // have support for the V2 APIs in order for this feature to be used. + UseV2BatchAPIs *bool `yaml:"useV2BatchAPIs"` + + // WriteTimestampOffset offsets all writes by specified duration into the past. + WriteTimestampOffset *time.Duration `yaml:"writeTimestampOffset"` + + // FetchSeriesBlocksBatchConcurrency sets the number of batches of blocks to retrieve + // in parallel from a remote peer. Defaults to NumCPU / 2. + FetchSeriesBlocksBatchConcurrency *int `yaml:"fetchSeriesBlocksBatchConcurrency"` + + // FetchSeriesBlocksBatchSize sets the number of blocks to retrieve in a single batch + // from the remote peer. Defaults to 4096. + FetchSeriesBlocksBatchSize *int `yaml:"fetchSeriesBlocksBatchSize"` + + // WriteShardsInitializing sets whether or not writes to leaving shards + // count towards consistency, by default they do not. + WriteShardsInitializing *bool `yaml:"writeShardsInitializing"` + + // ShardsLeavingCountTowardsConsistency sets whether or not writes to leaving shards + // count towards consistency, by default they do not. + ShardsLeavingCountTowardsConsistency *bool `yaml:"shardsLeavingCountTowardsConsistency"` +} + +// ProtoConfiguration is the configuration for running with ProtoDataMode enabled. +type ProtoConfiguration struct { + // Enabled specifies whether proto is enabled. + Enabled bool `yaml:"enabled"` + // load user schema from client configuration into schema registry + // at startup/initialization time. + SchemaRegistry map[string]NamespaceProtoSchema `yaml:"schema_registry"` +} + +// NamespaceProtoSchema is the protobuf schema for a namespace. +type NamespaceProtoSchema struct { + MessageName string `yaml:"messageName"` + SchemaDeployID string `yaml:"schemaDeployID"` + SchemaFilePath string `yaml:"schemaFilePath"` +} + +// Validate validates the NamespaceProtoSchema. +func (c NamespaceProtoSchema) Validate() error { + if c.SchemaFilePath == "" { + return errors.New("schemaFilePath is required for Proto data mode") + } + + if c.MessageName == "" { + return errors.New("messageName is required for Proto data mode") + } + + return nil +} + +// Validate validates the ProtoConfiguration. +func (c *ProtoConfiguration) Validate() error { + if c == nil || !c.Enabled { + return nil + } + + for _, schema := range c.SchemaRegistry { + if err := schema.Validate(); err != nil { + return err + } + } + return nil +} + +// Validate validates the configuration. +func (c *Configuration) Validate() error { + if c.WriteTimeout != nil && *c.WriteTimeout < 0 { + return fmt.Errorf("m3db client writeTimeout was: %d but must be >= 0", *c.WriteTimeout) + } + + if c.FetchTimeout != nil && *c.FetchTimeout < 0 { + return fmt.Errorf("m3db client fetchTimeout was: %d but must be >= 0", *c.FetchTimeout) + } + + if c.ConnectTimeout != nil && *c.ConnectTimeout < 0 { + return fmt.Errorf("m3db client connectTimeout was: %d but must be >= 0", *c.ConnectTimeout) + } + + if err := c.LogErrorSampleRate.Validate(); err != nil { + return fmt.Errorf("m3db client error validating log error sample rate: %v", err) + } + + if c.BackgroundHealthCheckFailLimit != nil && + (*c.BackgroundHealthCheckFailLimit < 0 || *c.BackgroundHealthCheckFailLimit > 10) { + return fmt.Errorf( + "m3db client backgroundHealthCheckFailLimit was: %d but must be >= 0 and <=10", + *c.BackgroundHealthCheckFailLimit) + } + + if c.BackgroundHealthCheckFailThrottleFactor != nil && + (*c.BackgroundHealthCheckFailThrottleFactor < 0 || *c.BackgroundHealthCheckFailThrottleFactor > 10) { + return fmt.Errorf( + "m3db client backgroundHealthCheckFailThrottleFactor was: %f but must be >= 0 and <=10", + *c.BackgroundHealthCheckFailThrottleFactor) + } + + if c.AsyncWriteWorkerPoolSize != nil && *c.AsyncWriteWorkerPoolSize <= 0 { + return fmt.Errorf("m3db client async write worker pool size was: %d but must be >0", + *c.AsyncWriteWorkerPoolSize) + } + + if c.AsyncWriteMaxConcurrency != nil && *c.AsyncWriteMaxConcurrency <= 0 { + return fmt.Errorf("m3db client async write max concurrency was: %d but must be >0", + *c.AsyncWriteMaxConcurrency) + } + + if err := c.Proto.Validate(); err != nil { + return fmt.Errorf("error validating M3DB client proto configuration: %v", err) + } + + return nil +} + +// HashingConfiguration is the configuration for hashing +type HashingConfiguration struct { + // Murmur32 seed value + Seed uint32 `yaml:"seed"` +} + +// ConfigurationParameters are optional parameters that can be specified +// when creating a client from configuration, this is specified using +// a struct so that adding fields do not cause breaking changes to callers. +type ConfigurationParameters struct { + // InstrumentOptions is a required argument when + // constructing a client from configuration. + InstrumentOptions instrument.Options + + // TopologyInitializer is an optional argument when + // constructing a client from configuration. + TopologyInitializer topology.Initializer + + // EncodingOptions is an optional argument when + // constructing a client from configuration. + EncodingOptions encoding.Options +} + +// CustomOption is a programatic method for setting a client +// option after all the options have been set by configuration. +type CustomOption func(v Options) Options + +// CustomAdminOption is a programatic method for setting a client +// admin option after all the options have been set by configuration. +type CustomAdminOption func(v AdminOptions) AdminOptions + +// NewClient creates a new M3DB client using +// specified params and custom options. +func (c Configuration) NewClient( + params ConfigurationParameters, + custom ...CustomOption, +) (Client, error) { + customAdmin := make([]CustomAdminOption, 0, len(custom)) + for _, opt := range custom { + customAdmin = append(customAdmin, func(v AdminOptions) AdminOptions { + return opt(Options(v)).(AdminOptions) + }) + } + + v, err := c.NewAdminClient(params, customAdmin...) + if err != nil { + return nil, err + } + + return v, err +} + +// NewAdminClient creates a new M3DB admin client using +// specified params and custom options. +func (c Configuration) NewAdminClient( + params ConfigurationParameters, + custom ...CustomAdminOption, +) (AdminClient, error) { + err := c.Validate() + if err != nil { + return nil, err + } + + iopts := params.InstrumentOptions + if iopts == nil { + iopts = instrument.NewOptions() + } + writeRequestScope := iopts.MetricsScope().SubScope("write-req") + fetchRequestScope := iopts.MetricsScope().SubScope("fetch-req") + + cfgParams := environment.ConfigurationParameters{ + InstrumentOpts: iopts, + } + if c.HashingConfiguration != nil { + cfgParams.HashingSeed = c.HashingConfiguration.Seed + } + + var ( + syncTopoInit = params.TopologyInitializer + syncClientOverrides environment.ClientOverrides + asyncTopoInits = []topology.Initializer{} + asyncClientOverrides = []environment.ClientOverrides{} + ) + + var buildAsyncPool bool + if syncTopoInit == nil { + envCfgs, err := c.EnvironmentConfig.Configure(cfgParams) + if err != nil { + err = fmt.Errorf("unable to create topology initializer, err: %v", err) + return nil, err + } + + for _, envCfg := range envCfgs { + if envCfg.Async { + asyncTopoInits = append(asyncTopoInits, envCfg.TopologyInitializer) + asyncClientOverrides = append(asyncClientOverrides, envCfg.ClientOverrides) + buildAsyncPool = true + } else { + syncTopoInit = envCfg.TopologyInitializer + syncClientOverrides = envCfg.ClientOverrides + } + } + } + + v := NewAdminOptions(). + SetTopologyInitializer(syncTopoInit). + SetAsyncTopologyInitializers(asyncTopoInits). + SetInstrumentOptions(iopts). + SetLogErrorSampleRate(c.LogErrorSampleRate) + + if c.UseV2BatchAPIs != nil { + v = v.SetUseV2BatchAPIs(*c.UseV2BatchAPIs) + } + + if buildAsyncPool { + var size int + if c.AsyncWriteWorkerPoolSize == nil { + size = asyncWriteWorkerPoolDefaultSize + } else { + size = *c.AsyncWriteWorkerPoolSize + } + + workerPoolInstrumentOpts := iopts.SetMetricsScope(writeRequestScope.SubScope("workerpool")) + workerPoolOpts := xsync.NewPooledWorkerPoolOptions(). + SetGrowOnDemand(true). + SetInstrumentOptions(workerPoolInstrumentOpts) + workerPool, err := xsync.NewPooledWorkerPool(size, workerPoolOpts) + if err != nil { + return nil, fmt.Errorf("unable to create async worker pool: %v", err) + } + workerPool.Init() + v = v.SetAsyncWriteWorkerPool(workerPool) + } + + if c.AsyncWriteMaxConcurrency != nil { + v = v.SetAsyncWriteMaxConcurrency(*c.AsyncWriteMaxConcurrency) + } + + if c.WriteConsistencyLevel != nil { + v = v.SetWriteConsistencyLevel(*c.WriteConsistencyLevel) + } + if c.ReadConsistencyLevel != nil { + v = v.SetReadConsistencyLevel(*c.ReadConsistencyLevel) + } + if c.ConnectConsistencyLevel != nil { + v.SetClusterConnectConsistencyLevel(*c.ConnectConsistencyLevel) + } + if c.BackgroundHealthCheckFailLimit != nil { + v = v.SetBackgroundHealthCheckFailLimit(*c.BackgroundHealthCheckFailLimit) + } + if c.BackgroundHealthCheckFailThrottleFactor != nil { + v = v.SetBackgroundHealthCheckFailThrottleFactor(*c.BackgroundHealthCheckFailThrottleFactor) + } + if c.WriteTimeout != nil { + v = v.SetWriteRequestTimeout(*c.WriteTimeout) + } + if c.FetchTimeout != nil { + v = v.SetFetchRequestTimeout(*c.FetchTimeout) + } + if c.ConnectTimeout != nil { + v = v.SetClusterConnectTimeout(*c.ConnectTimeout) + } + if c.WriteRetry != nil { + v = v.SetWriteRetrier(c.WriteRetry.NewRetrier(writeRequestScope)) + } else { + // Have not set write retry explicitly, but would like metrics + // emitted for the write retrier with the scope for write requests. + retrierOpts := v.WriteRetrier().Options(). + SetMetricsScope(writeRequestScope) + v = v.SetWriteRetrier(retry.NewRetrier(retrierOpts)) + } + if c.FetchRetry != nil { + v = v.SetFetchRetrier(c.FetchRetry.NewRetrier(fetchRequestScope)) + } else { + // Have not set fetch retry explicitly, but would like metrics + // emitted for the fetch retrier with the scope for fetch requests. + retrierOpts := v.FetchRetrier().Options(). + SetMetricsScope(fetchRequestScope) + v = v.SetFetchRetrier(retry.NewRetrier(retrierOpts)) + } + if syncClientOverrides.TargetHostQueueFlushSize != nil { + v = v.SetHostQueueOpsFlushSize(*syncClientOverrides.TargetHostQueueFlushSize) + } + if syncClientOverrides.HostQueueFlushInterval != nil { + v = v.SetHostQueueOpsFlushInterval(*syncClientOverrides.HostQueueFlushInterval) + } + + encodingOpts := params.EncodingOptions + if encodingOpts == nil { + encodingOpts = encoding.NewOptions() + } + + v = v.SetReaderIteratorAllocate(func(r io.Reader, _ namespace.SchemaDescr) encoding.ReaderIterator { + intOptimized := m3tsz.DefaultIntOptimizationEnabled + return m3tsz.NewReaderIterator(r, intOptimized, encodingOpts) + }) + + if c.Proto != nil && c.Proto.Enabled { + v = v.SetEncodingProto(encodingOpts) + schemaRegistry := namespace.NewSchemaRegistry(true, nil) + // Load schema registry from file. + deployID := "fromfile" + for nsID, protoConfig := range c.Proto.SchemaRegistry { + err = namespace.LoadSchemaRegistryFromFile(schemaRegistry, ident.StringID(nsID), deployID, protoConfig.SchemaFilePath, protoConfig.MessageName) + if err != nil { + return nil, xerrors.Wrapf(err, "could not load schema registry from file %s for namespace %s", protoConfig.SchemaFilePath, nsID) + } + } + v = v.SetSchemaRegistry(schemaRegistry) + } + + if c.WriteShardsInitializing != nil { + v = v.SetWriteShardsInitializing(*c.WriteShardsInitializing) + } + if c.ShardsLeavingCountTowardsConsistency != nil { + v = v.SetShardsLeavingCountTowardsConsistency(*c.ShardsLeavingCountTowardsConsistency) + } + + // Cast to admin options to apply admin config options. + opts := v.(AdminOptions) + + if c.WriteTimestampOffset != nil { + opts = opts.SetWriteTimestampOffset(*c.WriteTimestampOffset) + } + + if c.FetchSeriesBlocksBatchConcurrency != nil { + opts = opts.SetFetchSeriesBlocksBatchConcurrency(*c.FetchSeriesBlocksBatchConcurrency) + } + if c.FetchSeriesBlocksBatchSize != nil { + opts = opts.SetFetchSeriesBlocksBatchSize(*c.FetchSeriesBlocksBatchSize) + } + + // Apply programmatic custom options last. + for _, opt := range custom { + opts = opt(opts) + } + + asyncClusterOpts := NewOptionsForAsyncClusters(opts, asyncTopoInits, asyncClientOverrides) + return NewAdminClient(opts, asyncClusterOpts...) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/connection_pool.go b/vendor/github.com/m3db/m3/src/dbnode/client/connection_pool.go new file mode 100644 index 00000000..93740867 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/connection_pool.go @@ -0,0 +1,322 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "errors" + "fmt" + "math" + "math/rand" + "sync" + "sync/atomic" + "time" + + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/dbnode/topology" + xclose "github.com/m3db/m3/src/x/close" + murmur3 "github.com/m3db/stackmurmur3/v2" + + "github.com/uber-go/tally" + "github.com/uber/tchannel-go/thrift" + "go.uber.org/zap" +) + +const ( + channelName = "Client" +) + +var ( + errConnectionPoolClosed = errors.New("connection pool closed") + errConnectionPoolHasNoConnections = newHostNotAvailableError(errors.New("connection pool has no connections")) +) + +type connPool struct { + sync.RWMutex + + opts Options + host topology.Host + pool []conn + poolLen int64 + used int64 + connectRand rand.Source + healthCheckRand rand.Source + healthCheckNewConn healthCheckFn + healthCheck healthCheckFn + sleepConnect sleepFn + sleepHealth sleepFn + sleepHealthRetry sleepFn + status status + healthStatus tally.Gauge +} + +type conn struct { + channel xclose.SimpleCloser + client rpc.TChanNode +} + +// NewConnectionFn is a function that creates a connection. +type NewConnectionFn func( + channelName string, addr string, opts Options, +) (xclose.SimpleCloser, rpc.TChanNode, error) + +type healthCheckFn func(client rpc.TChanNode, opts Options) error + +type sleepFn func(t time.Duration) + +func newConnectionPool(host topology.Host, opts Options) connectionPool { + seed := int64(murmur3.StringSum32(host.Address())) + + p := &connPool{ + opts: opts, + host: host, + pool: make([]conn, 0, opts.MaxConnectionCount()), + poolLen: 0, + connectRand: rand.NewSource(seed), + healthCheckRand: rand.NewSource(seed + 1), + healthCheckNewConn: healthCheck, + healthCheck: healthCheck, + sleepConnect: time.Sleep, + sleepHealth: time.Sleep, + sleepHealthRetry: time.Sleep, + healthStatus: opts.InstrumentOptions().MetricsScope().Gauge("health-status"), + } + + return p +} + +func (p *connPool) Open() { + p.Lock() + defer p.Unlock() + + if p.status != statusNotOpen { + return + } + + p.status = statusOpen + + connectEvery := p.opts.BackgroundConnectInterval() + connectStutter := p.opts.BackgroundConnectStutter() + go p.connectEvery(connectEvery, connectStutter) + + healthCheckEvery := p.opts.BackgroundHealthCheckInterval() + healthCheckStutter := p.opts.BackgroundHealthCheckStutter() + go p.healthCheckEvery(healthCheckEvery, healthCheckStutter) +} + +func (p *connPool) ConnectionCount() int { + p.RLock() + poolLen := p.poolLen + p.RUnlock() + return int(poolLen) +} + +func (p *connPool) NextClient() (rpc.TChanNode, error) { + p.RLock() + if p.status != statusOpen { + p.RUnlock() + return nil, errConnectionPoolClosed + } + if p.poolLen < 1 { + p.RUnlock() + return nil, errConnectionPoolHasNoConnections + } + n := atomic.AddInt64(&p.used, 1) + conn := p.pool[n%p.poolLen] + p.RUnlock() + return conn.client, nil +} + +func (p *connPool) Close() { + p.Lock() + if p.status != statusOpen { + p.Unlock() + return + } + p.status = statusClosed + p.Unlock() + + for i := range p.pool { + p.pool[i].channel.Close() + } +} + +func (p *connPool) connectEvery(interval time.Duration, stutter time.Duration) { + log := p.opts.InstrumentOptions().Logger() + target := p.opts.MaxConnectionCount() + + for { + p.RLock() + state := p.status + poolLen := int(p.poolLen) + p.RUnlock() + if state != statusOpen { + return + } + + address := p.host.Address() + + var wg sync.WaitGroup + for i := 0; i < target-poolLen; i++ { + wg.Add(1) + newConnFn := p.opts.NewConnectionFn() + go func() { + defer wg.Done() + + // Create connection + channel, client, err := newConnFn(channelName, address, p.opts) + if err != nil { + log.Debug("could not connect", zap.String("host", address), zap.Error(err)) + return + } + + // Health check the connection + if err := p.healthCheckNewConn(client, p.opts); err != nil { + p.maybeEmitHealthStatus(healthStatusCheckFailed) + log.Debug("could not connect, failed health check", zap.String("host", address), zap.Error(err)) + channel.Close() + return + } + + p.maybeEmitHealthStatus(healthStatusOK) + p.Lock() + if p.status == statusOpen { + p.pool = append(p.pool, conn{channel, client}) + p.poolLen = int64(len(p.pool)) + } + p.Unlock() + }() + } + + wg.Wait() + + p.sleepConnect(interval + randStutter(p.connectRand, stutter)) + } +} + +func (p *connPool) maybeEmitHealthStatus(hs healthStatus) { + if p.opts.HostQueueEmitsHealthStatus() { + p.healthStatus.Update(float64(hs)) + } +} + +func (p *connPool) healthCheckEvery(interval time.Duration, stutter time.Duration) { + log := p.opts.InstrumentOptions().Logger() + nowFn := p.opts.ClockOptions().NowFn() + + for { + p.RLock() + state := p.status + p.RUnlock() + if state != statusOpen { + return + } + + var ( + wg sync.WaitGroup + start = nowFn() + deadline = start.Add(interval + randStutter(p.healthCheckRand, stutter)) + ) + + p.RLock() + for i := int64(0); i < p.poolLen; i++ { + wg.Add(1) + go func(client rpc.TChanNode) { + defer wg.Done() + + var ( + attempts = p.opts.BackgroundHealthCheckFailLimit() + failed = 0 + checkErr error + ) + for j := 0; j < attempts; j++ { + if err := p.healthCheck(client, p.opts); err != nil { + checkErr = err + failed++ + throttleDuration := time.Duration(math.Max( + float64(time.Second), + p.opts.BackgroundHealthCheckFailThrottleFactor()* + float64(p.opts.HostConnectTimeout()))) + p.sleepHealthRetry(throttleDuration) + continue + } + // Healthy + break + } + + healthy := failed < attempts + if !healthy { + // Log health check error + log.Debug("health check failed", zap.String("host", p.host.Address()), zap.Error(checkErr)) + + // Swap with tail and decrement pool size + p.Lock() + if p.status != statusOpen { + p.Unlock() + return + } + var c conn + for j := int64(0); j < p.poolLen; j++ { + if client == p.pool[j].client { + c = p.pool[j] + p.pool[j] = p.pool[p.poolLen-1] + p.pool = p.pool[:p.poolLen-1] + p.poolLen = int64(len(p.pool)) + break + } + } + p.Unlock() + + // Close the client's channel + c.channel.Close() + } + }(p.pool[i].client) + } + p.RUnlock() + + wg.Wait() + + now := nowFn() + if !now.Before(deadline) { + // Exceeded deadline, start next health check loop + p.sleepHealth(0) // Call sleep 0 for tests to intercept this loop continuation + continue + } + + p.sleepHealth(deadline.Sub(now)) + } +} + +func healthCheck(client rpc.TChanNode, opts Options) error { + tctx, _ := thrift.NewContext(opts.HostConnectTimeout()) + result, err := client.Health(tctx) + if err != nil { + return err + } + if !result.Ok { + return fmt.Errorf("status not ok: %s", result.Status) + } + return nil +} + +func randStutter(source rand.Source, t time.Duration) time.Duration { + amount := float64(source.Int63()) / float64(math.MaxInt64) + return time.Duration(float64(t) * amount) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/consistency_level.go b/vendor/github.com/m3db/m3/src/dbnode/client/consistency_level.go new file mode 100644 index 00000000..45a41db6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/consistency_level.go @@ -0,0 +1,83 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/topology" +) + +// runtimeReadConsistencyLevel is a queryable value for a +// read consistency level, this supports it being able to change +// dynamically or it can be just static if not required to be changed +// during an operation. +type runtimeReadConsistencyLevel interface { + value() topology.ReadConsistencyLevel +} + +type staticRuntimeReadConsistencyLevel struct { + val topology.ReadConsistencyLevel +} + +func newStaticRuntimeReadConsistencyLevel( + value topology.ReadConsistencyLevel, +) runtimeReadConsistencyLevel { + return staticRuntimeReadConsistencyLevel{val: value} +} + +func (l staticRuntimeReadConsistencyLevel) value() topology.ReadConsistencyLevel { + return l.val +} + +// nolint: unused +type sessionReadRuntimeReadConsistencyLevel struct { + s *session +} + +// nolint: unused +func newSessionReadRuntimeReadConsistencyLevel( + s *session, +) runtimeReadConsistencyLevel { + return sessionReadRuntimeReadConsistencyLevel{s: s} +} + +func (l sessionReadRuntimeReadConsistencyLevel) value() topology.ReadConsistencyLevel { + l.s.state.RLock() + value := l.s.state.readLevel + l.s.state.RUnlock() + return value +} + +type sessionBootstrapRuntimeReadConsistencyLevel struct { + s *session +} + +func newSessionBootstrapRuntimeReadConsistencyLevel( + s *session, +) runtimeReadConsistencyLevel { + return sessionBootstrapRuntimeReadConsistencyLevel{s: s} +} + +func (l sessionBootstrapRuntimeReadConsistencyLevel) value() topology.ReadConsistencyLevel { + l.s.state.RLock() + value := l.s.state.bootstrapLevel + l.s.state.RUnlock() + return value +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/errors.go b/vendor/github.com/m3db/m3/src/dbnode/client/errors.go new file mode 100644 index 00000000..896f1998 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/errors.go @@ -0,0 +1,223 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "fmt" + "sync" + + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + tterrors "github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/errors" + xerrors "github.com/m3db/m3/src/x/errors" +) + +// IsInternalServerError determines if the error is an internal server error. +func IsInternalServerError(err error) bool { + for err != nil { + if e, ok := err.(*rpc.Error); ok && tterrors.IsInternalError(e) { + return true + } + err = xerrors.InnerError(err) + } + return false +} + +// IsBadRequestError determines if the error is a bad request error. +func IsBadRequestError(err error) bool { + for err != nil { + if e, ok := err.(*rpc.Error); ok && tterrors.IsBadRequestError(e) { + return true + } + if e := xerrors.GetInnerInvalidParamsError(err); e != nil { + return true + } + err = xerrors.InnerError(err) + } + return false +} + +// IsConsistencyResultError determines if the error is a consistency result error. +func IsConsistencyResultError(err error) bool { + _, ok := err.(consistencyResultErr) + return ok +} + +// NumResponded returns how many nodes responded for a given error +func NumResponded(err error) int { + for err != nil { + if e, ok := err.(consistencyResultError); ok { + return e.numResponded() + } + err = xerrors.InnerError(err) + } + return 0 +} + +// NumSuccess returns how many nodes responded with success for a given error +func NumSuccess(err error) int { + for err != nil { + if e, ok := err.(consistencyResultError); ok { + return e.numSuccess() + } + err = xerrors.InnerError(err) + } + return 0 +} + +// NumError returns how many nodes responded with error for a given error +func NumError(err error) int { + for err != nil { + if e, ok := err.(consistencyResultError); ok { + return e.numResponded() - + e.numSuccess() + } + err = xerrors.InnerError(err) + } + return 0 +} + +type hostNotAvailableError struct { + err error +} + +func (h hostNotAvailableError) Error() string { + return h.err.Error() +} + +func newHostNotAvailableError(err error) error { + return xerrors.NewNonRetryableError(hostNotAvailableError{err: err}) +} + +func isHostNotAvailableError(err error) bool { + inner := xerrors.GetInnerNonRetryableError(err) + if inner == nil { + return false + } + _, ok := inner.(hostNotAvailableError) + return ok +} + +type consistencyResultError interface { + error + + InnerError() error + numResponded() int + numSuccess() int +} + +type consistencyResultErr struct { + level fmt.Stringer + success int + enqueued int + responded int + topLevelErr error + errs []error +} + +func newConsistencyResultError( + level fmt.Stringer, + enqueued, responded int, + errs []error, +) consistencyResultError { + // NB(r): if any errors are bad request errors, encapsulate that error + // to ensure the error itself is wholly classified as a bad request error + var topLevelErr error + for i := 0; i < len(errs); i++ { + if topLevelErr == nil { + topLevelErr = errs[i] + continue + } + if IsBadRequestError(errs[i]) { + topLevelErr = errs[i] + break + } + } + return consistencyResultErr{ + level: level, + success: enqueued - len(errs), + enqueued: enqueued, + responded: responded, + topLevelErr: topLevelErr, + errs: append([]error(nil), errs...), + } +} + +func (e consistencyResultErr) InnerError() error { + return e.topLevelErr +} + +func (e consistencyResultErr) Error() string { + return fmt.Sprintf( + "failed to meet consistency level %s with %d/%d success, "+ + "%d nodes responded, errors: %v", + e.level.String(), e.success, e.enqueued, e.responded, e.errs) +} + +func (e consistencyResultErr) numResponded() int { + return e.responded +} + +func (e consistencyResultErr) numSuccess() int { + return e.success +} + +type syncAbortableErrorsMap struct { + sync.RWMutex + errors map[int]error + abortError error +} + +func newSyncAbortableErrorsMap() *syncAbortableErrorsMap { + return &syncAbortableErrorsMap{ + errors: make(map[int]error), + } +} + +func (e *syncAbortableErrorsMap) setError(idx int, err error) { + e.Lock() + e.errors[idx] = err + e.Unlock() +} + +func (e *syncAbortableErrorsMap) getErrors() []error { + var result []error + e.RLock() + for _, err := range e.errors { + if err == nil { + continue + } + result = append(result, err) + } + e.RUnlock() + return result +} + +func (e *syncAbortableErrorsMap) setAbortError(err error) { + e.Lock() + e.abortError = err + e.Unlock() +} +func (e *syncAbortableErrorsMap) getAbortError() error { + e.RLock() + result := e.abortError + e.RUnlock() + return result +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/fetch_attempt.go b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_attempt.go new file mode 100644 index 00000000..cb6b84c9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_attempt.go @@ -0,0 +1,101 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + xretry "github.com/m3db/m3/src/x/retry" +) + +var fetchAttemptArgsZeroed fetchAttemptArgs + +type fetchAttempt struct { + args fetchAttemptArgs + + result encoding.SeriesIterators + + session *session + + attemptFn xretry.Fn +} + +type fetchAttemptArgs struct { + namespace ident.ID + ids ident.Iterator + start time.Time + end time.Time +} + +func (f *fetchAttempt) reset() { + f.args = fetchAttemptArgsZeroed + f.result = nil +} + +func (f *fetchAttempt) perform() error { + result, err := f.session.fetchIDsAttempt(f.args.namespace, + f.args.ids, f.args.start, f.args.end) + f.result = result + + if IsBadRequestError(err) { + // Do not retry bad request errors + err = xerrors.NewNonRetryableError(err) + } + + return err +} + +type fetchAttemptPool struct { + pool pool.ObjectPool + session *session +} + +func newFetchAttemptPool( + session *session, + opts pool.ObjectPoolOptions, +) *fetchAttemptPool { + p := pool.NewObjectPool(opts) + return &fetchAttemptPool{pool: p, session: session} +} + +func (p *fetchAttemptPool) Init() { + p.pool.Init(func() interface{} { + w := &fetchAttempt{session: p.session} + // NB(r): Bind attemptFn once to avoid creating receiver + // and function method pointer over and over again + w.attemptFn = w.perform + w.reset() + return w + }) +} + +func (p *fetchAttemptPool) Get() *fetchAttempt { + return p.pool.Get().(*fetchAttempt) +} + +func (p *fetchAttemptPool) Put(f *fetchAttempt) { + f.reset() + p.pool.Put(f) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch.go b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch.go new file mode 100644 index 00000000..2b7d64ae --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch.go @@ -0,0 +1,154 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/pool" +) + +type fetchBatchOp struct { + checked.RefCount + request rpc.FetchBatchRawRequest + requestV2Elements []rpc.FetchBatchRawV2RequestElement + completionFns []completionFn + finalizer fetchBatchOpFinalizer +} + +func (f *fetchBatchOp) reset() { + f.IncWrites() + f.request.RangeStart = 0 + f.request.RangeEnd = 0 + f.request.NameSpace = nil + for i := range f.request.Ids { + f.request.Ids[i] = nil + } + f.request.Ids = f.request.Ids[:0] + for i := range f.completionFns { + f.completionFns[i] = nil + } + f.completionFns = f.completionFns[:0] + + for i := range f.requestV2Elements { + f.requestV2Elements[i].NameSpace = 0 + f.requestV2Elements[i].RangeStart = 0 + f.requestV2Elements[i].RangeEnd = 0 + f.requestV2Elements[i].ID = nil + f.requestV2Elements[i].RangeTimeType = 0 + } + f.requestV2Elements = f.requestV2Elements[:0] + + f.DecWrites() +} + +func (f *fetchBatchOp) append(namespace, id []byte, completionFn completionFn) { + f.IncWrites() + f.request.NameSpace = namespace + f.request.Ids = append(f.request.Ids, id) + f.requestV2Elements = append(f.requestV2Elements, rpc.FetchBatchRawV2RequestElement{ + // NameSpace filled in by the host queue later. + RangeStart: f.request.RangeStart, + RangeEnd: f.request.RangeEnd, + ID: id, + RangeTimeType: f.request.RangeTimeType, + }) + f.completionFns = append(f.completionFns, completionFn) + f.DecWrites() +} + +func (f *fetchBatchOp) Size() int { + f.IncReads() + value := len(f.request.Ids) + if value == 0 { + value = len(f.requestV2Elements) + } + f.DecReads() + return value +} + +func (f *fetchBatchOp) CompletionFn() completionFn { + return f.completeAll +} + +func (f *fetchBatchOp) completeAll(result interface{}, err error) { + for idx := range f.completionFns { + f.completionFns[idx](result, err) + } +} + +func (f *fetchBatchOp) complete(idx int, result interface{}, err error) { + f.IncReads() + fn := f.completionFns[idx] + f.DecReads() + fn(result, err) +} + +type fetchBatchOpFinalizer struct { + ref *fetchBatchOp + pool *fetchBatchOpPool +} + +func (f fetchBatchOpFinalizer) OnFinalize() { + f.pool.Put(f.ref) +} + +type fetchBatchOpPool struct { + pool pool.ObjectPool + capacity int +} + +func newFetchBatchOpPool(opts pool.ObjectPoolOptions, capacity int) *fetchBatchOpPool { + p := pool.NewObjectPool(opts) + return &fetchBatchOpPool{pool: p, capacity: capacity} +} + +func (p *fetchBatchOpPool) Init() { + p.pool.Init(func() interface{} { + f := &fetchBatchOp{} + f.request.Ids = make([][]byte, 0, p.capacity) + f.completionFns = make([]completionFn, 0, p.capacity) + f.finalizer.ref = f + f.finalizer.pool = p + f.SetOnFinalize(&f.finalizer) + + f.IncRef() + f.reset() + f.DecRef() + return f + }) +} + +func (p *fetchBatchOpPool) Get() *fetchBatchOp { + return p.pool.Get().(*fetchBatchOp) +} + +func (p *fetchBatchOpPool) Put(f *fetchBatchOp) { + f.IncRef() + if cap(f.request.Ids) != p.capacity || cap(f.completionFns) != p.capacity { + // Grew outside capacity, do not return to pool + f.DecRef() + return + } + f.reset() + f.DecRef() + p.pool.Put(f) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch_element_array_pool.go b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch_element_array_pool.go new file mode 100644 index 00000000..e3304090 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch_element_array_pool.go @@ -0,0 +1,67 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/pool" +) + +type fetchBatchRawV2RequestElementArrayPool interface { + // Init pool + Init() + + // Get an array of WriteBatchV2RawRequestElement objects + Get() []*rpc.FetchBatchRawV2RequestElement + + // Put an array of FetchBatchRawV2RequestElement objects + Put(w []*rpc.FetchBatchRawV2RequestElement) +} + +type poolOfFetchBatchRawV2RequestElementArray struct { + pool pool.ObjectPool + capacity int +} + +func newFetchBatchRawV2RequestElementArrayPool( + opts pool.ObjectPoolOptions, capacity int) fetchBatchRawV2RequestElementArrayPool { + + p := pool.NewObjectPool(opts) + return &poolOfFetchBatchRawV2RequestElementArray{p, capacity} +} + +func (p *poolOfFetchBatchRawV2RequestElementArray) Init() { + p.pool.Init(func() interface{} { + return make([]*rpc.FetchBatchRawV2RequestElement, 0, p.capacity) + }) +} + +func (p *poolOfFetchBatchRawV2RequestElementArray) Get() []*rpc.FetchBatchRawV2RequestElement { + return p.pool.Get().([]*rpc.FetchBatchRawV2RequestElement) +} + +func (p *poolOfFetchBatchRawV2RequestElementArray) Put(w []*rpc.FetchBatchRawV2RequestElement) { + for i := range w { + w[i] = nil + } + w = w[:0] + p.pool.Put(w) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch_pool.go b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch_pool.go new file mode 100644 index 00000000..77b4c65f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_batch_pool.go @@ -0,0 +1,65 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/pool" +) + +var ( + fetchBatchRawV2RequestZero rpc.FetchBatchRawV2Request +) + +type fetchBatchRawV2RequestPool interface { + // Init pool. + Init() + + // Get a write batch request. + Get() *rpc.FetchBatchRawV2Request + + // Put a write batch request. + Put(w *rpc.FetchBatchRawV2Request) +} + +type poolOfFetchBatchRawV2Request struct { + pool pool.ObjectPool +} + +func newFetchBatchRawV2RequestPool(opts pool.ObjectPoolOptions) fetchBatchRawV2RequestPool { + p := pool.NewObjectPool(opts) + return &poolOfFetchBatchRawV2Request{p} +} + +func (p *poolOfFetchBatchRawV2Request) Init() { + p.pool.Init(func() interface{} { + return &rpc.FetchBatchRawV2Request{} + }) +} + +func (p *poolOfFetchBatchRawV2Request) Get() *rpc.FetchBatchRawV2Request { + return p.pool.Get().(*rpc.FetchBatchRawV2Request) +} + +func (p *poolOfFetchBatchRawV2Request) Put(w *rpc.FetchBatchRawV2Request) { + *w = fetchBatchRawV2RequestZero + p.pool.Put(w) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/fetch_state.go b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_state.go new file mode 100644 index 00000000..c991e19d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_state.go @@ -0,0 +1,274 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "errors" + "fmt" + "sync" + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/storage/index" + "github.com/m3db/m3/src/dbnode/topology" + "github.com/m3db/m3/src/dbnode/x/xpool" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/serialize" +) + +type fetchStateType byte + +const ( + fetchTaggedFetchState fetchStateType = iota + aggregateFetchState +) + +const ( + maxUint = ^uint(0) + maxInt = int(maxUint >> 1) +) + +var ( + errFetchStateStillProcessing = errors.New("[invariant violated] fetch " + + "state is still processing, unable to create response") +) + +type fetchState struct { + sync.Cond + sync.Mutex + refCounter + + fetchTaggedOp *fetchTaggedOp + aggregateOp *aggregateOp + + nsID ident.ID + tagResultAccumulator fetchTaggedResultAccumulator + err error + + pool fetchStatePool + + // NB: stateType determines which type of op this fetchState + // is used for - fetchTagged or Aggregate. + stateType fetchStateType + + done bool +} + +func newFetchState(pool fetchStatePool) *fetchState { + f := &fetchState{ + tagResultAccumulator: newFetchTaggedResultAccumulator(), + pool: pool, + } + f.destructorFn = f.close // Set refCounter completion as close + f.L = f // Set the embedded condition locker to the embedded mutex + return f +} + +func (f *fetchState) close() { + if f.nsID != nil { + f.nsID.Finalize() + f.nsID = nil + } + if f.fetchTaggedOp != nil { + f.fetchTaggedOp.decRef() + f.fetchTaggedOp = nil + } + if f.aggregateOp != nil { + f.aggregateOp.decRef() + f.aggregateOp = nil + } + f.err = nil + f.done = false + f.tagResultAccumulator.Clear() + + if f.pool == nil { + return + } + f.pool.Put(f) +} + +func (f *fetchState) ResetFetchTagged( + startTime time.Time, + endTime time.Time, + op *fetchTaggedOp, topoMap topology.Map, + majority int, + consistencyLevel topology.ReadConsistencyLevel, +) { + op.incRef() // take a reference to the provided op + f.fetchTaggedOp = op + f.stateType = fetchTaggedFetchState + f.tagResultAccumulator.Reset(startTime, endTime, topoMap, majority, consistencyLevel) +} + +func (f *fetchState) ResetAggregate( + startTime time.Time, + endTime time.Time, + op *aggregateOp, topoMap topology.Map, + majority int, + consistencyLevel topology.ReadConsistencyLevel, +) { + op.incRef() // take a reference to the provided op + f.aggregateOp = op + f.stateType = aggregateFetchState + f.tagResultAccumulator.Reset(startTime, endTime, topoMap, majority, consistencyLevel) +} + +func (f *fetchState) completionFn( + result interface{}, + resultErr error, +) { + if IsBadRequestError(resultErr) { + // Wrap with invalid params and non-retryable so it is + // not retried. + resultErr = xerrors.NewInvalidParamsError(resultErr) + resultErr = xerrors.NewNonRetryableError(resultErr) + } + + f.Lock() + defer func() { + f.Unlock() + f.decRef() // release ref held onto by the hostQueue (via op.completionFn) + }() + + if f.done { + // i.e. we've already failed, no need to continue processing any additional + // responses we receive + return + } + + var ( + done bool + err error + ) + switch r := result.(type) { + case fetchTaggedResultAccumulatorOpts: + done, err = f.tagResultAccumulator.AddFetchTaggedResponse(r, resultErr) + case aggregateResultAccumulatorOpts: + done, err = f.tagResultAccumulator.AddAggregateResponse(r, resultErr) + default: + // should never happen + done = true + err = fmt.Errorf( + "[invariant violated] expected result to be one of %v, received: %v", + []string{"fetchTaggedResultAccumulatorOpts", "aggregateResultAccumulatorOpts"}, + result) + } + + if done { + f.markDoneWithLock(err) + } +} + +func (f *fetchState) markDoneWithLock(err error) { + f.done = true + f.err = err + f.Signal() +} + +func (f *fetchState) asTaggedIDsIterator( + pools fetchTaggedPools, +) (TaggedIDsIterator, FetchResponseMetadata, error) { + f.Lock() + defer f.Unlock() + + if expected := fetchTaggedFetchState; f.stateType != expected { + return nil, FetchResponseMetadata{}, + fmt.Errorf("unexpected fetch state: expected=%v, actual=%v", + expected, f.stateType) + } + + if !f.done { + return nil, FetchResponseMetadata{}, errFetchStateStillProcessing + } + + if err := f.err; err != nil { + return nil, FetchResponseMetadata{}, err + } + + limit := f.fetchTaggedOp.requestLimit(maxInt) + return f.tagResultAccumulator.AsTaggedIDsIterator(limit, pools) +} + +func (f *fetchState) asEncodingSeriesIterators( + pools fetchTaggedPools, + descr namespace.SchemaDescr, + opts index.IterationOptions, +) (encoding.SeriesIterators, FetchResponseMetadata, error) { + f.Lock() + defer f.Unlock() + + if expected := fetchTaggedFetchState; f.stateType != expected { + return nil, FetchResponseMetadata{}, + fmt.Errorf("unexpected fetch state: expected=%v, actual=%v", + expected, f.stateType) + } + + if !f.done { + return nil, FetchResponseMetadata{}, errFetchStateStillProcessing + } + + if err := f.err; err != nil { + return nil, FetchResponseMetadata{}, err + } + + limit := f.fetchTaggedOp.requestLimit(maxInt) + return f.tagResultAccumulator.AsEncodingSeriesIterators(limit, pools, descr, opts) +} + +func (f *fetchState) asAggregatedTagsIterator(pools fetchTaggedPools) (AggregatedTagsIterator, FetchResponseMetadata, error) { + f.Lock() + defer f.Unlock() + + if expected := aggregateFetchState; f.stateType != expected { + return nil, FetchResponseMetadata{}, + fmt.Errorf("unexpected fetch state: expected=%v, actual=%v", + expected, f.stateType) + } + + if !f.done { + return nil, FetchResponseMetadata{}, errFetchStateStillProcessing + } + + if err := f.err; err != nil { + return nil, FetchResponseMetadata{}, err + } + + limit := f.aggregateOp.requestLimit(maxInt) + return f.tagResultAccumulator.AsAggregatedTagsIterator(limit, pools) +} + +// NB(prateek): this is backed by the sessionPools struct, but we're restricting it to a narrow +// interface to force the fetchTagged code-paths to be explicit about the pools they need access +// to. The alternative is to either expose the sessionPools struct (which is a worse abstraction), +// or make a new concrete implemtation (which requires an extra alloc). Chosing the best of the +// three options and leaving as the interface below. +type fetchTaggedPools interface { + MultiReaderIteratorArray() encoding.MultiReaderIteratorArrayPool + MultiReaderIterator() encoding.MultiReaderIteratorPool + MutableSeriesIterators() encoding.MutableSeriesIteratorsPool + SeriesIterator() encoding.SeriesIteratorPool + CheckedBytesWrapper() xpool.CheckedBytesWrapperPool + ID() ident.Pool + ReaderSliceOfSlicesIterator() *readerSliceOfSlicesIteratorPool + TagDecoder() serialize.TagDecoderPool +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/fetch_state_pool.go b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_state_pool.go new file mode 100644 index 00000000..ef82a575 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_state_pool.go @@ -0,0 +1,53 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import "github.com/m3db/m3/src/x/pool" + +type fetchStatePool interface { + Init() + Get() *fetchState + Put(*fetchState) +} + +type fetchStatePoolImpl struct { + pool pool.ObjectPool +} + +func newFetchStatePool(opts pool.ObjectPoolOptions) fetchStatePool { + return &fetchStatePoolImpl{ + pool: pool.NewObjectPool(opts), + } +} + +func (p *fetchStatePoolImpl) Init() { + p.pool.Init(func() interface{} { + return newFetchState(p) + }) +} + +func (p *fetchStatePoolImpl) Get() *fetchState { + return p.pool.Get().(*fetchState) +} + +func (p *fetchStatePoolImpl) Put(f *fetchState) { + p.pool.Put(f) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_attempt.go b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_attempt.go new file mode 100644 index 00000000..98406ad9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_attempt.go @@ -0,0 +1,114 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/storage/index" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + xretry "github.com/m3db/m3/src/x/retry" +) + +var ( + fetchTaggedAttemptArgsZeroed fetchTaggedAttemptArgs +) + +type fetchTaggedAttempt struct { + args fetchTaggedAttemptArgs + session *session + + idsAttemptFn xretry.Fn + dataAttemptFn xretry.Fn + idsResultIter TaggedIDsIterator + dataResultIters encoding.SeriesIterators + idsResultMetadata FetchResponseMetadata + dataResultMetadata FetchResponseMetadata +} + +type fetchTaggedAttemptArgs struct { + ns ident.ID + query index.Query + opts index.QueryOptions +} + +func (f *fetchTaggedAttempt) reset() { + f.args = fetchTaggedAttemptArgsZeroed + + f.idsResultIter = nil + f.idsResultMetadata = FetchResponseMetadata{} + f.dataResultIters = nil + f.dataResultMetadata = FetchResponseMetadata{} +} + +func (f *fetchTaggedAttempt) performIDsAttempt() error { + var err error + f.idsResultIter, f.idsResultMetadata, err = f.session.fetchTaggedIDsAttempt( + f.args.ns, f.args.query, f.args.opts) + return err +} + +func (f *fetchTaggedAttempt) performDataAttempt() error { + var err error + f.dataResultIters, f.dataResultMetadata, err = f.session.fetchTaggedAttempt( + f.args.ns, f.args.query, f.args.opts) + return err +} + +type fetchTaggedAttemptPool interface { + Init() + Get() *fetchTaggedAttempt + Put(*fetchTaggedAttempt) +} + +type fetchTaggedAttemptPoolImpl struct { + pool pool.ObjectPool + session *session +} + +func newFetchTaggedAttemptPool( + session *session, + opts pool.ObjectPoolOptions, +) fetchTaggedAttemptPool { + p := pool.NewObjectPool(opts) + return &fetchTaggedAttemptPoolImpl{pool: p, session: session} +} + +func (p *fetchTaggedAttemptPoolImpl) Init() { + p.pool.Init(func() interface{} { + f := &fetchTaggedAttempt{session: p.session} + // NB(prateek): Bind fn once to avoid creating receiver + // and function method pointer over and over again + f.idsAttemptFn = f.performIDsAttempt + f.dataAttemptFn = f.performDataAttempt + f.reset() + return f + }) +} + +func (p *fetchTaggedAttemptPoolImpl) Get() *fetchTaggedAttempt { + return p.pool.Get().(*fetchTaggedAttempt) +} + +func (p *fetchTaggedAttemptPoolImpl) Put(f *fetchTaggedAttempt) { + f.reset() + p.pool.Put(f) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_op.go b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_op.go new file mode 100644 index 00000000..b9996da9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_op.go @@ -0,0 +1,100 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/pool" +) + +var ( + fetchTaggedOpRequestZeroed = rpc.FetchTaggedRequest{} +) + +type fetchTaggedOp struct { + refCounter + request rpc.FetchTaggedRequest + completionFn completionFn + + pool fetchTaggedOpPool +} + +func (f *fetchTaggedOp) Size() int { return 1 } +func (f *fetchTaggedOp) CompletionFn() completionFn { return f.completionFn } + +func (f *fetchTaggedOp) update(req rpc.FetchTaggedRequest, fn completionFn) { + f.request = req + f.completionFn = fn +} + +func (f *fetchTaggedOp) requestLimit(defaultValue int) int { + if f.request.Limit == nil { + return defaultValue + } + return int(*f.request.Limit) +} + +func (f *fetchTaggedOp) close() { + f.completionFn = nil + f.request = fetchTaggedOpRequestZeroed + // return to pool + if f.pool == nil { + return + } + f.pool.Put(f) +} + +func newFetchTaggedOp(p fetchTaggedOpPool) *fetchTaggedOp { + f := &fetchTaggedOp{pool: p} + f.destructorFn = f.close + return f +} + +type fetchTaggedOpPool interface { + Init() + Get() *fetchTaggedOp + Put(*fetchTaggedOp) +} + +type fetchTaggedOpPoolImpl struct { + pool pool.ObjectPool +} + +func newFetchTaggedOpPool( + opts pool.ObjectPoolOptions, +) fetchTaggedOpPool { + p := pool.NewObjectPool(opts) + return &fetchTaggedOpPoolImpl{pool: p} +} + +func (p *fetchTaggedOpPoolImpl) Init() { + p.pool.Init(func() interface{} { + return newFetchTaggedOp(p) + }) +} + +func (p *fetchTaggedOpPoolImpl) Get() *fetchTaggedOp { + return p.pool.Get().(*fetchTaggedOp) +} + +func (p *fetchTaggedOpPoolImpl) Put(f *fetchTaggedOp) { + p.pool.Put(f) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_results_accumulator.go b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_results_accumulator.go new file mode 100644 index 00000000..32f3b3aa --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_results_accumulator.go @@ -0,0 +1,613 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "bytes" + "fmt" + "sort" + "time" + + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/storage/index" + "github.com/m3db/m3/src/dbnode/topology" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + xtime "github.com/m3db/m3/src/x/time" +) + +type fetchTaggedResultAccumulatorOpts struct { + host topology.Host + response *rpc.FetchTaggedResult_ +} + +type aggregateResultAccumulatorOpts struct { + host topology.Host + response *rpc.AggregateQueryRawResult_ +} + +func newFetchTaggedResultAccumulator() fetchTaggedResultAccumulator { + accum := fetchTaggedResultAccumulator{ + calcTransport: &calcTransport{}, + } + accum.Clear() + return accum +} + +type fetchTaggedResultAccumulator struct { + // NB(prateek): a fetchTagged request requires we fan out to each shard in the + // topology. As a result, we track the response consistency per shard. + // Length of this slice == 1 + max shard id in topology + shardConsistencyResults []fetchTaggedShardConsistencyResult + numHostsPending int32 + numShardsPending int32 + + errors []error + fetchResponses fetchTaggedIDResults + aggResponses aggregateResults + exhaustive bool + + startTime time.Time + endTime time.Time + majority int + consistencyLevel topology.ReadConsistencyLevel + topoMap topology.Map + + calcTransport *calcTransport +} + +type fetchTaggedShardConsistencyResult struct { + enqueued int8 + success int8 + errors int8 + done bool +} + +type fetchTaggedResultAccumulatorStats struct { + exhaustive bool + responseReplicas int + responseBytesEstimate int +} + +func (rs fetchTaggedShardConsistencyResult) pending() int32 { + return int32(rs.enqueued - (rs.success + rs.errors)) +} + +func (accum *fetchTaggedResultAccumulator) AddFetchTaggedResponse( + opts fetchTaggedResultAccumulatorOpts, + resultErr error, +) (bool, error) { + if opts.response != nil && resultErr == nil { + accum.exhaustive = accum.exhaustive && opts.response.Exhaustive + for _, elem := range opts.response.Elements { + accum.fetchResponses = append(accum.fetchResponses, elem) + } + } + + // NB(r): Write the response to calculate transport to work out length. + opts.response.Write(accum.calcTransport) + + return accum.accumulatedResult(opts.host, resultErr) +} + +func (accum *fetchTaggedResultAccumulator) AddAggregateResponse( + opts aggregateResultAccumulatorOpts, + resultErr error, +) (bool, error) { + if opts.response != nil && resultErr == nil { + accum.exhaustive = accum.exhaustive && opts.response.Exhaustive + for _, elem := range opts.response.Results { + accum.aggResponses = append(accum.aggResponses, elem) + } + } + + // NB(r): Write the response to calculate transport to work out length. + opts.response.Write(accum.calcTransport) + + return accum.accumulatedResult(opts.host, resultErr) +} + +func (accum *fetchTaggedResultAccumulator) accumulatedResult( + host topology.Host, + resultErr error, +) (bool, error) { + if host == nil { + // should never happen, guarding against incompatible changes to the `client` package. + doneAccumulating := true + err := fmt.Errorf("[invariant violated] nil host in fetchState completionFn") + return doneAccumulating, xerrors.NewNonRetryableError(err) + } + + hostShardSet, ok := accum.topoMap.LookupHostShardSet(host.ID()) + if !ok { + // should never happen, as we've taken a reference to the + // topology when beginning the request, and the var is immutable. + doneAccumulating := true + err := fmt.Errorf( + "[invariant violated] missing host shard in fetchState completionFn: %s", host.ID()) + return doneAccumulating, xerrors.NewNonRetryableError(err) + } + + accum.numHostsPending-- + if resultErr != nil { + accum.errors = append(accum.errors, xerrors.NewRenamedError(resultErr, + fmt.Errorf("error fetching tagged from host %s: %v", host.ID(), resultErr))) + } + + // FOLLOWUP(prateek): once we transmit the shards successfully satisfied by a response, the + // for loop below needs to be updated to filter the `hostShardSet` to only include those + // in the response. More details in https://github.com/m3db/m3/src/dbnode/issues/550. + for _, hs := range hostShardSet.ShardSet().All() { + shardID := int(hs.ID()) + shardResult := accum.shardConsistencyResults[shardID] + if shardResult.done { + continue // already been marked done, don't need to do anything for this shard + } + + if hs.State() != shard.Available { + // Currently, we only accept responses from shard's which are available + // NB: as a possible enhancement, we could accept a response from + // a shard that's not available if we tracked response pairs from + // a LEAVING+INITIALIZING shard; this would help during node replaces. + shardResult.errors++ + } else if resultErr == nil { + shardResult.success++ + } else { + shardResult.errors++ + } + + pending := shardResult.pending() + if topology.ReadConsistencyTermination(accum.consistencyLevel, int32(accum.majority), pending, int32(shardResult.success)) { + shardResult.done = true + if topology.ReadConsistencyAchieved(accum.consistencyLevel, accum.majority, int(shardResult.enqueued), int(shardResult.success)) { + accum.numShardsPending-- + } + // NB(prateek): if !ReadConsistencyAchieved, we have sufficient information to fail the entire request, because we + // will never be able to satisfy the consistency requirement on the current shard. We explicitly chose not to, + // instead waiting till all the hosts return a response. This is to reduce the load we would put on the cluster + // due to retries. + } + + // update value in slice + accum.shardConsistencyResults[shardID] = shardResult + } + + // success case, sufficient responses for each shard + if accum.numShardsPending == 0 { + doneAccumulating := true + return doneAccumulating, nil + } + + // failure case - we've received all responses but still weren't able to satisfy + // all shards, so we need to fail + if accum.numHostsPending == 0 && accum.numShardsPending != 0 { + doneAccumulating := true + // NB(r): Use new renamed error to keep the underlying error + // (invalid/retryable) type. + err := fmt.Errorf("unable to satisfy consistency requirements: shards=%d, err=%v", + accum.numShardsPending, accum.errors) + for i := range accum.errors { + if IsBadRequestError(accum.errors[i]) { + err = xerrors.NewInvalidParamsError(err) + err = xerrors.NewNonRetryableError(err) + break + } + } + return doneAccumulating, err + } + + doneAccumulating := false + return doneAccumulating, nil +} + +func (accum *fetchTaggedResultAccumulator) Clear() { + for i := range accum.fetchResponses { + accum.fetchResponses[i] = nil + } + accum.fetchResponses = accum.fetchResponses[:0] + for i := range accum.aggResponses { + accum.aggResponses[i] = nil + } + accum.aggResponses = accum.aggResponses[:0] + for i := range accum.errors { + accum.errors[i] = nil + } + accum.errors = accum.errors[:0] + accum.shardConsistencyResults = accum.shardConsistencyResults[:0] + accum.consistencyLevel = topology.ReadConsistencyLevelNone + accum.majority, accum.numHostsPending, accum.numShardsPending = 0, 0, 0 + accum.startTime, accum.endTime = time.Time{}, time.Time{} + accum.topoMap = nil + accum.exhaustive = true + accum.calcTransport.Reset() +} + +func (accum *fetchTaggedResultAccumulator) Reset( + startTime time.Time, + endTime time.Time, + topoMap topology.Map, + majority int, + consistencyLevel topology.ReadConsistencyLevel, +) { + accum.exhaustive = true + accum.startTime = startTime + accum.endTime = endTime + accum.topoMap = topoMap + accum.majority = majority + accum.consistencyLevel = consistencyLevel + accum.numHostsPending = int32(topoMap.HostsLen()) + accum.numShardsPending = int32(len(topoMap.ShardSet().All())) + + // expand shardResults as much as necessary + targetLen := 1 + int(topoMap.ShardSet().Max()) + accum.shardConsistencyResults = fetchTaggedShardConsistencyResults( + accum.shardConsistencyResults).initialize(targetLen) + // initialize shardResults based on current topology + for _, hss := range topoMap.HostShardSets() { + for _, hShard := range hss.ShardSet().All() { + id := int(hShard.ID()) + accum.shardConsistencyResults[id].enqueued++ + } + } + + accum.calcTransport.Reset() +} + +func (accum *fetchTaggedResultAccumulator) sliceResponsesAsSeriesIter( + pools fetchTaggedPools, + elems fetchTaggedIDResults, + descr namespace.SchemaDescr, + opts index.IterationOptions, +) encoding.SeriesIterator { + numElems := len(elems) + iters := pools.MultiReaderIteratorArray().Get(numElems)[:numElems] + for idx, elem := range elems { + slicesIter := pools.ReaderSliceOfSlicesIterator().Get() + slicesIter.Reset(elem.Segments) + multiIter := pools.MultiReaderIterator().Get() + multiIter.ResetSliceOfSlices(slicesIter, descr) + iters[idx] = multiIter + } + + // pick the first element as they all have identical ids/tags + // NB: safe to assume this element exists as it's only called within + // a forEachID lambda, which provides the guarantee that len(elems) != 0 + elem := elems[0] + + encodedTags := pools.CheckedBytesWrapper().Get(elem.EncodedTags) + decoder := pools.TagDecoder().Get() + decoder.Reset(encodedTags) + + tsID := pools.CheckedBytesWrapper().Get(elem.ID) + nsID := pools.CheckedBytesWrapper().Get(elem.NameSpace) + seriesIter := pools.SeriesIterator().Get() + seriesIter.Reset(encoding.SeriesIteratorOptions{ + ID: pools.ID().BinaryID(tsID), + Namespace: pools.ID().BinaryID(nsID), + Tags: decoder, + StartInclusive: xtime.ToUnixNano(accum.startTime), + EndExclusive: xtime.ToUnixNano(accum.endTime), + Replicas: iters, + SeriesIteratorConsolidator: opts.SeriesIteratorConsolidator, + }) + + return seriesIter +} + +func (accum *fetchTaggedResultAccumulator) AsEncodingSeriesIterators( + limit int, pools fetchTaggedPools, + descr namespace.SchemaDescr, opts index.IterationOptions, +) (encoding.SeriesIterators, FetchResponseMetadata, error) { + results := fetchTaggedIDResultsSortedByID(accum.fetchResponses) + sort.Sort(results) + accum.fetchResponses = fetchTaggedIDResults(results) + + numElements := 0 + accum.fetchResponses.forEachID(func(_ fetchTaggedIDResults, _ bool) bool { + numElements++ + return numElements < limit + }) + + result := pools.MutableSeriesIterators().Get(numElements) + result.Reset(numElements) + count := 0 + moreElems := false + accum.fetchResponses.forEachID(func(elems fetchTaggedIDResults, hasMore bool) bool { + seriesIter := accum.sliceResponsesAsSeriesIter(pools, elems, descr, opts) + result.SetAt(count, seriesIter) + count++ + moreElems = hasMore + return count < limit + }) + + exhaustive := accum.exhaustive && count <= limit && !moreElems + return result, FetchResponseMetadata{ + Exhaustive: exhaustive, + Responses: len(accum.fetchResponses), + EstimateTotalBytes: accum.calcTransport.GetSize(), + }, nil +} + +func (accum *fetchTaggedResultAccumulator) AsTaggedIDsIterator( + limit int, + pools fetchTaggedPools, +) (TaggedIDsIterator, FetchResponseMetadata, error) { + var ( + iter = newTaggedIDsIterator(pools) + count = 0 + moreElems = false + ) + results := fetchTaggedIDResultsSortedByID(accum.fetchResponses) + sort.Sort(results) + accum.fetchResponses = fetchTaggedIDResults(results) + accum.fetchResponses.forEachID(func(elems fetchTaggedIDResults, hasMore bool) bool { + iter.addBacking(elems[0].NameSpace, elems[0].ID, elems[0].EncodedTags) + count++ + moreElems = hasMore + return count < limit + }) + + exhaustive := accum.exhaustive && count <= limit && !moreElems + return iter, FetchResponseMetadata{ + Exhaustive: exhaustive, + Responses: len(accum.aggResponses), + EstimateTotalBytes: accum.calcTransport.GetSize(), + }, nil +} + +func (accum *fetchTaggedResultAccumulator) AsAggregatedTagsIterator( + limit int, + pools fetchTaggedPools, +) (AggregatedTagsIterator, FetchResponseMetadata, error) { + var ( + iter = newAggregateTagsIterator(pools) + count = 0 + moreElems = false + ) + results := aggregateResultsSortedByTag(accum.aggResponses) + sort.Sort(results) + + var tempValues []ident.ID + + accum.aggResponses = aggregateResults(results) + accum.aggResponses.forEachTag(func(elems aggregateResults, hasMore bool) bool { + // NB(r): Guaranteed to only get called for results that actually have tags. + tagResult := iter.addTag(elems[0].TagName) + + for _, tagResponse := range elems { + // Sort values before adding to final result. + values := aggregateValueResultsSortedByValue(tagResponse.TagValues) + sort.Sort(values) + + if len(tagResult.tagValues) == 0 { + // If first response with values from host then add in order blindly. + for _, tagValueResponse := range values { + elem := ident.BytesID(tagValueResponse.TagValue) + tagResult.tagValues = append(tagResult.tagValues, elem) + count++ + } + continue + } + + // Otherwise add in order and deduplicate. + if tempValues == nil { + tempValues = make([]ident.ID, 0, len(tagResult.tagValues)) + } + tempValues = tempValues[:0] + + lastValueIdx := 0 + addRemaining := false + nextLastValue := func() { + lastValueIdx++ + if lastValueIdx >= len(tagResult.tagValues) { + // None left to compare against, just blindly add the remaining. + addRemaining = true + } + } + + for i := 0; i < len(values); i++ { + tagValueResponse := values[i] + currValue := ident.BytesID(tagValueResponse.TagValue) + if addRemaining { + // Just add remaining values. + elem := ident.BytesID(tagValueResponse.TagValue) + tempValues = append(tempValues, elem) + count++ + continue + } + + existingValue := tagResult.tagValues[lastValueIdx] + cmp := bytes.Compare(currValue.Bytes(), existingValue.Bytes()) + for !addRemaining && cmp > 0 { + // Take the existing value + tempValues = append(tempValues, existingValue) + + // Move to next record + nextLastValue() + if addRemaining { + // None left to compare against, just blindly add the remaining. + break + } + + // Re-run check + existingValue = tagResult.tagValues[lastValueIdx] + cmp = bytes.Compare(currValue.Bytes(), existingValue.Bytes()) + } + if addRemaining { + // Reprocess this element + i-- + continue + } + + if cmp == 0 { + // Take existing record, skip this copy + tempValues = append(tempValues, existingValue) + nextLastValue() + continue + } + + // This record must come before any existing value, take and move to next + tempValues = append(tempValues, currValue) + } + + // Copy out of temp values back to final result + tagResult.tagValues = append(tagResult.tagValues[:0], tempValues...) + } + + moreElems = hasMore + return count < limit + }) + + exhaustive := accum.exhaustive && count <= limit && !moreElems + return iter, FetchResponseMetadata{ + Exhaustive: exhaustive, + Responses: len(accum.aggResponses), + EstimateTotalBytes: accum.calcTransport.GetSize(), + }, nil +} + +type fetchTaggedShardConsistencyResults []fetchTaggedShardConsistencyResult + +func (res fetchTaggedShardConsistencyResults) initialize(length int) fetchTaggedShardConsistencyResults { + if cap(res) < length { + res = make(fetchTaggedShardConsistencyResults, length) + } + res = res[:length] + // following compiler optimized memcpy impl: + // https://github.com/golang/go/wiki/CompilerOptimizations#optimized-memclr + for i := range res { + res[i] = fetchTaggedShardConsistencyResult{} + } + return res +} + +type fetchTaggedIDResults []*rpc.FetchTaggedIDResult_ + +// lambda to iterate over fetchTagged responses a single id at a time, `hasMore` indicates +// if there are more results to iterate after the current batch of elements, the returned +// bool indicates if the iteration should be continued past the curent batch. +type forEachFetchTaggedIDFn func(responsesForSingleID fetchTaggedIDResults, hasMore bool) (continueIterating bool) + +// forEachID iterates over the provide results, and calls `fn` on each +// group of responses with the same ID. +// NB: assumes the results array being operated upon has been sorted. +func (results fetchTaggedIDResults) forEachID(fn forEachFetchTaggedIDFn) { + var ( + startIdx = 0 + lastID []byte + ) + for i := 0; i < len(results); i++ { + elem := results[i] + if !bytes.Equal(elem.ID, lastID) { + lastID = elem.ID + // We only want to call the the forEachID fn once we have calculated the entire group, + // i.e. once we have gone past the last element for a given ID, but the first element + // in the results slice is a special case because we are always starting a new group + // at that point. + if i == 0 { + continue + } + continueIterating := fn(results[startIdx:i], i < len(results)) + if !continueIterating { + return + } + startIdx = i + } + } + // spill over + if startIdx < len(results) { + fn(results[startIdx:], false) + } +} + +// fetchTaggedIDResultsSortedByID implements sort.Interface for fetchTaggedIDResults +// based on the ID field. +type fetchTaggedIDResultsSortedByID fetchTaggedIDResults + +func (a fetchTaggedIDResultsSortedByID) Len() int { return len(a) } +func (a fetchTaggedIDResultsSortedByID) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a fetchTaggedIDResultsSortedByID) Less(i, j int) bool { + return bytes.Compare(a[i].ID, a[j].ID) < 0 +} + +type aggregateResults []*rpc.AggregateQueryRawResultTagNameElement + +type aggregateValueResults []*rpc.AggregateQueryRawResultTagValueElement + +// lambda to iterate over aggregate tag responses a single tag at a time, `hasMore` indicates +// if there are more results to iterate after the current batch of elements, the returned +// bool indicates if the iteration should be continued past the curent batch. +type forEachAggregateFn func(responsesForSingleTag aggregateResults, hasMore bool) (continueIterating bool) + +// forEachTag iterates over the provide results, and calls `fn` on each +// group of responses with the same TagName. +// NB: assumes the results array being operated upon has been sorted. +func (results aggregateResults) forEachTag(fn forEachAggregateFn) { + var ( + startIdx = 0 + lastTagName []byte + ) + for i := 0; i < len(results); i++ { + elem := results[i] + if !bytes.Equal(elem.TagName, lastTagName) { + lastTagName = elem.TagName + // We only want to call the the forEachID fn once we have calculated the entire group, + // i.e. once we have gone past the last element for a given ID, but the first element + // in the results slice is a special case because we are always starting a new group + // at that point. + if i == 0 { + continue + } + continueIterating := fn(results[startIdx:i], i < len(results)) + if !continueIterating { + return + } + startIdx = i + } + } + // spill over + if startIdx < len(results) { + fn(results[startIdx:], false) + } +} + +// aggregateResultsSortedByTag implements sort.Interface for aggregateResults +// based on the TagName field. +type aggregateResultsSortedByTag aggregateResults + +func (a aggregateResultsSortedByTag) Len() int { return len(a) } +func (a aggregateResultsSortedByTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a aggregateResultsSortedByTag) Less(i, j int) bool { + return bytes.Compare(a[i].TagName, a[j].TagName) < 0 +} + +// aggregateValueResultsSortedByValue implements sort.Interface for aggregateValueResults +// based on the TagValue field. +type aggregateValueResultsSortedByValue aggregateValueResults + +func (a aggregateValueResultsSortedByValue) Len() int { return len(a) } +func (a aggregateValueResultsSortedByValue) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a aggregateValueResultsSortedByValue) Less(i, j int) bool { + return bytes.Compare(a[i].TagValue, a[j].TagValue) < 0 +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_results_index_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_results_index_iterator.go new file mode 100644 index 00000000..e903d771 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/fetch_tagged_results_index_iterator.go @@ -0,0 +1,120 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/serialize" +) + +// FOLLOWUP(prateek): add pooling for taggedIDsIterator(s). +type taggedIDsIterator struct { + currentIdx int + err error + pools fetchTaggedPools + + current struct { + nsID ident.ID + tsID ident.ID + tags serialize.TagDecoder + } + + backing struct { + nses [][]byte + ids [][]byte + tags [][]byte + } +} + +// make the compiler ensure the concrete type `&taggedIDsIterator{}` implements +// the `TaggedIDsIterator` interface. +var _ TaggedIDsIterator = &taggedIDsIterator{} + +func newTaggedIDsIterator(pools fetchTaggedPools) *taggedIDsIterator { + return &taggedIDsIterator{ + currentIdx: -1, + pools: pools, + } +} + +func (i *taggedIDsIterator) Next() bool { + if i.err != nil || i.currentIdx >= len(i.backing.ids) { + return false + } + i.release() + i.currentIdx++ + if i.currentIdx >= len(i.backing.ids) { + return false + } + + dec := i.pools.TagDecoder().Get() + wb := i.pools.CheckedBytesWrapper().Get(i.backing.tags[i.currentIdx]) + dec.Reset(wb) + + i.current.tsID = ident.BytesID(i.backing.ids[i.currentIdx]) + i.current.nsID = ident.BytesID(i.backing.nses[i.currentIdx]) + i.current.tags = dec + return true +} + +func (i *taggedIDsIterator) Remaining() int { + at := i.currentIdx + if at < 0 { + at = 0 + } + return len(i.backing.ids) - at +} + +func (i *taggedIDsIterator) addBacking(nsID, tsID, tags []byte) { + i.backing.nses = append(i.backing.nses, nsID) + i.backing.ids = append(i.backing.ids, tsID) + i.backing.tags = append(i.backing.tags, tags) +} + +func (i *taggedIDsIterator) Finalize() { + i.release() + i.backing.nses = nil + i.backing.ids = nil + i.backing.tags = nil +} + +func (i *taggedIDsIterator) release() { + if id := i.current.nsID; id != nil { + id.Finalize() + i.current.nsID = nil + } + if id := i.current.tsID; id != nil { + id.Finalize() + i.current.tsID = nil + } + if decoder := i.current.tags; decoder != nil { + decoder.Close() + i.current.tags = nil + } +} + +func (i *taggedIDsIterator) Current() (ident.ID, ident.ID, ident.TagIterator) { + return i.current.nsID, i.current.tsID, i.current.tags +} + +func (i *taggedIDsIterator) Err() error { + return i.err +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/host_queue.go b/vendor/github.com/m3db/m3/src/dbnode/client/host_queue.go new file mode 100644 index 00000000..64ac9bf3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/host_queue.go @@ -0,0 +1,1167 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "bytes" + "fmt" + "math" + "sync" + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/dbnode/topology" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + xsync "github.com/m3db/m3/src/x/sync" + + "github.com/uber-go/tally" + "github.com/uber/tchannel-go/thrift" +) + +const workerPoolKillProbability = 0.01 + +type queue struct { + sync.WaitGroup + sync.RWMutex + + opts Options + nowFn clock.NowFn + host topology.Host + connPool connectionPool + writeBatchRawRequestPool writeBatchRawRequestPool + writeBatchRawV2RequestPool writeBatchRawV2RequestPool + writeBatchRawRequestElementArrayPool writeBatchRawRequestElementArrayPool + writeBatchRawV2RequestElementArrayPool writeBatchRawV2RequestElementArrayPool + writeTaggedBatchRawRequestPool writeTaggedBatchRawRequestPool + writeTaggedBatchRawV2RequestPool writeTaggedBatchRawV2RequestPool + writeTaggedBatchRawRequestElementArrayPool writeTaggedBatchRawRequestElementArrayPool + writeTaggedBatchRawV2RequestElementArrayPool writeTaggedBatchRawV2RequestElementArrayPool + fetchBatchRawV2RequestPool fetchBatchRawV2RequestPool + fetchBatchRawV2RequestElementArrayPool fetchBatchRawV2RequestElementArrayPool + workerPool xsync.PooledWorkerPool + size int + ops []op + opsSumSize int + opsLastRotatedAt time.Time + opsArrayPool *opArrayPool + drainIn chan []op + writeOpBatchSize tally.Histogram + fetchOpBatchSize tally.Histogram + status status + serverSupportsV2APIs bool +} + +func newHostQueue( + host topology.Host, + hostQueueOpts hostQueueOpts, +) (hostQueue, error) { + var ( + opts = hostQueueOpts.opts + iOpts = opts.InstrumentOptions() + scopeWithoutHostID = iOpts.MetricsScope().SubScope("hostqueue") + scope = scopeWithoutHostID.Tagged(map[string]string{ + "hostID": host.ID(), + }) + ) + iOpts = iOpts.SetMetricsScope(scope) + + writeOpBatchSizeBuckets, err := tally.ExponentialValueBuckets(1, 2, 15) + if err != nil { + return nil, err + } + writeOpBatchSizeBuckets = append(tally.ValueBuckets{0}, writeOpBatchSizeBuckets...) + + fetchOpBatchSizeBuckets, err := tally.ExponentialValueBuckets(1, 2, 15) + if err != nil { + return nil, err + } + fetchOpBatchSizeBuckets = append(tally.ValueBuckets{0}, fetchOpBatchSizeBuckets...) + + workerPoolOpts := xsync.NewPooledWorkerPoolOptions(). + SetGrowOnDemand(true). + SetKillWorkerProbability(workerPoolKillProbability). + SetInstrumentOptions(iOpts) + workerPool, err := xsync.NewPooledWorkerPool( + int(workerPoolOpts.NumShards()), + workerPoolOpts, + ) + if err != nil { + return nil, err + } + workerPool.Init() + + opts = opts.SetInstrumentOptions(opts.InstrumentOptions().SetMetricsScope(scope)) + + size := opts.HostQueueOpsFlushSize() + + opsArraysLen := opts.HostQueueOpsArrayPoolSize() + opArrayPoolOpts := pool.NewObjectPoolOptions(). + SetSize(opsArraysLen). + SetInstrumentOptions(opts.InstrumentOptions().SetMetricsScope( + scope.SubScope("op-array-pool"), + )) + opArrayPoolCapacity := int(math.Max(float64(size), float64(opts.WriteBatchSize()))) + opArrayPool := newOpArrayPool(opArrayPoolOpts, opArrayPoolCapacity) + opArrayPool.Init() + + return &queue{ + opts: opts, + nowFn: opts.ClockOptions().NowFn(), + host: host, + connPool: newConnectionPool(host, opts), + writeBatchRawRequestPool: hostQueueOpts.writeBatchRawRequestPool, + writeBatchRawV2RequestPool: hostQueueOpts.writeBatchRawV2RequestPool, + writeBatchRawRequestElementArrayPool: hostQueueOpts.writeBatchRawRequestElementArrayPool, + writeBatchRawV2RequestElementArrayPool: hostQueueOpts.writeBatchRawV2RequestElementArrayPool, + writeTaggedBatchRawRequestPool: hostQueueOpts.writeTaggedBatchRawRequestPool, + writeTaggedBatchRawV2RequestPool: hostQueueOpts.writeTaggedBatchRawV2RequestPool, + writeTaggedBatchRawRequestElementArrayPool: hostQueueOpts.writeTaggedBatchRawRequestElementArrayPool, + writeTaggedBatchRawV2RequestElementArrayPool: hostQueueOpts.writeTaggedBatchRawV2RequestElementArrayPool, + fetchBatchRawV2RequestPool: hostQueueOpts.fetchBatchRawV2RequestPool, + fetchBatchRawV2RequestElementArrayPool: hostQueueOpts.fetchBatchRawV2RequestElementArrayPool, + workerPool: workerPool, + size: size, + ops: opArrayPool.Get(), + opsArrayPool: opArrayPool, + writeOpBatchSize: scopeWithoutHostID.Histogram("write-op-batch-size", writeOpBatchSizeBuckets), + fetchOpBatchSize: scopeWithoutHostID.Histogram("fetch-op-batch-size", fetchOpBatchSizeBuckets), + drainIn: make(chan []op, opsArraysLen), + serverSupportsV2APIs: opts.UseV2BatchAPIs(), + }, nil +} + +func (q *queue) Open() { + q.Lock() + defer q.Unlock() + + if q.status != statusNotOpen { + return + } + + q.status = statusOpen + + // Open the connection pool + q.connPool.Open() + + // Continually drain the queue until closed + go q.drain() + + flushInterval := q.opts.HostQueueOpsFlushInterval() + if flushInterval > 0 { + // Continually flush the queue at given interval if set + go q.flushEvery(flushInterval) + } +} + +func (q *queue) flushEvery(interval time.Duration) { + // sleepForOverride used change the next sleep based on last ops rotation + var sleepForOverride time.Duration + for { + sleepFor := interval + if sleepForOverride > 0 { + sleepFor = sleepForOverride + sleepForOverride = 0 + } + + time.Sleep(sleepFor) + + q.RLock() + if q.status != statusOpen { + q.RUnlock() + return + } + lastRotateAt := q.opsLastRotatedAt + q.RUnlock() + + sinceLastRotate := q.nowFn().Sub(lastRotateAt) + if sinceLastRotate < interval { + // Rotated already recently, sleep until we would next consider flushing + sleepForOverride = interval - sinceLastRotate + continue + } + + q.Lock() + if q.status != statusOpen { + q.Unlock() + return + } + needsDrain := q.rotateOpsWithLock() + // Need to hold lock while writing to the drainIn + // channel to ensure it has not been closed + if len(needsDrain) != 0 { + q.drainIn <- needsDrain + } + q.Unlock() + } +} + +func (q *queue) rotateOpsWithLock() []op { + if q.opsSumSize == 0 { + // No need to rotate as queue is empty + return nil + } + + needsDrain := q.ops + + // Reset ops + q.ops = q.opsArrayPool.Get() + q.opsSumSize = 0 + q.opsLastRotatedAt = q.nowFn() + + return needsDrain +} + +func (q *queue) drain() { + var ( + currV2WriteReq *rpc.WriteBatchRawV2Request + currV2WriteOps []op + + currV2WriteTaggedReq *rpc.WriteTaggedBatchRawV2Request + currV2WriteTaggedOps []op + + currWriteOpsByNamespace namespaceWriteBatchOpsSlice + currTaggedWriteOpsByNamespace namespaceWriteTaggedBatchOpsSlice + + currV2FetchBatchRawReq *rpc.FetchBatchRawV2Request + currV2FetchBatchRawOps []op + ) + + for ops := range q.drainIn { + opsLen := len(ops) + for i := 0; i < opsLen; i++ { + switch v := ops[i].(type) { + case *writeOperation: + if q.serverSupportsV2APIs { + currV2WriteReq, currV2WriteOps = q.drainWriteOpV2(v, currV2WriteReq, currV2WriteOps, ops[i]) + } else { + currWriteOpsByNamespace = q.drainWriteOpV1(v, currWriteOpsByNamespace, ops[i]) + } + case *writeTaggedOperation: + if q.serverSupportsV2APIs { + currV2WriteTaggedReq, currV2WriteTaggedOps = q.drainTaggedWriteOpV2(v, currV2WriteTaggedReq, currV2WriteTaggedOps, ops[i]) + } else { + currTaggedWriteOpsByNamespace = q.drainTaggedWriteOpV1(v, currTaggedWriteOpsByNamespace, ops[i]) + } + case *fetchBatchOp: + if q.serverSupportsV2APIs { + currV2FetchBatchRawReq, currV2FetchBatchRawOps = q.drainFetchBatchRawV2Op(v, currV2FetchBatchRawReq, currV2FetchBatchRawOps, ops[i]) + } else { + q.asyncFetch(v) + } + case *fetchTaggedOp: + q.asyncFetchTagged(v) + case *aggregateOp: + q.asyncAggregate(v) + case *truncateOp: + q.asyncTruncate(v) + default: + completionFn := ops[i].CompletionFn() + completionFn(nil, errQueueUnknownOperation(q.host.ID())) + } + } + + // If any outstanding write ops, async write. + for i, writeOps := range currWriteOpsByNamespace { + if len(writeOps.ops) > 0 { + q.asyncWrite(writeOps.namespace, writeOps.ops, + writeOps.elems) + } + // Zero the element + currWriteOpsByNamespace[i] = namespaceWriteBatchOps{} + } + // Reset the slice + currWriteOpsByNamespace = currWriteOpsByNamespace[:0] + if currV2WriteReq != nil { + q.asyncWriteV2(currV2WriteOps, currV2WriteReq) + currV2WriteReq = nil + currV2WriteOps = nil + } + + // If any outstanding tagged write ops, async write + for i, writeOps := range currTaggedWriteOpsByNamespace { + if len(writeOps.ops) > 0 { + q.asyncTaggedWrite(writeOps.namespace, writeOps.ops, + writeOps.elems) + } + // Zero the element + currTaggedWriteOpsByNamespace[i] = namespaceWriteTaggedBatchOps{} + } + // If any outstanding fetches, fetch. + if currV2FetchBatchRawReq != nil { + q.asyncFetchV2(currV2FetchBatchRawOps, currV2FetchBatchRawReq) + currV2FetchBatchRawOps = nil + currV2FetchBatchRawReq = nil + } + + // Reset the slice + currTaggedWriteOpsByNamespace = currTaggedWriteOpsByNamespace[:0] + if currV2WriteTaggedReq != nil { + q.asyncTaggedWriteV2(currV2WriteTaggedOps, currV2WriteTaggedReq) + currV2WriteTaggedReq = nil + currV2WriteTaggedOps = nil + } + + if ops != nil { + q.opsArrayPool.Put(ops) + } + } + + // Close the connection pool after all requests done + q.Wait() + q.connPool.Close() +} + +func (q *queue) drainWriteOpV1( + v *writeOperation, + currWriteOpsByNamespace namespaceWriteBatchOpsSlice, + op op, +) namespaceWriteBatchOpsSlice { + namespace := v.namespace + idx := currWriteOpsByNamespace.indexOf(namespace) + if idx == -1 { + value := namespaceWriteBatchOps{ + namespace: namespace, + opsArrayPool: q.opsArrayPool, + writeBatchRawRequestElementArrayPool: q.writeBatchRawRequestElementArrayPool, + } + idx = len(currWriteOpsByNamespace) + currWriteOpsByNamespace = append(currWriteOpsByNamespace, value) + } + + currWriteOpsByNamespace.appendAt(idx, op, &v.request) + + if currWriteOpsByNamespace.lenAt(idx) == q.opts.WriteBatchSize() { + // Reached write batch limit, write async and reset. + q.asyncWrite(namespace, currWriteOpsByNamespace[idx].ops, + currWriteOpsByNamespace[idx].elems) + currWriteOpsByNamespace.resetAt(idx) + } + + return currWriteOpsByNamespace +} + +func (q *queue) drainTaggedWriteOpV1( + v *writeTaggedOperation, + currTaggedWriteOpsByNamespace namespaceWriteTaggedBatchOpsSlice, + op op, +) namespaceWriteTaggedBatchOpsSlice { + namespace := v.namespace + idx := currTaggedWriteOpsByNamespace.indexOf(namespace) + if idx == -1 { + value := namespaceWriteTaggedBatchOps{ + namespace: namespace, + opsArrayPool: q.opsArrayPool, + writeTaggedBatchRawRequestElementArrayPool: q.writeTaggedBatchRawRequestElementArrayPool, + } + idx = len(currTaggedWriteOpsByNamespace) + currTaggedWriteOpsByNamespace = append(currTaggedWriteOpsByNamespace, value) + } + + currTaggedWriteOpsByNamespace.appendAt(idx, op, &v.request) + + if currTaggedWriteOpsByNamespace.lenAt(idx) == q.opts.WriteBatchSize() { + // Reached write batch limit, write async and reset + q.asyncTaggedWrite(namespace, currTaggedWriteOpsByNamespace[idx].ops, + currTaggedWriteOpsByNamespace[idx].elems) + currTaggedWriteOpsByNamespace.resetAt(idx) + } + + return currTaggedWriteOpsByNamespace +} + +func (q *queue) drainWriteOpV2( + v *writeOperation, + currV2WriteReq *rpc.WriteBatchRawV2Request, + currV2WriteOps []op, + op op, +) (*rpc.WriteBatchRawV2Request, []op) { + namespace := v.namespace + if currV2WriteReq == nil { + currV2WriteReq = q.writeBatchRawV2RequestPool.Get() + currV2WriteReq.Elements = q.writeBatchRawV2RequestElementArrayPool.Get() + } + + nsIdx := -1 + for i, ns := range currV2WriteReq.NameSpaces { + if bytes.Equal(namespace.Bytes(), ns) { + nsIdx = i + break + } + } + if nsIdx == -1 { + currV2WriteReq.NameSpaces = append(currV2WriteReq.NameSpaces, namespace.Bytes()) + nsIdx = len(currV2WriteReq.NameSpaces) - 1 + } + + // Copy the request because operations are shared across multiple host queues so mutating + // them directly is racey. + // TODO(rartoul): Consider adding a pool for this. + requestCopy := v.requestV2 + requestCopy.NameSpace = int64(nsIdx) + currV2WriteReq.Elements = append(currV2WriteReq.Elements, &requestCopy) + currV2WriteOps = append(currV2WriteOps, op) + if len(currV2WriteReq.Elements) == q.opts.WriteBatchSize() { + // Reached write batch limit, write async and reset. + q.asyncWriteV2(currV2WriteOps, currV2WriteReq) + currV2WriteReq = nil + currV2WriteOps = nil + } + + return currV2WriteReq, currV2WriteOps +} + +func (q *queue) drainTaggedWriteOpV2( + v *writeTaggedOperation, + currV2WriteTaggedReq *rpc.WriteTaggedBatchRawV2Request, + currV2WriteTaggedOps []op, + op op, +) (*rpc.WriteTaggedBatchRawV2Request, []op) { + namespace := v.namespace + if currV2WriteTaggedReq == nil { + currV2WriteTaggedReq = q.writeTaggedBatchRawV2RequestPool.Get() + currV2WriteTaggedReq.Elements = q.writeTaggedBatchRawV2RequestElementArrayPool.Get() + } + + nsIdx := -1 + for i, ns := range currV2WriteTaggedReq.NameSpaces { + if bytes.Equal(namespace.Bytes(), ns) { + nsIdx = i + break + } + } + if nsIdx == -1 { + currV2WriteTaggedReq.NameSpaces = append(currV2WriteTaggedReq.NameSpaces, namespace.Bytes()) + nsIdx = len(currV2WriteTaggedReq.NameSpaces) - 1 + } + + // Copy the request because operations are shared across multiple host queues so mutating + // them directly is racey. + // TODO(rartoul): Consider adding a pool for this. + requestCopy := v.requestV2 + requestCopy.NameSpace = int64(nsIdx) + currV2WriteTaggedReq.Elements = append(currV2WriteTaggedReq.Elements, &requestCopy) + currV2WriteTaggedOps = append(currV2WriteTaggedOps, op) + if len(currV2WriteTaggedReq.Elements) == q.opts.WriteBatchSize() { + // Reached write batch limit, write async and reset. + q.asyncTaggedWriteV2(currV2WriteTaggedOps, currV2WriteTaggedReq) + currV2WriteTaggedReq = nil + currV2WriteTaggedOps = nil + } + + return currV2WriteTaggedReq, currV2WriteTaggedOps +} + +func (q *queue) drainFetchBatchRawV2Op( + v *fetchBatchOp, + currV2FetchBatchRawReq *rpc.FetchBatchRawV2Request, + currV2FetchBatchRawOps []op, + op op, +) (*rpc.FetchBatchRawV2Request, []op) { + namespace := v.request.NameSpace + if currV2FetchBatchRawReq == nil { + currV2FetchBatchRawReq = q.fetchBatchRawV2RequestPool.Get() + currV2FetchBatchRawReq.Elements = q.fetchBatchRawV2RequestElementArrayPool.Get() + } + + nsIdx := -1 + for i, ns := range currV2FetchBatchRawReq.NameSpaces { + if bytes.Equal(namespace, ns) { + nsIdx = i + break + } + } + if nsIdx == -1 { + currV2FetchBatchRawReq.NameSpaces = append(currV2FetchBatchRawReq.NameSpaces, namespace) + nsIdx = len(currV2FetchBatchRawReq.NameSpaces) - 1 + } + for i := range v.requestV2Elements { + // Each host queue gets its own fetchBatchOp so mutating the NameSpace field here is safe. + v.requestV2Elements[i].NameSpace = int64(nsIdx) + currV2FetchBatchRawReq.Elements = append(currV2FetchBatchRawReq.Elements, &v.requestV2Elements[i]) + } + currV2FetchBatchRawOps = append(currV2FetchBatchRawOps, op) + // This logic means that in practice we may sometimes exceed the fetch batch size by a factor of 2 + // but that's ok since it does not need to be exact. + if len(currV2FetchBatchRawReq.Elements) >= q.opts.FetchBatchSize() { + q.asyncFetchV2(currV2FetchBatchRawOps, currV2FetchBatchRawReq) + currV2FetchBatchRawReq = nil + currV2FetchBatchRawOps = nil + } + + return currV2FetchBatchRawReq, currV2FetchBatchRawOps +} + +func (q *queue) asyncTaggedWrite( + namespace ident.ID, + ops []op, + elems []*rpc.WriteTaggedBatchRawRequestElement, +) { + q.writeOpBatchSize.RecordValue(float64(len(elems))) + q.Add(1) + + q.workerPool.Go(func() { + req := q.writeTaggedBatchRawRequestPool.Get() + req.NameSpace = namespace.Bytes() + req.Elements = elems + + // NB(r): Defer is slow in the hot path unfortunately + cleanup := func() { + q.writeTaggedBatchRawRequestElementArrayPool.Put(elems) + q.writeTaggedBatchRawRequestPool.Put(req) + q.opsArrayPool.Put(ops) + q.Done() + } + + // NB(bl): host is passed to writeState to determine the state of the + // shard on the node we're writing to + + client, err := q.connPool.NextClient() + if err != nil { + // No client available + callAllCompletionFns(ops, q.host, err) + cleanup() + return + } + + ctx, _ := thrift.NewContext(q.opts.WriteRequestTimeout()) + err = client.WriteTaggedBatchRaw(ctx, req) + if err == nil { + // All succeeded + callAllCompletionFns(ops, q.host, nil) + cleanup() + return + } + + if batchErrs, ok := err.(*rpc.WriteBatchRawErrors); ok { + // Callback all writes with errors + hasErr := make(map[int]struct{}) + for _, batchErr := range batchErrs.Errors { + op := ops[batchErr.Index] + op.CompletionFn()(q.host, batchErr.Err) + hasErr[int(batchErr.Index)] = struct{}{} + } + // Callback all writes with no errors + for i := range ops { + if _, ok := hasErr[i]; !ok { + // No error + ops[i].CompletionFn()(q.host, nil) + } + } + cleanup() + return + } + + // Entire batch failed + callAllCompletionFns(ops, q.host, err) + cleanup() + }) +} + +func (q *queue) asyncTaggedWriteV2( + ops []op, + req *rpc.WriteTaggedBatchRawV2Request, +) { + q.writeOpBatchSize.RecordValue(float64(len(req.Elements))) + q.Add(1) + + q.workerPool.Go(func() { + // NB(r): Defer is slow in the hot path unfortunately + cleanup := func() { + q.writeTaggedBatchRawV2RequestElementArrayPool.Put(req.Elements) + q.writeTaggedBatchRawV2RequestPool.Put(req) + q.opsArrayPool.Put(ops) + q.Done() + } + + // NB(bl): host is passed to writeState to determine the state of the + // shard on the node we're writing to. + client, err := q.connPool.NextClient() + if err != nil { + // No client available + callAllCompletionFns(ops, q.host, err) + cleanup() + return + } + + ctx, _ := thrift.NewContext(q.opts.WriteRequestTimeout()) + err = client.WriteTaggedBatchRawV2(ctx, req) + if err == nil { + // All succeeded + callAllCompletionFns(ops, q.host, nil) + cleanup() + return + } + + if batchErrs, ok := err.(*rpc.WriteBatchRawErrors); ok { + // Callback all writes with errors + hasErr := make(map[int]struct{}) + for _, batchErr := range batchErrs.Errors { + op := ops[batchErr.Index] + op.CompletionFn()(q.host, batchErr.Err) + hasErr[int(batchErr.Index)] = struct{}{} + } + // Callback all writes with no errors + for i := range ops { + if _, ok := hasErr[i]; !ok { + // No error + ops[i].CompletionFn()(q.host, nil) + } + } + cleanup() + return + } + + // Entire batch failed + callAllCompletionFns(ops, q.host, err) + cleanup() + }) +} + +func (q *queue) asyncWrite( + namespace ident.ID, + ops []op, + elems []*rpc.WriteBatchRawRequestElement, +) { + q.writeOpBatchSize.RecordValue(float64(len(elems))) + q.Add(1) + q.workerPool.Go(func() { + req := q.writeBatchRawRequestPool.Get() + req.NameSpace = namespace.Bytes() + req.Elements = elems + + // NB(r): Defer is slow in the hot path unfortunately + cleanup := func() { + q.writeBatchRawRequestElementArrayPool.Put(elems) + q.writeBatchRawRequestPool.Put(req) + q.opsArrayPool.Put(ops) + q.Done() + } + + // NB(bl): host is passed to writeState to determine the state of the + // shard on the node we're writing to + + client, err := q.connPool.NextClient() + if err != nil { + // No client available + callAllCompletionFns(ops, q.host, err) + cleanup() + return + } + + ctx, _ := thrift.NewContext(q.opts.WriteRequestTimeout()) + err = client.WriteBatchRaw(ctx, req) + if err == nil { + // All succeeded + callAllCompletionFns(ops, q.host, nil) + cleanup() + return + } + + if batchErrs, ok := err.(*rpc.WriteBatchRawErrors); ok { + // Callback all writes with errors + hasErr := make(map[int]struct{}) + for _, batchErr := range batchErrs.Errors { + op := ops[batchErr.Index] + op.CompletionFn()(q.host, batchErr.Err) + hasErr[int(batchErr.Index)] = struct{}{} + } + // Callback all writes with no errors + for i := range ops { + if _, ok := hasErr[i]; !ok { + // No error + ops[i].CompletionFn()(q.host, nil) + } + } + cleanup() + return + } + + // Entire batch failed + callAllCompletionFns(ops, q.host, err) + cleanup() + }) +} + +func (q *queue) asyncWriteV2( + ops []op, + req *rpc.WriteBatchRawV2Request, +) { + q.writeOpBatchSize.RecordValue(float64(len(req.Elements))) + q.Add(1) + q.workerPool.Go(func() { + // NB(r): Defer is slow in the hot path unfortunately + cleanup := func() { + q.writeBatchRawV2RequestElementArrayPool.Put(req.Elements) + q.writeBatchRawV2RequestPool.Put(req) + q.opsArrayPool.Put(ops) + q.Done() + } + + // NB(bl): host is passed to writeState to determine the state of the + // shard on the node we're writing to. + client, err := q.connPool.NextClient() + if err != nil { + // No client available. + callAllCompletionFns(ops, q.host, err) + cleanup() + return + } + + ctx, _ := thrift.NewContext(q.opts.WriteRequestTimeout()) + err = client.WriteBatchRawV2(ctx, req) + if err == nil { + // All succeeded. + callAllCompletionFns(ops, q.host, nil) + cleanup() + return + } + + if batchErrs, ok := err.(*rpc.WriteBatchRawErrors); ok { + // Callback all writes with errors. + hasErr := make(map[int]struct{}) + for _, batchErr := range batchErrs.Errors { + op := ops[batchErr.Index] + op.CompletionFn()(q.host, batchErr.Err) + hasErr[int(batchErr.Index)] = struct{}{} + } + // Callback all writes with no errors. + for i := range ops { + if _, ok := hasErr[i]; !ok { + // No error + ops[i].CompletionFn()(q.host, nil) + } + } + cleanup() + return + } + + // Entire batch failed. + callAllCompletionFns(ops, q.host, err) + cleanup() + }) +} + +func (q *queue) asyncFetch(op *fetchBatchOp) { + q.fetchOpBatchSize.RecordValue(float64(len(op.request.Ids))) + q.Add(1) + q.workerPool.Go(func() { + // NB(r): Defer is slow in the hot path unfortunately + cleanup := func() { + op.DecRef() + op.Finalize() + q.Done() + } + + client, err := q.connPool.NextClient() + if err != nil { + // No client available + op.completeAll(nil, err) + cleanup() + return + } + + ctx, _ := thrift.NewContext(q.opts.FetchRequestTimeout()) + result, err := client.FetchBatchRaw(ctx, &op.request) + if err != nil { + op.completeAll(nil, err) + cleanup() + return + } + + resultLen := len(result.Elements) + opLen := op.Size() + for i := 0; i < opLen; i++ { + if !(i < resultLen) { + // No results for this entry, in practice should never occur + op.complete(i, nil, errQueueFetchNoResponse(q.host.ID())) + continue + } + if result.Elements[i].Err != nil { + op.complete(i, nil, result.Elements[i].Err) + continue + } + op.complete(i, result.Elements[i].Segments, nil) + } + cleanup() + }) +} + +func (q *queue) asyncFetchV2( + ops []op, + currV2FetchBatchRawReq *rpc.FetchBatchRawV2Request, +) { + q.fetchOpBatchSize.RecordValue(float64(len(currV2FetchBatchRawReq.Elements))) + q.Add(1) + q.workerPool.Go(func() { + // NB(r): Defer is slow in the hot path unfortunately + cleanup := func() { + q.fetchBatchRawV2RequestElementArrayPool.Put(currV2FetchBatchRawReq.Elements) + q.fetchBatchRawV2RequestPool.Put(currV2FetchBatchRawReq) + for _, op := range ops { + fetchOp := op.(*fetchBatchOp) + fetchOp.DecRef() + fetchOp.Finalize() + } + q.Done() + } + + client, err := q.connPool.NextClient() + if err != nil { + // No client available. + callAllCompletionFns(ops, nil, err) + cleanup() + return + } + + ctx, _ := thrift.NewContext(q.opts.FetchRequestTimeout()) + result, err := client.FetchBatchRawV2(ctx, currV2FetchBatchRawReq) + if err != nil { + callAllCompletionFns(ops, nil, err) + cleanup() + return + } + + resultIdx := -1 + for _, op := range ops { + fetchOp := op.(*fetchBatchOp) + for j := 0; j < fetchOp.Size(); j++ { + resultIdx++ + if resultIdx >= len(result.Elements) { + // No results for this entry, in practice should never occur. + fetchOp.complete(j, nil, errQueueFetchNoResponse(q.host.ID())) + continue + } + + if result.Elements[resultIdx].Err != nil { + fetchOp.complete(j, nil, result.Elements[resultIdx].Err) + continue + } + fetchOp.complete(j, result.Elements[resultIdx].Segments, nil) + } + } + cleanup() + }) +} + +func (q *queue) asyncFetchTagged(op *fetchTaggedOp) { + q.Add(1) + q.workerPool.Go(func() { + // NB(r): Defer is slow in the hot path unfortunately + cleanup := func() { + op.decRef() + q.Done() + } + + client, err := q.connPool.NextClient() + if err != nil { + // No client available + op.CompletionFn()(fetchTaggedResultAccumulatorOpts{host: q.host}, err) + cleanup() + return + } + + ctx, _ := thrift.NewContext(q.opts.FetchRequestTimeout()) + result, err := client.FetchTagged(ctx, &op.request) + if err != nil { + op.CompletionFn()(fetchTaggedResultAccumulatorOpts{host: q.host}, err) + cleanup() + return + } + + op.CompletionFn()(fetchTaggedResultAccumulatorOpts{ + host: q.host, + response: result, + }, err) + cleanup() + }) +} + +func (q *queue) asyncAggregate(op *aggregateOp) { + q.Add(1) + q.workerPool.Go(func() { + // NB(r): Defer is slow in the hot path unfortunately + cleanup := func() { + op.decRef() + q.Done() + } + + client, err := q.connPool.NextClient() + if err != nil { + // No client available + op.CompletionFn()(aggregateResultAccumulatorOpts{host: q.host}, err) + cleanup() + return + } + + ctx, _ := thrift.NewContext(q.opts.FetchRequestTimeout()) + result, err := client.AggregateRaw(ctx, &op.request) + if err != nil { + op.CompletionFn()(aggregateResultAccumulatorOpts{host: q.host}, err) + cleanup() + return + } + + op.CompletionFn()(aggregateResultAccumulatorOpts{ + host: q.host, + response: result, + }, err) + cleanup() + }) +} + +func (q *queue) asyncTruncate(op *truncateOp) { + q.Add(1) + + q.workerPool.Go(func() { + cleanup := q.Done + + client, err := q.connPool.NextClient() + if err != nil { + // No client available + op.completionFn(nil, err) + cleanup() + return + } + + ctx, _ := thrift.NewContext(q.opts.TruncateRequestTimeout()) + if res, err := client.Truncate(ctx, &op.request); err != nil { + op.completionFn(nil, err) + } else { + op.completionFn(res, nil) + } + + cleanup() + }) +} + +func (q *queue) Len() int { + q.RLock() + v := q.opsSumSize + q.RUnlock() + return v +} + +func (q *queue) Enqueue(o op) error { + switch sOp := o.(type) { + case *fetchBatchOp: + // Need to take ownership if its a fetch batch op + sOp.IncRef() + case *fetchTaggedOp: + // Need to take ownership if its a fetch tagged op + sOp.incRef() + case *aggregateOp: + // Need to take ownership if its an aggregate op + sOp.incRef() + } + + var needsDrain []op + q.Lock() + if q.status != statusOpen { + q.Unlock() + return errQueueNotOpen(q.host.ID()) + } + q.ops = append(q.ops, o) + q.opsSumSize += o.Size() + // If queue is full flush + if q.opsSumSize >= q.size { + needsDrain = q.rotateOpsWithLock() + } + // Need to hold lock while writing to the drainIn + // channel to ensure it has not been closed + if len(needsDrain) != 0 { + q.drainIn <- needsDrain + } + q.Unlock() + return nil +} + +func (q *queue) Host() topology.Host { + return q.host +} + +func (q *queue) ConnectionCount() int { + return q.connPool.ConnectionCount() +} + +func (q *queue) ConnectionPool() connectionPool { + return q.connPool +} + +func (q *queue) BorrowConnection(fn withConnectionFn) error { + q.RLock() + if q.status != statusOpen { + q.RUnlock() + return errQueueNotOpen(q.host.ID()) + } + // Add an outstanding operation to avoid connection pool being closed + q.Add(1) + defer q.Done() + q.RUnlock() + + conn, err := q.connPool.NextClient() + if err != nil { + return err + } + + fn(conn) + return nil +} + +func (q *queue) Close() { + q.Lock() + if q.status != statusOpen { + q.Unlock() + return + } + q.status = statusClosed + + // Need to hold lock while writing to the drainIn + // channel to ensure it has not been closed + needsDrain := q.rotateOpsWithLock() + if len(needsDrain) != 0 { + q.drainIn <- needsDrain + } + + // Closed drainIn channel in lock to ensure writers know + // consistently if channel is open or not by checking state + close(q.drainIn) + q.Unlock() +} + +// errors + +func errQueueNotOpen(hostID string) error { + return fmt.Errorf("host operation queue not open for host: %s", hostID) +} + +func errQueueUnknownOperation(hostID string) error { + return fmt.Errorf("host operation queue received unknown operation for host: %s", hostID) +} + +func errQueueFetchNoResponse(hostID string) error { + return fmt.Errorf("host operation queue did not receive response for given fetch for host: %s", hostID) +} + +// ops container types + +type namespaceWriteBatchOps struct { + namespace ident.ID + opsArrayPool *opArrayPool + writeBatchRawRequestElementArrayPool writeBatchRawRequestElementArrayPool + ops []op + elems []*rpc.WriteBatchRawRequestElement +} + +type namespaceWriteBatchOpsSlice []namespaceWriteBatchOps + +func (s namespaceWriteBatchOpsSlice) indexOf( + namespace ident.ID, +) int { + idx := -1 + for i := range s { + if s[i].namespace.Equal(namespace) { + return i + } + } + return idx +} + +func (s namespaceWriteBatchOpsSlice) appendAt( + index int, + op op, + elem *rpc.WriteBatchRawRequestElement, +) { + if s[index].ops == nil { + s[index].ops = s[index].opsArrayPool.Get() + } + if s[index].elems == nil { + s[index].elems = s[index].writeBatchRawRequestElementArrayPool.Get() + } + s[index].ops = append(s[index].ops, op) + s[index].elems = append(s[index].elems, elem) +} + +func (s namespaceWriteBatchOpsSlice) lenAt( + index int, +) int { + return len(s[index].ops) +} + +func (s namespaceWriteBatchOpsSlice) resetAt( + index int, +) { + s[index].ops = nil + s[index].elems = nil +} + +// TODO: use genny to make namespaceWriteBatchOps and namespaceWriteTaggedBatchOps +// share code (https://github.com/m3db/m3/src/dbnode/issues/531) +type namespaceWriteTaggedBatchOps struct { + namespace ident.ID + opsArrayPool *opArrayPool + writeTaggedBatchRawRequestElementArrayPool writeTaggedBatchRawRequestElementArrayPool + ops []op + elems []*rpc.WriteTaggedBatchRawRequestElement +} + +type namespaceWriteTaggedBatchOpsSlice []namespaceWriteTaggedBatchOps + +func (s namespaceWriteTaggedBatchOpsSlice) indexOf( + namespace ident.ID, +) int { + idx := -1 + for i := range s { + if s[i].namespace.Equal(namespace) { + return i + } + } + return idx +} + +func (s namespaceWriteTaggedBatchOpsSlice) appendAt( + index int, + op op, + elem *rpc.WriteTaggedBatchRawRequestElement, +) { + if s[index].ops == nil { + s[index].ops = s[index].opsArrayPool.Get() + } + if s[index].elems == nil { + s[index].elems = s[index].writeTaggedBatchRawRequestElementArrayPool.Get() + } + s[index].ops = append(s[index].ops, op) + s[index].elems = append(s[index].elems, elem) +} + +func (s namespaceWriteTaggedBatchOpsSlice) lenAt( + index int, +) int { + return len(s[index].ops) +} + +func (s namespaceWriteTaggedBatchOpsSlice) resetAt( + index int, +) { + s[index].ops = nil + s[index].elems = nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/iterator_matcher.go b/vendor/github.com/m3db/m3/src/dbnode/client/iterator_matcher.go new file mode 100644 index 00000000..8d499c18 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/iterator_matcher.go @@ -0,0 +1,125 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "fmt" + + "github.com/m3db/m3/src/x/ident" + + "github.com/golang/mock/gomock" +) + +// TaggedIDsIteratorMatcher is a gomock.Matcher that matches TaggedIDsIterator. +type TaggedIDsIteratorMatcher interface { + gomock.Matcher +} + +// TaggedIDsIteratorMatcherOption is an option for the TaggedIDsIteratorMatcher ctor. +type TaggedIDsIteratorMatcherOption struct { + Namespace string + ID string + Tags []string +} + +// MustNewTaggedIDsIteratorMatcher returns a new TaggedIDsIteratorMatcher. +func MustNewTaggedIDsIteratorMatcher(opts ...TaggedIDsIteratorMatcherOption) TaggedIDsIteratorMatcher { + m, err := NewTaggedIDsIteratorMatcher(opts...) + if err != nil { + panic(err.Error()) + } + return m +} + +// NewTaggedIDsIteratorMatcher returns a new TaggedIDsIteratorMatcher. +func NewTaggedIDsIteratorMatcher(opts ...TaggedIDsIteratorMatcherOption) (TaggedIDsIteratorMatcher, error) { + m := &iteratorMatcher{} + err := m.init(opts) + if err != nil { + return nil, err + } + return m, nil +} + +// ns -> id -> tags +type nsIDTagsMap map[string]idTagsMap +type idTagsMap map[string]ident.TagIterMatcher + +type iteratorMatcher struct { + entries nsIDTagsMap +} + +func (m *iteratorMatcher) init(opts []TaggedIDsIteratorMatcherOption) error { + m.entries = make(nsIDTagsMap) + for _, o := range opts { + idMap, ok := m.entries[o.Namespace] + if !ok { + idMap = make(idTagsMap) + m.entries[o.Namespace] = idMap + } + _, ok = idMap[o.ID] + if ok { + return fmt.Errorf("duplicate id: %s", o.ID) + } + iter, err := ident.NewTagStringsIterator(o.Tags...) + if err != nil { + return err + } + matcher := ident.NewTagIterMatcher(iter) + idMap[o.ID] = matcher + } + return nil +} + +func (m *iteratorMatcher) Matches(x interface{}) bool { + iter, ok := x.(TaggedIDsIterator) + if !ok { + return false + } + for iter.Next() { + ns, id, tags := iter.Current() + idMap, ok := m.entries[ns.String()] + if !ok { + return false + } + matcher, ok := idMap[id.String()] + if !ok { + return false + } + if !matcher.Matches(tags.Duplicate()) { + return false + } + delete(idMap, id.String()) + } + if iter.Next() || iter.Err() != nil { + return false + } + for _, ids := range m.entries { + if len(ids) != 0 { + return false + } + } + return true +} + +func (m *iteratorMatcher) String() string { + return fmt.Sprintf("TaggedIDsIteratorMatcher %v", m.entries) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/op.go b/vendor/github.com/m3db/m3/src/dbnode/client/op.go new file mode 100644 index 00000000..df647a56 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/op.go @@ -0,0 +1,29 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +type completionFn func(result interface{}, err error) + +func callAllCompletionFns(ops []op, result interface{}, err error) { + for i := range ops { + ops[i].CompletionFn()(result, err) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/op_array_pool.go b/vendor/github.com/m3db/m3/src/dbnode/client/op_array_pool.go new file mode 100644 index 00000000..b94e7b83 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/op_array_pool.go @@ -0,0 +1,103 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/x/pool" +) + +type opArrayPool struct { + pool pool.ObjectPool + capacity int +} + +func newOpArrayPool(opts pool.ObjectPoolOptions, capacity int) *opArrayPool { + p := pool.NewObjectPool(opts) + return &opArrayPool{p, capacity} +} + +func (p *opArrayPool) Init() { + p.pool.Init(func() interface{} { + return make([]op, 0, p.capacity) + }) +} + +func (p *opArrayPool) Get() []op { + return p.pool.Get().([]op) +} + +func (p *opArrayPool) Put(ops []op) { + for i := range ops { + ops[i] = nil + } + ops = ops[:0] + p.pool.Put(ops) +} + +type fetchBatchOpArrayArrayPool struct { + pool pool.ObjectPool + entries int + capacity int +} + +func newFetchBatchOpArrayArrayPool( + opts pool.ObjectPoolOptions, + entries, capacity int, +) *fetchBatchOpArrayArrayPool { + p := pool.NewObjectPool(opts) + return &fetchBatchOpArrayArrayPool{ + pool: p, + entries: entries, + capacity: capacity, + } +} + +func (p *fetchBatchOpArrayArrayPool) Init() { + p.pool.Init(func() interface{} { + arr := make([][]*fetchBatchOp, p.entries) + for i := range arr { + arr[i] = make([]*fetchBatchOp, 0, p.capacity) + } + return arr + }) +} + +func (p *fetchBatchOpArrayArrayPool) Get() [][]*fetchBatchOp { + return p.pool.Get().([][]*fetchBatchOp) +} + +func (p *fetchBatchOpArrayArrayPool) Put(arr [][]*fetchBatchOp) { + for i := range arr { + for j := range arr[i] { + arr[i][j] = nil + } + arr[i] = arr[i][:0] + } + p.pool.Put(arr) +} + +func (p *fetchBatchOpArrayArrayPool) Entries() int { + return p.entries +} + +func (p *fetchBatchOpArrayArrayPool) Capacity() int { + return p.capacity +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/options.go b/vendor/github.com/m3db/m3/src/dbnode/client/options.go new file mode 100644 index 00000000..50c315b0 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/options.go @@ -0,0 +1,1075 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "errors" + "io" + "math" + "runtime" + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/encoding/m3tsz" + "github.com/m3db/m3/src/dbnode/encoding/proto" + "github.com/m3db/m3/src/dbnode/environment" + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/dbnode/namespace" + nchannel "github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/node/channel" + m3dbruntime "github.com/m3db/m3/src/dbnode/runtime" + "github.com/m3db/m3/src/dbnode/storage/index" + "github.com/m3db/m3/src/dbnode/topology" + xclose "github.com/m3db/m3/src/x/close" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/pool" + xretry "github.com/m3db/m3/src/x/retry" + "github.com/m3db/m3/src/x/sampler" + "github.com/m3db/m3/src/x/serialize" + xsync "github.com/m3db/m3/src/x/sync" + + tchannel "github.com/uber/tchannel-go" + "github.com/uber/tchannel-go/thrift" +) + +const ( + // DefaultWriteBatchSize is the default write and write tagged batch size. + DefaultWriteBatchSize = 128 + + // defaultWriteConsistencyLevel is the default write consistency level + defaultWriteConsistencyLevel = m3dbruntime.DefaultWriteConsistencyLevel + + // defaultReadConsistencyLevel is the default read consistency level + defaultReadConsistencyLevel = m3dbruntime.DefaultReadConsistencyLevel + + // defaultBootstrapConsistencyLevel is the default bootstrap consistency level + defaultBootstrapConsistencyLevel = m3dbruntime.DefaultBootstrapConsistencyLevel + + // defaultMaxConnectionCount is the default max connection count + defaultMaxConnectionCount = 32 + + // defaultMinConnectionCount is the default min connection count + defaultMinConnectionCount = 2 + + // defaultHostConnectTimeout is the default host connection timeout + defaultHostConnectTimeout = 5 * time.Second + + // defaultClusterConnectTimeout is the default cluster connect timeout + defaultClusterConnectTimeout = 20 * time.Second + + // defaultClusterConnectConsistencyLevel is the default cluster connect consistency level + defaultClusterConnectConsistencyLevel = topology.ConnectConsistencyLevelAny + + // defaultWriteRequestTimeout is the default write request timeout + defaultWriteRequestTimeout = 10 * time.Second + + // defaultFetchRequestTimeout is the default fetch request timeout + defaultFetchRequestTimeout = 15 * time.Second + + // defaultTruncateRequestTimeout is the default truncate request timeout + defaultTruncateRequestTimeout = 60 * time.Second + + // defaultWriteShardsInitializing is the default write to shards intializing value + defaultWriteShardsInitializing = true + + // defaultShardsLeavingCountTowardsConsistency is the default shards leaving count towards consistency + defaultShardsLeavingCountTowardsConsistency = false + + // defaultIdentifierPoolSize is the default identifier pool size + defaultIdentifierPoolSize = 8192 + + // defaultWriteOpPoolSize is the default write op pool size + defaultWriteOpPoolSize = 65536 + + // defaultWriteTaggedOpPoolSize is the default write tagged op pool size + defaultWriteTaggedOpPoolSize = 65536 + + // defaultFetchBatchOpPoolSize is the default fetch op pool size + defaultFetchBatchOpPoolSize = 1024 + + // defaultFetchBatchSize is the default fetch batch size + defaultFetchBatchSize = 128 + + // defaultCheckedBytesWrapperPoolSize is the default checkedBytesWrapperPoolSize + defaultCheckedBytesWrapperPoolSize = 65536 + + // defaultHostQueueOpsFlushSize is the default host queue ops flush size + defaultHostQueueOpsFlushSize = 128 + + // defaultHostQueueOpsFlushInterval is the default host queue flush interval + defaultHostQueueOpsFlushInterval = 5 * time.Millisecond + + // defaultHostQueueOpsArrayPoolSize is the default host queue ops array pool size + defaultHostQueueOpsArrayPoolSize = 8 + + // defaultHostQueueEmitsHealthStatus is false + defaultHostQueueEmitsHealthStatus = false + + // defaultBackgroundConnectInterval is the default background connect interval + defaultBackgroundConnectInterval = 4 * time.Second + + // defaultBackgroundConnectStutter is the default background connect stutter + defaultBackgroundConnectStutter = 2 * time.Second + + // defaultBackgroundHealthCheckInterval is the default background health check interval + defaultBackgroundHealthCheckInterval = 4 * time.Second + + // defaultBackgroundHealthCheckStutter is the default background health check stutter + defaultBackgroundHealthCheckStutter = 2 * time.Second + + // defaultBackgroundHealthCheckFailLimit is the default background health failure + // limit before connection is deemed unhealth + defaultBackgroundHealthCheckFailLimit = 4 + + // defaultBackgroundHealthCheckFailThrottleFactor is the default throttle factor to + // apply when calculating how long to wait between a failed health check and a + // retry attempt. It is applied by multiplying against the host connect + // timeout to produce a throttle sleep value. + defaultBackgroundHealthCheckFailThrottleFactor = 0.5 + + // defaultSeriesIteratorPoolSize is the default size of the series iterator pools + defaultSeriesIteratorPoolSize = 65536 + + // defaultTagEncoderPoolSize is the default size of the tag encoder pool. + defaultTagEncoderPoolSize = 4096 + + // defaultTagDecoderPoolSize is the default size of the tag decoder pool. + defaultTagDecoderPoolSize = 4096 + + // defaultFetchSeriesBlocksMaxBlockRetries is the default max retries for fetch series blocks + // from a single peer + defaultFetchSeriesBlocksMaxBlockRetries = 2 + + // defaultFetchSeriesBlocksBatchSize is the default fetch series blocks batch size + defaultFetchSeriesBlocksBatchSize = 4096 + + // defaultFetchSeriesBlocksMetadataBatchTimeout is the default series blocks metadata fetch timeout + defaultFetchSeriesBlocksMetadataBatchTimeout = 60 * time.Second + + // defaultFetchSeriesBlocksMetadataBatchTimeout is the default series blocks contents fetch timeout + defaultFetchSeriesBlocksBatchTimeout = 60 * time.Second + + // defaultAsyncWriteMaxConcurrency is the default maximum concurrency for async writes. + defaultAsyncWriteMaxConcurrency = 4096 + + // defaultUseV2BatchAPIs is the default setting for whether the v2 version of the batch APIs should + // be used. + defaultUseV2BatchAPIs = false +) + +var ( + // defaultIdentifierPoolBytesPoolSizes is the default bytes pool sizes for the identifier pool + defaultIdentifierPoolBytesPoolSizes = []pool.Bucket{ + {Capacity: 256, Count: defaultIdentifierPoolSize}, + } + + // defaultFetchSeriesBlocksBatchConcurrency is the default fetch series blocks in batch parallel concurrency limit + defaultFetchSeriesBlocksBatchConcurrency = int(math.Max(1, float64(runtime.NumCPU())/2)) + + // defaultSeriesIteratorArrayPoolBuckets is the default pool buckets for the series iterator array pool + defaultSeriesIteratorArrayPoolBuckets = []pool.Bucket{} + + // defaulWriteRetrier is the default write retrier for write attempts + defaultWriteRetrier = xretry.NewRetrier( + xretry.NewOptions(). + SetInitialBackoff(500 * time.Millisecond). + SetBackoffFactor(3). + SetMaxRetries(2). + SetJitter(true)) + + // defaultFetchRetrier is the default fetch retrier for fetch attempts + defaultFetchRetrier = xretry.NewRetrier( + xretry.NewOptions(). + SetInitialBackoff(500 * time.Millisecond). + SetBackoffFactor(2). + SetMaxRetries(3). + SetJitter(true)) + + // defaultStreamBlocksRetrier is the default retrier for streaming blocks + defaultStreamBlocksRetrier = xretry.NewRetrier( + xretry.NewOptions(). + SetBackoffFactor(2). + SetMaxRetries(3). + SetInitialBackoff(2 * time.Second). + SetJitter(true), + ) + + // defaultChannelOptions are default tchannel channel options. + defaultChannelOptions = &tchannel.ChannelOptions{ + MaxIdleTime: 5 * time.Minute, + IdleCheckInterval: 5 * time.Minute, + } + + errNoTopologyInitializerSet = errors.New("no topology initializer set") + errNoReaderIteratorAllocateSet = errors.New("no reader iterator allocator set, encoding not set") +) + +type options struct { + runtimeOptsMgr m3dbruntime.OptionsManager + clockOpts clock.Options + instrumentOpts instrument.Options + logErrorSampleRate sampler.Rate + topologyInitializer topology.Initializer + readConsistencyLevel topology.ReadConsistencyLevel + writeConsistencyLevel topology.ConsistencyLevel + bootstrapConsistencyLevel topology.ReadConsistencyLevel + channelOptions *tchannel.ChannelOptions + maxConnectionCount int + minConnectionCount int + hostConnectTimeout time.Duration + clusterConnectTimeout time.Duration + clusterConnectConsistencyLevel topology.ConnectConsistencyLevel + writeRequestTimeout time.Duration + fetchRequestTimeout time.Duration + truncateRequestTimeout time.Duration + backgroundConnectInterval time.Duration + backgroundConnectStutter time.Duration + backgroundHealthCheckInterval time.Duration + backgroundHealthCheckStutter time.Duration + backgroundHealthCheckFailLimit int + backgroundHealthCheckFailThrottleFactor float64 + tagEncoderOpts serialize.TagEncoderOptions + tagEncoderPoolSize int + tagDecoderOpts serialize.TagDecoderOptions + tagDecoderPoolSize int + writeRetrier xretry.Retrier + fetchRetrier xretry.Retrier + streamBlocksRetrier xretry.Retrier + writeShardsInitializing bool + shardsLeavingCountTowardsConsistency bool + newConnectionFn NewConnectionFn + readerIteratorAllocate encoding.ReaderIteratorAllocate + writeOperationPoolSize int + writeTaggedOperationPoolSize int + fetchBatchOpPoolSize int + writeBatchSize int + fetchBatchSize int + identifierPool ident.Pool + hostQueueOpsFlushSize int + hostQueueOpsFlushInterval time.Duration + hostQueueOpsArrayPoolSize int + hostQueueEmitsHealthStatus bool + seriesIteratorPoolSize int + seriesIteratorArrayPoolBuckets []pool.Bucket + checkedBytesWrapperPoolSize int + contextPool context.Pool + origin topology.Host + fetchSeriesBlocksMaxBlockRetries int + fetchSeriesBlocksBatchSize int + fetchSeriesBlocksMetadataBatchTimeout time.Duration + fetchSeriesBlocksBatchTimeout time.Duration + fetchSeriesBlocksBatchConcurrency int + schemaRegistry namespace.SchemaRegistry + isProtoEnabled bool + asyncTopologyInitializers []topology.Initializer + asyncWriteWorkerPool xsync.PooledWorkerPool + asyncWriteMaxConcurrency int + useV2BatchAPIs bool + iterationOptions index.IterationOptions + writeTimestampOffset time.Duration +} + +// NewOptions creates a new set of client options with defaults +func NewOptions() Options { + return newOptions() +} + +// NewAdminOptions creates a new set of administration client options with defaults +func NewAdminOptions() AdminOptions { + return newOptions() +} + +// NewOptionsForAsyncClusters returns a slice of Options, where each is the set of client +// for a given async client. +func NewOptionsForAsyncClusters(opts Options, topoInits []topology.Initializer, overrides []environment.ClientOverrides) []Options { + result := make([]Options, 0, len(opts.AsyncTopologyInitializers())) + for i, topoInit := range topoInits { + options := opts.SetTopologyInitializer(topoInit) + if overrides[i].HostQueueFlushInterval != nil { + options = options.SetHostQueueOpsFlushInterval(*overrides[i].HostQueueFlushInterval) + } + if overrides[i].TargetHostQueueFlushSize != nil { + options = options.SetHostQueueOpsFlushSize(*overrides[i].TargetHostQueueFlushSize) + } + result = append(result, options) + } + return result +} + +func defaultNewConnectionFn( + channelName string, address string, opts Options, +) (xclose.SimpleCloser, rpc.TChanNode, error) { + channel, err := tchannel.NewChannel(channelName, opts.ChannelOptions()) + if err != nil { + return nil, nil, err + } + endpoint := &thrift.ClientOptions{HostPort: address} + thriftClient := thrift.NewClient(channel, nchannel.ChannelName, endpoint) + client := rpc.NewTChanNodeClient(thriftClient) + return channel, client, nil +} + +func newOptions() *options { + buckets := defaultIdentifierPoolBytesPoolSizes + bytesPool := pool.NewCheckedBytesPool(buckets, nil, + func(sizes []pool.Bucket) pool.BytesPool { + return pool.NewBytesPool(sizes, nil) + }) + bytesPool.Init() + + poolOpts := pool.NewObjectPoolOptions(). + SetSize(defaultIdentifierPoolSize) + + idPool := ident.NewPool(bytesPool, ident.PoolOptions{ + IDPoolOptions: poolOpts, + TagsPoolOptions: poolOpts, + TagsIteratorPoolOptions: poolOpts, + }) + + contextPool := context.NewPool(context.NewOptions(). + SetContextPoolOptions(poolOpts). + SetFinalizerPoolOptions(poolOpts)) + + opts := &options{ + clockOpts: clock.NewOptions(), + instrumentOpts: instrument.NewOptions(), + channelOptions: defaultChannelOptions, + writeConsistencyLevel: defaultWriteConsistencyLevel, + readConsistencyLevel: defaultReadConsistencyLevel, + bootstrapConsistencyLevel: defaultBootstrapConsistencyLevel, + maxConnectionCount: defaultMaxConnectionCount, + minConnectionCount: defaultMinConnectionCount, + hostConnectTimeout: defaultHostConnectTimeout, + clusterConnectTimeout: defaultClusterConnectTimeout, + clusterConnectConsistencyLevel: defaultClusterConnectConsistencyLevel, + writeRequestTimeout: defaultWriteRequestTimeout, + fetchRequestTimeout: defaultFetchRequestTimeout, + truncateRequestTimeout: defaultTruncateRequestTimeout, + backgroundConnectInterval: defaultBackgroundConnectInterval, + backgroundConnectStutter: defaultBackgroundConnectStutter, + backgroundHealthCheckInterval: defaultBackgroundHealthCheckInterval, + backgroundHealthCheckStutter: defaultBackgroundHealthCheckStutter, + backgroundHealthCheckFailLimit: defaultBackgroundHealthCheckFailLimit, + backgroundHealthCheckFailThrottleFactor: defaultBackgroundHealthCheckFailThrottleFactor, + writeRetrier: defaultWriteRetrier, + fetchRetrier: defaultFetchRetrier, + writeShardsInitializing: defaultWriteShardsInitializing, + shardsLeavingCountTowardsConsistency: defaultShardsLeavingCountTowardsConsistency, + tagEncoderPoolSize: defaultTagEncoderPoolSize, + tagEncoderOpts: serialize.NewTagEncoderOptions(), + tagDecoderPoolSize: defaultTagDecoderPoolSize, + tagDecoderOpts: serialize.NewTagDecoderOptions(serialize.TagDecoderOptionsConfig{}), + streamBlocksRetrier: defaultStreamBlocksRetrier, + newConnectionFn: defaultNewConnectionFn, + writeOperationPoolSize: defaultWriteOpPoolSize, + writeTaggedOperationPoolSize: defaultWriteTaggedOpPoolSize, + fetchBatchOpPoolSize: defaultFetchBatchOpPoolSize, + writeBatchSize: DefaultWriteBatchSize, + fetchBatchSize: defaultFetchBatchSize, + identifierPool: idPool, + hostQueueOpsFlushSize: defaultHostQueueOpsFlushSize, + hostQueueOpsFlushInterval: defaultHostQueueOpsFlushInterval, + hostQueueOpsArrayPoolSize: defaultHostQueueOpsArrayPoolSize, + hostQueueEmitsHealthStatus: defaultHostQueueEmitsHealthStatus, + seriesIteratorPoolSize: defaultSeriesIteratorPoolSize, + seriesIteratorArrayPoolBuckets: defaultSeriesIteratorArrayPoolBuckets, + checkedBytesWrapperPoolSize: defaultCheckedBytesWrapperPoolSize, + contextPool: contextPool, + fetchSeriesBlocksMaxBlockRetries: defaultFetchSeriesBlocksMaxBlockRetries, + fetchSeriesBlocksBatchSize: defaultFetchSeriesBlocksBatchSize, + fetchSeriesBlocksMetadataBatchTimeout: defaultFetchSeriesBlocksMetadataBatchTimeout, + fetchSeriesBlocksBatchTimeout: defaultFetchSeriesBlocksBatchTimeout, + fetchSeriesBlocksBatchConcurrency: defaultFetchSeriesBlocksBatchConcurrency, + schemaRegistry: namespace.NewSchemaRegistry(false, nil), + asyncTopologyInitializers: []topology.Initializer{}, + asyncWriteMaxConcurrency: defaultAsyncWriteMaxConcurrency, + useV2BatchAPIs: defaultUseV2BatchAPIs, + } + return opts.SetEncodingM3TSZ().(*options) +} + +func validate(opts *options) error { + if opts.topologyInitializer == nil { + return errNoTopologyInitializerSet + } + if opts.readerIteratorAllocate == nil { + return errNoReaderIteratorAllocateSet + } + if err := topology.ValidateConsistencyLevel( + opts.writeConsistencyLevel, + ); err != nil { + return err + } + if err := topology.ValidateReadConsistencyLevel( + opts.readConsistencyLevel, + ); err != nil { + return err + } + if err := topology.ValidateReadConsistencyLevel( + opts.bootstrapConsistencyLevel, + ); err != nil { + return err + } + if err := topology.ValidateConnectConsistencyLevel( + opts.clusterConnectConsistencyLevel, + ); err != nil { + return err + } + return opts.logErrorSampleRate.Validate() +} + +func (o *options) Validate() error { + return validate(o) +} + +func (o *options) SetEncodingM3TSZ() Options { + opts := *o + opts.readerIteratorAllocate = func(r io.Reader, _ namespace.SchemaDescr) encoding.ReaderIterator { + return m3tsz.NewReaderIterator(r, m3tsz.DefaultIntOptimizationEnabled, encoding.NewOptions()) + } + opts.isProtoEnabled = false + return &opts +} + +func (o *options) SetEncodingProto(encodingOpts encoding.Options) Options { + opts := *o + opts.readerIteratorAllocate = func(r io.Reader, descr namespace.SchemaDescr) encoding.ReaderIterator { + return proto.NewIterator(r, descr, encodingOpts) + } + opts.isProtoEnabled = true + return &opts +} + +func (o *options) IsSetEncodingProto() bool { + return o.isProtoEnabled +} + +func (o *options) SetRuntimeOptionsManager(value m3dbruntime.OptionsManager) Options { + opts := *o + opts.runtimeOptsMgr = value + return &opts +} + +func (o *options) RuntimeOptionsManager() m3dbruntime.OptionsManager { + return o.runtimeOptsMgr +} + +func (o *options) SetClockOptions(value clock.Options) Options { + opts := *o + opts.clockOpts = value + return &opts +} + +func (o *options) ClockOptions() clock.Options { + return o.clockOpts +} + +func (o *options) SetInstrumentOptions(value instrument.Options) Options { + opts := *o + opts.instrumentOpts = value + return &opts +} + +func (o *options) InstrumentOptions() instrument.Options { + return o.instrumentOpts +} + +func (o *options) SetLogErrorSampleRate(value sampler.Rate) Options { + opts := *o + opts.logErrorSampleRate = value + return &opts +} + +func (o *options) LogErrorSampleRate() sampler.Rate { + return o.logErrorSampleRate +} + +func (o *options) SetTopologyInitializer(value topology.Initializer) Options { + opts := *o + opts.topologyInitializer = value + return &opts +} + +func (o *options) TopologyInitializer() topology.Initializer { + return o.topologyInitializer +} + +func (o *options) SetReadConsistencyLevel(value topology.ReadConsistencyLevel) Options { + opts := *o + opts.readConsistencyLevel = value + return &opts +} + +func (o *options) ReadConsistencyLevel() topology.ReadConsistencyLevel { + return o.readConsistencyLevel +} + +func (o *options) SetWriteConsistencyLevel(value topology.ConsistencyLevel) Options { + opts := *o + opts.writeConsistencyLevel = value + return &opts +} + +func (o *options) WriteConsistencyLevel() topology.ConsistencyLevel { + return o.writeConsistencyLevel +} + +func (o *options) SetBootstrapConsistencyLevel(value topology.ReadConsistencyLevel) AdminOptions { + opts := *o + opts.bootstrapConsistencyLevel = value + return &opts +} + +func (o *options) BootstrapConsistencyLevel() topology.ReadConsistencyLevel { + return o.bootstrapConsistencyLevel +} + +func (o *options) SetChannelOptions(value *tchannel.ChannelOptions) Options { + opts := *o + opts.channelOptions = value + return &opts +} + +func (o *options) ChannelOptions() *tchannel.ChannelOptions { + return o.channelOptions +} + +func (o *options) SetMaxConnectionCount(value int) Options { + opts := *o + opts.maxConnectionCount = value + return &opts +} + +func (o *options) MaxConnectionCount() int { + return o.maxConnectionCount +} + +func (o *options) SetMinConnectionCount(value int) Options { + opts := *o + opts.minConnectionCount = value + return &opts +} + +func (o *options) MinConnectionCount() int { + return o.minConnectionCount +} + +func (o *options) SetHostConnectTimeout(value time.Duration) Options { + opts := *o + opts.hostConnectTimeout = value + return &opts +} + +func (o *options) HostConnectTimeout() time.Duration { + return o.hostConnectTimeout +} + +func (o *options) SetClusterConnectTimeout(value time.Duration) Options { + opts := *o + opts.clusterConnectTimeout = value + return &opts +} + +func (o *options) ClusterConnectTimeout() time.Duration { + return o.clusterConnectTimeout +} + +func (o *options) SetClusterConnectConsistencyLevel(value topology.ConnectConsistencyLevel) Options { + opts := *o + opts.clusterConnectConsistencyLevel = value + return &opts +} + +func (o *options) ClusterConnectConsistencyLevel() topology.ConnectConsistencyLevel { + return o.clusterConnectConsistencyLevel +} + +func (o *options) SetWriteRequestTimeout(value time.Duration) Options { + opts := *o + opts.writeRequestTimeout = value + return &opts +} + +func (o *options) WriteRequestTimeout() time.Duration { + return o.writeRequestTimeout +} + +func (o *options) SetFetchRequestTimeout(value time.Duration) Options { + opts := *o + opts.fetchRequestTimeout = value + return &opts +} + +func (o *options) FetchRequestTimeout() time.Duration { + return o.fetchRequestTimeout +} + +func (o *options) SetTruncateRequestTimeout(value time.Duration) Options { + opts := *o + opts.truncateRequestTimeout = value + return &opts +} + +func (o *options) TruncateRequestTimeout() time.Duration { + return o.truncateRequestTimeout +} + +func (o *options) SetBackgroundConnectInterval(value time.Duration) Options { + opts := *o + opts.backgroundConnectInterval = value + return &opts +} + +func (o *options) BackgroundConnectInterval() time.Duration { + return o.writeRequestTimeout +} + +func (o *options) SetBackgroundConnectStutter(value time.Duration) Options { + opts := *o + opts.backgroundConnectStutter = value + return &opts +} + +func (o *options) BackgroundConnectStutter() time.Duration { + return o.backgroundConnectStutter +} + +func (o *options) SetBackgroundHealthCheckInterval(value time.Duration) Options { + opts := *o + opts.backgroundHealthCheckInterval = value + return &opts +} + +func (o *options) BackgroundHealthCheckInterval() time.Duration { + return o.backgroundHealthCheckInterval +} + +func (o *options) SetBackgroundHealthCheckStutter(value time.Duration) Options { + opts := *o + opts.backgroundHealthCheckStutter = value + return &opts +} + +func (o *options) BackgroundHealthCheckStutter() time.Duration { + return o.backgroundHealthCheckStutter +} + +func (o *options) SetBackgroundHealthCheckFailLimit(value int) Options { + opts := *o + opts.backgroundHealthCheckFailLimit = value + return &opts +} + +func (o *options) BackgroundHealthCheckFailLimit() int { + return o.backgroundHealthCheckFailLimit +} + +func (o *options) SetBackgroundHealthCheckFailThrottleFactor(value float64) Options { + opts := *o + opts.backgroundHealthCheckFailThrottleFactor = value + return &opts +} + +func (o *options) BackgroundHealthCheckFailThrottleFactor() float64 { + return o.backgroundHealthCheckFailThrottleFactor +} + +func (o *options) SetWriteRetrier(value xretry.Retrier) Options { + opts := *o + opts.writeRetrier = value + return &opts +} + +func (o *options) WriteRetrier() xretry.Retrier { + return o.writeRetrier +} + +func (o *options) SetFetchRetrier(value xretry.Retrier) Options { + opts := *o + opts.fetchRetrier = value + return &opts +} + +func (o *options) FetchRetrier() xretry.Retrier { + return o.fetchRetrier +} + +func (o *options) SetWriteShardsInitializing(value bool) Options { + opts := *o + opts.writeShardsInitializing = value + return &opts +} + +func (o *options) WriteShardsInitializing() bool { + return o.writeShardsInitializing +} + +func (o *options) SetShardsLeavingCountTowardsConsistency(value bool) Options { + opts := *o + opts.shardsLeavingCountTowardsConsistency = value + return &opts +} + +func (o *options) ShardsLeavingCountTowardsConsistency() bool { + return o.shardsLeavingCountTowardsConsistency +} + +func (o *options) SetTagEncoderOptions(value serialize.TagEncoderOptions) Options { + opts := *o + opts.tagEncoderOpts = value + return &opts +} + +func (o *options) TagEncoderOptions() serialize.TagEncoderOptions { + return o.tagEncoderOpts +} + +func (o *options) SetTagEncoderPoolSize(value int) Options { + opts := *o + opts.tagEncoderPoolSize = value + return &opts +} + +func (o *options) TagEncoderPoolSize() int { + return o.tagEncoderPoolSize +} + +func (o *options) SetTagDecoderOptions(value serialize.TagDecoderOptions) Options { + opts := *o + opts.tagDecoderOpts = value + return &opts +} + +func (o *options) TagDecoderOptions() serialize.TagDecoderOptions { + return o.tagDecoderOpts +} + +func (o *options) SetTagDecoderPoolSize(value int) Options { + opts := *o + opts.tagDecoderPoolSize = value + return &opts +} + +func (o *options) TagDecoderPoolSize() int { + return o.tagDecoderPoolSize +} + +func (o *options) SetStreamBlocksRetrier(value xretry.Retrier) AdminOptions { + opts := *o + opts.streamBlocksRetrier = value + return &opts +} + +func (o *options) StreamBlocksRetrier() xretry.Retrier { + return o.streamBlocksRetrier +} + +func (o *options) SetNewConnectionFn(value NewConnectionFn) AdminOptions { + opts := *o + opts.newConnectionFn = value + return &opts +} + +func (o *options) NewConnectionFn() NewConnectionFn { + return o.newConnectionFn +} + +func (o *options) SetWriteOpPoolSize(value int) Options { + opts := *o + opts.writeOperationPoolSize = value + return &opts +} + +func (o *options) WriteOpPoolSize() int { + return o.writeOperationPoolSize +} + +func (o *options) SetWriteTaggedOpPoolSize(value int) Options { + opts := *o + opts.writeTaggedOperationPoolSize = value + return &opts +} + +func (o *options) WriteTaggedOpPoolSize() int { + return o.writeTaggedOperationPoolSize +} + +func (o *options) SetFetchBatchOpPoolSize(value int) Options { + opts := *o + opts.fetchBatchOpPoolSize = value + return &opts +} + +func (o *options) FetchBatchOpPoolSize() int { + return o.fetchBatchOpPoolSize +} + +func (o *options) SetContextPool(value context.Pool) Options { + opts := *o + opts.contextPool = value + return &opts +} + +func (o *options) ContextPool() context.Pool { + return o.contextPool +} + +func (o *options) SetWriteBatchSize(value int) Options { + opts := *o + opts.writeBatchSize = value + return &opts +} + +func (o *options) WriteBatchSize() int { + return o.writeBatchSize +} + +func (o *options) SetFetchBatchSize(value int) Options { + opts := *o + opts.fetchBatchSize = value + return &opts +} + +func (o *options) FetchBatchSize() int { + return o.fetchBatchSize +} + +func (o *options) SetIdentifierPool(value ident.Pool) Options { + opts := *o + opts.identifierPool = value + return &opts +} + +func (o *options) IdentifierPool() ident.Pool { + return o.identifierPool +} + +func (o *options) SetCheckedBytesWrapperPoolSize(value int) Options { + opts := *o + opts.checkedBytesWrapperPoolSize = value + return &opts +} + +func (o *options) CheckedBytesWrapperPoolSize() int { + return o.checkedBytesWrapperPoolSize +} + +func (o *options) SetHostQueueOpsFlushSize(value int) Options { + opts := *o + opts.hostQueueOpsFlushSize = value + return &opts +} + +func (o *options) HostQueueOpsFlushSize() int { + return o.hostQueueOpsFlushSize +} + +func (o *options) SetHostQueueOpsFlushInterval(value time.Duration) Options { + opts := *o + opts.hostQueueOpsFlushInterval = value + return &opts +} + +func (o *options) HostQueueOpsFlushInterval() time.Duration { + return o.hostQueueOpsFlushInterval +} + +func (o *options) SetHostQueueOpsArrayPoolSize(value int) Options { + opts := *o + opts.hostQueueOpsArrayPoolSize = value + return &opts +} + +func (o *options) HostQueueOpsArrayPoolSize() int { + return o.hostQueueOpsArrayPoolSize +} + +func (o *options) SetHostQueueEmitsHealthStatus(value bool) Options { + opts := *o + opts.hostQueueEmitsHealthStatus = value + return &opts +} + +func (o *options) HostQueueEmitsHealthStatus() bool { + return o.hostQueueEmitsHealthStatus +} + +func (o *options) SetSeriesIteratorPoolSize(value int) Options { + opts := *o + opts.seriesIteratorPoolSize = value + return &opts +} + +func (o *options) SeriesIteratorPoolSize() int { + return o.seriesIteratorPoolSize +} + +func (o *options) SetSeriesIteratorArrayPoolBuckets(value []pool.Bucket) Options { + opts := *o + opts.seriesIteratorArrayPoolBuckets = value + return &opts +} + +func (o *options) SeriesIteratorArrayPoolBuckets() []pool.Bucket { + return o.seriesIteratorArrayPoolBuckets +} + +func (o *options) SetReaderIteratorAllocate(value encoding.ReaderIteratorAllocate) Options { + opts := *o + opts.readerIteratorAllocate = value + return &opts +} + +func (o *options) ReaderIteratorAllocate() encoding.ReaderIteratorAllocate { + return o.readerIteratorAllocate +} + +func (o *options) SetSchemaRegistry(registry namespace.SchemaRegistry) AdminOptions { + opts := *o + opts.schemaRegistry = registry + return &opts +} + +func (o *options) SchemaRegistry() namespace.SchemaRegistry { + return o.schemaRegistry +} + +func (o *options) SetOrigin(value topology.Host) AdminOptions { + opts := *o + opts.origin = value + return &opts +} + +func (o *options) Origin() topology.Host { + return o.origin +} + +func (o *options) SetFetchSeriesBlocksMaxBlockRetries(value int) AdminOptions { + opts := *o + opts.fetchSeriesBlocksMaxBlockRetries = value + return &opts +} + +func (o *options) FetchSeriesBlocksMaxBlockRetries() int { + return o.fetchSeriesBlocksMaxBlockRetries +} + +func (o *options) SetFetchSeriesBlocksBatchSize(value int) AdminOptions { + opts := *o + opts.fetchSeriesBlocksBatchSize = value + return &opts +} + +func (o *options) FetchSeriesBlocksBatchSize() int { + return o.fetchSeriesBlocksBatchSize +} + +func (o *options) SetFetchSeriesBlocksMetadataBatchTimeout(value time.Duration) AdminOptions { + opts := *o + opts.fetchSeriesBlocksMetadataBatchTimeout = value + return &opts +} + +func (o *options) FetchSeriesBlocksMetadataBatchTimeout() time.Duration { + return o.fetchSeriesBlocksMetadataBatchTimeout +} + +func (o *options) SetFetchSeriesBlocksBatchTimeout(value time.Duration) AdminOptions { + opts := *o + opts.fetchSeriesBlocksBatchTimeout = value + return &opts +} + +func (o *options) FetchSeriesBlocksBatchTimeout() time.Duration { + return o.fetchSeriesBlocksBatchTimeout +} + +func (o *options) SetFetchSeriesBlocksBatchConcurrency(value int) AdminOptions { + opts := *o + opts.fetchSeriesBlocksBatchConcurrency = value + return &opts +} + +func (o *options) FetchSeriesBlocksBatchConcurrency() int { + return o.fetchSeriesBlocksBatchConcurrency +} + +func (o *options) SetAsyncTopologyInitializers(value []topology.Initializer) Options { + opts := *o + opts.asyncTopologyInitializers = value + return &opts +} + +func (o *options) AsyncTopologyInitializers() []topology.Initializer { + return o.asyncTopologyInitializers +} + +func (o *options) SetAsyncWriteWorkerPool(value xsync.PooledWorkerPool) Options { + opts := *o + opts.asyncWriteWorkerPool = value + return &opts +} + +func (o *options) AsyncWriteWorkerPool() xsync.PooledWorkerPool { + return o.asyncWriteWorkerPool +} + +func (o *options) SetAsyncWriteMaxConcurrency(value int) Options { + opts := *o + opts.asyncWriteMaxConcurrency = value + return &opts +} + +func (o *options) AsyncWriteMaxConcurrency() int { + return o.asyncWriteMaxConcurrency +} + +func (o *options) SetUseV2BatchAPIs(value bool) Options { + opts := *o + opts.useV2BatchAPIs = value + return &opts +} + +func (o *options) UseV2BatchAPIs() bool { + return o.useV2BatchAPIs +} + +func (o *options) SetIterationOptions(value index.IterationOptions) Options { + opts := *o + opts.iterationOptions = value + return &opts +} + +func (o *options) IterationOptions() index.IterationOptions { + return o.iterationOptions +} + +func (o *options) SetWriteTimestampOffset(value time.Duration) AdminOptions { + opts := *o + opts.writeTimestampOffset = value + return &opts +} + +func (o *options) WriteTimestampOffset() time.Duration { + return o.writeTimestampOffset +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/peer.go b/vendor/github.com/m3db/m3/src/dbnode/client/peer.go new file mode 100644 index 00000000..b5bdc075 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/peer.go @@ -0,0 +1,43 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import "github.com/m3db/m3/src/dbnode/topology" + +type sessionPeer struct { + source peerSource + host topology.Host +} + +func newPeer(source peerSource, host topology.Host) peer { + return &sessionPeer{ + source: source, + host: host, + } +} + +func (p *sessionPeer) Host() topology.Host { + return p.host +} + +func (p *sessionPeer) BorrowConnection(fn withConnectionFn) error { + return p.source.BorrowConnection(p.host.ID(), fn) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/rc.go b/vendor/github.com/m3db/m3/src/dbnode/client/rc.go new file mode 100644 index 00000000..bfcf2e4b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/rc.go @@ -0,0 +1,42 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import "sync/atomic" + +type refCounter struct { + destructorFn func() + n int32 +} + +func (r *refCounter) incRef() { + if atomic.AddInt32(&r.n, 1) <= 0 { + panic("invalid rc state") + } +} + +func (r *refCounter) decRef() { + if v := atomic.AddInt32(&r.n, -1); v == 0 { + r.destructorFn() + } else if v < 0 { + panic("invalid rc state") + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/reader_slice_of_slices_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/client/reader_slice_of_slices_iterator.go new file mode 100644 index 00000000..d6e6f782 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/reader_slice_of_slices_iterator.go @@ -0,0 +1,214 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/checked" + xtime "github.com/m3db/m3/src/x/time" +) + +var timeZero = time.Time{} + +type readerSliceOfSlicesIterator struct { + segments []*rpc.Segments + blockReaders []xio.BlockReader + idx int + closed bool + pool *readerSliceOfSlicesIteratorPool +} + +func newReaderSliceOfSlicesIterator( + segments []*rpc.Segments, + pool *readerSliceOfSlicesIteratorPool, +) *readerSliceOfSlicesIterator { + it := &readerSliceOfSlicesIterator{pool: pool} + it.Reset(segments) + return it +} + +func (it *readerSliceOfSlicesIterator) Next() bool { + if !(it.idx+1 < len(it.segments)) { + return false + } + it.idx++ + + // Extend block readers if not enough available + currLen, start, blockSize := it.CurrentReaders() + if len(it.blockReaders) < currLen { + diff := currLen - len(it.blockReaders) + for i := 0; i < diff; i++ { + seg := ts.NewSegment(nil, nil, 0, ts.FinalizeNone) + sr := xio.NewSegmentReader(seg) + br := xio.BlockReader{ + SegmentReader: sr, + Start: start, + BlockSize: blockSize, + } + it.blockReaders = append(it.blockReaders, br) + } + } + + // Set the segment readers to reader from current segment pieces + segment := it.segments[it.idx] + if segment.Merged != nil { + it.resetReader(it.blockReaders[0], segment.Merged) + } else { + for i := 0; i < currLen; i++ { + it.resetReader(it.blockReaders[i], segment.Unmerged[i]) + } + } + + return true +} + +func (it *readerSliceOfSlicesIterator) resetReader( + r xio.BlockReader, + seg *rpc.Segment, +) { + rseg, err := r.Segment() + _, start, end := it.CurrentReaders() + + if err != nil { + r.ResetWindowed(ts.Segment{}, start, end) + return + } + + var ( + head = rseg.Head + tail = rseg.Tail + ) + if head == nil { + head = checked.NewBytes(seg.Head, nil) + head.IncRef() + } else { + head.Reset(seg.Head) + } + if tail == nil { + tail = checked.NewBytes(seg.Tail, nil) + tail.IncRef() + } else { + tail.Reset(seg.Tail) + } + + var checksum uint32 + if seg.Checksum != nil { + checksum = uint32(*seg.Checksum) + } + + newSeg := ts.NewSegment(head, tail, checksum, ts.FinalizeNone) + r.ResetWindowed(newSeg, start, end) +} + +func (it *readerSliceOfSlicesIterator) currentLen() int { + if it.segments[it.idx].Merged != nil { + return 1 + } + return len(it.segments[it.idx].Unmerged) +} + +func (it *readerSliceOfSlicesIterator) CurrentReaders() (int, time.Time, time.Duration) { + segments := it.segments[it.idx] + if segments.Merged != nil { + return 1, timeConvert(segments.Merged.StartTime), durationConvert(segments.Merged.BlockSize) + } + unmerged := it.currentLen() + if unmerged == 0 { + return 0, timeZero, 0 + } + return unmerged, timeConvert(segments.Unmerged[0].StartTime), durationConvert(segments.Unmerged[0].BlockSize) +} + +func timeConvert(ticks *int64) time.Time { + if ticks == nil { + return timeZero + } + return xtime.FromNormalizedTime(*ticks, time.Nanosecond) +} + +func durationConvert(duration *int64) time.Duration { + if duration == nil { + return 0 + } + return xtime.FromNormalizedDuration(*duration, time.Nanosecond) +} + +func (it *readerSliceOfSlicesIterator) CurrentReaderAt(idx int) xio.BlockReader { + if idx >= it.currentLen() { + return xio.EmptyBlockReader + } + return it.blockReaders[idx] +} + +func (it *readerSliceOfSlicesIterator) Close() { + if it.closed { + return + } + it.closed = true + // Release any refs to segments + it.segments = nil + // Release any refs to segment byte slices + for i := range it.blockReaders { + seg, err := it.blockReaders[i].Segment() + if err != nil { + continue + } + if seg.Head != nil { + seg.Head.Reset(nil) + } + if seg.Tail != nil { + seg.Tail.Reset(nil) + } + } + if pool := it.pool; pool != nil { + pool.Put(it) + } +} + +func (it *readerSliceOfSlicesIterator) Reset(segments []*rpc.Segments) { + it.segments = segments + it.resetIndex() + it.closed = false +} + +func (it *readerSliceOfSlicesIterator) Size() (int, error) { + size := 0 + for _, reader := range it.blockReaders { + seg, err := reader.Segment() + if err != nil { + return 0, err + } + size += seg.Len() + } + return size, nil +} + +func (it *readerSliceOfSlicesIterator) Rewind() { + it.resetIndex() +} + +func (it *readerSliceOfSlicesIterator) resetIndex() { + it.idx = -1 +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/reader_slice_of_slices_iterator_pool.go b/vendor/github.com/m3db/m3/src/dbnode/client/reader_slice_of_slices_iterator_pool.go new file mode 100644 index 00000000..295a4ca4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/reader_slice_of_slices_iterator_pool.go @@ -0,0 +1,48 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import "github.com/m3db/m3/src/x/pool" + +type readerSliceOfSlicesIteratorPool struct { + pool pool.ObjectPool +} + +func newReaderSliceOfSlicesIteratorPool( + opts pool.ObjectPoolOptions, +) *readerSliceOfSlicesIteratorPool { + p := pool.NewObjectPool(opts) + return &readerSliceOfSlicesIteratorPool{pool: p} +} + +func (p *readerSliceOfSlicesIteratorPool) Init() { + p.pool.Init(func() interface{} { + return newReaderSliceOfSlicesIterator(nil, p) + }) +} + +func (p *readerSliceOfSlicesIteratorPool) Get() *readerSliceOfSlicesIterator { + return p.pool.Get().(*readerSliceOfSlicesIterator) +} + +func (p *readerSliceOfSlicesIteratorPool) Put(it *readerSliceOfSlicesIterator) { + p.pool.Put(it) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/received_blocks_map_gen.go b/vendor/github.com/m3db/m3/src/dbnode/client/received_blocks_map_gen.go new file mode 100644 index 00000000..eb3aa385 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/received_blocks_map_gen.go @@ -0,0 +1,271 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package client + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// receivedBlocksMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type receivedBlocksMapHash uint64 + +// receivedBlocksMapHashFn is the hash function to execute when hashing a key. +type receivedBlocksMapHashFn func(idAndBlockStart) receivedBlocksMapHash + +// receivedBlocksMapEqualsFn is the equals key function to execute when detecting equality of a key. +type receivedBlocksMapEqualsFn func(idAndBlockStart, idAndBlockStart) bool + +// receivedBlocksMapCopyFn is the copy key function to execute when copying the key. +type receivedBlocksMapCopyFn func(idAndBlockStart) idAndBlockStart + +// receivedBlocksMapFinalizeFn is the finalize key function to execute when finished with a key. +type receivedBlocksMapFinalizeFn func(idAndBlockStart) + +// receivedBlocksMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// receivedBlocksMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type receivedBlocksMap struct { + _receivedBlocksMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[receivedBlocksMapHash]receivedBlocksMapEntry +} + +// _receivedBlocksMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _receivedBlocksMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash receivedBlocksMapHashFn + // equals is the equals key function to execute when detecting equality. + equals receivedBlocksMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy receivedBlocksMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize receivedBlocksMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// receivedBlocksMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type receivedBlocksMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _receivedBlocksMapKey + // value type stored + value receivedBlocks +} + +type _receivedBlocksMapKey struct { + key idAndBlockStart + finalize bool +} + +// Key returns the map entry key. +func (e receivedBlocksMapEntry) Key() idAndBlockStart { + return e.key.key +} + +// Value returns the map entry value. +func (e receivedBlocksMapEntry) Value() receivedBlocks { + return e.value +} + +// _receivedBlocksMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _receivedBlocksMapAlloc(opts _receivedBlocksMapOptions) *receivedBlocksMap { + m := &receivedBlocksMap{_receivedBlocksMapOptions: opts} + m.Reallocate() + return m +} + +func (m *receivedBlocksMap) newMapKey(k idAndBlockStart, opts _receivedBlocksMapKeyOptions) _receivedBlocksMapKey { + key := _receivedBlocksMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *receivedBlocksMap) removeMapKey(hash receivedBlocksMapHash, key _receivedBlocksMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *receivedBlocksMap) Get(k idAndBlockStart) (receivedBlocks, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty receivedBlocks + return empty, false +} + +// Set will set the value for an identifier. +func (m *receivedBlocksMap) Set(k idAndBlockStart, v receivedBlocks) { + m.set(k, v, _receivedBlocksMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// receivedBlocksMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type receivedBlocksMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *receivedBlocksMap) SetUnsafe(k idAndBlockStart, v receivedBlocks, opts receivedBlocksMapSetUnsafeOptions) { + m.set(k, v, _receivedBlocksMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _receivedBlocksMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *receivedBlocksMap) set(k idAndBlockStart, v receivedBlocks, opts _receivedBlocksMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = receivedBlocksMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = receivedBlocksMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *receivedBlocksMap) Iter() map[receivedBlocksMapHash]receivedBlocksMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *receivedBlocksMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *receivedBlocksMap) Contains(k idAndBlockStart) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *receivedBlocksMap) Delete(k idAndBlockStart) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *receivedBlocksMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *receivedBlocksMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[receivedBlocksMapHash]receivedBlocksMapEntry, m.initialSize) + } else { + m.lookup = make(map[receivedBlocksMapHash]receivedBlocksMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/received_blocks_new_map.go b/vendor/github.com/m3db/m3/src/dbnode/client/received_blocks_new_map.go new file mode 100644 index 00000000..7a323441 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/received_blocks_new_map.go @@ -0,0 +1,58 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + + "github.com/cespare/xxhash/v2" +) + +func newReceivedBlocksMap(pool pool.BytesPool) *receivedBlocksMap { + return _receivedBlocksMapAlloc(_receivedBlocksMapOptions{ + hash: func(k idAndBlockStart) receivedBlocksMapHash { + // NB(r): Similar to the standard composite key hashes for Java objects + hash := uint64(7) + hash = 31*hash + xxhash.Sum64(k.id.Bytes()) + hash = 31*hash + uint64(k.blockStart) + return receivedBlocksMapHash(hash) + }, + equals: func(x, y idAndBlockStart) bool { + return x.id.Equal(y.id) && x.blockStart == y.blockStart + }, + copy: func(k idAndBlockStart) idAndBlockStart { + bytes := k.id.Bytes() + keyLen := len(bytes) + pooled := pool.Get(keyLen)[:keyLen] + copy(pooled, bytes) + return idAndBlockStart{ + id: ident.BytesID(pooled), + blockStart: k.blockStart, + } + }, + finalize: func(k idAndBlockStart) { + if slice, ok := k.id.(ident.BytesID); ok { + pool.Put(slice) + } + }, + }) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/replicated_session.go b/vendor/github.com/m3db/m3/src/dbnode/client/replicated_session.go new file mode 100644 index 00000000..5b2f9519 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/replicated_session.go @@ -0,0 +1,349 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "fmt" + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" + "github.com/m3db/m3/src/dbnode/storage/index" + "github.com/m3db/m3/src/dbnode/topology" + "github.com/m3db/m3/src/x/ident" + m3sync "github.com/m3db/m3/src/x/sync" + xtime "github.com/m3db/m3/src/x/time" + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +type newSessionFn func(Options) (clientSession, error) + +// replicatedSession is an implementation of clientSession which replicates +// session read/writes to a set of clusters asynchronously. +type replicatedSession struct { + session clientSession + asyncSessions []clientSession + newSessionFn newSessionFn + workerPool m3sync.PooledWorkerPool + replicationSemaphore chan struct{} + scope tally.Scope + log *zap.Logger + metrics replicatedSessionMetrics + outCh chan error + writeTimestampOffset time.Duration +} + +type replicatedSessionMetrics struct { + replicateExecuted tally.Counter + replicateNotExecuted tally.Counter + replicateError tally.Counter + replicateSuccess tally.Counter +} + +func newReplicatedSessionMetrics(scope tally.Scope) replicatedSessionMetrics { + return replicatedSessionMetrics{ + replicateExecuted: scope.Counter("replicate.executed"), + replicateNotExecuted: scope.Counter("replicate.not-executed"), + replicateError: scope.Counter("replicate.error"), + replicateSuccess: scope.Counter("replicate.success"), + } +} + +// Ensure replicatedSession implements the clientSession interface. +var _ clientSession = (*replicatedSession)(nil) + +type replicatedSessionOption func(*replicatedSession) + +func withNewSessionFn(fn newSessionFn) replicatedSessionOption { + return func(session *replicatedSession) { + session.newSessionFn = fn + } +} + +func newReplicatedSession(opts Options, asyncOpts []Options, options ...replicatedSessionOption) (clientSession, error) { + workerPool := opts.AsyncWriteWorkerPool() + + scope := opts.InstrumentOptions().MetricsScope() + + session := replicatedSession{ + newSessionFn: newSession, + workerPool: workerPool, + replicationSemaphore: make(chan struct{}, opts.AsyncWriteMaxConcurrency()), + scope: scope, + log: opts.InstrumentOptions().Logger(), + metrics: newReplicatedSessionMetrics(scope), + writeTimestampOffset: opts.WriteTimestampOffset(), + } + + // Apply options + for _, option := range options { + option(&session) + } + + if err := session.setSession(opts); err != nil { + return nil, err + } + if err := session.setAsyncSessions(asyncOpts); err != nil { + return nil, err + } + + return &session, nil +} + +type writeFunc func(Session) error + +func (s *replicatedSession) setSession(opts Options) error { + if opts.TopologyInitializer() == nil { + return nil + } + + session, err := s.newSessionFn(opts) + if err != nil { + return err + } + s.session = session + return nil +} + +func (s *replicatedSession) setAsyncSessions(opts []Options) error { + sessions := make([]clientSession, 0, len(opts)) + for i, oo := range opts { + subscope := oo.InstrumentOptions().MetricsScope().SubScope(fmt.Sprintf("async-%d", i)) + oo = oo.SetInstrumentOptions(oo.InstrumentOptions().SetMetricsScope(subscope)) + + session, err := s.newSessionFn(oo) + if err != nil { + return err + } + sessions = append(sessions, session) + } + s.asyncSessions = sessions + return nil +} + +type replicatedParams struct { + namespace ident.ID + id ident.ID + t time.Time + value float64 + unit xtime.Unit + annotation []byte + tags ident.TagIterator + useTags bool +} + +// NB(srobb): it would be a nicer to accept a lambda which is the fn to +// be performed on all sessions, however this causes an extra allocation. +func (s replicatedSession) replicate(params replicatedParams) error { + for _, asyncSession := range s.asyncSessions { + asyncSession := asyncSession // capture var + select { + case s.replicationSemaphore <- struct{}{}: + s.workerPool.Go(func() { + var err error + if params.useTags { + err = asyncSession.WriteTagged(params.namespace, params.id, params.tags, params.t, params.value, params.unit, params.annotation) + } else { + err = asyncSession.Write(params.namespace, params.id, params.t, params.value, params.unit, params.annotation) + } + if err != nil { + s.metrics.replicateError.Inc(1) + s.log.Error("could not replicate write", zap.Error(err)) + } else { + s.metrics.replicateSuccess.Inc(1) + } + if s.outCh != nil { + s.outCh <- err + } + <-s.replicationSemaphore + }) + s.metrics.replicateExecuted.Inc(1) + default: + s.metrics.replicateNotExecuted.Inc(1) + } + } + + if params.useTags { + return s.session.WriteTagged(params.namespace, params.id, params.tags, params.t, params.value, params.unit, params.annotation) + } + return s.session.Write(params.namespace, params.id, params.t, params.value, params.unit, params.annotation) +} + +// Write value to the database for an ID. +func (s replicatedSession) Write(namespace, id ident.ID, t time.Time, value float64, unit xtime.Unit, annotation []byte) error { + return s.replicate(replicatedParams{ + namespace: namespace, + id: id, + t: t.Add(-s.writeTimestampOffset), + value: value, + unit: unit, + annotation: annotation, + }) +} + +// WriteTagged value to the database for an ID and given tags. +func (s replicatedSession) WriteTagged(namespace, id ident.ID, tags ident.TagIterator, t time.Time, value float64, unit xtime.Unit, annotation []byte) error { + return s.replicate(replicatedParams{ + namespace: namespace, + id: id, + t: t.Add(-s.writeTimestampOffset), + value: value, + unit: unit, + annotation: annotation, + tags: tags, + useTags: true, + }) +} + +// Fetch values from the database for an ID. +func (s replicatedSession) Fetch(namespace, id ident.ID, startInclusive, endExclusive time.Time) (encoding.SeriesIterator, error) { + return s.session.Fetch(namespace, id, startInclusive, endExclusive) +} + +// FetchIDs values from the database for a set of IDs. +func (s replicatedSession) FetchIDs(namespace ident.ID, ids ident.Iterator, startInclusive, endExclusive time.Time) (encoding.SeriesIterators, error) { + return s.session.FetchIDs(namespace, ids, startInclusive, endExclusive) +} + +// Aggregate aggregates values from the database for the given set of constraints. +func (s replicatedSession) Aggregate( + ns ident.ID, q index.Query, opts index.AggregationOptions, +) (AggregatedTagsIterator, FetchResponseMetadata, error) { + return s.session.Aggregate(ns, q, opts) +} + +// FetchTagged resolves the provided query to known IDs, and fetches the data for them. +func (s replicatedSession) FetchTagged(namespace ident.ID, q index.Query, opts index.QueryOptions) (encoding.SeriesIterators, FetchResponseMetadata, error) { + return s.session.FetchTagged(namespace, q, opts) +} + +// FetchTaggedIDs resolves the provided query to known IDs. +func (s replicatedSession) FetchTaggedIDs(namespace ident.ID, q index.Query, opts index.QueryOptions) (TaggedIDsIterator, FetchResponseMetadata, error) { + return s.session.FetchTaggedIDs(namespace, q, opts) +} + +// ShardID returns the given shard for an ID for callers +// to easily discern what shard is failing when operations +// for given IDs begin failing. +func (s replicatedSession) ShardID(id ident.ID) (uint32, error) { + return s.session.ShardID(id) +} + +// IteratorPools exposes the internal iterator pools used by the session to clients. +func (s replicatedSession) IteratorPools() (encoding.IteratorPools, error) { + return s.session.IteratorPools() +} + +// Close the session. +func (s replicatedSession) Close() error { + err := s.session.Close() + for _, as := range s.asyncSessions { + if err := as.Close(); err != nil { + s.log.Error("could not close async session: %v", zap.Error(err)) + } + } + return err +} + +// Origin returns the host that initiated the session. +func (s replicatedSession) Origin() topology.Host { + return s.session.Origin() +} + +// Replicas returns the replication factor. +func (s replicatedSession) Replicas() int { + return s.session.Replicas() +} + +// TopologyMap returns the current topology map. Note that the session +// has a separate topology watch than the database itself, so the two +// values can be out of sync and this method should not be relied upon +// if the current view of the topology as seen by the database is required. +func (s replicatedSession) TopologyMap() (topology.Map, error) { + return s.session.TopologyMap() +} + +// Truncate will truncate the namespace for a given shard. +func (s replicatedSession) Truncate(namespace ident.ID) (int64, error) { + return s.session.Truncate(namespace) +} + +// FetchBootstrapBlocksFromPeers will fetch the most fulfilled block +// for each series using the runtime configurable bootstrap level consistency. +func (s replicatedSession) FetchBootstrapBlocksFromPeers( + namespace namespace.Metadata, + shard uint32, + start, end time.Time, + opts result.Options, +) (result.ShardResult, error) { + return s.session.FetchBootstrapBlocksFromPeers(namespace, shard, start, end, opts) +} + +// FetchBootstrapBlocksMetadataFromPeers will fetch the blocks metadata from +// available peers using the runtime configurable bootstrap level consistency. +func (s replicatedSession) FetchBootstrapBlocksMetadataFromPeers( + namespace ident.ID, + shard uint32, + start, end time.Time, + result result.Options, +) (PeerBlockMetadataIter, error) { + return s.session.FetchBootstrapBlocksMetadataFromPeers(namespace, shard, start, end, result) +} + +// FetchBlocksMetadataFromPeers will fetch the blocks metadata from +// available peers. +func (s replicatedSession) FetchBlocksMetadataFromPeers( + namespace ident.ID, + shard uint32, + start, end time.Time, + consistencyLevel topology.ReadConsistencyLevel, + result result.Options, +) (PeerBlockMetadataIter, error) { + return s.session.FetchBlocksMetadataFromPeers(namespace, shard, start, end, consistencyLevel, result) +} + +// FetchBlocksFromPeers will fetch the required blocks from the +// peers specified. +func (s replicatedSession) FetchBlocksFromPeers( + namespace namespace.Metadata, + shard uint32, + consistencyLevel topology.ReadConsistencyLevel, + metadatas []block.ReplicaMetadata, + opts result.Options, +) (PeerBlocksIter, error) { + return s.session.FetchBlocksFromPeers(namespace, shard, consistencyLevel, metadatas, opts) +} + +// Open the client session. +func (s replicatedSession) Open() error { + if err := s.session.Open(); err != nil { + return err + } + for _, asyncSession := range s.asyncSessions { + if err := asyncSession.Open(); err != nil { + s.log.Error("could not open session to async cluster: %v", zap.Error(err)) + } + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/session.go b/vendor/github.com/m3db/m3/src/dbnode/client/session.go new file mode 100644 index 00000000..091dab45 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/session.go @@ -0,0 +1,4135 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "bytes" + "errors" + "fmt" + "math" + "sort" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/digest" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/convert" + "github.com/m3db/m3/src/dbnode/runtime" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" + "github.com/m3db/m3/src/dbnode/storage/index" + idxconvert "github.com/m3db/m3/src/dbnode/storage/index/convert" + "github.com/m3db/m3/src/dbnode/topology" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/dbnode/x/xpool" + "github.com/m3db/m3/src/x/checked" + xclose "github.com/m3db/m3/src/x/close" + "github.com/m3db/m3/src/x/context" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/pool" + xretry "github.com/m3db/m3/src/x/retry" + "github.com/m3db/m3/src/x/sampler" + "github.com/m3db/m3/src/x/serialize" + xsync "github.com/m3db/m3/src/x/sync" + xtime "github.com/m3db/m3/src/x/time" + + apachethrift "github.com/apache/thrift/lib/go/thrift" + "github.com/uber-go/tally" + "github.com/uber/tchannel-go/thrift" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +const ( + clusterConnectWaitInterval = 10 * time.Millisecond + blocksMetadataChannelInitialCapacity = 4096 + gaugeReportInterval = 500 * time.Millisecond + blockMetadataChBufSize = 4096 + shardResultCapacity = 4096 + hostNotAvailableMinSleepInterval = 1 * time.Millisecond + hostNotAvailableMaxSleepInterval = 100 * time.Millisecond +) + +type resultTypeEnum string + +const ( + resultTypeMetadata resultTypeEnum = "metadata" + resultTypeBootstrap = "bootstrap" + resultTypeRaw = "raw" +) + +var ( + errUnknownWriteAttemptType = errors.New( + "unknown write attempt type specified, internal error") +) + +var ( + // ErrClusterConnectTimeout is raised when connecting to the cluster and + // ensuring at least each partition has an up node with a connection to it + ErrClusterConnectTimeout = errors.New("timed out establishing min connections to cluster") + // errSessionStatusNotInitial is raised when trying to open a session and + // its not in the initial clean state + errSessionStatusNotInitial = errors.New("session not in initial state") + // errSessionStatusNotOpen is raised when operations are requested when the + // session is not in the open state + errSessionStatusNotOpen = errors.New("session not in open state") + // errSessionBadBlockResultFromPeer is raised when there is a bad block + // return from a peer when fetching blocks from peers + errSessionBadBlockResultFromPeer = errors.New("session fetched bad block result from peer") + // errSessionInvalidConnectClusterConnectConsistencyLevel is raised when + // the connect consistency level specified is not recognized + errSessionInvalidConnectClusterConnectConsistencyLevel = errors.New("session has invalid connect consistency level specified") + // errSessionHasNoHostQueueForHost is raised when host queue requested for a missing host + errSessionHasNoHostQueueForHost = newHostNotAvailableError(errors.New("session has no host queue for host")) + // errUnableToEncodeTags is raised when the server is unable to encode provided tags + // to be sent over the wire. + errUnableToEncodeTags = errors.New("unable to include tags") + // errEnqueueChIsClosed is returned when attempting to use a closed enqueuCh. + errEnqueueChIsClosed = errors.New("error enqueueCh is cosed") +) + +// sessionState is volatile state that is protected by a +// read/write mutex +type sessionState struct { + sync.RWMutex + + status status + + writeLevel topology.ConsistencyLevel + readLevel topology.ReadConsistencyLevel + bootstrapLevel topology.ReadConsistencyLevel + + queues []hostQueue + queuesByHostID map[string]hostQueue + topo topology.Topology + topoMap topology.Map + topoWatch topology.MapWatch + replicas int + majority int +} + +type session struct { + state sessionState + opts Options + runtimeOptsListenerCloser xclose.Closer + scope tally.Scope + nowFn clock.NowFn + log *zap.Logger + logWriteErrorSampler *sampler.Sampler + logFetchErrorSampler *sampler.Sampler + newHostQueueFn newHostQueueFn + writeRetrier xretry.Retrier + fetchRetrier xretry.Retrier + streamBlocksRetrier xretry.Retrier + pools sessionPools + fetchBatchSize int + newPeerBlocksQueueFn newPeerBlocksQueueFn + reattemptStreamBlocksFromPeersFn reattemptStreamBlocksFromPeersFn + pickBestPeerFn pickBestPeerFn + origin topology.Host + streamBlocksMaxBlockRetries int + streamBlocksWorkers xsync.WorkerPool + streamBlocksBatchSize int + streamBlocksMetadataBatchTimeout time.Duration + streamBlocksBatchTimeout time.Duration + writeShardsInitializing bool + shardsLeavingCountTowardsConsistency bool + metrics sessionMetrics +} + +type shardMetricsKey struct { + shardID uint32 + resultType resultTypeEnum +} + +type sessionMetrics struct { + sync.RWMutex + writeSuccess tally.Counter + writeErrorsBadRequest tally.Counter + writeErrorsInternalError tally.Counter + writeLatencyHistogram tally.Histogram + writeNodesRespondingErrors []tally.Counter + writeNodesRespondingBadRequestErrors []tally.Counter + fetchSuccess tally.Counter + fetchErrorsBadRequest tally.Counter + fetchErrorsInternalError tally.Counter + fetchLatencyHistogram tally.Histogram + fetchNodesRespondingErrors []tally.Counter + fetchNodesRespondingBadRequestErrors []tally.Counter + topologyUpdatedSuccess tally.Counter + topologyUpdatedError tally.Counter + streamFromPeersMetrics map[shardMetricsKey]streamFromPeersMetrics +} + +func newSessionMetrics(scope tally.Scope) sessionMetrics { + return sessionMetrics{ + writeSuccess: scope.Counter("write.success"), + writeErrorsBadRequest: scope.Tagged(map[string]string{ + "error_type": "bad_request", + }).Counter("write.errors"), + writeErrorsInternalError: scope.Tagged(map[string]string{ + "error_type": "internal_error", + }).Counter("write.errors"), + writeLatencyHistogram: histogramWithDurationBuckets(scope, "write.latency"), + fetchSuccess: scope.Counter("fetch.success"), + fetchErrorsBadRequest: scope.Tagged(map[string]string{ + "error_type": "bad_request", + }).Counter("fetch.errors"), + fetchErrorsInternalError: scope.Tagged(map[string]string{ + "error_type": "internal_error", + }).Counter("fetch.errors"), + fetchLatencyHistogram: histogramWithDurationBuckets(scope, "fetch.latency"), + topologyUpdatedSuccess: scope.Counter("topology.updated-success"), + topologyUpdatedError: scope.Counter("topology.updated-error"), + streamFromPeersMetrics: make(map[shardMetricsKey]streamFromPeersMetrics), + } +} + +type streamFromPeersMetrics struct { + fetchBlocksFromPeers tally.Gauge + metadataFetches tally.Gauge + metadataFetchBatchCall tally.Counter + metadataFetchBatchSuccess tally.Counter + metadataFetchBatchError tally.Counter + metadataFetchBatchBlockErr tally.Counter + metadataReceived tally.Counter + metadataPeerRetry tally.Counter + fetchBlockSuccess tally.Counter + fetchBlockError tally.Counter + fetchBlockFullRetry tally.Counter + fetchBlockFinalError tally.Counter + fetchBlockRetriesReqError tally.Counter + fetchBlockRetriesRespError tally.Counter + fetchBlockRetriesConsistencyLevelNotAchievedError tally.Counter + blocksEnqueueChannel tally.Gauge +} + +type hostQueueOpts struct { + writeBatchRawRequestPool writeBatchRawRequestPool + writeBatchRawV2RequestPool writeBatchRawV2RequestPool + writeBatchRawRequestElementArrayPool writeBatchRawRequestElementArrayPool + writeBatchRawV2RequestElementArrayPool writeBatchRawV2RequestElementArrayPool + writeTaggedBatchRawRequestPool writeTaggedBatchRawRequestPool + writeTaggedBatchRawV2RequestPool writeTaggedBatchRawV2RequestPool + writeTaggedBatchRawRequestElementArrayPool writeTaggedBatchRawRequestElementArrayPool + writeTaggedBatchRawV2RequestElementArrayPool writeTaggedBatchRawV2RequestElementArrayPool + fetchBatchRawV2RequestPool fetchBatchRawV2RequestPool + fetchBatchRawV2RequestElementArrayPool fetchBatchRawV2RequestElementArrayPool + opts Options +} + +type newHostQueueFn func( + host topology.Host, + hostQueueOpts hostQueueOpts, +) (hostQueue, error) + +func newSession(opts Options) (clientSession, error) { + topo, err := opts.TopologyInitializer().Init() + if err != nil { + return nil, err + } + + logWriteErrorSampler, err := sampler.NewSampler(opts.LogErrorSampleRate()) + if err != nil { + return nil, err + } + + logFetchErrorSampler, err := sampler.NewSampler(opts.LogErrorSampleRate()) + if err != nil { + return nil, err + } + + scope := opts.InstrumentOptions().MetricsScope() + + s := &session{ + state: sessionState{ + writeLevel: opts.WriteConsistencyLevel(), + readLevel: opts.ReadConsistencyLevel(), + queuesByHostID: make(map[string]hostQueue), + topo: topo, + }, + opts: opts, + scope: scope, + nowFn: opts.ClockOptions().NowFn(), + log: opts.InstrumentOptions().Logger(), + logWriteErrorSampler: logWriteErrorSampler, + logFetchErrorSampler: logFetchErrorSampler, + newHostQueueFn: newHostQueue, + fetchBatchSize: opts.FetchBatchSize(), + newPeerBlocksQueueFn: newPeerBlocksQueue, + writeRetrier: opts.WriteRetrier(), + fetchRetrier: opts.FetchRetrier(), + pools: sessionPools{ + context: opts.ContextPool(), + id: opts.IdentifierPool(), + }, + writeShardsInitializing: opts.WriteShardsInitializing(), + shardsLeavingCountTowardsConsistency: opts.ShardsLeavingCountTowardsConsistency(), + metrics: newSessionMetrics(scope), + } + s.reattemptStreamBlocksFromPeersFn = s.streamBlocksReattemptFromPeers + s.pickBestPeerFn = s.streamBlocksPickBestPeer + writeAttemptPoolOpts := pool.NewObjectPoolOptions(). + SetSize(opts.WriteOpPoolSize()). + SetInstrumentOptions(opts.InstrumentOptions().SetMetricsScope( + scope.SubScope("write-attempt-pool"), + )) + s.pools.writeAttempt = newWriteAttemptPool(s, writeAttemptPoolOpts) + s.pools.writeAttempt.Init() + + fetchAttemptPoolOpts := pool.NewObjectPoolOptions(). + SetSize(opts.FetchBatchOpPoolSize()). + SetInstrumentOptions(opts.InstrumentOptions().SetMetricsScope( + scope.SubScope("fetch-attempt-pool"), + )) + s.pools.fetchAttempt = newFetchAttemptPool(s, fetchAttemptPoolOpts) + s.pools.fetchAttempt.Init() + + fetchTaggedAttemptPoolImplOpts := pool.NewObjectPoolOptions(). + SetSize(opts.FetchBatchOpPoolSize()). + SetInstrumentOptions(opts.InstrumentOptions().SetMetricsScope( + scope.SubScope("fetch-tagged-attempt-pool"), + )) + s.pools.fetchTaggedAttempt = newFetchTaggedAttemptPool(s, fetchTaggedAttemptPoolImplOpts) + s.pools.fetchTaggedAttempt.Init() + + aggregateAttemptPoolImplOpts := pool.NewObjectPoolOptions(). + SetSize(opts.FetchBatchOpPoolSize()). + SetInstrumentOptions(opts.InstrumentOptions().SetMetricsScope( + scope.SubScope("aggregate-attempt-pool"), + )) + s.pools.aggregateAttempt = newAggregateAttemptPool(s, aggregateAttemptPoolImplOpts) + s.pools.aggregateAttempt.Init() + + tagEncoderPoolOpts := pool.NewObjectPoolOptions(). + SetSize(opts.TagEncoderPoolSize()). + SetInstrumentOptions(opts.InstrumentOptions().SetMetricsScope( + scope.SubScope("tag-encoder-pool"), + )) + s.pools.tagEncoder = serialize.NewTagEncoderPool(opts.TagEncoderOptions(), tagEncoderPoolOpts) + s.pools.tagEncoder.Init() + + tagDecoderPoolOpts := pool.NewObjectPoolOptions(). + SetSize(opts.TagDecoderPoolSize()). + SetInstrumentOptions(opts.InstrumentOptions().SetMetricsScope( + scope.SubScope("tag-decoder-pool"), + )) + s.pools.tagDecoder = serialize.NewTagDecoderPool(opts.TagDecoderOptions(), tagDecoderPoolOpts) + s.pools.tagDecoder.Init() + + wrapperPoolOpts := pool.NewObjectPoolOptions(). + SetSize(opts.CheckedBytesWrapperPoolSize()). + SetInstrumentOptions(opts.InstrumentOptions().SetMetricsScope( + scope.SubScope("client-checked-bytes-wrapper-pool"))) + s.pools.checkedBytesWrapper = xpool.NewCheckedBytesWrapperPool(wrapperPoolOpts) + s.pools.checkedBytesWrapper.Init() + + if opts, ok := opts.(AdminOptions); ok { + s.state.bootstrapLevel = opts.BootstrapConsistencyLevel() + s.origin = opts.Origin() + s.streamBlocksMaxBlockRetries = opts.FetchSeriesBlocksMaxBlockRetries() + s.streamBlocksWorkers = xsync.NewWorkerPool(opts.FetchSeriesBlocksBatchConcurrency()) + s.streamBlocksWorkers.Init() + s.streamBlocksBatchSize = opts.FetchSeriesBlocksBatchSize() + s.streamBlocksMetadataBatchTimeout = opts.FetchSeriesBlocksMetadataBatchTimeout() + s.streamBlocksBatchTimeout = opts.FetchSeriesBlocksBatchTimeout() + s.streamBlocksRetrier = opts.StreamBlocksRetrier() + } + + if runtimeOptsMgr := opts.RuntimeOptionsManager(); runtimeOptsMgr != nil { + runtimeOptsMgr.RegisterListener(s) + } + + return s, nil +} + +func (s *session) SetRuntimeOptions(value runtime.Options) { + s.state.Lock() + s.state.bootstrapLevel = value.ClientBootstrapConsistencyLevel() + s.state.readLevel = value.ClientReadConsistencyLevel() + s.state.writeLevel = value.ClientWriteConsistencyLevel() + s.state.Unlock() +} + +func (s *session) ShardID(id ident.ID) (uint32, error) { + s.state.RLock() + if s.state.status != statusOpen { + s.state.RUnlock() + return 0, errSessionStatusNotOpen + } + value := s.state.topoMap.ShardSet().Lookup(id) + s.state.RUnlock() + return value, nil +} + +// newPeerMetadataStreamingProgressMetrics returns a struct with an embedded +// list of fields that can be used to emit metrics about the current state of +// the peer metadata streaming process +func (s *session) newPeerMetadataStreamingProgressMetrics( + shard uint32, + resultType resultTypeEnum, +) *streamFromPeersMetrics { + mKey := shardMetricsKey{shardID: shard, resultType: resultType} + s.metrics.RLock() + m, ok := s.metrics.streamFromPeersMetrics[mKey] + s.metrics.RUnlock() + + if ok { + return &m + } + + scope := s.opts.InstrumentOptions().MetricsScope() + + s.metrics.Lock() + m, ok = s.metrics.streamFromPeersMetrics[mKey] + if ok { + s.metrics.Unlock() + return &m + } + scope = scope.SubScope("stream-from-peers").Tagged(map[string]string{ + "shard": fmt.Sprintf("%d", shard), + "resultType": string(resultType), + }) + m = streamFromPeersMetrics{ + fetchBlocksFromPeers: scope.Gauge("fetch-blocks-inprogress"), + metadataFetches: scope.Gauge("fetch-metadata-peers-inprogress"), + metadataFetchBatchCall: scope.Counter("fetch-metadata-peers-batch-call"), + metadataFetchBatchSuccess: scope.Counter("fetch-metadata-peers-batch-success"), + metadataFetchBatchError: scope.Counter("fetch-metadata-peers-batch-error"), + metadataFetchBatchBlockErr: scope.Counter("fetch-metadata-peers-batch-block-err"), + metadataReceived: scope.Counter("fetch-metadata-peers-received"), + metadataPeerRetry: scope.Counter("fetch-metadata-peers-peer-retry"), + fetchBlockSuccess: scope.Counter("fetch-block-success"), + fetchBlockError: scope.Counter("fetch-block-error"), + fetchBlockFinalError: scope.Counter("fetch-block-final-error"), + fetchBlockFullRetry: scope.Counter("fetch-block-full-retry"), + fetchBlockRetriesReqError: scope.Tagged(map[string]string{ + "reason": "request-error", + }).Counter("fetch-block-retries"), + fetchBlockRetriesRespError: scope.Tagged(map[string]string{ + "reason": "response-error", + }).Counter("fetch-block-retries"), + fetchBlockRetriesConsistencyLevelNotAchievedError: scope.Tagged(map[string]string{ + "reason": "consistency-level-not-achieved-error", + }).Counter("fetch-block-retries"), + blocksEnqueueChannel: scope.Gauge("fetch-blocks-enqueue-channel-length"), + } + s.metrics.streamFromPeersMetrics[mKey] = m + s.metrics.Unlock() + return &m +} + +func (s *session) recordWriteMetrics(consistencyResultErr error, respErrs int32, start time.Time) { + if idx := s.nodesRespondingErrorsMetricIndex(respErrs); idx >= 0 { + if IsBadRequestError(consistencyResultErr) { + s.metrics.writeNodesRespondingBadRequestErrors[idx].Inc(1) + } else { + s.metrics.writeNodesRespondingErrors[idx].Inc(1) + } + } + if consistencyResultErr == nil { + s.metrics.writeSuccess.Inc(1) + } else if IsBadRequestError(consistencyResultErr) { + s.metrics.writeErrorsBadRequest.Inc(1) + } else { + s.metrics.writeErrorsInternalError.Inc(1) + } + s.metrics.writeLatencyHistogram.RecordDuration(s.nowFn().Sub(start)) + + if consistencyResultErr != nil && s.logWriteErrorSampler.Sample() { + s.log.Error("m3db client write error occurred", + zap.Float64("sampleRateLog", s.logWriteErrorSampler.SampleRate().Value()), + zap.Error(consistencyResultErr)) + } +} + +func (s *session) recordFetchMetrics(consistencyResultErr error, respErrs int32, start time.Time) { + if idx := s.nodesRespondingErrorsMetricIndex(respErrs); idx >= 0 { + if IsBadRequestError(consistencyResultErr) { + s.metrics.fetchNodesRespondingBadRequestErrors[idx].Inc(1) + } else { + s.metrics.fetchNodesRespondingErrors[idx].Inc(1) + } + } + if consistencyResultErr == nil { + s.metrics.fetchSuccess.Inc(1) + } else if IsBadRequestError(consistencyResultErr) { + s.metrics.fetchErrorsBadRequest.Inc(1) + } else { + s.metrics.fetchErrorsInternalError.Inc(1) + } + s.metrics.fetchLatencyHistogram.RecordDuration(s.nowFn().Sub(start)) + + if consistencyResultErr != nil && s.logFetchErrorSampler.Sample() { + s.log.Error("m3db client fetch error occurred", + zap.Float64("sampleRateLog", s.logFetchErrorSampler.SampleRate().Value()), + zap.Error(consistencyResultErr)) + } +} + +func (s *session) nodesRespondingErrorsMetricIndex(respErrs int32) int32 { + idx := respErrs - 1 + replicas := int32(s.Replicas()) + if respErrs > replicas { + // Cap to the max replicas, we might get more errors + // when a node is initializing a shard causing replicas + 1 + // nodes to respond to operations + idx = replicas - 1 + } + return idx +} + +func (s *session) Open() error { + s.state.Lock() + if s.state.status != statusNotOpen { + s.state.Unlock() + return errSessionStatusNotInitial + } + + watch, err := s.state.topo.Watch() + if err != nil { + s.state.Unlock() + return err + } + + // Wait for the topology to be available + <-watch.C() + + topoMap := watch.Get() + + queues, replicas, majority, err := s.hostQueues(topoMap, nil) + if err != nil { + s.state.Unlock() + return err + } + s.setTopologyWithLock(topoMap, queues, replicas, majority) + s.state.topoWatch = watch + + // NB(r): Alloc pools that can take some time in Open, expectation + // is already that Open will take some time + writeOperationPoolOpts := pool.NewObjectPoolOptions(). + SetSize(s.opts.WriteOpPoolSize()). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("write-op-pool"), + )) + s.pools.writeOperation = newWriteOperationPool(writeOperationPoolOpts) + s.pools.writeOperation.Init() + + writeTaggedOperationPoolOpts := pool.NewObjectPoolOptions(). + SetSize(s.opts.WriteTaggedOpPoolSize()). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("write-op-tagged-pool"), + )) + s.pools.writeTaggedOperation = newWriteTaggedOpPool(writeTaggedOperationPoolOpts) + s.pools.writeTaggedOperation.Init() + + writeStatePoolSize := s.opts.WriteOpPoolSize() + if s.opts.WriteTaggedOpPoolSize() > writeStatePoolSize { + writeStatePoolSize = s.opts.WriteTaggedOpPoolSize() + } + writeStatePoolOpts := pool.NewObjectPoolOptions(). + SetSize(writeStatePoolSize). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("write-state-pool"), + )) + s.pools.writeState = newWriteStatePool(s.pools.tagEncoder, writeStatePoolOpts) + s.pools.writeState.Init() + + fetchBatchOpPoolOpts := pool.NewObjectPoolOptions(). + SetSize(s.opts.FetchBatchOpPoolSize()). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("fetch-batch-op-pool"), + )) + s.pools.fetchBatchOp = newFetchBatchOpPool(fetchBatchOpPoolOpts, s.fetchBatchSize) + s.pools.fetchBatchOp.Init() + + fetchTaggedOpPoolOpts := pool.NewObjectPoolOptions(). + SetSize(s.opts.FetchBatchOpPoolSize()). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("fetch-tagged-op-pool"), + )) + s.pools.fetchTaggedOp = newFetchTaggedOpPool(fetchTaggedOpPoolOpts) + s.pools.fetchTaggedOp.Init() + + aggregateOpPoolOpts := pool.NewObjectPoolOptions(). + SetSize(s.opts.FetchBatchOpPoolSize()). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("aggregate-op-pool"), + )) + s.pools.aggregateOp = newAggregateOpPool(aggregateOpPoolOpts) + s.pools.aggregateOp.Init() + + fetchStatePoolOpts := pool.NewObjectPoolOptions(). + SetSize(s.opts.FetchBatchOpPoolSize()). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("fetch-tagged-state-pool"), + )) + s.pools.fetchState = newFetchStatePool(fetchStatePoolOpts) + s.pools.fetchState.Init() + + seriesIteratorPoolOpts := pool.NewObjectPoolOptions(). + SetSize(s.opts.SeriesIteratorPoolSize()). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("series-iterator-pool"), + )) + s.pools.seriesIterator = encoding.NewSeriesIteratorPool(seriesIteratorPoolOpts) + s.pools.seriesIterator.Init() + s.pools.seriesIterators = encoding.NewMutableSeriesIteratorsPool(s.opts.SeriesIteratorArrayPoolBuckets()) + s.pools.seriesIterators.Init() + s.state.status = statusOpen + s.state.Unlock() + + go func() { + for range watch.C() { + s.log.Info("received update for topology") + topoMap := watch.Get() + + s.state.RLock() + existingQueues := s.state.queues + s.state.RUnlock() + + queues, replicas, majority, err := s.hostQueues(topoMap, existingQueues) + if err != nil { + s.log.Error("could not update topology map", zap.Error(err)) + s.metrics.topologyUpdatedError.Inc(1) + continue + } + s.state.Lock() + s.setTopologyWithLock(topoMap, queues, replicas, majority) + s.state.Unlock() + s.metrics.topologyUpdatedSuccess.Inc(1) + } + }() + + return nil +} + +func (s *session) BorrowConnection(hostID string, fn withConnectionFn) error { + s.state.RLock() + unlocked := false + queue, ok := s.state.queuesByHostID[hostID] + if !ok { + s.state.RUnlock() + return errSessionHasNoHostQueueForHost + } + err := queue.BorrowConnection(func(c rpc.TChanNode) { + // Unlock early on success + s.state.RUnlock() + unlocked = true + + // Execute function with borrowed connection + fn(c) + }) + if !unlocked { + s.state.RUnlock() + } + return err +} + +func (s *session) hostQueues( + topoMap topology.Map, + existing []hostQueue, +) ([]hostQueue, int, int, error) { + // NB(r): we leave existing writes in the host queues to finish + // as they are already enroute to their destination. This is an edge case + // that might result in leaving nodes counting towards quorum, but fixing it + // would result in additional chatter. + + start := s.nowFn() + + existingByHostID := make(map[string]hostQueue, len(existing)) + for _, queue := range existing { + existingByHostID[queue.Host().ID()] = queue + } + + hosts := topoMap.Hosts() + queues := make([]hostQueue, 0, len(hosts)) + newQueues := make([]hostQueue, 0, len(hosts)) + for _, host := range hosts { + if existingQueue, ok := existingByHostID[host.ID()]; ok { + queues = append(queues, existingQueue) + continue + } + newQueue, err := s.newHostQueue(host, topoMap) + if err != nil { + return nil, 0, 0, err + } + queues = append(queues, newQueue) + newQueues = append(newQueues, newQueue) + } + + shards := topoMap.ShardSet().AllIDs() + minConnectionCount := s.opts.MinConnectionCount() + replicas := topoMap.Replicas() + majority := topoMap.MajorityReplicas() + + firstConnectConsistencyLevel := s.opts.ClusterConnectConsistencyLevel() + if firstConnectConsistencyLevel == topology.ConnectConsistencyLevelNone { + // Return immediately if no connect consistency required + return queues, replicas, majority, nil + } + + connectConsistencyLevel := firstConnectConsistencyLevel + if connectConsistencyLevel == topology.ConnectConsistencyLevelAny { + // If level any specified, first attempt all then proceed lowering requirement + connectConsistencyLevel = topology.ConnectConsistencyLevelAll + } + + // Abort if we do not connect + connected := false + defer func() { + if !connected { + for _, queue := range newQueues { + queue.Close() + } + } + }() + + for { + if now := s.nowFn(); now.Sub(start) >= s.opts.ClusterConnectTimeout() { + switch firstConnectConsistencyLevel { + case topology.ConnectConsistencyLevelAny: + // If connecting with connect any strategy then keep + // trying but lower consistency requirement + start = now + connectConsistencyLevel-- + if connectConsistencyLevel == topology.ConnectConsistencyLevelNone { + // Already tried to resolve all consistency requirements, just + // return successfully at this point + err := fmt.Errorf("timed out connecting, returning success") + s.log.Warn("cluster connect with consistency any", zap.Error(err)) + connected = true + return queues, replicas, majority, nil + } + default: + // Timed out connecting to a specific consistency requirement + return nil, 0, 0, ErrClusterConnectTimeout + } + } + // Be optimistic + clusterAvailable := true + for _, shardID := range shards { + shardReplicasAvailable := 0 + routeErr := topoMap.RouteShardForEach(shardID, func(idx int, _ shard.Shard, _ topology.Host) { + if queues[idx].ConnectionCount() >= minConnectionCount { + shardReplicasAvailable++ + } + }) + if routeErr != nil { + return nil, 0, 0, routeErr + } + var clusterAvailableForShard bool + switch connectConsistencyLevel { + case topology.ConnectConsistencyLevelAll: + clusterAvailableForShard = shardReplicasAvailable == replicas + case topology.ConnectConsistencyLevelMajority: + clusterAvailableForShard = shardReplicasAvailable >= majority + case topology.ConnectConsistencyLevelOne: + clusterAvailableForShard = shardReplicasAvailable > 0 + default: + return nil, 0, 0, errSessionInvalidConnectClusterConnectConsistencyLevel + } + if !clusterAvailableForShard { + clusterAvailable = false + break + } + } + if clusterAvailable { // All done + break + } + time.Sleep(clusterConnectWaitInterval) + } + + connected = true + return queues, replicas, majority, nil +} + +func (s *session) setTopologyWithLock(topoMap topology.Map, queues []hostQueue, replicas, majority int) { + prevQueues := s.state.queues + + newQueuesByHostID := make(map[string]hostQueue, len(queues)) + for _, queue := range queues { + newQueuesByHostID[queue.Host().ID()] = queue + } + + s.state.queues = queues + s.state.queuesByHostID = newQueuesByHostID + + s.state.topoMap = topoMap + + s.state.replicas = replicas + s.state.majority = majority + + // If the number of hostQueues has changed then we need to recreate the fetch + // batch op array pool as it must be the exact length of the queues as we index + // directly into the return array in fetch calls. + if len(queues) != len(prevQueues) { + poolOpts := pool.NewObjectPoolOptions(). + SetSize(s.opts.FetchBatchOpPoolSize()). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("fetch-batch-op-array-array-pool"), + )) + s.pools.fetchBatchOpArrayArray = newFetchBatchOpArrayArrayPool( + poolOpts, + len(queues), + s.opts.FetchBatchOpPoolSize()/len(queues)) + s.pools.fetchBatchOpArrayArray.Init() + } + + if s.pools.multiReaderIteratorArray == nil { + s.pools.multiReaderIteratorArray = encoding.NewMultiReaderIteratorArrayPool([]pool.Bucket{ + pool.Bucket{ + Capacity: replicas, + Count: s.opts.SeriesIteratorPoolSize(), + }, + }) + s.pools.multiReaderIteratorArray.Init() + } + if s.pools.readerSliceOfSlicesIterator == nil { + size := replicas * s.opts.SeriesIteratorPoolSize() + poolOpts := pool.NewObjectPoolOptions(). + SetSize(size). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("reader-slice-of-slices-iterator-pool"), + )) + s.pools.readerSliceOfSlicesIterator = newReaderSliceOfSlicesIteratorPool(poolOpts) + s.pools.readerSliceOfSlicesIterator.Init() + } + if s.pools.multiReaderIterator == nil { + size := replicas * s.opts.SeriesIteratorPoolSize() + poolOpts := pool.NewObjectPoolOptions(). + SetSize(size). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("multi-reader-iterator-pool"), + )) + s.pools.multiReaderIterator = encoding.NewMultiReaderIteratorPool(poolOpts) + s.pools.multiReaderIterator.Init(s.opts.ReaderIteratorAllocate()) + } + if replicas > len(s.metrics.writeNodesRespondingErrors) { + curr := len(s.metrics.writeNodesRespondingErrors) + for i := curr; i < replicas; i++ { + tags := map[string]string{"nodes": fmt.Sprintf("%d", i+1)} + name := "write.nodes-responding-error" + serverErrsSubScope := s.scope.Tagged(tags).Tagged(map[string]string{ + "error_type": "server_error", + }) + badRequestErrsSubScope := s.scope.Tagged(tags).Tagged(map[string]string{ + "error_type": "bad_request_error", + }) + s.metrics.writeNodesRespondingErrors = + append(s.metrics.writeNodesRespondingErrors, serverErrsSubScope.Counter(name)) + s.metrics.writeNodesRespondingBadRequestErrors = + append(s.metrics.writeNodesRespondingBadRequestErrors, badRequestErrsSubScope.Counter(name)) + } + } + if replicas > len(s.metrics.fetchNodesRespondingErrors) { + curr := len(s.metrics.fetchNodesRespondingErrors) + for i := curr; i < replicas; i++ { + tags := map[string]string{"nodes": fmt.Sprintf("%d", i+1)} + name := "fetch.nodes-responding-error" + serverErrsSubScope := s.scope.Tagged(tags).Tagged(map[string]string{ + "error_type": "server_error", + }) + badRequestErrsSubScope := s.scope.Tagged(tags).Tagged(map[string]string{ + "error_type": "bad_request_error", + }) + s.metrics.fetchNodesRespondingErrors = + append(s.metrics.fetchNodesRespondingErrors, serverErrsSubScope.Counter(name)) + s.metrics.fetchNodesRespondingBadRequestErrors = + append(s.metrics.fetchNodesRespondingBadRequestErrors, badRequestErrsSubScope.Counter(name)) + } + } + + // Asynchronously close the set of host queues no longer in use + go func() { + for _, queue := range prevQueues { + newQueue, ok := newQueuesByHostID[queue.Host().ID()] + if !ok || newQueue != queue { + queue.Close() + } + } + }() + + s.log.Info("successfully updated topology", zap.Int("numHosts", topoMap.HostsLen())) +} + +func (s *session) newHostQueue(host topology.Host, topoMap topology.Map) (hostQueue, error) { + // NB(r): Due to hosts being replicas we have: + // = replica * numWrites + // = total writes to all hosts + // We need to pool: + // = replica * (numWrites / writeBatchSize) + // = number of batch request structs to pool + // For purposes of simplifying the options for pooling the write op pool size + // represents the number of ops to pool not including replication, this is due + // to the fact that the ops are shared between the different host queue replicas. + writeOpPoolSize := s.opts.WriteOpPoolSize() + if s.opts.WriteTaggedOpPoolSize() > writeOpPoolSize { + writeOpPoolSize = s.opts.WriteTaggedOpPoolSize() + } + totalBatches := topoMap.Replicas() * + int(math.Ceil(float64(writeOpPoolSize)/float64(s.opts.WriteBatchSize()))) + hostBatches := int(math.Ceil(float64(totalBatches) / float64(topoMap.HostsLen()))) + + writeBatchRequestPoolOpts := pool.NewObjectPoolOptions(). + SetSize(hostBatches). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("write-batch-request-pool"), + )) + writeBatchRequestPool := newWriteBatchRawRequestPool(writeBatchRequestPoolOpts) + writeBatchRequestPool.Init() + writeBatchV2RequestPool := newWriteBatchRawV2RequestPool(writeBatchRequestPoolOpts) + writeBatchV2RequestPool.Init() + + writeTaggedBatchRequestPoolOpts := pool.NewObjectPoolOptions(). + SetSize(hostBatches). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("write-tagged-batch-request-pool"), + )) + writeTaggedBatchRequestPool := newWriteTaggedBatchRawRequestPool(writeTaggedBatchRequestPoolOpts) + writeTaggedBatchRequestPool.Init() + writeTaggedBatchV2RequestPool := newWriteTaggedBatchRawV2RequestPool(writeBatchRequestPoolOpts) + writeTaggedBatchV2RequestPool.Init() + + writeBatchRawRequestElementArrayPoolOpts := pool.NewObjectPoolOptions(). + SetSize(hostBatches). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("id-datapoint-array-pool"), + )) + writeBatchRawRequestElementArrayPool := newWriteBatchRawRequestElementArrayPool( + writeBatchRawRequestElementArrayPoolOpts, s.opts.WriteBatchSize()) + writeBatchRawRequestElementArrayPool.Init() + writeBatchRawV2RequestElementArrayPool := newWriteBatchRawV2RequestElementArrayPool( + writeBatchRawRequestElementArrayPoolOpts, s.opts.WriteBatchSize()) + writeBatchRawV2RequestElementArrayPool.Init() + + writeTaggedBatchRawRequestElementArrayPoolOpts := pool.NewObjectPoolOptions(). + SetSize(hostBatches). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("id-tagged-datapoint-array-pool"), + )) + writeTaggedBatchRawRequestElementArrayPool := newWriteTaggedBatchRawRequestElementArrayPool( + writeTaggedBatchRawRequestElementArrayPoolOpts, s.opts.WriteBatchSize()) + writeTaggedBatchRawRequestElementArrayPool.Init() + writeTaggedBatchRawV2RequestElementArrayPool := newWriteTaggedBatchRawV2RequestElementArrayPool( + writeTaggedBatchRawRequestElementArrayPoolOpts, s.opts.WriteBatchSize()) + writeTaggedBatchRawV2RequestElementArrayPool.Init() + + fetchBatchRawV2RequestPoolOpts := pool.NewObjectPoolOptions(). + SetSize(hostBatches). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("fetch-batch-request-pool"), + )) + fetchBatchRawV2RequestPool := newFetchBatchRawV2RequestPool(fetchBatchRawV2RequestPoolOpts) + fetchBatchRawV2RequestPool.Init() + + fetchBatchRawV2RequestElementArrayPoolOpts := pool.NewObjectPoolOptions(). + SetSize(hostBatches). + SetInstrumentOptions(s.opts.InstrumentOptions().SetMetricsScope( + s.scope.SubScope("fetch-batch-request-array-pool"), + )) + fetchBatchRawV2RequestElementArrayPool := newFetchBatchRawV2RequestElementArrayPool(fetchBatchRawV2RequestElementArrayPoolOpts, s.opts.FetchBatchSize()) + fetchBatchRawV2RequestElementArrayPool.Init() + + hostQueue, err := s.newHostQueueFn(host, hostQueueOpts{ + writeBatchRawRequestPool: writeBatchRequestPool, + writeBatchRawV2RequestPool: writeBatchV2RequestPool, + writeBatchRawRequestElementArrayPool: writeBatchRawRequestElementArrayPool, + writeBatchRawV2RequestElementArrayPool: writeBatchRawV2RequestElementArrayPool, + writeTaggedBatchRawRequestPool: writeTaggedBatchRequestPool, + writeTaggedBatchRawV2RequestPool: writeTaggedBatchV2RequestPool, + writeTaggedBatchRawRequestElementArrayPool: writeTaggedBatchRawRequestElementArrayPool, + writeTaggedBatchRawV2RequestElementArrayPool: writeTaggedBatchRawV2RequestElementArrayPool, + fetchBatchRawV2RequestPool: fetchBatchRawV2RequestPool, + fetchBatchRawV2RequestElementArrayPool: fetchBatchRawV2RequestElementArrayPool, + opts: s.opts, + }) + if err != nil { + return nil, err + } + hostQueue.Open() + return hostQueue, nil +} + +func (s *session) Write( + nsID, id ident.ID, + t time.Time, + value float64, + unit xtime.Unit, + annotation []byte, +) error { + w := s.pools.writeAttempt.Get() + w.args.attemptType = untaggedWriteAttemptType + w.args.namespace, w.args.id = nsID, id + w.args.tags = ident.EmptyTagIterator + w.args.t, w.args.value, w.args.unit, w.args.annotation = + t, value, unit, annotation + err := s.writeRetrier.Attempt(w.attemptFn) + s.pools.writeAttempt.Put(w) + return err +} + +func (s *session) WriteTagged( + nsID, id ident.ID, + tags ident.TagIterator, + t time.Time, + value float64, + unit xtime.Unit, + annotation []byte, +) error { + w := s.pools.writeAttempt.Get() + w.args.attemptType = taggedWriteAttemptType + w.args.namespace, w.args.id, w.args.tags = nsID, id, tags + w.args.t, w.args.value, w.args.unit, w.args.annotation = + t, value, unit, annotation + err := s.writeRetrier.Attempt(w.attemptFn) + s.pools.writeAttempt.Put(w) + return err +} + +func (s *session) writeAttempt( + wType writeAttemptType, + nsID, id ident.ID, + inputTags ident.TagIterator, + t time.Time, + value float64, + unit xtime.Unit, + annotation []byte, +) error { + startWriteAttempt := s.nowFn() + + timeType, timeTypeErr := convert.ToTimeType(unit) + if timeTypeErr != nil { + return timeTypeErr + } + + timestamp, timestampErr := convert.ToValue(t, timeType) + if timestampErr != nil { + return timestampErr + } + + s.state.RLock() + if s.state.status != statusOpen { + s.state.RUnlock() + return errSessionStatusNotOpen + } + + state, majority, enqueued, err := s.writeAttemptWithRLock( + wType, nsID, id, inputTags, timestamp, value, timeType, annotation) + s.state.RUnlock() + + if err != nil { + return err + } + + // it's safe to Wait() here, as we still hold the lock on state, after it's + // returned from writeAttemptWithRLock. + state.Wait() + + err = s.writeConsistencyResult(state.consistencyLevel, majority, enqueued, + enqueued-state.pending, int32(len(state.errors)), state.errors) + + s.recordWriteMetrics(err, int32(len(state.errors)), startWriteAttempt) + + // must Unlock before decRef'ing, as the latter releases the writeState back into a + // pool if ref count == 0. + state.Unlock() + state.decRef() + + return err +} + +// NB(prateek): the returned writeState, if valid, still holds the lock. Its ownership +// is transferred to the calling function, and is expected to manage the lifecycle of +// of the object (including releasing the lock/decRef'ing it). +func (s *session) writeAttemptWithRLock( + wType writeAttemptType, + namespace, id ident.ID, + inputTags ident.TagIterator, + timestamp int64, + value float64, + timeType rpc.TimeType, + annotation []byte, +) (*writeState, int32, int32, error) { + var ( + majority = int32(s.state.majority) + enqueued int32 + ) + + // NB(prateek): We retain an individual copy of the namespace, ID per + // writeState, as each writeState tracks the lifecycle of it's resources in + // use in the various queues. Tracking per writeAttempt isn't sufficient as + // we may enqueue multiple writeStates concurrently depending on retries + // and consistency level checks. + nsID := s.cloneFinalizable(namespace) + tsID := s.cloneFinalizable(id) + var tagEncoder serialize.TagEncoder + if wType == taggedWriteAttemptType { + tagEncoder = s.pools.tagEncoder.Get() + if err := tagEncoder.Encode(inputTags); err != nil { + tagEncoder.Finalize() + return nil, 0, 0, err + } + } + + var op writeOp + switch wType { + case untaggedWriteAttemptType: + wop := s.pools.writeOperation.Get() + wop.namespace = nsID + wop.shardID = s.state.topoMap.ShardSet().Lookup(tsID) + wop.request.ID = tsID.Bytes() + wop.request.Datapoint.Value = value + wop.request.Datapoint.Timestamp = timestamp + wop.request.Datapoint.TimestampTimeType = timeType + wop.request.Datapoint.Annotation = annotation + wop.requestV2.ID = wop.request.ID + wop.requestV2.Datapoint = wop.request.Datapoint + op = wop + case taggedWriteAttemptType: + wop := s.pools.writeTaggedOperation.Get() + wop.namespace = nsID + wop.shardID = s.state.topoMap.ShardSet().Lookup(tsID) + wop.request.ID = tsID.Bytes() + encodedTagBytes, ok := tagEncoder.Data() + if !ok { + return nil, 0, 0, errUnableToEncodeTags + } + wop.request.EncodedTags = encodedTagBytes.Bytes() + wop.request.Datapoint.Value = value + wop.request.Datapoint.Timestamp = timestamp + wop.request.Datapoint.TimestampTimeType = timeType + wop.request.Datapoint.Annotation = annotation + wop.requestV2.ID = wop.request.ID + wop.requestV2.EncodedTags = wop.request.EncodedTags + wop.requestV2.Datapoint = wop.request.Datapoint + op = wop + default: + // should never happen + return nil, 0, 0, errUnknownWriteAttemptType + } + + state := s.pools.writeState.Get() + state.consistencyLevel = s.state.writeLevel + state.shardsLeavingCountTowardsConsistency = s.shardsLeavingCountTowardsConsistency + state.topoMap = s.state.topoMap + state.incRef() + + // todo@bl: Can we combine the writeOpPool and the writeStatePool? + state.op, state.majority = op, majority + state.nsID, state.tsID, state.tagEncoder = nsID, tsID, tagEncoder + op.SetCompletionFn(state.completionFn) + + if err := s.state.topoMap.RouteForEach(tsID, func( + idx int, + hostShard shard.Shard, + host topology.Host, + ) { + if !s.writeShardsInitializing && hostShard.State() == shard.Initializing { + // NB(r): Do not write to this node as the shard is initializing + // and writing to intialized shards is not enabled (also + // depending on your config initializing shards won't count + // towards quorum, current defaults, so this is ok consistency wise). + return + } + + // Count pending write requests before we enqueue the completion fns, + // which rely on the count when executing + state.pending++ + state.queues = append(state.queues, s.state.queues[idx]) + }); err != nil { + state.decRef() + return nil, 0, 0, err + } + + state.Lock() + for i := range state.queues { + state.incRef() + if err := state.queues[i].Enqueue(state.op); err != nil { + state.Unlock() + state.decRef() + + // NB(r): if this happens we have a bug, once we are in the read + // lock the current queues should never be closed + s.log.Error("[invariant violated] failed to enqueue write", zap.Error(err)) + return nil, 0, 0, err + } + enqueued++ + } + + // NB(prateek): the current go-routine still holds a lock on the + // returned writeState object. + return state, majority, enqueued, nil +} + +func (s *session) Fetch( + nsID ident.ID, + id ident.ID, + startInclusive, endExclusive time.Time, +) (encoding.SeriesIterator, error) { + tsIDs := ident.NewIDsIterator(id) + results, err := s.FetchIDs(nsID, tsIDs, startInclusive, endExclusive) + if err != nil { + return nil, err + } + mutableResults := results.(encoding.MutableSeriesIterators) + iters := mutableResults.Iters() + iter := iters[0] + // Reset to zero so that when we close this results set the iter doesn't get closed + mutableResults.Reset(0) + mutableResults.Close() + return iter, nil +} + +func (s *session) FetchIDs( + nsID ident.ID, + ids ident.Iterator, + startInclusive, endExclusive time.Time, +) (encoding.SeriesIterators, error) { + f := s.pools.fetchAttempt.Get() + f.args.namespace, f.args.ids = nsID, ids + f.args.start, f.args.end = startInclusive, endExclusive + err := s.fetchRetrier.Attempt(f.attemptFn) + result := f.result + s.pools.fetchAttempt.Put(f) + return result, err +} + +func (s *session) Aggregate( + ns ident.ID, q index.Query, opts index.AggregationOptions, +) (AggregatedTagsIterator, FetchResponseMetadata, error) { + f := s.pools.aggregateAttempt.Get() + f.args.ns = ns + f.args.query = q + f.args.opts = opts + err := s.fetchRetrier.Attempt(f.attemptFn) + iter, metadata := f.resultIter, f.resultMetadata + s.pools.aggregateAttempt.Put(f) + return iter, metadata, err +} + +func (s *session) aggregateAttempt( + ns ident.ID, q index.Query, opts index.AggregationOptions, +) (AggregatedTagsIterator, FetchResponseMetadata, error) { + s.state.RLock() + if s.state.status != statusOpen { + s.state.RUnlock() + return nil, FetchResponseMetadata{}, errSessionStatusNotOpen + } + + // NB(prateek): we have to clone the namespace, as we cannot guarantee the lifecycle + // of the hostQueues responding is less than the lifecycle of the current method. + nsClone := s.pools.id.Clone(ns) + + req, err := convert.ToRPCAggregateQueryRawRequest(nsClone, q, opts) + if err != nil { + s.state.RUnlock() + nsClone.Finalize() + return nil, FetchResponseMetadata{}, xerrors.NewNonRetryableError(err) + } + + fetchState, err := s.newFetchStateWithRLock(nsClone, newFetchStateOpts{ + stateType: aggregateFetchState, + aggregateRequest: req, + startInclusive: opts.StartInclusive, + endExclusive: opts.EndExclusive, + }) + s.state.RUnlock() + + if err != nil { + return nil, FetchResponseMetadata{}, err + } + + // it's safe to Wait() here, as we still hold the lock on fetchState, after it's + // returned from newFetchStateWithRLock. + fetchState.Wait() + + // must Unlock before calling `asEncodingSeriesIterators` as the latter needs to acquire + // the fetchState Lock + fetchState.Unlock() + iters, meta, err := fetchState.asAggregatedTagsIterator(s.pools) + + // must Unlock() before decRef'ing, as the latter releases the fetchState back into a + // pool if ref count == 0. + fetchState.decRef() + + return iters, meta, err +} + +func (s *session) FetchTagged( + ns ident.ID, q index.Query, opts index.QueryOptions, +) (encoding.SeriesIterators, FetchResponseMetadata, error) { + f := s.pools.fetchTaggedAttempt.Get() + f.args.ns = ns + f.args.query = q + f.args.opts = opts + err := s.fetchRetrier.Attempt(f.dataAttemptFn) + iters, metadata := f.dataResultIters, f.dataResultMetadata + s.pools.fetchTaggedAttempt.Put(f) + return iters, metadata, err +} + +func (s *session) FetchTaggedIDs( + ns ident.ID, q index.Query, opts index.QueryOptions, +) (TaggedIDsIterator, FetchResponseMetadata, error) { + f := s.pools.fetchTaggedAttempt.Get() + f.args.ns = ns + f.args.query = q + f.args.opts = opts + err := s.fetchRetrier.Attempt(f.idsAttemptFn) + iter, metadata := f.idsResultIter, f.idsResultMetadata + s.pools.fetchTaggedAttempt.Put(f) + return iter, metadata, err +} + +func (s *session) fetchTaggedAttempt( + ns ident.ID, q index.Query, opts index.QueryOptions, +) (encoding.SeriesIterators, FetchResponseMetadata, error) { + nsCtx, err := s.nsCtxFor(ns) + if err != nil { + return nil, FetchResponseMetadata{}, err + } + s.state.RLock() + if s.state.status != statusOpen { + s.state.RUnlock() + return nil, FetchResponseMetadata{}, errSessionStatusNotOpen + } + + // NB(prateek): we have to clone the namespace, as we cannot guarantee the lifecycle + // of the hostQueues responding is less than the lifecycle of the current method. + nsClone := s.pools.id.Clone(ns) + + // FOLLOWUP(prateek): currently both `index.Query` and the returned request depend on + // native, un-pooled types; so we do not Clone() either. We will start doing so + // once https://github.com/m3db/m3ninx/issues/42 lands. Including transferring ownership + // of the Clone()'d value to the `fetchState`. + const fetchData = true + req, err := convert.ToRPCFetchTaggedRequest(nsClone, q, opts, fetchData) + if err != nil { + s.state.RUnlock() + nsClone.Finalize() + return nil, FetchResponseMetadata{}, xerrors.NewNonRetryableError(err) + } + + fetchState, err := s.newFetchStateWithRLock(nsClone, newFetchStateOpts{ + stateType: fetchTaggedFetchState, + fetchTaggedRequest: req, + startInclusive: opts.StartInclusive, + endExclusive: opts.EndExclusive, + }) + s.state.RUnlock() + + if err != nil { + return nil, FetchResponseMetadata{}, err + } + + // it's safe to Wait() here, as we still hold the lock on fetchState, after it's + // returned from newFetchStateWithRLock. + fetchState.Wait() + + // must Unlock before calling `asEncodingSeriesIterators` as the latter needs to acquire + // the fetchState Lock + fetchState.Unlock() + iters, metadata, err := fetchState.asEncodingSeriesIterators( + s.pools, nsCtx.Schema, s.opts.IterationOptions()) + + // must Unlock() before decRef'ing, as the latter releases the fetchState back into a + // pool if ref count == 0. + fetchState.decRef() + + return iters, metadata, err +} + +func (s *session) fetchTaggedIDsAttempt( + ns ident.ID, q index.Query, opts index.QueryOptions, +) (TaggedIDsIterator, FetchResponseMetadata, error) { + s.state.RLock() + if s.state.status != statusOpen { + s.state.RUnlock() + return nil, FetchResponseMetadata{}, errSessionStatusNotOpen + } + + // NB(prateek): we have to clone the namespace, as we cannot guarantee the lifecycle + // of the hostQueues responding is less than the lifecycle of the current method. + nsClone := s.pools.id.Clone(ns) + + // FOLLOWUP(prateek): currently both `index.Query` and the returned request depend on + // native, un-pooled types; so we do not Clone() either. We will start doing so + // once https://github.com/m3db/m3ninx/issues/42 lands. Including transferring ownership + // of the Clone()'d value to the `fetchState`. + const fetchData = false + req, err := convert.ToRPCFetchTaggedRequest(nsClone, q, opts, fetchData) + if err != nil { + s.state.RUnlock() + nsClone.Finalize() + return nil, FetchResponseMetadata{}, xerrors.NewNonRetryableError(err) + } + + fetchState, err := s.newFetchStateWithRLock(nsClone, newFetchStateOpts{ + stateType: fetchTaggedFetchState, + fetchTaggedRequest: req, + startInclusive: opts.StartInclusive, + endExclusive: opts.EndExclusive, + }) + s.state.RUnlock() + + if err != nil { + return nil, FetchResponseMetadata{}, err + } + + // it's safe to Wait() here, as we still hold the lock on fetchState, after it's + // returned from newFetchStateWithRLock. + fetchState.Wait() + + // must Unlock before calling `asTaggedIDsIterator` as the latter needs to acquire + // the fetchState Lock + fetchState.Unlock() + iter, metadata, err := fetchState.asTaggedIDsIterator(s.pools) + + // must Unlock() before decRef'ing, as the latter releases the fetchState back into a + // pool if ref count == 0. + fetchState.decRef() + + return iter, metadata, err +} + +type newFetchStateOpts struct { + stateType fetchStateType + startInclusive time.Time + endExclusive time.Time + + // only valid if stateType == fetchTaggedFetchState + fetchTaggedRequest rpc.FetchTaggedRequest + + // only valid if stateType == aggregateFetchState + aggregateRequest rpc.AggregateQueryRawRequest +} + +// NB(prateek): the returned fetchState, if valid, still holds the lock. Its ownership +// is transferred to the calling function, and is expected to manage the lifecycle of +// of the object (including releasing the lock/decRef'ing it). +// NB: ownership of ns is transferred to the returned fetchState object. +func (s *session) newFetchStateWithRLock( + ns ident.ID, + opts newFetchStateOpts, +) (*fetchState, error) { + var ( + topoMap = s.state.topoMap + fetchState = s.pools.fetchState.Get() + ) + fetchState.nsID = ns // transfer ownership to `fetchState` + fetchState.incRef() // indicate current go-routine has a reference to the fetchState + + // wire up the operation based on the opts specified + var ( + op op + closer func() + ) + switch opts.stateType { + case fetchTaggedFetchState: + fetchOp := s.pools.fetchTaggedOp.Get() + fetchOp.incRef() // indicate current go-routine has a reference to the op + closer = fetchOp.decRef // release the ref for the current go-routine + fetchOp.update(opts.fetchTaggedRequest, fetchState.completionFn) + fetchState.ResetFetchTagged(opts.startInclusive, opts.endExclusive, + fetchOp, topoMap, s.state.majority, s.state.readLevel) + op = fetchOp + + case aggregateFetchState: + aggOp := s.pools.aggregateOp.Get() + aggOp.incRef() // indicate current go-routine has a reference to the op + closer = aggOp.decRef // release the ref for the current go-routine + aggOp.update(opts.aggregateRequest, fetchState.completionFn) + fetchState.ResetAggregate(opts.startInclusive, opts.endExclusive, + aggOp, topoMap, s.state.majority, s.state.readLevel) + op = aggOp + + default: + fetchState.decRef() // release fetchState + instrument.EmitInvariantViolation(s.opts.InstrumentOptions()) + return nil, xerrors.NewNonRetryableError(instrument.InvariantErrorf( + "unknown fetchState type: %v", opts.stateType)) + } + + fetchState.Lock() + for _, hq := range s.state.queues { + // inc to indicate the hostQueue has a reference to `op` which has a ref to the fetchState + fetchState.incRef() + if err := hq.Enqueue(op); err != nil { + fetchState.Unlock() + closer() // release the ref for the current go-routine + fetchState.decRef() // release the ref for the hostQueue + fetchState.decRef() // release the ref for the current go-routine + + // NB: if this happens we have a bug, once we are in the read + // lock the current queues should never be closed + wrappedErr := xerrors.NewNonRetryableError(fmt.Errorf("failed to enqueue in fetchState: %v", err)) + instrument.EmitAndLogInvariantViolation(s.opts.InstrumentOptions(), func(l *zap.Logger) { + l.Error(wrappedErr.Error()) + }) + return nil, wrappedErr + } + } + + closer() // release the ref for the current go-routine + + // NB(prateek): the calling go-routine still holds the lock and a ref + // on the returned fetchState object. + return fetchState, nil +} + +func (s *session) fetchIDsAttempt( + inputNamespace ident.ID, + inputIDs ident.Iterator, + startInclusive, endExclusive time.Time, +) (encoding.SeriesIterators, error) { + nsCtx, err := s.nsCtxFor(inputNamespace) + if err != nil { + return nil, err + } + + var ( + wg sync.WaitGroup + allPending int32 + routeErr error + enqueueErr error + resultErrLock sync.RWMutex + resultErr error + resultErrs int32 + majority int32 + numReplicas int32 + consistencyLevel topology.ReadConsistencyLevel + fetchBatchOpsByHostIdx [][]*fetchBatchOp + success = false + startFetchAttempt = s.nowFn() + ) + + // NB(prateek): need to make a copy of inputNamespace and inputIDs to control + // their life-cycle within this function. + namespace := s.pools.id.Clone(inputNamespace) + // First, we duplicate the iterator (only the struct referencing the underlying slice, + // not the slice itself). Need this to be able to iterate the original iterator + // multiple times in case of retries. + ids := inputIDs.Duplicate() + + rangeStart, tsErr := convert.ToValue(startInclusive, rpc.TimeType_UNIX_NANOSECONDS) + if tsErr != nil { + return nil, tsErr + } + + rangeEnd, tsErr := convert.ToValue(endExclusive, rpc.TimeType_UNIX_NANOSECONDS) + if tsErr != nil { + return nil, tsErr + } + + s.state.RLock() + if s.state.status != statusOpen { + s.state.RUnlock() + return nil, errSessionStatusNotOpen + } + + iters := s.pools.seriesIterators.Get(ids.Remaining()) + iters.Reset(ids.Remaining()) + + defer func() { + // NB(r): Ensure we cover all edge cases and close the iters in any case + // of an error being returned + if !success { + iters.Close() + } + }() + + // NB(r): We must take and return pooled items in the session read lock for the + // pools that change during a topology update. + // This is due to when a queue is re-initialized it enqueues a fixed number + // of entries into the backing channel for the pool and will forever stall + // on the last few puts if any unexpected entries find their way there + // while it is filling. + fetchBatchOpsByHostIdx = s.pools.fetchBatchOpArrayArray.Get() + + consistencyLevel = s.state.readLevel + majority = int32(s.state.majority) + numReplicas = int32(s.state.replicas) + + // NB(prateek): namespaceAccessors tracks the number of pending accessors for nsID. + // It is set to incremented by `replica` for each requested ID during fetch enqueuing, + // and once by initial request, and is decremented for each replica retrieved, inside + // completionFn, and once by the allCompletionFn. So know we can Finalize `namespace` + // once it's value reaches 0. + namespaceAccessors := int32(0) + + for idx := 0; ids.Next(); idx++ { + var ( + idx = idx // capture loop variable + tsID = s.pools.id.Clone(ids.Current()) + + wgIsDone int32 + // NB(xichen): resultsAccessors and idAccessors get initialized to number of replicas + 1 + // before enqueuing (incremented when iterating over the replicas for this ID), and gets + // decremented for each replica as well as inside the allCompletionFn so we know when + // resultsAccessors is 0, results are no longer accessed and it's safe to return results + // to the pool. + resultsAccessors int32 = 1 + idAccessors int32 = 1 + resultsLock sync.RWMutex + results []encoding.MultiReaderIterator + enqueued int32 + pending int32 + success int32 + errors []error + errs int32 + ) + + // increment namespaceAccesors by 1 to indicate it still needs to be handled by the + // allCompletionFn for tsID. + atomic.AddInt32(&namespaceAccessors, 1) + + wg.Add(1) + allCompletionFn := func() { + var reportErrors []error + errsLen := atomic.LoadInt32(&errs) + if errsLen > 0 { + resultErrLock.RLock() + reportErrors = errors[:] + resultErrLock.RUnlock() + } + responded := enqueued - atomic.LoadInt32(&pending) + err := s.readConsistencyResult(consistencyLevel, majority, enqueued, + responded, errsLen, reportErrors) + s.recordFetchMetrics(err, errsLen, startFetchAttempt) + if err != nil { + resultErrLock.Lock() + if resultErr == nil { + resultErr = err + } + resultErrs++ + resultErrLock.Unlock() + } else { + resultsLock.RLock() + numItersToInclude := int(success) + numDesired := topology.NumDesiredForReadConsistency(consistencyLevel, int(numReplicas), int(majority)) + if numDesired < numItersToInclude { + // Avoid decoding more data than is required to satisfy the consistency guarantees. + numItersToInclude = numDesired + } + + itersToInclude := results[:numItersToInclude] + resultsLock.RUnlock() + + iter := s.pools.seriesIterator.Get() + // NB(prateek): we need to allocate a copy of ident.ID to allow the seriesIterator + // to have control over the lifecycle of ID. We cannot allow seriesIterator + // to control the lifecycle of the original ident.ID, as it might still be in use + // due to a pending request in queue. + seriesID := s.pools.id.Clone(tsID) + namespaceID := s.pools.id.Clone(namespace) + consolidator := s.opts.IterationOptions().SeriesIteratorConsolidator + iter.Reset(encoding.SeriesIteratorOptions{ + ID: seriesID, + Namespace: namespaceID, + StartInclusive: xtime.ToUnixNano(startInclusive), + EndExclusive: xtime.ToUnixNano(endExclusive), + Replicas: itersToInclude, + SeriesIteratorConsolidator: consolidator, + }) + iters.SetAt(idx, iter) + } + if atomic.AddInt32(&resultsAccessors, -1) == 0 { + s.pools.multiReaderIteratorArray.Put(results) + } + if atomic.AddInt32(&idAccessors, -1) == 0 { + tsID.Finalize() + } + if atomic.AddInt32(&namespaceAccessors, -1) == 0 { + namespace.Finalize() + } + wg.Done() + } + completionFn := func(result interface{}, err error) { + var snapshotSuccess int32 + if err != nil { + if IsBadRequestError(err) { + // Wrap with invalid params and non-retryable so it is + // not retried. + err = xerrors.NewInvalidParamsError(err) + err = xerrors.NewNonRetryableError(err) + } + atomic.AddInt32(&errs, 1) + // NB(r): reuse the error lock here as we do not want to create + // a whole lot of locks for every single ID fetched due to size + // of mutex being non-trivial and likely to cause more stack growth + // or GC pressure if ends up on heap which is likely due to naive + // escape analysis. + resultErrLock.Lock() + errors = append(errors, err) + resultErrLock.Unlock() + } else { + slicesIter := s.pools.readerSliceOfSlicesIterator.Get() + slicesIter.Reset(result.([]*rpc.Segments)) + multiIter := s.pools.multiReaderIterator.Get() + multiIter.ResetSliceOfSlices(slicesIter, nsCtx.Schema) + // Results is pre-allocated after creating fetch ops for this ID below + resultsLock.Lock() + results[success] = multiIter + success++ + snapshotSuccess = success + resultsLock.Unlock() + } + // NB(xichen): decrementing pending and checking remaining against zero must + // come after incrementing success, otherwise we might end up passing results[:success] + // to iter.Reset down below before setting the iterator in the results array, + // which would cause a nil pointer exception. + remaining := atomic.AddInt32(&pending, -1) + shouldTerminate := topology.ReadConsistencyTermination(s.state.readLevel, majority, remaining, snapshotSuccess) + if shouldTerminate && atomic.CompareAndSwapInt32(&wgIsDone, 0, 1) { + allCompletionFn() + } + + if atomic.AddInt32(&resultsAccessors, -1) == 0 { + s.pools.multiReaderIteratorArray.Put(results) + } + if atomic.AddInt32(&idAccessors, -1) == 0 { + tsID.Finalize() + } + if atomic.AddInt32(&namespaceAccessors, -1) == 0 { + namespace.Finalize() + } + } + + if err := s.state.topoMap.RouteForEach(tsID, func( + hostIdx int, + hostShard shard.Shard, + host topology.Host, + ) { + // Inc safely as this for each is sequential + enqueued++ + pending++ + allPending++ + resultsAccessors++ + namespaceAccessors++ + idAccessors++ + + ops := fetchBatchOpsByHostIdx[hostIdx] + + var f *fetchBatchOp + if len(ops) > 0 { + // Find the last and potentially current fetch op for this host + f = ops[len(ops)-1] + } + if f == nil || f.Size() >= s.fetchBatchSize { + // If no current fetch op or existing one is at batch capacity add one + // NB(r): Note that we defer to the host queue to take ownership + // of these ops and for returning the ops to the pool when done as + // they know when their use is complete. + f = s.pools.fetchBatchOp.Get() + f.IncRef() + fetchBatchOpsByHostIdx[hostIdx] = append(fetchBatchOpsByHostIdx[hostIdx], f) + f.request.RangeStart = rangeStart + f.request.RangeEnd = rangeEnd + f.request.RangeTimeType = rpc.TimeType_UNIX_NANOSECONDS + } + + // Append IDWithNamespace to this request + f.append(namespace.Bytes(), tsID.Bytes(), completionFn) + }); err != nil { + routeErr = err + break + } + + // Once we've enqueued we know how many to expect so retrieve and set length + results = s.pools.multiReaderIteratorArray.Get(int(enqueued)) + results = results[:enqueued] + } + + if routeErr != nil { + s.state.RUnlock() + return nil, routeErr + } + + // Enqueue fetch ops + for idx := range fetchBatchOpsByHostIdx { + for _, f := range fetchBatchOpsByHostIdx[idx] { + // Passing ownership of the op itself to the host queue + f.DecRef() + if err := s.state.queues[idx].Enqueue(f); err != nil && enqueueErr == nil { + enqueueErr = err + break + } + } + if enqueueErr != nil { + break + } + } + s.pools.fetchBatchOpArrayArray.Put(fetchBatchOpsByHostIdx) + s.state.RUnlock() + + if enqueueErr != nil { + s.log.Error("failed to enqueue fetch", zap.Error(enqueueErr)) + return nil, enqueueErr + } + + wg.Wait() + + resultErrLock.RLock() + retErr := resultErr + resultErrLock.RUnlock() + if retErr != nil { + return nil, retErr + } + success = true + return iters, nil +} + +func (s *session) writeConsistencyResult( + level topology.ConsistencyLevel, + majority, enqueued, responded, resultErrs int32, + errs []error, +) error { + // Check consistency level satisfied + success := enqueued - resultErrs + if !topology.WriteConsistencyAchieved(level, int(majority), int(enqueued), int(success)) { + return newConsistencyResultError(level, int(enqueued), int(responded), errs) + } + return nil +} + +func (s *session) readConsistencyResult( + level topology.ReadConsistencyLevel, + majority, enqueued, responded, resultErrs int32, + errs []error, +) error { + // Check consistency level satisfied + success := enqueued - resultErrs + if !topology.ReadConsistencyAchieved(level, int(majority), int(enqueued), int(success)) { + return newConsistencyResultError(level, int(enqueued), int(responded), errs) + } + return nil +} + +func (s *session) IteratorPools() (encoding.IteratorPools, error) { + s.state.RLock() + defer s.state.RUnlock() + if s.state.status != statusOpen { + return nil, errSessionStatusNotOpen + } + return s.pools, nil +} + +func (s *session) Close() error { + s.state.Lock() + if s.state.status != statusOpen { + s.state.Unlock() + return errSessionStatusNotOpen + } + s.state.status = statusClosed + queues := s.state.queues + topoWatch := s.state.topoWatch + topo := s.state.topo + s.state.Unlock() + + for _, q := range queues { + q.Close() + } + + topoWatch.Close() + topo.Close() + + if closer := s.runtimeOptsListenerCloser; closer != nil { + closer.Close() + } + + return nil +} + +func (s *session) Origin() topology.Host { + return s.origin +} + +func (s *session) Replicas() int { + s.state.RLock() + v := s.state.replicas + s.state.RUnlock() + return v +} + +func (s *session) TopologyMap() (topology.Map, error) { + s.state.RLock() + status := s.state.status + topoMap := s.state.topoMap + s.state.RUnlock() + + // Make sure the session is open, as thats what sets the initial topology. + if status != statusOpen { + return nil, errSessionStatusNotOpen + } + if topoMap == nil { + // Should never happen. + return nil, instrument.InvariantErrorf("session does not have a topology map") + } + + return topoMap, nil +} + +func (s *session) Truncate(namespace ident.ID) (int64, error) { + var ( + wg sync.WaitGroup + enqueueErr xerrors.MultiError + resultErrLock sync.Mutex + resultErr xerrors.MultiError + truncated int64 + ) + + t := &truncateOp{} + t.request.NameSpace = namespace.Bytes() + t.completionFn = func(result interface{}, err error) { + if err != nil { + resultErrLock.Lock() + resultErr = resultErr.Add(err) + resultErrLock.Unlock() + } else { + res := result.(*rpc.TruncateResult_) + atomic.AddInt64(&truncated, res.NumSeries) + } + wg.Done() + } + + s.state.RLock() + for idx := range s.state.queues { + wg.Add(1) + if err := s.state.queues[idx].Enqueue(t); err != nil { + wg.Done() + enqueueErr = enqueueErr.Add(err) + } + } + s.state.RUnlock() + + if err := enqueueErr.FinalError(); err != nil { + s.log.Error("failed to enqueue request", zap.Error(err)) + return 0, err + } + + // Wait for namespace to be truncated on all replicas + wg.Wait() + + return truncated, resultErr.FinalError() +} + +// NB(r): Excluding maligned struct check here as we can +// live with a few extra bytes since this struct is only +// ever passed by stack, its much more readable not optimized +// nolint: maligned +type peers struct { + peers []peer + shard uint32 + majorityReplicas int + selfExcluded bool + selfHostShardSet topology.HostShardSet +} + +func (p peers) selfExcludedAndSelfHasShardAvailable() bool { + if !p.selfExcluded { + return false + } + state, err := p.selfHostShardSet.ShardSet().LookupStateByID(p.shard) + if err != nil { + return false + } + return state == shard.Available +} + +func (s *session) peersForShard(shardID uint32) (peers, error) { + s.state.RLock() + var ( + lookupErr error + result = peers{ + peers: make([]peer, 0, s.state.topoMap.Replicas()), + shard: shardID, + majorityReplicas: s.state.topoMap.MajorityReplicas(), + } + ) + err := s.state.topoMap.RouteShardForEach(shardID, func( + idx int, + _ shard.Shard, + host topology.Host, + ) { + if s.origin != nil && s.origin.ID() == host.ID() { + // Don't include the origin host + result.selfExcluded = true + // Include the origin host shard set for help determining quorum + hostShardSet, ok := s.state.topoMap.LookupHostShardSet(host.ID()) + if !ok { + lookupErr = fmt.Errorf("could not find shard set for host ID: %s", host.ID()) + } + result.selfHostShardSet = hostShardSet + return + } + result.peers = append(result.peers, newPeer(s, host)) + }) + s.state.RUnlock() + if resultErr := xerrors.FirstError(err, lookupErr); resultErr != nil { + return peers{}, resultErr + } + return result, nil +} + +func (s *session) FetchBootstrapBlocksMetadataFromPeers( + namespace ident.ID, + shard uint32, + start, end time.Time, + resultOpts result.Options, +) (PeerBlockMetadataIter, error) { + level := newSessionBootstrapRuntimeReadConsistencyLevel(s) + return s.fetchBlocksMetadataFromPeers(namespace, + shard, start, end, level, resultOpts) +} + +func (s *session) FetchBlocksMetadataFromPeers( + namespace ident.ID, + shard uint32, + start, end time.Time, + consistencyLevel topology.ReadConsistencyLevel, + resultOpts result.Options, +) (PeerBlockMetadataIter, error) { + level := newStaticRuntimeReadConsistencyLevel(consistencyLevel) + return s.fetchBlocksMetadataFromPeers(namespace, + shard, start, end, level, resultOpts) +} + +func (s *session) fetchBlocksMetadataFromPeers( + namespace ident.ID, + shard uint32, + start, end time.Time, + level runtimeReadConsistencyLevel, + resultOpts result.Options, +) (PeerBlockMetadataIter, error) { + peers, err := s.peersForShard(shard) + if err != nil { + return nil, err + } + + var ( + metadataCh = make(chan receivedBlockMetadata, + blocksMetadataChannelInitialCapacity) + errCh = make(chan error, 1) + meta = resultTypeMetadata + m = s.newPeerMetadataStreamingProgressMetrics(shard, meta) + ) + go func() { + errCh <- s.streamBlocksMetadataFromPeers(namespace, shard, + peers, start, end, level, metadataCh, resultOpts, m) + close(metadataCh) + close(errCh) + }() + + iter := newMetadataIter(metadataCh, errCh, + s.pools.tagDecoder.Get(), s.pools.id) + return iter, nil +} + +// FetchBootstrapBlocksFromPeers will fetch the specified blocks from peers for +// bootstrapping purposes. Refer to peer_bootstrapping.md for more details. +func (s *session) FetchBootstrapBlocksFromPeers( + nsMetadata namespace.Metadata, + shard uint32, + start, end time.Time, + opts result.Options, +) (result.ShardResult, error) { + nsCtx, err := s.nsCtxFromMetadata(nsMetadata) + if err != nil { + return nil, err + } + var ( + result = newBulkBlocksResult(nsCtx, s.opts, opts, + s.pools.tagDecoder, s.pools.id) + doneCh = make(chan struct{}) + progress = s.newPeerMetadataStreamingProgressMetrics(shard, + resultTypeBootstrap) + level = newSessionBootstrapRuntimeReadConsistencyLevel(s) + ) + + // Determine which peers own the specified shard + peers, err := s.peersForShard(shard) + if err != nil { + return nil, err + } + + // Emit a gauge indicating whether we're done or not + go func() { + for { + select { + case <-doneCh: + progress.fetchBlocksFromPeers.Update(0) + return + default: + progress.fetchBlocksFromPeers.Update(1) + time.Sleep(gaugeReportInterval) + } + } + }() + defer close(doneCh) + + // Begin pulling metadata, if one or multiple peers fail no error will + // be returned from this routine as long as one peer succeeds completely + metadataCh := make(chan receivedBlockMetadata, blockMetadataChBufSize) + // Spin up a background goroutine which will begin streaming metadata from + // all the peers and pushing them into the metadatach + errCh := make(chan error, 1) + go func() { + errCh <- s.streamBlocksMetadataFromPeers(nsMetadata.ID(), shard, + peers, start, end, level, metadataCh, opts, progress) + close(metadataCh) + }() + + // Begin consuming metadata and making requests. This will block until all + // data has been streamed (or failed to stream). Note that while this function + // does return an error, an error will only be returned in a select few cases. + // There are some scenarios in which if something goes wrong here we won't report it to + // the caller, but metrics and logs are emitted internally. Also note that the + // streamAndGroupCollectedBlocksMetadata function is injected. + err = s.streamBlocksFromPeers(nsMetadata, shard, peers, metadataCh, opts, + level, result, progress, s.streamAndGroupCollectedBlocksMetadata) + if err != nil { + return nil, err + } + + // Check if an error occurred during the metadata streaming + if err = <-errCh; err != nil { + return nil, err + } + + return result.result, nil +} + +func (s *session) FetchBlocksFromPeers( + nsMetadata namespace.Metadata, + shard uint32, + consistencyLevel topology.ReadConsistencyLevel, + metadatas []block.ReplicaMetadata, + opts result.Options, +) (PeerBlocksIter, error) { + nsCtx, err := s.nsCtxFromMetadata(nsMetadata) + if err != nil { + return nil, err + } + var ( + logger = opts.InstrumentOptions().Logger() + level = newStaticRuntimeReadConsistencyLevel(consistencyLevel) + complete = int64(0) + doneCh = make(chan error, 1) + outputCh = make(chan peerBlocksDatapoint, 4096) + result = newStreamBlocksResult(nsCtx, s.opts, opts, outputCh, + s.pools.tagDecoder.Get(), s.pools.id) + onDone = func(err error) { + atomic.StoreInt64(&complete, 1) + select { + case doneCh <- err: + default: + } + } + progress = s.newPeerMetadataStreamingProgressMetrics(shard, resultTypeRaw) + ) + + peers, err := s.peersForShard(shard) + if err != nil { + return nil, err + } + peersByHost := make(map[string]peer, len(peers.peers)) + for _, peer := range peers.peers { + peersByHost[peer.Host().ID()] = peer + } + + go func() { + for atomic.LoadInt64(&complete) == 0 { + progress.fetchBlocksFromPeers.Update(1) + time.Sleep(gaugeReportInterval) + } + progress.fetchBlocksFromPeers.Update(0) + }() + + metadataCh := make(chan receivedBlockMetadata, blockMetadataChBufSize) + go func() { + for _, rb := range metadatas { + peer, ok := peersByHost[rb.Host.ID()] + if !ok { + logger.Warn("replica requested from unknown peer, skipping", + zap.Stringer("peer", rb.Host), + zap.Stringer("id", rb.ID), + zap.Time("start", rb.Start), + ) + continue + } + metadataCh <- receivedBlockMetadata{ + id: rb.ID, + peer: peer, + block: blockMetadata{ + start: rb.Start, + size: rb.Size, + checksum: rb.Checksum, + lastRead: rb.LastRead, + }, + } + } + close(metadataCh) + }() + + // Begin consuming metadata and making requests. + go func() { + err := s.streamBlocksFromPeers(nsMetadata, shard, peers, metadataCh, + opts, level, result, progress, s.passThroughBlocksMetadata) + close(outputCh) + onDone(err) + }() + + pbi := newPeerBlocksIter(outputCh, doneCh) + return pbi, nil +} + +func (s *session) streamBlocksMetadataFromPeers( + namespace ident.ID, + shardID uint32, + peers peers, + start, end time.Time, + level runtimeReadConsistencyLevel, + metadataCh chan<- receivedBlockMetadata, + resultOpts result.Options, + progress *streamFromPeersMetrics, +) error { + var ( + wg sync.WaitGroup + errs = newSyncAbortableErrorsMap() + pending = int64(len(peers.peers)) + majority = int32(peers.majorityReplicas) + enqueued = int32(len(peers.peers)) + responded int32 + success int32 + ) + if peers.selfExcludedAndSelfHasShardAvailable() { + // If we excluded ourselves from fetching, we basically treat ourselves + // as a successful peer response since we can bootstrap from ourselves + // just fine + enqueued++ + success++ + } + + progress.metadataFetches.Update(float64(pending)) + for idx, peer := range peers.peers { + idx := idx + peer := peer + + wg.Add(1) + go func() { + defer func() { + // Success or error counts towards a response + atomic.AddInt32(&responded, 1) + + // Decrement pending + progress.metadataFetches.Update(float64(atomic.AddInt64(&pending, -1))) + + // Mark done + wg.Done() + }() + + var ( + firstAttempt = true + // NB(r): currPageToken keeps the position into the pagination of the + // metadata from this peer, it begins as nil but if an error is + // returned it will likely not be nil, this lets us restart fetching + // if we need to (if consistency has not been achieved yet) without + // losing place in the pagination. + currPageToken pageToken + currHostNotAvailableSleepInterval = hostNotAvailableMinSleepInterval + ) + condition := func() bool { + if firstAttempt { + // Always attempt at least once + firstAttempt = false + return true + } + + var ( + currLevel = level.value() + majority = int(majority) + enqueued = int(enqueued) + success = int(atomic.LoadInt32(&success)) + ) + metReadConsistency := topology.ReadConsistencyAchieved( + currLevel, majority, enqueued, success) + doRetry := !metReadConsistency && errs.getAbortError() == nil + + if doRetry { + // Track that we are reattempting the fetch metadata + // pagination from a peer + progress.metadataPeerRetry.Inc(1) + } + return doRetry + } + for condition() { + var err error + currPageToken, err = s.streamBlocksMetadataFromPeer(namespace, shardID, + peer, start, end, currPageToken, metadataCh, resultOpts, progress) + // Set error or success if err is nil + errs.setError(idx, err) + + // hostNotAvailable is a NonRetryableError for the purposes of short-circuiting + // the automatic retry functionality, but in this case the client should avoid + // aborting and continue retrying at this level until consistency can be reached. + if isHostNotAvailableError(err) { + // Prevent the loop from spinning too aggressively in the short-circuiting case. + time.Sleep(currHostNotAvailableSleepInterval) + currHostNotAvailableSleepInterval = minDuration( + currHostNotAvailableSleepInterval*2, + hostNotAvailableMaxSleepInterval, + ) + continue + } + + if err != nil && xerrors.IsNonRetryableError(err) { + errs.setAbortError(err) + return // Cannot recover from this error, so we break from the loop + } + + if err == nil { + atomic.AddInt32(&success, 1) + return + } + + // There was a retryable error, continue looping. + } + }() + } + + wg.Wait() + + if err := errs.getAbortError(); err != nil { + return err + } + + errors := errs.getErrors() + return s.readConsistencyResult(level.value(), majority, enqueued, + atomic.LoadInt32(&responded), int32(len(errors)), errors) +} + +type pageToken []byte + +// streamBlocksMetadataFromPeer has several heap allocated anonymous +// function, however, they're only allocated once per peer/shard combination +// for the entire peer bootstrapping process so performance is acceptable +func (s *session) streamBlocksMetadataFromPeer( + namespace ident.ID, + shard uint32, + peer peer, + start, end time.Time, + startPageToken pageToken, + metadataCh chan<- receivedBlockMetadata, + resultOpts result.Options, + progress *streamFromPeersMetrics, +) (pageToken, error) { + var ( + optionIncludeSizes = true + optionIncludeChecksums = true + optionIncludeLastRead = true + moreResults = true + idPool = s.pools.id + bytesPool = resultOpts.DatabaseBlockOptions().BytesPool() + + // Only used for logs + peerStr = peer.Host().ID() + metadataCountByBlock = map[xtime.UnixNano]int64{} + ) + defer func() { + for block, numMetadata := range metadataCountByBlock { + s.log.Debug("finished streaming blocks metadata from peer", + zap.Uint32("shard", shard), + zap.String("peer", peerStr), + zap.Int64("numMetadata", numMetadata), + zap.Time("block", block.ToTime()), + ) + } + }() + + // Declare before loop to avoid redeclaring each iteration + attemptFn := func(client rpc.TChanNode) error { + tctx, _ := thrift.NewContext(s.streamBlocksMetadataBatchTimeout) + req := rpc.NewFetchBlocksMetadataRawV2Request() + req.NameSpace = namespace.Bytes() + req.Shard = int32(shard) + req.RangeStart = start.UnixNano() + req.RangeEnd = end.UnixNano() + req.Limit = int64(s.streamBlocksBatchSize) + req.PageToken = startPageToken + req.IncludeSizes = &optionIncludeSizes + req.IncludeChecksums = &optionIncludeChecksums + req.IncludeLastRead = &optionIncludeLastRead + + progress.metadataFetchBatchCall.Inc(1) + result, err := client.FetchBlocksMetadataRawV2(tctx, req) + if err != nil { + progress.metadataFetchBatchError.Inc(1) + return err + } + + progress.metadataFetchBatchSuccess.Inc(1) + progress.metadataReceived.Inc(int64(len(result.Elements))) + + if result.NextPageToken != nil { + // Reset pageToken + copy new pageToken into previously allocated memory, + // extending as necessary + startPageToken = append(startPageToken[:0], result.NextPageToken...) + } else { + // No further results + moreResults = false + } + + for _, elem := range result.Elements { + blockStart := time.Unix(0, elem.Start) + + data := bytesPool.Get(len(elem.ID)) + data.IncRef() + data.AppendAll(elem.ID) + data.DecRef() + clonedID := idPool.BinaryID(data) + // Return thrift bytes to pool once the ID has been copied. + apachethrift.BytesPoolPut(elem.ID) + + var encodedTags checked.Bytes + if tagBytes := elem.EncodedTags; len(tagBytes) != 0 { + encodedTags = bytesPool.Get(len(tagBytes)) + encodedTags.IncRef() + encodedTags.AppendAll(tagBytes) + encodedTags.DecRef() + // Return thrift bytes to pool once the tags have been copied. + apachethrift.BytesPoolPut(tagBytes) + } + + // Error occurred retrieving block metadata, use default values + if err := elem.Err; err != nil { + progress.metadataFetchBatchBlockErr.Inc(1) + s.log.Error("error occurred retrieving block metadata", + zap.Uint32("shard", shard), + zap.String("peer", peerStr), + zap.Time("block", blockStart), + zap.Error(err), + ) + // Enqueue with a zeroed checksum which triggers a fanout fetch + metadataCh <- receivedBlockMetadata{ + peer: peer, + id: clonedID, + encodedTags: encodedTags, + block: blockMetadata{ + start: blockStart, + }, + } + continue + } + + var size int64 + if elem.Size != nil { + size = *elem.Size + } + + var pChecksum *uint32 + if elem.Checksum != nil { + value := uint32(*elem.Checksum) + pChecksum = &value + } + + var lastRead time.Time + if elem.LastRead != nil { + value, err := convert.ToTime(*elem.LastRead, elem.LastReadTimeType) + if err == nil { + lastRead = value + } + } + + metadataCh <- receivedBlockMetadata{ + peer: peer, + id: clonedID, + encodedTags: encodedTags, + block: blockMetadata{ + start: blockStart, + size: size, + checksum: pChecksum, + lastRead: lastRead, + }, + } + // Only used for logs + metadataCountByBlock[xtime.ToUnixNano(blockStart)]++ + } + return nil + } + + var attemptErr error + checkedAttemptFn := func(client rpc.TChanNode) { + attemptErr = attemptFn(client) + } + + fetchFn := func() error { + borrowErr := peer.BorrowConnection(checkedAttemptFn) + return xerrors.FirstError(borrowErr, attemptErr) + } + + for moreResults { + if err := s.streamBlocksRetrier.Attempt(fetchFn); err != nil { + return startPageToken, err + } + } + return nil, nil +} + +func (s *session) streamBlocksFromPeers( + nsMetadata namespace.Metadata, + shard uint32, + peers peers, + metadataCh <-chan receivedBlockMetadata, + opts result.Options, + consistencyLevel runtimeReadConsistencyLevel, + result blocksResult, + progress *streamFromPeersMetrics, + streamMetadataFn streamBlocksMetadataFn, +) error { + var ( + enqueueCh = newEnqueueChannel(progress) + peerBlocksBatchSize = s.streamBlocksBatchSize + numPeers = len(peers.peers) + uncheckedBytesPool = opts.DatabaseBlockOptions().BytesPool().BytesPool() + ) + + // Consume the incoming metadata and enqueue to the ready channel + // Spin up background goroutine to consume + go func() { + streamMetadataFn(numPeers, metadataCh, enqueueCh, uncheckedBytesPool) + // Begin assessing the queue and how much is processed, once queue + // is entirely processed then we can close the enqueue channel + enqueueCh.closeOnAllProcessed() + }() + + // Fetch blocks from peers as results become ready + peerQueues := make(peerBlocksQueues, 0, numPeers) + for _, peer := range peers.peers { + peer := peer + size := peerBlocksBatchSize + workers := s.streamBlocksWorkers + drainEvery := 100 * time.Millisecond + queue := s.newPeerBlocksQueueFn(peer, size, drainEvery, workers, + func(batch []receivedBlockMetadata) { + s.streamBlocksBatchFromPeer(nsMetadata, shard, peer, batch, opts, + result, enqueueCh, s.streamBlocksRetrier, progress) + }) + peerQueues = append(peerQueues, queue) + } + + var ( + selected []receivedBlockMetadata + pooled selectPeersFromPerPeerBlockMetadatasPooledResources + onQueueItemProcessed = func() { + enqueueCh.trackProcessed(1) + } + ) + for perPeerBlocksMetadata := range enqueueCh.read() { + // Filter and select which blocks to retrieve from which peers + selected, pooled = s.selectPeersFromPerPeerBlockMetadatas( + perPeerBlocksMetadata, peerQueues, enqueueCh, consistencyLevel, peers, + pooled, progress) + + if len(selected) == 0 { + onQueueItemProcessed() + continue + } + + if len(selected) == 1 { + queue := peerQueues.findQueue(selected[0].peer) + queue.enqueue(selected[0], onQueueItemProcessed) + continue + } + + // Need to fan out, only track this as processed once all peer + // queues have completed their fetches, so account for the extra + // items assigned to be fetched + enqueueCh.trackPending(len(selected) - 1) + for _, receivedBlockMetadata := range selected { + queue := peerQueues.findQueue(receivedBlockMetadata.peer) + queue.enqueue(receivedBlockMetadata, onQueueItemProcessed) + } + } + + // Close all queues + peerQueues.closeAll() + + return nil +} + +type streamBlocksMetadataFn func( + peersLen int, + ch <-chan receivedBlockMetadata, + enqueueCh enqueueChannel, + pool pool.BytesPool, +) + +func (s *session) passThroughBlocksMetadata( + peersLen int, + ch <-chan receivedBlockMetadata, + enqueueCh enqueueChannel, + _ pool.BytesPool, +) { + // Receive off of metadata channel + for { + m, ok := <-ch + if !ok { + break + } + res := []receivedBlockMetadata{m} + enqueueCh.enqueue(res) + } +} + +func (s *session) streamAndGroupCollectedBlocksMetadata( + peersLen int, + metadataCh <-chan receivedBlockMetadata, + enqueueCh enqueueChannel, + pool pool.BytesPool, +) { + metadata := newReceivedBlocksMap(pool) + defer metadata.Reset() // Delete all the keys and return slices to pools + + for { + m, ok := <-metadataCh + if !ok { + break + } + + key := idAndBlockStart{ + id: m.id, + blockStart: m.block.start.UnixNano(), + } + received, ok := metadata.Get(key) + if !ok { + received = receivedBlocks{ + results: make([]receivedBlockMetadata, 0, peersLen), + } + } + + // The entry has already been enqueued which means the metadata we just + // received is a duplicate. Discard it and move on. + if received.enqueued { + s.emitDuplicateMetadataLog(received, m) + continue + } + + // Determine if the incoming metadata is a duplicate by checking if we've + // already received metadata from this peer. + existingIndex := -1 + for i, existingMetadata := range received.results { + if existingMetadata.peer.Host().ID() == m.peer.Host().ID() { + existingIndex = i + break + } + } + + if existingIndex != -1 { + // If it is a duplicate, then overwrite it (always keep the most recent + // duplicate) + received.results[existingIndex] = m + } else { + // Otherwise it's not a duplicate, so its safe to append. + received.results = append(received.results, m) + } + + // Since we always perform an overwrite instead of an append for duplicates + // from the same peer, once len(received.results == peersLen) then we know + // that we've received at least one metadata from every peer and its safe + // to enqueue the entry. + if len(received.results) == peersLen { + enqueueCh.enqueue(received.results) + received.enqueued = true + } + + // Ensure tracking enqueued by setting modified result back to map + metadata.Set(key, received) + } + + // Enqueue all unenqueued received metadata. Note that these entries will have + // metadata from only a subset of their peers. + for _, entry := range metadata.Iter() { + received := entry.Value() + if received.enqueued { + continue + } + enqueueCh.enqueue(received.results) + } +} + +// emitDuplicateMetadataLog emits a log with the details of the duplicate metadata +// event. Note: We're able to log the blocks themselves because the slice is no longer +// mutated downstream after enqueuing into the enqueue channel, it's copied before +// mutated or operated on. +func (s *session) emitDuplicateMetadataLog( + received receivedBlocks, + metadata receivedBlockMetadata, +) { + // Debug-level because this is a common enough occurrence that logging it by + // default would be noisy. + // This is due to peers sending the most recent data + // to the oldest data in that order, hence sometimes its possible to resend + // data for a block already sent over the wire if it just moved from being + // mutable in memory to immutable on disk. + if !s.log.Core().Enabled(zapcore.DebugLevel) { + return + } + + var checksum uint32 + if v := metadata.block.checksum; v != nil { + checksum = *v + } + + fields := make([]zapcore.Field, 0, len(received.results)+1) + fields = append(fields, zap.String("incoming-metadata", fmt.Sprintf( + "id=%s, peer=%s, start=%s, size=%v, checksum=%v", + metadata.id.String(), + metadata.peer.Host().String(), + metadata.block.start.String(), + metadata.block.size, + checksum))) + + for i, existing := range received.results { + checksum = 0 + if v := existing.block.checksum; v != nil { + checksum = *v + } + + fields = append(fields, zap.String( + fmt.Sprintf("existing-metadata-%d", i), + fmt.Sprintf( + "id=%s, peer=%s, start=%s, size=%v, checksum=%v", + existing.id.String(), + existing.peer.Host().String(), + existing.block.start.String(), + existing.block.size, + checksum))) + } + + s.log.Debug("received metadata, but peer metadata has already been submitted", fields...) +} + +type pickBestPeerFn func( + perPeerBlockMetadata []receivedBlockMetadata, + peerQueues peerBlocksQueues, + resources pickBestPeerPooledResources, +) (index int, pooled pickBestPeerPooledResources) + +type pickBestPeerPooledResources struct { + ranking []receivedBlockMetadataQueue +} + +func (s *session) streamBlocksPickBestPeer( + perPeerBlockMetadata []receivedBlockMetadata, + peerQueues peerBlocksQueues, + pooled pickBestPeerPooledResources, +) (int, pickBestPeerPooledResources) { + // Order by least attempts then by least outstanding blocks being fetched + pooled.ranking = pooled.ranking[:0] + for i := range perPeerBlockMetadata { + elem := receivedBlockMetadataQueue{ + blockMetadata: perPeerBlockMetadata[i], + queue: peerQueues.findQueue(perPeerBlockMetadata[i].peer), + } + pooled.ranking = append(pooled.ranking, elem) + } + elems := receivedBlockMetadataQueuesByAttemptsAscOutstandingAsc(pooled.ranking) + sort.Stable(elems) + + // Return index of the best peer + var ( + bestPeer = pooled.ranking[0].queue.peer + idx int + ) + for i := range perPeerBlockMetadata { + if bestPeer == perPeerBlockMetadata[i].peer { + idx = i + break + } + } + return idx, pooled +} + +type selectPeersFromPerPeerBlockMetadatasPooledResources struct { + currEligible []receivedBlockMetadata + pickBestPeerPooledResources pickBestPeerPooledResources +} + +func (s *session) selectPeersFromPerPeerBlockMetadatas( + perPeerBlocksMetadata []receivedBlockMetadata, + peerQueues peerBlocksQueues, + reEnqueueCh enqueueChannel, + consistencyLevel runtimeReadConsistencyLevel, + peers peers, + pooled selectPeersFromPerPeerBlockMetadatasPooledResources, + m *streamFromPeersMetrics, +) ([]receivedBlockMetadata, selectPeersFromPerPeerBlockMetadatasPooledResources) { + // Copy into pooled array so we don't mutate existing slice passed + pooled.currEligible = pooled.currEligible[:0] + pooled.currEligible = append(pooled.currEligible, perPeerBlocksMetadata...) + + currEligible := pooled.currEligible[:] + + // Sort the per peer metadatas by peer ID for consistent results + sort.Sort(peerBlockMetadataByID(currEligible)) + + // Only select from peers not already attempted + curr := currEligible[0] + currID := curr.id + currBlock := curr.block + for i := len(currEligible) - 1; i >= 0; i-- { + if currEligible[i].block.reattempt.attempt == 0 { + // Not attempted yet + continue + } + + // Check if eligible + n := s.streamBlocksMaxBlockRetries + if currEligible[i].block.reattempt.peerAttempts(currEligible[i].peer) >= n { + // Swap current entry to tail + receivedBlockMetadatas(currEligible).swap(i, len(currEligible)-1) + // Trim newly last entry + currEligible = currEligible[:len(currEligible)-1] + continue + } + } + + if len(currEligible) == 0 { + // No current eligible peers to select from + majority := peers.majorityReplicas + enqueued := len(peers.peers) + success := 0 + if peers.selfExcludedAndSelfHasShardAvailable() { + // If we excluded ourselves from fetching, we basically treat ourselves + // as a successful peer response since our copy counts towards quorum + enqueued++ + success++ + } + + errMsg := "all retries failed for streaming blocks from peers" + fanoutFetchState := currBlock.reattempt.fanoutFetchState + if fanoutFetchState != nil { + if fanoutFetchState.decrementAndReturnPending() > 0 { + // This block was fanned out to fetch from all peers and we haven't + // received all the results yet, so don't retry it just yet + return nil, pooled + } + + // NB(r): This was enqueued after a failed fetch and all other fanout + // fetches have completed, check if the consistency level was achieved, + // if not then re-enqueue to continue to retry otherwise do not + // re-enqueue and see if we need mark this as an error. + success = fanoutFetchState.success() + } + + level := consistencyLevel.value() + achievedConsistencyLevel := topology.ReadConsistencyAchieved(level, majority, enqueued, success) + if achievedConsistencyLevel { + if success > 0 { + // Some level of success met, no need to log an error + return nil, pooled + } + + // No success, inform operator that although consistency level achieved + // there were no successful fetches. This can happen if consistency + // level is set to None. + m.fetchBlockFinalError.Inc(1) + s.log.Error(errMsg, + zap.Stringer("id", currID), + zap.Time("start", currBlock.start), + zap.Int("attempted", currBlock.reattempt.attempt), + zap.String("attemptErrs", xerrors.Errors(currBlock.reattempt.errs).Error()), + zap.Stringer("consistencyLevel", level), + ) + + return nil, pooled + } + + // Retry again by re-enqueuing, have not met consistency level yet + m.fetchBlockFullRetry.Inc(1) + + err := fmt.Errorf(errMsg+": attempts=%d", curr.block.reattempt.attempt) + reattemptReason := consistencyLevelNotAchievedErrReason + reattemptType := fullRetryReattemptType + reattemptBlocks := []receivedBlockMetadata{curr} + s.reattemptStreamBlocksFromPeersFn(reattemptBlocks, reEnqueueCh, + err, reattemptReason, reattemptType, m) + + return nil, pooled + } + + var ( + singlePeer = len(currEligible) == 1 + sameNonNilChecksum = true + curChecksum *uint32 + ) + for i := range currEligible { + // If any peer has a nil checksum, this might be the most recent block + // and therefore not sealed so we want to merge from all peers + if currEligible[i].block.checksum == nil { + sameNonNilChecksum = false + break + } + if curChecksum == nil { + curChecksum = currEligible[i].block.checksum + } else if *curChecksum != *currEligible[i].block.checksum { + sameNonNilChecksum = false + break + } + } + + // If all the peers have the same non-nil checksum, we pick the peer with the + // fewest attempts and fewest outstanding requests + if singlePeer || sameNonNilChecksum { + var idx int + if singlePeer { + idx = 0 + } else { + pooledResources := pooled.pickBestPeerPooledResources + idx, pooledResources = s.pickBestPeerFn(currEligible, peerQueues, + pooledResources) + pooled.pickBestPeerPooledResources = pooledResources + } + + // Set the reattempt metadata + selected := currEligible[idx] + selected.block.reattempt.attempt++ + selected.block.reattempt.attempted = + append(selected.block.reattempt.attempted, selected.peer) + selected.block.reattempt.fanoutFetchState = nil + selected.block.reattempt.retryPeersMetadata = perPeerBlocksMetadata + selected.block.reattempt.fetchedPeersMetadata = perPeerBlocksMetadata + + // Return just the single peer we selected + currEligible = currEligible[:1] + currEligible[0] = selected + } else { + fanoutFetchState := newBlockFanoutFetchState(len(currEligible)) + for i := range currEligible { + // Set the reattempt metadata + // NB(xichen): each block will only be retried on the same peer because we + // already fan out the request to all peers. This means we merge data on + // a best-effort basis and only fail if we failed to reach the desired + // consistency level when reading data from all peers. + var retryFrom []receivedBlockMetadata + for j := range perPeerBlocksMetadata { + if currEligible[i].peer == perPeerBlocksMetadata[j].peer { + // NB(r): Take a ref to a subslice from the originally passed + // slice as that is not mutated, whereas currEligible is reused + retryFrom = perPeerBlocksMetadata[j : j+1] + } + } + currEligible[i].block.reattempt.attempt++ + currEligible[i].block.reattempt.attempted = + append(currEligible[i].block.reattempt.attempted, currEligible[i].peer) + currEligible[i].block.reattempt.fanoutFetchState = fanoutFetchState + currEligible[i].block.reattempt.retryPeersMetadata = retryFrom + currEligible[i].block.reattempt.fetchedPeersMetadata = perPeerBlocksMetadata + } + } + + return currEligible, pooled +} + +func (s *session) streamBlocksBatchFromPeer( + namespaceMetadata namespace.Metadata, + shard uint32, + peer peer, + batch []receivedBlockMetadata, + opts result.Options, + blocksResult blocksResult, + enqueueCh enqueueChannel, + retrier xretry.Retrier, + m *streamFromPeersMetrics, +) { + // Prepare request + var ( + req = rpc.NewFetchBlocksRawRequest() + result *rpc.FetchBlocksRawResult_ + reqBlocksLen uint + + nowFn = opts.ClockOptions().NowFn() + ropts = namespaceMetadata.Options().RetentionOptions() + retention = ropts.RetentionPeriod() + earliestBlockStart = nowFn().Add(-retention).Truncate(ropts.BlockSize()) + ) + req.NameSpace = namespaceMetadata.ID().Bytes() + req.Shard = int32(shard) + req.Elements = make([]*rpc.FetchBlocksRawRequestElement, 0, len(batch)) + for i := range batch { + blockStart := batch[i].block.start + if blockStart.Before(earliestBlockStart) { + continue // Fell out of retention while we were streaming blocks + } + req.Elements = append(req.Elements, &rpc.FetchBlocksRawRequestElement{ + ID: batch[i].id.Bytes(), + Starts: []int64{blockStart.UnixNano()}, + }) + reqBlocksLen++ + } + if reqBlocksLen == 0 { + // All blocks fell out of retention while streaming + return + } + + // Attempt request + if err := retrier.Attempt(func() error { + var attemptErr error + borrowErr := peer.BorrowConnection(func(client rpc.TChanNode) { + tctx, _ := thrift.NewContext(s.streamBlocksBatchTimeout) + result, attemptErr = client.FetchBlocksRaw(tctx, req) + }) + err := xerrors.FirstError(borrowErr, attemptErr) + return err + }); err != nil { + blocksErr := fmt.Errorf( + "stream blocks request error: error=%s, peer=%s", + err.Error(), peer.Host().String(), + ) + s.reattemptStreamBlocksFromPeersFn(batch, enqueueCh, blocksErr, + reqErrReason, nextRetryReattemptType, m) + m.fetchBlockError.Inc(int64(reqBlocksLen)) + s.log.Debug(blocksErr.Error()) + return + } + + // Parse and act on result + tooManyIDsLogged := false + for i := range result.Elements { + if i >= len(batch) { + m.fetchBlockError.Inc(int64(len(req.Elements[i].Starts))) + m.fetchBlockFinalError.Inc(int64(len(req.Elements[i].Starts))) + if !tooManyIDsLogged { + tooManyIDsLogged = true + s.log.Error("stream blocks more IDs than expected", + zap.Stringer("peer", peer.Host()), + ) + } + continue + } + + id := batch[i].id + if !bytes.Equal(id.Bytes(), result.Elements[i].ID) { + blocksErr := fmt.Errorf( + "stream blocks mismatched ID: expectedID=%s, actualID=%s, indexID=%d, peer=%s", + batch[i].id.String(), id.String(), i, peer.Host().String(), + ) + failed := []receivedBlockMetadata{batch[i]} + s.reattemptStreamBlocksFromPeersFn(failed, enqueueCh, blocksErr, + respErrReason, nextRetryReattemptType, m) + m.fetchBlockError.Inc(int64(len(req.Elements[i].Starts))) + s.log.Debug(blocksErr.Error()) + continue + } + + if len(result.Elements[i].Blocks) == 0 { + // If fell out of retention during request this is healthy, otherwise + // missing blocks will be repaired during an active repair + continue + } + + // We only ever fetch a single block for a series + if len(result.Elements[i].Blocks) != 1 { + errMsg := "stream blocks returned more blocks than expected" + blocksErr := fmt.Errorf(errMsg+": expected=%d, actual=%d", + 1, len(result.Elements[i].Blocks)) + failed := []receivedBlockMetadata{batch[i]} + s.reattemptStreamBlocksFromPeersFn(failed, enqueueCh, blocksErr, + respErrReason, nextRetryReattemptType, m) + m.fetchBlockError.Inc(int64(len(req.Elements[i].Starts))) + s.log.Error(errMsg, + zap.Stringer("id", id), + zap.Times("expectedStarts", newTimesByUnixNanos(req.Elements[i].Starts)), + zap.Times("actualStarts", newTimesByRPCBlocks(result.Elements[i].Blocks)), + zap.Stringer("peer", peer.Host()), + ) + continue + } + + for j, block := range result.Elements[i].Blocks { + if block.Start != batch[i].block.start.UnixNano() { + errMsg := "stream blocks returned different blocks than expected" + blocksErr := fmt.Errorf(errMsg+": expected=%s, actual=%d", + batch[i].block.start.String(), time.Unix(0, block.Start).String()) + failed := []receivedBlockMetadata{batch[i]} + s.reattemptStreamBlocksFromPeersFn(failed, enqueueCh, blocksErr, + respErrReason, nextRetryReattemptType, m) + m.fetchBlockError.Inc(int64(len(req.Elements[i].Starts))) + s.log.Error(errMsg, + zap.Stringer("id", id), + zap.Times("expectedStarts", newTimesByUnixNanos(req.Elements[i].Starts)), + zap.Times("actualStarts", newTimesByRPCBlocks(result.Elements[i].Blocks)), + zap.Stringer("peer", peer.Host()), + ) + continue + } + + // Verify and if verify succeeds add the block from the peer + err := s.verifyFetchedBlock(block) + if err == nil { + err = blocksResult.addBlockFromPeer(id, batch[i].encodedTags, + peer.Host(), block) + } + if err != nil { + failed := []receivedBlockMetadata{batch[i]} + blocksErr := fmt.Errorf( + "stream blocks bad block: id=%s, start=%d, error=%s, indexID=%d, indexBlock=%d, peer=%s", + id.String(), block.Start, err.Error(), i, j, peer.Host().String()) + s.reattemptStreamBlocksFromPeersFn(failed, enqueueCh, blocksErr, + respErrReason, nextRetryReattemptType, m) + m.fetchBlockError.Inc(1) + s.log.Debug(blocksErr.Error()) + continue + } + + // NB(r): Track a fanned out block fetch success if added block + fanout := batch[i].block.reattempt.fanoutFetchState + if fanout != nil { + fanout.incrementSuccess() + } + + m.fetchBlockSuccess.Inc(1) + } + } +} + +func (s *session) verifyFetchedBlock(block *rpc.Block) error { + if block.Err != nil { + return fmt.Errorf("block error from peer: %s %s", block.Err.Type.String(), block.Err.Message) + } + if block.Segments == nil { + return fmt.Errorf("block segments is bad: segments is nil") + } + if block.Segments.Merged == nil && len(block.Segments.Unmerged) == 0 { + return fmt.Errorf("block segments is bad: merged and unmerged not set") + } + + if checksum := block.Checksum; checksum != nil { + var ( + d = digest.NewDigest() + expected = uint32(*checksum) + ) + if merged := block.Segments.Merged; merged != nil { + d = d.Update(merged.Head).Update(merged.Tail) + } else { + for _, s := range block.Segments.Unmerged { + d = d.Update(s.Head).Update(s.Tail) + } + } + if actual := d.Sum32(); actual != expected { + return fmt.Errorf("block checksum is bad: expected=%d, actual=%d", expected, actual) + } + } + + return nil +} + +func (s *session) cloneFinalizable(id ident.ID) ident.ID { + if id.IsNoFinalize() { + return id + } + return s.pools.id.Clone(id) +} + +func (s *session) nsCtxFromMetadata(nsMeta namespace.Metadata) (namespace.Context, error) { + nsCtx := namespace.NewContextFrom(nsMeta) + if s.opts.IsSetEncodingProto() && nsCtx.Schema == nil { + return nsCtx, fmt.Errorf("no protobuf schema found for namespace: %s", nsMeta.ID().String()) + } + return nsCtx, nil +} + +func (s *session) nsCtxFor(ns ident.ID) (namespace.Context, error) { + nsCtx := namespace.NewContextFor(ns, s.opts.SchemaRegistry()) + if s.opts.IsSetEncodingProto() && nsCtx.Schema == nil { + return nsCtx, fmt.Errorf("no protobuf schema found for namespace: %s", ns.String()) + } + return nsCtx, nil +} + +type reason int + +const ( + reqErrReason reason = iota + respErrReason + consistencyLevelNotAchievedErrReason +) + +type reattemptType int + +const ( + nextRetryReattemptType reattemptType = iota + fullRetryReattemptType +) + +type reattemptStreamBlocksFromPeersFn func( + []receivedBlockMetadata, + enqueueChannel, + error, + reason, + reattemptType, + *streamFromPeersMetrics, +) error + +func (s *session) streamBlocksReattemptFromPeers( + blocks []receivedBlockMetadata, + enqueueCh enqueueChannel, + attemptErr error, + reason reason, + reattemptType reattemptType, + m *streamFromPeersMetrics, +) error { + switch reason { + case reqErrReason: + m.fetchBlockRetriesReqError.Inc(int64(len(blocks))) + case respErrReason: + m.fetchBlockRetriesRespError.Inc(int64(len(blocks))) + case consistencyLevelNotAchievedErrReason: + m.fetchBlockRetriesConsistencyLevelNotAchievedError.Inc(int64(len(blocks))) + } + + // Must do this asynchronously or else could get into a deadlock scenario + // where cannot enqueue into the reattempt channel because no more work is + // getting done because new attempts are blocked on existing attempts completing + // and existing attempts are trying to enqueue into a full reattempt channel + enqueue, done, err := enqueueCh.enqueueDelayed(len(blocks)) + if err != nil { + return err + } + go s.streamBlocksReattemptFromPeersEnqueue(blocks, attemptErr, reattemptType, + enqueue, done) + return nil +} + +func (s *session) streamBlocksReattemptFromPeersEnqueue( + blocks []receivedBlockMetadata, + attemptErr error, + reattemptType reattemptType, + enqueueFn enqueueDelayedFn, + enqueueDoneFn enqueueDelayedDoneFn, +) { + // NB(r): Notify the delayed enqueue is done. + defer enqueueDoneFn() + + for i := range blocks { + var reattemptPeersMetadata []receivedBlockMetadata + switch reattemptType { + case nextRetryReattemptType: + reattemptPeersMetadata = blocks[i].block.reattempt.retryPeersMetadata + case fullRetryReattemptType: + reattemptPeersMetadata = blocks[i].block.reattempt.fetchedPeersMetadata + } + if len(reattemptPeersMetadata) == 0 { + continue + } + + // Reconstruct peers metadata for reattempt + reattemptBlocksMetadata := make([]receivedBlockMetadata, len(reattemptPeersMetadata)) + for j := range reattemptPeersMetadata { + var reattempt blockMetadataReattempt + if reattemptType == nextRetryReattemptType { + // Only if a default type of retry do we want to actually want + // to set all the retry metadata, otherwise this re-enqueued metadata + // should start fresh + reattempt = blocks[i].block.reattempt + + // Copy the errors for every peer so they don't shard the same error + // slice and therefore are not subject to race conditions when the + // error slice is modified + reattemptErrs := make([]error, len(reattempt.errs)+1) + n := copy(reattemptErrs, reattempt.errs) + reattemptErrs[n] = attemptErr + reattempt.errs = reattemptErrs + } + + reattemptBlocksMetadata[j] = receivedBlockMetadata{ + peer: reattemptPeersMetadata[j].peer, + id: blocks[i].id, + block: blockMetadata{ + start: reattemptPeersMetadata[j].block.start, + size: reattemptPeersMetadata[j].block.size, + checksum: reattemptPeersMetadata[j].block.checksum, + reattempt: reattempt, + }, + } + } + + // Re-enqueue the block to be fetched from all peers requested + // to reattempt from + enqueueFn(reattemptBlocksMetadata) + } +} + +type blocksResult interface { + addBlockFromPeer( + id ident.ID, + encodedTags checked.Bytes, + peer topology.Host, + block *rpc.Block, + ) error +} + +type baseBlocksResult struct { + nsCtx namespace.Context + blockOpts block.Options + blockAllocSize int + contextPool context.Pool + encoderPool encoding.EncoderPool + multiReaderIteratorPool encoding.MultiReaderIteratorPool +} + +func newBaseBlocksResult( + nsCtx namespace.Context, + opts Options, + resultOpts result.Options, +) baseBlocksResult { + blockOpts := resultOpts.DatabaseBlockOptions() + return baseBlocksResult{ + nsCtx: nsCtx, + blockOpts: blockOpts, + blockAllocSize: blockOpts.DatabaseBlockAllocSize(), + contextPool: opts.ContextPool(), + encoderPool: blockOpts.EncoderPool(), + multiReaderIteratorPool: blockOpts.MultiReaderIteratorPool(), + } +} + +func (b *baseBlocksResult) segmentForBlock(seg *rpc.Segment) ts.Segment { + var ( + bytesPool = b.blockOpts.BytesPool() + head, tail checked.Bytes + ) + if len(seg.Head) > 0 { + head = bytesPool.Get(len(seg.Head)) + head.IncRef() + head.AppendAll(seg.Head) + head.DecRef() + } + if len(seg.Tail) > 0 { + tail = bytesPool.Get(len(seg.Tail)) + tail.IncRef() + tail.AppendAll(seg.Tail) + tail.DecRef() + } + var checksum uint32 + if seg.Checksum != nil { + checksum = uint32(*seg.Checksum) + } + + return ts.NewSegment(head, tail, checksum, ts.FinalizeHead&ts.FinalizeTail) +} + +func (b *baseBlocksResult) mergeReaders(start time.Time, blockSize time.Duration, readers []xio.SegmentReader) (encoding.Encoder, error) { + iter := b.multiReaderIteratorPool.Get() + iter.Reset(readers, start, blockSize, b.nsCtx.Schema) + defer iter.Close() + + encoder := b.encoderPool.Get() + encoder.Reset(start, b.blockAllocSize, b.nsCtx.Schema) + + for iter.Next() { + dp, unit, annotation := iter.Current() + if err := encoder.Encode(dp, unit, annotation); err != nil { + encoder.Close() + return nil, err + } + } + if err := iter.Err(); err != nil { + encoder.Close() + return nil, err + } + + return encoder, nil +} + +func (b *baseBlocksResult) newDatabaseBlock(block *rpc.Block) (block.DatabaseBlock, error) { + var ( + start = time.Unix(0, block.Start) + segments = block.Segments + result = b.blockOpts.DatabaseBlockPool().Get() + ) + + if segments == nil { + result.Close() // return block to pool + return nil, errSessionBadBlockResultFromPeer + } + + switch { + case segments.Merged != nil: + // Unmerged, can insert directly into a single block + mergedBlock := segments.Merged + result.Reset(start, durationConvert(mergedBlock.BlockSize), b.segmentForBlock(mergedBlock), b.nsCtx) + + case segments.Unmerged != nil: + // Must merge to provide a single block + segmentReaderPool := b.blockOpts.SegmentReaderPool() + readers := make([]xio.SegmentReader, len(segments.Unmerged)) + + blockSize := time.Duration(0) + for i, seg := range segments.Unmerged { + segmentReader := segmentReaderPool.Get() + segmentReader.Reset(b.segmentForBlock(seg)) + readers[i] = segmentReader + + bs := durationConvert(seg.BlockSize) + if bs > blockSize { + blockSize = bs + } + } + encoder, err := b.mergeReaders(start, blockSize, readers) + for _, reader := range readers { + // Close each reader + reader.Finalize() + } + + if err != nil { + // mergeReaders(...) already calls encoder.Close() upon error + result.Close() // return block to pool + return nil, err + } + + // Set the block data + result.Reset(start, blockSize, encoder.Discard(), b.nsCtx) + + default: + result.Close() // return block to pool + return nil, errSessionBadBlockResultFromPeer + } + + return result, nil +} + +// Ensure streamBlocksResult implements blocksResult +var _ blocksResult = (*streamBlocksResult)(nil) + +type streamBlocksResult struct { + baseBlocksResult + outputCh chan<- peerBlocksDatapoint + tagDecoder serialize.TagDecoder + idPool ident.Pool + nsCtx namespace.Context +} + +func newStreamBlocksResult( + nsCtx namespace.Context, + opts Options, + resultOpts result.Options, + outputCh chan<- peerBlocksDatapoint, + tagDecoder serialize.TagDecoder, + idPool ident.Pool, +) *streamBlocksResult { + return &streamBlocksResult{ + nsCtx: nsCtx, + baseBlocksResult: newBaseBlocksResult(nsCtx, opts, resultOpts), + outputCh: outputCh, + tagDecoder: tagDecoder, + idPool: idPool, + } +} + +type peerBlocksDatapoint struct { + id ident.ID + tags ident.Tags + peer topology.Host + block block.DatabaseBlock +} + +func (s *streamBlocksResult) addBlockFromPeer( + id ident.ID, + encodedTags checked.Bytes, + peer topology.Host, + block *rpc.Block, +) error { + result, err := s.newDatabaseBlock(block) + if err != nil { + return err + } + tags, err := newTagsFromEncodedTags(id, encodedTags, + s.tagDecoder, s.idPool) + if err != nil { + return err + } + s.outputCh <- peerBlocksDatapoint{ + id: id, + tags: tags, + peer: peer, + block: result, + } + return nil +} + +type peerBlocksIter struct { + inputCh <-chan peerBlocksDatapoint + errCh <-chan error + current peerBlocksDatapoint + err error + done bool +} + +func newPeerBlocksIter( + inputC <-chan peerBlocksDatapoint, + errC <-chan error, +) *peerBlocksIter { + return &peerBlocksIter{ + inputCh: inputC, + errCh: errC, + } +} + +func (it *peerBlocksIter) Current() (topology.Host, ident.ID, block.DatabaseBlock) { + return it.current.peer, it.current.id, it.current.block +} + +func (it *peerBlocksIter) Err() error { + return it.err +} + +func (it *peerBlocksIter) Next() bool { + if it.done || it.err != nil { + return false + } + m, more := <-it.inputCh + + if !more { + it.err = <-it.errCh + it.done = true + return false + } + + it.current = m + return true +} + +// Ensure streamBlocksResult implements blocksResult +var _ blocksResult = (*bulkBlocksResult)(nil) + +type bulkBlocksResult struct { + sync.RWMutex + baseBlocksResult + result result.ShardResult + tagDecoderPool serialize.TagDecoderPool + idPool ident.Pool + nsCtx namespace.Context +} + +func newBulkBlocksResult( + nsCtx namespace.Context, + opts Options, + resultOpts result.Options, + tagDecoderPool serialize.TagDecoderPool, + idPool ident.Pool, +) *bulkBlocksResult { + return &bulkBlocksResult{ + nsCtx: nsCtx, + baseBlocksResult: newBaseBlocksResult(nsCtx, opts, resultOpts), + result: result.NewShardResult(shardResultCapacity, resultOpts), + tagDecoderPool: tagDecoderPool, + idPool: idPool, + } +} + +func (r *bulkBlocksResult) addBlockFromPeer( + id ident.ID, + encodedTags checked.Bytes, + peer topology.Host, + block *rpc.Block, +) error { + start := time.Unix(0, block.Start) + result, err := r.newDatabaseBlock(block) + if err != nil { + return err + } + + var ( + tags ident.Tags + attemptedDecodeTags bool + ) + for { + r.Lock() + currBlock, exists := r.result.BlockAt(id, start) + if !exists { + if encodedTags == nil || attemptedDecodeTags { + r.result.AddBlock(id, tags, result) + r.Unlock() + break + } + r.Unlock() + + // Tags not decoded yet, attempt decoded and then reinsert + attemptedDecodeTags = true + tagDecoder := r.tagDecoderPool.Get() + tags, err = newTagsFromEncodedTags(id, encodedTags, + tagDecoder, r.idPool) + tagDecoder.Close() + if err != nil { + return err + } + continue + } + + // Remove the existing block from the result so it doesn't get + // merged again + r.result.RemoveBlockAt(id, start) + r.Unlock() + + // If we've already received data for this block, merge them + // with the new block if possible + tmpCtx := r.contextPool.Get() + currReader, err := currBlock.Stream(tmpCtx) + if err != nil { + return err + } + + // If there are no data in the current block, there is no + // need to merge + if currReader.IsEmpty() { + continue + } + + resultReader, err := result.Stream(tmpCtx) + if err != nil { + return err + } + if resultReader.IsEmpty() { + return nil + } + + readers := []xio.SegmentReader{currReader.SegmentReader, resultReader.SegmentReader} + blockSize := currReader.BlockSize + + encoder, err := r.mergeReaders(start, blockSize, readers) + + if err != nil { + return err + } + + result.Close() + + result = r.blockOpts.DatabaseBlockPool().Get() + result.Reset(start, blockSize, encoder.Discard(), r.nsCtx) + + tmpCtx.Close() + } + + return nil +} + +type enqueueCh struct { + sync.Mutex + sending int + enqueued int + processed int + peersMetadataCh chan []receivedBlockMetadata + closed bool + enqueueDelayedFn enqueueDelayedFn + enqueueDelayedDoneFn enqueueDelayedDoneFn + metrics *streamFromPeersMetrics +} + +const enqueueChannelDefaultLen = 32768 + +func newEnqueueChannel(m *streamFromPeersMetrics) enqueueChannel { + c := &enqueueCh{ + peersMetadataCh: make(chan []receivedBlockMetadata, enqueueChannelDefaultLen), + metrics: m, + } + + // Allocate the enqueue delayed fn just once + c.enqueueDelayedFn = func(peersMetadata []receivedBlockMetadata) { + c.peersMetadataCh <- peersMetadata + } + c.enqueueDelayedDoneFn = func() { + c.Lock() + c.sending-- + c.Unlock() + } + + go func() { + for { + c.Lock() + closed := c.closed + numEnqueued := float64(len(c.peersMetadataCh)) + c.Unlock() + if closed { + return + } + m.blocksEnqueueChannel.Update(numEnqueued) + time.Sleep(gaugeReportInterval) + } + }() + return c +} + +func (c *enqueueCh) enqueue(peersMetadata []receivedBlockMetadata) error { + c.Lock() + if c.closed { + c.Unlock() + return errEnqueueChIsClosed + } + c.enqueued++ + c.sending++ + c.Unlock() + c.peersMetadataCh <- peersMetadata + c.Lock() + c.sending-- + c.Unlock() + return nil +} + +func (c *enqueueCh) enqueueDelayed(numToEnqueue int) (enqueueDelayedFn, enqueueDelayedDoneFn, error) { + c.Lock() + if c.closed { + c.Unlock() + return nil, nil, errEnqueueChIsClosed + } + c.sending++ // NB(r): This is decremented by calling the returned enqueue done function + c.enqueued += (numToEnqueue) + c.Unlock() + return c.enqueueDelayedFn, c.enqueueDelayedDoneFn, nil +} + +// read is always safe to call since you can safely range +// over a closed channel, and/or do a checked read in case +// it is closed (unlike when publishing to a channel). +func (c *enqueueCh) read() <-chan []receivedBlockMetadata { + return c.peersMetadataCh +} + +func (c *enqueueCh) trackPending(amount int) { + c.Lock() + c.enqueued += amount + c.Unlock() +} + +func (c *enqueueCh) trackProcessed(amount int) { + c.Lock() + c.processed += amount + c.Unlock() +} + +func (c *enqueueCh) unprocessedLen() int { + c.Lock() + unprocessed := c.unprocessedLenWithLock() + c.Unlock() + return unprocessed +} + +func (c *enqueueCh) unprocessedLenWithLock() int { + return c.enqueued - c.processed +} + +func (c *enqueueCh) closeOnAllProcessed() { + for { + c.Lock() + if c.unprocessedLenWithLock() == 0 && c.sending == 0 { + close(c.peersMetadataCh) + c.closed = true + c.Unlock() + return + } + c.Unlock() + time.Sleep(100 * time.Millisecond) + } +} + +type receivedBlocks struct { + enqueued bool + results []receivedBlockMetadata +} + +type processFn func(batch []receivedBlockMetadata) + +// peerBlocksQueue is a per peer queue of blocks to be retrieved from a peer +type peerBlocksQueue struct { + sync.RWMutex + closed bool + peer peer + queue []receivedBlockMetadata + doneFns []func() + assigned uint64 + completed uint64 + maxQueueSize int + workers xsync.WorkerPool + processFn processFn +} + +type newPeerBlocksQueueFn func( + peer peer, + maxQueueSize int, + interval time.Duration, + workers xsync.WorkerPool, + processFn processFn, +) *peerBlocksQueue + +func newPeerBlocksQueue( + peer peer, + maxQueueSize int, + interval time.Duration, + workers xsync.WorkerPool, + processFn processFn, +) *peerBlocksQueue { + q := &peerBlocksQueue{ + peer: peer, + maxQueueSize: maxQueueSize, + workers: workers, + processFn: processFn, + } + if interval > 0 { + go q.drainEvery(interval) + } + return q +} + +func (q *peerBlocksQueue) drainEvery(interval time.Duration) { + for { + q.Lock() + if q.closed { + q.Unlock() + return + } + q.drainWithLock() + q.Unlock() + time.Sleep(interval) + } +} + +func (q *peerBlocksQueue) close() { + q.Lock() + defer q.Unlock() + q.closed = true +} + +func (q *peerBlocksQueue) trackAssigned(amount int) { + atomic.AddUint64(&q.assigned, uint64(amount)) +} + +func (q *peerBlocksQueue) trackCompleted(amount int) { + atomic.AddUint64(&q.completed, uint64(amount)) +} + +func (q *peerBlocksQueue) enqueue(bl receivedBlockMetadata, doneFn func()) { + q.Lock() + + if len(q.queue) == 0 && cap(q.queue) < q.maxQueueSize { + // Lazy initialize queue + q.queue = make([]receivedBlockMetadata, 0, q.maxQueueSize) + } + if len(q.doneFns) == 0 && cap(q.doneFns) < q.maxQueueSize { + // Lazy initialize doneFns + q.doneFns = make([]func(), 0, q.maxQueueSize) + } + q.queue = append(q.queue, bl) + if doneFn != nil { + q.doneFns = append(q.doneFns, doneFn) + } + q.trackAssigned(1) + + // Determine if should drain immediately + if len(q.queue) < q.maxQueueSize { + // Require more to fill up block + q.Unlock() + return + } + q.drainWithLock() + + q.Unlock() +} + +func (q *peerBlocksQueue) drain() { + q.Lock() + q.drainWithLock() + q.Unlock() +} + +func (q *peerBlocksQueue) drainWithLock() { + if len(q.queue) == 0 { + // None to drain + return + } + enqueued := q.queue + doneFns := q.doneFns + q.queue = nil + q.doneFns = nil + q.workers.Go(func() { + q.processFn(enqueued) + // Call done callbacks + for i := range doneFns { + doneFns[i]() + } + // Track completed blocks + q.trackCompleted(len(enqueued)) + }) +} + +type peerBlocksQueues []*peerBlocksQueue + +func (qs peerBlocksQueues) findQueue(peer peer) *peerBlocksQueue { + for _, q := range qs { + if q.peer == peer { + return q + } + } + return nil +} + +func (qs peerBlocksQueues) closeAll() { + for _, q := range qs { + q.close() + } +} + +type receivedBlockMetadata struct { + peer peer + id ident.ID + encodedTags checked.Bytes + block blockMetadata +} + +type receivedBlockMetadatas []receivedBlockMetadata + +func (arr receivedBlockMetadatas) swap(i, j int) { arr[i], arr[j] = arr[j], arr[i] } + +type peerBlockMetadataByID []receivedBlockMetadata + +func (arr peerBlockMetadataByID) Len() int { return len(arr) } +func (arr peerBlockMetadataByID) Swap(i, j int) { arr[i], arr[j] = arr[j], arr[i] } +func (arr peerBlockMetadataByID) Less(i, j int) bool { + return strings.Compare(arr[i].peer.Host().ID(), arr[j].peer.Host().ID()) < 0 +} + +type receivedBlockMetadataQueue struct { + blockMetadata receivedBlockMetadata + queue *peerBlocksQueue +} + +type receivedBlockMetadataQueuesByAttemptsAscOutstandingAsc []receivedBlockMetadataQueue + +func (arr receivedBlockMetadataQueuesByAttemptsAscOutstandingAsc) Len() int { + return len(arr) +} +func (arr receivedBlockMetadataQueuesByAttemptsAscOutstandingAsc) Swap(i, j int) { + arr[i], arr[j] = arr[j], arr[i] +} +func (arr receivedBlockMetadataQueuesByAttemptsAscOutstandingAsc) Less(i, j int) bool { + peerI := arr[i].queue.peer + peerJ := arr[j].queue.peer + attemptsI := arr[i].blockMetadata.block.reattempt.peerAttempts(peerI) + attemptsJ := arr[j].blockMetadata.block.reattempt.peerAttempts(peerJ) + if attemptsI != attemptsJ { + return attemptsI < attemptsJ + } + + outstandingI := + atomic.LoadUint64(&arr[i].queue.assigned) - + atomic.LoadUint64(&arr[i].queue.completed) + outstandingJ := + atomic.LoadUint64(&arr[j].queue.assigned) - + atomic.LoadUint64(&arr[j].queue.completed) + return outstandingI < outstandingJ +} + +type blockMetadata struct { + start time.Time + size int64 + checksum *uint32 + lastRead time.Time + reattempt blockMetadataReattempt +} + +type blockMetadataReattempt struct { + attempt int + fanoutFetchState *blockFanoutFetchState + attempted []peer + errs []error + retryPeersMetadata []receivedBlockMetadata + fetchedPeersMetadata []receivedBlockMetadata +} + +type blockFanoutFetchState struct { + numPending int32 + numSuccess int32 +} + +func newBlockFanoutFetchState( + pending int, +) *blockFanoutFetchState { + return &blockFanoutFetchState{ + numPending: int32(pending), + } +} + +func (s *blockFanoutFetchState) success() int { + return int(atomic.LoadInt32(&s.numSuccess)) +} + +func (s *blockFanoutFetchState) incrementSuccess() { + atomic.AddInt32(&s.numSuccess, 1) +} + +func (s *blockFanoutFetchState) decrementAndReturnPending() int { + return int(atomic.AddInt32(&s.numPending, -1)) +} + +func (b blockMetadataReattempt) peerAttempts(p peer) int { + r := 0 + for i := range b.attempted { + if b.attempted[i] == p { + r++ + } + } + return r +} + +func newTimesByUnixNanos(values []int64) []time.Time { + result := make([]time.Time, len(values)) + for i := range values { + result[i] = time.Unix(0, values[i]) + } + return result +} + +func newTimesByRPCBlocks(values []*rpc.Block) []time.Time { + result := make([]time.Time, len(values)) + for i := range values { + result[i] = time.Unix(0, values[i].Start) + } + return result +} + +type metadataIter struct { + inputCh <-chan receivedBlockMetadata + errCh <-chan error + host topology.Host + metadata block.Metadata + tagDecoder serialize.TagDecoder + idPool ident.Pool + done bool + err error +} + +func newMetadataIter( + inputCh <-chan receivedBlockMetadata, + errCh <-chan error, + tagDecoder serialize.TagDecoder, + idPool ident.Pool, +) PeerBlockMetadataIter { + return &metadataIter{ + inputCh: inputCh, + errCh: errCh, + tagDecoder: tagDecoder, + idPool: idPool, + } +} + +func (it *metadataIter) Next() bool { + if it.done || it.err != nil { + return false + } + m, more := <-it.inputCh + if !more { + it.err = <-it.errCh + it.done = true + return false + } + var tags ident.Tags + tags, it.err = newTagsFromEncodedTags(m.id, m.encodedTags, + it.tagDecoder, it.idPool) + if it.err != nil { + return false + } + it.host = m.peer.Host() + it.metadata = block.NewMetadata(m.id, tags, m.block.start, + m.block.size, m.block.checksum, m.block.lastRead) + return true +} + +func (it *metadataIter) Current() (topology.Host, block.Metadata) { + return it.host, it.metadata +} + +func (it *metadataIter) Err() error { + return it.err +} + +type idAndBlockStart struct { + id ident.ID + blockStart int64 +} + +func newTagsFromEncodedTags( + seriesID ident.ID, + encodedTags checked.Bytes, + tagDecoder serialize.TagDecoder, + idPool ident.Pool, +) (ident.Tags, error) { + if encodedTags == nil { + return ident.Tags{}, nil + } + + encodedTags.IncRef() + tagDecoder.Reset(encodedTags) + + tags, err := idxconvert.TagsFromTagsIter(seriesID, tagDecoder, idPool) + + encodedTags.DecRef() + + return tags, err +} + +const ( + // histogramDurationBucketsVersion must be bumped if histogramDurationBuckets is changed + // to namespace the different buckets from each other so they don't overlap and cause the + // histogram function to error out due to overlapping buckets in the same query. + histogramDurationBucketsVersion = "v1" + // histogramDurationBucketsVersionTag is the tag for the version of the buckets in use. + histogramDurationBucketsVersionTag = "schema" +) + +// histogramDurationBuckets is a high resolution set of duration buckets. +func histogramDurationBuckets() tally.DurationBuckets { + return append(tally.DurationBuckets{0}, + tally.MustMakeExponentialDurationBuckets(time.Millisecond, 1.25, 60)...) +} + +// histogramWithDurationBuckets returns a histogram with the standard duration buckets. +func histogramWithDurationBuckets(scope tally.Scope, name string) tally.Histogram { + sub := scope.Tagged(map[string]string{ + histogramDurationBucketsVersionTag: histogramDurationBucketsVersion, + }) + return sub.Histogram(name, histogramDurationBuckets()) +} + +func minDuration(x, y time.Duration) time.Duration { + if x < y { + return x + } + return y +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/session_pools.go b/vendor/github.com/m3db/m3/src/dbnode/client/session_pools.go new file mode 100644 index 00000000..8eb45e25 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/session_pools.go @@ -0,0 +1,93 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/x/xpool" + "github.com/m3db/m3/src/x/serialize" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" +) + +type sessionPools struct { + context context.Pool + id ident.Pool + writeOperation *writeOperationPool + writeTaggedOperation *writeTaggedOperationPool + fetchBatchOp *fetchBatchOpPool + fetchBatchOpArrayArray *fetchBatchOpArrayArrayPool + fetchTaggedOp fetchTaggedOpPool + aggregateOp aggregateOpPool + fetchState fetchStatePool + multiReaderIteratorArray encoding.MultiReaderIteratorArrayPool + tagEncoder serialize.TagEncoderPool + tagDecoder serialize.TagDecoderPool + readerSliceOfSlicesIterator *readerSliceOfSlicesIteratorPool + multiReaderIterator encoding.MultiReaderIteratorPool + seriesIterator encoding.SeriesIteratorPool + seriesIterators encoding.MutableSeriesIteratorsPool + writeAttempt *writeAttemptPool + writeState *writeStatePool + fetchAttempt *fetchAttemptPool + fetchTaggedAttempt fetchTaggedAttemptPool + aggregateAttempt aggregateAttemptPool + checkedBytesWrapper xpool.CheckedBytesWrapperPool +} + +// NB: ensure sessionPools satisfies the fetchTaggedPools interface. +var _ fetchTaggedPools = sessionPools{} + +func (s sessionPools) SeriesIterator() encoding.SeriesIteratorPool { + return s.seriesIterator +} + +func (s sessionPools) MultiReaderIteratorArray() encoding.MultiReaderIteratorArrayPool { + return s.multiReaderIteratorArray +} + +func (s sessionPools) ID() ident.Pool { + return s.id +} + +func (s sessionPools) TagDecoder() serialize.TagDecoderPool { + return s.tagDecoder +} + +func (s sessionPools) TagEncoder() serialize.TagEncoderPool { + return s.tagEncoder +} + +func (s sessionPools) ReaderSliceOfSlicesIterator() *readerSliceOfSlicesIteratorPool { + return s.readerSliceOfSlicesIterator +} + +func (s sessionPools) MultiReaderIterator() encoding.MultiReaderIteratorPool { + return s.multiReaderIterator +} + +func (s sessionPools) CheckedBytesWrapper() xpool.CheckedBytesWrapperPool { + return s.checkedBytesWrapper +} + +func (s sessionPools) MutableSeriesIterators() encoding.MutableSeriesIteratorsPool { + return s.seriesIterators +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/truncate.go b/vendor/github.com/m3db/m3/src/dbnode/client/truncate.go new file mode 100644 index 00000000..2b121bde --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/truncate.go @@ -0,0 +1,39 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" +) + +type truncateOp struct { + request rpc.TruncateRequest + completionFn completionFn +} + +func (t *truncateOp) Size() int { + // Truncate is always a single op + return 1 +} + +func (t *truncateOp) CompletionFn() completionFn { + return t.completionFn +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/types.go b/vendor/github.com/m3db/m3/src/dbnode/client/types.go new file mode 100644 index 00000000..3d4040bd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/types.go @@ -0,0 +1,756 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/runtime" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" + "github.com/m3db/m3/src/dbnode/storage/index" + "github.com/m3db/m3/src/dbnode/topology" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/pool" + xretry "github.com/m3db/m3/src/x/retry" + "github.com/m3db/m3/src/x/sampler" + "github.com/m3db/m3/src/x/serialize" + xsync "github.com/m3db/m3/src/x/sync" + xtime "github.com/m3db/m3/src/x/time" + + tchannel "github.com/uber/tchannel-go" +) + +// Client can create sessions to write and read to a cluster. +type Client interface { + // Options returns the Client Options. + Options() Options + + // NewSession creates a new session. + NewSession() (Session, error) + + // DefaultSession creates a default session that gets reused. + DefaultSession() (Session, error) + + // DefaultSessionActive returns whether the default session is active. + DefaultSessionActive() bool +} + +// Session can write and read to a cluster. +type Session interface { + // Write value to the database for an ID. + Write(namespace, id ident.ID, t time.Time, value float64, unit xtime.Unit, annotation []byte) error + + // WriteTagged value to the database for an ID and given tags. + WriteTagged(namespace, id ident.ID, tags ident.TagIterator, t time.Time, value float64, unit xtime.Unit, annotation []byte) error + + // Fetch values from the database for an ID. + Fetch(namespace, id ident.ID, startInclusive, endExclusive time.Time) (encoding.SeriesIterator, error) + + // FetchIDs values from the database for a set of IDs. + FetchIDs(namespace ident.ID, ids ident.Iterator, startInclusive, endExclusive time.Time) (encoding.SeriesIterators, error) + + // FetchTagged resolves the provided query to known IDs, and fetches the data for them. + FetchTagged(namespace ident.ID, q index.Query, opts index.QueryOptions) (encoding.SeriesIterators, FetchResponseMetadata, error) + + // FetchTaggedIDs resolves the provided query to known IDs. + FetchTaggedIDs(namespace ident.ID, q index.Query, opts index.QueryOptions) (TaggedIDsIterator, FetchResponseMetadata, error) + + // Aggregate aggregates values from the database for the given set of constraints. + Aggregate(namespace ident.ID, q index.Query, opts index.AggregationOptions) (AggregatedTagsIterator, FetchResponseMetadata, error) + + // ShardID returns the given shard for an ID for callers + // to easily discern what shard is failing when operations + // for given IDs begin failing. + ShardID(id ident.ID) (uint32, error) + + // IteratorPools exposes the internal iterator pools used by the session to clients. + IteratorPools() (encoding.IteratorPools, error) + + // Close the session + Close() error +} + +// FetchResponseMetadata is metadata about a fetch response. +type FetchResponseMetadata struct { + // Exhaustive indicates whether the underlying data set presents a full + // collection of retrieved data. + Exhaustive bool + // Responses is the count of responses. + Responses int + // EstimateTotalBytes is an approximation of the total byte size of the response. + EstimateTotalBytes int +} + +// AggregatedTagsIterator iterates over a collection of tag names with optionally +// associated values. +type AggregatedTagsIterator interface { + // Next returns whether there are more items in the collection. + Next() bool + + // Remaining returns the number of elements remaining to be iterated over. + Remaining() int + + // Current returns the current tagName, and associated tagValues iterator. + // These remain valid until Next() is called again. + Current() (tagName ident.ID, tagValues ident.Iterator) + + // Err returns any error encountered. + Err() error + + // Finalize releases any held resources. + Finalize() +} + +// TaggedIDsIterator iterates over a collection of IDs with associated tags and namespace. +type TaggedIDsIterator interface { + // Next returns whether there are more items in the collection. + Next() bool + + // Remaining returns the number of elements remaining to be iterated over. + Remaining() int + + // Current returns the ID, Tags and Namespace for a single timeseries. + // These remain valid until Next() is called again. + Current() (namespaceID ident.ID, seriesID ident.ID, tags ident.TagIterator) + + // Err returns any error encountered. + Err() error + + // Finalize releases any held resources. + Finalize() +} + +// AdminClient can create administration sessions. +type AdminClient interface { + Client + + // NewSession creates a new session. + NewAdminSession() (AdminSession, error) + + // DefaultAdminSession creates a default admin session that gets reused. + DefaultAdminSession() (AdminSession, error) +} + +// PeerBlockMetadataIter iterates over a collection of +// blocks metadata from peers. +type PeerBlockMetadataIter interface { + // Next returns whether there are more items in the collection. + Next() bool + + // Current returns the host and block metadata, which remain + // valid until Next() is called again. + Current() (topology.Host, block.Metadata) + + // Err returns any error encountered + Err() error +} + +// PeerBlocksIter iterates over a collection of blocks from peers. +type PeerBlocksIter interface { + // Next returns whether there are more items in the collection. + Next() bool + + // Current returns the metadata, and block data for a single block replica. + // These remain valid until Next() is called again. + Current() (topology.Host, ident.ID, block.DatabaseBlock) + + // Err returns any error encountered. + Err() error +} + +// AdminSession can perform administrative and node-to-node operations. +type AdminSession interface { + Session + + // Origin returns the host that initiated the session. + Origin() topology.Host + + // Replicas returns the replication factor. + Replicas() int + + // TopologyMap returns the current topology map. Note that the session + // has a separate topology watch than the database itself, so the two + // values can be out of sync and this method should not be relied upon + // if the current view of the topology as seen by the database is required. + TopologyMap() (topology.Map, error) + + // Truncate will truncate the namespace for a given shard. + Truncate(namespace ident.ID) (int64, error) + + // FetchBootstrapBlocksFromPeers will fetch the most fulfilled block + // for each series using the runtime configurable bootstrap level consistency. + FetchBootstrapBlocksFromPeers( + namespace namespace.Metadata, + shard uint32, + start, end time.Time, + opts result.Options, + ) (result.ShardResult, error) + + // FetchBootstrapBlocksMetadataFromPeers will fetch the blocks metadata from + // available peers using the runtime configurable bootstrap level consistency. + FetchBootstrapBlocksMetadataFromPeers( + namespace ident.ID, + shard uint32, + start, end time.Time, + result result.Options, + ) (PeerBlockMetadataIter, error) + + // FetchBlocksMetadataFromPeers will fetch the blocks metadata from + // available peers. + FetchBlocksMetadataFromPeers( + namespace ident.ID, + shard uint32, + start, end time.Time, + consistencyLevel topology.ReadConsistencyLevel, + result result.Options, + ) (PeerBlockMetadataIter, error) + + // FetchBlocksFromPeers will fetch the required blocks from the + // peers specified. + FetchBlocksFromPeers( + namespace namespace.Metadata, + shard uint32, + consistencyLevel topology.ReadConsistencyLevel, + metadatas []block.ReplicaMetadata, + opts result.Options, + ) (PeerBlocksIter, error) +} + +// Options is a set of client options. +type Options interface { + // Validate validates the options. + Validate() error + + // SetEncodingM3TSZ sets M3TSZ encoding. + SetEncodingM3TSZ() Options + + // SetEncodingProto sets proto encoding. + SetEncodingProto(encodingOpts encoding.Options) Options + + // IsSetEncodingProto returns whether proto encoding is set. + IsSetEncodingProto() bool + + // SetRuntimeOptionsManager sets the runtime options manager, it is optional + SetRuntimeOptionsManager(value runtime.OptionsManager) Options + + // RuntimeOptionsManager returns the runtime options manager, it is optional. + RuntimeOptionsManager() runtime.OptionsManager + + // SetClockOptions sets the clock options. + SetClockOptions(value clock.Options) Options + + // ClockOptions returns the clock options. + ClockOptions() clock.Options + + // SetInstrumentOptions sets the instrumentation options. + SetInstrumentOptions(value instrument.Options) Options + + // InstrumentOptions returns the instrumentation options. + InstrumentOptions() instrument.Options + + // SetLogErrorSampleRate sets the log error sample rate between [0,1.0]. + SetLogErrorSampleRate(value sampler.Rate) Options + + // LogErrorSampleRate returns the log error sample rate between [0,1.0]. + LogErrorSampleRate() sampler.Rate + + // SetTopologyInitializer sets the TopologyInitializer. + SetTopologyInitializer(value topology.Initializer) Options + + // TopologyInitializer returns the TopologyInitializer. + TopologyInitializer() topology.Initializer + + // SetReadConsistencyLevel sets the read consistency level. + SetReadConsistencyLevel(value topology.ReadConsistencyLevel) Options + + // topology.ReadConsistencyLevel returns the read consistency level. + ReadConsistencyLevel() topology.ReadConsistencyLevel + + // SetWriteConsistencyLevel sets the write consistency level. + SetWriteConsistencyLevel(value topology.ConsistencyLevel) Options + + // WriteConsistencyLevel returns the write consistency level. + WriteConsistencyLevel() topology.ConsistencyLevel + + // SetChannelOptions sets the channelOptions. + SetChannelOptions(value *tchannel.ChannelOptions) Options + + // ChannelOptions returns the channelOptions. + ChannelOptions() *tchannel.ChannelOptions + + // SetMaxConnectionCount sets the maxConnectionCount. + SetMaxConnectionCount(value int) Options + + // MaxConnectionCount returns the maxConnectionCount. + MaxConnectionCount() int + + // SetMinConnectionCount sets the minConnectionCount. + SetMinConnectionCount(value int) Options + + // MinConnectionCount returns the minConnectionCount. + MinConnectionCount() int + + // SetHostConnectTimeout sets the hostConnectTimeout. + SetHostConnectTimeout(value time.Duration) Options + + // HostConnectTimeout returns the hostConnectTimeout. + HostConnectTimeout() time.Duration + + // SetClusterConnectTimeout sets the clusterConnectTimeout. + SetClusterConnectTimeout(value time.Duration) Options + + // ClusterConnectTimeout returns the clusterConnectTimeout. + ClusterConnectTimeout() time.Duration + + // SetClusterConnectConsistencyLevel sets the clusterConnectConsistencyLevel. + SetClusterConnectConsistencyLevel(value topology.ConnectConsistencyLevel) Options + + // ClusterConnectConsistencyLevel returns the clusterConnectConsistencyLevel. + ClusterConnectConsistencyLevel() topology.ConnectConsistencyLevel + + // SetWriteRequestTimeout sets the writeRequestTimeout. + SetWriteRequestTimeout(value time.Duration) Options + + // WriteRequestTimeout returns the writeRequestTimeout. + WriteRequestTimeout() time.Duration + + // SetFetchRequestTimeout sets the fetchRequestTimeout. + SetFetchRequestTimeout(value time.Duration) Options + + // FetchRequestTimeout returns the fetchRequestTimeout. + FetchRequestTimeout() time.Duration + + // SetTruncateRequestTimeout sets the truncateRequestTimeout. + SetTruncateRequestTimeout(value time.Duration) Options + + // TruncateRequestTimeout returns the truncateRequestTimeout. + TruncateRequestTimeout() time.Duration + + // SetBackgroundConnectInterval sets the backgroundConnectInterval. + SetBackgroundConnectInterval(value time.Duration) Options + + // BackgroundConnectInterval returns the backgroundConnectInterval. + BackgroundConnectInterval() time.Duration + + // SetBackgroundConnectStutter sets the backgroundConnectStutter. + SetBackgroundConnectStutter(value time.Duration) Options + + // BackgroundConnectStutter returns the backgroundConnectStutter. + BackgroundConnectStutter() time.Duration + + // SetBackgroundHealthCheckInterval sets the background health check interval + SetBackgroundHealthCheckInterval(value time.Duration) Options + + // BackgroundHealthCheckInterval returns the background health check interval + BackgroundHealthCheckInterval() time.Duration + + // SetBackgroundHealthCheckStutter sets the background health check stutter + SetBackgroundHealthCheckStutter(value time.Duration) Options + + // BackgroundHealthCheckStutter returns the background health check stutter + BackgroundHealthCheckStutter() time.Duration + + // SetBackgroundHealthCheckFailLimit sets the background health failure + // limit before connection is deemed unhealth + SetBackgroundHealthCheckFailLimit(value int) Options + + // BackgroundHealthCheckFailLimit returns the background health failure + // limit before connection is deemed unhealth + BackgroundHealthCheckFailLimit() int + + // SetBackgroundHealthCheckFailThrottleFactor sets the throttle factor to + // apply when calculating how long to wait between a failed health check and + // a retry attempt. It is applied by multiplying against the host connect + // timeout to produce a throttle sleep value. + SetBackgroundHealthCheckFailThrottleFactor(value float64) Options + + // BackgroundHealthCheckFailThrottleFactor returns the throttle factor to + // apply when calculating how long to wait between a failed health check and + // a retry attempt. It is applied by multiplying against the host connect + // timeout to produce a throttle sleep value. + BackgroundHealthCheckFailThrottleFactor() float64 + + // SetWriteRetrier sets the write retrier when performing a write for + // a write operation. Only retryable errors are retried. + SetWriteRetrier(value xretry.Retrier) Options + + // WriteRetrier returns the write retrier when perform a write for + // a write operation. Only retryable errors are retried. + WriteRetrier() xretry.Retrier + + // SetFetchRetrier sets the fetch retrier when performing a write for + // a fetch operation. Only retryable errors are retried. + SetFetchRetrier(value xretry.Retrier) Options + + // FetchRetrier returns the fetch retrier when performing a fetch for + // a fetch operation. Only retryable errors are retried. + FetchRetrier() xretry.Retrier + + // SetWriteShardsInitializing sets whether to write to shards that are + // initializing or not. + SetWriteShardsInitializing(value bool) Options + + // WriteShardsInitializing returns whether to write to shards that are + // initializing or not. + WriteShardsInitializing() bool + + // SetShardsLeavingCountTowardsConsistency sets whether to count shards + // that are leaving or not towards consistency level calculations. + SetShardsLeavingCountTowardsConsistency(value bool) Options + + // ShardsLeavingCountTowardsConsistency returns whether to count shards + // that are leaving or not towards consistency level calculations. + ShardsLeavingCountTowardsConsistency() bool + + // SetTagEncoderOptions sets the TagEncoderOptions. + SetTagEncoderOptions(value serialize.TagEncoderOptions) Options + + // TagEncoderOptions returns the TagEncoderOptions. + TagEncoderOptions() serialize.TagEncoderOptions + + // SetTagEncoderPoolSize sets the TagEncoderPoolSize. + SetTagEncoderPoolSize(value int) Options + + // TagEncoderPoolSize returns the TagEncoderPoolSize. + TagEncoderPoolSize() int + + // SetTagDecoderOptions sets the TagDecoderOptions. + SetTagDecoderOptions(value serialize.TagDecoderOptions) Options + + // TagDecoderOptions returns the TagDecoderOptions. + TagDecoderOptions() serialize.TagDecoderOptions + + // SetTagDecoderPoolSize sets the TagDecoderPoolSize. + SetTagDecoderPoolSize(value int) Options + + // TagDecoderPoolSize returns the TagDecoderPoolSize. + TagDecoderPoolSize() int + + // SetWriteBatchSize sets the writeBatchSize + // NB(r): for a write only application load this should match the host + // queue ops flush size so that each time a host queue is flushed it can + // fit the entire flushed write ops into a single batch. + SetWriteBatchSize(value int) Options + + // WriteBatchSize returns the writeBatchSize. + WriteBatchSize() int + + // SetFetchBatchSize sets the fetchBatchSize + // NB(r): for a fetch only application load this should match the host + // queue ops flush size so that each time a host queue is flushed it can + // fit the entire flushed fetch ops into a single batch. + SetFetchBatchSize(value int) Options + + // FetchBatchSize returns the fetchBatchSize. + FetchBatchSize() int + + // SetWriteOpPoolSize sets the writeOperationPoolSize. + SetWriteOpPoolSize(value int) Options + + // WriteOpPoolSize returns the writeOperationPoolSize. + WriteOpPoolSize() int + + // SetWriteTaggedOpPoolSize sets the writeTaggedOperationPoolSize. + SetWriteTaggedOpPoolSize(value int) Options + + // WriteTaggedOpPoolSize returns the writeTaggedOperationPoolSize. + WriteTaggedOpPoolSize() int + + // SetFetchBatchOpPoolSize sets the fetchBatchOpPoolSize. + SetFetchBatchOpPoolSize(value int) Options + + // FetchBatchOpPoolSize returns the fetchBatchOpPoolSize. + FetchBatchOpPoolSize() int + + // SetCheckedBytesWrapperPoolSize sets the checkedBytesWrapperPoolSize. + SetCheckedBytesWrapperPoolSize(value int) Options + + // CheckedBytesWrapperPoolSize returns the checkedBytesWrapperPoolSize. + CheckedBytesWrapperPoolSize() int + + // SetHostQueueOpsFlushSize sets the hostQueueOpsFlushSize. + SetHostQueueOpsFlushSize(value int) Options + + // HostQueueOpsFlushSize returns the hostQueueOpsFlushSize. + HostQueueOpsFlushSize() int + + // SetHostQueueOpsFlushInterval sets the hostQueueOpsFlushInterval. + SetHostQueueOpsFlushInterval(value time.Duration) Options + + // HostQueueOpsFlushInterval returns the hostQueueOpsFlushInterval. + HostQueueOpsFlushInterval() time.Duration + + // SetContextPool sets the contextPool. + SetContextPool(value context.Pool) Options + + // ContextPool returns the contextPool. + ContextPool() context.Pool + + // SetIdentifierPool sets the identifier pool. + SetIdentifierPool(value ident.Pool) Options + + // IdentifierPool returns the identifier pool. + IdentifierPool() ident.Pool + + // HostQueueOpsArrayPoolSize sets the hostQueueOpsArrayPoolSize. + SetHostQueueOpsArrayPoolSize(value int) Options + + // HostQueueOpsArrayPoolSize returns the hostQueueOpsArrayPoolSize. + HostQueueOpsArrayPoolSize() int + + // SetHostQueueEmitsHealthStatus sets the hostQueueEmitHealthStatus. + SetHostQueueEmitsHealthStatus(value bool) Options + + // HostQueueEmitsHealthStatus returns the hostQueueEmitHealthStatus. + HostQueueEmitsHealthStatus() bool + + // SetSeriesIteratorPoolSize sets the seriesIteratorPoolSize. + SetSeriesIteratorPoolSize(value int) Options + + // SeriesIteratorPoolSize returns the seriesIteratorPoolSize. + SeriesIteratorPoolSize() int + + // SetSeriesIteratorArrayPoolBuckets sets the seriesIteratorArrayPoolBuckets. + SetSeriesIteratorArrayPoolBuckets(value []pool.Bucket) Options + + // SeriesIteratorArrayPoolBuckets returns the seriesIteratorArrayPoolBuckets. + SeriesIteratorArrayPoolBuckets() []pool.Bucket + + // SetReaderIteratorAllocate sets the readerIteratorAllocate. + SetReaderIteratorAllocate(value encoding.ReaderIteratorAllocate) Options + + // ReaderIteratorAllocate returns the readerIteratorAllocate. + ReaderIteratorAllocate() encoding.ReaderIteratorAllocate + + // SetSchemaRegistry sets the schema registry. + SetSchemaRegistry(registry namespace.SchemaRegistry) AdminOptions + + // SchemaRegistry returns the schema registry. + SchemaRegistry() namespace.SchemaRegistry + + // SetAsyncTopologyInitializers sets the AsyncTopologyInitializers + SetAsyncTopologyInitializers(value []topology.Initializer) Options + + // AsyncTopologyInitializers returns the AsyncTopologyInitializers + AsyncTopologyInitializers() []topology.Initializer + + // SetAsyncWriteWorkerPool sets the worker pool for async writes. + SetAsyncWriteWorkerPool(value xsync.PooledWorkerPool) Options + + // AsyncWriteWorkerPool returns the worker pool for async writes. + AsyncWriteWorkerPool() xsync.PooledWorkerPool + + // SetAsyncWriteMaxConcurrency sets the async writes maximum concurrency. + SetAsyncWriteMaxConcurrency(value int) Options + + // AsyncWriteMaxConcurrency returns the async writes maximum concurrency. + AsyncWriteMaxConcurrency() int + + // SetUseV2BatchAPIs sets whether the V2 batch APIs should be used. + SetUseV2BatchAPIs(value bool) Options + + // UseV2BatchAPIs returns whether the V2 batch APIs should be used. + UseV2BatchAPIs() bool + + // SetIterationOptions sets experimental iteration options. + SetIterationOptions(index.IterationOptions) Options + + // IterationOptions returns experimental iteration options. + IterationOptions() index.IterationOptions + + // SetWriteTimestampOffset sets the write timestamp offset. + SetWriteTimestampOffset(value time.Duration) AdminOptions + + // WriteTimestampOffset returns the write timestamp offset. + WriteTimestampOffset() time.Duration + + // SetNewConnectionFn sets a new connection generator function. + SetNewConnectionFn(value NewConnectionFn) AdminOptions + + // NewConnectionFn returns the new connection generator function. + NewConnectionFn() NewConnectionFn +} + +// AdminOptions is a set of administration client options. +type AdminOptions interface { + Options + + // SetOrigin sets the current host originating requests from. + SetOrigin(value topology.Host) AdminOptions + + // Origin gets the current host originating requests from. + Origin() topology.Host + + // SetBootstrapConsistencyLevel sets the bootstrap consistency level. + SetBootstrapConsistencyLevel(value topology.ReadConsistencyLevel) AdminOptions + + // BootstrapConsistencyLevel returns the bootstrap consistency level. + BootstrapConsistencyLevel() topology.ReadConsistencyLevel + + // SetFetchSeriesBlocksMaxBlockRetries sets the max retries for fetching series blocks. + SetFetchSeriesBlocksMaxBlockRetries(value int) AdminOptions + + // FetchSeriesBlocksMaxBlockRetries gets the max retries for fetching series blocks. + FetchSeriesBlocksMaxBlockRetries() int + + // SetFetchSeriesBlocksBatchSize sets the batch size for fetching series blocks in batch. + SetFetchSeriesBlocksBatchSize(value int) AdminOptions + + // FetchSeriesBlocksBatchSize gets the batch size for fetching series blocks in batch. + FetchSeriesBlocksBatchSize() int + + // SetFetchSeriesBlocksMetadataBatchTimeout sets the timeout for fetching series blocks metadata in batch. + SetFetchSeriesBlocksMetadataBatchTimeout(value time.Duration) AdminOptions + + // FetchSeriesBlocksMetadataBatchTimeout gets the timeout for fetching series blocks metadata in batch. + FetchSeriesBlocksMetadataBatchTimeout() time.Duration + + // SetFetchSeriesBlocksBatchTimeout sets the timeout for fetching series blocks in batch. + SetFetchSeriesBlocksBatchTimeout(value time.Duration) AdminOptions + + // FetchSeriesBlocksBatchTimeout gets the timeout for fetching series blocks in batch. + FetchSeriesBlocksBatchTimeout() time.Duration + + // SetFetchSeriesBlocksBatchConcurrency sets the concurrency for fetching series blocks in batch. + SetFetchSeriesBlocksBatchConcurrency(value int) AdminOptions + + // FetchSeriesBlocksBatchConcurrency gets the concurrency for fetching series blocks in batch. + FetchSeriesBlocksBatchConcurrency() int + + // SetStreamBlocksRetrier sets the retrier for streaming blocks. + SetStreamBlocksRetrier(value xretry.Retrier) AdminOptions + + // StreamBlocksRetrier returns the retrier for streaming blocks. + StreamBlocksRetrier() xretry.Retrier +} + +// The rest of these types are internal types that mocks are generated for +// in file mode and hence need to stay in this file and refer to the other +// types such as AdminSession. When mocks are generated in file mode the +// other types they reference need to be in the same file. + +type clientSession interface { + AdminSession + + // Open the client session. + Open() error +} + +type hostQueue interface { + // Open the host queue. + Open() + + // Len returns the length of the queue. + Len() int + + // Enqueue an operation. + Enqueue(op op) error + + // Host gets the host. + Host() topology.Host + + // ConnectionCount gets the current open connection count. + ConnectionCount() int + + // ConnectionPool gets the connection pool. + ConnectionPool() connectionPool + + // BorrowConnection will borrow a connection and execute a user function. + BorrowConnection(fn withConnectionFn) error + + // Close the host queue, will flush any operations still pending. + Close() +} + +type withConnectionFn func(c rpc.TChanNode) + +type connectionPool interface { + // Open starts the connection pool connecting and health checking. + Open() + + // ConnectionCount gets the current open connection count. + ConnectionCount() int + + // NextClient gets the next client for use by the connection pool. + NextClient() (rpc.TChanNode, error) + + // Close the connection pool. + Close() +} + +type peerSource interface { + // BorrowConnection will borrow a connection and execute a user function. + BorrowConnection(hostID string, fn withConnectionFn) error +} + +type peer interface { + // Host gets the host. + Host() topology.Host + + // BorrowConnection will borrow a connection and execute a user function. + BorrowConnection(fn withConnectionFn) error +} + +type status int + +const ( + statusNotOpen status = iota + statusOpen + statusClosed +) + +type healthStatus int + +const ( + healthStatusCheckFailed healthStatus = iota + healthStatusOK +) + +type op interface { + // Size returns the effective size of inner operations. + Size() int + + // CompletionFn gets the completion function for the operation. + CompletionFn() completionFn +} + +type enqueueDelayedFn func(peersMetadata []receivedBlockMetadata) +type enqueueDelayedDoneFn func() + +type enqueueChannel interface { + enqueue(peersMetadata []receivedBlockMetadata) error + enqueueDelayed(numToEnqueue int) (enqueueDelayedFn, enqueueDelayedDoneFn, error) + // read is always safe to call since you can safely range + // over a closed channel, and/or do a checked read in case + // it is closed (unlike when publishing to a channel). + read() <-chan []receivedBlockMetadata + trackPending(amount int) + trackProcessed(amount int) + unprocessedLen() int + closeOnAllProcessed() +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/write_attempt.go b/vendor/github.com/m3db/m3/src/dbnode/client/write_attempt.go new file mode 100644 index 00000000..03e5a811 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/write_attempt.go @@ -0,0 +1,111 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "time" + + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + xretry "github.com/m3db/m3/src/x/retry" + xtime "github.com/m3db/m3/src/x/time" +) + +type writeAttemptType byte + +// nolint +const ( + unknownWriteAttemptType writeAttemptType = iota + untaggedWriteAttemptType + taggedWriteAttemptType +) + +var writeAttemptArgsZeroed writeAttemptArgs + +type writeAttempt struct { + args writeAttemptArgs + + session *session + + attemptFn xretry.Fn +} + +type writeAttemptArgs struct { + namespace ident.ID + id ident.ID + tags ident.TagIterator + t time.Time + value float64 + annotation []byte + unit xtime.Unit + attemptType writeAttemptType +} + +func (w *writeAttempt) reset() { + w.args = writeAttemptArgsZeroed +} + +func (w *writeAttempt) perform() error { + err := w.session.writeAttempt(w.args.attemptType, + w.args.namespace, w.args.id, w.args.tags, w.args.t, + w.args.value, w.args.unit, w.args.annotation) + + if IsBadRequestError(err) { + // Do not retry bad request errors + err = xerrors.NewNonRetryableError(err) + } + + return err +} + +type writeAttemptPool struct { + pool pool.ObjectPool + session *session +} + +func newWriteAttemptPool( + session *session, + opts pool.ObjectPoolOptions, +) *writeAttemptPool { + p := pool.NewObjectPool(opts) + return &writeAttemptPool{pool: p, session: session} +} + +func (p *writeAttemptPool) Init() { + p.pool.Init(func() interface{} { + w := &writeAttempt{session: p.session} + // NB(r): Bind attemptFn once to avoid creating receiver + // and function method pointer over and over again + w.attemptFn = w.perform + w.reset() + return w + }) +} + +func (p *writeAttemptPool) Get() *writeAttempt { + return p.pool.Get().(*writeAttempt) +} + +func (p *writeAttemptPool) Put(w *writeAttempt) { + w.reset() + p.pool.Put(w) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_element_array_pool.go b/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_element_array_pool.go new file mode 100644 index 00000000..3b8cc742 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_element_array_pool.go @@ -0,0 +1,108 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/pool" +) + +type writeBatchRawRequestElementArrayPool interface { + // Init pool + Init() + + // Get an array of WriteBatchRawRequestElement objects + Get() []*rpc.WriteBatchRawRequestElement + + // Put an array of WriteBatchRawRequestElement objects + Put(w []*rpc.WriteBatchRawRequestElement) +} + +type poolOfWriteBatchRawRequestElementArray struct { + pool pool.ObjectPool + capacity int +} + +func newWriteBatchRawRequestElementArrayPool( + opts pool.ObjectPoolOptions, capacity int) writeBatchRawRequestElementArrayPool { + + p := pool.NewObjectPool(opts) + return &poolOfWriteBatchRawRequestElementArray{p, capacity} +} + +func (p *poolOfWriteBatchRawRequestElementArray) Init() { + p.pool.Init(func() interface{} { + return make([]*rpc.WriteBatchRawRequestElement, 0, p.capacity) + }) +} + +func (p *poolOfWriteBatchRawRequestElementArray) Get() []*rpc.WriteBatchRawRequestElement { + return p.pool.Get().([]*rpc.WriteBatchRawRequestElement) +} + +func (p *poolOfWriteBatchRawRequestElementArray) Put(w []*rpc.WriteBatchRawRequestElement) { + for i := range w { + w[i] = nil + } + w = w[:0] + p.pool.Put(w) +} + +type writeBatchRawV2RequestElementArrayPool interface { + // Init pool + Init() + + // Get an array of WriteBatchV2RawRequestElement objects + Get() []*rpc.WriteBatchRawV2RequestElement + + // Put an array of WriteBatchRawV2RequestElement objects + Put(w []*rpc.WriteBatchRawV2RequestElement) +} + +type poolOfWriteBatchRawV2RequestElementArray struct { + pool pool.ObjectPool + capacity int +} + +func newWriteBatchRawV2RequestElementArrayPool( + opts pool.ObjectPoolOptions, capacity int) writeBatchRawV2RequestElementArrayPool { + + p := pool.NewObjectPool(opts) + return &poolOfWriteBatchRawV2RequestElementArray{p, capacity} +} + +func (p *poolOfWriteBatchRawV2RequestElementArray) Init() { + p.pool.Init(func() interface{} { + return make([]*rpc.WriteBatchRawV2RequestElement, 0, p.capacity) + }) +} + +func (p *poolOfWriteBatchRawV2RequestElementArray) Get() []*rpc.WriteBatchRawV2RequestElement { + return p.pool.Get().([]*rpc.WriteBatchRawV2RequestElement) +} + +func (p *poolOfWriteBatchRawV2RequestElementArray) Put(w []*rpc.WriteBatchRawV2RequestElement) { + for i := range w { + w[i] = nil + } + w = w[:0] + p.pool.Put(w) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_pool.go b/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_pool.go new file mode 100644 index 00000000..f2aa1b38 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_pool.go @@ -0,0 +1,101 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/pool" +) + +var ( + writeBatchRawRequestZeroed rpc.WriteBatchRawRequest + writeBatchRawV2RequestZeroed rpc.WriteBatchRawV2Request +) + +type writeBatchRawRequestPool interface { + // Init pool + Init() + + // Get a write batch request + Get() *rpc.WriteBatchRawRequest + + // Put a write batch request + Put(w *rpc.WriteBatchRawRequest) +} + +type poolOfWriteBatchRawRequest struct { + pool pool.ObjectPool +} + +func newWriteBatchRawRequestPool(opts pool.ObjectPoolOptions) writeBatchRawRequestPool { + p := pool.NewObjectPool(opts) + return &poolOfWriteBatchRawRequest{p} +} + +func (p *poolOfWriteBatchRawRequest) Init() { + p.pool.Init(func() interface{} { + return &rpc.WriteBatchRawRequest{} + }) +} + +func (p *poolOfWriteBatchRawRequest) Get() *rpc.WriteBatchRawRequest { + return p.pool.Get().(*rpc.WriteBatchRawRequest) +} + +func (p *poolOfWriteBatchRawRequest) Put(w *rpc.WriteBatchRawRequest) { + *w = writeBatchRawRequestZeroed + p.pool.Put(w) +} + +type writeBatchRawV2RequestPool interface { + // Init pool. + Init() + + // Get a write batch request. + Get() *rpc.WriteBatchRawV2Request + + // Put a write batch request. + Put(w *rpc.WriteBatchRawV2Request) +} + +type poolOfWriteBatchRawV2Request struct { + pool pool.ObjectPool +} + +func newWriteBatchRawV2RequestPool(opts pool.ObjectPoolOptions) writeBatchRawV2RequestPool { + p := pool.NewObjectPool(opts) + return &poolOfWriteBatchRawV2Request{p} +} + +func (p *poolOfWriteBatchRawV2Request) Init() { + p.pool.Init(func() interface{} { + return &rpc.WriteBatchRawV2Request{} + }) +} + +func (p *poolOfWriteBatchRawV2Request) Get() *rpc.WriteBatchRawV2Request { + return p.pool.Get().(*rpc.WriteBatchRawV2Request) +} + +func (p *poolOfWriteBatchRawV2Request) Put(w *rpc.WriteBatchRawV2Request) { + *w = writeBatchRawV2RequestZeroed + p.pool.Put(w) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_tagged_element_array_pool.go b/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_tagged_element_array_pool.go new file mode 100644 index 00000000..4ed3ee84 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_tagged_element_array_pool.go @@ -0,0 +1,108 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/pool" +) + +type writeTaggedBatchRawRequestElementArrayPool interface { + // Init pool + Init() + + // Get an array of WriteTaggedBatchRawRequestElement objects + Get() []*rpc.WriteTaggedBatchRawRequestElement + + // Put an array of WriteTaggedBatchRawRequestElement objects + Put(w []*rpc.WriteTaggedBatchRawRequestElement) +} + +type poolOfWriteTaggedBatchRawRequestElementArray struct { + pool pool.ObjectPool + capacity int +} + +func newWriteTaggedBatchRawRequestElementArrayPool( + opts pool.ObjectPoolOptions, capacity int) writeTaggedBatchRawRequestElementArrayPool { + + p := pool.NewObjectPool(opts) + return &poolOfWriteTaggedBatchRawRequestElementArray{p, capacity} +} + +func (p *poolOfWriteTaggedBatchRawRequestElementArray) Init() { + p.pool.Init(func() interface{} { + return make([]*rpc.WriteTaggedBatchRawRequestElement, 0, p.capacity) + }) +} + +func (p *poolOfWriteTaggedBatchRawRequestElementArray) Get() []*rpc.WriteTaggedBatchRawRequestElement { + return p.pool.Get().([]*rpc.WriteTaggedBatchRawRequestElement) +} + +func (p *poolOfWriteTaggedBatchRawRequestElementArray) Put(w []*rpc.WriteTaggedBatchRawRequestElement) { + for i := range w { + w[i] = nil + } + w = w[:0] + p.pool.Put(w) +} + +type writeTaggedBatchRawV2RequestElementArrayPool interface { + // Init pool + Init() + + // Get an array of WriteTaggedBatchRawV2RequestElement objects + Get() []*rpc.WriteTaggedBatchRawV2RequestElement + + // Put an array of WriteTaggedBatchRawV2RequestElement objects + Put(w []*rpc.WriteTaggedBatchRawV2RequestElement) +} + +type poolOfWriteTaggedBatchRawV2RequestElementArray struct { + pool pool.ObjectPool + capacity int +} + +func newWriteTaggedBatchRawV2RequestElementArrayPool( + opts pool.ObjectPoolOptions, capacity int) writeTaggedBatchRawV2RequestElementArrayPool { + + p := pool.NewObjectPool(opts) + return &poolOfWriteTaggedBatchRawV2RequestElementArray{p, capacity} +} + +func (p *poolOfWriteTaggedBatchRawV2RequestElementArray) Init() { + p.pool.Init(func() interface{} { + return make([]*rpc.WriteTaggedBatchRawV2RequestElement, 0, p.capacity) + }) +} + +func (p *poolOfWriteTaggedBatchRawV2RequestElementArray) Get() []*rpc.WriteTaggedBatchRawV2RequestElement { + return p.pool.Get().([]*rpc.WriteTaggedBatchRawV2RequestElement) +} + +func (p *poolOfWriteTaggedBatchRawV2RequestElementArray) Put(w []*rpc.WriteTaggedBatchRawV2RequestElement) { + for i := range w { + w[i] = nil + } + w = w[:0] + p.pool.Put(w) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_tagged_pool.go b/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_tagged_pool.go new file mode 100644 index 00000000..239a5fb3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/write_batch_tagged_pool.go @@ -0,0 +1,101 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/pool" +) + +var ( + writeTaggedBatchRawRequestZeroed rpc.WriteTaggedBatchRawRequest + writeTaggedBatchRawV2RequestZeroed rpc.WriteTaggedBatchRawV2Request +) + +type writeTaggedBatchRawRequestPool interface { + // Init pool + Init() + + // Get a write batch request + Get() *rpc.WriteTaggedBatchRawRequest + + // Put a write batch request + Put(w *rpc.WriteTaggedBatchRawRequest) +} + +type poolOfWriteTaggedBatchRawRequest struct { + pool pool.ObjectPool +} + +func newWriteTaggedBatchRawRequestPool(opts pool.ObjectPoolOptions) writeTaggedBatchRawRequestPool { + p := pool.NewObjectPool(opts) + return &poolOfWriteTaggedBatchRawRequest{p} +} + +func (p *poolOfWriteTaggedBatchRawRequest) Init() { + p.pool.Init(func() interface{} { + return &rpc.WriteTaggedBatchRawRequest{} + }) +} + +func (p *poolOfWriteTaggedBatchRawRequest) Get() *rpc.WriteTaggedBatchRawRequest { + return p.pool.Get().(*rpc.WriteTaggedBatchRawRequest) +} + +func (p *poolOfWriteTaggedBatchRawRequest) Put(w *rpc.WriteTaggedBatchRawRequest) { + *w = writeTaggedBatchRawRequestZeroed + p.pool.Put(w) +} + +type writeTaggedBatchRawV2RequestPool interface { + // Init pool. + Init() + + // Get a write batch request. + Get() *rpc.WriteTaggedBatchRawV2Request + + // Put a write batch request. + Put(w *rpc.WriteTaggedBatchRawV2Request) +} + +type poolOfWriteTaggedBatchRawV2Request struct { + pool pool.ObjectPool +} + +func newWriteTaggedBatchRawV2RequestPool(opts pool.ObjectPoolOptions) writeTaggedBatchRawV2RequestPool { + p := pool.NewObjectPool(opts) + return &poolOfWriteTaggedBatchRawV2Request{p} +} + +func (p *poolOfWriteTaggedBatchRawV2Request) Init() { + p.pool.Init(func() interface{} { + return &rpc.WriteTaggedBatchRawV2Request{} + }) +} + +func (p *poolOfWriteTaggedBatchRawV2Request) Get() *rpc.WriteTaggedBatchRawV2Request { + return p.pool.Get().(*rpc.WriteTaggedBatchRawV2Request) +} + +func (p *poolOfWriteTaggedBatchRawV2Request) Put(w *rpc.WriteTaggedBatchRawV2Request) { + *w = writeTaggedBatchRawV2RequestZeroed + p.pool.Put(w) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/write_op.go b/vendor/github.com/m3db/m3/src/dbnode/client/write_op.go new file mode 100644 index 00000000..6fdd4bfd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/write_op.go @@ -0,0 +1,103 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "math" + + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" +) + +var ( + // NB(bl): use an invalid shardID for the zerod op + writeOperationZeroed = writeOperation{shardID: math.MaxUint32} +) + +type writeOperation struct { + namespace ident.ID + shardID uint32 + request rpc.WriteBatchRawRequestElement + requestV2 rpc.WriteBatchRawV2RequestElement + datapoint rpc.Datapoint + completionFn completionFn + pool *writeOperationPool +} + +func (w *writeOperation) reset() { + *w = writeOperationZeroed + w.request.Datapoint = &w.datapoint + w.requestV2.Datapoint = &w.datapoint +} + +func (w *writeOperation) Close() { + p := w.pool + w.reset() + if p != nil { + p.Put(w) + } +} + +func (w *writeOperation) Size() int { + // Writes always represent a single write + return 1 +} + +func (w *writeOperation) CompletionFn() completionFn { + return w.completionFn +} + +func (w *writeOperation) SetCompletionFn(fn completionFn) { + w.completionFn = fn +} + +func (w *writeOperation) ShardID() uint32 { + return w.shardID +} + +type writeOperationPool struct { + pool pool.ObjectPool +} + +func newWriteOperationPool(opts pool.ObjectPoolOptions) *writeOperationPool { + p := pool.NewObjectPool(opts) + return &writeOperationPool{pool: p} +} + +func (p *writeOperationPool) Init() { + p.pool.Init(func() interface{} { + w := &writeOperation{} + w.reset() + return w + }) +} + +func (p *writeOperationPool) Get() *writeOperation { + w := p.pool.Get().(*writeOperation) + w.pool = p + return w +} + +func (p *writeOperationPool) Put(w *writeOperation) { + w.reset() + p.pool.Put(w) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/write_state.go b/vendor/github.com/m3db/m3/src/dbnode/client/write_state.go new file mode 100644 index 00000000..61a39d7b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/write_state.go @@ -0,0 +1,208 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "fmt" + "sync" + + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/dbnode/topology" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + "github.com/m3db/m3/src/x/serialize" +) + +// writeOp represents a generic write operation +type writeOp interface { + op + + ShardID() uint32 + + SetCompletionFn(fn completionFn) + + Close() +} + +type writeState struct { + sync.Cond + sync.Mutex + refCounter + + consistencyLevel topology.ConsistencyLevel + shardsLeavingCountTowardsConsistency bool + topoMap topology.Map + op writeOp + nsID ident.ID + tsID ident.ID + tagEncoder serialize.TagEncoder + majority, pending int32 + success int32 + errors []error + + queues []hostQueue + tagEncoderPool serialize.TagEncoderPool + pool *writeStatePool +} + +func newWriteState( + encoderPool serialize.TagEncoderPool, + pool *writeStatePool, +) *writeState { + w := &writeState{ + pool: pool, + tagEncoderPool: encoderPool, + } + w.destructorFn = w.close + w.L = w + return w +} + +func (w *writeState) close() { + w.op.Close() + + w.nsID.Finalize() + w.tsID.Finalize() + + if enc := w.tagEncoder; enc != nil { + enc.Finalize() + } + + w.op, w.majority, w.pending, w.success = nil, 0, 0, 0 + w.nsID, w.tsID, w.tagEncoder = nil, nil, nil + + for i := range w.errors { + w.errors[i] = nil + } + w.errors = w.errors[:0] + + for i := range w.queues { + w.queues[i] = nil + } + w.queues = w.queues[:0] + + if w.pool == nil { + return + } + w.pool.Put(w) +} + +func (w *writeState) completionFn(result interface{}, err error) { + hostID := result.(topology.Host).ID() + // NB(bl) panic on invalid result, it indicates a bug in the code + + w.Lock() + w.pending-- + + var wErr error + + if err != nil { + if IsBadRequestError(err) { + // Wrap with invalid params and non-retryable so it is + // not retried. + err = xerrors.NewInvalidParamsError(err) + err = xerrors.NewNonRetryableError(err) + } + wErr = xerrors.NewRenamedError(err, fmt.Errorf("error writing to host %s: %v", hostID, err)) + } else if hostShardSet, ok := w.topoMap.LookupHostShardSet(hostID); !ok { + errStr := "missing host shard in writeState completionFn: %s" + wErr = xerrors.NewRetryableError(fmt.Errorf(errStr, hostID)) + } else if shardState, err := hostShardSet.ShardSet().LookupStateByID(w.op.ShardID()); err != nil { + errStr := "missing shard %d in host %s" + wErr = xerrors.NewRetryableError(fmt.Errorf(errStr, w.op.ShardID(), hostID)) + } else { + available := shardState == shard.Available + leaving := shardState == shard.Leaving + leavingAndShardsLeavingCountTowardsConsistency := leaving && + w.shardsLeavingCountTowardsConsistency + // NB(bl): Only count writes to available shards towards success. + // NB(r): If shard is leaving and configured to allow writes to leaving + // shards to count towards consistency then allow that to count + // to success. + if !available && !leavingAndShardsLeavingCountTowardsConsistency { + var errStr string + switch shardState { + case shard.Initializing: + errStr = "shard %d in host %s is not available (initializing)" + case shard.Leaving: + errStr = "shard %d in host %s not available (leaving)" + default: + errStr = "shard %d in host %s not available (unknown state)" + } + wErr = xerrors.NewRetryableError(fmt.Errorf(errStr, w.op.ShardID(), hostID)) + } else { + w.success++ + } + } + + if wErr != nil { + w.errors = append(w.errors, wErr) + } + + switch w.consistencyLevel { + case topology.ConsistencyLevelOne: + if w.success > 0 || w.pending == 0 { + w.Signal() + } + case topology.ConsistencyLevelMajority: + if w.success >= w.majority || w.pending == 0 { + w.Signal() + } + case topology.ConsistencyLevelAll: + if w.pending == 0 { + w.Signal() + } + } + + w.Unlock() + w.decRef() +} + +type writeStatePool struct { + pool pool.ObjectPool + tagEncoderPool serialize.TagEncoderPool +} + +func newWriteStatePool( + tagEncoderPool serialize.TagEncoderPool, + opts pool.ObjectPoolOptions, +) *writeStatePool { + p := pool.NewObjectPool(opts) + return &writeStatePool{ + pool: p, + tagEncoderPool: tagEncoderPool, + } +} + +func (p *writeStatePool) Init() { + p.pool.Init(func() interface{} { + return newWriteState(p.tagEncoderPool, p) + }) +} + +func (p *writeStatePool) Get() *writeState { + return p.pool.Get().(*writeState) +} + +func (p *writeStatePool) Put(w *writeState) { + p.pool.Put(w) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/client/write_tagged_op.go b/vendor/github.com/m3db/m3/src/dbnode/client/write_tagged_op.go new file mode 100644 index 00000000..846dc8d3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/client/write_tagged_op.go @@ -0,0 +1,103 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package client + +import ( + "math" + + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" +) + +var ( + // NB(bl): use an invalid shardID for the zerod op + writeTaggedOperationZeroed = writeTaggedOperation{shardID: math.MaxUint32} +) + +type writeTaggedOperation struct { + namespace ident.ID + shardID uint32 + request rpc.WriteTaggedBatchRawRequestElement + requestV2 rpc.WriteTaggedBatchRawV2RequestElement + datapoint rpc.Datapoint + completionFn completionFn + pool *writeTaggedOperationPool +} + +func (w *writeTaggedOperation) reset() { + *w = writeTaggedOperationZeroed + w.request.Datapoint = &w.datapoint + w.requestV2.Datapoint = &w.datapoint +} + +func (w *writeTaggedOperation) Close() { + p := w.pool + w.reset() + if p != nil { + p.Put(w) + } +} + +func (w *writeTaggedOperation) Size() int { + // Writes always represent a single write + return 1 +} + +func (w *writeTaggedOperation) CompletionFn() completionFn { + return w.completionFn +} + +func (w *writeTaggedOperation) SetCompletionFn(fn completionFn) { + w.completionFn = fn +} + +func (w *writeTaggedOperation) ShardID() uint32 { + return w.shardID +} + +type writeTaggedOperationPool struct { + pool pool.ObjectPool +} + +func newWriteTaggedOpPool(opts pool.ObjectPoolOptions) *writeTaggedOperationPool { + p := pool.NewObjectPool(opts) + return &writeTaggedOperationPool{pool: p} +} + +func (p *writeTaggedOperationPool) Init() { + p.pool.Init(func() interface{} { + w := &writeTaggedOperation{} + w.reset() + return w + }) +} + +func (p *writeTaggedOperationPool) Get() *writeTaggedOperation { + w := p.pool.Get().(*writeTaggedOperation) + w.pool = p + return w +} + +func (p *writeTaggedOperationPool) Put(w *writeTaggedOperation) { + w.reset() + p.pool.Put(w) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/clock/options.go b/vendor/github.com/m3db/m3/src/dbnode/clock/options.go new file mode 100644 index 00000000..fd80364a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/clock/options.go @@ -0,0 +1,46 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package clock + +import ( + "time" +) + +type options struct { + nowFn NowFn +} + +// NewOptions creates new clock options +func NewOptions() Options { + return &options{ + nowFn: time.Now, + } +} + +func (o *options) SetNowFn(value NowFn) Options { + opts := *o + opts.nowFn = value + return &opts +} + +func (o *options) NowFn() NowFn { + return o.nowFn +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/clock/types.go b/vendor/github.com/m3db/m3/src/dbnode/clock/types.go new file mode 100644 index 00000000..0b3d5a49 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/clock/types.go @@ -0,0 +1,37 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package clock + +import ( + "time" +) + +// NowFn is the function supplied to determine "now" +type NowFn func() time.Time + +// Options represents the options for the clock +type Options interface { + // SetNowFn sets the nowFn + SetNowFn(value NowFn) Options + + // NowFn returns the nowFn + NowFn() NowFn +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/digest/README.md b/vendor/github.com/m3db/m3/src/dbnode/digest/README.md new file mode 100644 index 00000000..361df340 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/digest/README.md @@ -0,0 +1,9 @@ +# digest + +This package consolidates all our digest algorithms used for data integrity into a single place. Adler32 is used and dependendent on the use case we rely on the standard library or a modified rolling hash version that can be stack allocated. + +For highly concurrent callsites that require digests, they use the stack based adler32 library to avoid having to pool digest structs. The stack based adler32 library is a few percent slower than the standard library adler32 algorithm but heap allocation free. + +For less concurrent callsites or callsites already under a mutex a cached digest struct can be kept and reused, these callsites use the standard library methods. + +For callsites that do not need to incremental checksumming, meaning they only need to checksum a single byte slice, the static checksum method from the standard library is used. diff --git a/vendor/github.com/m3db/m3/src/dbnode/digest/buffer.go b/vendor/github.com/m3db/m3/src/dbnode/digest/buffer.go new file mode 100644 index 00000000..a5cbeb8c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/digest/buffer.go @@ -0,0 +1,75 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package digest + +import ( + "encoding/binary" + "os" +) + +const ( + // DigestLenBytes is the length of generated digests in bytes. + DigestLenBytes = 4 +) + +var ( + // Endianness is little endian + endianness = binary.LittleEndian +) + +// Buffer is a byte slice that facilitates digest reading and writing. +type Buffer []byte + +// NewBuffer creates a new digest buffer. +func NewBuffer() Buffer { + return make([]byte, DigestLenBytes) +} + +// WriteDigest writes a digest to the buffer. +func (b Buffer) WriteDigest(digest uint32) { + endianness.PutUint32(b, digest) +} + +// WriteDigestToFile writes a digest to the file. +func (b Buffer) WriteDigestToFile(fd *os.File, digest uint32) error { + b.WriteDigest(digest) + _, err := fd.Write(b) + return err +} + +// ReadDigest reads the digest from the buffer. +func (b Buffer) ReadDigest() uint32 { + return endianness.Uint32(b) +} + +// ReadDigestFromFile reads the digest from the file. +func (b Buffer) ReadDigestFromFile(fd *os.File) (uint32, error) { + _, err := fd.Read(b) + if err != nil { + return 0, err + } + return b.ReadDigest(), nil +} + +// ToBuffer converts a byte slice to a digest buffer. +func ToBuffer(buf []byte) Buffer { + return Buffer(buf[:DigestLenBytes]) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/digest/digest.go b/vendor/github.com/m3db/m3/src/dbnode/digest/digest.go new file mode 100644 index 00000000..653a5010 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/digest/digest.go @@ -0,0 +1,38 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package digest + +import ( + "hash/adler32" + + "github.com/m3db/stackadler32" +) + +// NewDigest creates a new digest. +// The default 32-bit hashing algorithm is adler32. +func NewDigest() stackadler32.Digest { + return stackadler32.NewDigest() +} + +// Checksum returns the checksum for a buffer. +func Checksum(buf []byte) uint32 { + return adler32.Checksum(buf) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/digest/digest_mock.go b/vendor/github.com/m3db/m3/src/dbnode/digest/digest_mock.go new file mode 100644 index 00000000..8892e8bb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/digest/digest_mock.go @@ -0,0 +1,111 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/digest (interfaces: ReaderWithDigest) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package digest is a generated GoMock package. +package digest + +import ( + "hash" + "io" + "reflect" + + "github.com/golang/mock/gomock" +) + +// MockReaderWithDigest is a mock of ReaderWithDigest interface +type MockReaderWithDigest struct { + ctrl *gomock.Controller + recorder *MockReaderWithDigestMockRecorder +} + +// MockReaderWithDigestMockRecorder is the mock recorder for MockReaderWithDigest +type MockReaderWithDigestMockRecorder struct { + mock *MockReaderWithDigest +} + +// NewMockReaderWithDigest creates a new mock instance +func NewMockReaderWithDigest(ctrl *gomock.Controller) *MockReaderWithDigest { + mock := &MockReaderWithDigest{ctrl: ctrl} + mock.recorder = &MockReaderWithDigestMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockReaderWithDigest) EXPECT() *MockReaderWithDigestMockRecorder { + return m.recorder +} + +// Digest mocks base method +func (m *MockReaderWithDigest) Digest() hash.Hash32 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Digest") + ret0, _ := ret[0].(hash.Hash32) + return ret0 +} + +// Digest indicates an expected call of Digest +func (mr *MockReaderWithDigestMockRecorder) Digest() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Digest", reflect.TypeOf((*MockReaderWithDigest)(nil).Digest)) +} + +// Read mocks base method +func (m *MockReaderWithDigest) Read(arg0 []byte) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Read", arg0) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Read indicates an expected call of Read +func (mr *MockReaderWithDigestMockRecorder) Read(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Read", reflect.TypeOf((*MockReaderWithDigest)(nil).Read), arg0) +} + +// Reset mocks base method +func (m *MockReaderWithDigest) Reset(arg0 io.Reader) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", arg0) +} + +// Reset indicates an expected call of Reset +func (mr *MockReaderWithDigestMockRecorder) Reset(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockReaderWithDigest)(nil).Reset), arg0) +} + +// Validate mocks base method +func (m *MockReaderWithDigest) Validate(arg0 uint32) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockReaderWithDigestMockRecorder) Validate(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockReaderWithDigest)(nil).Validate), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/digest/fd_digest.go b/vendor/github.com/m3db/m3/src/dbnode/digest/fd_digest.go new file mode 100644 index 00000000..af316ff3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/digest/fd_digest.go @@ -0,0 +1,77 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package digest + +import ( + "hash" + "hash/adler32" + "os" + + xclose "github.com/m3db/m3/src/x/close" +) + +// FdWithDigest is a container for a file descriptor and the digest for the file contents. +type FdWithDigest interface { + xclose.Closer + + // Fd returns the file descriptor. + Fd() *os.File + + // Digest returns the digest. + Digest() hash.Hash32 + + // Reset resets the file descriptor and the digest. + Reset(fd *os.File) +} + +type fdWithDigest struct { + fd *os.File + digest hash.Hash32 +} + +func newFdWithDigest() FdWithDigest { + return &fdWithDigest{ + digest: adler32.New(), + } +} + +func (fwd *fdWithDigest) Fd() *os.File { + return fwd.fd +} + +func (fwd *fdWithDigest) Digest() hash.Hash32 { + return fwd.digest +} + +func (fwd *fdWithDigest) Reset(fd *os.File) { + fwd.fd = fd + fwd.digest.Reset() +} + +// Close closes the file descriptor. +func (fwd *fdWithDigest) Close() error { + if fwd.fd == nil { + return nil + } + err := fwd.fd.Close() + fwd.fd = nil + return err +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/digest/reader.go b/vendor/github.com/m3db/m3/src/dbnode/digest/reader.go new file mode 100644 index 00000000..861216ad --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/digest/reader.go @@ -0,0 +1,233 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package digest + +import ( + "bufio" + "errors" + "hash" + "hash/adler32" + "io" + "os" +) + +var ( + // errReadFewerThanExpectedBytes returned when number of bytes read is fewer than expected + errReadFewerThanExpectedBytes = errors.New("number of bytes read is fewer than expected") + + // errChecksumMismatch returned when the calculated checksum doesn't match the stored checksum + errChecksumMismatch = errors.New("calculated checksum doesn't match stored checksum") + + // errBufferSizeMismatch returned when ReadAllAndValidate called without well sized buffer + errBufferSizeMismatch = errors.New("buffer passed is not an exact fit for contents") +) + +// FdWithDigestReader provides a buffered reader for reading from the underlying file. +type FdWithDigestReader interface { + FdWithDigest + io.Reader + + // ReadAllAndValidate reads everything in the underlying file and validates + // it against the expected digest, returning an error if they don't match. + // Note: the buffer "b" must be an exact match for how long the contents being + // read is, the signature is structured this way to allow for buffer reuse. + ReadAllAndValidate(b []byte, expectedDigest uint32) (int, error) + + // Validate compares the current digest against the expected digest and returns + // an error if they don't match. + Validate(expectedDigest uint32) error +} + +type fdWithDigestReader struct { + fd *os.File + bufReader *bufio.Reader + readerWithDigest ReaderWithDigest + single [1]byte +} + +// NewFdWithDigestReader creates a new FdWithDigestReader. +func NewFdWithDigestReader(bufferSize int) FdWithDigestReader { + bufReader := bufio.NewReaderSize(nil, bufferSize) + return &fdWithDigestReader{ + bufReader: bufReader, + readerWithDigest: NewReaderWithDigest(bufReader), + } +} + +// Reset resets the underlying file descriptor and the buffered reader. +func (r *fdWithDigestReader) Reset(fd *os.File) { + r.fd = fd + r.bufReader.Reset(fd) + r.readerWithDigest.Reset(r.bufReader) +} + +func (r *fdWithDigestReader) Read(b []byte) (int, error) { + return r.readerWithDigest.Read(b) +} + +func (r *fdWithDigestReader) Fd() *os.File { + return r.fd +} + +func (r *fdWithDigestReader) Digest() hash.Hash32 { + return r.readerWithDigest.Digest() +} + +func (r *fdWithDigestReader) ReadAllAndValidate(b []byte, expectedDigest uint32) (int, error) { + n, err := r.Read(b) + if err != nil { + return n, err + } + // NB(r): Attempt next read to prove that the size of the buffer b + // was sized correctly to fit all contents into it and that we are + // correctly now at the end of input. + _, err = r.Read(r.single[:]) + if err != io.EOF { + return 0, errBufferSizeMismatch + } + if err := r.Validate(expectedDigest); err != nil { + return n, err + } + return n, nil +} + +func (r *fdWithDigestReader) Validate(expectedDigest uint32) error { + return r.readerWithDigest.Validate(expectedDigest) +} + +func (r *fdWithDigestReader) Close() error { + if r.fd == nil { + return nil + } + err := r.fd.Close() + r.fd = nil + return err +} + +// FdWithDigestContentsReader provides additional functionality of reading a digest from the underlying file. +type FdWithDigestContentsReader interface { + FdWithDigestReader + + // ReadDigest reads a digest from the underlying file. + ReadDigest() (uint32, error) +} + +type fdWithDigestContentsReader struct { + FdWithDigestReader + + digestBuf Buffer +} + +// NewFdWithDigestContentsReader creates a new FdWithDigestContentsReader. +func NewFdWithDigestContentsReader(bufferSize int) FdWithDigestContentsReader { + return &fdWithDigestContentsReader{ + FdWithDigestReader: NewFdWithDigestReader(bufferSize), + digestBuf: NewBuffer(), + } +} + +func (r *fdWithDigestContentsReader) ReadDigest() (uint32, error) { + n, err := r.Read(r.digestBuf) + if err != nil { + return 0, err + } + if n < len(r.digestBuf) { + return 0, errReadFewerThanExpectedBytes + } + return r.digestBuf.ReadDigest(), nil +} + +// ReaderWithDigest is a reader that that calculates a digest +// as it is read. +type ReaderWithDigest interface { + io.Reader + + // Reset resets the reader for use with a new reader. + Reset(reader io.Reader) + + // Digest returns the digest. + Digest() hash.Hash32 + + // Validate compares the current digest against the expected digest and returns + // an error if they don't match. + Validate(expectedDigest uint32) error +} + +type readerWithDigest struct { + reader io.Reader + digest hash.Hash32 +} + +// NewReaderWithDigest creates a new reader that calculates a digest as it +// reads an input. +func NewReaderWithDigest(reader io.Reader) ReaderWithDigest { + return &readerWithDigest{ + reader: reader, + digest: adler32.New(), + } +} + +func (r *readerWithDigest) Reset(reader io.Reader) { + r.reader = reader + r.digest.Reset() +} + +func (r *readerWithDigest) Digest() hash.Hash32 { + return r.digest +} + +func (r *readerWithDigest) readBytes(b []byte) (int, error) { + n, err := r.reader.Read(b) + if err != nil { + return 0, err + } + // In case the buffered reader only returns what's remaining in + // the buffer, recursively read what's left in the underlying reader. + if n < len(b) { + b = b[n:] + remainder, err := r.readBytes(b) + return n + remainder, err + } + return n, err +} + +func (r *readerWithDigest) Read(b []byte) (int, error) { + n, err := r.readBytes(b) + if err != nil && err != io.EOF { + return n, err + } + // If we encountered an EOF error and didn't read any bytes + // given a non-empty slice, we return an EOF error. + if err == io.EOF && n == 0 && len(b) > 0 { + return 0, err + } + if _, err := r.digest.Write(b[:n]); err != nil { + return 0, err + } + return n, nil +} + +func (r *readerWithDigest) Validate(expectedDigest uint32) error { + if r.digest.Sum32() != expectedDigest { + return errChecksumMismatch + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/digest/test_util.go b/vendor/github.com/m3db/m3/src/dbnode/digest/test_util.go new file mode 100644 index 00000000..1bc535d8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/digest/test_util.go @@ -0,0 +1,62 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package digest + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +type mockDigest struct { + b []byte + digest uint32 + err error +} + +func (md *mockDigest) Write(p []byte) (n int, err error) { + if md.err != nil { + return 0, md.err + } + md.b = append(md.b, p...) + return len(p), nil +} + +func (md *mockDigest) Sum(b []byte) []byte { return nil } +func (md *mockDigest) Reset() {} +func (md *mockDigest) ResetTo(v uint32) {} +func (md *mockDigest) Size() int { return 0 } +func (md *mockDigest) BlockSize() int { return 0 } +func (md *mockDigest) Sum32() uint32 { return md.digest } + +func createTestFdWithDigest(t *testing.T) (*os.File, *mockDigest) { + fd := createTempFile(t) + md := &mockDigest{} + return fd, md +} + +func createTempFile(t *testing.T) *os.File { + fd, err := ioutil.TempFile("", "testfile") + require.NoError(t, err) + return fd +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/digest/writer.go b/vendor/github.com/m3db/m3/src/dbnode/digest/writer.go new file mode 100644 index 00000000..e18f0813 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/digest/writer.go @@ -0,0 +1,111 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package digest + +import ( + "bufio" + "io" + "os" +) + +// FdWithDigestWriter provides a buffered writer for writing to the underlying file. +type FdWithDigestWriter interface { + FdWithDigest + io.Writer + + Flush() error +} + +type fdWithDigestWriter struct { + FdWithDigest + writer *bufio.Writer +} + +// NewFdWithDigestWriter creates a new FdWithDigestWriter. +func NewFdWithDigestWriter(bufferSize int) FdWithDigestWriter { + return &fdWithDigestWriter{ + FdWithDigest: newFdWithDigest(), + writer: bufio.NewWriterSize(nil, bufferSize), + } +} + +func (w *fdWithDigestWriter) Reset(fd *os.File) { + w.FdWithDigest.Reset(fd) + w.writer.Reset(fd) +} + +// Write bytes to the underlying file. +func (w *fdWithDigestWriter) Write(b []byte) (int, error) { + written, err := w.writer.Write(b) + if err != nil { + return 0, err + } + if _, err := w.FdWithDigest.Digest().Write(b); err != nil { + return 0, err + } + return written, nil +} + +// Close flushes what's remaining in the buffered writer and closes +// the underlying file. +func (w *fdWithDigestWriter) Close() error { + if err := w.writer.Flush(); err != nil { + return err + } + return w.FdWithDigest.Close() +} + +// Flush flushes what's remaining in the buffered writes. +func (w *fdWithDigestWriter) Flush() error { + return w.writer.Flush() +} + +// FdWithDigestContentsWriter provides additional functionality of writing a digest to the underlying file. +type FdWithDigestContentsWriter interface { + FdWithDigestWriter + + // WriteDigests writes a list of digests to the underlying file. + WriteDigests(digests ...uint32) error +} + +type fdWithDigestContentsWriter struct { + FdWithDigestWriter + + digestBuf Buffer +} + +// NewFdWithDigestContentsWriter creates a new FdWithDigestContentsWriter. +func NewFdWithDigestContentsWriter(bufferSize int) FdWithDigestContentsWriter { + return &fdWithDigestContentsWriter{ + FdWithDigestWriter: NewFdWithDigestWriter(bufferSize), + digestBuf: NewBuffer(), + } +} + +func (w *fdWithDigestContentsWriter) WriteDigests(digests ...uint32) error { + for _, digest := range digests { + w.digestBuf.WriteDigest(digest) + if _, err := w.Write(w.digestBuf); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/encoder_pool.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/encoder_pool.go new file mode 100644 index 00000000..362d118f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/encoder_pool.go @@ -0,0 +1,48 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "github.com/m3db/m3/src/x/pool" +) + +type encoderPool struct { + pool pool.ObjectPool +} + +// NewEncoderPool creates a new pool +func NewEncoderPool(opts pool.ObjectPoolOptions) EncoderPool { + return &encoderPool{pool: pool.NewObjectPool(opts)} +} + +func (p *encoderPool) Init(alloc EncoderAllocate) { + p.pool.Init(func() interface{} { + return alloc() + }) +} + +func (p *encoderPool) Get() Encoder { + return p.pool.Get().(Encoder) +} + +func (p *encoderPool) Put(encoder Encoder) { + p.pool.Put(encoder) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/encoding.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/encoding.go new file mode 100644 index 00000000..4d65f5e9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/encoding.go @@ -0,0 +1,58 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import "math/bits" + +// Bit is just a byte +type Bit byte + +// NumSig returns the number of significant values in a uint64 +func NumSig(v uint64) uint8 { + if v == 0 { + return 0 + } + + numLeading := uint8(0) + for tmp := v; (tmp & (1 << 63)) == 0; tmp <<= 1 { + numLeading++ + } + + return uint8(64) - numLeading +} + +// LeadingAndTrailingZeros calculates the number of leading and trailing 0s +// for a uint64 +func LeadingAndTrailingZeros(v uint64) (int, int) { + if v == 0 { + return 64, 0 + } + + numLeading := bits.LeadingZeros64(v) + numTrailing := bits.TrailingZeros64(v) + return numLeading, numTrailing +} + +// SignExtend sign extends the highest bit of v which has numBits (<=64) +func SignExtend(v uint64, numBits uint) int64 { + shift := 64 - numBits + return (int64(v) << shift) >> shift +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/encoding_mock.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/encoding_mock.go new file mode 100644 index 00000000..9d779fa1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/encoding_mock.go @@ -0,0 +1,2304 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/encoding/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package encoding is a generated GoMock package. +package encoding + +import ( + "io" + "reflect" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/dbnode/x/xpool" + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + "github.com/m3db/m3/src/x/serialize" + time0 "github.com/m3db/m3/src/x/time" + + "github.com/golang/mock/gomock" +) + +// MockEncoder is a mock of Encoder interface +type MockEncoder struct { + ctrl *gomock.Controller + recorder *MockEncoderMockRecorder +} + +// MockEncoderMockRecorder is the mock recorder for MockEncoder +type MockEncoderMockRecorder struct { + mock *MockEncoder +} + +// NewMockEncoder creates a new mock instance +func NewMockEncoder(ctrl *gomock.Controller) *MockEncoder { + mock := &MockEncoder{ctrl: ctrl} + mock.recorder = &MockEncoderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockEncoder) EXPECT() *MockEncoderMockRecorder { + return m.recorder +} + +// SetSchema mocks base method +func (m *MockEncoder) SetSchema(descr namespace.SchemaDescr) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetSchema", descr) +} + +// SetSchema indicates an expected call of SetSchema +func (mr *MockEncoderMockRecorder) SetSchema(descr interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSchema", reflect.TypeOf((*MockEncoder)(nil).SetSchema), descr) +} + +// Encode mocks base method +func (m *MockEncoder) Encode(dp ts.Datapoint, unit time0.Unit, annotation ts.Annotation) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Encode", dp, unit, annotation) + ret0, _ := ret[0].(error) + return ret0 +} + +// Encode indicates an expected call of Encode +func (mr *MockEncoderMockRecorder) Encode(dp, unit, annotation interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Encode", reflect.TypeOf((*MockEncoder)(nil).Encode), dp, unit, annotation) +} + +// Stream mocks base method +func (m *MockEncoder) Stream(ctx context.Context) (xio.SegmentReader, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stream", ctx) + ret0, _ := ret[0].(xio.SegmentReader) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// Stream indicates an expected call of Stream +func (mr *MockEncoderMockRecorder) Stream(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stream", reflect.TypeOf((*MockEncoder)(nil).Stream), ctx) +} + +// NumEncoded mocks base method +func (m *MockEncoder) NumEncoded() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumEncoded") + ret0, _ := ret[0].(int) + return ret0 +} + +// NumEncoded indicates an expected call of NumEncoded +func (mr *MockEncoderMockRecorder) NumEncoded() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumEncoded", reflect.TypeOf((*MockEncoder)(nil).NumEncoded)) +} + +// LastEncoded mocks base method +func (m *MockEncoder) LastEncoded() (ts.Datapoint, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LastEncoded") + ret0, _ := ret[0].(ts.Datapoint) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// LastEncoded indicates an expected call of LastEncoded +func (mr *MockEncoderMockRecorder) LastEncoded() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LastEncoded", reflect.TypeOf((*MockEncoder)(nil).LastEncoded)) +} + +// LastAnnotation mocks base method +func (m *MockEncoder) LastAnnotation() (ts.Annotation, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LastAnnotation") + ret0, _ := ret[0].(ts.Annotation) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// LastAnnotation indicates an expected call of LastAnnotation +func (mr *MockEncoderMockRecorder) LastAnnotation() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LastAnnotation", reflect.TypeOf((*MockEncoder)(nil).LastAnnotation)) +} + +// Len mocks base method +func (m *MockEncoder) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockEncoderMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockEncoder)(nil).Len)) +} + +// Reset mocks base method +func (m *MockEncoder) Reset(t time.Time, capacity int, schema namespace.SchemaDescr) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", t, capacity, schema) +} + +// Reset indicates an expected call of Reset +func (mr *MockEncoderMockRecorder) Reset(t, capacity, schema interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockEncoder)(nil).Reset), t, capacity, schema) +} + +// Close mocks base method +func (m *MockEncoder) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockEncoderMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockEncoder)(nil).Close)) +} + +// Discard mocks base method +func (m *MockEncoder) Discard() ts.Segment { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Discard") + ret0, _ := ret[0].(ts.Segment) + return ret0 +} + +// Discard indicates an expected call of Discard +func (mr *MockEncoderMockRecorder) Discard() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Discard", reflect.TypeOf((*MockEncoder)(nil).Discard)) +} + +// DiscardReset mocks base method +func (m *MockEncoder) DiscardReset(t time.Time, capacity int, schema namespace.SchemaDescr) ts.Segment { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DiscardReset", t, capacity, schema) + ret0, _ := ret[0].(ts.Segment) + return ret0 +} + +// DiscardReset indicates an expected call of DiscardReset +func (mr *MockEncoderMockRecorder) DiscardReset(t, capacity, schema interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DiscardReset", reflect.TypeOf((*MockEncoder)(nil).DiscardReset), t, capacity, schema) +} + +// MockOptions is a mock of Options interface +type MockOptions struct { + ctrl *gomock.Controller + recorder *MockOptionsMockRecorder +} + +// MockOptionsMockRecorder is the mock recorder for MockOptions +type MockOptionsMockRecorder struct { + mock *MockOptions +} + +// NewMockOptions creates a new mock instance +func NewMockOptions(ctrl *gomock.Controller) *MockOptions { + mock := &MockOptions{ctrl: ctrl} + mock.recorder = &MockOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptions) EXPECT() *MockOptionsMockRecorder { + return m.recorder +} + +// SetDefaultTimeUnit mocks base method +func (m *MockOptions) SetDefaultTimeUnit(tu time0.Unit) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetDefaultTimeUnit", tu) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetDefaultTimeUnit indicates an expected call of SetDefaultTimeUnit +func (mr *MockOptionsMockRecorder) SetDefaultTimeUnit(tu interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDefaultTimeUnit", reflect.TypeOf((*MockOptions)(nil).SetDefaultTimeUnit), tu) +} + +// DefaultTimeUnit mocks base method +func (m *MockOptions) DefaultTimeUnit() time0.Unit { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DefaultTimeUnit") + ret0, _ := ret[0].(time0.Unit) + return ret0 +} + +// DefaultTimeUnit indicates an expected call of DefaultTimeUnit +func (mr *MockOptionsMockRecorder) DefaultTimeUnit() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DefaultTimeUnit", reflect.TypeOf((*MockOptions)(nil).DefaultTimeUnit)) +} + +// SetTimeEncodingSchemes mocks base method +func (m *MockOptions) SetTimeEncodingSchemes(value map[time0.Unit]TimeEncodingScheme) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTimeEncodingSchemes", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTimeEncodingSchemes indicates an expected call of SetTimeEncodingSchemes +func (mr *MockOptionsMockRecorder) SetTimeEncodingSchemes(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTimeEncodingSchemes", reflect.TypeOf((*MockOptions)(nil).SetTimeEncodingSchemes), value) +} + +// TimeEncodingSchemes mocks base method +func (m *MockOptions) TimeEncodingSchemes() TimeEncodingSchemes { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TimeEncodingSchemes") + ret0, _ := ret[0].(TimeEncodingSchemes) + return ret0 +} + +// TimeEncodingSchemes indicates an expected call of TimeEncodingSchemes +func (mr *MockOptionsMockRecorder) TimeEncodingSchemes() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TimeEncodingSchemes", reflect.TypeOf((*MockOptions)(nil).TimeEncodingSchemes)) +} + +// SetMarkerEncodingScheme mocks base method +func (m *MockOptions) SetMarkerEncodingScheme(value MarkerEncodingScheme) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMarkerEncodingScheme", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetMarkerEncodingScheme indicates an expected call of SetMarkerEncodingScheme +func (mr *MockOptionsMockRecorder) SetMarkerEncodingScheme(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMarkerEncodingScheme", reflect.TypeOf((*MockOptions)(nil).SetMarkerEncodingScheme), value) +} + +// MarkerEncodingScheme mocks base method +func (m *MockOptions) MarkerEncodingScheme() MarkerEncodingScheme { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarkerEncodingScheme") + ret0, _ := ret[0].(MarkerEncodingScheme) + return ret0 +} + +// MarkerEncodingScheme indicates an expected call of MarkerEncodingScheme +func (mr *MockOptionsMockRecorder) MarkerEncodingScheme() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkerEncodingScheme", reflect.TypeOf((*MockOptions)(nil).MarkerEncodingScheme)) +} + +// SetEncoderPool mocks base method +func (m *MockOptions) SetEncoderPool(value EncoderPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEncoderPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetEncoderPool indicates an expected call of SetEncoderPool +func (mr *MockOptionsMockRecorder) SetEncoderPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEncoderPool", reflect.TypeOf((*MockOptions)(nil).SetEncoderPool), value) +} + +// EncoderPool mocks base method +func (m *MockOptions) EncoderPool() EncoderPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "EncoderPool") + ret0, _ := ret[0].(EncoderPool) + return ret0 +} + +// EncoderPool indicates an expected call of EncoderPool +func (mr *MockOptionsMockRecorder) EncoderPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EncoderPool", reflect.TypeOf((*MockOptions)(nil).EncoderPool)) +} + +// SetReaderIteratorPool mocks base method +func (m *MockOptions) SetReaderIteratorPool(value ReaderIteratorPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReaderIteratorPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetReaderIteratorPool indicates an expected call of SetReaderIteratorPool +func (mr *MockOptionsMockRecorder) SetReaderIteratorPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReaderIteratorPool", reflect.TypeOf((*MockOptions)(nil).SetReaderIteratorPool), value) +} + +// ReaderIteratorPool mocks base method +func (m *MockOptions) ReaderIteratorPool() ReaderIteratorPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReaderIteratorPool") + ret0, _ := ret[0].(ReaderIteratorPool) + return ret0 +} + +// ReaderIteratorPool indicates an expected call of ReaderIteratorPool +func (mr *MockOptionsMockRecorder) ReaderIteratorPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReaderIteratorPool", reflect.TypeOf((*MockOptions)(nil).ReaderIteratorPool)) +} + +// SetBytesPool mocks base method +func (m *MockOptions) SetBytesPool(value pool.CheckedBytesPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBytesPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBytesPool indicates an expected call of SetBytesPool +func (mr *MockOptionsMockRecorder) SetBytesPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBytesPool", reflect.TypeOf((*MockOptions)(nil).SetBytesPool), value) +} + +// BytesPool mocks base method +func (m *MockOptions) BytesPool() pool.CheckedBytesPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BytesPool") + ret0, _ := ret[0].(pool.CheckedBytesPool) + return ret0 +} + +// BytesPool indicates an expected call of BytesPool +func (mr *MockOptionsMockRecorder) BytesPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BytesPool", reflect.TypeOf((*MockOptions)(nil).BytesPool)) +} + +// SetSegmentReaderPool mocks base method +func (m *MockOptions) SetSegmentReaderPool(value xio.SegmentReaderPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSegmentReaderPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetSegmentReaderPool indicates an expected call of SetSegmentReaderPool +func (mr *MockOptionsMockRecorder) SetSegmentReaderPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSegmentReaderPool", reflect.TypeOf((*MockOptions)(nil).SetSegmentReaderPool), value) +} + +// SegmentReaderPool mocks base method +func (m *MockOptions) SegmentReaderPool() xio.SegmentReaderPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentReaderPool") + ret0, _ := ret[0].(xio.SegmentReaderPool) + return ret0 +} + +// SegmentReaderPool indicates an expected call of SegmentReaderPool +func (mr *MockOptionsMockRecorder) SegmentReaderPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentReaderPool", reflect.TypeOf((*MockOptions)(nil).SegmentReaderPool)) +} + +// SetCheckedBytesWrapperPool mocks base method +func (m *MockOptions) SetCheckedBytesWrapperPool(value xpool.CheckedBytesWrapperPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCheckedBytesWrapperPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetCheckedBytesWrapperPool indicates an expected call of SetCheckedBytesWrapperPool +func (mr *MockOptionsMockRecorder) SetCheckedBytesWrapperPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCheckedBytesWrapperPool", reflect.TypeOf((*MockOptions)(nil).SetCheckedBytesWrapperPool), value) +} + +// CheckedBytesWrapperPool mocks base method +func (m *MockOptions) CheckedBytesWrapperPool() xpool.CheckedBytesWrapperPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckedBytesWrapperPool") + ret0, _ := ret[0].(xpool.CheckedBytesWrapperPool) + return ret0 +} + +// CheckedBytesWrapperPool indicates an expected call of CheckedBytesWrapperPool +func (mr *MockOptionsMockRecorder) CheckedBytesWrapperPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckedBytesWrapperPool", reflect.TypeOf((*MockOptions)(nil).CheckedBytesWrapperPool)) +} + +// SetByteFieldDictionaryLRUSize mocks base method +func (m *MockOptions) SetByteFieldDictionaryLRUSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetByteFieldDictionaryLRUSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetByteFieldDictionaryLRUSize indicates an expected call of SetByteFieldDictionaryLRUSize +func (mr *MockOptionsMockRecorder) SetByteFieldDictionaryLRUSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetByteFieldDictionaryLRUSize", reflect.TypeOf((*MockOptions)(nil).SetByteFieldDictionaryLRUSize), value) +} + +// ByteFieldDictionaryLRUSize mocks base method +func (m *MockOptions) ByteFieldDictionaryLRUSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ByteFieldDictionaryLRUSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// ByteFieldDictionaryLRUSize indicates an expected call of ByteFieldDictionaryLRUSize +func (mr *MockOptionsMockRecorder) ByteFieldDictionaryLRUSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ByteFieldDictionaryLRUSize", reflect.TypeOf((*MockOptions)(nil).ByteFieldDictionaryLRUSize)) +} + +// SetIStreamReaderSizeM3TSZ mocks base method +func (m *MockOptions) SetIStreamReaderSizeM3TSZ(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIStreamReaderSizeM3TSZ", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIStreamReaderSizeM3TSZ indicates an expected call of SetIStreamReaderSizeM3TSZ +func (mr *MockOptionsMockRecorder) SetIStreamReaderSizeM3TSZ(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIStreamReaderSizeM3TSZ", reflect.TypeOf((*MockOptions)(nil).SetIStreamReaderSizeM3TSZ), value) +} + +// IStreamReaderSizeM3TSZ mocks base method +func (m *MockOptions) IStreamReaderSizeM3TSZ() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IStreamReaderSizeM3TSZ") + ret0, _ := ret[0].(int) + return ret0 +} + +// IStreamReaderSizeM3TSZ indicates an expected call of IStreamReaderSizeM3TSZ +func (mr *MockOptionsMockRecorder) IStreamReaderSizeM3TSZ() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IStreamReaderSizeM3TSZ", reflect.TypeOf((*MockOptions)(nil).IStreamReaderSizeM3TSZ)) +} + +// SetIStreamReaderSizeProto mocks base method +func (m *MockOptions) SetIStreamReaderSizeProto(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIStreamReaderSizeProto", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIStreamReaderSizeProto indicates an expected call of SetIStreamReaderSizeProto +func (mr *MockOptionsMockRecorder) SetIStreamReaderSizeProto(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIStreamReaderSizeProto", reflect.TypeOf((*MockOptions)(nil).SetIStreamReaderSizeProto), value) +} + +// IStreamReaderSizeProto mocks base method +func (m *MockOptions) IStreamReaderSizeProto() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IStreamReaderSizeProto") + ret0, _ := ret[0].(int) + return ret0 +} + +// IStreamReaderSizeProto indicates an expected call of IStreamReaderSizeProto +func (mr *MockOptionsMockRecorder) IStreamReaderSizeProto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IStreamReaderSizeProto", reflect.TypeOf((*MockOptions)(nil).IStreamReaderSizeProto)) +} + +// MockIterator is a mock of Iterator interface +type MockIterator struct { + ctrl *gomock.Controller + recorder *MockIteratorMockRecorder +} + +// MockIteratorMockRecorder is the mock recorder for MockIterator +type MockIteratorMockRecorder struct { + mock *MockIterator +} + +// NewMockIterator creates a new mock instance +func NewMockIterator(ctrl *gomock.Controller) *MockIterator { + mock := &MockIterator{ctrl: ctrl} + mock.recorder = &MockIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIterator) EXPECT() *MockIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockIterator)(nil).Next)) +} + +// Current mocks base method +func (m *MockIterator) Current() (ts.Datapoint, time0.Unit, ts.Annotation) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(ts.Datapoint) + ret1, _ := ret[1].(time0.Unit) + ret2, _ := ret[2].(ts.Annotation) + return ret0, ret1, ret2 +} + +// Current indicates an expected call of Current +func (mr *MockIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockIterator) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockIterator)(nil).Close)) +} + +// MockReaderIterator is a mock of ReaderIterator interface +type MockReaderIterator struct { + ctrl *gomock.Controller + recorder *MockReaderIteratorMockRecorder +} + +// MockReaderIteratorMockRecorder is the mock recorder for MockReaderIterator +type MockReaderIteratorMockRecorder struct { + mock *MockReaderIterator +} + +// NewMockReaderIterator creates a new mock instance +func NewMockReaderIterator(ctrl *gomock.Controller) *MockReaderIterator { + mock := &MockReaderIterator{ctrl: ctrl} + mock.recorder = &MockReaderIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockReaderIterator) EXPECT() *MockReaderIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockReaderIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockReaderIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockReaderIterator)(nil).Next)) +} + +// Current mocks base method +func (m *MockReaderIterator) Current() (ts.Datapoint, time0.Unit, ts.Annotation) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(ts.Datapoint) + ret1, _ := ret[1].(time0.Unit) + ret2, _ := ret[2].(ts.Annotation) + return ret0, ret1, ret2 +} + +// Current indicates an expected call of Current +func (mr *MockReaderIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockReaderIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockReaderIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockReaderIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockReaderIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockReaderIterator) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockReaderIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockReaderIterator)(nil).Close)) +} + +// Reset mocks base method +func (m *MockReaderIterator) Reset(reader io.Reader, schema namespace.SchemaDescr) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", reader, schema) +} + +// Reset indicates an expected call of Reset +func (mr *MockReaderIteratorMockRecorder) Reset(reader, schema interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockReaderIterator)(nil).Reset), reader, schema) +} + +// MockMultiReaderIterator is a mock of MultiReaderIterator interface +type MockMultiReaderIterator struct { + ctrl *gomock.Controller + recorder *MockMultiReaderIteratorMockRecorder +} + +// MockMultiReaderIteratorMockRecorder is the mock recorder for MockMultiReaderIterator +type MockMultiReaderIteratorMockRecorder struct { + mock *MockMultiReaderIterator +} + +// NewMockMultiReaderIterator creates a new mock instance +func NewMockMultiReaderIterator(ctrl *gomock.Controller) *MockMultiReaderIterator { + mock := &MockMultiReaderIterator{ctrl: ctrl} + mock.recorder = &MockMultiReaderIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMultiReaderIterator) EXPECT() *MockMultiReaderIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockMultiReaderIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockMultiReaderIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockMultiReaderIterator)(nil).Next)) +} + +// Current mocks base method +func (m *MockMultiReaderIterator) Current() (ts.Datapoint, time0.Unit, ts.Annotation) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(ts.Datapoint) + ret1, _ := ret[1].(time0.Unit) + ret2, _ := ret[2].(ts.Annotation) + return ret0, ret1, ret2 +} + +// Current indicates an expected call of Current +func (mr *MockMultiReaderIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockMultiReaderIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockMultiReaderIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockMultiReaderIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockMultiReaderIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockMultiReaderIterator) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockMultiReaderIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockMultiReaderIterator)(nil).Close)) +} + +// Reset mocks base method +func (m *MockMultiReaderIterator) Reset(readers []xio.SegmentReader, start time.Time, blockSize time.Duration, schema namespace.SchemaDescr) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", readers, start, blockSize, schema) +} + +// Reset indicates an expected call of Reset +func (mr *MockMultiReaderIteratorMockRecorder) Reset(readers, start, blockSize, schema interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockMultiReaderIterator)(nil).Reset), readers, start, blockSize, schema) +} + +// ResetSliceOfSlices mocks base method +func (m *MockMultiReaderIterator) ResetSliceOfSlices(readers xio.ReaderSliceOfSlicesIterator, schema namespace.SchemaDescr) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ResetSliceOfSlices", readers, schema) +} + +// ResetSliceOfSlices indicates an expected call of ResetSliceOfSlices +func (mr *MockMultiReaderIteratorMockRecorder) ResetSliceOfSlices(readers, schema interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResetSliceOfSlices", reflect.TypeOf((*MockMultiReaderIterator)(nil).ResetSliceOfSlices), readers, schema) +} + +// Readers mocks base method +func (m *MockMultiReaderIterator) Readers() xio.ReaderSliceOfSlicesIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Readers") + ret0, _ := ret[0].(xio.ReaderSliceOfSlicesIterator) + return ret0 +} + +// Readers indicates an expected call of Readers +func (mr *MockMultiReaderIteratorMockRecorder) Readers() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Readers", reflect.TypeOf((*MockMultiReaderIterator)(nil).Readers)) +} + +// Schema mocks base method +func (m *MockMultiReaderIterator) Schema() namespace.SchemaDescr { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Schema") + ret0, _ := ret[0].(namespace.SchemaDescr) + return ret0 +} + +// Schema indicates an expected call of Schema +func (mr *MockMultiReaderIteratorMockRecorder) Schema() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Schema", reflect.TypeOf((*MockMultiReaderIterator)(nil).Schema)) +} + +// MockSeriesIteratorAccumulator is a mock of SeriesIteratorAccumulator interface +type MockSeriesIteratorAccumulator struct { + ctrl *gomock.Controller + recorder *MockSeriesIteratorAccumulatorMockRecorder +} + +// MockSeriesIteratorAccumulatorMockRecorder is the mock recorder for MockSeriesIteratorAccumulator +type MockSeriesIteratorAccumulatorMockRecorder struct { + mock *MockSeriesIteratorAccumulator +} + +// NewMockSeriesIteratorAccumulator creates a new mock instance +func NewMockSeriesIteratorAccumulator(ctrl *gomock.Controller) *MockSeriesIteratorAccumulator { + mock := &MockSeriesIteratorAccumulator{ctrl: ctrl} + mock.recorder = &MockSeriesIteratorAccumulatorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSeriesIteratorAccumulator) EXPECT() *MockSeriesIteratorAccumulatorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockSeriesIteratorAccumulator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Next)) +} + +// Current mocks base method +func (m *MockSeriesIteratorAccumulator) Current() (ts.Datapoint, time0.Unit, ts.Annotation) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(ts.Datapoint) + ret1, _ := ret[1].(time0.Unit) + ret2, _ := ret[2].(ts.Annotation) + return ret0, ret1, ret2 +} + +// Current indicates an expected call of Current +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Current)) +} + +// Err mocks base method +func (m *MockSeriesIteratorAccumulator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Err)) +} + +// Close mocks base method +func (m *MockSeriesIteratorAccumulator) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Close)) +} + +// ID mocks base method +func (m *MockSeriesIteratorAccumulator) ID() ident.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(ident.ID) + return ret0 +} + +// ID indicates an expected call of ID +func (mr *MockSeriesIteratorAccumulatorMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).ID)) +} + +// Namespace mocks base method +func (m *MockSeriesIteratorAccumulator) Namespace() ident.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Namespace") + ret0, _ := ret[0].(ident.ID) + return ret0 +} + +// Namespace indicates an expected call of Namespace +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Namespace() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Namespace", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Namespace)) +} + +// Start mocks base method +func (m *MockSeriesIteratorAccumulator) Start() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Start") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// Start indicates an expected call of Start +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Start() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Start)) +} + +// End mocks base method +func (m *MockSeriesIteratorAccumulator) End() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "End") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// End indicates an expected call of End +func (mr *MockSeriesIteratorAccumulatorMockRecorder) End() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "End", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).End)) +} + +// Reset mocks base method +func (m *MockSeriesIteratorAccumulator) Reset(opts SeriesIteratorOptions) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", opts) +} + +// Reset indicates an expected call of Reset +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Reset(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Reset), opts) +} + +// SetIterateEqualTimestampStrategy mocks base method +func (m *MockSeriesIteratorAccumulator) SetIterateEqualTimestampStrategy(strategy IterateEqualTimestampStrategy) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetIterateEqualTimestampStrategy", strategy) +} + +// SetIterateEqualTimestampStrategy indicates an expected call of SetIterateEqualTimestampStrategy +func (mr *MockSeriesIteratorAccumulatorMockRecorder) SetIterateEqualTimestampStrategy(strategy interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIterateEqualTimestampStrategy", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).SetIterateEqualTimestampStrategy), strategy) +} + +// Stats mocks base method +func (m *MockSeriesIteratorAccumulator) Stats() (SeriesIteratorStats, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stats") + ret0, _ := ret[0].(SeriesIteratorStats) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Stats indicates an expected call of Stats +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Stats() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stats", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Stats)) +} + +// Replicas mocks base method +func (m *MockSeriesIteratorAccumulator) Replicas() ([]MultiReaderIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Replicas") + ret0, _ := ret[0].([]MultiReaderIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Replicas indicates an expected call of Replicas +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Replicas() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Replicas", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Replicas)) +} + +// Tags mocks base method +func (m *MockSeriesIteratorAccumulator) Tags() ident.TagIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Tags") + ret0, _ := ret[0].(ident.TagIterator) + return ret0 +} + +// Tags indicates an expected call of Tags +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Tags() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Tags", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Tags)) +} + +// Add mocks base method +func (m *MockSeriesIteratorAccumulator) Add(it SeriesIterator) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Add", it) + ret0, _ := ret[0].(error) + return ret0 +} + +// Add indicates an expected call of Add +func (mr *MockSeriesIteratorAccumulatorMockRecorder) Add(it interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockSeriesIteratorAccumulator)(nil).Add), it) +} + +// MockSeriesIterator is a mock of SeriesIterator interface +type MockSeriesIterator struct { + ctrl *gomock.Controller + recorder *MockSeriesIteratorMockRecorder +} + +// MockSeriesIteratorMockRecorder is the mock recorder for MockSeriesIterator +type MockSeriesIteratorMockRecorder struct { + mock *MockSeriesIterator +} + +// NewMockSeriesIterator creates a new mock instance +func NewMockSeriesIterator(ctrl *gomock.Controller) *MockSeriesIterator { + mock := &MockSeriesIterator{ctrl: ctrl} + mock.recorder = &MockSeriesIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSeriesIterator) EXPECT() *MockSeriesIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockSeriesIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockSeriesIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockSeriesIterator)(nil).Next)) +} + +// Current mocks base method +func (m *MockSeriesIterator) Current() (ts.Datapoint, time0.Unit, ts.Annotation) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(ts.Datapoint) + ret1, _ := ret[1].(time0.Unit) + ret2, _ := ret[2].(ts.Annotation) + return ret0, ret1, ret2 +} + +// Current indicates an expected call of Current +func (mr *MockSeriesIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockSeriesIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockSeriesIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockSeriesIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockSeriesIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockSeriesIterator) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockSeriesIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSeriesIterator)(nil).Close)) +} + +// ID mocks base method +func (m *MockSeriesIterator) ID() ident.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(ident.ID) + return ret0 +} + +// ID indicates an expected call of ID +func (mr *MockSeriesIteratorMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockSeriesIterator)(nil).ID)) +} + +// Namespace mocks base method +func (m *MockSeriesIterator) Namespace() ident.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Namespace") + ret0, _ := ret[0].(ident.ID) + return ret0 +} + +// Namespace indicates an expected call of Namespace +func (mr *MockSeriesIteratorMockRecorder) Namespace() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Namespace", reflect.TypeOf((*MockSeriesIterator)(nil).Namespace)) +} + +// Start mocks base method +func (m *MockSeriesIterator) Start() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Start") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// Start indicates an expected call of Start +func (mr *MockSeriesIteratorMockRecorder) Start() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*MockSeriesIterator)(nil).Start)) +} + +// End mocks base method +func (m *MockSeriesIterator) End() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "End") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// End indicates an expected call of End +func (mr *MockSeriesIteratorMockRecorder) End() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "End", reflect.TypeOf((*MockSeriesIterator)(nil).End)) +} + +// Reset mocks base method +func (m *MockSeriesIterator) Reset(opts SeriesIteratorOptions) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", opts) +} + +// Reset indicates an expected call of Reset +func (mr *MockSeriesIteratorMockRecorder) Reset(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockSeriesIterator)(nil).Reset), opts) +} + +// SetIterateEqualTimestampStrategy mocks base method +func (m *MockSeriesIterator) SetIterateEqualTimestampStrategy(strategy IterateEqualTimestampStrategy) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetIterateEqualTimestampStrategy", strategy) +} + +// SetIterateEqualTimestampStrategy indicates an expected call of SetIterateEqualTimestampStrategy +func (mr *MockSeriesIteratorMockRecorder) SetIterateEqualTimestampStrategy(strategy interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIterateEqualTimestampStrategy", reflect.TypeOf((*MockSeriesIterator)(nil).SetIterateEqualTimestampStrategy), strategy) +} + +// Stats mocks base method +func (m *MockSeriesIterator) Stats() (SeriesIteratorStats, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stats") + ret0, _ := ret[0].(SeriesIteratorStats) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Stats indicates an expected call of Stats +func (mr *MockSeriesIteratorMockRecorder) Stats() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stats", reflect.TypeOf((*MockSeriesIterator)(nil).Stats)) +} + +// Replicas mocks base method +func (m *MockSeriesIterator) Replicas() ([]MultiReaderIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Replicas") + ret0, _ := ret[0].([]MultiReaderIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Replicas indicates an expected call of Replicas +func (mr *MockSeriesIteratorMockRecorder) Replicas() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Replicas", reflect.TypeOf((*MockSeriesIterator)(nil).Replicas)) +} + +// Tags mocks base method +func (m *MockSeriesIterator) Tags() ident.TagIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Tags") + ret0, _ := ret[0].(ident.TagIterator) + return ret0 +} + +// Tags indicates an expected call of Tags +func (mr *MockSeriesIteratorMockRecorder) Tags() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Tags", reflect.TypeOf((*MockSeriesIterator)(nil).Tags)) +} + +// MockSeriesIteratorConsolidator is a mock of SeriesIteratorConsolidator interface +type MockSeriesIteratorConsolidator struct { + ctrl *gomock.Controller + recorder *MockSeriesIteratorConsolidatorMockRecorder +} + +// MockSeriesIteratorConsolidatorMockRecorder is the mock recorder for MockSeriesIteratorConsolidator +type MockSeriesIteratorConsolidatorMockRecorder struct { + mock *MockSeriesIteratorConsolidator +} + +// NewMockSeriesIteratorConsolidator creates a new mock instance +func NewMockSeriesIteratorConsolidator(ctrl *gomock.Controller) *MockSeriesIteratorConsolidator { + mock := &MockSeriesIteratorConsolidator{ctrl: ctrl} + mock.recorder = &MockSeriesIteratorConsolidatorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSeriesIteratorConsolidator) EXPECT() *MockSeriesIteratorConsolidatorMockRecorder { + return m.recorder +} + +// ConsolidateReplicas mocks base method +func (m *MockSeriesIteratorConsolidator) ConsolidateReplicas(replicas []MultiReaderIterator) ([]MultiReaderIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConsolidateReplicas", replicas) + ret0, _ := ret[0].([]MultiReaderIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ConsolidateReplicas indicates an expected call of ConsolidateReplicas +func (mr *MockSeriesIteratorConsolidatorMockRecorder) ConsolidateReplicas(replicas interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConsolidateReplicas", reflect.TypeOf((*MockSeriesIteratorConsolidator)(nil).ConsolidateReplicas), replicas) +} + +// MockSeriesIterators is a mock of SeriesIterators interface +type MockSeriesIterators struct { + ctrl *gomock.Controller + recorder *MockSeriesIteratorsMockRecorder +} + +// MockSeriesIteratorsMockRecorder is the mock recorder for MockSeriesIterators +type MockSeriesIteratorsMockRecorder struct { + mock *MockSeriesIterators +} + +// NewMockSeriesIterators creates a new mock instance +func NewMockSeriesIterators(ctrl *gomock.Controller) *MockSeriesIterators { + mock := &MockSeriesIterators{ctrl: ctrl} + mock.recorder = &MockSeriesIteratorsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSeriesIterators) EXPECT() *MockSeriesIteratorsMockRecorder { + return m.recorder +} + +// Iters mocks base method +func (m *MockSeriesIterators) Iters() []SeriesIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Iters") + ret0, _ := ret[0].([]SeriesIterator) + return ret0 +} + +// Iters indicates an expected call of Iters +func (mr *MockSeriesIteratorsMockRecorder) Iters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Iters", reflect.TypeOf((*MockSeriesIterators)(nil).Iters)) +} + +// Len mocks base method +func (m *MockSeriesIterators) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockSeriesIteratorsMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockSeriesIterators)(nil).Len)) +} + +// Close mocks base method +func (m *MockSeriesIterators) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockSeriesIteratorsMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSeriesIterators)(nil).Close)) +} + +// MockMutableSeriesIterators is a mock of MutableSeriesIterators interface +type MockMutableSeriesIterators struct { + ctrl *gomock.Controller + recorder *MockMutableSeriesIteratorsMockRecorder +} + +// MockMutableSeriesIteratorsMockRecorder is the mock recorder for MockMutableSeriesIterators +type MockMutableSeriesIteratorsMockRecorder struct { + mock *MockMutableSeriesIterators +} + +// NewMockMutableSeriesIterators creates a new mock instance +func NewMockMutableSeriesIterators(ctrl *gomock.Controller) *MockMutableSeriesIterators { + mock := &MockMutableSeriesIterators{ctrl: ctrl} + mock.recorder = &MockMutableSeriesIteratorsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMutableSeriesIterators) EXPECT() *MockMutableSeriesIteratorsMockRecorder { + return m.recorder +} + +// Iters mocks base method +func (m *MockMutableSeriesIterators) Iters() []SeriesIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Iters") + ret0, _ := ret[0].([]SeriesIterator) + return ret0 +} + +// Iters indicates an expected call of Iters +func (mr *MockMutableSeriesIteratorsMockRecorder) Iters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Iters", reflect.TypeOf((*MockMutableSeriesIterators)(nil).Iters)) +} + +// Len mocks base method +func (m *MockMutableSeriesIterators) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockMutableSeriesIteratorsMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockMutableSeriesIterators)(nil).Len)) +} + +// Close mocks base method +func (m *MockMutableSeriesIterators) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockMutableSeriesIteratorsMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockMutableSeriesIterators)(nil).Close)) +} + +// Reset mocks base method +func (m *MockMutableSeriesIterators) Reset(size int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", size) +} + +// Reset indicates an expected call of Reset +func (mr *MockMutableSeriesIteratorsMockRecorder) Reset(size interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockMutableSeriesIterators)(nil).Reset), size) +} + +// Cap mocks base method +func (m *MockMutableSeriesIterators) Cap() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Cap") + ret0, _ := ret[0].(int) + return ret0 +} + +// Cap indicates an expected call of Cap +func (mr *MockMutableSeriesIteratorsMockRecorder) Cap() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cap", reflect.TypeOf((*MockMutableSeriesIterators)(nil).Cap)) +} + +// SetAt mocks base method +func (m *MockMutableSeriesIterators) SetAt(idx int, iter SeriesIterator) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetAt", idx, iter) +} + +// SetAt indicates an expected call of SetAt +func (mr *MockMutableSeriesIteratorsMockRecorder) SetAt(idx, iter interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAt", reflect.TypeOf((*MockMutableSeriesIterators)(nil).SetAt), idx, iter) +} + +// MockDecoder is a mock of Decoder interface +type MockDecoder struct { + ctrl *gomock.Controller + recorder *MockDecoderMockRecorder +} + +// MockDecoderMockRecorder is the mock recorder for MockDecoder +type MockDecoderMockRecorder struct { + mock *MockDecoder +} + +// NewMockDecoder creates a new mock instance +func NewMockDecoder(ctrl *gomock.Controller) *MockDecoder { + mock := &MockDecoder{ctrl: ctrl} + mock.recorder = &MockDecoderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDecoder) EXPECT() *MockDecoderMockRecorder { + return m.recorder +} + +// Decode mocks base method +func (m *MockDecoder) Decode(reader io.Reader) ReaderIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Decode", reader) + ret0, _ := ret[0].(ReaderIterator) + return ret0 +} + +// Decode indicates an expected call of Decode +func (mr *MockDecoderMockRecorder) Decode(reader interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Decode", reflect.TypeOf((*MockDecoder)(nil).Decode), reader) +} + +// MockIStream is a mock of IStream interface +type MockIStream struct { + ctrl *gomock.Controller + recorder *MockIStreamMockRecorder +} + +// MockIStreamMockRecorder is the mock recorder for MockIStream +type MockIStreamMockRecorder struct { + mock *MockIStream +} + +// NewMockIStream creates a new mock instance +func NewMockIStream(ctrl *gomock.Controller) *MockIStream { + mock := &MockIStream{ctrl: ctrl} + mock.recorder = &MockIStreamMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIStream) EXPECT() *MockIStreamMockRecorder { + return m.recorder +} + +// Read mocks base method +func (m *MockIStream) Read(arg0 []byte) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Read", arg0) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Read indicates an expected call of Read +func (mr *MockIStreamMockRecorder) Read(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Read", reflect.TypeOf((*MockIStream)(nil).Read), arg0) +} + +// ReadBit mocks base method +func (m *MockIStream) ReadBit() (Bit, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadBit") + ret0, _ := ret[0].(Bit) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadBit indicates an expected call of ReadBit +func (mr *MockIStreamMockRecorder) ReadBit() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadBit", reflect.TypeOf((*MockIStream)(nil).ReadBit)) +} + +// ReadByte mocks base method +func (m *MockIStream) ReadByte() (byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadByte") + ret0, _ := ret[0].(byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadByte indicates an expected call of ReadByte +func (mr *MockIStreamMockRecorder) ReadByte() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadByte", reflect.TypeOf((*MockIStream)(nil).ReadByte)) +} + +// ReadBits mocks base method +func (m *MockIStream) ReadBits(numBits uint) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadBits", numBits) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadBits indicates an expected call of ReadBits +func (mr *MockIStreamMockRecorder) ReadBits(numBits interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadBits", reflect.TypeOf((*MockIStream)(nil).ReadBits), numBits) +} + +// PeekBits mocks base method +func (m *MockIStream) PeekBits(numBits uint) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PeekBits", numBits) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PeekBits indicates an expected call of PeekBits +func (mr *MockIStreamMockRecorder) PeekBits(numBits interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PeekBits", reflect.TypeOf((*MockIStream)(nil).PeekBits), numBits) +} + +// RemainingBitsInCurrentByte mocks base method +func (m *MockIStream) RemainingBitsInCurrentByte() uint { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemainingBitsInCurrentByte") + ret0, _ := ret[0].(uint) + return ret0 +} + +// RemainingBitsInCurrentByte indicates an expected call of RemainingBitsInCurrentByte +func (mr *MockIStreamMockRecorder) RemainingBitsInCurrentByte() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemainingBitsInCurrentByte", reflect.TypeOf((*MockIStream)(nil).RemainingBitsInCurrentByte)) +} + +// Reset mocks base method +func (m *MockIStream) Reset(r io.Reader) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", r) +} + +// Reset indicates an expected call of Reset +func (mr *MockIStreamMockRecorder) Reset(r interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockIStream)(nil).Reset), r) +} + +// MockOStream is a mock of OStream interface +type MockOStream struct { + ctrl *gomock.Controller + recorder *MockOStreamMockRecorder +} + +// MockOStreamMockRecorder is the mock recorder for MockOStream +type MockOStreamMockRecorder struct { + mock *MockOStream +} + +// NewMockOStream creates a new mock instance +func NewMockOStream(ctrl *gomock.Controller) *MockOStream { + mock := &MockOStream{ctrl: ctrl} + mock.recorder = &MockOStreamMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOStream) EXPECT() *MockOStreamMockRecorder { + return m.recorder +} + +// Len mocks base method +func (m *MockOStream) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockOStreamMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockOStream)(nil).Len)) +} + +// Empty mocks base method +func (m *MockOStream) Empty() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Empty") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Empty indicates an expected call of Empty +func (mr *MockOStreamMockRecorder) Empty() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Empty", reflect.TypeOf((*MockOStream)(nil).Empty)) +} + +// WriteBit mocks base method +func (m *MockOStream) WriteBit(v Bit) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "WriteBit", v) +} + +// WriteBit indicates an expected call of WriteBit +func (mr *MockOStreamMockRecorder) WriteBit(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBit", reflect.TypeOf((*MockOStream)(nil).WriteBit), v) +} + +// WriteBits mocks base method +func (m *MockOStream) WriteBits(v uint64, numBits int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "WriteBits", v, numBits) +} + +// WriteBits indicates an expected call of WriteBits +func (mr *MockOStreamMockRecorder) WriteBits(v, numBits interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBits", reflect.TypeOf((*MockOStream)(nil).WriteBits), v, numBits) +} + +// WriteByte mocks base method +func (m *MockOStream) WriteByte(v byte) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "WriteByte", v) +} + +// WriteByte indicates an expected call of WriteByte +func (mr *MockOStreamMockRecorder) WriteByte(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteByte", reflect.TypeOf((*MockOStream)(nil).WriteByte), v) +} + +// WriteBytes mocks base method +func (m *MockOStream) WriteBytes(bytes []byte) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "WriteBytes", bytes) +} + +// WriteBytes indicates an expected call of WriteBytes +func (mr *MockOStreamMockRecorder) WriteBytes(bytes interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBytes", reflect.TypeOf((*MockOStream)(nil).WriteBytes), bytes) +} + +// Write mocks base method +func (m *MockOStream) Write(bytes []byte) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", bytes) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Write indicates an expected call of Write +func (mr *MockOStreamMockRecorder) Write(bytes interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockOStream)(nil).Write), bytes) +} + +// Reset mocks base method +func (m *MockOStream) Reset(buffer checked.Bytes) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", buffer) +} + +// Reset indicates an expected call of Reset +func (mr *MockOStreamMockRecorder) Reset(buffer interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockOStream)(nil).Reset), buffer) +} + +// Discard mocks base method +func (m *MockOStream) Discard() checked.Bytes { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Discard") + ret0, _ := ret[0].(checked.Bytes) + return ret0 +} + +// Discard indicates an expected call of Discard +func (mr *MockOStreamMockRecorder) Discard() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Discard", reflect.TypeOf((*MockOStream)(nil).Discard)) +} + +// RawBytes mocks base method +func (m *MockOStream) RawBytes() ([]byte, int) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RawBytes") + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(int) + return ret0, ret1 +} + +// RawBytes indicates an expected call of RawBytes +func (mr *MockOStreamMockRecorder) RawBytes() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RawBytes", reflect.TypeOf((*MockOStream)(nil).RawBytes)) +} + +// CheckedBytes mocks base method +func (m *MockOStream) CheckedBytes() (checked.Bytes, int) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckedBytes") + ret0, _ := ret[0].(checked.Bytes) + ret1, _ := ret[1].(int) + return ret0, ret1 +} + +// CheckedBytes indicates an expected call of CheckedBytes +func (mr *MockOStreamMockRecorder) CheckedBytes() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckedBytes", reflect.TypeOf((*MockOStream)(nil).CheckedBytes)) +} + +// MockEncoderPool is a mock of EncoderPool interface +type MockEncoderPool struct { + ctrl *gomock.Controller + recorder *MockEncoderPoolMockRecorder +} + +// MockEncoderPoolMockRecorder is the mock recorder for MockEncoderPool +type MockEncoderPoolMockRecorder struct { + mock *MockEncoderPool +} + +// NewMockEncoderPool creates a new mock instance +func NewMockEncoderPool(ctrl *gomock.Controller) *MockEncoderPool { + mock := &MockEncoderPool{ctrl: ctrl} + mock.recorder = &MockEncoderPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockEncoderPool) EXPECT() *MockEncoderPoolMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockEncoderPool) Init(alloc EncoderAllocate) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init", alloc) +} + +// Init indicates an expected call of Init +func (mr *MockEncoderPoolMockRecorder) Init(alloc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockEncoderPool)(nil).Init), alloc) +} + +// Get mocks base method +func (m *MockEncoderPool) Get() Encoder { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(Encoder) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockEncoderPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockEncoderPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockEncoderPool) Put(e Encoder) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", e) +} + +// Put indicates an expected call of Put +func (mr *MockEncoderPoolMockRecorder) Put(e interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockEncoderPool)(nil).Put), e) +} + +// MockReaderIteratorPool is a mock of ReaderIteratorPool interface +type MockReaderIteratorPool struct { + ctrl *gomock.Controller + recorder *MockReaderIteratorPoolMockRecorder +} + +// MockReaderIteratorPoolMockRecorder is the mock recorder for MockReaderIteratorPool +type MockReaderIteratorPoolMockRecorder struct { + mock *MockReaderIteratorPool +} + +// NewMockReaderIteratorPool creates a new mock instance +func NewMockReaderIteratorPool(ctrl *gomock.Controller) *MockReaderIteratorPool { + mock := &MockReaderIteratorPool{ctrl: ctrl} + mock.recorder = &MockReaderIteratorPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockReaderIteratorPool) EXPECT() *MockReaderIteratorPoolMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockReaderIteratorPool) Init(alloc ReaderIteratorAllocate) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init", alloc) +} + +// Init indicates an expected call of Init +func (mr *MockReaderIteratorPoolMockRecorder) Init(alloc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockReaderIteratorPool)(nil).Init), alloc) +} + +// Get mocks base method +func (m *MockReaderIteratorPool) Get() ReaderIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(ReaderIterator) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockReaderIteratorPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockReaderIteratorPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockReaderIteratorPool) Put(iter ReaderIterator) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", iter) +} + +// Put indicates an expected call of Put +func (mr *MockReaderIteratorPoolMockRecorder) Put(iter interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockReaderIteratorPool)(nil).Put), iter) +} + +// MockMultiReaderIteratorPool is a mock of MultiReaderIteratorPool interface +type MockMultiReaderIteratorPool struct { + ctrl *gomock.Controller + recorder *MockMultiReaderIteratorPoolMockRecorder +} + +// MockMultiReaderIteratorPoolMockRecorder is the mock recorder for MockMultiReaderIteratorPool +type MockMultiReaderIteratorPoolMockRecorder struct { + mock *MockMultiReaderIteratorPool +} + +// NewMockMultiReaderIteratorPool creates a new mock instance +func NewMockMultiReaderIteratorPool(ctrl *gomock.Controller) *MockMultiReaderIteratorPool { + mock := &MockMultiReaderIteratorPool{ctrl: ctrl} + mock.recorder = &MockMultiReaderIteratorPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMultiReaderIteratorPool) EXPECT() *MockMultiReaderIteratorPoolMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockMultiReaderIteratorPool) Init(alloc ReaderIteratorAllocate) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init", alloc) +} + +// Init indicates an expected call of Init +func (mr *MockMultiReaderIteratorPoolMockRecorder) Init(alloc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockMultiReaderIteratorPool)(nil).Init), alloc) +} + +// Get mocks base method +func (m *MockMultiReaderIteratorPool) Get() MultiReaderIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(MultiReaderIterator) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockMultiReaderIteratorPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockMultiReaderIteratorPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockMultiReaderIteratorPool) Put(iter MultiReaderIterator) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", iter) +} + +// Put indicates an expected call of Put +func (mr *MockMultiReaderIteratorPoolMockRecorder) Put(iter interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockMultiReaderIteratorPool)(nil).Put), iter) +} + +// MockSeriesIteratorPool is a mock of SeriesIteratorPool interface +type MockSeriesIteratorPool struct { + ctrl *gomock.Controller + recorder *MockSeriesIteratorPoolMockRecorder +} + +// MockSeriesIteratorPoolMockRecorder is the mock recorder for MockSeriesIteratorPool +type MockSeriesIteratorPoolMockRecorder struct { + mock *MockSeriesIteratorPool +} + +// NewMockSeriesIteratorPool creates a new mock instance +func NewMockSeriesIteratorPool(ctrl *gomock.Controller) *MockSeriesIteratorPool { + mock := &MockSeriesIteratorPool{ctrl: ctrl} + mock.recorder = &MockSeriesIteratorPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSeriesIteratorPool) EXPECT() *MockSeriesIteratorPoolMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockSeriesIteratorPool) Init() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init") +} + +// Init indicates an expected call of Init +func (mr *MockSeriesIteratorPoolMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockSeriesIteratorPool)(nil).Init)) +} + +// Get mocks base method +func (m *MockSeriesIteratorPool) Get() SeriesIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(SeriesIterator) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockSeriesIteratorPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockSeriesIteratorPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockSeriesIteratorPool) Put(iter SeriesIterator) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", iter) +} + +// Put indicates an expected call of Put +func (mr *MockSeriesIteratorPoolMockRecorder) Put(iter interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockSeriesIteratorPool)(nil).Put), iter) +} + +// MockMutableSeriesIteratorsPool is a mock of MutableSeriesIteratorsPool interface +type MockMutableSeriesIteratorsPool struct { + ctrl *gomock.Controller + recorder *MockMutableSeriesIteratorsPoolMockRecorder +} + +// MockMutableSeriesIteratorsPoolMockRecorder is the mock recorder for MockMutableSeriesIteratorsPool +type MockMutableSeriesIteratorsPoolMockRecorder struct { + mock *MockMutableSeriesIteratorsPool +} + +// NewMockMutableSeriesIteratorsPool creates a new mock instance +func NewMockMutableSeriesIteratorsPool(ctrl *gomock.Controller) *MockMutableSeriesIteratorsPool { + mock := &MockMutableSeriesIteratorsPool{ctrl: ctrl} + mock.recorder = &MockMutableSeriesIteratorsPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMutableSeriesIteratorsPool) EXPECT() *MockMutableSeriesIteratorsPoolMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockMutableSeriesIteratorsPool) Init() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init") +} + +// Init indicates an expected call of Init +func (mr *MockMutableSeriesIteratorsPoolMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockMutableSeriesIteratorsPool)(nil).Init)) +} + +// Get mocks base method +func (m *MockMutableSeriesIteratorsPool) Get(size int) MutableSeriesIterators { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", size) + ret0, _ := ret[0].(MutableSeriesIterators) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockMutableSeriesIteratorsPoolMockRecorder) Get(size interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockMutableSeriesIteratorsPool)(nil).Get), size) +} + +// Put mocks base method +func (m *MockMutableSeriesIteratorsPool) Put(iters MutableSeriesIterators) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", iters) +} + +// Put indicates an expected call of Put +func (mr *MockMutableSeriesIteratorsPoolMockRecorder) Put(iters interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockMutableSeriesIteratorsPool)(nil).Put), iters) +} + +// MockMultiReaderIteratorArrayPool is a mock of MultiReaderIteratorArrayPool interface +type MockMultiReaderIteratorArrayPool struct { + ctrl *gomock.Controller + recorder *MockMultiReaderIteratorArrayPoolMockRecorder +} + +// MockMultiReaderIteratorArrayPoolMockRecorder is the mock recorder for MockMultiReaderIteratorArrayPool +type MockMultiReaderIteratorArrayPoolMockRecorder struct { + mock *MockMultiReaderIteratorArrayPool +} + +// NewMockMultiReaderIteratorArrayPool creates a new mock instance +func NewMockMultiReaderIteratorArrayPool(ctrl *gomock.Controller) *MockMultiReaderIteratorArrayPool { + mock := &MockMultiReaderIteratorArrayPool{ctrl: ctrl} + mock.recorder = &MockMultiReaderIteratorArrayPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMultiReaderIteratorArrayPool) EXPECT() *MockMultiReaderIteratorArrayPoolMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockMultiReaderIteratorArrayPool) Init() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init") +} + +// Init indicates an expected call of Init +func (mr *MockMultiReaderIteratorArrayPoolMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockMultiReaderIteratorArrayPool)(nil).Init)) +} + +// Get mocks base method +func (m *MockMultiReaderIteratorArrayPool) Get(size int) []MultiReaderIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", size) + ret0, _ := ret[0].([]MultiReaderIterator) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockMultiReaderIteratorArrayPoolMockRecorder) Get(size interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockMultiReaderIteratorArrayPool)(nil).Get), size) +} + +// Put mocks base method +func (m *MockMultiReaderIteratorArrayPool) Put(iters []MultiReaderIterator) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", iters) +} + +// Put indicates an expected call of Put +func (mr *MockMultiReaderIteratorArrayPoolMockRecorder) Put(iters interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockMultiReaderIteratorArrayPool)(nil).Put), iters) +} + +// MockIteratorPools is a mock of IteratorPools interface +type MockIteratorPools struct { + ctrl *gomock.Controller + recorder *MockIteratorPoolsMockRecorder +} + +// MockIteratorPoolsMockRecorder is the mock recorder for MockIteratorPools +type MockIteratorPoolsMockRecorder struct { + mock *MockIteratorPools +} + +// NewMockIteratorPools creates a new mock instance +func NewMockIteratorPools(ctrl *gomock.Controller) *MockIteratorPools { + mock := &MockIteratorPools{ctrl: ctrl} + mock.recorder = &MockIteratorPoolsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIteratorPools) EXPECT() *MockIteratorPoolsMockRecorder { + return m.recorder +} + +// MultiReaderIteratorArray mocks base method +func (m *MockIteratorPools) MultiReaderIteratorArray() MultiReaderIteratorArrayPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MultiReaderIteratorArray") + ret0, _ := ret[0].(MultiReaderIteratorArrayPool) + return ret0 +} + +// MultiReaderIteratorArray indicates an expected call of MultiReaderIteratorArray +func (mr *MockIteratorPoolsMockRecorder) MultiReaderIteratorArray() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MultiReaderIteratorArray", reflect.TypeOf((*MockIteratorPools)(nil).MultiReaderIteratorArray)) +} + +// MultiReaderIterator mocks base method +func (m *MockIteratorPools) MultiReaderIterator() MultiReaderIteratorPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MultiReaderIterator") + ret0, _ := ret[0].(MultiReaderIteratorPool) + return ret0 +} + +// MultiReaderIterator indicates an expected call of MultiReaderIterator +func (mr *MockIteratorPoolsMockRecorder) MultiReaderIterator() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MultiReaderIterator", reflect.TypeOf((*MockIteratorPools)(nil).MultiReaderIterator)) +} + +// MutableSeriesIterators mocks base method +func (m *MockIteratorPools) MutableSeriesIterators() MutableSeriesIteratorsPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MutableSeriesIterators") + ret0, _ := ret[0].(MutableSeriesIteratorsPool) + return ret0 +} + +// MutableSeriesIterators indicates an expected call of MutableSeriesIterators +func (mr *MockIteratorPoolsMockRecorder) MutableSeriesIterators() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MutableSeriesIterators", reflect.TypeOf((*MockIteratorPools)(nil).MutableSeriesIterators)) +} + +// SeriesIterator mocks base method +func (m *MockIteratorPools) SeriesIterator() SeriesIteratorPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SeriesIterator") + ret0, _ := ret[0].(SeriesIteratorPool) + return ret0 +} + +// SeriesIterator indicates an expected call of SeriesIterator +func (mr *MockIteratorPoolsMockRecorder) SeriesIterator() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SeriesIterator", reflect.TypeOf((*MockIteratorPools)(nil).SeriesIterator)) +} + +// CheckedBytesWrapper mocks base method +func (m *MockIteratorPools) CheckedBytesWrapper() xpool.CheckedBytesWrapperPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckedBytesWrapper") + ret0, _ := ret[0].(xpool.CheckedBytesWrapperPool) + return ret0 +} + +// CheckedBytesWrapper indicates an expected call of CheckedBytesWrapper +func (mr *MockIteratorPoolsMockRecorder) CheckedBytesWrapper() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckedBytesWrapper", reflect.TypeOf((*MockIteratorPools)(nil).CheckedBytesWrapper)) +} + +// ID mocks base method +func (m *MockIteratorPools) ID() ident.Pool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(ident.Pool) + return ret0 +} + +// ID indicates an expected call of ID +func (mr *MockIteratorPoolsMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockIteratorPools)(nil).ID)) +} + +// TagEncoder mocks base method +func (m *MockIteratorPools) TagEncoder() serialize.TagEncoderPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagEncoder") + ret0, _ := ret[0].(serialize.TagEncoderPool) + return ret0 +} + +// TagEncoder indicates an expected call of TagEncoder +func (mr *MockIteratorPoolsMockRecorder) TagEncoder() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagEncoder", reflect.TypeOf((*MockIteratorPools)(nil).TagEncoder)) +} + +// TagDecoder mocks base method +func (m *MockIteratorPools) TagDecoder() serialize.TagDecoderPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagDecoder") + ret0, _ := ret[0].(serialize.TagDecoderPool) + return ret0 +} + +// TagDecoder indicates an expected call of TagDecoder +func (mr *MockIteratorPoolsMockRecorder) TagDecoder() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagDecoder", reflect.TypeOf((*MockIteratorPools)(nil).TagDecoder)) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/istream.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/istream.go new file mode 100644 index 00000000..f4eeba54 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/istream.go @@ -0,0 +1,189 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "bufio" + "io" + "math" +) + +// istream encapsulates a readable stream. +type istream struct { + r *bufio.Reader // encoded stream + err error // error encountered + current byte // current byte we are working off of + buffer []byte // buffer for reading in multiple bytes + remaining uint // bits remaining in current to be read +} + +// NewIStream creates a new Istream +func NewIStream(reader io.Reader, bufioSize int) IStream { + return &istream{ + r: bufio.NewReaderSize(reader, bufioSize), + // Buffer meant to hold uint64 size of bytes. + buffer: make([]byte, 8), + } +} + +func (is *istream) ReadBit() (Bit, error) { + if is.err != nil { + return 0, is.err + } + if is.remaining == 0 { + if err := is.readByteFromStream(); err != nil { + return 0, err + } + } + return Bit(is.consumeBuffer(1)), nil +} + +func (is *istream) Read(b []byte) (int, error) { + if is.remaining == 0 { + // Optimized path for when the iterator is already aligned on a byte boundary. Avoids + // all the bit manipulation and ReadByte() function calls. + // Use ReadFull because the bufferedReader may not return the requested number of bytes. + return io.ReadFull(is.r, b) + } + + var ( + i int + err error + ) + + for ; i < len(b); i++ { + b[i], err = is.ReadByte() + if err != nil { + return i, err + } + } + return i, nil +} + +func (is *istream) ReadByte() (byte, error) { + if is.err != nil { + return 0, is.err + } + remaining := is.remaining + res := is.consumeBuffer(remaining) + if remaining == 8 { + return res, nil + } + if err := is.readByteFromStream(); err != nil { + return 0, err + } + res = (res << uint(8-remaining)) | is.consumeBuffer(8-remaining) + return res, nil +} + +func (is *istream) ReadBits(numBits uint) (uint64, error) { + if is.err != nil { + return 0, is.err + } + var res uint64 + numBytes := numBits / 8 + if numBytes > 0 { + // Use Read call rather than individual ReadByte calls since it has + // optimized path for when the iterator is aligned on a byte boundary. + bytes := is.buffer[0:numBytes] + _, err := is.Read(bytes) + if err != nil { + return 0, err + } + for _, b := range bytes { + res = (res << 8) | uint64(b) + } + } + + numBits = numBits % 8 + for numBits > 0 { + // This is equivalent to calling is.ReadBit() in a loop but some manual inlining + // has been performed to optimize this loop as its heavily used in the hot path. + if is.remaining == 0 { + if err := is.readByteFromStream(); err != nil { + return 0, err + } + } + + numToRead := numBits + if is.remaining < numToRead { + numToRead = is.remaining + } + bits := is.current >> (8 - numToRead) + is.current <<= numToRead + is.remaining -= numToRead + res = (res << uint64(numToRead)) | uint64(bits) + numBits -= numToRead + } + return res, nil +} + +func (is *istream) PeekBits(numBits uint) (uint64, error) { + // check the last byte first + if numBits <= is.remaining { + return uint64(readBitsInByte(is.current, numBits)), nil + } + // now check the bytes buffered and read more if necessary. + numBitsRead := is.remaining + res := uint64(readBitsInByte(is.current, is.remaining)) + numBytesToRead := int(math.Ceil(float64(numBits-numBitsRead) / 8)) + bytesRead, err := is.r.Peek(numBytesToRead) + if err != nil { + return 0, err + } + for i := 0; i < numBytesToRead-1; i++ { + res = (res << 8) | uint64(bytesRead[i]) + numBitsRead += 8 + } + remainder := readBitsInByte(bytesRead[numBytesToRead-1], numBits-numBitsRead) + res = (res << (numBits - numBitsRead)) | uint64(remainder) + return res, nil +} + +func (is *istream) RemainingBitsInCurrentByte() uint { + return is.remaining +} + +// readBitsInByte reads numBits in byte b. +func readBitsInByte(b byte, numBits uint) byte { + return b >> (8 - numBits) +} + +// consumeBuffer consumes numBits in is.current. +func (is *istream) consumeBuffer(numBits uint) byte { + res := readBitsInByte(is.current, numBits) + is.current <<= numBits + is.remaining -= numBits + return res +} + +func (is *istream) readByteFromStream() error { + is.current, is.err = is.r.ReadByte() + is.remaining = 8 + return is.err +} + +func (is *istream) Reset(r io.Reader) { + is.r.Reset(r) + is.err = nil + is.current = 0 + is.remaining = 0 +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/iterator_pool.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/iterator_pool.go new file mode 100644 index 00000000..1a8029f3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/iterator_pool.go @@ -0,0 +1,71 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "github.com/m3db/m3/src/x/pool" +) + +type readerIteratorPool struct { + pool pool.ObjectPool +} + +// NewReaderIteratorPool creates a new pool for ReaderIterators. +func NewReaderIteratorPool(opts pool.ObjectPoolOptions) ReaderIteratorPool { + return &readerIteratorPool{pool: pool.NewObjectPool(opts)} +} + +func (p *readerIteratorPool) Init(alloc ReaderIteratorAllocate) { + p.pool.Init(func() interface{} { + return alloc(nil, nil) + }) +} + +func (p *readerIteratorPool) Get() ReaderIterator { + return p.pool.Get().(ReaderIterator) +} + +func (p *readerIteratorPool) Put(iter ReaderIterator) { + p.pool.Put(iter) +} + +type multiReaderIteratorPool struct { + pool pool.ObjectPool +} + +// NewMultiReaderIteratorPool creates a new pool for MultiReaderIterators. +func NewMultiReaderIteratorPool(opts pool.ObjectPoolOptions) MultiReaderIteratorPool { + return &multiReaderIteratorPool{pool: pool.NewObjectPool(opts)} +} + +func (p *multiReaderIteratorPool) Init(alloc ReaderIteratorAllocate) { + p.pool.Init(func() interface{} { + return NewMultiReaderIterator(alloc, p) + }) +} + +func (p *multiReaderIteratorPool) Get() MultiReaderIterator { + return p.pool.Get().(MultiReaderIterator) +} + +func (p *multiReaderIteratorPool) Put(iter MultiReaderIterator) { + p.pool.Put(iter) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/iterators.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/iterators.go new file mode 100644 index 00000000..7377794e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/iterators.go @@ -0,0 +1,244 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "math" + "sort" + + "github.com/m3db/m3/src/dbnode/ts" + xtime "github.com/m3db/m3/src/x/time" +) + +var ( + // UnixNano is an int64, so the max time is the max of that type. + timeMaxNanos = xtime.UnixNano(math.MaxInt64) +) + +// iterators is a collection of iterators, and allows for reading in order values +// from the underlying iterators that are separately in order themselves. +type iterators struct { + values []Iterator + earliest []Iterator + earliestAt xtime.UnixNano + filterStart xtime.UnixNano + filterEnd xtime.UnixNano + filtering bool + equalTimesStrategy IterateEqualTimestampStrategy + + // Used for caching reuse of value frequency lookup + valueFrequencies map[float64]int +} + +func (i *iterators) len() int { + return len(i.values) +} + +func (i *iterators) current() (ts.Datapoint, xtime.Unit, ts.Annotation) { + numIters := len(i.earliest) + + switch i.equalTimesStrategy { + case IterateHighestValue: + sort.Slice(i.earliest, func(a, b int) bool { + currA, _, _ := i.earliest[a].Current() + currB, _, _ := i.earliest[b].Current() + return currA.Value < currB.Value + }) + + case IterateLowestValue: + sort.Slice(i.earliest, func(a, b int) bool { + currA, _, _ := i.earliest[a].Current() + currB, _, _ := i.earliest[b].Current() + return currA.Value > currB.Value + }) + + case IterateHighestFrequencyValue: + // Calculate frequencies + if i.valueFrequencies == nil { + i.valueFrequencies = make(map[float64]int) + } + for _, iter := range i.earliest { + curr, _, _ := iter.Current() + i.valueFrequencies[curr.Value]++ + } + + // Sort + sort.Slice(i.earliest, func(a, b int) bool { + currA, _, _ := i.earliest[a].Current() + currB, _, _ := i.earliest[b].Current() + freqA := i.valueFrequencies[currA.Value] + freqB := i.valueFrequencies[currB.Value] + return freqA < freqB + }) + + // Reset reuseable value frequencies + for key := range i.valueFrequencies { + delete(i.valueFrequencies, key) + } + + default: + // IterateLastPushed or unknown strategy code path, don't panic on unknown + // as this is an internal data structure and this option is validated at a + // layer above. + } + + return i.earliest[numIters-1].Current() +} + +func (i *iterators) at() xtime.UnixNano { + return i.earliestAt +} + +func (i *iterators) push(iter Iterator) bool { + if i.filtering && !i.moveIteratorToFilterNext(iter) { + return false + } + i.values = append(i.values, iter) + i.tryAddEarliest(iter) + return true +} + +func (i *iterators) tryAddEarliest(iter Iterator) { + dp, _, _ := iter.Current() + if dp.TimestampNanos == i.earliestAt { + // Push equal earliest + i.earliest = append(i.earliest, iter) + } else if dp.TimestampNanos < i.earliestAt { + // Reset earliest and push new iter + i.earliest = append(i.earliest[:0], iter) + i.earliestAt = dp.TimestampNanos + } +} + +func (i *iterators) moveIteratorToFilterNext(iter Iterator) bool { + next := true + for next { + dp, _, _ := iter.Current() + if dp.TimestampNanos < i.filterStart { + // Filter out any before start + next = iter.Next() + continue + } + if dp.TimestampNanos >= i.filterEnd { + // Filter out completely if after end + next = false + break + } + // Within filter + break + } + return next +} + +func (i *iterators) moveToValidNext() (bool, error) { + var ( + prevAt = i.earliestAt + n = len(i.values) + ) + for _, iter := range i.earliest { + next := iter.Next() + if next && i.filtering { + // Filter out values if applying filters + next = i.moveIteratorToFilterNext(iter) + } + + err := iter.Err() + if err != nil { + i.reset() + return false, err + } + + if next { + continue + } + + // No next so swap tail in and shrink by one + iter.Close() + idx := -1 + for i, curr := range i.values { + if curr == iter { + idx = i + break + } + } + i.values[idx] = i.values[n-1] + i.values[n-1] = nil + i.values = i.values[:n-1] + n = n - 1 + } + + // Reset earliest + for idx := range i.earliest { + i.earliest[idx] = nil + } + i.earliest = i.earliest[:0] + + // No iterators left + if n == 0 { + i.reset() + return false, nil + } + + // Force first to be new earliest, evaluate rest + i.earliestAt = timeMaxNanos + for _, iter := range i.values { + i.tryAddEarliest(iter) + } + + // Apply filter to new earliest if necessary + if i.filtering { + inFilter := i.earliestAt < i.filterEnd && + i.earliestAt >= i.filterStart + if !inFilter { + return i.moveToValidNext() + } + } + + return i.validateNext(true, prevAt) +} + +func (i *iterators) validateNext(next bool, prevAt xtime.UnixNano) (bool, error) { + if i.earliestAt < prevAt { + // Out of order datapoint + i.reset() + return false, errOutOfOrderIterator + } + return next, nil +} + +func (i *iterators) reset() { + for idx := range i.values { + i.values[idx].Close() + i.values[idx] = nil + } + i.values = i.values[:0] + for idx := range i.earliest { + i.earliest[idx] = nil + } + i.earliest = i.earliest[:0] + i.earliestAt = timeMaxNanos +} + +func (i *iterators) setFilter(start, end xtime.UnixNano) { + i.filtering = true + i.filterStart = start + i.filterEnd = end +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/iterators_types.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/iterators_types.go new file mode 100644 index 00000000..304739df --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/iterators_types.go @@ -0,0 +1,124 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "errors" + "fmt" +) + +var ( + errIterateEqualTimestampStrategyNotSpecified = errors.New("iterate equal timestamp strategy not specified") +) + +// IterateEqualTimestampStrategy describes the strategy of which value to +// select when values with equal timestamps appear in the list of iterators. +type IterateEqualTimestampStrategy uint8 + +const ( + // IterateLastPushed is useful for within a single replica, using the last + // immutable buffer that was created to decide which value to choose. It is + // important to order the buffers passed to the construction of the iterators + // in the correct order to achieve the desired outcome. + IterateLastPushed IterateEqualTimestampStrategy = iota + // IterateHighestValue is useful across replicas when you just want to choose + // the highest value every time. + IterateHighestValue + // IterateLowestValue is useful across replicas when you just want to choose + // the lowest value every time. + IterateLowestValue + // IterateHighestFrequencyValue is useful across replicas when you want to + // choose the most common appearing value, however you can only use this + // reliably if you wait for values from all replicas to be retrieved, i.e. + // you cannot use this reliably with quorum/majority consistency. + IterateHighestFrequencyValue + + // DefaultIterateEqualTimestampStrategy is the default iterate + // equal timestamp strategy. + DefaultIterateEqualTimestampStrategy = IterateLastPushed +) + +var ( + validIterateEqualTimestampStrategies = []IterateEqualTimestampStrategy{ + IterateLastPushed, + IterateHighestValue, + IterateLowestValue, + IterateHighestFrequencyValue, + } +) + +// ValidIterateEqualTimestampStrategies returns the valid iterate +// equal timestamp strategies. +func ValidIterateEqualTimestampStrategies() []IterateEqualTimestampStrategy { + // Return a copy here so callers cannot mutate the known list. + src := validIterateEqualTimestampStrategies + result := make([]IterateEqualTimestampStrategy, len(src)) + copy(result, src) + return result +} + +func (s IterateEqualTimestampStrategy) String() string { + switch s { + case IterateLastPushed: + return "iterate_last_pushed" + case IterateHighestValue: + return "iterate_highest_value" + case IterateLowestValue: + return "iterate_lowest_value" + case IterateHighestFrequencyValue: + return "iterate_highest_frequency_value" + } + return "unknown" +} + +// ParseIterateEqualTimestampStrategy parses a IterateEqualTimestampStrategy +// from a string. +func ParseIterateEqualTimestampStrategy( + str string, +) (IterateEqualTimestampStrategy, error) { + var r IterateEqualTimestampStrategy + if str == "" { + return r, errIterateEqualTimestampStrategyNotSpecified + } + for _, valid := range ValidIterateEqualTimestampStrategies() { + if str == valid.String() { + r = valid + return r, nil + } + } + return r, fmt.Errorf("invalid IterateEqualTimestampStrategy '%s' valid types are: %v", + str, ValidIterateEqualTimestampStrategies()) +} + +// UnmarshalYAML unmarshals an IterateEqualTimestampStrategy into a +// valid type from string. +func (s *IterateEqualTimestampStrategy) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + r, err := ParseIterateEqualTimestampStrategy(str) + if err != nil { + return err + } + *s = r + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/decoder.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/decoder.go new file mode 100644 index 00000000..e29812dc --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/decoder.go @@ -0,0 +1,45 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3tsz + +import ( + "io" + + "github.com/m3db/m3/src/dbnode/encoding" +) + +type decoder struct { + opts encoding.Options + intOptimized bool +} + +// NewDecoder creates a decoder. +func NewDecoder(intOptimized bool, opts encoding.Options) encoding.Decoder { + if opts == nil { + opts = encoding.NewOptions() + } + return &decoder{opts: opts, intOptimized: intOptimized} +} + +// Decode decodes the encoded data captured by the reader. +func (dec *decoder) Decode(reader io.Reader) encoding.ReaderIterator { + return NewReaderIterator(reader, dec.intOptimized, dec.opts) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/encoder.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/encoder.go new file mode 100644 index 00000000..1389eea3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/encoder.go @@ -0,0 +1,445 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3tsz + +import ( + "errors" + "math" + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/context" + xtime "github.com/m3db/m3/src/x/time" +) + +var ( + errEncoderClosed = errors.New("encoder is closed") + errNoEncodedDatapoints = errors.New("encoder has no encoded datapoints") +) + +// encoder is an M3TSZ encoder that can encode a stream of data in M3TSZ format. +type encoder struct { + os encoding.OStream + opts encoding.Options + + // internal bookkeeping + tsEncoderState TimestampEncoder + floatEnc FloatEncoderAndIterator + sigTracker IntSigBitsTracker + + ant ts.Annotation // current annotation + + intVal float64 // current int val + numEncoded uint32 // whether any datapoints have been written yet + maxMult uint8 // current max multiplier for int vals + + intOptimized bool // whether the encoding scheme is optimized for ints + isFloat bool // whether we are encoding ints/floats + closed bool +} + +// NewEncoder creates a new encoder. +func NewEncoder( + start time.Time, + bytes checked.Bytes, + intOptimized bool, + opts encoding.Options, +) encoding.Encoder { + if opts == nil { + opts = encoding.NewOptions() + } + // NB(r): only perform an initial allocation if there is no pool that + // will be used for this encoder. If a pool is being used alloc when the + // `Reset` method is called. + initAllocIfEmpty := opts.EncoderPool() == nil + return &encoder{ + os: encoding.NewOStream(bytes, initAllocIfEmpty, opts.BytesPool()), + opts: opts, + tsEncoderState: NewTimestampEncoder(start, opts.DefaultTimeUnit(), opts), + closed: false, + intOptimized: intOptimized, + } +} + +func (enc *encoder) SetSchema(descr namespace.SchemaDescr) {} + +// Encode encodes the timestamp and the value of a datapoint. +func (enc *encoder) Encode(dp ts.Datapoint, tu xtime.Unit, ant ts.Annotation) error { + if enc.closed { + return errEncoderClosed + } + + err := enc.tsEncoderState.WriteTime(enc.os, dp.Timestamp, ant, tu) + if err != nil { + return err + } + + if enc.numEncoded == 0 { + err = enc.writeFirstValue(dp.Value) + } else { + err = enc.writeNextValue(dp.Value) + } + if err == nil { + enc.numEncoded++ + } + + return err +} + +func (enc *encoder) writeFirstValue(v float64) error { + if !enc.intOptimized { + enc.floatEnc.writeFullFloat(enc.os, math.Float64bits(v)) + return nil + } + + // Attempt to convert float to int for int optimization + val, mult, isFloat, err := convertToIntFloat(v, 0) + if err != nil { + return err + } + + if isFloat { + enc.os.WriteBit(opcodeFloatMode) + enc.floatEnc.writeFullFloat(enc.os, math.Float64bits(v)) + enc.isFloat = true + enc.maxMult = mult + return nil + } + + // val can be converted to int + enc.os.WriteBit(opcodeIntMode) + enc.intVal = val + negDiff := true + if val < 0 { + negDiff = false + val = -1 * val + } + + valBits := uint64(int64(val)) + numSig := encoding.NumSig(valBits) + enc.writeIntSigMult(numSig, mult, false) + enc.sigTracker.WriteIntValDiff(enc.os, valBits, negDiff) + return nil +} + +func (enc *encoder) writeNextValue(v float64) error { + if !enc.intOptimized { + enc.floatEnc.writeNextFloat(enc.os, math.Float64bits(v)) + return nil + } + + // Attempt to convert float to int for int optimization + val, mult, isFloat, err := convertToIntFloat(v, enc.maxMult) + if err != nil { + return err + } + + var valDiff float64 + if !isFloat { + valDiff = enc.intVal - val + } + + if isFloat || valDiff >= maxInt || valDiff <= minInt { + enc.writeFloatVal(math.Float64bits(val), mult) + return nil + } + + enc.writeIntVal(val, mult, isFloat, valDiff) + return nil +} + +// writeFloatVal writes the value as XOR of the +// bits that represent the float +func (enc *encoder) writeFloatVal(val uint64, mult uint8) { + if !enc.isFloat { + // Converting from int to float + enc.os.WriteBit(opcodeUpdate) + enc.os.WriteBit(opcodeNoRepeat) + enc.os.WriteBit(opcodeFloatMode) + enc.floatEnc.writeFullFloat(enc.os, val) + enc.isFloat = true + enc.maxMult = mult + return + } + + if val == enc.floatEnc.PrevFloatBits { + // Value is repeated + enc.os.WriteBit(opcodeUpdate) + enc.os.WriteBit(opcodeRepeat) + return + } + + enc.os.WriteBit(opcodeNoUpdate) + enc.floatEnc.writeNextFloat(enc.os, val) +} + +// writeIntVal writes the val as a diff of ints +func (enc *encoder) writeIntVal(val float64, mult uint8, isFloat bool, valDiff float64) { + if valDiff == 0 && isFloat == enc.isFloat && mult == enc.maxMult { + // Value is repeated + enc.os.WriteBit(opcodeUpdate) + enc.os.WriteBit(opcodeRepeat) + return + } + + neg := false + if valDiff < 0 { + neg = true + valDiff = -1 * valDiff + } + + valDiffBits := uint64(int64(valDiff)) + numSig := encoding.NumSig(valDiffBits) + newSig := enc.sigTracker.TrackNewSig(numSig) + isFloatChanged := isFloat != enc.isFloat + if mult > enc.maxMult || enc.sigTracker.NumSig != newSig || isFloatChanged { + enc.os.WriteBit(opcodeUpdate) + enc.os.WriteBit(opcodeNoRepeat) + enc.os.WriteBit(opcodeIntMode) + enc.writeIntSigMult(newSig, mult, isFloatChanged) + enc.sigTracker.WriteIntValDiff(enc.os, valDiffBits, neg) + enc.isFloat = false + } else { + enc.os.WriteBit(opcodeNoUpdate) + enc.sigTracker.WriteIntValDiff(enc.os, valDiffBits, neg) + } + + enc.intVal = val +} + +// writeIntSigMult writes the number of significant +// bits of the diff and the multiplier if they have changed +func (enc *encoder) writeIntSigMult(sig, mult uint8, floatChanged bool) { + enc.sigTracker.WriteIntSig(enc.os, sig) + + if mult > enc.maxMult { + enc.os.WriteBit(opcodeUpdateMult) + enc.os.WriteBits(uint64(mult), numMultBits) + enc.maxMult = mult + } else if enc.sigTracker.NumSig == sig && enc.maxMult == mult && floatChanged { + // If only the float mode has changed, update the Mult regardless + // so that we can support the annotation peek + enc.os.WriteBit(opcodeUpdateMult) + enc.os.WriteBits(uint64(enc.maxMult), numMultBits) + } else { + enc.os.WriteBit(opcodeNoUpdateMult) + } +} + +func (enc *encoder) newBuffer(capacity int) checked.Bytes { + if bytesPool := enc.opts.BytesPool(); bytesPool != nil { + return bytesPool.Get(capacity) + } + return checked.NewBytes(make([]byte, 0, capacity), nil) +} + +// Reset resets the encoder for reuse. +func (enc *encoder) Reset(start time.Time, capacity int, schema namespace.SchemaDescr) { + enc.reset(start, enc.newBuffer(capacity)) +} + +func (enc *encoder) reset(start time.Time, bytes checked.Bytes) { + enc.os.Reset(bytes) + + timeUnit := initialTimeUnit(xtime.ToUnixNano(start), enc.opts.DefaultTimeUnit()) + enc.tsEncoderState = NewTimestampEncoder(start, timeUnit, enc.opts) + + enc.floatEnc = FloatEncoderAndIterator{} + enc.intVal = 0 + enc.isFloat = false + enc.maxMult = 0 + enc.sigTracker = IntSigBitsTracker{} + enc.ant = nil + enc.numEncoded = 0 + enc.closed = false +} + +// Stream returns a copy of the underlying data stream. +func (enc *encoder) Stream(ctx context.Context) (xio.SegmentReader, bool) { + segment := enc.segmentZeroCopy(ctx) + if segment.Len() == 0 { + return nil, false + } + + if readerPool := enc.opts.SegmentReaderPool(); readerPool != nil { + reader := readerPool.Get() + reader.Reset(segment) + return reader, true + } + return xio.NewSegmentReader(segment), true +} + +// NumEncoded returns the number of encoded datapoints. +func (enc *encoder) NumEncoded() int { + return int(enc.numEncoded) +} + +// LastEncoded returns the last encoded datapoint. +func (enc *encoder) LastEncoded() (ts.Datapoint, error) { + if enc.numEncoded == 0 { + return ts.Datapoint{}, errNoEncodedDatapoints + } + + result := ts.Datapoint{ + Timestamp: enc.tsEncoderState.PrevTime, + TimestampNanos: xtime.ToUnixNano(enc.tsEncoderState.PrevTime), + } + if enc.isFloat { + result.Value = math.Float64frombits(enc.floatEnc.PrevFloatBits) + } else { + result.Value = enc.intVal + } + return result, nil +} + +// LastAnnotation returns the last encoded annotation. +func (enc *encoder) LastAnnotation() (ts.Annotation, error) { + if enc.numEncoded == 0 { + return nil, errNoEncodedDatapoints + } + + return enc.tsEncoderState.PrevAnnotation, nil +} + +// Len returns the length of the final data stream that would be generated +// by a call to Stream(). +func (enc *encoder) Len() int { + raw, pos := enc.os.RawBytes() + if len(raw) == 0 { + return 0 + } + + // Calculate how long the stream would be once it was "capped" with a tail. + var ( + lastIdx = len(raw) - 1 + lastByte = raw[lastIdx] + scheme = enc.opts.MarkerEncodingScheme() + tail = scheme.Tail(lastByte, pos) + ) + tail.IncRef() + tailLen := tail.Len() + tail.DecRef() + + return len(raw[:lastIdx]) + tailLen +} + +// Close closes the encoder. +func (enc *encoder) Close() { + if enc.closed { + return + } + + enc.closed = true + + // Ensure to free ref to ostream bytes + enc.os.Reset(nil) + + if pool := enc.opts.EncoderPool(); pool != nil { + pool.Put(enc) + } +} + +// Discard closes the encoder and transfers ownership of the data stream to +// the caller. +func (enc *encoder) Discard() ts.Segment { + segment := enc.segmentTakeOwnership() + + // Close the encoder no longer needed + enc.Close() + + return segment +} + +// DiscardReset does the same thing as Discard except it does not close the encoder but resets it for reuse. +func (enc *encoder) DiscardReset(start time.Time, capacity int, descr namespace.SchemaDescr) ts.Segment { + segment := enc.segmentTakeOwnership() + enc.Reset(start, capacity, descr) + return segment +} + +func (enc *encoder) segmentZeroCopy(ctx context.Context) ts.Segment { + length := enc.os.Len() + if length == 0 { + return ts.Segment{} + } + + // We need a multibyte tail to capture an immutable snapshot + // of the encoder data. + rawBuffer, pos := enc.os.RawBytes() + lastByte := rawBuffer[length-1] + + // Take ref up to last byte. + headBytes := rawBuffer[:length-1] + + // Zero copy from the output stream. + var head checked.Bytes + if pool := enc.opts.CheckedBytesWrapperPool(); pool != nil { + head = pool.Get(headBytes) + } else { + head = checked.NewBytes(headBytes, nil) + } + + // Make sure the ostream bytes ref is delayed from finalizing + // until this operation is complete (since this is zero copy). + buffer, _ := enc.os.CheckedBytes() + ctx.RegisterCloser(buffer.DelayFinalizer()) + + // Take a shared ref to a known good tail. + scheme := enc.opts.MarkerEncodingScheme() + tail := scheme.Tail(lastByte, pos) + + // NB(r): Finalize the head bytes whether this is by ref or copy. If by + // ref we have no ref to it anymore and if by copy then the owner should + // be finalizing the bytes when the segment is finalized. + return ts.NewSegment(head, tail, 0, ts.FinalizeHead) +} + +func (enc *encoder) segmentTakeOwnership() ts.Segment { + length := enc.os.Len() + if length == 0 { + return ts.Segment{} + } + + // We need a multibyte tail since the tail isn't set correctly midstream. + rawBuffer, pos := enc.os.RawBytes() + lastByte := rawBuffer[length-1] + + // Take ref from the ostream. + head := enc.os.Discard() + + // Resize to crop out last byte. + head.IncRef() + head.Resize(length - 1) + head.DecRef() + + // Take a shared ref to a known good tail. + scheme := enc.opts.MarkerEncodingScheme() + tail := scheme.Tail(lastByte, pos) + + // NB(r): Finalize the head bytes whether this is by ref or copy. If by + // ref we have no ref to it anymore and if by copy then the owner should + // be finalizing the bytes when the segment is finalized. + return ts.NewSegment(head, tail, 0, ts.FinalizeHead) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/float_encoder_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/float_encoder_iterator.go new file mode 100644 index 00000000..b27f959a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/float_encoder_iterator.go @@ -0,0 +1,166 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3tsz + +import ( + "math" + + "github.com/m3db/m3/src/dbnode/encoding" +) + +const ( + bits12To6Mask = 4032 // 1111 1100 0000 + bits6To0Mask = 63 // 0011 1111 +) + +// FloatEncoderAndIterator encapsulates the state required for a logical stream of bits +// that represent a stream of float values compressed with XOR. +type FloatEncoderAndIterator struct { + PrevXOR uint64 + PrevFloatBits uint64 + + // Only taken into account if using the WriteFloat() and ReadFloat() + // APIs. + NotFirst bool +} + +// WriteFloat writes a float into the stream, writing the full value or a compressed +// XOR as appropriate. +func (eit *FloatEncoderAndIterator) WriteFloat(stream encoding.OStream, val float64) { + fb := math.Float64bits(val) + if eit.NotFirst { + eit.writeNextFloat(stream, fb) + } else { + eit.writeFullFloat(stream, fb) + eit.NotFirst = true + } +} + +// ReadFloat reads a compressed float from the stream. +func (eit *FloatEncoderAndIterator) ReadFloat(stream encoding.IStream) error { + if eit.NotFirst { + return eit.readNextFloat(stream) + } + + err := eit.readFullFloat(stream) + eit.NotFirst = true + return err + +} + +func (eit *FloatEncoderAndIterator) writeFullFloat(stream encoding.OStream, val uint64) { + eit.PrevFloatBits = val + eit.PrevXOR = val + stream.WriteBits(val, 64) +} + +func (eit *FloatEncoderAndIterator) writeNextFloat(stream encoding.OStream, val uint64) { + xor := eit.PrevFloatBits ^ val + eit.writeXOR(stream, xor) + eit.PrevXOR = xor + eit.PrevFloatBits = val +} + +func (eit *FloatEncoderAndIterator) writeXOR(stream encoding.OStream, currXOR uint64) { + if currXOR == 0 { + stream.WriteBits(opcodeZeroValueXOR, 1) + return + } + + // NB(xichen): can be further optimized by keeping track of leading and trailing zeros in eit. + prevLeading, prevTrailing := encoding.LeadingAndTrailingZeros(eit.PrevXOR) + curLeading, curTrailing := encoding.LeadingAndTrailingZeros(currXOR) + if curLeading >= prevLeading && curTrailing >= prevTrailing { + stream.WriteBits(opcodeContainedValueXOR, 2) + stream.WriteBits(currXOR>>uint(prevTrailing), 64-prevLeading-prevTrailing) + return + } + + stream.WriteBits(opcodeUncontainedValueXOR, 2) + stream.WriteBits(uint64(curLeading), 6) + numMeaningfulBits := 64 - curLeading - curTrailing + // numMeaningfulBits is at least 1, so we can subtract 1 from it and encode it in 6 bits + stream.WriteBits(uint64(numMeaningfulBits-1), 6) + stream.WriteBits(currXOR>>uint(curTrailing), numMeaningfulBits) +} + +func (eit *FloatEncoderAndIterator) readFullFloat(stream encoding.IStream) error { + vb, err := stream.ReadBits(64) + if err != nil { + return err + } + + eit.PrevFloatBits = vb + eit.PrevXOR = vb + + return nil +} + +func (eit *FloatEncoderAndIterator) readNextFloat(stream encoding.IStream) error { + cb, err := stream.ReadBits(1) + if err != nil { + return err + } + + if cb == opcodeZeroValueXOR { + eit.PrevXOR = 0 + eit.PrevFloatBits ^= eit.PrevXOR + return nil + } + + nextCB, err := stream.ReadBits(1) + if err != nil { + return err + } + + cb = (cb << 1) | nextCB + if cb == opcodeContainedValueXOR { + previousLeading, previousTrailing := encoding.LeadingAndTrailingZeros(eit.PrevXOR) + numMeaningfulBits := uint(64 - previousLeading - previousTrailing) + meaningfulBits, err := stream.ReadBits(numMeaningfulBits) + if err != nil { + return err + } + + eit.PrevXOR = meaningfulBits << uint(previousTrailing) + eit.PrevFloatBits ^= eit.PrevXOR + return nil + } + + numLeadingZeroesAndNumMeaningfulBits, err := stream.ReadBits(12) + if err != nil { + return err + } + + numLeadingZeros := (numLeadingZeroesAndNumMeaningfulBits & bits12To6Mask) >> 6 + numMeaningfulBits := (numLeadingZeroesAndNumMeaningfulBits & bits6To0Mask) + 1 + + meaningfulBits, err := stream.ReadBits(uint(numMeaningfulBits)) + if err != nil { + return err + } + + numTrailingZeros := 64 - numLeadingZeros - numMeaningfulBits + + eit.PrevXOR = meaningfulBits << uint(numTrailingZeros) + eit.PrevFloatBits ^= eit.PrevXOR + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/int_sig_bits_tracker.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/int_sig_bits_tracker.go new file mode 100644 index 00000000..eace8775 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/int_sig_bits_tracker.go @@ -0,0 +1,91 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3tsz + +import "github.com/m3db/m3/src/dbnode/encoding" + +// IntSigBitsTracker is used to track the number of significant bits +// which should be used to encode the delta between two integers. +type IntSigBitsTracker struct { + NumSig uint8 // current largest number of significant places for int diffs + CurHighestLowerSig uint8 + NumLowerSig uint8 +} + +// WriteIntValDiff writes the provided val diff bits along with +// whether the bits are negative or not. +func (t *IntSigBitsTracker) WriteIntValDiff( + stream encoding.OStream, valBits uint64, neg bool) { + if neg { + stream.WriteBit(opcodeNegative) + } else { + stream.WriteBit(opcodePositive) + } + + stream.WriteBits(valBits, int(t.NumSig)) +} + +// WriteIntSig writes the number of significant bits of the diff if it has changed and +// updates the IntSigBitsTracker. +func (t *IntSigBitsTracker) WriteIntSig(stream encoding.OStream, sig uint8) { + if t.NumSig != sig { + stream.WriteBit(opcodeUpdateSig) + if sig == 0 { + stream.WriteBit(OpcodeZeroSig) + } else { + stream.WriteBit(OpcodeNonZeroSig) + stream.WriteBits(uint64(sig-1), NumSigBits) + } + } else { + stream.WriteBit(opcodeNoUpdateSig) + } + + t.NumSig = sig +} + +// TrackNewSig gets the new number of significant bits given the +// number of significant bits of the current diff. It takes into +// account thresholds to try and find a value that's best for the +// current data +func (t *IntSigBitsTracker) TrackNewSig(numSig uint8) uint8 { + newSig := t.NumSig + + if numSig > t.NumSig { + newSig = numSig + } else if t.NumSig-numSig >= sigDiffThreshold { + if t.NumLowerSig == 0 { + t.CurHighestLowerSig = numSig + } else if numSig > t.CurHighestLowerSig { + t.CurHighestLowerSig = numSig + } + + t.NumLowerSig++ + if t.NumLowerSig >= sigRepeatThreshold { + newSig = t.CurHighestLowerSig + t.NumLowerSig = 0 + } + + } else { + t.NumLowerSig = 0 + } + + return newSig +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/iterator.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/iterator.go new file mode 100644 index 00000000..b2f7e69f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/iterator.go @@ -0,0 +1,243 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3tsz + +import ( + "io" + "math" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + xtime "github.com/m3db/m3/src/x/time" +) + +// readerIterator provides an interface for clients to incrementally +// read datapoints off of an encoded stream. +type readerIterator struct { + is encoding.IStream + opts encoding.Options + + err error // current error + intVal float64 // current int value + tsIterator TimestampIterator + floatIter FloatEncoderAndIterator + + mult uint8 // current int multiplier + sig uint8 // current number of significant bits for int diff + + intOptimized bool // whether encoding scheme is optimized for ints + isFloat bool // whether encoding is in int or float + + closed bool +} + +// NewReaderIterator returns a new iterator for a given reader +func NewReaderIterator(reader io.Reader, intOptimized bool, opts encoding.Options) encoding.ReaderIterator { + return &readerIterator{ + is: encoding.NewIStream(reader, opts.IStreamReaderSizeM3TSZ()), + opts: opts, + tsIterator: NewTimestampIterator(opts, false), + intOptimized: intOptimized, + } +} + +// Next moves to the next item +func (it *readerIterator) Next() bool { + if !it.hasNext() { + return false + } + + first, done, err := it.tsIterator.ReadTimestamp(it.is) + if err != nil || done { + it.err = err + return false + } + + it.readValue(first) + + return it.hasNext() +} + +func (it *readerIterator) readValue(first bool) { + if first { + it.readFirstValue() + } else { + it.readNextValue() + } +} + +func (it *readerIterator) readFirstValue() { + if !it.intOptimized { + if err := it.floatIter.readFullFloat(it.is); err != nil { + it.err = err + } + return + } + + if it.readBits(1) == opcodeFloatMode { + if err := it.floatIter.readFullFloat(it.is); err != nil { + it.err = err + } + it.isFloat = true + return + } + + it.readIntSigMult() + it.readIntValDiff() +} + +func (it *readerIterator) readNextValue() { + if !it.intOptimized { + if err := it.floatIter.readNextFloat(it.is); err != nil { + it.err = err + } + return + } + + if it.readBits(1) == opcodeUpdate { + if it.readBits(1) == opcodeRepeat { + return + } + + if it.readBits(1) == opcodeFloatMode { + // Change to floatVal + if err := it.floatIter.readFullFloat(it.is); err != nil { + it.err = err + } + it.isFloat = true + return + } + + it.readIntSigMult() + it.readIntValDiff() + it.isFloat = false + return + } + + if it.isFloat { + if err := it.floatIter.readNextFloat(it.is); err != nil { + it.err = err + } + } else { + it.readIntValDiff() + } +} + +func (it *readerIterator) readIntSigMult() { + if it.readBits(1) == opcodeUpdateSig { + if it.readBits(1) == OpcodeZeroSig { + it.sig = 0 + } else { + it.sig = uint8(it.readBits(NumSigBits)) + 1 + } + } + + if it.readBits(1) == opcodeUpdateMult { + it.mult = uint8(it.readBits(numMultBits)) + if it.mult > maxMult { + it.err = errInvalidMultiplier + } + } +} + +func (it *readerIterator) readIntValDiff() { + sign := -1.0 + if it.readBits(1) == opcodeNegative { + sign = 1.0 + } + + it.intVal += sign * float64(it.readBits(uint(it.sig))) +} + +func (it *readerIterator) readBits(numBits uint) uint64 { + if !it.hasNext() { + return 0 + } + var res uint64 + res, it.err = it.is.ReadBits(numBits) + return res +} + +// Current returns the value as well as the annotation associated with the current datapoint. +// Users should not hold on to the returned Annotation object as it may get invalidated when +// the iterator calls Next(). +func (it *readerIterator) Current() (ts.Datapoint, xtime.Unit, ts.Annotation) { + if !it.intOptimized || it.isFloat { + return ts.Datapoint{ + Timestamp: it.tsIterator.PrevTime.ToTime(), + TimestampNanos: it.tsIterator.PrevTime, + Value: math.Float64frombits(it.floatIter.PrevFloatBits), + }, it.tsIterator.TimeUnit, it.tsIterator.PrevAnt + } + + return ts.Datapoint{ + Timestamp: it.tsIterator.PrevTime.ToTime(), + TimestampNanos: it.tsIterator.PrevTime, + Value: convertFromIntFloat(it.intVal, it.mult), + }, it.tsIterator.TimeUnit, it.tsIterator.PrevAnt +} + +// Err returns the error encountered +func (it *readerIterator) Err() error { + return it.err +} + +func (it *readerIterator) hasError() bool { + return it.err != nil +} + +func (it *readerIterator) isDone() bool { + return it.tsIterator.Done +} + +func (it *readerIterator) isClosed() bool { + return it.closed +} + +func (it *readerIterator) hasNext() bool { + return !it.hasError() && !it.isDone() && !it.isClosed() +} + +// Reset resets the ReadIterator for reuse. +func (it *readerIterator) Reset(reader io.Reader, schema namespace.SchemaDescr) { + it.is.Reset(reader) + it.tsIterator = NewTimestampIterator(it.opts, it.tsIterator.SkipMarkers) + it.err = nil + it.isFloat = false + it.intVal = 0.0 + it.mult = 0 + it.sig = 0 + it.closed = false +} + +// Close closes the ReaderIterator. +func (it *readerIterator) Close() { + if it.closed { + return + } + + it.closed = true + pool := it.opts.ReaderIteratorPool() + if pool != nil { + pool.Put(it) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/m3tsz.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/m3tsz.go new file mode 100644 index 00000000..1b92a523 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/m3tsz.go @@ -0,0 +1,139 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3tsz + +import ( + "errors" + "math" +) + +const ( + // DefaultIntOptimizationEnabled is the default switch for m3tsz int optimization + DefaultIntOptimizationEnabled = true + + // OpcodeZeroSig indicates that there were zero significant digits. + OpcodeZeroSig = 0x0 + // OpcodeNonZeroSig indicates that there were a non-zero number of significant digits. + OpcodeNonZeroSig = 0x1 + + // NumSigBits is the number of bits required to encode the maximum possible value + // of significant digits. + NumSigBits = 6 + + opcodeZeroValueXOR = 0x0 + opcodeContainedValueXOR = 0x2 + opcodeUncontainedValueXOR = 0x3 + opcodeNoUpdateSig = 0x0 + opcodeUpdateSig = 0x1 + opcodeUpdate = 0x0 + opcodeNoUpdate = 0x1 + opcodeUpdateMult = 0x1 + opcodeNoUpdateMult = 0x0 + opcodePositive = 0x0 + opcodeNegative = 0x1 + opcodeRepeat = 0x1 + opcodeNoRepeat = 0x0 + opcodeFloatMode = 0x1 + opcodeIntMode = 0x0 + + sigDiffThreshold = uint8(3) + sigRepeatThreshold = uint8(5) + + maxMult = uint8(6) + numMultBits = 3 +) + +var ( + maxInt = float64(math.MaxInt64) + minInt = float64(math.MinInt64) + maxOptInt = math.Pow(10.0, 13) // Max int for int optimization + multipliers = createMultipliers() + errInvalidMultiplier = errors.New("supplied multiplier is invalid") +) + +// convertToIntFloat takes a float64 val and the current max multiplier +// and attempts to transform the float into an int with multiplier. There +// is potential for a small accuracy loss for float values that are very +// close to ints eg. 46.000000000000001 would be returned as 46. This only +// applies to values where the next possible smaller or larger float changes +// the integer component of the float +func convertToIntFloat(v float64, curMaxMult uint8) (float64, uint8, bool, error) { + if curMaxMult == 0 && v < maxInt { + // Quick check for vals that are already ints + i, r := math.Modf(v) + if r == 0 { + return i, 0, false, nil + } + } + + if curMaxMult > maxMult { + return 0.0, 0, false, errInvalidMultiplier + } + + val := v * multipliers[int(curMaxMult)] + sign := 1.0 + if v < 0 { + sign = -1.0 + val = val * -1.0 + } + + for mult := curMaxMult; mult <= maxMult && val < maxOptInt; mult++ { + i, r := math.Modf(val) + if r == 0 { + return sign * i, mult, false, nil + } else if r < 0.1 { + // Round down and check + if math.Nextafter(val, 0) <= i { + return sign * i, mult, false, nil + } + } else if r > 0.9 { + // Round up and check + next := i + 1 + if math.Nextafter(val, next) >= next { + return sign * next, mult, false, nil + } + } + val = val * 10.0 + } + + return v, 0, true, nil +} + +func convertFromIntFloat(val float64, mult uint8) float64 { + if mult == 0 { + return val + } + + return val / multipliers[int(mult)] +} + +// createMultipliers creates all the multipliers up to maxMult +// and places them into a slice +func createMultipliers() []float64 { + multipliers := make([]float64, maxMult+1) + base := 1.0 + for i := 0; i <= int(maxMult); i++ { + multipliers[i] = base + base = base * 10.0 + } + + return multipliers +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/timestamp_encoder.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/timestamp_encoder.go new file mode 100644 index 00000000..196e6b39 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/timestamp_encoder.go @@ -0,0 +1,219 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3tsz + +import ( + "bytes" + "encoding/binary" + "fmt" + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/ts" + xtime "github.com/m3db/m3/src/x/time" +) + +// TimestampEncoder encapsulates the state required for a logical stream of +// bits that represent a stream of timestamps compressed using delta-of-delta +type TimestampEncoder struct { + PrevTime time.Time + PrevTimeDelta time.Duration + PrevAnnotation []byte + + Options encoding.Options + + TimeUnit xtime.Unit + + // Used to keep track of time unit changes that occur directly via the WriteTimeUnit() + // API as opposed to indirectly via the WriteTime() API. + timeUnitEncodedManually bool + // Only taken into account if using the WriteTime() API. + hasWrittenFirst bool +} + +// NewTimestampEncoder creates a new TimestampEncoder. +func NewTimestampEncoder( + start time.Time, timeUnit xtime.Unit, opts encoding.Options) TimestampEncoder { + return TimestampEncoder{ + PrevTime: start, + TimeUnit: initialTimeUnit(xtime.ToUnixNano(start), timeUnit), + Options: opts, + } +} + +// WriteTime encode the timestamp using delta-of-delta compression. +func (enc *TimestampEncoder) WriteTime( + stream encoding.OStream, currTime time.Time, ant ts.Annotation, timeUnit xtime.Unit) error { + if !enc.hasWrittenFirst { + if err := enc.WriteFirstTime(stream, currTime, ant, timeUnit); err != nil { + return err + } + enc.hasWrittenFirst = true + return nil + } + + return enc.WriteNextTime(stream, currTime, ant, timeUnit) +} + +// WriteFirstTime encodes the first timestamp. +func (enc *TimestampEncoder) WriteFirstTime( + stream encoding.OStream, currTime time.Time, ant ts.Annotation, timeUnit xtime.Unit) error { + // NB(xichen): Always write the first time in nanoseconds because we don't know + // if the start time is going to be a multiple of the time unit provided. + nt := xtime.ToNormalizedTime(enc.PrevTime, time.Nanosecond) + stream.WriteBits(uint64(nt), 64) + return enc.WriteNextTime(stream, currTime, ant, timeUnit) +} + +// WriteNextTime encodes the next (non-first) timestamp. +func (enc *TimestampEncoder) WriteNextTime( + stream encoding.OStream, currTime time.Time, ant ts.Annotation, timeUnit xtime.Unit) error { + enc.writeAnnotation(stream, ant) + tuChanged := enc.maybeWriteTimeUnitChange(stream, timeUnit) + + timeDelta := currTime.Sub(enc.PrevTime) + enc.PrevTime = currTime + if tuChanged || enc.timeUnitEncodedManually { + enc.writeDeltaOfDeltaTimeUnitChanged(stream, enc.PrevTimeDelta, timeDelta) + // NB(xichen): if the time unit has changed, we reset the time delta to zero + // because we can't guarantee that dt is a multiple of the new time unit, which + // means we can't guarantee that the delta of delta when encoding the next + // data point is a multiple of the new time unit. + enc.PrevTimeDelta = 0 + enc.timeUnitEncodedManually = false + return nil + } + err := enc.writeDeltaOfDeltaTimeUnitUnchanged( + stream, enc.PrevTimeDelta, timeDelta, timeUnit) + enc.PrevTimeDelta = timeDelta + return err +} + +// WriteTimeUnit writes the new time unit into the stream. It exists as a standalone method +// so that other calls can encode time unit changes without relying on the marker scheme. +func (enc *TimestampEncoder) WriteTimeUnit(stream encoding.OStream, timeUnit xtime.Unit) { + stream.WriteByte(byte(timeUnit)) + enc.TimeUnit = timeUnit + enc.timeUnitEncodedManually = true +} + +// maybeWriteTimeUnitChange encodes the time unit and returns true if the time unit has +// changed, and false otherwise. +func (enc *TimestampEncoder) maybeWriteTimeUnitChange(stream encoding.OStream, timeUnit xtime.Unit) bool { + if !enc.shouldWriteTimeUnit(timeUnit) { + return false + } + + scheme := enc.Options.MarkerEncodingScheme() + encoding.WriteSpecialMarker(stream, scheme, scheme.TimeUnit()) + enc.WriteTimeUnit(stream, timeUnit) + return true +} + +// shouldWriteTimeUnit determines whether we should write tu as a time unit. +// Returns true if tu is valid and differs from the existing time unit, false otherwise. +func (enc *TimestampEncoder) shouldWriteTimeUnit(timeUnit xtime.Unit) bool { + if !timeUnit.IsValid() || timeUnit == enc.TimeUnit { + return false + } + return true +} + +// shouldWriteAnnotation determines whether we should write ant as an annotation. +// Returns true if ant is not empty and differs from the existing annotation, false otherwise. +func (enc *TimestampEncoder) shouldWriteAnnotation(ant ts.Annotation) bool { + numAnnotationBytes := len(ant) + if numAnnotationBytes == 0 { + return false + } + return !bytes.Equal(enc.PrevAnnotation, ant) +} + +func (enc *TimestampEncoder) writeAnnotation(stream encoding.OStream, ant ts.Annotation) { + if !enc.shouldWriteAnnotation(ant) { + return + } + + scheme := enc.Options.MarkerEncodingScheme() + encoding.WriteSpecialMarker(stream, scheme, scheme.Annotation()) + + var buf [binary.MaxVarintLen32]byte + // NB: we subtract 1 for possible varint encoding savings + annotationLength := binary.PutVarint(buf[:], int64(len(ant)-1)) + + stream.WriteBytes(buf[:annotationLength]) + stream.WriteBytes(ant) + enc.PrevAnnotation = ant +} + +func (enc *TimestampEncoder) writeDeltaOfDeltaTimeUnitChanged( + stream encoding.OStream, prevDelta, curDelta time.Duration) { + // NB(xichen): if the time unit has changed, always normalize delta-of-delta + // to nanoseconds and encode it using 64 bits. + dodInNano := int64(curDelta - prevDelta) + stream.WriteBits(uint64(dodInNano), 64) +} + +func (enc *TimestampEncoder) writeDeltaOfDeltaTimeUnitUnchanged( + stream encoding.OStream, prevDelta, curDelta time.Duration, timeUnit xtime.Unit) error { + u, err := timeUnit.Value() + if err != nil { + return err + } + + deltaOfDelta := xtime.ToNormalizedDuration(curDelta-prevDelta, u) + tes, exists := enc.Options.TimeEncodingSchemes().SchemeForUnit(timeUnit) + if !exists { + return fmt.Errorf("time encoding scheme for time unit %v doesn't exist", timeUnit) + } + + if deltaOfDelta == 0 { + zeroBucket := tes.ZeroBucket() + stream.WriteBits(zeroBucket.Opcode(), zeroBucket.NumOpcodeBits()) + return nil + } + + buckets := tes.Buckets() + for i := 0; i < len(buckets); i++ { + if deltaOfDelta >= buckets[i].Min() && deltaOfDelta <= buckets[i].Max() { + stream.WriteBits(buckets[i].Opcode(), buckets[i].NumOpcodeBits()) + stream.WriteBits(uint64(deltaOfDelta), buckets[i].NumValueBits()) + return nil + } + } + defaultBucket := tes.DefaultBucket() + stream.WriteBits(defaultBucket.Opcode(), defaultBucket.NumOpcodeBits()) + stream.WriteBits(uint64(deltaOfDelta), defaultBucket.NumValueBits()) + return nil +} + +func initialTimeUnit(start xtime.UnixNano, tu xtime.Unit) xtime.Unit { + tv, err := tu.Value() + if err != nil { + return xtime.None + } + // If we want to use tu as the time unit for start, start must + // be a multiple of tu. + if start%xtime.UnixNano(tv) == 0 { + return tu + } + return xtime.None +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/timestamp_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/timestamp_iterator.go new file mode 100644 index 00000000..ca340260 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/m3tsz/timestamp_iterator.go @@ -0,0 +1,325 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3tsz + +import ( + "encoding/binary" + "fmt" + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/ts" + xtime "github.com/m3db/m3/src/x/time" +) + +// TimestampIterator encapsulates all the state required for iterating over +// delta-of-delta compresed timestamps. +type TimestampIterator struct { + PrevTime xtime.UnixNano + PrevTimeDelta time.Duration + PrevAnt ts.Annotation + + TimeUnit xtime.Unit + + Opts encoding.Options + + TimeUnitChanged bool + Done bool + + // Controls whether the iterator will "look ahead" for marker encoding + // schemes. Setting SkipMarkers to true disables the look ahead behavior + // for situations where looking ahead is not safe. + SkipMarkers bool + + numValueBits uint + numBits uint + markerEncodingScheme encoding.MarkerEncodingScheme +} + +// NewTimestampIterator creates a new TimestampIterator. +func NewTimestampIterator(opts encoding.Options, skipMarkers bool) TimestampIterator { + mes := opts.MarkerEncodingScheme() + return TimestampIterator{ + Opts: opts, + SkipMarkers: skipMarkers, + numValueBits: uint(mes.NumValueBits()), + numBits: uint(mes.NumOpcodeBits() + mes.NumValueBits()), + markerEncodingScheme: mes, + } +} + +// ReadTimestamp reads the first or next timestamp. +func (it *TimestampIterator) ReadTimestamp(stream encoding.IStream) (bool, bool, error) { + it.PrevAnt = nil + + var ( + first = false + err error + ) + if it.PrevTime == 0 { + first = true + err = it.readFirstTimestamp(stream) + } else { + err = it.readNextTimestamp(stream) + } + if err != nil { + return false, false, err + } + + // NB(xichen): reset time delta to 0 when there is a time unit change to be + // consistent with the encoder. + if it.TimeUnitChanged { + it.PrevTimeDelta = 0 + it.TimeUnitChanged = false + } + + return first, it.Done, nil +} + +// ReadTimeUnit reads an encoded time unit and updates the iterator's state +// accordingly. It is exposed as a public method so that callers can control +// the encoding / decoding of the time unit on their own if they choose. +func (it *TimestampIterator) ReadTimeUnit(stream encoding.IStream) error { + tuBits, err := stream.ReadByte() + if err != nil { + return err + } + + tu := xtime.Unit(tuBits) + if tu.IsValid() && tu != it.TimeUnit { + it.TimeUnitChanged = true + } + it.TimeUnit = tu + + return nil +} + +func (it *TimestampIterator) readFirstTimestamp(stream encoding.IStream) error { + ntBits, err := stream.ReadBits(64) + if err != nil { + return err + } + + // NB(xichen): first time stamp is always normalized to nanoseconds. + nt := xtime.UnixNano(ntBits) + if it.TimeUnit == xtime.None { + it.TimeUnit = initialTimeUnit(nt, it.Opts.DefaultTimeUnit()) + } + + err = it.readNextTimestamp(stream) + if err != nil { + return err + } + + it.PrevTime = nt + xtime.UnixNano(it.PrevTimeDelta) + return nil +} + +func (it *TimestampIterator) readNextTimestamp(stream encoding.IStream) error { + dod, err := it.readMarkerOrDeltaOfDelta(stream) + if err != nil { + return err + } + + it.PrevTimeDelta += dod + it.PrevTime = it.PrevTime + xtime.UnixNano(it.PrevTimeDelta) + return nil +} + +func (it *TimestampIterator) tryReadMarker(stream encoding.IStream) (time.Duration, bool, error) { + opcodeAndValue, success := it.tryPeekBits(stream, it.numBits) + if !success { + return 0, false, nil + } + + opcode := opcodeAndValue >> it.numValueBits + if opcode != it.markerEncodingScheme.Opcode() { + return 0, false, nil + } + + var ( + valueMask = (1 << it.numValueBits) - 1 + markerValue = int64(opcodeAndValue & uint64(valueMask)) + ) + switch encoding.Marker(markerValue) { + case it.markerEncodingScheme.EndOfStream(): + _, err := stream.ReadBits(it.numBits) + if err != nil { + return 0, false, err + } + it.Done = true + return 0, true, nil + case it.markerEncodingScheme.Annotation(): + _, err := stream.ReadBits(it.numBits) + if err != nil { + return 0, false, err + } + err = it.readAnnotation(stream) + if err != nil { + return 0, false, err + } + markerOrDOD, err := it.readMarkerOrDeltaOfDelta(stream) + if err != nil { + return 0, false, err + } + return markerOrDOD, true, nil + case it.markerEncodingScheme.TimeUnit(): + _, err := stream.ReadBits(it.numBits) + if err != nil { + return 0, false, err + } + err = it.ReadTimeUnit(stream) + if err != nil { + return 0, false, err + } + markerOrDOD, err := it.readMarkerOrDeltaOfDelta(stream) + if err != nil { + return 0, false, err + } + return markerOrDOD, true, nil + default: + return 0, false, nil + } +} + +func (it *TimestampIterator) readMarkerOrDeltaOfDelta(stream encoding.IStream) (time.Duration, error) { + if !it.SkipMarkers { + dod, success, err := it.tryReadMarker(stream) + if err != nil { + return 0, err + } + if it.Done { + return 0, nil + } + + if success { + return dod, nil + } + } + + tes, exists := it.Opts.TimeEncodingSchemes().SchemeForUnit(it.TimeUnit) + if !exists { + return 0, fmt.Errorf("time encoding scheme for time unit %v doesn't exist", it.TimeUnit) + } + + return it.readDeltaOfDelta(stream, tes) +} + +func (it *TimestampIterator) readDeltaOfDelta( + stream encoding.IStream, tes encoding.TimeEncodingScheme) (time.Duration, error) { + if it.TimeUnitChanged { + // NB(xichen): if the time unit has changed, always read 64 bits as normalized + // dod in nanoseconds. + dodBits, err := stream.ReadBits(64) + if err != nil { + return 0, err + } + + dod := encoding.SignExtend(dodBits, 64) + return time.Duration(dod), nil + } + + cb, err := stream.ReadBits(1) + if err != nil { + return 0, err + } + if cb == tes.ZeroBucket().Opcode() { + return 0, nil + } + + buckets := tes.Buckets() + for i := 0; i < len(buckets); i++ { + nextCB, err := stream.ReadBits(1) + if err != nil { + return 0, nil + } + + cb = (cb << 1) | nextCB + if cb == buckets[i].Opcode() { + dodBits, err := stream.ReadBits(uint(buckets[i].NumValueBits())) + if err != nil { + return 0, err + } + + dod := encoding.SignExtend(dodBits, uint(buckets[i].NumValueBits())) + timeUnit, err := it.TimeUnit.Value() + if err != nil { + return 0, nil + } + + return xtime.FromNormalizedDuration(dod, timeUnit), nil + } + } + + numValueBits := uint(tes.DefaultBucket().NumValueBits()) + dodBits, err := stream.ReadBits(numValueBits) + if err != nil { + return 0, err + } + dod := encoding.SignExtend(dodBits, numValueBits) + timeUnit, err := it.TimeUnit.Value() + if err != nil { + return 0, nil + } + + return xtime.FromNormalizedDuration(dod, timeUnit), nil +} + +func (it *TimestampIterator) readAnnotation(stream encoding.IStream) error { + antLen, err := it.readVarint(stream) + if err != nil { + return err + } + + // NB: we add 1 here to offset the 1 we subtracted during encoding. + antLen = antLen + 1 + if antLen <= 0 { + return fmt.Errorf("unexpected annotation length %d", antLen) + } + + // TODO(xichen): use pool to allocate the buffer once the pool diff lands. + buf := make([]byte, antLen) + n, err := stream.Read(buf) + if err != nil { + return err + } + if n != antLen { + return fmt.Errorf( + "expected to read %d annotation bytes but read: %d", + antLen, n) + } + it.PrevAnt = buf + + return nil +} + +func (it *TimestampIterator) readVarint(stream encoding.IStream) (int, error) { + res, err := binary.ReadVarint(stream) + return int(res), err +} + +func (it *TimestampIterator) tryPeekBits(stream encoding.IStream, numBits uint) (uint64, bool) { + res, err := stream.PeekBits(numBits) + if err != nil { + return 0, false + } + return res, true +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/multi_reader_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/multi_reader_iterator.go new file mode 100644 index 00000000..c3e986f6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/multi_reader_iterator.go @@ -0,0 +1,252 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "errors" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + xtime "github.com/m3db/m3/src/x/time" +) + +var ( + errOutOfOrderIterator = errors.New("values are out of order from inner iterator") +) + +// multiReaderIterator is an iterator that iterates in order over a list of sets of +// internally ordered but not collectively in order readers, it also deduplicates datapoints. +type multiReaderIterator struct { + schemaDesc namespace.SchemaDescr + iters iterators + slicesIter xio.ReaderSliceOfSlicesIterator + iteratorAlloc ReaderIteratorAllocate + singleSlicesIter singleSlicesOfSlicesIterator + pool MultiReaderIteratorPool + err error + firstNext bool + closed bool +} + +// NewMultiReaderIterator creates a new multi-reader iterator. +func NewMultiReaderIterator( + iteratorAlloc ReaderIteratorAllocate, + pool MultiReaderIteratorPool, +) MultiReaderIterator { + it := &multiReaderIterator{pool: pool, iteratorAlloc: iteratorAlloc} + it.Reset(nil, time.Time{}, 0, nil) + return it +} + +func (it *multiReaderIterator) Next() bool { + if !it.firstNext { + // When firstNext do not progress the first time + if !it.hasNext() { + return false + } + it.moveToNext() + } + it.firstNext = false + return it.hasNext() +} + +func (it *multiReaderIterator) Current() (ts.Datapoint, xtime.Unit, ts.Annotation) { + return it.iters.current() +} + +func (it *multiReaderIterator) hasError() bool { + return it.err != nil +} + +func (it *multiReaderIterator) isClosed() bool { + return it.closed +} + +func (it *multiReaderIterator) hasMore() bool { + return it.iters.len() > 0 || it.slicesIter != nil +} + +func (it *multiReaderIterator) hasNext() bool { + return !it.hasError() && !it.isClosed() && it.hasMore() +} + +func (it *multiReaderIterator) moveToNext() { + if it.iters.len() > 0 { + it.moveIteratorsToNext() + } + if it.iters.len() > 0 || it.hasError() { + // Still have valid iters or has error + return + } + + // Move forward through slices of readers + if !it.slicesIter.Next() { + // No more readers, nil out so that hasMore reflects correctly + it.slicesIter.Close() + it.slicesIter = nil + return + } + + // Add all readers to current iterators heap + currentLen, _, _ := it.slicesIter.CurrentReaders() + for i := 0; i < currentLen; i++ { + var ( + reader = it.slicesIter.CurrentReaderAt(i) + iter = it.iteratorAlloc(reader, it.schemaDesc) + ) + if iter.Next() { + // Only insert it if it has values + it.iters.push(iter) + } else { + err := iter.Err() + iter.Close() + if it.err == nil && err != nil { + it.err = err + } + } + } + + if it.iters.len() == 0 && !it.hasError() { + // No iterators were added, move to next + it.moveToNext() + } +} + +func (it *multiReaderIterator) moveIteratorsToNext() { + for { + prev := it.iters.at() + next, err := it.iters.moveToValidNext() + if it.err == nil && err != nil { + it.err = err + return + } + if err != nil || !next { + return + } + + curr := it.iters.at() + if curr != prev { + return + } + + // Dedupe by continuing + } +} + +func (it *multiReaderIterator) Err() error { + return it.err +} + +func (it *multiReaderIterator) Readers() xio.ReaderSliceOfSlicesIterator { + return it.slicesIter +} + +func (it *multiReaderIterator) Reset(blocks []xio.SegmentReader, start time.Time, blockSize time.Duration, descr namespace.SchemaDescr) { + it.singleSlicesIter.readers = blocks + it.singleSlicesIter.firstNext = true + it.singleSlicesIter.closed = false + it.singleSlicesIter.start = start + it.singleSlicesIter.blockSize = blockSize + it.ResetSliceOfSlices(&it.singleSlicesIter, descr) +} + +func (it *multiReaderIterator) ResetSliceOfSlices(slicesIter xio.ReaderSliceOfSlicesIterator, descr namespace.SchemaDescr) { + it.schemaDesc = descr + it.iters.reset() + it.slicesIter = slicesIter + it.err = nil + it.firstNext = true + it.closed = false + // Try moveToNext to load values for calls to Current before Next + it.moveToNext() +} + +func (it *multiReaderIterator) Schema() namespace.SchemaDescr { + return it.schemaDesc +} + +func (it *multiReaderIterator) Close() { + if it.isClosed() { + return + } + it.closed = true + it.iters.reset() + if it.slicesIter != nil { + it.slicesIter.Close() + } + it.slicesIter = nil + if it.pool != nil { + it.pool.Put(it) + } +} + +type singleSlicesOfSlicesIterator struct { + readers []xio.SegmentReader + firstNext bool + closed bool + start time.Time + blockSize time.Duration +} + +func (it *singleSlicesOfSlicesIterator) Next() bool { + if !it.firstNext || it.closed { + return false + } + it.firstNext = false + return true +} + +func (it *singleSlicesOfSlicesIterator) CurrentReaders() (int, time.Time, time.Duration) { + return len(it.readers), it.start, it.blockSize +} + +func (it *singleSlicesOfSlicesIterator) CurrentReaderAt(idx int) xio.BlockReader { + return xio.BlockReader{ + SegmentReader: it.readers[idx], + Start: it.start, + BlockSize: it.blockSize, + } +} + +func (it *singleSlicesOfSlicesIterator) Close() { + if it.closed { + return + } + it.closed = true +} + +func (it *singleSlicesOfSlicesIterator) Size() (int, error) { + size := 0 + for _, reader := range it.readers { + seg, err := reader.Segment() + if err != nil { + return 0, err + } + size += seg.Len() + } + return size, nil +} + +func (it *singleSlicesOfSlicesIterator) Rewind() { + it.firstNext = true +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/multi_reader_iterator_array_pool.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/multi_reader_iterator_array_pool.go new file mode 100644 index 00000000..cd033096 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/multi_reader_iterator_array_pool.go @@ -0,0 +1,115 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "sort" + + "github.com/m3db/m3/src/x/pool" +) + +// TODO(r): there should be an ArrayPool that can take an alloc function +// that given a "capacity" can return a "interface{}" which consists of an array +// with the specifified capacity and does the bucket logic for the type safe +// higher level specific array pool, i.e. IteratorArrayPool. +// This way we can avoid having the bucketing logic for each pool in each concrete +// array pool. + +// TODO(r): instrument this to tune pooling +type multiReaderIteratorArrayPool struct { + sizesAsc []pool.Bucket + buckets []multiReaderIteratorArrayPoolBucket + maxBucketCapacity int +} + +type multiReaderIteratorArrayPoolBucket struct { + capacity int + values chan []MultiReaderIterator +} + +// NewMultiReaderIteratorArrayPool creates a new pool +func NewMultiReaderIteratorArrayPool(sizes []pool.Bucket) MultiReaderIteratorArrayPool { + sizesAsc := make([]pool.Bucket, len(sizes)) + copy(sizesAsc, sizes) + sort.Sort(pool.BucketByCapacity(sizesAsc)) + var maxBucketCapacity int + if len(sizesAsc) != 0 { + maxBucketCapacity = sizesAsc[len(sizesAsc)-1].Capacity + } + return &multiReaderIteratorArrayPool{sizesAsc: sizesAsc, maxBucketCapacity: maxBucketCapacity} +} + +func (p *multiReaderIteratorArrayPool) alloc(capacity int) []MultiReaderIterator { + return make([]MultiReaderIterator, 0, capacity) +} + +func (p *multiReaderIteratorArrayPool) Init() { + buckets := make([]multiReaderIteratorArrayPoolBucket, len(p.sizesAsc)) + for i := range p.sizesAsc { + buckets[i].capacity = p.sizesAsc[i].Capacity + buckets[i].values = make(chan []MultiReaderIterator, p.sizesAsc[i].Count) + for j := 0; j < p.sizesAsc[i].Count; j++ { + buckets[i].values <- p.alloc(p.sizesAsc[i].Capacity) + } + } + p.buckets = buckets +} + +func (p *multiReaderIteratorArrayPool) Get(capacity int) []MultiReaderIterator { + if capacity > p.maxBucketCapacity { + return p.alloc(capacity) + } + for i := range p.buckets { + if p.buckets[i].capacity >= capacity { + select { + case b := <-p.buckets[i].values: + return b + default: + // NB(r): use the bucket's capacity so can potentially + // be returned to pool when it's finished with. + return p.alloc(p.buckets[i].capacity) + } + } + } + return p.alloc(capacity) +} + +func (p *multiReaderIteratorArrayPool) Put(array []MultiReaderIterator) { + capacity := cap(array) + if capacity > p.maxBucketCapacity { + return + } + + for i := range array { + array[i] = nil + } + array = array[:0] + for i := range p.buckets { + if p.buckets[i].capacity >= capacity { + select { + case p.buckets[i].values <- array: + return + default: + return + } + } + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/mutable_series_iterators_pool.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/mutable_series_iterators_pool.go new file mode 100644 index 00000000..914b2c5b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/mutable_series_iterators_pool.go @@ -0,0 +1,104 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "sort" + + "github.com/m3db/m3/src/x/pool" +) + +type seriesIteratorsPool struct { + sizesAsc []pool.Bucket + buckets []seriesIteratorArrayPoolBucket + maxBucketCapacity int +} + +type seriesIteratorArrayPoolBucket struct { + capacity int + values chan MutableSeriesIterators +} + +// NewMutableSeriesIteratorsPool creates a new pool +func NewMutableSeriesIteratorsPool(sizes []pool.Bucket) MutableSeriesIteratorsPool { + sizesAsc := make([]pool.Bucket, len(sizes)) + copy(sizesAsc, sizes) + sort.Sort(pool.BucketByCapacity(sizesAsc)) + var maxBucketCapacity int + if len(sizesAsc) != 0 { + maxBucketCapacity = sizesAsc[len(sizesAsc)-1].Capacity + } + return &seriesIteratorsPool{sizesAsc: sizesAsc, maxBucketCapacity: maxBucketCapacity} +} + +func (p *seriesIteratorsPool) alloc(capacity int) MutableSeriesIterators { + iters := make([]SeriesIterator, 0, capacity) + return NewSeriesIterators(iters, p) +} + +func (p *seriesIteratorsPool) Init() { + buckets := make([]seriesIteratorArrayPoolBucket, len(p.sizesAsc)) + for i := range p.sizesAsc { + buckets[i].capacity = p.sizesAsc[i].Capacity + buckets[i].values = make(chan MutableSeriesIterators, p.sizesAsc[i].Count) + for j := 0; j < p.sizesAsc[i].Count; j++ { + buckets[i].values <- p.alloc(p.sizesAsc[i].Capacity) + } + } + p.buckets = buckets +} + +func (p *seriesIteratorsPool) Get(capacity int) MutableSeriesIterators { + if capacity > p.maxBucketCapacity { + return p.alloc(capacity) + } + for i := range p.buckets { + if p.buckets[i].capacity >= capacity { + select { + case b := <-p.buckets[i].values: + return b + default: + // NB(r): use the bucket's capacity so can potentially + // be returned to pool when it's finished with. + return p.alloc(p.buckets[i].capacity) + } + } + } + return p.alloc(capacity) +} + +func (p *seriesIteratorsPool) Put(iters MutableSeriesIterators) { + capacity := iters.Cap() + if capacity > p.maxBucketCapacity { + return + } + + for i := range p.buckets { + if p.buckets[i].capacity >= capacity { + select { + case p.buckets[i].values <- iters: + return + default: + return + } + } + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/null.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/null.go new file mode 100644 index 00000000..39b73439 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/null.go @@ -0,0 +1,80 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "fmt" + "io" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/context" + xtime "github.com/m3db/m3/src/x/time" +) + +type nullEncoder struct { + sealed bool +} + +// NewNullEncoder returns a new encoder that performs no operations +func NewNullEncoder() Encoder { + return &nullEncoder{} +} + +func (e *nullEncoder) Encode(dp ts.Datapoint, timeUnit xtime.Unit, annotation ts.Annotation) error { + return nil +} +func (e *nullEncoder) Stream(ctx context.Context) (xio.SegmentReader, bool) { + return nil, false +} +func (e *nullEncoder) NumEncoded() int { return 0 } +func (e *nullEncoder) LastEncoded() (ts.Datapoint, error) { + return ts.Datapoint{}, fmt.Errorf("not implemented") +} +func (e *nullEncoder) LastAnnotation() (ts.Annotation, error) { + return nil, fmt.Errorf("not implemented") +} +func (e *nullEncoder) Len() int { return 0 } +func (e *nullEncoder) Seal() { e.sealed = true } +func (e *nullEncoder) Reset(t time.Time, capacity int, descr namespace.SchemaDescr) {} +func (e *nullEncoder) Close() {} +func (e *nullEncoder) Discard() ts.Segment { return ts.Segment{} } +func (e *nullEncoder) DiscardReset(t time.Time, capacity int, descr namespace.SchemaDescr) ts.Segment { + return ts.Segment{} +} +func (e *nullEncoder) SetSchema(_ namespace.SchemaDescr) {} + +type nullReaderIterator struct{} + +// NewNullReaderIterator returns a new reader iterator that performs no operations +func NewNullReaderIterator() ReaderIterator { + return &nullReaderIterator{} +} + +func (r *nullReaderIterator) Current() (ts.Datapoint, xtime.Unit, ts.Annotation) { + return ts.Datapoint{}, xtime.Unit(0), nil +} +func (r *nullReaderIterator) Next() bool { return false } +func (r *nullReaderIterator) Err() error { return fmt.Errorf("not implemented") } +func (r *nullReaderIterator) Close() {} +func (r *nullReaderIterator) Reset(reader io.Reader, descr namespace.SchemaDescr) {} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/options.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/options.go new file mode 100644 index 00000000..1016be3d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/options.go @@ -0,0 +1,180 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/dbnode/x/xpool" + "github.com/m3db/m3/src/x/pool" + xtime "github.com/m3db/m3/src/x/time" +) + +const ( + defaultDefaultTimeUnit = xtime.Second + defaultByteFieldDictLRUSize = 4 + defaultIStreamReaderSizeM3TSZ = 8 * 2 + defaultIStreamReaderSizeProto = 128 +) + +var ( + // default encoding options + defaultOptions = newOptions() +) + +type options struct { + defaultTimeUnit xtime.Unit + timeEncodingSchemes TimeEncodingSchemes + markerEncodingScheme MarkerEncodingScheme + encoderPool EncoderPool + readerIteratorPool ReaderIteratorPool + bytesPool pool.CheckedBytesPool + segmentReaderPool xio.SegmentReaderPool + checkedBytesWrapperPool xpool.CheckedBytesWrapperPool + byteFieldDictLRUSize int + iStreamReaderSizeM3TSZ int + iStreamReaderSizeProto int +} + +func newOptions() Options { + return &options{ + defaultTimeUnit: defaultDefaultTimeUnit, + timeEncodingSchemes: newTimeEncodingSchemes(defaultTimeEncodingSchemes), + markerEncodingScheme: defaultMarkerEncodingScheme, + byteFieldDictLRUSize: defaultByteFieldDictLRUSize, + iStreamReaderSizeM3TSZ: defaultIStreamReaderSizeM3TSZ, + iStreamReaderSizeProto: defaultIStreamReaderSizeProto, + } +} + +// NewOptions creates a new options. +func NewOptions() Options { + return defaultOptions +} + +func (o *options) SetDefaultTimeUnit(value xtime.Unit) Options { + opts := *o + opts.defaultTimeUnit = value + return &opts +} + +func (o *options) DefaultTimeUnit() xtime.Unit { + return o.defaultTimeUnit +} + +func (o *options) SetTimeEncodingSchemes(value map[xtime.Unit]TimeEncodingScheme) Options { + opts := *o + opts.timeEncodingSchemes = newTimeEncodingSchemes(value) + return &opts +} + +func (o *options) TimeEncodingSchemes() TimeEncodingSchemes { + return o.timeEncodingSchemes +} + +func (o *options) SetMarkerEncodingScheme(value MarkerEncodingScheme) Options { + opts := *o + opts.markerEncodingScheme = value + return &opts +} + +func (o *options) MarkerEncodingScheme() MarkerEncodingScheme { + return o.markerEncodingScheme +} + +func (o *options) SetEncoderPool(value EncoderPool) Options { + opts := *o + opts.encoderPool = value + return &opts +} + +func (o *options) EncoderPool() EncoderPool { + return o.encoderPool +} + +func (o *options) SetReaderIteratorPool(value ReaderIteratorPool) Options { + opts := *o + opts.readerIteratorPool = value + return &opts +} + +func (o *options) ReaderIteratorPool() ReaderIteratorPool { + return o.readerIteratorPool +} + +func (o *options) SetBytesPool(value pool.CheckedBytesPool) Options { + opts := *o + opts.bytesPool = value + return &opts +} + +func (o *options) BytesPool() pool.CheckedBytesPool { + return o.bytesPool +} + +func (o *options) SetSegmentReaderPool(value xio.SegmentReaderPool) Options { + opts := *o + opts.segmentReaderPool = value + return &opts +} + +func (o *options) SegmentReaderPool() xio.SegmentReaderPool { + return o.segmentReaderPool +} + +func (o *options) SetCheckedBytesWrapperPool(value xpool.CheckedBytesWrapperPool) Options { + opts := *o + opts.checkedBytesWrapperPool = value + return &opts +} + +func (o *options) CheckedBytesWrapperPool() xpool.CheckedBytesWrapperPool { + return o.checkedBytesWrapperPool +} + +func (o *options) SetByteFieldDictionaryLRUSize(value int) Options { + opts := *o + opts.byteFieldDictLRUSize = value + return &opts +} + +func (o *options) ByteFieldDictionaryLRUSize() int { + return o.byteFieldDictLRUSize +} + +func (o *options) SetIStreamReaderSizeM3TSZ(value int) Options { + opts := *o + opts.iStreamReaderSizeM3TSZ = value + return &opts +} + +func (o *options) IStreamReaderSizeM3TSZ() int { + return o.iStreamReaderSizeM3TSZ +} + +func (o *options) SetIStreamReaderSizeProto(value int) Options { + opts := *o + opts.iStreamReaderSizeProto = value + return &opts +} + +func (o *options) IStreamReaderSizeProto() int { + return o.iStreamReaderSizeProto +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/ostream.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/ostream.go new file mode 100644 index 00000000..3baeb4f2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/ostream.go @@ -0,0 +1,264 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/pool" +) + +const ( + initAllocSize = 1024 +) + +// ostream encapsulates a writable stream. +type ostream struct { + // We want to use a checked.Bytes when transferring ownership of the buffer + // of the ostream. Unfortunately, the accounting overhead of going through + // the checked.Bytes for every write is massive. As a result, we store both + // the rawBuffer that backs the checked.Bytes AND the checked.Bytes themselves + // in this struct. + // + // That way, whenever we're writing to the buffer we can avoid the cost accounting + // overhead entirely, but when the data needs to be transffered to another owner + // we use the checked.Bytes, which is when the accounting really matters anyways. + // + // The rawBuffer and checked.Bytes may get out of sync as the rawBuffer is written to, + // but thats fine because we perform a "repair" by resetting the checked.Bytes underlying + // byte slice to be the rawBuffer whenever we expose a checked.Bytes to an external caller. + rawBuffer []byte + checked checked.Bytes + + pos int // how many bits have been used in the last byte + bytesPool pool.CheckedBytesPool +} + +// NewOStream creates a new Ostream +func NewOStream( + bytes checked.Bytes, + initAllocIfEmpty bool, + bytesPool pool.CheckedBytesPool, +) OStream { + if bytes == nil && initAllocIfEmpty { + bytes = checked.NewBytes(make([]byte, 0, initAllocSize), nil) + } + + stream := &ostream{bytesPool: bytesPool} + stream.Reset(bytes) + return stream +} + +func (os *ostream) Len() int { + return len(os.rawBuffer) +} + +func (os *ostream) Empty() bool { + return os.Len() == 0 && os.pos == 0 +} + +func (os *ostream) lastIndex() int { + return os.Len() - 1 +} + +func (os *ostream) hasUnusedBits() bool { + return os.pos > 0 && os.pos < 8 +} + +// grow appends the last byte of v to rawBuffer and sets pos to np. +func (os *ostream) grow(v byte, np int) { + os.ensureCapacityFor(1) + os.rawBuffer = append(os.rawBuffer, v) + + os.pos = np +} + +// ensureCapacity ensures that there is at least capacity for n more bytes. +func (os *ostream) ensureCapacityFor(n int) { + var ( + currCap = cap(os.rawBuffer) + currLen = len(os.rawBuffer) + availableCap = currCap - currLen + missingCap = n - availableCap + ) + if missingCap <= 0 { + // Already have enough capacity. + return + } + + newCap := max(cap(os.rawBuffer)*2, currCap+missingCap) + if p := os.bytesPool; p != nil { + newChecked := p.Get(newCap) + newChecked.IncRef() + newChecked.AppendAll(os.rawBuffer) + + if os.checked != nil { + os.checked.DecRef() + os.checked.Finalize() + } + + os.checked = newChecked + os.rawBuffer = os.checked.Bytes() + } else { + newRawBuffer := make([]byte, 0, newCap) + newRawBuffer = append(newRawBuffer, os.rawBuffer...) + os.rawBuffer = newRawBuffer + + os.checked = checked.NewBytes(os.rawBuffer, nil) + os.checked.IncRef() + } +} + +func (os *ostream) fillUnused(v byte) { + os.rawBuffer[os.lastIndex()] |= v >> uint(os.pos) +} + +func (os *ostream) WriteBit(v Bit) { + v <<= 7 + if !os.hasUnusedBits() { + os.grow(byte(v), 1) + return + } + os.fillUnused(byte(v)) + os.pos++ +} + +func (os *ostream) WriteByte(v byte) { + if !os.hasUnusedBits() { + os.grow(v, 8) + return + } + os.fillUnused(v) + os.grow(v< 64 { + numBits = 64 + } + + v <<= uint(64 - numBits) + for numBits >= 8 { + os.WriteByte(byte(v >> 56)) + v <<= 8 + numBits -= 8 + } + + for numBits > 0 { + os.WriteBit(Bit((v >> 63) & 1)) + v <<= 1 + numBits-- + } +} + +func (os *ostream) Discard() checked.Bytes { + os.repairCheckedBytes() + + buffer := os.checked + buffer.DecRef() + + os.rawBuffer = nil + os.pos = 0 + os.checked = nil + + return buffer +} + +func (os *ostream) Reset(buffer checked.Bytes) { + if os.checked != nil { + // Release ref of the current raw buffer + os.checked.DecRef() + os.checked.Finalize() + + os.rawBuffer = nil + os.checked = nil + } + + if buffer != nil { + // Track ref to the new raw buffer + buffer.IncRef() + + os.checked = buffer + os.rawBuffer = os.checked.Bytes() + } + + os.pos = 0 + if os.Len() > 0 { + // If the byte array passed in is not empty, we set + // pos to 8 indicating the last byte is fully used. + os.pos = 8 + } +} + +func (os *ostream) RawBytes() ([]byte, int) { + return os.rawBuffer, os.pos +} + +func (os *ostream) CheckedBytes() (checked.Bytes, int) { + return os.checked, os.pos +} + +// repairCheckedBytes makes sure that the checked.Bytes wraps the rawBuffer as +// they may have fallen out of sync during the writing process. +func (os *ostream) repairCheckedBytes() { + if os.checked != nil { + os.checked.Reset(os.rawBuffer) + } +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/buffer_decode.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/buffer_decode.go new file mode 100644 index 00000000..43334257 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/buffer_decode.go @@ -0,0 +1,291 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file is mostly copy-pasta from: https://github.com/jhump/protoreflect/blob/master/dynamic/codec.go +// since the jhump/protoreflect library does not expose the `codedBuffer` type. + +package proto + +import ( + "errors" + "fmt" + "io" + "math" +) + +var ( + // errOverflow is returned when an integer is too large to be represented. + errOverflow = errors.New("proto: integer overflow") +) + +// A reader/writer type that assists with decoding protobuf's binary representation. +// This code is largely a fork of proto.Buffer, which cannot be used because it has no exported +// field or method that provides access to its underlying reader index. +type buffer struct { + buf []byte + index int +} + +func newCodedBuffer(buf []byte) *buffer { + return &buffer{buf: buf} +} + +func (cb *buffer) reset(b []byte) { + cb.buf = b + cb.index = 0 +} + +func (cb *buffer) eof() bool { + return cb.index >= len(cb.buf) +} + +func (cb *buffer) skip(count int) (int, bool) { + newIndex := cb.index + count + if newIndex > len(cb.buf) { + return 0, false + } + cb.index = newIndex + return 0, true +} + +func (cb *buffer) decodeVarintSlow() (x uint64, err error) { + i := cb.index + l := len(cb.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := cb.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + cb.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (cb *buffer) decodeVarint() (uint64, error) { + i := cb.index + buf := cb.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + cb.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return cb.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x := uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + // x -= 0x80 << 63 // Always zero. + + return 0, errOverflow + +done: + cb.index = i + return x, nil +} + +func (cb *buffer) decodeTagAndWireType() (tag int32, wireType int8, err error) { + var v uint64 + v, err = cb.decodeVarint() + if err != nil { + return + } + // low 7 bits is wire type + wireType = int8(v & 7) + // rest is int32 tag number + v = v >> 3 + if v > math.MaxInt32 { + err = fmt.Errorf("tag number out of range: %d", v) + return + } + tag = int32(v) + return +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (cb *buffer) decodeFixed64() (x uint64, err error) { + // x, err already 0 + i := cb.index + 8 + if i < 0 || i > len(cb.buf) { + err = io.ErrUnexpectedEOF + return + } + cb.index = i + + x = uint64(cb.buf[i-8]) + x |= uint64(cb.buf[i-7]) << 8 + x |= uint64(cb.buf[i-6]) << 16 + x |= uint64(cb.buf[i-5]) << 24 + x |= uint64(cb.buf[i-4]) << 32 + x |= uint64(cb.buf[i-3]) << 40 + x |= uint64(cb.buf[i-2]) << 48 + x |= uint64(cb.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (cb *buffer) decodeFixed32() (x uint64, err error) { + // x, err already 0 + i := cb.index + 4 + if i < 0 || i > len(cb.buf) { + err = io.ErrUnexpectedEOF + return + } + cb.index = i + + x = uint64(cb.buf[i-4]) + x |= uint64(cb.buf[i-3]) << 8 + x |= uint64(cb.buf[i-2]) << 16 + x |= uint64(cb.buf[i-1]) << 24 + return +} + +func decodeZigZag32(v uint64) int32 { + return int32((uint32(v) >> 1) ^ uint32((int32(v&1)<<31)>>31)) +} + +func decodeZigZag64(v uint64) int64 { + return int64((v >> 1) ^ uint64((int64(v&1)<<63)>>63)) +} + +// These are not ValueDecoders: they produce an array of bytes or a string. +// bytes, embedded messages + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (cb *buffer) decodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := cb.decodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := cb.index + nb + if end < cb.index || end > len(cb.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + buf = cb.buf[cb.index:end] + cb.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, cb.buf[cb.index:]) + cb.index += nb + return +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/buffer_encode.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/buffer_encode.go new file mode 100644 index 00000000..09c0a035 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/buffer_encode.go @@ -0,0 +1,87 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file is mostly copy-pasta from: https://github.com/jhump/protoreflect/blob/master/dynamic/codec.go +// since the jhump/protoreflect library does not expose the `codedBuffer` type. + +package proto + +func (cb *buffer) encodeTagAndWireType(tag int32, wireType int8) { + v := uint64((int64(tag) << 3) | int64(wireType)) + cb.encodeVarint(v) +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (cb *buffer) encodeVarint(x uint64) { + for x >= 1<<7 { + cb.buf = append(cb.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + cb.buf = append(cb.buf, uint8(x)) +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (cb *buffer) encodeFixed64(x uint64) { + cb.buf = append(cb.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (cb *buffer) encodeFixed32(x uint32) { + cb.buf = append(cb.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (cb *buffer) encodeRawBytes(b []byte) { + cb.encodeVarint(uint64(len(b))) + cb.buf = append(cb.buf, b...) +} + +func (cb *buffer) append(b []byte) { + cb.buf = append(cb.buf, b...) +} + +func encodeZigZag32(v int32) uint64 { + return uint64((uint32(v) << 1) ^ uint32((v >> 31))) +} + +func encodeZigZag64(v int64) uint64 { + return (uint64(v) << 1) ^ uint64(v>>63) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/common.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/common.go new file mode 100644 index 00000000..bbe0d77f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/common.go @@ -0,0 +1,337 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package proto + +import ( + "reflect" + "sort" + + "github.com/m3db/m3/src/dbnode/encoding/m3tsz" + + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + "github.com/jhump/protoreflect/desc" +) + +// Schema represents a schema for a protobuf message. +type Schema *desc.MessageDescriptor + +const ( + // ~1GiB is an intentionally large number to avoid users ever running into any + // limitations, but we want some theoretical maximum so that in the case of data / memory + // corruption the iterator can avoid panicing due to trying to allocate a massive byte slice + // (MAX_UINT64 for example) and return a reasonable error message instead. + maxMarshalledProtoMessageSize = 2 << 29 + + // maxCustomFieldNum is included for the same rationale as maxMarshalledProtoMessageSize. + maxCustomFieldNum = 10000 + + protoFieldTypeNotFound dpb.FieldDescriptorProto_Type = -1 +) + +type customFieldType int8 + +const ( + // All the protobuf field types that we can perform custom encoding / + // compression on will get mapped to one of these types. This prevents + // us from having to reference the protobuf type all over the encoder + // and iterators and also simplifies the logic because the protobuf + // format has several instances of multiple types that we will treat the + // same. For example, in our encoding scheme the proto types: + // int32, sfixed32, and enums are all are treated as int32s and there + // is no reasonm to distinguish between them for the purposes of encoding + // and decoding. + notCustomEncodedField customFieldType = iota + signedInt64Field + signedInt32Field + unsignedInt64Field + unsignedInt32Field + float64Field + float32Field + bytesField + boolField + + numCustomTypes = 9 +) + +// -1 because iota's are zero-indexed so the highest value will be the number of +// custom types - 1. +var numBitsToEncodeCustomType = numBitsRequiredForNumUpToN(numCustomTypes - 1) + +const ( + // Single bit op codes that get encoded into the compressed stream and + // inform the iterator / decoder how it should interpret subsequent + // bits. + opCodeNoMoreDataOrTimeUnitChangeAndOrSchemaChange = 0 + opCodeMoreData = 1 + + opCodeNoMoreData = 0 + opCodeTimeUnitChangeAndOrSchemaChange = 1 + + opCodeTimeUnitUnchanged = 0 + opCodeTimeUnitChange = 1 + + opCodeSchemaUnchanged = 0 + opCodeSchemaChange = 1 + + opCodeNoChange = 0 + opCodeChange = 1 + + opCodeInterpretSubsequentBitsAsLRUIndex = 0 + opCodeInterpretSubsequentBitsAsBytesLengthVarInt = 1 + + opCodeNoFieldsSetToDefaultProtoMarshal = 0 + opCodeFieldsSetToDefaultProtoMarshal = 1 + + opCodeIntDeltaPositive = 0 + opCodeIntDeltaNegative = 1 + + opCodeBitsetValueIsNotSet = 0 + opCodeBitsetValueIsSet = 1 + + opCodeBoolTrue = 1 + opCodeBoolFalse = 0 +) + +var ( + typeOfBytes = reflect.TypeOf(([]byte)(nil)) + + // Maps protobuf types to our custom type as described above. + mapProtoTypeToCustomFieldType = map[dpb.FieldDescriptorProto_Type]customFieldType{ + dpb.FieldDescriptorProto_TYPE_DOUBLE: float64Field, + dpb.FieldDescriptorProto_TYPE_FLOAT: float32Field, + + dpb.FieldDescriptorProto_TYPE_INT64: signedInt64Field, + dpb.FieldDescriptorProto_TYPE_SFIXED64: signedInt64Field, + + dpb.FieldDescriptorProto_TYPE_UINT64: unsignedInt64Field, + dpb.FieldDescriptorProto_TYPE_FIXED64: unsignedInt64Field, + + dpb.FieldDescriptorProto_TYPE_INT32: signedInt32Field, + dpb.FieldDescriptorProto_TYPE_SFIXED32: signedInt32Field, + // Signed because thats how Proto encodes it (can technically have negative + // enum values but its not recommended for compression reasons). + dpb.FieldDescriptorProto_TYPE_ENUM: signedInt32Field, + + dpb.FieldDescriptorProto_TYPE_UINT32: unsignedInt32Field, + dpb.FieldDescriptorProto_TYPE_FIXED32: unsignedInt32Field, + + dpb.FieldDescriptorProto_TYPE_SINT32: signedInt32Field, + dpb.FieldDescriptorProto_TYPE_SINT64: signedInt64Field, + + dpb.FieldDescriptorProto_TYPE_STRING: bytesField, + dpb.FieldDescriptorProto_TYPE_BYTES: bytesField, + + dpb.FieldDescriptorProto_TYPE_BOOL: boolField, + } +) + +type marshalledField struct { + fieldNum int32 + marshalled []byte +} + +type sortedMarshalledFields []marshalledField + +// customFieldState is used to track any required state for encoding / decoding a single +// field in the encoder / iterator respectively. +type customFieldState struct { + // Bytes State. TODO(rartoul): Wrap this up in an encoderAndIterator like + // the floats and ints. + bytesFieldDict []encoderBytesFieldDictState + iteratorBytesFieldDict [][]byte + // Float state. Works as both an encoder and iterator (I.E the encoder calls + // the encode methods and the iterator calls the read methods). + floatEncAndIter m3tsz.FloatEncoderAndIterator + // Int state. + intEncAndIter intEncoderAndIterator + + fieldNum int + protoFieldType dpb.FieldDescriptorProto_Type + fieldType customFieldType +} + +type encoderBytesFieldDictState struct { + // We store the hash so we can perform fast equality checks, and + // we store the startPos + length so that when we have a value + // that matches a hash, we can be certain its not a hash collision + // by comparing the bytes against those we already wrote into the + // stream. + hash uint64 + startPos uint32 + length uint32 +} + +func newCustomFieldState( + fieldNum int, + protoFieldType dpb.FieldDescriptorProto_Type, + customFieldType customFieldType, +) customFieldState { + s := customFieldState{ + fieldNum: fieldNum, + fieldType: customFieldType, + protoFieldType: protoFieldType} + if isUnsignedInt(customFieldType) { + s.intEncAndIter.unsigned = true + } + return s +} + +// TODO(rartoul): Improve this function to be less naive and actually explore nested messages +// for fields that we can use our custom compression on: https://github.com/m3db/m3/issues/1471 +func customAndNonCustomFields( + customFields []customFieldState, + nonCustomFields []marshalledField, + schema *desc.MessageDescriptor, +) ([]customFieldState, []marshalledField) { + fields := schema.GetFields() + numCustomFields := numCustomFields(schema) + numNonCustomFields := len(fields) - numCustomFields + + if cap(customFields) >= numCustomFields { + for i := range customFields { + customFields[i] = customFieldState{} + } + customFields = customFields[:0] + } else { + customFields = make([]customFieldState, 0, numCustomFields) + } + + if cap(nonCustomFields) >= numNonCustomFields { + for i := range nonCustomFields { + nonCustomFields[i] = marshalledField{} + } + nonCustomFields = nonCustomFields[:0] + } else { + nonCustomFields = make([]marshalledField, 0, numNonCustomFields) + } + + var ( + prevFieldNum int32 = -1 + isSorted = true + ) + for _, field := range fields { + var ( + fieldType = field.GetType() + fieldNum = field.GetNumber() + ) + if fieldNum < prevFieldNum { + isSorted = false + } + + customFieldType, ok := isCustomField(fieldType, field.IsRepeated()) + if !ok { + nonCustomFields = append(nonCustomFields, marshalledField{fieldNum: fieldNum}) + continue + } + + fieldState := newCustomFieldState(int(fieldNum), fieldType, customFieldType) + customFields = append(customFields, fieldState) + } + + if !isSorted { + sort.Slice(customFields, func(a, b int) bool { + return customFields[a].fieldNum < customFields[b].fieldNum + }) + sort.Slice(nonCustomFields, func(a, b int) bool { + return nonCustomFields[a].fieldNum < nonCustomFields[b].fieldNum + }) + } + + return customFields, nonCustomFields +} + +func isCustomFloatEncodedField(t customFieldType) bool { + return t == float64Field || t == float32Field +} + +func isCustomIntEncodedField(t customFieldType) bool { + return t == signedInt64Field || + t == unsignedInt64Field || + t == signedInt32Field || + t == unsignedInt32Field +} + +func isUnsignedInt(t customFieldType) bool { + return t == unsignedInt64Field || t == unsignedInt32Field +} + +func numCustomFields(schema *desc.MessageDescriptor) int { + var ( + fields = schema.GetFields() + numCustomFields = 0 + ) + + for _, field := range fields { + if _, ok := isCustomField(field.GetType(), field.IsRepeated()); ok { + numCustomFields++ + } + } + + return numCustomFields +} + +func isCustomField(fieldType dpb.FieldDescriptorProto_Type, isRepeated bool) (customFieldType, bool) { + if isRepeated { + return -1, false + } + + customFieldType, ok := mapProtoTypeToCustomFieldType[fieldType] + return customFieldType, ok +} + +func fieldsContains(fieldNum int32, fields []*desc.FieldDescriptor) bool { + for _, field := range fields { + if field.GetNumber() == fieldNum { + return true + } + } + return false +} + +// numBitsRequiredForNumUpToN returns the number of bits that are required +// to represent all the possible numbers between 0 and n as a uint64. +// +// 4 --> 2 +// 8 --> 3 +// 16 --> 4 +// 32 --> 5 +// 64 --> 6 +// 128 --> 7 +func numBitsRequiredForNumUpToN(n int) int { + count := 0 + for n > 0 { + count++ + n = n >> 1 + } + return count +} + +func (m sortedMarshalledFields) Len() int { + return len(m) +} + +func (m sortedMarshalledFields) Less(i, j int) bool { + return m[i].fieldNum < m[j].fieldNum +} + +func (m sortedMarshalledFields) Swap(i, j int) { + m[i], m[j] = m[j], m[i] +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/custom_marshal.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/custom_marshal.go new file mode 100644 index 00000000..727b98c9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/custom_marshal.go @@ -0,0 +1,157 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package proto + +import ( + "math" + + "github.com/golang/protobuf/proto" +) + +// encoding methods correspond to the scalar types defined in the protobuf 3 +// specificaiton: https://developers.google.com/protocol-buffers/docs/proto3#scalar +type customFieldMarshaller interface { + encFloat64(tag int32, x float64) + encFloat32(tag int32, x float32) + encInt32(tag int32, x int32) + encSInt32(tag int32, x int32) + encSFixedInt32(tax int32, x int32) + encUInt32(tag int32, x uint32) + encInt64(tag int32, x int64) + encSInt64(tag int32, x int64) + encSFixedInt64(tax int32, x int64) + encUInt64(tag int32, x uint64) + encBool(tag int32, x bool) + encBytes(tag int32, x []byte) + + // Used in cases where marshalled protobuf bytes have already been generated + // and need to be appended to the stream. Assumes that the + // tuple has already been included. + encPartialProto(x []byte) + + bytes() []byte + reset() +} + +type customMarshaller struct { + buf *buffer +} + +func newCustomMarshaller() customFieldMarshaller { + return &customMarshaller{ + buf: newCodedBuffer(nil), + } +} + +func (m *customMarshaller) encFloat64(tag int32, x float64) { + if x == 0.0 { + // Default values are not included in the stream. + return + } + + m.buf.encodeTagAndWireType(tag, proto.WireFixed64) + m.buf.encodeFixed64(math.Float64bits(x)) +} + +func (m *customMarshaller) encFloat32(tag int32, x float32) { + if x == 0.0 { + // Default values are not included in the stream. + return + } + + m.buf.encodeTagAndWireType(tag, proto.WireFixed32) + m.buf.encodeFixed32(math.Float32bits(x)) +} + +func (m *customMarshaller) encBool(tag int32, x bool) { + if !x { + // Default values are not included in the stream. + return + } + + m.encUInt64(tag, 1) +} + +func (m *customMarshaller) encInt32(tag int32, x int32) { + m.encUInt64(tag, uint64(x)) +} + +func (m *customMarshaller) encSInt32(tag int32, x int32) { + m.encUInt64(tag, encodeZigZag32(x)) +} + +func (m *customMarshaller) encSFixedInt32(tag int32, x int32) { + m.buf.encodeTagAndWireType(tag, proto.WireFixed32) + m.buf.encodeFixed32(uint32(x)) +} + +func (m *customMarshaller) encUInt32(tag int32, x uint32) { + m.encUInt64(tag, uint64(x)) +} + +func (m *customMarshaller) encInt64(tag int32, x int64) { + m.encUInt64(tag, uint64(x)) +} + +func (m *customMarshaller) encSInt64(tag int32, x int64) { + m.encUInt64(tag, encodeZigZag64(x)) +} + +func (m *customMarshaller) encSFixedInt64(tag int32, x int64) { + m.buf.encodeTagAndWireType(tag, proto.WireFixed64) + m.buf.encodeFixed64(uint64(x)) +} + +func (m *customMarshaller) encUInt64(tag int32, x uint64) { + if x == 0 { + // Default values are not included in the stream. + return + } + + m.buf.encodeTagAndWireType(tag, proto.WireVarint) + m.buf.encodeVarint(x) +} + +func (m *customMarshaller) encBytes(tag int32, x []byte) { + if len(x) == 0 { + // Default values are not included in the stream. + return + } + + m.buf.encodeTagAndWireType(tag, proto.WireBytes) + m.buf.encodeRawBytes(x) +} + +func (m *customMarshaller) encPartialProto(x []byte) { + m.buf.append(x) +} + +func (m *customMarshaller) bytes() []byte { + return m.buf.buf +} + +func (m *customMarshaller) reset() { + b := m.buf.buf + if b != nil { + b = b[:0] + } + m.buf.reset(b) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/custom_unmarshal.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/custom_unmarshal.go new file mode 100644 index 00000000..309d9331 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/custom_unmarshal.go @@ -0,0 +1,438 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package proto + +import ( + "errors" + "fmt" + "math" + "sort" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + "github.com/jhump/protoreflect/desc" +) + +var ( + // Groups in the Protobuf wire format are deprecated, so simplify the code significantly by + // not supporting them. + errGroupsAreNotSupported = errors.New("use of groups in proto wire format is not supported") + zeroValue unmarshalValue +) + +type customFieldUnmarshaller interface { + sortedCustomFieldValues() sortedCustomFieldValues + sortedNonCustomFieldValues() sortedMarshalledFields + numNonCustomValues() int + resetAndUnmarshal(schema *desc.MessageDescriptor, buf []byte) error +} + +type customUnmarshallerOptions struct { + skipUnknownFields bool +} + +type customUnmarshaller struct { + schema *desc.MessageDescriptor + decodeBuf *buffer + customValues sortedCustomFieldValues + + nonCustomValues sortedMarshalledFields + numNonCustom int + + opts customUnmarshallerOptions +} + +func newCustomFieldUnmarshaller(opts customUnmarshallerOptions) customFieldUnmarshaller { + return &customUnmarshaller{ + decodeBuf: newCodedBuffer(nil), + opts: opts, + } +} + +func (u *customUnmarshaller) sortedCustomFieldValues() sortedCustomFieldValues { + return u.customValues +} + +func (u *customUnmarshaller) numNonCustomValues() int { + return u.numNonCustom +} + +func (u *customUnmarshaller) sortedNonCustomFieldValues() sortedMarshalledFields { + return u.nonCustomValues +} + +func (u *customUnmarshaller) unmarshal() error { + u.resetCustomAndNonCustomValues() + + var ( + areCustomValuesSorted = true + areNonCustomValuesSorted = true + ) + for !u.decodeBuf.eof() { + tagAndWireTypeStartOffset := u.decodeBuf.index + fieldNum, wireType, err := u.decodeBuf.decodeTagAndWireType() + if err != nil { + return err + } + + fd := u.schema.FindFieldByNumber(fieldNum) + if fd == nil { + if !u.opts.skipUnknownFields { + return fmt.Errorf("encountered unknown field with field number: %d", fieldNum) + } + + if _, err := u.skip(wireType); err != nil { + return err + } + continue + } + + if !u.isCustomField(fd) { + _, err = u.skip(wireType) + if err != nil { + return err + } + + var ( + startIdx = tagAndWireTypeStartOffset + endIdx = u.decodeBuf.index + marshalled = u.decodeBuf.buf[startIdx:endIdx] + ) + // A marshalled Protobuf message consists of a stream of + // tuples, all of which are optional, with no additional header or footer information. + // This means that each tuple within the stream can be thought of as its own complete + // marshalled message and as a result we can build up the []marshalledField one field at + // a time. + updatedExisting := false + if fd.IsRepeated() { + // If the fd is a repeated type and not using `packed` encoding then their could be multiple + // entries in the stream with the same field number so their marshalled bytes needs to be all + // concatenated together. + // + // NB(rartoul): This will have an adverse impact on the compression of map types because the + // key/val pairs can be encoded in any order. This means that its possible for two equivalent + // maps to have different byte streams which will force the encoder to re-encode the field into + // the stream even though it hasn't changed. This naive solution should be good enough for now, + // but if it proves problematic in the future the issue could be resolved by accumulating the + // marshalled tuples into a slice and then sorting by field number to produce a deterministic + // result such that equivalent maps always result in equivalent marshalled bytes slices. + for i, val := range u.nonCustomValues { + if fieldNum == val.fieldNum { + u.nonCustomValues[i].marshalled = append(u.nonCustomValues[i].marshalled, marshalled...) + updatedExisting = true + break + } + } + } + if !updatedExisting { + u.nonCustomValues = append(u.nonCustomValues, marshalledField{ + fieldNum: fieldNum, + marshalled: marshalled, + }) + } + + if areNonCustomValuesSorted && len(u.nonCustomValues) > 1 { + // Check if the slice is sorted as it's built to avoid resorting + // unnecessarily at the end. + lastFieldNum := u.nonCustomValues[len(u.nonCustomValues)-1].fieldNum + if fieldNum < lastFieldNum { + areNonCustomValuesSorted = false + } + } + + u.numNonCustom++ + continue + } + + value, err := u.unmarshalCustomField(fd, wireType) + if err != nil { + return err + } + + if areCustomValuesSorted && len(u.customValues) > 1 { + // Check if the slice is sorted as it's built to avoid resorting + // unnecessarily at the end. + lastFieldNum := u.customValues[len(u.customValues)-1].fieldNumber + if fieldNum < lastFieldNum { + areCustomValuesSorted = false + } + } + + u.customValues = append(u.customValues, value) + } + + u.decodeBuf.reset(u.decodeBuf.buf) + + // Avoid resorting if possible. + if !areCustomValuesSorted { + sort.Sort(u.customValues) + } + if !areNonCustomValuesSorted { + sort.Sort(u.nonCustomValues) + } + + return nil +} + +// isCustomField checks whether the encoder would have custom encoded this field or left +// it up to the `jhump/dynamic` package to handle the encoding. This is important because +// it allows us to use the efficient unmarshal path only for fields that the encoder can +// actually take advantage of. +func (u *customUnmarshaller) isCustomField(fd *desc.FieldDescriptor) bool { + if fd.IsRepeated() || fd.IsMap() { + // Map should always be repeated but include the guard just in case. + return false + } + + if fd.GetMessageType() != nil { + // Skip nested messages. + return false + } + + return true +} + +// skip will skip over the next value in the encoded stream (given that the tag and +// wiretype have already been decoded). +func (u *customUnmarshaller) skip(wireType int8) (int, error) { + switch wireType { + case proto.WireFixed32: + bytesSkipped := 4 + u.decodeBuf.index += bytesSkipped + return bytesSkipped, nil + + case proto.WireFixed64: + bytesSkipped := 8 + u.decodeBuf.index += bytesSkipped + return bytesSkipped, nil + + case proto.WireVarint: + var ( + bytesSkipped = 0 + offsetBeforeDecodeVarInt = u.decodeBuf.index + ) + _, err := u.decodeBuf.decodeVarint() + if err != nil { + return 0, err + } + bytesSkipped += u.decodeBuf.index - offsetBeforeDecodeVarInt + return bytesSkipped, nil + + case proto.WireBytes: + var ( + bytesSkipped = 0 + offsetBeforeDecodeRawBytes = u.decodeBuf.index + ) + // Bytes aren't copied because they're just being skipped over so + // copying would be wasteful. + _, err := u.decodeBuf.decodeRawBytes(false) + if err != nil { + return 0, err + } + bytesSkipped += u.decodeBuf.index - offsetBeforeDecodeRawBytes + return bytesSkipped, nil + + case proto.WireStartGroup: + return 0, errGroupsAreNotSupported + + case proto.WireEndGroup: + return 0, errGroupsAreNotSupported + + default: + return 0, proto.ErrInternalBadWireType + } +} + +func (u *customUnmarshaller) unmarshalCustomField(fd *desc.FieldDescriptor, wireType int8) (unmarshalValue, error) { + switch wireType { + case proto.WireFixed32: + num, err := u.decodeBuf.decodeFixed32() + if err != nil { + return zeroValue, err + } + return unmarshalSimpleField(fd, num) + + case proto.WireFixed64: + num, err := u.decodeBuf.decodeFixed64() + if err != nil { + return zeroValue, err + } + return unmarshalSimpleField(fd, num) + + case proto.WireVarint: + num, err := u.decodeBuf.decodeVarint() + if err != nil { + return zeroValue, err + } + return unmarshalSimpleField(fd, num) + + case proto.WireBytes: + if t := fd.GetType(); t != dpb.FieldDescriptorProto_TYPE_BYTES && + t != dpb.FieldDescriptorProto_TYPE_STRING { + // This should never happen since it means the skipping logic is not working + // correctly or the message is malformed since proto.WireBytes should only be + // used for fields of type bytes, string, group, or message. Groups/messages + // should be handled by the skipping logic (for now). + return zeroValue, fmt.Errorf( + "tried to unmarshal field with wire type: bytes and proto field type: %s", + fd.GetType().String()) + } + + // Don't bother copying the bytes now because the encoder has exclusive ownership + // of them until the call to Encode() completes and they will get "copied" anyways + // once they're written into the OStream. + raw, err := u.decodeBuf.decodeRawBytes(false) + if err != nil { + return zeroValue, err + } + + val := unmarshalValue{fieldNumber: fd.GetNumber(), bytes: raw} + return val, nil + + case proto.WireStartGroup: + return zeroValue, errGroupsAreNotSupported + + default: + return zeroValue, proto.ErrInternalBadWireType + } +} + +func unmarshalSimpleField(fd *desc.FieldDescriptor, v uint64) (unmarshalValue, error) { + fieldNum := fd.GetNumber() + val := unmarshalValue{fieldNumber: fieldNum, v: v} + switch fd.GetType() { + case dpb.FieldDescriptorProto_TYPE_BOOL, + dpb.FieldDescriptorProto_TYPE_UINT64, + dpb.FieldDescriptorProto_TYPE_FIXED64, + dpb.FieldDescriptorProto_TYPE_INT64, + dpb.FieldDescriptorProto_TYPE_SFIXED64, + dpb.FieldDescriptorProto_TYPE_DOUBLE: + return val, nil + + case dpb.FieldDescriptorProto_TYPE_UINT32, + dpb.FieldDescriptorProto_TYPE_FIXED32: + if v > math.MaxUint32 { + return zeroValue, fmt.Errorf("%d (field num %d) overflows uint32", v, fieldNum) + } + return val, nil + + case dpb.FieldDescriptorProto_TYPE_INT32, + dpb.FieldDescriptorProto_TYPE_ENUM: + s := int64(v) + if s > math.MaxInt32 { + return zeroValue, fmt.Errorf("%d (field num %d) overflows int32", v, fieldNum) + } + if s < math.MinInt32 { + return zeroValue, fmt.Errorf("%d (field num %d) underflows int32", v, fieldNum) + } + return val, nil + + case dpb.FieldDescriptorProto_TYPE_SFIXED32: + if v > math.MaxUint32 { + return zeroValue, fmt.Errorf("%d (field num %d) overflows int32", v, fieldNum) + } + return val, nil + + case dpb.FieldDescriptorProto_TYPE_SINT32: + if v > math.MaxUint32 { + return zeroValue, fmt.Errorf("%d (field num %d) overflows int32", v, fieldNum) + } + val.v = uint64(decodeZigZag32(v)) + return val, nil + + case dpb.FieldDescriptorProto_TYPE_SINT64: + val.v = uint64(decodeZigZag64(v)) + return val, nil + + case dpb.FieldDescriptorProto_TYPE_FLOAT: + if v > math.MaxUint32 { + return zeroValue, fmt.Errorf("%d (field num %d) overflows uint32", v, fieldNum) + } + float32Val := math.Float32frombits(uint32(v)) + float64Bits := math.Float64bits(float64(float32Val)) + val.v = float64Bits + return val, nil + + default: + // bytes, string, message, and group cannot be represented as a simple numeric value. + return zeroValue, fmt.Errorf("bad input; field %s requires length-delimited wire type", fd.GetFullyQualifiedName()) + } +} + +func (u *customUnmarshaller) resetAndUnmarshal(schema *desc.MessageDescriptor, buf []byte) error { + u.schema = schema + u.numNonCustom = 0 + u.resetCustomAndNonCustomValues() + u.decodeBuf.reset(buf) + return u.unmarshal() +} + +func (u *customUnmarshaller) resetCustomAndNonCustomValues() { + for i := range u.customValues { + u.customValues[i] = unmarshalValue{} + } + u.customValues = u.customValues[:0] + + for i := range u.nonCustomValues { + u.nonCustomValues[i] = marshalledField{} + } + u.nonCustomValues = u.nonCustomValues[:0] +} + +type sortedCustomFieldValues []unmarshalValue + +func (s sortedCustomFieldValues) Len() int { + return len(s) +} + +func (s sortedCustomFieldValues) Less(i, j int) bool { + return s[i].fieldNumber < s[j].fieldNumber +} + +func (s sortedCustomFieldValues) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +type unmarshalValue struct { + fieldNumber int32 + v uint64 + bytes []byte +} + +func (v *unmarshalValue) asBool() bool { + return v.v != 0 +} + +func (v *unmarshalValue) asUint64() uint64 { + return v.v +} + +func (v *unmarshalValue) asInt64() int64 { + return int64(v.v) +} + +func (v *unmarshalValue) asFloat64() float64 { + return math.Float64frombits(v.v) +} + +func (v *unmarshalValue) asBytes() []byte { + return v.bytes +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/encoder.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/encoder.go new file mode 100644 index 00000000..fdd8e533 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/encoder.go @@ -0,0 +1,935 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package proto + +import ( + "bytes" + "encoding/binary" + "fmt" + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/encoding/m3tsz" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/instrument" + xtime "github.com/m3db/m3/src/x/time" + + "github.com/cespare/xxhash/v2" + "github.com/jhump/protoreflect/desc" +) + +// Make sure encoder implements encoding.Encoder. +var _ encoding.Encoder = &Encoder{} + +const ( + currentEncodingSchemeVersion = 1 +) + +var ( + encErrPrefix = "proto encoder:" + errEncoderSchemaIsRequired = fmt.Errorf("%s schema is required", encErrPrefix) + errEncoderMessageHasUnknownFields = fmt.Errorf("%s message has unknown fields", encErrPrefix) + errEncoderClosed = fmt.Errorf("%s encoder is closed", encErrPrefix) + errNoEncodedDatapoints = fmt.Errorf("%s encoder has no encoded datapoints", encErrPrefix) +) + +// Encoder compresses arbitrary ProtoBuf streams given a schema. +type Encoder struct { + opts encoding.Options + + stream encoding.OStream + schemaDesc namespace.SchemaDescr + schema *desc.MessageDescriptor + + numEncoded int + lastEncodedDP ts.Datapoint + customFields []customFieldState + nonCustomFields []marshalledField + prevAnnotation ts.Annotation + + // Fields that are reused between function calls to + // avoid allocations. + varIntBuf [8]byte + fieldsChangedToDefault []int32 + marshalBuf []byte + + unmarshaller customFieldUnmarshaller + + hasEncodedSchema bool + closed bool + + stats encoderStats + timestampEncoder m3tsz.TimestampEncoder +} + +// EncoderStats contains statistics about the encoders compression performance. +type EncoderStats struct { + UncompressedBytes int + CompressedBytes int +} + +type encoderStats struct { + uncompressedBytes int +} + +func (s *encoderStats) IncUncompressedBytes(x int) { + s.uncompressedBytes += x +} + +// NewEncoder creates a new protobuf encoder. +func NewEncoder(start time.Time, opts encoding.Options) *Encoder { + initAllocIfEmpty := opts.EncoderPool() == nil + stream := encoding.NewOStream(nil, initAllocIfEmpty, opts.BytesPool()) + return &Encoder{ + opts: opts, + stream: stream, + timestampEncoder: m3tsz.NewTimestampEncoder( + start, opts.DefaultTimeUnit(), opts), + varIntBuf: [8]byte{}, + } +} + +// Encode encodes a timestamp and a protobuf message. The function signature is strange +// in order to implement the encoding.Encoder interface. It accepts a ts.Datapoint, but +// only the Timestamp field will be used, the Value field will be ignored and will always +// return 0 on subsequent iteration. In addition, the provided annotation is expected to +// be a marshalled protobuf message that matches the configured schema. +func (enc *Encoder) Encode(dp ts.Datapoint, timeUnit xtime.Unit, protoBytes ts.Annotation) error { + if unusableErr := enc.isUsable(); unusableErr != nil { + return unusableErr + } + + if enc.schema == nil { + // It is a programmatic error that schema is not set at all prior to encoding, panic to fix it asap. + return instrument.InvariantErrorf(errEncoderSchemaIsRequired.Error()) + } + + // Proto encoder value is meaningless, but make sure its always zero just to be safe so that + // it doesn't cause LastEncoded() to produce invalid results. + dp.Value = float64(0) + + if enc.unmarshaller == nil { + // Lazy init. + enc.unmarshaller = newCustomFieldUnmarshaller(customUnmarshallerOptions{}) + } + // resetAndUnmarshal before any data is written so that the marshalled message can be validated + // upfront, otherwise errors could be encountered mid-write leaving the stream in a corrupted state. + if err := enc.unmarshaller.resetAndUnmarshal(enc.schema, protoBytes); err != nil { + return fmt.Errorf( + "%s error unmarshalling message: %v", encErrPrefix, err) + } + + if enc.numEncoded == 0 { + enc.encodeStreamHeader() + } + + var ( + needToEncodeSchema = !enc.hasEncodedSchema + needToEncodeTimeUnit = timeUnit != enc.timestampEncoder.TimeUnit + ) + if needToEncodeSchema || needToEncodeTimeUnit { + enc.encodeSchemaAndOrTimeUnit(needToEncodeSchema, needToEncodeTimeUnit, timeUnit) + } else { + // Control bit that indicates the stream has more data but no time unit or schema changes. + enc.stream.WriteBit(opCodeMoreData) + } + + err := enc.timestampEncoder.WriteTime(enc.stream, dp.Timestamp, nil, timeUnit) + if err != nil { + return fmt.Errorf( + "%s error encoding timestamp: %v", encErrPrefix, err) + } + + if err := enc.encodeProto(protoBytes); err != nil { + return fmt.Errorf( + "%s error encoding proto portion of message: %v", encErrPrefix, err) + } + + enc.numEncoded++ + enc.lastEncodedDP = dp + enc.prevAnnotation = protoBytes + enc.stats.IncUncompressedBytes(len(protoBytes)) + return nil +} + +func (enc *Encoder) encodeSchemaAndOrTimeUnit( + needToEncodeSchema bool, + needToEncodeTimeUnit bool, + timeUnit xtime.Unit, +) { + // First bit means either there is no more data OR the time unit and/or schema has changed. + enc.stream.WriteBit(opCodeNoMoreDataOrTimeUnitChangeAndOrSchemaChange) + // Next bit means there is more data, but the time unit and/or schema has changed. + enc.stream.WriteBit(opCodeTimeUnitChangeAndOrSchemaChange) + + // Next bit is a boolean indicating whether the time unit has changed. + if needToEncodeTimeUnit { + enc.stream.WriteBit(opCodeTimeUnitChange) + } else { + enc.stream.WriteBit(opCodeTimeUnitUnchanged) + } + + // Next bit is a boolean indicating whether the schema has changed. + if needToEncodeSchema { + enc.stream.WriteBit(opCodeSchemaChange) + } else { + enc.stream.WriteBit(opCodeSchemaUnchanged) + } + + if needToEncodeTimeUnit { + // The encoder manages encoding time unit changes manually (instead of deferring to + // the timestamp encoder) because by default the WriteTime() API will use a marker + // encoding scheme that relies on looking ahead into the stream for bit combinations that + // could not possibly exist in the M3TSZ encoding scheme. + // The protobuf encoder can't rely on this behavior because its possible for the protobuf + // encoder to encode a legitimate bit combination that matches the "impossible" M3TSZ + // markers exactly. + enc.timestampEncoder.WriteTimeUnit(enc.stream, timeUnit) + } + + if needToEncodeSchema { + enc.encodeCustomSchemaTypes() + enc.hasEncodedSchema = true + } +} + +// Stream returns a copy of the underlying data stream. +func (enc *Encoder) Stream(ctx context.Context) (xio.SegmentReader, bool) { + seg := enc.segmentZeroCopy(ctx) + if seg.Len() == 0 { + return nil, false + } + + if readerPool := enc.opts.SegmentReaderPool(); readerPool != nil { + reader := readerPool.Get() + reader.Reset(seg) + return reader, true + } + return xio.NewSegmentReader(seg), true +} + +func (enc *Encoder) segmentZeroCopy(ctx context.Context) ts.Segment { + length := enc.stream.Len() + if enc.stream.Len() == 0 { + return ts.Segment{} + } + + // We need a tail to capture an immutable snapshot of the encoder data + // as the last byte can change after this method returns. + rawBuffer, _ := enc.stream.RawBytes() + lastByte := rawBuffer[length-1] + + // Take ref up to last byte. + headBytes := rawBuffer[:length-1] + + // Zero copy from the output stream. + var head checked.Bytes + if pool := enc.opts.CheckedBytesWrapperPool(); pool != nil { + head = pool.Get(headBytes) + } else { + head = checked.NewBytes(headBytes, nil) + } + + // Make sure the ostream bytes ref is delayed from finalizing + // until this operation is complete (since this is zero copy). + buffer, _ := enc.stream.CheckedBytes() + ctx.RegisterCloser(buffer.DelayFinalizer()) + + // Take a shared ref to a known good tail. + tail := tails[lastByte] + + // Only discard the head since tails are shared for process life time. + return ts.NewSegment(head, tail, 0, ts.FinalizeHead) +} + +func (enc *Encoder) segmentTakeOwnership() ts.Segment { + length := enc.stream.Len() + if length == 0 { + return ts.Segment{} + } + + // Take ref from the ostream. + head := enc.stream.Discard() + + return ts.NewSegment(head, nil, 0, ts.FinalizeHead) +} + +// NumEncoded returns the number of encoded messages. +func (enc *Encoder) NumEncoded() int { + return enc.numEncoded +} + +// LastEncoded returns the last encoded datapoint. Does not include +// annotation / protobuf message for interface purposes. +func (enc *Encoder) LastEncoded() (ts.Datapoint, error) { + if unusableErr := enc.isUsable(); unusableErr != nil { + return ts.Datapoint{}, unusableErr + } + + if enc.numEncoded == 0 { + return ts.Datapoint{}, errNoEncodedDatapoints + } + + // Value is meaningless for proto encoder and should already be zero, + // but set it again to be safe. + enc.lastEncodedDP.Value = 0 + return enc.lastEncodedDP, nil +} + +// LastAnnotation returns the last encoded annotation (which contain the bytes +// used for ProtoBuf data). +func (enc *Encoder) LastAnnotation() (ts.Annotation, error) { + if enc.numEncoded == 0 { + return nil, errNoEncodedDatapoints + } + + return enc.prevAnnotation, nil +} + +// Len returns the length of the data stream. +func (enc *Encoder) Len() int { + return enc.stream.Len() +} + +// Stats returns EncoderStats which contain statistics about the encoders compression +// ratio. +func (enc *Encoder) Stats() EncoderStats { + return EncoderStats{ + UncompressedBytes: enc.stats.uncompressedBytes, + CompressedBytes: enc.Len(), + } +} + +func (enc *Encoder) encodeStreamHeader() { + enc.encodeVarInt(currentEncodingSchemeVersion) + enc.encodeVarInt(uint64(enc.opts.ByteFieldDictionaryLRUSize())) +} + +func (enc *Encoder) encodeCustomSchemaTypes() { + if len(enc.customFields) == 0 { + enc.encodeVarInt(0) + return + } + + // Field numbers are 1-indexed so encoding the maximum field number + // at the beginning is equivalent to encoding the number of types + // we need to read after if we imagine that we're encoding a 1-indexed + // bitset where the position in the bitset encodes the field number (I.E + // the first value is the type for field number 1) and the values are + // the number of bits required to unique identify a custom type instead of + // just being a single bit (3 bits in the case of version 1 of the encoding + // scheme.) + maxFieldNum := enc.customFields[len(enc.customFields)-1].fieldNum + enc.encodeVarInt(uint64(maxFieldNum)) + + // Start at 1 because we're zero-indexed. + for i := 1; i <= maxFieldNum; i++ { + customTypeBits := uint64(notCustomEncodedField) + for _, customField := range enc.customFields { + if customField.fieldNum == i { + customTypeBits = uint64(customField.fieldType) + break + } + } + + enc.stream.WriteBits( + customTypeBits, + numBitsToEncodeCustomType) + } +} + +func (enc *Encoder) encodeProto(buf []byte) error { + var ( + sortedTopLevelScalarValues = enc.unmarshaller.sortedCustomFieldValues() + sortedTopLevelScalarValuesIdx = 0 + lastMarshalledValue unmarshalValue + ) + + // Loop through the customFields slice and sortedTopLevelScalarValues slice (both + // of which are sorted by field number) at the same time and match each customField + // to its encoded value in the stream (if any). + for i, customField := range enc.customFields { + if sortedTopLevelScalarValuesIdx < len(sortedTopLevelScalarValues) { + lastMarshalledValue = sortedTopLevelScalarValues[sortedTopLevelScalarValuesIdx] + } + + lastMarshalledValueFieldNumber := -1 + + hasNext := sortedTopLevelScalarValuesIdx < len(sortedTopLevelScalarValues) + if hasNext { + lastMarshalledValueFieldNumber = int(lastMarshalledValue.fieldNumber) + } + + // Since both the customFields slice and the sortedTopLevelScalarValues slice + // are sorted by field number, if the scalar slice contains no more values or + // it contains a next value, but the field number is not equal to the field number + // of the current customField, it is safe to conclude that the current customField's + // value was not encoded in this message which means that it should be interpreted + // as the default value for that field according to the proto3 specification. + noMarshalledValue := (!hasNext || + customField.fieldNum != lastMarshalledValueFieldNumber) + if noMarshalledValue { + err := enc.encodeZeroValue(i) + if err != nil { + return err + } + continue + } + + switch { + case isCustomFloatEncodedField(customField.fieldType): + enc.encodeTSZValue(i, lastMarshalledValue.asFloat64()) + + case isCustomIntEncodedField(customField.fieldType): + if isUnsignedInt(customField.fieldType) { + enc.encodeUnsignedIntValue(i, lastMarshalledValue.asUint64()) + } else { + enc.encodeSignedIntValue(i, lastMarshalledValue.asInt64()) + } + + case customField.fieldType == bytesField: + err := enc.encodeBytesValue(i, lastMarshalledValue.asBytes()) + if err != nil { + return err + } + + case customField.fieldType == boolField: + enc.encodeBoolValue(i, lastMarshalledValue.asBool()) + + default: + // This should never happen. + return fmt.Errorf( + "%s error no logic for custom encoding field number: %d", + encErrPrefix, customField.fieldNum) + } + + sortedTopLevelScalarValuesIdx++ + } + + if err := enc.encodeNonCustomValues(); err != nil { + return err + } + + return nil +} + +func (enc *Encoder) encodeZeroValue(i int) error { + customField := enc.customFields[i] + switch { + case isCustomFloatEncodedField(customField.fieldType): + var zeroFloat64 float64 + enc.encodeTSZValue(i, zeroFloat64) + return nil + + case isCustomIntEncodedField(customField.fieldType): + if isUnsignedInt(customField.fieldType) { + var zeroUInt64 uint64 + enc.encodeUnsignedIntValue(i, zeroUInt64) + } else { + var zeroInt64 int64 + enc.encodeSignedIntValue(i, zeroInt64) + } + return nil + + case customField.fieldType == bytesField: + var zeroBytes []byte + return enc.encodeBytesValue(i, zeroBytes) + + case customField.fieldType == boolField: + enc.encodeBoolValue(i, false) + return nil + + default: + // This should never happen. + return fmt.Errorf( + "%s error no logic for custom encoding field number: %d", + encErrPrefix, customField.fieldNum) + } +} + +// Reset resets the encoder for reuse. +func (enc *Encoder) Reset( + start time.Time, + capacity int, + descr namespace.SchemaDescr, +) { + enc.SetSchema(descr) + enc.reset(start, capacity) +} + +// SetSchema sets the schema for the encoder. +func (enc *Encoder) SetSchema(descr namespace.SchemaDescr) { + if descr == nil { + enc.schemaDesc = nil + enc.resetSchema(nil) + return + } + + // Noop if schema has not changed. + if enc.schemaDesc != nil && len(descr.DeployId()) != 0 && enc.schemaDesc.DeployId() == descr.DeployId() { + return + } + + enc.schemaDesc = descr + enc.resetSchema(descr.Get().MessageDescriptor) +} + +func (enc *Encoder) reset(start time.Time, capacity int) { + enc.stream.Reset(enc.newBuffer(capacity)) + enc.timestampEncoder = m3tsz.NewTimestampEncoder( + start, enc.opts.DefaultTimeUnit(), enc.opts) + enc.lastEncodedDP = ts.Datapoint{} + + // Prevent this from growing too large and remaining in the pools. + enc.marshalBuf = nil + + if enc.schema != nil { + enc.customFields, enc.nonCustomFields = customAndNonCustomFields(enc.customFields, enc.nonCustomFields, enc.schema) + } + + enc.closed = false + enc.numEncoded = 0 +} + +func (enc *Encoder) resetSchema(schema *desc.MessageDescriptor) { + enc.schema = schema + if enc.schema == nil { + // Clear but don't set to nil so they don't need to be reallocated + // next time. + customFields := enc.customFields + for i := range customFields { + customFields[i] = customFieldState{} + } + enc.customFields = customFields[:0] + + nonCustomFields := enc.nonCustomFields + for i := range nonCustomFields { + nonCustomFields[i] = marshalledField{} + } + enc.nonCustomFields = nonCustomFields[:0] + return + } + + enc.customFields, enc.nonCustomFields = customAndNonCustomFields(enc.customFields, enc.nonCustomFields, enc.schema) + enc.hasEncodedSchema = false +} + +// Close closes the encoder. +func (enc *Encoder) Close() { + if enc.closed { + return + } + + enc.Reset(time.Time{}, 0, nil) + enc.stream.Reset(nil) + enc.closed = true + + if pool := enc.opts.EncoderPool(); pool != nil { + pool.Put(enc) + } +} + +// Discard closes the encoder and transfers ownership of the data stream to +// the caller. +func (enc *Encoder) Discard() ts.Segment { + segment := enc.segmentTakeOwnership() + // Close the encoder since its no longer needed + enc.Close() + return segment +} + +// DiscardReset does the same thing as Discard except it also resets the encoder +// for reuse. +func (enc *Encoder) DiscardReset(start time.Time, capacity int, descr namespace.SchemaDescr) ts.Segment { + segment := enc.segmentTakeOwnership() + enc.Reset(start, capacity, descr) + return segment +} + +// Bytes returns the raw bytes of the underlying data stream. Does not +// transfer ownership and is generally unsafe. +func (enc *Encoder) Bytes() ([]byte, error) { + if unusableErr := enc.isUsable(); unusableErr != nil { + return nil, unusableErr + } + + bytes, _ := enc.stream.RawBytes() + return bytes, nil +} + +func (enc *Encoder) encodeTSZValue(i int, val float64) { + enc.customFields[i].floatEncAndIter.WriteFloat(enc.stream, val) +} + +func (enc *Encoder) encodeSignedIntValue(i int, val int64) { + enc.customFields[i].intEncAndIter.encodeSignedIntValue(enc.stream, val) +} + +func (enc *Encoder) encodeUnsignedIntValue(i int, val uint64) { + enc.customFields[i].intEncAndIter.encodeUnsignedIntValue(enc.stream, val) +} + +func (enc *Encoder) encodeBytesValue(i int, val []byte) error { + var ( + customField = enc.customFields[i] + hash = xxhash.Sum64(val) + numPreviousBytes = len(customField.bytesFieldDict) + lastStateIdx = numPreviousBytes - 1 + lastState encoderBytesFieldDictState + ) + if numPreviousBytes > 0 { + lastState = customField.bytesFieldDict[lastStateIdx] + } + + if numPreviousBytes > 0 && hash == lastState.hash { + streamBytes, _ := enc.stream.RawBytes() + match, err := enc.bytesMatchEncodedDictionaryValue( + streamBytes, lastState, val) + if err != nil { + return fmt.Errorf( + "%s error checking if bytes match last encoded dictionary bytes: %v", + encErrPrefix, err) + } + if match { + // No changes control bit. + enc.stream.WriteBit(opCodeNoChange) + return nil + } + } + + // Bytes changed control bit. + enc.stream.WriteBit(opCodeChange) + + streamBytes, _ := enc.stream.RawBytes() + for j, state := range customField.bytesFieldDict { + if hash != state.hash { + continue + } + + match, err := enc.bytesMatchEncodedDictionaryValue( + streamBytes, state, val) + if err != nil { + return fmt.Errorf( + "%s error checking if bytes match encoded dictionary bytes: %v", + encErrPrefix, err) + } + if !match { + continue + } + + // Control bit means interpret next n bits as the index for the previous write + // that this matches where n is the number of bits required to represent all + // possible array indices in the configured LRU size. + enc.stream.WriteBit(opCodeInterpretSubsequentBitsAsLRUIndex) + enc.stream.WriteBits( + uint64(j), + numBitsRequiredForNumUpToN( + enc.opts.ByteFieldDictionaryLRUSize())) + enc.moveToEndOfBytesDict(i, j) + return nil + } + + // Control bit means interpret subsequent bits as varInt encoding length of a new + // []byte we haven't seen before. + enc.stream.WriteBit(opCodeInterpretSubsequentBitsAsBytesLengthVarInt) + + length := len(val) + enc.encodeVarInt(uint64(length)) + + // Add padding bits until we reach the next byte. This ensures that the startPos + // that we're going to store in the dictionary LRU will be aligned on a physical + // byte boundary which makes retrieving the bytes again later for comparison much + // easier. + // + // Note that this will waste up to a maximum of 7 bits per []byte that we encode + // which is acceptable for now, but in the future we may want to make the code able + // to do the comparison even if the bytes aren't aligned on a byte boundary in order + // to improve the compression. + // + // Also this implementation had the side-effect of making encoding and decoding of + // []byte values much faster because for long []byte the encoder and iterator can avoid + // bit manipulation and calling WriteByte() / ReadByte() in a loop and can instead read the + // entire []byte in one go. + enc.padToNextByte() + + // Track the byte position we're going to start at so we can store it in the LRU after. + streamBytes, _ = enc.stream.RawBytes() + bytePos := len(streamBytes) + + // Write the actual bytes. + enc.stream.WriteBytes(val) + + enc.addToBytesDict(i, encoderBytesFieldDictState{ + hash: hash, + startPos: uint32(bytePos), + length: uint32(length), + }) + return nil +} + +func (enc *Encoder) encodeBoolValue(i int, val bool) { + if val { + enc.stream.WriteBit(opCodeBoolTrue) + } else { + enc.stream.WriteBit(opCodeBoolFalse) + } +} + +func (enc *Encoder) encodeNonCustomValues() error { + if len(enc.nonCustomFields) == 0 { + // Fast path, skip all the encoding logic entirely because there are + // no fields that require proto encoding. + // TODO(rartoul): Note that the encoding scheme could be further optimized + // such that if there are no fields that require proto encoding then we don't + // need to waste this bit per write. + enc.stream.WriteBit(opCodeNoChange) + return nil + } + + // Reset for re-use. + enc.fieldsChangedToDefault = enc.fieldsChangedToDefault[:0] + + var ( + incomingNonCustomFields = enc.unmarshaller.sortedNonCustomFieldValues() + // Matching entries in two sorted lists in which every element in each list is unique so keep + // track of the last index at which a match was found so that subsequent inner loops can start + // at the next index. + lastMatchIdx = -1 + numChangedValues = 0 + ) + enc.marshalBuf = enc.marshalBuf[:0] // Reset buf for reuse. + + for i, existingField := range enc.nonCustomFields { + var curVal []byte + for i := lastMatchIdx + 1; i < len(incomingNonCustomFields); i++ { + incomingField := incomingNonCustomFields[i] + if existingField.fieldNum == incomingField.fieldNum { + curVal = incomingField.marshalled + lastMatchIdx = i + break + } + } + + prevVal := existingField.marshalled + if bytes.Equal(prevVal, curVal) { + // No change, nothing to encode. + continue + } + + numChangedValues++ + if curVal == nil { + // Interpret as default value. + enc.fieldsChangedToDefault = append(enc.fieldsChangedToDefault, existingField.fieldNum) + } + enc.marshalBuf = append(enc.marshalBuf, curVal...) + + // Need to copy since the encoder no longer owns the original source of the bytes once + // this function returns. + enc.nonCustomFields[i].marshalled = append(enc.nonCustomFields[i].marshalled[:0], curVal...) + } + + if numChangedValues <= 0 { + // Only want to skip encoding if nothing has changed AND we've already + // encoded the first message. + enc.stream.WriteBit(opCodeNoChange) + return nil + } + + // Control bit indicating that proto values have changed. + enc.stream.WriteBit(opCodeChange) + if len(enc.fieldsChangedToDefault) > 0 { + // Control bit indicating that some fields have been set to default values + // and that a bitset will follow specifying which fields have changed. + enc.stream.WriteBit(opCodeFieldsSetToDefaultProtoMarshal) + enc.encodeBitset(enc.fieldsChangedToDefault) + } else { + // Control bit indicating that none of the changed fields have been set to + // their default values so we can do a clean merge on read. + enc.stream.WriteBit(opCodeNoFieldsSetToDefaultProtoMarshal) + } + + // This wastes up to 7 bits of space per encoded message but significantly improves encoding and + // decoding speed due to the fact that the OStream and IStream can write and read the data with + // the equivalent of one memcpy as opposed to having to decode one byte at a time due to lack + // of alignment. + enc.padToNextByte() + enc.encodeVarInt(uint64(len(enc.marshalBuf))) + enc.stream.WriteBytes(enc.marshalBuf) + + return nil +} + +func (enc *Encoder) isUsable() error { + if enc.closed { + return errEncoderClosed + } + + return nil +} + +func (enc *Encoder) bytesMatchEncodedDictionaryValue( + streamBytes []byte, + dictState encoderBytesFieldDictState, + currBytes []byte, +) (bool, error) { + var ( + prevEncodedBytesStart = dictState.startPos + prevEncodedBytesEnd = prevEncodedBytesStart + dictState.length + ) + + if prevEncodedBytesEnd > uint32(len(streamBytes)) { + // Should never happen. + return false, fmt.Errorf( + "bytes position in LRU is outside of stream bounds, streamSize: %d, startPos: %d, length: %d", + len(streamBytes), prevEncodedBytesStart, dictState.length) + } + + return bytes.Equal(streamBytes[prevEncodedBytesStart:prevEncodedBytesEnd], currBytes), nil +} + +// padToNextByte will add padding bits in the current byte until the ostream +// reaches the beginning of the next byte. This allows us begin encoding data +// with the guarantee that we're aligned at a physical byte boundary. +func (enc *Encoder) padToNextByte() { + _, bitPos := enc.stream.RawBytes() + for bitPos%8 != 0 { + enc.stream.WriteBit(0) + bitPos++ + } +} + +func (enc *Encoder) moveToEndOfBytesDict(fieldIdx, i int) { + existing := enc.customFields[fieldIdx].bytesFieldDict + for j := i; j < len(existing); j++ { + nextIdx := j + 1 + if nextIdx >= len(existing) { + break + } + + currVal := existing[j] + nextVal := existing[nextIdx] + existing[j] = nextVal + existing[nextIdx] = currVal + } +} + +func (enc *Encoder) addToBytesDict(fieldIdx int, state encoderBytesFieldDictState) { + existing := enc.customFields[fieldIdx].bytesFieldDict + if len(existing) < enc.opts.ByteFieldDictionaryLRUSize() { + enc.customFields[fieldIdx].bytesFieldDict = append(existing, state) + return + } + + // Shift everything down 1 and replace the last value to evict the + // least recently used entry and add the newest one. + // [1,2,3] + // becomes + // [2,3,3] + // after shift, and then becomes + // [2,3,4] + // after replacing the last value. + for i := range existing { + nextIdx := i + 1 + if nextIdx >= len(existing) { + break + } + + existing[i] = existing[nextIdx] + } + + existing[len(existing)-1] = state +} + +// encodeBitset writes out a bitset in the form of: +// +// varint(number of bits)|bitset +// +// I.E first it encodes a varint which specifies the number of following +// bits to interpret as a bitset and then it encodes the provided values +// as zero-indexed bitset. +func (enc *Encoder) encodeBitset(values []int32) { + var max int32 + for _, v := range values { + if v > max { + max = v + } + } + + // Encode a varint that indicates how many of the remaining + // bits to interpret as a bitset. + enc.encodeVarInt(uint64(max)) + + // Encode the bitset + for i := int32(0); i < max; i++ { + wroteExists := false + + for _, v := range values { + // Subtract one because the values are 1-indexed but the bitset + // is 0-indexed. + if i == v-1 { + enc.stream.WriteBit(opCodeBitsetValueIsSet) + wroteExists = true + break + } + } + + if wroteExists { + continue + } + + enc.stream.WriteBit(opCodeBitsetValueIsNotSet) + } +} + +func (enc *Encoder) encodeVarInt(x uint64) { + var ( + // Convert array to slice we can reuse the buffer. + buf = enc.varIntBuf[:] + numBytes = binary.PutUvarint(buf, x) + ) + + // Reslice so we only write out as many bytes as is required + // to represent the number. + buf = buf[:numBytes] + enc.stream.WriteBytes(buf) +} + +func (enc *Encoder) newBuffer(capacity int) checked.Bytes { + if bytesPool := enc.opts.BytesPool(); bytesPool != nil { + return bytesPool.Get(capacity) + } + return checked.NewBytes(make([]byte, 0, capacity), nil) +} + +// tails is a list of all possible tails based on the +// byte value of the last byte. For the proto encoder +// they are all the same. +var tails [256]checked.Bytes + +func init() { + for i := 0; i < 256; i++ { + tails[i] = checked.NewBytes([]byte{byte(i)}, nil) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/equal.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/equal.go new file mode 100644 index 00000000..7619edfd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/equal.go @@ -0,0 +1,175 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package proto + +import ( + "bytes" + "fmt" + "reflect" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + "github.com/jhump/protoreflect/desc" + "github.com/jhump/protoreflect/dynamic" +) + +// isDefaultValue returns whether the provided value is the same as the default value for +// a given field. For the most part we can rely on the fieldsEqual function and the +// GetDefaultValue() method on the field descriptor, but repeated, map and nested message +// fields require slightly more care. +func isDefaultValue(field *desc.FieldDescriptor, curVal interface{}) (bool, error) { + if field.IsMap() { + // If its a repeated field then its a default value if it looks like a zero-length slice. + mapVal, ok := curVal.(map[interface{}]interface{}) + if !ok { + // Should never happen. + return false, fmt.Errorf("current value for repeated field: %s wasn't a slice", field.String()) + } + + return len(mapVal) == 0, nil + } + + if field.IsRepeated() { + // If its a repeated field then its a default value if it looks like a zero-length slice. + sliceVal, ok := curVal.([]interface{}) + if !ok { + // Should never happen. + return false, fmt.Errorf("current value for repeated field: %s wasn't a slice", field.String()) + } + + return len(sliceVal) == 0, nil + } + + if field.GetType() == dpb.FieldDescriptorProto_TYPE_MESSAGE { + // If its a nested message then its a default value if it looks the same as a new + // empty message with the same schema. + messageSchema := field.GetMessageType() + // TODO(rartoul): Don't allocate new message. + return fieldsEqual(dynamic.NewMessage(messageSchema), curVal), nil + } + + return fieldsEqual(field.GetDefaultValue(), curVal), nil +} + +// Mostly copy-pasta of a non-exported helper method from the protoreflect +// library. +// https://github.com/jhump/protoreflect/blob/87f824e0b908132b2501fe5652f8ee75a2e8cf06/dynamic/equal.go#L60 +func fieldsEqual(aVal, bVal interface{}) bool { + // Handle nil cases first since reflect.ValueOf will not handle untyped + // nils gracefully. + if aVal == nil && bVal == nil { + return true + } + if aVal == nil || bVal == nil { + return false + } + + arv := reflect.ValueOf(aVal) + brv := reflect.ValueOf(bVal) + if arv.Type() != brv.Type() { + // it is possible that one is a dynamic message and one is not + apm, ok := aVal.(proto.Message) + if !ok { + return false + } + bpm, ok := bVal.(proto.Message) + if !ok { + return false + } + if !dynamic.MessagesEqual(apm, bpm) { + return false + } + } else { + switch arv.Kind() { + case reflect.Ptr: + apm, ok := aVal.(proto.Message) + if !ok { + // Don't know how to compare pointer values that aren't messages! + // Maybe this should panic? + return false + } + bpm := bVal.(proto.Message) // we know it will succeed because we know a and b have same type + if !dynamic.MessagesEqual(apm, bpm) { + return false + } + case reflect.Map: + if !mapsEqual(arv, brv) { + return false + } + + case reflect.Slice: + if arv.Type() == typeOfBytes { + if !bytes.Equal(aVal.([]byte), bVal.([]byte)) { + return false + } + } else { + if !slicesEqual(arv, brv) { + return false + } + } + + default: + if aVal != bVal { + return false + } + } + } + + return true +} + +func mapsEqual(a, b reflect.Value) bool { + if a.Len() != b.Len() { + return false + } + + if a.Len() == 0 && b.Len() == 0 { + // Optimize the case where maps are frequently empty because MapKeys() + // function allocates heavily. + return true + } + + for _, k := range a.MapKeys() { + av := a.MapIndex(k) + bv := b.MapIndex(k) + if !bv.IsValid() { + return false + } + if !fieldsEqual(av.Interface(), bv.Interface()) { + return false + } + } + return true +} + +func slicesEqual(a, b reflect.Value) bool { + if a.Len() != b.Len() { + return false + } + for i := 0; i < a.Len(); i++ { + ai := a.Index(i) + bi := b.Index(i) + if !fieldsEqual(ai.Interface(), bi.Interface()) { + return false + } + } + return true +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/int_encoder_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/int_encoder_iterator.go new file mode 100644 index 00000000..53dc4074 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/int_encoder_iterator.go @@ -0,0 +1,260 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package proto + +import ( + "fmt" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/encoding/m3tsz" +) + +const ( + opcodeZeroSig = 0x0 +) + +type intEncoderAndIterator struct { + prevIntBits uint64 + intSigBitsTracker m3tsz.IntSigBitsTracker + unsigned bool + hasEncodedFirst bool +} + +func (eit *intEncoderAndIterator) encodeSignedIntValue(stream encoding.OStream, v int64) { + if eit.hasEncodedFirst { + eit.encodeNextSignedIntValue(stream, v) + } else { + eit.encodeFirstSignedIntValue(stream, v) + eit.hasEncodedFirst = true + } +} + +func (eit *intEncoderAndIterator) encodeUnsignedIntValue(stream encoding.OStream, v uint64) { + if eit.hasEncodedFirst { + eit.encodeNextUnsignedIntValue(stream, v) + } else { + eit.encodeFirstUnsignedIntValue(stream, v) + eit.hasEncodedFirst = true + } +} + +func (eit *intEncoderAndIterator) encodeFirstSignedIntValue(stream encoding.OStream, v int64) { + neg := false + eit.prevIntBits = uint64(v) + if v < 0 { + neg = true + v = -1 * v + } + + vBits := uint64(v) + numSig := encoding.NumSig(vBits) + + eit.intSigBitsTracker.WriteIntSig(stream, numSig) + eit.encodeIntValDiff(stream, vBits, neg, numSig) +} + +func (eit *intEncoderAndIterator) encodeFirstUnsignedIntValue(stream encoding.OStream, v uint64) { + eit.prevIntBits = v + + numSig := encoding.NumSig(v) + eit.intSigBitsTracker.WriteIntSig(stream, numSig) + eit.encodeIntValDiff(stream, v, false, numSig) +} + +func (eit *intEncoderAndIterator) encodeNextSignedIntValue(stream encoding.OStream, next int64) { + prev := int64(eit.prevIntBits) + diff := next - prev + if diff == 0 { + stream.WriteBit(opCodeNoChange) + return + } + + stream.WriteBit(opCodeChange) + + neg := false + if diff < 0 { + neg = true + diff = -1 * diff + } + + var ( + diffBits = uint64(diff) + numSig = encoding.NumSig(diffBits) + newSig = eit.intSigBitsTracker.TrackNewSig(numSig) + ) + + eit.intSigBitsTracker.WriteIntSig(stream, newSig) + eit.encodeIntValDiff(stream, diffBits, neg, newSig) + eit.prevIntBits = uint64(next) +} + +func (eit *intEncoderAndIterator) encodeNextUnsignedIntValue(stream encoding.OStream, next uint64) { + var ( + neg = false + prev = eit.prevIntBits + diff uint64 + ) + + // Avoid overflows. + if next > prev { + diff = next - prev + } else { + neg = true + diff = prev - next + } + + if diff == 0 { + stream.WriteBit(opCodeNoChange) + return + } + + stream.WriteBit(opCodeChange) + + numSig := encoding.NumSig(diff) + newSig := eit.intSigBitsTracker.TrackNewSig(numSig) + + eit.intSigBitsTracker.WriteIntSig(stream, newSig) + eit.encodeIntValDiff(stream, diff, neg, newSig) + eit.prevIntBits = next +} + +func (eit *intEncoderAndIterator) encodeIntValDiff(stream encoding.OStream, valBits uint64, neg bool, numSig uint8) { + if neg { + // opCodeNegative + stream.WriteBit(opCodeIntDeltaNegative) + } else { + // opCodePositive + stream.WriteBit(opCodeIntDeltaPositive) + } + + stream.WriteBits(valBits, int(numSig)) +} + +func (eit *intEncoderAndIterator) readIntValue(stream encoding.IStream) error { + if eit.hasEncodedFirst { + changeExistsControlBit, err := stream.ReadBit() + if err != nil { + return fmt.Errorf( + "%s: error trying to read int change exists control bit: %v", + itErrPrefix, err) + } + + if changeExistsControlBit == opCodeNoChange { + // No change. + return nil + } + } + + if err := eit.readIntSig(stream); err != nil { + return fmt.Errorf( + "%s error trying to read number of significant digits: %v", + itErrPrefix, err) + } + + if err := eit.readIntValDiff(stream); err != nil { + return fmt.Errorf( + "%s error trying to read int diff: %v", + itErrPrefix, err) + } + + if !eit.hasEncodedFirst { + eit.hasEncodedFirst = true + } + + return nil +} + +func (eit *intEncoderAndIterator) readIntSig(stream encoding.IStream) error { + updateControlBit, err := stream.ReadBit() + if err != nil { + return fmt.Errorf( + "%s error reading int significant digits update control bit: %v", + itErrPrefix, err) + } + if updateControlBit == opCodeNoChange { + // No change. + return nil + } + + sigDigitsControlBit, err := stream.ReadBit() + if err != nil { + return fmt.Errorf( + "%s error reading zero significant digits control bit: %v", + itErrPrefix, err) + } + if sigDigitsControlBit == m3tsz.OpcodeZeroSig { + eit.intSigBitsTracker.NumSig = 0 + } else { + numSigBits, err := stream.ReadBits(6) + if err != nil { + return fmt.Errorf( + "%s error reading number of significant digits: %v", + itErrPrefix, err) + } + + eit.intSigBitsTracker.NumSig = uint8(numSigBits) + 1 + } + + return nil +} + +func (eit *intEncoderAndIterator) readIntValDiff(stream encoding.IStream) error { + negativeControlBit, err := stream.ReadBit() + if err != nil { + return fmt.Errorf( + "%s error reading negative control bit: %v", + itErrPrefix, err) + } + + numSig := uint(eit.intSigBitsTracker.NumSig) + diffSigBits, err := stream.ReadBits(numSig) + if err != nil { + return fmt.Errorf( + "%s error reading significant digits: %v", + itErrPrefix, err) + } + + if eit.unsigned { + diff := diffSigBits + shouldSubtract := false + if negativeControlBit == opCodeIntDeltaNegative { + shouldSubtract = true + } + + prev := eit.prevIntBits + if shouldSubtract { + eit.prevIntBits = prev - diff + } else { + eit.prevIntBits = prev + diff + } + } else { + diff := int64(diffSigBits) + sign := int64(1) + if negativeControlBit == opCodeIntDeltaNegative { + sign = -1.0 + } + + prev := int64(eit.prevIntBits) + eit.prevIntBits = uint64(prev + (sign * diff)) + } + + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/iterator.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/iterator.go new file mode 100644 index 00000000..54dbb68e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/iterator.go @@ -0,0 +1,915 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package proto + +import ( + "encoding/binary" + "fmt" + "io" + "math" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/encoding/m3tsz" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + xtime "github.com/m3db/m3/src/x/time" + + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + "github.com/jhump/protoreflect/desc" +) + +const ( + // Maximum capacity of a checked.Bytes that will be retained between resets. + maxCapacityUnmarshalBufferRetain = 1024 +) + +var ( + itErrPrefix = "proto iterator:" + errIteratorSchemaIsRequired = fmt.Errorf("%s schema is required", itErrPrefix) +) + +type iterator struct { + nsID ident.ID + opts encoding.Options + err error + schema *desc.MessageDescriptor + schemaDesc namespace.SchemaDescr + stream encoding.IStream + marshaller customFieldMarshaller + byteFieldDictLRUSize int + // TODO(rartoul): Update these as we traverse the stream if we encounter + // a mid-stream schema change: https://github.com/m3db/m3/issues/1471 + customFields []customFieldState + nonCustomFields []marshalledField + + tsIterator m3tsz.TimestampIterator + + // Fields that are reused between function calls to + // avoid allocations. + varIntBuf [8]byte + bitsetValues []int + unmarshalProtoBuf checked.Bytes + unmarshaller customFieldUnmarshaller + + consumedFirstMessage bool + done bool + closed bool +} + +// NewIterator creates a new iterator. +func NewIterator( + reader io.Reader, + descr namespace.SchemaDescr, + opts encoding.Options, +) encoding.ReaderIterator { + stream := encoding.NewIStream(reader, opts.IStreamReaderSizeProto()) + + i := &iterator{ + opts: opts, + stream: stream, + marshaller: newCustomMarshaller(), + tsIterator: m3tsz.NewTimestampIterator(opts, true), + } + i.resetSchema(descr) + return i +} + +func (it *iterator) Next() bool { + if it.schema == nil { + // It is a programmatic error that schema is not set at all prior to iterating, panic to fix it asap. + it.err = instrument.InvariantErrorf(errIteratorSchemaIsRequired.Error()) + return false + } + + if !it.hasNext() { + return false + } + + it.marshaller.reset() + + if !it.consumedFirstMessage { + if err := it.readStreamHeader(); err != nil { + it.err = fmt.Errorf( + "%s error reading stream header: %v", + itErrPrefix, err) + return false + } + } + + moreDataControlBit, err := it.stream.ReadBit() + if err == io.EOF { + it.done = true + return false + } + if err != nil { + it.err = fmt.Errorf( + "%s error reading more data control bit: %v", + itErrPrefix, err) + return false + } + + if moreDataControlBit == opCodeNoMoreDataOrTimeUnitChangeAndOrSchemaChange { + // The next bit will tell us whether we've reached the end of the stream + // or that the time unit and/or schema has changed. + noMoreDataControlBit, err := it.stream.ReadBit() + if err == io.EOF { + it.done = true + return false + } + if err != nil { + it.err = fmt.Errorf( + "%s error reading no more data control bit: %v", + itErrPrefix, err) + return false + } + + if noMoreDataControlBit == opCodeNoMoreData { + it.done = true + return false + } + + // The next bit will tell us whether the time unit has changed. + timeUnitHasChangedControlBit, err := it.stream.ReadBit() + if err != nil { + it.err = fmt.Errorf( + "%s error reading time unit change has changed control bit: %v", + itErrPrefix, err) + return false + } + + // The next bit will tell us whether the schema has changed. + schemaHasChangedControlBit, err := it.stream.ReadBit() + if err != nil { + it.err = fmt.Errorf( + "%s error reading schema has changed control bit: %v", + itErrPrefix, err) + return false + } + + if timeUnitHasChangedControlBit == opCodeTimeUnitChange { + if err := it.tsIterator.ReadTimeUnit(it.stream); err != nil { + it.err = fmt.Errorf("%s error reading new time unit: %v", itErrPrefix, err) + return false + } + } + + if schemaHasChangedControlBit == opCodeSchemaChange { + if err := it.readCustomFieldsSchema(); err != nil { + it.err = fmt.Errorf("%s error reading custom fields schema: %v", itErrPrefix, err) + return false + } + + // When the encoder changes its schema it will reset all of its nonCustomFields state + // which means that the iterator needs to do the same to keep them synchronized at + // each point in the stream. + for i := range it.nonCustomFields { + // Reslice instead of setting to nil to reuse existing capacity if possible. + it.nonCustomFields[i].marshalled = it.nonCustomFields[i].marshalled[:0] + } + } + } + + _, done, err := it.tsIterator.ReadTimestamp(it.stream) + if err != nil { + it.err = fmt.Errorf("%s error reading timestamp: %v", itErrPrefix, err) + return false + } + if done { + // This should never happen since we never encode the EndOfStream marker. + it.err = fmt.Errorf("%s unexpected end of timestamp stream", itErrPrefix) + return false + } + + if err := it.readCustomValues(); err != nil { + it.err = err + return false + } + + if err := it.readNonCustomValues(); err != nil { + it.err = err + return false + } + + // Update the marshaller bytes (which will be returned by Current()) with the latest value + // for every non-custom field. + for _, marshalledField := range it.nonCustomFields { + it.marshaller.encPartialProto(marshalledField.marshalled) + } + + it.consumedFirstMessage = true + return it.hasNext() +} + +func (it *iterator) Current() (ts.Datapoint, xtime.Unit, ts.Annotation) { + var ( + dp = ts.Datapoint{ + Timestamp: it.tsIterator.PrevTime.ToTime(), + TimestampNanos: it.tsIterator.PrevTime, + } + unit = it.tsIterator.TimeUnit + ) + + return dp, unit, it.marshaller.bytes() +} + +func (it *iterator) Err() error { + return it.err +} + +func (it *iterator) Reset(reader io.Reader, descr namespace.SchemaDescr) { + it.resetSchema(descr) + it.stream.Reset(reader) + it.tsIterator = m3tsz.NewTimestampIterator(it.opts, true) + + it.err = nil + it.consumedFirstMessage = false + it.done = false + it.closed = false + it.byteFieldDictLRUSize = 0 +} + +// setSchema sets the schema for the iterator. +func (it *iterator) resetSchema(schemaDesc namespace.SchemaDescr) { + if schemaDesc == nil { + it.schemaDesc = nil + it.schema = nil + + // Clear but don't set to nil so they don't need to be reallocated + // next time. + customFields := it.customFields + for i := range customFields { + customFields[i] = customFieldState{} + } + it.customFields = customFields[:0] + + nonCustomFields := it.nonCustomFields + for i := range nonCustomFields { + nonCustomFields[i] = marshalledField{} + } + it.nonCustomFields = nonCustomFields[:0] + return + } + + it.schemaDesc = schemaDesc + it.schema = schemaDesc.Get().MessageDescriptor + it.customFields, it.nonCustomFields = customAndNonCustomFields(it.customFields, nil, it.schema) +} + +func (it *iterator) Close() { + if it.closed { + return + } + + it.closed = true + it.Reset(nil, nil) + it.stream.Reset(nil) + + if it.unmarshalProtoBuf != nil && it.unmarshalProtoBuf.Cap() > maxCapacityUnmarshalBufferRetain { + // Only finalize the buffer if its grown too large to prevent pooled + // iterators from growing excessively large. + it.unmarshalProtoBuf.DecRef() + it.unmarshalProtoBuf.Finalize() + it.unmarshalProtoBuf = nil + } + + if pool := it.opts.ReaderIteratorPool(); pool != nil { + pool.Put(it) + } +} + +func (it *iterator) readStreamHeader() error { + // Can ignore the version number for now because we only have one. + _, err := it.readVarInt() + if err != nil { + return err + } + + byteFieldDictLRUSize, err := it.readVarInt() + if err != nil { + return err + } + + it.byteFieldDictLRUSize = int(byteFieldDictLRUSize) + return nil +} + +func (it *iterator) readCustomFieldsSchema() error { + numCustomFields, err := it.readVarInt() + if err != nil { + return err + } + + if numCustomFields > maxCustomFieldNum { + return fmt.Errorf( + "num custom fields in header is %d but maximum allowed is %d", + numCustomFields, maxCustomFieldNum) + } + + if it.customFields != nil { + for i := range it.customFields { + it.customFields[i] = customFieldState{} + } + it.customFields = it.customFields[:0] + } else { + it.customFields = make([]customFieldState, 0, numCustomFields) + } + + for i := 1; i <= int(numCustomFields); i++ { + fieldTypeBits, err := it.stream.ReadBits(uint(numBitsToEncodeCustomType)) + if err != nil { + return err + } + + fieldType := customFieldType(fieldTypeBits) + if fieldType == notCustomEncodedField { + continue + } + + var ( + fieldDesc = it.schema.FindFieldByNumber(int32(i)) + protoFieldType = protoFieldTypeNotFound + ) + if fieldDesc != nil { + protoFieldType = fieldDesc.GetType() + } + + customFieldState := newCustomFieldState(i, protoFieldType, fieldType) + it.customFields = append(it.customFields, customFieldState) + } + + return nil +} + +func (it *iterator) readCustomValues() error { + for i, customField := range it.customFields { + switch { + case isCustomFloatEncodedField(customField.fieldType): + if err := it.readFloatValue(i); err != nil { + return err + } + case isCustomIntEncodedField(customField.fieldType): + if err := it.readIntValue(i); err != nil { + return err + } + case customField.fieldType == bytesField: + if err := it.readBytesValue(i, customField); err != nil { + return err + } + case customField.fieldType == boolField: + if err := it.readBoolValue(i); err != nil { + return err + } + default: + return fmt.Errorf( + "%s: unhandled custom field type: %v", itErrPrefix, customField.fieldType) + } + } + + return nil +} + +func (it *iterator) readNonCustomValues() error { + protoChangesControlBit, err := it.stream.ReadBit() + if err != nil { + return fmt.Errorf("%s err reading proto changes control bit: %v", itErrPrefix, err) + } + + if protoChangesControlBit == opCodeNoChange { + // No changes since previous message. + return nil + } + + fieldsSetToDefaultControlBit, err := it.stream.ReadBit() + if err != nil { + return fmt.Errorf("%s err reading field set to default control bit: %v", itErrPrefix, err) + } + + if fieldsSetToDefaultControlBit == opCodeFieldsSetToDefaultProtoMarshal { + // Some fields set to default value, need to read bitset. + err = it.readBitset() + if err != nil { + return fmt.Errorf( + "error readining changed proto field numbers bitset: %v", err) + } + } + + it.skipToNextByte() + marshalLen, err := it.readVarInt() + if err != nil { + return fmt.Errorf("%s err reading proto length varint: %v", itErrPrefix, err) + } + + if marshalLen > maxMarshalledProtoMessageSize { + return fmt.Errorf( + "%s marshalled protobuf size was %d which is larger than the maximum of %d", + itErrPrefix, marshalLen, maxMarshalledProtoMessageSize) + } + + it.resetUnmarshalProtoBuffer(int(marshalLen)) + unmarshalBytes := it.unmarshalProtoBuf.Bytes() + n, err := it.stream.Read(unmarshalBytes) + if err != nil { + return fmt.Errorf("%s: error reading marshalled proto bytes: %v", itErrPrefix, err) + } + if n != int(marshalLen) { + return fmt.Errorf( + "%s tried to read %d marshalled proto bytes but only read %d", + itErrPrefix, int(marshalLen), n) + } + + if it.unmarshaller == nil { + // Lazy init. + it.unmarshaller = newCustomFieldUnmarshaller(customUnmarshallerOptions{ + // Skip over unknown fields when unmarshalling because its possible that the stream was + // encoded with a newer schema. + skipUnknownFields: true, + }) + } + + if err := it.unmarshaller.resetAndUnmarshal(it.schema, unmarshalBytes); err != nil { + return fmt.Errorf( + "%s error unmarshalling message: %v", itErrPrefix, err) + } + customFieldValues := it.unmarshaller.sortedCustomFieldValues() + if len(customFieldValues) > 0 { + // If the proto portion of the message has any fields that could have been custom + // encoded then something went wrong on the encoding side. + return fmt.Errorf( + "%s encoded protobuf portion of message had custom fields", itErrPrefix) + } + + // Update any non custom fields that have explicitly changed (they were explicitly included + // in the marshalled stream). + var ( + unmarshalledNonCustomFields = it.unmarshaller.sortedNonCustomFieldValues() + // Matching entries in two sorted lists in which every element in each list is unique so keep + // track of the last index at which a match was found so that subsequent inner loops can start + // at the next index. + lastMatchIdx = -1 + ) + for _, nonCustomField := range unmarshalledNonCustomFields { + for i := lastMatchIdx + 1; i < len(it.nonCustomFields); i++ { + existingNonCustomField := it.nonCustomFields[i] + if nonCustomField.fieldNum != existingNonCustomField.fieldNum { + continue + } + + // Copy because the underlying bytes get reused between reads. Also try and reuse the existing + // capacity to prevent an allocation if possible. + it.nonCustomFields[i].marshalled = append( + it.nonCustomFields[i].marshalled[:0], + nonCustomField.marshalled...) + + lastMatchIdx = i + break + } + } + + // Update any non custom fields that have been explicitly set to their default value as determined + // by the bitset. + if fieldsSetToDefaultControlBit == opCodeFieldsSetToDefaultProtoMarshal { + // Same comment as above about matching entries in two sorted lists. + lastMatchIdx := -1 + for _, fieldNum := range it.bitsetValues { + for i := lastMatchIdx + 1; i < len(it.nonCustomFields); i++ { + nonCustomField := it.nonCustomFields[i] + if fieldNum != int(nonCustomField.fieldNum) { + continue + } + + // Resize slice to zero so that the existing capacity can be reused later if required. + it.nonCustomFields[i].marshalled = it.nonCustomFields[i].marshalled[:0] + lastMatchIdx = i + break + } + } + } + + return nil +} + +func (it *iterator) readFloatValue(i int) error { + if err := it.customFields[i].floatEncAndIter.ReadFloat(it.stream); err != nil { + return err + } + + updateArg := updateLastIterArg{i: i} + return it.updateMarshallerWithCustomValues(updateArg) +} + +func (it *iterator) readBytesValue(i int, customField customFieldState) error { + bytesChangedControlBit, err := it.stream.ReadBit() + if err != nil { + return fmt.Errorf( + "%s: error trying to read bytes changed control bit: %v", + itErrPrefix, err) + } + + if bytesChangedControlBit == opCodeNoChange { + // No changes to the bytes value. + lastValueBytesDict, err := it.lastValueBytesDict(i) + if err != nil { + return err + } + updateArg := updateLastIterArg{i: i, bytesFieldBuf: lastValueBytesDict} + return it.updateMarshallerWithCustomValues(updateArg) + } + + // Bytes have changed since the previous value. + valueInDictControlBit, err := it.stream.ReadBit() + if err != nil { + return fmt.Errorf( + "%s error trying to read bytes changed control bit: %v", + itErrPrefix, err) + } + + if valueInDictControlBit == opCodeInterpretSubsequentBitsAsLRUIndex { + dictIdxBits, err := it.stream.ReadBits( + uint(numBitsRequiredForNumUpToN(it.byteFieldDictLRUSize))) + if err != nil { + return fmt.Errorf( + "%s error trying to read bytes dict idx: %v", + itErrPrefix, err) + } + + dictIdx := int(dictIdxBits) + if dictIdx >= len(customField.iteratorBytesFieldDict) || dictIdx < 0 { + return fmt.Errorf( + "%s read bytes field dictionary index: %d, but dictionary is size: %d", + itErrPrefix, dictIdx, len(customField.iteratorBytesFieldDict)) + } + + bytesVal := customField.iteratorBytesFieldDict[dictIdx] + it.moveToEndOfBytesDict(i, dictIdx) + + updateArg := updateLastIterArg{i: i, bytesFieldBuf: bytesVal} + return it.updateMarshallerWithCustomValues(updateArg) + } + + // New value that was not in the dict already. + bytesLen, err := it.readVarInt() + if err != nil { + return fmt.Errorf( + "%s error trying to read bytes length: %v", itErrPrefix, err) + } + + if err := it.skipToNextByte(); err != nil { + return fmt.Errorf( + "%s error trying to skip bytes value bit padding: %v", + itErrPrefix, err) + } + + // Reuse the byte slice that is about to be evicted (if any) to read into instead of + // allocating if possible. + buf := it.nextToBeEvicted(i) + if cap(buf) < int(bytesLen) { + buf = make([]byte, bytesLen) + } + buf = buf[:bytesLen] + + n, err := it.stream.Read(buf) + if err != nil { + return fmt.Errorf( + "%s error trying to read byte in readBytes: %v", + itErrPrefix, err) + } + if bytesLen != uint64(n) { + return fmt.Errorf( + "%s tried to read %d bytes but only read: %d", itErrPrefix, bytesLen, n) + } + + it.addToBytesDict(i, buf) + + updateArg := updateLastIterArg{i: i, bytesFieldBuf: buf} + return it.updateMarshallerWithCustomValues(updateArg) +} + +func (it *iterator) readIntValue(i int) error { + if err := it.customFields[i].intEncAndIter.readIntValue(it.stream); err != nil { + return err + } + + updateArg := updateLastIterArg{i: i} + return it.updateMarshallerWithCustomValues(updateArg) +} + +func (it *iterator) readBoolValue(i int) error { + boolOpCode, err := it.stream.ReadBit() + if err != nil { + return fmt.Errorf( + "%s: error trying to read bool value: %v", + itErrPrefix, err) + } + + boolVal := boolOpCode == opCodeBoolTrue + updateArg := updateLastIterArg{i: i, boolVal: boolVal} + return it.updateMarshallerWithCustomValues(updateArg) +} + +type updateLastIterArg struct { + i int + bytesFieldBuf []byte + boolVal bool +} + +// updateMarshallerWithCustomValues updates the marshalled stream with the current +// value of the custom field at index i. This ensures that marshalled protobuf stream +// returned by Current() contains the most recent value for all of the custom fields. +func (it *iterator) updateMarshallerWithCustomValues(arg updateLastIterArg) error { + var ( + fieldNum = int32(it.customFields[arg.i].fieldNum) + fieldType = it.customFields[arg.i].fieldType + protoFieldType = it.customFields[arg.i].protoFieldType + ) + + if protoFieldType == protoFieldTypeNotFound { + // This can happen when the field being decoded does not exist (or is reserved) + // in the current schema, but the message was encoded with a schema in which the + // field number did exist. + return nil + } + + switch { + case isCustomFloatEncodedField(fieldType): + var ( + val = math.Float64frombits(it.customFields[arg.i].floatEncAndIter.PrevFloatBits) + err error + ) + if fieldType == float64Field { + it.marshaller.encFloat64(fieldNum, val) + } else { + it.marshaller.encFloat32(fieldNum, float32(val)) + } + return err + + case isCustomIntEncodedField(fieldType): + switch fieldType { + case signedInt64Field: + val := int64(it.customFields[arg.i].intEncAndIter.prevIntBits) + if protoFieldType == dpb.FieldDescriptorProto_TYPE_SINT64 { + // The encoding / compression schema in this package treats Protobuf int32 and sint32 the same, + // however, Protobuf unmarshallers assume that fields of type sint are zigzag encoded. As a result, + // the iterator needs to check the fields protobuf type so that it can perform the correct encoding. + it.marshaller.encSInt64(fieldNum, val) + } else if protoFieldType == dpb.FieldDescriptorProto_TYPE_SFIXED64 { + it.marshaller.encSFixedInt64(fieldNum, val) + } else { + it.marshaller.encInt64(fieldNum, val) + } + return nil + + case unsignedInt64Field: + val := it.customFields[arg.i].intEncAndIter.prevIntBits + it.marshaller.encUInt64(fieldNum, val) + return nil + + case signedInt32Field: + var ( + val = int32(it.customFields[arg.i].intEncAndIter.prevIntBits) + field = it.schema.FindFieldByNumber(fieldNum) + ) + if field == nil { + return fmt.Errorf( + "updating last iterated with value, could not find field number %d in schema", fieldNum) + } + + fieldType := field.GetType() + if fieldType == dpb.FieldDescriptorProto_TYPE_SINT32 { + // The encoding / compression schema in this package treats Protobuf int32 and sint32 the same, + // however, Protobuf unmarshallers assume that fields of type sint are zigzag encoded. As a result, + // the iterator needs to check the fields protobuf type so that it can perform the correct encoding. + it.marshaller.encSInt32(fieldNum, val) + } else if fieldType == dpb.FieldDescriptorProto_TYPE_SFIXED32 { + it.marshaller.encSFixedInt32(fieldNum, val) + } else { + it.marshaller.encInt32(fieldNum, val) + } + return nil + + case unsignedInt32Field: + val := uint32(it.customFields[arg.i].intEncAndIter.prevIntBits) + it.marshaller.encUInt32(fieldNum, val) + return nil + + default: + return fmt.Errorf( + "%s expected custom int encoded field but field type was: %v", + itErrPrefix, fieldType) + } + + case fieldType == bytesField: + it.marshaller.encBytes(fieldNum, arg.bytesFieldBuf) + return nil + + case fieldType == boolField: + it.marshaller.encBool(fieldNum, arg.boolVal) + return nil + + default: + return fmt.Errorf( + "%s unhandled fieldType: %v", itErrPrefix, fieldType) + } +} + +// readBitset does the inverse of encodeBitset on the encoder struct. +func (it *iterator) readBitset() error { + it.bitsetValues = it.bitsetValues[:0] + bitsetLengthBits, err := it.readVarInt() + if err != nil { + return err + } + + for i := uint64(0); i < bitsetLengthBits; i++ { + bit, err := it.stream.ReadBit() + if err != nil { + return fmt.Errorf("%s error reading bitset: %v", itErrPrefix, err) + } + + if bit == opCodeBitsetValueIsSet { + // Add 1 because protobuf fields are 1-indexed not 0-indexed. + it.bitsetValues = append(it.bitsetValues, int(i)+1) + } + } + + return nil +} + +func (it *iterator) readVarInt() (uint64, error) { + var ( + // Convert array to slice and reset size to zero so + // we can reuse the buffer. + buf = it.varIntBuf[:0] + numBytes = 0 + ) + for { + b, err := it.stream.ReadByte() + if err != nil { + return 0, fmt.Errorf("%s error reading var int: %v", itErrPrefix, err) + } + + buf = append(buf, b) + numBytes++ + + if b>>7 == 0 { + break + } + } + + buf = buf[:numBytes] + varInt, _ := binary.Uvarint(buf) + return varInt, nil +} + +// skipToNextByte will skip over any remaining bits in the current byte +// to reach the next byte. This is used in situations where the stream +// has padding bits to keep portions of data aligned at the byte boundary. +func (it *iterator) skipToNextByte() error { + remainingBitsInByte := it.stream.RemainingBitsInCurrentByte() + for remainingBitsInByte > 0 { + _, err := it.stream.ReadBit() + if err != nil { + return err + } + remainingBitsInByte-- + } + + return nil +} + +func (it *iterator) moveToEndOfBytesDict(fieldIdx, i int) { + existing := it.customFields[fieldIdx].iteratorBytesFieldDict + for j := i; j < len(existing); j++ { + nextIdx := j + 1 + if nextIdx >= len(existing) { + break + } + + currVal := existing[j] + nextVal := existing[nextIdx] + existing[j] = nextVal + existing[nextIdx] = currVal + } +} + +func (it *iterator) addToBytesDict(fieldIdx int, b []byte) { + existing := it.customFields[fieldIdx].iteratorBytesFieldDict + if len(existing) < it.byteFieldDictLRUSize { + it.customFields[fieldIdx].iteratorBytesFieldDict = append(existing, b) + return + } + + // Shift everything down 1 and replace the last value to evict the + // least recently used entry and add the newest one. + // [1,2,3] + // becomes + // [2,3,3] + // after shift, and then becomes + // [2,3,4] + // after replacing the last value. + for i := range existing { + nextIdx := i + 1 + if nextIdx >= len(existing) { + break + } + + existing[i] = existing[nextIdx] + } + + existing[len(existing)-1] = b +} + +func (it *iterator) lastValueBytesDict(fieldIdx int) ([]byte, error) { + dict := it.customFields[fieldIdx].iteratorBytesFieldDict + if len(dict) == 0 { + return nil, fmt.Errorf("tried to read last value of bytes dictionary for empty dictionary") + } + return dict[len(dict)-1], nil +} + +func (it *iterator) nextToBeEvicted(fieldIdx int) []byte { + dict := it.customFields[fieldIdx].iteratorBytesFieldDict + if len(dict) == 0 { + return nil + } + + if len(dict) < it.byteFieldDictLRUSize { + // Next add won't trigger an eviction. + return nil + } + + return dict[0] +} + +func (it *iterator) readBits(numBits uint) (uint64, error) { + res, err := it.stream.ReadBits(numBits) + if err != nil { + return 0, err + } + + return res, nil +} + +func (it *iterator) resetUnmarshalProtoBuffer(n int) { + if it.unmarshalProtoBuf != nil && it.unmarshalProtoBuf.Cap() >= n { + // If the existing one is big enough, just resize it. + it.unmarshalProtoBuf.Resize(n) + return + } + + if it.unmarshalProtoBuf != nil { + // If one exists, but its too small, return it to the pool. + it.unmarshalProtoBuf.DecRef() + it.unmarshalProtoBuf.Finalize() + } + + // If none exists (or one existed but it was too small) get a new one + // and IncRef(). DecRef() will never be called unless this one is + // replaced by a new one later. + it.unmarshalProtoBuf = it.newBuffer(n) + it.unmarshalProtoBuf.IncRef() + it.unmarshalProtoBuf.Resize(n) +} + +func (it *iterator) hasNext() bool { + return !it.hasError() && !it.isDone() && !it.isClosed() +} + +func (it *iterator) hasError() bool { + return it.err != nil +} + +func (it *iterator) isDone() bool { + return it.done +} + +func (it *iterator) isClosed() bool { + return it.closed +} + +func (it *iterator) newBuffer(capacity int) checked.Bytes { + if bytesPool := it.opts.BytesPool(); bytesPool != nil { + return bytesPool.Get(capacity) + } + return checked.NewBytes(make([]byte, 0, capacity), nil) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/parse_schema.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/parse_schema.go new file mode 100644 index 00000000..778c659a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/proto/parse_schema.go @@ -0,0 +1,55 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package proto + +import ( + "fmt" + + "github.com/jhump/protoreflect/desc" + "github.com/jhump/protoreflect/desc/protoparse" +) + +// ParseProtoSchema parses a Protobuf schema. +// TODO(rartoul): This is temporary code that will eventually be replaced with +// storing the schemas in etcd. +func ParseProtoSchema(filePath string, messageName string) (*desc.MessageDescriptor, error) { + fds, err := protoparse.Parser{}.ParseFiles(filePath) + if err != nil { + return nil, fmt.Errorf( + "error parsing proto schema: %s, err: %v", filePath, err) + } + + if len(fds) != 1 { + return nil, fmt.Errorf( + "expected to parse %s into one file descriptor but parsed: %d", + filePath, len(fds)) + } + + schema := fds[0].FindMessage(messageName) + if schema == nil { + return nil, fmt.Errorf( + "expected to find message with name '%s' in %s, but did not", + messageName, filePath, + ) + } + + return schema, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/scheme.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/scheme.go new file mode 100644 index 00000000..efcbcee1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/scheme.go @@ -0,0 +1,273 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "github.com/m3db/m3/src/x/checked" + xtime "github.com/m3db/m3/src/x/time" +) + +const ( + // special markers + defaultEndOfStreamMarker Marker = iota + defaultAnnotationMarker + defaultTimeUnitMarker + + // marker encoding information + defaultMarkerOpcode = 0x100 + defaultNumMarkerOpcodeBits = 9 + defaultNumMarkerValueBits = 2 +) + +var ( + // default time encoding schemes + defaultZeroBucket = newTimeBucket(0x0, 1, 0) + defaultNumValueBitsForBuckets = []int{7, 9, 12} + + // TODO(xichen): set more reasonable defaults once we have more knowledge + // of the use cases for time units other than seconds. + defaultTimeEncodingSchemes = map[xtime.Unit]TimeEncodingScheme{ + xtime.Second: newTimeEncodingScheme(defaultNumValueBitsForBuckets, 32), + xtime.Millisecond: newTimeEncodingScheme(defaultNumValueBitsForBuckets, 32), + xtime.Microsecond: newTimeEncodingScheme(defaultNumValueBitsForBuckets, 64), + xtime.Nanosecond: newTimeEncodingScheme(defaultNumValueBitsForBuckets, 64), + } + + // default marker encoding scheme + defaultMarkerEncodingScheme = newMarkerEncodingScheme( + defaultMarkerOpcode, + defaultNumMarkerOpcodeBits, + defaultNumMarkerValueBits, + defaultEndOfStreamMarker, + defaultAnnotationMarker, + defaultTimeUnitMarker, + ) +) + +// TimeBucket represents a bucket for encoding time values. +type TimeBucket interface { + + // Opcode is the opcode prefix used to encode all time values in this range. + Opcode() uint64 + + // NumOpcodeBits is the number of bits used to write the opcode. + NumOpcodeBits() int + + // Min is the minimum time value accepted in this range. + Min() int64 + + // Max is the maximum time value accepted in this range. + Max() int64 + + // NumValueBits is the number of bits used to write the time value. + NumValueBits() int +} + +type timeBucket struct { + min int64 + max int64 + opcode uint64 + numOpcodeBits int + numValueBits int +} + +// newTimeBucket creates a new time bucket. +func newTimeBucket(opcode uint64, numOpcodeBits, numValueBits int) TimeBucket { + return &timeBucket{ + opcode: opcode, + numOpcodeBits: numOpcodeBits, + numValueBits: numValueBits, + min: -(1 << uint(numValueBits-1)), + max: (1 << uint(numValueBits-1)) - 1, + } +} + +func (tb *timeBucket) Opcode() uint64 { return tb.opcode } +func (tb *timeBucket) NumOpcodeBits() int { return tb.numOpcodeBits } +func (tb *timeBucket) Min() int64 { return tb.min } +func (tb *timeBucket) Max() int64 { return tb.max } +func (tb *timeBucket) NumValueBits() int { return tb.numValueBits } + +// TimeEncodingScheme captures information related to time encoding. +type TimeEncodingScheme interface { + + // ZeroBucket is time bucket for encoding zero time values. + ZeroBucket() TimeBucket + + // Buckets are the ordered time buckets used to encode non-zero, non-default time values. + Buckets() []TimeBucket + + // DefaultBucket is the time bucket for catching all other time values not included in the regular buckets. + DefaultBucket() TimeBucket +} + +type timeEncodingScheme struct { + zeroBucket TimeBucket + buckets []TimeBucket + defaultBucket TimeBucket +} + +// newTimeEncodingSchemes converts the unit-to-scheme mapping +// to the underlying TimeEncodingSchemes used for lookups. +func newTimeEncodingSchemes(schemes map[xtime.Unit]TimeEncodingScheme) TimeEncodingSchemes { + encodingSchemes := make(TimeEncodingSchemes, xtime.UnitCount()) + for k, v := range schemes { + if !k.IsValid() { + continue + } + + encodingSchemes[k] = v + } + + return encodingSchemes +} + +// newTimeEncodingScheme creates a new time encoding scheme. +// NB(xichen): numValueBitsForBbuckets should be ordered by value in ascending order (smallest value first). +func newTimeEncodingScheme(numValueBitsForBuckets []int, numValueBitsForDefault int) TimeEncodingScheme { + numBuckets := len(numValueBitsForBuckets) + buckets := make([]TimeBucket, 0, numBuckets) + numOpcodeBits := 1 + opcode := uint64(0) + i := 0 + for i < numBuckets { + opcode = uint64(1<= len(s) { + return nil, false + } + + scheme := s[u] + if scheme == nil { + return nil, false + } + + return s[u], true +} + +// Marker represents the markers. +type Marker byte + +// MarkerEncodingScheme captures the information related to marker encoding. +type MarkerEncodingScheme interface { + + // Opcode returns the marker opcode. + Opcode() uint64 + + // NumOpcodeBits returns the number of bits used for the opcode. + NumOpcodeBits() int + + // NumValueBits returns the number of bits used for the marker value. + NumValueBits() int + + // EndOfStream returns the end of stream marker. + EndOfStream() Marker + + // Annotation returns the annotation marker. + Annotation() Marker + + // TimeUnit returns the time unit marker. + TimeUnit() Marker + + // Tail will return the tail portion of a stream including the relevant bits + // in the last byte along with the end of stream marker. + Tail(streamLastByte byte, streamCurrentPosition int) checked.Bytes +} + +type markerEncodingScheme struct { + opcode uint64 + numOpcodeBits int + numValueBits int + endOfStream Marker + annotation Marker + timeUnit Marker + tails [256][8]checked.Bytes +} + +func newMarkerEncodingScheme( + opcode uint64, + numOpcodeBits int, + numValueBits int, + endOfStream Marker, + annotation Marker, + timeUnit Marker, +) MarkerEncodingScheme { + scheme := &markerEncodingScheme{ + opcode: opcode, + numOpcodeBits: numOpcodeBits, + numValueBits: numValueBits, + endOfStream: endOfStream, + annotation: annotation, + timeUnit: timeUnit, + } + // NB(r): we precompute all possible tail streams dependent on last byte + // so we never have to pool or allocate tails for each stream when we + // want to take a snapshot of the current stream returned by the `Stream` method. + for i := range scheme.tails { + for j := range scheme.tails[i] { + pos := j + 1 + tmp := NewOStream(checked.NewBytes(nil, nil), false, nil) + tmp.WriteBits(uint64(i)>>uint(8-pos), pos) + WriteSpecialMarker(tmp, scheme, endOfStream) + rawBytes, _ := tmp.RawBytes() + tail := checked.NewBytes(rawBytes, nil) + scheme.tails[i][j] = tail + } + } + return scheme +} + +// WriteSpecialMarker writes the marker that marks the start of a special symbol, +// e.g., the eos marker, the annotation marker, or the time unit marker. +func WriteSpecialMarker(os OStream, scheme MarkerEncodingScheme, marker Marker) { + os.WriteBits(scheme.Opcode(), scheme.NumOpcodeBits()) + os.WriteBits(uint64(marker), scheme.NumValueBits()) +} + +func (mes *markerEncodingScheme) Opcode() uint64 { return mes.opcode } +func (mes *markerEncodingScheme) NumOpcodeBits() int { return mes.numOpcodeBits } +func (mes *markerEncodingScheme) NumValueBits() int { return mes.numValueBits } +func (mes *markerEncodingScheme) EndOfStream() Marker { return mes.endOfStream } +func (mes *markerEncodingScheme) Annotation() Marker { return mes.annotation } +func (mes *markerEncodingScheme) TimeUnit() Marker { return mes.timeUnit } +func (mes *markerEncodingScheme) Tail(b byte, pos int) checked.Bytes { return mes.tails[int(b)][pos-1] } diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator.go new file mode 100644 index 00000000..b27603ee --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator.go @@ -0,0 +1,221 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/x/ident" + xtime "github.com/m3db/m3/src/x/time" +) + +type seriesIterator struct { + id ident.ID + nsID ident.ID + tags ident.TagIterator + start xtime.UnixNano + end xtime.UnixNano + iters iterators + multiReaderIters []MultiReaderIterator + err error + firstNext bool + closed bool + pool SeriesIteratorPool +} + +// NewSeriesIterator creates a new series iterator. +// NB: The returned SeriesIterator assumes ownership of the provided `ident.ID`. +func NewSeriesIterator( + opts SeriesIteratorOptions, + pool SeriesIteratorPool, +) SeriesIterator { + it := &seriesIterator{pool: pool} + it.Reset(opts) + return it +} + +func (it *seriesIterator) ID() ident.ID { + return it.id +} + +func (it *seriesIterator) Namespace() ident.ID { + return it.nsID +} + +func (it *seriesIterator) Tags() ident.TagIterator { + return it.tags +} + +func (it *seriesIterator) Start() time.Time { + return it.start.ToTime() +} + +func (it *seriesIterator) End() time.Time { + return it.end.ToTime() +} + +func (it *seriesIterator) Next() bool { + if !it.firstNext { + if !it.hasNext() { + return false + } + it.moveToNext() + } + it.firstNext = false + return it.hasNext() +} + +func (it *seriesIterator) Current() (ts.Datapoint, xtime.Unit, ts.Annotation) { + return it.iters.current() +} + +func (it *seriesIterator) Err() error { + return it.err +} + +func (it *seriesIterator) Close() { + if it.isClosed() { + return + } + it.closed = true + if it.id != nil { + it.id.Finalize() + it.id = nil + } + if it.nsID != nil { + it.nsID.Finalize() + it.nsID = nil + } + if it.tags != nil { + it.tags.Close() + it.tags = nil + } + + for idx := range it.multiReaderIters { + it.multiReaderIters[idx] = nil + } + + it.iters.reset() + if it.pool != nil { + it.pool.Put(it) + } +} + +func (it *seriesIterator) Replicas() ([]MultiReaderIterator, error) { + return it.multiReaderIters, nil +} + +func (it *seriesIterator) Reset(opts SeriesIteratorOptions) { + it.id = opts.ID + it.nsID = opts.Namespace + it.tags = opts.Tags + if it.tags == nil { + it.tags = ident.EmptyTagIterator + } + it.multiReaderIters = it.multiReaderIters[:0] + it.err = nil + it.firstNext = true + it.closed = false + + it.iters.reset() + it.start = opts.StartInclusive + it.end = opts.EndExclusive + if it.start != 0 && it.end != 0 { + it.iters.setFilter(it.start, it.end) + } + it.SetIterateEqualTimestampStrategy(opts.IterateEqualTimestampStrategy) + replicas := opts.Replicas + var err error + if consolidator := opts.SeriesIteratorConsolidator; consolidator != nil { + replicas, err = consolidator.ConsolidateReplicas(replicas) + if err != nil { + it.err = err + return + } + } + + for _, replica := range replicas { + if !replica.Next() || !it.iters.push(replica) { + if replica.Err() != nil { + it.err = replica.Err() + } + + replica.Close() + continue + } + it.multiReaderIters = append(it.multiReaderIters, replica) + } +} + +func (it *seriesIterator) SetIterateEqualTimestampStrategy(strategy IterateEqualTimestampStrategy) { + it.iters.equalTimesStrategy = strategy +} + +func (it *seriesIterator) hasError() bool { + return it.err != nil +} + +func (it *seriesIterator) isClosed() bool { + return it.closed +} + +func (it *seriesIterator) hasMore() bool { + return it.iters.len() > 0 +} + +func (it *seriesIterator) hasNext() bool { + return !it.hasError() && !it.isClosed() && it.hasMore() +} + +func (it *seriesIterator) moveToNext() { + for { + prev := it.iters.at() + next, err := it.iters.moveToValidNext() + if err != nil { + it.err = err + return + } + if !next { + return + } + + curr := it.iters.at() + if curr != prev { + return + } + + // Dedupe by continuing + } +} + +func (it *seriesIterator) Stats() (SeriesIteratorStats, error) { + approx := 0 + for _, readerIter := range it.multiReaderIters { + readers := readerIter.Readers() + size, err := readers.Size() + if err != nil { + return SeriesIteratorStats{}, err + } + approx += size + } + return SeriesIteratorStats{ApproximateSizeInBytes: approx}, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator_accumulator.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator_accumulator.go new file mode 100644 index 00000000..ac5a9cdc --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator_accumulator.go @@ -0,0 +1,260 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "errors" + "fmt" + "time" + + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/x/ident" + xtime "github.com/m3db/m3/src/x/time" +) + +var _ SeriesIteratorAccumulator = (*seriesIteratorAccumulator)(nil) + +type seriesIteratorAccumulator struct { + id ident.ID + nsID ident.ID + start time.Time + end time.Time + iters iterators + tagIterator ident.TagIterator + seriesIterators []SeriesIterator + err error + firstNext bool + closed bool +} + +// SeriesAccumulatorOptions are options for a SeriesIteratorAccumulator. +type SeriesAccumulatorOptions struct { + // RetainTags determines if tags should be preserved after the accumulator is + // exhausted. If set to true, the accumulator retains a copy of the tags. + RetainTags bool +} + +// NewSeriesIteratorAccumulator creates a new series iterator. +func NewSeriesIteratorAccumulator( + iter SeriesIterator, + opts SeriesAccumulatorOptions, +) (SeriesIteratorAccumulator, error) { + it := &seriesIteratorAccumulator{ + // NB: clone id and nsID so that they will be accessbile after underlying + // iterators are closed. + id: ident.StringID(iter.ID().String()), + nsID: ident.StringID(iter.Namespace().String()), + seriesIterators: make([]SeriesIterator, 0, 2), + } + + if opts.RetainTags { + it.tagIterator = iter.Tags().Duplicate() + } + + err := it.Add(iter) + if err != nil { + return nil, err + } + + return it, nil +} + +func (it *seriesIteratorAccumulator) Add(iter SeriesIterator) error { + if it.err != nil { + return it.err + } + + if newNs := iter.Namespace(); !newNs.Equal(it.nsID) { + return fmt.Errorf("cannot add iterator with namespace %s to accumulator %s", + newNs.String(), it.nsID.String()) + } + + if !iter.Next() || !it.iters.push(iter) { + iter.Close() + return iter.Err() + } + + iterStart := iter.Start() + if start := it.start; start.IsZero() || iterStart.Before(start) { + it.start = iterStart + } + + iterEnd := iter.End() + if end := it.end; end.IsZero() || iterEnd.After(end) { + it.end = iterEnd + } + + it.seriesIterators = append(it.seriesIterators, iter) + return nil +} + +func (it *seriesIteratorAccumulator) ID() ident.ID { + return it.id +} + +func (it *seriesIteratorAccumulator) Namespace() ident.ID { + return it.nsID +} + +func (it *seriesIteratorAccumulator) Tags() ident.TagIterator { + if iter := it.tagIterator; iter != nil { + return iter + } + if len(it.seriesIterators) == 0 { + return ident.EmptyTagIterator + } + // NB: the tags for each iterator must be the same, so it's valid to return + // from whichever iterator is available. + return it.seriesIterators[0].Tags() +} + +func (it *seriesIteratorAccumulator) Start() time.Time { + return it.start +} + +func (it *seriesIteratorAccumulator) End() time.Time { + return it.end +} + +func (it *seriesIteratorAccumulator) Next() bool { + if !it.firstNext { + if !it.hasNext() { + return false + } + + it.moveToNext() + } + + it.firstNext = false + return it.hasNext() +} + +func (it *seriesIteratorAccumulator) Current() (ts.Datapoint, xtime.Unit, ts.Annotation) { + return it.iters.current() +} + +func (it *seriesIteratorAccumulator) Err() error { + if it.err != nil { + return it.err + } + + for _, iter := range it.seriesIterators { + if err := iter.Err(); err != nil { + it.err = err + return err + } + } + + return nil +} + +func (it *seriesIteratorAccumulator) Close() { + if it.isClosed() { + return + } + it.closed = true + if it.id != nil { + it.id.Finalize() + it.id = nil + } + if it.nsID != nil { + it.nsID.Finalize() + it.nsID = nil + } + if it.tagIterator != nil { + it.tagIterator.Close() + it.tagIterator = nil + } + it.iters.reset() +} + +func (it *seriesIteratorAccumulator) Replicas() ([]MultiReaderIterator, error) { + if l := len(it.seriesIterators); l != 1 { + return nil, fmt.Errorf("cannot get replicas for accumulated series "+ + "iterators: need 1 iterator, have %d", l) + } + return it.seriesIterators[0].Replicas() +} + +func (it *seriesIteratorAccumulator) Reset(SeriesIteratorOptions) { + if it.err == nil { + it.err = errors.New("cannot reset a series accumulator") + } + return +} + +func (it *seriesIteratorAccumulator) SetIterateEqualTimestampStrategy( + strategy IterateEqualTimestampStrategy, +) { + it.iters.equalTimesStrategy = strategy + for _, iter := range it.seriesIterators { + iter.SetIterateEqualTimestampStrategy(strategy) + } +} + +func (it *seriesIteratorAccumulator) hasError() bool { + return it.err != nil +} + +func (it *seriesIteratorAccumulator) isClosed() bool { + return it.closed +} + +func (it *seriesIteratorAccumulator) hasMore() bool { + return it.iters.len() > 0 +} + +func (it *seriesIteratorAccumulator) hasNext() bool { + return !it.hasError() && !it.isClosed() && it.hasMore() +} + +func (it *seriesIteratorAccumulator) moveToNext() { + for { + prev := it.iters.at() + next, err := it.iters.moveToValidNext() + if err != nil { + it.err = err + return + } + if !next { + return + } + + curr := it.iters.at() + if curr != prev { + return + } + + // Dedupe by continuing + } +} + +func (it *seriesIteratorAccumulator) Stats() (SeriesIteratorStats, error) { + approx := 0 + for _, iter := range it.seriesIterators { + stats, err := iter.Stats() + if err != nil { + return SeriesIteratorStats{}, err + } + approx += stats.ApproximateSizeInBytes + } + return SeriesIteratorStats{ApproximateSizeInBytes: approx}, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator_pool.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator_pool.go new file mode 100644 index 00000000..45cc7c3a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterator_pool.go @@ -0,0 +1,48 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "github.com/m3db/m3/src/x/pool" +) + +type seriesIteratorPool struct { + pool pool.ObjectPool +} + +// NewSeriesIteratorPool creates a new pool for SeriesIterators. +func NewSeriesIteratorPool(opts pool.ObjectPoolOptions) SeriesIteratorPool { + return &seriesIteratorPool{pool: pool.NewObjectPool(opts)} +} + +func (p *seriesIteratorPool) Init() { + p.pool.Init(func() interface{} { + return NewSeriesIterator(SeriesIteratorOptions{}, p) + }) +} + +func (p *seriesIteratorPool) Get() SeriesIterator { + return p.pool.Get().(SeriesIterator) +} + +func (p *seriesIteratorPool) Put(iter SeriesIterator) { + p.pool.Put(iter) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterators.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterators.go new file mode 100644 index 00000000..5c124db2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/series_iterators.go @@ -0,0 +1,83 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +type seriesIterators struct { + iters []SeriesIterator + closed bool + pool MutableSeriesIteratorsPool +} + +// NewSeriesIterators creates a new series iterators collection +func NewSeriesIterators( + iters []SeriesIterator, + pool MutableSeriesIteratorsPool, +) MutableSeriesIterators { + return &seriesIterators{iters: iters} +} + +func (iters *seriesIterators) Iters() []SeriesIterator { + return iters.iters +} + +func (iters *seriesIterators) Close() { + if iters.closed { + return + } + iters.closed = true + for i := range iters.iters { + if iters.iters[i] != nil { + iters.iters[i].Close() + iters.iters[i] = nil + } + } + if iters.pool != nil { + iters.pool.Put(iters) + } +} + +func (iters *seriesIterators) Len() int { + return len(iters.iters) +} + +func (iters *seriesIterators) Cap() int { + return cap(iters.iters) +} + +func (iters *seriesIterators) SetAt(idx int, iter SeriesIterator) { + iters.iters[idx] = iter +} + +func (iters *seriesIterators) Reset(size int) { + for i := range iters.iters { + iters.iters[i] = nil + } + iters.iters = iters.iters[:size] +} + +// EmptySeriesIterators is an empty SeriesIterators. +var EmptySeriesIterators SeriesIterators = emptyIters{} + +type emptyIters struct{} + +func (e emptyIters) Iters() []SeriesIterator { return nil } +func (e emptyIters) Len() int { return 0 } +func (e emptyIters) Close() {} diff --git a/vendor/github.com/m3db/m3/src/dbnode/encoding/types.go b/vendor/github.com/m3db/m3/src/dbnode/encoding/types.go new file mode 100644 index 00000000..cfb11452 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/encoding/types.go @@ -0,0 +1,509 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "io" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/dbnode/x/xpool" + "github.com/m3db/m3/src/x/checked" + xcontext "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + "github.com/m3db/m3/src/x/serialize" + xtime "github.com/m3db/m3/src/x/time" +) + +// Encoder is the generic interface for different types of encoders. +type Encoder interface { + // SetSchema sets up the schema needed by schema-aware encoder to encode the stream. + // SetSchema can be called multiple times between reset for mid-stream schema changes. + SetSchema(descr namespace.SchemaDescr) + + // Encode encodes a datapoint and optionally an annotation. + // Schema must be set prior to Encode for schema-aware encoder. A schema can be set + // via Reset/DiscardReset/SetSchema. + Encode(dp ts.Datapoint, unit xtime.Unit, annotation ts.Annotation) error + + // Stream is the streaming interface for reading encoded bytes in the encoder. + // A boolean is returned indicating whether the returned xio.SegmentReader contains + // any data (true) or is empty (false) to encourage callers to remember to handle + // the special case where there is an empty stream. + // NB(r): The underlying byte slice will not be returned to the pool until the context + // passed to this method is closed, so to avoid not returning the + // encoder's buffer back to the pool when it is completed be sure to call + // close on the context eventually. + Stream(ctx xcontext.Context) (xio.SegmentReader, bool) + + // NumEncoded returns the number of encoded datapoints. + NumEncoded() int + + // LastEncoded returns the last encoded datapoint, useful for + // de-duplicating encoded values. If there are no previously encoded values + // an error is returned. + LastEncoded() (ts.Datapoint, error) + + // LastAnnotation returns the last encoded datapoint, useful for + // de-duplicating encoded values. If there are no previously encoded values + // an error is returned. + LastAnnotation() (ts.Annotation, error) + + // Len returns the length of the encoded stream as returned by a call to Stream(). + Len() int + + // Reset resets the start time of the encoder and the internal state. + // Reset sets up the schema for schema-aware encoders such as proto encoders. + Reset(t time.Time, capacity int, schema namespace.SchemaDescr) + + // Close closes the encoder and if pooled will return it to the pool. + Close() + + // Discard will take ownership of the encoder data and if pooled will return the encoder to the pool. + Discard() ts.Segment + + // DiscardReset will take ownership of the encoder data and reset the encoder for reuse. + // DiscardReset sets up the schema for schema-aware encoders such as proto encoders. + DiscardReset(t time.Time, capacity int, schema namespace.SchemaDescr) ts.Segment +} + +// NewEncoderFn creates a new encoder +type NewEncoderFn func(start time.Time, bytes []byte) Encoder + +// Options represents different options for encoding time as well as markers. +type Options interface { + // SetDefaultTimeUnit sets the default time unit for the encoder. + SetDefaultTimeUnit(tu xtime.Unit) Options + + // DefaultTimeUnit returns the default time unit for the encoder. + DefaultTimeUnit() xtime.Unit + + // SetTimeEncodingSchemes sets the time encoding schemes for different time units. + SetTimeEncodingSchemes(value map[xtime.Unit]TimeEncodingScheme) Options + + // TimeEncodingSchemes returns the time encoding schemes for different time units. + TimeEncodingSchemes() TimeEncodingSchemes + + // SetMarkerEncodingScheme sets the marker encoding scheme. + SetMarkerEncodingScheme(value MarkerEncodingScheme) Options + + // MarkerEncodingScheme returns the marker encoding scheme. + MarkerEncodingScheme() MarkerEncodingScheme + + // SetEncoderPool sets the encoder pool. + SetEncoderPool(value EncoderPool) Options + + // EncoderPool returns the encoder pool. + EncoderPool() EncoderPool + + // SetReaderIteratorPool sets the ReaderIteratorPool. + SetReaderIteratorPool(value ReaderIteratorPool) Options + + // ReaderIteratorPool returns the ReaderIteratorPool. + ReaderIteratorPool() ReaderIteratorPool + + // SetBytesPool sets the bytes pool. + SetBytesPool(value pool.CheckedBytesPool) Options + + // BytesPool returns the bytes pool. + BytesPool() pool.CheckedBytesPool + + // SetSegmentReaderPool sets the segment reader pool. + SetSegmentReaderPool(value xio.SegmentReaderPool) Options + + // SegmentReaderPool returns the segment reader pool. + SegmentReaderPool() xio.SegmentReaderPool + + // SetCheckedBytesWrapperPool sets the checked bytes wrapper pool. + SetCheckedBytesWrapperPool(value xpool.CheckedBytesWrapperPool) Options + + // CheckedBytesWrapperPool returns the checked bytes wrapper pool. + CheckedBytesWrapperPool() xpool.CheckedBytesWrapperPool + + // SetByteFieldDictionaryLRUSize sets theByteFieldDictionaryLRUSize which controls + // how many recently seen byte field values will be maintained in the compression + // dictionaries LRU when compressing / decompressing byte fields in ProtoBuf messages. + // Increasing this value can potentially lead to better compression at the cost of + // using more memory for storing metadata when compressing / decompressing. + SetByteFieldDictionaryLRUSize(value int) Options + + // ByteFieldDictionaryLRUSize returns the ByteFieldDictionaryLRUSize. + ByteFieldDictionaryLRUSize() int + + // SetIStreamReaderSizeM3TSZ sets the istream bufio reader size + // for m3tsz encoding iteration. + SetIStreamReaderSizeM3TSZ(value int) Options + + // IStreamReaderSizeM3TSZ returns the istream bufio reader size + // for m3tsz encoding iteration. + IStreamReaderSizeM3TSZ() int + + // SetIStreamReaderSizeProto sets the istream bufio reader size + // for proto encoding iteration. + SetIStreamReaderSizeProto(value int) Options + + // SetIStreamReaderSizeProto returns the istream bufio reader size + // for proto encoding iteration. + IStreamReaderSizeProto() int +} + +// Iterator is the generic interface for iterating over encoded data. +type Iterator interface { + // Next moves to the next item. + Next() bool + + // Current returns the value as well as the annotation associated with the + // current datapoint. Users should not hold on to the returned Annotation + // object as it may get invalidated when the iterator calls Next(). + Current() (ts.Datapoint, xtime.Unit, ts.Annotation) + + // Err returns the error encountered + Err() error + + // Close closes the iterator and if pooled will return to the pool. + Close() +} + +// ReaderIterator is the interface for a single-reader iterator. +type ReaderIterator interface { + Iterator + + // Reset resets the iterator to read from a new reader with + // a new schema (for schema aware iterators). + Reset(reader io.Reader, schema namespace.SchemaDescr) +} + +// MultiReaderIterator is an iterator that iterates in order over +// a list of sets of internally ordered but not collectively in order +// readers, it also deduplicates datapoints. +type MultiReaderIterator interface { + Iterator + + // Reset resets the iterator to read from a slice of readers + // with a new schema (for schema aware iterators). + Reset(readers []xio.SegmentReader, start time.Time, + blockSize time.Duration, schema namespace.SchemaDescr) + + // Reset resets the iterator to read from a slice of slice readers + // with a new schema (for schema aware iterators). + ResetSliceOfSlices( + readers xio.ReaderSliceOfSlicesIterator, + schema namespace.SchemaDescr, + ) + + // Readers exposes the underlying ReaderSliceOfSlicesIterator + // for this MultiReaderIterator. + Readers() xio.ReaderSliceOfSlicesIterator + + // Schema exposes the underlying SchemaDescr for this MutliReaderIterator. + Schema() namespace.SchemaDescr +} + +// SeriesIteratorAccumulator is an accumulator for SeriesIterator iterators, +// that gathers incoming SeriesIterators and builds a unified SeriesIterator. +type SeriesIteratorAccumulator interface { + SeriesIterator + + // Add adds a series iterator. + Add(it SeriesIterator) error +} + +// SeriesIterator is an iterator that iterates over a set of iterators from +// different replicas and de-dupes & merges results from the replicas for a +// given series while also applying a time filter on top of the values in +// case replicas returned values out of range on either end. +type SeriesIterator interface { + Iterator + + // ID gets the ID of the series. + ID() ident.ID + + // Namespace gets the namespace of the series. + Namespace() ident.ID + + // Start returns the start time filter specified for the iterator. + Start() time.Time + + // End returns the end time filter specified for the iterator. + End() time.Time + + // Reset resets the iterator to read from a set of iterators from different + // replicas, one must note that this can be an array with nil entries if + // some replicas did not return successfully. + // NB: the SeriesIterator assumes ownership of the provided ids, this + // includes calling `id.Finalize()` upon iter.Close(). + Reset(opts SeriesIteratorOptions) + + // SetIterateEqualTimestampStrategy sets the equal timestamp strategy of how + // to select a value when the timestamp matches differing values with the same + // timestamp from different replicas. + // It can be set at any time and will apply to the current value returned + // from the iterator immediately. + SetIterateEqualTimestampStrategy(strategy IterateEqualTimestampStrategy) + + // Stats provides information for this SeriesIterator. + Stats() (SeriesIteratorStats, error) + + // Replicas exposes the underlying MultiReaderIterator slice + // for this SeriesIterator. + Replicas() ([]MultiReaderIterator, error) + + // Tags returns an iterator over the tags associated with the ID. + Tags() ident.TagIterator +} + +// SeriesIteratorStats contains information about a SeriesIterator. +type SeriesIteratorStats struct { + // ApproximateSizeInBytes approximates how much data is contained within the + // SeriesIterator, in bytes. + ApproximateSizeInBytes int +} + +// SeriesIteratorConsolidator optionally defines methods to consolidate series iterators. +type SeriesIteratorConsolidator interface { + // ConsolidateReplicas consolidates MultiReaderIterator slices. + ConsolidateReplicas(replicas []MultiReaderIterator) ([]MultiReaderIterator, error) +} + +// SeriesIteratorOptions is a set of options for using a series iterator. +type SeriesIteratorOptions struct { + ID ident.ID + Namespace ident.ID + Tags ident.TagIterator + Replicas []MultiReaderIterator + StartInclusive xtime.UnixNano + EndExclusive xtime.UnixNano + IterateEqualTimestampStrategy IterateEqualTimestampStrategy + SeriesIteratorConsolidator SeriesIteratorConsolidator +} + +// SeriesIterators is a collection of SeriesIterator that can +// close all iterators. +type SeriesIterators interface { + // Iters returns the array of series iterators. + Iters() []SeriesIterator + + // Len returns the count of iterators in the collection. + Len() int + + // Close closes all iterators contained within the collection. + Close() +} + +// MutableSeriesIterators is a mutable SeriesIterators. +type MutableSeriesIterators interface { + SeriesIterators + + // Reset the iters collection to a size for reuse. + Reset(size int) + + // Cap returns the capacity of the iters. + Cap() int + + // SetAt sets a SeriesIterator to the given index. + SetAt(idx int, iter SeriesIterator) +} + +// Decoder is the generic interface for different types of decoders. +type Decoder interface { + // Decode decodes the encoded data in the reader. + Decode(reader io.Reader) ReaderIterator +} + +// NewDecoderFn creates a new decoder. +type NewDecoderFn func() Decoder + +// EncoderAllocate allocates an encoder for a pool. +type EncoderAllocate func() Encoder + +// ReaderIteratorAllocate allocates a ReaderIterator for a pool. +type ReaderIteratorAllocate func(reader io.Reader, descr namespace.SchemaDescr) ReaderIterator + +// IStream encapsulates a readable stream. +type IStream interface { + // Read reads len(b) bytes. + Read([]byte) (int, error) + + // ReadBit reads the next Bit. + ReadBit() (Bit, error) + + // ReadByte reads the next Byte. + ReadByte() (byte, error) + + // ReadBits reads the next Bits. + ReadBits(numBits uint) (uint64, error) + + // PeekBits looks at the next Bits, but doesn't move the pos. + PeekBits(numBits uint) (uint64, error) + + // RemainingBitsInCurrentByte returns the number of bits remaining to + // be read in the current byte. + RemainingBitsInCurrentByte() uint + + // Reset resets the IStream. + Reset(r io.Reader) +} + +// OStream encapsulates a writable stream. +type OStream interface { + // Len returns the length of the OStream + Len() int + // Empty returns whether the OStream is empty + Empty() bool + + // WriteBit writes the last bit of v. + WriteBit(v Bit) + + // WriteBits writes the lowest numBits of v to the stream, starting + // from the most significant bit to the least significant bit. + WriteBits(v uint64, numBits int) + + // WriteByte writes the last byte of v. + WriteByte(v byte) + + // WriteBytes writes a byte slice. + WriteBytes(bytes []byte) + + // Write writes a byte slice. This method exists in addition to WriteBytes() + // to satisfy the io.Writer interface. + Write(bytes []byte) (int, error) + + // Reset resets the ostream. + Reset(buffer checked.Bytes) + + // Discard takes the ref to the checked bytes from the OStream. + Discard() checked.Bytes + + // RawBytes returns the OStream's raw bytes. Note that this does not transfer + // ownership of the data and bypasses the checked.Bytes accounting so + // callers should: + // 1. Only use the returned slice as a "read-only" snapshot of the + // data in a context where the caller has at least a read lock + // on the ostream itself. + // 2. Use this function with care. + RawBytes() ([]byte, int) + + // CheckedBytes returns the written stream as checked bytes. + CheckedBytes() (checked.Bytes, int) +} + +// EncoderPool provides a pool for encoders. +type EncoderPool interface { + // Init initializes the pool. + Init(alloc EncoderAllocate) + + // Get provides an encoder from the pool. + Get() Encoder + + // Put returns an encoder to the pool. + Put(e Encoder) +} + +// ReaderIteratorPool provides a pool for ReaderIterators. +type ReaderIteratorPool interface { + // Init initializes the pool. + Init(alloc ReaderIteratorAllocate) + + // Get provides a ReaderIterator from the pool. + Get() ReaderIterator + + // Put returns a ReaderIterator to the pool. + Put(iter ReaderIterator) +} + +// MultiReaderIteratorPool provides a pool for MultiReaderIterators. +type MultiReaderIteratorPool interface { + // Init initializes the pool. + Init(alloc ReaderIteratorAllocate) + + // Get provides a MultiReaderIterator from the pool. + Get() MultiReaderIterator + + // Put returns a MultiReaderIterator to the pool. + Put(iter MultiReaderIterator) +} + +// SeriesIteratorPool provides a pool for SeriesIterator. +type SeriesIteratorPool interface { + // Init initializes the pool. + Init() + + // Get provides a SeriesIterator from the pool. + Get() SeriesIterator + + // Put returns a SeriesIterator to the pool. + Put(iter SeriesIterator) +} + +// MutableSeriesIteratorsPool provides a pool for MutableSeriesIterators. +type MutableSeriesIteratorsPool interface { + // Init initializes the pool. + Init() + + // Get provides a MutableSeriesIterators from the pool. + Get(size int) MutableSeriesIterators + + // Put returns a MutableSeriesIterators to the pool. + Put(iters MutableSeriesIterators) +} + +// MultiReaderIteratorArrayPool provides a pool for MultiReaderIterator arrays. +type MultiReaderIteratorArrayPool interface { + // Init initializes the pool. + Init() + + // Get provides a MultiReaderIterator array from the pool. + Get(size int) []MultiReaderIterator + + // Put returns a MultiReaderIterator array to the pool. + Put(iters []MultiReaderIterator) +} + +// IteratorPools exposes a small subset of iterator pools that are sufficient +// for clients to rebuild SeriesIterator. +type IteratorPools interface { + // MultiReaderIteratorArray exposes the session MultiReaderIteratorArrayPool. + MultiReaderIteratorArray() MultiReaderIteratorArrayPool + + // MultiReaderIterator exposes the session MultiReaderIteratorPool. + MultiReaderIterator() MultiReaderIteratorPool + + // MutableSeriesIterators exposes the session MutableSeriesIteratorsPool. + MutableSeriesIterators() MutableSeriesIteratorsPool + + // SeriesIterator exposes the session SeriesIteratorPool. + SeriesIterator() SeriesIteratorPool + + // CheckedBytesWrapper exposes the session CheckedBytesWrapperPool. + CheckedBytesWrapper() xpool.CheckedBytesWrapperPool + + // ID exposes the session identity pool. + ID() ident.Pool + + // TagEncoder exposes the session tag encoder pool. + TagEncoder() serialize.TagEncoderPool + + // TagDecoder exposes the session tag decoder pool. + TagDecoder() serialize.TagDecoderPool +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/environment/config.go b/vendor/github.com/m3db/m3/src/dbnode/environment/config.go new file mode 100644 index 00000000..02a3dd5c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/environment/config.go @@ -0,0 +1,427 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package environment + +import ( + "errors" + "fmt" + "os" + "time" + + clusterclient "github.com/m3db/m3/src/cluster/client" + etcdclient "github.com/m3db/m3/src/cluster/client/etcd" + "github.com/m3db/m3/src/cluster/kv" + m3clusterkvmem "github.com/m3db/m3/src/cluster/kv/mem" + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/dbnode/kvconfig" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/sharding" + "github.com/m3db/m3/src/dbnode/topology" + "github.com/m3db/m3/src/x/instrument" +) + +var ( + errInvalidConfig = errors.New("must supply either service or static config") + errInvalidSyncCount = errors.New("must supply exactly one synchronous cluster") +) + +// Configuration is a configuration that can be used to create namespaces, a topology, and kv store +type Configuration struct { + // Services is used when a topology initializer is not supplied. + Services DynamicConfiguration `yaml:"services"` + + // StaticConfiguration is used for running M3DB with static configs + Statics StaticConfiguration `yaml:"statics"` + + // Presence of a (etcd) server in this config denotes an embedded cluster + SeedNodes *SeedNodesConfig `yaml:"seedNodes"` +} + +// SeedNodesConfig defines fields for seed node +type SeedNodesConfig struct { + RootDir string `yaml:"rootDir"` + InitialAdvertisePeerUrls []string `yaml:"initialAdvertisePeerUrls"` + AdvertiseClientUrls []string `yaml:"advertiseClientUrls"` + ListenPeerUrls []string `yaml:"listenPeerUrls"` + ListenClientUrls []string `yaml:"listenClientUrls"` + InitialCluster []SeedNode `yaml:"initialCluster"` + ClientTransportSecurity SeedNodeSecurityConfig `yaml:"clientTransportSecurity"` + PeerTransportSecurity SeedNodeSecurityConfig `yaml:"peerTransportSecurity"` +} + +// SeedNode represents a seed node for the cluster +type SeedNode struct { + HostID string `yaml:"hostID"` + Endpoint string `yaml:"endpoint"` + ClusterState string `yaml:"clusterState"` +} + +// SeedNodeSecurityConfig contains the data used for security in seed nodes +type SeedNodeSecurityConfig struct { + CAFile string `yaml:"caFile"` + CertFile string `yaml:"certFile"` + KeyFile string `yaml:"keyFile"` + TrustedCAFile string `yaml:"trustedCaFile"` + CertAuth bool `yaml:"clientCertAuth"` + AutoTLS bool `yaml:"autoTls"` +} + +// DynamicConfiguration is used for running M3DB with a dynamic config +type DynamicConfiguration []*DynamicCluster + +// DynamicCluster is a single cluster in a dynamic configuration +type DynamicCluster struct { + Async bool `yaml:"async"` + ClientOverrides ClientOverrides `yaml:"clientOverrides"` + Service *etcdclient.Configuration `yaml:"service"` +} + +// ClientOverrides represents M3DB client overrides for a given cluster. +type ClientOverrides struct { + HostQueueFlushInterval *time.Duration `yaml:"hostQueueFlushInterval"` + TargetHostQueueFlushSize *int `yaml:"targetHostQueueFlushSize"` +} + +// Validate validates the DynamicConfiguration. +func (c DynamicConfiguration) Validate() error { + syncCount := 0 + for _, cfg := range c { + if !cfg.Async { + syncCount++ + } + if cfg.ClientOverrides.TargetHostQueueFlushSize != nil && *cfg.ClientOverrides.TargetHostQueueFlushSize <= 1 { + return fmt.Errorf("target host queue flush size must be larger than zero but was: %d", cfg.ClientOverrides.TargetHostQueueFlushSize) + } + + if cfg.ClientOverrides.HostQueueFlushInterval != nil && *cfg.ClientOverrides.HostQueueFlushInterval <= 0 { + return fmt.Errorf("host queue flush interval must be larger than zero but was: %s", cfg.ClientOverrides.HostQueueFlushInterval.String()) + } + } + if syncCount != 1 { + return errInvalidSyncCount + } + return nil +} + +// SyncCluster returns the synchronous cluster in the DynamicConfiguration +func (c DynamicConfiguration) SyncCluster() (*DynamicCluster, error) { + if err := c.Validate(); err != nil { + return nil, err + } + + for _, cluster := range c { + if !cluster.Async { + return cluster, nil + } + } + return nil, errInvalidSyncCount +} + +// StaticConfiguration is used for running M3DB with a static config +type StaticConfiguration []*StaticCluster + +// StaticCluster is a single cluster in a static configuration +type StaticCluster struct { + Async bool `yaml:"async"` + ClientOverrides ClientOverrides `yaml:"clientOverrides"` + Namespaces []namespace.MetadataConfiguration `yaml:"namespaces"` + TopologyConfig *topology.StaticConfiguration `yaml:"topology"` + ListenAddress string `yaml:"listenAddress"` +} + +// Validate validates the StaticConfiguration +func (c StaticConfiguration) Validate() error { + syncCount := 0 + for _, cfg := range c { + if !cfg.Async { + syncCount++ + } + if cfg.ClientOverrides.TargetHostQueueFlushSize != nil && *cfg.ClientOverrides.TargetHostQueueFlushSize <= 1 { + return fmt.Errorf("target host queue flush size must be larger than zero but was: %d", cfg.ClientOverrides.TargetHostQueueFlushSize) + } + + if cfg.ClientOverrides.HostQueueFlushInterval != nil && *cfg.ClientOverrides.HostQueueFlushInterval <= 0 { + return fmt.Errorf("host queue flush interval must be larger than zero but was: %s", cfg.ClientOverrides.HostQueueFlushInterval.String()) + } + } + if syncCount != 1 { + return errInvalidSyncCount + } + return nil +} + +// ConfigureResult stores initializers and kv store for dynamic and static configs +type ConfigureResult struct { + NamespaceInitializer namespace.Initializer + TopologyInitializer topology.Initializer + ClusterClient clusterclient.Client + KVStore kv.Store + Async bool + ClientOverrides ClientOverrides +} + +// ConfigureResults stores initializers and kv store for dynamic and static configs +type ConfigureResults []ConfigureResult + +// SyncCluster returns the synchronous cluster in the ConfigureResults +func (c ConfigureResults) SyncCluster() (ConfigureResult, error) { + for _, result := range c { + if !result.Async { + return result, nil + } + } + return ConfigureResult{}, errInvalidSyncCount +} + +// ConfigurationParameters are options used to create new ConfigureResults +type ConfigurationParameters struct { + InstrumentOpts instrument.Options + HashingSeed uint32 + HostID string + NewDirectoryMode os.FileMode + ForceColdWritesEnabled bool +} + +// UnmarshalYAML normalizes the config into a list of services. +func (c *Configuration) UnmarshalYAML(unmarshal func(interface{}) error) error { + var cfg struct { + Services DynamicConfiguration `yaml:"services"` + Service *etcdclient.Configuration `yaml:"service"` + Static *StaticCluster `yaml:"static"` + Statics StaticConfiguration `yaml:"statics"` + SeedNodes *SeedNodesConfig `yaml:"seedNodes"` + } + + if err := unmarshal(&cfg); err != nil { + return err + } + + c.SeedNodes = cfg.SeedNodes + c.Statics = cfg.Statics + if cfg.Static != nil { + c.Statics = StaticConfiguration{cfg.Static} + } + c.Services = cfg.Services + if cfg.Service != nil { + c.Services = DynamicConfiguration{ + &DynamicCluster{Service: cfg.Service}, + } + } + + return nil +} + +// Validate validates the configuration. +func (c *Configuration) Validate() error { + if (c.Services == nil && c.Statics == nil) || + (c.Services != nil && c.Statics != nil) { + return errInvalidConfig + } + + if len(c.Services) > 0 { + if err := c.Services.Validate(); err != nil { + return err + } + } + + if len(c.Statics) > 0 { + if err := c.Statics.Validate(); err != nil { + return err + } + } + return nil +} + +// Configure creates a new ConfigureResults +func (c Configuration) Configure(cfgParams ConfigurationParameters) (ConfigureResults, error) { + var emptyConfig ConfigureResults + + // Validate here rather than UnmarshalYAML since we need to ensure one of + // dynamic or static configuration are provided. A blank YAML does not + // call UnmarshalYAML and therefore validation would be skipped. + if err := c.Validate(); err != nil { + return emptyConfig, err + } + + if c.Services != nil { + return c.configureDynamic(cfgParams) + } + + if c.Statics != nil { + return c.configureStatic(cfgParams) + } + + return emptyConfig, errInvalidConfig +} + +func (c Configuration) configureDynamic(cfgParams ConfigurationParameters) (ConfigureResults, error) { + var emptyConfig ConfigureResults + if err := c.Services.Validate(); err != nil { + return emptyConfig, err + } + + cfgResults := make(ConfigureResults, 0, len(c.Services)) + for _, cluster := range c.Services { + configSvcClientOpts := cluster.Service.NewOptions(). + SetInstrumentOptions(cfgParams.InstrumentOpts). + // Set timeout to zero so it will wait indefinitely for the + // initial value. + SetServicesOptions(services.NewOptions().SetInitTimeout(0)). + SetNewDirectoryMode(cfgParams.NewDirectoryMode) + configSvcClient, err := etcdclient.NewConfigServiceClient(configSvcClientOpts) + if err != nil { + err = fmt.Errorf("could not create m3cluster client: %v", err) + return emptyConfig, err + } + + dynamicOpts := namespace.NewDynamicOptions(). + SetInstrumentOptions(cfgParams.InstrumentOpts). + SetConfigServiceClient(configSvcClient). + SetNamespaceRegistryKey(kvconfig.NamespacesKey). + SetForceColdWritesEnabled(cfgParams.ForceColdWritesEnabled) + nsInit := namespace.NewDynamicInitializer(dynamicOpts) + + serviceID := services.NewServiceID(). + SetName(cluster.Service.Service). + SetEnvironment(cluster.Service.Env). + SetZone(cluster.Service.Zone) + + topoOpts := topology.NewDynamicOptions(). + SetConfigServiceClient(configSvcClient). + SetServiceID(serviceID). + SetQueryOptions(services.NewQueryOptions().SetIncludeUnhealthy(true)). + SetInstrumentOptions(cfgParams.InstrumentOpts). + SetHashGen(sharding.NewHashGenWithSeed(cfgParams.HashingSeed)) + topoInit := topology.NewDynamicInitializer(topoOpts) + + kv, err := configSvcClient.KV() + if err != nil { + err = fmt.Errorf("could not create KV client, %v", err) + return emptyConfig, err + } + + result := ConfigureResult{ + NamespaceInitializer: nsInit, + TopologyInitializer: topoInit, + ClusterClient: configSvcClient, + KVStore: kv, + Async: cluster.Async, + ClientOverrides: cluster.ClientOverrides, + } + cfgResults = append(cfgResults, result) + } + + return cfgResults, nil +} + +func (c Configuration) configureStatic(cfgParams ConfigurationParameters) (ConfigureResults, error) { + var emptyConfig ConfigureResults + + if err := c.Statics.Validate(); err != nil { + return emptyConfig, err + } + + cfgResults := make(ConfigureResults, 0, len(c.Services)) + for _, cluster := range c.Statics { + nsList := []namespace.Metadata{} + for _, ns := range cluster.Namespaces { + md, err := ns.Metadata() + if err != nil { + err = fmt.Errorf("unable to create metadata for static config: %v", err) + return emptyConfig, err + } + nsList = append(nsList, md) + } + // NB(bodu): Force cold writes to be enabled for all ns if specified. + if cfgParams.ForceColdWritesEnabled { + nsList = namespace.ForceColdWritesEnabledForMetadatas(nsList) + } + + nsInitStatic := namespace.NewStaticInitializer(nsList) + + shardSet, hostShardSets, err := newStaticShardSet(cluster.TopologyConfig.Shards, cluster.TopologyConfig.Hosts) + if err != nil { + err = fmt.Errorf("unable to create shard set for static config: %v", err) + return emptyConfig, err + } + staticOptions := topology.NewStaticOptions(). + SetHostShardSets(hostShardSets). + SetShardSet(shardSet) + + numHosts := len(cluster.TopologyConfig.Hosts) + numReplicas := cluster.TopologyConfig.Replicas + + switch numReplicas { + case 0: + if numHosts != 1 { + err := fmt.Errorf("number of hosts (%d) must be 1 if replicas is not set", numHosts) + return emptyConfig, err + } + staticOptions = staticOptions.SetReplicas(1) + default: + if numHosts != numReplicas { + err := fmt.Errorf("number of hosts (%d) not equal to number of replicas (%d)", numHosts, numReplicas) + return emptyConfig, err + } + staticOptions = staticOptions.SetReplicas(cluster.TopologyConfig.Replicas) + } + + topoInit := topology.NewStaticInitializer(staticOptions) + result := ConfigureResult{ + NamespaceInitializer: nsInitStatic, + TopologyInitializer: topoInit, + KVStore: m3clusterkvmem.NewStore(), + Async: cluster.Async, + ClientOverrides: cluster.ClientOverrides, + } + cfgResults = append(cfgResults, result) + } + + return cfgResults, nil +} + +func newStaticShardSet(numShards int, hosts []topology.HostShardConfig) (sharding.ShardSet, []topology.HostShardSet, error) { + var ( + shardSet sharding.ShardSet + hostShardSets []topology.HostShardSet + shardIDs []uint32 + err error + ) + + for i := uint32(0); i < uint32(numShards); i++ { + shardIDs = append(shardIDs, i) + } + + shards := sharding.NewShards(shardIDs, shard.Available) + shardSet, err = sharding.NewShardSet(shards, sharding.DefaultHashFn(len(shards))) + if err != nil { + return nil, nil, err + } + + for _, i := range hosts { + host := topology.NewHost(i.HostID, i.ListenAddress) + hostShardSet := topology.NewHostShardSet(host, shardSet) + hostShardSets = append(hostShardSets, hostShardSet) + } + + return shardSet, hostShardSets, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.pb.go b/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.pb.go new file mode 100644 index 00000000..8d1f1e99 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.pb.go @@ -0,0 +1,2583 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.proto + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* + Package namespace is a generated protocol buffer package. + + It is generated from these files: + github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.proto + github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.proto + + It has these top-level messages: + RetentionOptions + IndexOptions + NamespaceOptions + AggregationOptions + Aggregation + AggregatedAttributes + DownsampleOptions + Registry + NamespaceRuntimeOptions + SchemaOptions + SchemaHistory + FileDescriptorSet +*/ +package namespace + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/gogo/protobuf/types" +import google_protobuf1 "github.com/gogo/protobuf/types" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type RetentionOptions struct { + RetentionPeriodNanos int64 `protobuf:"varint,1,opt,name=retentionPeriodNanos,proto3" json:"retentionPeriodNanos,omitempty"` + BlockSizeNanos int64 `protobuf:"varint,2,opt,name=blockSizeNanos,proto3" json:"blockSizeNanos,omitempty"` + BufferFutureNanos int64 `protobuf:"varint,3,opt,name=bufferFutureNanos,proto3" json:"bufferFutureNanos,omitempty"` + BufferPastNanos int64 `protobuf:"varint,4,opt,name=bufferPastNanos,proto3" json:"bufferPastNanos,omitempty"` + BlockDataExpiry bool `protobuf:"varint,5,opt,name=blockDataExpiry,proto3" json:"blockDataExpiry,omitempty"` + BlockDataExpiryAfterNotAccessPeriodNanos int64 `protobuf:"varint,6,opt,name=blockDataExpiryAfterNotAccessPeriodNanos,proto3" json:"blockDataExpiryAfterNotAccessPeriodNanos,omitempty"` + FutureRetentionPeriodNanos int64 `protobuf:"varint,7,opt,name=futureRetentionPeriodNanos,proto3" json:"futureRetentionPeriodNanos,omitempty"` +} + +func (m *RetentionOptions) Reset() { *m = RetentionOptions{} } +func (m *RetentionOptions) String() string { return proto.CompactTextString(m) } +func (*RetentionOptions) ProtoMessage() {} +func (*RetentionOptions) Descriptor() ([]byte, []int) { return fileDescriptorNamespace, []int{0} } + +func (m *RetentionOptions) GetRetentionPeriodNanos() int64 { + if m != nil { + return m.RetentionPeriodNanos + } + return 0 +} + +func (m *RetentionOptions) GetBlockSizeNanos() int64 { + if m != nil { + return m.BlockSizeNanos + } + return 0 +} + +func (m *RetentionOptions) GetBufferFutureNanos() int64 { + if m != nil { + return m.BufferFutureNanos + } + return 0 +} + +func (m *RetentionOptions) GetBufferPastNanos() int64 { + if m != nil { + return m.BufferPastNanos + } + return 0 +} + +func (m *RetentionOptions) GetBlockDataExpiry() bool { + if m != nil { + return m.BlockDataExpiry + } + return false +} + +func (m *RetentionOptions) GetBlockDataExpiryAfterNotAccessPeriodNanos() int64 { + if m != nil { + return m.BlockDataExpiryAfterNotAccessPeriodNanos + } + return 0 +} + +func (m *RetentionOptions) GetFutureRetentionPeriodNanos() int64 { + if m != nil { + return m.FutureRetentionPeriodNanos + } + return 0 +} + +type IndexOptions struct { + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + BlockSizeNanos int64 `protobuf:"varint,2,opt,name=blockSizeNanos,proto3" json:"blockSizeNanos,omitempty"` +} + +func (m *IndexOptions) Reset() { *m = IndexOptions{} } +func (m *IndexOptions) String() string { return proto.CompactTextString(m) } +func (*IndexOptions) ProtoMessage() {} +func (*IndexOptions) Descriptor() ([]byte, []int) { return fileDescriptorNamespace, []int{1} } + +func (m *IndexOptions) GetEnabled() bool { + if m != nil { + return m.Enabled + } + return false +} + +func (m *IndexOptions) GetBlockSizeNanos() int64 { + if m != nil { + return m.BlockSizeNanos + } + return 0 +} + +type NamespaceOptions struct { + BootstrapEnabled bool `protobuf:"varint,1,opt,name=bootstrapEnabled,proto3" json:"bootstrapEnabled,omitempty"` + FlushEnabled bool `protobuf:"varint,2,opt,name=flushEnabled,proto3" json:"flushEnabled,omitempty"` + WritesToCommitLog bool `protobuf:"varint,3,opt,name=writesToCommitLog,proto3" json:"writesToCommitLog,omitempty"` + CleanupEnabled bool `protobuf:"varint,4,opt,name=cleanupEnabled,proto3" json:"cleanupEnabled,omitempty"` + RepairEnabled bool `protobuf:"varint,5,opt,name=repairEnabled,proto3" json:"repairEnabled,omitempty"` + RetentionOptions *RetentionOptions `protobuf:"bytes,6,opt,name=retentionOptions" json:"retentionOptions,omitempty"` + SnapshotEnabled bool `protobuf:"varint,7,opt,name=snapshotEnabled,proto3" json:"snapshotEnabled,omitempty"` + IndexOptions *IndexOptions `protobuf:"bytes,8,opt,name=indexOptions" json:"indexOptions,omitempty"` + SchemaOptions *SchemaOptions `protobuf:"bytes,9,opt,name=schemaOptions" json:"schemaOptions,omitempty"` + ColdWritesEnabled bool `protobuf:"varint,10,opt,name=coldWritesEnabled,proto3" json:"coldWritesEnabled,omitempty"` + RuntimeOptions *NamespaceRuntimeOptions `protobuf:"bytes,11,opt,name=runtimeOptions" json:"runtimeOptions,omitempty"` + CacheBlocksOnRetrieve *google_protobuf1.BoolValue `protobuf:"bytes,12,opt,name=cacheBlocksOnRetrieve" json:"cacheBlocksOnRetrieve,omitempty"` + AggregationOptions *AggregationOptions `protobuf:"bytes,13,opt,name=aggregationOptions" json:"aggregationOptions,omitempty"` + ExtendedOptions *google_protobuf.Any `protobuf:"bytes,14,opt,name=extendedOptions" json:"extendedOptions,omitempty"` +} + +func (m *NamespaceOptions) Reset() { *m = NamespaceOptions{} } +func (m *NamespaceOptions) String() string { return proto.CompactTextString(m) } +func (*NamespaceOptions) ProtoMessage() {} +func (*NamespaceOptions) Descriptor() ([]byte, []int) { return fileDescriptorNamespace, []int{2} } + +func (m *NamespaceOptions) GetBootstrapEnabled() bool { + if m != nil { + return m.BootstrapEnabled + } + return false +} + +func (m *NamespaceOptions) GetFlushEnabled() bool { + if m != nil { + return m.FlushEnabled + } + return false +} + +func (m *NamespaceOptions) GetWritesToCommitLog() bool { + if m != nil { + return m.WritesToCommitLog + } + return false +} + +func (m *NamespaceOptions) GetCleanupEnabled() bool { + if m != nil { + return m.CleanupEnabled + } + return false +} + +func (m *NamespaceOptions) GetRepairEnabled() bool { + if m != nil { + return m.RepairEnabled + } + return false +} + +func (m *NamespaceOptions) GetRetentionOptions() *RetentionOptions { + if m != nil { + return m.RetentionOptions + } + return nil +} + +func (m *NamespaceOptions) GetSnapshotEnabled() bool { + if m != nil { + return m.SnapshotEnabled + } + return false +} + +func (m *NamespaceOptions) GetIndexOptions() *IndexOptions { + if m != nil { + return m.IndexOptions + } + return nil +} + +func (m *NamespaceOptions) GetSchemaOptions() *SchemaOptions { + if m != nil { + return m.SchemaOptions + } + return nil +} + +func (m *NamespaceOptions) GetColdWritesEnabled() bool { + if m != nil { + return m.ColdWritesEnabled + } + return false +} + +func (m *NamespaceOptions) GetRuntimeOptions() *NamespaceRuntimeOptions { + if m != nil { + return m.RuntimeOptions + } + return nil +} + +func (m *NamespaceOptions) GetCacheBlocksOnRetrieve() *google_protobuf1.BoolValue { + if m != nil { + return m.CacheBlocksOnRetrieve + } + return nil +} + +func (m *NamespaceOptions) GetAggregationOptions() *AggregationOptions { + if m != nil { + return m.AggregationOptions + } + return nil +} + +func (m *NamespaceOptions) GetExtendedOptions() *google_protobuf.Any { + if m != nil { + return m.ExtendedOptions + } + return nil +} + +// AggregationOptions is a set of options for aggregating data +// within the namespace. +type AggregationOptions struct { + // aggregations is a repeated field to support the ability to send aggregated data + // to a namespace also receiving unaggregated data. In this case, the namespace will + // have one Aggregation with aggregated set to false and another with aggregated set to true. + Aggregations []*Aggregation `protobuf:"bytes,1,rep,name=aggregations" json:"aggregations,omitempty"` +} + +func (m *AggregationOptions) Reset() { *m = AggregationOptions{} } +func (m *AggregationOptions) String() string { return proto.CompactTextString(m) } +func (*AggregationOptions) ProtoMessage() {} +func (*AggregationOptions) Descriptor() ([]byte, []int) { return fileDescriptorNamespace, []int{3} } + +func (m *AggregationOptions) GetAggregations() []*Aggregation { + if m != nil { + return m.Aggregations + } + return nil +} + +// Aggregation describes data points within the namespace. +type Aggregation struct { + // aggregated is true if data points are aggregated, false otherwise. + Aggregated bool `protobuf:"varint,1,opt,name=aggregated,proto3" json:"aggregated,omitempty"` + // attributes specifies how to aggregate data when aggregated is set to true. + // This field is ignored when aggregated is false and required when aggregated + // is true. + Attributes *AggregatedAttributes `protobuf:"bytes,2,opt,name=attributes" json:"attributes,omitempty"` +} + +func (m *Aggregation) Reset() { *m = Aggregation{} } +func (m *Aggregation) String() string { return proto.CompactTextString(m) } +func (*Aggregation) ProtoMessage() {} +func (*Aggregation) Descriptor() ([]byte, []int) { return fileDescriptorNamespace, []int{4} } + +func (m *Aggregation) GetAggregated() bool { + if m != nil { + return m.Aggregated + } + return false +} + +func (m *Aggregation) GetAttributes() *AggregatedAttributes { + if m != nil { + return m.Attributes + } + return nil +} + +// AggregatedAttributes describe how to aggregate data. +type AggregatedAttributes struct { + // resolutionNanos is the time range to aggregate data across. + ResolutionNanos int64 `protobuf:"varint,1,opt,name=resolutionNanos,proto3" json:"resolutionNanos,omitempty"` + DownsampleOptions *DownsampleOptions `protobuf:"bytes,2,opt,name=downsampleOptions" json:"downsampleOptions,omitempty"` +} + +func (m *AggregatedAttributes) Reset() { *m = AggregatedAttributes{} } +func (m *AggregatedAttributes) String() string { return proto.CompactTextString(m) } +func (*AggregatedAttributes) ProtoMessage() {} +func (*AggregatedAttributes) Descriptor() ([]byte, []int) { return fileDescriptorNamespace, []int{5} } + +func (m *AggregatedAttributes) GetResolutionNanos() int64 { + if m != nil { + return m.ResolutionNanos + } + return 0 +} + +func (m *AggregatedAttributes) GetDownsampleOptions() *DownsampleOptions { + if m != nil { + return m.DownsampleOptions + } + return nil +} + +// DownsampleOptions is a set of options related to downsampling data. +type DownsampleOptions struct { + // all indicates whether to send data points to this namespace. If false, + // data points must be sent via rollup/recording rules. Defaults to true. + All bool `protobuf:"varint,1,opt,name=all,proto3" json:"all,omitempty"` +} + +func (m *DownsampleOptions) Reset() { *m = DownsampleOptions{} } +func (m *DownsampleOptions) String() string { return proto.CompactTextString(m) } +func (*DownsampleOptions) ProtoMessage() {} +func (*DownsampleOptions) Descriptor() ([]byte, []int) { return fileDescriptorNamespace, []int{6} } + +func (m *DownsampleOptions) GetAll() bool { + if m != nil { + return m.All + } + return false +} + +type Registry struct { + Namespaces map[string]*NamespaceOptions `protobuf:"bytes,1,rep,name=namespaces" json:"namespaces,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *Registry) Reset() { *m = Registry{} } +func (m *Registry) String() string { return proto.CompactTextString(m) } +func (*Registry) ProtoMessage() {} +func (*Registry) Descriptor() ([]byte, []int) { return fileDescriptorNamespace, []int{7} } + +func (m *Registry) GetNamespaces() map[string]*NamespaceOptions { + if m != nil { + return m.Namespaces + } + return nil +} + +type NamespaceRuntimeOptions struct { + WriteIndexingPerCPUConcurrency *google_protobuf1.DoubleValue `protobuf:"bytes,1,opt,name=writeIndexingPerCPUConcurrency" json:"writeIndexingPerCPUConcurrency,omitempty"` + FlushIndexingPerCPUConcurrency *google_protobuf1.DoubleValue `protobuf:"bytes,2,opt,name=flushIndexingPerCPUConcurrency" json:"flushIndexingPerCPUConcurrency,omitempty"` +} + +func (m *NamespaceRuntimeOptions) Reset() { *m = NamespaceRuntimeOptions{} } +func (m *NamespaceRuntimeOptions) String() string { return proto.CompactTextString(m) } +func (*NamespaceRuntimeOptions) ProtoMessage() {} +func (*NamespaceRuntimeOptions) Descriptor() ([]byte, []int) { return fileDescriptorNamespace, []int{8} } + +func (m *NamespaceRuntimeOptions) GetWriteIndexingPerCPUConcurrency() *google_protobuf1.DoubleValue { + if m != nil { + return m.WriteIndexingPerCPUConcurrency + } + return nil +} + +func (m *NamespaceRuntimeOptions) GetFlushIndexingPerCPUConcurrency() *google_protobuf1.DoubleValue { + if m != nil { + return m.FlushIndexingPerCPUConcurrency + } + return nil +} + +func init() { + proto.RegisterType((*RetentionOptions)(nil), "namespace.RetentionOptions") + proto.RegisterType((*IndexOptions)(nil), "namespace.IndexOptions") + proto.RegisterType((*NamespaceOptions)(nil), "namespace.NamespaceOptions") + proto.RegisterType((*AggregationOptions)(nil), "namespace.AggregationOptions") + proto.RegisterType((*Aggregation)(nil), "namespace.Aggregation") + proto.RegisterType((*AggregatedAttributes)(nil), "namespace.AggregatedAttributes") + proto.RegisterType((*DownsampleOptions)(nil), "namespace.DownsampleOptions") + proto.RegisterType((*Registry)(nil), "namespace.Registry") + proto.RegisterType((*NamespaceRuntimeOptions)(nil), "namespace.NamespaceRuntimeOptions") +} +func (m *RetentionOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RetentionOptions) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.RetentionPeriodNanos != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.RetentionPeriodNanos)) + } + if m.BlockSizeNanos != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.BlockSizeNanos)) + } + if m.BufferFutureNanos != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.BufferFutureNanos)) + } + if m.BufferPastNanos != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.BufferPastNanos)) + } + if m.BlockDataExpiry { + dAtA[i] = 0x28 + i++ + if m.BlockDataExpiry { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.BlockDataExpiryAfterNotAccessPeriodNanos != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.BlockDataExpiryAfterNotAccessPeriodNanos)) + } + if m.FutureRetentionPeriodNanos != 0 { + dAtA[i] = 0x38 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.FutureRetentionPeriodNanos)) + } + return i, nil +} + +func (m *IndexOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IndexOptions) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Enabled { + dAtA[i] = 0x8 + i++ + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.BlockSizeNanos != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.BlockSizeNanos)) + } + return i, nil +} + +func (m *NamespaceOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NamespaceOptions) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.BootstrapEnabled { + dAtA[i] = 0x8 + i++ + if m.BootstrapEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.FlushEnabled { + dAtA[i] = 0x10 + i++ + if m.FlushEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.WritesToCommitLog { + dAtA[i] = 0x18 + i++ + if m.WritesToCommitLog { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.CleanupEnabled { + dAtA[i] = 0x20 + i++ + if m.CleanupEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.RepairEnabled { + dAtA[i] = 0x28 + i++ + if m.RepairEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.RetentionOptions != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.RetentionOptions.Size())) + n1, err := m.RetentionOptions.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if m.SnapshotEnabled { + dAtA[i] = 0x38 + i++ + if m.SnapshotEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.IndexOptions != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.IndexOptions.Size())) + n2, err := m.IndexOptions.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + if m.SchemaOptions != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.SchemaOptions.Size())) + n3, err := m.SchemaOptions.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + if m.ColdWritesEnabled { + dAtA[i] = 0x50 + i++ + if m.ColdWritesEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.RuntimeOptions != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.RuntimeOptions.Size())) + n4, err := m.RuntimeOptions.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + if m.CacheBlocksOnRetrieve != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.CacheBlocksOnRetrieve.Size())) + n5, err := m.CacheBlocksOnRetrieve.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + if m.AggregationOptions != nil { + dAtA[i] = 0x6a + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.AggregationOptions.Size())) + n6, err := m.AggregationOptions.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + } + if m.ExtendedOptions != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.ExtendedOptions.Size())) + n7, err := m.ExtendedOptions.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + return i, nil +} + +func (m *AggregationOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AggregationOptions) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Aggregations) > 0 { + for _, msg := range m.Aggregations { + dAtA[i] = 0xa + i++ + i = encodeVarintNamespace(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Aggregation) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Aggregation) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Aggregated { + dAtA[i] = 0x8 + i++ + if m.Aggregated { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Attributes != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.Attributes.Size())) + n8, err := m.Attributes.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + } + return i, nil +} + +func (m *AggregatedAttributes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AggregatedAttributes) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ResolutionNanos != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.ResolutionNanos)) + } + if m.DownsampleOptions != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.DownsampleOptions.Size())) + n9, err := m.DownsampleOptions.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 + } + return i, nil +} + +func (m *DownsampleOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DownsampleOptions) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.All { + dAtA[i] = 0x8 + i++ + if m.All { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *Registry) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Registry) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Namespaces) > 0 { + for k, _ := range m.Namespaces { + dAtA[i] = 0xa + i++ + v := m.Namespaces[k] + msgSize := 0 + if v != nil { + msgSize = v.Size() + msgSize += 1 + sovNamespace(uint64(msgSize)) + } + mapSize := 1 + len(k) + sovNamespace(uint64(len(k))) + msgSize + i = encodeVarintNamespace(dAtA, i, uint64(mapSize)) + dAtA[i] = 0xa + i++ + i = encodeVarintNamespace(dAtA, i, uint64(len(k))) + i += copy(dAtA[i:], k) + if v != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(v.Size())) + n10, err := v.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 + } + } + } + return i, nil +} + +func (m *NamespaceRuntimeOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NamespaceRuntimeOptions) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.WriteIndexingPerCPUConcurrency != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.WriteIndexingPerCPUConcurrency.Size())) + n11, err := m.WriteIndexingPerCPUConcurrency.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 + } + if m.FlushIndexingPerCPUConcurrency != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintNamespace(dAtA, i, uint64(m.FlushIndexingPerCPUConcurrency.Size())) + n12, err := m.FlushIndexingPerCPUConcurrency.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + } + return i, nil +} + +func encodeVarintNamespace(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *RetentionOptions) Size() (n int) { + var l int + _ = l + if m.RetentionPeriodNanos != 0 { + n += 1 + sovNamespace(uint64(m.RetentionPeriodNanos)) + } + if m.BlockSizeNanos != 0 { + n += 1 + sovNamespace(uint64(m.BlockSizeNanos)) + } + if m.BufferFutureNanos != 0 { + n += 1 + sovNamespace(uint64(m.BufferFutureNanos)) + } + if m.BufferPastNanos != 0 { + n += 1 + sovNamespace(uint64(m.BufferPastNanos)) + } + if m.BlockDataExpiry { + n += 2 + } + if m.BlockDataExpiryAfterNotAccessPeriodNanos != 0 { + n += 1 + sovNamespace(uint64(m.BlockDataExpiryAfterNotAccessPeriodNanos)) + } + if m.FutureRetentionPeriodNanos != 0 { + n += 1 + sovNamespace(uint64(m.FutureRetentionPeriodNanos)) + } + return n +} + +func (m *IndexOptions) Size() (n int) { + var l int + _ = l + if m.Enabled { + n += 2 + } + if m.BlockSizeNanos != 0 { + n += 1 + sovNamespace(uint64(m.BlockSizeNanos)) + } + return n +} + +func (m *NamespaceOptions) Size() (n int) { + var l int + _ = l + if m.BootstrapEnabled { + n += 2 + } + if m.FlushEnabled { + n += 2 + } + if m.WritesToCommitLog { + n += 2 + } + if m.CleanupEnabled { + n += 2 + } + if m.RepairEnabled { + n += 2 + } + if m.RetentionOptions != nil { + l = m.RetentionOptions.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + if m.SnapshotEnabled { + n += 2 + } + if m.IndexOptions != nil { + l = m.IndexOptions.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + if m.SchemaOptions != nil { + l = m.SchemaOptions.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + if m.ColdWritesEnabled { + n += 2 + } + if m.RuntimeOptions != nil { + l = m.RuntimeOptions.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + if m.CacheBlocksOnRetrieve != nil { + l = m.CacheBlocksOnRetrieve.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + if m.AggregationOptions != nil { + l = m.AggregationOptions.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + if m.ExtendedOptions != nil { + l = m.ExtendedOptions.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + return n +} + +func (m *AggregationOptions) Size() (n int) { + var l int + _ = l + if len(m.Aggregations) > 0 { + for _, e := range m.Aggregations { + l = e.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + } + return n +} + +func (m *Aggregation) Size() (n int) { + var l int + _ = l + if m.Aggregated { + n += 2 + } + if m.Attributes != nil { + l = m.Attributes.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + return n +} + +func (m *AggregatedAttributes) Size() (n int) { + var l int + _ = l + if m.ResolutionNanos != 0 { + n += 1 + sovNamespace(uint64(m.ResolutionNanos)) + } + if m.DownsampleOptions != nil { + l = m.DownsampleOptions.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + return n +} + +func (m *DownsampleOptions) Size() (n int) { + var l int + _ = l + if m.All { + n += 2 + } + return n +} + +func (m *Registry) Size() (n int) { + var l int + _ = l + if len(m.Namespaces) > 0 { + for k, v := range m.Namespaces { + _ = k + _ = v + l = 0 + if v != nil { + l = v.Size() + l += 1 + sovNamespace(uint64(l)) + } + mapEntrySize := 1 + len(k) + sovNamespace(uint64(len(k))) + l + n += mapEntrySize + 1 + sovNamespace(uint64(mapEntrySize)) + } + } + return n +} + +func (m *NamespaceRuntimeOptions) Size() (n int) { + var l int + _ = l + if m.WriteIndexingPerCPUConcurrency != nil { + l = m.WriteIndexingPerCPUConcurrency.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + if m.FlushIndexingPerCPUConcurrency != nil { + l = m.FlushIndexingPerCPUConcurrency.Size() + n += 1 + l + sovNamespace(uint64(l)) + } + return n +} + +func sovNamespace(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozNamespace(x uint64) (n int) { + return sovNamespace(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *RetentionOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RetentionOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RetentionOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RetentionPeriodNanos", wireType) + } + m.RetentionPeriodNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RetentionPeriodNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockSizeNanos", wireType) + } + m.BlockSizeNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BlockSizeNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BufferFutureNanos", wireType) + } + m.BufferFutureNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BufferFutureNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BufferPastNanos", wireType) + } + m.BufferPastNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BufferPastNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockDataExpiry", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.BlockDataExpiry = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockDataExpiryAfterNotAccessPeriodNanos", wireType) + } + m.BlockDataExpiryAfterNotAccessPeriodNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BlockDataExpiryAfterNotAccessPeriodNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FutureRetentionPeriodNanos", wireType) + } + m.FutureRetentionPeriodNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.FutureRetentionPeriodNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipNamespace(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthNamespace + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *IndexOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IndexOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IndexOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockSizeNanos", wireType) + } + m.BlockSizeNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BlockSizeNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipNamespace(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthNamespace + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NamespaceOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NamespaceOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NamespaceOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BootstrapEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.BootstrapEnabled = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FlushEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.FlushEnabled = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field WritesToCommitLog", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.WritesToCommitLog = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CleanupEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CleanupEnabled = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RepairEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RepairEnabled = bool(v != 0) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RetentionOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RetentionOptions == nil { + m.RetentionOptions = &RetentionOptions{} + } + if err := m.RetentionOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.SnapshotEnabled = bool(v != 0) + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IndexOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.IndexOptions == nil { + m.IndexOptions = &IndexOptions{} + } + if err := m.IndexOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SchemaOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SchemaOptions == nil { + m.SchemaOptions = &SchemaOptions{} + } + if err := m.SchemaOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ColdWritesEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ColdWritesEnabled = bool(v != 0) + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RuntimeOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RuntimeOptions == nil { + m.RuntimeOptions = &NamespaceRuntimeOptions{} + } + if err := m.RuntimeOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CacheBlocksOnRetrieve", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CacheBlocksOnRetrieve == nil { + m.CacheBlocksOnRetrieve = &google_protobuf1.BoolValue{} + } + if err := m.CacheBlocksOnRetrieve.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AggregationOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AggregationOptions == nil { + m.AggregationOptions = &AggregationOptions{} + } + if err := m.AggregationOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtendedOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExtendedOptions == nil { + m.ExtendedOptions = &google_protobuf.Any{} + } + if err := m.ExtendedOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipNamespace(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthNamespace + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AggregationOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AggregationOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AggregationOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Aggregations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Aggregations = append(m.Aggregations, &Aggregation{}) + if err := m.Aggregations[len(m.Aggregations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipNamespace(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthNamespace + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Aggregation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Aggregation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Aggregation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Aggregated", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Aggregated = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Attributes == nil { + m.Attributes = &AggregatedAttributes{} + } + if err := m.Attributes.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipNamespace(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthNamespace + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AggregatedAttributes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AggregatedAttributes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AggregatedAttributes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ResolutionNanos", wireType) + } + m.ResolutionNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ResolutionNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DownsampleOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DownsampleOptions == nil { + m.DownsampleOptions = &DownsampleOptions{} + } + if err := m.DownsampleOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipNamespace(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthNamespace + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DownsampleOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DownsampleOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DownsampleOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field All", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.All = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipNamespace(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthNamespace + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Registry) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Registry: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Registry: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespaces", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Namespaces == nil { + m.Namespaces = make(map[string]*NamespaceOptions) + } + var mapkey string + var mapvalue *NamespaceOptions + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthNamespace + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthNamespace + } + postmsgIndex := iNdEx + mapmsglen + if mapmsglen < 0 { + return ErrInvalidLengthNamespace + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &NamespaceOptions{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipNamespace(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthNamespace + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Namespaces[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipNamespace(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthNamespace + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NamespaceRuntimeOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NamespaceRuntimeOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NamespaceRuntimeOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WriteIndexingPerCPUConcurrency", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WriteIndexingPerCPUConcurrency == nil { + m.WriteIndexingPerCPUConcurrency = &google_protobuf1.DoubleValue{} + } + if err := m.WriteIndexingPerCPUConcurrency.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FlushIndexingPerCPUConcurrency", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNamespace + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNamespace + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.FlushIndexingPerCPUConcurrency == nil { + m.FlushIndexingPerCPUConcurrency = &google_protobuf1.DoubleValue{} + } + if err := m.FlushIndexingPerCPUConcurrency.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipNamespace(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthNamespace + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipNamespace(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowNamespace + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowNamespace + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowNamespace + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthNamespace + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowNamespace + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipNamespace(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthNamespace = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowNamespace = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.proto", fileDescriptorNamespace) +} + +var fileDescriptorNamespace = []byte{ + // 875 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xdd, 0x6e, 0xe3, 0x44, + 0x14, 0xc6, 0xcd, 0x6e, 0x9b, 0x9e, 0xa4, 0x6d, 0x3a, 0x2a, 0x6c, 0xc8, 0x42, 0x58, 0x99, 0x1f, + 0x45, 0x08, 0x25, 0xa2, 0xbd, 0x41, 0x8b, 0x54, 0x94, 0xfe, 0xb0, 0x62, 0x05, 0xdd, 0x68, 0x96, + 0x1f, 0x69, 0xef, 0xc6, 0xf6, 0x89, 0x63, 0xad, 0x3d, 0x63, 0xcd, 0x8c, 0xb7, 0x0d, 0xcf, 0xb0, + 0x17, 0xbc, 0x06, 0xe2, 0x45, 0xb8, 0xe4, 0x11, 0x50, 0x11, 0xef, 0x81, 0x3c, 0x13, 0xa7, 0x8e, + 0x9d, 0x2d, 0xd5, 0xde, 0x44, 0xce, 0x77, 0xbe, 0x73, 0xbe, 0x33, 0xe7, 0x0f, 0x9e, 0x84, 0x91, + 0x9e, 0x65, 0xde, 0xd0, 0x17, 0xc9, 0x28, 0x39, 0x0a, 0xbc, 0x51, 0x72, 0x34, 0x52, 0xd2, 0x1f, + 0x05, 0x1e, 0x17, 0x01, 0x8e, 0x42, 0xe4, 0x28, 0x99, 0xc6, 0x60, 0x94, 0x4a, 0xa1, 0xc5, 0x88, + 0xb3, 0x04, 0x55, 0xca, 0x7c, 0xbc, 0xf9, 0x1a, 0x1a, 0x0b, 0xd9, 0x5e, 0x02, 0xbd, 0xf7, 0x43, + 0x21, 0xc2, 0x18, 0xad, 0x8b, 0x97, 0x4d, 0x47, 0x8c, 0xcf, 0x2d, 0xab, 0xd7, 0xaf, 0x9a, 0x2e, + 0x25, 0x4b, 0x53, 0x94, 0x6a, 0x61, 0x3f, 0x7b, 0xdb, 0x74, 0x94, 0x3f, 0xc3, 0x84, 0xd9, 0x28, + 0xee, 0xeb, 0x06, 0x74, 0x28, 0x6a, 0xe4, 0x3a, 0x12, 0xfc, 0x59, 0x9a, 0xff, 0x2a, 0x72, 0x08, + 0x07, 0xb2, 0xc0, 0x26, 0x28, 0x23, 0x11, 0x5c, 0x30, 0x2e, 0x54, 0xd7, 0x79, 0xe4, 0x0c, 0x1a, + 0x74, 0xad, 0x8d, 0x7c, 0x06, 0xbb, 0x5e, 0x2c, 0xfc, 0x97, 0xcf, 0xa3, 0x5f, 0xd1, 0xb2, 0x37, + 0x0c, 0xbb, 0x82, 0x92, 0x2f, 0x60, 0xdf, 0xcb, 0xa6, 0x53, 0x94, 0xdf, 0x66, 0x3a, 0x93, 0x0b, + 0x6a, 0xc3, 0x50, 0xeb, 0x06, 0x32, 0x80, 0x3d, 0x0b, 0x4e, 0x98, 0xd2, 0x96, 0x7b, 0xcf, 0x70, + 0xab, 0xb0, 0x61, 0xe6, 0x4a, 0x67, 0x4c, 0xb3, 0xf3, 0xab, 0x34, 0x92, 0xf3, 0xee, 0xfd, 0x47, + 0xce, 0xa0, 0x49, 0xab, 0x30, 0x79, 0x01, 0x83, 0x0a, 0x34, 0x9e, 0x6a, 0x94, 0x17, 0x42, 0x8f, + 0x7d, 0x1f, 0x95, 0x2a, 0xbf, 0x78, 0xd3, 0x88, 0xdd, 0x99, 0x4f, 0x8e, 0xa1, 0x37, 0x35, 0xe9, + 0xd3, 0x75, 0xf5, 0xdb, 0x32, 0xd1, 0x6e, 0x61, 0xb8, 0x13, 0x68, 0x7f, 0xc7, 0x03, 0xbc, 0x2a, + 0x3a, 0xd1, 0x85, 0x2d, 0xe4, 0xcc, 0x8b, 0x31, 0x30, 0xc5, 0x6f, 0xd2, 0xe2, 0xef, 0x5d, 0xeb, + 0xed, 0xfe, 0xbe, 0x09, 0x9d, 0x8b, 0xa2, 0xf7, 0x45, 0xd8, 0xcf, 0xa1, 0xe3, 0x09, 0xa1, 0x95, + 0x96, 0x2c, 0x3d, 0x5f, 0x89, 0x5f, 0xc3, 0x89, 0x0b, 0xed, 0x69, 0x9c, 0xa9, 0x59, 0xc1, 0xdb, + 0x30, 0xbc, 0x15, 0x2c, 0x6f, 0xea, 0xa5, 0x8c, 0x34, 0xaa, 0x1f, 0xc5, 0xa9, 0x48, 0x92, 0x48, + 0x7f, 0x2f, 0x42, 0xd3, 0xd4, 0x26, 0xad, 0x1b, 0xf2, 0xd4, 0xfd, 0x18, 0x19, 0xcf, 0x96, 0xda, + 0xf7, 0x0c, 0xb5, 0x82, 0x92, 0x4f, 0x60, 0x47, 0x62, 0xca, 0x22, 0x59, 0xd0, 0x6c, 0x43, 0x57, + 0x41, 0xf2, 0x04, 0x3a, 0xb2, 0x32, 0xc0, 0xa6, 0x6d, 0xad, 0xc3, 0x87, 0xc3, 0x9b, 0xcd, 0xab, + 0xce, 0x38, 0xad, 0x39, 0xe5, 0x13, 0xa4, 0x38, 0x4b, 0xd5, 0x4c, 0xe8, 0x42, 0x70, 0xcb, 0x4e, + 0x50, 0x05, 0x26, 0x5f, 0x43, 0x3b, 0x2a, 0x75, 0xa9, 0xdb, 0x34, 0x72, 0x0f, 0x4a, 0x72, 0xe5, + 0x26, 0xd2, 0x15, 0x32, 0x39, 0x86, 0x1d, 0xbb, 0x81, 0x85, 0xf7, 0xb6, 0xf1, 0xee, 0x96, 0xbc, + 0x9f, 0x97, 0xed, 0x74, 0x95, 0x9e, 0xd7, 0xda, 0x17, 0x71, 0xf0, 0x8b, 0x29, 0x6b, 0x91, 0x28, + 0xd8, 0x5a, 0xd7, 0x0c, 0xe4, 0x29, 0xec, 0xca, 0x8c, 0xeb, 0x28, 0x29, 0x7a, 0xdf, 0x6d, 0x19, + 0x39, 0xb7, 0x24, 0xb7, 0x1c, 0x0f, 0xba, 0xc2, 0xa4, 0x15, 0x4f, 0x32, 0x81, 0x77, 0x7d, 0xe6, + 0xcf, 0xf0, 0x24, 0x9f, 0x30, 0xf5, 0x8c, 0x53, 0xd4, 0x32, 0xc2, 0x57, 0xd8, 0x6d, 0x9b, 0x90, + 0xbd, 0xa1, 0xbd, 0x58, 0xc3, 0xe2, 0x62, 0x0d, 0x4f, 0x84, 0x88, 0x7f, 0x66, 0x71, 0x86, 0x74, + 0xbd, 0x23, 0xf9, 0x01, 0x08, 0x0b, 0x43, 0x89, 0x21, 0x2b, 0x77, 0x6f, 0xc7, 0x84, 0xfb, 0xb0, + 0x94, 0xe1, 0xb8, 0x46, 0xa2, 0x6b, 0x1c, 0xc9, 0x31, 0xec, 0xe1, 0x95, 0x46, 0x1e, 0x60, 0x50, + 0xc4, 0xda, 0x35, 0xb1, 0x0e, 0x6a, 0xa9, 0x8d, 0xf9, 0x9c, 0x56, 0xc9, 0xee, 0x04, 0x48, 0x5d, + 0x89, 0x3c, 0x86, 0x76, 0x49, 0x2b, 0xbf, 0x82, 0x8d, 0x41, 0xeb, 0xf0, 0xbd, 0xf5, 0xe9, 0xd1, + 0x15, 0xae, 0xcb, 0xa1, 0x55, 0x32, 0x92, 0x3e, 0x40, 0x61, 0x5e, 0x6e, 0x5c, 0x09, 0x21, 0xdf, + 0x00, 0x30, 0xad, 0x65, 0xe4, 0x65, 0x1a, 0xed, 0x42, 0xb7, 0x0e, 0x3f, 0x5a, 0x23, 0x84, 0xc1, + 0x78, 0x49, 0xa3, 0x25, 0x17, 0xf7, 0xb5, 0x03, 0x07, 0xeb, 0x48, 0xf9, 0x70, 0x4b, 0x54, 0x22, + 0xce, 0xf2, 0x3c, 0xca, 0xd7, 0xbc, 0x0a, 0x93, 0xa7, 0xb0, 0x1f, 0x88, 0x4b, 0xae, 0x58, 0x92, + 0xc6, 0xcb, 0xa1, 0xb1, 0xa9, 0x7c, 0x50, 0x4a, 0xe5, 0xac, 0xca, 0xa1, 0x75, 0x37, 0xf7, 0x53, + 0xd8, 0xaf, 0xf1, 0x48, 0x07, 0x1a, 0x2c, 0x8e, 0x17, 0xaf, 0xcf, 0x3f, 0xdd, 0x3f, 0x1c, 0x68, + 0x52, 0x0c, 0x23, 0xa5, 0xe5, 0x9c, 0x9c, 0x02, 0x2c, 0x55, 0x8a, 0x62, 0x7f, 0xbc, 0xb2, 0xc9, + 0x96, 0x78, 0x33, 0xb6, 0xea, 0x9c, 0x6b, 0x39, 0xa7, 0x25, 0xb7, 0xde, 0x0b, 0xd8, 0xab, 0x98, + 0x73, 0xd9, 0x97, 0x38, 0x37, 0xb2, 0xdb, 0x34, 0xff, 0x24, 0x5f, 0xc2, 0xfd, 0x57, 0xf9, 0x74, + 0x2e, 0x5e, 0xf7, 0x70, 0xdd, 0x4a, 0x14, 0x8f, 0xb3, 0xcc, 0xc7, 0x1b, 0x5f, 0x39, 0xee, 0xbf, + 0x0e, 0x3c, 0x78, 0xc3, 0xca, 0x90, 0x00, 0xfa, 0xe6, 0xde, 0x99, 0xfd, 0x8f, 0x78, 0x38, 0x41, + 0x79, 0x3a, 0xf9, 0xe9, 0x54, 0x70, 0x3f, 0x93, 0x12, 0xb9, 0x6f, 0xf5, 0xf3, 0x4a, 0x56, 0x07, + 0xf2, 0x4c, 0x64, 0x5e, 0x8c, 0x76, 0x5b, 0xfe, 0x27, 0x46, 0xae, 0x62, 0xce, 0xef, 0x9b, 0x55, + 0x36, 0xee, 0xa2, 0x72, 0x7b, 0x8c, 0x93, 0xce, 0x9f, 0xd7, 0x7d, 0xe7, 0xaf, 0xeb, 0xbe, 0xf3, + 0xf7, 0x75, 0xdf, 0xf9, 0xed, 0x9f, 0xfe, 0x3b, 0xde, 0xa6, 0x89, 0x73, 0xf4, 0x5f, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x7f, 0xc9, 0xec, 0xa7, 0x0a, 0x09, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.proto b/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.proto new file mode 100644 index 00000000..9e872fd6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/namespace.proto @@ -0,0 +1,82 @@ +syntax = "proto3"; + +package namespace; + +import "google/protobuf/any.proto"; +import "google/protobuf/wrappers.proto"; +import "github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.proto"; + +message RetentionOptions { + int64 retentionPeriodNanos = 1; + int64 blockSizeNanos = 2; + int64 bufferFutureNanos = 3; + int64 bufferPastNanos = 4; + bool blockDataExpiry = 5; + int64 blockDataExpiryAfterNotAccessPeriodNanos = 6; + int64 futureRetentionPeriodNanos = 7; +} + +message IndexOptions { + bool enabled = 1; + int64 blockSizeNanos = 2; +} + +message NamespaceOptions { + bool bootstrapEnabled = 1; + bool flushEnabled = 2; + bool writesToCommitLog = 3; + bool cleanupEnabled = 4; + bool repairEnabled = 5; + RetentionOptions retentionOptions = 6; + bool snapshotEnabled = 7; + IndexOptions indexOptions = 8; + SchemaOptions schemaOptions = 9; + bool coldWritesEnabled = 10; + NamespaceRuntimeOptions runtimeOptions = 11; + google.protobuf.BoolValue cacheBlocksOnRetrieve = 12; + AggregationOptions aggregationOptions = 13; + google.protobuf.Any extendedOptions = 14; +} + +// AggregationOptions is a set of options for aggregating data +// within the namespace. +message AggregationOptions { + // aggregations is a repeated field to support the ability to send aggregated data + // to a namespace also receiving unaggregated data. In this case, the namespace will + // have one Aggregation with aggregated set to false and another with aggregated set to true. + repeated Aggregation aggregations = 1; +} + +// Aggregation describes data points within the namespace. +message Aggregation { + // aggregated is true if data points are aggregated, false otherwise. + bool aggregated = 1; + + // attributes specifies how to aggregate data when aggregated is set to true. + // This field is ignored when aggregated is false and required when aggregated + // is true. + AggregatedAttributes attributes = 2; +} + +// AggregatedAttributes describe how to aggregate data. +message AggregatedAttributes { + // resolutionNanos is the time range to aggregate data across. + int64 resolutionNanos = 1; + DownsampleOptions downsampleOptions = 2; +} + +// DownsampleOptions is a set of options related to downsampling data. +message DownsampleOptions { + // all indicates whether to send data points to this namespace. If false, + // data points must be sent via rollup/recording rules. Defaults to true. + bool all = 1; +} + +message Registry { + map namespaces = 1; +} + +message NamespaceRuntimeOptions { + google.protobuf.DoubleValue writeIndexingPerCPUConcurrency = 1; + google.protobuf.DoubleValue flushIndexingPerCPUConcurrency = 2; +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.pb.go b/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.pb.go new file mode 100644 index 00000000..537d9f38 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.pb.go @@ -0,0 +1,753 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.proto + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// SchemaOptions contains schema information for a namespace. +type SchemaOptions struct { + // history contains a history of deployed schema definitions. + History *SchemaHistory `protobuf:"bytes,1,opt,name=history" json:"history,omitempty"` + // defaultMessageName identifies the proto message that contains the default schema for the namespace. + DefaultMessageName string `protobuf:"bytes,2,opt,name=defaultMessageName,proto3" json:"defaultMessageName,omitempty"` +} + +func (m *SchemaOptions) Reset() { *m = SchemaOptions{} } +func (m *SchemaOptions) String() string { return proto.CompactTextString(m) } +func (*SchemaOptions) ProtoMessage() {} +func (*SchemaOptions) Descriptor() ([]byte, []int) { return fileDescriptorSchema, []int{0} } + +func (m *SchemaOptions) GetHistory() *SchemaHistory { + if m != nil { + return m.History + } + return nil +} + +func (m *SchemaOptions) GetDefaultMessageName() string { + if m != nil { + return m.DefaultMessageName + } + return "" +} + +// SchemaHistory is versioned FileDescriptorSet. +type SchemaHistory struct { + // versions is a list of FileDescriptorSet sorted by version in ascending order. + // the list is a linked list and we use FileDescriptorSet.prevId to ensure the order is ascending. + Versions []*FileDescriptorSet `protobuf:"bytes,1,rep,name=versions" json:"versions,omitempty"` +} + +func (m *SchemaHistory) Reset() { *m = SchemaHistory{} } +func (m *SchemaHistory) String() string { return proto.CompactTextString(m) } +func (*SchemaHistory) ProtoMessage() {} +func (*SchemaHistory) Descriptor() ([]byte, []int) { return fileDescriptorSchema, []int{1} } + +func (m *SchemaHistory) GetVersions() []*FileDescriptorSet { + if m != nil { + return m.Versions + } + return nil +} + +// FileDescriptorSet is a set of proto file descriptors. +type FileDescriptorSet struct { + // id identifies a deployed version of FileDescriptorSet. + DeployId string `protobuf:"bytes,1,opt,name=deployId,proto3" json:"deployId,omitempty"` + // prevId identifies the previous deploy id of FileDescriptorSet. + PrevId string `protobuf:"bytes,2,opt,name=prevId,proto3" json:"prevId,omitempty"` + // descriptors is a list of proto file descriptors sorted by dependency in topological order. + Descriptors [][]byte `protobuf:"bytes,3,rep,name=descriptors" json:"descriptors,omitempty"` +} + +func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } +func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorSet) ProtoMessage() {} +func (*FileDescriptorSet) Descriptor() ([]byte, []int) { return fileDescriptorSchema, []int{2} } + +func (m *FileDescriptorSet) GetDeployId() string { + if m != nil { + return m.DeployId + } + return "" +} + +func (m *FileDescriptorSet) GetPrevId() string { + if m != nil { + return m.PrevId + } + return "" +} + +func (m *FileDescriptorSet) GetDescriptors() [][]byte { + if m != nil { + return m.Descriptors + } + return nil +} + +func init() { + proto.RegisterType((*SchemaOptions)(nil), "namespace.SchemaOptions") + proto.RegisterType((*SchemaHistory)(nil), "namespace.SchemaHistory") + proto.RegisterType((*FileDescriptorSet)(nil), "namespace.FileDescriptorSet") +} +func (m *SchemaOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SchemaOptions) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.History != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintSchema(dAtA, i, uint64(m.History.Size())) + n1, err := m.History.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if len(m.DefaultMessageName) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintSchema(dAtA, i, uint64(len(m.DefaultMessageName))) + i += copy(dAtA[i:], m.DefaultMessageName) + } + return i, nil +} + +func (m *SchemaHistory) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SchemaHistory) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Versions) > 0 { + for _, msg := range m.Versions { + dAtA[i] = 0xa + i++ + i = encodeVarintSchema(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *FileDescriptorSet) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FileDescriptorSet) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.DeployId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintSchema(dAtA, i, uint64(len(m.DeployId))) + i += copy(dAtA[i:], m.DeployId) + } + if len(m.PrevId) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintSchema(dAtA, i, uint64(len(m.PrevId))) + i += copy(dAtA[i:], m.PrevId) + } + if len(m.Descriptors) > 0 { + for _, b := range m.Descriptors { + dAtA[i] = 0x1a + i++ + i = encodeVarintSchema(dAtA, i, uint64(len(b))) + i += copy(dAtA[i:], b) + } + } + return i, nil +} + +func encodeVarintSchema(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *SchemaOptions) Size() (n int) { + var l int + _ = l + if m.History != nil { + l = m.History.Size() + n += 1 + l + sovSchema(uint64(l)) + } + l = len(m.DefaultMessageName) + if l > 0 { + n += 1 + l + sovSchema(uint64(l)) + } + return n +} + +func (m *SchemaHistory) Size() (n int) { + var l int + _ = l + if len(m.Versions) > 0 { + for _, e := range m.Versions { + l = e.Size() + n += 1 + l + sovSchema(uint64(l)) + } + } + return n +} + +func (m *FileDescriptorSet) Size() (n int) { + var l int + _ = l + l = len(m.DeployId) + if l > 0 { + n += 1 + l + sovSchema(uint64(l)) + } + l = len(m.PrevId) + if l > 0 { + n += 1 + l + sovSchema(uint64(l)) + } + if len(m.Descriptors) > 0 { + for _, b := range m.Descriptors { + l = len(b) + n += 1 + l + sovSchema(uint64(l)) + } + } + return n +} + +func sovSchema(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozSchema(x uint64) (n int) { + return sovSchema(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *SchemaOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSchema + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SchemaOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SchemaOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field History", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSchema + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSchema + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.History == nil { + m.History = &SchemaHistory{} + } + if err := m.History.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultMessageName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSchema + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSchema + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DefaultMessageName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSchema(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSchema + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SchemaHistory) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSchema + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SchemaHistory: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SchemaHistory: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Versions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSchema + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSchema + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Versions = append(m.Versions, &FileDescriptorSet{}) + if err := m.Versions[len(m.Versions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSchema(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSchema + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FileDescriptorSet) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSchema + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FileDescriptorSet: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FileDescriptorSet: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeployId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSchema + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSchema + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DeployId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSchema + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSchema + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrevId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Descriptors", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSchema + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSchema + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Descriptors = append(m.Descriptors, make([]byte, postIndex-iNdEx)) + copy(m.Descriptors[len(m.Descriptors)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSchema(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthSchema + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipSchema(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSchema + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSchema + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSchema + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthSchema + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSchema + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipSchema(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthSchema = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowSchema = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.proto", fileDescriptorSchema) +} + +var fileDescriptorSchema = []byte{ + // 286 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0xc1, 0x4a, 0xec, 0x30, + 0x14, 0x86, 0x6f, 0xee, 0xc0, 0x38, 0x4d, 0x15, 0x34, 0x0b, 0x29, 0x22, 0xa5, 0x74, 0xd5, 0x55, + 0x03, 0xed, 0xc6, 0xb5, 0x0c, 0x62, 0x17, 0x2a, 0x74, 0x9e, 0x20, 0x6d, 0x8e, 0x6d, 0xa0, 0x69, + 0x42, 0x92, 0x19, 0x98, 0xb7, 0xf0, 0xb1, 0x5c, 0xfa, 0x08, 0x52, 0x5f, 0x44, 0xec, 0x74, 0xca, + 0x80, 0x2e, 0xcf, 0xff, 0x7d, 0x9c, 0xf3, 0x27, 0x78, 0xdd, 0x08, 0xd7, 0x6e, 0xab, 0xb4, 0x56, + 0x92, 0xca, 0x9c, 0x57, 0x54, 0xe6, 0xd4, 0x9a, 0x9a, 0xf2, 0xaa, 0x57, 0x1c, 0x68, 0x03, 0x3d, + 0x18, 0xe6, 0x80, 0x53, 0x6d, 0x94, 0x53, 0xb4, 0x67, 0x12, 0xac, 0x66, 0x35, 0x50, 0x5b, 0xb7, + 0x20, 0x59, 0x3a, 0xc6, 0xc4, 0x9b, 0xf3, 0xd8, 0xe2, 0x8b, 0xcd, 0x88, 0x5e, 0xb4, 0x13, 0xaa, + 0xb7, 0x24, 0xc3, 0x67, 0xad, 0xb0, 0x4e, 0x99, 0x7d, 0x80, 0x22, 0x94, 0xf8, 0x59, 0x90, 0xce, + 0x76, 0x7a, 0x50, 0x1f, 0x0f, 0xbc, 0x3c, 0x8a, 0x24, 0xc5, 0x84, 0xc3, 0x2b, 0xdb, 0x76, 0xee, + 0x09, 0xac, 0x65, 0x0d, 0x3c, 0x33, 0x09, 0xc1, 0xff, 0x08, 0x25, 0x5e, 0xf9, 0x07, 0x89, 0x8b, + 0xe3, 0xd1, 0x69, 0x13, 0xb9, 0xc3, 0xab, 0x1d, 0x18, 0xfb, 0x53, 0x20, 0x40, 0xd1, 0x22, 0xf1, + 0xb3, 0xdb, 0x93, 0xab, 0x0f, 0xa2, 0x83, 0x35, 0xd8, 0xda, 0x08, 0xed, 0x94, 0xd9, 0x80, 0x2b, + 0x67, 0x3b, 0x16, 0xf8, 0xea, 0x17, 0x26, 0x37, 0x78, 0xc5, 0x41, 0x77, 0x6a, 0x5f, 0xf0, 0xf1, + 0x11, 0x5e, 0x39, 0xcf, 0xe4, 0x1a, 0x2f, 0xb5, 0x81, 0x5d, 0xc1, 0xa7, 0x7e, 0xd3, 0x44, 0x22, + 0xec, 0xf3, 0x79, 0x89, 0x0d, 0x16, 0xd1, 0x22, 0x39, 0x2f, 0x4f, 0xa3, 0xfb, 0xcb, 0xf7, 0x21, + 0x44, 0x1f, 0x43, 0x88, 0x3e, 0x87, 0x10, 0xbd, 0x7d, 0x85, 0xff, 0xaa, 0xe5, 0xf8, 0x9d, 0xf9, + 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0xeb, 0x4b, 0x47, 0x96, 0x01, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.proto b/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.proto new file mode 100644 index 00000000..2f68236d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/generated/proto/namespace/schema.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; +package namespace; + +// SchemaOptions contains schema information for a namespace. +message SchemaOptions { + // history contains a history of deployed schema definitions. + SchemaHistory history = 1; + // defaultMessageName identifies the proto message that contains the default schema for the namespace. + string defaultMessageName = 2; +} + +// SchemaHistory is versioned FileDescriptorSet. +message SchemaHistory { + // versions is a list of FileDescriptorSet sorted by version in ascending order. + // the list is a linked list and we use FileDescriptorSet.prevId to ensure the order is ascending. + repeated FileDescriptorSet versions = 1; +} + +// FileDescriptorSet is a set of proto file descriptors. +message FileDescriptorSet { + // id identifies a deployed version of FileDescriptorSet. + string deployId = 1; + // prevId identifies the previous deploy id of FileDescriptorSet. + string prevId = 2; + // descriptors is a list of proto file descriptors sorted by dependency in topological order. + repeated bytes descriptors = 3; +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/GoUnusedProtection__.go b/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/GoUnusedProtection__.go new file mode 100644 index 00000000..ab65d2bf --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/GoUnusedProtection__.go @@ -0,0 +1,26 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Autogenerated by Thrift Compiler (0.10.0) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package rpc + +var GoUnusedProtection__ int diff --git a/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc-consts.go b/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc-consts.go new file mode 100644 index 00000000..91031a92 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc-consts.go @@ -0,0 +1,38 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Autogenerated by Thrift Compiler (0.10.0) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package rpc + +import ( + "bytes" + "fmt" + "github.com/apache/thrift/lib/go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +func init() { +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc.go b/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc.go new file mode 100644 index 00000000..33e1bc2e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc.go @@ -0,0 +1,28562 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Autogenerated by Thrift Compiler (0.10.0) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package rpc + +import ( + "bytes" + "database/sql/driver" + "errors" + "fmt" + "github.com/apache/thrift/lib/go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +type TimeType int64 + +const ( + TimeType_UNIX_SECONDS TimeType = 0 + TimeType_UNIX_MICROSECONDS TimeType = 1 + TimeType_UNIX_MILLISECONDS TimeType = 2 + TimeType_UNIX_NANOSECONDS TimeType = 3 +) + +func (p TimeType) String() string { + switch p { + case TimeType_UNIX_SECONDS: + return "UNIX_SECONDS" + case TimeType_UNIX_MICROSECONDS: + return "UNIX_MICROSECONDS" + case TimeType_UNIX_MILLISECONDS: + return "UNIX_MILLISECONDS" + case TimeType_UNIX_NANOSECONDS: + return "UNIX_NANOSECONDS" + } + return "" +} + +func TimeTypeFromString(s string) (TimeType, error) { + switch s { + case "UNIX_SECONDS": + return TimeType_UNIX_SECONDS, nil + case "UNIX_MICROSECONDS": + return TimeType_UNIX_MICROSECONDS, nil + case "UNIX_MILLISECONDS": + return TimeType_UNIX_MILLISECONDS, nil + case "UNIX_NANOSECONDS": + return TimeType_UNIX_NANOSECONDS, nil + } + return TimeType(0), fmt.Errorf("not a valid TimeType string") +} + +func TimeTypePtr(v TimeType) *TimeType { return &v } + +func (p TimeType) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *TimeType) UnmarshalText(text []byte) error { + q, err := TimeTypeFromString(string(text)) + if err != nil { + return err + } + *p = q + return nil +} + +func (p *TimeType) Scan(value interface{}) error { + v, ok := value.(int64) + if !ok { + return errors.New("Scan value is not int64") + } + *p = TimeType(v) + return nil +} + +func (p *TimeType) Value() (driver.Value, error) { + if p == nil { + return nil, nil + } + return int64(*p), nil +} + +type ErrorType int64 + +const ( + ErrorType_INTERNAL_ERROR ErrorType = 0 + ErrorType_BAD_REQUEST ErrorType = 1 +) + +func (p ErrorType) String() string { + switch p { + case ErrorType_INTERNAL_ERROR: + return "INTERNAL_ERROR" + case ErrorType_BAD_REQUEST: + return "BAD_REQUEST" + } + return "" +} + +func ErrorTypeFromString(s string) (ErrorType, error) { + switch s { + case "INTERNAL_ERROR": + return ErrorType_INTERNAL_ERROR, nil + case "BAD_REQUEST": + return ErrorType_BAD_REQUEST, nil + } + return ErrorType(0), fmt.Errorf("not a valid ErrorType string") +} + +func ErrorTypePtr(v ErrorType) *ErrorType { return &v } + +func (p ErrorType) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *ErrorType) UnmarshalText(text []byte) error { + q, err := ErrorTypeFromString(string(text)) + if err != nil { + return err + } + *p = q + return nil +} + +func (p *ErrorType) Scan(value interface{}) error { + v, ok := value.(int64) + if !ok { + return errors.New("Scan value is not int64") + } + *p = ErrorType(v) + return nil +} + +func (p *ErrorType) Value() (driver.Value, error) { + if p == nil { + return nil, nil + } + return int64(*p), nil +} + +type AggregateQueryType int64 + +const ( + AggregateQueryType_AGGREGATE_BY_TAG_NAME AggregateQueryType = 0 + AggregateQueryType_AGGREGATE_BY_TAG_NAME_VALUE AggregateQueryType = 1 +) + +func (p AggregateQueryType) String() string { + switch p { + case AggregateQueryType_AGGREGATE_BY_TAG_NAME: + return "AGGREGATE_BY_TAG_NAME" + case AggregateQueryType_AGGREGATE_BY_TAG_NAME_VALUE: + return "AGGREGATE_BY_TAG_NAME_VALUE" + } + return "" +} + +func AggregateQueryTypeFromString(s string) (AggregateQueryType, error) { + switch s { + case "AGGREGATE_BY_TAG_NAME": + return AggregateQueryType_AGGREGATE_BY_TAG_NAME, nil + case "AGGREGATE_BY_TAG_NAME_VALUE": + return AggregateQueryType_AGGREGATE_BY_TAG_NAME_VALUE, nil + } + return AggregateQueryType(0), fmt.Errorf("not a valid AggregateQueryType string") +} + +func AggregateQueryTypePtr(v AggregateQueryType) *AggregateQueryType { return &v } + +func (p AggregateQueryType) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *AggregateQueryType) UnmarshalText(text []byte) error { + q, err := AggregateQueryTypeFromString(string(text)) + if err != nil { + return err + } + *p = q + return nil +} + +func (p *AggregateQueryType) Scan(value interface{}) error { + v, ok := value.(int64) + if !ok { + return errors.New("Scan value is not int64") + } + *p = AggregateQueryType(v) + return nil +} + +func (p *AggregateQueryType) Value() (driver.Value, error) { + if p == nil { + return nil, nil + } + return int64(*p), nil +} + +// Attributes: +// - Type +// - Message +type Error struct { + Type ErrorType `thrift:"type,1,required" db:"type" json:"type"` + Message string `thrift:"message,2,required" db:"message" json:"message"` +} + +func NewError() *Error { + return &Error{ + Type: 0, + } +} + +func (p *Error) GetType() ErrorType { + return p.Type +} + +func (p *Error) GetMessage() string { + return p.Message +} +func (p *Error) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetType bool = false + var issetMessage bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetType = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetMessage = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetType { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Type is not set")) + } + if !issetMessage { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Message is not set")) + } + return nil +} + +func (p *Error) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + temp := ErrorType(v) + p.Type = temp + } + return nil +} + +func (p *Error) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Message = v + } + return nil +} + +func (p *Error) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Error"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Error) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("type", thrift.I32, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:type: ", p), err) + } + if err := oprot.WriteI32(int32(p.Type)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.type (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:type: ", p), err) + } + return err +} + +func (p *Error) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("message", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:message: ", p), err) + } + if err := oprot.WriteString(string(p.Message)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.message (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:message: ", p), err) + } + return err +} + +func (p *Error) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Error(%+v)", *p) +} + +func (p *Error) Error() string { + return p.String() +} + +// Attributes: +// - Errors +type WriteBatchRawErrors struct { + Errors []*WriteBatchRawError `thrift:"errors,1,required" db:"errors" json:"errors"` +} + +func NewWriteBatchRawErrors() *WriteBatchRawErrors { + return &WriteBatchRawErrors{} +} + +func (p *WriteBatchRawErrors) GetErrors() []*WriteBatchRawError { + return p.Errors +} +func (p *WriteBatchRawErrors) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetErrors bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetErrors = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetErrors { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Errors is not set")) + } + return nil +} + +func (p *WriteBatchRawErrors) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*WriteBatchRawError, 0, size) + p.Errors = tSlice + for i := 0; i < size; i++ { + _elem0 := &WriteBatchRawError{} + if err := _elem0.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err) + } + p.Errors = append(p.Errors, _elem0) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *WriteBatchRawErrors) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteBatchRawErrors"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteBatchRawErrors) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("errors", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:errors: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Errors)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Errors { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:errors: ", p), err) + } + return err +} + +func (p *WriteBatchRawErrors) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteBatchRawErrors(%+v)", *p) +} + +func (p *WriteBatchRawErrors) Error() string { + return p.String() +} + +// Attributes: +// - RangeStart +// - RangeEnd +// - NameSpace +// - ID +// - RangeType +// - ResultTimeType +type FetchRequest struct { + RangeStart int64 `thrift:"rangeStart,1,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,2,required" db:"rangeEnd" json:"rangeEnd"` + NameSpace string `thrift:"nameSpace,3,required" db:"nameSpace" json:"nameSpace"` + ID string `thrift:"id,4,required" db:"id" json:"id"` + RangeType TimeType `thrift:"rangeType,5" db:"rangeType" json:"rangeType,omitempty"` + ResultTimeType TimeType `thrift:"resultTimeType,6" db:"resultTimeType" json:"resultTimeType,omitempty"` +} + +func NewFetchRequest() *FetchRequest { + return &FetchRequest{ + RangeType: 0, + + ResultTimeType: 0, + } +} + +func (p *FetchRequest) GetRangeStart() int64 { + return p.RangeStart +} + +func (p *FetchRequest) GetRangeEnd() int64 { + return p.RangeEnd +} + +func (p *FetchRequest) GetNameSpace() string { + return p.NameSpace +} + +func (p *FetchRequest) GetID() string { + return p.ID +} + +var FetchRequest_RangeType_DEFAULT TimeType = 0 + +func (p *FetchRequest) GetRangeType() TimeType { + return p.RangeType +} + +var FetchRequest_ResultTimeType_DEFAULT TimeType = 0 + +func (p *FetchRequest) GetResultTimeType() TimeType { + return p.ResultTimeType +} +func (p *FetchRequest) IsSetRangeType() bool { + return p.RangeType != FetchRequest_RangeType_DEFAULT +} + +func (p *FetchRequest) IsSetResultTimeType() bool { + return p.ResultTimeType != FetchRequest_ResultTimeType_DEFAULT +} + +func (p *FetchRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetRangeStart bool = false + var issetRangeEnd bool = false + var issetNameSpace bool = false + var issetID bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetRangeStart = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetRangeEnd = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetNameSpace = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetID = true + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetRangeStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) + } + if !issetRangeEnd { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeEnd is not set")) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + return nil +} + +func (p *FetchRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.RangeStart = v + } + return nil +} + +func (p *FetchRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.RangeEnd = v + } + return nil +} + +func (p *FetchRequest) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *FetchRequest) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *FetchRequest) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + temp := TimeType(v) + p.RangeType = temp + } + return nil +} + +func (p *FetchRequest) ReadField6(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 6: ", err) + } else { + temp := TimeType(v) + p.ResultTimeType = temp + } + return nil +} + +func (p *FetchRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:rangeStart: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:rangeStart: ", p), err) + } + return err +} + +func (p *FetchRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:rangeEnd: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:rangeEnd: ", p), err) + } + return err +} + +func (p *FetchRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:nameSpace: ", p), err) + } + if err := oprot.WriteString(string(p.NameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:nameSpace: ", p), err) + } + return err +} + +func (p *FetchRequest) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:id: ", p), err) + } + if err := oprot.WriteString(string(p.ID)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:id: ", p), err) + } + return err +} + +func (p *FetchRequest) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetRangeType() { + if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:rangeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.RangeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeType (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:rangeType: ", p), err) + } + } + return err +} + +func (p *FetchRequest) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetResultTimeType() { + if err := oprot.WriteFieldBegin("resultTimeType", thrift.I32, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:resultTimeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.ResultTimeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.resultTimeType (6) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:resultTimeType: ", p), err) + } + } + return err +} + +func (p *FetchRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchRequest(%+v)", *p) +} + +// Attributes: +// - Datapoints +type FetchResult_ struct { + Datapoints []*Datapoint `thrift:"datapoints,1,required" db:"datapoints" json:"datapoints"` +} + +func NewFetchResult_() *FetchResult_ { + return &FetchResult_{} +} + +func (p *FetchResult_) GetDatapoints() []*Datapoint { + return p.Datapoints +} +func (p *FetchResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetDatapoints bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetDatapoints = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetDatapoints { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Datapoints is not set")) + } + return nil +} + +func (p *FetchResult_) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Datapoint, 0, size) + p.Datapoints = tSlice + for i := 0; i < size; i++ { + _elem1 := &Datapoint{ + TimestampTimeType: 0, + } + if err := _elem1.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem1), err) + } + p.Datapoints = append(p.Datapoints, _elem1) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("datapoints", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:datapoints: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Datapoints)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Datapoints { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:datapoints: ", p), err) + } + return err +} + +func (p *FetchResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchResult_(%+v)", *p) +} + +// Attributes: +// - Timestamp +// - Value +// - Annotation +// - TimestampTimeType +type Datapoint struct { + Timestamp int64 `thrift:"timestamp,1,required" db:"timestamp" json:"timestamp"` + Value float64 `thrift:"value,2,required" db:"value" json:"value"` + Annotation []byte `thrift:"annotation,3" db:"annotation" json:"annotation,omitempty"` + TimestampTimeType TimeType `thrift:"timestampTimeType,4" db:"timestampTimeType" json:"timestampTimeType,omitempty"` +} + +func NewDatapoint() *Datapoint { + return &Datapoint{ + TimestampTimeType: 0, + } +} + +func (p *Datapoint) GetTimestamp() int64 { + return p.Timestamp +} + +func (p *Datapoint) GetValue() float64 { + return p.Value +} + +var Datapoint_Annotation_DEFAULT []byte + +func (p *Datapoint) GetAnnotation() []byte { + return p.Annotation +} + +var Datapoint_TimestampTimeType_DEFAULT TimeType = 0 + +func (p *Datapoint) GetTimestampTimeType() TimeType { + return p.TimestampTimeType +} +func (p *Datapoint) IsSetAnnotation() bool { + return p.Annotation != nil +} + +func (p *Datapoint) IsSetTimestampTimeType() bool { + return p.TimestampTimeType != Datapoint_TimestampTimeType_DEFAULT +} + +func (p *Datapoint) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetTimestamp bool = false + var issetValue bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetTimestamp = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetValue = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetTimestamp { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamp is not set")) + } + if !issetValue { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Value is not set")) + } + return nil +} + +func (p *Datapoint) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Timestamp = v + } + return nil +} + +func (p *Datapoint) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadDouble(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Value = v + } + return nil +} + +func (p *Datapoint) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.Annotation = v + } + return nil +} + +func (p *Datapoint) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + temp := TimeType(v) + p.TimestampTimeType = temp + } + return nil +} + +func (p *Datapoint) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Datapoint"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Datapoint) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:timestamp: ", p), err) + } + if err := oprot.WriteI64(int64(p.Timestamp)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.timestamp (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:timestamp: ", p), err) + } + return err +} + +func (p *Datapoint) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("value", thrift.DOUBLE, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:value: ", p), err) + } + if err := oprot.WriteDouble(float64(p.Value)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.value (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:value: ", p), err) + } + return err +} + +func (p *Datapoint) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetAnnotation() { + if err := oprot.WriteFieldBegin("annotation", thrift.STRING, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:annotation: ", p), err) + } + if err := oprot.WriteBinary(p.Annotation); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.annotation (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:annotation: ", p), err) + } + } + return err +} + +func (p *Datapoint) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetTimestampTimeType() { + if err := oprot.WriteFieldBegin("timestampTimeType", thrift.I32, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:timestampTimeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.TimestampTimeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.timestampTimeType (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:timestampTimeType: ", p), err) + } + } + return err +} + +func (p *Datapoint) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Datapoint(%+v)", *p) +} + +// Attributes: +// - NameSpace +// - ID +// - Datapoint +type WriteRequest struct { + NameSpace string `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` + ID string `thrift:"id,2,required" db:"id" json:"id"` + Datapoint *Datapoint `thrift:"datapoint,3,required" db:"datapoint" json:"datapoint"` +} + +func NewWriteRequest() *WriteRequest { + return &WriteRequest{} +} + +func (p *WriteRequest) GetNameSpace() string { + return p.NameSpace +} + +func (p *WriteRequest) GetID() string { + return p.ID +} + +var WriteRequest_Datapoint_DEFAULT *Datapoint + +func (p *WriteRequest) GetDatapoint() *Datapoint { + if !p.IsSetDatapoint() { + return WriteRequest_Datapoint_DEFAULT + } + return p.Datapoint +} +func (p *WriteRequest) IsSetDatapoint() bool { + return p.Datapoint != nil +} + +func (p *WriteRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpace bool = false + var issetID bool = false + var issetDatapoint bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpace = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetID = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetDatapoint = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetDatapoint { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Datapoint is not set")) + } + return nil +} + +func (p *WriteRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *WriteRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *WriteRequest) ReadField3(iprot thrift.TProtocol) error { + p.Datapoint = &Datapoint{ + TimestampTimeType: 0, + } + if err := p.Datapoint.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Datapoint), err) + } + return nil +} + +func (p *WriteRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + } + if err := oprot.WriteString(string(p.NameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + } + return err +} + +func (p *WriteRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:id: ", p), err) + } + if err := oprot.WriteString(string(p.ID)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:id: ", p), err) + } + return err +} + +func (p *WriteRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("datapoint", thrift.STRUCT, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:datapoint: ", p), err) + } + if err := p.Datapoint.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Datapoint), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:datapoint: ", p), err) + } + return err +} + +func (p *WriteRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteRequest(%+v)", *p) +} + +// Attributes: +// - NameSpace +// - ID +// - Tags +// - Datapoint +type WriteTaggedRequest struct { + NameSpace string `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` + ID string `thrift:"id,2,required" db:"id" json:"id"` + Tags []*Tag `thrift:"tags,3,required" db:"tags" json:"tags"` + Datapoint *Datapoint `thrift:"datapoint,4,required" db:"datapoint" json:"datapoint"` +} + +func NewWriteTaggedRequest() *WriteTaggedRequest { + return &WriteTaggedRequest{} +} + +func (p *WriteTaggedRequest) GetNameSpace() string { + return p.NameSpace +} + +func (p *WriteTaggedRequest) GetID() string { + return p.ID +} + +func (p *WriteTaggedRequest) GetTags() []*Tag { + return p.Tags +} + +var WriteTaggedRequest_Datapoint_DEFAULT *Datapoint + +func (p *WriteTaggedRequest) GetDatapoint() *Datapoint { + if !p.IsSetDatapoint() { + return WriteTaggedRequest_Datapoint_DEFAULT + } + return p.Datapoint +} +func (p *WriteTaggedRequest) IsSetDatapoint() bool { + return p.Datapoint != nil +} + +func (p *WriteTaggedRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpace bool = false + var issetID bool = false + var issetTags bool = false + var issetDatapoint bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpace = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetID = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetTags = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetDatapoint = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetTags { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Tags is not set")) + } + if !issetDatapoint { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Datapoint is not set")) + } + return nil +} + +func (p *WriteTaggedRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *WriteTaggedRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *WriteTaggedRequest) ReadField3(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Tag, 0, size) + p.Tags = tSlice + for i := 0; i < size; i++ { + _elem2 := &Tag{} + if err := _elem2.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem2), err) + } + p.Tags = append(p.Tags, _elem2) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *WriteTaggedRequest) ReadField4(iprot thrift.TProtocol) error { + p.Datapoint = &Datapoint{ + TimestampTimeType: 0, + } + if err := p.Datapoint.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Datapoint), err) + } + return nil +} + +func (p *WriteTaggedRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteTaggedRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteTaggedRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + } + if err := oprot.WriteString(string(p.NameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + } + return err +} + +func (p *WriteTaggedRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:id: ", p), err) + } + if err := oprot.WriteString(string(p.ID)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:id: ", p), err) + } + return err +} + +func (p *WriteTaggedRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("tags", thrift.LIST, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:tags: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Tags)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Tags { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:tags: ", p), err) + } + return err +} + +func (p *WriteTaggedRequest) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("datapoint", thrift.STRUCT, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:datapoint: ", p), err) + } + if err := p.Datapoint.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Datapoint), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:datapoint: ", p), err) + } + return err +} + +func (p *WriteTaggedRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteTaggedRequest(%+v)", *p) +} + +// Attributes: +// - RangeStart +// - RangeEnd +// - NameSpace +// - Ids +// - RangeTimeType +type FetchBatchRawRequest struct { + RangeStart int64 `thrift:"rangeStart,1,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,2,required" db:"rangeEnd" json:"rangeEnd"` + NameSpace []byte `thrift:"nameSpace,3,required" db:"nameSpace" json:"nameSpace"` + Ids [][]byte `thrift:"ids,4,required" db:"ids" json:"ids"` + RangeTimeType TimeType `thrift:"rangeTimeType,5" db:"rangeTimeType" json:"rangeTimeType,omitempty"` +} + +func NewFetchBatchRawRequest() *FetchBatchRawRequest { + return &FetchBatchRawRequest{ + RangeTimeType: 0, + } +} + +func (p *FetchBatchRawRequest) GetRangeStart() int64 { + return p.RangeStart +} + +func (p *FetchBatchRawRequest) GetRangeEnd() int64 { + return p.RangeEnd +} + +func (p *FetchBatchRawRequest) GetNameSpace() []byte { + return p.NameSpace +} + +func (p *FetchBatchRawRequest) GetIds() [][]byte { + return p.Ids +} + +var FetchBatchRawRequest_RangeTimeType_DEFAULT TimeType = 0 + +func (p *FetchBatchRawRequest) GetRangeTimeType() TimeType { + return p.RangeTimeType +} +func (p *FetchBatchRawRequest) IsSetRangeTimeType() bool { + return p.RangeTimeType != FetchBatchRawRequest_RangeTimeType_DEFAULT +} + +func (p *FetchBatchRawRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetRangeStart bool = false + var issetRangeEnd bool = false + var issetNameSpace bool = false + var issetIds bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetRangeStart = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetRangeEnd = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetNameSpace = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetIds = true + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetRangeStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) + } + if !issetRangeEnd { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeEnd is not set")) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetIds { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Ids is not set")) + } + return nil +} + +func (p *FetchBatchRawRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.RangeStart = v + } + return nil +} + +func (p *FetchBatchRawRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.RangeEnd = v + } + return nil +} + +func (p *FetchBatchRawRequest) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *FetchBatchRawRequest) ReadField4(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([][]byte, 0, size) + p.Ids = tSlice + for i := 0; i < size; i++ { + var _elem3 []byte + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + _elem3 = v + } + p.Ids = append(p.Ids, _elem3) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchBatchRawRequest) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + temp := TimeType(v) + p.RangeTimeType = temp + } + return nil +} + +func (p *FetchBatchRawRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchBatchRawRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchBatchRawRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:rangeStart: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:rangeStart: ", p), err) + } + return err +} + +func (p *FetchBatchRawRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:rangeEnd: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:rangeEnd: ", p), err) + } + return err +} + +func (p *FetchBatchRawRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:nameSpace: ", p), err) + } + if err := oprot.WriteBinary(p.NameSpace); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:nameSpace: ", p), err) + } + return err +} + +func (p *FetchBatchRawRequest) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("ids", thrift.LIST, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:ids: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRING, len(p.Ids)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Ids { + if err := oprot.WriteBinary(v); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:ids: ", p), err) + } + return err +} + +func (p *FetchBatchRawRequest) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetRangeTimeType() { + if err := oprot.WriteFieldBegin("rangeTimeType", thrift.I32, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:rangeTimeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.RangeTimeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeTimeType (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:rangeTimeType: ", p), err) + } + } + return err +} + +func (p *FetchBatchRawRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchBatchRawRequest(%+v)", *p) +} + +// Attributes: +// - NameSpaces +// - Elements +type FetchBatchRawV2Request struct { + NameSpaces [][]byte `thrift:"nameSpaces,1,required" db:"nameSpaces" json:"nameSpaces"` + Elements []*FetchBatchRawV2RequestElement `thrift:"elements,2,required" db:"elements" json:"elements"` +} + +func NewFetchBatchRawV2Request() *FetchBatchRawV2Request { + return &FetchBatchRawV2Request{} +} + +func (p *FetchBatchRawV2Request) GetNameSpaces() [][]byte { + return p.NameSpaces +} + +func (p *FetchBatchRawV2Request) GetElements() []*FetchBatchRawV2RequestElement { + return p.Elements +} +func (p *FetchBatchRawV2Request) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpaces bool = false + var issetElements bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpaces = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetElements = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpaces { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpaces is not set")) + } + if !issetElements { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Elements is not set")) + } + return nil +} + +func (p *FetchBatchRawV2Request) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([][]byte, 0, size) + p.NameSpaces = tSlice + for i := 0; i < size; i++ { + var _elem4 []byte + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + _elem4 = v + } + p.NameSpaces = append(p.NameSpaces, _elem4) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchBatchRawV2Request) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*FetchBatchRawV2RequestElement, 0, size) + p.Elements = tSlice + for i := 0; i < size; i++ { + _elem5 := &FetchBatchRawV2RequestElement{ + RangeTimeType: 0, + } + if err := _elem5.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem5), err) + } + p.Elements = append(p.Elements, _elem5) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchBatchRawV2Request) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchBatchRawV2Request"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchBatchRawV2Request) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpaces", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpaces: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRING, len(p.NameSpaces)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.NameSpaces { + if err := oprot.WriteBinary(v); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpaces: ", p), err) + } + return err +} + +func (p *FetchBatchRawV2Request) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("elements", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:elements: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Elements)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Elements { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:elements: ", p), err) + } + return err +} + +func (p *FetchBatchRawV2Request) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchBatchRawV2Request(%+v)", *p) +} + +// Attributes: +// - NameSpace +// - RangeStart +// - RangeEnd +// - ID +// - RangeTimeType +type FetchBatchRawV2RequestElement struct { + NameSpace int64 `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` + RangeStart int64 `thrift:"rangeStart,2,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,3,required" db:"rangeEnd" json:"rangeEnd"` + ID []byte `thrift:"id,4,required" db:"id" json:"id"` + RangeTimeType TimeType `thrift:"rangeTimeType,5" db:"rangeTimeType" json:"rangeTimeType,omitempty"` +} + +func NewFetchBatchRawV2RequestElement() *FetchBatchRawV2RequestElement { + return &FetchBatchRawV2RequestElement{ + RangeTimeType: 0, + } +} + +func (p *FetchBatchRawV2RequestElement) GetNameSpace() int64 { + return p.NameSpace +} + +func (p *FetchBatchRawV2RequestElement) GetRangeStart() int64 { + return p.RangeStart +} + +func (p *FetchBatchRawV2RequestElement) GetRangeEnd() int64 { + return p.RangeEnd +} + +func (p *FetchBatchRawV2RequestElement) GetID() []byte { + return p.ID +} + +var FetchBatchRawV2RequestElement_RangeTimeType_DEFAULT TimeType = 0 + +func (p *FetchBatchRawV2RequestElement) GetRangeTimeType() TimeType { + return p.RangeTimeType +} +func (p *FetchBatchRawV2RequestElement) IsSetRangeTimeType() bool { + return p.RangeTimeType != FetchBatchRawV2RequestElement_RangeTimeType_DEFAULT +} + +func (p *FetchBatchRawV2RequestElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpace bool = false + var issetRangeStart bool = false + var issetRangeEnd bool = false + var issetID bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpace = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetRangeStart = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetRangeEnd = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetID = true + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetRangeStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) + } + if !issetRangeEnd { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeEnd is not set")) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + return nil +} + +func (p *FetchBatchRawV2RequestElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *FetchBatchRawV2RequestElement) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.RangeStart = v + } + return nil +} + +func (p *FetchBatchRawV2RequestElement) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.RangeEnd = v + } + return nil +} + +func (p *FetchBatchRawV2RequestElement) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *FetchBatchRawV2RequestElement) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + temp := TimeType(v) + p.RangeTimeType = temp + } + return nil +} + +func (p *FetchBatchRawV2RequestElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchBatchRawV2RequestElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchBatchRawV2RequestElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + } + if err := oprot.WriteI64(int64(p.NameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + } + return err +} + +func (p *FetchBatchRawV2RequestElement) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:rangeStart: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:rangeStart: ", p), err) + } + return err +} + +func (p *FetchBatchRawV2RequestElement) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rangeEnd: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rangeEnd: ", p), err) + } + return err +} + +func (p *FetchBatchRawV2RequestElement) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:id: ", p), err) + } + if err := oprot.WriteBinary(p.ID); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:id: ", p), err) + } + return err +} + +func (p *FetchBatchRawV2RequestElement) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetRangeTimeType() { + if err := oprot.WriteFieldBegin("rangeTimeType", thrift.I32, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:rangeTimeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.RangeTimeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeTimeType (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:rangeTimeType: ", p), err) + } + } + return err +} + +func (p *FetchBatchRawV2RequestElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchBatchRawV2RequestElement(%+v)", *p) +} + +// Attributes: +// - Elements +type FetchBatchRawResult_ struct { + Elements []*FetchRawResult_ `thrift:"elements,1,required" db:"elements" json:"elements"` +} + +func NewFetchBatchRawResult_() *FetchBatchRawResult_ { + return &FetchBatchRawResult_{} +} + +func (p *FetchBatchRawResult_) GetElements() []*FetchRawResult_ { + return p.Elements +} +func (p *FetchBatchRawResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetElements bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetElements = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetElements { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Elements is not set")) + } + return nil +} + +func (p *FetchBatchRawResult_) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*FetchRawResult_, 0, size) + p.Elements = tSlice + for i := 0; i < size; i++ { + _elem6 := &FetchRawResult_{} + if err := _elem6.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem6), err) + } + p.Elements = append(p.Elements, _elem6) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchBatchRawResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchBatchRawResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchBatchRawResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("elements", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:elements: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Elements)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Elements { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:elements: ", p), err) + } + return err +} + +func (p *FetchBatchRawResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchBatchRawResult_(%+v)", *p) +} + +// Attributes: +// - Segments +// - Err +type FetchRawResult_ struct { + Segments []*Segments `thrift:"segments,1,required" db:"segments" json:"segments"` + Err *Error `thrift:"err,2" db:"err" json:"err,omitempty"` +} + +func NewFetchRawResult_() *FetchRawResult_ { + return &FetchRawResult_{} +} + +func (p *FetchRawResult_) GetSegments() []*Segments { + return p.Segments +} + +var FetchRawResult__Err_DEFAULT *Error + +func (p *FetchRawResult_) GetErr() *Error { + if !p.IsSetErr() { + return FetchRawResult__Err_DEFAULT + } + return p.Err +} +func (p *FetchRawResult_) IsSetErr() bool { + return p.Err != nil +} + +func (p *FetchRawResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetSegments bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetSegments = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetSegments { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Segments is not set")) + } + return nil +} + +func (p *FetchRawResult_) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Segments, 0, size) + p.Segments = tSlice + for i := 0; i < size; i++ { + _elem7 := &Segments{} + if err := _elem7.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem7), err) + } + p.Segments = append(p.Segments, _elem7) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchRawResult_) ReadField2(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *FetchRawResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchRawResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchRawResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("segments", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:segments: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Segments)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Segments { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:segments: ", p), err) + } + return err +} + +func (p *FetchRawResult_) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:err: ", p), err) + } + } + return err +} + +func (p *FetchRawResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchRawResult_(%+v)", *p) +} + +// Attributes: +// - Merged +// - Unmerged +type Segments struct { + Merged *Segment `thrift:"merged,1" db:"merged" json:"merged,omitempty"` + Unmerged []*Segment `thrift:"unmerged,2" db:"unmerged" json:"unmerged,omitempty"` +} + +func NewSegments() *Segments { + return &Segments{} +} + +var Segments_Merged_DEFAULT *Segment + +func (p *Segments) GetMerged() *Segment { + if !p.IsSetMerged() { + return Segments_Merged_DEFAULT + } + return p.Merged +} + +var Segments_Unmerged_DEFAULT []*Segment + +func (p *Segments) GetUnmerged() []*Segment { + return p.Unmerged +} +func (p *Segments) IsSetMerged() bool { + return p.Merged != nil +} + +func (p *Segments) IsSetUnmerged() bool { + return p.Unmerged != nil +} + +func (p *Segments) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *Segments) ReadField1(iprot thrift.TProtocol) error { + p.Merged = &Segment{} + if err := p.Merged.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Merged), err) + } + return nil +} + +func (p *Segments) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Segment, 0, size) + p.Unmerged = tSlice + for i := 0; i < size; i++ { + _elem8 := &Segment{} + if err := _elem8.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem8), err) + } + p.Unmerged = append(p.Unmerged, _elem8) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *Segments) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Segments"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Segments) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetMerged() { + if err := oprot.WriteFieldBegin("merged", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:merged: ", p), err) + } + if err := p.Merged.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Merged), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:merged: ", p), err) + } + } + return err +} + +func (p *Segments) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetUnmerged() { + if err := oprot.WriteFieldBegin("unmerged", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:unmerged: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Unmerged)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Unmerged { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:unmerged: ", p), err) + } + } + return err +} + +func (p *Segments) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Segments(%+v)", *p) +} + +// Attributes: +// - Head +// - Tail +// - StartTime +// - BlockSize +// - Checksum +type Segment struct { + Head []byte `thrift:"head,1,required" db:"head" json:"head"` + Tail []byte `thrift:"tail,2,required" db:"tail" json:"tail"` + StartTime *int64 `thrift:"startTime,3" db:"startTime" json:"startTime,omitempty"` + BlockSize *int64 `thrift:"blockSize,4" db:"blockSize" json:"blockSize,omitempty"` + Checksum *int64 `thrift:"checksum,5" db:"checksum" json:"checksum,omitempty"` +} + +func NewSegment() *Segment { + return &Segment{} +} + +func (p *Segment) GetHead() []byte { + return p.Head +} + +func (p *Segment) GetTail() []byte { + return p.Tail +} + +var Segment_StartTime_DEFAULT int64 + +func (p *Segment) GetStartTime() int64 { + if !p.IsSetStartTime() { + return Segment_StartTime_DEFAULT + } + return *p.StartTime +} + +var Segment_BlockSize_DEFAULT int64 + +func (p *Segment) GetBlockSize() int64 { + if !p.IsSetBlockSize() { + return Segment_BlockSize_DEFAULT + } + return *p.BlockSize +} + +var Segment_Checksum_DEFAULT int64 + +func (p *Segment) GetChecksum() int64 { + if !p.IsSetChecksum() { + return Segment_Checksum_DEFAULT + } + return *p.Checksum +} +func (p *Segment) IsSetStartTime() bool { + return p.StartTime != nil +} + +func (p *Segment) IsSetBlockSize() bool { + return p.BlockSize != nil +} + +func (p *Segment) IsSetChecksum() bool { + return p.Checksum != nil +} + +func (p *Segment) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetHead bool = false + var issetTail bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetHead = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetTail = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetHead { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Head is not set")) + } + if !issetTail { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Tail is not set")) + } + return nil +} + +func (p *Segment) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Head = v + } + return nil +} + +func (p *Segment) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Tail = v + } + return nil +} + +func (p *Segment) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.StartTime = &v + } + return nil +} + +func (p *Segment) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.BlockSize = &v + } + return nil +} + +func (p *Segment) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.Checksum = &v + } + return nil +} + +func (p *Segment) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Segment"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Segment) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("head", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:head: ", p), err) + } + if err := oprot.WriteBinary(p.Head); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.head (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:head: ", p), err) + } + return err +} + +func (p *Segment) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("tail", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:tail: ", p), err) + } + if err := oprot.WriteBinary(p.Tail); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.tail (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:tail: ", p), err) + } + return err +} + +func (p *Segment) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetStartTime() { + if err := oprot.WriteFieldBegin("startTime", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:startTime: ", p), err) + } + if err := oprot.WriteI64(int64(*p.StartTime)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.startTime (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:startTime: ", p), err) + } + } + return err +} + +func (p *Segment) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetBlockSize() { + if err := oprot.WriteFieldBegin("blockSize", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:blockSize: ", p), err) + } + if err := oprot.WriteI64(int64(*p.BlockSize)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.blockSize (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:blockSize: ", p), err) + } + } + return err +} + +func (p *Segment) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetChecksum() { + if err := oprot.WriteFieldBegin("checksum", thrift.I64, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:checksum: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Checksum)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.checksum (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:checksum: ", p), err) + } + } + return err +} + +func (p *Segment) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Segment(%+v)", *p) +} + +// Attributes: +// - NameSpace +// - Query +// - RangeStart +// - RangeEnd +// - FetchData +// - Limit +// - RangeTimeType +// - RequireExhaustive +// - DocsLimit +type FetchTaggedRequest struct { + NameSpace []byte `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` + Query []byte `thrift:"query,2,required" db:"query" json:"query"` + RangeStart int64 `thrift:"rangeStart,3,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,4,required" db:"rangeEnd" json:"rangeEnd"` + FetchData bool `thrift:"fetchData,5,required" db:"fetchData" json:"fetchData"` + Limit *int64 `thrift:"limit,6" db:"limit" json:"limit,omitempty"` + RangeTimeType TimeType `thrift:"rangeTimeType,7" db:"rangeTimeType" json:"rangeTimeType,omitempty"` + RequireExhaustive bool `thrift:"requireExhaustive,8" db:"requireExhaustive" json:"requireExhaustive,omitempty"` + DocsLimit *int64 `thrift:"docsLimit,9" db:"docsLimit" json:"docsLimit,omitempty"` +} + +func NewFetchTaggedRequest() *FetchTaggedRequest { + return &FetchTaggedRequest{ + RangeTimeType: 0, + } +} + +func (p *FetchTaggedRequest) GetNameSpace() []byte { + return p.NameSpace +} + +func (p *FetchTaggedRequest) GetQuery() []byte { + return p.Query +} + +func (p *FetchTaggedRequest) GetRangeStart() int64 { + return p.RangeStart +} + +func (p *FetchTaggedRequest) GetRangeEnd() int64 { + return p.RangeEnd +} + +func (p *FetchTaggedRequest) GetFetchData() bool { + return p.FetchData +} + +var FetchTaggedRequest_Limit_DEFAULT int64 + +func (p *FetchTaggedRequest) GetLimit() int64 { + if !p.IsSetLimit() { + return FetchTaggedRequest_Limit_DEFAULT + } + return *p.Limit +} + +var FetchTaggedRequest_RangeTimeType_DEFAULT TimeType = 0 + +func (p *FetchTaggedRequest) GetRangeTimeType() TimeType { + return p.RangeTimeType +} + +var FetchTaggedRequest_RequireExhaustive_DEFAULT bool = false + +func (p *FetchTaggedRequest) GetRequireExhaustive() bool { + return p.RequireExhaustive +} + +var FetchTaggedRequest_DocsLimit_DEFAULT int64 + +func (p *FetchTaggedRequest) GetDocsLimit() int64 { + if !p.IsSetDocsLimit() { + return FetchTaggedRequest_DocsLimit_DEFAULT + } + return *p.DocsLimit +} +func (p *FetchTaggedRequest) IsSetLimit() bool { + return p.Limit != nil +} + +func (p *FetchTaggedRequest) IsSetRangeTimeType() bool { + return p.RangeTimeType != FetchTaggedRequest_RangeTimeType_DEFAULT +} + +func (p *FetchTaggedRequest) IsSetRequireExhaustive() bool { + return p.RequireExhaustive != FetchTaggedRequest_RequireExhaustive_DEFAULT +} + +func (p *FetchTaggedRequest) IsSetDocsLimit() bool { + return p.DocsLimit != nil +} + +func (p *FetchTaggedRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpace bool = false + var issetQuery bool = false + var issetRangeStart bool = false + var issetRangeEnd bool = false + var issetFetchData bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpace = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetQuery = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetRangeStart = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetRangeEnd = true + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + issetFetchData = true + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + case 7: + if err := p.ReadField7(iprot); err != nil { + return err + } + case 8: + if err := p.ReadField8(iprot); err != nil { + return err + } + case 9: + if err := p.ReadField9(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetQuery { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Query is not set")) + } + if !issetRangeStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) + } + if !issetRangeEnd { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeEnd is not set")) + } + if !issetFetchData { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field FetchData is not set")) + } + return nil +} + +func (p *FetchTaggedRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *FetchTaggedRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Query = v + } + return nil +} + +func (p *FetchTaggedRequest) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.RangeStart = v + } + return nil +} + +func (p *FetchTaggedRequest) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.RangeEnd = v + } + return nil +} + +func (p *FetchTaggedRequest) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.FetchData = v + } + return nil +} + +func (p *FetchTaggedRequest) ReadField6(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 6: ", err) + } else { + p.Limit = &v + } + return nil +} + +func (p *FetchTaggedRequest) ReadField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + temp := TimeType(v) + p.RangeTimeType = temp + } + return nil +} + +func (p *FetchTaggedRequest) ReadField8(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 8: ", err) + } else { + p.RequireExhaustive = v + } + return nil +} + +func (p *FetchTaggedRequest) ReadField9(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 9: ", err) + } else { + p.DocsLimit = &v + } + return nil +} + +func (p *FetchTaggedRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchTaggedRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + if err := p.writeField8(oprot); err != nil { + return err + } + if err := p.writeField9(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchTaggedRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + } + if err := oprot.WriteBinary(p.NameSpace); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + } + return err +} + +func (p *FetchTaggedRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("query", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:query: ", p), err) + } + if err := oprot.WriteBinary(p.Query); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.query (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:query: ", p), err) + } + return err +} + +func (p *FetchTaggedRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rangeStart: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rangeStart: ", p), err) + } + return err +} + +func (p *FetchTaggedRequest) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:rangeEnd: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:rangeEnd: ", p), err) + } + return err +} + +func (p *FetchTaggedRequest) writeField5(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("fetchData", thrift.BOOL, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:fetchData: ", p), err) + } + if err := oprot.WriteBool(bool(p.FetchData)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.fetchData (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:fetchData: ", p), err) + } + return err +} + +func (p *FetchTaggedRequest) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetLimit() { + if err := oprot.WriteFieldBegin("limit", thrift.I64, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:limit: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Limit)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limit (6) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:limit: ", p), err) + } + } + return err +} + +func (p *FetchTaggedRequest) writeField7(oprot thrift.TProtocol) (err error) { + if p.IsSetRangeTimeType() { + if err := oprot.WriteFieldBegin("rangeTimeType", thrift.I32, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:rangeTimeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.RangeTimeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeTimeType (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:rangeTimeType: ", p), err) + } + } + return err +} + +func (p *FetchTaggedRequest) writeField8(oprot thrift.TProtocol) (err error) { + if p.IsSetRequireExhaustive() { + if err := oprot.WriteFieldBegin("requireExhaustive", thrift.BOOL, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:requireExhaustive: ", p), err) + } + if err := oprot.WriteBool(bool(p.RequireExhaustive)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.requireExhaustive (8) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:requireExhaustive: ", p), err) + } + } + return err +} + +func (p *FetchTaggedRequest) writeField9(oprot thrift.TProtocol) (err error) { + if p.IsSetDocsLimit() { + if err := oprot.WriteFieldBegin("docsLimit", thrift.I64, 9); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:docsLimit: ", p), err) + } + if err := oprot.WriteI64(int64(*p.DocsLimit)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.docsLimit (9) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 9:docsLimit: ", p), err) + } + } + return err +} + +func (p *FetchTaggedRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchTaggedRequest(%+v)", *p) +} + +// Attributes: +// - Elements +// - Exhaustive +type FetchTaggedResult_ struct { + Elements []*FetchTaggedIDResult_ `thrift:"elements,1,required" db:"elements" json:"elements"` + Exhaustive bool `thrift:"exhaustive,2,required" db:"exhaustive" json:"exhaustive"` +} + +func NewFetchTaggedResult_() *FetchTaggedResult_ { + return &FetchTaggedResult_{} +} + +func (p *FetchTaggedResult_) GetElements() []*FetchTaggedIDResult_ { + return p.Elements +} + +func (p *FetchTaggedResult_) GetExhaustive() bool { + return p.Exhaustive +} +func (p *FetchTaggedResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetElements bool = false + var issetExhaustive bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetElements = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetExhaustive = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetElements { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Elements is not set")) + } + if !issetExhaustive { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Exhaustive is not set")) + } + return nil +} + +func (p *FetchTaggedResult_) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*FetchTaggedIDResult_, 0, size) + p.Elements = tSlice + for i := 0; i < size; i++ { + _elem9 := &FetchTaggedIDResult_{} + if err := _elem9.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem9), err) + } + p.Elements = append(p.Elements, _elem9) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchTaggedResult_) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Exhaustive = v + } + return nil +} + +func (p *FetchTaggedResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchTaggedResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchTaggedResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("elements", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:elements: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Elements)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Elements { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:elements: ", p), err) + } + return err +} + +func (p *FetchTaggedResult_) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("exhaustive", thrift.BOOL, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:exhaustive: ", p), err) + } + if err := oprot.WriteBool(bool(p.Exhaustive)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.exhaustive (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:exhaustive: ", p), err) + } + return err +} + +func (p *FetchTaggedResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchTaggedResult_(%+v)", *p) +} + +// Attributes: +// - ID +// - NameSpace +// - EncodedTags +// - Segments +// - Err +type FetchTaggedIDResult_ struct { + ID []byte `thrift:"id,1,required" db:"id" json:"id"` + NameSpace []byte `thrift:"nameSpace,2,required" db:"nameSpace" json:"nameSpace"` + EncodedTags []byte `thrift:"encodedTags,3,required" db:"encodedTags" json:"encodedTags"` + Segments []*Segments `thrift:"segments,4" db:"segments" json:"segments,omitempty"` + Err *Error `thrift:"err,5" db:"err" json:"err,omitempty"` +} + +func NewFetchTaggedIDResult_() *FetchTaggedIDResult_ { + return &FetchTaggedIDResult_{} +} + +func (p *FetchTaggedIDResult_) GetID() []byte { + return p.ID +} + +func (p *FetchTaggedIDResult_) GetNameSpace() []byte { + return p.NameSpace +} + +func (p *FetchTaggedIDResult_) GetEncodedTags() []byte { + return p.EncodedTags +} + +var FetchTaggedIDResult__Segments_DEFAULT []*Segments + +func (p *FetchTaggedIDResult_) GetSegments() []*Segments { + return p.Segments +} + +var FetchTaggedIDResult__Err_DEFAULT *Error + +func (p *FetchTaggedIDResult_) GetErr() *Error { + if !p.IsSetErr() { + return FetchTaggedIDResult__Err_DEFAULT + } + return p.Err +} +func (p *FetchTaggedIDResult_) IsSetSegments() bool { + return p.Segments != nil +} + +func (p *FetchTaggedIDResult_) IsSetErr() bool { + return p.Err != nil +} + +func (p *FetchTaggedIDResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetID bool = false + var issetNameSpace bool = false + var issetEncodedTags bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetID = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetNameSpace = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetEncodedTags = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetEncodedTags { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field EncodedTags is not set")) + } + return nil +} + +func (p *FetchTaggedIDResult_) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *FetchTaggedIDResult_) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *FetchTaggedIDResult_) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.EncodedTags = v + } + return nil +} + +func (p *FetchTaggedIDResult_) ReadField4(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Segments, 0, size) + p.Segments = tSlice + for i := 0; i < size; i++ { + _elem10 := &Segments{} + if err := _elem10.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem10), err) + } + p.Segments = append(p.Segments, _elem10) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchTaggedIDResult_) ReadField5(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *FetchTaggedIDResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchTaggedIDResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchTaggedIDResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:id: ", p), err) + } + if err := oprot.WriteBinary(p.ID); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:id: ", p), err) + } + return err +} + +func (p *FetchTaggedIDResult_) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:nameSpace: ", p), err) + } + if err := oprot.WriteBinary(p.NameSpace); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:nameSpace: ", p), err) + } + return err +} + +func (p *FetchTaggedIDResult_) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("encodedTags", thrift.STRING, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:encodedTags: ", p), err) + } + if err := oprot.WriteBinary(p.EncodedTags); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.encodedTags (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:encodedTags: ", p), err) + } + return err +} + +func (p *FetchTaggedIDResult_) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetSegments() { + if err := oprot.WriteFieldBegin("segments", thrift.LIST, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:segments: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Segments)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Segments { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:segments: ", p), err) + } + } + return err +} + +func (p *FetchTaggedIDResult_) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:err: ", p), err) + } + } + return err +} + +func (p *FetchTaggedIDResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchTaggedIDResult_(%+v)", *p) +} + +// Attributes: +// - NameSpace +// - Shard +// - Elements +type FetchBlocksRawRequest struct { + NameSpace []byte `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` + Shard int32 `thrift:"shard,2,required" db:"shard" json:"shard"` + Elements []*FetchBlocksRawRequestElement `thrift:"elements,3,required" db:"elements" json:"elements"` +} + +func NewFetchBlocksRawRequest() *FetchBlocksRawRequest { + return &FetchBlocksRawRequest{} +} + +func (p *FetchBlocksRawRequest) GetNameSpace() []byte { + return p.NameSpace +} + +func (p *FetchBlocksRawRequest) GetShard() int32 { + return p.Shard +} + +func (p *FetchBlocksRawRequest) GetElements() []*FetchBlocksRawRequestElement { + return p.Elements +} +func (p *FetchBlocksRawRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpace bool = false + var issetShard bool = false + var issetElements bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpace = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetShard = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetElements = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetShard { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Shard is not set")) + } + if !issetElements { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Elements is not set")) + } + return nil +} + +func (p *FetchBlocksRawRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *FetchBlocksRawRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Shard = v + } + return nil +} + +func (p *FetchBlocksRawRequest) ReadField3(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*FetchBlocksRawRequestElement, 0, size) + p.Elements = tSlice + for i := 0; i < size; i++ { + _elem11 := &FetchBlocksRawRequestElement{} + if err := _elem11.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem11), err) + } + p.Elements = append(p.Elements, _elem11) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchBlocksRawRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchBlocksRawRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchBlocksRawRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + } + if err := oprot.WriteBinary(p.NameSpace); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + } + return err +} + +func (p *FetchBlocksRawRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("shard", thrift.I32, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:shard: ", p), err) + } + if err := oprot.WriteI32(int32(p.Shard)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.shard (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:shard: ", p), err) + } + return err +} + +func (p *FetchBlocksRawRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("elements", thrift.LIST, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:elements: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Elements)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Elements { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:elements: ", p), err) + } + return err +} + +func (p *FetchBlocksRawRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchBlocksRawRequest(%+v)", *p) +} + +// Attributes: +// - ID +// - Starts +type FetchBlocksRawRequestElement struct { + ID []byte `thrift:"id,1,required" db:"id" json:"id"` + Starts []int64 `thrift:"starts,2,required" db:"starts" json:"starts"` +} + +func NewFetchBlocksRawRequestElement() *FetchBlocksRawRequestElement { + return &FetchBlocksRawRequestElement{} +} + +func (p *FetchBlocksRawRequestElement) GetID() []byte { + return p.ID +} + +func (p *FetchBlocksRawRequestElement) GetStarts() []int64 { + return p.Starts +} +func (p *FetchBlocksRawRequestElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetID bool = false + var issetStarts bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetID = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetStarts = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetStarts { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Starts is not set")) + } + return nil +} + +func (p *FetchBlocksRawRequestElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *FetchBlocksRawRequestElement) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]int64, 0, size) + p.Starts = tSlice + for i := 0; i < size; i++ { + var _elem12 int64 + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + _elem12 = v + } + p.Starts = append(p.Starts, _elem12) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchBlocksRawRequestElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchBlocksRawRequestElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchBlocksRawRequestElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:id: ", p), err) + } + if err := oprot.WriteBinary(p.ID); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:id: ", p), err) + } + return err +} + +func (p *FetchBlocksRawRequestElement) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("starts", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:starts: ", p), err) + } + if err := oprot.WriteListBegin(thrift.I64, len(p.Starts)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Starts { + if err := oprot.WriteI64(int64(v)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:starts: ", p), err) + } + return err +} + +func (p *FetchBlocksRawRequestElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchBlocksRawRequestElement(%+v)", *p) +} + +// Attributes: +// - Elements +type FetchBlocksRawResult_ struct { + Elements []*Blocks `thrift:"elements,1,required" db:"elements" json:"elements"` +} + +func NewFetchBlocksRawResult_() *FetchBlocksRawResult_ { + return &FetchBlocksRawResult_{} +} + +func (p *FetchBlocksRawResult_) GetElements() []*Blocks { + return p.Elements +} +func (p *FetchBlocksRawResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetElements bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetElements = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetElements { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Elements is not set")) + } + return nil +} + +func (p *FetchBlocksRawResult_) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Blocks, 0, size) + p.Elements = tSlice + for i := 0; i < size; i++ { + _elem13 := &Blocks{} + if err := _elem13.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem13), err) + } + p.Elements = append(p.Elements, _elem13) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchBlocksRawResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchBlocksRawResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchBlocksRawResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("elements", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:elements: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Elements)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Elements { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:elements: ", p), err) + } + return err +} + +func (p *FetchBlocksRawResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchBlocksRawResult_(%+v)", *p) +} + +// Attributes: +// - ID +// - Blocks +type Blocks struct { + ID []byte `thrift:"id,1,required" db:"id" json:"id"` + Blocks []*Block `thrift:"blocks,2,required" db:"blocks" json:"blocks"` +} + +func NewBlocks() *Blocks { + return &Blocks{} +} + +func (p *Blocks) GetID() []byte { + return p.ID +} + +func (p *Blocks) GetBlocks() []*Block { + return p.Blocks +} +func (p *Blocks) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetID bool = false + var issetBlocks bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetID = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetBlocks = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetBlocks { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Blocks is not set")) + } + return nil +} + +func (p *Blocks) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *Blocks) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Block, 0, size) + p.Blocks = tSlice + for i := 0; i < size; i++ { + _elem14 := &Block{} + if err := _elem14.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem14), err) + } + p.Blocks = append(p.Blocks, _elem14) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *Blocks) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Blocks"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Blocks) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:id: ", p), err) + } + if err := oprot.WriteBinary(p.ID); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:id: ", p), err) + } + return err +} + +func (p *Blocks) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("blocks", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:blocks: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Blocks)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Blocks { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:blocks: ", p), err) + } + return err +} + +func (p *Blocks) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Blocks(%+v)", *p) +} + +// Attributes: +// - Start +// - Segments +// - Err +// - Checksum +type Block struct { + Start int64 `thrift:"start,1,required" db:"start" json:"start"` + Segments *Segments `thrift:"segments,2" db:"segments" json:"segments,omitempty"` + Err *Error `thrift:"err,3" db:"err" json:"err,omitempty"` + Checksum *int64 `thrift:"checksum,4" db:"checksum" json:"checksum,omitempty"` +} + +func NewBlock() *Block { + return &Block{} +} + +func (p *Block) GetStart() int64 { + return p.Start +} + +var Block_Segments_DEFAULT *Segments + +func (p *Block) GetSegments() *Segments { + if !p.IsSetSegments() { + return Block_Segments_DEFAULT + } + return p.Segments +} + +var Block_Err_DEFAULT *Error + +func (p *Block) GetErr() *Error { + if !p.IsSetErr() { + return Block_Err_DEFAULT + } + return p.Err +} + +var Block_Checksum_DEFAULT int64 + +func (p *Block) GetChecksum() int64 { + if !p.IsSetChecksum() { + return Block_Checksum_DEFAULT + } + return *p.Checksum +} +func (p *Block) IsSetSegments() bool { + return p.Segments != nil +} + +func (p *Block) IsSetErr() bool { + return p.Err != nil +} + +func (p *Block) IsSetChecksum() bool { + return p.Checksum != nil +} + +func (p *Block) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetStart bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetStart = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Start is not set")) + } + return nil +} + +func (p *Block) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Start = v + } + return nil +} + +func (p *Block) ReadField2(iprot thrift.TProtocol) error { + p.Segments = &Segments{} + if err := p.Segments.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Segments), err) + } + return nil +} + +func (p *Block) ReadField3(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *Block) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.Checksum = &v + } + return nil +} + +func (p *Block) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Block"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Block) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("start", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:start: ", p), err) + } + if err := oprot.WriteI64(int64(p.Start)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.start (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:start: ", p), err) + } + return err +} + +func (p *Block) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetSegments() { + if err := oprot.WriteFieldBegin("segments", thrift.STRUCT, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:segments: ", p), err) + } + if err := p.Segments.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Segments), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:segments: ", p), err) + } + } + return err +} + +func (p *Block) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:err: ", p), err) + } + } + return err +} + +func (p *Block) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetChecksum() { + if err := oprot.WriteFieldBegin("checksum", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:checksum: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Checksum)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.checksum (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:checksum: ", p), err) + } + } + return err +} + +func (p *Block) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Block(%+v)", *p) +} + +// Attributes: +// - Name +// - Value +type Tag struct { + Name string `thrift:"name,1,required" db:"name" json:"name"` + Value string `thrift:"value,2,required" db:"value" json:"value"` +} + +func NewTag() *Tag { + return &Tag{} +} + +func (p *Tag) GetName() string { + return p.Name +} + +func (p *Tag) GetValue() string { + return p.Value +} +func (p *Tag) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetName bool = false + var issetValue bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetName = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetValue = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetName { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Name is not set")) + } + if !issetValue { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Value is not set")) + } + return nil +} + +func (p *Tag) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Name = v + } + return nil +} + +func (p *Tag) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Value = v + } + return nil +} + +func (p *Tag) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Tag"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Tag) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("name", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:name: ", p), err) + } + if err := oprot.WriteString(string(p.Name)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.name (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:name: ", p), err) + } + return err +} + +func (p *Tag) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("value", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:value: ", p), err) + } + if err := oprot.WriteString(string(p.Value)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.value (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:value: ", p), err) + } + return err +} + +func (p *Tag) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Tag(%+v)", *p) +} + +// Attributes: +// - NameSpace +// - Shard +// - RangeStart +// - RangeEnd +// - Limit +// - PageToken +// - IncludeSizes +// - IncludeChecksums +// - IncludeLastRead +type FetchBlocksMetadataRawV2Request struct { + NameSpace []byte `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` + Shard int32 `thrift:"shard,2,required" db:"shard" json:"shard"` + RangeStart int64 `thrift:"rangeStart,3,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,4,required" db:"rangeEnd" json:"rangeEnd"` + Limit int64 `thrift:"limit,5,required" db:"limit" json:"limit"` + PageToken []byte `thrift:"pageToken,6" db:"pageToken" json:"pageToken,omitempty"` + IncludeSizes *bool `thrift:"includeSizes,7" db:"includeSizes" json:"includeSizes,omitempty"` + IncludeChecksums *bool `thrift:"includeChecksums,8" db:"includeChecksums" json:"includeChecksums,omitempty"` + IncludeLastRead *bool `thrift:"includeLastRead,9" db:"includeLastRead" json:"includeLastRead,omitempty"` +} + +func NewFetchBlocksMetadataRawV2Request() *FetchBlocksMetadataRawV2Request { + return &FetchBlocksMetadataRawV2Request{} +} + +func (p *FetchBlocksMetadataRawV2Request) GetNameSpace() []byte { + return p.NameSpace +} + +func (p *FetchBlocksMetadataRawV2Request) GetShard() int32 { + return p.Shard +} + +func (p *FetchBlocksMetadataRawV2Request) GetRangeStart() int64 { + return p.RangeStart +} + +func (p *FetchBlocksMetadataRawV2Request) GetRangeEnd() int64 { + return p.RangeEnd +} + +func (p *FetchBlocksMetadataRawV2Request) GetLimit() int64 { + return p.Limit +} + +var FetchBlocksMetadataRawV2Request_PageToken_DEFAULT []byte + +func (p *FetchBlocksMetadataRawV2Request) GetPageToken() []byte { + return p.PageToken +} + +var FetchBlocksMetadataRawV2Request_IncludeSizes_DEFAULT bool + +func (p *FetchBlocksMetadataRawV2Request) GetIncludeSizes() bool { + if !p.IsSetIncludeSizes() { + return FetchBlocksMetadataRawV2Request_IncludeSizes_DEFAULT + } + return *p.IncludeSizes +} + +var FetchBlocksMetadataRawV2Request_IncludeChecksums_DEFAULT bool + +func (p *FetchBlocksMetadataRawV2Request) GetIncludeChecksums() bool { + if !p.IsSetIncludeChecksums() { + return FetchBlocksMetadataRawV2Request_IncludeChecksums_DEFAULT + } + return *p.IncludeChecksums +} + +var FetchBlocksMetadataRawV2Request_IncludeLastRead_DEFAULT bool + +func (p *FetchBlocksMetadataRawV2Request) GetIncludeLastRead() bool { + if !p.IsSetIncludeLastRead() { + return FetchBlocksMetadataRawV2Request_IncludeLastRead_DEFAULT + } + return *p.IncludeLastRead +} +func (p *FetchBlocksMetadataRawV2Request) IsSetPageToken() bool { + return p.PageToken != nil +} + +func (p *FetchBlocksMetadataRawV2Request) IsSetIncludeSizes() bool { + return p.IncludeSizes != nil +} + +func (p *FetchBlocksMetadataRawV2Request) IsSetIncludeChecksums() bool { + return p.IncludeChecksums != nil +} + +func (p *FetchBlocksMetadataRawV2Request) IsSetIncludeLastRead() bool { + return p.IncludeLastRead != nil +} + +func (p *FetchBlocksMetadataRawV2Request) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpace bool = false + var issetShard bool = false + var issetRangeStart bool = false + var issetRangeEnd bool = false + var issetLimit bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpace = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetShard = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetRangeStart = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetRangeEnd = true + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + issetLimit = true + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + case 7: + if err := p.ReadField7(iprot); err != nil { + return err + } + case 8: + if err := p.ReadField8(iprot); err != nil { + return err + } + case 9: + if err := p.ReadField9(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetShard { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Shard is not set")) + } + if !issetRangeStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) + } + if !issetRangeEnd { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeEnd is not set")) + } + if !issetLimit { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Limit is not set")) + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Shard = v + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.RangeStart = v + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.RangeEnd = v + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.Limit = v + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) ReadField6(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 6: ", err) + } else { + p.PageToken = v + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) ReadField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + p.IncludeSizes = &v + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) ReadField8(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 8: ", err) + } else { + p.IncludeChecksums = &v + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) ReadField9(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 9: ", err) + } else { + p.IncludeLastRead = &v + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchBlocksMetadataRawV2Request"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + if err := p.writeField8(oprot); err != nil { + return err + } + if err := p.writeField9(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Request) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + } + if err := oprot.WriteBinary(p.NameSpace); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + } + return err +} + +func (p *FetchBlocksMetadataRawV2Request) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("shard", thrift.I32, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:shard: ", p), err) + } + if err := oprot.WriteI32(int32(p.Shard)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.shard (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:shard: ", p), err) + } + return err +} + +func (p *FetchBlocksMetadataRawV2Request) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rangeStart: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rangeStart: ", p), err) + } + return err +} + +func (p *FetchBlocksMetadataRawV2Request) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:rangeEnd: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:rangeEnd: ", p), err) + } + return err +} + +func (p *FetchBlocksMetadataRawV2Request) writeField5(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("limit", thrift.I64, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:limit: ", p), err) + } + if err := oprot.WriteI64(int64(p.Limit)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limit (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:limit: ", p), err) + } + return err +} + +func (p *FetchBlocksMetadataRawV2Request) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetPageToken() { + if err := oprot.WriteFieldBegin("pageToken", thrift.STRING, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:pageToken: ", p), err) + } + if err := oprot.WriteBinary(p.PageToken); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.pageToken (6) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:pageToken: ", p), err) + } + } + return err +} + +func (p *FetchBlocksMetadataRawV2Request) writeField7(oprot thrift.TProtocol) (err error) { + if p.IsSetIncludeSizes() { + if err := oprot.WriteFieldBegin("includeSizes", thrift.BOOL, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:includeSizes: ", p), err) + } + if err := oprot.WriteBool(bool(*p.IncludeSizes)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.includeSizes (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:includeSizes: ", p), err) + } + } + return err +} + +func (p *FetchBlocksMetadataRawV2Request) writeField8(oprot thrift.TProtocol) (err error) { + if p.IsSetIncludeChecksums() { + if err := oprot.WriteFieldBegin("includeChecksums", thrift.BOOL, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:includeChecksums: ", p), err) + } + if err := oprot.WriteBool(bool(*p.IncludeChecksums)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.includeChecksums (8) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:includeChecksums: ", p), err) + } + } + return err +} + +func (p *FetchBlocksMetadataRawV2Request) writeField9(oprot thrift.TProtocol) (err error) { + if p.IsSetIncludeLastRead() { + if err := oprot.WriteFieldBegin("includeLastRead", thrift.BOOL, 9); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:includeLastRead: ", p), err) + } + if err := oprot.WriteBool(bool(*p.IncludeLastRead)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.includeLastRead (9) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 9:includeLastRead: ", p), err) + } + } + return err +} + +func (p *FetchBlocksMetadataRawV2Request) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchBlocksMetadataRawV2Request(%+v)", *p) +} + +// Attributes: +// - Elements +// - NextPageToken +type FetchBlocksMetadataRawV2Result_ struct { + Elements []*BlockMetadataV2 `thrift:"elements,1,required" db:"elements" json:"elements"` + NextPageToken []byte `thrift:"nextPageToken,2" db:"nextPageToken" json:"nextPageToken,omitempty"` +} + +func NewFetchBlocksMetadataRawV2Result_() *FetchBlocksMetadataRawV2Result_ { + return &FetchBlocksMetadataRawV2Result_{} +} + +func (p *FetchBlocksMetadataRawV2Result_) GetElements() []*BlockMetadataV2 { + return p.Elements +} + +var FetchBlocksMetadataRawV2Result__NextPageToken_DEFAULT []byte + +func (p *FetchBlocksMetadataRawV2Result_) GetNextPageToken() []byte { + return p.NextPageToken +} +func (p *FetchBlocksMetadataRawV2Result_) IsSetNextPageToken() bool { + return p.NextPageToken != nil +} + +func (p *FetchBlocksMetadataRawV2Result_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetElements bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetElements = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetElements { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Elements is not set")) + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Result_) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*BlockMetadataV2, 0, size) + p.Elements = tSlice + for i := 0; i < size; i++ { + _elem15 := &BlockMetadataV2{ + LastReadTimeType: 0, + } + if err := _elem15.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem15), err) + } + p.Elements = append(p.Elements, _elem15) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Result_) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.NextPageToken = v + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Result_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FetchBlocksMetadataRawV2Result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FetchBlocksMetadataRawV2Result_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("elements", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:elements: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Elements)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Elements { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:elements: ", p), err) + } + return err +} + +func (p *FetchBlocksMetadataRawV2Result_) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetNextPageToken() { + if err := oprot.WriteFieldBegin("nextPageToken", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:nextPageToken: ", p), err) + } + if err := oprot.WriteBinary(p.NextPageToken); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nextPageToken (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:nextPageToken: ", p), err) + } + } + return err +} + +func (p *FetchBlocksMetadataRawV2Result_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FetchBlocksMetadataRawV2Result_(%+v)", *p) +} + +// Attributes: +// - ID +// - Start +// - Err +// - Size +// - Checksum +// - LastRead +// - LastReadTimeType +// - EncodedTags +type BlockMetadataV2 struct { + ID []byte `thrift:"id,1,required" db:"id" json:"id"` + Start int64 `thrift:"start,2,required" db:"start" json:"start"` + Err *Error `thrift:"err,3" db:"err" json:"err,omitempty"` + Size *int64 `thrift:"size,4" db:"size" json:"size,omitempty"` + Checksum *int64 `thrift:"checksum,5" db:"checksum" json:"checksum,omitempty"` + LastRead *int64 `thrift:"lastRead,6" db:"lastRead" json:"lastRead,omitempty"` + LastReadTimeType TimeType `thrift:"lastReadTimeType,7" db:"lastReadTimeType" json:"lastReadTimeType,omitempty"` + EncodedTags []byte `thrift:"encodedTags,8" db:"encodedTags" json:"encodedTags,omitempty"` +} + +func NewBlockMetadataV2() *BlockMetadataV2 { + return &BlockMetadataV2{ + LastReadTimeType: 0, + } +} + +func (p *BlockMetadataV2) GetID() []byte { + return p.ID +} + +func (p *BlockMetadataV2) GetStart() int64 { + return p.Start +} + +var BlockMetadataV2_Err_DEFAULT *Error + +func (p *BlockMetadataV2) GetErr() *Error { + if !p.IsSetErr() { + return BlockMetadataV2_Err_DEFAULT + } + return p.Err +} + +var BlockMetadataV2_Size_DEFAULT int64 + +func (p *BlockMetadataV2) GetSize() int64 { + if !p.IsSetSize() { + return BlockMetadataV2_Size_DEFAULT + } + return *p.Size +} + +var BlockMetadataV2_Checksum_DEFAULT int64 + +func (p *BlockMetadataV2) GetChecksum() int64 { + if !p.IsSetChecksum() { + return BlockMetadataV2_Checksum_DEFAULT + } + return *p.Checksum +} + +var BlockMetadataV2_LastRead_DEFAULT int64 + +func (p *BlockMetadataV2) GetLastRead() int64 { + if !p.IsSetLastRead() { + return BlockMetadataV2_LastRead_DEFAULT + } + return *p.LastRead +} + +var BlockMetadataV2_LastReadTimeType_DEFAULT TimeType = 0 + +func (p *BlockMetadataV2) GetLastReadTimeType() TimeType { + return p.LastReadTimeType +} + +var BlockMetadataV2_EncodedTags_DEFAULT []byte + +func (p *BlockMetadataV2) GetEncodedTags() []byte { + return p.EncodedTags +} +func (p *BlockMetadataV2) IsSetErr() bool { + return p.Err != nil +} + +func (p *BlockMetadataV2) IsSetSize() bool { + return p.Size != nil +} + +func (p *BlockMetadataV2) IsSetChecksum() bool { + return p.Checksum != nil +} + +func (p *BlockMetadataV2) IsSetLastRead() bool { + return p.LastRead != nil +} + +func (p *BlockMetadataV2) IsSetLastReadTimeType() bool { + return p.LastReadTimeType != BlockMetadataV2_LastReadTimeType_DEFAULT +} + +func (p *BlockMetadataV2) IsSetEncodedTags() bool { + return p.EncodedTags != nil +} + +func (p *BlockMetadataV2) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetID bool = false + var issetStart bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetID = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetStart = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + case 7: + if err := p.ReadField7(iprot); err != nil { + return err + } + case 8: + if err := p.ReadField8(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Start is not set")) + } + return nil +} + +func (p *BlockMetadataV2) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *BlockMetadataV2) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Start = v + } + return nil +} + +func (p *BlockMetadataV2) ReadField3(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *BlockMetadataV2) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.Size = &v + } + return nil +} + +func (p *BlockMetadataV2) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.Checksum = &v + } + return nil +} + +func (p *BlockMetadataV2) ReadField6(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 6: ", err) + } else { + p.LastRead = &v + } + return nil +} + +func (p *BlockMetadataV2) ReadField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + temp := TimeType(v) + p.LastReadTimeType = temp + } + return nil +} + +func (p *BlockMetadataV2) ReadField8(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 8: ", err) + } else { + p.EncodedTags = v + } + return nil +} + +func (p *BlockMetadataV2) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("BlockMetadataV2"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + if err := p.writeField8(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *BlockMetadataV2) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:id: ", p), err) + } + if err := oprot.WriteBinary(p.ID); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:id: ", p), err) + } + return err +} + +func (p *BlockMetadataV2) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("start", thrift.I64, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:start: ", p), err) + } + if err := oprot.WriteI64(int64(p.Start)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.start (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:start: ", p), err) + } + return err +} + +func (p *BlockMetadataV2) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:err: ", p), err) + } + } + return err +} + +func (p *BlockMetadataV2) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetSize() { + if err := oprot.WriteFieldBegin("size", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:size: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Size)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.size (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:size: ", p), err) + } + } + return err +} + +func (p *BlockMetadataV2) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetChecksum() { + if err := oprot.WriteFieldBegin("checksum", thrift.I64, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:checksum: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Checksum)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.checksum (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:checksum: ", p), err) + } + } + return err +} + +func (p *BlockMetadataV2) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetLastRead() { + if err := oprot.WriteFieldBegin("lastRead", thrift.I64, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:lastRead: ", p), err) + } + if err := oprot.WriteI64(int64(*p.LastRead)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.lastRead (6) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:lastRead: ", p), err) + } + } + return err +} + +func (p *BlockMetadataV2) writeField7(oprot thrift.TProtocol) (err error) { + if p.IsSetLastReadTimeType() { + if err := oprot.WriteFieldBegin("lastReadTimeType", thrift.I32, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:lastReadTimeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.LastReadTimeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.lastReadTimeType (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:lastReadTimeType: ", p), err) + } + } + return err +} + +func (p *BlockMetadataV2) writeField8(oprot thrift.TProtocol) (err error) { + if p.IsSetEncodedTags() { + if err := oprot.WriteFieldBegin("encodedTags", thrift.STRING, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:encodedTags: ", p), err) + } + if err := oprot.WriteBinary(p.EncodedTags); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.encodedTags (8) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:encodedTags: ", p), err) + } + } + return err +} + +func (p *BlockMetadataV2) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("BlockMetadataV2(%+v)", *p) +} + +// Attributes: +// - NameSpace +// - Elements +type WriteBatchRawRequest struct { + NameSpace []byte `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` + Elements []*WriteBatchRawRequestElement `thrift:"elements,2,required" db:"elements" json:"elements"` +} + +func NewWriteBatchRawRequest() *WriteBatchRawRequest { + return &WriteBatchRawRequest{} +} + +func (p *WriteBatchRawRequest) GetNameSpace() []byte { + return p.NameSpace +} + +func (p *WriteBatchRawRequest) GetElements() []*WriteBatchRawRequestElement { + return p.Elements +} +func (p *WriteBatchRawRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpace bool = false + var issetElements bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpace = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetElements = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetElements { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Elements is not set")) + } + return nil +} + +func (p *WriteBatchRawRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *WriteBatchRawRequest) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*WriteBatchRawRequestElement, 0, size) + p.Elements = tSlice + for i := 0; i < size; i++ { + _elem16 := &WriteBatchRawRequestElement{} + if err := _elem16.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem16), err) + } + p.Elements = append(p.Elements, _elem16) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *WriteBatchRawRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteBatchRawRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteBatchRawRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + } + if err := oprot.WriteBinary(p.NameSpace); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + } + return err +} + +func (p *WriteBatchRawRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("elements", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:elements: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Elements)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Elements { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:elements: ", p), err) + } + return err +} + +func (p *WriteBatchRawRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteBatchRawRequest(%+v)", *p) +} + +// Attributes: +// - NameSpaces +// - Elements +type WriteBatchRawV2Request struct { + NameSpaces [][]byte `thrift:"nameSpaces,1,required" db:"nameSpaces" json:"nameSpaces"` + Elements []*WriteBatchRawV2RequestElement `thrift:"elements,2,required" db:"elements" json:"elements"` +} + +func NewWriteBatchRawV2Request() *WriteBatchRawV2Request { + return &WriteBatchRawV2Request{} +} + +func (p *WriteBatchRawV2Request) GetNameSpaces() [][]byte { + return p.NameSpaces +} + +func (p *WriteBatchRawV2Request) GetElements() []*WriteBatchRawV2RequestElement { + return p.Elements +} +func (p *WriteBatchRawV2Request) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpaces bool = false + var issetElements bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpaces = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetElements = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpaces { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpaces is not set")) + } + if !issetElements { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Elements is not set")) + } + return nil +} + +func (p *WriteBatchRawV2Request) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([][]byte, 0, size) + p.NameSpaces = tSlice + for i := 0; i < size; i++ { + var _elem17 []byte + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + _elem17 = v + } + p.NameSpaces = append(p.NameSpaces, _elem17) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *WriteBatchRawV2Request) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*WriteBatchRawV2RequestElement, 0, size) + p.Elements = tSlice + for i := 0; i < size; i++ { + _elem18 := &WriteBatchRawV2RequestElement{} + if err := _elem18.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem18), err) + } + p.Elements = append(p.Elements, _elem18) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *WriteBatchRawV2Request) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteBatchRawV2Request"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteBatchRawV2Request) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpaces", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpaces: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRING, len(p.NameSpaces)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.NameSpaces { + if err := oprot.WriteBinary(v); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpaces: ", p), err) + } + return err +} + +func (p *WriteBatchRawV2Request) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("elements", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:elements: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Elements)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Elements { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:elements: ", p), err) + } + return err +} + +func (p *WriteBatchRawV2Request) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteBatchRawV2Request(%+v)", *p) +} + +// Attributes: +// - ID +// - Datapoint +type WriteBatchRawRequestElement struct { + ID []byte `thrift:"id,1,required" db:"id" json:"id"` + Datapoint *Datapoint `thrift:"datapoint,2,required" db:"datapoint" json:"datapoint"` +} + +func NewWriteBatchRawRequestElement() *WriteBatchRawRequestElement { + return &WriteBatchRawRequestElement{} +} + +func (p *WriteBatchRawRequestElement) GetID() []byte { + return p.ID +} + +var WriteBatchRawRequestElement_Datapoint_DEFAULT *Datapoint + +func (p *WriteBatchRawRequestElement) GetDatapoint() *Datapoint { + if !p.IsSetDatapoint() { + return WriteBatchRawRequestElement_Datapoint_DEFAULT + } + return p.Datapoint +} +func (p *WriteBatchRawRequestElement) IsSetDatapoint() bool { + return p.Datapoint != nil +} + +func (p *WriteBatchRawRequestElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetID bool = false + var issetDatapoint bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetID = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetDatapoint = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetDatapoint { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Datapoint is not set")) + } + return nil +} + +func (p *WriteBatchRawRequestElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *WriteBatchRawRequestElement) ReadField2(iprot thrift.TProtocol) error { + p.Datapoint = &Datapoint{ + TimestampTimeType: 0, + } + if err := p.Datapoint.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Datapoint), err) + } + return nil +} + +func (p *WriteBatchRawRequestElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteBatchRawRequestElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteBatchRawRequestElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:id: ", p), err) + } + if err := oprot.WriteBinary(p.ID); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:id: ", p), err) + } + return err +} + +func (p *WriteBatchRawRequestElement) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("datapoint", thrift.STRUCT, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:datapoint: ", p), err) + } + if err := p.Datapoint.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Datapoint), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:datapoint: ", p), err) + } + return err +} + +func (p *WriteBatchRawRequestElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteBatchRawRequestElement(%+v)", *p) +} + +// Attributes: +// - ID +// - Datapoint +// - NameSpace +type WriteBatchRawV2RequestElement struct { + ID []byte `thrift:"id,1,required" db:"id" json:"id"` + Datapoint *Datapoint `thrift:"datapoint,2,required" db:"datapoint" json:"datapoint"` + NameSpace int64 `thrift:"nameSpace,3,required" db:"nameSpace" json:"nameSpace"` +} + +func NewWriteBatchRawV2RequestElement() *WriteBatchRawV2RequestElement { + return &WriteBatchRawV2RequestElement{} +} + +func (p *WriteBatchRawV2RequestElement) GetID() []byte { + return p.ID +} + +var WriteBatchRawV2RequestElement_Datapoint_DEFAULT *Datapoint + +func (p *WriteBatchRawV2RequestElement) GetDatapoint() *Datapoint { + if !p.IsSetDatapoint() { + return WriteBatchRawV2RequestElement_Datapoint_DEFAULT + } + return p.Datapoint +} + +func (p *WriteBatchRawV2RequestElement) GetNameSpace() int64 { + return p.NameSpace +} +func (p *WriteBatchRawV2RequestElement) IsSetDatapoint() bool { + return p.Datapoint != nil +} + +func (p *WriteBatchRawV2RequestElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetID bool = false + var issetDatapoint bool = false + var issetNameSpace bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetID = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetDatapoint = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetNameSpace = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetDatapoint { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Datapoint is not set")) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + return nil +} + +func (p *WriteBatchRawV2RequestElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *WriteBatchRawV2RequestElement) ReadField2(iprot thrift.TProtocol) error { + p.Datapoint = &Datapoint{ + TimestampTimeType: 0, + } + if err := p.Datapoint.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Datapoint), err) + } + return nil +} + +func (p *WriteBatchRawV2RequestElement) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *WriteBatchRawV2RequestElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteBatchRawV2RequestElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteBatchRawV2RequestElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:id: ", p), err) + } + if err := oprot.WriteBinary(p.ID); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:id: ", p), err) + } + return err +} + +func (p *WriteBatchRawV2RequestElement) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("datapoint", thrift.STRUCT, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:datapoint: ", p), err) + } + if err := p.Datapoint.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Datapoint), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:datapoint: ", p), err) + } + return err +} + +func (p *WriteBatchRawV2RequestElement) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:nameSpace: ", p), err) + } + if err := oprot.WriteI64(int64(p.NameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:nameSpace: ", p), err) + } + return err +} + +func (p *WriteBatchRawV2RequestElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteBatchRawV2RequestElement(%+v)", *p) +} + +// Attributes: +// - NameSpace +// - Elements +type WriteTaggedBatchRawRequest struct { + NameSpace []byte `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` + Elements []*WriteTaggedBatchRawRequestElement `thrift:"elements,2,required" db:"elements" json:"elements"` +} + +func NewWriteTaggedBatchRawRequest() *WriteTaggedBatchRawRequest { + return &WriteTaggedBatchRawRequest{} +} + +func (p *WriteTaggedBatchRawRequest) GetNameSpace() []byte { + return p.NameSpace +} + +func (p *WriteTaggedBatchRawRequest) GetElements() []*WriteTaggedBatchRawRequestElement { + return p.Elements +} +func (p *WriteTaggedBatchRawRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpace bool = false + var issetElements bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpace = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetElements = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + if !issetElements { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Elements is not set")) + } + return nil +} + +func (p *WriteTaggedBatchRawRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *WriteTaggedBatchRawRequest) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*WriteTaggedBatchRawRequestElement, 0, size) + p.Elements = tSlice + for i := 0; i < size; i++ { + _elem19 := &WriteTaggedBatchRawRequestElement{} + if err := _elem19.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem19), err) + } + p.Elements = append(p.Elements, _elem19) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *WriteTaggedBatchRawRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteTaggedBatchRawRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteTaggedBatchRawRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + } + if err := oprot.WriteBinary(p.NameSpace); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("elements", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:elements: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Elements)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Elements { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:elements: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteTaggedBatchRawRequest(%+v)", *p) +} + +// Attributes: +// - NameSpaces +// - Elements +type WriteTaggedBatchRawV2Request struct { + NameSpaces [][]byte `thrift:"nameSpaces,1,required" db:"nameSpaces" json:"nameSpaces"` + Elements []*WriteTaggedBatchRawV2RequestElement `thrift:"elements,2,required" db:"elements" json:"elements"` +} + +func NewWriteTaggedBatchRawV2Request() *WriteTaggedBatchRawV2Request { + return &WriteTaggedBatchRawV2Request{} +} + +func (p *WriteTaggedBatchRawV2Request) GetNameSpaces() [][]byte { + return p.NameSpaces +} + +func (p *WriteTaggedBatchRawV2Request) GetElements() []*WriteTaggedBatchRawV2RequestElement { + return p.Elements +} +func (p *WriteTaggedBatchRawV2Request) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpaces bool = false + var issetElements bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpaces = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetElements = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpaces { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpaces is not set")) + } + if !issetElements { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Elements is not set")) + } + return nil +} + +func (p *WriteTaggedBatchRawV2Request) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([][]byte, 0, size) + p.NameSpaces = tSlice + for i := 0; i < size; i++ { + var _elem20 []byte + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + _elem20 = v + } + p.NameSpaces = append(p.NameSpaces, _elem20) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *WriteTaggedBatchRawV2Request) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*WriteTaggedBatchRawV2RequestElement, 0, size) + p.Elements = tSlice + for i := 0; i < size; i++ { + _elem21 := &WriteTaggedBatchRawV2RequestElement{} + if err := _elem21.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem21), err) + } + p.Elements = append(p.Elements, _elem21) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *WriteTaggedBatchRawV2Request) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteTaggedBatchRawV2Request"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteTaggedBatchRawV2Request) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpaces", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpaces: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRING, len(p.NameSpaces)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.NameSpaces { + if err := oprot.WriteBinary(v); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpaces: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawV2Request) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("elements", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:elements: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Elements)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Elements { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:elements: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawV2Request) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteTaggedBatchRawV2Request(%+v)", *p) +} + +// Attributes: +// - ID +// - EncodedTags +// - Datapoint +type WriteTaggedBatchRawRequestElement struct { + ID []byte `thrift:"id,1,required" db:"id" json:"id"` + EncodedTags []byte `thrift:"encodedTags,2,required" db:"encodedTags" json:"encodedTags"` + Datapoint *Datapoint `thrift:"datapoint,3,required" db:"datapoint" json:"datapoint"` +} + +func NewWriteTaggedBatchRawRequestElement() *WriteTaggedBatchRawRequestElement { + return &WriteTaggedBatchRawRequestElement{} +} + +func (p *WriteTaggedBatchRawRequestElement) GetID() []byte { + return p.ID +} + +func (p *WriteTaggedBatchRawRequestElement) GetEncodedTags() []byte { + return p.EncodedTags +} + +var WriteTaggedBatchRawRequestElement_Datapoint_DEFAULT *Datapoint + +func (p *WriteTaggedBatchRawRequestElement) GetDatapoint() *Datapoint { + if !p.IsSetDatapoint() { + return WriteTaggedBatchRawRequestElement_Datapoint_DEFAULT + } + return p.Datapoint +} +func (p *WriteTaggedBatchRawRequestElement) IsSetDatapoint() bool { + return p.Datapoint != nil +} + +func (p *WriteTaggedBatchRawRequestElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetID bool = false + var issetEncodedTags bool = false + var issetDatapoint bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetID = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetEncodedTags = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetDatapoint = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetEncodedTags { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field EncodedTags is not set")) + } + if !issetDatapoint { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Datapoint is not set")) + } + return nil +} + +func (p *WriteTaggedBatchRawRequestElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *WriteTaggedBatchRawRequestElement) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.EncodedTags = v + } + return nil +} + +func (p *WriteTaggedBatchRawRequestElement) ReadField3(iprot thrift.TProtocol) error { + p.Datapoint = &Datapoint{ + TimestampTimeType: 0, + } + if err := p.Datapoint.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Datapoint), err) + } + return nil +} + +func (p *WriteTaggedBatchRawRequestElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteTaggedBatchRawRequestElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteTaggedBatchRawRequestElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:id: ", p), err) + } + if err := oprot.WriteBinary(p.ID); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:id: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawRequestElement) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("encodedTags", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:encodedTags: ", p), err) + } + if err := oprot.WriteBinary(p.EncodedTags); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.encodedTags (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:encodedTags: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawRequestElement) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("datapoint", thrift.STRUCT, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:datapoint: ", p), err) + } + if err := p.Datapoint.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Datapoint), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:datapoint: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawRequestElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteTaggedBatchRawRequestElement(%+v)", *p) +} + +// Attributes: +// - ID +// - EncodedTags +// - Datapoint +// - NameSpace +type WriteTaggedBatchRawV2RequestElement struct { + ID []byte `thrift:"id,1,required" db:"id" json:"id"` + EncodedTags []byte `thrift:"encodedTags,2,required" db:"encodedTags" json:"encodedTags"` + Datapoint *Datapoint `thrift:"datapoint,3,required" db:"datapoint" json:"datapoint"` + NameSpace int64 `thrift:"nameSpace,4,required" db:"nameSpace" json:"nameSpace"` +} + +func NewWriteTaggedBatchRawV2RequestElement() *WriteTaggedBatchRawV2RequestElement { + return &WriteTaggedBatchRawV2RequestElement{} +} + +func (p *WriteTaggedBatchRawV2RequestElement) GetID() []byte { + return p.ID +} + +func (p *WriteTaggedBatchRawV2RequestElement) GetEncodedTags() []byte { + return p.EncodedTags +} + +var WriteTaggedBatchRawV2RequestElement_Datapoint_DEFAULT *Datapoint + +func (p *WriteTaggedBatchRawV2RequestElement) GetDatapoint() *Datapoint { + if !p.IsSetDatapoint() { + return WriteTaggedBatchRawV2RequestElement_Datapoint_DEFAULT + } + return p.Datapoint +} + +func (p *WriteTaggedBatchRawV2RequestElement) GetNameSpace() int64 { + return p.NameSpace +} +func (p *WriteTaggedBatchRawV2RequestElement) IsSetDatapoint() bool { + return p.Datapoint != nil +} + +func (p *WriteTaggedBatchRawV2RequestElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetID bool = false + var issetEncodedTags bool = false + var issetDatapoint bool = false + var issetNameSpace bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetID = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetEncodedTags = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetDatapoint = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetNameSpace = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetEncodedTags { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field EncodedTags is not set")) + } + if !issetDatapoint { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Datapoint is not set")) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + return nil +} + +func (p *WriteTaggedBatchRawV2RequestElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *WriteTaggedBatchRawV2RequestElement) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.EncodedTags = v + } + return nil +} + +func (p *WriteTaggedBatchRawV2RequestElement) ReadField3(iprot thrift.TProtocol) error { + p.Datapoint = &Datapoint{ + TimestampTimeType: 0, + } + if err := p.Datapoint.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Datapoint), err) + } + return nil +} + +func (p *WriteTaggedBatchRawV2RequestElement) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *WriteTaggedBatchRawV2RequestElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteTaggedBatchRawV2RequestElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteTaggedBatchRawV2RequestElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:id: ", p), err) + } + if err := oprot.WriteBinary(p.ID); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:id: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawV2RequestElement) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("encodedTags", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:encodedTags: ", p), err) + } + if err := oprot.WriteBinary(p.EncodedTags); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.encodedTags (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:encodedTags: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawV2RequestElement) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("datapoint", thrift.STRUCT, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:datapoint: ", p), err) + } + if err := p.Datapoint.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Datapoint), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:datapoint: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawV2RequestElement) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:nameSpace: ", p), err) + } + if err := oprot.WriteI64(int64(p.NameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:nameSpace: ", p), err) + } + return err +} + +func (p *WriteTaggedBatchRawV2RequestElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteTaggedBatchRawV2RequestElement(%+v)", *p) +} + +// Attributes: +// - Index +// - Err +type WriteBatchRawError struct { + Index int64 `thrift:"index,1,required" db:"index" json:"index"` + Err *Error `thrift:"err,2,required" db:"err" json:"err"` +} + +func NewWriteBatchRawError() *WriteBatchRawError { + return &WriteBatchRawError{} +} + +func (p *WriteBatchRawError) GetIndex() int64 { + return p.Index +} + +var WriteBatchRawError_Err_DEFAULT *Error + +func (p *WriteBatchRawError) GetErr() *Error { + if !p.IsSetErr() { + return WriteBatchRawError_Err_DEFAULT + } + return p.Err +} +func (p *WriteBatchRawError) IsSetErr() bool { + return p.Err != nil +} + +func (p *WriteBatchRawError) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetIndex bool = false + var issetErr bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetIndex = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetErr = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetIndex { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Index is not set")) + } + if !issetErr { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Err is not set")) + } + return nil +} + +func (p *WriteBatchRawError) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Index = v + } + return nil +} + +func (p *WriteBatchRawError) ReadField2(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *WriteBatchRawError) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("WriteBatchRawError"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *WriteBatchRawError) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("index", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:index: ", p), err) + } + if err := oprot.WriteI64(int64(p.Index)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.index (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:index: ", p), err) + } + return err +} + +func (p *WriteBatchRawError) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:err: ", p), err) + } + return err +} + +func (p *WriteBatchRawError) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("WriteBatchRawError(%+v)", *p) +} + +// Attributes: +// - NameSpace +type TruncateRequest struct { + NameSpace []byte `thrift:"nameSpace,1,required" db:"nameSpace" json:"nameSpace"` +} + +func NewTruncateRequest() *TruncateRequest { + return &TruncateRequest{} +} + +func (p *TruncateRequest) GetNameSpace() []byte { + return p.NameSpace +} +func (p *TruncateRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNameSpace bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNameSpace = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + return nil +} + +func (p *TruncateRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *TruncateRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("TruncateRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *TruncateRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nameSpace: ", p), err) + } + if err := oprot.WriteBinary(p.NameSpace); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nameSpace: ", p), err) + } + return err +} + +func (p *TruncateRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("TruncateRequest(%+v)", *p) +} + +// Attributes: +// - NumSeries +type TruncateResult_ struct { + NumSeries int64 `thrift:"numSeries,1,required" db:"numSeries" json:"numSeries"` +} + +func NewTruncateResult_() *TruncateResult_ { + return &TruncateResult_{} +} + +func (p *TruncateResult_) GetNumSeries() int64 { + return p.NumSeries +} +func (p *TruncateResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetNumSeries bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetNumSeries = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetNumSeries { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NumSeries is not set")) + } + return nil +} + +func (p *TruncateResult_) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.NumSeries = v + } + return nil +} + +func (p *TruncateResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("TruncateResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *TruncateResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("numSeries", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:numSeries: ", p), err) + } + if err := oprot.WriteI64(int64(p.NumSeries)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.numSeries (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:numSeries: ", p), err) + } + return err +} + +func (p *TruncateResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("TruncateResult_(%+v)", *p) +} + +// Attributes: +// - Ok +// - Status +// - Bootstrapped +// - Metadata +type NodeHealthResult_ struct { + Ok bool `thrift:"ok,1,required" db:"ok" json:"ok"` + Status string `thrift:"status,2,required" db:"status" json:"status"` + Bootstrapped bool `thrift:"bootstrapped,3,required" db:"bootstrapped" json:"bootstrapped"` + Metadata map[string]string `thrift:"metadata,4" db:"metadata" json:"metadata,omitempty"` +} + +func NewNodeHealthResult_() *NodeHealthResult_ { + return &NodeHealthResult_{} +} + +func (p *NodeHealthResult_) GetOk() bool { + return p.Ok +} + +func (p *NodeHealthResult_) GetStatus() string { + return p.Status +} + +func (p *NodeHealthResult_) GetBootstrapped() bool { + return p.Bootstrapped +} + +var NodeHealthResult__Metadata_DEFAULT map[string]string + +func (p *NodeHealthResult_) GetMetadata() map[string]string { + return p.Metadata +} +func (p *NodeHealthResult_) IsSetMetadata() bool { + return p.Metadata != nil +} + +func (p *NodeHealthResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetOk bool = false + var issetStatus bool = false + var issetBootstrapped bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetOk = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetStatus = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetBootstrapped = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetOk { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Ok is not set")) + } + if !issetStatus { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set")) + } + if !issetBootstrapped { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Bootstrapped is not set")) + } + return nil +} + +func (p *NodeHealthResult_) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Ok = v + } + return nil +} + +func (p *NodeHealthResult_) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Status = v + } + return nil +} + +func (p *NodeHealthResult_) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.Bootstrapped = v + } + return nil +} + +func (p *NodeHealthResult_) ReadField4(iprot thrift.TProtocol) error { + _, _, size, err := iprot.ReadMapBegin() + if err != nil { + return thrift.PrependError("error reading map begin: ", err) + } + tMap := make(map[string]string, size) + p.Metadata = tMap + for i := 0; i < size; i++ { + var _key22 string + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + _key22 = v + } + var _val23 string + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + _val23 = v + } + p.Metadata[_key22] = _val23 + } + if err := iprot.ReadMapEnd(); err != nil { + return thrift.PrependError("error reading map end: ", err) + } + return nil +} + +func (p *NodeHealthResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodeHealthResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeHealthResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("ok", thrift.BOOL, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ok: ", p), err) + } + if err := oprot.WriteBool(bool(p.Ok)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.ok (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ok: ", p), err) + } + return err +} + +func (p *NodeHealthResult_) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("status", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:status: ", p), err) + } + if err := oprot.WriteString(string(p.Status)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.status (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:status: ", p), err) + } + return err +} + +func (p *NodeHealthResult_) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("bootstrapped", thrift.BOOL, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:bootstrapped: ", p), err) + } + if err := oprot.WriteBool(bool(p.Bootstrapped)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.bootstrapped (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:bootstrapped: ", p), err) + } + return err +} + +func (p *NodeHealthResult_) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetMetadata() { + if err := oprot.WriteFieldBegin("metadata", thrift.MAP, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:metadata: ", p), err) + } + if err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(p.Metadata)); err != nil { + return thrift.PrependError("error writing map begin: ", err) + } + for k, v := range p.Metadata { + if err := oprot.WriteString(string(k)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + if err := oprot.WriteString(string(v)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + } + if err := oprot.WriteMapEnd(); err != nil { + return thrift.PrependError("error writing map end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:metadata: ", p), err) + } + } + return err +} + +func (p *NodeHealthResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeHealthResult_(%+v)", *p) +} + +type NodeBootstrappedResult_ struct { +} + +func NewNodeBootstrappedResult_() *NodeBootstrappedResult_ { + return &NodeBootstrappedResult_{} +} + +func (p *NodeBootstrappedResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeBootstrappedResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodeBootstrappedResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeBootstrappedResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeBootstrappedResult_(%+v)", *p) +} + +type NodeBootstrappedInPlacementOrNoPlacementResult_ struct { +} + +func NewNodeBootstrappedInPlacementOrNoPlacementResult_() *NodeBootstrappedInPlacementOrNoPlacementResult_ { + return &NodeBootstrappedInPlacementOrNoPlacementResult_{} +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodeBootstrappedInPlacementOrNoPlacementResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeBootstrappedInPlacementOrNoPlacementResult_(%+v)", *p) +} + +// Attributes: +// - LimitEnabled +// - LimitMbps +// - LimitCheckEvery +type NodePersistRateLimitResult_ struct { + LimitEnabled bool `thrift:"limitEnabled,1,required" db:"limitEnabled" json:"limitEnabled"` + LimitMbps float64 `thrift:"limitMbps,2,required" db:"limitMbps" json:"limitMbps"` + LimitCheckEvery int64 `thrift:"limitCheckEvery,3,required" db:"limitCheckEvery" json:"limitCheckEvery"` +} + +func NewNodePersistRateLimitResult_() *NodePersistRateLimitResult_ { + return &NodePersistRateLimitResult_{} +} + +func (p *NodePersistRateLimitResult_) GetLimitEnabled() bool { + return p.LimitEnabled +} + +func (p *NodePersistRateLimitResult_) GetLimitMbps() float64 { + return p.LimitMbps +} + +func (p *NodePersistRateLimitResult_) GetLimitCheckEvery() int64 { + return p.LimitCheckEvery +} +func (p *NodePersistRateLimitResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetLimitEnabled bool = false + var issetLimitMbps bool = false + var issetLimitCheckEvery bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetLimitEnabled = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetLimitMbps = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetLimitCheckEvery = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetLimitEnabled { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field LimitEnabled is not set")) + } + if !issetLimitMbps { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field LimitMbps is not set")) + } + if !issetLimitCheckEvery { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field LimitCheckEvery is not set")) + } + return nil +} + +func (p *NodePersistRateLimitResult_) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.LimitEnabled = v + } + return nil +} + +func (p *NodePersistRateLimitResult_) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadDouble(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.LimitMbps = v + } + return nil +} + +func (p *NodePersistRateLimitResult_) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.LimitCheckEvery = v + } + return nil +} + +func (p *NodePersistRateLimitResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodePersistRateLimitResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodePersistRateLimitResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("limitEnabled", thrift.BOOL, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:limitEnabled: ", p), err) + } + if err := oprot.WriteBool(bool(p.LimitEnabled)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limitEnabled (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:limitEnabled: ", p), err) + } + return err +} + +func (p *NodePersistRateLimitResult_) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("limitMbps", thrift.DOUBLE, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:limitMbps: ", p), err) + } + if err := oprot.WriteDouble(float64(p.LimitMbps)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limitMbps (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:limitMbps: ", p), err) + } + return err +} + +func (p *NodePersistRateLimitResult_) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("limitCheckEvery", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:limitCheckEvery: ", p), err) + } + if err := oprot.WriteI64(int64(p.LimitCheckEvery)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limitCheckEvery (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:limitCheckEvery: ", p), err) + } + return err +} + +func (p *NodePersistRateLimitResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodePersistRateLimitResult_(%+v)", *p) +} + +// Attributes: +// - LimitEnabled +// - LimitMbps +// - LimitCheckEvery +type NodeSetPersistRateLimitRequest struct { + LimitEnabled *bool `thrift:"limitEnabled,1" db:"limitEnabled" json:"limitEnabled,omitempty"` + LimitMbps *float64 `thrift:"limitMbps,2" db:"limitMbps" json:"limitMbps,omitempty"` + LimitCheckEvery *int64 `thrift:"limitCheckEvery,3" db:"limitCheckEvery" json:"limitCheckEvery,omitempty"` +} + +func NewNodeSetPersistRateLimitRequest() *NodeSetPersistRateLimitRequest { + return &NodeSetPersistRateLimitRequest{} +} + +var NodeSetPersistRateLimitRequest_LimitEnabled_DEFAULT bool + +func (p *NodeSetPersistRateLimitRequest) GetLimitEnabled() bool { + if !p.IsSetLimitEnabled() { + return NodeSetPersistRateLimitRequest_LimitEnabled_DEFAULT + } + return *p.LimitEnabled +} + +var NodeSetPersistRateLimitRequest_LimitMbps_DEFAULT float64 + +func (p *NodeSetPersistRateLimitRequest) GetLimitMbps() float64 { + if !p.IsSetLimitMbps() { + return NodeSetPersistRateLimitRequest_LimitMbps_DEFAULT + } + return *p.LimitMbps +} + +var NodeSetPersistRateLimitRequest_LimitCheckEvery_DEFAULT int64 + +func (p *NodeSetPersistRateLimitRequest) GetLimitCheckEvery() int64 { + if !p.IsSetLimitCheckEvery() { + return NodeSetPersistRateLimitRequest_LimitCheckEvery_DEFAULT + } + return *p.LimitCheckEvery +} +func (p *NodeSetPersistRateLimitRequest) IsSetLimitEnabled() bool { + return p.LimitEnabled != nil +} + +func (p *NodeSetPersistRateLimitRequest) IsSetLimitMbps() bool { + return p.LimitMbps != nil +} + +func (p *NodeSetPersistRateLimitRequest) IsSetLimitCheckEvery() bool { + return p.LimitCheckEvery != nil +} + +func (p *NodeSetPersistRateLimitRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeSetPersistRateLimitRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.LimitEnabled = &v + } + return nil +} + +func (p *NodeSetPersistRateLimitRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadDouble(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.LimitMbps = &v + } + return nil +} + +func (p *NodeSetPersistRateLimitRequest) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.LimitCheckEvery = &v + } + return nil +} + +func (p *NodeSetPersistRateLimitRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodeSetPersistRateLimitRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetPersistRateLimitRequest) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetLimitEnabled() { + if err := oprot.WriteFieldBegin("limitEnabled", thrift.BOOL, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:limitEnabled: ", p), err) + } + if err := oprot.WriteBool(bool(*p.LimitEnabled)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limitEnabled (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:limitEnabled: ", p), err) + } + } + return err +} + +func (p *NodeSetPersistRateLimitRequest) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetLimitMbps() { + if err := oprot.WriteFieldBegin("limitMbps", thrift.DOUBLE, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:limitMbps: ", p), err) + } + if err := oprot.WriteDouble(float64(*p.LimitMbps)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limitMbps (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:limitMbps: ", p), err) + } + } + return err +} + +func (p *NodeSetPersistRateLimitRequest) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetLimitCheckEvery() { + if err := oprot.WriteFieldBegin("limitCheckEvery", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:limitCheckEvery: ", p), err) + } + if err := oprot.WriteI64(int64(*p.LimitCheckEvery)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limitCheckEvery (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:limitCheckEvery: ", p), err) + } + } + return err +} + +func (p *NodeSetPersistRateLimitRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetPersistRateLimitRequest(%+v)", *p) +} + +// Attributes: +// - WriteNewSeriesAsync +type NodeWriteNewSeriesAsyncResult_ struct { + WriteNewSeriesAsync bool `thrift:"writeNewSeriesAsync,1,required" db:"writeNewSeriesAsync" json:"writeNewSeriesAsync"` +} + +func NewNodeWriteNewSeriesAsyncResult_() *NodeWriteNewSeriesAsyncResult_ { + return &NodeWriteNewSeriesAsyncResult_{} +} + +func (p *NodeWriteNewSeriesAsyncResult_) GetWriteNewSeriesAsync() bool { + return p.WriteNewSeriesAsync +} +func (p *NodeWriteNewSeriesAsyncResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetWriteNewSeriesAsync bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetWriteNewSeriesAsync = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetWriteNewSeriesAsync { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field WriteNewSeriesAsync is not set")) + } + return nil +} + +func (p *NodeWriteNewSeriesAsyncResult_) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.WriteNewSeriesAsync = v + } + return nil +} + +func (p *NodeWriteNewSeriesAsyncResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodeWriteNewSeriesAsyncResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteNewSeriesAsyncResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("writeNewSeriesAsync", thrift.BOOL, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:writeNewSeriesAsync: ", p), err) + } + if err := oprot.WriteBool(bool(p.WriteNewSeriesAsync)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.writeNewSeriesAsync (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:writeNewSeriesAsync: ", p), err) + } + return err +} + +func (p *NodeWriteNewSeriesAsyncResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteNewSeriesAsyncResult_(%+v)", *p) +} + +// Attributes: +// - WriteNewSeriesAsync +type NodeSetWriteNewSeriesAsyncRequest struct { + WriteNewSeriesAsync bool `thrift:"writeNewSeriesAsync,1,required" db:"writeNewSeriesAsync" json:"writeNewSeriesAsync"` +} + +func NewNodeSetWriteNewSeriesAsyncRequest() *NodeSetWriteNewSeriesAsyncRequest { + return &NodeSetWriteNewSeriesAsyncRequest{} +} + +func (p *NodeSetWriteNewSeriesAsyncRequest) GetWriteNewSeriesAsync() bool { + return p.WriteNewSeriesAsync +} +func (p *NodeSetWriteNewSeriesAsyncRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetWriteNewSeriesAsync bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetWriteNewSeriesAsync = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetWriteNewSeriesAsync { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field WriteNewSeriesAsync is not set")) + } + return nil +} + +func (p *NodeSetWriteNewSeriesAsyncRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.WriteNewSeriesAsync = v + } + return nil +} + +func (p *NodeSetWriteNewSeriesAsyncRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodeSetWriteNewSeriesAsyncRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesAsyncRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("writeNewSeriesAsync", thrift.BOOL, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:writeNewSeriesAsync: ", p), err) + } + if err := oprot.WriteBool(bool(p.WriteNewSeriesAsync)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.writeNewSeriesAsync (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:writeNewSeriesAsync: ", p), err) + } + return err +} + +func (p *NodeSetWriteNewSeriesAsyncRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetWriteNewSeriesAsyncRequest(%+v)", *p) +} + +// Attributes: +// - WriteNewSeriesBackoffDuration +// - DurationType +type NodeWriteNewSeriesBackoffDurationResult_ struct { + WriteNewSeriesBackoffDuration int64 `thrift:"writeNewSeriesBackoffDuration,1,required" db:"writeNewSeriesBackoffDuration" json:"writeNewSeriesBackoffDuration"` + DurationType TimeType `thrift:"durationType,2,required" db:"durationType" json:"durationType"` +} + +func NewNodeWriteNewSeriesBackoffDurationResult_() *NodeWriteNewSeriesBackoffDurationResult_ { + return &NodeWriteNewSeriesBackoffDurationResult_{} +} + +func (p *NodeWriteNewSeriesBackoffDurationResult_) GetWriteNewSeriesBackoffDuration() int64 { + return p.WriteNewSeriesBackoffDuration +} + +func (p *NodeWriteNewSeriesBackoffDurationResult_) GetDurationType() TimeType { + return p.DurationType +} +func (p *NodeWriteNewSeriesBackoffDurationResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetWriteNewSeriesBackoffDuration bool = false + var issetDurationType bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetWriteNewSeriesBackoffDuration = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetDurationType = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetWriteNewSeriesBackoffDuration { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field WriteNewSeriesBackoffDuration is not set")) + } + if !issetDurationType { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DurationType is not set")) + } + return nil +} + +func (p *NodeWriteNewSeriesBackoffDurationResult_) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.WriteNewSeriesBackoffDuration = v + } + return nil +} + +func (p *NodeWriteNewSeriesBackoffDurationResult_) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + temp := TimeType(v) + p.DurationType = temp + } + return nil +} + +func (p *NodeWriteNewSeriesBackoffDurationResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodeWriteNewSeriesBackoffDurationResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteNewSeriesBackoffDurationResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("writeNewSeriesBackoffDuration", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:writeNewSeriesBackoffDuration: ", p), err) + } + if err := oprot.WriteI64(int64(p.WriteNewSeriesBackoffDuration)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.writeNewSeriesBackoffDuration (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:writeNewSeriesBackoffDuration: ", p), err) + } + return err +} + +func (p *NodeWriteNewSeriesBackoffDurationResult_) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("durationType", thrift.I32, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:durationType: ", p), err) + } + if err := oprot.WriteI32(int32(p.DurationType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.durationType (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:durationType: ", p), err) + } + return err +} + +func (p *NodeWriteNewSeriesBackoffDurationResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteNewSeriesBackoffDurationResult_(%+v)", *p) +} + +// Attributes: +// - WriteNewSeriesBackoffDuration +// - DurationType +type NodeSetWriteNewSeriesBackoffDurationRequest struct { + WriteNewSeriesBackoffDuration int64 `thrift:"writeNewSeriesBackoffDuration,1,required" db:"writeNewSeriesBackoffDuration" json:"writeNewSeriesBackoffDuration"` + DurationType TimeType `thrift:"durationType,2" db:"durationType" json:"durationType,omitempty"` +} + +func NewNodeSetWriteNewSeriesBackoffDurationRequest() *NodeSetWriteNewSeriesBackoffDurationRequest { + return &NodeSetWriteNewSeriesBackoffDurationRequest{ + DurationType: 2, + } +} + +func (p *NodeSetWriteNewSeriesBackoffDurationRequest) GetWriteNewSeriesBackoffDuration() int64 { + return p.WriteNewSeriesBackoffDuration +} + +var NodeSetWriteNewSeriesBackoffDurationRequest_DurationType_DEFAULT TimeType = 2 + +func (p *NodeSetWriteNewSeriesBackoffDurationRequest) GetDurationType() TimeType { + return p.DurationType +} +func (p *NodeSetWriteNewSeriesBackoffDurationRequest) IsSetDurationType() bool { + return p.DurationType != NodeSetWriteNewSeriesBackoffDurationRequest_DurationType_DEFAULT +} + +func (p *NodeSetWriteNewSeriesBackoffDurationRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetWriteNewSeriesBackoffDuration bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetWriteNewSeriesBackoffDuration = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetWriteNewSeriesBackoffDuration { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field WriteNewSeriesBackoffDuration is not set")) + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.WriteNewSeriesBackoffDuration = v + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + temp := TimeType(v) + p.DurationType = temp + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodeSetWriteNewSeriesBackoffDurationRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("writeNewSeriesBackoffDuration", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:writeNewSeriesBackoffDuration: ", p), err) + } + if err := oprot.WriteI64(int64(p.WriteNewSeriesBackoffDuration)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.writeNewSeriesBackoffDuration (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:writeNewSeriesBackoffDuration: ", p), err) + } + return err +} + +func (p *NodeSetWriteNewSeriesBackoffDurationRequest) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetDurationType() { + if err := oprot.WriteFieldBegin("durationType", thrift.I32, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:durationType: ", p), err) + } + if err := oprot.WriteI32(int32(p.DurationType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.durationType (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:durationType: ", p), err) + } + } + return err +} + +func (p *NodeSetWriteNewSeriesBackoffDurationRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetWriteNewSeriesBackoffDurationRequest(%+v)", *p) +} + +// Attributes: +// - WriteNewSeriesLimitPerShardPerSecond +type NodeWriteNewSeriesLimitPerShardPerSecondResult_ struct { + WriteNewSeriesLimitPerShardPerSecond int64 `thrift:"writeNewSeriesLimitPerShardPerSecond,1,required" db:"writeNewSeriesLimitPerShardPerSecond" json:"writeNewSeriesLimitPerShardPerSecond"` +} + +func NewNodeWriteNewSeriesLimitPerShardPerSecondResult_() *NodeWriteNewSeriesLimitPerShardPerSecondResult_ { + return &NodeWriteNewSeriesLimitPerShardPerSecondResult_{} +} + +func (p *NodeWriteNewSeriesLimitPerShardPerSecondResult_) GetWriteNewSeriesLimitPerShardPerSecond() int64 { + return p.WriteNewSeriesLimitPerShardPerSecond +} +func (p *NodeWriteNewSeriesLimitPerShardPerSecondResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetWriteNewSeriesLimitPerShardPerSecond bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetWriteNewSeriesLimitPerShardPerSecond = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetWriteNewSeriesLimitPerShardPerSecond { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field WriteNewSeriesLimitPerShardPerSecond is not set")) + } + return nil +} + +func (p *NodeWriteNewSeriesLimitPerShardPerSecondResult_) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.WriteNewSeriesLimitPerShardPerSecond = v + } + return nil +} + +func (p *NodeWriteNewSeriesLimitPerShardPerSecondResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodeWriteNewSeriesLimitPerShardPerSecondResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteNewSeriesLimitPerShardPerSecondResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("writeNewSeriesLimitPerShardPerSecond", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:writeNewSeriesLimitPerShardPerSecond: ", p), err) + } + if err := oprot.WriteI64(int64(p.WriteNewSeriesLimitPerShardPerSecond)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.writeNewSeriesLimitPerShardPerSecond (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:writeNewSeriesLimitPerShardPerSecond: ", p), err) + } + return err +} + +func (p *NodeWriteNewSeriesLimitPerShardPerSecondResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteNewSeriesLimitPerShardPerSecondResult_(%+v)", *p) +} + +// Attributes: +// - WriteNewSeriesLimitPerShardPerSecond +type NodeSetWriteNewSeriesLimitPerShardPerSecondRequest struct { + WriteNewSeriesLimitPerShardPerSecond int64 `thrift:"writeNewSeriesLimitPerShardPerSecond,1,required" db:"writeNewSeriesLimitPerShardPerSecond" json:"writeNewSeriesLimitPerShardPerSecond"` +} + +func NewNodeSetWriteNewSeriesLimitPerShardPerSecondRequest() *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest { + return &NodeSetWriteNewSeriesLimitPerShardPerSecondRequest{} +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) GetWriteNewSeriesLimitPerShardPerSecond() int64 { + return p.WriteNewSeriesLimitPerShardPerSecond +} +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetWriteNewSeriesLimitPerShardPerSecond bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetWriteNewSeriesLimitPerShardPerSecond = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetWriteNewSeriesLimitPerShardPerSecond { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field WriteNewSeriesLimitPerShardPerSecond is not set")) + } + return nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.WriteNewSeriesLimitPerShardPerSecond = v + } + return nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NodeSetWriteNewSeriesLimitPerShardPerSecondRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("writeNewSeriesLimitPerShardPerSecond", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:writeNewSeriesLimitPerShardPerSecond: ", p), err) + } + if err := oprot.WriteI64(int64(p.WriteNewSeriesLimitPerShardPerSecond)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.writeNewSeriesLimitPerShardPerSecond (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:writeNewSeriesLimitPerShardPerSecond: ", p), err) + } + return err +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetWriteNewSeriesLimitPerShardPerSecondRequest(%+v)", *p) +} + +// Attributes: +// - Ok +// - Status +type HealthResult_ struct { + Ok bool `thrift:"ok,1,required" db:"ok" json:"ok"` + Status string `thrift:"status,2,required" db:"status" json:"status"` +} + +func NewHealthResult_() *HealthResult_ { + return &HealthResult_{} +} + +func (p *HealthResult_) GetOk() bool { + return p.Ok +} + +func (p *HealthResult_) GetStatus() string { + return p.Status +} +func (p *HealthResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetOk bool = false + var issetStatus bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetOk = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetStatus = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetOk { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Ok is not set")) + } + if !issetStatus { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set")) + } + return nil +} + +func (p *HealthResult_) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Ok = v + } + return nil +} + +func (p *HealthResult_) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Status = v + } + return nil +} + +func (p *HealthResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("HealthResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *HealthResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("ok", thrift.BOOL, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ok: ", p), err) + } + if err := oprot.WriteBool(bool(p.Ok)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.ok (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ok: ", p), err) + } + return err +} + +func (p *HealthResult_) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("status", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:status: ", p), err) + } + if err := oprot.WriteString(string(p.Status)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.status (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:status: ", p), err) + } + return err +} + +func (p *HealthResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("HealthResult_(%+v)", *p) +} + +// Attributes: +// - Query +// - RangeStart +// - RangeEnd +// - NameSpace +// - Limit +// - TagNameFilter +// - AggregateQueryType +// - RangeType +type AggregateQueryRawRequest struct { + Query []byte `thrift:"query,1,required" db:"query" json:"query"` + RangeStart int64 `thrift:"rangeStart,2,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,3,required" db:"rangeEnd" json:"rangeEnd"` + NameSpace []byte `thrift:"nameSpace,4,required" db:"nameSpace" json:"nameSpace"` + Limit *int64 `thrift:"limit,5" db:"limit" json:"limit,omitempty"` + TagNameFilter [][]byte `thrift:"tagNameFilter,6" db:"tagNameFilter" json:"tagNameFilter,omitempty"` + AggregateQueryType AggregateQueryType `thrift:"aggregateQueryType,7" db:"aggregateQueryType" json:"aggregateQueryType,omitempty"` + RangeType TimeType `thrift:"rangeType,8" db:"rangeType" json:"rangeType,omitempty"` +} + +func NewAggregateQueryRawRequest() *AggregateQueryRawRequest { + return &AggregateQueryRawRequest{ + AggregateQueryType: 1, + + RangeType: 0, + } +} + +func (p *AggregateQueryRawRequest) GetQuery() []byte { + return p.Query +} + +func (p *AggregateQueryRawRequest) GetRangeStart() int64 { + return p.RangeStart +} + +func (p *AggregateQueryRawRequest) GetRangeEnd() int64 { + return p.RangeEnd +} + +func (p *AggregateQueryRawRequest) GetNameSpace() []byte { + return p.NameSpace +} + +var AggregateQueryRawRequest_Limit_DEFAULT int64 + +func (p *AggregateQueryRawRequest) GetLimit() int64 { + if !p.IsSetLimit() { + return AggregateQueryRawRequest_Limit_DEFAULT + } + return *p.Limit +} + +var AggregateQueryRawRequest_TagNameFilter_DEFAULT [][]byte + +func (p *AggregateQueryRawRequest) GetTagNameFilter() [][]byte { + return p.TagNameFilter +} + +var AggregateQueryRawRequest_AggregateQueryType_DEFAULT AggregateQueryType = 1 + +func (p *AggregateQueryRawRequest) GetAggregateQueryType() AggregateQueryType { + return p.AggregateQueryType +} + +var AggregateQueryRawRequest_RangeType_DEFAULT TimeType = 0 + +func (p *AggregateQueryRawRequest) GetRangeType() TimeType { + return p.RangeType +} +func (p *AggregateQueryRawRequest) IsSetLimit() bool { + return p.Limit != nil +} + +func (p *AggregateQueryRawRequest) IsSetTagNameFilter() bool { + return p.TagNameFilter != nil +} + +func (p *AggregateQueryRawRequest) IsSetAggregateQueryType() bool { + return p.AggregateQueryType != AggregateQueryRawRequest_AggregateQueryType_DEFAULT +} + +func (p *AggregateQueryRawRequest) IsSetRangeType() bool { + return p.RangeType != AggregateQueryRawRequest_RangeType_DEFAULT +} + +func (p *AggregateQueryRawRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetQuery bool = false + var issetRangeStart bool = false + var issetRangeEnd bool = false + var issetNameSpace bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetQuery = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetRangeStart = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetRangeEnd = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetNameSpace = true + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + case 7: + if err := p.ReadField7(iprot); err != nil { + return err + } + case 8: + if err := p.ReadField8(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetQuery { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Query is not set")) + } + if !issetRangeStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) + } + if !issetRangeEnd { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeEnd is not set")) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + return nil +} + +func (p *AggregateQueryRawRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Query = v + } + return nil +} + +func (p *AggregateQueryRawRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.RangeStart = v + } + return nil +} + +func (p *AggregateQueryRawRequest) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.RangeEnd = v + } + return nil +} + +func (p *AggregateQueryRawRequest) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *AggregateQueryRawRequest) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.Limit = &v + } + return nil +} + +func (p *AggregateQueryRawRequest) ReadField6(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([][]byte, 0, size) + p.TagNameFilter = tSlice + for i := 0; i < size; i++ { + var _elem24 []byte + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + _elem24 = v + } + p.TagNameFilter = append(p.TagNameFilter, _elem24) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *AggregateQueryRawRequest) ReadField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + temp := AggregateQueryType(v) + p.AggregateQueryType = temp + } + return nil +} + +func (p *AggregateQueryRawRequest) ReadField8(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 8: ", err) + } else { + temp := TimeType(v) + p.RangeType = temp + } + return nil +} + +func (p *AggregateQueryRawRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateQueryRawRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + if err := p.writeField8(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateQueryRawRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("query", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:query: ", p), err) + } + if err := oprot.WriteBinary(p.Query); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.query (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:query: ", p), err) + } + return err +} + +func (p *AggregateQueryRawRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:rangeStart: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:rangeStart: ", p), err) + } + return err +} + +func (p *AggregateQueryRawRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rangeEnd: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rangeEnd: ", p), err) + } + return err +} + +func (p *AggregateQueryRawRequest) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:nameSpace: ", p), err) + } + if err := oprot.WriteBinary(p.NameSpace); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:nameSpace: ", p), err) + } + return err +} + +func (p *AggregateQueryRawRequest) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetLimit() { + if err := oprot.WriteFieldBegin("limit", thrift.I64, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:limit: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Limit)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limit (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:limit: ", p), err) + } + } + return err +} + +func (p *AggregateQueryRawRequest) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetTagNameFilter() { + if err := oprot.WriteFieldBegin("tagNameFilter", thrift.LIST, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:tagNameFilter: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRING, len(p.TagNameFilter)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.TagNameFilter { + if err := oprot.WriteBinary(v); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:tagNameFilter: ", p), err) + } + } + return err +} + +func (p *AggregateQueryRawRequest) writeField7(oprot thrift.TProtocol) (err error) { + if p.IsSetAggregateQueryType() { + if err := oprot.WriteFieldBegin("aggregateQueryType", thrift.I32, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:aggregateQueryType: ", p), err) + } + if err := oprot.WriteI32(int32(p.AggregateQueryType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.aggregateQueryType (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:aggregateQueryType: ", p), err) + } + } + return err +} + +func (p *AggregateQueryRawRequest) writeField8(oprot thrift.TProtocol) (err error) { + if p.IsSetRangeType() { + if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:rangeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.RangeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeType (8) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:rangeType: ", p), err) + } + } + return err +} + +func (p *AggregateQueryRawRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateQueryRawRequest(%+v)", *p) +} + +// Attributes: +// - Results +// - Exhaustive +type AggregateQueryRawResult_ struct { + Results []*AggregateQueryRawResultTagNameElement `thrift:"results,1,required" db:"results" json:"results"` + Exhaustive bool `thrift:"exhaustive,2,required" db:"exhaustive" json:"exhaustive"` +} + +func NewAggregateQueryRawResult_() *AggregateQueryRawResult_ { + return &AggregateQueryRawResult_{} +} + +func (p *AggregateQueryRawResult_) GetResults() []*AggregateQueryRawResultTagNameElement { + return p.Results +} + +func (p *AggregateQueryRawResult_) GetExhaustive() bool { + return p.Exhaustive +} +func (p *AggregateQueryRawResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetResults bool = false + var issetExhaustive bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetResults = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetExhaustive = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetResults { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Results is not set")) + } + if !issetExhaustive { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Exhaustive is not set")) + } + return nil +} + +func (p *AggregateQueryRawResult_) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*AggregateQueryRawResultTagNameElement, 0, size) + p.Results = tSlice + for i := 0; i < size; i++ { + _elem25 := &AggregateQueryRawResultTagNameElement{} + if err := _elem25.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem25), err) + } + p.Results = append(p.Results, _elem25) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *AggregateQueryRawResult_) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Exhaustive = v + } + return nil +} + +func (p *AggregateQueryRawResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateQueryRawResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateQueryRawResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("results", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:results: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Results)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Results { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:results: ", p), err) + } + return err +} + +func (p *AggregateQueryRawResult_) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("exhaustive", thrift.BOOL, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:exhaustive: ", p), err) + } + if err := oprot.WriteBool(bool(p.Exhaustive)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.exhaustive (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:exhaustive: ", p), err) + } + return err +} + +func (p *AggregateQueryRawResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateQueryRawResult_(%+v)", *p) +} + +// Attributes: +// - TagName +// - TagValues +type AggregateQueryRawResultTagNameElement struct { + TagName []byte `thrift:"tagName,1,required" db:"tagName" json:"tagName"` + TagValues []*AggregateQueryRawResultTagValueElement `thrift:"tagValues,2" db:"tagValues" json:"tagValues,omitempty"` +} + +func NewAggregateQueryRawResultTagNameElement() *AggregateQueryRawResultTagNameElement { + return &AggregateQueryRawResultTagNameElement{} +} + +func (p *AggregateQueryRawResultTagNameElement) GetTagName() []byte { + return p.TagName +} + +var AggregateQueryRawResultTagNameElement_TagValues_DEFAULT []*AggregateQueryRawResultTagValueElement + +func (p *AggregateQueryRawResultTagNameElement) GetTagValues() []*AggregateQueryRawResultTagValueElement { + return p.TagValues +} +func (p *AggregateQueryRawResultTagNameElement) IsSetTagValues() bool { + return p.TagValues != nil +} + +func (p *AggregateQueryRawResultTagNameElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetTagName bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetTagName = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetTagName { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TagName is not set")) + } + return nil +} + +func (p *AggregateQueryRawResultTagNameElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.TagName = v + } + return nil +} + +func (p *AggregateQueryRawResultTagNameElement) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*AggregateQueryRawResultTagValueElement, 0, size) + p.TagValues = tSlice + for i := 0; i < size; i++ { + _elem26 := &AggregateQueryRawResultTagValueElement{} + if err := _elem26.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem26), err) + } + p.TagValues = append(p.TagValues, _elem26) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *AggregateQueryRawResultTagNameElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateQueryRawResultTagNameElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateQueryRawResultTagNameElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("tagName", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:tagName: ", p), err) + } + if err := oprot.WriteBinary(p.TagName); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.tagName (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:tagName: ", p), err) + } + return err +} + +func (p *AggregateQueryRawResultTagNameElement) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetTagValues() { + if err := oprot.WriteFieldBegin("tagValues", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:tagValues: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.TagValues)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.TagValues { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:tagValues: ", p), err) + } + } + return err +} + +func (p *AggregateQueryRawResultTagNameElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateQueryRawResultTagNameElement(%+v)", *p) +} + +// Attributes: +// - TagValue +type AggregateQueryRawResultTagValueElement struct { + TagValue []byte `thrift:"tagValue,1,required" db:"tagValue" json:"tagValue"` +} + +func NewAggregateQueryRawResultTagValueElement() *AggregateQueryRawResultTagValueElement { + return &AggregateQueryRawResultTagValueElement{} +} + +func (p *AggregateQueryRawResultTagValueElement) GetTagValue() []byte { + return p.TagValue +} +func (p *AggregateQueryRawResultTagValueElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetTagValue bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetTagValue = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetTagValue { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TagValue is not set")) + } + return nil +} + +func (p *AggregateQueryRawResultTagValueElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.TagValue = v + } + return nil +} + +func (p *AggregateQueryRawResultTagValueElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateQueryRawResultTagValueElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateQueryRawResultTagValueElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("tagValue", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:tagValue: ", p), err) + } + if err := oprot.WriteBinary(p.TagValue); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.tagValue (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:tagValue: ", p), err) + } + return err +} + +func (p *AggregateQueryRawResultTagValueElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateQueryRawResultTagValueElement(%+v)", *p) +} + +// Attributes: +// - Query +// - RangeStart +// - RangeEnd +// - NameSpace +// - Limit +// - TagNameFilter +// - AggregateQueryType +// - RangeType +type AggregateQueryRequest struct { + Query *Query `thrift:"query,1" db:"query" json:"query,omitempty"` + RangeStart int64 `thrift:"rangeStart,2,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,3,required" db:"rangeEnd" json:"rangeEnd"` + NameSpace string `thrift:"nameSpace,4,required" db:"nameSpace" json:"nameSpace"` + Limit *int64 `thrift:"limit,5" db:"limit" json:"limit,omitempty"` + TagNameFilter []string `thrift:"tagNameFilter,6" db:"tagNameFilter" json:"tagNameFilter,omitempty"` + AggregateQueryType AggregateQueryType `thrift:"aggregateQueryType,7" db:"aggregateQueryType" json:"aggregateQueryType,omitempty"` + RangeType TimeType `thrift:"rangeType,8" db:"rangeType" json:"rangeType,omitempty"` +} + +func NewAggregateQueryRequest() *AggregateQueryRequest { + return &AggregateQueryRequest{ + AggregateQueryType: 1, + + RangeType: 0, + } +} + +var AggregateQueryRequest_Query_DEFAULT *Query + +func (p *AggregateQueryRequest) GetQuery() *Query { + if !p.IsSetQuery() { + return AggregateQueryRequest_Query_DEFAULT + } + return p.Query +} + +func (p *AggregateQueryRequest) GetRangeStart() int64 { + return p.RangeStart +} + +func (p *AggregateQueryRequest) GetRangeEnd() int64 { + return p.RangeEnd +} + +func (p *AggregateQueryRequest) GetNameSpace() string { + return p.NameSpace +} + +var AggregateQueryRequest_Limit_DEFAULT int64 + +func (p *AggregateQueryRequest) GetLimit() int64 { + if !p.IsSetLimit() { + return AggregateQueryRequest_Limit_DEFAULT + } + return *p.Limit +} + +var AggregateQueryRequest_TagNameFilter_DEFAULT []string + +func (p *AggregateQueryRequest) GetTagNameFilter() []string { + return p.TagNameFilter +} + +var AggregateQueryRequest_AggregateQueryType_DEFAULT AggregateQueryType = 1 + +func (p *AggregateQueryRequest) GetAggregateQueryType() AggregateQueryType { + return p.AggregateQueryType +} + +var AggregateQueryRequest_RangeType_DEFAULT TimeType = 0 + +func (p *AggregateQueryRequest) GetRangeType() TimeType { + return p.RangeType +} +func (p *AggregateQueryRequest) IsSetQuery() bool { + return p.Query != nil +} + +func (p *AggregateQueryRequest) IsSetLimit() bool { + return p.Limit != nil +} + +func (p *AggregateQueryRequest) IsSetTagNameFilter() bool { + return p.TagNameFilter != nil +} + +func (p *AggregateQueryRequest) IsSetAggregateQueryType() bool { + return p.AggregateQueryType != AggregateQueryRequest_AggregateQueryType_DEFAULT +} + +func (p *AggregateQueryRequest) IsSetRangeType() bool { + return p.RangeType != AggregateQueryRequest_RangeType_DEFAULT +} + +func (p *AggregateQueryRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetRangeStart bool = false + var issetRangeEnd bool = false + var issetNameSpace bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetRangeStart = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetRangeEnd = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetNameSpace = true + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + case 7: + if err := p.ReadField7(iprot); err != nil { + return err + } + case 8: + if err := p.ReadField8(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetRangeStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) + } + if !issetRangeEnd { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeEnd is not set")) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + return nil +} + +func (p *AggregateQueryRequest) ReadField1(iprot thrift.TProtocol) error { + p.Query = &Query{} + if err := p.Query.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Query), err) + } + return nil +} + +func (p *AggregateQueryRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.RangeStart = v + } + return nil +} + +func (p *AggregateQueryRequest) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.RangeEnd = v + } + return nil +} + +func (p *AggregateQueryRequest) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *AggregateQueryRequest) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.Limit = &v + } + return nil +} + +func (p *AggregateQueryRequest) ReadField6(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]string, 0, size) + p.TagNameFilter = tSlice + for i := 0; i < size; i++ { + var _elem27 string + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + _elem27 = v + } + p.TagNameFilter = append(p.TagNameFilter, _elem27) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *AggregateQueryRequest) ReadField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + temp := AggregateQueryType(v) + p.AggregateQueryType = temp + } + return nil +} + +func (p *AggregateQueryRequest) ReadField8(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 8: ", err) + } else { + temp := TimeType(v) + p.RangeType = temp + } + return nil +} + +func (p *AggregateQueryRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateQueryRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + if err := p.writeField8(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateQueryRequest) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetQuery() { + if err := oprot.WriteFieldBegin("query", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:query: ", p), err) + } + if err := p.Query.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Query), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:query: ", p), err) + } + } + return err +} + +func (p *AggregateQueryRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:rangeStart: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:rangeStart: ", p), err) + } + return err +} + +func (p *AggregateQueryRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rangeEnd: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rangeEnd: ", p), err) + } + return err +} + +func (p *AggregateQueryRequest) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:nameSpace: ", p), err) + } + if err := oprot.WriteString(string(p.NameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:nameSpace: ", p), err) + } + return err +} + +func (p *AggregateQueryRequest) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetLimit() { + if err := oprot.WriteFieldBegin("limit", thrift.I64, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:limit: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Limit)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limit (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:limit: ", p), err) + } + } + return err +} + +func (p *AggregateQueryRequest) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetTagNameFilter() { + if err := oprot.WriteFieldBegin("tagNameFilter", thrift.LIST, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:tagNameFilter: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRING, len(p.TagNameFilter)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.TagNameFilter { + if err := oprot.WriteString(string(v)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:tagNameFilter: ", p), err) + } + } + return err +} + +func (p *AggregateQueryRequest) writeField7(oprot thrift.TProtocol) (err error) { + if p.IsSetAggregateQueryType() { + if err := oprot.WriteFieldBegin("aggregateQueryType", thrift.I32, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:aggregateQueryType: ", p), err) + } + if err := oprot.WriteI32(int32(p.AggregateQueryType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.aggregateQueryType (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:aggregateQueryType: ", p), err) + } + } + return err +} + +func (p *AggregateQueryRequest) writeField8(oprot thrift.TProtocol) (err error) { + if p.IsSetRangeType() { + if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:rangeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.RangeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeType (8) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:rangeType: ", p), err) + } + } + return err +} + +func (p *AggregateQueryRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateQueryRequest(%+v)", *p) +} + +// Attributes: +// - Results +// - Exhaustive +type AggregateQueryResult_ struct { + Results []*AggregateQueryResultTagNameElement `thrift:"results,1,required" db:"results" json:"results"` + Exhaustive bool `thrift:"exhaustive,2,required" db:"exhaustive" json:"exhaustive"` +} + +func NewAggregateQueryResult_() *AggregateQueryResult_ { + return &AggregateQueryResult_{} +} + +func (p *AggregateQueryResult_) GetResults() []*AggregateQueryResultTagNameElement { + return p.Results +} + +func (p *AggregateQueryResult_) GetExhaustive() bool { + return p.Exhaustive +} +func (p *AggregateQueryResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetResults bool = false + var issetExhaustive bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetResults = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetExhaustive = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetResults { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Results is not set")) + } + if !issetExhaustive { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Exhaustive is not set")) + } + return nil +} + +func (p *AggregateQueryResult_) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*AggregateQueryResultTagNameElement, 0, size) + p.Results = tSlice + for i := 0; i < size; i++ { + _elem28 := &AggregateQueryResultTagNameElement{} + if err := _elem28.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem28), err) + } + p.Results = append(p.Results, _elem28) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *AggregateQueryResult_) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Exhaustive = v + } + return nil +} + +func (p *AggregateQueryResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateQueryResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateQueryResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("results", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:results: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Results)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Results { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:results: ", p), err) + } + return err +} + +func (p *AggregateQueryResult_) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("exhaustive", thrift.BOOL, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:exhaustive: ", p), err) + } + if err := oprot.WriteBool(bool(p.Exhaustive)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.exhaustive (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:exhaustive: ", p), err) + } + return err +} + +func (p *AggregateQueryResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateQueryResult_(%+v)", *p) +} + +// Attributes: +// - TagName +// - TagValues +type AggregateQueryResultTagNameElement struct { + TagName string `thrift:"tagName,1,required" db:"tagName" json:"tagName"` + TagValues []*AggregateQueryResultTagValueElement `thrift:"tagValues,2" db:"tagValues" json:"tagValues,omitempty"` +} + +func NewAggregateQueryResultTagNameElement() *AggregateQueryResultTagNameElement { + return &AggregateQueryResultTagNameElement{} +} + +func (p *AggregateQueryResultTagNameElement) GetTagName() string { + return p.TagName +} + +var AggregateQueryResultTagNameElement_TagValues_DEFAULT []*AggregateQueryResultTagValueElement + +func (p *AggregateQueryResultTagNameElement) GetTagValues() []*AggregateQueryResultTagValueElement { + return p.TagValues +} +func (p *AggregateQueryResultTagNameElement) IsSetTagValues() bool { + return p.TagValues != nil +} + +func (p *AggregateQueryResultTagNameElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetTagName bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetTagName = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetTagName { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TagName is not set")) + } + return nil +} + +func (p *AggregateQueryResultTagNameElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.TagName = v + } + return nil +} + +func (p *AggregateQueryResultTagNameElement) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*AggregateQueryResultTagValueElement, 0, size) + p.TagValues = tSlice + for i := 0; i < size; i++ { + _elem29 := &AggregateQueryResultTagValueElement{} + if err := _elem29.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem29), err) + } + p.TagValues = append(p.TagValues, _elem29) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *AggregateQueryResultTagNameElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateQueryResultTagNameElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateQueryResultTagNameElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("tagName", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:tagName: ", p), err) + } + if err := oprot.WriteString(string(p.TagName)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.tagName (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:tagName: ", p), err) + } + return err +} + +func (p *AggregateQueryResultTagNameElement) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetTagValues() { + if err := oprot.WriteFieldBegin("tagValues", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:tagValues: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.TagValues)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.TagValues { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:tagValues: ", p), err) + } + } + return err +} + +func (p *AggregateQueryResultTagNameElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateQueryResultTagNameElement(%+v)", *p) +} + +// Attributes: +// - TagValue +type AggregateQueryResultTagValueElement struct { + TagValue string `thrift:"tagValue,1,required" db:"tagValue" json:"tagValue"` +} + +func NewAggregateQueryResultTagValueElement() *AggregateQueryResultTagValueElement { + return &AggregateQueryResultTagValueElement{} +} + +func (p *AggregateQueryResultTagValueElement) GetTagValue() string { + return p.TagValue +} +func (p *AggregateQueryResultTagValueElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetTagValue bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetTagValue = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetTagValue { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TagValue is not set")) + } + return nil +} + +func (p *AggregateQueryResultTagValueElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.TagValue = v + } + return nil +} + +func (p *AggregateQueryResultTagValueElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateQueryResultTagValueElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateQueryResultTagValueElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("tagValue", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:tagValue: ", p), err) + } + if err := oprot.WriteString(string(p.TagValue)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.tagValue (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:tagValue: ", p), err) + } + return err +} + +func (p *AggregateQueryResultTagValueElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateQueryResultTagValueElement(%+v)", *p) +} + +// Attributes: +// - Query +// - RangeStart +// - RangeEnd +// - NameSpace +// - Limit +// - NoData +// - RangeType +// - ResultTimeType +type QueryRequest struct { + Query *Query `thrift:"query,1,required" db:"query" json:"query"` + RangeStart int64 `thrift:"rangeStart,2,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,3,required" db:"rangeEnd" json:"rangeEnd"` + NameSpace string `thrift:"nameSpace,4,required" db:"nameSpace" json:"nameSpace"` + Limit *int64 `thrift:"limit,5" db:"limit" json:"limit,omitempty"` + NoData *bool `thrift:"noData,6" db:"noData" json:"noData,omitempty"` + RangeType TimeType `thrift:"rangeType,7" db:"rangeType" json:"rangeType,omitempty"` + ResultTimeType TimeType `thrift:"resultTimeType,8" db:"resultTimeType" json:"resultTimeType,omitempty"` +} + +func NewQueryRequest() *QueryRequest { + return &QueryRequest{ + RangeType: 0, + + ResultTimeType: 0, + } +} + +var QueryRequest_Query_DEFAULT *Query + +func (p *QueryRequest) GetQuery() *Query { + if !p.IsSetQuery() { + return QueryRequest_Query_DEFAULT + } + return p.Query +} + +func (p *QueryRequest) GetRangeStart() int64 { + return p.RangeStart +} + +func (p *QueryRequest) GetRangeEnd() int64 { + return p.RangeEnd +} + +func (p *QueryRequest) GetNameSpace() string { + return p.NameSpace +} + +var QueryRequest_Limit_DEFAULT int64 + +func (p *QueryRequest) GetLimit() int64 { + if !p.IsSetLimit() { + return QueryRequest_Limit_DEFAULT + } + return *p.Limit +} + +var QueryRequest_NoData_DEFAULT bool + +func (p *QueryRequest) GetNoData() bool { + if !p.IsSetNoData() { + return QueryRequest_NoData_DEFAULT + } + return *p.NoData +} + +var QueryRequest_RangeType_DEFAULT TimeType = 0 + +func (p *QueryRequest) GetRangeType() TimeType { + return p.RangeType +} + +var QueryRequest_ResultTimeType_DEFAULT TimeType = 0 + +func (p *QueryRequest) GetResultTimeType() TimeType { + return p.ResultTimeType +} +func (p *QueryRequest) IsSetQuery() bool { + return p.Query != nil +} + +func (p *QueryRequest) IsSetLimit() bool { + return p.Limit != nil +} + +func (p *QueryRequest) IsSetNoData() bool { + return p.NoData != nil +} + +func (p *QueryRequest) IsSetRangeType() bool { + return p.RangeType != QueryRequest_RangeType_DEFAULT +} + +func (p *QueryRequest) IsSetResultTimeType() bool { + return p.ResultTimeType != QueryRequest_ResultTimeType_DEFAULT +} + +func (p *QueryRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetQuery bool = false + var issetRangeStart bool = false + var issetRangeEnd bool = false + var issetNameSpace bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetQuery = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetRangeStart = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetRangeEnd = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetNameSpace = true + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + case 7: + if err := p.ReadField7(iprot); err != nil { + return err + } + case 8: + if err := p.ReadField8(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetQuery { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Query is not set")) + } + if !issetRangeStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) + } + if !issetRangeEnd { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeEnd is not set")) + } + if !issetNameSpace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field NameSpace is not set")) + } + return nil +} + +func (p *QueryRequest) ReadField1(iprot thrift.TProtocol) error { + p.Query = &Query{} + if err := p.Query.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Query), err) + } + return nil +} + +func (p *QueryRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.RangeStart = v + } + return nil +} + +func (p *QueryRequest) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.RangeEnd = v + } + return nil +} + +func (p *QueryRequest) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.NameSpace = v + } + return nil +} + +func (p *QueryRequest) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.Limit = &v + } + return nil +} + +func (p *QueryRequest) ReadField6(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 6: ", err) + } else { + p.NoData = &v + } + return nil +} + +func (p *QueryRequest) ReadField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + temp := TimeType(v) + p.RangeType = temp + } + return nil +} + +func (p *QueryRequest) ReadField8(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 8: ", err) + } else { + temp := TimeType(v) + p.ResultTimeType = temp + } + return nil +} + +func (p *QueryRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("QueryRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + if err := p.writeField8(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *QueryRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("query", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:query: ", p), err) + } + if err := p.Query.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Query), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:query: ", p), err) + } + return err +} + +func (p *QueryRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:rangeStart: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:rangeStart: ", p), err) + } + return err +} + +func (p *QueryRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rangeEnd: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rangeEnd: ", p), err) + } + return err +} + +func (p *QueryRequest) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("nameSpace", thrift.STRING, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:nameSpace: ", p), err) + } + if err := oprot.WriteString(string(p.NameSpace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.nameSpace (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:nameSpace: ", p), err) + } + return err +} + +func (p *QueryRequest) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetLimit() { + if err := oprot.WriteFieldBegin("limit", thrift.I64, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:limit: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Limit)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.limit (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:limit: ", p), err) + } + } + return err +} + +func (p *QueryRequest) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetNoData() { + if err := oprot.WriteFieldBegin("noData", thrift.BOOL, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:noData: ", p), err) + } + if err := oprot.WriteBool(bool(*p.NoData)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.noData (6) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:noData: ", p), err) + } + } + return err +} + +func (p *QueryRequest) writeField7(oprot thrift.TProtocol) (err error) { + if p.IsSetRangeType() { + if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:rangeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.RangeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeType (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:rangeType: ", p), err) + } + } + return err +} + +func (p *QueryRequest) writeField8(oprot thrift.TProtocol) (err error) { + if p.IsSetResultTimeType() { + if err := oprot.WriteFieldBegin("resultTimeType", thrift.I32, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:resultTimeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.ResultTimeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.resultTimeType (8) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:resultTimeType: ", p), err) + } + } + return err +} + +func (p *QueryRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("QueryRequest(%+v)", *p) +} + +// Attributes: +// - Results +// - Exhaustive +type QueryResult_ struct { + Results []*QueryResultElement `thrift:"results,1,required" db:"results" json:"results"` + Exhaustive bool `thrift:"exhaustive,2,required" db:"exhaustive" json:"exhaustive"` +} + +func NewQueryResult_() *QueryResult_ { + return &QueryResult_{} +} + +func (p *QueryResult_) GetResults() []*QueryResultElement { + return p.Results +} + +func (p *QueryResult_) GetExhaustive() bool { + return p.Exhaustive +} +func (p *QueryResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetResults bool = false + var issetExhaustive bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetResults = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetExhaustive = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetResults { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Results is not set")) + } + if !issetExhaustive { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Exhaustive is not set")) + } + return nil +} + +func (p *QueryResult_) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*QueryResultElement, 0, size) + p.Results = tSlice + for i := 0; i < size; i++ { + _elem30 := &QueryResultElement{} + if err := _elem30.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem30), err) + } + p.Results = append(p.Results, _elem30) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *QueryResult_) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Exhaustive = v + } + return nil +} + +func (p *QueryResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("QueryResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *QueryResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("results", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:results: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Results)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Results { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:results: ", p), err) + } + return err +} + +func (p *QueryResult_) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("exhaustive", thrift.BOOL, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:exhaustive: ", p), err) + } + if err := oprot.WriteBool(bool(p.Exhaustive)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.exhaustive (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:exhaustive: ", p), err) + } + return err +} + +func (p *QueryResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("QueryResult_(%+v)", *p) +} + +// Attributes: +// - ID +// - Tags +// - Datapoints +type QueryResultElement struct { + ID string `thrift:"id,1,required" db:"id" json:"id"` + Tags []*Tag `thrift:"tags,2,required" db:"tags" json:"tags"` + Datapoints []*Datapoint `thrift:"datapoints,3,required" db:"datapoints" json:"datapoints"` +} + +func NewQueryResultElement() *QueryResultElement { + return &QueryResultElement{} +} + +func (p *QueryResultElement) GetID() string { + return p.ID +} + +func (p *QueryResultElement) GetTags() []*Tag { + return p.Tags +} + +func (p *QueryResultElement) GetDatapoints() []*Datapoint { + return p.Datapoints +} +func (p *QueryResultElement) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetID bool = false + var issetTags bool = false + var issetDatapoints bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetID = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetTags = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetDatapoints = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetID { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ID is not set")) + } + if !issetTags { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Tags is not set")) + } + if !issetDatapoints { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Datapoints is not set")) + } + return nil +} + +func (p *QueryResultElement) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *QueryResultElement) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Tag, 0, size) + p.Tags = tSlice + for i := 0; i < size; i++ { + _elem31 := &Tag{} + if err := _elem31.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem31), err) + } + p.Tags = append(p.Tags, _elem31) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *QueryResultElement) ReadField3(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Datapoint, 0, size) + p.Datapoints = tSlice + for i := 0; i < size; i++ { + _elem32 := &Datapoint{ + TimestampTimeType: 0, + } + if err := _elem32.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem32), err) + } + p.Datapoints = append(p.Datapoints, _elem32) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *QueryResultElement) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("QueryResultElement"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *QueryResultElement) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:id: ", p), err) + } + if err := oprot.WriteString(string(p.ID)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:id: ", p), err) + } + return err +} + +func (p *QueryResultElement) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("tags", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:tags: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Tags)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Tags { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:tags: ", p), err) + } + return err +} + +func (p *QueryResultElement) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("datapoints", thrift.LIST, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:datapoints: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Datapoints)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Datapoints { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:datapoints: ", p), err) + } + return err +} + +func (p *QueryResultElement) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("QueryResultElement(%+v)", *p) +} + +// Attributes: +// - Field +// - Term +type TermQuery struct { + Field string `thrift:"field,1,required" db:"field" json:"field"` + Term string `thrift:"term,2,required" db:"term" json:"term"` +} + +func NewTermQuery() *TermQuery { + return &TermQuery{} +} + +func (p *TermQuery) GetField() string { + return p.Field +} + +func (p *TermQuery) GetTerm() string { + return p.Term +} +func (p *TermQuery) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetField bool = false + var issetTerm bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetField = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetTerm = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetField { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Field is not set")) + } + if !issetTerm { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Term is not set")) + } + return nil +} + +func (p *TermQuery) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Field = v + } + return nil +} + +func (p *TermQuery) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Term = v + } + return nil +} + +func (p *TermQuery) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("TermQuery"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *TermQuery) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("field", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:field: ", p), err) + } + if err := oprot.WriteString(string(p.Field)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.field (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:field: ", p), err) + } + return err +} + +func (p *TermQuery) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("term", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:term: ", p), err) + } + if err := oprot.WriteString(string(p.Term)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.term (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:term: ", p), err) + } + return err +} + +func (p *TermQuery) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("TermQuery(%+v)", *p) +} + +// Attributes: +// - Field +// - Regexp +type RegexpQuery struct { + Field string `thrift:"field,1,required" db:"field" json:"field"` + Regexp string `thrift:"regexp,2,required" db:"regexp" json:"regexp"` +} + +func NewRegexpQuery() *RegexpQuery { + return &RegexpQuery{} +} + +func (p *RegexpQuery) GetField() string { + return p.Field +} + +func (p *RegexpQuery) GetRegexp() string { + return p.Regexp +} +func (p *RegexpQuery) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetField bool = false + var issetRegexp bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetField = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetRegexp = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetField { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Field is not set")) + } + if !issetRegexp { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Regexp is not set")) + } + return nil +} + +func (p *RegexpQuery) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Field = v + } + return nil +} + +func (p *RegexpQuery) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Regexp = v + } + return nil +} + +func (p *RegexpQuery) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("RegexpQuery"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *RegexpQuery) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("field", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:field: ", p), err) + } + if err := oprot.WriteString(string(p.Field)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.field (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:field: ", p), err) + } + return err +} + +func (p *RegexpQuery) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("regexp", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:regexp: ", p), err) + } + if err := oprot.WriteString(string(p.Regexp)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.regexp (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:regexp: ", p), err) + } + return err +} + +func (p *RegexpQuery) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("RegexpQuery(%+v)", *p) +} + +// Attributes: +// - Query +type NegationQuery struct { + Query *Query `thrift:"query,1,required" db:"query" json:"query"` +} + +func NewNegationQuery() *NegationQuery { + return &NegationQuery{} +} + +var NegationQuery_Query_DEFAULT *Query + +func (p *NegationQuery) GetQuery() *Query { + if !p.IsSetQuery() { + return NegationQuery_Query_DEFAULT + } + return p.Query +} +func (p *NegationQuery) IsSetQuery() bool { + return p.Query != nil +} + +func (p *NegationQuery) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetQuery bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetQuery = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetQuery { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Query is not set")) + } + return nil +} + +func (p *NegationQuery) ReadField1(iprot thrift.TProtocol) error { + p.Query = &Query{} + if err := p.Query.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Query), err) + } + return nil +} + +func (p *NegationQuery) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("NegationQuery"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NegationQuery) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("query", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:query: ", p), err) + } + if err := p.Query.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Query), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:query: ", p), err) + } + return err +} + +func (p *NegationQuery) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NegationQuery(%+v)", *p) +} + +// Attributes: +// - Queries +type ConjunctionQuery struct { + Queries []*Query `thrift:"queries,1,required" db:"queries" json:"queries"` +} + +func NewConjunctionQuery() *ConjunctionQuery { + return &ConjunctionQuery{} +} + +func (p *ConjunctionQuery) GetQueries() []*Query { + return p.Queries +} +func (p *ConjunctionQuery) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetQueries bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetQueries = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetQueries { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Queries is not set")) + } + return nil +} + +func (p *ConjunctionQuery) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Query, 0, size) + p.Queries = tSlice + for i := 0; i < size; i++ { + _elem33 := &Query{} + if err := _elem33.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem33), err) + } + p.Queries = append(p.Queries, _elem33) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *ConjunctionQuery) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("ConjunctionQuery"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ConjunctionQuery) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("queries", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:queries: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Queries)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Queries { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:queries: ", p), err) + } + return err +} + +func (p *ConjunctionQuery) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ConjunctionQuery(%+v)", *p) +} + +// Attributes: +// - Queries +type DisjunctionQuery struct { + Queries []*Query `thrift:"queries,1,required" db:"queries" json:"queries"` +} + +func NewDisjunctionQuery() *DisjunctionQuery { + return &DisjunctionQuery{} +} + +func (p *DisjunctionQuery) GetQueries() []*Query { + return p.Queries +} +func (p *DisjunctionQuery) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetQueries bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetQueries = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetQueries { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Queries is not set")) + } + return nil +} + +func (p *DisjunctionQuery) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Query, 0, size) + p.Queries = tSlice + for i := 0; i < size; i++ { + _elem34 := &Query{} + if err := _elem34.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem34), err) + } + p.Queries = append(p.Queries, _elem34) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *DisjunctionQuery) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("DisjunctionQuery"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *DisjunctionQuery) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("queries", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:queries: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Queries)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Queries { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:queries: ", p), err) + } + return err +} + +func (p *DisjunctionQuery) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("DisjunctionQuery(%+v)", *p) +} + +type AllQuery struct { +} + +func NewAllQuery() *AllQuery { + return &AllQuery{} +} + +func (p *AllQuery) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *AllQuery) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AllQuery"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AllQuery) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AllQuery(%+v)", *p) +} + +// Attributes: +// - Field +type FieldQuery struct { + Field string `thrift:"field,1,required" db:"field" json:"field"` +} + +func NewFieldQuery() *FieldQuery { + return &FieldQuery{} +} + +func (p *FieldQuery) GetField() string { + return p.Field +} +func (p *FieldQuery) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetField bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetField = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetField { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Field is not set")) + } + return nil +} + +func (p *FieldQuery) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Field = v + } + return nil +} + +func (p *FieldQuery) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("FieldQuery"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *FieldQuery) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("field", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:field: ", p), err) + } + if err := oprot.WriteString(string(p.Field)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.field (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:field: ", p), err) + } + return err +} + +func (p *FieldQuery) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("FieldQuery(%+v)", *p) +} + +// Attributes: +// - Term +// - Regexp +// - Negation +// - Conjunction +// - Disjunction +// - All +// - Field +type Query struct { + Term *TermQuery `thrift:"term,1" db:"term" json:"term,omitempty"` + Regexp *RegexpQuery `thrift:"regexp,2" db:"regexp" json:"regexp,omitempty"` + Negation *NegationQuery `thrift:"negation,3" db:"negation" json:"negation,omitempty"` + Conjunction *ConjunctionQuery `thrift:"conjunction,4" db:"conjunction" json:"conjunction,omitempty"` + Disjunction *DisjunctionQuery `thrift:"disjunction,5" db:"disjunction" json:"disjunction,omitempty"` + All *AllQuery `thrift:"all,6" db:"all" json:"all,omitempty"` + Field *FieldQuery `thrift:"field,7" db:"field" json:"field,omitempty"` +} + +func NewQuery() *Query { + return &Query{} +} + +var Query_Term_DEFAULT *TermQuery + +func (p *Query) GetTerm() *TermQuery { + if !p.IsSetTerm() { + return Query_Term_DEFAULT + } + return p.Term +} + +var Query_Regexp_DEFAULT *RegexpQuery + +func (p *Query) GetRegexp() *RegexpQuery { + if !p.IsSetRegexp() { + return Query_Regexp_DEFAULT + } + return p.Regexp +} + +var Query_Negation_DEFAULT *NegationQuery + +func (p *Query) GetNegation() *NegationQuery { + if !p.IsSetNegation() { + return Query_Negation_DEFAULT + } + return p.Negation +} + +var Query_Conjunction_DEFAULT *ConjunctionQuery + +func (p *Query) GetConjunction() *ConjunctionQuery { + if !p.IsSetConjunction() { + return Query_Conjunction_DEFAULT + } + return p.Conjunction +} + +var Query_Disjunction_DEFAULT *DisjunctionQuery + +func (p *Query) GetDisjunction() *DisjunctionQuery { + if !p.IsSetDisjunction() { + return Query_Disjunction_DEFAULT + } + return p.Disjunction +} + +var Query_All_DEFAULT *AllQuery + +func (p *Query) GetAll() *AllQuery { + if !p.IsSetAll() { + return Query_All_DEFAULT + } + return p.All +} + +var Query_Field_DEFAULT *FieldQuery + +func (p *Query) GetField() *FieldQuery { + if !p.IsSetField() { + return Query_Field_DEFAULT + } + return p.Field +} +func (p *Query) IsSetTerm() bool { + return p.Term != nil +} + +func (p *Query) IsSetRegexp() bool { + return p.Regexp != nil +} + +func (p *Query) IsSetNegation() bool { + return p.Negation != nil +} + +func (p *Query) IsSetConjunction() bool { + return p.Conjunction != nil +} + +func (p *Query) IsSetDisjunction() bool { + return p.Disjunction != nil +} + +func (p *Query) IsSetAll() bool { + return p.All != nil +} + +func (p *Query) IsSetField() bool { + return p.Field != nil +} + +func (p *Query) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + case 7: + if err := p.ReadField7(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *Query) ReadField1(iprot thrift.TProtocol) error { + p.Term = &TermQuery{} + if err := p.Term.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Term), err) + } + return nil +} + +func (p *Query) ReadField2(iprot thrift.TProtocol) error { + p.Regexp = &RegexpQuery{} + if err := p.Regexp.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Regexp), err) + } + return nil +} + +func (p *Query) ReadField3(iprot thrift.TProtocol) error { + p.Negation = &NegationQuery{} + if err := p.Negation.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Negation), err) + } + return nil +} + +func (p *Query) ReadField4(iprot thrift.TProtocol) error { + p.Conjunction = &ConjunctionQuery{} + if err := p.Conjunction.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Conjunction), err) + } + return nil +} + +func (p *Query) ReadField5(iprot thrift.TProtocol) error { + p.Disjunction = &DisjunctionQuery{} + if err := p.Disjunction.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Disjunction), err) + } + return nil +} + +func (p *Query) ReadField6(iprot thrift.TProtocol) error { + p.All = &AllQuery{} + if err := p.All.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.All), err) + } + return nil +} + +func (p *Query) ReadField7(iprot thrift.TProtocol) error { + p.Field = &FieldQuery{} + if err := p.Field.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Field), err) + } + return nil +} + +func (p *Query) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Query"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Query) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetTerm() { + if err := oprot.WriteFieldBegin("term", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:term: ", p), err) + } + if err := p.Term.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Term), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:term: ", p), err) + } + } + return err +} + +func (p *Query) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetRegexp() { + if err := oprot.WriteFieldBegin("regexp", thrift.STRUCT, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:regexp: ", p), err) + } + if err := p.Regexp.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Regexp), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:regexp: ", p), err) + } + } + return err +} + +func (p *Query) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetNegation() { + if err := oprot.WriteFieldBegin("negation", thrift.STRUCT, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:negation: ", p), err) + } + if err := p.Negation.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Negation), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:negation: ", p), err) + } + } + return err +} + +func (p *Query) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetConjunction() { + if err := oprot.WriteFieldBegin("conjunction", thrift.STRUCT, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:conjunction: ", p), err) + } + if err := p.Conjunction.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Conjunction), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:conjunction: ", p), err) + } + } + return err +} + +func (p *Query) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetDisjunction() { + if err := oprot.WriteFieldBegin("disjunction", thrift.STRUCT, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:disjunction: ", p), err) + } + if err := p.Disjunction.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Disjunction), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:disjunction: ", p), err) + } + } + return err +} + +func (p *Query) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetAll() { + if err := oprot.WriteFieldBegin("all", thrift.STRUCT, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:all: ", p), err) + } + if err := p.All.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.All), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:all: ", p), err) + } + } + return err +} + +func (p *Query) writeField7(oprot thrift.TProtocol) (err error) { + if p.IsSetField() { + if err := oprot.WriteFieldBegin("field", thrift.STRUCT, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:field: ", p), err) + } + if err := p.Field.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Field), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:field: ", p), err) + } + } + return err +} + +func (p *Query) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Query(%+v)", *p) +} + +// Attributes: +// - SourceNamespace +// - TargetNamespace +// - RangeStart +// - RangeEnd +// - Step +// - RemoveResets +// - RangeType +type AggregateTilesRequest struct { + SourceNamespace string `thrift:"sourceNamespace,1,required" db:"sourceNamespace" json:"sourceNamespace"` + TargetNamespace string `thrift:"targetNamespace,2,required" db:"targetNamespace" json:"targetNamespace"` + RangeStart int64 `thrift:"rangeStart,3,required" db:"rangeStart" json:"rangeStart"` + RangeEnd int64 `thrift:"rangeEnd,4,required" db:"rangeEnd" json:"rangeEnd"` + Step string `thrift:"step,5,required" db:"step" json:"step"` + RemoveResets bool `thrift:"removeResets,6" db:"removeResets" json:"removeResets"` + RangeType TimeType `thrift:"rangeType,7" db:"rangeType" json:"rangeType,omitempty"` +} + +func NewAggregateTilesRequest() *AggregateTilesRequest { + return &AggregateTilesRequest{ + RangeType: 0, + } +} + +func (p *AggregateTilesRequest) GetSourceNamespace() string { + return p.SourceNamespace +} + +func (p *AggregateTilesRequest) GetTargetNamespace() string { + return p.TargetNamespace +} + +func (p *AggregateTilesRequest) GetRangeStart() int64 { + return p.RangeStart +} + +func (p *AggregateTilesRequest) GetRangeEnd() int64 { + return p.RangeEnd +} + +func (p *AggregateTilesRequest) GetStep() string { + return p.Step +} + +func (p *AggregateTilesRequest) GetRemoveResets() bool { + return p.RemoveResets +} + +var AggregateTilesRequest_RangeType_DEFAULT TimeType = 0 + +func (p *AggregateTilesRequest) GetRangeType() TimeType { + return p.RangeType +} +func (p *AggregateTilesRequest) IsSetRangeType() bool { + return p.RangeType != AggregateTilesRequest_RangeType_DEFAULT +} + +func (p *AggregateTilesRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetSourceNamespace bool = false + var issetTargetNamespace bool = false + var issetRangeStart bool = false + var issetRangeEnd bool = false + var issetStep bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetSourceNamespace = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetTargetNamespace = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetRangeStart = true + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + issetRangeEnd = true + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + issetStep = true + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + case 7: + if err := p.ReadField7(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetSourceNamespace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SourceNamespace is not set")) + } + if !issetTargetNamespace { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TargetNamespace is not set")) + } + if !issetRangeStart { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeStart is not set")) + } + if !issetRangeEnd { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RangeEnd is not set")) + } + if !issetStep { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Step is not set")) + } + return nil +} + +func (p *AggregateTilesRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.SourceNamespace = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.TargetNamespace = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.RangeStart = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.RangeEnd = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.Step = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField6(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 6: ", err) + } else { + p.RemoveResets = v + } + return nil +} + +func (p *AggregateTilesRequest) ReadField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + temp := TimeType(v) + p.RangeType = temp + } + return nil +} + +func (p *AggregateTilesRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateTilesRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateTilesRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("sourceNamespace", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sourceNamespace: ", p), err) + } + if err := oprot.WriteString(string(p.SourceNamespace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.sourceNamespace (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sourceNamespace: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("targetNamespace", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:targetNamespace: ", p), err) + } + if err := oprot.WriteString(string(p.TargetNamespace)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.targetNamespace (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:targetNamespace: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeStart", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rangeStart: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeStart)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeStart (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rangeStart: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("rangeEnd", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:rangeEnd: ", p), err) + } + if err := oprot.WriteI64(int64(p.RangeEnd)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeEnd (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:rangeEnd: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField5(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("step", thrift.STRING, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:step: ", p), err) + } + if err := oprot.WriteString(string(p.Step)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.step (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:step: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField6(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("removeResets", thrift.BOOL, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:removeResets: ", p), err) + } + if err := oprot.WriteBool(bool(p.RemoveResets)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.removeResets (6) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:removeResets: ", p), err) + } + return err +} + +func (p *AggregateTilesRequest) writeField7(oprot thrift.TProtocol) (err error) { + if p.IsSetRangeType() { + if err := oprot.WriteFieldBegin("rangeType", thrift.I32, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:rangeType: ", p), err) + } + if err := oprot.WriteI32(int32(p.RangeType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.rangeType (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:rangeType: ", p), err) + } + } + return err +} + +func (p *AggregateTilesRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateTilesRequest(%+v)", *p) +} + +// Attributes: +// - ProcessedTileCount +type AggregateTilesResult_ struct { + ProcessedTileCount int64 `thrift:"processedTileCount,1,required" db:"processedTileCount" json:"processedTileCount"` +} + +func NewAggregateTilesResult_() *AggregateTilesResult_ { + return &AggregateTilesResult_{} +} + +func (p *AggregateTilesResult_) GetProcessedTileCount() int64 { + return p.ProcessedTileCount +} +func (p *AggregateTilesResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetProcessedTileCount bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetProcessedTileCount = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetProcessedTileCount { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ProcessedTileCount is not set")) + } + return nil +} + +func (p *AggregateTilesResult_) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ProcessedTileCount = v + } + return nil +} + +func (p *AggregateTilesResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("AggregateTilesResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AggregateTilesResult_) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("processedTileCount", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:processedTileCount: ", p), err) + } + if err := oprot.WriteI64(int64(p.ProcessedTileCount)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.processedTileCount (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:processedTileCount: ", p), err) + } + return err +} + +func (p *AggregateTilesResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AggregateTilesResult_(%+v)", *p) +} + +// Attributes: +// - Name +// - FilePathTemplate +// - Interval +// - Duration +// - Debug +// - ConditionalNumGoroutinesGreaterThan +// - ConditionalNumGoroutinesLessThan +// - ConditionalIsOverloaded +type DebugProfileStartRequest struct { + Name string `thrift:"name,1,required" db:"name" json:"name"` + FilePathTemplate string `thrift:"filePathTemplate,2,required" db:"filePathTemplate" json:"filePathTemplate"` + Interval *string `thrift:"interval,3" db:"interval" json:"interval,omitempty"` + Duration *string `thrift:"duration,4" db:"duration" json:"duration,omitempty"` + Debug *int64 `thrift:"debug,5" db:"debug" json:"debug,omitempty"` + ConditionalNumGoroutinesGreaterThan *int64 `thrift:"conditionalNumGoroutinesGreaterThan,6" db:"conditionalNumGoroutinesGreaterThan" json:"conditionalNumGoroutinesGreaterThan,omitempty"` + ConditionalNumGoroutinesLessThan *int64 `thrift:"conditionalNumGoroutinesLessThan,7" db:"conditionalNumGoroutinesLessThan" json:"conditionalNumGoroutinesLessThan,omitempty"` + ConditionalIsOverloaded *bool `thrift:"conditionalIsOverloaded,8" db:"conditionalIsOverloaded" json:"conditionalIsOverloaded,omitempty"` +} + +func NewDebugProfileStartRequest() *DebugProfileStartRequest { + return &DebugProfileStartRequest{} +} + +func (p *DebugProfileStartRequest) GetName() string { + return p.Name +} + +func (p *DebugProfileStartRequest) GetFilePathTemplate() string { + return p.FilePathTemplate +} + +var DebugProfileStartRequest_Interval_DEFAULT string + +func (p *DebugProfileStartRequest) GetInterval() string { + if !p.IsSetInterval() { + return DebugProfileStartRequest_Interval_DEFAULT + } + return *p.Interval +} + +var DebugProfileStartRequest_Duration_DEFAULT string + +func (p *DebugProfileStartRequest) GetDuration() string { + if !p.IsSetDuration() { + return DebugProfileStartRequest_Duration_DEFAULT + } + return *p.Duration +} + +var DebugProfileStartRequest_Debug_DEFAULT int64 + +func (p *DebugProfileStartRequest) GetDebug() int64 { + if !p.IsSetDebug() { + return DebugProfileStartRequest_Debug_DEFAULT + } + return *p.Debug +} + +var DebugProfileStartRequest_ConditionalNumGoroutinesGreaterThan_DEFAULT int64 + +func (p *DebugProfileStartRequest) GetConditionalNumGoroutinesGreaterThan() int64 { + if !p.IsSetConditionalNumGoroutinesGreaterThan() { + return DebugProfileStartRequest_ConditionalNumGoroutinesGreaterThan_DEFAULT + } + return *p.ConditionalNumGoroutinesGreaterThan +} + +var DebugProfileStartRequest_ConditionalNumGoroutinesLessThan_DEFAULT int64 + +func (p *DebugProfileStartRequest) GetConditionalNumGoroutinesLessThan() int64 { + if !p.IsSetConditionalNumGoroutinesLessThan() { + return DebugProfileStartRequest_ConditionalNumGoroutinesLessThan_DEFAULT + } + return *p.ConditionalNumGoroutinesLessThan +} + +var DebugProfileStartRequest_ConditionalIsOverloaded_DEFAULT bool + +func (p *DebugProfileStartRequest) GetConditionalIsOverloaded() bool { + if !p.IsSetConditionalIsOverloaded() { + return DebugProfileStartRequest_ConditionalIsOverloaded_DEFAULT + } + return *p.ConditionalIsOverloaded +} +func (p *DebugProfileStartRequest) IsSetInterval() bool { + return p.Interval != nil +} + +func (p *DebugProfileStartRequest) IsSetDuration() bool { + return p.Duration != nil +} + +func (p *DebugProfileStartRequest) IsSetDebug() bool { + return p.Debug != nil +} + +func (p *DebugProfileStartRequest) IsSetConditionalNumGoroutinesGreaterThan() bool { + return p.ConditionalNumGoroutinesGreaterThan != nil +} + +func (p *DebugProfileStartRequest) IsSetConditionalNumGoroutinesLessThan() bool { + return p.ConditionalNumGoroutinesLessThan != nil +} + +func (p *DebugProfileStartRequest) IsSetConditionalIsOverloaded() bool { + return p.ConditionalIsOverloaded != nil +} + +func (p *DebugProfileStartRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetName bool = false + var issetFilePathTemplate bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetName = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetFilePathTemplate = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + case 5: + if err := p.ReadField5(iprot); err != nil { + return err + } + case 6: + if err := p.ReadField6(iprot); err != nil { + return err + } + case 7: + if err := p.ReadField7(iprot); err != nil { + return err + } + case 8: + if err := p.ReadField8(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetName { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Name is not set")) + } + if !issetFilePathTemplate { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field FilePathTemplate is not set")) + } + return nil +} + +func (p *DebugProfileStartRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Name = v + } + return nil +} + +func (p *DebugProfileStartRequest) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.FilePathTemplate = v + } + return nil +} + +func (p *DebugProfileStartRequest) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.Interval = &v + } + return nil +} + +func (p *DebugProfileStartRequest) ReadField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.Duration = &v + } + return nil +} + +func (p *DebugProfileStartRequest) ReadField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.Debug = &v + } + return nil +} + +func (p *DebugProfileStartRequest) ReadField6(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 6: ", err) + } else { + p.ConditionalNumGoroutinesGreaterThan = &v + } + return nil +} + +func (p *DebugProfileStartRequest) ReadField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + p.ConditionalNumGoroutinesLessThan = &v + } + return nil +} + +func (p *DebugProfileStartRequest) ReadField8(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 8: ", err) + } else { + p.ConditionalIsOverloaded = &v + } + return nil +} + +func (p *DebugProfileStartRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("DebugProfileStartRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + if err := p.writeField8(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *DebugProfileStartRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("name", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:name: ", p), err) + } + if err := oprot.WriteString(string(p.Name)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.name (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:name: ", p), err) + } + return err +} + +func (p *DebugProfileStartRequest) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("filePathTemplate", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:filePathTemplate: ", p), err) + } + if err := oprot.WriteString(string(p.FilePathTemplate)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.filePathTemplate (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:filePathTemplate: ", p), err) + } + return err +} + +func (p *DebugProfileStartRequest) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetInterval() { + if err := oprot.WriteFieldBegin("interval", thrift.STRING, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:interval: ", p), err) + } + if err := oprot.WriteString(string(*p.Interval)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.interval (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:interval: ", p), err) + } + } + return err +} + +func (p *DebugProfileStartRequest) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetDuration() { + if err := oprot.WriteFieldBegin("duration", thrift.STRING, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:duration: ", p), err) + } + if err := oprot.WriteString(string(*p.Duration)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.duration (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:duration: ", p), err) + } + } + return err +} + +func (p *DebugProfileStartRequest) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetDebug() { + if err := oprot.WriteFieldBegin("debug", thrift.I64, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:debug: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Debug)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.debug (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:debug: ", p), err) + } + } + return err +} + +func (p *DebugProfileStartRequest) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetConditionalNumGoroutinesGreaterThan() { + if err := oprot.WriteFieldBegin("conditionalNumGoroutinesGreaterThan", thrift.I64, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:conditionalNumGoroutinesGreaterThan: ", p), err) + } + if err := oprot.WriteI64(int64(*p.ConditionalNumGoroutinesGreaterThan)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.conditionalNumGoroutinesGreaterThan (6) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:conditionalNumGoroutinesGreaterThan: ", p), err) + } + } + return err +} + +func (p *DebugProfileStartRequest) writeField7(oprot thrift.TProtocol) (err error) { + if p.IsSetConditionalNumGoroutinesLessThan() { + if err := oprot.WriteFieldBegin("conditionalNumGoroutinesLessThan", thrift.I64, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:conditionalNumGoroutinesLessThan: ", p), err) + } + if err := oprot.WriteI64(int64(*p.ConditionalNumGoroutinesLessThan)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.conditionalNumGoroutinesLessThan (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:conditionalNumGoroutinesLessThan: ", p), err) + } + } + return err +} + +func (p *DebugProfileStartRequest) writeField8(oprot thrift.TProtocol) (err error) { + if p.IsSetConditionalIsOverloaded() { + if err := oprot.WriteFieldBegin("conditionalIsOverloaded", thrift.BOOL, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:conditionalIsOverloaded: ", p), err) + } + if err := oprot.WriteBool(bool(*p.ConditionalIsOverloaded)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.conditionalIsOverloaded (8) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:conditionalIsOverloaded: ", p), err) + } + } + return err +} + +func (p *DebugProfileStartRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("DebugProfileStartRequest(%+v)", *p) +} + +type DebugProfileStartResult_ struct { +} + +func NewDebugProfileStartResult_() *DebugProfileStartResult_ { + return &DebugProfileStartResult_{} +} + +func (p *DebugProfileStartResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *DebugProfileStartResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("DebugProfileStartResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *DebugProfileStartResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("DebugProfileStartResult_(%+v)", *p) +} + +// Attributes: +// - Name +type DebugProfileStopRequest struct { + Name string `thrift:"name,1,required" db:"name" json:"name"` +} + +func NewDebugProfileStopRequest() *DebugProfileStopRequest { + return &DebugProfileStopRequest{} +} + +func (p *DebugProfileStopRequest) GetName() string { + return p.Name +} +func (p *DebugProfileStopRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetName bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetName = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetName { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Name is not set")) + } + return nil +} + +func (p *DebugProfileStopRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Name = v + } + return nil +} + +func (p *DebugProfileStopRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("DebugProfileStopRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *DebugProfileStopRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("name", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:name: ", p), err) + } + if err := oprot.WriteString(string(p.Name)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.name (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:name: ", p), err) + } + return err +} + +func (p *DebugProfileStopRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("DebugProfileStopRequest(%+v)", *p) +} + +type DebugProfileStopResult_ struct { +} + +func NewDebugProfileStopResult_() *DebugProfileStopResult_ { + return &DebugProfileStopResult_{} +} + +func (p *DebugProfileStopResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *DebugProfileStopResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("DebugProfileStopResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *DebugProfileStopResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("DebugProfileStopResult_(%+v)", *p) +} + +// Attributes: +// - Directory +type DebugIndexMemorySegmentsRequest struct { + Directory string `thrift:"directory,1,required" db:"directory" json:"directory"` +} + +func NewDebugIndexMemorySegmentsRequest() *DebugIndexMemorySegmentsRequest { + return &DebugIndexMemorySegmentsRequest{} +} + +func (p *DebugIndexMemorySegmentsRequest) GetDirectory() string { + return p.Directory +} +func (p *DebugIndexMemorySegmentsRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetDirectory bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetDirectory = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetDirectory { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Directory is not set")) + } + return nil +} + +func (p *DebugIndexMemorySegmentsRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Directory = v + } + return nil +} + +func (p *DebugIndexMemorySegmentsRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("DebugIndexMemorySegmentsRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *DebugIndexMemorySegmentsRequest) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("directory", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:directory: ", p), err) + } + if err := oprot.WriteString(string(p.Directory)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.directory (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:directory: ", p), err) + } + return err +} + +func (p *DebugIndexMemorySegmentsRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("DebugIndexMemorySegmentsRequest(%+v)", *p) +} + +type DebugIndexMemorySegmentsResult_ struct { +} + +func NewDebugIndexMemorySegmentsResult_() *DebugIndexMemorySegmentsResult_ { + return &DebugIndexMemorySegmentsResult_{} +} + +func (p *DebugIndexMemorySegmentsResult_) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *DebugIndexMemorySegmentsResult_) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("DebugIndexMemorySegmentsResult"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *DebugIndexMemorySegmentsResult_) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("DebugIndexMemorySegmentsResult_(%+v)", *p) +} + +type Node interface { + // Parameters: + // - Req + Query(req *QueryRequest) (r *QueryResult_, err error) + // Parameters: + // - Req + Aggregate(req *AggregateQueryRequest) (r *AggregateQueryResult_, err error) + // Parameters: + // - Req + Fetch(req *FetchRequest) (r *FetchResult_, err error) + // Parameters: + // - Req + Write(req *WriteRequest) (err error) + // Parameters: + // - Req + WriteTagged(req *WriteTaggedRequest) (err error) + // Parameters: + // - Req + FetchBatchRaw(req *FetchBatchRawRequest) (r *FetchBatchRawResult_, err error) + // Parameters: + // - Req + FetchBatchRawV2(req *FetchBatchRawV2Request) (r *FetchBatchRawResult_, err error) + // Parameters: + // - Req + FetchBlocksRaw(req *FetchBlocksRawRequest) (r *FetchBlocksRawResult_, err error) + // Parameters: + // - Req + FetchTagged(req *FetchTaggedRequest) (r *FetchTaggedResult_, err error) + // Parameters: + // - Req + AggregateRaw(req *AggregateQueryRawRequest) (r *AggregateQueryRawResult_, err error) + // Parameters: + // - Req + FetchBlocksMetadataRawV2(req *FetchBlocksMetadataRawV2Request) (r *FetchBlocksMetadataRawV2Result_, err error) + // Parameters: + // - Req + WriteBatchRaw(req *WriteBatchRawRequest) (err error) + // Parameters: + // - Req + WriteBatchRawV2(req *WriteBatchRawV2Request) (err error) + // Parameters: + // - Req + WriteTaggedBatchRaw(req *WriteTaggedBatchRawRequest) (err error) + // Parameters: + // - Req + WriteTaggedBatchRawV2(req *WriteTaggedBatchRawV2Request) (err error) + Repair() (err error) + // Parameters: + // - Req + Truncate(req *TruncateRequest) (r *TruncateResult_, err error) + // Parameters: + // - Req + AggregateTiles(req *AggregateTilesRequest) (r *AggregateTilesResult_, err error) + Health() (r *NodeHealthResult_, err error) + Bootstrapped() (r *NodeBootstrappedResult_, err error) + BootstrappedInPlacementOrNoPlacement() (r *NodeBootstrappedInPlacementOrNoPlacementResult_, err error) + GetPersistRateLimit() (r *NodePersistRateLimitResult_, err error) + // Parameters: + // - Req + SetPersistRateLimit(req *NodeSetPersistRateLimitRequest) (r *NodePersistRateLimitResult_, err error) + GetWriteNewSeriesAsync() (r *NodeWriteNewSeriesAsyncResult_, err error) + // Parameters: + // - Req + SetWriteNewSeriesAsync(req *NodeSetWriteNewSeriesAsyncRequest) (r *NodeWriteNewSeriesAsyncResult_, err error) + GetWriteNewSeriesBackoffDuration() (r *NodeWriteNewSeriesBackoffDurationResult_, err error) + // Parameters: + // - Req + SetWriteNewSeriesBackoffDuration(req *NodeSetWriteNewSeriesBackoffDurationRequest) (r *NodeWriteNewSeriesBackoffDurationResult_, err error) + GetWriteNewSeriesLimitPerShardPerSecond() (r *NodeWriteNewSeriesLimitPerShardPerSecondResult_, err error) + // Parameters: + // - Req + SetWriteNewSeriesLimitPerShardPerSecond(req *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) (r *NodeWriteNewSeriesLimitPerShardPerSecondResult_, err error) + // Parameters: + // - Req + DebugProfileStart(req *DebugProfileStartRequest) (r *DebugProfileStartResult_, err error) + // Parameters: + // - Req + DebugProfileStop(req *DebugProfileStopRequest) (r *DebugProfileStopResult_, err error) + // Parameters: + // - Req + DebugIndexMemorySegments(req *DebugIndexMemorySegmentsRequest) (r *DebugIndexMemorySegmentsResult_, err error) +} + +type NodeClient struct { + Transport thrift.TTransport + ProtocolFactory thrift.TProtocolFactory + InputProtocol thrift.TProtocol + OutputProtocol thrift.TProtocol + SeqId int32 +} + +func NewNodeClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *NodeClient { + return &NodeClient{Transport: t, + ProtocolFactory: f, + InputProtocol: f.GetProtocol(t), + OutputProtocol: f.GetProtocol(t), + SeqId: 0, + } +} + +func NewNodeClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *NodeClient { + return &NodeClient{Transport: t, + ProtocolFactory: nil, + InputProtocol: iprot, + OutputProtocol: oprot, + SeqId: 0, + } +} + +// Parameters: +// - Req +func (p *NodeClient) Query(req *QueryRequest) (r *QueryResult_, err error) { + if err = p.sendQuery(req); err != nil { + return + } + return p.recvQuery() +} + +func (p *NodeClient) sendQuery(req *QueryRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("query", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeQueryArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvQuery() (value *QueryResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "query" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "query failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "query failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error35 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error36 error + error36, err = error35.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error36 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "query failed: invalid message type") + return + } + result := NodeQueryResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) Aggregate(req *AggregateQueryRequest) (r *AggregateQueryResult_, err error) { + if err = p.sendAggregate(req); err != nil { + return + } + return p.recvAggregate() +} + +func (p *NodeClient) sendAggregate(req *AggregateQueryRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("aggregate", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeAggregateArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvAggregate() (value *AggregateQueryResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "aggregate" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "aggregate failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "aggregate failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error37 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error38 error + error38, err = error37.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error38 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "aggregate failed: invalid message type") + return + } + result := NodeAggregateResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) Fetch(req *FetchRequest) (r *FetchResult_, err error) { + if err = p.sendFetch(req); err != nil { + return + } + return p.recvFetch() +} + +func (p *NodeClient) sendFetch(req *FetchRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("fetch", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeFetchArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvFetch() (value *FetchResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "fetch" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "fetch failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "fetch failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error39 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error40 error + error40, err = error39.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error40 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "fetch failed: invalid message type") + return + } + result := NodeFetchResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) Write(req *WriteRequest) (err error) { + if err = p.sendWrite(req); err != nil { + return + } + return p.recvWrite() +} + +func (p *NodeClient) sendWrite(req *WriteRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("write", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeWriteArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvWrite() (err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "write" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "write failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "write failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error41 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error42 error + error42, err = error41.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error42 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "write failed: invalid message type") + return + } + result := NodeWriteResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + return +} + +// Parameters: +// - Req +func (p *NodeClient) WriteTagged(req *WriteTaggedRequest) (err error) { + if err = p.sendWriteTagged(req); err != nil { + return + } + return p.recvWriteTagged() +} + +func (p *NodeClient) sendWriteTagged(req *WriteTaggedRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("writeTagged", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeWriteTaggedArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvWriteTagged() (err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "writeTagged" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "writeTagged failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "writeTagged failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error43 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error44 error + error44, err = error43.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error44 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "writeTagged failed: invalid message type") + return + } + result := NodeWriteTaggedResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + return +} + +// Parameters: +// - Req +func (p *NodeClient) FetchBatchRaw(req *FetchBatchRawRequest) (r *FetchBatchRawResult_, err error) { + if err = p.sendFetchBatchRaw(req); err != nil { + return + } + return p.recvFetchBatchRaw() +} + +func (p *NodeClient) sendFetchBatchRaw(req *FetchBatchRawRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("fetchBatchRaw", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeFetchBatchRawArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvFetchBatchRaw() (value *FetchBatchRawResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "fetchBatchRaw" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "fetchBatchRaw failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "fetchBatchRaw failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error45 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error46 error + error46, err = error45.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error46 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "fetchBatchRaw failed: invalid message type") + return + } + result := NodeFetchBatchRawResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) FetchBatchRawV2(req *FetchBatchRawV2Request) (r *FetchBatchRawResult_, err error) { + if err = p.sendFetchBatchRawV2(req); err != nil { + return + } + return p.recvFetchBatchRawV2() +} + +func (p *NodeClient) sendFetchBatchRawV2(req *FetchBatchRawV2Request) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("fetchBatchRawV2", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeFetchBatchRawV2Args{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvFetchBatchRawV2() (value *FetchBatchRawResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "fetchBatchRawV2" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "fetchBatchRawV2 failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "fetchBatchRawV2 failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error47 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error48 error + error48, err = error47.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error48 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "fetchBatchRawV2 failed: invalid message type") + return + } + result := NodeFetchBatchRawV2Result{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) FetchBlocksRaw(req *FetchBlocksRawRequest) (r *FetchBlocksRawResult_, err error) { + if err = p.sendFetchBlocksRaw(req); err != nil { + return + } + return p.recvFetchBlocksRaw() +} + +func (p *NodeClient) sendFetchBlocksRaw(req *FetchBlocksRawRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("fetchBlocksRaw", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeFetchBlocksRawArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvFetchBlocksRaw() (value *FetchBlocksRawResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "fetchBlocksRaw" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "fetchBlocksRaw failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "fetchBlocksRaw failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error49 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error50 error + error50, err = error49.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error50 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "fetchBlocksRaw failed: invalid message type") + return + } + result := NodeFetchBlocksRawResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) FetchTagged(req *FetchTaggedRequest) (r *FetchTaggedResult_, err error) { + if err = p.sendFetchTagged(req); err != nil { + return + } + return p.recvFetchTagged() +} + +func (p *NodeClient) sendFetchTagged(req *FetchTaggedRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("fetchTagged", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeFetchTaggedArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvFetchTagged() (value *FetchTaggedResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "fetchTagged" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "fetchTagged failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "fetchTagged failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error51 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error52 error + error52, err = error51.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error52 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "fetchTagged failed: invalid message type") + return + } + result := NodeFetchTaggedResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) AggregateRaw(req *AggregateQueryRawRequest) (r *AggregateQueryRawResult_, err error) { + if err = p.sendAggregateRaw(req); err != nil { + return + } + return p.recvAggregateRaw() +} + +func (p *NodeClient) sendAggregateRaw(req *AggregateQueryRawRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("aggregateRaw", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeAggregateRawArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvAggregateRaw() (value *AggregateQueryRawResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "aggregateRaw" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "aggregateRaw failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "aggregateRaw failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error53 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error54 error + error54, err = error53.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error54 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "aggregateRaw failed: invalid message type") + return + } + result := NodeAggregateRawResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) FetchBlocksMetadataRawV2(req *FetchBlocksMetadataRawV2Request) (r *FetchBlocksMetadataRawV2Result_, err error) { + if err = p.sendFetchBlocksMetadataRawV2(req); err != nil { + return + } + return p.recvFetchBlocksMetadataRawV2() +} + +func (p *NodeClient) sendFetchBlocksMetadataRawV2(req *FetchBlocksMetadataRawV2Request) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("fetchBlocksMetadataRawV2", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeFetchBlocksMetadataRawV2Args{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvFetchBlocksMetadataRawV2() (value *FetchBlocksMetadataRawV2Result_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "fetchBlocksMetadataRawV2" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "fetchBlocksMetadataRawV2 failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "fetchBlocksMetadataRawV2 failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error55 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error56 error + error56, err = error55.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error56 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "fetchBlocksMetadataRawV2 failed: invalid message type") + return + } + result := NodeFetchBlocksMetadataRawV2Result{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) WriteBatchRaw(req *WriteBatchRawRequest) (err error) { + if err = p.sendWriteBatchRaw(req); err != nil { + return + } + return p.recvWriteBatchRaw() +} + +func (p *NodeClient) sendWriteBatchRaw(req *WriteBatchRawRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("writeBatchRaw", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeWriteBatchRawArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvWriteBatchRaw() (err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "writeBatchRaw" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "writeBatchRaw failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "writeBatchRaw failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error57 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error58 error + error58, err = error57.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error58 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "writeBatchRaw failed: invalid message type") + return + } + result := NodeWriteBatchRawResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + return +} + +// Parameters: +// - Req +func (p *NodeClient) WriteBatchRawV2(req *WriteBatchRawV2Request) (err error) { + if err = p.sendWriteBatchRawV2(req); err != nil { + return + } + return p.recvWriteBatchRawV2() +} + +func (p *NodeClient) sendWriteBatchRawV2(req *WriteBatchRawV2Request) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("writeBatchRawV2", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeWriteBatchRawV2Args{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvWriteBatchRawV2() (err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "writeBatchRawV2" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "writeBatchRawV2 failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "writeBatchRawV2 failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error59 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error60 error + error60, err = error59.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error60 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "writeBatchRawV2 failed: invalid message type") + return + } + result := NodeWriteBatchRawV2Result{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + return +} + +// Parameters: +// - Req +func (p *NodeClient) WriteTaggedBatchRaw(req *WriteTaggedBatchRawRequest) (err error) { + if err = p.sendWriteTaggedBatchRaw(req); err != nil { + return + } + return p.recvWriteTaggedBatchRaw() +} + +func (p *NodeClient) sendWriteTaggedBatchRaw(req *WriteTaggedBatchRawRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("writeTaggedBatchRaw", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeWriteTaggedBatchRawArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvWriteTaggedBatchRaw() (err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "writeTaggedBatchRaw" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "writeTaggedBatchRaw failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "writeTaggedBatchRaw failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error61 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error62 error + error62, err = error61.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error62 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "writeTaggedBatchRaw failed: invalid message type") + return + } + result := NodeWriteTaggedBatchRawResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + return +} + +// Parameters: +// - Req +func (p *NodeClient) WriteTaggedBatchRawV2(req *WriteTaggedBatchRawV2Request) (err error) { + if err = p.sendWriteTaggedBatchRawV2(req); err != nil { + return + } + return p.recvWriteTaggedBatchRawV2() +} + +func (p *NodeClient) sendWriteTaggedBatchRawV2(req *WriteTaggedBatchRawV2Request) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("writeTaggedBatchRawV2", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeWriteTaggedBatchRawV2Args{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvWriteTaggedBatchRawV2() (err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "writeTaggedBatchRawV2" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "writeTaggedBatchRawV2 failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "writeTaggedBatchRawV2 failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error63 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error64 error + error64, err = error63.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error64 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "writeTaggedBatchRawV2 failed: invalid message type") + return + } + result := NodeWriteTaggedBatchRawV2Result{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + return +} + +func (p *NodeClient) Repair() (err error) { + if err = p.sendRepair(); err != nil { + return + } + return p.recvRepair() +} + +func (p *NodeClient) sendRepair() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("repair", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeRepairArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvRepair() (err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "repair" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "repair failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "repair failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error65 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error66 error + error66, err = error65.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error66 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "repair failed: invalid message type") + return + } + result := NodeRepairResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + return +} + +// Parameters: +// - Req +func (p *NodeClient) Truncate(req *TruncateRequest) (r *TruncateResult_, err error) { + if err = p.sendTruncate(req); err != nil { + return + } + return p.recvTruncate() +} + +func (p *NodeClient) sendTruncate(req *TruncateRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("truncate", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeTruncateArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvTruncate() (value *TruncateResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "truncate" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "truncate failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "truncate failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error67 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error68 error + error68, err = error67.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error68 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "truncate failed: invalid message type") + return + } + result := NodeTruncateResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) AggregateTiles(req *AggregateTilesRequest) (r *AggregateTilesResult_, err error) { + if err = p.sendAggregateTiles(req); err != nil { + return + } + return p.recvAggregateTiles() +} + +func (p *NodeClient) sendAggregateTiles(req *AggregateTilesRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("aggregateTiles", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeAggregateTilesArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvAggregateTiles() (value *AggregateTilesResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "aggregateTiles" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "aggregateTiles failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "aggregateTiles failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error69 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error70 error + error70, err = error69.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error70 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "aggregateTiles failed: invalid message type") + return + } + result := NodeAggregateTilesResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +func (p *NodeClient) Health() (r *NodeHealthResult_, err error) { + if err = p.sendHealth(); err != nil { + return + } + return p.recvHealth() +} + +func (p *NodeClient) sendHealth() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("health", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeHealthArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvHealth() (value *NodeHealthResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "health" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "health failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "health failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error71 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error72 error + error72, err = error71.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error72 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "health failed: invalid message type") + return + } + result := NodeHealthResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +func (p *NodeClient) Bootstrapped() (r *NodeBootstrappedResult_, err error) { + if err = p.sendBootstrapped(); err != nil { + return + } + return p.recvBootstrapped() +} + +func (p *NodeClient) sendBootstrapped() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("bootstrapped", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeBootstrappedArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvBootstrapped() (value *NodeBootstrappedResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "bootstrapped" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "bootstrapped failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "bootstrapped failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error73 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error74 error + error74, err = error73.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error74 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "bootstrapped failed: invalid message type") + return + } + result := NodeBootstrappedResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +func (p *NodeClient) BootstrappedInPlacementOrNoPlacement() (r *NodeBootstrappedInPlacementOrNoPlacementResult_, err error) { + if err = p.sendBootstrappedInPlacementOrNoPlacement(); err != nil { + return + } + return p.recvBootstrappedInPlacementOrNoPlacement() +} + +func (p *NodeClient) sendBootstrappedInPlacementOrNoPlacement() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("bootstrappedInPlacementOrNoPlacement", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeBootstrappedInPlacementOrNoPlacementArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvBootstrappedInPlacementOrNoPlacement() (value *NodeBootstrappedInPlacementOrNoPlacementResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "bootstrappedInPlacementOrNoPlacement" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "bootstrappedInPlacementOrNoPlacement failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "bootstrappedInPlacementOrNoPlacement failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error75 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error76 error + error76, err = error75.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error76 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "bootstrappedInPlacementOrNoPlacement failed: invalid message type") + return + } + result := NodeBootstrappedInPlacementOrNoPlacementResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +func (p *NodeClient) GetPersistRateLimit() (r *NodePersistRateLimitResult_, err error) { + if err = p.sendGetPersistRateLimit(); err != nil { + return + } + return p.recvGetPersistRateLimit() +} + +func (p *NodeClient) sendGetPersistRateLimit() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("getPersistRateLimit", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeGetPersistRateLimitArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvGetPersistRateLimit() (value *NodePersistRateLimitResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "getPersistRateLimit" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "getPersistRateLimit failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "getPersistRateLimit failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error77 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error78 error + error78, err = error77.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error78 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "getPersistRateLimit failed: invalid message type") + return + } + result := NodeGetPersistRateLimitResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) SetPersistRateLimit(req *NodeSetPersistRateLimitRequest) (r *NodePersistRateLimitResult_, err error) { + if err = p.sendSetPersistRateLimit(req); err != nil { + return + } + return p.recvSetPersistRateLimit() +} + +func (p *NodeClient) sendSetPersistRateLimit(req *NodeSetPersistRateLimitRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("setPersistRateLimit", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeSetPersistRateLimitArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvSetPersistRateLimit() (value *NodePersistRateLimitResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "setPersistRateLimit" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "setPersistRateLimit failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "setPersistRateLimit failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error79 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error80 error + error80, err = error79.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error80 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "setPersistRateLimit failed: invalid message type") + return + } + result := NodeSetPersistRateLimitResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +func (p *NodeClient) GetWriteNewSeriesAsync() (r *NodeWriteNewSeriesAsyncResult_, err error) { + if err = p.sendGetWriteNewSeriesAsync(); err != nil { + return + } + return p.recvGetWriteNewSeriesAsync() +} + +func (p *NodeClient) sendGetWriteNewSeriesAsync() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("getWriteNewSeriesAsync", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeGetWriteNewSeriesAsyncArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvGetWriteNewSeriesAsync() (value *NodeWriteNewSeriesAsyncResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "getWriteNewSeriesAsync" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "getWriteNewSeriesAsync failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "getWriteNewSeriesAsync failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error81 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error82 error + error82, err = error81.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error82 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "getWriteNewSeriesAsync failed: invalid message type") + return + } + result := NodeGetWriteNewSeriesAsyncResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) SetWriteNewSeriesAsync(req *NodeSetWriteNewSeriesAsyncRequest) (r *NodeWriteNewSeriesAsyncResult_, err error) { + if err = p.sendSetWriteNewSeriesAsync(req); err != nil { + return + } + return p.recvSetWriteNewSeriesAsync() +} + +func (p *NodeClient) sendSetWriteNewSeriesAsync(req *NodeSetWriteNewSeriesAsyncRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("setWriteNewSeriesAsync", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeSetWriteNewSeriesAsyncArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvSetWriteNewSeriesAsync() (value *NodeWriteNewSeriesAsyncResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "setWriteNewSeriesAsync" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "setWriteNewSeriesAsync failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "setWriteNewSeriesAsync failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error83 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error84 error + error84, err = error83.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error84 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "setWriteNewSeriesAsync failed: invalid message type") + return + } + result := NodeSetWriteNewSeriesAsyncResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +func (p *NodeClient) GetWriteNewSeriesBackoffDuration() (r *NodeWriteNewSeriesBackoffDurationResult_, err error) { + if err = p.sendGetWriteNewSeriesBackoffDuration(); err != nil { + return + } + return p.recvGetWriteNewSeriesBackoffDuration() +} + +func (p *NodeClient) sendGetWriteNewSeriesBackoffDuration() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("getWriteNewSeriesBackoffDuration", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeGetWriteNewSeriesBackoffDurationArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvGetWriteNewSeriesBackoffDuration() (value *NodeWriteNewSeriesBackoffDurationResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "getWriteNewSeriesBackoffDuration" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "getWriteNewSeriesBackoffDuration failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "getWriteNewSeriesBackoffDuration failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error85 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error86 error + error86, err = error85.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error86 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "getWriteNewSeriesBackoffDuration failed: invalid message type") + return + } + result := NodeGetWriteNewSeriesBackoffDurationResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) SetWriteNewSeriesBackoffDuration(req *NodeSetWriteNewSeriesBackoffDurationRequest) (r *NodeWriteNewSeriesBackoffDurationResult_, err error) { + if err = p.sendSetWriteNewSeriesBackoffDuration(req); err != nil { + return + } + return p.recvSetWriteNewSeriesBackoffDuration() +} + +func (p *NodeClient) sendSetWriteNewSeriesBackoffDuration(req *NodeSetWriteNewSeriesBackoffDurationRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("setWriteNewSeriesBackoffDuration", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeSetWriteNewSeriesBackoffDurationArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvSetWriteNewSeriesBackoffDuration() (value *NodeWriteNewSeriesBackoffDurationResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "setWriteNewSeriesBackoffDuration" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "setWriteNewSeriesBackoffDuration failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "setWriteNewSeriesBackoffDuration failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error87 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error88 error + error88, err = error87.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error88 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "setWriteNewSeriesBackoffDuration failed: invalid message type") + return + } + result := NodeSetWriteNewSeriesBackoffDurationResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +func (p *NodeClient) GetWriteNewSeriesLimitPerShardPerSecond() (r *NodeWriteNewSeriesLimitPerShardPerSecondResult_, err error) { + if err = p.sendGetWriteNewSeriesLimitPerShardPerSecond(); err != nil { + return + } + return p.recvGetWriteNewSeriesLimitPerShardPerSecond() +} + +func (p *NodeClient) sendGetWriteNewSeriesLimitPerShardPerSecond() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("getWriteNewSeriesLimitPerShardPerSecond", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeGetWriteNewSeriesLimitPerShardPerSecondArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvGetWriteNewSeriesLimitPerShardPerSecond() (value *NodeWriteNewSeriesLimitPerShardPerSecondResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "getWriteNewSeriesLimitPerShardPerSecond" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "getWriteNewSeriesLimitPerShardPerSecond failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "getWriteNewSeriesLimitPerShardPerSecond failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error89 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error90 error + error90, err = error89.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error90 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "getWriteNewSeriesLimitPerShardPerSecond failed: invalid message type") + return + } + result := NodeGetWriteNewSeriesLimitPerShardPerSecondResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) SetWriteNewSeriesLimitPerShardPerSecond(req *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) (r *NodeWriteNewSeriesLimitPerShardPerSecondResult_, err error) { + if err = p.sendSetWriteNewSeriesLimitPerShardPerSecond(req); err != nil { + return + } + return p.recvSetWriteNewSeriesLimitPerShardPerSecond() +} + +func (p *NodeClient) sendSetWriteNewSeriesLimitPerShardPerSecond(req *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("setWriteNewSeriesLimitPerShardPerSecond", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeSetWriteNewSeriesLimitPerShardPerSecondArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvSetWriteNewSeriesLimitPerShardPerSecond() (value *NodeWriteNewSeriesLimitPerShardPerSecondResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "setWriteNewSeriesLimitPerShardPerSecond" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "setWriteNewSeriesLimitPerShardPerSecond failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "setWriteNewSeriesLimitPerShardPerSecond failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error91 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error92 error + error92, err = error91.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error92 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "setWriteNewSeriesLimitPerShardPerSecond failed: invalid message type") + return + } + result := NodeSetWriteNewSeriesLimitPerShardPerSecondResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) DebugProfileStart(req *DebugProfileStartRequest) (r *DebugProfileStartResult_, err error) { + if err = p.sendDebugProfileStart(req); err != nil { + return + } + return p.recvDebugProfileStart() +} + +func (p *NodeClient) sendDebugProfileStart(req *DebugProfileStartRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("debugProfileStart", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeDebugProfileStartArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvDebugProfileStart() (value *DebugProfileStartResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "debugProfileStart" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "debugProfileStart failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "debugProfileStart failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error93 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error94 error + error94, err = error93.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error94 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "debugProfileStart failed: invalid message type") + return + } + result := NodeDebugProfileStartResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) DebugProfileStop(req *DebugProfileStopRequest) (r *DebugProfileStopResult_, err error) { + if err = p.sendDebugProfileStop(req); err != nil { + return + } + return p.recvDebugProfileStop() +} + +func (p *NodeClient) sendDebugProfileStop(req *DebugProfileStopRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("debugProfileStop", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeDebugProfileStopArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvDebugProfileStop() (value *DebugProfileStopResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "debugProfileStop" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "debugProfileStop failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "debugProfileStop failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error95 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error96 error + error96, err = error95.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error96 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "debugProfileStop failed: invalid message type") + return + } + result := NodeDebugProfileStopResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *NodeClient) DebugIndexMemorySegments(req *DebugIndexMemorySegmentsRequest) (r *DebugIndexMemorySegmentsResult_, err error) { + if err = p.sendDebugIndexMemorySegments(req); err != nil { + return + } + return p.recvDebugIndexMemorySegments() +} + +func (p *NodeClient) sendDebugIndexMemorySegments(req *DebugIndexMemorySegmentsRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("debugIndexMemorySegments", thrift.CALL, p.SeqId); err != nil { + return + } + args := NodeDebugIndexMemorySegmentsArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *NodeClient) recvDebugIndexMemorySegments() (value *DebugIndexMemorySegmentsResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "debugIndexMemorySegments" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "debugIndexMemorySegments failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "debugIndexMemorySegments failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error97 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error98 error + error98, err = error97.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error98 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "debugIndexMemorySegments failed: invalid message type") + return + } + result := NodeDebugIndexMemorySegmentsResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +type NodeProcessor struct { + processorMap map[string]thrift.TProcessorFunction + handler Node +} + +func (p *NodeProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { + p.processorMap[key] = processor +} + +func (p *NodeProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { + processor, ok = p.processorMap[key] + return processor, ok +} + +func (p *NodeProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { + return p.processorMap +} + +func NewNodeProcessor(handler Node) *NodeProcessor { + + self99 := &NodeProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self99.processorMap["query"] = &nodeProcessorQuery{handler: handler} + self99.processorMap["aggregate"] = &nodeProcessorAggregate{handler: handler} + self99.processorMap["fetch"] = &nodeProcessorFetch{handler: handler} + self99.processorMap["write"] = &nodeProcessorWrite{handler: handler} + self99.processorMap["writeTagged"] = &nodeProcessorWriteTagged{handler: handler} + self99.processorMap["fetchBatchRaw"] = &nodeProcessorFetchBatchRaw{handler: handler} + self99.processorMap["fetchBatchRawV2"] = &nodeProcessorFetchBatchRawV2{handler: handler} + self99.processorMap["fetchBlocksRaw"] = &nodeProcessorFetchBlocksRaw{handler: handler} + self99.processorMap["fetchTagged"] = &nodeProcessorFetchTagged{handler: handler} + self99.processorMap["aggregateRaw"] = &nodeProcessorAggregateRaw{handler: handler} + self99.processorMap["fetchBlocksMetadataRawV2"] = &nodeProcessorFetchBlocksMetadataRawV2{handler: handler} + self99.processorMap["writeBatchRaw"] = &nodeProcessorWriteBatchRaw{handler: handler} + self99.processorMap["writeBatchRawV2"] = &nodeProcessorWriteBatchRawV2{handler: handler} + self99.processorMap["writeTaggedBatchRaw"] = &nodeProcessorWriteTaggedBatchRaw{handler: handler} + self99.processorMap["writeTaggedBatchRawV2"] = &nodeProcessorWriteTaggedBatchRawV2{handler: handler} + self99.processorMap["repair"] = &nodeProcessorRepair{handler: handler} + self99.processorMap["truncate"] = &nodeProcessorTruncate{handler: handler} + self99.processorMap["aggregateTiles"] = &nodeProcessorAggregateTiles{handler: handler} + self99.processorMap["health"] = &nodeProcessorHealth{handler: handler} + self99.processorMap["bootstrapped"] = &nodeProcessorBootstrapped{handler: handler} + self99.processorMap["bootstrappedInPlacementOrNoPlacement"] = &nodeProcessorBootstrappedInPlacementOrNoPlacement{handler: handler} + self99.processorMap["getPersistRateLimit"] = &nodeProcessorGetPersistRateLimit{handler: handler} + self99.processorMap["setPersistRateLimit"] = &nodeProcessorSetPersistRateLimit{handler: handler} + self99.processorMap["getWriteNewSeriesAsync"] = &nodeProcessorGetWriteNewSeriesAsync{handler: handler} + self99.processorMap["setWriteNewSeriesAsync"] = &nodeProcessorSetWriteNewSeriesAsync{handler: handler} + self99.processorMap["getWriteNewSeriesBackoffDuration"] = &nodeProcessorGetWriteNewSeriesBackoffDuration{handler: handler} + self99.processorMap["setWriteNewSeriesBackoffDuration"] = &nodeProcessorSetWriteNewSeriesBackoffDuration{handler: handler} + self99.processorMap["getWriteNewSeriesLimitPerShardPerSecond"] = &nodeProcessorGetWriteNewSeriesLimitPerShardPerSecond{handler: handler} + self99.processorMap["setWriteNewSeriesLimitPerShardPerSecond"] = &nodeProcessorSetWriteNewSeriesLimitPerShardPerSecond{handler: handler} + self99.processorMap["debugProfileStart"] = &nodeProcessorDebugProfileStart{handler: handler} + self99.processorMap["debugProfileStop"] = &nodeProcessorDebugProfileStop{handler: handler} + self99.processorMap["debugIndexMemorySegments"] = &nodeProcessorDebugIndexMemorySegments{handler: handler} + return self99 +} + +func (p *NodeProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + name, _, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return false, err + } + if processor, ok := p.GetProcessorFunction(name); ok { + return processor.Process(seqId, iprot, oprot) + } + iprot.Skip(thrift.STRUCT) + iprot.ReadMessageEnd() + x100 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) + x100.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, x100 + +} + +type nodeProcessorQuery struct { + handler Node +} + +func (p *nodeProcessorQuery) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeQueryArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("query", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeQueryResult{} + var retval *QueryResult_ + var err2 error + if retval, err2 = p.handler.Query(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing query: "+err2.Error()) + oprot.WriteMessageBegin("query", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("query", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorAggregate struct { + handler Node +} + +func (p *nodeProcessorAggregate) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeAggregateArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("aggregate", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeAggregateResult{} + var retval *AggregateQueryResult_ + var err2 error + if retval, err2 = p.handler.Aggregate(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing aggregate: "+err2.Error()) + oprot.WriteMessageBegin("aggregate", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("aggregate", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorFetch struct { + handler Node +} + +func (p *nodeProcessorFetch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeFetchArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("fetch", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeFetchResult{} + var retval *FetchResult_ + var err2 error + if retval, err2 = p.handler.Fetch(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetch: "+err2.Error()) + oprot.WriteMessageBegin("fetch", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("fetch", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorWrite struct { + handler Node +} + +func (p *nodeProcessorWrite) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeWriteArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("write", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeWriteResult{} + var err2 error + if err2 = p.handler.Write(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing write: "+err2.Error()) + oprot.WriteMessageBegin("write", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } + if err2 = oprot.WriteMessageBegin("write", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorWriteTagged struct { + handler Node +} + +func (p *nodeProcessorWriteTagged) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeWriteTaggedArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("writeTagged", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeWriteTaggedResult{} + var err2 error + if err2 = p.handler.WriteTagged(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing writeTagged: "+err2.Error()) + oprot.WriteMessageBegin("writeTagged", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } + if err2 = oprot.WriteMessageBegin("writeTagged", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorFetchBatchRaw struct { + handler Node +} + +func (p *nodeProcessorFetchBatchRaw) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeFetchBatchRawArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("fetchBatchRaw", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeFetchBatchRawResult{} + var retval *FetchBatchRawResult_ + var err2 error + if retval, err2 = p.handler.FetchBatchRaw(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetchBatchRaw: "+err2.Error()) + oprot.WriteMessageBegin("fetchBatchRaw", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("fetchBatchRaw", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorFetchBatchRawV2 struct { + handler Node +} + +func (p *nodeProcessorFetchBatchRawV2) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeFetchBatchRawV2Args{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("fetchBatchRawV2", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeFetchBatchRawV2Result{} + var retval *FetchBatchRawResult_ + var err2 error + if retval, err2 = p.handler.FetchBatchRawV2(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetchBatchRawV2: "+err2.Error()) + oprot.WriteMessageBegin("fetchBatchRawV2", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("fetchBatchRawV2", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorFetchBlocksRaw struct { + handler Node +} + +func (p *nodeProcessorFetchBlocksRaw) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeFetchBlocksRawArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("fetchBlocksRaw", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeFetchBlocksRawResult{} + var retval *FetchBlocksRawResult_ + var err2 error + if retval, err2 = p.handler.FetchBlocksRaw(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetchBlocksRaw: "+err2.Error()) + oprot.WriteMessageBegin("fetchBlocksRaw", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("fetchBlocksRaw", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorFetchTagged struct { + handler Node +} + +func (p *nodeProcessorFetchTagged) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeFetchTaggedArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("fetchTagged", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeFetchTaggedResult{} + var retval *FetchTaggedResult_ + var err2 error + if retval, err2 = p.handler.FetchTagged(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetchTagged: "+err2.Error()) + oprot.WriteMessageBegin("fetchTagged", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("fetchTagged", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorAggregateRaw struct { + handler Node +} + +func (p *nodeProcessorAggregateRaw) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeAggregateRawArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("aggregateRaw", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeAggregateRawResult{} + var retval *AggregateQueryRawResult_ + var err2 error + if retval, err2 = p.handler.AggregateRaw(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing aggregateRaw: "+err2.Error()) + oprot.WriteMessageBegin("aggregateRaw", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("aggregateRaw", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorFetchBlocksMetadataRawV2 struct { + handler Node +} + +func (p *nodeProcessorFetchBlocksMetadataRawV2) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeFetchBlocksMetadataRawV2Args{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("fetchBlocksMetadataRawV2", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeFetchBlocksMetadataRawV2Result{} + var retval *FetchBlocksMetadataRawV2Result_ + var err2 error + if retval, err2 = p.handler.FetchBlocksMetadataRawV2(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetchBlocksMetadataRawV2: "+err2.Error()) + oprot.WriteMessageBegin("fetchBlocksMetadataRawV2", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("fetchBlocksMetadataRawV2", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorWriteBatchRaw struct { + handler Node +} + +func (p *nodeProcessorWriteBatchRaw) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeWriteBatchRawArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("writeBatchRaw", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeWriteBatchRawResult{} + var err2 error + if err2 = p.handler.WriteBatchRaw(args.Req); err2 != nil { + switch v := err2.(type) { + case *WriteBatchRawErrors: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing writeBatchRaw: "+err2.Error()) + oprot.WriteMessageBegin("writeBatchRaw", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } + if err2 = oprot.WriteMessageBegin("writeBatchRaw", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorWriteBatchRawV2 struct { + handler Node +} + +func (p *nodeProcessorWriteBatchRawV2) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeWriteBatchRawV2Args{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("writeBatchRawV2", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeWriteBatchRawV2Result{} + var err2 error + if err2 = p.handler.WriteBatchRawV2(args.Req); err2 != nil { + switch v := err2.(type) { + case *WriteBatchRawErrors: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing writeBatchRawV2: "+err2.Error()) + oprot.WriteMessageBegin("writeBatchRawV2", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } + if err2 = oprot.WriteMessageBegin("writeBatchRawV2", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorWriteTaggedBatchRaw struct { + handler Node +} + +func (p *nodeProcessorWriteTaggedBatchRaw) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeWriteTaggedBatchRawArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("writeTaggedBatchRaw", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeWriteTaggedBatchRawResult{} + var err2 error + if err2 = p.handler.WriteTaggedBatchRaw(args.Req); err2 != nil { + switch v := err2.(type) { + case *WriteBatchRawErrors: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing writeTaggedBatchRaw: "+err2.Error()) + oprot.WriteMessageBegin("writeTaggedBatchRaw", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } + if err2 = oprot.WriteMessageBegin("writeTaggedBatchRaw", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorWriteTaggedBatchRawV2 struct { + handler Node +} + +func (p *nodeProcessorWriteTaggedBatchRawV2) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeWriteTaggedBatchRawV2Args{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("writeTaggedBatchRawV2", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeWriteTaggedBatchRawV2Result{} + var err2 error + if err2 = p.handler.WriteTaggedBatchRawV2(args.Req); err2 != nil { + switch v := err2.(type) { + case *WriteBatchRawErrors: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing writeTaggedBatchRawV2: "+err2.Error()) + oprot.WriteMessageBegin("writeTaggedBatchRawV2", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } + if err2 = oprot.WriteMessageBegin("writeTaggedBatchRawV2", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorRepair struct { + handler Node +} + +func (p *nodeProcessorRepair) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeRepairArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("repair", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeRepairResult{} + var err2 error + if err2 = p.handler.Repair(); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing repair: "+err2.Error()) + oprot.WriteMessageBegin("repair", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } + if err2 = oprot.WriteMessageBegin("repair", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorTruncate struct { + handler Node +} + +func (p *nodeProcessorTruncate) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeTruncateArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("truncate", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeTruncateResult{} + var retval *TruncateResult_ + var err2 error + if retval, err2 = p.handler.Truncate(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing truncate: "+err2.Error()) + oprot.WriteMessageBegin("truncate", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("truncate", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorAggregateTiles struct { + handler Node +} + +func (p *nodeProcessorAggregateTiles) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeAggregateTilesArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("aggregateTiles", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeAggregateTilesResult{} + var retval *AggregateTilesResult_ + var err2 error + if retval, err2 = p.handler.AggregateTiles(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing aggregateTiles: "+err2.Error()) + oprot.WriteMessageBegin("aggregateTiles", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("aggregateTiles", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorHealth struct { + handler Node +} + +func (p *nodeProcessorHealth) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeHealthArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("health", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeHealthResult{} + var retval *NodeHealthResult_ + var err2 error + if retval, err2 = p.handler.Health(); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing health: "+err2.Error()) + oprot.WriteMessageBegin("health", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("health", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorBootstrapped struct { + handler Node +} + +func (p *nodeProcessorBootstrapped) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeBootstrappedArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("bootstrapped", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeBootstrappedResult{} + var retval *NodeBootstrappedResult_ + var err2 error + if retval, err2 = p.handler.Bootstrapped(); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing bootstrapped: "+err2.Error()) + oprot.WriteMessageBegin("bootstrapped", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("bootstrapped", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorBootstrappedInPlacementOrNoPlacement struct { + handler Node +} + +func (p *nodeProcessorBootstrappedInPlacementOrNoPlacement) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeBootstrappedInPlacementOrNoPlacementArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("bootstrappedInPlacementOrNoPlacement", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeBootstrappedInPlacementOrNoPlacementResult{} + var retval *NodeBootstrappedInPlacementOrNoPlacementResult_ + var err2 error + if retval, err2 = p.handler.BootstrappedInPlacementOrNoPlacement(); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing bootstrappedInPlacementOrNoPlacement: "+err2.Error()) + oprot.WriteMessageBegin("bootstrappedInPlacementOrNoPlacement", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("bootstrappedInPlacementOrNoPlacement", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorGetPersistRateLimit struct { + handler Node +} + +func (p *nodeProcessorGetPersistRateLimit) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeGetPersistRateLimitArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("getPersistRateLimit", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeGetPersistRateLimitResult{} + var retval *NodePersistRateLimitResult_ + var err2 error + if retval, err2 = p.handler.GetPersistRateLimit(); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getPersistRateLimit: "+err2.Error()) + oprot.WriteMessageBegin("getPersistRateLimit", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("getPersistRateLimit", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorSetPersistRateLimit struct { + handler Node +} + +func (p *nodeProcessorSetPersistRateLimit) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeSetPersistRateLimitArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("setPersistRateLimit", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeSetPersistRateLimitResult{} + var retval *NodePersistRateLimitResult_ + var err2 error + if retval, err2 = p.handler.SetPersistRateLimit(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing setPersistRateLimit: "+err2.Error()) + oprot.WriteMessageBegin("setPersistRateLimit", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("setPersistRateLimit", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorGetWriteNewSeriesAsync struct { + handler Node +} + +func (p *nodeProcessorGetWriteNewSeriesAsync) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeGetWriteNewSeriesAsyncArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("getWriteNewSeriesAsync", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeGetWriteNewSeriesAsyncResult{} + var retval *NodeWriteNewSeriesAsyncResult_ + var err2 error + if retval, err2 = p.handler.GetWriteNewSeriesAsync(); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getWriteNewSeriesAsync: "+err2.Error()) + oprot.WriteMessageBegin("getWriteNewSeriesAsync", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("getWriteNewSeriesAsync", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorSetWriteNewSeriesAsync struct { + handler Node +} + +func (p *nodeProcessorSetWriteNewSeriesAsync) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeSetWriteNewSeriesAsyncArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("setWriteNewSeriesAsync", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeSetWriteNewSeriesAsyncResult{} + var retval *NodeWriteNewSeriesAsyncResult_ + var err2 error + if retval, err2 = p.handler.SetWriteNewSeriesAsync(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing setWriteNewSeriesAsync: "+err2.Error()) + oprot.WriteMessageBegin("setWriteNewSeriesAsync", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("setWriteNewSeriesAsync", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorGetWriteNewSeriesBackoffDuration struct { + handler Node +} + +func (p *nodeProcessorGetWriteNewSeriesBackoffDuration) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeGetWriteNewSeriesBackoffDurationArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("getWriteNewSeriesBackoffDuration", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeGetWriteNewSeriesBackoffDurationResult{} + var retval *NodeWriteNewSeriesBackoffDurationResult_ + var err2 error + if retval, err2 = p.handler.GetWriteNewSeriesBackoffDuration(); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getWriteNewSeriesBackoffDuration: "+err2.Error()) + oprot.WriteMessageBegin("getWriteNewSeriesBackoffDuration", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("getWriteNewSeriesBackoffDuration", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorSetWriteNewSeriesBackoffDuration struct { + handler Node +} + +func (p *nodeProcessorSetWriteNewSeriesBackoffDuration) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeSetWriteNewSeriesBackoffDurationArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("setWriteNewSeriesBackoffDuration", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeSetWriteNewSeriesBackoffDurationResult{} + var retval *NodeWriteNewSeriesBackoffDurationResult_ + var err2 error + if retval, err2 = p.handler.SetWriteNewSeriesBackoffDuration(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing setWriteNewSeriesBackoffDuration: "+err2.Error()) + oprot.WriteMessageBegin("setWriteNewSeriesBackoffDuration", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("setWriteNewSeriesBackoffDuration", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorGetWriteNewSeriesLimitPerShardPerSecond struct { + handler Node +} + +func (p *nodeProcessorGetWriteNewSeriesLimitPerShardPerSecond) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeGetWriteNewSeriesLimitPerShardPerSecondArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("getWriteNewSeriesLimitPerShardPerSecond", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeGetWriteNewSeriesLimitPerShardPerSecondResult{} + var retval *NodeWriteNewSeriesLimitPerShardPerSecondResult_ + var err2 error + if retval, err2 = p.handler.GetWriteNewSeriesLimitPerShardPerSecond(); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getWriteNewSeriesLimitPerShardPerSecond: "+err2.Error()) + oprot.WriteMessageBegin("getWriteNewSeriesLimitPerShardPerSecond", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("getWriteNewSeriesLimitPerShardPerSecond", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorSetWriteNewSeriesLimitPerShardPerSecond struct { + handler Node +} + +func (p *nodeProcessorSetWriteNewSeriesLimitPerShardPerSecond) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeSetWriteNewSeriesLimitPerShardPerSecondArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("setWriteNewSeriesLimitPerShardPerSecond", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeSetWriteNewSeriesLimitPerShardPerSecondResult{} + var retval *NodeWriteNewSeriesLimitPerShardPerSecondResult_ + var err2 error + if retval, err2 = p.handler.SetWriteNewSeriesLimitPerShardPerSecond(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing setWriteNewSeriesLimitPerShardPerSecond: "+err2.Error()) + oprot.WriteMessageBegin("setWriteNewSeriesLimitPerShardPerSecond", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("setWriteNewSeriesLimitPerShardPerSecond", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorDebugProfileStart struct { + handler Node +} + +func (p *nodeProcessorDebugProfileStart) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeDebugProfileStartArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("debugProfileStart", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeDebugProfileStartResult{} + var retval *DebugProfileStartResult_ + var err2 error + if retval, err2 = p.handler.DebugProfileStart(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing debugProfileStart: "+err2.Error()) + oprot.WriteMessageBegin("debugProfileStart", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("debugProfileStart", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorDebugProfileStop struct { + handler Node +} + +func (p *nodeProcessorDebugProfileStop) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeDebugProfileStopArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("debugProfileStop", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeDebugProfileStopResult{} + var retval *DebugProfileStopResult_ + var err2 error + if retval, err2 = p.handler.DebugProfileStop(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing debugProfileStop: "+err2.Error()) + oprot.WriteMessageBegin("debugProfileStop", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("debugProfileStop", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type nodeProcessorDebugIndexMemorySegments struct { + handler Node +} + +func (p *nodeProcessorDebugIndexMemorySegments) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := NodeDebugIndexMemorySegmentsArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("debugIndexMemorySegments", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := NodeDebugIndexMemorySegmentsResult{} + var retval *DebugIndexMemorySegmentsResult_ + var err2 error + if retval, err2 = p.handler.DebugIndexMemorySegments(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing debugIndexMemorySegments: "+err2.Error()) + oprot.WriteMessageBegin("debugIndexMemorySegments", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("debugIndexMemorySegments", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +// HELPER FUNCTIONS AND STRUCTURES + +// Attributes: +// - Req +type NodeQueryArgs struct { + Req *QueryRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeQueryArgs() *NodeQueryArgs { + return &NodeQueryArgs{} +} + +var NodeQueryArgs_Req_DEFAULT *QueryRequest + +func (p *NodeQueryArgs) GetReq() *QueryRequest { + if !p.IsSetReq() { + return NodeQueryArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeQueryArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeQueryArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeQueryArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &QueryRequest{ + RangeType: 0, + + ResultTimeType: 0, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeQueryArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("query_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeQueryArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeQueryArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeQueryArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeQueryResult struct { + Success *QueryResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeQueryResult() *NodeQueryResult { + return &NodeQueryResult{} +} + +var NodeQueryResult_Success_DEFAULT *QueryResult_ + +func (p *NodeQueryResult) GetSuccess() *QueryResult_ { + if !p.IsSetSuccess() { + return NodeQueryResult_Success_DEFAULT + } + return p.Success +} + +var NodeQueryResult_Err_DEFAULT *Error + +func (p *NodeQueryResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeQueryResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeQueryResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeQueryResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeQueryResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeQueryResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &QueryResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeQueryResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeQueryResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("query_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeQueryResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeQueryResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeQueryResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeQueryResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeAggregateArgs struct { + Req *AggregateQueryRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeAggregateArgs() *NodeAggregateArgs { + return &NodeAggregateArgs{} +} + +var NodeAggregateArgs_Req_DEFAULT *AggregateQueryRequest + +func (p *NodeAggregateArgs) GetReq() *AggregateQueryRequest { + if !p.IsSetReq() { + return NodeAggregateArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeAggregateArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeAggregateArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeAggregateArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &AggregateQueryRequest{ + AggregateQueryType: 1, + + RangeType: 0, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeAggregateArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("aggregate_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeAggregateArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeAggregateArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeAggregateArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeAggregateResult struct { + Success *AggregateQueryResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeAggregateResult() *NodeAggregateResult { + return &NodeAggregateResult{} +} + +var NodeAggregateResult_Success_DEFAULT *AggregateQueryResult_ + +func (p *NodeAggregateResult) GetSuccess() *AggregateQueryResult_ { + if !p.IsSetSuccess() { + return NodeAggregateResult_Success_DEFAULT + } + return p.Success +} + +var NodeAggregateResult_Err_DEFAULT *Error + +func (p *NodeAggregateResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeAggregateResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeAggregateResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeAggregateResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeAggregateResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeAggregateResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &AggregateQueryResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeAggregateResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeAggregateResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("aggregate_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeAggregateResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeAggregateResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeAggregateResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeAggregateResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeFetchArgs struct { + Req *FetchRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeFetchArgs() *NodeFetchArgs { + return &NodeFetchArgs{} +} + +var NodeFetchArgs_Req_DEFAULT *FetchRequest + +func (p *NodeFetchArgs) GetReq() *FetchRequest { + if !p.IsSetReq() { + return NodeFetchArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeFetchArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeFetchArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &FetchRequest{ + RangeType: 0, + + ResultTimeType: 0, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeFetchArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetch_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeFetchArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeFetchResult struct { + Success *FetchResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeFetchResult() *NodeFetchResult { + return &NodeFetchResult{} +} + +var NodeFetchResult_Success_DEFAULT *FetchResult_ + +func (p *NodeFetchResult) GetSuccess() *FetchResult_ { + if !p.IsSetSuccess() { + return NodeFetchResult_Success_DEFAULT + } + return p.Success +} + +var NodeFetchResult_Err_DEFAULT *Error + +func (p *NodeFetchResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeFetchResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeFetchResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeFetchResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeFetchResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &FetchResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeFetchResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeFetchResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetch_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeFetchResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeFetchResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeWriteArgs struct { + Req *WriteRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeWriteArgs() *NodeWriteArgs { + return &NodeWriteArgs{} +} + +var NodeWriteArgs_Req_DEFAULT *WriteRequest + +func (p *NodeWriteArgs) GetReq() *WriteRequest { + if !p.IsSetReq() { + return NodeWriteArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeWriteArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeWriteArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &WriteRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeWriteArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("write_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeWriteArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteArgs(%+v)", *p) +} + +// Attributes: +// - Err +type NodeWriteResult struct { + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeWriteResult() *NodeWriteResult { + return &NodeWriteResult{} +} + +var NodeWriteResult_Err_DEFAULT *Error + +func (p *NodeWriteResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeWriteResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeWriteResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeWriteResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeWriteResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("write_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeWriteResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeWriteTaggedArgs struct { + Req *WriteTaggedRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeWriteTaggedArgs() *NodeWriteTaggedArgs { + return &NodeWriteTaggedArgs{} +} + +var NodeWriteTaggedArgs_Req_DEFAULT *WriteTaggedRequest + +func (p *NodeWriteTaggedArgs) GetReq() *WriteTaggedRequest { + if !p.IsSetReq() { + return NodeWriteTaggedArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeWriteTaggedArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeWriteTaggedArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteTaggedArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &WriteTaggedRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeWriteTaggedArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeTagged_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteTaggedArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeWriteTaggedArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteTaggedArgs(%+v)", *p) +} + +// Attributes: +// - Err +type NodeWriteTaggedResult struct { + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeWriteTaggedResult() *NodeWriteTaggedResult { + return &NodeWriteTaggedResult{} +} + +var NodeWriteTaggedResult_Err_DEFAULT *Error + +func (p *NodeWriteTaggedResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeWriteTaggedResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeWriteTaggedResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeWriteTaggedResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteTaggedResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeWriteTaggedResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeTagged_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteTaggedResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeWriteTaggedResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteTaggedResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeFetchBatchRawArgs struct { + Req *FetchBatchRawRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeFetchBatchRawArgs() *NodeFetchBatchRawArgs { + return &NodeFetchBatchRawArgs{} +} + +var NodeFetchBatchRawArgs_Req_DEFAULT *FetchBatchRawRequest + +func (p *NodeFetchBatchRawArgs) GetReq() *FetchBatchRawRequest { + if !p.IsSetReq() { + return NodeFetchBatchRawArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeFetchBatchRawArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeFetchBatchRawArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchBatchRawArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &FetchBatchRawRequest{ + RangeTimeType: 0, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeFetchBatchRawArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetchBatchRaw_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchBatchRawArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeFetchBatchRawArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchBatchRawArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeFetchBatchRawResult struct { + Success *FetchBatchRawResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeFetchBatchRawResult() *NodeFetchBatchRawResult { + return &NodeFetchBatchRawResult{} +} + +var NodeFetchBatchRawResult_Success_DEFAULT *FetchBatchRawResult_ + +func (p *NodeFetchBatchRawResult) GetSuccess() *FetchBatchRawResult_ { + if !p.IsSetSuccess() { + return NodeFetchBatchRawResult_Success_DEFAULT + } + return p.Success +} + +var NodeFetchBatchRawResult_Err_DEFAULT *Error + +func (p *NodeFetchBatchRawResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeFetchBatchRawResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeFetchBatchRawResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeFetchBatchRawResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeFetchBatchRawResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchBatchRawResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &FetchBatchRawResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeFetchBatchRawResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeFetchBatchRawResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetchBatchRaw_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchBatchRawResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeFetchBatchRawResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeFetchBatchRawResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchBatchRawResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeFetchBatchRawV2Args struct { + Req *FetchBatchRawV2Request `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeFetchBatchRawV2Args() *NodeFetchBatchRawV2Args { + return &NodeFetchBatchRawV2Args{} +} + +var NodeFetchBatchRawV2Args_Req_DEFAULT *FetchBatchRawV2Request + +func (p *NodeFetchBatchRawV2Args) GetReq() *FetchBatchRawV2Request { + if !p.IsSetReq() { + return NodeFetchBatchRawV2Args_Req_DEFAULT + } + return p.Req +} +func (p *NodeFetchBatchRawV2Args) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeFetchBatchRawV2Args) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchBatchRawV2Args) ReadField1(iprot thrift.TProtocol) error { + p.Req = &FetchBatchRawV2Request{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeFetchBatchRawV2Args) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetchBatchRawV2_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchBatchRawV2Args) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeFetchBatchRawV2Args) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchBatchRawV2Args(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeFetchBatchRawV2Result struct { + Success *FetchBatchRawResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeFetchBatchRawV2Result() *NodeFetchBatchRawV2Result { + return &NodeFetchBatchRawV2Result{} +} + +var NodeFetchBatchRawV2Result_Success_DEFAULT *FetchBatchRawResult_ + +func (p *NodeFetchBatchRawV2Result) GetSuccess() *FetchBatchRawResult_ { + if !p.IsSetSuccess() { + return NodeFetchBatchRawV2Result_Success_DEFAULT + } + return p.Success +} + +var NodeFetchBatchRawV2Result_Err_DEFAULT *Error + +func (p *NodeFetchBatchRawV2Result) GetErr() *Error { + if !p.IsSetErr() { + return NodeFetchBatchRawV2Result_Err_DEFAULT + } + return p.Err +} +func (p *NodeFetchBatchRawV2Result) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeFetchBatchRawV2Result) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeFetchBatchRawV2Result) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchBatchRawV2Result) ReadField0(iprot thrift.TProtocol) error { + p.Success = &FetchBatchRawResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeFetchBatchRawV2Result) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeFetchBatchRawV2Result) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetchBatchRawV2_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchBatchRawV2Result) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeFetchBatchRawV2Result) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeFetchBatchRawV2Result) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchBatchRawV2Result(%+v)", *p) +} + +// Attributes: +// - Req +type NodeFetchBlocksRawArgs struct { + Req *FetchBlocksRawRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeFetchBlocksRawArgs() *NodeFetchBlocksRawArgs { + return &NodeFetchBlocksRawArgs{} +} + +var NodeFetchBlocksRawArgs_Req_DEFAULT *FetchBlocksRawRequest + +func (p *NodeFetchBlocksRawArgs) GetReq() *FetchBlocksRawRequest { + if !p.IsSetReq() { + return NodeFetchBlocksRawArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeFetchBlocksRawArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeFetchBlocksRawArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchBlocksRawArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &FetchBlocksRawRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeFetchBlocksRawArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetchBlocksRaw_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchBlocksRawArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeFetchBlocksRawArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchBlocksRawArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeFetchBlocksRawResult struct { + Success *FetchBlocksRawResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeFetchBlocksRawResult() *NodeFetchBlocksRawResult { + return &NodeFetchBlocksRawResult{} +} + +var NodeFetchBlocksRawResult_Success_DEFAULT *FetchBlocksRawResult_ + +func (p *NodeFetchBlocksRawResult) GetSuccess() *FetchBlocksRawResult_ { + if !p.IsSetSuccess() { + return NodeFetchBlocksRawResult_Success_DEFAULT + } + return p.Success +} + +var NodeFetchBlocksRawResult_Err_DEFAULT *Error + +func (p *NodeFetchBlocksRawResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeFetchBlocksRawResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeFetchBlocksRawResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeFetchBlocksRawResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeFetchBlocksRawResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchBlocksRawResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &FetchBlocksRawResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeFetchBlocksRawResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeFetchBlocksRawResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetchBlocksRaw_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchBlocksRawResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeFetchBlocksRawResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeFetchBlocksRawResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchBlocksRawResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeFetchTaggedArgs struct { + Req *FetchTaggedRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeFetchTaggedArgs() *NodeFetchTaggedArgs { + return &NodeFetchTaggedArgs{} +} + +var NodeFetchTaggedArgs_Req_DEFAULT *FetchTaggedRequest + +func (p *NodeFetchTaggedArgs) GetReq() *FetchTaggedRequest { + if !p.IsSetReq() { + return NodeFetchTaggedArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeFetchTaggedArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeFetchTaggedArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchTaggedArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &FetchTaggedRequest{ + RangeTimeType: 0, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeFetchTaggedArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetchTagged_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchTaggedArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeFetchTaggedArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchTaggedArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeFetchTaggedResult struct { + Success *FetchTaggedResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeFetchTaggedResult() *NodeFetchTaggedResult { + return &NodeFetchTaggedResult{} +} + +var NodeFetchTaggedResult_Success_DEFAULT *FetchTaggedResult_ + +func (p *NodeFetchTaggedResult) GetSuccess() *FetchTaggedResult_ { + if !p.IsSetSuccess() { + return NodeFetchTaggedResult_Success_DEFAULT + } + return p.Success +} + +var NodeFetchTaggedResult_Err_DEFAULT *Error + +func (p *NodeFetchTaggedResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeFetchTaggedResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeFetchTaggedResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeFetchTaggedResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeFetchTaggedResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchTaggedResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &FetchTaggedResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeFetchTaggedResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeFetchTaggedResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetchTagged_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchTaggedResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeFetchTaggedResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeFetchTaggedResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchTaggedResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeAggregateRawArgs struct { + Req *AggregateQueryRawRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeAggregateRawArgs() *NodeAggregateRawArgs { + return &NodeAggregateRawArgs{} +} + +var NodeAggregateRawArgs_Req_DEFAULT *AggregateQueryRawRequest + +func (p *NodeAggregateRawArgs) GetReq() *AggregateQueryRawRequest { + if !p.IsSetReq() { + return NodeAggregateRawArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeAggregateRawArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeAggregateRawArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeAggregateRawArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &AggregateQueryRawRequest{ + AggregateQueryType: 1, + + RangeType: 0, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeAggregateRawArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("aggregateRaw_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeAggregateRawArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeAggregateRawArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeAggregateRawArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeAggregateRawResult struct { + Success *AggregateQueryRawResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeAggregateRawResult() *NodeAggregateRawResult { + return &NodeAggregateRawResult{} +} + +var NodeAggregateRawResult_Success_DEFAULT *AggregateQueryRawResult_ + +func (p *NodeAggregateRawResult) GetSuccess() *AggregateQueryRawResult_ { + if !p.IsSetSuccess() { + return NodeAggregateRawResult_Success_DEFAULT + } + return p.Success +} + +var NodeAggregateRawResult_Err_DEFAULT *Error + +func (p *NodeAggregateRawResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeAggregateRawResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeAggregateRawResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeAggregateRawResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeAggregateRawResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeAggregateRawResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &AggregateQueryRawResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeAggregateRawResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeAggregateRawResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("aggregateRaw_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeAggregateRawResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeAggregateRawResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeAggregateRawResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeAggregateRawResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeFetchBlocksMetadataRawV2Args struct { + Req *FetchBlocksMetadataRawV2Request `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeFetchBlocksMetadataRawV2Args() *NodeFetchBlocksMetadataRawV2Args { + return &NodeFetchBlocksMetadataRawV2Args{} +} + +var NodeFetchBlocksMetadataRawV2Args_Req_DEFAULT *FetchBlocksMetadataRawV2Request + +func (p *NodeFetchBlocksMetadataRawV2Args) GetReq() *FetchBlocksMetadataRawV2Request { + if !p.IsSetReq() { + return NodeFetchBlocksMetadataRawV2Args_Req_DEFAULT + } + return p.Req +} +func (p *NodeFetchBlocksMetadataRawV2Args) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeFetchBlocksMetadataRawV2Args) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchBlocksMetadataRawV2Args) ReadField1(iprot thrift.TProtocol) error { + p.Req = &FetchBlocksMetadataRawV2Request{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeFetchBlocksMetadataRawV2Args) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetchBlocksMetadataRawV2_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchBlocksMetadataRawV2Args) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeFetchBlocksMetadataRawV2Args) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchBlocksMetadataRawV2Args(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeFetchBlocksMetadataRawV2Result struct { + Success *FetchBlocksMetadataRawV2Result_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeFetchBlocksMetadataRawV2Result() *NodeFetchBlocksMetadataRawV2Result { + return &NodeFetchBlocksMetadataRawV2Result{} +} + +var NodeFetchBlocksMetadataRawV2Result_Success_DEFAULT *FetchBlocksMetadataRawV2Result_ + +func (p *NodeFetchBlocksMetadataRawV2Result) GetSuccess() *FetchBlocksMetadataRawV2Result_ { + if !p.IsSetSuccess() { + return NodeFetchBlocksMetadataRawV2Result_Success_DEFAULT + } + return p.Success +} + +var NodeFetchBlocksMetadataRawV2Result_Err_DEFAULT *Error + +func (p *NodeFetchBlocksMetadataRawV2Result) GetErr() *Error { + if !p.IsSetErr() { + return NodeFetchBlocksMetadataRawV2Result_Err_DEFAULT + } + return p.Err +} +func (p *NodeFetchBlocksMetadataRawV2Result) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeFetchBlocksMetadataRawV2Result) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeFetchBlocksMetadataRawV2Result) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeFetchBlocksMetadataRawV2Result) ReadField0(iprot thrift.TProtocol) error { + p.Success = &FetchBlocksMetadataRawV2Result_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeFetchBlocksMetadataRawV2Result) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeFetchBlocksMetadataRawV2Result) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetchBlocksMetadataRawV2_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeFetchBlocksMetadataRawV2Result) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeFetchBlocksMetadataRawV2Result) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeFetchBlocksMetadataRawV2Result) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeFetchBlocksMetadataRawV2Result(%+v)", *p) +} + +// Attributes: +// - Req +type NodeWriteBatchRawArgs struct { + Req *WriteBatchRawRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeWriteBatchRawArgs() *NodeWriteBatchRawArgs { + return &NodeWriteBatchRawArgs{} +} + +var NodeWriteBatchRawArgs_Req_DEFAULT *WriteBatchRawRequest + +func (p *NodeWriteBatchRawArgs) GetReq() *WriteBatchRawRequest { + if !p.IsSetReq() { + return NodeWriteBatchRawArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeWriteBatchRawArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeWriteBatchRawArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteBatchRawArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &WriteBatchRawRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeWriteBatchRawArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeBatchRaw_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteBatchRawArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeWriteBatchRawArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteBatchRawArgs(%+v)", *p) +} + +// Attributes: +// - Err +type NodeWriteBatchRawResult struct { + Err *WriteBatchRawErrors `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeWriteBatchRawResult() *NodeWriteBatchRawResult { + return &NodeWriteBatchRawResult{} +} + +var NodeWriteBatchRawResult_Err_DEFAULT *WriteBatchRawErrors + +func (p *NodeWriteBatchRawResult) GetErr() *WriteBatchRawErrors { + if !p.IsSetErr() { + return NodeWriteBatchRawResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeWriteBatchRawResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeWriteBatchRawResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteBatchRawResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &WriteBatchRawErrors{} + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeWriteBatchRawResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeBatchRaw_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteBatchRawResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeWriteBatchRawResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteBatchRawResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeWriteBatchRawV2Args struct { + Req *WriteBatchRawV2Request `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeWriteBatchRawV2Args() *NodeWriteBatchRawV2Args { + return &NodeWriteBatchRawV2Args{} +} + +var NodeWriteBatchRawV2Args_Req_DEFAULT *WriteBatchRawV2Request + +func (p *NodeWriteBatchRawV2Args) GetReq() *WriteBatchRawV2Request { + if !p.IsSetReq() { + return NodeWriteBatchRawV2Args_Req_DEFAULT + } + return p.Req +} +func (p *NodeWriteBatchRawV2Args) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeWriteBatchRawV2Args) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteBatchRawV2Args) ReadField1(iprot thrift.TProtocol) error { + p.Req = &WriteBatchRawV2Request{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeWriteBatchRawV2Args) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeBatchRawV2_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteBatchRawV2Args) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeWriteBatchRawV2Args) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteBatchRawV2Args(%+v)", *p) +} + +// Attributes: +// - Err +type NodeWriteBatchRawV2Result struct { + Err *WriteBatchRawErrors `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeWriteBatchRawV2Result() *NodeWriteBatchRawV2Result { + return &NodeWriteBatchRawV2Result{} +} + +var NodeWriteBatchRawV2Result_Err_DEFAULT *WriteBatchRawErrors + +func (p *NodeWriteBatchRawV2Result) GetErr() *WriteBatchRawErrors { + if !p.IsSetErr() { + return NodeWriteBatchRawV2Result_Err_DEFAULT + } + return p.Err +} +func (p *NodeWriteBatchRawV2Result) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeWriteBatchRawV2Result) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteBatchRawV2Result) ReadField1(iprot thrift.TProtocol) error { + p.Err = &WriteBatchRawErrors{} + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeWriteBatchRawV2Result) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeBatchRawV2_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteBatchRawV2Result) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeWriteBatchRawV2Result) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteBatchRawV2Result(%+v)", *p) +} + +// Attributes: +// - Req +type NodeWriteTaggedBatchRawArgs struct { + Req *WriteTaggedBatchRawRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeWriteTaggedBatchRawArgs() *NodeWriteTaggedBatchRawArgs { + return &NodeWriteTaggedBatchRawArgs{} +} + +var NodeWriteTaggedBatchRawArgs_Req_DEFAULT *WriteTaggedBatchRawRequest + +func (p *NodeWriteTaggedBatchRawArgs) GetReq() *WriteTaggedBatchRawRequest { + if !p.IsSetReq() { + return NodeWriteTaggedBatchRawArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeWriteTaggedBatchRawArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeWriteTaggedBatchRawArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &WriteTaggedBatchRawRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeTaggedBatchRaw_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeWriteTaggedBatchRawArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteTaggedBatchRawArgs(%+v)", *p) +} + +// Attributes: +// - Err +type NodeWriteTaggedBatchRawResult struct { + Err *WriteBatchRawErrors `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeWriteTaggedBatchRawResult() *NodeWriteTaggedBatchRawResult { + return &NodeWriteTaggedBatchRawResult{} +} + +var NodeWriteTaggedBatchRawResult_Err_DEFAULT *WriteBatchRawErrors + +func (p *NodeWriteTaggedBatchRawResult) GetErr() *WriteBatchRawErrors { + if !p.IsSetErr() { + return NodeWriteTaggedBatchRawResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeWriteTaggedBatchRawResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeWriteTaggedBatchRawResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &WriteBatchRawErrors{} + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeTaggedBatchRaw_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeWriteTaggedBatchRawResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteTaggedBatchRawResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeWriteTaggedBatchRawV2Args struct { + Req *WriteTaggedBatchRawV2Request `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeWriteTaggedBatchRawV2Args() *NodeWriteTaggedBatchRawV2Args { + return &NodeWriteTaggedBatchRawV2Args{} +} + +var NodeWriteTaggedBatchRawV2Args_Req_DEFAULT *WriteTaggedBatchRawV2Request + +func (p *NodeWriteTaggedBatchRawV2Args) GetReq() *WriteTaggedBatchRawV2Request { + if !p.IsSetReq() { + return NodeWriteTaggedBatchRawV2Args_Req_DEFAULT + } + return p.Req +} +func (p *NodeWriteTaggedBatchRawV2Args) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeWriteTaggedBatchRawV2Args) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawV2Args) ReadField1(iprot thrift.TProtocol) error { + p.Req = &WriteTaggedBatchRawV2Request{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawV2Args) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeTaggedBatchRawV2_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawV2Args) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeWriteTaggedBatchRawV2Args) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteTaggedBatchRawV2Args(%+v)", *p) +} + +// Attributes: +// - Err +type NodeWriteTaggedBatchRawV2Result struct { + Err *WriteBatchRawErrors `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeWriteTaggedBatchRawV2Result() *NodeWriteTaggedBatchRawV2Result { + return &NodeWriteTaggedBatchRawV2Result{} +} + +var NodeWriteTaggedBatchRawV2Result_Err_DEFAULT *WriteBatchRawErrors + +func (p *NodeWriteTaggedBatchRawV2Result) GetErr() *WriteBatchRawErrors { + if !p.IsSetErr() { + return NodeWriteTaggedBatchRawV2Result_Err_DEFAULT + } + return p.Err +} +func (p *NodeWriteTaggedBatchRawV2Result) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeWriteTaggedBatchRawV2Result) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawV2Result) ReadField1(iprot thrift.TProtocol) error { + p.Err = &WriteBatchRawErrors{} + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawV2Result) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeTaggedBatchRawV2_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeWriteTaggedBatchRawV2Result) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeWriteTaggedBatchRawV2Result) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeWriteTaggedBatchRawV2Result(%+v)", *p) +} + +type NodeRepairArgs struct { +} + +func NewNodeRepairArgs() *NodeRepairArgs { + return &NodeRepairArgs{} +} + +func (p *NodeRepairArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeRepairArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("repair_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeRepairArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeRepairArgs(%+v)", *p) +} + +// Attributes: +// - Err +type NodeRepairResult struct { + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeRepairResult() *NodeRepairResult { + return &NodeRepairResult{} +} + +var NodeRepairResult_Err_DEFAULT *Error + +func (p *NodeRepairResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeRepairResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeRepairResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeRepairResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeRepairResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeRepairResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("repair_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeRepairResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeRepairResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeRepairResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeTruncateArgs struct { + Req *TruncateRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeTruncateArgs() *NodeTruncateArgs { + return &NodeTruncateArgs{} +} + +var NodeTruncateArgs_Req_DEFAULT *TruncateRequest + +func (p *NodeTruncateArgs) GetReq() *TruncateRequest { + if !p.IsSetReq() { + return NodeTruncateArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeTruncateArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeTruncateArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeTruncateArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &TruncateRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeTruncateArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("truncate_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeTruncateArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeTruncateArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeTruncateArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeTruncateResult struct { + Success *TruncateResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeTruncateResult() *NodeTruncateResult { + return &NodeTruncateResult{} +} + +var NodeTruncateResult_Success_DEFAULT *TruncateResult_ + +func (p *NodeTruncateResult) GetSuccess() *TruncateResult_ { + if !p.IsSetSuccess() { + return NodeTruncateResult_Success_DEFAULT + } + return p.Success +} + +var NodeTruncateResult_Err_DEFAULT *Error + +func (p *NodeTruncateResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeTruncateResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeTruncateResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeTruncateResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeTruncateResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeTruncateResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &TruncateResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeTruncateResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeTruncateResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("truncate_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeTruncateResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeTruncateResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeTruncateResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeTruncateResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeAggregateTilesArgs struct { + Req *AggregateTilesRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeAggregateTilesArgs() *NodeAggregateTilesArgs { + return &NodeAggregateTilesArgs{} +} + +var NodeAggregateTilesArgs_Req_DEFAULT *AggregateTilesRequest + +func (p *NodeAggregateTilesArgs) GetReq() *AggregateTilesRequest { + if !p.IsSetReq() { + return NodeAggregateTilesArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeAggregateTilesArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeAggregateTilesArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeAggregateTilesArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &AggregateTilesRequest{ + RangeType: 0, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeAggregateTilesArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("aggregateTiles_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeAggregateTilesArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeAggregateTilesArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeAggregateTilesArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeAggregateTilesResult struct { + Success *AggregateTilesResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeAggregateTilesResult() *NodeAggregateTilesResult { + return &NodeAggregateTilesResult{} +} + +var NodeAggregateTilesResult_Success_DEFAULT *AggregateTilesResult_ + +func (p *NodeAggregateTilesResult) GetSuccess() *AggregateTilesResult_ { + if !p.IsSetSuccess() { + return NodeAggregateTilesResult_Success_DEFAULT + } + return p.Success +} + +var NodeAggregateTilesResult_Err_DEFAULT *Error + +func (p *NodeAggregateTilesResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeAggregateTilesResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeAggregateTilesResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeAggregateTilesResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeAggregateTilesResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeAggregateTilesResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &AggregateTilesResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeAggregateTilesResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeAggregateTilesResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("aggregateTiles_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeAggregateTilesResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeAggregateTilesResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeAggregateTilesResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeAggregateTilesResult(%+v)", *p) +} + +type NodeHealthArgs struct { +} + +func NewNodeHealthArgs() *NodeHealthArgs { + return &NodeHealthArgs{} +} + +func (p *NodeHealthArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeHealthArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("health_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeHealthArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeHealthArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeHealthResult struct { + Success *NodeHealthResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeHealthResult() *NodeHealthResult { + return &NodeHealthResult{} +} + +var NodeHealthResult_Success_DEFAULT *NodeHealthResult_ + +func (p *NodeHealthResult) GetSuccess() *NodeHealthResult_ { + if !p.IsSetSuccess() { + return NodeHealthResult_Success_DEFAULT + } + return p.Success +} + +var NodeHealthResult_Err_DEFAULT *Error + +func (p *NodeHealthResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeHealthResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeHealthResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeHealthResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeHealthResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeHealthResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodeHealthResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeHealthResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeHealthResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("health_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeHealthResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeHealthResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeHealthResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeHealthResult(%+v)", *p) +} + +type NodeBootstrappedArgs struct { +} + +func NewNodeBootstrappedArgs() *NodeBootstrappedArgs { + return &NodeBootstrappedArgs{} +} + +func (p *NodeBootstrappedArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeBootstrappedArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("bootstrapped_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeBootstrappedArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeBootstrappedArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeBootstrappedResult struct { + Success *NodeBootstrappedResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeBootstrappedResult() *NodeBootstrappedResult { + return &NodeBootstrappedResult{} +} + +var NodeBootstrappedResult_Success_DEFAULT *NodeBootstrappedResult_ + +func (p *NodeBootstrappedResult) GetSuccess() *NodeBootstrappedResult_ { + if !p.IsSetSuccess() { + return NodeBootstrappedResult_Success_DEFAULT + } + return p.Success +} + +var NodeBootstrappedResult_Err_DEFAULT *Error + +func (p *NodeBootstrappedResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeBootstrappedResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeBootstrappedResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeBootstrappedResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeBootstrappedResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeBootstrappedResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodeBootstrappedResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeBootstrappedResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeBootstrappedResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("bootstrapped_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeBootstrappedResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeBootstrappedResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeBootstrappedResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeBootstrappedResult(%+v)", *p) +} + +type NodeBootstrappedInPlacementOrNoPlacementArgs struct { +} + +func NewNodeBootstrappedInPlacementOrNoPlacementArgs() *NodeBootstrappedInPlacementOrNoPlacementArgs { + return &NodeBootstrappedInPlacementOrNoPlacementArgs{} +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("bootstrappedInPlacementOrNoPlacement_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeBootstrappedInPlacementOrNoPlacementArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeBootstrappedInPlacementOrNoPlacementResult struct { + Success *NodeBootstrappedInPlacementOrNoPlacementResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeBootstrappedInPlacementOrNoPlacementResult() *NodeBootstrappedInPlacementOrNoPlacementResult { + return &NodeBootstrappedInPlacementOrNoPlacementResult{} +} + +var NodeBootstrappedInPlacementOrNoPlacementResult_Success_DEFAULT *NodeBootstrappedInPlacementOrNoPlacementResult_ + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) GetSuccess() *NodeBootstrappedInPlacementOrNoPlacementResult_ { + if !p.IsSetSuccess() { + return NodeBootstrappedInPlacementOrNoPlacementResult_Success_DEFAULT + } + return p.Success +} + +var NodeBootstrappedInPlacementOrNoPlacementResult_Err_DEFAULT *Error + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeBootstrappedInPlacementOrNoPlacementResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodeBootstrappedInPlacementOrNoPlacementResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("bootstrappedInPlacementOrNoPlacement_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeBootstrappedInPlacementOrNoPlacementResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeBootstrappedInPlacementOrNoPlacementResult(%+v)", *p) +} + +type NodeGetPersistRateLimitArgs struct { +} + +func NewNodeGetPersistRateLimitArgs() *NodeGetPersistRateLimitArgs { + return &NodeGetPersistRateLimitArgs{} +} + +func (p *NodeGetPersistRateLimitArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeGetPersistRateLimitArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getPersistRateLimit_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeGetPersistRateLimitArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeGetPersistRateLimitArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeGetPersistRateLimitResult struct { + Success *NodePersistRateLimitResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeGetPersistRateLimitResult() *NodeGetPersistRateLimitResult { + return &NodeGetPersistRateLimitResult{} +} + +var NodeGetPersistRateLimitResult_Success_DEFAULT *NodePersistRateLimitResult_ + +func (p *NodeGetPersistRateLimitResult) GetSuccess() *NodePersistRateLimitResult_ { + if !p.IsSetSuccess() { + return NodeGetPersistRateLimitResult_Success_DEFAULT + } + return p.Success +} + +var NodeGetPersistRateLimitResult_Err_DEFAULT *Error + +func (p *NodeGetPersistRateLimitResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeGetPersistRateLimitResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeGetPersistRateLimitResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeGetPersistRateLimitResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeGetPersistRateLimitResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeGetPersistRateLimitResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodePersistRateLimitResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeGetPersistRateLimitResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeGetPersistRateLimitResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getPersistRateLimit_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeGetPersistRateLimitResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeGetPersistRateLimitResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeGetPersistRateLimitResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeGetPersistRateLimitResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeSetPersistRateLimitArgs struct { + Req *NodeSetPersistRateLimitRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeSetPersistRateLimitArgs() *NodeSetPersistRateLimitArgs { + return &NodeSetPersistRateLimitArgs{} +} + +var NodeSetPersistRateLimitArgs_Req_DEFAULT *NodeSetPersistRateLimitRequest + +func (p *NodeSetPersistRateLimitArgs) GetReq() *NodeSetPersistRateLimitRequest { + if !p.IsSetReq() { + return NodeSetPersistRateLimitArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeSetPersistRateLimitArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeSetPersistRateLimitArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeSetPersistRateLimitArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &NodeSetPersistRateLimitRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeSetPersistRateLimitArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("setPersistRateLimit_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetPersistRateLimitArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeSetPersistRateLimitArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetPersistRateLimitArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeSetPersistRateLimitResult struct { + Success *NodePersistRateLimitResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeSetPersistRateLimitResult() *NodeSetPersistRateLimitResult { + return &NodeSetPersistRateLimitResult{} +} + +var NodeSetPersistRateLimitResult_Success_DEFAULT *NodePersistRateLimitResult_ + +func (p *NodeSetPersistRateLimitResult) GetSuccess() *NodePersistRateLimitResult_ { + if !p.IsSetSuccess() { + return NodeSetPersistRateLimitResult_Success_DEFAULT + } + return p.Success +} + +var NodeSetPersistRateLimitResult_Err_DEFAULT *Error + +func (p *NodeSetPersistRateLimitResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeSetPersistRateLimitResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeSetPersistRateLimitResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeSetPersistRateLimitResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeSetPersistRateLimitResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeSetPersistRateLimitResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodePersistRateLimitResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeSetPersistRateLimitResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeSetPersistRateLimitResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("setPersistRateLimit_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetPersistRateLimitResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeSetPersistRateLimitResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeSetPersistRateLimitResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetPersistRateLimitResult(%+v)", *p) +} + +type NodeGetWriteNewSeriesAsyncArgs struct { +} + +func NewNodeGetWriteNewSeriesAsyncArgs() *NodeGetWriteNewSeriesAsyncArgs { + return &NodeGetWriteNewSeriesAsyncArgs{} +} + +func (p *NodeGetWriteNewSeriesAsyncArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesAsyncArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getWriteNewSeriesAsync_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesAsyncArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeGetWriteNewSeriesAsyncArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeGetWriteNewSeriesAsyncResult struct { + Success *NodeWriteNewSeriesAsyncResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeGetWriteNewSeriesAsyncResult() *NodeGetWriteNewSeriesAsyncResult { + return &NodeGetWriteNewSeriesAsyncResult{} +} + +var NodeGetWriteNewSeriesAsyncResult_Success_DEFAULT *NodeWriteNewSeriesAsyncResult_ + +func (p *NodeGetWriteNewSeriesAsyncResult) GetSuccess() *NodeWriteNewSeriesAsyncResult_ { + if !p.IsSetSuccess() { + return NodeGetWriteNewSeriesAsyncResult_Success_DEFAULT + } + return p.Success +} + +var NodeGetWriteNewSeriesAsyncResult_Err_DEFAULT *Error + +func (p *NodeGetWriteNewSeriesAsyncResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeGetWriteNewSeriesAsyncResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeGetWriteNewSeriesAsyncResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeGetWriteNewSeriesAsyncResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeGetWriteNewSeriesAsyncResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesAsyncResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodeWriteNewSeriesAsyncResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesAsyncResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesAsyncResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getWriteNewSeriesAsync_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesAsyncResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeGetWriteNewSeriesAsyncResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeGetWriteNewSeriesAsyncResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeGetWriteNewSeriesAsyncResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeSetWriteNewSeriesAsyncArgs struct { + Req *NodeSetWriteNewSeriesAsyncRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeSetWriteNewSeriesAsyncArgs() *NodeSetWriteNewSeriesAsyncArgs { + return &NodeSetWriteNewSeriesAsyncArgs{} +} + +var NodeSetWriteNewSeriesAsyncArgs_Req_DEFAULT *NodeSetWriteNewSeriesAsyncRequest + +func (p *NodeSetWriteNewSeriesAsyncArgs) GetReq() *NodeSetWriteNewSeriesAsyncRequest { + if !p.IsSetReq() { + return NodeSetWriteNewSeriesAsyncArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeSetWriteNewSeriesAsyncArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeSetWriteNewSeriesAsyncArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesAsyncArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &NodeSetWriteNewSeriesAsyncRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesAsyncArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("setWriteNewSeriesAsync_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesAsyncArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeSetWriteNewSeriesAsyncArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetWriteNewSeriesAsyncArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeSetWriteNewSeriesAsyncResult struct { + Success *NodeWriteNewSeriesAsyncResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeSetWriteNewSeriesAsyncResult() *NodeSetWriteNewSeriesAsyncResult { + return &NodeSetWriteNewSeriesAsyncResult{} +} + +var NodeSetWriteNewSeriesAsyncResult_Success_DEFAULT *NodeWriteNewSeriesAsyncResult_ + +func (p *NodeSetWriteNewSeriesAsyncResult) GetSuccess() *NodeWriteNewSeriesAsyncResult_ { + if !p.IsSetSuccess() { + return NodeSetWriteNewSeriesAsyncResult_Success_DEFAULT + } + return p.Success +} + +var NodeSetWriteNewSeriesAsyncResult_Err_DEFAULT *Error + +func (p *NodeSetWriteNewSeriesAsyncResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeSetWriteNewSeriesAsyncResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeSetWriteNewSeriesAsyncResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeSetWriteNewSeriesAsyncResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeSetWriteNewSeriesAsyncResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesAsyncResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodeWriteNewSeriesAsyncResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesAsyncResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesAsyncResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("setWriteNewSeriesAsync_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesAsyncResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeSetWriteNewSeriesAsyncResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeSetWriteNewSeriesAsyncResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetWriteNewSeriesAsyncResult(%+v)", *p) +} + +type NodeGetWriteNewSeriesBackoffDurationArgs struct { +} + +func NewNodeGetWriteNewSeriesBackoffDurationArgs() *NodeGetWriteNewSeriesBackoffDurationArgs { + return &NodeGetWriteNewSeriesBackoffDurationArgs{} +} + +func (p *NodeGetWriteNewSeriesBackoffDurationArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesBackoffDurationArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getWriteNewSeriesBackoffDuration_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesBackoffDurationArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeGetWriteNewSeriesBackoffDurationArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeGetWriteNewSeriesBackoffDurationResult struct { + Success *NodeWriteNewSeriesBackoffDurationResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeGetWriteNewSeriesBackoffDurationResult() *NodeGetWriteNewSeriesBackoffDurationResult { + return &NodeGetWriteNewSeriesBackoffDurationResult{} +} + +var NodeGetWriteNewSeriesBackoffDurationResult_Success_DEFAULT *NodeWriteNewSeriesBackoffDurationResult_ + +func (p *NodeGetWriteNewSeriesBackoffDurationResult) GetSuccess() *NodeWriteNewSeriesBackoffDurationResult_ { + if !p.IsSetSuccess() { + return NodeGetWriteNewSeriesBackoffDurationResult_Success_DEFAULT + } + return p.Success +} + +var NodeGetWriteNewSeriesBackoffDurationResult_Err_DEFAULT *Error + +func (p *NodeGetWriteNewSeriesBackoffDurationResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeGetWriteNewSeriesBackoffDurationResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeGetWriteNewSeriesBackoffDurationResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeGetWriteNewSeriesBackoffDurationResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeGetWriteNewSeriesBackoffDurationResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesBackoffDurationResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodeWriteNewSeriesBackoffDurationResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesBackoffDurationResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesBackoffDurationResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getWriteNewSeriesBackoffDuration_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesBackoffDurationResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeGetWriteNewSeriesBackoffDurationResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeGetWriteNewSeriesBackoffDurationResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeGetWriteNewSeriesBackoffDurationResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeSetWriteNewSeriesBackoffDurationArgs struct { + Req *NodeSetWriteNewSeriesBackoffDurationRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeSetWriteNewSeriesBackoffDurationArgs() *NodeSetWriteNewSeriesBackoffDurationArgs { + return &NodeSetWriteNewSeriesBackoffDurationArgs{} +} + +var NodeSetWriteNewSeriesBackoffDurationArgs_Req_DEFAULT *NodeSetWriteNewSeriesBackoffDurationRequest + +func (p *NodeSetWriteNewSeriesBackoffDurationArgs) GetReq() *NodeSetWriteNewSeriesBackoffDurationRequest { + if !p.IsSetReq() { + return NodeSetWriteNewSeriesBackoffDurationArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeSetWriteNewSeriesBackoffDurationArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &NodeSetWriteNewSeriesBackoffDurationRequest{ + DurationType: 2, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("setWriteNewSeriesBackoffDuration_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeSetWriteNewSeriesBackoffDurationArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetWriteNewSeriesBackoffDurationArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeSetWriteNewSeriesBackoffDurationResult struct { + Success *NodeWriteNewSeriesBackoffDurationResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeSetWriteNewSeriesBackoffDurationResult() *NodeSetWriteNewSeriesBackoffDurationResult { + return &NodeSetWriteNewSeriesBackoffDurationResult{} +} + +var NodeSetWriteNewSeriesBackoffDurationResult_Success_DEFAULT *NodeWriteNewSeriesBackoffDurationResult_ + +func (p *NodeSetWriteNewSeriesBackoffDurationResult) GetSuccess() *NodeWriteNewSeriesBackoffDurationResult_ { + if !p.IsSetSuccess() { + return NodeSetWriteNewSeriesBackoffDurationResult_Success_DEFAULT + } + return p.Success +} + +var NodeSetWriteNewSeriesBackoffDurationResult_Err_DEFAULT *Error + +func (p *NodeSetWriteNewSeriesBackoffDurationResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeSetWriteNewSeriesBackoffDurationResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeSetWriteNewSeriesBackoffDurationResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodeWriteNewSeriesBackoffDurationResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("setWriteNewSeriesBackoffDuration_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesBackoffDurationResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeSetWriteNewSeriesBackoffDurationResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeSetWriteNewSeriesBackoffDurationResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetWriteNewSeriesBackoffDurationResult(%+v)", *p) +} + +type NodeGetWriteNewSeriesLimitPerShardPerSecondArgs struct { +} + +func NewNodeGetWriteNewSeriesLimitPerShardPerSecondArgs() *NodeGetWriteNewSeriesLimitPerShardPerSecondArgs { + return &NodeGetWriteNewSeriesLimitPerShardPerSecondArgs{} +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getWriteNewSeriesLimitPerShardPerSecond_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeGetWriteNewSeriesLimitPerShardPerSecondArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeGetWriteNewSeriesLimitPerShardPerSecondResult struct { + Success *NodeWriteNewSeriesLimitPerShardPerSecondResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeGetWriteNewSeriesLimitPerShardPerSecondResult() *NodeGetWriteNewSeriesLimitPerShardPerSecondResult { + return &NodeGetWriteNewSeriesLimitPerShardPerSecondResult{} +} + +var NodeGetWriteNewSeriesLimitPerShardPerSecondResult_Success_DEFAULT *NodeWriteNewSeriesLimitPerShardPerSecondResult_ + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) GetSuccess() *NodeWriteNewSeriesLimitPerShardPerSecondResult_ { + if !p.IsSetSuccess() { + return NodeGetWriteNewSeriesLimitPerShardPerSecondResult_Success_DEFAULT + } + return p.Success +} + +var NodeGetWriteNewSeriesLimitPerShardPerSecondResult_Err_DEFAULT *Error + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeGetWriteNewSeriesLimitPerShardPerSecondResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodeWriteNewSeriesLimitPerShardPerSecondResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getWriteNewSeriesLimitPerShardPerSecond_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeGetWriteNewSeriesLimitPerShardPerSecondResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeGetWriteNewSeriesLimitPerShardPerSecondResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeSetWriteNewSeriesLimitPerShardPerSecondArgs struct { + Req *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeSetWriteNewSeriesLimitPerShardPerSecondArgs() *NodeSetWriteNewSeriesLimitPerShardPerSecondArgs { + return &NodeSetWriteNewSeriesLimitPerShardPerSecondArgs{} +} + +var NodeSetWriteNewSeriesLimitPerShardPerSecondArgs_Req_DEFAULT *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondArgs) GetReq() *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest { + if !p.IsSetReq() { + return NodeSetWriteNewSeriesLimitPerShardPerSecondArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &NodeSetWriteNewSeriesLimitPerShardPerSecondRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("setWriteNewSeriesLimitPerShardPerSecond_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetWriteNewSeriesLimitPerShardPerSecondArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeSetWriteNewSeriesLimitPerShardPerSecondResult struct { + Success *NodeWriteNewSeriesLimitPerShardPerSecondResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeSetWriteNewSeriesLimitPerShardPerSecondResult() *NodeSetWriteNewSeriesLimitPerShardPerSecondResult { + return &NodeSetWriteNewSeriesLimitPerShardPerSecondResult{} +} + +var NodeSetWriteNewSeriesLimitPerShardPerSecondResult_Success_DEFAULT *NodeWriteNewSeriesLimitPerShardPerSecondResult_ + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) GetSuccess() *NodeWriteNewSeriesLimitPerShardPerSecondResult_ { + if !p.IsSetSuccess() { + return NodeSetWriteNewSeriesLimitPerShardPerSecondResult_Success_DEFAULT + } + return p.Success +} + +var NodeSetWriteNewSeriesLimitPerShardPerSecondResult_Err_DEFAULT *Error + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeSetWriteNewSeriesLimitPerShardPerSecondResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &NodeWriteNewSeriesLimitPerShardPerSecondResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("setWriteNewSeriesLimitPerShardPerSecond_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeSetWriteNewSeriesLimitPerShardPerSecondResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeSetWriteNewSeriesLimitPerShardPerSecondResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeDebugProfileStartArgs struct { + Req *DebugProfileStartRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeDebugProfileStartArgs() *NodeDebugProfileStartArgs { + return &NodeDebugProfileStartArgs{} +} + +var NodeDebugProfileStartArgs_Req_DEFAULT *DebugProfileStartRequest + +func (p *NodeDebugProfileStartArgs) GetReq() *DebugProfileStartRequest { + if !p.IsSetReq() { + return NodeDebugProfileStartArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeDebugProfileStartArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeDebugProfileStartArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeDebugProfileStartArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &DebugProfileStartRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeDebugProfileStartArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("debugProfileStart_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeDebugProfileStartArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeDebugProfileStartArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeDebugProfileStartArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeDebugProfileStartResult struct { + Success *DebugProfileStartResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeDebugProfileStartResult() *NodeDebugProfileStartResult { + return &NodeDebugProfileStartResult{} +} + +var NodeDebugProfileStartResult_Success_DEFAULT *DebugProfileStartResult_ + +func (p *NodeDebugProfileStartResult) GetSuccess() *DebugProfileStartResult_ { + if !p.IsSetSuccess() { + return NodeDebugProfileStartResult_Success_DEFAULT + } + return p.Success +} + +var NodeDebugProfileStartResult_Err_DEFAULT *Error + +func (p *NodeDebugProfileStartResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeDebugProfileStartResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeDebugProfileStartResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeDebugProfileStartResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeDebugProfileStartResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeDebugProfileStartResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &DebugProfileStartResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeDebugProfileStartResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeDebugProfileStartResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("debugProfileStart_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeDebugProfileStartResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeDebugProfileStartResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeDebugProfileStartResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeDebugProfileStartResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeDebugProfileStopArgs struct { + Req *DebugProfileStopRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeDebugProfileStopArgs() *NodeDebugProfileStopArgs { + return &NodeDebugProfileStopArgs{} +} + +var NodeDebugProfileStopArgs_Req_DEFAULT *DebugProfileStopRequest + +func (p *NodeDebugProfileStopArgs) GetReq() *DebugProfileStopRequest { + if !p.IsSetReq() { + return NodeDebugProfileStopArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeDebugProfileStopArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeDebugProfileStopArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeDebugProfileStopArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &DebugProfileStopRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeDebugProfileStopArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("debugProfileStop_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeDebugProfileStopArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeDebugProfileStopArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeDebugProfileStopArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeDebugProfileStopResult struct { + Success *DebugProfileStopResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeDebugProfileStopResult() *NodeDebugProfileStopResult { + return &NodeDebugProfileStopResult{} +} + +var NodeDebugProfileStopResult_Success_DEFAULT *DebugProfileStopResult_ + +func (p *NodeDebugProfileStopResult) GetSuccess() *DebugProfileStopResult_ { + if !p.IsSetSuccess() { + return NodeDebugProfileStopResult_Success_DEFAULT + } + return p.Success +} + +var NodeDebugProfileStopResult_Err_DEFAULT *Error + +func (p *NodeDebugProfileStopResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeDebugProfileStopResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeDebugProfileStopResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeDebugProfileStopResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeDebugProfileStopResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeDebugProfileStopResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &DebugProfileStopResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeDebugProfileStopResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeDebugProfileStopResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("debugProfileStop_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeDebugProfileStopResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeDebugProfileStopResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeDebugProfileStopResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeDebugProfileStopResult(%+v)", *p) +} + +// Attributes: +// - Req +type NodeDebugIndexMemorySegmentsArgs struct { + Req *DebugIndexMemorySegmentsRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewNodeDebugIndexMemorySegmentsArgs() *NodeDebugIndexMemorySegmentsArgs { + return &NodeDebugIndexMemorySegmentsArgs{} +} + +var NodeDebugIndexMemorySegmentsArgs_Req_DEFAULT *DebugIndexMemorySegmentsRequest + +func (p *NodeDebugIndexMemorySegmentsArgs) GetReq() *DebugIndexMemorySegmentsRequest { + if !p.IsSetReq() { + return NodeDebugIndexMemorySegmentsArgs_Req_DEFAULT + } + return p.Req +} +func (p *NodeDebugIndexMemorySegmentsArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *NodeDebugIndexMemorySegmentsArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeDebugIndexMemorySegmentsArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &DebugIndexMemorySegmentsRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *NodeDebugIndexMemorySegmentsArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("debugIndexMemorySegments_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeDebugIndexMemorySegmentsArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *NodeDebugIndexMemorySegmentsArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeDebugIndexMemorySegmentsArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type NodeDebugIndexMemorySegmentsResult struct { + Success *DebugIndexMemorySegmentsResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewNodeDebugIndexMemorySegmentsResult() *NodeDebugIndexMemorySegmentsResult { + return &NodeDebugIndexMemorySegmentsResult{} +} + +var NodeDebugIndexMemorySegmentsResult_Success_DEFAULT *DebugIndexMemorySegmentsResult_ + +func (p *NodeDebugIndexMemorySegmentsResult) GetSuccess() *DebugIndexMemorySegmentsResult_ { + if !p.IsSetSuccess() { + return NodeDebugIndexMemorySegmentsResult_Success_DEFAULT + } + return p.Success +} + +var NodeDebugIndexMemorySegmentsResult_Err_DEFAULT *Error + +func (p *NodeDebugIndexMemorySegmentsResult) GetErr() *Error { + if !p.IsSetErr() { + return NodeDebugIndexMemorySegmentsResult_Err_DEFAULT + } + return p.Err +} +func (p *NodeDebugIndexMemorySegmentsResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *NodeDebugIndexMemorySegmentsResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *NodeDebugIndexMemorySegmentsResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *NodeDebugIndexMemorySegmentsResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &DebugIndexMemorySegmentsResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *NodeDebugIndexMemorySegmentsResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *NodeDebugIndexMemorySegmentsResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("debugIndexMemorySegments_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *NodeDebugIndexMemorySegmentsResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *NodeDebugIndexMemorySegmentsResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *NodeDebugIndexMemorySegmentsResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("NodeDebugIndexMemorySegmentsResult(%+v)", *p) +} + +type Cluster interface { + Health() (r *HealthResult_, err error) + // Parameters: + // - Req + Write(req *WriteRequest) (err error) + // Parameters: + // - Req + WriteTagged(req *WriteTaggedRequest) (err error) + // Parameters: + // - Req + Query(req *QueryRequest) (r *QueryResult_, err error) + // Parameters: + // - Req + Aggregate(req *AggregateQueryRequest) (r *AggregateQueryResult_, err error) + // Parameters: + // - Req + Fetch(req *FetchRequest) (r *FetchResult_, err error) + // Parameters: + // - Req + Truncate(req *TruncateRequest) (r *TruncateResult_, err error) +} + +type ClusterClient struct { + Transport thrift.TTransport + ProtocolFactory thrift.TProtocolFactory + InputProtocol thrift.TProtocol + OutputProtocol thrift.TProtocol + SeqId int32 +} + +func NewClusterClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *ClusterClient { + return &ClusterClient{Transport: t, + ProtocolFactory: f, + InputProtocol: f.GetProtocol(t), + OutputProtocol: f.GetProtocol(t), + SeqId: 0, + } +} + +func NewClusterClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *ClusterClient { + return &ClusterClient{Transport: t, + ProtocolFactory: nil, + InputProtocol: iprot, + OutputProtocol: oprot, + SeqId: 0, + } +} + +func (p *ClusterClient) Health() (r *HealthResult_, err error) { + if err = p.sendHealth(); err != nil { + return + } + return p.recvHealth() +} + +func (p *ClusterClient) sendHealth() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("health", thrift.CALL, p.SeqId); err != nil { + return + } + args := ClusterHealthArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *ClusterClient) recvHealth() (value *HealthResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "health" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "health failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "health failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error245 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error246 error + error246, err = error245.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error246 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "health failed: invalid message type") + return + } + result := ClusterHealthResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *ClusterClient) Write(req *WriteRequest) (err error) { + if err = p.sendWrite(req); err != nil { + return + } + return p.recvWrite() +} + +func (p *ClusterClient) sendWrite(req *WriteRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("write", thrift.CALL, p.SeqId); err != nil { + return + } + args := ClusterWriteArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *ClusterClient) recvWrite() (err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "write" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "write failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "write failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error247 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error248 error + error248, err = error247.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error248 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "write failed: invalid message type") + return + } + result := ClusterWriteResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + return +} + +// Parameters: +// - Req +func (p *ClusterClient) WriteTagged(req *WriteTaggedRequest) (err error) { + if err = p.sendWriteTagged(req); err != nil { + return + } + return p.recvWriteTagged() +} + +func (p *ClusterClient) sendWriteTagged(req *WriteTaggedRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("writeTagged", thrift.CALL, p.SeqId); err != nil { + return + } + args := ClusterWriteTaggedArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *ClusterClient) recvWriteTagged() (err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "writeTagged" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "writeTagged failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "writeTagged failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error249 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error250 error + error250, err = error249.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error250 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "writeTagged failed: invalid message type") + return + } + result := ClusterWriteTaggedResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + return +} + +// Parameters: +// - Req +func (p *ClusterClient) Query(req *QueryRequest) (r *QueryResult_, err error) { + if err = p.sendQuery(req); err != nil { + return + } + return p.recvQuery() +} + +func (p *ClusterClient) sendQuery(req *QueryRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("query", thrift.CALL, p.SeqId); err != nil { + return + } + args := ClusterQueryArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *ClusterClient) recvQuery() (value *QueryResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "query" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "query failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "query failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error251 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error252 error + error252, err = error251.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error252 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "query failed: invalid message type") + return + } + result := ClusterQueryResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *ClusterClient) Aggregate(req *AggregateQueryRequest) (r *AggregateQueryResult_, err error) { + if err = p.sendAggregate(req); err != nil { + return + } + return p.recvAggregate() +} + +func (p *ClusterClient) sendAggregate(req *AggregateQueryRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("aggregate", thrift.CALL, p.SeqId); err != nil { + return + } + args := ClusterAggregateArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *ClusterClient) recvAggregate() (value *AggregateQueryResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "aggregate" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "aggregate failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "aggregate failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error253 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error254 error + error254, err = error253.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error254 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "aggregate failed: invalid message type") + return + } + result := ClusterAggregateResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *ClusterClient) Fetch(req *FetchRequest) (r *FetchResult_, err error) { + if err = p.sendFetch(req); err != nil { + return + } + return p.recvFetch() +} + +func (p *ClusterClient) sendFetch(req *FetchRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("fetch", thrift.CALL, p.SeqId); err != nil { + return + } + args := ClusterFetchArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *ClusterClient) recvFetch() (value *FetchResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "fetch" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "fetch failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "fetch failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error255 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error256 error + error256, err = error255.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error256 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "fetch failed: invalid message type") + return + } + result := ClusterFetchResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +// Parameters: +// - Req +func (p *ClusterClient) Truncate(req *TruncateRequest) (r *TruncateResult_, err error) { + if err = p.sendTruncate(req); err != nil { + return + } + return p.recvTruncate() +} + +func (p *ClusterClient) sendTruncate(req *TruncateRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("truncate", thrift.CALL, p.SeqId); err != nil { + return + } + args := ClusterTruncateArgs{ + Req: req, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *ClusterClient) recvTruncate() (value *TruncateResult_, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "truncate" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "truncate failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "truncate failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error257 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error258 error + error258, err = error257.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error258 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "truncate failed: invalid message type") + return + } + result := ClusterTruncateResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + if result.Err != nil { + err = result.Err + return + } + value = result.GetSuccess() + return +} + +type ClusterProcessor struct { + processorMap map[string]thrift.TProcessorFunction + handler Cluster +} + +func (p *ClusterProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { + p.processorMap[key] = processor +} + +func (p *ClusterProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { + processor, ok = p.processorMap[key] + return processor, ok +} + +func (p *ClusterProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { + return p.processorMap +} + +func NewClusterProcessor(handler Cluster) *ClusterProcessor { + + self259 := &ClusterProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self259.processorMap["health"] = &clusterProcessorHealth{handler: handler} + self259.processorMap["write"] = &clusterProcessorWrite{handler: handler} + self259.processorMap["writeTagged"] = &clusterProcessorWriteTagged{handler: handler} + self259.processorMap["query"] = &clusterProcessorQuery{handler: handler} + self259.processorMap["aggregate"] = &clusterProcessorAggregate{handler: handler} + self259.processorMap["fetch"] = &clusterProcessorFetch{handler: handler} + self259.processorMap["truncate"] = &clusterProcessorTruncate{handler: handler} + return self259 +} + +func (p *ClusterProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + name, _, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return false, err + } + if processor, ok := p.GetProcessorFunction(name); ok { + return processor.Process(seqId, iprot, oprot) + } + iprot.Skip(thrift.STRUCT) + iprot.ReadMessageEnd() + x260 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) + x260.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, x260 + +} + +type clusterProcessorHealth struct { + handler Cluster +} + +func (p *clusterProcessorHealth) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := ClusterHealthArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("health", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := ClusterHealthResult{} + var retval *HealthResult_ + var err2 error + if retval, err2 = p.handler.Health(); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing health: "+err2.Error()) + oprot.WriteMessageBegin("health", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("health", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type clusterProcessorWrite struct { + handler Cluster +} + +func (p *clusterProcessorWrite) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := ClusterWriteArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("write", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := ClusterWriteResult{} + var err2 error + if err2 = p.handler.Write(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing write: "+err2.Error()) + oprot.WriteMessageBegin("write", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } + if err2 = oprot.WriteMessageBegin("write", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type clusterProcessorWriteTagged struct { + handler Cluster +} + +func (p *clusterProcessorWriteTagged) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := ClusterWriteTaggedArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("writeTagged", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := ClusterWriteTaggedResult{} + var err2 error + if err2 = p.handler.WriteTagged(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing writeTagged: "+err2.Error()) + oprot.WriteMessageBegin("writeTagged", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } + if err2 = oprot.WriteMessageBegin("writeTagged", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type clusterProcessorQuery struct { + handler Cluster +} + +func (p *clusterProcessorQuery) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := ClusterQueryArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("query", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := ClusterQueryResult{} + var retval *QueryResult_ + var err2 error + if retval, err2 = p.handler.Query(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing query: "+err2.Error()) + oprot.WriteMessageBegin("query", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("query", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type clusterProcessorAggregate struct { + handler Cluster +} + +func (p *clusterProcessorAggregate) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := ClusterAggregateArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("aggregate", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := ClusterAggregateResult{} + var retval *AggregateQueryResult_ + var err2 error + if retval, err2 = p.handler.Aggregate(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing aggregate: "+err2.Error()) + oprot.WriteMessageBegin("aggregate", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("aggregate", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type clusterProcessorFetch struct { + handler Cluster +} + +func (p *clusterProcessorFetch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := ClusterFetchArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("fetch", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := ClusterFetchResult{} + var retval *FetchResult_ + var err2 error + if retval, err2 = p.handler.Fetch(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetch: "+err2.Error()) + oprot.WriteMessageBegin("fetch", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("fetch", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type clusterProcessorTruncate struct { + handler Cluster +} + +func (p *clusterProcessorTruncate) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := ClusterTruncateArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("truncate", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := ClusterTruncateResult{} + var retval *TruncateResult_ + var err2 error + if retval, err2 = p.handler.Truncate(args.Req); err2 != nil { + switch v := err2.(type) { + case *Error: + result.Err = v + default: + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing truncate: "+err2.Error()) + oprot.WriteMessageBegin("truncate", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("truncate", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +// HELPER FUNCTIONS AND STRUCTURES + +type ClusterHealthArgs struct { +} + +func NewClusterHealthArgs() *ClusterHealthArgs { + return &ClusterHealthArgs{} +} + +func (p *ClusterHealthArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterHealthArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("health_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterHealthArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterHealthArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type ClusterHealthResult struct { + Success *HealthResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewClusterHealthResult() *ClusterHealthResult { + return &ClusterHealthResult{} +} + +var ClusterHealthResult_Success_DEFAULT *HealthResult_ + +func (p *ClusterHealthResult) GetSuccess() *HealthResult_ { + if !p.IsSetSuccess() { + return ClusterHealthResult_Success_DEFAULT + } + return p.Success +} + +var ClusterHealthResult_Err_DEFAULT *Error + +func (p *ClusterHealthResult) GetErr() *Error { + if !p.IsSetErr() { + return ClusterHealthResult_Err_DEFAULT + } + return p.Err +} +func (p *ClusterHealthResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *ClusterHealthResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *ClusterHealthResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterHealthResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &HealthResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *ClusterHealthResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *ClusterHealthResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("health_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterHealthResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *ClusterHealthResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *ClusterHealthResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterHealthResult(%+v)", *p) +} + +// Attributes: +// - Req +type ClusterWriteArgs struct { + Req *WriteRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewClusterWriteArgs() *ClusterWriteArgs { + return &ClusterWriteArgs{} +} + +var ClusterWriteArgs_Req_DEFAULT *WriteRequest + +func (p *ClusterWriteArgs) GetReq() *WriteRequest { + if !p.IsSetReq() { + return ClusterWriteArgs_Req_DEFAULT + } + return p.Req +} +func (p *ClusterWriteArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *ClusterWriteArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterWriteArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &WriteRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *ClusterWriteArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("write_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterWriteArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *ClusterWriteArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterWriteArgs(%+v)", *p) +} + +// Attributes: +// - Err +type ClusterWriteResult struct { + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewClusterWriteResult() *ClusterWriteResult { + return &ClusterWriteResult{} +} + +var ClusterWriteResult_Err_DEFAULT *Error + +func (p *ClusterWriteResult) GetErr() *Error { + if !p.IsSetErr() { + return ClusterWriteResult_Err_DEFAULT + } + return p.Err +} +func (p *ClusterWriteResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *ClusterWriteResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterWriteResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *ClusterWriteResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("write_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterWriteResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *ClusterWriteResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterWriteResult(%+v)", *p) +} + +// Attributes: +// - Req +type ClusterWriteTaggedArgs struct { + Req *WriteTaggedRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewClusterWriteTaggedArgs() *ClusterWriteTaggedArgs { + return &ClusterWriteTaggedArgs{} +} + +var ClusterWriteTaggedArgs_Req_DEFAULT *WriteTaggedRequest + +func (p *ClusterWriteTaggedArgs) GetReq() *WriteTaggedRequest { + if !p.IsSetReq() { + return ClusterWriteTaggedArgs_Req_DEFAULT + } + return p.Req +} +func (p *ClusterWriteTaggedArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *ClusterWriteTaggedArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterWriteTaggedArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &WriteTaggedRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *ClusterWriteTaggedArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeTagged_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterWriteTaggedArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *ClusterWriteTaggedArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterWriteTaggedArgs(%+v)", *p) +} + +// Attributes: +// - Err +type ClusterWriteTaggedResult struct { + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewClusterWriteTaggedResult() *ClusterWriteTaggedResult { + return &ClusterWriteTaggedResult{} +} + +var ClusterWriteTaggedResult_Err_DEFAULT *Error + +func (p *ClusterWriteTaggedResult) GetErr() *Error { + if !p.IsSetErr() { + return ClusterWriteTaggedResult_Err_DEFAULT + } + return p.Err +} +func (p *ClusterWriteTaggedResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *ClusterWriteTaggedResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterWriteTaggedResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *ClusterWriteTaggedResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("writeTagged_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterWriteTaggedResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *ClusterWriteTaggedResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterWriteTaggedResult(%+v)", *p) +} + +// Attributes: +// - Req +type ClusterQueryArgs struct { + Req *QueryRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewClusterQueryArgs() *ClusterQueryArgs { + return &ClusterQueryArgs{} +} + +var ClusterQueryArgs_Req_DEFAULT *QueryRequest + +func (p *ClusterQueryArgs) GetReq() *QueryRequest { + if !p.IsSetReq() { + return ClusterQueryArgs_Req_DEFAULT + } + return p.Req +} +func (p *ClusterQueryArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *ClusterQueryArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterQueryArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &QueryRequest{ + RangeType: 0, + + ResultTimeType: 0, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *ClusterQueryArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("query_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterQueryArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *ClusterQueryArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterQueryArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type ClusterQueryResult struct { + Success *QueryResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewClusterQueryResult() *ClusterQueryResult { + return &ClusterQueryResult{} +} + +var ClusterQueryResult_Success_DEFAULT *QueryResult_ + +func (p *ClusterQueryResult) GetSuccess() *QueryResult_ { + if !p.IsSetSuccess() { + return ClusterQueryResult_Success_DEFAULT + } + return p.Success +} + +var ClusterQueryResult_Err_DEFAULT *Error + +func (p *ClusterQueryResult) GetErr() *Error { + if !p.IsSetErr() { + return ClusterQueryResult_Err_DEFAULT + } + return p.Err +} +func (p *ClusterQueryResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *ClusterQueryResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *ClusterQueryResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterQueryResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &QueryResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *ClusterQueryResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *ClusterQueryResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("query_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterQueryResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *ClusterQueryResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *ClusterQueryResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterQueryResult(%+v)", *p) +} + +// Attributes: +// - Req +type ClusterAggregateArgs struct { + Req *AggregateQueryRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewClusterAggregateArgs() *ClusterAggregateArgs { + return &ClusterAggregateArgs{} +} + +var ClusterAggregateArgs_Req_DEFAULT *AggregateQueryRequest + +func (p *ClusterAggregateArgs) GetReq() *AggregateQueryRequest { + if !p.IsSetReq() { + return ClusterAggregateArgs_Req_DEFAULT + } + return p.Req +} +func (p *ClusterAggregateArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *ClusterAggregateArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterAggregateArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &AggregateQueryRequest{ + AggregateQueryType: 1, + + RangeType: 0, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *ClusterAggregateArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("aggregate_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterAggregateArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *ClusterAggregateArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterAggregateArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type ClusterAggregateResult struct { + Success *AggregateQueryResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewClusterAggregateResult() *ClusterAggregateResult { + return &ClusterAggregateResult{} +} + +var ClusterAggregateResult_Success_DEFAULT *AggregateQueryResult_ + +func (p *ClusterAggregateResult) GetSuccess() *AggregateQueryResult_ { + if !p.IsSetSuccess() { + return ClusterAggregateResult_Success_DEFAULT + } + return p.Success +} + +var ClusterAggregateResult_Err_DEFAULT *Error + +func (p *ClusterAggregateResult) GetErr() *Error { + if !p.IsSetErr() { + return ClusterAggregateResult_Err_DEFAULT + } + return p.Err +} +func (p *ClusterAggregateResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *ClusterAggregateResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *ClusterAggregateResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterAggregateResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &AggregateQueryResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *ClusterAggregateResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *ClusterAggregateResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("aggregate_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterAggregateResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *ClusterAggregateResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *ClusterAggregateResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterAggregateResult(%+v)", *p) +} + +// Attributes: +// - Req +type ClusterFetchArgs struct { + Req *FetchRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewClusterFetchArgs() *ClusterFetchArgs { + return &ClusterFetchArgs{} +} + +var ClusterFetchArgs_Req_DEFAULT *FetchRequest + +func (p *ClusterFetchArgs) GetReq() *FetchRequest { + if !p.IsSetReq() { + return ClusterFetchArgs_Req_DEFAULT + } + return p.Req +} +func (p *ClusterFetchArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *ClusterFetchArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterFetchArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &FetchRequest{ + RangeType: 0, + + ResultTimeType: 0, + } + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *ClusterFetchArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetch_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterFetchArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *ClusterFetchArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterFetchArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type ClusterFetchResult struct { + Success *FetchResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewClusterFetchResult() *ClusterFetchResult { + return &ClusterFetchResult{} +} + +var ClusterFetchResult_Success_DEFAULT *FetchResult_ + +func (p *ClusterFetchResult) GetSuccess() *FetchResult_ { + if !p.IsSetSuccess() { + return ClusterFetchResult_Success_DEFAULT + } + return p.Success +} + +var ClusterFetchResult_Err_DEFAULT *Error + +func (p *ClusterFetchResult) GetErr() *Error { + if !p.IsSetErr() { + return ClusterFetchResult_Err_DEFAULT + } + return p.Err +} +func (p *ClusterFetchResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *ClusterFetchResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *ClusterFetchResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterFetchResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &FetchResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *ClusterFetchResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *ClusterFetchResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("fetch_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterFetchResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *ClusterFetchResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *ClusterFetchResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterFetchResult(%+v)", *p) +} + +// Attributes: +// - Req +type ClusterTruncateArgs struct { + Req *TruncateRequest `thrift:"req,1" db:"req" json:"req"` +} + +func NewClusterTruncateArgs() *ClusterTruncateArgs { + return &ClusterTruncateArgs{} +} + +var ClusterTruncateArgs_Req_DEFAULT *TruncateRequest + +func (p *ClusterTruncateArgs) GetReq() *TruncateRequest { + if !p.IsSetReq() { + return ClusterTruncateArgs_Req_DEFAULT + } + return p.Req +} +func (p *ClusterTruncateArgs) IsSetReq() bool { + return p.Req != nil +} + +func (p *ClusterTruncateArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterTruncateArgs) ReadField1(iprot thrift.TProtocol) error { + p.Req = &TruncateRequest{} + if err := p.Req.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err) + } + return nil +} + +func (p *ClusterTruncateArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("truncate_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterTruncateArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) + } + if err := p.Req.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) + } + return err +} + +func (p *ClusterTruncateArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterTruncateArgs(%+v)", *p) +} + +// Attributes: +// - Success +// - Err +type ClusterTruncateResult struct { + Success *TruncateResult_ `thrift:"success,0" db:"success" json:"success,omitempty"` + Err *Error `thrift:"err,1" db:"err" json:"err,omitempty"` +} + +func NewClusterTruncateResult() *ClusterTruncateResult { + return &ClusterTruncateResult{} +} + +var ClusterTruncateResult_Success_DEFAULT *TruncateResult_ + +func (p *ClusterTruncateResult) GetSuccess() *TruncateResult_ { + if !p.IsSetSuccess() { + return ClusterTruncateResult_Success_DEFAULT + } + return p.Success +} + +var ClusterTruncateResult_Err_DEFAULT *Error + +func (p *ClusterTruncateResult) GetErr() *Error { + if !p.IsSetErr() { + return ClusterTruncateResult_Err_DEFAULT + } + return p.Err +} +func (p *ClusterTruncateResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *ClusterTruncateResult) IsSetErr() bool { + return p.Err != nil +} + +func (p *ClusterTruncateResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ClusterTruncateResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &TruncateResult_{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *ClusterTruncateResult) ReadField1(iprot thrift.TProtocol) error { + p.Err = &Error{ + Type: 0, + } + if err := p.Err.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Err), err) + } + return nil +} + +func (p *ClusterTruncateResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("truncate_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if p != nil { + if err := p.writeField0(oprot); err != nil { + return err + } + if err := p.writeField1(oprot); err != nil { + return err + } + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClusterTruncateResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *ClusterTruncateResult) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetErr() { + if err := oprot.WriteFieldBegin("err", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:err: ", p), err) + } + if err := p.Err.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Err), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:err: ", p), err) + } + } + return err +} + +func (p *ClusterTruncateResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClusterTruncateResult(%+v)", *p) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc_mock.go b/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc_mock.go new file mode 100644 index 00000000..a7be5ca9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/rpc_mock.go @@ -0,0 +1,654 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/generated/thrift/rpc/tchan-go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package rpc is a generated GoMock package. +package rpc + +import ( + "reflect" + + "github.com/golang/mock/gomock" + "github.com/uber/tchannel-go/thrift" +) + +// MockTChanCluster is a mock of TChanCluster interface +type MockTChanCluster struct { + ctrl *gomock.Controller + recorder *MockTChanClusterMockRecorder +} + +// MockTChanClusterMockRecorder is the mock recorder for MockTChanCluster +type MockTChanClusterMockRecorder struct { + mock *MockTChanCluster +} + +// NewMockTChanCluster creates a new mock instance +func NewMockTChanCluster(ctrl *gomock.Controller) *MockTChanCluster { + mock := &MockTChanCluster{ctrl: ctrl} + mock.recorder = &MockTChanClusterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTChanCluster) EXPECT() *MockTChanClusterMockRecorder { + return m.recorder +} + +// Aggregate mocks base method +func (m *MockTChanCluster) Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Aggregate", ctx, req) + ret0, _ := ret[0].(*AggregateQueryResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Aggregate indicates an expected call of Aggregate +func (mr *MockTChanClusterMockRecorder) Aggregate(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockTChanCluster)(nil).Aggregate), ctx, req) +} + +// Fetch mocks base method +func (m *MockTChanCluster) Fetch(ctx thrift.Context, req *FetchRequest) (*FetchResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fetch", ctx, req) + ret0, _ := ret[0].(*FetchResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fetch indicates an expected call of Fetch +func (mr *MockTChanClusterMockRecorder) Fetch(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fetch", reflect.TypeOf((*MockTChanCluster)(nil).Fetch), ctx, req) +} + +// Health mocks base method +func (m *MockTChanCluster) Health(ctx thrift.Context) (*HealthResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Health", ctx) + ret0, _ := ret[0].(*HealthResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Health indicates an expected call of Health +func (mr *MockTChanClusterMockRecorder) Health(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Health", reflect.TypeOf((*MockTChanCluster)(nil).Health), ctx) +} + +// Query mocks base method +func (m *MockTChanCluster) Query(ctx thrift.Context, req *QueryRequest) (*QueryResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", ctx, req) + ret0, _ := ret[0].(*QueryResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Query indicates an expected call of Query +func (mr *MockTChanClusterMockRecorder) Query(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockTChanCluster)(nil).Query), ctx, req) +} + +// Truncate mocks base method +func (m *MockTChanCluster) Truncate(ctx thrift.Context, req *TruncateRequest) (*TruncateResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Truncate", ctx, req) + ret0, _ := ret[0].(*TruncateResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Truncate indicates an expected call of Truncate +func (mr *MockTChanClusterMockRecorder) Truncate(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Truncate", reflect.TypeOf((*MockTChanCluster)(nil).Truncate), ctx, req) +} + +// Write mocks base method +func (m *MockTChanCluster) Write(ctx thrift.Context, req *WriteRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// Write indicates an expected call of Write +func (mr *MockTChanClusterMockRecorder) Write(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockTChanCluster)(nil).Write), ctx, req) +} + +// WriteTagged mocks base method +func (m *MockTChanCluster) WriteTagged(ctx thrift.Context, req *WriteTaggedRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTagged", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTagged indicates an expected call of WriteTagged +func (mr *MockTChanClusterMockRecorder) WriteTagged(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTagged", reflect.TypeOf((*MockTChanCluster)(nil).WriteTagged), ctx, req) +} + +// MockTChanNode is a mock of TChanNode interface +type MockTChanNode struct { + ctrl *gomock.Controller + recorder *MockTChanNodeMockRecorder +} + +// MockTChanNodeMockRecorder is the mock recorder for MockTChanNode +type MockTChanNodeMockRecorder struct { + mock *MockTChanNode +} + +// NewMockTChanNode creates a new mock instance +func NewMockTChanNode(ctrl *gomock.Controller) *MockTChanNode { + mock := &MockTChanNode{ctrl: ctrl} + mock.recorder = &MockTChanNodeMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTChanNode) EXPECT() *MockTChanNodeMockRecorder { + return m.recorder +} + +// Aggregate mocks base method +func (m *MockTChanNode) Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Aggregate", ctx, req) + ret0, _ := ret[0].(*AggregateQueryResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Aggregate indicates an expected call of Aggregate +func (mr *MockTChanNodeMockRecorder) Aggregate(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockTChanNode)(nil).Aggregate), ctx, req) +} + +// AggregateRaw mocks base method +func (m *MockTChanNode) AggregateRaw(ctx thrift.Context, req *AggregateQueryRawRequest) (*AggregateQueryRawResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateRaw", ctx, req) + ret0, _ := ret[0].(*AggregateQueryRawResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AggregateRaw indicates an expected call of AggregateRaw +func (mr *MockTChanNodeMockRecorder) AggregateRaw(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateRaw", reflect.TypeOf((*MockTChanNode)(nil).AggregateRaw), ctx, req) +} + +// AggregateTiles mocks base method +func (m *MockTChanNode) AggregateTiles(ctx thrift.Context, req *AggregateTilesRequest) (*AggregateTilesResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateTiles", ctx, req) + ret0, _ := ret[0].(*AggregateTilesResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AggregateTiles indicates an expected call of AggregateTiles +func (mr *MockTChanNodeMockRecorder) AggregateTiles(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateTiles", reflect.TypeOf((*MockTChanNode)(nil).AggregateTiles), ctx, req) +} + +// Bootstrapped mocks base method +func (m *MockTChanNode) Bootstrapped(ctx thrift.Context) (*NodeBootstrappedResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Bootstrapped", ctx) + ret0, _ := ret[0].(*NodeBootstrappedResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Bootstrapped indicates an expected call of Bootstrapped +func (mr *MockTChanNodeMockRecorder) Bootstrapped(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Bootstrapped", reflect.TypeOf((*MockTChanNode)(nil).Bootstrapped), ctx) +} + +// BootstrappedInPlacementOrNoPlacement mocks base method +func (m *MockTChanNode) BootstrappedInPlacementOrNoPlacement(ctx thrift.Context) (*NodeBootstrappedInPlacementOrNoPlacementResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BootstrappedInPlacementOrNoPlacement", ctx) + ret0, _ := ret[0].(*NodeBootstrappedInPlacementOrNoPlacementResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BootstrappedInPlacementOrNoPlacement indicates an expected call of BootstrappedInPlacementOrNoPlacement +func (mr *MockTChanNodeMockRecorder) BootstrappedInPlacementOrNoPlacement(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BootstrappedInPlacementOrNoPlacement", reflect.TypeOf((*MockTChanNode)(nil).BootstrappedInPlacementOrNoPlacement), ctx) +} + +// DebugIndexMemorySegments mocks base method +func (m *MockTChanNode) DebugIndexMemorySegments(ctx thrift.Context, req *DebugIndexMemorySegmentsRequest) (*DebugIndexMemorySegmentsResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DebugIndexMemorySegments", ctx, req) + ret0, _ := ret[0].(*DebugIndexMemorySegmentsResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DebugIndexMemorySegments indicates an expected call of DebugIndexMemorySegments +func (mr *MockTChanNodeMockRecorder) DebugIndexMemorySegments(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugIndexMemorySegments", reflect.TypeOf((*MockTChanNode)(nil).DebugIndexMemorySegments), ctx, req) +} + +// DebugProfileStart mocks base method +func (m *MockTChanNode) DebugProfileStart(ctx thrift.Context, req *DebugProfileStartRequest) (*DebugProfileStartResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DebugProfileStart", ctx, req) + ret0, _ := ret[0].(*DebugProfileStartResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DebugProfileStart indicates an expected call of DebugProfileStart +func (mr *MockTChanNodeMockRecorder) DebugProfileStart(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugProfileStart", reflect.TypeOf((*MockTChanNode)(nil).DebugProfileStart), ctx, req) +} + +// DebugProfileStop mocks base method +func (m *MockTChanNode) DebugProfileStop(ctx thrift.Context, req *DebugProfileStopRequest) (*DebugProfileStopResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DebugProfileStop", ctx, req) + ret0, _ := ret[0].(*DebugProfileStopResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DebugProfileStop indicates an expected call of DebugProfileStop +func (mr *MockTChanNodeMockRecorder) DebugProfileStop(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugProfileStop", reflect.TypeOf((*MockTChanNode)(nil).DebugProfileStop), ctx, req) +} + +// Fetch mocks base method +func (m *MockTChanNode) Fetch(ctx thrift.Context, req *FetchRequest) (*FetchResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fetch", ctx, req) + ret0, _ := ret[0].(*FetchResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fetch indicates an expected call of Fetch +func (mr *MockTChanNodeMockRecorder) Fetch(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fetch", reflect.TypeOf((*MockTChanNode)(nil).Fetch), ctx, req) +} + +// FetchBatchRaw mocks base method +func (m *MockTChanNode) FetchBatchRaw(ctx thrift.Context, req *FetchBatchRawRequest) (*FetchBatchRawResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBatchRaw", ctx, req) + ret0, _ := ret[0].(*FetchBatchRawResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBatchRaw indicates an expected call of FetchBatchRaw +func (mr *MockTChanNodeMockRecorder) FetchBatchRaw(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBatchRaw", reflect.TypeOf((*MockTChanNode)(nil).FetchBatchRaw), ctx, req) +} + +// FetchBatchRawV2 mocks base method +func (m *MockTChanNode) FetchBatchRawV2(ctx thrift.Context, req *FetchBatchRawV2Request) (*FetchBatchRawResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBatchRawV2", ctx, req) + ret0, _ := ret[0].(*FetchBatchRawResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBatchRawV2 indicates an expected call of FetchBatchRawV2 +func (mr *MockTChanNodeMockRecorder) FetchBatchRawV2(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBatchRawV2", reflect.TypeOf((*MockTChanNode)(nil).FetchBatchRawV2), ctx, req) +} + +// FetchBlocksMetadataRawV2 mocks base method +func (m *MockTChanNode) FetchBlocksMetadataRawV2(ctx thrift.Context, req *FetchBlocksMetadataRawV2Request) (*FetchBlocksMetadataRawV2Result_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksMetadataRawV2", ctx, req) + ret0, _ := ret[0].(*FetchBlocksMetadataRawV2Result_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksMetadataRawV2 indicates an expected call of FetchBlocksMetadataRawV2 +func (mr *MockTChanNodeMockRecorder) FetchBlocksMetadataRawV2(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksMetadataRawV2", reflect.TypeOf((*MockTChanNode)(nil).FetchBlocksMetadataRawV2), ctx, req) +} + +// FetchBlocksRaw mocks base method +func (m *MockTChanNode) FetchBlocksRaw(ctx thrift.Context, req *FetchBlocksRawRequest) (*FetchBlocksRawResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksRaw", ctx, req) + ret0, _ := ret[0].(*FetchBlocksRawResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksRaw indicates an expected call of FetchBlocksRaw +func (mr *MockTChanNodeMockRecorder) FetchBlocksRaw(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksRaw", reflect.TypeOf((*MockTChanNode)(nil).FetchBlocksRaw), ctx, req) +} + +// FetchTagged mocks base method +func (m *MockTChanNode) FetchTagged(ctx thrift.Context, req *FetchTaggedRequest) (*FetchTaggedResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchTagged", ctx, req) + ret0, _ := ret[0].(*FetchTaggedResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchTagged indicates an expected call of FetchTagged +func (mr *MockTChanNodeMockRecorder) FetchTagged(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTagged", reflect.TypeOf((*MockTChanNode)(nil).FetchTagged), ctx, req) +} + +// GetPersistRateLimit mocks base method +func (m *MockTChanNode) GetPersistRateLimit(ctx thrift.Context) (*NodePersistRateLimitResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPersistRateLimit", ctx) + ret0, _ := ret[0].(*NodePersistRateLimitResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPersistRateLimit indicates an expected call of GetPersistRateLimit +func (mr *MockTChanNodeMockRecorder) GetPersistRateLimit(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPersistRateLimit", reflect.TypeOf((*MockTChanNode)(nil).GetPersistRateLimit), ctx) +} + +// GetWriteNewSeriesAsync mocks base method +func (m *MockTChanNode) GetWriteNewSeriesAsync(ctx thrift.Context) (*NodeWriteNewSeriesAsyncResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWriteNewSeriesAsync", ctx) + ret0, _ := ret[0].(*NodeWriteNewSeriesAsyncResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWriteNewSeriesAsync indicates an expected call of GetWriteNewSeriesAsync +func (mr *MockTChanNodeMockRecorder) GetWriteNewSeriesAsync(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWriteNewSeriesAsync", reflect.TypeOf((*MockTChanNode)(nil).GetWriteNewSeriesAsync), ctx) +} + +// GetWriteNewSeriesBackoffDuration mocks base method +func (m *MockTChanNode) GetWriteNewSeriesBackoffDuration(ctx thrift.Context) (*NodeWriteNewSeriesBackoffDurationResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWriteNewSeriesBackoffDuration", ctx) + ret0, _ := ret[0].(*NodeWriteNewSeriesBackoffDurationResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWriteNewSeriesBackoffDuration indicates an expected call of GetWriteNewSeriesBackoffDuration +func (mr *MockTChanNodeMockRecorder) GetWriteNewSeriesBackoffDuration(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWriteNewSeriesBackoffDuration", reflect.TypeOf((*MockTChanNode)(nil).GetWriteNewSeriesBackoffDuration), ctx) +} + +// GetWriteNewSeriesLimitPerShardPerSecond mocks base method +func (m *MockTChanNode) GetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context) (*NodeWriteNewSeriesLimitPerShardPerSecondResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWriteNewSeriesLimitPerShardPerSecond", ctx) + ret0, _ := ret[0].(*NodeWriteNewSeriesLimitPerShardPerSecondResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWriteNewSeriesLimitPerShardPerSecond indicates an expected call of GetWriteNewSeriesLimitPerShardPerSecond +func (mr *MockTChanNodeMockRecorder) GetWriteNewSeriesLimitPerShardPerSecond(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWriteNewSeriesLimitPerShardPerSecond", reflect.TypeOf((*MockTChanNode)(nil).GetWriteNewSeriesLimitPerShardPerSecond), ctx) +} + +// Health mocks base method +func (m *MockTChanNode) Health(ctx thrift.Context) (*NodeHealthResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Health", ctx) + ret0, _ := ret[0].(*NodeHealthResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Health indicates an expected call of Health +func (mr *MockTChanNodeMockRecorder) Health(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Health", reflect.TypeOf((*MockTChanNode)(nil).Health), ctx) +} + +// Query mocks base method +func (m *MockTChanNode) Query(ctx thrift.Context, req *QueryRequest) (*QueryResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", ctx, req) + ret0, _ := ret[0].(*QueryResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Query indicates an expected call of Query +func (mr *MockTChanNodeMockRecorder) Query(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockTChanNode)(nil).Query), ctx, req) +} + +// Repair mocks base method +func (m *MockTChanNode) Repair(ctx thrift.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Repair", ctx) + ret0, _ := ret[0].(error) + return ret0 +} + +// Repair indicates an expected call of Repair +func (mr *MockTChanNodeMockRecorder) Repair(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Repair", reflect.TypeOf((*MockTChanNode)(nil).Repair), ctx) +} + +// SetPersistRateLimit mocks base method +func (m *MockTChanNode) SetPersistRateLimit(ctx thrift.Context, req *NodeSetPersistRateLimitRequest) (*NodePersistRateLimitResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPersistRateLimit", ctx, req) + ret0, _ := ret[0].(*NodePersistRateLimitResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetPersistRateLimit indicates an expected call of SetPersistRateLimit +func (mr *MockTChanNodeMockRecorder) SetPersistRateLimit(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPersistRateLimit", reflect.TypeOf((*MockTChanNode)(nil).SetPersistRateLimit), ctx, req) +} + +// SetWriteNewSeriesAsync mocks base method +func (m *MockTChanNode) SetWriteNewSeriesAsync(ctx thrift.Context, req *NodeSetWriteNewSeriesAsyncRequest) (*NodeWriteNewSeriesAsyncResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteNewSeriesAsync", ctx, req) + ret0, _ := ret[0].(*NodeWriteNewSeriesAsyncResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetWriteNewSeriesAsync indicates an expected call of SetWriteNewSeriesAsync +func (mr *MockTChanNodeMockRecorder) SetWriteNewSeriesAsync(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesAsync", reflect.TypeOf((*MockTChanNode)(nil).SetWriteNewSeriesAsync), ctx, req) +} + +// SetWriteNewSeriesBackoffDuration mocks base method +func (m *MockTChanNode) SetWriteNewSeriesBackoffDuration(ctx thrift.Context, req *NodeSetWriteNewSeriesBackoffDurationRequest) (*NodeWriteNewSeriesBackoffDurationResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteNewSeriesBackoffDuration", ctx, req) + ret0, _ := ret[0].(*NodeWriteNewSeriesBackoffDurationResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetWriteNewSeriesBackoffDuration indicates an expected call of SetWriteNewSeriesBackoffDuration +func (mr *MockTChanNodeMockRecorder) SetWriteNewSeriesBackoffDuration(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesBackoffDuration", reflect.TypeOf((*MockTChanNode)(nil).SetWriteNewSeriesBackoffDuration), ctx, req) +} + +// SetWriteNewSeriesLimitPerShardPerSecond mocks base method +func (m *MockTChanNode) SetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context, req *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) (*NodeWriteNewSeriesLimitPerShardPerSecondResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteNewSeriesLimitPerShardPerSecond", ctx, req) + ret0, _ := ret[0].(*NodeWriteNewSeriesLimitPerShardPerSecondResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SetWriteNewSeriesLimitPerShardPerSecond indicates an expected call of SetWriteNewSeriesLimitPerShardPerSecond +func (mr *MockTChanNodeMockRecorder) SetWriteNewSeriesLimitPerShardPerSecond(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesLimitPerShardPerSecond", reflect.TypeOf((*MockTChanNode)(nil).SetWriteNewSeriesLimitPerShardPerSecond), ctx, req) +} + +// Truncate mocks base method +func (m *MockTChanNode) Truncate(ctx thrift.Context, req *TruncateRequest) (*TruncateResult_, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Truncate", ctx, req) + ret0, _ := ret[0].(*TruncateResult_) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Truncate indicates an expected call of Truncate +func (mr *MockTChanNodeMockRecorder) Truncate(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Truncate", reflect.TypeOf((*MockTChanNode)(nil).Truncate), ctx, req) +} + +// Write mocks base method +func (m *MockTChanNode) Write(ctx thrift.Context, req *WriteRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// Write indicates an expected call of Write +func (mr *MockTChanNodeMockRecorder) Write(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockTChanNode)(nil).Write), ctx, req) +} + +// WriteBatchRaw mocks base method +func (m *MockTChanNode) WriteBatchRaw(ctx thrift.Context, req *WriteBatchRawRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteBatchRaw", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteBatchRaw indicates an expected call of WriteBatchRaw +func (mr *MockTChanNodeMockRecorder) WriteBatchRaw(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBatchRaw", reflect.TypeOf((*MockTChanNode)(nil).WriteBatchRaw), ctx, req) +} + +// WriteBatchRawV2 mocks base method +func (m *MockTChanNode) WriteBatchRawV2(ctx thrift.Context, req *WriteBatchRawV2Request) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteBatchRawV2", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteBatchRawV2 indicates an expected call of WriteBatchRawV2 +func (mr *MockTChanNodeMockRecorder) WriteBatchRawV2(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBatchRawV2", reflect.TypeOf((*MockTChanNode)(nil).WriteBatchRawV2), ctx, req) +} + +// WriteTagged mocks base method +func (m *MockTChanNode) WriteTagged(ctx thrift.Context, req *WriteTaggedRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTagged", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTagged indicates an expected call of WriteTagged +func (mr *MockTChanNodeMockRecorder) WriteTagged(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTagged", reflect.TypeOf((*MockTChanNode)(nil).WriteTagged), ctx, req) +} + +// WriteTaggedBatchRaw mocks base method +func (m *MockTChanNode) WriteTaggedBatchRaw(ctx thrift.Context, req *WriteTaggedBatchRawRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTaggedBatchRaw", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTaggedBatchRaw indicates an expected call of WriteTaggedBatchRaw +func (mr *MockTChanNodeMockRecorder) WriteTaggedBatchRaw(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTaggedBatchRaw", reflect.TypeOf((*MockTChanNode)(nil).WriteTaggedBatchRaw), ctx, req) +} + +// WriteTaggedBatchRawV2 mocks base method +func (m *MockTChanNode) WriteTaggedBatchRawV2(ctx thrift.Context, req *WriteTaggedBatchRawV2Request) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteTaggedBatchRawV2", ctx, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteTaggedBatchRawV2 indicates an expected call of WriteTaggedBatchRawV2 +func (mr *MockTChanNodeMockRecorder) WriteTaggedBatchRawV2(ctx, req interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTaggedBatchRawV2", reflect.TypeOf((*MockTChanNode)(nil).WriteTaggedBatchRawV2), ctx, req) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/tchan-rpc.go b/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/tchan-rpc.go new file mode 100644 index 00000000..cf6c9466 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/generated/thrift/rpc/tchan-rpc.go @@ -0,0 +1,2058 @@ +// @generated Code generated by thrift-gen. Do not modify. + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package rpc is generated code used to make or handle TChannel calls using Thrift. +package rpc + +import ( + "fmt" + + athrift "github.com/apache/thrift/lib/go/thrift" + "github.com/uber/tchannel-go/thrift" +) + +// Interfaces for the service and client for the services defined in the IDL. + +// TChanCluster is the interface that defines the server handler and client interface. +type TChanCluster interface { + Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) + Fetch(ctx thrift.Context, req *FetchRequest) (*FetchResult_, error) + Health(ctx thrift.Context) (*HealthResult_, error) + Query(ctx thrift.Context, req *QueryRequest) (*QueryResult_, error) + Truncate(ctx thrift.Context, req *TruncateRequest) (*TruncateResult_, error) + Write(ctx thrift.Context, req *WriteRequest) error + WriteTagged(ctx thrift.Context, req *WriteTaggedRequest) error +} + +// TChanNode is the interface that defines the server handler and client interface. +type TChanNode interface { + Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) + AggregateRaw(ctx thrift.Context, req *AggregateQueryRawRequest) (*AggregateQueryRawResult_, error) + AggregateTiles(ctx thrift.Context, req *AggregateTilesRequest) (*AggregateTilesResult_, error) + Bootstrapped(ctx thrift.Context) (*NodeBootstrappedResult_, error) + BootstrappedInPlacementOrNoPlacement(ctx thrift.Context) (*NodeBootstrappedInPlacementOrNoPlacementResult_, error) + DebugIndexMemorySegments(ctx thrift.Context, req *DebugIndexMemorySegmentsRequest) (*DebugIndexMemorySegmentsResult_, error) + DebugProfileStart(ctx thrift.Context, req *DebugProfileStartRequest) (*DebugProfileStartResult_, error) + DebugProfileStop(ctx thrift.Context, req *DebugProfileStopRequest) (*DebugProfileStopResult_, error) + Fetch(ctx thrift.Context, req *FetchRequest) (*FetchResult_, error) + FetchBatchRaw(ctx thrift.Context, req *FetchBatchRawRequest) (*FetchBatchRawResult_, error) + FetchBatchRawV2(ctx thrift.Context, req *FetchBatchRawV2Request) (*FetchBatchRawResult_, error) + FetchBlocksMetadataRawV2(ctx thrift.Context, req *FetchBlocksMetadataRawV2Request) (*FetchBlocksMetadataRawV2Result_, error) + FetchBlocksRaw(ctx thrift.Context, req *FetchBlocksRawRequest) (*FetchBlocksRawResult_, error) + FetchTagged(ctx thrift.Context, req *FetchTaggedRequest) (*FetchTaggedResult_, error) + GetPersistRateLimit(ctx thrift.Context) (*NodePersistRateLimitResult_, error) + GetWriteNewSeriesAsync(ctx thrift.Context) (*NodeWriteNewSeriesAsyncResult_, error) + GetWriteNewSeriesBackoffDuration(ctx thrift.Context) (*NodeWriteNewSeriesBackoffDurationResult_, error) + GetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context) (*NodeWriteNewSeriesLimitPerShardPerSecondResult_, error) + Health(ctx thrift.Context) (*NodeHealthResult_, error) + Query(ctx thrift.Context, req *QueryRequest) (*QueryResult_, error) + Repair(ctx thrift.Context) error + SetPersistRateLimit(ctx thrift.Context, req *NodeSetPersistRateLimitRequest) (*NodePersistRateLimitResult_, error) + SetWriteNewSeriesAsync(ctx thrift.Context, req *NodeSetWriteNewSeriesAsyncRequest) (*NodeWriteNewSeriesAsyncResult_, error) + SetWriteNewSeriesBackoffDuration(ctx thrift.Context, req *NodeSetWriteNewSeriesBackoffDurationRequest) (*NodeWriteNewSeriesBackoffDurationResult_, error) + SetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context, req *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) (*NodeWriteNewSeriesLimitPerShardPerSecondResult_, error) + Truncate(ctx thrift.Context, req *TruncateRequest) (*TruncateResult_, error) + Write(ctx thrift.Context, req *WriteRequest) error + WriteBatchRaw(ctx thrift.Context, req *WriteBatchRawRequest) error + WriteBatchRawV2(ctx thrift.Context, req *WriteBatchRawV2Request) error + WriteTagged(ctx thrift.Context, req *WriteTaggedRequest) error + WriteTaggedBatchRaw(ctx thrift.Context, req *WriteTaggedBatchRawRequest) error + WriteTaggedBatchRawV2(ctx thrift.Context, req *WriteTaggedBatchRawV2Request) error +} + +// Implementation of a client and service handler. + +type tchanClusterClient struct { + thriftService string + client thrift.TChanClient +} + +func NewTChanClusterInheritedClient(thriftService string, client thrift.TChanClient) *tchanClusterClient { + return &tchanClusterClient{ + thriftService, + client, + } +} + +// NewTChanClusterClient creates a client that can be used to make remote calls. +func NewTChanClusterClient(client thrift.TChanClient) TChanCluster { + return NewTChanClusterInheritedClient("Cluster", client) +} + +func (c *tchanClusterClient) Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) { + var resp ClusterAggregateResult + args := ClusterAggregateArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "aggregate", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for aggregate") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanClusterClient) Fetch(ctx thrift.Context, req *FetchRequest) (*FetchResult_, error) { + var resp ClusterFetchResult + args := ClusterFetchArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "fetch", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for fetch") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanClusterClient) Health(ctx thrift.Context) (*HealthResult_, error) { + var resp ClusterHealthResult + args := ClusterHealthArgs{} + success, err := c.client.Call(ctx, c.thriftService, "health", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for health") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanClusterClient) Query(ctx thrift.Context, req *QueryRequest) (*QueryResult_, error) { + var resp ClusterQueryResult + args := ClusterQueryArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "query", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for query") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanClusterClient) Truncate(ctx thrift.Context, req *TruncateRequest) (*TruncateResult_, error) { + var resp ClusterTruncateResult + args := ClusterTruncateArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "truncate", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for truncate") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanClusterClient) Write(ctx thrift.Context, req *WriteRequest) error { + var resp ClusterWriteResult + args := ClusterWriteArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "write", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for write") + } + } + + return err +} + +func (c *tchanClusterClient) WriteTagged(ctx thrift.Context, req *WriteTaggedRequest) error { + var resp ClusterWriteTaggedResult + args := ClusterWriteTaggedArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "writeTagged", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for writeTagged") + } + } + + return err +} + +type tchanClusterServer struct { + handler TChanCluster +} + +// NewTChanClusterServer wraps a handler for TChanCluster so it can be +// registered with a thrift.Server. +func NewTChanClusterServer(handler TChanCluster) thrift.TChanServer { + return &tchanClusterServer{ + handler, + } +} + +func (s *tchanClusterServer) Service() string { + return "Cluster" +} + +func (s *tchanClusterServer) Methods() []string { + return []string{ + "aggregate", + "fetch", + "health", + "query", + "truncate", + "write", + "writeTagged", + } +} + +func (s *tchanClusterServer) Handle(ctx thrift.Context, methodName string, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + switch methodName { + case "aggregate": + return s.handleAggregate(ctx, protocol) + case "fetch": + return s.handleFetch(ctx, protocol) + case "health": + return s.handleHealth(ctx, protocol) + case "query": + return s.handleQuery(ctx, protocol) + case "truncate": + return s.handleTruncate(ctx, protocol) + case "write": + return s.handleWrite(ctx, protocol) + case "writeTagged": + return s.handleWriteTagged(ctx, protocol) + + default: + return false, nil, fmt.Errorf("method %v not found in service %v", methodName, s.Service()) + } +} + +func (s *tchanClusterServer) handleAggregate(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req ClusterAggregateArgs + var res ClusterAggregateResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Aggregate(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanClusterServer) handleFetch(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req ClusterFetchArgs + var res ClusterFetchResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Fetch(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanClusterServer) handleHealth(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req ClusterHealthArgs + var res ClusterHealthResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Health(ctx) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanClusterServer) handleQuery(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req ClusterQueryArgs + var res ClusterQueryResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Query(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanClusterServer) handleTruncate(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req ClusterTruncateArgs + var res ClusterTruncateResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Truncate(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanClusterServer) handleWrite(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req ClusterWriteArgs + var res ClusterWriteResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + err := + s.handler.Write(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + } + + return err == nil, &res, nil +} + +func (s *tchanClusterServer) handleWriteTagged(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req ClusterWriteTaggedArgs + var res ClusterWriteTaggedResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + err := + s.handler.WriteTagged(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + } + + return err == nil, &res, nil +} + +type tchanNodeClient struct { + thriftService string + client thrift.TChanClient +} + +func NewTChanNodeInheritedClient(thriftService string, client thrift.TChanClient) *tchanNodeClient { + return &tchanNodeClient{ + thriftService, + client, + } +} + +// NewTChanNodeClient creates a client that can be used to make remote calls. +func NewTChanNodeClient(client thrift.TChanClient) TChanNode { + return NewTChanNodeInheritedClient("Node", client) +} + +func (c *tchanNodeClient) Aggregate(ctx thrift.Context, req *AggregateQueryRequest) (*AggregateQueryResult_, error) { + var resp NodeAggregateResult + args := NodeAggregateArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "aggregate", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for aggregate") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) AggregateRaw(ctx thrift.Context, req *AggregateQueryRawRequest) (*AggregateQueryRawResult_, error) { + var resp NodeAggregateRawResult + args := NodeAggregateRawArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "aggregateRaw", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for aggregateRaw") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) AggregateTiles(ctx thrift.Context, req *AggregateTilesRequest) (*AggregateTilesResult_, error) { + var resp NodeAggregateTilesResult + args := NodeAggregateTilesArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "aggregateTiles", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for aggregateTiles") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) Bootstrapped(ctx thrift.Context) (*NodeBootstrappedResult_, error) { + var resp NodeBootstrappedResult + args := NodeBootstrappedArgs{} + success, err := c.client.Call(ctx, c.thriftService, "bootstrapped", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for bootstrapped") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) BootstrappedInPlacementOrNoPlacement(ctx thrift.Context) (*NodeBootstrappedInPlacementOrNoPlacementResult_, error) { + var resp NodeBootstrappedInPlacementOrNoPlacementResult + args := NodeBootstrappedInPlacementOrNoPlacementArgs{} + success, err := c.client.Call(ctx, c.thriftService, "bootstrappedInPlacementOrNoPlacement", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for bootstrappedInPlacementOrNoPlacement") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) DebugIndexMemorySegments(ctx thrift.Context, req *DebugIndexMemorySegmentsRequest) (*DebugIndexMemorySegmentsResult_, error) { + var resp NodeDebugIndexMemorySegmentsResult + args := NodeDebugIndexMemorySegmentsArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "debugIndexMemorySegments", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for debugIndexMemorySegments") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) DebugProfileStart(ctx thrift.Context, req *DebugProfileStartRequest) (*DebugProfileStartResult_, error) { + var resp NodeDebugProfileStartResult + args := NodeDebugProfileStartArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "debugProfileStart", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for debugProfileStart") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) DebugProfileStop(ctx thrift.Context, req *DebugProfileStopRequest) (*DebugProfileStopResult_, error) { + var resp NodeDebugProfileStopResult + args := NodeDebugProfileStopArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "debugProfileStop", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for debugProfileStop") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) Fetch(ctx thrift.Context, req *FetchRequest) (*FetchResult_, error) { + var resp NodeFetchResult + args := NodeFetchArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "fetch", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for fetch") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) FetchBatchRaw(ctx thrift.Context, req *FetchBatchRawRequest) (*FetchBatchRawResult_, error) { + var resp NodeFetchBatchRawResult + args := NodeFetchBatchRawArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "fetchBatchRaw", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for fetchBatchRaw") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) FetchBatchRawV2(ctx thrift.Context, req *FetchBatchRawV2Request) (*FetchBatchRawResult_, error) { + var resp NodeFetchBatchRawV2Result + args := NodeFetchBatchRawV2Args{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "fetchBatchRawV2", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for fetchBatchRawV2") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) FetchBlocksMetadataRawV2(ctx thrift.Context, req *FetchBlocksMetadataRawV2Request) (*FetchBlocksMetadataRawV2Result_, error) { + var resp NodeFetchBlocksMetadataRawV2Result + args := NodeFetchBlocksMetadataRawV2Args{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "fetchBlocksMetadataRawV2", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for fetchBlocksMetadataRawV2") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) FetchBlocksRaw(ctx thrift.Context, req *FetchBlocksRawRequest) (*FetchBlocksRawResult_, error) { + var resp NodeFetchBlocksRawResult + args := NodeFetchBlocksRawArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "fetchBlocksRaw", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for fetchBlocksRaw") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) FetchTagged(ctx thrift.Context, req *FetchTaggedRequest) (*FetchTaggedResult_, error) { + var resp NodeFetchTaggedResult + args := NodeFetchTaggedArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "fetchTagged", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for fetchTagged") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) GetPersistRateLimit(ctx thrift.Context) (*NodePersistRateLimitResult_, error) { + var resp NodeGetPersistRateLimitResult + args := NodeGetPersistRateLimitArgs{} + success, err := c.client.Call(ctx, c.thriftService, "getPersistRateLimit", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for getPersistRateLimit") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) GetWriteNewSeriesAsync(ctx thrift.Context) (*NodeWriteNewSeriesAsyncResult_, error) { + var resp NodeGetWriteNewSeriesAsyncResult + args := NodeGetWriteNewSeriesAsyncArgs{} + success, err := c.client.Call(ctx, c.thriftService, "getWriteNewSeriesAsync", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for getWriteNewSeriesAsync") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) GetWriteNewSeriesBackoffDuration(ctx thrift.Context) (*NodeWriteNewSeriesBackoffDurationResult_, error) { + var resp NodeGetWriteNewSeriesBackoffDurationResult + args := NodeGetWriteNewSeriesBackoffDurationArgs{} + success, err := c.client.Call(ctx, c.thriftService, "getWriteNewSeriesBackoffDuration", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for getWriteNewSeriesBackoffDuration") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) GetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context) (*NodeWriteNewSeriesLimitPerShardPerSecondResult_, error) { + var resp NodeGetWriteNewSeriesLimitPerShardPerSecondResult + args := NodeGetWriteNewSeriesLimitPerShardPerSecondArgs{} + success, err := c.client.Call(ctx, c.thriftService, "getWriteNewSeriesLimitPerShardPerSecond", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for getWriteNewSeriesLimitPerShardPerSecond") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) Health(ctx thrift.Context) (*NodeHealthResult_, error) { + var resp NodeHealthResult + args := NodeHealthArgs{} + success, err := c.client.Call(ctx, c.thriftService, "health", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for health") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) Query(ctx thrift.Context, req *QueryRequest) (*QueryResult_, error) { + var resp NodeQueryResult + args := NodeQueryArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "query", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for query") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) Repair(ctx thrift.Context) error { + var resp NodeRepairResult + args := NodeRepairArgs{} + success, err := c.client.Call(ctx, c.thriftService, "repair", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for repair") + } + } + + return err +} + +func (c *tchanNodeClient) SetPersistRateLimit(ctx thrift.Context, req *NodeSetPersistRateLimitRequest) (*NodePersistRateLimitResult_, error) { + var resp NodeSetPersistRateLimitResult + args := NodeSetPersistRateLimitArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "setPersistRateLimit", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for setPersistRateLimit") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) SetWriteNewSeriesAsync(ctx thrift.Context, req *NodeSetWriteNewSeriesAsyncRequest) (*NodeWriteNewSeriesAsyncResult_, error) { + var resp NodeSetWriteNewSeriesAsyncResult + args := NodeSetWriteNewSeriesAsyncArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "setWriteNewSeriesAsync", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for setWriteNewSeriesAsync") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) SetWriteNewSeriesBackoffDuration(ctx thrift.Context, req *NodeSetWriteNewSeriesBackoffDurationRequest) (*NodeWriteNewSeriesBackoffDurationResult_, error) { + var resp NodeSetWriteNewSeriesBackoffDurationResult + args := NodeSetWriteNewSeriesBackoffDurationArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "setWriteNewSeriesBackoffDuration", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for setWriteNewSeriesBackoffDuration") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) SetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context, req *NodeSetWriteNewSeriesLimitPerShardPerSecondRequest) (*NodeWriteNewSeriesLimitPerShardPerSecondResult_, error) { + var resp NodeSetWriteNewSeriesLimitPerShardPerSecondResult + args := NodeSetWriteNewSeriesLimitPerShardPerSecondArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "setWriteNewSeriesLimitPerShardPerSecond", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for setWriteNewSeriesLimitPerShardPerSecond") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) Truncate(ctx thrift.Context, req *TruncateRequest) (*TruncateResult_, error) { + var resp NodeTruncateResult + args := NodeTruncateArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "truncate", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for truncate") + } + } + + return resp.GetSuccess(), err +} + +func (c *tchanNodeClient) Write(ctx thrift.Context, req *WriteRequest) error { + var resp NodeWriteResult + args := NodeWriteArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "write", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for write") + } + } + + return err +} + +func (c *tchanNodeClient) WriteBatchRaw(ctx thrift.Context, req *WriteBatchRawRequest) error { + var resp NodeWriteBatchRawResult + args := NodeWriteBatchRawArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "writeBatchRaw", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for writeBatchRaw") + } + } + + return err +} + +func (c *tchanNodeClient) WriteBatchRawV2(ctx thrift.Context, req *WriteBatchRawV2Request) error { + var resp NodeWriteBatchRawV2Result + args := NodeWriteBatchRawV2Args{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "writeBatchRawV2", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for writeBatchRawV2") + } + } + + return err +} + +func (c *tchanNodeClient) WriteTagged(ctx thrift.Context, req *WriteTaggedRequest) error { + var resp NodeWriteTaggedResult + args := NodeWriteTaggedArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "writeTagged", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for writeTagged") + } + } + + return err +} + +func (c *tchanNodeClient) WriteTaggedBatchRaw(ctx thrift.Context, req *WriteTaggedBatchRawRequest) error { + var resp NodeWriteTaggedBatchRawResult + args := NodeWriteTaggedBatchRawArgs{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "writeTaggedBatchRaw", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for writeTaggedBatchRaw") + } + } + + return err +} + +func (c *tchanNodeClient) WriteTaggedBatchRawV2(ctx thrift.Context, req *WriteTaggedBatchRawV2Request) error { + var resp NodeWriteTaggedBatchRawV2Result + args := NodeWriteTaggedBatchRawV2Args{ + Req: req, + } + success, err := c.client.Call(ctx, c.thriftService, "writeTaggedBatchRawV2", &args, &resp) + if err == nil && !success { + switch { + case resp.Err != nil: + err = resp.Err + default: + err = fmt.Errorf("received no result or unknown exception for writeTaggedBatchRawV2") + } + } + + return err +} + +type tchanNodeServer struct { + handler TChanNode +} + +// NewTChanNodeServer wraps a handler for TChanNode so it can be +// registered with a thrift.Server. +func NewTChanNodeServer(handler TChanNode) thrift.TChanServer { + return &tchanNodeServer{ + handler, + } +} + +func (s *tchanNodeServer) Service() string { + return "Node" +} + +func (s *tchanNodeServer) Methods() []string { + return []string{ + "aggregate", + "aggregateRaw", + "aggregateTiles", + "bootstrapped", + "bootstrappedInPlacementOrNoPlacement", + "debugIndexMemorySegments", + "debugProfileStart", + "debugProfileStop", + "fetch", + "fetchBatchRaw", + "fetchBatchRawV2", + "fetchBlocksMetadataRawV2", + "fetchBlocksRaw", + "fetchTagged", + "getPersistRateLimit", + "getWriteNewSeriesAsync", + "getWriteNewSeriesBackoffDuration", + "getWriteNewSeriesLimitPerShardPerSecond", + "health", + "query", + "repair", + "setPersistRateLimit", + "setWriteNewSeriesAsync", + "setWriteNewSeriesBackoffDuration", + "setWriteNewSeriesLimitPerShardPerSecond", + "truncate", + "write", + "writeBatchRaw", + "writeBatchRawV2", + "writeTagged", + "writeTaggedBatchRaw", + "writeTaggedBatchRawV2", + } +} + +func (s *tchanNodeServer) Handle(ctx thrift.Context, methodName string, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + switch methodName { + case "aggregate": + return s.handleAggregate(ctx, protocol) + case "aggregateRaw": + return s.handleAggregateRaw(ctx, protocol) + case "aggregateTiles": + return s.handleAggregateTiles(ctx, protocol) + case "bootstrapped": + return s.handleBootstrapped(ctx, protocol) + case "bootstrappedInPlacementOrNoPlacement": + return s.handleBootstrappedInPlacementOrNoPlacement(ctx, protocol) + case "debugIndexMemorySegments": + return s.handleDebugIndexMemorySegments(ctx, protocol) + case "debugProfileStart": + return s.handleDebugProfileStart(ctx, protocol) + case "debugProfileStop": + return s.handleDebugProfileStop(ctx, protocol) + case "fetch": + return s.handleFetch(ctx, protocol) + case "fetchBatchRaw": + return s.handleFetchBatchRaw(ctx, protocol) + case "fetchBatchRawV2": + return s.handleFetchBatchRawV2(ctx, protocol) + case "fetchBlocksMetadataRawV2": + return s.handleFetchBlocksMetadataRawV2(ctx, protocol) + case "fetchBlocksRaw": + return s.handleFetchBlocksRaw(ctx, protocol) + case "fetchTagged": + return s.handleFetchTagged(ctx, protocol) + case "getPersistRateLimit": + return s.handleGetPersistRateLimit(ctx, protocol) + case "getWriteNewSeriesAsync": + return s.handleGetWriteNewSeriesAsync(ctx, protocol) + case "getWriteNewSeriesBackoffDuration": + return s.handleGetWriteNewSeriesBackoffDuration(ctx, protocol) + case "getWriteNewSeriesLimitPerShardPerSecond": + return s.handleGetWriteNewSeriesLimitPerShardPerSecond(ctx, protocol) + case "health": + return s.handleHealth(ctx, protocol) + case "query": + return s.handleQuery(ctx, protocol) + case "repair": + return s.handleRepair(ctx, protocol) + case "setPersistRateLimit": + return s.handleSetPersistRateLimit(ctx, protocol) + case "setWriteNewSeriesAsync": + return s.handleSetWriteNewSeriesAsync(ctx, protocol) + case "setWriteNewSeriesBackoffDuration": + return s.handleSetWriteNewSeriesBackoffDuration(ctx, protocol) + case "setWriteNewSeriesLimitPerShardPerSecond": + return s.handleSetWriteNewSeriesLimitPerShardPerSecond(ctx, protocol) + case "truncate": + return s.handleTruncate(ctx, protocol) + case "write": + return s.handleWrite(ctx, protocol) + case "writeBatchRaw": + return s.handleWriteBatchRaw(ctx, protocol) + case "writeBatchRawV2": + return s.handleWriteBatchRawV2(ctx, protocol) + case "writeTagged": + return s.handleWriteTagged(ctx, protocol) + case "writeTaggedBatchRaw": + return s.handleWriteTaggedBatchRaw(ctx, protocol) + case "writeTaggedBatchRawV2": + return s.handleWriteTaggedBatchRawV2(ctx, protocol) + + default: + return false, nil, fmt.Errorf("method %v not found in service %v", methodName, s.Service()) + } +} + +func (s *tchanNodeServer) handleAggregate(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeAggregateArgs + var res NodeAggregateResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Aggregate(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleAggregateRaw(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeAggregateRawArgs + var res NodeAggregateRawResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.AggregateRaw(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleAggregateTiles(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeAggregateTilesArgs + var res NodeAggregateTilesResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.AggregateTiles(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleBootstrapped(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeBootstrappedArgs + var res NodeBootstrappedResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Bootstrapped(ctx) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleBootstrappedInPlacementOrNoPlacement(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeBootstrappedInPlacementOrNoPlacementArgs + var res NodeBootstrappedInPlacementOrNoPlacementResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.BootstrappedInPlacementOrNoPlacement(ctx) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleDebugIndexMemorySegments(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeDebugIndexMemorySegmentsArgs + var res NodeDebugIndexMemorySegmentsResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.DebugIndexMemorySegments(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleDebugProfileStart(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeDebugProfileStartArgs + var res NodeDebugProfileStartResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.DebugProfileStart(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleDebugProfileStop(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeDebugProfileStopArgs + var res NodeDebugProfileStopResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.DebugProfileStop(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleFetch(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeFetchArgs + var res NodeFetchResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Fetch(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleFetchBatchRaw(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeFetchBatchRawArgs + var res NodeFetchBatchRawResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.FetchBatchRaw(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleFetchBatchRawV2(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeFetchBatchRawV2Args + var res NodeFetchBatchRawV2Result + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.FetchBatchRawV2(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleFetchBlocksMetadataRawV2(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeFetchBlocksMetadataRawV2Args + var res NodeFetchBlocksMetadataRawV2Result + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.FetchBlocksMetadataRawV2(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleFetchBlocksRaw(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeFetchBlocksRawArgs + var res NodeFetchBlocksRawResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.FetchBlocksRaw(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleFetchTagged(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeFetchTaggedArgs + var res NodeFetchTaggedResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.FetchTagged(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleGetPersistRateLimit(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeGetPersistRateLimitArgs + var res NodeGetPersistRateLimitResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.GetPersistRateLimit(ctx) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleGetWriteNewSeriesAsync(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeGetWriteNewSeriesAsyncArgs + var res NodeGetWriteNewSeriesAsyncResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.GetWriteNewSeriesAsync(ctx) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleGetWriteNewSeriesBackoffDuration(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeGetWriteNewSeriesBackoffDurationArgs + var res NodeGetWriteNewSeriesBackoffDurationResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.GetWriteNewSeriesBackoffDuration(ctx) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleGetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeGetWriteNewSeriesLimitPerShardPerSecondArgs + var res NodeGetWriteNewSeriesLimitPerShardPerSecondResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.GetWriteNewSeriesLimitPerShardPerSecond(ctx) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleHealth(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeHealthArgs + var res NodeHealthResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Health(ctx) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleQuery(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeQueryArgs + var res NodeQueryResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Query(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleRepair(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeRepairArgs + var res NodeRepairResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + err := + s.handler.Repair(ctx) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleSetPersistRateLimit(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeSetPersistRateLimitArgs + var res NodeSetPersistRateLimitResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.SetPersistRateLimit(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleSetWriteNewSeriesAsync(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeSetWriteNewSeriesAsyncArgs + var res NodeSetWriteNewSeriesAsyncResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.SetWriteNewSeriesAsync(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleSetWriteNewSeriesBackoffDuration(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeSetWriteNewSeriesBackoffDurationArgs + var res NodeSetWriteNewSeriesBackoffDurationResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.SetWriteNewSeriesBackoffDuration(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleSetWriteNewSeriesLimitPerShardPerSecond(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeSetWriteNewSeriesLimitPerShardPerSecondArgs + var res NodeSetWriteNewSeriesLimitPerShardPerSecondResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.SetWriteNewSeriesLimitPerShardPerSecond(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleTruncate(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeTruncateArgs + var res NodeTruncateResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Truncate(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + res.Success = r + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleWrite(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeWriteArgs + var res NodeWriteResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + err := + s.handler.Write(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleWriteBatchRaw(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeWriteBatchRawArgs + var res NodeWriteBatchRawResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + err := + s.handler.WriteBatchRaw(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *WriteBatchRawErrors: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *WriteBatchRawErrors but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleWriteBatchRawV2(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeWriteBatchRawV2Args + var res NodeWriteBatchRawV2Result + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + err := + s.handler.WriteBatchRawV2(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *WriteBatchRawErrors: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *WriteBatchRawErrors but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleWriteTagged(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeWriteTaggedArgs + var res NodeWriteTaggedResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + err := + s.handler.WriteTagged(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *Error: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *Error but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleWriteTaggedBatchRaw(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeWriteTaggedBatchRawArgs + var res NodeWriteTaggedBatchRawResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + err := + s.handler.WriteTaggedBatchRaw(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *WriteBatchRawErrors: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *WriteBatchRawErrors but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + } + + return err == nil, &res, nil +} + +func (s *tchanNodeServer) handleWriteTaggedBatchRawV2(ctx thrift.Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req NodeWriteTaggedBatchRawV2Args + var res NodeWriteTaggedBatchRawV2Result + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + err := + s.handler.WriteTaggedBatchRawV2(ctx, req.Req) + + if err != nil { + switch v := err.(type) { + case *WriteBatchRawErrors: + if v == nil { + return false, nil, fmt.Errorf("Handler for err returned non-nil error type *WriteBatchRawErrors but nil value") + } + res.Err = v + default: + return false, nil, err + } + } else { + } + + return err == nil, &res, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/kvconfig/keys.go b/vendor/github.com/m3db/m3/src/dbnode/kvconfig/keys.go new file mode 100644 index 00000000..e607be8d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/kvconfig/keys.go @@ -0,0 +1,52 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package kvconfig + +const ( + // NamespacesKey is the KV config key for the runtime configuration + // specifying the namespaces configured. + NamespacesKey = "m3db.node.namespaces" + + // BootstrapperKey is the KV config key for the runtime configuration + // specifying the set of bootstrappers as a string array. + BootstrapperKey = "m3db.node.bootstrapper" + + // ClusterNewSeriesInsertLimitKey is the KV config key for the runtime + // configuration specifying a hard limit for a cluster new series insertions. + ClusterNewSeriesInsertLimitKey = "m3db.node.cluster-new-series-insert-limit" + + // EncodersPerBlockLimitKey is the KV config key for the runtime + // configuration specifying a hard limit on the number of active encoders + // per block. + EncodersPerBlockLimitKey = "m3db.node.encoders-per-block-limit" + + // ClientBootstrapConsistencyLevel is the KV config key for the runtime + // configuration specifying the client bootstrap consistency level + ClientBootstrapConsistencyLevel = "m3db.client.bootstrap-consistency-level" + + // ClientReadConsistencyLevel is the KV config key for the runtime + // configuration specifying the client read consistency level + ClientReadConsistencyLevel = "m3db.client.read-consistency-level" + + // ClientWriteConsistencyLevel is the KV config key for the runtime + // configuration specifying the client write consistency level + ClientWriteConsistencyLevel = "m3db.client.write-consistency-level" +) diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/aggregation.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/aggregation.go new file mode 100644 index 00000000..5c240a7a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/aggregation.go @@ -0,0 +1,90 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "fmt" + "time" +) + +type aggregationOptions struct { + aggregations []Aggregation +} + +// NewAggregationOptions creates new AggregationOptions. +func NewAggregationOptions() AggregationOptions { + return &aggregationOptions{} +} + +func (a *aggregationOptions) SetAggregations(value []Aggregation) AggregationOptions { + opts := *a + opts.aggregations = value + return &opts +} + +func (a *aggregationOptions) Aggregations() []Aggregation { + return a.aggregations +} + +func (a *aggregationOptions) Equal(rhs AggregationOptions) bool { + if len(a.aggregations) != len(rhs.Aggregations()) { + return false + } + + for i, agg := range rhs.Aggregations() { + if a.aggregations[i] != agg { + return false + } + } + + return true +} + +// NewUnaggregatedAggregation creates a new unaggregated Aggregation. +func NewUnaggregatedAggregation() Aggregation { + return Aggregation{ + Aggregated: false, + } +} + +// NewAggregatedAggregation creates a new aggregated Aggregation. +func NewAggregatedAggregation(attrs AggregatedAttributes) Aggregation { + return Aggregation{ + Aggregated: true, + Attributes: attrs, + } +} + +// NewAggregateAttributes creates new AggregatedAttributes. +func NewAggregatedAttributes(resolution time.Duration, downsampleOptions DownsampleOptions) (AggregatedAttributes, error) { + if resolution <= 0 { + return AggregatedAttributes{}, fmt.Errorf("invalid resolution %v. must be greater than 0", resolution) + } + return AggregatedAttributes{ + Resolution: resolution, + DownsampleOptions: downsampleOptions, + }, nil +} + +// NewDownsampleOptions creates new DownsampleOptions. +func NewDownsampleOptions(all bool) DownsampleOptions { + return DownsampleOptions{All: all} +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/config.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/config.go new file mode 100644 index 00000000..82115b8e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/config.go @@ -0,0 +1,105 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "fmt" + "time" + + "github.com/m3db/m3/src/dbnode/retention" + "github.com/m3db/m3/src/x/ident" +) + +// MapConfiguration is the configuration for a registry of namespaces +type MapConfiguration struct { + Metadatas []MetadataConfiguration `yaml:"metadatas" validate:"nonzero"` +} + +// Map returns a Map corresponding to the receiver struct +func (m *MapConfiguration) Map() (Map, error) { + metadatas := make([]Metadata, 0, len(m.Metadatas)) + for _, m := range m.Metadatas { + md, err := m.Metadata() + if err != nil { + return nil, fmt.Errorf("unable to construct metadata for [%+v], err: %v", m, err) + } + metadatas = append(metadatas, md) + } + return NewMap(metadatas) +} + +// MetadataConfiguration is the configuration for a single namespace +type MetadataConfiguration struct { + ID string `yaml:"id" validate:"nonzero"` + BootstrapEnabled *bool `yaml:"bootstrapEnabled"` + FlushEnabled *bool `yaml:"flushEnabled"` + WritesToCommitLog *bool `yaml:"writesToCommitLog"` + CleanupEnabled *bool `yaml:"cleanupEnabled"` + RepairEnabled *bool `yaml:"repairEnabled"` + ColdWritesEnabled *bool `yaml:"coldWritesEnabled"` + CacheBlocksOnRetrieve *bool `yaml:"cacheBlocksOnRetrieve"` + Retention retention.Configuration `yaml:"retention" validate:"nonzero"` + Index IndexConfiguration `yaml:"index"` +} + +// Metadata returns a Metadata corresponding to the receiver struct +func (mc *MetadataConfiguration) Metadata() (Metadata, error) { + iopts := mc.Index.Options() + ropts := mc.Retention.Options() + opts := NewOptions(). + SetRetentionOptions(ropts). + SetIndexOptions(iopts) + if v := mc.BootstrapEnabled; v != nil { + opts = opts.SetBootstrapEnabled(*v) + } + if v := mc.FlushEnabled; v != nil { + opts = opts.SetFlushEnabled(*v) + } + if v := mc.WritesToCommitLog; v != nil { + opts = opts.SetWritesToCommitLog(*v) + } + if v := mc.CleanupEnabled; v != nil { + opts = opts.SetCleanupEnabled(*v) + } + if v := mc.RepairEnabled; v != nil { + opts = opts.SetRepairEnabled(*v) + } + if v := mc.ColdWritesEnabled; v != nil { + opts = opts.SetColdWritesEnabled(*v) + } + if v := mc.CacheBlocksOnRetrieve; v != nil { + opts = opts.SetCacheBlocksOnRetrieve(*v) + } + return NewMetadata(ident.StringID(mc.ID), opts) +} + +// IndexConfiguration controls the knobs to tweak indexing configuration. +type IndexConfiguration struct { + Enabled bool `yaml:"enabled" validate:"nonzero"` + BlockSize time.Duration `yaml:"blockSize" validate:"nonzero"` +} + +// Options returns the IndexOptions corresponding to the receiver struct. +func (ic *IndexConfiguration) Options() IndexOptions { + return NewIndexOptions(). + SetEnabled(ic.Enabled). + SetBlockSize(ic.BlockSize) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/context.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/context.go new file mode 100644 index 00000000..217f4099 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/context.go @@ -0,0 +1,46 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "github.com/m3db/m3/src/x/ident" +) + +type Context struct { + ID ident.ID + Schema SchemaDescr +} + +func NewContextFrom(nsMetadata Metadata) Context { + ctx := Context{ID: nsMetadata.ID()} + if schema, ok := nsMetadata.Options().SchemaHistory().GetLatest(); ok { + ctx.Schema = schema + } + return ctx +} + +func NewContextFor(id ident.ID, registry SchemaRegistry) Context { + ctx := Context{ID: id} + if schema, err := registry.GetLatestSchema(id); err == nil { + ctx.Schema = schema + } + return ctx +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/convert.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/convert.go new file mode 100644 index 00000000..120b8929 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/convert.go @@ -0,0 +1,384 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "errors" + "fmt" + "strings" + "sync" + "time" + + nsproto "github.com/m3db/m3/src/dbnode/generated/proto/namespace" + "github.com/m3db/m3/src/dbnode/retention" + "github.com/m3db/m3/src/x/ident" + xtime "github.com/m3db/m3/src/x/time" + + "github.com/gogo/protobuf/proto" + protobuftypes "github.com/gogo/protobuf/types" +) + +var ( + errRetentionNil = errors.New("retention options must be set") + errNamespaceNil = errors.New("namespace options must be set") + + dynamicExtendedOptionsConverters = sync.Map{} +) + +// FromNanos converts nanoseconds to a namespace-compatible duration. +func FromNanos(n int64) time.Duration { + return xtime.FromNormalizedDuration(n, time.Nanosecond) +} + +// ToRetention converts nsproto.RetentionOptions to retention.Options +func ToRetention( + ro *nsproto.RetentionOptions, +) (retention.Options, error) { + if ro == nil { + return nil, errRetentionNil + } + + ropts := retention.NewOptions(). + SetRetentionPeriod(FromNanos(ro.RetentionPeriodNanos)). + SetFutureRetentionPeriod(FromNanos(ro.FutureRetentionPeriodNanos)). + SetBlockSize(FromNanos(ro.BlockSizeNanos)). + SetBufferFuture(FromNanos(ro.BufferFutureNanos)). + SetBufferPast(FromNanos(ro.BufferPastNanos)). + SetBlockDataExpiry(ro.BlockDataExpiry). + SetBlockDataExpiryAfterNotAccessedPeriod( + FromNanos(ro.BlockDataExpiryAfterNotAccessPeriodNanos)) + + if err := ropts.Validate(); err != nil { + return nil, err + } + + return ropts, nil +} + +// ToIndexOptions converts nsproto.IndexOptions to IndexOptions +func ToIndexOptions( + io *nsproto.IndexOptions, +) (IndexOptions, error) { + iopts := NewIndexOptions().SetEnabled(false) + if io == nil { + return iopts, nil + } + + iopts = iopts.SetEnabled(io.Enabled). + SetBlockSize(FromNanos(io.BlockSizeNanos)) + + return iopts, nil +} + +// ToRuntimeOptions converts nsproto.NamespaceRuntimeOptions to RuntimeOptions. +func ToRuntimeOptions( + opts *nsproto.NamespaceRuntimeOptions, +) (RuntimeOptions, error) { + runtimeOpts := NewRuntimeOptions() + if opts == nil { + return runtimeOpts, nil + } + if v := opts.WriteIndexingPerCPUConcurrency; v != nil { + newValue := v.Value + runtimeOpts = runtimeOpts.SetWriteIndexingPerCPUConcurrency(&newValue) + } + if v := opts.FlushIndexingPerCPUConcurrency; v != nil { + newValue := v.Value + runtimeOpts = runtimeOpts.SetFlushIndexingPerCPUConcurrency(&newValue) + } + return runtimeOpts, nil +} + +// ExtendedOptsConverter is function for converting from protobuf message to ExtendedOptions. +type ExtendedOptsConverter func(proto.Message) (ExtendedOptions, error) + +// RegisterExtendedOptionsConverter registers conversion function from protobuf message to ExtendedOptions. +func RegisterExtendedOptionsConverter(typeURLPrefix string, msg proto.Message, converter ExtendedOptsConverter) { + typeURL := typeUrlForMessage(typeURLPrefix, msg) + dynamicExtendedOptionsConverters.Store(typeURL, converter) +} + +// ToExtendedOptions converts protobuf message to ExtendedOptions. +func ToExtendedOptions( + opts *protobuftypes.Any, +) (ExtendedOptions, error) { + var extendedOpts ExtendedOptions + if opts == nil { + return extendedOpts, nil + } + + converter, ok := dynamicExtendedOptionsConverters.Load(opts.TypeUrl) + if !ok { + return nil, fmt.Errorf("dynamic ExtendedOptions converter not registered for protobuf type %s", opts.TypeUrl) + } + + var extendedOptsProto protobuftypes.DynamicAny + if err := protobuftypes.UnmarshalAny(opts, &extendedOptsProto); err != nil { + return nil, err + } + + extendedOpts, err := converter.(ExtendedOptsConverter)(extendedOptsProto.Message) + if err != nil { + return nil, err + } + + if err = extendedOpts.Validate(); err != nil { + return nil, err + } + + return extendedOpts, nil +} + +// ToMetadata converts nsproto.Options to Metadata +func ToMetadata( + id string, + opts *nsproto.NamespaceOptions, +) (Metadata, error) { + if opts == nil { + return nil, errNamespaceNil + } + + rOpts, err := ToRetention(opts.RetentionOptions) + if err != nil { + return nil, err + } + + iOpts, err := ToIndexOptions(opts.IndexOptions) + if err != nil { + return nil, err + } + + sr, err := LoadSchemaHistory(opts.GetSchemaOptions()) + if err != nil { + return nil, err + } + + runtimeOpts, err := ToRuntimeOptions(opts.RuntimeOptions) + if err != nil { + return nil, err + } + + extendedOpts, err := ToExtendedOptions(opts.ExtendedOptions) + if err != nil { + return nil, err + } + + aggOpts, err := ToAggregationOptions(opts.AggregationOptions) + if err != nil { + return nil, err + } + + mOpts := NewOptions(). + SetBootstrapEnabled(opts.BootstrapEnabled). + SetFlushEnabled(opts.FlushEnabled). + SetCleanupEnabled(opts.CleanupEnabled). + SetRepairEnabled(opts.RepairEnabled). + SetWritesToCommitLog(opts.WritesToCommitLog). + SetSnapshotEnabled(opts.SnapshotEnabled). + SetSchemaHistory(sr). + SetRetentionOptions(rOpts). + SetIndexOptions(iOpts). + SetColdWritesEnabled(opts.ColdWritesEnabled). + SetRuntimeOptions(runtimeOpts). + SetExtendedOptions(extendedOpts). + SetAggregationOptions(aggOpts) + + if opts.CacheBlocksOnRetrieve != nil { + mOpts = mOpts.SetCacheBlocksOnRetrieve(opts.CacheBlocksOnRetrieve.Value) + } + + if err := mOpts.Validate(); err != nil { + return nil, err + } + + return NewMetadata(ident.StringID(id), mOpts) +} + +// ToAggregationOptions converts nsproto.AggregationOptions to AggregationOptions. +func ToAggregationOptions(opts *nsproto.AggregationOptions) (AggregationOptions, error) { + aggOpts := NewAggregationOptions() + if opts == nil || len(opts.Aggregations) == 0 { + return aggOpts, nil + } + aggregations := make([]Aggregation, 0, len(opts.Aggregations)) + for _, agg := range opts.Aggregations { + if agg.Aggregated { + if agg.Attributes == nil { + return nil, errors.New("must set Attributes when aggregated is true") + } + + var dsOpts DownsampleOptions + if agg.Attributes.DownsampleOptions == nil { + dsOpts = NewDownsampleOptions(true) + } else { + dsOpts = NewDownsampleOptions(agg.Attributes.DownsampleOptions.All) + } + + attrs, err := NewAggregatedAttributes(time.Duration(agg.Attributes.ResolutionNanos), dsOpts) + if err != nil { + return nil, err + } + aggregations = append(aggregations, NewAggregatedAggregation(attrs)) + } else { + aggregations = append(aggregations, NewUnaggregatedAggregation()) + } + } + return aggOpts.SetAggregations(aggregations), nil +} + +// ToProto converts Map to nsproto.Registry +func ToProto(m Map) (*nsproto.Registry, error) { + reg := nsproto.Registry{ + Namespaces: make(map[string]*nsproto.NamespaceOptions, len(m.Metadatas())), + } + + for _, md := range m.Metadatas() { + protoMsg, err := OptionsToProto(md.Options()) + if err != nil { + return nil, err + } + reg.Namespaces[md.ID().String()] = protoMsg + } + + return ®, nil +} + +// FromProto converts nsproto.Registry -> Map +func FromProto(protoRegistry nsproto.Registry) (Map, error) { + metadatas := make([]Metadata, 0, len(protoRegistry.Namespaces)) + for ns, opts := range protoRegistry.Namespaces { + md, err := ToMetadata(ns, opts) + if err != nil { + return nil, err + } + metadatas = append(metadatas, md) + } + return NewMap(metadatas) +} + +// OptionsToProto converts Options -> nsproto.NamespaceOptions +func OptionsToProto(opts Options) (*nsproto.NamespaceOptions, error) { + extendedOpts, err := toExtendedOptions(opts.ExtendedOptions()) + if err != nil { + return nil, err + } + + ropts := opts.RetentionOptions() + iopts := opts.IndexOptions() + + nsOpts := &nsproto.NamespaceOptions{ + BootstrapEnabled: opts.BootstrapEnabled(), + FlushEnabled: opts.FlushEnabled(), + CleanupEnabled: opts.CleanupEnabled(), + SnapshotEnabled: opts.SnapshotEnabled(), + RepairEnabled: opts.RepairEnabled(), + WritesToCommitLog: opts.WritesToCommitLog(), + SchemaOptions: toSchemaOptions(opts.SchemaHistory()), + RetentionOptions: &nsproto.RetentionOptions{ + BlockSizeNanos: ropts.BlockSize().Nanoseconds(), + RetentionPeriodNanos: ropts.RetentionPeriod().Nanoseconds(), + FutureRetentionPeriodNanos: ropts.FutureRetentionPeriod().Nanoseconds(), + BufferFutureNanos: ropts.BufferFuture().Nanoseconds(), + BufferPastNanos: ropts.BufferPast().Nanoseconds(), + BlockDataExpiry: ropts.BlockDataExpiry(), + BlockDataExpiryAfterNotAccessPeriodNanos: ropts.BlockDataExpiryAfterNotAccessedPeriod().Nanoseconds(), + }, + IndexOptions: &nsproto.IndexOptions{ + Enabled: iopts.Enabled(), + BlockSizeNanos: iopts.BlockSize().Nanoseconds(), + }, + ColdWritesEnabled: opts.ColdWritesEnabled(), + RuntimeOptions: toRuntimeOptions(opts.RuntimeOptions()), + CacheBlocksOnRetrieve: &protobuftypes.BoolValue{Value: opts.CacheBlocksOnRetrieve()}, + ExtendedOptions: extendedOpts, + AggregationOptions: toProtoAggregationOptions(opts.AggregationOptions()), + } + + return nsOpts, nil +} + +func toProtoAggregationOptions(aggOpts AggregationOptions) *nsproto.AggregationOptions { + if aggOpts == nil || len(aggOpts.Aggregations()) == 0 { + return nil + } + protoAggs := make([]*nsproto.Aggregation, 0, len(aggOpts.Aggregations())) + for _, agg := range aggOpts.Aggregations() { + protoAgg := nsproto.Aggregation{Aggregated: agg.Aggregated} + if agg.Aggregated { + protoAgg.Attributes = &nsproto.AggregatedAttributes{ + ResolutionNanos: agg.Attributes.Resolution.Nanoseconds(), + DownsampleOptions: &nsproto.DownsampleOptions{All: agg.Attributes.DownsampleOptions.All}, + } + } + protoAggs = append(protoAggs, &protoAgg) + } + return &nsproto.AggregationOptions{Aggregations: protoAggs} +} + +// toRuntimeOptions returns the corresponding RuntimeOptions proto. +func toRuntimeOptions(opts RuntimeOptions) *nsproto.NamespaceRuntimeOptions { + if opts == nil || opts.IsDefault() { + return nil + } + var ( + writeIndexingPerCPUConcurrency *protobuftypes.DoubleValue + flushIndexingPerCPUConcurrency *protobuftypes.DoubleValue + ) + if v := opts.WriteIndexingPerCPUConcurrency(); v != nil { + writeIndexingPerCPUConcurrency = &protobuftypes.DoubleValue{ + Value: *v, + } + } + if v := opts.FlushIndexingPerCPUConcurrency(); v != nil { + flushIndexingPerCPUConcurrency = &protobuftypes.DoubleValue{ + Value: *v, + } + } + return &nsproto.NamespaceRuntimeOptions{ + WriteIndexingPerCPUConcurrency: writeIndexingPerCPUConcurrency, + FlushIndexingPerCPUConcurrency: flushIndexingPerCPUConcurrency, + } +} + +// toExtendedOptions returns the corresponding ExtendedOptions proto. +func toExtendedOptions(opts ExtendedOptions) (*protobuftypes.Any, error) { + if opts == nil { + return nil, nil + } + + protoMsg, typeURLPrefix := opts.ToProto() + serialized, err := proto.Marshal(protoMsg) + if err != nil { + return nil, err + } + + return &protobuftypes.Any{ + TypeUrl: typeUrlForMessage(typeURLPrefix, protoMsg), + Value: serialized, + }, nil +} + +func typeUrlForMessage(typeURLPrefix string, msg proto.Message) string { + if !strings.HasSuffix(typeURLPrefix, "/") { + typeURLPrefix += "/" + } + return typeURLPrefix + proto.MessageName(msg) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/dynamic.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/dynamic.go new file mode 100644 index 00000000..d76a9f7a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/dynamic.go @@ -0,0 +1,264 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "errors" + "sync" + "time" + + "github.com/m3db/m3/src/cluster/kv" + nsproto "github.com/m3db/m3/src/dbnode/generated/proto/namespace" + xwatch "github.com/m3db/m3/src/x/watch" + + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +var ( + errRegistryAlreadyClosed = errors.New("registry already closed") + errInvalidRegistry = errors.New("could not parse latest value from config service") +) + +type dynamicInitializer struct { + sync.Mutex + opts DynamicOptions + reg Registry +} + +// NewDynamicInitializer returns a dynamic namespace initializer +func NewDynamicInitializer(opts DynamicOptions) Initializer { + return &dynamicInitializer{opts: opts} +} + +func (i *dynamicInitializer) Init() (Registry, error) { + i.Lock() + defer i.Unlock() + + if i.reg != nil { + return i.reg, nil + } + + if err := i.opts.Validate(); err != nil { + return nil, err + } + + reg, err := newDynamicRegistry(i.opts) + if err != nil { + return nil, err + } + + i.reg = reg + return i.reg, nil +} + +type dynamicRegistry struct { + sync.RWMutex + opts DynamicOptions + logger *zap.Logger + metrics dynamicRegistryMetrics + watchable xwatch.Watchable + kvWatch kv.ValueWatch + currentValue kv.Value + currentMap Map + closed bool +} + +type dynamicRegistryMetrics struct { + numInvalidUpdates tally.Counter + currentVersion tally.Gauge +} + +func newDynamicRegistryMetrics(opts DynamicOptions) dynamicRegistryMetrics { + scope := opts.InstrumentOptions().MetricsScope().SubScope("namespace-registry") + return dynamicRegistryMetrics{ + numInvalidUpdates: scope.Counter("invalid-update"), + currentVersion: scope.Gauge("current-version"), + } +} + +func newDynamicRegistry(opts DynamicOptions) (Registry, error) { + kvStore, err := opts.ConfigServiceClient().KV() + if err != nil { + return nil, err + } + + watch, err := kvStore.Watch(opts.NamespaceRegistryKey()) + if err != nil { + return nil, err + } + + logger := opts.InstrumentOptions().Logger() + logger.Info("waiting for dynamic namespace registry initialization, " + + "if this takes a long time, make sure that a namespace is configured") + <-watch.C() + logger.Info("initial namespace value received") + + initValue := watch.Get() + m, err := getMapFromUpdate(initValue, opts.ForceColdWritesEnabled()) + if err != nil { + logger.Error("dynamic namespace registry received invalid initial value", zap.Error(err)) + return nil, err + } + + watchable := xwatch.NewWatchable() + watchable.Update(m) + + dt := &dynamicRegistry{ + opts: opts, + logger: logger, + metrics: newDynamicRegistryMetrics(opts), + watchable: watchable, + kvWatch: watch, + currentValue: initValue, + currentMap: m, + } + go dt.run() + go dt.reportMetrics() + return dt, nil +} + +func (r *dynamicRegistry) isClosed() bool { + r.RLock() + closed := r.closed + r.RUnlock() + return closed +} + +func (r *dynamicRegistry) value() kv.Value { + r.RLock() + defer r.RUnlock() + return r.currentValue +} + +func (r *dynamicRegistry) maps() Map { + r.RLock() + defer r.RUnlock() + return r.currentMap +} + +func (r *dynamicRegistry) reportMetrics() { + ticker := time.NewTicker(r.opts.InstrumentOptions().ReportInterval()) + defer ticker.Stop() + + for range ticker.C { + if r.isClosed() { + return + } + + r.metrics.currentVersion.Update(float64(r.value().Version())) + } +} + +func (r *dynamicRegistry) run() { + for !r.isClosed() { + if _, ok := <-r.kvWatch.C(); !ok { + r.Close() + break + } + + val := r.kvWatch.Get() + if val == nil { + r.metrics.numInvalidUpdates.Inc(1) + r.logger.Warn("dynamic namespace registry received nil, skipping") + continue + } + + if !val.IsNewer(r.currentValue) { + r.metrics.numInvalidUpdates.Inc(1) + r.logger.Warn("dynamic namespace registry received older version, skipping", + zap.Int("version", val.Version())) + continue + } + + m, err := getMapFromUpdate(val, r.opts.ForceColdWritesEnabled()) + if err != nil { + r.metrics.numInvalidUpdates.Inc(1) + r.logger.Warn("dynamic namespace registry received invalid update, skipping", + zap.Error(err)) + continue + } + + if m.Equal(r.maps()) { + r.metrics.numInvalidUpdates.Inc(1) + r.logger.Warn("dynamic namespace registry received identical update, skipping", + zap.Int("version", val.Version())) + continue + } + + r.logger.Info("dynamic namespace registry updated to version", + zap.Int("version", val.Version())) + r.Lock() + r.currentValue = val + r.currentMap = m + r.watchable.Update(m) + r.Unlock() + } +} + +func (r *dynamicRegistry) Watch() (Watch, error) { + _, w, err := r.watchable.Watch() + if err != nil { + return nil, err + } + return NewWatch(w), err +} + +func (r *dynamicRegistry) Close() error { + r.Lock() + defer r.Unlock() + + if r.closed { + return errRegistryAlreadyClosed + } + + r.closed = true + + r.kvWatch.Close() + r.watchable.Close() + return nil +} + +func getMapFromUpdate(val kv.Value, forceColdWritesEnabled bool) (Map, error) { + if val == nil { + return nil, errInvalidRegistry + } + + var protoRegistry nsproto.Registry + if err := val.Unmarshal(&protoRegistry); err != nil { + return nil, errInvalidRegistry + } + + m, err := FromProto(protoRegistry) + if err != nil { + return nil, err + } + + // NB(bodu): Force cold writes to be enabled for all ns if specified. + if forceColdWritesEnabled { + m, err = NewMap(ForceColdWritesEnabledForMetadatas(m.Metadatas())) + if err != nil { + return nil, err + } + } + + return m, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/dynamic_options.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/dynamic_options.go new file mode 100644 index 00000000..fdd427b9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/dynamic_options.go @@ -0,0 +1,110 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "errors" + "time" + + "github.com/m3db/m3/src/cluster/client" + "github.com/m3db/m3/src/x/instrument" +) + +const ( + defaultInitTimeout = 30 * time.Second + defaultNsRegistryKey = "m3db.node.namespace_registry" +) + +var ( + errInitTimeoutPositive = errors.New("init timeout must be positive") + errNsRegistryKeyEmpty = errors.New("namespace registry key must not be empty") + errCsClientNotSet = errors.New("config service client not set") +) + +type dynamicOpts struct { + iopts instrument.Options + csClient client.Client + nsRegistryKey string + initTimeout time.Duration + forceColdWritesEnabled bool +} + +// NewDynamicOptions creates a new DynamicOptions +func NewDynamicOptions() DynamicOptions { + return &dynamicOpts{ + iopts: instrument.NewOptions(), + nsRegistryKey: defaultNsRegistryKey, + initTimeout: defaultInitTimeout, + } +} + +func (o *dynamicOpts) Validate() error { + if o.initTimeout <= 0 { + return errInitTimeoutPositive + } + if o.nsRegistryKey == "" { + return errNsRegistryKeyEmpty + } + if o.csClient == nil { + return errCsClientNotSet + } + return nil +} + +func (o *dynamicOpts) SetInstrumentOptions(value instrument.Options) DynamicOptions { + opts := *o + opts.iopts = value + return &opts +} + +func (o *dynamicOpts) InstrumentOptions() instrument.Options { + return o.iopts +} + +func (o *dynamicOpts) SetConfigServiceClient(c client.Client) DynamicOptions { + opts := *o + opts.csClient = c + return &opts +} + +func (o *dynamicOpts) ConfigServiceClient() client.Client { + return o.csClient +} + +func (o *dynamicOpts) SetNamespaceRegistryKey(k string) DynamicOptions { + opts := *o + opts.nsRegistryKey = k + return &opts +} + +func (o *dynamicOpts) NamespaceRegistryKey() string { + return o.nsRegistryKey +} + +func (o *dynamicOpts) SetForceColdWritesEnabled(enabled bool) DynamicOptions { + opts := *o + opts.forceColdWritesEnabled = enabled + return &opts +} + +func (o *dynamicOpts) ForceColdWritesEnabled() bool { + return o.forceColdWritesEnabled +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/index_options.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/index_options.go new file mode 100644 index 00000000..aca2e4c8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/index_options.go @@ -0,0 +1,71 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "time" +) + +var ( + // defaultIndexEnabled disables indexing by default. + defaultIndexEnabled = false + + // defaultIndexBlockSize is the default block size for index blocks. + defaultIndexBlockSize = 2 * time.Hour +) + +type indexOpts struct { + enabled bool + blockSize time.Duration +} + +// NewIndexOptions returns a new IndexOptions. +func NewIndexOptions() IndexOptions { + return &indexOpts{ + enabled: defaultIndexEnabled, + blockSize: defaultIndexBlockSize, + } +} + +func (i *indexOpts) Equal(value IndexOptions) bool { + return i.Enabled() == value.Enabled() && + i.BlockSize() == value.BlockSize() +} + +func (i *indexOpts) SetEnabled(value bool) IndexOptions { + io := *i + io.enabled = value + return &io +} + +func (i *indexOpts) Enabled() bool { + return i.enabled +} + +func (i *indexOpts) SetBlockSize(value time.Duration) IndexOptions { + io := *i + io.blockSize = value + return &io +} + +func (i *indexOpts) BlockSize() time.Duration { + return i.blockSize +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/map.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/map.go new file mode 100644 index 00000000..c4b93920 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/map.go @@ -0,0 +1,120 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "errors" + "fmt" + + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" +) + +var ( + errEmptyMetadatas = errors.New("no namespace metadata provided") +) + +type nsMap struct { + namespaces *metadataMap + ids []ident.ID + metadatas []Metadata +} + +// NewMap returns a new registry containing provided metadatas, +// providing a consistent order. +func NewMap(metadatas []Metadata) (Map, error) { + if len(metadatas) == 0 { + return nil, errEmptyMetadatas + } + + var ( + ns = newMetadataMap(metadataMapOptions{}) + ids = make([]ident.ID, 0, len(metadatas)) + nsMetadatas = make([]Metadata, 0, len(metadatas)) + multiErr xerrors.MultiError + ) + for _, m := range metadatas { + id := m.ID() + ids = append(ids, id) + nsMetadatas = append(nsMetadatas, m) + + if _, ok := ns.Get(id); ok { + multiErr = multiErr.Add(fmt.Errorf( + "namespace ids must be unique, duplicate found: %v", id.String())) + } + ns.Set(id, m) + } + + if err := multiErr.FinalError(); err != nil { + return nil, err + } + + return &nsMap{ + namespaces: ns, + ids: ids, + metadatas: nsMetadatas, + }, nil +} + +func (r *nsMap) Get(namespace ident.ID) (Metadata, error) { + metadata, ok := r.namespaces.Get(namespace) + if !ok { + return nil, fmt.Errorf("unable to find namespace (%v) in registry", namespace.String()) + } + return metadata, nil +} + +func (r *nsMap) IDs() []ident.ID { + return r.ids +} + +func (r *nsMap) Metadatas() []Metadata { + return r.metadatas +} + +func (r *nsMap) Equal(value Map) bool { + // short circuit ptr equals + if value == r { + return true + } + + ourMds := r.Metadatas() + theirMds := value.Metadatas() + if len(ourMds) != len(theirMds) { + return false + } + + // O(n**2) test, not a big deal because this is only 3-5 elements + for _, om := range ourMds { + found := false + for _, tm := range theirMds { + if om.Equal(tm) { + found = true + break + } + } + if !found { + return false + } + } + + return true +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata.go new file mode 100644 index 00000000..7cce34e5 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata.go @@ -0,0 +1,85 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "errors" + "fmt" + + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/ident" +) + +var ( + errIDNotSet = errors.New("namespace ID is not set") + errOptsNotSet = errors.New("namespace options are not set") +) + +type metadata struct { + id ident.ID + opts Options +} + +// NewMetadata creates a new namespace metadata +func NewMetadata(id ident.ID, opts Options) (Metadata, error) { + if id == nil || id.String() == "" { + return nil, errIDNotSet + } + + if opts == nil { + return nil, errOptsNotSet + } + + if err := opts.Validate(); err != nil { + return nil, fmt.Errorf("unable to validate options: %v", err) + + } + + copiedID := checked.NewBytes(append([]byte(nil), id.Bytes()...), nil) + return &metadata{ + id: ident.BinaryID(copiedID), + opts: opts, + }, nil +} + +func (m *metadata) ID() ident.ID { + return m.id +} + +func (m *metadata) Options() Options { + return m.opts +} + +func (m *metadata) Equal(value Metadata) bool { + return m.id.Equal(value.ID()) && m.Options().Equal(value.Options()) +} + +// ForceColdWritesEnabledForMetadatas forces cold writes to be enabled for all ns. +func ForceColdWritesEnabledForMetadatas(metadatas []Metadata) []Metadata { + mds := make([]Metadata, 0, len(metadatas)) + for _, md := range metadatas { + mds = append(mds, &metadata{ + id: md.ID(), + opts: md.Options().SetColdWritesEnabled(true), + }) + } + return mds +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_map_gen.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_map_gen.go new file mode 100644 index 00000000..6185062b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_map_gen.go @@ -0,0 +1,299 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package namespace + +import ( + "github.com/m3db/m3/src/x/ident" +) + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// metadataMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type metadataMapHash uint64 + +// metadataMapHashFn is the hash function to execute when hashing a key. +type metadataMapHashFn func(ident.ID) metadataMapHash + +// metadataMapEqualsFn is the equals key function to execute when detecting equality of a key. +type metadataMapEqualsFn func(ident.ID, ident.ID) bool + +// metadataMapCopyFn is the copy key function to execute when copying the key. +type metadataMapCopyFn func(ident.ID) ident.ID + +// metadataMapFinalizeFn is the finalize key function to execute when finished with a key. +type metadataMapFinalizeFn func(ident.ID) + +// metadataMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// metadataMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type metadataMap struct { + _metadataMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[metadataMapHash]metadataMapEntry +} + +// _metadataMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _metadataMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash metadataMapHashFn + // equals is the equals key function to execute when detecting equality. + equals metadataMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy metadataMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize metadataMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// metadataMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type metadataMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _metadataMapKey + // value type stored + value Metadata +} + +type _metadataMapKey struct { + key ident.ID + finalize bool +} + +// Key returns the map entry key. +func (e metadataMapEntry) Key() ident.ID { + return e.key.key +} + +// Value returns the map entry value. +func (e metadataMapEntry) Value() Metadata { + return e.value +} + +// _metadataMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _metadataMapAlloc(opts _metadataMapOptions) *metadataMap { + m := &metadataMap{_metadataMapOptions: opts} + m.Reallocate() + return m +} + +func (m *metadataMap) newMapKey(k ident.ID, opts _metadataMapKeyOptions) _metadataMapKey { + key := _metadataMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *metadataMap) removeMapKey(hash metadataMapHash, key _metadataMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *metadataMap) Get(k ident.ID) (Metadata, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty Metadata + return empty, false +} + +// Set will set the value for an identifier. +func (m *metadataMap) Set(k ident.ID, v Metadata) { + m.set(k, v, _metadataMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// metadataMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type metadataMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *metadataMap) SetUnsafe(k ident.ID, v Metadata, opts metadataMapSetUnsafeOptions) { + m.set(k, v, _metadataMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _metadataMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *metadataMap) set(k ident.ID, v Metadata, opts _metadataMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = metadataMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = metadataMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *metadataMap) Iter() map[metadataMapHash]metadataMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *metadataMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *metadataMap) Contains(k ident.ID) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *metadataMap) Delete(k ident.ID) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *metadataMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *metadataMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[metadataMapHash]metadataMapEntry, m.initialSize) + } else { + m.lookup = make(map[metadataMapHash]metadataMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_matcher.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_matcher.go new file mode 100644 index 00000000..45008343 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_matcher.go @@ -0,0 +1,53 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "fmt" + + "github.com/golang/mock/gomock" +) + +// MetadataMatcher is a gomock.Matcher that matches metadata +type MetadataMatcher interface { + gomock.Matcher +} + +// NewMetadataMatcher returns a new MetadataMatcher +func NewMetadataMatcher(md Metadata) MetadataMatcher { + return &mdMatcher{md: md} +} + +type mdMatcher struct { + md Metadata +} + +func (m *mdMatcher) Matches(x interface{}) bool { + omd, ok := x.(Metadata) + if !ok { + return false + } + return m.md.Equal(omd) +} + +func (m *mdMatcher) String() string { + return fmt.Sprintf("metadata [ id = %s ]", m.md.ID().String()) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_new_map_gen.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_new_map_gen.go new file mode 100644 index 00000000..91ddfa6d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/metadata_new_map_gen.go @@ -0,0 +1,95 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package namespace + +import ( + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + + "github.com/cespare/xxhash/v2" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// metadataMapOptions provides options used when created the map. +type metadataMapOptions struct { + InitialSize int + KeyCopyPool pool.BytesPool +} + +// newMetadataMap returns a new byte keyed map. +func newMetadataMap(opts metadataMapOptions) *metadataMap { + var ( + copyFn metadataMapCopyFn + finalizeFn metadataMapFinalizeFn + ) + if pool := opts.KeyCopyPool; pool == nil { + copyFn = func(k ident.ID) ident.ID { + return ident.BytesID(append([]byte(nil), k.Bytes()...)) + } + } else { + copyFn = func(k ident.ID) ident.ID { + bytes := k.Bytes() + keyLen := len(bytes) + pooled := pool.Get(keyLen)[:keyLen] + copy(pooled, bytes) + return ident.BytesID(pooled) + } + finalizeFn = func(k ident.ID) { + if slice, ok := k.(ident.BytesID); ok { + pool.Put(slice) + } + } + } + return _metadataMapAlloc(_metadataMapOptions{ + hash: func(id ident.ID) metadataMapHash { + return metadataMapHash(xxhash.Sum64(id.Bytes())) + }, + equals: func(x, y ident.ID) bool { + return x.Equal(y) + }, + copy: copyFn, + finalize: finalizeFn, + initialSize: opts.InitialSize, + }) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_mock.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_mock.go new file mode 100644 index 00000000..c8f8222f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_mock.go @@ -0,0 +1,1509 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/namespace/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package namespace is a generated GoMock package. +package namespace + +import ( + "reflect" + "time" + + "github.com/m3db/m3/src/cluster/client" + "github.com/m3db/m3/src/dbnode/retention" + "github.com/m3db/m3/src/x/close" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + + "github.com/gogo/protobuf/proto" + "github.com/golang/mock/gomock" +) + +// MockOptions is a mock of Options interface +type MockOptions struct { + ctrl *gomock.Controller + recorder *MockOptionsMockRecorder +} + +// MockOptionsMockRecorder is the mock recorder for MockOptions +type MockOptionsMockRecorder struct { + mock *MockOptions +} + +// NewMockOptions creates a new mock instance +func NewMockOptions(ctrl *gomock.Controller) *MockOptions { + mock := &MockOptions{ctrl: ctrl} + mock.recorder = &MockOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptions) EXPECT() *MockOptionsMockRecorder { + return m.recorder +} + +// Validate mocks base method +func (m *MockOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockOptions)(nil).Validate)) +} + +// Equal mocks base method +func (m *MockOptions) Equal(value Options) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", value) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockOptionsMockRecorder) Equal(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockOptions)(nil).Equal), value) +} + +// SetBootstrapEnabled mocks base method +func (m *MockOptions) SetBootstrapEnabled(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBootstrapEnabled", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBootstrapEnabled indicates an expected call of SetBootstrapEnabled +func (mr *MockOptionsMockRecorder) SetBootstrapEnabled(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBootstrapEnabled", reflect.TypeOf((*MockOptions)(nil).SetBootstrapEnabled), value) +} + +// BootstrapEnabled mocks base method +func (m *MockOptions) BootstrapEnabled() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BootstrapEnabled") + ret0, _ := ret[0].(bool) + return ret0 +} + +// BootstrapEnabled indicates an expected call of BootstrapEnabled +func (mr *MockOptionsMockRecorder) BootstrapEnabled() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BootstrapEnabled", reflect.TypeOf((*MockOptions)(nil).BootstrapEnabled)) +} + +// SetFlushEnabled mocks base method +func (m *MockOptions) SetFlushEnabled(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFlushEnabled", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFlushEnabled indicates an expected call of SetFlushEnabled +func (mr *MockOptionsMockRecorder) SetFlushEnabled(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFlushEnabled", reflect.TypeOf((*MockOptions)(nil).SetFlushEnabled), value) +} + +// FlushEnabled mocks base method +func (m *MockOptions) FlushEnabled() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FlushEnabled") + ret0, _ := ret[0].(bool) + return ret0 +} + +// FlushEnabled indicates an expected call of FlushEnabled +func (mr *MockOptionsMockRecorder) FlushEnabled() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FlushEnabled", reflect.TypeOf((*MockOptions)(nil).FlushEnabled)) +} + +// SetSnapshotEnabled mocks base method +func (m *MockOptions) SetSnapshotEnabled(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSnapshotEnabled", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetSnapshotEnabled indicates an expected call of SetSnapshotEnabled +func (mr *MockOptionsMockRecorder) SetSnapshotEnabled(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSnapshotEnabled", reflect.TypeOf((*MockOptions)(nil).SetSnapshotEnabled), value) +} + +// SnapshotEnabled mocks base method +func (m *MockOptions) SnapshotEnabled() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SnapshotEnabled") + ret0, _ := ret[0].(bool) + return ret0 +} + +// SnapshotEnabled indicates an expected call of SnapshotEnabled +func (mr *MockOptionsMockRecorder) SnapshotEnabled() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SnapshotEnabled", reflect.TypeOf((*MockOptions)(nil).SnapshotEnabled)) +} + +// SetWritesToCommitLog mocks base method +func (m *MockOptions) SetWritesToCommitLog(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWritesToCommitLog", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWritesToCommitLog indicates an expected call of SetWritesToCommitLog +func (mr *MockOptionsMockRecorder) SetWritesToCommitLog(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWritesToCommitLog", reflect.TypeOf((*MockOptions)(nil).SetWritesToCommitLog), value) +} + +// WritesToCommitLog mocks base method +func (m *MockOptions) WritesToCommitLog() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WritesToCommitLog") + ret0, _ := ret[0].(bool) + return ret0 +} + +// WritesToCommitLog indicates an expected call of WritesToCommitLog +func (mr *MockOptionsMockRecorder) WritesToCommitLog() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WritesToCommitLog", reflect.TypeOf((*MockOptions)(nil).WritesToCommitLog)) +} + +// SetCleanupEnabled mocks base method +func (m *MockOptions) SetCleanupEnabled(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCleanupEnabled", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetCleanupEnabled indicates an expected call of SetCleanupEnabled +func (mr *MockOptionsMockRecorder) SetCleanupEnabled(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCleanupEnabled", reflect.TypeOf((*MockOptions)(nil).SetCleanupEnabled), value) +} + +// CleanupEnabled mocks base method +func (m *MockOptions) CleanupEnabled() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CleanupEnabled") + ret0, _ := ret[0].(bool) + return ret0 +} + +// CleanupEnabled indicates an expected call of CleanupEnabled +func (mr *MockOptionsMockRecorder) CleanupEnabled() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CleanupEnabled", reflect.TypeOf((*MockOptions)(nil).CleanupEnabled)) +} + +// SetRepairEnabled mocks base method +func (m *MockOptions) SetRepairEnabled(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetRepairEnabled", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetRepairEnabled indicates an expected call of SetRepairEnabled +func (mr *MockOptionsMockRecorder) SetRepairEnabled(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetRepairEnabled", reflect.TypeOf((*MockOptions)(nil).SetRepairEnabled), value) +} + +// RepairEnabled mocks base method +func (m *MockOptions) RepairEnabled() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RepairEnabled") + ret0, _ := ret[0].(bool) + return ret0 +} + +// RepairEnabled indicates an expected call of RepairEnabled +func (mr *MockOptionsMockRecorder) RepairEnabled() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RepairEnabled", reflect.TypeOf((*MockOptions)(nil).RepairEnabled)) +} + +// SetColdWritesEnabled mocks base method +func (m *MockOptions) SetColdWritesEnabled(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetColdWritesEnabled", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetColdWritesEnabled indicates an expected call of SetColdWritesEnabled +func (mr *MockOptionsMockRecorder) SetColdWritesEnabled(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetColdWritesEnabled", reflect.TypeOf((*MockOptions)(nil).SetColdWritesEnabled), value) +} + +// ColdWritesEnabled mocks base method +func (m *MockOptions) ColdWritesEnabled() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ColdWritesEnabled") + ret0, _ := ret[0].(bool) + return ret0 +} + +// ColdWritesEnabled indicates an expected call of ColdWritesEnabled +func (mr *MockOptionsMockRecorder) ColdWritesEnabled() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ColdWritesEnabled", reflect.TypeOf((*MockOptions)(nil).ColdWritesEnabled)) +} + +// SetCacheBlocksOnRetrieve mocks base method +func (m *MockOptions) SetCacheBlocksOnRetrieve(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCacheBlocksOnRetrieve", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetCacheBlocksOnRetrieve indicates an expected call of SetCacheBlocksOnRetrieve +func (mr *MockOptionsMockRecorder) SetCacheBlocksOnRetrieve(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCacheBlocksOnRetrieve", reflect.TypeOf((*MockOptions)(nil).SetCacheBlocksOnRetrieve), value) +} + +// CacheBlocksOnRetrieve mocks base method +func (m *MockOptions) CacheBlocksOnRetrieve() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CacheBlocksOnRetrieve") + ret0, _ := ret[0].(bool) + return ret0 +} + +// CacheBlocksOnRetrieve indicates an expected call of CacheBlocksOnRetrieve +func (mr *MockOptionsMockRecorder) CacheBlocksOnRetrieve() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CacheBlocksOnRetrieve", reflect.TypeOf((*MockOptions)(nil).CacheBlocksOnRetrieve)) +} + +// SetRetentionOptions mocks base method +func (m *MockOptions) SetRetentionOptions(value retention.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetRetentionOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetRetentionOptions indicates an expected call of SetRetentionOptions +func (mr *MockOptionsMockRecorder) SetRetentionOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetRetentionOptions", reflect.TypeOf((*MockOptions)(nil).SetRetentionOptions), value) +} + +// RetentionOptions mocks base method +func (m *MockOptions) RetentionOptions() retention.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RetentionOptions") + ret0, _ := ret[0].(retention.Options) + return ret0 +} + +// RetentionOptions indicates an expected call of RetentionOptions +func (mr *MockOptionsMockRecorder) RetentionOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RetentionOptions", reflect.TypeOf((*MockOptions)(nil).RetentionOptions)) +} + +// SetIndexOptions mocks base method +func (m *MockOptions) SetIndexOptions(value IndexOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIndexOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIndexOptions indicates an expected call of SetIndexOptions +func (mr *MockOptionsMockRecorder) SetIndexOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIndexOptions", reflect.TypeOf((*MockOptions)(nil).SetIndexOptions), value) +} + +// IndexOptions mocks base method +func (m *MockOptions) IndexOptions() IndexOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IndexOptions") + ret0, _ := ret[0].(IndexOptions) + return ret0 +} + +// IndexOptions indicates an expected call of IndexOptions +func (mr *MockOptionsMockRecorder) IndexOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IndexOptions", reflect.TypeOf((*MockOptions)(nil).IndexOptions)) +} + +// SetSchemaHistory mocks base method +func (m *MockOptions) SetSchemaHistory(value SchemaHistory) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSchemaHistory", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetSchemaHistory indicates an expected call of SetSchemaHistory +func (mr *MockOptionsMockRecorder) SetSchemaHistory(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSchemaHistory", reflect.TypeOf((*MockOptions)(nil).SetSchemaHistory), value) +} + +// SchemaHistory mocks base method +func (m *MockOptions) SchemaHistory() SchemaHistory { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SchemaHistory") + ret0, _ := ret[0].(SchemaHistory) + return ret0 +} + +// SchemaHistory indicates an expected call of SchemaHistory +func (mr *MockOptionsMockRecorder) SchemaHistory() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SchemaHistory", reflect.TypeOf((*MockOptions)(nil).SchemaHistory)) +} + +// SetRuntimeOptions mocks base method +func (m *MockOptions) SetRuntimeOptions(value RuntimeOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetRuntimeOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetRuntimeOptions indicates an expected call of SetRuntimeOptions +func (mr *MockOptionsMockRecorder) SetRuntimeOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetRuntimeOptions", reflect.TypeOf((*MockOptions)(nil).SetRuntimeOptions), value) +} + +// RuntimeOptions mocks base method +func (m *MockOptions) RuntimeOptions() RuntimeOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RuntimeOptions") + ret0, _ := ret[0].(RuntimeOptions) + return ret0 +} + +// RuntimeOptions indicates an expected call of RuntimeOptions +func (mr *MockOptionsMockRecorder) RuntimeOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RuntimeOptions", reflect.TypeOf((*MockOptions)(nil).RuntimeOptions)) +} + +// SetExtendedOptions mocks base method +func (m *MockOptions) SetExtendedOptions(value ExtendedOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetExtendedOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetExtendedOptions indicates an expected call of SetExtendedOptions +func (mr *MockOptionsMockRecorder) SetExtendedOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetExtendedOptions", reflect.TypeOf((*MockOptions)(nil).SetExtendedOptions), value) +} + +// ExtendedOptions mocks base method +func (m *MockOptions) ExtendedOptions() ExtendedOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ExtendedOptions") + ret0, _ := ret[0].(ExtendedOptions) + return ret0 +} + +// ExtendedOptions indicates an expected call of ExtendedOptions +func (mr *MockOptionsMockRecorder) ExtendedOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExtendedOptions", reflect.TypeOf((*MockOptions)(nil).ExtendedOptions)) +} + +// SetAggregationOptions mocks base method +func (m *MockOptions) SetAggregationOptions(value AggregationOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAggregationOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAggregationOptions indicates an expected call of SetAggregationOptions +func (mr *MockOptionsMockRecorder) SetAggregationOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAggregationOptions", reflect.TypeOf((*MockOptions)(nil).SetAggregationOptions), value) +} + +// AggregationOptions mocks base method +func (m *MockOptions) AggregationOptions() AggregationOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregationOptions") + ret0, _ := ret[0].(AggregationOptions) + return ret0 +} + +// AggregationOptions indicates an expected call of AggregationOptions +func (mr *MockOptionsMockRecorder) AggregationOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregationOptions", reflect.TypeOf((*MockOptions)(nil).AggregationOptions)) +} + +// MockIndexOptions is a mock of IndexOptions interface +type MockIndexOptions struct { + ctrl *gomock.Controller + recorder *MockIndexOptionsMockRecorder +} + +// MockIndexOptionsMockRecorder is the mock recorder for MockIndexOptions +type MockIndexOptionsMockRecorder struct { + mock *MockIndexOptions +} + +// NewMockIndexOptions creates a new mock instance +func NewMockIndexOptions(ctrl *gomock.Controller) *MockIndexOptions { + mock := &MockIndexOptions{ctrl: ctrl} + mock.recorder = &MockIndexOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIndexOptions) EXPECT() *MockIndexOptionsMockRecorder { + return m.recorder +} + +// Equal mocks base method +func (m *MockIndexOptions) Equal(value IndexOptions) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", value) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockIndexOptionsMockRecorder) Equal(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockIndexOptions)(nil).Equal), value) +} + +// SetEnabled mocks base method +func (m *MockIndexOptions) SetEnabled(value bool) IndexOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEnabled", value) + ret0, _ := ret[0].(IndexOptions) + return ret0 +} + +// SetEnabled indicates an expected call of SetEnabled +func (mr *MockIndexOptionsMockRecorder) SetEnabled(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEnabled", reflect.TypeOf((*MockIndexOptions)(nil).SetEnabled), value) +} + +// Enabled mocks base method +func (m *MockIndexOptions) Enabled() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Enabled") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Enabled indicates an expected call of Enabled +func (mr *MockIndexOptionsMockRecorder) Enabled() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Enabled", reflect.TypeOf((*MockIndexOptions)(nil).Enabled)) +} + +// SetBlockSize mocks base method +func (m *MockIndexOptions) SetBlockSize(value time.Duration) IndexOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBlockSize", value) + ret0, _ := ret[0].(IndexOptions) + return ret0 +} + +// SetBlockSize indicates an expected call of SetBlockSize +func (mr *MockIndexOptionsMockRecorder) SetBlockSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBlockSize", reflect.TypeOf((*MockIndexOptions)(nil).SetBlockSize), value) +} + +// BlockSize mocks base method +func (m *MockIndexOptions) BlockSize() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockSize") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BlockSize indicates an expected call of BlockSize +func (mr *MockIndexOptionsMockRecorder) BlockSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockSize", reflect.TypeOf((*MockIndexOptions)(nil).BlockSize)) +} + +// MockSchemaDescr is a mock of SchemaDescr interface +type MockSchemaDescr struct { + ctrl *gomock.Controller + recorder *MockSchemaDescrMockRecorder +} + +// MockSchemaDescrMockRecorder is the mock recorder for MockSchemaDescr +type MockSchemaDescrMockRecorder struct { + mock *MockSchemaDescr +} + +// NewMockSchemaDescr creates a new mock instance +func NewMockSchemaDescr(ctrl *gomock.Controller) *MockSchemaDescr { + mock := &MockSchemaDescr{ctrl: ctrl} + mock.recorder = &MockSchemaDescrMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSchemaDescr) EXPECT() *MockSchemaDescrMockRecorder { + return m.recorder +} + +// DeployId mocks base method +func (m *MockSchemaDescr) DeployId() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeployId") + ret0, _ := ret[0].(string) + return ret0 +} + +// DeployId indicates an expected call of DeployId +func (mr *MockSchemaDescrMockRecorder) DeployId() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeployId", reflect.TypeOf((*MockSchemaDescr)(nil).DeployId)) +} + +// PrevDeployId mocks base method +func (m *MockSchemaDescr) PrevDeployId() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PrevDeployId") + ret0, _ := ret[0].(string) + return ret0 +} + +// PrevDeployId indicates an expected call of PrevDeployId +func (mr *MockSchemaDescrMockRecorder) PrevDeployId() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrevDeployId", reflect.TypeOf((*MockSchemaDescr)(nil).PrevDeployId)) +} + +// Get mocks base method +func (m *MockSchemaDescr) Get() MessageDescriptor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(MessageDescriptor) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockSchemaDescrMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockSchemaDescr)(nil).Get)) +} + +// String mocks base method +func (m *MockSchemaDescr) String() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "String") + ret0, _ := ret[0].(string) + return ret0 +} + +// String indicates an expected call of String +func (mr *MockSchemaDescrMockRecorder) String() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockSchemaDescr)(nil).String)) +} + +// Equal mocks base method +func (m *MockSchemaDescr) Equal(arg0 SchemaDescr) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockSchemaDescrMockRecorder) Equal(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockSchemaDescr)(nil).Equal), arg0) +} + +// MockSchemaHistory is a mock of SchemaHistory interface +type MockSchemaHistory struct { + ctrl *gomock.Controller + recorder *MockSchemaHistoryMockRecorder +} + +// MockSchemaHistoryMockRecorder is the mock recorder for MockSchemaHistory +type MockSchemaHistoryMockRecorder struct { + mock *MockSchemaHistory +} + +// NewMockSchemaHistory creates a new mock instance +func NewMockSchemaHistory(ctrl *gomock.Controller) *MockSchemaHistory { + mock := &MockSchemaHistory{ctrl: ctrl} + mock.recorder = &MockSchemaHistoryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSchemaHistory) EXPECT() *MockSchemaHistoryMockRecorder { + return m.recorder +} + +// Equal mocks base method +func (m *MockSchemaHistory) Equal(arg0 SchemaHistory) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockSchemaHistoryMockRecorder) Equal(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockSchemaHistory)(nil).Equal), arg0) +} + +// Extends mocks base method +func (m *MockSchemaHistory) Extends(arg0 SchemaHistory) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Extends", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Extends indicates an expected call of Extends +func (mr *MockSchemaHistoryMockRecorder) Extends(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Extends", reflect.TypeOf((*MockSchemaHistory)(nil).Extends), arg0) +} + +// Get mocks base method +func (m *MockSchemaHistory) Get(id string) (SchemaDescr, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", id) + ret0, _ := ret[0].(SchemaDescr) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// Get indicates an expected call of Get +func (mr *MockSchemaHistoryMockRecorder) Get(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockSchemaHistory)(nil).Get), id) +} + +// GetLatest mocks base method +func (m *MockSchemaHistory) GetLatest() (SchemaDescr, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetLatest") + ret0, _ := ret[0].(SchemaDescr) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// GetLatest indicates an expected call of GetLatest +func (mr *MockSchemaHistoryMockRecorder) GetLatest() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLatest", reflect.TypeOf((*MockSchemaHistory)(nil).GetLatest)) +} + +// MockSchemaListener is a mock of SchemaListener interface +type MockSchemaListener struct { + ctrl *gomock.Controller + recorder *MockSchemaListenerMockRecorder +} + +// MockSchemaListenerMockRecorder is the mock recorder for MockSchemaListener +type MockSchemaListenerMockRecorder struct { + mock *MockSchemaListener +} + +// NewMockSchemaListener creates a new mock instance +func NewMockSchemaListener(ctrl *gomock.Controller) *MockSchemaListener { + mock := &MockSchemaListener{ctrl: ctrl} + mock.recorder = &MockSchemaListenerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSchemaListener) EXPECT() *MockSchemaListenerMockRecorder { + return m.recorder +} + +// SetSchemaHistory mocks base method +func (m *MockSchemaListener) SetSchemaHistory(value SchemaHistory) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetSchemaHistory", value) +} + +// SetSchemaHistory indicates an expected call of SetSchemaHistory +func (mr *MockSchemaListenerMockRecorder) SetSchemaHistory(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSchemaHistory", reflect.TypeOf((*MockSchemaListener)(nil).SetSchemaHistory), value) +} + +// MockSchemaRegistry is a mock of SchemaRegistry interface +type MockSchemaRegistry struct { + ctrl *gomock.Controller + recorder *MockSchemaRegistryMockRecorder +} + +// MockSchemaRegistryMockRecorder is the mock recorder for MockSchemaRegistry +type MockSchemaRegistryMockRecorder struct { + mock *MockSchemaRegistry +} + +// NewMockSchemaRegistry creates a new mock instance +func NewMockSchemaRegistry(ctrl *gomock.Controller) *MockSchemaRegistry { + mock := &MockSchemaRegistry{ctrl: ctrl} + mock.recorder = &MockSchemaRegistryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSchemaRegistry) EXPECT() *MockSchemaRegistryMockRecorder { + return m.recorder +} + +// GetLatestSchema mocks base method +func (m *MockSchemaRegistry) GetLatestSchema(id ident.ID) (SchemaDescr, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetLatestSchema", id) + ret0, _ := ret[0].(SchemaDescr) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetLatestSchema indicates an expected call of GetLatestSchema +func (mr *MockSchemaRegistryMockRecorder) GetLatestSchema(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLatestSchema", reflect.TypeOf((*MockSchemaRegistry)(nil).GetLatestSchema), id) +} + +// GetSchema mocks base method +func (m *MockSchemaRegistry) GetSchema(id ident.ID, schemaID string) (SchemaDescr, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetSchema", id, schemaID) + ret0, _ := ret[0].(SchemaDescr) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetSchema indicates an expected call of GetSchema +func (mr *MockSchemaRegistryMockRecorder) GetSchema(id, schemaID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSchema", reflect.TypeOf((*MockSchemaRegistry)(nil).GetSchema), id, schemaID) +} + +// SetSchemaHistory mocks base method +func (m *MockSchemaRegistry) SetSchemaHistory(id ident.ID, history SchemaHistory) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSchemaHistory", id, history) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetSchemaHistory indicates an expected call of SetSchemaHistory +func (mr *MockSchemaRegistryMockRecorder) SetSchemaHistory(id, history interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSchemaHistory", reflect.TypeOf((*MockSchemaRegistry)(nil).SetSchemaHistory), id, history) +} + +// RegisterListener mocks base method +func (m *MockSchemaRegistry) RegisterListener(id ident.ID, listener SchemaListener) (close.SimpleCloser, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterListener", id, listener) + ret0, _ := ret[0].(close.SimpleCloser) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RegisterListener indicates an expected call of RegisterListener +func (mr *MockSchemaRegistryMockRecorder) RegisterListener(id, listener interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterListener", reflect.TypeOf((*MockSchemaRegistry)(nil).RegisterListener), id, listener) +} + +// Close mocks base method +func (m *MockSchemaRegistry) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockSchemaRegistryMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSchemaRegistry)(nil).Close)) +} + +// MockMetadata is a mock of Metadata interface +type MockMetadata struct { + ctrl *gomock.Controller + recorder *MockMetadataMockRecorder +} + +// MockMetadataMockRecorder is the mock recorder for MockMetadata +type MockMetadataMockRecorder struct { + mock *MockMetadata +} + +// NewMockMetadata creates a new mock instance +func NewMockMetadata(ctrl *gomock.Controller) *MockMetadata { + mock := &MockMetadata{ctrl: ctrl} + mock.recorder = &MockMetadataMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMetadata) EXPECT() *MockMetadataMockRecorder { + return m.recorder +} + +// Equal mocks base method +func (m *MockMetadata) Equal(value Metadata) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", value) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockMetadataMockRecorder) Equal(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockMetadata)(nil).Equal), value) +} + +// ID mocks base method +func (m *MockMetadata) ID() ident.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(ident.ID) + return ret0 +} + +// ID indicates an expected call of ID +func (mr *MockMetadataMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockMetadata)(nil).ID)) +} + +// Options mocks base method +func (m *MockMetadata) Options() Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Options") + ret0, _ := ret[0].(Options) + return ret0 +} + +// Options indicates an expected call of Options +func (mr *MockMetadataMockRecorder) Options() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Options", reflect.TypeOf((*MockMetadata)(nil).Options)) +} + +// MockMap is a mock of Map interface +type MockMap struct { + ctrl *gomock.Controller + recorder *MockMapMockRecorder +} + +// MockMapMockRecorder is the mock recorder for MockMap +type MockMapMockRecorder struct { + mock *MockMap +} + +// NewMockMap creates a new mock instance +func NewMockMap(ctrl *gomock.Controller) *MockMap { + mock := &MockMap{ctrl: ctrl} + mock.recorder = &MockMapMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMap) EXPECT() *MockMapMockRecorder { + return m.recorder +} + +// Equal mocks base method +func (m *MockMap) Equal(value Map) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", value) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockMapMockRecorder) Equal(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockMap)(nil).Equal), value) +} + +// Get mocks base method +func (m *MockMap) Get(arg0 ident.ID) (Metadata, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0) + ret0, _ := ret[0].(Metadata) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get +func (mr *MockMapMockRecorder) Get(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockMap)(nil).Get), arg0) +} + +// IDs mocks base method +func (m *MockMap) IDs() []ident.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IDs") + ret0, _ := ret[0].([]ident.ID) + return ret0 +} + +// IDs indicates an expected call of IDs +func (mr *MockMapMockRecorder) IDs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IDs", reflect.TypeOf((*MockMap)(nil).IDs)) +} + +// Metadatas mocks base method +func (m *MockMap) Metadatas() []Metadata { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Metadatas") + ret0, _ := ret[0].([]Metadata) + return ret0 +} + +// Metadatas indicates an expected call of Metadatas +func (mr *MockMapMockRecorder) Metadatas() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Metadatas", reflect.TypeOf((*MockMap)(nil).Metadatas)) +} + +// MockWatch is a mock of Watch interface +type MockWatch struct { + ctrl *gomock.Controller + recorder *MockWatchMockRecorder +} + +// MockWatchMockRecorder is the mock recorder for MockWatch +type MockWatchMockRecorder struct { + mock *MockWatch +} + +// NewMockWatch creates a new mock instance +func NewMockWatch(ctrl *gomock.Controller) *MockWatch { + mock := &MockWatch{ctrl: ctrl} + mock.recorder = &MockWatchMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockWatch) EXPECT() *MockWatchMockRecorder { + return m.recorder +} + +// C mocks base method +func (m *MockWatch) C() <-chan struct{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "C") + ret0, _ := ret[0].(<-chan struct{}) + return ret0 +} + +// C indicates an expected call of C +func (mr *MockWatchMockRecorder) C() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "C", reflect.TypeOf((*MockWatch)(nil).C)) +} + +// Get mocks base method +func (m *MockWatch) Get() Map { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(Map) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockWatchMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockWatch)(nil).Get)) +} + +// Close mocks base method +func (m *MockWatch) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockWatchMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockWatch)(nil).Close)) +} + +// MockRegistry is a mock of Registry interface +type MockRegistry struct { + ctrl *gomock.Controller + recorder *MockRegistryMockRecorder +} + +// MockRegistryMockRecorder is the mock recorder for MockRegistry +type MockRegistryMockRecorder struct { + mock *MockRegistry +} + +// NewMockRegistry creates a new mock instance +func NewMockRegistry(ctrl *gomock.Controller) *MockRegistry { + mock := &MockRegistry{ctrl: ctrl} + mock.recorder = &MockRegistryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockRegistry) EXPECT() *MockRegistryMockRecorder { + return m.recorder +} + +// Watch mocks base method +func (m *MockRegistry) Watch() (Watch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch") + ret0, _ := ret[0].(Watch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Watch indicates an expected call of Watch +func (mr *MockRegistryMockRecorder) Watch() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockRegistry)(nil).Watch)) +} + +// Close mocks base method +func (m *MockRegistry) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockRegistryMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockRegistry)(nil).Close)) +} + +// MockInitializer is a mock of Initializer interface +type MockInitializer struct { + ctrl *gomock.Controller + recorder *MockInitializerMockRecorder +} + +// MockInitializerMockRecorder is the mock recorder for MockInitializer +type MockInitializerMockRecorder struct { + mock *MockInitializer +} + +// NewMockInitializer creates a new mock instance +func NewMockInitializer(ctrl *gomock.Controller) *MockInitializer { + mock := &MockInitializer{ctrl: ctrl} + mock.recorder = &MockInitializerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockInitializer) EXPECT() *MockInitializerMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockInitializer) Init() (Registry, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Init") + ret0, _ := ret[0].(Registry) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Init indicates an expected call of Init +func (mr *MockInitializerMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockInitializer)(nil).Init)) +} + +// MockDynamicOptions is a mock of DynamicOptions interface +type MockDynamicOptions struct { + ctrl *gomock.Controller + recorder *MockDynamicOptionsMockRecorder +} + +// MockDynamicOptionsMockRecorder is the mock recorder for MockDynamicOptions +type MockDynamicOptionsMockRecorder struct { + mock *MockDynamicOptions +} + +// NewMockDynamicOptions creates a new mock instance +func NewMockDynamicOptions(ctrl *gomock.Controller) *MockDynamicOptions { + mock := &MockDynamicOptions{ctrl: ctrl} + mock.recorder = &MockDynamicOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDynamicOptions) EXPECT() *MockDynamicOptionsMockRecorder { + return m.recorder +} + +// Validate mocks base method +func (m *MockDynamicOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockDynamicOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockDynamicOptions)(nil).Validate)) +} + +// SetInstrumentOptions mocks base method +func (m *MockDynamicOptions) SetInstrumentOptions(value instrument.Options) DynamicOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstrumentOptions", value) + ret0, _ := ret[0].(DynamicOptions) + return ret0 +} + +// SetInstrumentOptions indicates an expected call of SetInstrumentOptions +func (mr *MockDynamicOptionsMockRecorder) SetInstrumentOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstrumentOptions", reflect.TypeOf((*MockDynamicOptions)(nil).SetInstrumentOptions), value) +} + +// InstrumentOptions mocks base method +func (m *MockDynamicOptions) InstrumentOptions() instrument.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstrumentOptions") + ret0, _ := ret[0].(instrument.Options) + return ret0 +} + +// InstrumentOptions indicates an expected call of InstrumentOptions +func (mr *MockDynamicOptionsMockRecorder) InstrumentOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstrumentOptions", reflect.TypeOf((*MockDynamicOptions)(nil).InstrumentOptions)) +} + +// SetConfigServiceClient mocks base method +func (m *MockDynamicOptions) SetConfigServiceClient(c client.Client) DynamicOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetConfigServiceClient", c) + ret0, _ := ret[0].(DynamicOptions) + return ret0 +} + +// SetConfigServiceClient indicates an expected call of SetConfigServiceClient +func (mr *MockDynamicOptionsMockRecorder) SetConfigServiceClient(c interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetConfigServiceClient", reflect.TypeOf((*MockDynamicOptions)(nil).SetConfigServiceClient), c) +} + +// ConfigServiceClient mocks base method +func (m *MockDynamicOptions) ConfigServiceClient() client.Client { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConfigServiceClient") + ret0, _ := ret[0].(client.Client) + return ret0 +} + +// ConfigServiceClient indicates an expected call of ConfigServiceClient +func (mr *MockDynamicOptionsMockRecorder) ConfigServiceClient() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConfigServiceClient", reflect.TypeOf((*MockDynamicOptions)(nil).ConfigServiceClient)) +} + +// SetNamespaceRegistryKey mocks base method +func (m *MockDynamicOptions) SetNamespaceRegistryKey(k string) DynamicOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetNamespaceRegistryKey", k) + ret0, _ := ret[0].(DynamicOptions) + return ret0 +} + +// SetNamespaceRegistryKey indicates an expected call of SetNamespaceRegistryKey +func (mr *MockDynamicOptionsMockRecorder) SetNamespaceRegistryKey(k interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNamespaceRegistryKey", reflect.TypeOf((*MockDynamicOptions)(nil).SetNamespaceRegistryKey), k) +} + +// NamespaceRegistryKey mocks base method +func (m *MockDynamicOptions) NamespaceRegistryKey() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NamespaceRegistryKey") + ret0, _ := ret[0].(string) + return ret0 +} + +// NamespaceRegistryKey indicates an expected call of NamespaceRegistryKey +func (mr *MockDynamicOptionsMockRecorder) NamespaceRegistryKey() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NamespaceRegistryKey", reflect.TypeOf((*MockDynamicOptions)(nil).NamespaceRegistryKey)) +} + +// SetForceColdWritesEnabled mocks base method +func (m *MockDynamicOptions) SetForceColdWritesEnabled(enabled bool) DynamicOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetForceColdWritesEnabled", enabled) + ret0, _ := ret[0].(DynamicOptions) + return ret0 +} + +// SetForceColdWritesEnabled indicates an expected call of SetForceColdWritesEnabled +func (mr *MockDynamicOptionsMockRecorder) SetForceColdWritesEnabled(enabled interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetForceColdWritesEnabled", reflect.TypeOf((*MockDynamicOptions)(nil).SetForceColdWritesEnabled), enabled) +} + +// ForceColdWritesEnabled mocks base method +func (m *MockDynamicOptions) ForceColdWritesEnabled() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ForceColdWritesEnabled") + ret0, _ := ret[0].(bool) + return ret0 +} + +// ForceColdWritesEnabled indicates an expected call of ForceColdWritesEnabled +func (mr *MockDynamicOptionsMockRecorder) ForceColdWritesEnabled() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ForceColdWritesEnabled", reflect.TypeOf((*MockDynamicOptions)(nil).ForceColdWritesEnabled)) +} + +// MockNamespaceWatch is a mock of NamespaceWatch interface +type MockNamespaceWatch struct { + ctrl *gomock.Controller + recorder *MockNamespaceWatchMockRecorder +} + +// MockNamespaceWatchMockRecorder is the mock recorder for MockNamespaceWatch +type MockNamespaceWatchMockRecorder struct { + mock *MockNamespaceWatch +} + +// NewMockNamespaceWatch creates a new mock instance +func NewMockNamespaceWatch(ctrl *gomock.Controller) *MockNamespaceWatch { + mock := &MockNamespaceWatch{ctrl: ctrl} + mock.recorder = &MockNamespaceWatchMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockNamespaceWatch) EXPECT() *MockNamespaceWatchMockRecorder { + return m.recorder +} + +// Start mocks base method +func (m *MockNamespaceWatch) Start() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Start") + ret0, _ := ret[0].(error) + return ret0 +} + +// Start indicates an expected call of Start +func (mr *MockNamespaceWatchMockRecorder) Start() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*MockNamespaceWatch)(nil).Start)) +} + +// Stop mocks base method +func (m *MockNamespaceWatch) Stop() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stop") + ret0, _ := ret[0].(error) + return ret0 +} + +// Stop indicates an expected call of Stop +func (mr *MockNamespaceWatchMockRecorder) Stop() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stop", reflect.TypeOf((*MockNamespaceWatch)(nil).Stop)) +} + +// Close mocks base method +func (m *MockNamespaceWatch) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockNamespaceWatchMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockNamespaceWatch)(nil).Close)) +} + +// MockExtendedOptions is a mock of ExtendedOptions interface +type MockExtendedOptions struct { + ctrl *gomock.Controller + recorder *MockExtendedOptionsMockRecorder +} + +// MockExtendedOptionsMockRecorder is the mock recorder for MockExtendedOptions +type MockExtendedOptionsMockRecorder struct { + mock *MockExtendedOptions +} + +// NewMockExtendedOptions creates a new mock instance +func NewMockExtendedOptions(ctrl *gomock.Controller) *MockExtendedOptions { + mock := &MockExtendedOptions{ctrl: ctrl} + mock.recorder = &MockExtendedOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockExtendedOptions) EXPECT() *MockExtendedOptionsMockRecorder { + return m.recorder +} + +// ToProto mocks base method +func (m *MockExtendedOptions) ToProto() (proto.Message, string) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ToProto") + ret0, _ := ret[0].(proto.Message) + ret1, _ := ret[1].(string) + return ret0, ret1 +} + +// ToProto indicates an expected call of ToProto +func (mr *MockExtendedOptionsMockRecorder) ToProto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ToProto", reflect.TypeOf((*MockExtendedOptions)(nil).ToProto)) +} + +// Validate mocks base method +func (m *MockExtendedOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockExtendedOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockExtendedOptions)(nil).Validate)) +} + +// MockAggregationOptions is a mock of AggregationOptions interface +type MockAggregationOptions struct { + ctrl *gomock.Controller + recorder *MockAggregationOptionsMockRecorder +} + +// MockAggregationOptionsMockRecorder is the mock recorder for MockAggregationOptions +type MockAggregationOptionsMockRecorder struct { + mock *MockAggregationOptions +} + +// NewMockAggregationOptions creates a new mock instance +func NewMockAggregationOptions(ctrl *gomock.Controller) *MockAggregationOptions { + mock := &MockAggregationOptions{ctrl: ctrl} + mock.recorder = &MockAggregationOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAggregationOptions) EXPECT() *MockAggregationOptionsMockRecorder { + return m.recorder +} + +// Equal mocks base method +func (m *MockAggregationOptions) Equal(value AggregationOptions) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", value) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockAggregationOptionsMockRecorder) Equal(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockAggregationOptions)(nil).Equal), value) +} + +// SetAggregations mocks base method +func (m *MockAggregationOptions) SetAggregations(value []Aggregation) AggregationOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAggregations", value) + ret0, _ := ret[0].(AggregationOptions) + return ret0 +} + +// SetAggregations indicates an expected call of SetAggregations +func (mr *MockAggregationOptionsMockRecorder) SetAggregations(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAggregations", reflect.TypeOf((*MockAggregationOptions)(nil).SetAggregations), value) +} + +// Aggregations mocks base method +func (m *MockAggregationOptions) Aggregations() []Aggregation { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Aggregations") + ret0, _ := ret[0].([]Aggregation) + return ret0 +} + +// Aggregations indicates an expected call of Aggregations +func (mr *MockAggregationOptionsMockRecorder) Aggregations() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregations", reflect.TypeOf((*MockAggregationOptions)(nil).Aggregations)) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_runtime_options.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_runtime_options.go new file mode 100644 index 00000000..8531cc6e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_runtime_options.go @@ -0,0 +1,254 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "sync" + + xclose "github.com/m3db/m3/src/x/close" + "github.com/m3db/m3/src/x/watch" +) + +const ( + defaultWriteIndexingPerCPUConcurrency = 0.75 + defaultFlushIndexingPerCPUConcurrency = 0.25 +) + +// RuntimeOptions is a set of runtime options that can +// be set per namespace. +type RuntimeOptions interface { + // IsDefault returns whether the runtime options are purely defaults + // with no values explicitly set. + IsDefault() bool + + // Equal will return whether it's equal to another runtime options. + Equal(other RuntimeOptions) bool + + // SetWriteIndexingPerCPUConcurrency sets the write + // indexing per CPU concurrency. + SetWriteIndexingPerCPUConcurrency(value *float64) RuntimeOptions + + // WriteIndexingPerCPUConcurrency returns the write + // indexing per CPU concurrency. + WriteIndexingPerCPUConcurrency() *float64 + + // WriteIndexingPerCPUConcurrencyOrDefault returns the write + // indexing per CPU concurrency or default. + WriteIndexingPerCPUConcurrencyOrDefault() float64 + + // SetFlushIndexingPerCPUConcurrency sets the flush + // indexing per CPU concurrency. + SetFlushIndexingPerCPUConcurrency(value *float64) RuntimeOptions + + // FlushIndexingPerCPUConcurrency returns the flush + // indexing per CPU concurrency. + FlushIndexingPerCPUConcurrency() *float64 + + // FlushIndexingPerCPUConcurrencyOrDefault returns the flush + // indexing per CPU concurrency. + FlushIndexingPerCPUConcurrencyOrDefault() float64 +} + +// RuntimeOptionsManagerRegistry is a registry of runtime options managers. +type RuntimeOptionsManagerRegistry interface { + // RuntimeOptionsManager returns a namespace runtime options manager + // for the given namespace. + RuntimeOptionsManager(namespace string) RuntimeOptionsManager + + // Close closes the watcher and all descendent watches. + Close() +} + +// RuntimeOptionsManager is a runtime options manager. +type RuntimeOptionsManager interface { + // Update updates the current runtime options. + Update(value RuntimeOptions) error + + // Get returns the current values. + Get() RuntimeOptions + + // RegisterListener registers a listener for updates to runtime options, + // it will synchronously call back the listener when this method is called + // to deliver the current set of runtime options. + RegisterListener(l RuntimeOptionsListener) xclose.SimpleCloser + + // Close closes the watcher and all descendent watches. + Close() +} + +// RuntimeOptionsListener listens for updates to runtime options. +type RuntimeOptionsListener interface { + // SetNamespaceRuntimeOptions is called when the listener is registered + // and when any updates occurred passing the new runtime options. + SetNamespaceRuntimeOptions(value RuntimeOptions) +} + +// runtimeOptions should always use pointer value types for it's options +// and provide a "ValueOrDefault()" method so that we can be sure whether +// the options are all defaults or not with the "IsDefault" method. +type runtimeOptions struct { + writeIndexingPerCPUConcurrency *float64 + flushIndexingPerCPUConcurrency *float64 +} + +// NewRuntimeOptions returns a new namespace runtime options. +func NewRuntimeOptions() RuntimeOptions { + return newRuntimeOptions() +} + +func newRuntimeOptions() *runtimeOptions { + return &runtimeOptions{} +} + +func (o *runtimeOptions) IsDefault() bool { + defaults := newRuntimeOptions() + return *o == *defaults +} + +func (o *runtimeOptions) Equal(other RuntimeOptions) bool { + return o.writeIndexingPerCPUConcurrency == other.WriteIndexingPerCPUConcurrency() && + o.flushIndexingPerCPUConcurrency == other.FlushIndexingPerCPUConcurrency() +} + +func (o *runtimeOptions) SetWriteIndexingPerCPUConcurrency(value *float64) RuntimeOptions { + opts := *o + opts.writeIndexingPerCPUConcurrency = value + return &opts +} + +func (o *runtimeOptions) WriteIndexingPerCPUConcurrency() *float64 { + return o.writeIndexingPerCPUConcurrency +} + +func (o *runtimeOptions) WriteIndexingPerCPUConcurrencyOrDefault() float64 { + value := o.writeIndexingPerCPUConcurrency + if value == nil { + return defaultWriteIndexingPerCPUConcurrency + } + return *value +} + +func (o *runtimeOptions) SetFlushIndexingPerCPUConcurrency(value *float64) RuntimeOptions { + opts := *o + opts.flushIndexingPerCPUConcurrency = value + return &opts +} + +func (o *runtimeOptions) FlushIndexingPerCPUConcurrency() *float64 { + return o.flushIndexingPerCPUConcurrency +} + +func (o *runtimeOptions) FlushIndexingPerCPUConcurrencyOrDefault() float64 { + value := o.flushIndexingPerCPUConcurrency + if value == nil { + return defaultFlushIndexingPerCPUConcurrency + } + return *value +} + +type runtimeOptionsManagerRegistry struct { + sync.RWMutex + managers map[string]RuntimeOptionsManager +} + +// NewRuntimeOptionsManagerRegistry returns a new runtime options +// manager registry. +func NewRuntimeOptionsManagerRegistry() RuntimeOptionsManagerRegistry { + return &runtimeOptionsManagerRegistry{ + managers: make(map[string]RuntimeOptionsManager), + } +} + +func (r *runtimeOptionsManagerRegistry) RuntimeOptionsManager( + namespace string, +) RuntimeOptionsManager { + r.Lock() + defer r.Unlock() + + manager, ok := r.managers[namespace] + if !ok { + manager = NewRuntimeOptionsManager(namespace) + r.managers[namespace] = manager + } + + return manager +} + +func (r *runtimeOptionsManagerRegistry) Close() { + r.Lock() + defer r.Unlock() + + for k, v := range r.managers { + v.Close() + delete(r.managers, k) + } +} + +type runtimeOptionsManager struct { + namespace string + watchable watch.Watchable +} + +// NewRuntimeOptionsManager returns a new runtime options manager. +func NewRuntimeOptionsManager(namespace string) RuntimeOptionsManager { + watchable := watch.NewWatchable() + watchable.Update(NewRuntimeOptions()) + return &runtimeOptionsManager{ + namespace: namespace, + watchable: watchable, + } +} + +func (w *runtimeOptionsManager) Update(value RuntimeOptions) error { + w.watchable.Update(value) + return nil +} + +func (w *runtimeOptionsManager) Get() RuntimeOptions { + return w.watchable.Get().(RuntimeOptions) +} + +func (w *runtimeOptionsManager) RegisterListener( + listener RuntimeOptionsListener, +) xclose.SimpleCloser { + _, watch, _ := w.watchable.Watch() + + // We always initialize the watchable so always read + // the first notification value + <-watch.C() + + // Deliver the current runtime options + listener.SetNamespaceRuntimeOptions(watch.Get().(RuntimeOptions)) + + // Spawn a new goroutine that will terminate when the + // watchable terminates on the close of the runtime options manager + go func() { + for range watch.C() { + listener.SetNamespaceRuntimeOptions(watch.Get().(RuntimeOptions)) + } + }() + + return watch +} + +func (w *runtimeOptionsManager) Close() { + w.watchable.Close() +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_watch.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_watch.go new file mode 100644 index 00000000..bd4378e9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/namespace_watch.go @@ -0,0 +1,191 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "errors" + "sync" + "time" + + "github.com/m3db/m3/src/x/instrument" + + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +var ( + errAlreadyWatching = errors.New("database is already watching namespace updates") + errNotWatching = errors.New("database is not watching for namespace updates") +) + +type dbNamespaceWatch struct { + sync.Mutex + + watching bool + watch Watch + doneCh chan struct{} + closedCh chan struct{} + + update NamespaceUpdater + + log *zap.Logger + metrics dbNamespaceWatchMetrics + reportInterval time.Duration +} + +type dbNamespaceWatchMetrics struct { + activeNamespaces tally.Gauge + updates tally.Counter +} + +func newWatchMetrics( + scope tally.Scope, +) dbNamespaceWatchMetrics { + nsScope := scope.SubScope("namespace-watch") + return dbNamespaceWatchMetrics{ + activeNamespaces: nsScope.Gauge("active"), + updates: nsScope.Counter("updates"), + } +} + +func NewNamespaceWatch( + update NamespaceUpdater, + w Watch, + iopts instrument.Options, +) NamespaceWatch { + scope := iopts.MetricsScope() + return &dbNamespaceWatch{ + watch: w, + update: update, + log: iopts.Logger(), + metrics: newWatchMetrics(scope), + reportInterval: iopts.ReportInterval(), + } +} + +func (w *dbNamespaceWatch) Start() error { + w.Lock() + defer w.Unlock() + + if w.watching { + return errAlreadyWatching + } + + w.watching = true + w.doneCh = make(chan struct{}, 1) + w.closedCh = make(chan struct{}, 1) + + go w.startWatch() + + return nil +} + +func (w *dbNamespaceWatch) startWatch() { + reportClosingCh := make(chan struct{}, 1) + reportClosedCh := make(chan struct{}, 1) + go func() { + ticker := time.NewTicker(w.reportInterval) + defer func() { + ticker.Stop() + close(reportClosedCh) + }() + for { + select { + case <-ticker.C: + w.reportMetrics() + case <-reportClosingCh: + return + } + } + }() + + defer func() { + // Issue closing signal to report channel + close(reportClosingCh) + // Wait for report channel to close + <-reportClosedCh + // Signal all closed + close(w.closedCh) + }() + + for { + select { + case <-w.doneCh: + return + case _, ok := <-w.watch.C(): + if !ok { + return + } + + if !w.isWatching() { + return + } + + w.metrics.updates.Inc(1) + newMap := w.watch.Get() + w.log.Info("received update from kv namespace watch") + if err := w.update(newMap); err != nil { + w.log.Error("failed to update owned namespaces", + zap.Error(err)) + } + } + } +} + +func (w *dbNamespaceWatch) isWatching() bool { + w.Lock() + defer w.Unlock() + return w.watching +} + +func (w *dbNamespaceWatch) reportMetrics() { + m := w.watch.Get() + if m == nil { + w.metrics.activeNamespaces.Update(0) + return + } + w.metrics.activeNamespaces.Update(float64(len(m.Metadatas()))) +} + +func (w *dbNamespaceWatch) Stop() error { + w.Lock() + defer w.Unlock() + + if !w.watching { + return errNotWatching + } + + w.watching = false + close(w.doneCh) + <-w.closedCh + + return nil +} + +func (w *dbNamespaceWatch) Close() error { + w.Lock() + watching := w.watching + w.Unlock() + if watching { + return w.Stop() + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/options.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/options.go new file mode 100644 index 00000000..75a197b4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/options.go @@ -0,0 +1,296 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "errors" + + "github.com/m3db/m3/src/dbnode/retention" +) + +const ( + // Namespace requires bootstrapping by default. + defaultBootstrapEnabled = true + + // Namespace requires flushing by default. + defaultFlushEnabled = true + + // Namespace requires snapshotting disabled by default. + defaultSnapshotEnabled = true + + // Namespace writes go to commit logs by default. + defaultWritesToCommitLog = true + + // Namespace requires fileset/snapshot cleanup by default. + defaultCleanupEnabled = true + + // Namespace requires repair disabled by default. + defaultRepairEnabled = false + + // Namespace with cold writes disabled by default. + defaultColdWritesEnabled = false + + // Namespace caches retrieved blocks by default. + defaultCacheBlocksOnRetrieve = true +) + +var ( + errIndexBlockSizePositive = errors.New("index block size must positive") + errIndexBlockSizeTooLarge = errors.New("index block size needs to be <= namespace retention period") + errIndexBlockSizeMustBeAMultipleOfDataBlockSize = errors.New("index block size must be a multiple of data block size") + errNamespaceRuntimeOptionsNotSet = errors.New("namespace runtime options is not set") + errAggregationOptionsNotSet = errors.New("aggregation options is not set") +) + +type options struct { + bootstrapEnabled bool + flushEnabled bool + snapshotEnabled bool + writesToCommitLog bool + cleanupEnabled bool + repairEnabled bool + coldWritesEnabled bool + cacheBlocksOnRetrieve bool + retentionOpts retention.Options + indexOpts IndexOptions + schemaHis SchemaHistory + runtimeOpts RuntimeOptions + extendedOpts ExtendedOptions + aggregationOpts AggregationOptions +} + +// NewSchemaHistory returns an empty schema history. +func NewSchemaHistory() SchemaHistory { + return emptySchemaHistory() +} + +// NewOptions creates a new namespace options +func NewOptions() Options { + return &options{ + bootstrapEnabled: defaultBootstrapEnabled, + flushEnabled: defaultFlushEnabled, + snapshotEnabled: defaultSnapshotEnabled, + writesToCommitLog: defaultWritesToCommitLog, + cleanupEnabled: defaultCleanupEnabled, + repairEnabled: defaultRepairEnabled, + coldWritesEnabled: defaultColdWritesEnabled, + cacheBlocksOnRetrieve: defaultCacheBlocksOnRetrieve, + retentionOpts: retention.NewOptions(), + indexOpts: NewIndexOptions(), + schemaHis: NewSchemaHistory(), + runtimeOpts: NewRuntimeOptions(), + aggregationOpts: NewAggregationOptions(), + } +} + +func (o *options) Validate() error { + if err := o.retentionOpts.Validate(); err != nil { + return err + } + + if o.extendedOpts != nil { + if err := o.extendedOpts.Validate(); err != nil { + return err + } + } + + if !o.indexOpts.Enabled() { + return nil + } + var ( + retention = o.retentionOpts.RetentionPeriod() + futureRetention = o.retentionOpts.FutureRetentionPeriod() + dataBlockSize = o.retentionOpts.BlockSize() + indexBlockSize = o.indexOpts.BlockSize() + ) + if indexBlockSize <= 0 { + return errIndexBlockSizePositive + } + if retention < indexBlockSize || (futureRetention != 0 && futureRetention < indexBlockSize) { + return errIndexBlockSizeTooLarge + } + if indexBlockSize%dataBlockSize != 0 { + return errIndexBlockSizeMustBeAMultipleOfDataBlockSize + } + if o.runtimeOpts == nil { + return errNamespaceRuntimeOptionsNotSet + } + if o.aggregationOpts == nil { + return errAggregationOptionsNotSet + } + return nil +} + +func (o *options) Equal(value Options) bool { + return o.bootstrapEnabled == value.BootstrapEnabled() && + o.flushEnabled == value.FlushEnabled() && + o.writesToCommitLog == value.WritesToCommitLog() && + o.snapshotEnabled == value.SnapshotEnabled() && + o.cleanupEnabled == value.CleanupEnabled() && + o.repairEnabled == value.RepairEnabled() && + o.coldWritesEnabled == value.ColdWritesEnabled() && + o.cacheBlocksOnRetrieve == value.CacheBlocksOnRetrieve() && + o.retentionOpts.Equal(value.RetentionOptions()) && + o.indexOpts.Equal(value.IndexOptions()) && + o.schemaHis.Equal(value.SchemaHistory()) && + o.runtimeOpts.Equal(value.RuntimeOptions()) && + o.aggregationOpts.Equal(value.AggregationOptions()) +} + +func (o *options) SetBootstrapEnabled(value bool) Options { + opts := *o + opts.bootstrapEnabled = value + return &opts +} + +func (o *options) BootstrapEnabled() bool { + return o.bootstrapEnabled +} + +func (o *options) SetFlushEnabled(value bool) Options { + opts := *o + opts.flushEnabled = value + return &opts +} + +func (o *options) FlushEnabled() bool { + return o.flushEnabled +} + +func (o *options) SetSnapshotEnabled(value bool) Options { + opts := *o + opts.snapshotEnabled = value + return &opts +} + +func (o *options) SnapshotEnabled() bool { + return o.snapshotEnabled +} + +func (o *options) SetWritesToCommitLog(value bool) Options { + opts := *o + opts.writesToCommitLog = value + return &opts +} + +func (o *options) WritesToCommitLog() bool { + return o.writesToCommitLog +} + +func (o *options) SetCleanupEnabled(value bool) Options { + opts := *o + opts.cleanupEnabled = value + return &opts +} + +func (o *options) CleanupEnabled() bool { + return o.cleanupEnabled +} + +func (o *options) SetRepairEnabled(value bool) Options { + opts := *o + opts.repairEnabled = value + return &opts +} + +func (o *options) RepairEnabled() bool { + return o.repairEnabled +} + +func (o *options) SetColdWritesEnabled(value bool) Options { + opts := *o + opts.coldWritesEnabled = value + return &opts +} + +func (o *options) ColdWritesEnabled() bool { + return o.coldWritesEnabled +} + +func (o *options) SetCacheBlocksOnRetrieve(value bool) Options { + opts := *o + opts.cacheBlocksOnRetrieve = value + return &opts +} + +func (o *options) CacheBlocksOnRetrieve() bool { + return o.cacheBlocksOnRetrieve +} + +func (o *options) SetRetentionOptions(value retention.Options) Options { + opts := *o + opts.retentionOpts = value + return &opts +} + +func (o *options) RetentionOptions() retention.Options { + return o.retentionOpts +} + +func (o *options) SetIndexOptions(value IndexOptions) Options { + opts := *o + opts.indexOpts = value + return &opts +} + +func (o *options) IndexOptions() IndexOptions { + return o.indexOpts +} + +func (o *options) SetSchemaHistory(value SchemaHistory) Options { + opts := *o + opts.schemaHis = value + return &opts +} + +func (o *options) SchemaHistory() SchemaHistory { + return o.schemaHis +} + +func (o *options) SetRuntimeOptions(value RuntimeOptions) Options { + opts := *o + opts.runtimeOpts = value + return &opts +} + +func (o *options) RuntimeOptions() RuntimeOptions { + return o.runtimeOpts +} + +func (o *options) SetExtendedOptions(value ExtendedOptions) Options { + opts := *o + opts.extendedOpts = value + return &opts +} + +func (o *options) ExtendedOptions() ExtendedOptions { + return o.extendedOpts +} + +func (o *options) SetAggregationOptions(value AggregationOptions) Options { + opts := *o + opts.aggregationOpts = value + return &opts +} + +func (o *options) AggregationOptions() AggregationOptions { + return o.aggregationOpts +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/schema.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/schema.go new file mode 100644 index 00000000..8ad49b07 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/schema.go @@ -0,0 +1,411 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "errors" + "io" + "io/ioutil" + "os" + "strings" + + nsproto "github.com/m3db/m3/src/dbnode/generated/proto/namespace" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + + "github.com/golang/protobuf/proto" + dpb "github.com/golang/protobuf/protoc-gen-go/descriptor" + "github.com/jhump/protoreflect/desc" + "github.com/jhump/protoreflect/desc/protoparse" +) + +var ( + errInvalidSchema = errors.New("invalid schema definition") + errSchemaRegistryEmpty = errors.New("schema registry is empty") + errInvalidSchemaOptions = errors.New("invalid schema options") + errEmptyProtoFile = errors.New("empty proto file") + errSyntaxNotProto3 = errors.New("proto syntax is not proto3") + errEmptyDeployID = errors.New("schema deploy ID can not be empty") + errDuplicateDeployID = errors.New("schema deploy ID already exists") +) + +type MessageDescriptor struct { + *desc.MessageDescriptor +} + +type schemaDescr struct { + deployId string + prevDeployId string + md MessageDescriptor +} + +func newSchemaDescr(deployId, prevId string, md MessageDescriptor) *schemaDescr { + return &schemaDescr{deployId: deployId, prevDeployId: prevId, md: md} +} + +func (s *schemaDescr) DeployId() string { + return s.deployId +} + +func (s *schemaDescr) PrevDeployId() string { + return s.prevDeployId +} + +func (s *schemaDescr) Equal(o SchemaDescr) bool { + if s == nil && o == nil { + return true + } + if s != nil && o == nil || s == nil && o != nil { + return false + } + return s.DeployId() == o.DeployId() && s.PrevDeployId() == o.PrevDeployId() +} + +func (s *schemaDescr) Get() MessageDescriptor { + return s.md +} + +func (s *schemaDescr) String() string { + if s.md.MessageDescriptor == nil { + return "" + } + return s.md.MessageDescriptor.String() +} + +type schemaHistory struct { + options *nsproto.SchemaOptions + latestId string + // a map of schema version to schema descriptor. + versions map[string]*schemaDescr +} + +func (sr *schemaHistory) Equal(o SchemaHistory) bool { + var osr *schemaHistory + var ok bool + + if osr, ok = o.(*schemaHistory); !ok { + return false + } + // compare latest version + if sr.latestId != osr.latestId { + return false + } + + // compare version map + if len(sr.versions) != len(osr.versions) { + return false + } + for v, sd := range sr.versions { + osd, ok := osr.versions[v] + if !ok { + return false + } + if !sd.Equal(osd) { + return false + } + } + + return true +} + +func (sr *schemaHistory) Extends(v SchemaHistory) bool { + cur, hasMore := v.GetLatest() + + for hasMore { + srCur, inSr := sr.Get(cur.DeployId()) + if !inSr || !cur.Equal(srCur) { + return false + } + cur, hasMore = v.Get(cur.PrevDeployId()) + } + return true +} + +func (sr *schemaHistory) Get(id string) (SchemaDescr, bool) { + sd, ok := sr.versions[id] + if !ok { + return nil, false + } + return sd, true +} + +func (sr *schemaHistory) GetLatest() (SchemaDescr, bool) { + return sr.Get(sr.latestId) +} + +// toSchemaOptions returns the corresponding SchemaOptions proto for the provided SchemaHistory +func toSchemaOptions(sr SchemaHistory) *nsproto.SchemaOptions { + if sr == nil { + return nil + } + _, ok := sr.(*schemaHistory) + if !ok { + return nil + } + return sr.(*schemaHistory).options +} + +func emptySchemaHistory() SchemaHistory { + return &schemaHistory{options: nil, versions: make(map[string]*schemaDescr)} +} + +// LoadSchemaHistory loads schema registry from SchemaOptions proto. +func LoadSchemaHistory(options *nsproto.SchemaOptions) (SchemaHistory, error) { + sr := &schemaHistory{options: options, versions: make(map[string]*schemaDescr)} + if options == nil || + options.GetHistory() == nil || + len(options.GetHistory().GetVersions()) == 0 { + return sr, nil + } + + msgName := options.GetDefaultMessageName() + if len(msgName) == 0 { + return nil, xerrors.Wrap(errInvalidSchemaOptions, "default message name is not specified") + } + + var prevId string + for _, fdbSet := range options.GetHistory().GetVersions() { + if len(prevId) > 0 && fdbSet.PrevId != prevId { + return nil, xerrors.Wrapf(errInvalidSchemaOptions, "schema history is not sorted by deploy id in ascending order") + } + sd, err := loadFileDescriptorSet(fdbSet, msgName) + if err != nil { + return nil, err + } + sr.versions[sd.DeployId()] = sd + prevId = sd.DeployId() + } + sr.latestId = prevId + + return sr, nil +} + +func loadFileDescriptorSet(fdSet *nsproto.FileDescriptorSet, msgName string) (*schemaDescr, error) { + // assuming file descriptors are topological sorted + var dependencies []*desc.FileDescriptor + var curfd *desc.FileDescriptor + for i, fdb := range fdSet.Descriptors { + fdp, err := decodeFileDescriptorProto(fdb) + if err != nil { + return nil, xerrors.Wrapf(err, "failed to decode file descriptor(%d) in version(%s)", i, fdSet.DeployId) + } + fd, err := desc.CreateFileDescriptor(fdp, dependencies...) + if err != nil { + return nil, xerrors.Wrapf(err, "failed to create file descriptor(%d) in version(%s)", i, fdSet.DeployId) + } + if !fd.IsProto3() { + return nil, xerrors.Wrapf(errSyntaxNotProto3, "file descriptor(%s) is not proto3", fd.GetFullyQualifiedName()) + } + curfd = fd + dependencies = append(dependencies, curfd) + } + + md := curfd.FindMessage(msgName) + if md != nil { + return newSchemaDescr(fdSet.DeployId, fdSet.PrevId, MessageDescriptor{md}), nil + } + return nil, xerrors.Wrapf(errInvalidSchemaOptions, "failed to find message (%s) in deployment(%s)", msgName, fdSet.DeployId) +} + +// decodeFileDescriptorProto decodes the bytes of proto file descriptor. +func decodeFileDescriptorProto(fdb []byte) (*dpb.FileDescriptorProto, error) { + fd := dpb.FileDescriptorProto{} + + if err := proto.Unmarshal(fdb, &fd); err != nil { + return nil, err + } + return &fd, nil +} + +// genDependencyDescriptors produces a topological sort of the dependency descriptors for the provided +// file descriptor, the result contains the input file descriptor as the last in the slice, +// the result contains indirect dependencies as well, dependencies in the return are distinct. +func genDependencyDescriptors(infd *desc.FileDescriptor) []*desc.FileDescriptor { + var depfds []*desc.FileDescriptor + dedup := make(map[string]struct{}) + + for _, dep := range infd.GetDependencies() { + depfs2 := genDependencyDescriptors(dep) + for _, fd := range depfs2 { + if _, ok := dedup[fd.GetFullyQualifiedName()]; !ok { + dedup[fd.GetFullyQualifiedName()] = struct{}{} + depfds = append(depfds, fd) + } + } + } + if _, ok := dedup[infd.GetFullyQualifiedName()]; !ok { + depfds = append(depfds, infd) + dedup[infd.GetFullyQualifiedName()] = struct{}{} + } + return depfds +} + +// protoStringProvider provides proto contents from strings. +func protoStringProvider(source map[string]string) protoparse.FileAccessor { + if len(source) == 0 { + return nil + } + return func(filename string) (io.ReadCloser, error) { + if contents, ok := source[filename]; ok { + return ioutil.NopCloser(strings.NewReader(contents)), nil + } else { + return nil, os.ErrNotExist + } + } +} + +func parseProto(protoFile string, accessor protoparse.FileAccessor, importPaths ...string) ([]*desc.FileDescriptor, error) { + p := protoparse.Parser{ImportPaths: importPaths, Accessor: accessor, IncludeSourceCodeInfo: true} + fds, err := p.ParseFiles(protoFile) + if err != nil { + return nil, xerrors.Wrapf(err, "failed to parse proto file: %s", protoFile) + } + if len(fds) == 0 { + return nil, xerrors.Wrapf(errEmptyProtoFile, "proto file (%s) can not be parsed", protoFile) + } + if !fds[0].IsProto3() { + return nil, xerrors.Wrapf(errSyntaxNotProto3, "proto file (%s) is not proto3", protoFile) + } + return genDependencyDescriptors(fds[0]), nil +} + +func marshalFileDescriptors(fdList []*desc.FileDescriptor) ([][]byte, error) { + var dlist [][]byte + for _, fd := range fdList { + fdbytes, err := proto.Marshal(fd.AsProto()) + if err != nil { + return nil, xerrors.Wrapf(err, "failed to marshal file descriptor: %s", fd.GetFullyQualifiedName()) + } + dlist = append(dlist, fdbytes) + } + return dlist, nil +} + +// AppendSchemaOptions appends to a provided SchemaOptions with a new version of schema. +// The new version of schema is parsed out of the provided protoFile/msgName/contents. +// schemaOpt: the SchemaOptions to be appended to, if nil, a new SchemaOption is created. +// deployID: the version ID of the new schema. +// protoFile: name of the top level proto file. +// msgName: name of the top level proto message. +// contents: map of name to proto strings. +// Except for the top level proto file, other imported proto files' key must be exactly the same +// as how they are imported in the import statement: +// E.g. if import.proto is imported as below +// import "mainpkg/imported.proto"; +// Then the map key for improted.proto must be "mainpkg/imported.proto" +// See src/dbnode/namesapce/kvadmin test for example. +func AppendSchemaOptions(schemaOpt *nsproto.SchemaOptions, protoFile, msgName string, contents map[string]string, deployID string) (*nsproto.SchemaOptions, error) { + // Verify schema options + schemaHist, err := LoadSchemaHistory(schemaOpt) + if err != nil { + return nil, xerrors.Wrap(err, "can not append to invalid schema history") + } + // Verify deploy ID + if deployID == "" { + return nil, errEmptyDeployID + } + if _, ok := schemaHist.Get(deployID); ok { + return nil, errDuplicateDeployID + } + + var prevID string + if descr, ok := schemaHist.GetLatest(); ok { + prevID = descr.DeployId() + } + + out, err := parseProto(protoFile, protoStringProvider(contents)) + if err != nil { + return nil, xerrors.Wrapf(err, "failed to parse schema from %v", protoFile) + } + + dlist, err := marshalFileDescriptors(out) + if err != nil { + return nil, err + } + + if schemaOpt == nil { + schemaOpt = &nsproto.SchemaOptions{ + History: &nsproto.SchemaHistory{}, + DefaultMessageName: msgName, + } + } + schemaOpt.History.Versions = append(schemaOpt.History.Versions, &nsproto.FileDescriptorSet{DeployId: deployID, PrevId: prevID, Descriptors: dlist}) + schemaOpt.DefaultMessageName = msgName + + if _, err := LoadSchemaHistory(schemaOpt); err != nil { + return nil, xerrors.Wrap(err, "new schema is not valid") + } + + return schemaOpt, nil +} + +func LoadSchemaRegistryFromFile(schemaReg SchemaRegistry, nsID ident.ID, deployID string, protoFile string, msgName string, importPath ...string) error { + out, err := parseProto(protoFile, nil, importPath...) + if err != nil { + return xerrors.Wrapf(err, "failed to parse input proto file %v", protoFile) + } + + dlist, err := marshalFileDescriptors(out) + if err != nil { + return err + } + + schemaOpt := &nsproto.SchemaOptions{ + History: &nsproto.SchemaHistory{ + Versions: []*nsproto.FileDescriptorSet{{DeployId: deployID, Descriptors: dlist}}, + }, + DefaultMessageName: msgName, + } + schemaHis, err := LoadSchemaHistory(schemaOpt) + if err != nil { + return xerrors.Wrapf(err, "failed to load schema history from file: %v with msg: %v", protoFile, msgName) + } + err = schemaReg.SetSchemaHistory(nsID, schemaHis) + if err != nil { + return xerrors.Wrapf(err, "failed to update schema registry for %v", nsID.String()) + } + return nil +} + +func GenTestSchemaOptions(protoFile string, importPath ...string) *nsproto.SchemaOptions { + out, _ := parseProto(protoFile, nil, importPath...) + + dlist, _ := marshalFileDescriptors(out) + + return &nsproto.SchemaOptions{ + History: &nsproto.SchemaHistory{ + Versions: []*nsproto.FileDescriptorSet{ + {DeployId: "first", Descriptors: dlist}, + {DeployId: "second", PrevId: "first", Descriptors: dlist}, + {DeployId: "third", PrevId: "second", Descriptors: dlist}, + }, + }, + DefaultMessageName: "mainpkg.TestMessage", + } +} + +func GetTestSchemaDescr(md *desc.MessageDescriptor) SchemaDescr { + return &schemaDescr{md: MessageDescriptor{md}} +} + +func GetTestSchemaDescrWithDeployID(md *desc.MessageDescriptor, deployID string) SchemaDescr { + return &schemaDescr{md: MessageDescriptor{md}, deployId: deployID} +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/schema_registry.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/schema_registry.go new file mode 100644 index 00000000..014f19d4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/schema_registry.go @@ -0,0 +1,188 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "fmt" + "sync" + + xclose "github.com/m3db/m3/src/x/close" + "github.com/m3db/m3/src/x/ident" + xwatch "github.com/m3db/m3/src/x/watch" + + "go.uber.org/zap" +) + +func newSchemaHistoryNotFoundError(nsIDStr string) error { + return &schemaHistoryNotFoundError{nsIDStr} +} + +type schemaHistoryNotFoundError struct { + nsIDStr string +} + +func (s *schemaHistoryNotFoundError) Error() string { + return fmt.Sprintf("schema history is not found for %s", s.nsIDStr) +} + +type schemaRegistry struct { + sync.RWMutex + + protoEnabled bool + logger *zap.Logger + registry map[string]xwatch.Watchable +} + +func NewSchemaRegistry(protoEnabled bool, logger *zap.Logger) SchemaRegistry { + return newSchemaRegistry(protoEnabled, logger) +} + +func newSchemaRegistry(protoEnabled bool, logger *zap.Logger) SchemaRegistry { + return &schemaRegistry{ + protoEnabled: protoEnabled, + logger: logger, + registry: make(map[string]xwatch.Watchable), + } +} + +func (sr *schemaRegistry) SetSchemaHistory(id ident.ID, history SchemaHistory) error { + if !sr.protoEnabled { + if sr.logger != nil { + sr.logger.Warn("proto is not enabled, can not update schema registry", + zap.Stringer("namespace", id)) + } + return nil + } + + if newSchema, ok := history.GetLatest(); !ok { + return fmt.Errorf("can not set empty schema history for %v", id.String()) + } else if sr.logger != nil { + sr.logger.Info("proto is enabled, setting schema", + zap.Stringer("namespace", id), + zap.String("version", newSchema.DeployId())) + } + + sr.Lock() + defer sr.Unlock() + + // TODO [haijun] use generated map for optimized map lookup. + current, ok := sr.registry[id.String()] + if ok { + if !history.Extends(current.Get().(SchemaHistory)) { + return fmt.Errorf("can not update schema registry to one that does not extends the existing one") + } + } else { + sr.registry[id.String()] = xwatch.NewWatchable() + } + + sr.registry[id.String()].Update(history) + return nil +} + +func (sr *schemaRegistry) GetLatestSchema(id ident.ID) (SchemaDescr, error) { + if !sr.protoEnabled { + return nil, nil + } + + nsIDStr := id.String() + history, err := sr.getSchemaHistory(nsIDStr) + if err != nil { + return nil, err + } + schema, ok := history.GetLatest() + if !ok { + return nil, fmt.Errorf("schema history is empty for namespace %v", nsIDStr) + } + return schema, nil +} + +func (sr *schemaRegistry) GetSchema(id ident.ID, schemaId string) (SchemaDescr, error) { + if !sr.protoEnabled { + return nil, nil + } + + nsIDStr := id.String() + history, err := sr.getSchemaHistory(nsIDStr) + if err != nil { + return nil, err + } + schema, ok := history.Get(schemaId) + if !ok { + return nil, fmt.Errorf("schema of version %v is not found for namespace %v", schemaId, nsIDStr) + } + return schema, nil +} + +func (sr *schemaRegistry) getSchemaHistory(nsIDStr string) (SchemaHistory, error) { + sr.RLock() + defer sr.RUnlock() + + history, ok := sr.registry[nsIDStr] + if !ok { + return nil, newSchemaHistoryNotFoundError(nsIDStr) + } + return history.Get().(SchemaHistory), nil +} + +func (sr *schemaRegistry) RegisterListener( + nsID ident.ID, + listener SchemaListener, +) (xclose.SimpleCloser, error) { + if !sr.protoEnabled { + return nil, nil + } + + nsIDStr := nsID.String() + sr.RLock() + defer sr.RUnlock() + + watchable, ok := sr.registry[nsIDStr] + if !ok { + return nil, fmt.Errorf("schema not found for namespace: %v", nsIDStr) + } + + _, watch, _ := watchable.Watch() + + // We always initialize the watchable so always read + // the first notification value + <-watch.C() + + // Deliver the current schema + listener.SetSchemaHistory(watchable.Get().(SchemaHistory)) + + // Spawn a new goroutine that will terminate when the + // watchable terminates on the close of the runtime options manager + go func() { + for range watch.C() { + listener.SetSchemaHistory(watchable.Get().(SchemaHistory)) + } + }() + + return watch, nil +} + +func (sr *schemaRegistry) Close() { + sr.Lock() + defer sr.Unlock() + for _, w := range sr.registry { + w.Close() + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/schema_registry_updater.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/schema_registry_updater.go new file mode 100644 index 00000000..245103ca --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/schema_registry_updater.go @@ -0,0 +1,92 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "fmt" + + xerrors "github.com/m3db/m3/src/x/errors" + + "go.uber.org/zap" +) + +// UpdateSchemaRegistry updates schema registry with namespace updates. +func UpdateSchemaRegistry(newNamespaces Map, schemaReg SchemaRegistry, log *zap.Logger) error { + schemaUpdates := newNamespaces.Metadatas() + multiErr := xerrors.NewMultiError() + for _, metadata := range schemaUpdates { + var ( + curSchemaID = "none" + curSchemaNone = true + ) + curSchema, err := schemaReg.GetLatestSchema(metadata.ID()) + if err != nil { + // NB(bodu): Schema history not found is a valid error as this occurs on initial bootstrap for the db. + if _, ok := err.(*schemaHistoryNotFoundError); !ok { + multiErr = multiErr.Add(fmt.Errorf("cannot get latest namespace schema: %v", err)) + continue + } + } + + if curSchema != nil { + curSchemaNone = false + curSchemaID = curSchema.DeployId() + if len(curSchemaID) == 0 { + msg := "namespace schema update invalid with empty deploy ID" + log.Warn(msg, zap.Stringer("namespace", metadata.ID()), + zap.String("currentSchemaID", curSchemaID)) + multiErr = multiErr.Add(fmt.Errorf("%s: namespace=%s", msg, metadata.ID().String())) + continue + } + } + + // Log schema update. + latestSchema, found := metadata.Options().SchemaHistory().GetLatest() + if !found { + if !curSchemaNone { + // NB(r): Only interpret this as a warning/error if already had a schema, + // otherwise this is just a namespace that is not using protobuf schemas. + msg := "namespace schema not found on update" + log.Warn(msg, zap.Stringer("namespace", metadata.ID()), + zap.String("currentSchema", curSchemaID)) + multiErr = multiErr.Add(fmt.Errorf("%s: namespace=%s", msg, metadata.ID().String())) + } + continue + } + + log.Info("updating database namespace schema", zap.Stringer("namespace", metadata.ID()), + zap.String("currentSchema", curSchemaID), zap.String("latestSchema", latestSchema.DeployId())) + + err = schemaReg.SetSchemaHistory(metadata.ID(), metadata.Options().SchemaHistory()) + if err != nil { + msg := "namespace schema failed to update to latest schema" + log.Warn(msg, + zap.Stringer("namespace", metadata.ID()), + zap.Error(err)) + multiErr = multiErr.Add(fmt.Errorf("%s: namespace=%s, error=%v", + msg, metadata.ID().String(), err)) + } + } + if !multiErr.Empty() { + return multiErr + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/static.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/static.go new file mode 100644 index 00000000..b2eacd21 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/static.go @@ -0,0 +1,69 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + xwatch "github.com/m3db/m3/src/x/watch" +) + +type staticInit struct { + metadatas []Metadata +} + +// NewStaticInitializer returns a new static registry initializer +func NewStaticInitializer(metadatas []Metadata) Initializer { + return &staticInit{ + metadatas: metadatas, + } +} + +func (i *staticInit) Init() (Registry, error) { + return newStaticRegistry(i.metadatas) +} + +type staticReg struct { + xwatch.Watchable +} + +func newStaticRegistry(metadatas []Metadata) (Registry, error) { + m, err := NewMap(metadatas) + if err != nil { + return nil, err + } + reg := &staticReg{xwatch.NewWatchable()} + if err := reg.Update(m); err != nil { + return nil, err + } + return reg, nil +} + +func (r *staticReg) Watch() (Watch, error) { + _, w, err := r.Watchable.Watch() + if err != nil { + return nil, err + } + return NewWatch(w), nil +} + +func (r *staticReg) Close() error { + r.Watchable.Close() + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/types.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/types.go new file mode 100644 index 00000000..1dbde2e1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/types.go @@ -0,0 +1,359 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "time" + + "github.com/m3db/m3/src/cluster/client" + "github.com/m3db/m3/src/dbnode/retention" + xclose "github.com/m3db/m3/src/x/close" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + + "github.com/gogo/protobuf/proto" +) + +// Options controls namespace behavior +type Options interface { + // Validate validates the options + Validate() error + + // Equal returns true if the provide value is equal to this one + Equal(value Options) bool + + // SetBootstrapEnabled sets whether this namespace requires bootstrapping + SetBootstrapEnabled(value bool) Options + + // BootstrapEnabled returns whether this namespace requires bootstrapping + BootstrapEnabled() bool + + // SetFlushEnabled sets whether the in-memory data for this namespace needs to be flushed + SetFlushEnabled(value bool) Options + + // FlushEnabled returns whether the in-memory data for this namespace needs to be flushed + FlushEnabled() bool + + // SetSnapshotEnabled sets whether the in-memory data for this namespace should be snapshotted regularly + SetSnapshotEnabled(value bool) Options + + // SnapshotEnabled returns whether the in-memory data for this namespace should be snapshotted regularly + SnapshotEnabled() bool + + // SetWritesToCommitLog sets whether writes for series in this namespace need to go to commit log + SetWritesToCommitLog(value bool) Options + + // WritesToCommitLog returns whether writes for series in this namespace need to go to commit log + WritesToCommitLog() bool + + // SetCleanupEnabled sets whether this namespace requires cleaning up fileset/snapshot files + SetCleanupEnabled(value bool) Options + + // CleanupEnabled returns whether this namespace requires cleaning up fileset/snapshot files + CleanupEnabled() bool + + // SetRepairEnabled sets whether the data for this namespace needs to be repaired + SetRepairEnabled(value bool) Options + + // RepairEnabled returns whether the data for this namespace needs to be repaired + RepairEnabled() bool + + // SetColdWritesEnabled sets whether cold writes are enabled for this namespace. + SetColdWritesEnabled(value bool) Options + + // ColdWritesEnabled returns whether cold writes are enabled for this namespace. + ColdWritesEnabled() bool + + // SetCacheBlocksOnRetrieve sets whether to cache blocks from this namespace when retrieved. + // If global CacheBlocksOnRetrieve option in config.BlockRetrievePolicy is set to false, + // then that will override any namespace-specific CacheBlocksOnRetrieve options set to true. + SetCacheBlocksOnRetrieve(value bool) Options + + // CacheBlocksOnRetrieve returns whether to cache blocks from this namespace when retrieved. + CacheBlocksOnRetrieve() bool + + // SetRetentionOptions sets the retention options for this namespace + SetRetentionOptions(value retention.Options) Options + + // RetentionOptions returns the retention options for this namespace + RetentionOptions() retention.Options + + // SetIndexOptions sets the IndexOptions. + SetIndexOptions(value IndexOptions) Options + + // IndexOptions returns the IndexOptions. + IndexOptions() IndexOptions + + // SetSchemaHistory sets the schema registry for this namespace. + SetSchemaHistory(value SchemaHistory) Options + + // SchemaHistory returns the schema registry for this namespace. + SchemaHistory() SchemaHistory + + // SetRuntimeOptions sets the RuntimeOptions. + SetRuntimeOptions(value RuntimeOptions) Options + + // RuntimeOptions returns the RuntimeOptions. + RuntimeOptions() RuntimeOptions + + // SetExtendedOptions sets the ExtendedOptions. + SetExtendedOptions(value ExtendedOptions) Options + + // ExtendedOptions returns the dynamically typed ExtendedOptions (requires type check on access). + ExtendedOptions() ExtendedOptions + + // SetAggregationOptions sets the aggregation-related options for this namespace. + SetAggregationOptions(value AggregationOptions) Options + + // AggregationOptions returns the aggregation-related options for this namespace. + AggregationOptions() AggregationOptions +} + +// IndexOptions controls the indexing options for a namespace. +type IndexOptions interface { + // Equal returns true if the provide value is equal to this one. + Equal(value IndexOptions) bool + + // SetEnabled sets whether indexing is enabled. + SetEnabled(value bool) IndexOptions + + // Enabled returns whether indexing is enabled. + Enabled() bool + + // SetBlockSize returns the block size. + SetBlockSize(value time.Duration) IndexOptions + + // BlockSize returns the block size. + BlockSize() time.Duration +} + +// SchemaDescr describes the schema for a complex type value. +type SchemaDescr interface { + // DeployId returns the deploy id of the schema. + DeployId() string + // PrevDeployId returns the previous deploy id of the schema. + PrevDeployId() string + // Get returns the message descriptor for the schema. + Get() MessageDescriptor + // String returns the compact text of the message descriptor. + String() string + // Equal returns true if the provided value is equal to this one. + Equal(SchemaDescr) bool +} + +// SchemaHistory represents schema history for a namespace. +type SchemaHistory interface { + // Equal returns true if the provided value is equal to this one. + Equal(SchemaHistory) bool + + // Extends returns true iif the provided value has a lineage to this one. + Extends(SchemaHistory) bool + + // Get gets the schema descriptor for the specified deploy id. + Get(id string) (SchemaDescr, bool) + + // GetLatest gets the latest version of schema descriptor. + GetLatest() (SchemaDescr, bool) +} + +// SchemaListener listens for updates to schema registry for a namespace. +type SchemaListener interface { + // SetSchemaHistory is called when the listener is registered + // and when any updates occurred passing the new schema history. + SetSchemaHistory(value SchemaHistory) +} + +// SchemaRegistry represents the schema registry for a database. +// It is where dynamic schema updates are delivered into, +// and where schema is retrieved from at series read and write path. +type SchemaRegistry interface { + // GetLatestSchema gets the latest schema for the namespace. + // If proto is not enabled, nil, nil is returned + GetLatestSchema(id ident.ID) (SchemaDescr, error) + + // GetSchema gets the latest schema for the namespace. + // If proto is not enabled, nil, nil is returned + GetSchema(id ident.ID, schemaID string) (SchemaDescr, error) + + // SetSchemaHistory sets the schema history for the namespace. + // If proto is not enabled, nil is returned + SetSchemaHistory(id ident.ID, history SchemaHistory) error + + // RegisterListener registers a schema listener for the namespace. + // If proto is not enabled, nil, nil is returned + RegisterListener(id ident.ID, listener SchemaListener) (xclose.SimpleCloser, error) + + // Close closes all the listeners. + Close() +} + +// Metadata represents namespace metadata information +type Metadata interface { + // Equal returns true if the provide value is equal to this one + Equal(value Metadata) bool + + // ID is the ID of the namespace + ID() ident.ID + + // Options is the namespace options + Options() Options +} + +// Map is mapping from known namespaces' ID to their Metadata +type Map interface { + // Equal returns true if the provide value is equal to this one + Equal(value Map) bool + + // Get gets the metadata for the provided namespace + Get(ident.ID) (Metadata, error) + + // IDs returns the ID of known namespaces + IDs() []ident.ID + + // Metadatas returns the metadata of known namespaces + Metadatas() []Metadata +} + +// Watch is a watch on a namespace Map +type Watch interface { + // C is the notification channel for when a value becomes available + C() <-chan struct{} + + // Get the current namespace map + Get() Map + + // Close closes the watch + Close() error +} + +// Registry is an un-changing container for a Map +type Registry interface { + // Watch for the Registry changes + Watch() (Watch, error) + + // Close closes the registry + Close() error +} + +// Initializer can init new instances of namespace registries +type Initializer interface { + // Init will return a new Registry + Init() (Registry, error) +} + +// DynamicOptions is a set of options for dynamic namespace registry +type DynamicOptions interface { + // Validate validates the options + Validate() error + + // SetInstrumentOptions sets the instrumentation options + SetInstrumentOptions(value instrument.Options) DynamicOptions + + // InstrumentOptions returns the instrumentation options + InstrumentOptions() instrument.Options + + // SetConfigServiceClient sets the client of ConfigService + SetConfigServiceClient(c client.Client) DynamicOptions + + // ConfigServiceClient returns the client of ConfigService + ConfigServiceClient() client.Client + + // SetNamespaceRegistryKey sets the kv-store key used for the + // NamespaceRegistry + SetNamespaceRegistryKey(k string) DynamicOptions + + // NamespaceRegistryKey returns the kv-store key used for the + // NamespaceRegistry + NamespaceRegistryKey() string + + // SetForceColdWritesEnabled sets whether or not to force enable cold writes + // for all ns. + SetForceColdWritesEnabled(enabled bool) DynamicOptions + + // ForceColdWritesEnabled returns whether or not to force enable cold writes + // for all ns. + ForceColdWritesEnabled() bool +} + +// NamespaceWatch watches for namespace updates. +type NamespaceWatch interface { + // Start starts the namespace watch. + Start() error + + // Stop stops the namespace watch. + Stop() error + + // close stops the watch, and releases any held resources. + Close() error +} + +// NamespaceUpdater is a namespace updater function. +type NamespaceUpdater func(Map) error + +// ExtendedOptions is the type for dynamically typed options. +type ExtendedOptions interface { + // ToProto converts ExtendedOptions to the corresponding protobuf message. + ToProto() (msg proto.Message, typeURLPrefix string) + + // Validate validates the ExtendedOptions. + Validate() error +} + +// AggregationOptions is a set of options for aggregating data +// within the namespace. +type AggregationOptions interface { + // Equal returns true if the provided value is equal to this one. + Equal(value AggregationOptions) bool + + // SetAggregations sets the aggregations for this namespace. + SetAggregations(value []Aggregation) AggregationOptions + + // Aggregations returns the aggregations for this namespace. + Aggregations() []Aggregation +} + +// Aggregation describes data points within the namespace. +type Aggregation struct { + // Aggregated is true if data points are aggregated, false otherwise. + Aggregated bool + + // Attributes specifies how to aggregate data when aggregated is set to true. + // This field is ignored when aggregated is false. + Attributes AggregatedAttributes +} + +// AggregationAttributes are attributes specifying how data points should be aggregated. +type AggregatedAttributes struct { + // Resolution is the time range to aggregate data across. + Resolution time.Duration + + // DownsampleOptions stores options around how data points are downsampled. + DownsampleOptions DownsampleOptions +} + +// DownsampleOptions is a set of options related to downsampling data. +type DownsampleOptions struct { + // All indicates whether to send data points to this namespace. + // If set to false, this namespace will not receive data points. In this + // case, data will need to be sent to the namespace via another mechanism + // (e.g. rollup/recording rules). + All bool +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/utils.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/utils.go new file mode 100644 index 00000000..d31698f9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/utils.go @@ -0,0 +1,45 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + "fmt" + + "github.com/m3db/m3/src/x/ident" +) + +// MustBuildMetadatas builds a list of metadatas for testing with given +// index enabled option and ids. +func MustBuildMetadatas(indexEnabled bool, ids ...string) []Metadata { + idxOpts := NewIndexOptions().SetEnabled(indexEnabled) + opts := NewOptions().SetIndexOptions(idxOpts) + mds := make([]Metadata, 0, len(ids)) + for _, id := range ids { + md, err := NewMetadata(ident.StringID(id), opts) + if err != nil { + panic(fmt.Sprintf("error during MustBuildMetadatas: %v", err)) + } + + mds = append(mds, md) + } + + return mds +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/namespace/watch.go b/vendor/github.com/m3db/m3/src/dbnode/namespace/watch.go new file mode 100644 index 00000000..39f724f1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/namespace/watch.go @@ -0,0 +1,52 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package namespace + +import ( + xwatch "github.com/m3db/m3/src/x/watch" +) + +type mapWatch struct { + xwatch.Watch +} + +// NewWatch creates a new watch on a topology map +// from a generic watch that watches a Map +func NewWatch(w xwatch.Watch) Watch { + return &mapWatch{w} +} + +func (w *mapWatch) C() <-chan struct{} { + return w.Watch.C() +} + +func (w *mapWatch) Get() Map { + value := w.Watch.Get() + if value == nil { + return nil + } + return value.(Map) +} + +func (w *mapWatch) Close() error { + w.Watch.Close() + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/convert/convert.go b/vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/convert/convert.go new file mode 100644 index 00000000..6d40c56c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/convert/convert.go @@ -0,0 +1,628 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package convert + +import ( + "errors" + "fmt" + "time" + + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" + tterrors "github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/errors" + "github.com/m3db/m3/src/dbnode/storage/index" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/dbnode/x/xpool" + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/idx" + "github.com/m3db/m3/src/x/checked" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + xtime "github.com/m3db/m3/src/x/time" +) + +var ( + errUnknownTimeType = errors.New("unknown time type") + errUnknownUnit = errors.New("unknown unit") + errNilTaggedRequest = errors.New("nil write tagged request") + + timeZero time.Time +) + +const ( + fetchTaggedTimeType = rpc.TimeType_UNIX_NANOSECONDS +) + +// ToTime converts a value to a time +func ToTime(value int64, timeType rpc.TimeType) (time.Time, error) { + unit, err := ToDuration(timeType) + if err != nil { + return timeZero, err + } + // NB(r): Doesn't matter what unit is if we have zero of them. + if value == 0 { + return timeZero, nil + } + return xtime.FromNormalizedTime(value, unit), nil +} + +// ToValue converts a time to a value +func ToValue(t time.Time, timeType rpc.TimeType) (int64, error) { + unit, err := ToDuration(timeType) + if err != nil { + return 0, err + } + return xtime.ToNormalizedTime(t, unit), nil +} + +// ToDuration converts a time type to a duration +func ToDuration(timeType rpc.TimeType) (time.Duration, error) { + unit, err := ToUnit(timeType) + if err != nil { + return 0, err + } + return unit.Value() +} + +// ToUnit converts a time type to a unit +func ToUnit(timeType rpc.TimeType) (xtime.Unit, error) { + switch timeType { + case rpc.TimeType_UNIX_SECONDS: + return xtime.Second, nil + case rpc.TimeType_UNIX_MILLISECONDS: + return xtime.Millisecond, nil + case rpc.TimeType_UNIX_MICROSECONDS: + return xtime.Microsecond, nil + case rpc.TimeType_UNIX_NANOSECONDS: + return xtime.Nanosecond, nil + } + return 0, errUnknownTimeType +} + +// ToTimeType converts a unit to a time type +func ToTimeType(unit xtime.Unit) (rpc.TimeType, error) { + switch unit { + case xtime.Second: + return rpc.TimeType_UNIX_SECONDS, nil + case xtime.Millisecond: + return rpc.TimeType_UNIX_MILLISECONDS, nil + case xtime.Microsecond: + return rpc.TimeType_UNIX_MICROSECONDS, nil + case xtime.Nanosecond: + return rpc.TimeType_UNIX_NANOSECONDS, nil + } + return 0, errUnknownUnit +} + +// ToSegmentsResult is the result of a convert to segments call, +// if the segments were merged then checksum is ptr to the checksum +// otherwise it is nil. +type ToSegmentsResult struct { + Segments *rpc.Segments + Checksum *int64 +} + +// ToSegments converts a list of blocks to segments. +func ToSegments(blocks []xio.BlockReader) (ToSegmentsResult, error) { + if len(blocks) == 0 { + return ToSegmentsResult{}, nil + } + + s := &rpc.Segments{} + + if len(blocks) == 1 { + seg, err := blocks[0].Segment() + if err != nil { + return ToSegmentsResult{}, err + } + if seg.Len() == 0 { + return ToSegmentsResult{}, nil + } + startTime := xtime.ToNormalizedTime(blocks[0].Start, time.Nanosecond) + blockSize := xtime.ToNormalizedDuration(blocks[0].BlockSize, time.Nanosecond) + checksum := int64(seg.CalculateChecksum()) + s.Merged = &rpc.Segment{ + Head: bytesRef(seg.Head), + Tail: bytesRef(seg.Tail), + StartTime: &startTime, + BlockSize: &blockSize, + Checksum: &checksum, + } + return ToSegmentsResult{ + Segments: s, + Checksum: &checksum, + }, nil + } + + for _, block := range blocks { + seg, err := block.Segment() + if err != nil { + return ToSegmentsResult{}, err + } + if seg.Len() == 0 { + continue + } + startTime := xtime.ToNormalizedTime(block.Start, time.Nanosecond) + blockSize := xtime.ToNormalizedDuration(block.BlockSize, time.Nanosecond) + checksum := int64(seg.CalculateChecksum()) + s.Unmerged = append(s.Unmerged, &rpc.Segment{ + Head: bytesRef(seg.Head), + Tail: bytesRef(seg.Tail), + StartTime: &startTime, + BlockSize: &blockSize, + Checksum: &checksum, + }) + } + if len(s.Unmerged) == 0 { + return ToSegmentsResult{}, nil + } + + return ToSegmentsResult{Segments: s}, nil +} + +func bytesRef(data checked.Bytes) []byte { + if data != nil { + return data.Bytes() + } + return nil +} + +// ToRPCError converts a server error to a RPC error. +func ToRPCError(err error) *rpc.Error { + if err == nil { + return nil + } + if xerrors.IsInvalidParams(err) { + return tterrors.NewBadRequestError(err) + } + return tterrors.NewInternalError(err) +} + +// FetchTaggedConversionPools allows users to pass a pool for conversions. +type FetchTaggedConversionPools interface { + // ID returns an ident.Pool + ID() ident.Pool + + // CheckedBytesWrapperPool returns a CheckedBytesWrapperPool. + CheckedBytesWrapper() xpool.CheckedBytesWrapperPool +} + +// FromRPCFetchTaggedRequest converts the rpc request type for FetchTaggedRequest into corresponding Go API types. +func FromRPCFetchTaggedRequest( + req *rpc.FetchTaggedRequest, pools FetchTaggedConversionPools, +) (ident.ID, index.Query, index.QueryOptions, bool, error) { + start, rangeStartErr := ToTime(req.RangeStart, fetchTaggedTimeType) + if rangeStartErr != nil { + return nil, index.Query{}, index.QueryOptions{}, false, rangeStartErr + } + + end, rangeEndErr := ToTime(req.RangeEnd, fetchTaggedTimeType) + if rangeEndErr != nil { + return nil, index.Query{}, index.QueryOptions{}, false, rangeEndErr + } + + opts := index.QueryOptions{ + StartInclusive: start, + EndExclusive: end, + RequireExhaustive: req.RequireExhaustive, + } + if l := req.Limit; l != nil { + opts.SeriesLimit = int(*l) + } + if l := req.DocsLimit; l != nil { + opts.DocsLimit = int(*l) + } + + q, err := idx.Unmarshal(req.Query) + if err != nil { + return nil, index.Query{}, index.QueryOptions{}, false, err + } + + var ns ident.ID + if pools != nil { + nsBytes := pools.CheckedBytesWrapper().Get(req.NameSpace) + ns = pools.ID().BinaryID(nsBytes) + } else { + ns = ident.StringID(string(req.NameSpace)) + } + return ns, index.Query{Query: q}, opts, req.FetchData, nil +} + +// ToRPCFetchTaggedRequest converts the Go `client/` types into rpc request type for FetchTaggedRequest. +func ToRPCFetchTaggedRequest( + ns ident.ID, + q index.Query, + opts index.QueryOptions, + fetchData bool, +) (rpc.FetchTaggedRequest, error) { + rangeStart, tsErr := ToValue(opts.StartInclusive, fetchTaggedTimeType) + if tsErr != nil { + return rpc.FetchTaggedRequest{}, tsErr + } + + rangeEnd, tsErr := ToValue(opts.EndExclusive, fetchTaggedTimeType) + if tsErr != nil { + return rpc.FetchTaggedRequest{}, tsErr + } + + query, queryErr := idx.Marshal(q.Query) + if queryErr != nil { + return rpc.FetchTaggedRequest{}, queryErr + } + + request := rpc.FetchTaggedRequest{ + NameSpace: ns.Bytes(), + RangeStart: rangeStart, + RangeEnd: rangeEnd, + FetchData: fetchData, + Query: query, + RequireExhaustive: opts.RequireExhaustive, + } + + if opts.SeriesLimit > 0 { + l := int64(opts.SeriesLimit) + request.Limit = &l + } + + if opts.DocsLimit > 0 { + l := int64(opts.DocsLimit) + request.DocsLimit = &l + } + + return request, nil +} + +// FromRPCAggregateQueryRequest converts the rpc request type for AggregateRawQueryRequest into corresponding Go API types. +func FromRPCAggregateQueryRequest( + req *rpc.AggregateQueryRequest, +) (ident.ID, index.Query, index.AggregationOptions, error) { + start, rangeStartErr := ToTime(req.RangeStart, fetchTaggedTimeType) + if rangeStartErr != nil { + return nil, index.Query{}, index.AggregationOptions{}, rangeStartErr + } + + end, rangeEndErr := ToTime(req.RangeEnd, fetchTaggedTimeType) + if rangeEndErr != nil { + return nil, index.Query{}, index.AggregationOptions{}, rangeEndErr + } + + opts := index.AggregationOptions{ + QueryOptions: index.QueryOptions{ + StartInclusive: start, + EndExclusive: end, + }, + } + if l := req.Limit; l != nil { + opts.SeriesLimit = int(*l) + } + + query, err := FromRPCQuery(req.Query) + if err != nil { + return nil, index.Query{}, index.AggregationOptions{}, err + } + + opts.FieldFilter = make(index.AggregateFieldFilter, 0, len(req.TagNameFilter)) + for _, f := range req.TagNameFilter { + opts.FieldFilter = append(opts.FieldFilter, []byte(f)) + } + + if req.AggregateQueryType == rpc.AggregateQueryType_AGGREGATE_BY_TAG_NAME_VALUE { + opts.Type = index.AggregateTagNamesAndValues + } else { + opts.Type = index.AggregateTagNames + } + + ns := ident.StringID(req.NameSpace) + return ns, index.Query{Query: query}, opts, nil +} + +// FromRPCAggregateQueryRawRequest converts the rpc request type for AggregateRawQueryRequest into corresponding Go API types. +func FromRPCAggregateQueryRawRequest( + req *rpc.AggregateQueryRawRequest, + pools FetchTaggedConversionPools, +) (ident.ID, index.Query, index.AggregationOptions, error) { + start, rangeStartErr := ToTime(req.RangeStart, fetchTaggedTimeType) + if rangeStartErr != nil { + return nil, index.Query{}, index.AggregationOptions{}, rangeStartErr + } + + end, rangeEndErr := ToTime(req.RangeEnd, fetchTaggedTimeType) + if rangeEndErr != nil { + return nil, index.Query{}, index.AggregationOptions{}, rangeEndErr + } + + opts := index.AggregationOptions{ + QueryOptions: index.QueryOptions{ + StartInclusive: start, + EndExclusive: end, + }, + } + if l := req.Limit; l != nil { + opts.SeriesLimit = int(*l) + } + + query, err := idx.Unmarshal(req.Query) + if err != nil { + return nil, index.Query{}, index.AggregationOptions{}, err + } + + opts.FieldFilter = index.AggregateFieldFilter(req.TagNameFilter) + if req.AggregateQueryType == rpc.AggregateQueryType_AGGREGATE_BY_TAG_NAME_VALUE { + opts.Type = index.AggregateTagNamesAndValues + } else { + opts.Type = index.AggregateTagNames + } + + var ns ident.ID + if pools != nil { + nsBytes := pools.CheckedBytesWrapper().Get(req.NameSpace) + ns = pools.ID().BinaryID(nsBytes) + } else { + ns = ident.StringID(string(req.NameSpace)) + } + return ns, index.Query{Query: query}, opts, nil +} + +// ToRPCAggregateQueryRawRequest converts the Go `client/` types into rpc request type for AggregateQueryRawRequest. +func ToRPCAggregateQueryRawRequest( + ns ident.ID, + q index.Query, + opts index.AggregationOptions, +) (rpc.AggregateQueryRawRequest, error) { + rangeStart, tsErr := ToValue(opts.StartInclusive, fetchTaggedTimeType) + if tsErr != nil { + return rpc.AggregateQueryRawRequest{}, tsErr + } + + rangeEnd, tsErr := ToValue(opts.EndExclusive, fetchTaggedTimeType) + if tsErr != nil { + return rpc.AggregateQueryRawRequest{}, tsErr + } + + request := rpc.AggregateQueryRawRequest{ + NameSpace: ns.Bytes(), + RangeStart: rangeStart, + RangeEnd: rangeEnd, + } + + if opts.SeriesLimit > 0 { + l := int64(opts.SeriesLimit) + request.Limit = &l + } + + query, queryErr := idx.Marshal(q.Query) + if queryErr != nil { + return rpc.AggregateQueryRawRequest{}, queryErr + } + request.Query = query + + if opts.Type == index.AggregateTagNamesAndValues { + request.AggregateQueryType = rpc.AggregateQueryType_AGGREGATE_BY_TAG_NAME_VALUE + } else { + request.AggregateQueryType = rpc.AggregateQueryType_AGGREGATE_BY_TAG_NAME + } + + // TODO(prateek): pool the []byte underlying opts.FieldFilter + filters := make([][]byte, 0, len(opts.FieldFilter)) + for _, f := range opts.FieldFilter { + copied := append([]byte(nil), f...) + filters = append(filters, copied) + } + request.TagNameFilter = filters + + return request, nil +} + +// ToTagsIter returns a tag iterator over the given request. +func ToTagsIter(r *rpc.WriteTaggedRequest) (ident.TagIterator, error) { + if r == nil { + return nil, errNilTaggedRequest + } + + return &writeTaggedIter{ + rawRequest: r, + currentIdx: -1, + }, nil +} + +// NB(prateek): writeTaggedIter is in-efficient in how it handles internal +// allocations. Only use it for non-performance critical RPC endpoints. +type writeTaggedIter struct { + rawRequest *rpc.WriteTaggedRequest + currentIdx int + currentTag ident.Tag +} + +func (w *writeTaggedIter) Next() bool { + w.release() + w.currentIdx++ + if w.currentIdx < len(w.rawRequest.Tags) { + w.currentTag.Name = ident.StringID(w.rawRequest.Tags[w.currentIdx].Name) + w.currentTag.Value = ident.StringID(w.rawRequest.Tags[w.currentIdx].Value) + return true + } + return false +} + +func (w *writeTaggedIter) release() { + if i := w.currentTag.Name; i != nil { + w.currentTag.Name.Finalize() + w.currentTag.Name = nil + } + if i := w.currentTag.Value; i != nil { + w.currentTag.Value.Finalize() + w.currentTag.Value = nil + } +} + +func (w *writeTaggedIter) Current() ident.Tag { + return w.currentTag +} + +func (w *writeTaggedIter) CurrentIndex() int { + if w.currentIdx >= 0 { + return w.currentIdx + } + return 0 +} + +func (w *writeTaggedIter) Err() error { + return nil +} + +func (w *writeTaggedIter) Close() { + w.release() + w.currentIdx = -1 +} + +func (w *writeTaggedIter) Len() int { + return len(w.rawRequest.Tags) +} + +func (w *writeTaggedIter) Remaining() int { + if r := len(w.rawRequest.Tags) - 1 - w.currentIdx; r >= 0 { + return r + } + return 0 +} + +func (w *writeTaggedIter) Duplicate() ident.TagIterator { + return &writeTaggedIter{ + rawRequest: w.rawRequest, + currentIdx: -1, + } +} + +func (w *writeTaggedIter) Rewind() { + w.release() + w.currentIdx = -1 +} + +// FromRPCQuery will create a m3ninx index query from an RPC query. +// NB: a nil query is considered equivalent to an `All` query. +func FromRPCQuery(query *rpc.Query) (idx.Query, error) { + if query == nil { + return idx.NewAllQuery(), nil + } + + queryProto, err := parseQuery(query) + if err != nil { + return idx.Query{}, err + } + + marshalled, err := queryProto.Marshal() + if err != nil { + return idx.Query{}, err + } + + return idx.Unmarshal(marshalled) +} + +func parseQuery(query *rpc.Query) (*querypb.Query, error) { + result := new(querypb.Query) + if query == nil { + return nil, xerrors.NewInvalidParamsError(fmt.Errorf("no query specified")) + } + if query.All != nil { + result.Query = &querypb.Query_All{ + All: &querypb.AllQuery{}, + } + } + if query.Field != nil { + result.Query = &querypb.Query_Field{ + Field: &querypb.FieldQuery{ + Field: []byte(query.Field.Field), + }, + } + } + if query.Term != nil { + result.Query = &querypb.Query_Term{ + Term: &querypb.TermQuery{ + Field: []byte(query.Term.Field), + Term: []byte(query.Term.Term), + }, + } + } + if query.Regexp != nil { + if result.Query != nil { + return nil, xerrors.NewInvalidParamsError(fmt.Errorf("multiple query types specified")) + } + result.Query = &querypb.Query_Regexp{ + Regexp: &querypb.RegexpQuery{ + Field: []byte(query.Regexp.Field), + Regexp: []byte(query.Regexp.Regexp), + }, + } + } + if query.Negation != nil { + if result.Query != nil { + return nil, xerrors.NewInvalidParamsError(fmt.Errorf("multiple query types specified")) + } + inner, err := parseQuery(query.Negation.Query) + if err != nil { + return nil, err + } + result.Query = &querypb.Query_Negation{ + Negation: &querypb.NegationQuery{ + Query: inner, + }, + } + } + if query.Conjunction != nil { + if result.Query != nil { + return nil, xerrors.NewInvalidParamsError(fmt.Errorf("multiple query types specified")) + } + var queries []*querypb.Query + for _, query := range query.Conjunction.Queries { + inner, err := parseQuery(query) + if err != nil { + return nil, err + } + queries = append(queries, inner) + } + result.Query = &querypb.Query_Conjunction{ + Conjunction: &querypb.ConjunctionQuery{ + Queries: queries, + }, + } + } + if query.Disjunction != nil { + if result.Query != nil { + return nil, xerrors.NewInvalidParamsError(fmt.Errorf("multiple query types specified")) + } + var queries []*querypb.Query + for _, query := range query.Disjunction.Queries { + inner, err := parseQuery(query) + if err != nil { + return nil, err + } + queries = append(queries, inner) + } + result.Query = &querypb.Query_Disjunction{ + Disjunction: &querypb.DisjunctionQuery{ + Queries: queries, + }, + } + } + if result.Query == nil { + return nil, xerrors.NewInvalidParamsError(fmt.Errorf("no query types specified")) + } + return result, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/errors/errors.go b/vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/errors/errors.go new file mode 100644 index 00000000..035e3f4f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/errors/errors.go @@ -0,0 +1,70 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package errors + +import ( + "fmt" + + "github.com/m3db/m3/src/dbnode/generated/thrift/rpc" +) + +func newError(errType rpc.ErrorType, err error) *rpc.Error { + rpcErr := rpc.NewError() + rpcErr.Type = errType + rpcErr.Message = fmt.Sprintf("%v", err) + return rpcErr +} + +// IsInternalError returns whether the error is an internal error +func IsInternalError(err *rpc.Error) bool { + return err != nil && err.Type == rpc.ErrorType_INTERNAL_ERROR +} + +// IsBadRequestError returns whether the error is a bad request error +func IsBadRequestError(err *rpc.Error) bool { + return err != nil && err.Type == rpc.ErrorType_BAD_REQUEST +} + +// NewInternalError creates a new internal error +func NewInternalError(err error) *rpc.Error { + return newError(rpc.ErrorType_INTERNAL_ERROR, err) +} + +// NewBadRequestError creates a new bad request error +func NewBadRequestError(err error) *rpc.Error { + return newError(rpc.ErrorType_BAD_REQUEST, err) +} + +// NewWriteBatchRawError creates a new write batch error +func NewWriteBatchRawError(index int, err error) *rpc.WriteBatchRawError { + batchErr := rpc.NewWriteBatchRawError() + batchErr.Index = int64(index) + batchErr.Err = NewInternalError(err) + return batchErr +} + +// NewBadRequestWriteBatchRawError creates a new bad request write batch error +func NewBadRequestWriteBatchRawError(index int, err error) *rpc.WriteBatchRawError { + batchErr := rpc.NewWriteBatchRawError() + batchErr.Index = int64(index) + batchErr.Err = NewBadRequestError(err) + return batchErr +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/node/channel/channel.go b/vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/node/channel/channel.go new file mode 100644 index 00000000..49d8e95e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/node/channel/channel.go @@ -0,0 +1,26 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package channel + +const ( + // ChannelName is the TChannel channel name the node service is exposed on + ChannelName = "Node" +) diff --git a/vendor/github.com/m3db/m3/src/dbnode/persist/persist_mock.go b/vendor/github.com/m3db/m3/src/dbnode/persist/persist_mock.go new file mode 100644 index 00000000..1ec52dcd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/persist/persist_mock.go @@ -0,0 +1,343 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/persist/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package persist is a generated GoMock package. +package persist + +import ( + "reflect" + + "github.com/golang/mock/gomock" + "github.com/pborman/uuid" +) + +// MockManager is a mock of Manager interface +type MockManager struct { + ctrl *gomock.Controller + recorder *MockManagerMockRecorder +} + +// MockManagerMockRecorder is the mock recorder for MockManager +type MockManagerMockRecorder struct { + mock *MockManager +} + +// NewMockManager creates a new mock instance +func NewMockManager(ctrl *gomock.Controller) *MockManager { + mock := &MockManager{ctrl: ctrl} + mock.recorder = &MockManagerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockManager) EXPECT() *MockManagerMockRecorder { + return m.recorder +} + +// StartFlushPersist mocks base method +func (m *MockManager) StartFlushPersist() (FlushPreparer, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartFlushPersist") + ret0, _ := ret[0].(FlushPreparer) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StartFlushPersist indicates an expected call of StartFlushPersist +func (mr *MockManagerMockRecorder) StartFlushPersist() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartFlushPersist", reflect.TypeOf((*MockManager)(nil).StartFlushPersist)) +} + +// StartSnapshotPersist mocks base method +func (m *MockManager) StartSnapshotPersist(snapshotID uuid.UUID) (SnapshotPreparer, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartSnapshotPersist", snapshotID) + ret0, _ := ret[0].(SnapshotPreparer) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StartSnapshotPersist indicates an expected call of StartSnapshotPersist +func (mr *MockManagerMockRecorder) StartSnapshotPersist(snapshotID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartSnapshotPersist", reflect.TypeOf((*MockManager)(nil).StartSnapshotPersist), snapshotID) +} + +// StartIndexPersist mocks base method +func (m *MockManager) StartIndexPersist() (IndexFlush, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartIndexPersist") + ret0, _ := ret[0].(IndexFlush) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StartIndexPersist indicates an expected call of StartIndexPersist +func (mr *MockManagerMockRecorder) StartIndexPersist() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartIndexPersist", reflect.TypeOf((*MockManager)(nil).StartIndexPersist)) +} + +// Close mocks base method +func (m *MockManager) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockManagerMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockManager)(nil).Close)) +} + +// MockPreparer is a mock of Preparer interface +type MockPreparer struct { + ctrl *gomock.Controller + recorder *MockPreparerMockRecorder +} + +// MockPreparerMockRecorder is the mock recorder for MockPreparer +type MockPreparerMockRecorder struct { + mock *MockPreparer +} + +// NewMockPreparer creates a new mock instance +func NewMockPreparer(ctrl *gomock.Controller) *MockPreparer { + mock := &MockPreparer{ctrl: ctrl} + mock.recorder = &MockPreparerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockPreparer) EXPECT() *MockPreparerMockRecorder { + return m.recorder +} + +// PrepareData mocks base method +func (m *MockPreparer) PrepareData(opts DataPrepareOptions) (PreparedDataPersist, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PrepareData", opts) + ret0, _ := ret[0].(PreparedDataPersist) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PrepareData indicates an expected call of PrepareData +func (mr *MockPreparerMockRecorder) PrepareData(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrepareData", reflect.TypeOf((*MockPreparer)(nil).PrepareData), opts) +} + +// MockFlushPreparer is a mock of FlushPreparer interface +type MockFlushPreparer struct { + ctrl *gomock.Controller + recorder *MockFlushPreparerMockRecorder +} + +// MockFlushPreparerMockRecorder is the mock recorder for MockFlushPreparer +type MockFlushPreparerMockRecorder struct { + mock *MockFlushPreparer +} + +// NewMockFlushPreparer creates a new mock instance +func NewMockFlushPreparer(ctrl *gomock.Controller) *MockFlushPreparer { + mock := &MockFlushPreparer{ctrl: ctrl} + mock.recorder = &MockFlushPreparerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFlushPreparer) EXPECT() *MockFlushPreparerMockRecorder { + return m.recorder +} + +// PrepareData mocks base method +func (m *MockFlushPreparer) PrepareData(opts DataPrepareOptions) (PreparedDataPersist, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PrepareData", opts) + ret0, _ := ret[0].(PreparedDataPersist) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PrepareData indicates an expected call of PrepareData +func (mr *MockFlushPreparerMockRecorder) PrepareData(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrepareData", reflect.TypeOf((*MockFlushPreparer)(nil).PrepareData), opts) +} + +// DoneFlush mocks base method +func (m *MockFlushPreparer) DoneFlush() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DoneFlush") + ret0, _ := ret[0].(error) + return ret0 +} + +// DoneFlush indicates an expected call of DoneFlush +func (mr *MockFlushPreparerMockRecorder) DoneFlush() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DoneFlush", reflect.TypeOf((*MockFlushPreparer)(nil).DoneFlush)) +} + +// MockSnapshotPreparer is a mock of SnapshotPreparer interface +type MockSnapshotPreparer struct { + ctrl *gomock.Controller + recorder *MockSnapshotPreparerMockRecorder +} + +// MockSnapshotPreparerMockRecorder is the mock recorder for MockSnapshotPreparer +type MockSnapshotPreparerMockRecorder struct { + mock *MockSnapshotPreparer +} + +// NewMockSnapshotPreparer creates a new mock instance +func NewMockSnapshotPreparer(ctrl *gomock.Controller) *MockSnapshotPreparer { + mock := &MockSnapshotPreparer{ctrl: ctrl} + mock.recorder = &MockSnapshotPreparerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSnapshotPreparer) EXPECT() *MockSnapshotPreparerMockRecorder { + return m.recorder +} + +// PrepareData mocks base method +func (m *MockSnapshotPreparer) PrepareData(opts DataPrepareOptions) (PreparedDataPersist, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PrepareData", opts) + ret0, _ := ret[0].(PreparedDataPersist) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PrepareData indicates an expected call of PrepareData +func (mr *MockSnapshotPreparerMockRecorder) PrepareData(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrepareData", reflect.TypeOf((*MockSnapshotPreparer)(nil).PrepareData), opts) +} + +// DoneSnapshot mocks base method +func (m *MockSnapshotPreparer) DoneSnapshot(snapshotUUID uuid.UUID, commitLogIdentifier CommitLogFile) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DoneSnapshot", snapshotUUID, commitLogIdentifier) + ret0, _ := ret[0].(error) + return ret0 +} + +// DoneSnapshot indicates an expected call of DoneSnapshot +func (mr *MockSnapshotPreparerMockRecorder) DoneSnapshot(snapshotUUID, commitLogIdentifier interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DoneSnapshot", reflect.TypeOf((*MockSnapshotPreparer)(nil).DoneSnapshot), snapshotUUID, commitLogIdentifier) +} + +// MockIndexFlush is a mock of IndexFlush interface +type MockIndexFlush struct { + ctrl *gomock.Controller + recorder *MockIndexFlushMockRecorder +} + +// MockIndexFlushMockRecorder is the mock recorder for MockIndexFlush +type MockIndexFlushMockRecorder struct { + mock *MockIndexFlush +} + +// NewMockIndexFlush creates a new mock instance +func NewMockIndexFlush(ctrl *gomock.Controller) *MockIndexFlush { + mock := &MockIndexFlush{ctrl: ctrl} + mock.recorder = &MockIndexFlushMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIndexFlush) EXPECT() *MockIndexFlushMockRecorder { + return m.recorder +} + +// PrepareIndex mocks base method +func (m *MockIndexFlush) PrepareIndex(opts IndexPrepareOptions) (PreparedIndexPersist, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PrepareIndex", opts) + ret0, _ := ret[0].(PreparedIndexPersist) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PrepareIndex indicates an expected call of PrepareIndex +func (mr *MockIndexFlushMockRecorder) PrepareIndex(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrepareIndex", reflect.TypeOf((*MockIndexFlush)(nil).PrepareIndex), opts) +} + +// DoneIndex mocks base method +func (m *MockIndexFlush) DoneIndex() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DoneIndex") + ret0, _ := ret[0].(error) + return ret0 +} + +// DoneIndex indicates an expected call of DoneIndex +func (mr *MockIndexFlushMockRecorder) DoneIndex() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DoneIndex", reflect.TypeOf((*MockIndexFlush)(nil).DoneIndex)) +} + +// MockOnFlushSeries is a mock of OnFlushSeries interface +type MockOnFlushSeries struct { + ctrl *gomock.Controller + recorder *MockOnFlushSeriesMockRecorder +} + +// MockOnFlushSeriesMockRecorder is the mock recorder for MockOnFlushSeries +type MockOnFlushSeriesMockRecorder struct { + mock *MockOnFlushSeries +} + +// NewMockOnFlushSeries creates a new mock instance +func NewMockOnFlushSeries(ctrl *gomock.Controller) *MockOnFlushSeries { + mock := &MockOnFlushSeries{ctrl: ctrl} + mock.recorder = &MockOnFlushSeriesMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOnFlushSeries) EXPECT() *MockOnFlushSeriesMockRecorder { + return m.recorder +} + +// OnFlushNewSeries mocks base method +func (m *MockOnFlushSeries) OnFlushNewSeries(arg0 OnFlushNewSeriesEvent) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OnFlushNewSeries", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// OnFlushNewSeries indicates an expected call of OnFlushNewSeries +func (mr *MockOnFlushSeriesMockRecorder) OnFlushNewSeries(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnFlushNewSeries", reflect.TypeOf((*MockOnFlushSeries)(nil).OnFlushNewSeries), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/persist/types.go b/vendor/github.com/m3db/m3/src/dbnode/persist/types.go new file mode 100644 index 00000000..a24d4040 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/persist/types.go @@ -0,0 +1,346 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package persist + +import ( + "errors" + "fmt" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index/segment" + idxpersist "github.com/m3db/m3/src/m3ninx/persist" + "github.com/m3db/m3/src/x/ident" + + "github.com/pborman/uuid" +) + +var ( + errReuseableTagIteratorRequired = errors.New("reuseable tags iterator is required") +) + +// Metadata is metadata for a time series, it can +// have several underlying sources. +type Metadata struct { + metadata doc.Document + id ident.ID + tags ident.Tags + tagsIter ident.TagIterator + opts MetadataOptions +} + +// MetadataOptions is options to use when creating metadata. +type MetadataOptions struct { + FinalizeID bool + FinalizeTags bool + FinalizeTagIterator bool +} + +// NewMetadata returns a new metadata struct from series metadata. +// Note: because doc.Document has no pools for finalization we do not +// take MetadataOptions here, in future if we have pools or +// some other shared options that Metadata needs we will add it to this +// constructor as well. +func NewMetadata(metadata doc.Document) Metadata { + return Metadata{metadata: metadata} +} + +// NewMetadataFromIDAndTags returns a new metadata struct from +// explicit ID and tags. +func NewMetadataFromIDAndTags( + id ident.ID, + tags ident.Tags, + opts MetadataOptions, +) Metadata { + return Metadata{ + id: id, + tags: tags, + opts: opts, + } +} + +// NewMetadataFromIDAndTagIterator returns a new metadata struct from +// explicit ID and tag iterator. +func NewMetadataFromIDAndTagIterator( + id ident.ID, + tagsIter ident.TagIterator, + opts MetadataOptions, +) Metadata { + return Metadata{ + id: id, + tagsIter: tagsIter, + opts: opts, + } +} + +// BytesID returns the bytes ID of the series. +func (m Metadata) BytesID() []byte { + if m.id != nil { + return m.id.Bytes() + } + return m.metadata.ID +} + +// ResetOrReturnProvidedTagIterator returns a tag iterator +// for the series, returning a direct ref to a provided tag +// iterator or using the reuseable tag iterator provided by the +// callsite if it needs to iterate over tags or fields. +func (m Metadata) ResetOrReturnProvidedTagIterator( + reuseableTagsIterator ident.TagsIterator, +) (ident.TagIterator, error) { + if reuseableTagsIterator == nil { + // Always check to make sure callsites won't + // get a bad allocation pattern of having + // to create one here inline if the metadata + // they are passing in suddenly changes from + // tagsIter to tags or fields with metadata. + return nil, errReuseableTagIteratorRequired + } + if m.tagsIter != nil { + return m.tagsIter, nil + } + + if len(m.tags.Values()) > 0 { + reuseableTagsIterator.Reset(m.tags) + return reuseableTagsIterator, reuseableTagsIterator.Err() + } + + reuseableTagsIterator.ResetFields(m.metadata.Fields) + return reuseableTagsIterator, reuseableTagsIterator.Err() +} + +// Finalize will finalize any resources that requested +// to be finalized. +func (m Metadata) Finalize() { + if m.opts.FinalizeID && m.id != nil { + m.id.Finalize() + } + if m.opts.FinalizeTags && m.tags.Values() != nil { + m.tags.Finalize() + } + if m.opts.FinalizeTagIterator && m.tagsIter != nil { + m.tagsIter.Close() + } +} + +// DataFn is a function that persists a m3db segment for a given ID. +type DataFn func(metadata Metadata, segment ts.Segment, checksum uint32) error + +// DataCloser is a function that performs cleanup after persisting the data +// blocks for a (shard, blockStart) combination. +type DataCloser func() error + +// DeferCloser returns a DataCloser that persists the data checkpoint file when called. +type DeferCloser func() (DataCloser, error) + +// PreparedDataPersist is an object that wraps holds a persist function and a closer. +type PreparedDataPersist struct { + Persist DataFn + Close DataCloser + DeferClose DeferCloser +} + +// CommitLogFiles represents a slice of commitlog files. +type CommitLogFiles []CommitLogFile + +// Contains returns a boolean indicating whether the CommitLogFiles slice +// contains the provided CommitlogFile based on its path. +func (c CommitLogFiles) Contains(path string) bool { + for _, f := range c { + if f.FilePath == path { + return true + } + } + return false +} + +// CommitLogFile represents a commit log file and its associated metadata. +type CommitLogFile struct { + FilePath string + Index int64 +} + +// IndexFn is a function that persists a m3ninx MutableSegment. +type IndexFn func(segment.Builder) error + +// IndexCloser is a function that performs cleanup after persisting the index data +// block for a (namespace, blockStart) combination and returns the corresponding +// immutable Segment. +type IndexCloser func() ([]segment.Segment, error) + +// PreparedIndexPersist is an object that wraps holds a persist function and a closer. +type PreparedIndexPersist struct { + Persist IndexFn + Close IndexCloser +} + +// Manager manages the internals of persisting data onto storage layer. +type Manager interface { + // StartFlushPersist begins a data flush for a set of shards. + StartFlushPersist() (FlushPreparer, error) + + // StartSnapshotPersist begins a snapshot for a set of shards. + StartSnapshotPersist(snapshotID uuid.UUID) (SnapshotPreparer, error) + + // StartIndexPersist begins a flush for index data. + StartIndexPersist() (IndexFlush, error) + + Close() +} + +// Preparer can generate a PreparedDataPersist object for writing data for +// a given (shard, blockstart) combination. +type Preparer interface { + // Prepare prepares writing data for a given (shard, blockStart) combination, + // returning a PreparedDataPersist object and any error encountered during + // preparation if any. + PrepareData(opts DataPrepareOptions) (PreparedDataPersist, error) +} + +// FlushPreparer is a persist flush cycle, each shard and block start permutation needs +// to explicitly be prepared. +type FlushPreparer interface { + Preparer + + // DoneFlush marks the data flush as complete. + DoneFlush() error +} + +// SnapshotPreparer is a persist snapshot cycle, each shard and block start permutation needs +// to explicitly be prepared. +type SnapshotPreparer interface { + Preparer + + // DoneSnapshot marks the snapshot as complete. + DoneSnapshot(snapshotUUID uuid.UUID, commitLogIdentifier CommitLogFile) error +} + +// IndexFlush is a persist flush cycle, each namespace, block combination needs +// to explicitly be prepared. +type IndexFlush interface { + // Prepare prepares writing data for a given ns/blockStart, returning a + // PreparedIndexPersist object and any error encountered during + // preparation if any. + PrepareIndex(opts IndexPrepareOptions) (PreparedIndexPersist, error) + + // DoneIndex marks the index flush as complete. + DoneIndex() error +} + +// DataPrepareOptions is the options struct for the DataFlush's Prepare method. +// nolint: maligned +type DataPrepareOptions struct { + NamespaceMetadata namespace.Metadata + BlockStart time.Time + Shard uint32 + // This volume index is only used when preparing for a flush fileset type. + // When opening a snapshot, the new volume index is determined by looking + // at what files exist on disk. + VolumeIndex int + FileSetType FileSetType + DeleteIfExists bool + // Snapshot options are applicable to snapshots (index yes, data yes) + Snapshot DataPrepareSnapshotOptions +} + +// IndexPrepareOptions is the options struct for the IndexFlush's Prepare method. +// nolint: maligned +type IndexPrepareOptions struct { + NamespaceMetadata namespace.Metadata + BlockStart time.Time + FileSetType FileSetType + Shards map[uint32]struct{} + IndexVolumeType idxpersist.IndexVolumeType +} + +// DataPrepareSnapshotOptions is the options struct for the Prepare method that contains +// information specific to read/writing snapshot files. +type DataPrepareSnapshotOptions struct { + SnapshotTime time.Time + SnapshotID uuid.UUID +} + +// FileSetType is an enum that indicates what type of files a fileset contains +type FileSetType int + +func (f FileSetType) String() string { + switch f { + case FileSetFlushType: + return "flush" + case FileSetSnapshotType: + return "snapshot" + } + + return fmt.Sprintf("unknown: %d", f) +} + +const ( + // FileSetFlushType indicates that the fileset files contain a complete flush + FileSetFlushType FileSetType = iota + // FileSetSnapshotType indicates that the fileset files contain a snapshot + FileSetSnapshotType +) + +// FileSetContentType is an enum that indicates what the contents of files a fileset contains +type FileSetContentType int + +func (f FileSetContentType) String() string { + switch f { + case FileSetDataContentType: + return "data" + case FileSetIndexContentType: + return "index" + } + return fmt.Sprintf("unknown: %d", f) +} + +const ( + // FileSetDataContentType indicates that the fileset files contents is time series data + FileSetDataContentType FileSetContentType = iota + // FileSetIndexContentType indicates that the fileset files contain time series index metadata + FileSetIndexContentType +) + +// OnFlushNewSeriesEvent is the fields related to a flush of a new series. +type OnFlushNewSeriesEvent struct { + Shard uint32 + BlockStart time.Time + FirstWrite time.Time + SeriesMetadata doc.Document +} + +// OnFlushSeries performs work on a per series level. +type OnFlushSeries interface { + OnFlushNewSeries(OnFlushNewSeriesEvent) error +} + +// NoOpColdFlushNamespace is a no-op impl of OnFlushSeries. +type NoOpColdFlushNamespace struct{} + +// OnFlushNewSeries is a no-op. +func (n *NoOpColdFlushNamespace) OnFlushNewSeries(event OnFlushNewSeriesEvent) error { + return nil +} + +// Done is a no-op. +func (n *NoOpColdFlushNamespace) Done() error { return nil } diff --git a/vendor/github.com/m3db/m3/src/dbnode/ratelimit/options.go b/vendor/github.com/m3db/m3/src/dbnode/ratelimit/options.go new file mode 100644 index 00000000..23138958 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/ratelimit/options.go @@ -0,0 +1,78 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ratelimit + +const ( + // defaultLimitEnabled determines whether rate limiting is enabled + defaultLimitEnabled = false + + // defaultLimitCheckEvery is the default frequency for checking + // whether the limit is exceeded + defaultLimitCheckEvery = 128 + + // defaultLimitMbps is the default limit in Mb/s + defaultLimitMbps = 100.0 +) + +type options struct { + limitEnabled bool + limitMbps float64 + limitCheckEvery int +} + +// NewOptions creates a new rate limit options +func NewOptions() Options { + return &options{ + limitEnabled: defaultLimitEnabled, + limitMbps: defaultLimitMbps, + limitCheckEvery: defaultLimitCheckEvery, + } +} + +func (o *options) SetLimitEnabled(value bool) Options { + opts := *o + opts.limitEnabled = value + return &opts +} + +func (o *options) LimitEnabled() bool { + return o.limitEnabled +} + +func (o *options) SetLimitMbps(value float64) Options { + opts := *o + opts.limitMbps = value + return &opts +} + +func (o *options) LimitMbps() float64 { + return o.limitMbps +} + +func (o *options) SetLimitCheckEvery(value int) Options { + opts := *o + opts.limitCheckEvery = value + return &opts +} + +func (o *options) LimitCheckEvery() int { + return o.limitCheckEvery +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/ratelimit/types.go b/vendor/github.com/m3db/m3/src/dbnode/ratelimit/types.go new file mode 100644 index 00000000..f11906bc --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/ratelimit/types.go @@ -0,0 +1,42 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ratelimit + +// Options provides options for rate limiting +type Options interface { + // SetLimitEnabled determines whether rate limiting is enabled + SetLimitEnabled(value bool) Options + + // LimitEnabled returns whether rate limiting is enabled + LimitEnabled() bool + + // SetLimitMbps sets the limit + SetLimitMbps(value float64) Options + + // LimitMbps returns the limit + LimitMbps() float64 + + // SetLimitCheckEvery sets the limit check frequency + SetLimitCheckEvery(value int) Options + + // LimitCheckEvery returns the limit check frequency + LimitCheckEvery() int +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/retention/config.go b/vendor/github.com/m3db/m3/src/dbnode/retention/config.go new file mode 100644 index 00000000..0b7c174d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/retention/config.go @@ -0,0 +1,53 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package retention + +import ( + "time" +) + +// Configuration is the set of knobs to configure retention options +type Configuration struct { + RetentionPeriod time.Duration `yaml:"retentionPeriod" validate:"nonzero"` + FutureRetentionPeriod time.Duration `yaml:"futureRetentionPeriod" validate:"nonzero"` + BlockSize time.Duration `yaml:"blockSize" validate:"nonzero"` + BufferFuture time.Duration `yaml:"bufferFuture" validate:"nonzero"` + BufferPast time.Duration `yaml:"bufferPast" validate:"nonzero"` + BlockDataExpiry *bool `yaml:"blockDataExpiry"` + BlockDataExpiryAfterNotAccessedPeriod *time.Duration `yaml:"blockDataExpiryAfterNotAccessedPeriod"` +} + +// Options returns `Options` corresponding to the provided struct values +func (c *Configuration) Options() Options { + opts := NewOptions(). + SetRetentionPeriod(c.RetentionPeriod). + SetFutureRetentionPeriod(c.FutureRetentionPeriod). + SetBlockSize(c.BlockSize). + SetBufferFuture(c.BufferFuture). + SetBufferPast(c.BufferPast) + if v := c.BlockDataExpiry; v != nil { + opts = opts.SetBlockDataExpiry(*v) + } + if v := c.BlockDataExpiryAfterNotAccessedPeriod; v != nil { + opts = opts.SetBlockDataExpiryAfterNotAccessedPeriod(*v) + } + return opts +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/retention/options.go b/vendor/github.com/m3db/m3/src/dbnode/retention/options.go new file mode 100644 index 00000000..ca22f2be --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/retention/options.go @@ -0,0 +1,186 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package retention + +import ( + "errors" + "time" +) + +const ( + // defaultRetentionPeriod is how long we keep data in memory by default. + defaultRetentionPeriod = 2 * 24 * time.Hour + + // defaultFutureRetentionPeriod is how long we keep data in memory in the + // future (if cold writes are enabled) by default. If this default is used, + // M3DB will not accept any future writes outside of the bufferFuture + // threshold. + defaultFutureRetentionPeriod = time.Duration(0) + + // defaultBlockSize is the default block size + defaultBlockSize = 2 * time.Hour + + // defaultBufferFuture is the default buffer future limit + defaultBufferFuture = 2 * time.Minute + + // defaultBufferPast is the default buffer past limit + defaultBufferPast = 10 * time.Minute + + // defaultDataExpiry is the default bool for whether data expiry is on + defaultDataExpiry = true + + // defaultDataExpiryAfterNotAccessedPeriod is the default data expiry after not accessed period + defaultDataExpiryAfterNotAccessedPeriod = 5 * time.Minute +) + +var ( + errBufferFutureNonNegative = errors.New("buffer future must be non-negative") + errBufferPastNonNegative = errors.New("buffer past must be non-negative") + errBlockSizePositive = errors.New("block size must positive") + errBufferFutureTooLarge = errors.New("buffer future must be smaller than block size") + errBufferPastTooLarge = errors.New("buffer past must be smaller than block size") + errRetentionPeriodTooSmall = errors.New("retention period must not be smaller than block size") +) + +type options struct { + retentionPeriod time.Duration + futureRetentionPeriod time.Duration + blockSize time.Duration + bufferFuture time.Duration + bufferPast time.Duration + dataExpiryAfterNotAccessedPeriod time.Duration + dataExpiry bool +} + +// NewOptions creates new retention options +func NewOptions() Options { + return &options{ + retentionPeriod: defaultRetentionPeriod, + futureRetentionPeriod: defaultFutureRetentionPeriod, + blockSize: defaultBlockSize, + bufferFuture: defaultBufferFuture, + bufferPast: defaultBufferPast, + dataExpiry: defaultDataExpiry, + dataExpiryAfterNotAccessedPeriod: defaultDataExpiryAfterNotAccessedPeriod, + } +} + +func (o *options) Validate() error { + if o.bufferFuture < 0 { + return errBufferFutureNonNegative + } + if o.bufferPast < 0 { + return errBufferPastNonNegative + } + if o.blockSize <= 0 { + return errBlockSizePositive + } + if o.bufferFuture >= o.blockSize { + return errBufferFutureTooLarge + } + if o.bufferPast >= o.blockSize { + return errBufferPastTooLarge + } + if o.retentionPeriod < o.blockSize { + return errRetentionPeriodTooSmall + } + return nil +} + +func (o *options) Equal(value Options) bool { + return o.retentionPeriod == value.RetentionPeriod() && + o.futureRetentionPeriod == value.FutureRetentionPeriod() && + o.blockSize == value.BlockSize() && + o.bufferFuture == value.BufferFuture() && + o.bufferPast == value.BufferPast() && + o.dataExpiry == value.BlockDataExpiry() && + o.dataExpiryAfterNotAccessedPeriod == value.BlockDataExpiryAfterNotAccessedPeriod() +} + +func (o *options) SetRetentionPeriod(value time.Duration) Options { + opts := *o + opts.retentionPeriod = value + return &opts +} + +func (o *options) RetentionPeriod() time.Duration { + return o.retentionPeriod +} + +func (o *options) SetFutureRetentionPeriod(value time.Duration) Options { + opts := *o + opts.futureRetentionPeriod = value + return &opts +} + +func (o *options) FutureRetentionPeriod() time.Duration { + return o.futureRetentionPeriod +} + +func (o *options) SetBlockSize(value time.Duration) Options { + opts := *o + opts.blockSize = value + return &opts +} + +func (o *options) BlockSize() time.Duration { + return o.blockSize +} + +func (o *options) SetBufferFuture(value time.Duration) Options { + opts := *o + opts.bufferFuture = value + return &opts +} + +func (o *options) BufferFuture() time.Duration { + return o.bufferFuture +} + +func (o *options) SetBufferPast(value time.Duration) Options { + opts := *o + opts.bufferPast = value + return &opts +} + +func (o *options) BufferPast() time.Duration { + return o.bufferPast +} + +func (o *options) SetBlockDataExpiry(value bool) Options { + opts := *o + opts.dataExpiry = value + return &opts +} + +func (o *options) BlockDataExpiry() bool { + return o.dataExpiry +} + +func (o *options) SetBlockDataExpiryAfterNotAccessedPeriod(value time.Duration) Options { + opts := *o + opts.dataExpiryAfterNotAccessedPeriod = value + return &opts +} + +func (o *options) BlockDataExpiryAfterNotAccessedPeriod() time.Duration { + return o.dataExpiryAfterNotAccessedPeriod +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/retention/retention_mock.go b/vendor/github.com/m3db/m3/src/dbnode/retention/retention_mock.go new file mode 100644 index 00000000..ba4e6af3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/retention/retention_mock.go @@ -0,0 +1,279 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/retention/types.go + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package retention is a generated GoMock package. +package retention + +import ( + "reflect" + "time" + + "github.com/golang/mock/gomock" +) + +// MockOptions is a mock of Options interface +type MockOptions struct { + ctrl *gomock.Controller + recorder *MockOptionsMockRecorder +} + +// MockOptionsMockRecorder is the mock recorder for MockOptions +type MockOptionsMockRecorder struct { + mock *MockOptions +} + +// NewMockOptions creates a new mock instance +func NewMockOptions(ctrl *gomock.Controller) *MockOptions { + mock := &MockOptions{ctrl: ctrl} + mock.recorder = &MockOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptions) EXPECT() *MockOptionsMockRecorder { + return m.recorder +} + +// Validate mocks base method +func (m *MockOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockOptions)(nil).Validate)) +} + +// Equal mocks base method +func (m *MockOptions) Equal(value Options) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", value) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockOptionsMockRecorder) Equal(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockOptions)(nil).Equal), value) +} + +// SetRetentionPeriod mocks base method +func (m *MockOptions) SetRetentionPeriod(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetRetentionPeriod", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetRetentionPeriod indicates an expected call of SetRetentionPeriod +func (mr *MockOptionsMockRecorder) SetRetentionPeriod(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetRetentionPeriod", reflect.TypeOf((*MockOptions)(nil).SetRetentionPeriod), value) +} + +// RetentionPeriod mocks base method +func (m *MockOptions) RetentionPeriod() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RetentionPeriod") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// RetentionPeriod indicates an expected call of RetentionPeriod +func (mr *MockOptionsMockRecorder) RetentionPeriod() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RetentionPeriod", reflect.TypeOf((*MockOptions)(nil).RetentionPeriod)) +} + +// SetFutureRetentionPeriod mocks base method +func (m *MockOptions) SetFutureRetentionPeriod(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFutureRetentionPeriod", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFutureRetentionPeriod indicates an expected call of SetFutureRetentionPeriod +func (mr *MockOptionsMockRecorder) SetFutureRetentionPeriod(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFutureRetentionPeriod", reflect.TypeOf((*MockOptions)(nil).SetFutureRetentionPeriod), value) +} + +// FutureRetentionPeriod mocks base method +func (m *MockOptions) FutureRetentionPeriod() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FutureRetentionPeriod") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// FutureRetentionPeriod indicates an expected call of FutureRetentionPeriod +func (mr *MockOptionsMockRecorder) FutureRetentionPeriod() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FutureRetentionPeriod", reflect.TypeOf((*MockOptions)(nil).FutureRetentionPeriod)) +} + +// SetBlockSize mocks base method +func (m *MockOptions) SetBlockSize(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBlockSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBlockSize indicates an expected call of SetBlockSize +func (mr *MockOptionsMockRecorder) SetBlockSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBlockSize", reflect.TypeOf((*MockOptions)(nil).SetBlockSize), value) +} + +// BlockSize mocks base method +func (m *MockOptions) BlockSize() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockSize") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BlockSize indicates an expected call of BlockSize +func (mr *MockOptionsMockRecorder) BlockSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockSize", reflect.TypeOf((*MockOptions)(nil).BlockSize)) +} + +// SetBufferFuture mocks base method +func (m *MockOptions) SetBufferFuture(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBufferFuture", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBufferFuture indicates an expected call of SetBufferFuture +func (mr *MockOptionsMockRecorder) SetBufferFuture(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBufferFuture", reflect.TypeOf((*MockOptions)(nil).SetBufferFuture), value) +} + +// BufferFuture mocks base method +func (m *MockOptions) BufferFuture() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BufferFuture") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BufferFuture indicates an expected call of BufferFuture +func (mr *MockOptionsMockRecorder) BufferFuture() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BufferFuture", reflect.TypeOf((*MockOptions)(nil).BufferFuture)) +} + +// SetBufferPast mocks base method +func (m *MockOptions) SetBufferPast(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBufferPast", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBufferPast indicates an expected call of SetBufferPast +func (mr *MockOptionsMockRecorder) SetBufferPast(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBufferPast", reflect.TypeOf((*MockOptions)(nil).SetBufferPast), value) +} + +// BufferPast mocks base method +func (m *MockOptions) BufferPast() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BufferPast") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BufferPast indicates an expected call of BufferPast +func (mr *MockOptionsMockRecorder) BufferPast() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BufferPast", reflect.TypeOf((*MockOptions)(nil).BufferPast)) +} + +// SetBlockDataExpiry mocks base method +func (m *MockOptions) SetBlockDataExpiry(on bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBlockDataExpiry", on) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBlockDataExpiry indicates an expected call of SetBlockDataExpiry +func (mr *MockOptionsMockRecorder) SetBlockDataExpiry(on interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBlockDataExpiry", reflect.TypeOf((*MockOptions)(nil).SetBlockDataExpiry), on) +} + +// BlockDataExpiry mocks base method +func (m *MockOptions) BlockDataExpiry() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockDataExpiry") + ret0, _ := ret[0].(bool) + return ret0 +} + +// BlockDataExpiry indicates an expected call of BlockDataExpiry +func (mr *MockOptionsMockRecorder) BlockDataExpiry() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockDataExpiry", reflect.TypeOf((*MockOptions)(nil).BlockDataExpiry)) +} + +// SetBlockDataExpiryAfterNotAccessedPeriod mocks base method +func (m *MockOptions) SetBlockDataExpiryAfterNotAccessedPeriod(period time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBlockDataExpiryAfterNotAccessedPeriod", period) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBlockDataExpiryAfterNotAccessedPeriod indicates an expected call of SetBlockDataExpiryAfterNotAccessedPeriod +func (mr *MockOptionsMockRecorder) SetBlockDataExpiryAfterNotAccessedPeriod(period interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBlockDataExpiryAfterNotAccessedPeriod", reflect.TypeOf((*MockOptions)(nil).SetBlockDataExpiryAfterNotAccessedPeriod), period) +} + +// BlockDataExpiryAfterNotAccessedPeriod mocks base method +func (m *MockOptions) BlockDataExpiryAfterNotAccessedPeriod() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockDataExpiryAfterNotAccessedPeriod") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BlockDataExpiryAfterNotAccessedPeriod indicates an expected call of BlockDataExpiryAfterNotAccessedPeriod +func (mr *MockOptionsMockRecorder) BlockDataExpiryAfterNotAccessedPeriod() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockDataExpiryAfterNotAccessedPeriod", reflect.TypeOf((*MockOptions)(nil).BlockDataExpiryAfterNotAccessedPeriod)) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/retention/times.go b/vendor/github.com/m3db/m3/src/dbnode/retention/times.go new file mode 100644 index 00000000..8e6c7336 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/retention/times.go @@ -0,0 +1,44 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package retention + +import "time" + +// FlushTimeStart is the earliest flushable time +func FlushTimeStart(opts Options, t time.Time) time.Time { + return FlushTimeStartForRetentionPeriod(opts.RetentionPeriod(), opts.BlockSize(), t) +} + +// FlushTimeStartForRetentionPeriod is the earliest flushable time +func FlushTimeStartForRetentionPeriod(retentionPeriod time.Duration, blockSize time.Duration, t time.Time) time.Time { + return t.Add(-retentionPeriod).Truncate(blockSize) +} + +// FlushTimeEnd is the latest flushable time +func FlushTimeEnd(opts Options, t time.Time) time.Time { + return FlushTimeEndForBlockSize(opts.BlockSize(), + t.Add(opts.FutureRetentionPeriod()).Add(-opts.BufferPast())) +} + +// FlushTimeEndForBlockSize is the latest flushable time +func FlushTimeEndForBlockSize(blockSize time.Duration, t time.Time) time.Time { + return t.Add(-blockSize).Truncate(blockSize) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/retention/types.go b/vendor/github.com/m3db/m3/src/dbnode/retention/types.go new file mode 100644 index 00000000..96e64ca7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/retention/types.go @@ -0,0 +1,80 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package retention + +import ( + "time" +) + +// Options represents the options for retention +type Options interface { + // Validate validates the options + Validate() error + + // Equal returns a flag indicating if the other value is the same as this one + Equal(value Options) bool + + // SetRetentionPeriod sets how long we intend to keep data in memory + SetRetentionPeriod(value time.Duration) Options + + // RetentionPeriod returns how long we intend to keep data in memory + RetentionPeriod() time.Duration + + // SetFutureRetentionPeriod sets how long we intend to keep data in memory + // in the future if cold writes are enabled. + SetFutureRetentionPeriod(value time.Duration) Options + + // FutureRetentionPeriod returns how long we intend to keep data in memory + // in the future if cold writes are enabled. + FutureRetentionPeriod() time.Duration + + // SetBlockSize sets the blockSize + SetBlockSize(value time.Duration) Options + + // BlockSize returns the blockSize + BlockSize() time.Duration + + // SetBufferFuture sets the bufferFuture + SetBufferFuture(value time.Duration) Options + + // BufferFuture returns the bufferFuture + BufferFuture() time.Duration + + // SetBufferPast sets the bufferPast + SetBufferPast(value time.Duration) Options + + // BufferPast returns the bufferPast + BufferPast() time.Duration + + // SetBlockDataExpiry sets the block data expiry mode + SetBlockDataExpiry(on bool) Options + + // BlockDataExpiry returns the block data expiry mode + BlockDataExpiry() bool + + // SetBlockDataExpiryAfterNotAccessedPeriod sets the period that blocks data should + // be expired after not being accessed for a given duration + SetBlockDataExpiryAfterNotAccessedPeriod(period time.Duration) Options + + // BlockDataExpiryAfterNotAccessedPeriod returns the period that blocks data should + // be expired after not being accessed for a given duration + BlockDataExpiryAfterNotAccessedPeriod() time.Duration +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_mock.go b/vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_mock.go new file mode 100644 index 00000000..aa456447 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_mock.go @@ -0,0 +1,549 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/runtime/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package runtime is a generated GoMock package. +package runtime + +import ( + "reflect" + "time" + + "github.com/m3db/m3/src/dbnode/ratelimit" + "github.com/m3db/m3/src/dbnode/topology" + "github.com/m3db/m3/src/x/close" + + "github.com/golang/mock/gomock" +) + +// MockOptions is a mock of Options interface +type MockOptions struct { + ctrl *gomock.Controller + recorder *MockOptionsMockRecorder +} + +// MockOptionsMockRecorder is the mock recorder for MockOptions +type MockOptionsMockRecorder struct { + mock *MockOptions +} + +// NewMockOptions creates a new mock instance +func NewMockOptions(ctrl *gomock.Controller) *MockOptions { + mock := &MockOptions{ctrl: ctrl} + mock.recorder = &MockOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptions) EXPECT() *MockOptionsMockRecorder { + return m.recorder +} + +// Validate mocks base method +func (m *MockOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockOptions)(nil).Validate)) +} + +// SetPersistRateLimitOptions mocks base method +func (m *MockOptions) SetPersistRateLimitOptions(value ratelimit.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPersistRateLimitOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetPersistRateLimitOptions indicates an expected call of SetPersistRateLimitOptions +func (mr *MockOptionsMockRecorder) SetPersistRateLimitOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPersistRateLimitOptions", reflect.TypeOf((*MockOptions)(nil).SetPersistRateLimitOptions), value) +} + +// PersistRateLimitOptions mocks base method +func (m *MockOptions) PersistRateLimitOptions() ratelimit.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PersistRateLimitOptions") + ret0, _ := ret[0].(ratelimit.Options) + return ret0 +} + +// PersistRateLimitOptions indicates an expected call of PersistRateLimitOptions +func (mr *MockOptionsMockRecorder) PersistRateLimitOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PersistRateLimitOptions", reflect.TypeOf((*MockOptions)(nil).PersistRateLimitOptions)) +} + +// SetWriteNewSeriesAsync mocks base method +func (m *MockOptions) SetWriteNewSeriesAsync(value bool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteNewSeriesAsync", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteNewSeriesAsync indicates an expected call of SetWriteNewSeriesAsync +func (mr *MockOptionsMockRecorder) SetWriteNewSeriesAsync(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesAsync", reflect.TypeOf((*MockOptions)(nil).SetWriteNewSeriesAsync), value) +} + +// WriteNewSeriesAsync mocks base method +func (m *MockOptions) WriteNewSeriesAsync() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteNewSeriesAsync") + ret0, _ := ret[0].(bool) + return ret0 +} + +// WriteNewSeriesAsync indicates an expected call of WriteNewSeriesAsync +func (mr *MockOptionsMockRecorder) WriteNewSeriesAsync() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteNewSeriesAsync", reflect.TypeOf((*MockOptions)(nil).WriteNewSeriesAsync)) +} + +// SetWriteNewSeriesBackoffDuration mocks base method +func (m *MockOptions) SetWriteNewSeriesBackoffDuration(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteNewSeriesBackoffDuration", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteNewSeriesBackoffDuration indicates an expected call of SetWriteNewSeriesBackoffDuration +func (mr *MockOptionsMockRecorder) SetWriteNewSeriesBackoffDuration(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesBackoffDuration", reflect.TypeOf((*MockOptions)(nil).SetWriteNewSeriesBackoffDuration), value) +} + +// WriteNewSeriesBackoffDuration mocks base method +func (m *MockOptions) WriteNewSeriesBackoffDuration() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteNewSeriesBackoffDuration") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// WriteNewSeriesBackoffDuration indicates an expected call of WriteNewSeriesBackoffDuration +func (mr *MockOptionsMockRecorder) WriteNewSeriesBackoffDuration() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteNewSeriesBackoffDuration", reflect.TypeOf((*MockOptions)(nil).WriteNewSeriesBackoffDuration)) +} + +// SetWriteNewSeriesLimitPerShardPerSecond mocks base method +func (m *MockOptions) SetWriteNewSeriesLimitPerShardPerSecond(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWriteNewSeriesLimitPerShardPerSecond", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWriteNewSeriesLimitPerShardPerSecond indicates an expected call of SetWriteNewSeriesLimitPerShardPerSecond +func (mr *MockOptionsMockRecorder) SetWriteNewSeriesLimitPerShardPerSecond(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteNewSeriesLimitPerShardPerSecond", reflect.TypeOf((*MockOptions)(nil).SetWriteNewSeriesLimitPerShardPerSecond), value) +} + +// WriteNewSeriesLimitPerShardPerSecond mocks base method +func (m *MockOptions) WriteNewSeriesLimitPerShardPerSecond() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteNewSeriesLimitPerShardPerSecond") + ret0, _ := ret[0].(int) + return ret0 +} + +// WriteNewSeriesLimitPerShardPerSecond indicates an expected call of WriteNewSeriesLimitPerShardPerSecond +func (mr *MockOptionsMockRecorder) WriteNewSeriesLimitPerShardPerSecond() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteNewSeriesLimitPerShardPerSecond", reflect.TypeOf((*MockOptions)(nil).WriteNewSeriesLimitPerShardPerSecond)) +} + +// SetEncodersPerBlockLimit mocks base method +func (m *MockOptions) SetEncodersPerBlockLimit(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEncodersPerBlockLimit", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetEncodersPerBlockLimit indicates an expected call of SetEncodersPerBlockLimit +func (mr *MockOptionsMockRecorder) SetEncodersPerBlockLimit(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEncodersPerBlockLimit", reflect.TypeOf((*MockOptions)(nil).SetEncodersPerBlockLimit), value) +} + +// EncodersPerBlockLimit mocks base method +func (m *MockOptions) EncodersPerBlockLimit() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "EncodersPerBlockLimit") + ret0, _ := ret[0].(int) + return ret0 +} + +// EncodersPerBlockLimit indicates an expected call of EncodersPerBlockLimit +func (mr *MockOptionsMockRecorder) EncodersPerBlockLimit() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EncodersPerBlockLimit", reflect.TypeOf((*MockOptions)(nil).EncodersPerBlockLimit)) +} + +// SetTickSeriesBatchSize mocks base method +func (m *MockOptions) SetTickSeriesBatchSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTickSeriesBatchSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTickSeriesBatchSize indicates an expected call of SetTickSeriesBatchSize +func (mr *MockOptionsMockRecorder) SetTickSeriesBatchSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTickSeriesBatchSize", reflect.TypeOf((*MockOptions)(nil).SetTickSeriesBatchSize), value) +} + +// TickSeriesBatchSize mocks base method +func (m *MockOptions) TickSeriesBatchSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TickSeriesBatchSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// TickSeriesBatchSize indicates an expected call of TickSeriesBatchSize +func (mr *MockOptionsMockRecorder) TickSeriesBatchSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TickSeriesBatchSize", reflect.TypeOf((*MockOptions)(nil).TickSeriesBatchSize)) +} + +// SetTickPerSeriesSleepDuration mocks base method +func (m *MockOptions) SetTickPerSeriesSleepDuration(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTickPerSeriesSleepDuration", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTickPerSeriesSleepDuration indicates an expected call of SetTickPerSeriesSleepDuration +func (mr *MockOptionsMockRecorder) SetTickPerSeriesSleepDuration(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTickPerSeriesSleepDuration", reflect.TypeOf((*MockOptions)(nil).SetTickPerSeriesSleepDuration), value) +} + +// TickPerSeriesSleepDuration mocks base method +func (m *MockOptions) TickPerSeriesSleepDuration() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TickPerSeriesSleepDuration") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// TickPerSeriesSleepDuration indicates an expected call of TickPerSeriesSleepDuration +func (mr *MockOptionsMockRecorder) TickPerSeriesSleepDuration() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TickPerSeriesSleepDuration", reflect.TypeOf((*MockOptions)(nil).TickPerSeriesSleepDuration)) +} + +// SetTickMinimumInterval mocks base method +func (m *MockOptions) SetTickMinimumInterval(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetTickMinimumInterval", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetTickMinimumInterval indicates an expected call of SetTickMinimumInterval +func (mr *MockOptionsMockRecorder) SetTickMinimumInterval(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTickMinimumInterval", reflect.TypeOf((*MockOptions)(nil).SetTickMinimumInterval), value) +} + +// TickMinimumInterval mocks base method +func (m *MockOptions) TickMinimumInterval() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TickMinimumInterval") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// TickMinimumInterval indicates an expected call of TickMinimumInterval +func (mr *MockOptionsMockRecorder) TickMinimumInterval() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TickMinimumInterval", reflect.TypeOf((*MockOptions)(nil).TickMinimumInterval)) +} + +// SetMaxWiredBlocks mocks base method +func (m *MockOptions) SetMaxWiredBlocks(value uint) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMaxWiredBlocks", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetMaxWiredBlocks indicates an expected call of SetMaxWiredBlocks +func (mr *MockOptionsMockRecorder) SetMaxWiredBlocks(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMaxWiredBlocks", reflect.TypeOf((*MockOptions)(nil).SetMaxWiredBlocks), value) +} + +// MaxWiredBlocks mocks base method +func (m *MockOptions) MaxWiredBlocks() uint { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MaxWiredBlocks") + ret0, _ := ret[0].(uint) + return ret0 +} + +// MaxWiredBlocks indicates an expected call of MaxWiredBlocks +func (mr *MockOptionsMockRecorder) MaxWiredBlocks() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MaxWiredBlocks", reflect.TypeOf((*MockOptions)(nil).MaxWiredBlocks)) +} + +// SetClientBootstrapConsistencyLevel mocks base method +func (m *MockOptions) SetClientBootstrapConsistencyLevel(value topology.ReadConsistencyLevel) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClientBootstrapConsistencyLevel", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClientBootstrapConsistencyLevel indicates an expected call of SetClientBootstrapConsistencyLevel +func (mr *MockOptionsMockRecorder) SetClientBootstrapConsistencyLevel(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClientBootstrapConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).SetClientBootstrapConsistencyLevel), value) +} + +// ClientBootstrapConsistencyLevel mocks base method +func (m *MockOptions) ClientBootstrapConsistencyLevel() topology.ReadConsistencyLevel { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientBootstrapConsistencyLevel") + ret0, _ := ret[0].(topology.ReadConsistencyLevel) + return ret0 +} + +// ClientBootstrapConsistencyLevel indicates an expected call of ClientBootstrapConsistencyLevel +func (mr *MockOptionsMockRecorder) ClientBootstrapConsistencyLevel() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientBootstrapConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).ClientBootstrapConsistencyLevel)) +} + +// SetClientReadConsistencyLevel mocks base method +func (m *MockOptions) SetClientReadConsistencyLevel(value topology.ReadConsistencyLevel) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClientReadConsistencyLevel", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClientReadConsistencyLevel indicates an expected call of SetClientReadConsistencyLevel +func (mr *MockOptionsMockRecorder) SetClientReadConsistencyLevel(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClientReadConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).SetClientReadConsistencyLevel), value) +} + +// ClientReadConsistencyLevel mocks base method +func (m *MockOptions) ClientReadConsistencyLevel() topology.ReadConsistencyLevel { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientReadConsistencyLevel") + ret0, _ := ret[0].(topology.ReadConsistencyLevel) + return ret0 +} + +// ClientReadConsistencyLevel indicates an expected call of ClientReadConsistencyLevel +func (mr *MockOptionsMockRecorder) ClientReadConsistencyLevel() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientReadConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).ClientReadConsistencyLevel)) +} + +// SetClientWriteConsistencyLevel mocks base method +func (m *MockOptions) SetClientWriteConsistencyLevel(value topology.ConsistencyLevel) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClientWriteConsistencyLevel", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClientWriteConsistencyLevel indicates an expected call of SetClientWriteConsistencyLevel +func (mr *MockOptionsMockRecorder) SetClientWriteConsistencyLevel(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClientWriteConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).SetClientWriteConsistencyLevel), value) +} + +// ClientWriteConsistencyLevel mocks base method +func (m *MockOptions) ClientWriteConsistencyLevel() topology.ConsistencyLevel { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientWriteConsistencyLevel") + ret0, _ := ret[0].(topology.ConsistencyLevel) + return ret0 +} + +// ClientWriteConsistencyLevel indicates an expected call of ClientWriteConsistencyLevel +func (mr *MockOptionsMockRecorder) ClientWriteConsistencyLevel() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientWriteConsistencyLevel", reflect.TypeOf((*MockOptions)(nil).ClientWriteConsistencyLevel)) +} + +// SetIndexDefaultQueryTimeout mocks base method +func (m *MockOptions) SetIndexDefaultQueryTimeout(value time.Duration) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIndexDefaultQueryTimeout", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIndexDefaultQueryTimeout indicates an expected call of SetIndexDefaultQueryTimeout +func (mr *MockOptionsMockRecorder) SetIndexDefaultQueryTimeout(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIndexDefaultQueryTimeout", reflect.TypeOf((*MockOptions)(nil).SetIndexDefaultQueryTimeout), value) +} + +// IndexDefaultQueryTimeout mocks base method +func (m *MockOptions) IndexDefaultQueryTimeout() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IndexDefaultQueryTimeout") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// IndexDefaultQueryTimeout indicates an expected call of IndexDefaultQueryTimeout +func (mr *MockOptionsMockRecorder) IndexDefaultQueryTimeout() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IndexDefaultQueryTimeout", reflect.TypeOf((*MockOptions)(nil).IndexDefaultQueryTimeout)) +} + +// MockOptionsManager is a mock of OptionsManager interface +type MockOptionsManager struct { + ctrl *gomock.Controller + recorder *MockOptionsManagerMockRecorder +} + +// MockOptionsManagerMockRecorder is the mock recorder for MockOptionsManager +type MockOptionsManagerMockRecorder struct { + mock *MockOptionsManager +} + +// NewMockOptionsManager creates a new mock instance +func NewMockOptionsManager(ctrl *gomock.Controller) *MockOptionsManager { + mock := &MockOptionsManager{ctrl: ctrl} + mock.recorder = &MockOptionsManagerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptionsManager) EXPECT() *MockOptionsManagerMockRecorder { + return m.recorder +} + +// Update mocks base method +func (m *MockOptionsManager) Update(value Options) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", value) + ret0, _ := ret[0].(error) + return ret0 +} + +// Update indicates an expected call of Update +func (mr *MockOptionsManagerMockRecorder) Update(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockOptionsManager)(nil).Update), value) +} + +// Get mocks base method +func (m *MockOptionsManager) Get() Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(Options) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockOptionsManagerMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockOptionsManager)(nil).Get)) +} + +// RegisterListener mocks base method +func (m *MockOptionsManager) RegisterListener(l OptionsListener) close.SimpleCloser { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterListener", l) + ret0, _ := ret[0].(close.SimpleCloser) + return ret0 +} + +// RegisterListener indicates an expected call of RegisterListener +func (mr *MockOptionsManagerMockRecorder) RegisterListener(l interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterListener", reflect.TypeOf((*MockOptionsManager)(nil).RegisterListener), l) +} + +// Close mocks base method +func (m *MockOptionsManager) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockOptionsManagerMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockOptionsManager)(nil).Close)) +} + +// MockOptionsListener is a mock of OptionsListener interface +type MockOptionsListener struct { + ctrl *gomock.Controller + recorder *MockOptionsListenerMockRecorder +} + +// MockOptionsListenerMockRecorder is the mock recorder for MockOptionsListener +type MockOptionsListenerMockRecorder struct { + mock *MockOptionsListener +} + +// NewMockOptionsListener creates a new mock instance +func NewMockOptionsListener(ctrl *gomock.Controller) *MockOptionsListener { + mock := &MockOptionsListener{ctrl: ctrl} + mock.recorder = &MockOptionsListenerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptionsListener) EXPECT() *MockOptionsListenerMockRecorder { + return m.recorder +} + +// SetRuntimeOptions mocks base method +func (m *MockOptionsListener) SetRuntimeOptions(value Options) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetRuntimeOptions", value) +} + +// SetRuntimeOptions indicates an expected call of SetRuntimeOptions +func (mr *MockOptionsListenerMockRecorder) SetRuntimeOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetRuntimeOptions", reflect.TypeOf((*MockOptionsListener)(nil).SetRuntimeOptions), value) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_options.go b/vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_options.go new file mode 100644 index 00000000..8baf6f15 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_options.go @@ -0,0 +1,252 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package runtime + +import ( + "errors" + "time" + + "github.com/m3db/m3/src/dbnode/ratelimit" + "github.com/m3db/m3/src/dbnode/topology" +) + +const ( + // DefaultWriteConsistencyLevel is the default write consistency level + DefaultWriteConsistencyLevel = topology.ConsistencyLevelMajority + + // DefaultReadConsistencyLevel is the default read consistency level + DefaultReadConsistencyLevel = topology.ReadConsistencyLevelMajority + + // DefaultBootstrapConsistencyLevel is the default bootstrap consistency level + DefaultBootstrapConsistencyLevel = topology.ReadConsistencyLevelMajority + + // DefaultIndexDefaultQueryTimeout is the hard timeout value to use if none is + // specified for a specific query, zero specifies no timeout. + DefaultIndexDefaultQueryTimeout = time.Minute + + defaultWriteNewSeriesAsync = false + defaultWriteNewSeriesBackoffDuration = time.Duration(0) + defaultWriteNewSeriesLimitPerShardPerSecond = 0 + defaultTickSeriesBatchSize = 512 + defaultTickPerSeriesSleepDuration = 100 * time.Microsecond + defaultTickMinimumInterval = 10 * time.Second + defaultMaxWiredBlocks = uint(1 << 16) // 65,536 +) + +var ( + errWriteNewSeriesBackoffDurationIsNegative = errors.New( + "write new series backoff duration cannot be negative") + errWriteNewSeriesLimitPerShardPerSecondIsNegative = errors.New( + "write new series limit per shard per cannot be negative") + errTickSeriesBatchSizeMustBePositive = errors.New( + "tick series batch size must be positive") + errTickPerSeriesSleepDurationMustBePositive = errors.New( + "tick per series sleep duration must be positive") +) + +type options struct { + persistRateLimitOpts ratelimit.Options + writeNewSeriesAsync bool + writeNewSeriesBackoffDuration time.Duration + writeNewSeriesLimitPerShardPerSecond int + encodersPerBlockLimit int + tickSeriesBatchSize int + tickPerSeriesSleepDuration time.Duration + tickMinimumInterval time.Duration + maxWiredBlocks uint + clientBootstrapConsistencyLevel topology.ReadConsistencyLevel + clientReadConsistencyLevel topology.ReadConsistencyLevel + clientWriteConsistencyLevel topology.ConsistencyLevel + indexDefaultQueryTimeout time.Duration +} + +// NewOptions creates a new set of runtime options with defaults +func NewOptions() Options { + return &options{ + persistRateLimitOpts: ratelimit.NewOptions(), + writeNewSeriesAsync: defaultWriteNewSeriesAsync, + writeNewSeriesBackoffDuration: defaultWriteNewSeriesBackoffDuration, + writeNewSeriesLimitPerShardPerSecond: defaultWriteNewSeriesLimitPerShardPerSecond, + tickSeriesBatchSize: defaultTickSeriesBatchSize, + tickPerSeriesSleepDuration: defaultTickPerSeriesSleepDuration, + tickMinimumInterval: defaultTickMinimumInterval, + maxWiredBlocks: defaultMaxWiredBlocks, + clientBootstrapConsistencyLevel: DefaultBootstrapConsistencyLevel, + clientReadConsistencyLevel: DefaultReadConsistencyLevel, + clientWriteConsistencyLevel: DefaultWriteConsistencyLevel, + indexDefaultQueryTimeout: DefaultIndexDefaultQueryTimeout, + } +} + +func (o *options) Validate() error { + // writeNewSeriesBackoffDuration can be zero to specify no backoff + if o.writeNewSeriesBackoffDuration < 0 { + return errWriteNewSeriesBackoffDurationIsNegative + } + + // writeNewSeriesLimitPerShardPerSecond can be zero to specify that + // no limit should be enforced + if o.writeNewSeriesLimitPerShardPerSecond < 0 { + return errWriteNewSeriesLimitPerShardPerSecondIsNegative + } + + if !(o.tickSeriesBatchSize > 0) { + return errTickSeriesBatchSizeMustBePositive + } + + if !(o.tickPerSeriesSleepDuration > 0) { + return errTickPerSeriesSleepDurationMustBePositive + } + + // tickMinimumInterval can be zero if user desires + + return nil +} + +func (o *options) SetPersistRateLimitOptions(value ratelimit.Options) Options { + opts := *o + opts.persistRateLimitOpts = value + return &opts +} + +func (o *options) PersistRateLimitOptions() ratelimit.Options { + return o.persistRateLimitOpts +} + +func (o *options) SetWriteNewSeriesAsync(value bool) Options { + opts := *o + opts.writeNewSeriesAsync = value + return &opts +} + +func (o *options) WriteNewSeriesAsync() bool { + return o.writeNewSeriesAsync +} + +func (o *options) SetWriteNewSeriesBackoffDuration(value time.Duration) Options { + opts := *o + opts.writeNewSeriesBackoffDuration = value + return &opts +} + +func (o *options) WriteNewSeriesBackoffDuration() time.Duration { + return o.writeNewSeriesBackoffDuration +} + +func (o *options) SetWriteNewSeriesLimitPerShardPerSecond(value int) Options { + opts := *o + opts.writeNewSeriesLimitPerShardPerSecond = value + return &opts +} + +func (o *options) WriteNewSeriesLimitPerShardPerSecond() int { + return o.writeNewSeriesLimitPerShardPerSecond +} + +func (o *options) SetEncodersPerBlockLimit(value int) Options { + opts := *o + opts.encodersPerBlockLimit = value + return &opts +} + +func (o *options) EncodersPerBlockLimit() int { + return o.encodersPerBlockLimit +} + +func (o *options) SetTickSeriesBatchSize(value int) Options { + opts := *o + opts.tickSeriesBatchSize = value + return &opts +} + +func (o *options) TickSeriesBatchSize() int { + return o.tickSeriesBatchSize +} + +func (o *options) SetTickPerSeriesSleepDuration(value time.Duration) Options { + opts := *o + opts.tickPerSeriesSleepDuration = value + return &opts +} + +func (o *options) TickPerSeriesSleepDuration() time.Duration { + return o.tickPerSeriesSleepDuration +} + +func (o *options) SetTickMinimumInterval(value time.Duration) Options { + opts := *o + opts.tickMinimumInterval = value + return &opts +} + +func (o *options) TickMinimumInterval() time.Duration { + return o.tickMinimumInterval +} + +func (o *options) SetMaxWiredBlocks(value uint) Options { + opts := *o + opts.maxWiredBlocks = value + return &opts +} + +func (o *options) MaxWiredBlocks() uint { + return o.maxWiredBlocks +} + +func (o *options) SetClientBootstrapConsistencyLevel(value topology.ReadConsistencyLevel) Options { + opts := *o + opts.clientBootstrapConsistencyLevel = value + return &opts +} + +func (o *options) ClientBootstrapConsistencyLevel() topology.ReadConsistencyLevel { + return o.clientBootstrapConsistencyLevel +} + +func (o *options) SetClientReadConsistencyLevel(value topology.ReadConsistencyLevel) Options { + opts := *o + opts.clientReadConsistencyLevel = value + return &opts +} + +func (o *options) ClientReadConsistencyLevel() topology.ReadConsistencyLevel { + return o.clientReadConsistencyLevel +} + +func (o *options) SetClientWriteConsistencyLevel(value topology.ConsistencyLevel) Options { + opts := *o + opts.clientWriteConsistencyLevel = value + return &opts +} + +func (o *options) ClientWriteConsistencyLevel() topology.ConsistencyLevel { + return o.clientWriteConsistencyLevel +} + +func (o *options) SetIndexDefaultQueryTimeout(value time.Duration) Options { + opts := *o + opts.indexDefaultQueryTimeout = value + return &opts +} + +func (o *options) IndexDefaultQueryTimeout() time.Duration { + return o.indexDefaultQueryTimeout +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_options_manager.go b/vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_options_manager.go new file mode 100644 index 00000000..290b6ca7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/runtime/runtime_options_manager.go @@ -0,0 +1,114 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package runtime + +import ( + "fmt" + + xclose "github.com/m3db/m3/src/x/close" + xwatch "github.com/m3db/m3/src/x/watch" +) + +type optionsManager struct { + watchable xwatch.Watchable +} + +// NewOptionsManager creates a new runtime options manager +func NewOptionsManager() OptionsManager { + watchable := xwatch.NewWatchable() + watchable.Update(NewOptions()) + return &optionsManager{watchable: watchable} +} + +func (w *optionsManager) Update(value Options) error { + if err := value.Validate(); err != nil { + return err + } + w.watchable.Update(value) + return nil +} + +func (w *optionsManager) Get() Options { + return w.watchable.Get().(Options) +} + +func (w *optionsManager) RegisterListener( + listener OptionsListener, +) xclose.SimpleCloser { + _, watch, _ := w.watchable.Watch() + + // We always initialize the watchable so always read + // the first notification value + <-watch.C() + + // Deliver the current runtime options + listener.SetRuntimeOptions(watch.Get().(Options)) + + // Spawn a new goroutine that will terminate when the + // watchable terminates on the close of the runtime options manager + go func() { + for range watch.C() { + listener.SetRuntimeOptions(watch.Get().(Options)) + } + }() + + return watch +} + +func (w *optionsManager) Close() { + w.watchable.Close() +} + +// NewNoOpOptionsManager returns a no-op options manager that cannot +// be updated and does not spawn backround goroutines (useful for globals +// in test files). +func NewNoOpOptionsManager(opts Options) OptionsManager { + return noOpOptionsManager{opts: opts} +} + +type noOpOptionsManager struct { + opts Options +} + +func (n noOpOptionsManager) Update(value Options) error { + return fmt.Errorf("no-op options manager cannot update options") +} + +func (n noOpOptionsManager) Get() Options { + return n.opts +} + +func (n noOpOptionsManager) RegisterListener( + listener OptionsListener, +) xclose.SimpleCloser { + // noOpOptionsManager never changes its options, not worth + // registering listener + return noOpCloser{} +} + +func (n noOpOptionsManager) Close() { +} + +type noOpCloser struct{} + +func (n noOpCloser) Close() { + +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/runtime/types.go b/vendor/github.com/m3db/m3/src/dbnode/runtime/types.go new file mode 100644 index 00000000..cafe9f80 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/runtime/types.go @@ -0,0 +1,209 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package runtime + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/ratelimit" + "github.com/m3db/m3/src/dbnode/topology" + xclose "github.com/m3db/m3/src/x/close" +) + +// Options is a set of runtime options. +type Options interface { + // Validate will validate the runtime options are valid. + Validate() error + + // SetPersistRateLimitOptions sets the persist rate limit options + SetPersistRateLimitOptions(value ratelimit.Options) Options + + // PersistRateLimitOptions returns the persist rate limit options + PersistRateLimitOptions() ratelimit.Options + + // SetWriteNewSeriesAsync sets whether to write new series asynchronously or not, + // when true this essentially makes writes for new series eventually consistent + // as after a write is finished you are not guaranteed to read it back immediately + // due to inserts into the shard map being buffered. The write is however written + // to the commit log before completing so it is considered durable. + SetWriteNewSeriesAsync(value bool) Options + + // WriteNewSeriesAsync returns whether to write new series asynchronously or not, + // when true this essentially makes writes for new series eventually consistent + // as after a write is finished you are not guaranteed to read it back immediately + // due to inserts into the shard map being buffered. The write is however written + // to the commit log before completing so it is considered durable. + WriteNewSeriesAsync() bool + + // SetWriteNewSeriesBackoffDuration sets the insert backoff duration during + // periods of heavy insertions, this backoff helps gather larger batches + // to insert into a shard in a single batch requiring far less write lock + // acquisitions. + SetWriteNewSeriesBackoffDuration(value time.Duration) Options + + // WriteNewSeriesBackoffDuration returns the insert backoff duration during + // periods of heavy insertions, this backoff helps gather larger batches + // to insert into a shard in a single batch requiring far less write lock + // acquisitions. + WriteNewSeriesBackoffDuration() time.Duration + + // SetWriteNewSeriesLimitPerShardPerSecond sets the insert rate limit per second, + // setting to zero disables any rate limit for new series insertions. This rate + // limit is primarily offered to defend against unintentional bursts of new + // time series being inserted. + SetWriteNewSeriesLimitPerShardPerSecond(value int) Options + + // WriteNewSeriesLimitPerShardPerSecond returns the insert rate limit per second, + // setting to zero disables any rate limit for new series insertions. This rate + // limit is primarily offered to defend against unintentional bursts of new + // time series being inserted. + WriteNewSeriesLimitPerShardPerSecond() int + + // SetEncodersPerBlockLimit sets the maximum number of encoders per block + // allowed. Setting to zero means an unlimited number of encoders are + // permitted. This rate limit is primarily offered to defend against + // bursts of out of order writes, which creates many encoders, subsequently + // causing a large burst in CPU load when trying to merge them. + SetEncodersPerBlockLimit(value int) Options + + // EncodersPerBlockLimit sets the maximum number of encoders per block + // allowed. Setting to zero means an unlimited number of encoders are + // permitted. This rate limit is primarily offered to defend against + // bursts of out of order writes, which creates many encoders, subsequently + // causing a large burst in CPU load when trying to merge them. + EncodersPerBlockLimit() int + + // SetTickSeriesBatchSize sets the batch size to process series together + // during a tick before yielding and sleeping the per series duration + // multiplied by the batch size. + // The higher this value is the more variable CPU utilization will be + // but the shorter ticks will ultimately be. + SetTickSeriesBatchSize(value int) Options + + // TickSeriesBatchSize returns the batch size to process series together + // during a tick before yielding and sleeping the per series duration + // multiplied by the batch size. + // The higher this value is the more variable CPU utilization will be + // but the shorter ticks will ultimately be. + TickSeriesBatchSize() int + + // SetTickPerSeriesSleepDuration sets the tick sleep per series value that + // provides a constant duration to sleep per series at the end of processing + // a batch of series during a background tick, this can directly effect how + // fast a block is persisted after is rotated from the mutable series buffer + // to a series block (since all series need to be merged/processed before a + // persist can occur). + SetTickPerSeriesSleepDuration(value time.Duration) Options + + // TickPerSeriesSleepDuration returns the tick sleep per series value that + // provides a constant duration to sleep per series at the end of processing + // a batch of series during a background tick, this can directly effect how + // fast a block is persisted after is rotated from the mutable series buffer + // to a series block (since all series need to be merged/processed before a + // persist can occur). + TickPerSeriesSleepDuration() time.Duration + + // SetTickMinimumInterval sets the minimum tick interval to run ticks, this + // helps throttle the tick when the amount of series is low and the sleeps + // on a per series basis is short. + SetTickMinimumInterval(value time.Duration) Options + + // TickMinimumInterval returns the minimum tick interval to run ticks, this + // helps throttle the tick when the amount of series is low and the sleeps + // on a per series basis is short. + TickMinimumInterval() time.Duration + + // SetMaxWiredBlocks sets the max blocks to keep wired; zero is used + // to specify no limit. Wired blocks that are in the buffer, I.E are + // being written to, cannot be unwired. Similarly, blocks which have + // just been rotated out of the buffer but have not been flushed yet + // can also not be unwired. This means that the limit is best effort. + SetMaxWiredBlocks(value uint) Options + + // MaxWiredBlocks returns the max blocks to keep wired, zero is used + // to specify no limit. Wired blocks that are in the buffer, I.E are + // being written to, cannot be unwired. Similarly, blocks which have + // just been rotated out of the buffer but have not been flushed yet + // can also not be unwired. This means that the limit is best effort. + MaxWiredBlocks() uint + + // SetClientBootstrapConsistencyLevel sets the client bootstrap + // consistency level used when bootstrapping from peers. Setting this + // will take effect immediately, and as such can be used to finish a + // bootstrap in an unhealthy cluster to recover read capability by setting + // this value to ReadConsistencyLevelNone. + SetClientBootstrapConsistencyLevel(value topology.ReadConsistencyLevel) Options + + // ClientBootstrapConsistencyLevel returns the client bootstrap + // consistency level used when bootstrapping from peers. Setting this + // will take effect immediately, and as such can be used to finish a + // bootstrap in an unhealthy cluster to recover read capability by setting + // this value to ReadConsistencyLevelNone. + ClientBootstrapConsistencyLevel() topology.ReadConsistencyLevel + + // SetClientReadConsistencyLevel sets the client read consistency level + // used when fetching data from peers for coordinated reads + SetClientReadConsistencyLevel(value topology.ReadConsistencyLevel) Options + + // ClientReadConsistencyLevel returns the client read consistency level + // used when fetching data from peers for coordinated reads + ClientReadConsistencyLevel() topology.ReadConsistencyLevel + + // SetClientWriteConsistencyLevel sets the client write consistency level + // used when fetching data from peers for coordinated writes + SetClientWriteConsistencyLevel(value topology.ConsistencyLevel) Options + + // ClientWriteConsistencyLevel returns the client write consistency level + // used when fetching data from peers for coordinated writes + ClientWriteConsistencyLevel() topology.ConsistencyLevel + + // SetIndexDefaultQueryTimeout is the hard timeout value to use if none is + // specified for a specific query, zero specifies to use no timeout at all. + SetIndexDefaultQueryTimeout(value time.Duration) Options + + // IndexDefaultQueryTimeout is the hard timeout value to use if none is + // specified for a specific query, zero specifies to use no timeout at all. + IndexDefaultQueryTimeout() time.Duration +} + +// OptionsManager updates and supplies runtime options. +type OptionsManager interface { + // Update updates the current runtime options. + Update(value Options) error + + // Get returns the current values. + Get() Options + + // RegisterListener registers a listener for updates to runtime options, + // it will synchronously call back the listener when this method is called + // to deliver the current set of runtime options. + RegisterListener(l OptionsListener) xclose.SimpleCloser + + // Close closes the watcher and all descendent watches. + Close() +} + +// OptionsListener listens for updates to runtime options. +type OptionsListener interface { + // SetRuntimeOptions is called when the listener is registered + // and when any updates occurred passing the new runtime options. + SetRuntimeOptions(value Options) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/sharding/shardset.go b/vendor/github.com/m3db/m3/src/dbnode/sharding/shardset.go new file mode 100644 index 00000000..5bf836a1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/sharding/shardset.go @@ -0,0 +1,165 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sharding + +import ( + "errors" + "math" + + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/stackmurmur3/v2" +) + +var ( + // ErrDuplicateShards returned when shard set is empty + ErrDuplicateShards = errors.New("duplicate shards") + + // ErrInvalidShardID is returned on an invalid shard ID + ErrInvalidShardID = errors.New("no shard with given ID") +) + +type shardSet struct { + shards []shard.Shard + ids []uint32 + shardMap map[uint32]shard.Shard + fn HashFn +} + +// NewShardSet creates a new sharding scheme with a set of shards +func NewShardSet(shards []shard.Shard, fn HashFn) (ShardSet, error) { + if err := validateShards(shards); err != nil { + return nil, err + } + return newValidatedShardSet(shards, fn), nil +} + +// NewEmptyShardSet creates a new sharding scheme with an empty set of shards +func NewEmptyShardSet(fn HashFn) ShardSet { + return newValidatedShardSet(nil, fn) +} + +func newValidatedShardSet(shards []shard.Shard, fn HashFn) ShardSet { + ids := make([]uint32, len(shards)) + shardMap := make(map[uint32]shard.Shard, len(shards)) + for i, shard := range shards { + ids[i] = shard.ID() + shardMap[shard.ID()] = shard + } + return &shardSet{ + shards: shards, + ids: ids, + shardMap: shardMap, + fn: fn, + } +} + +func (s *shardSet) Lookup(identifier ident.ID) uint32 { + return s.fn(identifier) +} + +func (s *shardSet) LookupStateByID(shardID uint32) (shard.State, error) { + hostShard, ok := s.shardMap[shardID] + if !ok { + return shard.State(0), ErrInvalidShardID + } + return hostShard.State(), nil +} + +func (s *shardSet) All() []shard.Shard { + return s.shards[:] +} + +func (s *shardSet) AllIDs() []uint32 { + return s.ids[:] +} + +func (s *shardSet) Min() uint32 { + min := uint32(math.MaxUint32) + for _, shard := range s.ids { + if shard < min { + min = shard + } + } + return min +} + +func (s *shardSet) Max() uint32 { + max := uint32(0) + for _, shard := range s.ids { + if shard > max { + max = shard + } + } + return max +} + +func (s *shardSet) HashFn() HashFn { + return s.fn +} + +// NewShards returns a new slice of shards with a specified state +func NewShards(ids []uint32, state shard.State) []shard.Shard { + shards := make([]shard.Shard, len(ids)) + for i, id := range ids { + shards[i] = shard.NewShard(id).SetState(state) + } + return shards +} + +// IDs returns a new slice of shard IDs for a set of shards +func IDs(shards []shard.Shard) []uint32 { + ids := make([]uint32, len(shards)) + for i := range ids { + ids[i] = shards[i].ID() + } + return ids +} + +func validateShards(shards []shard.Shard) error { + uniqueShards := make(map[uint32]struct{}, len(shards)) + for _, s := range shards { + if _, exist := uniqueShards[s.ID()]; exist { + return ErrDuplicateShards + } + uniqueShards[s.ID()] = struct{}{} + } + return nil +} + +// DefaultHashFn generates a HashFn based on murmur32 +func DefaultHashFn(length int) HashFn { + return NewHashFn(length, 0) +} + +// NewHashGenWithSeed generates a HashFnGen based on murmur32 with a given seed +func NewHashGenWithSeed(seed uint32) HashGen { + return func(length int) HashFn { + return NewHashFn(length, seed) + } +} + +// NewHashFn generates a HashFN based on murmur32 with a given seed +func NewHashFn(length int, seed uint32) HashFn { + return func(id ident.ID) uint32 { + return murmur3.SeedSum32(seed, id.Bytes()) % uint32(length) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/sharding/types.go b/vendor/github.com/m3db/m3/src/dbnode/sharding/types.go new file mode 100644 index 00000000..d7babd5a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/sharding/types.go @@ -0,0 +1,57 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sharding + +import ( + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/x/ident" +) + +// HashGen generates HashFn based on the length of shards. +type HashGen func(length int) HashFn + +// HashFn is a sharding hash function. +type HashFn func(id ident.ID) uint32 + +// ShardSet contains a sharding function and a set of shards, this interface +// allows for potentially out of order shard sets. +type ShardSet interface { + // All returns a slice to the shards in this set. + All() []shard.Shard + + // AllIDs returns a slice to the shard IDs in this set. + AllIDs() []uint32 + + // Lookup will return a shard for a given identifier. + Lookup(id ident.ID) uint32 + + // LookupStateByID returns the state of the shard with a given ID. + LookupStateByID(shardID uint32) (shard.State, error) + + // Min returns the smallest shard owned by this shard set. + Min() uint32 + + // Max returns the largest shard owned by this shard set. + Max() uint32 + + // HashFn returns the sharding hash function. + HashFn() HashFn +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/block.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/block.go new file mode 100644 index 00000000..0fdb4c9b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/block.go @@ -0,0 +1,561 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "errors" + "sync" + "sync/atomic" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + xtime "github.com/m3db/m3/src/x/time" +) + +var ( + errReadFromClosedBlock = errors.New("attempt to read from a closed block") + errTriedToMergeBlockFromDisk = errors.New("[invariant violated] tried to merge a block that was retrieved from disk") + + timeZero = time.Time{} +) + +type dbBlock struct { + sync.RWMutex + + nsCtx namespace.Context + opts Options + startUnixNanos int64 + segment ts.Segment + length int + + blockSize time.Duration + + lastReadUnixNanos int64 + + mergeTarget DatabaseBlock + + seriesID ident.ID + + onEvicted OnEvictedFromWiredList + + // listState contains state that the Wired List requires in order to track a block's + // position in the wired list. All the state in this struct is "owned" by the wired + // list and should only be accessed by the Wired List itself. Does not require any + // synchronization because the WiredList is not concurrent. + listState listState + + checksum uint32 + + wasRetrievedFromDisk bool + closed bool +} + +type listState struct { + next DatabaseBlock + prev DatabaseBlock + enteredListAtUnixNano int64 +} + +// NewDatabaseBlock creates a new DatabaseBlock instance. +func NewDatabaseBlock( + start time.Time, + blockSize time.Duration, + segment ts.Segment, + opts Options, + nsCtx namespace.Context, +) DatabaseBlock { + b := &dbBlock{ + nsCtx: nsCtx, + opts: opts, + startUnixNanos: start.UnixNano(), + blockSize: blockSize, + closed: false, + } + if segment.Len() > 0 { + b.resetSegmentWithLock(segment) + } + return b +} + +func (b *dbBlock) StartTime() time.Time { + b.RLock() + start := b.startWithRLock() + b.RUnlock() + return start +} + +func (b *dbBlock) BlockSize() time.Duration { + b.RLock() + size := b.blockSize + b.RUnlock() + return size +} + +func (b *dbBlock) startWithRLock() time.Time { + return time.Unix(0, b.startUnixNanos) +} + +func (b *dbBlock) SetLastReadTime(value time.Time) { + // Use an int64 to avoid needing a write lock for + // this high frequency called method (i.e. each individual + // read needing a write lock would be excessive) + atomic.StoreInt64(&b.lastReadUnixNanos, value.UnixNano()) +} + +func (b *dbBlock) LastReadTime() time.Time { + return time.Unix(0, atomic.LoadInt64(&b.lastReadUnixNanos)) +} + +func (b *dbBlock) Len() int { + b.RLock() + length := b.length + b.RUnlock() + return length +} + +func (b *dbBlock) Checksum() (uint32, error) { + b.RLock() + checksum := b.checksum + hasMergeTarget := b.mergeTarget != nil + b.RUnlock() + + if !hasMergeTarget { + return checksum, nil + } + + b.Lock() + defer b.Unlock() + // Since we released the lock temporarily we need to check again. + hasMergeTarget = b.mergeTarget != nil + if !hasMergeTarget { + return b.checksum, nil + } + + tempCtx := b.opts.ContextPool().Get() + + stream, err := b.streamWithRLock(tempCtx) + if err != nil { + return 0, err + } + + // This will merge the existing stream with the merge target's stream, + // as well as recalculate and store the new checksum. + err = b.forceMergeWithLock(tempCtx, stream) + if err != nil { + return 0, err + } + + return b.checksum, nil +} + +func (b *dbBlock) Stream(blocker context.Context) (xio.BlockReader, error) { + lockUpgraded := false + + b.RLock() + defer func() { + if lockUpgraded { + b.Unlock() + } else { + b.RUnlock() + } + }() + + if b.closed { + return xio.EmptyBlockReader, errReadFromClosedBlock + } + + if b.mergeTarget == nil { + return b.streamWithRLock(blocker) + } + + b.RUnlock() + lockUpgraded = true + b.Lock() + + // Need to re-check everything since we upgraded the lock. + if b.closed { + return xio.EmptyBlockReader, errReadFromClosedBlock + } + + stream, err := b.streamWithRLock(blocker) + if err != nil { + return xio.EmptyBlockReader, err + } + + if b.mergeTarget == nil { + return stream, nil + } + + // This will merge the existing stream with the merge target's stream, + // as well as recalculate and store the new checksum. + err = b.forceMergeWithLock(blocker, stream) + if err != nil { + return xio.EmptyBlockReader, err + } + + // This will return a copy of the data so that it is still safe to + // close the block after calling this method. + return b.streamWithRLock(blocker) +} + +func (b *dbBlock) HasMergeTarget() bool { + b.RLock() + hasMergeTarget := b.mergeTarget != nil + b.RUnlock() + return hasMergeTarget +} + +func (b *dbBlock) WasRetrievedFromDisk() bool { + b.RLock() + wasRetrieved := b.wasRetrievedFromDisk + b.RUnlock() + return wasRetrieved +} + +func (b *dbBlock) Merge(other DatabaseBlock) error { + b.Lock() + if b.wasRetrievedFromDisk || other.WasRetrievedFromDisk() { + // We use Merge to lazily merge blocks that eventually need to be flushed to disk + // If we try to perform a merge on blocks that were retrieved from disk then we've + // violated an invariant and probably have a bug that is causing data loss. + b.Unlock() + return errTriedToMergeBlockFromDisk + } + + if b.mergeTarget == nil { + b.mergeTarget = other + } else { + b.mergeTarget.Merge(other) + } + + b.Unlock() + return nil +} + +func (b *dbBlock) Reset(start time.Time, blockSize time.Duration, segment ts.Segment, nsCtx namespace.Context) { + b.Lock() + defer b.Unlock() + b.resetNewBlockStartWithLock(start, blockSize) + b.resetSegmentWithLock(segment) + b.nsCtx = nsCtx +} + +func (b *dbBlock) ResetFromDisk(start time.Time, blockSize time.Duration, segment ts.Segment, id ident.ID, nsCtx namespace.Context) { + b.Lock() + defer b.Unlock() + b.resetNewBlockStartWithLock(start, blockSize) + // resetSegmentWithLock sets seriesID to nil + b.resetSegmentWithLock(segment) + b.seriesID = id + b.nsCtx = nsCtx + b.wasRetrievedFromDisk = true +} + +func (b *dbBlock) streamWithRLock(ctx context.Context) (xio.BlockReader, error) { + start := b.startWithRLock() + + // Take a copy to avoid heavy depends on cycle + segmentReader := b.opts.SegmentReaderPool().Get() + data := b.opts.BytesPool().Get(b.segment.Len()) + data.IncRef() + if b.segment.Head != nil { + data.AppendAll(b.segment.Head.Bytes()) + } + if b.segment.Tail != nil { + data.AppendAll(b.segment.Tail.Bytes()) + } + data.DecRef() + checksum := b.segment.CalculateChecksum() + segmentReader.Reset(ts.NewSegment(data, nil, checksum, ts.FinalizeHead)) + ctx.RegisterFinalizer(segmentReader) + + blockReader := xio.BlockReader{ + SegmentReader: segmentReader, + Start: start, + BlockSize: b.blockSize, + } + + return blockReader, nil +} + +func (b *dbBlock) forceMergeWithLock(ctx context.Context, stream xio.SegmentReader) error { + targetStream, err := b.mergeTarget.Stream(ctx) + if err != nil { + return err + } + start := b.startWithRLock() + mergedBlockReader := newDatabaseMergedBlockReader(b.nsCtx, start, b.blockSize, + mergeableStream{stream: stream, finalize: false}, // Should have been marked for finalization by the caller + mergeableStream{stream: targetStream, finalize: false}, // Already marked for finalization by the Stream() call above + b.opts) + mergedSegment, err := mergedBlockReader.Segment() + if err != nil { + return err + } + + b.resetMergeTargetWithLock() + b.resetSegmentWithLock(mergedSegment) + return nil +} + +func (b *dbBlock) resetNewBlockStartWithLock(start time.Time, blockSize time.Duration) { + b.startUnixNanos = start.UnixNano() + b.blockSize = blockSize + atomic.StoreInt64(&b.lastReadUnixNanos, 0) + b.closed = false + b.resetMergeTargetWithLock() +} + +func (b *dbBlock) resetSegmentWithLock(seg ts.Segment) { + b.segment = seg + b.length = seg.Len() + b.checksum = seg.CalculateChecksum() + b.seriesID = nil + b.wasRetrievedFromDisk = false +} + +func (b *dbBlock) Discard() ts.Segment { + seg, _ := b.closeAndDiscardConditionally(nil) + return seg +} + +func (b *dbBlock) Close() { + segment, _ := b.closeAndDiscardConditionally(nil) + segment.Finalize() +} + +func (b *dbBlock) CloseIfFromDisk() bool { + segment, ok := b.closeAndDiscardConditionally(func(b *dbBlock) bool { + return b.wasRetrievedFromDisk + }) + if !ok { + return false + } + segment.Finalize() + return true +} + +func (b *dbBlock) closeAndDiscardConditionally(condition func(b *dbBlock) bool) (ts.Segment, bool) { + b.Lock() + + if condition != nil && !condition(b) { + b.Unlock() + return ts.Segment{}, false + } + + if b.closed { + b.Unlock() + return ts.Segment{}, true + } + + segment := b.segment + b.closed = true + + b.resetMergeTargetWithLock() + b.Unlock() + + if pool := b.opts.DatabaseBlockPool(); pool != nil { + pool.Put(b) + } + + return segment, true +} + +func (b *dbBlock) resetMergeTargetWithLock() { + if b.mergeTarget != nil { + b.mergeTarget.Close() + } + b.mergeTarget = nil +} + +// Should only be used by the WiredList. +func (b *dbBlock) next() DatabaseBlock { + return b.listState.next +} + +// Should only be used by the WiredList. +func (b *dbBlock) setNext(value DatabaseBlock) { + b.listState.next = value +} + +// Should only be used by the WiredList. +func (b *dbBlock) prev() DatabaseBlock { + return b.listState.prev +} + +// Should only be used by the WiredList. +func (b *dbBlock) setPrev(value DatabaseBlock) { + b.listState.prev = value +} + +// Should only be used by the WiredList. +func (b *dbBlock) enteredListAtUnixNano() int64 { + return b.listState.enteredListAtUnixNano +} + +// Should only be used by the WiredList. +func (b *dbBlock) setEnteredListAtUnixNano(value int64) { + b.listState.enteredListAtUnixNano = value +} + +// wiredListEntry is a snapshot of a subset of the block's state that the WiredList +// uses to determine if a block is eligible for inclusion in the WiredList. +type wiredListEntry struct { + seriesID ident.ID + startTime time.Time + closed bool + wasRetrievedFromDisk bool +} + +// wiredListEntry generates a wiredListEntry for the block, and should only +// be used by the WiredList. +func (b *dbBlock) wiredListEntry() wiredListEntry { + b.RLock() + result := wiredListEntry{ + closed: b.closed, + seriesID: b.seriesID, + wasRetrievedFromDisk: b.wasRetrievedFromDisk, + startTime: b.startWithRLock(), + } + b.RUnlock() + return result +} + +func (b *dbBlock) SetOnEvictedFromWiredList(onEvicted OnEvictedFromWiredList) { + b.Lock() + b.onEvicted = onEvicted + b.Unlock() +} + +func (b *dbBlock) OnEvictedFromWiredList() OnEvictedFromWiredList { + b.RLock() + onEvicted := b.onEvicted + b.RUnlock() + return onEvicted +} + +type databaseSeriesBlocks struct { + elems map[xtime.UnixNano]DatabaseBlock + min time.Time + max time.Time +} + +// NewDatabaseSeriesBlocks creates a databaseSeriesBlocks instance. +func NewDatabaseSeriesBlocks(capacity int) DatabaseSeriesBlocks { + return &databaseSeriesBlocks{ + elems: make(map[xtime.UnixNano]DatabaseBlock, capacity), + } +} + +func (dbb *databaseSeriesBlocks) Len() int { + return len(dbb.elems) +} + +func (dbb *databaseSeriesBlocks) AddBlock(block DatabaseBlock) { + start := block.StartTime() + if dbb.min.Equal(timeZero) || start.Before(dbb.min) { + dbb.min = start + } + if dbb.max.Equal(timeZero) || start.After(dbb.max) { + dbb.max = start + } + dbb.elems[xtime.ToUnixNano(start)] = block +} + +func (dbb *databaseSeriesBlocks) AddSeries(other DatabaseSeriesBlocks) { + if other == nil { + return + } + blocks := other.AllBlocks() + for _, b := range blocks { + dbb.AddBlock(b) + } +} + +// MinTime returns the min time of the blocks contained. +func (dbb *databaseSeriesBlocks) MinTime() time.Time { + return dbb.min +} + +// MaxTime returns the max time of the blocks contained. +func (dbb *databaseSeriesBlocks) MaxTime() time.Time { + return dbb.max +} + +func (dbb *databaseSeriesBlocks) BlockAt(t time.Time) (DatabaseBlock, bool) { + b, ok := dbb.elems[xtime.ToUnixNano(t)] + return b, ok +} + +func (dbb *databaseSeriesBlocks) AllBlocks() map[xtime.UnixNano]DatabaseBlock { + return dbb.elems +} + +func (dbb *databaseSeriesBlocks) RemoveBlockAt(t time.Time) { + tNano := xtime.ToUnixNano(t) + if _, exists := dbb.elems[tNano]; !exists { + return + } + delete(dbb.elems, tNano) + if !dbb.min.Equal(t) && !dbb.max.Equal(t) { + return + } + dbb.min, dbb.max = timeZero, timeZero + if len(dbb.elems) == 0 { + return + } + for key := range dbb.elems { + keyTime := key.ToTime() + if dbb.min == timeZero || dbb.min.After(keyTime) { + dbb.min = keyTime + } + if dbb.max == timeZero || dbb.max.Before(keyTime) { + dbb.max = keyTime + } + } +} + +func (dbb *databaseSeriesBlocks) RemoveAll() { + for t, block := range dbb.elems { + block.Close() + delete(dbb.elems, t) + } +} + +func (dbb *databaseSeriesBlocks) Reset() { + // Ensure the old, possibly large map is GC'd + dbb.elems = nil + dbb.elems = make(map[xtime.UnixNano]DatabaseBlock) + dbb.min = time.Time{} + dbb.max = time.Time{} +} + +func (dbb *databaseSeriesBlocks) Close() { + dbb.RemoveAll() + // Mark the map as nil to prevent maps that have grown large from wasting + // space in the pool (Deleting elements from a large map will not cause + // the underlying resources to shrink) + dbb.elems = nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/block_mock.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/block_mock.go new file mode 100644 index 00000000..fef13847 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/block_mock.go @@ -0,0 +1,1865 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/storage/block/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package block is a generated GoMock package. +package block + +import ( + "reflect" + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/sharding" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/clock" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + "github.com/m3db/m3/src/x/sync" + time0 "github.com/m3db/m3/src/x/time" + + "github.com/golang/mock/gomock" +) + +// MockFilteredBlocksMetadataIter is a mock of FilteredBlocksMetadataIter interface +type MockFilteredBlocksMetadataIter struct { + ctrl *gomock.Controller + recorder *MockFilteredBlocksMetadataIterMockRecorder +} + +// MockFilteredBlocksMetadataIterMockRecorder is the mock recorder for MockFilteredBlocksMetadataIter +type MockFilteredBlocksMetadataIterMockRecorder struct { + mock *MockFilteredBlocksMetadataIter +} + +// NewMockFilteredBlocksMetadataIter creates a new mock instance +func NewMockFilteredBlocksMetadataIter(ctrl *gomock.Controller) *MockFilteredBlocksMetadataIter { + mock := &MockFilteredBlocksMetadataIter{ctrl: ctrl} + mock.recorder = &MockFilteredBlocksMetadataIterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFilteredBlocksMetadataIter) EXPECT() *MockFilteredBlocksMetadataIterMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockFilteredBlocksMetadataIter) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockFilteredBlocksMetadataIterMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockFilteredBlocksMetadataIter)(nil).Next)) +} + +// Current mocks base method +func (m *MockFilteredBlocksMetadataIter) Current() (ident.ID, Metadata) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(ident.ID) + ret1, _ := ret[1].(Metadata) + return ret0, ret1 +} + +// Current indicates an expected call of Current +func (mr *MockFilteredBlocksMetadataIterMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockFilteredBlocksMetadataIter)(nil).Current)) +} + +// Err mocks base method +func (m *MockFilteredBlocksMetadataIter) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockFilteredBlocksMetadataIterMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockFilteredBlocksMetadataIter)(nil).Err)) +} + +// MockFetchBlockMetadataResults is a mock of FetchBlockMetadataResults interface +type MockFetchBlockMetadataResults struct { + ctrl *gomock.Controller + recorder *MockFetchBlockMetadataResultsMockRecorder +} + +// MockFetchBlockMetadataResultsMockRecorder is the mock recorder for MockFetchBlockMetadataResults +type MockFetchBlockMetadataResultsMockRecorder struct { + mock *MockFetchBlockMetadataResults +} + +// NewMockFetchBlockMetadataResults creates a new mock instance +func NewMockFetchBlockMetadataResults(ctrl *gomock.Controller) *MockFetchBlockMetadataResults { + mock := &MockFetchBlockMetadataResults{ctrl: ctrl} + mock.recorder = &MockFetchBlockMetadataResultsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFetchBlockMetadataResults) EXPECT() *MockFetchBlockMetadataResultsMockRecorder { + return m.recorder +} + +// Add mocks base method +func (m *MockFetchBlockMetadataResults) Add(res FetchBlockMetadataResult) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Add", res) +} + +// Add indicates an expected call of Add +func (mr *MockFetchBlockMetadataResultsMockRecorder) Add(res interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockFetchBlockMetadataResults)(nil).Add), res) +} + +// Results mocks base method +func (m *MockFetchBlockMetadataResults) Results() []FetchBlockMetadataResult { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Results") + ret0, _ := ret[0].([]FetchBlockMetadataResult) + return ret0 +} + +// Results indicates an expected call of Results +func (mr *MockFetchBlockMetadataResultsMockRecorder) Results() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Results", reflect.TypeOf((*MockFetchBlockMetadataResults)(nil).Results)) +} + +// Sort mocks base method +func (m *MockFetchBlockMetadataResults) Sort() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Sort") +} + +// Sort indicates an expected call of Sort +func (mr *MockFetchBlockMetadataResultsMockRecorder) Sort() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Sort", reflect.TypeOf((*MockFetchBlockMetadataResults)(nil).Sort)) +} + +// Reset mocks base method +func (m *MockFetchBlockMetadataResults) Reset() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset") +} + +// Reset indicates an expected call of Reset +func (mr *MockFetchBlockMetadataResultsMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockFetchBlockMetadataResults)(nil).Reset)) +} + +// Close mocks base method +func (m *MockFetchBlockMetadataResults) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockFetchBlockMetadataResultsMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockFetchBlockMetadataResults)(nil).Close)) +} + +// MockFetchBlocksMetadataResults is a mock of FetchBlocksMetadataResults interface +type MockFetchBlocksMetadataResults struct { + ctrl *gomock.Controller + recorder *MockFetchBlocksMetadataResultsMockRecorder +} + +// MockFetchBlocksMetadataResultsMockRecorder is the mock recorder for MockFetchBlocksMetadataResults +type MockFetchBlocksMetadataResultsMockRecorder struct { + mock *MockFetchBlocksMetadataResults +} + +// NewMockFetchBlocksMetadataResults creates a new mock instance +func NewMockFetchBlocksMetadataResults(ctrl *gomock.Controller) *MockFetchBlocksMetadataResults { + mock := &MockFetchBlocksMetadataResults{ctrl: ctrl} + mock.recorder = &MockFetchBlocksMetadataResultsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFetchBlocksMetadataResults) EXPECT() *MockFetchBlocksMetadataResultsMockRecorder { + return m.recorder +} + +// Add mocks base method +func (m *MockFetchBlocksMetadataResults) Add(res FetchBlocksMetadataResult) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Add", res) +} + +// Add indicates an expected call of Add +func (mr *MockFetchBlocksMetadataResultsMockRecorder) Add(res interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockFetchBlocksMetadataResults)(nil).Add), res) +} + +// Results mocks base method +func (m *MockFetchBlocksMetadataResults) Results() []FetchBlocksMetadataResult { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Results") + ret0, _ := ret[0].([]FetchBlocksMetadataResult) + return ret0 +} + +// Results indicates an expected call of Results +func (mr *MockFetchBlocksMetadataResultsMockRecorder) Results() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Results", reflect.TypeOf((*MockFetchBlocksMetadataResults)(nil).Results)) +} + +// Reset mocks base method +func (m *MockFetchBlocksMetadataResults) Reset() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset") +} + +// Reset indicates an expected call of Reset +func (mr *MockFetchBlocksMetadataResultsMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockFetchBlocksMetadataResults)(nil).Reset)) +} + +// Close mocks base method +func (m *MockFetchBlocksMetadataResults) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockFetchBlocksMetadataResultsMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockFetchBlocksMetadataResults)(nil).Close)) +} + +// MockDatabaseBlock is a mock of DatabaseBlock interface +type MockDatabaseBlock struct { + ctrl *gomock.Controller + recorder *MockDatabaseBlockMockRecorder +} + +// MockDatabaseBlockMockRecorder is the mock recorder for MockDatabaseBlock +type MockDatabaseBlockMockRecorder struct { + mock *MockDatabaseBlock +} + +// NewMockDatabaseBlock creates a new mock instance +func NewMockDatabaseBlock(ctrl *gomock.Controller) *MockDatabaseBlock { + mock := &MockDatabaseBlock{ctrl: ctrl} + mock.recorder = &MockDatabaseBlockMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDatabaseBlock) EXPECT() *MockDatabaseBlockMockRecorder { + return m.recorder +} + +// StartTime mocks base method +func (m *MockDatabaseBlock) StartTime() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartTime") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// StartTime indicates an expected call of StartTime +func (mr *MockDatabaseBlockMockRecorder) StartTime() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartTime", reflect.TypeOf((*MockDatabaseBlock)(nil).StartTime)) +} + +// BlockSize mocks base method +func (m *MockDatabaseBlock) BlockSize() time.Duration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockSize") + ret0, _ := ret[0].(time.Duration) + return ret0 +} + +// BlockSize indicates an expected call of BlockSize +func (mr *MockDatabaseBlockMockRecorder) BlockSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockSize", reflect.TypeOf((*MockDatabaseBlock)(nil).BlockSize)) +} + +// SetLastReadTime mocks base method +func (m *MockDatabaseBlock) SetLastReadTime(value time.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetLastReadTime", value) +} + +// SetLastReadTime indicates an expected call of SetLastReadTime +func (mr *MockDatabaseBlockMockRecorder) SetLastReadTime(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLastReadTime", reflect.TypeOf((*MockDatabaseBlock)(nil).SetLastReadTime), value) +} + +// LastReadTime mocks base method +func (m *MockDatabaseBlock) LastReadTime() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LastReadTime") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// LastReadTime indicates an expected call of LastReadTime +func (mr *MockDatabaseBlockMockRecorder) LastReadTime() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LastReadTime", reflect.TypeOf((*MockDatabaseBlock)(nil).LastReadTime)) +} + +// Len mocks base method +func (m *MockDatabaseBlock) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockDatabaseBlockMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockDatabaseBlock)(nil).Len)) +} + +// Checksum mocks base method +func (m *MockDatabaseBlock) Checksum() (uint32, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Checksum") + ret0, _ := ret[0].(uint32) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Checksum indicates an expected call of Checksum +func (mr *MockDatabaseBlockMockRecorder) Checksum() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Checksum", reflect.TypeOf((*MockDatabaseBlock)(nil).Checksum)) +} + +// Stream mocks base method +func (m *MockDatabaseBlock) Stream(blocker context.Context) (xio.BlockReader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stream", blocker) + ret0, _ := ret[0].(xio.BlockReader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Stream indicates an expected call of Stream +func (mr *MockDatabaseBlockMockRecorder) Stream(blocker interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stream", reflect.TypeOf((*MockDatabaseBlock)(nil).Stream), blocker) +} + +// Merge mocks base method +func (m *MockDatabaseBlock) Merge(other DatabaseBlock) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Merge", other) + ret0, _ := ret[0].(error) + return ret0 +} + +// Merge indicates an expected call of Merge +func (mr *MockDatabaseBlockMockRecorder) Merge(other interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Merge", reflect.TypeOf((*MockDatabaseBlock)(nil).Merge), other) +} + +// HasMergeTarget mocks base method +func (m *MockDatabaseBlock) HasMergeTarget() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HasMergeTarget") + ret0, _ := ret[0].(bool) + return ret0 +} + +// HasMergeTarget indicates an expected call of HasMergeTarget +func (mr *MockDatabaseBlockMockRecorder) HasMergeTarget() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasMergeTarget", reflect.TypeOf((*MockDatabaseBlock)(nil).HasMergeTarget)) +} + +// WasRetrievedFromDisk mocks base method +func (m *MockDatabaseBlock) WasRetrievedFromDisk() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WasRetrievedFromDisk") + ret0, _ := ret[0].(bool) + return ret0 +} + +// WasRetrievedFromDisk indicates an expected call of WasRetrievedFromDisk +func (mr *MockDatabaseBlockMockRecorder) WasRetrievedFromDisk() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WasRetrievedFromDisk", reflect.TypeOf((*MockDatabaseBlock)(nil).WasRetrievedFromDisk)) +} + +// Reset mocks base method +func (m *MockDatabaseBlock) Reset(startTime time.Time, blockSize time.Duration, segment ts.Segment, nsCtx namespace.Context) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", startTime, blockSize, segment, nsCtx) +} + +// Reset indicates an expected call of Reset +func (mr *MockDatabaseBlockMockRecorder) Reset(startTime, blockSize, segment, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockDatabaseBlock)(nil).Reset), startTime, blockSize, segment, nsCtx) +} + +// ResetFromDisk mocks base method +func (m *MockDatabaseBlock) ResetFromDisk(startTime time.Time, blockSize time.Duration, segment ts.Segment, id ident.ID, nsCtx namespace.Context) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ResetFromDisk", startTime, blockSize, segment, id, nsCtx) +} + +// ResetFromDisk indicates an expected call of ResetFromDisk +func (mr *MockDatabaseBlockMockRecorder) ResetFromDisk(startTime, blockSize, segment, id, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResetFromDisk", reflect.TypeOf((*MockDatabaseBlock)(nil).ResetFromDisk), startTime, blockSize, segment, id, nsCtx) +} + +// Discard mocks base method +func (m *MockDatabaseBlock) Discard() ts.Segment { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Discard") + ret0, _ := ret[0].(ts.Segment) + return ret0 +} + +// Discard indicates an expected call of Discard +func (mr *MockDatabaseBlockMockRecorder) Discard() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Discard", reflect.TypeOf((*MockDatabaseBlock)(nil).Discard)) +} + +// Close mocks base method +func (m *MockDatabaseBlock) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockDatabaseBlockMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockDatabaseBlock)(nil).Close)) +} + +// CloseIfFromDisk mocks base method +func (m *MockDatabaseBlock) CloseIfFromDisk() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseIfFromDisk") + ret0, _ := ret[0].(bool) + return ret0 +} + +// CloseIfFromDisk indicates an expected call of CloseIfFromDisk +func (mr *MockDatabaseBlockMockRecorder) CloseIfFromDisk() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseIfFromDisk", reflect.TypeOf((*MockDatabaseBlock)(nil).CloseIfFromDisk)) +} + +// SetOnEvictedFromWiredList mocks base method +func (m *MockDatabaseBlock) SetOnEvictedFromWiredList(arg0 OnEvictedFromWiredList) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetOnEvictedFromWiredList", arg0) +} + +// SetOnEvictedFromWiredList indicates an expected call of SetOnEvictedFromWiredList +func (mr *MockDatabaseBlockMockRecorder) SetOnEvictedFromWiredList(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetOnEvictedFromWiredList", reflect.TypeOf((*MockDatabaseBlock)(nil).SetOnEvictedFromWiredList), arg0) +} + +// OnEvictedFromWiredList mocks base method +func (m *MockDatabaseBlock) OnEvictedFromWiredList() OnEvictedFromWiredList { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OnEvictedFromWiredList") + ret0, _ := ret[0].(OnEvictedFromWiredList) + return ret0 +} + +// OnEvictedFromWiredList indicates an expected call of OnEvictedFromWiredList +func (mr *MockDatabaseBlockMockRecorder) OnEvictedFromWiredList() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnEvictedFromWiredList", reflect.TypeOf((*MockDatabaseBlock)(nil).OnEvictedFromWiredList)) +} + +// next mocks base method +func (m *MockDatabaseBlock) next() DatabaseBlock { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "next") + ret0, _ := ret[0].(DatabaseBlock) + return ret0 +} + +// next indicates an expected call of next +func (mr *MockDatabaseBlockMockRecorder) next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "next", reflect.TypeOf((*MockDatabaseBlock)(nil).next)) +} + +// setNext mocks base method +func (m *MockDatabaseBlock) setNext(block DatabaseBlock) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "setNext", block) +} + +// setNext indicates an expected call of setNext +func (mr *MockDatabaseBlockMockRecorder) setNext(block interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "setNext", reflect.TypeOf((*MockDatabaseBlock)(nil).setNext), block) +} + +// prev mocks base method +func (m *MockDatabaseBlock) prev() DatabaseBlock { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "prev") + ret0, _ := ret[0].(DatabaseBlock) + return ret0 +} + +// prev indicates an expected call of prev +func (mr *MockDatabaseBlockMockRecorder) prev() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "prev", reflect.TypeOf((*MockDatabaseBlock)(nil).prev)) +} + +// setPrev mocks base method +func (m *MockDatabaseBlock) setPrev(block DatabaseBlock) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "setPrev", block) +} + +// setPrev indicates an expected call of setPrev +func (mr *MockDatabaseBlockMockRecorder) setPrev(block interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "setPrev", reflect.TypeOf((*MockDatabaseBlock)(nil).setPrev), block) +} + +// enteredListAtUnixNano mocks base method +func (m *MockDatabaseBlock) enteredListAtUnixNano() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "enteredListAtUnixNano") + ret0, _ := ret[0].(int64) + return ret0 +} + +// enteredListAtUnixNano indicates an expected call of enteredListAtUnixNano +func (mr *MockDatabaseBlockMockRecorder) enteredListAtUnixNano() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "enteredListAtUnixNano", reflect.TypeOf((*MockDatabaseBlock)(nil).enteredListAtUnixNano)) +} + +// setEnteredListAtUnixNano mocks base method +func (m *MockDatabaseBlock) setEnteredListAtUnixNano(value int64) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "setEnteredListAtUnixNano", value) +} + +// setEnteredListAtUnixNano indicates an expected call of setEnteredListAtUnixNano +func (mr *MockDatabaseBlockMockRecorder) setEnteredListAtUnixNano(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "setEnteredListAtUnixNano", reflect.TypeOf((*MockDatabaseBlock)(nil).setEnteredListAtUnixNano), value) +} + +// wiredListEntry mocks base method +func (m *MockDatabaseBlock) wiredListEntry() wiredListEntry { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "wiredListEntry") + ret0, _ := ret[0].(wiredListEntry) + return ret0 +} + +// wiredListEntry indicates an expected call of wiredListEntry +func (mr *MockDatabaseBlockMockRecorder) wiredListEntry() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "wiredListEntry", reflect.TypeOf((*MockDatabaseBlock)(nil).wiredListEntry)) +} + +// MockdatabaseBlock is a mock of databaseBlock interface +type MockdatabaseBlock struct { + ctrl *gomock.Controller + recorder *MockdatabaseBlockMockRecorder +} + +// MockdatabaseBlockMockRecorder is the mock recorder for MockdatabaseBlock +type MockdatabaseBlockMockRecorder struct { + mock *MockdatabaseBlock +} + +// NewMockdatabaseBlock creates a new mock instance +func NewMockdatabaseBlock(ctrl *gomock.Controller) *MockdatabaseBlock { + mock := &MockdatabaseBlock{ctrl: ctrl} + mock.recorder = &MockdatabaseBlockMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockdatabaseBlock) EXPECT() *MockdatabaseBlockMockRecorder { + return m.recorder +} + +// next mocks base method +func (m *MockdatabaseBlock) next() DatabaseBlock { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "next") + ret0, _ := ret[0].(DatabaseBlock) + return ret0 +} + +// next indicates an expected call of next +func (mr *MockdatabaseBlockMockRecorder) next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "next", reflect.TypeOf((*MockdatabaseBlock)(nil).next)) +} + +// setNext mocks base method +func (m *MockdatabaseBlock) setNext(block DatabaseBlock) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "setNext", block) +} + +// setNext indicates an expected call of setNext +func (mr *MockdatabaseBlockMockRecorder) setNext(block interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "setNext", reflect.TypeOf((*MockdatabaseBlock)(nil).setNext), block) +} + +// prev mocks base method +func (m *MockdatabaseBlock) prev() DatabaseBlock { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "prev") + ret0, _ := ret[0].(DatabaseBlock) + return ret0 +} + +// prev indicates an expected call of prev +func (mr *MockdatabaseBlockMockRecorder) prev() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "prev", reflect.TypeOf((*MockdatabaseBlock)(nil).prev)) +} + +// setPrev mocks base method +func (m *MockdatabaseBlock) setPrev(block DatabaseBlock) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "setPrev", block) +} + +// setPrev indicates an expected call of setPrev +func (mr *MockdatabaseBlockMockRecorder) setPrev(block interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "setPrev", reflect.TypeOf((*MockdatabaseBlock)(nil).setPrev), block) +} + +// enteredListAtUnixNano mocks base method +func (m *MockdatabaseBlock) enteredListAtUnixNano() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "enteredListAtUnixNano") + ret0, _ := ret[0].(int64) + return ret0 +} + +// enteredListAtUnixNano indicates an expected call of enteredListAtUnixNano +func (mr *MockdatabaseBlockMockRecorder) enteredListAtUnixNano() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "enteredListAtUnixNano", reflect.TypeOf((*MockdatabaseBlock)(nil).enteredListAtUnixNano)) +} + +// setEnteredListAtUnixNano mocks base method +func (m *MockdatabaseBlock) setEnteredListAtUnixNano(value int64) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "setEnteredListAtUnixNano", value) +} + +// setEnteredListAtUnixNano indicates an expected call of setEnteredListAtUnixNano +func (mr *MockdatabaseBlockMockRecorder) setEnteredListAtUnixNano(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "setEnteredListAtUnixNano", reflect.TypeOf((*MockdatabaseBlock)(nil).setEnteredListAtUnixNano), value) +} + +// wiredListEntry mocks base method +func (m *MockdatabaseBlock) wiredListEntry() wiredListEntry { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "wiredListEntry") + ret0, _ := ret[0].(wiredListEntry) + return ret0 +} + +// wiredListEntry indicates an expected call of wiredListEntry +func (mr *MockdatabaseBlockMockRecorder) wiredListEntry() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "wiredListEntry", reflect.TypeOf((*MockdatabaseBlock)(nil).wiredListEntry)) +} + +// MockOnEvictedFromWiredList is a mock of OnEvictedFromWiredList interface +type MockOnEvictedFromWiredList struct { + ctrl *gomock.Controller + recorder *MockOnEvictedFromWiredListMockRecorder +} + +// MockOnEvictedFromWiredListMockRecorder is the mock recorder for MockOnEvictedFromWiredList +type MockOnEvictedFromWiredListMockRecorder struct { + mock *MockOnEvictedFromWiredList +} + +// NewMockOnEvictedFromWiredList creates a new mock instance +func NewMockOnEvictedFromWiredList(ctrl *gomock.Controller) *MockOnEvictedFromWiredList { + mock := &MockOnEvictedFromWiredList{ctrl: ctrl} + mock.recorder = &MockOnEvictedFromWiredListMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOnEvictedFromWiredList) EXPECT() *MockOnEvictedFromWiredListMockRecorder { + return m.recorder +} + +// OnEvictedFromWiredList mocks base method +func (m *MockOnEvictedFromWiredList) OnEvictedFromWiredList(id ident.ID, blockStart time.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnEvictedFromWiredList", id, blockStart) +} + +// OnEvictedFromWiredList indicates an expected call of OnEvictedFromWiredList +func (mr *MockOnEvictedFromWiredListMockRecorder) OnEvictedFromWiredList(id, blockStart interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnEvictedFromWiredList", reflect.TypeOf((*MockOnEvictedFromWiredList)(nil).OnEvictedFromWiredList), id, blockStart) +} + +// MockOnRetrieveBlock is a mock of OnRetrieveBlock interface +type MockOnRetrieveBlock struct { + ctrl *gomock.Controller + recorder *MockOnRetrieveBlockMockRecorder +} + +// MockOnRetrieveBlockMockRecorder is the mock recorder for MockOnRetrieveBlock +type MockOnRetrieveBlockMockRecorder struct { + mock *MockOnRetrieveBlock +} + +// NewMockOnRetrieveBlock creates a new mock instance +func NewMockOnRetrieveBlock(ctrl *gomock.Controller) *MockOnRetrieveBlock { + mock := &MockOnRetrieveBlock{ctrl: ctrl} + mock.recorder = &MockOnRetrieveBlockMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOnRetrieveBlock) EXPECT() *MockOnRetrieveBlockMockRecorder { + return m.recorder +} + +// OnRetrieveBlock mocks base method +func (m *MockOnRetrieveBlock) OnRetrieveBlock(id ident.ID, tags ident.TagIterator, startTime time.Time, segment ts.Segment, nsCtx namespace.Context) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnRetrieveBlock", id, tags, startTime, segment, nsCtx) +} + +// OnRetrieveBlock indicates an expected call of OnRetrieveBlock +func (mr *MockOnRetrieveBlockMockRecorder) OnRetrieveBlock(id, tags, startTime, segment, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnRetrieveBlock", reflect.TypeOf((*MockOnRetrieveBlock)(nil).OnRetrieveBlock), id, tags, startTime, segment, nsCtx) +} + +// MockOnReadBlock is a mock of OnReadBlock interface +type MockOnReadBlock struct { + ctrl *gomock.Controller + recorder *MockOnReadBlockMockRecorder +} + +// MockOnReadBlockMockRecorder is the mock recorder for MockOnReadBlock +type MockOnReadBlockMockRecorder struct { + mock *MockOnReadBlock +} + +// NewMockOnReadBlock creates a new mock instance +func NewMockOnReadBlock(ctrl *gomock.Controller) *MockOnReadBlock { + mock := &MockOnReadBlock{ctrl: ctrl} + mock.recorder = &MockOnReadBlockMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOnReadBlock) EXPECT() *MockOnReadBlockMockRecorder { + return m.recorder +} + +// OnReadBlock mocks base method +func (m *MockOnReadBlock) OnReadBlock(b DatabaseBlock) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnReadBlock", b) +} + +// OnReadBlock indicates an expected call of OnReadBlock +func (mr *MockOnReadBlockMockRecorder) OnReadBlock(b interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnReadBlock", reflect.TypeOf((*MockOnReadBlock)(nil).OnReadBlock), b) +} + +// MockDatabaseBlockRetriever is a mock of DatabaseBlockRetriever interface +type MockDatabaseBlockRetriever struct { + ctrl *gomock.Controller + recorder *MockDatabaseBlockRetrieverMockRecorder +} + +// MockDatabaseBlockRetrieverMockRecorder is the mock recorder for MockDatabaseBlockRetriever +type MockDatabaseBlockRetrieverMockRecorder struct { + mock *MockDatabaseBlockRetriever +} + +// NewMockDatabaseBlockRetriever creates a new mock instance +func NewMockDatabaseBlockRetriever(ctrl *gomock.Controller) *MockDatabaseBlockRetriever { + mock := &MockDatabaseBlockRetriever{ctrl: ctrl} + mock.recorder = &MockDatabaseBlockRetrieverMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDatabaseBlockRetriever) EXPECT() *MockDatabaseBlockRetrieverMockRecorder { + return m.recorder +} + +// CacheShardIndices mocks base method +func (m *MockDatabaseBlockRetriever) CacheShardIndices(shards []uint32) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CacheShardIndices", shards) + ret0, _ := ret[0].(error) + return ret0 +} + +// CacheShardIndices indicates an expected call of CacheShardIndices +func (mr *MockDatabaseBlockRetrieverMockRecorder) CacheShardIndices(shards interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CacheShardIndices", reflect.TypeOf((*MockDatabaseBlockRetriever)(nil).CacheShardIndices), shards) +} + +// Stream mocks base method +func (m *MockDatabaseBlockRetriever) Stream(ctx context.Context, shard uint32, id ident.ID, blockStart time.Time, onRetrieve OnRetrieveBlock, nsCtx namespace.Context) (xio.BlockReader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stream", ctx, shard, id, blockStart, onRetrieve, nsCtx) + ret0, _ := ret[0].(xio.BlockReader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Stream indicates an expected call of Stream +func (mr *MockDatabaseBlockRetrieverMockRecorder) Stream(ctx, shard, id, blockStart, onRetrieve, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stream", reflect.TypeOf((*MockDatabaseBlockRetriever)(nil).Stream), ctx, shard, id, blockStart, onRetrieve, nsCtx) +} + +// AssignShardSet mocks base method +func (m *MockDatabaseBlockRetriever) AssignShardSet(shardSet sharding.ShardSet) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "AssignShardSet", shardSet) +} + +// AssignShardSet indicates an expected call of AssignShardSet +func (mr *MockDatabaseBlockRetrieverMockRecorder) AssignShardSet(shardSet interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AssignShardSet", reflect.TypeOf((*MockDatabaseBlockRetriever)(nil).AssignShardSet), shardSet) +} + +// MockDatabaseShardBlockRetriever is a mock of DatabaseShardBlockRetriever interface +type MockDatabaseShardBlockRetriever struct { + ctrl *gomock.Controller + recorder *MockDatabaseShardBlockRetrieverMockRecorder +} + +// MockDatabaseShardBlockRetrieverMockRecorder is the mock recorder for MockDatabaseShardBlockRetriever +type MockDatabaseShardBlockRetrieverMockRecorder struct { + mock *MockDatabaseShardBlockRetriever +} + +// NewMockDatabaseShardBlockRetriever creates a new mock instance +func NewMockDatabaseShardBlockRetriever(ctrl *gomock.Controller) *MockDatabaseShardBlockRetriever { + mock := &MockDatabaseShardBlockRetriever{ctrl: ctrl} + mock.recorder = &MockDatabaseShardBlockRetrieverMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDatabaseShardBlockRetriever) EXPECT() *MockDatabaseShardBlockRetrieverMockRecorder { + return m.recorder +} + +// Stream mocks base method +func (m *MockDatabaseShardBlockRetriever) Stream(ctx context.Context, id ident.ID, blockStart time.Time, onRetrieve OnRetrieveBlock, nsCtx namespace.Context) (xio.BlockReader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stream", ctx, id, blockStart, onRetrieve, nsCtx) + ret0, _ := ret[0].(xio.BlockReader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Stream indicates an expected call of Stream +func (mr *MockDatabaseShardBlockRetrieverMockRecorder) Stream(ctx, id, blockStart, onRetrieve, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stream", reflect.TypeOf((*MockDatabaseShardBlockRetriever)(nil).Stream), ctx, id, blockStart, onRetrieve, nsCtx) +} + +// MockDatabaseBlockRetrieverManager is a mock of DatabaseBlockRetrieverManager interface +type MockDatabaseBlockRetrieverManager struct { + ctrl *gomock.Controller + recorder *MockDatabaseBlockRetrieverManagerMockRecorder +} + +// MockDatabaseBlockRetrieverManagerMockRecorder is the mock recorder for MockDatabaseBlockRetrieverManager +type MockDatabaseBlockRetrieverManagerMockRecorder struct { + mock *MockDatabaseBlockRetrieverManager +} + +// NewMockDatabaseBlockRetrieverManager creates a new mock instance +func NewMockDatabaseBlockRetrieverManager(ctrl *gomock.Controller) *MockDatabaseBlockRetrieverManager { + mock := &MockDatabaseBlockRetrieverManager{ctrl: ctrl} + mock.recorder = &MockDatabaseBlockRetrieverManagerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDatabaseBlockRetrieverManager) EXPECT() *MockDatabaseBlockRetrieverManagerMockRecorder { + return m.recorder +} + +// Retriever mocks base method +func (m *MockDatabaseBlockRetrieverManager) Retriever(nsMetadata namespace.Metadata, shardSet sharding.ShardSet) (DatabaseBlockRetriever, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Retriever", nsMetadata, shardSet) + ret0, _ := ret[0].(DatabaseBlockRetriever) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Retriever indicates an expected call of Retriever +func (mr *MockDatabaseBlockRetrieverManagerMockRecorder) Retriever(nsMetadata, shardSet interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Retriever", reflect.TypeOf((*MockDatabaseBlockRetrieverManager)(nil).Retriever), nsMetadata, shardSet) +} + +// MockDatabaseShardBlockRetrieverManager is a mock of DatabaseShardBlockRetrieverManager interface +type MockDatabaseShardBlockRetrieverManager struct { + ctrl *gomock.Controller + recorder *MockDatabaseShardBlockRetrieverManagerMockRecorder +} + +// MockDatabaseShardBlockRetrieverManagerMockRecorder is the mock recorder for MockDatabaseShardBlockRetrieverManager +type MockDatabaseShardBlockRetrieverManagerMockRecorder struct { + mock *MockDatabaseShardBlockRetrieverManager +} + +// NewMockDatabaseShardBlockRetrieverManager creates a new mock instance +func NewMockDatabaseShardBlockRetrieverManager(ctrl *gomock.Controller) *MockDatabaseShardBlockRetrieverManager { + mock := &MockDatabaseShardBlockRetrieverManager{ctrl: ctrl} + mock.recorder = &MockDatabaseShardBlockRetrieverManagerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDatabaseShardBlockRetrieverManager) EXPECT() *MockDatabaseShardBlockRetrieverManagerMockRecorder { + return m.recorder +} + +// ShardRetriever mocks base method +func (m *MockDatabaseShardBlockRetrieverManager) ShardRetriever(shard uint32) DatabaseShardBlockRetriever { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardRetriever", shard) + ret0, _ := ret[0].(DatabaseShardBlockRetriever) + return ret0 +} + +// ShardRetriever indicates an expected call of ShardRetriever +func (mr *MockDatabaseShardBlockRetrieverManagerMockRecorder) ShardRetriever(shard interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardRetriever", reflect.TypeOf((*MockDatabaseShardBlockRetrieverManager)(nil).ShardRetriever), shard) +} + +// MockDatabaseSeriesBlocks is a mock of DatabaseSeriesBlocks interface +type MockDatabaseSeriesBlocks struct { + ctrl *gomock.Controller + recorder *MockDatabaseSeriesBlocksMockRecorder +} + +// MockDatabaseSeriesBlocksMockRecorder is the mock recorder for MockDatabaseSeriesBlocks +type MockDatabaseSeriesBlocksMockRecorder struct { + mock *MockDatabaseSeriesBlocks +} + +// NewMockDatabaseSeriesBlocks creates a new mock instance +func NewMockDatabaseSeriesBlocks(ctrl *gomock.Controller) *MockDatabaseSeriesBlocks { + mock := &MockDatabaseSeriesBlocks{ctrl: ctrl} + mock.recorder = &MockDatabaseSeriesBlocksMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDatabaseSeriesBlocks) EXPECT() *MockDatabaseSeriesBlocksMockRecorder { + return m.recorder +} + +// Len mocks base method +func (m *MockDatabaseSeriesBlocks) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockDatabaseSeriesBlocksMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).Len)) +} + +// AddBlock mocks base method +func (m *MockDatabaseSeriesBlocks) AddBlock(block DatabaseBlock) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "AddBlock", block) +} + +// AddBlock indicates an expected call of AddBlock +func (mr *MockDatabaseSeriesBlocksMockRecorder) AddBlock(block interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddBlock", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).AddBlock), block) +} + +// AddSeries mocks base method +func (m *MockDatabaseSeriesBlocks) AddSeries(other DatabaseSeriesBlocks) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "AddSeries", other) +} + +// AddSeries indicates an expected call of AddSeries +func (mr *MockDatabaseSeriesBlocksMockRecorder) AddSeries(other interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddSeries", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).AddSeries), other) +} + +// MinTime mocks base method +func (m *MockDatabaseSeriesBlocks) MinTime() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinTime") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// MinTime indicates an expected call of MinTime +func (mr *MockDatabaseSeriesBlocksMockRecorder) MinTime() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinTime", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).MinTime)) +} + +// MaxTime mocks base method +func (m *MockDatabaseSeriesBlocks) MaxTime() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MaxTime") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// MaxTime indicates an expected call of MaxTime +func (mr *MockDatabaseSeriesBlocksMockRecorder) MaxTime() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MaxTime", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).MaxTime)) +} + +// BlockAt mocks base method +func (m *MockDatabaseSeriesBlocks) BlockAt(t time.Time) (DatabaseBlock, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockAt", t) + ret0, _ := ret[0].(DatabaseBlock) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// BlockAt indicates an expected call of BlockAt +func (mr *MockDatabaseSeriesBlocksMockRecorder) BlockAt(t interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockAt", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).BlockAt), t) +} + +// AllBlocks mocks base method +func (m *MockDatabaseSeriesBlocks) AllBlocks() map[time0.UnixNano]DatabaseBlock { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllBlocks") + ret0, _ := ret[0].(map[time0.UnixNano]DatabaseBlock) + return ret0 +} + +// AllBlocks indicates an expected call of AllBlocks +func (mr *MockDatabaseSeriesBlocksMockRecorder) AllBlocks() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllBlocks", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).AllBlocks)) +} + +// RemoveBlockAt mocks base method +func (m *MockDatabaseSeriesBlocks) RemoveBlockAt(t time.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RemoveBlockAt", t) +} + +// RemoveBlockAt indicates an expected call of RemoveBlockAt +func (mr *MockDatabaseSeriesBlocksMockRecorder) RemoveBlockAt(t interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveBlockAt", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).RemoveBlockAt), t) +} + +// RemoveAll mocks base method +func (m *MockDatabaseSeriesBlocks) RemoveAll() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RemoveAll") +} + +// RemoveAll indicates an expected call of RemoveAll +func (mr *MockDatabaseSeriesBlocksMockRecorder) RemoveAll() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveAll", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).RemoveAll)) +} + +// Reset mocks base method +func (m *MockDatabaseSeriesBlocks) Reset() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset") +} + +// Reset indicates an expected call of Reset +func (mr *MockDatabaseSeriesBlocksMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).Reset)) +} + +// Close mocks base method +func (m *MockDatabaseSeriesBlocks) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockDatabaseSeriesBlocksMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockDatabaseSeriesBlocks)(nil).Close)) +} + +// MockDatabaseBlockPool is a mock of DatabaseBlockPool interface +type MockDatabaseBlockPool struct { + ctrl *gomock.Controller + recorder *MockDatabaseBlockPoolMockRecorder +} + +// MockDatabaseBlockPoolMockRecorder is the mock recorder for MockDatabaseBlockPool +type MockDatabaseBlockPoolMockRecorder struct { + mock *MockDatabaseBlockPool +} + +// NewMockDatabaseBlockPool creates a new mock instance +func NewMockDatabaseBlockPool(ctrl *gomock.Controller) *MockDatabaseBlockPool { + mock := &MockDatabaseBlockPool{ctrl: ctrl} + mock.recorder = &MockDatabaseBlockPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDatabaseBlockPool) EXPECT() *MockDatabaseBlockPoolMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockDatabaseBlockPool) Init(alloc DatabaseBlockAllocate) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init", alloc) +} + +// Init indicates an expected call of Init +func (mr *MockDatabaseBlockPoolMockRecorder) Init(alloc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockDatabaseBlockPool)(nil).Init), alloc) +} + +// Get mocks base method +func (m *MockDatabaseBlockPool) Get() DatabaseBlock { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(DatabaseBlock) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockDatabaseBlockPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockDatabaseBlockPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockDatabaseBlockPool) Put(block DatabaseBlock) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", block) +} + +// Put indicates an expected call of Put +func (mr *MockDatabaseBlockPoolMockRecorder) Put(block interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockDatabaseBlockPool)(nil).Put), block) +} + +// MockFetchBlockMetadataResultsPool is a mock of FetchBlockMetadataResultsPool interface +type MockFetchBlockMetadataResultsPool struct { + ctrl *gomock.Controller + recorder *MockFetchBlockMetadataResultsPoolMockRecorder +} + +// MockFetchBlockMetadataResultsPoolMockRecorder is the mock recorder for MockFetchBlockMetadataResultsPool +type MockFetchBlockMetadataResultsPoolMockRecorder struct { + mock *MockFetchBlockMetadataResultsPool +} + +// NewMockFetchBlockMetadataResultsPool creates a new mock instance +func NewMockFetchBlockMetadataResultsPool(ctrl *gomock.Controller) *MockFetchBlockMetadataResultsPool { + mock := &MockFetchBlockMetadataResultsPool{ctrl: ctrl} + mock.recorder = &MockFetchBlockMetadataResultsPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFetchBlockMetadataResultsPool) EXPECT() *MockFetchBlockMetadataResultsPoolMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockFetchBlockMetadataResultsPool) Get() FetchBlockMetadataResults { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(FetchBlockMetadataResults) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockFetchBlockMetadataResultsPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockFetchBlockMetadataResultsPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockFetchBlockMetadataResultsPool) Put(res FetchBlockMetadataResults) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", res) +} + +// Put indicates an expected call of Put +func (mr *MockFetchBlockMetadataResultsPoolMockRecorder) Put(res interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockFetchBlockMetadataResultsPool)(nil).Put), res) +} + +// MockFetchBlocksMetadataResultsPool is a mock of FetchBlocksMetadataResultsPool interface +type MockFetchBlocksMetadataResultsPool struct { + ctrl *gomock.Controller + recorder *MockFetchBlocksMetadataResultsPoolMockRecorder +} + +// MockFetchBlocksMetadataResultsPoolMockRecorder is the mock recorder for MockFetchBlocksMetadataResultsPool +type MockFetchBlocksMetadataResultsPoolMockRecorder struct { + mock *MockFetchBlocksMetadataResultsPool +} + +// NewMockFetchBlocksMetadataResultsPool creates a new mock instance +func NewMockFetchBlocksMetadataResultsPool(ctrl *gomock.Controller) *MockFetchBlocksMetadataResultsPool { + mock := &MockFetchBlocksMetadataResultsPool{ctrl: ctrl} + mock.recorder = &MockFetchBlocksMetadataResultsPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFetchBlocksMetadataResultsPool) EXPECT() *MockFetchBlocksMetadataResultsPoolMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockFetchBlocksMetadataResultsPool) Get() FetchBlocksMetadataResults { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(FetchBlocksMetadataResults) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockFetchBlocksMetadataResultsPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockFetchBlocksMetadataResultsPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockFetchBlocksMetadataResultsPool) Put(res FetchBlocksMetadataResults) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", res) +} + +// Put indicates an expected call of Put +func (mr *MockFetchBlocksMetadataResultsPoolMockRecorder) Put(res interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockFetchBlocksMetadataResultsPool)(nil).Put), res) +} + +// MockLeaseManager is a mock of LeaseManager interface +type MockLeaseManager struct { + ctrl *gomock.Controller + recorder *MockLeaseManagerMockRecorder +} + +// MockLeaseManagerMockRecorder is the mock recorder for MockLeaseManager +type MockLeaseManagerMockRecorder struct { + mock *MockLeaseManager +} + +// NewMockLeaseManager creates a new mock instance +func NewMockLeaseManager(ctrl *gomock.Controller) *MockLeaseManager { + mock := &MockLeaseManager{ctrl: ctrl} + mock.recorder = &MockLeaseManagerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockLeaseManager) EXPECT() *MockLeaseManagerMockRecorder { + return m.recorder +} + +// RegisterLeaser mocks base method +func (m *MockLeaseManager) RegisterLeaser(leaser Leaser) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RegisterLeaser", leaser) + ret0, _ := ret[0].(error) + return ret0 +} + +// RegisterLeaser indicates an expected call of RegisterLeaser +func (mr *MockLeaseManagerMockRecorder) RegisterLeaser(leaser interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterLeaser", reflect.TypeOf((*MockLeaseManager)(nil).RegisterLeaser), leaser) +} + +// UnregisterLeaser mocks base method +func (m *MockLeaseManager) UnregisterLeaser(leaser Leaser) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UnregisterLeaser", leaser) + ret0, _ := ret[0].(error) + return ret0 +} + +// UnregisterLeaser indicates an expected call of UnregisterLeaser +func (mr *MockLeaseManagerMockRecorder) UnregisterLeaser(leaser interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnregisterLeaser", reflect.TypeOf((*MockLeaseManager)(nil).UnregisterLeaser), leaser) +} + +// OpenLease mocks base method +func (m *MockLeaseManager) OpenLease(leaser Leaser, descriptor LeaseDescriptor, state LeaseState) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OpenLease", leaser, descriptor, state) + ret0, _ := ret[0].(error) + return ret0 +} + +// OpenLease indicates an expected call of OpenLease +func (mr *MockLeaseManagerMockRecorder) OpenLease(leaser, descriptor, state interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenLease", reflect.TypeOf((*MockLeaseManager)(nil).OpenLease), leaser, descriptor, state) +} + +// OpenLatestLease mocks base method +func (m *MockLeaseManager) OpenLatestLease(leaser Leaser, descriptor LeaseDescriptor) (LeaseState, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OpenLatestLease", leaser, descriptor) + ret0, _ := ret[0].(LeaseState) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// OpenLatestLease indicates an expected call of OpenLatestLease +func (mr *MockLeaseManagerMockRecorder) OpenLatestLease(leaser, descriptor interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenLatestLease", reflect.TypeOf((*MockLeaseManager)(nil).OpenLatestLease), leaser, descriptor) +} + +// UpdateOpenLeases mocks base method +func (m *MockLeaseManager) UpdateOpenLeases(descriptor LeaseDescriptor, state LeaseState) (UpdateLeasesResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateOpenLeases", descriptor, state) + ret0, _ := ret[0].(UpdateLeasesResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateOpenLeases indicates an expected call of UpdateOpenLeases +func (mr *MockLeaseManagerMockRecorder) UpdateOpenLeases(descriptor, state interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateOpenLeases", reflect.TypeOf((*MockLeaseManager)(nil).UpdateOpenLeases), descriptor, state) +} + +// SetLeaseVerifier mocks base method +func (m *MockLeaseManager) SetLeaseVerifier(leaseVerifier LeaseVerifier) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetLeaseVerifier", leaseVerifier) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetLeaseVerifier indicates an expected call of SetLeaseVerifier +func (mr *MockLeaseManagerMockRecorder) SetLeaseVerifier(leaseVerifier interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLeaseVerifier", reflect.TypeOf((*MockLeaseManager)(nil).SetLeaseVerifier), leaseVerifier) +} + +// MockLeaseVerifier is a mock of LeaseVerifier interface +type MockLeaseVerifier struct { + ctrl *gomock.Controller + recorder *MockLeaseVerifierMockRecorder +} + +// MockLeaseVerifierMockRecorder is the mock recorder for MockLeaseVerifier +type MockLeaseVerifierMockRecorder struct { + mock *MockLeaseVerifier +} + +// NewMockLeaseVerifier creates a new mock instance +func NewMockLeaseVerifier(ctrl *gomock.Controller) *MockLeaseVerifier { + mock := &MockLeaseVerifier{ctrl: ctrl} + mock.recorder = &MockLeaseVerifierMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockLeaseVerifier) EXPECT() *MockLeaseVerifierMockRecorder { + return m.recorder +} + +// VerifyLease mocks base method +func (m *MockLeaseVerifier) VerifyLease(descriptor LeaseDescriptor, state LeaseState) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "VerifyLease", descriptor, state) + ret0, _ := ret[0].(error) + return ret0 +} + +// VerifyLease indicates an expected call of VerifyLease +func (mr *MockLeaseVerifierMockRecorder) VerifyLease(descriptor, state interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "VerifyLease", reflect.TypeOf((*MockLeaseVerifier)(nil).VerifyLease), descriptor, state) +} + +// LatestState mocks base method +func (m *MockLeaseVerifier) LatestState(descriptor LeaseDescriptor) (LeaseState, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LatestState", descriptor) + ret0, _ := ret[0].(LeaseState) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// LatestState indicates an expected call of LatestState +func (mr *MockLeaseVerifierMockRecorder) LatestState(descriptor interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LatestState", reflect.TypeOf((*MockLeaseVerifier)(nil).LatestState), descriptor) +} + +// MockLeaser is a mock of Leaser interface +type MockLeaser struct { + ctrl *gomock.Controller + recorder *MockLeaserMockRecorder +} + +// MockLeaserMockRecorder is the mock recorder for MockLeaser +type MockLeaserMockRecorder struct { + mock *MockLeaser +} + +// NewMockLeaser creates a new mock instance +func NewMockLeaser(ctrl *gomock.Controller) *MockLeaser { + mock := &MockLeaser{ctrl: ctrl} + mock.recorder = &MockLeaserMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockLeaser) EXPECT() *MockLeaserMockRecorder { + return m.recorder +} + +// UpdateOpenLease mocks base method +func (m *MockLeaser) UpdateOpenLease(descriptor LeaseDescriptor, state LeaseState) (UpdateOpenLeaseResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateOpenLease", descriptor, state) + ret0, _ := ret[0].(UpdateOpenLeaseResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateOpenLease indicates an expected call of UpdateOpenLease +func (mr *MockLeaserMockRecorder) UpdateOpenLease(descriptor, state interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateOpenLease", reflect.TypeOf((*MockLeaser)(nil).UpdateOpenLease), descriptor, state) +} + +// MockOptions is a mock of Options interface +type MockOptions struct { + ctrl *gomock.Controller + recorder *MockOptionsMockRecorder +} + +// MockOptionsMockRecorder is the mock recorder for MockOptions +type MockOptionsMockRecorder struct { + mock *MockOptions +} + +// NewMockOptions creates a new mock instance +func NewMockOptions(ctrl *gomock.Controller) *MockOptions { + mock := &MockOptions{ctrl: ctrl} + mock.recorder = &MockOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptions) EXPECT() *MockOptionsMockRecorder { + return m.recorder +} + +// SetClockOptions mocks base method +func (m *MockOptions) SetClockOptions(value clock.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClockOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClockOptions indicates an expected call of SetClockOptions +func (mr *MockOptionsMockRecorder) SetClockOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClockOptions", reflect.TypeOf((*MockOptions)(nil).SetClockOptions), value) +} + +// ClockOptions mocks base method +func (m *MockOptions) ClockOptions() clock.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClockOptions") + ret0, _ := ret[0].(clock.Options) + return ret0 +} + +// ClockOptions indicates an expected call of ClockOptions +func (mr *MockOptionsMockRecorder) ClockOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClockOptions", reflect.TypeOf((*MockOptions)(nil).ClockOptions)) +} + +// SetDatabaseBlockAllocSize mocks base method +func (m *MockOptions) SetDatabaseBlockAllocSize(value int) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetDatabaseBlockAllocSize", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetDatabaseBlockAllocSize indicates an expected call of SetDatabaseBlockAllocSize +func (mr *MockOptionsMockRecorder) SetDatabaseBlockAllocSize(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDatabaseBlockAllocSize", reflect.TypeOf((*MockOptions)(nil).SetDatabaseBlockAllocSize), value) +} + +// DatabaseBlockAllocSize mocks base method +func (m *MockOptions) DatabaseBlockAllocSize() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DatabaseBlockAllocSize") + ret0, _ := ret[0].(int) + return ret0 +} + +// DatabaseBlockAllocSize indicates an expected call of DatabaseBlockAllocSize +func (mr *MockOptionsMockRecorder) DatabaseBlockAllocSize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DatabaseBlockAllocSize", reflect.TypeOf((*MockOptions)(nil).DatabaseBlockAllocSize)) +} + +// SetCloseContextWorkers mocks base method +func (m *MockOptions) SetCloseContextWorkers(value sync.WorkerPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCloseContextWorkers", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetCloseContextWorkers indicates an expected call of SetCloseContextWorkers +func (mr *MockOptionsMockRecorder) SetCloseContextWorkers(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCloseContextWorkers", reflect.TypeOf((*MockOptions)(nil).SetCloseContextWorkers), value) +} + +// CloseContextWorkers mocks base method +func (m *MockOptions) CloseContextWorkers() sync.WorkerPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseContextWorkers") + ret0, _ := ret[0].(sync.WorkerPool) + return ret0 +} + +// CloseContextWorkers indicates an expected call of CloseContextWorkers +func (mr *MockOptionsMockRecorder) CloseContextWorkers() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseContextWorkers", reflect.TypeOf((*MockOptions)(nil).CloseContextWorkers)) +} + +// SetDatabaseBlockPool mocks base method +func (m *MockOptions) SetDatabaseBlockPool(value DatabaseBlockPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetDatabaseBlockPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetDatabaseBlockPool indicates an expected call of SetDatabaseBlockPool +func (mr *MockOptionsMockRecorder) SetDatabaseBlockPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDatabaseBlockPool", reflect.TypeOf((*MockOptions)(nil).SetDatabaseBlockPool), value) +} + +// DatabaseBlockPool mocks base method +func (m *MockOptions) DatabaseBlockPool() DatabaseBlockPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DatabaseBlockPool") + ret0, _ := ret[0].(DatabaseBlockPool) + return ret0 +} + +// DatabaseBlockPool indicates an expected call of DatabaseBlockPool +func (mr *MockOptionsMockRecorder) DatabaseBlockPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DatabaseBlockPool", reflect.TypeOf((*MockOptions)(nil).DatabaseBlockPool)) +} + +// SetContextPool mocks base method +func (m *MockOptions) SetContextPool(value context.Pool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetContextPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetContextPool indicates an expected call of SetContextPool +func (mr *MockOptionsMockRecorder) SetContextPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetContextPool", reflect.TypeOf((*MockOptions)(nil).SetContextPool), value) +} + +// ContextPool mocks base method +func (m *MockOptions) ContextPool() context.Pool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContextPool") + ret0, _ := ret[0].(context.Pool) + return ret0 +} + +// ContextPool indicates an expected call of ContextPool +func (mr *MockOptionsMockRecorder) ContextPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContextPool", reflect.TypeOf((*MockOptions)(nil).ContextPool)) +} + +// SetEncoderPool mocks base method +func (m *MockOptions) SetEncoderPool(value encoding.EncoderPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetEncoderPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetEncoderPool indicates an expected call of SetEncoderPool +func (mr *MockOptionsMockRecorder) SetEncoderPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetEncoderPool", reflect.TypeOf((*MockOptions)(nil).SetEncoderPool), value) +} + +// EncoderPool mocks base method +func (m *MockOptions) EncoderPool() encoding.EncoderPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "EncoderPool") + ret0, _ := ret[0].(encoding.EncoderPool) + return ret0 +} + +// EncoderPool indicates an expected call of EncoderPool +func (mr *MockOptionsMockRecorder) EncoderPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EncoderPool", reflect.TypeOf((*MockOptions)(nil).EncoderPool)) +} + +// SetReaderIteratorPool mocks base method +func (m *MockOptions) SetReaderIteratorPool(value encoding.ReaderIteratorPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReaderIteratorPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetReaderIteratorPool indicates an expected call of SetReaderIteratorPool +func (mr *MockOptionsMockRecorder) SetReaderIteratorPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReaderIteratorPool", reflect.TypeOf((*MockOptions)(nil).SetReaderIteratorPool), value) +} + +// ReaderIteratorPool mocks base method +func (m *MockOptions) ReaderIteratorPool() encoding.ReaderIteratorPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReaderIteratorPool") + ret0, _ := ret[0].(encoding.ReaderIteratorPool) + return ret0 +} + +// ReaderIteratorPool indicates an expected call of ReaderIteratorPool +func (mr *MockOptionsMockRecorder) ReaderIteratorPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReaderIteratorPool", reflect.TypeOf((*MockOptions)(nil).ReaderIteratorPool)) +} + +// SetMultiReaderIteratorPool mocks base method +func (m *MockOptions) SetMultiReaderIteratorPool(value encoding.MultiReaderIteratorPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMultiReaderIteratorPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetMultiReaderIteratorPool indicates an expected call of SetMultiReaderIteratorPool +func (mr *MockOptionsMockRecorder) SetMultiReaderIteratorPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMultiReaderIteratorPool", reflect.TypeOf((*MockOptions)(nil).SetMultiReaderIteratorPool), value) +} + +// MultiReaderIteratorPool mocks base method +func (m *MockOptions) MultiReaderIteratorPool() encoding.MultiReaderIteratorPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MultiReaderIteratorPool") + ret0, _ := ret[0].(encoding.MultiReaderIteratorPool) + return ret0 +} + +// MultiReaderIteratorPool indicates an expected call of MultiReaderIteratorPool +func (mr *MockOptionsMockRecorder) MultiReaderIteratorPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MultiReaderIteratorPool", reflect.TypeOf((*MockOptions)(nil).MultiReaderIteratorPool)) +} + +// SetSegmentReaderPool mocks base method +func (m *MockOptions) SetSegmentReaderPool(value xio.SegmentReaderPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSegmentReaderPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetSegmentReaderPool indicates an expected call of SetSegmentReaderPool +func (mr *MockOptionsMockRecorder) SetSegmentReaderPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSegmentReaderPool", reflect.TypeOf((*MockOptions)(nil).SetSegmentReaderPool), value) +} + +// SegmentReaderPool mocks base method +func (m *MockOptions) SegmentReaderPool() xio.SegmentReaderPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentReaderPool") + ret0, _ := ret[0].(xio.SegmentReaderPool) + return ret0 +} + +// SegmentReaderPool indicates an expected call of SegmentReaderPool +func (mr *MockOptionsMockRecorder) SegmentReaderPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentReaderPool", reflect.TypeOf((*MockOptions)(nil).SegmentReaderPool)) +} + +// SetBytesPool mocks base method +func (m *MockOptions) SetBytesPool(value pool.CheckedBytesPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBytesPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBytesPool indicates an expected call of SetBytesPool +func (mr *MockOptionsMockRecorder) SetBytesPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBytesPool", reflect.TypeOf((*MockOptions)(nil).SetBytesPool), value) +} + +// BytesPool mocks base method +func (m *MockOptions) BytesPool() pool.CheckedBytesPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BytesPool") + ret0, _ := ret[0].(pool.CheckedBytesPool) + return ret0 +} + +// BytesPool indicates an expected call of BytesPool +func (mr *MockOptionsMockRecorder) BytesPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BytesPool", reflect.TypeOf((*MockOptions)(nil).BytesPool)) +} + +// SetWiredList mocks base method +func (m *MockOptions) SetWiredList(value *WiredList) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetWiredList", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetWiredList indicates an expected call of SetWiredList +func (mr *MockOptionsMockRecorder) SetWiredList(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWiredList", reflect.TypeOf((*MockOptions)(nil).SetWiredList), value) +} + +// WiredList mocks base method +func (m *MockOptions) WiredList() *WiredList { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WiredList") + ret0, _ := ret[0].(*WiredList) + return ret0 +} + +// WiredList indicates an expected call of WiredList +func (mr *MockOptionsMockRecorder) WiredList() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WiredList", reflect.TypeOf((*MockOptions)(nil).WiredList)) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/block_pool.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/block_pool.go new file mode 100644 index 00000000..2d82733b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/block_pool.go @@ -0,0 +1,48 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "github.com/m3db/m3/src/x/pool" +) + +type databaseBlockPool struct { + pool pool.ObjectPool +} + +// NewDatabaseBlockPool creates a new pool for database blocks. +func NewDatabaseBlockPool(opts pool.ObjectPoolOptions) DatabaseBlockPool { + return &databaseBlockPool{pool: pool.NewObjectPool(opts)} +} + +func (p *databaseBlockPool) Init(alloc DatabaseBlockAllocate) { + p.pool.Init(func() interface{} { + return alloc() + }) +} + +func (p *databaseBlockPool) Get() DatabaseBlock { + return p.pool.Get().(DatabaseBlock) +} + +func (p *databaseBlockPool) Put(block DatabaseBlock) { + p.pool.Put(block) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/lease.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/lease.go new file mode 100644 index 00000000..773ebb69 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/lease.go @@ -0,0 +1,212 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "errors" + "fmt" + "sync" + "time" +) + +var ( + errLeaserAlreadyRegistered = errors.New("leaser already registered") + errLeaserNotRegistered = errors.New("leaser not registered") + errOpenLeaseVerifierNotSet = errors.New("cannot open leases while verifier is not set") + errUpdateOpenLeasesVerifierNotSet = errors.New("cannot update open leases while verifier is not set") + errConcurrentUpdateOpenLeases = errors.New("cannot call updateOpenLeases() concurrently") +) + +type leaseManager struct { + sync.Mutex + updateOpenLeasesInProgress sync.Map + leasers []Leaser + verifier LeaseVerifier +} + +// NewLeaseManager creates a new lease manager with a provided +// lease verifier (to ensure leases are valid when made). +func NewLeaseManager(verifier LeaseVerifier) LeaseManager { + return &leaseManager{ + verifier: verifier, + } +} + +func (m *leaseManager) RegisterLeaser(leaser Leaser) error { + m.Lock() + defer m.Unlock() + + if m.isRegistered(leaser) { + return errLeaserAlreadyRegistered + } + m.leasers = append(m.leasers, leaser) + + return nil +} + +func (m *leaseManager) UnregisterLeaser(leaser Leaser) error { + m.Lock() + defer m.Unlock() + + var leasers []Leaser + for _, l := range m.leasers { + if l != leaser { + leasers = append(leasers, l) + } + } + + if len(leasers) != len(m.leasers)-1 { + return errLeaserNotRegistered + } + + m.leasers = leasers + + return nil +} + +func (m *leaseManager) OpenLease( + leaser Leaser, + descriptor LeaseDescriptor, + state LeaseState, +) error { + // NB(r): Take exclusive lock so that upgrade leases can't be called + // while we are verifying a lease (racey) + // NB(bodu): We don't use defer here since the lease verifier takes out a + // a db lock when retrieving flush states resulting in a potential deadlock. + m.Lock() + + if m.verifier == nil { + m.Unlock() + return errOpenLeaseVerifierNotSet + } + + if !m.isRegistered(leaser) { + m.Unlock() + return errLeaserNotRegistered + } + + m.Unlock() + return m.verifier.VerifyLease(descriptor, state) +} + +func (m *leaseManager) OpenLatestLease( + leaser Leaser, + descriptor LeaseDescriptor, +) (LeaseState, error) { + // NB(r): Take exclusive lock so that upgrade leases can't be called + // while we are verifying a lease (racey) + // NB(bodu): We don't use defer here since the lease verifier takes out a + // a db lock when retrieving flush states resulting in a potential deadlock. + m.Lock() + + if m.verifier == nil { + m.Unlock() + return LeaseState{}, errOpenLeaseVerifierNotSet + } + + if !m.isRegistered(leaser) { + m.Unlock() + return LeaseState{}, errLeaserNotRegistered + } + + m.Unlock() + return m.verifier.LatestState(descriptor) +} + +func (m *leaseManager) UpdateOpenLeases( + descriptor LeaseDescriptor, + state LeaseState, +) (UpdateLeasesResult, error) { + m.Lock() + if m.verifier == nil { + m.Unlock() + return UpdateLeasesResult{}, errUpdateOpenLeasesVerifierNotSet + } + // NB(rartoul): Release lock while calling UpdateOpenLease() so that + // calls to OpenLease() and OpenLatestLease() are not blocked which + // would blocks reads and could cause deadlocks if those calls were + // made while holding locks that would not allow UpdateOpenLease() to + // return before being released. + m.Unlock() + + hashableDescriptor := newHashableLeaseDescriptor(descriptor) + if _, ok := m.updateOpenLeasesInProgress.LoadOrStore(hashableDescriptor, struct{}{}); ok { + // Prevent UpdateOpenLeases() calls from happening concurrently (since the lock + // is not held for the duration) to ensure that Leaser's receive all updates + // and in the correct order. + return UpdateLeasesResult{}, errConcurrentUpdateOpenLeases + } + + defer m.updateOpenLeasesInProgress.Delete(hashableDescriptor) + + var result UpdateLeasesResult + for _, l := range m.leasers { + r, err := l.UpdateOpenLease(descriptor, state) + if err != nil { + return result, err + } + + switch r { + case UpdateOpenLease: + result.LeasersUpdatedLease++ + case NoOpenLease: + result.LeasersNoOpenLease++ + default: + return result, fmt.Errorf("unknown update open lease result: %d", r) + } + } + + return result, nil +} + +func (m *leaseManager) SetLeaseVerifier(leaseVerifier LeaseVerifier) error { + m.Lock() + defer m.Unlock() + m.verifier = leaseVerifier + return nil +} + +func (m *leaseManager) isRegistered(leaser Leaser) bool { + for _, l := range m.leasers { + if l == leaser { + return true + } + } + return false +} + +type hashableLeaseDescriptor struct { + namespace string + shard uint32 + blockStart time.Time +} + +func newHashableLeaseDescriptor(descriptor LeaseDescriptor) hashableLeaseDescriptor { + ns := "" + if descriptor.Namespace != nil { + ns = descriptor.Namespace.String() + } + return hashableLeaseDescriptor{ + namespace: ns, + shard: descriptor.Shard, + blockStart: descriptor.BlockStart, + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/lease_noop.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/lease_noop.go new file mode 100644 index 00000000..406e8b0a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/lease_noop.go @@ -0,0 +1,58 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +// NoopLeaseManager is a no-op implementation of LeaseManager. +type NoopLeaseManager struct{} + +func (n *NoopLeaseManager) RegisterLeaser(leaser Leaser) error { + return nil +} + +func (n *NoopLeaseManager) UnregisterLeaser(leaser Leaser) error { + return nil +} + +func (n *NoopLeaseManager) OpenLease( + leaser Leaser, + descriptor LeaseDescriptor, + state LeaseState, +) error { + return nil +} + +func (n *NoopLeaseManager) OpenLatestLease( + leaser Leaser, + descriptor LeaseDescriptor, +) (LeaseState, error) { + return LeaseState{}, nil +} + +func (n *NoopLeaseManager) UpdateOpenLeases( + descriptor LeaseDescriptor, + state LeaseState, +) (UpdateLeasesResult, error) { + return UpdateLeasesResult{}, nil +} + +func (n *NoopLeaseManager) SetLeaseVerifier(leaseVerifier LeaseVerifier) error { + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/merged_block_reader.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/merged_block_reader.go new file mode 100644 index 00000000..04461f26 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/merged_block_reader.go @@ -0,0 +1,246 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "fmt" + "sync" + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/pool" +) + +type dbMergedBlockReader struct { + sync.RWMutex + ctx context.Context + opts Options + blockStart time.Time + blockSize time.Duration + streams [2]mergeableStream + readers [2]xio.SegmentReader + merged xio.BlockReader + encoder encoding.Encoder + err error + nsCtx namespace.Context +} + +type mergeableStream struct { + stream xio.SegmentReader + finalize bool +} + +func (ms mergeableStream) clone(pool pool.CheckedBytesPool) (mergeableStream, error) { + stream, err := ms.stream.Clone(pool) + if err != nil { + return mergeableStream{}, err + } + return mergeableStream{ + stream: stream, + finalize: ms.finalize, + }, nil +} + +func newDatabaseMergedBlockReader( + nsCtx namespace.Context, + blockStart time.Time, + blockSize time.Duration, + streamA, streamB mergeableStream, + opts Options, +) xio.BlockReader { + r := &dbMergedBlockReader{ + ctx: opts.ContextPool().Get(), + nsCtx: nsCtx, + opts: opts, + blockStart: blockStart, + blockSize: blockSize, + } + r.streams[0] = streamA + r.streams[1] = streamB + r.readers[0] = streamA.stream + r.readers[1] = streamB.stream + return xio.BlockReader{ + SegmentReader: r, + Start: blockStart, + BlockSize: blockSize, + } +} + +func (r *dbMergedBlockReader) mergedReader() (xio.BlockReader, error) { + r.RLock() + if r.merged.IsNotEmpty() || r.err != nil { + r.RUnlock() + return r.merged, r.err + } + r.RUnlock() + + r.Lock() + defer r.Unlock() + + if r.merged.IsNotEmpty() || r.err != nil { + return r.merged, r.err + } + + multiIter := r.opts.MultiReaderIteratorPool().Get() + multiIter.Reset(r.readers[:], r.blockStart, r.blockSize, r.nsCtx.Schema) + defer multiIter.Close() + + r.encoder = r.opts.EncoderPool().Get() + r.encoder.Reset(r.blockStart, r.opts.DatabaseBlockAllocSize(), r.nsCtx.Schema) + + for multiIter.Next() { + dp, unit, annotation := multiIter.Current() + err := r.encoder.Encode(dp, unit, annotation) + if err != nil { + r.encoder.Close() + r.err = err + return xio.EmptyBlockReader, err + } + } + if err := multiIter.Err(); err != nil { + r.encoder.Close() + r.err = err + return xio.EmptyBlockReader, err + } + + // Release references to the existing streams + for i := range r.streams { + if r.streams[i].stream != nil && r.streams[i].finalize { + r.streams[i].stream.Finalize() + } + r.streams[i].stream = nil + } + for i := range r.readers { + r.readers[i] = nil + } + + // Can ignore OK here because BlockReader will handle nil streams + // properly. + stream, _ := r.encoder.Stream(r.ctx) + r.merged = xio.BlockReader{ + SegmentReader: stream, + Start: r.blockStart, + BlockSize: r.blockSize, + } + + return r.merged, nil +} + +func (r *dbMergedBlockReader) Clone( + pool pool.CheckedBytesPool, +) (xio.SegmentReader, error) { + s0, err := r.streams[0].clone(pool) + if err != nil { + return nil, err + } + s1, err := r.streams[1].clone(pool) + if err != nil { + return nil, err + } + return newDatabaseMergedBlockReader( + r.nsCtx, + r.blockStart, + r.blockSize, + s0, + s1, + r.opts, + ), nil +} + +func (r *dbMergedBlockReader) Start() time.Time { + return r.blockStart +} + +func (r *dbMergedBlockReader) BlockSize() time.Duration { + return r.blockSize +} + +func (r *dbMergedBlockReader) Read(b []byte) (int, error) { + reader, err := r.mergedReader() + if err != nil { + return 0, err + } + return reader.Read(b) +} + +func (r *dbMergedBlockReader) Segment() (ts.Segment, error) { + reader, err := r.mergedReader() + if err != nil { + return ts.Segment{}, err + } + return reader.Segment() +} + +func (r *dbMergedBlockReader) SegmentReader() (xio.SegmentReader, error) { + reader, err := r.mergedReader() + if err != nil { + return nil, err + } + return reader.SegmentReader, nil +} + +func (r *dbMergedBlockReader) Reset(_ ts.Segment) { + panic(fmt.Errorf("merged block reader not available for re-use")) +} + +func (r *dbMergedBlockReader) ResetWindowed(_ ts.Segment, _, _ time.Time) { + panic(fmt.Errorf("merged block reader not available for re-use")) +} + +func (r *dbMergedBlockReader) Finalize() { + r.Lock() + + // Can blocking close, the finalizer will complete immediately + // since it just dec refs on the buffer it created in the encoder. + r.ctx.BlockingClose() + + r.blockStart = time.Time{} + + for i := range r.streams { + if r.streams[i].stream != nil && r.streams[i].finalize { + r.streams[i].stream.Finalize() + } + r.streams[i].stream = nil + } + for i := range r.readers { + if r.readers[i] != nil { + r.readers[i] = nil + } + } + + if r.merged.IsNotEmpty() { + r.merged.Finalize() + } + r.merged = xio.EmptyBlockReader + + if r.encoder != nil { + r.encoder.Close() + } + r.encoder = nil + + r.err = nil + + r.Unlock() +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/metadata.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/metadata.go new file mode 100644 index 00000000..1e2cbfb1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/metadata.go @@ -0,0 +1,58 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "time" + + "github.com/m3db/m3/src/x/ident" +) + +// NewMetadata creates a new block metadata +func NewMetadata( + id ident.ID, + tags ident.Tags, + start time.Time, + size int64, + checksum *uint32, + lastRead time.Time, +) Metadata { + return Metadata{ + ID: id, + Tags: tags, + Start: start, + Size: size, + Checksum: checksum, + LastRead: lastRead, + } +} + +// Finalize will finalize the ID and Tags on the metadata. +func (m *Metadata) Finalize() { + if m.ID != nil { + m.ID.Finalize() + m.ID = nil + } + if m.Tags.Values() != nil { + m.Tags.Finalize() + m.Tags = ident.Tags{} + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/options.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/options.go new file mode 100644 index 00000000..70abd049 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/options.go @@ -0,0 +1,217 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "io" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/encoding/m3tsz" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/clock" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/pool" + xsync "github.com/m3db/m3/src/x/sync" + "github.com/m3db/m3/src/dbnode/namespace" +) + +const ( + // defaultDatabaseBlockAllocSize is the size to allocate for values for each + // database block, this should match the size of expected encoded values per + // block size. + defaultDatabaseBlockAllocSize = 1024 + + // defaultCloseContextConcurrency is the default concurrency for closing + // the context the block depends on + defaultCloseContextConcurrency = 4096 +) + +type options struct { + clockOpts clock.Options + databaseBlockAllocSize int + closeContextWorkers xsync.WorkerPool + databaseBlockPool DatabaseBlockPool + contextPool context.Pool + encoderPool encoding.EncoderPool + segmentReaderPool xio.SegmentReaderPool + bytesPool pool.CheckedBytesPool + readerIteratorPool encoding.ReaderIteratorPool + multiReaderIteratorPool encoding.MultiReaderIteratorPool + wiredList *WiredList +} + +// NewOptions creates new database block options +func NewOptions() Options { + bytesPool := pool.NewCheckedBytesPool(nil, nil, func(s []pool.Bucket) pool.BytesPool { + return pool.NewBytesPool(s, nil) + }) + encoderPool := encoding.NewEncoderPool(nil) + readerIteratorPool := encoding.NewReaderIteratorPool(nil) + segmentReaderPool := xio.NewSegmentReaderPool(nil) + o := &options{ + clockOpts: clock.NewOptions(), + databaseBlockAllocSize: defaultDatabaseBlockAllocSize, + closeContextWorkers: xsync.NewWorkerPool(defaultCloseContextConcurrency), + databaseBlockPool: NewDatabaseBlockPool(nil), + contextPool: context.NewPool(context.NewOptions()), + encoderPool: encoderPool, + readerIteratorPool: readerIteratorPool, + multiReaderIteratorPool: encoding.NewMultiReaderIteratorPool(nil), + segmentReaderPool: segmentReaderPool, + bytesPool: bytesPool, + } + o.closeContextWorkers.Init() + o.databaseBlockPool.Init(func() DatabaseBlock { + return NewDatabaseBlock(timeZero, 0, ts.Segment{}, o, namespace.Context{}) + }) + + encodingOpts := encoding.NewOptions(). + SetBytesPool(bytesPool). + SetEncoderPool(encoderPool). + SetReaderIteratorPool(readerIteratorPool). + SetSegmentReaderPool(segmentReaderPool) + + o.encoderPool.Init(func() encoding.Encoder { + return m3tsz.NewEncoder(timeZero, nil, m3tsz.DefaultIntOptimizationEnabled, encodingOpts) + }) + o.readerIteratorPool.Init(func(r io.Reader, descr namespace.SchemaDescr) encoding.ReaderIterator { + return m3tsz.NewReaderIterator(r, m3tsz.DefaultIntOptimizationEnabled, encodingOpts) + }) + o.multiReaderIteratorPool.Init(func(r io.Reader, descr namespace.SchemaDescr) encoding.ReaderIterator { + it := o.readerIteratorPool.Get() + it.Reset(r, descr) + return it + }) + o.segmentReaderPool.Init() + o.bytesPool.Init() + return o +} + +func (o *options) SetClockOptions(value clock.Options) Options { + opts := *o + opts.clockOpts = value + return &opts +} + +func (o *options) ClockOptions() clock.Options { + return o.clockOpts +} + +func (o *options) SetDatabaseBlockAllocSize(value int) Options { + opts := *o + opts.databaseBlockAllocSize = value + return &opts +} + +func (o *options) DatabaseBlockAllocSize() int { + return o.databaseBlockAllocSize +} + +func (o *options) SetCloseContextWorkers(value xsync.WorkerPool) Options { + opts := *o + opts.closeContextWorkers = value + return &opts +} + +func (o *options) CloseContextWorkers() xsync.WorkerPool { + return o.closeContextWorkers +} + +func (o *options) SetDatabaseBlockPool(value DatabaseBlockPool) Options { + opts := *o + opts.databaseBlockPool = value + return &opts +} + +func (o *options) DatabaseBlockPool() DatabaseBlockPool { + return o.databaseBlockPool +} + +func (o *options) SetContextPool(value context.Pool) Options { + opts := *o + opts.contextPool = value + return &opts +} + +func (o *options) ContextPool() context.Pool { + return o.contextPool +} + +func (o *options) SetEncoderPool(value encoding.EncoderPool) Options { + opts := *o + opts.encoderPool = value + return &opts +} + +func (o *options) EncoderPool() encoding.EncoderPool { + return o.encoderPool +} + +func (o *options) SetReaderIteratorPool(value encoding.ReaderIteratorPool) Options { + opts := *o + opts.readerIteratorPool = value + return &opts +} + +func (o *options) ReaderIteratorPool() encoding.ReaderIteratorPool { + return o.readerIteratorPool +} + +func (o *options) SetMultiReaderIteratorPool(value encoding.MultiReaderIteratorPool) Options { + opts := *o + opts.multiReaderIteratorPool = value + return &opts +} + +func (o *options) MultiReaderIteratorPool() encoding.MultiReaderIteratorPool { + return o.multiReaderIteratorPool +} + +func (o *options) SetSegmentReaderPool(value xio.SegmentReaderPool) Options { + opts := *o + opts.segmentReaderPool = value + return &opts +} + +func (o *options) SegmentReaderPool() xio.SegmentReaderPool { + return o.segmentReaderPool +} + +func (o *options) SetBytesPool(value pool.CheckedBytesPool) Options { + opts := *o + opts.bytesPool = value + return &opts +} + +func (o *options) BytesPool() pool.CheckedBytesPool { + return o.bytesPool +} + +func (o *options) SetWiredList(value *WiredList) Options { + opts := *o + opts.wiredList = value + return &opts +} + +func (o *options) WiredList() *WiredList { + return o.wiredList +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/result.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/result.go new file mode 100644 index 00000000..3c9943e6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/result.go @@ -0,0 +1,252 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "sort" + "time" + + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/ident" +) + +// NewFetchBlockResult creates a new fetch block result +func NewFetchBlockResult( + start time.Time, + blocks []xio.BlockReader, + err error, +) FetchBlockResult { + return FetchBlockResult{ + Start: start, + Blocks: blocks, + Err: err, + } +} + +type fetchBlockResultByTimeAscending []FetchBlockResult + +func (e fetchBlockResultByTimeAscending) Len() int { return len(e) } +func (e fetchBlockResultByTimeAscending) Swap(i, j int) { e[i], e[j] = e[j], e[i] } +func (e fetchBlockResultByTimeAscending) Less(i, j int) bool { return e[i].Start.Before(e[j].Start) } + +// SortFetchBlockResultByTimeAscending sorts fetch block results in time ascending order +func SortFetchBlockResultByTimeAscending(results []FetchBlockResult) { + sort.Sort(fetchBlockResultByTimeAscending(results)) +} + +// NewFetchBlockMetadataResult creates a new fetch block metadata result. +func NewFetchBlockMetadataResult( + start time.Time, + size int64, + checksum *uint32, + lastRead time.Time, + err error, +) FetchBlockMetadataResult { + return FetchBlockMetadataResult{ + Start: start, + Size: size, + Checksum: checksum, + LastRead: lastRead, + Err: err, + } +} + +type fetchBlockMetadataResultByTimeAscending []FetchBlockMetadataResult + +func (a fetchBlockMetadataResultByTimeAscending) Len() int { return len(a) } +func (a fetchBlockMetadataResultByTimeAscending) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a fetchBlockMetadataResultByTimeAscending) Less(i, j int) bool { + return a[i].Start.Before(a[j].Start) +} + +type fetchBlockMetadataResults struct { + results []FetchBlockMetadataResult + pool FetchBlockMetadataResultsPool +} + +// NewFetchBlockMetadataResults creates a non-pooled fetchBlockMetadataResults +func NewFetchBlockMetadataResults() FetchBlockMetadataResults { + return &fetchBlockMetadataResults{} +} + +func newPooledFetchBlockMetadataResults( + results []FetchBlockMetadataResult, + pool FetchBlockMetadataResultsPool, +) FetchBlockMetadataResults { + return &fetchBlockMetadataResults{results: results, pool: pool} +} + +func (s *fetchBlockMetadataResults) Add(res FetchBlockMetadataResult) { + s.results = append(s.results, res) +} + +func (s *fetchBlockMetadataResults) Results() []FetchBlockMetadataResult { + return s.results +} + +func (s *fetchBlockMetadataResults) Sort() { + sort.Sort(fetchBlockMetadataResultByTimeAscending(s.results)) +} + +func (s *fetchBlockMetadataResults) Reset() { + var zeroed FetchBlockMetadataResult + for i := range s.results { + s.results[i] = zeroed + } + s.results = s.results[:0] +} + +func (s *fetchBlockMetadataResults) Close() { + if s.pool != nil { + s.pool.Put(s) + } +} + +// NewFetchBlocksMetadataResult creates new database blocks metadata +func NewFetchBlocksMetadataResult( + id ident.ID, + tags ident.TagIterator, + blocks FetchBlockMetadataResults, +) FetchBlocksMetadataResult { + return FetchBlocksMetadataResult{ID: id, Tags: tags, Blocks: blocks} +} + +type fetchBlocksMetadataResults struct { + results []FetchBlocksMetadataResult + pool FetchBlocksMetadataResultsPool +} + +// NewFetchBlocksMetadataResults creates a non-pooled FetchBlocksMetadataResults +func NewFetchBlocksMetadataResults() FetchBlocksMetadataResults { + return &fetchBlocksMetadataResults{} +} + +func newPooledFetchBlocksMetadataResults( + results []FetchBlocksMetadataResult, + pool FetchBlocksMetadataResultsPool, +) FetchBlocksMetadataResults { + return &fetchBlocksMetadataResults{results: results, pool: pool} +} + +func (s *fetchBlocksMetadataResults) Add(res FetchBlocksMetadataResult) { + s.results = append(s.results, res) +} + +func (s *fetchBlocksMetadataResults) Results() []FetchBlocksMetadataResult { + return s.results +} + +func (s *fetchBlocksMetadataResults) Reset() { + var zeroed FetchBlocksMetadataResult + for i := range s.results { + s.results[i] = zeroed + } + s.results = s.results[:0] +} + +func (s *fetchBlocksMetadataResults) Close() { + for i := range s.results { + if s.results[i].ID != nil { + s.results[i].ID.Finalize() + s.results[i].ID = nil + } + if s.results[i].Tags != nil { + s.results[i].Tags.Close() + s.results[i].Tags = nil + } + if s.results[i].Blocks != nil { + s.results[i].Blocks.Close() + s.results[i].Blocks = nil + } + } + if s.pool != nil { + s.pool.Put(s) + } +} + +type filteredBlocksMetadataIter struct { + res []FetchBlocksMetadataResult + id ident.ID + metadata Metadata + resIdx int + blockIdx int + err error +} + +// NewFilteredBlocksMetadataIter creates a new filtered blocks metadata +// iterator, there's no pooling of the tags returned currently. +// Only the repair process uses this currently which is unoptimized. +func NewFilteredBlocksMetadataIter( + res FetchBlocksMetadataResults, +) FilteredBlocksMetadataIter { + return &filteredBlocksMetadataIter{res: res.Results()} +} + +func (it *filteredBlocksMetadataIter) Next() bool { + if it.err != nil { + return false + } + if it.resIdx >= len(it.res) { + return false + } + blocks := it.res[it.resIdx].Blocks.Results() + for it.blockIdx < len(blocks) { + block := blocks[it.blockIdx] + if block.Err != nil { + it.blockIdx++ + continue + } + break + } + if it.blockIdx >= len(blocks) { + it.resIdx++ + it.blockIdx = 0 + return it.Next() + } + it.id = it.res[it.resIdx].ID + block := blocks[it.blockIdx] + var tags ident.Tags + if tagsIter := it.res[it.resIdx].Tags; tagsIter != nil { + for tagsIter.Next() { + curr := tagsIter.Current() + tags.Append(ident.StringTag(curr.Name.String(), curr.Value.String())) + } + if err := tagsIter.Err(); err != nil { + it.err = err + return false + } + tagsIter.Close() + // Set to nil so it doesn't get closed again later and trigger a double-put pooling bug. + it.res[it.resIdx].Tags = nil + } + it.metadata = NewMetadata(it.id, tags, block.Start, + block.Size, block.Checksum, block.LastRead) + it.blockIdx++ + return true +} + +func (it *filteredBlocksMetadataIter) Current() (ident.ID, Metadata) { + return it.id, it.metadata +} + +func (it *filteredBlocksMetadataIter) Err() error { + return it.err +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/result_pool.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/result_pool.go new file mode 100644 index 00000000..72bb3032 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/result_pool.go @@ -0,0 +1,81 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "github.com/m3db/m3/src/x/pool" +) + +type fetchBlockMetadataResultsPool struct { + pool pool.ObjectPool + capacity int +} + +// NewFetchBlockMetadataResultsPool creates a new fetchBlockMetadataResultsPool +func NewFetchBlockMetadataResultsPool(opts pool.ObjectPoolOptions, capacity int) FetchBlockMetadataResultsPool { + p := &fetchBlockMetadataResultsPool{pool: pool.NewObjectPool(opts), capacity: capacity} + p.pool.Init(func() interface{} { + res := make([]FetchBlockMetadataResult, 0, p.capacity) + return newPooledFetchBlockMetadataResults(res, p) + }) + return p +} + +func (p *fetchBlockMetadataResultsPool) Get() FetchBlockMetadataResults { + return p.pool.Get().(FetchBlockMetadataResults) +} + +func (p *fetchBlockMetadataResultsPool) Put(res FetchBlockMetadataResults) { + if res == nil || cap(res.Results()) > p.capacity { + // Don't return nil or large slices back to pool + return + } + res.Reset() + p.pool.Put(res) +} + +type fetchBlocksMetadataResultsPool struct { + pool pool.ObjectPool + capacity int +} + +// NewFetchBlocksMetadataResultsPool creates a new fetchBlocksMetadataResultsPool +func NewFetchBlocksMetadataResultsPool(opts pool.ObjectPoolOptions, capacity int) FetchBlocksMetadataResultsPool { + p := &fetchBlocksMetadataResultsPool{pool: pool.NewObjectPool(opts), capacity: capacity} + p.pool.Init(func() interface{} { + res := make([]FetchBlocksMetadataResult, 0, capacity) + return newPooledFetchBlocksMetadataResults(res, p) + }) + return p +} + +func (p *fetchBlocksMetadataResultsPool) Get() FetchBlocksMetadataResults { + return p.pool.Get().(FetchBlocksMetadataResults) +} + +func (p *fetchBlocksMetadataResultsPool) Put(res FetchBlocksMetadataResults) { + if res == nil || cap(res.Results()) > p.capacity { + // Don't return nil or large slices back to pool + return + } + res.Reset() + p.pool.Put(res) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_manager.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_manager.go new file mode 100644 index 00000000..6fcc8327 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_manager.go @@ -0,0 +1,154 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "sync" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/sharding" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" +) + +// NewDatabaseBlockRetrieverFn is a method for constructing +// new database block retrievers +type NewDatabaseBlockRetrieverFn func( + md namespace.Metadata, + shardSet sharding.ShardSet, +) (DatabaseBlockRetriever, error) + +// NewDatabaseBlockRetrieverManager creates a new manager +// for constructing and providing existing database block retrievers +func NewDatabaseBlockRetrieverManager( + newDatabaseBlockRetrieverFn NewDatabaseBlockRetrieverFn, +) DatabaseBlockRetrieverManager { + return &blockRetrieverManager{ + newRetrieverFn: newDatabaseBlockRetrieverFn, + retrievers: newRetrieverMap(retrieverMapOptions{}), + } +} + +type blockRetrieverManager struct { + sync.RWMutex + newRetrieverFn NewDatabaseBlockRetrieverFn + retrievers *retrieverMap +} + +func (m *blockRetrieverManager) Retriever( + md namespace.Metadata, + shardSet sharding.ShardSet, +) (DatabaseBlockRetriever, error) { + m.RLock() + retriever, ok := m.retrievers.Get(md.ID()) + m.RUnlock() + if ok { + return retriever, nil + } + + m.Lock() + defer m.Unlock() + + retriever, ok = m.retrievers.Get(md.ID()) + if ok { + return retriever, nil + } + + var err error + retriever, err = m.newRetrieverFn(md, shardSet) + if err != nil { + return nil, err + } + + m.retrievers.Set(md.ID(), retriever) + return retriever, nil +} + +type shardBlockRetriever struct { + DatabaseBlockRetriever + shard uint32 +} + +// NewDatabaseShardBlockRetriever creates a new shard database +// block retriever given an existing database block retriever +func NewDatabaseShardBlockRetriever( + shard uint32, + r DatabaseBlockRetriever, +) DatabaseShardBlockRetriever { + return &shardBlockRetriever{ + DatabaseBlockRetriever: r, + shard: shard, + } +} + +func (r *shardBlockRetriever) Stream( + ctx context.Context, + id ident.ID, + blockStart time.Time, + onRetrieve OnRetrieveBlock, + nsCtx namespace.Context, +) (xio.BlockReader, error) { + return r.DatabaseBlockRetriever.Stream(ctx, r.shard, id, + blockStart, onRetrieve, nsCtx) +} + +type shardBlockRetrieverManager struct { + sync.RWMutex + retriever DatabaseBlockRetriever + shardRetrievers map[uint32]DatabaseShardBlockRetriever +} + +// NewDatabaseShardBlockRetrieverManager creates and holds shard block +// retrievers binding shards to an existing retriever. +func NewDatabaseShardBlockRetrieverManager( + r DatabaseBlockRetriever, +) DatabaseShardBlockRetrieverManager { + return &shardBlockRetrieverManager{ + retriever: r, + shardRetrievers: make(map[uint32]DatabaseShardBlockRetriever), + } +} + +func (m *shardBlockRetrieverManager) ShardRetriever( + shard uint32, +) DatabaseShardBlockRetriever { + m.RLock() + retriever, ok := m.shardRetrievers[shard] + m.RUnlock() + + if ok { + return retriever + } + + m.Lock() + defer m.Unlock() + + retriever, ok = m.shardRetrievers[shard] + if ok { + return retriever + } + + retriever = NewDatabaseShardBlockRetriever(shard, m.retriever) + m.shardRetrievers[shard] = retriever + return retriever +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_map_gen.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_map_gen.go new file mode 100644 index 00000000..dcdb1d5b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_map_gen.go @@ -0,0 +1,299 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package block + +import ( + "github.com/m3db/m3/src/x/ident" +) + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// retrieverMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type retrieverMapHash uint64 + +// retrieverMapHashFn is the hash function to execute when hashing a key. +type retrieverMapHashFn func(ident.ID) retrieverMapHash + +// retrieverMapEqualsFn is the equals key function to execute when detecting equality of a key. +type retrieverMapEqualsFn func(ident.ID, ident.ID) bool + +// retrieverMapCopyFn is the copy key function to execute when copying the key. +type retrieverMapCopyFn func(ident.ID) ident.ID + +// retrieverMapFinalizeFn is the finalize key function to execute when finished with a key. +type retrieverMapFinalizeFn func(ident.ID) + +// retrieverMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// retrieverMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type retrieverMap struct { + _retrieverMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[retrieverMapHash]retrieverMapEntry +} + +// _retrieverMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _retrieverMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash retrieverMapHashFn + // equals is the equals key function to execute when detecting equality. + equals retrieverMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy retrieverMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize retrieverMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// retrieverMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type retrieverMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _retrieverMapKey + // value type stored + value DatabaseBlockRetriever +} + +type _retrieverMapKey struct { + key ident.ID + finalize bool +} + +// Key returns the map entry key. +func (e retrieverMapEntry) Key() ident.ID { + return e.key.key +} + +// Value returns the map entry value. +func (e retrieverMapEntry) Value() DatabaseBlockRetriever { + return e.value +} + +// _retrieverMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _retrieverMapAlloc(opts _retrieverMapOptions) *retrieverMap { + m := &retrieverMap{_retrieverMapOptions: opts} + m.Reallocate() + return m +} + +func (m *retrieverMap) newMapKey(k ident.ID, opts _retrieverMapKeyOptions) _retrieverMapKey { + key := _retrieverMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *retrieverMap) removeMapKey(hash retrieverMapHash, key _retrieverMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *retrieverMap) Get(k ident.ID) (DatabaseBlockRetriever, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty DatabaseBlockRetriever + return empty, false +} + +// Set will set the value for an identifier. +func (m *retrieverMap) Set(k ident.ID, v DatabaseBlockRetriever) { + m.set(k, v, _retrieverMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// retrieverMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type retrieverMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *retrieverMap) SetUnsafe(k ident.ID, v DatabaseBlockRetriever, opts retrieverMapSetUnsafeOptions) { + m.set(k, v, _retrieverMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _retrieverMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *retrieverMap) set(k ident.ID, v DatabaseBlockRetriever, opts _retrieverMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = retrieverMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = retrieverMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *retrieverMap) Iter() map[retrieverMapHash]retrieverMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *retrieverMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *retrieverMap) Contains(k ident.ID) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *retrieverMap) Delete(k ident.ID) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *retrieverMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *retrieverMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[retrieverMapHash]retrieverMapEntry, m.initialSize) + } else { + m.lookup = make(map[retrieverMapHash]retrieverMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_new_map_gen.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_new_map_gen.go new file mode 100644 index 00000000..fa56e28d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/retriever_new_map_gen.go @@ -0,0 +1,95 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package block + +import ( + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + + "github.com/cespare/xxhash/v2" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// retrieverMapOptions provides options used when created the map. +type retrieverMapOptions struct { + InitialSize int + KeyCopyPool pool.BytesPool +} + +// newRetrieverMap returns a new byte keyed map. +func newRetrieverMap(opts retrieverMapOptions) *retrieverMap { + var ( + copyFn retrieverMapCopyFn + finalizeFn retrieverMapFinalizeFn + ) + if pool := opts.KeyCopyPool; pool == nil { + copyFn = func(k ident.ID) ident.ID { + return ident.BytesID(append([]byte(nil), k.Bytes()...)) + } + } else { + copyFn = func(k ident.ID) ident.ID { + bytes := k.Bytes() + keyLen := len(bytes) + pooled := pool.Get(keyLen)[:keyLen] + copy(pooled, bytes) + return ident.BytesID(pooled) + } + finalizeFn = func(k ident.ID) { + if slice, ok := k.(ident.BytesID); ok { + pool.Put(slice) + } + } + } + return _retrieverMapAlloc(_retrieverMapOptions{ + hash: func(id ident.ID) retrieverMapHash { + return retrieverMapHash(xxhash.Sum64(id.Bytes())) + }, + equals: func(x, y ident.ID) bool { + return x.Equal(y) + }, + copy: copyFn, + finalize: finalizeFn, + initialSize: opts.InitialSize, + }) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/types.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/types.go new file mode 100644 index 00000000..937126f1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/types.go @@ -0,0 +1,539 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/sharding" + "github.com/m3db/m3/src/dbnode/topology" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/clock" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + xsync "github.com/m3db/m3/src/x/sync" + xtime "github.com/m3db/m3/src/x/time" +) + +// Metadata captures block metadata +type Metadata struct { + ID ident.ID + Tags ident.Tags + Start time.Time + Size int64 + Checksum *uint32 + LastRead time.Time +} + +// ReplicaMetadata captures block metadata along with corresponding peer identifier +// for a single replica of a block +type ReplicaMetadata struct { + Metadata + + Host topology.Host +} + +// FilteredBlocksMetadataIter iterates over a list of blocks metadata results with filtering applied +type FilteredBlocksMetadataIter interface { + // Next returns the next item if available + Next() bool + + // Current returns the current id and block metadata + Current() (ident.ID, Metadata) + + // Error returns an error if encountered + Err() error +} + +// FetchBlockResult captures the block start time, the readers for the underlying streams, the +// corresponding checksum and any errors encountered. +type FetchBlockResult struct { + Start time.Time + FirstWrite time.Time + Blocks []xio.BlockReader + Err error +} + +// FetchBlocksMetadataOptions are options used when fetching blocks metadata. +type FetchBlocksMetadataOptions struct { + IncludeSizes bool + IncludeChecksums bool + IncludeLastRead bool + OnlyDisk bool +} + +// FetchBlockMetadataResult captures the block start time, the block size, and any errors encountered +type FetchBlockMetadataResult struct { + Start time.Time + Size int64 + Checksum *uint32 + LastRead time.Time + Err error +} + +// FetchBlockMetadataResults captures a collection of FetchBlockMetadataResult +type FetchBlockMetadataResults interface { + // Add adds a result to the slice + Add(res FetchBlockMetadataResult) + + // Results returns the result slice + Results() []FetchBlockMetadataResult + + // SortByTimeAscending sorts the results in time ascending order + Sort() + + // Reset resets the results + Reset() + + // Close performs cleanup + Close() +} + +// FetchBlocksMetadataResult captures the fetch results for multiple blocks. +type FetchBlocksMetadataResult struct { + ID ident.ID + Tags ident.TagIterator + Blocks FetchBlockMetadataResults +} + +// FetchBlocksMetadataResults captures a collection of FetchBlocksMetadataResult +type FetchBlocksMetadataResults interface { + // Add adds a result to the slice + Add(res FetchBlocksMetadataResult) + + // Results returns the result slice + Results() []FetchBlocksMetadataResult + + // Reset resets the results + Reset() + + // Close performs cleanup + Close() +} + +// NewDatabaseBlockFn creates a new database block. +type NewDatabaseBlockFn func() DatabaseBlock + +// DatabaseBlock is the interface for a DatabaseBlock +type DatabaseBlock interface { + // StartTime returns the start time of the block. + StartTime() time.Time + + // BlockSize returns the duration of the block. + BlockSize() time.Duration + + // SetLastReadTime sets the last read time of the block. + SetLastReadTime(value time.Time) + + // LastReadTime returns the last read time of the block. + LastReadTime() time.Time + + // Len returns the block length. + Len() int + + // Checksum returns the block checksum. + Checksum() (uint32, error) + + // Stream returns the encoded byte stream. + Stream(blocker context.Context) (xio.BlockReader, error) + + // Merge will merge the current block with the specified block + // when this block is read. Note: calling this twice + // will simply overwrite the target for the block to merge with + // rather than merging three blocks together. + Merge(other DatabaseBlock) error + + // HasMergeTarget returns whether the block requires multiple blocks to be + // merged during Stream(). + HasMergeTarget() bool + + // WasRetrievedFromDisk returns whether the block was retrieved from storage. + WasRetrievedFromDisk() bool + + // Reset resets the block start time, duration, and the segment. + Reset(startTime time.Time, blockSize time.Duration, segment ts.Segment, nsCtx namespace.Context) + + // ResetFromDisk resets the block start time, duration, segment, and id. + ResetFromDisk( + startTime time.Time, + blockSize time.Duration, + segment ts.Segment, + id ident.ID, + nsCtx namespace.Context, + ) + + // Discard closes the block, but returns the (unfinalized) segment. + Discard() ts.Segment + + // Close closes the block. + Close() + + // CloseIfFromDisk atomically checks if the disk was retrieved from disk, and + // if so, closes it. It is meant as a layered protection for the WiredList + // which should only close blocks that were retrieved from disk. + CloseIfFromDisk() bool + + // SetOnEvictedFromWiredList sets the owner of the block + SetOnEvictedFromWiredList(OnEvictedFromWiredList) + + // OnEvictedFromWiredList returns the owner of the block + OnEvictedFromWiredList() OnEvictedFromWiredList + + // Private methods because only the Wired List itself should use them. + databaseBlock +} + +// databaseBlock is the private portion of the DatabaseBlock interface +type databaseBlock interface { + next() DatabaseBlock + setNext(block DatabaseBlock) + prev() DatabaseBlock + setPrev(block DatabaseBlock) + enteredListAtUnixNano() int64 + setEnteredListAtUnixNano(value int64) + wiredListEntry() wiredListEntry +} + +// OnEvictedFromWiredList is implemented by a struct that wants to be notified +// when a block is evicted from the wired list. +type OnEvictedFromWiredList interface { + // OnEvictedFromWiredList is called when a block is evicted from the wired list. + OnEvictedFromWiredList(id ident.ID, blockStart time.Time) +} + +// OnRetrieveBlock is an interface to callback on when a block is retrieved. +type OnRetrieveBlock interface { + OnRetrieveBlock( + id ident.ID, + tags ident.TagIterator, + startTime time.Time, + segment ts.Segment, + nsCtx namespace.Context, + ) +} + +// OnReadBlock is an interface to callback on when a block is read. +type OnReadBlock interface { + OnReadBlock(b DatabaseBlock) +} + +// OnRetrieveBlockFn is a function implementation for the +// OnRetrieveBlock interface. +type OnRetrieveBlockFn func( + id ident.ID, + tags ident.TagIterator, + startTime time.Time, + segment ts.Segment, + nsCtx namespace.Context, +) + +// OnRetrieveBlock implements the OnRetrieveBlock interface. +func (fn OnRetrieveBlockFn) OnRetrieveBlock( + id ident.ID, + tags ident.TagIterator, + startTime time.Time, + segment ts.Segment, + nsCtx namespace.Context, +) { + fn(id, tags, startTime, segment, nsCtx) +} + +// RetrievableBlockMetadata describes a retrievable block. +type RetrievableBlockMetadata struct { + ID ident.ID + Length int + Checksum uint32 +} + +// DatabaseBlockRetriever is a block retriever. +type DatabaseBlockRetriever interface { + // CacheShardIndices will pre-parse the indexes for given shards + // to improve times when streaming a block. + CacheShardIndices(shards []uint32) error + + // Stream will stream a block for a given shard, id and start. + Stream( + ctx context.Context, + shard uint32, + id ident.ID, + blockStart time.Time, + onRetrieve OnRetrieveBlock, + nsCtx namespace.Context, + ) (xio.BlockReader, error) + + AssignShardSet(shardSet sharding.ShardSet) +} + +// DatabaseShardBlockRetriever is a block retriever bound to a shard. +type DatabaseShardBlockRetriever interface { + // Stream will stream a block for a given id and start. + Stream( + ctx context.Context, + id ident.ID, + blockStart time.Time, + onRetrieve OnRetrieveBlock, + nsCtx namespace.Context, + ) (xio.BlockReader, error) +} + +// DatabaseBlockRetrieverManager creates and holds block retrievers +// for different namespaces. +type DatabaseBlockRetrieverManager interface { + // Retriever provides the DatabaseBlockRetriever for the given namespace. + Retriever( + nsMetadata namespace.Metadata, + shardSet sharding.ShardSet, + ) (DatabaseBlockRetriever, error) +} + +// DatabaseShardBlockRetrieverManager creates and holds shard block +// retrievers binding shards to an existing retriever. +type DatabaseShardBlockRetrieverManager interface { + // ShardRetriever provides the DatabaseShardBlockRetriever for the given shard. + ShardRetriever(shard uint32) DatabaseShardBlockRetriever +} + +// DatabaseSeriesBlocks represents a collection of data blocks. +type DatabaseSeriesBlocks interface { + // Len returns the number of blocks contained in the collection. + Len() int + + // AddBlock adds a data block. + AddBlock(block DatabaseBlock) + + // AddSeries adds a raw series. + AddSeries(other DatabaseSeriesBlocks) + + // MinTime returns the min time of the blocks contained. + MinTime() time.Time + + // MaxTime returns the max time of the blocks contained. + MaxTime() time.Time + + // BlockAt returns the block at a given time if any. + BlockAt(t time.Time) (DatabaseBlock, bool) + + // AllBlocks returns all the blocks in the series. + AllBlocks() map[xtime.UnixNano]DatabaseBlock + + // RemoveBlockAt removes the block at a given time if any. + RemoveBlockAt(t time.Time) + + // RemoveAll removes all blocks. + RemoveAll() + + // Reset resets the DatabaseSeriesBlocks so they can be re-used + Reset() + + // Close closes all the blocks. + Close() +} + +// DatabaseBlockAllocate allocates a database block for a pool. +type DatabaseBlockAllocate func() DatabaseBlock + +// DatabaseBlockPool provides a pool for database blocks. +type DatabaseBlockPool interface { + // Init initializes the pool. + Init(alloc DatabaseBlockAllocate) + + // Get provides a database block from the pool. + Get() DatabaseBlock + + // Put returns a database block to the pool. + Put(block DatabaseBlock) +} + +// FetchBlockMetadataResultsPool provides a pool for fetchBlockMetadataResults +type FetchBlockMetadataResultsPool interface { + // Get returns an FetchBlockMetadataResults + Get() FetchBlockMetadataResults + + // Put puts an FetchBlockMetadataResults back to pool + Put(res FetchBlockMetadataResults) +} + +// FetchBlocksMetadataResultsPool provides a pool for fetchBlocksMetadataResults +type FetchBlocksMetadataResultsPool interface { + // Get returns an fetchBlocksMetadataResults + Get() FetchBlocksMetadataResults + + // Put puts an fetchBlocksMetadataResults back to pool + Put(res FetchBlocksMetadataResults) +} + +// LeaseManager is a manager of block leases and leasers. +type LeaseManager interface { + // RegisterLeaser registers the leaser to receive UpdateOpenLease() + // calls when leases need to be updated. + RegisterLeaser(leaser Leaser) error + // UnregisterLeaser unregisters the leaser from receiving UpdateOpenLease() + // calls. + UnregisterLeaser(leaser Leaser) error + // OpenLease opens a lease. + OpenLease( + leaser Leaser, + descriptor LeaseDescriptor, + state LeaseState, + ) error + // OpenLatestLease opens a lease for the latest LeaseState for a given + // LeaseDescriptor. + OpenLatestLease(leaser Leaser, descriptor LeaseDescriptor) (LeaseState, error) + // UpdateOpenLeases propagate a call to UpdateOpenLease() to each registered + // leaser. + UpdateOpenLeases( + descriptor LeaseDescriptor, + state LeaseState, + ) (UpdateLeasesResult, error) + // SetLeaseVerifier sets the LeaseVerifier (for delayed initialization). + SetLeaseVerifier(leaseVerifier LeaseVerifier) error +} + +// UpdateLeasesResult is the result of a call to update leases. +type UpdateLeasesResult struct { + LeasersUpdatedLease int + LeasersNoOpenLease int +} + +// LeaseDescriptor describes a lease (like an ID). +type LeaseDescriptor struct { + Namespace ident.ID + Shard uint32 + BlockStart time.Time +} + +// LeaseState is the current state of a lease which can be +// requested to be updated. +type LeaseState struct { + Volume int +} + +// LeaseVerifier verifies that a lease is valid. +type LeaseVerifier interface { + // VerifyLease is called to determine if the requested lease is valid. + VerifyLease( + descriptor LeaseDescriptor, + state LeaseState, + ) error + + // LatestState returns the latest LeaseState for a given descriptor. + LatestState(descriptor LeaseDescriptor) (LeaseState, error) +} + +// UpdateOpenLeaseResult is the result of processing an update lease. +type UpdateOpenLeaseResult uint + +const ( + // UpdateOpenLease is used to communicate a lease updated successfully. + UpdateOpenLease UpdateOpenLeaseResult = iota + // NoOpenLease is used to communicate there is no related open lease. + NoOpenLease +) + +// Leaser is a block leaser. +type Leaser interface { + // UpdateOpenLease is called on the Leaser when the latest state + // has changed and the leaser needs to update their lease. The leaser + // should update its state (releasing any resources as necessary and + // optionally acquiring new ones related to the updated lease) accordingly, + // but it should *not* call LeaseManager.OpenLease() with the provided + // descriptor and state. + // + // UpdateOpenLease will never be called concurrently on the same Leaser. Each + // call to UpdateOpenLease() must return before the next one will begin. + UpdateOpenLease( + descriptor LeaseDescriptor, + state LeaseState, + ) (UpdateOpenLeaseResult, error) +} + +// Options represents the options for a database block +type Options interface { + // SetClockOptions sets the clock options + SetClockOptions(value clock.Options) Options + + // ClockOptions returns the clock options + ClockOptions() clock.Options + + // SetDatabaseBlockAllocSize sets the databaseBlockAllocSize + SetDatabaseBlockAllocSize(value int) Options + + // DatabaseBlockAllocSize returns the databaseBlockAllocSize + DatabaseBlockAllocSize() int + + // SetCloseContextWorkers sets the workers for closing contexts + SetCloseContextWorkers(value xsync.WorkerPool) Options + + // CloseContextWorkers returns the workers for closing contexts + CloseContextWorkers() xsync.WorkerPool + + // SetDatabaseBlockPool sets the databaseBlockPool + SetDatabaseBlockPool(value DatabaseBlockPool) Options + + // DatabaseBlockPool returns the databaseBlockPool + DatabaseBlockPool() DatabaseBlockPool + + // SetContextPool sets the contextPool + SetContextPool(value context.Pool) Options + + // ContextPool returns the contextPool + ContextPool() context.Pool + + // SetEncoderPool sets the contextPool + SetEncoderPool(value encoding.EncoderPool) Options + + // EncoderPool returns the contextPool + EncoderPool() encoding.EncoderPool + + // SetReaderIteratorPool sets the readerIteratorPool + SetReaderIteratorPool(value encoding.ReaderIteratorPool) Options + + // ReaderIteratorPool returns the readerIteratorPool + ReaderIteratorPool() encoding.ReaderIteratorPool + + // SetMultiReaderIteratorPool sets the multiReaderIteratorPool + SetMultiReaderIteratorPool(value encoding.MultiReaderIteratorPool) Options + + // MultiReaderIteratorPool returns the multiReaderIteratorPool + MultiReaderIteratorPool() encoding.MultiReaderIteratorPool + + // SetSegmentReaderPool sets the contextPool + SetSegmentReaderPool(value xio.SegmentReaderPool) Options + + // SegmentReaderPool returns the contextPool + SegmentReaderPool() xio.SegmentReaderPool + + // SetBytesPool sets the bytesPool + SetBytesPool(value pool.CheckedBytesPool) Options + + // BytesPool returns the bytesPool + BytesPool() pool.CheckedBytesPool + + // SetWiredList sets the database block wired list + SetWiredList(value *WiredList) Options + + // WiredList returns the database block wired list + WiredList() *WiredList +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/block/wired_list.go b/vendor/github.com/m3db/m3/src/dbnode/storage/block/wired_list.go new file mode 100644 index 00000000..e804188b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/block/wired_list.go @@ -0,0 +1,377 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// The wired list is the primary data structure that is used to support the LRU +// caching policy. It is a global (per-database) structure that is shared +// between all namespaces, shards, and series. It is responsible for determining +// which blocks should be kept "wired" (cached) in memory, and which should be +// closed and fetched again from disk if they need to be retrieved in the future. +// +// The WiredList is basically a specialized LRU, except that it doesn't store the +// data itself, it just keeps track of which data is currently in memory and makes +// decisions about which data to remove from memory. Updating the Wired List is +// asynchronous: callers put an operation to modify the list into a channel and +// a background goroutine pulls from that channels and performs updates to the +// list which may include removing items from memory ("unwiring" blocks). +// +// The WiredList itself does not allocate a per-entry datastructure to keep track +// of what is active and what is not. Instead, it creates a "virtual list" ontop +// of the existing blocks that are in memory by manipulating struct-level pointers +// on the DatabaseBlocks which are "owned" by the list. In other words, the +// DatabaseBlocks are scattered among numerous namespaces/shards/series, but they +// existed in virtual sorted order via the prev/next pointers they contain, but +// which are only manipulated by the WiredList. +// +// The WiredList ONLY keeps track of blocks that are read from disk. Blocks that +// are created by rotating recently-written data out of buffers and into new +// DatabaseBlocks are managed by the background ticks of the series. The background +// tick will avoid closing blocks that were read from disk, and a block will never +// be provided to the WiredList if it wasn't read from disk. This prevents tricky +// ownership semantics where both the background tick and and the WiredList are +// competing for ownership / trying to close the same blocks. + +package block + +import ( + "errors" + "sync" + "sync/atomic" + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/runtime" + "github.com/m3db/m3/src/x/instrument" + + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +const ( + defaultWiredListEventsChannelSize = 65536 + wiredListSampleGaugesEvery = 100 +) + +var ( + errAlreadyStarted = errors.New("wired list already started") + errAlreadyStopped = errors.New("wired list already stopped") +) + +// WiredList is a database block wired list. +type WiredList struct { + mu sync.RWMutex + + nowFn clock.NowFn + + // Max wired blocks, must use atomic store and load to access. + maxWired int64 + + root dbBlock + length int + updatesChSize int + updatesCh chan DatabaseBlock + doneCh chan struct{} + + metrics wiredListMetrics + iOpts instrument.Options +} + +type wiredListMetrics struct { + unwireable tally.Gauge + limit tally.Gauge + evicted tally.Counter + pushedBack tally.Counter + inserted tally.Counter + evictedAfterDuration tally.Timer +} + +func newWiredListMetrics(scope tally.Scope) wiredListMetrics { + return wiredListMetrics{ + // Keeps track of how many blocks are in the list + unwireable: scope.Gauge("unwireable"), + limit: scope.Gauge("limit"), + // Incremented when a block is evicted + evicted: scope.Counter("evicted"), + // Incremented when a block is "pushed back" in the list, I.E + // it was already in the list + pushedBack: scope.Counter("pushed-back"), + // Incremented when a block is inserted into the list, I.E + // it wasn't already present + inserted: scope.Counter("inserted"), + // Measure how much time blocks spend in the list before being evicted + evictedAfterDuration: scope.Timer("evicted-after-duration"), + } +} + +// WiredListOptions is the options struct for the WiredList constructor. +type WiredListOptions struct { + RuntimeOptionsManager runtime.OptionsManager + InstrumentOptions instrument.Options + ClockOptions clock.Options + EventsChannelSize int +} + +// NewWiredList returns a new database block wired list. +func NewWiredList(opts WiredListOptions) *WiredList { + scope := opts.InstrumentOptions.MetricsScope(). + SubScope("wired-list") + l := &WiredList{ + nowFn: opts.ClockOptions.NowFn(), + metrics: newWiredListMetrics(scope), + iOpts: opts.InstrumentOptions, + } + if opts.EventsChannelSize > 0 { + l.updatesChSize = opts.EventsChannelSize + } else { + l.updatesChSize = defaultWiredListEventsChannelSize + } + l.root.setNext(&l.root) + l.root.setPrev(&l.root) + opts.RuntimeOptionsManager.RegisterListener(l) + return l +} + +// SetRuntimeOptions sets the current runtime options to +// be consumed by the wired list +func (l *WiredList) SetRuntimeOptions(value runtime.Options) { + atomic.StoreInt64(&l.maxWired, int64(value.MaxWiredBlocks())) +} + +// Start starts processing the wired list +func (l *WiredList) Start() error { + l.mu.Lock() + defer l.mu.Unlock() + if l.updatesCh != nil { + return errAlreadyStarted + } + + l.updatesCh = make(chan DatabaseBlock, l.updatesChSize) + l.doneCh = make(chan struct{}, 1) + go func() { + i := 0 + for v := range l.updatesCh { + l.processUpdateBlock(v) + if i%wiredListSampleGaugesEvery == 0 { + l.metrics.unwireable.Update(float64(l.length)) + l.metrics.limit.Update(float64(atomic.LoadInt64(&l.maxWired))) + } + i++ + } + l.doneCh <- struct{}{} + }() + + return nil +} + +// Stop stops processing the wired list +func (l *WiredList) Stop() error { + l.mu.Lock() + defer l.mu.Unlock() + + if l.updatesCh == nil { + return errAlreadyStopped + } + + close(l.updatesCh) + <-l.doneCh + + l.updatesCh = nil + close(l.doneCh) + l.doneCh = nil + + return nil +} + +// BlockingUpdate places the block into the channel of blocks which are waiting to notify the +// wired list that they were accessed. All updates must be processed through this channel +// to force synchronization. +// +// We use a channel and a background processing goroutine to reduce blocking / lock contention. +func (l *WiredList) BlockingUpdate(v DatabaseBlock) { + // Fast path, don't use defer (in Go 1.14 this won't matter anymore since + // defer is basically compile time for simple callsites). + l.mu.RLock() + if l.updatesCh == nil { + l.mu.RUnlock() + return + } + l.updatesCh <- v + l.mu.RUnlock() +} + +// NonBlockingUpdate will attempt to put the block in the events channel, but will not block +// if the channel is full. Used in cases where a blocking update could trigger deadlock with +// the WiredList itself. +func (l *WiredList) NonBlockingUpdate(v DatabaseBlock) bool { + l.mu.RLock() + defer l.mu.RUnlock() + + if l.updatesCh == nil { + return false + } + + select { + case l.updatesCh <- v: + return true + default: + return false + } +} + +// processUpdateBlock inspects a block that has been modified or read recently +// and determines what outcome its state should have on the wired list. +func (l *WiredList) processUpdateBlock(v DatabaseBlock) { + entry := v.wiredListEntry() + + // In some cases the WiredList can receive blocks that are closed. This can happen if a block is + // in the updatesCh (because it was read) but also already in the WiredList, and while its still + // in the updatesCh, it is evicted from the wired list to make room for some other block that is + // being processed. The eviction of the block will close it, but the enqueued update is still in + // the updateCh even though its an update for a closed block. For the same reason, the wired list + // can receive blocks that were not retrieved from disk because the closed block was returned to + // a pool and then re-used. + unwireable := !entry.closed && entry.wasRetrievedFromDisk + + // If a block is still unwireable then its worth keeping track of in the wired list + // so we push it back. + if unwireable { + l.pushBack(v) + return + } + + // If a block is not unwireable there is no point in keeping track of it in the WiredList, + // so we remove it or don't add it in the first place. This works because the remove method + // is a noop for blocks that aren't already in the WiredList and the pushBack method used + // above is the only way for blocks to be added. + l.remove(v) +} + +func (l *WiredList) insertAfter(v, at DatabaseBlock) { + now := l.nowFn() + + n := at.next() + at.setNext(v) + v.setPrev(at) + v.setNext(n) + n.setPrev(v) + l.length++ + + maxWired := int(atomic.LoadInt64(&l.maxWired)) + if maxWired <= 0 { + // Not enforcing max wired blocks + return + } + + // Try to unwire all blocks possible + bl := l.root.next() + for l.length > maxWired && bl != &l.root { + entry := bl.wiredListEntry() + if !entry.wasRetrievedFromDisk { + // This should never happen because processUpdateBlock performs the same + // check, and a block should never be pooled in-between those steps because + // the wired list is supposed to have sole ownership over that lifecycle and + // is single-threaded. + instrument.EmitAndLogInvariantViolation(l.iOpts, func(l *zap.Logger) { + l.With( + zap.Time("blockStart", entry.startTime), + zap.Bool("closed", entry.closed), + zap.Bool("wasRetrievedFromDisk", entry.wasRetrievedFromDisk), + ).Error("wired list tried to process a block that was not retrieved from disk") + }) + + } + + // Evict the block before closing it so that callers of series.ReadEncoded() + // don't get errors about trying to read from a closed block. + if onEvict := bl.OnEvictedFromWiredList(); onEvict != nil { + if entry.seriesID == nil { + // Entry should always have a series ID attached + instrument.EmitAndLogInvariantViolation(l.iOpts, func(l *zap.Logger) { + l.With( + zap.Time("blockStart", entry.startTime), + zap.Bool("closed", entry.closed), + zap.Bool("wasRetrievedFromDisk", entry.wasRetrievedFromDisk), + ).Error("wired list entry does not have seriesID set") + }) + + } else { + onEvict.OnEvictedFromWiredList(entry.seriesID, entry.startTime) + } + } + + // bl.CloseIfFromDisk() will return the block to the pool. In order to avoid + // races with the pool itself, we capture the value of the next block and + // remove the block from the wired list before we close it. + nextBl := bl.next() + l.remove(bl) + if wasFromDisk := bl.CloseIfFromDisk(); !wasFromDisk { + // Should never happen + instrument.EmitAndLogInvariantViolation(l.iOpts, func(l *zap.Logger) { + l.With( + zap.Time("blockStart", entry.startTime), + zap.Bool("closed", entry.closed), + zap.Bool("wasRetrievedFromDisk", entry.wasRetrievedFromDisk), + ).Error("wired list tried to close a block that was not from disk") + }) + } + + l.metrics.evicted.Inc(1) + + enteredListAt := time.Unix(0, bl.enteredListAtUnixNano()) + l.metrics.evictedAfterDuration.Record(now.Sub(enteredListAt)) + + bl = nextBl + } +} + +func (l *WiredList) remove(v DatabaseBlock) { + if !l.exists(v) { + // Already removed + return + } + v.prev().setNext(v.next()) + v.next().setPrev(v.prev()) + v.setNext(nil) // avoid memory leaks + v.setPrev(nil) // avoid memory leaks + l.length-- +} + +func (l *WiredList) pushBack(v DatabaseBlock) { + if l.exists(v) { + l.metrics.pushedBack.Inc(1) + l.moveToBack(v) + return + } + + l.metrics.inserted.Inc(1) + l.insertAfter(v, l.root.prev()) + v.setEnteredListAtUnixNano(l.nowFn().UnixNano()) +} + +func (l *WiredList) moveToBack(v DatabaseBlock) { + if !l.exists(v) || l.root.prev() == v { + return + } + l.remove(v) + l.insertAfter(v, l.root.prev()) +} + +func (l *WiredList) exists(v DatabaseBlock) bool { + return v.next() != nil || v.prev() != nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/map_gen.go b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/map_gen.go new file mode 100644 index 00000000..6239b308 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/map_gen.go @@ -0,0 +1,299 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package result + +import ( + "github.com/m3db/m3/src/x/ident" +) + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// MapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type MapHash uint64 + +// HashFn is the hash function to execute when hashing a key. +type HashFn func(ident.ID) MapHash + +// EqualsFn is the equals key function to execute when detecting equality of a key. +type EqualsFn func(ident.ID, ident.ID) bool + +// CopyFn is the copy key function to execute when copying the key. +type CopyFn func(ident.ID) ident.ID + +// FinalizeFn is the finalize key function to execute when finished with a key. +type FinalizeFn func(ident.ID) + +// Map uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// Map is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type Map struct { + mapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[MapHash]MapEntry +} + +// mapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type mapOptions struct { + // hash is the hash function to execute when hashing a key. + hash HashFn + // equals is the equals key function to execute when detecting equality. + equals EqualsFn + // copy is the copy key function to execute when copying the key. + copy CopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize FinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// MapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type MapEntry struct { + // key is used to check equality on lookups to resolve collisions + key mapKey + // value type stored + value DatabaseSeriesBlocks +} + +type mapKey struct { + key ident.ID + finalize bool +} + +// Key returns the map entry key. +func (e MapEntry) Key() ident.ID { + return e.key.key +} + +// Value returns the map entry value. +func (e MapEntry) Value() DatabaseSeriesBlocks { + return e.value +} + +// mapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func mapAlloc(opts mapOptions) *Map { + m := &Map{mapOptions: opts} + m.Reallocate() + return m +} + +func (m *Map) newMapKey(k ident.ID, opts mapKeyOptions) mapKey { + key := mapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *Map) removeMapKey(hash MapHash, key mapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *Map) Get(k ident.ID) (DatabaseSeriesBlocks, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty DatabaseSeriesBlocks + return empty, false +} + +// Set will set the value for an identifier. +func (m *Map) Set(k ident.ID, v DatabaseSeriesBlocks) { + m.set(k, v, mapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// SetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type SetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *Map) SetUnsafe(k ident.ID, v DatabaseSeriesBlocks, opts SetUnsafeOptions) { + m.set(k, v, mapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type mapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *Map) set(k ident.ID, v DatabaseSeriesBlocks, opts mapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = MapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = MapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *Map) Iter() map[MapHash]MapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *Map) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *Map) Contains(k ident.ID) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *Map) Delete(k ident.ID) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *Map) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *Map) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[MapHash]MapEntry, m.initialSize) + } else { + m.lookup = make(map[MapHash]MapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/new_map_gen.go b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/new_map_gen.go new file mode 100644 index 00000000..1cca90a4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/new_map_gen.go @@ -0,0 +1,95 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package result + +import ( + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" + + "github.com/cespare/xxhash/v2" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// MapOptions provides options used when created the map. +type MapOptions struct { + InitialSize int + KeyCopyPool pool.BytesPool +} + +// NewMap returns a new byte keyed map. +func NewMap(opts MapOptions) *Map { + var ( + copyFn CopyFn + finalizeFn FinalizeFn + ) + if pool := opts.KeyCopyPool; pool == nil { + copyFn = func(k ident.ID) ident.ID { + return ident.BytesID(append([]byte(nil), k.Bytes()...)) + } + } else { + copyFn = func(k ident.ID) ident.ID { + bytes := k.Bytes() + keyLen := len(bytes) + pooled := pool.Get(keyLen)[:keyLen] + copy(pooled, bytes) + return ident.BytesID(pooled) + } + finalizeFn = func(k ident.ID) { + if slice, ok := k.(ident.BytesID); ok { + pool.Put(slice) + } + } + } + return mapAlloc(mapOptions{ + hash: func(id ident.ID) MapHash { + return MapHash(xxhash.Sum64(id.Bytes())) + }, + equals: func(x, y ident.ID) bool { + return x.Equal(y) + }, + copy: copyFn, + finalize: finalizeFn, + initialSize: opts.InitialSize, + }) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/options.go b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/options.go new file mode 100644 index 00000000..0be030c3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/options.go @@ -0,0 +1,113 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package result + +import ( + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/storage/series" + "github.com/m3db/m3/src/x/instrument" +) + +const ( + defaultNewBlocksLen = 2 +) + +type options struct { + clockOpts clock.Options + instrumentOpts instrument.Options + blockOpts block.Options + newBlocksLen int + seriesCachePolicy series.CachePolicy + documentsBuilderAllocator DocumentsBuilderAllocator +} + +// NewOptions creates new bootstrap options +func NewOptions() Options { + return &options{ + clockOpts: clock.NewOptions(), + instrumentOpts: instrument.NewOptions(), + blockOpts: block.NewOptions(), + newBlocksLen: defaultNewBlocksLen, + seriesCachePolicy: series.DefaultCachePolicy, + documentsBuilderAllocator: NewDefaultDocumentsBuilderAllocator(), + } +} + +func (o *options) SetClockOptions(value clock.Options) Options { + opts := *o + opts.clockOpts = value + return &opts +} + +func (o *options) ClockOptions() clock.Options { + return o.clockOpts +} + +func (o *options) SetInstrumentOptions(value instrument.Options) Options { + opts := *o + opts.instrumentOpts = value + return &opts +} + +func (o *options) InstrumentOptions() instrument.Options { + return o.instrumentOpts +} + +func (o *options) SetDatabaseBlockOptions(value block.Options) Options { + opts := *o + opts.blockOpts = value + return &opts +} + +func (o *options) DatabaseBlockOptions() block.Options { + return o.blockOpts +} + +func (o *options) SetNewBlocksLen(value int) Options { + opts := *o + opts.newBlocksLen = value + return &opts +} + +func (o *options) NewBlocksLen() int { + return o.newBlocksLen +} + +func (o *options) SetSeriesCachePolicy(value series.CachePolicy) Options { + opts := *o + opts.seriesCachePolicy = value + return &opts +} + +func (o *options) SeriesCachePolicy() series.CachePolicy { + return o.seriesCachePolicy +} + +func (o *options) SetIndexDocumentsBuilderAllocator(value DocumentsBuilderAllocator) Options { + opts := *o + opts.documentsBuilderAllocator = value + return &opts +} + +func (o *options) IndexDocumentsBuilderAllocator() DocumentsBuilderAllocator { + return o.documentsBuilderAllocator +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/result_data.go b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/result_data.go new file mode 100644 index 00000000..6189905b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/result_data.go @@ -0,0 +1,258 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package result + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/x/ident" +) + +type dataBootstrapResult struct { + unfulfilled ShardTimeRanges +} + +// NewDataBootstrapResult creates a new result. +func NewDataBootstrapResult() DataBootstrapResult { + return &dataBootstrapResult{ + unfulfilled: NewShardTimeRanges(), + } +} + +func (r *dataBootstrapResult) Unfulfilled() ShardTimeRanges { + return r.unfulfilled +} + +func (r *dataBootstrapResult) SetUnfulfilled(unfulfilled ShardTimeRanges) { + r.unfulfilled = unfulfilled +} + +// MergedDataBootstrapResult returns a merged result of two bootstrap results. +// It is a mutating function that mutates the larger result by adding the +// smaller result to it and then finally returns the mutated result. +func MergedDataBootstrapResult(i, j DataBootstrapResult) DataBootstrapResult { + if i == nil { + return j + } + if j == nil { + return i + } + i.Unfulfilled().AddRanges(j.Unfulfilled()) + return i +} + +type shardResult struct { + opts Options + blocks *Map +} + +// NewShardResult creates a new shard result. +func NewShardResult(capacity int, opts Options) ShardResult { + return &shardResult{ + opts: opts, + blocks: NewMap(MapOptions{ + InitialSize: capacity, + KeyCopyPool: opts.DatabaseBlockOptions().BytesPool().BytesPool(), + }), + } +} + +// IsEmpty returns whether the result is empty. +func (sr *shardResult) IsEmpty() bool { + return sr.blocks.Len() == 0 +} + +// AddBlock adds a data block. +func (sr *shardResult) AddBlock(id ident.ID, tags ident.Tags, b block.DatabaseBlock) { + curSeries, exists := sr.blocks.Get(id) + if !exists { + curSeries = sr.newBlocks(id, tags) + sr.blocks.Set(id, curSeries) + } + curSeries.Blocks.AddBlock(b) +} + +// AddSeries adds a single series. +func (sr *shardResult) AddSeries(id ident.ID, tags ident.Tags, rawSeries block.DatabaseSeriesBlocks) { + curSeries, exists := sr.blocks.Get(id) + if !exists { + curSeries = sr.newBlocks(id, tags) + sr.blocks.Set(id, curSeries) + } + curSeries.Blocks.AddSeries(rawSeries) +} + +func (sr *shardResult) newBlocks(id ident.ID, tags ident.Tags) DatabaseSeriesBlocks { + size := sr.opts.NewBlocksLen() + return DatabaseSeriesBlocks{ + ID: id, + Tags: tags, + Blocks: block.NewDatabaseSeriesBlocks(size), + } +} + +// AddResult adds a shard result. +func (sr *shardResult) AddResult(other ShardResult) { + if other == nil { + return + } + otherSeries := other.AllSeries() + for _, entry := range otherSeries.Iter() { + series := entry.Value() + sr.AddSeries(series.ID, series.Tags, series.Blocks) + } +} + +// RemoveBlockAt removes a data block at a given timestamp +func (sr *shardResult) RemoveBlockAt(id ident.ID, t time.Time) { + curSeries, exists := sr.blocks.Get(id) + if !exists { + return + } + curSeries.Blocks.RemoveBlockAt(t) + if curSeries.Blocks.Len() == 0 { + sr.RemoveSeries(id) + } +} + +// RemoveSeries removes a single series of blocks. +func (sr *shardResult) RemoveSeries(id ident.ID) { + sr.blocks.Delete(id) +} + +// AllSeries returns all series in the map. +func (sr *shardResult) AllSeries() *Map { + return sr.blocks +} + +func (sr *shardResult) NumSeries() int64 { + return int64(sr.blocks.Len()) +} + +func (sr *shardResult) BlockAt(id ident.ID, t time.Time) (block.DatabaseBlock, bool) { + series, exists := sr.blocks.Get(id) + if !exists { + return nil, false + } + return series.Blocks.BlockAt(t) +} + +// Close closes a shard result. +func (sr *shardResult) Close() { + for _, entry := range sr.blocks.Iter() { + series := entry.Value() + series.Blocks.Close() + } +} + +// NumSeries returns the number of series' across all shards. +func (r ShardResults) NumSeries() int64 { + var numSeries int64 + for _, result := range r { + numSeries += result.NumSeries() + } + return numSeries +} + +// AddResults adds other shard results to the current shard results. +func (r ShardResults) AddResults(other ShardResults) { + for shard, result := range other { + if result == nil || result.NumSeries() == 0 { + continue + } + if existing, ok := r[shard]; ok { + existing.AddResult(result) + } else { + r[shard] = result + } + } +} + +// Equal returns whether another shard results is equal to the current shard results, +// will not perform a deep equal only a shallow equal of series and their block addresses. +func (r ShardResults) Equal(other ShardResults) bool { + for shard, result := range r { + otherResult, ok := r[shard] + if !ok { + return false + } + allSeries := result.AllSeries() + otherAllSeries := otherResult.AllSeries() + if allSeries.Len() != otherAllSeries.Len() { + return false + } + for _, entry := range allSeries.Iter() { + id, series := entry.Key(), entry.Value() + otherSeries, ok := otherAllSeries.Get(id) + if !ok { + return false + } + allBlocks := series.Blocks.AllBlocks() + otherAllBlocks := otherSeries.Blocks.AllBlocks() + if len(allBlocks) != len(otherAllBlocks) { + return false + } + for start, block := range allBlocks { + otherBlock, ok := otherAllBlocks[start] + if !ok { + return false + } + // Just performing shallow equals so simply compare block addresses + if block != otherBlock { + return false + } + } + } + } + return true +} + +// EstimateMapBytesSize estimates the size (in bytes) of the results map. It's only an +// estimate because its impossible to know if some of the references like the series +// name as well as tags are exclusive to this object or shared with other structures in +// memory. +func EstimateMapBytesSize(m *Map) int64 { + if m == nil { + return 0 + } + + var sum int64 + for _, elem := range m.Iter() { + id := elem.Key() + sum += int64(len(id.Bytes())) + + blocks := elem.Value() + for _, tag := range blocks.Tags.Values() { + // Name/Value should never be nil but be precautious. + if tag.Name != nil { + sum += int64(len(tag.Name.Bytes())) + } + if tag.Value != nil { + sum += int64(len(tag.Value.Bytes())) + } + } + for _, block := range blocks.Blocks.AllBlocks() { + sum += int64(block.Len()) + } + } + return sum +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/result_index.go b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/result_index.go new file mode 100644 index 00000000..1a398139 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/result_index.go @@ -0,0 +1,333 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package result + +import ( + "fmt" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/index/segment/builder" + "github.com/m3db/m3/src/m3ninx/persist" + xtime "github.com/m3db/m3/src/x/time" +) + +// NewDefaultDocumentsBuilderAllocator returns a default mutable segment +// allocator. +func NewDefaultDocumentsBuilderAllocator() DocumentsBuilderAllocator { + return func() (segment.DocumentsBuilder, error) { + return builder.NewBuilderFromDocuments(builder.NewOptions()) + } +} + +type indexBootstrapResult struct { + results IndexResults + unfulfilled ShardTimeRanges +} + +// NewIndexBootstrapResult returns a new index bootstrap result. +func NewIndexBootstrapResult() IndexBootstrapResult { + return &indexBootstrapResult{ + results: make(IndexResults), + unfulfilled: NewShardTimeRanges(), + } +} + +func (r *indexBootstrapResult) IndexResults() IndexResults { + return r.results +} + +func (r *indexBootstrapResult) Unfulfilled() ShardTimeRanges { + return r.unfulfilled +} + +func (r *indexBootstrapResult) SetUnfulfilled(unfulfilled ShardTimeRanges) { + r.unfulfilled = unfulfilled +} + +func (r *indexBootstrapResult) Add(blocks IndexBlockByVolumeType, unfulfilled ShardTimeRanges) { + r.results.Add(blocks) + r.unfulfilled.AddRanges(unfulfilled) +} + +func (r *indexBootstrapResult) NumSeries() int { + var size int64 + for _, blockByVolumeType := range r.results { + for _, b := range blockByVolumeType.data { + for _, s := range b.segments { + size += s.Segment().Size() + } + } + } + return int(size) +} + +// NewIndexBuilder creates a wrapped locakble index seg builder. +func NewIndexBuilder(builder segment.DocumentsBuilder) *IndexBuilder { + return &IndexBuilder{ + builder: builder, + } +} + +// FlushBatch flushes a batch of documents to the underlying segment builder. +func (b *IndexBuilder) FlushBatch(batch []doc.Document) ([]doc.Document, error) { + if len(batch) == 0 { + // Last flush might not have any docs enqueued + return batch, nil + } + + // NB(bodu): Prevent concurrent writes. + // Although it seems like there's no need to lock on writes since + // each block should ONLY be getting built in a single thread. + err := b.builder.InsertBatch(index.Batch{ + Docs: batch, + AllowPartialUpdates: true, + }) + if err != nil && index.IsBatchPartialError(err) { + // If after filtering out duplicate ID errors + // there are no errors, then this was a successful + // insertion. + batchErr := err.(*index.BatchPartialError) + // NB(r): FilterDuplicateIDErrors returns nil + // if no errors remain after filtering duplicate ID + // errors, this case is covered in unit tests. + err = batchErr.FilterDuplicateIDErrors() + } + if err != nil { + return batch, err + } + + // Reset docs batch for reuse + var empty doc.Document + for i := range batch { + batch[i] = empty + } + batch = batch[:0] + return batch, nil +} + +// Builder returns the underlying index segment docs builder. +func (b *IndexBuilder) Builder() segment.DocumentsBuilder { + return b.builder +} + +// AddBlockIfNotExists adds an index block if it does not already exist to the index results. +func (r IndexResults) AddBlockIfNotExists( + t time.Time, + idxopts namespace.IndexOptions, +) { + // NB(r): The reason we can align by the retention block size and guarantee + // there is only one entry for this time is because index blocks must be a + // positive multiple of the data block size, making it easy to map a data + // block entry to at most one index block entry. + blockStart := t.Truncate(idxopts.BlockSize()) + blockStartNanos := xtime.ToUnixNano(blockStart) + + _, exists := r[blockStartNanos] + if !exists { + r[blockStartNanos] = NewIndexBlockByVolumeType(blockStart) + } +} + +// Add will add an index block to the collection, merging if one already +// exists. +func (r IndexResults) Add(blocks IndexBlockByVolumeType) { + if blocks.BlockStart().IsZero() { + return + } + + // Merge results + blockStart := xtime.ToUnixNano(blocks.BlockStart()) + existing, ok := r[blockStart] + if !ok { + r[blockStart] = blocks + return + } + + r[blockStart] = existing.Merged(blocks) +} + +// AddResults will add another set of index results to the collection, merging +// if index blocks already exists. +func (r IndexResults) AddResults(other IndexResults) { + for _, blocks := range other { + r.Add(blocks) + } +} + +// MarkFulfilled will mark an index block as fulfilled, either partially or +// wholly as specified by the shard time ranges passed. +func (r IndexResults) MarkFulfilled( + t time.Time, + fulfilled ShardTimeRanges, + indexVolumeType persist.IndexVolumeType, + idxopts namespace.IndexOptions, +) error { + // NB(r): The reason we can align by the retention block size and guarantee + // there is only one entry for this time is because index blocks must be a + // positive multiple of the data block size, making it easy to map a data + // block entry to at most one index block entry. + blockStart := t.Truncate(idxopts.BlockSize()) + blockStartNanos := xtime.ToUnixNano(blockStart) + + blockRange := xtime.Range{ + Start: blockStart, + End: blockStart.Add(idxopts.BlockSize()), + } + + // First check fulfilled is correct + min, max := fulfilled.MinMax() + if min.Before(blockRange.Start) || max.After(blockRange.End) { + return fmt.Errorf("fulfilled range %s is outside of index block range: %s", + fulfilled.SummaryString(), blockRange.String()) + } + + blocks, exists := r[blockStartNanos] + if !exists { + blocks = NewIndexBlockByVolumeType(blockStart) + r[blockStartNanos] = blocks + } + + block, exists := blocks.data[indexVolumeType] + if !exists { + block = NewIndexBlock(nil, nil) + blocks.data[indexVolumeType] = block + } + blocks.data[indexVolumeType] = block.Merged(NewIndexBlock(nil, fulfilled)) + return nil +} + +// MergedIndexBootstrapResult returns a merged result of two bootstrap results. +// It is a mutating function that mutates the larger result by adding the +// smaller result to it and then finally returns the mutated result. +func MergedIndexBootstrapResult(i, j IndexBootstrapResult) IndexBootstrapResult { + if i == nil { + return j + } + if j == nil { + return i + } + sizeI, sizeJ := 0, 0 + for _, ir := range i.IndexResults() { + for _, b := range ir.data { + sizeI += len(b.Segments()) + } + } + for _, ir := range j.IndexResults() { + for _, b := range ir.data { + sizeJ += len(b.Segments()) + } + } + if sizeI >= sizeJ { + i.IndexResults().AddResults(j.IndexResults()) + i.Unfulfilled().AddRanges(j.Unfulfilled()) + return i + } + j.IndexResults().AddResults(i.IndexResults()) + j.Unfulfilled().AddRanges(i.Unfulfilled()) + return j +} + +// NewIndexBlock returns a new bootstrap index block result. +func NewIndexBlock( + segments []Segment, + fulfilled ShardTimeRanges, +) IndexBlock { + if fulfilled == nil { + fulfilled = NewShardTimeRanges() + } + return IndexBlock{ + segments: segments, + fulfilled: fulfilled, + } +} + +// Segments returns the segments. +func (b IndexBlock) Segments() []Segment { + return b.segments +} + +// Fulfilled returns the fulfilled time ranges by this index block. +func (b IndexBlock) Fulfilled() ShardTimeRanges { + return b.fulfilled +} + +// Merged returns a new merged index block, currently it just appends the +// list of segments from the other index block and the caller merges +// as they see necessary. +func (b IndexBlock) Merged(other IndexBlock) IndexBlock { + r := b + if len(other.segments) > 0 { + r.segments = append(r.segments, other.segments...) + } + if !other.fulfilled.IsEmpty() { + r.fulfilled = b.fulfilled.Copy() + r.fulfilled.AddRanges(other.fulfilled) + } + return r +} + +// NewIndexBlockByVolumeType returns a new bootstrap index blocks by volume type result. +func NewIndexBlockByVolumeType(blockStart time.Time) IndexBlockByVolumeType { + return IndexBlockByVolumeType{ + blockStart: blockStart, + data: make(map[persist.IndexVolumeType]IndexBlock), + } +} + +// BlockStart returns the block start. +func (b IndexBlockByVolumeType) BlockStart() time.Time { + return b.blockStart +} + +// GetBlock returns an IndexBlock for volumeType. +func (b IndexBlockByVolumeType) GetBlock(volumeType persist.IndexVolumeType) (IndexBlock, bool) { + block, ok := b.data[volumeType] + return block, ok +} + +// SetBlock sets an IndexBlock for volumeType. +func (b IndexBlockByVolumeType) SetBlock(volumeType persist.IndexVolumeType, block IndexBlock) { + b.data[volumeType] = block +} + +// Iter returns the underlying iterable map data. +func (b IndexBlockByVolumeType) Iter() map[persist.IndexVolumeType]IndexBlock { + return b.data +} + +// Merged returns a new merged index block by volume type. +// It merges the underlying index blocks together by index volume type. +func (b IndexBlockByVolumeType) Merged(other IndexBlockByVolumeType) IndexBlockByVolumeType { + r := b + for volumeType, otherBlock := range other.data { + existing, ok := r.data[volumeType] + if !ok { + r.data[volumeType] = otherBlock + continue + } + r.data[volumeType] = existing.Merged(otherBlock) + } + return r +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/shard_ranges.go b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/shard_ranges.go new file mode 100644 index 00000000..c7ae0479 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/shard_ranges.go @@ -0,0 +1,314 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package result + +import ( + "bytes" + "fmt" + "sort" + "time" + + xtime "github.com/m3db/m3/src/x/time" +) + +// NewShardTimeRangesFromRange returns a new ShardTimeRanges with provided shards and time range. +func NewShardTimeRangesFromRange(start, end time.Time, shards ...uint32) ShardTimeRanges { + timeRange := xtime.NewRanges(xtime.Range{Start: start, End: end}) + ranges := make(shardTimeRanges, len(shards)) + for _, s := range shards { + ranges[s] = timeRange + } + return ranges +} + +// NewShardTimeRangesFromSize returns a new ShardTimeRanges with provided shards and time range. +func NewShardTimeRangesFromSize(size int) ShardTimeRanges { + return make(shardTimeRanges, size) +} + +// NewShardTimeRanges returns an empty ShardTimeRanges. +func NewShardTimeRanges() ShardTimeRanges { + return make(shardTimeRanges) +} + +// Get time ranges for a shard. +func (r shardTimeRanges) Get(shard uint32) (xtime.Ranges, bool) { + tr, ok := r[shard] + return tr, ok +} + +// Set time ranges for a shard. +func (r shardTimeRanges) Set(shard uint32, ranges xtime.Ranges) ShardTimeRanges { + r[shard] = ranges + return r +} + +// GetOrAdd gets or adds time ranges for a shard. +func (r shardTimeRanges) GetOrAdd(shard uint32) xtime.Ranges { + if r[shard] == nil { + r[shard] = xtime.NewRanges() + } + return r[shard] +} + +// Len returns then number of shards. +func (r shardTimeRanges) Len() int { + return len(r) +} + +// Iter returns the underlying map. +func (r shardTimeRanges) Iter() map[uint32]xtime.Ranges { + return r +} + +// IsEmpty returns whether the shard time ranges is empty or not. +func (r shardTimeRanges) IsEmpty() bool { + for _, ranges := range r { + if !ranges.IsEmpty() { + return false + } + } + return true +} + +// Equal returns whether two shard time ranges are equal. +func (r shardTimeRanges) Equal(other ShardTimeRanges) bool { + if len(r) != other.Len() { + return false + } + for shard, ranges := range r { + otherRanges := other.GetOrAdd(shard) + if otherRanges == nil { + return false + } + if ranges.Len() != otherRanges.Len() { + return false + } + it := ranges.Iter() + otherIt := otherRanges.Iter() + if it.Next() && otherIt.Next() { + value := it.Value() + otherValue := otherIt.Value() + if !value.Start.Equal(otherValue.Start) || + !value.End.Equal(otherValue.End) { + return false + } + } + } + return true +} + +// IsSuperset returns whether the current shard time ranges is a superset of the +// other shard time ranges. +func (r shardTimeRanges) IsSuperset(other ShardTimeRanges) bool { + if len(r) < other.Len() { + return false + } + for shard, ranges := range r { + otherRanges := other.GetOrAdd(shard) + if ranges.Len() < otherRanges.Len() { + return false + } + it := ranges.Iter() + otherIt := otherRanges.Iter() + + // NB(bodu): Both of these iterators are sorted by time + // and the block sizes are expected to line up. + // The logic is that if we finish iterating through otherIt then + // the current ranges are a superset of the other ranges. + missedRange := false + otherIteratorNext: + for otherIt.Next() { + for it.Next() { + if otherIt.Value().Equal(it.Value()) { + continue otherIteratorNext + } + } + + missedRange = true + break + } + + // If there is an unmatched range (not empty) left in `otherIt` then the current shard ranges + // are NOT a superset of the other shard ranges. + if missedRange { + return false + } + } + return true +} + +// Copy will return a copy of the current shard time ranges. +func (r shardTimeRanges) Copy() ShardTimeRanges { + result := make(shardTimeRanges, len(r)) + for shard, ranges := range r { + newRanges := xtime.NewRanges() + newRanges.AddRanges(ranges) + result[shard] = newRanges + } + return result +} + +// AddRanges adds other shard time ranges to the current shard time ranges. +func (r shardTimeRanges) AddRanges(other ShardTimeRanges) { + if other == nil { + return + } + for shard, ranges := range other.Iter() { + if ranges.IsEmpty() { + continue + } + if existing, ok := r[shard]; ok { + existing.AddRanges(ranges) + } else { + r[shard] = ranges.Clone() + } + } +} + +// ToUnfulfilledDataResult will return a result that is comprised of wholly +// unfufilled time ranges from the set of shard time ranges. +func (r shardTimeRanges) ToUnfulfilledDataResult() DataBootstrapResult { + result := NewDataBootstrapResult() + result.SetUnfulfilled(r.Copy()) + return result +} + +// ToUnfulfilledIndexResult will return a result that is comprised of wholly +// unfufilled time ranges from the set of shard time ranges. +func (r shardTimeRanges) ToUnfulfilledIndexResult() IndexBootstrapResult { + result := NewIndexBootstrapResult() + result.SetUnfulfilled(r.Copy()) + return result +} + +// Subtract will subtract another range from the current range. +func (r shardTimeRanges) Subtract(other ShardTimeRanges) { + if other == nil { + return + } + for shard, ranges := range r { + otherRanges, ok := other.Get(shard) + if !ok { + continue + } + + subtractedRanges := ranges.Clone() + subtractedRanges.RemoveRanges(otherRanges) + if subtractedRanges.IsEmpty() { + delete(r, shard) + } else { + r[shard] = subtractedRanges + } + } +} + +// MinMax will return the very minimum time as a start and the +// maximum time as an end in the ranges. +func (r shardTimeRanges) MinMax() (time.Time, time.Time) { + min, max := time.Time{}, time.Time{} + for _, ranges := range r { + if ranges.IsEmpty() { + continue + } + it := ranges.Iter() + for it.Next() { + curr := it.Value() + if min.IsZero() || curr.Start.Before(min) { + min = curr.Start + } + if max.IsZero() || curr.End.After(max) { + max = curr.End + } + } + } + return min, max +} + +// MinMaxRange returns the min and max times, and the duration for this range. +func (r shardTimeRanges) MinMaxRange() (time.Time, time.Time, time.Duration) { + min, max := r.MinMax() + return min, max, max.Sub(min) +} + +type summaryFn func(xtime.Ranges) string + +func (r shardTimeRanges) summarize(sfn summaryFn) string { + values := make([]shardTimeRangesPair, 0, len(r)) + for shard, ranges := range r { + values = append(values, shardTimeRangesPair{shard: shard, value: ranges}) + } + sort.Sort(shardTimeRangesByShard(values)) + + var ( + buf bytes.Buffer + hasPrev = false + ) + + buf.WriteString("{") + for _, v := range values { + shard, ranges := v.shard, v.value + if hasPrev { + buf.WriteString(", ") + } + hasPrev = true + + buf.WriteString(fmt.Sprintf("%d: %s", shard, sfn(ranges))) + } + buf.WriteString("}") + + return buf.String() +} + +// String returns a description of the time ranges +func (r shardTimeRanges) String() string { + return r.summarize(xtime.Ranges.String) +} + +func rangesDuration(ranges xtime.Ranges) string { + var ( + duration time.Duration + it = ranges.Iter() + ) + for it.Next() { + curr := it.Value() + duration += curr.End.Sub(curr.Start) + } + return duration.String() +} + +// SummaryString returns a summary description of the time ranges +func (r shardTimeRanges) SummaryString() string { + return r.summarize(rangesDuration) +} + +type shardTimeRangesPair struct { + shard uint32 + value xtime.Ranges +} + +type shardTimeRangesByShard []shardTimeRangesPair + +func (str shardTimeRangesByShard) Len() int { return len(str) } +func (str shardTimeRangesByShard) Swap(i, j int) { str[i], str[j] = str[j], str[i] } +func (str shardTimeRangesByShard) Less(i, j int) bool { + return str[i].shard < str[j].shard +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/types.go b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/types.go new file mode 100644 index 00000000..423553ee --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/bootstrap/result/types.go @@ -0,0 +1,251 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package result + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/storage/series" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/persist" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + xtime "github.com/m3db/m3/src/x/time" +) + +// DataBootstrapResult is the result of a bootstrap of series data. +type DataBootstrapResult interface { + // Unfulfilled is the unfulfilled time ranges for the bootstrap. + Unfulfilled() ShardTimeRanges + + // SetUnfulfilled sets the current unfulfilled shard time ranges. + SetUnfulfilled(unfulfilled ShardTimeRanges) +} + +// IndexBootstrapResult is the result of a bootstrap of series index metadata. +type IndexBootstrapResult interface { + // IndexResults returns a map of all index block results. + IndexResults() IndexResults + + // Unfulfilled is the unfulfilled time ranges for the bootstrap. + Unfulfilled() ShardTimeRanges + + // SetUnfulfilled sets the current unfulfilled shard time ranges. + SetUnfulfilled(unfulfilled ShardTimeRanges) + + // Add adds an index block result. + Add(blocks IndexBlockByVolumeType, unfulfilled ShardTimeRanges) + + // NumSeries returns the total number of series across all segments. + NumSeries() int +} + +// IndexResults is a set of index blocks indexed by block start. +type IndexResults map[xtime.UnixNano]IndexBlockByVolumeType + +// IndexBuilder wraps a index segment builder w/ batching. +type IndexBuilder struct { + builder segment.DocumentsBuilder +} + +// IndexBlockByVolumeType contains the bootstrap data structures for an index block by volume type. +type IndexBlockByVolumeType struct { + blockStart time.Time + data map[persist.IndexVolumeType]IndexBlock +} + +// IndexBlock is an index block for a index volume type. +type IndexBlock struct { + segments []Segment + fulfilled ShardTimeRanges +} + +// Segment wraps an index segment so we can easily determine whether or not the segment is persisted to disk. +type Segment struct { + segment segment.Segment + persisted bool +} + +// NewSegment returns an index segment w/ persistence metadata. +func NewSegment(segment segment.Segment, persisted bool) Segment { + return Segment{ + segment: segment, + persisted: persisted, + } +} + +// IsPersisted returns whether or not the underlying segment was persisted to disk. +func (s Segment) IsPersisted() bool { + return s.persisted +} + +// Segment returns a segment. +func (s Segment) Segment() segment.Segment { + return s.segment +} + +// DocumentsBuilderAllocator allocates a new DocumentsBuilder type when +// creating a bootstrap result to return to the index. +type DocumentsBuilderAllocator func() (segment.DocumentsBuilder, error) + +// ShardResult returns the bootstrap result for a shard. +type ShardResult interface { + // IsEmpty returns whether the result is empty. + IsEmpty() bool + + // BlockAt returns the block at a given time for a given id, + // or nil if there is no such block. + BlockAt(id ident.ID, t time.Time) (block.DatabaseBlock, bool) + + // AllSeries returns a map of all series with their associated blocks. + AllSeries() *Map + + // NumSeries returns the number of distinct series'. + NumSeries() int64 + + // AddBlock adds a data block. + AddBlock(id ident.ID, tags ident.Tags, block block.DatabaseBlock) + + // AddSeries adds a single series of blocks. + AddSeries(id ident.ID, tags ident.Tags, rawSeries block.DatabaseSeriesBlocks) + + // AddResult adds a shard result. + AddResult(other ShardResult) + + // RemoveBlockAt removes a data block at a given timestamp + RemoveBlockAt(id ident.ID, t time.Time) + + // RemoveSeries removes a single series of blocks. + RemoveSeries(id ident.ID) + + // Close closes a shard result. + Close() +} + +// DatabaseSeriesBlocks represents a series of blocks and a associated series ID. +type DatabaseSeriesBlocks struct { + ID ident.ID + Tags ident.Tags + Blocks block.DatabaseSeriesBlocks +} + +// ShardResults is a map of shards to shard results. +type ShardResults map[uint32]ShardResult + +// ShardTimeRanges is a map of shards to time ranges. +type ShardTimeRanges interface { + // Get time ranges for a shard. + Get(shard uint32) (xtime.Ranges, bool) + + // Set time ranges for a shard. + Set(shard uint32, ranges xtime.Ranges) ShardTimeRanges + + // GetOrAdd gets or adds time ranges for a shard. + GetOrAdd(shard uint32) xtime.Ranges + + // AddRanges adds other shard time ranges to the current shard time ranges. + AddRanges(ranges ShardTimeRanges) + + // Iter returns the underlying map. + Iter() map[uint32]xtime.Ranges + + Copy() ShardTimeRanges + + // IsSuperset returns whether the current shard time ranges are a + // superset of the other shard time ranges. + IsSuperset(other ShardTimeRanges) bool + + // Equal returns whether two shard time ranges are equal. + Equal(other ShardTimeRanges) bool + + // ToUnfulfilledDataResult will return a result that is comprised of wholly + // unfufilled time ranges from the set of shard time ranges. + ToUnfulfilledDataResult() DataBootstrapResult + + // ToUnfulfilledIndexResult will return a result that is comprised of wholly + // unfufilled time ranges from the set of shard time ranges. + ToUnfulfilledIndexResult() IndexBootstrapResult + + // Subtract will subtract another range from the current range. + Subtract(other ShardTimeRanges) + + // MinMax will return the very minimum time as a start and the + // maximum time as an end in the ranges. + MinMax() (time.Time, time.Time) + + // MinMaxRange returns the min and max times, and the duration for this range. + MinMaxRange() (time.Time, time.Time, time.Duration) + + // String returns a description of the time ranges + String() string + + // SummaryString returns a summary description of the time ranges + SummaryString() string + + // IsEmpty returns whether the shard time ranges is empty or not. + IsEmpty() bool + + // Len returns the number of shards + Len() int +} + +type shardTimeRanges map[uint32]xtime.Ranges + +// Options represents the options for bootstrap results. +type Options interface { + // SetClockOptions sets the clock options. + SetClockOptions(value clock.Options) Options + + // ClockOptions returns the clock options. + ClockOptions() clock.Options + + // SetInstrumentOptions sets the instrumentation options. + SetInstrumentOptions(value instrument.Options) Options + + // InstrumentOptions returns the instrumentation options. + InstrumentOptions() instrument.Options + + // SetDatabaseBlockOptions sets the database block options. + SetDatabaseBlockOptions(value block.Options) Options + + // DatabaseBlockOptions returns the database block options. + DatabaseBlockOptions() block.Options + + // SetNewBlocksLen sets the size of a new blocks map size. + SetNewBlocksLen(value int) Options + + // NewBlocksLen returns the size of a new blocks map size. + NewBlocksLen() int + + // SetSeriesCachePolicy sets the series cache policy. + SetSeriesCachePolicy(value series.CachePolicy) Options + + // SeriesCachePolicy returns the series cache policy. + SeriesCachePolicy() series.CachePolicy + + // SetIndexDocumentsBuilderAllocator sets the index mutable segment allocator. + SetIndexDocumentsBuilderAllocator(value DocumentsBuilderAllocator) Options + + // IndexDocumentsBuilderAllocator returns the index documents builder allocator. + IndexDocumentsBuilderAllocator() DocumentsBuilderAllocator +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/README.md b/vendor/github.com/m3db/m3/src/dbnode/storage/index/README.md new file mode 100644 index 00000000..88bb901e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/README.md @@ -0,0 +1,9 @@ +# index + +Index related documentation. + +## In-memory index cold flush consistency model + +Index writes go into the active cold mutable segment when an index block is sealed. Index blocks are sealed during ticks when they are a full index block past buffer past + block size. + +At the beginning of a cold flush we rotate out the active cold mutable segment. In-mem index writes are then evicted from mem when a cold flush completes and they are evicted. diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results.go new file mode 100644 index 00000000..18daa66f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results.go @@ -0,0 +1,323 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "fmt" + "sync" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" +) + +const missingDocumentFields = "invalid document fields: empty %s" + +// NB: emptyValues is an AggregateValues with no values, used for tracking +// terms only rather than terms and values. +var emptyValues = AggregateValues{hasValues: false} + +type aggregatedResults struct { + sync.RWMutex + + nsID ident.ID + aggregateOpts AggregateResultsOptions + + resultsMap *AggregateResultsMap + totalDocsCount int + + idPool ident.Pool + bytesPool pool.CheckedBytesPool + + pool AggregateResultsPool + valuesPool AggregateValuesPool +} + +// NewAggregateResults returns a new AggregateResults object. +func NewAggregateResults( + namespaceID ident.ID, + aggregateOpts AggregateResultsOptions, + opts Options, +) AggregateResults { + return &aggregatedResults{ + nsID: namespaceID, + aggregateOpts: aggregateOpts, + resultsMap: newAggregateResultsMap(opts.IdentifierPool()), + idPool: opts.IdentifierPool(), + bytesPool: opts.CheckedBytesPool(), + pool: opts.AggregateResultsPool(), + valuesPool: opts.AggregateValuesPool(), + } +} + +func (r *aggregatedResults) Reset( + nsID ident.ID, + aggregateOpts AggregateResultsOptions, +) { + r.Lock() + + r.aggregateOpts = aggregateOpts + + // finalize existing held nsID + if r.nsID != nil { + r.nsID.Finalize() + } + + // make an independent copy of the new nsID + if nsID != nil { + nsID = r.idPool.Clone(nsID) + } + r.nsID = nsID + + // reset all values from map first + for _, entry := range r.resultsMap.Iter() { + valueMap := entry.Value() + valueMap.finalize() + } + + // reset all keys in the map next + r.resultsMap.Reset() + r.totalDocsCount = 0 + + // NB: could do keys+value in one step but I'm trying to avoid + // using an internal method of a code-gen'd type. + r.Unlock() +} + +func (r *aggregatedResults) AddDocuments(batch []doc.Document) (int, int, error) { + r.Lock() + err := r.addDocumentsBatchWithLock(batch) + size := r.resultsMap.Len() + docsCount := r.totalDocsCount + len(batch) + r.totalDocsCount = docsCount + r.Unlock() + return size, docsCount, err +} + +func (r *aggregatedResults) AggregateResultsOptions() AggregateResultsOptions { + return r.aggregateOpts +} + +func (r *aggregatedResults) AddFields(batch []AggregateResultsEntry) (int, int) { + r.Lock() + valueInsertions := 0 + for _, entry := range batch { + f := entry.Field + aggValues, ok := r.resultsMap.Get(f) + if !ok { + aggValues = r.valuesPool.Get() + // we can avoid the copy because we assume ownership of the passed ident.ID, + // but still need to finalize it. + r.resultsMap.SetUnsafe(f, aggValues, AggregateResultsMapSetUnsafeOptions{ + NoCopyKey: true, + NoFinalizeKey: false, + }) + } else { + // because we already have a entry for this field, we release the ident back to + // the underlying pool. + f.Finalize() + } + valuesMap := aggValues.Map() + for _, t := range entry.Terms { + if !valuesMap.Contains(t) { + // we can avoid the copy because we assume ownership of the passed ident.ID, + // but still need to finalize it. + valuesMap.SetUnsafe(t, struct{}{}, AggregateValuesMapSetUnsafeOptions{ + NoCopyKey: true, + NoFinalizeKey: false, + }) + valueInsertions++ + } else { + // because we already have a entry for this term, we release the ident back to + // the underlying pool. + t.Finalize() + } + } + } + size := r.resultsMap.Len() + docsCount := r.totalDocsCount + valueInsertions + r.totalDocsCount = docsCount + r.Unlock() + return size, docsCount +} + +func (r *aggregatedResults) addDocumentsBatchWithLock( + batch []doc.Document, +) error { + for _, doc := range batch { + switch r.aggregateOpts.Type { + case AggregateTagNamesAndValues: + if err := r.addDocumentWithLock(doc); err != nil { + return err + } + + case AggregateTagNames: + // NB: if aggregating by name only, can ignore any additional documents + // after the result map size exceeds the optional size limit, since all + // incoming terms are either duplicates or new values which will exceed + // the limit. + size := r.resultsMap.Len() + if r.aggregateOpts.SizeLimit > 0 && size >= r.aggregateOpts.SizeLimit { + return nil + } + + if err := r.addDocumentTermsWithLock(doc); err != nil { + return err + } + default: + return fmt.Errorf("unsupported aggregation type: %v", r.aggregateOpts.Type) + } + } + + return nil +} + +func (r *aggregatedResults) addDocumentTermsWithLock( + document doc.Document, +) error { + for _, field := range document.Fields { + if err := r.addTermWithLock(field.Name); err != nil { + return fmt.Errorf("unable to add document terms [%+v]: %v", document, err) + } + } + + return nil +} + +func (r *aggregatedResults) addTermWithLock( + term []byte, +) error { + if len(term) == 0 { + return fmt.Errorf(missingDocumentFields, "term") + } + + // if a term filter is provided, ensure this field matches the filter, + // otherwise ignore it. + filter := r.aggregateOpts.FieldFilter + if filter != nil && !filter.Allow(term) { + return nil + } + + // NB: can cast the []byte -> ident.ID to avoid an alloc + // before we're sure we need it. + termID := ident.BytesID(term) + if r.resultsMap.Contains(termID) { + // NB: this term is already added; continue. + return nil + } + + // Set results map to an empty AggregateValues since we only care about + // existence of the term in the map, rather than its set of values. + r.resultsMap.Set(termID, emptyValues) + return nil +} + +func (r *aggregatedResults) addDocumentWithLock( + document doc.Document, +) error { + for _, field := range document.Fields { + if err := r.addFieldWithLock(field.Name, field.Value); err != nil { + return fmt.Errorf("unable to add document [%+v]: %v", document, err) + } + } + + return nil +} + +func (r *aggregatedResults) addFieldWithLock( + term []byte, + value []byte, +) error { + if len(term) == 0 { + return fmt.Errorf(missingDocumentFields, "term") + } + + // if a term filter is provided, ensure this field matches the filter, + // otherwise ignore it. + filter := r.aggregateOpts.FieldFilter + if filter != nil && !filter.Allow(term) { + return nil + } + + // NB: can cast the []byte -> ident.ID to avoid an alloc + // before we're sure we need it. + termID := ident.BytesID(term) + valueID := ident.BytesID(value) + + valueMap, found := r.resultsMap.Get(termID) + if found { + return valueMap.addValue(valueID) + } + + // NB: if over limit, do not add any new values to the map. + if r.aggregateOpts.SizeLimit > 0 && + r.resultsMap.Len() >= r.aggregateOpts.SizeLimit { + // Early return if limit enforced and we hit our limit. + return nil + } + + aggValues := r.valuesPool.Get() + if err := aggValues.addValue(valueID); err != nil { + // Return these values to the pool. + r.valuesPool.Put(aggValues) + return err + } + + r.resultsMap.Set(termID, aggValues) + return nil +} + +func (r *aggregatedResults) Namespace() ident.ID { + r.RLock() + ns := r.nsID + r.RUnlock() + return ns +} + +func (r *aggregatedResults) Map() *AggregateResultsMap { + r.RLock() + m := r.resultsMap + r.RUnlock() + return m +} + +func (r *aggregatedResults) Size() int { + r.RLock() + l := r.resultsMap.Len() + r.RUnlock() + return l +} + +func (r *aggregatedResults) TotalDocsCount() int { + r.RLock() + count := r.totalDocsCount + r.RUnlock() + return count +} + +func (r *aggregatedResults) Finalize() { + r.Reset(nil, AggregateResultsOptions{}) + if r.pool == nil { + return + } + + r.pool.Put(r) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_entry_arraypool_gen.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_entry_arraypool_gen.go new file mode 100644 index 00000000..66ac8418 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_entry_arraypool_gen.go @@ -0,0 +1,127 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package index + +import ( + "github.com/m3db/m3/src/x/pool" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// AggregateResultsEntryArrayPool provides a pool for aggregateResultsEntry slices. +type AggregateResultsEntryArrayPool interface { + // Init initializes the array pool, it needs to be called + // before Get/Put use. + Init() + + // Get returns the a slice from the pool. + Get() []AggregateResultsEntry + + // Put returns the provided slice to the pool. + Put(elems []AggregateResultsEntry) +} + +type AggregateResultsEntryFinalizeFn func([]AggregateResultsEntry) []AggregateResultsEntry + +type AggregateResultsEntryArrayPoolOpts struct { + Options pool.ObjectPoolOptions + Capacity int + MaxCapacity int + FinalizeFn AggregateResultsEntryFinalizeFn +} + +type AggregateResultsEntryArrPool struct { + opts AggregateResultsEntryArrayPoolOpts + pool pool.ObjectPool +} + +func NewAggregateResultsEntryArrayPool(opts AggregateResultsEntryArrayPoolOpts) AggregateResultsEntryArrayPool { + if opts.FinalizeFn == nil { + opts.FinalizeFn = defaultAggregateResultsEntryFinalizerFn + } + p := pool.NewObjectPool(opts.Options) + return &AggregateResultsEntryArrPool{opts, p} +} + +func (p *AggregateResultsEntryArrPool) Init() { + p.pool.Init(func() interface{} { + return make([]AggregateResultsEntry, 0, p.opts.Capacity) + }) +} + +func (p *AggregateResultsEntryArrPool) Get() []AggregateResultsEntry { + return p.pool.Get().([]AggregateResultsEntry) +} + +func (p *AggregateResultsEntryArrPool) Put(arr []AggregateResultsEntry) { + arr = p.opts.FinalizeFn(arr) + if max := p.opts.MaxCapacity; max > 0 && cap(arr) > max { + return + } + p.pool.Put(arr) +} + +func defaultAggregateResultsEntryFinalizerFn(elems []AggregateResultsEntry) []AggregateResultsEntry { + var empty AggregateResultsEntry + for i := range elems { + elems[i] = empty + } + elems = elems[:0] + return elems +} + +type AggregateResultsEntryArr []AggregateResultsEntry + +func (elems AggregateResultsEntryArr) grow(n int) []AggregateResultsEntry { + if cap(elems) < n { + elems = make([]AggregateResultsEntry, n) + } + elems = elems[:n] + // following compiler optimized memcpy impl + // https://github.com/golang/go/wiki/CompilerOptimizations#optimized-memclr + var empty AggregateResultsEntry + for i := range elems { + elems[i] = empty + } + return elems +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_map_gen.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_map_gen.go new file mode 100644 index 00000000..a7537968 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_map_gen.go @@ -0,0 +1,299 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package index + +import ( + "github.com/m3db/m3/src/x/ident" +) + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// AggregateResultsMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type AggregateResultsMapHash uint64 + +// AggregateResultsMapHashFn is the hash function to execute when hashing a key. +type AggregateResultsMapHashFn func(ident.ID) AggregateResultsMapHash + +// AggregateResultsMapEqualsFn is the equals key function to execute when detecting equality of a key. +type AggregateResultsMapEqualsFn func(ident.ID, ident.ID) bool + +// AggregateResultsMapCopyFn is the copy key function to execute when copying the key. +type AggregateResultsMapCopyFn func(ident.ID) ident.ID + +// AggregateResultsMapFinalizeFn is the finalize key function to execute when finished with a key. +type AggregateResultsMapFinalizeFn func(ident.ID) + +// AggregateResultsMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// AggregateResultsMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type AggregateResultsMap struct { + _AggregateResultsMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[AggregateResultsMapHash]AggregateResultsMapEntry +} + +// _AggregateResultsMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _AggregateResultsMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash AggregateResultsMapHashFn + // equals is the equals key function to execute when detecting equality. + equals AggregateResultsMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy AggregateResultsMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize AggregateResultsMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// AggregateResultsMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type AggregateResultsMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _AggregateResultsMapKey + // value type stored + value AggregateValues +} + +type _AggregateResultsMapKey struct { + key ident.ID + finalize bool +} + +// Key returns the map entry key. +func (e AggregateResultsMapEntry) Key() ident.ID { + return e.key.key +} + +// Value returns the map entry value. +func (e AggregateResultsMapEntry) Value() AggregateValues { + return e.value +} + +// _AggregateResultsMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _AggregateResultsMapAlloc(opts _AggregateResultsMapOptions) *AggregateResultsMap { + m := &AggregateResultsMap{_AggregateResultsMapOptions: opts} + m.Reallocate() + return m +} + +func (m *AggregateResultsMap) newMapKey(k ident.ID, opts _AggregateResultsMapKeyOptions) _AggregateResultsMapKey { + key := _AggregateResultsMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *AggregateResultsMap) removeMapKey(hash AggregateResultsMapHash, key _AggregateResultsMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *AggregateResultsMap) Get(k ident.ID) (AggregateValues, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty AggregateValues + return empty, false +} + +// Set will set the value for an identifier. +func (m *AggregateResultsMap) Set(k ident.ID, v AggregateValues) { + m.set(k, v, _AggregateResultsMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// AggregateResultsMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type AggregateResultsMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *AggregateResultsMap) SetUnsafe(k ident.ID, v AggregateValues, opts AggregateResultsMapSetUnsafeOptions) { + m.set(k, v, _AggregateResultsMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _AggregateResultsMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *AggregateResultsMap) set(k ident.ID, v AggregateValues, opts _AggregateResultsMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = AggregateResultsMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = AggregateResultsMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *AggregateResultsMap) Iter() map[AggregateResultsMapHash]AggregateResultsMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *AggregateResultsMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *AggregateResultsMap) Contains(k ident.ID) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *AggregateResultsMap) Delete(k ident.ID) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *AggregateResultsMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *AggregateResultsMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[AggregateResultsMapHash]AggregateResultsMapEntry, m.initialSize) + } else { + m.lookup = make(map[AggregateResultsMapHash]AggregateResultsMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_new_map.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_new_map.go new file mode 100644 index 00000000..cdb57653 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_new_map.go @@ -0,0 +1,49 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "github.com/m3db/m3/src/x/ident" + + "github.com/cespare/xxhash/v2" +) + +const ( + defaultInitialAggregatedResultsMapSize = 10 +) + +func newAggregateResultsMap(idPool ident.Pool) *AggregateResultsMap { + return _AggregateResultsMapAlloc(_AggregateResultsMapOptions{ + hash: func(k ident.ID) AggregateResultsMapHash { + return AggregateResultsMapHash(xxhash.Sum64(k.Bytes())) + }, + equals: func(x, y ident.ID) bool { + return x.Equal(y) + }, + copy: func(k ident.ID) ident.ID { + return idPool.Clone(k) + }, + finalize: func(k ident.ID) { + k.Finalize() + }, + initialSize: defaultInitialAggregatedResultsMapSize, + }) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_pool.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_pool.go new file mode 100644 index 00000000..152f64c1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_results_pool.go @@ -0,0 +1,47 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import "github.com/m3db/m3/src/x/pool" + +type aggregateResultsPool struct { + pool pool.ObjectPool +} + +// NewAggregateResultsPool creates a new AggregateResultsPool. +func NewAggregateResultsPool( + opts pool.ObjectPoolOptions) AggregateResultsPool { + return &aggregateResultsPool{pool: pool.NewObjectPool(opts)} +} + +func (p *aggregateResultsPool) Init(alloc AggregateResultsAllocator) { + p.pool.Init(func() interface{} { + return alloc() + }) +} + +func (p *aggregateResultsPool) Get() AggregateResults { + return p.pool.Get().(AggregateResults) +} + +func (p *aggregateResultsPool) Put(value AggregateResults) { + p.pool.Put(value) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values.go new file mode 100644 index 00000000..7b7917f8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values.go @@ -0,0 +1,100 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "github.com/m3db/m3/src/x/ident" +) + +// AggregateValues is a collection of unique identity values backed by a pool. +// NB: there are no synchronization guarantees provided by default. +type AggregateValues struct { + hasValues bool + valuesMap *AggregateValuesMap + pool AggregateValuesPool +} + +// NewAggregateValues returns a new AggregateValues object. +func NewAggregateValues(opts Options) AggregateValues { + return AggregateValues{ + hasValues: true, + valuesMap: NewAggregateValuesMap(opts.IdentifierPool()), + pool: opts.AggregateValuesPool(), + } +} + +// MustNewAggregateValues returns a new AggregateValues object with provided +// idents added in. +func MustNewAggregateValues(opts Options, ids ...ident.ID) AggregateValues { + m := NewAggregateValues(opts) + for _, id := range ids { + if err := m.addValue(id); err != nil { + panic(err.Error()) + } + } + return m +} + +// HasValues returns true if this has an aggregate values map. +func (v *AggregateValues) HasValues() bool { + return v.hasValues +} + +// Map returns a map from an ID -> empty struct to signify existence of the +// ID in the set this structure represents. +func (v *AggregateValues) Map() *AggregateValuesMap { + return v.valuesMap +} + +// Size returns the number of IDs tracked. +func (v *AggregateValues) Size() int { + if !v.hasValues { + return 0 + } + + return v.valuesMap.Len() +} + +func (v *AggregateValues) finalize() { + // NB: if this aggregate values has no values, no need to finalize. + if !v.hasValues { + return + } + + // NB: resetting the value map will already finalize all copies of the keys. + v.valuesMap.Reset() + + if v.pool == nil { + return + } + + v.pool.Put(*v) +} + +func (v *AggregateValues) addValue(value ident.ID) error { + // NB(r): Allow for empty values to be set, an empty string + // is still different from not having the field at all. + bytesID := ident.BytesID(value.Bytes()) + + // NB: fine to overwrite the values here. + v.valuesMap.Set(bytesID, struct{}{}) + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_map_gen.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_map_gen.go new file mode 100644 index 00000000..8c32d74e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_map_gen.go @@ -0,0 +1,275 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package index + +import ( + "github.com/m3db/m3/src/x/ident" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// AggregateValuesMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type AggregateValuesMapHash uint64 + +// AggregateValuesMapHashFn is the hash function to execute when hashing a key. +type AggregateValuesMapHashFn func(ident.ID) AggregateValuesMapHash + +// AggregateValuesMapEqualsFn is the equals key function to execute when detecting equality of a key. +type AggregateValuesMapEqualsFn func(ident.ID, ident.ID) bool + +// AggregateValuesMapCopyFn is the copy key function to execute when copying the key. +type AggregateValuesMapCopyFn func(ident.ID) ident.ID + +// AggregateValuesMapFinalizeFn is the finalize key function to execute when finished with a key. +type AggregateValuesMapFinalizeFn func(ident.ID) + +// AggregateValuesMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// AggregateValuesMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type AggregateValuesMap struct { + _AggregateValuesMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[AggregateValuesMapHash]AggregateValuesMapEntry +} + +// _AggregateValuesMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _AggregateValuesMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash AggregateValuesMapHashFn + // equals is the equals key function to execute when detecting equality. + equals AggregateValuesMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy AggregateValuesMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize AggregateValuesMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// AggregateValuesMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type AggregateValuesMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _AggregateValuesMapKey + // value type stored + value struct{} +} + +type _AggregateValuesMapKey struct { + key ident.ID + finalize bool +} + +// Key returns the map entry key. +func (e AggregateValuesMapEntry) Key() ident.ID { + return e.key.key +} + +// Value returns the map entry value. +func (e AggregateValuesMapEntry) Value() struct{} { + return e.value +} + +// _AggregateValuesMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _AggregateValuesMapAlloc(opts _AggregateValuesMapOptions) *AggregateValuesMap { + m := &AggregateValuesMap{_AggregateValuesMapOptions: opts} + m.Reallocate() + return m +} + +func (m *AggregateValuesMap) newMapKey(k ident.ID, opts _AggregateValuesMapKeyOptions) _AggregateValuesMapKey { + key := _AggregateValuesMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *AggregateValuesMap) removeMapKey(hash AggregateValuesMapHash, key _AggregateValuesMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *AggregateValuesMap) Get(k ident.ID) (struct{}, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty struct{} + return empty, false +} + +// Set will set the value for an identifier. +func (m *AggregateValuesMap) Set(k ident.ID, v struct{}) { + m.set(k, v, _AggregateValuesMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// AggregateValuesMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type AggregateValuesMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *AggregateValuesMap) SetUnsafe(k ident.ID, v struct{}, opts AggregateValuesMapSetUnsafeOptions) { + m.set(k, v, _AggregateValuesMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _AggregateValuesMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *AggregateValuesMap) set(k ident.ID, v struct{}, opts _AggregateValuesMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = AggregateValuesMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = AggregateValuesMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *AggregateValuesMap) Iter() map[AggregateValuesMapHash]AggregateValuesMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *AggregateValuesMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *AggregateValuesMap) Contains(k ident.ID) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *AggregateValuesMap) Delete(k ident.ID) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *AggregateValuesMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *AggregateValuesMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[AggregateValuesMapHash]AggregateValuesMapEntry, m.initialSize) + } else { + m.lookup = make(map[AggregateValuesMapHash]AggregateValuesMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_new_map.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_new_map.go new file mode 100644 index 00000000..70b80e2a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_new_map.go @@ -0,0 +1,51 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "github.com/m3db/m3/src/x/ident" + + "github.com/cespare/xxhash/v2" +) + +const ( + defaultInitialAggregatedValuesMapSize = 10 +) + +// NewAggregateValuesMap builds an AggregateValuesMap, which is primarily used +// for checking for existence of particular ident.IDs. +func NewAggregateValuesMap(idPool ident.Pool) *AggregateValuesMap { + return _AggregateValuesMapAlloc(_AggregateValuesMapOptions{ + hash: func(k ident.ID) AggregateValuesMapHash { + return AggregateValuesMapHash(xxhash.Sum64(k.Bytes())) + }, + equals: func(x, y ident.ID) bool { + return x.Equal(y) + }, + copy: func(k ident.ID) ident.ID { + return idPool.Clone(k) + }, + finalize: func(k ident.ID) { + k.Finalize() + }, + initialSize: defaultInitialAggregatedValuesMapSize, + }) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_pool.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_pool.go new file mode 100644 index 00000000..49150cce --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregate_values_pool.go @@ -0,0 +1,47 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import "github.com/m3db/m3/src/x/pool" + +type aggregateValuesPool struct { + pool pool.ObjectPool +} + +// NewAggregateValuesPool creates a new AggregateValuesPool. +func NewAggregateValuesPool( + opts pool.ObjectPoolOptions) AggregateValuesPool { + return &aggregateValuesPool{pool: pool.NewObjectPool(opts)} +} + +func (p *aggregateValuesPool) Init(alloc AggregateValuesAllocator) { + p.pool.Init(func() interface{} { + return alloc() + }) +} + +func (p *aggregateValuesPool) Get() AggregateValues { + return p.pool.Get().(AggregateValues) +} + +func (p *aggregateValuesPool) Put(value AggregateValues) { + p.pool.Put(value) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregated_term_filter.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregated_term_filter.go new file mode 100644 index 00000000..e075d80e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/aggregated_term_filter.go @@ -0,0 +1,77 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "bytes" + "sort" +) + +// Allow returns true if the given term satisfies the filter. +func (f AggregateFieldFilter) Allow(term []byte) bool { + if len(f) == 0 { + // NB: if filter is empty, all values are valid. + return true + } + + for _, allowed := range f { + if bytes.Equal(term, allowed) { + return true + } + } + + return false +} + +// AddIfMissing adds the provided field if it's missing from the filter. +func (f AggregateFieldFilter) AddIfMissing(field []byte) AggregateFieldFilter { + for _, fi := range f { + if bytes.Equal(fi, field) { + return f + } + } + f = append(f, field) + return f +} + +// SortAndDedupe sorts and de-dupes the fields in the filter. +func (f AggregateFieldFilter) SortAndDedupe() AggregateFieldFilter { + // short-circuit if possible. + if len(f) <= 1 { + return f + } + // sort the provided filter fields in order. + sort.Slice(f, func(i, j int) bool { + return bytes.Compare(f[i], f[j]) < 0 + }) + // ensure successive elements are not the same. + deduped := make(AggregateFieldFilter, 0, len(f)) + if len(f) > 0 { + deduped = append(deduped, f[0]) + } + for i := 1; i < len(f); i++ { + if bytes.Equal(f[i-1], f[i]) { + continue + } + deduped = append(deduped, f[i]) + } + return deduped +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/allocator.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/allocator.go new file mode 100644 index 00000000..63451394 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/allocator.go @@ -0,0 +1,37 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/index/segment/builder" +) + +// NewBootstrapResultDocumentsBuilderAllocator returns a default mutable segment +// allocator for a bootstrap result index block given index options. +func NewBootstrapResultDocumentsBuilderAllocator( + opts Options, +) result.DocumentsBuilderAllocator { + return func() (segment.DocumentsBuilder, error) { + return builder.NewBuilderFromDocuments(opts.SegmentBuilderOptions()) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/block.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/block.go new file mode 100644 index 00000000..2fab38bd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/block.go @@ -0,0 +1,1187 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "bytes" + "errors" + "fmt" + "io" + "sync" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" + "github.com/m3db/m3/src/dbnode/storage/limits" + "github.com/m3db/m3/src/dbnode/tracepoint" + "github.com/m3db/m3/src/m3ninx/doc" + m3ninxindex "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/index/segment/fst" + "github.com/m3db/m3/src/m3ninx/persist" + "github.com/m3db/m3/src/m3ninx/search" + "github.com/m3db/m3/src/m3ninx/search/executor" + "github.com/m3db/m3/src/x/context" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/resource" + xtime "github.com/m3db/m3/src/x/time" + + "github.com/opentracing/opentracing-go" + opentracinglog "github.com/opentracing/opentracing-go/log" + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +var ( + // ErrUnableToQueryBlockClosed is returned when querying closed block. + ErrUnableToQueryBlockClosed = errors.New("unable to query, index block is closed") + // ErrUnableReportStatsBlockClosed is returned from Stats when the block is closed. + ErrUnableReportStatsBlockClosed = errors.New("unable to report stats, block is closed") + + errUnableToWriteBlockClosed = errors.New("unable to write, index block is closed") + errUnableToWriteBlockSealed = errors.New("unable to write, index block is sealed") + errUnableToBootstrapBlockClosed = errors.New("unable to bootstrap, block is closed") + errUnableToTickBlockClosed = errors.New("unable to tick, block is closed") + errBlockAlreadyClosed = errors.New("unable to close, block already closed") + errCancelledQuery = errors.New("query was cancelled") + + errUnableToSealBlockIllegalStateFmtString = "unable to seal, index block state: %v" + errUnableToWriteBlockUnknownStateFmtString = "unable to write, unknown index block state: %v" +) + +type blockState uint + +const ( + blockStateOpen blockState = iota + blockStateSealed + blockStateClosed + + defaultQueryDocsBatchSize = 256 + defaultAggregateResultsEntryBatchSize = 256 + + compactDebugLogEvery = 1 // Emit debug log for every compaction + + mmapIndexBlockName = "mmap.index.block" +) + +func (s blockState) String() string { + switch s { + case blockStateOpen: + return "open" + case blockStateSealed: + return "sealed" + case blockStateClosed: + return "closed" + } + return "unknown" +} + +type newExecutorFn func() (search.Executor, error) + +type shardRangesSegmentsByVolumeType map[persist.IndexVolumeType][]blockShardRangesSegments + +func (s shardRangesSegmentsByVolumeType) forEachSegment(cb func(segment segment.Segment) error) error { + return s.forEachSegmentGroup(func(group blockShardRangesSegments) error { + for _, seg := range group.segments { + if err := cb(seg); err != nil { + return err + } + } + return nil + }) +} + +func (s shardRangesSegmentsByVolumeType) forEachSegmentGroup(cb func(group blockShardRangesSegments) error) error { + for _, shardRangesSegments := range s { + for _, group := range shardRangesSegments { + if err := cb(group); err != nil { + return err + } + } + } + return nil +} + +// nolint: maligned +type block struct { + sync.RWMutex + + state blockState + + mutableSegments *mutableSegments + coldMutableSegments []*mutableSegments + shardRangesSegmentsByVolumeType shardRangesSegmentsByVolumeType + newFieldsAndTermsIteratorFn newFieldsAndTermsIteratorFn + newExecutorWithRLockFn newExecutorFn + blockStart time.Time + blockEnd time.Time + blockSize time.Duration + opts Options + iopts instrument.Options + blockOpts BlockOptions + nsMD namespace.Metadata + namespaceRuntimeOptsMgr namespace.RuntimeOptionsManager + queryLimits limits.QueryLimits + docsLimit limits.LookbackLimit + + metrics blockMetrics + logger *zap.Logger +} + +type blockMetrics struct { + rotateActiveSegment tally.Counter + rotateActiveSegmentAge tally.Timer + rotateActiveSegmentSize tally.Histogram + segmentFreeMmapSuccess tally.Counter + segmentFreeMmapError tally.Counter + segmentFreeMmapSkipNotImmutable tally.Counter +} + +func newBlockMetrics(s tally.Scope) blockMetrics { + segmentFreeMmap := "segment-free-mmap" + return blockMetrics{ + rotateActiveSegment: s.Counter("rotate-active-segment"), + rotateActiveSegmentAge: s.Timer("rotate-active-segment-age"), + rotateActiveSegmentSize: s.Histogram("rotate-active-segment-size", + append(tally.ValueBuckets{0}, tally.MustMakeExponentialValueBuckets(100, 2, 16)...)), + segmentFreeMmapSuccess: s.Tagged(map[string]string{ + "result": "success", + "skip_type": "none", + }).Counter(segmentFreeMmap), + segmentFreeMmapError: s.Tagged(map[string]string{ + "result": "error", + "skip_type": "none", + }).Counter(segmentFreeMmap), + segmentFreeMmapSkipNotImmutable: s.Tagged(map[string]string{ + "result": "skip", + "skip_type": "not-immutable", + }).Counter(segmentFreeMmap), + } +} + +// blockShardsSegments is a collection of segments that has a mapping of what shards +// and time ranges they completely cover, this can only ever come from computing +// from data that has come from shards, either on an index flush or a bootstrap. +type blockShardRangesSegments struct { + shardTimeRanges result.ShardTimeRanges + segments []segment.Segment +} + +// BlockOptions is a set of options used when constructing an index block. +type BlockOptions struct { + ForegroundCompactorMmapDocsData bool + BackgroundCompactorMmapDocsData bool +} + +// NewBlockFn is a new block constructor. +type NewBlockFn func( + blockStart time.Time, + md namespace.Metadata, + blockOpts BlockOptions, + namespaceRuntimeOptsMgr namespace.RuntimeOptionsManager, + opts Options, +) (Block, error) + +// Ensure NewBlock implements NewBlockFn. +var _ NewBlockFn = NewBlock + +// NewBlock returns a new Block, representing a complete reverse index for the +// duration of time specified. It is backed by one or more segments. +func NewBlock( + blockStart time.Time, + md namespace.Metadata, + blockOpts BlockOptions, + namespaceRuntimeOptsMgr namespace.RuntimeOptionsManager, + opts Options, +) (Block, error) { + blockSize := md.Options().IndexOptions().BlockSize() + iopts := opts.InstrumentOptions() + scope := iopts.MetricsScope().SubScope("index").SubScope("block") + iopts = iopts.SetMetricsScope(scope) + segs := newMutableSegments( + blockStart, + opts, + blockOpts, + namespaceRuntimeOptsMgr, + iopts, + ) + // NB(bodu): The length of coldMutableSegments is always at least 1. + coldSegs := []*mutableSegments{ + newMutableSegments( + blockStart, + opts, + blockOpts, + namespaceRuntimeOptsMgr, + iopts, + ), + } + b := &block{ + state: blockStateOpen, + blockStart: blockStart, + blockEnd: blockStart.Add(blockSize), + blockSize: blockSize, + blockOpts: blockOpts, + mutableSegments: segs, + coldMutableSegments: coldSegs, + shardRangesSegmentsByVolumeType: make(shardRangesSegmentsByVolumeType), + opts: opts, + iopts: iopts, + nsMD: md, + namespaceRuntimeOptsMgr: namespaceRuntimeOptsMgr, + metrics: newBlockMetrics(scope), + logger: iopts.Logger(), + queryLimits: opts.QueryLimits(), + docsLimit: opts.QueryLimits().DocsLimit(), + } + b.newFieldsAndTermsIteratorFn = newFieldsAndTermsIterator + b.newExecutorWithRLockFn = b.executorWithRLock + + return b, nil +} + +func (b *block) StartTime() time.Time { + return b.blockStart +} + +func (b *block) EndTime() time.Time { + return b.blockEnd +} + +func (b *block) WriteBatch(inserts *WriteBatch) (WriteBatchResult, error) { + b.RLock() + if !b.writesAcceptedWithRLock() { + b.RUnlock() + return b.writeBatchResult(inserts, b.writeBatchErrorInvalidState(b.state)) + } + if b.state == blockStateSealed { + coldBlock := b.coldMutableSegments[len(b.coldMutableSegments)-1] + b.RUnlock() + return b.writeBatchResult(inserts, coldBlock.WriteBatch(inserts)) + } + b.RUnlock() + return b.writeBatchResult(inserts, b.mutableSegments.WriteBatch(inserts)) +} + +func (b *block) writeBatchResult( + inserts *WriteBatch, + err error, +) (WriteBatchResult, error) { + if err == nil { + inserts.MarkUnmarkedEntriesSuccess() + return WriteBatchResult{ + NumSuccess: int64(inserts.Len()), + }, nil + } + + partialErr, ok := err.(*m3ninxindex.BatchPartialError) + if !ok { + // NB: marking all the inserts as failure, cause we don't know which ones failed. + inserts.MarkUnmarkedEntriesError(err) + return WriteBatchResult{NumError: int64(inserts.Len())}, err + } + + numErr := len(partialErr.Errs()) + for _, err := range partialErr.Errs() { + // Avoid marking these as success. + inserts.MarkUnmarkedEntryError(err.Err, err.Idx) + } + + // Mark all non-error inserts success, so we don't repeatedly index them. + inserts.MarkUnmarkedEntriesSuccess() + return WriteBatchResult{ + NumSuccess: int64(inserts.Len() - numErr), + NumError: int64(numErr), + }, partialErr +} + +func (b *block) writesAcceptedWithRLock() bool { + if b.state == blockStateOpen { + return true + } + return b.state == blockStateSealed && + b.nsMD.Options().ColdWritesEnabled() +} + +func (b *block) executorWithRLock() (search.Executor, error) { + readers, err := b.segmentReadersWithRLock() + if err != nil { + return nil, err + } + + indexReaders := make([]m3ninxindex.Reader, 0, len(readers)) + for _, r := range readers { + indexReaders = append(indexReaders, r) + } + + return executor.NewExecutor(indexReaders), nil +} + +func (b *block) segmentReadersWithRLock() ([]segment.Reader, error) { + expectedReaders := b.mutableSegments.Len() + for _, coldSeg := range b.coldMutableSegments { + expectedReaders += coldSeg.Len() + } + b.shardRangesSegmentsByVolumeType.forEachSegmentGroup(func(group blockShardRangesSegments) error { + expectedReaders += len(group.segments) + return nil + }) + + var ( + readers = make([]segment.Reader, 0, expectedReaders) + success = false + err error + ) + defer func() { + // Cleanup in case any of the readers below fail. + if !success { + for _, reader := range readers { + reader.Close() + } + } + }() + + // Add mutable segments. + readers, err = b.mutableSegments.AddReaders(readers) + if err != nil { + return nil, err + } + + // Add cold mutable segments. + for _, coldSeg := range b.coldMutableSegments { + readers, err = coldSeg.AddReaders(readers) + if err != nil { + return nil, err + } + } + + // Loop over the segments associated to shard time ranges. + if err := b.shardRangesSegmentsByVolumeType.forEachSegment(func(seg segment.Segment) error { + reader, err := seg.Reader() + if err != nil { + return err + } + readers = append(readers, reader) + return nil + }); err != nil { + return nil, err + } + + success = true + return readers, nil +} + +// Query acquires a read lock on the block so that the segments +// are guaranteed to not be freed/released while accumulating results. +// This allows references to the mmap'd segment data to be accumulated +// and then copied into the results before this method returns (it is not +// safe to return docs directly from the segments from this method, the +// results datastructure is used to copy it every time documents are added +// to the results datastructure). +func (b *block) Query( + ctx context.Context, + cancellable *resource.CancellableLifetime, + query Query, + opts QueryOptions, + results BaseResults, + logFields []opentracinglog.Field, +) (bool, error) { + ctx, sp := ctx.StartTraceSpan(tracepoint.BlockQuery) + sp.LogFields(logFields...) + defer sp.Finish() + + exhaustive, err := b.queryWithSpan(ctx, cancellable, query, opts, results, sp, logFields) + if err != nil { + sp.LogFields(opentracinglog.Error(err)) + } + + return exhaustive, err +} + +func (b *block) queryWithSpan( + ctx context.Context, + cancellable *resource.CancellableLifetime, + query Query, + opts QueryOptions, + results BaseResults, + sp opentracing.Span, + logFields []opentracinglog.Field, +) (bool, error) { + b.RLock() + defer b.RUnlock() + + if b.state == blockStateClosed { + return false, ErrUnableToQueryBlockClosed + } + + exec, err := b.newExecutorWithRLockFn() + if err != nil { + return false, err + } + + // Make sure if we don't register to close the executor later + // that we close it before returning. + execCloseRegistered := false + defer func() { + if !execCloseRegistered { + b.closeAsync(exec) + } + }() + + // FOLLOWUP(prateek): push down QueryOptions to restrict results + iter, err := exec.Execute(query.Query.SearchQuery()) + if err != nil { + return false, err + } + + // Register the executor to close when context closes + // so can avoid copying the results into the map and just take + // references to it. + // NB(r): Needs to still be a valid query otherwise + // the context could be invalid because the caller early returned + // which means it can't be used for finalization any longer. + valid := cancellable.TryCheckout() + if !valid { + return false, errCancelledQuery + } + execCloseRegistered = true // Make sure to not locally close it. + ctx.RegisterFinalizer(resource.FinalizerFn(func() { + b.closeAsync(exec) + })) + cancellable.ReleaseCheckout() + + var ( + iterCloser = safeCloser{closable: iter} + size = results.Size() + docsCount = results.TotalDocsCount() + docsPool = b.opts.DocumentArrayPool() + batch = docsPool.Get() + batchSize = cap(batch) + ) + if batchSize == 0 { + batchSize = defaultQueryDocsBatchSize + } + + // Register local data structures that need closing. + defer func() { + iterCloser.Close() + docsPool.Put(batch) + }() + + for iter.Next() { + if opts.SeriesLimitExceeded(size) || opts.DocsLimitExceeded(docsCount) { + break + } + + batch = append(batch, iter.Current()) + if len(batch) < batchSize { + continue + } + + batch, size, docsCount, err = b.addQueryResults(cancellable, results, batch) + if err != nil { + return false, err + } + } + + // Add last batch to results if remaining. + if len(batch) > 0 { + batch, size, docsCount, err = b.addQueryResults(cancellable, results, batch) + if err != nil { + return false, err + } + } + + if err := iter.Err(); err != nil { + return false, err + } + if err := iterCloser.Close(); err != nil { + return false, err + } + + exhaustive := !opts.SeriesLimitExceeded(size) && !opts.DocsLimitExceeded(docsCount) + return exhaustive, nil +} + +func (b *block) closeAsync(closer io.Closer) { + if err := closer.Close(); err != nil { + // Note: This only happens if closing the readers isn't clean. + b.logger.Error("could not close query index block resource", zap.Error(err)) + } +} + +func (b *block) addQueryResults( + cancellable *resource.CancellableLifetime, + results BaseResults, + batch []doc.Document, +) ([]doc.Document, int, int, error) { + // update recently queried docs to monitor memory. + if err := b.docsLimit.Inc(len(batch)); err != nil { + return batch, 0, 0, err + } + + // checkout the lifetime of the query before adding results. + queryValid := cancellable.TryCheckout() + if !queryValid { + // query not valid any longer, do not add results and return early. + return batch, 0, 0, errCancelledQuery + } + + // try to add the docs to the resource. + size, docsCount, err := results.AddDocuments(batch) + + // immediately release the checkout on the lifetime of query. + cancellable.ReleaseCheckout() + + // reset batch. + var emptyDoc doc.Document + for i := range batch { + batch[i] = emptyDoc + } + batch = batch[:0] + + // return results. + return batch, size, docsCount, err +} + +// Aggregate acquires a read lock on the block so that the segments +// are guaranteed to not be freed/released while accumulating results. +// NB: Aggregate is an optimization of the general aggregate Query approach +// for the case when we can skip going to raw documents, and instead rely on +// pre-aggregated results via the FST underlying the index. +func (b *block) Aggregate( + ctx context.Context, + cancellable *resource.CancellableLifetime, + opts QueryOptions, + results AggregateResults, + logFields []opentracinglog.Field, +) (bool, error) { + ctx, sp := ctx.StartTraceSpan(tracepoint.BlockAggregate) + sp.LogFields(logFields...) + defer sp.Finish() + + exhaustive, err := b.aggregateWithSpan(ctx, cancellable, opts, results, sp) + if err != nil { + sp.LogFields(opentracinglog.Error(err)) + } + + return exhaustive, err +} + +func (b *block) aggregateWithSpan( + ctx context.Context, + cancellable *resource.CancellableLifetime, + opts QueryOptions, + results AggregateResults, + sp opentracing.Span, +) (bool, error) { + b.RLock() + defer b.RUnlock() + + if b.state == blockStateClosed { + return false, ErrUnableToQueryBlockClosed + } + + aggOpts := results.AggregateResultsOptions() + iterateTerms := aggOpts.Type == AggregateTagNamesAndValues + iterateOpts := fieldsAndTermsIteratorOpts{ + restrictByQuery: aggOpts.RestrictByQuery, + iterateTerms: iterateTerms, + allowFn: func(field []byte) bool { + // skip any field names that we shouldn't allow. + if bytes.Equal(field, doc.IDReservedFieldName) { + return false + } + return aggOpts.FieldFilter.Allow(field) + }, + fieldIterFn: func(r segment.Reader) (segment.FieldsIterator, error) { + // NB(prateek): we default to using the regular (FST) fields iterator + // unless we have a predefined list of fields we know we need to restrict + // our search to, in which case we iterate that list and check if known values + // in the FST to restrict our search. This is going to be significantly faster + // while len(FieldsFilter) < 5-10 elements; + // but there will exist a ratio between the len(FieldFilter) v size(FST) after which + // iterating the entire FST is faster. + // Here, we chose to avoid factoring that in to our choice because almost all input + // to this function is expected to have (FieldsFilter) pretty small. If that changes + // in the future, we can revisit this. + if len(aggOpts.FieldFilter) == 0 { + return r.Fields() + } + return newFilterFieldsIterator(r, aggOpts.FieldFilter) + }, + } + + iter, err := b.newFieldsAndTermsIteratorFn(nil, iterateOpts) + if err != nil { + return false, err + } + + var ( + size = results.Size() + docsCount = results.TotalDocsCount() + batch = b.opts.AggregateResultsEntryArrayPool().Get() + batchSize = cap(batch) + iterClosed = false // tracking whether we need to free the iterator at the end. + ) + if batchSize == 0 { + batchSize = defaultAggregateResultsEntryBatchSize + } + + // cleanup at the end + defer func() { + b.opts.AggregateResultsEntryArrayPool().Put(batch) + if !iterClosed { + iter.Close() + } + }() + + readers, err := b.segmentReadersWithRLock() + if err != nil { + return false, err + } + + // Make sure to close readers at end of query since results can + // include references to the underlying bytes from the index segment + // read by the readers. + for _, reader := range readers { + reader := reader // Capture for inline function. + ctx.RegisterFinalizer(resource.FinalizerFn(func() { + b.closeAsync(reader) + })) + } + + for _, reader := range readers { + if opts.SeriesLimitExceeded(size) || opts.DocsLimitExceeded(docsCount) { + break + } + + err = iter.Reset(reader, iterateOpts) + if err != nil { + return false, err + } + iterClosed = false // only once the iterator has been successfully Reset(). + + for iter.Next() { + if opts.SeriesLimitExceeded(size) || opts.DocsLimitExceeded(docsCount) { + break + } + + field, term := iter.Current() + batch = b.appendFieldAndTermToBatch(batch, field, term, iterateTerms) + if len(batch) < batchSize { + continue + } + + batch, size, docsCount, err = b.addAggregateResults(cancellable, results, batch) + if err != nil { + return false, err + } + } + + if err := iter.Err(); err != nil { + return false, err + } + + iterClosed = true + if err := iter.Close(); err != nil { + return false, err + } + } + + // Add last batch to results if remaining. + if len(batch) > 0 { + batch, size, docsCount, err = b.addAggregateResults(cancellable, results, batch) + if err != nil { + return false, err + } + } + + exhaustive := !opts.SeriesLimitExceeded(size) && !opts.DocsLimitExceeded(docsCount) + return exhaustive, nil +} + +func (b *block) appendFieldAndTermToBatch( + batch []AggregateResultsEntry, + field, term []byte, + includeTerms bool, +) []AggregateResultsEntry { + // NB(prateek): we make a copy of the (field, term) entries returned + // by the iterator during traversal, because the []byte are only valid per entry during + // the traversal (i.e. calling Next() invalidates the []byte). We choose to do this + // instead of checking if the entry is required (duplicates may exist in the results map + // already), as it reduces contention on the map itself. Further, the ownership of these + // idents is transferred to the results map, which either hangs on to them (if they are new), + // or finalizes them if they are duplicates. + var ( + entry AggregateResultsEntry + lastField []byte + lastFieldIsValid bool + reuseLastEntry bool + ) + // we are iterating multiple segments so we may receive duplicates (same field/term), but + // as we are iterating one segment at a time, and because the underlying index structures + // are FSTs, we rely on the fact that iterator traversal is in order to avoid creating duplicate + // entries for the same fields, by checking the last batch entry to see if the bytes are + // the same. + // It's easier to consider an example, say we have a segment with fields/terms: + // (f1, t1), (f1, t2), ..., (fn, t1), ..., (fn, tn) + // as we iterate in order, we receive (f1, t1) and then (f1, t2) we can avoid the repeated f1 + // allocation if the previous entry has the same value. + // NB: this isn't strictly true because when we switch iterating between segments, + // the fields/terms switch in an order which doesn't have to be strictly lexicographic. In that + // instance however, the only downside is we would be allocating more. i.e. this is just an + // optimisation, it doesn't affect correctness. + if len(batch) > 0 { + lastFieldIsValid = true + lastField = batch[len(batch)-1].Field.Bytes() + } + if lastFieldIsValid && bytes.Equal(lastField, field) { + reuseLastEntry = true + entry = batch[len(batch)-1] // avoid alloc cause we already have the field + } else { + // allocate id because this is the first time we've seen it + // NB(r): Iterating fields FST, this byte slice is only temporarily available + // since we are pushing/popping characters from the stack as we iterate + // the fields FST and reusing the same byte slice. + entry.Field = b.pooledID(field) + } + + if includeTerms { + // terms are always new (as far we know without checking the map for duplicates), so we allocate + // NB(r): Iterating terms FST, this byte slice is only temporarily available + // since we are pushing/popping characters from the stack as we iterate + // the terms FST and reusing the same byte slice. + entry.Terms = append(entry.Terms, b.pooledID(term)) + } + + if reuseLastEntry { + batch[len(batch)-1] = entry + } else { + batch = append(batch, entry) + } + return batch +} + +func (b *block) pooledID(id []byte) ident.ID { + data := b.opts.CheckedBytesPool().Get(len(id)) + data.IncRef() + data.AppendAll(id) + data.DecRef() + return b.opts.IdentifierPool().BinaryID(data) +} + +func (b *block) addAggregateResults( + cancellable *resource.CancellableLifetime, + results AggregateResults, + batch []AggregateResultsEntry, +) ([]AggregateResultsEntry, int, int, error) { + // update recently queried docs to monitor memory. + if err := b.docsLimit.Inc(len(batch)); err != nil { + return batch, 0, 0, err + } + + // checkout the lifetime of the query before adding results. + queryValid := cancellable.TryCheckout() + if !queryValid { + // query not valid any longer, do not add results and return early. + return batch, 0, 0, errCancelledQuery + } + + // try to add the docs to the resource. + size, docsCount := results.AddFields(batch) + + // immediately release the checkout on the lifetime of query. + cancellable.ReleaseCheckout() + + // reset batch. + var emptyField AggregateResultsEntry + for i := range batch { + batch[i] = emptyField + } + batch = batch[:0] + + // return results. + return batch, size, docsCount, nil +} + +func (b *block) AddResults( + resultsByVolumeType result.IndexBlockByVolumeType, +) error { + b.Lock() + defer b.Unlock() + + multiErr := xerrors.NewMultiError() + for volumeType, results := range resultsByVolumeType.Iter() { + multiErr = multiErr.Add(b.addResults(volumeType, results)) + } + + return multiErr.FinalError() +} + +func (b *block) addResults( + volumeType persist.IndexVolumeType, + results result.IndexBlock, +) error { + // NB(prateek): we have to allow bootstrap to succeed even if we're Sealed because + // of topology changes. i.e. if the current m3db process is assigned new shards, + // we need to include their data in the index. + + // i.e. the only state we do not accept bootstrapped data is if we are closed. + if b.state == blockStateClosed { + return errUnableToBootstrapBlockClosed + } + + // First check fulfilled is correct + min, max := results.Fulfilled().MinMax() + if min.Before(b.blockStart) || max.After(b.blockEnd) { + blockRange := xtime.Range{Start: b.blockStart, End: b.blockEnd} + return fmt.Errorf("fulfilled range %s is outside of index block range: %s", + results.Fulfilled().SummaryString(), blockRange.String()) + } + + shardRangesSegments, ok := b.shardRangesSegmentsByVolumeType[volumeType] + if !ok { + shardRangesSegments = make([]blockShardRangesSegments, 0) + b.shardRangesSegmentsByVolumeType[volumeType] = shardRangesSegments + } + + var ( + plCache = b.opts.PostingsListCache() + readThroughOpts = b.opts.ReadThroughSegmentOptions() + segments = results.Segments() + ) + readThroughSegments := make([]segment.Segment, 0, len(segments)) + for _, seg := range segments { + elem := seg.Segment() + if immSeg, ok := elem.(segment.ImmutableSegment); ok { + // only wrap the immutable segments with a read through cache. + elem = NewReadThroughSegment(immSeg, plCache, readThroughOpts) + } + readThroughSegments = append(readThroughSegments, elem) + } + + entry := blockShardRangesSegments{ + shardTimeRanges: results.Fulfilled(), + segments: readThroughSegments, + } + + // first see if this block can cover all our current blocks covering shard + // time ranges. + currFulfilled := result.NewShardTimeRanges() + for _, existing := range shardRangesSegments { + currFulfilled.AddRanges(existing.shardTimeRanges) + } + + unfulfilledBySegments := currFulfilled.Copy() + unfulfilledBySegments.Subtract(results.Fulfilled()) + if !unfulfilledBySegments.IsEmpty() { + // This is the case where it cannot wholly replace the current set of blocks + // so simply append the segments in this case. + b.shardRangesSegmentsByVolumeType[volumeType] = append(shardRangesSegments, entry) + return nil + } + + // This is the case where the new segments can wholly replace the + // current set of blocks since unfullfilled by the new segments is zero. + multiErr := xerrors.NewMultiError() + for i, group := range shardRangesSegments { + for _, seg := range group.segments { + // Make sure to close the existing segments. + multiErr = multiErr.Add(seg.Close()) + } + shardRangesSegments[i] = blockShardRangesSegments{} + } + b.shardRangesSegmentsByVolumeType[volumeType] = append(shardRangesSegments[:0], entry) + + return multiErr.FinalError() +} + +func (b *block) Tick(c context.Cancellable) (BlockTickResult, error) { + b.Lock() + defer b.Unlock() + result := BlockTickResult{} + if b.state == blockStateClosed { + return result, errUnableToTickBlockClosed + } + + // Add foreground/background segments. + numSegments, numDocs := b.mutableSegments.NumSegmentsAndDocs() + for _, coldSeg := range b.coldMutableSegments { + coldNumSegments, coldNumDocs := coldSeg.NumSegmentsAndDocs() + numSegments += coldNumSegments + numDocs += coldNumDocs + } + result.NumSegments += numSegments + result.NumSegmentsMutable += numSegments + result.NumDocs += numDocs + + multiErr := xerrors.NewMultiError() + + // Any segments covering persisted shard ranges. + b.shardRangesSegmentsByVolumeType.forEachSegment(func(seg segment.Segment) error { + result.NumSegments++ + result.NumSegmentsBootstrapped++ + result.NumDocs += seg.Size() + + immSeg, ok := seg.(segment.ImmutableSegment) + if !ok { + b.metrics.segmentFreeMmapSkipNotImmutable.Inc(1) + return nil + } + + // TODO(bodu): Revist this and implement a more sophisticated free strategy. + if err := immSeg.FreeMmap(); err != nil { + multiErr = multiErr.Add(err) + b.metrics.segmentFreeMmapError.Inc(1) + return nil + } + + result.FreeMmap++ + b.metrics.segmentFreeMmapSuccess.Inc(1) + return nil + }) + + return result, multiErr.FinalError() +} + +func (b *block) Seal() error { + b.Lock() + defer b.Unlock() + + // Ensure we only Seal if we're marked Open. + if b.state != blockStateOpen { + return fmt.Errorf(errUnableToSealBlockIllegalStateFmtString, b.state) + } + b.state = blockStateSealed + + // All foreground/background segments and added mutable segments can't + // be written to and they don't need to be sealed since we don't flush + // these segments. + return nil +} + +func (b *block) Stats(reporter BlockStatsReporter) error { + b.RLock() + defer b.RUnlock() + + if b.state != blockStateOpen { + return ErrUnableReportStatsBlockClosed + } + + b.mutableSegments.Stats(reporter) + for _, coldSeg := range b.coldMutableSegments { + // TODO(bodu): Cold segment stats should prob be of a + // diff type or something. + coldSeg.Stats(reporter) + } + + b.shardRangesSegmentsByVolumeType.forEachSegment(func(seg segment.Segment) error { + _, mutable := seg.(segment.MutableSegment) + reporter.ReportSegmentStats(BlockSegmentStats{ + Type: FlushedSegment, + Mutable: mutable, + Size: seg.Size(), + }) + return nil + }) + return nil +} + +func (b *block) IsSealedWithRLock() bool { + return b.state == blockStateSealed +} + +func (b *block) IsSealed() bool { + b.RLock() + defer b.RUnlock() + return b.IsSealedWithRLock() +} + +func (b *block) NeedsMutableSegmentsEvicted() bool { + b.RLock() + defer b.RUnlock() + + // Check any mutable segments that can be evicted after a flush. + anyMutableSegmentNeedsEviction := b.mutableSegments.NeedsEviction() + + // Check boostrapped segments and to see if any of them need an eviction. + b.shardRangesSegmentsByVolumeType.forEachSegment(func(seg segment.Segment) error { + if mutableSeg, ok := seg.(segment.MutableSegment); ok { + anyMutableSegmentNeedsEviction = anyMutableSegmentNeedsEviction || mutableSeg.Size() > 0 + } + return nil + }) + + return anyMutableSegmentNeedsEviction +} + +func (b *block) EvictMutableSegments() error { + b.Lock() + defer b.Unlock() + if b.state != blockStateSealed { + return fmt.Errorf("unable to evict mutable segments, block must be sealed, found: %v", b.state) + } + + b.mutableSegments.Close() + + // Close any other mutable segments that was added. + multiErr := xerrors.NewMultiError() + for _, shardRangesSegments := range b.shardRangesSegmentsByVolumeType { + for idx := range shardRangesSegments { + segments := make([]segment.Segment, 0, len(shardRangesSegments[idx].segments)) + for _, seg := range shardRangesSegments[idx].segments { + mutableSeg, ok := seg.(segment.MutableSegment) + if !ok { + segments = append(segments, seg) + continue + } + multiErr = multiErr.Add(mutableSeg.Close()) + } + shardRangesSegments[idx].segments = segments + } + } + + return multiErr.FinalError() +} + +func (b *block) NeedsColdMutableSegmentsEvicted() bool { + b.RLock() + defer b.RUnlock() + var anyColdMutableSegmentNeedsEviction bool + for _, coldSeg := range b.coldMutableSegments { + anyColdMutableSegmentNeedsEviction = anyColdMutableSegmentNeedsEviction || coldSeg.NeedsEviction() + } + return b.state == blockStateSealed && anyColdMutableSegmentNeedsEviction +} + +func (b *block) EvictColdMutableSegments() error { + b.Lock() + defer b.Unlock() + if b.state != blockStateSealed { + return fmt.Errorf("unable to evict cold mutable segments, block must be sealed, found: %v", b.state) + } + + // Evict/remove all but the most recent cold mutable segment (That is the one we are actively writing to). + for i, coldSeg := range b.coldMutableSegments { + if i < len(b.coldMutableSegments)-1 { + coldSeg.Close() + b.coldMutableSegments[i] = nil + } + } + // Swap last w/ first and truncate the slice. + lastIdx := len(b.coldMutableSegments) - 1 + b.coldMutableSegments[0], b.coldMutableSegments[lastIdx] = b.coldMutableSegments[lastIdx], b.coldMutableSegments[0] + b.coldMutableSegments = b.coldMutableSegments[:1] + return nil +} + +func (b *block) RotateColdMutableSegments() { + b.Lock() + defer b.Unlock() + b.coldMutableSegments = append(b.coldMutableSegments, newMutableSegments( + b.blockStart, + b.opts, + b.blockOpts, + b.namespaceRuntimeOptsMgr, + b.iopts, + )) +} + +func (b *block) MemorySegmentsData(ctx context.Context) ([]fst.SegmentData, error) { + b.RLock() + defer b.RUnlock() + if b.state == blockStateClosed { + return nil, errBlockAlreadyClosed + } + data, err := b.mutableSegments.MemorySegmentsData(ctx) + if err != nil { + return nil, err + } + for _, coldSeg := range b.coldMutableSegments { + coldData, err := coldSeg.MemorySegmentsData(ctx) + if err != nil { + return nil, err + } + data = append(data, coldData...) + } + return data, nil +} + +func (b *block) Close() error { + b.Lock() + defer b.Unlock() + if b.state == blockStateClosed { + return errBlockAlreadyClosed + } + b.state = blockStateClosed + + b.mutableSegments.Close() + for _, coldSeg := range b.coldMutableSegments { + coldSeg.Close() + } + + // Close any other added segments too. + var multiErr xerrors.MultiError + b.shardRangesSegmentsByVolumeType.forEachSegment(func(seg segment.Segment) error { + multiErr = multiErr.Add(seg.Close()) + return nil + }) + + for volumeType := range b.shardRangesSegmentsByVolumeType { + b.shardRangesSegmentsByVolumeType[volumeType] = nil + } + + return multiErr.FinalError() +} + +func (b *block) writeBatchErrorInvalidState(state blockState) error { + switch state { + case blockStateClosed: + return errUnableToWriteBlockClosed + case blockStateSealed: + return errUnableToWriteBlockSealed + default: // should never happen + err := fmt.Errorf(errUnableToWriteBlockUnknownStateFmtString, state) + instrument.EmitAndLogInvariantViolation(b.opts.InstrumentOptions(), func(l *zap.Logger) { + l.Error(err.Error()) + }) + return err + } +} + +type closable interface { + Close() error +} + +type safeCloser struct { + closable + closed bool +} + +func (c *safeCloser) Close() error { + if c.closed { + return nil + } + c.closed = true + return c.closable.Close() +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/compactor.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/compactor.go new file mode 100644 index 00000000..288d63ef --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/compactor.go @@ -0,0 +1,409 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package compaction + +import ( + "bytes" + "errors" + "io" + "sync" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/index/segment/builder" + "github.com/m3db/m3/src/m3ninx/index/segment/fst" + "github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/mmap" +) + +var ( + errCompactorBuilderEmpty = errors.New("builder has no documents") + errCompactorClosed = errors.New("compactor is closed") +) + +// Compactor is a compactor. +type Compactor struct { + sync.RWMutex + + opts CompactorOptions + writer fst.Writer + docsPool doc.DocumentArrayPool + docsMaxBatch int + fstOpts fst.Options + builder segment.SegmentsBuilder + buff *bytes.Buffer + closed bool +} + +// CompactorOptions is a set of compactor options. +type CompactorOptions struct { + // FSTWriterOptions if not nil are the options used to + // construct the FST writer. + FSTWriterOptions *fst.WriterOptions + + // MmapDocsData when enabled will encode and mmmap the + // documents data, rather than keeping the original + // documents with references to substrings in the metric + // IDs (done for memory savings). + MmapDocsData bool +} + +// NewCompactor returns a new compactor which reuses buffers +// to avoid allocating intermediate buffers when compacting. +func NewCompactor( + docsPool doc.DocumentArrayPool, + docsMaxBatch int, + builderOpts builder.Options, + fstOpts fst.Options, + opts CompactorOptions, +) (*Compactor, error) { + var fstWriterOpts fst.WriterOptions + if v := opts.FSTWriterOptions; v != nil { + fstWriterOpts = *v + } + writer, err := fst.NewWriter(fstWriterOpts) + if err != nil { + return nil, err + } + return &Compactor{ + opts: opts, + writer: writer, + docsPool: docsPool, + docsMaxBatch: docsMaxBatch, + builder: builder.NewBuilderFromSegments(builderOpts), + fstOpts: fstOpts, + buff: bytes.NewBuffer(nil), + }, nil +} + +// Compact will take a set of segments and compact them into an immutable +// FST segment, if there is a single mutable segment it can directly be +// converted into an FST segment, otherwise an intermediary mutable segment +// (reused by the compactor between runs) is used to combine all the segments +// together first before compacting into an FST segment. +// Note: This is not thread safe and only a single compaction may happen at a +// time. +func (c *Compactor) Compact( + segs []segment.Segment, + reporterOptions mmap.ReporterOptions, +) (segment.Segment, error) { + c.Lock() + defer c.Unlock() + + if c.closed { + return nil, errCompactorClosed + } + + c.builder.Reset() + if err := c.builder.AddSegments(segs); err != nil { + return nil, err + } + + return c.compactFromBuilderWithLock(c.builder, reporterOptions) +} + +// CompactUsingBuilder compacts segments together using a provided segment builder. +func (c *Compactor) CompactUsingBuilder( + builder segment.DocumentsBuilder, + segs []segment.Segment, + reporterOptions mmap.ReporterOptions, +) (segment.Segment, error) { + // NB(r): Ensure only single compaction happens at a time since the buffers are + // reused between runs. + c.Lock() + defer c.Unlock() + + if c.closed { + return nil, errCompactorClosed + } + + if builder == nil { + return nil, errCompactorBuilderEmpty + } + + if len(segs) == 0 { + // No segments to compact, just compact from the builder + return c.compactFromBuilderWithLock(builder, reporterOptions) + } + + // Need to combine segments first + batch := c.docsPool.Get() + defer func() { + c.docsPool.Put(batch) + }() + + // flushBatch is declared to reuse the same code from the + // inner loop and the completion of the loop + flushBatch := func() error { + if len(batch) == 0 { + // Last flush might not have any docs enqueued + return nil + } + + err := builder.InsertBatch(index.Batch{ + Docs: batch, + AllowPartialUpdates: true, + }) + if err != nil && index.IsBatchPartialError(err) { + // If after filtering out duplicate ID errors + // there are no errors, then this was a successful + // insertion. + batchErr := err.(*index.BatchPartialError) + // NB(r): FilterDuplicateIDErrors returns nil + // if no errors remain after filtering duplicate ID + // errors, this case is covered in unit tests. + err = batchErr.FilterDuplicateIDErrors() + } + if err != nil { + return err + } + + // Reset docs batch for reuse + var empty doc.Document + for i := range batch { + batch[i] = empty + } + batch = batch[:0] + return nil + } + + for _, seg := range segs { + reader, err := seg.Reader() + if err != nil { + return nil, err + } + + iter, err := reader.AllDocs() + if err != nil { + return nil, err + } + + for iter.Next() { + batch = append(batch, iter.Current()) + if len(batch) < c.docsMaxBatch { + continue + } + if err := flushBatch(); err != nil { + return nil, err + } + } + + if err := iter.Err(); err != nil { + return nil, err + } + if err := iter.Close(); err != nil { + return nil, err + } + if err := reader.Close(); err != nil { + return nil, err + } + } + + // Last flush in case some remaining docs that + // weren't written to the mutable segment + if err := flushBatch(); err != nil { + return nil, err + } + + return c.compactFromBuilderWithLock(builder, reporterOptions) +} + +func (c *Compactor) compactFromBuilderWithLock( + builder segment.Builder, + reporterOptions mmap.ReporterOptions, +) (segment.Segment, error) { + defer func() { + // Release resources regardless of result, + // otherwise old compacted segments are held onto + // strongly + builder.Reset() + }() + + // Since this builder is likely reused between compaction + // runs, we need to copy the docs slice + allDocs := builder.Docs() + if len(allDocs) == 0 { + return nil, errCompactorBuilderEmpty + } + + err := c.writer.Reset(builder) + if err != nil { + return nil, err + } + + success := false + closers := new(closers) + fstData := fst.SegmentData{ + Version: fst.Version{ + Major: c.writer.MajorVersion(), + Minor: c.writer.MinorVersion(), + }, + Metadata: append([]byte(nil), c.writer.Metadata()...), + Closer: closers, + } + + // Cleanup incase we run into issues + defer func() { + if !success { + closers.Close() + } + }() + + if !c.opts.MmapDocsData { + // If retaining references to the original docs, simply take ownership + // of the documents and then reference them directly from the FST segment + // rather than encoding them and mmap'ing the encoded documents. + allDocsCopy := make([]doc.Document, len(allDocs)) + copy(allDocsCopy, allDocs) + fstData.DocsReader = docs.NewSliceReader(allDocsCopy) + } else { + // Otherwise encode and reference the encoded bytes as mmap'd bytes. + c.buff.Reset() + if err := c.writer.WriteDocumentsData(c.buff); err != nil { + return nil, err + } + + fstData.DocsData, err = c.mmapAndAppendCloser(c.buff.Bytes(), closers, reporterOptions) + if err != nil { + return nil, err + } + + c.buff.Reset() + if err := c.writer.WriteDocumentsIndex(c.buff); err != nil { + return nil, err + } + + fstData.DocsIdxData, err = c.mmapAndAppendCloser(c.buff.Bytes(), closers, reporterOptions) + if err != nil { + return nil, err + } + } + + c.buff.Reset() + if err := c.writer.WritePostingsOffsets(c.buff); err != nil { + return nil, err + } + + fstData.PostingsData, err = c.mmapAndAppendCloser(c.buff.Bytes(), closers, reporterOptions) + if err != nil { + return nil, err + } + + c.buff.Reset() + if err := c.writer.WriteFSTTerms(c.buff); err != nil { + return nil, err + } + + fstData.FSTTermsData, err = c.mmapAndAppendCloser(c.buff.Bytes(), closers, reporterOptions) + if err != nil { + return nil, err + } + + c.buff.Reset() + if err := c.writer.WriteFSTFields(c.buff); err != nil { + return nil, err + } + + fstData.FSTFieldsData, err = c.mmapAndAppendCloser(c.buff.Bytes(), closers, reporterOptions) + if err != nil { + return nil, err + } + + compacted, err := fst.NewSegment(fstData, c.fstOpts) + if err != nil { + return nil, err + } + + success = true + + return compacted, nil +} + +func (c *Compactor) mmapAndAppendCloser( + fromBytes []byte, + closers *closers, + reporterOptions mmap.ReporterOptions, +) (mmap.Descriptor, error) { + // Copy bytes to new mmap region to hide from the GC + mmapedResult, err := mmap.Bytes(int64(len(fromBytes)), mmap.Options{ + Read: true, + Write: true, + ReporterOptions: reporterOptions, + }) + if err != nil { + return mmap.Descriptor{}, err + } + copy(mmapedResult.Bytes, fromBytes) + + closers.Append(closer(func() error { + return mmap.Munmap(mmapedResult) + })) + + return mmapedResult, nil +} + +// Close closes the compactor and frees buffered resources. +func (c *Compactor) Close() error { + c.Lock() + defer c.Unlock() + + if c.closed { + return errCompactorClosed + } + + c.closed = true + + c.writer = nil + c.docsPool = nil + c.fstOpts = nil + c.builder = nil + c.buff = nil + + return nil +} + +var _ io.Closer = closer(nil) + +type closer func() error + +func (c closer) Close() error { + return c() +} + +var _ io.Closer = &closers{} + +type closers struct { + closers []io.Closer +} + +func (c *closers) Append(elem io.Closer) { + c.closers = append(c.closers, elem) +} + +func (c *closers) Close() error { + multiErr := xerrors.NewMultiError() + for _, elem := range c.closers { + multiErr = multiErr.Add(elem.Close()) + } + return multiErr.FinalError() +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/plan.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/plan.go new file mode 100644 index 00000000..e236f62f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/plan.go @@ -0,0 +1,240 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package compaction + +import ( + "errors" + "fmt" + "sort" + + "github.com/m3db/m3/src/dbnode/storage/index/segments" +) + +var ( + errMutableCompactionAgeNegative = errors.New("mutable compaction age must be positive") + errLevelsUndefined = errors.New("compaction levels are undefined") +) + +var ( + // DefaultLevels are the default Level(s) used for compaction options. + DefaultLevels = []Level{ // i.e. tiers for compaction [0, 262K), [262K, 1M), [1M, 4M) + Level{ + MinSizeInclusive: 0, + MaxSizeExclusive: 1 << 18, + }, + Level{ + MinSizeInclusive: 1 << 18, + MaxSizeExclusive: 1 << 20, + }, + Level{ + MinSizeInclusive: 1 << 20, + MaxSizeExclusive: 1 << 22, + }, + } + + // DefaultOptions are the default compaction PlannerOptions. + DefaultOptions = PlannerOptions{ + MutableSegmentSizeThreshold: 0, // any mutable segment is eligible for compactions + MutableCompactionAgeThreshold: 0, // any mutable segment is eligible for compactions + Levels: DefaultLevels, // sizes defined above + OrderBy: TasksOrderedByOldestMutableAndSize, // compact mutable segments first + } +) + +// NewPlan returns a new compaction.Plan per the rules above and the knobs provided. +func NewPlan(compactableSegments []Segment, opts PlannerOptions) (*Plan, error) { + if err := opts.Validate(); err != nil { + return nil, err + } + + // NB: making a copy of levels to ensure we don't modify any input vars. + levels := make([]Level, len(opts.Levels)) + copy(levels, opts.Levels) + sort.Sort(ByMinSize(levels)) + + // if we don't have any compactable segments, we can early terminate + if len(compactableSegments) == 0 { + return &Plan{}, nil + } + + // initialise to avoid allocs as much as possible + plan := &Plan{ + OrderBy: opts.OrderBy, + UnusedSegments: make([]Segment, 0, len(compactableSegments)), + } + + // Come up with a logical plan for all compactable segments using the following steps: + // (a) Group the segments into given levels (compactions can only be performed for + // segments within the same level). In addition, any mutable segment outside known + // levels can still be compacted. + // (b) For each level: + // (b1) Accumulate segments until cumulative size is over the max of the current level. + // (b2) Add a Task which comprises segments from (b1) to the Plan. + // (b3) Continue (b1) until the level is empty. + // (c) Priotize Tasks w/ "compactable" Mutable Segments over all others + + var ( + // group segments into levels (a) + segementsByLevel = make(map[Level][]Segment, len(levels)) + // mutable segment which don't fit a known level are still considered compactable + catchAllMutableSegmentTask Task + ) + for _, seg := range compactableSegments { + var ( + level Level + levelFound bool + ) + for _, b := range levels { + if b.MinSizeInclusive <= seg.Size && seg.Size < b.MaxSizeExclusive { + level = b + levelFound = true + break + } + } + if levelFound { + segementsByLevel[level] = append(segementsByLevel[level], seg) + continue + } + // we need to compact mutable segments regardless of whether they belong to a known level. + if seg.Type == segments.MutableType { + catchAllMutableSegmentTask.Segments = append(catchAllMutableSegmentTask.Segments, seg) + continue + } + // in all other situations, we simply mark the segment unused and move on + plan.UnusedSegments = append(plan.UnusedSegments, seg) + } + + // any segments that don't fit any known buckets + if len(catchAllMutableSegmentTask.Segments) != 0 { + plan.Tasks = append(plan.Tasks, Task{ + Segments: catchAllMutableSegmentTask.Segments, + }) + } + + // for each level, sub-group segments into tier'd sizes (b) + for level, levelSegments := range segementsByLevel { + var ( + task Task + accumulatedSize int64 + ) + sort.Slice(levelSegments, func(i, j int) bool { + return levelSegments[i].Size < levelSegments[j].Size + }) + for _, seg := range levelSegments { + accumulatedSize += seg.Size + task.Segments = append(task.Segments, seg) + if accumulatedSize >= level.MaxSizeExclusive { + plan.Tasks = append(plan.Tasks, task) + task = Task{} + accumulatedSize = 0 + } + } + // fall thru cases: no accumulation, so we're good + if len(task.Segments) == 0 || accumulatedSize == 0 { + continue + } + + // in case we never went over accumulated size, but have 2 or more segments, we should still compact them + if len(task.Segments) > 1 { + plan.Tasks = append(plan.Tasks, task) + continue + } + + // even if we only have a single segment, if its a mutable segment, we should compact it to convert into a FST + if task.Segments[0].Type == segments.MutableType { + plan.Tasks = append(plan.Tasks, task) + continue + } + + // at this point, we have a single FST segment but don't need to compact it; so mark it as such + plan.UnusedSegments = append(plan.UnusedSegments, task.Segments[0]) + } + + // now that we have the plan, we priortise the tasks as requested in the opts. (c) + sort.Stable(plan) + return plan, nil +} + +func (p *Plan) Len() int { return len(p.Tasks) } +func (p *Plan) Swap(i, j int) { p.Tasks[i], p.Tasks[j] = p.Tasks[j], p.Tasks[i] } +func (p *Plan) Less(i, j int) bool { + switch p.OrderBy { + case TasksOrderedByOldestMutableAndSize: + fallthrough + default: + // NB: the intent with the conditions below is to optimise for e2e ingest latency first, + // which is why we prefer to compact older mutable segments first, then any larger ones, + // after which, we fall back to the graceful plan of compacting smaller segments over + // larger ones to reduce total compactions required. + taskSummaryi, taskSummaryj := p.Tasks[i].Summary(), p.Tasks[j].Summary() + if taskSummaryi.CumulativeMutableAge != taskSummaryj.CumulativeMutableAge { + // i.e. put those tasks which have cumulative age greater first + return taskSummaryi.CumulativeMutableAge > taskSummaryj.CumulativeMutableAge + } + if taskSummaryi.NumMutable != taskSummaryj.NumMutable { + // i.e. put those tasks with more mutable segments first + return taskSummaryi.NumMutable > taskSummaryj.NumMutable + } + // i.e. smaller tasks over bigger ones + return taskSummaryi.CumulativeSize < taskSummaryj.CumulativeSize + } +} + +// Validate ensures the receiver PlannerOptions specify valid values +// for each of the knobs. +func (o PlannerOptions) Validate() error { + if o.MutableCompactionAgeThreshold < 0 { + return errMutableCompactionAgeNegative + } + if len(o.Levels) == 0 { + return errLevelsUndefined + } + sort.Sort(ByMinSize(o.Levels)) + for i := 0; i < len(o.Levels); i++ { + current := o.Levels[i] + if current.MaxSizeExclusive <= current.MinSizeInclusive { + return fmt.Errorf("illegal size levels definition, MaxSize <= MinSize (%+v)", current) + } + } + return nil +} + +// ByMinSize orders a []Level by MinSize in ascending order. +type ByMinSize []Level + +func (a ByMinSize) Len() int { return len(a) } +func (a ByMinSize) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a ByMinSize) Less(i, j int) bool { return a[i].MinSizeInclusive < a[j].MinSizeInclusive } + +// Summary returns the TaskSummary for the given task. +func (t Task) Summary() TaskSummary { + ts := TaskSummary{} + for _, s := range t.Segments { + ts.CumulativeSize += s.Size + if s.Type == segments.MutableType { + ts.NumMutable++ + ts.CumulativeMutableAge += s.Age + } else if s.Type == segments.FSTType { + ts.NumFST++ + } + } + return ts +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/types.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/types.go new file mode 100644 index 00000000..7d2fe8c3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/compaction/types.go @@ -0,0 +1,93 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package compaction + +import ( + "sort" + "time" + + "github.com/m3db/m3/src/dbnode/storage/index/segments" + "github.com/m3db/m3/src/m3ninx/index/segment" +) + +// Segment identifies a candidate for compaction. +type Segment struct { + Age time.Duration + Size int64 + Type segments.Type + + // Either builder or segment should be set, not both. + Builder segment.Builder + Segment segment.Segment +} + +// Task identifies a collection of segments to compact. +type Task struct { + Segments []Segment +} + +// TaskSummary is a collection of statistics about a compaction task. +type TaskSummary struct { + NumMutable int + NumFST int + CumulativeMutableAge time.Duration + CumulativeSize int64 +} + +// Plan is a logical collection of compaction Tasks. The tasks do not +// depened on each other, and maybe performed sequentially or in parallel. +type Plan struct { + Tasks []Task + UnusedSegments []Segment + OrderBy TasksOrderBy +} + +// ensure Plan is sortable. +var _ sort.Interface = &Plan{} + +// PlannerOptions are the knobs to tweak planning behaviour. +type PlannerOptions struct { + // MutableSegmentSizeThreshold is the maximum size a mutable segment is + // allowed to grow before it's rotated out for compactions. + MutableSegmentSizeThreshold int64 + // MutableCompactionAgeThreshold is minimum age required of a mutable segment + // before it would be considered for compaction in steady state. + MutableCompactionAgeThreshold time.Duration + // Levels define the levels for compactions. + Levels []Level + // OrderBy defines the order of tasks in the compaction plan returned. + OrderBy TasksOrderBy +} + +// TasksOrderBy controls the order of tasks returned in the plan. +type TasksOrderBy byte + +const ( + // TasksOrderedByOldestMutableAndSize orders tasks with oldest mutable segment age (cumulative), and then by size. + TasksOrderedByOldestMutableAndSize TasksOrderBy = iota +) + +// Level defines a range of (min, max) sizes such that any segments within the Level +// are allowed to be compacted together. +type Level struct { + MinSizeInclusive int64 + MaxSizeExclusive int64 +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/convert/convert.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/convert/convert.go new file mode 100644 index 00000000..effb5aad --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/convert/convert.go @@ -0,0 +1,406 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package convert + +import ( + "bytes" + "errors" + "fmt" + "unicode/utf8" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/query/graphite/graphite" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" +) + +var ( + // ReservedFieldNameID is the field name used to index the ID in the + // m3ninx subsytem. + ReservedFieldNameID = doc.IDReservedFieldName + + // ErrUsingReservedFieldName is the error returned when a metric + // cannot be parsed due to using a resereved field name + ErrUsingReservedFieldName = errors.New( + "unable to parse metric using reserved field name: " + + string(ReservedFieldNameID)) + + errInvalidResultMissingID = errors.New( + "corrupt data, unable to extract id") +) + +// Validate returns a bool indicating whether the document is valid. +func Validate(d doc.Document) error { + if !utf8.Valid(d.ID) { + return fmt.Errorf("document has invalid non-UTF8 ID: id=%v, id_hex=%x", + d.ID, d.ID) + } + + for _, f := range d.Fields { + if !utf8.Valid(f.Name) { + return fmt.Errorf("document has invalid non-UTF8 field name: name=%v, name_hex=%x", + f.Name, f.Name) + } + + if bytes.Equal(f.Name, ReservedFieldNameID) { + return ErrUsingReservedFieldName + } + + if !utf8.Valid(f.Value) { + return fmt.Errorf("document has invalid non-UTF8 field value: value=%v, value_hex=%x", + f.Value, f.Value) + } + } + + return nil +} + +// ValidateSeries will validate a series for use with m3ninx. +func ValidateSeries(id ident.ID, tags ident.Tags) error { + if idBytes := id.Bytes(); !utf8.Valid(idBytes) { + return fmt.Errorf("series has invalid non-UTF8 ID: id=%s, id_hex=%x", + idBytes, idBytes) + } + for _, tag := range tags.Values() { + if err := ValidateSeriesTag(tag); err != nil { + return err + } + } + return nil +} + +// ValidateSeriesTag validates a series tag for use with m3ninx. +func ValidateSeriesTag(tag ident.Tag) error { + tagName := tag.Name.Bytes() + tagValue := tag.Value.Bytes() + if bytes.Equal(ReservedFieldNameID, tagName) { + return ErrUsingReservedFieldName + } + if !utf8.Valid(tagName) { + return fmt.Errorf("series contains invalid non-UTF8 field name: "+ + "field=%s, field_hex=%v", tagName, tagName) + } + if !utf8.Valid(tagValue) { + return fmt.Errorf("series contains invalid non-UTF8 field value: "+ + "field=%s, field_value=%s, field_value_hex=%x", + tagName, tagValue, tagValue) + } + return nil +} + +// FromSeriesIDAndTags converts the provided series id+tags into a document. +func FromSeriesIDAndTags(id ident.ID, tags ident.Tags) (doc.Document, error) { + clonedID := clone(id) + fields := make([]doc.Field, 0, len(tags.Values())) + for _, tag := range tags.Values() { + nameBytes, valueBytes := tag.Name.Bytes(), tag.Value.Bytes() + + var clonedName, clonedValue []byte + if idx := bytes.Index(clonedID, nameBytes); idx != -1 { + clonedName = clonedID[idx : idx+len(nameBytes)] + } else { + clonedName = append([]byte(nil), nameBytes...) + } + if idx := bytes.Index(clonedID, valueBytes); idx != -1 { + clonedValue = clonedID[idx : idx+len(valueBytes)] + } else { + clonedValue = append([]byte(nil), valueBytes...) + } + + fields = append(fields, doc.Field{ + Name: clonedName, + Value: clonedValue, + }) + } + + d := doc.Document{ + ID: clonedID, + Fields: fields, + } + if err := Validate(d); err != nil { + return doc.Document{}, err + } + return d, nil +} + +// FromSeriesIDAndTagIter converts the provided series id+tags into a document. +func FromSeriesIDAndTagIter(id ident.ID, tags ident.TagIterator) (doc.Document, error) { + clonedID := clone(id) + fields := make([]doc.Field, 0, tags.Remaining()) + for tags.Next() { + tag := tags.Current() + nameBytes, valueBytes := tag.Name.Bytes(), tag.Value.Bytes() + + var clonedName, clonedValue []byte + if idx := bytes.Index(clonedID, nameBytes); idx != -1 { + clonedName = clonedID[idx : idx+len(nameBytes)] + } else { + clonedName = append([]byte(nil), nameBytes...) + } + if idx := bytes.Index(clonedID, valueBytes); idx != -1 { + clonedValue = clonedID[idx : idx+len(valueBytes)] + } else { + clonedValue = append([]byte(nil), valueBytes...) + } + + fields = append(fields, doc.Field{ + Name: clonedName, + Value: clonedValue, + }) + } + if err := tags.Err(); err != nil { + return doc.Document{}, err + } + + d := doc.Document{ + ID: clonedID, + Fields: fields, + } + if err := Validate(d); err != nil { + return doc.Document{}, err + } + return d, nil +} + +// TagsFromTagsIter returns an ident.Tags from a TagIterator. It also tries +// to re-use bytes from the seriesID if they're also present in the tags +// instead of re-allocating them. This requires that the ident.Tags that is +// returned will have the same (or shorter) life time as the seriesID, +// otherwise the operation is unsafe. +func TagsFromTagsIter( + seriesID ident.ID, + iter ident.TagIterator, + idPool ident.Pool, +) (ident.Tags, error) { + var tags ident.Tags + if idPool != nil { + tags = idPool.Tags() + } else { + tagSlice := make([]ident.Tag, 0, iter.Len()) + tags = ident.NewTags(tagSlice...) + } + + seriesIDBytes := ident.BytesID(seriesID.Bytes()) + for iter.Next() { + curr := iter.Current() + + var ( + nameBytes, valueBytes = curr.Name.Bytes(), curr.Value.Bytes() + tag ident.Tag + idRef bool + ) + if idx := bytes.Index(seriesIDBytes, nameBytes); idx != -1 { + tag.Name = seriesIDBytes[idx : idx+len(nameBytes)] + idRef = true + } else { + if idPool != nil { + // NB(r): Fast path for if a graphite tag name to save + // a lot of space is to reuse a preallocated tag name. + if idx, ok := graphite.TagIndex(nameBytes); ok { + tag.Name = graphite.TagNameID(idx) + } else { + tag.Name = idPool.Clone(curr.Name) + } + } else { + copiedBytes := append([]byte(nil), curr.Name.Bytes()...) + tag.Name = ident.BytesID(copiedBytes) + } + } + if idx := bytes.Index(seriesIDBytes, valueBytes); idx != -1 { + tag.Value = seriesIDBytes[idx : idx+len(valueBytes)] + idRef = true + } else { + if idPool != nil { + tag.Value = idPool.Clone(curr.Value) + } else { + copiedBytes := append([]byte(nil), curr.Value.Bytes()...) + tag.Value = ident.BytesID(copiedBytes) + } + } + + if idRef { + tag.NoFinalize() // Taken ref, cannot finalize this. + } + + tags.Append(tag) + } + + if err := iter.Err(); err != nil { + return ident.Tags{}, err + } + return tags, nil +} + +// NB(prateek): we take an independent copy of the bytes underlying +// any ids provided, as we need to maintain the lifecycle of the indexed +// bytes separately from the rest of the storage subsystem. +func clone(id ident.ID) []byte { + original := id.Bytes() + clone := make([]byte, len(original)) + copy(clone, original) + return clone +} + +// Opts are the pools required for conversions. +type Opts struct { + IdentPool ident.Pool + CheckedBytesPool pool.CheckedBytesPool + NoClone bool +} + +// wrapBytes wraps the provided bytes into an ident.ID backed by pooled types, +// such that calling Finalize() on the returned type returns the resources to +// the pools. +func (o Opts) wrapBytes(b []byte) ident.ID { + if o.NoClone { + return ident.BytesID(b) + } + cb := o.CheckedBytesPool.Get(len(b)) + cb.IncRef() + cb.AppendAll(b) + id := o.IdentPool.BinaryID(cb) + // release held reference so now the only reference to the bytes is owned by `id` + cb.DecRef() + return id +} + +// ToSeries converts the provided doc to metric id+tags. +func ToSeries(d doc.Document, opts Opts) (ident.ID, ident.TagIterator, error) { + if len(d.ID) == 0 { + return nil, nil, errInvalidResultMissingID + } + return opts.wrapBytes(d.ID), ToSeriesTags(d, opts), nil +} + +// ToSeriesTags converts the provided doc to metric tags. +func ToSeriesTags(d doc.Document, opts Opts) ident.TagIterator { + return newTagIter(d, opts) +} + +// tagIter exposes an ident.TagIterator interface over a doc.Document. +type tagIter struct { + docFields doc.Fields + + err error + done bool + currentIdx int + currentTag ident.Tag + + opts Opts +} + +// NB: force tagIter to implement the ident.TagIterator interface. +var _ ident.TagIterator = &tagIter{} + +func newTagIter(d doc.Document, opts Opts) ident.TagIterator { + return &tagIter{ + docFields: d.Fields, + currentIdx: -1, + opts: opts, + } +} + +func (t *tagIter) Next() bool { + if t.err != nil || t.done { + return false + } + hasNext := t.parseNext() + if !hasNext { + t.done = true + } + return hasNext +} + +func (t *tagIter) parseNext() (hasNext bool) { + t.releaseCurrent() + t.currentIdx++ + // early terminate if we know there's no more fields + if t.currentIdx >= len(t.docFields) { + return false + } + // if there are fields, we have to ensure the next field + // is not using the reserved ID fieldname + next := t.docFields[t.currentIdx] + if bytes.Equal(ReservedFieldNameID, next.Name) { + t.err = ErrUsingReservedFieldName + return false + } + // otherwise, we're good. + t.currentTag = ident.Tag{ + Name: t.opts.wrapBytes(next.Name), + Value: t.opts.wrapBytes(next.Value), + } + return true +} + +func (t *tagIter) releaseCurrent() { + if t.currentTag.Name != nil { + t.currentTag.Name.Finalize() + t.currentTag.Name = nil + } + if t.currentTag.Value != nil { + t.currentTag.Value.Finalize() + t.currentTag.Value = nil + } +} + +func (t *tagIter) Current() ident.Tag { + return t.currentTag +} + +func (t *tagIter) CurrentIndex() int { + if t.currentIdx >= 0 { + return t.currentIdx + } + return 0 +} + +func (t *tagIter) Err() error { + return t.err +} + +func (t *tagIter) Close() { + t.releaseCurrent() + t.done = true +} + +func (t *tagIter) Len() int { + return len(t.docFields) +} + +func (t *tagIter) Remaining() int { + l := len(t.docFields) - (t.currentIdx + 1) + return l +} + +func (t *tagIter) Duplicate() ident.TagIterator { + var dupe = *t + if t.currentTag.Name != nil { + dupe.currentTag = t.opts.IdentPool.CloneTag(t.currentTag) + } + return &dupe +} + +func (t *tagIter) Rewind() { + t.releaseCurrent() + t.currentIdx = -1 + t.done = false +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/fields_terms_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/fields_terms_iterator.go new file mode 100644 index 00000000..186c32d4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/fields_terms_iterator.go @@ -0,0 +1,267 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "errors" + + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/postings/roaring" + xerrors "github.com/m3db/m3/src/x/errors" + pilosaroaring "github.com/m3dbx/pilosa/roaring" +) + +var ( + errUnpackBitmapFromPostingsList = errors.New("unable to unpack bitmap from postings list") +) + +// fieldsAndTermsIteratorOpts configures the fieldsAndTermsIterator. +type fieldsAndTermsIteratorOpts struct { + restrictByQuery *Query + iterateTerms bool + allowFn allowFn + fieldIterFn newFieldIterFn +} + +func (o fieldsAndTermsIteratorOpts) allow(f []byte) bool { + if o.allowFn == nil { + return true + } + return o.allowFn(f) +} + +func (o fieldsAndTermsIteratorOpts) newFieldIter(r segment.Reader) (segment.FieldsIterator, error) { + if o.fieldIterFn == nil { + return r.Fields() + } + return o.fieldIterFn(r) +} + +type allowFn func(field []byte) bool + +type newFieldIterFn func(r segment.Reader) (segment.FieldsIterator, error) + +type fieldsAndTermsIter struct { + reader segment.Reader + opts fieldsAndTermsIteratorOpts + + err error + fieldIter segment.FieldsIterator + termIter segment.TermsIterator + + current struct { + field []byte + term []byte + postings postings.List + } + + restrictByPostings *pilosaroaring.Bitmap +} + +var ( + fieldsAndTermsIterZeroed fieldsAndTermsIter +) + +var _ fieldsAndTermsIterator = &fieldsAndTermsIter{} + +// newFieldsAndTermsIteratorFn is the lambda definition of the ctor for fieldsAndTermsIterator. +type newFieldsAndTermsIteratorFn func( + r segment.Reader, opts fieldsAndTermsIteratorOpts, +) (fieldsAndTermsIterator, error) + +func newFieldsAndTermsIterator(reader segment.Reader, opts fieldsAndTermsIteratorOpts) (fieldsAndTermsIterator, error) { + iter := &fieldsAndTermsIter{} + err := iter.Reset(reader, opts) + if err != nil { + return nil, err + } + return iter, nil +} + +func (fti *fieldsAndTermsIter) Reset(reader segment.Reader, opts fieldsAndTermsIteratorOpts) error { + *fti = fieldsAndTermsIterZeroed + fti.reader = reader + fti.opts = opts + if reader == nil { + return nil + } + + fiter, err := fti.opts.newFieldIter(reader) + if err != nil { + return err + } + fti.fieldIter = fiter + + if opts.restrictByQuery == nil { + // No need to restrict results by query. + return nil + } + + // If need to restrict by query, run the query on the segment first. + searcher, err := opts.restrictByQuery.SearchQuery().Searcher() + if err != nil { + return err + } + + pl, err := searcher.Search(fti.reader) + if err != nil { + return err + } + + // Hold onto the postings bitmap to intersect against on a per term basis. + bitmap, ok := roaring.BitmapFromPostingsList(pl) + if !ok { + return errUnpackBitmapFromPostingsList + } + + fti.restrictByPostings = bitmap + + return nil +} + +func (fti *fieldsAndTermsIter) setNextField() bool { + fieldIter := fti.fieldIter + if fieldIter == nil { + return false + } + + for fieldIter.Next() { + field := fieldIter.Current() + if !fti.opts.allow(field) { + continue + } + fti.current.field = field + return true + } + + fti.err = fieldIter.Err() + return false +} + +func (fti *fieldsAndTermsIter) setNext() bool { + // check if current field has another term + if fti.termIter != nil { + hasNextTerm, err := fti.nextTermsIterResult() + if err != nil { + fti.err = err + return false + } + if hasNextTerm { + return true + } + } + + // i.e. need to switch to next field + for hasNextField := fti.setNextField(); hasNextField; hasNextField = fti.setNextField() { + // and get next term for the field + var err error + fti.termIter, err = fti.reader.Terms(fti.current.field) + if err != nil { + fti.err = err + return false + } + + hasNextTerm, err := fti.nextTermsIterResult() + if err != nil { + fti.err = err + return false + } + if hasNextTerm { + return true + } + } + + // Check field iterator did not encounter error. + if err := fti.fieldIter.Err(); err != nil { + fti.err = err + return false + } + + // No more fields. + return false +} + +func (fti *fieldsAndTermsIter) nextTermsIterResult() (bool, error) { + for fti.termIter.Next() { + fti.current.term, fti.current.postings = fti.termIter.Current() + if fti.restrictByPostings == nil { + // No restrictions. + return true, nil + } + + bitmap, ok := roaring.BitmapFromPostingsList(fti.current.postings) + if !ok { + return false, errUnpackBitmapFromPostingsList + } + + // Check term isn part of at least some of the documents we're + // restricted to providing results for based on intersection + // count. + // Note: IntersectionCount is significantly faster than intersecting and + // counting results and also does not allocate. + if n := fti.restrictByPostings.IntersectionCount(bitmap); n > 0 { + // Matches, this is next result. + return true, nil + } + } + if err := fti.termIter.Err(); err != nil { + return false, err + } + if err := fti.termIter.Close(); err != nil { + return false, err + } + // Term iterator no longer relevant, no next. + fti.termIter = nil + return false, nil +} + +func (fti *fieldsAndTermsIter) Next() bool { + if fti.err != nil { + return false + } + // if only need to iterate fields + if !fti.opts.iterateTerms { + return fti.setNextField() + } + // iterating both fields and terms + return fti.setNext() +} + +func (fti *fieldsAndTermsIter) Current() (field, term []byte) { + return fti.current.field, fti.current.term +} + +func (fti *fieldsAndTermsIter) Err() error { + return fti.err +} + +func (fti *fieldsAndTermsIter) Close() error { + var multiErr xerrors.MultiError + if fti.fieldIter != nil { + multiErr = multiErr.Add(fti.fieldIter.Close()) + } + if fti.termIter != nil { + multiErr = multiErr.Add(fti.termIter.Close()) + } + multiErr = multiErr.Add(fti.Reset(nil, fieldsAndTermsIteratorOpts{})) + return multiErr.FinalError() +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/filter_fields_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/filter_fields_iterator.go new file mode 100644 index 00000000..96ac7570 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/filter_fields_iterator.go @@ -0,0 +1,86 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "errors" + + "github.com/m3db/m3/src/m3ninx/index/segment" +) + +var ( + errNoFiltersSpecified = errors.New("no fields specified to filter upon") +) + +func newFilterFieldsIterator( + reader segment.Reader, + fields AggregateFieldFilter, +) (segment.FieldsIterator, error) { + if len(fields) == 0 { + return nil, errNoFiltersSpecified + } + return &filterFieldsIterator{ + reader: reader, + fields: fields, + currentIdx: -1, + }, nil +} + +type filterFieldsIterator struct { + reader segment.Reader + fields AggregateFieldFilter + + err error + currentIdx int +} + +var _ segment.FieldsIterator = &filterFieldsIterator{} + +func (f *filterFieldsIterator) Next() bool { + if f.err != nil { + return false + } + + f.currentIdx++ // required because we start at -1 + for f.currentIdx < len(f.fields) { + field := f.fields[f.currentIdx] + + ok, err := f.reader.ContainsField(field) + if err != nil { + f.err = err + return false + } + + // i.e. we found a field from the filter list contained in the segment. + if ok { + return true + } + + // the current field is unsuitable, so we skip to the next possiblity. + f.currentIdx++ + } + + return false +} + +func (f *filterFieldsIterator) Current() []byte { return f.fields[f.currentIdx] } +func (f *filterFieldsIterator) Err() error { return f.err } +func (f *filterFieldsIterator) Close() error { return nil } diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/index_mock.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/index_mock.go new file mode 100644 index 00000000..cf36717d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/index_mock.go @@ -0,0 +1,1696 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/storage/index/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package index is a generated GoMock package. +package index + +import ( + "reflect" + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" + "github.com/m3db/m3/src/dbnode/storage/index/compaction" + "github.com/m3db/m3/src/dbnode/storage/limits" + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/index/segment/builder" + "github.com/m3db/m3/src/m3ninx/index/segment/fst" + "github.com/m3db/m3/src/m3ninx/index/segment/mem" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/mmap" + "github.com/m3db/m3/src/x/pool" + "github.com/m3db/m3/src/x/resource" + time0 "github.com/m3db/m3/src/x/time" + + "github.com/golang/mock/gomock" + "github.com/opentracing/opentracing-go/log" +) + +// MockBaseResults is a mock of BaseResults interface +type MockBaseResults struct { + ctrl *gomock.Controller + recorder *MockBaseResultsMockRecorder +} + +// MockBaseResultsMockRecorder is the mock recorder for MockBaseResults +type MockBaseResultsMockRecorder struct { + mock *MockBaseResults +} + +// NewMockBaseResults creates a new mock instance +func NewMockBaseResults(ctrl *gomock.Controller) *MockBaseResults { + mock := &MockBaseResults{ctrl: ctrl} + mock.recorder = &MockBaseResultsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockBaseResults) EXPECT() *MockBaseResultsMockRecorder { + return m.recorder +} + +// Namespace mocks base method +func (m *MockBaseResults) Namespace() ident.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Namespace") + ret0, _ := ret[0].(ident.ID) + return ret0 +} + +// Namespace indicates an expected call of Namespace +func (mr *MockBaseResultsMockRecorder) Namespace() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Namespace", reflect.TypeOf((*MockBaseResults)(nil).Namespace)) +} + +// Size mocks base method +func (m *MockBaseResults) Size() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Size") + ret0, _ := ret[0].(int) + return ret0 +} + +// Size indicates an expected call of Size +func (mr *MockBaseResultsMockRecorder) Size() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Size", reflect.TypeOf((*MockBaseResults)(nil).Size)) +} + +// TotalDocsCount mocks base method +func (m *MockBaseResults) TotalDocsCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TotalDocsCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// TotalDocsCount indicates an expected call of TotalDocsCount +func (mr *MockBaseResultsMockRecorder) TotalDocsCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TotalDocsCount", reflect.TypeOf((*MockBaseResults)(nil).TotalDocsCount)) +} + +// AddDocuments mocks base method +func (m *MockBaseResults) AddDocuments(batch []doc.Document) (int, int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddDocuments", batch) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(int) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// AddDocuments indicates an expected call of AddDocuments +func (mr *MockBaseResultsMockRecorder) AddDocuments(batch interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddDocuments", reflect.TypeOf((*MockBaseResults)(nil).AddDocuments), batch) +} + +// Finalize mocks base method +func (m *MockBaseResults) Finalize() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Finalize") +} + +// Finalize indicates an expected call of Finalize +func (mr *MockBaseResultsMockRecorder) Finalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finalize", reflect.TypeOf((*MockBaseResults)(nil).Finalize)) +} + +// MockQueryResults is a mock of QueryResults interface +type MockQueryResults struct { + ctrl *gomock.Controller + recorder *MockQueryResultsMockRecorder +} + +// MockQueryResultsMockRecorder is the mock recorder for MockQueryResults +type MockQueryResultsMockRecorder struct { + mock *MockQueryResults +} + +// NewMockQueryResults creates a new mock instance +func NewMockQueryResults(ctrl *gomock.Controller) *MockQueryResults { + mock := &MockQueryResults{ctrl: ctrl} + mock.recorder = &MockQueryResultsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockQueryResults) EXPECT() *MockQueryResultsMockRecorder { + return m.recorder +} + +// Namespace mocks base method +func (m *MockQueryResults) Namespace() ident.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Namespace") + ret0, _ := ret[0].(ident.ID) + return ret0 +} + +// Namespace indicates an expected call of Namespace +func (mr *MockQueryResultsMockRecorder) Namespace() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Namespace", reflect.TypeOf((*MockQueryResults)(nil).Namespace)) +} + +// Size mocks base method +func (m *MockQueryResults) Size() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Size") + ret0, _ := ret[0].(int) + return ret0 +} + +// Size indicates an expected call of Size +func (mr *MockQueryResultsMockRecorder) Size() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Size", reflect.TypeOf((*MockQueryResults)(nil).Size)) +} + +// TotalDocsCount mocks base method +func (m *MockQueryResults) TotalDocsCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TotalDocsCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// TotalDocsCount indicates an expected call of TotalDocsCount +func (mr *MockQueryResultsMockRecorder) TotalDocsCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TotalDocsCount", reflect.TypeOf((*MockQueryResults)(nil).TotalDocsCount)) +} + +// AddDocuments mocks base method +func (m *MockQueryResults) AddDocuments(batch []doc.Document) (int, int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddDocuments", batch) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(int) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// AddDocuments indicates an expected call of AddDocuments +func (mr *MockQueryResultsMockRecorder) AddDocuments(batch interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddDocuments", reflect.TypeOf((*MockQueryResults)(nil).AddDocuments), batch) +} + +// Finalize mocks base method +func (m *MockQueryResults) Finalize() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Finalize") +} + +// Finalize indicates an expected call of Finalize +func (mr *MockQueryResultsMockRecorder) Finalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finalize", reflect.TypeOf((*MockQueryResults)(nil).Finalize)) +} + +// Reset mocks base method +func (m *MockQueryResults) Reset(nsID ident.ID, opts QueryResultsOptions) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", nsID, opts) +} + +// Reset indicates an expected call of Reset +func (mr *MockQueryResultsMockRecorder) Reset(nsID, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockQueryResults)(nil).Reset), nsID, opts) +} + +// Map mocks base method +func (m *MockQueryResults) Map() *ResultsMap { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Map") + ret0, _ := ret[0].(*ResultsMap) + return ret0 +} + +// Map indicates an expected call of Map +func (mr *MockQueryResultsMockRecorder) Map() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockQueryResults)(nil).Map)) +} + +// MockQueryResultsPool is a mock of QueryResultsPool interface +type MockQueryResultsPool struct { + ctrl *gomock.Controller + recorder *MockQueryResultsPoolMockRecorder +} + +// MockQueryResultsPoolMockRecorder is the mock recorder for MockQueryResultsPool +type MockQueryResultsPoolMockRecorder struct { + mock *MockQueryResultsPool +} + +// NewMockQueryResultsPool creates a new mock instance +func NewMockQueryResultsPool(ctrl *gomock.Controller) *MockQueryResultsPool { + mock := &MockQueryResultsPool{ctrl: ctrl} + mock.recorder = &MockQueryResultsPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockQueryResultsPool) EXPECT() *MockQueryResultsPoolMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockQueryResultsPool) Init(alloc QueryResultsAllocator) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init", alloc) +} + +// Init indicates an expected call of Init +func (mr *MockQueryResultsPoolMockRecorder) Init(alloc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockQueryResultsPool)(nil).Init), alloc) +} + +// Get mocks base method +func (m *MockQueryResultsPool) Get() QueryResults { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(QueryResults) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockQueryResultsPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockQueryResultsPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockQueryResultsPool) Put(value QueryResults) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", value) +} + +// Put indicates an expected call of Put +func (mr *MockQueryResultsPoolMockRecorder) Put(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockQueryResultsPool)(nil).Put), value) +} + +// MockAggregateResults is a mock of AggregateResults interface +type MockAggregateResults struct { + ctrl *gomock.Controller + recorder *MockAggregateResultsMockRecorder +} + +// MockAggregateResultsMockRecorder is the mock recorder for MockAggregateResults +type MockAggregateResultsMockRecorder struct { + mock *MockAggregateResults +} + +// NewMockAggregateResults creates a new mock instance +func NewMockAggregateResults(ctrl *gomock.Controller) *MockAggregateResults { + mock := &MockAggregateResults{ctrl: ctrl} + mock.recorder = &MockAggregateResultsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAggregateResults) EXPECT() *MockAggregateResultsMockRecorder { + return m.recorder +} + +// Namespace mocks base method +func (m *MockAggregateResults) Namespace() ident.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Namespace") + ret0, _ := ret[0].(ident.ID) + return ret0 +} + +// Namespace indicates an expected call of Namespace +func (mr *MockAggregateResultsMockRecorder) Namespace() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Namespace", reflect.TypeOf((*MockAggregateResults)(nil).Namespace)) +} + +// Size mocks base method +func (m *MockAggregateResults) Size() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Size") + ret0, _ := ret[0].(int) + return ret0 +} + +// Size indicates an expected call of Size +func (mr *MockAggregateResultsMockRecorder) Size() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Size", reflect.TypeOf((*MockAggregateResults)(nil).Size)) +} + +// TotalDocsCount mocks base method +func (m *MockAggregateResults) TotalDocsCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TotalDocsCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// TotalDocsCount indicates an expected call of TotalDocsCount +func (mr *MockAggregateResultsMockRecorder) TotalDocsCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TotalDocsCount", reflect.TypeOf((*MockAggregateResults)(nil).TotalDocsCount)) +} + +// AddDocuments mocks base method +func (m *MockAggregateResults) AddDocuments(batch []doc.Document) (int, int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddDocuments", batch) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(int) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// AddDocuments indicates an expected call of AddDocuments +func (mr *MockAggregateResultsMockRecorder) AddDocuments(batch interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddDocuments", reflect.TypeOf((*MockAggregateResults)(nil).AddDocuments), batch) +} + +// Finalize mocks base method +func (m *MockAggregateResults) Finalize() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Finalize") +} + +// Finalize indicates an expected call of Finalize +func (mr *MockAggregateResultsMockRecorder) Finalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finalize", reflect.TypeOf((*MockAggregateResults)(nil).Finalize)) +} + +// Reset mocks base method +func (m *MockAggregateResults) Reset(nsID ident.ID, aggregateQueryOpts AggregateResultsOptions) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", nsID, aggregateQueryOpts) +} + +// Reset indicates an expected call of Reset +func (mr *MockAggregateResultsMockRecorder) Reset(nsID, aggregateQueryOpts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockAggregateResults)(nil).Reset), nsID, aggregateQueryOpts) +} + +// AggregateResultsOptions mocks base method +func (m *MockAggregateResults) AggregateResultsOptions() AggregateResultsOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateResultsOptions") + ret0, _ := ret[0].(AggregateResultsOptions) + return ret0 +} + +// AggregateResultsOptions indicates an expected call of AggregateResultsOptions +func (mr *MockAggregateResultsMockRecorder) AggregateResultsOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateResultsOptions", reflect.TypeOf((*MockAggregateResults)(nil).AggregateResultsOptions)) +} + +// AddFields mocks base method +func (m *MockAggregateResults) AddFields(batch []AggregateResultsEntry) (int, int) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddFields", batch) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(int) + return ret0, ret1 +} + +// AddFields indicates an expected call of AddFields +func (mr *MockAggregateResultsMockRecorder) AddFields(batch interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddFields", reflect.TypeOf((*MockAggregateResults)(nil).AddFields), batch) +} + +// Map mocks base method +func (m *MockAggregateResults) Map() *AggregateResultsMap { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Map") + ret0, _ := ret[0].(*AggregateResultsMap) + return ret0 +} + +// Map indicates an expected call of Map +func (mr *MockAggregateResultsMockRecorder) Map() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Map", reflect.TypeOf((*MockAggregateResults)(nil).Map)) +} + +// MockAggregateResultsPool is a mock of AggregateResultsPool interface +type MockAggregateResultsPool struct { + ctrl *gomock.Controller + recorder *MockAggregateResultsPoolMockRecorder +} + +// MockAggregateResultsPoolMockRecorder is the mock recorder for MockAggregateResultsPool +type MockAggregateResultsPoolMockRecorder struct { + mock *MockAggregateResultsPool +} + +// NewMockAggregateResultsPool creates a new mock instance +func NewMockAggregateResultsPool(ctrl *gomock.Controller) *MockAggregateResultsPool { + mock := &MockAggregateResultsPool{ctrl: ctrl} + mock.recorder = &MockAggregateResultsPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAggregateResultsPool) EXPECT() *MockAggregateResultsPoolMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockAggregateResultsPool) Init(alloc AggregateResultsAllocator) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init", alloc) +} + +// Init indicates an expected call of Init +func (mr *MockAggregateResultsPoolMockRecorder) Init(alloc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockAggregateResultsPool)(nil).Init), alloc) +} + +// Get mocks base method +func (m *MockAggregateResultsPool) Get() AggregateResults { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(AggregateResults) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockAggregateResultsPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockAggregateResultsPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockAggregateResultsPool) Put(value AggregateResults) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", value) +} + +// Put indicates an expected call of Put +func (mr *MockAggregateResultsPoolMockRecorder) Put(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockAggregateResultsPool)(nil).Put), value) +} + +// MockAggregateValuesPool is a mock of AggregateValuesPool interface +type MockAggregateValuesPool struct { + ctrl *gomock.Controller + recorder *MockAggregateValuesPoolMockRecorder +} + +// MockAggregateValuesPoolMockRecorder is the mock recorder for MockAggregateValuesPool +type MockAggregateValuesPoolMockRecorder struct { + mock *MockAggregateValuesPool +} + +// NewMockAggregateValuesPool creates a new mock instance +func NewMockAggregateValuesPool(ctrl *gomock.Controller) *MockAggregateValuesPool { + mock := &MockAggregateValuesPool{ctrl: ctrl} + mock.recorder = &MockAggregateValuesPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockAggregateValuesPool) EXPECT() *MockAggregateValuesPoolMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockAggregateValuesPool) Init(alloc AggregateValuesAllocator) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init", alloc) +} + +// Init indicates an expected call of Init +func (mr *MockAggregateValuesPoolMockRecorder) Init(alloc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockAggregateValuesPool)(nil).Init), alloc) +} + +// Get mocks base method +func (m *MockAggregateValuesPool) Get() AggregateValues { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(AggregateValues) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockAggregateValuesPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockAggregateValuesPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockAggregateValuesPool) Put(value AggregateValues) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", value) +} + +// Put indicates an expected call of Put +func (mr *MockAggregateValuesPoolMockRecorder) Put(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockAggregateValuesPool)(nil).Put), value) +} + +// MockOnIndexSeries is a mock of OnIndexSeries interface +type MockOnIndexSeries struct { + ctrl *gomock.Controller + recorder *MockOnIndexSeriesMockRecorder +} + +// MockOnIndexSeriesMockRecorder is the mock recorder for MockOnIndexSeries +type MockOnIndexSeriesMockRecorder struct { + mock *MockOnIndexSeries +} + +// NewMockOnIndexSeries creates a new mock instance +func NewMockOnIndexSeries(ctrl *gomock.Controller) *MockOnIndexSeries { + mock := &MockOnIndexSeries{ctrl: ctrl} + mock.recorder = &MockOnIndexSeriesMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOnIndexSeries) EXPECT() *MockOnIndexSeriesMockRecorder { + return m.recorder +} + +// OnIndexSuccess mocks base method +func (m *MockOnIndexSeries) OnIndexSuccess(blockStart time0.UnixNano) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnIndexSuccess", blockStart) +} + +// OnIndexSuccess indicates an expected call of OnIndexSuccess +func (mr *MockOnIndexSeriesMockRecorder) OnIndexSuccess(blockStart interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnIndexSuccess", reflect.TypeOf((*MockOnIndexSeries)(nil).OnIndexSuccess), blockStart) +} + +// OnIndexFinalize mocks base method +func (m *MockOnIndexSeries) OnIndexFinalize(blockStart time0.UnixNano) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnIndexFinalize", blockStart) +} + +// OnIndexFinalize indicates an expected call of OnIndexFinalize +func (mr *MockOnIndexSeriesMockRecorder) OnIndexFinalize(blockStart interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnIndexFinalize", reflect.TypeOf((*MockOnIndexSeries)(nil).OnIndexFinalize), blockStart) +} + +// OnIndexPrepare mocks base method +func (m *MockOnIndexSeries) OnIndexPrepare() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnIndexPrepare") +} + +// OnIndexPrepare indicates an expected call of OnIndexPrepare +func (mr *MockOnIndexSeriesMockRecorder) OnIndexPrepare() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnIndexPrepare", reflect.TypeOf((*MockOnIndexSeries)(nil).OnIndexPrepare)) +} + +// NeedsIndexUpdate mocks base method +func (m *MockOnIndexSeries) NeedsIndexUpdate(indexBlockStartForWrite time0.UnixNano) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NeedsIndexUpdate", indexBlockStartForWrite) + ret0, _ := ret[0].(bool) + return ret0 +} + +// NeedsIndexUpdate indicates an expected call of NeedsIndexUpdate +func (mr *MockOnIndexSeriesMockRecorder) NeedsIndexUpdate(indexBlockStartForWrite interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NeedsIndexUpdate", reflect.TypeOf((*MockOnIndexSeries)(nil).NeedsIndexUpdate), indexBlockStartForWrite) +} + +// MockBlock is a mock of Block interface +type MockBlock struct { + ctrl *gomock.Controller + recorder *MockBlockMockRecorder +} + +// MockBlockMockRecorder is the mock recorder for MockBlock +type MockBlockMockRecorder struct { + mock *MockBlock +} + +// NewMockBlock creates a new mock instance +func NewMockBlock(ctrl *gomock.Controller) *MockBlock { + mock := &MockBlock{ctrl: ctrl} + mock.recorder = &MockBlockMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockBlock) EXPECT() *MockBlockMockRecorder { + return m.recorder +} + +// StartTime mocks base method +func (m *MockBlock) StartTime() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartTime") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// StartTime indicates an expected call of StartTime +func (mr *MockBlockMockRecorder) StartTime() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartTime", reflect.TypeOf((*MockBlock)(nil).StartTime)) +} + +// EndTime mocks base method +func (m *MockBlock) EndTime() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "EndTime") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// EndTime indicates an expected call of EndTime +func (mr *MockBlockMockRecorder) EndTime() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EndTime", reflect.TypeOf((*MockBlock)(nil).EndTime)) +} + +// WriteBatch mocks base method +func (m *MockBlock) WriteBatch(inserts *WriteBatch) (WriteBatchResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteBatch", inserts) + ret0, _ := ret[0].(WriteBatchResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WriteBatch indicates an expected call of WriteBatch +func (mr *MockBlockMockRecorder) WriteBatch(inserts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteBatch", reflect.TypeOf((*MockBlock)(nil).WriteBatch), inserts) +} + +// Query mocks base method +func (m *MockBlock) Query(ctx context.Context, cancellable *resource.CancellableLifetime, query Query, opts QueryOptions, results BaseResults, logFields []log.Field) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", ctx, cancellable, query, opts, results, logFields) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Query indicates an expected call of Query +func (mr *MockBlockMockRecorder) Query(ctx, cancellable, query, opts, results, logFields interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockBlock)(nil).Query), ctx, cancellable, query, opts, results, logFields) +} + +// Aggregate mocks base method +func (m *MockBlock) Aggregate(ctx context.Context, cancellable *resource.CancellableLifetime, opts QueryOptions, results AggregateResults, logFields []log.Field) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Aggregate", ctx, cancellable, opts, results, logFields) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Aggregate indicates an expected call of Aggregate +func (mr *MockBlockMockRecorder) Aggregate(ctx, cancellable, opts, results, logFields interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Aggregate", reflect.TypeOf((*MockBlock)(nil).Aggregate), ctx, cancellable, opts, results, logFields) +} + +// AddResults mocks base method +func (m *MockBlock) AddResults(resultsByVolumeType result.IndexBlockByVolumeType) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddResults", resultsByVolumeType) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddResults indicates an expected call of AddResults +func (mr *MockBlockMockRecorder) AddResults(resultsByVolumeType interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddResults", reflect.TypeOf((*MockBlock)(nil).AddResults), resultsByVolumeType) +} + +// Tick mocks base method +func (m *MockBlock) Tick(c context.Cancellable) (BlockTickResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Tick", c) + ret0, _ := ret[0].(BlockTickResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Tick indicates an expected call of Tick +func (mr *MockBlockMockRecorder) Tick(c interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Tick", reflect.TypeOf((*MockBlock)(nil).Tick), c) +} + +// Stats mocks base method +func (m *MockBlock) Stats(reporter BlockStatsReporter) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stats", reporter) + ret0, _ := ret[0].(error) + return ret0 +} + +// Stats indicates an expected call of Stats +func (mr *MockBlockMockRecorder) Stats(reporter interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stats", reflect.TypeOf((*MockBlock)(nil).Stats), reporter) +} + +// Seal mocks base method +func (m *MockBlock) Seal() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Seal") + ret0, _ := ret[0].(error) + return ret0 +} + +// Seal indicates an expected call of Seal +func (mr *MockBlockMockRecorder) Seal() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Seal", reflect.TypeOf((*MockBlock)(nil).Seal)) +} + +// IsSealed mocks base method +func (m *MockBlock) IsSealed() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsSealed") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsSealed indicates an expected call of IsSealed +func (mr *MockBlockMockRecorder) IsSealed() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSealed", reflect.TypeOf((*MockBlock)(nil).IsSealed)) +} + +// NeedsMutableSegmentsEvicted mocks base method +func (m *MockBlock) NeedsMutableSegmentsEvicted() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NeedsMutableSegmentsEvicted") + ret0, _ := ret[0].(bool) + return ret0 +} + +// NeedsMutableSegmentsEvicted indicates an expected call of NeedsMutableSegmentsEvicted +func (mr *MockBlockMockRecorder) NeedsMutableSegmentsEvicted() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NeedsMutableSegmentsEvicted", reflect.TypeOf((*MockBlock)(nil).NeedsMutableSegmentsEvicted)) +} + +// EvictMutableSegments mocks base method +func (m *MockBlock) EvictMutableSegments() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "EvictMutableSegments") + ret0, _ := ret[0].(error) + return ret0 +} + +// EvictMutableSegments indicates an expected call of EvictMutableSegments +func (mr *MockBlockMockRecorder) EvictMutableSegments() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EvictMutableSegments", reflect.TypeOf((*MockBlock)(nil).EvictMutableSegments)) +} + +// NeedsColdMutableSegmentsEvicted mocks base method +func (m *MockBlock) NeedsColdMutableSegmentsEvicted() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NeedsColdMutableSegmentsEvicted") + ret0, _ := ret[0].(bool) + return ret0 +} + +// NeedsColdMutableSegmentsEvicted indicates an expected call of NeedsColdMutableSegmentsEvicted +func (mr *MockBlockMockRecorder) NeedsColdMutableSegmentsEvicted() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NeedsColdMutableSegmentsEvicted", reflect.TypeOf((*MockBlock)(nil).NeedsColdMutableSegmentsEvicted)) +} + +// EvictColdMutableSegments mocks base method +func (m *MockBlock) EvictColdMutableSegments() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "EvictColdMutableSegments") + ret0, _ := ret[0].(error) + return ret0 +} + +// EvictColdMutableSegments indicates an expected call of EvictColdMutableSegments +func (mr *MockBlockMockRecorder) EvictColdMutableSegments() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EvictColdMutableSegments", reflect.TypeOf((*MockBlock)(nil).EvictColdMutableSegments)) +} + +// RotateColdMutableSegments mocks base method +func (m *MockBlock) RotateColdMutableSegments() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RotateColdMutableSegments") +} + +// RotateColdMutableSegments indicates an expected call of RotateColdMutableSegments +func (mr *MockBlockMockRecorder) RotateColdMutableSegments() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RotateColdMutableSegments", reflect.TypeOf((*MockBlock)(nil).RotateColdMutableSegments)) +} + +// MemorySegmentsData mocks base method +func (m *MockBlock) MemorySegmentsData(ctx context.Context) ([]fst.SegmentData, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MemorySegmentsData", ctx) + ret0, _ := ret[0].([]fst.SegmentData) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MemorySegmentsData indicates an expected call of MemorySegmentsData +func (mr *MockBlockMockRecorder) MemorySegmentsData(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MemorySegmentsData", reflect.TypeOf((*MockBlock)(nil).MemorySegmentsData), ctx) +} + +// Close mocks base method +func (m *MockBlock) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockBlockMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockBlock)(nil).Close)) +} + +// MockBlockStatsReporter is a mock of BlockStatsReporter interface +type MockBlockStatsReporter struct { + ctrl *gomock.Controller + recorder *MockBlockStatsReporterMockRecorder +} + +// MockBlockStatsReporterMockRecorder is the mock recorder for MockBlockStatsReporter +type MockBlockStatsReporterMockRecorder struct { + mock *MockBlockStatsReporter +} + +// NewMockBlockStatsReporter creates a new mock instance +func NewMockBlockStatsReporter(ctrl *gomock.Controller) *MockBlockStatsReporter { + mock := &MockBlockStatsReporter{ctrl: ctrl} + mock.recorder = &MockBlockStatsReporterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockBlockStatsReporter) EXPECT() *MockBlockStatsReporterMockRecorder { + return m.recorder +} + +// ReportSegmentStats mocks base method +func (m *MockBlockStatsReporter) ReportSegmentStats(stats BlockSegmentStats) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ReportSegmentStats", stats) +} + +// ReportSegmentStats indicates an expected call of ReportSegmentStats +func (mr *MockBlockStatsReporterMockRecorder) ReportSegmentStats(stats interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReportSegmentStats", reflect.TypeOf((*MockBlockStatsReporter)(nil).ReportSegmentStats), stats) +} + +// ReportIndexingStats mocks base method +func (m *MockBlockStatsReporter) ReportIndexingStats(stats BlockIndexingStats) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ReportIndexingStats", stats) +} + +// ReportIndexingStats indicates an expected call of ReportIndexingStats +func (mr *MockBlockStatsReporterMockRecorder) ReportIndexingStats(stats interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReportIndexingStats", reflect.TypeOf((*MockBlockStatsReporter)(nil).ReportIndexingStats), stats) +} + +// MockfieldsAndTermsIterator is a mock of fieldsAndTermsIterator interface +type MockfieldsAndTermsIterator struct { + ctrl *gomock.Controller + recorder *MockfieldsAndTermsIteratorMockRecorder +} + +// MockfieldsAndTermsIteratorMockRecorder is the mock recorder for MockfieldsAndTermsIterator +type MockfieldsAndTermsIteratorMockRecorder struct { + mock *MockfieldsAndTermsIterator +} + +// NewMockfieldsAndTermsIterator creates a new mock instance +func NewMockfieldsAndTermsIterator(ctrl *gomock.Controller) *MockfieldsAndTermsIterator { + mock := &MockfieldsAndTermsIterator{ctrl: ctrl} + mock.recorder = &MockfieldsAndTermsIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockfieldsAndTermsIterator) EXPECT() *MockfieldsAndTermsIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockfieldsAndTermsIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockfieldsAndTermsIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockfieldsAndTermsIterator)(nil).Next)) +} + +// Current mocks base method +func (m *MockfieldsAndTermsIterator) Current() ([]byte, []byte) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].([]byte) + return ret0, ret1 +} + +// Current indicates an expected call of Current +func (mr *MockfieldsAndTermsIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockfieldsAndTermsIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockfieldsAndTermsIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockfieldsAndTermsIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockfieldsAndTermsIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockfieldsAndTermsIterator) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockfieldsAndTermsIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockfieldsAndTermsIterator)(nil).Close)) +} + +// Reset mocks base method +func (m *MockfieldsAndTermsIterator) Reset(reader segment.Reader, opts fieldsAndTermsIteratorOpts) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reset", reader, opts) + ret0, _ := ret[0].(error) + return ret0 +} + +// Reset indicates an expected call of Reset +func (mr *MockfieldsAndTermsIteratorMockRecorder) Reset(reader, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockfieldsAndTermsIterator)(nil).Reset), reader, opts) +} + +// MockOptions is a mock of Options interface +type MockOptions struct { + ctrl *gomock.Controller + recorder *MockOptionsMockRecorder +} + +// MockOptionsMockRecorder is the mock recorder for MockOptions +type MockOptionsMockRecorder struct { + mock *MockOptions +} + +// NewMockOptions creates a new mock instance +func NewMockOptions(ctrl *gomock.Controller) *MockOptions { + mock := &MockOptions{ctrl: ctrl} + mock.recorder = &MockOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOptions) EXPECT() *MockOptionsMockRecorder { + return m.recorder +} + +// Validate mocks base method +func (m *MockOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockOptions)(nil).Validate)) +} + +// SetInsertMode mocks base method +func (m *MockOptions) SetInsertMode(value InsertMode) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInsertMode", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetInsertMode indicates an expected call of SetInsertMode +func (mr *MockOptionsMockRecorder) SetInsertMode(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInsertMode", reflect.TypeOf((*MockOptions)(nil).SetInsertMode), value) +} + +// InsertMode mocks base method +func (m *MockOptions) InsertMode() InsertMode { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InsertMode") + ret0, _ := ret[0].(InsertMode) + return ret0 +} + +// InsertMode indicates an expected call of InsertMode +func (mr *MockOptionsMockRecorder) InsertMode() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertMode", reflect.TypeOf((*MockOptions)(nil).InsertMode)) +} + +// SetClockOptions mocks base method +func (m *MockOptions) SetClockOptions(value clock.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetClockOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetClockOptions indicates an expected call of SetClockOptions +func (mr *MockOptionsMockRecorder) SetClockOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetClockOptions", reflect.TypeOf((*MockOptions)(nil).SetClockOptions), value) +} + +// ClockOptions mocks base method +func (m *MockOptions) ClockOptions() clock.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClockOptions") + ret0, _ := ret[0].(clock.Options) + return ret0 +} + +// ClockOptions indicates an expected call of ClockOptions +func (mr *MockOptionsMockRecorder) ClockOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClockOptions", reflect.TypeOf((*MockOptions)(nil).ClockOptions)) +} + +// SetInstrumentOptions mocks base method +func (m *MockOptions) SetInstrumentOptions(value instrument.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstrumentOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetInstrumentOptions indicates an expected call of SetInstrumentOptions +func (mr *MockOptionsMockRecorder) SetInstrumentOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstrumentOptions", reflect.TypeOf((*MockOptions)(nil).SetInstrumentOptions), value) +} + +// InstrumentOptions mocks base method +func (m *MockOptions) InstrumentOptions() instrument.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstrumentOptions") + ret0, _ := ret[0].(instrument.Options) + return ret0 +} + +// InstrumentOptions indicates an expected call of InstrumentOptions +func (mr *MockOptionsMockRecorder) InstrumentOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstrumentOptions", reflect.TypeOf((*MockOptions)(nil).InstrumentOptions)) +} + +// SetSegmentBuilderOptions mocks base method +func (m *MockOptions) SetSegmentBuilderOptions(value builder.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetSegmentBuilderOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetSegmentBuilderOptions indicates an expected call of SetSegmentBuilderOptions +func (mr *MockOptionsMockRecorder) SetSegmentBuilderOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSegmentBuilderOptions", reflect.TypeOf((*MockOptions)(nil).SetSegmentBuilderOptions), value) +} + +// SegmentBuilderOptions mocks base method +func (m *MockOptions) SegmentBuilderOptions() builder.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentBuilderOptions") + ret0, _ := ret[0].(builder.Options) + return ret0 +} + +// SegmentBuilderOptions indicates an expected call of SegmentBuilderOptions +func (mr *MockOptionsMockRecorder) SegmentBuilderOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentBuilderOptions", reflect.TypeOf((*MockOptions)(nil).SegmentBuilderOptions)) +} + +// SetMemSegmentOptions mocks base method +func (m *MockOptions) SetMemSegmentOptions(value mem.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMemSegmentOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetMemSegmentOptions indicates an expected call of SetMemSegmentOptions +func (mr *MockOptionsMockRecorder) SetMemSegmentOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMemSegmentOptions", reflect.TypeOf((*MockOptions)(nil).SetMemSegmentOptions), value) +} + +// MemSegmentOptions mocks base method +func (m *MockOptions) MemSegmentOptions() mem.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MemSegmentOptions") + ret0, _ := ret[0].(mem.Options) + return ret0 +} + +// MemSegmentOptions indicates an expected call of MemSegmentOptions +func (mr *MockOptionsMockRecorder) MemSegmentOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MemSegmentOptions", reflect.TypeOf((*MockOptions)(nil).MemSegmentOptions)) +} + +// SetFSTSegmentOptions mocks base method +func (m *MockOptions) SetFSTSegmentOptions(value fst.Options) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetFSTSegmentOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetFSTSegmentOptions indicates an expected call of SetFSTSegmentOptions +func (mr *MockOptionsMockRecorder) SetFSTSegmentOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFSTSegmentOptions", reflect.TypeOf((*MockOptions)(nil).SetFSTSegmentOptions), value) +} + +// FSTSegmentOptions mocks base method +func (m *MockOptions) FSTSegmentOptions() fst.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FSTSegmentOptions") + ret0, _ := ret[0].(fst.Options) + return ret0 +} + +// FSTSegmentOptions indicates an expected call of FSTSegmentOptions +func (mr *MockOptionsMockRecorder) FSTSegmentOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FSTSegmentOptions", reflect.TypeOf((*MockOptions)(nil).FSTSegmentOptions)) +} + +// SetIdentifierPool mocks base method +func (m *MockOptions) SetIdentifierPool(value ident.Pool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetIdentifierPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetIdentifierPool indicates an expected call of SetIdentifierPool +func (mr *MockOptionsMockRecorder) SetIdentifierPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIdentifierPool", reflect.TypeOf((*MockOptions)(nil).SetIdentifierPool), value) +} + +// IdentifierPool mocks base method +func (m *MockOptions) IdentifierPool() ident.Pool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IdentifierPool") + ret0, _ := ret[0].(ident.Pool) + return ret0 +} + +// IdentifierPool indicates an expected call of IdentifierPool +func (mr *MockOptionsMockRecorder) IdentifierPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IdentifierPool", reflect.TypeOf((*MockOptions)(nil).IdentifierPool)) +} + +// SetCheckedBytesPool mocks base method +func (m *MockOptions) SetCheckedBytesPool(value pool.CheckedBytesPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetCheckedBytesPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetCheckedBytesPool indicates an expected call of SetCheckedBytesPool +func (mr *MockOptionsMockRecorder) SetCheckedBytesPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCheckedBytesPool", reflect.TypeOf((*MockOptions)(nil).SetCheckedBytesPool), value) +} + +// CheckedBytesPool mocks base method +func (m *MockOptions) CheckedBytesPool() pool.CheckedBytesPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckedBytesPool") + ret0, _ := ret[0].(pool.CheckedBytesPool) + return ret0 +} + +// CheckedBytesPool indicates an expected call of CheckedBytesPool +func (mr *MockOptionsMockRecorder) CheckedBytesPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckedBytesPool", reflect.TypeOf((*MockOptions)(nil).CheckedBytesPool)) +} + +// SetQueryResultsPool mocks base method +func (m *MockOptions) SetQueryResultsPool(values QueryResultsPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetQueryResultsPool", values) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetQueryResultsPool indicates an expected call of SetQueryResultsPool +func (mr *MockOptionsMockRecorder) SetQueryResultsPool(values interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetQueryResultsPool", reflect.TypeOf((*MockOptions)(nil).SetQueryResultsPool), values) +} + +// QueryResultsPool mocks base method +func (m *MockOptions) QueryResultsPool() QueryResultsPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryResultsPool") + ret0, _ := ret[0].(QueryResultsPool) + return ret0 +} + +// QueryResultsPool indicates an expected call of QueryResultsPool +func (mr *MockOptionsMockRecorder) QueryResultsPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryResultsPool", reflect.TypeOf((*MockOptions)(nil).QueryResultsPool)) +} + +// SetAggregateResultsPool mocks base method +func (m *MockOptions) SetAggregateResultsPool(values AggregateResultsPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAggregateResultsPool", values) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAggregateResultsPool indicates an expected call of SetAggregateResultsPool +func (mr *MockOptionsMockRecorder) SetAggregateResultsPool(values interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAggregateResultsPool", reflect.TypeOf((*MockOptions)(nil).SetAggregateResultsPool), values) +} + +// AggregateResultsPool mocks base method +func (m *MockOptions) AggregateResultsPool() AggregateResultsPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateResultsPool") + ret0, _ := ret[0].(AggregateResultsPool) + return ret0 +} + +// AggregateResultsPool indicates an expected call of AggregateResultsPool +func (mr *MockOptionsMockRecorder) AggregateResultsPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateResultsPool", reflect.TypeOf((*MockOptions)(nil).AggregateResultsPool)) +} + +// SetAggregateValuesPool mocks base method +func (m *MockOptions) SetAggregateValuesPool(values AggregateValuesPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAggregateValuesPool", values) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAggregateValuesPool indicates an expected call of SetAggregateValuesPool +func (mr *MockOptionsMockRecorder) SetAggregateValuesPool(values interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAggregateValuesPool", reflect.TypeOf((*MockOptions)(nil).SetAggregateValuesPool), values) +} + +// AggregateValuesPool mocks base method +func (m *MockOptions) AggregateValuesPool() AggregateValuesPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateValuesPool") + ret0, _ := ret[0].(AggregateValuesPool) + return ret0 +} + +// AggregateValuesPool indicates an expected call of AggregateValuesPool +func (mr *MockOptionsMockRecorder) AggregateValuesPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateValuesPool", reflect.TypeOf((*MockOptions)(nil).AggregateValuesPool)) +} + +// SetDocumentArrayPool mocks base method +func (m *MockOptions) SetDocumentArrayPool(value doc.DocumentArrayPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetDocumentArrayPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetDocumentArrayPool indicates an expected call of SetDocumentArrayPool +func (mr *MockOptionsMockRecorder) SetDocumentArrayPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDocumentArrayPool", reflect.TypeOf((*MockOptions)(nil).SetDocumentArrayPool), value) +} + +// DocumentArrayPool mocks base method +func (m *MockOptions) DocumentArrayPool() doc.DocumentArrayPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DocumentArrayPool") + ret0, _ := ret[0].(doc.DocumentArrayPool) + return ret0 +} + +// DocumentArrayPool indicates an expected call of DocumentArrayPool +func (mr *MockOptionsMockRecorder) DocumentArrayPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DocumentArrayPool", reflect.TypeOf((*MockOptions)(nil).DocumentArrayPool)) +} + +// SetAggregateResultsEntryArrayPool mocks base method +func (m *MockOptions) SetAggregateResultsEntryArrayPool(value AggregateResultsEntryArrayPool) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetAggregateResultsEntryArrayPool", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetAggregateResultsEntryArrayPool indicates an expected call of SetAggregateResultsEntryArrayPool +func (mr *MockOptionsMockRecorder) SetAggregateResultsEntryArrayPool(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAggregateResultsEntryArrayPool", reflect.TypeOf((*MockOptions)(nil).SetAggregateResultsEntryArrayPool), value) +} + +// AggregateResultsEntryArrayPool mocks base method +func (m *MockOptions) AggregateResultsEntryArrayPool() AggregateResultsEntryArrayPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AggregateResultsEntryArrayPool") + ret0, _ := ret[0].(AggregateResultsEntryArrayPool) + return ret0 +} + +// AggregateResultsEntryArrayPool indicates an expected call of AggregateResultsEntryArrayPool +func (mr *MockOptionsMockRecorder) AggregateResultsEntryArrayPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AggregateResultsEntryArrayPool", reflect.TypeOf((*MockOptions)(nil).AggregateResultsEntryArrayPool)) +} + +// SetForegroundCompactionPlannerOptions mocks base method +func (m *MockOptions) SetForegroundCompactionPlannerOptions(v compaction.PlannerOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetForegroundCompactionPlannerOptions", v) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetForegroundCompactionPlannerOptions indicates an expected call of SetForegroundCompactionPlannerOptions +func (mr *MockOptionsMockRecorder) SetForegroundCompactionPlannerOptions(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetForegroundCompactionPlannerOptions", reflect.TypeOf((*MockOptions)(nil).SetForegroundCompactionPlannerOptions), v) +} + +// ForegroundCompactionPlannerOptions mocks base method +func (m *MockOptions) ForegroundCompactionPlannerOptions() compaction.PlannerOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ForegroundCompactionPlannerOptions") + ret0, _ := ret[0].(compaction.PlannerOptions) + return ret0 +} + +// ForegroundCompactionPlannerOptions indicates an expected call of ForegroundCompactionPlannerOptions +func (mr *MockOptionsMockRecorder) ForegroundCompactionPlannerOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ForegroundCompactionPlannerOptions", reflect.TypeOf((*MockOptions)(nil).ForegroundCompactionPlannerOptions)) +} + +// SetBackgroundCompactionPlannerOptions mocks base method +func (m *MockOptions) SetBackgroundCompactionPlannerOptions(v compaction.PlannerOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetBackgroundCompactionPlannerOptions", v) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetBackgroundCompactionPlannerOptions indicates an expected call of SetBackgroundCompactionPlannerOptions +func (mr *MockOptionsMockRecorder) SetBackgroundCompactionPlannerOptions(v interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetBackgroundCompactionPlannerOptions", reflect.TypeOf((*MockOptions)(nil).SetBackgroundCompactionPlannerOptions), v) +} + +// BackgroundCompactionPlannerOptions mocks base method +func (m *MockOptions) BackgroundCompactionPlannerOptions() compaction.PlannerOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BackgroundCompactionPlannerOptions") + ret0, _ := ret[0].(compaction.PlannerOptions) + return ret0 +} + +// BackgroundCompactionPlannerOptions indicates an expected call of BackgroundCompactionPlannerOptions +func (mr *MockOptionsMockRecorder) BackgroundCompactionPlannerOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BackgroundCompactionPlannerOptions", reflect.TypeOf((*MockOptions)(nil).BackgroundCompactionPlannerOptions)) +} + +// SetPostingsListCache mocks base method +func (m *MockOptions) SetPostingsListCache(value *PostingsListCache) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetPostingsListCache", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetPostingsListCache indicates an expected call of SetPostingsListCache +func (mr *MockOptionsMockRecorder) SetPostingsListCache(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPostingsListCache", reflect.TypeOf((*MockOptions)(nil).SetPostingsListCache), value) +} + +// PostingsListCache mocks base method +func (m *MockOptions) PostingsListCache() *PostingsListCache { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PostingsListCache") + ret0, _ := ret[0].(*PostingsListCache) + return ret0 +} + +// PostingsListCache indicates an expected call of PostingsListCache +func (mr *MockOptionsMockRecorder) PostingsListCache() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PostingsListCache", reflect.TypeOf((*MockOptions)(nil).PostingsListCache)) +} + +// SetReadThroughSegmentOptions mocks base method +func (m *MockOptions) SetReadThroughSegmentOptions(value ReadThroughSegmentOptions) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReadThroughSegmentOptions", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetReadThroughSegmentOptions indicates an expected call of SetReadThroughSegmentOptions +func (mr *MockOptionsMockRecorder) SetReadThroughSegmentOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReadThroughSegmentOptions", reflect.TypeOf((*MockOptions)(nil).SetReadThroughSegmentOptions), value) +} + +// ReadThroughSegmentOptions mocks base method +func (m *MockOptions) ReadThroughSegmentOptions() ReadThroughSegmentOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadThroughSegmentOptions") + ret0, _ := ret[0].(ReadThroughSegmentOptions) + return ret0 +} + +// ReadThroughSegmentOptions indicates an expected call of ReadThroughSegmentOptions +func (mr *MockOptionsMockRecorder) ReadThroughSegmentOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadThroughSegmentOptions", reflect.TypeOf((*MockOptions)(nil).ReadThroughSegmentOptions)) +} + +// SetForwardIndexProbability mocks base method +func (m *MockOptions) SetForwardIndexProbability(value float64) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetForwardIndexProbability", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetForwardIndexProbability indicates an expected call of SetForwardIndexProbability +func (mr *MockOptionsMockRecorder) SetForwardIndexProbability(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetForwardIndexProbability", reflect.TypeOf((*MockOptions)(nil).SetForwardIndexProbability), value) +} + +// ForwardIndexProbability mocks base method +func (m *MockOptions) ForwardIndexProbability() float64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ForwardIndexProbability") + ret0, _ := ret[0].(float64) + return ret0 +} + +// ForwardIndexProbability indicates an expected call of ForwardIndexProbability +func (mr *MockOptionsMockRecorder) ForwardIndexProbability() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ForwardIndexProbability", reflect.TypeOf((*MockOptions)(nil).ForwardIndexProbability)) +} + +// SetForwardIndexThreshold mocks base method +func (m *MockOptions) SetForwardIndexThreshold(value float64) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetForwardIndexThreshold", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetForwardIndexThreshold indicates an expected call of SetForwardIndexThreshold +func (mr *MockOptionsMockRecorder) SetForwardIndexThreshold(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetForwardIndexThreshold", reflect.TypeOf((*MockOptions)(nil).SetForwardIndexThreshold), value) +} + +// ForwardIndexThreshold mocks base method +func (m *MockOptions) ForwardIndexThreshold() float64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ForwardIndexThreshold") + ret0, _ := ret[0].(float64) + return ret0 +} + +// ForwardIndexThreshold indicates an expected call of ForwardIndexThreshold +func (mr *MockOptionsMockRecorder) ForwardIndexThreshold() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ForwardIndexThreshold", reflect.TypeOf((*MockOptions)(nil).ForwardIndexThreshold)) +} + +// SetMmapReporter mocks base method +func (m *MockOptions) SetMmapReporter(mmapReporter mmap.Reporter) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetMmapReporter", mmapReporter) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetMmapReporter indicates an expected call of SetMmapReporter +func (mr *MockOptionsMockRecorder) SetMmapReporter(mmapReporter interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMmapReporter", reflect.TypeOf((*MockOptions)(nil).SetMmapReporter), mmapReporter) +} + +// MmapReporter mocks base method +func (m *MockOptions) MmapReporter() mmap.Reporter { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MmapReporter") + ret0, _ := ret[0].(mmap.Reporter) + return ret0 +} + +// MmapReporter indicates an expected call of MmapReporter +func (mr *MockOptionsMockRecorder) MmapReporter() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MmapReporter", reflect.TypeOf((*MockOptions)(nil).MmapReporter)) +} + +// SetQueryLimits mocks base method +func (m *MockOptions) SetQueryLimits(value limits.QueryLimits) Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetQueryLimits", value) + ret0, _ := ret[0].(Options) + return ret0 +} + +// SetQueryLimits indicates an expected call of SetQueryLimits +func (mr *MockOptionsMockRecorder) SetQueryLimits(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetQueryLimits", reflect.TypeOf((*MockOptions)(nil).SetQueryLimits), value) +} + +// QueryLimits mocks base method +func (m *MockOptions) QueryLimits() limits.QueryLimits { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryLimits") + ret0, _ := ret[0].(limits.QueryLimits) + return ret0 +} + +// QueryLimits indicates an expected call of QueryLimits +func (mr *MockOptionsMockRecorder) QueryLimits() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryLimits", reflect.TypeOf((*MockOptions)(nil).QueryLimits)) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/mutable_segments.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/mutable_segments.go new file mode 100644 index 00000000..baa904cd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/mutable_segments.go @@ -0,0 +1,841 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "errors" + "fmt" + "math" + "runtime" + "sync" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/storage/index/compaction" + "github.com/m3db/m3/src/dbnode/storage/index/segments" + m3ninxindex "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/index/segment/builder" + "github.com/m3db/m3/src/m3ninx/index/segment/fst" + xclose "github.com/m3db/m3/src/x/close" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/mmap" + + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +var ( + errUnableToWriteBlockConcurrent = errors.New("unable to write, index block is being written to already") + errMutableSegmentsAlreadyClosed = errors.New("mutable segments already closed") + errForegroundCompactorNoPlan = errors.New("index foreground compactor failed to generate a plan") + errForegroundCompactorBadPlanFirstTask = errors.New("index foreground compactor generated plan without mutable segment in first task") + errForegroundCompactorBadPlanSecondaryTask = errors.New("index foreground compactor generated plan with mutable segment a secondary task") +) + +type mutableSegmentsState uint + +const ( + mutableSegmentsStateOpen mutableSegmentsState = iota + mutableSegmentsStateClosed mutableSegmentsState = iota +) + +// nolint: maligned +type mutableSegments struct { + sync.RWMutex + + state mutableSegmentsState + + foregroundSegments []*readableSeg + backgroundSegments []*readableSeg + + compact mutableSegmentsCompact + blockStart time.Time + blockOpts BlockOptions + opts Options + iopts instrument.Options + optsListener xclose.SimpleCloser + writeIndexingConcurrency int + + metrics mutableSegmentsMetrics + logger *zap.Logger +} + +type mutableSegmentsMetrics struct { + foregroundCompactionPlanRunLatency tally.Timer + foregroundCompactionTaskRunLatency tally.Timer + backgroundCompactionPlanRunLatency tally.Timer + backgroundCompactionTaskRunLatency tally.Timer +} + +func newMutableSegmentsMetrics(s tally.Scope) mutableSegmentsMetrics { + foregroundScope := s.Tagged(map[string]string{"compaction-type": "foreground"}) + backgroundScope := s.Tagged(map[string]string{"compaction-type": "background"}) + return mutableSegmentsMetrics{ + foregroundCompactionPlanRunLatency: foregroundScope.Timer("compaction-plan-run-latency"), + foregroundCompactionTaskRunLatency: foregroundScope.Timer("compaction-task-run-latency"), + backgroundCompactionPlanRunLatency: backgroundScope.Timer("compaction-plan-run-latency"), + backgroundCompactionTaskRunLatency: backgroundScope.Timer("compaction-task-run-latency"), + } +} + +// NewBlock returns a new Block, representing a complete reverse index for the +// duration of time specified. It is backed by one or more segments. +func newMutableSegments( + blockStart time.Time, + opts Options, + blockOpts BlockOptions, + namespaceRuntimeOptsMgr namespace.RuntimeOptionsManager, + iopts instrument.Options, +) *mutableSegments { + m := &mutableSegments{ + blockStart: blockStart, + opts: opts, + blockOpts: blockOpts, + iopts: iopts, + metrics: newMutableSegmentsMetrics(iopts.MetricsScope()), + logger: iopts.Logger(), + } + m.optsListener = namespaceRuntimeOptsMgr.RegisterListener(m) + return m +} + +func (m *mutableSegments) SetNamespaceRuntimeOptions(opts namespace.RuntimeOptions) { + m.Lock() + // Update current runtime opts for segment builders created in future. + perCPUFraction := opts.WriteIndexingPerCPUConcurrencyOrDefault() + cpus := math.Ceil(perCPUFraction * float64(runtime.NumCPU())) + m.writeIndexingConcurrency = int(math.Max(1, cpus)) + segmentBuilder := m.compact.segmentBuilder + m.Unlock() + + // Reset any existing segment builder to new concurrency, do this + // out of the lock since builder can be used for foreground compaction + // outside the lock and does it's own locking. + if segmentBuilder != nil { + segmentBuilder.SetIndexConcurrency(m.writeIndexingConcurrency) + } + + // Set the global concurrency control we have (we may need to fork + // github.com/twotwotwo/sorts to control this on a per segment builder + // basis). + builder.SetSortConcurrency(m.writeIndexingConcurrency) +} + +func (m *mutableSegments) WriteBatch(inserts *WriteBatch) error { + m.Lock() + if m.state == mutableSegmentsStateClosed { + return errMutableSegmentsAlreadyClosed + } + + if m.compact.compactingForeground { + m.Unlock() + return errUnableToWriteBlockConcurrent + } + + // Lazily allocate the segment builder and compactors. + err := m.compact.allocLazyBuilderAndCompactorsWithLock(m.writeIndexingConcurrency, + m.blockOpts, m.opts) + if err != nil { + m.Unlock() + return err + } + + m.compact.compactingForeground = true + builder := m.compact.segmentBuilder + m.Unlock() + + defer func() { + m.Lock() + m.compact.compactingForeground = false + m.cleanupForegroundCompactWithLock() + m.Unlock() + }() + + builder.Reset() + insertResultErr := builder.InsertBatch(m3ninxindex.Batch{ + Docs: inserts.PendingDocs(), + AllowPartialUpdates: true, + }) + if len(builder.Docs()) == 0 { + // No inserts, no need to compact. + return insertResultErr + } + + // We inserted some documents, need to compact immediately into a + // foreground segment from the segment builder before we can serve reads + // from an FST segment. + err = m.foregroundCompactWithBuilder(builder) + if err != nil { + return err + } + + // Return result from the original insertion since compaction was successful. + return insertResultErr +} + +func (m *mutableSegments) AddReaders(readers []segment.Reader) ([]segment.Reader, error) { + m.RLock() + defer m.RUnlock() + + var err error + readers, err = m.addReadersWithLock(m.foregroundSegments, readers) + if err != nil { + return nil, err + } + + readers, err = m.addReadersWithLock(m.backgroundSegments, readers) + if err != nil { + return nil, err + } + + return readers, nil +} + +func (m *mutableSegments) addReadersWithLock(src []*readableSeg, dst []segment.Reader) ([]segment.Reader, error) { + for _, seg := range src { + reader, err := seg.Segment().Reader() + if err != nil { + return nil, err + } + dst = append(dst, reader) + } + return dst, nil +} + +func (m *mutableSegments) Len() int { + m.RLock() + defer m.RUnlock() + + return len(m.foregroundSegments) + len(m.backgroundSegments) +} + +func (m *mutableSegments) MemorySegmentsData(ctx context.Context) ([]fst.SegmentData, error) { + m.RLock() + defer m.RUnlock() + + // NB(r): This is for debug operations, do not bother about allocations. + var results []fst.SegmentData + for _, segs := range [][]*readableSeg{ + m.foregroundSegments, + m.backgroundSegments, + } { + for _, seg := range segs { + fstSegment, ok := seg.Segment().(fst.Segment) + if !ok { + return nil, fmt.Errorf("segment not fst segment: created=%v", seg.createdAt) + } + + segmentData, err := fstSegment.SegmentData(ctx) + if err != nil { + return nil, err + } + + results = append(results, segmentData) + } + } + return results, nil +} + +func (m *mutableSegments) NeedsEviction() bool { + m.RLock() + defer m.RUnlock() + + var needsEviction bool + for _, seg := range m.foregroundSegments { + needsEviction = needsEviction || seg.Segment().Size() > 0 + } + for _, seg := range m.backgroundSegments { + needsEviction = needsEviction || seg.Segment().Size() > 0 + } + return needsEviction +} + +func (m *mutableSegments) NumSegmentsAndDocs() (int64, int64) { + m.RLock() + defer m.RUnlock() + + var ( + numSegments, numDocs int64 + ) + for _, seg := range m.foregroundSegments { + numSegments++ + numDocs += seg.Segment().Size() + } + for _, seg := range m.backgroundSegments { + numSegments++ + numDocs += seg.Segment().Size() + } + return numSegments, numDocs +} + +func (m *mutableSegments) Stats(reporter BlockStatsReporter) { + m.RLock() + defer m.RUnlock() + + for _, seg := range m.foregroundSegments { + _, mutable := seg.Segment().(segment.MutableSegment) + reporter.ReportSegmentStats(BlockSegmentStats{ + Type: ActiveForegroundSegment, + Mutable: mutable, + Age: seg.Age(), + Size: seg.Segment().Size(), + }) + } + for _, seg := range m.backgroundSegments { + _, mutable := seg.Segment().(segment.MutableSegment) + reporter.ReportSegmentStats(BlockSegmentStats{ + Type: ActiveBackgroundSegment, + Mutable: mutable, + Age: seg.Age(), + Size: seg.Segment().Size(), + }) + } + + reporter.ReportIndexingStats(BlockIndexingStats{ + IndexConcurrency: m.writeIndexingConcurrency, + }) +} + +func (m *mutableSegments) Close() { + m.Lock() + defer m.Unlock() + m.state = mutableSegmentsStateClosed + m.cleanupCompactWithLock() + m.optsListener.Close() +} + +func (m *mutableSegments) maybeBackgroundCompactWithLock() { + if m.compact.compactingBackground { + return + } + + // Create a logical plan. + segs := make([]compaction.Segment, 0, len(m.backgroundSegments)) + for _, seg := range m.backgroundSegments { + segs = append(segs, compaction.Segment{ + Age: seg.Age(), + Size: seg.Segment().Size(), + Type: segments.FSTType, + Segment: seg.Segment(), + }) + } + + plan, err := compaction.NewPlan(segs, m.opts.BackgroundCompactionPlannerOptions()) + if err != nil { + instrument.EmitAndLogInvariantViolation(m.iopts, func(l *zap.Logger) { + l.Error("index background compaction plan error", zap.Error(err)) + }) + return + } + + if len(plan.Tasks) == 0 { + return + } + + // Kick off compaction. + m.compact.compactingBackground = true + go func() { + m.backgroundCompactWithPlan(plan) + + m.Lock() + m.compact.compactingBackground = false + m.cleanupBackgroundCompactWithLock() + m.Unlock() + }() +} + +func (m *mutableSegments) shouldEvictCompactedSegmentsWithLock() bool { + return m.state == mutableSegmentsStateClosed +} + +func (m *mutableSegments) cleanupBackgroundCompactWithLock() { + if m.state == mutableSegmentsStateOpen { + // See if we need to trigger another compaction. + m.maybeBackgroundCompactWithLock() + return + } + + // Check if need to close all the compacted segments due to + // mutableSegments being closed. + if !m.shouldEvictCompactedSegmentsWithLock() { + return + } + + // Close compacted segments. + m.closeCompactedSegmentsWithLock(m.backgroundSegments) + m.backgroundSegments = nil + + // Free compactor resources. + if m.compact.backgroundCompactor == nil { + return + } + + if err := m.compact.backgroundCompactor.Close(); err != nil { + instrument.EmitAndLogInvariantViolation(m.iopts, func(l *zap.Logger) { + l.Error("error closing index block background compactor", zap.Error(err)) + }) + } + m.compact.backgroundCompactor = nil +} + +func (m *mutableSegments) closeCompactedSegmentsWithLock(segments []*readableSeg) { + for _, seg := range segments { + err := seg.Segment().Close() + if err != nil { + instrument.EmitAndLogInvariantViolation(m.iopts, func(l *zap.Logger) { + l.Error("could not close compacted segment", zap.Error(err)) + }) + } + } +} + +func (m *mutableSegments) backgroundCompactWithPlan(plan *compaction.Plan) { + sw := m.metrics.backgroundCompactionPlanRunLatency.Start() + defer sw.Stop() + + n := m.compact.numBackground + m.compact.numBackground++ + + logger := m.logger.With( + zap.Time("blockStart", m.blockStart), + zap.Int("numBackgroundCompaction", n), + ) + log := n%compactDebugLogEvery == 0 + if log { + for i, task := range plan.Tasks { + summary := task.Summary() + logger.Debug("planned background compaction task", + zap.Int("task", i), + zap.Int("numMutable", summary.NumMutable), + zap.Int("numFST", summary.NumFST), + zap.Stringer("cumulativeMutableAge", summary.CumulativeMutableAge), + zap.Int64("cumulativeSize", summary.CumulativeSize), + ) + } + } + + for i, task := range plan.Tasks { + err := m.backgroundCompactWithTask(task, log, + logger.With(zap.Int("task", i))) + if err != nil { + instrument.EmitAndLogInvariantViolation(m.iopts, func(l *zap.Logger) { + l.Error("error compacting segments", zap.Error(err)) + }) + return + } + } +} + +func (m *mutableSegments) backgroundCompactWithTask( + task compaction.Task, + log bool, + logger *zap.Logger, +) error { + if log { + logger.Debug("start compaction task") + } + + segments := make([]segment.Segment, 0, len(task.Segments)) + for _, seg := range task.Segments { + segments = append(segments, seg.Segment) + } + + start := time.Now() + compacted, err := m.compact.backgroundCompactor.Compact(segments, mmap.ReporterOptions{ + Context: mmap.Context{ + Name: mmapIndexBlockName, + }, + Reporter: m.opts.MmapReporter(), + }) + took := time.Since(start) + m.metrics.backgroundCompactionTaskRunLatency.Record(took) + + if log { + logger.Debug("done compaction task", zap.Duration("took", took)) + } + + if err != nil { + return err + } + + // Add a read through cache for repeated expensive queries against + // background compacted segments since they can live for quite some + // time and accrue a large set of documents. + if immSeg, ok := compacted.(segment.ImmutableSegment); ok { + var ( + plCache = m.opts.PostingsListCache() + readThroughOpts = m.opts.ReadThroughSegmentOptions() + ) + compacted = NewReadThroughSegment(immSeg, plCache, readThroughOpts) + } + + // Rotate out the replaced frozen segments and add the compacted one. + m.Lock() + defer m.Unlock() + + result := m.addCompactedSegmentFromSegmentsWithLock(m.backgroundSegments, + segments, compacted) + m.backgroundSegments = result + + return nil +} + +func (m *mutableSegments) addCompactedSegmentFromSegmentsWithLock( + current []*readableSeg, + segmentsJustCompacted []segment.Segment, + compacted segment.Segment, +) []*readableSeg { + result := make([]*readableSeg, 0, len(current)) + for _, existing := range current { + keepCurr := true + for _, seg := range segmentsJustCompacted { + if existing.Segment() == seg { + // Do not keep this one, it was compacted just then. + keepCurr = false + break + } + } + + if keepCurr { + result = append(result, existing) + continue + } + + err := existing.Segment().Close() + if err != nil { + // Already compacted, not much we can do about not closing it. + instrument.EmitAndLogInvariantViolation(m.iopts, func(l *zap.Logger) { + l.Error("unable to close compacted block", zap.Error(err)) + }) + } + } + + // Return all the ones we kept plus the new compacted segment + return append(result, newReadableSeg(compacted, m.opts)) +} + +func (m *mutableSegments) foregroundCompactWithBuilder(builder segment.DocumentsBuilder) error { + // We inserted some documents, need to compact immediately into a + // foreground segment. + m.Lock() + foregroundSegments := m.foregroundSegments + m.Unlock() + + segs := make([]compaction.Segment, 0, len(foregroundSegments)+1) + segs = append(segs, compaction.Segment{ + Age: 0, + Size: int64(len(builder.Docs())), + Type: segments.MutableType, + Builder: builder, + }) + for _, seg := range foregroundSegments { + segs = append(segs, compaction.Segment{ + Age: seg.Age(), + Size: seg.Segment().Size(), + Type: segments.FSTType, + Segment: seg.Segment(), + }) + } + + plan, err := compaction.NewPlan(segs, m.opts.ForegroundCompactionPlannerOptions()) + if err != nil { + return err + } + + // Check plan + if len(plan.Tasks) == 0 { + // Should always generate a task when a mutable builder is passed to planner + return errForegroundCompactorNoPlan + } + if taskNumBuilders(plan.Tasks[0]) != 1 { + // First task of plan must include the builder, so we can avoid resetting it + // for the first task, but then safely reset it in consequent tasks + return errForegroundCompactorBadPlanFirstTask + } + + // Move any unused segments to the background. + m.Lock() + m.maybeMoveForegroundSegmentsToBackgroundWithLock(plan.UnusedSegments) + m.Unlock() + + n := m.compact.numForeground + m.compact.numForeground++ + + logger := m.logger.With( + zap.Time("blockStart", m.blockStart), + zap.Int("numForegroundCompaction", n), + ) + log := n%compactDebugLogEvery == 0 + if log { + for i, task := range plan.Tasks { + summary := task.Summary() + logger.Debug("planned foreground compaction task", + zap.Int("task", i), + zap.Int("numMutable", summary.NumMutable), + zap.Int("numFST", summary.NumFST), + zap.Duration("cumulativeMutableAge", summary.CumulativeMutableAge), + zap.Int64("cumulativeSize", summary.CumulativeSize), + ) + } + } + + // Run the plan. + sw := m.metrics.foregroundCompactionPlanRunLatency.Start() + defer sw.Stop() + + // Run the first task, without resetting the builder. + if err := m.foregroundCompactWithTask( + builder, plan.Tasks[0], + log, logger.With(zap.Int("task", 0)), + ); err != nil { + return err + } + + // Now run each consequent task, resetting the builder each time since + // the results from the builder have already been compacted in the first + // task. + for i := 1; i < len(plan.Tasks); i++ { + task := plan.Tasks[i] + if taskNumBuilders(task) > 0 { + // Only the first task should compact the builder + return errForegroundCompactorBadPlanSecondaryTask + } + // Now use the builder after resetting it. + builder.Reset() + if err := m.foregroundCompactWithTask( + builder, task, + log, logger.With(zap.Int("task", i)), + ); err != nil { + return err + } + } + + return nil +} + +func (m *mutableSegments) maybeMoveForegroundSegmentsToBackgroundWithLock( + segments []compaction.Segment, +) { + if len(segments) == 0 { + return + } + if m.compact.backgroundCompactor == nil { + // No longer performing background compaction due to evict/close. + return + } + + m.logger.Debug("moving segments from foreground to background", + zap.Int("numSegments", len(segments))) + + // If background compaction is still active, then we move any unused + // foreground segments into the background so that they might be + // compacted by the background compactor at some point. + i := 0 + for _, currForeground := range m.foregroundSegments { + movedToBackground := false + for _, seg := range segments { + if currForeground.Segment() == seg.Segment { + m.backgroundSegments = append(m.backgroundSegments, currForeground) + movedToBackground = true + break + } + } + if movedToBackground { + continue // No need to keep this segment, we moved it. + } + + m.foregroundSegments[i] = currForeground + i++ + } + + m.foregroundSegments = m.foregroundSegments[:i] + + // Potentially kick off a background compaction. + m.maybeBackgroundCompactWithLock() +} + +func (m *mutableSegments) foregroundCompactWithTask( + builder segment.DocumentsBuilder, + task compaction.Task, + log bool, + logger *zap.Logger, +) error { + if log { + logger.Debug("start compaction task") + } + + segments := make([]segment.Segment, 0, len(task.Segments)) + for _, seg := range task.Segments { + if seg.Segment == nil { + continue // This means the builder is being used. + } + segments = append(segments, seg.Segment) + } + + start := time.Now() + compacted, err := m.compact.foregroundCompactor.CompactUsingBuilder(builder, segments, mmap.ReporterOptions{ + Context: mmap.Context{ + Name: mmapIndexBlockName, + }, + Reporter: m.opts.MmapReporter(), + }) + took := time.Since(start) + m.metrics.foregroundCompactionTaskRunLatency.Record(took) + + if log { + logger.Debug("done compaction task", zap.Duration("took", took)) + } + + if err != nil { + return err + } + + // Rotate in the ones we just compacted. + m.Lock() + defer m.Unlock() + + result := m.addCompactedSegmentFromSegmentsWithLock(m.foregroundSegments, + segments, compacted) + m.foregroundSegments = result + + return nil +} + +func (m *mutableSegments) cleanupForegroundCompactWithLock() { + // Check if need to close all the compacted segments due to + // mutableSegments being closed. + if !m.shouldEvictCompactedSegmentsWithLock() { + return + } + + // Close compacted segments. + m.closeCompactedSegmentsWithLock(m.foregroundSegments) + m.foregroundSegments = nil + + // Free compactor resources. + if m.compact.foregroundCompactor != nil { + if err := m.compact.foregroundCompactor.Close(); err != nil { + instrument.EmitAndLogInvariantViolation(m.iopts, func(l *zap.Logger) { + l.Error("error closing index block foreground compactor", zap.Error(err)) + }) + } + m.compact.foregroundCompactor = nil + } + + // Free segment builder resources. + if m.compact.segmentBuilder != nil { + if err := m.compact.segmentBuilder.Close(); err != nil { + instrument.EmitAndLogInvariantViolation(m.iopts, func(l *zap.Logger) { + l.Error("error closing index block segment builder", zap.Error(err)) + }) + } + m.compact.segmentBuilder = nil + } +} +func (m *mutableSegments) cleanupCompactWithLock() { + // If not compacting, trigger a cleanup so that all frozen segments get + // closed, otherwise after the current running compaction the compacted + // segments will get closed. + if !m.compact.compactingForeground { + m.cleanupForegroundCompactWithLock() + } + if !m.compact.compactingBackground { + m.cleanupBackgroundCompactWithLock() + } +} + +// mutableSegmentsCompact has several lazily allocated compaction components. +type mutableSegmentsCompact struct { + segmentBuilder segment.CloseableDocumentsBuilder + foregroundCompactor *compaction.Compactor + backgroundCompactor *compaction.Compactor + compactingForeground bool + compactingBackground bool + numForeground int + numBackground int +} + +func (m *mutableSegmentsCompact) allocLazyBuilderAndCompactorsWithLock( + concurrency int, + blockOpts BlockOptions, + opts Options, +) error { + var ( + err error + docsPool = opts.DocumentArrayPool() + ) + if m.segmentBuilder == nil { + builderOpts := opts.SegmentBuilderOptions(). + SetConcurrency(concurrency) + + m.segmentBuilder, err = builder.NewBuilderFromDocuments(builderOpts) + if err != nil { + return err + } + } + + if m.foregroundCompactor == nil { + m.foregroundCompactor, err = compaction.NewCompactor(docsPool, + DocumentArrayPoolCapacity, + opts.SegmentBuilderOptions(), + opts.FSTSegmentOptions(), + compaction.CompactorOptions{ + FSTWriterOptions: &fst.WriterOptions{ + // DisableRegistry is set to true to trade a larger FST size + // for a faster FST compaction since we want to reduce the end + // to end latency for time to first index a metric. + DisableRegistry: true, + }, + MmapDocsData: blockOpts.ForegroundCompactorMmapDocsData, + }) + if err != nil { + return err + } + } + + if m.backgroundCompactor == nil { + m.backgroundCompactor, err = compaction.NewCompactor(docsPool, + DocumentArrayPoolCapacity, + opts.SegmentBuilderOptions(), + opts.FSTSegmentOptions(), + compaction.CompactorOptions{ + MmapDocsData: blockOpts.BackgroundCompactorMmapDocsData, + }) + if err != nil { + return err + } + } + + return nil +} + +func taskNumBuilders(task compaction.Task) int { + builders := 0 + for _, seg := range task.Segments { + if seg.Builder != nil { + builders++ + continue + } + } + return builders +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/options.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/options.go new file mode 100644 index 00000000..ba524327 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/options.go @@ -0,0 +1,430 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "errors" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/storage/index/compaction" + "github.com/m3db/m3/src/dbnode/storage/limits" + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index/segment/builder" + "github.com/m3db/m3/src/m3ninx/index/segment/fst" + "github.com/m3db/m3/src/m3ninx/index/segment/mem" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/mmap" + "github.com/m3db/m3/src/x/pool" +) + +const ( + // defaultIndexInsertMode sets the default indexing mode to synchronous. + defaultIndexInsertMode = InsertSync + + // documentArrayPool size in general: 256*256*sizeof(doc.Document) + // = 256 * 256 * 16 + // = 1mb (but with Go's heap probably 2mb) + // TODO(r): Make this configurable in a followup change. + documentArrayPoolSize = 256 + // DocumentArrayPoolCapacity is the capacity of the document array pool. + DocumentArrayPoolCapacity = 256 + documentArrayPoolMaxCapacity = 256 // Do not allow grows, since we know the size + + // aggregateResultsEntryArrayPool size in general: 256*256*sizeof(doc.Field) + // = 256 * 256 * 16 + // = 1mb (but with Go's heap probably 2mb) + // TODO(prateek): Make this configurable in a followup change. + aggregateResultsEntryArrayPoolSize = 256 + aggregateResultsEntryArrayPoolCapacity = 256 + aggregateResultsEntryArrayPoolMaxCapacity = 256 // Do not allow grows, since we know the size +) + +var ( + errOptionsIdentifierPoolUnspecified = errors.New("identifier pool is unset") + errOptionsBytesPoolUnspecified = errors.New("checkedbytes pool is unset") + errOptionsResultsPoolUnspecified = errors.New("results pool is unset") + errOptionsAggResultsPoolUnspecified = errors.New("aggregate results pool is unset") + errOptionsAggValuesPoolUnspecified = errors.New("aggregate values pool is unset") + errOptionsDocPoolUnspecified = errors.New("docs array pool is unset") + errOptionsAggResultsEntryPoolUnspecified = errors.New("aggregate results entry array pool is unset") + errIDGenerationDisabled = errors.New("id generation is disabled") + errPostingsListCacheUnspecified = errors.New("postings list cache is unset") + errOptionsQueryLimitsUnspecified = errors.New("query limits is unset") + + defaultForegroundCompactionOpts compaction.PlannerOptions + defaultBackgroundCompactionOpts compaction.PlannerOptions +) + +func init() { + // Foreground compaction opts are the same as background compaction + // but with only a single level, 1/4 the size of the first level of + // the background compaction. + defaultForegroundCompactionOpts = compaction.DefaultOptions + defaultForegroundCompactionOpts.Levels = []compaction.Level{ + { + MinSizeInclusive: 0, + MaxSizeExclusive: 1 << 12, + }, + } + defaultBackgroundCompactionOpts = compaction.DefaultOptions + defaultBackgroundCompactionOpts.Levels = []compaction.Level{ + { + MinSizeInclusive: 0, + MaxSizeExclusive: 1 << 18, + }, + { + MinSizeInclusive: 1 << 18, + MaxSizeExclusive: 1 << 20, + }, + { + MinSizeInclusive: 1 << 20, + MaxSizeExclusive: 1 << 22, + }, + } +} + +// nolint: maligned +type opts struct { + forwardIndexThreshold float64 + forwardIndexProbability float64 + insertMode InsertMode + clockOpts clock.Options + instrumentOpts instrument.Options + builderOpts builder.Options + memOpts mem.Options + fstOpts fst.Options + idPool ident.Pool + bytesPool pool.CheckedBytesPool + resultsPool QueryResultsPool + aggResultsPool AggregateResultsPool + aggValuesPool AggregateValuesPool + docArrayPool doc.DocumentArrayPool + aggResultsEntryArrayPool AggregateResultsEntryArrayPool + foregroundCompactionPlannerOpts compaction.PlannerOptions + backgroundCompactionPlannerOpts compaction.PlannerOptions + postingsListCache *PostingsListCache + readThroughSegmentOptions ReadThroughSegmentOptions + mmapReporter mmap.Reporter + queryLimits limits.QueryLimits +} + +var undefinedUUIDFn = func() ([]byte, error) { return nil, errIDGenerationDisabled } + +// NewOptions returns a new Options object with default properties. +func NewOptions() Options { + resultsPool := NewQueryResultsPool(pool.NewObjectPoolOptions()) + aggResultsPool := NewAggregateResultsPool(pool.NewObjectPoolOptions()) + aggValuesPool := NewAggregateValuesPool(pool.NewObjectPoolOptions()) + + bytesPool := pool.NewCheckedBytesPool(nil, nil, func(s []pool.Bucket) pool.BytesPool { + return pool.NewBytesPool(s, nil) + }) + bytesPool.Init() + + idPool := ident.NewPool(bytesPool, ident.PoolOptions{}) + + docArrayPool := doc.NewDocumentArrayPool(doc.DocumentArrayPoolOpts{ + Options: pool.NewObjectPoolOptions(). + SetSize(documentArrayPoolSize), + Capacity: DocumentArrayPoolCapacity, + MaxCapacity: documentArrayPoolMaxCapacity, + }) + docArrayPool.Init() + + aggResultsEntryArrayPool := NewAggregateResultsEntryArrayPool(AggregateResultsEntryArrayPoolOpts{ + Options: pool.NewObjectPoolOptions(). + SetSize(aggregateResultsEntryArrayPoolSize), + Capacity: aggregateResultsEntryArrayPoolCapacity, + MaxCapacity: aggregateResultsEntryArrayPoolMaxCapacity, + }) + aggResultsEntryArrayPool.Init() + + instrumentOpts := instrument.NewOptions() + opts := &opts{ + insertMode: defaultIndexInsertMode, + clockOpts: clock.NewOptions(), + instrumentOpts: instrumentOpts, + builderOpts: builder.NewOptions().SetNewUUIDFn(undefinedUUIDFn), + memOpts: mem.NewOptions().SetNewUUIDFn(undefinedUUIDFn), + fstOpts: fst.NewOptions().SetInstrumentOptions(instrumentOpts), + bytesPool: bytesPool, + idPool: idPool, + resultsPool: resultsPool, + aggResultsPool: aggResultsPool, + aggValuesPool: aggValuesPool, + docArrayPool: docArrayPool, + aggResultsEntryArrayPool: aggResultsEntryArrayPool, + foregroundCompactionPlannerOpts: defaultForegroundCompactionOpts, + backgroundCompactionPlannerOpts: defaultBackgroundCompactionOpts, + queryLimits: limits.NoOpQueryLimits(), + } + resultsPool.Init(func() QueryResults { + return NewQueryResults(nil, QueryResultsOptions{}, opts) + }) + aggResultsPool.Init(func() AggregateResults { + return NewAggregateResults(nil, AggregateResultsOptions{}, opts) + }) + aggValuesPool.Init(func() AggregateValues { return NewAggregateValues(opts) }) + return opts +} + +func (o *opts) Validate() error { + if o.idPool == nil { + return errOptionsIdentifierPoolUnspecified + } + if o.bytesPool == nil { + return errOptionsBytesPoolUnspecified + } + if o.resultsPool == nil { + return errOptionsResultsPoolUnspecified + } + if o.aggResultsPool == nil { + return errOptionsAggResultsPoolUnspecified + } + if o.aggValuesPool == nil { + return errOptionsAggValuesPoolUnspecified + } + if o.docArrayPool == nil { + return errOptionsDocPoolUnspecified + } + if o.aggResultsEntryArrayPool == nil { + return errOptionsAggResultsEntryPoolUnspecified + } + if o.postingsListCache == nil { + return errPostingsListCacheUnspecified + } + return nil +} + +func (o *opts) SetInsertMode(value InsertMode) Options { + opts := *o + opts.insertMode = value + return &opts +} + +func (o *opts) InsertMode() InsertMode { + return o.insertMode +} + +func (o *opts) SetClockOptions(value clock.Options) Options { + opts := *o + opts.clockOpts = value + return &opts +} + +func (o *opts) ClockOptions() clock.Options { + return o.clockOpts +} + +func (o *opts) SetInstrumentOptions(value instrument.Options) Options { + opts := *o + memOpts := opts.MemSegmentOptions().SetInstrumentOptions(value) + fstOpts := opts.FSTSegmentOptions().SetInstrumentOptions(value) + opts.instrumentOpts = value + opts.memOpts = memOpts + opts.fstOpts = fstOpts + return &opts +} + +func (o *opts) InstrumentOptions() instrument.Options { + return o.instrumentOpts +} + +func (o *opts) SetSegmentBuilderOptions(value builder.Options) Options { + opts := *o + opts.builderOpts = value + return &opts +} + +func (o *opts) SegmentBuilderOptions() builder.Options { + return o.builderOpts +} + +func (o *opts) SetMemSegmentOptions(value mem.Options) Options { + opts := *o + opts.memOpts = value + return &opts +} + +func (o *opts) MemSegmentOptions() mem.Options { + return o.memOpts +} + +func (o *opts) SetFSTSegmentOptions(value fst.Options) Options { + opts := *o + opts.fstOpts = value + return &opts +} + +func (o *opts) FSTSegmentOptions() fst.Options { + return o.fstOpts +} + +func (o *opts) SetIdentifierPool(value ident.Pool) Options { + opts := *o + opts.idPool = value + return &opts +} + +func (o *opts) IdentifierPool() ident.Pool { + return o.idPool +} + +func (o *opts) SetCheckedBytesPool(value pool.CheckedBytesPool) Options { + opts := *o + opts.bytesPool = value + return &opts +} + +func (o *opts) CheckedBytesPool() pool.CheckedBytesPool { + return o.bytesPool +} + +func (o *opts) SetQueryResultsPool(value QueryResultsPool) Options { + opts := *o + opts.resultsPool = value + return &opts +} + +func (o *opts) QueryResultsPool() QueryResultsPool { + return o.resultsPool +} + +func (o *opts) SetAggregateResultsPool(value AggregateResultsPool) Options { + opts := *o + opts.aggResultsPool = value + return &opts +} + +func (o *opts) AggregateResultsPool() AggregateResultsPool { + return o.aggResultsPool +} + +func (o *opts) SetAggregateValuesPool(value AggregateValuesPool) Options { + opts := *o + opts.aggValuesPool = value + return &opts +} + +func (o *opts) AggregateValuesPool() AggregateValuesPool { + return o.aggValuesPool +} + +func (o *opts) SetDocumentArrayPool(value doc.DocumentArrayPool) Options { + opts := *o + opts.docArrayPool = value + return &opts +} + +func (o *opts) DocumentArrayPool() doc.DocumentArrayPool { + return o.docArrayPool +} + +func (o *opts) SetAggregateResultsEntryArrayPool(value AggregateResultsEntryArrayPool) Options { + opts := *o + opts.aggResultsEntryArrayPool = value + return &opts +} + +func (o *opts) AggregateResultsEntryArrayPool() AggregateResultsEntryArrayPool { + return o.aggResultsEntryArrayPool +} + +func (o *opts) SetForegroundCompactionPlannerOptions(value compaction.PlannerOptions) Options { + opts := *o + opts.foregroundCompactionPlannerOpts = value + return &opts +} + +func (o *opts) ForegroundCompactionPlannerOptions() compaction.PlannerOptions { + return o.foregroundCompactionPlannerOpts +} + +func (o *opts) SetBackgroundCompactionPlannerOptions(value compaction.PlannerOptions) Options { + opts := *o + opts.backgroundCompactionPlannerOpts = value + return &opts +} + +func (o *opts) BackgroundCompactionPlannerOptions() compaction.PlannerOptions { + return o.backgroundCompactionPlannerOpts +} + +func (o *opts) SetPostingsListCache(value *PostingsListCache) Options { + opts := *o + opts.postingsListCache = value + return &opts +} + +func (o *opts) PostingsListCache() *PostingsListCache { + return o.postingsListCache +} + +func (o *opts) SetReadThroughSegmentOptions(value ReadThroughSegmentOptions) Options { + opts := *o + opts.readThroughSegmentOptions = value + return &opts +} + +func (o *opts) ReadThroughSegmentOptions() ReadThroughSegmentOptions { + return o.readThroughSegmentOptions +} + +func (o *opts) SetForwardIndexProbability(value float64) Options { + opts := *o + opts.forwardIndexProbability = value + return &opts +} + +func (o *opts) ForwardIndexProbability() float64 { + return o.forwardIndexProbability +} + +func (o *opts) SetForwardIndexThreshold(value float64) Options { + opts := *o + opts.forwardIndexThreshold = value + return &opts +} + +func (o *opts) ForwardIndexThreshold() float64 { + return o.forwardIndexThreshold +} + +func (o *opts) SetMmapReporter(mmapReporter mmap.Reporter) Options { + opts := *o + opts.mmapReporter = mmapReporter + return &opts +} + +func (o *opts) MmapReporter() mmap.Reporter { + return o.mmapReporter +} + +func (o *opts) SetQueryLimits(value limits.QueryLimits) Options { + opts := *o + opts.queryLimits = value + return &opts +} + +func (o *opts) QueryLimits() limits.QueryLimits { + return o.queryLimits +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/postings_list_cache.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/postings_list_cache.go new file mode 100644 index 00000000..17d24515 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/postings_list_cache.go @@ -0,0 +1,301 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "sync" + "time" + + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/x/instrument" + + "github.com/pborman/uuid" + "github.com/uber-go/tally" +) + +// PatternType is an enum for the various pattern types. It allows us +// separate them logically within the cache. +type PatternType int + +// Closer represents a function that will close managed resources. +type Closer func() + +const ( + // PatternTypeRegexp indicates that the pattern is of type regexp. + PatternTypeRegexp PatternType = iota + // PatternTypeTerm indicates that the pattern is of type term. + PatternTypeTerm + // PatternTypeField indicates that the pattern is of type field. + PatternTypeField + + reportLoopInterval = 10 * time.Second + emptyPattern = "" +) + +// PostingsListCacheOptions is the options struct for the query cache. +type PostingsListCacheOptions struct { + InstrumentOptions instrument.Options +} + +// PostingsListCache implements an LRU for caching queries and their results. +type PostingsListCache struct { + sync.Mutex + + lru *postingsListLRU + + size int + opts PostingsListCacheOptions + metrics *postingsListCacheMetrics +} + +// NewPostingsListCache creates a new query cache. +func NewPostingsListCache(size int, opts PostingsListCacheOptions) (*PostingsListCache, Closer, error) { + lru, err := newPostingsListLRU(size) + if err != nil { + return nil, nil, err + } + + plc := &PostingsListCache{ + lru: lru, + size: size, + opts: opts, + metrics: newPostingsListCacheMetrics(opts.InstrumentOptions.MetricsScope()), + } + + closer := plc.startReportLoop() + return plc, closer, nil +} + +// GetRegexp returns the cached results for the provided regexp query, if any. +func (q *PostingsListCache) GetRegexp( + segmentUUID uuid.UUID, + field string, + pattern string, +) (postings.List, bool) { + return q.get(segmentUUID, field, pattern, PatternTypeRegexp) +} + +// GetTerm returns the cached results for the provided term query, if any. +func (q *PostingsListCache) GetTerm( + segmentUUID uuid.UUID, + field string, + pattern string, +) (postings.List, bool) { + return q.get(segmentUUID, field, pattern, PatternTypeTerm) +} + +// GetField returns the cached results for the provided field query, if any. +func (q *PostingsListCache) GetField( + segmentUUID uuid.UUID, + field string, +) (postings.List, bool) { + return q.get(segmentUUID, field, emptyPattern, PatternTypeField) +} + +func (q *PostingsListCache) get( + segmentUUID uuid.UUID, + field string, + pattern string, + patternType PatternType, +) (postings.List, bool) { + // No RLock because a Get() operation mutates the LRU. + q.Lock() + p, ok := q.lru.Get(segmentUUID, field, pattern, patternType) + q.Unlock() + + q.emitCacheGetMetrics(patternType, ok) + + if !ok { + return nil, false + } + + return p, ok +} + +// PutRegexp updates the LRU with the result of the regexp query. +func (q *PostingsListCache) PutRegexp( + segmentUUID uuid.UUID, + field string, + pattern string, + pl postings.List, +) { + q.put(segmentUUID, field, pattern, PatternTypeRegexp, pl) +} + +// PutTerm updates the LRU with the result of the term query. +func (q *PostingsListCache) PutTerm( + segmentUUID uuid.UUID, + field string, + pattern string, + pl postings.List, +) { + q.put(segmentUUID, field, pattern, PatternTypeTerm, pl) +} + +// PutField updates the LRU with the result of the field query. +func (q *PostingsListCache) PutField( + segmentUUID uuid.UUID, + field string, + pl postings.List, +) { + q.put(segmentUUID, field, emptyPattern, PatternTypeField, pl) +} + +func (q *PostingsListCache) put( + segmentUUID uuid.UUID, + field string, + pattern string, + patternType PatternType, + pl postings.List, +) { + q.Lock() + q.lru.Add( + segmentUUID, + field, + pattern, + patternType, + pl, + ) + q.Unlock() + q.emitCachePutMetrics(patternType) +} + +// PurgeSegment removes all postings lists associated with the specified +// segment from the cache. +func (q *PostingsListCache) PurgeSegment(segmentUUID uuid.UUID) { + q.Lock() + q.lru.PurgeSegment(segmentUUID) + q.Unlock() +} + +// startReportLoop starts a background process that will call Report() +// on a regular basis and returns a function that will end the background +// process. +func (q *PostingsListCache) startReportLoop() Closer { + doneCh := make(chan struct{}) + + go func() { + for { + select { + case <-doneCh: + return + default: + } + + q.Report() + time.Sleep(reportLoopInterval) + } + }() + + return func() { close(doneCh) } +} + +// Report will emit metrics about the status of the cache. +func (q *PostingsListCache) Report() { + var ( + size float64 + capacity float64 + ) + + q.Lock() + size = float64(q.lru.Len()) + capacity = float64(q.size) + q.Unlock() + + q.metrics.size.Update(size) + q.metrics.capacity.Update(capacity) +} + +func (q *PostingsListCache) emitCacheGetMetrics(patternType PatternType, hit bool) { + var method *postingsListCacheMethodMetrics + switch patternType { + case PatternTypeRegexp: + method = q.metrics.regexp + case PatternTypeTerm: + method = q.metrics.term + case PatternTypeField: + method = q.metrics.field + default: + method = q.metrics.unknown // should never happen + } + if hit { + method.hits.Inc(1) + } else { + method.misses.Inc(1) + } +} + +func (q *PostingsListCache) emitCachePutMetrics(patternType PatternType) { + switch patternType { + case PatternTypeRegexp: + q.metrics.regexp.puts.Inc(1) + case PatternTypeTerm: + q.metrics.term.puts.Inc(1) + case PatternTypeField: + q.metrics.field.puts.Inc(1) + default: + q.metrics.unknown.puts.Inc(1) // should never happen + } +} + +type postingsListCacheMetrics struct { + regexp *postingsListCacheMethodMetrics + term *postingsListCacheMethodMetrics + field *postingsListCacheMethodMetrics + unknown *postingsListCacheMethodMetrics + + size tally.Gauge + capacity tally.Gauge +} + +func newPostingsListCacheMetrics(scope tally.Scope) *postingsListCacheMetrics { + return &postingsListCacheMetrics{ + regexp: newPostingsListCacheMethodMetrics(scope.Tagged(map[string]string{ + "query_type": "regexp", + })), + term: newPostingsListCacheMethodMetrics(scope.Tagged(map[string]string{ + "query_type": "term", + })), + field: newPostingsListCacheMethodMetrics(scope.Tagged(map[string]string{ + "query_type": "field", + })), + unknown: newPostingsListCacheMethodMetrics(scope.Tagged(map[string]string{ + "query_type": "unknown", + })), + + size: scope.Gauge("size"), + capacity: scope.Gauge("capacity"), + } +} + +type postingsListCacheMethodMetrics struct { + hits tally.Counter + misses tally.Counter + puts tally.Counter +} + +func newPostingsListCacheMethodMetrics(scope tally.Scope) *postingsListCacheMethodMetrics { + return &postingsListCacheMethodMetrics{ + hits: scope.Counter("hits"), + misses: scope.Counter("misses"), + puts: scope.Counter("puts"), + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/postings_list_cache_lru.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/postings_list_cache_lru.go new file mode 100644 index 00000000..b7c9d9be --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/postings_list_cache_lru.go @@ -0,0 +1,216 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "container/list" + "errors" + + "github.com/m3db/m3/src/m3ninx/postings" + + "github.com/pborman/uuid" +) + +// PostingsListLRU implements a non-thread safe fixed size LRU cache of postings lists +// that were resolved by running a given query against a particular segment for a given +// field and pattern type (term vs regexp). Normally a key in the LRU would look like: +// +// type key struct { +// segmentUUID uuid.UUID +// field string +// pattern string +// patternType PatternType +// } +// +// However, some of the postings lists that we will store in the LRU have a fixed lifecycle +// because they reference mmap'd byte slices which will eventually be unmap'd. To prevent +// these postings lists that point to unmap'd regions from remaining in the LRU, we want to +// support the ability to efficiently purge the LRU of any postings list that belong to a +// given segment. This isn't technically required for correctness as once a segment has been +// closed, its old postings list in the LRU will never be accessed again (since they are only +// addressable by that segments UUID), but we purge them from the LRU before closing the segment +// anyways as an additional safety precaution. +// +// Instead of adding additional tracking on-top of an existing generic LRU, we've created a +// specialized LRU that instead of having a single top-level map pointing into the linked-list, +// has a two-level map where the top level map is keyed by segment UUID and the second level map +// is keyed by the field/pattern/patternType. +// +// As a result, when a segment is ready to be closed, they can call into the cache with their +// UUID and we can efficiently remove all the entries corresponding to that segment from the +// LRU. The specialization has the additional nice property that we don't need to allocate everytime +// we add an item to the LRU due to the interface{} conversion. +type postingsListLRU struct { + size int + evictList *list.List + items map[uuid.Array]map[key]*list.Element +} + +// entry is used to hold a value in the evictList. +type entry struct { + uuid uuid.UUID + key key + postingsList postings.List +} + +type key struct { + field string + pattern string + patternType PatternType +} + +// newPostingsListLRU constructs an LRU of the given size. +func newPostingsListLRU(size int) (*postingsListLRU, error) { + if size <= 0 { + return nil, errors.New("Must provide a positive size") + } + + return &postingsListLRU{ + size: size, + evictList: list.New(), + items: make(map[uuid.Array]map[key]*list.Element), + }, nil +} + +// Add adds a value to the cache. Returns true if an eviction occurred. +func (c *postingsListLRU) Add( + segmentUUID uuid.UUID, + field string, + pattern string, + patternType PatternType, + pl postings.List, +) (evicted bool) { + newKey := newKey(field, pattern, patternType) + // Check for existing item. + uuidArray := segmentUUID.Array() + if uuidEntries, ok := c.items[uuidArray]; ok { + if ent, ok := uuidEntries[newKey]; ok { + // If it already exists, just move it to the front. This avoids storing + // the same item in the LRU twice which is important because the maps + // can only point to one entry at a time and we use them for purges. Also, + // it saves space by avoiding storing duplicate values. + c.evictList.MoveToFront(ent) + ent.Value.(*entry).postingsList = pl + return false + } + } + + // Add new item. + var ( + ent = &entry{ + uuid: segmentUUID, + key: newKey, + postingsList: pl, + } + entry = c.evictList.PushFront(ent) + ) + if queries, ok := c.items[uuidArray]; ok { + queries[newKey] = entry + } else { + c.items[uuidArray] = map[key]*list.Element{ + newKey: entry, + } + } + + evict := c.evictList.Len() > c.size + // Verify size not exceeded. + if evict { + c.removeOldest() + } + return evict +} + +// Get looks up a key's value from the cache. +func (c *postingsListLRU) Get( + segmentUUID uuid.UUID, + field string, + pattern string, + patternType PatternType, +) (postings.List, bool) { + newKey := newKey(field, pattern, patternType) + uuidArray := segmentUUID.Array() + if uuidEntries, ok := c.items[uuidArray]; ok { + if ent, ok := uuidEntries[newKey]; ok { + c.evictList.MoveToFront(ent) + return ent.Value.(*entry).postingsList, true + } + } + + return nil, false +} + +// Remove removes the provided key from the cache, returning if the +// key was contained. +func (c *postingsListLRU) Remove( + segmentUUID uuid.UUID, + field string, + pattern string, + patternType PatternType, +) bool { + newKey := newKey(field, pattern, patternType) + uuidArray := segmentUUID.Array() + if uuidEntries, ok := c.items[uuidArray]; ok { + if ent, ok := uuidEntries[newKey]; ok { + c.removeElement(ent) + return true + } + } + + return false +} + +func (c *postingsListLRU) PurgeSegment(segmentUUID uuid.UUID) { + if uuidEntries, ok := c.items[segmentUUID.Array()]; ok { + for _, ent := range uuidEntries { + c.removeElement(ent) + } + } +} + +// Len returns the number of items in the cache. +func (c *postingsListLRU) Len() int { + return c.evictList.Len() +} + +// removeOldest removes the oldest item from the cache. +func (c *postingsListLRU) removeOldest() { + ent := c.evictList.Back() + if ent != nil { + c.removeElement(ent) + } +} + +// removeElement is used to remove a given list element from the cache +func (c *postingsListLRU) removeElement(e *list.Element) { + c.evictList.Remove(e) + entry := e.Value.(*entry) + + if patterns, ok := c.items[entry.uuid.Array()]; ok { + delete(patterns, entry.key) + if len(patterns) == 0 { + delete(c.items, entry.uuid.Array()) + } + } +} + +func newKey(field, pattern string, patternType PatternType) key { + return key{field: field, pattern: pattern, patternType: patternType} +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/query_matcher.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/query_matcher.go new file mode 100644 index 00000000..b3eb4b71 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/query_matcher.go @@ -0,0 +1,60 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "fmt" + + "github.com/m3db/m3/src/m3ninx/idx" + + "github.com/golang/mock/gomock" +) + +// QueryMatcher is a gomock.Matcher that matches index.Query +type QueryMatcher interface { + gomock.Matcher +} + +// NewQueryMatcher returns a new QueryMatcher +func NewQueryMatcher(q Query) QueryMatcher { + return &queryMatcher{ + query: q, + matcher: idx.NewQueryMatcher(q.Query), + } +} + +type queryMatcher struct { + query Query + matcher idx.QueryMatcher +} + +func (m *queryMatcher) Matches(x interface{}) bool { + query, ok := x.(Query) + if !ok { + return false + } + + return m.matcher.Matches(query.Query) +} + +func (m *queryMatcher) String() string { + return fmt.Sprintf("QueryMatcher %v", m.query) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/read_through_segment.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/read_through_segment.go new file mode 100644 index 00000000..52aaaf62 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/read_through_segment.go @@ -0,0 +1,293 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "errors" + "sync" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + + "github.com/pborman/uuid" +) + +var ( + errCantGetReaderFromClosedSegment = errors.New("cant get reader from closed segment") + errCantCloseClosedSegment = errors.New("cant close closed segment") +) + +// Ensure FST segment implements ImmutableSegment so can be casted upwards +// and mmap's can be freed. +var _ segment.ImmutableSegment = (*ReadThroughSegment)(nil) + +// ReadThroughSegment wraps a segment with a postings list cache so that +// queries can be transparently cached in a read through manner. In addition, +// the postings lists returned by the segments may not be safe to use once the +// underlying segments are closed due to the postings lists pointing into the +// segments mmap'd region. As a result, the close method of the ReadThroughSegment +// will make sure that the cache is purged of all the segments postings lists before +// the segment itself is closed. +type ReadThroughSegment struct { + sync.RWMutex + + segment segment.ImmutableSegment + + uuid uuid.UUID + postingsListCache *PostingsListCache + + opts ReadThroughSegmentOptions + + closed bool +} + +// ReadThroughSegmentOptions is the options struct for the +// ReadThroughSegment. +type ReadThroughSegmentOptions struct { + // Whether the postings list for regexp queries should be cached. + CacheRegexp bool + // Whether the postings list for term queries should be cached. + CacheTerms bool +} + +// NewReadThroughSegment creates a new read through segment. +func NewReadThroughSegment( + seg segment.ImmutableSegment, + cache *PostingsListCache, + opts ReadThroughSegmentOptions, +) segment.Segment { + return &ReadThroughSegment{ + segment: seg, + opts: opts, + uuid: uuid.NewUUID(), + postingsListCache: cache, + } +} + +// Reader returns a read through reader for the read through segment. +func (r *ReadThroughSegment) Reader() (segment.Reader, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errCantGetReaderFromClosedSegment + } + + reader, err := r.segment.Reader() + if err != nil { + return nil, err + } + return newReadThroughSegmentReader( + reader, r.uuid, r.postingsListCache, r.opts), nil +} + +// Close purges all entries in the cache associated with this segment, +// and then closes the underlying segment. +func (r *ReadThroughSegment) Close() error { + r.Lock() + defer r.Unlock() + if r.closed { + return errCantCloseClosedSegment + } + + r.closed = true + + if r.postingsListCache != nil { + // Purge segments from the cache before closing the segment to avoid + // temporarily having postings lists in the cache whose underlying + // bytes are no longer mmap'd. + r.postingsListCache.PurgeSegment(r.uuid) + } + return r.segment.Close() +} + +// FieldsIterable is a pass through call to the segment, since there's no +// postings lists to cache for queries. +func (r *ReadThroughSegment) FieldsIterable() segment.FieldsIterable { + return r.segment.FieldsIterable() +} + +// TermsIterable is a pass through call to the segment, since there's no +// postings lists to cache for queries. +func (r *ReadThroughSegment) TermsIterable() segment.TermsIterable { + return r.segment.TermsIterable() +} + +// ContainsID is a pass through call to the segment, since there's no +// postings lists to cache for queries. +func (r *ReadThroughSegment) ContainsID(id []byte) (bool, error) { + return r.segment.ContainsID(id) +} + +// ContainsField is a pass through call to the segment, since there's no +// postings lists to cache for queries. +func (r *ReadThroughSegment) ContainsField(field []byte) (bool, error) { + return r.segment.ContainsField(field) +} + +// FreeMmap frees the mmapped data if any. +func (r *ReadThroughSegment) FreeMmap() error { + return r.segment.FreeMmap() +} + +// Size is a pass through call to the segment, since there's no +// postings lists to cache for queries. +func (r *ReadThroughSegment) Size() int64 { + return r.segment.Size() +} + +type readThroughSegmentReader struct { + // reader is explicitly not embedded at the top level + // of the struct to force new methods added to index.Reader + // to be explicitly supported by the read through cache. + reader segment.Reader + opts ReadThroughSegmentOptions + uuid uuid.UUID + postingsListCache *PostingsListCache +} + +func newReadThroughSegmentReader( + reader segment.Reader, + uuid uuid.UUID, + cache *PostingsListCache, + opts ReadThroughSegmentOptions, +) segment.Reader { + return &readThroughSegmentReader{ + reader: reader, + opts: opts, + uuid: uuid, + postingsListCache: cache, + } +} + +// MatchRegexp returns a cached posting list or queries the underlying +// segment if their is a cache miss. +func (s *readThroughSegmentReader) MatchRegexp( + field []byte, + c index.CompiledRegex, +) (postings.List, error) { + if s.postingsListCache == nil || !s.opts.CacheRegexp { + return s.reader.MatchRegexp(field, c) + } + + // TODO(rartoul): Would be nice to not allocate strings here. + fieldStr := string(field) + patternStr := c.FSTSyntax.String() + pl, ok := s.postingsListCache.GetRegexp(s.uuid, fieldStr, patternStr) + if ok { + return pl, nil + } + + pl, err := s.reader.MatchRegexp(field, c) + if err == nil { + s.postingsListCache.PutRegexp(s.uuid, fieldStr, patternStr, pl) + } + return pl, err +} + +// MatchTerm returns a cached posting list or queries the underlying +// segment if their is a cache miss. +func (s *readThroughSegmentReader) MatchTerm( + field []byte, term []byte, +) (postings.List, error) { + if s.postingsListCache == nil || !s.opts.CacheTerms { + return s.reader.MatchTerm(field, term) + } + + // TODO(rartoul): Would be nice to not allocate strings here. + fieldStr := string(field) + patternStr := string(term) + pl, ok := s.postingsListCache.GetTerm(s.uuid, fieldStr, patternStr) + if ok { + return pl, nil + } + + pl, err := s.reader.MatchTerm(field, term) + if err == nil { + s.postingsListCache.PutTerm(s.uuid, fieldStr, patternStr, pl) + } + return pl, err +} + +// MatchField returns a cached posting list or queries the underlying +// segment if their is a cache miss. +func (s *readThroughSegmentReader) MatchField(field []byte) (postings.List, error) { + if s.postingsListCache == nil || !s.opts.CacheTerms { + return s.reader.MatchField(field) + } + + // TODO(rartoul): Would be nice to not allocate strings here. + fieldStr := string(field) + pl, ok := s.postingsListCache.GetField(s.uuid, fieldStr) + if ok { + return pl, nil + } + + pl, err := s.reader.MatchField(field) + if err == nil { + s.postingsListCache.PutField(s.uuid, fieldStr, pl) + } + return pl, err +} + +// MatchAll is a pass through call, since there's no postings list to cache. +// NB(r): The postings list returned by match all is just an iterator +// from zero to the maximum document number indexed by the segment and as such +// causes no allocations to compute and construct. +func (s *readThroughSegmentReader) MatchAll() (postings.MutableList, error) { + return s.reader.MatchAll() +} + +// AllDocs is a pass through call, since there's no postings list to cache. +func (s *readThroughSegmentReader) AllDocs() (index.IDDocIterator, error) { + return s.reader.AllDocs() +} + +// Doc is a pass through call, since there's no postings list to cache. +func (s *readThroughSegmentReader) Doc(id postings.ID) (doc.Document, error) { + return s.reader.Doc(id) +} + +// Docs is a pass through call, since there's no postings list to cache. +func (s *readThroughSegmentReader) Docs(pl postings.List) (doc.Iterator, error) { + return s.reader.Docs(pl) +} + +// Fields is a pass through call. +func (s *readThroughSegmentReader) Fields() (segment.FieldsIterator, error) { + return s.reader.Fields() +} + +// ContainsField is a pass through call. +func (s *readThroughSegmentReader) ContainsField(field []byte) (bool, error) { + return s.reader.ContainsField(field) +} + +// Terms is a pass through call. +func (s *readThroughSegmentReader) Terms(field []byte) (segment.TermsIterator, error) { + return s.reader.Terms(field) +} + +// Close is a pass through call. +func (s *readThroughSegmentReader) Close() error { + return s.reader.Close() +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/results.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/results.go new file mode 100644 index 00000000..52f104c4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/results.go @@ -0,0 +1,195 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "errors" + "sync" + + "github.com/m3db/m3/src/dbnode/storage/index/convert" + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/pool" +) + +var ( + errUnableToAddResultMissingID = errors.New("no id for result") +) + +type results struct { + sync.RWMutex + + nsID ident.ID + opts QueryResultsOptions + + resultsMap *ResultsMap + totalDocsCount int + + idPool ident.Pool + bytesPool pool.CheckedBytesPool + + pool QueryResultsPool + noFinalize bool +} + +// NewQueryResults returns a new query results object. +func NewQueryResults( + namespaceID ident.ID, + opts QueryResultsOptions, + indexOpts Options, +) QueryResults { + return &results{ + nsID: namespaceID, + opts: opts, + resultsMap: newResultsMap(indexOpts.IdentifierPool()), + idPool: indexOpts.IdentifierPool(), + bytesPool: indexOpts.CheckedBytesPool(), + pool: indexOpts.QueryResultsPool(), + } +} + +func (r *results) Reset(nsID ident.ID, opts QueryResultsOptions) { + r.Lock() + + r.opts = opts + + // Finalize existing held nsID. + if r.nsID != nil { + r.nsID.Finalize() + } + // Make an independent copy of the new nsID. + if nsID != nil { + nsID = r.idPool.Clone(nsID) + } + r.nsID = nsID + + // Reset all values from map first + for _, entry := range r.resultsMap.Iter() { + tags := entry.Value() + tags.Close() + } + + // Reset all keys in the map next, this will finalize the keys. + r.resultsMap.Reset() + r.totalDocsCount = 0 + + // NB: could do keys+value in one step but I'm trying to avoid + // using an internal method of a code-gen'd type. + + r.Unlock() +} + +// NB: If documents with duplicate IDs are added, they are simply ignored and +// the first document added with an ID is returned. +func (r *results) AddDocuments(batch []doc.Document) (int, int, error) { + r.Lock() + err := r.addDocumentsBatchWithLock(batch) + size := r.resultsMap.Len() + docsCount := r.totalDocsCount + len(batch) + r.totalDocsCount = docsCount + r.Unlock() + return size, docsCount, err +} + +func (r *results) addDocumentsBatchWithLock(batch []doc.Document) error { + for i := range batch { + _, size, err := r.addDocumentWithLock(batch[i]) + if err != nil { + return err + } + if r.opts.SizeLimit > 0 && size >= r.opts.SizeLimit { + // Early return if limit enforced and we hit our limit. + break + } + } + return nil +} + +func (r *results) addDocumentWithLock(d doc.Document) (bool, int, error) { + if len(d.ID) == 0 { + return false, r.resultsMap.Len(), errUnableToAddResultMissingID + } + + // NB: can cast the []byte -> ident.ID to avoid an alloc + // before we're sure we need it. + tsID := ident.BytesID(d.ID) + + // Need to apply filter if set first. + if r.opts.FilterID != nil && !r.opts.FilterID(tsID) { + return false, r.resultsMap.Len(), nil + } + + // check if it already exists in the map. + if r.resultsMap.Contains(tsID) { + return false, r.resultsMap.Len(), nil + } + + // i.e. it doesn't exist in the map, so we create the tags wrapping + // fields provided by the document. + tags := convert.ToSeriesTags(d, convert.Opts{NoClone: true}) + + // It is assumed that the document is valid for the lifetime of the index + // results. + r.resultsMap.SetUnsafe(tsID, tags, ResultsMapSetUnsafeOptions{ + NoCopyKey: true, + NoFinalizeKey: true, + }) + + return true, r.resultsMap.Len(), nil +} + +func (r *results) Namespace() ident.ID { + r.RLock() + v := r.nsID + r.RUnlock() + return v +} + +func (r *results) Map() *ResultsMap { + r.RLock() + v := r.resultsMap + r.RUnlock() + return v +} + +func (r *results) Size() int { + r.RLock() + v := r.resultsMap.Len() + r.RUnlock() + return v +} + +func (r *results) TotalDocsCount() int { + r.RLock() + count := r.totalDocsCount + r.RUnlock() + return count +} + +func (r *results) Finalize() { + // Reset locks so cannot hold onto lock for call to Finalize. + r.Reset(nil, QueryResultsOptions{}) + + if r.pool == nil { + return + } + r.pool.Put(r) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/results_map_gen.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/results_map_gen.go new file mode 100644 index 00000000..9ef643dc --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/results_map_gen.go @@ -0,0 +1,275 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package index + +import ( + "github.com/m3db/m3/src/x/ident" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// ResultsMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type ResultsMapHash uint64 + +// ResultsMapHashFn is the hash function to execute when hashing a key. +type ResultsMapHashFn func(ident.ID) ResultsMapHash + +// ResultsMapEqualsFn is the equals key function to execute when detecting equality of a key. +type ResultsMapEqualsFn func(ident.ID, ident.ID) bool + +// ResultsMapCopyFn is the copy key function to execute when copying the key. +type ResultsMapCopyFn func(ident.ID) ident.ID + +// ResultsMapFinalizeFn is the finalize key function to execute when finished with a key. +type ResultsMapFinalizeFn func(ident.ID) + +// ResultsMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// ResultsMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type ResultsMap struct { + _ResultsMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[ResultsMapHash]ResultsMapEntry +} + +// _ResultsMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _ResultsMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash ResultsMapHashFn + // equals is the equals key function to execute when detecting equality. + equals ResultsMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy ResultsMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize ResultsMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// ResultsMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type ResultsMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _ResultsMapKey + // value type stored + value ident.TagIterator +} + +type _ResultsMapKey struct { + key ident.ID + finalize bool +} + +// Key returns the map entry key. +func (e ResultsMapEntry) Key() ident.ID { + return e.key.key +} + +// Value returns the map entry value. +func (e ResultsMapEntry) Value() ident.TagIterator { + return e.value +} + +// _ResultsMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _ResultsMapAlloc(opts _ResultsMapOptions) *ResultsMap { + m := &ResultsMap{_ResultsMapOptions: opts} + m.Reallocate() + return m +} + +func (m *ResultsMap) newMapKey(k ident.ID, opts _ResultsMapKeyOptions) _ResultsMapKey { + key := _ResultsMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *ResultsMap) removeMapKey(hash ResultsMapHash, key _ResultsMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *ResultsMap) Get(k ident.ID) (ident.TagIterator, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty ident.TagIterator + return empty, false +} + +// Set will set the value for an identifier. +func (m *ResultsMap) Set(k ident.ID, v ident.TagIterator) { + m.set(k, v, _ResultsMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// ResultsMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type ResultsMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *ResultsMap) SetUnsafe(k ident.ID, v ident.TagIterator, opts ResultsMapSetUnsafeOptions) { + m.set(k, v, _ResultsMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _ResultsMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *ResultsMap) set(k ident.ID, v ident.TagIterator, opts _ResultsMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = ResultsMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = ResultsMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *ResultsMap) Iter() map[ResultsMapHash]ResultsMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *ResultsMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *ResultsMap) Contains(k ident.ID) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *ResultsMap) Delete(k ident.ID) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *ResultsMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *ResultsMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[ResultsMapHash]ResultsMapEntry, m.initialSize) + } else { + m.lookup = make(map[ResultsMapHash]ResultsMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/results_new_map.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/results_new_map.go new file mode 100644 index 00000000..66204005 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/results_new_map.go @@ -0,0 +1,49 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "github.com/m3db/m3/src/x/ident" + + "github.com/cespare/xxhash/v2" +) + +const ( + defaultInitialResultsMapSize = 10 +) + +func newResultsMap(idPool ident.Pool) *ResultsMap { + return _ResultsMapAlloc(_ResultsMapOptions{ + hash: func(k ident.ID) ResultsMapHash { + return ResultsMapHash(xxhash.Sum64(k.Bytes())) + }, + equals: func(x, y ident.ID) bool { + return x.Equal(y) + }, + copy: func(k ident.ID) ident.ID { + return idPool.Clone(k) + }, + finalize: func(k ident.ID) { + k.Finalize() + }, + initialSize: defaultInitialResultsMapSize, + }) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/results_pool.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/results_pool.go new file mode 100644 index 00000000..3f8a08ca --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/results_pool.go @@ -0,0 +1,46 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import "github.com/m3db/m3/src/x/pool" + +type resultsPool struct { + pool pool.ObjectPool +} + +// NewQueryResultsPool creates a new QueryResultsPool. +func NewQueryResultsPool(opts pool.ObjectPoolOptions) QueryResultsPool { + return &resultsPool{pool: pool.NewObjectPool(opts)} +} + +func (p *resultsPool) Init(alloc QueryResultsAllocator) { + p.pool.Init(func() interface{} { + return alloc() + }) +} + +func (p *resultsPool) Get() QueryResults { + return p.pool.Get().(QueryResults) +} + +func (p *resultsPool) Put(value QueryResults) { + p.pool.Put(value) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/segments.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/segments.go new file mode 100644 index 00000000..837b9fc3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/segments.go @@ -0,0 +1,51 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/m3ninx/index/segment" +) + +type readableSeg struct { + nowFn clock.NowFn + createdAt time.Time + segment segment.Segment +} + +func newReadableSeg(seg segment.Segment, opts Options) *readableSeg { + nowFn := opts.ClockOptions().NowFn() + return &readableSeg{ + nowFn: nowFn, + createdAt: nowFn(), + segment: seg, + } +} + +func (s *readableSeg) Segment() segment.Segment { + return s.segment +} + +func (s *readableSeg) Age() time.Duration { + return s.nowFn().Sub(s.createdAt) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/segments/types.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/segments/types.go new file mode 100644 index 00000000..eff56b0a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/segments/types.go @@ -0,0 +1,41 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package segments + +// Type is an enum of the different segments which are used by the index. +type Type byte + +const ( + // MutableType refers to a mutable segment. + MutableType Type = iota + // FSTType refers to a FST segment. + FSTType +) + +func (t Type) String() string { + switch t { + case MutableType: + return "MutableType" + case FSTType: + return "FSTType" + } + return "UnknownType" +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/index/types.go b/vendor/github.com/m3db/m3/src/dbnode/storage/index/types.go new file mode 100644 index 00000000..cc0366e9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/index/types.go @@ -0,0 +1,970 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "fmt" + "sort" + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/storage/bootstrap/result" + "github.com/m3db/m3/src/dbnode/storage/index/compaction" + "github.com/m3db/m3/src/dbnode/storage/limits" + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/idx" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/index/segment/builder" + "github.com/m3db/m3/src/m3ninx/index/segment/fst" + "github.com/m3db/m3/src/m3ninx/index/segment/mem" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/mmap" + "github.com/m3db/m3/src/x/pool" + "github.com/m3db/m3/src/x/resource" + xtime "github.com/m3db/m3/src/x/time" + + opentracinglog "github.com/opentracing/opentracing-go/log" +) + +var ( + // ReservedFieldNameID is the field name used to index the ID in the + // m3ninx subsytem. + ReservedFieldNameID = doc.IDReservedFieldName +) + +// InsertMode specifies whether inserts are synchronous or asynchronous. +type InsertMode byte + +// nolint +const ( + InsertSync InsertMode = iota + InsertAsync +) + +// AggregationType specifies what granularity to aggregate upto. +type AggregationType uint8 + +const ( + // AggregateTagNamesAndValues returns both the tag name and value. + AggregateTagNamesAndValues AggregationType = iota + // AggregateTagNames returns tag names only. + AggregateTagNames +) + +// Query is a rich end user query to describe a set of constraints on required IDs. +type Query struct { + idx.Query +} + +// QueryOptions enables users to specify constraints and +// preferences on query execution. +type QueryOptions struct { + StartInclusive time.Time + EndExclusive time.Time + SeriesLimit int + DocsLimit int + RequireExhaustive bool +} + +// IterationOptions enables users to specify iteration preferences. +type IterationOptions struct { + SeriesIteratorConsolidator encoding.SeriesIteratorConsolidator +} + +// SeriesLimitExceeded returns whether a given size exceeds the +// series limit the query options imposes, if it is enabled. +func (o QueryOptions) SeriesLimitExceeded(size int) bool { + return o.SeriesLimit > 0 && size >= o.SeriesLimit +} + +// DocsLimitExceeded returns whether a given size exceeds the +// docs limit the query options imposes, if it is enabled. +func (o QueryOptions) DocsLimitExceeded(size int) bool { + return o.DocsLimit > 0 && size >= o.DocsLimit +} + +// AggregationOptions enables users to specify constraints on aggregations. +type AggregationOptions struct { + QueryOptions + FieldFilter AggregateFieldFilter + Type AggregationType +} + +// QueryResult is the collection of results for a query. +type QueryResult struct { + Results QueryResults + Exhaustive bool +} + +// AggregateQueryResult is the collection of results for an aggregate query. +type AggregateQueryResult struct { + Results AggregateResults + Exhaustive bool +} + +// BaseResults is a collection of basic results for a generic query, it is +// synchronized when access to the results set is used as documented by the +// methods. +type BaseResults interface { + // Namespace returns the namespace associated with the result. + Namespace() ident.ID + + // Size returns the number of IDs tracked. + Size() int + + // TotalDocsCount returns the total number of documents observed. + TotalDocsCount() int + + // AddDocuments adds the batch of documents to the results set, it will + // take a copy of the bytes backing the documents so the original can be + // modified after this function returns without affecting the results map. + // TODO(r): We will need to change this behavior once index fields are + // mutable and the most recent need to shadow older entries. + AddDocuments(batch []doc.Document) (size, docsCount int, err error) + + // Finalize releases any resources held by the Results object, + // including returning it to a backing pool. + Finalize() +} + +// QueryResults is a collection of results for a query, it is synchronized +// when access to the results set is used as documented by the methods. +type QueryResults interface { + BaseResults + + // Reset resets the Results object to initial state. + Reset(nsID ident.ID, opts QueryResultsOptions) + + // Map returns the results map from seriesID -> seriesTags, comprising + // index results. + // Since a lock is not held when accessing the map after a call to this + // method, it is unsafe to read or write to the map if any other caller + // mutates the state of the results after obtaining a reference to the map + // with this call. + Map() *ResultsMap +} + +// QueryResultsOptions is a set of options to use for query results. +type QueryResultsOptions struct { + // SizeLimit will limit the total results set to a given limit and if + // overflown will return early successfully. + SizeLimit int + + // FilterID, if provided, can be used to filter out unwanted IDs from + // the query results. + // NB(r): This is used to filter out results from shards the DB node + // node no longer owns but is still included in index segments. + FilterID func(id ident.ID) bool +} + +// QueryResultsAllocator allocates QueryResults types. +type QueryResultsAllocator func() QueryResults + +// QueryResultsPool allows users to pool `Results` types. +type QueryResultsPool interface { + // Init initializes the QueryResults pool. + Init(alloc QueryResultsAllocator) + + // Get retrieves a QueryResults object for use. + Get() QueryResults + + // Put returns the provided QueryResults to the pool. + Put(value QueryResults) +} + +// AggregateResults is a collection of results for an aggregation query, it is +// synchronized when access to the results set is used as documented by the +// methods. +type AggregateResults interface { + BaseResults + + // Reset resets the AggregateResults object to initial state. + Reset( + nsID ident.ID, + aggregateQueryOpts AggregateResultsOptions, + ) + + // AggregateResultsOptions returns the options for this AggregateResult. + AggregateResultsOptions() AggregateResultsOptions + + // AddFields adds the batch of fields to the results set, it will + // assume ownership of the idents (and backing bytes) provided to it. + // i.e. it is not safe to use/modify the idents once this function returns. + AddFields( + batch []AggregateResultsEntry, + ) (size, docsCount int) + + // Map returns a map from tag name -> possible tag values, + // comprising aggregate results. + // Since a lock is not held when accessing the map after a call to this + // method, it is unsafe to read or write to the map if any other caller + // mutates the state of the results after obtaining a reference to the map + // with this call. + Map() *AggregateResultsMap +} + +// AggregateFieldFilter dictates which fields will appear in the aggregated +// result; if filter values exist, only those whose fields matches a value in the +// filter are returned. +type AggregateFieldFilter [][]byte + +// AggregateResultsOptions is a set of options to use for results. +type AggregateResultsOptions struct { + // SizeLimit will limit the total results set to a given limit and if + // overflown will return early successfully. + SizeLimit int + + // Type determines what result is required. + Type AggregationType + + // FieldFilter is an optional param to filter aggregate values. + FieldFilter AggregateFieldFilter + + // RestrictByQuery is a query to restrict the set of documents that must + // be present for an aggregated term to be returned. + RestrictByQuery *Query +} + +// AggregateResultsAllocator allocates AggregateResults types. +type AggregateResultsAllocator func() AggregateResults + +// AggregateResultsPool allows users to pool `AggregateResults` types. +type AggregateResultsPool interface { + // Init initializes the AggregateResults pool. + Init(alloc AggregateResultsAllocator) + + // Get retrieves a AggregateResults object for use. + Get() AggregateResults + + // Put returns the provided AggregateResults to the pool. + Put(value AggregateResults) +} + +// AggregateValuesAllocator allocates AggregateValues types. +type AggregateValuesAllocator func() AggregateValues + +// AggregateValuesPool allows users to pool `AggregateValues` types. +type AggregateValuesPool interface { + // Init initializes the AggregateValues pool. + Init(alloc AggregateValuesAllocator) + + // Get retrieves a AggregateValues object for use. + Get() AggregateValues + + // Put returns the provided AggregateValues to the pool. + Put(value AggregateValues) +} + +// AggregateResultsEntry is used during block.Aggregate() execution +// to collect entries. +type AggregateResultsEntry struct { + Field ident.ID + Terms []ident.ID +} + +// OnIndexSeries provides a set of callback hooks to allow the reverse index +// to do lifecycle management of any resources retained during indexing. +type OnIndexSeries interface { + // OnIndexSuccess is executed when an entry is successfully indexed. The + // provided value for `blockStart` is the blockStart for which the write + // was indexed. + OnIndexSuccess(blockStart xtime.UnixNano) + + // OnIndexFinalize is executed when the index no longer holds any references + // to the provided resources. It can be used to cleanup any resources held + // during the course of indexing. `blockStart` is the startTime of the index + // block for which the write was attempted. + OnIndexFinalize(blockStart xtime.UnixNano) + + // OnIndexPrepare prepares the Entry to be handed off to the indexing sub-system. + // NB(prateek): we retain the ref count on the entry while the indexing is pending, + // the callback executed on the entry once the indexing is completed releases this + // reference. + OnIndexPrepare() + + // NeedsIndexUpdate returns a bool to indicate if the Entry needs to be indexed + // for the provided blockStart. It only allows a single index attempt at a time + // for a single entry. + // NB(prateek): NeedsIndexUpdate is a CAS, i.e. when this method returns true, it + // also sets state on the entry to indicate that a write for the given blockStart + // is going to be sent to the index, and other go routines should not attempt the + // same write. Callers are expected to ensure they follow this guideline. + // Further, every call to NeedsIndexUpdate which returns true needs to have a corresponding + // OnIndexFinalze() call. This is required for correct lifecycle maintenance. + NeedsIndexUpdate(indexBlockStartForWrite xtime.UnixNano) bool +} + +// Block represents a collection of segments. Each `Block` is a complete reverse +// index for a period of time defined by [StartTime, EndTime). +type Block interface { + // StartTime returns the start time of the period this Block indexes. + StartTime() time.Time + + // EndTime returns the end time of the period this Block indexes. + EndTime() time.Time + + // WriteBatch writes a batch of provided entries. + WriteBatch(inserts *WriteBatch) (WriteBatchResult, error) + + // Query resolves the given query into known IDs. + Query( + ctx context.Context, + cancellable *resource.CancellableLifetime, + query Query, + opts QueryOptions, + results BaseResults, + logFields []opentracinglog.Field, + ) (exhaustive bool, err error) + + // Aggregate aggregates known tag names/values. + // NB(prateek): different from aggregating by means of Query, as we can + // avoid going to documents, relying purely on the indexed FSTs. + Aggregate( + ctx context.Context, + cancellable *resource.CancellableLifetime, + opts QueryOptions, + results AggregateResults, + logFields []opentracinglog.Field, + ) (exhaustive bool, err error) + + // AddResults adds bootstrap results to the block. + AddResults(resultsByVolumeType result.IndexBlockByVolumeType) error + + // Tick does internal house keeping operations. + Tick(c context.Cancellable) (BlockTickResult, error) + + // Stats returns block stats. + Stats(reporter BlockStatsReporter) error + + // Seal prevents the block from taking any more writes, but, it still permits + // addition of segments via Bootstrap(). + Seal() error + + // IsSealed returns whether this block was sealed. + IsSealed() bool + + // NeedsMutableSegmentsEvicted returns whether this block has any mutable segments + // that are not-empty and sealed. + // A sealed non-empty mutable segment needs to get evicted from memory as + // soon as it can be to reduce memory footprint. + NeedsMutableSegmentsEvicted() bool + + // EvictMutableSegments closes any mutable segments, this is only applicable + // valid to be called once the block and hence mutable segments are sealed. + // It is expected that results have been added to the block that covers any + // data the mutable segments should have held at this time. + EvictMutableSegments() error + + // NeedsMutableSegmentsEvicted returns whether this block has any cold mutable segments + // that are not-empty and sealed. + NeedsColdMutableSegmentsEvicted() bool + + // EvictMutableSegments closes any stale cold mutable segments up to the currently active + // cold mutable segment (the one we are actively writing to). + EvictColdMutableSegments() error + + // RotateColdMutableSegments rotates the currently active cold mutable segment out for a + // new cold mutable segment to write to. + RotateColdMutableSegments() + + // MemorySegmentsData returns all in memory segments data. + MemorySegmentsData(ctx context.Context) ([]fst.SegmentData, error) + + // Close will release any held resources and close the Block. + Close() error +} + +// EvictMutableSegmentResults returns statistics about the EvictMutableSegments execution. +type EvictMutableSegmentResults struct { + NumMutableSegments int64 + NumDocs int64 +} + +// Add adds the provided results to the receiver. +func (e *EvictMutableSegmentResults) Add(o EvictMutableSegmentResults) { + e.NumDocs += o.NumDocs + e.NumMutableSegments += o.NumMutableSegments +} + +// BlockStatsReporter is a block stats reporter that collects +// block stats on a per block basis (without needing to query each +// block and get an immutable list of segments back). +type BlockStatsReporter interface { + ReportSegmentStats(stats BlockSegmentStats) + ReportIndexingStats(stats BlockIndexingStats) +} + +type blockStatsReporter struct { + reportSegmentStats func(stats BlockSegmentStats) + reportIndexingStats func(stats BlockIndexingStats) +} + +// NewBlockStatsReporter returns a new block stats reporter. +func NewBlockStatsReporter( + reportSegmentStats func(stats BlockSegmentStats), + reportIndexingStats func(stats BlockIndexingStats), +) BlockStatsReporter { + return blockStatsReporter{ + reportSegmentStats: reportSegmentStats, + reportIndexingStats: reportIndexingStats, + } +} + +func (r blockStatsReporter) ReportSegmentStats(stats BlockSegmentStats) { + r.reportSegmentStats(stats) +} + +func (r blockStatsReporter) ReportIndexingStats(stats BlockIndexingStats) { + r.reportIndexingStats(stats) +} + +// BlockIndexingStats is stats about a block's indexing stats. +type BlockIndexingStats struct { + IndexConcurrency int +} + +// BlockSegmentStats has segment stats. +type BlockSegmentStats struct { + Type BlockSegmentType + Mutable bool + Age time.Duration + Size int64 +} + +// BlockSegmentType is a block segment type +type BlockSegmentType uint + +const ( + // ActiveForegroundSegment is an active foreground compacted segment. + ActiveForegroundSegment BlockSegmentType = iota + // ActiveBackgroundSegment is an active background compacted segment. + ActiveBackgroundSegment + // FlushedSegment is an immutable segment that can't change any longer. + FlushedSegment +) + +// WriteBatchResult returns statistics about the WriteBatch execution. +type WriteBatchResult struct { + NumSuccess int64 + NumError int64 +} + +// BlockTickResult returns statistics about tick. +type BlockTickResult struct { + NumSegments int64 + NumSegmentsBootstrapped int64 + NumSegmentsMutable int64 + NumDocs int64 + FreeMmap int64 +} + +// WriteBatch is a batch type that allows for building of a slice of documents +// with metadata in a separate slice, this allows the documents slice to be +// passed to the segment to batch insert without having to copy into a buffer +// again. +type WriteBatch struct { + opts WriteBatchOptions + sortBy writeBatchSortBy + + entries []WriteBatchEntry + docs []doc.Document +} + +type writeBatchSortBy uint + +const ( + writeBatchSortByUnmarkedAndBlockStart writeBatchSortBy = iota + writeBatchSortByEnqueued +) + +// WriteBatchOptions is a set of options required for a write batch. +type WriteBatchOptions struct { + InitialCapacity int + IndexBlockSize time.Duration +} + +// NewWriteBatch creates a new write batch. +func NewWriteBatch(opts WriteBatchOptions) *WriteBatch { + return &WriteBatch{ + opts: opts, + entries: make([]WriteBatchEntry, 0, opts.InitialCapacity), + docs: make([]doc.Document, 0, opts.InitialCapacity), + } +} + +// Append appends an entry with accompanying document. +func (b *WriteBatch) Append( + entry WriteBatchEntry, + doc doc.Document, +) { + // Append just using the result from the current entry + b.appendWithResult(entry, doc, &entry.resultVal) +} + +// Options returns the WriteBatchOptions for this batch. +func (b *WriteBatch) Options() WriteBatchOptions { + return b.opts +} + +// AppendAll appends all entries from another batch to this batch +// and ensures they share the same result struct. +func (b *WriteBatch) AppendAll(from *WriteBatch) { + numEntries, numDocs := len(from.entries), len(from.docs) + for i := 0; i < numEntries && i < numDocs; i++ { + b.appendWithResult(from.entries[i], from.docs[i], from.entries[i].result) + } +} + +func (b *WriteBatch) appendWithResult( + entry WriteBatchEntry, + doc doc.Document, + result *WriteBatchEntryResult, +) { + // Set private WriteBatchEntry fields + entry.enqueuedIdx = len(b.entries) + entry.result = result + + // Append + b.entries = append(b.entries, entry) + b.docs = append(b.docs, doc) +} + +// ForEachWriteBatchEntryFn allows a caller to perform an operation for each +// batch entry. +type ForEachWriteBatchEntryFn func( + idx int, + entry WriteBatchEntry, + doc doc.Document, + result WriteBatchEntryResult, +) + +// ForEach allows a caller to perform an operation for each batch entry. +func (b *WriteBatch) ForEach(fn ForEachWriteBatchEntryFn) { + for idx, entry := range b.entries { + fn(idx, entry, b.docs[idx], entry.Result()) + } +} + +// ForEachWriteBatchByBlockStartFn allows a caller to perform an operation with +// reference to a restricted set of the write batch for each unique block +// start. +type ForEachWriteBatchByBlockStartFn func( + blockStart time.Time, + batch *WriteBatch, +) + +// ForEachUnmarkedBatchByBlockStart allows a caller to perform an operation +// with reference to a restricted set of the write batch for each unique block +// start for entries that have not been marked completed yet. +// The underlying batch returned is simply the current batch but with updated +// subslices to the relevant entries and documents that are restored at the +// end of `fn` being applied. +// NOTE: This means `fn` cannot perform any asynchronous work that uses the +// arguments passed to it as the args will be invalid at the synchronous +// execution of `fn`. +func (b *WriteBatch) ForEachUnmarkedBatchByBlockStart( + fn ForEachWriteBatchByBlockStartFn, +) { + // Ensure sorted correctly first + b.SortByUnmarkedAndIndexBlockStart() + + // What we do is a little funky but least alloc intensive, essentially we mutate + // this batch and then restore the pointers to the original docs after. + allEntries := b.entries + allDocs := b.docs + defer func() { + b.entries = allEntries + b.docs = allDocs + }() + + var ( + blockSize = b.opts.IndexBlockSize + startIdx = 0 + lastBlockStart xtime.UnixNano + ) + for i := range allEntries { + if allEntries[i].result.Done { + // Hit a marked done entry + b.entries = allEntries[startIdx:i] + b.docs = allDocs[startIdx:i] + if len(b.entries) != 0 { + fn(lastBlockStart.ToTime(), b) + } + return + } + + blockStart := allEntries[i].indexBlockStart(blockSize) + if !blockStart.Equal(lastBlockStart) { + prevLastBlockStart := lastBlockStart.ToTime() + lastBlockStart = blockStart + // We only want to call the the ForEachUnmarkedBatchByBlockStart once we have calculated the entire group, + // i.e. once we have gone past the last element for a given blockStart, but the first element + // in the slice is a special case because we are always starting a new group at that point. + if i == 0 { + continue + } + b.entries = allEntries[startIdx:i] + b.docs = allDocs[startIdx:i] + fn(prevLastBlockStart, b) + startIdx = i + } + } + + // We can unconditionally spill over here since we haven't hit any marked + // done entries yet and thanks to sort order there weren't any, therefore + // we can execute all the remaining entries we had. + if startIdx < len(allEntries) { + b.entries = allEntries[startIdx:] + b.docs = allDocs[startIdx:] + fn(lastBlockStart.ToTime(), b) + } +} + +func (b *WriteBatch) numPending() int { + numUnmarked := 0 + for i := range b.entries { + if b.entries[i].result.Done { + break + } + numUnmarked++ + } + return numUnmarked +} + +// PendingDocs returns all the docs in this batch that are unmarked. +func (b *WriteBatch) PendingDocs() []doc.Document { + b.SortByUnmarkedAndIndexBlockStart() // Ensure sorted by unmarked first + return b.docs[:b.numPending()] +} + +// PendingEntries returns all the entries in this batch that are unmarked. +func (b *WriteBatch) PendingEntries() []WriteBatchEntry { + b.SortByUnmarkedAndIndexBlockStart() // Ensure sorted by unmarked first + return b.entries[:b.numPending()] +} + +// NumErrs returns the number of errors encountered by the batch. +func (b *WriteBatch) NumErrs() int { + errs := 0 + for _, entry := range b.entries { + if entry.result.Err != nil { + errs++ + } + } + return errs +} + +// Reset resets the batch for use. +func (b *WriteBatch) Reset() { + // Memset optimizations + var entryZeroed WriteBatchEntry + for i := range b.entries { + b.entries[i] = entryZeroed + } + b.entries = b.entries[:0] + var docZeroed doc.Document + for i := range b.docs { + b.docs[i] = docZeroed + } + b.docs = b.docs[:0] +} + +// SortByUnmarkedAndIndexBlockStart sorts the batch by unmarked first and then +// by index block start time. +func (b *WriteBatch) SortByUnmarkedAndIndexBlockStart() { + b.sortBy = writeBatchSortByUnmarkedAndBlockStart + sort.Stable(b) +} + +// SortByEnqueued sorts the entries and documents back to the sort order they +// were enqueued as. +func (b *WriteBatch) SortByEnqueued() { + b.sortBy = writeBatchSortByEnqueued + sort.Stable(b) +} + +// MarkUnmarkedEntriesSuccess marks all unmarked entries as success. +func (b *WriteBatch) MarkUnmarkedEntriesSuccess() { + for idx := range b.entries { + if !b.entries[idx].result.Done { + blockStart := b.entries[idx].indexBlockStart(b.opts.IndexBlockSize) + b.entries[idx].OnIndexSeries.OnIndexSuccess(blockStart) + b.entries[idx].OnIndexSeries.OnIndexFinalize(blockStart) + b.entries[idx].result.Done = true + b.entries[idx].result.Err = nil + } + } +} + +// MarkUnmarkedEntriesError marks all unmarked entries as error. +func (b *WriteBatch) MarkUnmarkedEntriesError(err error) { + for idx := range b.entries { + b.MarkUnmarkedEntryError(err, idx) + } +} + +// MarkUnmarkedEntryError marks an unmarked entry at index as error. +func (b *WriteBatch) MarkUnmarkedEntryError( + err error, + idx int, +) { + if b.entries[idx].OnIndexSeries != nil { + blockStart := b.entries[idx].indexBlockStart(b.opts.IndexBlockSize) + b.entries[idx].OnIndexSeries.OnIndexFinalize(blockStart) + b.entries[idx].result.Done = true + b.entries[idx].result.Err = err + } +} + +// Ensure that WriteBatch meets the sort interface +var _ sort.Interface = (*WriteBatch)(nil) + +// Len returns the length of the batch. +func (b *WriteBatch) Len() int { + return len(b.entries) +} + +// Swap will swap two entries and the corresponding docs. +func (b *WriteBatch) Swap(i, j int) { + b.entries[i], b.entries[j] = b.entries[j], b.entries[i] + b.docs[i], b.docs[j] = b.docs[j], b.docs[i] +} + +// Less returns whether an entry appears before another depending +// on the type of sort. +func (b *WriteBatch) Less(i, j int) bool { + if b.sortBy == writeBatchSortByEnqueued { + return b.entries[i].enqueuedIdx < b.entries[j].enqueuedIdx + } + if b.sortBy != writeBatchSortByUnmarkedAndBlockStart { + panic(fmt.Errorf("unexpected sort by: %d", b.sortBy)) + } + + if !b.entries[i].result.Done && b.entries[j].result.Done { + // This entry has been marked done and the other this hasn't + return true + } + if b.entries[i].result.Done && !b.entries[j].result.Done { + // This entry has already been marked and other hasn't + return false + } + + // They're either both unmarked or marked + blockStartI := b.entries[i].indexBlockStart(b.opts.IndexBlockSize) + blockStartJ := b.entries[j].indexBlockStart(b.opts.IndexBlockSize) + return blockStartI.Before(blockStartJ) +} + +// WriteBatchEntry represents the metadata accompanying the document that is +// being inserted. +type WriteBatchEntry struct { + // Timestamp is the timestamp that this entry should be indexed for + Timestamp time.Time + // OnIndexSeries is a listener/callback for when this entry is marked done + // it is set to nil when the entry is marked done + OnIndexSeries OnIndexSeries + // EnqueuedAt is the timestamp that this entry was enqueued for indexing + // so that we can calculate the latency it takes to index the entry + EnqueuedAt time.Time + // enqueuedIdx is the idx of the entry when originally enqueued by the call + // to append on the write batch + enqueuedIdx int + // result is the result for this entry which is updated when marked done, + // if it is nil then it is not needed, it is a pointer type so many can be + // shared when write batches are derived from one and another when + // combining (for instance across from shards into a single write batch). + result *WriteBatchEntryResult + // resultVal is used to set the result initially from so it doesn't have to + // be separately allocated. + resultVal WriteBatchEntryResult +} + +// WriteBatchEntryResult represents a result. +type WriteBatchEntryResult struct { + Done bool + Err error +} + +func (e WriteBatchEntry) indexBlockStart( + indexBlockSize time.Duration, +) xtime.UnixNano { + return xtime.ToUnixNano(e.Timestamp.Truncate(indexBlockSize)) +} + +// Result returns the result for this entry. +func (e WriteBatchEntry) Result() WriteBatchEntryResult { + return *e.result +} + +// fieldsAndTermsIterator iterates over all known fields and terms for a segment. +type fieldsAndTermsIterator interface { + // Next returns a bool indicating if there are any more elements. + Next() bool + + // Current returns the current element. + // NB: the element returned is only valid until the subsequent call to Next(). + Current() (field, term []byte) + + // Err returns any errors encountered during iteration. + Err() error + + // Close releases any resources held by the iterator. + Close() error + + // Reset resets the iterator to the start iterating the given segment. + Reset(reader segment.Reader, opts fieldsAndTermsIteratorOpts) error +} + +// Options control the Indexing knobs. +type Options interface { + // Validate validates assumptions baked into the code. + Validate() error + + // SetIndexInsertMode sets the index insert mode (sync/async). + SetInsertMode(value InsertMode) Options + + // IndexInsertMode returns the index's insert mode (sync/async). + InsertMode() InsertMode + + // SetClockOptions sets the clock options. + SetClockOptions(value clock.Options) Options + + // ClockOptions returns the clock options. + ClockOptions() clock.Options + + // SetInstrumentOptions sets the instrument options. + SetInstrumentOptions(value instrument.Options) Options + + // InstrumentOptions returns the instrument options. + InstrumentOptions() instrument.Options + + // SetSegmentBuilderOptions sets the mem segment options. + SetSegmentBuilderOptions(value builder.Options) Options + + // SegmentBuilderOptions returns the mem segment options. + SegmentBuilderOptions() builder.Options + + // SetMemSegmentOptions sets the mem segment options. + SetMemSegmentOptions(value mem.Options) Options + + // MemSegmentOptions returns the mem segment options. + MemSegmentOptions() mem.Options + + // SetFSTSegmentOptions sets the fst segment options. + SetFSTSegmentOptions(value fst.Options) Options + + // FSTSegmentOptions returns the fst segment options. + FSTSegmentOptions() fst.Options + + // SetIdentifierPool sets the identifier pool. + SetIdentifierPool(value ident.Pool) Options + + // IdentifierPool returns the identifier pool. + IdentifierPool() ident.Pool + + // SetCheckedBytesPool sets the checked bytes pool. + SetCheckedBytesPool(value pool.CheckedBytesPool) Options + + // CheckedBytesPool returns the checked bytes pool. + CheckedBytesPool() pool.CheckedBytesPool + + // SetQueryResultsPool updates the query results pool. + SetQueryResultsPool(values QueryResultsPool) Options + + // ResultsPool returns the results pool. + QueryResultsPool() QueryResultsPool + + // SetAggregateResultsPool updates the aggregate results pool. + SetAggregateResultsPool(values AggregateResultsPool) Options + + // AggregateResultsPool returns the aggregate results pool. + AggregateResultsPool() AggregateResultsPool + + // SetAggregateValuesPool updates the aggregate values pool. + SetAggregateValuesPool(values AggregateValuesPool) Options + + // AggregateValuesPool returns the aggregate values pool. + AggregateValuesPool() AggregateValuesPool + + // SetDocumentArrayPool sets the document array pool. + SetDocumentArrayPool(value doc.DocumentArrayPool) Options + + // DocumentArrayPool returns the document array pool. + DocumentArrayPool() doc.DocumentArrayPool + + // SetAggregateResultsEntryArrayPool sets the aggregate results entry array pool. + SetAggregateResultsEntryArrayPool(value AggregateResultsEntryArrayPool) Options + + // AggregateResultsEntryArrayPool returns the aggregate results entry array pool. + AggregateResultsEntryArrayPool() AggregateResultsEntryArrayPool + + // SetForegroundCompactionPlannerOptions sets the compaction planner options. + SetForegroundCompactionPlannerOptions(v compaction.PlannerOptions) Options + + // ForegroundCompactionPlannerOptions returns the compaction planner options. + ForegroundCompactionPlannerOptions() compaction.PlannerOptions + + // SetBackgroundCompactionPlannerOptions sets the compaction planner options. + SetBackgroundCompactionPlannerOptions(v compaction.PlannerOptions) Options + + // BackgroundCompactionPlannerOptions returns the compaction planner options. + BackgroundCompactionPlannerOptions() compaction.PlannerOptions + + // SetPostingsListCache sets the postings list cache. + SetPostingsListCache(value *PostingsListCache) Options + + // PostingsListCache returns the postings list cache. + PostingsListCache() *PostingsListCache + + // SetReadThroughSegmentOptions sets the read through segment cache options. + SetReadThroughSegmentOptions(value ReadThroughSegmentOptions) Options + + // ReadThroughSegmentOptions returns the read through segment cache options. + ReadThroughSegmentOptions() ReadThroughSegmentOptions + + // SetForwardIndexProbability sets the probability chance for forward writes. + SetForwardIndexProbability(value float64) Options + + // ForwardIndexProbability returns the probability chance for forward writes. + ForwardIndexProbability() float64 + + // SetForwardIndexProbability sets the threshold for forward writes as a + // fraction of the bufferFuture. + SetForwardIndexThreshold(value float64) Options + + // ForwardIndexProbability returns the threshold for forward writes. + ForwardIndexThreshold() float64 + + // SetMmapReporter sets the mmap reporter. + SetMmapReporter(mmapReporter mmap.Reporter) Options + + // MmapReporter returns the mmap reporter. + MmapReporter() mmap.Reporter + + // SetQueryLimits sets current query limits. + SetQueryLimits(value limits.QueryLimits) Options + + // QueryLimits returns the current query limits. + QueryLimits() limits.QueryLimits +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/limits/noop_query_limits.go b/vendor/github.com/m3db/m3/src/dbnode/storage/limits/noop_query_limits.go new file mode 100644 index 00000000..4d940de4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/limits/noop_query_limits.go @@ -0,0 +1,59 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package limits + +type noOpQueryLimits struct { +} + +type noOpLookbackLimit struct { +} + +var ( + _ QueryLimits = (*noOpQueryLimits)(nil) + _ LookbackLimit = (*noOpLookbackLimit)(nil) +) + +// NoOpQueryLimits returns inactive query limits. +func NoOpQueryLimits() QueryLimits { + return &noOpQueryLimits{} +} + +func (q *noOpQueryLimits) DocsLimit() LookbackLimit { + return &noOpLookbackLimit{} +} + +func (q *noOpQueryLimits) BytesReadLimit() LookbackLimit { + return &noOpLookbackLimit{} +} + +func (q *noOpQueryLimits) AnyExceeded() error { + return nil +} + +func (q *noOpQueryLimits) Stop() { +} + +func (q *noOpQueryLimits) Start() { +} + +func (q *noOpLookbackLimit) Inc(int) error { + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/limits/query_limits.go b/vendor/github.com/m3db/m3/src/dbnode/storage/limits/query_limits.go new file mode 100644 index 00000000..0c3b9079 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/limits/query_limits.go @@ -0,0 +1,218 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package limits + +import ( + "fmt" + "time" + + "github.com/m3db/m3/src/x/instrument" + + "github.com/uber-go/tally" + "go.uber.org/atomic" +) + +const defaultLookback = time.Second * 15 + +type queryLimits struct { + docsLimit *lookbackLimit + bytesReadLimit *lookbackLimit +} + +type lookbackLimit struct { + name string + options LookbackLimitOptions + metrics lookbackLimitMetrics + recent *atomic.Int64 + stopCh chan struct{} +} + +type lookbackLimitMetrics struct { + recentCount tally.Gauge + recentMax tally.Gauge + total tally.Counter + exceeded tally.Counter +} + +var ( + _ QueryLimits = (*queryLimits)(nil) + _ LookbackLimit = (*lookbackLimit)(nil) +) + +// DefaultLookbackLimitOptions returns a new query limits manager. +func DefaultLookbackLimitOptions() LookbackLimitOptions { + return LookbackLimitOptions{ + // Default to no limit. + Limit: 0, + Lookback: defaultLookback, + } +} + +// NewQueryLimits returns a new query limits manager. +func NewQueryLimits( + docsLimitOpts LookbackLimitOptions, + bytesReadLimitOpts LookbackLimitOptions, + instrumentOpts instrument.Options, +) (QueryLimits, error) { + if err := docsLimitOpts.validate(); err != nil { + return nil, err + } + if err := bytesReadLimitOpts.validate(); err != nil { + return nil, err + } + docsLimit := newLookbackLimit(instrumentOpts, docsLimitOpts, "docs-matched") + bytesReadLimit := newLookbackLimit(instrumentOpts, bytesReadLimitOpts, "disk-bytes-read") + return &queryLimits{ + docsLimit: docsLimit, + bytesReadLimit: bytesReadLimit, + }, nil +} + +func newLookbackLimit( + instrumentOpts instrument.Options, + opts LookbackLimitOptions, + name string, +) *lookbackLimit { + return &lookbackLimit{ + name: name, + options: opts, + metrics: newLookbackLimitMetrics(instrumentOpts, name), + recent: atomic.NewInt64(0), + stopCh: make(chan struct{}), + } +} + +func newLookbackLimitMetrics(instrumentOpts instrument.Options, name string) lookbackLimitMetrics { + scope := instrumentOpts. + MetricsScope(). + SubScope("query-limit") + return lookbackLimitMetrics{ + recentCount: scope.Gauge(fmt.Sprintf("recent-count-%s", name)), + recentMax: scope.Gauge(fmt.Sprintf("recent-max-%s", name)), + total: scope.Counter(fmt.Sprintf("total-%s", name)), + exceeded: scope.Tagged(map[string]string{"limit": name}).Counter("exceeded"), + } +} + +func (q *queryLimits) DocsLimit() LookbackLimit { + return q.docsLimit +} + +func (q *queryLimits) BytesReadLimit() LookbackLimit { + return q.bytesReadLimit +} + +func (q *queryLimits) Start() { + q.docsLimit.start() + q.bytesReadLimit.start() +} + +func (q *queryLimits) Stop() { + q.docsLimit.stop() + q.bytesReadLimit.stop() +} + +func (q *queryLimits) AnyExceeded() error { + if err := q.docsLimit.exceeded(); err != nil { + return err + } + return q.bytesReadLimit.exceeded() +} + +// Inc increments the current value and returns an error if above the limit. +func (q *lookbackLimit) Inc(val int) error { + if val < 0 { + return fmt.Errorf("invalid negative query limit inc %d", val) + } + if val == 0 { + return q.exceeded() + } + + // Add the new stats to the global state. + valI64 := int64(val) + recent := q.recent.Add(valI64) + + // Update metrics. + q.metrics.recentCount.Update(float64(recent)) + q.metrics.total.Inc(valI64) + + // Enforce limit (if specified). + return q.checkLimit(recent) +} + +func (q *lookbackLimit) exceeded() error { + return q.checkLimit(q.recent.Load()) +} + +func (q *lookbackLimit) checkLimit(recent int64) error { + if q.options.Limit > 0 && recent > q.options.Limit { + q.metrics.exceeded.Inc(1) + return fmt.Errorf( + "query aborted due to limit: name=%s, limit=%d, current=%d, within=%s", + q.name, q.options.Limit, recent, q.options.Lookback) + } + return nil +} + +func (q *lookbackLimit) start() { + ticker := time.NewTicker(q.options.Lookback) + go func() { + for { + select { + case <-ticker.C: + q.reset() + case <-q.stopCh: + ticker.Stop() + return + } + } + }() +} + +func (q *lookbackLimit) stop() { + close(q.stopCh) +} + +func (q *lookbackLimit) current() int64 { + return q.recent.Load() +} + +func (q *lookbackLimit) reset() { + // Update peak gauge only on resets so it only tracks + // the peak values for each lookback period. + recent := q.recent.Load() + q.metrics.recentMax.Update(float64(recent)) + + // Update the standard recent gauge to reflect drop back to zero. + q.metrics.recentCount.Update(0) + + q.recent.Store(0) +} + +func (opts LookbackLimitOptions) validate() error { + if opts.Limit < 0 { + return fmt.Errorf("query limit requires limit >= 0 (%d)", opts.Limit) + } + if opts.Lookback <= 0 { + return fmt.Errorf("query limit requires lookback > 0 (%d)", opts.Lookback) + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/limits/types.go b/vendor/github.com/m3db/m3/src/dbnode/storage/limits/types.go new file mode 100644 index 00000000..c187f35a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/limits/types.go @@ -0,0 +1,54 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package limits + +import ( + "time" +) + +// QueryLimits provides an interface for managing query limits. +type QueryLimits interface { + // DocsLimit limits queries by a global concurrent count of index docs matched. + DocsLimit() LookbackLimit + // BytesReadLimit limits queries by a global concurrent count of bytes read from disk. + BytesReadLimit() LookbackLimit + + // AnyExceeded returns an error if any of the query limits are exceeded. + AnyExceeded() error + // Start begins background resetting of the query limits. + Start() + // Stop end background resetting of the query limits. + Stop() +} + +// LookbackLimit provides an interface for a specific query limit. +type LookbackLimit interface { + // Inc increments the recent value for the limit. + Inc(new int) error +} + +// LookbackLimitOptions holds options for a lookback limit to be enforced. +type LookbackLimitOptions struct { + // Limit past which errors will be returned. + Limit int64 + // Lookback is the period over which the limit is enforced. + Lookback time.Duration +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/README.md b/vendor/github.com/m3db/m3/src/dbnode/storage/series/README.md new file mode 100644 index 00000000..d1d2f732 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/README.md @@ -0,0 +1,23 @@ +# series + +Series related documentation. + +## Series flush lifecycle + +Warm/cold writes end up in versioned buckets based on write type (`ColdWrite` or `WarmWrite`). When flushes occur, we fetch in-mem data from all write type specific buckets to persist. + +For warm flushes, we write all warm written buckets to disk and mark the state of the block as `WarmRetrievable`. + +For cold flushes, we merge this data w/ data that's already on disk in `fs/merger.go` and write to disk. Once finished, we then update the `ColdVersionRetrievable` to the cold version we just wrote to disk. + +Data is only evicted from mem during a `Tick()`. This evicts either cold buckets up until flush state `ColdVersionRetrievable` or warm buckets that are marked as `WarmRetrievable` (or warm blocks that we have already warm flushed to disk). + +## Snapshotting/Bootstrap + +Snapshots work by merging all buckets for a series buffer regardless of write type into streams and persisting to disk. Snapshots are in the commitlog bootstrapper and snapshotted series data are loaded into `BufferBucket.loadedBlocks`. Attempts to call `series.LoadBlock()` for `WarmWrite` blocks will return an error if it already exists on disk. + +Series snapshots persist writes in both warm & cold buckets. During a flush, we persist snapshot files w/ a commit log ID. This ID is later used during the async cleanup process to deleted rotated commit logs. + +## Repair + +Shard repairs load data as cold writes into series buffer buckets. diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/buffer.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/buffer.go new file mode 100644 index 00000000..9f3f9b98 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/buffer.go @@ -0,0 +1,1637 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package series + +import ( + "bytes" + "errors" + "fmt" + "sort" + "sync/atomic" + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/persist" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/context" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/pool" + xtime "github.com/m3db/m3/src/x/time" + + "go.uber.org/zap" +) + +const ( + errBucketMapCacheNotInSync = "bucket map keys do not match sorted keys cache" + errBucketMapCacheNotInSyncFmt = errBucketMapCacheNotInSync + ", blockStart: %d" + errTimestampFormat = time.RFC822Z +) + +var ( + timeZero time.Time + errIncompleteMerge = errors.New("bucket merge did not result in only one encoder") + errTooManyEncoders = xerrors.NewInvalidParamsError(errors.New("too many encoders per block")) +) + +const ( + bucketsCacheSize = 2 + // optimizedTimesArraySize is the size of the internal array for the + // optimizedTimes struct. Since the size of this array determines the + // effectiveness of minimizing heap allocations, usage of this struct and/or + // changing this const should only be done after considering its current + // use cases: + // 1) The number of buckets that will be removed within a tick due to that + // block being recently flushed + // 2) The number of buckets that contain ColdWrites within a cold flush + // cycle + // TODO(juchan): revisit this after ColdWrites usage to see if this number + // is sane. + optimizedTimesArraySize = 8 + writableBucketVersion = 0 +) + +type databaseBuffer interface { + MoveTo( + buffer databaseBuffer, + nsCtx namespace.Context, + ) error + + Write( + ctx context.Context, + id ident.ID, + timestamp time.Time, + value float64, + unit xtime.Unit, + annotation []byte, + wOpts WriteOptions, + ) (bool, WriteType, error) + + Snapshot( + ctx context.Context, + blockStart time.Time, + metadata persist.Metadata, + persistFn persist.DataFn, + nsCtx namespace.Context, + ) (SnapshotResult, error) + + WarmFlush( + ctx context.Context, + blockStart time.Time, + metadata persist.Metadata, + persistFn persist.DataFn, + nsCtx namespace.Context, + ) (FlushOutcome, error) + + ReadEncoded( + ctx context.Context, + start, end time.Time, + nsCtx namespace.Context, + ) ([][]xio.BlockReader, error) + + FetchBlocksForColdFlush( + ctx context.Context, + start time.Time, + version int, + nsCtx namespace.Context, + ) (block.FetchBlockResult, error) + + FetchBlocks( + ctx context.Context, + starts []time.Time, + nsCtx namespace.Context, + ) []block.FetchBlockResult + + FetchBlocksMetadata( + ctx context.Context, + start, end time.Time, + opts FetchBlocksMetadataOptions, + ) (block.FetchBlockMetadataResults, error) + + IsEmpty() bool + + IsEmptyAtBlockStart(time.Time) bool + + ColdFlushBlockStarts(blockStates map[xtime.UnixNano]BlockState) OptimizedTimes + + Stats() bufferStats + + Tick(versions ShardBlockStateSnapshot, nsCtx namespace.Context) bufferTickResult + + Load(bl block.DatabaseBlock, writeType WriteType) + + Reset(opts databaseBufferResetOptions) +} + +type databaseBufferResetOptions struct { + BlockRetriever QueryableBlockRetriever + Options Options +} + +type bufferStats struct { + wiredBlocks int +} + +type bufferTickResult struct { + mergedOutOfOrderBlocks int + evictedBucketTimes OptimizedTimes +} + +// OptimizedTimes is a struct that holds an unknown number of times. This is +// used to avoid heap allocations as much as possible by trying to not allocate +// a slice of times. To do this, `optimizedTimesArraySize` needs to be +// strategically sized such that for the vast majority of the time, the internal +// array can hold all the times required so that `slice` is nil. +// +// OptimizedTimes should only be interacted with via its helper functions - its +// fields should never be accessed or modified directly, which could cause an +// invalid state. +type OptimizedTimes struct { + arrIdx int + arr [optimizedTimesArraySize]xtime.UnixNano + slice []xtime.UnixNano +} + +// Add adds a time to this OptimizedTimes. +func (t *OptimizedTimes) Add(newTime xtime.UnixNano) { + if t.arrIdx < cap(t.arr) { + t.arr[t.arrIdx] = newTime + t.arrIdx++ + } else { + t.slice = append(t.slice, newTime) + } +} + +// Len returns the number of times in this OptimizedTimes. +func (t *OptimizedTimes) Len() int { + return t.arrIdx + len(t.slice) +} + +// Contains returns whether the target time is in this OptimizedTimes. +func (t *OptimizedTimes) Contains(target xtime.UnixNano) bool { + for i := 0; i < t.arrIdx; i++ { + if t.arr[i].Equal(target) { + return true + } + } + for _, tt := range t.slice { + if tt.Equal(target) { + return true + } + } + return false +} + +// ForEach runs the given function for each time in this OptimizedTimes. +func (t *OptimizedTimes) ForEach(fn func(t xtime.UnixNano)) { + for i, tNano := range t.arr { + if i >= t.arrIdx { + break + } + fn(tNano) + } + for _, tNano := range t.slice { + fn(tNano) + } +} + +type dbBuffer struct { + opts Options + nowFn clock.NowFn + + // bucketsMap is a map from a block start to its corresponding bucket + // versions. + bucketsMap map[xtime.UnixNano]*BufferBucketVersions + // Cache of buckets to avoid map lookup of above. + bucketVersionsCache [bucketsCacheSize]*BufferBucketVersions + // This is an in order slice of the block starts in the bucketsMap. + // We maintain this to avoid sorting the map keys adhoc when we want to + // perform operations in chronological order. + inOrderBlockStarts []time.Time + bucketVersionsPool *BufferBucketVersionsPool + bucketPool *BufferBucketPool + blockRetriever QueryableBlockRetriever +} + +// NB(prateek): databaseBuffer.Reset(...) must be called upon the returned +// object prior to use. +func newDatabaseBuffer() databaseBuffer { + b := &dbBuffer{ + bucketsMap: make(map[xtime.UnixNano]*BufferBucketVersions), + inOrderBlockStarts: make([]time.Time, 0, bucketsCacheSize), + } + return b +} + +func (b *dbBuffer) Reset(opts databaseBufferResetOptions) { + b.opts = opts.Options + b.nowFn = opts.Options.ClockOptions().NowFn() + b.bucketPool = opts.Options.BufferBucketPool() + b.bucketVersionsPool = opts.Options.BufferBucketVersionsPool() + b.blockRetriever = opts.BlockRetriever +} + +func (b *dbBuffer) MoveTo( + buffer databaseBuffer, + nsCtx namespace.Context, +) error { + blockSize := b.opts.RetentionOptions().BlockSize() + for _, buckets := range b.bucketsMap { + for _, bucket := range buckets.buckets { + // Load any existing blocks. + for _, block := range bucket.loadedBlocks { + // Load block. + buffer.Load(block, bucket.writeType) + } + + // Load encoders. + for _, elem := range bucket.encoders { + if elem.encoder.Len() == 0 { + // No data. + continue + } + // Take ownership of the encoder. + segment := elem.encoder.Discard() + // Create block and load into new buffer. + block := b.opts.DatabaseBlockOptions().DatabaseBlockPool().Get() + block.Reset(bucket.start, blockSize, segment, nsCtx) + // Load block. + buffer.Load(block, bucket.writeType) + } + } + } + + return nil +} + +func (b *dbBuffer) Write( + ctx context.Context, + id ident.ID, + timestamp time.Time, + value float64, + unit xtime.Unit, + annotation []byte, + wOpts WriteOptions, +) (bool, WriteType, error) { + var ( + ropts = b.opts.RetentionOptions() + bufferPast = ropts.BufferPast() + bufferFuture = ropts.BufferFuture() + now = b.nowFn() + pastLimit = now.Add(-1 * bufferPast).Truncate(time.Second) + futureLimit = now.Add(bufferFuture).Truncate(time.Second) + blockSize = ropts.BlockSize() + blockStart = timestamp.Truncate(blockSize) + writeType WriteType + ) + + switch { + case wOpts.BootstrapWrite: + exists, err := b.blockRetriever.IsBlockRetrievable(blockStart) + if err != nil { + return false, writeType, err + } + // Bootstrap writes are allowed to be outside of time boundaries + // and determined as cold or warm writes depending on whether + // the block is retrievable or not. + if !exists { + writeType = WarmWrite + } else { + writeType = ColdWrite + } + + case timestamp.Before(pastLimit): + writeType = ColdWrite + if !b.opts.ColdWritesEnabled() { + return false, writeType, xerrors.NewInvalidParamsError( + fmt.Errorf("datapoint too far in past: "+ + "id=%s, off_by=%s, timestamp=%s, past_limit=%s, "+ + "timestamp_unix_nanos=%d, past_limit_unix_nanos=%d", + id.Bytes(), pastLimit.Sub(timestamp).String(), + timestamp.Format(errTimestampFormat), + pastLimit.Format(errTimestampFormat), + timestamp.UnixNano(), pastLimit.UnixNano())) + } + + case !futureLimit.After(timestamp): + writeType = ColdWrite + if !b.opts.ColdWritesEnabled() { + return false, writeType, xerrors.NewInvalidParamsError( + fmt.Errorf("datapoint too far in future: "+ + "id=%s, off_by=%s, timestamp=%s, future_limit=%s, "+ + "timestamp_unix_nanos=%d, future_limit_unix_nanos=%d", + id.Bytes(), timestamp.Sub(futureLimit).String(), + timestamp.Format(errTimestampFormat), + futureLimit.Format(errTimestampFormat), + timestamp.UnixNano(), futureLimit.UnixNano())) + } + + default: + writeType = WarmWrite + + } + + if writeType == ColdWrite { + retentionLimit := now.Add(-ropts.RetentionPeriod()) + if wOpts.BootstrapWrite { + // NB(r): Allow bootstrapping to write to blocks that are + // still in retention. + retentionLimit = retentionLimit.Truncate(blockSize) + } + if retentionLimit.After(timestamp) { + if wOpts.SkipOutOfRetention { + // Allow for datapoint to be skipped since caller does not + // want writes out of retention to fail. + return false, writeType, nil + } + return false, writeType, xerrors.NewInvalidParamsError( + fmt.Errorf("datapoint too far in past and out of retention: "+ + "id=%s, off_by=%s, timestamp=%s, retention_past_limit=%s, "+ + "timestamp_unix_nanos=%d, retention_past_limit_unix_nanos=%d", + id.Bytes(), retentionLimit.Sub(timestamp).String(), + timestamp.Format(errTimestampFormat), + retentionLimit.Format(errTimestampFormat), + timestamp.UnixNano(), retentionLimit.UnixNano())) + } + + futureRetentionLimit := now.Add(ropts.FutureRetentionPeriod()) + if !futureRetentionLimit.After(timestamp) { + if wOpts.SkipOutOfRetention { + // Allow for datapoint to be skipped since caller does not + // want writes out of retention to fail. + return false, writeType, nil + } + return false, writeType, xerrors.NewInvalidParamsError( + fmt.Errorf("datapoint too far in future and out of retention: "+ + "id=%s, off_by=%s, timestamp=%s, retention_future_limit=%s, "+ + "timestamp_unix_nanos=%d, retention_future_limit_unix_nanos=%d", + id.Bytes(), timestamp.Sub(futureRetentionLimit).String(), + timestamp.Format(errTimestampFormat), + futureRetentionLimit.Format(errTimestampFormat), + timestamp.UnixNano(), futureRetentionLimit.UnixNano())) + } + + b.opts.Stats().IncColdWrites() + } + + buckets := b.bucketVersionsAtCreate(blockStart) + b.putBucketVersionsInCache(buckets) + + if wOpts.TruncateType == TypeBlock { + timestamp = blockStart + } + + if wOpts.TransformOptions.ForceValueEnabled { + value = wOpts.TransformOptions.ForceValue + } + + ok, err := buckets.write(timestamp, value, unit, annotation, writeType, wOpts.SchemaDesc) + return ok, writeType, err +} + +func (b *dbBuffer) IsEmpty() bool { + // A buffer can only be empty if there are no buckets in its map, since + // buckets are only created when a write for a new block start is done, and + // buckets are removed from the map when they are evicted from memory. + return len(b.bucketsMap) == 0 +} + +func (b *dbBuffer) IsEmptyAtBlockStart(start time.Time) bool { + bv, exists := b.bucketVersionsAt(start) + if !exists { + return true + } + return bv.streamsLen() == 0 +} + +func (b *dbBuffer) ColdFlushBlockStarts(blockStates map[xtime.UnixNano]BlockState) OptimizedTimes { + var times OptimizedTimes + + for t, bucketVersions := range b.bucketsMap { + for _, bucket := range bucketVersions.buckets { + if bucket.writeType == ColdWrite && + // We need to cold flush this bucket if it either: + // 1) Has new cold writes that need to be flushed, or + // 2) This bucket version is higher than what has been + // successfully flushed. This can happen if a cold flush was + // attempted, changing this bucket version, but fails to + // completely finish (which is what the shard block state + // signifies). In this case, we need to try to flush this + // bucket again. + (bucket.version == writableBucketVersion || + blockStates[xtime.ToUnixNano(bucket.start)].ColdVersion < bucket.version) { + times.Add(t) + break + } + } + } + + return times +} + +func (b *dbBuffer) Stats() bufferStats { + return bufferStats{ + wiredBlocks: len(b.bucketsMap), + } +} + +func (b *dbBuffer) Tick(blockStates ShardBlockStateSnapshot, nsCtx namespace.Context) bufferTickResult { + mergedOutOfOrder := 0 + var evictedBucketTimes OptimizedTimes + for tNano, buckets := range b.bucketsMap { + // The blockStates map is never written to after creation, so this + // read access is safe. Since this version map is a snapshot of the + // versions, the real block flush versions may be higher. This is okay + // here because it's safe to: + // 1) not remove a bucket that's actually retrievable, or + // 2) remove a lower versioned bucket. + // Retrievable and higher versioned buckets will be left to be + // collected in the next tick. + blockStateSnapshot, bootstrapped := blockStates.UnwrapValue() + // Only use block state snapshot information to make eviction decisions if the block state + // has been properly bootstrapped already. + if bootstrapped { + blockState := blockStateSnapshot.Snapshot[tNano] + if coldVersion := blockState.ColdVersion; blockState.WarmRetrievable || coldVersion > 0 { + if blockState.WarmRetrievable { + // Buckets for WarmWrites that are retrievable will only be version 1, since + // they only get successfully persisted once. + buckets.removeBucketsUpToVersion(WarmWrite, 1) + } + if coldVersion > 0 { + buckets.removeBucketsUpToVersion(ColdWrite, coldVersion) + } + + if buckets.streamsLen() == 0 { + t := tNano.ToTime() + // All underlying buckets have been flushed successfully, so we can + // just remove the buckets from the bucketsMap. + b.removeBucketVersionsAt(t) + // Pass which bucket got evicted from the buffer to the series. + // Data gets read in order of precedence: buffer -> cache -> disk. + // After a bucket gets removed from the buffer, data from the cache + // will be served. However, since data just got persisted to disk, + // the cached block is now stale. To correct this, we can either: + // 1) evict the stale block from cache so that new data will + // be retrieved from disk, or + // 2) merge the new data into the cached block. + // It's unclear whether recently flushed data would frequently be + // read soon afterward, so we're choosing (1) here, since it has a + // simpler implementation (just removing from a map). + evictedBucketTimes.Add(tNano) + continue + } + } + } + + buckets.recordActiveEncoders() + + // Once we've evicted all eligible buckets, we merge duplicate encoders + // in the remaining ones to try and reclaim memory. + merges, err := buckets.merge(WarmWrite, nsCtx) + if err != nil { + log := b.opts.InstrumentOptions().Logger() + log.Error("buffer merge encode error", zap.Error(err)) + } + if merges > 0 { + mergedOutOfOrder++ + } + } + return bufferTickResult{ + mergedOutOfOrderBlocks: mergedOutOfOrder, + evictedBucketTimes: evictedBucketTimes, + } +} + +func (b *dbBuffer) Load(bl block.DatabaseBlock, writeType WriteType) { + var ( + blockStart = bl.StartTime() + buckets = b.bucketVersionsAtCreate(blockStart) + bucket = buckets.writableBucketCreate(writeType) + ) + bucket.loadedBlocks = append(bucket.loadedBlocks, bl) +} + +func (b *dbBuffer) Snapshot( + ctx context.Context, + blockStart time.Time, + metadata persist.Metadata, + persistFn persist.DataFn, + nsCtx namespace.Context, +) (SnapshotResult, error) { + var ( + start = b.nowFn() + result SnapshotResult + ) + + buckets, exists := b.bucketVersionsAt(blockStart) + if !exists { + return result, nil + } + + // Snapshot must take both cold and warm writes because cold flushes don't + // happen for the current block (since cold flushes can't happen before a + // warm flush has happened). + streams, err := buckets.mergeToStreams(ctx, streamsOptions{filterWriteType: false, nsCtx: nsCtx}) + if err != nil { + return result, err + } + + afterMergeByBucket := b.nowFn() + result.Stats.TimeMergeByBucket = afterMergeByBucket.Sub(start) + + var ( + numStreams = len(streams) + mergeAcrossBuckets = numStreams != 1 + segment ts.Segment + ) + if !mergeAcrossBuckets { + segment, err = streams[0].Segment() + if err != nil { + return result, err + } + } else { + // We may need to merge again here because the regular merge method does + // not merge warm and cold buckets or buckets that have different versions. + sr := make([]xio.SegmentReader, 0, numStreams) + for _, stream := range streams { + sr = append(sr, stream) + } + + bopts := b.opts.DatabaseBlockOptions() + encoder := bopts.EncoderPool().Get() + encoder.Reset(blockStart, bopts.DatabaseBlockAllocSize(), nsCtx.Schema) + iter := b.opts.MultiReaderIteratorPool().Get() + var encoderClosed bool + defer func() { + if !encoderClosed { + encoder.Close() + } + iter.Close() + }() + iter.Reset(sr, blockStart, b.opts.RetentionOptions().BlockSize(), nsCtx.Schema) + + for iter.Next() { + dp, unit, annotation := iter.Current() + if err := encoder.Encode(dp, unit, annotation); err != nil { + return result, err + } + } + if err := iter.Err(); err != nil { + return result, err + } + + segment = encoder.Discard() + defer segment.Finalize() + encoderClosed = true + } + + afterMergeAcrossBuckets := b.nowFn() + result.Stats.TimeMergeAcrossBuckets = afterMergeAcrossBuckets.Sub(afterMergeByBucket) + + if segment.Len() == 0 { + // Don't write out series with no data. + return result, nil + } + + checksum := segment.CalculateChecksum() + + afterChecksum := b.nowFn() + result.Stats.TimeChecksum = afterChecksum.Sub(afterMergeAcrossBuckets) + + if err := persistFn(metadata, segment, checksum); err != nil { + return result, err + } + + result.Stats.TimePersist = b.nowFn().Sub(afterChecksum) + + result.Persist = true + return result, nil +} + +func (b *dbBuffer) WarmFlush( + ctx context.Context, + blockStart time.Time, + metadata persist.Metadata, + persistFn persist.DataFn, + nsCtx namespace.Context, +) (FlushOutcome, error) { + buckets, exists := b.bucketVersionsAt(blockStart) + if !exists { + return FlushOutcomeBlockDoesNotExist, nil + } + + // Flush only deals with WarmWrites. ColdWrites get persisted to disk via + // the compaction cycle. + streams, err := buckets.mergeToStreams(ctx, streamsOptions{filterWriteType: true, writeType: WarmWrite, nsCtx: nsCtx}) + if err != nil { + return FlushOutcomeErr, err + } + + var ( + stream xio.SegmentReader + ok bool + ) + if numStreams := len(streams); numStreams == 1 { + stream = streams[0] + ok = true + } else { + // In the majority of cases, there will only be one stream to persist + // here. Only when a previous flush fails midway through a shard will + // there be buckets for previous versions. In this case, we need to try + // to flush them again, so we merge them together to one stream and + // persist it. + encoder, _, err := mergeStreamsToEncoder(blockStart, streams, b.opts, nsCtx) + if err != nil { + return FlushOutcomeErr, err + } + + stream, ok = encoder.Stream(ctx) + encoder.Close() + } + + if !ok { + // Don't write out series with no data. + return FlushOutcomeBlockDoesNotExist, nil + } + + segment, err := stream.Segment() + if err != nil { + return FlushOutcomeErr, err + } + + if segment.Len() == 0 { + // Empty segment is equivalent to no stream, i.e data does not exist. + return FlushOutcomeBlockDoesNotExist, nil + } + + checksum := segment.CalculateChecksum() + err = persistFn(metadata, segment, checksum) + if err != nil { + return FlushOutcomeErr, err + } + + if bucket, exists := buckets.writableBucket(WarmWrite); exists { + // WarmFlushes only happen once per block, so it makes sense to always + // set this to 1. + bucket.version = 1 + } + + return FlushOutcomeFlushedToDisk, nil +} + +func (b *dbBuffer) ReadEncoded( + ctx context.Context, + start time.Time, + end time.Time, + nsCtx namespace.Context, +) ([][]xio.BlockReader, error) { + var ( + blockSize = b.opts.RetentionOptions().BlockSize() + // TODO(r): pool these results arrays + res [][]xio.BlockReader + ) + + for _, blockStart := range b.inOrderBlockStarts { + if !blockStart.Before(end) || !start.Before(blockStart.Add(blockSize)) { + continue + } + + bv, exists := b.bucketVersionsAt(blockStart) + if !exists { + // Invariant violated. This means the keys in the bucket map does + // not match the sorted keys cache, which should never happen. + instrument.EmitAndLogInvariantViolation( + b.opts.InstrumentOptions(), func(l *zap.Logger) { + l.Error(errBucketMapCacheNotInSync, zap.Int64("blockStart", blockStart.UnixNano())) + }) + return nil, instrument.InvariantErrorf( + errBucketMapCacheNotInSyncFmt, blockStart.UnixNano()) + } + + if streams := bv.streams(ctx, streamsOptions{filterWriteType: false}); len(streams) > 0 { + res = append(res, streams) + } + + // NB(r): Store the last read time, should not set this when + // calling FetchBlocks as a read is differentiated from + // a FetchBlocks call. One is initiated by an external + // entity and the other is used for streaming blocks between + // the storage nodes. This distinction is important as this + // data is important for use with understanding access patterns, etc. + bv.setLastRead(b.nowFn()) + } + + return res, nil +} + +func (b *dbBuffer) FetchBlocksForColdFlush( + ctx context.Context, + start time.Time, + version int, + nsCtx namespace.Context, +) (block.FetchBlockResult, error) { + res := b.fetchBlocks(ctx, []time.Time{start}, + streamsOptions{filterWriteType: true, writeType: ColdWrite, nsCtx: nsCtx}) + if len(res) == 0 { + // The lifecycle of calling this function is preceded by first checking + // which blocks have cold data that have not yet been flushed. + // If we don't get data here, it means that it has since fallen out of + // retention and has been evicted. + return block.FetchBlockResult{}, nil + } + if len(res) != 1 { + // Must be only one result if anything at all, since fetchBlocks returns + // one result per block start. + return block.FetchBlockResult{}, fmt.Errorf("fetchBlocks did not return just one block for block start %s", start) + } + + result := res[0] + + buckets, exists := b.bucketVersionsAt(start) + if !exists { + return block.FetchBlockResult{}, fmt.Errorf("buckets do not exist with block start %s", start) + } + if bucket, exists := buckets.writableBucket(ColdWrite); exists { + // Update the version of the writable bucket (effectively making it not + // writable). This marks this bucket as attempted to be flushed, + // although it is only actually written to disk successfully at the + // shard level after every series has completed the flush process. + // The tick following a successful flush to disk will remove this bucket + // from memory. + bucket.version = version + } + // No-op if the writable bucket doesn't exist. + // This function should only get called for blocks that we know need to be + // cold flushed. However, buckets that get attempted to be cold flushed and + // fail need to get cold flushed as well. These kinds of buckets will have + // a non-writable version. + + return result, nil +} + +func (b *dbBuffer) FetchBlocks(ctx context.Context, starts []time.Time, nsCtx namespace.Context) []block.FetchBlockResult { + return b.fetchBlocks(ctx, starts, streamsOptions{filterWriteType: false, nsCtx: nsCtx}) +} + +func (b *dbBuffer) fetchBlocks( + ctx context.Context, + starts []time.Time, + sOpts streamsOptions, +) []block.FetchBlockResult { + var res []block.FetchBlockResult + + for _, start := range starts { + buckets, ok := b.bucketVersionsAt(start) + if !ok { + continue + } + + streams := buckets.streams(ctx, sOpts) + if len(streams) > 0 { + result := block.NewFetchBlockResult( + start, + streams, + nil, + ) + result.FirstWrite = buckets.firstWrite(sOpts) + res = append(res, result) + } + } + + // Result should be sorted in ascending order. + sort.Slice(res, func(i, j int) bool { return res[i].Start.Before(res[j].Start) }) + + return res +} + +func (b *dbBuffer) FetchBlocksMetadata( + ctx context.Context, + start, end time.Time, + opts FetchBlocksMetadataOptions, +) (block.FetchBlockMetadataResults, error) { + blockSize := b.opts.RetentionOptions().BlockSize() + res := b.opts.FetchBlockMetadataResultsPool().Get() + + for _, blockStart := range b.inOrderBlockStarts { + if !blockStart.Before(end) || !start.Before(blockStart.Add(blockSize)) { + continue + } + + bv, exists := b.bucketVersionsAt(blockStart) + if !exists { + // Invariant violated. This means the keys in the bucket map does + // not match the sorted keys cache, which should never happen. + instrument.EmitAndLogInvariantViolation( + b.opts.InstrumentOptions(), func(l *zap.Logger) { + l.Error(errBucketMapCacheNotInSync, zap.Int64("blockStart", blockStart.UnixNano())) + }) + return nil, instrument.InvariantErrorf(errBucketMapCacheNotInSyncFmt, blockStart.UnixNano()) + } + + size := int64(bv.streamsLen()) + // If we have no data in this bucket, skip early without appending it to the result. + if size == 0 { + continue + } + var resultSize int64 + if opts.IncludeSizes { + resultSize = size + } + var resultLastRead time.Time + if opts.IncludeLastRead { + resultLastRead = bv.lastRead() + } + + var ( + checksum *uint32 + err error + ) + if opts.IncludeChecksums { + // Checksum calculations are best effort since we can't calculate one if there + // are multiple streams without performing an expensive merge. + checksum, err = bv.checksumIfSingleStream(ctx) + if err != nil { + return nil, err + } + } + res.Add(block.FetchBlockMetadataResult{ + Start: bv.start, + Size: resultSize, + LastRead: resultLastRead, + Checksum: checksum, + }) + } + + return res, nil +} + +func (b *dbBuffer) bucketVersionsAt( + t time.Time, +) (*BufferBucketVersions, bool) { + // First check LRU cache. + for _, buckets := range b.bucketVersionsCache { + if buckets == nil { + continue + } + if buckets.start.Equal(t) { + return buckets, true + } + } + + // Then check the map. + if buckets, exists := b.bucketsMap[xtime.ToUnixNano(t)]; exists { + return buckets, true + } + + return nil, false +} + +func (b *dbBuffer) bucketVersionsAtCreate( + t time.Time, +) *BufferBucketVersions { + if buckets, exists := b.bucketVersionsAt(t); exists { + return buckets + } + + buckets := b.bucketVersionsPool.Get() + buckets.resetTo(t, b.opts, b.bucketPool) + b.bucketsMap[xtime.ToUnixNano(t)] = buckets + b.inOrderBlockStartsAdd(t) + + return buckets +} + +func (b *dbBuffer) putBucketVersionsInCache(newBuckets *BufferBucketVersions) { + replaceIdx := bucketsCacheSize - 1 + for i, buckets := range b.bucketVersionsCache { + // Check if we have the same pointer in cache. + if buckets == newBuckets { + replaceIdx = i + } + } + + for i := replaceIdx; i > 0; i-- { + b.bucketVersionsCache[i] = b.bucketVersionsCache[i-1] + } + + b.bucketVersionsCache[0] = newBuckets +} + +func (b *dbBuffer) removeBucketVersionsInCache(oldBuckets *BufferBucketVersions) { + nilIdx := -1 + for i, buckets := range b.bucketVersionsCache { + if buckets == oldBuckets { + nilIdx = i + } + } + if nilIdx == -1 { + return + } + + for i := nilIdx; i < bucketsCacheSize-1; i++ { + b.bucketVersionsCache[i] = b.bucketVersionsCache[i+1] + } + + b.bucketVersionsCache[bucketsCacheSize-1] = nil +} + +func (b *dbBuffer) removeBucketVersionsAt(blockStart time.Time) { + buckets, exists := b.bucketVersionsAt(blockStart) + if !exists { + return + } + delete(b.bucketsMap, xtime.ToUnixNano(blockStart)) + b.removeBucketVersionsInCache(buckets) + b.inOrderBlockStartsRemove(blockStart) + // nil out pointers. + buckets.resetTo(timeZero, nil, nil) + b.bucketVersionsPool.Put(buckets) +} + +func (b *dbBuffer) inOrderBlockStartsAdd(newTime time.Time) { + starts := b.inOrderBlockStarts + idx := len(starts) + // There shouldn't be that many starts here, so just linear search through. + for i, t := range starts { + if t.After(newTime) { + idx = i + break + } + } + // Insert new time without allocating new slice. + b.inOrderBlockStarts = append(starts, timeZero) + // Update to new slice + starts = b.inOrderBlockStarts + copy(starts[idx+1:], starts[idx:]) + starts[idx] = newTime +} + +func (b *dbBuffer) inOrderBlockStartsRemove(removeTime time.Time) { + starts := b.inOrderBlockStarts + // There shouldn't be that many starts here, so just linear search through. + for i, t := range starts { + if t.Equal(removeTime) { + b.inOrderBlockStarts = append(starts[:i], starts[i+1:]...) + return + } + } +} + +// BufferBucketVersions is a container for different versions of buffer buckets. +// Bucket versions are how the buffer separates writes that have been written +// to disk as a fileset and writes that have not. The bucket with a version of +// `writableBucketVersion` is the bucket that all writes go into (as thus is the +// bucket version that have not yet been persisted). After a bucket gets +// persisted, its version gets set to a version that the shard passes down to it +// (since the shard knows what has been fully persisted to disk). +type BufferBucketVersions struct { + buckets []*BufferBucket + start time.Time + opts Options + lastReadUnixNanos int64 + bucketPool *BufferBucketPool +} + +func (b *BufferBucketVersions) resetTo( + start time.Time, + opts Options, + bucketPool *BufferBucketPool, +) { + // nil all elements so that they get GC'd. + for i := range b.buckets { + b.buckets[i] = nil + } + b.buckets = b.buckets[:0] + b.start = start + b.opts = opts + atomic.StoreInt64(&b.lastReadUnixNanos, 0) + b.bucketPool = bucketPool +} + +// streams returns all the streams for this BufferBucketVersions. +func (b *BufferBucketVersions) streams(ctx context.Context, opts streamsOptions) []xio.BlockReader { + var res []xio.BlockReader + for _, bucket := range b.buckets { + if opts.filterWriteType && bucket.writeType != opts.writeType { + continue + } + res = append(res, bucket.streams(ctx)...) + } + + return res +} + +func (b *BufferBucketVersions) firstWrite(opts streamsOptions) time.Time { + var res time.Time + for _, bucket := range b.buckets { + if opts.filterWriteType && bucket.writeType != opts.writeType { + continue + } + // Get the earliest valid first write time. + if res.IsZero() || + (bucket.firstWrite.Before(res) && !bucket.firstWrite.IsZero()) { + res = bucket.firstWrite + } + } + return res +} + +func (b *BufferBucketVersions) streamsLen() int { + res := 0 + for _, bucket := range b.buckets { + res += bucket.streamsLen() + } + return res +} + +func (b *BufferBucketVersions) checksumIfSingleStream(ctx context.Context) (*uint32, error) { + if len(b.buckets) != 1 { + return nil, nil + } + return b.buckets[0].checksumIfSingleStream(ctx) +} + +func (b *BufferBucketVersions) write( + timestamp time.Time, + value float64, + unit xtime.Unit, + annotation []byte, + writeType WriteType, + schema namespace.SchemaDescr, +) (bool, error) { + return b.writableBucketCreate(writeType).write(timestamp, value, unit, annotation, schema) +} + +func (b *BufferBucketVersions) merge(writeType WriteType, nsCtx namespace.Context) (int, error) { + res := 0 + for _, bucket := range b.buckets { + // Only makes sense to merge buckets that are writable. + if bucket.version == writableBucketVersion && writeType == bucket.writeType { + merges, err := bucket.merge(nsCtx) + if err != nil { + return 0, err + } + res += merges + } + } + + return res, nil +} + +func (b *BufferBucketVersions) removeBucketsUpToVersion( + writeType WriteType, + version int, +) { + // Avoid allocating a new backing array. + nonEvictedBuckets := b.buckets[:0] + + for _, bucket := range b.buckets { + bVersion := bucket.version + if bucket.writeType == writeType && bVersion != writableBucketVersion && + bVersion <= version { + // We no longer need to keep any version which is equal to + // or less than the retrievable version, since that means + // that the version has successfully persisted to disk. + // Bucket gets reset before use. + b.bucketPool.Put(bucket) + continue + } + + nonEvictedBuckets = append(nonEvictedBuckets, bucket) + } + + b.buckets = nonEvictedBuckets +} + +func (b *BufferBucketVersions) setLastRead(value time.Time) { + atomic.StoreInt64(&b.lastReadUnixNanos, value.UnixNano()) +} + +func (b *BufferBucketVersions) lastRead() time.Time { + return time.Unix(0, atomic.LoadInt64(&b.lastReadUnixNanos)) +} + +func (b *BufferBucketVersions) writableBucket(writeType WriteType) (*BufferBucket, bool) { + for _, bucket := range b.buckets { + if bucket.version == writableBucketVersion && bucket.writeType == writeType { + return bucket, true + } + } + + return nil, false +} + +func (b *BufferBucketVersions) writableBucketCreate(writeType WriteType) *BufferBucket { + bucket, exists := b.writableBucket(writeType) + + if exists { + return bucket + } + + newBucket := b.bucketPool.Get() + newBucket.resetTo(b.start, writeType, b.opts) + b.buckets = append(b.buckets, newBucket) + return newBucket +} + +// mergeToStreams merges each buffer bucket version's streams into one, then +// returns a single stream for each buffer bucket version. +func (b *BufferBucketVersions) mergeToStreams(ctx context.Context, opts streamsOptions) ([]xio.SegmentReader, error) { + buckets := b.buckets + res := make([]xio.SegmentReader, 0, len(buckets)) + + for _, bucket := range buckets { + if opts.filterWriteType && bucket.writeType != opts.writeType { + continue + } + stream, ok, err := bucket.mergeToStream(ctx, opts.nsCtx) + if err != nil { + return nil, err + } + if !ok { + continue + } + res = append(res, stream) + } + + return res, nil +} + +func (b *BufferBucketVersions) recordActiveEncoders() { + var numActiveEncoders int + for _, bucket := range b.buckets { + if bucket.version == writableBucketVersion { + numActiveEncoders += len(bucket.encoders) + } + } + b.opts.Stats().RecordEncodersPerBlock(numActiveEncoders) +} + +type streamsOptions struct { + filterWriteType bool + writeType WriteType + nsCtx namespace.Context +} + +// BufferBucket is a specific version of a bucket of encoders, which is where +// writes are ultimately stored before they are persisted to disk as a fileset. +// See comment for BufferBucketVersions for more detail on bucket versions. +type BufferBucket struct { + opts Options + start time.Time + encoders []inOrderEncoder + loadedBlocks []block.DatabaseBlock + version int + writeType WriteType + firstWrite time.Time +} + +type inOrderEncoder struct { + encoder encoding.Encoder + lastWriteAt time.Time +} + +func (b *BufferBucket) resetTo( + start time.Time, + writeType WriteType, + opts Options, +) { + // Close the old context if we're resetting for use. + b.reset() + b.opts = opts + b.start = start + bopts := b.opts.DatabaseBlockOptions() + encoder := bopts.EncoderPool().Get() + encoder.Reset(start, bopts.DatabaseBlockAllocSize(), nil) + b.encoders = append(b.encoders, inOrderEncoder{ + encoder: encoder, + }) + b.loadedBlocks = nil + // We would only ever create a bucket for it to be writable. + b.version = writableBucketVersion + b.writeType = writeType + b.firstWrite = time.Time{} +} + +func (b *BufferBucket) reset() { + b.resetEncoders() + b.resetLoadedBlocks() +} + +func (b *BufferBucket) write( + timestamp time.Time, + value float64, + unit xtime.Unit, + annotation []byte, + schema namespace.SchemaDescr, +) (bool, error) { + datapoint := ts.Datapoint{ + Timestamp: timestamp, + TimestampNanos: xtime.ToUnixNano(timestamp), + Value: value, + } + + // Find the correct encoder to write to + idx := -1 + for i := range b.encoders { + lastWriteAt := b.encoders[i].lastWriteAt + if timestamp.Equal(lastWriteAt) { + lastDatapoint, err := b.encoders[i].encoder.LastEncoded() + if err != nil { + return false, err + } + lastAnnotation, err := b.encoders[i].encoder.LastAnnotation() + if err != nil { + return false, err + } + + if lastDatapoint.Value == value && bytes.Equal(lastAnnotation, annotation) { + // No-op since matches the current value. Propagates up to callers that + // no value was written. + return false, nil + } + continue + } + + if timestamp.After(lastWriteAt) { + idx = i + break + } + } + + var err error + defer func() { + nowFn := b.opts.ClockOptions().NowFn() + if err == nil && b.firstWrite.IsZero() { + b.firstWrite = nowFn() + } + }() + + // Upsert/last-write-wins semantics. + // NB(r): We push datapoints with the same timestamp but differing + // value into a new encoder later in the stack of in order encoders + // since an encoder is immutable. + // The encoders pushed later will surface their values first. + if idx != -1 { + err = b.writeToEncoderIndex(idx, datapoint, unit, annotation, schema) + return err == nil, err + } + + // Need a new encoder, we didn't find an encoder to write to. + maxEncoders := b.opts.RuntimeOptionsManager().Get().EncodersPerBlockLimit() + if maxEncoders != 0 && len(b.encoders) >= int(maxEncoders) { + b.opts.Stats().IncEncoderLimitWriteRejected() + return false, errTooManyEncoders + } + + b.opts.Stats().IncCreatedEncoders() + bopts := b.opts.DatabaseBlockOptions() + blockSize := b.opts.RetentionOptions().BlockSize() + blockAllocSize := bopts.DatabaseBlockAllocSize() + + encoder := b.opts.EncoderPool().Get() + encoder.Reset(timestamp.Truncate(blockSize), blockAllocSize, schema) + + b.encoders = append(b.encoders, inOrderEncoder{ + encoder: encoder, + lastWriteAt: timestamp, + }) + + idx = len(b.encoders) - 1 + err = b.writeToEncoderIndex(idx, datapoint, unit, annotation, schema) + if err != nil { + encoder.Close() + b.encoders = b.encoders[:idx] + return false, err + } + return true, nil +} + +func (b *BufferBucket) writeToEncoderIndex( + idx int, + datapoint ts.Datapoint, + unit xtime.Unit, + annotation []byte, + schema namespace.SchemaDescr, +) error { + b.encoders[idx].encoder.SetSchema(schema) + err := b.encoders[idx].encoder.Encode(datapoint, unit, annotation) + if err != nil { + return err + } + + b.encoders[idx].lastWriteAt = datapoint.Timestamp + return nil +} + +func (b *BufferBucket) streams(ctx context.Context) []xio.BlockReader { + streams := make([]xio.BlockReader, 0, len(b.loadedBlocks)+len(b.encoders)) + for _, bl := range b.loadedBlocks { + if bl.Len() == 0 { + continue + } + if s, err := bl.Stream(ctx); err == nil && s.IsNotEmpty() { + // NB(r): block stream method will register the stream closer already + streams = append(streams, s) + } + } + for i := range b.encoders { + start := b.start + if s, ok := b.encoders[i].encoder.Stream(ctx); ok { + br := xio.BlockReader{ + SegmentReader: s, + Start: start, + BlockSize: b.opts.RetentionOptions().BlockSize(), + } + ctx.RegisterFinalizer(s) + streams = append(streams, br) + } + } + + return streams +} + +func (b *BufferBucket) streamsLen() int { + length := 0 + for i := range b.loadedBlocks { + length += b.loadedBlocks[i].Len() + } + for i := range b.encoders { + length += b.encoders[i].encoder.Len() + } + return length +} + +func (b *BufferBucket) checksumIfSingleStream(ctx context.Context) (*uint32, error) { + if b.hasJustSingleEncoder() { + enc := b.encoders[0].encoder + stream, ok := enc.Stream(ctx) + if !ok { + return nil, nil + } + + segment, err := stream.Segment() + if err != nil { + return nil, err + } + + if segment.Len() == 0 { + return nil, nil + } + + checksum := segment.CalculateChecksum() + return &checksum, nil + } + + if b.hasJustSingleLoadedBlock() { + checksum, err := b.loadedBlocks[0].Checksum() + if err != nil { + return nil, err + } + return &checksum, nil + } + + return nil, nil +} + +func (b *BufferBucket) resetEncoders() { + var zeroed inOrderEncoder + for i := range b.encoders { + // Register when this bucket resets we close the encoder. + encoder := b.encoders[i].encoder + encoder.Close() + b.encoders[i] = zeroed + } + b.encoders = b.encoders[:0] +} + +func (b *BufferBucket) resetLoadedBlocks() { + for i := range b.loadedBlocks { + bl := b.loadedBlocks[i] + bl.Close() + } + b.loadedBlocks = nil +} + +func (b *BufferBucket) needsMerge() bool { + return !(b.hasJustSingleEncoder() || b.hasJustSingleLoadedBlock()) +} + +func (b *BufferBucket) hasJustSingleEncoder() bool { + return len(b.encoders) == 1 && len(b.loadedBlocks) == 0 +} + +func (b *BufferBucket) hasJustSingleLoadedBlock() bool { + encodersEmpty := len(b.encoders) == 0 || + (len(b.encoders) == 1 && b.encoders[0].encoder.Len() == 0) + return encodersEmpty && len(b.loadedBlocks) == 1 +} + +func (b *BufferBucket) merge(nsCtx namespace.Context) (int, error) { + if !b.needsMerge() { + // Save unnecessary work + return 0, nil + } + + var ( + start = b.start + readers = make([]xio.SegmentReader, 0, len(b.encoders)+len(b.loadedBlocks)) + streams = make([]xio.SegmentReader, 0, len(b.encoders)) + ctx = b.opts.ContextPool().Get() + merges = 0 + ) + defer func() { + ctx.Close() + // NB(r): Only need to close the mutable encoder streams as + // the context we created for reading the loaded blocks + // will close those streams when it is closed. + for _, stream := range streams { + stream.Finalize() + } + }() + + // Rank loaded blocks as data that has appeared before data that + // arrived locally in the buffer + for i := range b.loadedBlocks { + block, err := b.loadedBlocks[i].Stream(ctx) + if err == nil && block.SegmentReader != nil { + merges++ + readers = append(readers, block.SegmentReader) + } + } + + for i := range b.encoders { + if s, ok := b.encoders[i].encoder.Stream(ctx); ok { + merges++ + readers = append(readers, s) + streams = append(streams, s) + } + } + + encoder, lastWriteAt, err := mergeStreamsToEncoder(start, readers, b.opts, nsCtx) + if err != nil { + return 0, err + } + + b.resetEncoders() + b.resetLoadedBlocks() + + b.encoders = append(b.encoders, inOrderEncoder{ + encoder: encoder, + lastWriteAt: lastWriteAt, + }) + + return merges, nil +} + +// mergeStreamsToEncoder merges streams to an encoder and returns the last +// write time. It is the responsibility of the caller to close the returned +// encoder when appropriate. +func mergeStreamsToEncoder( + blockStart time.Time, + streams []xio.SegmentReader, + opts Options, + nsCtx namespace.Context, +) (encoding.Encoder, time.Time, error) { + bopts := opts.DatabaseBlockOptions() + encoder := opts.EncoderPool().Get() + encoder.Reset(blockStart, bopts.DatabaseBlockAllocSize(), nsCtx.Schema) + iter := opts.MultiReaderIteratorPool().Get() + defer iter.Close() + + var lastWriteAt time.Time + iter.Reset(streams, blockStart, opts.RetentionOptions().BlockSize(), nsCtx.Schema) + for iter.Next() { + dp, unit, annotation := iter.Current() + if err := encoder.Encode(dp, unit, annotation); err != nil { + encoder.Close() + return nil, timeZero, err + } + lastWriteAt = dp.Timestamp + } + if err := iter.Err(); err != nil { + encoder.Close() + return nil, timeZero, err + } + + return encoder, lastWriteAt, nil +} + +// mergeToStream merges all streams in this BufferBucket into one stream and +// returns it. +func (b *BufferBucket) mergeToStream(ctx context.Context, nsCtx namespace.Context) (xio.SegmentReader, bool, error) { + if b.hasJustSingleEncoder() { + b.resetLoadedBlocks() + // Already merged as a single encoder. + stream, ok := b.encoders[0].encoder.Stream(ctx) + if !ok { + return nil, false, nil + } + ctx.RegisterFinalizer(stream) + return stream, true, nil + } + + if b.hasJustSingleLoadedBlock() { + // Need to reset encoders but do not want to finalize the block as we + // are passing ownership of it to the caller. + b.resetEncoders() + stream, err := b.loadedBlocks[0].Stream(ctx) + if err != nil { + return nil, false, err + } + return stream, true, nil + } + + _, err := b.merge(nsCtx) + if err != nil { + b.resetEncoders() + b.resetLoadedBlocks() + return nil, false, err + } + + // After a successful merge, encoders and loaded blocks will be + // reset, and the merged encoder appended as the only encoder in the + // bucket. + if !b.hasJustSingleEncoder() { + return nil, false, errIncompleteMerge + } + + stream, ok := b.encoders[0].encoder.Stream(ctx) + if !ok { + return nil, false, nil + } + ctx.RegisterFinalizer(stream) + return stream, true, nil +} + +// BufferBucketVersionsPool provides a pool for BufferBucketVersions. +type BufferBucketVersionsPool struct { + pool pool.ObjectPool +} + +// NewBufferBucketVersionsPool creates a new BufferBucketVersionsPool. +func NewBufferBucketVersionsPool(opts pool.ObjectPoolOptions) *BufferBucketVersionsPool { + p := &BufferBucketVersionsPool{pool: pool.NewObjectPool(opts)} + p.pool.Init(func() interface{} { + return &BufferBucketVersions{} + }) + return p +} + +// Get gets a BufferBucketVersions from the pool. +func (p *BufferBucketVersionsPool) Get() *BufferBucketVersions { + return p.pool.Get().(*BufferBucketVersions) +} + +// Put puts a BufferBucketVersions back into the pool. +func (p *BufferBucketVersionsPool) Put(buckets *BufferBucketVersions) { + p.pool.Put(buckets) +} + +// BufferBucketPool provides a pool for BufferBuckets. +type BufferBucketPool struct { + pool pool.ObjectPool +} + +// NewBufferBucketPool creates a new BufferBucketPool. +func NewBufferBucketPool(opts pool.ObjectPoolOptions) *BufferBucketPool { + p := &BufferBucketPool{pool: pool.NewObjectPool(opts)} + p.pool.Init(func() interface{} { + return &BufferBucket{} + }) + return p +} + +// Get gets a BufferBucket from the pool. +func (p *BufferBucketPool) Get() *BufferBucket { + return p.pool.Get().(*BufferBucket) +} + +// Put puts a BufferBucket back into the pool. +func (p *BufferBucketPool) Put(bucket *BufferBucket) { + p.pool.Put(bucket) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/buffer_mock.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/buffer_mock.go new file mode 100644 index 00000000..ef7666df --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/buffer_mock.go @@ -0,0 +1,276 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/storage/series/buffer.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package series is a generated GoMock package. +package series + +import ( + "reflect" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/persist" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + time0 "github.com/m3db/m3/src/x/time" + + "github.com/golang/mock/gomock" +) + +// MockdatabaseBuffer is a mock of databaseBuffer interface +type MockdatabaseBuffer struct { + ctrl *gomock.Controller + recorder *MockdatabaseBufferMockRecorder +} + +// MockdatabaseBufferMockRecorder is the mock recorder for MockdatabaseBuffer +type MockdatabaseBufferMockRecorder struct { + mock *MockdatabaseBuffer +} + +// NewMockdatabaseBuffer creates a new mock instance +func NewMockdatabaseBuffer(ctrl *gomock.Controller) *MockdatabaseBuffer { + mock := &MockdatabaseBuffer{ctrl: ctrl} + mock.recorder = &MockdatabaseBufferMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockdatabaseBuffer) EXPECT() *MockdatabaseBufferMockRecorder { + return m.recorder +} + +// MoveTo mocks base method +func (m *MockdatabaseBuffer) MoveTo(buffer databaseBuffer, nsCtx namespace.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MoveTo", buffer, nsCtx) + ret0, _ := ret[0].(error) + return ret0 +} + +// MoveTo indicates an expected call of MoveTo +func (mr *MockdatabaseBufferMockRecorder) MoveTo(buffer, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MoveTo", reflect.TypeOf((*MockdatabaseBuffer)(nil).MoveTo), buffer, nsCtx) +} + +// Write mocks base method +func (m *MockdatabaseBuffer) Write(ctx context.Context, id ident.ID, timestamp time.Time, value float64, unit time0.Unit, annotation []byte, wOpts WriteOptions) (bool, WriteType, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", ctx, id, timestamp, value, unit, annotation, wOpts) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(WriteType) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Write indicates an expected call of Write +func (mr *MockdatabaseBufferMockRecorder) Write(ctx, id, timestamp, value, unit, annotation, wOpts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockdatabaseBuffer)(nil).Write), ctx, id, timestamp, value, unit, annotation, wOpts) +} + +// Snapshot mocks base method +func (m *MockdatabaseBuffer) Snapshot(ctx context.Context, blockStart time.Time, metadata persist.Metadata, persistFn persist.DataFn, nsCtx namespace.Context) (SnapshotResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Snapshot", ctx, blockStart, metadata, persistFn, nsCtx) + ret0, _ := ret[0].(SnapshotResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Snapshot indicates an expected call of Snapshot +func (mr *MockdatabaseBufferMockRecorder) Snapshot(ctx, blockStart, metadata, persistFn, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Snapshot", reflect.TypeOf((*MockdatabaseBuffer)(nil).Snapshot), ctx, blockStart, metadata, persistFn, nsCtx) +} + +// WarmFlush mocks base method +func (m *MockdatabaseBuffer) WarmFlush(ctx context.Context, blockStart time.Time, metadata persist.Metadata, persistFn persist.DataFn, nsCtx namespace.Context) (FlushOutcome, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WarmFlush", ctx, blockStart, metadata, persistFn, nsCtx) + ret0, _ := ret[0].(FlushOutcome) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WarmFlush indicates an expected call of WarmFlush +func (mr *MockdatabaseBufferMockRecorder) WarmFlush(ctx, blockStart, metadata, persistFn, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WarmFlush", reflect.TypeOf((*MockdatabaseBuffer)(nil).WarmFlush), ctx, blockStart, metadata, persistFn, nsCtx) +} + +// ReadEncoded mocks base method +func (m *MockdatabaseBuffer) ReadEncoded(ctx context.Context, start, end time.Time, nsCtx namespace.Context) ([][]xio.BlockReader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadEncoded", ctx, start, end, nsCtx) + ret0, _ := ret[0].([][]xio.BlockReader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadEncoded indicates an expected call of ReadEncoded +func (mr *MockdatabaseBufferMockRecorder) ReadEncoded(ctx, start, end, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadEncoded", reflect.TypeOf((*MockdatabaseBuffer)(nil).ReadEncoded), ctx, start, end, nsCtx) +} + +// FetchBlocksForColdFlush mocks base method +func (m *MockdatabaseBuffer) FetchBlocksForColdFlush(ctx context.Context, start time.Time, version int, nsCtx namespace.Context) (block.FetchBlockResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksForColdFlush", ctx, start, version, nsCtx) + ret0, _ := ret[0].(block.FetchBlockResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksForColdFlush indicates an expected call of FetchBlocksForColdFlush +func (mr *MockdatabaseBufferMockRecorder) FetchBlocksForColdFlush(ctx, start, version, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksForColdFlush", reflect.TypeOf((*MockdatabaseBuffer)(nil).FetchBlocksForColdFlush), ctx, start, version, nsCtx) +} + +// FetchBlocks mocks base method +func (m *MockdatabaseBuffer) FetchBlocks(ctx context.Context, starts []time.Time, nsCtx namespace.Context) []block.FetchBlockResult { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocks", ctx, starts, nsCtx) + ret0, _ := ret[0].([]block.FetchBlockResult) + return ret0 +} + +// FetchBlocks indicates an expected call of FetchBlocks +func (mr *MockdatabaseBufferMockRecorder) FetchBlocks(ctx, starts, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocks", reflect.TypeOf((*MockdatabaseBuffer)(nil).FetchBlocks), ctx, starts, nsCtx) +} + +// FetchBlocksMetadata mocks base method +func (m *MockdatabaseBuffer) FetchBlocksMetadata(ctx context.Context, start, end time.Time, opts FetchBlocksMetadataOptions) (block.FetchBlockMetadataResults, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksMetadata", ctx, start, end, opts) + ret0, _ := ret[0].(block.FetchBlockMetadataResults) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksMetadata indicates an expected call of FetchBlocksMetadata +func (mr *MockdatabaseBufferMockRecorder) FetchBlocksMetadata(ctx, start, end, opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksMetadata", reflect.TypeOf((*MockdatabaseBuffer)(nil).FetchBlocksMetadata), ctx, start, end, opts) +} + +// IsEmpty mocks base method +func (m *MockdatabaseBuffer) IsEmpty() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsEmpty") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsEmpty indicates an expected call of IsEmpty +func (mr *MockdatabaseBufferMockRecorder) IsEmpty() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsEmpty", reflect.TypeOf((*MockdatabaseBuffer)(nil).IsEmpty)) +} + +// IsEmptyAtBlockStart mocks base method +func (m *MockdatabaseBuffer) IsEmptyAtBlockStart(arg0 time.Time) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsEmptyAtBlockStart", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsEmptyAtBlockStart indicates an expected call of IsEmptyAtBlockStart +func (mr *MockdatabaseBufferMockRecorder) IsEmptyAtBlockStart(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsEmptyAtBlockStart", reflect.TypeOf((*MockdatabaseBuffer)(nil).IsEmptyAtBlockStart), arg0) +} + +// ColdFlushBlockStarts mocks base method +func (m *MockdatabaseBuffer) ColdFlushBlockStarts(blockStates map[time0.UnixNano]BlockState) OptimizedTimes { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ColdFlushBlockStarts", blockStates) + ret0, _ := ret[0].(OptimizedTimes) + return ret0 +} + +// ColdFlushBlockStarts indicates an expected call of ColdFlushBlockStarts +func (mr *MockdatabaseBufferMockRecorder) ColdFlushBlockStarts(blockStates interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ColdFlushBlockStarts", reflect.TypeOf((*MockdatabaseBuffer)(nil).ColdFlushBlockStarts), blockStates) +} + +// Stats mocks base method +func (m *MockdatabaseBuffer) Stats() bufferStats { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stats") + ret0, _ := ret[0].(bufferStats) + return ret0 +} + +// Stats indicates an expected call of Stats +func (mr *MockdatabaseBufferMockRecorder) Stats() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stats", reflect.TypeOf((*MockdatabaseBuffer)(nil).Stats)) +} + +// Tick mocks base method +func (m *MockdatabaseBuffer) Tick(versions ShardBlockStateSnapshot, nsCtx namespace.Context) bufferTickResult { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Tick", versions, nsCtx) + ret0, _ := ret[0].(bufferTickResult) + return ret0 +} + +// Tick indicates an expected call of Tick +func (mr *MockdatabaseBufferMockRecorder) Tick(versions, nsCtx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Tick", reflect.TypeOf((*MockdatabaseBuffer)(nil).Tick), versions, nsCtx) +} + +// Load mocks base method +func (m *MockdatabaseBuffer) Load(bl block.DatabaseBlock, writeType WriteType) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Load", bl, writeType) +} + +// Load indicates an expected call of Load +func (mr *MockdatabaseBufferMockRecorder) Load(bl, writeType interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Load", reflect.TypeOf((*MockdatabaseBuffer)(nil).Load), bl, writeType) +} + +// Reset mocks base method +func (m *MockdatabaseBuffer) Reset(opts databaseBufferResetOptions) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", opts) +} + +// Reset indicates an expected call of Reset +func (mr *MockdatabaseBufferMockRecorder) Reset(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockdatabaseBuffer)(nil).Reset), opts) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/options.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/options.go new file mode 100644 index 00000000..682b432e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/options.go @@ -0,0 +1,232 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package series + +import ( + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/retention" + m3dbruntime "github.com/m3db/m3/src/dbnode/runtime" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/pool" +) + +type options struct { + clockOpts clock.Options + instrumentOpts instrument.Options + retentionOpts retention.Options + blockOpts block.Options + cachePolicy CachePolicy + contextPool context.Pool + encoderPool encoding.EncoderPool + multiReaderIteratorPool encoding.MultiReaderIteratorPool + fetchBlockMetadataResultsPool block.FetchBlockMetadataResultsPool + identifierPool ident.Pool + stats Stats + coldWritesEnabled bool + bufferBucketPool *BufferBucketPool + bufferBucketVersionsPool *BufferBucketVersionsPool + runtimeOptsMgr m3dbruntime.OptionsManager +} + +// NewOptions creates new database series options +func NewOptions() Options { + bytesPool := pool.NewCheckedBytesPool([]pool.Bucket{ + pool.Bucket{Count: 4096, Capacity: 128}, + }, nil, func(s []pool.Bucket) pool.BytesPool { + return pool.NewBytesPool(s, nil) + }) + bytesPool.Init() + iopts := instrument.NewOptions() + return &options{ + clockOpts: clock.NewOptions(), + instrumentOpts: iopts, + retentionOpts: retention.NewOptions(), + blockOpts: block.NewOptions(), + cachePolicy: DefaultCachePolicy, + contextPool: context.NewPool(context.NewOptions()), + encoderPool: encoding.NewEncoderPool(nil), + multiReaderIteratorPool: encoding.NewMultiReaderIteratorPool(nil), + fetchBlockMetadataResultsPool: block.NewFetchBlockMetadataResultsPool(nil, 0), + identifierPool: ident.NewPool(bytesPool, ident.PoolOptions{}), + stats: NewStats(iopts.MetricsScope()), + } +} + +func (o *options) Validate() error { + if err := o.retentionOpts.Validate(); err != nil { + return err + } + return ValidateCachePolicy(o.cachePolicy) +} + +func (o *options) SetClockOptions(value clock.Options) Options { + opts := *o + opts.clockOpts = value + return &opts +} + +func (o *options) ClockOptions() clock.Options { + return o.clockOpts +} + +func (o *options) SetInstrumentOptions(value instrument.Options) Options { + opts := *o + opts.instrumentOpts = value + return &opts +} + +func (o *options) InstrumentOptions() instrument.Options { + return o.instrumentOpts +} + +func (o *options) SetRetentionOptions(value retention.Options) Options { + opts := *o + opts.retentionOpts = value + return &opts +} + +func (o *options) RetentionOptions() retention.Options { + return o.retentionOpts +} + +func (o *options) SetDatabaseBlockOptions(value block.Options) Options { + opts := *o + opts.blockOpts = value + return &opts +} + +func (o *options) DatabaseBlockOptions() block.Options { + return o.blockOpts +} + +func (o *options) SetCachePolicy(value CachePolicy) Options { + opts := *o + opts.cachePolicy = value + return &opts +} + +func (o *options) CachePolicy() CachePolicy { + return o.cachePolicy +} + +func (o *options) SetContextPool(value context.Pool) Options { + opts := *o + opts.contextPool = value + return &opts +} + +func (o *options) ContextPool() context.Pool { + return o.contextPool +} + +func (o *options) SetEncoderPool(value encoding.EncoderPool) Options { + opts := *o + opts.encoderPool = value + return &opts +} + +func (o *options) EncoderPool() encoding.EncoderPool { + return o.encoderPool +} + +func (o *options) SetMultiReaderIteratorPool(value encoding.MultiReaderIteratorPool) Options { + opts := *o + opts.multiReaderIteratorPool = value + return &opts +} + +func (o *options) MultiReaderIteratorPool() encoding.MultiReaderIteratorPool { + return o.multiReaderIteratorPool +} + +func (o *options) SetFetchBlockMetadataResultsPool(value block.FetchBlockMetadataResultsPool) Options { + opts := *o + opts.fetchBlockMetadataResultsPool = value + return &opts +} + +func (o *options) FetchBlockMetadataResultsPool() block.FetchBlockMetadataResultsPool { + return o.fetchBlockMetadataResultsPool +} + +func (o *options) SetIdentifierPool(value ident.Pool) Options { + opts := *o + opts.identifierPool = value + return &opts +} + +func (o *options) IdentifierPool() ident.Pool { + return o.identifierPool +} + +func (o *options) SetStats(value Stats) Options { + opts := *o + opts.stats = value + return &opts +} + +func (o *options) Stats() Stats { + return o.stats +} + +func (o *options) SetColdWritesEnabled(value bool) Options { + opts := *o + opts.coldWritesEnabled = value + return &opts +} + +func (o *options) ColdWritesEnabled() bool { + return o.coldWritesEnabled +} + +func (o *options) SetBufferBucketVersionsPool(value *BufferBucketVersionsPool) Options { + opts := *o + opts.bufferBucketVersionsPool = value + return &opts +} + +func (o *options) BufferBucketVersionsPool() *BufferBucketVersionsPool { + return o.bufferBucketVersionsPool +} + +func (o *options) SetBufferBucketPool(value *BufferBucketPool) Options { + opts := *o + opts.bufferBucketPool = value + return &opts +} + +func (o *options) BufferBucketPool() *BufferBucketPool { + return o.bufferBucketPool +} + +func (o *options) SetRuntimeOptionsManager(value m3dbruntime.OptionsManager) Options { + opts := *o + opts.runtimeOptsMgr = value + return &opts +} + +func (o *options) RuntimeOptionsManager() m3dbruntime.OptionsManager { + return o.runtimeOptsMgr +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/policy.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/policy.go new file mode 100644 index 00000000..e1ba01ac --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/policy.go @@ -0,0 +1,118 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package series + +import ( + "errors" + "fmt" +) + +var ( + errCachePolicyUnspecified = errors.New("series cache policy unspecified") +) + +// CachePolicy is the series cache policy. +type CachePolicy uint + +const ( + // CacheNone specifies that no series will be cached by default. + CacheNone CachePolicy = iota + // CacheAll specifies that all series must be cached at all times + // which requires loading all into cache on bootstrap and never + // expiring series from memory until expired from retention. + CacheAll + // CacheRecentlyRead specifies that series that are recently read + // must be cached, configurable by the namespace block expiry after + // not accessed period. + CacheRecentlyRead + // CacheLRU specifies that series that are read will be cached + // using an LRU of fixed capacity. Series that are least recently + // used will be evicted first. + CacheLRU + + // DefaultCachePolicy is the default cache policy. + DefaultCachePolicy = CacheLRU +) + +// ValidCachePolicies returns the valid series cache policies. +func ValidCachePolicies() []CachePolicy { + return []CachePolicy{CacheNone, CacheAll, CacheRecentlyRead, CacheLRU} +} + +func (p CachePolicy) String() string { + switch p { + case CacheNone: + return "none" + case CacheAll: + return "all" + case CacheRecentlyRead: + return "recently_read" + case CacheLRU: + return "lru" + } + return "unknown" +} + +// ValidateCachePolicy validates a cache policy. +func ValidateCachePolicy(v CachePolicy) error { + validSeriesCachePolicy := false + for _, valid := range ValidCachePolicies() { + if valid == v { + validSeriesCachePolicy = true + break + } + } + if !validSeriesCachePolicy { + return fmt.Errorf("invalid series CachePolicy '%d' valid types are: %v", + uint(v), ValidCachePolicies()) + } + return nil +} + +// ParseCachePolicy parses a CachePolicy from a string. +func ParseCachePolicy(str string) (CachePolicy, error) { + var r CachePolicy + if str == "" { + return r, errCachePolicyUnspecified + } + for _, valid := range ValidCachePolicies() { + if str == valid.String() { + r = valid + return r, nil + } + } + return r, fmt.Errorf("invalid series CachePolicy '%s' valid types are: %v", + str, ValidCachePolicies()) +} + +// UnmarshalYAML unmarshals an CachePolicy into a valid type from string. +func (p *CachePolicy) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + r, err := ParseCachePolicy(str) + if err != nil { + return err + } + *p = r + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/reader.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/reader.go new file mode 100644 index 00000000..7feaa532 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/reader.go @@ -0,0 +1,346 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package series + +import ( + "errors" + "fmt" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/retention" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/x/context" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" +) + +var ( + errSeriesReadInvalidRange = errors.New( + "series invalid time range read argument specified") +) + +// Reader reads results from a series, or a series block +// retriever or both. +// It is implemented as a struct so it can be allocated on +// the stack. +type Reader struct { + opts Options + id ident.ID + retriever QueryableBlockRetriever + onRetrieve block.OnRetrieveBlock + onRead block.OnReadBlock +} + +// NewReaderUsingRetriever returns a reader for a series +// block retriever, it will use the block retriever as the +// source to read blocks from. +func NewReaderUsingRetriever( + id ident.ID, + retriever QueryableBlockRetriever, + onRetrieveBlock block.OnRetrieveBlock, + onReadBlock block.OnReadBlock, + opts Options, +) Reader { + return Reader{ + opts: opts, + id: id, + retriever: retriever, + onRetrieve: onRetrieveBlock, + onRead: onReadBlock, + } +} + +// ReadEncoded reads encoded blocks using just a block retriever. +func (r Reader) ReadEncoded( + ctx context.Context, + start, end time.Time, + nsCtx namespace.Context, +) ([][]xio.BlockReader, error) { + return r.readersWithBlocksMapAndBuffer(ctx, start, end, nil, nil, nsCtx) +} + +func (r Reader) readersWithBlocksMapAndBuffer( + ctx context.Context, + start, end time.Time, + seriesBlocks block.DatabaseSeriesBlocks, + seriesBuffer databaseBuffer, + nsCtx namespace.Context, +) ([][]xio.BlockReader, error) { + // Two-dimensional slice such that the first dimension is unique by blockstart + // and the second dimension is blocks of data for that blockstart (not necessarily + // in chronological order). + // + // ex. (querying 2P.M -> 6P.M with a 2-hour blocksize): + // [][]xio.BlockReader{ + // {block0, block1, block2}, // <- 2P.M + // {block0, block1}, // <-4P.M + // } + var results [][]xio.BlockReader + + if end.Before(start) { + return nil, xerrors.NewInvalidParamsError(errSeriesReadInvalidRange) + } + + var ( + nowFn = r.opts.ClockOptions().NowFn() + now = nowFn() + cachePolicy = r.opts.CachePolicy() + ropts = r.opts.RetentionOptions() + size = ropts.BlockSize() + alignedStart = start.Truncate(size) + alignedEnd = end.Truncate(size) + ) + + if alignedEnd.Equal(end) { + // Move back to make range [start, end) + alignedEnd = alignedEnd.Add(-1 * size) + } + + // Squeeze the lookup window by what's available to make range queries like [0, infinity) possible + earliest := retention.FlushTimeStart(ropts, now) + if alignedStart.Before(earliest) { + alignedStart = earliest + } + latest := now.Add(ropts.BufferFuture()).Truncate(size) + if alignedEnd.After(latest) { + alignedEnd = latest + } + + first, last := alignedStart, alignedEnd + for blockAt := first; !blockAt.After(last); blockAt = blockAt.Add(size) { + // resultsBlock holds the results from one block. The flow is: + // 1) Look in the cache for metrics for a block. + // 2) If there is nothing in the cache, try getting metrics from disk. + // 3) Regardless of (1) or (2), look for metrics in the series buffer. + // + // It is important to look for data in the series buffer one block at + // a time within this loop so that the returned results contain data + // from blocks in chronological order. Failure to do this will result + // in an out of order error in the MultiReaderIterator on query. + var resultsBlock []xio.BlockReader + + retrievedFromDiskCache := false + if seriesBlocks != nil { + if block, ok := seriesBlocks.BlockAt(blockAt); ok { + // Block served from in-memory or in-memory metadata + // will defer to disk read + streamedBlock, err := block.Stream(ctx) + if err != nil { + return nil, err + } + if streamedBlock.IsNotEmpty() { + resultsBlock = append(resultsBlock, streamedBlock) + // NB(r): Mark this block as read now + block.SetLastReadTime(now) + if r.onRead != nil { + r.onRead.OnReadBlock(block) + } + } + retrievedFromDiskCache = true + } + } + + // Avoid going to disk if data was already in the cache. + if !retrievedFromDiskCache { + switch { + case cachePolicy == CacheAll: + // No-op, block metadata should have been in-memory + case r.retriever != nil: + // Try to stream from disk + isRetrievable, err := r.retriever.IsBlockRetrievable(blockAt) + if err != nil { + return nil, err + } + if isRetrievable { + streamedBlock, err := r.retriever.Stream(ctx, r.id, blockAt, r.onRetrieve, nsCtx) + if err != nil { + return nil, err + } + if streamedBlock.IsNotEmpty() { + resultsBlock = append(resultsBlock, streamedBlock) + } + } + } + } + + if seriesBuffer != nil { + bufferResults, err := seriesBuffer.ReadEncoded(ctx, blockAt, blockAt.Add(size), nsCtx) + if err != nil { + return nil, err + } + // Multiple block results may be returned here (for the same block + // start) - one for warm writes and another for cold writes. + for _, bufferRes := range bufferResults { + resultsBlock = append(resultsBlock, bufferRes...) + } + } + + if len(resultsBlock) > 0 { + results = append(results, resultsBlock) + } + } + + return results, nil +} + +// FetchBlocks returns data blocks given a list of block start times using +// just a block retriever. +func (r Reader) FetchBlocks( + ctx context.Context, + starts []time.Time, + nsCtx namespace.Context, +) ([]block.FetchBlockResult, error) { + return r.fetchBlocksWithBlocksMapAndBuffer(ctx, starts, nil, nil, nsCtx) +} + +func (r Reader) fetchBlocksWithBlocksMapAndBuffer( + ctx context.Context, + starts []time.Time, + seriesBlocks block.DatabaseSeriesBlocks, + seriesBuffer databaseBuffer, + nsCtx namespace.Context, +) ([]block.FetchBlockResult, error) { + var ( + // Two-dimensional slice (each block.FetchBlockResult has a []xio.BlockReader internally) + // such that the first dimension is unique by blockstart and the second dimension is blocks + // of data for that blockstart (not necessarily in chronological order). + // + // ex. (querying 2P.M -> 6P.M with a 2-hour blocksize): + // []block.FetchBlockResult{ + // block.FetchBlockResult{ + // Start: 2P.M, + // Blocks: []xio.BlockReader{block0, block1, block2}, + // }, + // block.FetchBlockResult{ + // Start: 4P.M, + // Blocks: []xio.BlockReader{block0}, + // }, + // } + res = make([]block.FetchBlockResult, 0, len(starts)) + cachePolicy = r.opts.CachePolicy() + // NB(r): Always use nil for OnRetrieveBlock so we don't cache the + // series after fetching it from disk, the fetch blocks API is called + // during streaming so to cache it in memory would mean we would + // eventually cache all series in memory when we stream results to a + // peer. + onRetrieve block.OnRetrieveBlock + ) + for _, start := range starts { + // Slice of xio.BlockReader such that all data belong to the same blockstart. + var blockReaders []xio.BlockReader + + retrievedFromDiskCache := false + if seriesBlocks != nil { + if b, exists := seriesBlocks.BlockAt(start); exists { + streamedBlock, err := b.Stream(ctx) + if err != nil { + // Short-circuit this entire blockstart if an error was encountered. + r := block.NewFetchBlockResult(start, nil, + fmt.Errorf("unable to retrieve block stream for series %s time %v: %v", + r.id.String(), start, err)) + res = append(res, r) + continue + } + + if streamedBlock.IsNotEmpty() { + blockReaders = append(blockReaders, streamedBlock) + } + retrievedFromDiskCache = true + } + } + + // Avoid going to disk if data was already in the cache. + if !retrievedFromDiskCache { + switch { + case cachePolicy == CacheAll: + // No-op, block metadata should have been in-memory + case r.retriever != nil: + // Try to stream from disk + isRetrievable, err := r.retriever.IsBlockRetrievable(start) + if err != nil { + // Short-circuit this entire blockstart if an error was encountered. + r := block.NewFetchBlockResult(start, nil, + fmt.Errorf("unable to retrieve block stream for series %s time %v: %v", + r.id.String(), start, err)) + res = append(res, r) + continue + } + + if isRetrievable { + streamedBlock, err := r.retriever.Stream(ctx, r.id, start, onRetrieve, nsCtx) + if err != nil { + // Short-circuit this entire blockstart if an error was encountered. + r := block.NewFetchBlockResult(start, nil, + fmt.Errorf("unable to retrieve block stream for series %s time %v: %v", + r.id.String(), start, err)) + res = append(res, r) + continue + } + + if streamedBlock.IsNotEmpty() { + blockReaders = append(blockReaders, streamedBlock) + } + } + } + } + + if len(blockReaders) > 0 { + res = append(res, block.NewFetchBlockResult(start, blockReaders, nil)) + } + } + + if seriesBuffer != nil && !seriesBuffer.IsEmpty() { + bufferResults := seriesBuffer.FetchBlocks(ctx, starts, nsCtx) + + // Ensure both slices are sorted before merging as two sorted lists. + block.SortFetchBlockResultByTimeAscending(res) + block.SortFetchBlockResultByTimeAscending(bufferResults) + bufferIdx := 0 + for i, blockResult := range res { + if !(bufferIdx < len(bufferResults)) { + break + } + + currBufferResult := bufferResults[bufferIdx] + if blockResult.Start.Equal(currBufferResult.Start) { + if currBufferResult.Err != nil { + res[i].Err = currBufferResult.Err + } else { + res[i].Blocks = append(res[i].Blocks, currBufferResult.Blocks...) + } + bufferIdx++ + continue + } + } + + // Add any buffer results for which there was no existing blockstart + // to the end. + if bufferIdx < len(bufferResults) { + res = append(res, bufferResults[bufferIdx:]...) + } + } + + // Should still be sorted but do it again for sanity. + block.SortFetchBlockResultByTimeAscending(res) + return res, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/series.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/series.go new file mode 100644 index 00000000..a08718cf --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/series.go @@ -0,0 +1,731 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package series + +import ( + "errors" + "fmt" + "sync" + "time" + + "github.com/m3db/m3/src/dbnode/persist" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + xtime "github.com/m3db/m3/src/x/time" + + "github.com/m3db/m3/src/dbnode/namespace" + "go.uber.org/zap" +) + +var ( + // ErrSeriesAllDatapointsExpired is returned on tick when all datapoints are expired + ErrSeriesAllDatapointsExpired = errors.New("series datapoints are all expired") + + errSeriesAlreadyBootstrapped = errors.New("series is already bootstrapped") + errSeriesNotBootstrapped = errors.New("series is not yet bootstrapped") + errBlockStateSnapshotNotBootstrapped = errors.New("block state snapshot is not bootstrapped") + + // Placeholder for a timeseries being bootstrapped which does not + // have access to the TS ID. + bootstrapWriteID = ident.StringID("bootstrap_timeseries") +) + +type dbSeries struct { + sync.RWMutex + opts Options + + // NB(r): One should audit all places that access the + // series metadata before changing ownership semantics (e.g. + // pooling the ID rather than releasing it to the GC on + // calling series.Reset()). + // Note: The bytes that back "id ident.ID" are the same bytes + // that are behind the ID in "metadata doc.Document", the whole + // reason we keep an ident.ID on the series is since there's a lot + // of existing callsites that require the ID as an ident.ID. + id ident.ID + metadata doc.Document + uniqueIndex uint64 + + bootstrap dbSeriesBootstrap + + buffer databaseBuffer + cachedBlocks block.DatabaseSeriesBlocks + blockRetriever QueryableBlockRetriever + onRetrieveBlock block.OnRetrieveBlock + blockOnEvictedFromWiredList block.OnEvictedFromWiredList + pool DatabaseSeriesPool +} + +type dbSeriesBootstrap struct { + sync.Mutex + + // buffer should be nil unless this series + // has taken bootstrap writes. + buffer databaseBuffer +} + +// NewDatabaseSeries creates a new database series. +func NewDatabaseSeries(opts DatabaseSeriesOptions) DatabaseSeries { + s := newDatabaseSeries() + s.Reset(opts) + return s +} + +// newPooledDatabaseSeries creates a new pooled database series. +func newPooledDatabaseSeries(pool DatabaseSeriesPool) DatabaseSeries { + series := newDatabaseSeries() + series.pool = pool + return series +} + +// NB(prateek): dbSeries.Reset(...) must be called upon the returned +// object prior to use. +func newDatabaseSeries() *dbSeries { + series := &dbSeries{ + cachedBlocks: block.NewDatabaseSeriesBlocks(0), + } + series.buffer = newDatabaseBuffer() + return series +} + +func (s *dbSeries) now() time.Time { + nowFn := s.opts.ClockOptions().NowFn() + return nowFn() +} + +func (s *dbSeries) ID() ident.ID { + s.RLock() + id := s.id + s.RUnlock() + return id +} + +func (s *dbSeries) Metadata() doc.Document { + s.RLock() + metadata := s.metadata + s.RUnlock() + return metadata +} + +func (s *dbSeries) UniqueIndex() uint64 { + s.RLock() + uniqueIndex := s.uniqueIndex + s.RUnlock() + return uniqueIndex +} + +func (s *dbSeries) Tick(blockStates ShardBlockStateSnapshot, nsCtx namespace.Context) (TickResult, error) { + var r TickResult + + s.Lock() + + bufferResult := s.buffer.Tick(blockStates, nsCtx) + r.MergedOutOfOrderBlocks = bufferResult.mergedOutOfOrderBlocks + r.EvictedBuckets = bufferResult.evictedBucketTimes.Len() + update, err := s.updateBlocksWithLock(blockStates, bufferResult.evictedBucketTimes) + if err != nil { + s.Unlock() + return r, err + } + r.TickStatus = update.TickStatus + r.MadeExpiredBlocks, r.MadeUnwiredBlocks = + update.madeExpiredBlocks, update.madeUnwiredBlocks + + s.Unlock() + + if update.ActiveBlocks > 0 { + return r, nil + } + + // Check if any bootstrap writes that hasn't been merged yet. + s.bootstrap.Lock() + unmergedBootstrapDatapoints := s.bootstrap.buffer != nil + s.bootstrap.Unlock() + + if unmergedBootstrapDatapoints { + return r, nil + } + + // Everything expired. + return r, ErrSeriesAllDatapointsExpired +} + +type updateBlocksResult struct { + TickStatus + madeExpiredBlocks int + madeUnwiredBlocks int +} + +func (s *dbSeries) updateBlocksWithLock( + blockStates ShardBlockStateSnapshot, + evictedBucketTimes OptimizedTimes, +) (updateBlocksResult, error) { + var ( + result updateBlocksResult + now = s.now() + ropts = s.opts.RetentionOptions() + cachePolicy = s.opts.CachePolicy() + expireCutoff = now.Add(-ropts.RetentionPeriod()).Truncate(ropts.BlockSize()) + wiredTimeout = ropts.BlockDataExpiryAfterNotAccessedPeriod() + ) + for startNano, currBlock := range s.cachedBlocks.AllBlocks() { + start := startNano.ToTime() + if start.Before(expireCutoff) || evictedBucketTimes.Contains(xtime.ToUnixNano(start)) { + s.cachedBlocks.RemoveBlockAt(start) + // If we're using the LRU policy and the block was retrieved from disk, + // then don't close the block because that is the WiredList's + // responsibility. The block will hang around the WiredList until + // it is evicted to make room for something else at which point it + // will be closed. + // + // Note that while we don't close the block, we do remove it from the list + // of blocks. This is so that the series itself can still be expired if this + // was the last block. The WiredList will still notify the shard/series via + // the OnEvictedFromWiredList method when it closes the block, but those + // methods are noops for series/blocks that have already been removed. + // + // Also note that while technically the DatabaseBlock protects against double + // closes, they can be problematic due to pooling. I.E if the following sequence + // of actions happens: + // 1) Tick closes expired block + // 2) Block is re-inserted into pool + // 3) Block is pulled out of pool and used for critical data + // 4) WiredList tries to close the block, not knowing that it has + // already been closed, and re-opened / re-used leading to + // unexpected behavior or data loss. + if cachePolicy == CacheLRU && currBlock.WasRetrievedFromDisk() { + // Do nothing + } else { + currBlock.Close() + } + result.madeExpiredBlocks++ + continue + } + + result.ActiveBlocks++ + + if cachePolicy == CacheAll { + // Never unwire + result.WiredBlocks++ + continue + } + + // Potentially unwire + var unwired, shouldUnwire bool + blockStatesSnapshot, bootstrapped := blockStates.UnwrapValue() + // Only use block state snapshot information to make eviction decisions if the block state + // has been properly bootstrapped already. + if bootstrapped { + // Makes sure that the block has been flushed, which + // prevents us from unwiring blocks that haven't been flushed yet which + // would cause data loss. + if blockState := blockStatesSnapshot.Snapshot[startNano]; blockState.WarmRetrievable { + switch cachePolicy { + case CacheNone: + shouldUnwire = true + case CacheRecentlyRead: + sinceLastRead := now.Sub(currBlock.LastReadTime()) + shouldUnwire = sinceLastRead >= wiredTimeout + case CacheLRU: + // The tick is responsible for managing the lifecycle of blocks that were not + // read from disk (not retrieved), and the WiredList will manage those that were + // retrieved from disk. + shouldUnwire = !currBlock.WasRetrievedFromDisk() + default: + s.opts.InstrumentOptions().Logger().Fatal( + "unhandled cache policy in series tick", zap.Any("policy", cachePolicy)) + } + } + } + + if shouldUnwire { + // Remove the block and it will be looked up later + s.cachedBlocks.RemoveBlockAt(start) + currBlock.Close() + unwired = true + result.madeUnwiredBlocks++ + } + + if unwired { + result.UnwiredBlocks++ + } else { + result.WiredBlocks++ + if currBlock.HasMergeTarget() { + result.PendingMergeBlocks++ + } + } + } + + bufferStats := s.buffer.Stats() + result.ActiveBlocks += bufferStats.wiredBlocks + result.WiredBlocks += bufferStats.wiredBlocks + + return result, nil +} + +func (s *dbSeries) IsEmpty() bool { + s.RLock() + blocksLen := s.cachedBlocks.Len() + bufferEmpty := s.buffer.IsEmpty() + s.RUnlock() + if blocksLen == 0 && bufferEmpty { + return true + } + return false +} + +func (s *dbSeries) IsBufferEmptyAtBlockStart(blockStart time.Time) bool { + s.RLock() + bufferEmpty := s.buffer.IsEmptyAtBlockStart(blockStart) + s.RUnlock() + return bufferEmpty +} + +func (s *dbSeries) NumActiveBlocks() int { + s.RLock() + value := s.cachedBlocks.Len() + s.buffer.Stats().wiredBlocks + s.RUnlock() + return value +} + +func (s *dbSeries) Write( + ctx context.Context, + timestamp time.Time, + value float64, + unit xtime.Unit, + annotation []byte, + wOpts WriteOptions, +) (bool, WriteType, error) { + if wOpts.BootstrapWrite { + // NB(r): If this is a bootstrap write we store this in a + // side buffer so that we don't need to take the series lock + // and contend with normal writes that are flowing into the DB + // while bootstrapping which can significantly interrupt + // write latency and cause entire DB to stall/degrade in performance. + return s.bootstrapWrite(ctx, timestamp, value, unit, annotation, wOpts) + } + + s.Lock() + written, writeType, err := s.buffer.Write(ctx, s.id, timestamp, value, + unit, annotation, wOpts) + s.Unlock() + + return written, writeType, err +} + +func (s *dbSeries) bootstrapWrite( + ctx context.Context, + timestamp time.Time, + value float64, + unit xtime.Unit, + annotation []byte, + wOpts WriteOptions, +) (bool, WriteType, error) { + s.bootstrap.Lock() + defer s.bootstrap.Unlock() + + if s.bootstrap.buffer == nil { + // Temporarily release bootstrap lock. + s.bootstrap.Unlock() + + // Get reset opts. + resetOpts, err := s.bufferResetOpts() + + // Re-lock bootstrap lock. + s.bootstrap.Lock() + + if err != nil { + // Abort if failed to get buffer opts. + var writeType WriteType + return false, writeType, err + } + + // If buffer still nil then set it. + if s.bootstrap.buffer == nil { + s.bootstrap.buffer = newDatabaseBuffer() + s.bootstrap.buffer.Reset(resetOpts) + } + } + + return s.bootstrap.buffer.Write(ctx, bootstrapWriteID, timestamp, + value, unit, annotation, wOpts) +} + +func (s *dbSeries) bufferResetOpts() (databaseBufferResetOptions, error) { + // Grab series lock. + s.RLock() + defer s.RUnlock() + + if s.id == nil { + // Not active, expired series. + return databaseBufferResetOptions{}, ErrSeriesAllDatapointsExpired + } + + return databaseBufferResetOptions{ + BlockRetriever: s.blockRetriever, + Options: s.opts, + }, nil +} + +func (s *dbSeries) ReadEncoded( + ctx context.Context, + start, end time.Time, + nsCtx namespace.Context, +) ([][]xio.BlockReader, error) { + s.RLock() + reader := NewReaderUsingRetriever(s.id, s.blockRetriever, s.onRetrieveBlock, s, s.opts) + r, err := reader.readersWithBlocksMapAndBuffer(ctx, start, end, s.cachedBlocks, s.buffer, nsCtx) + s.RUnlock() + return r, err +} + +func (s *dbSeries) FetchBlocksForColdFlush( + ctx context.Context, + start time.Time, + version int, + nsCtx namespace.Context, +) (block.FetchBlockResult, error) { + // This needs a write lock because the version on underlying buckets need + // to be modified. + s.Lock() + result, err := s.buffer.FetchBlocksForColdFlush(ctx, start, version, nsCtx) + s.Unlock() + + return result, err +} + +func (s *dbSeries) FetchBlocks( + ctx context.Context, + starts []time.Time, + nsCtx namespace.Context, +) ([]block.FetchBlockResult, error) { + s.RLock() + r, err := Reader{ + opts: s.opts, + id: s.id, + retriever: s.blockRetriever, + onRetrieve: s.onRetrieveBlock, + }.fetchBlocksWithBlocksMapAndBuffer(ctx, starts, s.cachedBlocks, s.buffer, nsCtx) + s.RUnlock() + return r, err +} + +func (s *dbSeries) FetchBlocksMetadata( + ctx context.Context, + start, end time.Time, + opts FetchBlocksMetadataOptions, +) (block.FetchBlocksMetadataResult, error) { + s.RLock() + defer s.RUnlock() + + res := s.opts.FetchBlockMetadataResultsPool().Get() + // Iterate over the encoders in the database buffer + if !s.buffer.IsEmpty() { + bufferResults, err := s.buffer.FetchBlocksMetadata(ctx, start, end, opts) + if err != nil { + return block.FetchBlocksMetadataResult{}, err + } + for _, result := range bufferResults.Results() { + res.Add(result) + } + bufferResults.Close() + } + + res.Sort() + + // NB(r): Since ID and Tags are garbage collected we can safely + // return refs. + tagsIter := s.opts.IdentifierPool().TagsIterator() + tagsIter.ResetFields(s.metadata.Fields) + return block.NewFetchBlocksMetadataResult(s.id, tagsIter, res), nil +} + +func (s *dbSeries) addBlockWithLock(b block.DatabaseBlock) { + b.SetOnEvictedFromWiredList(s.blockOnEvictedFromWiredList) + s.cachedBlocks.AddBlock(b) +} + +func (s *dbSeries) LoadBlock( + block block.DatabaseBlock, + writeType WriteType, +) error { + switch writeType { + case WarmWrite: + at := block.StartTime() + alreadyExists, err := s.blockRetriever.IsBlockRetrievable(at) + if err != nil { + err = fmt.Errorf("error checking warm block load valid: %v", err) + instrument.EmitAndLogInvariantViolation(s.opts.InstrumentOptions(), + func(l *zap.Logger) { + l.Error("warm load block invariant", zap.Error(err)) + }) + return err + } + if alreadyExists { + err = fmt.Errorf( + "warm block load for block that exists: block_start=%s", at) + instrument.EmitAndLogInvariantViolation(s.opts.InstrumentOptions(), + func(l *zap.Logger) { + l.Error("warm load block invariant", zap.Error(err)) + }) + return err + } + } + + s.Lock() + s.buffer.Load(block, writeType) + s.Unlock() + return nil +} + +func (s *dbSeries) OnRetrieveBlock( + id ident.ID, + tags ident.TagIterator, + startTime time.Time, + segment ts.Segment, + nsCtx namespace.Context, +) { + var ( + b block.DatabaseBlock + list *block.WiredList + ) + s.Lock() + defer func() { + s.Unlock() + if b != nil && list != nil { + // 1) We need to update the WiredList so that blocks that were read from disk + // can enter the list (OnReadBlock is only called for blocks that + // were read from memory, regardless of whether the data originated + // from disk or a buffer rotation.) + // 2) We must perform this action outside of the lock to prevent deadlock + // with the WiredList itself when it tries to call OnEvictedFromWiredList + // on the same series that is trying to perform a blocking update. + // 3) Doing this outside of the lock is safe because updating the + // wired list is asynchronous already (Update just puts the block in + // a channel to be processed later.) + // 4) We have to perform a blocking update because in this flow, the block + // is not already in the wired list so we need to make sure that the WiredList + // takes control of its lifecycle. + list.BlockingUpdate(b) + } + }() + + if !id.Equal(s.id) { + return + } + + b = s.opts.DatabaseBlockOptions().DatabaseBlockPool().Get() + blockSize := s.opts.RetentionOptions().BlockSize() + b.ResetFromDisk(startTime, blockSize, segment, s.id, nsCtx) + + // NB(r): Blocks retrieved have been triggered by a read, so set the last + // read time as now so caching policies are followed. + b.SetLastReadTime(s.now()) + + // If we retrieved this from disk then we directly emplace it + s.addBlockWithLock(b) + + list = s.opts.DatabaseBlockOptions().WiredList() +} + +// OnReadBlock is only called for blocks that were read from memory, regardless of +// whether the data originated from disk or buffer rotation. +func (s *dbSeries) OnReadBlock(b block.DatabaseBlock) { + if list := s.opts.DatabaseBlockOptions().WiredList(); list != nil { + // The WiredList is only responsible for managing the lifecycle of blocks + // retrieved from disk. + if b.WasRetrievedFromDisk() { + // 1) Need to update the WiredList so it knows which blocks have been + // most recently read. + // 2) We do a non-blocking update here to prevent deadlock with the + // WiredList calling OnEvictedFromWiredList on the same series since + // OnReadBlock is usually called within the context of a read lock + // on this series. + // 3) Its safe to do a non-blocking update because the wired list has + // already been exposed to this block, so even if the wired list drops + // this update, it will still manage this blocks lifecycle. + list.NonBlockingUpdate(b) + } + } +} + +func (s *dbSeries) OnEvictedFromWiredList(id ident.ID, blockStart time.Time) { + s.Lock() + defer s.Unlock() + + // Should never happen + if !id.Equal(s.id) { + return + } + + block, ok := s.cachedBlocks.BlockAt(blockStart) + if ok { + if !block.WasRetrievedFromDisk() { + // Should never happen - invalid application state could cause data loss + instrument.EmitAndLogInvariantViolation( + s.opts.InstrumentOptions(), func(l *zap.Logger) { + l.With( + zap.String("id", id.String()), + zap.Time("blockStart", blockStart), + ).Error("tried to evict block that was not retrieved from disk") + }) + return + } + + s.cachedBlocks.RemoveBlockAt(blockStart) + } +} + +func (s *dbSeries) WarmFlush( + ctx context.Context, + blockStart time.Time, + persistFn persist.DataFn, + nsCtx namespace.Context, +) (FlushOutcome, error) { + // Need a write lock because the buffer WarmFlush method mutates + // state (by performing a pro-active merge). + s.Lock() + outcome, err := s.buffer.WarmFlush(ctx, blockStart, + persist.NewMetadata(s.metadata), persistFn, nsCtx) + s.Unlock() + return outcome, err +} + +func (s *dbSeries) Snapshot( + ctx context.Context, + blockStart time.Time, + persistFn persist.DataFn, + nsCtx namespace.Context, +) (SnapshotResult, error) { + // Need a write lock because the buffer Snapshot method mutates + // state (by performing a pro-active merge). + s.Lock() + result, err := s.buffer.Snapshot(ctx, blockStart, + persist.NewMetadata(s.metadata), persistFn, nsCtx) + s.Unlock() + return result, err +} + +func (s *dbSeries) ColdFlushBlockStarts(blockStates BootstrappedBlockStateSnapshot) OptimizedTimes { + s.RLock() + defer s.RUnlock() + + return s.buffer.ColdFlushBlockStarts(blockStates.Snapshot) +} + +func (s *dbSeries) Bootstrap(nsCtx namespace.Context) error { + // NB(r): Need to hold the lock the whole time since + // this needs to be consistent view for a tick to see. + s.Lock() + defer s.Unlock() + + s.bootstrap.Lock() + bootstrapBuffer := s.bootstrap.buffer + s.bootstrap.buffer = nil + s.bootstrap.Unlock() + + if bootstrapBuffer == nil { + return nil + } + + // NB(r): Now bootstrapped need to move bootstrap writes to the + // normal series buffer to make them visible to DB. + // We store these bootstrap writes in a side buffer so that we don't + // need to take the series lock and contend with normal writes + // that flow into the DB while bootstrapping which can significantly + // interrupt write latency and cause entire DB to stall/degrade in performance. + return bootstrapBuffer.MoveTo(s.buffer, nsCtx) +} + +func (s *dbSeries) Close() { + s.bootstrap.Lock() + if s.bootstrap.buffer != nil { + s.bootstrap.buffer = nil + } + s.bootstrap.Unlock() + + s.Lock() + defer s.Unlock() + + // See Reset() for why these aren't finalized. + s.id = nil + s.metadata = doc.Document{} + s.uniqueIndex = 0 + + switch s.opts.CachePolicy() { + case CacheLRU: + // In the CacheLRU case, blocks that were retrieved from disk are owned + // by the WiredList and should not be closed here. They will eventually + // be evicted and closed by the WiredList when it needs to make room + // for new blocks. + default: + // This call closes the blocks as well. + s.cachedBlocks.RemoveAll() + } + + // Reset (not close) underlying resources because the series will go + // back into the pool and be re-used. + s.buffer.Reset(databaseBufferResetOptions{Options: s.opts}) + s.cachedBlocks.Reset() + + if s.pool != nil { + s.pool.Put(s) + } +} + +func (s *dbSeries) Reset(opts DatabaseSeriesOptions) { + // NB(r): We explicitly do not place the ID back into an + // existing pool as high frequency users of series IDs such + // as the commit log need to use the reference without the + // overhead of ownership tracking. In addition, the blocks + // themselves have a reference to the ID which is required + // for the LRU/WiredList caching strategy eviction process. + // Since the wired list can still have a reference to a + // DatabaseBlock for which the corresponding DatabaseSeries + // has been closed, its important that the ID itself is still + // available because the process of kicking a DatabaseBlock + // out of the WiredList requires the ID. + // + // Since series are purged so infrequently the overhead + // of not releasing back an ID to a pool is amortized over + // a long period of time. + // + // The same goes for the series tags. + s.Lock() + s.id = opts.ID + s.metadata = opts.Metadata + s.uniqueIndex = opts.UniqueIndex + s.cachedBlocks.Reset() + s.buffer.Reset(databaseBufferResetOptions{ + BlockRetriever: opts.BlockRetriever, + Options: opts.Options, + }) + s.opts = opts.Options + s.blockRetriever = opts.BlockRetriever + s.onRetrieveBlock = opts.OnRetrieveBlock + s.blockOnEvictedFromWiredList = opts.OnEvictedFromWiredList + s.Unlock() +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/series_mock.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/series_mock.go new file mode 100644 index 00000000..0050ae68 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/series_mock.go @@ -0,0 +1,442 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/storage/series (interfaces: DatabaseSeries,QueryableBlockRetriever) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package series is a generated GoMock package. +package series + +import ( + "reflect" + "time" + + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/persist" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + time0 "github.com/m3db/m3/src/x/time" + + "github.com/golang/mock/gomock" +) + +// MockDatabaseSeries is a mock of DatabaseSeries interface +type MockDatabaseSeries struct { + ctrl *gomock.Controller + recorder *MockDatabaseSeriesMockRecorder +} + +// MockDatabaseSeriesMockRecorder is the mock recorder for MockDatabaseSeries +type MockDatabaseSeriesMockRecorder struct { + mock *MockDatabaseSeries +} + +// NewMockDatabaseSeries creates a new mock instance +func NewMockDatabaseSeries(ctrl *gomock.Controller) *MockDatabaseSeries { + mock := &MockDatabaseSeries{ctrl: ctrl} + mock.recorder = &MockDatabaseSeriesMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDatabaseSeries) EXPECT() *MockDatabaseSeriesMockRecorder { + return m.recorder +} + +// Bootstrap mocks base method +func (m *MockDatabaseSeries) Bootstrap(arg0 namespace.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Bootstrap", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Bootstrap indicates an expected call of Bootstrap +func (mr *MockDatabaseSeriesMockRecorder) Bootstrap(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Bootstrap", reflect.TypeOf((*MockDatabaseSeries)(nil).Bootstrap), arg0) +} + +// Close mocks base method +func (m *MockDatabaseSeries) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockDatabaseSeriesMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockDatabaseSeries)(nil).Close)) +} + +// ColdFlushBlockStarts mocks base method +func (m *MockDatabaseSeries) ColdFlushBlockStarts(arg0 BootstrappedBlockStateSnapshot) OptimizedTimes { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ColdFlushBlockStarts", arg0) + ret0, _ := ret[0].(OptimizedTimes) + return ret0 +} + +// ColdFlushBlockStarts indicates an expected call of ColdFlushBlockStarts +func (mr *MockDatabaseSeriesMockRecorder) ColdFlushBlockStarts(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ColdFlushBlockStarts", reflect.TypeOf((*MockDatabaseSeries)(nil).ColdFlushBlockStarts), arg0) +} + +// FetchBlocks mocks base method +func (m *MockDatabaseSeries) FetchBlocks(arg0 context.Context, arg1 []time.Time, arg2 namespace.Context) ([]block.FetchBlockResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocks", arg0, arg1, arg2) + ret0, _ := ret[0].([]block.FetchBlockResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocks indicates an expected call of FetchBlocks +func (mr *MockDatabaseSeriesMockRecorder) FetchBlocks(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocks", reflect.TypeOf((*MockDatabaseSeries)(nil).FetchBlocks), arg0, arg1, arg2) +} + +// FetchBlocksForColdFlush mocks base method +func (m *MockDatabaseSeries) FetchBlocksForColdFlush(arg0 context.Context, arg1 time.Time, arg2 int, arg3 namespace.Context) (block.FetchBlockResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksForColdFlush", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(block.FetchBlockResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksForColdFlush indicates an expected call of FetchBlocksForColdFlush +func (mr *MockDatabaseSeriesMockRecorder) FetchBlocksForColdFlush(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksForColdFlush", reflect.TypeOf((*MockDatabaseSeries)(nil).FetchBlocksForColdFlush), arg0, arg1, arg2, arg3) +} + +// FetchBlocksMetadata mocks base method +func (m *MockDatabaseSeries) FetchBlocksMetadata(arg0 context.Context, arg1, arg2 time.Time, arg3 FetchBlocksMetadataOptions) (block.FetchBlocksMetadataResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FetchBlocksMetadata", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(block.FetchBlocksMetadataResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchBlocksMetadata indicates an expected call of FetchBlocksMetadata +func (mr *MockDatabaseSeriesMockRecorder) FetchBlocksMetadata(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchBlocksMetadata", reflect.TypeOf((*MockDatabaseSeries)(nil).FetchBlocksMetadata), arg0, arg1, arg2, arg3) +} + +// ID mocks base method +func (m *MockDatabaseSeries) ID() ident.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(ident.ID) + return ret0 +} + +// ID indicates an expected call of ID +func (mr *MockDatabaseSeriesMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockDatabaseSeries)(nil).ID)) +} + +// IsBufferEmptyAtBlockStart mocks base method +func (m *MockDatabaseSeries) IsBufferEmptyAtBlockStart(arg0 time.Time) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsBufferEmptyAtBlockStart", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsBufferEmptyAtBlockStart indicates an expected call of IsBufferEmptyAtBlockStart +func (mr *MockDatabaseSeriesMockRecorder) IsBufferEmptyAtBlockStart(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsBufferEmptyAtBlockStart", reflect.TypeOf((*MockDatabaseSeries)(nil).IsBufferEmptyAtBlockStart), arg0) +} + +// IsEmpty mocks base method +func (m *MockDatabaseSeries) IsEmpty() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsEmpty") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsEmpty indicates an expected call of IsEmpty +func (mr *MockDatabaseSeriesMockRecorder) IsEmpty() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsEmpty", reflect.TypeOf((*MockDatabaseSeries)(nil).IsEmpty)) +} + +// LoadBlock mocks base method +func (m *MockDatabaseSeries) LoadBlock(arg0 block.DatabaseBlock, arg1 WriteType) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LoadBlock", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// LoadBlock indicates an expected call of LoadBlock +func (mr *MockDatabaseSeriesMockRecorder) LoadBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LoadBlock", reflect.TypeOf((*MockDatabaseSeries)(nil).LoadBlock), arg0, arg1) +} + +// Metadata mocks base method +func (m *MockDatabaseSeries) Metadata() doc.Document { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Metadata") + ret0, _ := ret[0].(doc.Document) + return ret0 +} + +// Metadata indicates an expected call of Metadata +func (mr *MockDatabaseSeriesMockRecorder) Metadata() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Metadata", reflect.TypeOf((*MockDatabaseSeries)(nil).Metadata)) +} + +// NumActiveBlocks mocks base method +func (m *MockDatabaseSeries) NumActiveBlocks() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumActiveBlocks") + ret0, _ := ret[0].(int) + return ret0 +} + +// NumActiveBlocks indicates an expected call of NumActiveBlocks +func (mr *MockDatabaseSeriesMockRecorder) NumActiveBlocks() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumActiveBlocks", reflect.TypeOf((*MockDatabaseSeries)(nil).NumActiveBlocks)) +} + +// OnEvictedFromWiredList mocks base method +func (m *MockDatabaseSeries) OnEvictedFromWiredList(arg0 ident.ID, arg1 time.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnEvictedFromWiredList", arg0, arg1) +} + +// OnEvictedFromWiredList indicates an expected call of OnEvictedFromWiredList +func (mr *MockDatabaseSeriesMockRecorder) OnEvictedFromWiredList(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnEvictedFromWiredList", reflect.TypeOf((*MockDatabaseSeries)(nil).OnEvictedFromWiredList), arg0, arg1) +} + +// OnRetrieveBlock mocks base method +func (m *MockDatabaseSeries) OnRetrieveBlock(arg0 ident.ID, arg1 ident.TagIterator, arg2 time.Time, arg3 ts.Segment, arg4 namespace.Context) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnRetrieveBlock", arg0, arg1, arg2, arg3, arg4) +} + +// OnRetrieveBlock indicates an expected call of OnRetrieveBlock +func (mr *MockDatabaseSeriesMockRecorder) OnRetrieveBlock(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnRetrieveBlock", reflect.TypeOf((*MockDatabaseSeries)(nil).OnRetrieveBlock), arg0, arg1, arg2, arg3, arg4) +} + +// ReadEncoded mocks base method +func (m *MockDatabaseSeries) ReadEncoded(arg0 context.Context, arg1, arg2 time.Time, arg3 namespace.Context) ([][]xio.BlockReader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadEncoded", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([][]xio.BlockReader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadEncoded indicates an expected call of ReadEncoded +func (mr *MockDatabaseSeriesMockRecorder) ReadEncoded(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadEncoded", reflect.TypeOf((*MockDatabaseSeries)(nil).ReadEncoded), arg0, arg1, arg2, arg3) +} + +// Reset mocks base method +func (m *MockDatabaseSeries) Reset(arg0 DatabaseSeriesOptions) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", arg0) +} + +// Reset indicates an expected call of Reset +func (mr *MockDatabaseSeriesMockRecorder) Reset(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockDatabaseSeries)(nil).Reset), arg0) +} + +// Snapshot mocks base method +func (m *MockDatabaseSeries) Snapshot(arg0 context.Context, arg1 time.Time, arg2 persist.DataFn, arg3 namespace.Context) (SnapshotResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Snapshot", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(SnapshotResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Snapshot indicates an expected call of Snapshot +func (mr *MockDatabaseSeriesMockRecorder) Snapshot(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Snapshot", reflect.TypeOf((*MockDatabaseSeries)(nil).Snapshot), arg0, arg1, arg2, arg3) +} + +// Tick mocks base method +func (m *MockDatabaseSeries) Tick(arg0 ShardBlockStateSnapshot, arg1 namespace.Context) (TickResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Tick", arg0, arg1) + ret0, _ := ret[0].(TickResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Tick indicates an expected call of Tick +func (mr *MockDatabaseSeriesMockRecorder) Tick(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Tick", reflect.TypeOf((*MockDatabaseSeries)(nil).Tick), arg0, arg1) +} + +// UniqueIndex mocks base method +func (m *MockDatabaseSeries) UniqueIndex() uint64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UniqueIndex") + ret0, _ := ret[0].(uint64) + return ret0 +} + +// UniqueIndex indicates an expected call of UniqueIndex +func (mr *MockDatabaseSeriesMockRecorder) UniqueIndex() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UniqueIndex", reflect.TypeOf((*MockDatabaseSeries)(nil).UniqueIndex)) +} + +// WarmFlush mocks base method +func (m *MockDatabaseSeries) WarmFlush(arg0 context.Context, arg1 time.Time, arg2 persist.DataFn, arg3 namespace.Context) (FlushOutcome, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WarmFlush", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(FlushOutcome) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WarmFlush indicates an expected call of WarmFlush +func (mr *MockDatabaseSeriesMockRecorder) WarmFlush(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WarmFlush", reflect.TypeOf((*MockDatabaseSeries)(nil).WarmFlush), arg0, arg1, arg2, arg3) +} + +// Write mocks base method +func (m *MockDatabaseSeries) Write(arg0 context.Context, arg1 time.Time, arg2 float64, arg3 time0.Unit, arg4 []byte, arg5 WriteOptions) (bool, WriteType, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Write", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(WriteType) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Write indicates an expected call of Write +func (mr *MockDatabaseSeriesMockRecorder) Write(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockDatabaseSeries)(nil).Write), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// MockQueryableBlockRetriever is a mock of QueryableBlockRetriever interface +type MockQueryableBlockRetriever struct { + ctrl *gomock.Controller + recorder *MockQueryableBlockRetrieverMockRecorder +} + +// MockQueryableBlockRetrieverMockRecorder is the mock recorder for MockQueryableBlockRetriever +type MockQueryableBlockRetrieverMockRecorder struct { + mock *MockQueryableBlockRetriever +} + +// NewMockQueryableBlockRetriever creates a new mock instance +func NewMockQueryableBlockRetriever(ctrl *gomock.Controller) *MockQueryableBlockRetriever { + mock := &MockQueryableBlockRetriever{ctrl: ctrl} + mock.recorder = &MockQueryableBlockRetrieverMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockQueryableBlockRetriever) EXPECT() *MockQueryableBlockRetrieverMockRecorder { + return m.recorder +} + +// BlockStatesSnapshot mocks base method +func (m *MockQueryableBlockRetriever) BlockStatesSnapshot() ShardBlockStateSnapshot { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockStatesSnapshot") + ret0, _ := ret[0].(ShardBlockStateSnapshot) + return ret0 +} + +// BlockStatesSnapshot indicates an expected call of BlockStatesSnapshot +func (mr *MockQueryableBlockRetrieverMockRecorder) BlockStatesSnapshot() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockStatesSnapshot", reflect.TypeOf((*MockQueryableBlockRetriever)(nil).BlockStatesSnapshot)) +} + +// IsBlockRetrievable mocks base method +func (m *MockQueryableBlockRetriever) IsBlockRetrievable(arg0 time.Time) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsBlockRetrievable", arg0) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IsBlockRetrievable indicates an expected call of IsBlockRetrievable +func (mr *MockQueryableBlockRetrieverMockRecorder) IsBlockRetrievable(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsBlockRetrievable", reflect.TypeOf((*MockQueryableBlockRetriever)(nil).IsBlockRetrievable), arg0) +} + +// RetrievableBlockColdVersion mocks base method +func (m *MockQueryableBlockRetriever) RetrievableBlockColdVersion(arg0 time.Time) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RetrievableBlockColdVersion", arg0) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RetrievableBlockColdVersion indicates an expected call of RetrievableBlockColdVersion +func (mr *MockQueryableBlockRetrieverMockRecorder) RetrievableBlockColdVersion(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RetrievableBlockColdVersion", reflect.TypeOf((*MockQueryableBlockRetriever)(nil).RetrievableBlockColdVersion), arg0) +} + +// Stream mocks base method +func (m *MockQueryableBlockRetriever) Stream(arg0 context.Context, arg1 ident.ID, arg2 time.Time, arg3 block.OnRetrieveBlock, arg4 namespace.Context) (xio.BlockReader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stream", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(xio.BlockReader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Stream indicates an expected call of Stream +func (mr *MockQueryableBlockRetrieverMockRecorder) Stream(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stream", reflect.TypeOf((*MockQueryableBlockRetriever)(nil).Stream), arg0, arg1, arg2, arg3, arg4) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/series_pool.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/series_pool.go new file mode 100644 index 00000000..d658f58d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/series_pool.go @@ -0,0 +1,44 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package series + +import "github.com/m3db/m3/src/x/pool" + +type databaseSeriesPool struct { + pool pool.ObjectPool +} + +// NewDatabaseSeriesPool creates a new database series pool +func NewDatabaseSeriesPool(opts pool.ObjectPoolOptions) DatabaseSeriesPool { + p := &databaseSeriesPool{pool: pool.NewObjectPool(opts)} + p.pool.Init(func() interface{} { + return newPooledDatabaseSeries(p) + }) + return p +} + +func (p *databaseSeriesPool) Get() DatabaseSeries { + return p.pool.Get().(DatabaseSeries) +} + +func (p *databaseSeriesPool) Put(series DatabaseSeries) { + p.pool.Put(series) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/truncate_type.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/truncate_type.go new file mode 100644 index 00000000..ee256128 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/truncate_type.go @@ -0,0 +1,82 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package series + +import ( + "fmt" +) + +// TruncateType determines the scheme for truncating transforms. +type TruncateType uint8 + +const ( + // TypeNone indicates that no truncation occurs. + TypeNone TruncateType = iota + + // TypeBlock truncates incoming writes to the block boundary immediately + // preceding this point's timestamp. + TypeBlock +) + +var validTruncationTypes = []TruncateType{ + TypeNone, + TypeBlock, +} + +// Validate validates that the scheme type is valid. +func (t TruncateType) Validate() error { + if t >= TypeNone && t <= TypeBlock { + return nil + } + + return fmt.Errorf("invalid truncation type: '%v' valid types are: %v", + t, validTruncationTypes) +} + +func (t TruncateType) String() string { + switch t { + case TypeNone: + return "none" + case TypeBlock: + return "block" + default: + // Should never get here. + return "unknown" + } +} + +// UnmarshalYAML unmarshals a stored truncation type. +func (t *TruncateType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + + for _, valid := range validTruncationTypes { + if str == valid.String() { + *t = valid + return nil + } + } + + *t = TypeNone + return nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/types.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/types.go new file mode 100644 index 00000000..17f1f829 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/types.go @@ -0,0 +1,478 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package series + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/clock" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/namespace" + "github.com/m3db/m3/src/dbnode/persist" + "github.com/m3db/m3/src/dbnode/retention" + "github.com/m3db/m3/src/dbnode/runtime" + "github.com/m3db/m3/src/dbnode/storage/block" + "github.com/m3db/m3/src/dbnode/x/xio" + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + xtime "github.com/m3db/m3/src/x/time" + + "github.com/uber-go/tally" +) + +// DatabaseSeriesOptions is a set of options for creating a database series. +type DatabaseSeriesOptions struct { + ID ident.ID + Metadata doc.Document + UniqueIndex uint64 + BlockRetriever QueryableBlockRetriever + OnRetrieveBlock block.OnRetrieveBlock + OnEvictedFromWiredList block.OnEvictedFromWiredList + Options Options +} + +// DatabaseSeries is a series in the database. +type DatabaseSeries interface { + block.OnRetrieveBlock + block.OnEvictedFromWiredList + + // ID returns the ID of the series. + ID() ident.ID + + // Metadata returns the metadata of the series. + Metadata() doc.Document + + // UniqueIndex is the unique index for the series (for this current + // process, unless the time series expires). + UniqueIndex() uint64 + + // Tick executes async updates + Tick(blockStates ShardBlockStateSnapshot, nsCtx namespace.Context) (TickResult, error) + + // Write writes a new value. + Write( + ctx context.Context, + timestamp time.Time, + value float64, + unit xtime.Unit, + annotation []byte, + wOpts WriteOptions, + ) (bool, WriteType, error) + + // ReadEncoded reads encoded blocks. + ReadEncoded( + ctx context.Context, + start, end time.Time, + nsCtx namespace.Context, + ) ([][]xio.BlockReader, error) + + // FetchBlocks returns data blocks given a list of block start times. + FetchBlocks( + ctx context.Context, + starts []time.Time, + nsCtx namespace.Context, + ) ([]block.FetchBlockResult, error) + + // FetchBlocksForColdFlush fetches blocks for a cold flush. This function + // informs the series and the buffer that a cold flush for the specified + // block start is occurring so that it knows to update bucket versions. + FetchBlocksForColdFlush( + ctx context.Context, + start time.Time, + version int, + nsCtx namespace.Context, + ) (block.FetchBlockResult, error) + + // FetchBlocksMetadata returns the blocks metadata. + FetchBlocksMetadata( + ctx context.Context, + start, end time.Time, + opts FetchBlocksMetadataOptions, + ) (block.FetchBlocksMetadataResult, error) + + // IsEmpty returns whether series is empty (includes both cached blocks and in-mem buffer data). + IsEmpty() bool + + // IsBufferEmptyAtBlockStart returns whether the series buffer is empty at block start + // (only checks for in-mem buffer data). + IsBufferEmptyAtBlockStart(time.Time) bool + + // NumActiveBlocks returns the number of active blocks the series currently holds. + NumActiveBlocks() int + + /// LoadBlock loads a single block into the series. + LoadBlock( + block block.DatabaseBlock, + writeType WriteType, + ) error + + // WarmFlush flushes the WarmWrites of this series for a given start time. + WarmFlush( + ctx context.Context, + blockStart time.Time, + persistFn persist.DataFn, + nsCtx namespace.Context, + ) (FlushOutcome, error) + + // Snapshot snapshots the buffer buckets of this series for any data that has + // not been rotated into a block yet. + Snapshot( + ctx context.Context, + blockStart time.Time, + persistFn persist.DataFn, + nsCtx namespace.Context, + ) (SnapshotResult, error) + + // ColdFlushBlockStarts returns the block starts that need cold flushes. + ColdFlushBlockStarts(blockStates BootstrappedBlockStateSnapshot) OptimizedTimes + + // Bootstrap will moved any bootstrapped data to buffer so series + // is ready for reading. + Bootstrap(nsCtx namespace.Context) error + + // Close will close the series and if pooled returned to the pool. + Close() + + // Reset resets the series for reuse. + Reset(opts DatabaseSeriesOptions) +} + +// SnapshotResult contains metadata regarding the snapshot. +type SnapshotResult struct { + Persist bool + Stats SnapshotResultStats +} + +// SnapshotResultStats contains stats regarding the snapshot. +type SnapshotResultStats struct { + TimeMergeByBucket time.Duration + TimeMergeAcrossBuckets time.Duration + TimeChecksum time.Duration + TimePersist time.Duration +} + +// Add adds the result of a snapshot result to this result. +func (r *SnapshotResultStats) Add(other SnapshotResultStats) { + r.TimeMergeByBucket += other.TimeMergeByBucket + r.TimeMergeAcrossBuckets += other.TimeMergeAcrossBuckets + r.TimeChecksum += other.TimeChecksum + r.TimePersist += other.TimePersist +} + +// FetchBlocksMetadataOptions encapsulates block fetch metadata options +// and specifies a few series specific options too. +type FetchBlocksMetadataOptions struct { + block.FetchBlocksMetadataOptions +} + +// QueryableBlockRetriever is a block retriever that can tell if a block +// is retrievable or not for a given start time. +type QueryableBlockRetriever interface { + block.DatabaseShardBlockRetriever + + // IsBlockRetrievable returns whether a block is retrievable + // for a given block start time. + IsBlockRetrievable(blockStart time.Time) (bool, error) + + // RetrievableBlockColdVersion returns the cold version that was + // successfully persisted. + RetrievableBlockColdVersion(blockStart time.Time) (int, error) + + // BlockStatesSnapshot returns a snapshot of the whether blocks are + // retrievable and their flush versions for each block start. This is used + // to reduce lock contention of acquiring flush state. + // + // Flushes may occur and change the actual block state while iterating + // through this snapshot, so any logic using this function should take this + // into account. + BlockStatesSnapshot() ShardBlockStateSnapshot +} + +// ShardBlockStateSnapshot represents a snapshot of a shard's block state at +// a moment in time. +type ShardBlockStateSnapshot struct { + bootstrapped bool + snapshot BootstrappedBlockStateSnapshot +} + +// NewShardBlockStateSnapshot constructs a new NewShardBlockStateSnapshot. +func NewShardBlockStateSnapshot( + bootstrapped bool, + snapshot BootstrappedBlockStateSnapshot, +) ShardBlockStateSnapshot { + return ShardBlockStateSnapshot{ + bootstrapped: bootstrapped, + snapshot: snapshot, + } +} + +// UnwrapValue returns a BootstrappedBlockStateSnapshot and a boolean indicating whether the +// snapshot is bootstrapped or not. +func (s ShardBlockStateSnapshot) UnwrapValue() (BootstrappedBlockStateSnapshot, bool) { + return s.snapshot, s.bootstrapped +} + +// BootstrappedBlockStateSnapshot represents a bootstrapped shard block state snapshot. +type BootstrappedBlockStateSnapshot struct { + Snapshot map[xtime.UnixNano]BlockState +} + +// BlockState contains the state of a block. +type BlockState struct { + WarmRetrievable bool + ColdVersion int +} + +// TickStatus is the status of a series for a given tick. +type TickStatus struct { + // ActiveBlocks is the number of total active blocks. + ActiveBlocks int + // WiredBlocks is the number of blocks wired in memory (all data kept) + WiredBlocks int + // UnwiredBlocks is the number of blocks unwired (data kept on disk). + UnwiredBlocks int + // PendingMergeBlocks is the number of blocks pending merges. + PendingMergeBlocks int +} + +// TickResult is a set of results from a tick. +type TickResult struct { + TickStatus + // MadeExpiredBlocks is count of blocks just expired. + MadeExpiredBlocks int + // MadeUnwiredBlocks is count of blocks just unwired from memory. + MadeUnwiredBlocks int + // MergedOutOfOrderBlocks is count of blocks merged from out of order streams. + MergedOutOfOrderBlocks int + // EvictedBuckets is count of buckets just evicted from the buffer map. + EvictedBuckets int +} + +// DatabaseSeriesAllocate allocates a database series for a pool. +type DatabaseSeriesAllocate func() DatabaseSeries + +// DatabaseSeriesPool provides a pool for database series. +type DatabaseSeriesPool interface { + // Get provides a database series from the pool. + Get() DatabaseSeries + + // Put returns a database series to the pool. + Put(block DatabaseSeries) +} + +// FlushOutcome is an enum that provides more context about the outcome +// of series.WarmFlush() to the caller. +type FlushOutcome int + +const ( + // FlushOutcomeErr is just a default value that can be returned when we're + // also returning an error. + FlushOutcomeErr FlushOutcome = iota + // FlushOutcomeBlockDoesNotExist indicates that the series did not have a + // block for the specified flush blockStart. + FlushOutcomeBlockDoesNotExist + // FlushOutcomeFlushedToDisk indicates that a block existed and was flushed + // to disk successfully. + FlushOutcomeFlushedToDisk +) + +// Options represents the options for series +type Options interface { + // Validate validates the options + Validate() error + + // SetClockOptions sets the clock options + SetClockOptions(value clock.Options) Options + + // ClockOptions returns the clock options + ClockOptions() clock.Options + + // SetInstrumentOptions sets the instrumentation options + SetInstrumentOptions(value instrument.Options) Options + + // InstrumentOptions returns the instrumentation options + InstrumentOptions() instrument.Options + + // SetRetentionOptions sets the retention options + SetRetentionOptions(value retention.Options) Options + + // RetentionOptions returns the retention options + RetentionOptions() retention.Options + + // SetDatabaseBlockOptions sets the database block options + SetDatabaseBlockOptions(value block.Options) Options + + // DatabaseBlockOptions returns the database block options + DatabaseBlockOptions() block.Options + + // SetCachePolicy sets the series cache policy + SetCachePolicy(value CachePolicy) Options + + // CachePolicy returns the series cache policy + CachePolicy() CachePolicy + + // SetContextPool sets the contextPool + SetContextPool(value context.Pool) Options + + // ContextPool returns the contextPool + ContextPool() context.Pool + + // SetEncoderPool sets the contextPool + SetEncoderPool(value encoding.EncoderPool) Options + + // EncoderPool returns the contextPool + EncoderPool() encoding.EncoderPool + + // SetMultiReaderIteratorPool sets the multiReaderIteratorPool + SetMultiReaderIteratorPool(value encoding.MultiReaderIteratorPool) Options + + // MultiReaderIteratorPool returns the multiReaderIteratorPool + MultiReaderIteratorPool() encoding.MultiReaderIteratorPool + + // SetFetchBlockMetadataResultsPool sets the fetchBlockMetadataResultsPool + SetFetchBlockMetadataResultsPool(value block.FetchBlockMetadataResultsPool) Options + + // FetchBlockMetadataResultsPool returns the fetchBlockMetadataResultsPool + FetchBlockMetadataResultsPool() block.FetchBlockMetadataResultsPool + + // SetIdentifierPool sets the identifierPool + SetIdentifierPool(value ident.Pool) Options + + // IdentifierPool returns the identifierPool + IdentifierPool() ident.Pool + + // SetStats sets the configured Stats. + SetStats(value Stats) Options + + // Stats returns the configured Stats. + Stats() Stats + + // SetColdWritesEnabled sets whether cold writes are enabled. + SetColdWritesEnabled(value bool) Options + + // ColdWritesEnabled returns whether cold writes are enabled. + ColdWritesEnabled() bool + + // SetBufferBucketVersionsPool sets the BufferBucketVersionsPool. + SetBufferBucketVersionsPool(value *BufferBucketVersionsPool) Options + + // BufferBucketVersionsPool returns the BufferBucketVersionsPool. + BufferBucketVersionsPool() *BufferBucketVersionsPool + + // SetBufferBucketPool sets the BufferBucketPool. + SetBufferBucketPool(value *BufferBucketPool) Options + + // BufferBucketPool returns the BufferBucketPool. + BufferBucketPool() *BufferBucketPool + + // SetRuntimeOptionsManager sets the runtime options manager. + SetRuntimeOptionsManager(value runtime.OptionsManager) Options + + // RuntimeOptionsManager returns the runtime options manager. + RuntimeOptionsManager() runtime.OptionsManager +} + +// Stats is passed down from namespace/shard to avoid allocations per series. +type Stats struct { + encoderCreated tally.Counter + coldWrites tally.Counter + encodersPerBlock tally.Histogram + encoderLimitWriteRejected tally.Counter + snapshotMergesEachBucket tally.Counter +} + +// NewStats returns a new Stats for the provided scope. +func NewStats(scope tally.Scope) Stats { + subScope := scope.SubScope("series") + + buckets := append(tally.ValueBuckets{0}, + tally.MustMakeExponentialValueBuckets(1, 2, 20)...) + return Stats{ + encoderCreated: subScope.Counter("encoder-created"), + coldWrites: subScope.Counter("cold-writes"), + encodersPerBlock: subScope.Histogram("encoders-per-block", buckets), + encoderLimitWriteRejected: subScope.Counter("encoder-limit-write-rejected"), + snapshotMergesEachBucket: subScope.Counter("snapshot-merges-each-bucket"), + } +} + +// IncCreatedEncoders incs the EncoderCreated stat. +func (s Stats) IncCreatedEncoders() { + s.encoderCreated.Inc(1) +} + +// IncColdWrites incs the ColdWrites stat. +func (s Stats) IncColdWrites() { + s.coldWrites.Inc(1) +} + +// RecordEncodersPerBlock records the number of encoders histogram. +func (s Stats) RecordEncodersPerBlock(num int) { + s.encodersPerBlock.RecordValue(float64(num)) +} + +// IncEncoderLimitWriteRejected incs the encoderLimitWriteRejected stat. +func (s Stats) IncEncoderLimitWriteRejected() { + s.encoderLimitWriteRejected.Inc(1) +} + +// WriteType is an enum for warm/cold write types. +type WriteType int + +const ( + // WarmWrite represents warm writes (within the buffer past/future window). + WarmWrite WriteType = iota + + // ColdWrite represents cold writes (outside the buffer past/future window). + ColdWrite +) + +// WriteTransformOptions describes transforms to run on incoming writes. +type WriteTransformOptions struct { + // ForceValueEnabled indicates if the values for incoming writes + // should be forced to `ForceValue`. + ForceValueEnabled bool + // ForceValue is the value that incoming writes should be forced to. + ForceValue float64 +} + +// WriteOptions provides a set of options for a write. +type WriteOptions struct { + // SchemaDesc is the schema description. + SchemaDesc namespace.SchemaDescr + // TruncateType is the truncation type for incoming writes. + TruncateType TruncateType + // TransformOptions describes transformation options for incoming writes. + TransformOptions WriteTransformOptions + // BootstrapWrite allows a warm write outside the time window as long as the + // block hasn't already been flushed to disk. This is useful for + // bootstrappers filling data that they know has not yet been flushed to + // disk. + BootstrapWrite bool + // SkipOutOfRetention allows for skipping writes that are out of retention + // by just returning success, this allows for callers to not have to + // deal with clock skew when they are trying to write a value that may not + // fall into retention but they do not care if it fails to write due to + // it just having fallen out of retention (time race). + SkipOutOfRetention bool +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/storage/series/util.go b/vendor/github.com/m3db/m3/src/dbnode/storage/series/util.go new file mode 100644 index 00000000..785f3de7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/storage/series/util.go @@ -0,0 +1,94 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package series + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/dbnode/x/xio" + xtime "github.com/m3db/m3/src/x/time" + + "github.com/m3db/m3/src/dbnode/namespace" +) + +// ValuesByTime is a sortable slice of DecodedTestValue. +type ValuesByTime []DecodedTestValue + +// Len is the number of elements in the collection. +func (v ValuesByTime) Len() int { + return len(v) +} + +// Less reports whether the element with +// index i should sort before the element with index j. +func (v ValuesByTime) Less(lhs, rhs int) bool { + l := v[lhs].Timestamp + r := v[rhs].Timestamp + if l.Equal(r) { + return v[lhs].Value-v[rhs].Value < 0 + } + + return l.Before(r) +} + +// Swap swaps the elements with indexes i and j. +func (v ValuesByTime) Swap(lhs, rhs int) { + v[lhs], v[rhs] = v[rhs], v[lhs] +} + +// DecodedTestValue is a decoded datapoint. +type DecodedTestValue struct { + // Timestamp is the data point timestamp. + Timestamp time.Time + // Value is the data point value. + Value float64 + // Unit is the data point unit. + Unit xtime.Unit + // Annotation is the data point annotation. + Annotation []byte +} + +// DecodeSegmentValues is a test utility to read through a slice of +// SegmentReaders. +func DecodeSegmentValues( + results []xio.SegmentReader, + iter encoding.MultiReaderIterator, + schema namespace.SchemaDescr, +) ([]DecodedTestValue, error) { + iter.Reset(results, time.Time{}, time.Duration(0), schema) + defer iter.Close() + + var all []DecodedTestValue + for iter.Next() { + dp, unit, annotation := iter.Current() + // Iterator reuse annotation byte slices, so make a copy. + annotationCopy := append([]byte(nil), annotation...) + all = append(all, DecodedTestValue{ + dp.Timestamp, dp.Value, unit, annotationCopy}) + } + + if err := iter.Err(); err != nil { + return nil, err + } + + return all, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/topology/consistency_level.go b/vendor/github.com/m3db/m3/src/dbnode/topology/consistency_level.go new file mode 100644 index 00000000..64dd50b3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/topology/consistency_level.go @@ -0,0 +1,400 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package topology + +import ( + "errors" + "fmt" + "strings" +) + +// ConsistencyLevel is the consistency level for cluster operations +type ConsistencyLevel int + +// nolint: varcheck, unused +const ( + consistencyLevelNone ConsistencyLevel = iota + + // ConsistencyLevelOne corresponds to a single node participating + // for an operation to succeed + ConsistencyLevelOne + + // ConsistencyLevelMajority corresponds to the majority of nodes participating + // for an operation to succeed + ConsistencyLevelMajority + + // ConsistencyLevelAll corresponds to all nodes participating + // for an operation to succeed + ConsistencyLevelAll +) + +// String returns the consistency level as a string +func (l ConsistencyLevel) String() string { + switch l { + case consistencyLevelNone: + return none + case ConsistencyLevelOne: + return one + case ConsistencyLevelMajority: + return majority + case ConsistencyLevelAll: + return all + } + return unknown +} + +var validConsistencyLevels = []ConsistencyLevel{ + consistencyLevelNone, + ConsistencyLevelOne, + ConsistencyLevelMajority, + ConsistencyLevelAll, +} + +var ( + errConsistencyLevelUnspecified = errors.New("consistency level not specified") + errConsistencyLevelInvalid = errors.New("consistency level invalid") +) + +// ValidConsistencyLevels returns a copy of valid consistency levels +// to avoid callers mutating the set of valid read consistency levels +func ValidConsistencyLevels() []ConsistencyLevel { + result := make([]ConsistencyLevel, len(validConsistencyLevels)) + copy(result, validConsistencyLevels) + return result +} + +// ValidateConsistencyLevel returns nil when consistency level is valid, +// otherwise it returns an error +func ValidateConsistencyLevel(v ConsistencyLevel) error { + for _, level := range validConsistencyLevels { + if level == v { + return nil + } + } + return errConsistencyLevelInvalid +} + +// UnmarshalYAML unmarshals an ConnectConsistencyLevel into a valid type from string. +func (l *ConsistencyLevel) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + if str == "" { + return errConsistencyLevelUnspecified + } + strs := make([]string, 0, len(validConsistencyLevels)) + for _, valid := range validConsistencyLevels { + if str == valid.String() { + *l = valid + return nil + } + strs = append(strs, "'"+valid.String()+"'") + } + return fmt.Errorf("invalid ConsistencyLevel '%s' valid types are: %s", + str, strings.Join(strs, ", ")) +} + +// ConnectConsistencyLevel is the consistency level for connecting to a cluster +type ConnectConsistencyLevel int + +const ( + // ConnectConsistencyLevelAny corresponds to connecting to any number of nodes for a given shard + // set, this strategy will attempt to connect to all, then the majority, then one and then none. + ConnectConsistencyLevelAny ConnectConsistencyLevel = iota + + // ConnectConsistencyLevelNone corresponds to connecting to no nodes for a given shard set + ConnectConsistencyLevelNone + + // ConnectConsistencyLevelOne corresponds to connecting to a single node for a given shard set + ConnectConsistencyLevelOne + + // ConnectConsistencyLevelMajority corresponds to connecting to the majority of nodes for a given shard set + ConnectConsistencyLevelMajority + + // ConnectConsistencyLevelAll corresponds to connecting to all of the nodes for a given shard set + ConnectConsistencyLevelAll +) + +// String returns the consistency level as a string +func (l ConnectConsistencyLevel) String() string { + switch l { + case ConnectConsistencyLevelAny: + return any + case ConnectConsistencyLevelNone: + return none + case ConnectConsistencyLevelOne: + return one + case ConnectConsistencyLevelMajority: + return majority + case ConnectConsistencyLevelAll: + return all + } + return unknown +} + +var validConnectConsistencyLevels = []ConnectConsistencyLevel{ + ConnectConsistencyLevelAny, + ConnectConsistencyLevelNone, + ConnectConsistencyLevelOne, + ConnectConsistencyLevelMajority, + ConnectConsistencyLevelAll, +} + +var ( + errClusterConnectConsistencyLevelUnspecified = errors.New("cluster connect consistency level not specified") + errClusterConnectConsistencyLevelInvalid = errors.New("cluster connect consistency level invalid") +) + +// ValidConnectConsistencyLevels returns a copy of valid consistency levels +// to avoid callers mutating the set of valid read consistency levels +func ValidConnectConsistencyLevels() []ConnectConsistencyLevel { + result := make([]ConnectConsistencyLevel, len(validConnectConsistencyLevels)) + copy(result, validConnectConsistencyLevels) + return result +} + +// ValidateConnectConsistencyLevel returns nil when consistency level is valid, +// otherwise it returns an error +func ValidateConnectConsistencyLevel(v ConnectConsistencyLevel) error { + for _, level := range validConnectConsistencyLevels { + if level == v { + return nil + } + } + return errClusterConnectConsistencyLevelInvalid +} + +// UnmarshalYAML unmarshals an ConnectConsistencyLevel into a valid type from string. +func (l *ConnectConsistencyLevel) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + if str == "" { + return errClusterConnectConsistencyLevelUnspecified + } + strs := make([]string, 0, len(validConnectConsistencyLevels)) + for _, valid := range validConnectConsistencyLevels { + if str == valid.String() { + *l = valid + return nil + } + strs = append(strs, "'"+valid.String()+"'") + } + return fmt.Errorf("invalid ConnectConsistencyLevel '%s' valid types are: %s", + str, strings.Join(strs, ", ")) +} + +// ReadConsistencyLevel is the consistency level for reading from a cluster +type ReadConsistencyLevel int + +const ( + // ReadConsistencyLevelNone corresponds to reading from no nodes + ReadConsistencyLevelNone ReadConsistencyLevel = iota + + // ReadConsistencyLevelOne corresponds to reading from a single node + ReadConsistencyLevelOne + + // ReadConsistencyLevelUnstrictMajority corresponds to reading from the majority of nodes + // but relaxing the constraint when it cannot be met, falling back to returning success when + // reading from at least a single node after attempting reading from the majority of nodes + ReadConsistencyLevelUnstrictMajority + + // ReadConsistencyLevelMajority corresponds to reading from the majority of nodes + ReadConsistencyLevelMajority + + // ReadConsistencyLevelUnstrictAll corresponds to reading from all nodes + // but relaxing the constraint when it cannot be met, falling back to returning success when + // reading from at least a single node after attempting reading from all of nodes + ReadConsistencyLevelUnstrictAll + + // ReadConsistencyLevelAll corresponds to reading from all of the nodes + ReadConsistencyLevelAll +) + +// String returns the consistency level as a string +func (l ReadConsistencyLevel) String() string { + switch l { + case ReadConsistencyLevelNone: + return none + case ReadConsistencyLevelOne: + return one + case ReadConsistencyLevelUnstrictMajority: + return unstrictMajority + case ReadConsistencyLevelMajority: + return majority + case ReadConsistencyLevelUnstrictAll: + return unstrictAll + case ReadConsistencyLevelAll: + return all + } + return unknown +} + +var validReadConsistencyLevels = []ReadConsistencyLevel{ + ReadConsistencyLevelNone, + ReadConsistencyLevelOne, + ReadConsistencyLevelUnstrictMajority, + ReadConsistencyLevelMajority, + ReadConsistencyLevelUnstrictAll, + ReadConsistencyLevelAll, +} + +var ( + errReadConsistencyLevelUnspecified = errors.New("read consistency level not specified") + errReadConsistencyLevelInvalid = errors.New("read consistency level invalid") +) + +// ValidReadConsistencyLevels returns a copy of valid consistency levels +// to avoid callers mutating the set of valid read consistency levels +func ValidReadConsistencyLevels() []ReadConsistencyLevel { + result := make([]ReadConsistencyLevel, len(validReadConsistencyLevels)) + copy(result, validReadConsistencyLevels) + return result +} + +// ValidateReadConsistencyLevel returns nil when consistency level is valid, +// otherwise it returns an error +func ValidateReadConsistencyLevel(v ReadConsistencyLevel) error { + for _, level := range validReadConsistencyLevels { + if level == v { + return nil + } + } + return errReadConsistencyLevelInvalid +} + +// UnmarshalYAML unmarshals an ConnectConsistencyLevel into a valid type from string. +func (l *ReadConsistencyLevel) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + if str == "" { + return errReadConsistencyLevelUnspecified + } + strs := make([]string, 0, len(validReadConsistencyLevels)) + for _, valid := range validReadConsistencyLevels { + if str == valid.String() { + *l = valid + return nil + } + strs = append(strs, "'"+valid.String()+"'") + } + return fmt.Errorf("invalid ReadConsistencyLevel '%s' valid types are: %s", + str, strings.Join(strs, ", ")) +} + +// string constants, required to fix lint complaining about +// multiple occurrences of same literal string... +const ( + unknown = "unknown" + any = "any" + all = "all" + unstrictAll = "unstrict_all" + one = "one" + none = "none" + majority = "majority" + unstrictMajority = "unstrict_majority" +) + +// WriteConsistencyAchieved returns a bool indicating whether or not we've received enough +// successful acks to consider a write successful based on the specified consistency level. +func WriteConsistencyAchieved( + level ConsistencyLevel, + majority, numPeers, numSuccess int, +) bool { + switch level { + case ConsistencyLevelAll: + if numSuccess == numPeers { // Meets all + return true + } + return false + case ConsistencyLevelMajority: + if numSuccess >= majority { // Meets majority + return true + } + return false + case ConsistencyLevelOne: + if numSuccess > 0 { // Meets one + return true + } + return false + } + panic(fmt.Errorf("unrecognized consistency level: %s", level.String())) +} + +// ReadConsistencyTermination returns a bool to indicate whether sufficient +// responses (error/success) have been received, so that we're able to decide +// whether we will be able to satisfy the reuquest or not. +// NB: it is not the same as `readConsistencyAchieved`. +func ReadConsistencyTermination( + level ReadConsistencyLevel, + majority, remaining, success int32, +) bool { + doneAll := remaining == 0 + switch level { + case ReadConsistencyLevelOne, ReadConsistencyLevelNone: + return success > 0 || doneAll + case ReadConsistencyLevelMajority, ReadConsistencyLevelUnstrictMajority: + return success >= majority || doneAll + case ReadConsistencyLevelAll, ReadConsistencyLevelUnstrictAll: + return doneAll + } + panic(fmt.Errorf("unrecognized consistency level: %s", level.String())) +} + +// ReadConsistencyAchieved returns whether sufficient responses have been received +// to reach the desired consistency. +// NB: it is not the same as `readConsistencyTermination`. +func ReadConsistencyAchieved( + level ReadConsistencyLevel, + majority, numPeers, numSuccess int, +) bool { + switch level { + case ReadConsistencyLevelAll: + return numSuccess == numPeers // Meets all + case ReadConsistencyLevelMajority: + return numSuccess >= majority // Meets majority + case ReadConsistencyLevelOne, ReadConsistencyLevelUnstrictMajority, ReadConsistencyLevelUnstrictAll: + return numSuccess > 0 // Meets one + case ReadConsistencyLevelNone: + return true // Always meets none + } + panic(fmt.Errorf("unrecognized consistency level: %s", level.String())) +} + +// NumDesiredForReadConsistency returns the number of replicas that would ideally be used to +// satisfy the read consistency. +func NumDesiredForReadConsistency(level ReadConsistencyLevel, numReplicas, majority int) int { + switch level { + case ReadConsistencyLevelAll, ReadConsistencyLevelUnstrictAll: + return numReplicas + case ReadConsistencyLevelMajority, ReadConsistencyLevelUnstrictMajority: + return majority + case ReadConsistencyLevelOne: + return 1 + case ReadConsistencyLevelNone: + return 0 + } + panic(fmt.Errorf("unrecognized consistency level: %s", level.String())) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/topology/dynamic.go b/vendor/github.com/m3db/m3/src/dbnode/topology/dynamic.go new file mode 100644 index 00000000..2c9d0625 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/topology/dynamic.go @@ -0,0 +1,291 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package topology + +import ( + "errors" + "sync" + + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/placement" + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/dbnode/sharding" + xwatch "github.com/m3db/m3/src/x/watch" + + "go.uber.org/zap" +) + +var ( + errInvalidService = errors.New("service topology is invalid") + errUnexpectedShard = errors.New("shard is unexpected") + errMissingShard = errors.New("shard is missing") + errNotEnoughReplicasForShard = errors.New("replicas of shard is less than expected") + errInvalidTopology = errors.New("could not parse latest value from config service") +) + +type dynamicInitializer struct { + sync.Mutex + opts DynamicOptions + topo Topology +} + +// NewDynamicInitializer returns a dynamic topology initializer +func NewDynamicInitializer(opts DynamicOptions) Initializer { + return &dynamicInitializer{opts: opts} +} + +func (i *dynamicInitializer) Init() (Topology, error) { + i.Lock() + defer i.Unlock() + + if i.topo != nil { + return i.topo, nil + } + + if err := i.opts.Validate(); err != nil { + return nil, err + } + + topo, err := newDynamicTopology(i.opts) + if err != nil { + return nil, err + } + + i.topo = topo + return i.topo, nil +} + +func (i *dynamicInitializer) TopologyIsSet() (bool, error) { + services, err := i.opts.ConfigServiceClient().Services(i.opts.ServicesOverrideOptions()) + if err != nil { + return false, err + } + + _, err = services.Query(i.opts.ServiceID(), i.opts.QueryOptions()) + if err != nil { + if err == kv.ErrNotFound { + // Valid, just means topology is not set + return false, nil + } + + return false, err + } + + return true, nil +} + +type dynamicTopology struct { + sync.RWMutex + opts DynamicOptions + services services.Services + watch services.Watch + watchable xwatch.Watchable + closed bool + hashGen sharding.HashGen + logger *zap.Logger +} + +func newDynamicTopology(opts DynamicOptions) (DynamicTopology, error) { + services, err := opts.ConfigServiceClient().Services(opts.ServicesOverrideOptions()) + if err != nil { + return nil, err + } + + logger := opts.InstrumentOptions().Logger() + logger.Info("waiting for dynamic topology initialization, " + + "if this takes a long time, make sure that a topology/placement is configured") + watch, err := services.Watch(opts.ServiceID(), opts.QueryOptions()) + if err != nil { + return nil, err + } + <-watch.C() + logger.Info("initial topology / placement value received") + + m, err := getMapFromUpdate(watch.Get(), opts.HashGen()) + if err != nil { + logger.Error("dynamic topology received invalid initial value", zap.Error(err)) + return nil, err + } + + watchable := xwatch.NewWatchable() + watchable.Update(m) + + dt := &dynamicTopology{ + opts: opts, + services: services, + watch: watch, + watchable: watchable, + hashGen: opts.HashGen(), + logger: logger, + } + go dt.run() + return dt, nil +} + +func (t *dynamicTopology) isClosed() bool { + t.RLock() + closed := t.closed + t.RUnlock() + return closed +} + +func (t *dynamicTopology) run() { + for !t.isClosed() { + if _, ok := <-t.watch.C(); !ok { + t.Close() + break + } + + m, err := getMapFromUpdate(t.watch.Get(), t.hashGen) + if err != nil { + t.logger.Warn("dynamic topology received invalid update", zap.Error(err)) + continue + } + t.watchable.Update(m) + } +} + +func (t *dynamicTopology) Get() Map { + return t.watchable.Get().(Map) +} + +func (t *dynamicTopology) Watch() (MapWatch, error) { + _, w, err := t.watchable.Watch() + if err != nil { + return nil, err + } + return NewMapWatch(w), err +} + +func (t *dynamicTopology) Close() { + t.Lock() + defer t.Unlock() + + if t.closed { + return + } + + t.closed = true + + t.watch.Close() + t.watchable.Close() +} + +func (t *dynamicTopology) MarkShardsAvailable( + instanceID string, + shardIDs ...uint32, +) error { + opts := placement.NewOptions() + ps, err := t.services.PlacementService(t.opts.ServiceID(), opts) + if err != nil { + return err + } + _, err = ps.MarkShardsAvailable(instanceID, shardIDs...) + return err +} + +func getMapFromUpdate(data interface{}, hashGen sharding.HashGen) (Map, error) { + service, ok := data.(services.Service) + if !ok { + return nil, errInvalidTopology + } + to, err := getStaticOptions(service, hashGen) + if err != nil { + return nil, err + } + if err := to.Validate(); err != nil { + return nil, err + } + return NewStaticMap(to), nil +} + +func getStaticOptions(service services.Service, hashGen sharding.HashGen) (StaticOptions, error) { + if service.Replication() == nil || service.Sharding() == nil || service.Instances() == nil { + return nil, errInvalidService + } + replicas := service.Replication().Replicas() + instances := service.Instances() + numShards := service.Sharding().NumShards() + + allShardIDs, err := validateInstances(instances, replicas, numShards) + if err != nil { + return nil, err + } + + allShards := make([]shard.Shard, len(allShardIDs)) + for i, id := range allShardIDs { + allShards[i] = shard.NewShard(id).SetState(shard.Available) + } + + fn := hashGen(numShards) + allShardSet, err := sharding.NewShardSet(allShards, fn) + if err != nil { + return nil, err + } + + hostShardSets := make([]HostShardSet, len(instances)) + for i, instance := range instances { + hs, err := NewHostShardSetFromServiceInstance(instance, fn) + if err != nil { + return nil, err + } + hostShardSets[i] = hs + } + + return NewStaticOptions(). + SetReplicas(replicas). + SetShardSet(allShardSet). + SetHostShardSets(hostShardSets), nil +} + +func validateInstances( + instances []services.ServiceInstance, + replicas, numShards int, +) ([]uint32, error) { + m := make(map[uint32]int) + for _, i := range instances { + if i.Shards() == nil { + return nil, errInstanceHasNoShardsAssignment + } + for _, s := range i.Shards().All() { + m[s.ID()] = m[s.ID()] + 1 + } + } + s := make([]uint32, numShards) + for i := range s { + expectShard := uint32(i) + count, exist := m[expectShard] + if !exist { + return nil, errMissingShard + } + if count < replicas { + return nil, errNotEnoughReplicasForShard + } + delete(m, expectShard) + s[i] = expectShard + } + + if len(m) > 0 { + return nil, errUnexpectedShard + } + return s, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/topology/host.go b/vendor/github.com/m3db/m3/src/dbnode/topology/host.go new file mode 100644 index 00000000..2878aa80 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/topology/host.go @@ -0,0 +1,98 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package topology + +import ( + "errors" + "fmt" + "math" + + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/dbnode/sharding" +) + +var errInstanceHasNoShardsAssignment = errors.New("invalid instance with no shards assigned") + +// Majority returns the majority required to successfully return when +// querying a majority of a set of replicas +func Majority(replicas int) int { + return int(math.Ceil(0.5 * float64(replicas+1))) +} + +type host struct { + id string + address string +} + +func (h *host) ID() string { + return h.id +} + +func (h *host) Address() string { + return h.address +} + +func (h *host) String() string { + return fmt.Sprintf("Host", h.id, h.address) +} + +// NewHost creates a new host +func NewHost(id, address string) Host { + return &host{id: id, address: address} +} + +type hostShardSet struct { + host Host + shardSet sharding.ShardSet +} + +// NewHostShardSet creates a new host shard set +func NewHostShardSet(host Host, shardSet sharding.ShardSet) HostShardSet { + return &hostShardSet{host, shardSet} +} + +// NewHostShardSetFromServiceInstance creates a new +// host shard set derived from a service instance +func NewHostShardSetFromServiceInstance( + si services.ServiceInstance, + fn sharding.HashFn, +) (HostShardSet, error) { + if si.Shards() == nil { + return nil, errInstanceHasNoShardsAssignment + } + all := si.Shards().All() + shards := make([]shard.Shard, len(all)) + copy(shards, all) + shardSet, err := sharding.NewShardSet(shards, fn) + if err != nil { + return nil, err + } + return NewHostShardSet(NewHost(si.InstanceID(), si.Endpoint()), shardSet), nil +} + +func (h *hostShardSet) Host() Host { + return h.host +} + +func (h *hostShardSet) ShardSet() sharding.ShardSet { + return h.shardSet +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/topology/map.go b/vendor/github.com/m3db/m3/src/dbnode/topology/map.go new file mode 100644 index 00000000..31229c0f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/topology/map.go @@ -0,0 +1,165 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package topology + +import ( + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/dbnode/sharding" + "github.com/m3db/m3/src/x/ident" + xwatch "github.com/m3db/m3/src/x/watch" +) + +type staticMap struct { + shardSet sharding.ShardSet + hostShardSets []HostShardSet + hostShardSetsByID map[string]HostShardSet + orderedHosts []Host + hostsByShard [][]Host + orderedShardHostsByShard [][]orderedShardHost + replicas int + majority int +} + +// NewStaticMap creates a new static topology map +func NewStaticMap(opts StaticOptions) Map { + totalShards := len(opts.ShardSet().AllIDs()) + hostShardSets := opts.HostShardSets() + topoMap := staticMap{ + shardSet: opts.ShardSet(), + hostShardSets: hostShardSets, + hostShardSetsByID: make(map[string]HostShardSet), + orderedHosts: make([]Host, 0, len(hostShardSets)), + hostsByShard: make([][]Host, totalShards), + orderedShardHostsByShard: make([][]orderedShardHost, totalShards), + replicas: opts.Replicas(), + majority: Majority(opts.Replicas()), + } + + for idx, hostShardSet := range hostShardSets { + host := hostShardSet.Host() + topoMap.hostShardSetsByID[host.ID()] = hostShardSet + topoMap.orderedHosts = append(topoMap.orderedHosts, host) + for _, shard := range hostShardSet.ShardSet().All() { + id := shard.ID() + topoMap.hostsByShard[id] = append(topoMap.hostsByShard[id], host) + elem := orderedShardHost{ + idx: idx, + shard: shard, + host: host, + } + topoMap.orderedShardHostsByShard[id] = + append(topoMap.orderedShardHostsByShard[id], elem) + } + } + + return &topoMap +} + +type orderedShardHost struct { + idx int + shard shard.Shard + host Host +} + +func (t *staticMap) Hosts() []Host { + return t.orderedHosts +} + +func (t *staticMap) HostShardSets() []HostShardSet { + return t.hostShardSets +} + +func (t *staticMap) LookupHostShardSet(id string) (HostShardSet, bool) { + value, ok := t.hostShardSetsByID[id] + return value, ok +} + +func (t *staticMap) HostsLen() int { + return len(t.orderedHosts) +} + +func (t *staticMap) ShardSet() sharding.ShardSet { + return t.shardSet +} + +func (t *staticMap) Route(id ident.ID) (uint32, []Host, error) { + shard := t.shardSet.Lookup(id) + if int(shard) >= len(t.hostsByShard) { + return shard, nil, errUnownedShard + } + return shard, t.hostsByShard[shard], nil +} + +func (t *staticMap) RouteForEach(id ident.ID, forEachFn RouteForEachFn) error { + return t.RouteShardForEach(t.shardSet.Lookup(id), forEachFn) +} + +func (t *staticMap) RouteShard(shard uint32) ([]Host, error) { + if int(shard) >= len(t.hostsByShard) { + return nil, errUnownedShard + } + return t.hostsByShard[shard], nil +} + +func (t *staticMap) RouteShardForEach(shard uint32, forEachFn RouteForEachFn) error { + if int(shard) >= len(t.orderedShardHostsByShard) { + return errUnownedShard + } + orderedShardHosts := t.orderedShardHostsByShard[shard] + for _, elem := range orderedShardHosts { + forEachFn(elem.idx, elem.shard, elem.host) + } + return nil +} + +func (t *staticMap) Replicas() int { + return t.replicas +} + +func (t *staticMap) MajorityReplicas() int { + return t.majority +} + +type mapWatch struct { + xwatch.Watch +} + +// NewMapWatch creates a new watch on a topology map +// from a generic watch that watches a Map +func NewMapWatch(w xwatch.Watch) MapWatch { + return &mapWatch{w} +} + +func (w *mapWatch) C() <-chan struct{} { + return w.Watch.C() +} + +func (w *mapWatch) Get() Map { + value := w.Watch.Get() + if value == nil { + return nil + } + return value.(Map) +} + +func (w *mapWatch) Close() { + w.Watch.Close() +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/topology/options.go b/vendor/github.com/m3db/m3/src/dbnode/topology/options.go new file mode 100644 index 00000000..ade0e54c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/topology/options.go @@ -0,0 +1,204 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package topology + +import ( + "errors" + "fmt" + "time" + + "github.com/m3db/m3/src/cluster/client" + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/dbnode/sharding" + "github.com/m3db/m3/src/x/instrument" +) + +const ( + defaultServiceName = "m3db" + defaultInitTimeout = 0 // Wait indefinitely by default for topology + defaultReplicas = 3 +) + +var ( + errNoConfigServiceClient = errors.New("no config service client") + errNoHashGen = errors.New("no hash gen function defined") + errInvalidReplicas = errors.New("replicas must be equal to or greater than 1") +) + +type staticOptions struct { + shardSet sharding.ShardSet + replicas int + hostShardSets []HostShardSet +} + +// NewStaticOptions creates a new set of static topology options +func NewStaticOptions() StaticOptions { + return &staticOptions{ + replicas: defaultReplicas, + } +} + +func (o *staticOptions) Validate() error { + if o.replicas < 1 { + return errInvalidReplicas + } + + // Make a mapping of each shard to a set of hosts and check each + // shard has at least the required replicas mapped to + // NB(r): We allow greater than the required replicas in case + // node is streaming in and needs to take writes + totalShards := len(o.shardSet.AllIDs()) + hostAddressesByShard := make([]map[string]struct{}, totalShards) + for i := range hostAddressesByShard { + hostAddressesByShard[i] = make(map[string]struct{}, o.replicas) + } + for _, hostShardSet := range o.hostShardSets { + hostAddress := hostShardSet.Host().Address() + for _, shard := range hostShardSet.ShardSet().AllIDs() { + hostAddressesByShard[shard][hostAddress] = struct{}{} + } + } + for shard, hosts := range hostAddressesByShard { + if len(hosts) < o.replicas { + errorFmt := "shard %d has %d replicas, less than the required %d replicas" + return fmt.Errorf(errorFmt, shard, len(hosts), o.replicas) + } + } + + return nil +} + +func (o *staticOptions) SetShardSet(value sharding.ShardSet) StaticOptions { + opts := *o + opts.shardSet = value + return &opts +} + +func (o *staticOptions) ShardSet() sharding.ShardSet { + return o.shardSet +} + +func (o *staticOptions) SetReplicas(value int) StaticOptions { + opts := *o + opts.replicas = value + return &opts +} + +func (o *staticOptions) Replicas() int { + return o.replicas +} + +func (o *staticOptions) SetHostShardSets(value []HostShardSet) StaticOptions { + opts := *o + opts.hostShardSets = value + return &opts +} + +func (o *staticOptions) HostShardSets() []HostShardSet { + return o.hostShardSets +} + +type dynamicOptions struct { + configServiceClient client.Client + serviceID services.ServiceID + servicesOverrideOptions services.OverrideOptions + queryOptions services.QueryOptions + instrumentOptions instrument.Options + initTimeout time.Duration + hashGen sharding.HashGen +} + +// NewDynamicOptions creates a new set of dynamic topology options +func NewDynamicOptions() DynamicOptions { + return &dynamicOptions{ + serviceID: services.NewServiceID().SetName(defaultServiceName), + servicesOverrideOptions: services.NewOverrideOptions(), + queryOptions: services.NewQueryOptions(), + instrumentOptions: instrument.NewOptions(), + initTimeout: defaultInitTimeout, + hashGen: sharding.DefaultHashFn, + } +} + +func (o *dynamicOptions) Validate() error { + if o.ConfigServiceClient() == nil { + return errNoConfigServiceClient + } + + if o.HashGen() == nil { + return errNoHashGen + } + return nil +} + +func (o *dynamicOptions) SetConfigServiceClient(c client.Client) DynamicOptions { + o.configServiceClient = c + return o +} + +func (o *dynamicOptions) ConfigServiceClient() client.Client { + return o.configServiceClient +} + +func (o *dynamicOptions) SetServiceID(s services.ServiceID) DynamicOptions { + o.serviceID = s + return o +} + +func (o *dynamicOptions) ServiceID() services.ServiceID { + return o.serviceID +} + +func (o *dynamicOptions) SetServicesOverrideOptions(opts services.OverrideOptions) DynamicOptions { + o.servicesOverrideOptions = opts + return o +} + +func (o *dynamicOptions) ServicesOverrideOptions() services.OverrideOptions { + return o.servicesOverrideOptions +} + +func (o *dynamicOptions) SetQueryOptions(qo services.QueryOptions) DynamicOptions { + o.queryOptions = qo + return o +} + +func (o *dynamicOptions) QueryOptions() services.QueryOptions { + return o.queryOptions +} + +func (o *dynamicOptions) SetInstrumentOptions(io instrument.Options) DynamicOptions { + o.instrumentOptions = io + return o +} + +func (o *dynamicOptions) InstrumentOptions() instrument.Options { + return o.instrumentOptions +} + +func (o *dynamicOptions) SetHashGen(h sharding.HashGen) DynamicOptions { + o.hashGen = h + return o +} + +func (o *dynamicOptions) HashGen() sharding.HashGen { + return o.hashGen +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/topology/static.go b/vendor/github.com/m3db/m3/src/dbnode/topology/static.go new file mode 100644 index 00000000..c3bd9515 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/topology/static.go @@ -0,0 +1,78 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package topology + +import ( + "errors" + + xwatch "github.com/m3db/m3/src/x/watch" +) + +var ( + errUnownedShard = errors.New("unowned shard") +) + +type staticInitializer struct { + opts StaticOptions +} + +// NewStaticInitializer creates a static topology initializer. +func NewStaticInitializer(opts StaticOptions) Initializer { + return staticInitializer{opts} +} + +func (i staticInitializer) Init() (Topology, error) { + if err := i.opts.Validate(); err != nil { + return nil, err + } + return NewStaticTopology(i.opts), nil +} + +func (i staticInitializer) TopologyIsSet() (bool, error) { + // Always has the specified static topology ready. + return true, nil +} + +type staticTopology struct { + w xwatch.Watchable +} + +// NewStaticTopology creates a static topology. +func NewStaticTopology(opts StaticOptions) Topology { + w := xwatch.NewWatchable() + w.Update(NewStaticMap(opts)) + return &staticTopology{w: w} +} + +func (t *staticTopology) Get() Map { + return t.w.Get().(Map) +} + +func (t *staticTopology) Watch() (MapWatch, error) { + // Topology is static, the returned watch will not receive any updates. + _, w, err := t.w.Watch() + if err != nil { + return nil, err + } + return NewMapWatch(w), nil +} + +func (t *staticTopology) Close() {} diff --git a/vendor/github.com/m3db/m3/src/dbnode/topology/topology_mock.go b/vendor/github.com/m3db/m3/src/dbnode/topology/topology_mock.go new file mode 100644 index 00000000..18ce1a9d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/topology/topology_mock.go @@ -0,0 +1,961 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/topology/types.go + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package topology is a generated GoMock package. +package topology + +import ( + "reflect" + + "github.com/m3db/m3/src/cluster/client" + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/dbnode/sharding" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" + + "github.com/golang/mock/gomock" +) + +// MockHost is a mock of Host interface +type MockHost struct { + ctrl *gomock.Controller + recorder *MockHostMockRecorder +} + +// MockHostMockRecorder is the mock recorder for MockHost +type MockHostMockRecorder struct { + mock *MockHost +} + +// NewMockHost creates a new mock instance +func NewMockHost(ctrl *gomock.Controller) *MockHost { + mock := &MockHost{ctrl: ctrl} + mock.recorder = &MockHostMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockHost) EXPECT() *MockHostMockRecorder { + return m.recorder +} + +// ID mocks base method +func (m *MockHost) ID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(string) + return ret0 +} + +// ID indicates an expected call of ID +func (mr *MockHostMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockHost)(nil).ID)) +} + +// Address mocks base method +func (m *MockHost) Address() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Address") + ret0, _ := ret[0].(string) + return ret0 +} + +// Address indicates an expected call of Address +func (mr *MockHostMockRecorder) Address() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Address", reflect.TypeOf((*MockHost)(nil).Address)) +} + +// String mocks base method +func (m *MockHost) String() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "String") + ret0, _ := ret[0].(string) + return ret0 +} + +// String indicates an expected call of String +func (mr *MockHostMockRecorder) String() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockHost)(nil).String)) +} + +// MockHostShardSet is a mock of HostShardSet interface +type MockHostShardSet struct { + ctrl *gomock.Controller + recorder *MockHostShardSetMockRecorder +} + +// MockHostShardSetMockRecorder is the mock recorder for MockHostShardSet +type MockHostShardSetMockRecorder struct { + mock *MockHostShardSet +} + +// NewMockHostShardSet creates a new mock instance +func NewMockHostShardSet(ctrl *gomock.Controller) *MockHostShardSet { + mock := &MockHostShardSet{ctrl: ctrl} + mock.recorder = &MockHostShardSetMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockHostShardSet) EXPECT() *MockHostShardSetMockRecorder { + return m.recorder +} + +// Host mocks base method +func (m *MockHostShardSet) Host() Host { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Host") + ret0, _ := ret[0].(Host) + return ret0 +} + +// Host indicates an expected call of Host +func (mr *MockHostShardSetMockRecorder) Host() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Host", reflect.TypeOf((*MockHostShardSet)(nil).Host)) +} + +// ShardSet mocks base method +func (m *MockHostShardSet) ShardSet() sharding.ShardSet { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardSet") + ret0, _ := ret[0].(sharding.ShardSet) + return ret0 +} + +// ShardSet indicates an expected call of ShardSet +func (mr *MockHostShardSetMockRecorder) ShardSet() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardSet", reflect.TypeOf((*MockHostShardSet)(nil).ShardSet)) +} + +// MockInitializer is a mock of Initializer interface +type MockInitializer struct { + ctrl *gomock.Controller + recorder *MockInitializerMockRecorder +} + +// MockInitializerMockRecorder is the mock recorder for MockInitializer +type MockInitializerMockRecorder struct { + mock *MockInitializer +} + +// NewMockInitializer creates a new mock instance +func NewMockInitializer(ctrl *gomock.Controller) *MockInitializer { + mock := &MockInitializer{ctrl: ctrl} + mock.recorder = &MockInitializerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockInitializer) EXPECT() *MockInitializerMockRecorder { + return m.recorder +} + +// Init mocks base method +func (m *MockInitializer) Init() (Topology, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Init") + ret0, _ := ret[0].(Topology) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Init indicates an expected call of Init +func (mr *MockInitializerMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockInitializer)(nil).Init)) +} + +// TopologyIsSet mocks base method +func (m *MockInitializer) TopologyIsSet() (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TopologyIsSet") + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// TopologyIsSet indicates an expected call of TopologyIsSet +func (mr *MockInitializerMockRecorder) TopologyIsSet() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TopologyIsSet", reflect.TypeOf((*MockInitializer)(nil).TopologyIsSet)) +} + +// MockTopology is a mock of Topology interface +type MockTopology struct { + ctrl *gomock.Controller + recorder *MockTopologyMockRecorder +} + +// MockTopologyMockRecorder is the mock recorder for MockTopology +type MockTopologyMockRecorder struct { + mock *MockTopology +} + +// NewMockTopology creates a new mock instance +func NewMockTopology(ctrl *gomock.Controller) *MockTopology { + mock := &MockTopology{ctrl: ctrl} + mock.recorder = &MockTopologyMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTopology) EXPECT() *MockTopologyMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockTopology) Get() Map { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(Map) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockTopologyMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockTopology)(nil).Get)) +} + +// Watch mocks base method +func (m *MockTopology) Watch() (MapWatch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch") + ret0, _ := ret[0].(MapWatch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Watch indicates an expected call of Watch +func (mr *MockTopologyMockRecorder) Watch() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockTopology)(nil).Watch)) +} + +// Close mocks base method +func (m *MockTopology) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockTopologyMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockTopology)(nil).Close)) +} + +// MockDynamicTopology is a mock of DynamicTopology interface +type MockDynamicTopology struct { + ctrl *gomock.Controller + recorder *MockDynamicTopologyMockRecorder +} + +// MockDynamicTopologyMockRecorder is the mock recorder for MockDynamicTopology +type MockDynamicTopologyMockRecorder struct { + mock *MockDynamicTopology +} + +// NewMockDynamicTopology creates a new mock instance +func NewMockDynamicTopology(ctrl *gomock.Controller) *MockDynamicTopology { + mock := &MockDynamicTopology{ctrl: ctrl} + mock.recorder = &MockDynamicTopologyMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDynamicTopology) EXPECT() *MockDynamicTopologyMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockDynamicTopology) Get() Map { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(Map) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockDynamicTopologyMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockDynamicTopology)(nil).Get)) +} + +// Watch mocks base method +func (m *MockDynamicTopology) Watch() (MapWatch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch") + ret0, _ := ret[0].(MapWatch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Watch indicates an expected call of Watch +func (mr *MockDynamicTopologyMockRecorder) Watch() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockDynamicTopology)(nil).Watch)) +} + +// Close mocks base method +func (m *MockDynamicTopology) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockDynamicTopologyMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockDynamicTopology)(nil).Close)) +} + +// MarkShardsAvailable mocks base method +func (m *MockDynamicTopology) MarkShardsAvailable(instanceID string, shardIDs ...uint32) error { + m.ctrl.T.Helper() + varargs := []interface{}{instanceID} + for _, a := range shardIDs { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "MarkShardsAvailable", varargs...) + ret0, _ := ret[0].(error) + return ret0 +} + +// MarkShardsAvailable indicates an expected call of MarkShardsAvailable +func (mr *MockDynamicTopologyMockRecorder) MarkShardsAvailable(instanceID interface{}, shardIDs ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{instanceID}, shardIDs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarkShardsAvailable", reflect.TypeOf((*MockDynamicTopology)(nil).MarkShardsAvailable), varargs...) +} + +// MockMapWatch is a mock of MapWatch interface +type MockMapWatch struct { + ctrl *gomock.Controller + recorder *MockMapWatchMockRecorder +} + +// MockMapWatchMockRecorder is the mock recorder for MockMapWatch +type MockMapWatchMockRecorder struct { + mock *MockMapWatch +} + +// NewMockMapWatch creates a new mock instance +func NewMockMapWatch(ctrl *gomock.Controller) *MockMapWatch { + mock := &MockMapWatch{ctrl: ctrl} + mock.recorder = &MockMapWatchMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMapWatch) EXPECT() *MockMapWatchMockRecorder { + return m.recorder +} + +// C mocks base method +func (m *MockMapWatch) C() <-chan struct{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "C") + ret0, _ := ret[0].(<-chan struct{}) + return ret0 +} + +// C indicates an expected call of C +func (mr *MockMapWatchMockRecorder) C() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "C", reflect.TypeOf((*MockMapWatch)(nil).C)) +} + +// Get mocks base method +func (m *MockMapWatch) Get() Map { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(Map) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockMapWatchMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockMapWatch)(nil).Get)) +} + +// Close mocks base method +func (m *MockMapWatch) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockMapWatchMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockMapWatch)(nil).Close)) +} + +// MockMap is a mock of Map interface +type MockMap struct { + ctrl *gomock.Controller + recorder *MockMapMockRecorder +} + +// MockMapMockRecorder is the mock recorder for MockMap +type MockMapMockRecorder struct { + mock *MockMap +} + +// NewMockMap creates a new mock instance +func NewMockMap(ctrl *gomock.Controller) *MockMap { + mock := &MockMap{ctrl: ctrl} + mock.recorder = &MockMapMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMap) EXPECT() *MockMapMockRecorder { + return m.recorder +} + +// Hosts mocks base method +func (m *MockMap) Hosts() []Host { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Hosts") + ret0, _ := ret[0].([]Host) + return ret0 +} + +// Hosts indicates an expected call of Hosts +func (mr *MockMapMockRecorder) Hosts() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Hosts", reflect.TypeOf((*MockMap)(nil).Hosts)) +} + +// HostShardSets mocks base method +func (m *MockMap) HostShardSets() []HostShardSet { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostShardSets") + ret0, _ := ret[0].([]HostShardSet) + return ret0 +} + +// HostShardSets indicates an expected call of HostShardSets +func (mr *MockMapMockRecorder) HostShardSets() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostShardSets", reflect.TypeOf((*MockMap)(nil).HostShardSets)) +} + +// LookupHostShardSet mocks base method +func (m *MockMap) LookupHostShardSet(hostID string) (HostShardSet, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LookupHostShardSet", hostID) + ret0, _ := ret[0].(HostShardSet) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// LookupHostShardSet indicates an expected call of LookupHostShardSet +func (mr *MockMapMockRecorder) LookupHostShardSet(hostID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LookupHostShardSet", reflect.TypeOf((*MockMap)(nil).LookupHostShardSet), hostID) +} + +// HostsLen mocks base method +func (m *MockMap) HostsLen() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostsLen") + ret0, _ := ret[0].(int) + return ret0 +} + +// HostsLen indicates an expected call of HostsLen +func (mr *MockMapMockRecorder) HostsLen() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostsLen", reflect.TypeOf((*MockMap)(nil).HostsLen)) +} + +// ShardSet mocks base method +func (m *MockMap) ShardSet() sharding.ShardSet { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardSet") + ret0, _ := ret[0].(sharding.ShardSet) + return ret0 +} + +// ShardSet indicates an expected call of ShardSet +func (mr *MockMapMockRecorder) ShardSet() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardSet", reflect.TypeOf((*MockMap)(nil).ShardSet)) +} + +// Route mocks base method +func (m *MockMap) Route(id ident.ID) (uint32, []Host, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Route", id) + ret0, _ := ret[0].(uint32) + ret1, _ := ret[1].([]Host) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Route indicates an expected call of Route +func (mr *MockMapMockRecorder) Route(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Route", reflect.TypeOf((*MockMap)(nil).Route), id) +} + +// RouteForEach mocks base method +func (m *MockMap) RouteForEach(id ident.ID, forEachFn RouteForEachFn) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RouteForEach", id, forEachFn) + ret0, _ := ret[0].(error) + return ret0 +} + +// RouteForEach indicates an expected call of RouteForEach +func (mr *MockMapMockRecorder) RouteForEach(id, forEachFn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RouteForEach", reflect.TypeOf((*MockMap)(nil).RouteForEach), id, forEachFn) +} + +// RouteShard mocks base method +func (m *MockMap) RouteShard(shard uint32) ([]Host, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RouteShard", shard) + ret0, _ := ret[0].([]Host) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RouteShard indicates an expected call of RouteShard +func (mr *MockMapMockRecorder) RouteShard(shard interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RouteShard", reflect.TypeOf((*MockMap)(nil).RouteShard), shard) +} + +// RouteShardForEach mocks base method +func (m *MockMap) RouteShardForEach(shard uint32, forEachFn RouteForEachFn) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RouteShardForEach", shard, forEachFn) + ret0, _ := ret[0].(error) + return ret0 +} + +// RouteShardForEach indicates an expected call of RouteShardForEach +func (mr *MockMapMockRecorder) RouteShardForEach(shard, forEachFn interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RouteShardForEach", reflect.TypeOf((*MockMap)(nil).RouteShardForEach), shard, forEachFn) +} + +// Replicas mocks base method +func (m *MockMap) Replicas() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Replicas") + ret0, _ := ret[0].(int) + return ret0 +} + +// Replicas indicates an expected call of Replicas +func (mr *MockMapMockRecorder) Replicas() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Replicas", reflect.TypeOf((*MockMap)(nil).Replicas)) +} + +// MajorityReplicas mocks base method +func (m *MockMap) MajorityReplicas() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MajorityReplicas") + ret0, _ := ret[0].(int) + return ret0 +} + +// MajorityReplicas indicates an expected call of MajorityReplicas +func (mr *MockMapMockRecorder) MajorityReplicas() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MajorityReplicas", reflect.TypeOf((*MockMap)(nil).MajorityReplicas)) +} + +// MockStaticOptions is a mock of StaticOptions interface +type MockStaticOptions struct { + ctrl *gomock.Controller + recorder *MockStaticOptionsMockRecorder +} + +// MockStaticOptionsMockRecorder is the mock recorder for MockStaticOptions +type MockStaticOptionsMockRecorder struct { + mock *MockStaticOptions +} + +// NewMockStaticOptions creates a new mock instance +func NewMockStaticOptions(ctrl *gomock.Controller) *MockStaticOptions { + mock := &MockStaticOptions{ctrl: ctrl} + mock.recorder = &MockStaticOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockStaticOptions) EXPECT() *MockStaticOptionsMockRecorder { + return m.recorder +} + +// Validate mocks base method +func (m *MockStaticOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockStaticOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockStaticOptions)(nil).Validate)) +} + +// SetShardSet mocks base method +func (m *MockStaticOptions) SetShardSet(value sharding.ShardSet) StaticOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetShardSet", value) + ret0, _ := ret[0].(StaticOptions) + return ret0 +} + +// SetShardSet indicates an expected call of SetShardSet +func (mr *MockStaticOptionsMockRecorder) SetShardSet(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetShardSet", reflect.TypeOf((*MockStaticOptions)(nil).SetShardSet), value) +} + +// ShardSet mocks base method +func (m *MockStaticOptions) ShardSet() sharding.ShardSet { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ShardSet") + ret0, _ := ret[0].(sharding.ShardSet) + return ret0 +} + +// ShardSet indicates an expected call of ShardSet +func (mr *MockStaticOptionsMockRecorder) ShardSet() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShardSet", reflect.TypeOf((*MockStaticOptions)(nil).ShardSet)) +} + +// SetReplicas mocks base method +func (m *MockStaticOptions) SetReplicas(value int) StaticOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetReplicas", value) + ret0, _ := ret[0].(StaticOptions) + return ret0 +} + +// SetReplicas indicates an expected call of SetReplicas +func (mr *MockStaticOptionsMockRecorder) SetReplicas(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReplicas", reflect.TypeOf((*MockStaticOptions)(nil).SetReplicas), value) +} + +// Replicas mocks base method +func (m *MockStaticOptions) Replicas() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Replicas") + ret0, _ := ret[0].(int) + return ret0 +} + +// Replicas indicates an expected call of Replicas +func (mr *MockStaticOptionsMockRecorder) Replicas() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Replicas", reflect.TypeOf((*MockStaticOptions)(nil).Replicas)) +} + +// SetHostShardSets mocks base method +func (m *MockStaticOptions) SetHostShardSets(value []HostShardSet) StaticOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHostShardSets", value) + ret0, _ := ret[0].(StaticOptions) + return ret0 +} + +// SetHostShardSets indicates an expected call of SetHostShardSets +func (mr *MockStaticOptionsMockRecorder) SetHostShardSets(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHostShardSets", reflect.TypeOf((*MockStaticOptions)(nil).SetHostShardSets), value) +} + +// HostShardSets mocks base method +func (m *MockStaticOptions) HostShardSets() []HostShardSet { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HostShardSets") + ret0, _ := ret[0].([]HostShardSet) + return ret0 +} + +// HostShardSets indicates an expected call of HostShardSets +func (mr *MockStaticOptionsMockRecorder) HostShardSets() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HostShardSets", reflect.TypeOf((*MockStaticOptions)(nil).HostShardSets)) +} + +// MockDynamicOptions is a mock of DynamicOptions interface +type MockDynamicOptions struct { + ctrl *gomock.Controller + recorder *MockDynamicOptionsMockRecorder +} + +// MockDynamicOptionsMockRecorder is the mock recorder for MockDynamicOptions +type MockDynamicOptionsMockRecorder struct { + mock *MockDynamicOptions +} + +// NewMockDynamicOptions creates a new mock instance +func NewMockDynamicOptions(ctrl *gomock.Controller) *MockDynamicOptions { + mock := &MockDynamicOptions{ctrl: ctrl} + mock.recorder = &MockDynamicOptionsMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDynamicOptions) EXPECT() *MockDynamicOptionsMockRecorder { + return m.recorder +} + +// Validate mocks base method +func (m *MockDynamicOptions) Validate() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validate") + ret0, _ := ret[0].(error) + return ret0 +} + +// Validate indicates an expected call of Validate +func (mr *MockDynamicOptionsMockRecorder) Validate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validate", reflect.TypeOf((*MockDynamicOptions)(nil).Validate)) +} + +// SetConfigServiceClient mocks base method +func (m *MockDynamicOptions) SetConfigServiceClient(c client.Client) DynamicOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetConfigServiceClient", c) + ret0, _ := ret[0].(DynamicOptions) + return ret0 +} + +// SetConfigServiceClient indicates an expected call of SetConfigServiceClient +func (mr *MockDynamicOptionsMockRecorder) SetConfigServiceClient(c interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetConfigServiceClient", reflect.TypeOf((*MockDynamicOptions)(nil).SetConfigServiceClient), c) +} + +// ConfigServiceClient mocks base method +func (m *MockDynamicOptions) ConfigServiceClient() client.Client { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConfigServiceClient") + ret0, _ := ret[0].(client.Client) + return ret0 +} + +// ConfigServiceClient indicates an expected call of ConfigServiceClient +func (mr *MockDynamicOptionsMockRecorder) ConfigServiceClient() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConfigServiceClient", reflect.TypeOf((*MockDynamicOptions)(nil).ConfigServiceClient)) +} + +// SetServiceID mocks base method +func (m *MockDynamicOptions) SetServiceID(s services.ServiceID) DynamicOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetServiceID", s) + ret0, _ := ret[0].(DynamicOptions) + return ret0 +} + +// SetServiceID indicates an expected call of SetServiceID +func (mr *MockDynamicOptionsMockRecorder) SetServiceID(s interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetServiceID", reflect.TypeOf((*MockDynamicOptions)(nil).SetServiceID), s) +} + +// ServiceID mocks base method +func (m *MockDynamicOptions) ServiceID() services.ServiceID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ServiceID") + ret0, _ := ret[0].(services.ServiceID) + return ret0 +} + +// ServiceID indicates an expected call of ServiceID +func (mr *MockDynamicOptionsMockRecorder) ServiceID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServiceID", reflect.TypeOf((*MockDynamicOptions)(nil).ServiceID)) +} + +// SetServicesOverrideOptions mocks base method +func (m *MockDynamicOptions) SetServicesOverrideOptions(opts services.OverrideOptions) DynamicOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetServicesOverrideOptions", opts) + ret0, _ := ret[0].(DynamicOptions) + return ret0 +} + +// SetServicesOverrideOptions indicates an expected call of SetServicesOverrideOptions +func (mr *MockDynamicOptionsMockRecorder) SetServicesOverrideOptions(opts interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetServicesOverrideOptions", reflect.TypeOf((*MockDynamicOptions)(nil).SetServicesOverrideOptions), opts) +} + +// ServicesOverrideOptions mocks base method +func (m *MockDynamicOptions) ServicesOverrideOptions() services.OverrideOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ServicesOverrideOptions") + ret0, _ := ret[0].(services.OverrideOptions) + return ret0 +} + +// ServicesOverrideOptions indicates an expected call of ServicesOverrideOptions +func (mr *MockDynamicOptionsMockRecorder) ServicesOverrideOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServicesOverrideOptions", reflect.TypeOf((*MockDynamicOptions)(nil).ServicesOverrideOptions)) +} + +// SetQueryOptions mocks base method +func (m *MockDynamicOptions) SetQueryOptions(value services.QueryOptions) DynamicOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetQueryOptions", value) + ret0, _ := ret[0].(DynamicOptions) + return ret0 +} + +// SetQueryOptions indicates an expected call of SetQueryOptions +func (mr *MockDynamicOptionsMockRecorder) SetQueryOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetQueryOptions", reflect.TypeOf((*MockDynamicOptions)(nil).SetQueryOptions), value) +} + +// QueryOptions mocks base method +func (m *MockDynamicOptions) QueryOptions() services.QueryOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryOptions") + ret0, _ := ret[0].(services.QueryOptions) + return ret0 +} + +// QueryOptions indicates an expected call of QueryOptions +func (mr *MockDynamicOptionsMockRecorder) QueryOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryOptions", reflect.TypeOf((*MockDynamicOptions)(nil).QueryOptions)) +} + +// SetInstrumentOptions mocks base method +func (m *MockDynamicOptions) SetInstrumentOptions(value instrument.Options) DynamicOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetInstrumentOptions", value) + ret0, _ := ret[0].(DynamicOptions) + return ret0 +} + +// SetInstrumentOptions indicates an expected call of SetInstrumentOptions +func (mr *MockDynamicOptionsMockRecorder) SetInstrumentOptions(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInstrumentOptions", reflect.TypeOf((*MockDynamicOptions)(nil).SetInstrumentOptions), value) +} + +// InstrumentOptions mocks base method +func (m *MockDynamicOptions) InstrumentOptions() instrument.Options { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InstrumentOptions") + ret0, _ := ret[0].(instrument.Options) + return ret0 +} + +// InstrumentOptions indicates an expected call of InstrumentOptions +func (mr *MockDynamicOptionsMockRecorder) InstrumentOptions() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstrumentOptions", reflect.TypeOf((*MockDynamicOptions)(nil).InstrumentOptions)) +} + +// SetHashGen mocks base method +func (m *MockDynamicOptions) SetHashGen(h sharding.HashGen) DynamicOptions { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHashGen", h) + ret0, _ := ret[0].(DynamicOptions) + return ret0 +} + +// SetHashGen indicates an expected call of SetHashGen +func (mr *MockDynamicOptionsMockRecorder) SetHashGen(h interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHashGen", reflect.TypeOf((*MockDynamicOptions)(nil).SetHashGen), h) +} + +// HashGen mocks base method +func (m *MockDynamicOptions) HashGen() sharding.HashGen { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HashGen") + ret0, _ := ret[0].(sharding.HashGen) + return ret0 +} + +// HashGen indicates an expected call of HashGen +func (mr *MockDynamicOptionsMockRecorder) HashGen() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HashGen", reflect.TypeOf((*MockDynamicOptions)(nil).HashGen)) +} + +// MockMapProvider is a mock of MapProvider interface +type MockMapProvider struct { + ctrl *gomock.Controller + recorder *MockMapProviderMockRecorder +} + +// MockMapProviderMockRecorder is the mock recorder for MockMapProvider +type MockMapProviderMockRecorder struct { + mock *MockMapProvider +} + +// NewMockMapProvider creates a new mock instance +func NewMockMapProvider(ctrl *gomock.Controller) *MockMapProvider { + mock := &MockMapProvider{ctrl: ctrl} + mock.recorder = &MockMapProviderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMapProvider) EXPECT() *MockMapProviderMockRecorder { + return m.recorder +} + +// TopologyMap mocks base method +func (m *MockMapProvider) TopologyMap() (Map, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TopologyMap") + ret0, _ := ret[0].(Map) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// TopologyMap indicates an expected call of TopologyMap +func (mr *MockMapProviderMockRecorder) TopologyMap() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TopologyMap", reflect.TypeOf((*MockMapProvider)(nil).TopologyMap)) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/topology/types.go b/vendor/github.com/m3db/m3/src/dbnode/topology/types.go new file mode 100644 index 00000000..1756b93b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/topology/types.go @@ -0,0 +1,247 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package topology + +import ( + "github.com/m3db/m3/src/cluster/client" + "github.com/m3db/m3/src/cluster/services" + "github.com/m3db/m3/src/cluster/shard" + "github.com/m3db/m3/src/dbnode/sharding" + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/instrument" +) + +// Host is a container of a host in a topology +type Host interface { + // ID is the identifier of the host + ID() string + + // Address returns the address of the host + Address() string + + // String returns a string representation of the host + String() string +} + +// HostShardSet is a container for a host and corresponding shard set +type HostShardSet interface { + // Host returns the host + Host() Host + + // ShardSet returns the shard set owned by the host + ShardSet() sharding.ShardSet +} + +// Initializer can init new instances of Topology +type Initializer interface { + // Init will return a new topology + Init() (Topology, error) + + // TopologyIsSet returns whether the topology is able to be + // initialized immediately or if instead it will blockingly + // wait to be set on initialization + TopologyIsSet() (bool, error) +} + +// Topology is a container of a topology map and disseminates topology map changes +type Topology interface { + // Get the topology map + Get() Map + + // Watch for the topology map + Watch() (MapWatch, error) + + // Close will close the topology map + Close() +} + +// DynamicTopology is a topology that dynamically changes and as such +// adds functionality for a clustered database to call back and mark +// a shard as available once it completes bootstrapping +type DynamicTopology interface { + Topology + + // MarkShardsAvailable marks a shard with the state of initializing as available + MarkShardsAvailable(instanceID string, shardIDs ...uint32) error +} + +// MapWatch is a watch on a topology map +type MapWatch interface { + // C is the notification channel for when a value becomes available + C() <-chan struct{} + + // Get the current topology map + Get() Map + + // Close the watch on the topology map + Close() +} + +// Map describes a topology +type Map interface { + // Hosts returns all hosts in the map + Hosts() []Host + + // HostShardSets returns all HostShardSets in the map + HostShardSets() []HostShardSet + + // LookupHostShardSet returns a HostShardSet for a host in the map + LookupHostShardSet(hostID string) (HostShardSet, bool) + + // HostsLen returns the length of all hosts in the map + HostsLen() int + + // ShardSet returns the shard set for the topology + ShardSet() sharding.ShardSet + + // Route will route a given ID to a shard and a set of hosts + Route(id ident.ID) (uint32, []Host, error) + + // RouteForEach will route a given ID to a shard then execute a + // function for each host in the set of routed hosts + RouteForEach(id ident.ID, forEachFn RouteForEachFn) error + + // RouteShard will route a given shard to a set of hosts + RouteShard(shard uint32) ([]Host, error) + + // RouteShardForEach will route a given shard and execute + // a function for each host in the set of routed hosts + RouteShardForEach(shard uint32, forEachFn RouteForEachFn) error + + // Replicas returns the number of replicas in the topology + Replicas() int + + // MajorityReplicas returns the number of replicas to establish majority in the topology + MajorityReplicas() int +} + +// RouteForEachFn is a function to execute for each routed to host +type RouteForEachFn func(idx int, shard shard.Shard, host Host) + +// StaticConfiguration is used for standing up M3DB with a static topology +type StaticConfiguration struct { + Shards int `yaml:"shards"` + Replicas int `yaml:"replicas"` + Hosts []HostShardConfig `yaml:"hosts"` +} + +// HostShardConfig stores host information for fanout +type HostShardConfig struct { + HostID string `yaml:"hostID"` + ListenAddress string `yaml:"listenAddress"` +} + +// StaticOptions is a set of options for static topology +type StaticOptions interface { + // Validate validates the options + Validate() error + + // SetShardSet sets the ShardSet + SetShardSet(value sharding.ShardSet) StaticOptions + + // ShardSet returns the ShardSet + ShardSet() sharding.ShardSet + + // SetReplicas sets the replicas + SetReplicas(value int) StaticOptions + + // Replicas returns the replicas + Replicas() int + + // SetHostShardSets sets the hostShardSets + SetHostShardSets(value []HostShardSet) StaticOptions + + // HostShardSets returns the hostShardSets + HostShardSets() []HostShardSet +} + +// DynamicOptions is a set of options for dynamic topology +type DynamicOptions interface { + // Validate validates the options + Validate() error + + // SetConfigServiceClient sets the client of ConfigService + SetConfigServiceClient(c client.Client) DynamicOptions + + // ConfigServiceClient returns the client of ConfigService + ConfigServiceClient() client.Client + + // SetServiceID sets the ServiceID for service discovery + SetServiceID(s services.ServiceID) DynamicOptions + + // ServiceID returns the ServiceID for service discovery + ServiceID() services.ServiceID + + // SetServicesOverrideOptions sets the override options for service discovery. + SetServicesOverrideOptions(opts services.OverrideOptions) DynamicOptions + + // ServicesOverrideOptions returns the override options for service discovery. + ServicesOverrideOptions() services.OverrideOptions + + // SetQueryOptions sets the ConfigService query options + SetQueryOptions(value services.QueryOptions) DynamicOptions + + // QueryOptions returns the ConfigService query options + QueryOptions() services.QueryOptions + + // SetInstrumentOptions sets the instrumentation options + SetInstrumentOptions(value instrument.Options) DynamicOptions + + // InstrumentOptions returns the instrumentation options + InstrumentOptions() instrument.Options + + // SetHashGen sets the HashGen function + SetHashGen(h sharding.HashGen) DynamicOptions + + // HashGen returns HashGen function + HashGen() sharding.HashGen +} + +// MapProvider is an interface that can provide +// a topology map. +type MapProvider interface { + // TopologyMap returns a topology map. + TopologyMap() (Map, error) +} + +// StateSnapshot represents a snapshot of the state of the topology at a +// given moment. +type StateSnapshot struct { + Origin Host + MajorityReplicas int + ShardStates ShardStates +} + +// ShardStates maps shard IDs to the state of each of the hosts that own +// that shard. +type ShardStates map[ShardID]map[HostID]HostShardState + +// HostShardState contains the state of a shard as owned by a given host. +type HostShardState struct { + Host Host + ShardState shard.State +} + +// HostID is the string representation of a host ID. +type HostID string + +// ShardID is the ID of a shard. +type ShardID uint32 diff --git a/vendor/github.com/m3db/m3/src/dbnode/tracepoint/tracepoint.go b/vendor/github.com/m3db/m3/src/dbnode/tracepoint/tracepoint.go new file mode 100644 index 00000000..300c1425 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/tracepoint/tracepoint.go @@ -0,0 +1,126 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tracepoint + +// The tracepoint package is used to store operation names for tracing throughout dbnode. +// The naming convention is as follows: + +// `packageName.objectName.method` + +// If there isn't an object, use `packageName.method`. + +const ( + // FetchTagged is the operation name for the tchannelthrift FetchTagged path. + FetchTagged = "tchannelthrift/node.service.FetchTagged" + + // Query is the operation name for the tchannelthrift Query path. + Query = "tchannelthrift/node.service.Query" + + // FetchReadEncoded is the operation name for the tchannelthrift FetchReadEncoded path. + FetchReadEncoded = "tchannelthrift/node.service.FetchReadEncoded" + + // FetchReadResults is the operation name for the tchannelthrift FetchReadResults path. + FetchReadResults = "tchannelthrift/node.service.FetchReadResults" + + // FetchReadSingleResult is the operation name for the tchannelthrift FetchReadSingleResult path. + FetchReadSingleResult = "tchannelthrift/node.service.FetchReadSingleResult" + + // FetchReadSegment is the operation name for the tchannelthrift FetchReadSegment path. + FetchReadSegment = "tchannelthrift/node.service.FetchReadSegment" + + // AggregateTiles is the operation name for the tchannelthrift AggregateTiles path. + AggregateTiles = "tchannelthrift/node.service.AggregateTiles" + + // DBQueryIDs is the operation name for the db QueryIDs path. + DBQueryIDs = "storage.db.QueryIDs" + + // DBAggregateQuery is the operation name for the db AggregateQuery path. + DBAggregateQuery = "storage.db.AggregateQuery" + + // DBReadEncoded is the operation name for the db ReadEncoded path. + DBReadEncoded = "storage.db.ReadEncoded" + + // DBFetchBlocks is the operation name for the db FetchBlocks path. + DBFetchBlocks = "storage.db.FetchBlocks" + + // DBFetchBlocksMetadataV2 is the operation name for the db FetchBlocksMetadataV2 path. + DBFetchBlocksMetadataV2 = "storage.db.FetchBlocksMetadataV2" + + // DBWriteBatch is the operation name for the db WriteBatch path. + DBWriteBatch = "storage.db.WriteBatch" + + // DBAggregateTiles is the operation name for the db AggregateTiles path. + DBAggregateTiles = "storage.db.AggregateTiles" + + // NSQueryIDs is the operation name for the dbNamespace QueryIDs path. + NSQueryIDs = "storage.dbNamespace.QueryIDs" + + // NSPrepareBootstrap is the operation name for the dbNamespace PrepareBootstrap path. + NSPrepareBootstrap = "storage.dbNamespace.PrepareBootstrap" + + // NSBootstrap is the operation name for the dbNamespace Bootstrap path. + NSBootstrap = "storage.dbNamespace.Bootstrap" + + // ShardPrepareBootstrap is the operation name for the dbShard PrepareBootstrap path. + ShardPrepareBootstrap = "storage.dbShard.PrepareBootstrap" + + // ShardBootstrap is the operation name for the dbShard Bootstrap path. + ShardBootstrap = "storage.dbShard.Bootstrap" + + // NSIdxQuery is the operation name for the nsIndex Query path. + NSIdxQuery = "storage.nsIndex.Query" + + // NSIdxAggregateQuery is the operation name for the nsIndex AggregateQuery path. + NSIdxAggregateQuery = "storage.nsIndex.AggregateQuery" + + // NSIdxQueryHelper is the operation name for the nsIndex query path. + NSIdxQueryHelper = "storage.nsIndex.query" + + // NSIdxBlockQuery is the operation name for the nsIndex block query path. + NSIdxBlockQuery = "storage.nsIndex.blockQuery" + + // NSIdxBlockAggregateQuery is the operation name for the nsIndex block aggregate query path. + NSIdxBlockAggregateQuery = "storage.nsIndex.blockAggregateQuery" + + // BlockQuery is the operation name for the index block query path. + BlockQuery = "storage/index.block.Query" + + // BlockAggregate is the operation name for the index block aggregate path. + BlockAggregate = "storage/index.block.Aggregate" + + // BootstrapProcessRun is the operation name for the bootstrap process Run path. + BootstrapProcessRun = "bootstrap.bootstrapProcess.Run" + + // BootstrapperUninitializedSourceRead is the operation for the uninitializedTopologySource Read path. + BootstrapperUninitializedSourceRead = "bootstrapper.uninitialized.uninitializedTopologySource.Read" + + // BootstrapperCommitLogSourceRead is the operation for the commit log Read path. + BootstrapperCommitLogSourceRead = "bootstrapper.commitlog.commitLogSource.Read" + + // BootstrapperPeersSourceRead is the operation for the peers Read path. + BootstrapperPeersSourceRead = "bootstrapper.peers.peersSource.Read" + + // BootstrapperFilesystemSourceRead is the operation for the filesystem Read path. + BootstrapperFilesystemSourceRead = "bootstrapper.fs.filesystemSource.Read" + + // BootstrapperFilesystemSourceMigrator is the operation for filesystem migrator path. + BootstrapperFilesystemSourceMigrator = "bootstrapper.fs.filesystemSource.Migrator" +) diff --git a/vendor/github.com/m3db/m3/src/dbnode/ts/segment.go b/vendor/github.com/m3db/m3/src/dbnode/ts/segment.go new file mode 100644 index 00000000..285fed49 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/ts/segment.go @@ -0,0 +1,188 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ts + +import ( + "bytes" + + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/pool" + + "github.com/m3db/stackadler32" +) + +// Segment represents a binary blob consisting of two byte slices and +// declares whether they should be finalized when the segment is finalized. +type Segment struct { + // Head is the head of the segment. + Head checked.Bytes + // Tail is the tail of the segment. + Tail checked.Bytes + // SegmentFlags declares whether to finalize when finalizing the segment. + Flags SegmentFlags + // checksum is the checksum for the segment. + checksum uint32 +} + +// SegmentFlags describes the option to finalize or not finalize +// bytes in a Segment. +type SegmentFlags uint8 + +const ( + // FinalizeNone specifies to finalize neither of the bytes + FinalizeNone SegmentFlags = 1 << 0 + // FinalizeHead specifies to finalize the head bytes + FinalizeHead SegmentFlags = 1 << 1 + // FinalizeTail specifies to finalize the tail bytes + FinalizeTail SegmentFlags = 1 << 2 +) + +// CalculateChecksum calculates and sets the 32-bit checksum for +// this segment avoiding any allocations. +func (s *Segment) CalculateChecksum() uint32 { + if s.checksum != 0 { + return s.checksum + } + d := stackadler32.NewDigest() + if s.Head != nil { + d = d.Update(s.Head.Bytes()) + } + if s.Tail != nil { + d = d.Update(s.Tail.Bytes()) + } + s.checksum = d.Sum32() + return s.checksum +} + +// NewSegment will create a new segment and increment the refs to +// head and tail if they are non-nil. When finalized the segment will +// also finalize the byte slices if FinalizeBytes is passed. +func NewSegment( + head, tail checked.Bytes, + checksum uint32, + flags SegmentFlags, +) Segment { + if head != nil { + head.IncRef() + } + if tail != nil { + tail.IncRef() + } + return Segment{ + Head: head, + Tail: tail, + Flags: flags, + checksum: checksum, + } +} + +// Len returns the length of the head and tail. +func (s *Segment) Len() int { + var total int + if s.Head != nil { + total += s.Head.Len() + } + if s.Tail != nil { + total += s.Tail.Len() + } + return total +} + +// Equal returns if this segment is equal to another. +// WARNING: This should only be used in code paths not +// executed often as it allocates bytes to concat each +// segment head and tail together before comparing the contents. +func (s *Segment) Equal(other *Segment) bool { + var head, tail, otherHead, otherTail []byte + if s.Head != nil { + head = s.Head.Bytes() + } + if s.Tail != nil { + tail = s.Tail.Bytes() + } + if other.Head != nil { + otherHead = other.Head.Bytes() + } + if other.Tail != nil { + otherTail = other.Tail.Bytes() + } + return bytes.Equal(append(head, tail...), append(otherHead, otherTail...)) +} + +// Finalize will finalize the segment by decrementing refs to head and +// tail if they are non-nil. +func (s *Segment) Finalize() { + if s.Head != nil { + s.Head.DecRef() + if s.Flags&FinalizeHead == FinalizeHead { + s.Head.Finalize() + } + } + s.Head = nil + if s.Tail != nil { + s.Tail.DecRef() + if s.Flags&FinalizeTail == FinalizeTail { + s.Tail.Finalize() + } + } + s.Tail = nil +} + +// Clone will create a copy of this segment with an optional bytes pool. +func (s *Segment) Clone(pool pool.CheckedBytesPool) Segment { + var ( + checkedHead, checkedTail checked.Bytes + tail []byte + ) + + head := s.Head.Bytes() + if s.Tail != nil { + tail = s.Tail.Bytes() + } + + if pool != nil { + checkedHead = pool.Get(len(head)) + checkedHead.IncRef() + checkedHead.AppendAll(head) + checkedHead.DecRef() + + if tail != nil { + checkedTail = pool.Get(len(tail)) + checkedTail.IncRef() + checkedTail.AppendAll(tail) + checkedTail.DecRef() + } + } else { + ch := make([]byte, len(head)) + copy(ch, head) + checkedHead = checked.NewBytes(ch, nil) + + if tail != nil { + ct := make([]byte, len(tail)) + copy(ct, tail) + checkedTail = checked.NewBytes(ct, nil) + } + } + + // NB: new segment is always finalizeable. + return NewSegment(checkedHead, checkedTail, + s.CalculateChecksum(), FinalizeHead&FinalizeTail) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/ts/types.go b/vendor/github.com/m3db/m3/src/dbnode/ts/types.go new file mode 100644 index 00000000..0460d9a2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/ts/types.go @@ -0,0 +1,66 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ts + +import ( + "time" + + "github.com/m3db/m3/src/x/ident" + xtime "github.com/m3db/m3/src/x/time" +) + +// Series describes a series. +type Series struct { + // UniqueIndex is the unique index assigned to this series (only valid + // on a per-process basis). + UniqueIndex uint64 + + // Namespace is the namespace the series belongs to. + Namespace ident.ID + + // ID is the series identifier. + ID ident.ID + + // EncodedTags are the series encoded tags, if set then call sites can + // avoid needing to encoded the tags from the series tags provided. + EncodedTags EncodedTags + + // Shard is the shard the series belongs to. + Shard uint32 +} + +// A Datapoint is a single data value reported at a given time. +type Datapoint struct { + Timestamp time.Time + TimestampNanos xtime.UnixNano + Value float64 +} + +// Equal returns whether one Datapoint is equal to another +func (d Datapoint) Equal(x Datapoint) bool { + return d.Timestamp.Equal(x.Timestamp) && d.Value == x.Value +} + +// EncodedTags represents the encoded tags for the series. +type EncodedTags []byte + +// Annotation represents information used to annotate datapoints. +type Annotation []byte diff --git a/vendor/github.com/m3db/m3/src/dbnode/x/xio/block_reader.go b/vendor/github.com/m3db/m3/src/dbnode/x/xio/block_reader.go new file mode 100644 index 00000000..37d561d0 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/x/xio/block_reader.go @@ -0,0 +1,97 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package xio + +import ( + "time" + + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/x/pool" +) + +// CloneBlock returns a clone of the block with the underlying data reset +func (b BlockReader) CloneBlock(pool pool.CheckedBytesPool) (BlockReader, error) { + sr, err := b.SegmentReader.Clone(pool) + if err != nil { + return EmptyBlockReader, err + } + return BlockReader{ + SegmentReader: sr, + Start: b.Start, + BlockSize: b.BlockSize, + }, nil +} + +// IsEmpty returns true for the empty block +func (b BlockReader) IsEmpty() bool { + return b.SegmentReader == nil && b.Start.Equal(timeZero) && b.BlockSize == 0 +} + +// IsNotEmpty returns false for the empty block +func (b BlockReader) IsNotEmpty() bool { + return !b.IsEmpty() +} + +// ResetWindowed resets the underlying reader window, as well as start time and blockSize for the block +func (b *BlockReader) ResetWindowed(segment ts.Segment, start time.Time, blockSize time.Duration) { + b.Reset(segment) + b.Start = start + b.BlockSize = blockSize +} + +// FilterEmptyBlockReadersSliceOfSlicesInPlace filters a [][]BlockReader in place (I.E by modifying +// the existing data structures instead of allocating new ones) such that the returned [][]BlockReader +// will only contain BlockReaders that contain non-empty segments. +// +// Note that if any of the Block/Segment readers are backed by async implementations then this function +// will not return until all of the async execution has completed. +func FilterEmptyBlockReadersSliceOfSlicesInPlace(brSliceOfSlices [][]BlockReader) ([][]BlockReader, error) { + filteredSliceOfSlices := brSliceOfSlices[:0] + for _, brSlice := range brSliceOfSlices { + filteredBrSlice, err := FilterEmptyBlockReadersInPlace(brSlice) + if err != nil { + return nil, err + } + if len(filteredBrSlice) > 0 { + filteredSliceOfSlices = append(filteredSliceOfSlices, filteredBrSlice) + } + } + return filteredSliceOfSlices, nil +} + +// FilterEmptyBlockReadersInPlace is the same as FilterEmptyBlockReadersSliceOfSlicesInPlace except for +// one dimensional slices instead of two. +func FilterEmptyBlockReadersInPlace(brs []BlockReader) ([]BlockReader, error) { + filtered := brs[:0] + for _, br := range brs { + if br.SegmentReader == nil { + continue + } + segment, err := br.Segment() + if err != nil { + return nil, err + } + if segment.Len() > 0 { + filtered = append(filtered, br) + } + } + return filtered, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/x/xio/io_mock.go b/vendor/github.com/m3db/m3/src/dbnode/x/xio/io_mock.go new file mode 100644 index 00000000..daa99ba4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/x/xio/io_mock.go @@ -0,0 +1,187 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/dbnode/x/xio (interfaces: SegmentReader,SegmentReaderPool) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package xio is a generated GoMock package. +package xio + +import ( + "reflect" + + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/x/pool" + + "github.com/golang/mock/gomock" +) + +// MockSegmentReader is a mock of SegmentReader interface +type MockSegmentReader struct { + ctrl *gomock.Controller + recorder *MockSegmentReaderMockRecorder +} + +// MockSegmentReaderMockRecorder is the mock recorder for MockSegmentReader +type MockSegmentReaderMockRecorder struct { + mock *MockSegmentReader +} + +// NewMockSegmentReader creates a new mock instance +func NewMockSegmentReader(ctrl *gomock.Controller) *MockSegmentReader { + mock := &MockSegmentReader{ctrl: ctrl} + mock.recorder = &MockSegmentReaderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSegmentReader) EXPECT() *MockSegmentReaderMockRecorder { + return m.recorder +} + +// Clone mocks base method +func (m *MockSegmentReader) Clone(arg0 pool.CheckedBytesPool) (SegmentReader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Clone", arg0) + ret0, _ := ret[0].(SegmentReader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Clone indicates an expected call of Clone +func (mr *MockSegmentReaderMockRecorder) Clone(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockSegmentReader)(nil).Clone), arg0) +} + +// Finalize mocks base method +func (m *MockSegmentReader) Finalize() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Finalize") +} + +// Finalize indicates an expected call of Finalize +func (mr *MockSegmentReaderMockRecorder) Finalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finalize", reflect.TypeOf((*MockSegmentReader)(nil).Finalize)) +} + +// Read mocks base method +func (m *MockSegmentReader) Read(arg0 []byte) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Read", arg0) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Read indicates an expected call of Read +func (mr *MockSegmentReaderMockRecorder) Read(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Read", reflect.TypeOf((*MockSegmentReader)(nil).Read), arg0) +} + +// Reset mocks base method +func (m *MockSegmentReader) Reset(arg0 ts.Segment) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", arg0) +} + +// Reset indicates an expected call of Reset +func (mr *MockSegmentReaderMockRecorder) Reset(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockSegmentReader)(nil).Reset), arg0) +} + +// Segment mocks base method +func (m *MockSegmentReader) Segment() (ts.Segment, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Segment") + ret0, _ := ret[0].(ts.Segment) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Segment indicates an expected call of Segment +func (mr *MockSegmentReaderMockRecorder) Segment() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Segment", reflect.TypeOf((*MockSegmentReader)(nil).Segment)) +} + +// MockSegmentReaderPool is a mock of SegmentReaderPool interface +type MockSegmentReaderPool struct { + ctrl *gomock.Controller + recorder *MockSegmentReaderPoolMockRecorder +} + +// MockSegmentReaderPoolMockRecorder is the mock recorder for MockSegmentReaderPool +type MockSegmentReaderPoolMockRecorder struct { + mock *MockSegmentReaderPool +} + +// NewMockSegmentReaderPool creates a new mock instance +func NewMockSegmentReaderPool(ctrl *gomock.Controller) *MockSegmentReaderPool { + mock := &MockSegmentReaderPool{ctrl: ctrl} + mock.recorder = &MockSegmentReaderPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSegmentReaderPool) EXPECT() *MockSegmentReaderPoolMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockSegmentReaderPool) Get() SegmentReader { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(SegmentReader) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockSegmentReaderPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockSegmentReaderPool)(nil).Get)) +} + +// Init mocks base method +func (m *MockSegmentReaderPool) Init() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init") +} + +// Init indicates an expected call of Init +func (mr *MockSegmentReaderPoolMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockSegmentReaderPool)(nil).Init)) +} + +// Put mocks base method +func (m *MockSegmentReaderPool) Put(arg0 SegmentReader) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", arg0) +} + +// Put indicates an expected call of Put +func (mr *MockSegmentReaderPoolMockRecorder) Put(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockSegmentReaderPool)(nil).Put), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/x/xio/null.go b/vendor/github.com/m3db/m3/src/dbnode/x/xio/null.go new file mode 100644 index 00000000..81fdebad --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/x/xio/null.go @@ -0,0 +1,38 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package xio + +import ( + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/x/pool" +) + +type nullSegmentReader struct{} + +func (r nullSegmentReader) Read(_ []byte) (n int, err error) { return 0, nil } +func (r nullSegmentReader) Segment() (ts.Segment, error) { return ts.Segment{}, nil } +func (r nullSegmentReader) Reset(_ ts.Segment) {} +func (r nullSegmentReader) Finalize() {} +func (r nullSegmentReader) Clone( + _ pool.CheckedBytesPool, +) (SegmentReader, error) { + return r, nil +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/x/xio/reader_slice_of_slices_from_block_readers_iterator.go b/vendor/github.com/m3db/m3/src/dbnode/x/xio/reader_slice_of_slices_from_block_readers_iterator.go new file mode 100644 index 00000000..9df35045 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/x/xio/reader_slice_of_slices_from_block_readers_iterator.go @@ -0,0 +1,114 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package xio + +import ( + "time" +) + +type readerSliceOfSlicesIterator struct { + blocks [][]BlockReader + idx int + len int + closed bool +} + +// NewReaderSliceOfSlicesFromBlockReadersIterator creates a new reader slice of slices iterator +func NewReaderSliceOfSlicesFromBlockReadersIterator( + blocks [][]BlockReader, +) ReaderSliceOfSlicesFromBlockReadersIterator { + it := &readerSliceOfSlicesIterator{} + it.Reset(blocks) + return it +} + +func (it *readerSliceOfSlicesIterator) Next() bool { + if it.idx >= it.len-1 { + return false + } + it.idx++ + return true +} + +var timeZero = time.Time{} + +// ensure readerSliceOfSlicesIterator implements ReaderSliceOfSlicesIterator +var _ ReaderSliceOfSlicesIterator = &readerSliceOfSlicesIterator{} + +func (it *readerSliceOfSlicesIterator) CurrentReaders() (int, time.Time, time.Duration) { + if len(it.blocks) < it.arrayIdx() { + return 0, timeZero, 0 + } + currentLen := len(it.blocks[it.arrayIdx()]) + if currentLen == 0 { + return 0, timeZero, 0 + } + currBlock := it.blocks[it.arrayIdx()][0] + return currentLen, currBlock.Start, currBlock.BlockSize +} + +func (it *readerSliceOfSlicesIterator) CurrentReaderAt(idx int) BlockReader { + return it.blocks[it.arrayIdx()][idx] +} + +func (it *readerSliceOfSlicesIterator) Reset(blocks [][]BlockReader) { + it.blocks = blocks + it.resetIndex() + it.len = len(blocks) + it.closed = false +} + +func (it *readerSliceOfSlicesIterator) Close() { + if it.closed { + return + } + it.closed = true +} + +func (it *readerSliceOfSlicesIterator) arrayIdx() int { + idx := it.idx + if idx == -1 { + idx = 0 + } + return idx +} + +func (it *readerSliceOfSlicesIterator) Size() (int, error) { + size := 0 + for _, blocks := range it.blocks { + for _, blockAtTime := range blocks { + seg, err := blockAtTime.Segment() + if err != nil { + return 0, err + } + size += seg.Len() + } + } + return size, nil +} + +func (it *readerSliceOfSlicesIterator) Rewind() { + it.resetIndex() +} + +func (it *readerSliceOfSlicesIterator) resetIndex() { + it.idx = -1 +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/x/xio/segment_reader.go b/vendor/github.com/m3db/m3/src/dbnode/x/xio/segment_reader.go new file mode 100644 index 00000000..352c8fee --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/x/xio/segment_reader.go @@ -0,0 +1,104 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package xio + +import ( + "io" + + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/x/pool" +) + +type segmentReader struct { + segment ts.Segment + lazyHead []byte + lazyTail []byte + si int + pool SegmentReaderPool +} + +// NewSegmentReader creates a new segment reader along with a specified segment. +func NewSegmentReader(segment ts.Segment) SegmentReader { + return &segmentReader{segment: segment} +} + +func (sr *segmentReader) Clone( + pool pool.CheckedBytesPool, +) (SegmentReader, error) { + return NewSegmentReader(sr.segment.Clone(pool)), nil +} + +func (sr *segmentReader) Read(b []byte) (int, error) { + if len(b) == 0 { + return 0, nil + } + + if b := sr.segment.Head; b != nil && len(sr.lazyHead) == 0 { + sr.lazyHead = b.Bytes() + } + if b := sr.segment.Tail; b != nil && len(sr.lazyTail) == 0 { + sr.lazyTail = b.Bytes() + } + + nh, nt := len(sr.lazyHead), len(sr.lazyTail) + if sr.si >= nh+nt { + return 0, io.EOF + } + n := 0 + if sr.si < nh { + nRead := copy(b, sr.lazyHead[sr.si:]) + sr.si += nRead + n += nRead + if n == len(b) { + return n, nil + } + } + if sr.si < nh+nt { + nRead := copy(b[n:], sr.lazyTail[sr.si-nh:]) + sr.si += nRead + n += nRead + } + if n == 0 { + return 0, io.EOF + } + return n, nil +} + +func (sr *segmentReader) Segment() (ts.Segment, error) { + return sr.segment, nil +} + +func (sr *segmentReader) Reset(segment ts.Segment) { + sr.segment = segment + sr.si = 0 + sr.lazyHead = sr.lazyHead[:0] + sr.lazyTail = sr.lazyTail[:0] +} + +func (sr *segmentReader) Finalize() { + sr.segment.Finalize() + sr.lazyHead = nil + sr.lazyTail = nil + + if pool := sr.pool; pool != nil { + pool.Put(sr) + } +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/x/xio/segment_reader_pool.go b/vendor/github.com/m3db/m3/src/dbnode/x/xio/segment_reader_pool.go new file mode 100644 index 00000000..1bdd9746 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/x/xio/segment_reader_pool.go @@ -0,0 +1,51 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package xio + +import ( + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/x/pool" +) + +type segmentReaderPool struct { + pool pool.ObjectPool +} + +// NewSegmentReaderPool creates a new pool +func NewSegmentReaderPool(opts pool.ObjectPoolOptions) SegmentReaderPool { + return &segmentReaderPool{pool: pool.NewObjectPool(opts)} +} + +func (p *segmentReaderPool) Init() { + p.pool.Init(func() interface{} { + sr := NewSegmentReader(ts.Segment{}).(*segmentReader) + sr.pool = p + return sr + }) +} + +func (p *segmentReaderPool) Get() SegmentReader { + return p.pool.Get().(SegmentReader) +} + +func (p *segmentReaderPool) Put(sr SegmentReader) { + p.pool.Put(sr) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/x/xio/types.go b/vendor/github.com/m3db/m3/src/dbnode/x/xio/types.go new file mode 100644 index 00000000..09c18dca --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/x/xio/types.go @@ -0,0 +1,102 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package xio + +import ( + "io" + "time" + + "github.com/m3db/m3/src/dbnode/ts" + "github.com/m3db/m3/src/x/pool" + "github.com/m3db/m3/src/x/resource" +) + +// BlockReader represents a block reader backed by a +// SegmentReader with start time and block size. +type BlockReader struct { + SegmentReader + Start time.Time + BlockSize time.Duration +} + +// EmptyBlockReader represents the default block reader. +var EmptyBlockReader = BlockReader{} + +// SegmentReader implements the io reader interface backed by a segment. +type SegmentReader interface { + io.Reader + resource.Finalizer + + // Segment gets the segment read by this reader. + Segment() (ts.Segment, error) + + // Reset resets the reader to read a new segment. + Reset(segment ts.Segment) + + // Clone returns a clone of a copy of the underlying data reset, + // with an optional byte pool to reduce allocations. + Clone(pool pool.CheckedBytesPool) (SegmentReader, error) +} + +// SegmentReaderPool provides a pool for segment readers. +type SegmentReaderPool interface { + // Init will initialize the pool. + Init() + + // Get provides a segment reader from the pool. + Get() SegmentReader + + // Put returns a segment reader to the pool. + Put(sr SegmentReader) +} + +// ReaderSliceOfSlicesIterator is an iterator that iterates +// through an array of reader arrays. +type ReaderSliceOfSlicesIterator interface { + // Next moves to the next item. + Next() bool + + // CurrentReaders returns the current length, start time, and block size. + CurrentReaders() (length int, start time.Time, blockSize time.Duration) + + // CurrentReaderAt returns the current reader in the slice + // of readers at an index. + CurrentReaderAt(idx int) BlockReader + + // Close closes the iterator. + Close() + + // Size gives the size of bytes in this iterator. + Size() (int, error) + + // Rewind returns the iterator to the beginning. + // This operation is invalid if any of the block readers have been read. + Rewind() +} + +// ReaderSliceOfSlicesFromBlockReadersIterator is an iterator +// that iterates through an array of reader arrays. +type ReaderSliceOfSlicesFromBlockReadersIterator interface { + ReaderSliceOfSlicesIterator + + // Reset resets the iterator with a new array of block readers arrays. + Reset(blocks [][]BlockReader) +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/x/xpool/pool.go b/vendor/github.com/m3db/m3/src/dbnode/x/xpool/pool.go new file mode 100644 index 00000000..d5d93945 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/x/xpool/pool.go @@ -0,0 +1,63 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package xpool + +import ( + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/pool" +) + +type checkedPool struct { + pool pool.ObjectPool + opts checked.BytesOptions +} + +// NewCheckedBytesWrapperPool returns a new CheckedBytesWrapperPool with the +// defined size. +func NewCheckedBytesWrapperPool(popts pool.ObjectPoolOptions) CheckedBytesWrapperPool { + p := pool.NewObjectPool(popts) + opts := checked.NewBytesOptions().SetFinalizer( + checked.BytesFinalizerFn(func(b checked.Bytes) { + b.IncRef() + b.Reset(nil) + b.DecRef() + p.Put(b) + })) + + return &checkedPool{ + pool: p, + opts: opts, + } +} + +func (p *checkedPool) Init() { + p.pool.Init(func() interface{} { + return checked.NewBytes(nil, p.opts) + }) +} + +func (p *checkedPool) Get(b []byte) checked.Bytes { + checkedBytes := p.pool.Get().(checked.Bytes) + checkedBytes.IncRef() + checkedBytes.Reset(b) + checkedBytes.DecRef() + return checkedBytes +} diff --git a/vendor/github.com/m3db/m3/src/dbnode/x/xpool/types.go b/vendor/github.com/m3db/m3/src/dbnode/x/xpool/types.go new file mode 100644 index 00000000..0a038080 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/dbnode/x/xpool/types.go @@ -0,0 +1,37 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package xpool + +import ( + "github.com/m3db/m3/src/x/checked" +) + +// CheckedBytesWrapperPool allows users to wrap []byte which have been +// allocated by other libraries (e.g. thrift/t-channel) with a checked.Bytes +// abstraction. This is to ensure we reference count usage, and more importantly, +// can interop with the rest of the M3DB codebase (which requires checked.Bytes). +// NB: This pool doesn't require a Put method, as Finalizing the bytes returned from +// Get does the Put internally. +type CheckedBytesWrapperPool interface { + Init() + + Get([]byte) checked.Bytes +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/doc/doc_arraypool_gen.go b/vendor/github.com/m3db/m3/src/m3ninx/doc/doc_arraypool_gen.go new file mode 100644 index 00000000..224ad8ca --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/doc/doc_arraypool_gen.go @@ -0,0 +1,127 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package doc + +import ( + "github.com/m3db/m3/src/x/pool" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// DocumentArrayPool provides a pool for document slices. +type DocumentArrayPool interface { + // Init initializes the array pool, it needs to be called + // before Get/Put use. + Init() + + // Get returns the a slice from the pool. + Get() []Document + + // Put returns the provided slice to the pool. + Put(elems []Document) +} + +type DocumentFinalizeFn func([]Document) []Document + +type DocumentArrayPoolOpts struct { + Options pool.ObjectPoolOptions + Capacity int + MaxCapacity int + FinalizeFn DocumentFinalizeFn +} + +type DocumentArrPool struct { + opts DocumentArrayPoolOpts + pool pool.ObjectPool +} + +func NewDocumentArrayPool(opts DocumentArrayPoolOpts) DocumentArrayPool { + if opts.FinalizeFn == nil { + opts.FinalizeFn = defaultDocumentFinalizerFn + } + p := pool.NewObjectPool(opts.Options) + return &DocumentArrPool{opts, p} +} + +func (p *DocumentArrPool) Init() { + p.pool.Init(func() interface{} { + return make([]Document, 0, p.opts.Capacity) + }) +} + +func (p *DocumentArrPool) Get() []Document { + return p.pool.Get().([]Document) +} + +func (p *DocumentArrPool) Put(arr []Document) { + arr = p.opts.FinalizeFn(arr) + if max := p.opts.MaxCapacity; max > 0 && cap(arr) > max { + return + } + p.pool.Put(arr) +} + +func defaultDocumentFinalizerFn(elems []Document) []Document { + var empty Document + for i := range elems { + elems[i] = empty + } + elems = elems[:0] + return elems +} + +type DocumentArr []Document + +func (elems DocumentArr) grow(n int) []Document { + if cap(elems) < n { + elems = make([]Document, n) + } + elems = elems[:n] + // following compiler optimized memcpy impl + // https://github.com/golang/go/wiki/CompilerOptimizations#optimized-memclr + var empty Document + for i := range elems { + elems[i] = empty + } + return elems +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/doc/doc_mock.go b/vendor/github.com/m3db/m3/src/m3ninx/doc/doc_mock.go new file mode 100644 index 00000000..0cec3d86 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/doc/doc_mock.go @@ -0,0 +1,110 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/m3ninx/doc/types.go + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package doc is a generated GoMock package. +package doc + +import ( + "reflect" + + "github.com/golang/mock/gomock" +) + +// MockIterator is a mock of Iterator interface +type MockIterator struct { + ctrl *gomock.Controller + recorder *MockIteratorMockRecorder +} + +// MockIteratorMockRecorder is the mock recorder for MockIterator +type MockIteratorMockRecorder struct { + mock *MockIterator +} + +// NewMockIterator creates a new mock instance +func NewMockIterator(ctrl *gomock.Controller) *MockIterator { + mock := &MockIterator{ctrl: ctrl} + mock.recorder = &MockIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIterator) EXPECT() *MockIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockIterator)(nil).Next)) +} + +// Current mocks base method +func (m *MockIterator) Current() Document { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(Document) + return ret0 +} + +// Current indicates an expected call of Current +func (mr *MockIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockIterator) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockIterator)(nil).Close)) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/doc/document.go b/vendor/github.com/m3db/m3/src/m3ninx/doc/document.go new file mode 100644 index 00000000..164c0f21 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/doc/document.go @@ -0,0 +1,214 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package doc + +import ( + "bytes" + "errors" + "fmt" + "sort" + "unicode/utf8" +) + +var ( + errReservedFieldName = fmt.Errorf("'%s' is a reserved field name", IDReservedFieldName) + // ErrEmptyDocument is an error for an empty document. + ErrEmptyDocument = errors.New("document cannot be empty") +) + +// IDReservedFieldName is the field name reserved for IDs. +var IDReservedFieldName = []byte("_m3ninx_id") + +// Field represents a field in a document. It is composed of a name and a value. +type Field struct { + Name []byte + Value []byte +} + +// Fields is a list of fields. +type Fields []Field + +func (f Fields) Len() int { + return len(f) +} + +func (f Fields) Less(i, j int) bool { + l, r := f[i], f[j] + + c := bytes.Compare(l.Name, r.Name) + switch { + case c < 0: + return true + case c > 0: + return false + } + + c = bytes.Compare(l.Value, r.Value) + switch { + case c < 0: + return true + case c > 0: + return false + } + + return true +} + +func (f Fields) Swap(i, j int) { + f[i], f[j] = f[j], f[i] +} + +func (f Fields) shallowCopy() Fields { + cp := make([]Field, 0, len(f)) + for _, fld := range f { + cp = append(cp, Field{ + Name: fld.Name, + Value: fld.Value, + }) + } + return cp +} + +// Document represents a document to be indexed. +type Document struct { + ID []byte + Fields []Field +} + +// Get returns the value of the specified field name in the document if it exists. +func (d Document) Get(fieldName []byte) ([]byte, bool) { + for _, f := range d.Fields { + if bytes.Equal(fieldName, f.Name) { + return f.Value, true + } + } + return nil, false +} + +// Compare returns an integer comparing two documents. The result will be 0 if the documents +// are equal, -1 if d is ordered before other, and 1 if d is ordered aftered other. +func (d Document) Compare(other Document) int { + if c := bytes.Compare(d.ID, other.ID); c != 0 { + return c + } + + l, r := Fields(d.Fields), Fields(other.Fields) + + // Make a shallow copy of the Fields so we don't mutate the document. + if !sort.IsSorted(l) { + l = l.shallowCopy() + sort.Sort(l) + } + if !sort.IsSorted(r) { + r = r.shallowCopy() + sort.Sort(r) + } + + min := len(l) + if len(r) < min { + min = len(r) + } + + for i := 0; i < min; i++ { + if c := bytes.Compare(l[i].Name, r[i].Name); c != 0 { + return c + } + if c := bytes.Compare(l[i].Value, r[i].Value); c != 0 { + return c + } + } + + if len(l) < len(r) { + return -1 + } else if len(l) > len(r) { + return 1 + } + + return 0 +} + +// Equal returns a bool indicating whether d is equal to other. +func (d Document) Equal(other Document) bool { + return d.Compare(other) == 0 +} + +// Validate returns a bool indicating whether the document is valid. +func (d Document) Validate() error { + if len(d.Fields) == 0 && !d.HasID() { + return ErrEmptyDocument + } + + if !utf8.Valid(d.ID) { + return fmt.Errorf("document has invalid ID: id=%v, id_hex=%x", d.ID, d.ID) + } + + for _, f := range d.Fields { + // TODO: Should we enforce uniqueness of field names? + if !utf8.Valid(f.Name) { + return fmt.Errorf("document has invalid field name: name=%v, name_hex=%x", + f.Name, f.Name) + } + + if bytes.Equal(f.Name, IDReservedFieldName) { + return errReservedFieldName + } + + if !utf8.Valid(f.Value) { + return fmt.Errorf("document has invalid field value: value=%v, value_hex=%x", + f.Value, f.Value) + } + } + + return nil +} + +// HasID returns a bool indicating whether the document has an ID or not. +func (d Document) HasID() bool { + return len(d.ID) > 0 +} + +func (d Document) String() string { + var buf bytes.Buffer + for i, f := range d.Fields { + buf.WriteString(fmt.Sprintf("%s: %s", f.Name, f.Value)) + if i != len(d.Fields)-1 { + buf.WriteString(", ") + } + } + return fmt.Sprintf("{id: %s, fields: {%s}}", d.ID, buf.String()) +} + +// Documents is a list of documents. +type Documents []Document + +func (ds Documents) Len() int { + return len(ds) +} + +func (ds Documents) Less(i, j int) bool { + l, r := ds[i], ds[j] + + return l.Compare(r) < 1 +} + +func (ds Documents) Swap(i, j int) { + ds[i], ds[j] = ds[j], ds[i] +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/doc/document_matcher.go b/vendor/github.com/m3db/m3/src/m3ninx/doc/document_matcher.go new file mode 100644 index 00000000..deba71d7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/doc/document_matcher.go @@ -0,0 +1,51 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package doc + +import ( + "fmt" + "reflect" + + "github.com/golang/mock/gomock" +) + +// DocumentMatcher matches a given document. +type DocumentMatcher interface { + gomock.Matcher +} + +// NewDocumentMatcher returns a new DocumentMatcher. +func NewDocumentMatcher(d Document) DocumentMatcher { + return docMatcher{d} +} + +type docMatcher struct { + d Document +} + +func (dm docMatcher) Matches(x interface{}) bool { + return reflect.DeepEqual(dm.d, x) + +} + +func (dm docMatcher) String() string { + return fmt.Sprintf("doc is %+v", dm.d) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/doc/types.go b/vendor/github.com/m3db/m3/src/m3ninx/doc/types.go new file mode 100644 index 00000000..76fc04e3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/doc/types.go @@ -0,0 +1,41 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package doc + +// Iterator provides an iterator over a collection of documents. It is NOT safe for multiple +// goroutines to invoke methods on an Iterator simultaneously. +type Iterator interface { + // Next returns a bool indicating if the iterator has any more documents + // to return. + Next() bool + + // Current returns the current document. It is only safe to call Current immediately + // after a call to Next confirms there are more elements remaining. The Document + // returned from Current is only valid until the following call to Next(). Callers + // should copy the Document if they need it live longer. + Current() Document + + // Err returns any errors encountered during iteration. + Err() error + + // Close releases any internal resources used by the iterator. + Close() error +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.pb.go b/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.pb.go new file mode 100644 index 00000000..6580b9a9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.pb.go @@ -0,0 +1,554 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.proto + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* + Package fswriter is a generated protocol buffer package. + + It is generated from these files: + github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.proto + + It has these top-level messages: + Metadata + FieldData +*/ +package fswriter + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type SegmentType int32 + +const ( + SegmentType_FST_SEGMENT_TYPE SegmentType = 0 +) + +var SegmentType_name = map[int32]string{ + 0: "FST_SEGMENT_TYPE", +} +var SegmentType_value = map[string]int32{ + "FST_SEGMENT_TYPE": 0, +} + +func (x SegmentType) String() string { + return proto.EnumName(SegmentType_name, int32(x)) +} +func (SegmentType) EnumDescriptor() ([]byte, []int) { return fileDescriptorFswriter, []int{0} } + +type FSTSegmentFileType int32 + +const ( + FSTSegmentFileType_DOCUMENTS_INDEX FSTSegmentFileType = 0 + FSTSegmentFileType_DOCUMENTS_DATA FSTSegmentFileType = 1 + FSTSegmentFileType_POSTINGS_DATA FSTSegmentFileType = 2 + FSTSegmentFileType_FST_TERMS FSTSegmentFileType = 3 + FSTSegmentFileType_FST_FIELDS FSTSegmentFileType = 4 +) + +var FSTSegmentFileType_name = map[int32]string{ + 0: "DOCUMENTS_INDEX", + 1: "DOCUMENTS_DATA", + 2: "POSTINGS_DATA", + 3: "FST_TERMS", + 4: "FST_FIELDS", +} +var FSTSegmentFileType_value = map[string]int32{ + "DOCUMENTS_INDEX": 0, + "DOCUMENTS_DATA": 1, + "POSTINGS_DATA": 2, + "FST_TERMS": 3, + "FST_FIELDS": 4, +} + +func (x FSTSegmentFileType) String() string { + return proto.EnumName(FSTSegmentFileType_name, int32(x)) +} +func (FSTSegmentFileType) EnumDescriptor() ([]byte, []int) { return fileDescriptorFswriter, []int{1} } + +type PostingsFormat int32 + +const ( + PostingsFormat_PILOSAV1_POSTINGS_FORMAT PostingsFormat = 0 +) + +var PostingsFormat_name = map[int32]string{ + 0: "PILOSAV1_POSTINGS_FORMAT", +} +var PostingsFormat_value = map[string]int32{ + "PILOSAV1_POSTINGS_FORMAT": 0, +} + +func (x PostingsFormat) String() string { + return proto.EnumName(PostingsFormat_name, int32(x)) +} +func (PostingsFormat) EnumDescriptor() ([]byte, []int) { return fileDescriptorFswriter, []int{2} } + +type Metadata struct { + PostingsFormat PostingsFormat `protobuf:"varint,1,opt,name=postingsFormat,proto3,enum=fswriter.PostingsFormat" json:"postingsFormat,omitempty"` + NumDocs int64 `protobuf:"varint,2,opt,name=numDocs,proto3" json:"numDocs,omitempty"` +} + +func (m *Metadata) Reset() { *m = Metadata{} } +func (m *Metadata) String() string { return proto.CompactTextString(m) } +func (*Metadata) ProtoMessage() {} +func (*Metadata) Descriptor() ([]byte, []int) { return fileDescriptorFswriter, []int{0} } + +func (m *Metadata) GetPostingsFormat() PostingsFormat { + if m != nil { + return m.PostingsFormat + } + return PostingsFormat_PILOSAV1_POSTINGS_FORMAT +} + +func (m *Metadata) GetNumDocs() int64 { + if m != nil { + return m.NumDocs + } + return 0 +} + +// additional metadata stored per Field in the corpus. +type FieldData struct { + // postingsOffset for the pl corresponding to the union of all documents + // which have a given field. + FieldPostingsListOffset uint64 `protobuf:"varint,1,opt,name=fieldPostingsListOffset,proto3" json:"fieldPostingsListOffset,omitempty"` +} + +func (m *FieldData) Reset() { *m = FieldData{} } +func (m *FieldData) String() string { return proto.CompactTextString(m) } +func (*FieldData) ProtoMessage() {} +func (*FieldData) Descriptor() ([]byte, []int) { return fileDescriptorFswriter, []int{1} } + +func (m *FieldData) GetFieldPostingsListOffset() uint64 { + if m != nil { + return m.FieldPostingsListOffset + } + return 0 +} + +func init() { + proto.RegisterType((*Metadata)(nil), "fswriter.Metadata") + proto.RegisterType((*FieldData)(nil), "fswriter.FieldData") + proto.RegisterEnum("fswriter.SegmentType", SegmentType_name, SegmentType_value) + proto.RegisterEnum("fswriter.FSTSegmentFileType", FSTSegmentFileType_name, FSTSegmentFileType_value) + proto.RegisterEnum("fswriter.PostingsFormat", PostingsFormat_name, PostingsFormat_value) +} +func (m *Metadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Metadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.PostingsFormat != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintFswriter(dAtA, i, uint64(m.PostingsFormat)) + } + if m.NumDocs != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintFswriter(dAtA, i, uint64(m.NumDocs)) + } + return i, nil +} + +func (m *FieldData) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FieldData) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.FieldPostingsListOffset != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintFswriter(dAtA, i, uint64(m.FieldPostingsListOffset)) + } + return i, nil +} + +func encodeVarintFswriter(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Metadata) Size() (n int) { + var l int + _ = l + if m.PostingsFormat != 0 { + n += 1 + sovFswriter(uint64(m.PostingsFormat)) + } + if m.NumDocs != 0 { + n += 1 + sovFswriter(uint64(m.NumDocs)) + } + return n +} + +func (m *FieldData) Size() (n int) { + var l int + _ = l + if m.FieldPostingsListOffset != 0 { + n += 1 + sovFswriter(uint64(m.FieldPostingsListOffset)) + } + return n +} + +func sovFswriter(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozFswriter(x uint64) (n int) { + return sovFswriter(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Metadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFswriter + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Metadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Metadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PostingsFormat", wireType) + } + m.PostingsFormat = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFswriter + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PostingsFormat |= (PostingsFormat(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumDocs", wireType) + } + m.NumDocs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFswriter + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumDocs |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipFswriter(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthFswriter + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FieldData) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFswriter + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FieldData: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FieldData: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FieldPostingsListOffset", wireType) + } + m.FieldPostingsListOffset = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFswriter + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.FieldPostingsListOffset |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipFswriter(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthFswriter + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipFswriter(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFswriter + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFswriter + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFswriter + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthFswriter + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFswriter + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipFswriter(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthFswriter = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowFswriter = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.proto", fileDescriptorFswriter) +} + +var fileDescriptorFswriter = []byte{ + // 359 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0xc1, 0x8a, 0x9b, 0x40, + 0x18, 0xc7, 0x35, 0x09, 0x6d, 0xf2, 0x95, 0xd8, 0xe9, 0xb4, 0x50, 0x0f, 0x45, 0x42, 0x7a, 0x09, + 0x39, 0x28, 0xad, 0x97, 0x1e, 0x6b, 0xeb, 0x18, 0x84, 0x18, 0xc5, 0x99, 0x96, 0xf6, 0x24, 0x26, + 0x8e, 0xae, 0x10, 0x35, 0xe8, 0x84, 0xdd, 0x7d, 0x8b, 0x7d, 0xac, 0x3d, 0xee, 0x23, 0x2c, 0xd9, + 0x17, 0x59, 0xcc, 0x26, 0x59, 0xb2, 0xb0, 0xb7, 0xf9, 0xfd, 0xbf, 0xdf, 0x7c, 0x7f, 0x98, 0x01, + 0x92, 0xe5, 0xe2, 0x62, 0xbb, 0xd4, 0x57, 0x55, 0x61, 0x14, 0x66, 0xb2, 0x34, 0x0a, 0xd3, 0x68, + 0xea, 0x95, 0x51, 0x98, 0x65, 0x5e, 0x5e, 0x19, 0x19, 0x2f, 0x79, 0x1d, 0x0b, 0x9e, 0x18, 0x9b, + 0xba, 0x12, 0x95, 0x91, 0x36, 0x97, 0x75, 0x2e, 0x78, 0x7d, 0x3a, 0xe8, 0xfb, 0x1c, 0xf7, 0x8f, + 0x3c, 0x4e, 0xa1, 0xef, 0x71, 0x11, 0x27, 0xb1, 0x88, 0xf1, 0x4f, 0x50, 0x36, 0x55, 0x23, 0xf2, + 0x32, 0x6b, 0x9c, 0xaa, 0x2e, 0x62, 0xa1, 0xca, 0x23, 0x79, 0xa2, 0x7c, 0x57, 0xf5, 0xd3, 0xf5, + 0xe0, 0x6c, 0x1e, 0xbe, 0xf0, 0xb1, 0x0a, 0x6f, 0xcb, 0x6d, 0x61, 0x57, 0xab, 0x46, 0xed, 0x8c, + 0xe4, 0x49, 0x37, 0x3c, 0xe2, 0x98, 0xc0, 0xc0, 0xc9, 0xf9, 0x3a, 0xb1, 0xdb, 0xa2, 0x1f, 0xf0, + 0x39, 0x6d, 0xe1, 0xb8, 0x6d, 0x9e, 0x37, 0xc2, 0x4f, 0xd3, 0x86, 0x3f, 0x35, 0xf6, 0xc2, 0xd7, + 0xc6, 0xd3, 0xaf, 0xf0, 0x8e, 0xf2, 0xac, 0xe0, 0xa5, 0x60, 0xd7, 0x1b, 0x8e, 0x3f, 0x01, 0x72, + 0x28, 0x8b, 0x28, 0x99, 0x79, 0x64, 0xc1, 0x22, 0xf6, 0x3f, 0x20, 0x48, 0x9a, 0x56, 0x80, 0x1d, + 0xca, 0x0e, 0x9e, 0x93, 0xaf, 0xf9, 0xde, 0xfd, 0x08, 0xef, 0x6d, 0xff, 0xf7, 0x9f, 0x56, 0xa4, + 0x91, 0xbb, 0xb0, 0xc9, 0x3f, 0x24, 0x61, 0x0c, 0xca, 0x73, 0x68, 0x5b, 0xcc, 0x42, 0x32, 0xfe, + 0x00, 0xc3, 0xc0, 0xa7, 0xcc, 0x5d, 0xcc, 0x0e, 0x51, 0x07, 0x0f, 0x61, 0xd0, 0xf6, 0x30, 0x12, + 0x7a, 0x14, 0x75, 0xb1, 0x02, 0xd0, 0xa2, 0xe3, 0x92, 0xb9, 0x4d, 0x51, 0x6f, 0xaa, 0x83, 0x72, + 0xfe, 0x30, 0xf8, 0x0b, 0xa8, 0x81, 0x3b, 0xf7, 0xa9, 0xf5, 0xf7, 0x5b, 0x74, 0x5a, 0xe6, 0xf8, + 0xa1, 0x67, 0x31, 0x24, 0xfd, 0x42, 0xb7, 0x3b, 0x4d, 0xbe, 0xdb, 0x69, 0xf2, 0xfd, 0x4e, 0x93, + 0x6f, 0x1e, 0x34, 0x69, 0xf9, 0x66, 0xff, 0x2f, 0xe6, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0x71, + 0xec, 0x67, 0x32, 0xe0, 0x01, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.proto b/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.proto new file mode 100644 index 00000000..fa871599 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/fswriter/fswriter.proto @@ -0,0 +1,50 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +syntax = "proto3"; +package fswriter; + +enum SegmentType { + FST_SEGMENT_TYPE = 0; +} + +enum FSTSegmentFileType { + DOCUMENTS_INDEX = 0; + DOCUMENTS_DATA = 1; + POSTINGS_DATA = 2; + FST_TERMS = 3; + FST_FIELDS = 4; +} + +enum PostingsFormat { + PILOSAV1_POSTINGS_FORMAT = 0; +} + +message Metadata { + PostingsFormat postingsFormat = 1; + int64 numDocs = 2; +} + +// additional metadata stored per Field in the corpus. +message FieldData { + // postingsOffset for the pl corresponding to the union of all documents + // which have a given field. + uint64 fieldPostingsListOffset = 1; +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.pb.go b/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.pb.go new file mode 100644 index 00000000..b234cd4e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.pb.go @@ -0,0 +1,1963 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.proto + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* + Package querypb is a generated protocol buffer package. + + It is generated from these files: + github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.proto + + It has these top-level messages: + FieldQuery + TermQuery + RegexpQuery + NegationQuery + ConjunctionQuery + DisjunctionQuery + AllQuery + Query +*/ +package querypb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type FieldQuery struct { + Field []byte `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` +} + +func (m *FieldQuery) Reset() { *m = FieldQuery{} } +func (m *FieldQuery) String() string { return proto.CompactTextString(m) } +func (*FieldQuery) ProtoMessage() {} +func (*FieldQuery) Descriptor() ([]byte, []int) { return fileDescriptorQuery, []int{0} } + +func (m *FieldQuery) GetField() []byte { + if m != nil { + return m.Field + } + return nil +} + +type TermQuery struct { + Field []byte `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Term []byte `protobuf:"bytes,2,opt,name=term,proto3" json:"term,omitempty"` +} + +func (m *TermQuery) Reset() { *m = TermQuery{} } +func (m *TermQuery) String() string { return proto.CompactTextString(m) } +func (*TermQuery) ProtoMessage() {} +func (*TermQuery) Descriptor() ([]byte, []int) { return fileDescriptorQuery, []int{1} } + +func (m *TermQuery) GetField() []byte { + if m != nil { + return m.Field + } + return nil +} + +func (m *TermQuery) GetTerm() []byte { + if m != nil { + return m.Term + } + return nil +} + +type RegexpQuery struct { + Field []byte `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Regexp []byte `protobuf:"bytes,2,opt,name=regexp,proto3" json:"regexp,omitempty"` +} + +func (m *RegexpQuery) Reset() { *m = RegexpQuery{} } +func (m *RegexpQuery) String() string { return proto.CompactTextString(m) } +func (*RegexpQuery) ProtoMessage() {} +func (*RegexpQuery) Descriptor() ([]byte, []int) { return fileDescriptorQuery, []int{2} } + +func (m *RegexpQuery) GetField() []byte { + if m != nil { + return m.Field + } + return nil +} + +func (m *RegexpQuery) GetRegexp() []byte { + if m != nil { + return m.Regexp + } + return nil +} + +type NegationQuery struct { + Query *Query `protobuf:"bytes,1,opt,name=query" json:"query,omitempty"` +} + +func (m *NegationQuery) Reset() { *m = NegationQuery{} } +func (m *NegationQuery) String() string { return proto.CompactTextString(m) } +func (*NegationQuery) ProtoMessage() {} +func (*NegationQuery) Descriptor() ([]byte, []int) { return fileDescriptorQuery, []int{3} } + +func (m *NegationQuery) GetQuery() *Query { + if m != nil { + return m.Query + } + return nil +} + +type ConjunctionQuery struct { + Queries []*Query `protobuf:"bytes,1,rep,name=queries" json:"queries,omitempty"` +} + +func (m *ConjunctionQuery) Reset() { *m = ConjunctionQuery{} } +func (m *ConjunctionQuery) String() string { return proto.CompactTextString(m) } +func (*ConjunctionQuery) ProtoMessage() {} +func (*ConjunctionQuery) Descriptor() ([]byte, []int) { return fileDescriptorQuery, []int{4} } + +func (m *ConjunctionQuery) GetQueries() []*Query { + if m != nil { + return m.Queries + } + return nil +} + +type DisjunctionQuery struct { + Queries []*Query `protobuf:"bytes,1,rep,name=queries" json:"queries,omitempty"` +} + +func (m *DisjunctionQuery) Reset() { *m = DisjunctionQuery{} } +func (m *DisjunctionQuery) String() string { return proto.CompactTextString(m) } +func (*DisjunctionQuery) ProtoMessage() {} +func (*DisjunctionQuery) Descriptor() ([]byte, []int) { return fileDescriptorQuery, []int{5} } + +func (m *DisjunctionQuery) GetQueries() []*Query { + if m != nil { + return m.Queries + } + return nil +} + +type AllQuery struct { +} + +func (m *AllQuery) Reset() { *m = AllQuery{} } +func (m *AllQuery) String() string { return proto.CompactTextString(m) } +func (*AllQuery) ProtoMessage() {} +func (*AllQuery) Descriptor() ([]byte, []int) { return fileDescriptorQuery, []int{6} } + +type Query struct { + // Types that are valid to be assigned to Query: + // *Query_Term + // *Query_Regexp + // *Query_Negation + // *Query_Conjunction + // *Query_Disjunction + // *Query_All + // *Query_Field + Query isQuery_Query `protobuf_oneof:"query"` +} + +func (m *Query) Reset() { *m = Query{} } +func (m *Query) String() string { return proto.CompactTextString(m) } +func (*Query) ProtoMessage() {} +func (*Query) Descriptor() ([]byte, []int) { return fileDescriptorQuery, []int{7} } + +type isQuery_Query interface { + isQuery_Query() + MarshalTo([]byte) (int, error) + Size() int +} + +type Query_Term struct { + Term *TermQuery `protobuf:"bytes,1,opt,name=term,oneof"` +} +type Query_Regexp struct { + Regexp *RegexpQuery `protobuf:"bytes,2,opt,name=regexp,oneof"` +} +type Query_Negation struct { + Negation *NegationQuery `protobuf:"bytes,3,opt,name=negation,oneof"` +} +type Query_Conjunction struct { + Conjunction *ConjunctionQuery `protobuf:"bytes,4,opt,name=conjunction,oneof"` +} +type Query_Disjunction struct { + Disjunction *DisjunctionQuery `protobuf:"bytes,5,opt,name=disjunction,oneof"` +} +type Query_All struct { + All *AllQuery `protobuf:"bytes,6,opt,name=all,oneof"` +} +type Query_Field struct { + Field *FieldQuery `protobuf:"bytes,7,opt,name=field,oneof"` +} + +func (*Query_Term) isQuery_Query() {} +func (*Query_Regexp) isQuery_Query() {} +func (*Query_Negation) isQuery_Query() {} +func (*Query_Conjunction) isQuery_Query() {} +func (*Query_Disjunction) isQuery_Query() {} +func (*Query_All) isQuery_Query() {} +func (*Query_Field) isQuery_Query() {} + +func (m *Query) GetQuery() isQuery_Query { + if m != nil { + return m.Query + } + return nil +} + +func (m *Query) GetTerm() *TermQuery { + if x, ok := m.GetQuery().(*Query_Term); ok { + return x.Term + } + return nil +} + +func (m *Query) GetRegexp() *RegexpQuery { + if x, ok := m.GetQuery().(*Query_Regexp); ok { + return x.Regexp + } + return nil +} + +func (m *Query) GetNegation() *NegationQuery { + if x, ok := m.GetQuery().(*Query_Negation); ok { + return x.Negation + } + return nil +} + +func (m *Query) GetConjunction() *ConjunctionQuery { + if x, ok := m.GetQuery().(*Query_Conjunction); ok { + return x.Conjunction + } + return nil +} + +func (m *Query) GetDisjunction() *DisjunctionQuery { + if x, ok := m.GetQuery().(*Query_Disjunction); ok { + return x.Disjunction + } + return nil +} + +func (m *Query) GetAll() *AllQuery { + if x, ok := m.GetQuery().(*Query_All); ok { + return x.All + } + return nil +} + +func (m *Query) GetField() *FieldQuery { + if x, ok := m.GetQuery().(*Query_Field); ok { + return x.Field + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Query) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Query_OneofMarshaler, _Query_OneofUnmarshaler, _Query_OneofSizer, []interface{}{ + (*Query_Term)(nil), + (*Query_Regexp)(nil), + (*Query_Negation)(nil), + (*Query_Conjunction)(nil), + (*Query_Disjunction)(nil), + (*Query_All)(nil), + (*Query_Field)(nil), + } +} + +func _Query_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Query) + // query + switch x := m.Query.(type) { + case *Query_Term: + _ = b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Term); err != nil { + return err + } + case *Query_Regexp: + _ = b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Regexp); err != nil { + return err + } + case *Query_Negation: + _ = b.EncodeVarint(3<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Negation); err != nil { + return err + } + case *Query_Conjunction: + _ = b.EncodeVarint(4<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Conjunction); err != nil { + return err + } + case *Query_Disjunction: + _ = b.EncodeVarint(5<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Disjunction); err != nil { + return err + } + case *Query_All: + _ = b.EncodeVarint(6<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.All); err != nil { + return err + } + case *Query_Field: + _ = b.EncodeVarint(7<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Field); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("Query.Query has unexpected type %T", x) + } + return nil +} + +func _Query_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Query) + switch tag { + case 1: // query.term + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(TermQuery) + err := b.DecodeMessage(msg) + m.Query = &Query_Term{msg} + return true, err + case 2: // query.regexp + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(RegexpQuery) + err := b.DecodeMessage(msg) + m.Query = &Query_Regexp{msg} + return true, err + case 3: // query.negation + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(NegationQuery) + err := b.DecodeMessage(msg) + m.Query = &Query_Negation{msg} + return true, err + case 4: // query.conjunction + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ConjunctionQuery) + err := b.DecodeMessage(msg) + m.Query = &Query_Conjunction{msg} + return true, err + case 5: // query.disjunction + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(DisjunctionQuery) + err := b.DecodeMessage(msg) + m.Query = &Query_Disjunction{msg} + return true, err + case 6: // query.all + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(AllQuery) + err := b.DecodeMessage(msg) + m.Query = &Query_All{msg} + return true, err + case 7: // query.field + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(FieldQuery) + err := b.DecodeMessage(msg) + m.Query = &Query_Field{msg} + return true, err + default: + return false, nil + } +} + +func _Query_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Query) + // query + switch x := m.Query.(type) { + case *Query_Term: + s := proto.Size(x.Term) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Query_Regexp: + s := proto.Size(x.Regexp) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Query_Negation: + s := proto.Size(x.Negation) + n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Query_Conjunction: + s := proto.Size(x.Conjunction) + n += proto.SizeVarint(4<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Query_Disjunction: + s := proto.Size(x.Disjunction) + n += proto.SizeVarint(5<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Query_All: + s := proto.Size(x.All) + n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Query_Field: + s := proto.Size(x.Field) + n += proto.SizeVarint(7<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +func init() { + proto.RegisterType((*FieldQuery)(nil), "query.FieldQuery") + proto.RegisterType((*TermQuery)(nil), "query.TermQuery") + proto.RegisterType((*RegexpQuery)(nil), "query.RegexpQuery") + proto.RegisterType((*NegationQuery)(nil), "query.NegationQuery") + proto.RegisterType((*ConjunctionQuery)(nil), "query.ConjunctionQuery") + proto.RegisterType((*DisjunctionQuery)(nil), "query.DisjunctionQuery") + proto.RegisterType((*AllQuery)(nil), "query.AllQuery") + proto.RegisterType((*Query)(nil), "query.Query") +} +func (m *FieldQuery) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FieldQuery) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Field) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintQuery(dAtA, i, uint64(len(m.Field))) + i += copy(dAtA[i:], m.Field) + } + return i, nil +} + +func (m *TermQuery) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TermQuery) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Field) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintQuery(dAtA, i, uint64(len(m.Field))) + i += copy(dAtA[i:], m.Field) + } + if len(m.Term) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintQuery(dAtA, i, uint64(len(m.Term))) + i += copy(dAtA[i:], m.Term) + } + return i, nil +} + +func (m *RegexpQuery) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RegexpQuery) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Field) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintQuery(dAtA, i, uint64(len(m.Field))) + i += copy(dAtA[i:], m.Field) + } + if len(m.Regexp) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintQuery(dAtA, i, uint64(len(m.Regexp))) + i += copy(dAtA[i:], m.Regexp) + } + return i, nil +} + +func (m *NegationQuery) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NegationQuery) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Query != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintQuery(dAtA, i, uint64(m.Query.Size())) + n1, err := m.Query.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + return i, nil +} + +func (m *ConjunctionQuery) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConjunctionQuery) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Queries) > 0 { + for _, msg := range m.Queries { + dAtA[i] = 0xa + i++ + i = encodeVarintQuery(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *DisjunctionQuery) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DisjunctionQuery) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Queries) > 0 { + for _, msg := range m.Queries { + dAtA[i] = 0xa + i++ + i = encodeVarintQuery(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *AllQuery) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllQuery) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *Query) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Query) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Query != nil { + nn2, err := m.Query.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += nn2 + } + return i, nil +} + +func (m *Query_Term) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.Term != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintQuery(dAtA, i, uint64(m.Term.Size())) + n3, err := m.Term.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + return i, nil +} +func (m *Query_Regexp) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.Regexp != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintQuery(dAtA, i, uint64(m.Regexp.Size())) + n4, err := m.Regexp.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + return i, nil +} +func (m *Query_Negation) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.Negation != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintQuery(dAtA, i, uint64(m.Negation.Size())) + n5, err := m.Negation.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + return i, nil +} +func (m *Query_Conjunction) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.Conjunction != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintQuery(dAtA, i, uint64(m.Conjunction.Size())) + n6, err := m.Conjunction.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + } + return i, nil +} +func (m *Query_Disjunction) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.Disjunction != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintQuery(dAtA, i, uint64(m.Disjunction.Size())) + n7, err := m.Disjunction.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + return i, nil +} +func (m *Query_All) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.All != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintQuery(dAtA, i, uint64(m.All.Size())) + n8, err := m.All.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + } + return i, nil +} +func (m *Query_Field) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.Field != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintQuery(dAtA, i, uint64(m.Field.Size())) + n9, err := m.Field.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 + } + return i, nil +} +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *FieldQuery) Size() (n int) { + var l int + _ = l + l = len(m.Field) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *TermQuery) Size() (n int) { + var l int + _ = l + l = len(m.Field) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.Term) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *RegexpQuery) Size() (n int) { + var l int + _ = l + l = len(m.Field) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.Regexp) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *NegationQuery) Size() (n int) { + var l int + _ = l + if m.Query != nil { + l = m.Query.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *ConjunctionQuery) Size() (n int) { + var l int + _ = l + if len(m.Queries) > 0 { + for _, e := range m.Queries { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *DisjunctionQuery) Size() (n int) { + var l int + _ = l + if len(m.Queries) > 0 { + for _, e := range m.Queries { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *AllQuery) Size() (n int) { + var l int + _ = l + return n +} + +func (m *Query) Size() (n int) { + var l int + _ = l + if m.Query != nil { + n += m.Query.Size() + } + return n +} + +func (m *Query_Term) Size() (n int) { + var l int + _ = l + if m.Term != nil { + l = m.Term.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} +func (m *Query_Regexp) Size() (n int) { + var l int + _ = l + if m.Regexp != nil { + l = m.Regexp.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} +func (m *Query_Negation) Size() (n int) { + var l int + _ = l + if m.Negation != nil { + l = m.Negation.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} +func (m *Query_Conjunction) Size() (n int) { + var l int + _ = l + if m.Conjunction != nil { + l = m.Conjunction.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} +func (m *Query_Disjunction) Size() (n int) { + var l int + _ = l + if m.Disjunction != nil { + l = m.Disjunction.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} +func (m *Query_All) Size() (n int) { + var l int + _ = l + if m.All != nil { + l = m.All.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} +func (m *Query_Field) Size() (n int) { + var l int + _ = l + if m.Field != nil { + l = m.Field.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func sovQuery(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *FieldQuery) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FieldQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FieldQuery: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Field", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Field = append(m.Field[:0], dAtA[iNdEx:postIndex]...) + if m.Field == nil { + m.Field = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TermQuery) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TermQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TermQuery: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Field", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Field = append(m.Field[:0], dAtA[iNdEx:postIndex]...) + if m.Field == nil { + m.Field = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Term", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Term = append(m.Term[:0], dAtA[iNdEx:postIndex]...) + if m.Term == nil { + m.Term = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RegexpQuery) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RegexpQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RegexpQuery: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Field", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Field = append(m.Field[:0], dAtA[iNdEx:postIndex]...) + if m.Field == nil { + m.Field = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Regexp", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Regexp = append(m.Regexp[:0], dAtA[iNdEx:postIndex]...) + if m.Regexp == nil { + m.Regexp = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NegationQuery) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NegationQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NegationQuery: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Query == nil { + m.Query = &Query{} + } + if err := m.Query.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConjunctionQuery) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConjunctionQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConjunctionQuery: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Queries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Queries = append(m.Queries, &Query{}) + if err := m.Queries[len(m.Queries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DisjunctionQuery) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DisjunctionQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DisjunctionQuery: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Queries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Queries = append(m.Queries, &Query{}) + if err := m.Queries[len(m.Queries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AllQuery) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AllQuery: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AllQuery: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Query) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Query: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Query: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Term", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &TermQuery{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Query = &Query_Term{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Regexp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RegexpQuery{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Query = &Query_Regexp{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Negation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &NegationQuery{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Query = &Query_Negation{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conjunction", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ConjunctionQuery{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Query = &Query_Conjunction{v} + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Disjunction", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &DisjunctionQuery{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Query = &Query_Disjunction{v} + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field All", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &AllQuery{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Query = &Query_All{v} + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Field", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &FieldQuery{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Query = &Query_Field{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthQuery + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipQuery(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.proto", fileDescriptorQuery) +} + +var fileDescriptorQuery = []byte{ + // 389 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xcd, 0x4a, 0xf3, 0x40, + 0x14, 0x86, 0x93, 0xb6, 0x69, 0xfa, 0x9d, 0xf4, 0xc3, 0x3a, 0x14, 0x8d, 0x9b, 0x50, 0x22, 0x88, + 0x82, 0x34, 0xd0, 0xe0, 0xc6, 0xae, 0x5a, 0x45, 0xb2, 0x12, 0x0c, 0xae, 0xdc, 0x35, 0xc9, 0x18, + 0x23, 0xc9, 0xa4, 0x4e, 0x53, 0xa8, 0x77, 0xe1, 0x65, 0xb9, 0xf4, 0x12, 0xa4, 0x7a, 0x21, 0x32, + 0x3f, 0x69, 0xda, 0x0a, 0x5d, 0xb8, 0x4a, 0xce, 0x9c, 0xf7, 0x81, 0x99, 0x87, 0x17, 0x46, 0x71, + 0x52, 0x3c, 0xcd, 0x83, 0x7e, 0x98, 0x67, 0x4e, 0xe6, 0x46, 0x81, 0x93, 0xb9, 0xce, 0x8c, 0x86, + 0x4e, 0xe6, 0x92, 0x84, 0x2c, 0x9c, 0x18, 0x13, 0x4c, 0x27, 0x05, 0x8e, 0x9c, 0x29, 0xcd, 0x8b, + 0xdc, 0x79, 0x99, 0x63, 0xfa, 0x3a, 0x0d, 0xc4, 0xb7, 0xcf, 0xcf, 0x90, 0xc6, 0x07, 0xdb, 0x06, + 0xb8, 0x49, 0x70, 0x1a, 0xdd, 0xb1, 0x09, 0x75, 0x41, 0x7b, 0x64, 0x93, 0xa9, 0xf6, 0xd4, 0xd3, + 0xb6, 0x2f, 0x06, 0xfb, 0x02, 0xfe, 0xdd, 0x63, 0x9a, 0xed, 0x88, 0x20, 0x04, 0x8d, 0x02, 0xd3, + 0xcc, 0xac, 0xf1, 0x43, 0xfe, 0x6f, 0x0f, 0xc1, 0xf0, 0x71, 0x8c, 0x17, 0xd3, 0x5d, 0xe0, 0x01, + 0x34, 0x29, 0x0f, 0x49, 0x54, 0x4e, 0xb6, 0x0b, 0xff, 0x6f, 0x71, 0x3c, 0x29, 0x92, 0x9c, 0x08, + 0xdc, 0x06, 0x71, 0x63, 0x8e, 0x1b, 0x83, 0x76, 0x5f, 0x3c, 0x86, 0x2f, 0x7d, 0xf9, 0x98, 0x4b, + 0xe8, 0x5c, 0xe5, 0xe4, 0x79, 0x4e, 0xc2, 0x8a, 0x3b, 0x01, 0x9d, 0x2d, 0x13, 0x3c, 0x33, 0xd5, + 0x5e, 0xfd, 0x17, 0x59, 0x2e, 0x19, 0x7b, 0x9d, 0xcc, 0xfe, 0xc6, 0x02, 0xb4, 0x46, 0x69, 0xca, + 0x0f, 0xed, 0xef, 0x1a, 0x68, 0x25, 0x2d, 0x9c, 0x88, 0x0b, 0x77, 0x24, 0xba, 0x32, 0xe9, 0x29, + 0xc2, 0x13, 0x3a, 0xdf, 0x50, 0x60, 0x0c, 0x90, 0x4c, 0xae, 0xc9, 0xf3, 0x94, 0x52, 0x0c, 0x1a, + 0x40, 0x8b, 0x48, 0x31, 0x66, 0x9d, 0xe7, 0xbb, 0x32, 0xbf, 0xe1, 0xcb, 0x53, 0xfc, 0x55, 0x0e, + 0x0d, 0xc1, 0x08, 0x2b, 0x2f, 0x66, 0x83, 0x63, 0x87, 0x12, 0xdb, 0x36, 0xe6, 0x29, 0xfe, 0x7a, + 0x9a, 0xc1, 0x51, 0x25, 0xc6, 0xd4, 0x36, 0xe0, 0x6d, 0x65, 0x0c, 0x5e, 0x4b, 0xa3, 0x63, 0xa8, + 0x4f, 0xd2, 0xd4, 0x6c, 0x72, 0x68, 0x4f, 0x42, 0xa5, 0x2b, 0x4f, 0xf1, 0xd9, 0x16, 0x9d, 0x95, + 0xcd, 0xd0, 0x79, 0x6c, 0x5f, 0xc6, 0xaa, 0x5e, 0x7a, 0x8a, 0xac, 0xcb, 0x58, 0x97, 0x2d, 0x18, + 0x1f, 0xbd, 0x2f, 0x2d, 0xf5, 0x63, 0x69, 0xa9, 0x9f, 0x4b, 0x4b, 0x7d, 0xfb, 0xb2, 0x94, 0x07, + 0x5d, 0xb6, 0x3c, 0x68, 0xf2, 0x82, 0xbb, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x4a, 0xb7, + 0x71, 0x25, 0x03, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.proto b/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.proto new file mode 100644 index 00000000..9f0c02cf --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/generated/proto/querypb/query.proto @@ -0,0 +1,65 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +syntax = "proto3"; +package query; + +option go_package = "querypb"; + +message FieldQuery { + bytes field = 1; +} + +message TermQuery { + bytes field = 1; + bytes term = 2; +} + +message RegexpQuery { + bytes field = 1; + bytes regexp = 2; +} + +message NegationQuery { + Query query = 1; +} + +message ConjunctionQuery { + repeated Query queries = 1; +} + +message DisjunctionQuery { + repeated Query queries = 1; +} + +message AllQuery { +} + +message Query { + oneof query { + TermQuery term = 1; + RegexpQuery regexp = 2; + NegationQuery negation = 3; + ConjunctionQuery conjunction = 4; + DisjunctionQuery disjunction = 5; + AllQuery all = 6; + FieldQuery field = 7; + } +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/idx/codec.go b/vendor/github.com/m3db/m3/src/m3ninx/idx/codec.go new file mode 100644 index 00000000..9780495d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/idx/codec.go @@ -0,0 +1,39 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package idx + +import ( + "github.com/m3db/m3/src/m3ninx/search/query" +) + +// Marshal encodes the query into a byte slice. +func Marshal(q Query) ([]byte, error) { + return query.Marshal(q.query) +} + +// Unmarshal decodes a query from a byte slice. +func Unmarshal(data []byte) (Query, error) { + q, err := query.Unmarshal(data) + if err != nil { + return Query{}, err + } + return Query{query: q}, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/idx/query.go b/vendor/github.com/m3db/m3/src/m3ninx/idx/query.go new file mode 100644 index 00000000..50d10588 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/idx/query.go @@ -0,0 +1,136 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package idx + +import ( + "github.com/m3db/m3/src/m3ninx/search" + "github.com/m3db/m3/src/m3ninx/search/query" +) + +// Query encapsulates a search query for an index. +type Query struct { + query search.Query +} + +func (q Query) String() string { + return q.query.String() +} + +// NewQueryFromSearchQuery creates a new Query from a search.Query. +func NewQueryFromSearchQuery(q search.Query) Query { + return Query{ + query: q, + } +} + +// NewAllQuery returns a new query for matching all documents. +func NewAllQuery() Query { + return Query{ + query: query.NewAllQuery(), + } +} + +// NewFieldQuery returns a new query for finding documents which match a field exactly. +func NewFieldQuery(field []byte) Query { + return Query{ + query: query.NewFieldQuery(field), + } +} + +// FieldQuery returns a bool indicating whether the Query is a FieldQuery, +// and the backing bytes of the Field. +func FieldQuery(q Query) (field []byte, ok bool) { + fieldQuery, ok := q.query.(*query.FieldQuery) + if !ok { + return nil, false + } + return fieldQuery.Field(), true +} + +// NewTermQuery returns a new query for finding documents which match a term exactly. +func NewTermQuery(field, term []byte) Query { + return Query{ + query: query.NewTermQuery(field, term), + } +} + +// NewRegexpQuery returns a new query for finding documents which match a regular expression. +func NewRegexpQuery(field, regexp []byte) (Query, error) { + q, err := query.NewRegexpQuery(field, regexp) + if err != nil { + return Query{}, err + } + return Query{ + query: q, + }, nil +} + +// MustCreateRegexpQuery is like NewRegexpQuery but panics if the query cannot be created. +func MustCreateRegexpQuery(field, regexp []byte) Query { + q, err := query.NewRegexpQuery(field, regexp) + if err != nil { + panic(err) + } + return Query{ + query: q, + } +} + +// NewNegationQuery returns a new query for finding documents which don't match a given query. +func NewNegationQuery(q Query) Query { + return Query{ + query: query.NewNegationQuery(q.SearchQuery()), + } +} + +// NewConjunctionQuery returns a new query for finding documents which match each of the +// given queries. +func NewConjunctionQuery(queries ...Query) Query { + qs := make([]search.Query, 0, len(queries)) + for _, q := range queries { + qs = append(qs, q.query) + } + return Query{ + query: query.NewConjunctionQuery(qs), + } +} + +// NewDisjunctionQuery returns a new query for finding documents which match at least one +// of the given queries. +func NewDisjunctionQuery(queries ...Query) Query { + qs := make([]search.Query, 0, len(queries)) + for _, q := range queries { + qs = append(qs, q.query) + } + return Query{ + query: query.NewDisjunctionQuery(qs), + } +} + +// SearchQuery returns the underlying search query for use during execution. +func (q Query) SearchQuery() search.Query { + return q.query +} + +// Equal reports whether q is equal to o. +func (q Query) Equal(o Query) bool { + return q.query.Equal(o.query) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/idx/query_matcher.go b/vendor/github.com/m3db/m3/src/m3ninx/idx/query_matcher.go new file mode 100644 index 00000000..9b3ff2a7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/idx/query_matcher.go @@ -0,0 +1,55 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package idx + +import ( + "fmt" + + "github.com/golang/mock/gomock" +) + +// QueryMatcher is a gomock.Matcher that matches idx.Query +type QueryMatcher interface { + gomock.Matcher +} + +// NewQueryMatcher returns a new QueryMatcher +func NewQueryMatcher(q Query) QueryMatcher { + return &queryMatcher{ + query: q, + } +} + +type queryMatcher struct { + query Query +} + +func (m *queryMatcher) Matches(x interface{}) bool { + q, ok := x.(Query) + if !ok { + return false + } + return m.query.Equal(q) +} + +func (m *queryMatcher) String() string { + return fmt.Sprintf("QueryMatcher %v", m.query) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/idx/types.go b/vendor/github.com/m3db/m3/src/m3ninx/idx/types.go new file mode 100644 index 00000000..4c35dd7f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/idx/types.go @@ -0,0 +1,44 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package idx + +import ( + "github.com/m3db/m3/src/m3ninx/doc" +) + +// Index is an inverted index. +type Index interface { + // Insert inserts a document into the index. + Insert(d doc.Document) error + + // Searcher returns a Searcher over a point-in-time view of the index. + Searcher() (Searcher, error) + + // Close closes the index. + Close() error +} + +// Searcher provides search over a point-in-time view of an index. +type Searcher interface { + Search(q Query) (doc.Iterator, error) + + Close() error +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/batch.go b/vendor/github.com/m3db/m3/src/m3ninx/index/batch.go new file mode 100644 index 00000000..93162037 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/batch.go @@ -0,0 +1,169 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "bytes" + "errors" + "fmt" + "sync" + + "github.com/m3db/m3/src/m3ninx/doc" +) + +var ( + // ErrDuplicateID is the error returned when a batch contains duplicate IDs. + ErrDuplicateID = errors.New("a batch cannot contain duplicate IDs") +) + +// Batch represents a batch of documents that should be inserted into the index. +type Batch struct { + Docs []doc.Document + + // If AllowPartialUpdates is true the index will continue to index documents in the batch + // even if it encounters an error attempting to index a previous document in the batch. + // If false, on the other hand, then any errors encountered indexing a document will cause + // the entire batch to fail and none of the documents in the batch will be indexed. + AllowPartialUpdates bool +} + +// BatchOption is an option for a Batch. +type BatchOption interface { + apply(Batch) Batch +} + +// batchOptionFunc is an adaptor to allow the use of functions as BatchOptions. +type batchOptionFunc func(Batch) Batch + +func (f batchOptionFunc) apply(b Batch) Batch { + return f(b) +} + +// AllowPartialUpdates permits an index to continue indexing documents in a batch even if +// it encountered an error inserting a prior document. +func AllowPartialUpdates() BatchOption { + return batchOptionFunc(func(b Batch) Batch { + b.AllowPartialUpdates = true + return b + }) +} + +// NewBatch returns a Batch of documents. +func NewBatch(docs []doc.Document, opts ...BatchOption) Batch { + b := Batch{Docs: docs} + + for _, opt := range opts { + b = opt.apply(b) + } + + return b +} + +// BatchPartialError indicates an error was encountered inserting some documents in a batch. +// It is not safe for concurrent use. +type BatchPartialError struct { + sync.Mutex + + errs []BatchError +} + +// BatchError is an error that occurred for a document being inserted. +type BatchError struct { + Err error + Idx int +} + +// NewBatchPartialError returns a new BatchPartialError. +func NewBatchPartialError() *BatchPartialError { + return &BatchPartialError{} +} + +func (e *BatchPartialError) Error() string { + var b bytes.Buffer + for i := range e.errs { + b.WriteString(fmt.Sprintf("failed to insert document at index %v in batch: %v", + e.errs[i].Idx, e.errs[i].Err)) + if i != len(e.errs)-1 { + b.WriteString("\n") + } + } + return b.String() +} + +// FilterDuplicateIDErrors returns a new BatchPartialError (or nil), without any DuplicateIDError(s). +// NB(prateek): it mutates the order of errors in the original error to avoid allocations. +// NB(bodu): we return an `error` here since go does not evaluate `nil` errors correctly when +// we return a custom type (*BatchPartialError) here and cast it to `error`. +func (e *BatchPartialError) FilterDuplicateIDErrors() error { + // cheap to do the copy as it's just pointers for the slices + var ( + errs = e.errs + i = 0 + ) + + for i < len(errs) { + if errs[i].Err == ErrDuplicateID { + errs[i], errs[len(errs)-1] = errs[len(errs)-1], errs[i] + errs = errs[:len(errs)-1] + continue + } + i++ + } + if len(errs) == 0 { + return nil + } + return &BatchPartialError{errs: errs} +} + +// Add adds an error to e. Any nil errors are ignored. +func (e *BatchPartialError) Add(err BatchError) { + if err.Err == nil { + return + } + e.errs = append(e.errs, err) +} + +// AddWithLock adds an error to e with a lock. Any nil errors are ignored. +func (e *BatchPartialError) AddWithLock(err BatchError) { + if err.Err == nil { + return + } + e.Lock() + e.errs = append(e.errs, err) + e.Unlock() +} + +// Errs returns the errors with the indexes of the documents in the batch +// which were not indexed. +func (e *BatchPartialError) Errs() []BatchError { + return e.errs +} + +// IsEmpty returns a bool indicating whether e is empty or not. +func (e *BatchPartialError) IsEmpty() bool { + return len(e.errs) == 0 +} + +// IsBatchPartialError returns a bool indicating whether err is a BatchPartialError or not. +func IsBatchPartialError(err error) bool { + _, ok := err.(*BatchPartialError) + return ok +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/batch_matcher.go b/vendor/github.com/m3db/m3/src/m3ninx/index/batch_matcher.go new file mode 100644 index 00000000..abc02b1c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/batch_matcher.go @@ -0,0 +1,50 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "fmt" + "reflect" + + "github.com/golang/mock/gomock" +) + +// BatchMatcher matches a `Batch`. +type BatchMatcher interface { + gomock.Matcher +} + +// NewBatchMatcher returns a new BatchMatcher. +func NewBatchMatcher(b Batch) BatchMatcher { + return batchMatcher{b} +} + +type batchMatcher struct { + b Batch +} + +func (bm batchMatcher) Matches(x interface{}) bool { + return reflect.DeepEqual(bm.b, x) +} + +func (bm batchMatcher) String() string { + return fmt.Sprintf("BatchMatcher: %v", bm.b) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/index_mock.go b/vendor/github.com/m3db/m3/src/m3ninx/index/index_mock.go new file mode 100644 index 00000000..26320c23 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/index_mock.go @@ -0,0 +1,214 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/m3ninx/index (interfaces: Reader,DocRetriever) + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package index is a generated GoMock package. +package index + +import ( + "reflect" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/postings" + + "github.com/golang/mock/gomock" +) + +// MockReader is a mock of Reader interface +type MockReader struct { + ctrl *gomock.Controller + recorder *MockReaderMockRecorder +} + +// MockReaderMockRecorder is the mock recorder for MockReader +type MockReaderMockRecorder struct { + mock *MockReader +} + +// NewMockReader creates a new mock instance +func NewMockReader(ctrl *gomock.Controller) *MockReader { + mock := &MockReader{ctrl: ctrl} + mock.recorder = &MockReaderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockReader) EXPECT() *MockReaderMockRecorder { + return m.recorder +} + +// AllDocs mocks base method +func (m *MockReader) AllDocs() (IDDocIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllDocs") + ret0, _ := ret[0].(IDDocIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllDocs indicates an expected call of AllDocs +func (mr *MockReaderMockRecorder) AllDocs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllDocs", reflect.TypeOf((*MockReader)(nil).AllDocs)) +} + +// Close mocks base method +func (m *MockReader) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockReaderMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockReader)(nil).Close)) +} + +// Doc mocks base method +func (m *MockReader) Doc(arg0 postings.ID) (doc.Document, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Doc", arg0) + ret0, _ := ret[0].(doc.Document) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Doc indicates an expected call of Doc +func (mr *MockReaderMockRecorder) Doc(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Doc", reflect.TypeOf((*MockReader)(nil).Doc), arg0) +} + +// Docs mocks base method +func (m *MockReader) Docs(arg0 postings.List) (doc.Iterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Docs", arg0) + ret0, _ := ret[0].(doc.Iterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Docs indicates an expected call of Docs +func (mr *MockReaderMockRecorder) Docs(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Docs", reflect.TypeOf((*MockReader)(nil).Docs), arg0) +} + +// MatchAll mocks base method +func (m *MockReader) MatchAll() (postings.MutableList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchAll") + ret0, _ := ret[0].(postings.MutableList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchAll indicates an expected call of MatchAll +func (mr *MockReaderMockRecorder) MatchAll() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchAll", reflect.TypeOf((*MockReader)(nil).MatchAll)) +} + +// MatchField mocks base method +func (m *MockReader) MatchField(arg0 []byte) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchField", arg0) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchField indicates an expected call of MatchField +func (mr *MockReaderMockRecorder) MatchField(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchField", reflect.TypeOf((*MockReader)(nil).MatchField), arg0) +} + +// MatchRegexp mocks base method +func (m *MockReader) MatchRegexp(arg0 []byte, arg1 CompiledRegex) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchRegexp", arg0, arg1) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchRegexp indicates an expected call of MatchRegexp +func (mr *MockReaderMockRecorder) MatchRegexp(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchRegexp", reflect.TypeOf((*MockReader)(nil).MatchRegexp), arg0, arg1) +} + +// MatchTerm mocks base method +func (m *MockReader) MatchTerm(arg0, arg1 []byte) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchTerm", arg0, arg1) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchTerm indicates an expected call of MatchTerm +func (mr *MockReaderMockRecorder) MatchTerm(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchTerm", reflect.TypeOf((*MockReader)(nil).MatchTerm), arg0, arg1) +} + +// MockDocRetriever is a mock of DocRetriever interface +type MockDocRetriever struct { + ctrl *gomock.Controller + recorder *MockDocRetrieverMockRecorder +} + +// MockDocRetrieverMockRecorder is the mock recorder for MockDocRetriever +type MockDocRetrieverMockRecorder struct { + mock *MockDocRetriever +} + +// NewMockDocRetriever creates a new mock instance +func NewMockDocRetriever(ctrl *gomock.Controller) *MockDocRetriever { + mock := &MockDocRetriever{ctrl: ctrl} + mock.recorder = &MockDocRetrieverMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDocRetriever) EXPECT() *MockDocRetrieverMockRecorder { + return m.recorder +} + +// Doc mocks base method +func (m *MockDocRetriever) Doc(arg0 postings.ID) (doc.Document, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Doc", arg0) + ret0, _ := ret[0].(doc.Document) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Doc indicates an expected call of Doc +func (mr *MockDocRetrieverMockRecorder) Doc(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Doc", reflect.TypeOf((*MockDocRetriever)(nil).Doc), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/iterator.go b/vendor/github.com/m3db/m3/src/m3ninx/index/iterator.go new file mode 100644 index 00000000..34322694 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/iterator.go @@ -0,0 +1,89 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "errors" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/postings" +) + +var ( + errIteratorClosed = errors.New("iterator has been closed") +) + +type idDocIterator struct { + retriever DocRetriever + postingsIter postings.Iterator + + currDoc doc.Document + currID postings.ID + closed bool + err error +} + +// NewIDDocIterator returns a new NewIDDocIterator. +func NewIDDocIterator(r DocRetriever, pi postings.Iterator) IDDocIterator { + return &idDocIterator{ + retriever: r, + postingsIter: pi, + } +} + +func (it *idDocIterator) Next() bool { + if it.closed || it.err != nil || !it.postingsIter.Next() { + return false + } + id := it.postingsIter.Current() + it.currID = id + + d, err := it.retriever.Doc(id) + if err != nil { + it.err = err + return false + } + it.currDoc = d + return true +} + +func (it *idDocIterator) Current() doc.Document { + return it.currDoc +} + +func (it *idDocIterator) PostingsID() postings.ID { + return it.currID +} + +func (it *idDocIterator) Err() error { + return it.err +} + +func (it *idDocIterator) Close() error { + if it.closed { + return errIteratorClosed + } + it.closed = true + it.currDoc = doc.Document{} + it.currID = postings.ID(0) + err := it.postingsIter.Close() + return err +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/regexp.go b/vendor/github.com/m3db/m3/src/m3ninx/index/regexp.go new file mode 100644 index 00000000..29174226 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/regexp.go @@ -0,0 +1,390 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "fmt" + re "regexp" + "regexp/syntax" + + fstregexp "github.com/m3db/m3/src/m3ninx/index/segment/fst/regexp" +) + +var ( + // dotStartCompiledRegex is a CompileRegex that matches any input. + // NB: It can be accessed through DotStartCompiledRegex(). + dotStarCompiledRegex CompiledRegex +) + +func init() { + re, err := CompileRegex([]byte(".*")) + if err != nil { + panic(err.Error()) + } + dotStarCompiledRegex = re +} + +// DotStarCompiledRegex returns a regexp which matches ".*". +func DotStarCompiledRegex() CompiledRegex { + return dotStarCompiledRegex +} + +// CompileRegex compiles the provided regexp into an object that can be used to query the various +// segment implementations. +func CompileRegex(r []byte) (CompiledRegex, error) { + // NB(prateek): We currently use two segment implementations: map-backed, and fst-backed (Vellum). + // Due to peculiarities in the implementation of Vellum, we have to make certain modifications + // to all incoming regular expressions to ensure compatibility between them. + + // first, we parse the regular expression into the equivalent regex + reString := string(r) + reAst, err := parseRegexp(reString) + if err != nil { + return CompiledRegex{}, err + } + + // Issue (a): Vellum does not allow regexps which use characters '^', or '$'. + // To address this issue, we strip these characters from appropriate locations in the parsed syntax.Regexp + // for Vellum's RE. + vellumRe, err := ensureRegexpUnanchored(reAst) + if err != nil { + return CompiledRegex{}, fmt.Errorf("unable to create FST re: %v", err) + } + + // Issue (b): Vellum treats every regular expression as anchored, where as the map-backed segment does not. + // To address this issue, we ensure that every incoming regular expression is modified to be anchored + // when querying the map-backed segment, and isn't anchored when querying Vellum's RE. + simpleRe, err := ensureRegexpAnchored(vellumRe) + if err != nil { + return CompiledRegex{}, fmt.Errorf("unable to create map re: %v", err) + } + + simpleRE, err := re.Compile(simpleRe.String()) + if err != nil { + return CompiledRegex{}, err + } + compiledRegex := CompiledRegex{ + Simple: simpleRE, + FSTSyntax: vellumRe, + } + + fstRE, start, end, err := fstregexp.ParsedRegexp(vellumRe.String(), vellumRe) + if err != nil { + return CompiledRegex{}, err + } + compiledRegex.FST = fstRE + compiledRegex.PrefixBegin = start + compiledRegex.PrefixEnd = end + + return compiledRegex, nil +} + +func parseRegexp(re string) (*syntax.Regexp, error) { + return syntax.Parse(re, syntax.Perl) +} + +// ensureRegexpAnchored adds '^' and '$' characters to appropriate locations in the parsed syntax.Regexp, +// to ensure every input regular expression is converted to it's equivalent anchored regular expression. +// NB: assumes input regexp AST is un-anchored. +func ensureRegexpAnchored(unanchoredRegexp *syntax.Regexp) (*syntax.Regexp, error) { + ast := &syntax.Regexp{ + Op: syntax.OpConcat, + Flags: syntax.Perl, + Sub: []*syntax.Regexp{ + &syntax.Regexp{ + Op: syntax.OpBeginText, + Flags: syntax.Perl, + }, + unanchoredRegexp, + &syntax.Regexp{ + Op: syntax.OpEndText, + Flags: syntax.Perl, + }, + }, + } + return simplify(ast.Simplify()), nil +} + +// ensureRegexpUnanchored strips '^' and '$' characters from appropriate locations in the parsed syntax.Regexp, +// to ensure every input regular expression is converted to it's equivalent un-anchored regular expression +// assuming the entire input is matched. +func ensureRegexpUnanchored(parsed *syntax.Regexp) (*syntax.Regexp, error) { + r, _, err := ensureRegexpUnanchoredHelper(parsed, true, true) + if err != nil { + return nil, err + } + return simplify(r), nil +} + +func ensureRegexpUnanchoredHelper(parsed *syntax.Regexp, leftmost, rightmost bool) (output *syntax.Regexp, changed bool, err error) { + // short circuit when we know we won't make any changes to the underlying regexp. + if !leftmost && !rightmost { + return parsed, false, nil + } + + switch parsed.Op { + case syntax.OpBeginLine, syntax.OpEndLine: + // i.e. the flags provided to syntax.Parse did not include the `OneLine` flag, which + // should never happen as we're using syntax.Perl which does include it (ensured by a test + // in this package). + return nil, false, fmt.Errorf("regular expressions are forced to be single line") + case syntax.OpBeginText: + if leftmost { + return &syntax.Regexp{ + Op: syntax.OpEmptyMatch, + Flags: parsed.Flags, + }, true, nil + } + case syntax.OpEndText: + if rightmost { + return &syntax.Regexp{ + Op: syntax.OpEmptyMatch, + Flags: parsed.Flags, + }, true, nil + } + case syntax.OpCapture: + // because golang regexp's don't allow backreferences, we don't care about maintaining capture + // group namings and can treate captures the same as we do conactenations. + fallthrough + case syntax.OpConcat: + changed := false + // strip left-most '^' + if l := len(parsed.Sub); leftmost && l > 0 { + newRe, c, err := ensureRegexpUnanchoredHelper(parsed.Sub[0], leftmost, rightmost && l == 1) + if err != nil { + return nil, false, err + } + if c { + parsed.Sub[0] = newRe + changed = true + } + } + // strip right-most '$' + if l := len(parsed.Sub); rightmost && l > 0 { + newRe, c, err := ensureRegexpUnanchoredHelper(parsed.Sub[l-1], leftmost && l == 1, rightmost) + if err != nil { + return nil, false, err + } + if c { + parsed.Sub[l-1] = newRe + changed = true + } + } + return parsed, changed, nil + case syntax.OpAlternate: + changed := false + // strip left-most '^' and right-most '$' in each sub-expression + for idx := range parsed.Sub { + newRe, c, err := ensureRegexpUnanchoredHelper(parsed.Sub[idx], leftmost, rightmost) + if err != nil { + return nil, false, err + } + if c { + parsed.Sub[idx] = newRe + changed = true + } + } + return parsed, changed, nil + case syntax.OpQuest: + if len(parsed.Sub) > 0 { + newRe, c, err := ensureRegexpUnanchoredHelper(parsed.Sub[0], leftmost, rightmost) + if err != nil { + return nil, false, err + } + if c { + parsed.Sub[0] = newRe + return parsed, true, nil + } + } + case syntax.OpStar: + if len(parsed.Sub) > 0 { + original := deepCopy(parsed) + newRe, c, err := ensureRegexpUnanchoredHelper(parsed.Sub[0], leftmost, rightmost) + if err != nil { + return nil, false, err + } + if !c { + return parsed, false, nil + } + return &syntax.Regexp{ + Op: syntax.OpConcat, + Flags: parsed.Flags, + Sub: []*syntax.Regexp{ + &syntax.Regexp{ + Op: syntax.OpQuest, + Flags: parsed.Flags, + Sub: []*syntax.Regexp{ + newRe, + }, + }, + original, + }, + }, true, nil + } + case syntax.OpPlus: + if len(parsed.Sub) > 0 { + original := deepCopy(parsed) + newRe, c, err := ensureRegexpUnanchoredHelper(parsed.Sub[0], leftmost, rightmost) + if err != nil { + return nil, false, err + } + if !c { + return parsed, false, nil + } + return &syntax.Regexp{ + Op: syntax.OpConcat, + Flags: parsed.Flags, + Sub: []*syntax.Regexp{ + newRe, + &syntax.Regexp{ + Op: syntax.OpStar, + Flags: parsed.Flags, + Sub: []*syntax.Regexp{ + original.Sub[0], + }, + }, + }, + }, true, nil + } + case syntax.OpRepeat: + if len(parsed.Sub) > 0 && parsed.Min > 0 { + original := deepCopy(parsed) + newRe, c, err := ensureRegexpUnanchoredHelper(parsed.Sub[0], leftmost, rightmost) + if err != nil { + return nil, false, err + } + if !c { + return parsed, false, nil + } + original.Min-- + if original.Max != -1 { + original.Max-- + } + return &syntax.Regexp{ + Op: syntax.OpConcat, + Flags: parsed.Flags, + Sub: []*syntax.Regexp{ + newRe, + original, + }, + }, true, nil + } + } + return parsed, false, nil +} + +func deepCopy(ast *syntax.Regexp) *syntax.Regexp { + if ast == nil { + return nil + } + copied := *ast + copied.Sub = make([]*syntax.Regexp, 0, len(ast.Sub)) + for _, r := range ast.Sub { + copied.Sub = append(copied.Sub, deepCopy(r)) + } + if len(copied.Sub0) != 0 && copied.Sub0[0] != nil { + copied.Sub0[0] = deepCopy(copied.Sub0[0]) + } + // NB(prateek): we don't copy ast.Rune (which could be a heap allocated slice) intentionally, + // because none of the transformations we apply modify the Rune slice. + return &copied +} + +var emptyStringOps = []syntax.Op{ + syntax.OpEmptyMatch, syntax.OpQuest, syntax.OpPlus, syntax.OpStar, syntax.OpRepeat, +} + +func matchesEmptyString(ast *syntax.Regexp) bool { + if ast == nil { + return false + } + for _, op := range emptyStringOps { + if ast.Op == op { + if len(ast.Sub) > 0 { + return matchesEmptyString(ast.Sub[0]) + } + return true + } + } + return false +} + +func simplify(ast *syntax.Regexp) *syntax.Regexp { + newAst, _ := simplifyHelper(ast) + return newAst +} + +func simplifyHelper(ast *syntax.Regexp) (*syntax.Regexp, bool) { + if ast == nil { + return nil, false + } + switch ast.Op { + case syntax.OpConcat: + // a concatenation of a single sub-expression is the same as the sub-expression itself + if len(ast.Sub) == 1 { + return ast.Sub[0], true + } + + changed := false + // check if we have any concats of concats, if so, we can pull the ones below this level up + subs := make([]*syntax.Regexp, 0, len(ast.Sub)) + for _, sub := range ast.Sub { + if sub.Op == syntax.OpConcat { + subs = append(subs, sub.Sub...) + changed = true + continue + } + // skip any sub expressions that devolve to matching only the empty string + if matchesEmptyString(sub) { + changed = true + continue + } + subs = append(subs, sub) + } + + // now ensure we simplify all sub-expressions + for idx := range subs { + s, c := simplifyHelper(subs[idx]) + if c { + subs[idx] = s + changed = true + } + } + + // if we have made any changes to sub-expressions, need to continue simplification + // until we are sure there are no more changes. + if changed { + ast.Sub = subs + return simplifyHelper(ast) + } + default: + changed := false + for idx := range ast.Sub { + newRe, c := simplifyHelper(ast.Sub[idx]) + if c { + ast.Sub[idx] = newRe + changed = true + } + } + return ast, changed + } + return ast, false +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/builder.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/builder.go new file mode 100644 index 00000000..ac1cd597 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/builder.go @@ -0,0 +1,565 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "errors" + "fmt" + "runtime" + "sync" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/util" + + "github.com/cespare/xxhash/v2" + "github.com/twotwotwo/sorts" +) + +var ( + errDocNotFound = errors.New("doc not found") + errClosed = errors.New("builder closed") +) + +const ( + // Slightly buffer the work to avoid blocking main thread. + indexQueueSize = 2 << 9 // 1024 + entriesPerIndexJob = 32 +) + +var ( + globalIndexWorkers = &indexWorkers{} + fieldsMapSetOptions = fieldsMapSetUnsafeOptions{ + // Builder takes ownership of keys and docs so it's ok + // to avoid copying and finalizing keys. + NoCopyKey: true, + NoFinalizeKey: true, + } +) + +type indexWorkers struct { + sync.RWMutex + builders int + queues []chan indexJob +} + +type indexJob struct { + wg *sync.WaitGroup + + opts Options + + entries [entriesPerIndexJob]indexJobEntry + usedEntries int + + shard int + shardedFields *shardedFields + + batchErr *index.BatchPartialError +} + +type indexJobEntry struct { + id postings.ID + field doc.Field + docIdx int +} + +func (w *indexWorkers) registerBuilder() { + w.Lock() + defer w.Unlock() + + preIncBuilders := w.builders + w.builders++ + + if preIncBuilders != 0 { + return // Already initialized. + } + + // Need to initialize structures, prepare all num CPU + // worker queues, even if we don't use all of them. + n := runtime.NumCPU() + if cap(w.queues) == 0 { + w.queues = make([]chan indexJob, 0, n) + } else { + // Reuse existing queues slice. + w.queues = w.queues[:0] + } + + // Start the workers. + for i := 0; i < n; i++ { + indexQueue := make(chan indexJob, indexQueueSize) + w.queues = append(w.queues, indexQueue) + go w.indexWorker(indexQueue) + } +} + +func (w *indexWorkers) indexWorker(indexQueue <-chan indexJob) { + for job := range indexQueue { + for i := 0; i < job.usedEntries; i++ { + entry := job.entries[i] + terms, ok := job.shardedFields.fields.ShardedGet(job.shard, entry.field.Name) + if !ok { + // NB(bodu): Check again within the lock to make sure we aren't making concurrent map writes. + terms = newTerms(job.opts) + job.shardedFields.fields.ShardedSetUnsafe(job.shard, entry.field.Name, + terms, fieldsMapSetOptions) + } + + // If empty field, track insertion of this key into the fields + // collection for correct response when retrieving all fields. + newField := terms.size() == 0 + // NB(bodu): Bulk of the cpu time during insertion is spent inside of terms.post(). + err := terms.post(entry.field.Value, entry.id) + if err != nil { + job.batchErr.AddWithLock(index.BatchError{Err: err, Idx: entry.docIdx}) + } + if err == nil && newField { + newEntry := uniqueField{ + field: entry.field.Name, + postingsList: terms.postingsListUnion, + } + job.shardedFields.uniqueFields[job.shard] = + append(job.shardedFields.uniqueFields[job.shard], newEntry) + } + } + + job.wg.Done() + } +} + +func (w *indexWorkers) indexJob(job indexJob) { + w.queues[job.shard] <- job +} + +func (w *indexWorkers) unregisterBuilder() { + w.Lock() + defer w.Unlock() + + w.builders-- + + if w.builders != 0 { + return // Still have registered builders, cannot spin down yet. + } + + // Close the workers. + for i := range w.queues { + close(w.queues[i]) + w.queues[i] = nil + } + w.queues = w.queues[:0] +} + +type builderStatus struct { + sync.RWMutex + closed bool +} + +type builder struct { + opts Options + newUUIDFn util.NewUUIDFn + + batchSizeOne index.Batch + docs []doc.Document + idSet *IDsMap + shardedJobs []indexJob + shardedFields *shardedFields + concurrency int + + status builderStatus +} + +type shardedFields struct { + fields *shardedFieldsMap + uniqueFields [][]uniqueField +} + +// NewBuilderFromDocuments returns a builder from documents, it is +// not thread safe and is optimized for insertion speed and a +// final build step when documents are indexed. +func NewBuilderFromDocuments(opts Options) (segment.CloseableDocumentsBuilder, error) { + b := &builder{ + opts: opts, + newUUIDFn: opts.NewUUIDFn(), + batchSizeOne: index.Batch{ + Docs: make([]doc.Document, 1), + }, + idSet: NewIDsMap(IDsMapOptions{ + InitialSize: opts.InitialCapacity(), + }), + shardedFields: &shardedFields{}, + } + // Indiciate we need to spin up workers if we haven't already. + globalIndexWorkers.registerBuilder() + b.SetIndexConcurrency(opts.Concurrency()) + return b, nil +} + +func (b *builder) SetIndexConcurrency(value int) { + b.status.Lock() + defer b.status.Unlock() + + if b.concurrency == value { + return // No-op + } + + b.concurrency = value + + // Nothing to migrate, jobs only used during a batch insertion. + b.shardedJobs = make([]indexJob, b.concurrency) + + // Take refs to existing fields to migrate. + existingUniqueFields := b.shardedFields.uniqueFields + existingFields := b.shardedFields.fields + + b.shardedFields.uniqueFields = make([][]uniqueField, 0, b.concurrency) + b.shardedFields.fields = newShardedFieldsMap(b.concurrency, b.opts.InitialCapacity()) + + for i := 0; i < b.concurrency; i++ { + // Give each shard a fraction of the configured initial capacity. + shardInitialCapacity := b.opts.InitialCapacity() + if shardInitialCapacity > 0 { + shardInitialCapacity /= b.concurrency + } + + shardUniqueFields := make([]uniqueField, 0, shardInitialCapacity) + b.shardedFields.uniqueFields = + append(b.shardedFields.uniqueFields, shardUniqueFields) + } + + // Migrate data from existing unique fields. + if existingUniqueFields != nil { + for _, fields := range existingUniqueFields { + for _, field := range fields { + // Calculate the new shard for the field. + newShard := b.calculateShardWithRLock(field.field) + + // Append to the correct shard. + b.shardedFields.uniqueFields[newShard] = + append(b.shardedFields.uniqueFields[newShard], field) + } + } + } + + // Migrate from fields. + if existingFields != nil { + for _, fields := range existingFields.data { + for _, entry := range fields.Iter() { + field := entry.Key() + terms := entry.Value() + + // Calculate the new shard for the field. + newShard := b.calculateShardWithRLock(field) + + // Set with new correct shard. + b.shardedFields.fields.ShardedSetUnsafe(newShard, field, + terms, fieldsMapSetOptions) + } + } + } +} + +func (b *builder) IndexConcurrency() int { + b.status.RLock() + defer b.status.RUnlock() + + return b.concurrency +} + +func (b *builder) Reset() { + b.status.Lock() + defer b.status.Unlock() + + // Reset the documents slice. + var empty doc.Document + for i := range b.docs { + b.docs[i] = empty + } + b.docs = b.docs[:0] + + // Remove all entries in the ID set. + b.idSet.Reset() + + // Keep fields around, just reset the terms set for each one. + b.shardedFields.fields.ResetTermsSets() + + // Reset the unique fields slice + var emptyField uniqueField + for i, shardUniqueFields := range b.shardedFields.uniqueFields { + for i := range shardUniqueFields { + shardUniqueFields[i] = emptyField + } + b.shardedFields.uniqueFields[i] = shardUniqueFields[:0] + } +} + +func (b *builder) Insert(d doc.Document) ([]byte, error) { + b.status.Lock() + defer b.status.Unlock() + + // Use a preallocated slice to make insert able to avoid alloc + // a slice to call insert batch with. + b.batchSizeOne.Docs[0] = d + err := b.insertBatchWithLock(b.batchSizeOne) + if err != nil { + if errs := err.Errs(); len(errs) == 1 { + // Return concrete error instead of the batch partial error. + return nil, errs[0].Err + } + // Fallback to returning batch partial error if not what we expect. + return nil, err + } + last := b.docs[len(b.docs)-1] + return last.ID, nil +} + +func (b *builder) InsertBatch(batch index.Batch) error { + b.status.Lock() + defer b.status.Unlock() + + if b.status.closed { + return errClosed + } + + // NB(r): This switch is required or else *index.BatchPartialError + // is returned as a non-nil wrapped "error" even though it is not + // an error and underlying error is nil. + if err := b.insertBatchWithLock(batch); err != nil { + return err + } + return nil +} + +func (b *builder) resetShardedJobs() { + // Reset sharded jobs using memset optimization. + var jobZeroed indexJob + for i := range b.shardedJobs { + b.shardedJobs[i] = jobZeroed + } +} + +func (b *builder) insertBatchWithLock(batch index.Batch) *index.BatchPartialError { + // NB(r): This is all kept in a single method to make the + // insertion path avoid too much function call overhead. + wg := &sync.WaitGroup{} + batchErr := index.NewBatchPartialError() + + // Reset shared resources and at cleanup too to remove refs. + b.resetShardedJobs() + defer b.resetShardedJobs() + + // Enqueue docs for indexing. + for i, d := range batch.Docs { + // Validate doc + if err := d.Validate(); err != nil { + batchErr.Add(index.BatchError{Err: err, Idx: i}) + continue + } + + // Generate ID if needed. + if !d.HasID() { + id, err := b.newUUIDFn() + if err != nil { + batchErr.Add(index.BatchError{Err: err, Idx: i}) + continue + } + + d.ID = id + + // Update the document in the batch since we added an ID to it. + batch.Docs[i] = d + } + + // Avoid duplicates. + if _, ok := b.idSet.Get(d.ID); ok { + batchErr.Add(index.BatchError{Err: index.ErrDuplicateID, Idx: i}) + continue + } + + // Write to document set. + b.idSet.SetUnsafe(d.ID, struct{}{}, IDsMapSetUnsafeOptions{ + NoCopyKey: true, + NoFinalizeKey: true, + }) + + // Every new document just gets the next available id. + postingsListID := len(b.docs) + b.docs = append(b.docs, d) + + // Index the terms. + for _, f := range d.Fields { + b.queueIndexJobEntryWithLock(wg, postings.ID(postingsListID), f, i, batchErr) + } + b.queueIndexJobEntryWithLock(wg, postings.ID(postingsListID), doc.Field{ + Name: doc.IDReservedFieldName, + Value: d.ID, + }, i, batchErr) + } + + // Enqueue any partially filled sharded jobs. + for shard := 0; shard < b.concurrency; shard++ { + if b.shardedJobs[shard].usedEntries > 0 { + b.flushShardedIndexJobWithLock(shard, wg, batchErr) + } + } + + // Wait for all the concurrent indexing jobs to finish. + wg.Wait() + + if !batchErr.IsEmpty() { + return batchErr + } + return nil +} + +func (b *builder) queueIndexJobEntryWithLock( + wg *sync.WaitGroup, + id postings.ID, + field doc.Field, + docIdx int, + batchErr *index.BatchPartialError, +) { + shard := b.calculateShardWithRLock(field.Name) + entryIndex := b.shardedJobs[shard].usedEntries + b.shardedJobs[shard].usedEntries++ + b.shardedJobs[shard].entries[entryIndex].id = id + b.shardedJobs[shard].entries[entryIndex].field = field + b.shardedJobs[shard].entries[entryIndex].docIdx = docIdx + + numEntries := b.shardedJobs[shard].usedEntries + if numEntries != entriesPerIndexJob { + return + } + + // Ready to flush this job since all entries are used. + b.flushShardedIndexJobWithLock(shard, wg, batchErr) + + // Reset for reuse. + b.shardedJobs[shard] = indexJob{} +} + +func (b *builder) flushShardedIndexJobWithLock( + shard int, + wg *sync.WaitGroup, + batchErr *index.BatchPartialError, +) { + // Set common fields. + b.shardedJobs[shard].shard = shard + b.shardedJobs[shard].wg = wg + b.shardedJobs[shard].batchErr = batchErr + b.shardedJobs[shard].shardedFields = b.shardedFields + b.shardedJobs[shard].opts = b.opts + + // Enqueue job. + wg.Add(1) + globalIndexWorkers.indexJob(b.shardedJobs[shard]) +} + +func (b *builder) calculateShardWithRLock(field []byte) int { + return int(xxhash.Sum64(field) % uint64(b.concurrency)) +} + +func (b *builder) AllDocs() (index.IDDocIterator, error) { + b.status.RLock() + defer b.status.RUnlock() + + rangeIter := postings.NewRangeIterator(0, postings.ID(len(b.docs))) + return index.NewIDDocIterator(b, rangeIter), nil +} + +func (b *builder) Doc(id postings.ID) (doc.Document, error) { + b.status.RLock() + defer b.status.RUnlock() + + idx := int(id) + if idx < 0 || idx >= len(b.docs) { + return doc.Document{}, errDocNotFound + } + + return b.docs[idx], nil +} + +func (b *builder) Docs() []doc.Document { + b.status.RLock() + defer b.status.RUnlock() + + return b.docs +} + +func (b *builder) FieldsIterable() segment.FieldsPostingsListIterable { + return b +} + +func (b *builder) TermsIterable() segment.TermsIterable { + return b +} + +func (b *builder) FieldsPostingsList() (segment.FieldsPostingsListIterator, error) { + // NB(r): Need write lock since sort in newOrderedFieldsPostingsListIter + // and SetConcurrency causes sharded fields to change. + b.status.Lock() + defer b.status.Unlock() + + return newOrderedFieldsPostingsListIter(b.shardedFields.uniqueFields), nil +} + +func (b *builder) Terms(field []byte) (segment.TermsIterator, error) { + // NB(r): Need write lock since sort if required below + // and SetConcurrency causes sharded fields to change. + b.status.Lock() + defer b.status.Unlock() + + shard := b.calculateShardWithRLock(field) + terms, ok := b.shardedFields.fields.ShardedGet(shard, field) + if !ok { + return nil, fmt.Errorf("field not found: %s", string(field)) + } + + // NB(r): Ensure always sorted so can be used to build an FST which + // requires in order insertion. + terms.sortIfRequired() + + return newTermsIter(terms.uniqueTerms), nil +} + +func (b *builder) Close() error { + b.status.Lock() + defer b.status.Unlock() + + b.status.closed = true + // Indiciate we could possibly spin down workers if no builders open. + globalIndexWorkers.unregisterBuilder() + return nil +} + +var ( + sortConcurrencyLock sync.RWMutex +) + +// SetSortConcurrency sets the sort concurrency for when +// building segments, unfortunately this must be set globally +// since github.com/twotwotwo/sorts does not provide an +// ability to set parallelism on call to sort. +func SetSortConcurrency(value int) { + sortConcurrencyLock.Lock() + sorts.MaxProcs = value + sortConcurrencyLock.Unlock() +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/bytes_slice_iter.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/bytes_slice_iter.go new file mode 100644 index 00000000..f627388d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/bytes_slice_iter.go @@ -0,0 +1,144 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "bytes" + + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + + "github.com/twotwotwo/sorts" +) + +type uniqueField struct { + field []byte + postingsList postings.List +} + +// orderedFieldsPostingsListIter is a new ordered fields/postings list iterator. +type orderedFieldsPostingsListIter struct { + err error + done bool + + currentIdx int + current uniqueField + backingSlices *sortableSliceOfSliceOfUniqueFieldsAsc +} + +var _ segment.FieldsPostingsListIterator = &orderedFieldsPostingsListIter{} + +// newOrderedFieldsPostingsListIter sorts a slice of slices of unique fields and then +// returns an iterator over them. +func newOrderedFieldsPostingsListIter( + maybeUnorderedFields [][]uniqueField, +) *orderedFieldsPostingsListIter { + sortable := &sortableSliceOfSliceOfUniqueFieldsAsc{data: maybeUnorderedFields} + // NB(r): See SetSortConcurrency why this RLock is required. + sortConcurrencyLock.RLock() + sorts.ByBytes(sortable) + sortConcurrencyLock.RUnlock() + return &orderedFieldsPostingsListIter{ + currentIdx: -1, + backingSlices: sortable, + } +} + +// Next returns true if there is a next result. +func (b *orderedFieldsPostingsListIter) Next() bool { + if b.done || b.err != nil { + return false + } + b.currentIdx++ + if b.currentIdx >= b.backingSlices.Len() { + b.done = true + return false + } + iOuter, iInner := b.backingSlices.getIndices(b.currentIdx) + b.current = b.backingSlices.data[iOuter][iInner] + return true +} + +// Current returns the current entry. +func (b *orderedFieldsPostingsListIter) Current() ([]byte, postings.List) { + return b.current.field, b.current.postingsList +} + +// Err returns an error if an error occurred iterating. +func (b *orderedFieldsPostingsListIter) Err() error { + return nil +} + +// Len returns the length of the slice. +func (b *orderedFieldsPostingsListIter) Len() int { + return b.backingSlices.Len() +} + +// Close releases resources. +func (b *orderedFieldsPostingsListIter) Close() error { + b.current = uniqueField{} + return nil +} + +type sortableSliceOfSliceOfUniqueFieldsAsc struct { + data [][]uniqueField + length int +} + +func (s *sortableSliceOfSliceOfUniqueFieldsAsc) Len() int { + if s.length > 0 { + return s.length + } + + totalLen := 0 + for _, innerSlice := range s.data { + totalLen += len(innerSlice) + } + s.length = totalLen + + return s.length +} + +func (s *sortableSliceOfSliceOfUniqueFieldsAsc) Less(i, j int) bool { + iOuter, iInner := s.getIndices(i) + jOuter, jInner := s.getIndices(j) + return bytes.Compare(s.data[iOuter][iInner].field, s.data[jOuter][jInner].field) < 0 +} + +func (s *sortableSliceOfSliceOfUniqueFieldsAsc) Swap(i, j int) { + iOuter, iInner := s.getIndices(i) + jOuter, jInner := s.getIndices(j) + s.data[iOuter][iInner], s.data[jOuter][jInner] = s.data[jOuter][jInner], s.data[iOuter][iInner] +} + +func (s *sortableSliceOfSliceOfUniqueFieldsAsc) Key(i int) []byte { + iOuter, iInner := s.getIndices(i) + return s.data[iOuter][iInner].field +} + +func (s *sortableSliceOfSliceOfUniqueFieldsAsc) getIndices(idx int) (int, int) { + currentSliceIdx := 0 + for idx >= len(s.data[currentSliceIdx]) { + idx -= len(s.data[currentSliceIdx]) + currentSliceIdx++ + } + return currentSliceIdx, idx +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/fields_map_gen.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/fields_map_gen.go new file mode 100644 index 00000000..82d8ad3a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/fields_map_gen.go @@ -0,0 +1,295 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package builder + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// fieldsMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type fieldsMapHash uint64 + +// fieldsMapHashFn is the hash function to execute when hashing a key. +type fieldsMapHashFn func([]byte) fieldsMapHash + +// fieldsMapEqualsFn is the equals key function to execute when detecting equality of a key. +type fieldsMapEqualsFn func([]byte, []byte) bool + +// fieldsMapCopyFn is the copy key function to execute when copying the key. +type fieldsMapCopyFn func([]byte) []byte + +// fieldsMapFinalizeFn is the finalize key function to execute when finished with a key. +type fieldsMapFinalizeFn func([]byte) + +// fieldsMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// fieldsMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type fieldsMap struct { + _fieldsMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[fieldsMapHash]fieldsMapEntry +} + +// _fieldsMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _fieldsMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash fieldsMapHashFn + // equals is the equals key function to execute when detecting equality. + equals fieldsMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy fieldsMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize fieldsMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// fieldsMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type fieldsMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _fieldsMapKey + // value type stored + value *terms +} + +type _fieldsMapKey struct { + key []byte + finalize bool +} + +// Key returns the map entry key. +func (e fieldsMapEntry) Key() []byte { + return e.key.key +} + +// Value returns the map entry value. +func (e fieldsMapEntry) Value() *terms { + return e.value +} + +// _fieldsMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _fieldsMapAlloc(opts _fieldsMapOptions) *fieldsMap { + m := &fieldsMap{_fieldsMapOptions: opts} + m.Reallocate() + return m +} + +func (m *fieldsMap) newMapKey(k []byte, opts _fieldsMapKeyOptions) _fieldsMapKey { + key := _fieldsMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *fieldsMap) removeMapKey(hash fieldsMapHash, key _fieldsMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *fieldsMap) Get(k []byte) (*terms, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty *terms + return empty, false +} + +// Set will set the value for an identifier. +func (m *fieldsMap) Set(k []byte, v *terms) { + m.set(k, v, _fieldsMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// fieldsMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type fieldsMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *fieldsMap) SetUnsafe(k []byte, v *terms, opts fieldsMapSetUnsafeOptions) { + m.set(k, v, _fieldsMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _fieldsMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *fieldsMap) set(k []byte, v *terms, opts _fieldsMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = fieldsMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = fieldsMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *fieldsMap) Iter() map[fieldsMapHash]fieldsMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *fieldsMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *fieldsMap) Contains(k []byte) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *fieldsMap) Delete(k []byte) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *fieldsMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *fieldsMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[fieldsMapHash]fieldsMapEntry, m.initialSize) + } else { + m.lookup = make(map[fieldsMapHash]fieldsMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/fields_map_new.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/fields_map_new.go new file mode 100644 index 00000000..015a1e21 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/fields_map_new.go @@ -0,0 +1,91 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package builder + +import ( + "bytes" + + "github.com/m3db/m3/src/x/pool" + + "github.com/cespare/xxhash/v2" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// fieldsMapOptions provides options used when created the map. +type fieldsMapOptions struct { + InitialSize int + KeyCopyPool pool.BytesPool +} + +// newFieldsMap returns a new byte keyed map. +func newFieldsMap(opts fieldsMapOptions) *fieldsMap { + var ( + copyFn fieldsMapCopyFn + finalizeFn fieldsMapFinalizeFn + ) + if pool := opts.KeyCopyPool; pool == nil { + copyFn = func(k []byte) []byte { + return append([]byte(nil), k...) + } + } else { + copyFn = func(k []byte) []byte { + keyLen := len(k) + pooled := pool.Get(keyLen)[:keyLen] + copy(pooled, k) + return pooled + } + finalizeFn = func(k []byte) { + pool.Put(k) + } + } + return _fieldsMapAlloc(_fieldsMapOptions{ + hash: func(k []byte) fieldsMapHash { + return fieldsMapHash(xxhash.Sum64(k)) + }, + equals: bytes.Equal, + copy: copyFn, + finalize: finalizeFn, + initialSize: opts.InitialSize, + }) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/ids_map_gen.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/ids_map_gen.go new file mode 100644 index 00000000..621fe1b4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/ids_map_gen.go @@ -0,0 +1,295 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package builder + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// IDsMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type IDsMapHash uint64 + +// IDsMapHashFn is the hash function to execute when hashing a key. +type IDsMapHashFn func([]byte) IDsMapHash + +// IDsMapEqualsFn is the equals key function to execute when detecting equality of a key. +type IDsMapEqualsFn func([]byte, []byte) bool + +// IDsMapCopyFn is the copy key function to execute when copying the key. +type IDsMapCopyFn func([]byte) []byte + +// IDsMapFinalizeFn is the finalize key function to execute when finished with a key. +type IDsMapFinalizeFn func([]byte) + +// IDsMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// IDsMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type IDsMap struct { + _IDsMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[IDsMapHash]IDsMapEntry +} + +// _IDsMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _IDsMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash IDsMapHashFn + // equals is the equals key function to execute when detecting equality. + equals IDsMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy IDsMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize IDsMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// IDsMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type IDsMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _IDsMapKey + // value type stored + value struct{} +} + +type _IDsMapKey struct { + key []byte + finalize bool +} + +// Key returns the map entry key. +func (e IDsMapEntry) Key() []byte { + return e.key.key +} + +// Value returns the map entry value. +func (e IDsMapEntry) Value() struct{} { + return e.value +} + +// _IDsMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _IDsMapAlloc(opts _IDsMapOptions) *IDsMap { + m := &IDsMap{_IDsMapOptions: opts} + m.Reallocate() + return m +} + +func (m *IDsMap) newMapKey(k []byte, opts _IDsMapKeyOptions) _IDsMapKey { + key := _IDsMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *IDsMap) removeMapKey(hash IDsMapHash, key _IDsMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *IDsMap) Get(k []byte) (struct{}, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty struct{} + return empty, false +} + +// Set will set the value for an identifier. +func (m *IDsMap) Set(k []byte, v struct{}) { + m.set(k, v, _IDsMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// IDsMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type IDsMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *IDsMap) SetUnsafe(k []byte, v struct{}, opts IDsMapSetUnsafeOptions) { + m.set(k, v, _IDsMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _IDsMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *IDsMap) set(k []byte, v struct{}, opts _IDsMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = IDsMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = IDsMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *IDsMap) Iter() map[IDsMapHash]IDsMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *IDsMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *IDsMap) Contains(k []byte) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *IDsMap) Delete(k []byte) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *IDsMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *IDsMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[IDsMapHash]IDsMapEntry, m.initialSize) + } else { + m.lookup = make(map[IDsMapHash]IDsMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/ids_map_new.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/ids_map_new.go new file mode 100644 index 00000000..757181e4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/ids_map_new.go @@ -0,0 +1,91 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package builder + +import ( + "bytes" + + "github.com/m3db/m3/src/x/pool" + + "github.com/cespare/xxhash/v2" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// IDsMapOptions provides options used when created the map. +type IDsMapOptions struct { + InitialSize int + KeyCopyPool pool.BytesPool +} + +// NewIDsMap returns a new byte keyed map. +func NewIDsMap(opts IDsMapOptions) *IDsMap { + var ( + copyFn IDsMapCopyFn + finalizeFn IDsMapFinalizeFn + ) + if pool := opts.KeyCopyPool; pool == nil { + copyFn = func(k []byte) []byte { + return append([]byte(nil), k...) + } + } else { + copyFn = func(k []byte) []byte { + keyLen := len(k) + pooled := pool.Get(keyLen)[:keyLen] + copy(pooled, k) + return pooled + } + finalizeFn = func(k []byte) { + pool.Put(k) + } + } + return _IDsMapAlloc(_IDsMapOptions{ + hash: func(k []byte) IDsMapHash { + return IDsMapHash(xxhash.Sum64(k)) + }, + equals: bytes.Equal, + copy: copyFn, + finalize: finalizeFn, + initialSize: opts.InitialSize, + }) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_builder.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_builder.go new file mode 100644 index 00000000..459b93f5 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_builder.go @@ -0,0 +1,200 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "io" + "sort" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + xerrors "github.com/m3db/m3/src/x/errors" +) + +type builderFromSegments struct { + docs []doc.Document + idSet *IDsMap + segments []segmentMetadata + termsIter *termsIterFromSegments + segmentsOffset postings.ID +} + +type segmentMetadata struct { + segment segment.Segment + offset postings.ID + // duplicatesAsc is a lookup of document IDs are duplicates + // in this segment, that is documents that are already + // contained by other segments and hence should not be + // returned when looking up documents. + duplicatesAsc []postings.ID +} + +// NewBuilderFromSegments returns a new builder from segments. +func NewBuilderFromSegments(opts Options) segment.SegmentsBuilder { + return &builderFromSegments{ + idSet: NewIDsMap(IDsMapOptions{ + InitialSize: opts.InitialCapacity(), + }), + termsIter: newTermsIterFromSegments(), + } +} + +func (b *builderFromSegments) Reset() { + // Reset the documents slice + var emptyDoc doc.Document + for i := range b.docs { + b.docs[i] = emptyDoc + } + b.docs = b.docs[:0] + + // Reset all entries in ID set + b.idSet.Reset() + + // Reset the segments metadata + b.segmentsOffset = 0 + var emptySegment segmentMetadata + for i := range b.segments { + b.segments[i] = emptySegment + } + b.segments = b.segments[:0] + + b.termsIter.clear() +} + +func (b *builderFromSegments) AddSegments(segments []segment.Segment) error { + // numMaxDocs can sometimes be larger than the actual number of documents + // since some are duplicates + numMaxDocs := 0 + for _, segment := range segments { + numMaxDocs += int(segment.Size()) + } + + // Ensure we don't have to constantly reallocate docs slice + totalMaxSize := len(b.docs) + numMaxDocs + if cap(b.docs) < totalMaxSize { + b.docs = make([]doc.Document, 0, totalMaxSize) + } + + // First build metadata and docs slice + for _, segment := range segments { + iter, closer, err := allDocsIter(segment) + if err != nil { + return err + } + + var ( + added int + duplicates []postings.ID + ) + for iter.Next() { + d := iter.Current() + if b.idSet.Contains(d.ID) { + duplicates = append(duplicates, iter.PostingsID()) + continue + } + b.idSet.SetUnsafe(d.ID, struct{}{}, IDsMapSetUnsafeOptions{ + NoCopyKey: true, + NoFinalizeKey: true, + }) + b.docs = append(b.docs, d) + added++ + } + + err = xerrors.FirstError(iter.Err(), iter.Close(), closer.Close()) + if err != nil { + return err + } + + // Sort duplicates in ascending order + sort.Slice(duplicates, func(i, j int) bool { + return duplicates[i] < duplicates[j] + }) + + b.segments = append(b.segments, segmentMetadata{ + segment: segment, + offset: b.segmentsOffset, + duplicatesAsc: duplicates, + }) + b.segmentsOffset += postings.ID(added) + } + + // Make sure the terms iter has all the segments to combine data from + b.termsIter.reset(b.segments) + + return nil +} + +func (b *builderFromSegments) Docs() []doc.Document { + return b.docs +} + +func (b *builderFromSegments) AllDocs() (index.IDDocIterator, error) { + rangeIter := postings.NewRangeIterator(0, postings.ID(len(b.docs))) + return index.NewIDDocIterator(b, rangeIter), nil +} + +func (b *builderFromSegments) Doc(id postings.ID) (doc.Document, error) { + idx := int(id) + if idx < 0 || idx >= len(b.docs) { + return doc.Document{}, errDocNotFound + } + + return b.docs[idx], nil +} + +func (b *builderFromSegments) FieldsIterable() segment.FieldsIterable { + return b +} + +func (b *builderFromSegments) TermsIterable() segment.TermsIterable { + return b +} + +func (b *builderFromSegments) Fields() (segment.FieldsIterator, error) { + return newFieldIterFromSegments(b.segments) +} + +func (b *builderFromSegments) FieldsPostingsList() (segment.FieldsPostingsListIterator, error) { + return newFieldPostingsListIterFromSegments(b.segments) +} + +func (b *builderFromSegments) Terms(field []byte) (segment.TermsIterator, error) { + if err := b.termsIter.setField(field); err != nil { + return nil, err + } + return b.termsIter, nil +} + +func allDocsIter(seg segment.Segment) (index.IDDocIterator, io.Closer, error) { + reader, err := seg.Reader() + if err != nil { + return nil, nil, err + } + + iter, err := reader.AllDocs() + if err != nil { + return nil, nil, err + } + + return iter, reader, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_field_iter.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_field_iter.go new file mode 100644 index 00000000..8625fa93 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_field_iter.go @@ -0,0 +1,53 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "github.com/m3db/m3/src/m3ninx/index/segment" + xerrors "github.com/m3db/m3/src/x/errors" +) + +// Ensure for our use case that the multi key iterator we return +// matches the signature for the fields iterator. +var _ segment.FieldsIterator = &multiKeyIterator{} + +func newFieldIterFromSegments( + segments []segmentMetadata, +) (segment.FieldsIterator, error) { + multiIter := newMultiKeyIterator() + for _, seg := range segments { + iter, err := seg.segment.FieldsIterable().Fields() + if err != nil { + return nil, err + } + if !iter.Next() { + // Don't consume this iterator if no results. + if err := xerrors.FirstError(iter.Err(), iter.Close()); err != nil { + return nil, err + } + continue + } + + multiIter.add(iter) + } + + return multiIter, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_field_postings_list_iter.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_field_postings_list_iter.go new file mode 100644 index 00000000..08517b22 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_field_postings_list_iter.go @@ -0,0 +1,80 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "github.com/m3db/m3/src/m3ninx/index/segment" + xerrors "github.com/m3db/m3/src/x/errors" +) + +// Ensure for our use case that the multi key iterator we return +// matches the signature for the fields iterator. +var _ segment.FieldsPostingsListIterator = &multiKeyPostingsListIterator{} + +func newFieldPostingsListIterFromSegments( + segments []segmentMetadata, +) (segment.FieldsPostingsListIterator, error) { + multiIter := newMultiKeyPostingsListIterator() + for _, seg := range segments { + iter, err := seg.segment.FieldsIterable().Fields() + if err != nil { + return nil, err + } + if !iter.Next() { + // Don't consume this iterator if no results. + if err := xerrors.FirstError(iter.Err(), iter.Close()); err != nil { + return nil, err + } + continue + } + + multiIter.add(&fieldsKeyIter{ + iter: iter, + segment: seg, + }) + } + + return multiIter, nil +} + +// fieldsKeyIter needs to be a keyIterator and contains a terms iterator +var _ keyIterator = &fieldsKeyIter{} + +type fieldsKeyIter struct { + iter segment.FieldsIterator + segment segmentMetadata +} + +func (i *fieldsKeyIter) Next() bool { + return i.iter.Next() +} + +func (i *fieldsKeyIter) Current() []byte { + return i.iter.Current() +} + +func (i *fieldsKeyIter) Err() error { + return i.iter.Err() +} + +func (i *fieldsKeyIter) Close() error { + return i.iter.Close() +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_multi_key_iter.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_multi_key_iter.go new file mode 100644 index 00000000..ef906244 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_multi_key_iter.go @@ -0,0 +1,164 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "bytes" + + xerrors "github.com/m3db/m3/src/x/errors" +) + +type keyIterator interface { + Next() bool + Current() []byte + Err() error + Close() error +} + +var _ keyIterator = &multiKeyIterator{} + +type multiKeyIterator struct { + firstNext bool + closeIters []keyIterator + iters []keyIterator + currIters []keyIterator +} + +func newMultiKeyIterator() *multiKeyIterator { + i := new(multiKeyIterator) + i.reset() + return i +} + +func (i *multiKeyIterator) reset() { + i.firstNext = true + + for j := range i.closeIters { + i.closeIters[j] = nil + } + i.closeIters = i.closeIters[:0] + + for j := range i.iters { + i.iters[j] = nil + } + i.iters = i.iters[:0] + + for j := range i.currIters { + i.currIters[j] = nil + } + i.currIters = i.currIters[:0] +} + +func (i *multiKeyIterator) add(iter keyIterator) { + i.closeIters = append(i.closeIters, iter) + i.iters = append(i.iters, iter) + i.tryAddCurr(iter) +} + +func (i *multiKeyIterator) Next() bool { + if len(i.iters) == 0 { + return false + } + + if i.firstNext { + i.firstNext = false + return true + } + + for _, currIter := range i.currIters { + currNext := currIter.Next() + if currNext { + // Next has a value, forward other matching too + continue + } + + // Remove iter + n := len(i.iters) + idx := -1 + for j, iter := range i.iters { + if iter == currIter { + idx = j + break + } + } + i.iters[idx] = i.iters[n-1] + i.iters[n-1] = nil + i.iters = i.iters[:n-1] + } + if len(i.iters) == 0 { + return false + } + + // Re-evaluate current value + i.currEvaluate() + return true +} + +func (i *multiKeyIterator) currEvaluate() { + i.currIters = i.currIters[:0] + for _, iter := range i.iters { + i.tryAddCurr(iter) + } +} + +func (i *multiKeyIterator) tryAddCurr(iter keyIterator) { + var ( + hasCurr = len(i.currIters) > 0 + cmp int + ) + if hasCurr { + cmp = bytes.Compare(iter.Current(), i.Current()) + } + if !hasCurr || cmp < 0 { + // Set the current lowest key value + i.currIters = i.currIters[:0] + i.currIters = append(i.currIters, iter) + } else if hasCurr && cmp == 0 { + // Set a matching duplicate curr iter + i.currIters = append(i.currIters, iter) + } +} + +func (i *multiKeyIterator) Current() []byte { + return i.currIters[0].Current() +} + +func (i *multiKeyIterator) CurrentIters() []keyIterator { + return i.currIters +} + +func (i *multiKeyIterator) Err() error { + multiErr := xerrors.NewMultiError() + for _, iter := range i.closeIters { + multiErr = multiErr.Add(iter.Err()) + } + return multiErr.FinalError() +} + +func (i *multiKeyIterator) Close() error { + multiErr := xerrors.NewMultiError() + for _, iter := range i.closeIters { + multiErr = multiErr.Add(iter.Close()) + } + // Free resources + i.reset() + return multiErr.FinalError() +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_multi_key_postings_list_iter.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_multi_key_postings_list_iter.go new file mode 100644 index 00000000..206be79f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_multi_key_postings_list_iter.go @@ -0,0 +1,247 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "bytes" + + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/postings/roaring" + xerrors "github.com/m3db/m3/src/x/errors" + bitmap "github.com/m3dbx/pilosa/roaring" +) + +var _ segment.FieldsPostingsListIterator = &multiKeyPostingsListIterator{} + +type multiKeyPostingsListIterator struct { + err error + firstNext bool + closeIters []keyIterator + iters []keyIterator + currIters []keyIterator + currReaders []index.Reader + currFieldPostingsList postings.MutableList + bitmapIter *bitmap.Iterator +} + +func newMultiKeyPostingsListIterator() *multiKeyPostingsListIterator { + b := bitmap.NewBitmapWithDefaultPooling(defaultBitmapContainerPooling) + i := &multiKeyPostingsListIterator{ + currFieldPostingsList: roaring.NewPostingsListFromBitmap(b), + bitmapIter: &bitmap.Iterator{}, + } + i.reset() + return i +} + +func (i *multiKeyPostingsListIterator) reset() { + i.firstNext = true + i.currFieldPostingsList.Reset() + + for j := range i.closeIters { + i.closeIters[j] = nil + } + i.closeIters = i.closeIters[:0] + + for j := range i.iters { + i.iters[j] = nil + } + i.iters = i.iters[:0] + + for j := range i.currIters { + i.currIters[j] = nil + } + i.currIters = i.currIters[:0] +} + +func (i *multiKeyPostingsListIterator) add(iter keyIterator) { + i.closeIters = append(i.closeIters, iter) + i.iters = append(i.iters, iter) + i.tryAddCurr(iter) +} + +func (i *multiKeyPostingsListIterator) Next() bool { + if i.err != nil { + return false + } + if len(i.iters) == 0 { + return false + } + + if i.firstNext { + i.firstNext = false + return true + } + + for _, currIter := range i.currIters { + currNext := currIter.Next() + if currNext { + // Next has a value, forward other matching too + continue + } + + // Remove iter + n := len(i.iters) + idx := -1 + for j, iter := range i.iters { + if iter == currIter { + idx = j + break + } + } + i.iters[idx] = i.iters[n-1] + i.iters[n-1] = nil + i.iters = i.iters[:n-1] + } + if len(i.iters) == 0 { + return false + } + + // Re-evaluate current value + i.currEvaluate() + + // NB(bodu): Build the postings list for this field if the field has changed. + defer func() { + for idx, reader := range i.currReaders { + if err := reader.Close(); err != nil { + i.err = err + } + i.currReaders[idx] = nil + } + i.currReaders = i.currReaders[:0] + }() + + i.currFieldPostingsList.Reset() + currField := i.currIters[0].Current() + + for _, iter := range i.currIters { + fieldsKeyIter := iter.(*fieldsKeyIter) + reader, err := fieldsKeyIter.segment.segment.Reader() + if err != nil { + i.err = err + return false + } + i.currReaders = append(i.currReaders, reader) + + pl, err := reader.MatchField(currField) + if err != nil { + i.err = err + return false + } + + if fieldsKeyIter.segment.offset == 0 { + // No offset, which means is first segment we are combining from + // so can just direct union + i.currFieldPostingsList.Union(pl) + continue + } + + // We have to taken into account the offset and duplicates + var ( + iter = i.bitmapIter + duplicates = fieldsKeyIter.segment.duplicatesAsc + negativeOffset postings.ID + ) + bitmap, ok := roaring.BitmapFromPostingsList(pl) + if !ok { + i.err = errPostingsListNotRoaring + return false + } + + iter.Reset(bitmap) + for v, eof := iter.Next(); !eof; v, eof = iter.Next() { + curr := postings.ID(v) + for len(duplicates) > 0 && curr > duplicates[0] { + duplicates = duplicates[1:] + negativeOffset++ + } + if len(duplicates) > 0 && curr == duplicates[0] { + duplicates = duplicates[1:] + negativeOffset++ + // Also skip this value, as itself is a duplicate + continue + } + value := curr + fieldsKeyIter.segment.offset - negativeOffset + if err := i.currFieldPostingsList.Insert(value); err != nil { + i.err = err + return false + } + } + } + return true +} + +func (i *multiKeyPostingsListIterator) currEvaluate() { + i.currIters = i.currIters[:0] + for _, iter := range i.iters { + i.tryAddCurr(iter) + } +} + +func (i *multiKeyPostingsListIterator) tryAddCurr(iter keyIterator) { + var ( + hasCurr = len(i.currIters) > 0 + cmp int + ) + if hasCurr { + curr, _ := i.Current() + cmp = bytes.Compare(iter.Current(), curr) + } + if !hasCurr || cmp < 0 { + // Set the current lowest key value + i.currIters = i.currIters[:0] + i.currIters = append(i.currIters, iter) + } else if hasCurr && cmp == 0 { + // Set a matching duplicate curr iter + i.currIters = append(i.currIters, iter) + } +} + +func (i *multiKeyPostingsListIterator) Current() ([]byte, postings.List) { + return i.currIters[0].Current(), i.currFieldPostingsList +} + +func (i *multiKeyPostingsListIterator) CurrentIters() []keyIterator { + return i.currIters +} + +func (i *multiKeyPostingsListIterator) Err() error { + multiErr := xerrors.NewMultiError() + for _, iter := range i.closeIters { + multiErr = multiErr.Add(iter.Err()) + } + if i.err != nil { + multiErr = multiErr.Add(i.err) + } + return multiErr.FinalError() +} + +func (i *multiKeyPostingsListIterator) Close() error { + multiErr := xerrors.NewMultiError() + for _, iter := range i.closeIters { + multiErr = multiErr.Add(iter.Close()) + } + // Free resources + i.reset() + return multiErr.FinalError() +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_terms_iter.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_terms_iter.go new file mode 100644 index 00000000..d27eb3ec --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/multi_segments_terms_iter.go @@ -0,0 +1,228 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "errors" + + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/postings/roaring" + xerrors "github.com/m3db/m3/src/x/errors" + bitmap "github.com/m3dbx/pilosa/roaring" +) + +const ( + defaultBitmapContainerPooling = 128 +) + +var ( + errPostingsListNotRoaring = errors.New("postings list not a roaring postings list") +) + +// Ensure for our use case that the terms iter from segments we return +// matches the signature for the terms iterator. +var _ segment.TermsIterator = &termsIterFromSegments{} + +type termsIterFromSegments struct { + keyIter *multiKeyIterator + currPostingsList postings.MutableList + bitmapIter *bitmap.Iterator + + segments []segmentTermsMetadata + + err error + termsIters []*termsKeyIter +} + +type segmentTermsMetadata struct { + segment segmentMetadata + termsIterable segment.TermsIterable +} + +func newTermsIterFromSegments() *termsIterFromSegments { + b := bitmap.NewBitmapWithDefaultPooling(defaultBitmapContainerPooling) + return &termsIterFromSegments{ + keyIter: newMultiKeyIterator(), + currPostingsList: roaring.NewPostingsListFromBitmap(b), + bitmapIter: &bitmap.Iterator{}, + } +} + +func (i *termsIterFromSegments) clear() { + i.segments = nil + i.clearTermIters() +} + +func (i *termsIterFromSegments) clearTermIters() { + i.keyIter.reset() + i.currPostingsList.Reset() + i.err = nil + for _, termIter := range i.termsIters { + termIter.iter = nil + termIter.segment = segmentMetadata{} + } +} + +func (i *termsIterFromSegments) reset(segments []segmentMetadata) { + i.clear() + + for _, seg := range segments { + i.segments = append(i.segments, segmentTermsMetadata{ + segment: seg, + termsIterable: seg.segment.TermsIterable(), + }) + } +} + +func (i *termsIterFromSegments) setField(field []byte) error { + i.clearTermIters() + + // Alloc any required terms iter containers + numTermsIterAlloc := len(i.segments) - len(i.termsIters) + for j := 0; j < numTermsIterAlloc; j++ { + i.termsIters = append(i.termsIters, &termsKeyIter{}) + } + + // Add our de-duping multi key value iterator + i.keyIter.reset() + for j, seg := range i.segments { + iter, err := seg.termsIterable.Terms(field) + if err != nil { + return err + } + if !iter.Next() { + // Don't consume this iterator if no results + if err := xerrors.FirstError(iter.Err(), iter.Close()); err != nil { + return err + } + continue + } + + tersmKeyIter := i.termsIters[j] + tersmKeyIter.iter = iter + tersmKeyIter.segment = seg.segment + i.keyIter.add(tersmKeyIter) + } + + return nil +} + +func (i *termsIterFromSegments) Next() bool { + if i.err != nil { + return false + } + + if !i.keyIter.Next() { + return false + } + + // Create the overlayed postings list for this term + i.currPostingsList.Reset() + for _, iter := range i.keyIter.CurrentIters() { + termsKeyIter := iter.(*termsKeyIter) + _, list := termsKeyIter.iter.Current() + + if termsKeyIter.segment.offset == 0 { + // No offset, which means is first segment we are combining from + // so can just direct union + i.currPostingsList.Union(list) + continue + } + + // We have to taken into account the offset and duplicates + var ( + iter = i.bitmapIter + duplicates = termsKeyIter.segment.duplicatesAsc + negativeOffset postings.ID + ) + bitmap, ok := roaring.BitmapFromPostingsList(list) + if !ok { + i.err = errPostingsListNotRoaring + return false + } + + iter.Reset(bitmap) + for v, eof := iter.Next(); !eof; v, eof = iter.Next() { + curr := postings.ID(v) + for len(duplicates) > 0 && curr > duplicates[0] { + duplicates = duplicates[1:] + negativeOffset++ + } + if len(duplicates) > 0 && curr == duplicates[0] { + duplicates = duplicates[1:] + negativeOffset++ + // Also skip this value, as itself is a duplicate + continue + } + value := curr + termsKeyIter.segment.offset - negativeOffset + if err := i.currPostingsList.Insert(value); err != nil { + i.err = err + return false + } + } + } + + return true +} + +func (i *termsIterFromSegments) Current() ([]byte, postings.List) { + return i.keyIter.Current(), i.currPostingsList +} + +func (i *termsIterFromSegments) Err() error { + if err := i.keyIter.Err(); err != nil { + return err + } + return i.err +} + +func (i *termsIterFromSegments) Close() error { + err := i.keyIter.Close() + // Free resources + i.clearTermIters() + return err +} + +// termsKeyIter needs to be a keyIterator and contains a terms iterator +var _ keyIterator = &termsKeyIter{} + +type termsKeyIter struct { + iter segment.TermsIterator + segment segmentMetadata +} + +func (i *termsKeyIter) Next() bool { + return i.iter.Next() +} + +func (i *termsKeyIter) Current() []byte { + t, _ := i.iter.Current() + return t +} + +func (i *termsKeyIter) Err() error { + return i.iter.Err() +} + +func (i *termsKeyIter) Close() error { + return i.iter.Close() +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/options.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/options.go new file mode 100644 index 00000000..e2b69b07 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/options.go @@ -0,0 +1,121 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "runtime" + + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/postings/roaring" + "github.com/m3db/m3/src/m3ninx/util" +) + +const ( + defaultInitialCapacity = 128 +) + +var ( + defaultConcurrency = runtime.NumCPU() +) + +// Options is a collection of options for segment building. +type Options interface { + // SetNewUUIDFn sets the function used to generate new UUIDs. + SetNewUUIDFn(value util.NewUUIDFn) Options + + // NewUUIDFn returns the function used to generate new UUIDs. + NewUUIDFn() util.NewUUIDFn + + // SetInitialCapacity sets the initial capacity. + SetInitialCapacity(value int) Options + + // InitialCapacity returns the initial capacity. + InitialCapacity() int + + // SetPostingsListPool sets the postings list pool. + SetPostingsListPool(value postings.Pool) Options + + // PostingsListPool returns the postings list pool. + PostingsListPool() postings.Pool + + // SetConcurrency sets the indexing concurrency. + SetConcurrency(value int) Options + + // Concurrency returns the indexing concurrency. + Concurrency() int +} + +type opts struct { + newUUIDFn util.NewUUIDFn + initialCapacity int + postingsPool postings.Pool + concurrency int +} + +// NewOptions returns new options. +func NewOptions() Options { + return &opts{ + newUUIDFn: util.NewUUID, + initialCapacity: defaultInitialCapacity, + postingsPool: postings.NewPool(nil, roaring.NewPostingsList), + concurrency: defaultConcurrency, + } +} + +func (o *opts) SetNewUUIDFn(v util.NewUUIDFn) Options { + opts := *o + opts.newUUIDFn = v + return &opts +} + +func (o *opts) NewUUIDFn() util.NewUUIDFn { + return o.newUUIDFn +} + +func (o *opts) SetInitialCapacity(v int) Options { + opts := *o + opts.initialCapacity = v + return &opts +} + +func (o *opts) InitialCapacity() int { + return o.initialCapacity +} + +func (o *opts) SetPostingsListPool(v postings.Pool) Options { + opts := *o + opts.postingsPool = v + return &opts +} + +func (o *opts) PostingsListPool() postings.Pool { + return o.postingsPool +} + +func (o *opts) SetConcurrency(v int) Options { + opts := *o + opts.concurrency = v + return &opts +} + +func (o *opts) Concurrency() int { + return o.concurrency +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/postings_map_gen.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/postings_map_gen.go new file mode 100644 index 00000000..50871476 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/postings_map_gen.go @@ -0,0 +1,299 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package builder + +import ( + "github.com/m3db/m3/src/m3ninx/postings" +) + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// PostingsMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type PostingsMapHash uint64 + +// PostingsMapHashFn is the hash function to execute when hashing a key. +type PostingsMapHashFn func([]byte) PostingsMapHash + +// PostingsMapEqualsFn is the equals key function to execute when detecting equality of a key. +type PostingsMapEqualsFn func([]byte, []byte) bool + +// PostingsMapCopyFn is the copy key function to execute when copying the key. +type PostingsMapCopyFn func([]byte) []byte + +// PostingsMapFinalizeFn is the finalize key function to execute when finished with a key. +type PostingsMapFinalizeFn func([]byte) + +// PostingsMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// PostingsMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type PostingsMap struct { + _PostingsMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[PostingsMapHash]PostingsMapEntry +} + +// _PostingsMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _PostingsMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash PostingsMapHashFn + // equals is the equals key function to execute when detecting equality. + equals PostingsMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy PostingsMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize PostingsMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// PostingsMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type PostingsMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _PostingsMapKey + // value type stored + value postings.MutableList +} + +type _PostingsMapKey struct { + key []byte + finalize bool +} + +// Key returns the map entry key. +func (e PostingsMapEntry) Key() []byte { + return e.key.key +} + +// Value returns the map entry value. +func (e PostingsMapEntry) Value() postings.MutableList { + return e.value +} + +// _PostingsMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _PostingsMapAlloc(opts _PostingsMapOptions) *PostingsMap { + m := &PostingsMap{_PostingsMapOptions: opts} + m.Reallocate() + return m +} + +func (m *PostingsMap) newMapKey(k []byte, opts _PostingsMapKeyOptions) _PostingsMapKey { + key := _PostingsMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *PostingsMap) removeMapKey(hash PostingsMapHash, key _PostingsMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *PostingsMap) Get(k []byte) (postings.MutableList, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty postings.MutableList + return empty, false +} + +// Set will set the value for an identifier. +func (m *PostingsMap) Set(k []byte, v postings.MutableList) { + m.set(k, v, _PostingsMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// PostingsMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type PostingsMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *PostingsMap) SetUnsafe(k []byte, v postings.MutableList, opts PostingsMapSetUnsafeOptions) { + m.set(k, v, _PostingsMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _PostingsMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *PostingsMap) set(k []byte, v postings.MutableList, opts _PostingsMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = PostingsMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = PostingsMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *PostingsMap) Iter() map[PostingsMapHash]PostingsMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *PostingsMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *PostingsMap) Contains(k []byte) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *PostingsMap) Delete(k []byte) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *PostingsMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *PostingsMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[PostingsMapHash]PostingsMapEntry, m.initialSize) + } else { + m.lookup = make(map[PostingsMapHash]PostingsMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/postings_map_new.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/postings_map_new.go new file mode 100644 index 00000000..5fb871a4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/postings_map_new.go @@ -0,0 +1,91 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package builder + +import ( + "bytes" + + "github.com/m3db/m3/src/x/pool" + + "github.com/cespare/xxhash/v2" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// PostingsMapOptions provides options used when created the map. +type PostingsMapOptions struct { + InitialSize int + KeyCopyPool pool.BytesPool +} + +// NewPostingsMap returns a new byte keyed map. +func NewPostingsMap(opts PostingsMapOptions) *PostingsMap { + var ( + copyFn PostingsMapCopyFn + finalizeFn PostingsMapFinalizeFn + ) + if pool := opts.KeyCopyPool; pool == nil { + copyFn = func(k []byte) []byte { + return append([]byte(nil), k...) + } + } else { + copyFn = func(k []byte) []byte { + keyLen := len(k) + pooled := pool.Get(keyLen)[:keyLen] + copy(pooled, k) + return pooled + } + finalizeFn = func(k []byte) { + pool.Put(k) + } + } + return _PostingsMapAlloc(_PostingsMapOptions{ + hash: func(k []byte) PostingsMapHash { + return PostingsMapHash(xxhash.Sum64(k)) + }, + equals: bytes.Equal, + copy: copyFn, + finalize: finalizeFn, + initialSize: opts.InitialSize, + }) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/sharded_fields_map.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/sharded_fields_map.go new file mode 100644 index 00000000..ffa452c9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/sharded_fields_map.go @@ -0,0 +1,65 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +type shardedFieldsMap struct { + data []*fieldsMap +} + +func newShardedFieldsMap( + numShards int, + shardInitialCapacity int, +) *shardedFieldsMap { + data := make([]*fieldsMap, 0, numShards) + for i := 0; i < numShards; i++ { + data = append(data, newFieldsMap(fieldsMapOptions{ + InitialSize: shardInitialCapacity, + })) + } + return &shardedFieldsMap{ + data: data, + } +} + +func (s *shardedFieldsMap) ShardedGet( + shard int, + k []byte, +) (*terms, bool) { + return s.data[shard].Get(k) +} + +func (s *shardedFieldsMap) ShardedSetUnsafe( + shard int, + k []byte, + v *terms, + opts fieldsMapSetUnsafeOptions, +) { + s.data[shard].SetUnsafe(k, v, opts) +} + +// ResetTermsSets keeps fields around but resets the terms set for each one. +func (s *shardedFieldsMap) ResetTermsSets() { + for _, fieldMap := range s.data { + for _, entry := range fieldMap.Iter() { + entry.Value().reset() + } + } +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/terms.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/terms.go new file mode 100644 index 00000000..4fde0806 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/terms.go @@ -0,0 +1,138 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "bytes" + + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/twotwotwo/sorts" +) + +type terms struct { + opts Options + pool postings.Pool + postings *PostingsMap + postingsListUnion postings.MutableList + uniqueTerms []termElem + uniqueTermsIsSorted bool +} + +type termElem struct { + term []byte + postings postings.List +} + +func newTerms(opts Options) *terms { + pool := opts.PostingsListPool() + return &terms{ + opts: opts, + pool: pool, + postingsListUnion: pool.Get(), + postings: NewPostingsMap(PostingsMapOptions{}), + } +} + +func (t *terms) size() int { + return len(t.uniqueTerms) +} + +func (t *terms) post(term []byte, id postings.ID) error { + postingsList, ok := t.postings.Get(term) + if !ok { + postingsList = t.pool.Get() + t.postings.SetUnsafe(term, postingsList, PostingsMapSetUnsafeOptions{ + NoCopyKey: true, + NoFinalizeKey: true, + }) + + } + + // If empty posting list, track insertion of this key into the terms + // collection for correct response when retrieving all terms + newTerm := postingsList.Len() == 0 + if err := postingsList.Insert(id); err != nil { + return err + } + if err := t.postingsListUnion.Insert(id); err != nil { + return err + } + if newTerm { + t.uniqueTerms = append(t.uniqueTerms, termElem{ + term: term, + postings: postingsList, + }) + t.uniqueTermsIsSorted = false + } + return nil +} + +// nolint: unused +func (t *terms) get(term []byte) (postings.List, bool) { + value, ok := t.postings.Get(term) + return value, ok +} + +func (t *terms) sortIfRequired() { + if t.uniqueTermsIsSorted { + return + } + + // NB(r): See SetSortConcurrency why this RLock is required. + sortConcurrencyLock.RLock() + sorts.ByBytes(t) + sortConcurrencyLock.RUnlock() + + t.uniqueTermsIsSorted = true +} + +func (t *terms) reset() { + // Keep postings map lookup, return postings lists to pool + for _, entry := range t.postings.Iter() { + t.pool.Put(entry.Value()) + } + t.postings.Reset() + t.postingsListUnion.Reset() + + // Reset the unique terms slice + var emptyTerm termElem + for i := range t.uniqueTerms { + t.uniqueTerms[i] = emptyTerm + } + t.uniqueTerms = t.uniqueTerms[:0] + t.uniqueTermsIsSorted = false +} + +func (t *terms) Len() int { + return len(t.uniqueTerms) +} + +func (t *terms) Less(i, j int) bool { + return bytes.Compare(t.uniqueTerms[i].term, t.uniqueTerms[j].term) < 0 +} + +func (t *terms) Swap(i, j int) { + t.uniqueTerms[i], t.uniqueTerms[j] = t.uniqueTerms[j], t.uniqueTerms[i] +} + +func (t *terms) Key(i int) []byte { + return t.uniqueTerms[i].term +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/terms_iter.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/terms_iter.go new file mode 100644 index 00000000..40140359 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/builder/terms_iter.go @@ -0,0 +1,77 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package builder + +import ( + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" +) + +type termsIter struct { + err error + done bool + + currentIdx int + current termElem + terms []termElem +} + +var _ segment.TermsIterator = &termsIter{} + +func newTermsIter( + orderedTerms []termElem, +) *termsIter { + return &termsIter{ + currentIdx: -1, + terms: orderedTerms, + } +} + +func (b *termsIter) Next() bool { + if b.done || b.err != nil { + return false + } + b.currentIdx++ + if b.currentIdx >= len(b.terms) { + b.done = true + return false + } + b.current = b.terms[b.currentIdx] + return true +} + +func (b *termsIter) Current() ([]byte, postings.List) { + return b.current.term, b.current.postings +} + +func (b *termsIter) Err() error { + return nil +} + +func (b *termsIter) Len() int { + return len(b.terms) +} + +func (b *termsIter) Close() error { + b.current = termElem{} + b.terms = nil + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/empty.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/empty.go new file mode 100644 index 00000000..45b92078 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/empty.go @@ -0,0 +1,45 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package segment + +import "github.com/m3db/m3/src/m3ninx/postings" + +// EmptyOrderedBytesIterator is an empty OrderedBytesIterator. +var EmptyOrderedBytesIterator OrderedBytesIterator = emptyBytesIter{} + +type emptyBytesIter struct{} + +func (e emptyBytesIter) Next() bool { return false } +func (e emptyBytesIter) Current() []byte { return nil } +func (e emptyBytesIter) Err() error { return nil } +func (e emptyBytesIter) Close() error { return nil } +func (e emptyBytesIter) Len() int { return 0 } + +// EmptyTermsIterator is an empty EmptyTermsIterator. +var EmptyTermsIterator TermsIterator = emptyTermsIter{} + +type emptyTermsIter struct{} + +func (e emptyTermsIter) Next() bool { return false } +func (e emptyTermsIter) Current() ([]byte, postings.List) { return nil, nil } +func (e emptyTermsIter) Err() error { return nil } +func (e emptyTermsIter) Close() error { return nil } +func (e emptyTermsIter) Len() int { return 0 } diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/README.md b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/README.md new file mode 100644 index 00000000..7916ffd2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/README.md @@ -0,0 +1,94 @@ +FS Segment +=========== + +- Version 1.1: Adds support for a metadata proto object per Field. This is used to +store an additional postings offset per Field to a PostingsList comprising the union +of all known PostingsList across all known Terms per Field. + +``` +┌───────────────────────────────┐ ┌──────────────────────────────────────┐ +│ FST Fields File │ │ FST Terms File │ +│-------------------------------│ │--------------------------------------│ +│- Vellum V1 Format │ │`n` records, each: │ +│- []byte -> FST Terms Offset ├─────┐ │ - metadata proto (`md-size` bytes) │ +└───────────────────────────────┘ │ │ - md-size (int64) │ + │ │ - fst payload (`fst size` bytes) │ + │ │ - fst size (int64) │ + └─────▶│ - magic number (int64) │ + │ │ + │Payload: │ + │(1) Vellum V1 FST ├─┐ + │[]byte -> Postings Offset │ │ + │ │ │ + │(2) Metadata Proto Bytes │ │ + │Field Postings Offset │ │ + └──────────────────────────────────────┘ │ + ┌───────────────────────────────┐ │ + │ Postings Data File │ │ + │-------------------------------│ │ + │`n` records, each: │ │ + │ - payload (`size` bytes) │ │ + │ - size (int64) │ │ + │ - magic number (int64) │◀─┘ + │ │ + │Payload: │ + │- Pilosa Bitset ├──┐ + ┌───────────────────────────┐ │- List of doc.ID │ │ + │ Documents Data File │ └───────────────────────────────┘ │ + │------------------------- │ │ + │'n' records, each: │ ┌─────────────────────────┐ │ + │ - Magic Number (int64) │ │ Documents Index File │ │ + │ - Valid (1 byte) │ │-------------------------│ │ + │ - Size (int64) │ │- Magic Number (int64) │ │ + │ - Payload (`size` bytes) │ │- Num docs (int64) │ │ + └───────────────────────────┘ ┌───────│- Base Doc.ID `b` (int64)│◀─┘ + ▲ │ │- Doc `b` offset (int64) │ + │ │ │- Doc `b+1` offset │ + └──────────────────────┘ │... │ + │- Doc `b+n-1` offset │ + └─────────────────────────┘ + +``` + + +- Version 1.0: Initial Release. + +``` + +┌───────────────────────────────┐ ┌───────────────────────────────┐ +│ FST Fields File │ │ FST Terms File │ +│-------------------------------│ │-------------------------------│ +│- Vellum V1 FST │ │`n` records, each: │ +│- []byte -> FST Terms Offset │─────┐ │ - payload (`size` bytes) │ +└───────────────────────────────┘ │ │ - size (int64) │ + └────▶│ - magic number (int64) │ + │ │ + │Payload: │ + │- Vellum V1 FST │ + │- []byte -> Postings Offset │ + └───────────────────────────────┘ + ┌───────────────────────────────┐ │ + │ Postings Data File │ │ + │-------------------------------│ │ + │`n` records, each: │ │ + │ - payload (`size` bytes) │ │ + │ - size (int64) │ │ + │ - magic number (int64) │◀──────────────────┘ + │ │ + │Payload: │ + │- Pilosa Bitset │ + │- List of doc.ID │ + └──────────┬────────────────────┘ + │ + │ + │ + │ ┌──────────────────────────┐ ┌───────────────────────────┐ + │ │ Documents Index File │ │ Documents Data File │ + │ │--------------------------│ │------------------------- │ + │ │- Base Doc.ID `b` (uint64)│ │'n' records, each: │ + │ │- Doc `b` offset (uint64) │ ┌─────▶│ - ID (bytes) │ + │ │- Doc `b+1` offset │ │ │ - Fields (bytes) │ + └──────▶│... ├────┘ └───────────────────────────┘ + │- Doc `b+n-1` offset │ + └──────────────────────────┘ +``` \ No newline at end of file diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/docs_writer.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/docs_writer.go new file mode 100644 index 00000000..1fdfe6a0 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/docs_writer.go @@ -0,0 +1,95 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package fst + +import ( + "io" + + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs" +) + +// DocumentsWriter writes out documents data given a doc iterator. +type DocumentsWriter struct { + iter index.IDDocIterator + sizeHint int + docDataWriter *docs.DataWriter + docIndexWriter *docs.IndexWriter + docOffsets []docOffset +} + +// NewDocumentsWriter creates a new documents writer. +func NewDocumentsWriter() (*DocumentsWriter, error) { + return &DocumentsWriter{ + docDataWriter: docs.NewDataWriter(nil), + docIndexWriter: docs.NewIndexWriter(nil), + docOffsets: make([]docOffset, 0, defaultInitialDocOffsetsSize), + }, nil +} + +// DocumentsWriterOptions is a set of options to pass to the documents writer. +type DocumentsWriterOptions struct { + // Iter is the ID and document iterator, required. + Iter index.IDDocIterator + // SizeHint is the size hint, optional. + SizeHint int +} + +// Reset the documents writer for writing out. +func (w *DocumentsWriter) Reset(opts DocumentsWriterOptions) { + w.iter = opts.Iter + w.sizeHint = opts.SizeHint + w.docDataWriter.Reset(nil) + w.docIndexWriter.Reset(nil) + w.docOffsets = w.docOffsets[:0] +} + +// WriteDocumentsData writes out the documents data. +func (w *DocumentsWriter) WriteDocumentsData(iow io.Writer) error { + w.docDataWriter.Reset(iow) + + var currOffset uint64 + if cap(w.docOffsets) < w.sizeHint { + w.docOffsets = make([]docOffset, 0, w.sizeHint) + } + for w.iter.Next() { + id, doc := w.iter.PostingsID(), w.iter.Current() + n, err := w.docDataWriter.Write(doc) + if err != nil { + return err + } + w.docOffsets = append(w.docOffsets, docOffset{ID: id, offset: currOffset}) + currOffset += uint64(n) + } + + return nil +} + +// WriteDocumentsIndex writes out the documents index data. +func (w *DocumentsWriter) WriteDocumentsIndex(iow io.Writer) error { + w.docIndexWriter.Reset(iow) + for _, do := range w.docOffsets { + if err := w.docIndexWriter.Write(do.ID, do.offset); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/README.md b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/README.md new file mode 100644 index 00000000..212c1be6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/README.md @@ -0,0 +1,128 @@ +# Documents + +Two files are used to represent the documents in a segment. The data file contains the +data for each document in the segment. The index file contains, for each document, its +corresponding offset in the data file. + +## Data File + +The data file contains the fields for each document. The documents are stored serially. + +``` +┌───────────────────────────┐ +│ ┌───────────────────────┐ │ +│ │ Document 1 │ │ +│ ├───────────────────────┤ │ +│ │ ... │ │ +│ ├───────────────────────┤ │ +│ │ Document n │ │ +│ └───────────────────────┘ │ +└───────────────────────────┘ +``` + +### Document + +Each document is composed of an ID and its fields. The ID is a sequence of valid UTF-8 bytes +and it is encoded first by encoding the length of the ID, in bytes, as a variable-sized +unsigned integer and then encoding the actual bytes which comprise the ID. Following the ID +are the fields. The number of fields in the document is encoded first as a variable-sized +unsigned integer and then the fields themselves are encoded. + +``` +┌───────────────────────────┐ +│ ┌───────────────────────┐ │ +│ │ Length of ID │ │ +│ │ (uvarint) │ │ +│ ├───────────────────────┤ │ +│ │ │ │ +│ │ ID │ │ +│ │ (bytes) │ │ +│ │ │ │ +│ ├───────────────────────┤ │ +│ │ Number of Fields │ │ +│ │ (uvarint) │ │ +│ ├───────────────────────┤ │ +│ │ │ │ +│ │ Field 1 │ │ +│ │ │ │ +│ ├───────────────────────┤ │ +│ │ │ │ +│ │ ... │ │ +│ │ │ │ +│ ├───────────────────────┤ │ +│ │ │ │ +│ │ Field n │ │ +│ │ │ │ +│ └───────────────────────┘ │ +└───────────────────────────┘ +``` + +#### Field + +Each field is composed of a name and a value. The name and value are a sequence of valid +UTF-8 bytes and they are stored by encoding the length of the name (value), in bytes, as a +variable-sized unsigned integer and then encoding the actual bytes which comprise the name +(value). The name is encoded first and the value second. + +``` +┌───────────────────────────┐ +│ ┌───────────────────────┐ │ +│ │ Length of Field Name │ │ +│ │ (uvarint) │ │ +│ ├───────────────────────┤ │ +│ │ │ │ +│ │ Field Name │ │ +│ │ (bytes) │ │ +│ │ │ │ +│ ├───────────────────────┤ │ +│ │ Length of Field Value │ │ +│ │ (uvarint) │ │ +│ ├───────────────────────┤ │ +│ │ │ │ +│ │ Field Value │ │ +│ │ (bytes) │ │ +│ │ │ │ +│ └───────────────────────┘ │ +└───────────────────────────┘ +``` + +## Index File + +The index file contains, for each postings ID in the segment, the offset of the corresponding +document in the data file. The base postings ID is stored at the start of the file as a +little-endian `uint64`. Following it are the actual offsets. + +``` +┌───────────────────────────┐ +│ Base │ +│ (uint64) │ +├───────────────────────────┤ +│ │ +│ │ +│ Offsets │ +│ │ +│ │ +└───────────────────────────┘ +``` + +### Offsets + +The offsets are stored serially starting from the offset for the base postings ID. Each +offset is a little-endian `uint64`. Since each offset is of a fixed-size we can access +the offset for a given postings ID by calculating its index relative to the start of +the offsets. An offset equal to the maximum value for a uint64 indicates that there is +no corresponding document for a given postings ID. + +``` +┌───────────────────────────┐ +│ ┌───────────────────────┐ │ +│ │ Offset 1 │ │ +│ │ (uint64) │ │ +│ ├───────────────────────┤ │ +│ │ ... │ │ +│ ├───────────────────────┤ │ +│ │ Offset n │ │ +│ │ (uint64) │ │ +│ └───────────────────────┘ │ +└───────────────────────────┘ +``` diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/data.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/data.go new file mode 100644 index 00000000..08bfe1b8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/data.go @@ -0,0 +1,130 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Softwarw. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package docs + +import ( + "fmt" + "io" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding" +) + +const initialDataEncoderLen = 1024 + +// DataWriter writes the data file for documents. +type DataWriter struct { + writer io.Writer + enc *encoding.Encoder +} + +// NewDataWriter returns a new DataWriter. +func NewDataWriter(w io.Writer) *DataWriter { + return &DataWriter{ + writer: w, + enc: encoding.NewEncoder(initialDataEncoderLen), + } +} + +func (w *DataWriter) Write(d doc.Document) (int, error) { + n := w.enc.PutBytes(d.ID) + n += w.enc.PutUvarint(uint64(len(d.Fields))) + for _, f := range d.Fields { + n += w.enc.PutBytes(f.Name) + n += w.enc.PutBytes(f.Value) + } + + if err := w.write(); err != nil { + return 0, err + } + + return n, nil +} + +func (w *DataWriter) write() error { + b := w.enc.Bytes() + n, err := w.writer.Write(b) + if err != nil { + return err + } + if n < len(b) { + return io.ErrShortWrite + } + w.enc.Reset() + return nil +} + +// Reset resets the DataWriter. +func (w *DataWriter) Reset(wr io.Writer) { + w.writer = wr + w.enc.Reset() +} + +// DataReader is a reader for the data file for documents. +type DataReader struct { + data []byte +} + +// NewDataReader returns a new DataReader. +func NewDataReader(data []byte) *DataReader { + return &DataReader{ + data: data, + } +} + +func (r *DataReader) Read(offset uint64) (doc.Document, error) { + if offset >= uint64(len(r.data)) { + return doc.Document{}, fmt.Errorf("invalid offset: %v is past the end of the data file", offset) + } + dec := encoding.NewDecoder(r.data[int(offset):]) + id, err := dec.Bytes() + if err != nil { + return doc.Document{}, err + } + + x, err := dec.Uvarint() + if err != nil { + return doc.Document{}, err + } + n := int(x) + + d := doc.Document{ + ID: id, + Fields: make([]doc.Field, n), + } + + for i := 0; i < n; i++ { + name, err := dec.Bytes() + if err != nil { + return doc.Document{}, err + } + val, err := dec.Bytes() + if err != nil { + return doc.Document{}, err + } + d.Fields[i] = doc.Field{ + Name: name, + Value: val, + } + } + + return d, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/index.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/index.go new file mode 100644 index 00000000..e78df376 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/index.go @@ -0,0 +1,169 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package docs + +import ( + "fmt" + "io" + "math" + + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding" + "github.com/m3db/m3/src/m3ninx/postings" +) + +const emptyID = math.MaxUint64 + +const ( + indexMetadataSize = 8 // Base postings ID as a uint64. + + initialIndexEncoderLen = 256 +) + +// IndexWriter is a writer for the index file for documents. +type IndexWriter struct { + writer io.Writer + enc *encoding.Encoder + ready bool + prev postings.ID +} + +// NewIndexWriter returns a new IndexWriter. +func NewIndexWriter(w io.Writer) *IndexWriter { + iw := &IndexWriter{ + writer: w, + enc: encoding.NewEncoder(initialIndexEncoderLen), + } + return iw +} + +// Write writes the offset for an id. IDs must be written in increasing order but can be +// non-contiguous. +func (w *IndexWriter) Write(id postings.ID, offset uint64) error { + if !w.ready { + w.writeMetadata(id) + w.ready = true + } else { + if id <= w.prev { + return fmt.Errorf("postings IDs must be monotonically increasing: received %v but previous ID was %v", id, w.prev) + } + for i := 0; i < int(id-w.prev)-1; i++ { + w.enc.PutUint64(emptyID) + } + } + + w.enc.PutUint64(offset) + w.prev = id + + return w.write() +} + +func (w *IndexWriter) writeMetadata(id postings.ID) { + w.enc.PutUint64(uint64(id)) +} + +func (w *IndexWriter) write() error { + b := w.enc.Bytes() + n, err := w.writer.Write(b) + if err != nil { + return err + } + if n < len(b) { + return io.ErrShortWrite + } + w.enc.Reset() + return nil +} + +// Reset resets the IndexWriter. +func (w *IndexWriter) Reset(wr io.Writer) { + w.writer = wr + w.enc.Reset() + w.ready = false +} + +// IndexReader is a reader for the index file for documents. +type IndexReader struct { + data []byte + base postings.ID + limit postings.ID + len int +} + +// NewIndexReader returns a new IndexReader. +func NewIndexReader(data []byte) (*IndexReader, error) { + if len(data) == 0 { + return &IndexReader{}, nil + } + + if len(data) < indexMetadataSize { + return nil, io.ErrShortBuffer + } + + payloadLen := len(data) - indexMetadataSize + if payloadLen%8 != 0 { + return nil, fmt.Errorf("stored fields index payload should be a multiple of 8, found %v", payloadLen%8) + } + count := payloadLen / 8 + + r := &IndexReader{ + data: data, + } + + dec := encoding.NewDecoder(data[:8]) + base, err := dec.Uint64() + if err != nil { + return nil, fmt.Errorf("could not read base postings ID: %v", err) + } + r.base = postings.ID(base) + r.limit = r.base + postings.ID(count) + r.len = count + return r, nil +} + +func (r *IndexReader) Read(id postings.ID) (uint64, error) { + if id < r.base || id >= r.limit { + return 0, index.ErrDocNotFound + } + + idx := r.index(id) + dec := encoding.NewDecoder(r.data[idx:]) + offset, err := dec.Uint64() + if err != nil { + return 0, err + } + + return offset, nil +} + +// Base returns the base postings ID. +func (r *IndexReader) Base() postings.ID { + return r.base +} + +// Len returns the number of postings IDs. +func (r *IndexReader) Len() int { + return r.len +} + +func (r *IndexReader) index(id postings.ID) int { + return (int(id-r.base) * 8) + indexMetadataSize +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/slice.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/slice.go new file mode 100644 index 00000000..ccf7fd48 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/slice.go @@ -0,0 +1,73 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Softwarw. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package docs + +import ( + "errors" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" +) + +var ( + errDocNotFound = errors.New("doc not found") +) + +var _ Reader = (*SliceReader)(nil) +var _ index.DocRetriever = (*SliceReader)(nil) + +// SliceReader is a docs slice reader for use with documents +// stored in memory. +type SliceReader struct { + docs []doc.Document +} + +// NewSliceReader returns a new docs slice reader. +func NewSliceReader(docs []doc.Document) *SliceReader { + return &SliceReader{docs: docs} +} + +// Len returns the number of documents in the slice reader. +func (r *SliceReader) Len() int { + return len(r.docs) +} + +// Read returns a document from the docs slice reader. +func (r *SliceReader) Read(id postings.ID) (doc.Document, error) { + idx := int(id) + if idx < 0 || idx >= len(r.docs) { + return doc.Document{}, errDocNotFound + } + + return r.docs[idx], nil +} + +// Doc implements DocRetriever and reads the document with postings ID. +func (r *SliceReader) Doc(id postings.ID) (doc.Document, error) { + return r.Read(id) +} + +// Iter returns a docs iterator. +func (r *SliceReader) Iter() index.IDDocIterator { + postingsIter := postings.NewRangeIterator(0, postings.ID(r.Len())) + return index.NewIDDocIterator(r, postingsIter) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/types.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/types.go new file mode 100644 index 00000000..cf531d26 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs/types.go @@ -0,0 +1,37 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package docs + +import ( + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" +) + +// Reader is a document reader from an encoded source. +type Reader interface { + // Len is the number of documents contained by the reader. + Len() int + // Read reads a document with the given postings ID. + Read(id postings.ID) (doc.Document, error) + // Iter returns a document iterator. + Iter() index.IDDocIterator +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/encoding.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/encoding.go new file mode 100644 index 00000000..09fbb23e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/encoding.go @@ -0,0 +1,150 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package encoding + +import ( + "encoding/binary" + "errors" + "io" +) + +const maxInt = int(^uint(0) >> 1) + +var byteOrder = binary.LittleEndian + +var errUvarintOverflow = errors.New("uvarint overflows 64 bits") +var errIntOverflow = errors.New("decoded integer overflows an int") + +// Encoder is a low-level encoder that can be used for encoding basic types. +type Encoder struct { + buf []byte + tmp [binary.MaxVarintLen64]byte +} + +// NewEncoder returns a new encoder. +func NewEncoder(n int) *Encoder { + return &Encoder{buf: make([]byte, 0, n)} +} + +// Bytes returns the encoded bytes. +func (e *Encoder) Bytes() []byte { return e.buf } + +// Len returns the length of the encoder. +func (e *Encoder) Len() int { return len(e.buf) } + +// Reset resets the encoder. +func (e *Encoder) Reset() { e.buf = e.buf[:0] } + +// PutUint32 encodes a uint32 and returns the number of bytes written which is always 4. +func (e *Encoder) PutUint32(x uint32) int { + byteOrder.PutUint32(e.tmp[:], x) + e.buf = append(e.buf, e.tmp[:4]...) + return 4 +} + +// PutUint64 encodes a uint64 and returns the number of bytes written which is always 8. +func (e *Encoder) PutUint64(x uint64) int { + byteOrder.PutUint64(e.tmp[:], x) + e.buf = append(e.buf, e.tmp[:8]...) + return 8 +} + +// PutUvarint encodes a variable-sized unsigned integer and returns the number of +// bytes written. +func (e *Encoder) PutUvarint(x uint64) int { + n := binary.PutUvarint(e.tmp[:], x) + e.buf = append(e.buf, e.tmp[:n]...) + return n +} + +// PutBytes encodes a byte slice and returns the number of bytes written. +func (e *Encoder) PutBytes(b []byte) int { + n := e.PutUvarint(uint64(len(b))) + e.buf = append(e.buf, b...) + return n + len(b) +} + +// Decoder is a low-level decoder for decoding basic types. +type Decoder struct { + buf []byte +} + +// NewDecoder returns a new Decoder. +func NewDecoder(buf []byte) *Decoder { + return &Decoder{buf: buf} +} + +// Reset resets the decoder. +func (d *Decoder) Reset(buf []byte) { d.buf = buf } + +// Uint32 reads a uint32 from the decoder. +func (d *Decoder) Uint32() (uint32, error) { + if len(d.buf) < 4 { + return 0, io.ErrShortBuffer + } + x := byteOrder.Uint32(d.buf) + d.buf = d.buf[4:] + return x, nil +} + +// Uint64 reads a uint64 from the decoder. +func (d *Decoder) Uint64() (uint64, error) { + if len(d.buf) < 8 { + return 0, io.ErrShortBuffer + } + x := byteOrder.Uint64(d.buf) + d.buf = d.buf[8:] + return x, nil +} + +// Uvarint reads a variable-sized unsigned integer. +func (d *Decoder) Uvarint() (uint64, error) { + x, n := binary.Uvarint(d.buf) + if n == 0 { + return 0, io.ErrShortBuffer + } + if n < 0 { + return 0, errUvarintOverflow + } + d.buf = d.buf[n:] + return x, nil +} + +// Bytes reads a byte slice from the decoder. +func (d *Decoder) Bytes() ([]byte, error) { + x, err := d.Uvarint() + if err != nil { + return nil, err + } + + // Verify the length of the slice won't overflow an int. + if x > uint64(maxInt) { + return nil, errIntOverflow + } + + n := int(x) + if len(d.buf) < n { + return nil, io.ErrShortBuffer + } + b := d.buf[:n] + d.buf = d.buf[n:] + return b, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_mock.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_mock.go new file mode 100644 index 00000000..85c5e987 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_mock.go @@ -0,0 +1,445 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/m3ninx/index/segment/fst (interfaces: Writer,Segment) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package fst is a generated GoMock package. +package fst + +import ( + "io" + "reflect" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/x/context" + + "github.com/golang/mock/gomock" +) + +// MockWriter is a mock of Writer interface +type MockWriter struct { + ctrl *gomock.Controller + recorder *MockWriterMockRecorder +} + +// MockWriterMockRecorder is the mock recorder for MockWriter +type MockWriterMockRecorder struct { + mock *MockWriter +} + +// NewMockWriter creates a new mock instance +func NewMockWriter(ctrl *gomock.Controller) *MockWriter { + mock := &MockWriter{ctrl: ctrl} + mock.recorder = &MockWriterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockWriter) EXPECT() *MockWriterMockRecorder { + return m.recorder +} + +// MajorVersion mocks base method +func (m *MockWriter) MajorVersion() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MajorVersion") + ret0, _ := ret[0].(int) + return ret0 +} + +// MajorVersion indicates an expected call of MajorVersion +func (mr *MockWriterMockRecorder) MajorVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MajorVersion", reflect.TypeOf((*MockWriter)(nil).MajorVersion)) +} + +// Metadata mocks base method +func (m *MockWriter) Metadata() []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Metadata") + ret0, _ := ret[0].([]byte) + return ret0 +} + +// Metadata indicates an expected call of Metadata +func (mr *MockWriterMockRecorder) Metadata() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Metadata", reflect.TypeOf((*MockWriter)(nil).Metadata)) +} + +// MinorVersion mocks base method +func (m *MockWriter) MinorVersion() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinorVersion") + ret0, _ := ret[0].(int) + return ret0 +} + +// MinorVersion indicates an expected call of MinorVersion +func (mr *MockWriterMockRecorder) MinorVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinorVersion", reflect.TypeOf((*MockWriter)(nil).MinorVersion)) +} + +// Reset mocks base method +func (m *MockWriter) Reset(arg0 segment.Builder) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reset", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Reset indicates an expected call of Reset +func (mr *MockWriterMockRecorder) Reset(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockWriter)(nil).Reset), arg0) +} + +// WriteDocumentsData mocks base method +func (m *MockWriter) WriteDocumentsData(arg0 io.Writer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteDocumentsData", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteDocumentsData indicates an expected call of WriteDocumentsData +func (mr *MockWriterMockRecorder) WriteDocumentsData(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteDocumentsData", reflect.TypeOf((*MockWriter)(nil).WriteDocumentsData), arg0) +} + +// WriteDocumentsIndex mocks base method +func (m *MockWriter) WriteDocumentsIndex(arg0 io.Writer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteDocumentsIndex", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteDocumentsIndex indicates an expected call of WriteDocumentsIndex +func (mr *MockWriterMockRecorder) WriteDocumentsIndex(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteDocumentsIndex", reflect.TypeOf((*MockWriter)(nil).WriteDocumentsIndex), arg0) +} + +// WriteFSTFields mocks base method +func (m *MockWriter) WriteFSTFields(arg0 io.Writer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteFSTFields", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteFSTFields indicates an expected call of WriteFSTFields +func (mr *MockWriterMockRecorder) WriteFSTFields(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteFSTFields", reflect.TypeOf((*MockWriter)(nil).WriteFSTFields), arg0) +} + +// WriteFSTTerms mocks base method +func (m *MockWriter) WriteFSTTerms(arg0 io.Writer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteFSTTerms", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteFSTTerms indicates an expected call of WriteFSTTerms +func (mr *MockWriterMockRecorder) WriteFSTTerms(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteFSTTerms", reflect.TypeOf((*MockWriter)(nil).WriteFSTTerms), arg0) +} + +// WritePostingsOffsets mocks base method +func (m *MockWriter) WritePostingsOffsets(arg0 io.Writer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WritePostingsOffsets", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// WritePostingsOffsets indicates an expected call of WritePostingsOffsets +func (mr *MockWriterMockRecorder) WritePostingsOffsets(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WritePostingsOffsets", reflect.TypeOf((*MockWriter)(nil).WritePostingsOffsets), arg0) +} + +// MockSegment is a mock of Segment interface +type MockSegment struct { + ctrl *gomock.Controller + recorder *MockSegmentMockRecorder +} + +// MockSegmentMockRecorder is the mock recorder for MockSegment +type MockSegmentMockRecorder struct { + mock *MockSegment +} + +// NewMockSegment creates a new mock instance +func NewMockSegment(ctrl *gomock.Controller) *MockSegment { + mock := &MockSegment{ctrl: ctrl} + mock.recorder = &MockSegmentMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSegment) EXPECT() *MockSegmentMockRecorder { + return m.recorder +} + +// AllDocs mocks base method +func (m *MockSegment) AllDocs() (index.IDDocIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllDocs") + ret0, _ := ret[0].(index.IDDocIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllDocs indicates an expected call of AllDocs +func (mr *MockSegmentMockRecorder) AllDocs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllDocs", reflect.TypeOf((*MockSegment)(nil).AllDocs)) +} + +// Close mocks base method +func (m *MockSegment) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockSegmentMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSegment)(nil).Close)) +} + +// ContainsField mocks base method +func (m *MockSegment) ContainsField(arg0 []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContainsField", arg0) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ContainsField indicates an expected call of ContainsField +func (mr *MockSegmentMockRecorder) ContainsField(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContainsField", reflect.TypeOf((*MockSegment)(nil).ContainsField), arg0) +} + +// ContainsID mocks base method +func (m *MockSegment) ContainsID(arg0 []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContainsID", arg0) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ContainsID indicates an expected call of ContainsID +func (mr *MockSegmentMockRecorder) ContainsID(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContainsID", reflect.TypeOf((*MockSegment)(nil).ContainsID), arg0) +} + +// Doc mocks base method +func (m *MockSegment) Doc(arg0 postings.ID) (doc.Document, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Doc", arg0) + ret0, _ := ret[0].(doc.Document) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Doc indicates an expected call of Doc +func (mr *MockSegmentMockRecorder) Doc(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Doc", reflect.TypeOf((*MockSegment)(nil).Doc), arg0) +} + +// Docs mocks base method +func (m *MockSegment) Docs(arg0 postings.List) (doc.Iterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Docs", arg0) + ret0, _ := ret[0].(doc.Iterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Docs indicates an expected call of Docs +func (mr *MockSegmentMockRecorder) Docs(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Docs", reflect.TypeOf((*MockSegment)(nil).Docs), arg0) +} + +// FieldsIterable mocks base method +func (m *MockSegment) FieldsIterable() segment.FieldsIterable { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldsIterable") + ret0, _ := ret[0].(segment.FieldsIterable) + return ret0 +} + +// FieldsIterable indicates an expected call of FieldsIterable +func (mr *MockSegmentMockRecorder) FieldsIterable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldsIterable", reflect.TypeOf((*MockSegment)(nil).FieldsIterable)) +} + +// FreeMmap mocks base method +func (m *MockSegment) FreeMmap() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FreeMmap") + ret0, _ := ret[0].(error) + return ret0 +} + +// FreeMmap indicates an expected call of FreeMmap +func (mr *MockSegmentMockRecorder) FreeMmap() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FreeMmap", reflect.TypeOf((*MockSegment)(nil).FreeMmap)) +} + +// MatchAll mocks base method +func (m *MockSegment) MatchAll() (postings.MutableList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchAll") + ret0, _ := ret[0].(postings.MutableList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchAll indicates an expected call of MatchAll +func (mr *MockSegmentMockRecorder) MatchAll() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchAll", reflect.TypeOf((*MockSegment)(nil).MatchAll)) +} + +// MatchField mocks base method +func (m *MockSegment) MatchField(arg0 []byte) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchField", arg0) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchField indicates an expected call of MatchField +func (mr *MockSegmentMockRecorder) MatchField(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchField", reflect.TypeOf((*MockSegment)(nil).MatchField), arg0) +} + +// MatchRegexp mocks base method +func (m *MockSegment) MatchRegexp(arg0 []byte, arg1 index.CompiledRegex) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchRegexp", arg0, arg1) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchRegexp indicates an expected call of MatchRegexp +func (mr *MockSegmentMockRecorder) MatchRegexp(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchRegexp", reflect.TypeOf((*MockSegment)(nil).MatchRegexp), arg0, arg1) +} + +// MatchTerm mocks base method +func (m *MockSegment) MatchTerm(arg0, arg1 []byte) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchTerm", arg0, arg1) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchTerm indicates an expected call of MatchTerm +func (mr *MockSegmentMockRecorder) MatchTerm(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchTerm", reflect.TypeOf((*MockSegment)(nil).MatchTerm), arg0, arg1) +} + +// Reader mocks base method +func (m *MockSegment) Reader() (segment.Reader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reader") + ret0, _ := ret[0].(segment.Reader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Reader indicates an expected call of Reader +func (mr *MockSegmentMockRecorder) Reader() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reader", reflect.TypeOf((*MockSegment)(nil).Reader)) +} + +// SegmentData mocks base method +func (m *MockSegment) SegmentData(arg0 context.Context) (SegmentData, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentData", arg0) + ret0, _ := ret[0].(SegmentData) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SegmentData indicates an expected call of SegmentData +func (mr *MockSegmentMockRecorder) SegmentData(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentData", reflect.TypeOf((*MockSegment)(nil).SegmentData), arg0) +} + +// Size mocks base method +func (m *MockSegment) Size() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Size") + ret0, _ := ret[0].(int64) + return ret0 +} + +// Size indicates an expected call of Size +func (mr *MockSegmentMockRecorder) Size() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Size", reflect.TypeOf((*MockSegment)(nil).Size)) +} + +// TermsIterable mocks base method +func (m *MockSegment) TermsIterable() segment.TermsIterable { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TermsIterable") + ret0, _ := ret[0].(segment.TermsIterable) + return ret0 +} + +// TermsIterable indicates an expected call of TermsIterable +func (mr *MockSegmentMockRecorder) TermsIterable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TermsIterable", reflect.TypeOf((*MockSegment)(nil).TermsIterable)) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_terms_iterator.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_terms_iterator.go new file mode 100644 index 00000000..39327dc6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_terms_iterator.go @@ -0,0 +1,134 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package fst + +import ( + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + xerrors "github.com/m3db/m3/src/x/errors" + + "github.com/m3dbx/vellum" +) + +type fstTermsIterOpts struct { + seg *fsSegment + fst *vellum.FST + finalizeFST bool +} + +func (o fstTermsIterOpts) Close() error { + if o.finalizeFST && o.fst != nil { + return o.fst.Close() + } + return nil +} + +func newFSTTermsIter() *fstTermsIter { + i := &fstTermsIter{iter: new(vellum.FSTIterator)} + i.clear() + return i +} + +type fstTermsIter struct { + iter *vellum.FSTIterator + opts fstTermsIterOpts + err error + done bool + firstNext bool + current []byte + currentValue uint64 +} + +var _ sgmt.OrderedBytesIterator = &fstTermsIter{} + +func (f *fstTermsIter) clear() { + f.opts = fstTermsIterOpts{} + f.err = nil + f.done = false + f.firstNext = true + f.current = nil + f.currentValue = 0 +} + +func (f *fstTermsIter) reset(opts fstTermsIterOpts) { + f.clear() + f.opts = opts +} + +func (f *fstTermsIter) handleIterErr(err error) { + if err == vellum.ErrIteratorDone { + f.done = true + } else { + f.err = err + } +} + +func (f *fstTermsIter) Next() bool { + if f.done || f.err != nil { + return false + } + + f.opts.seg.RLock() + defer f.opts.seg.RUnlock() + if f.opts.seg.finalized { + f.err = errReaderFinalized + return false + } + + if f.firstNext { + f.firstNext = false + if err := f.iter.Reset(f.opts.fst, nil, nil, nil); err != nil { + f.handleIterErr(err) + return false + } + } else { + if err := f.iter.Next(); err != nil { + f.handleIterErr(err) + return false + } + } + + f.current, f.currentValue = f.iter.Current() + return true +} + +func (f *fstTermsIter) CurrentOffset() uint64 { + return f.currentValue +} + +func (f *fstTermsIter) Current() []byte { + return f.current +} + +func (f *fstTermsIter) Err() error { + return f.err +} + +func (f *fstTermsIter) Len() int { + return f.opts.fst.Len() +} + +func (f *fstTermsIter) Close() error { + var multiErr xerrors.MultiError + multiErr = multiErr.Add(f.iter.Close()) + multiErr = multiErr.Add(f.opts.Close()) + f.clear() + return multiErr.FinalError() +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_terms_postings_iterator.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_terms_postings_iterator.go new file mode 100644 index 00000000..b0c2c252 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_terms_postings_iterator.go @@ -0,0 +1,117 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package fst + +import ( + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + postingsroaring "github.com/m3db/m3/src/m3ninx/postings/roaring" + "github.com/m3dbx/pilosa/roaring" +) + +// postingsIterRoaringPoolingConfig uses a configuration that avoids allocating +// any containers in the roaring bitmap, since these roaring bitmaps are backed +// by mmaps and don't have any native containers themselves. +var postingsIterRoaringPoolingConfig = roaring.ContainerPoolingConfiguration{ + MaxArraySize: 0, + MaxRunsSize: 0, + AllocateBitmap: false, + MaxCapacity: 0, + MaxKeysAndContainersSliceLength: 128 * 10, +} + +type fstTermsPostingsIter struct { + bitmap *roaring.Bitmap + postings postings.List + + seg *fsSegment + termsIter *fstTermsIter + currTerm []byte + err error +} + +func newFSTTermsPostingsIter() *fstTermsPostingsIter { + bitmap := roaring.NewBitmapWithPooling(postingsIterRoaringPoolingConfig) + i := &fstTermsPostingsIter{ + bitmap: bitmap, + postings: postingsroaring.NewPostingsListFromBitmap(bitmap), + } + i.clear() + return i +} + +var _ sgmt.TermsIterator = &fstTermsPostingsIter{} + +func (f *fstTermsPostingsIter) clear() { + f.bitmap.Reset() + f.seg = nil + f.termsIter = nil + f.currTerm = nil + f.err = nil +} + +func (f *fstTermsPostingsIter) reset( + seg *fsSegment, + termsIter *fstTermsIter, +) { + f.clear() + + f.seg = seg + f.termsIter = termsIter +} + +func (f *fstTermsPostingsIter) Next() bool { + if f.err != nil { + return false + } + + next := f.termsIter.Next() + if !next { + return false + } + + f.currTerm = f.termsIter.Current() + currOffset := f.termsIter.CurrentOffset() + + f.seg.RLock() + f.err = f.seg.unmarshalPostingsListBitmapNotClosedMaybeFinalizedWithLock(f.bitmap, + currOffset) + f.seg.RUnlock() + + return f.err == nil +} + +func (f *fstTermsPostingsIter) Current() ([]byte, postings.List) { + return f.currTerm, f.postings +} + +func (f *fstTermsPostingsIter) Err() error { + return f.err +} + +func (f *fstTermsPostingsIter) Close() error { + var err error + if f.termsIter != nil { + err = f.termsIter.Close() + } + f.clear() + return err +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_writer.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_writer.go new file mode 100644 index 00000000..4514f860 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/fst_writer.go @@ -0,0 +1,109 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package fst + +import ( + "errors" + "io" + + "github.com/m3dbx/vellum" +) + +var ( + errFSTWriterBuildUnset = errors.New("fst writer builer has not been Reset() before use") + + // NB(r): The registry cache used by vellum is: table size * mru size * cell size + // where cell size = 16 bytes (since its an addr and a ptr) + // basically MRU size is the size of each bucket for each combination of + // a builder node + defaultVellumBuilderOpts = vellum.BuilderOpts{ + Encoder: 1, + RegistryTableSize: 10000, // 10k + RegistryMRUSize: 2, // 4 + UnfinishedNodesStackSize: 4096, + BuilderNodePoolingConfig: vellum.BuilderNodePoolingConfig{ + MaxSize: 2 << 16, // ~130k + MaxTransitionSize: 2 << 7, // 256 + }, + } +) + +// fstWriter is a writer to help construct an FST. +type fstWriter struct { + bytesWritten uint64 + writer io.Writer + builderOpts *vellum.BuilderOpts + builder *vellum.Builder +} + +func newFSTWriter(opts WriterOptions) *fstWriter { + builderOpts := new(vellum.BuilderOpts) + *builderOpts = defaultVellumBuilderOpts + if opts.DisableRegistry { + builderOpts.RegistryTableSize = 0 + builderOpts.RegistryMRUSize = 0 + } + return &fstWriter{builderOpts: builderOpts} +} + +func (f *fstWriter) Write(p []byte) (int, error) { + if f.writer == nil { + return 0, errFSTWriterBuildUnset + } + n, err := f.writer.Write(p) + if err != nil { + return 0, err + } + f.bytesWritten += uint64(n) + return n, nil +} + +func (f *fstWriter) Reset(w io.Writer) error { + f.bytesWritten = 0 + f.writer = w + if f.builder == nil { + builder, err := vellum.New(f, f.builderOpts) + if err != nil { + return err + } + f.builder = builder + return nil + } + return f.builder.Reset(f) +} + +func (f *fstWriter) Add(b []byte, v uint64) error { + if f.builder == nil { + return errFSTWriterBuildUnset + } + return f.builder.Insert(b, v) +} + +func (f *fstWriter) Close() (uint64, error) { + if f.builder == nil { + return 0, errFSTWriterBuildUnset + } + err := f.builder.Close() + if err != nil { + return 0, nil + } + return f.bytesWritten, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/options.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/options.go new file mode 100644 index 00000000..275cd759 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/options.go @@ -0,0 +1,134 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package fst + +import ( + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/postings/roaring" + "github.com/m3db/m3/src/m3ninx/x/bytes" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/pool" +) + +const ( + defaultBytesArrayPoolCapacity = 128 +) + +// Options is a collection of knobs for a fs segment. +type Options interface { + // SetInstrumentOptions sets the instrument options. + SetInstrumentOptions(value instrument.Options) Options + + // InstrumentOptions returns the instrument options. + InstrumentOptions() instrument.Options + + // SetBytesPool sets the bytes pool. + SetBytesPool(value pool.BytesPool) Options + + // BytesPool returns the bytes pool. + BytesPool() pool.BytesPool + + // SetPostingsListPool sets the postings list pool. + SetPostingsListPool(value postings.Pool) Options + + // PostingsListPool returns the postings list pool. + PostingsListPool() postings.Pool + + // SetContextPool sets the contextPool. + SetContextPool(value context.Pool) Options + + // ContextPool returns the contextPool. + ContextPool() context.Pool +} + +type opts struct { + iopts instrument.Options + bytesSliceArrPool bytes.SliceArrayPool + bytesPool pool.BytesPool + postingsPool postings.Pool + contextPool context.Pool +} + +// NewOptions returns new options. +func NewOptions() Options { + arrPool := bytes.NewSliceArrayPool(bytes.SliceArrayPoolOpts{ + Capacity: defaultBytesArrayPoolCapacity, + Options: pool.NewObjectPoolOptions(), + }) + arrPool.Init() + + bytesPool := pool.NewBytesPool([]pool.Bucket{ + {Capacity: 256, Count: 1024}, + }, nil) + bytesPool.Init() + + return &opts{ + iopts: instrument.NewOptions(), + bytesSliceArrPool: arrPool, + bytesPool: bytesPool, + postingsPool: postings.NewPool(nil, roaring.NewPostingsList), + // Use a zero pool, this should be overriden at config time. + contextPool: context.NewPool(context.NewOptions(). + SetContextPoolOptions(pool.NewObjectPoolOptions().SetSize(0)). + SetFinalizerPoolOptions(pool.NewObjectPoolOptions().SetSize(0))), + } +} + +func (o *opts) SetInstrumentOptions(v instrument.Options) Options { + opts := *o + opts.iopts = v + return &opts +} + +func (o *opts) InstrumentOptions() instrument.Options { + return o.iopts +} + +func (o *opts) SetBytesPool(value pool.BytesPool) Options { + opts := *o + opts.bytesPool = value + return &opts +} + +func (o *opts) BytesPool() pool.BytesPool { + return o.bytesPool +} + +func (o *opts) SetPostingsListPool(v postings.Pool) Options { + opts := *o + opts.postingsPool = v + return &opts +} + +func (o *opts) PostingsListPool() postings.Pool { + return o.postingsPool +} + +func (o *opts) SetContextPool(value context.Pool) Options { + opts := *o + opts.contextPool = value + return &opts +} + +func (o *opts) ContextPool() context.Pool { + return o.contextPool +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/regexp/regexp.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/regexp/regexp.go new file mode 100644 index 00000000..cd21d99f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/regexp/regexp.go @@ -0,0 +1,89 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Adapted from: https://raw.githubusercontent.com/blevesearch/bleve/master/index/scorch/segment/regexp.go + +package regexp + +import ( + "regexp/syntax" + + vregexp "github.com/m3dbx/vellum/regexp" +) + +// ParseRegexp parses the provided regexp pattern into an equivalent matching automaton, and +// corresponding keys to bound prefix beginning and end during the FST search. +func ParseRegexp(pattern string) (a *vregexp.Regexp, prefixBeg, prefixEnd []byte, err error) { + parsed, err := syntax.Parse(pattern, syntax.Perl) + if err != nil { + return nil, nil, nil, err + } + return ParsedRegexp(pattern, parsed) +} + +// ParsedRegexp uses the pre-parsed regexp pattern and creates an equivalent matching automaton, and +// corresponding keys to bound prefix beginning and end during the FST search. +func ParsedRegexp(pattern string, parsed *syntax.Regexp) (a *vregexp.Regexp, prefixBeg, prefixEnd []byte, err error) { + re, err := vregexp.NewParsedWithLimit(pattern, parsed, vregexp.DefaultLimit) + if err != nil { + return nil, nil, nil, err + } + + prefix := LiteralPrefix(parsed) + if prefix != "" { + prefixBeg := []byte(prefix) + prefixEnd := IncrementBytes(prefixBeg) + return re, prefixBeg, prefixEnd, nil + } + + return re, nil, nil, nil +} + +// LiteralPrefix returns the literal prefix given the parse tree for a regexp +func LiteralPrefix(s *syntax.Regexp) string { + // traverse the left-most branch in the parse tree as long as the + // node represents a concatenation + for s != nil && s.Op == syntax.OpConcat { + if len(s.Sub) < 1 { + return "" + } + + s = s.Sub[0] + } + + if s.Op == syntax.OpLiteral { + return string(s.Rune) + } + + return "" // no literal prefix +} + +// IncrementBytes increments the provided bytes to the next word boundary. +func IncrementBytes(in []byte) []byte { + rv := make([]byte, len(in)) + copy(rv, in) + for i := len(rv) - 1; i >= 0; i-- { + rv[i] = rv[i] + 1 + if rv[i] != 0 { + return rv // didn't overflow, so stop + } + } + return nil // overflowed +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/segment.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/segment.go new file mode 100644 index 00000000..9940e9ef --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/segment.go @@ -0,0 +1,1013 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package fst + +import ( + "errors" + "fmt" + "io" + "sync" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/generated/proto/fswriter" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding" + "github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/postings/pilosa" + "github.com/m3db/m3/src/m3ninx/postings/roaring" + "github.com/m3db/m3/src/m3ninx/x" + "github.com/m3db/m3/src/x/context" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/mmap" + + pilosaroaring "github.com/m3dbx/pilosa/roaring" + "github.com/m3dbx/vellum" +) + +var ( + errReaderClosed = errors.New("segment is closed") + errReaderFinalized = errors.New("segment is finalized") + errReaderNilRegexp = errors.New("nil regexp provided") + errUnsupportedMajorVersion = errors.New("unsupported major version") + errDocumentsDataUnset = errors.New("documents data bytes are not set") + errDocumentsIdxUnset = errors.New("documents index bytes are not set") + errPostingsDataUnset = errors.New("postings data bytes are not set") + errFSTTermsDataUnset = errors.New("fst terms data bytes are not set") + errFSTFieldsDataUnset = errors.New("fst fields data bytes are not set") +) + +// SegmentData represent the collection of required parameters to construct a Segment. +type SegmentData struct { + Version Version + Metadata []byte + + DocsData mmap.Descriptor + DocsIdxData mmap.Descriptor + PostingsData mmap.Descriptor + FSTTermsData mmap.Descriptor + FSTFieldsData mmap.Descriptor + + // DocsReader is an alternative to specifying + // the docs data and docs idx data if the documents + // already reside in memory and we want to use the + // in memory references instead. + DocsReader docs.Reader + + Closer io.Closer +} + +// Validate validates the provided segment data, returning an error if it's not. +func (sd SegmentData) Validate() error { + if err := sd.Version.Supported(); err != nil { + return err + } + + if sd.PostingsData.Bytes == nil { + return errPostingsDataUnset + } + + if sd.FSTTermsData.Bytes == nil { + return errFSTTermsDataUnset + } + + if sd.FSTFieldsData.Bytes == nil { + return errFSTFieldsDataUnset + } + + if sd.DocsReader == nil { + if sd.DocsData.Bytes == nil { + return errDocumentsDataUnset + } + + if sd.DocsIdxData.Bytes == nil { + return errDocumentsIdxUnset + } + } + + return nil +} + +// NewSegment returns a new Segment backed by the provided options. +// NB(prateek): this method only assumes ownership of the data if it returns a nil error, +// otherwise, the user is expected to handle the lifecycle of the input. +func NewSegment(data SegmentData, opts Options) (Segment, error) { + if err := data.Validate(); err != nil { + return nil, err + } + + metadata := fswriter.Metadata{} + if err := metadata.Unmarshal(data.Metadata); err != nil { + return nil, err + } + + if metadata.PostingsFormat != fswriter.PostingsFormat_PILOSAV1_POSTINGS_FORMAT { + return nil, fmt.Errorf("unsupported postings format: %v", metadata.PostingsFormat.String()) + } + + fieldsFST, err := vellum.Load(data.FSTFieldsData.Bytes) + if err != nil { + return nil, fmt.Errorf("unable to load fields fst: %v", err) + } + + var ( + docsThirdPartyReader = data.DocsReader + docsDataReader *docs.DataReader + docsIndexReader *docs.IndexReader + ) + if docsThirdPartyReader == nil { + docsDataReader = docs.NewDataReader(data.DocsData.Bytes) + docsIndexReader, err = docs.NewIndexReader(data.DocsIdxData.Bytes) + if err != nil { + return nil, fmt.Errorf("unable to load documents index: %v", err) + } + } + + s := &fsSegment{ + fieldsFST: fieldsFST, + docsDataReader: docsDataReader, + docsIndexReader: docsIndexReader, + docsThirdPartyReader: docsThirdPartyReader, + + data: data, + opts: opts, + numDocs: metadata.NumDocs, + } + + // NB(r): The segment uses the context finalization to finalize + // resources. Finalize is called after Close is called and all + // the segment readers have also been closed. + s.ctx = opts.ContextPool().Get() + s.ctx.RegisterFinalizer(s) + + return s, nil +} + +// Ensure FST segment implements ImmutableSegment so can be casted upwards +// and mmap's can be freed. +var _ segment.ImmutableSegment = (*fsSegment)(nil) + +type fsSegment struct { + sync.RWMutex + ctx context.Context + closed bool + finalized bool + fieldsFST *vellum.FST + docsDataReader *docs.DataReader + docsIndexReader *docs.IndexReader + docsThirdPartyReader docs.Reader + data SegmentData + opts Options + + numDocs int64 +} + +func (r *fsSegment) SegmentData(ctx context.Context) (SegmentData, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return SegmentData{}, errReaderClosed + } + + // NB(r): Ensure that we do not release, mmaps, etc + // until all readers have been closed. + r.ctx.DependsOn(ctx) + return r.data, nil +} + +func (r *fsSegment) Size() int64 { + r.RLock() + defer r.RUnlock() + if r.closed { + return 0 + } + return r.numDocs +} + +func (r *fsSegment) ContainsID(docID []byte) (bool, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return false, errReaderClosed + } + + termsFST, exists, err := r.retrieveTermsFSTWithRLock(doc.IDReservedFieldName) + if err != nil { + return false, err + } + + if !exists { + return false, fmt.Errorf("internal error while retrieving id FST: %v", err) + } + + _, exists, err = termsFST.Get(docID) + closeErr := termsFST.Close() + if err != nil { + return false, err + } + + return exists, closeErr +} + +func (r *fsSegment) ContainsField(field []byte) (bool, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return false, errReaderClosed + } + return r.fieldsFST.Contains(field) +} + +func (r *fsSegment) Reader() (sgmt.Reader, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errReaderClosed + } + + reader := newReader(r, r.opts) + + // NB(r): Ensure that we do not release, mmaps, etc + // until all readers have been closed. + r.ctx.DependsOn(reader.ctx) + + return reader, nil +} + +func (r *fsSegment) Close() error { + r.Lock() + if r.closed { + r.Unlock() + return errReaderClosed + } + r.closed = true + r.Unlock() + // NB(r): Inform context we are done, once all segment readers are + // closed the segment Finalize will be called async. + r.ctx.Close() + return nil +} + +func (r *fsSegment) Finalize() { + r.Lock() + r.fieldsFST.Close() + if r.data.Closer != nil { + r.data.Closer.Close() + } + r.finalized = true + r.Unlock() +} + +func (r *fsSegment) FieldsIterable() sgmt.FieldsIterable { + return r +} + +func (r *fsSegment) Fields() (sgmt.FieldsIterator, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errReaderClosed + } + + iter := newFSTTermsIter() + iter.reset(fstTermsIterOpts{ + seg: r, + fst: r.fieldsFST, + finalizeFST: false, + }) + return iter, nil +} + +func (r *fsSegment) TermsIterable() sgmt.TermsIterable { + return &termsIterable{ + r: r, + fieldsIter: newFSTTermsIter(), + postingsIter: newFSTTermsPostingsIter(), + } +} + +func (r *fsSegment) FreeMmap() error { + multiErr := xerrors.NewMultiError() + + // NB(bodu): PostingsData, FSTTermsData and FSTFieldsData always present. + if err := mmap.MadviseDontNeed(r.data.PostingsData); err != nil { + multiErr = multiErr.Add(err) + } + if err := mmap.MadviseDontNeed(r.data.FSTTermsData); err != nil { + multiErr = multiErr.Add(err) + } + if err := mmap.MadviseDontNeed(r.data.FSTFieldsData); err != nil { + multiErr = multiErr.Add(err) + } + + // DocsData and DocsIdxData are not always present. + if r.data.DocsData.Bytes != nil { + if err := mmap.MadviseDontNeed(r.data.DocsData); err != nil { + multiErr = multiErr.Add(err) + } + } + if r.data.DocsIdxData.Bytes != nil { + if err := mmap.MadviseDontNeed(r.data.DocsIdxData); err != nil { + multiErr = multiErr.Add(err) + } + } + + return multiErr.FinalError() +} + +// termsIterable allows multiple term lookups to share the same roaring +// bitmap being unpacked for use when iterating over an entire segment +type termsIterable struct { + r *fsSegment + fieldsIter *fstTermsIter + postingsIter *fstTermsPostingsIter +} + +func newTermsIterable(r *fsSegment) *termsIterable { + return &termsIterable{ + r: r, + fieldsIter: newFSTTermsIter(), + postingsIter: newFSTTermsPostingsIter(), + } +} + +func (i *termsIterable) Terms(field []byte) (sgmt.TermsIterator, error) { + i.r.RLock() + defer i.r.RUnlock() + if i.r.closed { + return nil, errReaderClosed + } + return i.termsNotClosedMaybeFinalizedWithRLock(field) +} + +func (i *termsIterable) termsNotClosedMaybeFinalizedWithRLock( + field []byte, +) (sgmt.TermsIterator, error) { + // NB(r): Not closed, but could be finalized (i.e. closed segment reader) + // calling match field after this segment is finalized. + if i.r.finalized { + return nil, errReaderFinalized + } + + termsFST, exists, err := i.r.retrieveTermsFSTWithRLock(field) + if err != nil { + return nil, err + } + + if !exists { + return sgmt.EmptyTermsIterator, nil + } + + i.fieldsIter.reset(fstTermsIterOpts{ + seg: i.r, + fst: termsFST, + finalizeFST: true, + }) + i.postingsIter.reset(i.r, i.fieldsIter) + return i.postingsIter, nil +} + +func (r *fsSegment) UnmarshalPostingsListBitmap(b *pilosaroaring.Bitmap, offset uint64) error { + r.RLock() + defer r.RUnlock() + if r.closed { + return errReaderClosed + } + + return r.unmarshalPostingsListBitmapNotClosedMaybeFinalizedWithLock(b, offset) +} + +func (r *fsSegment) unmarshalPostingsListBitmapNotClosedMaybeFinalizedWithLock(b *pilosaroaring.Bitmap, offset uint64) error { + if r.finalized { + return errReaderFinalized + } + + postingsBytes, err := r.retrieveBytesWithRLock(r.data.PostingsData.Bytes, offset) + if err != nil { + return fmt.Errorf("unable to retrieve postings data: %v", err) + } + + b.Reset() + return b.UnmarshalBinary(postingsBytes) +} + +func (r *fsSegment) MatchField(field []byte) (postings.List, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errReaderClosed + } + return r.matchFieldNotClosedMaybeFinalizedWithRLock(field) +} + +func (r *fsSegment) matchFieldNotClosedMaybeFinalizedWithRLock( + field []byte, +) (postings.List, error) { + // NB(r): Not closed, but could be finalized (i.e. closed segment reader) + // calling match field after this segment is finalized. + if r.finalized { + return nil, errReaderFinalized + } + + if !r.data.Version.supportsFieldPostingsList() { + // i.e. don't have the field level postings list, so fall back to regexp + return r.matchRegexpNotClosedMaybeFinalizedWithRLock(field, index.DotStarCompiledRegex()) + } + + termsFSTOffset, exists, err := r.fieldsFST.Get(field) + if err != nil { + return nil, err + } + if !exists { + // i.e. we don't know anything about the term, so can early return an empty postings list + return r.opts.PostingsListPool().Get(), nil + } + + protoBytes, _, err := r.retrieveTermsBytesWithRLock(r.data.FSTTermsData.Bytes, termsFSTOffset) + if err != nil { + return nil, err + } + + var fieldData fswriter.FieldData + if err := fieldData.Unmarshal(protoBytes); err != nil { + return nil, err + } + + postingsOffset := fieldData.FieldPostingsListOffset + return r.retrievePostingsListWithRLock(postingsOffset) +} + +func (r *fsSegment) MatchTerm(field []byte, term []byte) (postings.List, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errReaderClosed + } + return r.matchTermNotClosedMaybeFinalizedWithRLock(field, term) +} + +func (r *fsSegment) matchTermNotClosedMaybeFinalizedWithRLock( + field, term []byte, +) (postings.List, error) { + // NB(r): Not closed, but could be finalized (i.e. closed segment reader) + // calling match field after this segment is finalized. + if r.finalized { + return nil, errReaderFinalized + } + + termsFST, exists, err := r.retrieveTermsFSTWithRLock(field) + if err != nil { + return nil, err + } + + if !exists { + // i.e. we don't know anything about the field, so can early return an empty postings list + return r.opts.PostingsListPool().Get(), nil + } + + fstCloser := x.NewSafeCloser(termsFST) + defer fstCloser.Close() + + postingsOffset, exists, err := termsFST.Get(term) + if err != nil { + return nil, err + } + + if !exists { + // i.e. we don't know anything about the term, so can early return an empty postings list + return r.opts.PostingsListPool().Get(), nil + } + + pl, err := r.retrievePostingsListWithRLock(postingsOffset) + if err != nil { + return nil, err + } + + if err := fstCloser.Close(); err != nil { + return nil, err + } + + return pl, nil +} + +func (r *fsSegment) MatchRegexp( + field []byte, + compiled index.CompiledRegex, +) (postings.List, error) { + r.RLock() + defer r.Unlock() + if r.closed { + return nil, errReaderClosed + } + return r.matchRegexpNotClosedMaybeFinalizedWithRLock(field, compiled) +} + +func (r *fsSegment) matchRegexpNotClosedMaybeFinalizedWithRLock( + field []byte, + compiled index.CompiledRegex, +) (postings.List, error) { + // NB(r): Not closed, but could be finalized (i.e. closed segment reader) + // calling match field after this segment is finalized. + if r.finalized { + return nil, errReaderFinalized + } + + re := compiled.FST + if re == nil { + return nil, errReaderNilRegexp + } + + termsFST, exists, err := r.retrieveTermsFSTWithRLock(field) + if err != nil { + return nil, err + } + + if !exists { + // i.e. we don't know anything about the field, so can early return an empty postings list + return r.opts.PostingsListPool().Get(), nil + } + + var ( + fstCloser = x.NewSafeCloser(termsFST) + iter, iterErr = termsFST.Search(re, compiled.PrefixBegin, compiled.PrefixEnd) + iterCloser = x.NewSafeCloser(iter) + // NB(prateek): way quicker to union the PLs together at the end, rathen than one at a time. + pls []postings.List // TODO: pool this slice allocation + ) + defer func() { + iterCloser.Close() + fstCloser.Close() + }() + + for { + if iterErr == vellum.ErrIteratorDone { + break + } + + if iterErr != nil { + return nil, iterErr + } + + _, postingsOffset := iter.Current() + nextPl, err := r.retrievePostingsListWithRLock(postingsOffset) + if err != nil { + return nil, err + } + pls = append(pls, nextPl) + iterErr = iter.Next() + } + + pl, err := roaring.Union(pls) + if err != nil { + return nil, err + } + + if err := iterCloser.Close(); err != nil { + return nil, err + } + + if err := fstCloser.Close(); err != nil { + return nil, err + } + + return pl, nil +} + +func (r *fsSegment) MatchAll() (postings.MutableList, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errReaderClosed + } + return r.matchAllNotClosedMaybeFinalizedWithRLock() +} + +func (r *fsSegment) matchAllNotClosedMaybeFinalizedWithRLock() (postings.MutableList, error) { + // NB(r): Not closed, but could be finalized (i.e. closed segment reader) + // calling match field after this segment is finalized. + if r.finalized { + return nil, errReaderFinalized + } + + pl := r.opts.PostingsListPool().Get() + err := pl.AddRange(0, postings.ID(r.numDocs)) + if err != nil { + return nil, err + } + + return pl, nil +} + +func (r *fsSegment) Doc(id postings.ID) (doc.Document, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return doc.Document{}, errReaderClosed + } + return r.docNotClosedMaybeFinalizedWithRLock(id) +} + +func (r *fsSegment) docNotClosedMaybeFinalizedWithRLock(id postings.ID) (doc.Document, error) { + // NB(r): Not closed, but could be finalized (i.e. closed segment reader) + // calling match field after this segment is finalized. + if r.finalized { + return doc.Document{}, errReaderFinalized + } + + // If using docs slice reader, return from the in memory slice reader + if r.docsThirdPartyReader != nil { + return r.docsThirdPartyReader.Read(id) + } + + offset, err := r.docsIndexReader.Read(id) + if err != nil { + return doc.Document{}, err + } + + return r.docsDataReader.Read(offset) +} + +func (r *fsSegment) Docs(pl postings.List) (doc.Iterator, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errReaderClosed + } + return r.docsNotClosedMaybeFinalizedWithRLock(r, pl) +} + +func (r *fsSegment) docsNotClosedMaybeFinalizedWithRLock( + retriever index.DocRetriever, + pl postings.List, +) (doc.Iterator, error) { + // NB(r): Not closed, but could be finalized (i.e. closed segment reader) + // calling match field after this segment is finalized. + if r.finalized { + return nil, errReaderFinalized + } + + return index.NewIDDocIterator(retriever, pl.Iterator()), nil +} + +func (r *fsSegment) AllDocs() (index.IDDocIterator, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errReaderClosed + } + return r.allDocsNotClosedMaybeFinalizedWithRLock(r) +} + +func (r *fsSegment) allDocsNotClosedMaybeFinalizedWithRLock( + retriever index.DocRetriever, +) (index.IDDocIterator, error) { + // NB(r): Not closed, but could be finalized (i.e. closed segment reader) + // calling match field after this segment is finalized. + if r.finalized { + return nil, errReaderFinalized + } + + pi := postings.NewRangeIterator(0, postings.ID(r.numDocs)) + return index.NewIDDocIterator(retriever, pi), nil +} + +func (r *fsSegment) retrievePostingsListWithRLock(postingsOffset uint64) (postings.List, error) { + postingsBytes, err := r.retrieveBytesWithRLock(r.data.PostingsData.Bytes, postingsOffset) + if err != nil { + return nil, fmt.Errorf("unable to retrieve postings data: %v", err) + } + + return pilosa.Unmarshal(postingsBytes) +} + +func (r *fsSegment) retrieveTermsFSTWithRLock(field []byte) (*vellum.FST, bool, error) { + termsFSTOffset, exists, err := r.fieldsFST.Get(field) + if err != nil { + return nil, false, err + } + + if !exists { + return nil, false, nil + } + + termsFSTBytes, err := r.retrieveBytesWithRLock(r.data.FSTTermsData.Bytes, termsFSTOffset) + if err != nil { + return nil, false, fmt.Errorf("error while decoding terms fst: %v", err) + } + + termsFST, err := vellum.Load(termsFSTBytes) + if err != nil { + return nil, false, fmt.Errorf("error while loading terms fst: %v", err) + } + + return termsFST, true, nil +} + +// retrieveTermsBytesWithRLock assumes the base []byte slice is a collection of +// (protobuf payload, proto payload size, fst payload, fst payload size, magicNumber) tuples; +// where all sizes/magicNumber are strictly uint64 (i.e. 8 bytes). It assumes the 8 bytes +// preceding the offset are the magicNumber, the 8 bytes before that are the fst payload size, +// and the `size` bytes before that are the payload, 8 bytes preceeding that are +// `proto payload size`, and the `proto payload size` bytes before that are the proto payload. +// It retrieves the payload while doing bounds checks to ensure no segfaults. +func (r *fsSegment) retrieveTermsBytesWithRLock(base []byte, offset uint64) (proto []byte, fst []byte, err error) { + const sizeofUint64 = 8 + var ( + magicNumberEnd = int64(offset) // to prevent underflows + magicNumberStart = offset - sizeofUint64 + ) + if magicNumberEnd > int64(len(base)) || magicNumberStart < 0 { + return nil, nil, fmt.Errorf("base bytes too small, length: %d, base-offset: %d", len(base), magicNumberEnd) + } + magicNumberBytes := base[magicNumberStart:magicNumberEnd] + d := encoding.NewDecoder(magicNumberBytes) + n, err := d.Uint64() + if err != nil { + return nil, nil, fmt.Errorf("error while decoding magicNumber: %v", err) + } + if n != uint64(magicNumber) { + return nil, nil, fmt.Errorf("mismatch while decoding magicNumber: %d", n) + } + + var ( + sizeEnd = magicNumberStart + sizeStart = sizeEnd - sizeofUint64 + ) + if sizeStart < 0 { + return nil, nil, fmt.Errorf("base bytes too small, length: %d, size-offset: %d", len(base), sizeStart) + } + sizeBytes := base[sizeStart:sizeEnd] + d.Reset(sizeBytes) + size, err := d.Uint64() + if err != nil { + return nil, nil, fmt.Errorf("error while decoding size: %v", err) + } + + var ( + payloadEnd = sizeStart + payloadStart = payloadEnd - size + ) + if payloadStart < 0 { + return nil, nil, fmt.Errorf("base bytes too small, length: %d, payload-start: %d, payload-size: %d", + len(base), payloadStart, size) + } + + var ( + fstBytes = base[payloadStart:payloadEnd] + protoSizeEnd = payloadStart + protoSizeStart = protoSizeEnd - sizeofUint64 + ) + if protoSizeStart < 0 { + return nil, nil, fmt.Errorf("base bytes too small, length: %d, proto-size-offset: %d", len(base), protoSizeStart) + } + + protoSizeBytes := base[protoSizeStart:protoSizeEnd] + d.Reset(protoSizeBytes) + protoSize, err := d.Uint64() + if err != nil { + return nil, nil, fmt.Errorf("error while decoding size: proto %v", err) + } + + var ( + protoEnd = protoSizeStart + protoStart = protoEnd - protoSize + ) + if protoStart < 0 { + return nil, nil, fmt.Errorf("base bytes too small, length: %d, proto-start: %d", len(base), protoStart) + } + protoBytes := base[protoStart:protoEnd] + + return protoBytes, fstBytes, nil +} + +// retrieveBytesWithRLock assumes the base []byte slice is a collection of (payload, size, magicNumber) triples, +// where size/magicNumber are strictly uint64 (i.e. 8 bytes). It assumes the 8 bytes preceding the offset +// are the magicNumber, the 8 bytes before that are the size, and the `size` bytes before that are the +// payload. It retrieves the payload while doing bounds checks to ensure no segfaults. +func (r *fsSegment) retrieveBytesWithRLock(base []byte, offset uint64) ([]byte, error) { + const sizeofUint64 = 8 + var ( + magicNumberEnd = int64(offset) // to prevent underflows + magicNumberStart = offset - sizeofUint64 + ) + if magicNumberEnd > int64(len(base)) || magicNumberStart < 0 { + return nil, fmt.Errorf("base bytes too small, length: %d, base-offset: %d", len(base), magicNumberEnd) + } + magicNumberBytes := base[magicNumberStart:magicNumberEnd] + d := encoding.NewDecoder(magicNumberBytes) + n, err := d.Uint64() + if err != nil { + return nil, fmt.Errorf("error while decoding magicNumber: %v", err) + } + if n != uint64(magicNumber) { + return nil, fmt.Errorf("mismatch while decoding magicNumber: %d", n) + } + + var ( + sizeEnd = magicNumberStart + sizeStart = sizeEnd - sizeofUint64 + ) + if sizeStart < 0 { + return nil, fmt.Errorf("base bytes too small, length: %d, size-offset: %d", len(base), sizeStart) + } + sizeBytes := base[sizeStart:sizeEnd] + d.Reset(sizeBytes) + size, err := d.Uint64() + if err != nil { + return nil, fmt.Errorf("error while decoding size: %v", err) + } + + var ( + payloadEnd = sizeStart + payloadStart = payloadEnd - size + ) + if payloadStart < 0 { + return nil, fmt.Errorf("base bytes too small, length: %d, payload-start: %d, payload-size: %d", + len(base), payloadStart, size) + } + + return base[payloadStart:payloadEnd], nil +} + +var _ sgmt.Reader = (*fsSegmentReader)(nil) + +// fsSegmentReader is not thread safe for use and relies on the underlying +// segment for synchronization. +type fsSegmentReader struct { + closed bool + ctx context.Context + fsSegment *fsSegment + termsIterable *termsIterable +} + +func newReader( + fsSegment *fsSegment, + opts Options, +) *fsSegmentReader { + return &fsSegmentReader{ + ctx: opts.ContextPool().Get(), + fsSegment: fsSegment, + } +} + +func (sr *fsSegmentReader) Fields() (sgmt.FieldsIterator, error) { + if sr.closed { + return nil, errReaderClosed + } + + iter := newFSTTermsIter() + iter.reset(fstTermsIterOpts{ + seg: sr.fsSegment, + fst: sr.fsSegment.fieldsFST, + finalizeFST: false, + }) + return iter, nil +} + +func (sr *fsSegmentReader) ContainsField(field []byte) (bool, error) { + if sr.closed { + return false, errReaderClosed + } + + sr.fsSegment.RLock() + defer sr.fsSegment.RUnlock() + if sr.fsSegment.finalized { + return false, errReaderFinalized + } + + return sr.fsSegment.fieldsFST.Contains(field) +} + +func (sr *fsSegmentReader) Terms(field []byte) (sgmt.TermsIterator, error) { + if sr.closed { + return nil, errReaderClosed + } + if sr.termsIterable == nil { + sr.termsIterable = newTermsIterable(sr.fsSegment) + } + sr.fsSegment.RLock() + iter, err := sr.termsIterable.termsNotClosedMaybeFinalizedWithRLock(field) + sr.fsSegment.RUnlock() + return iter, err +} + +func (sr *fsSegmentReader) MatchField(field []byte) (postings.List, error) { + if sr.closed { + return nil, errReaderClosed + } + // NB(r): We are allowed to call match field after Close called on + // the segment but not after it is finalized. + sr.fsSegment.RLock() + pl, err := sr.fsSegment.matchFieldNotClosedMaybeFinalizedWithRLock(field) + sr.fsSegment.RUnlock() + return pl, err +} + +func (sr *fsSegmentReader) MatchTerm(field []byte, term []byte) (postings.List, error) { + if sr.closed { + return nil, errReaderClosed + } + // NB(r): We are allowed to call match field after Close called on + // the segment but not after it is finalized. + sr.fsSegment.RLock() + pl, err := sr.fsSegment.matchTermNotClosedMaybeFinalizedWithRLock(field, term) + sr.fsSegment.RUnlock() + return pl, err +} + +func (sr *fsSegmentReader) MatchRegexp( + field []byte, + compiled index.CompiledRegex, +) (postings.List, error) { + if sr.closed { + return nil, errReaderClosed + } + // NB(r): We are allowed to call match field after Close called on + // the segment but not after it is finalized. + sr.fsSegment.RLock() + pl, err := sr.fsSegment.matchRegexpNotClosedMaybeFinalizedWithRLock(field, compiled) + sr.fsSegment.RUnlock() + return pl, err +} + +func (sr *fsSegmentReader) MatchAll() (postings.MutableList, error) { + if sr.closed { + return nil, errReaderClosed + } + // NB(r): We are allowed to call match field after Close called on + // the segment but not after it is finalized. + sr.fsSegment.RLock() + pl, err := sr.fsSegment.matchAllNotClosedMaybeFinalizedWithRLock() + sr.fsSegment.RUnlock() + return pl, err +} + +func (sr *fsSegmentReader) Doc(id postings.ID) (doc.Document, error) { + if sr.closed { + return doc.Document{}, errReaderClosed + } + // NB(r): We are allowed to call match field after Close called on + // the segment but not after it is finalized. + sr.fsSegment.RLock() + pl, err := sr.fsSegment.docNotClosedMaybeFinalizedWithRLock(id) + sr.fsSegment.RUnlock() + return pl, err +} + +func (sr *fsSegmentReader) Docs(pl postings.List) (doc.Iterator, error) { + if sr.closed { + return nil, errReaderClosed + } + // NB(r): We are allowed to call match field after Close called on + // the segment but not after it is finalized. + // Also make sure the doc retriever is the reader not the segment so that + // is closed check is not performed and only the is finalized check. + sr.fsSegment.RLock() + iter, err := sr.fsSegment.docsNotClosedMaybeFinalizedWithRLock(sr, pl) + sr.fsSegment.RUnlock() + return iter, err +} + +func (sr *fsSegmentReader) AllDocs() (index.IDDocIterator, error) { + if sr.closed { + return nil, errReaderClosed + } + // NB(r): We are allowed to call match field after Close called on + // the segment but not after it is finalized. + // Also make sure the doc retriever is the reader not the segment so that + // is closed check is not performed and only the is finalized check. + sr.fsSegment.RLock() + iter, err := sr.fsSegment.allDocsNotClosedMaybeFinalizedWithRLock(sr) + sr.fsSegment.RUnlock() + return iter, err +} + +func (sr *fsSegmentReader) Close() error { + if sr.closed { + return errReaderClosed + } + sr.closed = true + // Close the context so that segment doesn't need to track this any longer. + sr.ctx.Close() + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/types.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/types.go new file mode 100644 index 00000000..bba13209 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/types.go @@ -0,0 +1,115 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package fst + +import ( + "fmt" + "io" + + "github.com/m3db/m3/src/m3ninx/index" + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/x/context" +) + +const ( + magicNumber = 0x6D33D0C5 +) + +// Version controls internal behaviour of the fst package. +type Version struct { + Major int + Minor int +} + +var ( + // CurrentVersion describes the default current Version. + CurrentVersion Version = Version{Major: 1, Minor: 1} + + // SupportedVersions lists all supported versions of the FST package. + SupportedVersions = []Version{ + // 1.1 Adds support for field level metadata in a proto object, + // and an additional postings list per Field referencing all + // documents which have that Field. + Version{Major: 1, Minor: 1}, + // 1.0 is the initial release. + Version{Major: 1, Minor: 0}, + } +) + +// Segment represents a FST segment. +type Segment interface { + sgmt.ImmutableSegment + index.Readable + + // SegmentData returns the segment data used to create the segment. + // Note: Must close context when done with the data + // so that can resources can be free'd safely. + SegmentData(ctx context.Context) (SegmentData, error) +} + +// Writer writes out a FST segment from the provided elements. +type Writer interface { + // Reset sets the Writer to persist the provide segment. + // NB(prateek): if provided segment is a mutable segment it must be sealed. + Reset(s sgmt.Builder) error + + // MajorVersion is the major version for the writer. + MajorVersion() int + + // MinorVersion is the minor version for the writer. + MinorVersion() int + + // Metadata returns metadata about the writer. + Metadata() []byte + + // WriteDocumentsData writes out the documents data to the provided writer. + WriteDocumentsData(w io.Writer) error + + // WriteDocumentsIndex writes out the documents index to the provided writer. + // NB(prateek): this must be called after WriteDocumentsData(). + WriteDocumentsIndex(w io.Writer) error + + // WritePostingsOffsets writes out the postings offset file to the provided + // writer. + WritePostingsOffsets(w io.Writer) error + + // WriteFSTTerms writes out the FSTTerms file using the provided writer. + // NB(prateek): this must be called after WritePostingsOffsets(). + WriteFSTTerms(w io.Writer) error + + // WriteFSTFields writes out the FSTFields file using the provided writer. + // NB(prateek): this must be called after WriteFSTTerm(). + WriteFSTFields(w io.Writer) error +} + +// Supported returns an error indicating if the version is supported. +func (v Version) Supported() error { + for _, o := range SupportedVersions { + if v.Major == o.Major && v.Minor == o.Minor { + return nil + } + } + return fmt.Errorf("unsupported version: %+v, supported versions: %+v", v, SupportedVersions) +} + +func (v Version) supportsFieldPostingsList() bool { + return v.Major == 1 && v.Minor >= 1 +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/utils.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/utils.go new file mode 100644 index 00000000..d78f46b3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/utils.go @@ -0,0 +1,80 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package fst + +import ( + "bytes" + "testing" + + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/x/mmap" + + "github.com/stretchr/testify/require" +) + +// ToTestSegment returns a FST segment equivalent to the provide mutable segment. +func ToTestSegment(t *testing.T, s sgmt.MutableSegment, opts Options) sgmt.Segment { + return newFSTSegment(t, s, opts) +} + +func newFSTSegmentWithVersion( + t *testing.T, + s sgmt.MutableSegment, + opts Options, + writerVersion, readerVersion Version, +) sgmt.Segment { + s.Seal() + w, err := newWriterWithVersion(WriterOptions{}, &writerVersion) + require.NoError(t, err) + require.NoError(t, w.Reset(s)) + + var ( + docsDataBuffer bytes.Buffer + docsIndexBuffer bytes.Buffer + postingsBuffer bytes.Buffer + fstTermsBuffer bytes.Buffer + fstFieldsBuffer bytes.Buffer + ) + + require.NoError(t, w.WriteDocumentsData(&docsDataBuffer)) + require.NoError(t, w.WriteDocumentsIndex(&docsIndexBuffer)) + require.NoError(t, w.WritePostingsOffsets(&postingsBuffer)) + require.NoError(t, w.WriteFSTTerms(&fstTermsBuffer)) + require.NoError(t, w.WriteFSTFields(&fstFieldsBuffer)) + + data := SegmentData{ + Version: readerVersion, + Metadata: w.Metadata(), + DocsData: mmap.Descriptor{Bytes: docsDataBuffer.Bytes()}, + DocsIdxData: mmap.Descriptor{Bytes: docsIndexBuffer.Bytes()}, + PostingsData: mmap.Descriptor{Bytes: postingsBuffer.Bytes()}, + FSTTermsData: mmap.Descriptor{Bytes: fstTermsBuffer.Bytes()}, + FSTFieldsData: mmap.Descriptor{Bytes: fstFieldsBuffer.Bytes()}, + } + reader, err := NewSegment(data, opts) + require.NoError(t, err) + + return reader +} + +func newFSTSegment(t *testing.T, s sgmt.MutableSegment, opts Options) sgmt.Segment { + return newFSTSegmentWithVersion(t, s, opts, CurrentVersion, CurrentVersion) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/writer.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/writer.go new file mode 100644 index 00000000..c52b9694 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/fst/writer.go @@ -0,0 +1,517 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package fst + +import ( + "fmt" + "io" + + "github.com/m3db/m3/src/m3ninx/generated/proto/fswriter" + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/postings/pilosa" + "github.com/m3db/m3/src/m3ninx/x" + + "github.com/golang/protobuf/proto" +) + +var ( + defaultInitialPostingsOffsetsSize = 1024 + defaultInitialFSTTermsOffsetsSize = 1024 + defaultInitialDocOffsetsSize = 1024 + defaultInitialPostingsNeedsUnionSize = 1024 + defaultInitialIntEncoderSize = 128 + defaultPilosaRoaringMaxContainerSize = 128 +) + +type writer struct { + version Version + builder sgmt.Builder + size int64 + + intEncoder *encoding.Encoder + postingsEncoder *pilosa.Encoder + fstWriter *fstWriter + docsWriter *DocumentsWriter + + metadata []byte + docsDataFileWritten bool + postingsFileWritten bool + fstTermsFileWritten bool + fstTermsOffsets []uint64 + termPostingsOffsets []uint64 + + // only used by versions >= 1.1 + fieldPostingsOffsets []uint64 + fieldData *fswriter.FieldData + fieldBuffer proto.Buffer +} + +// WriterOptions is a set of options used when writing an FST. +type WriterOptions struct { + // DisableRegistry disables the FST builder node registry cache which can + // de-duplicate transitions that are an exact match of each other during + // a final compilation phase, this helps compress the FST by a significant + // amount (e.g. 2x). You can disable this to speed up high fixed cost + // lookups to during building of the FST however. + DisableRegistry bool +} + +// NewWriter returns a new writer. +func NewWriter(opts WriterOptions) (Writer, error) { + return newWriterWithVersion(opts, nil) +} + +// newWriterWithVersion is a constructor used by tests to override version. +func newWriterWithVersion(opts WriterOptions, vers *Version) (Writer, error) { + v := CurrentVersion + if vers != nil { + v = *vers + } + if err := v.Supported(); err != nil { + return nil, err + } + + docsWriter, err := NewDocumentsWriter() + if err != nil { + return nil, err + } + + return &writer{ + version: v, + intEncoder: encoding.NewEncoder(defaultInitialIntEncoderSize), + postingsEncoder: pilosa.NewEncoder(), + fstWriter: newFSTWriter(opts), + docsWriter: docsWriter, + fstTermsOffsets: make([]uint64, 0, defaultInitialFSTTermsOffsetsSize), + termPostingsOffsets: make([]uint64, 0, defaultInitialPostingsOffsetsSize), + + fieldPostingsOffsets: make([]uint64, 0, defaultInitialPostingsOffsetsSize), + fieldData: &fswriter.FieldData{}, + }, nil +} + +func (w *writer) clear() { + w.builder = nil + + w.fstWriter.Reset(nil) + w.intEncoder.Reset() + w.postingsEncoder.Reset() + w.docsWriter.Reset(DocumentsWriterOptions{}) + + w.metadata = nil + w.docsDataFileWritten = false + w.postingsFileWritten = false + w.fstTermsFileWritten = false + w.fstTermsOffsets = w.fstTermsOffsets[:0] + w.termPostingsOffsets = w.termPostingsOffsets[:0] + + w.fieldPostingsOffsets = w.fieldPostingsOffsets[:0] + w.fieldData.Reset() + w.fieldBuffer.Reset() +} + +func (w *writer) Reset(b sgmt.Builder) error { + w.clear() + + if b == nil { + return nil + } + + numDocs := len(b.Docs()) + metadata := defaultV1Metadata() + metadata.NumDocs = int64(numDocs) + metadataBytes, err := metadata.Marshal() + if err != nil { + return err + } + + w.metadata = metadataBytes + w.builder = b + w.size = int64(numDocs) + return nil +} + +func (w *writer) MajorVersion() int { + return w.version.Major +} + +func (w *writer) MinorVersion() int { + return w.version.Minor +} + +func (w *writer) Metadata() []byte { + return w.metadata +} + +func (w *writer) WriteDocumentsData(iow io.Writer) error { + iter, err := w.builder.AllDocs() + closer := x.NewSafeCloser(iter) + defer closer.Close() + if err != nil { + return err + } + + w.docsWriter.Reset(DocumentsWriterOptions{ + Iter: iter, + SizeHint: int(w.size), + }) + if err := w.docsWriter.WriteDocumentsData(iow); err != nil { + return err + } + + w.docsDataFileWritten = true + return closer.Close() +} + +func (w *writer) WriteDocumentsIndex(iow io.Writer) error { + if !w.docsDataFileWritten { + return fmt.Errorf("documents data file has to be written before documents index file") + } + + return w.docsWriter.WriteDocumentsIndex(iow) +} + +func (w *writer) WritePostingsOffsets(iow io.Writer) error { + var ( + writeFieldsPostingList = w.version.supportsFieldPostingsList() + currentOffset = uint64(0) + ) + writePL := func(pl postings.List) (uint64, error) { // helper method + // serialize the postings list + w.postingsEncoder.Reset() + postingsBytes, err := w.postingsEncoder.Encode(pl) + if err != nil { + return 0, err + } + return w.writePayloadAndSizeAndMagicNumber(iow, postingsBytes) + } + + // retrieve known fields + fields, err := w.builder.FieldsPostingsList() + if err != nil { + return err + } + + // for each known field + for fields.Next() { + f, fieldPostingsList := fields.Current() + // retrieve known terms for current field + terms, err := w.builder.Terms(f) + if err != nil { + return err + } + + // for each term corresponding to the current field + for terms.Next() { + _, pl := terms.Current() + // write the postings list + n, err := writePL(pl) + if err != nil { + return err + } + // update offset with the number of bytes we've written + currentOffset += n + // track current offset as the offset for the current field/term + w.termPostingsOffsets = append(w.termPostingsOffsets, currentOffset) + } + + // write the field level postings list + if writeFieldsPostingList { + // Write the unioned postings list out. + n, err := writePL(fieldPostingsList) + if err != nil { + return err + } + // update offset with the number of bytes we've written + currentOffset += n + // track current offset as the offset for the current field + w.fieldPostingsOffsets = append(w.fieldPostingsOffsets, currentOffset) + } + + if err := terms.Err(); err != nil { + return err + } + + if err := terms.Close(); err != nil { + return err + } + } + + if err := fields.Err(); err != nil { + return err + } + + if err := fields.Close(); err != nil { + return err + } + + w.postingsFileWritten = true + return nil +} + +func (w *writer) WriteFSTTerms(iow io.Writer) error { + if !w.postingsFileWritten { + return fmt.Errorf("postings offsets have to be written before fst terms can be written") + } + + var ( + writeFieldsPostingList = w.version.supportsFieldPostingsList() + currentOffset = uint64(0) // track offset of writes into `iow`. + ) + + // retrieve all known fields + fields, err := w.builder.FieldsPostingsList() + if err != nil { + return err + } + + // iterate term|field postings offsets + var ( + termOffsets = w.termPostingsOffsets + fieldOffsets = w.fieldPostingsOffsets + ) + + // build a fst for each field's terms + for fields.Next() { + f, _ := fields.Current() + + // write fields level postings list if required + if writeFieldsPostingList { + po := fieldOffsets[0] + fieldOffsets = fieldOffsets[1:] + md, err := w.fieldsMetadata(po) + if err != nil { + return err + } + if _, err := iow.Write(md); err != nil { + return err + } + numBytesMD := uint64(len(md)) + numBytesMDSize, err := w.writeUint64(iow, numBytesMD) + if err != nil { + return err + } + currentOffset += numBytesMD + numBytesMDSize + } + + // reset writer for this field's fst + if err := w.fstWriter.Reset(iow); err != nil { + return err + } + + // retrieve all terms for this field + terms, err := w.builder.Terms(f) + if err != nil { + return err + } + + // for each term corresponding to this field + for terms.Next() { + t, _ := terms.Current() + + // retieve postsings offset for the current field,term + if len(termOffsets) == 0 { + return fmt.Errorf("postings offset not found for: field=%s, term=%s", f, t) + } + + po := termOffsets[0] + termOffsets = termOffsets[1:] + + // add the term -> posting offset into the term's fst + if err := w.fstWriter.Add(t, po); err != nil { + return err + } + } + if err := terms.Err(); err != nil { + return err + } + + if err := terms.Close(); err != nil { + return err + } + + // retrieve a serialized representation of the field's fst + numBytesFST, err := w.fstWriter.Close() + if err != nil { + return err + } + + // serialize the size of the fst + n, err := w.writeSizeAndMagicNumber(iow, numBytesFST) + if err != nil { + return err + } + // update offset with the number of bytes we've written + currentOffset += numBytesFST + n + + // track current offset as the offset for the current field's fst + w.fstTermsOffsets = append(w.fstTermsOffsets, currentOffset) + } + + if err := fields.Err(); err != nil { + return err + } + + if err := fields.Close(); err != nil { + return err + } + + // make sure we consumed all the postings offsets + if len(termOffsets) != 0 { + return fmt.Errorf("term postings offsets remain at end of terms: remaining=%d", + len(termOffsets)) + } + + // make sure we consumed all the postings offsets + if len(fieldOffsets) != 0 { + return fmt.Errorf("field postings offsets remain at end of terms: remaining=%d", + len(fieldOffsets)) + } + + // all good! + w.fstTermsFileWritten = true + return nil +} + +func (w *writer) fieldsMetadata(fieldPostingsOffset uint64) ([]byte, error) { + w.fieldBuffer.Reset() + w.fieldData.FieldPostingsListOffset = fieldPostingsOffset + if err := w.fieldBuffer.Marshal(w.fieldData); err != nil { + return nil, err + } + return w.fieldBuffer.Bytes(), nil +} + +func (w *writer) WriteFSTFields(iow io.Writer) error { + if !w.fstTermsFileWritten { + return fmt.Errorf("fst terms files have to be written before fst fields can be written") + } + + // reset fst writer + if err := w.fstWriter.Reset(iow); err != nil { + return err + } + + // iterate field offsets + offsets := w.fstTermsOffsets + + // retrieve all known fields + fields, err := w.builder.FieldsPostingsList() + if err != nil { + return err + } + + // insert each field into fst + for fields.Next() { + f, _ := fields.Current() + + // get offset for this field's term fst + if len(offsets) == 0 { + return fmt.Errorf("fst field offset not found for: field=%s", f) + } + + offset := offsets[0] + offsets = offsets[1:] + + // add field, offset into fst + if err := w.fstWriter.Add(f, offset); err != nil { + return err + } + } + + if err := fields.Err(); err != nil { + return err + } + + if err := fields.Close(); err != nil { + return err + } + + // flush the fst writer + _, err = w.fstWriter.Close() + + // make sure we consumed all the postings offsets + if len(offsets) != 0 { + return fmt.Errorf("field offsets remain at end of fields: remaining=%d", + len(offsets)) + } + + return err +} + +// given a payload []byte, and io.Writer; this method writes the following data out to the writer +// | payload - len(payload) bytes | 8 bytes for uint64 (size of payload) | 8 bytes for `magicNumber` | +func (w *writer) writePayloadAndSizeAndMagicNumber(iow io.Writer, payload []byte) (uint64, error) { + numBytesWritten := uint64(0) + size, err := iow.Write(payload) + if err != nil { + return 0, err + } + numBytesWritten += uint64(size) + n, err := w.writeSizeAndMagicNumber(iow, uint64(size)) + if err != nil { + return 0, err + } + numBytesWritten += n + return numBytesWritten, nil +} + +func (w *writer) writeUint64(iow io.Writer, x uint64) (uint64, error) { + // serialize the size, magicNumber + w.intEncoder.Reset() + w.intEncoder.PutUint64(x) + xBytes := w.intEncoder.Bytes() + + // write out the size + n, err := iow.Write(xBytes) + if err != nil { + return 0, err + } + return uint64(n), nil +} + +func (w *writer) writeSizeAndMagicNumber(iow io.Writer, size uint64) (uint64, error) { + // serialize the size, magicNumber + w.intEncoder.Reset() + w.intEncoder.PutUint64(size) + w.intEncoder.PutUint64(uint64(magicNumber)) + sizeBytes := w.intEncoder.Bytes() + + // write out the size + n, err := iow.Write(sizeBytes) + if err != nil { + return 0, err + } + return uint64(n), nil +} + +func defaultV1Metadata() fswriter.Metadata { + return fswriter.Metadata{ + PostingsFormat: fswriter.PostingsFormat_PILOSAV1_POSTINGS_FORMAT, + } +} + +type docOffset struct { + postings.ID + offset uint64 +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/bytes_slice_iterator.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/bytes_slice_iterator.go new file mode 100644 index 00000000..a6f6e219 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/bytes_slice_iterator.go @@ -0,0 +1,86 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "bytes" + "sort" + + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" +) + +type bytesSliceIter struct { + err error + done bool + + currentIdx int + current []byte + backingSlice [][]byte + opts Options +} + +var _ sgmt.FieldsIterator = &bytesSliceIter{} + +func newBytesSliceIter(slice [][]byte, opts Options) *bytesSliceIter { + sortSliceOfByteSlices(slice) + return &bytesSliceIter{ + currentIdx: -1, + backingSlice: slice, + opts: opts, + } +} + +func (b *bytesSliceIter) Next() bool { + if b.done || b.err != nil { + return false + } + b.currentIdx++ + if b.currentIdx >= len(b.backingSlice) { + b.done = true + return false + } + b.current = b.backingSlice[b.currentIdx] + return true +} + +func (b *bytesSliceIter) Current() []byte { + return b.current +} + +func (b *bytesSliceIter) Err() error { + return nil +} + +func (b *bytesSliceIter) Len() int { + return len(b.backingSlice) +} + +func (b *bytesSliceIter) Close() error { + b.current = nil + b.opts.BytesSliceArrayPool().Put(b.backingSlice) + return nil +} + +func sortSliceOfByteSlices(b [][]byte) { + sort.Slice(b, func(i, j int) bool { + return bytes.Compare(b[i], b[j]) < 0 + }) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/concurrent_postings_map.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/concurrent_postings_map.go new file mode 100644 index 00000000..cb9c8729 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/concurrent_postings_map.go @@ -0,0 +1,124 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "regexp" + "sync" + + "github.com/m3db/m3/src/m3ninx/postings" +) + +// concurrentPostingsMap is a thread-safe map from []byte -> postings.List. +type concurrentPostingsMap struct { + sync.RWMutex + *postingsMap + + opts Options +} + +// newConcurrentPostingsMap returns a new thread-safe map from []byte -> postings.List. +func newConcurrentPostingsMap(opts Options) *concurrentPostingsMap { + return &concurrentPostingsMap{ + postingsMap: newPostingsMap(opts.InitialCapacity()), + opts: opts, + } +} + +// Add adds the provided `id` to the postings.List backing `key`. +func (m *concurrentPostingsMap) Add(key []byte, id postings.ID) error { + // Try read lock to see if we already have a postings list for the given value. + m.RLock() + p, ok := m.postingsMap.Get(key) + m.RUnlock() + + // We have a postings list, insert the ID and move on. + if ok { + return p.Insert(id) + } + + // A corresponding postings list doesn't exist, time to acquire write lock. + m.Lock() + p, ok = m.postingsMap.Get(key) + + // Check if the corresponding postings list has been created since we released lock. + if ok { + m.Unlock() + return p.Insert(id) + } + + // Create a new posting list for the term, and insert into fieldValues. + p = m.opts.PostingsListPool().Get() + m.postingsMap.SetUnsafe(key, p, postingsMapSetUnsafeOptions{ + NoCopyKey: true, + NoFinalizeKey: true, + }) + m.Unlock() + return p.Insert(id) +} + +// Keys returns the keys known to the map. +func (m *concurrentPostingsMap) Keys() *termsIter { + m.RLock() + defer m.RUnlock() + keys := m.opts.BytesSliceArrayPool().Get() + for _, entry := range m.Iter() { + keys = append(keys, entry.Key()) + } + return newTermsIter(keys, m, m.opts) +} + +// Get returns the postings.List backing `key`. +func (m *concurrentPostingsMap) Get(key []byte) (postings.List, bool) { + m.RLock() + p, ok := m.postingsMap.Get(key) + m.RUnlock() + if ok { + return p, true + } + return nil, false +} + +// GetRegex returns the union of the postings lists whose keys match the +// provided regexp. +func (m *concurrentPostingsMap) GetRegex(re *regexp.Regexp) (postings.List, bool) { + var pl postings.MutableList + + m.RLock() + for _, mapEntry := range m.postingsMap.Iter() { + // TODO: Evaluate lock contention caused by holding on to the read lock while + // evaluating this predicate. + // TODO: Evaluate if performing a prefix match would speed up the common case. + if re.Match(mapEntry.Key()) { + if pl == nil { + pl = mapEntry.Value().Clone() + } else { + pl.Union(mapEntry.Value()) + } + } + } + m.RUnlock() + + if pl == nil { + return nil, false + } + return pl, true +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/fields_map_gen.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/fields_map_gen.go new file mode 100644 index 00000000..88664bfe --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/fields_map_gen.go @@ -0,0 +1,295 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package mem + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// fieldsMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type fieldsMapHash uint64 + +// fieldsMapHashFn is the hash function to execute when hashing a key. +type fieldsMapHashFn func([]byte) fieldsMapHash + +// fieldsMapEqualsFn is the equals key function to execute when detecting equality of a key. +type fieldsMapEqualsFn func([]byte, []byte) bool + +// fieldsMapCopyFn is the copy key function to execute when copying the key. +type fieldsMapCopyFn func([]byte) []byte + +// fieldsMapFinalizeFn is the finalize key function to execute when finished with a key. +type fieldsMapFinalizeFn func([]byte) + +// fieldsMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// fieldsMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type fieldsMap struct { + _fieldsMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[fieldsMapHash]fieldsMapEntry +} + +// _fieldsMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _fieldsMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash fieldsMapHashFn + // equals is the equals key function to execute when detecting equality. + equals fieldsMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy fieldsMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize fieldsMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// fieldsMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type fieldsMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _fieldsMapKey + // value type stored + value *concurrentPostingsMap +} + +type _fieldsMapKey struct { + key []byte + finalize bool +} + +// Key returns the map entry key. +func (e fieldsMapEntry) Key() []byte { + return e.key.key +} + +// Value returns the map entry value. +func (e fieldsMapEntry) Value() *concurrentPostingsMap { + return e.value +} + +// _fieldsMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _fieldsMapAlloc(opts _fieldsMapOptions) *fieldsMap { + m := &fieldsMap{_fieldsMapOptions: opts} + m.Reallocate() + return m +} + +func (m *fieldsMap) newMapKey(k []byte, opts _fieldsMapKeyOptions) _fieldsMapKey { + key := _fieldsMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *fieldsMap) removeMapKey(hash fieldsMapHash, key _fieldsMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *fieldsMap) Get(k []byte) (*concurrentPostingsMap, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty *concurrentPostingsMap + return empty, false +} + +// Set will set the value for an identifier. +func (m *fieldsMap) Set(k []byte, v *concurrentPostingsMap) { + m.set(k, v, _fieldsMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// fieldsMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type fieldsMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *fieldsMap) SetUnsafe(k []byte, v *concurrentPostingsMap, opts fieldsMapSetUnsafeOptions) { + m.set(k, v, _fieldsMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _fieldsMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *fieldsMap) set(k []byte, v *concurrentPostingsMap, opts _fieldsMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = fieldsMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = fieldsMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *fieldsMap) Iter() map[fieldsMapHash]fieldsMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *fieldsMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *fieldsMap) Contains(k []byte) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *fieldsMap) Delete(k []byte) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *fieldsMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *fieldsMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[fieldsMapHash]fieldsMapEntry, m.initialSize) + } else { + m.lookup = make(map[fieldsMapHash]fieldsMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/fields_map_new.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/fields_map_new.go new file mode 100644 index 00000000..c13cc173 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/fields_map_new.go @@ -0,0 +1,91 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package mem + +import ( + "bytes" + + "github.com/m3db/m3/src/x/pool" + + "github.com/cespare/xxhash/v2" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// fieldsMapOptions provides options used when created the map. +type fieldsMapOptions struct { + InitialSize int + KeyCopyPool pool.BytesPool +} + +// newFieldsMap returns a new byte keyed map. +func newFieldsMap(opts fieldsMapOptions) *fieldsMap { + var ( + copyFn fieldsMapCopyFn + finalizeFn fieldsMapFinalizeFn + ) + if pool := opts.KeyCopyPool; pool == nil { + copyFn = func(k []byte) []byte { + return append([]byte(nil), k...) + } + } else { + copyFn = func(k []byte) []byte { + keyLen := len(k) + pooled := pool.Get(keyLen)[:keyLen] + copy(pooled, k) + return pooled + } + finalizeFn = func(k []byte) { + pool.Put(k) + } + } + return _fieldsMapAlloc(_fieldsMapOptions{ + hash: func(k []byte) fieldsMapHash { + return fieldsMapHash(xxhash.Sum64(k)) + }, + equals: bytes.Equal, + copy: copyFn, + finalize: finalizeFn, + initialSize: opts.InitialSize, + }) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/ids_map_gen.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/ids_map_gen.go new file mode 100644 index 00000000..99f0131e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/ids_map_gen.go @@ -0,0 +1,271 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package mem + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// idsMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type idsMapHash uint64 + +// idsMapHashFn is the hash function to execute when hashing a key. +type idsMapHashFn func([]byte) idsMapHash + +// idsMapEqualsFn is the equals key function to execute when detecting equality of a key. +type idsMapEqualsFn func([]byte, []byte) bool + +// idsMapCopyFn is the copy key function to execute when copying the key. +type idsMapCopyFn func([]byte) []byte + +// idsMapFinalizeFn is the finalize key function to execute when finished with a key. +type idsMapFinalizeFn func([]byte) + +// idsMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// idsMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type idsMap struct { + _idsMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[idsMapHash]idsMapEntry +} + +// _idsMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _idsMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash idsMapHashFn + // equals is the equals key function to execute when detecting equality. + equals idsMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy idsMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize idsMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// idsMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type idsMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _idsMapKey + // value type stored + value struct{} +} + +type _idsMapKey struct { + key []byte + finalize bool +} + +// Key returns the map entry key. +func (e idsMapEntry) Key() []byte { + return e.key.key +} + +// Value returns the map entry value. +func (e idsMapEntry) Value() struct{} { + return e.value +} + +// _idsMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _idsMapAlloc(opts _idsMapOptions) *idsMap { + m := &idsMap{_idsMapOptions: opts} + m.Reallocate() + return m +} + +func (m *idsMap) newMapKey(k []byte, opts _idsMapKeyOptions) _idsMapKey { + key := _idsMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *idsMap) removeMapKey(hash idsMapHash, key _idsMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *idsMap) Get(k []byte) (struct{}, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty struct{} + return empty, false +} + +// Set will set the value for an identifier. +func (m *idsMap) Set(k []byte, v struct{}) { + m.set(k, v, _idsMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// idsMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type idsMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *idsMap) SetUnsafe(k []byte, v struct{}, opts idsMapSetUnsafeOptions) { + m.set(k, v, _idsMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _idsMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *idsMap) set(k []byte, v struct{}, opts _idsMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = idsMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = idsMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *idsMap) Iter() map[idsMapHash]idsMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *idsMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *idsMap) Contains(k []byte) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *idsMap) Delete(k []byte) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *idsMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *idsMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[idsMapHash]idsMapEntry, m.initialSize) + } else { + m.lookup = make(map[idsMapHash]idsMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/ids_map_new.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/ids_map_new.go new file mode 100644 index 00000000..55c5fcd4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/ids_map_new.go @@ -0,0 +1,48 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "bytes" + + "github.com/cespare/xxhash/v2" +) + +// newIDsMap returns a new set of IDs. +func newIDsMap(initialSize int) *idsMap { + return _idsMapAlloc(_idsMapOptions{ + hash: func(k []byte) idsMapHash { + return idsMapHash(xxhash.Sum64(k)) + }, + equals: bytes.Equal, + copy: undefinedIdsMapCopyFn, + finalize: undefinedIdsMapFinalizeFn, + initialSize: initialSize, + }) +} + +var undefinedIdsMapCopyFn idsMapCopyFn = func([]byte) []byte { + panic("not implemented") +} + +var undefinedIdsMapFinalizeFn idsMapFinalizeFn = func([]byte) { + panic("not implemented") +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/iterator.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/iterator.go new file mode 100644 index 00000000..76b1c3b5 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/iterator.go @@ -0,0 +1,62 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "github.com/m3db/m3/src/m3ninx/postings" +) + +// boundedPostingsIterator wraps a normal postings iterator but only returns IDs +// within a given range. +type boundedPostingsIterator struct { + postings.Iterator + curr postings.ID + limits readerDocRange +} + +func newBoundedPostingsIterator(it postings.Iterator, limits readerDocRange) postings.Iterator { + return &boundedPostingsIterator{ + Iterator: it, + limits: limits, + } +} + +func (it *boundedPostingsIterator) Next() bool { + for { + if !it.Iterator.Next() { + return false + } + + curr := it.Iterator.Current() + // We are not assuming that the posting IDs are ordered otherwise we could return + // false immediately when we exceed the end of the range. + if curr < it.limits.startInclusive || curr >= it.limits.endExclusive { + continue + } + + it.curr = curr + return true + } +} + +func (it *boundedPostingsIterator) Current() postings.ID { + return it.curr +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/mem_mock.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/mem_mock.go new file mode 100644 index 00000000..af7483be --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/mem_mock.go @@ -0,0 +1,149 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/m3ninx/index/segment/mem (interfaces: ReadableSegment) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package mem is a generated GoMock package. +package mem + +import ( + "reflect" + "regexp" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + + "github.com/golang/mock/gomock" +) + +// MockReadableSegment is a mock of ReadableSegment interface +type MockReadableSegment struct { + ctrl *gomock.Controller + recorder *MockReadableSegmentMockRecorder +} + +// MockReadableSegmentMockRecorder is the mock recorder for MockReadableSegment +type MockReadableSegmentMockRecorder struct { + mock *MockReadableSegment +} + +// NewMockReadableSegment creates a new mock instance +func NewMockReadableSegment(ctrl *gomock.Controller) *MockReadableSegment { + mock := &MockReadableSegment{ctrl: ctrl} + mock.recorder = &MockReadableSegmentMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockReadableSegment) EXPECT() *MockReadableSegmentMockRecorder { + return m.recorder +} + +// ContainsField mocks base method +func (m *MockReadableSegment) ContainsField(arg0 []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContainsField", arg0) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ContainsField indicates an expected call of ContainsField +func (mr *MockReadableSegmentMockRecorder) ContainsField(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContainsField", reflect.TypeOf((*MockReadableSegment)(nil).ContainsField), arg0) +} + +// Fields mocks base method +func (m *MockReadableSegment) Fields() (segment.FieldsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fields") + ret0, _ := ret[0].(segment.FieldsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fields indicates an expected call of Fields +func (mr *MockReadableSegmentMockRecorder) Fields() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fields", reflect.TypeOf((*MockReadableSegment)(nil).Fields)) +} + +// Terms mocks base method +func (m *MockReadableSegment) Terms(arg0 []byte) (segment.TermsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Terms", arg0) + ret0, _ := ret[0].(segment.TermsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Terms indicates an expected call of Terms +func (mr *MockReadableSegmentMockRecorder) Terms(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Terms", reflect.TypeOf((*MockReadableSegment)(nil).Terms), arg0) +} + +// getDoc mocks base method +func (m *MockReadableSegment) getDoc(arg0 postings.ID) (doc.Document, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "getDoc", arg0) + ret0, _ := ret[0].(doc.Document) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// getDoc indicates an expected call of getDoc +func (mr *MockReadableSegmentMockRecorder) getDoc(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "getDoc", reflect.TypeOf((*MockReadableSegment)(nil).getDoc), arg0) +} + +// matchRegexp mocks base method +func (m *MockReadableSegment) matchRegexp(arg0 []byte, arg1 *regexp.Regexp) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "matchRegexp", arg0, arg1) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// matchRegexp indicates an expected call of matchRegexp +func (mr *MockReadableSegmentMockRecorder) matchRegexp(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "matchRegexp", reflect.TypeOf((*MockReadableSegment)(nil).matchRegexp), arg0, arg1) +} + +// matchTerm mocks base method +func (m *MockReadableSegment) matchTerm(arg0, arg1 []byte) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "matchTerm", arg0, arg1) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// matchTerm indicates an expected call of matchTerm +func (mr *MockReadableSegmentMockRecorder) matchTerm(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "matchTerm", reflect.TypeOf((*MockReadableSegment)(nil).matchTerm), arg0, arg1) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/merge.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/merge.go new file mode 100644 index 00000000..62f7409b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/merge.go @@ -0,0 +1,81 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "io" + + "github.com/m3db/m3/src/m3ninx/index" + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/x" +) + +// Merge merges the segments `srcs` into `target`. +func Merge(target sgmt.MutableSegment, srcs ...sgmt.MutableSegment) error { + safeClosers := []io.Closer{} + defer func() { + for _, c := range safeClosers { + c.Close() + } + }() + + // for each src + for _, src := range srcs { + // get reader for `src` + reader, err := src.Reader() + if err != nil { + return err + } + + // ensure readers are all closed. + readerCloser := x.NewSafeCloser(reader) + safeClosers = append(safeClosers, readerCloser) + + // retrieve all docs known to the reader + dIter, err := reader.AllDocs() + if err != nil { + return err + } + + // iterate over all known docs + for dIter.Next() { + d := dIter.Current() + _, err := target.Insert(d) + if err == nil || err == index.ErrDuplicateID { + continue + } + return err + } + + // ensure no errors while iterating + if err := dIter.Err(); err != nil { + return err + } + + // ensure no errors while closing reader + if err := readerCloser.Close(); err != nil { + return err + } + } + + // all good + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/options.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/options.go new file mode 100644 index 00000000..6e54c1b2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/options.go @@ -0,0 +1,151 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/postings/roaring" + "github.com/m3db/m3/src/m3ninx/util" + "github.com/m3db/m3/src/m3ninx/x/bytes" + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/pool" +) + +const ( + defaultInitialCapacity = 1024 + defaultBytesArrayPoolCapacity = 1024 + // This pool is used in a single-threaded manner. + defaultBytesArrayPoolSize = 1 + // 2<<23 * 16 bytes (byte slice pointer) * 2 (Golang G.C) ~= + // 0.5 GiB max memory usage. + defaultBytesArrayPoolMaxArrayCapacity = 2 << 23 +) + +// Options is a collection of knobs for an in-memory segment. +type Options interface { + // SetInstrumentOptions sets the instrument options. + SetInstrumentOptions(value instrument.Options) Options + + // InstrumentOptions returns the instrument options. + InstrumentOptions() instrument.Options + + // SetBytesSliceArrayPool sets the bytes slice array pool. + SetBytesSliceArrayPool(value bytes.SliceArrayPool) Options + + // BytesSliceArrayPool returns the bytes slice array pool. + BytesSliceArrayPool() bytes.SliceArrayPool + + // SetPostingsListPool sets the postings list pool. + SetPostingsListPool(value postings.Pool) Options + + // PostingsListPool returns the postings list pool. + PostingsListPool() postings.Pool + + // SetInitialCapacity sets the initial capacity. + SetInitialCapacity(value int) Options + + // InitialCapacity returns the initial capacity. + InitialCapacity() int + + // SetNewUUIDFn sets the function used to generate new UUIDs. + SetNewUUIDFn(value util.NewUUIDFn) Options + + // NewUUIDFn returns the function used to generate new UUIDs. + NewUUIDFn() util.NewUUIDFn +} + +type opts struct { + iopts instrument.Options + bytesSliceArrPool bytes.SliceArrayPool + postingsPool postings.Pool + initialCapacity int + newUUIDFn util.NewUUIDFn +} + +// NewOptions returns new options. +func NewOptions() Options { + arrPool := bytes.NewSliceArrayPool(bytes.SliceArrayPoolOpts{ + Capacity: defaultBytesArrayPoolCapacity, + MaxCapacity: defaultBytesArrayPoolMaxArrayCapacity, + Options: pool.NewObjectPoolOptions(). + SetSize(defaultBytesArrayPoolSize). + SetRefillLowWatermark(0). + SetRefillHighWatermark(0), + }) + arrPool.Init() + return &opts{ + iopts: instrument.NewOptions(), + bytesSliceArrPool: arrPool, + postingsPool: postings.NewPool(nil, roaring.NewPostingsList), + initialCapacity: defaultInitialCapacity, + newUUIDFn: util.NewUUID, + } +} + +func (o *opts) SetInstrumentOptions(v instrument.Options) Options { + opts := *o + opts.iopts = v + return &opts +} + +func (o *opts) InstrumentOptions() instrument.Options { + return o.iopts +} + +func (o *opts) SetBytesSliceArrayPool(value bytes.SliceArrayPool) Options { + opts := *o + opts.bytesSliceArrPool = value + return &opts +} + +func (o *opts) BytesSliceArrayPool() bytes.SliceArrayPool { + return o.bytesSliceArrPool +} + +func (o *opts) SetPostingsListPool(v postings.Pool) Options { + opts := *o + opts.postingsPool = v + return &opts +} + +func (o *opts) PostingsListPool() postings.Pool { + return o.postingsPool +} + +func (o *opts) SetInitialCapacity(v int) Options { + opts := *o + opts.initialCapacity = v + return &opts +} + +func (o *opts) InitialCapacity() int { + return o.initialCapacity +} + +func (o *opts) SetNewUUIDFn(v util.NewUUIDFn) Options { + opts := *o + opts.newUUIDFn = v + return &opts +} + +func (o *opts) NewUUIDFn() util.NewUUIDFn { + return o.newUUIDFn +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/postings_map_gen.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/postings_map_gen.go new file mode 100644 index 00000000..8576e16c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/postings_map_gen.go @@ -0,0 +1,275 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package mem + +import ( + "github.com/m3db/m3/src/m3ninx/postings" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// postingsMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type postingsMapHash uint64 + +// postingsMapHashFn is the hash function to execute when hashing a key. +type postingsMapHashFn func([]byte) postingsMapHash + +// postingsMapEqualsFn is the equals key function to execute when detecting equality of a key. +type postingsMapEqualsFn func([]byte, []byte) bool + +// postingsMapCopyFn is the copy key function to execute when copying the key. +type postingsMapCopyFn func([]byte) []byte + +// postingsMapFinalizeFn is the finalize key function to execute when finished with a key. +type postingsMapFinalizeFn func([]byte) + +// postingsMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// postingsMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type postingsMap struct { + _postingsMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[postingsMapHash]postingsMapEntry +} + +// _postingsMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _postingsMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash postingsMapHashFn + // equals is the equals key function to execute when detecting equality. + equals postingsMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy postingsMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize postingsMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// postingsMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type postingsMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _postingsMapKey + // value type stored + value postings.MutableList +} + +type _postingsMapKey struct { + key []byte + finalize bool +} + +// Key returns the map entry key. +func (e postingsMapEntry) Key() []byte { + return e.key.key +} + +// Value returns the map entry value. +func (e postingsMapEntry) Value() postings.MutableList { + return e.value +} + +// _postingsMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _postingsMapAlloc(opts _postingsMapOptions) *postingsMap { + m := &postingsMap{_postingsMapOptions: opts} + m.Reallocate() + return m +} + +func (m *postingsMap) newMapKey(k []byte, opts _postingsMapKeyOptions) _postingsMapKey { + key := _postingsMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *postingsMap) removeMapKey(hash postingsMapHash, key _postingsMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *postingsMap) Get(k []byte) (postings.MutableList, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty postings.MutableList + return empty, false +} + +// Set will set the value for an identifier. +func (m *postingsMap) Set(k []byte, v postings.MutableList) { + m.set(k, v, _postingsMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// postingsMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type postingsMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *postingsMap) SetUnsafe(k []byte, v postings.MutableList, opts postingsMapSetUnsafeOptions) { + m.set(k, v, _postingsMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _postingsMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *postingsMap) set(k []byte, v postings.MutableList, opts _postingsMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = postingsMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = postingsMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *postingsMap) Iter() map[postingsMapHash]postingsMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *postingsMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *postingsMap) Contains(k []byte) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *postingsMap) Delete(k []byte) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *postingsMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *postingsMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[postingsMapHash]postingsMapEntry, m.initialSize) + } else { + m.lookup = make(map[postingsMapHash]postingsMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/postings_map_new.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/postings_map_new.go new file mode 100644 index 00000000..531e78c8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/postings_map_new.go @@ -0,0 +1,52 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "bytes" + + "github.com/cespare/xxhash/v2" +) + +// newPostingsMap returns a new []bytes->postings.MutableList map. +func newPostingsMap(initialSize int) *postingsMap { + return _postingsMapAlloc(_postingsMapOptions{ + hash: func(k []byte) postingsMapHash { + return postingsMapHash(xxhash.Sum64(k)) + }, + equals: bytes.Equal, + copy: undefinedPostingsMapCopyFn, + finalize: undefinedFinalizeFn, + initialSize: initialSize, + }) +} + +var undefinedPostingsMapCopyFn postingsMapCopyFn = func([]byte) []byte { + // NB: intentionally not defined to force users of the map to not + // allocate extra copies. + panic("not implemented") +} + +var undefinedFinalizeFn postingsMapFinalizeFn = func([]byte) { + // NB: intentionally not defined to force users of the map to not + // allocate extra copies. + panic("not implemented") +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/reader.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/reader.go new file mode 100644 index 00000000..385bc24e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/reader.go @@ -0,0 +1,175 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "errors" + "sync" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" +) + +var ( + errSegmentReaderClosed = errors.New("segment reader is closed") + errReaderNilRegex = errors.New("nil regex received") +) + +type reader struct { + sync.RWMutex + + segment ReadableSegment + limits readerDocRange + plPool postings.Pool + + closed bool +} + +type readerDocRange struct { + startInclusive postings.ID + endExclusive postings.ID +} + +func newReader(s ReadableSegment, l readerDocRange, p postings.Pool) sgmt.Reader { + return &reader{ + segment: s, + limits: l, + plPool: p, + } +} + +func (r *reader) Fields() (sgmt.FieldsIterator, error) { + return r.segment.Fields() +} + +func (r *reader) ContainsField(field []byte) (bool, error) { + return r.segment.ContainsField(field) +} + +func (r *reader) Terms(field []byte) (sgmt.TermsIterator, error) { + return r.segment.Terms(field) +} + +func (r *reader) MatchField(field []byte) (postings.List, error) { + // falling back to regexp .* as this segment implementation is only used in tests. + return r.MatchRegexp(field, index.DotStarCompiledRegex()) +} + +func (r *reader) MatchTerm(field, term []byte) (postings.List, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errSegmentReaderClosed + } + + // A reader can return IDs in the posting list which are greater than its limit. + // The reader only guarantees that when fetching the documents associated with a + // postings list through a call to Docs, IDs greater than or equal to the limit + // will be filtered out. + pl, err := r.segment.matchTerm(field, term) + return pl, err +} + +func (r *reader) MatchRegexp(field []byte, compiled index.CompiledRegex) (postings.List, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errSegmentReaderClosed + } + + // A reader can return IDs in the posting list which are greater than its maximum + // permitted ID. The reader only guarantees that when fetching the documents associated + // with a postings list through a call to Docs will IDs greater than the maximum be + // filtered out. + compileRE := compiled.Simple + if compileRE == nil { + return nil, errReaderNilRegex + } + + return r.segment.matchRegexp(field, compileRE) +} + +func (r *reader) MatchAll() (postings.MutableList, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errSegmentReaderClosed + } + + pl := r.plPool.Get() + err := pl.AddRange(r.limits.startInclusive, r.limits.endExclusive) + if err != nil { + return nil, err + } + return pl, nil +} + +func (r *reader) Doc(id postings.ID) (doc.Document, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return doc.Document{}, errSegmentReaderClosed + } + + if id < r.limits.startInclusive || id >= r.limits.endExclusive { + return doc.Document{}, index.ErrDocNotFound + } + + return r.segment.getDoc(id) +} + +func (r *reader) Docs(pl postings.List) (doc.Iterator, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errSegmentReaderClosed + } + boundedIter := newBoundedPostingsIterator(pl.Iterator(), r.limits) + return r.getDocIterWithLock(boundedIter), nil +} + +func (r *reader) AllDocs() (index.IDDocIterator, error) { + r.RLock() + defer r.RUnlock() + if r.closed { + return nil, errSegmentReaderClosed + } + + pi := postings.NewRangeIterator(r.limits.startInclusive, r.limits.endExclusive) + return r.getDocIterWithLock(pi), nil +} + +func (r *reader) getDocIterWithLock(iter postings.Iterator) index.IDDocIterator { + return index.NewIDDocIterator(r, iter) +} + +func (r *reader) Close() error { + r.Lock() + if r.closed { + r.Unlock() + return errSegmentReaderClosed + } + r.closed = true + r.Unlock() + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/segment.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/segment.go new file mode 100644 index 00000000..9a45d1b2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/segment.go @@ -0,0 +1,501 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "errors" + re "regexp" + "sync" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/util" +) + +var ( + errSegmentSealed = errors.New("unable to seal, segment has already been sealed") + errSegmentIsUnsealed = errors.New("un-supported operation on an un-sealed mutable segment") +) + +// nolint: maligned +type memSegment struct { + offset int + plPool postings.Pool + newUUIDFn util.NewUUIDFn + + state struct { + sync.RWMutex + closed bool + sealed bool + } + + // Mapping of postings ID to document. + docs struct { + sync.RWMutex + data []doc.Document + } + + // Mapping of term to postings list. + termsDict termsDictionary + + writer struct { + sync.Mutex + idSet *idsMap + nextID postings.ID + } + readerID postings.AtomicID +} + +// NewSegment returns a new in-memory mutable segment. It will start assigning +// postings IDs at the provided offset. +func NewSegment(opts Options) (segment.MutableSegment, error) { + s := &memSegment{ + plPool: opts.PostingsListPool(), + newUUIDFn: opts.NewUUIDFn(), + termsDict: newTermsDict(opts), + readerID: postings.NewAtomicID(0), + } + + s.docs.data = make([]doc.Document, opts.InitialCapacity()) + + s.writer.idSet = newIDsMap(256) + s.writer.nextID = 0 + return s, nil +} + +func (s *memSegment) SetIndexConcurrency(value int) { + // No-op, does not support concurrent indexing. +} + +func (s *memSegment) IndexConcurrency() int { + return 1 +} + +func (s *memSegment) Reset() { + s.state.Lock() + defer s.state.Unlock() + + s.state.sealed = false + + s.termsDict.Reset() + s.readerID = postings.NewAtomicID(0) + + var empty doc.Document + for i := range s.docs.data { + s.docs.data[i] = empty + } + s.docs.data = s.docs.data[:0] + + s.writer.idSet.Reset() + s.writer.nextID = 0 +} + +func (s *memSegment) Size() int64 { + s.state.RLock() + closed := s.state.closed + size := int64(s.readerID.Load()) + s.state.RUnlock() + if closed { + return 0 + } + return size +} + +func (s *memSegment) Docs() []doc.Document { + s.state.RLock() + defer s.state.RUnlock() + + s.docs.RLock() + defer s.docs.RUnlock() + + return s.docs.data[:s.readerID.Load()] +} + +func (s *memSegment) ContainsID(id []byte) (bool, error) { + s.state.RLock() + if s.state.closed { + s.state.RUnlock() + return false, segment.ErrClosed + } + + contains := s.containsIDWithStateLock(id) + s.state.RUnlock() + return contains, nil +} + +func (s *memSegment) containsIDWithStateLock(id []byte) bool { + return s.termsDict.ContainsTerm(doc.IDReservedFieldName, id) +} + +func (s *memSegment) ContainsField(f []byte) (bool, error) { + s.state.RLock() + if s.state.closed { + s.state.RUnlock() + return false, segment.ErrClosed + } + + contains := s.termsDict.ContainsField(f) + s.state.RUnlock() + return contains, nil +} + +func (s *memSegment) Insert(d doc.Document) ([]byte, error) { + s.state.RLock() + defer s.state.RUnlock() + if s.state.closed { + return nil, segment.ErrClosed + } + + { + s.writer.Lock() + defer s.writer.Unlock() + + b := index.NewBatch([]doc.Document{d}) + b.AllowPartialUpdates = false + if err := s.prepareDocsWithLocks(b, nil); err != nil { + return nil, err + } + + // Update the document in case we generated a UUID for it. + d = b.Docs[0] + + if err := s.insertDocWithLocks(d); err != nil { + return nil, err + } + s.readerID.Inc() + } + + return d.ID, nil +} + +func (s *memSegment) InsertBatch(b index.Batch) error { + s.state.RLock() + defer s.state.RUnlock() + if s.state.closed { + return segment.ErrClosed + } + + batchErr := index.NewBatchPartialError() + { + s.writer.Lock() + defer s.writer.Unlock() + + if err := s.prepareDocsWithLocks(b, batchErr); err != nil { + return err + } + + numInserts := uint32(0) + for i, d := range b.Docs { + // NB(prateek): we override a document to have no ID when + // it doesn't need to be inserted. + if !d.HasID() { + continue + } + if err := s.insertDocWithLocks(d); err != nil { + if !b.AllowPartialUpdates { + return err + } + batchErr.Add(index.BatchError{Err: err, Idx: i}) + continue + } + numInserts++ + } + s.readerID.Add(numInserts) + } + + if !batchErr.IsEmpty() { + return batchErr + } + return nil +} + +// prepareDocsWithLocks ensures the given documents can be inserted into the index. It +// must be called with the state and writer locks. +func (s *memSegment) prepareDocsWithLocks( + b index.Batch, + batchErr *index.BatchPartialError, +) error { + s.writer.idSet.Reset() + + var emptyDoc doc.Document + for i := 0; i < len(b.Docs); i++ { + d := b.Docs[i] + if err := d.Validate(); err != nil { + if !b.AllowPartialUpdates { + return err + } + batchErr.Add(index.BatchError{Err: err, Idx: i}) + b.Docs[i] = emptyDoc + continue + } + + if d.HasID() { + if s.containsIDWithStateLock(d.ID) { + // The segment already contains this document so we can remove it from those + // we need to index. + b.Docs[i] = emptyDoc + continue + } + + if _, ok := s.writer.idSet.Get(d.ID); ok { + if !b.AllowPartialUpdates { + return index.ErrDuplicateID + } + batchErr.Add(index.BatchError{Err: index.ErrDuplicateID, Idx: i}) + b.Docs[i] = emptyDoc + continue + } + } else { + id, err := s.newUUIDFn() + if err != nil { + if !b.AllowPartialUpdates { + return err + } + batchErr.Add(index.BatchError{Err: err, Idx: i}) + b.Docs[i] = emptyDoc + continue + } + + d.ID = id + + // Update the document in the batch since we added an ID to it. + b.Docs[i] = d + } + + s.writer.idSet.SetUnsafe(d.ID, struct{}{}, idsMapSetUnsafeOptions{ + NoCopyKey: true, + NoFinalizeKey: true, + }) + } + + return nil +} + +// insertDocWithLocks inserts a document into the index. It must be called with the +// state and writer locks. +func (s *memSegment) insertDocWithLocks(d doc.Document) error { + nextID := s.writer.nextID + s.storeDocWithStateLock(nextID, d) + s.writer.nextID++ + return s.indexDocWithStateLock(nextID, d) +} + +// indexDocWithStateLock indexes the fields of a document in the segment's terms +// dictionary. It must be called with the segment's state lock. +func (s *memSegment) indexDocWithStateLock(id postings.ID, d doc.Document) error { + for _, f := range d.Fields { + if err := s.termsDict.Insert(f, id); err != nil { + return err + } + } + return s.termsDict.Insert(doc.Field{ + Name: doc.IDReservedFieldName, + Value: d.ID, + }, id) +} + +// storeDocWithStateLock stores a documents into the segment's mapping of postings +// IDs to documents. It must be called with the segment's state lock. +func (s *memSegment) storeDocWithStateLock(id postings.ID, d doc.Document) { + idx := int(id) + + // Can return early if we have sufficient capacity. + { + s.docs.RLock() + size := len(s.docs.data) + if size > idx { + // NB(prateek): We only need a Read-lock here despite an insert operation because + // we're guaranteed to never have conflicts with docID (it's monotonically increasing), + // and have checked `i.docs.data` is large enough. + s.docs.data[idx] = d + s.docs.RUnlock() + return + } + s.docs.RUnlock() + } + + // Otherwise we need to expand capacity. + { + s.docs.Lock() + size := len(s.docs.data) + + // The slice has already been expanded since we released the lock. + if size > idx { + s.docs.data[idx] = d + s.docs.Unlock() + return + } + + data := make([]doc.Document, 2*(size+1)) + copy(data, s.docs.data) + s.docs.data = data + s.docs.data[idx] = d + s.docs.Unlock() + } +} + +func (s *memSegment) Reader() (segment.Reader, error) { + s.state.RLock() + defer s.state.RUnlock() + if s.state.closed { + return nil, segment.ErrClosed + } + + limits := readerDocRange{ + startInclusive: postings.ID(0), + endExclusive: s.readerID.Load(), + } + return newReader(s, limits, s.plPool), nil +} + +func (s *memSegment) AllDocs() (index.IDDocIterator, error) { + r, err := s.Reader() + if err != nil { + return nil, err + } + return r.AllDocs() +} + +func (s *memSegment) matchTerm(field, term []byte) (postings.List, error) { + s.state.RLock() + defer s.state.RUnlock() + if s.state.closed { + return nil, segment.ErrClosed + } + + return s.termsDict.MatchTerm(field, term), nil +} + +func (s *memSegment) matchRegexp(field []byte, compiled *re.Regexp) (postings.List, error) { + s.state.RLock() + defer s.state.RUnlock() + if s.state.closed { + return nil, segment.ErrClosed + } + + return s.termsDict.MatchRegexp(field, compiled), nil +} + +func (s *memSegment) getDoc(id postings.ID) (doc.Document, error) { + s.state.RLock() + defer s.state.RUnlock() + if s.state.closed { + return doc.Document{}, segment.ErrClosed + } + + idx := int(id) + + s.docs.RLock() + if idx >= len(s.docs.data) { + s.docs.RUnlock() + return doc.Document{}, index.ErrDocNotFound + } + d := s.docs.data[idx] + s.docs.RUnlock() + + return d, nil +} + +func (s *memSegment) Close() error { + s.state.Lock() + defer s.state.Unlock() + if s.state.closed { + return segment.ErrClosed + } + + s.state.closed = true + return nil +} + +func (s *memSegment) IsSealed() bool { + s.state.Lock() + defer s.state.Unlock() + if s.state.closed { + return false + } + return s.state.sealed +} + +func (s *memSegment) Seal() error { + s.state.Lock() + defer s.state.Unlock() + if s.state.closed { + return segment.ErrClosed + } + + if s.state.sealed { + return errSegmentSealed + } + + s.state.sealed = true + return nil +} + +func (s *memSegment) Fields() (segment.FieldsIterator, error) { + s.state.RLock() + defer s.state.RUnlock() + if err := s.checkIsSealedWithRLock(); err != nil { + return nil, err + } + return s.termsDict.Fields(), nil +} + +func (s *memSegment) FieldsPostingsList() (segment.FieldsPostingsListIterator, error) { + s.state.RLock() + defer s.state.RUnlock() + if err := s.checkIsSealedWithRLock(); err != nil { + return nil, err + } + return s.termsDict.FieldsPostingsList(), nil +} + +func (s *memSegment) Terms(name []byte) (segment.TermsIterator, error) { + s.state.RLock() + defer s.state.RUnlock() + if err := s.checkIsSealedWithRLock(); err != nil { + return nil, err + } + return s.termsDict.Terms(name), nil +} + +func (s *memSegment) FieldsIterable() segment.FieldsIterable { + return s +} + +func (s *memSegment) FieldsPostingsListIterable() segment.FieldsPostingsListIterable { + return s +} + +func (s *memSegment) TermsIterable() segment.TermsIterable { + return s +} + +func (s *memSegment) checkIsSealedWithRLock() error { + if s.state.closed { + return segment.ErrClosed + } + if !s.state.sealed { + return errSegmentIsUnsealed + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/terms_dict.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/terms_dict.go new file mode 100644 index 00000000..fc2f7087 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/terms_dict.go @@ -0,0 +1,191 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + re "regexp" + "sync" + + "github.com/m3db/m3/src/m3ninx/doc" + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/postings/roaring" +) + +// termsDict is an in-memory terms dictionary. It maps fields to postings lists. +type termsDict struct { + opts Options + + currFieldsPostingsLists []postings.List + + fields struct { + sync.RWMutex + *fieldsMap + } +} + +func newTermsDict(opts Options) termsDictionary { + dict := &termsDict{ + opts: opts, + } + dict.fields.fieldsMap = newFieldsMap(fieldsMapOptions{ + InitialSize: opts.InitialCapacity(), + }) + return dict +} + +func (d *termsDict) Insert(field doc.Field, id postings.ID) error { + postingsMap := d.getOrAddName(field.Name) + return postingsMap.Add(field.Value, id) +} + +func (d *termsDict) ContainsField(field []byte) bool { + d.fields.RLock() + defer d.fields.RUnlock() + _, ok := d.fields.Get(field) + return ok +} + +func (d *termsDict) ContainsTerm(field, term []byte) bool { + _, found := d.matchTerm(field, term) + return found +} + +func (d *termsDict) MatchTerm(field, term []byte) postings.List { + pl, found := d.matchTerm(field, term) + if !found { + return d.opts.PostingsListPool().Get() + } + return pl +} + +func (d *termsDict) Fields() sgmt.FieldsIterator { + d.fields.RLock() + defer d.fields.RUnlock() + fields := d.opts.BytesSliceArrayPool().Get() + for _, entry := range d.fields.Iter() { + fields = append(fields, entry.Key()) + } + return newBytesSliceIter(fields, d.opts) +} + +func (d *termsDict) FieldsPostingsList() sgmt.FieldsPostingsListIterator { + d.fields.RLock() + defer d.fields.RUnlock() + // NB(bodu): This is probably fine since the terms dict/mem segment is only used in tests. + fields := make([]uniqueField, 0, d.fields.Len()) + for _, entry := range d.fields.Iter() { + d.currFieldsPostingsLists = d.currFieldsPostingsLists[:0] + field := entry.Key() + pl := roaring.NewPostingsList() + if postingsMap, ok := d.fields.Get(field); ok { + for _, entry := range postingsMap.Iter() { + d.currFieldsPostingsLists = append(d.currFieldsPostingsLists, entry.value) + } + } + pl.UnionMany(d.currFieldsPostingsLists) + fields = append(fields, uniqueField{ + field: field, + postingsList: pl, + }) + } + return newUniqueFieldsIter(fields, d.opts) +} + +func (d *termsDict) Terms(field []byte) sgmt.TermsIterator { + d.fields.RLock() + defer d.fields.RUnlock() + values, ok := d.fields.Get(field) + if !ok { + return sgmt.EmptyTermsIterator + } + return values.Keys() +} + +func (d *termsDict) matchTerm(field, term []byte) (postings.List, bool) { + d.fields.RLock() + postingsMap, ok := d.fields.Get(field) + d.fields.RUnlock() + if !ok { + return nil, false + } + pl, ok := postingsMap.Get(term) + if !ok { + return nil, false + } + return pl, true +} + +func (d *termsDict) MatchRegexp( + field []byte, + compiled *re.Regexp, +) postings.List { + d.fields.RLock() + postingsMap, ok := d.fields.Get(field) + d.fields.RUnlock() + if !ok { + return d.opts.PostingsListPool().Get() + } + pl, ok := postingsMap.GetRegex(compiled) + if !ok { + return d.opts.PostingsListPool().Get() + } + return pl +} + +func (d *termsDict) Reset() { + d.fields.Lock() + defer d.fields.Unlock() + + // TODO(r): We actually want to keep the terms maps around so that they + // can be reused and avoid reallocation, so instead of deleting them + // we should just reset each one - however we were seeing some racey + // issues so now just deleting all entries for now + d.fields.Reallocate() +} + +func (d *termsDict) getOrAddName(name []byte) *concurrentPostingsMap { + // Cheap read lock to see if it already exists. + d.fields.RLock() + postingsMap, ok := d.fields.Get(name) + d.fields.RUnlock() + if ok { + return postingsMap + } + + // Acquire write lock and create. + d.fields.Lock() + postingsMap, ok = d.fields.Get(name) + + // Check if it's been created since we last acquired the lock. + if ok { + d.fields.Unlock() + return postingsMap + } + + postingsMap = newConcurrentPostingsMap(d.opts) + d.fields.SetUnsafe(name, postingsMap, fieldsMapSetUnsafeOptions{ + NoCopyKey: true, + NoFinalizeKey: true, + }) + d.fields.Unlock() + return postingsMap +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/terms_iterator.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/terms_iterator.go new file mode 100644 index 00000000..cb4eca8c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/terms_iterator.go @@ -0,0 +1,97 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "fmt" + + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" +) + +type termsLookup interface { + Get(key []byte) (postings.List, bool) +} + +type termsIter struct { + err error + done bool + + currentIdx int + current []byte + currentPostings postings.List + backingSlice [][]byte + backingPostings termsLookup + opts Options +} + +var _ sgmt.TermsIterator = &termsIter{} + +func newTermsIter( + slice [][]byte, + postings termsLookup, + opts Options, +) *termsIter { + sortSliceOfByteSlices(slice) + return &termsIter{ + currentIdx: -1, + backingSlice: slice, + backingPostings: postings, + opts: opts, + } +} + +func (b *termsIter) Next() bool { + if b.done || b.err != nil { + return false + } + b.currentIdx++ + if b.currentIdx >= len(b.backingSlice) { + b.done = true + return false + } + var ok bool + b.current = b.backingSlice[b.currentIdx] + b.currentPostings, ok = b.backingPostings.Get(b.current) + if !ok { + b.err = fmt.Errorf("term not found during iteration: %s", b.current) + return false + } + return true +} + +func (b *termsIter) Current() (term []byte, postings postings.List) { + return b.current, b.currentPostings +} + +func (b *termsIter) Err() error { + return b.err +} + +func (b *termsIter) Len() int { + return len(b.backingSlice) +} + +func (b *termsIter) Close() error { + b.current = nil + b.opts.BytesSliceArrayPool().Put(b.backingSlice) + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/types.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/types.go new file mode 100644 index 00000000..13bbea45 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/types.go @@ -0,0 +1,78 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + re "regexp" + + "github.com/m3db/m3/src/m3ninx/doc" + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" +) + +// termsDictionary is an internal interface for a mutable terms dictionary. +type termsDictionary interface { + // Insert inserts the field with the given ID into the terms dictionary. + Insert(field doc.Field, id postings.ID) error + + // ContainsField returns a bool indicating whether the terms dictionary contains + // the given field. + ContainsField(field []byte) bool + + // ContainsTerm returns a bool indicating whether the terms dictionary contains + // the given term. + ContainsTerm(field, term []byte) bool + + // MatchTerm returns the postings list corresponding to documents which match the + // given field term exactly. + MatchTerm(field, term []byte) postings.List + + // MatchRegexp returns the postings list corresponding to documents which match the + // given egular expression. + MatchRegexp(field []byte, compiled *re.Regexp) postings.List + + // Fields returns the known fields. + Fields() sgmt.FieldsIterator + + // Fields returns the known fields. + FieldsPostingsList() sgmt.FieldsPostingsListIterator + + // Terms returns the known terms values for the given field. + Terms(field []byte) sgmt.TermsIterator + + // Reset resets the terms dictionary for reuse. + Reset() +} + +// ReadableSegment is an internal interface for reading from a segment. +// +// NB(jeromefroe): Currently mockgen requires that interfaces with embedded interfaces be +// generated with reflection mode, but private interfaces can only be generated with file +// mode so we can't mock this interface if its private. Once mockgen supports mocking +// private interfaces which contain embedded interfaces we can make this interface private. +type ReadableSegment interface { + Fields() (sgmt.FieldsIterator, error) + ContainsField(field []byte) (bool, error) + Terms(field []byte) (sgmt.TermsIterator, error) + matchTerm(field, term []byte) (postings.List, error) + matchRegexp(field []byte, compiled *re.Regexp) (postings.List, error) + getDoc(id postings.ID) (doc.Document, error) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/unique_fields_iterator.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/unique_fields_iterator.go new file mode 100644 index 00000000..c26cac69 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/mem/unique_fields_iterator.go @@ -0,0 +1,91 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mem + +import ( + "bytes" + "sort" + + sgmt "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/postings" +) + +type uniqueField struct { + field []byte + postingsList postings.List +} + +type uniqueFieldsIter struct { + err error + done bool + + currentIdx int + current uniqueField + backingSlice []uniqueField + opts Options +} + +var _ sgmt.FieldsPostingsListIterator = &uniqueFieldsIter{} + +func newUniqueFieldsIter(slice []uniqueField, opts Options) *uniqueFieldsIter { + sortSliceOfUniqueFields(slice) + return &uniqueFieldsIter{ + currentIdx: -1, + backingSlice: slice, + opts: opts, + } +} + +func (b *uniqueFieldsIter) Next() bool { + if b.done || b.err != nil { + return false + } + b.currentIdx++ + if b.currentIdx >= len(b.backingSlice) { + b.done = true + return false + } + b.current = b.backingSlice[b.currentIdx] + return true +} + +func (b *uniqueFieldsIter) Current() ([]byte, postings.List) { + return b.current.field, b.current.postingsList +} + +func (b *uniqueFieldsIter) Err() error { + return nil +} + +func (b *uniqueFieldsIter) Len() int { + return len(b.backingSlice) +} + +func (b *uniqueFieldsIter) Close() error { + b.current = uniqueField{} + return nil +} + +func sortSliceOfUniqueFields(b []uniqueField) { + sort.Slice(b, func(i, j int) bool { + return bytes.Compare(b[i].field, b[j].field) < 0 + }) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/segment_mock.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/segment_mock.go new file mode 100644 index 00000000..4721f195 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/segment_mock.go @@ -0,0 +1,1788 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/m3ninx/index/segment/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package segment is a generated GoMock package. +package segment + +import ( + "reflect" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" + + "github.com/golang/mock/gomock" +) + +// MockSegment is a mock of Segment interface +type MockSegment struct { + ctrl *gomock.Controller + recorder *MockSegmentMockRecorder +} + +// MockSegmentMockRecorder is the mock recorder for MockSegment +type MockSegmentMockRecorder struct { + mock *MockSegment +} + +// NewMockSegment creates a new mock instance +func NewMockSegment(ctrl *gomock.Controller) *MockSegment { + mock := &MockSegment{ctrl: ctrl} + mock.recorder = &MockSegmentMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSegment) EXPECT() *MockSegmentMockRecorder { + return m.recorder +} + +// FieldsIterable mocks base method +func (m *MockSegment) FieldsIterable() FieldsIterable { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldsIterable") + ret0, _ := ret[0].(FieldsIterable) + return ret0 +} + +// FieldsIterable indicates an expected call of FieldsIterable +func (mr *MockSegmentMockRecorder) FieldsIterable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldsIterable", reflect.TypeOf((*MockSegment)(nil).FieldsIterable)) +} + +// TermsIterable mocks base method +func (m *MockSegment) TermsIterable() TermsIterable { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TermsIterable") + ret0, _ := ret[0].(TermsIterable) + return ret0 +} + +// TermsIterable indicates an expected call of TermsIterable +func (mr *MockSegmentMockRecorder) TermsIterable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TermsIterable", reflect.TypeOf((*MockSegment)(nil).TermsIterable)) +} + +// Size mocks base method +func (m *MockSegment) Size() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Size") + ret0, _ := ret[0].(int64) + return ret0 +} + +// Size indicates an expected call of Size +func (mr *MockSegmentMockRecorder) Size() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Size", reflect.TypeOf((*MockSegment)(nil).Size)) +} + +// ContainsID mocks base method +func (m *MockSegment) ContainsID(docID []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContainsID", docID) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ContainsID indicates an expected call of ContainsID +func (mr *MockSegmentMockRecorder) ContainsID(docID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContainsID", reflect.TypeOf((*MockSegment)(nil).ContainsID), docID) +} + +// ContainsField mocks base method +func (m *MockSegment) ContainsField(field []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContainsField", field) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ContainsField indicates an expected call of ContainsField +func (mr *MockSegmentMockRecorder) ContainsField(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContainsField", reflect.TypeOf((*MockSegment)(nil).ContainsField), field) +} + +// Reader mocks base method +func (m *MockSegment) Reader() (Reader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reader") + ret0, _ := ret[0].(Reader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Reader indicates an expected call of Reader +func (mr *MockSegmentMockRecorder) Reader() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reader", reflect.TypeOf((*MockSegment)(nil).Reader)) +} + +// Close mocks base method +func (m *MockSegment) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockSegmentMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSegment)(nil).Close)) +} + +// MockReader is a mock of Reader interface +type MockReader struct { + ctrl *gomock.Controller + recorder *MockReaderMockRecorder +} + +// MockReaderMockRecorder is the mock recorder for MockReader +type MockReaderMockRecorder struct { + mock *MockReader +} + +// NewMockReader creates a new mock instance +func NewMockReader(ctrl *gomock.Controller) *MockReader { + mock := &MockReader{ctrl: ctrl} + mock.recorder = &MockReaderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockReader) EXPECT() *MockReaderMockRecorder { + return m.recorder +} + +// Doc mocks base method +func (m *MockReader) Doc(id postings.ID) (doc.Document, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Doc", id) + ret0, _ := ret[0].(doc.Document) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Doc indicates an expected call of Doc +func (mr *MockReaderMockRecorder) Doc(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Doc", reflect.TypeOf((*MockReader)(nil).Doc), id) +} + +// MatchField mocks base method +func (m *MockReader) MatchField(field []byte) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchField", field) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchField indicates an expected call of MatchField +func (mr *MockReaderMockRecorder) MatchField(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchField", reflect.TypeOf((*MockReader)(nil).MatchField), field) +} + +// MatchTerm mocks base method +func (m *MockReader) MatchTerm(field, term []byte) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchTerm", field, term) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchTerm indicates an expected call of MatchTerm +func (mr *MockReaderMockRecorder) MatchTerm(field, term interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchTerm", reflect.TypeOf((*MockReader)(nil).MatchTerm), field, term) +} + +// MatchRegexp mocks base method +func (m *MockReader) MatchRegexp(field []byte, c index.CompiledRegex) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchRegexp", field, c) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchRegexp indicates an expected call of MatchRegexp +func (mr *MockReaderMockRecorder) MatchRegexp(field, c interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchRegexp", reflect.TypeOf((*MockReader)(nil).MatchRegexp), field, c) +} + +// MatchAll mocks base method +func (m *MockReader) MatchAll() (postings.MutableList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MatchAll") + ret0, _ := ret[0].(postings.MutableList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MatchAll indicates an expected call of MatchAll +func (mr *MockReaderMockRecorder) MatchAll() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MatchAll", reflect.TypeOf((*MockReader)(nil).MatchAll)) +} + +// Docs mocks base method +func (m *MockReader) Docs(pl postings.List) (doc.Iterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Docs", pl) + ret0, _ := ret[0].(doc.Iterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Docs indicates an expected call of Docs +func (mr *MockReaderMockRecorder) Docs(pl interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Docs", reflect.TypeOf((*MockReader)(nil).Docs), pl) +} + +// AllDocs mocks base method +func (m *MockReader) AllDocs() (index.IDDocIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllDocs") + ret0, _ := ret[0].(index.IDDocIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllDocs indicates an expected call of AllDocs +func (mr *MockReaderMockRecorder) AllDocs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllDocs", reflect.TypeOf((*MockReader)(nil).AllDocs)) +} + +// Close mocks base method +func (m *MockReader) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockReaderMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockReader)(nil).Close)) +} + +// Fields mocks base method +func (m *MockReader) Fields() (FieldsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fields") + ret0, _ := ret[0].(FieldsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fields indicates an expected call of Fields +func (mr *MockReaderMockRecorder) Fields() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fields", reflect.TypeOf((*MockReader)(nil).Fields)) +} + +// Terms mocks base method +func (m *MockReader) Terms(field []byte) (TermsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Terms", field) + ret0, _ := ret[0].(TermsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Terms indicates an expected call of Terms +func (mr *MockReaderMockRecorder) Terms(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Terms", reflect.TypeOf((*MockReader)(nil).Terms), field) +} + +// ContainsField mocks base method +func (m *MockReader) ContainsField(field []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContainsField", field) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ContainsField indicates an expected call of ContainsField +func (mr *MockReaderMockRecorder) ContainsField(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContainsField", reflect.TypeOf((*MockReader)(nil).ContainsField), field) +} + +// MockFieldsIterable is a mock of FieldsIterable interface +type MockFieldsIterable struct { + ctrl *gomock.Controller + recorder *MockFieldsIterableMockRecorder +} + +// MockFieldsIterableMockRecorder is the mock recorder for MockFieldsIterable +type MockFieldsIterableMockRecorder struct { + mock *MockFieldsIterable +} + +// NewMockFieldsIterable creates a new mock instance +func NewMockFieldsIterable(ctrl *gomock.Controller) *MockFieldsIterable { + mock := &MockFieldsIterable{ctrl: ctrl} + mock.recorder = &MockFieldsIterableMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFieldsIterable) EXPECT() *MockFieldsIterableMockRecorder { + return m.recorder +} + +// Fields mocks base method +func (m *MockFieldsIterable) Fields() (FieldsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fields") + ret0, _ := ret[0].(FieldsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fields indicates an expected call of Fields +func (mr *MockFieldsIterableMockRecorder) Fields() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fields", reflect.TypeOf((*MockFieldsIterable)(nil).Fields)) +} + +// MockFieldsPostingsListIterable is a mock of FieldsPostingsListIterable interface +type MockFieldsPostingsListIterable struct { + ctrl *gomock.Controller + recorder *MockFieldsPostingsListIterableMockRecorder +} + +// MockFieldsPostingsListIterableMockRecorder is the mock recorder for MockFieldsPostingsListIterable +type MockFieldsPostingsListIterableMockRecorder struct { + mock *MockFieldsPostingsListIterable +} + +// NewMockFieldsPostingsListIterable creates a new mock instance +func NewMockFieldsPostingsListIterable(ctrl *gomock.Controller) *MockFieldsPostingsListIterable { + mock := &MockFieldsPostingsListIterable{ctrl: ctrl} + mock.recorder = &MockFieldsPostingsListIterableMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFieldsPostingsListIterable) EXPECT() *MockFieldsPostingsListIterableMockRecorder { + return m.recorder +} + +// FieldsPostingsList mocks base method +func (m *MockFieldsPostingsListIterable) FieldsPostingsList() (FieldsPostingsListIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldsPostingsList") + ret0, _ := ret[0].(FieldsPostingsListIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FieldsPostingsList indicates an expected call of FieldsPostingsList +func (mr *MockFieldsPostingsListIterableMockRecorder) FieldsPostingsList() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldsPostingsList", reflect.TypeOf((*MockFieldsPostingsListIterable)(nil).FieldsPostingsList)) +} + +// MockTermsIterable is a mock of TermsIterable interface +type MockTermsIterable struct { + ctrl *gomock.Controller + recorder *MockTermsIterableMockRecorder +} + +// MockTermsIterableMockRecorder is the mock recorder for MockTermsIterable +type MockTermsIterableMockRecorder struct { + mock *MockTermsIterable +} + +// NewMockTermsIterable creates a new mock instance +func NewMockTermsIterable(ctrl *gomock.Controller) *MockTermsIterable { + mock := &MockTermsIterable{ctrl: ctrl} + mock.recorder = &MockTermsIterableMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTermsIterable) EXPECT() *MockTermsIterableMockRecorder { + return m.recorder +} + +// Terms mocks base method +func (m *MockTermsIterable) Terms(field []byte) (TermsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Terms", field) + ret0, _ := ret[0].(TermsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Terms indicates an expected call of Terms +func (mr *MockTermsIterableMockRecorder) Terms(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Terms", reflect.TypeOf((*MockTermsIterable)(nil).Terms), field) +} + +// MockOrderedBytesIterator is a mock of OrderedBytesIterator interface +type MockOrderedBytesIterator struct { + ctrl *gomock.Controller + recorder *MockOrderedBytesIteratorMockRecorder +} + +// MockOrderedBytesIteratorMockRecorder is the mock recorder for MockOrderedBytesIterator +type MockOrderedBytesIteratorMockRecorder struct { + mock *MockOrderedBytesIterator +} + +// NewMockOrderedBytesIterator creates a new mock instance +func NewMockOrderedBytesIterator(ctrl *gomock.Controller) *MockOrderedBytesIterator { + mock := &MockOrderedBytesIterator{ctrl: ctrl} + mock.recorder = &MockOrderedBytesIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockOrderedBytesIterator) EXPECT() *MockOrderedBytesIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockOrderedBytesIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockOrderedBytesIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockOrderedBytesIterator)(nil).Next)) +} + +// Current mocks base method +func (m *MockOrderedBytesIterator) Current() []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].([]byte) + return ret0 +} + +// Current indicates an expected call of Current +func (mr *MockOrderedBytesIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockOrderedBytesIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockOrderedBytesIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockOrderedBytesIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockOrderedBytesIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockOrderedBytesIterator) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockOrderedBytesIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockOrderedBytesIterator)(nil).Close)) +} + +// MockFieldsPostingsListIterator is a mock of FieldsPostingsListIterator interface +type MockFieldsPostingsListIterator struct { + ctrl *gomock.Controller + recorder *MockFieldsPostingsListIteratorMockRecorder +} + +// MockFieldsPostingsListIteratorMockRecorder is the mock recorder for MockFieldsPostingsListIterator +type MockFieldsPostingsListIteratorMockRecorder struct { + mock *MockFieldsPostingsListIterator +} + +// NewMockFieldsPostingsListIterator creates a new mock instance +func NewMockFieldsPostingsListIterator(ctrl *gomock.Controller) *MockFieldsPostingsListIterator { + mock := &MockFieldsPostingsListIterator{ctrl: ctrl} + mock.recorder = &MockFieldsPostingsListIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFieldsPostingsListIterator) EXPECT() *MockFieldsPostingsListIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockFieldsPostingsListIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockFieldsPostingsListIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockFieldsPostingsListIterator)(nil).Next)) +} + +// Err mocks base method +func (m *MockFieldsPostingsListIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockFieldsPostingsListIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockFieldsPostingsListIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockFieldsPostingsListIterator) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockFieldsPostingsListIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockFieldsPostingsListIterator)(nil).Close)) +} + +// Current mocks base method +func (m *MockFieldsPostingsListIterator) Current() ([]byte, postings.List) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(postings.List) + return ret0, ret1 +} + +// Current indicates an expected call of Current +func (mr *MockFieldsPostingsListIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockFieldsPostingsListIterator)(nil).Current)) +} + +// MockFieldsIterator is a mock of FieldsIterator interface +type MockFieldsIterator struct { + ctrl *gomock.Controller + recorder *MockFieldsIteratorMockRecorder +} + +// MockFieldsIteratorMockRecorder is the mock recorder for MockFieldsIterator +type MockFieldsIteratorMockRecorder struct { + mock *MockFieldsIterator +} + +// NewMockFieldsIterator creates a new mock instance +func NewMockFieldsIterator(ctrl *gomock.Controller) *MockFieldsIterator { + mock := &MockFieldsIterator{ctrl: ctrl} + mock.recorder = &MockFieldsIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFieldsIterator) EXPECT() *MockFieldsIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockFieldsIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockFieldsIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockFieldsIterator)(nil).Next)) +} + +// Err mocks base method +func (m *MockFieldsIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockFieldsIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockFieldsIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockFieldsIterator) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockFieldsIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockFieldsIterator)(nil).Close)) +} + +// Current mocks base method +func (m *MockFieldsIterator) Current() []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].([]byte) + return ret0 +} + +// Current indicates an expected call of Current +func (mr *MockFieldsIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockFieldsIterator)(nil).Current)) +} + +// MockTermsIterator is a mock of TermsIterator interface +type MockTermsIterator struct { + ctrl *gomock.Controller + recorder *MockTermsIteratorMockRecorder +} + +// MockTermsIteratorMockRecorder is the mock recorder for MockTermsIterator +type MockTermsIteratorMockRecorder struct { + mock *MockTermsIterator +} + +// NewMockTermsIterator creates a new mock instance +func NewMockTermsIterator(ctrl *gomock.Controller) *MockTermsIterator { + mock := &MockTermsIterator{ctrl: ctrl} + mock.recorder = &MockTermsIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTermsIterator) EXPECT() *MockTermsIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockTermsIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockTermsIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockTermsIterator)(nil).Next)) +} + +// Err mocks base method +func (m *MockTermsIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockTermsIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockTermsIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockTermsIterator) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockTermsIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockTermsIterator)(nil).Close)) +} + +// Current mocks base method +func (m *MockTermsIterator) Current() ([]byte, postings.List) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(postings.List) + return ret0, ret1 +} + +// Current indicates an expected call of Current +func (mr *MockTermsIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockTermsIterator)(nil).Current)) +} + +// MockIterator is a mock of Iterator interface +type MockIterator struct { + ctrl *gomock.Controller + recorder *MockIteratorMockRecorder +} + +// MockIteratorMockRecorder is the mock recorder for MockIterator +type MockIteratorMockRecorder struct { + mock *MockIterator +} + +// NewMockIterator creates a new mock instance +func NewMockIterator(ctrl *gomock.Controller) *MockIterator { + mock := &MockIterator{ctrl: ctrl} + mock.recorder = &MockIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIterator) EXPECT() *MockIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockIterator)(nil).Next)) +} + +// Err mocks base method +func (m *MockIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockIterator) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockIterator)(nil).Close)) +} + +// MockMutableSegment is a mock of MutableSegment interface +type MockMutableSegment struct { + ctrl *gomock.Controller + recorder *MockMutableSegmentMockRecorder +} + +// MockMutableSegmentMockRecorder is the mock recorder for MockMutableSegment +type MockMutableSegmentMockRecorder struct { + mock *MockMutableSegment +} + +// NewMockMutableSegment creates a new mock instance +func NewMockMutableSegment(ctrl *gomock.Controller) *MockMutableSegment { + mock := &MockMutableSegment{ctrl: ctrl} + mock.recorder = &MockMutableSegmentMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMutableSegment) EXPECT() *MockMutableSegmentMockRecorder { + return m.recorder +} + +// FieldsIterable mocks base method +func (m *MockMutableSegment) FieldsIterable() FieldsIterable { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldsIterable") + ret0, _ := ret[0].(FieldsIterable) + return ret0 +} + +// FieldsIterable indicates an expected call of FieldsIterable +func (mr *MockMutableSegmentMockRecorder) FieldsIterable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldsIterable", reflect.TypeOf((*MockMutableSegment)(nil).FieldsIterable)) +} + +// TermsIterable mocks base method +func (m *MockMutableSegment) TermsIterable() TermsIterable { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TermsIterable") + ret0, _ := ret[0].(TermsIterable) + return ret0 +} + +// TermsIterable indicates an expected call of TermsIterable +func (mr *MockMutableSegmentMockRecorder) TermsIterable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TermsIterable", reflect.TypeOf((*MockMutableSegment)(nil).TermsIterable)) +} + +// Size mocks base method +func (m *MockMutableSegment) Size() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Size") + ret0, _ := ret[0].(int64) + return ret0 +} + +// Size indicates an expected call of Size +func (mr *MockMutableSegmentMockRecorder) Size() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Size", reflect.TypeOf((*MockMutableSegment)(nil).Size)) +} + +// ContainsID mocks base method +func (m *MockMutableSegment) ContainsID(docID []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContainsID", docID) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ContainsID indicates an expected call of ContainsID +func (mr *MockMutableSegmentMockRecorder) ContainsID(docID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContainsID", reflect.TypeOf((*MockMutableSegment)(nil).ContainsID), docID) +} + +// ContainsField mocks base method +func (m *MockMutableSegment) ContainsField(field []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContainsField", field) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ContainsField indicates an expected call of ContainsField +func (mr *MockMutableSegmentMockRecorder) ContainsField(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContainsField", reflect.TypeOf((*MockMutableSegment)(nil).ContainsField), field) +} + +// Reader mocks base method +func (m *MockMutableSegment) Reader() (Reader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reader") + ret0, _ := ret[0].(Reader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Reader indicates an expected call of Reader +func (mr *MockMutableSegmentMockRecorder) Reader() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reader", reflect.TypeOf((*MockMutableSegment)(nil).Reader)) +} + +// Close mocks base method +func (m *MockMutableSegment) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockMutableSegmentMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockMutableSegment)(nil).Close)) +} + +// FieldsPostingsList mocks base method +func (m *MockMutableSegment) FieldsPostingsList() (FieldsPostingsListIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldsPostingsList") + ret0, _ := ret[0].(FieldsPostingsListIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FieldsPostingsList indicates an expected call of FieldsPostingsList +func (mr *MockMutableSegmentMockRecorder) FieldsPostingsList() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldsPostingsList", reflect.TypeOf((*MockMutableSegment)(nil).FieldsPostingsList)) +} + +// Terms mocks base method +func (m *MockMutableSegment) Terms(field []byte) (TermsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Terms", field) + ret0, _ := ret[0].(TermsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Terms indicates an expected call of Terms +func (mr *MockMutableSegmentMockRecorder) Terms(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Terms", reflect.TypeOf((*MockMutableSegment)(nil).Terms), field) +} + +// Reset mocks base method +func (m *MockMutableSegment) Reset() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset") +} + +// Reset indicates an expected call of Reset +func (mr *MockMutableSegmentMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockMutableSegment)(nil).Reset)) +} + +// Docs mocks base method +func (m *MockMutableSegment) Docs() []doc.Document { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Docs") + ret0, _ := ret[0].([]doc.Document) + return ret0 +} + +// Docs indicates an expected call of Docs +func (mr *MockMutableSegmentMockRecorder) Docs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Docs", reflect.TypeOf((*MockMutableSegment)(nil).Docs)) +} + +// AllDocs mocks base method +func (m *MockMutableSegment) AllDocs() (index.IDDocIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllDocs") + ret0, _ := ret[0].(index.IDDocIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllDocs indicates an expected call of AllDocs +func (mr *MockMutableSegmentMockRecorder) AllDocs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllDocs", reflect.TypeOf((*MockMutableSegment)(nil).AllDocs)) +} + +// Insert mocks base method +func (m *MockMutableSegment) Insert(d doc.Document) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Insert", d) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Insert indicates an expected call of Insert +func (mr *MockMutableSegmentMockRecorder) Insert(d interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockMutableSegment)(nil).Insert), d) +} + +// InsertBatch mocks base method +func (m *MockMutableSegment) InsertBatch(b index.Batch) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InsertBatch", b) + ret0, _ := ret[0].(error) + return ret0 +} + +// InsertBatch indicates an expected call of InsertBatch +func (mr *MockMutableSegmentMockRecorder) InsertBatch(b interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertBatch", reflect.TypeOf((*MockMutableSegment)(nil).InsertBatch), b) +} + +// SetIndexConcurrency mocks base method +func (m *MockMutableSegment) SetIndexConcurrency(value int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetIndexConcurrency", value) +} + +// SetIndexConcurrency indicates an expected call of SetIndexConcurrency +func (mr *MockMutableSegmentMockRecorder) SetIndexConcurrency(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIndexConcurrency", reflect.TypeOf((*MockMutableSegment)(nil).SetIndexConcurrency), value) +} + +// IndexConcurrency mocks base method +func (m *MockMutableSegment) IndexConcurrency() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IndexConcurrency") + ret0, _ := ret[0].(int) + return ret0 +} + +// IndexConcurrency indicates an expected call of IndexConcurrency +func (mr *MockMutableSegmentMockRecorder) IndexConcurrency() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IndexConcurrency", reflect.TypeOf((*MockMutableSegment)(nil).IndexConcurrency)) +} + +// Fields mocks base method +func (m *MockMutableSegment) Fields() (FieldsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Fields") + ret0, _ := ret[0].(FieldsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Fields indicates an expected call of Fields +func (mr *MockMutableSegmentMockRecorder) Fields() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fields", reflect.TypeOf((*MockMutableSegment)(nil).Fields)) +} + +// Seal mocks base method +func (m *MockMutableSegment) Seal() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Seal") + ret0, _ := ret[0].(error) + return ret0 +} + +// Seal indicates an expected call of Seal +func (mr *MockMutableSegmentMockRecorder) Seal() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Seal", reflect.TypeOf((*MockMutableSegment)(nil).Seal)) +} + +// IsSealed mocks base method +func (m *MockMutableSegment) IsSealed() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsSealed") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsSealed indicates an expected call of IsSealed +func (mr *MockMutableSegmentMockRecorder) IsSealed() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSealed", reflect.TypeOf((*MockMutableSegment)(nil).IsSealed)) +} + +// MockImmutableSegment is a mock of ImmutableSegment interface +type MockImmutableSegment struct { + ctrl *gomock.Controller + recorder *MockImmutableSegmentMockRecorder +} + +// MockImmutableSegmentMockRecorder is the mock recorder for MockImmutableSegment +type MockImmutableSegmentMockRecorder struct { + mock *MockImmutableSegment +} + +// NewMockImmutableSegment creates a new mock instance +func NewMockImmutableSegment(ctrl *gomock.Controller) *MockImmutableSegment { + mock := &MockImmutableSegment{ctrl: ctrl} + mock.recorder = &MockImmutableSegmentMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockImmutableSegment) EXPECT() *MockImmutableSegmentMockRecorder { + return m.recorder +} + +// FieldsIterable mocks base method +func (m *MockImmutableSegment) FieldsIterable() FieldsIterable { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldsIterable") + ret0, _ := ret[0].(FieldsIterable) + return ret0 +} + +// FieldsIterable indicates an expected call of FieldsIterable +func (mr *MockImmutableSegmentMockRecorder) FieldsIterable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldsIterable", reflect.TypeOf((*MockImmutableSegment)(nil).FieldsIterable)) +} + +// TermsIterable mocks base method +func (m *MockImmutableSegment) TermsIterable() TermsIterable { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TermsIterable") + ret0, _ := ret[0].(TermsIterable) + return ret0 +} + +// TermsIterable indicates an expected call of TermsIterable +func (mr *MockImmutableSegmentMockRecorder) TermsIterable() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TermsIterable", reflect.TypeOf((*MockImmutableSegment)(nil).TermsIterable)) +} + +// Size mocks base method +func (m *MockImmutableSegment) Size() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Size") + ret0, _ := ret[0].(int64) + return ret0 +} + +// Size indicates an expected call of Size +func (mr *MockImmutableSegmentMockRecorder) Size() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Size", reflect.TypeOf((*MockImmutableSegment)(nil).Size)) +} + +// ContainsID mocks base method +func (m *MockImmutableSegment) ContainsID(docID []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContainsID", docID) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ContainsID indicates an expected call of ContainsID +func (mr *MockImmutableSegmentMockRecorder) ContainsID(docID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContainsID", reflect.TypeOf((*MockImmutableSegment)(nil).ContainsID), docID) +} + +// ContainsField mocks base method +func (m *MockImmutableSegment) ContainsField(field []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ContainsField", field) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ContainsField indicates an expected call of ContainsField +func (mr *MockImmutableSegmentMockRecorder) ContainsField(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ContainsField", reflect.TypeOf((*MockImmutableSegment)(nil).ContainsField), field) +} + +// Reader mocks base method +func (m *MockImmutableSegment) Reader() (Reader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reader") + ret0, _ := ret[0].(Reader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Reader indicates an expected call of Reader +func (mr *MockImmutableSegmentMockRecorder) Reader() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reader", reflect.TypeOf((*MockImmutableSegment)(nil).Reader)) +} + +// Close mocks base method +func (m *MockImmutableSegment) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockImmutableSegmentMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockImmutableSegment)(nil).Close)) +} + +// FreeMmap mocks base method +func (m *MockImmutableSegment) FreeMmap() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FreeMmap") + ret0, _ := ret[0].(error) + return ret0 +} + +// FreeMmap indicates an expected call of FreeMmap +func (mr *MockImmutableSegmentMockRecorder) FreeMmap() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FreeMmap", reflect.TypeOf((*MockImmutableSegment)(nil).FreeMmap)) +} + +// MockBuilder is a mock of Builder interface +type MockBuilder struct { + ctrl *gomock.Controller + recorder *MockBuilderMockRecorder +} + +// MockBuilderMockRecorder is the mock recorder for MockBuilder +type MockBuilderMockRecorder struct { + mock *MockBuilder +} + +// NewMockBuilder creates a new mock instance +func NewMockBuilder(ctrl *gomock.Controller) *MockBuilder { + mock := &MockBuilder{ctrl: ctrl} + mock.recorder = &MockBuilderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockBuilder) EXPECT() *MockBuilderMockRecorder { + return m.recorder +} + +// FieldsPostingsList mocks base method +func (m *MockBuilder) FieldsPostingsList() (FieldsPostingsListIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldsPostingsList") + ret0, _ := ret[0].(FieldsPostingsListIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FieldsPostingsList indicates an expected call of FieldsPostingsList +func (mr *MockBuilderMockRecorder) FieldsPostingsList() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldsPostingsList", reflect.TypeOf((*MockBuilder)(nil).FieldsPostingsList)) +} + +// Terms mocks base method +func (m *MockBuilder) Terms(field []byte) (TermsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Terms", field) + ret0, _ := ret[0].(TermsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Terms indicates an expected call of Terms +func (mr *MockBuilderMockRecorder) Terms(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Terms", reflect.TypeOf((*MockBuilder)(nil).Terms), field) +} + +// Reset mocks base method +func (m *MockBuilder) Reset() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset") +} + +// Reset indicates an expected call of Reset +func (mr *MockBuilderMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockBuilder)(nil).Reset)) +} + +// Docs mocks base method +func (m *MockBuilder) Docs() []doc.Document { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Docs") + ret0, _ := ret[0].([]doc.Document) + return ret0 +} + +// Docs indicates an expected call of Docs +func (mr *MockBuilderMockRecorder) Docs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Docs", reflect.TypeOf((*MockBuilder)(nil).Docs)) +} + +// AllDocs mocks base method +func (m *MockBuilder) AllDocs() (index.IDDocIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllDocs") + ret0, _ := ret[0].(index.IDDocIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllDocs indicates an expected call of AllDocs +func (mr *MockBuilderMockRecorder) AllDocs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllDocs", reflect.TypeOf((*MockBuilder)(nil).AllDocs)) +} + +// MockDocumentsBuilder is a mock of DocumentsBuilder interface +type MockDocumentsBuilder struct { + ctrl *gomock.Controller + recorder *MockDocumentsBuilderMockRecorder +} + +// MockDocumentsBuilderMockRecorder is the mock recorder for MockDocumentsBuilder +type MockDocumentsBuilderMockRecorder struct { + mock *MockDocumentsBuilder +} + +// NewMockDocumentsBuilder creates a new mock instance +func NewMockDocumentsBuilder(ctrl *gomock.Controller) *MockDocumentsBuilder { + mock := &MockDocumentsBuilder{ctrl: ctrl} + mock.recorder = &MockDocumentsBuilderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockDocumentsBuilder) EXPECT() *MockDocumentsBuilderMockRecorder { + return m.recorder +} + +// FieldsPostingsList mocks base method +func (m *MockDocumentsBuilder) FieldsPostingsList() (FieldsPostingsListIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldsPostingsList") + ret0, _ := ret[0].(FieldsPostingsListIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FieldsPostingsList indicates an expected call of FieldsPostingsList +func (mr *MockDocumentsBuilderMockRecorder) FieldsPostingsList() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldsPostingsList", reflect.TypeOf((*MockDocumentsBuilder)(nil).FieldsPostingsList)) +} + +// Terms mocks base method +func (m *MockDocumentsBuilder) Terms(field []byte) (TermsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Terms", field) + ret0, _ := ret[0].(TermsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Terms indicates an expected call of Terms +func (mr *MockDocumentsBuilderMockRecorder) Terms(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Terms", reflect.TypeOf((*MockDocumentsBuilder)(nil).Terms), field) +} + +// Reset mocks base method +func (m *MockDocumentsBuilder) Reset() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset") +} + +// Reset indicates an expected call of Reset +func (mr *MockDocumentsBuilderMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockDocumentsBuilder)(nil).Reset)) +} + +// Docs mocks base method +func (m *MockDocumentsBuilder) Docs() []doc.Document { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Docs") + ret0, _ := ret[0].([]doc.Document) + return ret0 +} + +// Docs indicates an expected call of Docs +func (mr *MockDocumentsBuilderMockRecorder) Docs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Docs", reflect.TypeOf((*MockDocumentsBuilder)(nil).Docs)) +} + +// AllDocs mocks base method +func (m *MockDocumentsBuilder) AllDocs() (index.IDDocIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllDocs") + ret0, _ := ret[0].(index.IDDocIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllDocs indicates an expected call of AllDocs +func (mr *MockDocumentsBuilderMockRecorder) AllDocs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllDocs", reflect.TypeOf((*MockDocumentsBuilder)(nil).AllDocs)) +} + +// Insert mocks base method +func (m *MockDocumentsBuilder) Insert(d doc.Document) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Insert", d) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Insert indicates an expected call of Insert +func (mr *MockDocumentsBuilderMockRecorder) Insert(d interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockDocumentsBuilder)(nil).Insert), d) +} + +// InsertBatch mocks base method +func (m *MockDocumentsBuilder) InsertBatch(b index.Batch) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InsertBatch", b) + ret0, _ := ret[0].(error) + return ret0 +} + +// InsertBatch indicates an expected call of InsertBatch +func (mr *MockDocumentsBuilderMockRecorder) InsertBatch(b interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertBatch", reflect.TypeOf((*MockDocumentsBuilder)(nil).InsertBatch), b) +} + +// SetIndexConcurrency mocks base method +func (m *MockDocumentsBuilder) SetIndexConcurrency(value int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetIndexConcurrency", value) +} + +// SetIndexConcurrency indicates an expected call of SetIndexConcurrency +func (mr *MockDocumentsBuilderMockRecorder) SetIndexConcurrency(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIndexConcurrency", reflect.TypeOf((*MockDocumentsBuilder)(nil).SetIndexConcurrency), value) +} + +// IndexConcurrency mocks base method +func (m *MockDocumentsBuilder) IndexConcurrency() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IndexConcurrency") + ret0, _ := ret[0].(int) + return ret0 +} + +// IndexConcurrency indicates an expected call of IndexConcurrency +func (mr *MockDocumentsBuilderMockRecorder) IndexConcurrency() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IndexConcurrency", reflect.TypeOf((*MockDocumentsBuilder)(nil).IndexConcurrency)) +} + +// MockCloseableDocumentsBuilder is a mock of CloseableDocumentsBuilder interface +type MockCloseableDocumentsBuilder struct { + ctrl *gomock.Controller + recorder *MockCloseableDocumentsBuilderMockRecorder +} + +// MockCloseableDocumentsBuilderMockRecorder is the mock recorder for MockCloseableDocumentsBuilder +type MockCloseableDocumentsBuilderMockRecorder struct { + mock *MockCloseableDocumentsBuilder +} + +// NewMockCloseableDocumentsBuilder creates a new mock instance +func NewMockCloseableDocumentsBuilder(ctrl *gomock.Controller) *MockCloseableDocumentsBuilder { + mock := &MockCloseableDocumentsBuilder{ctrl: ctrl} + mock.recorder = &MockCloseableDocumentsBuilderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockCloseableDocumentsBuilder) EXPECT() *MockCloseableDocumentsBuilderMockRecorder { + return m.recorder +} + +// FieldsPostingsList mocks base method +func (m *MockCloseableDocumentsBuilder) FieldsPostingsList() (FieldsPostingsListIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldsPostingsList") + ret0, _ := ret[0].(FieldsPostingsListIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FieldsPostingsList indicates an expected call of FieldsPostingsList +func (mr *MockCloseableDocumentsBuilderMockRecorder) FieldsPostingsList() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldsPostingsList", reflect.TypeOf((*MockCloseableDocumentsBuilder)(nil).FieldsPostingsList)) +} + +// Terms mocks base method +func (m *MockCloseableDocumentsBuilder) Terms(field []byte) (TermsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Terms", field) + ret0, _ := ret[0].(TermsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Terms indicates an expected call of Terms +func (mr *MockCloseableDocumentsBuilderMockRecorder) Terms(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Terms", reflect.TypeOf((*MockCloseableDocumentsBuilder)(nil).Terms), field) +} + +// Reset mocks base method +func (m *MockCloseableDocumentsBuilder) Reset() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset") +} + +// Reset indicates an expected call of Reset +func (mr *MockCloseableDocumentsBuilderMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockCloseableDocumentsBuilder)(nil).Reset)) +} + +// Docs mocks base method +func (m *MockCloseableDocumentsBuilder) Docs() []doc.Document { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Docs") + ret0, _ := ret[0].([]doc.Document) + return ret0 +} + +// Docs indicates an expected call of Docs +func (mr *MockCloseableDocumentsBuilderMockRecorder) Docs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Docs", reflect.TypeOf((*MockCloseableDocumentsBuilder)(nil).Docs)) +} + +// AllDocs mocks base method +func (m *MockCloseableDocumentsBuilder) AllDocs() (index.IDDocIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllDocs") + ret0, _ := ret[0].(index.IDDocIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllDocs indicates an expected call of AllDocs +func (mr *MockCloseableDocumentsBuilderMockRecorder) AllDocs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllDocs", reflect.TypeOf((*MockCloseableDocumentsBuilder)(nil).AllDocs)) +} + +// Insert mocks base method +func (m *MockCloseableDocumentsBuilder) Insert(d doc.Document) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Insert", d) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Insert indicates an expected call of Insert +func (mr *MockCloseableDocumentsBuilderMockRecorder) Insert(d interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockCloseableDocumentsBuilder)(nil).Insert), d) +} + +// InsertBatch mocks base method +func (m *MockCloseableDocumentsBuilder) InsertBatch(b index.Batch) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InsertBatch", b) + ret0, _ := ret[0].(error) + return ret0 +} + +// InsertBatch indicates an expected call of InsertBatch +func (mr *MockCloseableDocumentsBuilderMockRecorder) InsertBatch(b interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InsertBatch", reflect.TypeOf((*MockCloseableDocumentsBuilder)(nil).InsertBatch), b) +} + +// SetIndexConcurrency mocks base method +func (m *MockCloseableDocumentsBuilder) SetIndexConcurrency(value int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetIndexConcurrency", value) +} + +// SetIndexConcurrency indicates an expected call of SetIndexConcurrency +func (mr *MockCloseableDocumentsBuilderMockRecorder) SetIndexConcurrency(value interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetIndexConcurrency", reflect.TypeOf((*MockCloseableDocumentsBuilder)(nil).SetIndexConcurrency), value) +} + +// IndexConcurrency mocks base method +func (m *MockCloseableDocumentsBuilder) IndexConcurrency() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IndexConcurrency") + ret0, _ := ret[0].(int) + return ret0 +} + +// IndexConcurrency indicates an expected call of IndexConcurrency +func (mr *MockCloseableDocumentsBuilderMockRecorder) IndexConcurrency() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IndexConcurrency", reflect.TypeOf((*MockCloseableDocumentsBuilder)(nil).IndexConcurrency)) +} + +// Close mocks base method +func (m *MockCloseableDocumentsBuilder) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockCloseableDocumentsBuilderMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockCloseableDocumentsBuilder)(nil).Close)) +} + +// MockSegmentsBuilder is a mock of SegmentsBuilder interface +type MockSegmentsBuilder struct { + ctrl *gomock.Controller + recorder *MockSegmentsBuilderMockRecorder +} + +// MockSegmentsBuilderMockRecorder is the mock recorder for MockSegmentsBuilder +type MockSegmentsBuilderMockRecorder struct { + mock *MockSegmentsBuilder +} + +// NewMockSegmentsBuilder creates a new mock instance +func NewMockSegmentsBuilder(ctrl *gomock.Controller) *MockSegmentsBuilder { + mock := &MockSegmentsBuilder{ctrl: ctrl} + mock.recorder = &MockSegmentsBuilderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSegmentsBuilder) EXPECT() *MockSegmentsBuilderMockRecorder { + return m.recorder +} + +// FieldsPostingsList mocks base method +func (m *MockSegmentsBuilder) FieldsPostingsList() (FieldsPostingsListIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FieldsPostingsList") + ret0, _ := ret[0].(FieldsPostingsListIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FieldsPostingsList indicates an expected call of FieldsPostingsList +func (mr *MockSegmentsBuilderMockRecorder) FieldsPostingsList() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FieldsPostingsList", reflect.TypeOf((*MockSegmentsBuilder)(nil).FieldsPostingsList)) +} + +// Terms mocks base method +func (m *MockSegmentsBuilder) Terms(field []byte) (TermsIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Terms", field) + ret0, _ := ret[0].(TermsIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Terms indicates an expected call of Terms +func (mr *MockSegmentsBuilderMockRecorder) Terms(field interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Terms", reflect.TypeOf((*MockSegmentsBuilder)(nil).Terms), field) +} + +// Reset mocks base method +func (m *MockSegmentsBuilder) Reset() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset") +} + +// Reset indicates an expected call of Reset +func (mr *MockSegmentsBuilderMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockSegmentsBuilder)(nil).Reset)) +} + +// Docs mocks base method +func (m *MockSegmentsBuilder) Docs() []doc.Document { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Docs") + ret0, _ := ret[0].([]doc.Document) + return ret0 +} + +// Docs indicates an expected call of Docs +func (mr *MockSegmentsBuilderMockRecorder) Docs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Docs", reflect.TypeOf((*MockSegmentsBuilder)(nil).Docs)) +} + +// AllDocs mocks base method +func (m *MockSegmentsBuilder) AllDocs() (index.IDDocIterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllDocs") + ret0, _ := ret[0].(index.IDDocIterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllDocs indicates an expected call of AllDocs +func (mr *MockSegmentsBuilderMockRecorder) AllDocs() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllDocs", reflect.TypeOf((*MockSegmentsBuilder)(nil).AllDocs)) +} + +// AddSegments mocks base method +func (m *MockSegmentsBuilder) AddSegments(segments []Segment) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddSegments", segments) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddSegments indicates an expected call of AddSegments +func (mr *MockSegmentsBuilderMockRecorder) AddSegments(segments interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddSegments", reflect.TypeOf((*MockSegmentsBuilder)(nil).AddSegments), segments) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/segment/types.go b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/types.go new file mode 100644 index 00000000..566a25bd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/segment/types.go @@ -0,0 +1,224 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package segment + +import ( + "errors" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" +) + +var ( + // ErrClosed is the error returned when attempting to perform operations on a + // segment that has already been closed. + ErrClosed = errors.New("segment has been closed") +) + +// Segment is a sub-collection of documents within an index. +type Segment interface { + // FieldsIterable returns an iterable fields, for which is not + // safe for concurrent use. For concurrent use call FieldsIterable + // multiple times. + FieldsIterable() FieldsIterable + + // TermsIterable returns an iterable terms, for which is not + // safe for concurrent use. For concurrent use call TermsIterable + // multiple times. + TermsIterable() TermsIterable + + // Size returns the number of documents within the Segment. It returns + // 0 if the Segment has been closed. + Size() int64 + + // ContainsID returns a bool indicating if the Segment contains the provided ID. + ContainsID(docID []byte) (bool, error) + + // ContainsField returns a bool indicating if the Segment contains the provided field. + ContainsField(field []byte) (bool, error) + + // Reader returns a point-in-time accessor to search the segment. + Reader() (Reader, error) + + // Close closes the segment and releases any internal resources. + Close() error +} + +// Reader extends index reader interface to allow for reading +// of fields and terms. +type Reader interface { + index.Reader + FieldsIterable + TermsIterable + + // ContainsField returns a bool indicating if the Segment contains the provided field. + ContainsField(field []byte) (bool, error) +} + +// FieldsIterable can iterate over segment fields, it is not by default +// concurrency safe. +type FieldsIterable interface { + // Fields returns an iterator over the list of known fields, in order + // by name, it is not valid for reading after mutating the + // builder by inserting more documents. + Fields() (FieldsIterator, error) +} + +// FieldsPostingsListIterable can iterate over segment fields/postings lists, it is not by default +// concurrency safe. +type FieldsPostingsListIterable interface { + // Fields returns an iterator over the list of known fields, in order + // by name, it is not valid for reading after mutating the + // builder by inserting more documents. + FieldsPostingsList() (FieldsPostingsListIterator, error) +} + +// TermsIterable can iterate over segment terms, it is not by default +// concurrency safe. +type TermsIterable interface { + // Terms returns an iterator over the known terms values for the given + // field, in order by name, it is not valid for reading after mutating the + // builder by inserting more documents. + Terms(field []byte) (TermsIterator, error) +} + +// OrderedBytesIterator iterates over a collection of []bytes in lexicographical order. +type OrderedBytesIterator interface { + // Next returns a bool indicating if there are any more elements. + Next() bool + + // Current returns the current element. + // NB: the element returned is only valid until the subsequent call to Next(). + Current() []byte + + // Err returns any errors encountered during iteration. + Err() error + + // Close releases any resources held by the iterator. + Close() error +} + +// FieldsPostingsListIterator iterates over all known fields. +type FieldsPostingsListIterator interface { + Iterator + + // Current returns the current field and associated postings list. + // NB: the field returned is only valid until the subsequent call to Next(). + Current() ([]byte, postings.List) +} + +// FieldsIterator iterates over all known fields. +type FieldsIterator interface { + Iterator + + // Current returns the current field. + // NB: the field returned is only valid until the subsequent call to Next(). + Current() []byte +} + +// TermsIterator iterates over all known terms for the provided field. +type TermsIterator interface { + Iterator + + // Current returns the current element. + // NB: the element returned is only valid until the subsequent call to Next(). + Current() (term []byte, postings postings.List) +} + +// Iterator holds common iterator methods. +type Iterator interface { + // Next returns a bool indicating if there are any more elements. + Next() bool + + // Err returns any errors encountered during iteration. + Err() error + + // Close releases any resources held by the iterator. + Close() error +} + +// MutableSegment is a segment which can be updated. +type MutableSegment interface { + Segment + DocumentsBuilder + + // Fields returns an iterator over the list of known fields, in order + // by name, it is not valid for reading after mutating the + // builder by inserting more documents. + Fields() (FieldsIterator, error) + + // Seal marks the Mutable Segment immutable. + Seal() error + + // IsSealed returns true iff the segment is open and un-sealed. + IsSealed() bool +} + +// ImmutableSegment is segment that has been written to disk. +type ImmutableSegment interface { + Segment + + FreeMmap() error +} + +// Builder is a builder that can be used to construct segments. +type Builder interface { + FieldsPostingsListIterable + TermsIterable + + // Reset resets the builder for reuse. + Reset() + + // Docs returns the current docs slice, this is not safe to modify + // and is invalidated on a call to reset. + Docs() []doc.Document + + // AllDocs returns an iterator over the documents known to the Reader. + AllDocs() (index.IDDocIterator, error) +} + +// DocumentsBuilder is a builder that has documents written to it. +type DocumentsBuilder interface { + Builder + index.Writer + + // SetIndexConcurrency sets the concurrency used for building the segment. + SetIndexConcurrency(value int) + + // IndexConcurrency returns the concurrency used for building the segment. + IndexConcurrency() int +} + +// CloseableDocumentsBuilder is a builder that has documents written to it and has freeable resources. +type CloseableDocumentsBuilder interface { + DocumentsBuilder + + Close() error +} + +// SegmentsBuilder is a builder that is built from segments. +type SegmentsBuilder interface { + Builder + + // AddSegments adds segments to build from. + AddSegments(segments []Segment) error +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/index/types.go b/vendor/github.com/m3db/m3/src/m3ninx/index/types.go new file mode 100644 index 00000000..99a141fb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/index/types.go @@ -0,0 +1,152 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package index + +import ( + "errors" + "regexp" + "regexp/syntax" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/postings" + xerrors "github.com/m3db/m3/src/x/errors" + + vregex "github.com/m3dbx/vellum/regexp" +) + +// ErrDocNotFound is the error returned when there is no document for a given postings ID. +var ErrDocNotFound = errors.New("no document with given postings ID") + +// Index is a collection of searchable documents. +type Index interface { + Writer + + // Readers returns a set of readers representing a point-in-time snapshot of the index. + Readers() (Readers, error) + + // Close closes the index and releases any internal resources. + Close() error +} + +// Writer is used to insert documents into an index. +type Writer interface { + // Insert inserts the given document into the index and returns its ID. The document + // is guaranteed to be searchable once the Insert method returns. + Insert(d doc.Document) ([]byte, error) + + // InsertBatch inserts a batch of metrics into the index. The documents are guaranteed + // to be searchable all at once when the Batch method returns. If the batch supports + // partial updates and any errors are encountered on individual documents then a + // BatchPartialError is returned. + InsertBatch(b Batch) error +} + +// Readable provides a point-in-time accessor to the documents in an index. +type Readable interface { + DocRetriever + + // MatchField returns a postings list over all documents which match the given field. + MatchField(field []byte) (postings.List, error) + + // MatchTerm returns a postings list over all documents which match the given term. + MatchTerm(field, term []byte) (postings.List, error) + + // MatchRegexp returns a postings list over all documents which match the given + // regular expression. + MatchRegexp(field []byte, c CompiledRegex) (postings.List, error) + + // MatchAll returns a postings list for all documents known to the Reader. + MatchAll() (postings.MutableList, error) + + // Docs returns an iterator over the documents whose IDs are in the provided + // postings list. + Docs(pl postings.List) (doc.Iterator, error) + + // AllDocs returns an iterator over the documents known to the Reader. + AllDocs() (IDDocIterator, error) +} + +// CompiledRegex is a collection of regexp compiled structs to allow +// amortisation of regexp construction costs. +type CompiledRegex struct { + Simple *regexp.Regexp + FST *vregex.Regexp + FSTSyntax *syntax.Regexp + PrefixBegin []byte + PrefixEnd []byte +} + +// DocRetriever returns the document associated with a postings ID. It returns +// ErrDocNotFound if there is no document corresponding to the given postings ID. +type DocRetriever interface { + Doc(id postings.ID) (doc.Document, error) +} + +// IDDocIterator is an extented documents Iterator which can also return the postings +// ID of the current document. +type IDDocIterator interface { + doc.Iterator + + // PostingsID returns the current document postings ID. + PostingsID() postings.ID +} + +// IDIterator is a document ID iterator. +type IDIterator interface { + // Next returns a bool indicating if the iterator has any more documents + // to return. + Next() bool + + // Current returns the current document ID. + Current() []byte + + // PostingsID returns the current document postings ID. + PostingsID() postings.ID + + // Err returns any errors encountered during iteration. + Err() error + + // Close releases any internal resources used by the iterator. + Close() error +} + +// Reader provides a point-in-time accessor to the documents in an index. +type Reader interface { + Readable + + // Close closes the reader and releases any internal resources. + Close() error +} + +// Readers is a slice of Reader. +type Readers []Reader + +// Close closes all of the Readers in rs. +func (rs Readers) Close() error { + multiErr := xerrors.NewMultiError() + for _, r := range rs { + err := r.Close() + if err != nil { + multiErr = multiErr.Add(err) + } + } + return multiErr.FinalError() +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/persist/persist_mock.go b/vendor/github.com/m3db/m3/src/m3ninx/persist/persist_mock.go new file mode 100644 index 00000000..7776be19 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/persist/persist_mock.go @@ -0,0 +1,540 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/m3ninx/persist/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package persist is a generated GoMock package. +package persist + +import ( + "io" + "reflect" + + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/x/mmap" + + "github.com/golang/mock/gomock" +) + +// MockIndexFileSetWriter is a mock of IndexFileSetWriter interface +type MockIndexFileSetWriter struct { + ctrl *gomock.Controller + recorder *MockIndexFileSetWriterMockRecorder +} + +// MockIndexFileSetWriterMockRecorder is the mock recorder for MockIndexFileSetWriter +type MockIndexFileSetWriterMockRecorder struct { + mock *MockIndexFileSetWriter +} + +// NewMockIndexFileSetWriter creates a new mock instance +func NewMockIndexFileSetWriter(ctrl *gomock.Controller) *MockIndexFileSetWriter { + mock := &MockIndexFileSetWriter{ctrl: ctrl} + mock.recorder = &MockIndexFileSetWriterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIndexFileSetWriter) EXPECT() *MockIndexFileSetWriterMockRecorder { + return m.recorder +} + +// WriteSegmentFileSet mocks base method +func (m *MockIndexFileSetWriter) WriteSegmentFileSet(segmentFileSet IndexSegmentFileSetWriter) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteSegmentFileSet", segmentFileSet) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteSegmentFileSet indicates an expected call of WriteSegmentFileSet +func (mr *MockIndexFileSetWriterMockRecorder) WriteSegmentFileSet(segmentFileSet interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteSegmentFileSet", reflect.TypeOf((*MockIndexFileSetWriter)(nil).WriteSegmentFileSet), segmentFileSet) +} + +// MockIndexSegmentFileSetWriter is a mock of IndexSegmentFileSetWriter interface +type MockIndexSegmentFileSetWriter struct { + ctrl *gomock.Controller + recorder *MockIndexSegmentFileSetWriterMockRecorder +} + +// MockIndexSegmentFileSetWriterMockRecorder is the mock recorder for MockIndexSegmentFileSetWriter +type MockIndexSegmentFileSetWriterMockRecorder struct { + mock *MockIndexSegmentFileSetWriter +} + +// NewMockIndexSegmentFileSetWriter creates a new mock instance +func NewMockIndexSegmentFileSetWriter(ctrl *gomock.Controller) *MockIndexSegmentFileSetWriter { + mock := &MockIndexSegmentFileSetWriter{ctrl: ctrl} + mock.recorder = &MockIndexSegmentFileSetWriterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIndexSegmentFileSetWriter) EXPECT() *MockIndexSegmentFileSetWriterMockRecorder { + return m.recorder +} + +// SegmentType mocks base method +func (m *MockIndexSegmentFileSetWriter) SegmentType() IndexSegmentType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentType") + ret0, _ := ret[0].(IndexSegmentType) + return ret0 +} + +// SegmentType indicates an expected call of SegmentType +func (mr *MockIndexSegmentFileSetWriterMockRecorder) SegmentType() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentType", reflect.TypeOf((*MockIndexSegmentFileSetWriter)(nil).SegmentType)) +} + +// MajorVersion mocks base method +func (m *MockIndexSegmentFileSetWriter) MajorVersion() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MajorVersion") + ret0, _ := ret[0].(int) + return ret0 +} + +// MajorVersion indicates an expected call of MajorVersion +func (mr *MockIndexSegmentFileSetWriterMockRecorder) MajorVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MajorVersion", reflect.TypeOf((*MockIndexSegmentFileSetWriter)(nil).MajorVersion)) +} + +// MinorVersion mocks base method +func (m *MockIndexSegmentFileSetWriter) MinorVersion() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinorVersion") + ret0, _ := ret[0].(int) + return ret0 +} + +// MinorVersion indicates an expected call of MinorVersion +func (mr *MockIndexSegmentFileSetWriterMockRecorder) MinorVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinorVersion", reflect.TypeOf((*MockIndexSegmentFileSetWriter)(nil).MinorVersion)) +} + +// SegmentMetadata mocks base method +func (m *MockIndexSegmentFileSetWriter) SegmentMetadata() []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentMetadata") + ret0, _ := ret[0].([]byte) + return ret0 +} + +// SegmentMetadata indicates an expected call of SegmentMetadata +func (mr *MockIndexSegmentFileSetWriterMockRecorder) SegmentMetadata() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentMetadata", reflect.TypeOf((*MockIndexSegmentFileSetWriter)(nil).SegmentMetadata)) +} + +// Files mocks base method +func (m *MockIndexSegmentFileSetWriter) Files() []IndexSegmentFileType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Files") + ret0, _ := ret[0].([]IndexSegmentFileType) + return ret0 +} + +// Files indicates an expected call of Files +func (mr *MockIndexSegmentFileSetWriterMockRecorder) Files() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Files", reflect.TypeOf((*MockIndexSegmentFileSetWriter)(nil).Files)) +} + +// WriteFile mocks base method +func (m *MockIndexSegmentFileSetWriter) WriteFile(fileType IndexSegmentFileType, writer io.Writer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteFile", fileType, writer) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteFile indicates an expected call of WriteFile +func (mr *MockIndexSegmentFileSetWriterMockRecorder) WriteFile(fileType, writer interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteFile", reflect.TypeOf((*MockIndexSegmentFileSetWriter)(nil).WriteFile), fileType, writer) +} + +// MockMutableSegmentFileSetWriter is a mock of MutableSegmentFileSetWriter interface +type MockMutableSegmentFileSetWriter struct { + ctrl *gomock.Controller + recorder *MockMutableSegmentFileSetWriterMockRecorder +} + +// MockMutableSegmentFileSetWriterMockRecorder is the mock recorder for MockMutableSegmentFileSetWriter +type MockMutableSegmentFileSetWriterMockRecorder struct { + mock *MockMutableSegmentFileSetWriter +} + +// NewMockMutableSegmentFileSetWriter creates a new mock instance +func NewMockMutableSegmentFileSetWriter(ctrl *gomock.Controller) *MockMutableSegmentFileSetWriter { + mock := &MockMutableSegmentFileSetWriter{ctrl: ctrl} + mock.recorder = &MockMutableSegmentFileSetWriterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMutableSegmentFileSetWriter) EXPECT() *MockMutableSegmentFileSetWriterMockRecorder { + return m.recorder +} + +// SegmentType mocks base method +func (m *MockMutableSegmentFileSetWriter) SegmentType() IndexSegmentType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentType") + ret0, _ := ret[0].(IndexSegmentType) + return ret0 +} + +// SegmentType indicates an expected call of SegmentType +func (mr *MockMutableSegmentFileSetWriterMockRecorder) SegmentType() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentType", reflect.TypeOf((*MockMutableSegmentFileSetWriter)(nil).SegmentType)) +} + +// MajorVersion mocks base method +func (m *MockMutableSegmentFileSetWriter) MajorVersion() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MajorVersion") + ret0, _ := ret[0].(int) + return ret0 +} + +// MajorVersion indicates an expected call of MajorVersion +func (mr *MockMutableSegmentFileSetWriterMockRecorder) MajorVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MajorVersion", reflect.TypeOf((*MockMutableSegmentFileSetWriter)(nil).MajorVersion)) +} + +// MinorVersion mocks base method +func (m *MockMutableSegmentFileSetWriter) MinorVersion() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinorVersion") + ret0, _ := ret[0].(int) + return ret0 +} + +// MinorVersion indicates an expected call of MinorVersion +func (mr *MockMutableSegmentFileSetWriterMockRecorder) MinorVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinorVersion", reflect.TypeOf((*MockMutableSegmentFileSetWriter)(nil).MinorVersion)) +} + +// SegmentMetadata mocks base method +func (m *MockMutableSegmentFileSetWriter) SegmentMetadata() []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentMetadata") + ret0, _ := ret[0].([]byte) + return ret0 +} + +// SegmentMetadata indicates an expected call of SegmentMetadata +func (mr *MockMutableSegmentFileSetWriterMockRecorder) SegmentMetadata() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentMetadata", reflect.TypeOf((*MockMutableSegmentFileSetWriter)(nil).SegmentMetadata)) +} + +// Files mocks base method +func (m *MockMutableSegmentFileSetWriter) Files() []IndexSegmentFileType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Files") + ret0, _ := ret[0].([]IndexSegmentFileType) + return ret0 +} + +// Files indicates an expected call of Files +func (mr *MockMutableSegmentFileSetWriterMockRecorder) Files() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Files", reflect.TypeOf((*MockMutableSegmentFileSetWriter)(nil).Files)) +} + +// WriteFile mocks base method +func (m *MockMutableSegmentFileSetWriter) WriteFile(fileType IndexSegmentFileType, writer io.Writer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteFile", fileType, writer) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteFile indicates an expected call of WriteFile +func (mr *MockMutableSegmentFileSetWriterMockRecorder) WriteFile(fileType, writer interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteFile", reflect.TypeOf((*MockMutableSegmentFileSetWriter)(nil).WriteFile), fileType, writer) +} + +// Reset mocks base method +func (m *MockMutableSegmentFileSetWriter) Reset(arg0 segment.Builder) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reset", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Reset indicates an expected call of Reset +func (mr *MockMutableSegmentFileSetWriterMockRecorder) Reset(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockMutableSegmentFileSetWriter)(nil).Reset), arg0) +} + +// MockIndexFileSetReader is a mock of IndexFileSetReader interface +type MockIndexFileSetReader struct { + ctrl *gomock.Controller + recorder *MockIndexFileSetReaderMockRecorder +} + +// MockIndexFileSetReaderMockRecorder is the mock recorder for MockIndexFileSetReader +type MockIndexFileSetReaderMockRecorder struct { + mock *MockIndexFileSetReader +} + +// NewMockIndexFileSetReader creates a new mock instance +func NewMockIndexFileSetReader(ctrl *gomock.Controller) *MockIndexFileSetReader { + mock := &MockIndexFileSetReader{ctrl: ctrl} + mock.recorder = &MockIndexFileSetReaderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIndexFileSetReader) EXPECT() *MockIndexFileSetReaderMockRecorder { + return m.recorder +} + +// SegmentFileSets mocks base method +func (m *MockIndexFileSetReader) SegmentFileSets() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentFileSets") + ret0, _ := ret[0].(int) + return ret0 +} + +// SegmentFileSets indicates an expected call of SegmentFileSets +func (mr *MockIndexFileSetReaderMockRecorder) SegmentFileSets() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentFileSets", reflect.TypeOf((*MockIndexFileSetReader)(nil).SegmentFileSets)) +} + +// ReadSegmentFileSet mocks base method +func (m *MockIndexFileSetReader) ReadSegmentFileSet() (IndexSegmentFileSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadSegmentFileSet") + ret0, _ := ret[0].(IndexSegmentFileSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadSegmentFileSet indicates an expected call of ReadSegmentFileSet +func (mr *MockIndexFileSetReaderMockRecorder) ReadSegmentFileSet() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadSegmentFileSet", reflect.TypeOf((*MockIndexFileSetReader)(nil).ReadSegmentFileSet)) +} + +// IndexVolumeType mocks base method +func (m *MockIndexFileSetReader) IndexVolumeType() IndexVolumeType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IndexVolumeType") + ret0, _ := ret[0].(IndexVolumeType) + return ret0 +} + +// IndexVolumeType indicates an expected call of IndexVolumeType +func (mr *MockIndexFileSetReaderMockRecorder) IndexVolumeType() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IndexVolumeType", reflect.TypeOf((*MockIndexFileSetReader)(nil).IndexVolumeType)) +} + +// MockIndexSegmentFileSet is a mock of IndexSegmentFileSet interface +type MockIndexSegmentFileSet struct { + ctrl *gomock.Controller + recorder *MockIndexSegmentFileSetMockRecorder +} + +// MockIndexSegmentFileSetMockRecorder is the mock recorder for MockIndexSegmentFileSet +type MockIndexSegmentFileSetMockRecorder struct { + mock *MockIndexSegmentFileSet +} + +// NewMockIndexSegmentFileSet creates a new mock instance +func NewMockIndexSegmentFileSet(ctrl *gomock.Controller) *MockIndexSegmentFileSet { + mock := &MockIndexSegmentFileSet{ctrl: ctrl} + mock.recorder = &MockIndexSegmentFileSetMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIndexSegmentFileSet) EXPECT() *MockIndexSegmentFileSetMockRecorder { + return m.recorder +} + +// SegmentType mocks base method +func (m *MockIndexSegmentFileSet) SegmentType() IndexSegmentType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentType") + ret0, _ := ret[0].(IndexSegmentType) + return ret0 +} + +// SegmentType indicates an expected call of SegmentType +func (mr *MockIndexSegmentFileSetMockRecorder) SegmentType() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentType", reflect.TypeOf((*MockIndexSegmentFileSet)(nil).SegmentType)) +} + +// MajorVersion mocks base method +func (m *MockIndexSegmentFileSet) MajorVersion() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MajorVersion") + ret0, _ := ret[0].(int) + return ret0 +} + +// MajorVersion indicates an expected call of MajorVersion +func (mr *MockIndexSegmentFileSetMockRecorder) MajorVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MajorVersion", reflect.TypeOf((*MockIndexSegmentFileSet)(nil).MajorVersion)) +} + +// MinorVersion mocks base method +func (m *MockIndexSegmentFileSet) MinorVersion() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinorVersion") + ret0, _ := ret[0].(int) + return ret0 +} + +// MinorVersion indicates an expected call of MinorVersion +func (mr *MockIndexSegmentFileSetMockRecorder) MinorVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinorVersion", reflect.TypeOf((*MockIndexSegmentFileSet)(nil).MinorVersion)) +} + +// SegmentMetadata mocks base method +func (m *MockIndexSegmentFileSet) SegmentMetadata() []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentMetadata") + ret0, _ := ret[0].([]byte) + return ret0 +} + +// SegmentMetadata indicates an expected call of SegmentMetadata +func (mr *MockIndexSegmentFileSetMockRecorder) SegmentMetadata() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentMetadata", reflect.TypeOf((*MockIndexSegmentFileSet)(nil).SegmentMetadata)) +} + +// Files mocks base method +func (m *MockIndexSegmentFileSet) Files() []IndexSegmentFile { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Files") + ret0, _ := ret[0].([]IndexSegmentFile) + return ret0 +} + +// Files indicates an expected call of Files +func (mr *MockIndexSegmentFileSetMockRecorder) Files() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Files", reflect.TypeOf((*MockIndexSegmentFileSet)(nil).Files)) +} + +// MockIndexSegmentFile is a mock of IndexSegmentFile interface +type MockIndexSegmentFile struct { + ctrl *gomock.Controller + recorder *MockIndexSegmentFileMockRecorder +} + +// MockIndexSegmentFileMockRecorder is the mock recorder for MockIndexSegmentFile +type MockIndexSegmentFileMockRecorder struct { + mock *MockIndexSegmentFile +} + +// NewMockIndexSegmentFile creates a new mock instance +func NewMockIndexSegmentFile(ctrl *gomock.Controller) *MockIndexSegmentFile { + mock := &MockIndexSegmentFile{ctrl: ctrl} + mock.recorder = &MockIndexSegmentFileMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIndexSegmentFile) EXPECT() *MockIndexSegmentFileMockRecorder { + return m.recorder +} + +// Read mocks base method +func (m *MockIndexSegmentFile) Read(p []byte) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Read", p) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Read indicates an expected call of Read +func (mr *MockIndexSegmentFileMockRecorder) Read(p interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Read", reflect.TypeOf((*MockIndexSegmentFile)(nil).Read), p) +} + +// Close mocks base method +func (m *MockIndexSegmentFile) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockIndexSegmentFileMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockIndexSegmentFile)(nil).Close)) +} + +// SegmentFileType mocks base method +func (m *MockIndexSegmentFile) SegmentFileType() IndexSegmentFileType { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SegmentFileType") + ret0, _ := ret[0].(IndexSegmentFileType) + return ret0 +} + +// SegmentFileType indicates an expected call of SegmentFileType +func (mr *MockIndexSegmentFileMockRecorder) SegmentFileType() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SegmentFileType", reflect.TypeOf((*MockIndexSegmentFile)(nil).SegmentFileType)) +} + +// Mmap mocks base method +func (m *MockIndexSegmentFile) Mmap() (mmap.Descriptor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Mmap") + ret0, _ := ret[0].(mmap.Descriptor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Mmap indicates an expected call of Mmap +func (mr *MockIndexSegmentFileMockRecorder) Mmap() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Mmap", reflect.TypeOf((*MockIndexSegmentFile)(nil).Mmap)) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/persist/reader.go b/vendor/github.com/m3db/m3/src/m3ninx/persist/reader.go new file mode 100644 index 00000000..46016a15 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/persist/reader.go @@ -0,0 +1,120 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package persist + +import ( + "fmt" + "io" + + "github.com/m3db/m3/src/m3ninx/index/segment/fst" + "github.com/m3db/m3/src/m3ninx/x" +) + +// NewSegment returns a new fst.Segment backed by the provided fileset. +// NB: this method takes ownership of the provided fileset files, in case of both errors, +// and success. i.e. users are not expected to call Close on any of the provided fileset.Files() +// after invoking this function. +func NewSegment(fileset IndexSegmentFileSet, opts fst.Options) (fst.Segment, error) { + success := false + safeCloser := newSafeIndexSegmentFileSetCloser(fileset) + defer func() { + if !success { + safeCloser.Close() + } + }() + + if t := fileset.SegmentType(); t != FSTIndexSegmentType { + return nil, fmt.Errorf("unknown segment type: %s", t) + } + + sd, err := filesetToSegmentData(fileset) + if err != nil { + return nil, err + } + sd.Closer = safeCloser + + segment, err := fst.NewSegment(sd, opts) + if err != nil { + return nil, err + } + + // indicate we don't need to close files in the defer above. + success = true + + // segment assumes ownership of the safeCloser at this point. + return segment, nil +} + +func filesetToSegmentData(fileset IndexSegmentFileSet) (fst.SegmentData, error) { + var ( + sd = fst.SegmentData{ + Version: fst.Version{ + Major: fileset.MajorVersion(), + Minor: fileset.MinorVersion(), + }, + Metadata: fileset.SegmentMetadata(), + } + err error + ) + + for _, f := range fileset.Files() { + fileType := f.SegmentFileType() + switch fileType { + case DocumentDataIndexSegmentFileType: + sd.DocsData, err = f.Mmap() + if err != nil { + return sd, err + } + case DocumentIndexIndexSegmentFileType: + sd.DocsIdxData, err = f.Mmap() + if err != nil { + return sd, err + } + case PostingsIndexSegmentFileType: + sd.PostingsData, err = f.Mmap() + if err != nil { + return sd, err + } + case FSTFieldsIndexSegmentFileType: + sd.FSTFieldsData, err = f.Mmap() + if err != nil { + return sd, err + } + case FSTTermsIndexSegmentFileType: + sd.FSTTermsData, err = f.Mmap() + if err != nil { + return sd, err + } + default: + return sd, fmt.Errorf("unknown fileType: %s provided", fileType) + } + } + + return sd, nil +} + +func newSafeIndexSegmentFileSetCloser(fileset IndexSegmentFileSet) io.Closer { + closers := make([]io.Closer, 0, len(fileset.Files())) + for _, f := range fileset.Files() { + closers = append(closers, f) + } + return x.NewSafeMultiCloser(closers...) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/persist/types.go b/vendor/github.com/m3db/m3/src/m3ninx/persist/types.go new file mode 100644 index 00000000..ec7eef21 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/persist/types.go @@ -0,0 +1,185 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package persist + +import ( + "fmt" + "io" + "regexp" + + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/x/mmap" +) + +var ( + // TypeRegex allows what can be used for a IndexSegmentType or + // IndexSegmentFileType, explicitly cannot use "-" as that can be + // then used as a separator elsewhere, also it ensures callers must + // use lower cased strings. + TypeRegex = regexp.MustCompile("^[a-z_]+$") +) + +// IndexFileSetWriter is an index file set writer, it can write out many +// segments. +type IndexFileSetWriter interface { + // WriteSegmentFileSet writes a index segment file set. + WriteSegmentFileSet(segmentFileSet IndexSegmentFileSetWriter) error +} + +// IndexSegmentFileSetWriter is an index segment file set writer. +type IndexSegmentFileSetWriter interface { + SegmentType() IndexSegmentType + MajorVersion() int + MinorVersion() int + SegmentMetadata() []byte + Files() []IndexSegmentFileType + WriteFile(fileType IndexSegmentFileType, writer io.Writer) error +} + +// MutableSegmentFileSetWriter is a new IndexSegmentFileSetWriter for writing +// out Mutable Segments. +type MutableSegmentFileSetWriter interface { + IndexSegmentFileSetWriter + + // Reset resets the writer to write the provided mutable segment. + Reset(segment.Builder) error +} + +// IndexFileSetReader is an index file set reader, it can read many segments. +type IndexFileSetReader interface { + // SegmentFileSets returns the number of segment file sets. + SegmentFileSets() int + + // ReadSegmentFileSet returns the next segment file set or an error. + // It will return io.EOF error when no more file sets remain. + // The IndexSegmentFileSet will only be valid before it's closed, + // after that calls to Read or Bytes on it will have unexpected results. + ReadSegmentFileSet() (IndexSegmentFileSet, error) + + IndexVolumeType() IndexVolumeType +} + +// IndexSegmentFileSet is an index segment file set. +type IndexSegmentFileSet interface { + SegmentType() IndexSegmentType + MajorVersion() int + MinorVersion() int + SegmentMetadata() []byte + Files() []IndexSegmentFile +} + +// IndexSegmentFile is a file in an index segment file set. +type IndexSegmentFile interface { + io.Reader + io.Closer + + // SegmentFileType returns the segment file type. + SegmentFileType() IndexSegmentFileType + + // Mmap will be valid until the segment file is closed. + Mmap() (mmap.Descriptor, error) +} + +// IndexVolumeType is the type of an index volume. +type IndexVolumeType string + +const ( + // DefaultIndexVolumeType is a default IndexVolumeType. + // This is the type if not otherwise specified. + DefaultIndexVolumeType IndexVolumeType = "default" +) + +// IndexSegmentType is the type of an index file set. +type IndexSegmentType string + +const ( + // FSTIndexSegmentType is a FST IndexSegmentType. + FSTIndexSegmentType IndexSegmentType = "fst" +) + +// IndexSegmentFileType is the type of a file in an index file set. +type IndexSegmentFileType string + +const ( + // DocumentDataIndexSegmentFileType is a document data segment file. + DocumentDataIndexSegmentFileType IndexSegmentFileType = "docdata" + + // DocumentIndexIndexSegmentFileType is a document index segment file. + DocumentIndexIndexSegmentFileType IndexSegmentFileType = "docidx" + + // PostingsIndexSegmentFileType is a postings List data index segment file. + PostingsIndexSegmentFileType IndexSegmentFileType = "postingsdata" + + // FSTFieldsIndexSegmentFileType is a FST Fields index segment file. + FSTFieldsIndexSegmentFileType IndexSegmentFileType = "fstfields" + + // FSTTermsIndexSegmentFileType is a FST Terms index segment file. + FSTTermsIndexSegmentFileType IndexSegmentFileType = "fstterms" +) + +var ( + indexSegmentTypes = []IndexSegmentType{ + FSTIndexSegmentType, + } + + indexSegmentFileTypes = []IndexSegmentFileType{ + DocumentDataIndexSegmentFileType, + DocumentIndexIndexSegmentFileType, + PostingsIndexSegmentFileType, + FSTFieldsIndexSegmentFileType, + FSTTermsIndexSegmentFileType, + } +) + +func init() { + for _, f := range indexSegmentTypes { + if err := f.Validate(); err != nil { + panic(err) + } + } + for _, f := range indexSegmentFileTypes { + if err := f.Validate(); err != nil { + panic(err) + } + } +} + +// Validate validates whether the string value is a valid segment type +// and contains only lowercase a-z and underscore characters. +func (t IndexSegmentType) Validate() error { + s := string(t) + if t == "" || !TypeRegex.MatchString(s) { + return fmt.Errorf("invalid segment type must match pattern=%s", + TypeRegex.String()) + } + return nil +} + +// Validate validates whether the string value is a valid segment file type +// and contains only lowercase a-z and underscore characters. +func (t IndexSegmentFileType) Validate() error { + s := string(t) + if t == "" || !TypeRegex.MatchString(s) { + return fmt.Errorf("invalid segment file type must match pattern=%s", + TypeRegex.String()) + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/persist/writer.go b/vendor/github.com/m3db/m3/src/m3ninx/persist/writer.go new file mode 100644 index 00000000..23bab30e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/persist/writer.go @@ -0,0 +1,210 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package persist + +import ( + "errors" + "fmt" + "io" + + "github.com/m3db/m3/src/m3ninx/index/segment" + "github.com/m3db/m3/src/m3ninx/index/segment/fst" + "github.com/m3db/m3/src/m3ninx/x" +) + +var ( + errDocsDataFileNotWritten = errors.New("docs data file must be written before index data") +) + +// NewMutableSegmentFileSetWriter returns a new IndexSegmentFileSetWriter for writing +// out the provided Mutable Segment. +func NewMutableSegmentFileSetWriter( + fstOpts fst.WriterOptions, +) (MutableSegmentFileSetWriter, error) { + w, err := fst.NewWriter(fstOpts) + if err != nil { + return nil, err + } + return newMutableSegmentFileSetWriter(w) +} + +func newMutableSegmentFileSetWriter( + fsWriter fst.Writer, +) (MutableSegmentFileSetWriter, error) { + return &writer{ + fsWriter: fsWriter, + }, nil +} + +type writer struct { + fsWriter fst.Writer +} + +func (w *writer) Reset(builder segment.Builder) error { + return w.fsWriter.Reset(builder) +} + +func (w *writer) SegmentType() IndexSegmentType { + return FSTIndexSegmentType +} + +func (w *writer) MajorVersion() int { + return w.fsWriter.MajorVersion() +} + +func (w *writer) MinorVersion() int { + return w.fsWriter.MinorVersion() +} + +func (w *writer) SegmentMetadata() []byte { + return w.fsWriter.Metadata() +} + +func (w *writer) Files() []IndexSegmentFileType { + // NB(prateek): order is important here. It is the order of files written out, + // and needs to be maintained as it is below. + return []IndexSegmentFileType{ + DocumentDataIndexSegmentFileType, + DocumentIndexIndexSegmentFileType, + PostingsIndexSegmentFileType, + FSTTermsIndexSegmentFileType, + FSTFieldsIndexSegmentFileType, + } +} + +func (w *writer) WriteFile(fileType IndexSegmentFileType, iow io.Writer) error { + switch fileType { + case DocumentDataIndexSegmentFileType: + return w.fsWriter.WriteDocumentsData(iow) + case DocumentIndexIndexSegmentFileType: + return w.fsWriter.WriteDocumentsIndex(iow) + case PostingsIndexSegmentFileType: + return w.fsWriter.WritePostingsOffsets(iow) + case FSTFieldsIndexSegmentFileType: + return w.fsWriter.WriteFSTFields(iow) + case FSTTermsIndexSegmentFileType: + return w.fsWriter.WriteFSTTerms(iow) + } + return fmt.Errorf("unknown fileType: %s provided", fileType) +} + +// NewFSTSegmentDataFileSetWriter creates a new file set writer for +// fst segment data. +func NewFSTSegmentDataFileSetWriter( + data fst.SegmentData, +) (IndexSegmentFileSetWriter, error) { + if err := data.Validate(); err != nil { + return nil, err + } + + docsWriter, err := fst.NewDocumentsWriter() + if err != nil { + return nil, err + } + + return &fstSegmentDataWriter{ + data: data, + docsWriter: docsWriter, + }, nil +} + +type fstSegmentDataWriter struct { + data fst.SegmentData + docsWriter *fst.DocumentsWriter + docsDataFileWritten bool +} + +func (w *fstSegmentDataWriter) SegmentType() IndexSegmentType { + return FSTIndexSegmentType +} + +func (w *fstSegmentDataWriter) MajorVersion() int { + return w.data.Version.Major +} + +func (w *fstSegmentDataWriter) MinorVersion() int { + return w.data.Version.Minor +} + +func (w *fstSegmentDataWriter) SegmentMetadata() []byte { + return w.data.Metadata +} + +func (w *fstSegmentDataWriter) Files() []IndexSegmentFileType { + return []IndexSegmentFileType{ + DocumentDataIndexSegmentFileType, + DocumentIndexIndexSegmentFileType, + PostingsIndexSegmentFileType, + FSTTermsIndexSegmentFileType, + FSTFieldsIndexSegmentFileType, + } +} + +func (w *fstSegmentDataWriter) WriteFile(fileType IndexSegmentFileType, iow io.Writer) error { + switch fileType { + case DocumentDataIndexSegmentFileType: + if err := w.writeDocsData(iow); err != nil { + return err + } + w.docsDataFileWritten = true + return nil + case DocumentIndexIndexSegmentFileType: + if !w.docsDataFileWritten { + return errDocsDataFileNotWritten + } + return w.writeDocsIndex(iow) + case PostingsIndexSegmentFileType: + _, err := iow.Write(w.data.PostingsData.Bytes) + return err + case FSTFieldsIndexSegmentFileType: + _, err := iow.Write(w.data.FSTFieldsData.Bytes) + return err + case FSTTermsIndexSegmentFileType: + _, err := iow.Write(w.data.FSTTermsData.Bytes) + return err + } + return fmt.Errorf("unknown fileType: %s provided", fileType) +} + +func (w *fstSegmentDataWriter) writeDocsData(iow io.Writer) error { + if r := w.data.DocsReader; r != nil { + iter := r.Iter() + closer := x.NewSafeCloser(iter) + defer closer.Close() + w.docsWriter.Reset(fst.DocumentsWriterOptions{ + Iter: iter, + SizeHint: r.Len(), + }) + return w.docsWriter.WriteDocumentsData(iow) + } + + _, err := iow.Write(w.data.DocsData.Bytes) + return err +} + +func (w *fstSegmentDataWriter) writeDocsIndex(iow io.Writer) error { + if r := w.data.DocsReader; r != nil { + return w.docsWriter.WriteDocumentsIndex(iow) + } + + _, err := iow.Write(w.data.DocsData.Bytes) + return err +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/postings/atomic.go b/vendor/github.com/m3db/m3/src/m3ninx/postings/atomic.go new file mode 100644 index 00000000..7559ac0f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/postings/atomic.go @@ -0,0 +1,50 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package postings + +import ( + "go.uber.org/atomic" +) + +// AtomicID is an atomic ID. +type AtomicID struct { + internal *atomic.Uint32 +} + +// NewAtomicID creates a new AtomicID. +func NewAtomicID(id ID) AtomicID { + return AtomicID{internal: atomic.NewUint32(uint32(id))} +} + +// Load atomically loads the ID. +func (id AtomicID) Load() ID { + return ID(id.internal.Load()) +} + +// Inc atomically increments the ID and returns the new value. +func (id AtomicID) Inc() ID { + return ID(id.internal.Inc()) +} + +// Add atomically adds n to the ID and returns the new ID. +func (id AtomicID) Add(n uint32) ID { + return ID(id.internal.Add(n)) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/postings/pilosa/codec.go b/vendor/github.com/m3db/m3/src/m3ninx/postings/pilosa/codec.go new file mode 100644 index 00000000..8c8998f7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/postings/pilosa/codec.go @@ -0,0 +1,96 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package pilosa + +import ( + "bytes" + + "github.com/m3db/m3/src/m3ninx/postings" + idxroaring "github.com/m3db/m3/src/m3ninx/postings/roaring" + "github.com/m3dbx/pilosa/roaring" +) + +// Encoder helps serialize a Pilosa RoaringBitmap +type Encoder struct { + scratchBuffer bytes.Buffer +} + +// NewEncoder returns a new Encoder. +func NewEncoder() *Encoder { + return &Encoder{} +} + +// Reset resets the internal state of the encoder to allow +// for re-use. +func (e *Encoder) Reset() { + e.scratchBuffer.Reset() +} + +// Encode encodes the provided postings list in serialized form. +// The bytes returned are invalidate on a subsequent call to Encode(), +// or Reset(). +func (e *Encoder) Encode(pl postings.List) ([]byte, error) { + e.scratchBuffer.Reset() + + // Optimistically try to see if we can extract from the postings list itself + bitmap, ok := idxroaring.BitmapFromPostingsList(pl) + if !ok { + var err error + bitmap, err = toPilosa(pl) + if err != nil { + return nil, err + } + } + + if _, err := bitmap.WriteTo(&e.scratchBuffer); err != nil { + return nil, err + } + + return e.scratchBuffer.Bytes(), nil +} + +func toPilosa(pl postings.List) (*roaring.Bitmap, error) { + bitmap := roaring.NewBitmap() + iter := pl.Iterator() + + for iter.Next() { + _, err := bitmap.Add(uint64(iter.Current())) + if err != nil { + return nil, err + } + } + + if err := iter.Err(); err != nil { + return nil, err + } + + return bitmap, nil +} + +// Unmarshal unmarshals the provided bytes into a postings.List. +func Unmarshal(data []byte) (postings.List, error) { + bitmap := roaring.NewBitmap() + err := bitmap.UnmarshalBinary(data) + if err != nil { + return nil, err + } + return idxroaring.NewPostingsListFromBitmap(bitmap), nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/postings/pilosa/iterator.go b/vendor/github.com/m3db/m3/src/m3ninx/postings/pilosa/iterator.go new file mode 100644 index 00000000..eb5e06fb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/postings/pilosa/iterator.go @@ -0,0 +1,70 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package pilosa + +import ( + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3dbx/pilosa/roaring" +) + +// NB: need to do this to find a path into our postings list which doesn't require every +// insert to grab a lock. Need to make a non thread-safe version of our api. +// FOLLOWUP(prateek): tracking this issue in https://github.com/m3db/m3ninx/issues/65 + +type iterator struct { + iter *roaring.Iterator + current uint64 + hasNext bool +} + +var _ postings.Iterator = &iterator{} + +// NewIterator returns a postings.Iterator wrapping a pilosa roaring.Iterator. +func NewIterator(iter *roaring.Iterator) postings.Iterator { + return &iterator{ + iter: iter, + hasNext: true, + } +} + +func (p *iterator) Next() bool { + if !p.hasNext { + return false + } + v, eof := p.iter.Next() + p.current = v + p.hasNext = !eof + return p.hasNext +} + +func (p *iterator) Current() postings.ID { + return postings.ID(p.current) +} + +func (p *iterator) Err() error { + return nil +} + +func (p *iterator) Close() error { + p.iter = nil + p.hasNext = false + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/postings/pool.go b/vendor/github.com/m3db/m3/src/m3ninx/postings/pool.go new file mode 100644 index 00000000..06b5f6a2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/postings/pool.go @@ -0,0 +1,67 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package postings + +import ( + xpool "github.com/m3db/m3/src/x/pool" +) + +const ( + defaultPoolSize = 8 +) + +type pool struct { + pool xpool.ObjectPool +} + +// PoolAllocateFn returns a new MutableList. +type PoolAllocateFn func() MutableList + +// NewPool returns a new Pool. +func NewPool( + opts xpool.ObjectPoolOptions, + allocator PoolAllocateFn, +) Pool { + if opts == nil { + // Use a small pool by default, postings lists can become + // very large and can be dangerous to pool in any significant + // quantity (have observed individual postings lists of size 4mb + // frequently even when reset). + opts = xpool.NewObjectPoolOptions().SetSize(defaultPoolSize) + } + + p := &pool{ + pool: xpool.NewObjectPool(opts), + } + p.pool.Init(func() interface{} { + return allocator() + }) + return p +} + +func (p *pool) Get() MutableList { + return p.pool.Get().(MutableList) +} + +func (p *pool) Put(pl MutableList) { + pl.Reset() + p.pool.Put(pl) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/postings/postings_mock.go b/vendor/github.com/m3db/m3/src/m3ninx/postings/postings_mock.go new file mode 100644 index 00000000..03769858 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/postings/postings_mock.go @@ -0,0 +1,527 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/m3ninx/postings/types.go + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package postings is a generated GoMock package. +package postings + +import ( + "reflect" + + "github.com/golang/mock/gomock" +) + +// MockList is a mock of List interface +type MockList struct { + ctrl *gomock.Controller + recorder *MockListMockRecorder +} + +// MockListMockRecorder is the mock recorder for MockList +type MockListMockRecorder struct { + mock *MockList +} + +// NewMockList creates a new mock instance +func NewMockList(ctrl *gomock.Controller) *MockList { + mock := &MockList{ctrl: ctrl} + mock.recorder = &MockListMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockList) EXPECT() *MockListMockRecorder { + return m.recorder +} + +// Contains mocks base method +func (m *MockList) Contains(id ID) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Contains", id) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Contains indicates an expected call of Contains +func (mr *MockListMockRecorder) Contains(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Contains", reflect.TypeOf((*MockList)(nil).Contains), id) +} + +// IsEmpty mocks base method +func (m *MockList) IsEmpty() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsEmpty") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsEmpty indicates an expected call of IsEmpty +func (mr *MockListMockRecorder) IsEmpty() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsEmpty", reflect.TypeOf((*MockList)(nil).IsEmpty)) +} + +// Max mocks base method +func (m *MockList) Max() (ID, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Max") + ret0, _ := ret[0].(ID) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Max indicates an expected call of Max +func (mr *MockListMockRecorder) Max() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Max", reflect.TypeOf((*MockList)(nil).Max)) +} + +// Len mocks base method +func (m *MockList) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockListMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockList)(nil).Len)) +} + +// Iterator mocks base method +func (m *MockList) Iterator() Iterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Iterator") + ret0, _ := ret[0].(Iterator) + return ret0 +} + +// Iterator indicates an expected call of Iterator +func (mr *MockListMockRecorder) Iterator() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Iterator", reflect.TypeOf((*MockList)(nil).Iterator)) +} + +// Clone mocks base method +func (m *MockList) Clone() MutableList { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Clone") + ret0, _ := ret[0].(MutableList) + return ret0 +} + +// Clone indicates an expected call of Clone +func (mr *MockListMockRecorder) Clone() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockList)(nil).Clone)) +} + +// Equal mocks base method +func (m *MockList) Equal(other List) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", other) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockListMockRecorder) Equal(other interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockList)(nil).Equal), other) +} + +// MockMutableList is a mock of MutableList interface +type MockMutableList struct { + ctrl *gomock.Controller + recorder *MockMutableListMockRecorder +} + +// MockMutableListMockRecorder is the mock recorder for MockMutableList +type MockMutableListMockRecorder struct { + mock *MockMutableList +} + +// NewMockMutableList creates a new mock instance +func NewMockMutableList(ctrl *gomock.Controller) *MockMutableList { + mock := &MockMutableList{ctrl: ctrl} + mock.recorder = &MockMutableListMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMutableList) EXPECT() *MockMutableListMockRecorder { + return m.recorder +} + +// Contains mocks base method +func (m *MockMutableList) Contains(id ID) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Contains", id) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Contains indicates an expected call of Contains +func (mr *MockMutableListMockRecorder) Contains(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Contains", reflect.TypeOf((*MockMutableList)(nil).Contains), id) +} + +// IsEmpty mocks base method +func (m *MockMutableList) IsEmpty() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsEmpty") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsEmpty indicates an expected call of IsEmpty +func (mr *MockMutableListMockRecorder) IsEmpty() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsEmpty", reflect.TypeOf((*MockMutableList)(nil).IsEmpty)) +} + +// Max mocks base method +func (m *MockMutableList) Max() (ID, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Max") + ret0, _ := ret[0].(ID) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Max indicates an expected call of Max +func (mr *MockMutableListMockRecorder) Max() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Max", reflect.TypeOf((*MockMutableList)(nil).Max)) +} + +// Len mocks base method +func (m *MockMutableList) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockMutableListMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockMutableList)(nil).Len)) +} + +// Iterator mocks base method +func (m *MockMutableList) Iterator() Iterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Iterator") + ret0, _ := ret[0].(Iterator) + return ret0 +} + +// Iterator indicates an expected call of Iterator +func (mr *MockMutableListMockRecorder) Iterator() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Iterator", reflect.TypeOf((*MockMutableList)(nil).Iterator)) +} + +// Clone mocks base method +func (m *MockMutableList) Clone() MutableList { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Clone") + ret0, _ := ret[0].(MutableList) + return ret0 +} + +// Clone indicates an expected call of Clone +func (mr *MockMutableListMockRecorder) Clone() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockMutableList)(nil).Clone)) +} + +// Equal mocks base method +func (m *MockMutableList) Equal(other List) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", other) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockMutableListMockRecorder) Equal(other interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockMutableList)(nil).Equal), other) +} + +// Insert mocks base method +func (m *MockMutableList) Insert(i ID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Insert", i) + ret0, _ := ret[0].(error) + return ret0 +} + +// Insert indicates an expected call of Insert +func (mr *MockMutableListMockRecorder) Insert(i interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockMutableList)(nil).Insert), i) +} + +// Intersect mocks base method +func (m *MockMutableList) Intersect(other List) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Intersect", other) + ret0, _ := ret[0].(error) + return ret0 +} + +// Intersect indicates an expected call of Intersect +func (mr *MockMutableListMockRecorder) Intersect(other interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Intersect", reflect.TypeOf((*MockMutableList)(nil).Intersect), other) +} + +// Difference mocks base method +func (m *MockMutableList) Difference(other List) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Difference", other) + ret0, _ := ret[0].(error) + return ret0 +} + +// Difference indicates an expected call of Difference +func (mr *MockMutableListMockRecorder) Difference(other interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Difference", reflect.TypeOf((*MockMutableList)(nil).Difference), other) +} + +// Union mocks base method +func (m *MockMutableList) Union(other List) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Union", other) + ret0, _ := ret[0].(error) + return ret0 +} + +// Union indicates an expected call of Union +func (mr *MockMutableListMockRecorder) Union(other interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Union", reflect.TypeOf((*MockMutableList)(nil).Union), other) +} + +// UnionMany mocks base method +func (m *MockMutableList) UnionMany(others []List) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UnionMany", others) + ret0, _ := ret[0].(error) + return ret0 +} + +// UnionMany indicates an expected call of UnionMany +func (mr *MockMutableListMockRecorder) UnionMany(others interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnionMany", reflect.TypeOf((*MockMutableList)(nil).UnionMany), others) +} + +// AddIterator mocks base method +func (m *MockMutableList) AddIterator(iter Iterator) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddIterator", iter) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddIterator indicates an expected call of AddIterator +func (mr *MockMutableListMockRecorder) AddIterator(iter interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddIterator", reflect.TypeOf((*MockMutableList)(nil).AddIterator), iter) +} + +// AddRange mocks base method +func (m *MockMutableList) AddRange(min, max ID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddRange", min, max) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddRange indicates an expected call of AddRange +func (mr *MockMutableListMockRecorder) AddRange(min, max interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRange", reflect.TypeOf((*MockMutableList)(nil).AddRange), min, max) +} + +// RemoveRange mocks base method +func (m *MockMutableList) RemoveRange(min, max ID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveRange", min, max) + ret0, _ := ret[0].(error) + return ret0 +} + +// RemoveRange indicates an expected call of RemoveRange +func (mr *MockMutableListMockRecorder) RemoveRange(min, max interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveRange", reflect.TypeOf((*MockMutableList)(nil).RemoveRange), min, max) +} + +// Reset mocks base method +func (m *MockMutableList) Reset() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset") +} + +// Reset indicates an expected call of Reset +func (mr *MockMutableListMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockMutableList)(nil).Reset)) +} + +// MockIterator is a mock of Iterator interface +type MockIterator struct { + ctrl *gomock.Controller + recorder *MockIteratorMockRecorder +} + +// MockIteratorMockRecorder is the mock recorder for MockIterator +type MockIteratorMockRecorder struct { + mock *MockIterator +} + +// NewMockIterator creates a new mock instance +func NewMockIterator(ctrl *gomock.Controller) *MockIterator { + mock := &MockIterator{ctrl: ctrl} + mock.recorder = &MockIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockIterator) EXPECT() *MockIteratorMockRecorder { + return m.recorder +} + +// Next mocks base method +func (m *MockIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockIterator)(nil).Next)) +} + +// Current mocks base method +func (m *MockIterator) Current() ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(ID) + return ret0 +} + +// Current indicates an expected call of Current +func (mr *MockIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockIterator)(nil).Err)) +} + +// Close mocks base method +func (m *MockIterator) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockIterator)(nil).Close)) +} + +// MockPool is a mock of Pool interface +type MockPool struct { + ctrl *gomock.Controller + recorder *MockPoolMockRecorder +} + +// MockPoolMockRecorder is the mock recorder for MockPool +type MockPoolMockRecorder struct { + mock *MockPool +} + +// NewMockPool creates a new mock instance +func NewMockPool(ctrl *gomock.Controller) *MockPool { + mock := &MockPool{ctrl: ctrl} + mock.recorder = &MockPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockPool) EXPECT() *MockPoolMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockPool) Get() MutableList { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(MutableList) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockPool)(nil).Get)) +} + +// Put mocks base method +func (m *MockPool) Put(pl MutableList) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", pl) +} + +// Put indicates an expected call of Put +func (mr *MockPoolMockRecorder) Put(pl interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockPool)(nil).Put), pl) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/postings/range_iterator.go b/vendor/github.com/m3db/m3/src/m3ninx/postings/range_iterator.go new file mode 100644 index 00000000..f9c33454 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/postings/range_iterator.go @@ -0,0 +1,69 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package postings + +import "errors" + +var ( + errRangerIterClosed = errors.New("iterator has already been closed") +) + +type rangeIter struct { + startInclusive ID + endExclusive ID + closed bool + started bool +} + +// NewRangeIterator returns a new Iterator over the specified range. +func NewRangeIterator(startInclusive, endExclusive ID) Iterator { + return &rangeIter{ + startInclusive: startInclusive, + endExclusive: endExclusive, + } +} + +func (r *rangeIter) Next() bool { + if r.closed { + return false + } + if r.started { + r.startInclusive++ + } + r.started = true + return r.startInclusive < r.endExclusive +} + +func (r *rangeIter) Current() ID { + return r.startInclusive +} + +func (r *rangeIter) Err() error { + return nil +} + +func (r *rangeIter) Close() error { + if r.closed { + return errRangerIterClosed + } + r.closed = true + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/postings/roaring/roaring.go b/vendor/github.com/m3db/m3/src/m3ninx/postings/roaring/roaring.go new file mode 100644 index 00000000..e1f8a3d8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/postings/roaring/roaring.go @@ -0,0 +1,262 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package roaring + +import ( + "errors" + "fmt" + + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/x" + "github.com/m3dbx/pilosa/roaring" +) + +var ( + errIntersectRoaringOnly = errors.New("Intersect only supported between roaringDocId sets") + errUnionRoaringOnly = errors.New("Union only supported between roaringDocId sets") + errDifferenceRoaringOnly = errors.New("Difference only supported between roaringDocId sets") + errIteratorClosed = errors.New("iterator has been closed") +) + +// Union retrieves a new postings list which is the union of the provided lists. +func Union(inputs []postings.List) (postings.MutableList, error) { + if len(inputs) == 0 { + return NewPostingsList(), nil + } + + unioned := roaring.NewBitmap() + if err := union(unioned, inputs); err != nil { + return nil, err + } + return NewPostingsListFromBitmap(unioned), nil +} + +func union(unionedBitmap *roaring.Bitmap, inputs []postings.List) error { + bitmaps := make([]*roaring.Bitmap, 0, len(inputs)) + for _, in := range inputs { + pl, ok := in.(*postingsList) + if !ok { + return fmt.Errorf("unable to convert inputs into roaring postings lists") + } + bitmaps = append(bitmaps, pl.bitmap) + } + + unionedBitmap.UnionInPlace(bitmaps...) + return nil +} + +// BitmapFromPostingsList returns a bitmap from a postings list if it +// is a roaring bitmap postings list. +func BitmapFromPostingsList(pl postings.List) (*roaring.Bitmap, bool) { + result, ok := pl.(*postingsList) + if !ok { + return nil, false + } + return result.bitmap, true +} + +// postingsList abstracts a Roaring Bitmap. +type postingsList struct { + bitmap *roaring.Bitmap +} + +// NewPostingsList returns a new mutable postings list backed by a Roaring Bitmap. +func NewPostingsList() postings.MutableList { + return &postingsList{ + bitmap: roaring.NewBitmap(), + } +} + +// NewPostingsListFromBitmap returns a new mutable postings list using an +// existing roaring bitmap. +func NewPostingsListFromBitmap(bitmap *roaring.Bitmap) postings.MutableList { + return &postingsList{bitmap: bitmap} +} + +func (d *postingsList) Insert(i postings.ID) error { + _ = d.bitmap.DirectAdd(uint64(i)) + return nil +} + +func (d *postingsList) Intersect(other postings.List) error { + o, ok := other.(*postingsList) + if !ok { + return errIntersectRoaringOnly + } + + d.bitmap = d.bitmap.Intersect(o.bitmap) + return nil +} + +func (d *postingsList) Difference(other postings.List) error { + o, ok := other.(*postingsList) + if !ok { + return errDifferenceRoaringOnly + } + + d.bitmap = d.bitmap.Difference(o.bitmap) + return nil +} + +func (d *postingsList) Union(other postings.List) error { + o, ok := other.(*postingsList) + if !ok { + return errUnionRoaringOnly + } + + d.bitmap.UnionInPlace(o.bitmap) + return nil +} + +func (d *postingsList) UnionMany(others []postings.List) error { + return union(d.bitmap, others) +} + +func (d *postingsList) AddRange(min, max postings.ID) error { + for i := min; i < max; i++ { + _, err := d.bitmap.Add(uint64(i)) + if err != nil { + return err + } + } + return nil +} + +func (d *postingsList) AddIterator(iter postings.Iterator) error { + safeIter := x.NewSafeCloser(iter) + defer safeIter.Close() + + for iter.Next() { + if err := d.Insert(iter.Current()); err != nil { + return err + } + } + + if err := iter.Err(); err != nil { + return err + } + + return safeIter.Close() +} + +func (d *postingsList) RemoveRange(min, max postings.ID) error { + for i := min; i < max; i++ { + _, err := d.bitmap.Remove(uint64(i)) + if err != nil { + return err + } + } + return nil +} + +func (d *postingsList) Reset() { + d.bitmap.Reset() +} + +func (d *postingsList) Contains(i postings.ID) bool { + return d.bitmap.Contains(uint64(i)) +} + +func (d *postingsList) IsEmpty() bool { + return d.bitmap.Count() == 0 +} + +func (d *postingsList) Max() (postings.ID, error) { + if d.IsEmpty() { + return 0, postings.ErrEmptyList + } + max := d.bitmap.Max() + return postings.ID(max), nil +} + +func (d *postingsList) Len() int { + return int(d.bitmap.Count()) +} + +func (d *postingsList) Iterator() postings.Iterator { + return &roaringIterator{ + iter: d.bitmap.Iterator(), + } +} + +func (d *postingsList) Clone() postings.MutableList { + // TODO: It's cheaper to Clone than to cache roaring bitmaps, see + // `postings_list_bench_test.go`. Their internals don't allow for + // pooling at the moment. We should address this when get a chance + // (move to another implementation / address deficiencies). + return &postingsList{ + bitmap: d.bitmap.Clone(), + } +} + +func (d *postingsList) Equal(other postings.List) bool { + if d.Len() != other.Len() { + return false + } + + iter := d.Iterator() + otherIter := other.Iterator() + + for iter.Next() { + if !otherIter.Next() { + return false + } + if iter.Current() != otherIter.Current() { + return false + } + } + + return true +} + +type roaringIterator struct { + iter *roaring.Iterator + current postings.ID + closed bool +} + +func (it *roaringIterator) Current() postings.ID { + return it.current +} + +func (it *roaringIterator) Next() bool { + if it.closed { + return false + } + v, eof := it.iter.Next() + if eof { + return false + } + it.current = postings.ID(v) + return true +} + +func (it *roaringIterator) Err() error { + return nil +} + +func (it *roaringIterator) Close() error { + if it.closed { + return errIteratorClosed + } + it.closed = true + return nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/postings/types.go b/vendor/github.com/m3db/m3/src/m3ninx/postings/types.go new file mode 100644 index 00000000..dc4f1390 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/postings/types.go @@ -0,0 +1,131 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package postings + +import ( + "errors" + "math" +) + +// ID is the unique identifier of an element in the postings list. +// TODO: Use a uint64, currently we only use uint32 because we use +// Roaring Bitmaps for the implementation of the postings list. +// Pilosa has an implementation of Roaring Bitmaps using uint64s. +type ID uint32 + +const ( + // MaxID is the maximum possible value for a postings ID. + // TODO: Update these use uint64 when we update ID. + MaxID ID = ID(math.MaxUint32) +) + +var ( + // ErrEmptyList is the error returned when a postings list is unexpectedly empty. + ErrEmptyList = errors.New("postings list is empty") +) + +// List is a collection of docIDs. The interface only supports immutable methods. +type List interface { + // Contains returns whether the specified ID is contained in this postings list. + Contains(id ID) bool + + // IsEmpty returns whether the postings list is empty. Some posting lists have an + // optimized implementation to determine if they are empty which is faster than + // calculating the size of the postings list. + IsEmpty() bool + + // Max returns the maximum ID in the postings list or an error if it is empty. + Max() (ID, error) + + // Len returns the numbers of IDs in the postings list. + Len() int + + // Iterator returns an iterator over the IDs in the postings list. + Iterator() Iterator + + // Clone returns a copy of the postings list. + Clone() MutableList + + // Equal returns whether this postings list contains the same posting IDs as other. + Equal(other List) bool +} + +// MutableList is a postings list implementation which also supports mutable operations. +type MutableList interface { + List + + // Insert inserts the given ID into the postings list. + Insert(i ID) error + + // Intersect updates this postings list in place to contain only those DocIDs which are + // in both this postings list and other. + Intersect(other List) error + + // Difference updates this postings list in place to contain only those DocIDs which are + // in this postings list but not other. + Difference(other List) error + + // Union updates this postings list in place to contain those DocIDs which are in either + // this postings list or other. + Union(other List) error + + // UnionMany updates this postings list in place to contain those DocIDs which are in + // either this postings list or multiple others. + UnionMany(others []List) error + + // AddIterator adds all IDs contained in the iterator. + AddIterator(iter Iterator) error + + // AddRange adds all IDs between [min, max) to this postings list. + AddRange(min, max ID) error + + // RemoveRange removes all IDs between [min, max) from this postings list. + RemoveRange(min, max ID) error + + // Reset resets the internal state of the postings list. + Reset() +} + +// Iterator is an iterator over a postings list. The iterator is guaranteed to return +// IDs in increasing order. It is not safe for concurrent access. +type Iterator interface { + // Next returns whether the iterator has another postings ID. + Next() bool + + // Current returns the current postings ID. It is only safe to call Current immediately + // after a call to Next confirms there are more IDs remaining. + Current() ID + + // Err returns any errors encountered during iteration. + Err() error + + // Close closes the iterator. + Close() error +} + +// Pool provides a pool for MutableLists. +type Pool interface { + // Get retrieves a MutableList. + Get() MutableList + + // Put releases the provided MutableList back to the pool. + Put(pl MutableList) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/executor/executor.go b/vendor/github.com/m3db/m3/src/m3ninx/search/executor/executor.go new file mode 100644 index 00000000..e5f606a8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/executor/executor.go @@ -0,0 +1,84 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package executor + +import ( + "errors" + "sync" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/search" +) + +var ( + errExecutorClosed = errors.New("executor is closed") +) + +type newIteratorFn func(s search.Searcher, rs index.Readers) (doc.Iterator, error) + +type executor struct { + sync.RWMutex + + newIteratorFn newIteratorFn + readers index.Readers + + closed bool +} + +// NewExecutor returns a new Executor for executing queries. +func NewExecutor(rs index.Readers) search.Executor { + return &executor{ + newIteratorFn: newIterator, + readers: rs, + } +} + +func (e *executor) Execute(q search.Query) (doc.Iterator, error) { + e.RLock() + defer e.RUnlock() + if e.closed { + return nil, errExecutorClosed + } + + s, err := q.Searcher() + if err != nil { + return nil, err + } + + iter, err := e.newIteratorFn(s, e.readers) + if err != nil { + return nil, err + } + + return iter, nil +} + +func (e *executor) Close() error { + e.Lock() + if e.closed { + e.Unlock() + return errExecutorClosed + } + e.closed = true + e.Unlock() + return e.readers.Close() +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/executor/iterator.go b/vendor/github.com/m3db/m3/src/m3ninx/search/executor/iterator.go new file mode 100644 index 00000000..a95e95bb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/executor/iterator.go @@ -0,0 +1,131 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package executor + +import ( + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/search" +) + +type iterator struct { + searcher search.Searcher + readers index.Readers + + idx int + currDoc doc.Document + currIter doc.Iterator + + err error + closed bool +} + +func newIterator(s search.Searcher, rs index.Readers) (doc.Iterator, error) { + it := &iterator{ + searcher: s, + readers: rs, + idx: -1, + } + + currIter, _, err := it.nextIter() + if err != nil { + return nil, err + } + + it.currIter = currIter + return it, nil +} + +func (it *iterator) Next() bool { + if it.closed || it.err != nil || it.idx == len(it.readers) { + return false + } + + for !it.currIter.Next() { + // Check if the current iterator encountered an error. + if err := it.currIter.Err(); err != nil { + it.err = err + return false + } + + // Close current iterator now that we are finished with it. + err := it.currIter.Close() + it.currIter = nil + if err != nil { + it.err = err + return false + } + + iter, hasNext, err := it.nextIter() + if err != nil { + it.err = err + return false + } + + if !hasNext { + return false + } + + it.currIter = iter + } + + it.currDoc = it.currIter.Current() + return true +} + +func (it *iterator) Current() doc.Document { + return it.currDoc +} + +func (it *iterator) Err() error { + return it.err +} + +func (it *iterator) Close() error { + var err error + if it.currIter != nil { + err = it.currIter.Close() + } + return err +} + +// nextIter gets the next document iterator by getting the next postings list from +// the it's searcher and then getting the documents for that postings list from the +// corresponding reader associated with that postings list. +func (it *iterator) nextIter() (doc.Iterator, bool, error) { + it.idx++ + if it.idx >= len(it.readers) { + return nil, false, nil + } + + reader := it.readers[it.idx] + pl, err := it.searcher.Search(reader) + if err != nil { + return nil, false, err + } + + iter, err := reader.Docs(pl) + if err != nil { + return nil, false, err + } + + return iter, true, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/query/all.go b/vendor/github.com/m3db/m3/src/m3ninx/search/query/all.go new file mode 100644 index 00000000..693662f8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/query/all.go @@ -0,0 +1,66 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package query + +import ( + "fmt" + + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/search" + "github.com/m3db/m3/src/m3ninx/search/searcher" +) + +// AllQuery returns a query which matches all known documents. +type AllQuery struct{} + +// NewAllQuery constructs a new AllQuery. +func NewAllQuery() search.Query { + return &AllQuery{} +} + +// Searcher returns a searcher over the provided readers. +func (q *AllQuery) Searcher() (search.Searcher, error) { + return searcher.NewAllSearcher(), nil +} + +// Equal reports whether q is equivalent to o. +func (q *AllQuery) Equal(o search.Query) bool { + o, ok := singular(o) + if !ok { + return false + } + + _, ok = o.(*AllQuery) + return ok +} + +// ToProto returns the Protobuf query struct corresponding to the match all query. +func (q *AllQuery) ToProto() *querypb.Query { + return &querypb.Query{ + Query: &querypb.Query_All{ + All: &querypb.AllQuery{}, + }, + } +} + +func (q *AllQuery) String() string { + return fmt.Sprintf("all()") +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/query/codec.go b/vendor/github.com/m3db/m3/src/m3ninx/search/query/codec.go new file mode 100644 index 00000000..d7fc0a9a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/query/codec.go @@ -0,0 +1,97 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package query + +import ( + "errors" + "fmt" + + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/search" +) + +var errNilQuery = errors.New("query is nil") + +// Marshal encodes a query into a byte slice. +func Marshal(q search.Query) ([]byte, error) { + if q == nil { + return nil, errNilQuery + } + return q.ToProto().Marshal() +} + +// Unmarshal decodes a query from a byte slice. +func Unmarshal(data []byte) (search.Query, error) { + var pb querypb.Query + if err := pb.Unmarshal(data); err != nil { + return nil, err + } + + return unmarshal(&pb) +} + +func unmarshal(q *querypb.Query) (search.Query, error) { + switch q := q.Query.(type) { + + case *querypb.Query_All: + return NewAllQuery(), nil + + case *querypb.Query_Field: + return NewFieldQuery(q.Field.Field), nil + + case *querypb.Query_Term: + return NewTermQuery(q.Term.Field, q.Term.Term), nil + + case *querypb.Query_Regexp: + return NewRegexpQuery(q.Regexp.Field, q.Regexp.Regexp) + + case *querypb.Query_Negation: + inner, err := unmarshal(q.Negation.Query) + if err != nil { + return nil, err + } + return NewNegationQuery(inner), nil + + case *querypb.Query_Conjunction: + qs := make([]search.Query, 0, len(q.Conjunction.Queries)) + for _, qry := range q.Conjunction.Queries { + sqry, err := unmarshal(qry) + if err != nil { + return nil, err + } + qs = append(qs, sqry) + } + return NewConjunctionQuery(qs), nil + + case *querypb.Query_Disjunction: + qs := make([]search.Query, 0, len(q.Disjunction.Queries)) + for _, qry := range q.Disjunction.Queries { + sqry, err := unmarshal(qry) + if err != nil { + return nil, err + } + qs = append(qs, sqry) + } + return NewDisjunctionQuery(qs), nil + } + + return nil, fmt.Errorf("unknown query: %+v", q) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/query/conjunction.go b/vendor/github.com/m3db/m3/src/m3ninx/search/query/conjunction.go new file mode 100644 index 00000000..0b906e4a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/query/conjunction.go @@ -0,0 +1,160 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package query + +import ( + "fmt" + + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/search" + "github.com/m3db/m3/src/m3ninx/search/searcher" +) + +// ConjuctionQuery finds documents which match at least one of the given queries. +type ConjuctionQuery struct { + queries []search.Query + negations []search.Query +} + +// NewConjunctionQuery constructs a new query which matches documents which match all +// of the given queries. +func NewConjunctionQuery(queries []search.Query) search.Query { + qs := make([]search.Query, 0, len(queries)) + ns := make([]search.Query, 0, len(queries)) + for _, query := range queries { + switch query := query.(type) { + case *ConjuctionQuery: + // Merge conjunction queries into slice of top-level queries. + qs = append(qs, query.queries...) + continue + case *NegationQuery: + ns = append(ns, query.query) + default: + qs = append(qs, query) + } + } + + if len(qs) == 0 && len(ns) > 0 { + // We need to ensure we have at least one non-negation query from which we can calculate + // the set difference with the other negation queries. + qs = append(qs, queries[0]) + ns = ns[1:] + } + + return &ConjuctionQuery{ + queries: qs, + negations: ns, + } +} + +// Searcher returns a searcher over the provided readers. +func (q *ConjuctionQuery) Searcher() (search.Searcher, error) { + switch { + case len(q.queries) == 0: + return searcher.NewEmptySearcher(), nil + + case len(q.queries) == 1 && len(q.negations) == 0: + return q.queries[0].Searcher() + } + + qsrs := make(search.Searchers, 0, len(q.queries)) + for _, q := range q.queries { + sr, err := q.Searcher() + if err != nil { + return nil, err + } + qsrs = append(qsrs, sr) + } + + nsrs := make(search.Searchers, 0, len(q.negations)) + for _, q := range q.negations { + sr, err := q.Searcher() + if err != nil { + return nil, err + } + nsrs = append(nsrs, sr) + } + + return searcher.NewConjunctionSearcher(qsrs, nsrs) +} + +// Equal reports whether q is equivalent to o. +func (q *ConjuctionQuery) Equal(o search.Query) bool { + if len(q.queries) == 1 && len(q.negations) == 0 { + return q.queries[0].Equal(o) + } + + inner, ok := o.(*ConjuctionQuery) + if !ok { + return false + } + + if len(q.queries) != len(inner.queries) { + return false + } + + if len(q.negations) != len(inner.negations) { + return false + } + + // TODO: Should order matter? + for i := range q.queries { + if !q.queries[i].Equal(inner.queries[i]) { + return false + } + } + + for i := range q.negations { + if !q.negations[i].Equal(inner.negations[i]) { + return false + } + } + + return true +} + +// ToProto returns the Protobuf query struct corresponding to the conjunction query. +func (q *ConjuctionQuery) ToProto() *querypb.Query { + qs := make([]*querypb.Query, 0, len(q.queries)+len(q.negations)) + + for _, qry := range q.queries { + qs = append(qs, qry.ToProto()) + } + + for _, qry := range q.negations { + neg := NewNegationQuery(qry) + qs = append(qs, neg.ToProto()) + } + + conj := querypb.ConjunctionQuery{Queries: qs} + return &querypb.Query{ + Query: &querypb.Query_Conjunction{Conjunction: &conj}, + } +} + +func (q *ConjuctionQuery) String() string { + if len(q.negations) > 0 { + return fmt.Sprintf("conjunction(%s,%s)", + join(q.queries), joinNegation(q.negations)) + } + + return fmt.Sprintf("conjunction(%s)", join(q.queries)) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/query/disjunction.go b/vendor/github.com/m3db/m3/src/m3ninx/search/query/disjunction.go new file mode 100644 index 00000000..6904c3b9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/query/disjunction.go @@ -0,0 +1,116 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package query + +import ( + "fmt" + + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/search" + "github.com/m3db/m3/src/m3ninx/search/searcher" +) + +// DisjuctionQuery finds documents which match at least one of the given queries. +type DisjuctionQuery struct { + queries []search.Query +} + +// NewDisjunctionQuery constructs a new query which matches documents that match any +// of the given queries. +func NewDisjunctionQuery(queries []search.Query) search.Query { + qs := make([]search.Query, 0, len(queries)) + for _, query := range queries { + // Merge disjunction queries into slice of top-level queries. + q, ok := query.(*DisjuctionQuery) + if ok { + qs = append(qs, q.queries...) + continue + } + + qs = append(qs, query) + } + return &DisjuctionQuery{ + queries: qs, + } +} + +// Searcher returns a searcher over the provided readers. +func (q *DisjuctionQuery) Searcher() (search.Searcher, error) { + switch len(q.queries) { + case 0: + return searcher.NewEmptySearcher(), nil + + case 1: + return q.queries[0].Searcher() + } + + srs := make(search.Searchers, 0, len(q.queries)) + for _, q := range q.queries { + sr, err := q.Searcher() + if err != nil { + return nil, err + } + srs = append(srs, sr) + } + + return searcher.NewDisjunctionSearcher(srs) +} + +// Equal reports whether q is equivalent to o. +func (q *DisjuctionQuery) Equal(o search.Query) bool { + if len(q.queries) == 1 { + return q.queries[0].Equal(o) + } + + inner, ok := o.(*DisjuctionQuery) + if !ok { + return false + } + + if len(q.queries) != len(inner.queries) { + return false + } + + // TODO: Should order matter? + for i := range q.queries { + if !q.queries[i].Equal(inner.queries[i]) { + return false + } + } + return true +} + +// ToProto returns the Protobuf query struct corresponding to the disjunction query. +func (q *DisjuctionQuery) ToProto() *querypb.Query { + qs := make([]*querypb.Query, 0, len(q.queries)) + for _, qry := range q.queries { + qs = append(qs, qry.ToProto()) + } + disj := querypb.DisjunctionQuery{Queries: qs} + + return &querypb.Query{ + Query: &querypb.Query_Disjunction{Disjunction: &disj}, + } +} + +func (q *DisjuctionQuery) String() string { + return fmt.Sprintf("disjunction(%s)", join(q.queries)) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/query/field.go b/vendor/github.com/m3db/m3/src/m3ninx/search/query/field.go new file mode 100644 index 00000000..882f6bae --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/query/field.go @@ -0,0 +1,82 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package query + +import ( + "bytes" + "fmt" + + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/search" + "github.com/m3db/m3/src/m3ninx/search/searcher" +) + +// FieldQuery finds document which have the given field exactly. +type FieldQuery struct { + field []byte +} + +// NewFieldQuery constructs a new FieldQuery for the given field. +func NewFieldQuery(field []byte) search.Query { + return &FieldQuery{ + field: field, + } +} + +// Field returns the field []byte. +func (q *FieldQuery) Field() []byte { + return q.field +} + +// Searcher returns a searcher over the provided readers. +func (q *FieldQuery) Searcher() (search.Searcher, error) { + return searcher.NewFieldSearcher(q.field) +} + +// Equal reports whether q is equivalent to o. +func (q *FieldQuery) Equal(o search.Query) bool { + o, ok := singular(o) + if !ok { + return false + } + + inner, ok := o.(*FieldQuery) + if !ok { + return false + } + + return bytes.Equal(q.field, inner.field) +} + +// ToProto returns the Protobuf query struct corresponding to the term query. +func (q *FieldQuery) ToProto() *querypb.Query { + term := querypb.FieldQuery{ + Field: q.field, + } + + return &querypb.Query{ + Query: &querypb.Query_Field{Field: &term}, + } +} + +func (q *FieldQuery) String() string { + return fmt.Sprintf("field(%s)", q.field) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/query/negation.go b/vendor/github.com/m3db/m3/src/m3ninx/search/query/negation.go new file mode 100644 index 00000000..c4863dac --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/query/negation.go @@ -0,0 +1,79 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package query + +import ( + "fmt" + + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/search" + "github.com/m3db/m3/src/m3ninx/search/searcher" +) + +// NegationQuery finds document which do not match a given query. +type NegationQuery struct { + query search.Query +} + +// NewNegationQuery constructs a new NegationQuery for the given query. +func NewNegationQuery(q search.Query) search.Query { + return &NegationQuery{ + query: q, + } +} + +// Searcher returns a searcher over the provided readers. +func (q *NegationQuery) Searcher() (search.Searcher, error) { + s, err := q.query.Searcher() + if err != nil { + return nil, err + } + return searcher.NewNegationSearcher(s) +} + +// Equal reports whether q is equivalent to o. +func (q *NegationQuery) Equal(o search.Query) bool { + o, ok := singular(o) + if !ok { + return false + } + + inner, ok := o.(*NegationQuery) + if !ok { + return false + } + + return q.query.Equal(inner.query) +} + +// ToProto returns the Protobuf query struct corresponding to the term query. +func (q *NegationQuery) ToProto() *querypb.Query { + inner := q.query.ToProto() + qry := querypb.NegationQuery{Query: inner} + + return &querypb.Query{ + Query: &querypb.Query_Negation{Negation: &qry}, + } +} + +func (q *NegationQuery) String() string { + return fmt.Sprintf("negation(%s)", q.query) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/query/regexp.go b/vendor/github.com/m3db/m3/src/m3ninx/search/query/regexp.go new file mode 100644 index 00000000..475c4590 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/query/regexp.go @@ -0,0 +1,97 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package query + +import ( + "bytes" + "fmt" + + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/search" + "github.com/m3db/m3/src/m3ninx/search/searcher" +) + +// RegexpQuery finds documents which match the given regular expression. +type RegexpQuery struct { + field []byte + regexp []byte + compiled index.CompiledRegex +} + +// NewRegexpQuery constructs a new query for the given regular expression. +func NewRegexpQuery(field, regexp []byte) (search.Query, error) { + compiled, err := index.CompileRegex(regexp) + if err != nil { + return nil, err + } + + return &RegexpQuery{ + field: field, + regexp: regexp, + compiled: compiled, + }, nil +} + +// MustCreateRegexpQuery is like NewRegexpQuery but panics if the query cannot be created. +func MustCreateRegexpQuery(field, regexp []byte) search.Query { + q, err := NewRegexpQuery(field, regexp) + if err != nil { + panic(err) + } + return q +} + +// Searcher returns a searcher over the provided readers. +func (q *RegexpQuery) Searcher() (search.Searcher, error) { + return searcher.NewRegexpSearcher(q.field, q.compiled), nil +} + +// Equal reports whether q is equivalent to o. +func (q *RegexpQuery) Equal(o search.Query) bool { + o, ok := singular(o) + if !ok { + return false + } + + inner, ok := o.(*RegexpQuery) + if !ok { + return false + } + + return bytes.Equal(q.field, inner.field) && bytes.Equal(q.regexp, inner.regexp) +} + +// ToProto returns the Protobuf query struct corresponding to the regexp query. +func (q *RegexpQuery) ToProto() *querypb.Query { + regexp := querypb.RegexpQuery{ + Field: q.field, + Regexp: q.regexp, + } + + return &querypb.Query{ + Query: &querypb.Query_Regexp{Regexp: ®exp}, + } +} + +func (q *RegexpQuery) String() string { + return fmt.Sprintf("regexp(%s, %s)", q.field, q.regexp) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/query/term.go b/vendor/github.com/m3db/m3/src/m3ninx/search/query/term.go new file mode 100644 index 00000000..6783fe96 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/query/term.go @@ -0,0 +1,80 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package query + +import ( + "bytes" + "fmt" + + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/search" + "github.com/m3db/m3/src/m3ninx/search/searcher" +) + +// TermQuery finds document which match the given term exactly. +type TermQuery struct { + field []byte + term []byte +} + +// NewTermQuery constructs a new TermQuery for the given field and term. +func NewTermQuery(field, term []byte) search.Query { + return &TermQuery{ + field: field, + term: term, + } +} + +// Searcher returns a searcher over the provided readers. +func (q *TermQuery) Searcher() (search.Searcher, error) { + return searcher.NewTermSearcher(q.field, q.term), nil +} + +// Equal reports whether q is equivalent to o. +func (q *TermQuery) Equal(o search.Query) bool { + o, ok := singular(o) + if !ok { + return false + } + + inner, ok := o.(*TermQuery) + if !ok { + return false + } + + return bytes.Equal(q.field, inner.field) && bytes.Equal(q.term, inner.term) +} + +// ToProto returns the Protobuf query struct corresponding to the term query. +func (q *TermQuery) ToProto() *querypb.Query { + term := querypb.TermQuery{ + Field: q.field, + Term: q.term, + } + + return &querypb.Query{ + Query: &querypb.Query_Term{Term: &term}, + } +} + +func (q *TermQuery) String() string { + return fmt.Sprintf("term(%s, %s)", q.field, q.term) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/query/util.go b/vendor/github.com/m3db/m3/src/m3ninx/search/query/util.go new file mode 100644 index 00000000..f162e12c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/query/util.go @@ -0,0 +1,93 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package query + +import ( + "bytes" + "fmt" + + "github.com/m3db/m3/src/m3ninx/search" +) + +const ( + separator = ", " + negationPrefix = "negation(" + negationSeparator = "), negation(" + negationPostfix = ")" +) + +// singular returns a bool indicating whether a given query is composed of a single +// query and returns that query if so. +func singular(q search.Query) (search.Query, bool) { + switch q := q.(type) { + case *ConjuctionQuery: + if len(q.queries) == 1 { + return q.queries[0], true + } + return nil, false + case *DisjuctionQuery: + if len(q.queries) == 1 { + return q.queries[0], true + } + return nil, false + } + return q, true +} + +// join concatenates a slice of queries. +func join(qs []search.Query) string { + switch len(qs) { + case 0: + return "" + case 1: + return qs[0].String() + } + + var b bytes.Buffer + b.WriteString(qs[0].String()) + for _, q := range qs[1:] { + b.WriteString(separator) + b.WriteString(q.String()) + } + + return b.String() +} + +// joinNegation concatenates a slice of negated queries. +func joinNegation(qs []search.Query) string { + switch len(qs) { + case 0: + return "" + case 1: + return fmt.Sprintf("%s%s%s", negationPrefix, qs[0].String(), negationPostfix) + } + + var b bytes.Buffer + b.WriteString(negationPrefix) + b.WriteString(qs[0].String()) + for _, q := range qs[1:] { + b.WriteString(negationSeparator) + b.WriteString(q.String()) + } + + b.WriteString(negationPostfix) + return b.String() +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/search_mock.go b/vendor/github.com/m3db/m3/src/m3ninx/search/search_mock.go new file mode 100644 index 00000000..3f2e8864 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/search_mock.go @@ -0,0 +1,206 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/m3ninx/search/types.go + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package search is a generated GoMock package. +package search + +import ( + "reflect" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" + + "github.com/golang/mock/gomock" +) + +// MockExecutor is a mock of Executor interface +type MockExecutor struct { + ctrl *gomock.Controller + recorder *MockExecutorMockRecorder +} + +// MockExecutorMockRecorder is the mock recorder for MockExecutor +type MockExecutorMockRecorder struct { + mock *MockExecutor +} + +// NewMockExecutor creates a new mock instance +func NewMockExecutor(ctrl *gomock.Controller) *MockExecutor { + mock := &MockExecutor{ctrl: ctrl} + mock.recorder = &MockExecutorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockExecutor) EXPECT() *MockExecutorMockRecorder { + return m.recorder +} + +// Execute mocks base method +func (m *MockExecutor) Execute(q Query) (doc.Iterator, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Execute", q) + ret0, _ := ret[0].(doc.Iterator) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Execute indicates an expected call of Execute +func (mr *MockExecutorMockRecorder) Execute(q interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Execute", reflect.TypeOf((*MockExecutor)(nil).Execute), q) +} + +// Close mocks base method +func (m *MockExecutor) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockExecutorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockExecutor)(nil).Close)) +} + +// MockQuery is a mock of Query interface +type MockQuery struct { + ctrl *gomock.Controller + recorder *MockQueryMockRecorder +} + +// MockQueryMockRecorder is the mock recorder for MockQuery +type MockQueryMockRecorder struct { + mock *MockQuery +} + +// NewMockQuery creates a new mock instance +func NewMockQuery(ctrl *gomock.Controller) *MockQuery { + mock := &MockQuery{ctrl: ctrl} + mock.recorder = &MockQueryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockQuery) EXPECT() *MockQueryMockRecorder { + return m.recorder +} + +// String mocks base method +func (m *MockQuery) String() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "String") + ret0, _ := ret[0].(string) + return ret0 +} + +// String indicates an expected call of String +func (mr *MockQueryMockRecorder) String() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockQuery)(nil).String)) +} + +// Searcher mocks base method +func (m *MockQuery) Searcher() (Searcher, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Searcher") + ret0, _ := ret[0].(Searcher) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Searcher indicates an expected call of Searcher +func (mr *MockQueryMockRecorder) Searcher() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Searcher", reflect.TypeOf((*MockQuery)(nil).Searcher)) +} + +// Equal mocks base method +func (m *MockQuery) Equal(q Query) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", q) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockQueryMockRecorder) Equal(q interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockQuery)(nil).Equal), q) +} + +// ToProto mocks base method +func (m *MockQuery) ToProto() *querypb.Query { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ToProto") + ret0, _ := ret[0].(*querypb.Query) + return ret0 +} + +// ToProto indicates an expected call of ToProto +func (mr *MockQueryMockRecorder) ToProto() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ToProto", reflect.TypeOf((*MockQuery)(nil).ToProto)) +} + +// MockSearcher is a mock of Searcher interface +type MockSearcher struct { + ctrl *gomock.Controller + recorder *MockSearcherMockRecorder +} + +// MockSearcherMockRecorder is the mock recorder for MockSearcher +type MockSearcherMockRecorder struct { + mock *MockSearcher +} + +// NewMockSearcher creates a new mock instance +func NewMockSearcher(ctrl *gomock.Controller) *MockSearcher { + mock := &MockSearcher{ctrl: ctrl} + mock.recorder = &MockSearcherMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSearcher) EXPECT() *MockSearcherMockRecorder { + return m.recorder +} + +// Search mocks base method +func (m *MockSearcher) Search(arg0 index.Reader) (postings.List, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Search", arg0) + ret0, _ := ret[0].(postings.List) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Search indicates an expected call of Search +func (mr *MockSearcherMockRecorder) Search(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Search", reflect.TypeOf((*MockSearcher)(nil).Search), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/all.go b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/all.go new file mode 100644 index 00000000..43b1b9d1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/all.go @@ -0,0 +1,38 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package searcher + +import ( + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/search" +) + +type all struct{} + +// NewAllSearcher returns a new searcher for matching all documents. +func NewAllSearcher() search.Searcher { + return &all{} +} + +func (s *all) Search(r index.Reader) (postings.List, error) { + return r.MatchAll() +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/conjunction.go b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/conjunction.go new file mode 100644 index 00000000..1473bc82 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/conjunction.go @@ -0,0 +1,88 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package searcher + +import ( + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/search" +) + +type conjunctionSearcher struct { + searchers search.Searchers + negations search.Searchers +} + +// NewConjunctionSearcher returns a new Searcher which matches documents which match each +// of the given searchers and none of the negations. +func NewConjunctionSearcher(searchers, negations search.Searchers) (search.Searcher, error) { + if len(searchers) == 0 { + return nil, errEmptySearchers + } + + return &conjunctionSearcher{ + searchers: searchers, + negations: negations, + }, nil +} + +func (s *conjunctionSearcher) Search(r index.Reader) (postings.List, error) { + var pl postings.MutableList + for _, sr := range s.searchers { + curr, err := sr.Search(r) + if err != nil { + return nil, err + } + + // TODO: Sort the iterators so that we take the intersection in order of increasing size. + if pl == nil { + pl = curr.Clone() + } else { + if err := pl.Intersect(curr); err != nil { + return nil, err + } + } + + // We can break early if the interescted postings list is ever empty. + if pl.IsEmpty() { + break + } + } + + for _, sr := range s.negations { + curr, err := sr.Search(r) + if err != nil { + return nil, err + } + + // TODO: Sort the iterators so that we take the set differences in order of decreasing size. + if err := pl.Difference(curr); err != nil { + return nil, err + } + + // We can break early if the interescted postings list is ever empty. + if pl.IsEmpty() { + break + } + } + + return pl, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/disjunction.go b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/disjunction.go new file mode 100644 index 00000000..0cb77e7e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/disjunction.go @@ -0,0 +1,61 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package searcher + +import ( + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/search" +) + +type disjunctionSearcher struct { + searchers search.Searchers +} + +// NewDisjunctionSearcher returns a new Searcher which matches documents which are matched +// by any of the given Searchers. +func NewDisjunctionSearcher(searchers search.Searchers) (search.Searcher, error) { + if len(searchers) == 0 { + return nil, errEmptySearchers + } + + return &disjunctionSearcher{ + searchers: searchers, + }, nil +} + +func (s *disjunctionSearcher) Search(r index.Reader) (postings.List, error) { + var pl postings.MutableList + for _, sr := range s.searchers { + curr, err := sr.Search(r) + if err != nil { + return nil, err + } + + // TODO: Sort the iterators so that we take the union in order of decreasing size. + if pl == nil { + pl = curr.Clone() + } else { + pl.Union(curr) + } + } + return pl, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/empty.go b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/empty.go new file mode 100644 index 00000000..e2298c01 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/empty.go @@ -0,0 +1,43 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package searcher + +import ( + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/postings/roaring" + "github.com/m3db/m3/src/m3ninx/search" +) + +type emptySearcher struct { + postings postings.List +} + +// NewEmptySearcher returns a new searcher which always returns an empty postings list. +func NewEmptySearcher() search.Searcher { + return &emptySearcher{ + postings: roaring.NewPostingsList(), + } +} + +func (s *emptySearcher) Search(r index.Reader) (postings.List, error) { + return s.postings, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/errors.go b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/errors.go new file mode 100644 index 00000000..16ae3f3c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/errors.go @@ -0,0 +1,29 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package searcher + +import ( + "errors" +) + +var ( + errEmptySearchers = errors.New("list of searchers cannot be empty in a composite searcher") +) diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/field.go b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/field.go new file mode 100644 index 00000000..20446fcf --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/field.go @@ -0,0 +1,42 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package searcher + +import ( + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/search" +) + +type fieldSearcher struct { + field []byte +} + +// NewFieldSearcher returns a new searcher for finding documents which match the given field. +func NewFieldSearcher(field []byte) (search.Searcher, error) { + return &fieldSearcher{ + field: field, + }, nil +} + +func (s *fieldSearcher) Search(r index.Reader) (postings.List, error) { + return r.MatchField(s.field) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/negation.go b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/negation.go new file mode 100644 index 00000000..5df70c4e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/negation.go @@ -0,0 +1,54 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package searcher + +import ( + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/search" +) + +type negationSearcher struct { + searcher search.Searcher +} + +// NewNegationSearcher returns a new searcher for finding documents which do not match a +// given query. +func NewNegationSearcher(s search.Searcher) (search.Searcher, error) { + return &negationSearcher{ + searcher: s, + }, nil +} + +func (s *negationSearcher) Search(r index.Reader) (postings.List, error) { + pl, err := r.MatchAll() + if err != nil { + return nil, err + } + + sPl, err := s.searcher.Search(r) + if err != nil { + return nil, err + } + + pl.Difference(sPl) + return pl, nil +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/regexp.go b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/regexp.go new file mode 100644 index 00000000..f4c1688d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/regexp.go @@ -0,0 +1,45 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package searcher + +import ( + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/search" +) + +type regexpSearcher struct { + field []byte + compiled index.CompiledRegex +} + +// NewRegexpSearcher returns a new searcher for finding documents which match the given regular +// expression. +func NewRegexpSearcher(field []byte, compiled index.CompiledRegex) search.Searcher { + return ®expSearcher{ + field: field, + compiled: compiled, + } +} + +func (s *regexpSearcher) Search(r index.Reader) (postings.List, error) { + return r.MatchRegexp(s.field, s.compiled) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/term.go b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/term.go new file mode 100644 index 00000000..b550e121 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/searcher/term.go @@ -0,0 +1,43 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package searcher + +import ( + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" + "github.com/m3db/m3/src/m3ninx/search" +) + +type termSearcher struct { + field, term []byte +} + +// NewTermSearcher returns a new searcher for finding documents which match the given term. +func NewTermSearcher(field, term []byte) search.Searcher { + return &termSearcher{ + field: field, + term: term, + } +} + +func (s *termSearcher) Search(r index.Reader) (postings.List, error) { + return r.MatchTerm(s.field, s.term) +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/search/types.go b/vendor/github.com/m3db/m3/src/m3ninx/search/types.go new file mode 100644 index 00000000..d4fc76b4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/search/types.go @@ -0,0 +1,63 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package search + +import ( + "fmt" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/m3ninx/generated/proto/querypb" + "github.com/m3db/m3/src/m3ninx/index" + "github.com/m3db/m3/src/m3ninx/postings" +) + +// Executor is responsible for executing queries over a snapshot. +type Executor interface { + // Execute executes a query over the Executor's snapshot. + Execute(q Query) (doc.Iterator, error) + + // Close closes the iterator. + Close() error +} + +// Query is a search query for documents. +type Query interface { + fmt.Stringer + + // Searcher returns a Searcher for executing the query. + Searcher() (Searcher, error) + + // Equal reports whether two queries are equivalent. + Equal(q Query) bool + + // ToProto returns the Protobuf query struct corresponding to this query. + ToProto() *querypb.Query +} + +// Searcher executes a query against a given Reader. It returns the postings lists +// of the documents it matches for the given segment. +type Searcher interface { + // Search executes a configured query against the given Reader. + Search(index.Reader) (postings.List, error) +} + +// Searchers is a slice of Searcher. +type Searchers []Searcher diff --git a/vendor/github.com/m3db/m3/src/m3ninx/util/docs.go b/vendor/github.com/m3db/m3/src/m3ninx/util/docs.go new file mode 100644 index 00000000..1be1a1fc --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/util/docs.go @@ -0,0 +1,87 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package util + +import ( + "bufio" + "encoding/json" + "fmt" + "os" + + "github.com/m3db/m3/src/m3ninx/doc" +) + +// ReadDocs reads up to n documents from a JSON formatted file at the provided path. +// It is useful for getting a set of documents to run tests with. +func ReadDocs(path string, n int) ([]doc.Document, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + var ( + docs []doc.Document + scanner = bufio.NewScanner(f) + ) + for scanner.Scan() && len(docs) < n { + var fieldsMap map[string]string + if err := json.Unmarshal(scanner.Bytes(), &fieldsMap); err != nil { + return nil, err + } + + // Generate a new random UUID for the document. + id, err := NewUUID() + if err != nil { + return nil, err + } + + fields := make([]doc.Field, 0, len(fieldsMap)) + for k, v := range fieldsMap { + if len(k) == 0 || len(v) == 0 { + continue + } + fields = append(fields, doc.Field{ + Name: []byte(k), + Value: []byte(v), + }) + } + docs = append(docs, doc.Document{ + ID: id, + Fields: fields, + }) + } + + if len(docs) != n { + return nil, fmt.Errorf("requested %d metrics but found %d", n, len(docs)) + } + + return docs, nil +} + +// MustReadDocs calls ReadDocs and panics if there is an error. +func MustReadDocs(path string, n int) []doc.Document { + docs, err := ReadDocs(path, n) + if err != nil { + panic(err) + } + return docs +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/util/uuid.go b/vendor/github.com/m3db/m3/src/m3ninx/util/uuid.go new file mode 100644 index 00000000..180b4278 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/util/uuid.go @@ -0,0 +1,56 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package util + +import ( + "encoding/base64" + "errors" + + "github.com/satori/go.uuid" +) + +var errUUIDForbidden = errors.New("generating UUIDs is forbidden") + +var encodedLen = base64.StdEncoding.EncodedLen(uuid.Size) + +// NewUUIDFn is a function for creating new UUIDs. +type NewUUIDFn func() ([]byte, error) + +// NewUUID returns a new UUID. +func NewUUID() ([]byte, error) { + // TODO: V4 UUIDs are randomly generated. It would be more efficient to instead + // use time-based UUIDs so the prefixes of the UUIDs are similar. V1 UUIDs use + // the current timestamp and the server's MAC address but the latter isn't + // guaranteed to be unique since we may have multiple processes running on the + // same host. Elasticsearch uses Flake IDs which ensure uniqueness by requiring + // an initial coordination step and we may want to consider doing the same. + uuid := uuid.NewV4().Bytes() + + buf := make([]byte, encodedLen) + base64.StdEncoding.Encode(buf, uuid) + return buf, nil +} + +// NewUUIDForbidden is NewUUIDFn which always returns an error in the case that +// UUIDs are forbidden. +func NewUUIDForbidden() ([]byte, error) { + return nil, errUUIDForbidden +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/x/bytes/slice_arraypool_gen.go b/vendor/github.com/m3db/m3/src/m3ninx/x/bytes/slice_arraypool_gen.go new file mode 100644 index 00000000..e4cbc421 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/x/bytes/slice_arraypool_gen.go @@ -0,0 +1,127 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package bytes + +import ( + "github.com/m3db/m3/src/x/pool" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// SliceArrayPool provides a pool for []byte slices. +type SliceArrayPool interface { + // Init initializes the array pool, it needs to be called + // before Get/Put use. + Init() + + // Get returns the a slice from the pool. + Get() [][]byte + + // Put returns the provided slice to the pool. + Put(elems [][]byte) +} + +type SliceFinalizeFn func([][]byte) [][]byte + +type SliceArrayPoolOpts struct { + Options pool.ObjectPoolOptions + Capacity int + MaxCapacity int + FinalizeFn SliceFinalizeFn +} + +type SliceArrPool struct { + opts SliceArrayPoolOpts + pool pool.ObjectPool +} + +func NewSliceArrayPool(opts SliceArrayPoolOpts) SliceArrayPool { + if opts.FinalizeFn == nil { + opts.FinalizeFn = defaultSliceFinalizerFn + } + p := pool.NewObjectPool(opts.Options) + return &SliceArrPool{opts, p} +} + +func (p *SliceArrPool) Init() { + p.pool.Init(func() interface{} { + return make([][]byte, 0, p.opts.Capacity) + }) +} + +func (p *SliceArrPool) Get() [][]byte { + return p.pool.Get().([][]byte) +} + +func (p *SliceArrPool) Put(arr [][]byte) { + arr = p.opts.FinalizeFn(arr) + if max := p.opts.MaxCapacity; max > 0 && cap(arr) > max { + return + } + p.pool.Put(arr) +} + +func defaultSliceFinalizerFn(elems [][]byte) [][]byte { + var empty []byte + for i := range elems { + elems[i] = empty + } + elems = elems[:0] + return elems +} + +type SliceArr [][]byte + +func (elems SliceArr) grow(n int) [][]byte { + if cap(elems) < n { + elems = make([][]byte, n) + } + elems = elems[:n] + // following compiler optimized memcpy impl + // https://github.com/golang/go/wiki/CompilerOptimizations#optimized-memclr + var empty []byte + for i := range elems { + elems[i] = empty + } + return elems +} diff --git a/vendor/github.com/m3db/m3/src/m3ninx/x/safe_closer.go b/vendor/github.com/m3db/m3/src/m3ninx/x/safe_closer.go new file mode 100644 index 00000000..69de7cd9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/m3ninx/x/safe_closer.go @@ -0,0 +1,70 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package x + +import ( + "io" + + xerrors "github.com/m3db/m3/src/x/errors" +) + +// NewSafeCloser returns a io.Closer which ensures the +// underlying Close() is only called once. It's +// useful for cleanup of resources in functions. +func NewSafeCloser(x io.Closer) io.Closer { + return &safeCloser{Closer: x} +} + +// safeCloser ensures Close() is only called once. It's +// useful for cleanup of resources in functions. +type safeCloser struct { + io.Closer + closed bool +} + +// Close guarantees the underlying Closable's Close() is +// only executed the first time it's called. +func (c *safeCloser) Close() error { + if c.closed { + return nil + } + c.closed = true + return c.Closer.Close() +} + +// NewSafeMultiCloser returns an io.Closer which ensures the that calling Close() on it +// calls Close() on each of the provided io.Closer(s) exactly once. Subsequent calls +// are not executed. +func NewSafeMultiCloser(closers ...io.Closer) io.Closer { + return NewSafeCloser(ioClosers(closers)) +} + +type ioClosers []io.Closer + +var _ io.Closer = ioClosers{} + +func (ioc ioClosers) Close() error { + var multiErr xerrors.MultiError + for _, c := range ioc { + multiErr = multiErr.Add(c.Close()) + } + return multiErr.FinalError() +} diff --git a/vendor/github.com/m3db/m3/src/metrics/aggregation/id.go b/vendor/github.com/m3db/m3/src/metrics/aggregation/id.go new file mode 100644 index 00000000..ceef5d6d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/aggregation/id.go @@ -0,0 +1,174 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package aggregation + +import ( + "encoding/json" + "fmt" + + "github.com/m3db/m3/src/metrics/generated/proto/aggregationpb" +) + +const ( + // IDLen is the length of the ID. + // The IDLen will be 1 when maxTypeID <= 63. + IDLen = (maxTypeID)/64 + 1 + + // ID uses an array of int64 to represent aggregation types. + idBitShift = 6 + idBitMask = 63 +) + +var ( + // DefaultID is a default ID. + DefaultID ID +) + +// ID represents a compressed view of Types. +type ID [IDLen]uint64 + +// NewIDFromProto creates an ID from proto. +func NewIDFromProto(input []aggregationpb.AggregationType) (ID, error) { + aggTypes, err := NewTypesFromProto(input) + if err != nil { + return DefaultID, err + } + + // TODO(cw): consider pooling these compressors, + // this allocates one extra slice of length one per call. + id, err := NewIDCompressor().Compress(aggTypes) + if err != nil { + return DefaultID, err + } + return id, nil +} + +// IsDefault checks if the ID is the default aggregation type. +func (id ID) IsDefault() bool { + return id == DefaultID +} + +// Equal checks whether two IDs are considered equal. +func (id ID) Equal(other ID) bool { + return id == other +} + +// Contains checks if the given aggregation type is contained in the aggregation id. +func (id ID) Contains(aggType Type) bool { + if !aggType.IsValid() { + return false + } + idx := int(aggType) >> idBitShift // aggType / 64 + offset := uint(aggType) & idBitMask // aggType % 64 + return (id[idx] & (1 << offset)) > 0 +} + +// Types returns the aggregation types defined by the id. +func (id ID) Types() (Types, error) { + return NewIDDecompressor().Decompress(id) +} + +// String is a string representation of the ID. +func (id ID) String() string { + aggTypes, err := id.Types() + if err != nil { + return fmt.Sprintf("[invalid ID: %v]", err) + } + return aggTypes.String() +} + +// MarshalJSON returns the JSON encoding of an ID. +func (id ID) MarshalJSON() ([]byte, error) { + aggTypes, err := id.Types() + if err != nil { + return nil, fmt.Errorf("invalid aggregation id %v: %v", id, err) + } + return json.Marshal(aggTypes) +} + +// UnmarshalJSON unmarshals JSON-encoded data into an ID. +func (id *ID) UnmarshalJSON(data []byte) error { + var aggTypes Types + if err := json.Unmarshal(data, &aggTypes); err != nil { + return err + } + tid, err := CompressTypes(aggTypes...) + if err != nil { + return fmt.Errorf("invalid aggregation types %v: %v", aggTypes, err) + } + *id = tid + return nil +} + +func (id ID) MarshalYAML() (interface{}, error) { + aggTypes, err := id.Types() + if err != nil { + return nil, fmt.Errorf("invalid aggregation id %v: %v", id, err) + } + return aggTypes, nil +} + +// UnmarshalYAML unmarshals YAML-encoded data into an ID. +func (id *ID) UnmarshalYAML(unmarshal func(interface{}) error) error { + var aggTypes Types + if err := unmarshal(&aggTypes); err != nil { + return err + } + tid, err := CompressTypes(aggTypes...) + if err != nil { + return fmt.Errorf("invalid aggregation types %v: %v", aggTypes, err) + } + *id = tid + return nil +} + +// ToProto converts the aggregation id to a protobuf message in place. +func (id ID) ToProto(pb *aggregationpb.AggregationID) error { + if IDLen != 1 { + return fmt.Errorf("id length %d cannot be represented by a single integer", IDLen) + } + pb.Id = id[0] + return nil +} + +// FromProto converts the protobuf message to an aggregation id in place. +func (id *ID) FromProto(pb aggregationpb.AggregationID) error { + if IDLen != 1 { + return fmt.Errorf("id length %d cannot be represented by a single integer", IDLen) + } + (*id)[0] = pb.Id + return nil +} + +// CompressTypes compresses a list of aggregation types to an ID. +func CompressTypes(aggTypes ...Type) (ID, error) { + return NewIDCompressor().Compress(aggTypes) +} + +// MustCompressTypes compresses a list of aggregation types to +// an ID, it panics if an error was encountered. +func MustCompressTypes(aggTypes ...Type) ID { + res, err := CompressTypes(aggTypes...) + if err != nil { + panic(err) + } + return res +} diff --git a/vendor/github.com/m3db/m3/src/metrics/aggregation/id_compress.go b/vendor/github.com/m3db/m3/src/metrics/aggregation/id_compress.go new file mode 100644 index 00000000..f2beb0eb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/aggregation/id_compress.go @@ -0,0 +1,145 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package aggregation + +import ( + "fmt" + + "github.com/willf/bitset" +) + +// IDCompressor can compress Types into an ID. +type IDCompressor interface { + // Compress compresses a set of aggregation types into an aggregation id. + Compress(aggTypes Types) (ID, error) + + // MustCompress compresses a set of aggregation types into an aggregation id, + // and panics if an error is encountered. + MustCompress(aggTypes Types) ID +} + +// IDDecompressor can decompress ID. +type IDDecompressor interface { + // Decompress decompresses an aggregation id into a set of aggregation types. + Decompress(id ID) (Types, error) + + // MustDecompress decompresses an aggregation id into a set of aggregation types, + // and panics if an error is encountered. + MustDecompress(id ID) Types +} + +type idCompressor struct { + bs *bitset.BitSet +} + +// NewIDCompressor returns a new IDCompressor. +func NewIDCompressor() IDCompressor { + // NB(cw): If we start to support more than 64 types, the library will + // expand the underlying word list itself. + return &idCompressor{ + bs: bitset.New(maxTypeID), + } +} + +func (c *idCompressor) Compress(aggTypes Types) (ID, error) { + c.bs.ClearAll() + for _, aggType := range aggTypes { + if !aggType.IsValid() { + return DefaultID, fmt.Errorf("could not compress invalid Type %v", aggType) + } + c.bs.Set(uint(aggType.ID())) + } + + codes := c.bs.Bytes() + var id ID + // NB(cw) it's guaranteed that len(id) == len(codes) == IDLen, we need to copy + // the words in bitset out because the bitset contains a slice internally. + for i := 0; i < IDLen; i++ { + id[i] = codes[i] + } + return id, nil +} + +func (c *idCompressor) MustCompress(aggTypes Types) ID { + id, err := c.Compress(aggTypes) + if err != nil { + panic(fmt.Errorf("unable to compress %v: %v", aggTypes, err)) + } + return id +} + +type idDecompressor struct { + bs *bitset.BitSet + buf []uint64 + pool TypesPool +} + +// NewIDDecompressor returns a new IDDecompressor. +func NewIDDecompressor() IDDecompressor { + return NewPooledIDDecompressor(nil) +} + +// NewPooledIDDecompressor returns a new pooled TypeDecompressor. +func NewPooledIDDecompressor(pool TypesPool) IDDecompressor { + bs := bitset.New(maxTypeID) + return &idDecompressor{ + bs: bs, + buf: bs.Bytes(), + pool: pool, + } +} + +func (d *idDecompressor) Decompress(id ID) (Types, error) { + if id.IsDefault() { + return DefaultTypes, nil + } + // NB(cw) it's guaranteed that len(c.buf) == len(id) == IDLen, we need to copy + // the words from id into a slice to be used in bitset. + for i := range id { + d.buf[i] = id[i] + } + + var res Types + if d.pool == nil { + res = make(Types, 0, maxTypeID) + } else { + res = d.pool.Get() + } + + for i, e := d.bs.NextSet(0); e; i, e = d.bs.NextSet(i + 1) { + aggType := Type(i) + if !aggType.IsValid() { + return DefaultTypes, fmt.Errorf("invalid Type: %s", aggType.String()) + } + + res = append(res, aggType) + } + + return res, nil +} + +func (d *idDecompressor) MustDecompress(id ID) Types { + aggTypes, err := d.Decompress(id) + if err != nil { + panic(fmt.Errorf("unable to decompress %v: %v", id, err)) + } + return aggTypes +} diff --git a/vendor/github.com/m3db/m3/src/metrics/aggregation/type.go b/vendor/github.com/m3db/m3/src/metrics/aggregation/type.go new file mode 100644 index 00000000..5c991334 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/aggregation/type.go @@ -0,0 +1,419 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package aggregation + +import ( + "fmt" + "strings" + + "github.com/m3db/m3/src/metrics/generated/proto/aggregationpb" + "github.com/m3db/m3/src/x/pool" +) + +// Supported aggregation types. +const ( + UnknownType Type = iota + Last + Min + Max + Mean + Median + Count + Sum + SumSq + Stdev + P10 + P20 + P30 + P40 + P50 + P60 + P70 + P80 + P90 + P95 + P99 + P999 + P9999 + + nextTypeID = iota +) + +const ( + // maxTypeID is the largest id of all the valid aggregation types. + // NB(cw) maxTypeID is guaranteed to be greater or equal + // to len(ValidTypes). + // Iff ids of all the valid aggregation types are consecutive, + // maxTypeID == len(ValidTypes). + maxTypeID = nextTypeID - 1 + + typesSeparator = "," +) + +var ( + emptyStruct struct{} + + // DefaultTypes is a default list of aggregation types. + DefaultTypes Types + + // ValidTypes is the list of all the valid aggregation types. + ValidTypes = map[Type]struct{}{ + Last: emptyStruct, + Min: emptyStruct, + Max: emptyStruct, + Mean: emptyStruct, + Median: emptyStruct, + Count: emptyStruct, + Sum: emptyStruct, + SumSq: emptyStruct, + Stdev: emptyStruct, + P10: emptyStruct, + P20: emptyStruct, + P30: emptyStruct, + P40: emptyStruct, + P50: emptyStruct, + P60: emptyStruct, + P70: emptyStruct, + P80: emptyStruct, + P90: emptyStruct, + P95: emptyStruct, + P99: emptyStruct, + P999: emptyStruct, + P9999: emptyStruct, + } + + typeStringMap map[string]Type +) + +// Type defines an aggregation function. +type Type int + +// NewTypeFromProto creates an aggregation type from a proto. +func NewTypeFromProto(input aggregationpb.AggregationType) (Type, error) { + aggType := Type(input) + if !aggType.IsValid() { + return UnknownType, fmt.Errorf("invalid aggregation type from proto: %s", input) + } + return aggType, nil +} + +// ID returns the id of the Type. +func (a Type) ID() int { + return int(a) +} + +// IsValid checks if an Type is valid. +func (a Type) IsValid() bool { + _, ok := ValidTypes[a] + return ok +} + +// IsValidForGauge if an Type is valid for Gauge. +func (a Type) IsValidForGauge() bool { + switch a { + case Last, Min, Max, Mean, Count, Sum, SumSq, Stdev: + return true + default: + return false + } +} + +// IsValidForCounter if an Type is valid for Counter. +func (a Type) IsValidForCounter() bool { + switch a { + case Min, Max, Mean, Count, Sum, SumSq, Stdev: + return true + default: + return false + } +} + +// IsValidForTimer if an Type is valid for Timer. +func (a Type) IsValidForTimer() bool { + switch a { + case Last: + return false + default: + return true + } +} + +// Quantile returns the quantile represented by the Type. +func (a Type) Quantile() (float64, bool) { + switch a { + case P10: + return 0.1, true + case P20: + return 0.2, true + case P30: + return 0.3, true + case P40: + return 0.4, true + case P50, Median: + return 0.5, true + case P60: + return 0.6, true + case P70: + return 0.7, true + case P80: + return 0.8, true + case P90: + return 0.9, true + case P95: + return 0.95, true + case P99: + return 0.99, true + case P999: + return 0.999, true + case P9999: + return 0.9999, true + default: + return 0, false + } +} + +// Proto returns the proto of the aggregation type. +func (a Type) Proto() (aggregationpb.AggregationType, error) { + s := aggregationpb.AggregationType(a) + if err := validateProtoType(s); err != nil { + return aggregationpb.AggregationType_UNKNOWN, err + } + return s, nil +} + +// UnmarshalYAML unmarshals text-encoded data into an aggregation type. +func (a *Type) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + value, err := ParseType(str) + if err != nil { + return err + } + *a = value + return nil +} + +// MarshalText returns the text encoding of an aggregation type. +func (a Type) MarshalText() ([]byte, error) { + if !a.IsValid() { + return nil, fmt.Errorf("invalid aggregation type %s", a.String()) + } + return []byte(a.String()), nil +} + +// UnmarshalText unmarshals text-encoded data into an aggregation type. +func (a *Type) UnmarshalText(data []byte) error { + str := string(data) + parsed, err := ParseType(str) + if err != nil { + return err + } + *a = parsed + return nil +} + +func validateProtoType(a aggregationpb.AggregationType) error { + _, ok := aggregationpb.AggregationType_name[int32(a)] + if !ok { + return fmt.Errorf("invalid proto aggregation type: %v", a) + } + return nil +} + +// ParseType parses an aggregation type. +func ParseType(str string) (Type, error) { + var ( + aggType Type + exactMatch bool + looseMatch bool + ) + + aggType, exactMatch = typeStringMap[str] + if !exactMatch { + for key, val := range typeStringMap { + if strings.ToLower(key) == strings.ToLower(str) { + looseMatch = true + aggType = val + break + } + } + } + + if !exactMatch && !looseMatch { + return UnknownType, fmt.Errorf("invalid aggregation type: %s", str) + } + return aggType, nil +} + +// Types is a list of Types. +type Types []Type + +// NewTypesFromProto creates a list of aggregation types from a proto. +func NewTypesFromProto(input []aggregationpb.AggregationType) (Types, error) { + res := make([]Type, len(input)) + for i, t := range input { + aggType, err := NewTypeFromProto(t) + if err != nil { + return DefaultTypes, err + } + res[i] = aggType + } + return res, nil +} + +// Contains checks if the given type is contained in the aggregation types. +func (aggTypes Types) Contains(aggType Type) bool { + for _, at := range aggTypes { + if at == aggType { + return true + } + } + return false +} + +// IsDefault checks if the Types is the default aggregation type. +func (aggTypes Types) IsDefault() bool { + return len(aggTypes) == 0 +} + +// String returns the string representation of the list of aggregation types. +func (aggTypes Types) String() string { + if len(aggTypes) == 0 { + return "" + } + + parts := make([]string, len(aggTypes)) + for i, aggType := range aggTypes { + parts[i] = aggType.String() + } + return strings.Join(parts, typesSeparator) +} + +// IsValidForGauge checks if the list of aggregation types is valid for Gauge. +func (aggTypes Types) IsValidForGauge() bool { + for _, aggType := range aggTypes { + if !aggType.IsValidForGauge() { + return false + } + } + return true +} + +// IsValidForCounter checks if the list of aggregation types is valid for Counter. +func (aggTypes Types) IsValidForCounter() bool { + for _, aggType := range aggTypes { + if !aggType.IsValidForCounter() { + return false + } + } + return true +} + +// IsValidForTimer checks if the list of aggregation types is valid for Timer. +func (aggTypes Types) IsValidForTimer() bool { + for _, aggType := range aggTypes { + if !aggType.IsValidForTimer() { + return false + } + } + return true +} + +// PooledQuantiles returns all the quantiles found in the list +// of aggregation types. Using a floats pool if available. +// +// A boolean will also be returned to indicate whether the +// returned float slice is from the pool. +func (aggTypes Types) PooledQuantiles(p pool.FloatsPool) ([]float64, bool) { + var ( + res []float64 + initialized bool + medianAdded bool + pooled bool + ) + for _, aggType := range aggTypes { + q, ok := aggType.Quantile() + if !ok { + continue + } + // Dedup P50 and Median. + if aggType == P50 || aggType == Median { + if medianAdded { + continue + } + medianAdded = true + } + if !initialized { + if p == nil { + res = make([]float64, 0, len(aggTypes)) + } else { + res = p.Get(len(aggTypes)) + pooled = true + } + initialized = true + } + res = append(res, q) + } + return res, pooled +} + +// Proto returns the proto of the aggregation types. +func (aggTypes Types) Proto() ([]aggregationpb.AggregationType, error) { + // This is the same as returning an empty slice from the functionality perspective. + // It makes creating testing fixtures much simpler. + if aggTypes == nil { + return nil, nil + } + + res := make([]aggregationpb.AggregationType, len(aggTypes)) + for i, aggType := range aggTypes { + s, err := aggType.Proto() + if err != nil { + return nil, err + } + res[i] = s + } + + return res, nil +} + +// ParseTypes parses a list of aggregation types in the form of type1,type2,type3. +func ParseTypes(str string) (Types, error) { + parts := strings.Split(str, typesSeparator) + res := make(Types, len(parts)) + for i := range parts { + aggType, err := ParseType(parts[i]) + if err != nil { + return nil, err + } + res[i] = aggType + } + return res, nil +} + +func init() { + typeStringMap = make(map[string]Type, maxTypeID) + for aggType := range ValidTypes { + typeStringMap[aggType.String()] = aggType + } +} diff --git a/vendor/github.com/m3db/m3/src/metrics/aggregation/type_config.go b/vendor/github.com/m3db/m3/src/metrics/aggregation/type_config.go new file mode 100644 index 00000000..7efcb6ec --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/aggregation/type_config.go @@ -0,0 +1,156 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package aggregation + +import ( + "fmt" + + "github.com/m3db/m3/src/x/instrument" + "github.com/m3db/m3/src/x/pool" +) + +// TypesConfiguration contains configuration for aggregation types. +type TypesConfiguration struct { + // Default aggregation types for counter metrics. + DefaultCounterAggregationTypes *Types `yaml:"defaultCounterAggregationTypes"` + + // Default aggregation types for timer metrics. + DefaultTimerAggregationTypes *Types `yaml:"defaultTimerAggregationTypes"` + + // Default aggregation types for gauge metrics. + DefaultGaugeAggregationTypes *Types `yaml:"defaultGaugeAggregationTypes"` + + // CounterTransformFnType configures the type string transformation function for counters. + CounterTransformFnType *transformFnType `yaml:"counterTransformFnType"` + + // TimerTransformFnType configures the type string transformation function for timers. + TimerTransformFnType *transformFnType `yaml:"timerTransformFnType"` + + // GaugeTransformFnType configures the type string transformation function for gauges. + GaugeTransformFnType *transformFnType `yaml:"gaugeTransformFnType"` + + // Pool of aggregation types. + AggregationTypesPool pool.ObjectPoolConfiguration `yaml:"aggregationTypesPool"` + + // Pool of quantile slices. + QuantilesPool pool.BucketizedPoolConfiguration `yaml:"quantilesPool"` +} + +// NewOptions creates a new Option. +func (c TypesConfiguration) NewOptions(instrumentOpts instrument.Options) (TypesOptions, error) { + opts := NewTypesOptions() + if c.DefaultCounterAggregationTypes != nil { + opts = opts.SetDefaultCounterAggregationTypes(*c.DefaultCounterAggregationTypes) + } + if c.DefaultGaugeAggregationTypes != nil { + opts = opts.SetDefaultGaugeAggregationTypes(*c.DefaultGaugeAggregationTypes) + } + if c.DefaultTimerAggregationTypes != nil { + opts = opts.SetDefaultTimerAggregationTypes(*c.DefaultTimerAggregationTypes) + } + if c.CounterTransformFnType != nil { + fn, err := c.CounterTransformFnType.TransformFn() + if err != nil { + return nil, err + } + opts = opts.SetCounterTypeStringTransformFn(fn) + } + if c.TimerTransformFnType != nil { + fn, err := c.TimerTransformFnType.TransformFn() + if err != nil { + return nil, err + } + opts = opts.SetTimerTypeStringTransformFn(fn) + } + if c.GaugeTransformFnType != nil { + fn, err := c.GaugeTransformFnType.TransformFn() + if err != nil { + return nil, err + } + opts = opts.SetGaugeTypeStringTransformFn(fn) + } + + // Set aggregation types pool. + scope := instrumentOpts.MetricsScope() + iOpts := instrumentOpts.SetMetricsScope(scope.SubScope("aggregation-types-pool")) + aggTypesPoolOpts := c.AggregationTypesPool.NewObjectPoolOptions(iOpts) + aggTypesPool := NewTypesPool(aggTypesPoolOpts) + opts = opts.SetTypesPool(aggTypesPool) + aggTypesPool.Init(func() Types { + return make(Types, 0, len(ValidTypes)) + }) + + // Set quantiles pool. + iOpts = instrumentOpts.SetMetricsScope(scope.SubScope("quantile-pool")) + quantilesPool := pool.NewFloatsPool( + c.QuantilesPool.NewBuckets(), + c.QuantilesPool.NewObjectPoolOptions(iOpts), + ) + opts = opts.SetQuantilesPool(quantilesPool) + quantilesPool.Init() + + return opts, nil +} + +type transformFnType string + +var ( + noopTransformType transformFnType = "noop" + emptyTransformType transformFnType = "empty" + suffixTransformType transformFnType = "suffix" + + validTypes = []transformFnType{ + noopTransformType, + emptyTransformType, + suffixTransformType, + } +) + +func (t *transformFnType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + var validStrings []string + for _, validType := range validTypes { + validString := string(validType) + if validString == str { + *t = validType + return nil + } + validStrings = append(validStrings, validString) + } + + return fmt.Errorf("invalid transform type %s, valid types are: %v", str, validStrings) +} + +func (t transformFnType) TransformFn() (TypeStringTransformFn, error) { + switch t { + case noopTransformType: + return NoOpTransform, nil + case emptyTransformType: + return EmptyTransform, nil + case suffixTransformType: + return SuffixTransform, nil + default: + return nil, fmt.Errorf("invalid type string transform function type: %s", string(t)) + } +} diff --git a/vendor/github.com/m3db/m3/src/metrics/aggregation/type_string.go b/vendor/github.com/m3db/m3/src/metrics/aggregation/type_string.go new file mode 100644 index 00000000..d62ed64c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/aggregation/type_string.go @@ -0,0 +1,45 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// generated by stringer -type=Type; DO NOT EDIT + +package aggregation + +import "fmt" + +const _Type_name = "UnknownTypeLastMinMaxMeanMedianCountSumSumSqStdevP10P20P30P40P50P60P70P80P90P95P99P999P9999" + +var _Type_name_bytes = []byte("UnknownTypeLastMinMaxMeanMedianCountSumSumSqStdevP10P20P30P40P50P60P70P80P90P95P99P999P9999") + +var _Type_index = [...]uint8{0, 11, 15, 18, 21, 25, 31, 36, 39, 44, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 86, 91} + +func (i Type) String() string { + if i < 0 || i >= Type(len(_Type_index)-1) { + return fmt.Sprintf("Type(%d)", i) + } + return _Type_name[_Type_index[i]:_Type_index[i+1]] +} + +func (i Type) Bytes() []byte { + if i < 0 || i >= Type(len(_Type_index)-1) { + return []byte(fmt.Sprintf("Type(%d)", i)) + } + return _Type_name_bytes[_Type_index[i]:_Type_index[i+1]] +} diff --git a/vendor/github.com/m3db/m3/src/metrics/aggregation/types_options.go b/vendor/github.com/m3db/m3/src/metrics/aggregation/types_options.go new file mode 100644 index 00000000..cef2663f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/aggregation/types_options.go @@ -0,0 +1,409 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package aggregation + +import ( + "bytes" + "strconv" + "strings" + + "github.com/m3db/m3/src/metrics/metric" + "github.com/m3db/m3/src/x/pool" +) + +// QuantileTypeStringFn returns the type string for a quantile value. +type QuantileTypeStringFn func(quantile float64) []byte + +// TypeStringTransformFn transforms the type string. +type TypeStringTransformFn func(typeString []byte) []byte + +// TypesOptions provides a set of options for aggregation types. +type TypesOptions interface { + // Read-Write methods. + + // SetDefaultCounterAggregationTypes sets the default aggregation types for counters. + SetDefaultCounterAggregationTypes(value Types) TypesOptions + + // DefaultCounterAggregationTypes returns the default aggregation types for counters. + DefaultCounterAggregationTypes() Types + + // SetDefaultTimerAggregationTypes sets the default aggregation types for timers. + SetDefaultTimerAggregationTypes(value Types) TypesOptions + + // DefaultTimerAggregationTypes returns the default aggregation types for timers. + DefaultTimerAggregationTypes() Types + + // SetDefaultGaugeAggregationTypes sets the default aggregation types for gauges. + SetDefaultGaugeAggregationTypes(value Types) TypesOptions + + // DefaultGaugeAggregationTypes returns the default aggregation types for gauges. + DefaultGaugeAggregationTypes() Types + + // SetQuantileTypeStringFn sets the quantile type string function for timers. + SetQuantileTypeStringFn(value QuantileTypeStringFn) TypesOptions + + // QuantileTypeStringFn returns the quantile type string function for timers. + QuantileTypeStringFn() QuantileTypeStringFn + + // SetCounterTypeStringTransformFn sets the transformation function for counter type strings. + SetCounterTypeStringTransformFn(value TypeStringTransformFn) TypesOptions + + // CounterTypeStringTransformFn returns the transformation function for counter type strings. + CounterTypeStringTransformFn() TypeStringTransformFn + + // SetTimerTypeStringTransformFn sets the transformation function for timer type strings. + SetTimerTypeStringTransformFn(value TypeStringTransformFn) TypesOptions + + // TimerTypeStringTransformFn returns the transformation function for timer type strings. + TimerTypeStringTransformFn() TypeStringTransformFn + + // SetGaugeTypeStringTransformFn sets the transformation function for gauge type strings. + SetGaugeTypeStringTransformFn(value TypeStringTransformFn) TypesOptions + + // GaugeTypeStringTransformFn returns the transformation function for gauge type strings. + GaugeTypeStringTransformFn() TypeStringTransformFn + + // SetTypesPool sets the aggregation types pool. + SetTypesPool(pool TypesPool) TypesOptions + + // TypesPool returns the aggregation types pool. + TypesPool() TypesPool + + // SetQuantilesPool sets the timer quantiles pool. + SetQuantilesPool(pool pool.FloatsPool) TypesOptions + + // QuantilesPool returns the timer quantiles pool. + QuantilesPool() pool.FloatsPool + + // Read only methods. + + // TypeStringForCounter returns the type string for the aggregation type for counters. + TypeStringForCounter(value Type) []byte + + // TypeStringForTimer returns the type string for the aggregation type for timers. + TypeStringForTimer(value Type) []byte + + // TypeStringForGauge returns the type string for the aggregation type for gauges. + TypeStringForGauge(value Type) []byte + + // TypeForCounter returns the aggregation type for given counter type string. + TypeForCounter(value []byte) Type + + // TypeForTimer returns the aggregation type for given timer type string. + TypeForTimer(value []byte) Type + + // TypeForGauge returns the aggregation type for given gauge type string. + TypeForGauge(value []byte) Type + + // Quantiles returns the quantiles for timers. + Quantiles() []float64 + + // IsContainedInDefaultAggregationTypes checks if the given aggregation type is + // contained in the default aggregation types for the metric type. + IsContainedInDefaultAggregationTypes(at Type, mt metric.Type) bool +} + +var ( + defaultDefaultCounterAggregationTypes = Types{ + Sum, + } + defaultDefaultTimerAggregationTypes = Types{ + Sum, + SumSq, + Mean, + Min, + Max, + Count, + Stdev, + Median, + P50, + P95, + P99, + } + defaultDefaultGaugeAggregationTypes = Types{ + Last, + } + defaultTypeStringsMap = map[Type][]byte{ + Last: []byte("last"), + Sum: []byte("sum"), + SumSq: []byte("sum_sq"), + Mean: []byte("mean"), + Min: []byte("lower"), + Max: []byte("upper"), + Count: []byte("count"), + Stdev: []byte("stdev"), + Median: []byte("median"), + } +) + +type options struct { + defaultCounterAggregationTypes Types + defaultTimerAggregationTypes Types + defaultGaugeAggregationTypes Types + quantileTypeStringFn QuantileTypeStringFn + counterTypeStringTransformFn TypeStringTransformFn + timerTypeStringTransformFn TypeStringTransformFn + gaugeTypeStringTransformFn TypeStringTransformFn + aggTypesPool TypesPool + quantilesPool pool.FloatsPool + + counterTypeStrings [][]byte + timerTypeStrings [][]byte + gaugeTypeStrings [][]byte + quantiles []float64 +} + +// NewTypesOptions returns a default TypesOptions. +func NewTypesOptions() TypesOptions { + o := &options{ + defaultCounterAggregationTypes: defaultDefaultCounterAggregationTypes, + defaultGaugeAggregationTypes: defaultDefaultGaugeAggregationTypes, + defaultTimerAggregationTypes: defaultDefaultTimerAggregationTypes, + quantileTypeStringFn: defaultQuantileTypeStringFn, + counterTypeStringTransformFn: NoOpTransform, + timerTypeStringTransformFn: NoOpTransform, + gaugeTypeStringTransformFn: NoOpTransform, + } + o.initPools() + o.computeAllDerived() + return o +} + +func (o *options) initPools() { + o.aggTypesPool = NewTypesPool(nil) + o.aggTypesPool.Init(func() Types { + return make(Types, 0, len(ValidTypes)) + }) + + o.quantilesPool = pool.NewFloatsPool(nil, nil) + o.quantilesPool.Init() +} + +func (o *options) SetDefaultCounterAggregationTypes(aggTypes Types) TypesOptions { + opts := *o + opts.defaultCounterAggregationTypes = aggTypes + opts.computeAllDerived() + return &opts +} + +func (o *options) DefaultCounterAggregationTypes() Types { + return o.defaultCounterAggregationTypes +} + +func (o *options) SetDefaultTimerAggregationTypes(aggTypes Types) TypesOptions { + opts := *o + opts.defaultTimerAggregationTypes = aggTypes + opts.computeAllDerived() + return &opts +} + +func (o *options) DefaultTimerAggregationTypes() Types { + return o.defaultTimerAggregationTypes +} + +func (o *options) SetDefaultGaugeAggregationTypes(aggTypes Types) TypesOptions { + opts := *o + opts.defaultGaugeAggregationTypes = aggTypes + opts.computeAllDerived() + return &opts +} + +func (o *options) DefaultGaugeAggregationTypes() Types { + return o.defaultGaugeAggregationTypes +} + +func (o *options) SetQuantileTypeStringFn(value QuantileTypeStringFn) TypesOptions { + opts := *o + opts.quantileTypeStringFn = value + opts.computeAllDerived() + return &opts +} + +func (o *options) QuantileTypeStringFn() QuantileTypeStringFn { + return o.quantileTypeStringFn +} + +func (o *options) SetCounterTypeStringTransformFn(value TypeStringTransformFn) TypesOptions { + opts := *o + opts.counterTypeStringTransformFn = value + opts.computeAllDerived() + return &opts +} + +func (o *options) CounterTypeStringTransformFn() TypeStringTransformFn { + return o.counterTypeStringTransformFn +} + +func (o *options) SetTimerTypeStringTransformFn(value TypeStringTransformFn) TypesOptions { + opts := *o + opts.timerTypeStringTransformFn = value + opts.computeAllDerived() + return &opts +} + +func (o *options) TimerTypeStringTransformFn() TypeStringTransformFn { + return o.timerTypeStringTransformFn +} + +func (o *options) SetGaugeTypeStringTransformFn(value TypeStringTransformFn) TypesOptions { + opts := *o + opts.gaugeTypeStringTransformFn = value + opts.computeAllDerived() + return &opts +} + +func (o *options) GaugeTypeStringTransformFn() TypeStringTransformFn { + return o.gaugeTypeStringTransformFn +} + +func (o *options) SetTypesPool(pool TypesPool) TypesOptions { + opts := *o + opts.aggTypesPool = pool + return &opts +} + +func (o *options) TypesPool() TypesPool { + return o.aggTypesPool +} + +func (o *options) SetQuantilesPool(pool pool.FloatsPool) TypesOptions { + opts := *o + opts.quantilesPool = pool + return &opts +} + +func (o *options) QuantilesPool() pool.FloatsPool { + return o.quantilesPool +} + +func (o *options) TypeStringForCounter(aggType Type) []byte { + return o.counterTypeStrings[aggType.ID()] +} + +func (o *options) TypeStringForTimer(aggType Type) []byte { + return o.timerTypeStrings[aggType.ID()] +} + +func (o *options) TypeStringForGauge(aggType Type) []byte { + return o.gaugeTypeStrings[aggType.ID()] +} + +func (o *options) TypeForCounter(value []byte) Type { + return typeFor(value, o.counterTypeStrings) +} + +func (o *options) TypeForTimer(value []byte) Type { + return typeFor(value, o.timerTypeStrings) +} + +func (o *options) TypeForGauge(value []byte) Type { + return typeFor(value, o.gaugeTypeStrings) +} + +func (o *options) Quantiles() []float64 { + return o.quantiles +} + +func (o *options) IsContainedInDefaultAggregationTypes(at Type, mt metric.Type) bool { + var aggTypes Types + switch mt { + case metric.CounterType: + aggTypes = o.DefaultCounterAggregationTypes() + case metric.GaugeType: + aggTypes = o.DefaultGaugeAggregationTypes() + case metric.TimerType: + aggTypes = o.DefaultTimerAggregationTypes() + } + return aggTypes.Contains(at) +} + +func (o *options) computeAllDerived() { + o.computeQuantiles() + o.computeCounterTypeStrings() + o.computeTimerTypeStrings() + o.computeGaugeTypeStrings() +} + +func (o *options) computeQuantiles() { + o.quantiles, _ = o.DefaultTimerAggregationTypes().PooledQuantiles(o.QuantilesPool()) +} + +func (o *options) computeCounterTypeStrings() { + o.counterTypeStrings = o.computeTypeStrings(o.counterTypeStringTransformFn) +} + +func (o *options) computeTimerTypeStrings() { + o.timerTypeStrings = o.computeTypeStrings(o.timerTypeStringTransformFn) +} + +func (o *options) computeGaugeTypeStrings() { + o.gaugeTypeStrings = o.computeTypeStrings(o.gaugeTypeStringTransformFn) +} + +func (o *options) computeTypeStrings(transformFn TypeStringTransformFn) [][]byte { + res := make([][]byte, maxTypeID+1) + for aggType := range ValidTypes { + var typeString []byte + if typeStr, exist := defaultTypeStringsMap[aggType]; exist { + typeString = typeStr + } else { + q, ok := aggType.Quantile() + if ok { + typeString = o.quantileTypeStringFn(q) + } + } + transformed := transformFn(typeString) + res[aggType.ID()] = transformed + } + return res +} + +func typeFor(value []byte, typeStrings [][]byte) Type { + for id, typeString := range typeStrings { + if !bytes.Equal(value, typeString) { + continue + } + if t := Type(id); t.IsValid() { + return t + } + } + return UnknownType +} + +// By default we use e.g. "p50", "p95", "p99" for the 50th/95th/99th percentile. +func defaultQuantileTypeStringFn(quantile float64) []byte { + str := strconv.FormatFloat(quantile*100, 'f', -1, 64) + idx := strings.Index(str, ".") + if idx != -1 { + str = str[:idx] + str[idx+1:] + } + return []byte("p" + str) +} + +// NoOpTransform returns the input byte slice as is. +func NoOpTransform(b []byte) []byte { return b } + +// EmptyTransform transforms the input byte slice to an empty byte slice. +func EmptyTransform(b []byte) []byte { return nil } + +// SuffixTransform transforms the input byte slice to a suffix by prepending +// a dot at the beginning. +func SuffixTransform(b []byte) []byte { return append([]byte("."), b...) } diff --git a/vendor/github.com/m3db/m3/src/metrics/aggregation/types_pool.go b/vendor/github.com/m3db/m3/src/metrics/aggregation/types_pool.go new file mode 100644 index 00000000..4bc3e9f9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/aggregation/types_pool.go @@ -0,0 +1,61 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package aggregation + +import "github.com/m3db/m3/src/x/pool" + +// TypesAlloc allocates new aggregation types. +type TypesAlloc func() Types + +// TypesPool provides a pool of aggregation types. +type TypesPool interface { + // Init initializes the aggregation types pool. + Init(alloc TypesAlloc) + + // Get gets an empty list of aggregation types from the pool. + Get() Types + + // Put returns aggregation types to the pool. + Put(value Types) +} + +type typesPool struct { + pool pool.ObjectPool +} + +// NewTypesPool creates a new pool for aggregation types. +func NewTypesPool(opts pool.ObjectPoolOptions) TypesPool { + return &typesPool{pool: pool.NewObjectPool(opts)} +} + +func (p *typesPool) Init(alloc TypesAlloc) { + p.pool.Init(func() interface{} { + return alloc() + }) +} + +func (p *typesPool) Get() Types { + return p.pool.Get().(Types) +} + +func (p *typesPool) Put(value Types) { + p.pool.Put(value[:0]) +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.pb.go b/vendor/github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.pb.go new file mode 100644 index 00000000..c2bb613b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.pb.go @@ -0,0 +1,412 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.proto + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* +Package aggregationpb is a generated protocol buffer package. + +It is generated from these files: + github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.proto + +It has these top-level messages: + AggregationID +*/ +package aggregationpb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type AggregationType int32 + +const ( + AggregationType_UNKNOWN AggregationType = 0 + AggregationType_LAST AggregationType = 1 + AggregationType_MIN AggregationType = 2 + AggregationType_MAX AggregationType = 3 + AggregationType_MEAN AggregationType = 4 + AggregationType_MEDIAN AggregationType = 5 + AggregationType_COUNT AggregationType = 6 + AggregationType_SUM AggregationType = 7 + AggregationType_SUMSQ AggregationType = 8 + AggregationType_STDEV AggregationType = 9 + AggregationType_P10 AggregationType = 10 + AggregationType_P20 AggregationType = 11 + AggregationType_P30 AggregationType = 12 + AggregationType_P40 AggregationType = 13 + AggregationType_P50 AggregationType = 14 + AggregationType_P60 AggregationType = 15 + AggregationType_P70 AggregationType = 16 + AggregationType_P80 AggregationType = 17 + AggregationType_P90 AggregationType = 18 + AggregationType_P95 AggregationType = 19 + AggregationType_P99 AggregationType = 20 + AggregationType_P999 AggregationType = 21 + AggregationType_P9999 AggregationType = 22 +) + +var AggregationType_name = map[int32]string{ + 0: "UNKNOWN", + 1: "LAST", + 2: "MIN", + 3: "MAX", + 4: "MEAN", + 5: "MEDIAN", + 6: "COUNT", + 7: "SUM", + 8: "SUMSQ", + 9: "STDEV", + 10: "P10", + 11: "P20", + 12: "P30", + 13: "P40", + 14: "P50", + 15: "P60", + 16: "P70", + 17: "P80", + 18: "P90", + 19: "P95", + 20: "P99", + 21: "P999", + 22: "P9999", +} +var AggregationType_value = map[string]int32{ + "UNKNOWN": 0, + "LAST": 1, + "MIN": 2, + "MAX": 3, + "MEAN": 4, + "MEDIAN": 5, + "COUNT": 6, + "SUM": 7, + "SUMSQ": 8, + "STDEV": 9, + "P10": 10, + "P20": 11, + "P30": 12, + "P40": 13, + "P50": 14, + "P60": 15, + "P70": 16, + "P80": 17, + "P90": 18, + "P95": 19, + "P99": 20, + "P999": 21, + "P9999": 22, +} + +func (x AggregationType) String() string { + return proto.EnumName(AggregationType_name, int32(x)) +} +func (AggregationType) EnumDescriptor() ([]byte, []int) { return fileDescriptorAggregation, []int{0} } + +// AggregationID is a unique identifier uniquely identifying +// one or more aggregation types. +type AggregationID struct { + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *AggregationID) Reset() { *m = AggregationID{} } +func (m *AggregationID) String() string { return proto.CompactTextString(m) } +func (*AggregationID) ProtoMessage() {} +func (*AggregationID) Descriptor() ([]byte, []int) { return fileDescriptorAggregation, []int{0} } + +func (m *AggregationID) GetId() uint64 { + if m != nil { + return m.Id + } + return 0 +} + +func init() { + proto.RegisterType((*AggregationID)(nil), "aggregationpb.AggregationID") + proto.RegisterEnum("aggregationpb.AggregationType", AggregationType_name, AggregationType_value) +} +func (m *AggregationID) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AggregationID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Id != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintAggregation(dAtA, i, uint64(m.Id)) + } + return i, nil +} + +func encodeVarintAggregation(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *AggregationID) Size() (n int) { + var l int + _ = l + if m.Id != 0 { + n += 1 + sovAggregation(uint64(m.Id)) + } + return n +} + +func sovAggregation(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozAggregation(x uint64) (n int) { + return sovAggregation(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *AggregationID) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAggregation + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AggregationID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AggregationID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + m.Id = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAggregation + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Id |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipAggregation(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAggregation + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipAggregation(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAggregation + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAggregation + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAggregation + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthAggregation + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAggregation + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipAggregation(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthAggregation = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowAggregation = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.proto", fileDescriptorAggregation) +} + +var fileDescriptorAggregation = []byte{ + // 320 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0xd1, 0x3d, 0x4e, 0xc3, 0x30, + 0x1c, 0x05, 0xf0, 0xba, 0xdf, 0x75, 0x69, 0xfb, 0xc7, 0x7c, 0x88, 0x29, 0x20, 0x26, 0xc4, 0x50, + 0x1b, 0x42, 0x81, 0x48, 0x2c, 0x81, 0x76, 0xa8, 0x20, 0x6e, 0x21, 0x09, 0x20, 0xb6, 0xa6, 0x89, + 0x42, 0x86, 0x34, 0x55, 0x1a, 0x06, 0x6e, 0xc1, 0xb1, 0x18, 0x39, 0x02, 0x0a, 0x37, 0xe0, 0x04, + 0xc8, 0xff, 0x0e, 0x94, 0x99, 0xed, 0xe7, 0xf7, 0x9e, 0x64, 0x4b, 0xa6, 0x32, 0x8c, 0xb2, 0xe7, + 0x17, 0xaf, 0x3b, 0x4d, 0x62, 0x1e, 0xeb, 0xbe, 0xc7, 0x63, 0x9d, 0x2f, 0xd2, 0x29, 0x8f, 0x83, + 0x2c, 0x8d, 0xa6, 0x0b, 0x1e, 0x06, 0xb3, 0x20, 0x9d, 0x64, 0x81, 0xcf, 0xe7, 0x69, 0x92, 0x25, + 0x7c, 0x12, 0x86, 0x69, 0x10, 0x4e, 0xb2, 0x28, 0x99, 0xcd, 0xbd, 0xd5, 0x53, 0x17, 0x7b, 0xd6, + 0xfa, 0x33, 0xd8, 0xdf, 0xa5, 0x2d, 0xf3, 0x37, 0x18, 0xf6, 0x59, 0x9b, 0x16, 0x23, 0x7f, 0x87, + 0xec, 0x91, 0x83, 0xf2, 0x5d, 0x31, 0xf2, 0x0f, 0xbf, 0x09, 0xed, 0xac, 0x2c, 0x9c, 0xd7, 0x79, + 0xc0, 0x9a, 0xb4, 0xe6, 0xca, 0x6b, 0x39, 0x7a, 0x90, 0x50, 0x60, 0x75, 0x5a, 0xbe, 0x31, 0x6d, + 0x07, 0x08, 0xab, 0xd1, 0x92, 0x35, 0x94, 0x50, 0x44, 0x98, 0x8f, 0x50, 0x52, 0x9d, 0x35, 0x30, + 0x25, 0x94, 0x19, 0xa5, 0x55, 0x6b, 0xd0, 0x1f, 0x9a, 0x12, 0x2a, 0xac, 0x41, 0x2b, 0x57, 0x23, + 0x57, 0x3a, 0x50, 0x55, 0x4b, 0xdb, 0xb5, 0xa0, 0xa6, 0x32, 0xdb, 0xb5, 0xec, 0x5b, 0xa8, 0x23, + 0x9d, 0xfe, 0xe0, 0x1e, 0x1a, 0xaa, 0x1e, 0x1f, 0x09, 0xa0, 0x88, 0x63, 0x01, 0x4d, 0x84, 0x2e, + 0x60, 0x0d, 0x71, 0x22, 0xa0, 0x85, 0xe8, 0x09, 0x68, 0x23, 0x4e, 0x05, 0x74, 0x10, 0x67, 0x02, + 0x00, 0x71, 0x2e, 0x60, 0x1d, 0x61, 0x08, 0x60, 0x4b, 0xf4, 0x60, 0x63, 0x09, 0x03, 0x36, 0xd5, + 0x13, 0xc7, 0x86, 0x61, 0xc0, 0x96, 0xba, 0x57, 0xc9, 0x80, 0xed, 0x4b, 0xf9, 0x9e, 0x6b, 0xe4, + 0x23, 0xd7, 0xc8, 0x67, 0xae, 0x91, 0xb7, 0x2f, 0xad, 0xf0, 0x74, 0xf1, 0x9f, 0x6f, 0xf0, 0xaa, + 0x18, 0xea, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x82, 0xc4, 0x3c, 0xea, 0xcd, 0x01, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.proto b/vendor/github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.proto new file mode 100644 index 00000000..66b7eb8c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.proto @@ -0,0 +1,57 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +syntax = "proto3"; + +option go_package = "github.com/m3db/m3/src/metrics/generated/proto/aggregationpb"; + +package aggregationpb; + +enum AggregationType { + UNKNOWN = 0; + LAST = 1; + MIN = 2; + MAX = 3; + MEAN = 4; + MEDIAN = 5; + COUNT = 6; + SUM = 7; + SUMSQ = 8; + STDEV = 9; + P10 = 10; + P20 = 11; + P30 = 12; + P40 = 13; + P50 = 14; + P60 = 15; + P70 = 16; + P80 = 17; + P90 = 18; + P95 = 19; + P99 = 20; + P999 = 21; + P9999 = 22; +} + +// AggregationID is a unique identifier uniquely identifying +// one or more aggregation types. +message AggregationID { + uint64 id = 1; +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.pb.go b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.pb.go new file mode 100644 index 00000000..ad2c896b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.pb.go @@ -0,0 +1,2238 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.proto + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* + Package metricpb is a generated protocol buffer package. + + It is generated from these files: + github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.proto + github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.proto + github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.proto + + It has these top-level messages: + CounterWithMetadatas + BatchTimerWithMetadatas + GaugeWithMetadatas + ForwardedMetricWithMetadata + TimedMetricWithMetadata + TimedMetricWithMetadatas + TimedMetricWithStoragePolicy + AggregatedMetric + MetricWithMetadatas + PipelineMetadata + Metadata + StagedMetadata + StagedMetadatas + ForwardMetadata + TimedMetadata + Counter + BatchTimer + Gauge + TimedMetric + ForwardedMetric + Tag +*/ +package metricpb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" +import _ "github.com/gogo/protobuf/gogoproto" +import policypb "github.com/m3db/m3/src/metrics/generated/proto/policypb" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type MetricWithMetadatas_Type int32 + +const ( + MetricWithMetadatas_UNKNOWN MetricWithMetadatas_Type = 0 + MetricWithMetadatas_COUNTER_WITH_METADATAS MetricWithMetadatas_Type = 1 + MetricWithMetadatas_BATCH_TIMER_WITH_METADATAS MetricWithMetadatas_Type = 2 + MetricWithMetadatas_GAUGE_WITH_METADATAS MetricWithMetadatas_Type = 3 + MetricWithMetadatas_FORWARDED_METRIC_WITH_METADATA MetricWithMetadatas_Type = 4 + MetricWithMetadatas_TIMED_METRIC_WITH_METADATA MetricWithMetadatas_Type = 5 + MetricWithMetadatas_TIMED_METRIC_WITH_METADATAS MetricWithMetadatas_Type = 6 + MetricWithMetadatas_TIMED_METRIC_WITH_STORAGE_POLICY MetricWithMetadatas_Type = 7 +) + +var MetricWithMetadatas_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "COUNTER_WITH_METADATAS", + 2: "BATCH_TIMER_WITH_METADATAS", + 3: "GAUGE_WITH_METADATAS", + 4: "FORWARDED_METRIC_WITH_METADATA", + 5: "TIMED_METRIC_WITH_METADATA", + 6: "TIMED_METRIC_WITH_METADATAS", + 7: "TIMED_METRIC_WITH_STORAGE_POLICY", +} +var MetricWithMetadatas_Type_value = map[string]int32{ + "UNKNOWN": 0, + "COUNTER_WITH_METADATAS": 1, + "BATCH_TIMER_WITH_METADATAS": 2, + "GAUGE_WITH_METADATAS": 3, + "FORWARDED_METRIC_WITH_METADATA": 4, + "TIMED_METRIC_WITH_METADATA": 5, + "TIMED_METRIC_WITH_METADATAS": 6, + "TIMED_METRIC_WITH_STORAGE_POLICY": 7, +} + +func (x MetricWithMetadatas_Type) String() string { + return proto.EnumName(MetricWithMetadatas_Type_name, int32(x)) +} +func (MetricWithMetadatas_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorComposite, []int{8, 0} +} + +type CounterWithMetadatas struct { + Counter Counter `protobuf:"bytes,1,opt,name=counter" json:"counter"` + Metadatas StagedMetadatas `protobuf:"bytes,2,opt,name=metadatas" json:"metadatas"` +} + +func (m *CounterWithMetadatas) Reset() { *m = CounterWithMetadatas{} } +func (m *CounterWithMetadatas) String() string { return proto.CompactTextString(m) } +func (*CounterWithMetadatas) ProtoMessage() {} +func (*CounterWithMetadatas) Descriptor() ([]byte, []int) { return fileDescriptorComposite, []int{0} } + +func (m *CounterWithMetadatas) GetCounter() Counter { + if m != nil { + return m.Counter + } + return Counter{} +} + +func (m *CounterWithMetadatas) GetMetadatas() StagedMetadatas { + if m != nil { + return m.Metadatas + } + return StagedMetadatas{} +} + +type BatchTimerWithMetadatas struct { + BatchTimer BatchTimer `protobuf:"bytes,1,opt,name=batch_timer,json=batchTimer" json:"batch_timer"` + Metadatas StagedMetadatas `protobuf:"bytes,2,opt,name=metadatas" json:"metadatas"` +} + +func (m *BatchTimerWithMetadatas) Reset() { *m = BatchTimerWithMetadatas{} } +func (m *BatchTimerWithMetadatas) String() string { return proto.CompactTextString(m) } +func (*BatchTimerWithMetadatas) ProtoMessage() {} +func (*BatchTimerWithMetadatas) Descriptor() ([]byte, []int) { return fileDescriptorComposite, []int{1} } + +func (m *BatchTimerWithMetadatas) GetBatchTimer() BatchTimer { + if m != nil { + return m.BatchTimer + } + return BatchTimer{} +} + +func (m *BatchTimerWithMetadatas) GetMetadatas() StagedMetadatas { + if m != nil { + return m.Metadatas + } + return StagedMetadatas{} +} + +type GaugeWithMetadatas struct { + Gauge Gauge `protobuf:"bytes,1,opt,name=gauge" json:"gauge"` + Metadatas StagedMetadatas `protobuf:"bytes,2,opt,name=metadatas" json:"metadatas"` +} + +func (m *GaugeWithMetadatas) Reset() { *m = GaugeWithMetadatas{} } +func (m *GaugeWithMetadatas) String() string { return proto.CompactTextString(m) } +func (*GaugeWithMetadatas) ProtoMessage() {} +func (*GaugeWithMetadatas) Descriptor() ([]byte, []int) { return fileDescriptorComposite, []int{2} } + +func (m *GaugeWithMetadatas) GetGauge() Gauge { + if m != nil { + return m.Gauge + } + return Gauge{} +} + +func (m *GaugeWithMetadatas) GetMetadatas() StagedMetadatas { + if m != nil { + return m.Metadatas + } + return StagedMetadatas{} +} + +type ForwardedMetricWithMetadata struct { + Metric ForwardedMetric `protobuf:"bytes,1,opt,name=metric" json:"metric"` + Metadata ForwardMetadata `protobuf:"bytes,2,opt,name=metadata" json:"metadata"` +} + +func (m *ForwardedMetricWithMetadata) Reset() { *m = ForwardedMetricWithMetadata{} } +func (m *ForwardedMetricWithMetadata) String() string { return proto.CompactTextString(m) } +func (*ForwardedMetricWithMetadata) ProtoMessage() {} +func (*ForwardedMetricWithMetadata) Descriptor() ([]byte, []int) { + return fileDescriptorComposite, []int{3} +} + +func (m *ForwardedMetricWithMetadata) GetMetric() ForwardedMetric { + if m != nil { + return m.Metric + } + return ForwardedMetric{} +} + +func (m *ForwardedMetricWithMetadata) GetMetadata() ForwardMetadata { + if m != nil { + return m.Metadata + } + return ForwardMetadata{} +} + +type TimedMetricWithMetadata struct { + Metric TimedMetric `protobuf:"bytes,1,opt,name=metric" json:"metric"` + Metadata TimedMetadata `protobuf:"bytes,2,opt,name=metadata" json:"metadata"` +} + +func (m *TimedMetricWithMetadata) Reset() { *m = TimedMetricWithMetadata{} } +func (m *TimedMetricWithMetadata) String() string { return proto.CompactTextString(m) } +func (*TimedMetricWithMetadata) ProtoMessage() {} +func (*TimedMetricWithMetadata) Descriptor() ([]byte, []int) { return fileDescriptorComposite, []int{4} } + +func (m *TimedMetricWithMetadata) GetMetric() TimedMetric { + if m != nil { + return m.Metric + } + return TimedMetric{} +} + +func (m *TimedMetricWithMetadata) GetMetadata() TimedMetadata { + if m != nil { + return m.Metadata + } + return TimedMetadata{} +} + +type TimedMetricWithMetadatas struct { + Metric TimedMetric `protobuf:"bytes,1,opt,name=metric" json:"metric"` + Metadatas StagedMetadatas `protobuf:"bytes,2,opt,name=metadatas" json:"metadatas"` +} + +func (m *TimedMetricWithMetadatas) Reset() { *m = TimedMetricWithMetadatas{} } +func (m *TimedMetricWithMetadatas) String() string { return proto.CompactTextString(m) } +func (*TimedMetricWithMetadatas) ProtoMessage() {} +func (*TimedMetricWithMetadatas) Descriptor() ([]byte, []int) { + return fileDescriptorComposite, []int{5} +} + +func (m *TimedMetricWithMetadatas) GetMetric() TimedMetric { + if m != nil { + return m.Metric + } + return TimedMetric{} +} + +func (m *TimedMetricWithMetadatas) GetMetadatas() StagedMetadatas { + if m != nil { + return m.Metadatas + } + return StagedMetadatas{} +} + +type TimedMetricWithStoragePolicy struct { + TimedMetric TimedMetric `protobuf:"bytes,1,opt,name=timed_metric,json=timedMetric" json:"timed_metric"` + StoragePolicy policypb.StoragePolicy `protobuf:"bytes,2,opt,name=storage_policy,json=storagePolicy" json:"storage_policy"` +} + +func (m *TimedMetricWithStoragePolicy) Reset() { *m = TimedMetricWithStoragePolicy{} } +func (m *TimedMetricWithStoragePolicy) String() string { return proto.CompactTextString(m) } +func (*TimedMetricWithStoragePolicy) ProtoMessage() {} +func (*TimedMetricWithStoragePolicy) Descriptor() ([]byte, []int) { + return fileDescriptorComposite, []int{6} +} + +func (m *TimedMetricWithStoragePolicy) GetTimedMetric() TimedMetric { + if m != nil { + return m.TimedMetric + } + return TimedMetric{} +} + +func (m *TimedMetricWithStoragePolicy) GetStoragePolicy() policypb.StoragePolicy { + if m != nil { + return m.StoragePolicy + } + return policypb.StoragePolicy{} +} + +type AggregatedMetric struct { + Metric TimedMetricWithStoragePolicy `protobuf:"bytes,1,opt,name=metric" json:"metric"` + EncodeNanos int64 `protobuf:"varint,2,opt,name=encode_nanos,json=encodeNanos,proto3" json:"encode_nanos,omitempty"` +} + +func (m *AggregatedMetric) Reset() { *m = AggregatedMetric{} } +func (m *AggregatedMetric) String() string { return proto.CompactTextString(m) } +func (*AggregatedMetric) ProtoMessage() {} +func (*AggregatedMetric) Descriptor() ([]byte, []int) { return fileDescriptorComposite, []int{7} } + +func (m *AggregatedMetric) GetMetric() TimedMetricWithStoragePolicy { + if m != nil { + return m.Metric + } + return TimedMetricWithStoragePolicy{} +} + +func (m *AggregatedMetric) GetEncodeNanos() int64 { + if m != nil { + return m.EncodeNanos + } + return 0 +} + +// NB: we intentionally choose to explicitly define the message type as well +// as the corresponding payload as opposed to use `oneof` protobuf type here. +// This is because the generated `Unmarshal` method of `oneof` types doesn't +// permit reusing existing protobuf messages for decoding, thus incurring a +// significant performance hit when such message type is used for encoding +// and decoding high volume traffic. +type MetricWithMetadatas struct { + Type MetricWithMetadatas_Type `protobuf:"varint,1,opt,name=type,proto3,enum=metricpb.MetricWithMetadatas_Type" json:"type,omitempty"` + CounterWithMetadatas *CounterWithMetadatas `protobuf:"bytes,2,opt,name=counter_with_metadatas,json=counterWithMetadatas" json:"counter_with_metadatas,omitempty"` + BatchTimerWithMetadatas *BatchTimerWithMetadatas `protobuf:"bytes,3,opt,name=batch_timer_with_metadatas,json=batchTimerWithMetadatas" json:"batch_timer_with_metadatas,omitempty"` + GaugeWithMetadatas *GaugeWithMetadatas `protobuf:"bytes,4,opt,name=gauge_with_metadatas,json=gaugeWithMetadatas" json:"gauge_with_metadatas,omitempty"` + ForwardedMetricWithMetadata *ForwardedMetricWithMetadata `protobuf:"bytes,5,opt,name=forwarded_metric_with_metadata,json=forwardedMetricWithMetadata" json:"forwarded_metric_with_metadata,omitempty"` + TimedMetricWithMetadata *TimedMetricWithMetadata `protobuf:"bytes,6,opt,name=timed_metric_with_metadata,json=timedMetricWithMetadata" json:"timed_metric_with_metadata,omitempty"` + TimedMetricWithMetadatas *TimedMetricWithMetadatas `protobuf:"bytes,7,opt,name=timed_metric_with_metadatas,json=timedMetricWithMetadatas" json:"timed_metric_with_metadatas,omitempty"` + TimedMetricWithStoragePolicy *TimedMetricWithStoragePolicy `protobuf:"bytes,8,opt,name=timed_metric_with_storage_policy,json=timedMetricWithStoragePolicy" json:"timed_metric_with_storage_policy,omitempty"` +} + +func (m *MetricWithMetadatas) Reset() { *m = MetricWithMetadatas{} } +func (m *MetricWithMetadatas) String() string { return proto.CompactTextString(m) } +func (*MetricWithMetadatas) ProtoMessage() {} +func (*MetricWithMetadatas) Descriptor() ([]byte, []int) { return fileDescriptorComposite, []int{8} } + +func (m *MetricWithMetadatas) GetType() MetricWithMetadatas_Type { + if m != nil { + return m.Type + } + return MetricWithMetadatas_UNKNOWN +} + +func (m *MetricWithMetadatas) GetCounterWithMetadatas() *CounterWithMetadatas { + if m != nil { + return m.CounterWithMetadatas + } + return nil +} + +func (m *MetricWithMetadatas) GetBatchTimerWithMetadatas() *BatchTimerWithMetadatas { + if m != nil { + return m.BatchTimerWithMetadatas + } + return nil +} + +func (m *MetricWithMetadatas) GetGaugeWithMetadatas() *GaugeWithMetadatas { + if m != nil { + return m.GaugeWithMetadatas + } + return nil +} + +func (m *MetricWithMetadatas) GetForwardedMetricWithMetadata() *ForwardedMetricWithMetadata { + if m != nil { + return m.ForwardedMetricWithMetadata + } + return nil +} + +func (m *MetricWithMetadatas) GetTimedMetricWithMetadata() *TimedMetricWithMetadata { + if m != nil { + return m.TimedMetricWithMetadata + } + return nil +} + +func (m *MetricWithMetadatas) GetTimedMetricWithMetadatas() *TimedMetricWithMetadatas { + if m != nil { + return m.TimedMetricWithMetadatas + } + return nil +} + +func (m *MetricWithMetadatas) GetTimedMetricWithStoragePolicy() *TimedMetricWithStoragePolicy { + if m != nil { + return m.TimedMetricWithStoragePolicy + } + return nil +} + +func init() { + proto.RegisterType((*CounterWithMetadatas)(nil), "metricpb.CounterWithMetadatas") + proto.RegisterType((*BatchTimerWithMetadatas)(nil), "metricpb.BatchTimerWithMetadatas") + proto.RegisterType((*GaugeWithMetadatas)(nil), "metricpb.GaugeWithMetadatas") + proto.RegisterType((*ForwardedMetricWithMetadata)(nil), "metricpb.ForwardedMetricWithMetadata") + proto.RegisterType((*TimedMetricWithMetadata)(nil), "metricpb.TimedMetricWithMetadata") + proto.RegisterType((*TimedMetricWithMetadatas)(nil), "metricpb.TimedMetricWithMetadatas") + proto.RegisterType((*TimedMetricWithStoragePolicy)(nil), "metricpb.TimedMetricWithStoragePolicy") + proto.RegisterType((*AggregatedMetric)(nil), "metricpb.AggregatedMetric") + proto.RegisterType((*MetricWithMetadatas)(nil), "metricpb.MetricWithMetadatas") + proto.RegisterEnum("metricpb.MetricWithMetadatas_Type", MetricWithMetadatas_Type_name, MetricWithMetadatas_Type_value) +} +func (m *CounterWithMetadatas) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CounterWithMetadatas) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Counter.Size())) + n1, err := m.Counter.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + dAtA[i] = 0x12 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Metadatas.Size())) + n2, err := m.Metadatas.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + return i, nil +} + +func (m *BatchTimerWithMetadatas) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BatchTimerWithMetadatas) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.BatchTimer.Size())) + n3, err := m.BatchTimer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + dAtA[i] = 0x12 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Metadatas.Size())) + n4, err := m.Metadatas.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + return i, nil +} + +func (m *GaugeWithMetadatas) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GaugeWithMetadatas) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Gauge.Size())) + n5, err := m.Gauge.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + dAtA[i] = 0x12 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Metadatas.Size())) + n6, err := m.Metadatas.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + return i, nil +} + +func (m *ForwardedMetricWithMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ForwardedMetricWithMetadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Metric.Size())) + n7, err := m.Metric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + dAtA[i] = 0x12 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Metadata.Size())) + n8, err := m.Metadata.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + return i, nil +} + +func (m *TimedMetricWithMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TimedMetricWithMetadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Metric.Size())) + n9, err := m.Metric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 + dAtA[i] = 0x12 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Metadata.Size())) + n10, err := m.Metadata.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 + return i, nil +} + +func (m *TimedMetricWithMetadatas) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TimedMetricWithMetadatas) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Metric.Size())) + n11, err := m.Metric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 + dAtA[i] = 0x12 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Metadatas.Size())) + n12, err := m.Metadatas.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + return i, nil +} + +func (m *TimedMetricWithStoragePolicy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TimedMetricWithStoragePolicy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.TimedMetric.Size())) + n13, err := m.TimedMetric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n13 + dAtA[i] = 0x12 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.StoragePolicy.Size())) + n14, err := m.StoragePolicy.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n14 + return i, nil +} + +func (m *AggregatedMetric) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AggregatedMetric) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Metric.Size())) + n15, err := m.Metric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n15 + if m.EncodeNanos != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.EncodeNanos)) + } + return i, nil +} + +func (m *MetricWithMetadatas) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MetricWithMetadatas) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.Type)) + } + if m.CounterWithMetadatas != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.CounterWithMetadatas.Size())) + n16, err := m.CounterWithMetadatas.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n16 + } + if m.BatchTimerWithMetadatas != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.BatchTimerWithMetadatas.Size())) + n17, err := m.BatchTimerWithMetadatas.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n17 + } + if m.GaugeWithMetadatas != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.GaugeWithMetadatas.Size())) + n18, err := m.GaugeWithMetadatas.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n18 + } + if m.ForwardedMetricWithMetadata != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.ForwardedMetricWithMetadata.Size())) + n19, err := m.ForwardedMetricWithMetadata.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n19 + } + if m.TimedMetricWithMetadata != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.TimedMetricWithMetadata.Size())) + n20, err := m.TimedMetricWithMetadata.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n20 + } + if m.TimedMetricWithMetadatas != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.TimedMetricWithMetadatas.Size())) + n21, err := m.TimedMetricWithMetadatas.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n21 + } + if m.TimedMetricWithStoragePolicy != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintComposite(dAtA, i, uint64(m.TimedMetricWithStoragePolicy.Size())) + n22, err := m.TimedMetricWithStoragePolicy.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n22 + } + return i, nil +} + +func encodeVarintComposite(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *CounterWithMetadatas) Size() (n int) { + var l int + _ = l + l = m.Counter.Size() + n += 1 + l + sovComposite(uint64(l)) + l = m.Metadatas.Size() + n += 1 + l + sovComposite(uint64(l)) + return n +} + +func (m *BatchTimerWithMetadatas) Size() (n int) { + var l int + _ = l + l = m.BatchTimer.Size() + n += 1 + l + sovComposite(uint64(l)) + l = m.Metadatas.Size() + n += 1 + l + sovComposite(uint64(l)) + return n +} + +func (m *GaugeWithMetadatas) Size() (n int) { + var l int + _ = l + l = m.Gauge.Size() + n += 1 + l + sovComposite(uint64(l)) + l = m.Metadatas.Size() + n += 1 + l + sovComposite(uint64(l)) + return n +} + +func (m *ForwardedMetricWithMetadata) Size() (n int) { + var l int + _ = l + l = m.Metric.Size() + n += 1 + l + sovComposite(uint64(l)) + l = m.Metadata.Size() + n += 1 + l + sovComposite(uint64(l)) + return n +} + +func (m *TimedMetricWithMetadata) Size() (n int) { + var l int + _ = l + l = m.Metric.Size() + n += 1 + l + sovComposite(uint64(l)) + l = m.Metadata.Size() + n += 1 + l + sovComposite(uint64(l)) + return n +} + +func (m *TimedMetricWithMetadatas) Size() (n int) { + var l int + _ = l + l = m.Metric.Size() + n += 1 + l + sovComposite(uint64(l)) + l = m.Metadatas.Size() + n += 1 + l + sovComposite(uint64(l)) + return n +} + +func (m *TimedMetricWithStoragePolicy) Size() (n int) { + var l int + _ = l + l = m.TimedMetric.Size() + n += 1 + l + sovComposite(uint64(l)) + l = m.StoragePolicy.Size() + n += 1 + l + sovComposite(uint64(l)) + return n +} + +func (m *AggregatedMetric) Size() (n int) { + var l int + _ = l + l = m.Metric.Size() + n += 1 + l + sovComposite(uint64(l)) + if m.EncodeNanos != 0 { + n += 1 + sovComposite(uint64(m.EncodeNanos)) + } + return n +} + +func (m *MetricWithMetadatas) Size() (n int) { + var l int + _ = l + if m.Type != 0 { + n += 1 + sovComposite(uint64(m.Type)) + } + if m.CounterWithMetadatas != nil { + l = m.CounterWithMetadatas.Size() + n += 1 + l + sovComposite(uint64(l)) + } + if m.BatchTimerWithMetadatas != nil { + l = m.BatchTimerWithMetadatas.Size() + n += 1 + l + sovComposite(uint64(l)) + } + if m.GaugeWithMetadatas != nil { + l = m.GaugeWithMetadatas.Size() + n += 1 + l + sovComposite(uint64(l)) + } + if m.ForwardedMetricWithMetadata != nil { + l = m.ForwardedMetricWithMetadata.Size() + n += 1 + l + sovComposite(uint64(l)) + } + if m.TimedMetricWithMetadata != nil { + l = m.TimedMetricWithMetadata.Size() + n += 1 + l + sovComposite(uint64(l)) + } + if m.TimedMetricWithMetadatas != nil { + l = m.TimedMetricWithMetadatas.Size() + n += 1 + l + sovComposite(uint64(l)) + } + if m.TimedMetricWithStoragePolicy != nil { + l = m.TimedMetricWithStoragePolicy.Size() + n += 1 + l + sovComposite(uint64(l)) + } + return n +} + +func sovComposite(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozComposite(x uint64) (n int) { + return sovComposite(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *CounterWithMetadatas) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CounterWithMetadatas: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CounterWithMetadatas: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Counter", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Counter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadatas", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadatas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipComposite(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthComposite + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BatchTimerWithMetadatas) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BatchTimerWithMetadatas: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BatchTimerWithMetadatas: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BatchTimer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.BatchTimer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadatas", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadatas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipComposite(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthComposite + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GaugeWithMetadatas) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GaugeWithMetadatas: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GaugeWithMetadatas: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Gauge", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Gauge.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadatas", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadatas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipComposite(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthComposite + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ForwardedMetricWithMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ForwardedMetricWithMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ForwardedMetricWithMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipComposite(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthComposite + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TimedMetricWithMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TimedMetricWithMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TimedMetricWithMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipComposite(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthComposite + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TimedMetricWithMetadatas) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TimedMetricWithMetadatas: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TimedMetricWithMetadatas: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadatas", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadatas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipComposite(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthComposite + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TimedMetricWithStoragePolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TimedMetricWithStoragePolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TimedMetricWithStoragePolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TimedMetric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TimedMetric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StoragePolicy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.StoragePolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipComposite(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthComposite + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AggregatedMetric) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AggregatedMetric: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AggregatedMetric: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EncodeNanos", wireType) + } + m.EncodeNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EncodeNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipComposite(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthComposite + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MetricWithMetadatas) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MetricWithMetadatas: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MetricWithMetadatas: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (MetricWithMetadatas_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CounterWithMetadatas", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CounterWithMetadatas == nil { + m.CounterWithMetadatas = &CounterWithMetadatas{} + } + if err := m.CounterWithMetadatas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BatchTimerWithMetadatas", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BatchTimerWithMetadatas == nil { + m.BatchTimerWithMetadatas = &BatchTimerWithMetadatas{} + } + if err := m.BatchTimerWithMetadatas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GaugeWithMetadatas", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GaugeWithMetadatas == nil { + m.GaugeWithMetadatas = &GaugeWithMetadatas{} + } + if err := m.GaugeWithMetadatas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ForwardedMetricWithMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ForwardedMetricWithMetadata == nil { + m.ForwardedMetricWithMetadata = &ForwardedMetricWithMetadata{} + } + if err := m.ForwardedMetricWithMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TimedMetricWithMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TimedMetricWithMetadata == nil { + m.TimedMetricWithMetadata = &TimedMetricWithMetadata{} + } + if err := m.TimedMetricWithMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TimedMetricWithMetadatas", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TimedMetricWithMetadatas == nil { + m.TimedMetricWithMetadatas = &TimedMetricWithMetadatas{} + } + if err := m.TimedMetricWithMetadatas.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TimedMetricWithStoragePolicy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowComposite + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthComposite + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TimedMetricWithStoragePolicy == nil { + m.TimedMetricWithStoragePolicy = &TimedMetricWithStoragePolicy{} + } + if err := m.TimedMetricWithStoragePolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipComposite(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthComposite + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipComposite(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowComposite + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowComposite + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowComposite + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthComposite + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowComposite + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipComposite(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthComposite = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowComposite = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.proto", fileDescriptorComposite) +} + +var fileDescriptorComposite = []byte{ + // 808 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x96, 0xcd, 0x6e, 0xd3, 0x58, + 0x14, 0xc7, 0xeb, 0x36, 0x4d, 0x3a, 0x27, 0x9d, 0x4e, 0xe6, 0x4e, 0xa6, 0xc9, 0x24, 0x95, 0xdb, + 0x5a, 0x33, 0x23, 0x24, 0x44, 0x22, 0x1a, 0x89, 0x0a, 0x55, 0x20, 0x39, 0x1f, 0x4d, 0x23, 0x68, + 0x52, 0x39, 0xae, 0x22, 0x58, 0xd4, 0xb2, 0x1d, 0xd7, 0x31, 0x22, 0x71, 0x64, 0xdf, 0xa8, 0xaa, + 0xd8, 0xb0, 0x84, 0x0d, 0x42, 0x42, 0xbc, 0x01, 0x0f, 0xd3, 0x25, 0x4f, 0x80, 0x50, 0x59, 0xb1, + 0xe7, 0x01, 0x90, 0xed, 0xeb, 0xf8, 0x2b, 0x2e, 0x90, 0xec, 0xec, 0xf3, 0xf1, 0x3b, 0xff, 0x5c, + 0xdf, 0xf3, 0x57, 0xa0, 0xa9, 0x6a, 0x78, 0x30, 0x91, 0x4a, 0xb2, 0x3e, 0x2c, 0x0f, 0x2b, 0x7d, + 0xa9, 0x3c, 0xac, 0x94, 0x4d, 0x43, 0x2e, 0x0f, 0x15, 0x6c, 0x68, 0xb2, 0x59, 0x56, 0x95, 0x91, + 0x62, 0x88, 0x58, 0xe9, 0x97, 0xc7, 0x86, 0x8e, 0x75, 0x12, 0x1f, 0x4b, 0x65, 0x59, 0x1f, 0x8e, + 0x75, 0x53, 0xc3, 0x4a, 0xc9, 0x4e, 0xa0, 0x35, 0x37, 0x53, 0xb8, 0xe3, 0x43, 0xaa, 0xba, 0xaa, + 0x3b, 0x9d, 0xd2, 0xe4, 0xdc, 0x7e, 0x73, 0x30, 0xd6, 0x93, 0xd3, 0x58, 0xa8, 0xcf, 0xab, 0xc0, + 0x79, 0x20, 0x94, 0xc3, 0x05, 0x28, 0x62, 0x5f, 0xc4, 0xe2, 0x9c, 0x6a, 0xc6, 0xfa, 0x73, 0x4d, + 0xbe, 0x1c, 0x4b, 0xe4, 0xc1, 0xa1, 0x30, 0xaf, 0x28, 0xc8, 0xd6, 0xf4, 0xc9, 0x08, 0x2b, 0x46, + 0x4f, 0xc3, 0x83, 0x63, 0x32, 0xc3, 0x44, 0x77, 0x21, 0x25, 0x3b, 0xf1, 0x3c, 0xb5, 0x43, 0xdd, + 0x4a, 0xef, 0xfd, 0x59, 0x72, 0x95, 0x94, 0x48, 0x43, 0x35, 0x71, 0xf5, 0x69, 0x7b, 0x89, 0x73, + 0xeb, 0xd0, 0x03, 0xf8, 0xcd, 0xd5, 0x68, 0xe6, 0x97, 0xed, 0xa6, 0x7f, 0xbc, 0xa6, 0x2e, 0x16, + 0x55, 0xa5, 0x3f, 0x1d, 0x40, 0x9a, 0xbd, 0x0e, 0xe6, 0x3d, 0x05, 0xb9, 0xaa, 0x88, 0xe5, 0x01, + 0xaf, 0x0d, 0xc3, 0x6a, 0x0e, 0x20, 0x2d, 0x59, 0x29, 0x01, 0x5b, 0x39, 0xa2, 0x28, 0xeb, 0xc1, + 0xbd, 0x3e, 0xc2, 0x05, 0x69, 0x1a, 0x59, 0x54, 0xd7, 0x4b, 0x0a, 0x50, 0x53, 0x9c, 0xa8, 0x4a, + 0x50, 0xd2, 0x6d, 0x58, 0x55, 0xad, 0x28, 0x11, 0xf3, 0x87, 0x47, 0xb4, 0x8b, 0x09, 0xc7, 0xa9, + 0x59, 0x54, 0xc2, 0x3b, 0x0a, 0x8a, 0x87, 0xba, 0x71, 0x21, 0x1a, 0x7d, 0xbb, 0xce, 0xd0, 0x64, + 0xbf, 0x18, 0xb4, 0x0f, 0x49, 0x07, 0x46, 0xc4, 0xf8, 0xd8, 0xa1, 0x36, 0xc2, 0x26, 0xe5, 0xe8, + 0x00, 0xd6, 0xdc, 0x29, 0x51, 0x59, 0xa4, 0xd5, 0x9d, 0x42, 0x5a, 0xa7, 0x0d, 0xcc, 0x6b, 0x0a, + 0x72, 0xd6, 0x09, 0xcf, 0x52, 0x54, 0x09, 0x29, 0xfa, 0xdb, 0xc3, 0xfa, 0x5a, 0x42, 0x6a, 0xee, + 0x47, 0xd4, 0xe4, 0xa2, 0x6d, 0xb3, 0xb5, 0xbc, 0xa1, 0x20, 0x1f, 0xa3, 0xc5, 0x9c, 0x4f, 0xcc, + 0x82, 0x9f, 0xec, 0x03, 0x05, 0x5b, 0x21, 0x41, 0x5d, 0xac, 0x1b, 0xa2, 0xaa, 0x9c, 0xd8, 0xfb, + 0x87, 0x1e, 0xc2, 0xba, 0x75, 0x99, 0xfb, 0xc2, 0xcf, 0x4b, 0x4b, 0x63, 0x2f, 0x84, 0xea, 0xb0, + 0x61, 0x3a, 0x40, 0xc1, 0xd9, 0xe8, 0xe9, 0x91, 0xb9, 0x9b, 0x5e, 0x0a, 0x0c, 0x24, 0x8c, 0xdf, + 0x4d, 0x7f, 0x90, 0x79, 0x01, 0x19, 0x56, 0x55, 0x0d, 0x45, 0xb5, 0x9c, 0x62, 0x4a, 0x0e, 0x1e, + 0xd7, 0xff, 0x33, 0x35, 0x45, 0x7e, 0x51, 0xe8, 0xfc, 0x76, 0x61, 0x5d, 0x19, 0xc9, 0x7a, 0x5f, + 0x11, 0x46, 0xe2, 0x48, 0x77, 0x8e, 0x70, 0x85, 0x4b, 0x3b, 0xb1, 0xb6, 0x15, 0x62, 0xbe, 0xa6, + 0xe0, 0xaf, 0x59, 0xdf, 0xeb, 0x1e, 0x24, 0xf0, 0xe5, 0xd8, 0xd9, 0xac, 0x8d, 0x3d, 0xc6, 0x1b, + 0x3f, 0xa3, 0xb8, 0xc4, 0x5f, 0x8e, 0x15, 0xce, 0xae, 0x47, 0x3c, 0x6c, 0x12, 0x2f, 0x12, 0x2e, + 0x34, 0x3c, 0x10, 0xc2, 0xdf, 0x8f, 0x8e, 0x58, 0x58, 0x00, 0xc5, 0x65, 0xe5, 0x59, 0x4e, 0x78, + 0x06, 0x05, 0x9f, 0xf7, 0x84, 0xc9, 0x2b, 0x36, 0x79, 0x77, 0x96, 0x15, 0x05, 0xe1, 0x39, 0x29, + 0xc6, 0xdb, 0xda, 0x90, 0xb5, 0x4d, 0x22, 0x4c, 0x4e, 0xd8, 0xe4, 0xad, 0x90, 0xaf, 0x04, 0xa1, + 0x48, 0x8d, 0x1a, 0xd3, 0x33, 0xa0, 0xcf, 0xdd, 0xa5, 0x27, 0x97, 0x2b, 0x88, 0xce, 0xaf, 0xda, + 0xe4, 0xff, 0x62, 0x4d, 0xc2, 0xcf, 0xe3, 0x8a, 0xe7, 0x37, 0x18, 0xcf, 0x19, 0x14, 0xfc, 0x97, + 0x38, 0x34, 0x27, 0x19, 0x3e, 0x9b, 0x98, 0x0d, 0xe5, 0x72, 0x38, 0xc6, 0x46, 0x44, 0x28, 0xc6, + 0xf3, 0xcd, 0x7c, 0xca, 0x1e, 0xc0, 0xfc, 0x70, 0x80, 0xc9, 0xe5, 0x71, 0x9c, 0x39, 0x8c, 0x60, + 0x27, 0x3a, 0x22, 0xb4, 0x59, 0x6b, 0xbf, 0xb2, 0x07, 0xdc, 0x16, 0xbe, 0x21, 0xcb, 0x7c, 0xa3, + 0x20, 0x61, 0xdd, 0x59, 0x94, 0x86, 0xd4, 0x69, 0xfb, 0x51, 0xbb, 0xd3, 0x6b, 0x67, 0x96, 0x50, + 0x01, 0x36, 0x6b, 0x9d, 0xd3, 0x36, 0xdf, 0xe0, 0x84, 0x5e, 0x8b, 0x3f, 0x12, 0x8e, 0x1b, 0x3c, + 0x5b, 0x67, 0x79, 0xb6, 0x9b, 0xa1, 0x10, 0x0d, 0x85, 0x2a, 0xcb, 0xd7, 0x8e, 0x04, 0xbe, 0x75, + 0x1c, 0xcd, 0x2f, 0xa3, 0x3c, 0x64, 0x9b, 0xec, 0x69, 0xb3, 0x11, 0xce, 0xac, 0x20, 0x06, 0xe8, + 0xc3, 0x0e, 0xd7, 0x63, 0xb9, 0x7a, 0xa3, 0x6e, 0x25, 0xb8, 0x56, 0x2d, 0x58, 0x94, 0x49, 0x58, + 0x74, 0x8b, 0x1b, 0x93, 0x5f, 0x45, 0xdb, 0x50, 0x8c, 0xcf, 0x77, 0x33, 0x49, 0xf4, 0x2f, 0xec, + 0x44, 0x0b, 0xba, 0x7c, 0x87, 0x63, 0x9b, 0x0d, 0xe1, 0xa4, 0xf3, 0xb8, 0x55, 0x7b, 0x92, 0x49, + 0x55, 0x5b, 0x57, 0xd7, 0x34, 0xf5, 0xf1, 0x9a, 0xa6, 0x3e, 0x5f, 0xd3, 0xd4, 0xdb, 0x2f, 0xf4, + 0xd2, 0xd3, 0xfd, 0x39, 0xff, 0x08, 0x49, 0x49, 0xfb, 0xbd, 0xf2, 0x3d, 0x00, 0x00, 0xff, 0xff, + 0x34, 0x3f, 0x09, 0x4f, 0x12, 0x0a, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.proto b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.proto new file mode 100644 index 00000000..61555eb1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/composite.proto @@ -0,0 +1,97 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +syntax = "proto3"; + +option go_package = "github.com/m3db/m3/src/metrics/generated/proto/metricpb"; + +package metricpb; + +import "github.com/gogo/protobuf/gogoproto/gogo.proto"; +import "github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.proto"; +import "github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.proto"; +import "github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.proto"; + +message CounterWithMetadatas { + Counter counter = 1 [(gogoproto.nullable) = false]; + StagedMetadatas metadatas = 2 [(gogoproto.nullable) = false]; +} + +message BatchTimerWithMetadatas { + BatchTimer batch_timer = 1 [(gogoproto.nullable) = false]; + StagedMetadatas metadatas = 2 [(gogoproto.nullable) = false]; +} + +message GaugeWithMetadatas { + Gauge gauge = 1 [(gogoproto.nullable) = false]; + StagedMetadatas metadatas = 2 [(gogoproto.nullable) = false]; +} + +message ForwardedMetricWithMetadata { + ForwardedMetric metric = 1 [(gogoproto.nullable) = false]; + ForwardMetadata metadata = 2 [(gogoproto.nullable) = false]; +} + +message TimedMetricWithMetadata { + TimedMetric metric = 1 [(gogoproto.nullable) = false]; + TimedMetadata metadata = 2 [(gogoproto.nullable) = false]; +} + +message TimedMetricWithMetadatas { + TimedMetric metric = 1 [(gogoproto.nullable) = false]; + StagedMetadatas metadatas = 2 [(gogoproto.nullable) = false]; +} + +message TimedMetricWithStoragePolicy { + TimedMetric timed_metric = 1 [(gogoproto.nullable) = false]; + policypb.StoragePolicy storage_policy = 2 [(gogoproto.nullable) = false]; +} + +message AggregatedMetric { + TimedMetricWithStoragePolicy metric = 1 [(gogoproto.nullable) = false]; + int64 encode_nanos = 2; +} + +// NB: we intentionally choose to explicitly define the message type as well +// as the corresponding payload as opposed to use `oneof` protobuf type here. +// This is because the generated `Unmarshal` method of `oneof` types doesn't +// permit reusing existing protobuf messages for decoding, thus incurring a +// significant performance hit when such message type is used for encoding +// and decoding high volume traffic. +message MetricWithMetadatas { + enum Type { + UNKNOWN = 0; + COUNTER_WITH_METADATAS = 1; + BATCH_TIMER_WITH_METADATAS = 2; + GAUGE_WITH_METADATAS = 3; + FORWARDED_METRIC_WITH_METADATA = 4; + TIMED_METRIC_WITH_METADATA = 5; + TIMED_METRIC_WITH_METADATAS = 6; + TIMED_METRIC_WITH_STORAGE_POLICY = 7; + } + Type type = 1; + CounterWithMetadatas counter_with_metadatas = 2; + BatchTimerWithMetadatas batch_timer_with_metadatas = 3; + GaugeWithMetadatas gauge_with_metadatas = 4; + ForwardedMetricWithMetadata forwarded_metric_with_metadata = 5; + TimedMetricWithMetadata timed_metric_with_metadata = 6; + TimedMetricWithMetadatas timed_metric_with_metadatas = 7; + TimedMetricWithStoragePolicy timed_metric_with_storage_policy = 8; +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.pb.go b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.pb.go new file mode 100644 index 00000000..97a8987a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.pb.go @@ -0,0 +1,1445 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.proto + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package metricpb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" +import _ "github.com/gogo/protobuf/gogoproto" +import aggregationpb "github.com/m3db/m3/src/metrics/generated/proto/aggregationpb" +import policypb "github.com/m3db/m3/src/metrics/generated/proto/policypb" +import pipelinepb "github.com/m3db/m3/src/metrics/generated/proto/pipelinepb" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type PipelineMetadata struct { + AggregationId aggregationpb.AggregationID `protobuf:"bytes,1,opt,name=aggregation_id,json=aggregationId" json:"aggregation_id"` + StoragePolicies []policypb.StoragePolicy `protobuf:"bytes,2,rep,name=storage_policies,json=storagePolicies" json:"storage_policies"` + Pipeline pipelinepb.AppliedPipeline `protobuf:"bytes,3,opt,name=pipeline" json:"pipeline"` + DropPolicy policypb.DropPolicy `protobuf:"varint,4,opt,name=drop_policy,json=dropPolicy,proto3,enum=policypb.DropPolicy" json:"drop_policy,omitempty"` +} + +func (m *PipelineMetadata) Reset() { *m = PipelineMetadata{} } +func (m *PipelineMetadata) String() string { return proto.CompactTextString(m) } +func (*PipelineMetadata) ProtoMessage() {} +func (*PipelineMetadata) Descriptor() ([]byte, []int) { return fileDescriptorMetadata, []int{0} } + +func (m *PipelineMetadata) GetAggregationId() aggregationpb.AggregationID { + if m != nil { + return m.AggregationId + } + return aggregationpb.AggregationID{} +} + +func (m *PipelineMetadata) GetStoragePolicies() []policypb.StoragePolicy { + if m != nil { + return m.StoragePolicies + } + return nil +} + +func (m *PipelineMetadata) GetPipeline() pipelinepb.AppliedPipeline { + if m != nil { + return m.Pipeline + } + return pipelinepb.AppliedPipeline{} +} + +func (m *PipelineMetadata) GetDropPolicy() policypb.DropPolicy { + if m != nil { + return m.DropPolicy + } + return policypb.DropPolicy_NONE +} + +type Metadata struct { + Pipelines []PipelineMetadata `protobuf:"bytes,1,rep,name=pipelines" json:"pipelines"` +} + +func (m *Metadata) Reset() { *m = Metadata{} } +func (m *Metadata) String() string { return proto.CompactTextString(m) } +func (*Metadata) ProtoMessage() {} +func (*Metadata) Descriptor() ([]byte, []int) { return fileDescriptorMetadata, []int{1} } + +func (m *Metadata) GetPipelines() []PipelineMetadata { + if m != nil { + return m.Pipelines + } + return nil +} + +type StagedMetadata struct { + CutoverNanos int64 `protobuf:"varint,1,opt,name=cutover_nanos,json=cutoverNanos,proto3" json:"cutover_nanos,omitempty"` + Tombstoned bool `protobuf:"varint,2,opt,name=tombstoned,proto3" json:"tombstoned,omitempty"` + Metadata Metadata `protobuf:"bytes,3,opt,name=metadata" json:"metadata"` +} + +func (m *StagedMetadata) Reset() { *m = StagedMetadata{} } +func (m *StagedMetadata) String() string { return proto.CompactTextString(m) } +func (*StagedMetadata) ProtoMessage() {} +func (*StagedMetadata) Descriptor() ([]byte, []int) { return fileDescriptorMetadata, []int{2} } + +func (m *StagedMetadata) GetCutoverNanos() int64 { + if m != nil { + return m.CutoverNanos + } + return 0 +} + +func (m *StagedMetadata) GetTombstoned() bool { + if m != nil { + return m.Tombstoned + } + return false +} + +func (m *StagedMetadata) GetMetadata() Metadata { + if m != nil { + return m.Metadata + } + return Metadata{} +} + +type StagedMetadatas struct { + Metadatas []StagedMetadata `protobuf:"bytes,1,rep,name=metadatas" json:"metadatas"` +} + +func (m *StagedMetadatas) Reset() { *m = StagedMetadatas{} } +func (m *StagedMetadatas) String() string { return proto.CompactTextString(m) } +func (*StagedMetadatas) ProtoMessage() {} +func (*StagedMetadatas) Descriptor() ([]byte, []int) { return fileDescriptorMetadata, []int{3} } + +func (m *StagedMetadatas) GetMetadatas() []StagedMetadata { + if m != nil { + return m.Metadatas + } + return nil +} + +type ForwardMetadata struct { + AggregationId aggregationpb.AggregationID `protobuf:"bytes,1,opt,name=aggregation_id,json=aggregationId" json:"aggregation_id"` + StoragePolicy policypb.StoragePolicy `protobuf:"bytes,2,opt,name=storage_policy,json=storagePolicy" json:"storage_policy"` + Pipeline pipelinepb.AppliedPipeline `protobuf:"bytes,3,opt,name=pipeline" json:"pipeline"` + SourceId uint32 `protobuf:"varint,4,opt,name=source_id,json=sourceId,proto3" json:"source_id,omitempty"` + NumForwardedTimes int32 `protobuf:"varint,5,opt,name=num_forwarded_times,json=numForwardedTimes,proto3" json:"num_forwarded_times,omitempty"` +} + +func (m *ForwardMetadata) Reset() { *m = ForwardMetadata{} } +func (m *ForwardMetadata) String() string { return proto.CompactTextString(m) } +func (*ForwardMetadata) ProtoMessage() {} +func (*ForwardMetadata) Descriptor() ([]byte, []int) { return fileDescriptorMetadata, []int{4} } + +func (m *ForwardMetadata) GetAggregationId() aggregationpb.AggregationID { + if m != nil { + return m.AggregationId + } + return aggregationpb.AggregationID{} +} + +func (m *ForwardMetadata) GetStoragePolicy() policypb.StoragePolicy { + if m != nil { + return m.StoragePolicy + } + return policypb.StoragePolicy{} +} + +func (m *ForwardMetadata) GetPipeline() pipelinepb.AppliedPipeline { + if m != nil { + return m.Pipeline + } + return pipelinepb.AppliedPipeline{} +} + +func (m *ForwardMetadata) GetSourceId() uint32 { + if m != nil { + return m.SourceId + } + return 0 +} + +func (m *ForwardMetadata) GetNumForwardedTimes() int32 { + if m != nil { + return m.NumForwardedTimes + } + return 0 +} + +type TimedMetadata struct { + AggregationId aggregationpb.AggregationID `protobuf:"bytes,1,opt,name=aggregation_id,json=aggregationId" json:"aggregation_id"` + StoragePolicy policypb.StoragePolicy `protobuf:"bytes,2,opt,name=storage_policy,json=storagePolicy" json:"storage_policy"` +} + +func (m *TimedMetadata) Reset() { *m = TimedMetadata{} } +func (m *TimedMetadata) String() string { return proto.CompactTextString(m) } +func (*TimedMetadata) ProtoMessage() {} +func (*TimedMetadata) Descriptor() ([]byte, []int) { return fileDescriptorMetadata, []int{5} } + +func (m *TimedMetadata) GetAggregationId() aggregationpb.AggregationID { + if m != nil { + return m.AggregationId + } + return aggregationpb.AggregationID{} +} + +func (m *TimedMetadata) GetStoragePolicy() policypb.StoragePolicy { + if m != nil { + return m.StoragePolicy + } + return policypb.StoragePolicy{} +} + +func init() { + proto.RegisterType((*PipelineMetadata)(nil), "metricpb.PipelineMetadata") + proto.RegisterType((*Metadata)(nil), "metricpb.Metadata") + proto.RegisterType((*StagedMetadata)(nil), "metricpb.StagedMetadata") + proto.RegisterType((*StagedMetadatas)(nil), "metricpb.StagedMetadatas") + proto.RegisterType((*ForwardMetadata)(nil), "metricpb.ForwardMetadata") + proto.RegisterType((*TimedMetadata)(nil), "metricpb.TimedMetadata") +} +func (m *PipelineMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PipelineMetadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.AggregationId.Size())) + n1, err := m.AggregationId.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + if len(m.StoragePolicies) > 0 { + for _, msg := range m.StoragePolicies { + dAtA[i] = 0x12 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + dAtA[i] = 0x1a + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.Pipeline.Size())) + n2, err := m.Pipeline.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + if m.DropPolicy != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.DropPolicy)) + } + return i, nil +} + +func (m *Metadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Metadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Pipelines) > 0 { + for _, msg := range m.Pipelines { + dAtA[i] = 0xa + i++ + i = encodeVarintMetadata(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *StagedMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StagedMetadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.CutoverNanos != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.CutoverNanos)) + } + if m.Tombstoned { + dAtA[i] = 0x10 + i++ + if m.Tombstoned { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + dAtA[i] = 0x1a + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.Metadata.Size())) + n3, err := m.Metadata.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + return i, nil +} + +func (m *StagedMetadatas) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StagedMetadatas) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Metadatas) > 0 { + for _, msg := range m.Metadatas { + dAtA[i] = 0xa + i++ + i = encodeVarintMetadata(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *ForwardMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ForwardMetadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.AggregationId.Size())) + n4, err := m.AggregationId.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + dAtA[i] = 0x12 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.StoragePolicy.Size())) + n5, err := m.StoragePolicy.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + dAtA[i] = 0x1a + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.Pipeline.Size())) + n6, err := m.Pipeline.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + if m.SourceId != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.SourceId)) + } + if m.NumForwardedTimes != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.NumForwardedTimes)) + } + return i, nil +} + +func (m *TimedMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TimedMetadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.AggregationId.Size())) + n7, err := m.AggregationId.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + dAtA[i] = 0x12 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.StoragePolicy.Size())) + n8, err := m.StoragePolicy.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + return i, nil +} + +func encodeVarintMetadata(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *PipelineMetadata) Size() (n int) { + var l int + _ = l + l = m.AggregationId.Size() + n += 1 + l + sovMetadata(uint64(l)) + if len(m.StoragePolicies) > 0 { + for _, e := range m.StoragePolicies { + l = e.Size() + n += 1 + l + sovMetadata(uint64(l)) + } + } + l = m.Pipeline.Size() + n += 1 + l + sovMetadata(uint64(l)) + if m.DropPolicy != 0 { + n += 1 + sovMetadata(uint64(m.DropPolicy)) + } + return n +} + +func (m *Metadata) Size() (n int) { + var l int + _ = l + if len(m.Pipelines) > 0 { + for _, e := range m.Pipelines { + l = e.Size() + n += 1 + l + sovMetadata(uint64(l)) + } + } + return n +} + +func (m *StagedMetadata) Size() (n int) { + var l int + _ = l + if m.CutoverNanos != 0 { + n += 1 + sovMetadata(uint64(m.CutoverNanos)) + } + if m.Tombstoned { + n += 2 + } + l = m.Metadata.Size() + n += 1 + l + sovMetadata(uint64(l)) + return n +} + +func (m *StagedMetadatas) Size() (n int) { + var l int + _ = l + if len(m.Metadatas) > 0 { + for _, e := range m.Metadatas { + l = e.Size() + n += 1 + l + sovMetadata(uint64(l)) + } + } + return n +} + +func (m *ForwardMetadata) Size() (n int) { + var l int + _ = l + l = m.AggregationId.Size() + n += 1 + l + sovMetadata(uint64(l)) + l = m.StoragePolicy.Size() + n += 1 + l + sovMetadata(uint64(l)) + l = m.Pipeline.Size() + n += 1 + l + sovMetadata(uint64(l)) + if m.SourceId != 0 { + n += 1 + sovMetadata(uint64(m.SourceId)) + } + if m.NumForwardedTimes != 0 { + n += 1 + sovMetadata(uint64(m.NumForwardedTimes)) + } + return n +} + +func (m *TimedMetadata) Size() (n int) { + var l int + _ = l + l = m.AggregationId.Size() + n += 1 + l + sovMetadata(uint64(l)) + l = m.StoragePolicy.Size() + n += 1 + l + sovMetadata(uint64(l)) + return n +} + +func sovMetadata(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozMetadata(x uint64) (n int) { + return sovMetadata(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *PipelineMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PipelineMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PipelineMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AggregationId", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AggregationId.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StoragePolicies", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StoragePolicies = append(m.StoragePolicies, policypb.StoragePolicy{}) + if err := m.StoragePolicies[len(m.StoragePolicies)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pipeline", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Pipeline.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DropPolicy", wireType) + } + m.DropPolicy = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DropPolicy |= (policypb.DropPolicy(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipMetadata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetadata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Metadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Metadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Metadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pipelines", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pipelines = append(m.Pipelines, PipelineMetadata{}) + if err := m.Pipelines[len(m.Pipelines)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMetadata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetadata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StagedMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StagedMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StagedMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CutoverNanos", wireType) + } + m.CutoverNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CutoverNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Tombstoned", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Tombstoned = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMetadata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetadata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StagedMetadatas) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StagedMetadatas: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StagedMetadatas: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadatas", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Metadatas = append(m.Metadatas, StagedMetadata{}) + if err := m.Metadatas[len(m.Metadatas)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMetadata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetadata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ForwardMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ForwardMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ForwardMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AggregationId", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AggregationId.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StoragePolicy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.StoragePolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pipeline", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Pipeline.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SourceId", wireType) + } + m.SourceId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SourceId |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumForwardedTimes", wireType) + } + m.NumForwardedTimes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumForwardedTimes |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipMetadata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetadata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TimedMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TimedMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TimedMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AggregationId", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AggregationId.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StoragePolicy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.StoragePolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMetadata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetadata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipMetadata(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthMetadata + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipMetadata(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthMetadata = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowMetadata = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.proto", fileDescriptorMetadata) +} + +var fileDescriptorMetadata = []byte{ + // 551 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xd1, 0x8a, 0xd3, 0x40, + 0x14, 0xdd, 0x69, 0x77, 0x25, 0x9d, 0xda, 0x76, 0x8d, 0x82, 0xa1, 0x2b, 0xb5, 0xc4, 0x97, 0xbe, + 0x38, 0x81, 0x56, 0xf1, 0x45, 0x85, 0x5d, 0x4a, 0xd9, 0x0a, 0xae, 0x4b, 0xd6, 0x27, 0x5f, 0x42, + 0x92, 0x99, 0x8d, 0x03, 0x4d, 0x26, 0xcc, 0x4c, 0x94, 0x7e, 0x83, 0x2f, 0xfe, 0x80, 0xe0, 0x17, + 0xf8, 0x1d, 0xfb, 0xe8, 0x17, 0x88, 0xd4, 0x1f, 0x91, 0x24, 0x33, 0x49, 0xba, 0x2f, 0x52, 0x45, + 0xd8, 0xb7, 0x7b, 0xef, 0xdc, 0x7b, 0x38, 0xe7, 0x70, 0x18, 0xb8, 0x88, 0xa8, 0x7c, 0x9f, 0x05, + 0x28, 0x64, 0xb1, 0x13, 0xcf, 0x70, 0xe0, 0xc4, 0x33, 0x47, 0xf0, 0xd0, 0x89, 0x89, 0xe4, 0x34, + 0x14, 0x4e, 0x44, 0x12, 0xc2, 0x7d, 0x49, 0xb0, 0x93, 0x72, 0x26, 0x99, 0x9a, 0xa7, 0x41, 0x5e, + 0xf8, 0xd8, 0x97, 0x3e, 0x2a, 0xe6, 0xa6, 0xa1, 0x1f, 0x86, 0x8f, 0x1b, 0x88, 0x11, 0x8b, 0x58, + 0x79, 0x18, 0x64, 0x97, 0x45, 0x57, 0xa2, 0xe4, 0x55, 0x79, 0x38, 0x3c, 0xdb, 0x91, 0x80, 0x1f, + 0x45, 0x9c, 0x44, 0xbe, 0xa4, 0x2c, 0x49, 0x83, 0x66, 0xa7, 0xf0, 0xe6, 0x3b, 0xe2, 0xa5, 0x6c, + 0x45, 0xc3, 0x75, 0x1a, 0xa8, 0x42, 0xa1, 0x9c, 0xee, 0x8a, 0x42, 0x53, 0xb2, 0xa2, 0x09, 0xc9, + 0x71, 0x54, 0x59, 0x22, 0xd9, 0x5f, 0x5a, 0xf0, 0xf0, 0x5c, 0x8d, 0x5e, 0x2b, 0xcf, 0xcc, 0x25, + 0xec, 0x37, 0x98, 0x7b, 0x14, 0x5b, 0x60, 0x0c, 0x26, 0xdd, 0xe9, 0x03, 0xb4, 0x25, 0x0f, 0x1d, + 0xd7, 0xdd, 0x72, 0x7e, 0xb2, 0x7f, 0xf5, 0xe3, 0xe1, 0x9e, 0xdb, 0x6b, 0xac, 0x2c, 0xb1, 0x79, + 0x0a, 0x0f, 0x85, 0x64, 0xdc, 0x8f, 0x88, 0x57, 0x28, 0xa0, 0x44, 0x58, 0xad, 0x71, 0x7b, 0xd2, + 0x9d, 0xde, 0x47, 0x5a, 0x1b, 0xba, 0x28, 0x37, 0xce, 0x8b, 0x5e, 0xe1, 0x0c, 0x44, 0x63, 0x48, + 0x89, 0x30, 0x5f, 0x40, 0x43, 0x73, 0xb7, 0xda, 0x05, 0x9d, 0x23, 0x54, 0xeb, 0x42, 0xc7, 0x69, + 0xba, 0xa2, 0x04, 0x6b, 0x2d, 0x0a, 0xa5, 0x3a, 0x31, 0x9f, 0xc2, 0x2e, 0xe6, 0x2c, 0x2d, 0x59, + 0xac, 0xad, 0xfd, 0x31, 0x98, 0xf4, 0xa7, 0xf7, 0x6a, 0x0e, 0x73, 0xce, 0xd2, 0x92, 0x80, 0x0b, + 0x71, 0x55, 0xdb, 0xaf, 0xa0, 0x51, 0xd9, 0xf2, 0x12, 0x76, 0x34, 0x9c, 0xb0, 0x40, 0x21, 0x62, + 0x88, 0x74, 0xb0, 0xd0, 0x75, 0x17, 0x15, 0x83, 0xfa, 0xc4, 0xfe, 0x04, 0x60, 0xff, 0x42, 0xfa, + 0x11, 0xc1, 0x15, 0xe4, 0x23, 0xd8, 0x0b, 0x33, 0xc9, 0x3e, 0x10, 0xee, 0x25, 0x7e, 0xc2, 0x44, + 0x61, 0x74, 0xdb, 0xbd, 0xad, 0x86, 0x67, 0xf9, 0xcc, 0x1c, 0x41, 0x28, 0x59, 0x1c, 0x08, 0xc9, + 0x12, 0x82, 0xad, 0xd6, 0x18, 0x4c, 0x0c, 0xb7, 0x31, 0x31, 0x9f, 0x40, 0x43, 0xc7, 0x5d, 0x39, + 0x63, 0xd6, 0xb4, 0xae, 0xd1, 0xa9, 0x36, 0xed, 0x37, 0x70, 0xb0, 0x4d, 0x46, 0x98, 0xcf, 0x61, + 0x47, 0x3f, 0x6b, 0x81, 0x56, 0x8d, 0xb4, 0xbd, 0xad, 0xe5, 0x55, 0x07, 0xf6, 0xb7, 0x16, 0x1c, + 0x2c, 0x18, 0xff, 0xe8, 0x73, 0xfc, 0x3f, 0x92, 0x34, 0x87, 0xfd, 0xad, 0x24, 0xad, 0x0b, 0x27, + 0xfe, 0x98, 0xa3, 0x5e, 0x33, 0x47, 0xeb, 0x7f, 0x4d, 0xd1, 0x11, 0xec, 0x08, 0x96, 0xf1, 0x90, + 0xe4, 0x52, 0xf2, 0x0c, 0xf5, 0x5c, 0xa3, 0x1c, 0x2c, 0xb1, 0x89, 0xe0, 0xdd, 0x24, 0x8b, 0xbd, + 0xcb, 0xd2, 0x03, 0x82, 0x3d, 0x49, 0x63, 0x22, 0xac, 0x83, 0x31, 0x98, 0x1c, 0xb8, 0x77, 0x92, + 0x2c, 0x5e, 0xe8, 0x97, 0xb7, 0xf9, 0x83, 0xfd, 0x15, 0xc0, 0x5e, 0x5e, 0xdd, 0x5c, 0xbb, 0x4e, + 0x96, 0x57, 0x9b, 0x11, 0xf8, 0xbe, 0x19, 0x81, 0x9f, 0x9b, 0x11, 0xf8, 0xfc, 0x6b, 0xb4, 0xf7, + 0xee, 0xd9, 0x5f, 0xfe, 0xc8, 0xc1, 0xad, 0xa2, 0x9f, 0xfd, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x29, + 0x6f, 0x13, 0xd0, 0xd3, 0x05, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.proto b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.proto new file mode 100644 index 00000000..74913853 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metadata.proto @@ -0,0 +1,64 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +syntax = "proto3"; + +option go_package = "github.com/m3db/m3/src/metrics/generated/proto/metricpb"; + +package metricpb; + +import "github.com/gogo/protobuf/gogoproto/gogo.proto"; +import "github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.proto"; +import "github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.proto"; +import "github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.proto"; + +message PipelineMetadata { + aggregationpb.AggregationID aggregation_id = 1 [(gogoproto.nullable) = false]; + repeated policypb.StoragePolicy storage_policies = 2 [(gogoproto.nullable) = false]; + pipelinepb.AppliedPipeline pipeline = 3 [(gogoproto.nullable) = false]; + policypb.DropPolicy drop_policy = 4; +} + +message Metadata { + repeated PipelineMetadata pipelines = 1 [(gogoproto.nullable) = false]; +} + +message StagedMetadata { + int64 cutover_nanos = 1; + bool tombstoned = 2; + Metadata metadata = 3 [(gogoproto.nullable) = false]; +} + +message StagedMetadatas { + repeated StagedMetadata metadatas = 1 [(gogoproto.nullable) = false]; +} + +message ForwardMetadata { + aggregationpb.AggregationID aggregation_id = 1 [(gogoproto.nullable) = false]; + policypb.StoragePolicy storage_policy = 2 [(gogoproto.nullable) = false]; + pipelinepb.AppliedPipeline pipeline = 3 [(gogoproto.nullable) = false]; + uint32 source_id = 4; + int32 num_forwarded_times = 5; +} + +message TimedMetadata { + aggregationpb.AggregationID aggregation_id = 1 [(gogoproto.nullable) = false]; + policypb.StoragePolicy storage_policy = 2 [(gogoproto.nullable) = false]; +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.pb.go b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.pb.go new file mode 100644 index 00000000..9dfe73ca --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.pb.go @@ -0,0 +1,1431 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.proto + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package metricpb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import binary "encoding/binary" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type MetricType int32 + +const ( + MetricType_UNKNOWN MetricType = 0 + MetricType_COUNTER MetricType = 1 + MetricType_TIMER MetricType = 2 + MetricType_GAUGE MetricType = 3 +) + +var MetricType_name = map[int32]string{ + 0: "UNKNOWN", + 1: "COUNTER", + 2: "TIMER", + 3: "GAUGE", +} +var MetricType_value = map[string]int32{ + "UNKNOWN": 0, + "COUNTER": 1, + "TIMER": 2, + "GAUGE": 3, +} + +func (x MetricType) String() string { + return proto.EnumName(MetricType_name, int32(x)) +} +func (MetricType) EnumDescriptor() ([]byte, []int) { return fileDescriptorMetric, []int{0} } + +type Counter struct { + Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Value int64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *Counter) Reset() { *m = Counter{} } +func (m *Counter) String() string { return proto.CompactTextString(m) } +func (*Counter) ProtoMessage() {} +func (*Counter) Descriptor() ([]byte, []int) { return fileDescriptorMetric, []int{0} } + +func (m *Counter) GetId() []byte { + if m != nil { + return m.Id + } + return nil +} + +func (m *Counter) GetValue() int64 { + if m != nil { + return m.Value + } + return 0 +} + +type BatchTimer struct { + Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Values []float64 `protobuf:"fixed64,2,rep,packed,name=values" json:"values,omitempty"` +} + +func (m *BatchTimer) Reset() { *m = BatchTimer{} } +func (m *BatchTimer) String() string { return proto.CompactTextString(m) } +func (*BatchTimer) ProtoMessage() {} +func (*BatchTimer) Descriptor() ([]byte, []int) { return fileDescriptorMetric, []int{1} } + +func (m *BatchTimer) GetId() []byte { + if m != nil { + return m.Id + } + return nil +} + +func (m *BatchTimer) GetValues() []float64 { + if m != nil { + return m.Values + } + return nil +} + +type Gauge struct { + Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Value float64 `protobuf:"fixed64,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *Gauge) Reset() { *m = Gauge{} } +func (m *Gauge) String() string { return proto.CompactTextString(m) } +func (*Gauge) ProtoMessage() {} +func (*Gauge) Descriptor() ([]byte, []int) { return fileDescriptorMetric, []int{2} } + +func (m *Gauge) GetId() []byte { + if m != nil { + return m.Id + } + return nil +} + +func (m *Gauge) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +type TimedMetric struct { + Type MetricType `protobuf:"varint,1,opt,name=type,proto3,enum=metricpb.MetricType" json:"type,omitempty"` + Id []byte `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + TimeNanos int64 `protobuf:"varint,3,opt,name=time_nanos,json=timeNanos,proto3" json:"time_nanos,omitempty"` + Value float64 `protobuf:"fixed64,4,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *TimedMetric) Reset() { *m = TimedMetric{} } +func (m *TimedMetric) String() string { return proto.CompactTextString(m) } +func (*TimedMetric) ProtoMessage() {} +func (*TimedMetric) Descriptor() ([]byte, []int) { return fileDescriptorMetric, []int{3} } + +func (m *TimedMetric) GetType() MetricType { + if m != nil { + return m.Type + } + return MetricType_UNKNOWN +} + +func (m *TimedMetric) GetId() []byte { + if m != nil { + return m.Id + } + return nil +} + +func (m *TimedMetric) GetTimeNanos() int64 { + if m != nil { + return m.TimeNanos + } + return 0 +} + +func (m *TimedMetric) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +type ForwardedMetric struct { + Type MetricType `protobuf:"varint,1,opt,name=type,proto3,enum=metricpb.MetricType" json:"type,omitempty"` + Id []byte `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + TimeNanos int64 `protobuf:"varint,3,opt,name=time_nanos,json=timeNanos,proto3" json:"time_nanos,omitempty"` + Values []float64 `protobuf:"fixed64,4,rep,packed,name=values" json:"values,omitempty"` +} + +func (m *ForwardedMetric) Reset() { *m = ForwardedMetric{} } +func (m *ForwardedMetric) String() string { return proto.CompactTextString(m) } +func (*ForwardedMetric) ProtoMessage() {} +func (*ForwardedMetric) Descriptor() ([]byte, []int) { return fileDescriptorMetric, []int{4} } + +func (m *ForwardedMetric) GetType() MetricType { + if m != nil { + return m.Type + } + return MetricType_UNKNOWN +} + +func (m *ForwardedMetric) GetId() []byte { + if m != nil { + return m.Id + } + return nil +} + +func (m *ForwardedMetric) GetTimeNanos() int64 { + if m != nil { + return m.TimeNanos + } + return 0 +} + +func (m *ForwardedMetric) GetValues() []float64 { + if m != nil { + return m.Values + } + return nil +} + +type Tag struct { + Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *Tag) Reset() { *m = Tag{} } +func (m *Tag) String() string { return proto.CompactTextString(m) } +func (*Tag) ProtoMessage() {} +func (*Tag) Descriptor() ([]byte, []int) { return fileDescriptorMetric, []int{5} } + +func (m *Tag) GetName() []byte { + if m != nil { + return m.Name + } + return nil +} + +func (m *Tag) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*Counter)(nil), "metricpb.Counter") + proto.RegisterType((*BatchTimer)(nil), "metricpb.BatchTimer") + proto.RegisterType((*Gauge)(nil), "metricpb.Gauge") + proto.RegisterType((*TimedMetric)(nil), "metricpb.TimedMetric") + proto.RegisterType((*ForwardedMetric)(nil), "metricpb.ForwardedMetric") + proto.RegisterType((*Tag)(nil), "metricpb.Tag") + proto.RegisterEnum("metricpb.MetricType", MetricType_name, MetricType_value) +} +func (m *Counter) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Counter) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintMetric(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if m.Value != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintMetric(dAtA, i, uint64(m.Value)) + } + return i, nil +} + +func (m *BatchTimer) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BatchTimer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintMetric(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if len(m.Values) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintMetric(dAtA, i, uint64(len(m.Values)*8)) + for _, num := range m.Values { + f1 := math.Float64bits(float64(num)) + binary.LittleEndian.PutUint64(dAtA[i:], uint64(f1)) + i += 8 + } + } + return i, nil +} + +func (m *Gauge) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Gauge) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintMetric(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if m.Value != 0 { + dAtA[i] = 0x11 + i++ + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + i += 8 + } + return i, nil +} + +func (m *TimedMetric) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TimedMetric) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintMetric(dAtA, i, uint64(m.Type)) + } + if len(m.Id) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintMetric(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if m.TimeNanos != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintMetric(dAtA, i, uint64(m.TimeNanos)) + } + if m.Value != 0 { + dAtA[i] = 0x21 + i++ + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + i += 8 + } + return i, nil +} + +func (m *ForwardedMetric) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ForwardedMetric) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintMetric(dAtA, i, uint64(m.Type)) + } + if len(m.Id) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintMetric(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if m.TimeNanos != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintMetric(dAtA, i, uint64(m.TimeNanos)) + } + if len(m.Values) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintMetric(dAtA, i, uint64(len(m.Values)*8)) + for _, num := range m.Values { + f2 := math.Float64bits(float64(num)) + binary.LittleEndian.PutUint64(dAtA[i:], uint64(f2)) + i += 8 + } + } + return i, nil +} + +func (m *Tag) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Tag) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintMetric(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if len(m.Value) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintMetric(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + return i, nil +} + +func encodeVarintMetric(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Counter) Size() (n int) { + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovMetric(uint64(l)) + } + if m.Value != 0 { + n += 1 + sovMetric(uint64(m.Value)) + } + return n +} + +func (m *BatchTimer) Size() (n int) { + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovMetric(uint64(l)) + } + if len(m.Values) > 0 { + n += 1 + sovMetric(uint64(len(m.Values)*8)) + len(m.Values)*8 + } + return n +} + +func (m *Gauge) Size() (n int) { + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovMetric(uint64(l)) + } + if m.Value != 0 { + n += 9 + } + return n +} + +func (m *TimedMetric) Size() (n int) { + var l int + _ = l + if m.Type != 0 { + n += 1 + sovMetric(uint64(m.Type)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovMetric(uint64(l)) + } + if m.TimeNanos != 0 { + n += 1 + sovMetric(uint64(m.TimeNanos)) + } + if m.Value != 0 { + n += 9 + } + return n +} + +func (m *ForwardedMetric) Size() (n int) { + var l int + _ = l + if m.Type != 0 { + n += 1 + sovMetric(uint64(m.Type)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovMetric(uint64(l)) + } + if m.TimeNanos != 0 { + n += 1 + sovMetric(uint64(m.TimeNanos)) + } + if len(m.Values) > 0 { + n += 1 + sovMetric(uint64(len(m.Values)*8)) + len(m.Values)*8 + } + return n +} + +func (m *Tag) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovMetric(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovMetric(uint64(l)) + } + return n +} + +func sovMetric(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozMetric(x uint64) (n int) { + return sovMetric(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Counter) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Counter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Counter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMetric + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = append(m.Id[:0], dAtA[iNdEx:postIndex]...) + if m.Id == nil { + m.Id = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + m.Value = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Value |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipMetric(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetric + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BatchTimer) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BatchTimer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BatchTimer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMetric + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = append(m.Id[:0], dAtA[iNdEx:postIndex]...) + if m.Id == nil { + m.Id = []byte{} + } + iNdEx = postIndex + case 2: + if wireType == 1 { + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + v2 := float64(math.Float64frombits(v)) + m.Values = append(m.Values, v2) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthMetric + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + v2 := float64(math.Float64frombits(v)) + m.Values = append(m.Values, v2) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipMetric(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetric + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Gauge) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Gauge: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Gauge: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMetric + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = append(m.Id[:0], dAtA[iNdEx:postIndex]...) + if m.Id == nil { + m.Id = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Value = float64(math.Float64frombits(v)) + default: + iNdEx = preIndex + skippy, err := skipMetric(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetric + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TimedMetric) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TimedMetric: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TimedMetric: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (MetricType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMetric + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = append(m.Id[:0], dAtA[iNdEx:postIndex]...) + if m.Id == nil { + m.Id = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeNanos", wireType) + } + m.TimeNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TimeNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Value = float64(math.Float64frombits(v)) + default: + iNdEx = preIndex + skippy, err := skipMetric(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetric + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ForwardedMetric) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ForwardedMetric: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ForwardedMetric: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (MetricType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMetric + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = append(m.Id[:0], dAtA[iNdEx:postIndex]...) + if m.Id == nil { + m.Id = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeNanos", wireType) + } + m.TimeNanos = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TimeNanos |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType == 1 { + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + v2 := float64(math.Float64frombits(v)) + m.Values = append(m.Values, v2) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthMetric + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + v2 := float64(math.Float64frombits(v)) + m.Values = append(m.Values, v2) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipMetric(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetric + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Tag) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Tag: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Tag: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMetric + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = append(m.Name[:0], dAtA[iNdEx:postIndex]...) + if m.Name == nil { + m.Name = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetric + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMetric + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMetric(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMetric + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipMetric(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetric + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetric + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetric + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthMetric + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMetric + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipMetric(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthMetric = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowMetric = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.proto", fileDescriptorMetric) +} + +var fileDescriptorMetric = []byte{ + // 363 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x52, 0xcd, 0x6a, 0xe2, 0x50, + 0x18, 0xf5, 0x26, 0x51, 0xc7, 0x4f, 0x71, 0xc2, 0x45, 0x86, 0x6c, 0x26, 0x88, 0xab, 0x30, 0x30, + 0xb9, 0x30, 0x0e, 0x74, 0xd3, 0x4d, 0xb5, 0x56, 0xa4, 0x18, 0x21, 0x44, 0x0a, 0xdd, 0x94, 0x9b, + 0xe4, 0x12, 0x03, 0xcd, 0x0f, 0xc9, 0x4d, 0x8b, 0xd0, 0x55, 0x9f, 0xa0, 0x8f, 0xd5, 0x65, 0x1f, + 0xa1, 0xd8, 0x17, 0x29, 0xb9, 0xc6, 0x5a, 0xa1, 0x74, 0x51, 0xe8, 0xee, 0x3b, 0x27, 0xdf, 0x77, + 0xce, 0xc9, 0xe1, 0xc2, 0x69, 0x10, 0xf2, 0x55, 0xe1, 0x9a, 0x5e, 0x12, 0x91, 0x68, 0xe8, 0xbb, + 0x24, 0x1a, 0x92, 0x3c, 0xf3, 0x48, 0xc4, 0x78, 0x16, 0x7a, 0x39, 0x09, 0x58, 0xcc, 0x32, 0xca, + 0x99, 0x4f, 0xd2, 0x2c, 0xe1, 0x49, 0xc5, 0xa7, 0x6e, 0x35, 0x98, 0x82, 0xc5, 0x3f, 0x76, 0xf4, + 0x80, 0x40, 0x73, 0x9c, 0x14, 0x31, 0x67, 0x19, 0xee, 0x82, 0x14, 0xfa, 0x1a, 0xea, 0x23, 0xa3, + 0x63, 0x4b, 0xa1, 0x8f, 0x7b, 0x50, 0xbf, 0xa1, 0xd7, 0x05, 0xd3, 0xa4, 0x3e, 0x32, 0x64, 0x7b, + 0x0b, 0x06, 0xff, 0x01, 0x46, 0x94, 0x7b, 0x2b, 0x27, 0x8c, 0x3e, 0xb8, 0xf9, 0x05, 0x0d, 0xb1, + 0x96, 0x6b, 0x52, 0x5f, 0x36, 0x90, 0x5d, 0xa1, 0xc1, 0x5f, 0xa8, 0x4f, 0x69, 0x11, 0xb0, 0xcf, + 0x4d, 0xd0, 0xce, 0xe4, 0x0e, 0xda, 0xa5, 0xbe, 0x3f, 0x17, 0x31, 0xb1, 0x01, 0x0a, 0x5f, 0xa7, + 0x4c, 0x9c, 0x75, 0xff, 0xf5, 0xcc, 0x5d, 0x7a, 0x73, 0xfb, 0xdd, 0x59, 0xa7, 0xcc, 0x16, 0x1b, + 0x95, 0xbc, 0xf4, 0x26, 0xff, 0x1b, 0x80, 0x87, 0x11, 0xbb, 0x8a, 0x69, 0x9c, 0xe4, 0x9a, 0x2c, + 0x7e, 0xa4, 0x55, 0x32, 0x56, 0x49, 0xec, 0xdd, 0x95, 0xf7, 0xee, 0xf7, 0x08, 0x7e, 0x9e, 0x25, + 0xd9, 0x2d, 0xcd, 0xfc, 0xef, 0x8f, 0xb0, 0x6f, 0x4c, 0x39, 0x68, 0x8c, 0x80, 0xec, 0xd0, 0x00, + 0x63, 0x50, 0x62, 0x1a, 0xb1, 0xaa, 0x31, 0x31, 0x1f, 0x76, 0xd6, 0xa9, 0x52, 0xff, 0x39, 0x06, + 0xd8, 0x67, 0xc1, 0x6d, 0x68, 0x2e, 0xad, 0x73, 0x6b, 0x71, 0x61, 0xa9, 0xb5, 0x12, 0x8c, 0x17, + 0x4b, 0xcb, 0x99, 0xd8, 0x2a, 0xc2, 0x2d, 0xa8, 0x3b, 0xb3, 0xf9, 0xc4, 0x56, 0xa5, 0x72, 0x9c, + 0x9e, 0x2c, 0xa7, 0x13, 0x55, 0x1e, 0xcd, 0x1e, 0x37, 0x3a, 0x7a, 0xda, 0xe8, 0xe8, 0x79, 0xa3, + 0xa3, 0x87, 0x17, 0xbd, 0x76, 0x79, 0xf4, 0xc5, 0x97, 0xe6, 0x36, 0x04, 0x1e, 0xbe, 0x06, 0x00, + 0x00, 0xff, 0xff, 0x50, 0xec, 0x69, 0x54, 0xab, 0x02, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.proto b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.proto new file mode 100644 index 00000000..f296204b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/metricpb/metric.proto @@ -0,0 +1,66 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +syntax = "proto3"; + +option go_package = "github.com/m3db/m3/src/metrics/generated/proto/metricpb"; + +package metricpb; + +enum MetricType { + UNKNOWN = 0; + COUNTER = 1; + TIMER = 2; + GAUGE = 3; +} + +message Counter { + bytes id = 1; + int64 value = 2; +} + +message BatchTimer { + bytes id = 1; + repeated double values = 2; +} + +message Gauge { + bytes id = 1; + double value = 2; +} + +message TimedMetric { + MetricType type = 1; + bytes id = 2; + int64 time_nanos = 3; + double value = 4; +} + +message ForwardedMetric { + MetricType type = 1; + bytes id = 2; + int64 time_nanos = 3; + repeated double values = 4; +} + +message Tag { + bytes name = 1; + bytes value = 2; +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.pb.go b/vendor/github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.pb.go new file mode 100644 index 00000000..293cdd47 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.pb.go @@ -0,0 +1,1784 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.proto + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* + Package pipelinepb is a generated protocol buffer package. + + It is generated from these files: + github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.proto + + It has these top-level messages: + AggregationOp + TransformationOp + RollupOp + PipelineOp + Pipeline + AppliedRollupOp + AppliedPipelineOp + AppliedPipeline +*/ +package pipelinepb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" +import _ "github.com/gogo/protobuf/gogoproto" +import aggregationpb "github.com/m3db/m3/src/metrics/generated/proto/aggregationpb" +import transformationpb "github.com/m3db/m3/src/metrics/generated/proto/transformationpb" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type PipelineOp_Type int32 + +const ( + PipelineOp_UNKNOWN PipelineOp_Type = 0 + PipelineOp_AGGREGATION PipelineOp_Type = 1 + PipelineOp_TRANSFORMATION PipelineOp_Type = 2 + PipelineOp_ROLLUP PipelineOp_Type = 3 +) + +var PipelineOp_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "AGGREGATION", + 2: "TRANSFORMATION", + 3: "ROLLUP", +} +var PipelineOp_Type_value = map[string]int32{ + "UNKNOWN": 0, + "AGGREGATION": 1, + "TRANSFORMATION": 2, + "ROLLUP": 3, +} + +func (x PipelineOp_Type) String() string { + return proto.EnumName(PipelineOp_Type_name, int32(x)) +} +func (PipelineOp_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorPipeline, []int{3, 0} } + +type AppliedPipelineOp_Type int32 + +const ( + AppliedPipelineOp_UNKNOWN AppliedPipelineOp_Type = 0 + AppliedPipelineOp_TRANSFORMATION AppliedPipelineOp_Type = 1 + AppliedPipelineOp_ROLLUP AppliedPipelineOp_Type = 2 +) + +var AppliedPipelineOp_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "TRANSFORMATION", + 2: "ROLLUP", +} +var AppliedPipelineOp_Type_value = map[string]int32{ + "UNKNOWN": 0, + "TRANSFORMATION": 1, + "ROLLUP": 2, +} + +func (x AppliedPipelineOp_Type) String() string { + return proto.EnumName(AppliedPipelineOp_Type_name, int32(x)) +} +func (AppliedPipelineOp_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorPipeline, []int{6, 0} +} + +type AggregationOp struct { + Type aggregationpb.AggregationType `protobuf:"varint,1,opt,name=type,proto3,enum=aggregationpb.AggregationType" json:"type,omitempty"` +} + +func (m *AggregationOp) Reset() { *m = AggregationOp{} } +func (m *AggregationOp) String() string { return proto.CompactTextString(m) } +func (*AggregationOp) ProtoMessage() {} +func (*AggregationOp) Descriptor() ([]byte, []int) { return fileDescriptorPipeline, []int{0} } + +func (m *AggregationOp) GetType() aggregationpb.AggregationType { + if m != nil { + return m.Type + } + return aggregationpb.AggregationType_UNKNOWN +} + +type TransformationOp struct { + Type transformationpb.TransformationType `protobuf:"varint,1,opt,name=type,proto3,enum=transformationpb.TransformationType" json:"type,omitempty"` +} + +func (m *TransformationOp) Reset() { *m = TransformationOp{} } +func (m *TransformationOp) String() string { return proto.CompactTextString(m) } +func (*TransformationOp) ProtoMessage() {} +func (*TransformationOp) Descriptor() ([]byte, []int) { return fileDescriptorPipeline, []int{1} } + +func (m *TransformationOp) GetType() transformationpb.TransformationType { + if m != nil { + return m.Type + } + return transformationpb.TransformationType_UNKNOWN +} + +type RollupOp struct { + NewName string `protobuf:"bytes,1,opt,name=new_name,json=newName,proto3" json:"new_name,omitempty"` + Tags []string `protobuf:"bytes,2,rep,name=tags" json:"tags,omitempty"` + AggregationTypes []aggregationpb.AggregationType `protobuf:"varint,3,rep,packed,name=aggregation_types,json=aggregationTypes,enum=aggregationpb.AggregationType" json:"aggregation_types,omitempty"` +} + +func (m *RollupOp) Reset() { *m = RollupOp{} } +func (m *RollupOp) String() string { return proto.CompactTextString(m) } +func (*RollupOp) ProtoMessage() {} +func (*RollupOp) Descriptor() ([]byte, []int) { return fileDescriptorPipeline, []int{2} } + +func (m *RollupOp) GetNewName() string { + if m != nil { + return m.NewName + } + return "" +} + +func (m *RollupOp) GetTags() []string { + if m != nil { + return m.Tags + } + return nil +} + +func (m *RollupOp) GetAggregationTypes() []aggregationpb.AggregationType { + if m != nil { + return m.AggregationTypes + } + return nil +} + +type PipelineOp struct { + Type PipelineOp_Type `protobuf:"varint,1,opt,name=type,proto3,enum=pipelinepb.PipelineOp_Type" json:"type,omitempty"` + Aggregation *AggregationOp `protobuf:"bytes,2,opt,name=aggregation" json:"aggregation,omitempty"` + Transformation *TransformationOp `protobuf:"bytes,3,opt,name=transformation" json:"transformation,omitempty"` + Rollup *RollupOp `protobuf:"bytes,4,opt,name=rollup" json:"rollup,omitempty"` +} + +func (m *PipelineOp) Reset() { *m = PipelineOp{} } +func (m *PipelineOp) String() string { return proto.CompactTextString(m) } +func (*PipelineOp) ProtoMessage() {} +func (*PipelineOp) Descriptor() ([]byte, []int) { return fileDescriptorPipeline, []int{3} } + +func (m *PipelineOp) GetType() PipelineOp_Type { + if m != nil { + return m.Type + } + return PipelineOp_UNKNOWN +} + +func (m *PipelineOp) GetAggregation() *AggregationOp { + if m != nil { + return m.Aggregation + } + return nil +} + +func (m *PipelineOp) GetTransformation() *TransformationOp { + if m != nil { + return m.Transformation + } + return nil +} + +func (m *PipelineOp) GetRollup() *RollupOp { + if m != nil { + return m.Rollup + } + return nil +} + +type Pipeline struct { + Ops []PipelineOp `protobuf:"bytes,1,rep,name=ops" json:"ops"` +} + +func (m *Pipeline) Reset() { *m = Pipeline{} } +func (m *Pipeline) String() string { return proto.CompactTextString(m) } +func (*Pipeline) ProtoMessage() {} +func (*Pipeline) Descriptor() ([]byte, []int) { return fileDescriptorPipeline, []int{4} } + +func (m *Pipeline) GetOps() []PipelineOp { + if m != nil { + return m.Ops + } + return nil +} + +// AppliedRollupOp is a rollup operation that has been +// applied against a metric. +type AppliedRollupOp struct { + Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + AggregationId aggregationpb.AggregationID `protobuf:"bytes,2,opt,name=aggregation_id,json=aggregationId" json:"aggregation_id"` +} + +func (m *AppliedRollupOp) Reset() { *m = AppliedRollupOp{} } +func (m *AppliedRollupOp) String() string { return proto.CompactTextString(m) } +func (*AppliedRollupOp) ProtoMessage() {} +func (*AppliedRollupOp) Descriptor() ([]byte, []int) { return fileDescriptorPipeline, []int{5} } + +func (m *AppliedRollupOp) GetId() []byte { + if m != nil { + return m.Id + } + return nil +} + +func (m *AppliedRollupOp) GetAggregationId() aggregationpb.AggregationID { + if m != nil { + return m.AggregationId + } + return aggregationpb.AggregationID{} +} + +// AppliedPipelineOp is a pipeline operation that has +// been applied against a metric. +type AppliedPipelineOp struct { + Type AppliedPipelineOp_Type `protobuf:"varint,1,opt,name=type,proto3,enum=pipelinepb.AppliedPipelineOp_Type" json:"type,omitempty"` + Transformation *TransformationOp `protobuf:"bytes,2,opt,name=transformation" json:"transformation,omitempty"` + Rollup *AppliedRollupOp `protobuf:"bytes,3,opt,name=rollup" json:"rollup,omitempty"` +} + +func (m *AppliedPipelineOp) Reset() { *m = AppliedPipelineOp{} } +func (m *AppliedPipelineOp) String() string { return proto.CompactTextString(m) } +func (*AppliedPipelineOp) ProtoMessage() {} +func (*AppliedPipelineOp) Descriptor() ([]byte, []int) { return fileDescriptorPipeline, []int{6} } + +func (m *AppliedPipelineOp) GetType() AppliedPipelineOp_Type { + if m != nil { + return m.Type + } + return AppliedPipelineOp_UNKNOWN +} + +func (m *AppliedPipelineOp) GetTransformation() *TransformationOp { + if m != nil { + return m.Transformation + } + return nil +} + +func (m *AppliedPipelineOp) GetRollup() *AppliedRollupOp { + if m != nil { + return m.Rollup + } + return nil +} + +// AppliedPipelineOp is a pipeline containing operations +// that have been applied against a metric. +type AppliedPipeline struct { + Ops []AppliedPipelineOp `protobuf:"bytes,1,rep,name=ops" json:"ops"` +} + +func (m *AppliedPipeline) Reset() { *m = AppliedPipeline{} } +func (m *AppliedPipeline) String() string { return proto.CompactTextString(m) } +func (*AppliedPipeline) ProtoMessage() {} +func (*AppliedPipeline) Descriptor() ([]byte, []int) { return fileDescriptorPipeline, []int{7} } + +func (m *AppliedPipeline) GetOps() []AppliedPipelineOp { + if m != nil { + return m.Ops + } + return nil +} + +func init() { + proto.RegisterType((*AggregationOp)(nil), "pipelinepb.AggregationOp") + proto.RegisterType((*TransformationOp)(nil), "pipelinepb.TransformationOp") + proto.RegisterType((*RollupOp)(nil), "pipelinepb.RollupOp") + proto.RegisterType((*PipelineOp)(nil), "pipelinepb.PipelineOp") + proto.RegisterType((*Pipeline)(nil), "pipelinepb.Pipeline") + proto.RegisterType((*AppliedRollupOp)(nil), "pipelinepb.AppliedRollupOp") + proto.RegisterType((*AppliedPipelineOp)(nil), "pipelinepb.AppliedPipelineOp") + proto.RegisterType((*AppliedPipeline)(nil), "pipelinepb.AppliedPipeline") + proto.RegisterEnum("pipelinepb.PipelineOp_Type", PipelineOp_Type_name, PipelineOp_Type_value) + proto.RegisterEnum("pipelinepb.AppliedPipelineOp_Type", AppliedPipelineOp_Type_name, AppliedPipelineOp_Type_value) +} +func (m *AggregationOp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AggregationOp) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPipeline(dAtA, i, uint64(m.Type)) + } + return i, nil +} + +func (m *TransformationOp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TransformationOp) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPipeline(dAtA, i, uint64(m.Type)) + } + return i, nil +} + +func (m *RollupOp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RollupOp) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.NewName) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintPipeline(dAtA, i, uint64(len(m.NewName))) + i += copy(dAtA[i:], m.NewName) + } + if len(m.Tags) > 0 { + for _, s := range m.Tags { + dAtA[i] = 0x12 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.AggregationTypes) > 0 { + dAtA2 := make([]byte, len(m.AggregationTypes)*10) + var j1 int + for _, num := range m.AggregationTypes { + for num >= 1<<7 { + dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA2[j1] = uint8(num) + j1++ + } + dAtA[i] = 0x1a + i++ + i = encodeVarintPipeline(dAtA, i, uint64(j1)) + i += copy(dAtA[i:], dAtA2[:j1]) + } + return i, nil +} + +func (m *PipelineOp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PipelineOp) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPipeline(dAtA, i, uint64(m.Type)) + } + if m.Aggregation != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintPipeline(dAtA, i, uint64(m.Aggregation.Size())) + n3, err := m.Aggregation.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + if m.Transformation != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintPipeline(dAtA, i, uint64(m.Transformation.Size())) + n4, err := m.Transformation.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + if m.Rollup != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintPipeline(dAtA, i, uint64(m.Rollup.Size())) + n5, err := m.Rollup.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + return i, nil +} + +func (m *Pipeline) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Pipeline) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Ops) > 0 { + for _, msg := range m.Ops { + dAtA[i] = 0xa + i++ + i = encodeVarintPipeline(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *AppliedRollupOp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AppliedRollupOp) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintPipeline(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + dAtA[i] = 0x12 + i++ + i = encodeVarintPipeline(dAtA, i, uint64(m.AggregationId.Size())) + n6, err := m.AggregationId.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + return i, nil +} + +func (m *AppliedPipelineOp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AppliedPipelineOp) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPipeline(dAtA, i, uint64(m.Type)) + } + if m.Transformation != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintPipeline(dAtA, i, uint64(m.Transformation.Size())) + n7, err := m.Transformation.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + if m.Rollup != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintPipeline(dAtA, i, uint64(m.Rollup.Size())) + n8, err := m.Rollup.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + } + return i, nil +} + +func (m *AppliedPipeline) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AppliedPipeline) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Ops) > 0 { + for _, msg := range m.Ops { + dAtA[i] = 0xa + i++ + i = encodeVarintPipeline(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func encodeVarintPipeline(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *AggregationOp) Size() (n int) { + var l int + _ = l + if m.Type != 0 { + n += 1 + sovPipeline(uint64(m.Type)) + } + return n +} + +func (m *TransformationOp) Size() (n int) { + var l int + _ = l + if m.Type != 0 { + n += 1 + sovPipeline(uint64(m.Type)) + } + return n +} + +func (m *RollupOp) Size() (n int) { + var l int + _ = l + l = len(m.NewName) + if l > 0 { + n += 1 + l + sovPipeline(uint64(l)) + } + if len(m.Tags) > 0 { + for _, s := range m.Tags { + l = len(s) + n += 1 + l + sovPipeline(uint64(l)) + } + } + if len(m.AggregationTypes) > 0 { + l = 0 + for _, e := range m.AggregationTypes { + l += sovPipeline(uint64(e)) + } + n += 1 + sovPipeline(uint64(l)) + l + } + return n +} + +func (m *PipelineOp) Size() (n int) { + var l int + _ = l + if m.Type != 0 { + n += 1 + sovPipeline(uint64(m.Type)) + } + if m.Aggregation != nil { + l = m.Aggregation.Size() + n += 1 + l + sovPipeline(uint64(l)) + } + if m.Transformation != nil { + l = m.Transformation.Size() + n += 1 + l + sovPipeline(uint64(l)) + } + if m.Rollup != nil { + l = m.Rollup.Size() + n += 1 + l + sovPipeline(uint64(l)) + } + return n +} + +func (m *Pipeline) Size() (n int) { + var l int + _ = l + if len(m.Ops) > 0 { + for _, e := range m.Ops { + l = e.Size() + n += 1 + l + sovPipeline(uint64(l)) + } + } + return n +} + +func (m *AppliedRollupOp) Size() (n int) { + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovPipeline(uint64(l)) + } + l = m.AggregationId.Size() + n += 1 + l + sovPipeline(uint64(l)) + return n +} + +func (m *AppliedPipelineOp) Size() (n int) { + var l int + _ = l + if m.Type != 0 { + n += 1 + sovPipeline(uint64(m.Type)) + } + if m.Transformation != nil { + l = m.Transformation.Size() + n += 1 + l + sovPipeline(uint64(l)) + } + if m.Rollup != nil { + l = m.Rollup.Size() + n += 1 + l + sovPipeline(uint64(l)) + } + return n +} + +func (m *AppliedPipeline) Size() (n int) { + var l int + _ = l + if len(m.Ops) > 0 { + for _, e := range m.Ops { + l = e.Size() + n += 1 + l + sovPipeline(uint64(l)) + } + } + return n +} + +func sovPipeline(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozPipeline(x uint64) (n int) { + return sovPipeline(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *AggregationOp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AggregationOp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AggregationOp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (aggregationpb.AggregationType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPipeline(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPipeline + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TransformationOp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TransformationOp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TransformationOp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (transformationpb.TransformationType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPipeline(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPipeline + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RollupOp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RollupOp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RollupOp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tags", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tags = append(m.Tags, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType == 0 { + var v aggregationpb.AggregationType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (aggregationpb.AggregationType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AggregationTypes = append(m.AggregationTypes, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v aggregationpb.AggregationType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (aggregationpb.AggregationType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AggregationTypes = append(m.AggregationTypes, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field AggregationTypes", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipPipeline(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPipeline + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PipelineOp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PipelineOp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PipelineOp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (PipelineOp_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Aggregation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Aggregation == nil { + m.Aggregation = &AggregationOp{} + } + if err := m.Aggregation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Transformation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Transformation == nil { + m.Transformation = &TransformationOp{} + } + if err := m.Transformation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rollup", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Rollup == nil { + m.Rollup = &RollupOp{} + } + if err := m.Rollup.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPipeline(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPipeline + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Pipeline) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Pipeline: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Pipeline: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ops", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ops = append(m.Ops, PipelineOp{}) + if err := m.Ops[len(m.Ops)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPipeline(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPipeline + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AppliedRollupOp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AppliedRollupOp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AppliedRollupOp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = append(m.Id[:0], dAtA[iNdEx:postIndex]...) + if m.Id == nil { + m.Id = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AggregationId", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AggregationId.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPipeline(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPipeline + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AppliedPipelineOp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AppliedPipelineOp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AppliedPipelineOp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (AppliedPipelineOp_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Transformation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Transformation == nil { + m.Transformation = &TransformationOp{} + } + if err := m.Transformation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rollup", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Rollup == nil { + m.Rollup = &AppliedRollupOp{} + } + if err := m.Rollup.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPipeline(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPipeline + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AppliedPipeline) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AppliedPipeline: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AppliedPipeline: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ops", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPipeline + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPipeline + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ops = append(m.Ops, AppliedPipelineOp{}) + if err := m.Ops[len(m.Ops)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPipeline(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPipeline + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipPipeline(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPipeline + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPipeline + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPipeline + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthPipeline + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPipeline + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipPipeline(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthPipeline = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowPipeline = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.proto", fileDescriptorPipeline) +} + +var fileDescriptorPipeline = []byte{ + // 587 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x4d, 0x6e, 0xd3, 0x40, + 0x1c, 0xc5, 0x3b, 0x76, 0x94, 0xa6, 0xff, 0xd0, 0x34, 0x1d, 0x21, 0xe4, 0x7e, 0x10, 0x22, 0x8b, + 0x45, 0x16, 0x60, 0x4b, 0x89, 0x40, 0x7c, 0xac, 0x52, 0x02, 0x69, 0x94, 0x60, 0x57, 0x43, 0x2a, + 0x24, 0x36, 0x95, 0x1d, 0x4f, 0x8d, 0xa5, 0xd8, 0x1e, 0xd9, 0x8e, 0xaa, 0x5e, 0x80, 0x35, 0x87, + 0xe1, 0x10, 0x5d, 0x72, 0x02, 0x84, 0xc2, 0x31, 0xd8, 0xa0, 0xd8, 0x4e, 0x32, 0x93, 0x04, 0x44, + 0xbb, 0x1b, 0x8f, 0xdf, 0x7b, 0xf3, 0x9f, 0xf7, 0xb3, 0x0c, 0xa7, 0xae, 0x97, 0x7c, 0x9e, 0xd8, + 0xda, 0x28, 0xf4, 0x75, 0xbf, 0xe5, 0xd8, 0xba, 0xdf, 0xd2, 0xe3, 0x68, 0xa4, 0xfb, 0x34, 0x89, + 0xbc, 0x51, 0xac, 0xbb, 0x34, 0xa0, 0x91, 0x95, 0x50, 0x47, 0x67, 0x51, 0x98, 0x84, 0x3a, 0xf3, + 0x18, 0x1d, 0x7b, 0x01, 0x65, 0xf6, 0x62, 0xa9, 0xa5, 0x6f, 0x30, 0x2c, 0x5f, 0x1d, 0x3e, 0xe5, + 0x52, 0xdd, 0xd0, 0x0d, 0x33, 0xb3, 0x3d, 0xb9, 0x4c, 0x9f, 0xb2, 0xa4, 0xd9, 0x2a, 0xb3, 0x1e, + 0x1a, 0xb7, 0x1c, 0xc2, 0x72, 0xdd, 0x88, 0xba, 0x56, 0xe2, 0x85, 0x01, 0xb3, 0xf9, 0xa7, 0x3c, + 0x6f, 0x78, 0xcb, 0xbc, 0x24, 0xb2, 0x82, 0xf8, 0x32, 0x8c, 0xfc, 0x79, 0xa4, 0xb8, 0x91, 0xa5, + 0xaa, 0x6f, 0x60, 0xb7, 0xbd, 0x3c, 0xca, 0x64, 0xb8, 0x09, 0x85, 0xe4, 0x9a, 0x51, 0x05, 0xd5, + 0x51, 0xa3, 0xd2, 0xac, 0x69, 0xc2, 0x58, 0x1a, 0xa7, 0x1d, 0x5e, 0x33, 0x4a, 0x52, 0xad, 0x3a, + 0x80, 0xea, 0x50, 0x08, 0x37, 0x19, 0x7e, 0x21, 0xe4, 0x3c, 0xd6, 0x56, 0xc7, 0xd1, 0x44, 0x07, + 0x97, 0xf6, 0x05, 0x41, 0x89, 0x84, 0xe3, 0xf1, 0x84, 0x99, 0x0c, 0x1f, 0x40, 0x29, 0xa0, 0x57, + 0x17, 0x81, 0xe5, 0x67, 0x51, 0x3b, 0x64, 0x3b, 0xa0, 0x57, 0x86, 0xe5, 0x53, 0x8c, 0xa1, 0x90, + 0x58, 0x6e, 0xac, 0x48, 0x75, 0xb9, 0xb1, 0x43, 0xd2, 0x35, 0xee, 0xc3, 0x3e, 0x37, 0xf0, 0xc5, + 0x2c, 0x2f, 0x56, 0xe4, 0xba, 0xfc, 0x1f, 0x57, 0xa9, 0x5a, 0xe2, 0x46, 0xac, 0x7e, 0x93, 0x00, + 0xce, 0x72, 0xfe, 0x26, 0xc3, 0xba, 0x70, 0xa3, 0x23, 0x6d, 0xf9, 0x69, 0x68, 0x4b, 0x95, 0xb6, + 0xbc, 0x08, 0x7e, 0x0d, 0x65, 0x2e, 0x53, 0x91, 0xea, 0xa8, 0x51, 0x6e, 0x1e, 0xf0, 0x3e, 0xa1, + 0x7a, 0xc2, 0xab, 0x71, 0x07, 0x2a, 0x62, 0x65, 0x8a, 0x9c, 0xfa, 0x8f, 0x79, 0xff, 0x6a, 0xeb, + 0x64, 0xc5, 0x83, 0x9f, 0x40, 0x31, 0x4a, 0xab, 0x54, 0x0a, 0xa9, 0xfb, 0x3e, 0xef, 0x9e, 0x97, + 0x4c, 0x72, 0x8d, 0xda, 0x81, 0xc2, 0x6c, 0x7c, 0x5c, 0x86, 0xed, 0x73, 0xa3, 0x6f, 0x98, 0x1f, + 0x8d, 0xea, 0x16, 0xde, 0x83, 0x72, 0xbb, 0xdb, 0x25, 0x6f, 0xbb, 0xed, 0x61, 0xcf, 0x34, 0xaa, + 0x08, 0x63, 0xa8, 0x0c, 0x49, 0xdb, 0xf8, 0xf0, 0xce, 0x24, 0xef, 0xb3, 0x3d, 0x09, 0x03, 0x14, + 0x89, 0x39, 0x18, 0x9c, 0x9f, 0x55, 0x65, 0xf5, 0x15, 0x94, 0xe6, 0x7d, 0x60, 0x0d, 0xe4, 0x90, + 0xc5, 0x0a, 0xaa, 0xcb, 0x8d, 0x72, 0xf3, 0xc1, 0xe6, 0xca, 0x4e, 0x0a, 0x37, 0x3f, 0x1e, 0x6d, + 0x91, 0x99, 0x50, 0x1d, 0xc3, 0x5e, 0x9b, 0xb1, 0xb1, 0x47, 0x9d, 0xc5, 0x17, 0x50, 0x01, 0xc9, + 0x73, 0xd2, 0xd2, 0xef, 0x11, 0xc9, 0x73, 0x70, 0x0f, 0x2a, 0x3c, 0x62, 0xcf, 0xc9, 0x8b, 0x3d, + 0xfe, 0x3b, 0xdf, 0x5e, 0x27, 0x3f, 0x63, 0x97, 0x93, 0xf4, 0x1c, 0xf5, 0x37, 0x82, 0xfd, 0xfc, + 0x38, 0x8e, 0xf3, 0x73, 0x81, 0xb3, 0x2a, 0xf0, 0x5a, 0x15, 0xf3, 0xb8, 0xd7, 0x89, 0x49, 0x77, + 0x20, 0xd6, 0x5a, 0x10, 0xcb, 0x78, 0x1f, 0x6d, 0x38, 0x7f, 0x0d, 0x5c, 0x6b, 0x13, 0xb8, 0x75, + 0x4e, 0x88, 0xe3, 0x24, 0xa9, 0xa7, 0x8b, 0xae, 0x17, 0xb8, 0x9e, 0xf1, 0xb8, 0x1e, 0xfe, 0xf3, + 0xe6, 0x1c, 0xb5, 0x93, 0xfe, 0xcd, 0xb4, 0x86, 0xbe, 0x4f, 0x6b, 0xe8, 0xe7, 0xb4, 0x86, 0xbe, + 0xfe, 0xaa, 0x6d, 0x7d, 0x7a, 0x79, 0xe7, 0x3f, 0xb0, 0x5d, 0x4c, 0x77, 0x5a, 0x7f, 0x02, 0x00, + 0x00, 0xff, 0xff, 0x26, 0x29, 0x00, 0xcc, 0xc5, 0x05, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.proto b/vendor/github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.proto new file mode 100644 index 00000000..dcdcc45f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/pipelinepb/pipeline.proto @@ -0,0 +1,86 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +syntax = "proto3"; + +option go_package = "github.com/m3db/m3/src/metrics/generated/proto/pipelinepb"; + +package pipelinepb; + +import "github.com/gogo/protobuf/gogoproto/gogo.proto"; +import "github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.proto"; +import "github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.proto"; + +message AggregationOp { + aggregationpb.AggregationType type = 1; +} + +message TransformationOp { + transformationpb.TransformationType type = 1; +} + +message RollupOp { + string new_name = 1; + repeated string tags = 2; + repeated aggregationpb.AggregationType aggregation_types = 3; +} + +message PipelineOp { + enum Type { + UNKNOWN = 0; + AGGREGATION = 1; + TRANSFORMATION = 2; + ROLLUP = 3; + } + Type type = 1; + AggregationOp aggregation = 2; + TransformationOp transformation = 3; + RollupOp rollup = 4; +} + +message Pipeline { + repeated PipelineOp ops = 1 [(gogoproto.nullable) = false]; +} + +// AppliedRollupOp is a rollup operation that has been +// applied against a metric. +message AppliedRollupOp { + bytes id = 1; + aggregationpb.AggregationID aggregation_id = 2 [(gogoproto.nullable) = false]; +} + +// AppliedPipelineOp is a pipeline operation that has +// been applied against a metric. +message AppliedPipelineOp { + enum Type { + UNKNOWN = 0; + TRANSFORMATION = 1; + ROLLUP = 2; + } + Type type = 1; + TransformationOp transformation = 2; + AppliedRollupOp rollup = 3; +} + +// AppliedPipelineOp is a pipeline containing operations +// that have been applied against a metric. +message AppliedPipeline { + repeated AppliedPipelineOp ops = 1 [(gogoproto.nullable) = false]; +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.pb.go b/vendor/github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.pb.go new file mode 100644 index 00000000..cca73f27 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.pb.go @@ -0,0 +1,937 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.proto + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* + Package policypb is a generated protocol buffer package. + + It is generated from these files: + github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.proto + + It has these top-level messages: + Resolution + Retention + StoragePolicy + Policy +*/ +package policypb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" +import aggregationpb "github.com/m3db/m3/src/metrics/generated/proto/aggregationpb" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type DropPolicy int32 + +const ( + DropPolicy_NONE DropPolicy = 0 + DropPolicy_DROP_MUST DropPolicy = 1 + DropPolicy_DROP_IF_ONLY_MATCH DropPolicy = 2 +) + +var DropPolicy_name = map[int32]string{ + 0: "NONE", + 1: "DROP_MUST", + 2: "DROP_IF_ONLY_MATCH", +} +var DropPolicy_value = map[string]int32{ + "NONE": 0, + "DROP_MUST": 1, + "DROP_IF_ONLY_MATCH": 2, +} + +func (x DropPolicy) String() string { + return proto.EnumName(DropPolicy_name, int32(x)) +} +func (DropPolicy) EnumDescriptor() ([]byte, []int) { return fileDescriptorPolicy, []int{0} } + +type Resolution struct { + WindowSize int64 `protobuf:"varint,1,opt,name=window_size,json=windowSize,proto3" json:"window_size,omitempty"` + Precision int64 `protobuf:"varint,2,opt,name=precision,proto3" json:"precision,omitempty"` +} + +func (m *Resolution) Reset() { *m = Resolution{} } +func (m *Resolution) String() string { return proto.CompactTextString(m) } +func (*Resolution) ProtoMessage() {} +func (*Resolution) Descriptor() ([]byte, []int) { return fileDescriptorPolicy, []int{0} } + +func (m *Resolution) GetWindowSize() int64 { + if m != nil { + return m.WindowSize + } + return 0 +} + +func (m *Resolution) GetPrecision() int64 { + if m != nil { + return m.Precision + } + return 0 +} + +type Retention struct { + Period int64 `protobuf:"varint,1,opt,name=period,proto3" json:"period,omitempty"` +} + +func (m *Retention) Reset() { *m = Retention{} } +func (m *Retention) String() string { return proto.CompactTextString(m) } +func (*Retention) ProtoMessage() {} +func (*Retention) Descriptor() ([]byte, []int) { return fileDescriptorPolicy, []int{1} } + +func (m *Retention) GetPeriod() int64 { + if m != nil { + return m.Period + } + return 0 +} + +type StoragePolicy struct { + Resolution *Resolution `protobuf:"bytes,1,opt,name=resolution" json:"resolution,omitempty"` + Retention *Retention `protobuf:"bytes,2,opt,name=retention" json:"retention,omitempty"` +} + +func (m *StoragePolicy) Reset() { *m = StoragePolicy{} } +func (m *StoragePolicy) String() string { return proto.CompactTextString(m) } +func (*StoragePolicy) ProtoMessage() {} +func (*StoragePolicy) Descriptor() ([]byte, []int) { return fileDescriptorPolicy, []int{2} } + +func (m *StoragePolicy) GetResolution() *Resolution { + if m != nil { + return m.Resolution + } + return nil +} + +func (m *StoragePolicy) GetRetention() *Retention { + if m != nil { + return m.Retention + } + return nil +} + +type Policy struct { + StoragePolicy *StoragePolicy `protobuf:"bytes,1,opt,name=storage_policy,json=storagePolicy" json:"storage_policy,omitempty"` + AggregationTypes []aggregationpb.AggregationType `protobuf:"varint,2,rep,packed,name=aggregation_types,json=aggregationTypes,enum=aggregationpb.AggregationType" json:"aggregation_types,omitempty"` +} + +func (m *Policy) Reset() { *m = Policy{} } +func (m *Policy) String() string { return proto.CompactTextString(m) } +func (*Policy) ProtoMessage() {} +func (*Policy) Descriptor() ([]byte, []int) { return fileDescriptorPolicy, []int{3} } + +func (m *Policy) GetStoragePolicy() *StoragePolicy { + if m != nil { + return m.StoragePolicy + } + return nil +} + +func (m *Policy) GetAggregationTypes() []aggregationpb.AggregationType { + if m != nil { + return m.AggregationTypes + } + return nil +} + +func init() { + proto.RegisterType((*Resolution)(nil), "policypb.Resolution") + proto.RegisterType((*Retention)(nil), "policypb.Retention") + proto.RegisterType((*StoragePolicy)(nil), "policypb.StoragePolicy") + proto.RegisterType((*Policy)(nil), "policypb.Policy") + proto.RegisterEnum("policypb.DropPolicy", DropPolicy_name, DropPolicy_value) +} +func (m *Resolution) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resolution) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.WindowSize != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPolicy(dAtA, i, uint64(m.WindowSize)) + } + if m.Precision != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintPolicy(dAtA, i, uint64(m.Precision)) + } + return i, nil +} + +func (m *Retention) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Retention) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Period != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPolicy(dAtA, i, uint64(m.Period)) + } + return i, nil +} + +func (m *StoragePolicy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StoragePolicy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Resolution != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintPolicy(dAtA, i, uint64(m.Resolution.Size())) + n1, err := m.Resolution.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if m.Retention != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintPolicy(dAtA, i, uint64(m.Retention.Size())) + n2, err := m.Retention.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + return i, nil +} + +func (m *Policy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Policy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.StoragePolicy != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintPolicy(dAtA, i, uint64(m.StoragePolicy.Size())) + n3, err := m.StoragePolicy.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + if len(m.AggregationTypes) > 0 { + dAtA5 := make([]byte, len(m.AggregationTypes)*10) + var j4 int + for _, num := range m.AggregationTypes { + for num >= 1<<7 { + dAtA5[j4] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j4++ + } + dAtA5[j4] = uint8(num) + j4++ + } + dAtA[i] = 0x12 + i++ + i = encodeVarintPolicy(dAtA, i, uint64(j4)) + i += copy(dAtA[i:], dAtA5[:j4]) + } + return i, nil +} + +func encodeVarintPolicy(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Resolution) Size() (n int) { + var l int + _ = l + if m.WindowSize != 0 { + n += 1 + sovPolicy(uint64(m.WindowSize)) + } + if m.Precision != 0 { + n += 1 + sovPolicy(uint64(m.Precision)) + } + return n +} + +func (m *Retention) Size() (n int) { + var l int + _ = l + if m.Period != 0 { + n += 1 + sovPolicy(uint64(m.Period)) + } + return n +} + +func (m *StoragePolicy) Size() (n int) { + var l int + _ = l + if m.Resolution != nil { + l = m.Resolution.Size() + n += 1 + l + sovPolicy(uint64(l)) + } + if m.Retention != nil { + l = m.Retention.Size() + n += 1 + l + sovPolicy(uint64(l)) + } + return n +} + +func (m *Policy) Size() (n int) { + var l int + _ = l + if m.StoragePolicy != nil { + l = m.StoragePolicy.Size() + n += 1 + l + sovPolicy(uint64(l)) + } + if len(m.AggregationTypes) > 0 { + l = 0 + for _, e := range m.AggregationTypes { + l += sovPolicy(uint64(e)) + } + n += 1 + sovPolicy(uint64(l)) + l + } + return n +} + +func sovPolicy(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozPolicy(x uint64) (n int) { + return sovPolicy(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Resolution) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Resolution: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Resolution: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field WindowSize", wireType) + } + m.WindowSize = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.WindowSize |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Precision", wireType) + } + m.Precision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Precision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPolicy(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPolicy + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Retention) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Retention: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Retention: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Period", wireType) + } + m.Period = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Period |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPolicy(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPolicy + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StoragePolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StoragePolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StoragePolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resolution", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPolicy + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Resolution == nil { + m.Resolution = &Resolution{} + } + if err := m.Resolution.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Retention", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPolicy + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Retention == nil { + m.Retention = &Retention{} + } + if err := m.Retention.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPolicy(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPolicy + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Policy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Policy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Policy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StoragePolicy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPolicy + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.StoragePolicy == nil { + m.StoragePolicy = &StoragePolicy{} + } + if err := m.StoragePolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType == 0 { + var v aggregationpb.AggregationType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (aggregationpb.AggregationType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AggregationTypes = append(m.AggregationTypes, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthPolicy + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v aggregationpb.AggregationType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPolicy + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (aggregationpb.AggregationType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AggregationTypes = append(m.AggregationTypes, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field AggregationTypes", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipPolicy(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPolicy + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipPolicy(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPolicy + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPolicy + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPolicy + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthPolicy + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPolicy + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipPolicy(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthPolicy = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowPolicy = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.proto", fileDescriptorPolicy) +} + +var fileDescriptorPolicy = []byte{ + // 390 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0xcd, 0xce, 0xd2, 0x40, + 0x14, 0xfd, 0xca, 0x67, 0xc8, 0xd7, 0x4b, 0x20, 0x75, 0x34, 0x48, 0x8c, 0xa9, 0xa4, 0x6e, 0x88, + 0x8b, 0x36, 0x82, 0x89, 0x2b, 0x4d, 0x50, 0x34, 0x12, 0xa4, 0x90, 0x01, 0x17, 0xba, 0x69, 0xfa, + 0x33, 0xa9, 0x93, 0xd0, 0xce, 0x64, 0x66, 0x08, 0xc2, 0x53, 0xb8, 0xf1, 0x9d, 0x5c, 0xfa, 0x08, + 0x06, 0x5f, 0xc4, 0x38, 0x2d, 0xb6, 0x5d, 0xfa, 0xed, 0xe6, 0x9c, 0x7b, 0xef, 0x39, 0xe7, 0xde, + 0x0c, 0xcc, 0x52, 0xaa, 0xbe, 0xec, 0x23, 0x37, 0x66, 0x99, 0x97, 0x4d, 0x92, 0xc8, 0xcb, 0x26, + 0x9e, 0x14, 0xb1, 0x97, 0x11, 0x25, 0x68, 0x2c, 0xbd, 0x94, 0xe4, 0x44, 0x84, 0x8a, 0x24, 0x1e, + 0x17, 0x4c, 0x31, 0x8f, 0xb3, 0x1d, 0x8d, 0x8f, 0x3c, 0x2a, 0x1f, 0xae, 0x66, 0xd1, 0xcd, 0x85, + 0x7e, 0xe8, 0xff, 0xa7, 0x5e, 0x98, 0xa6, 0x82, 0xa4, 0xa1, 0xa2, 0x2c, 0xe7, 0x51, 0x1d, 0x15, + 0xca, 0xce, 0x02, 0x00, 0x13, 0xc9, 0x76, 0xfb, 0xbf, 0x1c, 0x7a, 0x0c, 0x9d, 0x03, 0xcd, 0x13, + 0x76, 0x08, 0x24, 0x3d, 0x91, 0x81, 0x31, 0x34, 0x46, 0xd7, 0x18, 0x0a, 0x6a, 0x43, 0x4f, 0x04, + 0x3d, 0x02, 0x93, 0x0b, 0x12, 0x53, 0x49, 0x59, 0x3e, 0x68, 0xe9, 0x72, 0x45, 0x38, 0x4f, 0xc0, + 0xc4, 0x44, 0x91, 0x5c, 0x6b, 0xf5, 0xa1, 0xcd, 0x89, 0xa0, 0x2c, 0x29, 0x65, 0x4a, 0xe4, 0x7c, + 0x85, 0xee, 0x46, 0x31, 0x11, 0xa6, 0x64, 0xad, 0x97, 0x42, 0xcf, 0x01, 0xc4, 0xbf, 0x08, 0xba, + 0xb9, 0x33, 0xbe, 0xef, 0x5e, 0x36, 0x76, 0xab, 0x78, 0xb8, 0xd6, 0x87, 0x9e, 0x81, 0x29, 0x2e, + 0x5e, 0x3a, 0x49, 0x67, 0x7c, 0xaf, 0x3e, 0x54, 0x96, 0x70, 0xd5, 0xe5, 0x7c, 0x37, 0xa0, 0x5d, + 0x7a, 0xbe, 0x82, 0x9e, 0x2c, 0x42, 0x04, 0xc5, 0x4c, 0xe9, 0xfb, 0xa0, 0x92, 0x68, 0x84, 0xc4, + 0x5d, 0xd9, 0xc8, 0xbc, 0x80, 0xbb, 0xb5, 0x5b, 0x06, 0xea, 0xc8, 0x89, 0x1c, 0xb4, 0x86, 0xd7, + 0xa3, 0xde, 0xd8, 0x76, 0x1b, 0x37, 0x77, 0xa7, 0x15, 0xda, 0x1e, 0x39, 0xc1, 0x56, 0xd8, 0x24, + 0xe4, 0xd3, 0x97, 0x00, 0x33, 0xc1, 0x78, 0x29, 0x7d, 0x03, 0x77, 0xfc, 0x95, 0xff, 0xd6, 0xba, + 0x42, 0x5d, 0x30, 0x67, 0x78, 0xb5, 0x0e, 0x96, 0x1f, 0x37, 0x5b, 0xcb, 0x40, 0x7d, 0x40, 0x1a, + 0xce, 0xdf, 0x05, 0x2b, 0xff, 0xc3, 0xa7, 0x60, 0x39, 0xdd, 0xbe, 0x79, 0x6f, 0xb5, 0x5e, 0xcf, + 0x7f, 0x9c, 0x6d, 0xe3, 0xe7, 0xd9, 0x36, 0x7e, 0x9d, 0x6d, 0xe3, 0xdb, 0x6f, 0xfb, 0xea, 0xf3, + 0x8b, 0x5b, 0x7e, 0xba, 0xa8, 0xad, 0xf1, 0xe4, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x58, + 0xd9, 0xc4, 0xb6, 0x02, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.proto b/vendor/github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.proto new file mode 100644 index 00000000..a3e183a0 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/policypb/policy.proto @@ -0,0 +1,52 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +syntax = "proto3"; + +option go_package = "github.com/m3db/m3/src/metrics/generated/proto/policypb"; + +package policypb; + +import "github.com/m3db/m3/src/metrics/generated/proto/aggregationpb/aggregation.proto"; + +message Resolution { + int64 window_size = 1; + int64 precision = 2; +} + +message Retention { + int64 period = 1; +} + +message StoragePolicy { + Resolution resolution = 1; + Retention retention = 2; +} + +message Policy { + StoragePolicy storage_policy = 1; + repeated aggregationpb.AggregationType aggregation_types = 2; +} + +enum DropPolicy { + NONE = 0; + DROP_MUST = 1; + DROP_IF_ONLY_MATCH = 2; +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.pb.go b/vendor/github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.pb.go new file mode 100644 index 00000000..808d1068 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.pb.go @@ -0,0 +1,104 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.proto + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* +Package transformationpb is a generated protocol buffer package. + +It is generated from these files: + github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.proto + +It has these top-level messages: +*/ +package transformationpb + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type TransformationType int32 + +const ( + TransformationType_UNKNOWN TransformationType = 0 + TransformationType_ABSOLUTE TransformationType = 1 + TransformationType_PERSECOND TransformationType = 2 + TransformationType_INCREASE TransformationType = 3 + TransformationType_ADD TransformationType = 4 +) + +var TransformationType_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ABSOLUTE", + 2: "PERSECOND", + 3: "INCREASE", + 4: "ADD", +} +var TransformationType_value = map[string]int32{ + "UNKNOWN": 0, + "ABSOLUTE": 1, + "PERSECOND": 2, + "INCREASE": 3, + "ADD": 4, +} + +func (x TransformationType) String() string { + return proto.EnumName(TransformationType_name, int32(x)) +} +func (TransformationType) EnumDescriptor() ([]byte, []int) { + return fileDescriptorTransformation, []int{0} +} + +func init() { + proto.RegisterEnum("transformationpb.TransformationType", TransformationType_name, TransformationType_value) +} + +func init() { + proto.RegisterFile("github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.proto", fileDescriptorTransformation) +} + +var fileDescriptorTransformation = []byte{ + // 201 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x0a, 0x49, 0xcf, 0x2c, 0xc9, + 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0xcf, 0x35, 0x4e, 0x49, 0xd2, 0xcf, 0x35, 0xd6, 0x2f, + 0x2e, 0x4a, 0xd6, 0xcf, 0x4d, 0x2d, 0x29, 0xca, 0x4c, 0x2e, 0xd6, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, + 0x4a, 0x2c, 0x49, 0x4d, 0xd1, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x2f, 0x29, 0x4a, 0xcc, 0x2b, + 0x4e, 0xcb, 0x2f, 0xca, 0x4d, 0x2c, 0xc9, 0xcc, 0xcf, 0x2b, 0x48, 0x42, 0x13, 0xd0, 0x03, 0xab, + 0x12, 0x12, 0x40, 0x57, 0xa6, 0x15, 0xca, 0x25, 0x14, 0x82, 0x22, 0x16, 0x52, 0x59, 0x90, 0x2a, + 0xc4, 0xcd, 0xc5, 0x1e, 0xea, 0xe7, 0xed, 0xe7, 0x1f, 0xee, 0x27, 0xc0, 0x20, 0xc4, 0xc3, 0xc5, + 0xe1, 0xe8, 0x14, 0xec, 0xef, 0x13, 0x1a, 0xe2, 0x2a, 0xc0, 0x28, 0xc4, 0xcb, 0xc5, 0x19, 0xe0, + 0x1a, 0x14, 0xec, 0xea, 0xec, 0xef, 0xe7, 0x22, 0xc0, 0x04, 0x92, 0xf4, 0xf4, 0x73, 0x0e, 0x72, + 0x75, 0x0c, 0x76, 0x15, 0x60, 0x16, 0x62, 0xe7, 0x62, 0x76, 0x74, 0x71, 0x11, 0x60, 0x71, 0x0a, + 0x3c, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, + 0x63, 0x88, 0xb2, 0xa7, 0xd0, 0x43, 0x49, 0x6c, 0x60, 0x71, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xf3, 0x67, 0xfb, 0xf2, 0x1a, 0x01, 0x00, 0x00, +} diff --git a/vendor/github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.proto b/vendor/github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.proto new file mode 100644 index 00000000..640f043b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/generated/proto/transformationpb/transformation.proto @@ -0,0 +1,33 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +syntax = "proto3"; + +option go_package = "github.com/m3db/m3/src/metrics/generated/proto/transformationpb"; + +package transformationpb; + +enum TransformationType { + UNKNOWN = 0; + ABSOLUTE = 1; + PERSECOND = 2; + INCREASE = 3; + ADD = 4; +} diff --git a/vendor/github.com/m3db/m3/src/metrics/metric/id/id.go b/vendor/github.com/m3db/m3/src/metrics/metric/id/id.go new file mode 100644 index 00000000..017078f5 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/metric/id/id.go @@ -0,0 +1,59 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package id + +import "fmt" + +// ID is a metric id. +type ID interface { + // Bytes returns the raw bytes for this id. + Bytes() []byte + + // TagValue looks up the tag value for a tag name. + TagValue(tagName []byte) ([]byte, bool) +} + +// NameAndTagsFn returns the name and the tag pairs given an id. +type NameAndTagsFn func(id []byte) (name []byte, tags []byte, err error) + +// NewIDFn creates a new metric ID based on the metric name and metric tag pairs. +type NewIDFn func(name []byte, tags []TagPair) []byte + +// MatchIDFn determines whether an id is considered "matched" based on certain criteria. +type MatchIDFn func(name []byte, tags []byte) bool + +// RawID is the raw metric id. +type RawID []byte + +// String is the string representation of a raw id. +func (rid RawID) String() string { return string(rid) } + +// ChunkedID is a three-part id. +type ChunkedID struct { + Prefix []byte + Data []byte + Suffix []byte +} + +// String is the string representation of the chunked id. +func (cid ChunkedID) String() string { + return fmt.Sprintf("%s%s%s", cid.Prefix, cid.Data, cid.Suffix) +} diff --git a/vendor/github.com/m3db/m3/src/metrics/metric/id/id_mock.go b/vendor/github.com/m3db/m3/src/metrics/metric/id/id_mock.go new file mode 100644 index 00000000..a2407de4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/metric/id/id_mock.go @@ -0,0 +1,83 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/metrics/metric/id (interfaces: ID) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package id is a generated GoMock package. +package id + +import ( + "reflect" + + "github.com/golang/mock/gomock" +) + +// MockID is a mock of ID interface +type MockID struct { + ctrl *gomock.Controller + recorder *MockIDMockRecorder +} + +// MockIDMockRecorder is the mock recorder for MockID +type MockIDMockRecorder struct { + mock *MockID +} + +// NewMockID creates a new mock instance +func NewMockID(ctrl *gomock.Controller) *MockID { + mock := &MockID{ctrl: ctrl} + mock.recorder = &MockIDMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockID) EXPECT() *MockIDMockRecorder { + return m.recorder +} + +// Bytes mocks base method +func (m *MockID) Bytes() []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Bytes") + ret0, _ := ret[0].([]byte) + return ret0 +} + +// Bytes indicates an expected call of Bytes +func (mr *MockIDMockRecorder) Bytes() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Bytes", reflect.TypeOf((*MockID)(nil).Bytes)) +} + +// TagValue mocks base method +func (m *MockID) TagValue(arg0 []byte) ([]byte, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagValue", arg0) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// TagValue indicates an expected call of TagValue +func (mr *MockIDMockRecorder) TagValue(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagValue", reflect.TypeOf((*MockID)(nil).TagValue), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/metrics/metric/id/tag.go b/vendor/github.com/m3db/m3/src/metrics/metric/id/tag.go new file mode 100644 index 00000000..d5561f3f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/metric/id/tag.go @@ -0,0 +1,102 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package id + +import ( + "bytes" + + "github.com/m3db/m3/src/x/pool" +) + +// TagPair contains a tag name and a tag value. +type TagPair struct { + Name []byte + Value []byte +} + +// TagPairsByNameAsc sorts the tag pairs by tag names in ascending order. +type TagPairsByNameAsc []TagPair + +func (tp TagPairsByNameAsc) Len() int { return len(tp) } +func (tp TagPairsByNameAsc) Swap(i, j int) { tp[i], tp[j] = tp[j], tp[i] } + +func (tp TagPairsByNameAsc) Less(i, j int) bool { + return bytes.Compare(tp[i].Name, tp[j].Name) < 0 +} + +// SortedTagIteratorFn creates a new sorted tag iterator given id tag pairs. +type SortedTagIteratorFn func(tagPairs []byte) SortedTagIterator + +// SortedTagIterator iterates over a set of tag pairs sorted by tag names. +type SortedTagIterator interface { + // Reset resets the iterator. + Reset(sortedTagPairs []byte) + + // Next returns true if there are more tag names and values. + Next() bool + + // Current returns the current tag name and value. + Current() ([]byte, []byte) + + // Err returns any errors encountered. + Err() error + + // Close closes the iterator. + Close() +} + +// SortedTagIteratorAlloc allocates a new sorted tag iterator. +type SortedTagIteratorAlloc func() SortedTagIterator + +// SortedTagIteratorPool is a pool of sorted tag iterators. +type SortedTagIteratorPool interface { + // Init initializes the iterator pool. + Init(alloc SortedTagIteratorAlloc) + + // Get gets an iterator from the pool. + Get() SortedTagIterator + + // Put returns an iterator to the pool. + Put(value SortedTagIterator) +} + +type sortedTagIteratorPool struct { + pool pool.ObjectPool +} + +// NewSortedTagIteratorPool creates a new pool for sorted tag iterators. +func NewSortedTagIteratorPool(opts pool.ObjectPoolOptions) SortedTagIteratorPool { + return &sortedTagIteratorPool{pool: pool.NewObjectPool(opts)} +} + +func (p *sortedTagIteratorPool) Init(alloc SortedTagIteratorAlloc) { + p.pool.Init(func() interface{} { + return alloc() + }) +} + +func (p *sortedTagIteratorPool) Get() SortedTagIterator { + return p.pool.Get().(SortedTagIterator) +} + +func (p *sortedTagIteratorPool) Put(it SortedTagIterator) { + p.pool.Put(it) +} diff --git a/vendor/github.com/m3db/m3/src/metrics/metric/types.go b/vendor/github.com/m3db/m3/src/metrics/metric/types.go new file mode 100644 index 00000000..521629cb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/metric/types.go @@ -0,0 +1,146 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package metric + +import ( + "fmt" + "strings" + + "github.com/m3db/m3/src/metrics/generated/proto/metricpb" +) + +// Type is a metric type. +type Type int + +// A list of supported metric types. +const ( + UnknownType Type = iota + CounterType + TimerType + GaugeType +) + +// validTypes is a list of valid types. +var validTypes = []Type{ + CounterType, + TimerType, + GaugeType, +} + +var ( + M3CounterValue = []byte("counter") + M3GaugeValue = []byte("gauge") + M3TimerValue = []byte("timer") + + M3MetricsPrefix = []byte("__m3") + M3MetricsPrefixString = string(M3MetricsPrefix) + + M3TypeTag = []byte(M3MetricsPrefixString + "_type__") + M3MetricsGraphiteAggregation = []byte(M3MetricsPrefixString + "_graphite_aggregation__") + M3MetricsGraphitePrefix = []byte(M3MetricsPrefixString + "_graphite_prefix__") +) + +func (t Type) String() string { + switch t { + case UnknownType: + return "unknown" + case CounterType: + return "counter" + case TimerType: + return "timer" + case GaugeType: + return "gauge" + default: + return fmt.Sprintf("unknown type: %d", t) + } +} + +// ToProto converts the metric type to a protobuf message in place. +func (t Type) ToProto(pb *metricpb.MetricType) error { + switch t { + case UnknownType: + *pb = metricpb.MetricType_UNKNOWN + case CounterType: + *pb = metricpb.MetricType_COUNTER + case TimerType: + *pb = metricpb.MetricType_TIMER + case GaugeType: + *pb = metricpb.MetricType_GAUGE + default: + return fmt.Errorf("unknown metric type: %v", t) + } + return nil +} + +// FromProto converts the protobuf message to a metric type. +func (t *Type) FromProto(pb metricpb.MetricType) error { + switch pb { + case metricpb.MetricType_UNKNOWN: + *t = UnknownType + case metricpb.MetricType_COUNTER: + *t = CounterType + case metricpb.MetricType_TIMER: + *t = TimerType + case metricpb.MetricType_GAUGE: + *t = GaugeType + default: + return fmt.Errorf("unknown metric type in proto: %v", pb) + } + return nil +} + +// ParseType parses a type string and returns the type. +func ParseType(typeStr string) (Type, error) { + validTypeStrs := make([]string, 0, len(validTypes)) + for _, valid := range validTypes { + if typeStr == valid.String() { + return valid, nil + } + validTypeStrs = append(validTypeStrs, valid.String()) + } + return UnknownType, fmt.Errorf("invalid metric type '%s', valid types are: %s", + typeStr, strings.Join(validTypeStrs, ", ")) +} + +// MustParseType parses a type string and panics if the input in invalid. +func MustParseType(typeStr string) Type { + t, err := ParseType(typeStr) + if err != nil { + panic(err.Error()) + } + return t +} + +// UnmarshalYAML unmarshals YAML object into a metric type. +func (t *Type) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + + mt, err := ParseType(str) + if err != nil { + return err + } + + *t = mt + return nil +} diff --git a/vendor/github.com/m3db/m3/src/metrics/policy/drop_policy.go b/vendor/github.com/m3db/m3/src/metrics/policy/drop_policy.go new file mode 100644 index 00000000..05b87479 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/policy/drop_policy.go @@ -0,0 +1,78 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package policy + +// DropPolicy is a metrics dropping policy. +type DropPolicy uint + +// NB(r): The enum values are an exact match with protobuf values so they can +// be casted to each other. +const ( + // DropNone specifies not to drop any of the matched metrics. + DropNone DropPolicy = iota + // DropMust specifies to always drop matched metrics, irregardless of + // other rules. Metrics are not dropped from the rollup rules. + DropMust + // DropIfOnlyMatch specifies to drop matched metrics, but only if no + // other rules match. Metrics are not dropped from the rollup rules. + DropIfOnlyMatch + + // DefaultDropPolicy is to drop none. + DefaultDropPolicy = DropNone +) + +var validDropPolicies = []DropPolicy{ + DropNone, + DropMust, + DropIfOnlyMatch, +} + +// IsDefault returns whether the drop policy is the default drop none policy. +func (p DropPolicy) IsDefault() bool { + return p == DefaultDropPolicy +} + +func (p DropPolicy) String() string { + switch p { + case DropNone: + return "drop_none" + case DropMust: + return "drop_must" + case DropIfOnlyMatch: + return "drop_if_only_match" + } + return DropNone.String() +} + +// IsValid returns whether a drop policy value is a known valid value. +func (p DropPolicy) IsValid() bool { + for _, policy := range validDropPolicies { + if policy == p { + return true + } + } + return false +} + +// ValidDropPolicies returns a copy of all the valid drop policies. +func ValidDropPolicies() []DropPolicy { + return append([]DropPolicy(nil), validDropPolicies...) +} diff --git a/vendor/github.com/m3db/m3/src/metrics/policy/policy.go b/vendor/github.com/m3db/m3/src/metrics/policy/policy.go new file mode 100644 index 00000000..24b4f4d9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/policy/policy.go @@ -0,0 +1,218 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package policy + +import ( + "errors" + "strings" + + "github.com/m3db/m3/src/metrics/aggregation" + "github.com/m3db/m3/src/metrics/generated/proto/policypb" +) + +const ( + policyAggregationTypeSeparator = "|" +) + +var ( + // DefaultPolicy represents a default policy. + DefaultPolicy Policy + + errNilPolicyProto = errors.New("nil policy proto") + errInvalidPolicyString = errors.New("invalid policy string") + errInvalidDropPolicyString = errors.New("invalid drop policy string") +) + +// Policy contains a storage policy and a list of custom aggregation types. +type Policy struct { + StoragePolicy + AggregationID aggregation.ID +} + +// NewPolicy creates a policy. +func NewPolicy(sp StoragePolicy, aggID aggregation.ID) Policy { + return Policy{StoragePolicy: sp, AggregationID: aggID} +} + +// NewPolicyFromProto creates a new policy from a proto policy. +func NewPolicyFromProto(p *policypb.Policy) (Policy, error) { + if p == nil { + return DefaultPolicy, errNilPolicyProto + } + + policy, err := NewStoragePolicyFromProto(p.StoragePolicy) + if err != nil { + return DefaultPolicy, err + } + + aggID, err := aggregation.NewIDFromProto(p.AggregationTypes) + if err != nil { + return DefaultPolicy, err + } + + return NewPolicy(policy, aggID), nil + +} + +// Proto returns the proto of the policy. +func (p Policy) Proto() (*policypb.Policy, error) { + var storagePolicyProto policypb.StoragePolicy + err := p.StoragePolicy.ToProto(&storagePolicyProto) + if err != nil { + return nil, err + } + + aggTypes, err := aggregation.NewIDDecompressor().Decompress(p.AggregationID) + if err != nil { + return nil, err + } + + protoAggTypes, err := aggTypes.Proto() + if err != nil { + return nil, err + } + + return &policypb.Policy{ + StoragePolicy: &storagePolicyProto, + AggregationTypes: protoAggTypes, + }, nil +} + +// String is the string representation of a policy. +func (p Policy) String() string { + if p.AggregationID.IsDefault() { + return p.StoragePolicy.String() + } + return p.StoragePolicy.String() + policyAggregationTypeSeparator + p.AggregationID.String() +} + +// MarshalText returns the text encoding of a policy. +func (p Policy) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +// UnmarshalText unmarshals text-encoded data into a policy. +func (p *Policy) UnmarshalText(data []byte) error { + parsed, err := ParsePolicy(string(data)) + if err != nil { + return err + } + *p = parsed + return nil +} + +// ParsePolicy parses a policy in the form of resolution:retention|aggregationTypes. +func ParsePolicy(str string) (Policy, error) { + parts := strings.Split(str, policyAggregationTypeSeparator) + l := len(parts) + if l > 2 { + return DefaultPolicy, errInvalidPolicyString + } + + sp, err := ParseStoragePolicy(parts[0]) + if err != nil { + return DefaultPolicy, err + } + + var aggID = aggregation.DefaultID + if l == 2 { + aggTypes, err := aggregation.ParseTypes(parts[1]) + if err != nil { + return DefaultPolicy, err + } + + aggID, err = aggregation.NewIDCompressor().Compress(aggTypes) + if err != nil { + return DefaultPolicy, err + } + } + + return NewPolicy(sp, aggID), nil +} + +// NewPoliciesFromProto creates multiple new policies from given proto policies. +func NewPoliciesFromProto(policies []*policypb.Policy) ([]Policy, error) { + res := make([]Policy, 0, len(policies)) + for _, p := range policies { + policy, err := NewPolicyFromProto(p) + if err != nil { + return nil, err + } + res = append(res, policy) + } + return res, nil +} + +// IsDefaultPolicies checks if the policies are the default policies. +func IsDefaultPolicies(ps []Policy) bool { + return len(ps) == 0 +} + +// Policies is a list of policies. Used to check ploicy list equivalence. +type Policies []Policy + +// Equals takes a list of policies and checks equivalence. +func (p Policies) Equals(other Policies) bool { + if len(p) != len(other) { + return false + } + for i := 0; i < len(p); i++ { + if p[i] != other[i] { + return false + } + } + return true +} + +// UnmarshalText unmarshals a drop policy value from a string. +// Empty string defaults to DefaultDropPolicy. +func (p *DropPolicy) UnmarshalText(data []byte) error { + str := string(data) + // Allow default string value (not specified) to mean default + if str == "" { + *p = DefaultDropPolicy + return nil + } + + parsed, err := ParseDropPolicy(str) + if err != nil { + return err + } + + *p = parsed + return nil +} + +// MarshalText marshals a drop policy to a string. +func (p DropPolicy) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +// ParseDropPolicy parses a drop policy. +func ParseDropPolicy(str string) (DropPolicy, error) { + for _, valid := range validDropPolicies { + if valid.String() == str { + return valid, nil + } + } + + return DefaultDropPolicy, errInvalidDropPolicyString +} diff --git a/vendor/github.com/m3db/m3/src/metrics/policy/pool.go b/vendor/github.com/m3db/m3/src/metrics/policy/pool.go new file mode 100644 index 00000000..544cabd2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/policy/pool.go @@ -0,0 +1,59 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package policy + +import "github.com/m3db/m3/src/x/pool" + +// PoliciesPool provides a pool for variable-sized policy slices. +type PoliciesPool interface { + // Init initializes the pool. + Init() + + // Get provides a policy slice from the pool. + Get(capacity int) []Policy + + // Put returns a policy slice to the pool. + Put(value []Policy) +} + +type policiesPool struct { + pool pool.BucketizedObjectPool +} + +// NewPoliciesPool creates a new policies pool. +func NewPoliciesPool(sizes []pool.Bucket, opts pool.ObjectPoolOptions) PoliciesPool { + return &policiesPool{pool: pool.NewBucketizedObjectPool(sizes, opts)} +} + +func (p *policiesPool) Init() { + p.pool.Init(func(capacity int) interface{} { + return make([]Policy, 0, capacity) + }) +} + +func (p *policiesPool) Get(capacity int) []Policy { + return p.pool.Get(capacity).([]Policy) +} + +func (p *policiesPool) Put(value []Policy) { + value = value[:0] + p.pool.Put(value, cap(value)) +} diff --git a/vendor/github.com/m3db/m3/src/metrics/policy/resolution.go b/vendor/github.com/m3db/m3/src/metrics/policy/resolution.go new file mode 100644 index 00000000..c2cf1cb8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/policy/resolution.go @@ -0,0 +1,188 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package policy + +import ( + "errors" + "fmt" + "strings" + "time" + + "github.com/m3db/m3/src/metrics/generated/proto/policypb" + xtime "github.com/m3db/m3/src/x/time" +) + +const ( + windowPrecisionSeparator = "@" +) + +var ( + emptyResolution Resolution + errNilResolutionProto = errors.New("nil resolution proto message") +) + +// Resolution is the sampling resolution for datapoints. +type Resolution struct { + // Window is the bucket size represented by the resolution. + Window time.Duration + + // Precision is the precision of datapoints stored at this resoluion. + Precision xtime.Unit +} + +// ToProto converts the resolution to a protobuf message in place. +func (r Resolution) ToProto(pb *policypb.Resolution) error { + precision, err := r.Precision.Value() + if err != nil { + return err + } + pb.WindowSize = r.Window.Nanoseconds() + pb.Precision = precision.Nanoseconds() + return nil +} + +// FromProto converts the protobuf message to a resolution in place. +func (r *Resolution) FromProto(pb *policypb.Resolution) error { + if pb == nil { + return errNilResolutionProto + } + precision, err := xtime.UnitFromDuration(time.Duration(pb.Precision)) + if err != nil { + return err + } + r.Window = time.Duration(pb.WindowSize) + r.Precision = precision + return nil +} + +// String is the string representation of a resolution. +func (r Resolution) String() string { + _, maxUnit := xtime.MaxUnitForDuration(r.Window) + if maxUnit == r.Precision { + // If the precision is the default value, do not write it for better readability. + return xtime.ToExtendedString(r.Window) + } + return fmt.Sprintf("%s%s1%s", xtime.ToExtendedString(r.Window), windowPrecisionSeparator, r.Precision.String()) +} + +// ParseResolution parses a resolution. +func ParseResolution(str string) (Resolution, error) { + separatorIdx := strings.Index(str, windowPrecisionSeparator) + + // If there is no separator, the precision unit is the maximum time unit + // for which the window size is a multiple of. + if separatorIdx == -1 { + windowSize, err := xtime.ParseExtendedDuration(str) + if err != nil { + return emptyResolution, err + } + _, precision := xtime.MaxUnitForDuration(windowSize) + return Resolution{Window: windowSize, Precision: precision}, nil + } + + // Otherwise the window and the precision are determined by the input. + windowSize, err := xtime.ParseExtendedDuration(str[:separatorIdx]) + if err != nil { + return emptyResolution, err + } + precisionDuration, err := xtime.ParseExtendedDuration(str[separatorIdx+1:]) + if err != nil { + return emptyResolution, err + } + precision, err := xtime.UnitFromDuration(precisionDuration) + if err != nil { + return emptyResolution, err + } + return Resolution{Window: windowSize, Precision: precision}, nil +} + +// MustParseResolution parses a resolution in the form of window@precision, +// and panics if the input string is invalid. +func MustParseResolution(str string) Resolution { + resolution, err := ParseResolution(str) + if err != nil { + panic(fmt.Errorf("invalid resolution string %s: %v", str, err)) + } + return resolution +} + +// ResolutionValue is the resolution value. +type ResolutionValue int + +// List of known resolution values. +const ( + UnknownResolutionValue ResolutionValue = iota + OneSecond + TenSeconds + OneMinute + FiveMinutes + TenMinutes +) + +var ( + errUnknownResolution = errors.New("unknown resolution") + errUnknownResolutionValue = errors.New("unknown resolution value") + + // EmptyResolution is an empty resolution. + EmptyResolution Resolution +) + +// Resolution returns the resolution associated with a value. +func (v ResolutionValue) Resolution() (Resolution, error) { + resolution, exists := valuesToResolution[v] + if !exists { + return EmptyResolution, errUnknownResolutionValue + } + return resolution, nil +} + +// IsValid returns whether the resolution value is valid. +func (v ResolutionValue) IsValid() bool { + _, valid := valuesToResolution[v] + return valid +} + +// ValueFromResolution returns the value given a resolution. +func ValueFromResolution(resolution Resolution) (ResolutionValue, error) { + value, exists := resolutionToValues[resolution] + if exists { + return value, nil + } + return UnknownResolutionValue, errUnknownResolution +} + +var ( + valuesToResolution = map[ResolutionValue]Resolution{ + OneSecond: Resolution{Window: time.Second, Precision: xtime.Second}, + TenSeconds: Resolution{Window: 10 * time.Second, Precision: xtime.Second}, + OneMinute: Resolution{Window: time.Minute, Precision: xtime.Minute}, + FiveMinutes: Resolution{Window: 5 * time.Minute, Precision: xtime.Minute}, + TenMinutes: Resolution{Window: 10 * time.Minute, Precision: xtime.Minute}, + } + + resolutionToValues = make(map[Resolution]ResolutionValue) +) + +func init() { + for value, resolution := range valuesToResolution { + resolutionToValues[resolution] = value + } +} diff --git a/vendor/github.com/m3db/m3/src/metrics/policy/retention.go b/vendor/github.com/m3db/m3/src/metrics/policy/retention.go new file mode 100644 index 00000000..064b3abd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/policy/retention.go @@ -0,0 +1,150 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package policy + +import ( + "errors" + "fmt" + "time" + + "github.com/m3db/m3/src/metrics/generated/proto/policypb" + xtime "github.com/m3db/m3/src/x/time" +) + +var ( + errNilRetentionProto = errors.New("nil retention proto message") +) + +// Retention is the retention period for datapoints. +type Retention time.Duration + +// String is the string representation of a retention period. +func (r Retention) String() string { + return xtime.ToExtendedString(r.Duration()) +} + +// Duration returns the duration of the retention period. +func (r Retention) Duration() time.Duration { + return time.Duration(r) +} + +// ToProto converts the retention to a protobuf message in place. +func (r Retention) ToProto(pb *policypb.Retention) { + pb.Period = r.Duration().Nanoseconds() +} + +// FromProto converts the protobuf message to a retention in place. +func (r *Retention) FromProto(pb *policypb.Retention) error { + if pb == nil { + return errNilRetentionProto + } + *r = Retention(pb.Period) + return nil +} + +// ParseRetention parses a retention. +func ParseRetention(str string) (Retention, error) { + d, err := xtime.ParseExtendedDuration(str) + if err != nil { + return 0, err + } + return Retention(d), nil +} + +// MustParseRetention parses a retention, and panics if the input is invalid. +func MustParseRetention(str string) Retention { + retention, err := ParseRetention(str) + if err != nil { + panic(fmt.Errorf("invalid retention string %s: %v", str, err)) + } + return retention +} + +// RetentionValue is the retention value. +type RetentionValue int + +// List of known retention values. +const ( + UnknownRetentionValue RetentionValue = iota + OneHour + SixHours + TwelveHours + OneDay + TwoDays + SevenDays + FourteenDays + ThirtyDays + FourtyFiveDays +) + +var ( + errUnknownRetention = errors.New("unknown retention") + errUnknownRetentionValue = errors.New("unknown retention value") + + // EmptyRetention is an empty retention. + EmptyRetention Retention +) + +// Retention returns the retention associated with a value. +func (v RetentionValue) Retention() (Retention, error) { + retention, exists := valuesToRetention[v] + if !exists { + return EmptyRetention, errUnknownRetentionValue + } + return retention, nil +} + +// IsValid returns whether the retention value is valid. +func (v RetentionValue) IsValid() bool { + _, valid := valuesToRetention[v] + return valid +} + +// ValueFromRetention returns the value given a retention. +func ValueFromRetention(retention Retention) (RetentionValue, error) { + value, exists := retentionToValues[retention] + if exists { + return value, nil + } + return UnknownRetentionValue, errUnknownRetention +} + +var ( + valuesToRetention = map[RetentionValue]Retention{ + OneHour: Retention(time.Hour), + SixHours: Retention(6 * time.Hour), + TwelveHours: Retention(12 * time.Hour), + OneDay: Retention(24 * time.Hour), + TwoDays: Retention(2 * 24 * time.Hour), + SevenDays: Retention(7 * 24 * time.Hour), + FourteenDays: Retention(14 * 24 * time.Hour), + ThirtyDays: Retention(30 * 24 * time.Hour), + FourtyFiveDays: Retention(45 * 24 * time.Hour), + } + + retentionToValues = make(map[Retention]RetentionValue) +) + +func init() { + for value, retention := range valuesToRetention { + retentionToValues[retention] = value + } +} diff --git a/vendor/github.com/m3db/m3/src/metrics/policy/staged_policy.go b/vendor/github.com/m3db/m3/src/metrics/policy/staged_policy.go new file mode 100644 index 00000000..b5a5d572 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/policy/staged_policy.go @@ -0,0 +1,153 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package policy + +import ( + "encoding/json" + "fmt" +) + +var ( + // DefaultStagedPolicies represents a default staged policies. + DefaultStagedPolicies StagedPolicies + + // DefaultPoliciesList represents a default policies list. + DefaultPoliciesList = PoliciesList{DefaultStagedPolicies} +) + +// StagedPolicies represent a list of policies at a specified version. +type StagedPolicies struct { + // Cutover is when the policies take effect. + CutoverNanos int64 + + // Tombstoned determines whether the associated (rollup) metric has been tombstoned. + Tombstoned bool + + // policies represent the list of policies. + policies []Policy +} + +// NewStagedPolicies create a new staged policies. +func NewStagedPolicies(cutoverNanos int64, tombstoned bool, policies []Policy) StagedPolicies { + return StagedPolicies{CutoverNanos: cutoverNanos, Tombstoned: tombstoned, policies: policies} +} + +// Reset resets the staged policies. +func (p *StagedPolicies) Reset() { *p = DefaultStagedPolicies } + +// IsDefault returns whether this is a default staged policies. +func (p StagedPolicies) IsDefault() bool { + return p.CutoverNanos == 0 && !p.Tombstoned && p.hasDefaultPolicies() +} + +// Policies returns the policies and whether the policies are the default policies. +func (p StagedPolicies) Policies() ([]Policy, bool) { + return p.policies, p.hasDefaultPolicies() +} + +// Equals returns whether two staged policies are equal. +func (p StagedPolicies) Equals(other StagedPolicies) bool { + if p.CutoverNanos != other.CutoverNanos || p.Tombstoned != other.Tombstoned { + return false + } + currPolicies, currIsDefault := p.Policies() + otherPolicies, otherIsDefault := other.Policies() + if currIsDefault && otherIsDefault { + return true + } + if currIsDefault || otherIsDefault { + return false + } + if len(currPolicies) != len(otherPolicies) { + return false + } + for i := 0; i < len(currPolicies); i++ { + if currPolicies[i] != otherPolicies[i] { + return false + } + } + return true +} + +// String is the representation of staged policies. +func (p StagedPolicies) String() string { + b, err := json.Marshal(p) + if err != nil { + return fmt.Sprintf("[invalid staged policies: %v]", err) + } + return string(b) +} + +func (p StagedPolicies) hasDefaultPolicies() bool { + return IsDefaultPolicies(p.policies) +} + +// MarshalJSON returns the JSON encoding of staged policies. +func (p StagedPolicies) MarshalJSON() ([]byte, error) { + return json.Marshal(newStagedPoliciesJSON(p)) +} + +// UnmarshalJSON unmarshals JSON-encoded data into staged policies. +func (p *StagedPolicies) UnmarshalJSON(data []byte) error { + var spj stagedPoliciesJSON + err := json.Unmarshal(data, &spj) + if err != nil { + return err + } + *p = spj.StagedPolicies() + return nil +} + +// stagedPoliciesJSON is used for marshaling and unmarshaling staged policies. +type stagedPoliciesJSON struct { + CutoverNanos int64 `json:"cutoverNanos"` + Tombstoned bool `json:"tombstoned"` + Policies []Policy `json:"policies"` +} + +func newStagedPoliciesJSON(sp StagedPolicies) stagedPoliciesJSON { + return stagedPoliciesJSON{ + CutoverNanos: sp.CutoverNanos, + Tombstoned: sp.Tombstoned, + Policies: sp.policies, + } +} + +func (spj stagedPoliciesJSON) StagedPolicies() StagedPolicies { + return NewStagedPolicies(spj.CutoverNanos, spj.Tombstoned, spj.Policies) +} + +// PoliciesList is a list of staged policies. +type PoliciesList []StagedPolicies + +// IsDefault determines whether this is a default policies list. +func (l PoliciesList) IsDefault() bool { + return len(l) == 1 && l[0].IsDefault() +} + +// VersionedPoliciesList is a versioned policies list. +type VersionedPoliciesList struct { + // Version is the version associcated with the policies in the list. + Version int `json:"version"` + + // PoliciesList contains the list of staged policies. + PoliciesList PoliciesList `json:"policiesList"` +} diff --git a/vendor/github.com/m3db/m3/src/metrics/policy/storage_policy.go b/vendor/github.com/m3db/m3/src/metrics/policy/storage_policy.go new file mode 100644 index 00000000..1c4221a2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/metrics/policy/storage_policy.go @@ -0,0 +1,273 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package policy + +import ( + "errors" + "fmt" + "sort" + "strings" + "time" + + "github.com/m3db/m3/src/metrics/generated/proto/policypb" + xtime "github.com/m3db/m3/src/x/time" +) + +const ( + resolutionRetentionSeparator = ":" +) + +var ( + // EmptyStoragePolicy represents an empty storage policy. + EmptyStoragePolicy StoragePolicy + + errNilStoragePolicyProto = errors.New("nil storage policy proto") + errInvalidStoragePolicyString = errors.New("invalid storage policy string") +) + +// StoragePolicy represents the resolution and retention period metric datapoints +// are stored at. +type StoragePolicy struct { + resolution Resolution + retention Retention +} + +// NewStoragePolicy creates a new storage policy given a resolution and a retention. +func NewStoragePolicy(window time.Duration, precision xtime.Unit, retention time.Duration) StoragePolicy { + return StoragePolicy{ + resolution: Resolution{ + Window: window, + Precision: precision, + }, + retention: Retention(retention), + } +} + +// NewStoragePolicyFromProto creates a new storage policy from a storage policy protobuf message. +func NewStoragePolicyFromProto(pb *policypb.StoragePolicy) (StoragePolicy, error) { + if pb == nil { + return EmptyStoragePolicy, errNilStoragePolicyProto + } + var sp StoragePolicy + if err := sp.FromProto(*pb); err != nil { + return EmptyStoragePolicy, err + } + return sp, nil +} + +// Equivalent returns whether two storage policies are equal by their +// retention width and resolution. The resolution precision is ignored +// for equivalency (hence why the method is not named Equal). +func (p StoragePolicy) Equivalent(other StoragePolicy) bool { + return p.resolution.Window == other.resolution.Window && + p.retention == other.retention +} + +// String is the string representation of a storage policy. +func (p StoragePolicy) String() string { + return fmt.Sprintf("%s%s%s", p.resolution.String(), resolutionRetentionSeparator, p.retention.String()) +} + +// Resolution returns the resolution of the storage policy. +func (p StoragePolicy) Resolution() Resolution { + return p.resolution +} + +// Retention return the retention of the storage policy. +func (p StoragePolicy) Retention() Retention { + return p.retention +} + +// Proto returns the proto message for the storage policy. +func (p StoragePolicy) Proto() (*policypb.StoragePolicy, error) { + var pb policypb.StoragePolicy + if err := p.ToProto(&pb); err != nil { + return nil, err + } + return &pb, nil +} + +// ToProto converts the storage policy to a protobuf message in place. +func (p StoragePolicy) ToProto(pb *policypb.StoragePolicy) error { + if pb.Resolution == nil { + pb.Resolution = &policypb.Resolution{} + } + if err := p.resolution.ToProto(pb.Resolution); err != nil { + return err + } + if pb.Retention == nil { + pb.Retention = &policypb.Retention{} + } + p.retention.ToProto(pb.Retention) + return nil +} + +// FromProto converts the protobuf message to a storage policy in place. +func (p *StoragePolicy) FromProto(pb policypb.StoragePolicy) error { + if err := p.resolution.FromProto(pb.Resolution); err != nil { + return err + } + if err := p.retention.FromProto(pb.Retention); err != nil { + return err + } + return nil +} + +// MarshalText returns the text encoding of a storage policy. +func (p StoragePolicy) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +// UnmarshalText unmarshals text-encoded data into a storage policy. +func (p *StoragePolicy) UnmarshalText(data []byte) error { + str := string(data) + parsed, err := ParseStoragePolicy(str) + if err != nil { + return err + } + *p = parsed + return nil +} + +// ParseStoragePolicy parses a storage policy in the form of resolution:retention. +func ParseStoragePolicy(str string) (StoragePolicy, error) { + parts := strings.Split(str, resolutionRetentionSeparator) + if len(parts) != 2 { + return EmptyStoragePolicy, errInvalidStoragePolicyString + } + resolution, err := ParseResolution(parts[0]) + if err != nil { + return EmptyStoragePolicy, err + } + retention, err := ParseRetention(parts[1]) + if err != nil { + return EmptyStoragePolicy, err + } + return StoragePolicy{resolution: resolution, retention: retention}, nil +} + +// MustParseStoragePolicy parses a storage policy in the form of resolution:retention, +// and panics if the input string is invalid. +func MustParseStoragePolicy(str string) StoragePolicy { + sp, err := ParseStoragePolicy(str) + if err != nil { + panic(fmt.Errorf("invalid storage policy string %s: %v", str, err)) + } + return sp +} + +// StoragePolicies is a list of storage policies. +type StoragePolicies []StoragePolicy + +// NewStoragePoliciesFromProto creates a list of storage policies from given storage policies proto. +func NewStoragePoliciesFromProto( + storagePolicies []*policypb.StoragePolicy, +) (StoragePolicies, error) { + res := make(StoragePolicies, 0, len(storagePolicies)) + for _, sp := range storagePolicies { + storagePolicy, err := NewStoragePolicyFromProto(sp) + if err != nil { + return nil, err + } + res = append(res, storagePolicy) + } + return res, nil +} + +// Equal returns true if two lists of storage policies are considered equal. +func (sp StoragePolicies) Equal(other StoragePolicies) bool { + if len(sp) != len(other) { + return false + } + sp1 := sp.Clone() + sp2 := other.Clone() + sort.Sort(ByResolutionAscRetentionDesc(sp1)) + sort.Sort(ByResolutionAscRetentionDesc(sp2)) + for i := 0; i < len(sp1); i++ { + if sp1[i] != sp2[i] { + return false + } + } + return true +} + +// Proto returns the proto message for the given list of storage policies. +func (sp StoragePolicies) Proto() ([]*policypb.StoragePolicy, error) { + pbStoragePolicies := make([]*policypb.StoragePolicy, 0, len(sp)) + for _, storagePolicy := range sp { + pbStoragePolicy, err := storagePolicy.Proto() + if err != nil { + return nil, err + } + pbStoragePolicies = append(pbStoragePolicies, pbStoragePolicy) + } + return pbStoragePolicies, nil +} + +// Clone clones the list of storage policies. +func (sp StoragePolicies) Clone() StoragePolicies { + cloned := make(StoragePolicies, len(sp)) + copy(cloned, sp) + return cloned +} + +// IsDefault returns whether a list of storage policies are considered +// as default storage policies. +func (sp StoragePolicies) IsDefault() bool { return len(sp) == 0 } + +// ByResolutionAscRetentionDesc implements the sort.Sort interface that enables sorting +// storage policies by resolution in ascending order and then by retention in descending +// order. +type ByResolutionAscRetentionDesc StoragePolicies + +func (sp ByResolutionAscRetentionDesc) Len() int { return len(sp) } +func (sp ByResolutionAscRetentionDesc) Swap(i, j int) { sp[i], sp[j] = sp[j], sp[i] } + +func (sp ByResolutionAscRetentionDesc) Less(i, j int) bool { + rw1, rw2 := sp[i].Resolution().Window, sp[j].Resolution().Window + if rw1 != rw2 { + return rw1 < rw2 + } + rt1, rt2 := sp[i].Retention(), sp[j].Retention() + if rt1 != rt2 { + return rt1 > rt2 + } + return sp[i].Resolution().Precision < sp[j].Resolution().Precision +} + +// ByRetentionAscResolutionAsc implements the sort.Sort interface that enables sorting +// storage policies by retention in ascending order and then by resolution in ascending +// order. +type ByRetentionAscResolutionAsc StoragePolicies + +func (sp ByRetentionAscResolutionAsc) Len() int { return len(sp) } +func (sp ByRetentionAscResolutionAsc) Swap(i, j int) { sp[i], sp[j] = sp[j], sp[i] } +func (sp ByRetentionAscResolutionAsc) Less(i, j int) bool { + rt1, rt2 := sp[i].Retention(), sp[j].Retention() + if rt1 != rt2 { + return rt1 < rt2 + } + rw1, rw2 := sp[i].Resolution().Window, sp[j].Resolution().Window + if rw1 != rw2 { + return rw1 < rw2 + } + return sp[i].Resolution().Precision < sp[j].Resolution().Precision +} diff --git a/vendor/github.com/m3db/m3/src/query/block/accounted.go b/vendor/github.com/m3db/m3/src/query/block/accounted.go new file mode 100644 index 00000000..3dc2b457 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/accounted.go @@ -0,0 +1,49 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import "github.com/m3db/m3/src/query/cost" + +// AccountedBlock is a wrapper for a block which enforces limits on the number +// of datapoints used by the block. +type AccountedBlock struct { + Block + + enforcer cost.ChainedEnforcer +} + +// NewAccountedBlock wraps the given block and enforces datapoint limits. +func NewAccountedBlock( + wrapped Block, + enforcer cost.ChainedEnforcer, +) *AccountedBlock { + return &AccountedBlock{ + Block: wrapped, + enforcer: enforcer, + } +} + +// Close closes the block, and marks the number of datapoints used +// by this block as finished. +func (ab *AccountedBlock) Close() error { + ab.enforcer.Close() + return ab.Block.Close() +} diff --git a/vendor/github.com/m3db/m3/src/query/block/block_mock.go b/vendor/github.com/m3db/m3/src/query/block/block_mock.go new file mode 100644 index 00000000..33d6e109 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/block_mock.go @@ -0,0 +1,522 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/query/block (interfaces: Block,StepIter,Builder,Step,SeriesIter) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package block is a generated GoMock package. +package block + +import ( + "reflect" + "time" + + "github.com/golang/mock/gomock" +) + +// MockBlock is a mock of Block interface +type MockBlock struct { + ctrl *gomock.Controller + recorder *MockBlockMockRecorder +} + +// MockBlockMockRecorder is the mock recorder for MockBlock +type MockBlockMockRecorder struct { + mock *MockBlock +} + +// NewMockBlock creates a new mock instance +func NewMockBlock(ctrl *gomock.Controller) *MockBlock { + mock := &MockBlock{ctrl: ctrl} + mock.recorder = &MockBlockMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockBlock) EXPECT() *MockBlockMockRecorder { + return m.recorder +} + +// Close mocks base method +func (m *MockBlock) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close +func (mr *MockBlockMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockBlock)(nil).Close)) +} + +// Info mocks base method +func (m *MockBlock) Info() BlockInfo { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Info") + ret0, _ := ret[0].(BlockInfo) + return ret0 +} + +// Info indicates an expected call of Info +func (mr *MockBlockMockRecorder) Info() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockBlock)(nil).Info)) +} + +// Meta mocks base method +func (m *MockBlock) Meta() Metadata { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Meta") + ret0, _ := ret[0].(Metadata) + return ret0 +} + +// Meta indicates an expected call of Meta +func (mr *MockBlockMockRecorder) Meta() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Meta", reflect.TypeOf((*MockBlock)(nil).Meta)) +} + +// MultiSeriesIter mocks base method +func (m *MockBlock) MultiSeriesIter(arg0 int) ([]SeriesIterBatch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MultiSeriesIter", arg0) + ret0, _ := ret[0].([]SeriesIterBatch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MultiSeriesIter indicates an expected call of MultiSeriesIter +func (mr *MockBlockMockRecorder) MultiSeriesIter(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MultiSeriesIter", reflect.TypeOf((*MockBlock)(nil).MultiSeriesIter), arg0) +} + +// SeriesIter mocks base method +func (m *MockBlock) SeriesIter() (SeriesIter, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SeriesIter") + ret0, _ := ret[0].(SeriesIter) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SeriesIter indicates an expected call of SeriesIter +func (mr *MockBlockMockRecorder) SeriesIter() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SeriesIter", reflect.TypeOf((*MockBlock)(nil).SeriesIter)) +} + +// StepIter mocks base method +func (m *MockBlock) StepIter() (StepIter, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StepIter") + ret0, _ := ret[0].(StepIter) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StepIter indicates an expected call of StepIter +func (mr *MockBlockMockRecorder) StepIter() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StepIter", reflect.TypeOf((*MockBlock)(nil).StepIter)) +} + +// MockStepIter is a mock of StepIter interface +type MockStepIter struct { + ctrl *gomock.Controller + recorder *MockStepIterMockRecorder +} + +// MockStepIterMockRecorder is the mock recorder for MockStepIter +type MockStepIterMockRecorder struct { + mock *MockStepIter +} + +// NewMockStepIter creates a new mock instance +func NewMockStepIter(ctrl *gomock.Controller) *MockStepIter { + mock := &MockStepIter{ctrl: ctrl} + mock.recorder = &MockStepIterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockStepIter) EXPECT() *MockStepIterMockRecorder { + return m.recorder +} + +// Close mocks base method +func (m *MockStepIter) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockStepIterMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockStepIter)(nil).Close)) +} + +// Current mocks base method +func (m *MockStepIter) Current() Step { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(Step) + return ret0 +} + +// Current indicates an expected call of Current +func (mr *MockStepIterMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockStepIter)(nil).Current)) +} + +// Err mocks base method +func (m *MockStepIter) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockStepIterMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockStepIter)(nil).Err)) +} + +// Next mocks base method +func (m *MockStepIter) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockStepIterMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockStepIter)(nil).Next)) +} + +// SeriesMeta mocks base method +func (m *MockStepIter) SeriesMeta() []SeriesMeta { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SeriesMeta") + ret0, _ := ret[0].([]SeriesMeta) + return ret0 +} + +// SeriesMeta indicates an expected call of SeriesMeta +func (mr *MockStepIterMockRecorder) SeriesMeta() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SeriesMeta", reflect.TypeOf((*MockStepIter)(nil).SeriesMeta)) +} + +// StepCount mocks base method +func (m *MockStepIter) StepCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StepCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// StepCount indicates an expected call of StepCount +func (mr *MockStepIterMockRecorder) StepCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StepCount", reflect.TypeOf((*MockStepIter)(nil).StepCount)) +} + +// MockBuilder is a mock of Builder interface +type MockBuilder struct { + ctrl *gomock.Controller + recorder *MockBuilderMockRecorder +} + +// MockBuilderMockRecorder is the mock recorder for MockBuilder +type MockBuilderMockRecorder struct { + mock *MockBuilder +} + +// NewMockBuilder creates a new mock instance +func NewMockBuilder(ctrl *gomock.Controller) *MockBuilder { + mock := &MockBuilder{ctrl: ctrl} + mock.recorder = &MockBuilderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockBuilder) EXPECT() *MockBuilderMockRecorder { + return m.recorder +} + +// AddCols mocks base method +func (m *MockBuilder) AddCols(arg0 int) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddCols", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddCols indicates an expected call of AddCols +func (mr *MockBuilderMockRecorder) AddCols(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddCols", reflect.TypeOf((*MockBuilder)(nil).AddCols), arg0) +} + +// AppendValue mocks base method +func (m *MockBuilder) AppendValue(arg0 int, arg1 float64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AppendValue", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// AppendValue indicates an expected call of AppendValue +func (mr *MockBuilderMockRecorder) AppendValue(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendValue", reflect.TypeOf((*MockBuilder)(nil).AppendValue), arg0, arg1) +} + +// AppendValues mocks base method +func (m *MockBuilder) AppendValues(arg0 int, arg1 []float64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AppendValues", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// AppendValues indicates an expected call of AppendValues +func (mr *MockBuilderMockRecorder) AppendValues(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendValues", reflect.TypeOf((*MockBuilder)(nil).AppendValues), arg0, arg1) +} + +// Build mocks base method +func (m *MockBuilder) Build() Block { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Build") + ret0, _ := ret[0].(Block) + return ret0 +} + +// Build indicates an expected call of Build +func (mr *MockBuilderMockRecorder) Build() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Build", reflect.TypeOf((*MockBuilder)(nil).Build)) +} + +// BuildAsType mocks base method +func (m *MockBuilder) BuildAsType(arg0 BlockType) Block { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BuildAsType", arg0) + ret0, _ := ret[0].(Block) + return ret0 +} + +// BuildAsType indicates an expected call of BuildAsType +func (mr *MockBuilderMockRecorder) BuildAsType(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BuildAsType", reflect.TypeOf((*MockBuilder)(nil).BuildAsType), arg0) +} + +// PopulateColumns mocks base method +func (m *MockBuilder) PopulateColumns(arg0 int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "PopulateColumns", arg0) +} + +// PopulateColumns indicates an expected call of PopulateColumns +func (mr *MockBuilderMockRecorder) PopulateColumns(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PopulateColumns", reflect.TypeOf((*MockBuilder)(nil).PopulateColumns), arg0) +} + +// SetRow mocks base method +func (m *MockBuilder) SetRow(arg0 int, arg1 []float64, arg2 SeriesMeta) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetRow", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetRow indicates an expected call of SetRow +func (mr *MockBuilderMockRecorder) SetRow(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetRow", reflect.TypeOf((*MockBuilder)(nil).SetRow), arg0, arg1, arg2) +} + +// MockStep is a mock of Step interface +type MockStep struct { + ctrl *gomock.Controller + recorder *MockStepMockRecorder +} + +// MockStepMockRecorder is the mock recorder for MockStep +type MockStepMockRecorder struct { + mock *MockStep +} + +// NewMockStep creates a new mock instance +func NewMockStep(ctrl *gomock.Controller) *MockStep { + mock := &MockStep{ctrl: ctrl} + mock.recorder = &MockStepMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockStep) EXPECT() *MockStepMockRecorder { + return m.recorder +} + +// Time mocks base method +func (m *MockStep) Time() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Time") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// Time indicates an expected call of Time +func (mr *MockStepMockRecorder) Time() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Time", reflect.TypeOf((*MockStep)(nil).Time)) +} + +// Values mocks base method +func (m *MockStep) Values() []float64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Values") + ret0, _ := ret[0].([]float64) + return ret0 +} + +// Values indicates an expected call of Values +func (mr *MockStepMockRecorder) Values() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Values", reflect.TypeOf((*MockStep)(nil).Values)) +} + +// MockSeriesIter is a mock of SeriesIter interface +type MockSeriesIter struct { + ctrl *gomock.Controller + recorder *MockSeriesIterMockRecorder +} + +// MockSeriesIterMockRecorder is the mock recorder for MockSeriesIter +type MockSeriesIterMockRecorder struct { + mock *MockSeriesIter +} + +// NewMockSeriesIter creates a new mock instance +func NewMockSeriesIter(ctrl *gomock.Controller) *MockSeriesIter { + mock := &MockSeriesIter{ctrl: ctrl} + mock.recorder = &MockSeriesIterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockSeriesIter) EXPECT() *MockSeriesIterMockRecorder { + return m.recorder +} + +// Close mocks base method +func (m *MockSeriesIter) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockSeriesIterMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSeriesIter)(nil).Close)) +} + +// Current mocks base method +func (m *MockSeriesIter) Current() UnconsolidatedSeries { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(UnconsolidatedSeries) + return ret0 +} + +// Current indicates an expected call of Current +func (mr *MockSeriesIterMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockSeriesIter)(nil).Current)) +} + +// Err mocks base method +func (m *MockSeriesIter) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockSeriesIterMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockSeriesIter)(nil).Err)) +} + +// Next mocks base method +func (m *MockSeriesIter) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockSeriesIterMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockSeriesIter)(nil).Next)) +} + +// SeriesCount mocks base method +func (m *MockSeriesIter) SeriesCount() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SeriesCount") + ret0, _ := ret[0].(int) + return ret0 +} + +// SeriesCount indicates an expected call of SeriesCount +func (mr *MockSeriesIterMockRecorder) SeriesCount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SeriesCount", reflect.TypeOf((*MockSeriesIter)(nil).SeriesCount)) +} + +// SeriesMeta mocks base method +func (m *MockSeriesIter) SeriesMeta() []SeriesMeta { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SeriesMeta") + ret0, _ := ret[0].([]SeriesMeta) + return ret0 +} + +// SeriesMeta indicates an expected call of SeriesMeta +func (mr *MockSeriesIterMockRecorder) SeriesMeta() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SeriesMeta", reflect.TypeOf((*MockSeriesIter)(nil).SeriesMeta)) +} diff --git a/vendor/github.com/m3db/m3/src/query/block/column.go b/vendor/github.com/m3db/m3/src/query/block/column.go new file mode 100644 index 00000000..86f406a5 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/column.go @@ -0,0 +1,290 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "errors" + "fmt" + "time" + + "github.com/m3db/m3/src/query/cost" + "github.com/m3db/m3/src/query/models" + xcost "github.com/m3db/m3/src/x/cost" + + "github.com/uber-go/tally" +) + +type column struct { + Values []float64 +} + +// ColumnBlockBuilder builds a block optimized for column iteration. +type ColumnBlockBuilder struct { + block *columnBlock + enforcer cost.ChainedEnforcer + blockDatapoints tally.Counter +} + +type columnBlock struct { + blockType BlockType + columns []column + meta Metadata + seriesMeta []SeriesMeta +} + +func (c *columnBlock) Meta() Metadata { + return c.meta +} + +func (c *columnBlock) StepIter() (StepIter, error) { + if len(c.columns) != c.meta.Bounds.Steps() { + return nil, fmt. + Errorf("mismatch in block columns and meta bounds, columns: %d, bounds: %v", + len(c.columns), c.meta.Bounds) + } + + return &colBlockIter{ + columns: c.columns, + seriesMeta: c.seriesMeta, + meta: c.meta, + idx: -1, + }, nil +} + +// SeriesIter is invalid for a columnar block. +func (c *columnBlock) SeriesIter() (SeriesIter, error) { + return nil, errors.New("series iterator undefined for a scalar block") +} + +// MultiSeriesIter is invalid for a columnar block. +func (c *columnBlock) MultiSeriesIter(_ int) ([]SeriesIterBatch, error) { + return nil, errors.New("multi series iterator undefined for a scalar block") +} + +func (c *columnBlock) SeriesMeta() []SeriesMeta { + return c.seriesMeta +} + +func (c *columnBlock) StepCount() int { + return len(c.columns) +} + +func (c *columnBlock) Info() BlockInfo { + return NewBlockInfo(c.blockType) +} + +// Close frees up any resources +// TODO: actually free up the resources +func (c *columnBlock) Close() error { + return nil +} + +type colBlockIter struct { + idx int + timeForStep time.Time + err error + meta Metadata + seriesMeta []SeriesMeta + columns []column +} + +func (c *colBlockIter) SeriesMeta() []SeriesMeta { + return c.seriesMeta +} + +func (c *colBlockIter) StepCount() int { + return len(c.columns) +} + +func (c *colBlockIter) Next() bool { + if c.err != nil { + return false + } + + c.idx++ + next := c.idx < len(c.columns) + if !next { + return false + } + + c.timeForStep, c.err = c.meta.Bounds.TimeForIndex(c.idx) + if c.err != nil { + return false + } + + return next +} + +func (c *colBlockIter) Err() error { + return c.err +} + +func (c *colBlockIter) Current() Step { + col := c.columns[c.idx] + return ColStep{ + time: c.timeForStep, + values: col.Values, + } +} + +func (c *colBlockIter) Close() { /*no-op*/ } + +// ColStep is a single column containing data from multiple series at a given time step +type ColStep struct { + time time.Time + values []float64 +} + +// Time for the step +func (c ColStep) Time() time.Time { + return c.time +} + +// Values for the column +func (c ColStep) Values() []float64 { + return c.values +} + +// NewColStep creates a new column step +func NewColStep(t time.Time, values []float64) Step { + return ColStep{time: t, values: values} +} + +// NewColumnBlockBuilder creates a new column block builder +func NewColumnBlockBuilder( + queryCtx *models.QueryContext, + meta Metadata, + seriesMeta []SeriesMeta) Builder { + return ColumnBlockBuilder{ + enforcer: queryCtx.Enforcer.Child(cost.BlockLevel), + blockDatapoints: queryCtx.Scope.Tagged( + map[string]string{"type": "generated"}).Counter("datapoints"), + block: &columnBlock{ + meta: meta, + seriesMeta: seriesMeta, + blockType: BlockDecompressed, + }, + } +} + +// AppendValue adds a value to a column at index +func (cb ColumnBlockBuilder) AppendValue(idx int, value float64) error { + columns := cb.block.columns + if len(columns) <= idx { + return fmt.Errorf("idx out of range for append: %d", idx) + } + + r := cb.enforcer.Add(1) + if r.Error != nil { + return r.Error + } + + cb.blockDatapoints.Inc(1) + + columns[idx].Values = append(columns[idx].Values, value) + return nil +} + +// AppendValues adds a slice of values to a column at index +func (cb ColumnBlockBuilder) AppendValues(idx int, values []float64) error { + columns := cb.block.columns + if len(columns) <= idx { + return fmt.Errorf("idx out of range for append: %d", idx) + } + + r := cb.enforcer.Add(xcost.Cost(len(values))) + if r.Error != nil { + return r.Error + } + + cb.blockDatapoints.Inc(int64(len(values))) + columns[idx].Values = append(columns[idx].Values, values...) + return nil +} + +// AddCols adds the given number of columns to the block. +func (cb ColumnBlockBuilder) AddCols(num int) error { + if num < 1 { + return fmt.Errorf("must add more than 0 columns, adding: %d", num) + } + + newCols := make([]column, num) + cb.block.columns = append(cb.block.columns, newCols...) + return nil +} + +// PopulateColumns sets all columns to the given row size. +func (cb ColumnBlockBuilder) PopulateColumns(size int) { + cols := make([]float64, size*len(cb.block.columns)) + for i := range cb.block.columns { + cb.block.columns[i] = column{Values: cols[size*i : size*(i+1)]} + } + + // NB: initialize a clean series meta list with given cap and len, + // as row operations are done by arbitrary index. + cb.block.seriesMeta = make([]SeriesMeta, size) +} + +// SetRow sets a given block row to the given values and metadata. +func (cb ColumnBlockBuilder) SetRow( + idx int, + values []float64, + meta SeriesMeta, +) error { + cols := cb.block.columns + if len(values) == 0 { + // Sanity check. Should never happen. + return errors.New("cannot insert empty values") + } + + if len(values) != len(cols) { + return fmt.Errorf("inserting column size %d does not match column size: %d", + len(values), len(cols)) + } + + rows := len(cols[0].Values) + if idx < 0 || idx >= rows { + return fmt.Errorf("cannot insert into row %d, have %d rows", idx, rows) + } + + for i, v := range values { + cb.block.columns[i].Values[idx] = v + } + + r := cb.enforcer.Add(xcost.Cost(len(values))) + if r.Error != nil { + return r.Error + } + + cb.block.seriesMeta[idx] = meta + return nil +} + +// Build builds the block. +func (cb ColumnBlockBuilder) Build() Block { + return NewAccountedBlock(cb.block, cb.enforcer) +} + +// BuildAsType builds the block, forcing it to the given BlockType. +func (cb ColumnBlockBuilder) BuildAsType(blockType BlockType) Block { + cb.block.blockType = blockType + return NewAccountedBlock(cb.block, cb.enforcer) +} diff --git a/vendor/github.com/m3db/m3/src/query/block/container.go b/vendor/github.com/m3db/m3/src/query/block/container.go new file mode 100644 index 00000000..0efb861c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/container.go @@ -0,0 +1,388 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "errors" + "fmt" + "time" + + xerrors "github.com/m3db/m3/src/x/errors" +) + +var ( + errMismatchedStepIter = errors.New( + "container step iter has mismatched step size") + errMismatchedUcStepIter = errors.New( + "unconsolidated container step iter has mismatched step size") + errNoContainerBlocks = errors.New( + "no blocks provided to initialize container block") +) + +type containerBlock struct { + err error + meta Metadata + blocks []Block +} + +func newContainerBlock(blocks []Block) (AccumulatorBlock, error) { + if len(blocks) == 0 { + return nil, errNoContainerBlocks + } + + meta := blocks[0].Meta() + for _, b := range blocks[1:] { + m := b.Meta() + if !m.Equals(meta) { + return nil, fmt.Errorf("mismatched metadata in container block: "+ + "expected %s, got %s", meta.String(), m.String()) + } + + meta.ResultMetadata = meta.ResultMetadata.CombineMetadata(m.ResultMetadata) + } + + return &containerBlock{ + blocks: blocks, + meta: meta, + }, nil +} + +// NewContainerBlock creates a container block, which allows iterating across +// blocks incoming from multiple data sources, provided they have the same +// bounds. +func NewContainerBlock(blocks ...Block) (AccumulatorBlock, error) { + return newContainerBlock(blocks) +} + +func (b *containerBlock) Meta() Metadata { + return b.meta +} + +func (b *containerBlock) AddBlock(bl Block) error { + if b.err != nil { + return b.err + } + + m, blockMeta := b.Meta(), bl.Meta() + if !m.Equals(blockMeta) { + return fmt.Errorf("mismatched metadata adding block to container block: "+ + "expected %s, got %s", m.String(), blockMeta.String()) + } + + b.meta.ResultMetadata = b.meta.ResultMetadata. + CombineMetadata(blockMeta.ResultMetadata) + b.blocks = append(b.blocks, bl) + return nil +} + +func (b *containerBlock) Info() BlockInfo { + return NewBlockInfo(BlockContainer) +} + +func (b *containerBlock) Close() error { + multiErr := xerrors.NewMultiError() + multiErr = multiErr.Add(b.err) + for _, bl := range b.blocks { + multiErr = multiErr.Add(bl.Close()) + } + + if err := multiErr.FinalError(); err != nil { + b.err = err + return err + } + + return nil +} + +func (b *containerBlock) StepIter() (StepIter, error) { + if b.err != nil { + return nil, b.err + } + + it := &containerStepIter{its: make([]StepIter, 0, len(b.blocks))} + for _, bl := range b.blocks { + iter, err := bl.StepIter() + if err != nil { + b.err = err + return nil, err + } + + it.its = append(it.its, iter) + } + + return it, nil +} + +// NB: step iterators are constructed "sideways" +type containerStepIter struct { + err error + its []StepIter +} + +func (it *containerStepIter) Close() { + for _, iter := range it.its { + iter.Close() + } +} + +func (it *containerStepIter) Err() error { + if it.err != nil { + return it.err + } + + for _, iter := range it.its { + if it.err = iter.Err(); it.err != nil { + return it.err + } + } + + return nil +} + +func (it *containerStepIter) StepCount() int { + // NB: when using a step iterator, step count doesn't change, but the length + // of each step does. + if len(it.its) == 0 { + return 0 + } + + return it.its[0].StepCount() +} + +func (it *containerStepIter) SeriesMeta() []SeriesMeta { + length := 0 + for _, iter := range it.its { + length += len(iter.SeriesMeta()) + } + + metas := make([]SeriesMeta, 0, length) + for _, iter := range it.its { + metas = append(metas, iter.SeriesMeta()...) + } + + return metas +} + +func (it *containerStepIter) Next() bool { + if it.err != nil { + return false + } + + // advance all the contained iterators; if any have size mismatches, set an + // error and stop traversal. + var next bool + for i, iter := range it.its { + n := iter.Next() + + if it.err = iter.Err(); it.err != nil { + return false + } + + if i == 0 { + next = n + } else if next != n { + it.err = errMismatchedStepIter + return false + } + } + + return next +} + +func (it *containerStepIter) Current() Step { + if len(it.its) == 0 { + return ColStep{ + time: time.Time{}, + values: []float64{}, + } + } + + curr := it.its[0].Current() + // NB: to get Current for contained step iterators, append results from all + // contained step iterators in order. + accumulatorStep := ColStep{ + time: curr.Time(), + values: curr.Values(), + } + + for _, iter := range it.its[1:] { + curr := iter.Current() + accumulatorStep.values = append(accumulatorStep.values, curr.Values()...) + } + + return accumulatorStep +} + +func (b *containerBlock) SeriesIter() (SeriesIter, error) { + if b.err != nil { + return nil, b.err + } + + it := &containerSeriesIter{ + its: make([]SeriesIter, 0, len(b.blocks)), + } + + for _, bl := range b.blocks { + iter, err := bl.SeriesIter() + if err != nil { + b.err = err + return nil, err + } + + it.its = append(it.its, iter) + } + + return it, nil +} + +type containerSeriesIter struct { + err error + idx int + its []SeriesIter +} + +func (it *containerSeriesIter) Close() { + for _, iter := range it.its { + iter.Close() + } +} + +func (it *containerSeriesIter) Err() error { + if it.err != nil { + return it.err + } + + for _, iter := range it.its { + if it.err = iter.Err(); it.err != nil { + return it.err + } + } + + return nil +} + +func (it *containerSeriesIter) SeriesCount() int { + count := 0 + for _, iter := range it.its { + count += iter.SeriesCount() + } + + return count +} + +func (it *containerSeriesIter) SeriesMeta() []SeriesMeta { + length := 0 + for _, iter := range it.its { + length += len(iter.SeriesMeta()) + } + + metas := make([]SeriesMeta, 0, length) + for _, iter := range it.its { + metas = append(metas, iter.SeriesMeta()...) + } + + return metas +} + +func (it *containerSeriesIter) Next() bool { + if it.err != nil { + return false + } + + for ; it.idx < len(it.its); it.idx++ { + iter := it.its[it.idx] + if iter.Next() { + // the active iterator has been successfully incremented. + return true + } + + // active iterator errored. + if it.err = iter.Err(); it.err != nil { + return false + } + } + + // all iterators expanded. + return false +} + +func (it *containerSeriesIter) Current() UnconsolidatedSeries { + return it.its[it.idx].Current() +} + +func (b *containerBlock) MultiSeriesIter( + concurrency int, +) ([]SeriesIterBatch, error) { + if b.err != nil { + return nil, b.err + } + + if len(b.blocks) == 0 { + return nil, nil + } + + multiBatches := make([][]SeriesIterBatch, 0, len(b.blocks)) + for _, bl := range b.blocks { + batch, err := bl.MultiSeriesIter(concurrency) + if err != nil { + // NB: do not have to set the iterator error here, since not all + // contained blocks necessarily allow multi series iteration. + return nil, err + } + + multiBatches = append(multiBatches, batch) + } + + // NB: create a batch and merge into it rather than merging + // into an existing batch, in case sizes don't line up across blocks + // (e.g. if some contained blocks have fewer than `concurrency` series.) + batches := make([]SeriesIterBatch, 0, concurrency) + // init batch sizes. + for i := 0; i < concurrency; i++ { + // Determine container iter size. + size := 0 + for _, b := range multiBatches { + if i >= len(b) { + // NB: the current batch has been exhausted, but batches from other + // contained blocks may still have values. + continue + } + + size += b[i].Size + } + + iters := make([]SeriesIter, 0, size) + for _, b := range multiBatches { + if i >= len(b) { + continue + } + + iters = append(iters, b[i].Iter) + } + + batches = append(batches, SeriesIterBatch{ + Size: size, + Iter: &containerSeriesIter{its: iters}, + }) + } + + return batches, nil +} diff --git a/vendor/github.com/m3db/m3/src/query/block/empty.go b/vendor/github.com/m3db/m3/src/query/block/empty.go new file mode 100644 index 00000000..0f51f853 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/empty.go @@ -0,0 +1,82 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +type emptyBlock struct { + meta Metadata +} + +// NewEmptyBlock creates an empty block with the given metadata. +func NewEmptyBlock(meta Metadata) Block { + return &emptyBlock{meta: meta} +} + +func (b *emptyBlock) Close() error { return nil } + +func (b *emptyBlock) Info() BlockInfo { + return NewBlockInfo(BlockEmpty) +} + +func (b *emptyBlock) Meta() Metadata { + return b.meta +} + +func (b *emptyBlock) StepIter() (StepIter, error) { + return &emptyStepIter{steps: b.meta.Bounds.Steps()}, nil +} + +type emptyStepIter struct { + steps int +} + +func (it *emptyStepIter) Close() {} +func (it *emptyStepIter) Err() error { return nil } +func (it *emptyStepIter) StepCount() int { return it.steps } +func (it *emptyStepIter) SeriesMeta() []SeriesMeta { return []SeriesMeta{} } +func (it *emptyStepIter) Next() bool { return false } +func (it *emptyStepIter) Current() Step { return nil } + +func (b *emptyBlock) SeriesIter() (SeriesIter, error) { + return &emptySeriesIter{}, nil +} + +type emptySeriesIter struct{} + +func (it *emptySeriesIter) Close() {} +func (it *emptySeriesIter) Err() error { return nil } +func (it *emptySeriesIter) SeriesCount() int { return 0 } +func (it *emptySeriesIter) SeriesMeta() []SeriesMeta { return []SeriesMeta{} } +func (it *emptySeriesIter) Next() bool { return false } +func (it *emptySeriesIter) Current() UnconsolidatedSeries { return UnconsolidatedSeries{} } + +func (b *emptyBlock) MultiSeriesIter( + concurrency int, +) ([]SeriesIterBatch, error) { + batch := make([]SeriesIterBatch, concurrency) + for i := range batch { + batch[i] = SeriesIterBatch{ + Size: 1, + Iter: &emptySeriesIter{}, + } + } + + return batch, nil +} diff --git a/vendor/github.com/m3db/m3/src/query/block/info.go b/vendor/github.com/m3db/m3/src/query/block/info.go new file mode 100644 index 00000000..1970cf47 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/info.go @@ -0,0 +1,96 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +// String returns the block type as a string. +func (t BlockType) String() string { + switch t { + case BlockM3TSZCompressed: + return "compressed_m3tsz" + case BlockDecompressed: + return "decompressed" + case BlockScalar: + return "scalar" + case BlockLazy: + return "lazy" + case BlockTime: + return "time" + case BlockContainer: + return "container" + case BlockEmpty: + return "empty" + case BlockTest: + return "test" + } + + return "unknown" +} + +// BlockInfo describes information about the block. +type BlockInfo struct { + blockType BlockType + inner []BlockType +} + +// NewBlockInfo creates a BlockInfo of the specified type. +func NewBlockInfo(blockType BlockType) BlockInfo { + return BlockInfo{blockType: blockType} +} + +// NewWrappedBlockInfo creates a BlockInfo of the specified type, wrapping an +// existing BlockInfo. +func NewWrappedBlockInfo( + blockType BlockType, + wrap BlockInfo, +) BlockInfo { + inner := make([]BlockType, 0, len(wrap.inner)+1) + inner = append(inner, wrap.blockType) + inner = append(inner, wrap.inner...) + return BlockInfo{ + blockType: blockType, + inner: inner, + } +} + +// Type is the block type for this block. +func (b BlockInfo) Type() BlockType { + return b.blockType +} + +// InnerType is the block type for any block wrapped by this block, or this +// block itself if it doesn't wrap anything. +func (b BlockInfo) InnerType() BlockType { + if b.inner == nil { + return b.Type() + } + + return b.inner[0] +} + +// BaseType is the block type for the innermost block wrapped by this block, or +// the block itself if it doesn't wrap anything. +func (b BlockInfo) BaseType() BlockType { + if b.inner == nil { + return b.Type() + } + + return b.inner[len(b.inner)-1] +} diff --git a/vendor/github.com/m3db/m3/src/query/block/lazy.go b/vendor/github.com/m3db/m3/src/query/block/lazy.go new file mode 100644 index 00000000..dee91d68 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/lazy.go @@ -0,0 +1,151 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +type lazyBlock struct { + block Block + opts LazyOptions +} + +// NewLazyBlock creates a lazy block wrapping another block with lazy options. +func NewLazyBlock(block Block, opts LazyOptions) Block { + return &lazyBlock{ + block: block, + opts: opts, + } +} + +func (b *lazyBlock) Info() BlockInfo { + return NewWrappedBlockInfo(BlockLazy, b.block.Info()) +} + +func (b *lazyBlock) Close() error { return b.block.Close() } + +func (b *lazyBlock) Meta() Metadata { + mt := b.opts.MetaTransform() + return mt(b.block.Meta()) +} + +// StepIter returns a StepIterator +func (b *lazyBlock) StepIter() (StepIter, error) { + iter, err := b.block.StepIter() + if err != nil { + return nil, err + } + + return &lazyStepIter{ + it: iter, + opts: b.opts, + }, nil +} + +type lazyStepIter struct { + it StepIter + opts LazyOptions +} + +func (it *lazyStepIter) Close() { it.it.Close() } +func (it *lazyStepIter) Err() error { return it.it.Err() } +func (it *lazyStepIter) StepCount() int { return it.it.StepCount() } +func (it *lazyStepIter) Next() bool { return it.it.Next() } + +func (it *lazyStepIter) SeriesMeta() []SeriesMeta { + mt := it.opts.SeriesMetaTransform() + return mt(it.it.SeriesMeta()) +} + +func (it *lazyStepIter) Current() Step { + var ( + c = it.it.Current() + tt, vt = it.opts.TimeTransform(), it.opts.ValueTransform() + stepVals = c.Values() + ) + + vals := make([]float64, 0, len(stepVals)) + for _, val := range stepVals { + vals = append(vals, vt(val)) + } + + return ColStep{ + time: tt(c.Time()), + values: vals, + } +} + +func (b *lazyBlock) SeriesIter() (SeriesIter, error) { + seriesIter, err := b.block.SeriesIter() + if err != nil { + return nil, err + } + + return &lazySeriesIter{ + it: seriesIter, + opts: b.opts, + }, nil +} + +type lazySeriesIter struct { + it SeriesIter + opts LazyOptions +} + +func (it *lazySeriesIter) Close() { it.it.Close() } +func (it *lazySeriesIter) Err() error { return it.it.Err() } +func (it *lazySeriesIter) SeriesCount() int { return it.it.SeriesCount() } +func (it *lazySeriesIter) Next() bool { return it.it.Next() } + +func (it *lazySeriesIter) SeriesMeta() []SeriesMeta { + mt := it.opts.SeriesMetaTransform() + return mt(it.it.SeriesMeta()) +} + +func (it *lazySeriesIter) Current() UnconsolidatedSeries { + var ( + c = it.it.Current() + values = c.datapoints + tt, vt = it.opts.TimeTransform(), it.opts.ValueTransform() + ) + + for i, v := range values { + c.datapoints[i].Timestamp = tt(v.Timestamp) + c.datapoints[i].Value = vt(v.Value) + } + + return c +} + +func (b *lazyBlock) MultiSeriesIter( + concurrency int, +) ([]SeriesIterBatch, error) { + batches, err := b.block.MultiSeriesIter(concurrency) + if err != nil { + return nil, err + } + + for i, batch := range batches { + batches[i].Iter = &lazySeriesIter{ + it: batch.Iter, + opts: b.opts, + } + } + + return batches, err +} diff --git a/vendor/github.com/m3db/m3/src/query/block/meta.go b/vendor/github.com/m3db/m3/src/query/block/meta.go new file mode 100644 index 00000000..85bdc983 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/meta.go @@ -0,0 +1,253 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "fmt" + "sort" + "strings" + "time" + + "github.com/m3db/m3/src/query/models" +) + +// Metadata is metadata for a block, describing size and common tags across +// constituent series. +type Metadata struct { + // Bounds represents the time bounds for all series in the block. + Bounds models.Bounds + // Tags contains any tags common across all series in the block. + Tags models.Tags + // ResultMetadata contains metadata from any database access operations during + // fetching block details. + ResultMetadata ResultMetadata +} + +// Equals returns a boolean reporting whether the compared metadata has equal +// fields. +func (m Metadata) Equals(other Metadata) bool { + return m.Tags.Equals(other.Tags) && m.Bounds.Equals(other.Bounds) +} + +// String returns a string representation of metadata. +func (m Metadata) String() string { + return fmt.Sprintf("Bounds: %v, Tags: %v", m.Bounds, m.Tags) +} + +// Warnings is a slice of warnings. +type Warnings []Warning + +// ResultMetadata describes metadata common to each type of query results, +// indicating any additional information about the result. +type ResultMetadata struct { + // LocalOnly indicates that this query was executed only on the local store. + LocalOnly bool + // Exhaustive indicates whether the underlying data set presents a full + // collection of retrieved data. + Exhaustive bool + // Warnings is a list of warnings that indicate potetitally partial or + // incomplete results. + Warnings Warnings + // Resolutions is a list of resolutions for series obtained by this query. + Resolutions []time.Duration +} + +// NewResultMetadata creates a new result metadata. +func NewResultMetadata() ResultMetadata { + return ResultMetadata{ + LocalOnly: true, + Exhaustive: true, + } +} + +func combineResolutions(a, b []time.Duration) []time.Duration { + if len(a) == 0 { + if len(b) != 0 { + return b + } + } else { + if len(b) == 0 { + return a + } + + combined := make([]time.Duration, 0, len(a)+len(b)) + combined = append(combined, a...) + combined = append(combined, b...) + return combined + } + + return nil +} + +func combineWarnings(a, b Warnings) Warnings { + if len(a) == 0 { + if len(b) != 0 { + return b + } + } else { + if len(b) == 0 { + return a + } + + combinedWarnings := make(Warnings, 0, len(a)+len(b)) + combinedWarnings = append(combinedWarnings, a...) + return combinedWarnings.addWarnings(b...) + } + + return nil +} + +// Equals determines if two result metadatas are equal. +func (m ResultMetadata) Equals(n ResultMetadata) bool { + if m.Exhaustive && !n.Exhaustive || !m.Exhaustive && n.Exhaustive { + return false + } + + if m.LocalOnly && !n.LocalOnly || !m.LocalOnly && n.LocalOnly { + return false + } + + if len(m.Resolutions) != len(n.Resolutions) { + return false + } + + for i, mRes := range m.Resolutions { + if n.Resolutions[i] != mRes { + return false + } + } + + for i, mWarn := range m.Warnings { + if !n.Warnings[i].equals(mWarn) { + return false + } + } + + return true +} + +// CombineMetadata combines two result metadatas. +func (m ResultMetadata) CombineMetadata(other ResultMetadata) ResultMetadata { + meta := ResultMetadata{ + LocalOnly: m.LocalOnly && other.LocalOnly, + Exhaustive: m.Exhaustive && other.Exhaustive, + Warnings: combineWarnings(m.Warnings, other.Warnings), + Resolutions: combineResolutions(m.Resolutions, other.Resolutions), + } + + return meta +} + +// IsDefault returns true if this result metadata matches the unchanged default. +func (m ResultMetadata) IsDefault() bool { + return m.Exhaustive && m.LocalOnly && len(m.Warnings) == 0 +} + +// VerifyTemporalRange will verify that each resolution seen is below the +// given step size, adding warning headers if it is not. +func (m *ResultMetadata) VerifyTemporalRange(step time.Duration) { + // NB: this map is unlikely to have more than 2 elements in real execution, + // since these correspond to namespace count. + invalidResolutions := make(map[time.Duration]struct{}, 10) + for _, res := range m.Resolutions { + if res > step { + invalidResolutions[res] = struct{}{} + } + } + + if len(invalidResolutions) > 0 { + warnings := make([]string, 0, len(invalidResolutions)) + for k := range invalidResolutions { + warnings = append(warnings, fmt.Sprintf("%v", time.Duration(k))) + } + + sort.Strings(warnings) + warning := fmt.Sprintf("range: %v, resolutions: %s", + step, strings.Join(warnings, ", ")) + m.AddWarning("resolution larger than query range", warning) + } +} + +// AddWarning adds a warning to the result metadata. +// NB: warnings are expected to be small in general, so it's better to iterate +// over the array rather than introduce a map. +func (m *ResultMetadata) AddWarning(name string, message string) { + m.Warnings = m.Warnings.addWarnings(Warning{ + Name: name, + Message: message, + }) +} + +// NB: this is not a very efficient merge but this is extremely unlikely to be +// merging more than 5 or 6 total warnings. +func (w Warnings) addWarnings(warnings ...Warning) Warnings { + for _, newWarning := range warnings { + found := false + for _, warning := range w { + if warning.equals(newWarning) { + found = true + break + } + } + + if !found { + w = append(w, newWarning) + } + } + + return w +} + +// WarningStrings converts warnings to a slice of strings for presentation. +func (m ResultMetadata) WarningStrings() []string { + size := len(m.Warnings) + if !m.Exhaustive { + size++ + } + + strs := make([]string, 0, size) + for _, warn := range m.Warnings { + strs = append(strs, warn.Header()) + } + + if !m.Exhaustive { + strs = append(strs, "m3db exceeded query limit: results not exhaustive") + } + + return strs +} + +// Warning is a message that indicates potential partial or incomplete results. +type Warning struct { + // Name is the name of the store originating the warning. + Name string + // Message is the content of the warning message. + Message string +} + +// Header formats the warning into a format to send in a response header. +func (w Warning) Header() string { + return fmt.Sprintf("%s_%s", w.Name, w.Message) +} + +func (w Warning) equals(warning Warning) bool { + return w.Name == warning.Name && w.Message == warning.Message +} diff --git a/vendor/github.com/m3db/m3/src/query/block/options.go b/vendor/github.com/m3db/m3/src/query/block/options.go new file mode 100644 index 00000000..0f88614a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/options.go @@ -0,0 +1,89 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "time" +) + +var ( + defaultTimeTransform = func(t time.Time) time.Time { return t } + defaultValueTransform = func(v float64) float64 { return v } + defaultMetaTransform = func(m Metadata) Metadata { return m } + defaultSeriesMetaTransform = func(m []SeriesMeta) []SeriesMeta { return m } +) + +type lazyOpts struct { + timeTransform TimeTransform + valueTransform ValueTransform + metaTransform MetaTransform + seriesMetaTransform SeriesMetaTransform +} + +// NewLazyOptions creates LazyOpts with default values. +func NewLazyOptions() LazyOptions { + return &lazyOpts{ + timeTransform: defaultTimeTransform, + valueTransform: defaultValueTransform, + metaTransform: defaultMetaTransform, + seriesMetaTransform: defaultSeriesMetaTransform, + } +} + +func (o *lazyOpts) SetTimeTransform(t TimeTransform) LazyOptions { + opts := *o + opts.timeTransform = t + return &opts +} + +func (o *lazyOpts) TimeTransform() TimeTransform { + return o.timeTransform +} + +func (o *lazyOpts) SetValueTransform(t ValueTransform) LazyOptions { + opts := *o + opts.valueTransform = t + return &opts +} + +func (o *lazyOpts) ValueTransform() ValueTransform { + return o.valueTransform +} + +func (o *lazyOpts) SetMetaTransform(t MetaTransform) LazyOptions { + opts := *o + opts.metaTransform = t + return &opts +} + +func (o *lazyOpts) MetaTransform() MetaTransform { + return o.metaTransform +} + +func (o *lazyOpts) SetSeriesMetaTransform(t SeriesMetaTransform) LazyOptions { + opts := *o + opts.seriesMetaTransform = t + return &opts +} + +func (o *lazyOpts) SeriesMetaTransform() SeriesMetaTransform { + return o.seriesMetaTransform +} diff --git a/vendor/github.com/m3db/m3/src/query/block/scalar.go b/vendor/github.com/m3db/m3/src/query/block/scalar.go new file mode 100644 index 00000000..33b27568 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/scalar.go @@ -0,0 +1,149 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "errors" + "time" + + "github.com/m3db/m3/src/query/models" +) + +// Scalar is a block containing a single value over a certain bound +// This represents constant values; it greatly simplifies downstream operations +// by allowing them to treat this as a regular block, while at the same time +// having an option to optimize by accessing the scalar value directly instead. +type Scalar struct { + val float64 + meta Metadata +} + +// NewScalar creates a scalar block whose value is given by the function over +// the metadata bounds. +func NewScalar( + val float64, + meta Metadata, +) Block { + // NB: sanity check to ensure scalar values always have clean metadata. + meta.ResultMetadata = NewResultMetadata() + return &Scalar{ + val: val, + meta: meta, + } +} + +// Info returns information about the block. +func (b *Scalar) Info() BlockInfo { + return NewBlockInfo(BlockScalar) +} + +// Meta returns the metadata for the block. +func (b *Scalar) Meta() Metadata { + return b.meta +} + +// StepIter returns a step-wise block iterator, giving consolidated values +// across all series comprising the box at a single time step. +func (b *Scalar) StepIter() (StepIter, error) { + bounds := b.meta.Bounds + steps := bounds.Steps() + return &scalarStepIter{ + meta: b.meta, + vals: []float64{b.val}, + numVals: steps, + idx: -1, + }, nil +} + +// Close closes the block; this is a no-op for scalar block. +func (b *Scalar) Close() error { return nil } + +// Value yields the constant value this scalar is set to. +func (b *Scalar) Value() float64 { + return b.val +} + +type scalarStepIter struct { + numVals, idx int + stepTime time.Time + err error + meta Metadata + vals []float64 +} + +// build an empty SeriesMetadata. +func buildSeriesMeta(meta Metadata) SeriesMeta { + return SeriesMeta{ + Tags: models.NewTags(0, meta.Tags.Opts), + } +} + +func (it *scalarStepIter) Close() { /* No-op*/ } +func (it *scalarStepIter) Err() error { return it.err } +func (it *scalarStepIter) StepCount() int { return it.numVals } +func (it *scalarStepIter) SeriesMeta() []SeriesMeta { + return []SeriesMeta{buildSeriesMeta(it.meta)} +} + +func (it *scalarStepIter) Next() bool { + if it.err != nil { + return false + } + + it.idx++ + next := it.idx < it.numVals + if !next { + return false + } + + it.stepTime, it.err = it.meta.Bounds.TimeForIndex(it.idx) + if it.err != nil { + return false + } + + return next +} + +func (it *scalarStepIter) Current() Step { + t := it.stepTime + return &scalarStep{ + vals: it.vals, + time: t, + } +} + +type scalarStep struct { + vals []float64 + time time.Time +} + +func (it *scalarStep) Time() time.Time { return it.time } +func (it *scalarStep) Values() []float64 { return it.vals } + +// SeriesIter is invalid for a scalar block. +func (b *Scalar) SeriesIter() (SeriesIter, error) { + return nil, errors.New("series iterator undefined for a scalar block") +} + +// MultiSeriesIter is invalid for a scalar block. +func (b *Scalar) MultiSeriesIter(_ int) ([]SeriesIterBatch, error) { + return nil, errors.New("multi series iterator undefined for a scalar block") +} diff --git a/vendor/github.com/m3db/m3/src/query/block/series.go b/vendor/github.com/m3db/m3/src/query/block/series.go new file mode 100644 index 00000000..215eb850 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/series.go @@ -0,0 +1,94 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "time" + + "github.com/m3db/m3/src/query/ts" +) + +// Series is a single series within a block. +type Series struct { + values []float64 + Meta SeriesMeta +} + +// NewSeries creates a new series. +func NewSeries(values []float64, meta SeriesMeta) Series { + return Series{values: values, Meta: meta} +} + +// ValueAtStep returns the datapoint value at a step index. +func (s Series) ValueAtStep(idx int) float64 { + return s.values[idx] +} + +// Values returns the internal values slice. +func (s Series) Values() []float64 { + return s.values +} + +// Len returns the number of datapoints in the series. +func (s Series) Len() int { + return len(s.values) +} + +// UnconsolidatedSeries is the series with raw datapoints. +type UnconsolidatedSeries struct { + datapoints ts.Datapoints + Meta SeriesMeta + stats UnconsolidatedSeriesStats +} + +// UnconsolidatedSeriesStats is stats about an unconsolidated series. +type UnconsolidatedSeriesStats struct { + Enabled bool + DecodeDuration time.Duration +} + +// NewUnconsolidatedSeries creates a new series with raw datapoints. +func NewUnconsolidatedSeries( + datapoints ts.Datapoints, + meta SeriesMeta, + stats UnconsolidatedSeriesStats, +) UnconsolidatedSeries { + return UnconsolidatedSeries{ + datapoints: datapoints, + Meta: meta, + stats: stats, + } +} + +// Datapoints returns the internal datapoints slice. +func (s UnconsolidatedSeries) Datapoints() ts.Datapoints { + return s.datapoints +} + +// Len returns the number of datapoints slices in the series. +func (s UnconsolidatedSeries) Len() int { + return len(s.datapoints) +} + +// Stats returns statistics about the unconsolidated series if they were supplied. +func (s UnconsolidatedSeries) Stats() UnconsolidatedSeriesStats { + return s.stats +} diff --git a/vendor/github.com/m3db/m3/src/query/block/types.go b/vendor/github.com/m3db/m3/src/query/block/types.go new file mode 100644 index 00000000..6016c5b3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/block/types.go @@ -0,0 +1,193 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package block + +import ( + "io" + "time" + + "github.com/m3db/m3/src/query/models" +) + +// BlockType describes a block type. +type BlockType uint8 + +const ( + // BlockM3TSZCompressed is an M3TSZ compressed block. + BlockM3TSZCompressed BlockType = iota + // BlockDecompressed is a decompressed raw data block. + BlockDecompressed + // BlockScalar is a scalar block with a single value throughout its range. + BlockScalar + // BlockTime is a block with datapoint values given by a function of their + // timestamps. + BlockTime + // BlockLazy is a wrapper for an inner block that lazily applies transforms. + BlockLazy + // BlockContainer is a block that contains multiple inner blocks that share + // common metadata. + BlockContainer + // BlockEmpty is a block with metadata but no series or values. + BlockEmpty + // BlockTest is a block used for testing only. + BlockTest +) + +// Block represents a group of series across a time bound. +type Block interface { + io.Closer + // StepIter returns a step-wise block iterator, giving consolidated values + // across all series comprising the box at a single time step. + StepIter() (StepIter, error) + // SeriesIter returns a series-wise block iterator, giving unconsolidated + // by series. + SeriesIter() (SeriesIter, error) + // MultiSeriesIter returns batched series iterators for the block based on + // given concurrency. + MultiSeriesIter(concurrency int) ([]SeriesIterBatch, error) + // Meta returns the metadata for the block. + Meta() Metadata + // Info returns information about the block. + Info() BlockInfo +} + +// AccumulatorBlock accumulates incoming blocks and presents them as a single +// Block. +type AccumulatorBlock interface { + Block + // AddBlock adds a block to this accumulator. + AddBlock(bl Block) error +} + +// SeriesMeta is metadata data for the series. +type SeriesMeta struct { + Tags models.Tags + Name []byte +} + +// Iterator is the base iterator. +type Iterator interface { + // Next moves to the next item in the iterator. It will return false if there + // are no more items, or if encountering an error. + // + // NB: it is important to check that Err() is nil after Next returns false, to + // ensure that any errors during iteration are detected and accounted for. + Next() bool + // Err returns any error encountered during iteration. + Err() error + // Close frees up resources held by the iterator. + Close() +} + +// SeriesIterBatch is a batch of SeriesIterators. +type SeriesIterBatch struct { + // Iter is the series iterator. + Iter SeriesIter + // Size is the batch size. + Size int +} + +// SeriesIter iterates through a block horizontally. +type SeriesIter interface { + Iterator + // SeriesMeta returns the metadata for each series in the block. + SeriesMeta() []SeriesMeta + // SeriesCount returns the number of series. + SeriesCount() int + // Current returns the current series for the block. + Current() UnconsolidatedSeries +} + +// StepIter iterates through a block vertically. +type StepIter interface { + Iterator + // SeriesMeta returns the metadata for each series in the block. + SeriesMeta() []SeriesMeta + // StepCount returns the number of steps. + StepCount() int + // Current returns the current step for the block. + Current() Step +} + +// Step is a single time step within a block. +type Step interface { + Time() time.Time + Values() []float64 +} + +// Builder builds Blocks. +type Builder interface { + // AddCols adds the given number of columns to the block. + AddCols(num int) error + // SetRow sets a given block row to the given values and metadata. + SetRow(idx int, values []float64, meta SeriesMeta) error + // PopulateColumns sets all columns to the given size. + PopulateColumns(size int) + // AppendValue adds a single value to the column at the given index. + AppendValue(idx int, value float64) error + // AppendValues adds a slice of values to the column at the given index. + AppendValues(idx int, values []float64) error + // Build builds the block. + Build() Block + // BuildAsType builds the block, forcing it to the given BlockType. + BuildAsType(blockType BlockType) Block +} + +// Result is a fetch result containing multiple blocks optionally split across +// time boundaries. +type Result struct { + // Blocks is a list of blocks, optionally split across time boundaries. + Blocks []Block + // Metadata contains information on fetch status. + Metadata ResultMetadata +} + +// TimeTransform transforms a timestamp. +type TimeTransform func(time.Time) time.Time + +// MetaTransform transforms meta data. +type MetaTransform func(meta Metadata) Metadata + +// SeriesMetaTransform transforms series meta data. +type SeriesMetaTransform func(meta []SeriesMeta) []SeriesMeta + +// ValueTransform transform a float64. +type ValueTransform func(float64) float64 + +// LazyOptions describes options for lazy blocks. +type LazyOptions interface { + // SetTimeTransform sets the time transform function. + SetTimeTransform(TimeTransform) LazyOptions + // TimeTransform returns the time transform function. + TimeTransform() TimeTransform + // SetValueTransform sets the value transform function. + SetValueTransform(ValueTransform) LazyOptions + // ValueTransform returns the value transform function. + ValueTransform() ValueTransform + // SetMetaTransform sets the meta transform function. + SetMetaTransform(MetaTransform) LazyOptions + // MetaTransform returns the meta transform function. + MetaTransform() MetaTransform + // SetSeriesMetaTransform sets the series meta transform function. + SetSeriesMetaTransform(SeriesMetaTransform) LazyOptions + // SeriesMetaTransform returns the series meta transform function. + SeriesMetaTransform() SeriesMetaTransform +} diff --git a/vendor/github.com/m3db/m3/src/query/cost/cost.go b/vendor/github.com/m3db/m3/src/query/cost/cost.go new file mode 100644 index 00000000..30e7fdaf --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/cost/cost.go @@ -0,0 +1,208 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package cost + +import ( + "errors" + "fmt" + + "github.com/m3db/m3/src/x/cost" +) + +const ( + // BlockLevel identifies per-block enforcers. + BlockLevel = "block" + // QueryLevel identifies per-query enforcers. + QueryLevel = "query" + // GlobalLevel identifies global enforcers. + GlobalLevel = "global" +) + +// ChainedEnforcer is a cost.Enforcer implementation which tracks resource usage implements cost.Enforcer to enforce +// limits on multiple resources at once, linked together in a tree. +type ChainedEnforcer interface { + cost.Enforcer + + // Child creates a new ChainedEnforcer which rolls up to this one. + Child(resourceName string) ChainedEnforcer + + // Close indicates that all resources have been returned for this + // ChainedEnforcer. It should inform all parent enforcers that the + // resources have been freed. + Close() +} + +type noopChainedReporter struct{} + +func (noopChainedReporter) ReportCost(_ cost.Cost) {} +func (noopChainedReporter) ReportCurrent(_ cost.Cost) {} +func (noopChainedReporter) ReportOverLimit(_ bool) {} +func (noopChainedReporter) OnChildClose(_ cost.Cost) {} +func (noopChainedReporter) OnClose(_ cost.Cost) {} + +var noopChainedReporterInstance = noopChainedReporter{} + +// ChainedReporter is a listener for chainedEnforcer methods, which listens to Close events in addition to +// events used by cost.EnforcerReporter. +type ChainedReporter interface { + cost.EnforcerReporter + + // OnChildClose is called whenever a child of this reporter's chainedEnforcer is released. + OnChildClose(currentCost cost.Cost) + + // OnClose is called whenever this reporter's chainedEnforcer is released. + OnClose(currentCost cost.Cost) +} + +// chainedEnforcer is the actual implementation of ChainedEnforcer. +type chainedEnforcer struct { + resourceName string + local cost.Enforcer + parent *chainedEnforcer + models []cost.Enforcer + reporter ChainedReporter +} + +var noopChainedEnforcer = mustNoopChainedEnforcer() + +func mustNoopChainedEnforcer() ChainedEnforcer { + rtn, err := NewChainedEnforcer("", []cost.Enforcer{cost.NoopEnforcer()}) + if err != nil { + panic(err.Error()) + } + + return rtn +} + +// NoopChainedEnforcer returns a chainedEnforcer which enforces no limits and does no reporting. +func NoopChainedEnforcer() ChainedEnforcer { + return noopChainedEnforcer +} + +// NewChainedEnforcer constructs a chainedEnforcer which creates children using the provided models. +// models[0] enforces this instance; models[1] enforces the first level of children, and so on. +func NewChainedEnforcer(rootResourceName string, models []cost.Enforcer) (ChainedEnforcer, error) { + if len(models) == 0 { + return nil, errors.New("must provide at least one Enforcer instance for a chainedEnforcer") + } + + local := models[0] + + return &chainedEnforcer{ + resourceName: rootResourceName, + parent: nil, // root has nil parent + local: local, + models: models[1:], + reporter: upcastReporterOrNoop(local.Reporter()), + }, nil +} + +func upcastReporterOrNoop(r cost.EnforcerReporter) ChainedReporter { + if r, ok := r.(ChainedReporter); ok { + return r + } + + return noopChainedReporterInstance +} + +// Add adds the given cost both to this enforcer and any parents, working recursively until the root is reached. +// The most local error is preferred. +func (ce *chainedEnforcer) Add(c cost.Cost) cost.Report { + if ce.parent == nil { + return ce.wrapLocalResult(ce.local.Add(c)) + } + + localR := ce.local.Add(c) + globalR := ce.parent.Add(c) + + // check our local limit first + if localR.Error != nil { + return ce.wrapLocalResult(localR) + } + + // check the global limit + if globalR.Error != nil { + return globalR + } + + return localR +} + +func (ce *chainedEnforcer) wrapLocalResult(localR cost.Report) cost.Report { + if localR.Error != nil { + return cost.Report{ + Cost: localR.Cost, + Error: fmt.Errorf("exceeded %s limit: %s", ce.resourceName, localR.Error.Error()), + } + } + return localR +} + +// Child creates a new chainedEnforcer whose resource consumption rolls up into this instance. +func (ce *chainedEnforcer) Child(resourceName string) ChainedEnforcer { + // no more models; just return a noop default. TODO: this could be a panic case? Technically speaking it's + // misconfiguration. + if len(ce.models) == 0 { + return NoopChainedEnforcer() + } + + newLocal := ce.models[0] + return &chainedEnforcer{ + resourceName: resourceName, + parent: ce, + // make sure to clone the local enforcer, so that we're using an + // independent instance with the same configuration. + local: newLocal.Clone(), + models: ce.models[1:], + reporter: upcastReporterOrNoop(newLocal.Reporter()), + } +} + +// Clone on a chainedEnforcer is a noop--TODO: implement? +func (ce *chainedEnforcer) Clone() cost.Enforcer { + return ce +} + +// State returns the local state of this enforcer (ignoring anything further up the chain). +func (ce *chainedEnforcer) State() (cost.Report, cost.Limit) { + return ce.local.State() +} + +// Close releases all resources tracked by this enforcer back to the global enforcer +func (ce *chainedEnforcer) Close() { + r, _ := ce.local.State() + ce.reporter.OnClose(r.Cost) + + if ce.parent != nil { + parentR, _ := ce.parent.State() + ce.parent.reporter.OnChildClose(parentR.Cost) + } + + ce.Add(-r.Cost) +} + +func (ce *chainedEnforcer) Limit() cost.Limit { + return ce.local.Limit() +} + +func (ce *chainedEnforcer) Reporter() cost.EnforcerReporter { + return ce.local.Reporter() +} diff --git a/vendor/github.com/m3db/m3/src/query/cost/cost_mock.go b/vendor/github.com/m3db/m3/src/query/cost/cost_mock.go new file mode 100644 index 00000000..85abd137 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/cost/cost_mock.go @@ -0,0 +1,236 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/query/cost (interfaces: ChainedEnforcer,ChainedReporter) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package cost is a generated GoMock package. +package cost + +import ( + "reflect" + + cost0 "github.com/m3db/m3/src/x/cost" + + "github.com/golang/mock/gomock" +) + +// MockChainedEnforcer is a mock of ChainedEnforcer interface +type MockChainedEnforcer struct { + ctrl *gomock.Controller + recorder *MockChainedEnforcerMockRecorder +} + +// MockChainedEnforcerMockRecorder is the mock recorder for MockChainedEnforcer +type MockChainedEnforcerMockRecorder struct { + mock *MockChainedEnforcer +} + +// NewMockChainedEnforcer creates a new mock instance +func NewMockChainedEnforcer(ctrl *gomock.Controller) *MockChainedEnforcer { + mock := &MockChainedEnforcer{ctrl: ctrl} + mock.recorder = &MockChainedEnforcerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockChainedEnforcer) EXPECT() *MockChainedEnforcerMockRecorder { + return m.recorder +} + +// Add mocks base method +func (m *MockChainedEnforcer) Add(arg0 cost0.Cost) cost0.Report { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Add", arg0) + ret0, _ := ret[0].(cost0.Report) + return ret0 +} + +// Add indicates an expected call of Add +func (mr *MockChainedEnforcerMockRecorder) Add(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockChainedEnforcer)(nil).Add), arg0) +} + +// Child mocks base method +func (m *MockChainedEnforcer) Child(arg0 string) ChainedEnforcer { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Child", arg0) + ret0, _ := ret[0].(ChainedEnforcer) + return ret0 +} + +// Child indicates an expected call of Child +func (mr *MockChainedEnforcerMockRecorder) Child(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Child", reflect.TypeOf((*MockChainedEnforcer)(nil).Child), arg0) +} + +// Clone mocks base method +func (m *MockChainedEnforcer) Clone() cost0.Enforcer { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Clone") + ret0, _ := ret[0].(cost0.Enforcer) + return ret0 +} + +// Clone indicates an expected call of Clone +func (mr *MockChainedEnforcerMockRecorder) Clone() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clone", reflect.TypeOf((*MockChainedEnforcer)(nil).Clone)) +} + +// Close mocks base method +func (m *MockChainedEnforcer) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockChainedEnforcerMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockChainedEnforcer)(nil).Close)) +} + +// Limit mocks base method +func (m *MockChainedEnforcer) Limit() cost0.Limit { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Limit") + ret0, _ := ret[0].(cost0.Limit) + return ret0 +} + +// Limit indicates an expected call of Limit +func (mr *MockChainedEnforcerMockRecorder) Limit() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Limit", reflect.TypeOf((*MockChainedEnforcer)(nil).Limit)) +} + +// Reporter mocks base method +func (m *MockChainedEnforcer) Reporter() cost0.EnforcerReporter { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reporter") + ret0, _ := ret[0].(cost0.EnforcerReporter) + return ret0 +} + +// Reporter indicates an expected call of Reporter +func (mr *MockChainedEnforcerMockRecorder) Reporter() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reporter", reflect.TypeOf((*MockChainedEnforcer)(nil).Reporter)) +} + +// State mocks base method +func (m *MockChainedEnforcer) State() (cost0.Report, cost0.Limit) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "State") + ret0, _ := ret[0].(cost0.Report) + ret1, _ := ret[1].(cost0.Limit) + return ret0, ret1 +} + +// State indicates an expected call of State +func (mr *MockChainedEnforcerMockRecorder) State() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "State", reflect.TypeOf((*MockChainedEnforcer)(nil).State)) +} + +// MockChainedReporter is a mock of ChainedReporter interface +type MockChainedReporter struct { + ctrl *gomock.Controller + recorder *MockChainedReporterMockRecorder +} + +// MockChainedReporterMockRecorder is the mock recorder for MockChainedReporter +type MockChainedReporterMockRecorder struct { + mock *MockChainedReporter +} + +// NewMockChainedReporter creates a new mock instance +func NewMockChainedReporter(ctrl *gomock.Controller) *MockChainedReporter { + mock := &MockChainedReporter{ctrl: ctrl} + mock.recorder = &MockChainedReporterMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockChainedReporter) EXPECT() *MockChainedReporterMockRecorder { + return m.recorder +} + +// OnChildClose mocks base method +func (m *MockChainedReporter) OnChildClose(arg0 cost0.Cost) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnChildClose", arg0) +} + +// OnChildClose indicates an expected call of OnChildClose +func (mr *MockChainedReporterMockRecorder) OnChildClose(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnChildClose", reflect.TypeOf((*MockChainedReporter)(nil).OnChildClose), arg0) +} + +// OnClose mocks base method +func (m *MockChainedReporter) OnClose(arg0 cost0.Cost) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnClose", arg0) +} + +// OnClose indicates an expected call of OnClose +func (mr *MockChainedReporterMockRecorder) OnClose(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnClose", reflect.TypeOf((*MockChainedReporter)(nil).OnClose), arg0) +} + +// ReportCost mocks base method +func (m *MockChainedReporter) ReportCost(arg0 cost0.Cost) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ReportCost", arg0) +} + +// ReportCost indicates an expected call of ReportCost +func (mr *MockChainedReporterMockRecorder) ReportCost(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReportCost", reflect.TypeOf((*MockChainedReporter)(nil).ReportCost), arg0) +} + +// ReportCurrent mocks base method +func (m *MockChainedReporter) ReportCurrent(arg0 cost0.Cost) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ReportCurrent", arg0) +} + +// ReportCurrent indicates an expected call of ReportCurrent +func (mr *MockChainedReporterMockRecorder) ReportCurrent(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReportCurrent", reflect.TypeOf((*MockChainedReporter)(nil).ReportCurrent), arg0) +} + +// ReportOverLimit mocks base method +func (m *MockChainedReporter) ReportOverLimit(arg0 bool) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ReportOverLimit", arg0) +} + +// ReportOverLimit indicates an expected call of ReportOverLimit +func (mr *MockChainedReporterMockRecorder) ReportOverLimit(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReportOverLimit", reflect.TypeOf((*MockChainedReporter)(nil).ReportOverLimit), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/query/graphite/errors/errors.go b/vendor/github.com/m3db/m3/src/query/graphite/errors/errors.go new file mode 100644 index 00000000..173cce27 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/graphite/errors/errors.go @@ -0,0 +1,99 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package errors + +import ( + errs "errors" +) + +// New returns an error that formats as the given text +func New(name string) error { + return errs.New(name) +} + +type containedError struct { + inner error +} + +type containedErr interface { + innerError() error +} + +// InnerError returns the packaged inner error if this is an error that contains another +func InnerError(err error) error { + contained, ok := err.(containedErr) + if !ok { + return nil + } + return contained.innerError() +} + +type invalidParamsError struct { + containedError +} + +// NewInvalidParamsError creates a new invalid params error +func NewInvalidParamsError(inner error) error { + return invalidParamsError{containedError{inner}} +} + +func (e invalidParamsError) Error() string { + return e.inner.Error() +} + +func (e invalidParamsError) innerError() error { + return e.inner +} + +// IsInvalidParams returns true if this is an invalid params error +func IsInvalidParams(err error) bool { + return GetInnerInvalidParamsError(err) != nil +} + +// GetInnerInvalidParamsError returns an inner invalid params error +// if contained by this error, nil otherwise +func GetInnerInvalidParamsError(err error) error { + for err != nil { + if _, ok := err.(invalidParamsError); ok { + return InnerError(err) + } + err = InnerError(err) + } + return nil +} + +type renamedError struct { + containedError + renamed error +} + +// NewRenamedError returns a new error that packages an inner error with a renamed error +func NewRenamedError(inner, renamed error) error { + return renamedError{containedError{inner}, renamed} +} + +func (e renamedError) Error() string { + return e.renamed.Error() +} + +func (e renamedError) innerError() error { + return e.inner +} diff --git a/vendor/github.com/m3db/m3/src/query/graphite/graphite/glob.go b/vendor/github.com/m3db/m3/src/query/graphite/graphite/glob.go new file mode 100644 index 00000000..99b5aaa0 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/graphite/graphite/glob.go @@ -0,0 +1,182 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package graphite + +import ( + "bytes" + "fmt" + "strings" + + "github.com/m3db/m3/src/query/graphite/errors" +) + +const ( + // ValidIdentifierRunes contains all the runes allowed in a graphite identifier + ValidIdentifierRunes = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + "abcdefghijklmnopqrstuvwxyz" + + "0123456789" + + "$-_'|<>%#/:" +) + +// GlobToRegexPattern converts a graphite-style glob into a regex pattern, with +// a boolean indicating if the glob is regexed or not +func GlobToRegexPattern(glob string) ([]byte, bool, error) { + return globToRegexPattern(glob, GlobOptions{}) +} + +// ExtendedGlobToRegexPattern converts a graphite-style glob into a regex pattern +// with extended options +func ExtendedGlobToRegexPattern(glob string, opts GlobOptions) ([]byte, bool, error) { + return globToRegexPattern(glob, opts) +} + +// GlobOptions allows for matching everything +type GlobOptions struct { + // AllowMatchAll allows for matching all text + // including hierarchy separators with "**" + AllowMatchAll bool `yaml:"allowMatchAll"` +} + +type pattern struct { + buff bytes.Buffer + eval rune + lastWriteLen int +} + +func (p *pattern) String() string { + return p.buff.String() +} + +func (p *pattern) Evaluate(r rune) { + p.eval = r +} + +func (p *pattern) LastEvaluate() rune { + return p.eval +} + +func (p *pattern) WriteRune(r rune) { + p.buff.WriteRune(r) + p.lastWriteLen = 1 +} + +func (p *pattern) WriteString(str string) { + p.buff.WriteString(str) + p.lastWriteLen = len(str) +} + +func (p *pattern) UnwriteLast() { + p.buff.Truncate(p.buff.Len() - p.lastWriteLen) + p.lastWriteLen = 0 +} + +func globToRegexPattern(glob string, opts GlobOptions) ([]byte, bool, error) { + var ( + pattern pattern + escaping = false + regexed = false + ) + + groupStartStack := []rune{rune(0)} // rune(0) indicates pattern is not in a group + for i, r := range glob { + prevEval := pattern.LastEvaluate() + pattern.Evaluate(r) + + if escaping { + pattern.WriteRune(r) + escaping = false + continue + } + + switch r { + case '\\': + escaping = true + pattern.WriteRune('\\') + case '.': + // Match hierarchy separator + pattern.WriteString("\\.+") + regexed = true + case '?': + // Match anything except the hierarchy separator + pattern.WriteString("[^\\.]") + regexed = true + case '*': + if opts.AllowMatchAll && prevEval == '*' { + pattern.UnwriteLast() + pattern.WriteString(".*") + regexed = true + } else { + // Match everything up to the next hierarchy separator + pattern.WriteString("[^\\.]*") + regexed = true + } + case '{': + // Begin non-capturing group + pattern.WriteString("(") + groupStartStack = append(groupStartStack, r) + regexed = true + case '}': + // End non-capturing group + priorGroupStart := groupStartStack[len(groupStartStack)-1] + if priorGroupStart != '{' { + return nil, false, errors.NewInvalidParamsError(fmt.Errorf("invalid '}' at %d, no prior for '{' in %s", i, glob)) + } + + pattern.WriteRune(')') + groupStartStack = groupStartStack[:len(groupStartStack)-1] + case '[': + // Begin character range + pattern.WriteRune('[') + groupStartStack = append(groupStartStack, r) + regexed = true + case ']': + // End character range + priorGroupStart := groupStartStack[len(groupStartStack)-1] + if priorGroupStart != '[' { + return nil, false, errors.NewInvalidParamsError(fmt.Errorf("invalid ']' at %d, no prior for '[' in %s", i, glob)) + } + + pattern.WriteRune(']') + groupStartStack = groupStartStack[:len(groupStartStack)-1] + case '<', '>', '\'', '$': + pattern.WriteRune('\\') + pattern.WriteRune(r) + case ',': + // Commas are part of the pattern if they appear in a group + if groupStartStack[len(groupStartStack)-1] == '{' { + pattern.WriteRune('|') + } else { + return nil, false, errors.NewInvalidParamsError(fmt.Errorf("invalid ',' outside of matching group at pos %d in %s", i, glob)) + } + default: + if !strings.ContainsRune(ValidIdentifierRunes, r) { + return nil, false, errors.NewInvalidParamsError(fmt.Errorf("invalid character %c at pos %d in %s", r, i, glob)) + } + pattern.WriteRune(r) + } + } + + if len(groupStartStack) > 1 { + return nil, false, errors.NewInvalidParamsError(fmt.Errorf("unbalanced '%c' in %s", groupStartStack[len(groupStartStack)-1], glob)) + } + + return pattern.buff.Bytes(), regexed, nil +} diff --git a/vendor/github.com/m3db/m3/src/query/graphite/graphite/graphite_types.go b/vendor/github.com/m3db/m3/src/query/graphite/graphite/graphite_types.go new file mode 100644 index 00000000..ab7bb8bf --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/graphite/graphite/graphite_types.go @@ -0,0 +1,263 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package graphite + +import ( + "bytes" + "encoding/json" + "fmt" + "math" + "net/http" + "strconv" + "time" + + "github.com/hydrogen18/stalecucumber" +) + +// MIMETypeApplicationPickle defines the MIME type for application/pickle content +const MIMETypeApplicationPickle = "application/pickle" + +// A Timestamp is a time.Time that knows how to marshal and unmarshal +// itself as Graphite expects (as seconds since Unix epoch) +type Timestamp time.Time + +// MarshalJSON marshals the timestamp as JSON +func (t Timestamp) MarshalJSON() ([]byte, error) { + s := strconv.FormatInt(time.Time(t).Unix(), 10) + return []byte(s), nil +} + +// UnmarshalJSON unmarshals the timestamp from JSON +func (t *Timestamp) UnmarshalJSON(data []byte) error { + n, err := strconv.ParseInt(string(data), 10, 64) + if err != nil { + return err + } + + *t = Timestamp(time.Unix(n, 0).UTC()) + return nil +} + +// A Datavalue is a float64 which knows how to marshal and unmarshal +// itself as Graphite expects (NaNs becomes nulls) +type Datavalue float64 + +// MarshalJSON marshals the value as JSON, writing NaNs as nulls +func (v Datavalue) MarshalJSON() ([]byte, error) { + if math.IsNaN(float64(v)) { + return []byte("null"), nil + } + + s := strconv.FormatFloat(float64(v), 'f', -1, 64) + return []byte(s), nil +} + +// UnmarshalJSON unmarshals the value as JSON, converting nulls into NaNs +func (v *Datavalue) UnmarshalJSON(data []byte) error { + s := string(data) + if s == "null" { + *v = Datavalue(math.NaN()) + return nil + } + + n, err := strconv.ParseFloat(s, 64) + *v = Datavalue(n) + return err +} + +// RenderDatapoints are the set of datapoints returned from Graphite rendering +type RenderDatapoints [][]interface{} + +// Add adds a new datapoint to the set of datapoints +func (dp *RenderDatapoints) Add(timestamp time.Time, value float64) { + *dp = append(*dp, []interface{}{Datavalue(value), Timestamp(timestamp)}) +} + +// Get returns the timestamp and value at the given index +func (dp RenderDatapoints) Get(i int) (time.Time, float64) { + value := math.NaN() + if dp[i][0] != nil { + value = dp[i][0].(float64) + } + + switch timestamp := dp[i][1].(type) { + case float64: + return time.Unix(int64(timestamp), 0).UTC(), value + case int: + return time.Unix(int64(timestamp), 0).UTC(), value + case time.Time: + return timestamp, value + default: + panic(fmt.Sprintf("unsupported timestamp type")) + } +} + +// A RenderTarget is the result of rendering a given target +type RenderTarget struct { + Target string `json:"target"` + Datapoints RenderDatapoints `json:"datapoints"` +} + +// RenderResults are the results from a render API call +type RenderResults []RenderTarget + +// A Datapoint is a Timestamp/Value pair representing a single value in a +// target +type Datapoint struct { + Timestamp Timestamp `json:"t"` + Value Datavalue `json:"v"` +} + +// Results are a map of graphite target names to their corresponding datapoints +type Results map[string][]Datapoint + +// RenderResultsPickle is an alternate form of graphite result, consisting of a +// start time, an end time, a step size (in seconds), and values for each step. +// Steps that do not have a value will be NaN +type RenderResultsPickle struct { + Name string `pickle:"name"` + Start uint32 `pickle:"start"` + End uint32 `pickle:"end"` + Step uint32 `pickle:"step"` + Values []interface{} `pickle:"values"` // value can be nil (python 'None') +} + +// Len returns the number of results +func (p RenderResultsPickle) Len() int { return len(p.Values) } + +// ValueAt returns the value at the given step +func (p RenderResultsPickle) ValueAt(n int) float64 { + if p.Values[n] == nil { + return math.NaN() + } + + return p.Values[n].(float64) +} + +// Get returns the timestamp and value at the given index +func (p RenderResultsPickle) Get(i int) (time.Time, float64) { + value := math.NaN() + if p.Values[i] != nil { + value = p.Values[i].(float64) + } + + timestamp := time.Unix(int64(p.Start)+int64(p.Step*uint32(i)), 0).UTC() + return timestamp, value +} + +// ParseRenderResultsPickle parses a byte stream containing a pickle render response +func ParseRenderResultsPickle(b []byte) ([]RenderResultsPickle, error) { + r := bytes.NewReader(b) + + var pickleResults []RenderResultsPickle + if err := stalecucumber.UnpackInto(&pickleResults).From(stalecucumber.Unpickle(r)); err != nil { + return nil, err + } + + //convert stalecucumber.PickleNone to nil + for _, r := range pickleResults { + for i, v := range r.Values { + _, ok := v.(stalecucumber.PickleNone) + if ok { + r.Values[i] = nil + } + } + } + + return pickleResults, nil +} + +// ParseJSONResponse takes a byteBuffer and returns Results +func ParseJSONResponse(b []byte) (Results, error) { + var jsonResults []jsonResult + if err := json.Unmarshal(b, &jsonResults); err != nil { + return nil, err + } + + results := make(Results, len(jsonResults)) + for _, jsonResult := range jsonResults { + datapoints := make([]Datapoint, 0, len(jsonResult.Datapoints)) + for _, jsonPoint := range jsonResult.Datapoints { + if jsonPoint[0] == nil { + jsonPoint[0] = math.NaN() + } + datapoints = append(datapoints, Datapoint{ + Timestamp: Timestamp(time.Unix(int64(jsonPoint[1].(float64)), 0)), + Value: Datavalue(jsonPoint[0].(float64)), + }) + } + + results[jsonResult.Target] = datapoints + } + + return results, nil +} + +type jsonResult struct { + Target string `json:"target"` + Datapoints [][]interface{} `json:"datapoints"` +} + +// RespondWithPickle sends a python pickle response +func RespondWithPickle(w http.ResponseWriter, data interface{}) error { + w.Header().Add("Content-Type", MIMETypeApplicationPickle) + var buf bytes.Buffer + _, err := stalecucumber.NewPickler(&buf).Pickle(data) + if err != nil { + return err + } + + _, err = w.Write(buf.Bytes()) + return err +} + +// MetricsPathMetadata is an internal element of graphite's "completer" format +// for /metrics/find results. sample: {"is_leaf": "1", "path": +// "servers.foo-bar.baz.qux_qaz", "name": +// "qux_qaz"} +type MetricsPathMetadata struct { + Path string `json:"path"` + Name string `json:"name"` + IsLeaf int `json:"is_leaf,string"` // UGLY(jayp): should be a bool, int due to encoding/json +} + +// FindResultsPickle is graphite's pickle format for /metrics/find results +type FindResultsPickle struct { + Path string `pickle:"path" json:"path"` + IsLeaf bool `pickle:"is_leaf" json:"is_leaf"` +} + +// FindResultsCompleterJSON is graphite's "completer" format for /metrics/find +// results sample: {"metrics": [...]} +type FindResultsCompleterJSON struct { + Metrics []MetricsPathMetadata `json:"metrics"` +} + +// FindResultsTreeJSON is graphite's "treeJSON" format for /metrics/find +// results. sample: {"text": "quz", "expandable": 1, "leaf": 0, "id": +// "foo.bar-baz.qux.quz", "allowChildren": 1} +type FindResultsTreeJSON struct { + ID string `json:"id"` // =path + Text string `json:"text"` // =name + Leaf int `json:"leaf"` // =isLeaf + Expandable int `json:"expandable"` // =!isLeaf + AllowChildren int `json:"allowChildren"` // =!isLeaf +} diff --git a/vendor/github.com/m3db/m3/src/query/graphite/graphite/identify.go b/vendor/github.com/m3db/m3/src/query/graphite/graphite/identify.go new file mode 100644 index 00000000..917ddd29 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/graphite/graphite/identify.go @@ -0,0 +1,86 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package graphite + +// DropLastMetricPart returns the metric string without the last segment. +func DropLastMetricPart(metric string) string { + // read string in reverse until encountering a delimiter + for i := len(metric) - 1; i >= 0; i-- { + if metric[i] == '.' { + return metric[:i] + } + } + + return metric[:0] +} + +// CountMetricParts counts the number of segments in the given metric string. +func CountMetricParts(metric string) int { + return countMetricPartsWithDelimiter(metric, '.') +} + +func countMetricPartsWithDelimiter(metric string, delim byte) int { + if len(metric) == 0 { + return 0 + } + + count := 1 + for i := 0; i < len(metric); i++ { + if metric[i] == delim { + count++ + } + } + + return count +} + +// ExtractNthMetricPart returns the nth part of the metric string. Index starts from 0 +// and assumes metrics are delimited by '.'. If n is negative or bigger than the number +// of parts, returns an empty string. +func ExtractNthMetricPart(metric string, n int) string { + return ExtractNthStringPart(metric, n, '.') +} + +// ExtractNthStringPart returns the nth part of the metric string. Index starts from 0. +// If n is negative or bigger than the number of parts, returns an empty string. +func ExtractNthStringPart(target string, n int, delim rune) string { + if n < 0 { + return "" + } + + leftSide := 0 + delimsToGo := n + 1 + for i := 0; i < len(target); i++ { + if target[i] == byte(delim) { + delimsToGo-- + if delimsToGo == 0 { + return target[leftSide:i] + } + leftSide = i + 1 + } + } + + if delimsToGo > 1 { + return "" + } + + return target[leftSide:] +} diff --git a/vendor/github.com/m3db/m3/src/query/graphite/graphite/tags.go b/vendor/github.com/m3db/m3/src/query/graphite/graphite/tags.go new file mode 100644 index 00000000..cd857a4f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/graphite/graphite/tags.go @@ -0,0 +1,109 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package graphite + +import ( + "bytes" + "fmt" + "strconv" + + "github.com/m3db/m3/src/x/ident" + "github.com/m3db/m3/src/x/unsafe" +) + +const ( + // graphiteFormat is the format for graphite metric tag names, which will be + // represented as tag/value pairs in M3. + // NB: stats.gauges.donkey.kong.barrels would become the following tag set: + // {__g0__: stats} + // {__g1__: gauges} + // {__g2__: donkey} + // {__g3__: kong} + // {__g4__: barrels} + graphiteFormat = "__g%d__" + + // Number of pre-formatted key names to generate in the init() function. + numPreFormattedTagNames = 128 + + // MatchAllPattern that is used to match all metrics. + MatchAllPattern = ".*" +) + +var ( + // Should never be modified after init(). + preFormattedTagNames [][]byte + // Should never be modified after init(). + preFormattedTagNameIDs []ident.ID + + // Prefix is the prefix for graphite metrics + Prefix = []byte("__g") + + // Suffix is the suffix for graphite metrics + suffix = []byte("__") +) + +func init() { + for i := 0; i < numPreFormattedTagNames; i++ { + name := generateTagName(i) + preFormattedTagNames = append(preFormattedTagNames, name) + preFormattedTagNameIDs = append(preFormattedTagNameIDs, ident.BytesID(name)) + } +} + +// TagName gets a preallocated or generate a tag name for the given graphite +// path index. +func TagName(idx int) []byte { + if idx < len(preFormattedTagNames) { + return preFormattedTagNames[idx] + } + + return []byte(fmt.Sprintf(graphiteFormat, idx)) +} + +// TagNameID gets a preallocated or generate a tag name ID for the given graphite +// path index. +func TagNameID(idx int) ident.ID { + if idx < len(preFormattedTagNameIDs) { + return preFormattedTagNameIDs[idx] + } + + return ident.StringID(fmt.Sprintf(graphiteFormat, idx)) +} + +func generateTagName(idx int) []byte { + return []byte(fmt.Sprintf(graphiteFormat, idx)) +} + +// TagIndex returns the index given the tag. +func TagIndex(tag []byte) (int, bool) { + if !bytes.HasPrefix(tag, Prefix) || + !bytes.HasSuffix(tag, suffix) { + return 0, false + } + start := len(Prefix) + end := len(tag) - len(suffix) + indexStr := unsafe.String(tag[start:end]) + index, err := strconv.Atoi(indexStr) + if err != nil { + return 0, false + } + return index, true +} diff --git a/vendor/github.com/m3db/m3/src/query/graphite/graphite/timespec.go b/vendor/github.com/m3db/m3/src/query/graphite/graphite/timespec.go new file mode 100644 index 00000000..a629a892 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/graphite/graphite/timespec.go @@ -0,0 +1,341 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package graphite + +import ( + "fmt" + "regexp" + "strconv" + "strings" + "time" + + "github.com/m3db/m3/src/query/graphite/errors" +) + +var reRelativeTime = regexp.MustCompile(`(?i)^\-([0-9]+)(s|min|h|d|w|mon|y)$`) // allows -3min, -4d, etc. +var reTimeOffset = regexp.MustCompile(`(?i)^(\-|\+)([0-9]+)(s|min|h|d|w|mon|y)$`) // -3min, +3min, -4d, +4d +var reMonthAndDay = regexp.MustCompile(`(?i)^(january|february|march|april|may|june|july|august|september|october|november|december)([0-9]{1,2}?)$`) +var reDayOfWeek = regexp.MustCompile(`(?i)^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)$`) +var reDayOfWeekOffset = regexp.MustCompile(`(?i)^(\-|\+)(sunday|monday|tuesday|wednesday|thursday|friday|saturday)$`) // +monday, +thursday, etc +var rePM = regexp.MustCompile(`(?i)^(([0-1]?)([0-9])pm)([[:ascii:]])*$`) // 8pm, 12pm, 8pm monday +var reAM = regexp.MustCompile(`(?i)^(([0-1]?)([0-9])am)([[:ascii:]])*$`) // 2am, 11am, 7am yesterday +var reTimeOfDayWithColon = regexp.MustCompile(`(?i)^(([0-1]?)([0-9]):([0-5])([0-9])((am|pm)?))([[:ascii:]])*$`) // 8:12pm, 11:20am, 2:00am + +var periods = map[string]time.Duration{ + "s": time.Second, + "min": time.Minute, + "h": time.Hour, + "d": time.Hour * 24, + "w": time.Hour * 24 * 7, + "mon": time.Hour * 24 * 30, + "y": time.Hour * 24 * 365, +} + +var weekdays = map[string]int{ + "sunday": 0, + "monday": 1, + "tuesday": 2, + "wednesday": 3, + "thursday": 4, + "friday": 5, + "saturday": 6, +} + +var months = map[string]int{ + "january": 1, + "february": 2, + "march": 3, + "april": 4, + "may": 5, + "june": 6, + "july": 7, + "august": 8, + "september": 9, + "october": 10, + "november": 11, + "december": 12, +} + +// on Jan 2 15:04:05 -0700 MST 2006 +var formats = []string{ + "15:04_060102", + "15:04_20060102", + "15:04_01/02/06", + "15:04_02.01.06", + "02.01.06", + "01/02/06", + "01/02/2006", + "060102", + "20060102", +} + +// use init to rewrite formats to bypass bug in time.Parse +func init() { + for i := range formats { + formats[i] = bypassTimeParseBug(formats[i]) + } +} + +func bypassTimeParseBug(s string) string { + // NB(jayp): Looks like there is a bug in Golang's time.Parse when handing format strings + // with _2 in the format string. Here is a snippet that exhibits this issue: + // t, e := time.Parse("15:04_20060102", "14:38_20150618") + // We replace underscores with space to bypass this bug. + return strings.Replace(s, "_", " ", -1) +} + +// FormatTime translates a time.Time until a Graphite from/until string +func FormatTime(t time.Time) string { + return t.Format(formats[0]) +} + +func getWeekDayOffset(weekday string, now time.Time) time.Duration { + expectedDay := weekdays[weekday] + today := int(now.Weekday()) + dayOffset := today - expectedDay + if dayOffset < 0 { + dayOffset += 7 + } + + return time.Duration(dayOffset) * time.Hour * -24 +} + +// ParseTime translates a Graphite from/until string into a timestamp relative to the provide time +func ParseTime(s string, now time.Time, absoluteOffset time.Duration) (time.Time, error) { + if len(s) == 0 { + return now, errors.NewInvalidParamsError(fmt.Errorf("time cannot be empty")) + } + + if s == "now" { + return now, nil + } + + if m := reRelativeTime.FindStringSubmatch(s); len(m) != 0 { + timePast, err := strconv.ParseInt(m[1], 10, 32) + if err != nil { + return now, errors.NewInvalidParamsError(fmt.Errorf("invalid relative time %v", err)) + } + + period := periods[strings.ToLower(m[2])] + return now.Add(-1 * time.Duration(timePast) * period), nil + } + + newS := bypassTimeParseBug(s) + for _, format := range formats { + t, err := time.Parse(format, newS) + if err == nil { + // Absolute time passed in, applying offset + return t.Add(absoluteOffset), nil + } + } + + n, err := strconv.ParseInt(s, 10, 64) + if err == nil { + return time.Unix(n, 0).UTC(), nil + } + + s = strings.Replace(strings.Replace(strings.ToLower(s), ",", "", -1), " ", "", -1) + ref, offset := s, "" + if strings.Contains(s, "+") { + stringSlice := strings.Split(s, "+") + if len(stringSlice) == 2 { + ref, offset = stringSlice[0], stringSlice[1] + offset = "+" + offset + } else { + return now, errors.NewInvalidParamsError(fmt.Errorf("unknown time string %s", s)) + } + } else if strings.Contains(s, "-") { + stringSlice := strings.Split(s, "-") + if len(stringSlice) == 2 { + ref, offset = stringSlice[0], stringSlice[1] + offset = "-" + offset + } else { + return now, errors.NewInvalidParamsError(fmt.Errorf("unknown time string %s", s)) + } + } + parsedReference, err := ParseTimeReference(ref, now) + if err == nil { + parsedOffset, err := ParseOffset(offset, now) + if err == nil { + return parsedReference.Add(parsedOffset), nil + } + } + + return now, err +} + +// ParseTimeReference takes a Graphite time reference ("8am", "today", "monday") and returns a time.Time +func ParseTimeReference(ref string, now time.Time) (time.Time, error) { + var ( + hour = now.Hour() + minute = now.Minute() + refDate time.Time + ) + + if ref == "" || ref == "now" { + return now, nil + } + + // check if the time ref fits an absolute time format + for _, format := range formats { + t, err := time.Parse(format, ref) + if err == nil { + return t, nil + } + } + + rawRef := ref + + // Time of Day Reference (8:12pm, 11:20am, 2:00am, etc.) + if reTimeOfDayWithColon.MatchString(rawRef) { + i := strings.Index(ref, ":") + newHour, err := strconv.ParseInt(ref[:i], 10, 0) + if err != nil { + return time.Time{}, err + } + hour = int(newHour) + if len(ref) >= i+3 { + newMinute, err := strconv.ParseInt(ref[i+1:i+3], 10, 32) + if err != nil { + return time.Time{}, err + } + minute = int(newMinute) + if minute > 59 { + return time.Time{}, errors.NewInvalidParamsError(fmt.Errorf("unknown time reference %s", rawRef)) + } + ref = ref[i+3:] + } + + if len(ref) >= 2 { + if ref[:2] == "am" { + ref = ref[2:] + } else if ref[:2] == "pm" { + hour = (hour + 12) % 24 + ref = ref[2:] + } + } + } + + // Xam or XXam + if reAM.MatchString(rawRef) { + i := strings.Index(ref, "am") + newHour, err := strconv.ParseInt(ref[:i], 10, 32) + if err != nil { + return time.Time{}, err + } + hour = int(newHour) + minute = 0 + ref = ref[i+2:] + } + + // Xpm or XXpm + if rePM.MatchString(rawRef) { + i := strings.Index(ref, "pm") + newHour, err := strconv.ParseInt(ref[:i], 10, 32) + if err != nil { + return time.Time{}, err + } + if newHour > 24 { + return time.Time{}, errors.NewInvalidParamsError(fmt.Errorf("unknown time reference %s", rawRef)) + } + hour = int((newHour + 12) % 24) + minute = 0 + ref = ref[i+2:] + } + + if strings.HasPrefix(ref, "noon") { + hour, minute = 12, 0 + ref = ref[4:] + } else if strings.HasPrefix(ref, "midnight") { + hour, minute = 0, 0 + ref = ref[8:] + } else if strings.HasPrefix(ref, "teatime") { + hour, minute = 16, 0 + ref = ref[7:] + } + + refDate = time.Date(now.Year(), now.Month(), now.Day(), hour, minute, 0, 0, now.Location()) + + // Day reference + if ref == "yesterday" { + refDate = refDate.Add(time.Hour * -24) + } else if ref == "tomorrow" { + refDate = refDate.Add(time.Hour * 24) + } else if ref == "today" { + return refDate, nil + } else if reMonthAndDay.MatchString(ref) { // monthDay (january10, may6, may06 etc.) + day := 0 + monthString := "" + if val, err := strconv.ParseInt(ref[len(ref)-2:], 10, 64); err == nil { + day = int(val) + monthString = ref[:len(ref)-2] + } else if val, err := strconv.ParseInt(ref[len(ref)-1:], 10, 64); err == nil { + day = int(val) + monthString = ref[:len(ref)-1] + } else { + return refDate, errors.NewInvalidParamsError(fmt.Errorf("day of month required after month name")) + } + refDate = time.Date(refDate.Year(), time.Month(months[monthString]), day, hour, minute, 0, 0, refDate.Location()) + } else if reDayOfWeek.MatchString(ref) { // DayOfWeek (Monday, etc) + refDate = refDate.Add(getWeekDayOffset(ref, refDate)) + } else if ref != "" { + return time.Time{}, errors.NewInvalidParamsError(fmt.Errorf("unknown time reference %s", rawRef)) + } + + return refDate, nil +} + +// ParseDuration parses a duration +func ParseDuration(s string) (time.Duration, error) { + if m := reRelativeTime.FindStringSubmatch(s); len(m) != 0 { + timePast, err := strconv.ParseInt(m[1], 10, 32) + if err != nil { + return 0, errors.NewInvalidParamsError(fmt.Errorf("invalid relative time %v", err)) + } + + period := periods[strings.ToLower(m[2])] + return -1 * time.Duration(timePast) * period, nil + } + + return 0, errors.NewInvalidParamsError(fmt.Errorf("invalid relative time %s", s)) +} + +// ParseOffset parses a time offset (like a duration, but can be 0 or positive) +func ParseOffset(s string, now time.Time) (time.Duration, error) { + if s == "" { + return time.Duration(0), nil + } + + if m := reTimeOffset.FindStringSubmatch(s); len(m) != 0 { + parity := 1 + if m[1] == "-" { + parity = -1 + } + timeInteger, err := strconv.ParseInt(m[2], 10, 32) + if err != nil { + return 0, errors.NewInvalidParamsError(fmt.Errorf("invalid time offset %v", err)) + } + period := periods[strings.ToLower(m[3])] + return period * time.Duration(timeInteger) * time.Duration(parity), nil + } + + return 0, errors.NewInvalidParamsError(fmt.Errorf("invalid time offset %s", s)) +} diff --git a/vendor/github.com/m3db/m3/src/query/models/block_type.go b/vendor/github.com/m3db/m3/src/query/models/block_type.go new file mode 100644 index 00000000..1cae3fee --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/block_type.go @@ -0,0 +1,39 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +import ( + "fmt" +) + +// Validate validates the fetched block type. +func (t FetchedBlockType) Validate() error { + switch t { + case TypeSingleBlock: + return nil + case TypeMultiBlock: + return ErrMultiBlockDisabled + case TypeDecodedBlock: + return ErrDecodedBlockDeprecated + default: + return fmt.Errorf(`invalid fetched block type "%v"`, t) + } +} diff --git a/vendor/github.com/m3db/m3/src/query/models/bounds.go b/vendor/github.com/m3db/m3/src/query/models/bounds.go new file mode 100644 index 00000000..12be51b7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/bounds.go @@ -0,0 +1,141 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +import ( + "fmt" + "math" + "time" +) + +// Bounds are the time bounds, start time is inclusive but end is exclusive. +type Bounds struct { + Start time.Time + Duration time.Duration + StepSize time.Duration +} + +// TimeForIndex returns the start time for a given index assuming +// a uniform step size. +func (b Bounds) TimeForIndex(idx int) (time.Time, error) { + duration := time.Duration(idx) * b.StepSize + if b.Steps() == 0 || duration >= b.Duration { + return time.Time{}, fmt.Errorf("out of bounds, %d", idx) + } + + return b.Start.Add(duration), nil +} + +// End calculates the end time for the block and is exclusive. +func (b Bounds) End() time.Time { + return b.Start.Add(b.Duration) +} + +// Steps calculates the number of steps for the bounds. +func (b Bounds) Steps() int { + if b.StepSize <= 0 { + return 0 + } + + return int(b.Duration / b.StepSize) +} + +// Contains returns whether the time lies between the bounds. +func (b Bounds) Contains(t time.Time) bool { + diff := b.Start.Sub(t) + return diff >= 0 && diff < b.Duration +} + +// Next returns the nth next bound from the current bound. +func (b Bounds) Next(n int) Bounds { + return b.nth(n, true) +} + +// Previous returns the nth previous bound from the current bound. +func (b Bounds) Previous(n int) Bounds { + return b.nth(n, false) +} + +func (b Bounds) nth(n int, forward bool) Bounds { + multiplier := time.Duration(n) + if !forward { + multiplier *= -1 + } + + blockDuration := b.Duration + start := b.Start.Add(blockDuration * multiplier) + return Bounds{ + Start: start, + Duration: blockDuration, + StepSize: b.StepSize, + } +} + +// Blocks returns the number of blocks until time t. +func (b Bounds) Blocks(t time.Time) int { + return int(b.Start.Sub(t) / b.Duration) +} + +// String representation of the bounds. +func (b Bounds) String() string { + return fmt.Sprintf("start: %v, duration: %v, stepSize: %v, steps: %d", + b.Start, b.Duration, b.StepSize, b.Steps()) +} + +// Nearest returns the nearest bound before the given time. +func (b Bounds) Nearest(t time.Time) Bounds { + startTime := b.Start + duration := b.Duration + endTime := startTime.Add(duration) + step := b.StepSize + if t.After(startTime) { + for endTime.Before(t) { + startTime = endTime + endTime = endTime.Add(duration) + } + + return Bounds{ + Start: startTime, + Duration: duration, + StepSize: step, + } + } + + if startTime.After(t) { + diff := startTime.Sub(t) + timeDiff := math.Ceil(float64(diff) / float64(step)) + startTime = startTime.Add(-1 * time.Duration(timeDiff) * step) + } + + return Bounds{ + Start: startTime, + Duration: duration, + StepSize: step, + } +} + +// Equals is true if two bounds are equal, including step size. +func (b Bounds) Equals(other Bounds) bool { + if b.StepSize != other.StepSize { + return false + } + return b.Start.Equal(other.Start) && b.Duration == other.Duration +} diff --git a/vendor/github.com/m3db/m3/src/query/models/config.go b/vendor/github.com/m3db/m3/src/query/models/config.go new file mode 100644 index 00000000..618afe03 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/config.go @@ -0,0 +1,90 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +import ( + "errors" + "fmt" +) + +var validIDSchemes = []IDSchemeType{ + TypeLegacy, + TypeQuoted, + TypePrependMeta, + TypeGraphite, +} + +// Validate validates that the scheme type is valid. +func (t IDSchemeType) Validate() error { + if t == TypeDefault { + return errors.New("id scheme type not set") + } + + if t >= TypeLegacy && t <= TypeGraphite { + return nil + } + + return fmt.Errorf("invalid config id schema type '%v': should be one of %v", + t, validIDSchemes) +} + +func (t IDSchemeType) String() string { + switch t { + case TypeDefault: + return "" + case TypeLegacy: + return "legacy" + case TypeQuoted: + return "quoted" + case TypePrependMeta: + return "prepend_meta" + case TypeGraphite: + return "graphite" + default: + // Should never get here. + return "unknown" + } +} + +// UnmarshalYAML unmarshals a stored merics type. +func (t *IDSchemeType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + + for _, valid := range validIDSchemes { + if valid == TypeGraphite { + // NB: while the graphite scheme is valid, it is not available to choose + // as a general ID scheme; instead, it is set on any metric coming through + // the graphite ingestion path. + continue + } + + if str == valid.String() { + *t = valid + return nil + } + } + + return fmt.Errorf("invalid MetricsType '%s' valid types are: %v", + str, validIDSchemes) +} diff --git a/vendor/github.com/m3db/m3/src/query/models/matcher.go b/vendor/github.com/m3db/m3/src/query/models/matcher.go new file mode 100644 index 00000000..ababbf21 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/matcher.go @@ -0,0 +1,152 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +import ( + "bytes" + "errors" + "fmt" + "regexp" + "strings" +) + +func (m MatchType) String() string { + switch m { + case MatchEqual: + return "=" + case MatchNotEqual: + return "!=" + case MatchRegexp: + return "=~" + case MatchNotRegexp: + return "!~" + case MatchField: + return "-" + case MatchNotField: + return "!-" + case MatchAll: + return "*" + default: + return "unknown match type" + } +} + +// NewMatcher returns a matcher object. +func NewMatcher(t MatchType, n, v []byte) (Matcher, error) { + m := Matcher{ + Type: t, + Name: n, + Value: v, + } + + if len(n) == 0 && t != MatchAll { + return Matcher{}, errors.New("name must be set unless using MatchAll") + } + + if t == MatchRegexp || t == MatchNotRegexp { + re, err := regexp.Compile("^(?:" + string(v) + ")$") + if err != nil { + return Matcher{}, err + } + + m.re = re + } + + return m, nil +} + +func (m Matcher) String() string { + return fmt.Sprintf("%s%s%q", m.Name, m.Type, m.Value) +} + +// ToTags converts Matchers to Tags +// NB (braskin): this only works for exact matches +func (m Matchers) ToTags( + tagOptions TagOptions, +) (Tags, error) { + // todo: nil is good here? + tags := NewTags(len(m), tagOptions) + for _, v := range m { + if v.Type != MatchEqual { + return EmptyTags(), + fmt.Errorf("illegal match type, got %v, but expecting: %v", + v.Type, MatchEqual) + } + + tags = tags.AddTag(Tag{Name: v.Name, Value: v.Value}).Clone() + } + + return tags, nil +} + +func (m Matchers) String() string { + var buffer bytes.Buffer + for _, match := range m { + buffer.WriteString(match.String()) + buffer.WriteByte(sep) + } + + return buffer.String() +} + +// TODO: make this more robust, handle types other than MatchEqual +func matcherFromString(s string) (Matcher, error) { + ss := strings.Split(s, ":") + length := len(ss) + if length > 2 { + return Matcher{}, errors.New("invalid arg length for matcher") + } + + if length == 0 || len(ss[0]) == 0 { + return Matcher{}, errors.New("empty matcher") + } + + if length == 1 { + return Matcher{ + Type: MatchRegexp, + Name: []byte(ss[0]), + Value: []byte{}, + }, nil + } + + return Matcher{ + Type: MatchRegexp, + Name: []byte(ss[0]), + Value: []byte(ss[1]), + }, nil +} + +// MatchersFromString parses a string into Matchers +// TODO: make this more robust, handle types other than MatchEqual +func MatchersFromString(s string) (Matchers, error) { + split := strings.Fields(s) + matchers := make(Matchers, len(split)) + for i, ss := range split { + matcher, err := matcherFromString(ss) + if err != nil { + return nil, err + } + + matchers[i] = matcher + } + + return matchers, nil +} diff --git a/vendor/github.com/m3db/m3/src/query/models/options.go b/vendor/github.com/m3db/m3/src/query/models/options.go new file mode 100644 index 00000000..d54bb262 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/options.go @@ -0,0 +1,140 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +import ( + "bytes" + "errors" + + "github.com/prometheus/common/model" +) + +var ( + defaultMetricName = []byte(model.MetricNameLabel) + defaultBucketName = []byte("le") + defaultAllowTagNameDuplicates = false + defaultAllowTagValueEmpty = false + + errNoName = errors.New("metric name is missing or empty") + errNoBucket = errors.New("bucket name is missing or empty") +) + +type tagOptions struct { + version int + idScheme IDSchemeType + bucketName []byte + metricName []byte + filters Filters + allowTagNameDuplicates bool + allowTagValueEmpty bool +} + +// NewTagOptions builds a new tag options with default values. +func NewTagOptions() TagOptions { + return &tagOptions{ + version: 0, + metricName: defaultMetricName, + bucketName: defaultBucketName, + idScheme: TypeLegacy, + allowTagNameDuplicates: defaultAllowTagNameDuplicates, + allowTagValueEmpty: defaultAllowTagValueEmpty, + } +} + +func (o *tagOptions) Validate() error { + if o.metricName == nil || len(o.metricName) == 0 { + return errNoName + } + + if o.bucketName == nil || len(o.bucketName) == 0 { + return errNoBucket + } + + return o.idScheme.Validate() +} + +func (o *tagOptions) SetMetricName(value []byte) TagOptions { + opts := *o + opts.metricName = value + return &opts +} + +func (o *tagOptions) MetricName() []byte { + return o.metricName +} + +func (o *tagOptions) SetBucketName(value []byte) TagOptions { + opts := *o + opts.bucketName = value + return &opts +} + +func (o *tagOptions) BucketName() []byte { + return o.bucketName +} + +func (o *tagOptions) SetIDSchemeType(value IDSchemeType) TagOptions { + opts := *o + opts.idScheme = value + return &opts +} + +func (o *tagOptions) IDSchemeType() IDSchemeType { + return o.idScheme +} + +func (o *tagOptions) SetFilters(value Filters) TagOptions { + opts := *o + opts.filters = value + return &opts +} + +func (o *tagOptions) Filters() Filters { + return o.filters +} + +func (o *tagOptions) SetAllowTagNameDuplicates(value bool) TagOptions { + opts := *o + opts.allowTagNameDuplicates = value + return &opts +} + +func (o *tagOptions) AllowTagNameDuplicates() bool { + return o.allowTagNameDuplicates +} + +func (o *tagOptions) SetAllowTagValueEmpty(value bool) TagOptions { + opts := *o + opts.allowTagValueEmpty = value + return &opts +} + +func (o *tagOptions) AllowTagValueEmpty() bool { + return o.allowTagValueEmpty +} + +func (o *tagOptions) Equals(other TagOptions) bool { + return o.idScheme == other.IDSchemeType() && + bytes.Equal(o.metricName, other.MetricName()) && + bytes.Equal(o.bucketName, other.BucketName()) && + o.allowTagNameDuplicates == other.AllowTagNameDuplicates() && + o.allowTagValueEmpty == other.AllowTagValueEmpty() +} diff --git a/vendor/github.com/m3db/m3/src/query/models/params.go b/vendor/github.com/m3db/m3/src/query/models/params.go new file mode 100644 index 00000000..2ea97bb1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/params.go @@ -0,0 +1,97 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +import ( + "fmt" + "time" +) + +// FormatType describes what format to return the data in. +type FormatType int + +const ( + // FormatPromQL returns results in Prom format + FormatPromQL FormatType = iota + // FormatM3QL returns results in M3QL format + FormatM3QL + + infoMsg = "if this is causing issues for your use case, please file an " + + "issue on https://github.com/m3db/m3" +) + +var ( + // ErrDecodedBlockDeprecated indicates decoded blocks are deprecated. + ErrDecodedBlockDeprecated = fmt.Errorf("decoded block has been deprecated %s", + infoMsg) + + // ErrMultiBlockDisabled indicates multi blocks are temporarily disabled. + ErrMultiBlockDisabled = fmt.Errorf("multiblock is temporarily disabled %s", + infoMsg) +) + +// FetchedBlockType determines the type for fetched blocks, and how they are +// transformed from storage type. +type FetchedBlockType uint8 + +const ( + // TypeSingleBlock represents a single block which contains each encoded fetched + // series. Default block type for Prometheus queries. + TypeSingleBlock FetchedBlockType = iota + // TypeMultiBlock represents multiple blocks, each containing a time-based slice + // of encoded fetched series. Default block type for non-Prometheus queries. + // + // NB: Currently disabled. + TypeMultiBlock + // TypeDecodedBlock represents a single block which contains all fetched series + // which get decoded. + // + // NB: this is a legacy block type, will be deprecated once there is + // sufficient confidence that other block types are performing correctly. + TypeDecodedBlock +) + +// RequestParams represents the params from the request. +type RequestParams struct { + Start time.Time + End time.Time + // Now captures the current time and fixes it throughout the request, we + // may let people override it in the future. + Now time.Time + Timeout time.Duration + Step time.Duration + Query string + Debug bool + KeepNans bool + IncludeEnd bool + BlockType FetchedBlockType + FormatType FormatType + LookbackDuration time.Duration +} + +// ExclusiveEnd returns the end exclusive. +func (r RequestParams) ExclusiveEnd() time.Time { + if r.IncludeEnd { + return r.End.Add(r.Step) + } + + return r.End +} diff --git a/vendor/github.com/m3db/m3/src/query/models/query_context.go b/vendor/github.com/m3db/m3/src/query/models/query_context.go new file mode 100644 index 00000000..abb87f47 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/query_context.go @@ -0,0 +1,97 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +import ( + "context" + + "github.com/m3db/m3/src/metrics/policy" + "github.com/m3db/m3/src/query/cost" + + "github.com/uber-go/tally" +) + +// QueryContext provides all external state needed to execute and track a query. +// It acts as a hook back into the execution engine for things like +// cost accounting. +type QueryContext struct { + Ctx context.Context + Scope tally.Scope + Enforcer cost.ChainedEnforcer + Options QueryContextOptions +} + +// QueryContextOptions contains optional configuration for the query context. +type QueryContextOptions struct { + // LimitMaxTimeseries limits the number of time series returned by each + // storage node. + LimitMaxTimeseries int + // LimitMaxDocs limits the number of docs returned by each storage node. + LimitMaxDocs int + // RequireExhaustive results in an error if the query exceeds the series limit. + RequireExhaustive bool + RestrictFetchType *RestrictFetchTypeQueryContextOptions +} + +// RestrictFetchTypeQueryContextOptions allows for specifying the +// restrict options for a query. +type RestrictFetchTypeQueryContextOptions struct { + MetricsType uint + StoragePolicy policy.StoragePolicy +} + +// NewQueryContext constructs a QueryContext using the given Enforcer to +// enforce per query limits. +func NewQueryContext( + ctx context.Context, + scope tally.Scope, + enforcer cost.ChainedEnforcer, + options QueryContextOptions, +) *QueryContext { + return &QueryContext{ + Ctx: ctx, + Scope: scope, + Enforcer: enforcer, + Options: options, + } +} + +// NoopQueryContext returns a query context with no active components. +func NoopQueryContext() *QueryContext { + return NewQueryContext(context.Background(), tally.NoopScope, + cost.NoopChainedEnforcer(), QueryContextOptions{}) +} + +// WithContext creates a shallow copy of this QueryContext using the new context. +// Sample usage: +// +// ctx, cancel := context.WithTimeout(qc.Ctx, 5*time.Second) +// defer cancel() +// qc = qc.WithContext(ctx) +func (qc *QueryContext) WithContext(ctx context.Context) *QueryContext { + if qc == nil { + return nil + } + + clone := *qc + clone.Ctx = ctx + return &clone +} diff --git a/vendor/github.com/m3db/m3/src/query/models/strconv/checker.go b/vendor/github.com/m3db/m3/src/query/models/strconv/checker.go new file mode 100644 index 00000000..a013f4d0 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/strconv/checker.go @@ -0,0 +1,108 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package strconv + +// NB: for nicer table formatting. +const ( + // Indicates this rune does not need escaping. + ff = false + // Indicates this rune needs escaping. + tt = true +) + +// Determines valid characters that do not require escaping. +// +// NB: escape all control characters, `"`, and any character above `~`. This +// table loosely based on constants used in utf8.DecodeRune. +var escape = [256]bool{ + // 1 2 3 4 5 6 7 8 9 A B C D E F + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0x00-0x0F + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0x10-0x1F + ff, ff, tt, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0x20-0x2F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0x30-0x3F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0x40-0x4F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0x50-0x5F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0x60-0x6F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, tt, // 0x70-0x7F + // 1 2 3 4 5 6 7 8 9 A B C D E F + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0x80-0x8F + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0x90-0x9F + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0xA0-0xAF + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0xB0-0xBF + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0xC0-0xCF + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0xD0-0xDF + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0xE0-0xEF + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0xF0-0xFF +} + +// NeedToEscape returns true if the byte slice contains characters that will +// need to be escaped when quoting the slice. +func NeedToEscape(bb []byte) bool { + for _, b := range bb { + if escape[b] { + return true + } + } + + return false +} + +// Determines valid alphanumeric characters. +var alphaNumeric = [256]bool{ + // 1 2 3 4 5 6 7 8 9 A B C D E F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0x00-0x0F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0x10-0x1F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0x20-0x2F + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, ff, ff, ff, ff, ff, ff, // 0x30-0x3F + ff, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0x40-0x4F + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, ff, ff, ff, ff, ff, // 0x50-0x5F + ff, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, // 0x60-0x6F + tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, tt, ff, ff, ff, ff, ff, // 0x70-0x7F + // 1 2 3 4 5 6 7 8 9 A B C D E F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0x80-0x8F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0x90-0x9F + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0xA0-0xAF + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0xB0-0xBF + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0xC0-0xCF + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0xD0-0xDF + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0xE0-0xEF + ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, ff, // 0xF0-0xFF +} + +// IsAlphaNumeric returns true if the given string is alpha numeric. +// +// NB: here this means that it contains only characters in [0-9A-Za-z]) +func IsAlphaNumeric(str string) bool { + for _, c := range str { + if !alphaNumeric[c] { + return false + } + } + + return true +} + +// IsRuneAlphaNumeric returns true if the given rune is alpha numeric. +// +// NB: here this means that it contains only characters in [0-9A-Za-z]) +func IsRuneAlphaNumeric(r rune) bool { + return alphaNumeric[r] +} diff --git a/vendor/github.com/m3db/m3/src/query/models/strconv/quote.go b/vendor/github.com/m3db/m3/src/query/models/strconv/quote.go new file mode 100644 index 00000000..6974889c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/strconv/quote.go @@ -0,0 +1,304 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package strconv + +import ( + "strconv" + "unicode/utf8" +) + +// NB: predefined strconv constants +const ( + tx = 0x80 // 1000 0000 + t2 = 0xC0 // 1100 0000 + t3 = 0xE0 // 1110 0000 + t4 = 0xF0 // 1111 0000 + + maskx = 0x3F // 0011 1111 + + rune1Max = 1<<7 - 1 + rune2Max = 1<<11 - 1 + rune3Max = 1<<16 - 1 + + runeError = '\uFFFD' // the "error" Rune or "Unicode replacement character" + maxRune = '\U0010FFFF' // Maximum valid Unicode code point. + + // NB: Code points in the surrogate range are not valid for UTF-8. + surrogateMin = 0xD800 + surrogateMax = 0xDFFF + + lowerhex = "0123456789abcdef" + + quote = byte('"') +) + +// EncodeRune writes into src (which must be large enough) the UTF-8 encoding +// of the rune at the given index. It returns the number of bytes written. +// +// NB: based on utf8.encodeRune method, but instead uses indexed insertion +// into a predefined buffer. +func encodeRune(dst []byte, r rune, idx int) int { + // Negative values are erroneous. Making it unsigned addresses the problem. + switch i := uint32(r); { + case i <= rune1Max: + dst[idx] = byte(r) + return idx + 1 + case i <= rune2Max: + dst[idx] = t2 | byte(r>>6) + dst[idx+1] = tx | byte(r)&maskx + return idx + 2 + case i > maxRune, surrogateMin <= i && i <= surrogateMax: + r = runeError + fallthrough + case i <= rune3Max: + dst[idx] = t3 | byte(r>>12) + dst[idx+2] = tx | byte(r)&maskx + dst[idx+1] = tx | byte(r>>6)&maskx + return idx + 3 + default: + dst[idx] = t4 | byte(r>>18) + dst[idx+1] = tx | byte(r>>12)&maskx + dst[idx+2] = tx | byte(r>>6)&maskx + dst[idx+3] = tx | byte(r)&maskx + return idx + 4 + } +} + +// It returns the number of bytes written. +func insertEscapedRune(dst []byte, r rune, idx int) int { + if r == rune(quote) || r == '\\' { // always backslashed + dst[idx] = '\\' + dst[idx+1] = byte(r) + return idx + 2 + } + + if strconv.IsPrint(r) { + return encodeRune(dst, r, idx) + } + + switch r { + case '\a': + dst[idx] = '\\' + dst[idx+1] = 'a' + return idx + 2 + case '\b': + dst[idx] = '\\' + dst[idx+1] = 'b' + return idx + 2 + case '\f': + dst[idx] = '\\' + dst[idx+1] = 'f' + return idx + 2 + case '\n': + dst[idx] = '\\' + dst[idx+1] = 'n' + return idx + 2 + case '\r': + dst[idx] = '\\' + dst[idx+1] = 'r' + return idx + 2 + case '\t': + dst[idx] = '\\' + dst[idx+1] = 't' + return idx + 2 + case '\v': + dst[idx] = '\\' + dst[idx+1] = 'v' + return idx + 2 + default: + switch { + case r < ' ': + dst[idx] = '\\' + dst[idx+1] = 'x' + dst[idx+2] = lowerhex[byte(r)>>4] + dst[idx+3] = lowerhex[byte(r)&0xF] + return idx + 4 + case r > utf8.MaxRune: + r = 0xFFFD + fallthrough + case r < 0x10000: + dst[idx] = '\\' + dst[idx+1] = 'u' + dst[idx+2] = lowerhex[r>>uint(12)&0xF] + dst[idx+3] = lowerhex[r>>uint(8)&0xF] + dst[idx+4] = lowerhex[r>>uint(4)&0xF] + dst[idx+5] = lowerhex[r>>uint(0)&0xF] + return idx + 6 + default: + dst[idx] = '\\' + dst[idx+1] = 'U' + dst[idx+2] = lowerhex[r>>uint(28)&0xF] + dst[idx+3] = lowerhex[r>>uint(24)&0xF] + dst[idx+4] = lowerhex[r>>uint(20)&0xF] + dst[idx+5] = lowerhex[r>>uint(16)&0xF] + dst[idx+6] = lowerhex[r>>uint(12)&0xF] + dst[idx+7] = lowerhex[r>>uint(8)&0xF] + dst[idx+8] = lowerhex[r>>uint(4)&0xF] + dst[idx+9] = lowerhex[r>>uint(0)&0xF] + return idx + 10 + } + } +} + +// Escape copies byte slice src to dst at a given index, adding escaping any +// quote or control characters. It returns the index at which the copy finished. +// +// NB: ensure that dst is large enough to store src, additional +// quotation runes, and any additional escape characters. +// as generated by Quote, to dst and returns the extended buffer. +func Escape(dst, src []byte, idx int) int { + // nolint + for width := 0; len(src) > 0; src = src[width:] { + r := rune(src[0]) + width = 1 + if r >= utf8.RuneSelf { + r, width = utf8.DecodeRune(src) + } + + if width == 1 && r == utf8.RuneError { + dst[idx] = '\\' + dst[idx+1] = 'x' + dst[idx+2] = lowerhex[src[0]>>4] + dst[idx+3] = lowerhex[src[0]&0xF] + idx += 4 + continue + } + + idx = insertEscapedRune(dst, r, idx) + } + + return idx +} + +// Quote copies byte slice src to dst at a given index, adding +// quotation runes around the src slice and escaping any quote or control +// characters. It returns the index at which the copy finished. +// +// NB: ensure that dst is large enough to store src, additional +// quotation runes, and any additional escape characters. +// as generated by Quote, to dst and returns the extended buffer. +// +// NB: based on stconv.Quote method, but instead uses indexed insertion +// into a predefined buffer. +func Quote(dst, src []byte, idx int) int { + dst[idx] = quote + idx++ + idx = Escape(dst, src, idx) + dst[idx] = quote + return idx + 1 +} + +// QuoteSimple copies byte slice src to dst at a given index, adding +// quotation runes around the src slice, but does not escape any +// characters. It returns the index at which the copy finished. +// +// NB: ensure that dst is large enough to store src and two other characters. +func QuoteSimple(dst, src []byte, idx int) int { + dst[idx] = quote + idx++ + idx += copy(dst[idx:], src) + dst[idx] = quote + return idx + 1 +} + +// EscapedLength computes the length required for a byte slice to hold +// a quoted byte slice. +// +// NB: essentially a dry-run of `Escape` that does not write characters, but +// instead counts total character counts for the destination byte slice. +func EscapedLength(src []byte) int { + length := 0 + // nolint + for width := 0; len(src) > 0; src = src[width:] { + r := rune(src[0]) + width = 1 + if r >= utf8.RuneSelf { + r, width = utf8.DecodeRune(src) + } + + if width == 1 && r == utf8.RuneError { + length += 4 + continue + } + + length += escapedRuneLength(r) + } + + return length +} + +// QuotedLength computes the length required for a byte slice to hold +// a quoted byte slice. +// +// NB: essentially a dry-run of `Quote` that does not write characters, but +// instead counts total character counts for the destination byte slice. +func QuotedLength(src []byte) int { + return 2 + EscapedLength(src) // account for opening and closing quotes +} + +func escapedRuneLength(r rune) int { + if r == rune(quote) || r == '\\' { // always backslashed + return 2 + } + + if strconv.IsPrint(r) { + switch i := uint32(r); { + case i <= rune1Max: + return 1 + case i <= rune2Max: + return 2 + case i > maxRune, surrogateMin <= i && i <= surrogateMax: + fallthrough + case i <= rune3Max: + return 3 + default: + return 4 + } + } + + switch r { + case '\a': + return 2 + case '\b': + return 2 + case '\f': + return 2 + case '\n': + return 2 + case '\r': + return 2 + case '\t': + return 2 + case '\v': + return 2 + default: + switch { + case r < ' ': + return 4 + case r > utf8.MaxRune: + fallthrough + case r < 0x10000: + return 6 + default: + return 10 + } + } +} diff --git a/vendor/github.com/m3db/m3/src/query/models/tags.go b/vendor/github.com/m3db/m3/src/query/models/tags.go new file mode 100644 index 00000000..f768e892 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/tags.go @@ -0,0 +1,434 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +import ( + "bytes" + "errors" + "fmt" + "sort" + "strings" + + "github.com/m3db/m3/src/metrics/generated/proto/metricpb" + xerrors "github.com/m3db/m3/src/x/errors" + + "github.com/cespare/xxhash/v2" +) + +var ( + errNoTags = errors.New("no tags") +) + +// NewTags builds a tags with the given size and tag options. +func NewTags(size int, opts TagOptions) Tags { + if opts == nil { + opts = NewTagOptions() + } + + return Tags{ + // Todo: Pool these + Tags: make([]Tag, 0, size), + Opts: opts, + } +} + +// EmptyTags returns empty tags with a default tag options. +func EmptyTags() Tags { + return NewTags(0, nil) +} + +// LastComputedID returns the last computed ID; this should only be +// used when it is guaranteed that no tag transforms take place between calls. +func (t *Tags) LastComputedID() []byte { + if t.id == nil { + t.id = t.ID() + } + + return t.id +} + +// ID returns a byte slice representation of the tags, using the generation +// strategy from the tag options. +func (t Tags) ID() []byte { + return id(t) +} + +func (t Tags) tagSubset(keys [][]byte, include bool) Tags { + tags := NewTags(t.Len(), t.Opts) + for _, tag := range t.Tags { + found := false + for _, k := range keys { + if bytes.Equal(tag.Name, k) { + found = true + break + } + } + + if found == include { + tags = tags.AddTag(tag) + } + } + + return tags +} + +// TagsWithoutKeys returns only the tags which do not have the given keys. +func (t Tags) TagsWithoutKeys(excludeKeys [][]byte) Tags { + return t.tagSubset(excludeKeys, false) +} + +// TagsWithKeys returns only the tags which have the given keys. +func (t Tags) TagsWithKeys(includeKeys [][]byte) Tags { + return t.tagSubset(includeKeys, true) +} + +// WithoutName copies the tags excluding the name tag. +func (t Tags) WithoutName() Tags { + return t.TagsWithoutKeys([][]byte{t.Opts.MetricName()}) +} + +// Get returns the value for the tag with the given name. +func (t Tags) Get(key []byte) ([]byte, bool) { + for _, tag := range t.Tags { + if bytes.Equal(tag.Name, key) { + return tag.Value, true + } + } + + return nil, false +} + +// Clone returns a copy of the tags. +func (t Tags) Clone() Tags { + // TODO: Pool these + clonedTags := make([]Tag, t.Len()) + for i, tag := range t.Tags { + clonedTags[i] = tag.Clone() + } + + return Tags{ + Tags: clonedTags, + Opts: t.Opts, + } +} + +// AddTag is used to add a single tag and maintain sorted order. +func (t Tags) AddTag(tag Tag) Tags { + t.Tags = append(t.Tags, tag) + return t.Normalize() +} + +// AddTagWithoutNormalizing is used to add a single tag. +func (t Tags) AddTagWithoutNormalizing(tag Tag) Tags { + t.Tags = append(t.Tags, tag) + return t +} + +// SetName sets the metric name. +func (t Tags) SetName(value []byte) Tags { + return t.AddOrUpdateTag(Tag{Name: t.Opts.MetricName(), Value: value}) +} + +// Name gets the metric name. +func (t Tags) Name() ([]byte, bool) { + return t.Get(t.Opts.MetricName()) +} + +// SetBucket sets the bucket tag value. +func (t Tags) SetBucket(value []byte) Tags { + return t.AddOrUpdateTag(Tag{Name: t.Opts.BucketName(), Value: value}) +} + +// Bucket gets the bucket tag value. +func (t Tags) Bucket() ([]byte, bool) { + return t.Get(t.Opts.BucketName()) +} + +// AddTags is used to add a list of tags and maintain sorted order. +func (t Tags) AddTags(tags []Tag) Tags { + t.Tags = append(t.Tags, tags...) + return t.Normalize() +} + +// AddOrUpdateTag is used to add a single tag and maintain sorted order, +// or to replace the value of an existing tag. +func (t Tags) AddOrUpdateTag(tag Tag) Tags { + tags := t.Tags + for i, tt := range tags { + if bytes.Equal(tag.Name, tt.Name) { + tags[i].Value = tag.Value + return t + } + } + + return t.AddTag(tag) +} + +// AddTagsIfNotExists is used to add a list of tags with unique names +// and maintain sorted order. +func (t Tags) AddTagsIfNotExists(tags []Tag) Tags { + for _, tt := range tags { + t = t.addIfMissingTag(tt) + } + + return t.Normalize() +} + +// addIfMissingTag is used to add a single tag and maintain sorted order, +// or to replace the value of an existing tag. +func (t Tags) addIfMissingTag(tag Tag) Tags { + tags := t.Tags + for _, tt := range tags { + if bytes.Equal(tag.Name, tt.Name) { + return t + } + } + + return t.AddTag(tag) +} + +// Add is used to add two tag structures and maintain sorted order. +func (t Tags) Add(other Tags) Tags { + t.Tags = append(t.Tags, other.Tags...) + return t.Normalize() +} + +// Ensure Tags implements sort interface. +var _ sort.Interface = Tags{} + +func (t Tags) Len() int { return len(t.Tags) } +func (t Tags) Swap(i, j int) { t.Tags[i], t.Tags[j] = t.Tags[j], t.Tags[i] } +func (t Tags) Less(i, j int) bool { + return bytes.Compare(t.Tags[i].Name, t.Tags[j].Name) == -1 +} + +// Ensure sortableTagsNumericallyAsc implements sort interface. +var _ sort.Interface = sortableTagsNumericallyAsc{} + +type sortableTagsNumericallyAsc Tags + +func (t sortableTagsNumericallyAsc) Len() int { return len(t.Tags) } +func (t sortableTagsNumericallyAsc) Swap(i, j int) { + t.Tags[i], t.Tags[j] = t.Tags[j], t.Tags[i] +} +func (t sortableTagsNumericallyAsc) Less(i, j int) bool { + iName, jName := t.Tags[i].Name, t.Tags[j].Name + lenDiff := len(iName) - len(jName) + if lenDiff < 0 { + return true + } + + if lenDiff > 0 { + return false + } + + return bytes.Compare(iName, jName) == -1 +} + +// Normalize normalizes the tags by sorting them in place. +// In the future, it might also ensure other things like uniqueness. +func (t Tags) Normalize() Tags { + if t.Opts.IDSchemeType() == TypeGraphite { + // Graphite tags are sorted numerically rather than lexically. + sort.Sort(sortableTagsNumericallyAsc(t)) + } else { + sort.Sort(t) + } + + return t +} + +// Validate will validate there are tag values, and the +// tags are ordered and there are no duplicates. +func (t Tags) Validate() error { + // Wrap call to validate to make sure a validation error + // is always an invalid parameters error so we return bad request + // instead of internal server error at higher in the stack. + if err := t.validate(); err != nil { + return xerrors.NewInvalidParamsError(err) + } + return nil +} + +func (t Tags) validate() error { + n := t.Len() + if n == 0 { + return errNoTags + } + + if t.Opts.IDSchemeType() == TypeGraphite { + // Graphite tags are sorted numerically rather than lexically. + tags := sortableTagsNumericallyAsc(t) + for i, tag := range tags.Tags { + if len(tag.Name) == 0 { + return fmt.Errorf("tag name empty: index=%d", i) + } + if i == 0 { + continue // Don't check order/unique attributes. + } + + if !tags.Less(i-1, i) { + return fmt.Errorf("graphite tags out of order: '%s' appears after"+ + " '%s', tags: %v", tags.Tags[i-1].Name, tags.Tags[i].Name, tags.Tags) + } + + prev := tags.Tags[i-1] + if bytes.Compare(prev.Name, tag.Name) == 0 { + return fmt.Errorf("tags duplicate: '%s' appears more than once", + tags.Tags[i-1].Name) + } + } + } else { + var ( + allowTagNameDuplicates = t.Opts.AllowTagNameDuplicates() + allowTagValueEmpty = t.Opts.AllowTagValueEmpty() + ) + // Sorted alphanumerically otherwise, use bytes.Compare once for + // both order and unique test. + for i, tag := range t.Tags { + if len(tag.Name) == 0 { + return fmt.Errorf("tag name empty: index=%d", i) + } + if !allowTagValueEmpty && len(tag.Value) == 0 { + return fmt.Errorf("tag value empty: index=%d, name=%s", + i, t.Tags[i].Name) + } + if i == 0 { + continue // Don't check order/unique attributes. + } + + prev := t.Tags[i-1] + cmp := bytes.Compare(prev.Name, t.Tags[i].Name) + if cmp > 0 { + return fmt.Errorf("tags out of order: '%s' appears after '%s', tags: %v", + prev.Name, tag.Name, t.Tags) + } + if !allowTagNameDuplicates && cmp == 0 { + return fmt.Errorf("tags duplicate: '%s' appears more than once in '%s'", + prev.Name, t) + } + } + } + + return nil +} + +// Reset resets the tags for reuse. +func (t Tags) Reset() Tags { + t.Tags = t.Tags[:0] + return t +} + +// HashedID returns the hashed ID for the tags. +func (t Tags) HashedID() uint64 { + return xxhash.Sum64(t.ID()) +} + +// LastComputedHashedID returns the last computed hashed ID; this should only be +// used when it is guaranteed that no tag transforms take place between calls. +func (t *Tags) LastComputedHashedID() uint64 { + if t.hashedID == 0 { + t.hashedID = xxhash.Sum64(t.LastComputedID()) + } + + return t.hashedID +} + +// Equals returns a boolean reporting whether the compared tags have the same +// values. +// +// NB: does not check that compared tags have the same underlying bytes. +func (t Tags) Equals(other Tags) bool { + if t.Len() != other.Len() { + return false + } + + if !t.Opts.Equals(other.Opts) { + return false + } + + for i, t := range t.Tags { + if !t.Equals(other.Tags[i]) { + return false + } + } + + return true +} + +var tagSeperator = []byte(", ") + +// String returns the string representation of the tags. +func (t Tags) String() string { + var sb strings.Builder + for i, tt := range t.Tags { + if i != 0 { + sb.Write(tagSeperator) + } + sb.WriteString(tt.String()) + } + return sb.String() +} + +// TagsFromProto converts proto tags to models.Tags. +func TagsFromProto(pbTags []*metricpb.Tag) []Tag { + tags := make([]Tag, 0, len(pbTags)) + for _, tag := range pbTags { + tags = append(tags, Tag{ + Name: tag.Name, + Value: tag.Value, + }) + } + return tags +} + +// ToProto converts the models.Tags to proto tags. +func (t Tag) ToProto() *metricpb.Tag { + return &metricpb.Tag{ + Name: t.Name, + Value: t.Value, + } +} + +// String returns the string representation of the tag. +func (t Tag) String() string { + return fmt.Sprintf("%s: %s", t.Name, t.Value) +} + +// Equals returns a boolean indicating whether the provided tags are equal. +// +// NB: does not check that compared tags have the same underlying bytes. +func (t Tag) Equals(other Tag) bool { + return bytes.Equal(t.Name, other.Name) && bytes.Equal(t.Value, other.Value) +} + +// Clone returns a copy of the tag. +func (t Tag) Clone() Tag { + // Todo: Pool these + clonedName := make([]byte, len(t.Name)) + clonedVal := make([]byte, len(t.Value)) + copy(clonedName, t.Name) + copy(clonedVal, t.Value) + return Tag{ + Name: clonedName, + Value: clonedVal, + } +} diff --git a/vendor/github.com/m3db/m3/src/query/models/tags_id_schemes.go b/vendor/github.com/m3db/m3/src/query/models/tags_id_schemes.go new file mode 100644 index 00000000..33160247 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/tags_id_schemes.go @@ -0,0 +1,249 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +import ( + "github.com/m3db/m3/src/query/models/strconv" + "github.com/m3db/m3/src/query/util/writer" +) + +func id(t Tags) []byte { + schemeType := t.Opts.IDSchemeType() + if len(t.Tags) == 0 { + if schemeType == TypeQuoted { + return []byte("{}") + } + + return []byte("") + } + + switch schemeType { + case TypeLegacy: + return legacyID(t) + case TypeQuoted: + return quotedID(t) + case TypePrependMeta: + return prependMetaID(t) + case TypeGraphite: + return graphiteID(t) + default: + // Default to quoted meta + // NB: realistically, schema defaults should be set by here. + return quotedID(t) + } +} + +func legacyID(t Tags) []byte { + // TODO: pool these bytes. + id := make([]byte, idLen(t)) + idx := -1 + for _, tag := range t.Tags { + idx += copy(id[idx+1:], tag.Name) + 1 + id[idx] = eq + idx += copy(id[idx+1:], tag.Value) + 1 + id[idx] = sep + } + + return id +} + +func idLen(t Tags) int { + idLen := 2 * t.Len() // account for separators + for _, tag := range t.Tags { + idLen += len(tag.Name) + idLen += len(tag.Value) + } + + return idLen +} + +type tagEscaping struct { + escapeName bool + escapeValue bool +} + +func quotedID(t Tags) []byte { + var ( + idLen int + needEscaping []tagEscaping + l int + escape tagEscaping + ) + + for i, tt := range t.Tags { + l, escape = serializedLength(tt) + idLen += l + if escape.escapeName || escape.escapeValue { + if needEscaping == nil { + needEscaping = make([]tagEscaping, len(t.Tags)) + } + + needEscaping[i] = escape + } + } + + tagLength := 2 * len(t.Tags) + idLen += tagLength + 1 // account for separators and brackets + if needEscaping == nil { + return quoteIDSimple(t, idLen) + } + + // TODO: pool these bytes + lastIndex := len(t.Tags) - 1 + id := make([]byte, idLen) + id[0] = leftBracket + idx := 1 + for i, tt := range t.Tags[:lastIndex] { + idx = writeAtIndex(tt, id, needEscaping[i], idx) + id[idx] = sep + idx++ + } + + idx = writeAtIndex(t.Tags[lastIndex], id, needEscaping[lastIndex], idx) + id[idx] = rightBracket + return id +} + +// adds quotes to tag values when no characters need escaping. +func quoteIDSimple(t Tags, length int) []byte { + // TODO: pool these bytes. + id := make([]byte, length) + id[0] = leftBracket + idx := 1 + lastIndex := len(t.Tags) - 1 + for _, tag := range t.Tags[:lastIndex] { + idx += copy(id[idx:], tag.Name) + id[idx] = eq + idx++ + idx = strconv.QuoteSimple(id, tag.Value, idx) + id[idx] = sep + idx++ + } + + tag := t.Tags[lastIndex] + idx += copy(id[idx:], tag.Name) + id[idx] = eq + idx++ + idx = strconv.QuoteSimple(id, tag.Value, idx) + id[idx] = rightBracket + + return id +} + +func writeAtIndex(t Tag, id []byte, escape tagEscaping, idx int) int { + if escape.escapeName { + idx = strconv.Escape(id, t.Name, idx) + } else { + idx += copy(id[idx:], t.Name) + } + + id[idx] = eq + idx++ + + if escape.escapeValue { + idx = strconv.Quote(id, t.Value, idx) + } else { + idx = strconv.QuoteSimple(id, t.Value, idx) + } + + return idx +} + +func serializedLength(t Tag) (int, tagEscaping) { + var ( + idLen int + escaping tagEscaping + ) + if strconv.NeedToEscape(t.Name) { + idLen += strconv.EscapedLength(t.Name) + escaping.escapeName = true + } else { + idLen += len(t.Name) + } + + if strconv.NeedToEscape(t.Value) { + idLen += strconv.QuotedLength(t.Value) + escaping.escapeValue = true + } else { + idLen += len(t.Value) + 2 + } + + return idLen, escaping +} + +func writeTagLengthMeta(dst []byte, lengths []int) int { + idx := writer.WriteIntegers(dst, lengths, sep, 0) + dst[idx] = finish + return idx + 1 +} + +func prependMetaID(t Tags) []byte { + l, metaLengths := prependMetaLen(t) + // TODO: pool these bytes. + id := make([]byte, l) + idx := writeTagLengthMeta(id, metaLengths) + for _, tag := range t.Tags { + idx += copy(id[idx:], tag.Name) + idx += copy(id[idx:], tag.Value) + } + + return id +} + +func prependMetaLen(t Tags) (int, []int) { + idLen := 1 // account for separator + tagLengths := make([]int, len(t.Tags)*2) + for i, tag := range t.Tags { + tagLen := len(tag.Name) + tagLengths[2*i] = tagLen + idLen += tagLen + tagLen = len(tag.Value) + tagLengths[2*i+1] = tagLen + idLen += tagLen + } + + prefixLen := writer.IntsLength(tagLengths) + return idLen + prefixLen, tagLengths +} + +func idLenGraphite(t Tags) int { + idLen := t.Len() - 1 // account for separators + for _, tag := range t.Tags { + idLen += len(tag.Value) + } + + return idLen +} + +func graphiteID(t Tags) []byte { + // TODO: pool these bytes. + id := make([]byte, idLenGraphite(t)) + idx := 0 + lastIndex := len(t.Tags) - 1 + for _, tag := range t.Tags[:lastIndex] { + idx += copy(id[idx:], tag.Value) + id[idx] = graphiteSep + idx++ + } + + copy(id[idx:], t.Tags[lastIndex].Value) + return id +} diff --git a/vendor/github.com/m3db/m3/src/query/models/types.go b/vendor/github.com/m3db/m3/src/query/models/types.go new file mode 100644 index 00000000..ece31d6a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/types.go @@ -0,0 +1,189 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +import ( + "regexp" +) + +// Separators for tags. +const ( + graphiteSep = byte('.') + sep = byte(',') + finish = byte('!') + eq = byte('=') + leftBracket = byte('{') + rightBracket = byte('}') +) + +// IDSchemeType determines the scheme for generating +// series IDs based on their tags. +type IDSchemeType uint16 + +const ( + // TypeDefault is an invalid scheme that indicates that the default scheme + // for the tag options version option should be used. + TypeDefault IDSchemeType = iota + // TypeLegacy describes a scheme where IDs are generated by appending + // tag name/value pairs with = and , separators. Note that an additional , is + // added to the end of the ID. + // + // NB: this should not be used, and exists here as a deprecated legacy + // ID generation scheme, as it may cause collisions in situations where + // incoming tags contain the following characters: << =," >>, for example: + // {t1:v1},{t2:v2} -> t1=v1,t2=v2, + // {t1:v1,t2:v2} -> t1=v1,t2=v2, + TypeLegacy + // TypeQuoted describes a scheme where IDs are generated by appending + // tag names with explicitly quoted and escaped tag values. Tag names are + // also escaped if they contain invalid characters. This is equivalent to + // the Prometheus ID style. + // {t1:v1},{t2:v2} -> {t1="v1",t2="v2"} + // {t1:v1,t2:v2} -> {t1="v1,t2:v2"} + // {"t1":"v1"} -> {\"t1\""="\"v1\""} + TypeQuoted + // TypePrependMeta describes a scheme where IDs are generated by prepending + // the length of each tag at the start of the ID + // {t1:v1},{t2:v2} -> 2,2,2,2!t1v1t2v2 + // {t1:v1,t2:v2} -> 2,8!t1v1,t2:v2 + // {"t1":"v1"} -> 4,4!"t1""v1" + TypePrependMeta + // TypeGraphite describes a scheme where IDs are generated to match graphite + // representation of the tags. This scheme should only be used on the graphite + // ingestion path, as it ignores tag names and is very prone to collisions if + // used on non-graphite data. + // {__g0__:v1},{__g1__:v2} -> v1.v2 + // + // NB: when TypeGraphite is specified, tags are ordered numerically rather + // than lexically. + // + // NB 2: while the graphite scheme is valid, it is not available to choose as + // a general ID scheme; instead, it is set on any metric coming through the + // graphite ingestion path. + TypeGraphite +) + +// TagOptions describes additional options for tags. +type TagOptions interface { + // Validate validates these tag options. + Validate() error + + // SetMetricName sets the name for the `metric name` tag. + SetMetricName(value []byte) TagOptions + + // MetricName gets the name for the `metric name` tag. + MetricName() []byte + + // SetBucketName sets the name for the `bucket label` tag. + SetBucketName(value []byte) TagOptions + + // BucketName gets the name for the `bucket label` tag. + BucketName() []byte + + // SetIDSchemeType sets the ID generation scheme type. + SetIDSchemeType(value IDSchemeType) TagOptions + + // IDSchemeType gets the ID generation scheme type. + IDSchemeType() IDSchemeType + + // SetFilters sets tag filters. + SetFilters(value Filters) TagOptions + + // Filters gets the tag filters. + Filters() Filters + + // SetAllowTagNameDuplicates sets the value to allow duplicate tags to appear. + SetAllowTagNameDuplicates(value bool) TagOptions + + // AllowTagNameDuplicates returns the value to allow duplicate tags to appear. + AllowTagNameDuplicates() bool + + // SetAllowTagValueEmpty sets the value to allow empty tag values to appear. + SetAllowTagValueEmpty(value bool) TagOptions + + // AllowTagValueEmpty returns the value to allow empty tag values to appear. + AllowTagValueEmpty() bool + + // Equals determines if two tag options are equivalent. + Equals(other TagOptions) bool +} + +// Tags represents a set of tags with options. +type Tags struct { + Opts TagOptions + Tags []Tag + hashedID uint64 + id []byte +} + +// Tag is a key/value metric tag pair. +type Tag struct { + Name []byte + Value []byte +} + +// MatchType is an enum for label matching types. +type MatchType int + +// Possible MatchTypes. +const ( + MatchEqual MatchType = iota + MatchNotEqual + MatchRegexp + MatchNotRegexp + MatchField + MatchNotField + MatchAll +) + +// Matcher models the matching of a label. +// NB: when serialized to JSON, name and value will be in base64. +type Matcher struct { + Type MatchType `json:"type"` + Name []byte `json:"name"` + Value []byte `json:"value"` + + re *regexp.Regexp +} + +// Matchers is a list of individual matchers. +type Matchers []Matcher + +// Metric is the individual metric that gets returned from the search endpoint. +type Metric struct { + ID []byte + Tags Tags +} + +// Metrics is a list of individual metrics. +type Metrics []Metric + +// Filters is a set of tag filters. +type Filters []Filter + +// Filter is a regex tag filter. +type Filter struct { + // Name is the name of the series. + Name []byte + // Values are a set of filter values. If this is unset, all series containing + // the tag name are filtered. + Values [][]byte +} diff --git a/vendor/github.com/m3db/m3/src/query/models/unsafe.go b/vendor/github.com/m3db/m3/src/query/models/unsafe.go new file mode 100644 index 00000000..387f4399 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/models/unsafe.go @@ -0,0 +1,39 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package models + +// MustMakeTags creates tags given that the number of args is even. +func MustMakeTags(tag ...string) Tags { + if len(tag)%2 != 0 { + panic("must have even tag length") + } + + tagLength := len(tag) / 2 + t := NewTags(tagLength, NewTagOptions()) + for i := 0; i < tagLength; i++ { + t = t.AddTag(Tag{ + Name: []byte(tag[i*2]), + Value: []byte(tag[i*2+1]), + }) + } + + return t +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/complete_tags_result.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/complete_tags_result.go new file mode 100644 index 00000000..53f296c8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/complete_tags_result.go @@ -0,0 +1,140 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "sync" + + "github.com/m3db/m3/src/dbnode/client" + "github.com/m3db/m3/src/query/block" + "github.com/m3db/m3/src/query/models" + xerrors "github.com/m3db/m3/src/x/errors" +) + +const initSize = 10 + +type multiSearchResult struct { + sync.Mutex + meta block.ResultMetadata + err xerrors.MultiError + seenIters []client.TaggedIDsIterator // track known iterators to avoid leaking + dedupeMap map[string]MultiTagResult + filters models.Filters +} + +// NewMultiFetchTagsResult builds a new multi fetch tags result. +func NewMultiFetchTagsResult(opts models.TagOptions) MultiFetchTagsResult { + return &multiSearchResult{ + dedupeMap: make(map[string]MultiTagResult, initSize), + meta: block.NewResultMetadata(), + filters: opts.Filters(), + } +} + +func (r *multiSearchResult) Close() error { + r.Lock() + defer r.Unlock() + for _, iters := range r.seenIters { + iters.Finalize() + } + + r.seenIters = nil + r.dedupeMap = nil + r.err = xerrors.NewMultiError() + + return nil +} + +func (r *multiSearchResult) FinalResult() (TagResult, error) { + r.Lock() + defer r.Unlock() + + err := r.err.FinalError() + if err != nil { + return TagResult{Metadata: r.meta}, err + } + + result := make([]MultiTagResult, 0, len(r.dedupeMap)) + for _, it := range r.dedupeMap { + result = append(result, it) + } + + return TagResult{ + Tags: result, + Metadata: r.meta, + }, nil +} + +func (r *multiSearchResult) Add( + newIterator client.TaggedIDsIterator, + meta block.ResultMetadata, + err error, +) { + r.Lock() + defer r.Unlock() + + if err != nil { + r.err = r.err.Add(err) + return + } + + if r.seenIters == nil { + r.seenIters = make([]client.TaggedIDsIterator, 0, initSize) + r.meta = meta + } else { + r.meta = r.meta.CombineMetadata(meta) + } + + r.seenIters = append(r.seenIters, newIterator) + // Need to check the error to bail early after accumulating the iterators + // otherwise when we close the the multi fetch result + if !r.err.Empty() { + // don't need to do anything if the final result is going to be an error + return + } + + for newIterator.Next() { + _, ident, tagIter := newIterator.Current() + shouldFilter, err := filterTagIterator(tagIter, r.filters) + if err != nil { + r.err = r.err.Add(err) + return + } + + if shouldFilter { + // NB: skip here, the closer will free the tag iterator regardless. + continue + } + + id := ident.String() + _, exists := r.dedupeMap[id] + if !exists { + r.dedupeMap[id] = MultiTagResult{ + ID: ident, + Iter: tagIter.Duplicate(), + } + } + } + + if err := newIterator.Err(); err != nil { + r.err = r.err.Add(err) + } +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/completed_tags.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/completed_tags.go new file mode 100644 index 00000000..99bf11fa --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/completed_tags.go @@ -0,0 +1,166 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "bytes" + "errors" + "sort" + "sync" + + "github.com/m3db/m3/src/query/block" + "github.com/m3db/m3/src/query/models" +) + +type completeTagsResultBuilder struct { + sync.RWMutex + nameOnly bool + metadata block.ResultMetadata + tagBuilders map[string]completedTagBuilder + + filters models.Filters +} + +// NewCompleteTagsResultBuilder creates a new complete tags result builder. +func NewCompleteTagsResultBuilder( + nameOnly bool, + opts models.TagOptions, +) CompleteTagsResultBuilder { + return &completeTagsResultBuilder{ + nameOnly: nameOnly, + metadata: block.NewResultMetadata(), + filters: opts.Filters(), + } +} + +func (b *completeTagsResultBuilder) Add(tagResult *CompleteTagsResult) error { + b.Lock() + defer b.Unlock() + + nameOnly := b.nameOnly + if nameOnly != tagResult.CompleteNameOnly { + return errors.New("incoming tag result has mismatched type") + } + + completedTags := tagResult.CompletedTags + if b.tagBuilders == nil { + b.tagBuilders = make(map[string]completedTagBuilder, len(completedTags)) + } + + b.metadata = b.metadata.CombineMetadata(tagResult.Metadata) + if nameOnly { + completedTags = filterNames(completedTags, b.filters) + for _, tag := range completedTags { + b.tagBuilders[string(tag.Name)] = completedTagBuilder{} + } + + return nil + } + + completedTags = filterTags(completedTags, b.filters) + for _, tag := range completedTags { + if builder, exists := b.tagBuilders[string(tag.Name)]; exists { + builder.add(tag.Values) + } else { + builder := completedTagBuilder{} + builder.add(tag.Values) + b.tagBuilders[string(tag.Name)] = builder + } + } + + return nil +} + +type completedTagsByName []CompletedTag + +func (s completedTagsByName) Len() int { return len(s) } +func (s completedTagsByName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s completedTagsByName) Less(i, j int) bool { + return bytes.Compare(s[i].Name, s[j].Name) == -1 +} + +func (b *completeTagsResultBuilder) Build() CompleteTagsResult { + b.RLock() + defer b.RUnlock() + + result := make([]CompletedTag, 0, len(b.tagBuilders)) + if b.nameOnly { + for name := range b.tagBuilders { + result = append(result, CompletedTag{ + Name: []byte(name), + Values: [][]byte{}, + }) + } + + sort.Sort(completedTagsByName(result)) + return CompleteTagsResult{ + CompleteNameOnly: true, + CompletedTags: result, + Metadata: b.metadata, + } + } + + for name, builder := range b.tagBuilders { + result = append(result, CompletedTag{ + Name: []byte(name), + Values: builder.build(), + }) + } + + sort.Sort(completedTagsByName(result)) + return CompleteTagsResult{ + CompleteNameOnly: false, + CompletedTags: result, + Metadata: b.metadata, + } +} + +type completedTagBuilder struct { + seenMap map[string]struct{} +} + +func (b *completedTagBuilder) add(values [][]byte) { + if b.seenMap == nil { + b.seenMap = make(map[string]struct{}, len(values)) + } + + for _, val := range values { + b.seenMap[string(val)] = struct{}{} + } +} + +type tagValuesByName [][]byte + +func (s tagValuesByName) Len() int { return len(s) } +func (s tagValuesByName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s tagValuesByName) Less(i, j int) bool { + return bytes.Compare(s[i], s[j]) == -1 +} + +func (b *completedTagBuilder) build() [][]byte { + result := make([][]byte, 0, len(b.seenMap)) + for v := range b.seenMap { + result = append(result, []byte(v)) + } + + sort.Sort(tagValuesByName(result)) + return result +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/convert.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/convert.go new file mode 100644 index 00000000..03eb3951 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/convert.go @@ -0,0 +1,47 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "github.com/m3db/m3/src/query/models" + "github.com/m3db/m3/src/x/ident" +) + +// FromIdentTagIteratorToTags converts ident tags to coordinator tags. +func FromIdentTagIteratorToTags( + identTags ident.TagIterator, + tagOptions models.TagOptions, +) (models.Tags, error) { + tags := models.NewTags(identTags.Remaining(), tagOptions) + for identTags.Next() { + identTag := identTags.Current() + tags = tags.AddTag(models.Tag{ + Name: identTag.Name.Bytes(), + Value: identTag.Value.Bytes(), + }) + } + + if err := identTags.Err(); err != nil { + return models.EmptyTags(), err + } + + return tags, nil +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/fetch_result_map_gen.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/fetch_result_map_gen.go new file mode 100644 index 00000000..3ded87a4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/fetch_result_map_gen.go @@ -0,0 +1,275 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package consolidators + +import ( + "github.com/m3db/m3/src/query/models" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// fetchResultMapHash is the hash for a given map entry, this is public to support +// iterating over the map using a native Go for loop. +type fetchResultMapHash uint64 + +// fetchResultMapHashFn is the hash function to execute when hashing a key. +type fetchResultMapHashFn func(models.Tags) fetchResultMapHash + +// fetchResultMapEqualsFn is the equals key function to execute when detecting equality of a key. +type fetchResultMapEqualsFn func(models.Tags, models.Tags) bool + +// fetchResultMapCopyFn is the copy key function to execute when copying the key. +type fetchResultMapCopyFn func(models.Tags) models.Tags + +// fetchResultMapFinalizeFn is the finalize key function to execute when finished with a key. +type fetchResultMapFinalizeFn func(models.Tags) + +// fetchResultMap uses the genny package to provide a generic hash map that can be specialized +// by running the following command from this root of the repository: +// ``` +// make hashmap-gen pkg=outpkg key_type=Type value_type=Type out_dir=/tmp +// ``` +// Or if you would like to use bytes or ident.ID as keys you can use the +// partially specialized maps to generate your own maps as well: +// ``` +// make byteshashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// make idhashmap-gen pkg=outpkg value_type=Type out_dir=/tmp +// ``` +// This will output to stdout the generated source file to use for your map. +// It uses linear probing by incrementing the number of the hash created when +// hashing the identifier if there is a collision. +// fetchResultMap is a value type and not an interface to allow for less painful +// upgrades when adding/removing methods, it is not likely to need mocking so +// an interface would not be super useful either. +type fetchResultMap struct { + _fetchResultMapOptions + + // lookup uses hash of the identifier for the key and the MapEntry value + // wraps the value type and the key (used to ensure lookup is correct + // when dealing with collisions), we use uint64 for the hash partially + // because lookups of maps with uint64 keys has a fast path for Go. + lookup map[fetchResultMapHash]fetchResultMapEntry +} + +// _fetchResultMapOptions is a set of options used when creating an identifier map, it is kept +// private so that implementers of the generated map can specify their own options +// that partially fulfill these options. +type _fetchResultMapOptions struct { + // hash is the hash function to execute when hashing a key. + hash fetchResultMapHashFn + // equals is the equals key function to execute when detecting equality. + equals fetchResultMapEqualsFn + // copy is the copy key function to execute when copying the key. + copy fetchResultMapCopyFn + // finalize is the finalize key function to execute when finished with a + // key, this is optional to specify. + finalize fetchResultMapFinalizeFn + // initialSize is the initial size for the map, use zero to use Go's std map + // initial size and consequently is optional to specify. + initialSize int +} + +// fetchResultMapEntry is an entry in the map, this is public to support iterating +// over the map using a native Go for loop. +type fetchResultMapEntry struct { + // key is used to check equality on lookups to resolve collisions + key _fetchResultMapKey + // value type stored + value multiResultSeries +} + +type _fetchResultMapKey struct { + key models.Tags + finalize bool +} + +// Key returns the map entry key. +func (e fetchResultMapEntry) Key() models.Tags { + return e.key.key +} + +// Value returns the map entry value. +func (e fetchResultMapEntry) Value() multiResultSeries { + return e.value +} + +// _fetchResultMapAlloc is a non-exported function so that when generating the source code +// for the map you can supply a public constructor that sets the correct +// hash, equals, copy, finalize options without users of the map needing to +// implement them themselves. +func _fetchResultMapAlloc(opts _fetchResultMapOptions) *fetchResultMap { + m := &fetchResultMap{_fetchResultMapOptions: opts} + m.Reallocate() + return m +} + +func (m *fetchResultMap) newMapKey(k models.Tags, opts _fetchResultMapKeyOptions) _fetchResultMapKey { + key := _fetchResultMapKey{key: k, finalize: opts.finalizeKey} + if !opts.copyKey { + return key + } + + key.key = m.copy(k) + return key +} + +func (m *fetchResultMap) removeMapKey(hash fetchResultMapHash, key _fetchResultMapKey) { + delete(m.lookup, hash) + if key.finalize { + m.finalize(key.key) + } +} + +// Get returns a value in the map for an identifier if found. +func (m *fetchResultMap) Get(k models.Tags) (multiResultSeries, bool) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + return entry.value, true + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + var empty multiResultSeries + return empty, false +} + +// Set will set the value for an identifier. +func (m *fetchResultMap) Set(k models.Tags, v multiResultSeries) { + m.set(k, v, _fetchResultMapKeyOptions{ + copyKey: true, + finalizeKey: m.finalize != nil, + }) +} + +// fetchResultMapSetUnsafeOptions is a set of options to use when setting a value with +// the SetUnsafe method. +type fetchResultMapSetUnsafeOptions struct { + NoCopyKey bool + NoFinalizeKey bool +} + +// SetUnsafe will set the value for an identifier with unsafe options for how +// the map treats the key. +func (m *fetchResultMap) SetUnsafe(k models.Tags, v multiResultSeries, opts fetchResultMapSetUnsafeOptions) { + m.set(k, v, _fetchResultMapKeyOptions{ + copyKey: !opts.NoCopyKey, + finalizeKey: !opts.NoFinalizeKey, + }) +} + +type _fetchResultMapKeyOptions struct { + copyKey bool + finalizeKey bool +} + +func (m *fetchResultMap) set(k models.Tags, v multiResultSeries, opts _fetchResultMapKeyOptions) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.lookup[hash] = fetchResultMapEntry{ + key: entry.key, + value: v, + } + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } + + m.lookup[hash] = fetchResultMapEntry{ + key: m.newMapKey(k, opts), + value: v, + } +} + +// Iter provides the underlying map to allow for using a native Go for loop +// to iterate the map, however callers should only ever read and not write +// the map. +func (m *fetchResultMap) Iter() map[fetchResultMapHash]fetchResultMapEntry { + return m.lookup +} + +// Len returns the number of map entries in the map. +func (m *fetchResultMap) Len() int { + return len(m.lookup) +} + +// Contains returns true if value exists for key, false otherwise, it is +// shorthand for a call to Get that doesn't return the value. +func (m *fetchResultMap) Contains(k models.Tags) bool { + _, ok := m.Get(k) + return ok +} + +// Delete will remove a value set in the map for the specified key. +func (m *fetchResultMap) Delete(k models.Tags) { + hash := m.hash(k) + for entry, ok := m.lookup[hash]; ok; entry, ok = m.lookup[hash] { + if m.equals(entry.key.key, k) { + m.removeMapKey(hash, entry.key) + return + } + // Linear probe to "next" to this entry (really a rehash) + hash++ + } +} + +// Reset will reset the map by simply deleting all keys to avoid +// allocating a new map. +func (m *fetchResultMap) Reset() { + for hash, entry := range m.lookup { + m.removeMapKey(hash, entry.key) + } +} + +// Reallocate will avoid deleting all keys and reallocate a new +// map, this is useful if you believe you have a large map and +// will not need to grow back to a similar size. +func (m *fetchResultMap) Reallocate() { + if m.initialSize > 0 { + m.lookup = make(map[fetchResultMapHash]fetchResultMapEntry, m.initialSize) + } else { + m.lookup = make(map[fetchResultMapHash]fetchResultMapEntry) + } +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/fetch_result_map_wrapper.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/fetch_result_map_wrapper.go new file mode 100644 index 00000000..40f910c3 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/fetch_result_map_wrapper.go @@ -0,0 +1,90 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "bytes" + "sort" + + "github.com/m3db/m3/src/query/models" +) + +type ascByID []multiResultSeries + +func (m ascByID) Len() int { return len(m) } +func (m ascByID) Less(i, j int) bool { + return bytes.Compare(m[i].tags.LastComputedID(), + m[j].tags.LastComputedID()) == -1 +} +func (m ascByID) Swap(i, j int) { m[i], m[j] = m[j], m[i] } + +type fetchResultMapWrapper struct { + resultMap *fetchResultMap +} + +func (w *fetchResultMapWrapper) len() int { + return w.resultMap.Len() +} + +func (w *fetchResultMapWrapper) list() []multiResultSeries { + result := make([]multiResultSeries, 0, w.len()) + for _, results := range w.resultMap.Iter() { + result = append(result, results.value) + } + + sort.Sort(ascByID(result)) + return result +} + +func (w *fetchResultMapWrapper) get(tags models.Tags) (multiResultSeries, bool) { + return w.resultMap.Get(tags) +} + +func (w *fetchResultMapWrapper) close() { + w.resultMap.Reset() +} + +func (w *fetchResultMapWrapper) set( + tags models.Tags, series multiResultSeries, +) { + series.tags = tags + w.resultMap.SetUnsafe(tags, series, fetchResultMapSetUnsafeOptions{ + NoCopyKey: true, + NoFinalizeKey: true, + }) +} + +// newFetchResultMapWrapper builds a wrapper on fetchResultMap functions. +func newFetchResultMapWrapper(size int) *fetchResultMapWrapper { + return &fetchResultMapWrapper{ + resultMap: _fetchResultMapAlloc(_fetchResultMapOptions{ + hash: func(t models.Tags) fetchResultMapHash { + return fetchResultMapHash(t.LastComputedHashedID()) + }, + equals: func(x, y models.Tags) bool { + // NB: IDs are calculated once for tags, so any further calls to these + // equals is a simple lookup. + return bytes.Equal(x.LastComputedID(), y.LastComputedID()) + }, + initialSize: size, + }), + } +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/filter.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/filter.go new file mode 100644 index 00000000..39f94c75 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/filter.go @@ -0,0 +1,149 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "bytes" + + "github.com/m3db/m3/src/query/models" + "github.com/m3db/m3/src/x/ident" +) + +func filterTagIterator( + iter ident.TagIterator, + filters models.Filters, +) (bool, error) { + shouldFilter := shouldFilterTagIterator(iter, filters) + return shouldFilter, iter.Err() +} + +func shouldFilterTagIterator( + iter ident.TagIterator, + filters models.Filters, +) bool { + if len(filters) == 0 || iter.Remaining() == 0 { + return false + } + + // NB: rewind iterator for re-use. + defer iter.Rewind() + for iter.Next() { + tag := iter.Current() + + name := tag.Name.Bytes() + value := tag.Value.Bytes() + for _, f := range filters { + if !bytes.Equal(name, f.Name) { + continue + } + + // 0 length filters implies filtering for entire range. + if len(f.Values) == 0 { + return true + } + + for _, filterValue := range f.Values { + if bytes.Equal(filterValue, value) { + return true + } + } + } + } + + return false +} + +func filterNames(tags []CompletedTag, filters models.Filters) []CompletedTag { + if len(filters) == 0 || len(tags) == 0 { + return tags + } + + filteredTags := tags[:0] + for _, tag := range tags { + skip := false + for _, f := range filters { + if len(f.Values) != 0 { + // If this has filter values, it is not a name filter, and the result + // is valid. + continue + } + + if bytes.Equal(tag.Name, f.Name) { + skip = true + break + } + } + + if !skip { + filteredTags = append(filteredTags, tag) + } + } + + return filteredTags +} + +func filterTags(tags []CompletedTag, filters models.Filters) []CompletedTag { + if len(filters) == 0 || len(tags) == 0 { + return tags + } + + filteredTags := tags[:0] + for _, tag := range tags { + for _, f := range filters { + if !bytes.Equal(tag.Name, f.Name) { + continue + } + + // NB: Name filter matches. + if len(f.Values) == 0 { + tag.Values = tag.Values[:0] + break + } + + filteredValues := tag.Values[:0] + for _, value := range tag.Values { + skip := false + for _, filterValue := range f.Values { + if bytes.Equal(filterValue, value) { + skip = true + break + } + } + + if !skip { + filteredValues = append(filteredValues, value) + } + } + + tag.Values = filteredValues + break + } + + if len(tag.Values) == 0 { + // NB: all values for this tag are invalid. + continue + } + + filteredTags = append(filteredTags, tag) + } + + return filteredTags +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/id_dedupe_map.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/id_dedupe_map.go new file mode 100644 index 00000000..ba317172 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/id_dedupe_map.go @@ -0,0 +1,107 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "fmt" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/query/models" + "github.com/m3db/m3/src/query/storage/m3/storagemetadata" +) + +type idDedupeMap struct { + fanout QueryFanoutType + series map[string]multiResultSeries + tagOpts models.TagOptions +} + +func newIDDedupeMap(opts tagMapOpts) fetchDedupeMap { + return &idDedupeMap{ + fanout: opts.fanout, + series: make(map[string]multiResultSeries, opts.size), + tagOpts: opts.tagOpts, + } +} + +func (m *idDedupeMap) close() {} + +func (m *idDedupeMap) list() []multiResultSeries { + result := make([]multiResultSeries, 0, len(m.series)) + for _, s := range m.series { + result = append(result, s) + } + return result +} + +func (m *idDedupeMap) add( + iter encoding.SeriesIterator, + attrs storagemetadata.Attributes, +) error { + id := iter.ID().String() + + tags, err := FromIdentTagIteratorToTags(iter.Tags(), m.tagOpts) + if err != nil { + return err + } + + iter.Tags().Rewind() + existing, exists := m.series[id] + if !exists { + // Does not exist, new addition + m.series[id] = multiResultSeries{ + attrs: attrs, + iter: iter, + tags: tags, + } + return nil + } + + var existsBetter bool + switch m.fanout { + case NamespaceCoversAllQueryRange: + // Already exists and resolution of result we are adding is not as precise + existsBetter = existing.attrs.Resolution <= attrs.Resolution + case NamespaceCoversPartialQueryRange: + // Already exists and either has longer retention, or the same retention + // and result we are adding is not as precise + existsLongerRetention := existing.attrs.Retention > attrs.Retention + existsSameRetentionEqualOrBetterResolution := + existing.attrs.Retention == attrs.Retention && + existing.attrs.Resolution <= attrs.Resolution + existsBetter = existsLongerRetention || existsSameRetentionEqualOrBetterResolution + default: + return fmt.Errorf("unknown query fanout type: %d", m.fanout) + } + if existsBetter { + // Existing result is already better + return nil + } + + // Override + m.series[id] = multiResultSeries{ + attrs: attrs, + iter: iter, + tags: tags, + } + + return nil +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/match_type.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/match_type.go new file mode 100644 index 00000000..8574be9e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/match_type.go @@ -0,0 +1,71 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "fmt" + "strings" +) + +const ( + defaultMatchType MatchType = MatchIDs +) + +func (t MatchType) String() string { + switch t { + case MatchIDs: + return "ids" + case MatchTags: + return "tags" + } + return "unknown" +} + +var validMatchTypes = []MatchType{ + MatchIDs, + MatchTags, +} + +// UnmarshalYAML unmarshals an ExtendedMetricsType into a valid type from string. +func (t *MatchType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + + if str == "" { + *t = defaultMatchType + return nil + } + + strs := make([]string, 0, len(validMatchTypes)) + for _, valid := range validMatchTypes { + if str == valid.String() { + *t = valid + return nil + } + + strs = append(strs, "'"+valid.String()+"'") + } + + return fmt.Errorf("invalid MatchType '%s' valid types are: %s", + str, strings.Join(strs, ", ")) +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/multi_fetch_result.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/multi_fetch_result.go new file mode 100644 index 00000000..4c5741a2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/multi_fetch_result.go @@ -0,0 +1,255 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "sync" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/query/block" + "github.com/m3db/m3/src/query/models" + "github.com/m3db/m3/src/query/storage/m3/storagemetadata" + xerrors "github.com/m3db/m3/src/x/errors" +) + +type fetchDedupeMap interface { + add(iter encoding.SeriesIterator, attrs storagemetadata.Attributes) error + list() []multiResultSeries + close() +} + +type multiResult struct { + sync.Mutex + metadata block.ResultMetadata + fanout QueryFanoutType + seenFirstAttrs storagemetadata.Attributes + seenIters []encoding.SeriesIterators // track known iterators to avoid leaking + mergedIterators encoding.MutableSeriesIterators + mergedTags []*models.Tags + dedupeMap fetchDedupeMap + err xerrors.MultiError + matchOpts MatchOptions + tagOpts models.TagOptions + + pools encoding.IteratorPools +} + +// NewMultiFetchResult builds a new multi fetch result. +func NewMultiFetchResult( + fanout QueryFanoutType, + pools encoding.IteratorPools, + opts MatchOptions, + tagOpts models.TagOptions, +) MultiFetchResult { + return &multiResult{ + metadata: block.NewResultMetadata(), + fanout: fanout, + pools: pools, + matchOpts: opts, + tagOpts: tagOpts, + } +} + +type multiResultSeries struct { + attrs storagemetadata.Attributes + iter encoding.SeriesIterator + tags models.Tags +} + +func (r *multiResult) Close() error { + r.Lock() + defer r.Unlock() + + for _, iters := range r.seenIters { + if iters != nil { + iters.Close() + } + } + + r.seenIters = nil + if r.mergedIterators != nil { + // NB(r): Since all the series iterators in the final result are held onto + // by the original iters in the seenIters slice we allow those iterators + // to free iterators held onto by final result, and reset the slice for + // the final result to zero so we avoid double returning the iterators + // themselves. + r.mergedIterators.Reset(0) + r.mergedIterators.Close() + r.mergedIterators = nil + } + + r.dedupeMap = nil + r.err = xerrors.NewMultiError() + + return nil +} + +func (r *multiResult) FinalResultWithAttrs() ( + SeriesFetchResult, []storagemetadata.Attributes, error, +) { + result, err := r.FinalResult() + if err != nil { + return result, nil, err + } + + var attrs []storagemetadata.Attributes + seriesData := result.seriesData + if iters := seriesData.seriesIterators; iters != nil { + l := iters.Len() + attrs = make([]storagemetadata.Attributes, 0, l) + if r.dedupeMap == nil { + for i := 0; i < l; i++ { + attrs = append(attrs, r.seenFirstAttrs) + } + } else { + for _, res := range r.dedupeMap.list() { + attrs = append(attrs, res.attrs) + } + } + } + + return result, attrs, nil +} + +func (r *multiResult) FinalResult() (SeriesFetchResult, error) { + r.Lock() + defer r.Unlock() + + err := r.err.LastError() + if err != nil { + return NewEmptyFetchResult(r.metadata), err + } + + if r.mergedIterators != nil { + return NewSeriesFetchResult(r.mergedIterators, nil, r.metadata) + } + + if len(r.seenIters) == 0 { + return NewSeriesFetchResult(encoding.EmptySeriesIterators, nil, r.metadata) + } + + // otherwise have to create a new seriesiters + dedupedList := r.dedupeMap.list() + numSeries := len(dedupedList) + r.mergedIterators = r.pools.MutableSeriesIterators().Get(numSeries) + r.mergedIterators.Reset(numSeries) + if r.mergedTags == nil { + r.mergedTags = make([]*models.Tags, numSeries) + } + + lenCurr, lenNext := len(r.mergedTags), len(dedupedList) + if lenCurr < lenNext { + // If incoming list is longer, expand the stored list. + r.mergedTags = append(r.mergedTags, make([]*models.Tags, lenNext-lenCurr)...) + } else if lenCurr > lenNext { + // If incoming list somehow shorter, shrink stored list. + r.mergedTags = r.mergedTags[:lenNext] + } + + for i, res := range dedupedList { + r.mergedIterators.SetAt(i, res.iter) + r.mergedTags[i] = &dedupedList[i].tags + } + + return NewSeriesFetchResult(r.mergedIterators, r.mergedTags, r.metadata) +} + +func (r *multiResult) Add( + newIterators encoding.SeriesIterators, + metadata block.ResultMetadata, + attrs storagemetadata.Attributes, + err error, +) { + r.Lock() + defer r.Unlock() + + if err != nil { + r.err = r.err.Add(err) + return + } + + if newIterators == nil || newIterators.Len() == 0 { + return + } + + if len(r.seenIters) == 0 { + // store the first attributes seen + r.seenFirstAttrs = attrs + r.metadata = metadata + } else { + // NB: any non-exhaustive result set added makes the entire + // result non-exhaustive + r.metadata = r.metadata.CombineMetadata(metadata) + } + + r.seenIters = append(r.seenIters, newIterators) + // Need to check the error to bail early after accumulating the iterators + // otherwise when we close the the multi fetch result + if !r.err.Empty() { + // don't need to do anything if the final result is going to be an error + return + } + + if len(r.seenIters) == 1 { + // need to backfill the dedupe map from the first result first + first := r.seenIters[0] + opts := tagMapOpts{ + fanout: r.fanout, + size: first.Len(), + tagOpts: r.tagOpts, + } + + if r.matchOpts.MatchType == MatchIDs { + r.dedupeMap = newIDDedupeMap(opts) + } else { + r.dedupeMap = newTagDedupeMap(opts) + } + + r.addOrUpdateDedupeMap(r.seenFirstAttrs, first) + return + } + + // Now de-duplicate + r.addOrUpdateDedupeMap(attrs, newIterators) +} + +func (r *multiResult) addOrUpdateDedupeMap( + attrs storagemetadata.Attributes, + newIterators encoding.SeriesIterators, +) { + for _, iter := range newIterators.Iters() { + tagIter := iter.Tags() + shouldFilter, err := filterTagIterator(tagIter, r.tagOpts.Filters()) + if err != nil { + r.err = r.err.Add(err) + return + } + + if shouldFilter { + // NB: skip here, the closer will free the series iterator regardless. + continue + } + + if err := r.dedupeMap.add(iter, attrs); err != nil { + r.err = r.err.Add(err) + } + } +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/series_fetch_result.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/series_fetch_result.go new file mode 100644 index 00000000..1af58dfd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/series_fetch_result.go @@ -0,0 +1,141 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "fmt" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/query/block" + "github.com/m3db/m3/src/query/models" +) + +// NewSeriesFetchResult creates a new series fetch result using the given +// iterators. +func NewSeriesFetchResult( + iters encoding.SeriesIterators, + tags []*models.Tags, + meta block.ResultMetadata, +) (SeriesFetchResult, error) { + if iters == nil || iters.Len() == 0 { + return SeriesFetchResult{ + Metadata: meta, + seriesData: seriesData{ + seriesIterators: nil, + tags: []*models.Tags{}, + }, + }, nil + } + + if tags == nil { + tags = make([]*models.Tags, iters.Len()) + } + + return SeriesFetchResult{ + Metadata: meta, + seriesData: seriesData{ + seriesIterators: iters, + tags: tags, + }, + }, nil +} + +// NewEmptyFetchResult creates a new empty series fetch result. +func NewEmptyFetchResult( + meta block.ResultMetadata, +) SeriesFetchResult { + return SeriesFetchResult{ + Metadata: meta, + seriesData: seriesData{ + seriesIterators: nil, + tags: []*models.Tags{}, + }, + } +} + +// Verify verifies the fetch result is valid. +func (r *SeriesFetchResult) Verify() error { + if r.seriesData.tags == nil || r.seriesData.seriesIterators == nil { + return nil + } + + tagLen := len(r.seriesData.tags) + iterLen := r.seriesData.seriesIterators.Len() + if tagLen != iterLen { + return fmt.Errorf("tag length %d does not match iterator length %d", + tagLen, iterLen) + } + + return nil +} + +// Count returns the total number of contained series iterators. +func (r *SeriesFetchResult) Count() int { + if r.seriesData.seriesIterators == nil { + return 0 + } + + return r.seriesData.seriesIterators.Len() +} + +// Close no-ops; these should be closed by the enclosing iterator. +func (r *SeriesFetchResult) Close() { + +} + +// IterTagsAtIndex returns the tag iterator and tags at the given index. +func (r *SeriesFetchResult) IterTagsAtIndex( + idx int, tagOpts models.TagOptions, +) (encoding.SeriesIterator, models.Tags, error) { + tags := models.EmptyTags() + if idx < 0 || idx > len(r.seriesData.tags) { + return nil, tags, fmt.Errorf("series idx(%d) out of "+ + "bounds %d ", idx, len(r.seriesData.tags)) + } + + iters := r.seriesData.seriesIterators.Iters() + if idx < len(r.seriesData.tags) { + if r.seriesData.tags[idx] == nil { + var err error + iter := iters[idx].Tags() + tags, err = FromIdentTagIteratorToTags(iter, tagOpts) + if err != nil { + return nil, models.EmptyTags(), err + } + + iter.Rewind() + r.seriesData.tags[idx] = &tags + } else { + tags = *r.seriesData.tags[idx] + } + } + + return iters[idx], tags, nil +} + +// SeriesIterators returns the series iterators. +func (r *SeriesFetchResult) SeriesIterators() []encoding.SeriesIterator { + if r.seriesData.seriesIterators == nil { + return []encoding.SeriesIterator{} + } + + return r.seriesData.seriesIterators.Iters() +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/tag_dedupe_map.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/tag_dedupe_map.go new file mode 100644 index 00000000..28ad17b5 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/tag_dedupe_map.go @@ -0,0 +1,133 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "fmt" + + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/query/models" + "github.com/m3db/m3/src/query/storage/m3/storagemetadata" +) + +type tagDedupeMap struct { + fanout QueryFanoutType + mapWrapper *fetchResultMapWrapper + tagOpts models.TagOptions +} + +type tagMapOpts struct { + size int + fanout QueryFanoutType + tagOpts models.TagOptions +} + +func newTagDedupeMap(opts tagMapOpts) fetchDedupeMap { + return &tagDedupeMap{ + fanout: opts.fanout, + mapWrapper: newFetchResultMapWrapper(opts.size), + tagOpts: opts.tagOpts, + } +} + +func (m *tagDedupeMap) close() { + m.mapWrapper.close() +} + +func (m *tagDedupeMap) list() []multiResultSeries { + return m.mapWrapper.list() +} + +func (m *tagDedupeMap) add( + iter encoding.SeriesIterator, + attrs storagemetadata.Attributes, +) error { + tags, err := FromIdentTagIteratorToTags(iter.Tags(), m.tagOpts) + if err != nil { + return err + } + + iter.Tags().Rewind() + series := multiResultSeries{ + iter: iter, + attrs: attrs, + tags: tags, + } + + existing, exists := m.mapWrapper.get(tags) + if !exists { + m.mapWrapper.set(tags, series) + return nil + } + + var existsBetter bool + var existsEqual bool + switch m.fanout { + case NamespaceCoversAllQueryRange: + // Already exists and resolution of result we are adding is not as precise + existsBetter = existing.attrs.Resolution < attrs.Resolution + existsEqual = existing.attrs.Resolution == attrs.Resolution + case NamespaceCoversPartialQueryRange: + // Already exists and either has longer retention, or the same retention + // and result we are adding is not as precise + existsLongerRetention := existing.attrs.Retention > attrs.Retention + existsSameRetentionEqualOrBetterResolution := + existing.attrs.Retention == attrs.Retention && + existing.attrs.Resolution < attrs.Resolution + existsBetter = existsLongerRetention || existsSameRetentionEqualOrBetterResolution + + existsEqual = existing.attrs.Retention == attrs.Retention && + existing.attrs.Resolution == attrs.Resolution + default: + return fmt.Errorf("unknown query fanout type: %d", m.fanout) + } + + if existsEqual { + acc, ok := existing.iter.(encoding.SeriesIteratorAccumulator) + if !ok { + acc, err = encoding.NewSeriesIteratorAccumulator(existing.iter, + encoding.SeriesAccumulatorOptions{}) + if err != nil { + return err + } + } + + if err := acc.Add(iter); err != nil { + return err + } + + // Update accumulated result series. + series.iter = acc + m.mapWrapper.set(tags, series) + return nil + } + + if existsBetter { + // Existing result is already better + return nil + } + + // Override + existing.iter.Close() + m.mapWrapper.set(tags, series) + + return nil +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/types.go b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/types.go new file mode 100644 index 00000000..e91b4692 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/consolidators/types.go @@ -0,0 +1,172 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package consolidators + +import ( + "github.com/m3db/m3/src/dbnode/client" + "github.com/m3db/m3/src/dbnode/encoding" + "github.com/m3db/m3/src/query/block" + "github.com/m3db/m3/src/query/models" + "github.com/m3db/m3/src/query/storage/m3/storagemetadata" + "github.com/m3db/m3/src/x/ident" +) + +// MatchOptions are multi fetch matching options. +type MatchOptions struct { + // MatchType is the equality matching type by which to compare series. + MatchType MatchType +} + +// MatchType is a equality match type. +type MatchType uint + +const ( + // MatchIDs matches series based on ID only. + MatchIDs MatchType = iota + // MatchTags matcher series based on tags. + MatchTags +) + +// QueryFanoutType is a query fanout type. +type QueryFanoutType uint + +const ( + // NamespaceInvalid indicates there is no valid namespace. + NamespaceInvalid QueryFanoutType = iota + // NamespaceCoversAllQueryRange indicates the given namespace covers + // the entire query range. + NamespaceCoversAllQueryRange + // NamespaceCoversPartialQueryRange indicates the given namespace covers + // a partial query range. + NamespaceCoversPartialQueryRange +) + +func (t QueryFanoutType) String() string { + switch t { + case NamespaceCoversAllQueryRange: + return "coversAllQueryRange" + case NamespaceCoversPartialQueryRange: + return "coversPartialQueryRange" + default: + return "unknown" + } +} + +// MultiFetchResult is a deduping accumalator for series iterators +// that allows merging using a given strategy. +type MultiFetchResult interface { + // Add appends series fetch results to the accumulator. + Add( + seriesIterators encoding.SeriesIterators, + metadata block.ResultMetadata, + attrs storagemetadata.Attributes, + err error, + ) + + // FinalResult returns a series fetch result containing deduplicated series + // iterators and their metadata, and any errors encountered. + FinalResult() (SeriesFetchResult, error) + + // FinalResult returns a series fetch result containing deduplicated series + // iterators and their metadata, as well as any attributes corresponding to + // these results, and any errors encountered. + FinalResultWithAttrs() (SeriesFetchResult, []storagemetadata.Attributes, error) + + // Close releases all resources held by this accumulator. + Close() error +} + +// SeriesFetchResult is a fetch result with associated metadata. +type SeriesFetchResult struct { + // Metadata is the set of metadata associated with the fetch result. + Metadata block.ResultMetadata + // seriesData is the list of series data for the result. + seriesData seriesData +} + +// SeriesData is fetched series data. +type seriesData struct { + // seriesIterators are the series iterators for the series. + seriesIterators encoding.SeriesIterators + // tags are the decoded tags for the series. + tags []*models.Tags +} + +// TagResult is a fetch tag result with associated metadata. +type TagResult struct { + // Metadata is the set of metadata associated with the fetch result. + Metadata block.ResultMetadata + // Tags is the list of tags for the result. + Tags []MultiTagResult +} + +// MultiFetchTagsResult is a deduping accumalator for tag iterators. +type MultiFetchTagsResult interface { + // Add adds tagged ID iterators to the accumulator. + Add( + newIterator client.TaggedIDsIterator, + meta block.ResultMetadata, + err error, + ) + // FinalResult returns a deduped list of tag iterators with + // corresponding series IDs. + FinalResult() (TagResult, error) + // Close releases all resources held by this accumulator. + Close() error +} + +// CompletedTag represents a tag retrieved by a complete tags query. +type CompletedTag struct { + // Name the name of the tag. + Name []byte + // Values is a set of possible values for the tag. + // NB: if the parent CompleteTagsResult is set to CompleteNameOnly, this is + // expected to be empty. + Values [][]byte +} + +// CompleteTagsResult represents a set of autocompleted tag names and values +type CompleteTagsResult struct { + // CompleteNameOnly indicates if the tags in this result are expected to have + // both names and values, or only names. + CompleteNameOnly bool + // CompletedTag is a list of completed tags. + CompletedTags []CompletedTag + // Metadata describes any metadata for the operation. + Metadata block.ResultMetadata +} + +// CompleteTagsResultBuilder is a builder that accumulates and deduplicates +// incoming CompleteTagsResult values. +type CompleteTagsResultBuilder interface { + // Add appends an incoming CompleteTagsResult. + Add(*CompleteTagsResult) error + // Build builds a completed tag result. + Build() CompleteTagsResult +} + +// MultiTagResult represents a tag iterator with its string ID. +type MultiTagResult struct { + // ID is the series ID. + ID ident.ID + // Iter is the tag iterator for the series. + Iter ident.TagIterator +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/storagemetadata/config.go b/vendor/github.com/m3db/m3/src/query/storage/m3/storagemetadata/config.go new file mode 100644 index 00000000..2e7a96ef --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/storagemetadata/config.go @@ -0,0 +1,82 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package storagemetadata + +import ( + "fmt" +) + +var ( + validMetricsTypes = []MetricsType{ + UnaggregatedMetricsType, + AggregatedMetricsType, + } +) + +func (t MetricsType) String() string { + switch t { + case UnaggregatedMetricsType: + return "unaggregated" + case AggregatedMetricsType: + return "aggregated" + default: + return "unknown" + } +} + +// ParseMetricsType parses a metric type. +func ParseMetricsType(str string) (MetricsType, error) { + for _, valid := range validMetricsTypes { + if str == valid.String() { + return valid, nil + } + } + + return 0, fmt.Errorf("unrecognized metrics type: %v", str) +} + +// ValidateMetricsType validates a stored metrics type. +func ValidateMetricsType(v MetricsType) error { + for _, valid := range validMetricsTypes { + if valid == v { + return nil + } + } + + return fmt.Errorf("invalid stored metrics type '%v': should be one of %v", + v, validMetricsTypes) +} + +// UnmarshalYAML unmarshals a stored merics type. +func (t *MetricsType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + + if value, err := ParseMetricsType(str); err == nil { + *t = value + return nil + } + + return fmt.Errorf("invalid MetricsType '%s' valid types are: %v", + str, validMetricsTypes) +} diff --git a/vendor/github.com/m3db/m3/src/query/storage/m3/storagemetadata/types.go b/vendor/github.com/m3db/m3/src/query/storage/m3/storagemetadata/types.go new file mode 100644 index 00000000..563f04ea --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/storage/m3/storagemetadata/types.go @@ -0,0 +1,57 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package storagemetadata + +import ( + "time" +) + +// MetricsType is a type of stored metrics. +type MetricsType uint + +const ( + // UnknownMetricsType is the unknown metrics type and is invalid. + UnknownMetricsType MetricsType = iota + // UnaggregatedMetricsType is an unaggregated metrics type. + UnaggregatedMetricsType + // AggregatedMetricsType is an aggregated metrics type. + AggregatedMetricsType + + // DefaultMetricsType is the default metrics type value. + DefaultMetricsType = UnaggregatedMetricsType +) + +// Attributes is a set of stored metrics attributes. +type Attributes struct { + // MetricsType indicates the type of namespace this metric originated from. + MetricsType MetricsType + // Retention indicates the retention of the namespace this metric originated + // from. + Retention time.Duration + // Resolution indicates the retention of the namespace this metric originated + // from. + Resolution time.Duration +} + +// Validate validates a storage attributes. +func (a Attributes) Validate() error { + return ValidateMetricsType(a.MetricsType) +} diff --git a/vendor/github.com/m3db/m3/src/query/ts/metadata.go b/vendor/github.com/m3db/m3/src/query/ts/metadata.go new file mode 100644 index 00000000..09b2335a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/ts/metadata.go @@ -0,0 +1,95 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ts + +// M3MetricType is the enum for M3 metric types. +// NB: the current use case for this is Graphite metrics. Also see PromMetricType (below). +// In future, it is worth considering a merge of these two enumerations. +type M3MetricType uint8 + +const ( + // M3MetricTypeGauge is the gauge metric type. + M3MetricTypeGauge M3MetricType = iota + + // M3MetricTypeCounter is the counter metric type. + M3MetricTypeCounter + + // M3MetricTypeTimer is the timer metric type. + M3MetricTypeTimer +) + +// PromMetricType is the enum for Prometheus metric types. +type PromMetricType uint8 + +const ( + // PromMetricTypeUnknown is the unknown Prometheus metric type. + PromMetricTypeUnknown PromMetricType = iota + + // PromMetricTypeCounter is the counter Prometheus metric type. + PromMetricTypeCounter + + // PromMetricTypeGauge is the gauge Prometheus metric type. + PromMetricTypeGauge + + // PromMetricTypeHistogram is the histogram Prometheus metric type. + PromMetricTypeHistogram + + // PromMetricTypeGaugeHistogram is the gauge histogram Prometheus metric type. + PromMetricTypeGaugeHistogram + + // PromMetricTypeSummary is the summary Prometheus metric type. + PromMetricTypeSummary + + // PromMetricTypeInfo is the info Prometheus metric type. + PromMetricTypeInfo + + // PromMetricTypeStateSet is the state set Prometheus metric type. + PromMetricTypeStateSet +) + +// SourceType is the enum for metric source types. +type SourceType uint8 + +const ( + // SourceTypePrometheus is the prometheus source type. + SourceTypePrometheus SourceType = iota + + // SourceTypeGraphite is the graphite source type. + SourceTypeGraphite +) + +// SeriesAttributes has attributes about the time series. +type SeriesAttributes struct { + M3Type M3MetricType + PromType PromMetricType + Source SourceType + HandleValueResets bool +} + +// DefaultSeriesAttributes returns a default series attributes. +func DefaultSeriesAttributes() SeriesAttributes { + return SeriesAttributes{} +} + +// Metadata is metadata associated with a time series. +type Metadata struct { + DropUnaggregated bool +} diff --git a/vendor/github.com/m3db/m3/src/query/ts/series.go b/vendor/github.com/m3db/m3/src/query/ts/series.go new file mode 100644 index 00000000..599dedda --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/ts/series.go @@ -0,0 +1,55 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ts + +import ( + "github.com/m3db/m3/src/query/models" +) + +// Series is the public interface to a block of timeseries values. +// Each block has a start time, a logical number of steps, and a step size +// indicating the number of milliseconds represented by each point. +type Series struct { + name []byte + vals Values + Tags models.Tags +} + +// NewSeries creates a new Series at a given start time, backed by the provided values. +func NewSeries(name []byte, vals Values, tags models.Tags) *Series { + return &Series{ + name: name, + vals: vals, + Tags: tags, + } +} + +// Name returns the name of the timeseries block +func (s *Series) Name() []byte { return s.name } + +// Len returns the number of values in the time series. Used for aggregation. +func (s *Series) Len() int { return s.vals.Len() } + +// Values returns the underlying values interface. +func (s *Series) Values() Values { return s.vals } + +// SeriesList represents a slice of series pointers. +type SeriesList []*Series diff --git a/vendor/github.com/m3db/m3/src/query/ts/ts_mock.go b/vendor/github.com/m3db/m3/src/query/ts/ts_mock.go new file mode 100644 index 00000000..183834e1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/ts/ts_mock.go @@ -0,0 +1,141 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/query/ts (interfaces: Values) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package ts is a generated GoMock package. +package ts + +import ( + "reflect" + "time" + + "github.com/m3db/m3/src/query/models" + + "github.com/golang/mock/gomock" +) + +// MockValues is a mock of Values interface +type MockValues struct { + ctrl *gomock.Controller + recorder *MockValuesMockRecorder +} + +// MockValuesMockRecorder is the mock recorder for MockValues +type MockValuesMockRecorder struct { + mock *MockValues +} + +// NewMockValues creates a new mock instance +func NewMockValues(ctrl *gomock.Controller) *MockValues { + mock := &MockValues{ctrl: ctrl} + mock.recorder = &MockValuesMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockValues) EXPECT() *MockValuesMockRecorder { + return m.recorder +} + +// AlignToBounds mocks base method +func (m *MockValues) AlignToBounds(arg0 models.Bounds, arg1 time.Duration, arg2 AlignedDatapoints) AlignedDatapoints { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AlignToBounds", arg0, arg1, arg2) + ret0, _ := ret[0].(AlignedDatapoints) + return ret0 +} + +// AlignToBounds indicates an expected call of AlignToBounds +func (mr *MockValuesMockRecorder) AlignToBounds(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AlignToBounds", reflect.TypeOf((*MockValues)(nil).AlignToBounds), arg0, arg1, arg2) +} + +// AlignToBoundsNoWriteForward mocks base method +func (m *MockValues) AlignToBoundsNoWriteForward(arg0 models.Bounds, arg1 time.Duration, arg2 AlignedDatapoints) AlignedDatapoints { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AlignToBoundsNoWriteForward", arg0, arg1, arg2) + ret0, _ := ret[0].(AlignedDatapoints) + return ret0 +} + +// AlignToBoundsNoWriteForward indicates an expected call of AlignToBoundsNoWriteForward +func (mr *MockValuesMockRecorder) AlignToBoundsNoWriteForward(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AlignToBoundsNoWriteForward", reflect.TypeOf((*MockValues)(nil).AlignToBoundsNoWriteForward), arg0, arg1, arg2) +} + +// DatapointAt mocks base method +func (m *MockValues) DatapointAt(arg0 int) Datapoint { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DatapointAt", arg0) + ret0, _ := ret[0].(Datapoint) + return ret0 +} + +// DatapointAt indicates an expected call of DatapointAt +func (mr *MockValuesMockRecorder) DatapointAt(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DatapointAt", reflect.TypeOf((*MockValues)(nil).DatapointAt), arg0) +} + +// Datapoints mocks base method +func (m *MockValues) Datapoints() []Datapoint { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Datapoints") + ret0, _ := ret[0].([]Datapoint) + return ret0 +} + +// Datapoints indicates an expected call of Datapoints +func (mr *MockValuesMockRecorder) Datapoints() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Datapoints", reflect.TypeOf((*MockValues)(nil).Datapoints)) +} + +// Len mocks base method +func (m *MockValues) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockValuesMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockValues)(nil).Len)) +} + +// ValueAt mocks base method +func (m *MockValues) ValueAt(arg0 int) float64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValueAt", arg0) + ret0, _ := ret[0].(float64) + return ret0 +} + +// ValueAt indicates an expected call of ValueAt +func (mr *MockValuesMockRecorder) ValueAt(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValueAt", reflect.TypeOf((*MockValues)(nil).ValueAt), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/query/ts/values.go b/vendor/github.com/m3db/m3/src/query/ts/values.go new file mode 100644 index 00000000..1fd83a7c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/ts/values.go @@ -0,0 +1,314 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ts + +import ( + "time" + + "github.com/m3db/m3/src/query/models" + "github.com/m3db/m3/src/query/util" +) + +// Values holds the values for a timeseries. It provides a minimal interface +// for storing and retrieving values in the series, with Series providing a +// more convenient interface for applications to build on top of. Values +// objects are not specific to a given time, allowing them to be +// pre-allocated, pooled, and re-used across multiple series. There are +// multiple implementations of Values so that we can optimize storage based on +// the density of the series. +type Values interface { + // Len returns the number of values present + Len() int + + // ValueAt returns the value at the nth element + ValueAt(n int) float64 + + // DatapointAt returns the datapoint at the nth element + DatapointAt(n int) Datapoint + + // Datapoints returns all the datapoints + Datapoints() []Datapoint + + // AlignToBounds returns values aligned to given bounds. To belong to a step, + // values should be <= stepTime and not stale. Takes an optional buffer to + // allow for memory re-use. + AlignToBounds( + bounds models.Bounds, + lookbackDuration time.Duration, + buffer AlignedDatapoints, + ) AlignedDatapoints + + // AlignToBoundsNoWriteForward returns values aligned to the start time + // and duration, but does not write points forward after aligning them. This + // differs from AlignToBounds which will write points forwards if no + // additional values are found in the values, adding an empty point instead. + // Takes an optional buffer to allow for memory re-use. + AlignToBoundsNoWriteForward( + bounds models.Bounds, + lookbackDuration time.Duration, + buffer AlignedDatapoints, + ) AlignedDatapoints +} + +// A Datapoint is a single data value reported at a given time. +type Datapoint struct { + Timestamp time.Time + Value float64 +} + +// AlignedDatapoints is a list of aligned datapoints. +type AlignedDatapoints []Datapoints + +// Datapoints is a list of datapoints. +type Datapoints []Datapoint + +// Len is the length of the array. +func (d Datapoints) Len() int { return len(d) } + +// ValueAt returns the value at the nth element. +func (d Datapoints) ValueAt(n int) float64 { return d[n].Value } + +// DatapointAt returns the value at the nth element. +func (d Datapoints) DatapointAt(n int) Datapoint { return d[n] } + +// Datapoints returns all the datapoints. +func (d Datapoints) Datapoints() []Datapoint { return d } + +// Values returns the values representation. +func (d Datapoints) Values() []float64 { + values := make([]float64, len(d)) + for i, dp := range d { + values[i] = dp.Value + } + + return values +} + +// Reset resets the passed in value slice with the current value representation. +func (d Datapoints) Reset(values []float64) []float64 { + if values == nil { + values = make([]float64, 0, len(d)) + } else { + values = values[:0] + } + + for _, dp := range d { + values = append(values, dp.Value) + } + + return values +} + +func (d Datapoints) alignToBounds( + bounds models.Bounds, + lookbackDuration time.Duration, + stepValues AlignedDatapoints, + writeForward bool, +) AlignedDatapoints { + numDatapoints := d.Len() + steps := bounds.Steps() + if stepValues == nil { + stepValues = make(AlignedDatapoints, steps) + } + + dpIdx := 0 + stepSize := bounds.StepSize + t := bounds.Start + for i := 0; i < steps; i++ { + if stepValues[i] == nil { + stepValues[i] = make(Datapoints, 0, 10) + } else { + stepValues[i] = stepValues[i][:0] + } + + staleThreshold := lookbackDuration + if stepSize > lookbackDuration { + staleThreshold = stepSize + } + + for dpIdx < numDatapoints && !d[dpIdx].Timestamp.After(t) { + point := d[dpIdx] + dpIdx++ + // Skip stale values + if t.Sub(point.Timestamp) > staleThreshold { + continue + } + + stepValues[i] = append(stepValues[i], point) + } + + // If writeForward is enabled and there is no point found for this + // interval, reuse the last point as long as its not stale + if writeForward { + if len(stepValues[i]) == 0 && dpIdx > 0 { + prevPoint := d[dpIdx-1] + if t.Sub(prevPoint.Timestamp) <= staleThreshold { + stepValues[i] = Datapoints{prevPoint} + } + } + } + + t = t.Add(stepSize) + } + + return stepValues +} + +// AlignToBoundsNoWriteForward returns values aligned to the start time +// and duration, but does not write points forward after aligning them. This +// differs from AlignToBounds which will write points forwards if no additional +// values are found in the values, adding an empty point instead. +func (d Datapoints) AlignToBoundsNoWriteForward( + bounds models.Bounds, + lookbackDuration time.Duration, + buffer AlignedDatapoints, +) AlignedDatapoints { + return d.alignToBounds(bounds, lookbackDuration, buffer, false) +} + +// AlignToBounds returns values aligned to given bounds. To belong to a step, +// values should be <= stepTime and not stale. +func (d Datapoints) AlignToBounds( + bounds models.Bounds, + lookbackDuration time.Duration, + buffer AlignedDatapoints, +) AlignedDatapoints { + return d.alignToBounds(bounds, lookbackDuration, buffer, true) +} + +// MutableValues is the interface for values that can be updated +type MutableValues interface { + Values + + // Sets the value at the given entry + SetValueAt(n int, v float64) +} + +// FixedResolutionMutableValues are mutable values with fixed resolution between steps +type FixedResolutionMutableValues interface { + MutableValues + Resolution() time.Duration + StepAtTime(t time.Time) int + StartTimeForStep(n int) time.Time + // Time when the series starts + StartTime() time.Time +} + +type fixedResolutionValues struct { + resolution time.Duration + numSteps int + values []float64 + startTime time.Time +} + +func (b *fixedResolutionValues) Len() int { return b.numSteps } +func (b *fixedResolutionValues) ValueAt(point int) float64 { return b.values[point] } +func (b *fixedResolutionValues) DatapointAt(point int) Datapoint { + return Datapoint{ + Timestamp: b.StartTimeForStep(point), + Value: b.ValueAt(point), + } +} +func (b *fixedResolutionValues) Datapoints() []Datapoint { + datapoints := make([]Datapoint, 0, len(b.values)) + for i := range b.values { + datapoints = append(datapoints, b.DatapointAt(i)) + } + return datapoints +} + +func (b *fixedResolutionValues) AlignToBounds( + _ models.Bounds, + _ time.Duration, + values AlignedDatapoints, +) AlignedDatapoints { + if values == nil { + values = make(AlignedDatapoints, 0, len(b.values)) + } else { + values = values[:0] + } + + for i := 0; i < b.Len(); i++ { + values = append(values, Datapoints{b.DatapointAt(i)}) + } + + return values +} + +func (b *fixedResolutionValues) AlignToBoundsNoWriteForward( + bb models.Bounds, + d time.Duration, + buffer AlignedDatapoints, +) AlignedDatapoints { + return b.AlignToBounds(bb, d, buffer) +} + +// StartTime returns the time the values start +func (b *fixedResolutionValues) StartTime() time.Time { + return b.startTime +} + +// Resolution returns resolution per step +func (b *fixedResolutionValues) Resolution() time.Duration { + return b.resolution +} + +// StepAtTime returns the step within the block containing the given time +func (b *fixedResolutionValues) StepAtTime(t time.Time) int { + return int(t.Sub(b.StartTime()) / b.Resolution()) +} + +// StartTimeForStep returns the time at which the given step starts +func (b *fixedResolutionValues) StartTimeForStep(n int) time.Time { + return b.startTime.Add(time.Duration(n) * b.Resolution()) +} + +// SetValueAt sets the value at the given entry +func (b *fixedResolutionValues) SetValueAt(n int, v float64) { + b.values[n] = v +} + +// NewFixedStepValues returns mutable values with fixed resolution +// TODO: remove this. +func NewFixedStepValues( + resolution time.Duration, + numSteps int, + initialValue float64, + startTime time.Time, +) FixedResolutionMutableValues { + return newFixedStepValues(resolution, numSteps, initialValue, startTime) +} + +func newFixedStepValues( + resolution time.Duration, + numSteps int, + initialValue float64, + startTime time.Time, +) *fixedResolutionValues { + values := make([]float64, numSteps) + util.Memset(values, initialValue) + return &fixedResolutionValues{ + resolution: resolution, + numSteps: numSteps, + startTime: startTime, + values: values, + } +} diff --git a/vendor/github.com/m3db/m3/src/query/util/memset.go b/vendor/github.com/m3db/m3/src/query/util/memset.go new file mode 100644 index 00000000..07d8a44f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/util/memset.go @@ -0,0 +1,59 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package util + +// Memset is a faster way to initialize a float64 array. +// NB: Inspired from https://github.com/tmthrgd/go-memset, which works +// directly on the byte interface. The 0 case is optimized due to +// https://github.com/golang/go/issues/5373 but for non the zero case, +// we use the copy() optimization. +// BenchmarkMemsetZeroValues-4 1000000 1344 ns/op +// BenchmarkLoopZeroValues-4 500000 3217 ns/op +// BenchmarkMemsetNonZeroValues-4 1000000 1537 ns/op +// BenchmarkLoopNonZeroValues-4 500000 3236 ns/op +func Memset(data []float64, value float64) { + if value == 0 { + for i := range data { + data[i] = 0 + } + } else if len(data) != 0 { + data[0] = value + + for i := 1; i < len(data); i *= 2 { + copy(data[i:], data[:i]) + } + } +} + +// MemsetInt is a faster way to initialize an int array. +func MemsetInt(data []int, value int) { + if value == 0 { + for i := range data { + data[i] = 0 + } + } else if len(data) != 0 { + data[0] = value + + for i := 1; i < len(data); i *= 2 { + copy(data[i:], data[:i]) + } + } +} diff --git a/vendor/github.com/m3db/m3/src/query/util/strings.go b/vendor/github.com/m3db/m3/src/query/util/strings.go new file mode 100644 index 00000000..3729f0fa --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/util/strings.go @@ -0,0 +1,31 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package util + +// HasEmptyString returns whether there are any empty strings in given strings +func HasEmptyString(strs ...string) bool { + for _, str := range strs { + if str == "" { + return true + } + } + return false +} diff --git a/vendor/github.com/m3db/m3/src/query/util/timing.go b/vendor/github.com/m3db/m3/src/query/util/timing.go new file mode 100644 index 00000000..6d15467d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/util/timing.go @@ -0,0 +1,96 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package util + +import ( + "fmt" + "math" + "strconv" + "time" + + "github.com/prometheus/common/model" +) + +var ( + minTime = time.Unix(math.MinInt64/1000+62135596801, 0).UTC() + maxTime = time.Unix(math.MaxInt64/1000-62135596801, 999999999).UTC() + + minTimeFormatted = minTime.Format(time.RFC3339Nano) + maxTimeFormatted = maxTime.Format(time.RFC3339Nano) +) + +// ParseTimeString parses a time string into time.Time. +func ParseTimeString(s string) (time.Time, error) { + if t, err := strconv.ParseFloat(s, 64); err == nil { + s, ns := math.Modf(t) + ns = math.Round(ns*1000) / 1000 + return time.Unix(int64(s), int64(ns*float64(time.Second))), nil + } + + if t, err := time.Parse(time.RFC3339Nano, s); err == nil { + return t, nil + } + + // Stdlib's time parser can only handle 4 digit years. As a workaround until + // that is fixed we want to at least support our own boundary times. + // Context: https://github.com/prometheus/client_golang/issues/614 + // Upstream issue: https://github.com/golang/go/issues/20555 + switch s { + case minTimeFormatted: + return time.Unix(0, 0), nil + case maxTimeFormatted: + return time.Now(), nil + } + + return time.Time{}, fmt.Errorf("invalid timestamp for %s", s) +} + +// ParseTimeStringWithDefault parses a time string into time.Time. +func ParseTimeStringWithDefault( + s string, + defaultTime time.Time, +) (time.Time, error) { + if s != "" { + return ParseTimeString(s) + } + return defaultTime, nil +} + +// ParseDurationString parses a string duration allows for +// float seconds and also time strings such as 7d5h, etc. +func ParseDurationString(s string) (time.Duration, error) { + if d, err := strconv.ParseFloat(s, 64); err == nil { + ts := d * float64(time.Second) + if ts > float64(math.MaxInt64) || ts < float64(math.MinInt64) { + return 0, fmt.Errorf("cannot parse %q to a valid duration. It overflows int64", s) + } + return time.Duration(ts), nil + } + if d, err := model.ParseDuration(s); err == nil { + return time.Duration(d), nil + } + return 0, fmt.Errorf("cannot parse %q to a valid duration", s) +} + +// DurationToMS converts a duration into milliseconds +func DurationToMS(duration time.Duration) int64 { + return duration.Nanoseconds() / int64(time.Millisecond) +} diff --git a/vendor/github.com/m3db/m3/src/query/util/writer/int_writer.go b/vendor/github.com/m3db/m3/src/query/util/writer/int_writer.go new file mode 100644 index 00000000..bc6d0b44 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/query/util/writer/int_writer.go @@ -0,0 +1,88 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package writer + +// IntLength determines the number of digits in a base 10 integer. +func IntLength(i int) int { + if i == 0 { + return 1 + } + + count := 0 + for ; i > 0; i /= 10 { + count++ + } + + return count +} + +// WriteInteger writes a base 10 integer to a buffer at a given index. +// +// NB: based on fmt.Printf handling of integers, specifically base 10 case. +func WriteInteger(dst []byte, value, idx int) int { + // Because printing is easier right-to-left: format u into buf, ending at buf[i]. + // We could make things marginally faster by splitting the 32-bit case out + // into a separate block but it's not worth the duplication, so u has 64 bits. + // Use constants for the division and modulo for more efficient code. + // Switch cases ordered by popularity. + idx = idx + IntLength(value) + finalIndex := idx + for value >= 10 { + idx-- + dst[idx] = byte(48 + value%10) + next := value / 10 + value = next + } + + dst[idx-1] = byte(48 + value) + return finalIndex +} + +// IntsLength determines the number of digits in a list of base 10 integers, +// accounting for separators between each integer. +func IntsLength(is []int) int { + // initialize length accounting for separators. + l := len(is) - 1 + for _, i := range is { + l += IntLength(i) + } + + return l +} + +// WriteIntegers writes a slice of base 10 integer to a buffer at a given index, +// separating each value with the given separator, returning the index at which +// the write ends. +// +// NB: Ensure that there is sufficient space in the buffer to hold values and +// separators. +func WriteIntegers(dst []byte, values []int, sep byte, idx int) int { + l := len(values) - 1 + for _, v := range values[:l] { + idx = WriteInteger(dst, v, idx) + dst[idx] = sep + idx++ + } + + idx = WriteInteger(dst, values[l], idx) + // Write the last integer. + return idx +} diff --git a/vendor/github.com/m3db/m3/src/x/checked/bytes.go b/vendor/github.com/m3db/m3/src/x/checked/bytes.go new file mode 100644 index 00000000..19ef4303 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/checked/bytes.go @@ -0,0 +1,150 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package checked + +var ( + defaultBytesOptions = NewBytesOptions() +) + +// Bytes is a checked byte slice. +type Bytes interface { + ReadWriteRef + + // Bytes returns an unchecked reference to the underlying bytes, callers + // should discard the reference immediately after use and the use of + // the reference must not extend past the lifetime of the checked bytes + // itself. + Bytes() []byte + + // Cap returns capacity of the bytes. + Cap() int + + // Len returns the length of the bytes. + Len() int + + // Resize will resize the bytes slice, this allows for reuse of the already + // allocated bytes slices. + Resize(size int) + + // Append will append a single byte to the bytes slice. + Append(value byte) + + // AppendAll will append bytes to the bytes slice. + AppendAll(values []byte) + + // Reset will reset the reference referred to by the bytes. + Reset(v []byte) +} + +type bytesRef struct { + RefCount + + opts BytesOptions + value []byte +} + +// NewBytes returns a new checked byte slice. +func NewBytes(value []byte, opts BytesOptions) Bytes { + if opts == nil { + opts = defaultBytesOptions + } + b := &bytesRef{ + opts: opts, + value: value, + } + b.SetOnFinalize(b) + // NB(r): Tracking objects causes interface allocation + // so avoid if we are not performing any leak detection. + if leakDetectionEnabled() { + b.TrackObject(b.value) + } + return b +} + +func (b *bytesRef) Bytes() []byte { + b.IncReads() + v := b.value + b.DecReads() + return v +} + +func (b *bytesRef) Cap() int { + b.IncReads() + v := cap(b.value) + b.DecReads() + return v +} + +func (b *bytesRef) Len() int { + b.IncReads() + v := len(b.value) + b.DecReads() + return v +} + +func (b *bytesRef) Resize(size int) { + b.IncWrites() + b.value = b.value[:size] + b.DecWrites() +} + +func (b *bytesRef) Append(value byte) { + b.IncWrites() + b.value = append(b.value, value) + b.DecWrites() +} + +func (b *bytesRef) AppendAll(values []byte) { + b.IncWrites() + b.value = append(b.value, values...) + b.DecWrites() +} + +func (b *bytesRef) Reset(v []byte) { + b.IncWrites() + b.value = v + b.DecWrites() +} + +func (b *bytesRef) OnFinalize() { + if finalizer := b.opts.Finalizer(); finalizer != nil { + finalizer.FinalizeBytes(b) + } +} + +type bytesOptions struct { + finalizer BytesFinalizer +} + +// NewBytesOptions returns a new set of bytes options. +func NewBytesOptions() BytesOptions { + return &bytesOptions{} +} + +func (o *bytesOptions) Finalizer() BytesFinalizer { + return o.finalizer +} + +func (o *bytesOptions) SetFinalizer(value BytesFinalizer) BytesOptions { + opts := *o + opts.finalizer = value + return &opts +} diff --git a/vendor/github.com/m3db/m3/src/x/checked/checked_mock.go b/vendor/github.com/m3db/m3/src/x/checked/checked_mock.go new file mode 100644 index 00000000..2c5040ea --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/checked/checked_mock.go @@ -0,0 +1,298 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/x/checked (interfaces: Bytes) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package checked is a generated GoMock package. +package checked + +import ( + "reflect" + + "github.com/m3db/m3/src/x/resource" + + "github.com/golang/mock/gomock" +) + +// MockBytes is a mock of Bytes interface +type MockBytes struct { + ctrl *gomock.Controller + recorder *MockBytesMockRecorder +} + +// MockBytesMockRecorder is the mock recorder for MockBytes +type MockBytesMockRecorder struct { + mock *MockBytes +} + +// NewMockBytes creates a new mock instance +func NewMockBytes(ctrl *gomock.Controller) *MockBytes { + mock := &MockBytes{ctrl: ctrl} + mock.recorder = &MockBytesMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockBytes) EXPECT() *MockBytesMockRecorder { + return m.recorder +} + +// Append mocks base method +func (m *MockBytes) Append(arg0 byte) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Append", arg0) +} + +// Append indicates an expected call of Append +func (mr *MockBytesMockRecorder) Append(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Append", reflect.TypeOf((*MockBytes)(nil).Append), arg0) +} + +// AppendAll mocks base method +func (m *MockBytes) AppendAll(arg0 []byte) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "AppendAll", arg0) +} + +// AppendAll indicates an expected call of AppendAll +func (mr *MockBytesMockRecorder) AppendAll(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendAll", reflect.TypeOf((*MockBytes)(nil).AppendAll), arg0) +} + +// Bytes mocks base method +func (m *MockBytes) Bytes() []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Bytes") + ret0, _ := ret[0].([]byte) + return ret0 +} + +// Bytes indicates an expected call of Bytes +func (mr *MockBytesMockRecorder) Bytes() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Bytes", reflect.TypeOf((*MockBytes)(nil).Bytes)) +} + +// Cap mocks base method +func (m *MockBytes) Cap() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Cap") + ret0, _ := ret[0].(int) + return ret0 +} + +// Cap indicates an expected call of Cap +func (mr *MockBytesMockRecorder) Cap() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cap", reflect.TypeOf((*MockBytes)(nil).Cap)) +} + +// DecReads mocks base method +func (m *MockBytes) DecReads() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DecReads") +} + +// DecReads indicates an expected call of DecReads +func (mr *MockBytesMockRecorder) DecReads() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DecReads", reflect.TypeOf((*MockBytes)(nil).DecReads)) +} + +// DecRef mocks base method +func (m *MockBytes) DecRef() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DecRef") +} + +// DecRef indicates an expected call of DecRef +func (mr *MockBytesMockRecorder) DecRef() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DecRef", reflect.TypeOf((*MockBytes)(nil).DecRef)) +} + +// DecWrites mocks base method +func (m *MockBytes) DecWrites() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "DecWrites") +} + +// DecWrites indicates an expected call of DecWrites +func (mr *MockBytesMockRecorder) DecWrites() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DecWrites", reflect.TypeOf((*MockBytes)(nil).DecWrites)) +} + +// DelayFinalizer mocks base method +func (m *MockBytes) DelayFinalizer() resource.Closer { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DelayFinalizer") + ret0, _ := ret[0].(resource.Closer) + return ret0 +} + +// DelayFinalizer indicates an expected call of DelayFinalizer +func (mr *MockBytesMockRecorder) DelayFinalizer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DelayFinalizer", reflect.TypeOf((*MockBytes)(nil).DelayFinalizer)) +} + +// Finalize mocks base method +func (m *MockBytes) Finalize() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Finalize") +} + +// Finalize indicates an expected call of Finalize +func (mr *MockBytesMockRecorder) Finalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finalize", reflect.TypeOf((*MockBytes)(nil).Finalize)) +} + +// IncReads mocks base method +func (m *MockBytes) IncReads() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "IncReads") +} + +// IncReads indicates an expected call of IncReads +func (mr *MockBytesMockRecorder) IncReads() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IncReads", reflect.TypeOf((*MockBytes)(nil).IncReads)) +} + +// IncRef mocks base method +func (m *MockBytes) IncRef() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "IncRef") +} + +// IncRef indicates an expected call of IncRef +func (mr *MockBytesMockRecorder) IncRef() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IncRef", reflect.TypeOf((*MockBytes)(nil).IncRef)) +} + +// IncWrites mocks base method +func (m *MockBytes) IncWrites() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "IncWrites") +} + +// IncWrites indicates an expected call of IncWrites +func (mr *MockBytesMockRecorder) IncWrites() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IncWrites", reflect.TypeOf((*MockBytes)(nil).IncWrites)) +} + +// Len mocks base method +func (m *MockBytes) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockBytesMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockBytes)(nil).Len)) +} + +// MoveRef mocks base method +func (m *MockBytes) MoveRef() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "MoveRef") +} + +// MoveRef indicates an expected call of MoveRef +func (mr *MockBytesMockRecorder) MoveRef() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MoveRef", reflect.TypeOf((*MockBytes)(nil).MoveRef)) +} + +// NumReaders mocks base method +func (m *MockBytes) NumReaders() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumReaders") + ret0, _ := ret[0].(int) + return ret0 +} + +// NumReaders indicates an expected call of NumReaders +func (mr *MockBytesMockRecorder) NumReaders() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumReaders", reflect.TypeOf((*MockBytes)(nil).NumReaders)) +} + +// NumRef mocks base method +func (m *MockBytes) NumRef() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumRef") + ret0, _ := ret[0].(int) + return ret0 +} + +// NumRef indicates an expected call of NumRef +func (mr *MockBytesMockRecorder) NumRef() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumRef", reflect.TypeOf((*MockBytes)(nil).NumRef)) +} + +// NumWriters mocks base method +func (m *MockBytes) NumWriters() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumWriters") + ret0, _ := ret[0].(int) + return ret0 +} + +// NumWriters indicates an expected call of NumWriters +func (mr *MockBytesMockRecorder) NumWriters() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumWriters", reflect.TypeOf((*MockBytes)(nil).NumWriters)) +} + +// Reset mocks base method +func (m *MockBytes) Reset(arg0 []byte) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", arg0) +} + +// Reset indicates an expected call of Reset +func (mr *MockBytesMockRecorder) Reset(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockBytes)(nil).Reset), arg0) +} + +// Resize mocks base method +func (m *MockBytes) Resize(arg0 int) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Resize", arg0) +} + +// Resize indicates an expected call of Resize +func (mr *MockBytesMockRecorder) Resize(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Resize", reflect.TypeOf((*MockBytes)(nil).Resize), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/x/checked/debug.go b/vendor/github.com/m3db/m3/src/x/checked/debug.go new file mode 100644 index 00000000..a5f49e63 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/checked/debug.go @@ -0,0 +1,317 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package checked + +import ( + "bytes" + "fmt" + "runtime" + "sync" + "time" +) + +const ( + defaultTraceback = false + defaultTracebackCycles = 3 + defaultTracebackMaxDepth = 64 + defaultLeakDetection = false +) + +var ( + traceback = defaultTraceback + tracebackCycles = defaultTracebackCycles + tracebackMaxDepth = defaultTracebackMaxDepth + panicFn = defaultPanic + leakDetectionFlag = defaultLeakDetection +) + +var tracebackCallersPool = sync.Pool{New: func() interface{} { + // Pools should generally only return pointer types, since a pointer + // can be put into the return interface value without an allocation. + // However, since this package is used just for debugging, we make the + // tradeoff of greater code clarity by putting slices directly into the + // pool at the cost of an additional allocation of the three words which + // comprise the slice on each put. + return make([]uintptr, tracebackMaxDepth) +}} + +var tracebackEntryPool = sync.Pool{New: func() interface{} { + return &debuggerEntry{} +}} + +var leaks struct { + sync.RWMutex + m map[string]uint64 +} + +// PanicFn is a panic function to call on invalid checked state +type PanicFn func(e error) + +// SetPanicFn sets the panic function +func SetPanicFn(fn PanicFn) { + panicFn = fn +} + +// Panic will execute the currently set panic function +func Panic(e error) { + panicFn(e) +} + +// ResetPanicFn resets the panic function to the default runtime panic +func ResetPanicFn() { + panicFn = defaultPanic +} + +// EnableTracebacks turns traceback collection for events on +func EnableTracebacks() { + traceback = true +} + +// DisableTracebacks turns traceback collection for events off +func DisableTracebacks() { + traceback = false +} + +// SetTracebackCycles sets the count of traceback cycles to keep if enabled +func SetTracebackCycles(value int) { + tracebackCycles = value +} + +// SetTracebackMaxDepth sets the max amount of frames to capture for traceback +func SetTracebackMaxDepth(frames int) { + tracebackMaxDepth = frames +} + +// EnableLeakDetection turns leak detection on. +func EnableLeakDetection() { + leakDetectionFlag = true +} + +// DisableLeakDetection turns leak detection off. +func DisableLeakDetection() { + leakDetectionFlag = false +} + +func leakDetectionEnabled() bool { + return leakDetectionFlag +} + +// DumpLeaks returns all detected leaks so far. +func DumpLeaks() []string { + var r []string + + leaks.RLock() + + for k, v := range leaks.m { + r = append(r, fmt.Sprintf("leaked %d bytes, origin:\n%s", v, k)) + } + + leaks.RUnlock() + + return r +} + +func defaultPanic(e error) { + panic(e) +} + +func panicRef(c *RefCount, err error) { + if traceback { + trace := getDebuggerRef(c).String() + err = fmt.Errorf("%v, traceback:\n\n%s", err, trace) + } + + panicFn(err) +} + +type debuggerEvent int + +const ( + incRefEvent debuggerEvent = iota + decRefEvent + moveRefEvent + finalizeEvent + incReadsEvent + decReadsEvent + incWritesEvent + decWritesEvent +) + +func (d debuggerEvent) String() string { + switch d { + case incRefEvent: + return "IncRef" + case decRefEvent: + return "DecRef" + case moveRefEvent: + return "MoveRef" + case finalizeEvent: + return "Finalize" + case incReadsEvent: + return "IncReads" + case decReadsEvent: + return "DecReads" + case incWritesEvent: + return "IncWrites" + case decWritesEvent: + return "DecWrites" + } + return "Unknown" +} + +type debugger struct { + sync.Mutex + entries [][]*debuggerEntry +} + +func (d *debugger) append(event debuggerEvent, ref int, pc []uintptr) { + d.Lock() + if len(d.entries) == 0 { + d.entries = make([][]*debuggerEntry, 1, tracebackCycles) + } + idx := len(d.entries) - 1 + entry := tracebackEntryPool.Get().(*debuggerEntry) + entry.event = event + entry.ref = ref + entry.pc = pc + entry.t = time.Now() + d.entries[idx] = append(d.entries[idx], entry) + if event == finalizeEvent { + if len(d.entries) == tracebackCycles { + // Shift all tracebacks back one if at end of traceback cycles + slice := d.entries[0] + for i, entry := range slice { + tracebackCallersPool.Put(entry.pc) // nolint: megacheck + entry.pc = nil + tracebackEntryPool.Put(entry) + slice[i] = nil + } + for i := 1; i < len(d.entries); i++ { + d.entries[i-1] = d.entries[i] + } + d.entries[idx] = slice[:0] + } else { + // Begin writing new events to the next cycle + d.entries = d.entries[:len(d.entries)+1] + } + } + d.Unlock() +} + +func (d *debugger) String() string { + buffer := bytes.NewBuffer(nil) + d.Lock() + // Reverse the entries for time descending + for i := len(d.entries) - 1; i >= 0; i-- { + for j := len(d.entries[i]) - 1; j >= 0; j-- { + buffer.WriteString(d.entries[i][j].String()) + } + } + d.Unlock() + return buffer.String() +} + +type debuggerRef struct { + debugger + onFinalize OnFinalize +} + +func (d *debuggerRef) OnFinalize() { + if d.onFinalize != nil { + d.onFinalize.OnFinalize() + } +} + +type debuggerEntry struct { + event debuggerEvent + ref int + pc []uintptr + t time.Time +} + +func (e *debuggerEntry) String() string { + buf := bytes.NewBuffer(nil) + frames := runtime.CallersFrames(e.pc) + for { + frame, more := frames.Next() + buf.WriteString(frame.Function) + buf.WriteString("(...)") + buf.WriteString("\n") + buf.WriteString("\t") + buf.WriteString(frame.File) + buf.WriteString(":") + buf.WriteString(fmt.Sprintf("%d", frame.Line)) + buf.WriteString(fmt.Sprintf(" +%x", frame.Entry)) + buf.WriteString("\n") + if !more { + break + } + } + return fmt.Sprintf("%s, ref=%d, unixnanos=%d:\n%s\n", + e.event.String(), e.ref, e.t.UnixNano(), buf.String()) +} + +func getDebuggerRef(c *RefCount) *debuggerRef { + // Note: because finalizer is an atomic pointer not using + // CompareAndSwapPointer makes this code is racy, however + // it is safe due to using atomic load and stores. + // This is used primarily for debugging and the races will + // show up when inspecting the tracebacks. + onFinalize := c.OnFinalize() + if onFinalize == nil { + debugger := &debuggerRef{} + c.SetOnFinalize(debugger) + return debugger + } + + debugger, ok := onFinalize.(*debuggerRef) + if !ok { + // Wrap the existing finalizer in a debuggerRef + debugger := &debuggerRef{onFinalize: onFinalize} + c.SetOnFinalize(debugger) + return debugger + } + + return debugger +} + +func tracebackEvent(c *RefCount, ref int, e debuggerEvent) { + if !traceback { + return + } + + d := getDebuggerRef(c) + depth := tracebackMaxDepth + pc := tracebackCallersPool.Get().([]uintptr) + if capacity := cap(pc); capacity < depth { + // Defensive programming here in case someone changes + // the max depth during runtime + pc = make([]uintptr, depth) + } + pc = pc[:depth] + skipEntry := 2 + n := runtime.Callers(skipEntry, pc) + d.append(e, ref, pc[:n]) +} + +func init() { + leaks.m = make(map[string]uint64) +} diff --git a/vendor/github.com/m3db/m3/src/x/checked/ref.go b/vendor/github.com/m3db/m3/src/x/checked/ref.go new file mode 100644 index 00000000..569adbe9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/checked/ref.go @@ -0,0 +1,229 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package checked + +import ( + "fmt" + "reflect" + "runtime" + "sync" + "sync/atomic" + "unsafe" + + "github.com/m3db/m3/src/x/resource" +) + +// RefCount is an embeddable checked.Ref. +type RefCount struct { + ref int32 + reads int32 + writes int32 + onFinalize unsafe.Pointer + finalizeState refCountFinalizeState +} + +type refCountFinalizeState struct { + sync.Mutex + called bool + delayRef int32 +} + +// IncRef increments the reference count to this entity. +func (c *RefCount) IncRef() { + n := atomic.AddInt32(&c.ref, 1) + tracebackEvent(c, int(n), incRefEvent) +} + +// DecRef decrements the reference count to this entity. +func (c *RefCount) DecRef() { + n := atomic.AddInt32(&c.ref, -1) + tracebackEvent(c, int(n), decRefEvent) + + if n < 0 { + err := fmt.Errorf("negative ref count, ref=%d", n) + panicRef(c, err) + } +} + +// MoveRef signals a move of the ref to this entity. +func (c *RefCount) MoveRef() { + tracebackEvent(c, c.NumRef(), moveRefEvent) +} + +// NumRef returns the reference count to this entity. +func (c *RefCount) NumRef() int { + return int(atomic.LoadInt32(&c.ref)) +} + +// Finalize will call the finalizer if any, ref count must be zero. +func (c *RefCount) Finalize() { + n := c.NumRef() + tracebackEvent(c, n, finalizeEvent) + + if n != 0 { + err := fmt.Errorf("finalize before zero ref count, ref=%d", n) + panicRef(c, err) + } + + c.finalizeState.Lock() + c.finalizeState.called = true + if c.finalizeState.delayRef == 0 { + c.finalizeWithLock() + } + c.finalizeState.Unlock() +} + +func (c *RefCount) finalizeWithLock() { + // Reset the finalize called state for reuse. + c.finalizeState.called = false + if f := c.OnFinalize(); f != nil { + f.OnFinalize() + } +} + +// DelayFinalizer will delay calling the finalizer on this entity +// until the closer returned by the method is called at least once. +// This is useful for dependent resources requiring the lifetime of this +// entityt to be extended. +func (c *RefCount) DelayFinalizer() resource.Closer { + c.finalizeState.Lock() + c.finalizeState.delayRef++ + c.finalizeState.Unlock() + return c +} + +// Close implements resource.Closer for the purpose of use with DelayFinalizer. +func (c *RefCount) Close() { + c.finalizeState.Lock() + c.finalizeState.delayRef-- + if c.finalizeState.called && c.finalizeState.delayRef == 0 { + c.finalizeWithLock() + } + c.finalizeState.Unlock() +} + +// OnFinalize returns the finalizer callback if any or nil otherwise. +func (c *RefCount) OnFinalize() OnFinalize { + finalizerPtr := (*OnFinalize)(atomic.LoadPointer(&c.onFinalize)) + if finalizerPtr == nil { + return nil + } + return *finalizerPtr +} + +// SetOnFinalize sets the finalizer callback. +func (c *RefCount) SetOnFinalize(f OnFinalize) { + atomic.StorePointer(&c.onFinalize, unsafe.Pointer(&f)) +} + +// IncReads increments the reads count to this entity. +func (c *RefCount) IncReads() { + tracebackEvent(c, c.NumRef(), incReadsEvent) + n := atomic.AddInt32(&c.reads, 1) + + if ref := c.NumRef(); n > 0 && ref < 1 { + err := fmt.Errorf("read after free: reads=%d, ref=%d", n, ref) + panicRef(c, err) + } +} + +// DecReads decrements the reads count to this entity. +func (c *RefCount) DecReads() { + tracebackEvent(c, c.NumRef(), decReadsEvent) + n := atomic.AddInt32(&c.reads, -1) + + if ref := c.NumRef(); ref < 1 { + err := fmt.Errorf("read finish after free: reads=%d, ref=%d", n, ref) + panicRef(c, err) + } +} + +// NumReaders returns the active reads count to this entity. +func (c *RefCount) NumReaders() int { + return int(atomic.LoadInt32(&c.reads)) +} + +// IncWrites increments the writes count to this entity. +func (c *RefCount) IncWrites() { + tracebackEvent(c, c.NumRef(), incWritesEvent) + n := atomic.AddInt32(&c.writes, 1) + ref := c.NumRef() + + if n > 0 && ref < 1 { + err := fmt.Errorf("write after free: writes=%d, ref=%d", n, ref) + panicRef(c, err) + } + + if n > 1 { + err := fmt.Errorf("double write: writes=%d, ref=%d", n, ref) + panicRef(c, err) + } +} + +// DecWrites decrements the writes count to this entity. +func (c *RefCount) DecWrites() { + tracebackEvent(c, c.NumRef(), decWritesEvent) + n := atomic.AddInt32(&c.writes, -1) + + if ref := c.NumRef(); ref < 1 { + err := fmt.Errorf("write finish after free: writes=%d, ref=%d", n, ref) + panicRef(c, err) + } +} + +// NumWriters returns the active writes count to this entity. +func (c *RefCount) NumWriters() int { + return int(atomic.LoadInt32(&c.writes)) +} + +// TrackObject sets up the initial internal state of the Ref for +// leak detection. +func (c *RefCount) TrackObject(v interface{}) { + if !leakDetectionFlag { + return + } + + var size int + + switch v := reflect.ValueOf(v); v.Kind() { + case reflect.Ptr: + size = int(v.Type().Elem().Size()) + case reflect.Array, reflect.Slice, reflect.Chan: + size = int(v.Type().Elem().Size()) * v.Cap() + case reflect.String: + size = v.Len() + default: + size = int(v.Type().Size()) + } + + runtime.SetFinalizer(c, func(c *RefCount) { + if c.NumRef() == 0 { + return + } + + origin := getDebuggerRef(c).String() + + leaks.Lock() + // Keep track of bytes leaked, not objects. + leaks.m[origin] += uint64(size) + leaks.Unlock() + }) +} diff --git a/vendor/github.com/m3db/m3/src/x/checked/types.go b/vendor/github.com/m3db/m3/src/x/checked/types.go new file mode 100644 index 00000000..0b0e2f26 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/checked/types.go @@ -0,0 +1,116 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package checked implements reference counted resources. +package checked + +import ( + "github.com/m3db/m3/src/x/resource" +) + +// Ref is an entity that checks ref counts. +type Ref interface { + // IncRef increments the ref count to this entity. + IncRef() + + // DecRef decrements the ref count to this entity. + DecRef() + + // MoveRef signals a move of the ref to this entity. + MoveRef() + + // NumRef returns the ref count to this entity. + NumRef() int + + // DelayFinalizer will delay calling the finalizer on this entity + // until the closer returned by the method is called at least once. + // This is useful for dependent resources requiring the lifetime of this + // entityt to be extended. + DelayFinalizer() resource.Closer + + // Finalize will call the finalizer if any, ref count must be zero. + Finalize() +} + +// OnFinalize is callback to cleanup resources on a call to finalize. +type OnFinalize interface { + OnFinalize() +} + +// OnFinalizeFn is a function literal that is a finalizer callback. +type OnFinalizeFn func() + +// OnFinalize will call the function literal as a finalizer callback. +func (fn OnFinalizeFn) OnFinalize() { + fn() +} + +// Read is an entity that checks reads. +type Read interface { + // IncReads increments the reads count to this entity. + IncReads() + + // DecReads decrements the reads count to this entity. + DecReads() + + // NumReaders returns the active reads count to this entity. + NumReaders() int +} + +// Write is an entity that checks writes. +type Write interface { + // IncWrites increments the writes count to this entity. + IncWrites() + + // DecWrites decrements the writes count to this entity. + DecWrites() + + // NumWriters returns the active writes count to this entity. + NumWriters() int +} + +// ReadWriteRef is an entity that checks ref counts, reads and writes. +type ReadWriteRef interface { + Ref + Read + Write +} + +// BytesFinalizer finalizes a checked byte slice. +type BytesFinalizer interface { + FinalizeBytes(b Bytes) +} + +// BytesFinalizerFn is a function literal that is a bytes finalizer. +type BytesFinalizerFn func(b Bytes) + +// FinalizeBytes will call the function literal as a bytes finalizer. +func (fn BytesFinalizerFn) FinalizeBytes(b Bytes) { + fn(b) +} + +// BytesOptions is a bytes option +type BytesOptions interface { + // Finalizer is a bytes finalizer to call when finalized. + Finalizer() BytesFinalizer + + // SetFinalizer sets a bytes finalizer to call when finalized. + SetFinalizer(value BytesFinalizer) BytesOptions +} diff --git a/vendor/github.com/m3db/m3/src/x/clock/config.go b/vendor/github.com/m3db/m3/src/x/clock/config.go new file mode 100644 index 00000000..5e9de687 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/clock/config.go @@ -0,0 +1,46 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package clock + +import "time" + +// Configuration configures clock options. +type Configuration struct { + // MaxPositiveSkew is the maximum positive clock skew + // with regard to a reference clock. + MaxPositiveSkew time.Duration `yaml:"maxPositiveSkew"` + + // MaxNegativeSkew is the maximum negative clock skew + // with regard to a reference clock. + MaxNegativeSkew time.Duration `yaml:"maxNegativeSkew"` +} + +// NewOptions creates a new set of options. +func (c Configuration) NewOptions() Options { + opts := NewOptions() + if c.MaxPositiveSkew != 0 { + opts = opts.SetMaxPositiveSkew(c.MaxPositiveSkew) + } + if c.MaxNegativeSkew != 0 { + opts = opts.SetMaxNegativeSkew(c.MaxNegativeSkew) + } + return opts +} diff --git a/vendor/github.com/m3db/m3/src/x/clock/options.go b/vendor/github.com/m3db/m3/src/x/clock/options.go new file mode 100644 index 00000000..90735239 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/clock/options.go @@ -0,0 +1,68 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package clock + +import ( + "time" +) + +type options struct { + nowFn NowFn + maxPositiveSkew time.Duration + maxNegativeSkew time.Duration +} + +// NewOptions creates new clock options. +func NewOptions() Options { + return &options{ + nowFn: time.Now, + } +} + +func (o *options) SetNowFn(value NowFn) Options { + opts := *o + opts.nowFn = value + return &opts +} + +func (o *options) NowFn() NowFn { + return o.nowFn +} + +func (o *options) SetMaxPositiveSkew(value time.Duration) Options { + opts := *o + opts.maxPositiveSkew = value + return &opts +} + +func (o *options) MaxPositiveSkew() time.Duration { + return o.maxPositiveSkew +} + +func (o *options) SetMaxNegativeSkew(value time.Duration) Options { + opts := *o + opts.maxNegativeSkew = value + return &opts +} + +func (o *options) MaxNegativeSkew() time.Duration { + return o.maxNegativeSkew +} diff --git a/vendor/github.com/m3db/m3/src/x/clock/types.go b/vendor/github.com/m3db/m3/src/x/clock/types.go new file mode 100644 index 00000000..a57070cb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/clock/types.go @@ -0,0 +1,70 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package clock implements facilities for working with wall clock time. +package clock + +import ( + "time" +) + +// NowFn is the function supplied to determine "now". +type NowFn func() time.Time + +// Options represents the options for the clock. +type Options interface { + // SetNowFn sets the NowFn. + SetNowFn(value NowFn) Options + + // NowFn returns the NowFn. + NowFn() NowFn + + // SetMaxPositiveSkew sets the maximum positive clock skew + // with regard to a reference clock. + SetMaxPositiveSkew(value time.Duration) Options + + // MaxPositiveSkew returns the maximum positive clock skew + // with regard to a reference clock. + MaxPositiveSkew() time.Duration + + // SetMaxNegativeSkew sets the maximum negative clock skew + // with regard to a reference clock. + SetMaxNegativeSkew(value time.Duration) Options + + // MaxNegativeSkew returns the maximum negative clock skew + // with regard to a reference clock. + MaxNegativeSkew() time.Duration +} + +// ConditionFn specifies a predicate to check. +type ConditionFn func() bool + +// WaitUntil returns true if the condition specified evaluated to +// true before the timeout, false otherwise. +func WaitUntil(fn ConditionFn, timeout time.Duration) bool { + deadline := time.Now().Add(timeout) + for time.Now().Before(deadline) { + if fn() { + return true + } + time.Sleep(100 * time.Millisecond) + } + return false +} diff --git a/vendor/github.com/m3db/m3/src/x/close/close.go b/vendor/github.com/m3db/m3/src/x/close/close.go new file mode 100644 index 00000000..1b652005 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/close/close.go @@ -0,0 +1,72 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package close provides utilities for closing resources. +package close + +import ( + "errors" + "io" +) + +var ( + // ErrNotCloseable is returned when trying to close a resource + // that does not conform to a closeable interface. + ErrNotCloseable = errors.New("not a closeable resource") +) + +// Closer is a resource that can be closed. +type Closer interface { + io.Closer +} + +// CloserFn implements the SimpleCloser interface. +type CloserFn func() error + +// Close implements the SimplerCloser interface. +func (fn CloserFn) Close() error { + return fn() +} + +// SimpleCloser is a resource that can be closed without returning a result. +type SimpleCloser interface { + Close() +} + +// SimpleCloserFn implements the SimpleCloser interface. +type SimpleCloserFn func() + +// Close implements the SimplerCloser interface. +func (fn SimpleCloserFn) Close() { + fn() +} + +// TryClose attempts to close a resource, the resource is expected to +// implement either Closeable or CloseableResult. +func TryClose(r interface{}) error { + if r, ok := r.(Closer); ok { + return r.Close() + } + if r, ok := r.(SimpleCloser); ok { + r.Close() + return nil + } + return ErrNotCloseable +} diff --git a/vendor/github.com/m3db/m3/src/x/context/cancel.go b/vendor/github.com/m3db/m3/src/x/context/cancel.go new file mode 100644 index 00000000..46d5ea5f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/context/cancel.go @@ -0,0 +1,47 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package context + +import "sync/atomic" + +type cancellable struct { + cancelled int32 +} + +// NewCancellable creates a new cancellable object +func NewCancellable() Cancellable { + return &cancellable{} +} + +func (c *cancellable) IsCancelled() bool { return atomic.LoadInt32(&c.cancelled) == 1 } +func (c *cancellable) Cancel() { atomic.StoreInt32(&c.cancelled, 1) } +func (c *cancellable) Reset() { atomic.StoreInt32(&c.cancelled, 0) } + +// NoOpCancellable is a no-op cancellable +var noOpCancellable Cancellable = cancellableNoOp{} + +type cancellableNoOp struct{} + +// NewNoOpCanncellable returns a no-op cancellable +func NewNoOpCanncellable() Cancellable { return noOpCancellable } +func (c cancellableNoOp) IsCancelled() bool { return false } +func (c cancellableNoOp) Cancel() {} +func (c cancellableNoOp) Reset() {} diff --git a/vendor/github.com/m3db/m3/src/x/context/context.go b/vendor/github.com/m3db/m3/src/x/context/context.go new file mode 100644 index 00000000..5d72e116 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/context/context.go @@ -0,0 +1,383 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package context + +import ( + stdctx "context" + "sync" + + xopentracing "github.com/m3db/m3/src/x/opentracing" + "github.com/m3db/m3/src/x/resource" + + lightstep "github.com/lightstep/lightstep-tracer-go" + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/mocktracer" + "github.com/uber/jaeger-client-go" +) + +var ( + noopTracer opentracing.NoopTracer +) + +// NB(r): using golang.org/x/net/context is too GC expensive. +// Instead, we just embed one. +type ctx struct { + sync.RWMutex + + goCtx stdctx.Context + pool contextPool + done bool + wg sync.WaitGroup + finalizeables *finalizeableList + parent Context + checkedAndNotSampled bool +} + +type finalizeable struct { + finalizer resource.Finalizer + closer resource.Closer +} + +// NewContext creates a new context. +func NewContext() Context { + return newContext() +} + +// NewPooledContext returns a new context that is returned to a pool when closed. +func newPooledContext(pool contextPool) Context { + return &ctx{pool: pool} +} + +// newContext returns an empty ctx +func newContext() *ctx { + return &ctx{} +} + +func (c *ctx) GoContext() (stdctx.Context, bool) { + if c.goCtx == nil { + return nil, false + } + + return c.goCtx, true +} + +func (c *ctx) SetGoContext(v stdctx.Context) { + c.goCtx = v +} + +func (c *ctx) IsClosed() bool { + parent := c.parentCtx() + if parent != nil { + return parent.IsClosed() + } + + c.RLock() + done := c.done + c.RUnlock() + + return done +} + +func (c *ctx) RegisterFinalizer(f resource.Finalizer) { + parent := c.parentCtx() + if parent != nil { + parent.RegisterFinalizer(f) + return + } + + c.registerFinalizeable(finalizeable{finalizer: f}) +} + +func (c *ctx) RegisterCloser(f resource.Closer) { + parent := c.parentCtx() + if parent != nil { + parent.RegisterCloser(f) + return + } + + c.registerFinalizeable(finalizeable{closer: f}) +} + +func (c *ctx) registerFinalizeable(f finalizeable) { + if c.Lock(); c.done { + c.Unlock() + return + } + + if c.finalizeables == nil { + if c.pool != nil { + c.finalizeables = c.pool.getFinalizeablesList() + } else { + c.finalizeables = newFinalizeableList(nil) + } + } + c.finalizeables.PushBack(f) + + c.Unlock() +} + +func (c *ctx) numFinalizeables() int { + if c.finalizeables == nil { + return 0 + } + return c.finalizeables.Len() +} + +func (c *ctx) DependsOn(blocker Context) { + parent := c.parentCtx() + if parent != nil { + parent.DependsOn(blocker) + return + } + + c.Lock() + + if !c.done { + c.wg.Add(1) + blocker.RegisterFinalizer(c) + } + + c.Unlock() +} + +// Finalize handles a call from another context that was depended upon closing. +func (c *ctx) Finalize() { + c.wg.Done() +} + +type closeMode int + +const ( + closeAsync closeMode = iota + closeBlock +) + +type returnToPoolMode int + +const ( + returnToPool returnToPoolMode = iota + reuse +) + +func (c *ctx) Close() { + returnMode := returnToPool + parent := c.parentCtx() + if parent != nil { + if !parent.IsClosed() { + parent.Close() + } + c.tryReturnToPool(returnMode) + return + } + + c.close(closeAsync, returnMode) +} + +func (c *ctx) BlockingClose() { + returnMode := returnToPool + parent := c.parentCtx() + if parent != nil { + if !parent.IsClosed() { + parent.BlockingClose() + } + c.tryReturnToPool(returnMode) + return + } + + c.close(closeBlock, returnMode) +} + +func (c *ctx) BlockingCloseReset() { + returnMode := reuse + parent := c.parentCtx() + if parent != nil { + if !parent.IsClosed() { + parent.BlockingCloseReset() + } + c.tryReturnToPool(returnMode) + return + } + + c.close(closeBlock, returnMode) + c.Reset() +} + +func (c *ctx) close(mode closeMode, returnMode returnToPoolMode) { + if c.Lock(); c.done { + c.Unlock() + return + } + + c.done = true + + // Capture finalizeables to avoid concurrent r/w if Reset + // is used after a caller waits for the finalizers to finish + f := c.finalizeables + c.finalizeables = nil + + c.Unlock() + + if f == nil { + c.tryReturnToPool(returnMode) + return + } + + switch mode { + case closeAsync: + go c.finalize(f, returnMode) + case closeBlock: + c.finalize(f, returnMode) + } +} + +func (c *ctx) finalize(f *finalizeableList, returnMode returnToPoolMode) { + // Wait for dependencies. + c.wg.Wait() + + // Now call finalizers. + for elem := f.Front(); elem != nil; elem = elem.Next() { + if elem.Value.finalizer != nil { + elem.Value.finalizer.Finalize() + } + if elem.Value.closer != nil { + elem.Value.closer.Close() + } + } + + if c.pool != nil { + // NB(r): Always return finalizeables, only the + // context itself might want to be reused immediately. + c.pool.putFinalizeablesList(f) + } + + c.tryReturnToPool(returnMode) +} + +func (c *ctx) Reset() { + parent := c.parentCtx() + if parent != nil { + parent.Reset() + return + } + + c.Lock() + c.done, c.finalizeables, c.goCtx, c.checkedAndNotSampled = false, nil, nil, false + c.Unlock() +} + +func (c *ctx) tryReturnToPool(returnMode returnToPoolMode) { + if c.pool == nil || returnMode != returnToPool { + return + } + + c.Reset() + c.pool.Put(c) +} + +func (c *ctx) newChildContext() Context { + var childCtx *ctx + if c.pool != nil { + pooled, ok := c.pool.Get().(*ctx) + if ok { + childCtx = pooled + } + } + + if childCtx == nil { + childCtx = newContext() + } + + childCtx.setParentCtx(c) + return childCtx +} + +func (c *ctx) setParentCtx(parentCtx Context) { + c.Lock() + c.parent = parentCtx + c.Unlock() +} + +func (c *ctx) parentCtx() Context { + c.RLock() + parent := c.parent + c.RUnlock() + + return parent +} + +func (c *ctx) StartSampledTraceSpan(name string) (Context, opentracing.Span, bool) { + goCtx, exists := c.GoContext() + if !exists || c.checkedAndNotSampled { + return c, noopTracer.StartSpan(name), false + } + + childGoCtx, span, sampled := StartSampledTraceSpan(goCtx, name) + if !sampled { + c.checkedAndNotSampled = true + return c, noopTracer.StartSpan(name), false + } + + child := c.newChildContext() + child.SetGoContext(childGoCtx) + return child, span, true +} + +func (c *ctx) StartTraceSpan(name string) (Context, opentracing.Span) { + ctx, sp, _ := c.StartSampledTraceSpan(name) + return ctx, sp +} + +// StartSampledTraceSpan starts a span that may or may not be sampled and will +// return whether it was sampled or not. +func StartSampledTraceSpan(ctx stdctx.Context, name string, opts ...opentracing.StartSpanOption) (stdctx.Context, opentracing.Span, bool) { + sp, spCtx := xopentracing.StartSpanFromContext(ctx, name, opts...) + sampled := spanIsSampled(sp) + if !sampled { + return ctx, noopTracer.StartSpan(name), false + } + return spCtx, sp, true +} + +func spanIsSampled(sp opentracing.Span) bool { + if sp == nil { + return false + } + + // Until OpenTracing supports the `IsSampled()` method, we need to cast to a Jaeger/Lightstep/etc. spans. + // See https://github.com/opentracing/specification/issues/92 for more information. + spanCtx := sp.Context() + jaegerSpCtx, ok := spanCtx.(jaeger.SpanContext) + if ok && jaegerSpCtx.IsSampled() { + return true + } + + lightstepSpCtx, ok := spanCtx.(lightstep.SpanContext) + if ok && lightstepSpCtx.TraceID != 0 { + return true + } + + mockSpCtx, ok := spanCtx.(mocktracer.MockSpanContext) + if ok && mockSpCtx.Sampled { + return true + } + + return false +} diff --git a/vendor/github.com/m3db/m3/src/x/context/finalizeable_list_gen.go b/vendor/github.com/m3db/m3/src/x/context/finalizeable_list_gen.go new file mode 100644 index 00000000..f8d7eadd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/context/finalizeable_list_gen.go @@ -0,0 +1,353 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package context + +import ( + "sync" + + "github.com/m3db/m3/src/x/pool" +) + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This is a doubly linked list with its internal elements pooled. This allows +// the list to be reused as a shared resource to prevent unnecessary +// allocations/GC. + +// This implementation is a modification from Go's container/list source code. +// Here is its license: + +// 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. + +// finalizeableElement is an element of a linked list. +type finalizeableElement struct { + // Next and previous pointers in the doubly-linked list of elements. + // To simplify the implementation, internally a list l is implemented + // as a ring, such that &l.root is both the next element of the last + // list element (l.Back()) and the previous element of the first list + // element (l.Front()). + next, prev *finalizeableElement + + // The list to which this element belongs. + list *finalizeableList + + // The value stored with this element. + Value finalizeable +} + +// Next returns the next list element or nil. +func (e *finalizeableElement) Next() *finalizeableElement { + if p := e.next; e.list != nil && p != &e.list.root { + return p + } + return nil +} + +// Prev returns the previous list element or nil. +func (e *finalizeableElement) Prev() *finalizeableElement { + if p := e.prev; e.list != nil && p != &e.list.root { + return p + } + return nil +} + +// finalizeableList represents a doubly linked list. +// The zero value for finalizeableList is an empty list ready to use. +type finalizeableList struct { + root finalizeableElement // sentinel list element, only &root, root.prev, and root.next are used + len int // current list length excluding (this) sentinel element + Pool *finalizeableElementPool +} + +// Init initializes or clears list l. +func (l *finalizeableList) Init() *finalizeableList { + l.root.next = &l.root + l.root.prev = &l.root + l.len = 0 + if l.Pool == nil { + // Use a static pool at least, otherwise each time + // we create a list with no pool we create a wholly + // new pool of finalizeables (4096 of them). + defaultElementPoolOnce.Do(initElementPool) + l.Pool = defaultElementPool + } + return l +} + +var ( + defaultElementPoolOnce sync.Once + defaultElementPool *finalizeableElementPool +) + +// define as a static method so lambda alloc not required +// when passing function pointer to sync.Once.Do. +func initElementPool() { + defaultElementPool = newFinalizeableElementPool(nil) +} + +// newFinalizeableList returns an initialized list. +func newFinalizeableList(p *finalizeableElementPool) *finalizeableList { + l := &finalizeableList{Pool: p} + return l.Init() +} + +// Len returns the number of elements of list l. +// The complexity is O(1). +func (l *finalizeableList) Len() int { return l.len } + +// Front returns the first element of list l or nil if the list is empty. +func (l *finalizeableList) Front() *finalizeableElement { + if l.len == 0 { + return nil + } + return l.root.next +} + +// Back returns the last element of list l or nil if the list is empty. +func (l *finalizeableList) Back() *finalizeableElement { + if l.len == 0 { + return nil + } + return l.root.prev +} + +// lazyInit lazily initializes a zero List value. +func (l *finalizeableList) lazyInit() { + if l.root.next == nil { + l.Init() + } +} + +// insert inserts e after at, increments l.len, and returns e. +func (l *finalizeableList) insert(e, at *finalizeableElement) *finalizeableElement { + n := at.next + at.next = e + e.prev = at + e.next = n + n.prev = e + e.list = l + l.len++ + return e +} + +// insertValue is a convenience wrapper for inserting using the list's pool. +func (l *finalizeableList) insertValue(v finalizeable, at *finalizeableElement) *finalizeableElement { + e := l.Pool.get() + e.Value = v + return l.insert(e, at) +} + +// remove removes e from its list, decrements l.len, and returns e. +func (l *finalizeableList) remove(e *finalizeableElement) *finalizeableElement { + e.prev.next = e.next + e.next.prev = e.prev + e.next = nil // avoid memory leaks + e.prev = nil // avoid memory leaks + e.list = nil + l.len-- + return e +} + +// Remove removes e from l if e is an element of list l. +// It returns the element value e.Value. +// The element must not be nil. +func (l *finalizeableList) Remove(e *finalizeableElement) finalizeable { + if e.list == l { + // if e.list == l, l must have been initialized when e was inserted + // in l or l == nil (e is a zero Element) and l.remove will crash. + l.remove(e) + l.Pool.put(e) + } + return e.Value +} + +// PushFront inserts a new element e with value v at the front of list l and returns e. +func (l *finalizeableList) PushFront(v finalizeable) *finalizeableElement { + l.lazyInit() + return l.insertValue(v, &l.root) +} + +// PushBack inserts a new element e with value v at the back of list l and returns e. +func (l *finalizeableList) PushBack(v finalizeable) *finalizeableElement { + l.lazyInit() + return l.insertValue(v, l.root.prev) +} + +// InsertBefore inserts a new element e with value v immediately before mark and returns e. +// If mark is not an element of l, the list is not modified. +// The mark must not be nil. +func (l *finalizeableList) InsertBefore(v finalizeable, mark *finalizeableElement) *finalizeableElement { + if mark.list != l { + return nil + } + // see comment in List.Remove about initialization of l + return l.insertValue(v, mark.prev) +} + +// InsertAfter inserts a new element e with value v immediately after mark and returns e. +// If mark is not an element of l, the list is not modified. +// The mark must not be nil. +func (l *finalizeableList) InsertAfter(v finalizeable, mark *finalizeableElement) *finalizeableElement { + if mark.list != l { + return nil + } + // see comment in List.Remove about initialization of l + return l.insertValue(v, mark) +} + +// MoveToFront moves element e to the front of list l. +// If e is not an element of l, the list is not modified. +// The element must not be nil. +func (l *finalizeableList) MoveToFront(e *finalizeableElement) { + if e.list != l || l.root.next == e { + return + } + // see comment in List.Remove about initialization of l + l.insert(l.remove(e), &l.root) +} + +// MoveToBack moves element e to the back of list l. +// If e is not an element of l, the list is not modified. +// The element must not be nil. +func (l *finalizeableList) MoveToBack(e *finalizeableElement) { + if e.list != l || l.root.prev == e { + return + } + // see comment in List.Remove about initialization of l + l.insert(l.remove(e), l.root.prev) +} + +// MoveBefore moves element e to its new position before mark. +// If e or mark is not an element of l, or e == mark, the list is not modified. +// The element and mark must not be nil. +func (l *finalizeableList) MoveBefore(e, mark *finalizeableElement) { + if e.list != l || e == mark || mark.list != l { + return + } + l.insert(l.remove(e), mark.prev) +} + +// MoveAfter moves element e to its new position after mark. +// If e or mark is not an element of l, or e == mark, the list is not modified. +// The element and mark must not be nil. +func (l *finalizeableList) MoveAfter(e, mark *finalizeableElement) { + if e.list != l || e == mark || mark.list != l { + return + } + l.insert(l.remove(e), mark) +} + +// PushBackList inserts a copy of an other list at the back of list l. +// The lists l and other may be the same. They must not be nil. +func (l *finalizeableList) PushBackList(other *finalizeableList) { + l.lazyInit() + for i, e := other.Len(), other.Front(); i > 0; i, e = i-1, e.Next() { + l.insertValue(e.Value, l.root.prev) + } +} + +// PushFrontList inserts a copy of an other list at the front of list l. +// The lists l and other may be the same. They must not be nil. +func (l *finalizeableList) PushFrontList(other *finalizeableList) { + l.lazyInit() + for i, e := other.Len(), other.Back(); i > 0; i, e = i-1, e.Prev() { + l.insertValue(e.Value, &l.root) + } +} + +// Reset resets list l for reuse and puts all elements back into the pool. +func (l *finalizeableList) Reset() { + for e := l.Back(); e != nil; e = l.Back() { + l.Remove(e) + } +} + +// finalizeableElementPool provides a pool for Elements. +type finalizeableElementPool struct { + pool pool.ObjectPool +} + +// Get gets an Element from the pool. +func (p *finalizeableElementPool) get() *finalizeableElement { + return p.pool.Get().(*finalizeableElement) +} + +// Put puts an Element back into the pool. +func (p *finalizeableElementPool) put(e *finalizeableElement) { + p.pool.Put(e) +} + +// newFinalizeableElementPool creates a new generic ElementPool. +func newFinalizeableElementPool(opts pool.ObjectPoolOptions) *finalizeableElementPool { + p := &finalizeableElementPool{pool: pool.NewObjectPool(opts)} + p.pool.Init(func() interface{} { + return &finalizeableElement{} + }) + return p +} diff --git a/vendor/github.com/m3db/m3/src/x/context/options.go b/vendor/github.com/m3db/m3/src/x/context/options.go new file mode 100644 index 00000000..facc837b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/context/options.go @@ -0,0 +1,56 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package context + +import "github.com/m3db/m3/src/x/pool" + +type opts struct { + contextPoolOpts pool.ObjectPoolOptions + finalizerPoolOpts pool.ObjectPoolOptions +} + +// NewOptions returns a new Options object. +func NewOptions() Options { + return &opts{ + contextPoolOpts: pool.NewObjectPoolOptions(), + finalizerPoolOpts: pool.NewObjectPoolOptions(), + } +} + +func (o *opts) SetContextPoolOptions(po pool.ObjectPoolOptions) Options { + opts := *o + opts.contextPoolOpts = po + return &opts +} + +func (o *opts) ContextPoolOptions() pool.ObjectPoolOptions { + return o.contextPoolOpts +} + +func (o *opts) SetFinalizerPoolOptions(po pool.ObjectPoolOptions) Options { + opts := *o + opts.finalizerPoolOpts = po + return &opts +} + +func (o *opts) FinalizerPoolOptions() pool.ObjectPoolOptions { + return o.finalizerPoolOpts +} diff --git a/vendor/github.com/m3db/m3/src/x/context/pool.go b/vendor/github.com/m3db/m3/src/x/context/pool.go new file mode 100644 index 00000000..30907fe8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/context/pool.go @@ -0,0 +1,69 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package context + +import ( + "github.com/m3db/m3/src/x/pool" +) + +type poolOfContexts struct { + finalizeablesListPool pool.ObjectPool + finalizeablesElementPool *finalizeableElementPool + ctxPool pool.ObjectPool +} + +// NewPool creates a new context pool. +func NewPool(opts Options) Pool { + p := &poolOfContexts{ + finalizeablesListPool: pool.NewObjectPool(opts.ContextPoolOptions()), + finalizeablesElementPool: newFinalizeableElementPool(opts.FinalizerPoolOptions()), + ctxPool: pool.NewObjectPool(opts.ContextPoolOptions()), + } + p.finalizeablesListPool.Init(func() interface{} { + return &finalizeableList{Pool: p.finalizeablesElementPool} + }) + p.ctxPool.Init(func() interface{} { + return newPooledContext(p) + }) + + return p +} + +func (p *poolOfContexts) Get() Context { + return p.ctxPool.Get().(Context) +} + +func (p *poolOfContexts) Put(context Context) { + p.ctxPool.Put(context) +} + +func (p *poolOfContexts) getFinalizeablesList() *finalizeableList { + return p.finalizeablesListPool.Get().(*finalizeableList) +} + +func (p *poolOfContexts) putFinalizeablesList(v *finalizeableList) { + emptyValue := finalizeable{} + for elem := v.Front(); elem != nil; elem = elem.Next() { + elem.Value = emptyValue + } + v.Reset() + p.finalizeablesListPool.Put(v) +} diff --git a/vendor/github.com/m3db/m3/src/x/context/types.go b/vendor/github.com/m3db/m3/src/x/context/types.go new file mode 100644 index 00000000..bf152f05 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/context/types.go @@ -0,0 +1,123 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package context + +import ( + stdctx "context" + + "github.com/m3db/m3/src/x/pool" + "github.com/m3db/m3/src/x/resource" + + "github.com/opentracing/opentracing-go" +) + +// Cancellable is an object that can be cancelled. +type Cancellable interface { + // IsCancelled determines whether the object is cancelled. + IsCancelled() bool + + // Cancel cancels the object. + Cancel() + + // Reset resets the object. + Reset() +} + +// Context provides context to an operation. +type Context interface { + // IsClosed returns whether the context is closed. + IsClosed() bool + + // RegisterFinalizer will register a resource finalizer. + RegisterFinalizer(resource.Finalizer) + + // RegisterCloser will register a resource closer. + RegisterCloser(resource.Closer) + + // DependsOn will register a blocking context that + // must complete first before finalizers can be called. + DependsOn(Context) + + // Close will close the context. + Close() + + // BlockingClose will close the context and call the + // registered finalizers in a blocking manner after waiting + // for any dependent contexts to close. After calling + // the context becomes safe to reset and reuse again + // if and only if it is not a pooled context. + BlockingClose() + + // Reset will reset the context for reuse. + Reset() + + // BlockingCloseReset will close the context and call the + // registered finalizers in a blocking manner after waiting + // for any dependent contexts to close. After calling + // the context becomes reset and is safe for reuse again as it + // will not be returned to a pool. + BlockingCloseReset() + + // GoContext returns the Go std context. + GoContext() (stdctx.Context, bool) + + // SetGoContext sets the Go std context. + SetGoContext(stdctx.Context) + + // StartTraceSpan starts a new span and returns a child ctx. + StartTraceSpan(string) (Context, opentracing.Span) + + // StartSampledTraceSpan starts a new span and returns a child ctx + // and a bool if the span is being sampled. This is used over StartTraceSpan() + // for hot paths where performance is crucial. + StartSampledTraceSpan(string) (Context, opentracing.Span, bool) +} + +// Pool provides a pool for contexts. +type Pool interface { + // Get provides a context from the pool. + Get() Context + + // Put returns a context to the pool. + Put(Context) +} + +// Options controls knobs for context pooling. +type Options interface { + // SetContextPoolOptions sets the context pool options. + SetContextPoolOptions(pool.ObjectPoolOptions) Options + + // ContextPoolOptions returns the context pool options. + ContextPoolOptions() pool.ObjectPoolOptions + + // SetFinalizerPoolOptions sets the finalizer pool options. + SetFinalizerPoolOptions(pool.ObjectPoolOptions) Options + + // FinalizerPoolOptions returns the finalizer pool options. + FinalizerPoolOptions() pool.ObjectPoolOptions +} + +// contextPool is the internal pool interface for contexts. +type contextPool interface { + Pool + getFinalizeablesList() *finalizeableList + putFinalizeablesList(v *finalizeableList) +} diff --git a/vendor/github.com/m3db/m3/src/x/cost/enforcer.go b/vendor/github.com/m3db/m3/src/x/cost/enforcer.go new file mode 100644 index 00000000..56677356 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/cost/enforcer.go @@ -0,0 +1,176 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package cost + +import ( + "fmt" +) + +const ( + defaultCostExceededErrorFmt = "limit reached (current = %v, limit = %v)" +) + +var ( + noopManager = NewStaticLimitManager( + NewLimitManagerOptions(). + SetDefaultLimit(Limit{ + Threshold: maxCost, + Enabled: false, + }, + ), + ) + noopEnforcer = NewEnforcer(noopManager, NewNoopTracker(), nil) +) + +// Report is a report on the cost limits of an enforcer. +type Report struct { + Cost + Error error +} + +// enforcer enforces cost limits for operations. +type enforcer struct { + LimitManager + tracker Tracker + + costMsg string + metrics EnforcerReporter +} + +// NewEnforcer returns a new enforcer for cost limits. +func NewEnforcer(m LimitManager, t Tracker, opts EnforcerOptions) Enforcer { + if opts == nil { + opts = NewEnforcerOptions() + } + + reporter := opts.Reporter() + if reporter == nil { + reporter = NoopEnforcerReporter() + } + + return &enforcer{ + LimitManager: m, + tracker: t, + costMsg: opts.CostExceededMessage(), + metrics: reporter, + } +} + +func (e *enforcer) Reporter() EnforcerReporter { + return e.metrics +} + +// Add adds the cost of an operation to the enforcer's current total. If the operation exceeds +// the enforcer's limit the enforcer will return a CostLimit error in addition to the new total. +func (e *enforcer) Add(cost Cost) Report { + e.metrics.ReportCost(cost) + current := e.tracker.Add(cost) + e.metrics.ReportCurrent(current) + + limit := e.Limit() + overLimit := e.checkLimit(current, limit) + + if overLimit != nil { + // Emit metrics on number of operations that are over the limit even when not enabled. + e.metrics.ReportOverLimit(limit.Enabled) + } + + return Report{ + Cost: current, + Error: overLimit, + } +} + +// State returns the current state of the enforcer. +func (e *enforcer) State() (Report, Limit) { + cost := e.tracker.Current() + l := e.Limit() + err := e.checkLimit(cost, l) + r := Report{ + Cost: cost, + Error: err, + } + return r, l +} + +// Clone clones the current enforcer. The new enforcer uses the same Estimator and LimitManager +// as e buts its Tracker is independent. +func (e *enforcer) Clone() Enforcer { + return &enforcer{ + LimitManager: e.LimitManager, + tracker: NewTracker(), + costMsg: e.costMsg, + metrics: e.metrics, + } +} + +func (e *enforcer) checkLimit(cost Cost, limit Limit) error { + if cost < limit.Threshold || !limit.Enabled { + return nil + } + + return NewCostExceededError(e.costMsg, cost, limit.Threshold) +} + +type costExceededError struct { + Threshold Cost + Current Cost + CustomMsg string +} + +func (ce costExceededError) Error() string { + baseMsg := fmt.Sprintf( + defaultCostExceededErrorFmt, + float64(ce.Current), + float64(ce.Threshold), + ) + if ce.CustomMsg == "" { + return baseMsg + } + + return fmt.Sprintf("%s: %s", ce.CustomMsg, baseMsg) +} + +// NewCostExceededError returns an error for going over an Enforcer's limit. +func NewCostExceededError(customMessage string, cost Cost, threshold Cost) error { + return costExceededError{ + CustomMsg: customMessage, + Current: cost, + Threshold: threshold, + } +} + +// NoopEnforcer returns a new enforcer that always returns a current cost of 0 and +// is always disabled. +func NoopEnforcer() Enforcer { + return noopEnforcer +} + +type noopEnforcerReporter struct{} + +func (noopEnforcerReporter) ReportCost(c Cost) {} +func (noopEnforcerReporter) ReportCurrent(c Cost) {} +func (noopEnforcerReporter) ReportOverLimit(enabled bool) {} + +// NoopEnforcerReporter returns an EnforcerReporter which does nothing on all events. +func NoopEnforcerReporter() EnforcerReporter { + return noopEnforcerReporter{} +} diff --git a/vendor/github.com/m3db/m3/src/x/cost/limit_manager.go b/vendor/github.com/m3db/m3/src/x/cost/limit_manager.go new file mode 100644 index 00000000..4faa188f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/cost/limit_manager.go @@ -0,0 +1,177 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package cost + +import ( + "fmt" + "sync" + "time" + + "github.com/m3db/m3/src/cluster/kv" + "github.com/m3db/m3/src/cluster/kv/util" + + "github.com/uber-go/tally" + "go.uber.org/atomic" +) + +type limitManager struct { + sync.RWMutex + + threshold *atomic.Float64 + enabled *atomic.Bool + + thresholdWatcher kv.ValueWatch + enabledWatcher kv.ValueWatch + closed bool + closeCh chan struct{} + reportInterval time.Duration + metrics limitManagerMetrics +} + +// NewDynamicLimitManager returns a new LimitWatcher which watches for updates to the cost limit +// of an operation in KV. +func NewDynamicLimitManager( + store kv.Store, + kvLimitKey, kvEnabledKey string, + opts LimitManagerOptions, +) (LimitManager, error) { + if opts == nil { + opts = NewLimitManagerOptions() + } + iOpts := opts.InstrumentOptions() + + var ( + limit = opts.DefaultLimit() + defaultThreshold = float64(limit.Threshold) + defaultEnabled = limit.Enabled + m = &limitManager{ + threshold: atomic.NewFloat64(defaultThreshold), + enabled: atomic.NewBool(defaultEnabled), + closeCh: make(chan struct{}), + reportInterval: iOpts.ReportInterval(), + metrics: newLimitManagerMetrics(iOpts.MetricsScope()), + } + ) + + watchOpts := util.NewOptions().SetLogger(iOpts.Logger()) + thresholdWatcher, err := util.WatchAndUpdateAtomicFloat64( + store, + kvLimitKey, + m.threshold, + defaultThreshold, + watchOpts.SetValidateFn(opts.ValidateLimitFn()), + ) + if err != nil { + return nil, fmt.Errorf("unable to watch key '%s': %v", kvLimitKey, err) + } + m.thresholdWatcher = thresholdWatcher + + enabledWatcher, err := util.WatchAndUpdateAtomicBool( + store, + kvEnabledKey, + m.enabled, + defaultEnabled, + watchOpts, + ) + if err != nil { + return nil, fmt.Errorf("unable to watch key '%s': %v", kvEnabledKey, err) + } + m.enabledWatcher = enabledWatcher + + return m, nil +} + +func (m *limitManager) Limit() Limit { + return Limit{ + Threshold: Cost(m.threshold.Load()), + Enabled: m.enabled.Load(), + } +} + +func (m *limitManager) Close() { + m.Lock() + defer m.Unlock() + if m.closed { + return + } + if m.thresholdWatcher != nil { + m.thresholdWatcher.Close() + } + if m.enabledWatcher != nil { + m.enabledWatcher.Close() + } + close(m.closeCh) + m.closed = true +} + +func (m *limitManager) Report() { + ticker := time.NewTicker(m.reportInterval) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + limit := m.Limit() + m.metrics.threshold.Update(float64(limit.Threshold)) + + var v float64 + if limit.Enabled { + v = 1 + } + m.metrics.enabled.Update(v) + + case <-m.closeCh: + return + } + } +} + +// NewStaticLimitManager returns a new LimitManager which always returns the same limit. +func NewStaticLimitManager(opts LimitManagerOptions) LimitManager { + if opts == nil { + opts = NewLimitManagerOptions() + } + iOpts := opts.InstrumentOptions() + + var ( + l = opts.DefaultLimit() + m = &limitManager{ + threshold: atomic.NewFloat64(float64(l.Threshold)), + enabled: atomic.NewBool(l.Enabled), + closeCh: make(chan struct{}), + reportInterval: iOpts.ReportInterval(), + metrics: newLimitManagerMetrics(iOpts.MetricsScope()), + } + ) + return m +} + +type limitManagerMetrics struct { + threshold tally.Gauge + enabled tally.Gauge +} + +func newLimitManagerMetrics(s tally.Scope) limitManagerMetrics { + return limitManagerMetrics{ + threshold: s.Gauge("threshold"), + enabled: s.Gauge("enabled"), + } +} diff --git a/vendor/github.com/m3db/m3/src/x/cost/options.go b/vendor/github.com/m3db/m3/src/x/cost/options.go new file mode 100644 index 00000000..9378cf8a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/cost/options.go @@ -0,0 +1,167 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package cost + +import ( + "github.com/m3db/m3/src/cluster/kv/util" + "github.com/m3db/m3/src/x/instrument" + + "github.com/uber-go/tally" +) + +// LimitManagerOptions provides a set of options for a LimitManager. +type LimitManagerOptions interface { + // SetDefaultLimit sets the default limit for the manager. + SetDefaultLimit(val Limit) LimitManagerOptions + + // DefaultLimit returns the default limit for the manager. + DefaultLimit() Limit + + // SetValidateLimitFn sets the validation function applied to updates to the cost limit. + SetValidateLimitFn(val util.ValidateFn) LimitManagerOptions + + // ValidateLimitFn returns the validation function applied to updates to the cost limit. + ValidateLimitFn() util.ValidateFn + + // SetInstrumentOptions sets the instrument options. + SetInstrumentOptions(val instrument.Options) LimitManagerOptions + + // InstrumentOptions returns the instrument options. + InstrumentOptions() instrument.Options +} + +type limitManagerOptions struct { + defaultLimit Limit + validateLimitFn util.ValidateFn + iOpts instrument.Options +} + +// NewLimitManagerOptions returns a new set of LimitManager options. +func NewLimitManagerOptions() LimitManagerOptions { + return &limitManagerOptions{ + defaultLimit: Limit{ + Threshold: maxCost, + Enabled: false, + }, + iOpts: instrument.NewOptions(), + } +} + +func (o *limitManagerOptions) SetDefaultLimit(val Limit) LimitManagerOptions { + opts := *o + opts.defaultLimit = val + return &opts +} + +func (o *limitManagerOptions) DefaultLimit() Limit { + return o.defaultLimit +} + +func (o *limitManagerOptions) SetValidateLimitFn(val util.ValidateFn) LimitManagerOptions { + opts := *o + opts.validateLimitFn = val + return &opts +} + +func (o *limitManagerOptions) ValidateLimitFn() util.ValidateFn { + return o.validateLimitFn +} + +func (o *limitManagerOptions) SetInstrumentOptions(val instrument.Options) LimitManagerOptions { + opts := *o + opts.iOpts = val + return &opts +} + +func (o *limitManagerOptions) InstrumentOptions() instrument.Options { + return o.iOpts +} + +// EnforcerOptions provides a set of options for an enforcer. +type EnforcerOptions interface { + // Reporter is the reporter which will be used on Enforcer events. + Reporter() EnforcerReporter + + // SetReporter sets Reporter() + SetReporter(r EnforcerReporter) EnforcerOptions + + // SetCostExceededMessage sets CostExceededMessage + SetCostExceededMessage(val string) EnforcerOptions + + // CostExceededMessage returns the message appended to cost limit errors to provide + // more context on the cost limit that was exceeded. + CostExceededMessage() string +} + +type enforcerOptions struct { + msg string + buckets tally.ValueBuckets + reporter EnforcerReporter + iOpts instrument.Options +} + +// NewEnforcerOptions returns a new set of enforcer options. +func NewEnforcerOptions() EnforcerOptions { + return &enforcerOptions{ + buckets: tally.MustMakeExponentialValueBuckets(1, 2, 20), + iOpts: instrument.NewOptions(), + } +} + +func (o *enforcerOptions) Reporter() EnforcerReporter { + return o.reporter +} + +func (o *enforcerOptions) SetReporter(r EnforcerReporter) EnforcerOptions { + opts := *o + opts.reporter = r + return &opts +} + +func (o *enforcerOptions) SetCostExceededMessage(val string) EnforcerOptions { + opts := *o + opts.msg = val + return &opts +} + +func (o *enforcerOptions) CostExceededMessage() string { + return o.msg +} + +func (o *enforcerOptions) SetValueBuckets(val tally.ValueBuckets) EnforcerOptions { + opts := *o + opts.buckets = val + return &opts +} + +func (o *enforcerOptions) ValueBuckets() tally.ValueBuckets { + return o.buckets +} + +func (o *enforcerOptions) SetInstrumentOptions(val instrument.Options) EnforcerOptions { + opts := *o + opts.iOpts = val + return &opts +} + +func (o *enforcerOptions) InstrumentOptions() instrument.Options { + return o.iOpts +} diff --git a/vendor/github.com/m3db/m3/src/x/cost/tracker.go b/vendor/github.com/m3db/m3/src/x/cost/tracker.go new file mode 100644 index 00000000..9599cdc5 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/cost/tracker.go @@ -0,0 +1,40 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package cost + +import "go.uber.org/atomic" + +type tracker struct { + total *atomic.Float64 +} + +// NewTracker returns a new Tracker which maintains a simple running total of all the +// costs it has seen so far. +func NewTracker() Tracker { return tracker{total: atomic.NewFloat64(0)} } +func (t tracker) Add(c Cost) Cost { return Cost(t.total.Add(float64(c))) } +func (t tracker) Current() Cost { return Cost(t.total.Load()) } + +type noopTracker struct{} + +// NewNoopTracker returns a tracker which always always returns a cost of 0. +func NewNoopTracker() Tracker { return noopTracker{} } +func (t noopTracker) Add(c Cost) Cost { return 0 } +func (t noopTracker) Current() Cost { return 0 } diff --git a/vendor/github.com/m3db/m3/src/x/cost/types.go b/vendor/github.com/m3db/m3/src/x/cost/types.go new file mode 100644 index 00000000..0e103d42 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/cost/types.go @@ -0,0 +1,85 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package cost is a library providing utilities for estimating the cost of operations +// and enforcing limits on them. The primary type of interest is Enforcer, which tracks the cost of operations, +// and errors when that cost goes over a particular limit. +package cost + +import ( + "math" +) + +// Cost represents the cost of an operation. +type Cost float64 + +const ( + // maxCost is the maximum cost of an operation. + maxCost = Cost(math.MaxFloat64) +) + +// Limit encapulates the configuration of a cost limit for an operation. +type Limit struct { + Threshold Cost + Enabled bool +} + +// LimitManager manages configuration of a cost limit for an operation. +type LimitManager interface { + // Limit returns the current cost limit for an operation. + Limit() Limit + + // Report reports metrics on the state of the manager. + Report() + + // Close closes the manager. + Close() +} + +// Tracker tracks the cost of operations seen so far. +type Tracker interface { + // Add adds c to the tracker's current cost total and returns the new total. + Add(c Cost) Cost + + // Current returns the tracker's current cost total. + Current() Cost +} + +// Enforcer instances enforce cost limits for operations. +type Enforcer interface { + Add(op Cost) Report + State() (Report, Limit) + Limit() Limit + Clone() Enforcer + Reporter() EnforcerReporter +} + +// An EnforcerReporter is a listener for Enforcer events. +type EnforcerReporter interface { + // ReportCost is called on every call to Enforcer#Add with the added cost + ReportCost(c Cost) + + // ReportCurrent reports the current total on every call to Enforcer#Add + ReportCurrent(c Cost) + + // ReportOverLimit is called every time an enforcer goes over its limit. enabled is true if the limit manager + // says the limit is currently enabled. + ReportOverLimit(enabled bool) +} diff --git a/vendor/github.com/m3db/m3/src/x/errors/errors.go b/vendor/github.com/m3db/m3/src/x/errors/errors.go new file mode 100644 index 00000000..22e40d1f --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/errors/errors.go @@ -0,0 +1,309 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package errors provides utilities for working with different types errors. +package errors + +import ( + "bytes" + "errors" + "fmt" +) + +// FirstError returns the first non nil error. +func FirstError(errs ...error) error { + for i := range errs { + if errs[i] != nil { + return errs[i] + } + } + return nil +} + +type containedError struct { + inner error +} + +func (e containedError) Error() string { + return e.inner.Error() +} + +func (e containedError) InnerError() error { + return e.inner +} + +// ContainedError is an error with a contained error. +type ContainedError interface { + InnerError() error +} + +// InnerError returns the packaged inner error if this is an error that +// contains another. +func InnerError(err error) error { + contained, ok := err.(ContainedError) + if !ok { + return nil + } + return contained.InnerError() +} + +type renamedError struct { + containedError + renamed error +} + +// NewRenamedError returns a new error that packages an inner error with +// a renamed error. +func NewRenamedError(inner, renamed error) error { + return renamedError{containedError{inner}, renamed} +} + +func (e renamedError) Error() string { + return e.renamed.Error() +} + +func (e renamedError) InnerError() error { + return e.inner +} + +type invalidParamsError struct { + containedError +} + +// Wrap wraps an error with a message but preserves the type of the error. +func Wrap(err error, msg string) error { + renamed := errors.New(msg + ": " + err.Error()) + return NewRenamedError(err, renamed) +} + +// Wrapf formats according to a format specifier and uses that string to +// wrap an error while still preserving the type of the error. +func Wrapf(err error, format string, args ...interface{}) error { + msg := fmt.Sprintf(format, args...) + return Wrap(err, msg) +} + +// NewInvalidParamsError creates a new invalid params error +func NewInvalidParamsError(inner error) error { + return invalidParamsError{containedError{inner}} +} + +func (e invalidParamsError) Error() string { + return e.inner.Error() +} + +func (e invalidParamsError) InnerError() error { + return e.inner +} + +// IsInvalidParams returns true if this is an invalid params error. +func IsInvalidParams(err error) bool { + return GetInnerInvalidParamsError(err) != nil +} + +// GetInnerInvalidParamsError returns an inner invalid params error +// if contained by this error, nil otherwise. +func GetInnerInvalidParamsError(err error) error { + for err != nil { + if _, ok := err.(invalidParamsError); ok { + return InnerError(err) + } + err = InnerError(err) + } + return nil +} + +type retryableError struct { + containedError +} + +// NewRetryableError creates a new retryable error. +func NewRetryableError(inner error) error { + return retryableError{containedError{inner}} +} + +func (e retryableError) Error() string { + return e.inner.Error() +} + +func (e retryableError) InnerError() error { + return e.inner +} + +// IsRetryableError returns true if this is a retryable error. +func IsRetryableError(err error) bool { + return GetInnerRetryableError(err) != nil +} + +// GetInnerRetryableError returns an inner retryable error +// if contained by this error, nil otherwise. +func GetInnerRetryableError(err error) error { + for err != nil { + if _, ok := err.(retryableError); ok { + return InnerError(err) + } + err = InnerError(err) + } + return nil +} + +type nonRetryableError struct { + containedError +} + +// NewNonRetryableError creates a new non-retryable error. +func NewNonRetryableError(inner error) error { + return nonRetryableError{containedError{inner}} +} + +func (e nonRetryableError) Error() string { + return e.inner.Error() +} + +func (e nonRetryableError) InnerError() error { + return e.inner +} + +// IsNonRetryableError returns true if this is a non-retryable error. +func IsNonRetryableError(err error) bool { + return GetInnerNonRetryableError(err) != nil +} + +// GetInnerNonRetryableError returns an inner non-retryable error +// if contained by this error, nil otherwise. +func GetInnerNonRetryableError(err error) error { + for err != nil { + if _, ok := err.(nonRetryableError); ok { + return InnerError(err) + } + err = InnerError(err) + } + return nil +} + +// MultiError is an immutable error that packages a list of errors. +// +// TODO(xichen): we may want to limit the number of errors included. +type MultiError struct { + err error // optimization for single error case + errors []error +} + +// NewMultiError creates a new MultiError object. +func NewMultiError() MultiError { + return MultiError{} +} + +// Empty returns true if the MultiError has no errors. +func (e MultiError) Empty() bool { + return e.err == nil +} + +func (e MultiError) Error() string { + if e.err == nil { + return "" + } + if len(e.errors) == 0 { + return e.err.Error() + } + var b bytes.Buffer + for i := range e.errors { + b.WriteString(e.errors[i].Error()) + b.WriteString("\n") + } + b.WriteString(e.err.Error()) + return b.String() +} + +// Errors returns all the errors to inspect individually. +func (e MultiError) Errors() []error { + if e.err == nil { + return nil // No errors + } + // Need to prepend the first error to result + // since we avoid allocating array if we don't need it + // when we accumulate the first error + result := make([]error, 1+len(e.errors)) + result[0] = e.err + copy(result[1:], e.errors) + return result +} + +// Add adds an error returns a new MultiError object. +func (e MultiError) Add(err error) MultiError { + if err == nil { + return e + } + me := e + if me.err == nil { + me.err = err + return me + } + me.errors = append(me.errors, me.err) + me.err = err + return me +} + +// FinalError returns all concatenated error messages if any. +func (e MultiError) FinalError() error { + if e.err == nil { + return nil + } + return e +} + +// LastError returns the last received error if any. +func (e MultiError) LastError() error { + if e.err == nil { + return nil + } + return e.err +} + +// NumErrors returns the total number of errors. +func (e MultiError) NumErrors() int { + if e.err == nil { + return 0 + } + return len(e.errors) + 1 +} + +// Errors is a slice of errors that itself is an error too. +type Errors []error + +// Error implements error. +func (e Errors) Error() string { + buf := bytes.NewBuffer(nil) + buf.WriteString("[") + for i, err := range e { + if err == nil { + buf.WriteString("") + } else { + buf.WriteString("<") + buf.WriteString(err.Error()) + buf.WriteString(">") + } + if i < len(e)-1 { + buf.WriteString(", ") + } + } + buf.WriteString("]") + return buf.String() +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/bytes_id.go b/vendor/github.com/m3db/m3/src/x/ident/bytes_id.go new file mode 100644 index 00000000..3f799026 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/bytes_id.go @@ -0,0 +1,113 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ident + +import ( + "bytes" +) + +// BytesID is a small utility type to avoid the heavy weight of a true ID +// implementation when using in high throughput places like keys in a map. +type BytesID []byte + +// var declaration to ensure package type BytesID implements ID +var _ ID = BytesID(nil) + +// Bytes returns the underlying byte slice of the bytes ID. +func (v BytesID) Bytes() []byte { + return v +} + +// String returns the bytes ID as a string. +func (v BytesID) String() string { + return string(v) +} + +// Equal returns whether the bytes ID is equal to a given ID. +func (v BytesID) Equal(value ID) bool { + return bytes.Equal(value.Bytes(), v) +} + +// NoFinalize is a no-op for a bytes ID as Finalize is already a no-op. +func (v BytesID) NoFinalize() { +} + +// IsNoFinalize is always true since BytesID is not pooled. +func (v BytesID) IsNoFinalize() bool { + return true +} + +// Finalize is a no-op for a bytes ID as it has no associated pool. +func (v BytesID) Finalize() { +} + +var _ ID = (*ReuseableBytesID)(nil) + +// ReuseableBytesID is a reuseable bytes ID, use with extreme care in +// places where the lifecycle is known (there is no checking with this +// ID). +type ReuseableBytesID struct { + bytes []byte +} + +// NewReuseableBytesID returns a new reuseable bytes ID, use with extreme +// care in places where the lifecycle is known (there is no checking with +// this ID). +func NewReuseableBytesID() *ReuseableBytesID { + return &ReuseableBytesID{} +} + +// Reset resets the bytes ID for reuse, make sure there are zero references +// to this ID from any other data structure at this point. +func (i *ReuseableBytesID) Reset(bytes []byte) { + i.bytes = bytes +} + +// Bytes implements ID. +func (i *ReuseableBytesID) Bytes() []byte { + return i.bytes +} + +// Equal implements ID. +func (i *ReuseableBytesID) Equal(value ID) bool { + return bytes.Equal(i.bytes, value.Bytes()) +} + +// NoFinalize implements ID. +func (i *ReuseableBytesID) NoFinalize() { +} + +// IsNoFinalize implements ID. +func (i *ReuseableBytesID) IsNoFinalize() bool { + // Reuseable bytes ID are always not able to not be finalized + // as this ID is reused with reset. + return false +} + +// Finalize implements ID. +func (i *ReuseableBytesID) Finalize() { + // Noop as it will be re-used. +} + +// String returns the bytes ID as a string. +func (i *ReuseableBytesID) String() string { + return string(i.bytes) +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/id_matcher.go b/vendor/github.com/m3db/m3/src/x/ident/id_matcher.go new file mode 100644 index 00000000..81151aad --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/id_matcher.go @@ -0,0 +1,53 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ident + +import ( + "fmt" + + "github.com/golang/mock/gomock" +) + +// IDMatcher is a gomock.Matcher that matches ID +type IDMatcher interface { + gomock.Matcher +} + +// NewIDMatcher returns a new IDMatcher +func NewIDMatcher(id string) IDMatcher { + return &idMatcher{id: StringID(id)} +} + +type idMatcher struct { + id ID +} + +func (m *idMatcher) Matches(x interface{}) bool { + id, ok := x.(ID) + if !ok { + return false + } + return m.id.Equal(id) +} + +func (m *idMatcher) String() string { + return fmt.Sprintf("id %s", m.id.String()) +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/ident_mock.go b/vendor/github.com/m3db/m3/src/x/ident/ident_mock.go new file mode 100644 index 00000000..5d717013 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/ident_mock.go @@ -0,0 +1,279 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/x/ident (interfaces: ID,TagIterator) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package ident is a generated GoMock package. +package ident + +import ( + "reflect" + + "github.com/golang/mock/gomock" +) + +// MockID is a mock of ID interface +type MockID struct { + ctrl *gomock.Controller + recorder *MockIDMockRecorder +} + +// MockIDMockRecorder is the mock recorder for MockID +type MockIDMockRecorder struct { + mock *MockID +} + +// NewMockID creates a new mock instance +func NewMockID(ctrl *gomock.Controller) *MockID { + mock := &MockID{ctrl: ctrl} + mock.recorder = &MockIDMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockID) EXPECT() *MockIDMockRecorder { + return m.recorder +} + +// Bytes mocks base method +func (m *MockID) Bytes() []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Bytes") + ret0, _ := ret[0].([]byte) + return ret0 +} + +// Bytes indicates an expected call of Bytes +func (mr *MockIDMockRecorder) Bytes() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Bytes", reflect.TypeOf((*MockID)(nil).Bytes)) +} + +// Equal mocks base method +func (m *MockID) Equal(arg0 ID) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Equal", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// Equal indicates an expected call of Equal +func (mr *MockIDMockRecorder) Equal(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Equal", reflect.TypeOf((*MockID)(nil).Equal), arg0) +} + +// Finalize mocks base method +func (m *MockID) Finalize() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Finalize") +} + +// Finalize indicates an expected call of Finalize +func (mr *MockIDMockRecorder) Finalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finalize", reflect.TypeOf((*MockID)(nil).Finalize)) +} + +// IsNoFinalize mocks base method +func (m *MockID) IsNoFinalize() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsNoFinalize") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsNoFinalize indicates an expected call of IsNoFinalize +func (mr *MockIDMockRecorder) IsNoFinalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsNoFinalize", reflect.TypeOf((*MockID)(nil).IsNoFinalize)) +} + +// NoFinalize mocks base method +func (m *MockID) NoFinalize() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "NoFinalize") +} + +// NoFinalize indicates an expected call of NoFinalize +func (mr *MockIDMockRecorder) NoFinalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NoFinalize", reflect.TypeOf((*MockID)(nil).NoFinalize)) +} + +// String mocks base method +func (m *MockID) String() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "String") + ret0, _ := ret[0].(string) + return ret0 +} + +// String indicates an expected call of String +func (mr *MockIDMockRecorder) String() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockID)(nil).String)) +} + +// MockTagIterator is a mock of TagIterator interface +type MockTagIterator struct { + ctrl *gomock.Controller + recorder *MockTagIteratorMockRecorder +} + +// MockTagIteratorMockRecorder is the mock recorder for MockTagIterator +type MockTagIteratorMockRecorder struct { + mock *MockTagIterator +} + +// NewMockTagIterator creates a new mock instance +func NewMockTagIterator(ctrl *gomock.Controller) *MockTagIterator { + mock := &MockTagIterator{ctrl: ctrl} + mock.recorder = &MockTagIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTagIterator) EXPECT() *MockTagIteratorMockRecorder { + return m.recorder +} + +// Close mocks base method +func (m *MockTagIterator) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockTagIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockTagIterator)(nil).Close)) +} + +// Current mocks base method +func (m *MockTagIterator) Current() Tag { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(Tag) + return ret0 +} + +// Current indicates an expected call of Current +func (mr *MockTagIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockTagIterator)(nil).Current)) +} + +// CurrentIndex mocks base method +func (m *MockTagIterator) CurrentIndex() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CurrentIndex") + ret0, _ := ret[0].(int) + return ret0 +} + +// CurrentIndex indicates an expected call of CurrentIndex +func (mr *MockTagIteratorMockRecorder) CurrentIndex() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CurrentIndex", reflect.TypeOf((*MockTagIterator)(nil).CurrentIndex)) +} + +// Duplicate mocks base method +func (m *MockTagIterator) Duplicate() TagIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Duplicate") + ret0, _ := ret[0].(TagIterator) + return ret0 +} + +// Duplicate indicates an expected call of Duplicate +func (mr *MockTagIteratorMockRecorder) Duplicate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Duplicate", reflect.TypeOf((*MockTagIterator)(nil).Duplicate)) +} + +// Err mocks base method +func (m *MockTagIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockTagIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockTagIterator)(nil).Err)) +} + +// Len mocks base method +func (m *MockTagIterator) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockTagIteratorMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockTagIterator)(nil).Len)) +} + +// Next mocks base method +func (m *MockTagIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockTagIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockTagIterator)(nil).Next)) +} + +// Remaining mocks base method +func (m *MockTagIterator) Remaining() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Remaining") + ret0, _ := ret[0].(int) + return ret0 +} + +// Remaining indicates an expected call of Remaining +func (mr *MockTagIteratorMockRecorder) Remaining() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remaining", reflect.TypeOf((*MockTagIterator)(nil).Remaining)) +} + +// Rewind mocks base method +func (m *MockTagIterator) Rewind() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Rewind") +} + +// Rewind indicates an expected call of Rewind +func (mr *MockTagIteratorMockRecorder) Rewind() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Rewind", reflect.TypeOf((*MockTagIterator)(nil).Rewind)) +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/identifier.go b/vendor/github.com/m3db/m3/src/x/ident/identifier.go new file mode 100644 index 00000000..00002fb2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/identifier.go @@ -0,0 +1,85 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ident + +import ( + "bytes" + + "github.com/m3db/m3/src/x/checked" +) + +// BinaryID constructs a new ID based on a binary value. +func BinaryID(v checked.Bytes) ID { + v.IncRef() + return &id{data: v} +} + +// StringID constructs a new ID based on a string value. +func StringID(str string) ID { + return BytesID([]byte(str)) +} + +type id struct { + data checked.Bytes + pool Pool + noFinalize bool +} + +// Bytes directly returns the underlying bytes of an ID, it is not safe +// to hold a reference to this slice and is only valid during the lifetime +// of the the ID itself. +func (v *id) Bytes() []byte { + if v.data == nil { + return nil + } + return v.data.Bytes() +} + +func (v *id) Equal(value ID) bool { + return bytes.Equal(v.Bytes(), value.Bytes()) +} + +func (v *id) NoFinalize() { + v.noFinalize = true +} + +func (v *id) IsNoFinalize() bool { + return v.noFinalize +} + +func (v *id) Finalize() { + if v.noFinalize { + return + } + v.data.DecRef() + v.data.Finalize() + v.data = nil + + if v.pool == nil { + return + } + + v.pool.Put(v) +} + +func (v *id) String() string { + return string(v.Bytes()) +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/identifier_pool.go b/vendor/github.com/m3db/m3/src/x/ident/identifier_pool.go new file mode 100644 index 00000000..8239d818 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/identifier_pool.go @@ -0,0 +1,226 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ident + +import ( + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/context" + "github.com/m3db/m3/src/x/pool" +) + +const ( + defaultCapacityOptions = 16 + defaultMaxCapacityOptions = 32 +) + +// PoolOptions is a set of pooling options. +type PoolOptions struct { + IDPoolOptions pool.ObjectPoolOptions + TagsPoolOptions pool.ObjectPoolOptions + TagsCapacity int + TagsMaxCapacity int + TagsIteratorPoolOptions pool.ObjectPoolOptions +} + +func (o PoolOptions) defaultsIfNotSet() PoolOptions { + if o.IDPoolOptions == nil { + o.IDPoolOptions = pool.NewObjectPoolOptions() + } + if o.TagsPoolOptions == nil { + o.TagsPoolOptions = pool.NewObjectPoolOptions() + } + if o.TagsCapacity == 0 { + o.TagsCapacity = defaultCapacityOptions + } + if o.TagsMaxCapacity == 0 { + o.TagsMaxCapacity = defaultMaxCapacityOptions + } + if o.TagsIteratorPoolOptions == nil { + o.TagsIteratorPoolOptions = pool.NewObjectPoolOptions() + } + return o +} + +// NewPool constructs a new simple Pool. +func NewPool( + bytesPool pool.CheckedBytesPool, + opts PoolOptions, +) Pool { + opts = opts.defaultsIfNotSet() + + p := &simplePool{ + bytesPool: bytesPool, + pool: pool.NewObjectPool(opts.IDPoolOptions), + tagArrayPool: newTagArrayPool(tagArrayPoolOpts{ + Options: opts.TagsPoolOptions, + Capacity: opts.TagsCapacity, + MaxCapacity: opts.TagsMaxCapacity, + }), + itersPool: pool.NewObjectPool(opts.TagsIteratorPoolOptions), + } + p.pool.Init(func() interface{} { + return &id{pool: p} + }) + p.tagArrayPool.Init() + p.itersPool.Init(func() interface{} { + return newTagSliceIter(Tags{}, nil, p) + }) + + return p +} + +type simplePool struct { + bytesPool pool.CheckedBytesPool + pool pool.ObjectPool + tagArrayPool tagArrayPool + itersPool pool.ObjectPool +} + +func (p *simplePool) GetBinaryID(ctx context.Context, v checked.Bytes) ID { + id := p.BinaryID(v) + ctx.RegisterFinalizer(id) + return id +} + +func (p *simplePool) BinaryID(v checked.Bytes) ID { + id := p.pool.Get().(*id) + v.IncRef() + id.pool, id.data = p, v + return id +} + +func (p *simplePool) GetBinaryTag( + ctx context.Context, + name checked.Bytes, + value checked.Bytes, +) Tag { + return Tag{ + Name: TagName(p.GetBinaryID(ctx, name)), + Value: TagValue(p.GetBinaryID(ctx, value)), + } +} + +func (p *simplePool) BinaryTag( + name checked.Bytes, + value checked.Bytes, +) Tag { + return Tag{ + Name: TagName(p.BinaryID(name)), + Value: TagValue(p.BinaryID(value)), + } +} + +func (p *simplePool) GetStringID(ctx context.Context, v string) ID { + id := p.StringID(v) + ctx.RegisterFinalizer(id) + return id +} + +func (p *simplePool) StringID(v string) ID { + data := p.bytesPool.Get(len(v)) + data.IncRef() + data.AppendAll([]byte(v)) + data.DecRef() + + return p.BinaryID(data) +} + +func (p *simplePool) GetTagsIterator(c context.Context) TagsIterator { + iter := p.itersPool.Get().(*tagSliceIter) + c.RegisterCloser(iter) + return iter +} + +func (p *simplePool) TagsIterator() TagsIterator { + return p.itersPool.Get().(*tagSliceIter) +} + +func (p *simplePool) Tags() Tags { + return Tags{ + values: p.tagArrayPool.Get(), + pool: p, + } +} + +func (p *simplePool) Put(v ID) { + p.pool.Put(v) +} + +func (p *simplePool) PutTag(t Tag) { + p.Put(t.Name) + p.Put(t.Value) +} + +func (p *simplePool) PutTags(t Tags) { + p.tagArrayPool.Put(t.values) +} + +func (p *simplePool) PutTagsIterator(iter TagsIterator) { + iter.Reset(Tags{}) + p.itersPool.Put(iter) +} + +func (p *simplePool) GetStringTag(ctx context.Context, name string, value string) Tag { + return Tag{ + Name: TagName(p.GetStringID(ctx, name)), + Value: TagValue(p.GetStringID(ctx, value)), + } +} + +func (p *simplePool) StringTag(name string, value string) Tag { + return Tag{ + Name: TagName(p.StringID(name)), + Value: TagValue(p.StringID(value)), + } +} + +func (p *simplePool) Clone(existing ID) ID { + var ( + id = p.pool.Get().(*id) + data = existing.Bytes() + newData = p.bytesPool.Get(len(data)) + ) + + newData.IncRef() + newData.AppendAll(data) + + id.pool, id.data = p, newData + + return id +} + +func (p *simplePool) CloneTag(t Tag) Tag { + return Tag{ + Name: p.Clone(t.Name), + Value: p.Clone(t.Value), + } +} + +func (p *simplePool) CloneTags(t Tags) Tags { + tags := p.tagArrayPool.Get()[:0] + for _, tag := range t.Values() { + tags = append(tags, p.CloneTag(tag)) + } + return Tags{ + values: tags, + pool: p, + } +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/iterator.go b/vendor/github.com/m3db/m3/src/x/ident/iterator.go new file mode 100644 index 00000000..ac6d2e87 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/iterator.go @@ -0,0 +1,161 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ident + +// NewIDsIterator returns a new Iterator over the given IDs. +func NewIDsIterator(ids ...ID) Iterator { + return NewIDSliceIterator(ids) +} + +// NewIDSliceIterator returns a new Iterator over a slice. +func NewIDSliceIterator(ids []ID) Iterator { + iter := &idSliceIter{ + backingSlice: ids, + currentIdx: -1, + } + return iter +} + +type idSliceIter struct { + backingSlice []ID + currentIdx int + currentID ID +} + +func (i *idSliceIter) Next() bool { + i.currentIdx++ + if i.currentIdx < len(i.backingSlice) { + i.currentID = i.backingSlice[i.currentIdx] + return true + } + i.currentID = nil + return false +} + +func (i *idSliceIter) Current() ID { + return i.currentID +} + +func (i *idSliceIter) CurrentIndex() int { + if i.currentIdx >= 0 { + return i.currentIdx + } + return 0 +} + +func (i *idSliceIter) Err() error { + return nil +} + +func (i *idSliceIter) Close() { + i.backingSlice = nil + i.currentIdx = 0 + i.currentID = nil +} + +func (i *idSliceIter) Len() int { + return len(i.backingSlice) +} + +func (i *idSliceIter) Remaining() int { + if r := len(i.backingSlice) - 1 - i.currentIdx; r >= 0 { + return r + } + return 0 +} + +func (i *idSliceIter) Duplicate() Iterator { + return &idSliceIter{ + backingSlice: i.backingSlice, + currentIdx: i.currentIdx, + currentID: i.currentID, + } +} + +// NewStringIDsIterator returns a new Iterator over the given IDs. +func NewStringIDsIterator(ids ...string) Iterator { + return NewStringIDsSliceIterator(ids) +} + +// NewStringIDsSliceIterator returns a new Iterator over a slice of strings. +func NewStringIDsSliceIterator(ids []string) Iterator { + iter := &stringSliceIter{ + backingSlice: ids, + currentIdx: -1, + } + return iter +} + +type stringSliceIter struct { + backingSlice []string + currentIdx int + currentID ID +} + +func (i *stringSliceIter) Next() bool { + i.currentIdx++ + if i.currentIdx < len(i.backingSlice) { + i.currentID = StringID(i.backingSlice[i.currentIdx]) + return true + } + i.currentID = nil + return false +} + +func (i *stringSliceIter) Current() ID { + return i.currentID +} + +func (i *stringSliceIter) CurrentIndex() int { + if i.currentIdx >= 0 { + return i.currentIdx + } + return 0 +} + +func (i *stringSliceIter) Err() error { + return nil +} + +func (i *stringSliceIter) Close() { + i.backingSlice = nil + i.currentIdx = 0 + i.currentID = nil +} + +func (i *stringSliceIter) Len() int { + return len(i.backingSlice) +} + +func (i *stringSliceIter) Remaining() int { + if r := len(i.backingSlice) - 1 - i.currentIdx; r >= 0 { + return r + } + return 0 +} + +func (i *stringSliceIter) Duplicate() Iterator { + return &stringSliceIter{ + backingSlice: i.backingSlice, + currentIdx: i.currentIdx, + currentID: i.currentID, + } +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/tag.go b/vendor/github.com/m3db/m3/src/x/ident/tag.go new file mode 100644 index 00000000..a8c0501d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/tag.go @@ -0,0 +1,41 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ident + +import ( + "github.com/m3db/m3/src/x/checked" +) + +// BinaryTag constructs a new Tag based on binary values. +func BinaryTag(name checked.Bytes, value checked.Bytes) Tag { + return Tag{ + Name: TagName(BinaryID(name)), + Value: TagValue(BinaryID(value)), + } +} + +// StringTag constructs a new Tag based on string values. +func StringTag(name string, value string) Tag { + return Tag{ + Name: TagName(StringID(name)), + Value: TagValue(StringID(value)), + } +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/tag_arraypool_gen.go b/vendor/github.com/m3db/m3/src/x/ident/tag_arraypool_gen.go new file mode 100644 index 00000000..8d452453 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/tag_arraypool_gen.go @@ -0,0 +1,127 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This file was automatically generated by genny. +// Any changes will be lost if this file is regenerated. +// see https://github.com/mauricelam/genny + +package ident + +import ( + "github.com/m3db/m3/src/x/pool" +) + +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// tagArrayPool provides a pool for tag slices. +type tagArrayPool interface { + // Init initializes the array pool, it needs to be called + // before Get/Put use. + Init() + + // Get returns the a slice from the pool. + Get() []Tag + + // Put returns the provided slice to the pool. + Put(elems []Tag) +} + +type tagFinalizeFn func([]Tag) []Tag + +type tagArrayPoolOpts struct { + Options pool.ObjectPoolOptions + Capacity int + MaxCapacity int + FinalizeFn tagFinalizeFn +} + +type tagArrPool struct { + opts tagArrayPoolOpts + pool pool.ObjectPool +} + +func newTagArrayPool(opts tagArrayPoolOpts) tagArrayPool { + if opts.FinalizeFn == nil { + opts.FinalizeFn = defaultTagFinalizerFn + } + p := pool.NewObjectPool(opts.Options) + return &tagArrPool{opts, p} +} + +func (p *tagArrPool) Init() { + p.pool.Init(func() interface{} { + return make([]Tag, 0, p.opts.Capacity) + }) +} + +func (p *tagArrPool) Get() []Tag { + return p.pool.Get().([]Tag) +} + +func (p *tagArrPool) Put(arr []Tag) { + arr = p.opts.FinalizeFn(arr) + if max := p.opts.MaxCapacity; max > 0 && cap(arr) > max { + return + } + p.pool.Put(arr) +} + +func defaultTagFinalizerFn(elems []Tag) []Tag { + var empty Tag + for i := range elems { + elems[i] = empty + } + elems = elems[:0] + return elems +} + +type tagArr []Tag + +func (elems tagArr) grow(n int) []Tag { + if cap(elems) < n { + elems = make([]Tag, n) + } + elems = elems[:n] + // following compiler optimized memcpy impl + // https://github.com/golang/go/wiki/CompilerOptimizations#optimized-memclr + var empty Tag + for i := range elems { + elems[i] = empty + } + return elems +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/tag_iterator.go b/vendor/github.com/m3db/m3/src/x/ident/tag_iterator.go new file mode 100644 index 00000000..f51508b0 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/tag_iterator.go @@ -0,0 +1,221 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ident + +import ( + "errors" + + "github.com/m3db/m3/src/m3ninx/doc" +) + +var ( + errInvalidNumberInputsToIteratorMatcher = errors.New("inputs must be specified in name-value pairs (i.e. divisible by 2)") +) + +// MustNewTagStringsIterator returns a TagIterator over a slice of strings, +// panic'ing if it encounters an error. +func MustNewTagStringsIterator(inputs ...string) TagIterator { + iter, err := NewTagStringsIterator(inputs...) + if err != nil { + panic(err.Error()) + } + return iter +} + +// NewTagStringsIterator returns a TagIterator over a slice of strings. +func NewTagStringsIterator(inputs ...string) (TagIterator, error) { + if len(inputs)%2 != 0 { + return nil, errInvalidNumberInputsToIteratorMatcher + } + tags := make([]Tag, 0, len(inputs)/2) + for i := 0; i < len(inputs); i += 2 { + tags = append(tags, StringTag(inputs[i], inputs[i+1])) + } + return NewTagsIterator(NewTags(tags...)), nil +} + +// NewTagsIterator returns a TagsIterator over a set of tags. +func NewTagsIterator(tags Tags) TagsIterator { + return newTagSliceIter(tags, nil, nil) +} + +// NewFieldsTagsIterator returns a TagsIterator over a set of fields. +func NewFieldsTagsIterator(fields []doc.Field) TagsIterator { + return newTagSliceIter(Tags{}, fields, nil) +} + +func newTagSliceIter( + tags Tags, + fields []doc.Field, + pool Pool, +) *tagSliceIter { + iter := &tagSliceIter{ + nameBytesID: NewReuseableBytesID(), + valueBytesID: NewReuseableBytesID(), + pool: pool, + } + iter.currentReuseableTag = Tag{ + Name: iter.nameBytesID, + Value: iter.valueBytesID, + } + if len(tags.Values()) > 0 { + iter.Reset(tags) + } else { + iter.ResetFields(fields) + } + return iter +} + +type tagsSliceType uint + +const ( + tagSliceType tagsSliceType = iota + fieldSliceType +) + +type tagsSlice struct { + tags []Tag + fields []doc.Field +} + +type tagSliceIter struct { + backingSlice tagsSlice + currentIdx int + currentTag Tag + currentReuseableTag Tag + nameBytesID *ReuseableBytesID + valueBytesID *ReuseableBytesID + pool Pool +} + +func (i *tagSliceIter) Next() bool { + i.currentIdx++ + l, t := i.lengthAndType() + if i.currentIdx < l { + if t == tagSliceType { + i.currentTag = i.backingSlice.tags[i.currentIdx] + } else { + i.nameBytesID.Reset(i.backingSlice.fields[i.currentIdx].Name) + i.valueBytesID.Reset(i.backingSlice.fields[i.currentIdx].Value) + i.currentTag = i.currentReuseableTag + } + return true + } + i.currentTag = Tag{} + return false +} + +func (i *tagSliceIter) Current() Tag { + return i.currentTag +} + +func (i *tagSliceIter) CurrentIndex() int { + if i.currentIdx >= 0 { + return i.currentIdx + } + return 0 +} + +func (i *tagSliceIter) Err() error { + return nil +} + +func (i *tagSliceIter) Close() { + i.backingSlice = tagsSlice{} + i.currentIdx = 0 + i.currentTag = Tag{} + + if i.pool == nil { + return + } + + i.pool.PutTagsIterator(i) +} + +func (i *tagSliceIter) Len() int { + l, _ := i.lengthAndType() + return l +} + +func (i *tagSliceIter) lengthAndType() (int, tagsSliceType) { + if l := len(i.backingSlice.tags); l > 0 { + return l, tagSliceType + } + return len(i.backingSlice.fields), fieldSliceType +} + +func (i *tagSliceIter) Remaining() int { + if r := i.Len() - 1 - i.currentIdx; r >= 0 { + return r + } + return 0 +} + +func (i *tagSliceIter) Duplicate() TagIterator { + if i.pool != nil { + iter := i.pool.TagsIterator() + if len(i.backingSlice.tags) > 0 { + iter.Reset(Tags{values: i.backingSlice.tags}) + } else { + iter.ResetFields(i.backingSlice.fields) + } + for j := 0; j <= i.currentIdx; j++ { + iter.Next() + } + return iter + } + return newTagSliceIter(Tags{values: i.backingSlice.tags}, + i.backingSlice.fields, i.pool) +} + +func (i *tagSliceIter) rewind() { + i.currentIdx = -1 + i.currentTag = Tag{} +} + +func (i *tagSliceIter) Reset(tags Tags) { + i.backingSlice = tagsSlice{tags: tags.Values()} + i.rewind() +} + +func (i *tagSliceIter) ResetFields(fields []doc.Field) { + i.backingSlice = tagsSlice{fields: fields} + i.rewind() +} + +func (i *tagSliceIter) Rewind() { + i.rewind() +} + +// EmptyTagIterator returns an iterator over no tags. +var EmptyTagIterator TagIterator = emptyTagIterator{} + +type emptyTagIterator struct{} + +func (e emptyTagIterator) Next() bool { return false } +func (e emptyTagIterator) Current() Tag { return Tag{} } +func (e emptyTagIterator) CurrentIndex() int { return 0 } +func (e emptyTagIterator) Err() error { return nil } +func (e emptyTagIterator) Close() {} +func (e emptyTagIterator) Len() int { return 0 } +func (e emptyTagIterator) Remaining() int { return 0 } +func (e emptyTagIterator) Duplicate() TagIterator { return e } +func (e emptyTagIterator) Rewind() {} diff --git a/vendor/github.com/m3db/m3/src/x/ident/tag_iterator_matcher.go b/vendor/github.com/m3db/m3/src/x/ident/tag_iterator_matcher.go new file mode 100644 index 00000000..6e137d83 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/tag_iterator_matcher.go @@ -0,0 +1,72 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ident + +import ( + "fmt" + + "github.com/golang/mock/gomock" +) + +// TagIterMatcher is a gomock.Matcher that matches TagIterator +type TagIterMatcher interface { + gomock.Matcher +} + +// NewTagIterMatcher returns a new TagIterMatcher +func NewTagIterMatcher(iter TagIterator) TagIterMatcher { + return &tagIterMatcher{iter: iter} +} + +type tagIterMatcher struct { + iter TagIterator +} + +func (m *tagIterMatcher) Matches(x interface{}) bool { + t, ok := x.(TagIterator) + if !ok { + return false + } + // duplicate to ensure the both iterators can be re-used again + obs := t.Duplicate() + exp := m.iter.Duplicate() + for exp.Next() { + if !obs.Next() { + return false + } + obsCurrent := obs.Current() + expCurrent := exp.Current() + if !expCurrent.Equal(obsCurrent) { + return false + } + } + if obs.Next() { + return false + } + if exp.Err() != obs.Err() { + return false + } + return true +} + +func (m *tagIterMatcher) String() string { + return fmt.Sprintf("tagIter %v", m.iter) +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/tag_matcher.go b/vendor/github.com/m3db/m3/src/x/ident/tag_matcher.go new file mode 100644 index 00000000..63fe2c83 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/tag_matcher.go @@ -0,0 +1,53 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ident + +import ( + "fmt" + + "github.com/golang/mock/gomock" +) + +// TagMatcher is a gomock.Matcher that matches Tag +type TagMatcher interface { + gomock.Matcher +} + +// NewTagMatcher returns a new TagMatcher +func NewTagMatcher(name string, value string) TagMatcher { + return &tagMatcher{tag: StringTag(name, value)} +} + +type tagMatcher struct { + tag Tag +} + +func (m *tagMatcher) Matches(x interface{}) bool { + t, ok := x.(Tag) + if !ok { + return false + } + return m.tag.Name.Equal(t.Name) && m.tag.Value.Equal(t.Value) +} + +func (m *tagMatcher) String() string { + return fmt.Sprintf("tag %s=%s", m.tag.Name.String(), m.tag.Value.String()) +} diff --git a/vendor/github.com/m3db/m3/src/x/ident/types.go b/vendor/github.com/m3db/m3/src/x/ident/types.go new file mode 100644 index 00000000..0334cc54 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/ident/types.go @@ -0,0 +1,312 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package ident provides utilities for working with identifiers. +package ident + +import ( + "fmt" + + "github.com/m3db/m3/src/m3ninx/doc" + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/context" +) + +// ID represents an immutable identifier to allow use of byte slice pooling +// for the contents of the ID. +type ID interface { + fmt.Stringer + + // Bytes returns the underlying byte slice of the bytes ID unpacked from + // any checked bytes container, callers cannot safely hold a ref to these + // bytes. + Bytes() []byte + + // Equal returns whether the ID is equal to a given ID. + Equal(value ID) bool + + // NoFinalize makes calls to finalize a no-op, this is useful when you + // would like to share a type with another sub-system that should is not + // allowed to finalize the resource as the resource is kept indefinitely + // until garbage collected (i.e. longly lived). + NoFinalize() + + // IsNoFinalize returns whether finalize is a no-op or not, this is useful + // when you know you can use an ID without having to worry to take a copy. + IsNoFinalize() bool + + // Finalize releases all resources held by the ID, unless NoFinalize has + // been called previously in which case this is a no-op. + Finalize() +} + +// TagName represents the name of a timeseries tag. +type TagName ID + +// TagValue represents the value of a timeseries tag. +type TagValue ID + +// Tag represents a timeseries tag. +type Tag struct { + Name TagName + Value TagValue + noFinalize bool +} + +// NoFinalize makes calls to finalize a no-op, this is useful when you +// would like to share a type with another sub-system that should is not +// allowed to finalize the resource as the resource is kept indefinitely +// until garbage collected (i.e. longly lived). +func (t *Tag) NoFinalize() { + t.noFinalize = true + t.Name.NoFinalize() + t.Value.NoFinalize() +} + +// Finalize releases all resources held by the Tag, unless NoFinalize has +// been called previously in which case this is a no-op. +func (t *Tag) Finalize() { + if t.noFinalize { + return + } + if t.Name != nil { + t.Name.Finalize() + t.Name = nil + } + if t.Value != nil { + t.Value.Finalize() + t.Value = nil + } +} + +// Equal returns whether the two tags are equal. +func (t Tag) Equal(value Tag) bool { + return t.Name.Equal(value.Name) && t.Value.Equal(value.Value) +} + +// Pool represents an automatic pool of `ident` objects. +type Pool interface { + // GetBinaryID will create a new binary ID and take reference to the bytes. + // When the context closes the ID will be finalized and so too will + // the bytes, i.e. it will take ownership of the bytes. + GetBinaryID(c context.Context, data checked.Bytes) ID + + // BinaryID will create a new binary ID and take a reference to the bytes. + BinaryID(data checked.Bytes) ID + + // GetBinaryTag will create a new binary Tag and take reference to the bytes. + // When the context closes, the Tag will be finalized and so too will + // the bytes, i.e. it will take ownership of the bytes. + GetBinaryTag(c context.Context, name, value checked.Bytes) Tag + + // BinaryTag will create a new binary Tag and take a reference to the provided bytes. + BinaryTag(name, value checked.Bytes) Tag + + // GetStringID will create a new string ID and create a bytes copy of the + // string. When the context closes the ID will be finalized. + GetStringID(c context.Context, id string) ID + + // StringID will create a new string ID and create a bytes copy of the + // string. + StringID(data string) ID + + // GetStringTag will create a new string Tag and create a bytes copy of the + // string. When the context closes the ID will be finalized. + GetStringTag(c context.Context, name, value string) Tag + + // StringTag will create a new string Tag and create a bytes copy of the + // string. + StringTag(name, value string) Tag + + // Tags will create a new array of tags and return it. + Tags() Tags + + // GetTagsIterator will create a tag iterator and return it. When the context + // closes the tags array and any tags contained will be finalized. + GetTagsIterator(c context.Context) TagsIterator + + // TagsIterator will create a tag iterator and return it. + TagsIterator() TagsIterator + + // Put an ID back in the pool. + Put(id ID) + + // PutTag puts a tag back in the pool. + PutTag(tag Tag) + + // PutTags puts a set of tags back in the pool. + PutTags(tags Tags) + + // PutTagsIterator puts a tags iterator back in the pool. + PutTagsIterator(iter TagsIterator) + + // Clone replicates a given ID into a pooled ID. + Clone(id ID) ID + + // CloneTag replicates a given Tag into a pooled Tag. + CloneTag(tag Tag) Tag + + // CloneTags replicates a given set of Tags into a pooled Tags. + CloneTags(tags Tags) Tags +} + +// Iterator represents an iterator over `ID` instances. It is not thread-safe. +type Iterator interface { + // Next returns a bool indicating the presence of the next ID instance. + Next() bool + + // Current returns the current ID instance. + Current() ID + + // CurrentIndex returns the current index at. + CurrentIndex() int + + // Close releases any resources held by the iterator. + Close() + + // Err returns any errors encountered during iteration. + Err() error + + // Len returns the number of elements. + Len() int + + // Remaining returns the number of elements remaining to be iterated over. + Remaining() int + + // Dupe returns an independent duplicate of the iterator. + Duplicate() Iterator +} + +// TagIterator represents an iterator over `Tag` instances. It is not thread-safe. +type TagIterator interface { + // Next returns a bool indicating the presence of the next Tag instance. + Next() bool + + // Current returns the current Tag instance. + Current() Tag + + // CurrentIndex returns the current index at. + CurrentIndex() int + + // Err returns any errors encountered during iteration. + Err() error + + // Close releases any resources held by the iterator. + Close() + + // Len returns the number of elements. + Len() int + + // Remaining returns the number of elements remaining to be iterated over. + Remaining() int + + // Duplicate returns an independent duplicate of the iterator. + Duplicate() TagIterator + + // Rewind resets the tag iterator to the initial position. + Rewind() +} + +// TagsIterator represents a TagIterator that can be reset with a Tags +// collection type. It is not thread-safe. +type TagsIterator interface { + TagIterator + + // Reset allows the tag iterator to be reused with a new set of tags. + Reset(tags Tags) + + // ResetFields allows tag iterator to be reused from a set of fields. + ResetFields(fields []doc.Field) +} + +// Tags is a collection of Tag instances that can be pooled. +type Tags struct { + values []Tag + pool Pool + noFinalize bool +} + +// NewTags returns a new set of tags. +func NewTags(values ...Tag) Tags { + return Tags{values: values} +} + +// Reset resets the tags for reuse. +func (t *Tags) Reset(values []Tag) { + t.values = values +} + +// Values returns the tags values. +func (t Tags) Values() []Tag { + return t.values +} + +// Append will append a tag. +func (t *Tags) Append(tag Tag) { + t.values = append(t.values, tag) +} + +// NoFinalize makes calls to finalize a no-op, this is useful when you +// would like to share a type with another sub-system that should is not +// allowed to finalize the resource as the resource is kept indefinitely +// until garbage collected (i.e. longly lived). +func (t *Tags) NoFinalize() { + t.noFinalize = true + for _, tag := range t.values { + tag.NoFinalize() + } +} + +// Finalize finalizes all Tags, unless NoFinalize has been called previously +// in which case this is a no-op. +func (t *Tags) Finalize() { + if t.noFinalize { + return + } + + values := t.values + t.values = nil + + for i := range values { + values[i].Finalize() + } + + if t.pool == nil { + return + } + + t.pool.PutTags(Tags{values: values}) +} + +// Equal returns a bool indicating if the tags are equal. It requires +// the two slices are ordered the same. +func (t Tags) Equal(other Tags) bool { + if len(t.Values()) != len(other.Values()) { + return false + } + for i := 0; i < len(t.Values()); i++ { + equal := t.values[i].Name.Equal(other.values[i].Name) && + t.values[i].Value.Equal(other.values[i].Value) + if !equal { + return false + } + } + return true +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/build.go b/vendor/github.com/m3db/m3/src/x/instrument/build.go new file mode 100644 index 00000000..55d2ae10 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/build.go @@ -0,0 +1,174 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "errors" + "log" + "runtime" + "strconv" + "sync" + "time" +) + +var ( + // Revision is the VCS revision associated with this build. Overridden using ldflags + // at compile time. Example: + // $ go build -ldflags "-X github.com/m3db/m3/src/x/instrument.Revision=abcdef" ... + // Adapted from: https://www.atatus.com/blog/golang-auto-build-versioning/ + Revision = "unknown" + + // Branch is the VCS branch associated with this build. + Branch = "unknown" + + // Version is the version associated with this build. + Version = "unknown" + + // BuildDate is the date this build was created. + BuildDate = "unknown" + + // BuildTimeUnix is the seconds since epoch representing the date this build was created. + BuildTimeUnix = "0" + + // LogBuildInfoAtStartup controls whether we log build information at startup. If its + // set to a non-empty string, we log the build information at process startup. + LogBuildInfoAtStartup string + + // goVersion is the current runtime version. + goVersion = runtime.Version() + + // buildInfoMetricName is the emitted build information metric's name. + buildInfoMetricName = "build-information" + + // buildAgeMetricName is the emitted build age metric's name. + buildAgeMetricName = "build-age" +) + +var ( + errAlreadyStarted = errors.New("reporter already started") + errNotStarted = errors.New("reporter not started") + errBuildTimeNegative = errors.New("reporter build time must be non-negative") +) + +// LogBuildInfo logs the build information to the provided logger. +func LogBuildInfo() { + log.Printf("Go Runtime version: %s\n", goVersion) + log.Printf("Build Version: %s\n", Version) + log.Printf("Build Revision: %s\n", Revision) + log.Printf("Build Branch: %s\n", Branch) + log.Printf("Build Date: %s\n", BuildDate) + log.Printf("Build TimeUnix: %s\n", BuildTimeUnix) +} + +func init() { + if LogBuildInfoAtStartup != "" { + LogBuildInfo() + } +} + +type buildReporter struct { + sync.Mutex + + opts Options + buildTime time.Time + active bool + closeCh chan struct{} + doneCh chan struct{} +} + +// NewBuildReporter returns a new build version reporter. +func NewBuildReporter( + opts Options, +) Reporter { + return &buildReporter{ + opts: opts, + } +} + +func (b *buildReporter) Start() error { + const ( + base = 10 + bitSize = 64 + ) + sec, err := strconv.ParseInt(BuildTimeUnix, base, bitSize) + if err != nil { + return err + } + if sec < 0 { + return errBuildTimeNegative + } + buildTime := time.Unix(sec, 0) + + b.Lock() + defer b.Unlock() + if b.active { + return errAlreadyStarted + } + b.buildTime = buildTime + b.active = true + b.closeCh = make(chan struct{}) + b.doneCh = make(chan struct{}) + go b.report() + return nil +} + +func (b *buildReporter) report() { + scope := b.opts.MetricsScope().Tagged(map[string]string{ + "revision": Revision, + "branch": Branch, + "build-date": BuildDate, + "build-version": Version, + "go-version": goVersion, + }) + buildInfoGauge := scope.Gauge(buildInfoMetricName) + buildAgeGauge := scope.Gauge(buildAgeMetricName) + buildInfoGauge.Update(1.0) + buildAgeGauge.Update(float64(time.Since(b.buildTime))) + + ticker := time.NewTicker(b.opts.ReportInterval()) + defer func() { + close(b.doneCh) + ticker.Stop() + }() + + for { + select { + case <-ticker.C: + buildInfoGauge.Update(1.0) + buildAgeGauge.Update(float64(time.Since(b.buildTime))) + + case <-b.closeCh: + return + } + } +} + +func (b *buildReporter) Stop() error { + b.Lock() + defer b.Unlock() + if !b.active { + return errNotStarted + } + close(b.closeCh) + <-b.doneCh + b.active = false + return nil +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/config.go b/vendor/github.com/m3db/m3/src/x/instrument/config.go new file mode 100644 index 00000000..110fd3e8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/config.go @@ -0,0 +1,268 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "errors" + "fmt" + "io" + "net" + "time" + + prom "github.com/m3db/prometheus_client_golang/prometheus" + "github.com/uber-go/tally" + "github.com/uber-go/tally/m3" + "github.com/uber-go/tally/multi" + "github.com/uber-go/tally/prometheus" + "go.uber.org/zap" +) + +var ( + errNoReporterConfigured = errors.New("no reporter configured") +) + +// ScopeConfiguration configures a metric scope. +type ScopeConfiguration struct { + // Prefix of metrics in this scope. + Prefix string `yaml:"prefix"` + + // Metrics reporting interval. + ReportingInterval time.Duration `yaml:"reportingInterval"` + + // Common tags shared by metrics reported. + CommonTags map[string]string `yaml:"tags"` +} + +// MetricsConfiguration configures options for emitting metrics. +type MetricsConfiguration struct { + // Root scope configuration. + RootScope *ScopeConfiguration `yaml:"scope"` + + // M3 reporter configuration. + M3Reporter *m3.Configuration `yaml:"m3"` + + // Prometheus reporter configuration. + PrometheusReporter *PrometheusConfiguration `yaml:"prometheus"` + + // Metrics sampling rate. + SamplingRate float64 `yaml:"samplingRate" validate:"nonzero,min=0.0,max=1.0"` + + // Extended metrics type. + ExtendedMetrics *ExtendedMetricsType `yaml:"extended"` + + // Metric sanitization type. + Sanitization *MetricSanitizationType `yaml:"sanitization"` +} + +// NewRootScope creates a new tally.Scope based on a tally.CachedStatsReporter +// based on the the the config. +func (mc *MetricsConfiguration) NewRootScope() (tally.Scope, io.Closer, error) { + opts := NewRootScopeAndReportersOptions{} + scope, closer, _, err := mc.NewRootScopeAndReporters(opts) + return scope, closer, err +} + +// MetricsConfigurationReporters is the reporters constructed. +type MetricsConfigurationReporters struct { + AllReporters []tally.CachedStatsReporter + M3Reporter *MetricsConfigurationM3Reporter + PrometheusReporter *MetricsConfigurationPrometheusReporter +} + +// MetricsConfigurationM3Reporter is the M3 reporter if constructed. +type MetricsConfigurationM3Reporter struct { + Reporter m3.Reporter +} + +// MetricsConfigurationPrometheusReporter is the Prometheus reporter if constructed. +type MetricsConfigurationPrometheusReporter struct { + Reporter prometheus.Reporter + Registry *prom.Registry +} + +// NewRootScopeAndReportersOptions is a set of options. +type NewRootScopeAndReportersOptions struct { + PrometheusHandlerListener net.Listener + PrometheusExternalRegistries []PrometheusExternalRegistry + PrometheusOnError func(e error) +} + +// NewRootScopeAndReporters creates a new tally.Scope based on a tally.CachedStatsReporter +// based on the the the config along with the reporters used. +func (mc *MetricsConfiguration) NewRootScopeAndReporters( + opts NewRootScopeAndReportersOptions, +) ( + tally.Scope, + io.Closer, + MetricsConfigurationReporters, + error, +) { + var result MetricsConfigurationReporters + if mc.M3Reporter != nil { + r, err := mc.M3Reporter.NewReporter() + if err != nil { + return nil, nil, MetricsConfigurationReporters{}, err + } + result.AllReporters = append(result.AllReporters, r) + result.M3Reporter = &MetricsConfigurationM3Reporter{ + Reporter: r, + } + } + if mc.PrometheusReporter != nil { + // Set a default on error method for sane handling when registering metrics + // results in an error with the Prometheus reporter. + onError := func(e error) { + logger := NewOptions().Logger() + logger.Error("register metrics error", zap.Error(e)) + } + if opts.PrometheusOnError != nil { + onError = opts.PrometheusOnError + } + + // Override the default registry with an empty one that does not have the default + // registered collectors (Go and Process). The M3 reporters will emit the Go metrics + // and the Process metrics are reported by both the M3 process reporter and a + // modified Prometheus process collector, which reports everything except the + // number of open FDs. + // + // Collecting the number of F.Ds for a process that has many of them can take a long + // time and be very CPU intensive, especially the default Prometheus collector + // implementation which is less optimized than the M3 implementation. + // + // TODO: Emit the Prometheus process stats from our own process reporter so we + // get the same stats regardless of the reporter used. See issue: + // https://github.com/m3db/m3/issues/1649 + registry := prom.NewRegistry() + if err := registry.Register(NewPrometheusProcessCollector(ProcessCollectorOpts{ + DisableOpenFDs: true, + })); err != nil { + return nil, nil, MetricsConfigurationReporters{}, fmt.Errorf("could not create process collector: %v", err) + } + opts := PrometheusConfigurationOptions{ + Registry: registry, + ExternalRegistries: opts.PrometheusExternalRegistries, + HandlerListener: opts.PrometheusHandlerListener, + OnError: onError, + } + + // Use default instrument package default histogram buckets if not set. + if len(mc.PrometheusReporter.DefaultHistogramBuckets) == 0 { + for _, v := range DefaultHistogramTimerHistogramBuckets().AsValues() { + bucket := prometheus.HistogramObjective{ + Upper: v, + } + mc.PrometheusReporter.DefaultHistogramBuckets = + append(mc.PrometheusReporter.DefaultHistogramBuckets, bucket) + } + } + + if len(mc.PrometheusReporter.DefaultSummaryObjectives) == 0 { + for k, v := range DefaultSummaryQuantileObjectives() { + q := prometheus.SummaryObjective{ + Percentile: k, + AllowedError: v, + } + mc.PrometheusReporter.DefaultSummaryObjectives = + append(mc.PrometheusReporter.DefaultSummaryObjectives, q) + } + } + + r, err := mc.PrometheusReporter.NewReporter(opts) + if err != nil { + return nil, nil, MetricsConfigurationReporters{}, err + } + + result.AllReporters = append(result.AllReporters, r) + result.PrometheusReporter = &MetricsConfigurationPrometheusReporter{ + Reporter: r, + Registry: registry, + } + } + if len(result.AllReporters) == 0 { + return nil, nil, MetricsConfigurationReporters{}, errNoReporterConfigured + } + + var r tally.CachedStatsReporter + if len(result.AllReporters) == 1 { + r = result.AllReporters[0] + } else { + r = multi.NewMultiCachedReporter(result.AllReporters...) + } + + scope, closer := mc.NewRootScopeReporter(r) + return scope, closer, result, nil +} + +// NewRootScopeReporter creates a new tally.Scope based on a given tally.CachedStatsReporter +// and given root scope config. In most cases NewRootScope should be used, but for cases such +// as hooking into the reporter to manually flush it. +func (mc *MetricsConfiguration) NewRootScopeReporter( + r tally.CachedStatsReporter, +) (tally.Scope, io.Closer) { + var ( + prefix string + tags map[string]string + ) + + if mc.RootScope != nil { + if mc.RootScope.Prefix != "" { + prefix = mc.RootScope.Prefix + } + if mc.RootScope.CommonTags != nil { + tags = mc.RootScope.CommonTags + } + } + + var sanitizeOpts *tally.SanitizeOptions + if mc.Sanitization != nil { + sanitizeOpts = mc.Sanitization.NewOptions() + } + + scopeOpts := tally.ScopeOptions{ + Tags: tags, + Prefix: prefix, + CachedReporter: r, + SanitizeOptions: sanitizeOpts, + } + reportInterval := mc.ReportInterval() + scope, closer := tally.NewRootScope(scopeOpts, reportInterval) + if mc.ExtendedMetrics != nil { + StartReportingExtendedMetrics(scope, reportInterval, *mc.ExtendedMetrics) + } + + return scope, closer +} + +// SampleRate returns the metrics sampling rate. +func (mc *MetricsConfiguration) SampleRate() float64 { + if mc.SamplingRate > 0.0 && mc.SamplingRate <= 1.0 { + return mc.SamplingRate + } + return defaultSamplingRate +} + +// ReportInterval returns the metrics reporting interval. +func (mc *MetricsConfiguration) ReportInterval() time.Duration { + if mc.RootScope != nil && mc.RootScope.ReportingInterval != 0 { + return mc.RootScope.ReportingInterval + } + return defaultReportingInterval +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/config_prometheus.go b/vendor/github.com/m3db/m3/src/x/instrument/config_prometheus.go new file mode 100644 index 00000000..9c15c1ec --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/config_prometheus.go @@ -0,0 +1,330 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "fmt" + "log" + "net" + "net/http" + "os" + "strings" + + prom "github.com/m3db/prometheus_client_golang/prometheus" + "github.com/m3db/prometheus_client_golang/prometheus/promhttp" + dto "github.com/m3db/prometheus_client_model/go" + extprom "github.com/prometheus/client_golang/prometheus" + "github.com/uber-go/tally/prometheus" +) + +// PrometheusConfiguration is a configuration for a Prometheus reporter. +type PrometheusConfiguration struct { + // HandlerPath if specified will be used instead of using the default + // HTTP handler path "/metrics". + HandlerPath string `yaml:"handlerPath"` + + // ListenAddress if specified will be used instead of just registering the + // handler on the default HTTP serve mux without listening. + ListenAddress string `yaml:"listenAddress"` + + // TimerType is the default Prometheus type to use for Tally timers. + TimerType string `yaml:"timerType"` + + // DefaultHistogramBuckets if specified will set the default histogram + // buckets to be used by the reporter. + DefaultHistogramBuckets []prometheus.HistogramObjective `yaml:"defaultHistogramBuckets"` + + // DefaultSummaryObjectives if specified will set the default summary + // objectives to be used by the reporter. + DefaultSummaryObjectives []prometheus.SummaryObjective `yaml:"defaultSummaryObjectives"` + + // OnError specifies what to do when an error either with listening + // on the specified listen address or registering a metric with the + // Prometheus. By default the registerer will panic. + OnError string `yaml:"onError"` +} + +// HistogramObjective is a Prometheus histogram bucket. +// See: https://godoc.org/github.com/prometheus/client_golang/prometheus#HistogramOpts +type HistogramObjective struct { + Upper float64 `yaml:"upper"` +} + +// SummaryObjective is a Prometheus summary objective. +// See: https://godoc.org/github.com/prometheus/client_golang/prometheus#SummaryOpts +type SummaryObjective struct { + Percentile float64 `yaml:"percentile"` + AllowedError float64 `yaml:"allowedError"` +} + +// PrometheusConfigurationOptions allows some programatic options, such as using a +// specific registry and what error callback to register. +type PrometheusConfigurationOptions struct { + // Registry if not nil will specify the specific registry to use + // for registering metrics. + Registry *prom.Registry + // ExternalRegistries if set (with combination of a specified Registry) + // will also + ExternalRegistries []PrometheusExternalRegistry + // HandlerListener is the listener to register the server handler on. + HandlerListener net.Listener + // HandlerOpts is the reporter HTTP handler options, not specifying will + // use defaults. + HandlerOpts promhttp.HandlerOpts + // OnError allows for customization of what to do when a metric + // registration error fails, the default is to panic. + OnError func(e error) +} + +// PrometheusExternalRegistry is an external Prometheus registry +// to also expose as part of the handler. +type PrometheusExternalRegistry struct { + // Registry is the external prometheus registry to list. + Registry *extprom.Registry + // SubScope will add a prefix to all metric names exported by + // this registry. + SubScope string +} + +// NewReporter creates a new M3 Prometheus reporter from this configuration. +func (c PrometheusConfiguration) NewReporter( + configOpts PrometheusConfigurationOptions, +) (prometheus.Reporter, error) { + var opts prometheus.Options + + if configOpts.Registry != nil { + opts.Registerer = configOpts.Registry + } + + if configOpts.OnError != nil { + opts.OnRegisterError = configOpts.OnError + } else { + switch c.OnError { + case "stderr": + opts.OnRegisterError = func(err error) { + fmt.Fprintf(os.Stderr, "tally prometheus reporter error: %v\n", err) + } + case "log": + opts.OnRegisterError = func(err error) { + log.Printf("tally prometheus reporter error: %v\n", err) + } + case "none": + opts.OnRegisterError = func(err error) {} + default: + opts.OnRegisterError = func(err error) { + panic(err) + } + } + } + + switch c.TimerType { + case "summary": + opts.DefaultTimerType = prometheus.SummaryTimerType + case "histogram": + opts.DefaultTimerType = prometheus.HistogramTimerType + } + + if len(c.DefaultHistogramBuckets) > 0 { + values := make([]float64, 0, len(c.DefaultHistogramBuckets)) + for _, value := range c.DefaultHistogramBuckets { + values = append(values, value.Upper) + } + opts.DefaultHistogramBuckets = values + } + + if len(c.DefaultSummaryObjectives) > 0 { + values := make(map[float64]float64, len(c.DefaultSummaryObjectives)) + for _, value := range c.DefaultSummaryObjectives { + values[value.Percentile] = value.AllowedError + } + opts.DefaultSummaryObjectives = values + } + + reporter := prometheus.NewReporter(opts) + + path := "/metrics" + if handlerPath := strings.TrimSpace(c.HandlerPath); handlerPath != "" { + path = handlerPath + } + + handler := reporter.HTTPHandler() + if configOpts.Registry != nil { + gatherer := newMultiGatherer(configOpts.Registry, configOpts.ExternalRegistries) + handler = promhttp.HandlerFor(gatherer, promhttp.HandlerOpts{}) + } + + addr := strings.TrimSpace(c.ListenAddress) + if addr == "" && configOpts.HandlerListener == nil { + // If address not specified and server not specified, register + // on default mux. + http.Handle(path, handler) + } else { + mux := http.NewServeMux() + mux.Handle(path, handler) + + listener := configOpts.HandlerListener + if listener == nil { + // Address must be specified if server was nil. + var err error + listener, err = net.Listen("tcp", addr) + if err != nil { + return nil, fmt.Errorf( + "prometheus handler listen address error: %v", err) + } + } + + go func() { + server := &http.Server{Handler: mux} + if err := server.Serve(listener); err != nil { + opts.OnRegisterError(err) + } + }() + } + + return reporter, nil +} + +func newMultiGatherer( + primary *prom.Registry, + ext []PrometheusExternalRegistry, +) prom.Gatherer { + return &multiGatherer{ + primary: primary, + ext: ext, + } +} + +var _ prom.Gatherer = (*multiGatherer)(nil) + +type multiGatherer struct { + primary *prom.Registry + ext []PrometheusExternalRegistry +} + +func (g *multiGatherer) Gather() ([]*dto.MetricFamily, error) { + results, err := g.primary.Gather() + if err != nil { + return nil, err + } + + if len(g.ext) == 0 { + return results, nil + } + + for _, secondary := range g.ext { + gathered, err := secondary.Registry.Gather() + if err != nil { + return nil, err + } + + for _, elem := range gathered { + entry := &dto.MetricFamily{ + Name: elem.Name, + Help: elem.Help, + Metric: make([]*dto.Metric, 0, len(elem.Metric)), + } + + if secondary.SubScope != "" && entry.Name != nil { + scopedName := fmt.Sprintf("%s_%s", secondary.SubScope, *entry.Name) + entry.Name = &scopedName + } + + if v := elem.Type; v != nil { + metricType := dto.MetricType(*v) + entry.Type = &metricType + } + + for _, metricElem := range elem.Metric { + metricEntry := &dto.Metric{ + Label: make([]*dto.LabelPair, 0, len(metricElem.Label)), + TimestampMs: metricElem.TimestampMs, + } + + if v := metricElem.Gauge; v != nil { + metricEntry.Gauge = &dto.Gauge{ + Value: v.Value, + } + } + + if v := metricElem.Counter; v != nil { + metricEntry.Counter = &dto.Counter{ + Value: v.Value, + } + } + + if v := metricElem.Summary; v != nil { + metricEntry.Summary = &dto.Summary{ + SampleCount: v.SampleCount, + SampleSum: v.SampleSum, + Quantile: make([]*dto.Quantile, 0, len(v.Quantile)), + } + + for _, quantileElem := range v.Quantile { + quantileEntry := &dto.Quantile{ + Quantile: quantileElem.Quantile, + Value: quantileElem.Value, + } + metricEntry.Summary.Quantile = + append(metricEntry.Summary.Quantile, quantileEntry) + } + } + + if v := metricElem.Untyped; v != nil { + metricEntry.Untyped = &dto.Untyped{ + Value: v.Value, + } + } + + if v := metricElem.Histogram; v != nil { + metricEntry.Histogram = &dto.Histogram{ + SampleCount: v.SampleCount, + SampleSum: v.SampleSum, + Bucket: make([]*dto.Bucket, 0, len(v.Bucket)), + } + + for _, bucketElem := range v.Bucket { + bucketEntry := &dto.Bucket{ + CumulativeCount: bucketElem.CumulativeCount, + UpperBound: bucketElem.UpperBound, + } + metricEntry.Histogram.Bucket = + append(metricEntry.Histogram.Bucket, bucketEntry) + } + } + + for _, labelElem := range metricElem.Label { + labelEntry := &dto.LabelPair{ + Name: labelElem.Name, + Value: labelElem.Value, + } + + metricEntry.Label = append(metricEntry.Label, labelEntry) + } + + entry.Metric = append(entry.Metric, metricEntry) + } + + results = append(results, entry) + } + } + + return results, nil +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/extended.go b/vendor/github.com/m3db/m3/src/x/instrument/extended.go new file mode 100644 index 00000000..2c6d4358 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/extended.go @@ -0,0 +1,260 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "fmt" + "runtime" + "strings" + "sync/atomic" + "time" + + xerrors "github.com/m3db/m3/src/x/errors" + + "github.com/uber-go/tally" +) + +// ExtendedMetricsType is a type of extended metrics to report. +type ExtendedMetricsType int + +const ( + // NoExtendedMetrics describes no extended metrics. + NoExtendedMetrics ExtendedMetricsType = iota + + // SimpleExtendedMetrics describes just a simple level of extended metrics: + // - number of active goroutines + // - number of configured gomaxprocs + SimpleExtendedMetrics + + // ModerateExtendedMetrics describes a moderately verbose level of extended metrics: + // - number of active goroutines + // - number of configured gomaxprocs + // - number of file descriptors + ModerateExtendedMetrics + + // DetailedExtendedMetrics describes a detailed level of extended metrics: + // - number of active goroutines + // - number of configured gomaxprocs + // - number of file descriptors + // - memory allocated running count + // - memory used by heap + // - memory used by heap that is idle + // - memory used by heap that is in use + // - memory used by stack + // - number of garbage collections + // - GC pause times + DetailedExtendedMetrics + + // DefaultExtendedMetricsType is the default extended metrics level. + DefaultExtendedMetricsType = SimpleExtendedMetrics +) + +var ( + validExtendedMetricsTypes = []ExtendedMetricsType{ + NoExtendedMetrics, + SimpleExtendedMetrics, + ModerateExtendedMetrics, + DetailedExtendedMetrics, + } +) + +func (t ExtendedMetricsType) String() string { + switch t { + case NoExtendedMetrics: + return "none" + case SimpleExtendedMetrics: + return "simple" + case ModerateExtendedMetrics: + return "moderate" + case DetailedExtendedMetrics: + return "detailed" + } + return "unknown" +} + +// UnmarshalYAML unmarshals an ExtendedMetricsType into a valid type from string. +func (t *ExtendedMetricsType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + if str == "" { + *t = DefaultExtendedMetricsType + return nil + } + strs := make([]string, 0, len(validExtendedMetricsTypes)) + for _, valid := range validExtendedMetricsTypes { + if str == valid.String() { + *t = valid + return nil + } + strs = append(strs, "'"+valid.String()+"'") + } + return fmt.Errorf("invalid ExtendedMetricsType '%s' valid types are: %s", + str, strings.Join(strs, ", ")) +} + +// StartReportingExtendedMetrics creates a extend metrics reporter and starts +// the reporter returning it so it may be stopped if successfully started. +func StartReportingExtendedMetrics( + scope tally.Scope, + reportInterval time.Duration, + metricsType ExtendedMetricsType, +) (Reporter, error) { + reporter := NewExtendedMetricsReporter(scope, reportInterval, metricsType) + if err := reporter.Start(); err != nil { + return nil, err + } + return reporter, nil +} + +type runtimeMetrics struct { + NumGoRoutines tally.Gauge + GoMaxProcs tally.Gauge + MemoryAllocated tally.Gauge + MemoryHeap tally.Gauge + MemoryHeapIdle tally.Gauge + MemoryHeapInuse tally.Gauge + MemoryStack tally.Gauge + GCCPUFraction tally.Gauge + NumGC tally.Counter + GcPauseMs tally.Timer + lastNumGC uint32 +} + +func (r *runtimeMetrics) report(metricsType ExtendedMetricsType) { + if metricsType == NoExtendedMetrics { + return + } + + r.NumGoRoutines.Update(float64(runtime.NumGoroutine())) + r.GoMaxProcs.Update(float64(runtime.GOMAXPROCS(0))) + if metricsType < DetailedExtendedMetrics { + return + } + + var memStats runtime.MemStats + runtime.ReadMemStats(&memStats) + r.MemoryAllocated.Update(float64(memStats.Alloc)) + r.MemoryHeap.Update(float64(memStats.HeapAlloc)) + r.MemoryHeapIdle.Update(float64(memStats.HeapIdle)) + r.MemoryHeapInuse.Update(float64(memStats.HeapInuse)) + r.MemoryStack.Update(float64(memStats.StackInuse)) + r.GCCPUFraction.Update(memStats.GCCPUFraction) + + // memStats.NumGC is a perpetually incrementing counter (unless it wraps at 2^32). + num := memStats.NumGC + lastNum := atomic.SwapUint32(&r.lastNumGC, num) + if delta := num - lastNum; delta > 0 { + r.NumGC.Inc(int64(delta)) + if delta > 255 { + // too many GCs happened, the timestamps buffer got wrapped around. Report only the last 256. + lastNum = num - 256 + } + for i := lastNum; i != num; i++ { + pause := memStats.PauseNs[i%256] + r.GcPauseMs.Record(time.Duration(pause)) + } + } +} + +type extendedMetricsReporter struct { + baseReporter + processReporter Reporter + + metricsType ExtendedMetricsType + runtime runtimeMetrics +} + +// NewExtendedMetricsReporter creates a new extended metrics reporter +// that reports runtime and process metrics. +func NewExtendedMetricsReporter( + scope tally.Scope, + reportInterval time.Duration, + metricsType ExtendedMetricsType, +) Reporter { + r := new(extendedMetricsReporter) + r.metricsType = metricsType + r.init(reportInterval, func() { + r.runtime.report(r.metricsType) + }) + if r.metricsType >= ModerateExtendedMetrics { + // ProcessReporter can be quite slow in some situations (specifically + // counting FDs for processes that have many of them) so it runs on + // its own report loop. + r.processReporter = NewProcessReporter(scope, reportInterval) + } + if r.metricsType == NoExtendedMetrics { + return r + } + + runtimeScope := scope.SubScope("runtime") + r.runtime.NumGoRoutines = runtimeScope.Gauge("num-goroutines") + r.runtime.GoMaxProcs = runtimeScope.Gauge("gomaxprocs") + if r.metricsType < DetailedExtendedMetrics { + return r + } + + var memstats runtime.MemStats + runtime.ReadMemStats(&memstats) + memoryScope := runtimeScope.SubScope("memory") + r.runtime.MemoryAllocated = memoryScope.Gauge("allocated") + r.runtime.MemoryHeap = memoryScope.Gauge("heap") + r.runtime.MemoryHeapIdle = memoryScope.Gauge("heapidle") + r.runtime.MemoryHeapInuse = memoryScope.Gauge("heapinuse") + r.runtime.MemoryStack = memoryScope.Gauge("stack") + r.runtime.GCCPUFraction = memoryScope.Gauge("gc-cpu-fraction") + r.runtime.NumGC = memoryScope.Counter("num-gc") + r.runtime.GcPauseMs = memoryScope.Timer("gc-pause-ms") + r.runtime.lastNumGC = memstats.NumGC + + return r +} + +func (e *extendedMetricsReporter) Start() error { + if err := e.baseReporter.Start(); err != nil { + return err + } + + if e.processReporter != nil { + if err := e.processReporter.Start(); err != nil { + return err + } + } + + return nil +} + +func (e *extendedMetricsReporter) Stop() error { + multiErr := xerrors.NewMultiError() + + if err := e.baseReporter.Stop(); err != nil { + multiErr = multiErr.Add(err) + } + + if e.processReporter != nil { + if err := e.processReporter.Stop(); err != nil { + multiErr = multiErr.Add(err) + } + } + + return multiErr.FinalError() +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/invariant.go b/vendor/github.com/m3db/m3/src/x/instrument/invariant.go new file mode 100644 index 00000000..baae4be7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/invariant.go @@ -0,0 +1,105 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "fmt" + "os" + "strings" + + "go.uber.org/zap" +) + +const ( + // InvariantViolatedMetricName is the name of the metric emitted upon + // invocation of `EmitInvariantViolation`. + InvariantViolatedMetricName = "invariant_violated" + + // InvariantViolatedLogFieldName is the name of the log field to be + // used when generating errors/log statements pertaining to the violation + // of an invariant. + InvariantViolatedLogFieldName = "violation" + + // InvariantViolatedLogFieldValue is the value of the log field to be + // used when generating errors/log statements pertaining to the violation + // of an invariant. + InvariantViolatedLogFieldValue = InvariantViolatedMetricName + + // ShouldPanicEnvironmentVariableName is the name of the environment variable + // that must be set to "true" in order for the invariant violated functions + // to panic after logging / emitting metrics. Should only be set in test + // environments. + ShouldPanicEnvironmentVariableName = "PANIC_ON_INVARIANT_VIOLATED" +) + +// EmitInvariantViolation emits a metric to indicate a system invariant has +// been violated. Users of this method are expected to monitor/alert off this +// metric to ensure they're notified when such an event occurs. Further, they +// should log further information to aid diagnostics of the system invariant +// violated at the callsite of the violation. Optionally panics if the +// ShouldPanicEnvironmentVariableName is set to "true". +func EmitInvariantViolation(opts Options) { + // NB(prateek): there's no need to cache this metric. It should be never + // be called in production systems unless something is seriously messed + // up. At which point, the extra map alloc should be of no concern. + opts.MetricsScope().Counter(InvariantViolatedMetricName).Inc(1) + + panicIfEnvSet() +} + +// EmitAndLogInvariantViolation calls EmitInvariantViolation and then calls the provided function +// with a supplied logger that is pre-configured with an invariant violated field. Optionally panics +// if the ShouldPanicEnvironmentVariableName is set to "true". +func EmitAndLogInvariantViolation(opts Options, f func(l *zap.Logger)) { + logger := opts.Logger().With( + zap.String(InvariantViolatedLogFieldName, InvariantViolatedLogFieldValue)) + f(logger) + + EmitInvariantViolation(opts) +} + +// InvariantErrorf constructs a new error, prefixed with a string indicating that an invariant +// violation occurred. Optionally panics if the ShouldPanicEnvironmentVariableName is set to "true". +func InvariantErrorf(format string, a ...interface{}) error { + var ( + invariantFormat = InvariantViolatedMetricName + ": " + format + err = fmt.Errorf(invariantFormat, a...) + ) + + panicIfEnvSetWithMessage(err.Error()) + return err +} + +func panicIfEnvSet() { + panicIfEnvSetWithMessage("") +} + +func panicIfEnvSetWithMessage(s string) { + envIsSet := strings.ToLower(os.Getenv(ShouldPanicEnvironmentVariableName)) == "true" + + if envIsSet { + if s == "" { + s = "invariant violation detected" + } + + panic(s) + } +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/logging.go b/vendor/github.com/m3db/m3/src/x/instrument/logging.go new file mode 100644 index 00000000..5c32555d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/logging.go @@ -0,0 +1,46 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// NewTestDebugLogger returns a new debug logger for tests. +func NewTestDebugLogger(t *testing.T) *zap.Logger { + loggerConfig := zap.NewDevelopmentConfig() + loggerConfig.Level = zap.NewAtomicLevelAt(zapcore.DebugLevel) + logger, err := loggerConfig.Build() + require.NoError(t, err) + return logger +} + +// NewTestOptions returns a set of instrument options useful for +// tests. This includes: +// - Logger built using development config with debug level set. +func NewTestOptions(t *testing.T) Options { + logger := NewTestDebugLogger(t) + return NewOptions().SetLogger(logger) +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/methods.go b/vendor/github.com/m3db/m3/src/x/instrument/methods.go new file mode 100644 index 00000000..f21a1119 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/methods.go @@ -0,0 +1,351 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "fmt" + "sync/atomic" + "time" + + "github.com/uber-go/tally" +) + +var ( + nullStopWatchStart tally.Stopwatch +) + +// TimerType is a type of timer, standard or histogram timer. +type TimerType uint + +const ( + // StandardTimerType is a standard timer type back by a regular timer. + StandardTimerType TimerType = iota + // HistogramTimerType is a histogram timer backed by a histogram. + HistogramTimerType +) + +// TimerOptions is a set of timer options when creating a timer. +type TimerOptions struct { + Type TimerType + StandardSampleRate float64 + HistogramBuckets tally.Buckets +} + +// NewTimer creates a new timer based on the timer options. +func (o TimerOptions) NewTimer(scope tally.Scope, name string) tally.Timer { + return NewTimer(scope, name, o) +} + +// DefaultHistogramTimerHistogramBuckets returns a set of default +// histogram timer histogram buckets, from 2ms up to 1hr. +func DefaultHistogramTimerHistogramBuckets() tally.Buckets { + return tally.ValueBuckets{ + 0.002, + 0.004, + 0.006, + 0.008, + 0.01, + 0.02, + 0.04, + 0.06, + 0.08, + 0.1, + 0.2, + 0.4, + 0.6, + 0.8, + 1, + 1.5, + 2, + 2.5, + 3, + 3.5, + 4, + 4.5, + 5, + 5.5, + 6, + 6.5, + 7, + 7.5, + 8, + 8.5, + 9, + 9.5, + 10, + 15, + 20, + 25, + 30, + 35, + 40, + 45, + 50, + 55, + 60, + 150, + 300, + 450, + 600, + 900, + 1200, + 1500, + 1800, + 2100, + 2400, + 2700, + 3000, + 3300, + 3600, + } +} + +// DefaultSummaryQuantileObjectives is a set of default summary +// quantile objectives and allowed error thresholds. +func DefaultSummaryQuantileObjectives() map[float64]float64 { + return map[float64]float64{ + 0.5: 0.01, + 0.75: 0.001, + 0.95: 0.001, + 0.99: 0.001, + 0.999: 0.0001, + } +} + +// NewStandardTimerOptions returns a set of standard timer options for +// standard timer types. +func NewStandardTimerOptions() TimerOptions { + return TimerOptions{Type: StandardTimerType} +} + +// HistogramTimerOptions is a set of histogram timer options. +type HistogramTimerOptions struct { + HistogramBuckets tally.Buckets +} + +// NewHistogramTimerOptions returns a set of histogram timer options +// and if no histogram buckets are set it will use the default +// histogram buckets defined. +func NewHistogramTimerOptions(opts HistogramTimerOptions) TimerOptions { + result := TimerOptions{Type: HistogramTimerType} + if opts.HistogramBuckets != nil && opts.HistogramBuckets.Len() > 0 { + result.HistogramBuckets = opts.HistogramBuckets + } else { + result.HistogramBuckets = DefaultHistogramTimerHistogramBuckets() + } + return result +} + +var _ tally.Timer = (*timer)(nil) + +// timer is a timer that can be backed by a timer or a histogram +// depending on TimerOptions. +type timer struct { + TimerOptions + timer tally.Timer + histogram tally.Histogram +} + +// NewTimer returns a new timer that is backed by a timer or a histogram +// based on the timer options. +func NewTimer(scope tally.Scope, name string, opts TimerOptions) tally.Timer { + t := &timer{TimerOptions: opts} + switch t.Type { + case HistogramTimerType: + t.histogram = scope.Histogram(name, opts.HistogramBuckets) + default: + t.timer = scope.Timer(name) + if rate := opts.StandardSampleRate; validRate(rate) { + t.timer = newSampledTimer(t.timer, rate) + } + } + return t +} + +func (t *timer) Record(v time.Duration) { + switch t.Type { + case HistogramTimerType: + t.histogram.RecordDuration(v) + default: + t.timer.Record(v) + } +} + +func (t *timer) Start() tally.Stopwatch { + return tally.NewStopwatch(time.Now(), t) +} + +func (t *timer) RecordStopwatch(stopwatchStart time.Time) { + t.Record(time.Since(stopwatchStart)) +} + +// sampledTimer is a sampled timer that implements the tally timer interface. +// NB(xichen): the sampling logic should eventually be implemented in tally. +type sampledTimer struct { + tally.Timer + + cnt uint64 + rate uint64 +} + +// NewSampledTimer creates a new sampled timer. +func NewSampledTimer(base tally.Timer, rate float64) (tally.Timer, error) { + if !validRate(rate) { + return nil, fmt.Errorf("sampling rate %f must be between 0.0 and 1.0", rate) + } + return newSampledTimer(base, rate), nil +} + +func validRate(rate float64) bool { + return rate > 0.0 && rate <= 1.0 +} + +func newSampledTimer(base tally.Timer, rate float64) tally.Timer { + if rate == 1.0 { + // Avoid the overhead of working out if should sample each time. + return base + } + return &sampledTimer{ + Timer: base, + rate: uint64(1.0 / rate), + } +} + +// MustCreateSampledTimer creates a new sampled timer, and panics if an error +// is encountered. +func MustCreateSampledTimer(base tally.Timer, rate float64) tally.Timer { + t, err := NewSampledTimer(base, rate) + if err != nil { + panic(err) + } + return t +} + +func (t *sampledTimer) shouldSample() bool { + return atomic.AddUint64(&t.cnt, 1)%t.rate == 0 +} + +func (t *sampledTimer) Start() tally.Stopwatch { + if !t.shouldSample() { + return nullStopWatchStart + } + return t.Timer.Start() +} + +func (t *sampledTimer) Stop(startTime tally.Stopwatch) { + if startTime == nullStopWatchStart { // nolint: badtime + // If startTime is nullStopWatchStart, do nothing. + return + } + startTime.Stop() +} + +func (t *sampledTimer) Record(d time.Duration) { + if !t.shouldSample() { + return + } + t.Timer.Record(d) +} + +// MethodMetrics is a bundle of common metrics with a uniform naming scheme. +type MethodMetrics struct { + Errors tally.Counter + Success tally.Counter + ErrorsLatency tally.Timer + SuccessLatency tally.Timer +} + +// ReportSuccess reports a success. +func (m *MethodMetrics) ReportSuccess(d time.Duration) { + m.Success.Inc(1) + m.SuccessLatency.Record(d) +} + +// ReportError reports an error. +func (m *MethodMetrics) ReportError(d time.Duration) { + m.Errors.Inc(1) + m.ErrorsLatency.Record(d) +} + +// ReportSuccessOrError increments Error/Success counter dependending on the error. +func (m *MethodMetrics) ReportSuccessOrError(e error, d time.Duration) { + if e != nil { + m.ReportError(d) + } else { + m.ReportSuccess(d) + } +} + +// NewMethodMetrics returns a new Method metrics for the given method name. +func NewMethodMetrics(scope tally.Scope, methodName string, opts TimerOptions) MethodMetrics { + return MethodMetrics{ + Errors: scope.Counter(methodName + ".errors"), + Success: scope.Counter(methodName + ".success"), + ErrorsLatency: NewTimer(scope, methodName+".errors-latency", opts), + SuccessLatency: NewTimer(scope, methodName+".success-latency", opts), + } +} + +// BatchMethodMetrics is a bundle of common metrics for methods with batch semantics. +type BatchMethodMetrics struct { + RetryableErrors tally.Counter + NonRetryableErrors tally.Counter + Errors tally.Counter + Success tally.Counter + Latency tally.Timer +} + +// NewBatchMethodMetrics creates new batch method metrics. +func NewBatchMethodMetrics( + scope tally.Scope, + methodName string, + opts TimerOptions, +) BatchMethodMetrics { + return BatchMethodMetrics{ + RetryableErrors: scope.Counter(methodName + ".retryable-errors"), + NonRetryableErrors: scope.Counter(methodName + ".non-retryable-errors"), + Errors: scope.Counter(methodName + ".errors"), + Success: scope.Counter(methodName + ".success"), + Latency: NewTimer(scope, methodName+".latency", opts), + } +} + +// ReportSuccess reports successess. +func (m *BatchMethodMetrics) ReportSuccess(n int) { + m.Success.Inc(int64(n)) +} + +// ReportRetryableErrors reports retryable errors. +func (m *BatchMethodMetrics) ReportRetryableErrors(n int) { + m.RetryableErrors.Inc(int64(n)) + m.Errors.Inc(int64(n)) +} + +// ReportNonRetryableErrors reports non-retryable errors. +func (m *BatchMethodMetrics) ReportNonRetryableErrors(n int) { + m.NonRetryableErrors.Inc(int64(n)) + m.Errors.Inc(int64(n)) +} + +// ReportLatency reports latency. +func (m *BatchMethodMetrics) ReportLatency(d time.Duration) { + m.Latency.Record(d) +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/options.go b/vendor/github.com/m3db/m3/src/x/instrument/options.go new file mode 100644 index 00000000..0ddff6ad --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/options.go @@ -0,0 +1,108 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "os" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/uber-go/tally" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +const ( + defaultSamplingRate = 1.0 + defaultReportingInterval = time.Second +) + +type options struct { + zap *zap.Logger + scope tally.Scope + tracer opentracing.Tracer + samplingRate float64 + timerOptions TimerOptions + reportInterval time.Duration +} + +// NewOptions creates new instrument options. +func NewOptions() Options { + zapCore := zapcore.NewCore( + zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), os.Stdout, zap.InfoLevel) + zapLogger := zap.New(zapCore) + return &options{ + zap: zapLogger, + scope: tally.NoopScope, + samplingRate: defaultSamplingRate, + reportInterval: defaultReportingInterval, + } +} + +func (o *options) SetLogger(value *zap.Logger) Options { + opts := *o + opts.zap = value + return &opts +} + +func (o *options) Logger() *zap.Logger { + return o.zap +} + +func (o *options) SetMetricsScope(value tally.Scope) Options { + opts := *o + opts.scope = value + return &opts +} + +func (o *options) MetricsScope() tally.Scope { + return o.scope +} + +func (o *options) Tracer() opentracing.Tracer { + return o.tracer +} + +func (o *options) SetTracer(tracer opentracing.Tracer) Options { + opts := *o + opts.tracer = tracer + return &opts +} + +func (o *options) SetTimerOptions(value TimerOptions) Options { + opts := *o + opts.timerOptions = value + return &opts +} + +func (o *options) TimerOptions() TimerOptions { + return o.timerOptions +} + +func (o *options) SetReportInterval(value time.Duration) Options { + opts := *o + opts.reportInterval = value + return &opts +} + +func (o *options) ReportInterval() time.Duration { + return o.reportInterval +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/process.go b/vendor/github.com/m3db/m3/src/x/instrument/process.go new file mode 100644 index 00000000..487f4cdb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/process.go @@ -0,0 +1,68 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "os" + "time" + + "github.com/m3db/m3/src/x/process" + + "github.com/uber-go/tally" +) + +type processReporter struct { + baseReporter + + metrics processMetrics +} + +type processMetrics struct { + NumFDs tally.Gauge + NumFDErrors tally.Counter + pid int +} + +func (r *processMetrics) report() { + numFDs, err := process.NumFDsWithDefaultBatchSleep(r.pid) + if err == nil { + r.NumFDs.Update(float64(numFDs)) + } else { + r.NumFDErrors.Inc(1) + } +} + +// NewProcessReporter returns a new reporter that reports process +// metrics, currently just the process file descriptor count. +func NewProcessReporter( + scope tally.Scope, + reportInterval time.Duration, +) Reporter { + r := new(processReporter) + r.init(reportInterval, r.metrics.report) + + processScope := scope.SubScope("process") + r.metrics.NumFDs = processScope.Gauge("num-fds") + r.metrics.NumFDErrors = processScope.Counter("num-fd-errors") + r.metrics.pid = os.Getpid() + + return r +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/prom_process_collector.go b/vendor/github.com/m3db/m3/src/x/instrument/prom_process_collector.go new file mode 100644 index 00000000..8a5fba86 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/prom_process_collector.go @@ -0,0 +1,214 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "errors" + "os" + + "github.com/m3db/prometheus_client_golang/prometheus" + procfs "github.com/m3db/prometheus_procfs" +) + +type processCollector struct { + collectFn func(chan<- prometheus.Metric) + pidFn func() (int, error) + reportErrors bool + cpuTotal *prometheus.Desc + openFDs, maxFDs *prometheus.Desc + vsize, maxVsize *prometheus.Desc + rss *prometheus.Desc + startTime *prometheus.Desc +} + +// ProcessCollectorOpts defines the behavior of a process metrics collector +// created with NewProcessCollector. +type ProcessCollectorOpts struct { + // PidFn returns the PID of the process the collector collects metrics + // for. It is called upon each collection. By default, the PID of the + // current process is used, as determined on construction time by + // calling os.Getpid(). + PidFn func() (int, error) + // If non-empty, each of the collected metrics is prefixed by the + // provided string and an underscore ("_"). + Namespace string + // DisableOpenFDs allows disabling the reporting of open FDs due to + // the cost that is required to report the number of file descriptors. + DisableOpenFDs bool + // If true, any error encountered during collection is reported as an + // invalid metric (see NewInvalidMetric). Otherwise, errors are ignored + // and the collected metrics will be incomplete. (Possibly, no metrics + // will be collected at all.) While that's usually not desired, it is + // appropriate for the common "mix-in" of process metrics, where process + // metrics are nice to have, but failing to collect them should not + // disrupt the collection of the remaining metrics. + ReportErrors bool +} + +// NewPrometheusProcessCollector returns a collector which exports the current state of +// process metrics including CPU, memory and file descriptor usage as well as +// the process start time. The detailed behavior is defined by the provided +// ProcessCollectorOpts. The zero value of ProcessCollectorOpts creates a +// collector for the current process with an empty namespace string and no error +// reporting. +// +// Currently, the collector depends on a Linux-style proc filesystem and +// therefore only exports metrics for Linux. +// +// NB(r): This version of the Prometheus process collector allows skipping emitting +// open FDs due to excessive load reporting open FDs with processes with +// a large number of open FDs. +func NewPrometheusProcessCollector(opts ProcessCollectorOpts) prometheus.Collector { + ns := "" + if len(opts.Namespace) > 0 { + ns = opts.Namespace + "_" + } + + c := &processCollector{ + reportErrors: opts.ReportErrors, + cpuTotal: prometheus.NewDesc( + ns+"process_cpu_seconds_total", + "Total user and system CPU time spent in seconds.", + nil, nil, + ), + maxFDs: prometheus.NewDesc( + ns+"process_max_fds", + "Maximum number of open file descriptors.", + nil, nil, + ), + vsize: prometheus.NewDesc( + ns+"process_virtual_memory_bytes", + "Virtual memory size in bytes.", + nil, nil, + ), + maxVsize: prometheus.NewDesc( + ns+"process_virtual_memory_max_bytes", + "Maximum amount of virtual memory available in bytes.", + nil, nil, + ), + rss: prometheus.NewDesc( + ns+"process_resident_memory_bytes", + "Resident memory size in bytes.", + nil, nil, + ), + startTime: prometheus.NewDesc( + ns+"process_start_time_seconds", + "Start time of the process since unix epoch in seconds.", + nil, nil, + ), + } + + if !opts.DisableOpenFDs { + c.openFDs = prometheus.NewDesc( + ns+"process_open_fds", + "Number of open file descriptors.", + nil, nil, + ) + } + + if opts.PidFn == nil { + pid := os.Getpid() + c.pidFn = func() (int, error) { return pid, nil } + } else { + c.pidFn = opts.PidFn + } + + // Set up process metric collection if supported by the runtime. + if _, err := procfs.NewStat(); err == nil { + c.collectFn = c.processCollect + } else { + c.collectFn = func(ch chan<- prometheus.Metric) { + c.reportError(ch, nil, errors.New("process metrics not supported on this platform")) + } + } + + return c +} + +// Describe returns all descriptions of the collector. +func (c *processCollector) Describe(ch chan<- *prometheus.Desc) { + ch <- c.cpuTotal + if c.openFDs != nil { + ch <- c.openFDs + } + ch <- c.maxFDs + ch <- c.vsize + ch <- c.maxVsize + ch <- c.rss + ch <- c.startTime +} + +// Collect returns the current state of all metrics of the collector. +func (c *processCollector) Collect(ch chan<- prometheus.Metric) { + c.collectFn(ch) +} + +func (c *processCollector) processCollect(ch chan<- prometheus.Metric) { + pid, err := c.pidFn() + if err != nil { + c.reportError(ch, nil, err) + return + } + + p, err := procfs.NewProc(pid) + if err != nil { + c.reportError(ch, nil, err) + return + } + + if stat, err := p.NewStat(); err == nil { + ch <- prometheus.MustNewConstMetric(c.cpuTotal, prometheus.CounterValue, stat.CPUTime()) + ch <- prometheus.MustNewConstMetric(c.vsize, prometheus.GaugeValue, float64(stat.VirtualMemory())) + ch <- prometheus.MustNewConstMetric(c.rss, prometheus.GaugeValue, float64(stat.ResidentMemory())) + if startTime, err := stat.StartTime(); err == nil { + ch <- prometheus.MustNewConstMetric(c.startTime, prometheus.GaugeValue, startTime) + } else { + c.reportError(ch, c.startTime, err) + } + } else { + c.reportError(ch, nil, err) + } + + if c.openFDs != nil { + if fds, err := p.FileDescriptorsLen(); err == nil { + ch <- prometheus.MustNewConstMetric(c.openFDs, prometheus.GaugeValue, float64(fds)) + } else { + c.reportError(ch, c.openFDs, err) + } + } + + if limits, err := p.NewLimits(); err == nil { + ch <- prometheus.MustNewConstMetric(c.maxFDs, prometheus.GaugeValue, float64(limits.OpenFiles)) + ch <- prometheus.MustNewConstMetric(c.maxVsize, prometheus.GaugeValue, float64(limits.AddressSpace)) + } else { + c.reportError(ch, nil, err) + } +} + +func (c *processCollector) reportError(ch chan<- prometheus.Metric, desc *prometheus.Desc, err error) { + if !c.reportErrors { + return + } + if desc == nil { + desc = prometheus.NewInvalidDesc(err) + } + ch <- prometheus.NewInvalidMetric(desc, err) +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/reporter.go b/vendor/github.com/m3db/m3/src/x/instrument/reporter.go new file mode 100644 index 00000000..eae1e884 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/reporter.go @@ -0,0 +1,112 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "errors" + "sync" + "time" +) + +type reporterState int + +const ( + reporterStateNotStarted reporterState = iota + reporterStateStarted + reporterStateStopped +) + +var ( + errReporterAlreadyStartedOrStopped = errors.New("reporter already started or stopped") + errReporterNotRunning = errors.New("reporter not running") + errReporterReportIntervalInvalid = errors.New("reporter report interval is invalid") +) + +type baseReporter struct { + sync.Mutex + + state reporterState + reportInterval time.Duration + closeCh chan struct{} + doneCh chan struct{} + + // fn is the only field required to set + fn func() +} + +func (r *baseReporter) init( + reportInterval time.Duration, + fn func(), +) { + r.reportInterval = reportInterval + r.closeCh = make(chan struct{}) + r.doneCh = make(chan struct{}) + r.fn = fn +} + +func (r *baseReporter) Start() error { + r.Lock() + defer r.Unlock() + + if r.state != reporterStateNotStarted { + return errReporterAlreadyStartedOrStopped + } + + if r.reportInterval <= 0 { + return errReporterReportIntervalInvalid + } + + r.state = reporterStateStarted + + go func() { + ticker := time.NewTicker(r.reportInterval) + defer func() { + ticker.Stop() + r.doneCh <- struct{}{} + }() + + for { + select { + case <-ticker.C: + r.fn() + case <-r.closeCh: + return + } + } + }() + + return nil +} + +func (r *baseReporter) Stop() error { + r.Lock() + defer r.Unlock() + + if r.state != reporterStateStarted { + return errReporterNotRunning + } + + r.state = reporterStateStopped + close(r.closeCh) + <-r.doneCh + + return nil +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/sanitize.go b/vendor/github.com/m3db/m3/src/x/instrument/sanitize.go new file mode 100644 index 00000000..3a928291 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/sanitize.go @@ -0,0 +1,102 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "fmt" + "strings" + + "github.com/uber-go/tally" + "github.com/uber-go/tally/m3" + "github.com/uber-go/tally/prometheus" +) + +// MetricSanitizationType is a type of sanitizer to use for metrics. +type MetricSanitizationType int + +const ( + // NoMetricSanitization performs no metric sanitization. + NoMetricSanitization MetricSanitizationType = iota + + // M3MetricSanitization performs M3 metric sanitization. + M3MetricSanitization + + // PrometheusMetricSanitization performs Prometheus metric sanitization. + PrometheusMetricSanitization + + // defaultMetricSanitization is the default metric sanitization. + defaultMetricSanitization = NoMetricSanitization +) + +var ( + validMetricSanitizationTypes = []MetricSanitizationType{ + NoMetricSanitization, + M3MetricSanitization, + PrometheusMetricSanitization, + } +) + +func (t MetricSanitizationType) String() string { + switch t { + case NoMetricSanitization: + return "none" + case M3MetricSanitization: + return "m3" + case PrometheusMetricSanitization: + return "prometheus" + } + return "unknown" +} + +// UnmarshalYAML unmarshals a MetricSanitizationType into a valid type from string. +func (t *MetricSanitizationType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var str string + if err := unmarshal(&str); err != nil { + return err + } + if str == "" { + *t = defaultMetricSanitization + return nil + } + strs := make([]string, 0, len(validMetricSanitizationTypes)) + for _, valid := range validMetricSanitizationTypes { + if str == valid.String() { + *t = valid + return nil + } + strs = append(strs, "'"+valid.String()+"'") + } + return fmt.Errorf("invalid MetricSanitizationType '%s' valid types are: %s", + str, strings.Join(strs, ", ")) +} + +// NewOptions returns a new set of sanitization options for the sanitization type. +func (t *MetricSanitizationType) NewOptions() *tally.SanitizeOptions { + switch *t { + case NoMetricSanitization: + return nil + case M3MetricSanitization: + return &m3.DefaultSanitizerOpts + case PrometheusMetricSanitization: + return &prometheus.DefaultSanitizerOpts + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/string_list_emitter.go b/vendor/github.com/m3db/m3/src/x/instrument/string_list_emitter.go new file mode 100644 index 00000000..37956e51 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/string_list_emitter.go @@ -0,0 +1,146 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package instrument + +import ( + "errors" + "fmt" + "sync" + "time" + + "github.com/uber-go/tally" +) + +const ( + // stringListEmitterWaitInterval defines the time to wait between emitting + // the value of the Gauge again. + stringListEmitterWaitInterval = 10 * time.Second +) + +var ( + errStringListEmitterAlreadyRunning = errors.New("string list emitter: already running") + errStringListEmitterNotStarted = errors.New("string list emitter: not running") +) + +// StringListEmitter emits a gauges indicating the order of a list of strings. +type StringListEmitter struct { + sync.Mutex + running bool + doneCh chan bool + scope tally.Scope + gauges []tally.Gauge + name string + tagPrefix string +} + +// NewStringListEmitter returns a StringListEmitter. +func NewStringListEmitter(scope tally.Scope, name string) *StringListEmitter { + gauge := []tally.Gauge{tally.NoopScope.Gauge("blackhole")} + return &StringListEmitter{ + running: false, + doneCh: make(chan bool, 1), + scope: scope, + gauges: gauge, + name: name, + } +} + +// newGauges creates a gauge per string in a passed list of strings. +func (sle *StringListEmitter) newGauges(scope tally.Scope, sl []string) []tally.Gauge { + gauges := make([]tally.Gauge, len(sl)) + for i, v := range sl { + name := fmt.Sprintf("%s_%d", sle.name, i) + g := scope.Tagged(map[string]string{"type": v}).Gauge(name) + g.Update(1) + gauges[i] = g + } + + return gauges +} + +// update updates the Gauges on the StringListEmitter. Client should acquire a +// Lock before updating. +func (sle *StringListEmitter) update(val float64) { + for _, gauge := range sle.gauges { + gauge.Update(val) + } +} + +// Start starts a goroutine that continuously emits the value of the gauges +func (sle *StringListEmitter) Start(sl []string) error { + sle.Lock() + defer sle.Unlock() + + if sle.running { + return errStringListEmitterAlreadyRunning + } + + sle.gauges = sle.newGauges(sle.scope, sl) + + sle.running = true + go func() { + for { + select { + case <-sle.doneCh: + return + default: + sle.Lock() + sle.update(1) + sle.Unlock() + time.Sleep(stringListEmitterWaitInterval) + } + } + }() + return nil +} + +// UpdateStringList updates the gauges according to the passed +// list of strings. It will first set the old gauges to 0, then emit +// new metrics with different values for the "type" label. +func (sle *StringListEmitter) UpdateStringList(sl []string) error { + sle.Lock() + defer sle.Unlock() + + if !sle.running { + return errStringListEmitterNotStarted + } + + sle.update(0) + + sle.gauges = sle.newGauges(sle.scope, sl) + + return nil +} + +// Close stops emitting the gauge. +func (sle *StringListEmitter) Close() error { + sle.Lock() + defer sle.Unlock() + + if !sle.running { + return errStringListEmitterNotStarted + } + + sle.running = false + close(sle.doneCh) + + return nil +} diff --git a/vendor/github.com/m3db/m3/src/x/instrument/types.go b/vendor/github.com/m3db/m3/src/x/instrument/types.go new file mode 100644 index 00000000..4f7099cd --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/instrument/types.go @@ -0,0 +1,74 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package instrument implements functions to make instrumenting code, +// including metrics and logging, easier. +package instrument + +import ( + "time" + + "github.com/opentracing/opentracing-go" + "github.com/uber-go/tally" + "go.uber.org/zap" +) + +// Reporter reports metrics about a component. +type Reporter interface { + // Start starts the reporter. + Start() error + // Stop stops the reporter. + Stop() error +} + +// Options represents the options for instrumentation. +type Options interface { + // SetLogger sets the zap logger + SetLogger(value *zap.Logger) Options + + // ZapLogger returns the zap logger + Logger() *zap.Logger + + // SetMetricsScope sets the metrics scope. + SetMetricsScope(value tally.Scope) Options + + // MetricsScope returns the metrics scope. + MetricsScope() tally.Scope + + // Tracer returns the tracer. + Tracer() opentracing.Tracer + + // SetTracer sets the tracer. + SetTracer(tracer opentracing.Tracer) Options + + // SetTimerOptions sets the metrics timer options to used + // when building timers from timer options. + SetTimerOptions(value TimerOptions) Options + + // TimerOptions returns the metrics timer options to used + // when building timers from timer options. + TimerOptions() TimerOptions + + // SetReportInterval sets the time between reporting metrics within the system. + SetReportInterval(time.Duration) Options + + // ReportInterval returns the time between reporting metrics within the system. + ReportInterval() time.Duration +} diff --git a/vendor/github.com/m3db/m3/src/x/mmap/mmap.go b/vendor/github.com/m3db/m3/src/x/mmap/mmap.go new file mode 100644 index 00000000..c1541295 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/mmap/mmap.go @@ -0,0 +1,167 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mmap + +import ( + "fmt" + "os" + + xerrors "github.com/m3db/m3/src/x/errors" +) + +// FileOpener is the signature of a function that MmapFiles can use +// to open files +type FileOpener func(filePath string) (*os.File, error) + +// Package-level global for easy mocking +var mmapFdFn = Fd + +// FileDesc contains the fields required for Mmaping a file using MmapFiles +type FileDesc struct { + // file is the *os.File ref to store + File **os.File + // bytes is the []byte slice ref to store the mmap'd address + Descriptor *Descriptor + // options specifies options to use when mmaping a file + Options Options +} + +// Options contains the options for mmap'ing a file +type Options struct { + // read is whether to make mmap bytes ref readable + Read bool + // write is whether to make mmap bytes ref writable + Write bool + // hugeTLB is the mmap huge TLB options + HugeTLB HugeTLBOptions + // ReporterOptions is the reporter options + ReporterOptions ReporterOptions +} + +// Descriptor is a descriptor of a successful mmap +type Descriptor struct { + Bytes []byte + Warning error + ReporterOptions ReporterOptions +} + +// HugeTLBOptions contains all options related to huge TLB +type HugeTLBOptions struct { + // enabled determines if using the huge TLB flag is enabled for platforms + // that support it + Enabled bool + // threshold determines if the size being mmap'd is greater or equal + // to this value to use or not use the huge TLB flag if enabled + Threshold int64 +} + +// ReporterOptions contains all options to tracking mmap calls +type ReporterOptions struct { + // Context is the context to report to reporter for this + Context Context + // Reporter if set will receive events for reporting + Reporter Reporter +} + +// Context provides context about the current mmap for reporting purposes +type Context struct { + Size int64 + Name string + Metadata map[string]string +} + +// Reporter implements the reporting of mmap. +type Reporter interface { + // ReportMap reports the mapping of an mmap and allows an error to be + // returned in case the reporter want's to deny allowing this map call. + ReportMap(ctx Context) error + // ReportUnmap reports the unmapping of an mmap and allows an error to be + // returned in case the reporter want's to deny allowing this unmap call. + ReportUnmap(ctx Context) error +} + +// FilesResult contains the result of calling MmapFiles +type FilesResult struct { + Warning error +} + +// Files is a utility function for mmap'ing a group of files at once +func Files(opener FileOpener, files map[string]FileDesc) (FilesResult, error) { + multiWarn := xerrors.NewMultiError() + multiErr := xerrors.NewMultiError() + + for filePath, fileDesc := range files { + fd, err := opener(filePath) + if err != nil { + multiErr = multiErr.Add(errorWithFilename(filePath, err)) + break + } + + desc, err := File(fd, fileDesc.Options) + if err != nil { + multiErr = multiErr.Add(errorWithFilename(filePath, err)) + break + } + if desc.Warning != nil { + multiWarn = multiWarn.Add(errorWithFilename(filePath, desc.Warning)) + } + + *fileDesc.File = fd + *fileDesc.Descriptor = desc + } + + if multiErr.FinalError() == nil { + return FilesResult{Warning: multiWarn.FinalError()}, nil + } + + // If we have encountered an error when opening the files, + // close the ones that have been opened. + for filePath, fileDesc := range files { + if *fileDesc.File != nil { + multiErr = multiErr.Add(errorWithFilename(filePath, (*fileDesc.File).Close())) + } + if fileDesc.Descriptor != nil { + multiErr = multiErr.Add(errorWithFilename(filePath, Munmap(*fileDesc.Descriptor))) + } + } + + return FilesResult{Warning: multiWarn.FinalError()}, multiErr.FinalError() +} + +// File mmap's a file +func File(file *os.File, opts Options) (Descriptor, error) { + name := file.Name() + stat, err := os.Stat(name) + if err != nil { + return Descriptor{}, fmt.Errorf("mmap file could not stat %s: %v", name, err) + } + if stat.IsDir() { + return Descriptor{}, fmt.Errorf("mmap target is directory: %s", name) + } + return mmapFdFn(int64(file.Fd()), 0, stat.Size(), opts) +} + +func errorWithFilename(name string, err error) error { + if err == nil { + return nil + } + return fmt.Errorf("file %s encountered err: %s", name, err.Error()) +} diff --git a/vendor/github.com/m3db/m3/src/x/mmap/mmap_linux.go b/vendor/github.com/m3db/m3/src/x/mmap/mmap_linux.go new file mode 100644 index 00000000..2e34c863 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/mmap/mmap_linux.go @@ -0,0 +1,146 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package mmap + +import ( + "fmt" + "syscall" +) + +// Fd mmaps a file +func Fd(fd, offset, length int64, opts Options) (Descriptor, error) { + // MAP_PRIVATE because we only want to ever mmap immutable things and we don't + // ever want to propagate writes back to the underlying file + // Set HugeTLB to disabled because its not supported for files + opts.HugeTLB.Enabled = false + return mmap(fd, offset, length, syscall.MAP_PRIVATE, opts) +} + +// Bytes requests a private (non-shared) region of anonymous (not backed by a file) memory from the O.S +func Bytes(length int64, opts Options) (Descriptor, error) { + // offset is 0 because we're not indexing into a file + // fd is -1 and MAP_ANON because we're asking for an anonymous region of memory not tied to a file + // MAP_PRIVATE because we don't plan on sharing this region of memory with other processes + return mmap(-1, 0, length, syscall.MAP_ANON|syscall.MAP_PRIVATE, opts) +} + +func mmap(fd, offset, length int64, flags int, opts Options) (Descriptor, error) { + if length == 0 { + // Return an empty slice (but not nil so callers who + // use nil to mean something special like not initialized + // get back an actual ref) + return Descriptor{ + Bytes: make([]byte, 0), + }, nil + } + + var prot int + if opts.Read { + prot = prot | syscall.PROT_READ + } + if opts.Write { + prot = prot | syscall.PROT_WRITE + } + + flagsWithoutHugeTLB := flags + shouldUseHugeTLB := opts.HugeTLB.Enabled && length >= opts.HugeTLB.Threshold + if shouldUseHugeTLB { + // We use the MAP_HUGETLB flag instead of MADV_HUGEPAGE because transparent + // hugepages only work with anonymous, private pages. Please see the MADV_HUGEPAGE + // section of http://man7.org/linux/man-pages/man2/madvise.2.html and the MAP_HUGETLB + // section of http://man7.org/linux/man-pages/man2/mmap.2.html for more details. + flags = flags | syscall.MAP_HUGETLB + } + + var ( + b []byte + err error + warning error + ) + b, err = syscall.Mmap(int(fd), offset, int(length), prot, flags) + // Sometimes allocations that specify huge pages will fail because the O.S + // isn't configured properly or there are not enough available huge pages in + // the pool. You can try and allocate more by executing: + // echo 20 > /proc/sys/vm/nr_hugepages + // See this document for more details: https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt + // Regardless, we don't want to fail hard in that scenario. Instead, we try + // and mmap without the hugeTLB flag. + if err != nil && shouldUseHugeTLB { + // In case we succeed the second time, make sure we can propagate the previous + // error back to the caller as a warning + warning = fmt.Errorf( + "error while trying to mmap with hugeTLB flag: %s, hugeTLB disabled", err.Error()) + b, err = syscall.Mmap(int(fd), offset, int(length), prot, flagsWithoutHugeTLB) + } + if err != nil { + return Descriptor{}, fmt.Errorf("mmap error: %v", err) + } + + if reporter := opts.ReporterOptions.Reporter; reporter != nil { + opts.ReporterOptions.Context.Size = length + if err := reporter.ReportMap(opts.ReporterOptions.Context); err != nil { + // Allow the reporter to deny an mmap to allow enforcement of proper + // reporting if it wants to. + syscall.Munmap(b) + return Descriptor{}, err + } + } + + return Descriptor{ + Bytes: b, + Warning: warning, + ReporterOptions: opts.ReporterOptions, + }, nil +} + +// Munmap munmaps a byte slice that is backed by an mmap +func Munmap(desc Descriptor) error { + if len(desc.Bytes) == 0 { + // Never actually mmapd this, just returned empty slice + return nil + } + + if err := syscall.Munmap(desc.Bytes); err != nil { + return fmt.Errorf("munmap error: %v", err) + } + + if reporter := desc.ReporterOptions.Reporter; reporter != nil { + if err := reporter.ReportUnmap(desc.ReporterOptions.Context); err != nil { + // Allow the reporter to return an error from unmap to allow + // enforcement of proper reporting if it wants to. + return err + } + } + + return nil +} + +// MadviseDontNeed frees mmapped memory. +// `MADV_DONTNEED` informs the kernel to free the mmapped pages right away instead of waiting for memory pressure. +// NB(bodu): DO NOT FREE anonymously mapped memory or else it will null all of the underlying bytes as the +// memory is not file backed. +func MadviseDontNeed(desc Descriptor) error { + // Do nothing if there's no data. + if len(desc.Bytes) == 0 { + return nil + } + return syscall.Madvise(desc.Bytes, syscall.MADV_DONTNEED) +} diff --git a/vendor/github.com/m3db/m3/src/x/mmap/mmap_other.go b/vendor/github.com/m3db/m3/src/x/mmap/mmap_other.go new file mode 100644 index 00000000..b8fb9cfe --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/mmap/mmap_other.go @@ -0,0 +1,128 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// +build !linux + +package mmap + +import ( + "fmt" + "syscall" + "unsafe" +) + +// Fd mmaps a file +func Fd(fd, offset, length int64, opts Options) (Descriptor, error) { + // MAP_PRIVATE because we only want to ever mmap immutable things and we don't + // ever want to propagate writes back to the underlying file + // Set HugeTLB to disabled because its not supported for files + opts.HugeTLB.Enabled = false + return mmap(fd, offset, length, syscall.MAP_PRIVATE, opts) +} + +// Bytes requests a private (non-shared) region of anonymous (not backed by a file) memory from the O.S +func Bytes(length int64, opts Options) (Descriptor, error) { + // offset is 0 because we're not indexing into a file + // fd is -1 and MAP_ANON because we're asking for an anonymous region of memory not tied to a file + // MAP_PRIVATE because we don't plan on sharing this region of memory with other processes + return mmap(-1, 0, length, syscall.MAP_ANON|syscall.MAP_PRIVATE, opts) +} + +func mmap(fd, offset, length int64, flags int, opts Options) (Descriptor, error) { + if length == 0 { + // Return an empty slice (but not nil so callers who + // use nil to mean something special like not initialized + // get back an actual ref) + return Descriptor{Bytes: make([]byte, 0)}, nil + } + + var prot int + if opts.Read { + prot = prot | syscall.PROT_READ + } + if opts.Write { + prot = prot | syscall.PROT_WRITE + } + + b, err := syscall.Mmap(int(fd), offset, int(length), prot, flags) + if err != nil { + return Descriptor{}, fmt.Errorf("mmap error: %v", err) + } + + if reporter := opts.ReporterOptions.Reporter; reporter != nil { + opts.ReporterOptions.Context.Size = length + if err := reporter.ReportMap(opts.ReporterOptions.Context); err != nil { + // Allow the reporter to deny an mmap to allow enforcement of proper + // reporting if it wants to. + syscall.Munmap(b) + return Descriptor{}, err + } + } + + return Descriptor{ + Bytes: b, + ReporterOptions: opts.ReporterOptions, + }, nil +} + +// Munmap munmaps a byte slice that is backed by an mmap +func Munmap(desc Descriptor) error { + if len(desc.Bytes) == 0 { + // Never actually mmapd this, just returned empty slice + return nil + } + + if err := syscall.Munmap(desc.Bytes); err != nil { + return fmt.Errorf("munmap error: %v", err) + } + + if reporter := desc.ReporterOptions.Reporter; reporter != nil { + if err := reporter.ReportUnmap(desc.ReporterOptions.Context); err != nil { + // Allow the reporter to return an error from unmap to allow + // enforcement of proper reporting if it wants to. + return err + } + } + + return nil +} + +// MadviseDontNeed frees mmapped memory. +// `MADV_DONTNEED` informs the kernel to free the mmapped pages right away instead of waiting for memory pressure. +// NB(bodu): DO NOT FREE anonymously mapped memory or else it will null all of the underlying bytes as the +// memory is not file backed. +func MadviseDontNeed(desc Descriptor) error { + // Do nothing if there's no data. + if len(desc.Bytes) == 0 { + return nil + } + return madvise(desc.Bytes, syscall.MADV_DONTNEED) +} + +// This is required because the unix package does not support the madvise system call. +// This works generically for other non linux platforms. +func madvise(b []byte, advice int) (err error) { + _, _, e1 := syscall.Syscall(syscall.SYS_MADVISE, uintptr(unsafe.Pointer(&b[0])), + uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = e1 + } + return +} diff --git a/vendor/github.com/m3db/m3/src/x/opentracing/context.go b/vendor/github.com/m3db/m3/src/x/opentracing/context.go new file mode 100644 index 00000000..e3795127 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/opentracing/context.go @@ -0,0 +1,81 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package opentracing + +import ( + "context" + "fmt" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/log" +) + +// alias GlobalTracer() so we can mock out the tracer without impacting tests outside the package +var getGlobalTracer = opentracing.GlobalTracer + +// SpanFromContextOrNoop is the same as opentracing.SpanFromContext, +// but instead of returning nil, +// it returns a NoopTracer span if ctx doesn't already have an associated span. +// Use this over opentracing.StartSpanFromContext if you need access to the +// current span, (e.g. if you don't want to start a child span). +// +// NB: if there is no span in the context, the span returned by this function +// is a noop, and won't be attached to the context; if you +// want a proper span, either start one and pass it in, or start one +// in your function. +func SpanFromContextOrNoop(ctx context.Context) opentracing.Span { + sp := opentracing.SpanFromContext(ctx) + if sp != nil { + return sp + } + + return opentracing.NoopTracer{}.StartSpan("") +} + +// StartSpanFromContext is the same as opentracing.StartSpanFromContext, but instead of always using the global tracer, +// it attempts to use the parent span's tracer if it's available. This behavior is (arguably) more flexible--it allows +// a locally set tracer to be used when needed (as in tests)--while being equivalent to the original in most contexts. +// See https://github.com/opentracing/opentracing-go/issues/149 for more discussion. +func StartSpanFromContext(ctx context.Context, operationName string, opts ...opentracing.StartSpanOption) (opentracing.Span, context.Context) { + var tracer opentracing.Tracer + if parentSpan := opentracing.SpanFromContext(ctx); parentSpan != nil { + opts = append(opts, opentracing.ChildOf(parentSpan.Context())) + tracer = parentSpan.Tracer() + } else { + tracer = getGlobalTracer() + } + + span := tracer.StartSpan(operationName, opts...) + + return span, opentracing.ContextWithSpan(ctx, span) +} + +// Time is a log.Field for time.Time values. It translates to RFC3339 formatted time strings. +// (e.g. 2018-04-15T13:47:26+00:00) +func Time(key string, t time.Time) log.Field { + return log.String(key, t.Format(time.RFC3339)) +} + +// Duration is a log.Field for Duration values. It translates to the standard Go duration format (Duration.String()). +func Duration(key string, t time.Duration) log.Field { + return log.String(key, fmt.Sprint(t)) +} diff --git a/vendor/github.com/m3db/m3/src/x/opentracing/tracing.go b/vendor/github.com/m3db/m3/src/x/opentracing/tracing.go new file mode 100644 index 00000000..c55c8905 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/opentracing/tracing.go @@ -0,0 +1,165 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package opentracing + +import ( + "context" + "fmt" + "io" + "runtime" + "strings" + "time" + + "github.com/m3db/m3/src/x/instrument" + + lightstep "github.com/lightstep/lightstep-tracer-go" + "github.com/opentracing/opentracing-go" + "github.com/uber-go/tally" + jaegercfg "github.com/uber/jaeger-client-go/config" + jaegerzap "github.com/uber/jaeger-client-go/log/zap" + jaegertally "github.com/uber/jaeger-lib/metrics/tally" + "go.uber.org/zap" +) + +const ( + spanTagBuildRevision = "build.revision" + spanTagBuildVersion = "build.version" + spanTagBuildBranch = "build.branch" + spanTagBuildDate = "build.date" + spanTagBuildTimeUnix = "build.time_unix" + spanTagBuildGoVersion = "build.go_version" +) + +var ( + // TracingBackendJaeger indicates the Jaeger backend should be used. + TracingBackendJaeger = "jaeger" + // TracingBackendLightstep indices the LightStep backend should be used. + TracingBackendLightstep = "lightstep" + + supportedBackends = []string{ + TracingBackendJaeger, + TracingBackendLightstep, + } + + tracerSpanTags = map[string]string{ + spanTagBuildRevision: instrument.Revision, + spanTagBuildBranch: instrument.Branch, + spanTagBuildVersion: instrument.Version, + spanTagBuildDate: instrument.BuildDate, + spanTagBuildTimeUnix: instrument.BuildTimeUnix, + spanTagBuildGoVersion: runtime.Version(), + } +) + +// TracingConfiguration configures an opentracing backend for m3query to use. Currently only jaeger is supported. +// Tracing is disabled if no backend is specified. +type TracingConfiguration struct { + ServiceName string `yaml:"serviceName"` + Backend string `yaml:"backend"` + Jaeger jaegercfg.Configuration `yaml:"jaeger"` + Lightstep lightstep.Options `yaml:"lightstep"` +} + +// NewTracer returns a tracer configured with the configuration provided by this struct. The tracer's concrete +// type is determined by cfg.Backend. Currently only `"jaeger"` is supported. `""` implies +// disabled (NoopTracer). +func (cfg *TracingConfiguration) NewTracer(defaultServiceName string, scope tally.Scope, logger *zap.Logger) (opentracing.Tracer, io.Closer, error) { + switch cfg.Backend { + case "": + return opentracing.NoopTracer{}, noopCloser{}, nil + + case TracingBackendJaeger: + logger.Info("initializing Jaeger tracer") + return cfg.newJaegerTracer(defaultServiceName, scope, logger) + + case TracingBackendLightstep: + logger.Info("initializing LightStep tracer") + return cfg.newLightstepTracer(defaultServiceName) + + default: + return nil, nil, fmt.Errorf("unknown tracing backend: %s. Supported backends are: [%s]", + cfg.Backend, + strings.Join(supportedBackends, ",")) + } +} + +func (cfg *TracingConfiguration) newJaegerTracer(defaultServiceName string, scope tally.Scope, logger *zap.Logger) (opentracing.Tracer, io.Closer, error) { + if cfg.Jaeger.ServiceName == "" { + cfg.Jaeger.ServiceName = defaultServiceName + } + + for k, v := range tracerSpanTags { + cfg.Jaeger.Tags = append(cfg.Jaeger.Tags, opentracing.Tag{ + Key: k, + Value: v, + }) + } + + tracer, jaegerCloser, err := cfg.Jaeger.NewTracer( + jaegercfg.Logger(jaegerzap.NewLogger(logger)), + jaegercfg.Metrics(jaegertally.Wrap(scope))) + + if err != nil { + return nil, nil, fmt.Errorf("failed to initialize jaeger: %s", err.Error()) + } + + return tracer, jaegerCloser, nil +} + +func (cfg *TracingConfiguration) newLightstepTracer(serviceName string) (opentracing.Tracer, io.Closer, error) { + if cfg.Lightstep.Tags == nil { + cfg.Lightstep.Tags = opentracing.Tags{} + } + + tags := cfg.Lightstep.Tags + if _, ok := tags[lightstep.ComponentNameKey]; !ok { + tags[lightstep.ComponentNameKey] = serviceName + } + + for k, v := range tracerSpanTags { + tags[k] = v + } + + tracer, err := lightstep.CreateTracer(cfg.Lightstep) + if err != nil { + return nil, nil, fmt.Errorf("failed to create lightstep tracer: %v", err) + } + + closer := &lightstepCloser{tracer: tracer} + return tracer, closer, nil +} + +type lightstepCloser struct { + tracer lightstep.Tracer +} + +func (l *lightstepCloser) Close() error { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + l.tracer.Close(ctx) + cancel() + return ctx.Err() +} + +type noopCloser struct{} + +func (noopCloser) Close() error { + return nil +} diff --git a/vendor/github.com/m3db/m3/src/x/pool/bucketized.go b/vendor/github.com/m3db/m3/src/x/pool/bucketized.go new file mode 100644 index 00000000..a564302c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/pool/bucketized.go @@ -0,0 +1,124 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package pool + +import ( + "fmt" + "sort" + + "github.com/uber-go/tally" +) + +type bucketPool struct { + capacity int + pool ObjectPool +} + +type bucketizedObjectPool struct { + sizesAsc []Bucket + buckets []bucketPool + maxBucketCapacity int + opts ObjectPoolOptions + alloc BucketizedAllocator + maxAlloc tally.Counter +} + +// NewBucketizedObjectPool creates a bucketized object pool +func NewBucketizedObjectPool(sizes []Bucket, opts ObjectPoolOptions) BucketizedObjectPool { + if opts == nil { + opts = NewObjectPoolOptions() + } + + sizesAsc := make([]Bucket, len(sizes)) + copy(sizesAsc, sizes) + sort.Sort(BucketByCapacity(sizesAsc)) + + var maxBucketCapacity int + if len(sizesAsc) != 0 { + maxBucketCapacity = sizesAsc[len(sizesAsc)-1].Capacity + } + + iopts := opts.InstrumentOptions() + + return &bucketizedObjectPool{ + opts: opts, + sizesAsc: sizesAsc, + maxBucketCapacity: maxBucketCapacity, + maxAlloc: iopts.MetricsScope().Counter("alloc-max"), + } +} + +func (p *bucketizedObjectPool) Init(alloc BucketizedAllocator) { + buckets := make([]bucketPool, len(p.sizesAsc)) + for i := range p.sizesAsc { + size := p.sizesAsc[i].Count + capacity := p.sizesAsc[i].Capacity + + opts := p.opts + if perBucketOpts := p.sizesAsc[i].Options; perBucketOpts != nil { + opts = perBucketOpts + } + + opts = opts.SetSize(size) + iopts := opts.InstrumentOptions() + + if iopts.MetricsScope() != nil { + opts = opts.SetInstrumentOptions(iopts.SetMetricsScope( + iopts.MetricsScope().Tagged(map[string]string{ + "bucket-capacity": fmt.Sprintf("%d", capacity), + }))) + } + + buckets[i].capacity = capacity + buckets[i].pool = NewObjectPool(opts) + buckets[i].pool.Init(func() interface{} { + return alloc(capacity) + }) + } + p.buckets = buckets + p.alloc = alloc +} + +func (p *bucketizedObjectPool) Get(capacity int) interface{} { + if capacity > p.maxBucketCapacity { + p.maxAlloc.Inc(1) + return p.alloc(capacity) + } + for i := range p.buckets { + if p.buckets[i].capacity >= capacity { + return p.buckets[i].pool.Get() + } + } + return p.alloc(capacity) +} + +func (p *bucketizedObjectPool) Put(obj interface{}, capacity int) { + if capacity > p.maxBucketCapacity { + return + } + + for i := len(p.buckets) - 1; i >= 0; i-- { + if capacity >= p.buckets[i].capacity { + p.buckets[i].pool.Put(obj) + return + } + } +} diff --git a/vendor/github.com/m3db/m3/src/x/pool/bytes.go b/vendor/github.com/m3db/m3/src/x/pool/bytes.go new file mode 100644 index 00000000..60e676ee --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/pool/bytes.go @@ -0,0 +1,62 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package pool + +type bytesPool struct { + pool BucketizedObjectPool +} + +// NewBytesPool creates a new bytes pool +func NewBytesPool(sizes []Bucket, opts ObjectPoolOptions) BytesPool { + return &bytesPool{pool: NewBucketizedObjectPool(sizes, opts)} +} + +func (p *bytesPool) Init() { + p.pool.Init(func(capacity int) interface{} { + return make([]byte, 0, capacity) + }) +} + +func (p *bytesPool) Get(capacity int) []byte { + if capacity < 1 { + return nil + } + + return p.pool.Get(capacity).([]byte) +} + +func (p *bytesPool) Put(value []byte) { + value = value[:0] + p.pool.Put(value, cap(value)) +} + +// AppendByte appends a byte to a byte slice getting a new slice from the +// BytesPool if the slice is at capacity +func AppendByte(bytes []byte, b byte, pool BytesPool) []byte { + if len(bytes) == cap(bytes) { + newBytes := pool.Get(cap(bytes) * 2) + n := copy(newBytes[:len(bytes)], bytes) + pool.Put(bytes) + bytes = newBytes[:n] + } + + return append(bytes, b) +} diff --git a/vendor/github.com/m3db/m3/src/x/pool/checked_bytes.go b/vendor/github.com/m3db/m3/src/x/pool/checked_bytes.go new file mode 100644 index 00000000..5d21de8e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/pool/checked_bytes.go @@ -0,0 +1,107 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package pool + +import "github.com/m3db/m3/src/x/checked" + +type checkedBytesPool struct { + bytesPool BytesPool + pool BucketizedObjectPool +} + +// NewBytesPoolFn is a function to construct a new bytes pool +type NewBytesPoolFn func(sizes []Bucket) BytesPool + +// NewCheckedBytesPool creates a new checked bytes pool +func NewCheckedBytesPool( + sizes []Bucket, + opts ObjectPoolOptions, + newBackingBytesPool NewBytesPoolFn, +) CheckedBytesPool { + return &checkedBytesPool{ + bytesPool: newBackingBytesPool(sizes), + pool: NewBucketizedObjectPool(sizes, opts), + } +} + +func (p *checkedBytesPool) BytesPool() BytesPool { + return p.bytesPool +} + +func (p *checkedBytesPool) Init() { + opts := checked.NewBytesOptions(). + SetFinalizer(p) + + p.bytesPool.Init() + p.pool.Init(func(capacity int) interface{} { + value := p.bytesPool.Get(capacity) + return checked.NewBytes(value, opts) + }) +} + +func (p *checkedBytesPool) Get(capacity int) checked.Bytes { + return p.pool.Get(capacity).(checked.Bytes) +} + +func (p *checkedBytesPool) FinalizeBytes(bytes checked.Bytes) { + bytes.IncRef() + bytes.Resize(0) + capacity := bytes.Cap() + bytes.DecRef() + p.pool.Put(bytes, capacity) +} + +// AppendByteChecked appends a byte to a byte slice getting a new slice from +// the CheckedBytesPool if the slice is at capacity +func AppendByteChecked( + bytes checked.Bytes, + b byte, + pool CheckedBytesPool, +) ( + result checked.Bytes, + swapped bool, +) { + orig := bytes + + if bytes.Len() == bytes.Cap() { + newBytes := pool.Get(bytes.Cap() * 2) + + // Inc the ref to read/write to it + newBytes.IncRef() + newBytes.Resize(bytes.Len()) + + copy(newBytes.Bytes(), bytes.Bytes()) + + bytes = newBytes + } + + bytes.Append(b) + + result = bytes + swapped = orig != bytes + + if swapped { + // No longer holding reference from the inc + result.DecRef() + } + + return +} diff --git a/vendor/github.com/m3db/m3/src/x/pool/config.go b/vendor/github.com/m3db/m3/src/x/pool/config.go new file mode 100644 index 00000000..6e08286e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/pool/config.go @@ -0,0 +1,102 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package pool + +import "github.com/m3db/m3/src/x/instrument" + +// ObjectPoolConfiguration contains configuration for object pools. +type ObjectPoolConfiguration struct { + // The size of the pool. + Size int `yaml:"size"` + + // The watermark configuration. + Watermark WatermarkConfiguration `yaml:"watermark"` +} + +// NewObjectPoolOptions creates a new set of object pool options. +func (c *ObjectPoolConfiguration) NewObjectPoolOptions( + instrumentOpts instrument.Options, +) ObjectPoolOptions { + size := defaultSize + if c.Size != 0 { + size = c.Size + } + return NewObjectPoolOptions(). + SetInstrumentOptions(instrumentOpts). + SetSize(size). + SetRefillLowWatermark(c.Watermark.RefillLowWatermark). + SetRefillHighWatermark(c.Watermark.RefillHighWatermark) +} + +// BucketizedPoolConfiguration contains configuration for bucketized pools. +type BucketizedPoolConfiguration struct { + // The pool bucket configuration. + Buckets []BucketConfiguration `yaml:"buckets"` + + // The watermark configuration. + Watermark WatermarkConfiguration `yaml:"watermark"` +} + +// NewObjectPoolOptions creates a new set of object pool options. +func (c *BucketizedPoolConfiguration) NewObjectPoolOptions( + instrumentOpts instrument.Options, +) ObjectPoolOptions { + return NewObjectPoolOptions(). + SetInstrumentOptions(instrumentOpts). + SetRefillLowWatermark(c.Watermark.RefillLowWatermark). + SetRefillHighWatermark(c.Watermark.RefillHighWatermark) +} + +// NewBuckets create a new list of buckets. +func (c *BucketizedPoolConfiguration) NewBuckets() []Bucket { + buckets := make([]Bucket, 0, len(c.Buckets)) + for _, bconfig := range c.Buckets { + bucket := bconfig.NewBucket() + buckets = append(buckets, bucket) + } + return buckets +} + +// BucketConfiguration contains configuration for a pool bucket. +type BucketConfiguration struct { + // The count of the items in the bucket. + Count int `yaml:"count"` + + // The capacity of each item in the bucket. + Capacity int `yaml:"capacity"` +} + +// NewBucket creates a new bucket. +func (c *BucketConfiguration) NewBucket() Bucket { + return Bucket{ + Capacity: c.Capacity, + Count: c.Count, + } +} + +// WatermarkConfiguration contains watermark configuration for pools. +type WatermarkConfiguration struct { + // The low watermark to start refilling the pool, if zero none. + RefillLowWatermark float64 `yaml:"low" validate:"min=0.0,max=1.0"` + + // The high watermark to stop refilling the pool, if zero none. + RefillHighWatermark float64 `yaml:"high" validate:"min=0.0,max=1.0"` +} diff --git a/vendor/github.com/m3db/m3/src/x/pool/floats.go b/vendor/github.com/m3db/m3/src/x/pool/floats.go new file mode 100644 index 00000000..b8747001 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/pool/floats.go @@ -0,0 +1,45 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package pool + +type floatsPool struct { + pool BucketizedObjectPool +} + +// NewFloatsPool creates a new floats pool +func NewFloatsPool(sizes []Bucket, opts ObjectPoolOptions) FloatsPool { + return &floatsPool{pool: NewBucketizedObjectPool(sizes, opts)} +} + +func (p *floatsPool) Init() { + p.pool.Init(func(capacity int) interface{} { + return make([]float64, 0, capacity) + }) +} + +func (p *floatsPool) Get(capacity int) []float64 { + return p.pool.Get(capacity).([]float64) +} + +func (p *floatsPool) Put(value []float64) { + value = value[:0] + p.pool.Put(value, cap(value)) +} diff --git a/vendor/github.com/m3db/m3/src/x/pool/object.go b/vendor/github.com/m3db/m3/src/x/pool/object.go new file mode 100644 index 00000000..2ef9c50b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/pool/object.go @@ -0,0 +1,169 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package pool + +import ( + "errors" + "math" + "sync/atomic" + + "github.com/m3db/m3/src/x/unsafe" + + "github.com/uber-go/tally" + "golang.org/x/sys/cpu" +) + +var ( + errPoolAlreadyInitialized = errors.New("object pool already initialized") + errPoolAccessBeforeInitialized = errors.New("object pool accessed before it was initialized") +) + +const sampleObjectPoolLengthEvery = 2048 + +type objectPool struct { + _ cpu.CacheLinePad + values chan interface{} + _ cpu.CacheLinePad + alloc Allocator + metrics objectPoolMetrics + onPoolAccessErrorFn OnPoolAccessErrorFn + size int + refillLowWatermark int + refillHighWatermark int + filling int32 + initialized int32 +} + +type objectPoolMetrics struct { + free tally.Gauge + total tally.Gauge + getOnEmpty tally.Counter + putOnFull tally.Counter +} + +// NewObjectPool creates a new pool +func NewObjectPool(opts ObjectPoolOptions) ObjectPool { + if opts == nil { + opts = NewObjectPoolOptions() + } + + m := opts.InstrumentOptions().MetricsScope() + + p := &objectPool{ + size: opts.Size(), + refillLowWatermark: int(math.Ceil( + opts.RefillLowWatermark() * float64(opts.Size()))), + refillHighWatermark: int(math.Ceil( + opts.RefillHighWatermark() * float64(opts.Size()))), + metrics: objectPoolMetrics{ + free: m.Gauge("free"), + total: m.Gauge("total"), + getOnEmpty: m.Counter("get-on-empty"), + putOnFull: m.Counter("put-on-full"), + }, + onPoolAccessErrorFn: opts.OnPoolAccessErrorFn(), + alloc: func() interface{} { + fn := opts.OnPoolAccessErrorFn() + fn(errPoolAccessBeforeInitialized) + return nil + }, + } + + p.setGauges() + + return p +} + +func (p *objectPool) Init(alloc Allocator) { + if !atomic.CompareAndSwapInt32(&p.initialized, 0, 1) { + p.onPoolAccessErrorFn(errPoolAlreadyInitialized) + return + } + + p.values = make(chan interface{}, p.size) + for i := 0; i < cap(p.values); i++ { + p.values <- alloc() + } + + p.alloc = alloc + p.setGauges() +} + +func (p *objectPool) Get() interface{} { + var ( + metrics = p.metrics + v interface{} + ) + + select { + case v = <-p.values: + default: + v = p.alloc() + metrics.getOnEmpty.Inc(1) + } + + if unsafe.Fastrandn(sampleObjectPoolLengthEvery) == 0 { + // inlined setGauges() + metrics.free.Update(float64(len(p.values))) + metrics.total.Update(float64(p.size)) + } + + if p.refillLowWatermark > 0 && len(p.values) <= p.refillLowWatermark { + p.tryFill() + } + + return v +} + +func (p *objectPool) Put(obj interface{}) { + if p.values == nil { + p.onPoolAccessErrorFn(errPoolAccessBeforeInitialized) + return + } + select { + case p.values <- obj: + default: + p.metrics.putOnFull.Inc(1) + } +} + +func (p *objectPool) setGauges() { + p.metrics.free.Update(float64(len(p.values))) + p.metrics.total.Update(float64(p.size)) +} + +func (p *objectPool) tryFill() { + if !atomic.CompareAndSwapInt32(&p.filling, 0, 1) { + return + } + + go func() { + defer atomic.StoreInt32(&p.filling, 0) + + for len(p.values) < p.refillHighWatermark { + select { + case p.values <- p.alloc(): + default: + return + } + } + }() +} diff --git a/vendor/github.com/m3db/m3/src/x/pool/options.go b/vendor/github.com/m3db/m3/src/x/pool/options.go new file mode 100644 index 00000000..fd70325d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/pool/options.go @@ -0,0 +1,98 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package pool + +import "github.com/m3db/m3/src/x/instrument" + +const ( + defaultSize = 4096 + defaultRefillLowWatermark = 0.0 + defaultRefillHighWatermark = 0.0 +) + +type objectPoolOptions struct { + size int + refillLowWatermark float64 + refillHighWatermark float64 + instrumentOpts instrument.Options + onPoolAccessErrorFn OnPoolAccessErrorFn +} + +// NewObjectPoolOptions creates a new set of object pool options +func NewObjectPoolOptions() ObjectPoolOptions { + return &objectPoolOptions{ + size: defaultSize, + refillLowWatermark: defaultRefillLowWatermark, + refillHighWatermark: defaultRefillHighWatermark, + instrumentOpts: instrument.NewOptions(), + onPoolAccessErrorFn: func(err error) { panic(err) }, + } +} + +func (o *objectPoolOptions) SetSize(value int) ObjectPoolOptions { + opts := *o + opts.size = value + return &opts +} + +func (o *objectPoolOptions) Size() int { + return o.size +} + +func (o *objectPoolOptions) SetRefillLowWatermark(value float64) ObjectPoolOptions { + opts := *o + opts.refillLowWatermark = value + return &opts +} + +func (o *objectPoolOptions) RefillLowWatermark() float64 { + return o.refillLowWatermark +} + +func (o *objectPoolOptions) SetRefillHighWatermark(value float64) ObjectPoolOptions { + opts := *o + opts.refillHighWatermark = value + return &opts +} + +func (o *objectPoolOptions) RefillHighWatermark() float64 { + return o.refillHighWatermark +} + +func (o *objectPoolOptions) SetInstrumentOptions(value instrument.Options) ObjectPoolOptions { + opts := *o + opts.instrumentOpts = value + return &opts +} + +func (o *objectPoolOptions) InstrumentOptions() instrument.Options { + return o.instrumentOpts +} + +func (o *objectPoolOptions) SetOnPoolAccessErrorFn(value OnPoolAccessErrorFn) ObjectPoolOptions { + opts := *o + opts.onPoolAccessErrorFn = value + return &opts +} + +func (o *objectPoolOptions) OnPoolAccessErrorFn() OnPoolAccessErrorFn { + return o.onPoolAccessErrorFn +} diff --git a/vendor/github.com/m3db/m3/src/x/pool/pool_mock.go b/vendor/github.com/m3db/m3/src/x/pool/pool_mock.go new file mode 100644 index 00000000..cb337375 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/pool/pool_mock.go @@ -0,0 +1,157 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/x/pool (interfaces: CheckedBytesPool,BytesPool) + +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package pool is a generated GoMock package. +package pool + +import ( + "reflect" + + "github.com/m3db/m3/src/x/checked" + + "github.com/golang/mock/gomock" +) + +// MockCheckedBytesPool is a mock of CheckedBytesPool interface +type MockCheckedBytesPool struct { + ctrl *gomock.Controller + recorder *MockCheckedBytesPoolMockRecorder +} + +// MockCheckedBytesPoolMockRecorder is the mock recorder for MockCheckedBytesPool +type MockCheckedBytesPoolMockRecorder struct { + mock *MockCheckedBytesPool +} + +// NewMockCheckedBytesPool creates a new mock instance +func NewMockCheckedBytesPool(ctrl *gomock.Controller) *MockCheckedBytesPool { + mock := &MockCheckedBytesPool{ctrl: ctrl} + mock.recorder = &MockCheckedBytesPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockCheckedBytesPool) EXPECT() *MockCheckedBytesPoolMockRecorder { + return m.recorder +} + +// BytesPool mocks base method +func (m *MockCheckedBytesPool) BytesPool() BytesPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BytesPool") + ret0, _ := ret[0].(BytesPool) + return ret0 +} + +// BytesPool indicates an expected call of BytesPool +func (mr *MockCheckedBytesPoolMockRecorder) BytesPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BytesPool", reflect.TypeOf((*MockCheckedBytesPool)(nil).BytesPool)) +} + +// Get mocks base method +func (m *MockCheckedBytesPool) Get(arg0 int) checked.Bytes { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0) + ret0, _ := ret[0].(checked.Bytes) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockCheckedBytesPoolMockRecorder) Get(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockCheckedBytesPool)(nil).Get), arg0) +} + +// Init mocks base method +func (m *MockCheckedBytesPool) Init() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init") +} + +// Init indicates an expected call of Init +func (mr *MockCheckedBytesPoolMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockCheckedBytesPool)(nil).Init)) +} + +// MockBytesPool is a mock of BytesPool interface +type MockBytesPool struct { + ctrl *gomock.Controller + recorder *MockBytesPoolMockRecorder +} + +// MockBytesPoolMockRecorder is the mock recorder for MockBytesPool +type MockBytesPoolMockRecorder struct { + mock *MockBytesPool +} + +// NewMockBytesPool creates a new mock instance +func NewMockBytesPool(ctrl *gomock.Controller) *MockBytesPool { + mock := &MockBytesPool{ctrl: ctrl} + mock.recorder = &MockBytesPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockBytesPool) EXPECT() *MockBytesPoolMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockBytesPool) Get(arg0 int) []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0) + ret0, _ := ret[0].([]byte) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockBytesPoolMockRecorder) Get(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockBytesPool)(nil).Get), arg0) +} + +// Init mocks base method +func (m *MockBytesPool) Init() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init") +} + +// Init indicates an expected call of Init +func (mr *MockBytesPoolMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockBytesPool)(nil).Init)) +} + +// Put mocks base method +func (m *MockBytesPool) Put(arg0 []byte) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", arg0) +} + +// Put indicates an expected call of Put +func (mr *MockBytesPoolMockRecorder) Put(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockBytesPool)(nil).Put), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/x/pool/types.go b/vendor/github.com/m3db/m3/src/x/pool/types.go new file mode 100644 index 00000000..872189a6 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/pool/types.go @@ -0,0 +1,170 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package pool provides implementations for object pooling. +package pool + +import ( + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/instrument" +) + +// Allocator allocates an object for a pool. +type Allocator func() interface{} + +// ObjectPool provides a pool for objects. +type ObjectPool interface { + // Init initializes the pool. + Init(alloc Allocator) + + // Get provides an object from the pool. + Get() interface{} + + // Put returns an object to the pool. + Put(obj interface{}) +} + +// OnPoolAccessErrorFn is a function to call when a pool access error occurs, +// such as get or put before the pool is initialized. +type OnPoolAccessErrorFn func(err error) + +// ObjectPoolOptions provides options for an object pool. +type ObjectPoolOptions interface { + // SetSize sets the size of the object pool. + SetSize(value int) ObjectPoolOptions + + // Size returns the size of the object pool. + Size() int + + // SetRefillLowWatermark sets the refill low watermark value between [0, 1), + // if zero then no refills occur. + SetRefillLowWatermark(value float64) ObjectPoolOptions + + // RefillLowWatermark returns the refill low watermark value between [0, 1), + // if zero then no refills occur. + RefillLowWatermark() float64 + + // SetRefillHighWatermark sets the refill high watermark value between [0, 1), + // if less or equal to low watermark then no refills occur. + SetRefillHighWatermark(value float64) ObjectPoolOptions + + // RefillLowWatermark returns the refill low watermark value between [0, 1), + // if less or equal to low watermark then no refills occur. + RefillHighWatermark() float64 + + // SetInstrumentOptions sets the instrument options. + SetInstrumentOptions(value instrument.Options) ObjectPoolOptions + + // InstrumentOptions returns the instrument options. + InstrumentOptions() instrument.Options + + // SetOnPoolAccessErrorFn sets the on pool access error callback, by + // default this is a panic. + SetOnPoolAccessErrorFn(value OnPoolAccessErrorFn) ObjectPoolOptions + + // OnPoolAccessErrorFn returns the on pool access error callback, by + // default this is a panic. + OnPoolAccessErrorFn() OnPoolAccessErrorFn +} + +// Bucket specifies a pool bucket. +type Bucket struct { + // Capacity is the size of each element in the bucket. + Capacity int + + // Count is the number of fixed elements in the bucket. + Count int + + // Options is an optional override to specify options to use for a bucket, + // specify nil to use the options specified to the bucketized pool + // constructor for this bucket. + Options ObjectPoolOptions +} + +// BucketByCapacity is a sortable collection of pool buckets. +type BucketByCapacity []Bucket + +func (x BucketByCapacity) Len() int { + return len(x) +} + +func (x BucketByCapacity) Swap(i, j int) { + x[i], x[j] = x[j], x[i] +} + +func (x BucketByCapacity) Less(i, j int) bool { + return x[i].Capacity < x[j].Capacity +} + +// BucketizedAllocator allocates an object for a bucket given its capacity. +type BucketizedAllocator func(capacity int) interface{} + +// BucketizedObjectPool is a bucketized pool of objects. +type BucketizedObjectPool interface { + // Init initializes the pool. + Init(alloc BucketizedAllocator) + + // Get provides an object from the pool. + Get(capacity int) interface{} + + // Put returns an object to the pool, given the object capacity. + Put(obj interface{}, capacity int) +} + +// BytesPool provides a pool for variable size buffers. +type BytesPool interface { + // Init initializes the pool. + Init() + + // Get provides a buffer from the pool. + Get(capacity int) []byte + + // Put returns a buffer to the pool. + Put(buffer []byte) +} + +// CheckedBytesPool provides a checked pool for variable size buffers. +type CheckedBytesPool interface { + // Init initializes the pool. + Init() + + // Get provides a buffer from the pool, to return it to the pool simply + // increment it immediately, continue to increment and decrement through + // use and when decremented to zero and finalized it will return itself + // to the pool. The pool uses the finalizer on the checked.Bytes so be sure + // not to override it. + Get(capacity int) checked.Bytes + + // BytesPool returns the underlying bytes pool used, useful if required + // to retrieve when only the checked bytes pool is accessible. + BytesPool() BytesPool +} + +// FloatsPool provides a pool for variable-sized float64 slices. +type FloatsPool interface { + // Init initializes the pool. + Init() + + // Get provides an float64 slice from the pool. + Get(capacity int) []float64 + + // Put returns an float64 slice to the pool. + Put(value []float64) +} diff --git a/vendor/github.com/m3db/m3/src/x/process/count_dirent_linux.go b/vendor/github.com/m3db/m3/src/x/process/count_dirent_linux.go new file mode 100644 index 00000000..657555f1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/process/count_dirent_linux.go @@ -0,0 +1,116 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// This package is mostly copy-pasted from the standard library, specifically +// this file: https://golang.org/src/os/dir_unix.go with some changes to prevent +// allocations. + +package process + +import ( + "bytes" + "syscall" + "unsafe" +) + +func countDirent(buf []byte) (consumed int, count int) { + origlen := len(buf) + count = 0 + for len(buf) > 0 { + reclen, ok := direntReclen(buf) + if !ok || reclen > uint64(len(buf)) { + return origlen, count + } + + rec := buf[:reclen] + buf = buf[reclen:] + + ino, ok := direntIno(rec) + if !ok { + break + } + if ino == 0 { // File absent in directory. + continue + } + const namoff = uint64(unsafe.Offsetof(syscall.Dirent{}.Name)) + namlen, ok := direntNamlen(rec) + if !ok || namoff+namlen > uint64(len(rec)) { + break + } + name := rec[namoff : namoff+namlen] + for i, c := range name { + if c == 0 { + name = name[:i] + break + } + } + + if bytes.Equal(name, dotBytes) || bytes.Equal(name, doubleDotBytes) { + // Check for useless names before allocating a string. + continue + } + count++ + } + + return origlen - len(buf), count +} + +func direntReclen(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Reclen), unsafe.Sizeof(syscall.Dirent{}.Reclen)) +} + +func direntIno(buf []byte) (uint64, bool) { + return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Ino), unsafe.Sizeof(syscall.Dirent{}.Ino)) +} + +func direntNamlen(buf []byte) (uint64, bool) { + reclen, ok := direntReclen(buf) + if !ok { + return 0, false + } + return reclen - uint64(unsafe.Offsetof(syscall.Dirent{}.Name)), true +} + +// readInt returns the size-bytes unsigned integer in native byte order at offset off. +func readInt(b []byte, off, size uintptr) (u uint64, ok bool) { + if len(b) < int(off+size) { + return 0, false + } + return readIntLE(b[off:], size), true +} + +func readIntLE(b []byte, size uintptr) uint64 { + switch size { + case 1: + return uint64(b[0]) + case 2: + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 + case 4: + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 + case 8: + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + default: + panic("syscall: readInt with unsupported size") + } +} diff --git a/vendor/github.com/m3db/m3/src/x/process/process_linux.go b/vendor/github.com/m3db/m3/src/x/process/process_linux.go new file mode 100644 index 00000000..b18eb2ce --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/process/process_linux.go @@ -0,0 +1,123 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package process provides functions for inspecting processes. +package process + +import ( + "fmt" + "os" + "syscall" + "time" +) + +const ( + // syscallBatchSize controls the number of syscalls to perform before + // triggering a sleep. + syscallBatchSize = 10 + defaultSyscallBatchDurationSleepMultiplier = 10 +) + +var ( + dotBytes = []byte(".") + doubleDotBytes = []byte("..") +) + +// numFDsSlow returns the number of file descriptors for a given process. +// This is a reference implementation that can be used to compare against for +// correctness. +func numFDsSlow(pid int) (int, error) { + statPath := fmt.Sprintf("/proc/%d/fd", pid) + d, err := os.Open(statPath) + if err != nil { + return 0, err + } + fnames, err := d.Readdirnames(-1) + d.Close() + return len(fnames), err +} + +// NumFDs returns the number of file descriptors for a given process. +// This is an optimized implementation that avoids allocations as much as +// possible. In terms of wall-clock time it is not much faster than +// NumFDsReference due to the fact that the syscall overhead dominates, +// however, it produces significantly less garbage. +func NumFDs(pid int) (int, error) { + // Multiplier of zero means no throttling. + return NumFDsWithBatchSleep(pid, 0) +} + +// NumFDsWithBatchSleep is the same as NumFDs but it throttles itself to prevent excessive +// CPU usages for processes with a lot of file descriptors. +// +// batchDurationSleepMultiplier is the multiplier by which the amount of time spent performing +// a single batch of syscalls will be multiplied by to determine the amount of time that the +// function will spend sleeping. +// +// For example, if performing syscallBatchSize syscalls takes 500 nanoseconds and +// batchDurationSleepMultiplier is 10 then the function will sleep for ~500 * 10 nanoseconds +// inbetween batches. +// +// In other words, a batchDurationSleepMultiplier will cause the function to take approximately +// 10x longer but require 10x less CPU utilization at any given moment in time. +func NumFDsWithBatchSleep(pid int, batchDurationSleepMultiplier float64) (int, error) { + statPath := fmt.Sprintf("/proc/%d/fd", pid) + d, err := os.Open(statPath) + if err != nil { + return 0, err + } + defer d.Close() + + var ( + b = make([]byte, 4096) + count = 0 + lastSleep = time.Now() + ) + for i := 0; ; i++ { + if i%syscallBatchSize == 0 && i != 0 { + // Throttle loop to prevent execssive CPU usage. + syscallBatchCompletionDuration := time.Now().Sub(lastSleep) + timeToSleep := time.Duration(float64(syscallBatchCompletionDuration) * batchDurationSleepMultiplier) + if timeToSleep > 0 { + time.Sleep(timeToSleep) + } + lastSleep = time.Now() + } + + n, err := syscall.ReadDirent(int(d.Fd()), b) + if err != nil { + return 0, err + } + if n <= 0 { + break + } + + _, numDirs := countDirent(b[:n]) + count += numDirs + } + + return count, nil +} + +// NumFDsWithDefaultBatchSleep is the same as NumFDsWithBatchSleep except it uses the default value +// for the batchSleepDurationMultiplier. +func NumFDsWithDefaultBatchSleep(pid int) (int, error) { + return NumFDsWithBatchSleep(pid, defaultSyscallBatchDurationSleepMultiplier) +} diff --git a/vendor/github.com/m3db/m3/src/x/process/process_notlinux.go b/vendor/github.com/m3db/m3/src/x/process/process_notlinux.go new file mode 100644 index 00000000..5e400077 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/process/process_notlinux.go @@ -0,0 +1,48 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// +build !linux + +package process + +import ( + "errors" +) + +var errNotAvailable = errors.New( + "cannot get process file descriptors, only available on linux") + +// NumFDs returns the number of file descriptors for a given process and is not available +// on non-linux systems. +func NumFDs(pid int) (int, error) { + return 0, errNotAvailable +} + +// NumFDsWithDefaultBatchSleep returns the number of file descriptors for a given process +// and is not available on non-linux systems. +func NumFDsWithDefaultBatchSleep(pid int) (int, error) { + return 0, errNotAvailable +} + +// NumFDsWithBatchSleep returns the number of file descriptors for a given process and is +// not available on non-linux systems. +func NumFDsWithBatchSleep(pid int) (int, error) { + return 0, errNotAvailable +} diff --git a/vendor/github.com/m3db/m3/src/x/resource/lifetime.go b/vendor/github.com/m3db/m3/src/x/resource/lifetime.go new file mode 100644 index 00000000..7e1fcb10 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/resource/lifetime.go @@ -0,0 +1,72 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package resource + +import "sync" + +// CancellableLifetime describes a lifetime for a resource that +// allows checking out the resource and returning it and once +// cancelled will not allow any further checkouts. +type CancellableLifetime struct { + mu sync.RWMutex + cancelled bool +} + +// NewCancellableLifetime returns a new cancellable resource lifetime. +func NewCancellableLifetime() *CancellableLifetime { + return &CancellableLifetime{} +} + +// TryCheckout will try to checkout the resource, if the lifetime +// is already cancelled this will return false, otherwise it will return +// true and guarantee the lifetime is not cancelled until the checkout +// is returned. +// If this returns true you MUST call ReleaseCheckout later, otherwise +// the lifetime will never close and any caller calling Cancel will be +// blocked indefinitely. +func (l *CancellableLifetime) TryCheckout() bool { + l.mu.RLock() + if l.cancelled { + // Already cancelled, close the RLock don't need to keep it open + l.mu.RUnlock() + return false + } + + // Keep the RLock open + return true +} + +// ReleaseCheckout will decrement the number of current checkouts, it MUST +// only be called after a call to TryCheckout and must not be called more +// than once per call to TryCheckout or else it will panic as it will try +// to unlock an unlocked resource. +func (l *CancellableLifetime) ReleaseCheckout() { + l.mu.RUnlock() +} + +// Cancel will wait for all current checkouts to be returned +// and then will cancel the lifetime so that it cannot be +// checked out any longer. +func (l *CancellableLifetime) Cancel() { + l.mu.Lock() + l.cancelled = true + l.mu.Unlock() +} diff --git a/vendor/github.com/m3db/m3/src/x/resource/types.go b/vendor/github.com/m3db/m3/src/x/resource/types.go new file mode 100644 index 00000000..05933c59 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/resource/types.go @@ -0,0 +1,52 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package resource describes require for object lifecycle management. +// Both Finalizer and Closer have similar concepts, they both exist so that +// different types can be used for resource cleanup with different method names +// as for some things like iterators, the verb close makes more sense than +// finalize and is more consistent with other types. +package resource + +// Finalizer finalizes a checked resource. +type Finalizer interface { + Finalize() +} + +// FinalizerFn is a function literal that is a finalizer. +type FinalizerFn func() + +// Finalize will call the function literal as a finalizer. +func (fn FinalizerFn) Finalize() { + fn() +} + +// Closer is an object that can be closed. +type Closer interface { + Close() +} + +// CloserFn is a function literal that is a closer. +type CloserFn func() + +// Close will call the function literal as a closer. +func (fn CloserFn) Close() { + fn() +} diff --git a/vendor/github.com/m3db/m3/src/x/retry/config.go b/vendor/github.com/m3db/m3/src/x/retry/config.go new file mode 100644 index 00000000..069bdcb0 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/retry/config.go @@ -0,0 +1,79 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package retry + +import ( + "time" + + "github.com/uber-go/tally" +) + +// Configuration configures options for retry attempts. +type Configuration struct { + // Initial retry backoff. + InitialBackoff time.Duration `yaml:"initialBackoff" validate:"min=0"` + + // Backoff factor for exponential backoff. + BackoffFactor float64 `yaml:"backoffFactor" validate:"min=0"` + + // Maximum backoff time. + MaxBackoff time.Duration `yaml:"maxBackoff" validate:"min=0"` + + // Maximum number of retry attempts. + MaxRetries int `yaml:"maxRetries"` + + // Whether to retry forever until either the attempt succeeds, + // or the retry condition becomes false. + Forever *bool `yaml:"forever"` + + // Whether jittering is applied during retries. + Jitter *bool `yaml:"jitter"` +} + +// NewOptions creates a new retry options based on the configuration. +func (c Configuration) NewOptions(scope tally.Scope) Options { + opts := NewOptions().SetMetricsScope(scope) + if c.InitialBackoff != 0 { + opts = opts.SetInitialBackoff(c.InitialBackoff) + } + if c.BackoffFactor != 0.0 { + opts = opts.SetBackoffFactor(c.BackoffFactor) + } + if c.MaxBackoff != 0 { + opts = opts.SetMaxBackoff(c.MaxBackoff) + } + if c.MaxRetries != 0 { + opts = opts.SetMaxRetries(c.MaxRetries) + } + if c.Forever != nil { + opts = opts.SetForever(*c.Forever) + } + if c.Jitter != nil { + opts = opts.SetJitter(*c.Jitter) + } + + return opts +} + +// NewRetrier creates a new retrier based on the configuration. +func (c Configuration) NewRetrier(scope tally.Scope) Retrier { + return NewRetrier(c.NewOptions(scope)) +} diff --git a/vendor/github.com/m3db/m3/src/x/retry/options.go b/vendor/github.com/m3db/m3/src/x/retry/options.go new file mode 100644 index 00000000..1bb697eb --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/retry/options.go @@ -0,0 +1,143 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package retry + +import ( + "math" + "math/rand" + "time" + + "github.com/uber-go/tally" +) + +const ( + defaultInitialBackoff = time.Second + defaultBackoffFactor = 2.0 + defaultMaxBackoff = time.Duration(math.MaxInt64) + defaultMaxRetries = 2 + defaultForever = false + defaultJitter = true +) + +type options struct { + scope tally.Scope + initialBackoff time.Duration + backoffFactor float64 + maxBackoff time.Duration + maxRetries int + forever bool + jitter bool + rngFn RngFn +} + +// NewOptions creates new retry options. +func NewOptions() Options { + return &options{ + scope: tally.NoopScope, + initialBackoff: defaultInitialBackoff, + backoffFactor: defaultBackoffFactor, + maxBackoff: defaultMaxBackoff, + maxRetries: defaultMaxRetries, + forever: defaultForever, + jitter: defaultJitter, + rngFn: rand.Int63n, + } +} + +func (o *options) SetMetricsScope(value tally.Scope) Options { + opts := *o + opts.scope = value + return &opts +} + +func (o *options) MetricsScope() tally.Scope { + return o.scope +} + +func (o *options) SetInitialBackoff(value time.Duration) Options { + opts := *o + opts.initialBackoff = value + return &opts +} + +func (o *options) InitialBackoff() time.Duration { + return o.initialBackoff +} + +func (o *options) SetBackoffFactor(value float64) Options { + opts := *o + opts.backoffFactor = value + return &opts +} + +func (o *options) BackoffFactor() float64 { + return o.backoffFactor +} + +func (o *options) SetMaxBackoff(value time.Duration) Options { + opts := *o + opts.maxBackoff = value + return &opts +} + +func (o *options) MaxBackoff() time.Duration { + return o.maxBackoff +} + +func (o *options) SetMaxRetries(value int) Options { + opts := *o + opts.maxRetries = value + return &opts +} + +func (o *options) MaxRetries() int { + return o.maxRetries +} + +func (o *options) SetForever(value bool) Options { + opts := *o + opts.forever = value + return &opts +} + +func (o *options) Forever() bool { + return o.forever +} + +func (o *options) SetJitter(value bool) Options { + opts := *o + opts.jitter = value + return &opts +} + +func (o *options) Jitter() bool { + return o.jitter +} + +func (o *options) SetRngFn(value RngFn) Options { + opts := *o + opts.rngFn = value + return &opts +} + +func (o *options) RngFn() RngFn { + return o.rngFn +} diff --git a/vendor/github.com/m3db/m3/src/x/retry/retry.go b/vendor/github.com/m3db/m3/src/x/retry/retry.go new file mode 100644 index 00000000..0155ad60 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/retry/retry.go @@ -0,0 +1,218 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package retry + +import ( + "errors" + "math" + "time" + + xerrors "github.com/m3db/m3/src/x/errors" + + "github.com/uber-go/tally" +) + +var ( + // ErrWhileConditionFalse is returned when the while condition to a while retry + // method evaluates false. + ErrWhileConditionFalse = errors.New("retry while condition evaluated to false") +) + +type retrier struct { + opts Options + initialBackoff time.Duration + backoffFactor float64 + maxBackoff time.Duration + maxRetries int + forever bool + jitter bool + rngFn RngFn + sleepFn func(t time.Duration) + metrics retrierMetrics +} + +type retrierMetrics struct { + calls tally.Counter + attempts tally.Counter + success tally.Counter + successLatency tally.Histogram + errors tally.Counter + errorsNotRetryable tally.Counter + errorsFinal tally.Counter + errorsLatency tally.Histogram + retries tally.Counter +} + +// NewRetrier creates a new retrier. +func NewRetrier(opts Options) Retrier { + scope := opts.MetricsScope() + errorTags := struct { + retryable map[string]string + notRetryable map[string]string + }{ + map[string]string{ + "type": "retryable", + }, + map[string]string{ + "type": "not-retryable", + }, + } + + return &retrier{ + opts: opts, + initialBackoff: opts.InitialBackoff(), + backoffFactor: opts.BackoffFactor(), + maxBackoff: opts.MaxBackoff(), + maxRetries: opts.MaxRetries(), + forever: opts.Forever(), + jitter: opts.Jitter(), + rngFn: opts.RngFn(), + sleepFn: time.Sleep, + metrics: retrierMetrics{ + calls: scope.Counter("calls"), + attempts: scope.Counter("attempts"), + success: scope.Counter("success"), + successLatency: histogramWithDurationBuckets(scope, "success-latency"), + errors: scope.Tagged(errorTags.retryable).Counter("errors"), + errorsNotRetryable: scope.Tagged(errorTags.notRetryable).Counter("errors"), + errorsFinal: scope.Counter("errors-final"), + errorsLatency: histogramWithDurationBuckets(scope, "errors-latency"), + retries: scope.Counter("retries"), + }, + } +} + +func (r *retrier) Options() Options { + return r.opts +} + +func (r *retrier) Attempt(fn Fn) error { + return r.attempt(nil, fn) +} + +func (r *retrier) AttemptWhile(continueFn ContinueFn, fn Fn) error { + return r.attempt(continueFn, fn) +} + +func (r *retrier) attempt(continueFn ContinueFn, fn Fn) error { + // Always track a call, useful for counting number of total operations. + r.metrics.calls.Inc(1) + + attempt := 0 + + if continueFn != nil && !continueFn(attempt) { + return ErrWhileConditionFalse + } + + start := time.Now() + err := fn() + duration := time.Since(start) + r.metrics.attempts.Inc(1) + attempt++ + if err == nil { + r.metrics.successLatency.RecordDuration(duration) + r.metrics.success.Inc(1) + return nil + } + r.metrics.errorsLatency.RecordDuration(duration) + if xerrors.IsNonRetryableError(err) { + r.metrics.errorsNotRetryable.Inc(1) + return err + } + r.metrics.errors.Inc(1) + + for i := 1; r.forever || i <= r.maxRetries; i++ { + r.sleepFn(time.Duration(BackoffNanos( + i, + r.jitter, + r.backoffFactor, + r.initialBackoff, + r.maxBackoff, + r.rngFn, + ))) + + if continueFn != nil && !continueFn(attempt) { + return ErrWhileConditionFalse + } + + r.metrics.retries.Inc(1) + start := time.Now() + err = fn() + duration := time.Since(start) + r.metrics.attempts.Inc(1) + attempt++ + if err == nil { + r.metrics.successLatency.RecordDuration(duration) + r.metrics.success.Inc(1) + return nil + } + r.metrics.errorsLatency.RecordDuration(duration) + if xerrors.IsNonRetryableError(err) { + r.metrics.errorsNotRetryable.Inc(1) + return err + } + r.metrics.errors.Inc(1) + } + r.metrics.errorsFinal.Inc(1) + + return err +} + +// BackoffNanos calculates the backoff for a retry in nanoseconds. +func BackoffNanos( + retry int, + jitter bool, + backoffFactor float64, + initialBackoff time.Duration, + maxBackoff time.Duration, + rngFn RngFn, +) int64 { + backoff := initialBackoff.Nanoseconds() + if retry >= 1 { + backoffFloat64 := float64(backoff) * math.Pow(backoffFactor, float64(retry-1)) + // math.Inf is also larger than math.MaxInt64. + if backoffFloat64 > math.MaxInt64 { + return maxBackoff.Nanoseconds() + } + backoff = int64(backoffFloat64) + } + // Validate the value of backoff to make sure Int63n() does not panic. + if jitter && backoff >= 2 { + half := backoff / 2 + backoff = half + rngFn(half) + } + if maxBackoff := maxBackoff.Nanoseconds(); backoff > maxBackoff { + backoff = maxBackoff + } + return backoff +} + +// histogramWithDurationBuckets returns a histogram with the standard duration buckets. +func histogramWithDurationBuckets(scope tally.Scope, name string) tally.Histogram { + sub := scope.Tagged(map[string]string{ + // Bump the version if the histogram buckets need to be changed to avoid overlapping buckets + // in the same query causing errors. + "schema": "v1", + }) + buckets := append(tally.DurationBuckets{0, time.Millisecond}, + tally.MustMakeExponentialDurationBuckets(2*time.Millisecond, 1.5, 30)...) + return sub.Histogram(name, buckets) +} diff --git a/vendor/github.com/m3db/m3/src/x/retry/types.go b/vendor/github.com/m3db/m3/src/x/retry/types.go new file mode 100644 index 00000000..105f3baa --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/retry/types.go @@ -0,0 +1,117 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package retry provides utilities for retrying functions. +package retry + +import ( + "time" + + "github.com/m3db/m3/src/x/errors" + + "github.com/uber-go/tally" +) + +// RetryableError returns a retryable error. +func RetryableError(err error) error { + return errors.NewRetryableError(err) +} + +// NonRetryableError returns a non-retryable error. +func NonRetryableError(err error) error { + return errors.NewNonRetryableError(err) +} + +// RngFn returns a non-negative pseudo-random number in [0,n). +type RngFn func(n int64) int64 + +// Fn is a function that can be retried. +type Fn func() error + +// ContinueFn is a function that returns whether to continue attempting an operation. +type ContinueFn func(attempt int) bool + +// Retrier is a executor that can retry attempts on executing methods. +type Retrier interface { + // Options returns the options used to construct the retrier, useful + // for changing instrumentation options, etc while preserving other options. + Options() Options + + // Attempt will attempt to perform a function with retries. + Attempt(fn Fn) error + + // Attempt will attempt to perform a function with retries. + AttemptWhile(continueFn ContinueFn, fn Fn) error +} + +// Options is a set of retry options. +type Options interface { + // SetMetricsScope sets the metrics scope. + SetMetricsScope(value tally.Scope) Options + + // MetricsScope returns the metrics scope. + MetricsScope() tally.Scope + + // SetInitialBackoff sets the initial delay duration. + SetInitialBackoff(value time.Duration) Options + + // InitialBackoff gets the initial delay duration. + InitialBackoff() time.Duration + + // SetBackoffFactor sets the backoff factor multiplier when moving to next attempt. + SetBackoffFactor(value float64) Options + + // BackoffFactor gets the backoff factor multiplier when moving to next attempt. + BackoffFactor() float64 + + // SetMaxBackoff sets the maximum backoff delay. + SetMaxBackoff(value time.Duration) Options + + // MaxBackoff returns the maximum backoff delay. + MaxBackoff() time.Duration + + // SetMaxRetries sets the maximum retry attempts. + SetMaxRetries(value int) Options + + // Max gets the maximum retry attempts. + MaxRetries() int + + // SetForever sets whether to retry forever until either the attempt succeeds, + // or the retry condition becomes false. + SetForever(value bool) Options + + // Forever returns whether to retry forever until either the attempt succeeds, + // or the retry condition becomes false. + Forever() bool + + // SetJitter sets whether to jitter between the current backoff and the next + // backoff when moving to next attempt. + SetJitter(value bool) Options + + // Jitter gets whether to jitter between the current backoff and the next + // backoff when moving to next attempt. + Jitter() bool + + // SetRngFn sets the RngFn. + SetRngFn(value RngFn) Options + + // RngFn returns the RngFn. + RngFn() RngFn +} diff --git a/vendor/github.com/m3db/m3/src/x/sampler/sampler.go b/vendor/github.com/m3db/m3/src/x/sampler/sampler.go new file mode 100644 index 00000000..906ee720 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sampler/sampler.go @@ -0,0 +1,99 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sampler + +import ( + "fmt" + + "go.uber.org/atomic" +) + +// Rate is a sample rate. +type Rate float64 + +// Value returns the float64 sample rate value. +func (r Rate) Value() float64 { + return float64(r) +} + +// Validate validates a sample rate. +func (r Rate) Validate() error { + if r < 0.0 || r > 1.0 { + return fmt.Errorf("invalid sample rate: actual=%f, valid=[0.0,1.0]", r) + } + return nil +} + +// UnmarshalYAML unmarshals a sample rate. +func (r *Rate) UnmarshalYAML(unmarshal func(interface{}) error) error { + var value float64 + if err := unmarshal(&value); err != nil { + return err + } + + parsed := Rate(value) + if err := parsed.Validate(); err != nil { + return err + } + + *r = parsed + + return nil +} + +// Sampler samples the requests, out of 100 sample calls, +// 100*sampleRate calls will be sampled. +type Sampler struct { + sampleRate Rate + sampleEvery int32 + numTried *atomic.Int32 +} + +// NewSampler creates a new sampler with a sample rate. +func NewSampler(sampleRate Rate) (*Sampler, error) { + if err := sampleRate.Validate(); err != nil { + return nil, err + } + if sampleRate == 0 { + return &Sampler{ + sampleRate: sampleRate, + sampleEvery: 0, + }, nil + } + return &Sampler{ + sampleRate: sampleRate, + numTried: atomic.NewInt32(0), + sampleEvery: int32(1.0 / sampleRate), + }, nil +} + +// Sample returns true when the call is sampled. +func (t *Sampler) Sample() bool { + if t.sampleEvery == 0 { + return false + } + return (t.numTried.Inc()-1)%t.sampleEvery == 0 +} + +// SampleRate returns the effective sample rate. +func (t *Sampler) SampleRate() Rate { + return t.sampleRate +} diff --git a/vendor/github.com/m3db/m3/src/x/serialize/decoder.go b/vendor/github.com/m3db/m3/src/x/serialize/decoder.go new file mode 100644 index 00000000..9d1b5d9d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/serialize/decoder.go @@ -0,0 +1,248 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package serialize + +import ( + "errors" + "fmt" + + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/ident" +) + +var ( + errIncorrectHeader = errors.New("header magic number does not match expected value") + errInvalidByteStreamIDDecoding = errors.New("internal error, invalid byte stream while decoding ID") + errInvalidByteStreamUintDecoding = errors.New("internal error, invalid byte stream while decoding uint") +) + +type decoder struct { + checkedData checked.Bytes + data []byte + nextCalls int + length int + remaining int + err error + + current ident.Tag + currentTagName checked.Bytes + currentTagValue checked.Bytes + + opts TagDecoderOptions + pool TagDecoderPool +} + +func newTagDecoder(opts TagDecoderOptions, pool TagDecoderPool) TagDecoder { + tagName := opts.CheckedBytesWrapperPool().Get(nil) + tagValue := opts.CheckedBytesWrapperPool().Get(nil) + tag := ident.Tag{ + Name: ident.BinaryID(tagName), + Value: ident.BinaryID(tagValue), + } + return &decoder{ + opts: opts, + pool: pool, + current: tag, + currentTagName: tagName, + currentTagValue: tagValue, + } +} + +func (d *decoder) Reset(b checked.Bytes) { + d.resetForReuse() + d.checkedData = b + d.checkedData.IncRef() + d.data = d.checkedData.Bytes() + + header, err := d.decodeUInt16() + if err != nil { + d.err = err + return + } + + if header != headerMagicNumber { + d.err = errIncorrectHeader + return + } + + length, err := d.decodeUInt16() + if err != nil { + d.err = err + return + } + + if limit := d.opts.TagSerializationLimits().MaxNumberTags(); length > limit { + d.err = fmt.Errorf("too many tags [ limit = %d, observed = %d ]", limit, length) + return + } + + d.length = int(length) + d.remaining = int(length) +} + +func (d *decoder) Next() bool { + d.releaseCurrent() + d.nextCalls++ + if d.err != nil || d.remaining <= 0 { + return false + } + + if err := d.decodeTag(); err != nil { + d.err = err + return false + } + + d.remaining-- + return true +} + +func (d *decoder) Current() ident.Tag { + return d.current +} + +func (d *decoder) CurrentIndex() int { + return d.Len() - d.Remaining() +} + +func (d *decoder) decodeTag() error { + if err := d.decodeIDInto(d.currentTagName); err != nil { + return err + } + // safe to call Bytes() as d.current.Name has inc'd a ref + if len(d.currentTagName.Bytes()) == 0 { + d.releaseCurrent() + return errEmptyTagNameLiteral + } + + if err := d.decodeIDInto(d.currentTagValue); err != nil { + d.releaseCurrent() + return err + } + + return nil +} + +func (d *decoder) decodeIDInto(b checked.Bytes) error { + l, err := d.decodeUInt16() + if err != nil { + return err + } + + if limit := d.opts.TagSerializationLimits().MaxTagLiteralLength(); l > limit { + return fmt.Errorf("tag literal too long [ limit = %d, observed = %d ]", limit, int(l)) + } + + if len(d.data) < int(l) { + return errInvalidByteStreamIDDecoding + } + + // incRef to indicate another checked.Bytes has a + // reference to the original bytes + d.checkedData.IncRef() + b.IncRef() + b.Reset(d.data[:l]) + b.DecRef() + d.data = d.data[l:] + + return nil +} + +func (d *decoder) decodeUInt16() (uint16, error) { + if len(d.data) < 2 { + return 0, errInvalidByteStreamUintDecoding + } + + n := decodeUInt16(d.data) + d.data = d.data[2:] + return n, nil +} + +func (d *decoder) Err() error { + return d.err +} + +func (d *decoder) Len() int { + return d.length +} + +func (d *decoder) Remaining() int { + return d.remaining +} + +func (d *decoder) releaseCurrent() { + d.currentTagName.IncRef() + if b := d.currentTagName.Bytes(); b != nil { + d.checkedData.DecRef() + } + d.currentTagName.Reset(nil) + d.currentTagName.DecRef() + + d.currentTagValue.IncRef() + if b := d.currentTagValue.Bytes(); b != nil { + d.checkedData.DecRef() + } + d.currentTagValue.Reset(nil) + d.currentTagValue.DecRef() +} + +func (d *decoder) resetForReuse() { + d.releaseCurrent() + d.data = nil + d.err = nil + d.remaining = 0 + d.nextCalls = 0 + if d.checkedData != nil { + d.checkedData.DecRef() + if d.checkedData.NumRef() == 0 { + d.checkedData.Finalize() + } + d.checkedData = nil + } +} + +func (d *decoder) Close() { + d.resetForReuse() + if d.pool == nil { + return + } + d.pool.Put(d) +} + +func (d *decoder) Duplicate() ident.TagIterator { + iter := d.pool.Get() + if d.checkedData == nil { + return iter + } + iter.Reset(d.checkedData) + for i := 0; i < d.nextCalls; i++ { + iter.Next() + } + return iter +} + +func (d *decoder) Rewind() { + if d.checkedData == nil { + return + } + d.checkedData.IncRef() + d.Reset(d.checkedData) + d.checkedData.DecRef() +} diff --git a/vendor/github.com/m3db/m3/src/x/serialize/decoder_options.go b/vendor/github.com/m3db/m3/src/x/serialize/decoder_options.go new file mode 100644 index 00000000..d626cb20 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/serialize/decoder_options.go @@ -0,0 +1,105 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package serialize + +import ( + "github.com/m3db/m3/src/dbnode/x/xpool" + "github.com/m3db/m3/src/x/pool" +) + +const ( + // defaultCheckBytesWrapperPoolSize is the default size of the checked.Bytes wrapper pool. + defaultCheckBytesWrapperPoolSize = 16384 + // defaultCheckBytesWrapperPoolLowWatermark is the default low watermark of the checked.Bytes wrapper pool. + defaultCheckBytesWrapperPoolLowWatermark = 0.7 + // defaultCheckBytesWrapperPoolHighWatermark is the default high watermark of the checked.Bytes wrapper pool. + defaultCheckBytesWrapperPoolHighWatermark = 1.0 +) + +type decodeOpts struct { + wrapperPool xpool.CheckedBytesWrapperPool + limits TagSerializationLimits +} + +// TagDecoderOptionsConfig allows for defaults to be set at initialization. +type TagDecoderOptionsConfig struct { + CheckBytesWrapperPoolSize *int `yaml:"checkBytesWrapperPoolSize"` + CheckBytesWrapperPoolLowWatermark *float64 `yaml:"checkBytesWrapperPoolLowWatermark"` + CheckBytesWrapperPoolHighWatermark *float64 `yaml:"checkBytesWrapperPoolHighWatermark"` +} + +// CheckBytesWrapperPoolSizeOrDefault returns config value or default. +func (c TagDecoderOptionsConfig) CheckBytesWrapperPoolSizeOrDefault() int { + if c.CheckBytesWrapperPoolSize == nil { + return defaultCheckBytesWrapperPoolSize + } + return *c.CheckBytesWrapperPoolSize +} + +// CheckBytesWrapperPoolLowWatermarkOrDefault returns config value or default. +func (c TagDecoderOptionsConfig) CheckBytesWrapperPoolLowWatermarkOrDefault() float64 { + if c.CheckBytesWrapperPoolLowWatermark == nil { + return defaultCheckBytesWrapperPoolLowWatermark + } + return *c.CheckBytesWrapperPoolLowWatermark +} + +// CheckBytesWrapperPoolHighWatermarkOrDefault returns config value or default. +func (c TagDecoderOptionsConfig) CheckBytesWrapperPoolHighWatermarkOrDefault() float64 { + if c.CheckBytesWrapperPoolHighWatermark == nil { + return defaultCheckBytesWrapperPoolHighWatermark + } + return *c.CheckBytesWrapperPoolHighWatermark +} + +// NewTagDecoderOptions returns a new TagDecoderOptions. +func NewTagDecoderOptions(cfg TagDecoderOptionsConfig) TagDecoderOptions { + pool := xpool.NewCheckedBytesWrapperPool( + pool.NewObjectPoolOptions(). + SetSize(cfg.CheckBytesWrapperPoolSizeOrDefault()). + SetRefillLowWatermark(cfg.CheckBytesWrapperPoolLowWatermarkOrDefault()). + SetRefillHighWatermark(cfg.CheckBytesWrapperPoolHighWatermarkOrDefault())) + pool.Init() + return &decodeOpts{ + wrapperPool: pool, + limits: NewTagSerializationLimits(), + } +} + +func (o *decodeOpts) SetCheckedBytesWrapperPool(v xpool.CheckedBytesWrapperPool) TagDecoderOptions { + opts := *o + opts.wrapperPool = v + return &opts +} + +func (o *decodeOpts) CheckedBytesWrapperPool() xpool.CheckedBytesWrapperPool { + return o.wrapperPool +} + +func (o *decodeOpts) SetTagSerializationLimits(v TagSerializationLimits) TagDecoderOptions { + opts := *o + opts.limits = v + return &opts +} + +func (o *decodeOpts) TagSerializationLimits() TagSerializationLimits { + return o.limits +} diff --git a/vendor/github.com/m3db/m3/src/x/serialize/decoder_pool.go b/vendor/github.com/m3db/m3/src/x/serialize/decoder_pool.go new file mode 100644 index 00000000..99f667c4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/serialize/decoder_pool.go @@ -0,0 +1,56 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package serialize + +import ( + "github.com/m3db/m3/src/x/pool" +) + +type decoderPool struct { + decodeOpts TagDecoderOptions + pool pool.ObjectPool +} + +// NewTagDecoderPool returns a new TagDecoderPool. +func NewTagDecoderPool( + dopts TagDecoderOptions, + opts pool.ObjectPoolOptions, +) TagDecoderPool { + pool := pool.NewObjectPool(opts) + return &decoderPool{ + decodeOpts: dopts, + pool: pool, + } +} + +func (p *decoderPool) Init() { + p.pool.Init(func() interface{} { + return newTagDecoder(p.decodeOpts, p) + }) +} + +func (p *decoderPool) Get() TagDecoder { + return p.pool.Get().(TagDecoder) +} + +func (p *decoderPool) Put(e TagDecoder) { + p.pool.Put(e) +} diff --git a/vendor/github.com/m3db/m3/src/x/serialize/encoder.go b/vendor/github.com/m3db/m3/src/x/serialize/encoder.go new file mode 100644 index 00000000..a682a639 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/serialize/encoder.go @@ -0,0 +1,213 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package serialize + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + + "github.com/m3db/m3/src/x/checked" + xerrors "github.com/m3db/m3/src/x/errors" + "github.com/m3db/m3/src/x/ident" +) + +/* + * Serialization scheme to combat Thrift's allocation hell. + * + * Given Tags (i.e. key-values) this allows the bijective serialization to, + * and from Tags <--> []byte. + * + * Consider example, Tags: {"abc": "defg", "x": "foo"} + * this translates to: + * []byte( + * MAGIC_MARKER + NUMBER_TAGS + * + LENGTH([]byte("abc")) + []byte("abc") + * + LENGTH([]byte("defg")) + []byte("abc") + * + LENGTH([]byte("x")) + []byte("x") + * + LENGTH([]byte("foo")) + []byte("foo") + * ) + * + * Where MAGIC_MARKER/NUMBER_TAGS/LENGTH are maximum 2 bytes. + */ + +var ( + byteOrder binary.ByteOrder = binary.LittleEndian + headerMagicBytes = make([]byte, 2) +) + +func init() { + encodeUInt16(headerMagicNumber, headerMagicBytes) +} + +var ( + errTagEncoderInUse = errors.New("encoder already in use") + errTagLiteralTooLong = errors.New("literal is too long") + errEmptyTagNameLiteral = xerrors.NewInvalidParamsError(errors.New("tag name cannot be empty")) +) + +type newCheckedBytesFn func([]byte, checked.BytesOptions) checked.Bytes + +var defaultNewCheckedBytesFn = checked.NewBytes + +type encoder struct { + buf *bytes.Buffer + checkedBytes checked.Bytes + staticBuffer [2]byte + staticBufferSlice []byte + + opts TagEncoderOptions + pool TagEncoderPool +} + +func newTagEncoder( + newFn newCheckedBytesFn, + opts TagEncoderOptions, + pool TagEncoderPool, +) TagEncoder { + b := make([]byte, 0, opts.InitialCapacity()) + cb := newFn(nil, nil) + e := &encoder{ + buf: bytes.NewBuffer(b), + checkedBytes: cb, + opts: opts, + pool: pool, + } + e.staticBufferSlice = e.staticBuffer[:] + return e +} + +func (e *encoder) Encode(tags ident.TagIterator) error { + if e.checkedBytes.NumRef() > 0 { + return errTagEncoderInUse + } + + tags.Rewind() + defer tags.Rewind() + + numTags := tags.Remaining() + max := int(e.opts.TagSerializationLimits().MaxNumberTags()) + if numTags > max { + return fmt.Errorf("too many tags to encode (%d), limit is: %d", numTags, max) + } + + if _, err := e.buf.Write(headerMagicBytes); err != nil { + e.buf.Reset() + return err + } + + if _, err := e.buf.Write(e.encodeUInt16(uint16(numTags))); err != nil { + e.buf.Reset() + return err + } + + for tags.Next() { + tag := tags.Current() + if err := e.encodeTag(tag); err != nil { + e.buf.Reset() + return err + } + } + + if err := tags.Err(); err != nil { + e.buf.Reset() + return err + } + + e.checkedBytes.IncRef() + e.checkedBytes.Reset(e.buf.Bytes()) + + return nil +} + +func (e *encoder) Data() (checked.Bytes, bool) { + if e.checkedBytes.NumRef() == 0 { + return nil, false + } + return e.checkedBytes, true +} + +func (e *encoder) Reset() { + if e.checkedBytes.NumRef() == 0 { + return + } + e.buf.Reset() + e.checkedBytes.Reset(nil) + e.checkedBytes.DecRef() +} + +func (e *encoder) Finalize() { + e.Reset() + p := e.pool + if p == nil { + return + } + p.Put(e) +} + +func (e *encoder) encodeTag(t ident.Tag) error { + if len(t.Name.Bytes()) == 0 { + return errEmptyTagNameLiteral + } + + if err := e.encodeID(t.Name); err != nil { + return err + } + + return e.encodeID(t.Value) +} + +func (e *encoder) encodeID(i ident.ID) error { + d := i.Bytes() + + max := int(e.opts.TagSerializationLimits().MaxTagLiteralLength()) + if len(d) >= max { + return errTagLiteralTooLong + } + + ld := uint16(len(d)) + if _, err := e.buf.Write(e.encodeUInt16(ld)); err != nil { + return err + } + + if _, err := e.buf.Write(d); err != nil { + return err + } + + return nil +} + +func (e *encoder) encodeUInt16(v uint16) []byte { + // NB(r): Use static buffer on the struct for encoding, otherwise if it's + // statically defined inline in the function it will escape to heap. + dest := e.staticBufferSlice[:2] + return encodeUInt16(v, dest) +} + +func encodeUInt16(v uint16, dest []byte) []byte { + byteOrder.PutUint16(dest, v) + return dest +} + +func decodeUInt16(b []byte) uint16 { + return byteOrder.Uint16(b) +} diff --git a/vendor/github.com/m3db/m3/src/x/serialize/encoder_options.go b/vendor/github.com/m3db/m3/src/x/serialize/encoder_options.go new file mode 100644 index 00000000..0b985db9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/serialize/encoder_options.go @@ -0,0 +1,60 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package serialize + +var ( + // defaultInitialCapacity is the default initial capacity of the bytes + // underlying the encoder. + defaultInitialCapacity = 1024 +) + +type encodeOpts struct { + initialCapacity int + limits TagSerializationLimits +} + +// NewTagEncoderOptions returns a new TagEncoderOptions. +func NewTagEncoderOptions() TagEncoderOptions { + return &encodeOpts{ + initialCapacity: defaultInitialCapacity, + limits: NewTagSerializationLimits(), + } +} + +func (o *encodeOpts) SetInitialCapacity(v int) TagEncoderOptions { + opts := *o + opts.initialCapacity = v + return &opts +} + +func (o *encodeOpts) InitialCapacity() int { + return o.initialCapacity +} + +func (o *encodeOpts) SetTagSerializationLimits(v TagSerializationLimits) TagEncoderOptions { + opts := *o + opts.limits = v + return &opts +} + +func (o *encodeOpts) TagSerializationLimits() TagSerializationLimits { + return o.limits +} diff --git a/vendor/github.com/m3db/m3/src/x/serialize/encoder_pool.go b/vendor/github.com/m3db/m3/src/x/serialize/encoder_pool.go new file mode 100644 index 00000000..25106ce7 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/serialize/encoder_pool.go @@ -0,0 +1,53 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package serialize + +import ( + "github.com/m3db/m3/src/x/pool" +) + +type encoderPool struct { + pool pool.ObjectPool + opts TagEncoderOptions +} + +// NewTagEncoderPool returns a new TagEncoderPool. +func NewTagEncoderPool(topts TagEncoderOptions, opts pool.ObjectPoolOptions) TagEncoderPool { + pool := pool.NewObjectPool(opts) + return &encoderPool{ + pool: pool, + opts: topts, + } +} + +func (p *encoderPool) Init() { + p.pool.Init(func() interface{} { + return newTagEncoder(defaultNewCheckedBytesFn, p.opts, p) + }) +} + +func (p *encoderPool) Get() TagEncoder { + return p.pool.Get().(TagEncoder) +} + +func (p *encoderPool) Put(e TagEncoder) { + p.pool.Put(e) +} diff --git a/vendor/github.com/m3db/m3/src/x/serialize/limits.go b/vendor/github.com/m3db/m3/src/x/serialize/limits.go new file mode 100644 index 00000000..4a623adc --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/serialize/limits.go @@ -0,0 +1,64 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package serialize + +import "math" + +var ( + // defaultMaxNumberTags is the maximum number of tags that can be encoded. + defaultMaxNumberTags uint16 = math.MaxUint16 + + // defaultMaxTagLiteralLength is the maximum length of a tag Name/Value. + defaultMaxTagLiteralLength uint16 = math.MaxUint16 +) + +type limits struct { + maxNumberTags uint16 + maxTagLiteralLength uint16 +} + +// NewTagSerializationLimits returns a new TagSerializationLimits object. +func NewTagSerializationLimits() TagSerializationLimits { + return &limits{ + maxNumberTags: defaultMaxNumberTags, + maxTagLiteralLength: defaultMaxTagLiteralLength, + } +} + +func (l *limits) SetMaxNumberTags(v uint16) TagSerializationLimits { + lim := *l + lim.maxNumberTags = v + return &lim +} + +func (l *limits) MaxNumberTags() uint16 { + return l.maxNumberTags +} + +func (l *limits) SetMaxTagLiteralLength(v uint16) TagSerializationLimits { + lim := *l + lim.maxTagLiteralLength = v + return &lim +} + +func (l *limits) MaxTagLiteralLength() uint16 { + return l.maxTagLiteralLength +} diff --git a/vendor/github.com/m3db/m3/src/x/serialize/metric_tags_iterator.go b/vendor/github.com/m3db/m3/src/x/serialize/metric_tags_iterator.go new file mode 100644 index 00000000..8734edab --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/serialize/metric_tags_iterator.go @@ -0,0 +1,129 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package serialize + +import ( + "bytes" + + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/pool" +) + +type metricTagsIter struct { + tagDecoder TagDecoder + bytes checked.Bytes + pool MetricTagsIteratorPool +} + +// NewMetricTagsIterator creates a MetricTagsIterator. +func NewMetricTagsIterator( + tagDecoder TagDecoder, + pool MetricTagsIteratorPool, +) MetricTagsIterator { + return &metricTagsIter{ + tagDecoder: tagDecoder, + bytes: checked.NewBytes(nil, nil), + pool: pool, + } +} + +func (it *metricTagsIter) Reset(sortedTagPairs []byte) { + it.bytes.IncRef() + it.bytes.Reset(sortedTagPairs) + it.tagDecoder.Reset(it.bytes) +} + +func (it *metricTagsIter) Bytes() []byte { + return it.bytes.Bytes() +} + +func (it *metricTagsIter) NumTags() int { + return it.tagDecoder.Len() +} + +func (it *metricTagsIter) TagValue(tagName []byte) ([]byte, bool) { + iter := it.tagDecoder.Duplicate() + defer iter.Close() + + for iter.Next() { + tag := iter.Current() + if bytes.Equal(tagName, tag.Name.Bytes()) { + return tag.Value.Bytes(), true + } + } + return nil, false +} + +func (it *metricTagsIter) Next() bool { + return it.tagDecoder.Next() +} + +func (it *metricTagsIter) Current() ([]byte, []byte) { + tag := it.tagDecoder.Current() + return tag.Name.Bytes(), tag.Value.Bytes() +} + +func (it *metricTagsIter) Err() error { + return it.tagDecoder.Err() +} + +func (it *metricTagsIter) Close() { + it.bytes.Reset(nil) + it.bytes.DecRef() + it.tagDecoder.Reset(it.bytes) + + if it.pool != nil { + it.pool.Put(it) + } +} + +type metricTagsIteratorPool struct { + tagDecoderPool TagDecoderPool + pool pool.ObjectPool +} + +// NewMetricTagsIteratorPool creates a MetricTagsIteratorPool. +func NewMetricTagsIteratorPool( + tagDecoderPool TagDecoderPool, + opts pool.ObjectPoolOptions, +) MetricTagsIteratorPool { + return &metricTagsIteratorPool{ + tagDecoderPool: tagDecoderPool, + pool: pool.NewObjectPool(opts), + } +} + +// Init initializes the pool. +func (p *metricTagsIteratorPool) Init() { + p.pool.Init(func() interface{} { + return NewMetricTagsIterator(p.tagDecoderPool.Get(), p) + }) +} + +// Get provides a MetricTagsIterator from the pool. +func (p *metricTagsIteratorPool) Get() MetricTagsIterator { + return p.pool.Get().(*metricTagsIter) +} + +// Put returns a MetricTagsIterator to the pool. +func (p *metricTagsIteratorPool) Put(v MetricTagsIterator) { + p.pool.Put(v) +} diff --git a/vendor/github.com/m3db/m3/src/x/serialize/serialize_mock.go b/vendor/github.com/m3db/m3/src/x/serialize/serialize_mock.go new file mode 100644 index 00000000..daf40ce2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/serialize/serialize_mock.go @@ -0,0 +1,583 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/m3db/m3/src/x/serialize (interfaces: TagEncoder,TagEncoderPool,TagDecoder,TagDecoderPool,MetricTagsIterator,MetricTagsIteratorPool) + +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package serialize is a generated GoMock package. +package serialize + +import ( + "reflect" + + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/ident" + + "github.com/golang/mock/gomock" +) + +// MockTagEncoder is a mock of TagEncoder interface +type MockTagEncoder struct { + ctrl *gomock.Controller + recorder *MockTagEncoderMockRecorder +} + +// MockTagEncoderMockRecorder is the mock recorder for MockTagEncoder +type MockTagEncoderMockRecorder struct { + mock *MockTagEncoder +} + +// NewMockTagEncoder creates a new mock instance +func NewMockTagEncoder(ctrl *gomock.Controller) *MockTagEncoder { + mock := &MockTagEncoder{ctrl: ctrl} + mock.recorder = &MockTagEncoderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTagEncoder) EXPECT() *MockTagEncoderMockRecorder { + return m.recorder +} + +// Data mocks base method +func (m *MockTagEncoder) Data() (checked.Bytes, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Data") + ret0, _ := ret[0].(checked.Bytes) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// Data indicates an expected call of Data +func (mr *MockTagEncoderMockRecorder) Data() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Data", reflect.TypeOf((*MockTagEncoder)(nil).Data)) +} + +// Encode mocks base method +func (m *MockTagEncoder) Encode(arg0 ident.TagIterator) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Encode", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Encode indicates an expected call of Encode +func (mr *MockTagEncoderMockRecorder) Encode(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Encode", reflect.TypeOf((*MockTagEncoder)(nil).Encode), arg0) +} + +// Finalize mocks base method +func (m *MockTagEncoder) Finalize() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Finalize") +} + +// Finalize indicates an expected call of Finalize +func (mr *MockTagEncoderMockRecorder) Finalize() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finalize", reflect.TypeOf((*MockTagEncoder)(nil).Finalize)) +} + +// Reset mocks base method +func (m *MockTagEncoder) Reset() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset") +} + +// Reset indicates an expected call of Reset +func (mr *MockTagEncoderMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockTagEncoder)(nil).Reset)) +} + +// MockTagEncoderPool is a mock of TagEncoderPool interface +type MockTagEncoderPool struct { + ctrl *gomock.Controller + recorder *MockTagEncoderPoolMockRecorder +} + +// MockTagEncoderPoolMockRecorder is the mock recorder for MockTagEncoderPool +type MockTagEncoderPoolMockRecorder struct { + mock *MockTagEncoderPool +} + +// NewMockTagEncoderPool creates a new mock instance +func NewMockTagEncoderPool(ctrl *gomock.Controller) *MockTagEncoderPool { + mock := &MockTagEncoderPool{ctrl: ctrl} + mock.recorder = &MockTagEncoderPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTagEncoderPool) EXPECT() *MockTagEncoderPoolMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockTagEncoderPool) Get() TagEncoder { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(TagEncoder) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockTagEncoderPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockTagEncoderPool)(nil).Get)) +} + +// Init mocks base method +func (m *MockTagEncoderPool) Init() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init") +} + +// Init indicates an expected call of Init +func (mr *MockTagEncoderPoolMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockTagEncoderPool)(nil).Init)) +} + +// Put mocks base method +func (m *MockTagEncoderPool) Put(arg0 TagEncoder) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", arg0) +} + +// Put indicates an expected call of Put +func (mr *MockTagEncoderPoolMockRecorder) Put(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockTagEncoderPool)(nil).Put), arg0) +} + +// MockTagDecoder is a mock of TagDecoder interface +type MockTagDecoder struct { + ctrl *gomock.Controller + recorder *MockTagDecoderMockRecorder +} + +// MockTagDecoderMockRecorder is the mock recorder for MockTagDecoder +type MockTagDecoderMockRecorder struct { + mock *MockTagDecoder +} + +// NewMockTagDecoder creates a new mock instance +func NewMockTagDecoder(ctrl *gomock.Controller) *MockTagDecoder { + mock := &MockTagDecoder{ctrl: ctrl} + mock.recorder = &MockTagDecoderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTagDecoder) EXPECT() *MockTagDecoderMockRecorder { + return m.recorder +} + +// Close mocks base method +func (m *MockTagDecoder) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockTagDecoderMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockTagDecoder)(nil).Close)) +} + +// Current mocks base method +func (m *MockTagDecoder) Current() ident.Tag { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].(ident.Tag) + return ret0 +} + +// Current indicates an expected call of Current +func (mr *MockTagDecoderMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockTagDecoder)(nil).Current)) +} + +// CurrentIndex mocks base method +func (m *MockTagDecoder) CurrentIndex() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CurrentIndex") + ret0, _ := ret[0].(int) + return ret0 +} + +// CurrentIndex indicates an expected call of CurrentIndex +func (mr *MockTagDecoderMockRecorder) CurrentIndex() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CurrentIndex", reflect.TypeOf((*MockTagDecoder)(nil).CurrentIndex)) +} + +// Duplicate mocks base method +func (m *MockTagDecoder) Duplicate() ident.TagIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Duplicate") + ret0, _ := ret[0].(ident.TagIterator) + return ret0 +} + +// Duplicate indicates an expected call of Duplicate +func (mr *MockTagDecoderMockRecorder) Duplicate() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Duplicate", reflect.TypeOf((*MockTagDecoder)(nil).Duplicate)) +} + +// Err mocks base method +func (m *MockTagDecoder) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockTagDecoderMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockTagDecoder)(nil).Err)) +} + +// Len mocks base method +func (m *MockTagDecoder) Len() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Len") + ret0, _ := ret[0].(int) + return ret0 +} + +// Len indicates an expected call of Len +func (mr *MockTagDecoderMockRecorder) Len() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockTagDecoder)(nil).Len)) +} + +// Next mocks base method +func (m *MockTagDecoder) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockTagDecoderMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockTagDecoder)(nil).Next)) +} + +// Remaining mocks base method +func (m *MockTagDecoder) Remaining() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Remaining") + ret0, _ := ret[0].(int) + return ret0 +} + +// Remaining indicates an expected call of Remaining +func (mr *MockTagDecoderMockRecorder) Remaining() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remaining", reflect.TypeOf((*MockTagDecoder)(nil).Remaining)) +} + +// Reset mocks base method +func (m *MockTagDecoder) Reset(arg0 checked.Bytes) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", arg0) +} + +// Reset indicates an expected call of Reset +func (mr *MockTagDecoderMockRecorder) Reset(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockTagDecoder)(nil).Reset), arg0) +} + +// Rewind mocks base method +func (m *MockTagDecoder) Rewind() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Rewind") +} + +// Rewind indicates an expected call of Rewind +func (mr *MockTagDecoderMockRecorder) Rewind() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Rewind", reflect.TypeOf((*MockTagDecoder)(nil).Rewind)) +} + +// MockTagDecoderPool is a mock of TagDecoderPool interface +type MockTagDecoderPool struct { + ctrl *gomock.Controller + recorder *MockTagDecoderPoolMockRecorder +} + +// MockTagDecoderPoolMockRecorder is the mock recorder for MockTagDecoderPool +type MockTagDecoderPoolMockRecorder struct { + mock *MockTagDecoderPool +} + +// NewMockTagDecoderPool creates a new mock instance +func NewMockTagDecoderPool(ctrl *gomock.Controller) *MockTagDecoderPool { + mock := &MockTagDecoderPool{ctrl: ctrl} + mock.recorder = &MockTagDecoderPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockTagDecoderPool) EXPECT() *MockTagDecoderPoolMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockTagDecoderPool) Get() TagDecoder { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(TagDecoder) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockTagDecoderPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockTagDecoderPool)(nil).Get)) +} + +// Init mocks base method +func (m *MockTagDecoderPool) Init() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init") +} + +// Init indicates an expected call of Init +func (mr *MockTagDecoderPoolMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockTagDecoderPool)(nil).Init)) +} + +// Put mocks base method +func (m *MockTagDecoderPool) Put(arg0 TagDecoder) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", arg0) +} + +// Put indicates an expected call of Put +func (mr *MockTagDecoderPoolMockRecorder) Put(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockTagDecoderPool)(nil).Put), arg0) +} + +// MockMetricTagsIterator is a mock of MetricTagsIterator interface +type MockMetricTagsIterator struct { + ctrl *gomock.Controller + recorder *MockMetricTagsIteratorMockRecorder +} + +// MockMetricTagsIteratorMockRecorder is the mock recorder for MockMetricTagsIterator +type MockMetricTagsIteratorMockRecorder struct { + mock *MockMetricTagsIterator +} + +// NewMockMetricTagsIterator creates a new mock instance +func NewMockMetricTagsIterator(ctrl *gomock.Controller) *MockMetricTagsIterator { + mock := &MockMetricTagsIterator{ctrl: ctrl} + mock.recorder = &MockMetricTagsIteratorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMetricTagsIterator) EXPECT() *MockMetricTagsIteratorMockRecorder { + return m.recorder +} + +// Bytes mocks base method +func (m *MockMetricTagsIterator) Bytes() []byte { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Bytes") + ret0, _ := ret[0].([]byte) + return ret0 +} + +// Bytes indicates an expected call of Bytes +func (mr *MockMetricTagsIteratorMockRecorder) Bytes() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Bytes", reflect.TypeOf((*MockMetricTagsIterator)(nil).Bytes)) +} + +// Close mocks base method +func (m *MockMetricTagsIterator) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close +func (mr *MockMetricTagsIteratorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockMetricTagsIterator)(nil).Close)) +} + +// Current mocks base method +func (m *MockMetricTagsIterator) Current() ([]byte, []byte) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Current") + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].([]byte) + return ret0, ret1 +} + +// Current indicates an expected call of Current +func (mr *MockMetricTagsIteratorMockRecorder) Current() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Current", reflect.TypeOf((*MockMetricTagsIterator)(nil).Current)) +} + +// Err mocks base method +func (m *MockMetricTagsIterator) Err() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Err") + ret0, _ := ret[0].(error) + return ret0 +} + +// Err indicates an expected call of Err +func (mr *MockMetricTagsIteratorMockRecorder) Err() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Err", reflect.TypeOf((*MockMetricTagsIterator)(nil).Err)) +} + +// Next mocks base method +func (m *MockMetricTagsIterator) Next() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Next") + ret0, _ := ret[0].(bool) + return ret0 +} + +// Next indicates an expected call of Next +func (mr *MockMetricTagsIteratorMockRecorder) Next() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockMetricTagsIterator)(nil).Next)) +} + +// NumTags mocks base method +func (m *MockMetricTagsIterator) NumTags() int { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumTags") + ret0, _ := ret[0].(int) + return ret0 +} + +// NumTags indicates an expected call of NumTags +func (mr *MockMetricTagsIteratorMockRecorder) NumTags() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumTags", reflect.TypeOf((*MockMetricTagsIterator)(nil).NumTags)) +} + +// Reset mocks base method +func (m *MockMetricTagsIterator) Reset(arg0 []byte) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Reset", arg0) +} + +// Reset indicates an expected call of Reset +func (mr *MockMetricTagsIteratorMockRecorder) Reset(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockMetricTagsIterator)(nil).Reset), arg0) +} + +// TagValue mocks base method +func (m *MockMetricTagsIterator) TagValue(arg0 []byte) ([]byte, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TagValue", arg0) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// TagValue indicates an expected call of TagValue +func (mr *MockMetricTagsIteratorMockRecorder) TagValue(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TagValue", reflect.TypeOf((*MockMetricTagsIterator)(nil).TagValue), arg0) +} + +// MockMetricTagsIteratorPool is a mock of MetricTagsIteratorPool interface +type MockMetricTagsIteratorPool struct { + ctrl *gomock.Controller + recorder *MockMetricTagsIteratorPoolMockRecorder +} + +// MockMetricTagsIteratorPoolMockRecorder is the mock recorder for MockMetricTagsIteratorPool +type MockMetricTagsIteratorPoolMockRecorder struct { + mock *MockMetricTagsIteratorPool +} + +// NewMockMetricTagsIteratorPool creates a new mock instance +func NewMockMetricTagsIteratorPool(ctrl *gomock.Controller) *MockMetricTagsIteratorPool { + mock := &MockMetricTagsIteratorPool{ctrl: ctrl} + mock.recorder = &MockMetricTagsIteratorPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockMetricTagsIteratorPool) EXPECT() *MockMetricTagsIteratorPoolMockRecorder { + return m.recorder +} + +// Get mocks base method +func (m *MockMetricTagsIteratorPool) Get() MetricTagsIterator { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get") + ret0, _ := ret[0].(MetricTagsIterator) + return ret0 +} + +// Get indicates an expected call of Get +func (mr *MockMetricTagsIteratorPoolMockRecorder) Get() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockMetricTagsIteratorPool)(nil).Get)) +} + +// Init mocks base method +func (m *MockMetricTagsIteratorPool) Init() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Init") +} + +// Init indicates an expected call of Init +func (mr *MockMetricTagsIteratorPoolMockRecorder) Init() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockMetricTagsIteratorPool)(nil).Init)) +} + +// Put mocks base method +func (m *MockMetricTagsIteratorPool) Put(arg0 MetricTagsIterator) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Put", arg0) +} + +// Put indicates an expected call of Put +func (mr *MockMetricTagsIteratorPoolMockRecorder) Put(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Put", reflect.TypeOf((*MockMetricTagsIteratorPool)(nil).Put), arg0) +} diff --git a/vendor/github.com/m3db/m3/src/x/serialize/types.go b/vendor/github.com/m3db/m3/src/x/serialize/types.go new file mode 100644 index 00000000..a694ae7d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/serialize/types.go @@ -0,0 +1,149 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package serialize + +import ( + "github.com/m3db/m3/src/dbnode/x/xpool" + "github.com/m3db/m3/src/metrics/metric/id" + "github.com/m3db/m3/src/x/checked" + "github.com/m3db/m3/src/x/ident" +) + +var ( + // headerMagicNumber is an internal header used to denote the beginning of + // an encoded stream. + headerMagicNumber uint16 = 10101 +) + +// TagEncoder encodes provided Tag iterators. +type TagEncoder interface { + // Encode encodes the provided iterator into its internal byte stream. + // NB: leaves the original iterator un-modified. + Encode(ident.TagIterator) error + + // Data returns the encoded bytes. + // NB: The bytes returned as still owned by the TagEncoder. i.e. They are + // only safe for use until Reset/Finalize is called upon the original + // TagEncoder. + Data() (checked.Bytes, bool) + + // Reset resets the internal state to allow reuse of the encoder. + Reset() + + // Finalize releases any held resources. + Finalize() +} + +// TagEncoderPool pools TagEncoders. +type TagEncoderPool interface { + // Init initializes the pool. + Init() + + // Get returns an encoder. NB: calling Finalize() on the + // returned TagEncoder puts it back in the pool. + Get() TagEncoder + + // Put puts the encoder back in the pool. + Put(TagEncoder) +} + +// TagDecoder decodes an encoded byte stream to a TagIterator. +type TagDecoder interface { + ident.TagIterator + + // Reset resets internal state to iterate over the provided bytes. + // NB: the TagDecoder takes ownership of the provided checked.Bytes. + Reset(checked.Bytes) +} + +// TagDecoderPool pools TagDecoders. +type TagDecoderPool interface { + // Init initializes the pool. + Init() + + // Get returns a decoder. NB: calling Finalize() on the + // returned TagDecoder puts it back in the pool. + Get() TagDecoder + + // Put puts the decoder back in the pool. + Put(TagDecoder) +} + +// TagEncoderOptions sets the knobs for TagEncoder limits. +type TagEncoderOptions interface { + // SetInitialCapacity sets the initial capacity of the bytes underlying + // the TagEncoder. + SetInitialCapacity(v int) TagEncoderOptions + + // InitialCapacity returns the initial capacity of the bytes underlying + // the TagEncoder. + InitialCapacity() int + + // SetTagSerializationLimits sets the TagSerializationLimits. + SetTagSerializationLimits(v TagSerializationLimits) TagEncoderOptions + + // TagSerializationLimits returns the TagSerializationLimits. + TagSerializationLimits() TagSerializationLimits +} + +// TagDecoderOptions sets the knobs for TagDecoders. +type TagDecoderOptions interface { + // SetCheckedBytesWrapperPool sets the checked.Bytes wrapper pool. + SetCheckedBytesWrapperPool(v xpool.CheckedBytesWrapperPool) TagDecoderOptions + + // CheckedBytesWrapperPool returns the checked.Bytes wrapper pool. + CheckedBytesWrapperPool() xpool.CheckedBytesWrapperPool + + // SetTagSerializationLimits sets the TagSerializationLimits. + SetTagSerializationLimits(v TagSerializationLimits) TagDecoderOptions + + // TagSerializationLimits returns the TagSerializationLimits. + TagSerializationLimits() TagSerializationLimits +} + +// TagSerializationLimits sets the limits around tag serialization. +type TagSerializationLimits interface { + // SetMaxNumberTags sets the maximum number of tags allowed. + SetMaxNumberTags(uint16) TagSerializationLimits + + // MaxNumberTags returns the maximum number of tags allowed. + MaxNumberTags() uint16 + + // SetMaxTagLiteralLength sets the maximum length of a tag Name/Value. + SetMaxTagLiteralLength(uint16) TagSerializationLimits + + // MaxTagLiteralLength returns the maximum length of a tag Name/Value. + MaxTagLiteralLength() uint16 +} + +// MetricTagsIterator iterates over a set of tags. +type MetricTagsIterator interface { + id.ID + id.SortedTagIterator + NumTags() int +} + +// MetricTagsIteratorPool pools MetricTagsIterator. +type MetricTagsIteratorPool interface { + Init() + Get() MetricTagsIterator + Put(iter MetricTagsIterator) +} diff --git a/vendor/github.com/m3db/m3/src/x/sync/cpu_linux_amd64.go b/vendor/github.com/m3db/m3/src/x/sync/cpu_linux_amd64.go new file mode 100644 index 00000000..9d5374fe --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sync/cpu_linux_amd64.go @@ -0,0 +1,24 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sync + +// getCore is the currently running CPU core. +func getCore() int diff --git a/vendor/github.com/m3db/m3/src/x/sync/cpu_linux_amd64.s b/vendor/github.com/m3db/m3/src/x/sync/cpu_linux_amd64.s new file mode 100644 index 00000000..63d13096 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sync/cpu_linux_amd64.s @@ -0,0 +1,14 @@ +#include "textflag.h" +#include "go_asm.h" + +#define get_tls(r) MOVQ TLS, r + +// func getCore() int +TEXT ·getCore(SB), NOSPLIT, $0 + // RDTSCP + BYTE $0x0f; BYTE $0x01; BYTE $0xf9 + + // Linux puts core ID in the bottom byte. + ANDQ $0xff, CX + MOVQ CX, ret+0(FP) + RET diff --git a/vendor/github.com/m3db/m3/src/x/sync/cpu_supported_arch_unsupported_os.go b/vendor/github.com/m3db/m3/src/x/sync/cpu_supported_arch_unsupported_os.go new file mode 100644 index 00000000..a0ceef2d --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sync/cpu_supported_arch_unsupported_os.go @@ -0,0 +1,28 @@ +// +build amd64,!linux +// +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sync + +func getCore() int { + // Reverts to just single core. + return 0 +} diff --git a/vendor/github.com/m3db/m3/src/x/sync/cpu_unsupported_arch_supported_os.go b/vendor/github.com/m3db/m3/src/x/sync/cpu_unsupported_arch_supported_os.go new file mode 100644 index 00000000..db5e8e92 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sync/cpu_unsupported_arch_supported_os.go @@ -0,0 +1,28 @@ +// +build !amd64,linux +// +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sync + +func getCore() int { + // Reverts to just single core. + return 0 +} diff --git a/vendor/github.com/m3db/m3/src/x/sync/cpu_unsupported_arch_unsupported_os.go b/vendor/github.com/m3db/m3/src/x/sync/cpu_unsupported_arch_unsupported_os.go new file mode 100644 index 00000000..6675eb37 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sync/cpu_unsupported_arch_unsupported_os.go @@ -0,0 +1,28 @@ +// +build !amd64,!linux +// +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sync + +func getCore() int { + // Reverts to just single core. + return 0 +} diff --git a/vendor/github.com/m3db/m3/src/x/sync/index_cpu.go b/vendor/github.com/m3db/m3/src/x/sync/index_cpu.go new file mode 100644 index 00000000..fc910fd4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sync/index_cpu.go @@ -0,0 +1,73 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sync + +import ( + "bufio" + "os" + "strings" +) + +var ( + numCores = 1 +) + +func init() { + f, err := os.Open("/proc/cpuinfo") + if err != nil { + return + } + + defer f.Close() + + n := 0 + scanner := bufio.NewScanner(f) + for scanner.Scan() { + if strings.HasPrefix(scanner.Text(), "processor") { + n++ + } + } + + if err := scanner.Err(); err != nil { + return + } + + numCores = n +} + +// NumCores returns the number of cores returned from +// /proc/cpuinfo, if not available only returns 1 +func NumCores() int { + return numCores +} + +// CPUCore returns the current CPU core. +func CPUCore() int { + if numCores == 1 { + // Likely not linux and nothing available in procinfo meaning that + // even if RDTSCP is available we won't have setup correct number + // of cores, etc for our queues since we probed using NumCores + // and got 1 back. + return 0 + } + // We know the number of cores, try to call RDTSCP to get the core. + return getCore() +} diff --git a/vendor/github.com/m3db/m3/src/x/sync/options.go b/vendor/github.com/m3db/m3/src/x/sync/options.go new file mode 100644 index 00000000..a417617a --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sync/options.go @@ -0,0 +1,110 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sync + +import ( + "runtime" + "time" + + "github.com/m3db/m3/src/x/instrument" +) + +const ( + defaultKillWorkerProbability = 0.001 + defaultGrowOnDemand = false +) + +var ( + defaultNumShards = int64(runtime.NumCPU()) + defaultNowFn = time.Now +) + +// NowFn is a function that returns the current time. +type NowFn func() time.Time + +// NewPooledWorkerPoolOptions returns a new PooledWorkerPoolOptions with default options +func NewPooledWorkerPoolOptions() PooledWorkerPoolOptions { + return &pooledWorkerPoolOptions{ + growOnDemand: defaultGrowOnDemand, + numShards: defaultNumShards, + killWorkerProbability: defaultKillWorkerProbability, + nowFn: defaultNowFn, + iOpts: instrument.NewOptions(), + } +} + +type pooledWorkerPoolOptions struct { + growOnDemand bool + numShards int64 + killWorkerProbability float64 + nowFn NowFn + iOpts instrument.Options +} + +func (o *pooledWorkerPoolOptions) SetGrowOnDemand(value bool) PooledWorkerPoolOptions { + opts := *o + opts.growOnDemand = value + return &opts +} + +func (o *pooledWorkerPoolOptions) GrowOnDemand() bool { + return o.growOnDemand +} + +func (o *pooledWorkerPoolOptions) SetNumShards(value int64) PooledWorkerPoolOptions { + opts := *o + opts.numShards = value + return &opts +} + +func (o *pooledWorkerPoolOptions) NumShards() int64 { + return o.numShards +} + +func (o *pooledWorkerPoolOptions) SetKillWorkerProbability(value float64) PooledWorkerPoolOptions { + opts := *o + opts.killWorkerProbability = value + return &opts +} + +func (o *pooledWorkerPoolOptions) KillWorkerProbability() float64 { + return o.killWorkerProbability +} + +func (o *pooledWorkerPoolOptions) SetNowFn(value NowFn) PooledWorkerPoolOptions { + opts := *o + opts.nowFn = value + return &opts +} + +func (o *pooledWorkerPoolOptions) NowFn() NowFn { + return o.nowFn +} + +func (o *pooledWorkerPoolOptions) SetInstrumentOptions(value instrument.Options) PooledWorkerPoolOptions { + opts := *o + opts.iOpts = value + return &opts +} + +func (o *pooledWorkerPoolOptions) InstrumentOptions() instrument.Options { + return o.iOpts +} diff --git a/vendor/github.com/m3db/m3/src/x/sync/pooled_worker_pool.go b/vendor/github.com/m3db/m3/src/x/sync/pooled_worker_pool.go new file mode 100644 index 00000000..93af3f8c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sync/pooled_worker_pool.go @@ -0,0 +1,234 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sync + +import ( + "fmt" + "math" + "sync" + "sync/atomic" + "time" + + "github.com/MichaelTJones/pcg" + "github.com/uber-go/tally" +) + +const ( + numGoroutinesGaugeSampleRate = 1000 +) + +var ( + pooledWorkerPoolGoroutinesCapacity *int +) + +type pooledWorkerPool struct { + sync.Mutex + numRoutinesAtomic int64 + numWorkingRoutinesAtomic int64 + numRoutinesGauge tally.Gauge + numWorkingRoutinesGauge tally.Gauge + growOnDemand bool + workChs []chan Work + numShards int64 + killWorkerProbability float64 + nowFn NowFn +} + +// NewPooledWorkerPool creates a new worker pool. +func NewPooledWorkerPool(size int, opts PooledWorkerPoolOptions) (PooledWorkerPool, error) { + if size <= 0 { + return nil, fmt.Errorf("pooled worker pool size too small: %d", size) + } + + numShards := opts.NumShards() + if int64(size) < numShards { + numShards = int64(size) + } + + workChs := make([]chan Work, numShards) + for i := range workChs { + if c := pooledWorkerPoolGoroutinesCapacity; c != nil { + if *c == 0 { + workChs[i] = make(chan Work) + } else { + workChs[i] = make(chan Work, *c) + } + } else { + workChs[i] = make(chan Work, int64(size)/numShards) + } + } + + return &pooledWorkerPool{ + numRoutinesAtomic: 0, + numWorkingRoutinesAtomic: 0, + numRoutinesGauge: opts.InstrumentOptions().MetricsScope().Gauge("num-routines"), + numWorkingRoutinesGauge: opts.InstrumentOptions().MetricsScope().Gauge("num-working-routines"), + growOnDemand: opts.GrowOnDemand(), + workChs: workChs, + numShards: numShards, + killWorkerProbability: opts.KillWorkerProbability(), + nowFn: opts.NowFn(), + }, nil +} + +func (p *pooledWorkerPool) Init() { + rng := pcg.NewPCG64() // Just use default seed here + for _, workCh := range p.workChs { + for i := 0; i < cap(workCh); i++ { + p.spawnWorker(rng.Random(), nil, workCh, true) + } + } +} + +func (p *pooledWorkerPool) Go(work Work) { + p.goWithTimeout(work, 0) +} + +func (p *pooledWorkerPool) GoWithTimeout(work Work, timeout time.Duration) bool { + return p.goWithTimeout(work, timeout) +} + +func (p *pooledWorkerPool) goWithTimeout(work Work, timeout time.Duration) bool { + var ( + // Use time.Now() to avoid excessive synchronization + currTime = p.nowFn().UnixNano() + workChIdx = currTime % p.numShards + workCh = p.workChs[workChIdx] + ) + + if currTime%numGoroutinesGaugeSampleRate == 0 { + p.emitNumRoutines() + p.emitNumWorkingRoutines() + } + + if !p.growOnDemand { + if timeout <= 0 { + workCh <- work + return true + } + + // Attempt to try writing without allocating a ticker. + select { + case workCh <- work: + return true + default: + } + + // Now allocate a ticker and attempt a write. + ticker := time.NewTicker(timeout) + defer ticker.Stop() + + select { + case workCh <- work: + return true + case <-ticker.C: + return false + } + } + + select { + case workCh <- work: + default: + // If the queue for the worker we were assigned to is full, + // allocate a new goroutine to do the work and then + // assign it to be a temporary additional worker for the queue. + // This allows the worker pool to accommodate "bursts" of + // traffic. Also, it reduces the need for operators to tune the size + // of the pool for a given workload. If the pool is initially + // sized too small, it will eventually grow to accommodate the + // workload, and if the workload decreases the killWorkerProbability + // will slowly shrink the pool back down to its original size because + // workers created in this manner will not spawn their replacement + // before killing themselves. + p.spawnWorker(uint64(currTime), work, workCh, false) + } + return true +} + +func (p *pooledWorkerPool) spawnWorker( + seed uint64, initialWork Work, workCh chan Work, spawnReplacement bool) { + go func() { + p.incNumRoutines() + if initialWork != nil { + initialWork() + } + + // RNG per worker to avoid synchronization. + var ( + rng = pcg.NewPCG64().Seed(seed, seed*2, seed*3, seed*4) + // killWorkerProbability is a float but but the PCG RNG only + // generates uint64s so we need to identify the uint64 number + // that corresponds to the equivalent probability assuming we're + // generating random numbers in the entire uint64 range. For example, + // if the max uint64 was 1000 and we had a killWorkerProbability of 0.15 + // then the killThreshold should be 0.15 * 1000 = 150 if we want a randomly + // chosen number between 0 and 1000 to have a 15% chance of being below + // the selected threshold. + killThreshold = uint64(p.killWorkerProbability * float64(math.MaxUint64)) + ) + for f := range workCh { + p.incNumWorkingRoutines() + f() + p.decNumWorkingRoutines() + if rng.Random() < killThreshold { + if spawnReplacement { + p.spawnWorker(rng.Random(), nil, workCh, true) + } + p.decNumRoutines() + return + } + } + }() +} + +func (p *pooledWorkerPool) emitNumRoutines() { + numRoutines := float64(p.getNumRoutines()) + p.numRoutinesGauge.Update(numRoutines) +} + +func (p *pooledWorkerPool) incNumRoutines() { + atomic.AddInt64(&p.numRoutinesAtomic, 1) +} + +func (p *pooledWorkerPool) decNumRoutines() { + atomic.AddInt64(&p.numRoutinesAtomic, -1) +} + +func (p *pooledWorkerPool) getNumRoutines() int64 { + return atomic.LoadInt64(&p.numRoutinesAtomic) +} + +func (p *pooledWorkerPool) emitNumWorkingRoutines() { + numRoutines := float64(p.getNumWorkingRoutines()) + p.numWorkingRoutinesGauge.Update(numRoutines) +} + +func (p *pooledWorkerPool) incNumWorkingRoutines() { + atomic.AddInt64(&p.numWorkingRoutinesAtomic, 1) +} + +func (p *pooledWorkerPool) decNumWorkingRoutines() { + atomic.AddInt64(&p.numWorkingRoutinesAtomic, -1) +} + +func (p *pooledWorkerPool) getNumWorkingRoutines() int64 { + return atomic.LoadInt64(&p.numWorkingRoutinesAtomic) +} diff --git a/vendor/github.com/m3db/m3/src/x/sync/types.go b/vendor/github.com/m3db/m3/src/x/sync/types.go new file mode 100644 index 00000000..6f96fc4b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sync/types.go @@ -0,0 +1,118 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package sync + +import ( + "time" + + "github.com/m3db/m3/src/x/instrument" +) + +// Work is a unit of item to be worked on. +type Work func() + +// PooledWorkerPool provides a pool for goroutines, but unlike WorkerPool, +// the actual goroutines themselves are re-used. This can be useful from a +// performance perspective in scenarios where the allocation and growth of +// the new goroutine and its stack is a bottleneck. Specifically, if the +// work function being performed has a very deep call-stack, calls to +// runtime.morestack can dominate the workload. Re-using existing goroutines +// allows the stack to be grown once, and then re-used for many invocations. +// +// In order to prevent abnormally large goroutine stacks from persisting over +// the life-cycle of an application, the PooledWorkerPool will randomly kill +// existing goroutines and spawn a new one. +// +// The PooledWorkerPool also implements sharding of its underlying worker channels +// to prevent excessive lock contention. +type PooledWorkerPool interface { + // Init initializes the pool. + Init() + + // Go assign the Work to be executed by a Goroutine. Whether or not + // it waits for an existing Goroutine to become available or not + // is determined by the GrowOnDemand() option. If GrowOnDemand is not + // set then the call to Go() will block until a goroutine is available. + // If GrowOnDemand() is set then it will expand the pool of goroutines to + // accommodate the work. The newly allocated goroutine will temporarily + // participate in the pool in an effort to amortize its allocation cost, but + // will eventually be killed. This allows the pool to dynamically respond to + // workloads without causing excessive memory pressure. The pool will grow in + // size when the workload exceeds its capacity and shrink back down to its + // original size if/when the burst subsides. + Go(work Work) + + // GoWithTimeout waits up to the given timeout for a worker to become + // available, returning true if a worker becomes available, or false + // otherwise. + GoWithTimeout(work Work, timeout time.Duration) bool +} + +// WorkerPool provides a pool for goroutines. +type WorkerPool interface { + // Init initializes the pool. + Init() + + // Go waits until the next wbyorker becomes available and executes it. + Go(work Work) + + // GoIfAvailable performs the work inside a worker if one is available and + // returns true, or false otherwise. + GoIfAvailable(work Work) bool + + // GoWithTimeout waits up to the given timeout for a worker to become + // available, returning true if a worker becomes available, or false + // otherwise. + GoWithTimeout(work Work, timeout time.Duration) bool +} + +// PooledWorkerPoolOptions is the options for a PooledWorkerPool. +type PooledWorkerPoolOptions interface { + // SetGrowOnDemand sets whether the GrowOnDemand feature is enabled. + SetGrowOnDemand(value bool) PooledWorkerPoolOptions + + // GrowOnDemand returns whether the GrowOnDemand feature is enabled. + GrowOnDemand() bool + + // SetNumShards sets the number of worker channel shards. + SetNumShards(value int64) PooledWorkerPoolOptions + + // NumShards returns the number of worker channel shards. + NumShards() int64 + + // SetKillWorkerProbability sets the probability to kill a worker. + SetKillWorkerProbability(value float64) PooledWorkerPoolOptions + + // KillWorkerProbability returns the probability to kill a worker. + KillWorkerProbability() float64 + + // SetNowFn sets the now function. + SetNowFn(value NowFn) PooledWorkerPoolOptions + + // NowFn returns the now function. + NowFn() NowFn + + // SetInstrumentOptions sets the instrument options. + SetInstrumentOptions(value instrument.Options) PooledWorkerPoolOptions + + // InstrumentOptions returns the now function. + InstrumentOptions() instrument.Options +} diff --git a/vendor/github.com/m3db/m3/src/x/sync/worker_pool.go b/vendor/github.com/m3db/m3/src/x/sync/worker_pool.go new file mode 100644 index 00000000..0e6ea6ef --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/sync/worker_pool.go @@ -0,0 +1,90 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package sync implements synchronization facililites such as worker pools. +package sync + +import ( + "time" +) + +type workerPool struct { + workCh chan struct{} +} + +// NewWorkerPool creates a new worker pool. +func NewWorkerPool(size int) WorkerPool { + return &workerPool{workCh: make(chan struct{}, size)} +} + +func (p *workerPool) Init() { + for i := 0; i < cap(p.workCh); i++ { + p.workCh <- struct{}{} + } +} + +func (p *workerPool) Go(work Work) { + token := <-p.workCh + go func() { + work() + p.workCh <- token + }() +} + +func (p *workerPool) GoIfAvailable(work Work) bool { + select { + case token := <-p.workCh: + go func() { + work() + p.workCh <- token + }() + return true + default: + return false + } +} + +func (p *workerPool) GoWithTimeout(work Work, timeout time.Duration) bool { + // Attempt to try writing without allocating a ticker. + select { + case token := <-p.workCh: + go func() { + work() + p.workCh <- token + }() + return true + default: + } + + // Now allocate a ticker and attempt a write. + ticker := time.NewTicker(timeout) + defer ticker.Stop() + + select { + case token := <-p.workCh: + go func() { + work() + p.workCh <- token + }() + return true + case <-ticker.C: + return false + } +} diff --git a/vendor/github.com/m3db/m3/src/x/time/duration.go b/vendor/github.com/m3db/m3/src/x/time/duration.go new file mode 100644 index 00000000..5fa6b3c5 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/time/duration.go @@ -0,0 +1,153 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package time + +import ( + "bytes" + "errors" + "fmt" + "strconv" + "time" +) + +var errDurationEmpty = errors.New("duration empty") + +var durationUnits = map[string]time.Duration{ + "s": time.Second, + "min": time.Minute, + "m": time.Minute, + "h": time.Hour, + "d": time.Hour * 24, + "w": time.Hour * 24 * 7, + "mon": time.Hour * 24 * 30, + "y": time.Hour * 24 * 365, + "us": time.Microsecond, + "ms": time.Millisecond, + "ns": time.Nanosecond, +} + +func isDigit(c byte) bool { return c >= '0' && c <= '9' } + +// ParseExtendedDuration parses a duration, with the ability to specify time +// units in days, weeks, months, and years. +func ParseExtendedDuration(s string) (time.Duration, error) { + if len(s) == 0 { + return 0, errDurationEmpty + } + var isNegative bool + if s[0] == '-' { + isNegative = true + s = s[1:] + } + + var d time.Duration + i := 0 + + for i < len(s) { + if !isDigit(s[i]) { + return 0, fmt.Errorf( + "could not parse duration: duration='%s', err='no value'", s) + } + + // Consume [0-9]+ + n := 0 + for i < len(s) && isDigit(s[i]) { + n *= 10 + n += int(s[i]) - int('0') + i++ + } + + // Consume [^0-9]+ and convert into a unit + if i == len(s) { + return 0, fmt.Errorf( + "could not parse duration: duration='%s', err='no unit'", s) + } + + unitStart := i + for i < len(s) && !isDigit(s[i]) { + i++ + } + + unitText := s[unitStart:i] + unit, unitExists := durationUnits[unitText] + if !unitExists { + return 0, fmt.Errorf( + "could not parse duration: duration='%s', err_unknown_unit='%s'", s, unitText) + } + + d += time.Duration(n) * unit + + } + + if isNegative { + d = -d + } + return d, nil +} + +// ToExtendedString converts a duration to an extended string. +func ToExtendedString(d time.Duration) string { + if d == 0 { + return d.String() + } + var ( + b bytes.Buffer + dUnixNanos = d.Nanoseconds() + ) + if dUnixNanos < 0 { + dUnixNanos = -dUnixNanos + b.WriteString("-") + } + for _, u := range unitsByDurationDesc { + // The unit is guaranteed to be valid so it's safe to ignore error here. + v, _ := u.Value() + valueNanos := int64(v) + if dUnixNanos < valueNanos { + continue + } + quotient := dUnixNanos / valueNanos + dUnixNanos -= quotient * valueNanos + b.WriteString(strconv.Itoa(int(quotient))) + b.WriteString(u.String()) + if dUnixNanos == 0 { + break + } + } + return b.String() +} diff --git a/vendor/github.com/m3db/m3/src/x/time/matcher.go b/vendor/github.com/m3db/m3/src/x/time/matcher.go new file mode 100644 index 00000000..4a004fb8 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/time/matcher.go @@ -0,0 +1,54 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package time + +import ( + "fmt" + "time" + + "github.com/golang/mock/gomock" +) + +// Matcher is a gomock.Matcher that matches time.Time +type Matcher interface { + gomock.Matcher +} + +// NewMatcher returns a new Matcher +func NewMatcher(t time.Time) Matcher { + return &matcher{t: t} +} + +type matcher struct { + t time.Time +} + +func (m *matcher) Matches(x interface{}) bool { + timeStruct, ok := x.(time.Time) + if !ok { + return false + } + return m.t.Equal(timeStruct) +} + +func (m *matcher) String() string { + return fmt.Sprintf("time: %s", m.t.String()) +} diff --git a/vendor/github.com/m3db/m3/src/x/time/range.go b/vendor/github.com/m3db/m3/src/x/time/range.go new file mode 100644 index 00000000..8d671891 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/time/range.go @@ -0,0 +1,161 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package time + +import ( + "fmt" + "time" +) + +// Range represents [start, end) +type Range struct { + Start time.Time + End time.Time +} + +// IsEmpty returns whether the time range is empty. +func (r Range) IsEmpty() bool { + return r.Start.Equal(r.End) +} + +// Equal returns whether two time ranges are equal. +func (r Range) Equal(other Range) bool { + return r.Start.Equal(other.Start) && r.End.Equal(other.End) +} + +// Before determines whether r is before other. +func (r Range) Before(other Range) bool { + return !r.End.After(other.Start) +} + +// After determines whether r is after other. +func (r Range) After(other Range) bool { + return other.Before(r) +} + +// Contains determines whether r contains other. +func (r Range) Contains(other Range) bool { + return !r.Start.After(other.Start) && !r.End.Before(other.End) +} + +// Overlaps determines whether r overlaps with other. +func (r Range) Overlaps(other Range) bool { + return r.End.After(other.Start) && r.Start.Before(other.End) +} + +// Duration returns the duration of the range. +func (r Range) Duration() time.Duration { + return r.End.Sub(r.Start) +} + +// Intersect calculates the intersection of the receiver range against the +// provided argument range iff there is an overlap between the two. It also +// returns a bool indicating if there was a valid intersection. +func (r Range) Intersect(other Range) (Range, bool) { + if !r.Overlaps(other) { + return Range{}, false + } + newRange := r + if newRange.Start.Before(other.Start) { + newRange.Start = other.Start + } + if newRange.End.After(other.End) { + newRange.End = other.End + } + return newRange, true +} + +// Since returns the time range since a given point in time. +func (r Range) Since(t time.Time) Range { + if t.Before(r.Start) { + return r + } + if t.After(r.End) { + return Range{} + } + return Range{Start: t, End: r.End} +} + +// Merge merges the two ranges if they overlap. Otherwise, +// the gap between them is included. +func (r Range) Merge(other Range) Range { + start := MinTime(r.Start, other.Start) + end := MaxTime(r.End, other.End) + return Range{Start: start, End: end} +} + +// Subtract removes the intersection between r and other +// from r, possibly splitting r into two smaller ranges. +func (r Range) Subtract(other Range) []Range { + if !r.Overlaps(other) { + return []Range{r} + } + if other.Contains(r) { + return nil + } + var res []Range + left := Range{r.Start, other.Start} + right := Range{other.End, r.End} + if r.Contains(other) { + if !left.IsEmpty() { + res = append(res, left) + } + if !right.IsEmpty() { + res = append(res, right) + } + return res + } + if !r.Start.After(other.Start) { + if !left.IsEmpty() { + res = append(res, left) + } + return res + } + if !right.IsEmpty() { + res = append(res, right) + } + return res +} + +// IterateForward iterates through a time range by step size in the +// forwards direction. +func (r Range) IterateForward(stepSize time.Duration, f func(t time.Time) (shouldContinue bool)) { + for t := r.Start; t.Before(r.End); t = t.Add(stepSize) { + if shouldContinue := f(t); !shouldContinue { + break + } + } +} + +// IterateBackward iterates through a time range by step size in the +// backwards direction. +func (r Range) IterateBackward(stepSize time.Duration, f func(t time.Time) (shouldContinue bool)) { + for t := r.End; t.After(r.Start); t = t.Add(-stepSize) { + if shouldContinue := f(t); !shouldContinue { + break + } + } +} + +// String returns the string representation of the range. +func (r Range) String() string { + return fmt.Sprintf("(%v,%v)", r.Start, r.End) +} diff --git a/vendor/github.com/m3db/m3/src/x/time/range_iter.go b/vendor/github.com/m3db/m3/src/x/time/range_iter.go new file mode 100644 index 00000000..546b5d0e --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/time/range_iter.go @@ -0,0 +1,59 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package time + +import "container/list" + +// RangeIter iterates over a collection of time ranges. +type RangeIter struct { + ranges *list.List + cur *list.Element + eof bool +} + +func newRangeIter(ranges *list.List) *RangeIter { + return &RangeIter{ranges: ranges} +} + +// Next moves to the next item. +func (it *RangeIter) Next() bool { + if it.ranges == nil { + return false + } + if it.eof { + return false + } + if it.cur == nil { + it.cur = it.ranges.Front() + } else { + it.cur = it.cur.Next() + } + it.eof = it.cur == nil + return !it.eof +} + +// Value returns the current time range. +func (it *RangeIter) Value() Range { + if it.cur == nil { + return Range{} + } + return it.cur.Value.(Range) +} diff --git a/vendor/github.com/m3db/m3/src/x/time/ranges.go b/vendor/github.com/m3db/m3/src/x/time/ranges.go new file mode 100644 index 00000000..f4a4f9c4 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/time/ranges.go @@ -0,0 +1,191 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package time + +import ( + "bytes" + "container/list" +) + +// Ranges is a collection of time ranges. +type Ranges interface { + AddRange(Range) + AddRanges(Ranges) + RemoveRange(Range) + RemoveRanges(Ranges) + Overlaps(Range) bool + Iter() *RangeIter + Clone() Ranges + Len() int + IsEmpty() bool + String() string +} + +type ranges struct { + sortedRanges *list.List +} + +// NewRanges constructs a new Ranges object comprising the provided ranges. +func NewRanges(in ...Range) Ranges { + res := &ranges{sortedRanges: list.New()} + for _, r := range in { + res.AddRange(r) + } + return res +} + +// Len returns the number of ranges included. +func (tr *ranges) Len() int { + return tr.sortedRanges.Len() +} + +// IsEmpty returns true if the list of time ranges is empty. +func (tr *ranges) IsEmpty() bool { + return tr.Len() == 0 +} + +// Overlaps checks if the range overlaps with any of the ranges in the collection. +func (tr *ranges) Overlaps(r Range) bool { + if r.IsEmpty() { + return false + } + e := tr.findFirstNotBefore(r) + if e == nil { + return false + } + lr := e.Value.(Range) + return lr.Overlaps(r) +} + +// AddRange adds the time range to the collection of ranges. +func (tr *ranges) AddRange(r Range) { + tr.addRangeInPlace(r) +} + +// AddRanges adds the time ranges. +func (tr *ranges) AddRanges(other Ranges) { + it := other.Iter() + for it.Next() { + tr.addRangeInPlace(it.Value()) + } +} + +// RemoveRange removes the time range from the collection of ranges. +func (tr *ranges) RemoveRange(r Range) { + tr.removeRangeInPlace(r) +} + +// RemoveRanges removes the given time ranges from the current one. +func (tr *ranges) RemoveRanges(other Ranges) { + it := other.Iter() + for it.Next() { + tr.removeRangeInPlace(it.Value()) + } +} + +// Iter returns an iterator that iterates over the time ranges included. +func (tr *ranges) Iter() *RangeIter { + return newRangeIter(tr.sortedRanges) +} + +// Clone makes a clone of the time ranges. +func (tr *ranges) Clone() Ranges { + res := &ranges{sortedRanges: list.New()} + for e := tr.sortedRanges.Front(); e != nil; e = e.Next() { + res.sortedRanges.PushBack(e.Value.(Range)) + } + return res +} + +// String returns the string representation of the range. +func (tr *ranges) String() string { + var buf bytes.Buffer + buf.WriteString("[") + for e := tr.sortedRanges.Front(); e != nil; e = e.Next() { + buf.WriteString(e.Value.(Range).String()) + if e.Next() != nil { + buf.WriteString(",") + } + } + buf.WriteString("]") + return buf.String() +} + +// addRangeInPlace adds r to tr in place without creating a new copy. +func (tr *ranges) addRangeInPlace(r Range) { + if r.IsEmpty() { + return + } + + e := tr.findFirstNotBefore(r) + for e != nil { + lr := e.Value.(Range) + ne := e.Next() + if !lr.Overlaps(r) { + break + } + r = r.Merge(lr) + tr.sortedRanges.Remove(e) + e = ne + } + if e == nil { + tr.sortedRanges.PushBack(r) + return + } + tr.sortedRanges.InsertBefore(r, e) +} + +func (tr *ranges) removeRangeInPlace(r Range) { + if r.IsEmpty() { + return + } + e := tr.findFirstNotBefore(r) + for e != nil { + lr := e.Value.(Range) + ne := e.Next() + if !lr.Overlaps(r) { + return + } + res := lr.Subtract(r) + if res == nil { + tr.sortedRanges.Remove(e) + } else { + e.Value = res[0] + if len(res) == 2 { + tr.sortedRanges.InsertAfter(res[1], e) + } + } + e = ne + } +} + +// findFirstNotBefore finds the first interval that's not before r. +func (tr *ranges) findFirstNotBefore(r Range) *list.Element { + if tr.sortedRanges == nil { + return nil + } + for e := tr.sortedRanges.Front(); e != nil; e = e.Next() { + if !e.Value.(Range).Before(r) { + return e + } + } + return nil +} diff --git a/vendor/github.com/m3db/m3/src/x/time/time.go b/vendor/github.com/m3db/m3/src/x/time/time.go new file mode 100644 index 00000000..ed99a47b --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/time/time.go @@ -0,0 +1,94 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package time implement facilities for working with time. +package time + +import "time" + +const ( + nanosPerMillis = int64(time.Millisecond) +) + +// ToNormalizedTime returns the normalized units of time given a time unit. +func ToNormalizedTime(t time.Time, u time.Duration) int64 { + return t.UnixNano() / u.Nanoseconds() +} + +// FromNormalizedTime returns the time given the normalized time units and the time unit. +func FromNormalizedTime(nt int64, u time.Duration) time.Time { + return time.Unix(0, int64(u/time.Nanosecond)*nt) +} + +// ToNormalizedDuration returns the normalized units of duration given a time unit. +func ToNormalizedDuration(d time.Duration, u time.Duration) int64 { + return int64(d / u) +} + +// FromNormalizedDuration returns the duration given the normalized time duration and a time unit. +func FromNormalizedDuration(nd int64, u time.Duration) time.Duration { + return time.Duration(nd) * u +} + +// ToNanoseconds converts a time to nanoseconds. +func ToNanoseconds(t time.Time) int64 { + return t.UnixNano() +} + +// FromNanoseconds converts nanoseconds to a time. +func FromNanoseconds(nsecs int64) time.Time { + return time.Unix(0, nsecs) +} + +// ToUnixMillis converts a time to milliseconds since Unix epoch +func ToUnixMillis(t time.Time) int64 { + return t.UnixNano() / nanosPerMillis +} + +// FromUnixMillis converts milliseconds since Unix epoch to a time +func FromUnixMillis(ms int64) time.Time { + return time.Unix(0, ms*nanosPerMillis) +} + +// Ceil returns the result of rounding t up to a multiple of d since +// the zero time. +func Ceil(t time.Time, d time.Duration) time.Time { + res := t.Truncate(d) + if res.Before(t) { + res = res.Add(d) + } + return res +} + +// MinTime returns the earlier one of t1 and t2. +func MinTime(t1, t2 time.Time) time.Time { + if t1.Before(t2) { + return t1 + } + return t2 +} + +// MaxTime returns the later one of t1 and t2. +func MaxTime(t1, t2 time.Time) time.Time { + if t1.After(t2) { + return t1 + } + return t2 +} diff --git a/vendor/github.com/m3db/m3/src/x/time/unit.go b/vendor/github.com/m3db/m3/src/x/time/unit.go new file mode 100644 index 00000000..f120def9 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/time/unit.go @@ -0,0 +1,224 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package time + +import ( + "errors" + "sort" + "time" +) + +// Different time units that are supported. +const ( + // None is a place holder for time units, it doesn't represent an actual time unit. The ordering + // here is used for comparisons betweens units and should not be changed. + None Unit = iota + Second + Millisecond + Microsecond + Nanosecond + Minute + Hour + Day + Year +) + +var ( + errUnrecognizedTimeUnit = errors.New("unrecognized time unit") + errConvertDurationToUnit = errors.New("unable to convert from duration to time unit") + errConvertUnitToDuration = errors.New("unable to convert from time unit to duration") + errNegativeDuraton = errors.New("duration cannot be negative") +) + +// Unit represents a time unit. +type Unit uint16 + +// Value is the time duration of the time unit. +func (tu Unit) Value() (time.Duration, error) { + if tu < 1 || int(tu) >= unitCount { + return 0, errUnrecognizedTimeUnit + } + return time.Duration(unitsToDuration[tu]), nil +} + +// Count returns the number of units contained within the duration. +func (tu Unit) Count(d time.Duration) (int, error) { + if d < 0 { + return 0, errNegativeDuraton + } + + if tu < 1 || int(tu) >= unitCount { + return 0, errUnrecognizedTimeUnit + } + + dur := unitsToDuration[tu] + return int(d / dur), nil +} + +// MustCount is like Count but panics if d is negative or if tu is not +// a valid Unit. +func (tu Unit) MustCount(d time.Duration) int { + c, err := tu.Count(d) + if err != nil { + panic(err) + } + + return c +} + +// IsValid returns whether the given time unit is valid / supported. +func (tu Unit) IsValid() bool { + return tu > 0 && int(tu) < unitCount +} + +// Validate will validate the time unit. +func (tu Unit) Validate() error { + if !tu.IsValid() { + return errUnrecognizedTimeUnit + } + return nil +} + +// String returns the string representation for the time unit +func (tu Unit) String() string { + if tu < 1 || int(tu) >= unitCount { + return "unknown" + } + + return unitStrings[tu] +} + +// UnitFromDuration creates a time unit from a time duration. +func UnitFromDuration(d time.Duration) (Unit, error) { + if unit, found := durationsToUnit[d]; found { + return unit, nil + } + + return None, errConvertDurationToUnit +} + +// DurationFromUnit creates a time duration from a time unit. +func DurationFromUnit(u Unit) (time.Duration, error) { + if u < 1 || int(u) >= unitCount { + return 0, errConvertUnitToDuration + } + + return unitsToDuration[u], nil +} + +// MaxUnitForDuration determines the maximum unit for which +// the input duration is a multiple of. +func MaxUnitForDuration(d time.Duration) (int64, Unit) { + var ( + currMultiple int64 + currUnit = Nanosecond + dUnixNanos = d.Nanoseconds() + isNegative bool + ) + if dUnixNanos < 0 { + dUnixNanos = -dUnixNanos + isNegative = true + } + for _, u := range unitsByDurationDesc { + // The unit is guaranteed to be valid so it's safe to ignore error here. + duration, _ := u.Value() + if dUnixNanos < duration.Nanoseconds() { + continue + } + durationUnixNanos := int64(duration) + quotient := dUnixNanos / durationUnixNanos + remainder := dUnixNanos - quotient*durationUnixNanos + if remainder != 0 { + continue + } + currMultiple = quotient + currUnit = u + break + } + if isNegative { + currMultiple = -currMultiple + } + return currMultiple, currUnit +} + +var ( + unitStrings = []string{ + "unknown", + "s", + "ms", + "us", + "ns", + "m", + "h", + "d", + "y", + } + + // Using an array here to avoid map access cost. + unitsToDuration = []time.Duration{ + None: time.Duration(0), + Second: time.Second, + Millisecond: time.Millisecond, + Microsecond: time.Microsecond, + Nanosecond: time.Nanosecond, + Minute: time.Minute, + Hour: time.Hour, + Day: time.Hour * 24, + Year: time.Hour * 24 * 365, + } + durationsToUnit = make(map[time.Duration]Unit) + + unitCount = len(unitsToDuration) + + unitsByDurationDesc []Unit +) + +// byDurationDesc sorts time units by their durations in descending order. +// The order is undefined if the units are invalid. +type byDurationDesc []Unit + +func (b byDurationDesc) Len() int { return len(b) } +func (b byDurationDesc) Swap(i, j int) { b[i], b[j] = b[j], b[i] } + +func (b byDurationDesc) Less(i, j int) bool { + vi, _ := b[i].Value() + vj, _ := b[j].Value() + return vi > vj +} + +func init() { + unitsByDurationDesc = make([]Unit, 0, unitCount) + for u, d := range unitsToDuration { + unit := Unit(u) + if unit == None { + continue + } + + durationsToUnit[d] = unit + unitsByDurationDesc = append(unitsByDurationDesc, unit) + } + sort.Sort(byDurationDesc(unitsByDurationDesc)) +} + +// UnitCount returns the total number of unit types. +func UnitCount() int { + return unitCount +} diff --git a/vendor/github.com/m3db/m3/src/x/time/unix_nano.go b/vendor/github.com/m3db/m3/src/x/time/unix_nano.go new file mode 100644 index 00000000..de3cb140 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/time/unix_nano.go @@ -0,0 +1,52 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package time + +import "time" + +// UnixNano is used to indicate that an int64 stores a unix timestamp at +// nanosecond resolution +type UnixNano int64 + +// ToTime returns a time.ToTime from a UnixNano +func (u UnixNano) ToTime() time.Time { + return time.Unix(0, int64(u)) +} + +// ToUnixNano returns a UnixNano from a time.Time +func ToUnixNano(t time.Time) UnixNano { + return UnixNano(t.UnixNano()) +} + +// Before reports whether the time instant u is before t. +func (u UnixNano) Before(t UnixNano) bool { + return u < t +} + +// After reports whether the time instant u is after t. +func (u UnixNano) After(t UnixNano) bool { + return u > t +} + +// Equal reports whether the time instant u is equal to t. +func (u UnixNano) Equal(t UnixNano) bool { + return u == t +} diff --git a/vendor/github.com/m3db/m3/src/x/unsafe/bytes.go b/vendor/github.com/m3db/m3/src/x/unsafe/bytes.go new file mode 100644 index 00000000..27eb05af --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/unsafe/bytes.go @@ -0,0 +1,83 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package unsafe contains operations that step around the type safety of Go programs. +package unsafe + +import ( + "reflect" + "unsafe" +) + +// StringFn processes a byte slice. +type StringFn func(string) + +// StringAndArgFn takes an argument alongside the byte slice. +type StringAndArgFn func(string, interface{}) + +// WithString converts a byte slice to a string with zero heap memory +// allocations, and calls a function to process the string. It is the caller's +// responsibility to make sure it holds no reference to the string after the +// function returns. +func WithString(b []byte, fn StringFn) { + // NB(r): regardless of whether the backing array is allocated on the heap + // or on the stack, it should still be valid before the byte slice goes out of scope + // so it's safe to call the function on the underlying byte slice. + fn(String(b)) +} + +// WithStringAndArg converts a byte slice to a string with zero heap memory +// allocations, and calls a function to process the string with one argument. +// It is the caller's responsibility to make sure it holds no reference to the +// string after the function returns. +func WithStringAndArg(b []byte, arg interface{}, fn StringAndArgFn) { + fn(String(b), arg) +} + +// String returns a string backed by a byte slice, it is the caller's +// responsibility not to mutate the bytes while using the string returned. It +// is much safer to use WithString and WithStringAndArg if possible, which is +// more likely to force use of the result to just a small block of code. +func String(b []byte) string { + var s string + if len(b) == 0 { + return s + } + + // NB(r): We need to declare a real string so internally the compiler + // knows to use an unsafe.Pointer to keep track of the underlying memory so that + // once the strings's array pointer is updated with the pointer to the byte slices's + // underlying bytes, the compiler won't prematurely GC the memory when the byte slice + // goes out of scope. + stringHeader := (*reflect.StringHeader)(unsafe.Pointer(&s)) + + // NB(r): This makes sure that even if GC relocates the byte slices's underlying + // memory after this assignment, the corresponding unsafe.Pointer in the internal + // string struct will be updated accordingly to reflect the memory relocation. + stringHeader.Data = (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data + + // NB(r): It is important that we access b after we assign the Data + // pointer of the byte slice header to the Data pointer of the string header to + // make sure the bytes don't get GC'ed before the assignment happens. + l := len(b) + stringHeader.Len = l + + return s +} diff --git a/vendor/github.com/m3db/m3/src/x/unsafe/rand.go b/vendor/github.com/m3db/m3/src/x/unsafe/rand.go new file mode 100644 index 00000000..03da8bf2 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/unsafe/rand.go @@ -0,0 +1,36 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package unsafe contains operations that step around the type safety of Go programs. +package unsafe + +import ( + _ "unsafe" // needed for go:linkname hack +) + +//go:linkname fastrand runtime.fastrand +func fastrand() uint32 + +// Fastrandn returns a uint32 in range of 0..n, like rand() % n, but faster not as precise, +// https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/ +func Fastrandn(n uint32) uint32 { + // This is similar to fastrand() % n, but faster. + return uint32(uint64(fastrand()) * uint64(n) >> 32) +} diff --git a/vendor/github.com/m3db/m3/src/x/unsafe/string.go b/vendor/github.com/m3db/m3/src/x/unsafe/string.go new file mode 100644 index 00000000..d9294c39 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/unsafe/string.go @@ -0,0 +1,89 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package unsafe contains operations that step around the type safety of Go programs. +package unsafe + +import ( + "reflect" + "unsafe" +) + +// ImmutableBytes represents an immutable byte slice. +type ImmutableBytes []byte + +// BytesFn processes a byte slice. +type BytesFn func(ImmutableBytes) + +// BytesAndArgFn takes an argument alongside the byte slice. +type BytesAndArgFn func(ImmutableBytes, interface{}) + +// WithBytes converts a string to a byte slice with zero heap memory allocations, +// and calls a function to process the byte slice. It is the caller's responsibility +// to make sure the callback function passed in does not modify the byte slice +// in any way, and holds no reference to the byte slice after the function returns. +func WithBytes(s string, fn BytesFn) { + // NB(xichen): Regardless of whether the backing array is allocated on the heap + // or on the stack, it should still be valid before the string goes out of scope + // so it's safe to call the function on the underlying byte slice. + fn(Bytes(s)) +} + +// WithBytesAndArg converts a string to a byte slice with zero heap memory allocations, +// and calls a function to process the byte slice alongside one argument. It is the +// caller's responsibility to make sure the callback function passed in does not modify +// the byte slice in any way, and holds no reference to the byte slice after the function +// returns. +func WithBytesAndArg(s string, arg interface{}, fn BytesAndArgFn) { + fn(Bytes(s), arg) +} + +// Bytes returns the bytes backing a string, it is the caller's responsibility +// not to mutate the bytes returned. It is much safer to use WithBytes and +// WithBytesAndArg if possible, which is more likely to force use of the result +// to just a small block of code. +func Bytes(s string) ImmutableBytes { + if len(s) == 0 { + return nil + } + + // NB(xichen): We need to declare a real byte slice so internally the compiler + // knows to use an unsafe.Pointer to keep track of the underlying memory so that + // once the slice's array pointer is updated with the pointer to the string's + // underlying bytes, the compiler won't prematurely GC the memory when the string + // goes out of scope. + var b []byte + byteHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + + // NB(xichen): This makes sure that even if GC relocates the string's underlying + // memory after this assignment, the corresponding unsafe.Pointer in the internal + // slice struct will be updated accordingly to reflect the memory relocation. + byteHeader.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data + + // NB(xichen): It is important that we access s after we assign the Data + // pointer of the string header to the Data pointer of the slice header to + // make sure the string (and the underlying bytes backing the string) don't get + // GC'ed before the assignment happens. + l := len(s) + byteHeader.Len = l + byteHeader.Cap = l + + return b +} diff --git a/vendor/github.com/m3db/m3/src/x/watch/options.go b/vendor/github.com/m3db/m3/src/x/watch/options.go new file mode 100644 index 00000000..c88525b1 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/watch/options.go @@ -0,0 +1,147 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package watch + +import ( + "time" + + "github.com/m3db/m3/src/x/instrument" +) + +const ( + defaultInitWatchTimeout = 10 * time.Second +) + +// Options provide a set of value options. +type Options interface { + // SetInstrumentOptions sets the instrument options. + SetInstrumentOptions(value instrument.Options) Options + + // InstrumentOptions returns the instrument options. + InstrumentOptions() instrument.Options + + // SetInitWatchTimeout sets the initial watch timeout. + SetInitWatchTimeout(value time.Duration) Options + + // InitWatchTimeout returns the initial watch timeout. + InitWatchTimeout() time.Duration + + // SetNewUpdatableFn sets the new updatable function. + SetNewUpdatableFn(value NewUpdatableFn) Options + + // NewUpdatableFn returns the new updatable function. + NewUpdatableFn() NewUpdatableFn + + // SetGetUpdateFn sets the get function. + SetGetUpdateFn(value GetUpdateFn) Options + + // GetUpdateFn returns the get function. + GetUpdateFn() GetUpdateFn + + // SetProcessFn sets the process function. + SetProcessFn(value ProcessFn) Options + + // ProcessFn returns the process function. + ProcessFn() ProcessFn + + // Key returns the key for the watch. + Key() string + + // SetKey sets the key for the watch. + SetKey(key string) Options +} + +type options struct { + instrumentOpts instrument.Options + initWatchTimeout time.Duration + newUpdatableFn NewUpdatableFn + getUpdateFn GetUpdateFn + processFn ProcessFn + key string +} + +// NewOptions creates a new set of options. +func NewOptions() Options { + return &options{ + instrumentOpts: instrument.NewOptions(), + initWatchTimeout: defaultInitWatchTimeout, + } +} + +func (o *options) SetInstrumentOptions(value instrument.Options) Options { + opts := *o + opts.instrumentOpts = value + return &opts +} + +func (o *options) InstrumentOptions() instrument.Options { + return o.instrumentOpts +} + +func (o *options) SetInitWatchTimeout(value time.Duration) Options { + opts := *o + opts.initWatchTimeout = value + return &opts +} + +func (o *options) InitWatchTimeout() time.Duration { + return o.initWatchTimeout +} + +func (o *options) SetNewUpdatableFn(value NewUpdatableFn) Options { + opts := *o + opts.newUpdatableFn = value + return &opts +} + +func (o *options) NewUpdatableFn() NewUpdatableFn { + return o.newUpdatableFn +} + +func (o *options) SetGetUpdateFn(value GetUpdateFn) Options { + opts := *o + opts.getUpdateFn = value + return &opts +} + +func (o *options) GetUpdateFn() GetUpdateFn { + return o.getUpdateFn +} + +func (o *options) SetProcessFn(value ProcessFn) Options { + opts := *o + opts.processFn = value + return &opts +} + +func (o *options) ProcessFn() ProcessFn { + return o.processFn +} + +func (o *options) Key() string { + return o.key +} + +func (o *options) SetKey(key string) Options { + opts := *o + opts.key = key + return &opts +} diff --git a/vendor/github.com/m3db/m3/src/x/watch/source.go b/vendor/github.com/m3db/m3/src/x/watch/source.go new file mode 100644 index 00000000..4d174e1c --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/watch/source.go @@ -0,0 +1,115 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package watch + +import ( + "errors" + "sync" + + "github.com/m3db/m3/src/x/close" + + "go.uber.org/zap" +) + +// ErrSourceClosed indicates that the Source should be closed. +var ErrSourceClosed = errors.New("source closed") + +// SourceInput provides data for Source, +type SourceInput interface { + // Poll will be called by Source for data. Any backoff/jitter logic should + // be handled here. + Poll() (interface{}, error) +} + +// Source polls data by calling SourcePollFn and notifies its watches on updates. +type Source interface { + close.SimpleCloser + + // Get returns the latest value. + Get() interface{} + + // Watch returns the value and a Watch. + Watch() (interface{}, Watch, error) +} + +// NewSource returns a new Source. +func NewSource(input SourceInput, logger *zap.Logger) Source { + s := &source{ + input: input, + w: NewWatchable(), + logger: logger, + } + + go s.run() + return s +} + +type source struct { + sync.RWMutex + + input SourceInput + w Watchable + closed bool + logger *zap.Logger +} + +func (s *source) run() { + for !s.isClosed() { + data, err := s.input.Poll() + if err == ErrSourceClosed { + s.logger.Error("watch source upstream is closed") + s.Close() + return + } + if err != nil { + s.logger.Error("watch source poll error", zap.Error(err)) + continue + } + + if err = s.w.Update(data); err != nil { + s.logger.Error("watch source update error", zap.Error(err)) + } + } +} + +func (s *source) isClosed() bool { + s.RLock() + defer s.RUnlock() + return s.closed +} + +func (s *source) Close() { + s.Lock() + defer s.Unlock() + if s.closed { + return + } + s.closed = true + s.w.Close() +} + +func (s *source) Get() interface{} { + return s.w.Get() +} + +func (s *source) Watch() (interface{}, Watch, error) { + return s.w.Watch() +} diff --git a/vendor/github.com/m3db/m3/src/x/watch/value.go b/vendor/github.com/m3db/m3/src/x/watch/value.go new file mode 100644 index 00000000..b080dc21 --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/watch/value.go @@ -0,0 +1,208 @@ +// Copyright (c) 2018 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package watch + +import ( + "errors" + "fmt" + "sync" + "time" + + "go.uber.org/zap" +) + +var ( + errInitWatchTimeout = errors.New("init watch timeout") + errNilValue = errors.New("nil kv value") +) + +// Value is a resource that can be updated during runtime. +type Value interface { + // Watch starts watching for value updates. + Watch() error + + // Unwatch stops watching for value updates. + Unwatch() +} + +// NewUpdatableFn creates an updatable. +type NewUpdatableFn func() (Updatable, error) + +// GetUpdateFn returns the latest value. +type GetUpdateFn func(updatable Updatable) (interface{}, error) + +// ProcessFn processes an update. +type ProcessFn func(update interface{}) error + +// processWithLockFn updates a value while holding a lock. +type processWithLockFn func(update interface{}) error + +type valueStatus int + +const ( + valueNotWatching valueStatus = iota + valueWatching +) + +type value struct { + sync.RWMutex + + opts Options + log *zap.Logger + newUpdatableFn NewUpdatableFn + getUpdateFn GetUpdateFn + processFn ProcessFn + processWithLockFn processWithLockFn + key string + + updatable Updatable + status valueStatus +} + +// NewValue creates a new value. +func NewValue( + opts Options, +) Value { + v := &value{ + opts: opts, + log: opts.InstrumentOptions().Logger(), + newUpdatableFn: opts.NewUpdatableFn(), + getUpdateFn: opts.GetUpdateFn(), + processFn: opts.ProcessFn(), + } + v.processWithLockFn = v.processWithLock + return v +} + +func (v *value) Watch() error { + v.Lock() + defer v.Unlock() + + if v.status == valueWatching { + return nil + } + updatable, err := v.newUpdatableFn() + if err != nil { + return CreateWatchError{ + innerError: err, + key: v.opts.Key(), + } + } + v.status = valueWatching + v.updatable = updatable + // NB(xichen): we want to start watching updates even though + // we may fail to initialize the value temporarily (e.g., during + // a network partition) so the value will be updated when the + // error condition is resolved. + defer func() { go v.watchUpdates(v.updatable) }() + + select { + case <-v.updatable.C(): + case <-time.After(v.opts.InitWatchTimeout()): + return InitValueError{ + innerError: errInitWatchTimeout, + key: v.opts.Key(), + } + } + + update, err := v.getUpdateFn(v.updatable) + if err != nil { + return InitValueError{ + innerError: err, + key: v.opts.Key(), + } + } + + if err = v.processWithLockFn(update); err != nil { + return InitValueError{ + innerError: err, + key: v.opts.Key(), + } + } + return nil +} + +func (v *value) Unwatch() { + v.Lock() + defer v.Unlock() + + // If status is nil, it means we are not watching. + if v.status == valueNotWatching { + return + } + v.updatable.Close() + v.status = valueNotWatching + v.updatable = nil +} + +func (v *value) watchUpdates(updatable Updatable) { + for range updatable.C() { + v.Lock() + // If we are not watching, or we are watching with a different + // watch because we stopped the current watch and started a new + // one, return immediately. + if v.status != valueWatching || v.updatable != updatable { + v.Unlock() + return + } + update, err := v.getUpdateFn(updatable) + if err != nil { + v.log.Error("error getting update", + zap.String("key", v.opts.Key()), + zap.Error(err)) + v.Unlock() + continue + } + if err = v.processWithLockFn(update); err != nil { + v.log.Error("error applying update", + zap.String("key", v.opts.Key()), + zap.Error(err)) + } + v.Unlock() + } +} + +func (v *value) processWithLock(update interface{}) error { + if update == nil { + return errNilValue + } + return v.processFn(update) +} + +// CreateWatchError is returned when encountering an error creating a watch. +type CreateWatchError struct { + innerError error + key string +} + +func (e CreateWatchError) Error() string { + return fmt.Sprintf("create watch error (key='%s'): %v", e.key, e.innerError) +} + +// InitValueError is returned when encountering an error when initializing a value. +type InitValueError struct { + innerError error + key string +} + +func (e InitValueError) Error() string { + return fmt.Sprintf("initializing value error (key='%s'): %v", e.key, e.innerError) +} diff --git a/vendor/github.com/m3db/m3/src/x/watch/watch.go b/vendor/github.com/m3db/m3/src/x/watch/watch.go new file mode 100644 index 00000000..42e531fc --- /dev/null +++ b/vendor/github.com/m3db/m3/src/x/watch/watch.go @@ -0,0 +1,214 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package watch provides utilities for watching resources for changes. +package watch + +import ( + "errors" + "sync" + + xclose "github.com/m3db/m3/src/x/close" +) + +var errClosed = errors.New("closed") + +type closer func() + +// Updatable can be updated. +type Updatable interface { + xclose.SimpleCloser + + // C returns the notification channel for updates. + C() <-chan struct{} +} + +// Watch watches a Watchable instance, can get notification when the Watchable updates. +type Watch interface { + Updatable + + // Get returns the latest value of the Watchable instance. + Get() interface{} +} + +// Watchable can be watched +type Watchable interface { + xclose.SimpleCloser + + // IsClosed returns true if the Watchable is closed + IsClosed() bool + // Get returns the latest value + Get() interface{} + // Watch returns the value and a Watch that will be notified on updates + Watch() (interface{}, Watch, error) + // NumWatches returns the number of watches on the Watchable + NumWatches() int + // Update sets the value and notify Watches + Update(interface{}) error +} + +// NewWatchable returns a Watchable +func NewWatchable() Watchable { + return &watchable{} +} + +type watchable struct { + sync.RWMutex + + value interface{} + active []chan struct{} + closed bool +} + +func (w *watchable) Get() interface{} { + w.RLock() + v := w.value + w.RUnlock() + return v +} + +func (w *watchable) Watch() (interface{}, Watch, error) { + w.Lock() + + if w.closed { + w.Unlock() + return nil, nil, errClosed + } + + c := make(chan struct{}, 1) + notify := w.value != nil + w.active = append(w.active, c) + w.Unlock() + + if notify { + select { + case c <- struct{}{}: + default: + } + } + + closeFn := w.closeFunc(c) + watch := &watch{o: w, c: c, closeFn: closeFn} + return w.Get(), watch, nil +} + +func (w *watchable) Update(v interface{}) error { + w.Lock() + defer w.Unlock() + + if w.closed { + return errClosed + } + + w.value = v + + for _, s := range w.active { + select { + case s <- struct{}{}: + default: + } + } + + return nil +} + +func (w *watchable) NumWatches() int { + w.RLock() + l := len(w.active) + w.RUnlock() + + return l +} + +func (w *watchable) IsClosed() bool { + w.RLock() + c := w.closed + w.RUnlock() + + return c +} + +func (w *watchable) Close() { + w.Lock() + defer w.Unlock() + + if w.closed { + return + } + + w.closed = true + + for _, ch := range w.active { + close(ch) + } + w.active = nil +} + +func (w *watchable) closeFunc(c chan struct{}) closer { + return func() { + w.Lock() + defer w.Unlock() + + if w.closed { + return + } + + close(c) + + for i := 0; i < len(w.active); i++ { + if w.active[i] == c { + w.active = append(w.active[:i], w.active[i+1:]...) + break + } + } + } +} + +type watch struct { + sync.Mutex + + o Watchable + c <-chan struct{} + closed bool + closeFn closer +} + +func (w *watch) C() <-chan struct{} { + return w.c +} + +func (w *watch) Get() interface{} { + return w.o.Get() +} + +func (w *watch) Close() { + w.Lock() + defer w.Unlock() + + if w.closed { + return + } + + w.closed = true + + if w.closeFn != nil { + w.closeFn() + } +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/AUTHORS.md b/vendor/github.com/m3db/prometheus_client_golang/AUTHORS.md new file mode 100644 index 00000000..c5275d5a --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/AUTHORS.md @@ -0,0 +1,18 @@ +The Prometheus project was started by Matt T. Proud (emeritus) and +Julius Volz in 2012. + +Maintainers of this repository: + +* Björn Rabenstein + +The following individuals have contributed code to this repository +(listed in alphabetical order): + +* Bernerd Schaefer +* Björn Rabenstein +* Daniel Bornkessel +* Jeff Younker +* Julius Volz +* Matt T. Proud +* Tobias Schmidt + diff --git a/vendor/github.com/m3db/prometheus_client_golang/LICENSE b/vendor/github.com/m3db/prometheus_client_golang/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/m3db/prometheus_client_golang/NOTICE b/vendor/github.com/m3db/prometheus_client_golang/NOTICE new file mode 100644 index 00000000..dd878a30 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/NOTICE @@ -0,0 +1,23 @@ +Prometheus instrumentation library for Go applications +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). + + +The following components are included in this product: + +perks - a fork of https://github.com/bmizerany/perks +https://github.com/beorn7/perks +Copyright 2013-2015 Blake Mizerany, Björn Rabenstein +See https://github.com/beorn7/perks/blob/master/README.md for license details. + +Go support for Protocol Buffers - Google's data interchange format +http://github.com/golang/protobuf/ +Copyright 2010 The Go Authors +See source code for license details. + +Support for streaming Protocol Buffer messages for the Go language (golang). +https://github.com/matttproud/golang_protobuf_extensions +Copyright 2013 Matt T. Proud +Licensed under the Apache License, Version 2.0 diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/.gitignore b/vendor/github.com/m3db/prometheus_client_golang/prometheus/.gitignore new file mode 100644 index 00000000..3460f034 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/.gitignore @@ -0,0 +1 @@ +command-line-arguments.test diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/README.md b/vendor/github.com/m3db/prometheus_client_golang/prometheus/README.md new file mode 100644 index 00000000..44986bff --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/README.md @@ -0,0 +1 @@ +See [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus). diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/collector.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/collector.go new file mode 100644 index 00000000..623d3d83 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/collector.go @@ -0,0 +1,75 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Collector is the interface implemented by anything that can be used by +// Prometheus to collect metrics. A Collector has to be registered for +// collection. See Registerer.Register. +// +// The stock metrics provided by this package (Gauge, Counter, Summary, +// Histogram, Untyped) are also Collectors (which only ever collect one metric, +// namely itself). An implementer of Collector may, however, collect multiple +// metrics in a coordinated fashion and/or create metrics on the fly. Examples +// for collectors already implemented in this library are the metric vectors +// (i.e. collection of multiple instances of the same Metric but with different +// label values) like GaugeVec or SummaryVec, and the ExpvarCollector. +type Collector interface { + // Describe sends the super-set of all possible descriptors of metrics + // collected by this Collector to the provided channel and returns once + // the last descriptor has been sent. The sent descriptors fulfill the + // consistency and uniqueness requirements described in the Desc + // documentation. (It is valid if one and the same Collector sends + // duplicate descriptors. Those duplicates are simply ignored. However, + // two different Collectors must not send duplicate descriptors.) This + // method idempotently sends the same descriptors throughout the + // lifetime of the Collector. If a Collector encounters an error while + // executing this method, it must send an invalid descriptor (created + // with NewInvalidDesc) to signal the error to the registry. + Describe(chan<- *Desc) + // Collect is called by the Prometheus registry when collecting + // metrics. The implementation sends each collected metric via the + // provided channel and returns once the last metric has been sent. The + // descriptor of each sent metric is one of those returned by + // Describe. Returned metrics that share the same descriptor must differ + // in their variable label values. This method may be called + // concurrently and must therefore be implemented in a concurrency safe + // way. Blocking occurs at the expense of total performance of rendering + // all registered metrics. Ideally, Collector implementations support + // concurrent readers. + Collect(chan<- Metric) +} + +// selfCollector implements Collector for a single Metric so that the Metric +// collects itself. Add it as an anonymous field to a struct that implements +// Metric, and call init with the Metric itself as an argument. +type selfCollector struct { + self Metric +} + +// init provides the selfCollector with a reference to the metric it is supposed +// to collect. It is usually called within the factory function to create a +// metric. See example. +func (c *selfCollector) init(self Metric) { + c.self = self +} + +// Describe implements Collector. +func (c *selfCollector) Describe(ch chan<- *Desc) { + ch <- c.self.Desc() +} + +// Collect implements Collector. +func (c *selfCollector) Collect(ch chan<- Metric) { + ch <- c.self +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/counter.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/counter.go new file mode 100644 index 00000000..ee37949a --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/counter.go @@ -0,0 +1,172 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" +) + +// Counter is a Metric that represents a single numerical value that only ever +// goes up. That implies that it cannot be used to count items whose number can +// also go down, e.g. the number of currently running goroutines. Those +// "counters" are represented by Gauges. +// +// A Counter is typically used to count requests served, tasks completed, errors +// occurred, etc. +// +// To create Counter instances, use NewCounter. +type Counter interface { + Metric + Collector + + // Set is used to set the Counter to an arbitrary value. It is only used + // if you have to transfer a value from an external counter into this + // Prometheus metric. Do not use it for regular handling of a + // Prometheus counter (as it can be used to break the contract of + // monotonically increasing values). + // + // Deprecated: Use NewConstMetric to create a counter for an external + // value. A Counter should never be set. + Set(float64) + // Inc increments the counter by 1. + Inc() + // Add adds the given value to the counter. It panics if the value is < + // 0. + Add(float64) +} + +// CounterOpts is an alias for Opts. See there for doc comments. +type CounterOpts Opts + +// NewCounter creates a new Counter based on the provided CounterOpts. +func NewCounter(opts CounterOpts) Counter { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ) + result := &counter{value: value{desc: desc, valType: CounterValue, labelPairs: desc.constLabelPairs}} + result.init(result) // Init self-collection. + return result +} + +type counter struct { + value +} + +func (c *counter) Add(v float64) { + if v < 0 { + panic(errors.New("counter cannot decrease in value")) + } + c.value.Add(v) +} + +// CounterVec is a Collector that bundles a set of Counters that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. number of HTTP requests, partitioned by response code and +// method). Create instances with NewCounterVec. +// +// CounterVec embeds MetricVec. See there for a full list of methods with +// detailed documentation. +type CounterVec struct { + *MetricVec +} + +// NewCounterVec creates a new CounterVec based on the provided CounterOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &CounterVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + result := &counter{value: value{ + desc: desc, + valType: CounterValue, + labelPairs: makeLabelPairs(desc, lvs), + }} + result.init(result) // Init self-collection. + return result + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Counter and not a +// Metric so that no type conversion is required. +func (m *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Counter and not a Metric so that no +// type conversion is required. +func (m *CounterVec) GetMetricWith(labels Labels) (Counter, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *CounterVec) WithLabelValues(lvs ...string) Counter { + return m.MetricVec.WithLabelValues(lvs...).(Counter) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *CounterVec) With(labels Labels) Counter { + return m.MetricVec.With(labels).(Counter) +} + +// CounterFunc is a Counter whose value is determined at collect time by calling a +// provided function. +// +// To create CounterFunc instances, use NewCounterFunc. +type CounterFunc interface { + Metric + Collector +} + +// NewCounterFunc creates a new CounterFunc based on the provided +// CounterOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a CounterFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. The function should also honor +// the contract for a Counter (values only go up, not down), but compliance will +// not be checked. +func NewCounterFunc(opts CounterOpts, function func() float64) CounterFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), CounterValue, function) +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/desc.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/desc.go new file mode 100644 index 00000000..cadbc69b --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/desc.go @@ -0,0 +1,205 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "fmt" + "regexp" + "sort" + "strings" + + "github.com/golang/protobuf/proto" + + dto "github.com/m3db/prometheus_client_model/go" +) + +var ( + metricNameRE = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_:]*$`) + labelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") +) + +// reservedLabelPrefix is a prefix which is not legal in user-supplied +// label names. +const reservedLabelPrefix = "__" + +// Labels represents a collection of label name -> value mappings. This type is +// commonly used with the With(Labels) and GetMetricWith(Labels) methods of +// metric vector Collectors, e.g.: +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +// +// The other use-case is the specification of constant label pairs in Opts or to +// create a Desc. +type Labels map[string]string + +// Desc is the descriptor used by every Prometheus Metric. It is essentially +// the immutable meta-data of a Metric. The normal Metric implementations +// included in this package manage their Desc under the hood. Users only have to +// deal with Desc if they use advanced features like the ExpvarCollector or +// custom Collectors and Metrics. +// +// Descriptors registered with the same registry have to fulfill certain +// consistency and uniqueness criteria if they share the same fully-qualified +// name: They must have the same help string and the same label names (aka label +// dimensions) in each, constLabels and variableLabels, but they must differ in +// the values of the constLabels. +// +// Descriptors that share the same fully-qualified names and the same label +// values of their constLabels are considered equal. +// +// Use NewDesc to create new Desc instances. +type Desc struct { + // fqName has been built from Namespace, Subsystem, and Name. + fqName string + // help provides some helpful information about this metric. + help string + // constLabelPairs contains precalculated DTO label pairs based on + // the constant labels. + constLabelPairs []*dto.LabelPair + // VariableLabels contains names of labels for which the metric + // maintains variable values. + variableLabels []string + // id is a hash of the values of the ConstLabels and fqName. This + // must be unique among all registered descriptors and can therefore be + // used as an identifier of the descriptor. + id uint64 + // dimHash is a hash of the label names (preset and variable) and the + // Help string. Each Desc with the same fqName must have the same + // dimHash. + dimHash uint64 + // err is an error that occured during construction. It is reported on + // registration time. + err error +} + +// NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc +// and will be reported on registration time. variableLabels and constLabels can +// be nil if no such labels should be set. fqName and help must not be empty. +// +// variableLabels only contain the label names. Their label values are variable +// and therefore not part of the Desc. (They are managed within the Metric.) +// +// For constLabels, the label values are constant. Therefore, they are fully +// specified in the Desc. See the Opts documentation for the implications of +// constant labels. +func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) *Desc { + d := &Desc{ + fqName: fqName, + help: help, + variableLabels: variableLabels, + } + if help == "" { + d.err = errors.New("empty help string") + return d + } + if !metricNameRE.MatchString(fqName) { + d.err = fmt.Errorf("%q is not a valid metric name", fqName) + return d + } + // labelValues contains the label values of const labels (in order of + // their sorted label names) plus the fqName (at position 0). + labelValues := make([]string, 1, len(constLabels)+1) + labelValues[0] = fqName + labelNames := make([]string, 0, len(constLabels)+len(variableLabels)) + labelNameSet := map[string]struct{}{} + // First add only the const label names and sort them... + for labelName := range constLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name", labelName) + return d + } + labelNames = append(labelNames, labelName) + labelNameSet[labelName] = struct{}{} + } + sort.Strings(labelNames) + // ... so that we can now add const label values in the order of their names. + for _, labelName := range labelNames { + labelValues = append(labelValues, constLabels[labelName]) + } + // Now add the variable label names, but prefix them with something that + // cannot be in a regular label name. That prevents matching the label + // dimension with a different mix between preset and variable labels. + for _, labelName := range variableLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name", labelName) + return d + } + labelNames = append(labelNames, "$"+labelName) + labelNameSet[labelName] = struct{}{} + } + if len(labelNames) != len(labelNameSet) { + d.err = errors.New("duplicate label names") + return d + } + vh := hashNew() + for _, val := range labelValues { + vh = hashAdd(vh, val) + vh = hashAddByte(vh, separatorByte) + } + d.id = vh + // Sort labelNames so that order doesn't matter for the hash. + sort.Strings(labelNames) + // Now hash together (in this order) the help string and the sorted + // label names. + lh := hashNew() + lh = hashAdd(lh, help) + lh = hashAddByte(lh, separatorByte) + for _, labelName := range labelNames { + lh = hashAdd(lh, labelName) + lh = hashAddByte(lh, separatorByte) + } + d.dimHash = lh + + d.constLabelPairs = make([]*dto.LabelPair, 0, len(constLabels)) + for n, v := range constLabels { + d.constLabelPairs = append(d.constLabelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(v), + }) + } + sort.Sort(LabelPairSorter(d.constLabelPairs)) + return d +} + +// NewInvalidDesc returns an invalid descriptor, i.e. a descriptor with the +// provided error set. If a collector returning such a descriptor is registered, +// registration will fail with the provided error. NewInvalidDesc can be used by +// a Collector to signal inability to describe itself. +func NewInvalidDesc(err error) *Desc { + return &Desc{ + err: err, + } +} + +func (d *Desc) String() string { + lpStrings := make([]string, 0, len(d.constLabelPairs)) + for _, lp := range d.constLabelPairs { + lpStrings = append( + lpStrings, + fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()), + ) + } + return fmt.Sprintf( + "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: %v}", + d.fqName, + d.help, + strings.Join(lpStrings, ","), + d.variableLabels, + ) +} + +func checkLabelName(l string) bool { + return labelNameRE.MatchString(l) && + !strings.HasPrefix(l, reservedLabelPrefix) +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/doc.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/doc.go new file mode 100644 index 00000000..b062af9e --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/doc.go @@ -0,0 +1,181 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package prometheus provides metrics primitives to instrument code for +// monitoring. It also offers a registry for metrics. Sub-packages allow to +// expose the registered metrics via HTTP (package promhttp) or push them to a +// Pushgateway (package push). +// +// All exported functions and methods are safe to be used concurrently unless +//specified otherwise. +// +// A Basic Example +// +// As a starting point, a very basic usage example: +// +// package main +// +// import ( +// "net/http" +// +// "github.com/m3db/prometheus_client_golang/prometheus" +// "github.com/m3db/prometheus_client_golang/prometheus/promhttp" +// ) +// +// var ( +// cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{ +// Name: "cpu_temperature_celsius", +// Help: "Current temperature of the CPU.", +// }) +// hdFailures = prometheus.NewCounterVec( +// prometheus.CounterOpts{ +// Name: "hd_errors_total", +// Help: "Number of hard-disk errors.", +// }, +// []string{"device"}, +// ) +// ) +// +// func init() { +// // Metrics have to be registered to be exposed: +// prometheus.MustRegister(cpuTemp) +// prometheus.MustRegister(hdFailures) +// } +// +// func main() { +// cpuTemp.Set(65.3) +// hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() +// +// // The Handler function provides a default handler to expose metrics +// // via an HTTP server. "/metrics" is the usual endpoint for that. +// http.Handle("/metrics", promhttp.Handler()) +// http.ListenAndServe(":8080", nil) +// } +// +// +// This is a complete program that exports two metrics, a Gauge and a Counter, +// the latter with a label attached to turn it into a (one-dimensional) vector. +// +// Metrics +// +// The number of exported identifiers in this package might appear a bit +// overwhelming. Hovever, in addition to the basic plumbing shown in the example +// above, you only need to understand the different metric types and their +// vector versions for basic usage. +// +// Above, you have already touched the Counter and the Gauge. There are two more +// advanced metric types: the Summary and Histogram. A more thorough description +// of those four metric types can be found in the Prometheus docs: +// https://prometheus.io/docs/concepts/metric_types/ +// +// A fifth "type" of metric is Untyped. It behaves like a Gauge, but signals the +// Prometheus server not to assume anything about its type. +// +// In addition to the fundamental metric types Gauge, Counter, Summary, +// Histogram, and Untyped, a very important part of the Prometheus data model is +// the partitioning of samples along dimensions called labels, which results in +// metric vectors. The fundamental types are GaugeVec, CounterVec, SummaryVec, +// HistogramVec, and UntypedVec. +// +// While only the fundamental metric types implement the Metric interface, both +// the metrics and their vector versions implement the Collector interface. A +// Collector manages the collection of a number of Metrics, but for convenience, +// a Metric can also “collect itself”. Note that Gauge, Counter, Summary, +// Histogram, and Untyped are interfaces themselves while GaugeVec, CounterVec, +// SummaryVec, HistogramVec, and UntypedVec are not. +// +// To create instances of Metrics and their vector versions, you need a suitable +// …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, +// HistogramOpts, or UntypedOpts. +// +// Custom Collectors and constant Metrics +// +// While you could create your own implementations of Metric, most likely you +// will only ever implement the Collector interface on your own. At a first +// glance, a custom Collector seems handy to bundle Metrics for common +// registration (with the prime example of the different metric vectors above, +// which bundle all the metrics of the same name but with different labels). +// +// There is a more involved use case, too: If you already have metrics +// available, created outside of the Prometheus context, you don't need the +// interface of the various Metric types. You essentially want to mirror the +// existing numbers into Prometheus Metrics during collection. An own +// implementation of the Collector interface is perfect for that. You can create +// Metric instances “on the fly” using NewConstMetric, NewConstHistogram, and +// NewConstSummary (and their respective Must… versions). That will happen in +// the Collect method. The Describe method has to return separate Desc +// instances, representative of the “throw-away” metrics to be created +// later. NewDesc comes in handy to create those Desc instances. +// +// The Collector example illustrates the use case. You can also look at the +// source code of the processCollector (mirroring process metrics), the +// goCollector (mirroring Go metrics), or the expvarCollector (mirroring expvar +// metrics) as examples that are used in this package itself. +// +// If you just need to call a function to get a single float value to collect as +// a metric, GaugeFunc, CounterFunc, or UntypedFunc might be interesting +// shortcuts. +// +// Advanced Uses of the Registry +// +// While MustRegister is the by far most common way of registering a Collector, +// sometimes you might want to handle the errors the registration might +// cause. As suggested by the name, MustRegister panics if an error occurs. With +// the Register function, the error is returned and can be handled. +// +// An error is returned if the registered Collector is incompatible or +// inconsistent with already registered metrics. The registry aims for +// consistency of the collected metrics according to the Prometheus data +// model. Inconsistencies are ideally detected at registration time, not at +// collect time. The former will usually be detected at start-up time of a +// program, while the latter will only happen at scrape time, possibly not even +// on the first scrape if the inconsistency only becomes relevant later. That is +// the main reason why a Collector and a Metric have to describe themselves to +// the registry. +// +// So far, everything we did operated on the so-called default registry, as it +// can be found in the global DefaultRegistry variable. With NewRegistry, you +// can create a custom registry, or you can even implement the Registerer or +// Gatherer interfaces yourself. The methods Register and Unregister work in +// the same way on a custom registry as the global functions Register and +// Unregister on the default registry. +// +// There are a number of uses for custom registries: You can use registries +// with special properties, see NewPedanticRegistry. You can avoid global state, +// as it is imposed by the DefaultRegistry. You can use multiple registries at +// the same time to expose different metrics in different ways. You can use +// separate registries for testing purposes. +// +// Also note that the DefaultRegistry comes registered with a Collector for Go +// runtime metrics (via NewGoCollector) and a Collector for process metrics (via +// NewProcessCollector). With a custom registry, you are in control and decide +// yourself about the Collectors to register. +// +// HTTP Exposition +// +// The Registry implements the Gatherer interface. The caller of the Gather +// method can then expose the gathered metrics in some way. Usually, the metrics +// are served via HTTP on the /metrics endpoint. That's happening in the example +// above. The tools to expose metrics via HTTP are in the promhttp +// sub-package. (The top-level functions in the prometheus package are +// deprecated.) +// +// Pushing to the Pushgateway +// +// Function for pushing to the Pushgateway can be found in the push sub-package. +// +// Other Means of Exposition +// +// More ways of exposing metrics can easily be added. Sending metrics to +// Graphite would be an example that will soon be implemented. +package prometheus diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/expvar_collector.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/expvar_collector.go new file mode 100644 index 00000000..18a99d5f --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/expvar_collector.go @@ -0,0 +1,119 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "encoding/json" + "expvar" +) + +type expvarCollector struct { + exports map[string]*Desc +} + +// NewExpvarCollector returns a newly allocated expvar Collector that still has +// to be registered with a Prometheus registry. +// +// An expvar Collector collects metrics from the expvar interface. It provides a +// quick way to expose numeric values that are already exported via expvar as +// Prometheus metrics. Note that the data models of expvar and Prometheus are +// fundamentally different, and that the expvar Collector is inherently slower +// than native Prometheus metrics. Thus, the expvar Collector is probably great +// for experiments and prototying, but you should seriously consider a more +// direct implementation of Prometheus metrics for monitoring production +// systems. +// +// The exports map has the following meaning: +// +// The keys in the map correspond to expvar keys, i.e. for every expvar key you +// want to export as Prometheus metric, you need an entry in the exports +// map. The descriptor mapped to each key describes how to export the expvar +// value. It defines the name and the help string of the Prometheus metric +// proxying the expvar value. The type will always be Untyped. +// +// For descriptors without variable labels, the expvar value must be a number or +// a bool. The number is then directly exported as the Prometheus sample +// value. (For a bool, 'false' translates to 0 and 'true' to 1). Expvar values +// that are not numbers or bools are silently ignored. +// +// If the descriptor has one variable label, the expvar value must be an expvar +// map. The keys in the expvar map become the various values of the one +// Prometheus label. The values in the expvar map must be numbers or bools again +// as above. +// +// For descriptors with more than one variable label, the expvar must be a +// nested expvar map, i.e. where the values of the topmost map are maps again +// etc. until a depth is reached that corresponds to the number of labels. The +// leaves of that structure must be numbers or bools as above to serve as the +// sample values. +// +// Anything that does not fit into the scheme above is silently ignored. +func NewExpvarCollector(exports map[string]*Desc) Collector { + return &expvarCollector{ + exports: exports, + } +} + +// Describe implements Collector. +func (e *expvarCollector) Describe(ch chan<- *Desc) { + for _, desc := range e.exports { + ch <- desc + } +} + +// Collect implements Collector. +func (e *expvarCollector) Collect(ch chan<- Metric) { + for name, desc := range e.exports { + var m Metric + expVar := expvar.Get(name) + if expVar == nil { + continue + } + var v interface{} + labels := make([]string, len(desc.variableLabels)) + if err := json.Unmarshal([]byte(expVar.String()), &v); err != nil { + ch <- NewInvalidMetric(desc, err) + continue + } + var processValue func(v interface{}, i int) + processValue = func(v interface{}, i int) { + if i >= len(labels) { + copiedLabels := append(make([]string, 0, len(labels)), labels...) + switch v := v.(type) { + case float64: + m = MustNewConstMetric(desc, UntypedValue, v, copiedLabels...) + case bool: + if v { + m = MustNewConstMetric(desc, UntypedValue, 1, copiedLabels...) + } else { + m = MustNewConstMetric(desc, UntypedValue, 0, copiedLabels...) + } + default: + return + } + ch <- m + return + } + vm, ok := v.(map[string]interface{}) + if !ok { + return + } + for lv, val := range vm { + labels[i] = lv + processValue(val, i+1) + } + } + processValue(v, 0) + } +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/fnv.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/fnv.go new file mode 100644 index 00000000..e3b67df8 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/fnv.go @@ -0,0 +1,29 @@ +package prometheus + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/gauge.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/gauge.go new file mode 100644 index 00000000..8b70e514 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/gauge.go @@ -0,0 +1,140 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Gauge is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// A Gauge is typically used for measured values like temperatures or current +// memory usage, but also "counts" that can go up and down, like the number of +// running goroutines. +// +// To create Gauge instances, use NewGauge. +type Gauge interface { + Metric + Collector + + // Set sets the Gauge to an arbitrary value. + Set(float64) + // Inc increments the Gauge by 1. + Inc() + // Dec decrements the Gauge by 1. + Dec() + // Add adds the given value to the Gauge. (The value can be + // negative, resulting in a decrease of the Gauge.) + Add(float64) + // Sub subtracts the given value from the Gauge. (The value can be + // negative, resulting in an increase of the Gauge.) + Sub(float64) +} + +// GaugeOpts is an alias for Opts. See there for doc comments. +type GaugeOpts Opts + +// NewGauge creates a new Gauge based on the provided GaugeOpts. +func NewGauge(opts GaugeOpts) Gauge { + return newValue(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, 0) +} + +// GaugeVec is a Collector that bundles a set of Gauges that all share the same +// Desc, but have different values for their variable labels. This is used if +// you want to count the same thing partitioned by various dimensions +// (e.g. number of operations queued, partitioned by user and operation +// type). Create instances with NewGaugeVec. +type GaugeVec struct { + *MetricVec +} + +// NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &GaugeVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newValue(desc, GaugeValue, 0, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Gauge and not a +// Metric so that no type conversion is required. +func (m *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Gauge and not a Metric so that no +// type conversion is required. +func (m *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *GaugeVec) WithLabelValues(lvs ...string) Gauge { + return m.MetricVec.WithLabelValues(lvs...).(Gauge) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *GaugeVec) With(labels Labels) Gauge { + return m.MetricVec.With(labels).(Gauge) +} + +// GaugeFunc is a Gauge whose value is determined at collect time by calling a +// provided function. +// +// To create GaugeFunc instances, use NewGaugeFunc. +type GaugeFunc interface { + Metric + Collector +} + +// NewGaugeFunc creates a new GaugeFunc based on the provided GaugeOpts. The +// value reported is determined by calling the given function from within the +// Write method. Take into account that metric collection may happen +// concurrently. If that results in concurrent calls to Write, like in the case +// where a GaugeFunc is directly registered with Prometheus, the provided +// function must be concurrency-safe. +func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, function) +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/go_collector.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/go_collector.go new file mode 100644 index 00000000..abc9d4ec --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/go_collector.go @@ -0,0 +1,263 @@ +package prometheus + +import ( + "fmt" + "runtime" + "runtime/debug" + "time" +) + +type goCollector struct { + goroutines Gauge + gcDesc *Desc + + // metrics to describe and collect + metrics memStatsMetrics +} + +// NewGoCollector returns a collector which exports metrics about the current +// go process. +func NewGoCollector() Collector { + return &goCollector{ + goroutines: NewGauge(GaugeOpts{ + Namespace: "go", + Name: "goroutines", + Help: "Number of goroutines that currently exist.", + }), + gcDesc: NewDesc( + "go_gc_duration_seconds", + "A summary of the GC invocation durations.", + nil, nil), + metrics: memStatsMetrics{ + { + desc: NewDesc( + memstatNamespace("alloc_bytes"), + "Number of bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Alloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("alloc_bytes_total"), + "Total number of bytes allocated, even if freed.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.TotalAlloc) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("sys_bytes"), + "Number of bytes obtained by system. Sum of all system allocations.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Sys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("lookups_total"), + "Total number of pointer lookups.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Lookups) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("mallocs_total"), + "Total number of mallocs.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Mallocs) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("frees_total"), + "Total number of frees.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Frees) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("heap_alloc_bytes"), + "Number of heap bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapAlloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_sys_bytes"), + "Number of heap bytes obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_idle_bytes"), + "Number of heap bytes waiting to be used.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapIdle) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_inuse_bytes"), + "Number of heap bytes that are in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_released_bytes_total"), + "Total number of heap bytes released to OS.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapReleased) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("heap_objects"), + "Number of allocated objects.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapObjects) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_inuse_bytes"), + "Number of bytes in use by the stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_sys_bytes"), + "Number of bytes obtained from system for stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_inuse_bytes"), + "Number of bytes in use by mspan structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_sys_bytes"), + "Number of bytes used for mspan structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_inuse_bytes"), + "Number of bytes in use by mcache structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_sys_bytes"), + "Number of bytes used for mcache structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("buck_hash_sys_bytes"), + "Number of bytes used by the profiling bucket hash table.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.BuckHashSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("gc_sys_bytes"), + "Number of bytes used for garbage collection system metadata.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.GCSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("other_sys_bytes"), + "Number of bytes used for other system allocations.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.OtherSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("next_gc_bytes"), + "Number of heap bytes when next garbage collection will take place.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.NextGC) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("last_gc_time_seconds"), + "Number of seconds since 1970 of last garbage collection.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.LastGC) / 1e9 }, + valType: GaugeValue, + }, + }, + } +} + +func memstatNamespace(s string) string { + return fmt.Sprintf("go_memstats_%s", s) +} + +// Describe returns all descriptions of the collector. +func (c *goCollector) Describe(ch chan<- *Desc) { + ch <- c.goroutines.Desc() + ch <- c.gcDesc + + for _, i := range c.metrics { + ch <- i.desc + } +} + +// Collect returns the current state of all metrics of the collector. +func (c *goCollector) Collect(ch chan<- Metric) { + c.goroutines.Set(float64(runtime.NumGoroutine())) + ch <- c.goroutines + + var stats debug.GCStats + stats.PauseQuantiles = make([]time.Duration, 5) + debug.ReadGCStats(&stats) + + quantiles := make(map[float64]float64) + for idx, pq := range stats.PauseQuantiles[1:] { + quantiles[float64(idx+1)/float64(len(stats.PauseQuantiles)-1)] = pq.Seconds() + } + quantiles[0.0] = stats.PauseQuantiles[0].Seconds() + ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), float64(stats.PauseTotal.Seconds()), quantiles) + + ms := &runtime.MemStats{} + runtime.ReadMemStats(ms) + for _, i := range c.metrics { + ch <- MustNewConstMetric(i.desc, i.valType, i.eval(ms)) + } +} + +// memStatsMetrics provide description, value, and value type for memstat metrics. +type memStatsMetrics []struct { + desc *Desc + eval func(*runtime.MemStats) float64 + valType ValueType +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/histogram.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/histogram.go new file mode 100644 index 00000000..31c3e707 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/histogram.go @@ -0,0 +1,444 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "math" + "sort" + "sync/atomic" + + "github.com/golang/protobuf/proto" + + dto "github.com/m3db/prometheus_client_model/go" +) + +// A Histogram counts individual observations from an event or sample stream in +// configurable buckets. Similar to a summary, it also provides a sum of +// observations and an observation count. +// +// On the Prometheus server, quantiles can be calculated from a Histogram using +// the histogram_quantile function in the query language. +// +// Note that Histograms, in contrast to Summaries, can be aggregated with the +// Prometheus query language (see the documentation for detailed +// procedures). However, Histograms require the user to pre-define suitable +// buckets, and they are in general less accurate. The Observe method of a +// Histogram has a very low performance overhead in comparison with the Observe +// method of a Summary. +// +// To create Histogram instances, use NewHistogram. +type Histogram interface { + Metric + Collector + + // Observe adds a single observation to the histogram. + Observe(float64) +} + +// bucketLabel is used for the label that defines the upper bound of a +// bucket of a histogram ("le" -> "less or equal"). +const bucketLabel = "le" + +// DefBuckets are the default Histogram buckets. The default buckets are +// tailored to broadly measure the response time (in seconds) of a network +// service. Most likely, however, you will be required to define buckets +// customized to your use case. +var ( + DefBuckets = []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10} + + errBucketLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in histograms", bucketLabel, + ) +) + +// LinearBuckets creates 'count' buckets, each 'width' wide, where the lowest +// bucket has an upper bound of 'start'. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is zero or negative. +func LinearBuckets(start, width float64, count int) []float64 { + if count < 1 { + panic("LinearBuckets needs a positive count") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start += width + } + return buckets +} + +// ExponentialBuckets creates 'count' buckets, where the lowest bucket has an +// upper bound of 'start' and each following bucket's upper bound is 'factor' +// times the previous bucket's upper bound. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is 0 or negative, if 'start' is 0 or negative, +// or if 'factor' is less than or equal 1. +func ExponentialBuckets(start, factor float64, count int) []float64 { + if count < 1 { + panic("ExponentialBuckets needs a positive count") + } + if start <= 0 { + panic("ExponentialBuckets needs a positive start value") + } + if factor <= 1 { + panic("ExponentialBuckets needs a factor greater than 1") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start *= factor + } + return buckets +} + +// HistogramOpts bundles the options for creating a Histogram metric. It is +// mandatory to set Name and Help to a non-empty string. All other fields are +// optional and can safely be left at their zero value. +type HistogramOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Histogram (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Histogram must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Histogram. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this + // Histogram. Histograms with the same fully-qualified name must have the + // same label names in their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a + // HistogramVec. ConstLabels serve only special purposes. One is for the + // special case where the value of a label does not change during the + // lifetime of a process, e.g. if the revision of the running binary is + // put into a label. Another, more advanced purpose is if more than one + // Collector needs to collect Histograms with the same fully-qualified + // name. In that case, those Summaries must differ in the values of + // their ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels + + // Buckets defines the buckets into which observations are counted. Each + // element in the slice is the upper inclusive bound of a bucket. The + // values must be sorted in strictly increasing order. There is no need + // to add a highest bucket with +Inf bound, it will be added + // implicitly. The default value is DefBuckets. + Buckets []float64 +} + +// NewHistogram creates a new Histogram based on the provided HistogramOpts. It +// panics if the buckets in HistogramOpts are not in strictly increasing order. +func NewHistogram(opts HistogramOpts) Histogram { + return newHistogram( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { + if len(desc.variableLabels) != len(labelValues) { + panic(errInconsistentCardinality) + } + + for _, n := range desc.variableLabels { + if n == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + + if len(opts.Buckets) == 0 { + opts.Buckets = DefBuckets + } + + h := &histogram{ + desc: desc, + upperBounds: opts.Buckets, + labelPairs: makeLabelPairs(desc, labelValues), + } + for i, upperBound := range h.upperBounds { + if i < len(h.upperBounds)-1 { + if upperBound >= h.upperBounds[i+1] { + panic(fmt.Errorf( + "histogram buckets must be in increasing order: %f >= %f", + upperBound, h.upperBounds[i+1], + )) + } + } else { + if math.IsInf(upperBound, +1) { + // The +Inf bucket is implicit. Remove it here. + h.upperBounds = h.upperBounds[:i] + } + } + } + // Finally we know the final length of h.upperBounds and can make counts. + h.counts = make([]uint64, len(h.upperBounds)) + + h.init(h) // Init self-collection. + return h +} + +type histogram struct { + // sumBits contains the bits of the float64 representing the sum of all + // observations. sumBits and count have to go first in the struct to + // guarantee alignment for atomic operations. + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + sumBits uint64 + count uint64 + + selfCollector + // Note that there is no mutex required. + + desc *Desc + + upperBounds []float64 + counts []uint64 + + labelPairs []*dto.LabelPair +} + +func (h *histogram) Desc() *Desc { + return h.desc +} + +func (h *histogram) Observe(v float64) { + // TODO(beorn7): For small numbers of buckets (<30), a linear search is + // slightly faster than the binary search. If we really care, we could + // switch from one search strategy to the other depending on the number + // of buckets. + // + // Microbenchmarks (BenchmarkHistogramNoLabels): + // 11 buckets: 38.3 ns/op linear - binary 48.7 ns/op + // 100 buckets: 78.1 ns/op linear - binary 54.9 ns/op + // 300 buckets: 154 ns/op linear - binary 61.6 ns/op + i := sort.SearchFloat64s(h.upperBounds, v) + if i < len(h.counts) { + atomic.AddUint64(&h.counts[i], 1) + } + atomic.AddUint64(&h.count, 1) + for { + oldBits := atomic.LoadUint64(&h.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + v) + if atomic.CompareAndSwapUint64(&h.sumBits, oldBits, newBits) { + break + } + } +} + +func (h *histogram) Write(out *dto.Metric) error { + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, len(h.upperBounds)) + + his.SampleSum = proto.Float64(math.Float64frombits(atomic.LoadUint64(&h.sumBits))) + his.SampleCount = proto.Uint64(atomic.LoadUint64(&h.count)) + var count uint64 + for i, upperBound := range h.upperBounds { + count += atomic.LoadUint64(&h.counts[i]) + buckets[i] = &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(upperBound), + } + } + his.Bucket = buckets + out.Histogram = his + out.Label = h.labelPairs + return nil +} + +// HistogramVec is a Collector that bundles a set of Histograms that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewHistogramVec. +type HistogramVec struct { + *MetricVec +} + +// NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &HistogramVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newHistogram(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Histogram and not a +// Metric so that no type conversion is required. +func (m *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Histogram, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Histogram), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Histogram and not a Metric so that no +// type conversion is required. +func (m *HistogramVec) GetMetricWith(labels Labels) (Histogram, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Histogram), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (m *HistogramVec) WithLabelValues(lvs ...string) Histogram { + return m.MetricVec.WithLabelValues(lvs...).(Histogram) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (m *HistogramVec) With(labels Labels) Histogram { + return m.MetricVec.With(labels).(Histogram) +} + +type constHistogram struct { + desc *Desc + count uint64 + sum float64 + buckets map[float64]uint64 + labelPairs []*dto.LabelPair +} + +func (h *constHistogram) Desc() *Desc { + return h.desc +} + +func (h *constHistogram) Write(out *dto.Metric) error { + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, 0, len(h.buckets)) + + his.SampleCount = proto.Uint64(h.count) + his.SampleSum = proto.Float64(h.sum) + + for upperBound, count := range h.buckets { + buckets = append(buckets, &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(upperBound), + }) + } + + if len(buckets) > 0 { + sort.Sort(buckSort(buckets)) + } + his.Bucket = buckets + + out.Histogram = his + out.Label = h.labelPairs + + return nil +} + +// NewConstHistogram returns a metric representing a Prometheus histogram with +// fixed values for the count, sum, and bucket counts. As those parameters +// cannot be changed, the returned value does not implement the Histogram +// interface (but only the Metric interface). Users of this package will not +// have much use for it in regular operations. However, when implementing custom +// Collectors, it is useful as a throw-away metric that is generated on the fly +// to send it to Prometheus in the Collect method. +// +// buckets is a map of upper bounds to cumulative counts, excluding the +Inf +// bucket. +// +// NewConstHistogram returns an error if the length of labelValues is not +// consistent with the variable labels in Desc. +func NewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constHistogram{ + desc: desc, + count: count, + sum: sum, + buckets: buckets, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstHistogram is a version of NewConstHistogram that panics where +// NewConstMetric would have returned an error. +func MustNewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) Metric { + m, err := NewConstHistogram(desc, count, sum, buckets, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type buckSort []*dto.Bucket + +func (s buckSort) Len() int { + return len(s) +} + +func (s buckSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s buckSort) Less(i, j int) bool { + return s[i].GetUpperBound() < s[j].GetUpperBound() +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/http.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/http.go new file mode 100644 index 00000000..a8e5c635 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/http.go @@ -0,0 +1,490 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "bufio" + "bytes" + "compress/gzip" + "fmt" + "io" + "net" + "net/http" + "strconv" + "strings" + "sync" + "time" + + "github.com/m3db/prometheus_common/expfmt" +) + +// TODO(beorn7): Remove this whole file. It is a partial mirror of +// promhttp/http.go (to avoid circular import chains) where everything HTTP +// related should live. The functions here are just for avoiding +// breakage. Everything is deprecated. + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an HTTP handler for the DefaultGatherer. It is +// already instrumented with InstrumentHandler (using "prometheus" as handler +// name). +// +// Deprecated: Please note the issues described in the doc comment of +// InstrumentHandler. You might want to consider using promhttp.Handler instead +// (which is non instrumented). +func Handler() http.Handler { + return InstrumentHandler("prometheus", UninstrumentedHandler()) +} + +// UninstrumentedHandler returns an HTTP handler for the DefaultGatherer. +// +// Deprecated: Use promhttp.Handler instead. See there for further documentation. +func UninstrumentedHandler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + mfs, err := DefaultGatherer.Gather() + if err != nil { + http.Error(w, "An error has occurred during metrics collection:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) + }) +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer) (io.Writer, string) { + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part := strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} + +var instLabels = []string{"method", "code"} + +type nower interface { + Now() time.Time +} + +type nowFunc func() time.Time + +func (n nowFunc) Now() time.Time { + return n() +} + +var now nower = nowFunc(func() time.Time { + return time.Now() +}) + +func nowSeries(t ...time.Time) nower { + return nowFunc(func() time.Time { + defer func() { + t = t[1:] + }() + + return t[0] + }) +} + +// InstrumentHandler wraps the given HTTP handler for instrumentation. It +// registers four metric collectors (if not already done) and reports HTTP +// metrics to the (newly or already) registered collectors: http_requests_total +// (CounterVec), http_request_duration_microseconds (Summary), +// http_request_size_bytes (Summary), http_response_size_bytes (Summary). Each +// has a constant label named "handler" with the provided handlerName as +// value. http_requests_total is a metric vector partitioned by HTTP method +// (label name "method") and HTTP status code (label name "code"). +// +// Deprecated: InstrumentHandler has several issues: +// +// - It uses Summaries rather than Histograms. Summaries are not useful if +// aggregation across multiple instances is required. +// +// - It uses microseconds as unit, which is deprecated and should be replaced by +// seconds. +// +// - The size of the request is calculated in a separate goroutine. Since this +// calculator requires access to the request header, it creates a race with +// any writes to the header performed during request handling. +// httputil.ReverseProxy is a prominent example for a handler +// performing such writes. +// +// Upcoming versions of this package will provide ways of instrumenting HTTP +// handlers that are more flexible and have fewer issues. Please prefer direct +// instrumentation in the meantime. +func InstrumentHandler(handlerName string, handler http.Handler) http.HandlerFunc { + return InstrumentHandlerFunc(handlerName, handler.ServeHTTP) +} + +// InstrumentHandlerFunc wraps the given function for instrumentation. It +// otherwise works in the same way as InstrumentHandler (and shares the same +// issues). +// +// Deprecated: InstrumentHandlerFunc is deprecated for the same reasons as +// InstrumentHandler is. +func InstrumentHandlerFunc(handlerName string, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { + return InstrumentHandlerFuncWithOpts( + SummaryOpts{ + Subsystem: "http", + ConstLabels: Labels{"handler": handlerName}, + }, + handlerFunc, + ) +} + +// InstrumentHandlerWithOpts works like InstrumentHandler (and shares the same +// issues) but provides more flexibility (at the cost of a more complex call +// syntax). As InstrumentHandler, this function registers four metric +// collectors, but it uses the provided SummaryOpts to create them. However, the +// fields "Name" and "Help" in the SummaryOpts are ignored. "Name" is replaced +// by "requests_total", "request_duration_microseconds", "request_size_bytes", +// and "response_size_bytes", respectively. "Help" is replaced by an appropriate +// help string. The names of the variable labels of the http_requests_total +// CounterVec are "method" (get, post, etc.), and "code" (HTTP status code). +// +// If InstrumentHandlerWithOpts is called as follows, it mimics exactly the +// behavior of InstrumentHandler: +// +// prometheus.InstrumentHandlerWithOpts( +// prometheus.SummaryOpts{ +// Subsystem: "http", +// ConstLabels: prometheus.Labels{"handler": handlerName}, +// }, +// handler, +// ) +// +// Technical detail: "requests_total" is a CounterVec, not a SummaryVec, so it +// cannot use SummaryOpts. Instead, a CounterOpts struct is created internally, +// and all its fields are set to the equally named fields in the provided +// SummaryOpts. +// +// Deprecated: InstrumentHandlerWithOpts is deprecated for the same reasons as +// InstrumentHandler is. +func InstrumentHandlerWithOpts(opts SummaryOpts, handler http.Handler) http.HandlerFunc { + return InstrumentHandlerFuncWithOpts(opts, handler.ServeHTTP) +} + +// InstrumentHandlerFuncWithOpts works like InstrumentHandlerFunc (and shares +// the same issues) but provides more flexibility (at the cost of a more complex +// call syntax). See InstrumentHandlerWithOpts for details how the provided +// SummaryOpts are used. +// +// Deprecated: InstrumentHandlerFuncWithOpts is deprecated for the same reasons +// as InstrumentHandler is. +func InstrumentHandlerFuncWithOpts(opts SummaryOpts, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { + reqCnt := NewCounterVec( + CounterOpts{ + Namespace: opts.Namespace, + Subsystem: opts.Subsystem, + Name: "requests_total", + Help: "Total number of HTTP requests made.", + ConstLabels: opts.ConstLabels, + }, + instLabels, + ) + + opts.Name = "request_duration_microseconds" + opts.Help = "The HTTP request latencies in microseconds." + reqDur := NewSummary(opts) + + opts.Name = "request_size_bytes" + opts.Help = "The HTTP request sizes in bytes." + reqSz := NewSummary(opts) + + opts.Name = "response_size_bytes" + opts.Help = "The HTTP response sizes in bytes." + resSz := NewSummary(opts) + + regReqCnt := MustRegisterOrGet(reqCnt).(*CounterVec) + regReqDur := MustRegisterOrGet(reqDur).(Summary) + regReqSz := MustRegisterOrGet(reqSz).(Summary) + regResSz := MustRegisterOrGet(resSz).(Summary) + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + now := time.Now() + + delegate := &responseWriterDelegator{ResponseWriter: w} + out := make(chan int) + urlLen := 0 + if r.URL != nil { + urlLen = len(r.URL.String()) + } + go computeApproximateRequestSize(r, out, urlLen) + + _, cn := w.(http.CloseNotifier) + _, fl := w.(http.Flusher) + _, hj := w.(http.Hijacker) + _, rf := w.(io.ReaderFrom) + var rw http.ResponseWriter + if cn && fl && hj && rf { + rw = &fancyResponseWriterDelegator{delegate} + } else { + rw = delegate + } + handlerFunc(rw, r) + + elapsed := float64(time.Since(now)) / float64(time.Microsecond) + + method := sanitizeMethod(r.Method) + code := sanitizeCode(delegate.status) + regReqCnt.WithLabelValues(method, code).Inc() + regReqDur.Observe(elapsed) + regResSz.Observe(float64(delegate.written)) + regReqSz.Observe(float64(<-out)) + }) +} + +func computeApproximateRequestSize(r *http.Request, out chan int, s int) { + s += len(r.Method) + s += len(r.Proto) + for name, values := range r.Header { + s += len(name) + for _, value := range values { + s += len(value) + } + } + s += len(r.Host) + + // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. + + if r.ContentLength != -1 { + s += int(r.ContentLength) + } + out <- s +} + +type responseWriterDelegator struct { + http.ResponseWriter + + handler, method string + status int + written int64 + wroteHeader bool +} + +func (r *responseWriterDelegator) WriteHeader(code int) { + r.status = code + r.wroteHeader = true + r.ResponseWriter.WriteHeader(code) +} + +func (r *responseWriterDelegator) Write(b []byte) (int, error) { + if !r.wroteHeader { + r.WriteHeader(http.StatusOK) + } + n, err := r.ResponseWriter.Write(b) + r.written += int64(n) + return n, err +} + +type fancyResponseWriterDelegator struct { + *responseWriterDelegator +} + +func (f *fancyResponseWriterDelegator) CloseNotify() <-chan bool { + return f.ResponseWriter.(http.CloseNotifier).CloseNotify() +} + +func (f *fancyResponseWriterDelegator) Flush() { + f.ResponseWriter.(http.Flusher).Flush() +} + +func (f *fancyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { + return f.ResponseWriter.(http.Hijacker).Hijack() +} + +func (f *fancyResponseWriterDelegator) ReadFrom(r io.Reader) (int64, error) { + if !f.wroteHeader { + f.WriteHeader(http.StatusOK) + } + n, err := f.ResponseWriter.(io.ReaderFrom).ReadFrom(r) + f.written += n + return n, err +} + +func sanitizeMethod(m string) string { + switch m { + case "GET", "get": + return "get" + case "PUT", "put": + return "put" + case "HEAD", "head": + return "head" + case "POST", "post": + return "post" + case "DELETE", "delete": + return "delete" + case "CONNECT", "connect": + return "connect" + case "OPTIONS", "options": + return "options" + case "NOTIFY", "notify": + return "notify" + default: + return strings.ToLower(m) + } +} + +func sanitizeCode(s int) string { + switch s { + case 100: + return "100" + case 101: + return "101" + + case 200: + return "200" + case 201: + return "201" + case 202: + return "202" + case 203: + return "203" + case 204: + return "204" + case 205: + return "205" + case 206: + return "206" + + case 300: + return "300" + case 301: + return "301" + case 302: + return "302" + case 304: + return "304" + case 305: + return "305" + case 307: + return "307" + + case 400: + return "400" + case 401: + return "401" + case 402: + return "402" + case 403: + return "403" + case 404: + return "404" + case 405: + return "405" + case 406: + return "406" + case 407: + return "407" + case 408: + return "408" + case 409: + return "409" + case 410: + return "410" + case 411: + return "411" + case 412: + return "412" + case 413: + return "413" + case 414: + return "414" + case 415: + return "415" + case 416: + return "416" + case 417: + return "417" + case 418: + return "418" + + case 500: + return "500" + case 501: + return "501" + case 502: + return "502" + case 503: + return "503" + case 504: + return "504" + case 505: + return "505" + + case 428: + return "428" + case 429: + return "429" + case 431: + return "431" + case 511: + return "511" + + default: + return strconv.Itoa(s) + } +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/metric.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/metric.go new file mode 100644 index 00000000..5ff2e6a2 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/metric.go @@ -0,0 +1,166 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "strings" + + dto "github.com/m3db/prometheus_client_model/go" +) + +const separatorByte byte = 255 + +// A Metric models a single sample value with its meta data being exported to +// Prometheus. Implementations of Metric in this package are Gauge, Counter, +// Histogram, Summary, and Untyped. +type Metric interface { + // Desc returns the descriptor for the Metric. This method idempotently + // returns the same descriptor throughout the lifetime of the + // Metric. The returned descriptor is immutable by contract. A Metric + // unable to describe itself must return an invalid descriptor (created + // with NewInvalidDesc). + Desc() *Desc + // Write encodes the Metric into a "Metric" Protocol Buffer data + // transmission object. + // + // Metric implementations must observe concurrency safety as reads of + // this metric may occur at any time, and any blocking occurs at the + // expense of total performance of rendering all registered + // metrics. Ideally, Metric implementations should support concurrent + // readers. + // + // While populating dto.Metric, it is the responsibility of the + // implementation to ensure validity of the Metric protobuf (like valid + // UTF-8 strings or syntactically valid metric and label names). It is + // recommended to sort labels lexicographically. (Implementers may find + // LabelPairSorter useful for that.) Callers of Write should still make + // sure of sorting if they depend on it. + Write(*dto.Metric) error + // TODO(beorn7): The original rationale of passing in a pre-allocated + // dto.Metric protobuf to save allocations has disappeared. The + // signature of this method should be changed to "Write() (*dto.Metric, + // error)". +} + +// Opts bundles the options for creating most Metric types. Each metric +// implementation XXX has its own XXXOpts type, but in most cases, it is just be +// an alias of this type (which might change when the requirement arises.) +// +// It is mandatory to set Name and Help to a non-empty string. All other fields +// are optional and can safely be left at their zero value. +type Opts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Metric (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the metric must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this metric. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this metric. Metrics + // with the same fully-qualified name must have the same label names in + // their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a metric + // vector collector (like CounterVec, GaugeVec, UntypedVec). ConstLabels + // serve only special purposes. One is for the special case where the + // value of a label does not change during the lifetime of a process, + // e.g. if the revision of the running binary is put into a + // label. Another, more advanced purpose is if more than one Collector + // needs to collect Metrics with the same fully-qualified name. In that + // case, those Metrics must differ in the values of their + // ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels +} + +// BuildFQName joins the given three name components by "_". Empty name +// components are ignored. If the name parameter itself is empty, an empty +// string is returned, no matter what. Metric implementations included in this +// library use this function internally to generate the fully-qualified metric +// name from the name component in their Opts. Users of the library will only +// need this function if they implement their own Metric or instantiate a Desc +// (with NewDesc) directly. +func BuildFQName(namespace, subsystem, name string) string { + if name == "" { + return "" + } + switch { + case namespace != "" && subsystem != "": + return strings.Join([]string{namespace, subsystem, name}, "_") + case namespace != "": + return strings.Join([]string{namespace, name}, "_") + case subsystem != "": + return strings.Join([]string{subsystem, name}, "_") + } + return name +} + +// LabelPairSorter implements sort.Interface. It is used to sort a slice of +// dto.LabelPair pointers. This is useful for implementing the Write method of +// custom metrics. +type LabelPairSorter []*dto.LabelPair + +func (s LabelPairSorter) Len() int { + return len(s) +} + +func (s LabelPairSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s LabelPairSorter) Less(i, j int) bool { + return s[i].GetName() < s[j].GetName() +} + +type hashSorter []uint64 + +func (s hashSorter) Len() int { + return len(s) +} + +func (s hashSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s hashSorter) Less(i, j int) bool { + return s[i] < s[j] +} + +type invalidMetric struct { + desc *Desc + err error +} + +// NewInvalidMetric returns a metric whose Write method always returns the +// provided error. It is useful if a Collector finds itself unable to collect +// a metric and wishes to report an error to the registry. +func NewInvalidMetric(desc *Desc, err error) Metric { + return &invalidMetric{desc, err} +} + +func (m *invalidMetric) Desc() *Desc { return m.desc } + +func (m *invalidMetric) Write(*dto.Metric) error { return m.err } diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/process_collector.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/process_collector.go new file mode 100644 index 00000000..5c410e21 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/process_collector.go @@ -0,0 +1,142 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import "github.com/m3db/prometheus_procfs" + +type processCollector struct { + pid int + collectFn func(chan<- Metric) + pidFn func() (int, error) + cpuTotal Counter + openFDs, maxFDs Gauge + vsize, rss Gauge + startTime Gauge +} + +// NewProcessCollector returns a collector which exports the current state of +// process metrics including cpu, memory and file descriptor usage as well as +// the process start time for the given process id under the given namespace. +func NewProcessCollector(pid int, namespace string) Collector { + return NewProcessCollectorPIDFn( + func() (int, error) { return pid, nil }, + namespace, + ) +} + +// NewProcessCollectorPIDFn returns a collector which exports the current state +// of process metrics including cpu, memory and file descriptor usage as well +// as the process start time under the given namespace. The given pidFn is +// called on each collect and is used to determine the process to export +// metrics for. +func NewProcessCollectorPIDFn( + pidFn func() (int, error), + namespace string, +) Collector { + c := processCollector{ + pidFn: pidFn, + collectFn: func(chan<- Metric) {}, + + cpuTotal: NewCounter(CounterOpts{ + Namespace: namespace, + Name: "process_cpu_seconds_total", + Help: "Total user and system CPU time spent in seconds.", + }), + openFDs: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_open_fds", + Help: "Number of open file descriptors.", + }), + maxFDs: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_max_fds", + Help: "Maximum number of open file descriptors.", + }), + vsize: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_virtual_memory_bytes", + Help: "Virtual memory size in bytes.", + }), + rss: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_resident_memory_bytes", + Help: "Resident memory size in bytes.", + }), + startTime: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_start_time_seconds", + Help: "Start time of the process since unix epoch in seconds.", + }), + } + + // Set up process metric collection if supported by the runtime. + if _, err := procfs.NewStat(); err == nil { + c.collectFn = c.processCollect + } + + return &c +} + +// Describe returns all descriptions of the collector. +func (c *processCollector) Describe(ch chan<- *Desc) { + ch <- c.cpuTotal.Desc() + ch <- c.openFDs.Desc() + ch <- c.maxFDs.Desc() + ch <- c.vsize.Desc() + ch <- c.rss.Desc() + ch <- c.startTime.Desc() +} + +// Collect returns the current state of all metrics of the collector. +func (c *processCollector) Collect(ch chan<- Metric) { + c.collectFn(ch) +} + +// TODO(ts): Bring back error reporting by reverting 7faf9e7 as soon as the +// client allows users to configure the error behavior. +func (c *processCollector) processCollect(ch chan<- Metric) { + pid, err := c.pidFn() + if err != nil { + return + } + + p, err := procfs.NewProc(pid) + if err != nil { + return + } + + if stat, err := p.NewStat(); err == nil { + c.cpuTotal.Set(stat.CPUTime()) + ch <- c.cpuTotal + c.vsize.Set(float64(stat.VirtualMemory())) + ch <- c.vsize + c.rss.Set(float64(stat.ResidentMemory())) + ch <- c.rss + + if startTime, err := stat.StartTime(); err == nil { + c.startTime.Set(startTime) + ch <- c.startTime + } + } + + if fds, err := p.FileDescriptorsLen(); err == nil { + c.openFDs.Set(float64(fds)) + ch <- c.openFDs + } + + if limits, err := p.NewLimits(); err == nil { + c.maxFDs.Set(float64(limits.OpenFiles)) + ch <- c.maxFDs + } +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/promhttp/http.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/promhttp/http.go new file mode 100644 index 00000000..45ac38a3 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/promhttp/http.go @@ -0,0 +1,201 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Copyright (c) 2013, The Prometheus 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 promhttp contains functions to create http.Handler instances to +// expose Prometheus metrics via HTTP. In later versions of this package, it +// will also contain tooling to instrument instances of http.Handler and +// http.RoundTripper. +// +// promhttp.Handler acts on the prometheus.DefaultGatherer. With HandlerFor, +// you can create a handler for a custom registry or anything that implements +// the Gatherer interface. It also allows to create handlers that act +// differently on errors or allow to log errors. +package promhttp + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "net/http" + "strings" + "sync" + + "github.com/m3db/prometheus_common/expfmt" + + "github.com/m3db/prometheus_client_golang/prometheus" +) + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an HTTP handler for the prometheus.DefaultGatherer. The +// Handler uses the default HandlerOpts, i.e. report the first error as an HTTP +// error, no error logging, and compression if requested by the client. +// +// If you want to create a Handler for the DefaultGatherer with different +// HandlerOpts, create it with HandlerFor with prometheus.DefaultGatherer and +// your desired HandlerOpts. +func Handler() http.Handler { + return HandlerFor(prometheus.DefaultGatherer, HandlerOpts{}) +} + +// HandlerFor returns an http.Handler for the provided Gatherer. The behavior +// of the Handler is defined by the provided HandlerOpts. +func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + mfs, err := reg.Gather() + if err != nil { + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error gathering metrics:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + if len(mfs) == 0 { + http.Error(w, "No metrics gathered, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics gathering:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf, opts.DisableCompression) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error encoding metric family:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + // Handled later. + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) + // TODO(beorn7): Consider streaming serving of metrics. + }) +} + +// HandlerErrorHandling defines how a Handler serving metrics will handle +// errors. +type HandlerErrorHandling int + +// These constants cause handlers serving metrics to behave as described if +// errors are encountered. +const ( + // Serve an HTTP status code 500 upon the first error + // encountered. Report the error message in the body. + HTTPErrorOnError HandlerErrorHandling = iota + // Ignore errors and try to serve as many metrics as possible. However, + // if no metrics can be served, serve an HTTP status code 500 and the + // last error message in the body. Only use this in deliberate "best + // effort" metrics collection scenarios. It is recommended to at least + // log errors (by providing an ErrorLog in HandlerOpts) to not mask + // errors completely. + ContinueOnError + // Panic upon the first error encountered (useful for "crash only" apps). + PanicOnError +) + +// Logger is the minimal interface HandlerOpts needs for logging. Note that +// log.Logger from the standard library implements this interface, and it is +// easy to implement by custom loggers, if they don't do so already anyway. +type Logger interface { + Println(v ...interface{}) +} + +// HandlerOpts specifies options how to serve metrics via an http.Handler. The +// zero value of HandlerOpts is a reasonable default. +type HandlerOpts struct { + // ErrorLog specifies an optional logger for errors collecting and + // serving metrics. If nil, errors are not logged at all. + ErrorLog Logger + // ErrorHandling defines how errors are handled. Note that errors are + // logged regardless of the configured ErrorHandling provided ErrorLog + // is not nil. + ErrorHandling HandlerErrorHandling + // If DisableCompression is true, the handler will never compress the + // response, even if requested by the client. + DisableCompression bool +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer, compressionDisabled bool) (io.Writer, string) { + if compressionDisabled { + return writer, "" + } + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part := strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/registry.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/registry.go new file mode 100644 index 00000000..0a246e5b --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/registry.go @@ -0,0 +1,806 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "bytes" + "errors" + "fmt" + "os" + "sort" + "sync" + + "github.com/golang/protobuf/proto" + + dto "github.com/m3db/prometheus_client_model/go" +) + +const ( + // Capacity for the channel to collect metrics and descriptors. + capMetricChan = 1000 + capDescChan = 10 +) + +// DefaultRegisterer and DefaultGatherer are the implementations of the +// Registerer and Gatherer interface a number of convenience functions in this +// package act on. Initially, both variables point to the same Registry, which +// has a process collector (see NewProcessCollector) and a Go collector (see +// NewGoCollector) already registered. This approach to keep default instances +// as global state mirrors the approach of other packages in the Go standard +// library. Note that there are caveats. Change the variables with caution and +// only if you understand the consequences. Users who want to avoid global state +// altogether should not use the convenience function and act on custom +// instances instead. +var ( + defaultRegistry = NewRegistry() + DefaultRegisterer Registerer = defaultRegistry + DefaultGatherer Gatherer = defaultRegistry +) + +func init() { + MustRegister(NewProcessCollector(os.Getpid(), "")) + MustRegister(NewGoCollector()) +} + +// NewRegistry creates a new vanilla Registry without any Collectors +// pre-registered. +func NewRegistry() *Registry { + return &Registry{ + collectorsByID: map[uint64]Collector{}, + descIDs: map[uint64]struct{}{}, + dimHashesByName: map[string]uint64{}, + } +} + +// NewPedanticRegistry returns a registry that checks during collection if each +// collected Metric is consistent with its reported Desc, and if the Desc has +// actually been registered with the registry. +// +// Usually, a Registry will be happy as long as the union of all collected +// Metrics is consistent and valid even if some metrics are not consistent with +// their own Desc or a Desc provided by their registered Collector. Well-behaved +// Collectors and Metrics will only provide consistent Descs. This Registry is +// useful to test the implementation of Collectors and Metrics. +func NewPedanticRegistry() *Registry { + r := NewRegistry() + r.pedanticChecksEnabled = true + return r +} + +// Registerer is the interface for the part of a registry in charge of +// registering and unregistering. Users of custom registries should use +// Registerer as type for registration purposes (rather then the Registry type +// directly). In that way, they are free to use custom Registerer implementation +// (e.g. for testing purposes). +type Registerer interface { + // Register registers a new Collector to be included in metrics + // collection. It returns an error if the descriptors provided by the + // Collector are invalid or if they — in combination with descriptors of + // already registered Collectors — do not fulfill the consistency and + // uniqueness criteria described in the documentation of metric.Desc. + // + // If the provided Collector is equal to a Collector already registered + // (which includes the case of re-registering the same Collector), the + // returned error is an instance of AlreadyRegisteredError, which + // contains the previously registered Collector. + // + // It is in general not safe to register the same Collector multiple + // times concurrently. + Register(Collector) error + // MustRegister works like Register but registers any number of + // Collectors and panics upon the first registration that causes an + // error. + MustRegister(...Collector) + // Unregister unregisters the Collector that equals the Collector passed + // in as an argument. (Two Collectors are considered equal if their + // Describe method yields the same set of descriptors.) The function + // returns whether a Collector was unregistered. + // + // Note that even after unregistering, it will not be possible to + // register a new Collector that is inconsistent with the unregistered + // Collector, e.g. a Collector collecting metrics with the same name but + // a different help string. The rationale here is that the same registry + // instance must only collect consistent metrics throughout its + // lifetime. + Unregister(Collector) bool +} + +// Gatherer is the interface for the part of a registry in charge of gathering +// the collected metrics into a number of MetricFamilies. The Gatherer interface +// comes with the same general implication as described for the Registerer +// interface. +type Gatherer interface { + // Gather calls the Collect method of the registered Collectors and then + // gathers the collected metrics into a lexicographically sorted slice + // of MetricFamily protobufs. Even if an error occurs, Gather attempts + // to gather as many metrics as possible. Hence, if a non-nil error is + // returned, the returned MetricFamily slice could be nil (in case of a + // fatal error that prevented any meaningful metric collection) or + // contain a number of MetricFamily protobufs, some of which might be + // incomplete, and some might be missing altogether. The returned error + // (which might be a MultiError) explains the details. In scenarios + // where complete collection is critical, the returned MetricFamily + // protobufs should be disregarded if the returned error is non-nil. + Gather() ([]*dto.MetricFamily, error) +} + +// Register registers the provided Collector with the DefaultRegisterer. +// +// Register is a shortcut for DefaultRegisterer.Register(c). See there for more +// details. +func Register(c Collector) error { + return DefaultRegisterer.Register(c) +} + +// MustRegister registers the provided Collectors with the DefaultRegisterer and +// panics if any error occurs. +// +// MustRegister is a shortcut for DefaultRegisterer.MustRegister(cs...). See +// there for more details. +func MustRegister(cs ...Collector) { + DefaultRegisterer.MustRegister(cs...) +} + +// RegisterOrGet registers the provided Collector with the DefaultRegisterer and +// returns the Collector, unless an equal Collector was registered before, in +// which case that Collector is returned. +// +// Deprecated: RegisterOrGet is merely a convenience function for the +// implementation as described in the documentation for +// AlreadyRegisteredError. As the use case is relatively rare, this function +// will be removed in a future version of this package to clean up the +// namespace. +func RegisterOrGet(c Collector) (Collector, error) { + if err := Register(c); err != nil { + if are, ok := err.(AlreadyRegisteredError); ok { + return are.ExistingCollector, nil + } + return nil, err + } + return c, nil +} + +// MustRegisterOrGet behaves like RegisterOrGet but panics instead of returning +// an error. +// +// Deprecated: This is deprecated for the same reason RegisterOrGet is. See +// there for details. +func MustRegisterOrGet(c Collector) Collector { + c, err := RegisterOrGet(c) + if err != nil { + panic(err) + } + return c +} + +// Unregister removes the registration of the provided Collector from the +// DefaultRegisterer. +// +// Unregister is a shortcut for DefaultRegisterer.Unregister(c). See there for +// more details. +func Unregister(c Collector) bool { + return DefaultRegisterer.Unregister(c) +} + +// GathererFunc turns a function into a Gatherer. +type GathererFunc func() ([]*dto.MetricFamily, error) + +// Gather implements Gatherer. +func (gf GathererFunc) Gather() ([]*dto.MetricFamily, error) { + return gf() +} + +// SetMetricFamilyInjectionHook replaces the DefaultGatherer with one that +// gathers from the previous DefaultGatherers but then merges the MetricFamily +// protobufs returned from the provided hook function with the MetricFamily +// protobufs returned from the original DefaultGatherer. +// +// Deprecated: This function manipulates the DefaultGatherer variable. Consider +// the implications, i.e. don't do this concurrently with any uses of the +// DefaultGatherer. In the rare cases where you need to inject MetricFamily +// protobufs directly, it is recommended to use a custom Registry and combine it +// with a custom Gatherer using the Gatherers type (see +// there). SetMetricFamilyInjectionHook only exists for compatibility reasons +// with previous versions of this package. +func SetMetricFamilyInjectionHook(hook func() []*dto.MetricFamily) { + DefaultGatherer = Gatherers{ + DefaultGatherer, + GathererFunc(func() ([]*dto.MetricFamily, error) { return hook(), nil }), + } +} + +// AlreadyRegisteredError is returned by the Register method if the Collector to +// be registered has already been registered before, or a different Collector +// that collects the same metrics has been registered before. Registration fails +// in that case, but you can detect from the kind of error what has +// happened. The error contains fields for the existing Collector and the +// (rejected) new Collector that equals the existing one. This can be used to +// find out if an equal Collector has been registered before and switch over to +// using the old one, as demonstrated in the example. +type AlreadyRegisteredError struct { + ExistingCollector, NewCollector Collector +} + +func (err AlreadyRegisteredError) Error() string { + return "duplicate metrics collector registration attempted" +} + +// MultiError is a slice of errors implementing the error interface. It is used +// by a Gatherer to report multiple errors during MetricFamily gathering. +type MultiError []error + +func (errs MultiError) Error() string { + if len(errs) == 0 { + return "" + } + buf := &bytes.Buffer{} + fmt.Fprintf(buf, "%d error(s) occurred:", len(errs)) + for _, err := range errs { + fmt.Fprintf(buf, "\n* %s", err) + } + return buf.String() +} + +// MaybeUnwrap returns nil if len(errs) is 0. It returns the first and only +// contained error as error if len(errs is 1). In all other cases, it returns +// the MultiError directly. This is helpful for returning a MultiError in a way +// that only uses the MultiError if needed. +func (errs MultiError) MaybeUnwrap() error { + switch len(errs) { + case 0: + return nil + case 1: + return errs[0] + default: + return errs + } +} + +// Registry registers Prometheus collectors, collects their metrics, and gathers +// them into MetricFamilies for exposition. It implements both Registerer and +// Gatherer. The zero value is not usable. Create instances with NewRegistry or +// NewPedanticRegistry. +type Registry struct { + mtx sync.RWMutex + collectorsByID map[uint64]Collector // ID is a hash of the descIDs. + descIDs map[uint64]struct{} + dimHashesByName map[string]uint64 + pedanticChecksEnabled bool +} + +// Register implements Registerer. +func (r *Registry) Register(c Collector) error { + var ( + descChan = make(chan *Desc, capDescChan) + newDescIDs = map[uint64]struct{}{} + newDimHashesByName = map[string]uint64{} + collectorID uint64 // Just a sum of all desc IDs. + duplicateDescErr error + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + r.mtx.Lock() + defer r.mtx.Unlock() + // Coduct various tests... + for desc := range descChan { + + // Is the descriptor valid at all? + if desc.err != nil { + return fmt.Errorf("descriptor %s is invalid: %s", desc, desc.err) + } + + // Is the descID unique? + // (In other words: Is the fqName + constLabel combination unique?) + if _, exists := r.descIDs[desc.id]; exists { + duplicateDescErr = fmt.Errorf("descriptor %s already exists with the same fully-qualified name and const label values", desc) + } + // If it is not a duplicate desc in this collector, add it to + // the collectorID. (We allow duplicate descs within the same + // collector, but their existence must be a no-op.) + if _, exists := newDescIDs[desc.id]; !exists { + newDescIDs[desc.id] = struct{}{} + collectorID += desc.id + } + + // Are all the label names and the help string consistent with + // previous descriptors of the same name? + // First check existing descriptors... + if dimHash, exists := r.dimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("a previously registered descriptor with the same fully-qualified name as %s has different label names or a different help string", desc) + } + } else { + // ...then check the new descriptors already seen. + if dimHash, exists := newDimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("descriptors reported by collector have inconsistent label names or help strings for the same fully-qualified name, offender is %s", desc) + } + } else { + newDimHashesByName[desc.fqName] = desc.dimHash + } + } + } + // Did anything happen at all? + if len(newDescIDs) == 0 { + return errors.New("collector has no descriptors") + } + if existing, exists := r.collectorsByID[collectorID]; exists { + return AlreadyRegisteredError{ + ExistingCollector: existing, + NewCollector: c, + } + } + // If the collectorID is new, but at least one of the descs existed + // before, we are in trouble. + if duplicateDescErr != nil { + return duplicateDescErr + } + + // Only after all tests have passed, actually register. + r.collectorsByID[collectorID] = c + for hash := range newDescIDs { + r.descIDs[hash] = struct{}{} + } + for name, dimHash := range newDimHashesByName { + r.dimHashesByName[name] = dimHash + } + return nil +} + +// Unregister implements Registerer. +func (r *Registry) Unregister(c Collector) bool { + var ( + descChan = make(chan *Desc, capDescChan) + descIDs = map[uint64]struct{}{} + collectorID uint64 // Just a sum of the desc IDs. + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + for desc := range descChan { + if _, exists := descIDs[desc.id]; !exists { + collectorID += desc.id + descIDs[desc.id] = struct{}{} + } + } + + r.mtx.RLock() + if _, exists := r.collectorsByID[collectorID]; !exists { + r.mtx.RUnlock() + return false + } + r.mtx.RUnlock() + + r.mtx.Lock() + defer r.mtx.Unlock() + + delete(r.collectorsByID, collectorID) + for id := range descIDs { + delete(r.descIDs, id) + } + // dimHashesByName is left untouched as those must be consistent + // throughout the lifetime of a program. + return true +} + +// MustRegister implements Registerer. +func (r *Registry) MustRegister(cs ...Collector) { + for _, c := range cs { + if err := r.Register(c); err != nil { + panic(err) + } + } +} + +// Gather implements Gatherer. +func (r *Registry) Gather() ([]*dto.MetricFamily, error) { + var ( + metricChan = make(chan Metric, capMetricChan) + metricHashes = map[uint64]struct{}{} + dimHashes = map[string]uint64{} + wg sync.WaitGroup + errs MultiError // The collected errors to return in the end. + registeredDescIDs map[uint64]struct{} // Only used for pedantic checks + ) + + r.mtx.RLock() + metricFamiliesByName := make(map[string]*dto.MetricFamily, len(r.dimHashesByName)) + + // Scatter. + // (Collectors could be complex and slow, so we call them all at once.) + wg.Add(len(r.collectorsByID)) + go func() { + wg.Wait() + close(metricChan) + }() + for _, collector := range r.collectorsByID { + go func(collector Collector) { + defer wg.Done() + collector.Collect(metricChan) + }(collector) + } + + // In case pedantic checks are enabled, we have to copy the map before + // giving up the RLock. + if r.pedanticChecksEnabled { + registeredDescIDs = make(map[uint64]struct{}, len(r.descIDs)) + for id := range r.descIDs { + registeredDescIDs[id] = struct{}{} + } + } + + r.mtx.RUnlock() + + // Drain metricChan in case of premature return. + defer func() { + for _ = range metricChan { + } + }() + + // Gather. + for metric := range metricChan { + // This could be done concurrently, too, but it required locking + // of metricFamiliesByName (and of metricHashes if checks are + // enabled). Most likely not worth it. + desc := metric.Desc() + dtoMetric := &dto.Metric{} + if err := metric.Write(dtoMetric); err != nil { + errs = append(errs, fmt.Errorf( + "error collecting metric %v: %s", desc, err, + )) + continue + } + metricFamily, ok := metricFamiliesByName[desc.fqName] + if ok { + if metricFamily.GetHelp() != desc.help { + errs = append(errs, fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + desc.fqName, dtoMetric, desc.help, metricFamily.GetHelp(), + )) + continue + } + // TODO(beorn7): Simplify switch once Desc has type. + switch metricFamily.GetType() { + case dto.MetricType_COUNTER: + if dtoMetric.Counter == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Counter", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_GAUGE: + if dtoMetric.Gauge == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Gauge", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_SUMMARY: + if dtoMetric.Summary == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Summary", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_UNTYPED: + if dtoMetric.Untyped == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be Untyped", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_HISTOGRAM: + if dtoMetric.Histogram == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Histogram", + desc.fqName, dtoMetric, + )) + continue + } + default: + panic("encountered MetricFamily with invalid type") + } + } else { + metricFamily = &dto.MetricFamily{} + metricFamily.Name = proto.String(desc.fqName) + metricFamily.Help = proto.String(desc.help) + // TODO(beorn7): Simplify switch once Desc has type. + switch { + case dtoMetric.Gauge != nil: + metricFamily.Type = dto.MetricType_GAUGE.Enum() + case dtoMetric.Counter != nil: + metricFamily.Type = dto.MetricType_COUNTER.Enum() + case dtoMetric.Summary != nil: + metricFamily.Type = dto.MetricType_SUMMARY.Enum() + case dtoMetric.Untyped != nil: + metricFamily.Type = dto.MetricType_UNTYPED.Enum() + case dtoMetric.Histogram != nil: + metricFamily.Type = dto.MetricType_HISTOGRAM.Enum() + default: + errs = append(errs, fmt.Errorf( + "empty metric collected: %s", dtoMetric, + )) + continue + } + metricFamiliesByName[desc.fqName] = metricFamily + } + if err := checkMetricConsistency(metricFamily, dtoMetric, metricHashes, dimHashes); err != nil { + errs = append(errs, err) + continue + } + if r.pedanticChecksEnabled { + // Is the desc registered at all? + if _, exist := registeredDescIDs[desc.id]; !exist { + errs = append(errs, fmt.Errorf( + "collected metric %s %s with unregistered descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + )) + continue + } + if err := checkDescConsistency(metricFamily, dtoMetric, desc); err != nil { + errs = append(errs, err) + continue + } + } + metricFamily.Metric = append(metricFamily.Metric, dtoMetric) + } + return normalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// Gatherers is a slice of Gatherer instances that implements the Gatherer +// interface itself. Its Gather method calls Gather on all Gatherers in the +// slice in order and returns the merged results. Errors returned from the +// Gather calles are all returned in a flattened MultiError. Duplicate and +// inconsistent Metrics are skipped (first occurrence in slice order wins) and +// reported in the returned error. +// +// Gatherers can be used to merge the Gather results from multiple +// Registries. It also provides a way to directly inject existing MetricFamily +// protobufs into the gathering by creating a custom Gatherer with a Gather +// method that simply returns the existing MetricFamily protobufs. Note that no +// registration is involved (in contrast to Collector registration), so +// obviously registration-time checks cannot happen. Any inconsistencies between +// the gathered MetricFamilies are reported as errors by the Gather method, and +// inconsistent Metrics are dropped. Invalid parts of the MetricFamilies +// (e.g. syntactically invalid metric or label names) will go undetected. +type Gatherers []Gatherer + +// Gather implements Gatherer. +func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { + var ( + metricFamiliesByName = map[string]*dto.MetricFamily{} + metricHashes = map[uint64]struct{}{} + dimHashes = map[string]uint64{} + errs MultiError // The collected errors to return in the end. + ) + + for i, g := range gs { + mfs, err := g.Gather() + if err != nil { + if multiErr, ok := err.(MultiError); ok { + for _, err := range multiErr { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } else { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } + for _, mf := range mfs { + existingMF, exists := metricFamiliesByName[mf.GetName()] + if exists { + if existingMF.GetHelp() != mf.GetHelp() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has help %q but should have %q", + mf.GetName(), mf.GetHelp(), existingMF.GetHelp(), + )) + continue + } + if existingMF.GetType() != mf.GetType() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has type %s but should have %s", + mf.GetName(), mf.GetType(), existingMF.GetType(), + )) + continue + } + } else { + existingMF = &dto.MetricFamily{} + existingMF.Name = mf.Name + existingMF.Help = mf.Help + existingMF.Type = mf.Type + metricFamiliesByName[mf.GetName()] = existingMF + } + for _, m := range mf.Metric { + if err := checkMetricConsistency(existingMF, m, metricHashes, dimHashes); err != nil { + errs = append(errs, err) + continue + } + existingMF.Metric = append(existingMF.Metric, m) + } + } + } + return normalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// metricSorter is a sortable slice of *dto.Metric. +type metricSorter []*dto.Metric + +func (s metricSorter) Len() int { + return len(s) +} + +func (s metricSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s metricSorter) Less(i, j int) bool { + if len(s[i].Label) != len(s[j].Label) { + // This should not happen. The metrics are + // inconsistent. However, we have to deal with the fact, as + // people might use custom collectors or metric family injection + // to create inconsistent metrics. So let's simply compare the + // number of labels in this case. That will still yield + // reproducible sorting. + return len(s[i].Label) < len(s[j].Label) + } + for n, lp := range s[i].Label { + vi := lp.GetValue() + vj := s[j].Label[n].GetValue() + if vi != vj { + return vi < vj + } + } + + // We should never arrive here. Multiple metrics with the same + // label set in the same scrape will lead to undefined ingestion + // behavior. However, as above, we have to provide stable sorting + // here, even for inconsistent metrics. So sort equal metrics + // by their timestamp, with missing timestamps (implying "now") + // coming last. + if s[i].TimestampMs == nil { + return false + } + if s[j].TimestampMs == nil { + return true + } + return s[i].GetTimestampMs() < s[j].GetTimestampMs() +} + +// normalizeMetricFamilies returns a MetricFamily slice whith empty +// MetricFamilies pruned and the remaining MetricFamilies sorted by name within +// the slice, with the contained Metrics sorted within each MetricFamily. +func normalizeMetricFamilies(metricFamiliesByName map[string]*dto.MetricFamily) []*dto.MetricFamily { + for _, mf := range metricFamiliesByName { + sort.Sort(metricSorter(mf.Metric)) + } + names := make([]string, 0, len(metricFamiliesByName)) + for name, mf := range metricFamiliesByName { + if len(mf.Metric) > 0 { + names = append(names, name) + } + } + sort.Strings(names) + result := make([]*dto.MetricFamily, 0, len(names)) + for _, name := range names { + result = append(result, metricFamiliesByName[name]) + } + return result +} + +// checkMetricConsistency checks if the provided Metric is consistent with the +// provided MetricFamily. It also hashed the Metric labels and the MetricFamily +// name. If the resulting hash is alread in the provided metricHashes, an error +// is returned. If not, it is added to metricHashes. The provided dimHashes maps +// MetricFamily names to their dimHash (hashed sorted label names). If dimHashes +// doesn't yet contain a hash for the provided MetricFamily, it is +// added. Otherwise, an error is returned if the existing dimHashes in not equal +// the calculated dimHash. +func checkMetricConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + metricHashes map[uint64]struct{}, + dimHashes map[string]uint64, +) error { + // Type consistency with metric family. + if metricFamily.GetType() == dto.MetricType_GAUGE && dtoMetric.Gauge == nil || + metricFamily.GetType() == dto.MetricType_COUNTER && dtoMetric.Counter == nil || + metricFamily.GetType() == dto.MetricType_SUMMARY && dtoMetric.Summary == nil || + metricFamily.GetType() == dto.MetricType_HISTOGRAM && dtoMetric.Histogram == nil || + metricFamily.GetType() == dto.MetricType_UNTYPED && dtoMetric.Untyped == nil { + return fmt.Errorf( + "collected metric %s %s is not a %s", + metricFamily.GetName(), dtoMetric, metricFamily.GetType(), + ) + } + + // Is the metric unique (i.e. no other metric with the same name and the same label values)? + h := hashNew() + h = hashAdd(h, metricFamily.GetName()) + h = hashAddByte(h, separatorByte) + dh := hashNew() + // Make sure label pairs are sorted. We depend on it for the consistency + // check. + sort.Sort(LabelPairSorter(dtoMetric.Label)) + for _, lp := range dtoMetric.Label { + h = hashAdd(h, lp.GetValue()) + h = hashAddByte(h, separatorByte) + dh = hashAdd(dh, lp.GetName()) + dh = hashAddByte(dh, separatorByte) + } + if _, exists := metricHashes[h]; exists { + return fmt.Errorf( + "collected metric %s %s was collected before with the same name and label values", + metricFamily.GetName(), dtoMetric, + ) + } + if dimHash, ok := dimHashes[metricFamily.GetName()]; ok { + if dimHash != dh { + return fmt.Errorf( + "collected metric %s %s has label dimensions inconsistent with previously collected metrics in the same metric family", + metricFamily.GetName(), dtoMetric, + ) + } + } else { + dimHashes[metricFamily.GetName()] = dh + } + metricHashes[h] = struct{}{} + return nil +} + +func checkDescConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + desc *Desc, +) error { + // Desc help consistency with metric family help. + if metricFamily.GetHelp() != desc.help { + return fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + metricFamily.GetName(), dtoMetric, metricFamily.GetHelp(), desc.help, + ) + } + + // Is the desc consistent with the content of the metric? + lpsFromDesc := make([]*dto.LabelPair, 0, len(dtoMetric.Label)) + lpsFromDesc = append(lpsFromDesc, desc.constLabelPairs...) + for _, l := range desc.variableLabels { + lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ + Name: proto.String(l), + }) + } + if len(lpsFromDesc) != len(dtoMetric.Label) { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + sort.Sort(LabelPairSorter(lpsFromDesc)) + for i, lpFromDesc := range lpsFromDesc { + lpFromMetric := dtoMetric.Label[i] + if lpFromDesc.GetName() != lpFromMetric.GetName() || + lpFromDesc.Value != nil && lpFromDesc.GetValue() != lpFromMetric.GetValue() { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + } + return nil +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/summary.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/summary.go new file mode 100644 index 00000000..da2a7a8f --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/summary.go @@ -0,0 +1,534 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "math" + "sort" + "sync" + "time" + + "github.com/beorn7/perks/quantile" + "github.com/golang/protobuf/proto" + + dto "github.com/m3db/prometheus_client_model/go" +) + +// quantileLabel is used for the label that defines the quantile in a +// summary. +const quantileLabel = "quantile" + +// A Summary captures individual observations from an event or sample stream and +// summarizes them in a manner similar to traditional summary statistics: 1. sum +// of observations, 2. observation count, 3. rank estimations. +// +// A typical use-case is the observation of request latencies. By default, a +// Summary provides the median, the 90th and the 99th percentile of the latency +// as rank estimations. +// +// Note that the rank estimations cannot be aggregated in a meaningful way with +// the Prometheus query language (i.e. you cannot average or add them). If you +// need aggregatable quantiles (e.g. you want the 99th percentile latency of all +// queries served across all instances of a service), consider the Histogram +// metric type. See the Prometheus documentation for more details. +// +// To create Summary instances, use NewSummary. +type Summary interface { + Metric + Collector + + // Observe adds a single observation to the summary. + Observe(float64) +} + +// DefObjectives are the default Summary quantile values. +var ( + DefObjectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} + + errQuantileLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in summaries", quantileLabel, + ) +) + +// Default values for SummaryOpts. +const ( + // DefMaxAge is the default duration for which observations stay + // relevant. + DefMaxAge time.Duration = 10 * time.Minute + // DefAgeBuckets is the default number of buckets used to calculate the + // age of observations. + DefAgeBuckets = 5 + // DefBufCap is the standard buffer size for collecting Summary observations. + DefBufCap = 500 +) + +// SummaryOpts bundles the options for creating a Summary metric. It is +// mandatory to set Name and Help to a non-empty string. All other fields are +// optional and can safely be left at their zero value. +type SummaryOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Summary (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Summary must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Summary. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this + // Summary. Summaries with the same fully-qualified name must have the + // same label names in their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a + // SummaryVec. ConstLabels serve only special purposes. One is for the + // special case where the value of a label does not change during the + // lifetime of a process, e.g. if the revision of the running binary is + // put into a label. Another, more advanced purpose is if more than one + // Collector needs to collect Summaries with the same fully-qualified + // name. In that case, those Summaries must differ in the values of + // their ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels + + // Objectives defines the quantile rank estimates with their respective + // absolute error. If Objectives[q] = e, then the value reported + // for q will be the φ-quantile value for some φ between q-e and q+e. + // The default value is DefObjectives. + Objectives map[float64]float64 + + // MaxAge defines the duration for which an observation stays relevant + // for the summary. Must be positive. The default value is DefMaxAge. + MaxAge time.Duration + + // AgeBuckets is the number of buckets used to exclude observations that + // are older than MaxAge from the summary. A higher number has a + // resource penalty, so only increase it if the higher resolution is + // really required. For very high observation rates, you might want to + // reduce the number of age buckets. With only one age bucket, you will + // effectively see a complete reset of the summary each time MaxAge has + // passed. The default value is DefAgeBuckets. + AgeBuckets uint32 + + // BufCap defines the default sample stream buffer size. The default + // value of DefBufCap should suffice for most uses. If there is a need + // to increase the value, a multiple of 500 is recommended (because that + // is the internal buffer size of the underlying package + // "github.com/bmizerany/perks/quantile"). + BufCap uint32 +} + +// Great fuck-up with the sliding-window decay algorithm... The Merge method of +// perk/quantile is actually not working as advertised - and it might be +// unfixable, as the underlying algorithm is apparently not capable of merging +// summaries in the first place. To avoid using Merge, we are currently adding +// observations to _each_ age bucket, i.e. the effort to add a sample is +// essentially multiplied by the number of age buckets. When rotating age +// buckets, we empty the previous head stream. On scrape time, we simply take +// the quantiles from the head stream (no merging required). Result: More effort +// on observation time, less effort on scrape time, which is exactly the +// opposite of what we try to accomplish, but at least the results are correct. +// +// The quite elegant previous contraption to merge the age buckets efficiently +// on scrape time (see code up commit 6b9530d72ea715f0ba612c0120e6e09fbf1d49d0) +// can't be used anymore. + +// NewSummary creates a new Summary based on the provided SummaryOpts. +func NewSummary(opts SummaryOpts) Summary { + return newSummary( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { + if len(desc.variableLabels) != len(labelValues) { + panic(errInconsistentCardinality) + } + + for _, n := range desc.variableLabels { + if n == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + + if len(opts.Objectives) == 0 { + opts.Objectives = DefObjectives + } + + if opts.MaxAge < 0 { + panic(fmt.Errorf("illegal max age MaxAge=%v", opts.MaxAge)) + } + if opts.MaxAge == 0 { + opts.MaxAge = DefMaxAge + } + + if opts.AgeBuckets == 0 { + opts.AgeBuckets = DefAgeBuckets + } + + if opts.BufCap == 0 { + opts.BufCap = DefBufCap + } + + s := &summary{ + desc: desc, + + objectives: opts.Objectives, + sortedObjectives: make([]float64, 0, len(opts.Objectives)), + + labelPairs: makeLabelPairs(desc, labelValues), + + hotBuf: make([]float64, 0, opts.BufCap), + coldBuf: make([]float64, 0, opts.BufCap), + streamDuration: opts.MaxAge / time.Duration(opts.AgeBuckets), + } + s.headStreamExpTime = time.Now().Add(s.streamDuration) + s.hotBufExpTime = s.headStreamExpTime + + for i := uint32(0); i < opts.AgeBuckets; i++ { + s.streams = append(s.streams, s.newStream()) + } + s.headStream = s.streams[0] + + for qu := range s.objectives { + s.sortedObjectives = append(s.sortedObjectives, qu) + } + sort.Float64s(s.sortedObjectives) + + s.init(s) // Init self-collection. + return s +} + +type summary struct { + selfCollector + + bufMtx sync.Mutex // Protects hotBuf and hotBufExpTime. + mtx sync.Mutex // Protects every other moving part. + // Lock bufMtx before mtx if both are needed. + + desc *Desc + + objectives map[float64]float64 + sortedObjectives []float64 + + labelPairs []*dto.LabelPair + + sum float64 + cnt uint64 + + hotBuf, coldBuf []float64 + + streams []*quantile.Stream + streamDuration time.Duration + headStream *quantile.Stream + headStreamIdx int + headStreamExpTime, hotBufExpTime time.Time +} + +func (s *summary) Desc() *Desc { + return s.desc +} + +func (s *summary) Observe(v float64) { + s.bufMtx.Lock() + defer s.bufMtx.Unlock() + + now := time.Now() + if now.After(s.hotBufExpTime) { + s.asyncFlush(now) + } + s.hotBuf = append(s.hotBuf, v) + if len(s.hotBuf) == cap(s.hotBuf) { + s.asyncFlush(now) + } +} + +func (s *summary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.objectives)) + + s.bufMtx.Lock() + s.mtx.Lock() + // Swap bufs even if hotBuf is empty to set new hotBufExpTime. + s.swapBufs(time.Now()) + s.bufMtx.Unlock() + + s.flushColdBuf() + sum.SampleCount = proto.Uint64(s.cnt) + sum.SampleSum = proto.Float64(s.sum) + + for _, rank := range s.sortedObjectives { + var q float64 + if s.headStream.Count() == 0 { + q = math.NaN() + } else { + q = s.headStream.Query(rank) + } + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + s.mtx.Unlock() + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + return nil +} + +func (s *summary) newStream() *quantile.Stream { + return quantile.NewTargeted(s.objectives) +} + +// asyncFlush needs bufMtx locked. +func (s *summary) asyncFlush(now time.Time) { + s.mtx.Lock() + s.swapBufs(now) + + // Unblock the original goroutine that was responsible for the mutation + // that triggered the compaction. But hold onto the global non-buffer + // state mutex until the operation finishes. + go func() { + s.flushColdBuf() + s.mtx.Unlock() + }() +} + +// rotateStreams needs mtx AND bufMtx locked. +func (s *summary) maybeRotateStreams() { + for !s.hotBufExpTime.Equal(s.headStreamExpTime) { + s.headStream.Reset() + s.headStreamIdx++ + if s.headStreamIdx >= len(s.streams) { + s.headStreamIdx = 0 + } + s.headStream = s.streams[s.headStreamIdx] + s.headStreamExpTime = s.headStreamExpTime.Add(s.streamDuration) + } +} + +// flushColdBuf needs mtx locked. +func (s *summary) flushColdBuf() { + for _, v := range s.coldBuf { + for _, stream := range s.streams { + stream.Insert(v) + } + s.cnt++ + s.sum += v + } + s.coldBuf = s.coldBuf[0:0] + s.maybeRotateStreams() +} + +// swapBufs needs mtx AND bufMtx locked, coldBuf must be empty. +func (s *summary) swapBufs(now time.Time) { + if len(s.coldBuf) != 0 { + panic("coldBuf is not empty") + } + s.hotBuf, s.coldBuf = s.coldBuf, s.hotBuf + // hotBuf is now empty and gets new expiration set. + for now.After(s.hotBufExpTime) { + s.hotBufExpTime = s.hotBufExpTime.Add(s.streamDuration) + } +} + +type quantSort []*dto.Quantile + +func (s quantSort) Len() int { + return len(s) +} + +func (s quantSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s quantSort) Less(i, j int) bool { + return s[i].GetQuantile() < s[j].GetQuantile() +} + +// SummaryVec is a Collector that bundles a set of Summaries that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewSummaryVec. +type SummaryVec struct { + *MetricVec +} + +// NewSummaryVec creates a new SummaryVec based on the provided SummaryOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &SummaryVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newSummary(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Summary and not a +// Metric so that no type conversion is required. +func (m *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Summary, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Summary), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Summary and not a Metric so that no +// type conversion is required. +func (m *SummaryVec) GetMetricWith(labels Labels) (Summary, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Summary), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (m *SummaryVec) WithLabelValues(lvs ...string) Summary { + return m.MetricVec.WithLabelValues(lvs...).(Summary) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (m *SummaryVec) With(labels Labels) Summary { + return m.MetricVec.With(labels).(Summary) +} + +type constSummary struct { + desc *Desc + count uint64 + sum float64 + quantiles map[float64]float64 + labelPairs []*dto.LabelPair +} + +func (s *constSummary) Desc() *Desc { + return s.desc +} + +func (s *constSummary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.quantiles)) + + sum.SampleCount = proto.Uint64(s.count) + sum.SampleSum = proto.Float64(s.sum) + + for rank, q := range s.quantiles { + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + + return nil +} + +// NewConstSummary returns a metric representing a Prometheus summary with fixed +// values for the count, sum, and quantiles. As those parameters cannot be +// changed, the returned value does not implement the Summary interface (but +// only the Metric interface). Users of this package will not have much use for +// it in regular operations. However, when implementing custom Collectors, it is +// useful as a throw-away metric that is generated on the fly to send it to +// Prometheus in the Collect method. +// +// quantiles maps ranks to quantile values. For example, a median latency of +// 0.23s and a 99th percentile latency of 0.56s would be expressed as: +// map[float64]float64{0.5: 0.23, 0.99: 0.56} +// +// NewConstSummary returns an error if the length of labelValues is not +// consistent with the variable labels in Desc. +func NewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constSummary{ + desc: desc, + count: count, + sum: sum, + quantiles: quantiles, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstSummary is a version of NewConstSummary that panics where +// NewConstMetric would have returned an error. +func MustNewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) Metric { + m, err := NewConstSummary(desc, count, sum, quantiles, labelValues...) + if err != nil { + panic(err) + } + return m +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/untyped.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/untyped.go new file mode 100644 index 00000000..5faf7e6e --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/untyped.go @@ -0,0 +1,138 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Untyped is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// An Untyped metric works the same as a Gauge. The only difference is that to +// no type information is implied. +// +// To create Untyped instances, use NewUntyped. +type Untyped interface { + Metric + Collector + + // Set sets the Untyped metric to an arbitrary value. + Set(float64) + // Inc increments the Untyped metric by 1. + Inc() + // Dec decrements the Untyped metric by 1. + Dec() + // Add adds the given value to the Untyped metric. (The value can be + // negative, resulting in a decrease.) + Add(float64) + // Sub subtracts the given value from the Untyped metric. (The value can + // be negative, resulting in an increase.) + Sub(float64) +} + +// UntypedOpts is an alias for Opts. See there for doc comments. +type UntypedOpts Opts + +// NewUntyped creates a new Untyped metric from the provided UntypedOpts. +func NewUntyped(opts UntypedOpts) Untyped { + return newValue(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, 0) +} + +// UntypedVec is a Collector that bundles a set of Untyped metrics that all +// share the same Desc, but have different values for their variable +// labels. This is used if you want to count the same thing partitioned by +// various dimensions. Create instances with NewUntypedVec. +type UntypedVec struct { + *MetricVec +} + +// NewUntypedVec creates a new UntypedVec based on the provided UntypedOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewUntypedVec(opts UntypedOpts, labelNames []string) *UntypedVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &UntypedVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newValue(desc, UntypedValue, 0, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns an Untyped and not a +// Metric so that no type conversion is required. +func (m *UntypedVec) GetMetricWithLabelValues(lvs ...string) (Untyped, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Untyped), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns an Untyped and not a Metric so that no +// type conversion is required. +func (m *UntypedVec) GetMetricWith(labels Labels) (Untyped, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Untyped), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *UntypedVec) WithLabelValues(lvs ...string) Untyped { + return m.MetricVec.WithLabelValues(lvs...).(Untyped) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *UntypedVec) With(labels Labels) Untyped { + return m.MetricVec.With(labels).(Untyped) +} + +// UntypedFunc is an Untyped whose value is determined at collect time by +// calling a provided function. +// +// To create UntypedFunc instances, use NewUntypedFunc. +type UntypedFunc interface { + Metric + Collector +} + +// NewUntypedFunc creates a new UntypedFunc based on the provided +// UntypedOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where an UntypedFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func NewUntypedFunc(opts UntypedOpts, function func() float64) UntypedFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, function) +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/value.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/value.go new file mode 100644 index 00000000..c7839d1f --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/value.go @@ -0,0 +1,234 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "fmt" + "math" + "sort" + "sync/atomic" + + dto "github.com/m3db/prometheus_client_model/go" + + "github.com/golang/protobuf/proto" +) + +// ValueType is an enumeration of metric types that represent a simple value. +type ValueType int + +// Possible values for the ValueType enum. +const ( + _ ValueType = iota + CounterValue + GaugeValue + UntypedValue +) + +var errInconsistentCardinality = errors.New("inconsistent label cardinality") + +// value is a generic metric for simple values. It implements Metric, Collector, +// Counter, Gauge, and Untyped. Its effective type is determined by +// ValueType. This is a low-level building block used by the library to back the +// implementations of Counter, Gauge, and Untyped. +type value struct { + // valBits containst the bits of the represented float64 value. It has + // to go first in the struct to guarantee alignment for atomic + // operations. http://golang.org/pkg/sync/atomic/#pkg-note-BUG + valBits uint64 + + selfCollector + + desc *Desc + valType ValueType + labelPairs []*dto.LabelPair +} + +// newValue returns a newly allocated value with the given Desc, ValueType, +// sample value and label values. It panics if the number of label +// values is different from the number of variable labels in Desc. +func newValue(desc *Desc, valueType ValueType, val float64, labelValues ...string) *value { + if len(labelValues) != len(desc.variableLabels) { + panic(errInconsistentCardinality) + } + result := &value{ + desc: desc, + valType: valueType, + valBits: math.Float64bits(val), + labelPairs: makeLabelPairs(desc, labelValues), + } + result.init(result) + return result +} + +func (v *value) Desc() *Desc { + return v.desc +} + +func (v *value) Set(val float64) { + atomic.StoreUint64(&v.valBits, math.Float64bits(val)) +} + +func (v *value) Inc() { + v.Add(1) +} + +func (v *value) Dec() { + v.Add(-1) +} + +func (v *value) Add(val float64) { + for { + oldBits := atomic.LoadUint64(&v.valBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + val) + if atomic.CompareAndSwapUint64(&v.valBits, oldBits, newBits) { + return + } + } +} + +func (v *value) Sub(val float64) { + v.Add(val * -1) +} + +func (v *value) Write(out *dto.Metric) error { + val := math.Float64frombits(atomic.LoadUint64(&v.valBits)) + return populateMetric(v.valType, val, v.labelPairs, out) +} + +// valueFunc is a generic metric for simple values retrieved on collect time +// from a function. It implements Metric and Collector. Its effective type is +// determined by ValueType. This is a low-level building block used by the +// library to back the implementations of CounterFunc, GaugeFunc, and +// UntypedFunc. +type valueFunc struct { + selfCollector + + desc *Desc + valType ValueType + function func() float64 + labelPairs []*dto.LabelPair +} + +// newValueFunc returns a newly allocated valueFunc with the given Desc and +// ValueType. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a valueFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func newValueFunc(desc *Desc, valueType ValueType, function func() float64) *valueFunc { + result := &valueFunc{ + desc: desc, + valType: valueType, + function: function, + labelPairs: makeLabelPairs(desc, nil), + } + result.init(result) + return result +} + +func (v *valueFunc) Desc() *Desc { + return v.desc +} + +func (v *valueFunc) Write(out *dto.Metric) error { + return populateMetric(v.valType, v.function(), v.labelPairs, out) +} + +// NewConstMetric returns a metric with one fixed value that cannot be +// changed. Users of this package will not have much use for it in regular +// operations. However, when implementing custom Collectors, it is useful as a +// throw-away metric that is generated on the fly to send it to Prometheus in +// the Collect method. NewConstMetric returns an error if the length of +// labelValues is not consistent with the variable labels in Desc. +func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constMetric{ + desc: desc, + valType: valueType, + val: value, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstMetric is a version of NewConstMetric that panics where +// NewConstMetric would have returned an error. +func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) Metric { + m, err := NewConstMetric(desc, valueType, value, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type constMetric struct { + desc *Desc + valType ValueType + val float64 + labelPairs []*dto.LabelPair +} + +func (m *constMetric) Desc() *Desc { + return m.desc +} + +func (m *constMetric) Write(out *dto.Metric) error { + return populateMetric(m.valType, m.val, m.labelPairs, out) +} + +func populateMetric( + t ValueType, + v float64, + labelPairs []*dto.LabelPair, + m *dto.Metric, +) error { + m.Label = labelPairs + switch t { + case CounterValue: + m.Counter = &dto.Counter{Value: proto.Float64(v)} + case GaugeValue: + m.Gauge = &dto.Gauge{Value: proto.Float64(v)} + case UntypedValue: + m.Untyped = &dto.Untyped{Value: proto.Float64(v)} + default: + return fmt.Errorf("encountered unknown type %v", t) + } + return nil +} + +func makeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { + totalLen := len(desc.variableLabels) + len(desc.constLabelPairs) + if totalLen == 0 { + // Super fast path. + return nil + } + if len(desc.variableLabels) == 0 { + // Moderately fast path. + return desc.constLabelPairs + } + labelPairs := make([]*dto.LabelPair, 0, totalLen) + for i, n := range desc.variableLabels { + labelPairs = append(labelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(labelValues[i]), + }) + } + for _, lp := range desc.constLabelPairs { + labelPairs = append(labelPairs, lp) + } + sort.Sort(LabelPairSorter(labelPairs)) + return labelPairs +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/vec.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/vec.go new file mode 100644 index 00000000..1a432993 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/vec.go @@ -0,0 +1,404 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sync" + + "github.com/m3db/prometheus_common/model" +) + +// MetricVec is a Collector to bundle metrics of the same name that +// differ in their label values. MetricVec is usually not used directly but as a +// building block for implementations of vectors of a given metric +// type. GaugeVec, CounterVec, SummaryVec, and UntypedVec are examples already +// provided in this package. +type MetricVec struct { + mtx sync.RWMutex // Protects the children. + children map[uint64][]metricWithLabelValues + desc *Desc + + newMetric func(labelValues ...string) Metric + hashAdd func(h uint64, s string) uint64 // replace hash function for testing collision handling + hashAddByte func(h uint64, b byte) uint64 +} + +// newMetricVec returns an initialized MetricVec. The concrete value is +// returned for embedding into another struct. +func newMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { + return &MetricVec{ + children: map[uint64][]metricWithLabelValues{}, + desc: desc, + newMetric: newMetric, + hashAdd: hashAdd, + hashAddByte: hashAddByte, + } +} + +// metricWithLabelValues provides the metric and its label values for +// disambiguation on hash collision. +type metricWithLabelValues struct { + values []string + metric Metric +} + +// Describe implements Collector. The length of the returned slice +// is always one. +func (m *MetricVec) Describe(ch chan<- *Desc) { + ch <- m.desc +} + +// Collect implements Collector. +func (m *MetricVec) Collect(ch chan<- Metric) { + m.mtx.RLock() + defer m.mtx.RUnlock() + + for _, metrics := range m.children { + for _, metric := range metrics { + ch <- metric.metric + } + } +} + +// GetMetricWithLabelValues returns the Metric for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Metric is created. +// +// It is possible to call this method without using the returned Metric to only +// create the new Metric but leave it at its start value (e.g. a Summary or +// Histogram without any observations). See also the SummaryVec example. +// +// Keeping the Metric for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Metric from the MetricVec. In that case, the +// Metric will still exist, but it will not be exported anymore, even if a +// Metric with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { + h, err := m.hashLabelValues(lvs) + if err != nil { + return nil, err + } + + return m.getOrCreateMetricWithLabelValues(h, lvs), nil +} + +// GetMetricWith returns the Metric for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Metric is created. Implications of +// creating a Metric without using it and keeping the Metric for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc. +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { + h, err := m.hashLabels(labels) + if err != nil { + return nil, err + } + + return m.getOrCreateMetricWithLabels(h, labels), nil +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics if an error +// occurs. The method allows neat syntax like: +// httpReqs.WithLabelValues("404", "POST").Inc() +func (m *MetricVec) WithLabelValues(lvs ...string) Metric { + metric, err := m.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return metric +} + +// With works as GetMetricWith, but panics if an error occurs. The method allows +// neat syntax like: +// httpReqs.With(Labels{"status":"404", "method":"POST"}).Inc() +func (m *MetricVec) With(labels Labels) Metric { + metric, err := m.GetMetricWith(labels) + if err != nil { + panic(err) + } + return metric +} + +// DeleteLabelValues removes the metric where the variable labels are the same +// as those passed in as labels (same order as the VariableLabels in Desc). It +// returns true if a metric was deleted. +// +// It is not an error if the number of label values is not the same as the +// number of VariableLabels in Desc. However, such inconsistent label count can +// never match an actual Metric, so the method will always return false in that +// case. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider Delete(Labels) as an +// alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the CounterVec example. +func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + h, err := m.hashLabelValues(lvs) + if err != nil { + return false + } + return m.deleteByHashWithLabelValues(h, lvs) +} + +// Delete deletes the metric where the variable labels are the same as those +// passed in as labels. It returns true if a metric was deleted. +// +// It is not an error if the number and names of the Labels are inconsistent +// with those of the VariableLabels in the Desc of the MetricVec. However, such +// inconsistent Labels can never match an actual Metric, so the method will +// always return false in that case. +// +// This method is used for the same purpose as DeleteLabelValues(...string). See +// there for pros and cons of the two methods. +func (m *MetricVec) Delete(labels Labels) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + h, err := m.hashLabels(labels) + if err != nil { + return false + } + + return m.deleteByHashWithLabels(h, labels) +} + +// deleteByHashWithLabelValues removes the metric from the hash bucket h. If +// there are multiple matches in the bucket, use lvs to select a metric and +// remove only that metric. +func (m *MetricVec) deleteByHashWithLabelValues(h uint64, lvs []string) bool { + metrics, ok := m.children[h] + if !ok { + return false + } + + i := m.findMetricWithLabelValues(metrics, lvs) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.children[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.children, h) + } + return true +} + +// deleteByHashWithLabels removes the metric from the hash bucket h. If there +// are multiple matches in the bucket, use lvs to select a metric and remove +// only that metric. +func (m *MetricVec) deleteByHashWithLabels(h uint64, labels Labels) bool { + metrics, ok := m.children[h] + if !ok { + return false + } + i := m.findMetricWithLabels(metrics, labels) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.children[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.children, h) + } + return true +} + +// Reset deletes all metrics in this vector. +func (m *MetricVec) Reset() { + m.mtx.Lock() + defer m.mtx.Unlock() + + for h := range m.children { + delete(m.children, h) + } +} + +func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { + if len(vals) != len(m.desc.variableLabels) { + return 0, errInconsistentCardinality + } + h := hashNew() + for _, val := range vals { + h = m.hashAdd(h, val) + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { + if len(labels) != len(m.desc.variableLabels) { + return 0, errInconsistentCardinality + } + h := hashNew() + for _, label := range m.desc.variableLabels { + val, ok := labels[label] + if !ok { + return 0, fmt.Errorf("label name %q missing in label map", label) + } + h = m.hashAdd(h, val) + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *MetricVec) getOrCreateMetricWithLabelValues(hash uint64, lvs []string) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithLabelValues(hash, lvs) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithLabelValues(hash, lvs) + if !ok { + // Copy to avoid allocation in case wo don't go down this code path. + copiedLVs := make([]string, len(lvs)) + copy(copiedLVs, lvs) + metric = m.newMetric(copiedLVs...) + m.children[hash] = append(m.children[hash], metricWithLabelValues{values: copiedLVs, metric: metric}) + } + return metric +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *MetricVec) getOrCreateMetricWithLabels(hash uint64, labels Labels) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithLabels(hash, labels) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithLabels(hash, labels) + if !ok { + lvs := m.extractLabelValues(labels) + metric = m.newMetric(lvs...) + m.children[hash] = append(m.children[hash], metricWithLabelValues{values: lvs, metric: metric}) + } + return metric +} + +// getMetricWithLabelValues gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *MetricVec) getMetricWithLabelValues(h uint64, lvs []string) (Metric, bool) { + metrics, ok := m.children[h] + if ok { + if i := m.findMetricWithLabelValues(metrics, lvs); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// getMetricWithLabels gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *MetricVec) getMetricWithLabels(h uint64, labels Labels) (Metric, bool) { + metrics, ok := m.children[h] + if ok { + if i := m.findMetricWithLabels(metrics, labels); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// findMetricWithLabelValues returns the index of the matching metric or +// len(metrics) if not found. +func (m *MetricVec) findMetricWithLabelValues(metrics []metricWithLabelValues, lvs []string) int { + for i, metric := range metrics { + if m.matchLabelValues(metric.values, lvs) { + return i + } + } + return len(metrics) +} + +// findMetricWithLabels returns the index of the matching metric or len(metrics) +// if not found. +func (m *MetricVec) findMetricWithLabels(metrics []metricWithLabelValues, labels Labels) int { + for i, metric := range metrics { + if m.matchLabels(metric.values, labels) { + return i + } + } + return len(metrics) +} + +func (m *MetricVec) matchLabelValues(values []string, lvs []string) bool { + if len(values) != len(lvs) { + return false + } + for i, v := range values { + if v != lvs[i] { + return false + } + } + return true +} + +func (m *MetricVec) matchLabels(values []string, labels Labels) bool { + if len(labels) != len(values) { + return false + } + for i, k := range m.desc.variableLabels { + if values[i] != labels[k] { + return false + } + } + return true +} + +func (m *MetricVec) extractLabelValues(labels Labels) []string { + labelValues := make([]string, len(labels)) + for i, k := range m.desc.variableLabels { + labelValues[i] = labels[k] + } + return labelValues +} diff --git a/vendor/github.com/m3db/prometheus_client_model/AUTHORS.md b/vendor/github.com/m3db/prometheus_client_model/AUTHORS.md new file mode 100644 index 00000000..e8b3efa6 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_model/AUTHORS.md @@ -0,0 +1,13 @@ +The Prometheus project was started by Matt T. Proud (emeritus) and +Julius Volz in 2012. + +Maintainers of this repository: + +* Björn Rabenstein + +The following individuals have contributed code to this repository +(listed in alphabetical order): + +* Björn Rabenstein +* Matt T. Proud +* Tobias Schmidt diff --git a/vendor/github.com/m3db/prometheus_client_model/LICENSE b/vendor/github.com/m3db/prometheus_client_model/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_model/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/m3db/prometheus_client_model/NOTICE b/vendor/github.com/m3db/prometheus_client_model/NOTICE new file mode 100644 index 00000000..20110e41 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_model/NOTICE @@ -0,0 +1,5 @@ +Data model artifacts for Prometheus. +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/m3db/prometheus_client_model/go/metrics.pb.go b/vendor/github.com/m3db/prometheus_client_model/go/metrics.pb.go new file mode 100644 index 00000000..e509277e --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_model/go/metrics.pb.go @@ -0,0 +1,360 @@ +// Code generated by protoc-gen-go. +// source: metrics.proto +// DO NOT EDIT! + +/* +Package io_prometheus_client is a generated protocol buffer package. + +It is generated from these files: + metrics.proto + +It has these top-level messages: + LabelPair + Gauge + Counter + Quantile + Summary + Untyped + Histogram + Bucket + Metric + MetricFamily +*/ +package io_prometheus_client + +import proto "github.com/golang/protobuf/proto" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = math.Inf + +type MetricType int32 + +const ( + MetricType_COUNTER MetricType = 0 + MetricType_GAUGE MetricType = 1 + MetricType_SUMMARY MetricType = 2 + MetricType_UNTYPED MetricType = 3 + MetricType_HISTOGRAM MetricType = 4 +) + +var MetricType_name = map[int32]string{ + 0: "COUNTER", + 1: "GAUGE", + 2: "SUMMARY", + 3: "UNTYPED", + 4: "HISTOGRAM", +} +var MetricType_value = map[string]int32{ + "COUNTER": 0, + "GAUGE": 1, + "SUMMARY": 2, + "UNTYPED": 3, + "HISTOGRAM": 4, +} + +func (x MetricType) Enum() *MetricType { + p := new(MetricType) + *p = x + return p +} +func (x MetricType) String() string { + return proto.EnumName(MetricType_name, int32(x)) +} +func (x *MetricType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MetricType_value, data, "MetricType") + if err != nil { + return err + } + *x = MetricType(value) + return nil +} + +type LabelPair struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LabelPair) Reset() { *m = LabelPair{} } +func (m *LabelPair) String() string { return proto.CompactTextString(m) } +func (*LabelPair) ProtoMessage() {} + +func (m *LabelPair) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *LabelPair) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +type Gauge struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Gauge) Reset() { *m = Gauge{} } +func (m *Gauge) String() string { return proto.CompactTextString(m) } +func (*Gauge) ProtoMessage() {} + +func (m *Gauge) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Counter struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Counter) Reset() { *m = Counter{} } +func (m *Counter) String() string { return proto.CompactTextString(m) } +func (*Counter) ProtoMessage() {} + +func (m *Counter) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Quantile struct { + Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Quantile) Reset() { *m = Quantile{} } +func (m *Quantile) String() string { return proto.CompactTextString(m) } +func (*Quantile) ProtoMessage() {} + +func (m *Quantile) GetQuantile() float64 { + if m != nil && m.Quantile != nil { + return *m.Quantile + } + return 0 +} + +func (m *Quantile) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Summary struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum" json:"sample_sum,omitempty"` + Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Summary) Reset() { *m = Summary{} } +func (m *Summary) String() string { return proto.CompactTextString(m) } +func (*Summary) ProtoMessage() {} + +func (m *Summary) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Summary) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Summary) GetQuantile() []*Quantile { + if m != nil { + return m.Quantile + } + return nil +} + +type Untyped struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Untyped) Reset() { *m = Untyped{} } +func (m *Untyped) String() string { return proto.CompactTextString(m) } +func (*Untyped) ProtoMessage() {} + +func (m *Untyped) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Histogram struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum" json:"sample_sum,omitempty"` + Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Histogram) Reset() { *m = Histogram{} } +func (m *Histogram) String() string { return proto.CompactTextString(m) } +func (*Histogram) ProtoMessage() {} + +func (m *Histogram) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Histogram) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Histogram) GetBucket() []*Bucket { + if m != nil { + return m.Bucket + } + return nil +} + +type Bucket struct { + CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count" json:"cumulative_count,omitempty"` + UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound" json:"upper_bound,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Bucket) Reset() { *m = Bucket{} } +func (m *Bucket) String() string { return proto.CompactTextString(m) } +func (*Bucket) ProtoMessage() {} + +func (m *Bucket) GetCumulativeCount() uint64 { + if m != nil && m.CumulativeCount != nil { + return *m.CumulativeCount + } + return 0 +} + +func (m *Bucket) GetUpperBound() float64 { + if m != nil && m.UpperBound != nil { + return *m.UpperBound + } + return 0 +} + +type Metric struct { + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` + Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` + Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` + Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` + Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` + TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms" json:"timestamp_ms,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Metric) Reset() { *m = Metric{} } +func (m *Metric) String() string { return proto.CompactTextString(m) } +func (*Metric) ProtoMessage() {} + +func (m *Metric) GetLabel() []*LabelPair { + if m != nil { + return m.Label + } + return nil +} + +func (m *Metric) GetGauge() *Gauge { + if m != nil { + return m.Gauge + } + return nil +} + +func (m *Metric) GetCounter() *Counter { + if m != nil { + return m.Counter + } + return nil +} + +func (m *Metric) GetSummary() *Summary { + if m != nil { + return m.Summary + } + return nil +} + +func (m *Metric) GetUntyped() *Untyped { + if m != nil { + return m.Untyped + } + return nil +} + +func (m *Metric) GetHistogram() *Histogram { + if m != nil { + return m.Histogram + } + return nil +} + +func (m *Metric) GetTimestampMs() int64 { + if m != nil && m.TimestampMs != nil { + return *m.TimestampMs + } + return 0 +} + +type MetricFamily struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` + Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` + Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MetricFamily) Reset() { *m = MetricFamily{} } +func (m *MetricFamily) String() string { return proto.CompactTextString(m) } +func (*MetricFamily) ProtoMessage() {} + +func (m *MetricFamily) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MetricFamily) GetHelp() string { + if m != nil && m.Help != nil { + return *m.Help + } + return "" +} + +func (m *MetricFamily) GetType() MetricType { + if m != nil && m.Type != nil { + return *m.Type + } + return MetricType_COUNTER +} + +func (m *MetricFamily) GetMetric() []*Metric { + if m != nil { + return m.Metric + } + return nil +} diff --git a/vendor/github.com/m3db/prometheus_common/AUTHORS.md b/vendor/github.com/m3db/prometheus_common/AUTHORS.md new file mode 100644 index 00000000..c63f4d39 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/AUTHORS.md @@ -0,0 +1,11 @@ +Maintainers of this repository: + +* Fabian Reinartz + +The following individuals have contributed code to this repository +(listed in alphabetical order): + +* Björn Rabenstein +* Fabian Reinartz +* Julius Volz +* Miguel Molina diff --git a/vendor/github.com/m3db/prometheus_common/LICENSE b/vendor/github.com/m3db/prometheus_common/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/m3db/prometheus_common/NOTICE b/vendor/github.com/m3db/prometheus_common/NOTICE new file mode 100644 index 00000000..636a2c1a --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/NOTICE @@ -0,0 +1,5 @@ +Common libraries shared by Prometheus Go components. +Copyright 2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/m3db/prometheus_common/expfmt/decode.go b/vendor/github.com/m3db/prometheus_common/expfmt/decode.go new file mode 100644 index 00000000..fecabe7a --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/expfmt/decode.go @@ -0,0 +1,412 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "fmt" + "io" + "math" + "mime" + "net/http" + + dto "github.com/m3db/prometheus_client_model/go" + + "github.com/m3db/prometheus_common/model" + "github.com/matttproud/golang_protobuf_extensions/pbutil" +) + +// Decoder types decode an input stream into metric families. +type Decoder interface { + Decode(*dto.MetricFamily) error +} + +type DecodeOptions struct { + // Timestamp is added to each value from the stream that has no explicit timestamp set. + Timestamp model.Time +} + +// ResponseFormat extracts the correct format from a HTTP response header. +// If no matching format can be found FormatUnknown is returned. +func ResponseFormat(h http.Header) Format { + ct := h.Get(hdrContentType) + + mediatype, params, err := mime.ParseMediaType(ct) + if err != nil { + return FmtUnknown + } + + const textType = "text/plain" + + switch mediatype { + case ProtoType: + if p, ok := params["proto"]; ok && p != ProtoProtocol { + return FmtUnknown + } + if e, ok := params["encoding"]; ok && e != "delimited" { + return FmtUnknown + } + return FmtProtoDelim + + case textType: + if v, ok := params["version"]; ok && v != TextVersion { + return FmtUnknown + } + return FmtText + } + + return FmtUnknown +} + +// NewDecoder returns a new decoder based on the given input format. +// If the input format does not imply otherwise, a text format decoder is returned. +func NewDecoder(r io.Reader, format Format) Decoder { + switch format { + case FmtProtoDelim: + return &protoDecoder{r: r} + } + return &textDecoder{r: r} +} + +// protoDecoder implements the Decoder interface for protocol buffers. +type protoDecoder struct { + r io.Reader +} + +// Decode implements the Decoder interface. +func (d *protoDecoder) Decode(v *dto.MetricFamily) error { + _, err := pbutil.ReadDelimited(d.r, v) + if err != nil { + return err + } + if !model.IsValidMetricName(model.LabelValue(v.GetName())) { + return fmt.Errorf("invalid metric name %q", v.GetName()) + } + for _, m := range v.GetMetric() { + if m == nil { + continue + } + for _, l := range m.GetLabel() { + if l == nil { + continue + } + if !model.LabelValue(l.GetValue()).IsValid() { + return fmt.Errorf("invalid label value %q", l.GetValue()) + } + if !model.LabelName(l.GetName()).IsValid() { + return fmt.Errorf("invalid label name %q", l.GetName()) + } + } + } + return nil +} + +// textDecoder implements the Decoder interface for the text protocol. +type textDecoder struct { + r io.Reader + p TextParser + fams []*dto.MetricFamily +} + +// Decode implements the Decoder interface. +func (d *textDecoder) Decode(v *dto.MetricFamily) error { + // TODO(fabxc): Wrap this as a line reader to make streaming safer. + if len(d.fams) == 0 { + // No cached metric families, read everything and parse metrics. + fams, err := d.p.TextToMetricFamilies(d.r) + if err != nil { + return err + } + if len(fams) == 0 { + return io.EOF + } + d.fams = make([]*dto.MetricFamily, 0, len(fams)) + for _, f := range fams { + d.fams = append(d.fams, f) + } + } + + *v = *d.fams[0] + d.fams = d.fams[1:] + + return nil +} + +type SampleDecoder struct { + Dec Decoder + Opts *DecodeOptions + + f dto.MetricFamily +} + +func (sd *SampleDecoder) Decode(s *model.Vector) error { + if err := sd.Dec.Decode(&sd.f); err != nil { + return err + } + *s = extractSamples(&sd.f, sd.Opts) + return nil +} + +// Extract samples builds a slice of samples from the provided metric families. +func ExtractSamples(o *DecodeOptions, fams ...*dto.MetricFamily) model.Vector { + var all model.Vector + for _, f := range fams { + all = append(all, extractSamples(f, o)...) + } + return all +} + +func extractSamples(f *dto.MetricFamily, o *DecodeOptions) model.Vector { + switch f.GetType() { + case dto.MetricType_COUNTER: + return extractCounter(o, f) + case dto.MetricType_GAUGE: + return extractGauge(o, f) + case dto.MetricType_SUMMARY: + return extractSummary(o, f) + case dto.MetricType_UNTYPED: + return extractUntyped(o, f) + case dto.MetricType_HISTOGRAM: + return extractHistogram(o, f) + } + panic("expfmt.extractSamples: unknown metric family type") +} + +func extractCounter(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Counter == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Counter.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractGauge(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Gauge == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Gauge.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractUntyped(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Untyped == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Untyped.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractSummary(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Summary == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + for _, q := range m.Summary.Quantile { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + // BUG(matt): Update other names to "quantile". + lset[model.LabelName(model.QuantileLabel)] = model.LabelValue(fmt.Sprint(q.GetQuantile())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetValue()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleCount()), + Timestamp: timestamp, + }) + } + + return samples +} + +func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Histogram == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + infSeen := false + + for _, q := range m.Histogram.Bucket { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue(fmt.Sprint(q.GetUpperBound())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + if math.IsInf(q.GetUpperBound(), +1) { + infSeen = true + } + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetCumulativeCount()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + count := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleCount()), + Timestamp: timestamp, + } + samples = append(samples, count) + + if !infSeen { + // Append an infinity bucket sample. + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue("+Inf") + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: count.Value, + Timestamp: timestamp, + }) + } + } + + return samples +} diff --git a/vendor/github.com/m3db/prometheus_common/expfmt/encode.go b/vendor/github.com/m3db/prometheus_common/expfmt/encode.go new file mode 100644 index 00000000..171b9aac --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/expfmt/encode.go @@ -0,0 +1,88 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "fmt" + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg" + "github.com/matttproud/golang_protobuf_extensions/pbutil" + + dto "github.com/m3db/prometheus_client_model/go" +) + +// Encoder types encode metric families into an underlying wire protocol. +type Encoder interface { + Encode(*dto.MetricFamily) error +} + +type encoder func(*dto.MetricFamily) error + +func (e encoder) Encode(v *dto.MetricFamily) error { + return e(v) +} + +// Negotiate returns the Content-Type based on the given Accept header. +// If no appropriate accepted type is found, FmtText is returned. +func Negotiate(h http.Header) Format { + for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + // Check for protocol buffer + if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { + switch ac.Params["encoding"] { + case "delimited": + return FmtProtoDelim + case "text": + return FmtProtoText + case "compact-text": + return FmtProtoCompact + } + } + // Check for text format. + ver := ac.Params["version"] + if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { + return FmtText + } + } + return FmtText +} + +// NewEncoder returns a new encoder based on content type negotiation. +func NewEncoder(w io.Writer, format Format) Encoder { + switch format { + case FmtProtoDelim: + return encoder(func(v *dto.MetricFamily) error { + _, err := pbutil.WriteDelimited(w, v) + return err + }) + case FmtProtoCompact: + return encoder(func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, v.String()) + return err + }) + case FmtProtoText: + return encoder(func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) + return err + }) + case FmtText: + return encoder(func(v *dto.MetricFamily) error { + _, err := MetricFamilyToText(w, v) + return err + }) + } + panic("expfmt.NewEncoder: unknown format") +} diff --git a/vendor/github.com/m3db/prometheus_common/expfmt/expfmt.go b/vendor/github.com/m3db/prometheus_common/expfmt/expfmt.go new file mode 100644 index 00000000..fae10f6e --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/expfmt/expfmt.go @@ -0,0 +1,37 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// A package for reading and writing Prometheus metrics. +package expfmt + +type Format string + +const ( + TextVersion = "0.0.4" + + ProtoType = `application/vnd.google.protobuf` + ProtoProtocol = `io.prometheus.client.MetricFamily` + ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + + // The Content-Type values for the different wire protocols. + FmtUnknown Format = `` + FmtText Format = `text/plain; version=` + TextVersion + FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` + FmtProtoText Format = ProtoFmt + ` encoding=text` + FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` +) + +const ( + hdrContentType = "Content-Type" + hdrAccept = "Accept" +) diff --git a/vendor/github.com/m3db/prometheus_common/expfmt/fuzz.go b/vendor/github.com/m3db/prometheus_common/expfmt/fuzz.go new file mode 100644 index 00000000..dc2eedee --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/expfmt/fuzz.go @@ -0,0 +1,36 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Build only when actually fuzzing +// +build gofuzz + +package expfmt + +import "bytes" + +// Fuzz text metric parser with with github.com/dvyukov/go-fuzz: +// +// go-fuzz-build github.com/prometheus/common/expfmt +// go-fuzz -bin expfmt-fuzz.zip -workdir fuzz +// +// Further input samples should go in the folder fuzz/corpus. +func Fuzz(in []byte) int { + parser := TextParser{} + _, err := parser.TextToMetricFamilies(bytes.NewReader(in)) + + if err != nil { + return 0 + } + + return 1 +} diff --git a/vendor/github.com/m3db/prometheus_common/expfmt/text_create.go b/vendor/github.com/m3db/prometheus_common/expfmt/text_create.go new file mode 100644 index 00000000..4957b63b --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/expfmt/text_create.go @@ -0,0 +1,303 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "fmt" + "io" + "math" + "strings" + + dto "github.com/m3db/prometheus_client_model/go" + "github.com/m3db/prometheus_common/model" +) + +// MetricFamilyToText converts a MetricFamily proto message into text format and +// writes the resulting lines to 'out'. It returns the number of bytes written +// and any error encountered. The output will have the same order as the input, +// no further sorting is performed. Furthermore, this function assumes the input +// is already sanitized and does not perform any sanity checks. If the input +// contains duplicate metrics or invalid metric or label names, the conversion +// will result in invalid text format output. +// +// This method fulfills the type 'prometheus.encoder'. +func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (int, error) { + var written int + + // Fail-fast checks. + if len(in.Metric) == 0 { + return written, fmt.Errorf("MetricFamily has no metrics: %s", in) + } + name := in.GetName() + if name == "" { + return written, fmt.Errorf("MetricFamily has no name: %s", in) + } + + // Comments, first HELP, then TYPE. + if in.Help != nil { + n, err := fmt.Fprintf( + out, "# HELP %s %s\n", + name, escapeString(*in.Help, false), + ) + written += n + if err != nil { + return written, err + } + } + metricType := in.GetType() + n, err := fmt.Fprintf( + out, "# TYPE %s %s\n", + name, strings.ToLower(metricType.String()), + ) + written += n + if err != nil { + return written, err + } + + // Finally the samples, one line for each. + for _, metric := range in.Metric { + switch metricType { + case dto.MetricType_COUNTER: + if metric.Counter == nil { + return written, fmt.Errorf( + "expected counter in metric %s %s", name, metric, + ) + } + n, err = writeSample( + name, metric, "", "", + metric.Counter.GetValue(), + out, + ) + case dto.MetricType_GAUGE: + if metric.Gauge == nil { + return written, fmt.Errorf( + "expected gauge in metric %s %s", name, metric, + ) + } + n, err = writeSample( + name, metric, "", "", + metric.Gauge.GetValue(), + out, + ) + case dto.MetricType_UNTYPED: + if metric.Untyped == nil { + return written, fmt.Errorf( + "expected untyped in metric %s %s", name, metric, + ) + } + n, err = writeSample( + name, metric, "", "", + metric.Untyped.GetValue(), + out, + ) + case dto.MetricType_SUMMARY: + if metric.Summary == nil { + return written, fmt.Errorf( + "expected summary in metric %s %s", name, metric, + ) + } + for _, q := range metric.Summary.Quantile { + n, err = writeSample( + name, metric, + model.QuantileLabel, fmt.Sprint(q.GetQuantile()), + q.GetValue(), + out, + ) + written += n + if err != nil { + return written, err + } + } + n, err = writeSample( + name+"_sum", metric, "", "", + metric.Summary.GetSampleSum(), + out, + ) + if err != nil { + return written, err + } + written += n + n, err = writeSample( + name+"_count", metric, "", "", + float64(metric.Summary.GetSampleCount()), + out, + ) + case dto.MetricType_HISTOGRAM: + if metric.Histogram == nil { + return written, fmt.Errorf( + "expected histogram in metric %s %s", name, metric, + ) + } + infSeen := false + for _, q := range metric.Histogram.Bucket { + n, err = writeSample( + name+"_bucket", metric, + model.BucketLabel, fmt.Sprint(q.GetUpperBound()), + float64(q.GetCumulativeCount()), + out, + ) + written += n + if err != nil { + return written, err + } + if math.IsInf(q.GetUpperBound(), +1) { + infSeen = true + } + } + if !infSeen { + n, err = writeSample( + name+"_bucket", metric, + model.BucketLabel, "+Inf", + float64(metric.Histogram.GetSampleCount()), + out, + ) + if err != nil { + return written, err + } + written += n + } + n, err = writeSample( + name+"_sum", metric, "", "", + metric.Histogram.GetSampleSum(), + out, + ) + if err != nil { + return written, err + } + written += n + n, err = writeSample( + name+"_count", metric, "", "", + float64(metric.Histogram.GetSampleCount()), + out, + ) + default: + return written, fmt.Errorf( + "unexpected type in metric %s %s", name, metric, + ) + } + written += n + if err != nil { + return written, err + } + } + return written, nil +} + +// writeSample writes a single sample in text format to out, given the metric +// name, the metric proto message itself, optionally an additional label name +// and value (use empty strings if not required), and the value. The function +// returns the number of bytes written and any error encountered. +func writeSample( + name string, + metric *dto.Metric, + additionalLabelName, additionalLabelValue string, + value float64, + out io.Writer, +) (int, error) { + var written int + n, err := fmt.Fprint(out, name) + written += n + if err != nil { + return written, err + } + n, err = labelPairsToText( + metric.Label, + additionalLabelName, additionalLabelValue, + out, + ) + written += n + if err != nil { + return written, err + } + n, err = fmt.Fprintf(out, " %v", value) + written += n + if err != nil { + return written, err + } + if metric.TimestampMs != nil { + n, err = fmt.Fprintf(out, " %v", *metric.TimestampMs) + written += n + if err != nil { + return written, err + } + } + n, err = out.Write([]byte{'\n'}) + written += n + if err != nil { + return written, err + } + return written, nil +} + +// labelPairsToText converts a slice of LabelPair proto messages plus the +// explicitly given additional label pair into text formatted as required by the +// text format and writes it to 'out'. An empty slice in combination with an +// empty string 'additionalLabelName' results in nothing being +// written. Otherwise, the label pairs are written, escaped as required by the +// text format, and enclosed in '{...}'. The function returns the number of +// bytes written and any error encountered. +func labelPairsToText( + in []*dto.LabelPair, + additionalLabelName, additionalLabelValue string, + out io.Writer, +) (int, error) { + if len(in) == 0 && additionalLabelName == "" { + return 0, nil + } + var written int + separator := '{' + for _, lp := range in { + n, err := fmt.Fprintf( + out, `%c%s="%s"`, + separator, lp.GetName(), escapeString(lp.GetValue(), true), + ) + written += n + if err != nil { + return written, err + } + separator = ',' + } + if additionalLabelName != "" { + n, err := fmt.Fprintf( + out, `%c%s="%s"`, + separator, additionalLabelName, + escapeString(additionalLabelValue, true), + ) + written += n + if err != nil { + return written, err + } + } + n, err := out.Write([]byte{'}'}) + written += n + if err != nil { + return written, err + } + return written, nil +} + +var ( + escape = strings.NewReplacer("\\", `\\`, "\n", `\n`) + escapeWithDoubleQuote = strings.NewReplacer("\\", `\\`, "\n", `\n`, "\"", `\"`) +) + +// escapeString replaces '\' by '\\', new line character by '\n', and - if +// includeDoubleQuote is true - '"' by '\"'. +func escapeString(v string, includeDoubleQuote bool) string { + if includeDoubleQuote { + return escapeWithDoubleQuote.Replace(v) + } + + return escape.Replace(v) +} diff --git a/vendor/github.com/m3db/prometheus_common/expfmt/text_parse.go b/vendor/github.com/m3db/prometheus_common/expfmt/text_parse.go new file mode 100644 index 00000000..dff13264 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/expfmt/text_parse.go @@ -0,0 +1,753 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "bufio" + "bytes" + "fmt" + "io" + "math" + "strconv" + "strings" + + dto "github.com/m3db/prometheus_client_model/go" + + "github.com/golang/protobuf/proto" + "github.com/m3db/prometheus_common/model" +) + +// A stateFn is a function that represents a state in a state machine. By +// executing it, the state is progressed to the next state. The stateFn returns +// another stateFn, which represents the new state. The end state is represented +// by nil. +type stateFn func() stateFn + +// ParseError signals errors while parsing the simple and flat text-based +// exchange format. +type ParseError struct { + Line int + Msg string +} + +// Error implements the error interface. +func (e ParseError) Error() string { + return fmt.Sprintf("text format parsing error in line %d: %s", e.Line, e.Msg) +} + +// TextParser is used to parse the simple and flat text-based exchange format. Its +// zero value is ready to use. +type TextParser struct { + metricFamiliesByName map[string]*dto.MetricFamily + buf *bufio.Reader // Where the parsed input is read through. + err error // Most recent error. + lineCount int // Tracks the line count for error messages. + currentByte byte // The most recent byte read. + currentToken bytes.Buffer // Re-used each time a token has to be gathered from multiple bytes. + currentMF *dto.MetricFamily + currentMetric *dto.Metric + currentLabelPair *dto.LabelPair + + // The remaining member variables are only used for summaries/histograms. + currentLabels map[string]string // All labels including '__name__' but excluding 'quantile'/'le' + // Summary specific. + summaries map[uint64]*dto.Metric // Key is created with LabelsToSignature. + currentQuantile float64 + // Histogram specific. + histograms map[uint64]*dto.Metric // Key is created with LabelsToSignature. + currentBucket float64 + // These tell us if the currently processed line ends on '_count' or + // '_sum' respectively and belong to a summary/histogram, representing the sample + // count and sum of that summary/histogram. + currentIsSummaryCount, currentIsSummarySum bool + currentIsHistogramCount, currentIsHistogramSum bool +} + +// TextToMetricFamilies reads 'in' as the simple and flat text-based exchange +// format and creates MetricFamily proto messages. It returns the MetricFamily +// proto messages in a map where the metric names are the keys, along with any +// error encountered. +// +// If the input contains duplicate metrics (i.e. lines with the same metric name +// and exactly the same label set), the resulting MetricFamily will contain +// duplicate Metric proto messages. Similar is true for duplicate label +// names. Checks for duplicates have to be performed separately, if required. +// Also note that neither the metrics within each MetricFamily are sorted nor +// the label pairs within each Metric. Sorting is not required for the most +// frequent use of this method, which is sample ingestion in the Prometheus +// server. However, for presentation purposes, you might want to sort the +// metrics, and in some cases, you must sort the labels, e.g. for consumption by +// the metric family injection hook of the Prometheus registry. +// +// Summaries and histograms are rather special beasts. You would probably not +// use them in the simple text format anyway. This method can deal with +// summaries and histograms if they are presented in exactly the way the +// text.Create function creates them. +// +// This method must not be called concurrently. If you want to parse different +// input concurrently, instantiate a separate Parser for each goroutine. +func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricFamily, error) { + p.reset(in) + for nextState := p.startOfLine; nextState != nil; nextState = nextState() { + // Magic happens here... + } + // Get rid of empty metric families. + for k, mf := range p.metricFamiliesByName { + if len(mf.GetMetric()) == 0 { + delete(p.metricFamiliesByName, k) + } + } + // If p.err is io.EOF now, we have run into a premature end of the input + // stream. Turn this error into something nicer and more + // meaningful. (io.EOF is often used as a signal for the legitimate end + // of an input stream.) + if p.err == io.EOF { + p.parseError("unexpected end of input stream") + } + return p.metricFamiliesByName, p.err +} + +func (p *TextParser) reset(in io.Reader) { + p.metricFamiliesByName = map[string]*dto.MetricFamily{} + if p.buf == nil { + p.buf = bufio.NewReader(in) + } else { + p.buf.Reset(in) + } + p.err = nil + p.lineCount = 0 + if p.summaries == nil || len(p.summaries) > 0 { + p.summaries = map[uint64]*dto.Metric{} + } + if p.histograms == nil || len(p.histograms) > 0 { + p.histograms = map[uint64]*dto.Metric{} + } + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() +} + +// startOfLine represents the state where the next byte read from p.buf is the +// start of a line (or whitespace leading up to it). +func (p *TextParser) startOfLine() stateFn { + p.lineCount++ + if p.skipBlankTab(); p.err != nil { + // End of input reached. This is the only case where + // that is not an error but a signal that we are done. + p.err = nil + return nil + } + switch p.currentByte { + case '#': + return p.startComment + case '\n': + return p.startOfLine // Empty line, start the next one. + } + return p.readingMetricName +} + +// startComment represents the state where the next byte read from p.buf is the +// start of a comment (or whitespace leading up to it). +func (p *TextParser) startComment() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + return p.startOfLine + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + // If we have hit the end of line already, there is nothing left + // to do. This is not considered a syntax error. + if p.currentByte == '\n' { + return p.startOfLine + } + keyword := p.currentToken.String() + if keyword != "HELP" && keyword != "TYPE" { + // Generic comment, ignore by fast forwarding to end of line. + for p.currentByte != '\n' { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return nil // Unexpected end of input. + } + } + return p.startOfLine + } + // There is something. Next has to be a metric name. + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenAsMetricName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + if !isBlankOrTab(p.currentByte) { + p.parseError("invalid metric name in comment") + return nil + } + p.setOrCreateCurrentMF() + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + switch keyword { + case "HELP": + return p.readingHelp + case "TYPE": + return p.readingType + } + panic(fmt.Sprintf("code error: unexpected keyword %q", keyword)) +} + +// readingMetricName represents the state where the last byte read (now in +// p.currentByte) is the first byte of a metric name. +func (p *TextParser) readingMetricName() stateFn { + if p.readTokenAsMetricName(); p.err != nil { + return nil + } + if p.currentToken.Len() == 0 { + p.parseError("invalid metric name") + return nil + } + p.setOrCreateCurrentMF() + // Now is the time to fix the type if it hasn't happened yet. + if p.currentMF.Type == nil { + p.currentMF.Type = dto.MetricType_UNTYPED.Enum() + } + p.currentMetric = &dto.Metric{} + // Do not append the newly created currentMetric to + // currentMF.Metric right now. First wait if this is a summary, + // and the metric exists already, which we can only know after + // having read all the labels. + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingLabels +} + +// readingLabels represents the state where the last byte read (now in +// p.currentByte) is either the first byte of the label set (i.e. a '{'), or the +// first byte of the value (otherwise). +func (p *TextParser) readingLabels() stateFn { + // Summaries/histograms are special. We have to reset the + // currentLabels map, currentQuantile and currentBucket before starting to + // read labels. + if p.currentMF.GetType() == dto.MetricType_SUMMARY || p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + p.currentLabels = map[string]string{} + p.currentLabels[string(model.MetricNameLabel)] = p.currentMF.GetName() + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() + } + if p.currentByte != '{' { + return p.readingValue + } + return p.startLabelName +} + +// startLabelName represents the state where the next byte read from p.buf is +// the start of a label name (or whitespace leading up to it). +func (p *TextParser) startLabelName() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '}' { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + } + if p.readTokenAsLabelName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() == 0 { + p.parseError(fmt.Sprintf("invalid label name for metric %q", p.currentMF.GetName())) + return nil + } + p.currentLabelPair = &dto.LabelPair{Name: proto.String(p.currentToken.String())} + if p.currentLabelPair.GetName() == string(model.MetricNameLabel) { + p.parseError(fmt.Sprintf("label name %q is reserved", model.MetricNameLabel)) + return nil + } + // Special summary/histogram treatment. Don't add 'quantile' and 'le' + // labels to 'real' labels. + if !(p.currentMF.GetType() == dto.MetricType_SUMMARY && p.currentLabelPair.GetName() == model.QuantileLabel) && + !(p.currentMF.GetType() == dto.MetricType_HISTOGRAM && p.currentLabelPair.GetName() == model.BucketLabel) { + p.currentMetric.Label = append(p.currentMetric.Label, p.currentLabelPair) + } + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '=' { + p.parseError(fmt.Sprintf("expected '=' after label name, found %q", p.currentByte)) + return nil + } + return p.startLabelValue +} + +// startLabelValue represents the state where the next byte read from p.buf is +// the start of a (quoted) label value (or whitespace leading up to it). +func (p *TextParser) startLabelValue() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '"' { + p.parseError(fmt.Sprintf("expected '\"' at start of label value, found %q", p.currentByte)) + return nil + } + if p.readTokenAsLabelValue(); p.err != nil { + return nil + } + p.currentLabelPair.Value = proto.String(p.currentToken.String()) + // Special treatment of summaries: + // - Quantile labels are special, will result in dto.Quantile later. + // - Other labels have to be added to currentLabels for signature calculation. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if p.currentLabelPair.GetName() == model.QuantileLabel { + if p.currentQuantile, p.err = strconv.ParseFloat(p.currentLabelPair.GetValue(), 64); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'quantile' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + // Similar special treatment of histograms. + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentLabelPair.GetName() == model.BucketLabel { + if p.currentBucket, p.err = strconv.ParseFloat(p.currentLabelPair.GetValue(), 64); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'le' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + switch p.currentByte { + case ',': + return p.startLabelName + + case '}': + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + default: + p.parseError(fmt.Sprintf("unexpected end of label value %q", p.currentLabelPair.Value)) + return nil + } +} + +// readingValue represents the state where the last byte read (now in +// p.currentByte) is the first byte of the sample value (i.e. a float). +func (p *TextParser) readingValue() stateFn { + // When we are here, we have read all the labels, so for the + // special case of a summary/histogram, we can finally find out + // if the metric already exists. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + signature := model.LabelsToSignature(p.currentLabels) + if summary := p.summaries[signature]; summary != nil { + p.currentMetric = summary + } else { + p.summaries[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + signature := model.LabelsToSignature(p.currentLabels) + if histogram := p.histograms[signature]; histogram != nil { + p.currentMetric = histogram + } else { + p.histograms[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else { + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + value, err := strconv.ParseFloat(p.currentToken.String(), 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value, got %q", p.currentToken.String())) + return nil + } + switch p.currentMF.GetType() { + case dto.MetricType_COUNTER: + p.currentMetric.Counter = &dto.Counter{Value: proto.Float64(value)} + case dto.MetricType_GAUGE: + p.currentMetric.Gauge = &dto.Gauge{Value: proto.Float64(value)} + case dto.MetricType_UNTYPED: + p.currentMetric.Untyped = &dto.Untyped{Value: proto.Float64(value)} + case dto.MetricType_SUMMARY: + // *sigh* + if p.currentMetric.Summary == nil { + p.currentMetric.Summary = &dto.Summary{} + } + switch { + case p.currentIsSummaryCount: + p.currentMetric.Summary.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsSummarySum: + p.currentMetric.Summary.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentQuantile): + p.currentMetric.Summary.Quantile = append( + p.currentMetric.Summary.Quantile, + &dto.Quantile{ + Quantile: proto.Float64(p.currentQuantile), + Value: proto.Float64(value), + }, + ) + } + case dto.MetricType_HISTOGRAM: + // *sigh* + if p.currentMetric.Histogram == nil { + p.currentMetric.Histogram = &dto.Histogram{} + } + switch { + case p.currentIsHistogramCount: + p.currentMetric.Histogram.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsHistogramSum: + p.currentMetric.Histogram.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentBucket): + p.currentMetric.Histogram.Bucket = append( + p.currentMetric.Histogram.Bucket, + &dto.Bucket{ + UpperBound: proto.Float64(p.currentBucket), + CumulativeCount: proto.Uint64(uint64(value)), + }, + ) + } + default: + p.err = fmt.Errorf("unexpected type for metric name %q", p.currentMF.GetName()) + } + if p.currentByte == '\n' { + return p.startOfLine + } + return p.startTimestamp +} + +// startTimestamp represents the state where the next byte read from p.buf is +// the start of the timestamp (or whitespace leading up to it). +func (p *TextParser) startTimestamp() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + timestamp, err := strconv.ParseInt(p.currentToken.String(), 10, 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected integer as timestamp, got %q", p.currentToken.String())) + return nil + } + p.currentMetric.TimestampMs = proto.Int64(timestamp) + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() > 0 { + p.parseError(fmt.Sprintf("spurious string after timestamp: %q", p.currentToken.String())) + return nil + } + return p.startOfLine +} + +// readingHelp represents the state where the last byte read (now in +// p.currentByte) is the first byte of the docstring after 'HELP'. +func (p *TextParser) readingHelp() stateFn { + if p.currentMF.Help != nil { + p.parseError(fmt.Sprintf("second HELP line for metric name %q", p.currentMF.GetName())) + return nil + } + // Rest of line is the docstring. + if p.readTokenUntilNewline(true); p.err != nil { + return nil // Unexpected end of input. + } + p.currentMF.Help = proto.String(p.currentToken.String()) + return p.startOfLine +} + +// readingType represents the state where the last byte read (now in +// p.currentByte) is the first byte of the type hint after 'HELP'. +func (p *TextParser) readingType() stateFn { + if p.currentMF.Type != nil { + p.parseError(fmt.Sprintf("second TYPE line for metric name %q, or TYPE reported after samples", p.currentMF.GetName())) + return nil + } + // Rest of line is the type. + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + metricType, ok := dto.MetricType_value[strings.ToUpper(p.currentToken.String())] + if !ok { + p.parseError(fmt.Sprintf("unknown metric type %q", p.currentToken.String())) + return nil + } + p.currentMF.Type = dto.MetricType(metricType).Enum() + return p.startOfLine +} + +// parseError sets p.err to a ParseError at the current line with the given +// message. +func (p *TextParser) parseError(msg string) { + p.err = ParseError{ + Line: p.lineCount, + Msg: msg, + } +} + +// skipBlankTab reads (and discards) bytes from p.buf until it encounters a byte +// that is neither ' ' nor '\t'. That byte is left in p.currentByte. +func (p *TextParser) skipBlankTab() { + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil || !isBlankOrTab(p.currentByte) { + return + } + } +} + +// skipBlankTabIfCurrentBlankTab works exactly as skipBlankTab but doesn't do +// anything if p.currentByte is neither ' ' nor '\t'. +func (p *TextParser) skipBlankTabIfCurrentBlankTab() { + if isBlankOrTab(p.currentByte) { + p.skipBlankTab() + } +} + +// readTokenUntilWhitespace copies bytes from p.buf into p.currentToken. The +// first byte considered is the byte already read (now in p.currentByte). The +// first whitespace byte encountered is still copied into p.currentByte, but not +// into p.currentToken. +func (p *TextParser) readTokenUntilWhitespace() { + p.currentToken.Reset() + for p.err == nil && !isBlankOrTab(p.currentByte) && p.currentByte != '\n' { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenUntilNewline copies bytes from p.buf into p.currentToken. The first +// byte considered is the byte already read (now in p.currentByte). The first +// newline byte encountered is still copied into p.currentByte, but not into +// p.currentToken. If recognizeEscapeSequence is true, two escape sequences are +// recognized: '\\' tranlates into '\', and '\n' into a line-feed character. All +// other escape sequences are invalid and cause an error. +func (p *TextParser) readTokenUntilNewline(recognizeEscapeSequence bool) { + p.currentToken.Reset() + escaped := false + for p.err == nil { + if recognizeEscapeSequence && escaped { + switch p.currentByte { + case '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + } else { + switch p.currentByte { + case '\n': + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenAsMetricName copies a metric name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a metric name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsMetricName() { + p.currentToken.Reset() + if !isValidMetricNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidMetricNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelName copies a label name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a label name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsLabelName() { + p.currentToken.Reset() + if !isValidLabelNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidLabelNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelValue copies a label value from p.buf into p.currentToken. +// In contrast to the other 'readTokenAs...' functions, which start with the +// last read byte in p.currentByte, this method ignores p.currentByte and starts +// with reading a new byte from p.buf. The first byte not part of a label value +// is still copied into p.currentByte, but not into p.currentToken. +func (p *TextParser) readTokenAsLabelValue() { + p.currentToken.Reset() + escaped := false + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return + } + if escaped { + switch p.currentByte { + case '"', '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + continue + } + switch p.currentByte { + case '"': + return + case '\n': + p.parseError(fmt.Sprintf("label value %q contains unescaped new-line", p.currentToken.String())) + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } +} + +func (p *TextParser) setOrCreateCurrentMF() { + p.currentIsSummaryCount = false + p.currentIsSummarySum = false + p.currentIsHistogramCount = false + p.currentIsHistogramSum = false + name := p.currentToken.String() + if p.currentMF = p.metricFamiliesByName[name]; p.currentMF != nil { + return + } + // Try out if this is a _sum or _count for a summary/histogram. + summaryName := summaryMetricName(name) + if p.currentMF = p.metricFamiliesByName[summaryName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if isCount(name) { + p.currentIsSummaryCount = true + } + if isSum(name) { + p.currentIsSummarySum = true + } + return + } + } + histogramName := histogramMetricName(name) + if p.currentMF = p.metricFamiliesByName[histogramName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if isCount(name) { + p.currentIsHistogramCount = true + } + if isSum(name) { + p.currentIsHistogramSum = true + } + return + } + } + p.currentMF = &dto.MetricFamily{Name: proto.String(name)} + p.metricFamiliesByName[name] = p.currentMF +} + +func isValidLabelNameStart(b byte) bool { + return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' +} + +func isValidLabelNameContinuation(b byte) bool { + return isValidLabelNameStart(b) || (b >= '0' && b <= '9') +} + +func isValidMetricNameStart(b byte) bool { + return isValidLabelNameStart(b) || b == ':' +} + +func isValidMetricNameContinuation(b byte) bool { + return isValidLabelNameContinuation(b) || b == ':' +} + +func isBlankOrTab(b byte) bool { + return b == ' ' || b == '\t' +} + +func isCount(name string) bool { + return len(name) > 6 && name[len(name)-6:] == "_count" +} + +func isSum(name string) bool { + return len(name) > 4 && name[len(name)-4:] == "_sum" +} + +func isBucket(name string) bool { + return len(name) > 7 && name[len(name)-7:] == "_bucket" +} + +func summaryMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + default: + return name + } +} + +func histogramMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + case isBucket(name): + return name[:len(name)-7] + default: + return name + } +} diff --git a/vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/README.txt b/vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/README.txt new file mode 100644 index 00000000..7723656d --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/README.txt @@ -0,0 +1,67 @@ +PACKAGE + +package goautoneg +import "bitbucket.org/ww/goautoneg" + +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the Open Knowledge Foundation Ltd. 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 +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +FUNCTIONS + +func Negotiate(header string, alternatives []string) (content_type string) +Negotiate the most appropriate content_type given the accept header +and a list of alternatives. + +func ParseAccept(header string) (accept []Accept) +Parse an Accept Header string returning a sorted list +of clauses + + +TYPES + +type Accept struct { + Type, SubType string + Q float32 + Params map[string]string +} +Structure to represent a clause in an HTTP Accept Header + + +SUBDIRECTORIES + + .hg diff --git a/vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/autoneg.go b/vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/autoneg.go new file mode 100644 index 00000000..648b38cb --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/autoneg.go @@ -0,0 +1,162 @@ +/* +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the Open Knowledge Foundation Ltd. 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 +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ +package goautoneg + +import ( + "sort" + "strconv" + "strings" +) + +// Structure to represent a clause in an HTTP Accept Header +type Accept struct { + Type, SubType string + Q float64 + Params map[string]string +} + +// For internal use, so that we can use the sort interface +type accept_slice []Accept + +func (accept accept_slice) Len() int { + slice := []Accept(accept) + return len(slice) +} + +func (accept accept_slice) Less(i, j int) bool { + slice := []Accept(accept) + ai, aj := slice[i], slice[j] + if ai.Q > aj.Q { + return true + } + if ai.Type != "*" && aj.Type == "*" { + return true + } + if ai.SubType != "*" && aj.SubType == "*" { + return true + } + return false +} + +func (accept accept_slice) Swap(i, j int) { + slice := []Accept(accept) + slice[i], slice[j] = slice[j], slice[i] +} + +// Parse an Accept Header string returning a sorted list +// of clauses +func ParseAccept(header string) (accept []Accept) { + parts := strings.Split(header, ",") + accept = make([]Accept, 0, len(parts)) + for _, part := range parts { + part := strings.Trim(part, " ") + + a := Accept{} + a.Params = make(map[string]string) + a.Q = 1.0 + + mrp := strings.Split(part, ";") + + media_range := mrp[0] + sp := strings.Split(media_range, "/") + a.Type = strings.Trim(sp[0], " ") + + switch { + case len(sp) == 1 && a.Type == "*": + a.SubType = "*" + case len(sp) == 2: + a.SubType = strings.Trim(sp[1], " ") + default: + continue + } + + if len(mrp) == 1 { + accept = append(accept, a) + continue + } + + for _, param := range mrp[1:] { + sp := strings.SplitN(param, "=", 2) + if len(sp) != 2 { + continue + } + token := strings.Trim(sp[0], " ") + if token == "q" { + a.Q, _ = strconv.ParseFloat(sp[1], 32) + } else { + a.Params[token] = strings.Trim(sp[1], " ") + } + } + + accept = append(accept, a) + } + + slice := accept_slice(accept) + sort.Sort(slice) + + return +} + +// Negotiate the most appropriate content_type given the accept header +// and a list of alternatives. +func Negotiate(header string, alternatives []string) (content_type string) { + asp := make([][]string, 0, len(alternatives)) + for _, ctype := range alternatives { + asp = append(asp, strings.SplitN(ctype, "/", 2)) + } + for _, clause := range ParseAccept(header) { + for i, ctsp := range asp { + if clause.Type == ctsp[0] && clause.SubType == ctsp[1] { + content_type = alternatives[i] + return + } + if clause.Type == ctsp[0] && clause.SubType == "*" { + content_type = alternatives[i] + return + } + if clause.Type == "*" && clause.SubType == "*" { + content_type = alternatives[i] + return + } + } + } + return +} diff --git a/vendor/github.com/m3db/prometheus_common/model/alert.go b/vendor/github.com/m3db/prometheus_common/model/alert.go new file mode 100644 index 00000000..35e739c7 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/alert.go @@ -0,0 +1,136 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "time" +) + +type AlertStatus string + +const ( + AlertFiring AlertStatus = "firing" + AlertResolved AlertStatus = "resolved" +) + +// Alert is a generic representation of an alert in the Prometheus eco-system. +type Alert struct { + // Label value pairs for purpose of aggregation, matching, and disposition + // dispatching. This must minimally include an "alertname" label. + Labels LabelSet `json:"labels"` + + // Extra key/value information which does not define alert identity. + Annotations LabelSet `json:"annotations"` + + // The known time range for this alert. Both ends are optional. + StartsAt time.Time `json:"startsAt,omitempty"` + EndsAt time.Time `json:"endsAt,omitempty"` + GeneratorURL string `json:"generatorURL"` +} + +// Name returns the name of the alert. It is equivalent to the "alertname" label. +func (a *Alert) Name() string { + return string(a.Labels[AlertNameLabel]) +} + +// Fingerprint returns a unique hash for the alert. It is equivalent to +// the fingerprint of the alert's label set. +func (a *Alert) Fingerprint() Fingerprint { + return a.Labels.Fingerprint() +} + +func (a *Alert) String() string { + s := fmt.Sprintf("%s[%s]", a.Name(), a.Fingerprint().String()[:7]) + if a.Resolved() { + return s + "[resolved]" + } + return s + "[active]" +} + +// Resolved returns true iff the activity interval ended in the past. +func (a *Alert) Resolved() bool { + return a.ResolvedAt(time.Now()) +} + +// ResolvedAt returns true off the activity interval ended before +// the given timestamp. +func (a *Alert) ResolvedAt(ts time.Time) bool { + if a.EndsAt.IsZero() { + return false + } + return !a.EndsAt.After(ts) +} + +// Status returns the status of the alert. +func (a *Alert) Status() AlertStatus { + if a.Resolved() { + return AlertResolved + } + return AlertFiring +} + +// Validate checks whether the alert data is inconsistent. +func (a *Alert) Validate() error { + if a.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if !a.EndsAt.IsZero() && a.EndsAt.Before(a.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if err := a.Labels.Validate(); err != nil { + return fmt.Errorf("invalid label set: %s", err) + } + if len(a.Labels) == 0 { + return fmt.Errorf("at least one label pair required") + } + if err := a.Annotations.Validate(); err != nil { + return fmt.Errorf("invalid annotations: %s", err) + } + return nil +} + +// Alert is a list of alerts that can be sorted in chronological order. +type Alerts []*Alert + +func (as Alerts) Len() int { return len(as) } +func (as Alerts) Swap(i, j int) { as[i], as[j] = as[j], as[i] } + +func (as Alerts) Less(i, j int) bool { + if as[i].StartsAt.Before(as[j].StartsAt) { + return true + } + if as[i].EndsAt.Before(as[j].EndsAt) { + return true + } + return as[i].Fingerprint() < as[j].Fingerprint() +} + +// HasFiring returns true iff one of the alerts is not resolved. +func (as Alerts) HasFiring() bool { + for _, a := range as { + if !a.Resolved() { + return true + } + } + return false +} + +// Status returns StatusFiring iff at least one of the alerts is firing. +func (as Alerts) Status() AlertStatus { + if as.HasFiring() { + return AlertFiring + } + return AlertResolved +} diff --git a/vendor/github.com/m3db/prometheus_common/model/fingerprinting.go b/vendor/github.com/m3db/prometheus_common/model/fingerprinting.go new file mode 100644 index 00000000..fc4de410 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/fingerprinting.go @@ -0,0 +1,105 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "strconv" +) + +// Fingerprint provides a hash-capable representation of a Metric. +// For our purposes, FNV-1A 64-bit is used. +type Fingerprint uint64 + +// FingerprintFromString transforms a string representation into a Fingerprint. +func FingerprintFromString(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + return Fingerprint(num), err +} + +// ParseFingerprint parses the input string into a fingerprint. +func ParseFingerprint(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + if err != nil { + return 0, err + } + return Fingerprint(num), nil +} + +func (f Fingerprint) String() string { + return fmt.Sprintf("%016x", uint64(f)) +} + +// Fingerprints represents a collection of Fingerprint subject to a given +// natural sorting scheme. It implements sort.Interface. +type Fingerprints []Fingerprint + +// Len implements sort.Interface. +func (f Fingerprints) Len() int { + return len(f) +} + +// Less implements sort.Interface. +func (f Fingerprints) Less(i, j int) bool { + return f[i] < f[j] +} + +// Swap implements sort.Interface. +func (f Fingerprints) Swap(i, j int) { + f[i], f[j] = f[j], f[i] +} + +// FingerprintSet is a set of Fingerprints. +type FingerprintSet map[Fingerprint]struct{} + +// Equal returns true if both sets contain the same elements (and not more). +func (s FingerprintSet) Equal(o FingerprintSet) bool { + if len(s) != len(o) { + return false + } + + for k := range s { + if _, ok := o[k]; !ok { + return false + } + } + + return true +} + +// Intersection returns the elements contained in both sets. +func (s FingerprintSet) Intersection(o FingerprintSet) FingerprintSet { + myLength, otherLength := len(s), len(o) + if myLength == 0 || otherLength == 0 { + return FingerprintSet{} + } + + subSet := s + superSet := o + + if otherLength < myLength { + subSet = o + superSet = s + } + + out := FingerprintSet{} + + for k := range subSet { + if _, ok := superSet[k]; ok { + out[k] = struct{}{} + } + } + + return out +} diff --git a/vendor/github.com/m3db/prometheus_common/model/fnv.go b/vendor/github.com/m3db/prometheus_common/model/fnv.go new file mode 100644 index 00000000..038fc1c9 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/fnv.go @@ -0,0 +1,42 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/vendor/github.com/m3db/prometheus_common/model/labels.go b/vendor/github.com/m3db/prometheus_common/model/labels.go new file mode 100644 index 00000000..41051a01 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/labels.go @@ -0,0 +1,210 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "regexp" + "strings" + "unicode/utf8" +) + +const ( + // AlertNameLabel is the name of the label containing the an alert's name. + AlertNameLabel = "alertname" + + // ExportedLabelPrefix is the prefix to prepend to the label names present in + // exported metrics if a label of the same name is added by the server. + ExportedLabelPrefix = "exported_" + + // MetricNameLabel is the label name indicating the metric name of a + // timeseries. + MetricNameLabel = "__name__" + + // SchemeLabel is the name of the label that holds the scheme on which to + // scrape a target. + SchemeLabel = "__scheme__" + + // AddressLabel is the name of the label that holds the address of + // a scrape target. + AddressLabel = "__address__" + + // MetricsPathLabel is the name of the label that holds the path on which to + // scrape a target. + MetricsPathLabel = "__metrics_path__" + + // ReservedLabelPrefix is a prefix which is not legal in user-supplied + // label names. + ReservedLabelPrefix = "__" + + // MetaLabelPrefix is a prefix for labels that provide meta information. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. + MetaLabelPrefix = "__meta_" + + // TmpLabelPrefix is a prefix for temporary labels as part of relabelling. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. This is reserved for use in + // Prometheus configuration files by users. + TmpLabelPrefix = "__tmp_" + + // ParamLabelPrefix is a prefix for labels that provide URL parameters + // used to scrape a target. + ParamLabelPrefix = "__param_" + + // JobLabel is the label name indicating the job from which a timeseries + // was scraped. + JobLabel = "job" + + // InstanceLabel is the label name used for the instance label. + InstanceLabel = "instance" + + // BucketLabel is used for the label that defines the upper bound of a + // bucket of a histogram ("le" -> "less or equal"). + BucketLabel = "le" + + // QuantileLabel is used for the label that defines the quantile in a + // summary. + QuantileLabel = "quantile" +) + +// LabelNameRE is a regular expression matching valid label names. Note that the +// IsValid method of LabelName performs the same check but faster than a match +// with this regular expression. +var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") + +// A LabelName is a key for a LabelSet or Metric. It has a value associated +// therewith. +type LabelName string + +// IsValid is true iff the label name matches the pattern of LabelNameRE. This +// method, however, does not use LabelNameRE for the check but a much faster +// hardcoded implementation. +func (ln LabelName) IsValid() bool { + if len(ln) == 0 { + return false + } + for i, b := range ln { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (ln *LabelName) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (ln *LabelName) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// LabelNames is a sortable LabelName slice. In implements sort.Interface. +type LabelNames []LabelName + +func (l LabelNames) Len() int { + return len(l) +} + +func (l LabelNames) Less(i, j int) bool { + return l[i] < l[j] +} + +func (l LabelNames) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +func (l LabelNames) String() string { + labelStrings := make([]string, 0, len(l)) + for _, label := range l { + labelStrings = append(labelStrings, string(label)) + } + return strings.Join(labelStrings, ", ") +} + +// A LabelValue is an associated value for a LabelName. +type LabelValue string + +// IsValid returns true iff the string is a valid UTF8. +func (lv LabelValue) IsValid() bool { + return utf8.ValidString(string(lv)) +} + +// LabelValues is a sortable LabelValue slice. It implements sort.Interface. +type LabelValues []LabelValue + +func (l LabelValues) Len() int { + return len(l) +} + +func (l LabelValues) Less(i, j int) bool { + return string(l[i]) < string(l[j]) +} + +func (l LabelValues) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +// LabelPair pairs a name with a value. +type LabelPair struct { + Name LabelName + Value LabelValue +} + +// LabelPairs is a sortable slice of LabelPair pointers. It implements +// sort.Interface. +type LabelPairs []*LabelPair + +func (l LabelPairs) Len() int { + return len(l) +} + +func (l LabelPairs) Less(i, j int) bool { + switch { + case l[i].Name > l[j].Name: + return false + case l[i].Name < l[j].Name: + return true + case l[i].Value > l[j].Value: + return false + case l[i].Value < l[j].Value: + return true + default: + return false + } +} + +func (l LabelPairs) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} diff --git a/vendor/github.com/m3db/prometheus_common/model/labelset.go b/vendor/github.com/m3db/prometheus_common/model/labelset.go new file mode 100644 index 00000000..6eda08a7 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/labelset.go @@ -0,0 +1,169 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "sort" + "strings" +) + +// A LabelSet is a collection of LabelName and LabelValue pairs. The LabelSet +// may be fully-qualified down to the point where it may resolve to a single +// Metric in the data store or not. All operations that occur within the realm +// of a LabelSet can emit a vector of Metric entities to which the LabelSet may +// match. +type LabelSet map[LabelName]LabelValue + +// Validate checks whether all names and values in the label set +// are valid. +func (ls LabelSet) Validate() error { + for ln, lv := range ls { + if !ln.IsValid() { + return fmt.Errorf("invalid name %q", ln) + } + if !lv.IsValid() { + return fmt.Errorf("invalid value %q", lv) + } + } + return nil +} + +// Equal returns true iff both label sets have exactly the same key/value pairs. +func (ls LabelSet) Equal(o LabelSet) bool { + if len(ls) != len(o) { + return false + } + for ln, lv := range ls { + olv, ok := o[ln] + if !ok { + return false + } + if olv != lv { + return false + } + } + return true +} + +// Before compares the metrics, using the following criteria: +// +// If m has fewer labels than o, it is before o. If it has more, it is not. +// +// If the number of labels is the same, the superset of all label names is +// sorted alphanumerically. The first differing label pair found in that order +// determines the outcome: If the label does not exist at all in m, then m is +// before o, and vice versa. Otherwise the label value is compared +// alphanumerically. +// +// If m and o are equal, the method returns false. +func (ls LabelSet) Before(o LabelSet) bool { + if len(ls) < len(o) { + return true + } + if len(ls) > len(o) { + return false + } + + lns := make(LabelNames, 0, len(ls)+len(o)) + for ln := range ls { + lns = append(lns, ln) + } + for ln := range o { + lns = append(lns, ln) + } + // It's probably not worth it to de-dup lns. + sort.Sort(lns) + for _, ln := range lns { + mlv, ok := ls[ln] + if !ok { + return true + } + olv, ok := o[ln] + if !ok { + return false + } + if mlv < olv { + return true + } + if mlv > olv { + return false + } + } + return false +} + +// Clone returns a copy of the label set. +func (ls LabelSet) Clone() LabelSet { + lsn := make(LabelSet, len(ls)) + for ln, lv := range ls { + lsn[ln] = lv + } + return lsn +} + +// Merge is a helper function to non-destructively merge two label sets. +func (l LabelSet) Merge(other LabelSet) LabelSet { + result := make(LabelSet, len(l)) + + for k, v := range l { + result[k] = v + } + + for k, v := range other { + result[k] = v + } + + return result +} + +func (l LabelSet) String() string { + lstrs := make([]string, 0, len(l)) + for l, v := range l { + lstrs = append(lstrs, fmt.Sprintf("%s=%q", l, v)) + } + + sort.Strings(lstrs) + return fmt.Sprintf("{%s}", strings.Join(lstrs, ", ")) +} + +// Fingerprint returns the LabelSet's fingerprint. +func (ls LabelSet) Fingerprint() Fingerprint { + return labelSetToFingerprint(ls) +} + +// FastFingerprint returns the LabelSet's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (ls LabelSet) FastFingerprint() Fingerprint { + return labelSetToFastFingerprint(ls) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (l *LabelSet) UnmarshalJSON(b []byte) error { + var m map[LabelName]LabelValue + if err := json.Unmarshal(b, &m); err != nil { + return err + } + // encoding/json only unmarshals maps of the form map[string]T. It treats + // LabelName as a string and does not call its UnmarshalJSON method. + // Thus, we have to replicate the behavior here. + for ln := range m { + if !ln.IsValid() { + return fmt.Errorf("%q is not a valid label name", ln) + } + } + *l = LabelSet(m) + return nil +} diff --git a/vendor/github.com/m3db/prometheus_common/model/metric.go b/vendor/github.com/m3db/prometheus_common/model/metric.go new file mode 100644 index 00000000..9dff899c --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/metric.go @@ -0,0 +1,103 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "regexp" + "sort" + "strings" +) + +var ( + separator = []byte{0} + // MetricNameRE is a regular expression matching valid metric + // names. Note that the IsValidMetricName function performs the same + // check but faster than a match with this regular expression. + MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) +) + +// A Metric is similar to a LabelSet, but the key difference is that a Metric is +// a singleton and refers to one and only one stream of samples. +type Metric LabelSet + +// Equal compares the metrics. +func (m Metric) Equal(o Metric) bool { + return LabelSet(m).Equal(LabelSet(o)) +} + +// Before compares the metrics' underlying label sets. +func (m Metric) Before(o Metric) bool { + return LabelSet(m).Before(LabelSet(o)) +} + +// Clone returns a copy of the Metric. +func (m Metric) Clone() Metric { + clone := Metric{} + for k, v := range m { + clone[k] = v + } + return clone +} + +func (m Metric) String() string { + metricName, hasName := m[MetricNameLabel] + numLabels := len(m) - 1 + if !hasName { + numLabels = len(m) + } + labelStrings := make([]string, 0, numLabels) + for label, value := range m { + if label != MetricNameLabel { + labelStrings = append(labelStrings, fmt.Sprintf("%s=%q", label, value)) + } + } + + switch numLabels { + case 0: + if hasName { + return string(metricName) + } + return "{}" + default: + sort.Strings(labelStrings) + return fmt.Sprintf("%s{%s}", metricName, strings.Join(labelStrings, ", ")) + } +} + +// Fingerprint returns a Metric's Fingerprint. +func (m Metric) Fingerprint() Fingerprint { + return LabelSet(m).Fingerprint() +} + +// FastFingerprint returns a Metric's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (m Metric) FastFingerprint() Fingerprint { + return LabelSet(m).FastFingerprint() +} + +// IsValidMetricName returns true iff name matches the pattern of MetricNameRE. +// This function, however, does not use MetricNameRE for the check but a much +// faster hardcoded implementation. +func IsValidMetricName(n LabelValue) bool { + if len(n) == 0 { + return false + } + for i, b := range n { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} diff --git a/vendor/github.com/m3db/prometheus_common/model/model.go b/vendor/github.com/m3db/prometheus_common/model/model.go new file mode 100644 index 00000000..a7b96917 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/model.go @@ -0,0 +1,16 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package model contains common data structures that are shared across +// Prometheus components and libraries. +package model diff --git a/vendor/github.com/m3db/prometheus_common/model/signature.go b/vendor/github.com/m3db/prometheus_common/model/signature.go new file mode 100644 index 00000000..8762b13c --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/signature.go @@ -0,0 +1,144 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "sort" +) + +// SeparatorByte is a byte that cannot occur in valid UTF-8 sequences and is +// used to separate label names, label values, and other strings from each other +// when calculating their combined hash value (aka signature aka fingerprint). +const SeparatorByte byte = 255 + +var ( + // cache the signature of an empty label set. + emptyLabelSignature = hashNew() +) + +// LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a +// given label set. (Collisions are possible but unlikely if the number of label +// sets the function is applied to is small.) +func LabelsToSignature(labels map[string]string) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + labelNames := make([]string, 0, len(labels)) + for labelName := range labels { + labelNames = append(labelNames, labelName) + } + sort.Strings(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, labelName) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, labels[labelName]) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// labelSetToFingerprint works exactly as LabelsToSignature but takes a LabelSet as +// parameter (rather than a label map) and returns a Fingerprint. +func labelSetToFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + labelNames := make(LabelNames, 0, len(ls)) + for labelName := range ls { + labelNames = append(labelNames, labelName) + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(ls[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return Fingerprint(sum) +} + +// labelSetToFastFingerprint works similar to labelSetToFingerprint but uses a +// faster and less allocation-heavy hash function, which is more susceptible to +// create hash collisions. Therefore, collision detection should be applied. +func labelSetToFastFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + var result uint64 + for labelName, labelValue := range ls { + sum := hashNew() + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(labelValue)) + result ^= sum + } + return Fingerprint(result) +} + +// SignatureForLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and only includes the labels with the +// specified LabelNames into the signature calculation. The labels passed in +// will be sorted by this function. +func SignatureForLabels(m Metric, labels ...LabelName) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + sort.Sort(LabelNames(labels)) + + sum := hashNew() + for _, label := range labels { + sum = hashAdd(sum, string(label)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[label])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// SignatureWithoutLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and excludes the labels with any of the +// specified LabelNames from the signature calculation. +func SignatureWithoutLabels(m Metric, labels map[LabelName]struct{}) uint64 { + if len(m) == 0 { + return emptyLabelSignature + } + + labelNames := make(LabelNames, 0, len(m)) + for labelName := range m { + if _, exclude := labels[labelName]; !exclude { + labelNames = append(labelNames, labelName) + } + } + if len(labelNames) == 0 { + return emptyLabelSignature + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} diff --git a/vendor/github.com/m3db/prometheus_common/model/silence.go b/vendor/github.com/m3db/prometheus_common/model/silence.go new file mode 100644 index 00000000..7538e299 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/silence.go @@ -0,0 +1,106 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "regexp" + "time" +) + +// Matcher describes a matches the value of a given label. +type Matcher struct { + Name LabelName `json:"name"` + Value string `json:"value"` + IsRegex bool `json:"isRegex"` +} + +func (m *Matcher) UnmarshalJSON(b []byte) error { + type plain Matcher + if err := json.Unmarshal(b, (*plain)(m)); err != nil { + return err + } + + if len(m.Name) == 0 { + return fmt.Errorf("label name in matcher must not be empty") + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return err + } + } + return nil +} + +// Validate returns true iff all fields of the matcher have valid values. +func (m *Matcher) Validate() error { + if !m.Name.IsValid() { + return fmt.Errorf("invalid name %q", m.Name) + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return fmt.Errorf("invalid regular expression %q", m.Value) + } + } else if !LabelValue(m.Value).IsValid() || len(m.Value) == 0 { + return fmt.Errorf("invalid value %q", m.Value) + } + return nil +} + +// Silence defines the representation of a silence definiton +// in the Prometheus eco-system. +type Silence struct { + ID uint64 `json:"id,omitempty"` + + Matchers []*Matcher `json:"matchers"` + + StartsAt time.Time `json:"startsAt"` + EndsAt time.Time `json:"endsAt"` + + CreatedAt time.Time `json:"createdAt,omitempty"` + CreatedBy string `json:"createdBy"` + Comment string `json:"comment,omitempty"` +} + +// Validate returns true iff all fields of the silence have valid values. +func (s *Silence) Validate() error { + if len(s.Matchers) == 0 { + return fmt.Errorf("at least one matcher required") + } + for _, m := range s.Matchers { + if err := m.Validate(); err != nil { + return fmt.Errorf("invalid matcher: %s", err) + } + } + if s.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if s.EndsAt.IsZero() { + return fmt.Errorf("end time missing") + } + if s.EndsAt.Before(s.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if s.CreatedBy == "" { + return fmt.Errorf("creator information missing") + } + if s.Comment == "" { + return fmt.Errorf("comment missing") + } + if s.CreatedAt.IsZero() { + return fmt.Errorf("creation timestamp missing") + } + return nil +} diff --git a/vendor/github.com/m3db/prometheus_common/model/time.go b/vendor/github.com/m3db/prometheus_common/model/time.go new file mode 100644 index 00000000..548968ae --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/time.go @@ -0,0 +1,249 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "math" + "regexp" + "strconv" + "strings" + "time" +) + +const ( + // MinimumTick is the minimum supported time resolution. This has to be + // at least time.Second in order for the code below to work. + minimumTick = time.Millisecond + // second is the Time duration equivalent to one second. + second = int64(time.Second / minimumTick) + // The number of nanoseconds per minimum tick. + nanosPerTick = int64(minimumTick / time.Nanosecond) + + // Earliest is the earliest Time representable. Handy for + // initializing a high watermark. + Earliest = Time(math.MinInt64) + // Latest is the latest Time representable. Handy for initializing + // a low watermark. + Latest = Time(math.MaxInt64) +) + +// Time is the number of milliseconds since the epoch +// (1970-01-01 00:00 UTC) excluding leap seconds. +type Time int64 + +// Interval describes and interval between two timestamps. +type Interval struct { + Start, End Time +} + +// Now returns the current time as a Time. +func Now() Time { + return TimeFromUnixNano(time.Now().UnixNano()) +} + +// TimeFromUnix returns the Time equivalent to the Unix Time t +// provided in seconds. +func TimeFromUnix(t int64) Time { + return Time(t * second) +} + +// TimeFromUnixNano returns the Time equivalent to the Unix Time +// t provided in nanoseconds. +func TimeFromUnixNano(t int64) Time { + return Time(t / nanosPerTick) +} + +// Equal reports whether two Times represent the same instant. +func (t Time) Equal(o Time) bool { + return t == o +} + +// Before reports whether the Time t is before o. +func (t Time) Before(o Time) bool { + return t < o +} + +// After reports whether the Time t is after o. +func (t Time) After(o Time) bool { + return t > o +} + +// Add returns the Time t + d. +func (t Time) Add(d time.Duration) Time { + return t + Time(d/minimumTick) +} + +// Sub returns the Duration t - o. +func (t Time) Sub(o Time) time.Duration { + return time.Duration(t-o) * minimumTick +} + +// Time returns the time.Time representation of t. +func (t Time) Time() time.Time { + return time.Unix(int64(t)/second, (int64(t)%second)*nanosPerTick) +} + +// Unix returns t as a Unix time, the number of seconds elapsed +// since January 1, 1970 UTC. +func (t Time) Unix() int64 { + return int64(t) / second +} + +// UnixNano returns t as a Unix time, the number of nanoseconds elapsed +// since January 1, 1970 UTC. +func (t Time) UnixNano() int64 { + return int64(t) * nanosPerTick +} + +// The number of digits after the dot. +var dotPrecision = int(math.Log10(float64(second))) + +// String returns a string representation of the Time. +func (t Time) String() string { + return strconv.FormatFloat(float64(t)/float64(second), 'f', -1, 64) +} + +// MarshalJSON implements the json.Marshaler interface. +func (t Time) MarshalJSON() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (t *Time) UnmarshalJSON(b []byte) error { + p := strings.Split(string(b), ".") + switch len(p) { + case 1: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + *t = Time(v * second) + + case 2: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + v *= second + + prec := dotPrecision - len(p[1]) + if prec < 0 { + p[1] = p[1][:dotPrecision] + } else if prec > 0 { + p[1] = p[1] + strings.Repeat("0", prec) + } + + va, err := strconv.ParseInt(p[1], 10, 32) + if err != nil { + return err + } + + *t = Time(v + va) + + default: + return fmt.Errorf("invalid time %q", string(b)) + } + return nil +} + +// Duration wraps time.Duration. It is used to parse the custom duration format +// from YAML. +// This type should not propagate beyond the scope of input/output processing. +type Duration time.Duration + +var durationRE = regexp.MustCompile("^([0-9]+)(y|w|d|h|m|s|ms)$") + +// StringToDuration parses a string into a time.Duration, assuming that a year +// always has 365d, a week always has 7d, and a day always has 24h. +func ParseDuration(durationStr string) (Duration, error) { + matches := durationRE.FindStringSubmatch(durationStr) + if len(matches) != 3 { + return 0, fmt.Errorf("not a valid duration string: %q", durationStr) + } + var ( + n, _ = strconv.Atoi(matches[1]) + dur = time.Duration(n) * time.Millisecond + ) + switch unit := matches[2]; unit { + case "y": + dur *= 1000 * 60 * 60 * 24 * 365 + case "w": + dur *= 1000 * 60 * 60 * 24 * 7 + case "d": + dur *= 1000 * 60 * 60 * 24 + case "h": + dur *= 1000 * 60 * 60 + case "m": + dur *= 1000 * 60 + case "s": + dur *= 1000 + case "ms": + // Value already correct + default: + return 0, fmt.Errorf("invalid time unit in duration string: %q", unit) + } + return Duration(dur), nil +} + +func (d Duration) String() string { + var ( + ms = int64(time.Duration(d) / time.Millisecond) + unit = "ms" + ) + factors := map[string]int64{ + "y": 1000 * 60 * 60 * 24 * 365, + "w": 1000 * 60 * 60 * 24 * 7, + "d": 1000 * 60 * 60 * 24, + "h": 1000 * 60 * 60, + "m": 1000 * 60, + "s": 1000, + "ms": 1, + } + + switch int64(0) { + case ms % factors["y"]: + unit = "y" + case ms % factors["w"]: + unit = "w" + case ms % factors["d"]: + unit = "d" + case ms % factors["h"]: + unit = "h" + case ms % factors["m"]: + unit = "m" + case ms % factors["s"]: + unit = "s" + } + return fmt.Sprintf("%v%v", ms/factors[unit], unit) +} + +// MarshalYAML implements the yaml.Marshaler interface. +func (d Duration) MarshalYAML() (interface{}, error) { + return d.String(), nil +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (d *Duration) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + dur, err := ParseDuration(s) + if err != nil { + return err + } + *d = dur + return nil +} diff --git a/vendor/github.com/m3db/prometheus_common/model/value.go b/vendor/github.com/m3db/prometheus_common/model/value.go new file mode 100644 index 00000000..7728abae --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/model/value.go @@ -0,0 +1,419 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "math" + "sort" + "strconv" + "strings" +) + +var ( + // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a + // non-existing sample pair. It is a SamplePair with timestamp Earliest and + // value 0.0. Note that the natural zero value of SamplePair has a timestamp + // of 0, which is possible to appear in a real SamplePair and thus not + // suitable to signal a non-existing SamplePair. + ZeroSamplePair = SamplePair{Timestamp: Earliest} + + // ZeroSample is the pseudo zero-value of Sample used to signal a + // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, + // and metric nil. Note that the natural zero value of Sample has a timestamp + // of 0, which is possible to appear in a real Sample and thus not suitable + // to signal a non-existing Sample. + ZeroSample = Sample{Timestamp: Earliest} +) + +// A SampleValue is a representation of a value for a given sample at a given +// time. +type SampleValue float64 + +// MarshalJSON implements json.Marshaler. +func (v SampleValue) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (v *SampleValue) UnmarshalJSON(b []byte) error { + if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { + return fmt.Errorf("sample value must be a quoted string") + } + f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) + if err != nil { + return err + } + *v = SampleValue(f) + return nil +} + +// Equal returns true if the value of v and o is equal or if both are NaN. Note +// that v==o is false if both are NaN. If you want the conventional float +// behavior, use == to compare two SampleValues. +func (v SampleValue) Equal(o SampleValue) bool { + if v == o { + return true + } + return math.IsNaN(float64(v)) && math.IsNaN(float64(o)) +} + +func (v SampleValue) String() string { + return strconv.FormatFloat(float64(v), 'f', -1, 64) +} + +// SamplePair pairs a SampleValue with a Timestamp. +type SamplePair struct { + Timestamp Time + Value SampleValue +} + +// MarshalJSON implements json.Marshaler. +func (s SamplePair) MarshalJSON() ([]byte, error) { + t, err := json.Marshal(s.Timestamp) + if err != nil { + return nil, err + } + v, err := json.Marshal(s.Value) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *SamplePair) UnmarshalJSON(b []byte) error { + v := [...]json.Unmarshaler{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Equal returns true if this SamplePair and o have equal Values and equal +// Timestamps. The sematics of Value equality is defined by SampleValue.Equal. +func (s *SamplePair) Equal(o *SamplePair) bool { + return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp)) +} + +func (s SamplePair) String() string { + return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp) +} + +// Sample is a sample pair associated with a metric. +type Sample struct { + Metric Metric `json:"metric"` + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +// Equal compares first the metrics, then the timestamp, then the value. The +// sematics of value equality is defined by SampleValue.Equal. +func (s *Sample) Equal(o *Sample) bool { + if s == o { + return true + } + + if !s.Metric.Equal(o.Metric) { + return false + } + if !s.Timestamp.Equal(o.Timestamp) { + return false + } + if s.Value.Equal(o.Value) { + return false + } + + return true +} + +func (s Sample) String() string { + return fmt.Sprintf("%s => %s", s.Metric, SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }) +} + +// MarshalJSON implements json.Marshaler. +func (s Sample) MarshalJSON() ([]byte, error) { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + return json.Marshal(&v) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Sample) UnmarshalJSON(b []byte) error { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + s.Metric = v.Metric + s.Timestamp = v.Value.Timestamp + s.Value = v.Value.Value + + return nil +} + +// Samples is a sortable Sample slice. It implements sort.Interface. +type Samples []*Sample + +func (s Samples) Len() int { + return len(s) +} + +// Less compares first the metrics, then the timestamp. +func (s Samples) Less(i, j int) bool { + switch { + case s[i].Metric.Before(s[j].Metric): + return true + case s[j].Metric.Before(s[i].Metric): + return false + case s[i].Timestamp.Before(s[j].Timestamp): + return true + default: + return false + } +} + +func (s Samples) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Equal compares two sets of samples and returns true if they are equal. +func (s Samples) Equal(o Samples) bool { + if len(s) != len(o) { + return false + } + + for i, sample := range s { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// SampleStream is a stream of Values belonging to an attached COWMetric. +type SampleStream struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` +} + +func (ss SampleStream) String() string { + vals := make([]string, len(ss.Values)) + for i, v := range ss.Values { + vals[i] = v.String() + } + return fmt.Sprintf("%s =>\n%s", ss.Metric, strings.Join(vals, "\n")) +} + +// Value is a generic interface for values resulting from a query evaluation. +type Value interface { + Type() ValueType + String() string +} + +func (Matrix) Type() ValueType { return ValMatrix } +func (Vector) Type() ValueType { return ValVector } +func (*Scalar) Type() ValueType { return ValScalar } +func (*String) Type() ValueType { return ValString } + +type ValueType int + +const ( + ValNone ValueType = iota + ValScalar + ValVector + ValMatrix + ValString +) + +// MarshalJSON implements json.Marshaler. +func (et ValueType) MarshalJSON() ([]byte, error) { + return json.Marshal(et.String()) +} + +func (et *ValueType) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + switch s { + case "": + *et = ValNone + case "scalar": + *et = ValScalar + case "vector": + *et = ValVector + case "matrix": + *et = ValMatrix + case "string": + *et = ValString + default: + return fmt.Errorf("unknown value type %q", s) + } + return nil +} + +func (e ValueType) String() string { + switch e { + case ValNone: + return "" + case ValScalar: + return "scalar" + case ValVector: + return "vector" + case ValMatrix: + return "matrix" + case ValString: + return "string" + } + panic("ValueType.String: unhandled value type") +} + +// Scalar is a scalar value evaluated at the set timestamp. +type Scalar struct { + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s Scalar) String() string { + return fmt.Sprintf("scalar: %v @[%v]", s.Value, s.Timestamp) +} + +// MarshalJSON implements json.Marshaler. +func (s Scalar) MarshalJSON() ([]byte, error) { + v := strconv.FormatFloat(float64(s.Value), 'f', -1, 64) + return json.Marshal([...]interface{}{s.Timestamp, string(v)}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Scalar) UnmarshalJSON(b []byte) error { + var f string + v := [...]interface{}{&s.Timestamp, &f} + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + value, err := strconv.ParseFloat(f, 64) + if err != nil { + return fmt.Errorf("error parsing sample value: %s", err) + } + s.Value = SampleValue(value) + return nil +} + +// String is a string value evaluated at the set timestamp. +type String struct { + Value string `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s *String) String() string { + return s.Value +} + +// MarshalJSON implements json.Marshaler. +func (s String) MarshalJSON() ([]byte, error) { + return json.Marshal([]interface{}{s.Timestamp, s.Value}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *String) UnmarshalJSON(b []byte) error { + v := [...]interface{}{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Vector is basically only an alias for Samples, but the +// contract is that in a Vector, all Samples have the same timestamp. +type Vector []*Sample + +func (vec Vector) String() string { + entries := make([]string, len(vec)) + for i, s := range vec { + entries[i] = s.String() + } + return strings.Join(entries, "\n") +} + +func (vec Vector) Len() int { return len(vec) } +func (vec Vector) Swap(i, j int) { vec[i], vec[j] = vec[j], vec[i] } + +// Less compares first the metrics, then the timestamp. +func (vec Vector) Less(i, j int) bool { + switch { + case vec[i].Metric.Before(vec[j].Metric): + return true + case vec[j].Metric.Before(vec[i].Metric): + return false + case vec[i].Timestamp.Before(vec[j].Timestamp): + return true + default: + return false + } +} + +// Equal compares two sets of samples and returns true if they are equal. +func (vec Vector) Equal(o Vector) bool { + if len(vec) != len(o) { + return false + } + + for i, sample := range vec { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// Matrix is a list of time series. +type Matrix []*SampleStream + +func (m Matrix) Len() int { return len(m) } +func (m Matrix) Less(i, j int) bool { return m[i].Metric.Before(m[j].Metric) } +func (m Matrix) Swap(i, j int) { m[i], m[j] = m[j], m[i] } + +func (mat Matrix) String() string { + matCp := make(Matrix, len(mat)) + copy(matCp, mat) + sort.Sort(matCp) + + strs := make([]string, len(matCp)) + + for i, ss := range matCp { + strs[i] = ss.String() + } + + return strings.Join(strs, "\n") +} diff --git a/vendor/github.com/m3db/prometheus_procfs/.travis.yml b/vendor/github.com/m3db/prometheus_procfs/.travis.yml new file mode 100644 index 00000000..a9e28bf5 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/.travis.yml @@ -0,0 +1,5 @@ +sudo: false +language: go +go: + - 1.6.4 + - 1.7.4 diff --git a/vendor/github.com/m3db/prometheus_procfs/AUTHORS.md b/vendor/github.com/m3db/prometheus_procfs/AUTHORS.md new file mode 100644 index 00000000..d5586356 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/AUTHORS.md @@ -0,0 +1,21 @@ +The Prometheus project was started by Matt T. Proud (emeritus) and +Julius Volz in 2012. + +Maintainers of this repository: + +* Tobias Schmidt + +The following individuals have contributed code to this repository +(listed in alphabetical order): + +* Armen Baghumian +* Bjoern Rabenstein +* David Cournapeau +* Ji-Hoon, Seol +* Jonas Große Sundrup +* Julius Volz +* Matt Layher +* Matthias Rampke +* Nicky Gerritsen +* Rémi Audebert +* Tobias Schmidt diff --git a/vendor/github.com/m3db/prometheus_procfs/CONTRIBUTING.md b/vendor/github.com/m3db/prometheus_procfs/CONTRIBUTING.md new file mode 100644 index 00000000..5705f0fb --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you have a trivial fix or improvement, go ahead and create a pull + request, addressing (with `@...`) one or more of the maintainers + (see [AUTHORS.md](AUTHORS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/vendor/github.com/m3db/prometheus_procfs/LICENSE b/vendor/github.com/m3db/prometheus_procfs/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/m3db/prometheus_procfs/Makefile b/vendor/github.com/m3db/prometheus_procfs/Makefile new file mode 100644 index 00000000..c264a49d --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/Makefile @@ -0,0 +1,6 @@ +ci: + ! gofmt -l *.go | read nothing + go vet + go test -v ./... + go get github.com/golang/lint/golint + golint *.go diff --git a/vendor/github.com/m3db/prometheus_procfs/NOTICE b/vendor/github.com/m3db/prometheus_procfs/NOTICE new file mode 100644 index 00000000..53c5e9aa --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/NOTICE @@ -0,0 +1,7 @@ +procfs provides functions to retrieve system, kernel and process +metrics from the pseudo-filesystem proc. + +Copyright 2014-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/m3db/prometheus_procfs/README.md b/vendor/github.com/m3db/prometheus_procfs/README.md new file mode 100644 index 00000000..6e7ee6b8 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/README.md @@ -0,0 +1,10 @@ +# procfs + +This procfs package provides functions to retrieve system, kernel and process +metrics from the pseudo-filesystem proc. + +*WARNING*: This package is a work in progress. Its API may still break in +backwards-incompatible ways without warnings. Use it at your own risk. + +[![GoDoc](https://godoc.org/github.com/prometheus/procfs?status.png)](https://godoc.org/github.com/prometheus/procfs) +[![Build Status](https://travis-ci.org/prometheus/procfs.svg?branch=master)](https://travis-ci.org/prometheus/procfs) diff --git a/vendor/github.com/m3db/prometheus_procfs/doc.go b/vendor/github.com/m3db/prometheus_procfs/doc.go new file mode 100644 index 00000000..e2acd6d4 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/doc.go @@ -0,0 +1,45 @@ +// Copyright 2014 Prometheus Team +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package procfs provides functions to retrieve system, kernel and process +// metrics from the pseudo-filesystem proc. +// +// Example: +// +// package main +// +// import ( +// "fmt" +// "log" +// +// "github.com/prometheus/procfs" +// ) +// +// func main() { +// p, err := procfs.Self() +// if err != nil { +// log.Fatalf("could not get process: %s", err) +// } +// +// stat, err := p.NewStat() +// if err != nil { +// log.Fatalf("could not get process stat: %s", err) +// } +// +// fmt.Printf("command: %s\n", stat.Comm) +// fmt.Printf("cpu time: %fs\n", stat.CPUTime()) +// fmt.Printf("vsize: %dB\n", stat.VirtualMemory()) +// fmt.Printf("rss: %dB\n", stat.ResidentMemory()) +// } +// +package procfs diff --git a/vendor/github.com/m3db/prometheus_procfs/fs.go b/vendor/github.com/m3db/prometheus_procfs/fs.go new file mode 100644 index 00000000..49aaab05 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/fs.go @@ -0,0 +1,33 @@ +package procfs + +import ( + "fmt" + "os" + "path" +) + +// FS represents the pseudo-filesystem proc, which provides an interface to +// kernel data structures. +type FS string + +// DefaultMountPoint is the common mount point of the proc filesystem. +const DefaultMountPoint = "/proc" + +// NewFS returns a new FS mounted under the given mountPoint. It will error +// if the mount point can't be read. +func NewFS(mountPoint string) (FS, error) { + info, err := os.Stat(mountPoint) + if err != nil { + return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + } + if !info.IsDir() { + return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + } + + return FS(mountPoint), nil +} + +// Path returns the path of the given subsystem relative to the procfs root. +func (fs FS) Path(p ...string) string { + return path.Join(append([]string{string(fs)}, p...)...) +} diff --git a/vendor/github.com/m3db/prometheus_procfs/ipvs.go b/vendor/github.com/m3db/prometheus_procfs/ipvs.go new file mode 100644 index 00000000..e7012f73 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/ipvs.go @@ -0,0 +1,224 @@ +package procfs + +import ( + "bufio" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "os" + "strconv" + "strings" +) + +// IPVSStats holds IPVS statistics, as exposed by the kernel in `/proc/net/ip_vs_stats`. +type IPVSStats struct { + // Total count of connections. + Connections uint64 + // Total incoming packages processed. + IncomingPackets uint64 + // Total outgoing packages processed. + OutgoingPackets uint64 + // Total incoming traffic. + IncomingBytes uint64 + // Total outgoing traffic. + OutgoingBytes uint64 +} + +// IPVSBackendStatus holds current metrics of one virtual / real address pair. +type IPVSBackendStatus struct { + // The local (virtual) IP address. + LocalAddress net.IP + // The local (virtual) port. + LocalPort uint16 + // The transport protocol (TCP, UDP). + Proto string + // The remote (real) IP address. + RemoteAddress net.IP + // The remote (real) port. + RemotePort uint16 + // The current number of active connections for this virtual/real address pair. + ActiveConn uint64 + // The current number of inactive connections for this virtual/real address pair. + InactConn uint64 + // The current weight of this virtual/real address pair. + Weight uint64 +} + +// NewIPVSStats reads the IPVS statistics. +func NewIPVSStats() (IPVSStats, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return IPVSStats{}, err + } + + return fs.NewIPVSStats() +} + +// NewIPVSStats reads the IPVS statistics from the specified `proc` filesystem. +func (fs FS) NewIPVSStats() (IPVSStats, error) { + file, err := os.Open(fs.Path("net/ip_vs_stats")) + if err != nil { + return IPVSStats{}, err + } + defer file.Close() + + return parseIPVSStats(file) +} + +// parseIPVSStats performs the actual parsing of `ip_vs_stats`. +func parseIPVSStats(file io.Reader) (IPVSStats, error) { + var ( + statContent []byte + statLines []string + statFields []string + stats IPVSStats + ) + + statContent, err := ioutil.ReadAll(file) + if err != nil { + return IPVSStats{}, err + } + + statLines = strings.SplitN(string(statContent), "\n", 4) + if len(statLines) != 4 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: too short") + } + + statFields = strings.Fields(statLines[2]) + if len(statFields) != 5 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: unexpected number of fields") + } + + stats.Connections, err = strconv.ParseUint(statFields[0], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingPackets, err = strconv.ParseUint(statFields[1], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingPackets, err = strconv.ParseUint(statFields[2], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingBytes, err = strconv.ParseUint(statFields[3], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingBytes, err = strconv.ParseUint(statFields[4], 16, 64) + if err != nil { + return IPVSStats{}, err + } + + return stats, nil +} + +// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs. +func NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return []IPVSBackendStatus{}, err + } + + return fs.NewIPVSBackendStatus() +} + +// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs from the specified `proc` filesystem. +func (fs FS) NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { + file, err := os.Open(fs.Path("net/ip_vs")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseIPVSBackendStatus(file) +} + +func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) { + var ( + status []IPVSBackendStatus + scanner = bufio.NewScanner(file) + proto string + localAddress net.IP + localPort uint16 + err error + ) + + for scanner.Scan() { + fields := strings.Fields(string(scanner.Text())) + if len(fields) == 0 { + continue + } + switch { + case fields[0] == "IP" || fields[0] == "Prot" || fields[1] == "RemoteAddress:Port": + continue + case fields[0] == "TCP" || fields[0] == "UDP": + if len(fields) < 2 { + continue + } + proto = fields[0] + localAddress, localPort, err = parseIPPort(fields[1]) + if err != nil { + return nil, err + } + case fields[0] == "->": + if len(fields) < 6 { + continue + } + remoteAddress, remotePort, err := parseIPPort(fields[1]) + if err != nil { + return nil, err + } + weight, err := strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, err + } + activeConn, err := strconv.ParseUint(fields[4], 10, 64) + if err != nil { + return nil, err + } + inactConn, err := strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + status = append(status, IPVSBackendStatus{ + LocalAddress: localAddress, + LocalPort: localPort, + RemoteAddress: remoteAddress, + RemotePort: remotePort, + Proto: proto, + Weight: weight, + ActiveConn: activeConn, + InactConn: inactConn, + }) + } + } + return status, nil +} + +func parseIPPort(s string) (net.IP, uint16, error) { + tmp := strings.SplitN(s, ":", 2) + + if len(tmp) != 2 { + return nil, 0, fmt.Errorf("invalid IP:Port: %s", s) + } + + if len(tmp[0]) != 8 && len(tmp[0]) != 32 { + return nil, 0, fmt.Errorf("invalid IP: %s", tmp[0]) + } + + ip, err := hex.DecodeString(tmp[0]) + if err != nil { + return nil, 0, err + } + + port, err := strconv.ParseUint(tmp[1], 16, 16) + if err != nil { + return nil, 0, err + } + + return ip, uint16(port), nil +} diff --git a/vendor/github.com/m3db/prometheus_procfs/mdstat.go b/vendor/github.com/m3db/prometheus_procfs/mdstat.go new file mode 100644 index 00000000..d7a248c0 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/mdstat.go @@ -0,0 +1,138 @@ +package procfs + +import ( + "fmt" + "io/ioutil" + "regexp" + "strconv" + "strings" +) + +var ( + statuslineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) + buildlineRE = regexp.MustCompile(`\((\d+)/\d+\)`) +) + +// MDStat holds info parsed from /proc/mdstat. +type MDStat struct { + // Name of the device. + Name string + // activity-state of the device. + ActivityState string + // Number of active disks. + DisksActive int64 + // Total number of disks the device consists of. + DisksTotal int64 + // Number of blocks the device holds. + BlocksTotal int64 + // Number of blocks on the device that are in sync. + BlocksSynced int64 +} + +// ParseMDStat parses an mdstat-file and returns a struct with the relevant infos. +func (fs FS) ParseMDStat() (mdstates []MDStat, err error) { + mdStatusFilePath := fs.Path("mdstat") + content, err := ioutil.ReadFile(mdStatusFilePath) + if err != nil { + return []MDStat{}, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + + mdStates := []MDStat{} + lines := strings.Split(string(content), "\n") + for i, l := range lines { + if l == "" { + continue + } + if l[0] == ' ' { + continue + } + if strings.HasPrefix(l, "Personalities") || strings.HasPrefix(l, "unused") { + continue + } + + mainLine := strings.Split(l, " ") + if len(mainLine) < 3 { + return mdStates, fmt.Errorf("error parsing mdline: %s", l) + } + mdName := mainLine[0] + activityState := mainLine[2] + + if len(lines) <= i+3 { + return mdStates, fmt.Errorf( + "error parsing %s: too few lines for md device %s", + mdStatusFilePath, + mdName, + ) + } + + active, total, size, err := evalStatusline(lines[i+1]) + if err != nil { + return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + + // j is the line number of the syncing-line. + j := i + 2 + if strings.Contains(lines[i+2], "bitmap") { // skip bitmap line + j = i + 3 + } + + // If device is syncing at the moment, get the number of currently + // synced bytes, otherwise that number equals the size of the device. + syncedBlocks := size + if strings.Contains(lines[j], "recovery") || strings.Contains(lines[j], "resync") { + syncedBlocks, err = evalBuildline(lines[j]) + if err != nil { + return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + } + + mdStates = append(mdStates, MDStat{ + Name: mdName, + ActivityState: activityState, + DisksActive: active, + DisksTotal: total, + BlocksTotal: size, + BlocksSynced: syncedBlocks, + }) + } + + return mdStates, nil +} + +func evalStatusline(statusline string) (active, total, size int64, err error) { + matches := statuslineRE.FindStringSubmatch(statusline) + if len(matches) != 4 { + return 0, 0, 0, fmt.Errorf("unexpected statusline: %s", statusline) + } + + size, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + total, err = strconv.ParseInt(matches[2], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + active, err = strconv.ParseInt(matches[3], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + return active, total, size, nil +} + +func evalBuildline(buildline string) (syncedBlocks int64, err error) { + matches := buildlineRE.FindStringSubmatch(buildline) + if len(matches) != 2 { + return 0, fmt.Errorf("unexpected buildline: %s", buildline) + } + + syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, fmt.Errorf("%s in buildline: %s", err, buildline) + } + + return syncedBlocks, nil +} diff --git a/vendor/github.com/m3db/prometheus_procfs/mountstats.go b/vendor/github.com/m3db/prometheus_procfs/mountstats.go new file mode 100644 index 00000000..47ab0a74 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/mountstats.go @@ -0,0 +1,552 @@ +package procfs + +// While implementing parsing of /proc/[pid]/mountstats, this blog was used +// heavily as a reference: +// https://utcc.utoronto.ca/~cks/space/blog/linux/NFSMountstatsIndex +// +// Special thanks to Chris Siebenmann for all of his posts explaining the +// various statistics available for NFS. + +import ( + "bufio" + "fmt" + "io" + "strconv" + "strings" + "time" +) + +// Constants shared between multiple functions. +const ( + deviceEntryLen = 8 + + fieldBytesLen = 8 + fieldEventsLen = 27 + + statVersion10 = "1.0" + statVersion11 = "1.1" + + fieldTransport10Len = 10 + fieldTransport11Len = 13 +) + +// A Mount is a device mount parsed from /proc/[pid]/mountstats. +type Mount struct { + // Name of the device. + Device string + // The mount point of the device. + Mount string + // The filesystem type used by the device. + Type string + // If available additional statistics related to this Mount. + // Use a type assertion to determine if additional statistics are available. + Stats MountStats +} + +// A MountStats is a type which contains detailed statistics for a specific +// type of Mount. +type MountStats interface { + mountStats() +} + +// A MountStatsNFS is a MountStats implementation for NFSv3 and v4 mounts. +type MountStatsNFS struct { + // The version of statistics provided. + StatVersion string + // The age of the NFS mount. + Age time.Duration + // Statistics related to byte counters for various operations. + Bytes NFSBytesStats + // Statistics related to various NFS event occurrences. + Events NFSEventsStats + // Statistics broken down by filesystem operation. + Operations []NFSOperationStats + // Statistics about the NFS RPC transport. + Transport NFSTransportStats +} + +// mountStats implements MountStats. +func (m MountStatsNFS) mountStats() {} + +// A NFSBytesStats contains statistics about the number of bytes read and written +// by an NFS client to and from an NFS server. +type NFSBytesStats struct { + // Number of bytes read using the read() syscall. + Read uint64 + // Number of bytes written using the write() syscall. + Write uint64 + // Number of bytes read using the read() syscall in O_DIRECT mode. + DirectRead uint64 + // Number of bytes written using the write() syscall in O_DIRECT mode. + DirectWrite uint64 + // Number of bytes read from the NFS server, in total. + ReadTotal uint64 + // Number of bytes written to the NFS server, in total. + WriteTotal uint64 + // Number of pages read directly via mmap()'d files. + ReadPages uint64 + // Number of pages written directly via mmap()'d files. + WritePages uint64 +} + +// A NFSEventsStats contains statistics about NFS event occurrences. +type NFSEventsStats struct { + // Number of times cached inode attributes are re-validated from the server. + InodeRevalidate uint64 + // Number of times cached dentry nodes are re-validated from the server. + DnodeRevalidate uint64 + // Number of times an inode cache is cleared. + DataInvalidate uint64 + // Number of times cached inode attributes are invalidated. + AttributeInvalidate uint64 + // Number of times files or directories have been open()'d. + VFSOpen uint64 + // Number of times a directory lookup has occurred. + VFSLookup uint64 + // Number of times permissions have been checked. + VFSAccess uint64 + // Number of updates (and potential writes) to pages. + VFSUpdatePage uint64 + // Number of pages read directly via mmap()'d files. + VFSReadPage uint64 + // Number of times a group of pages have been read. + VFSReadPages uint64 + // Number of pages written directly via mmap()'d files. + VFSWritePage uint64 + // Number of times a group of pages have been written. + VFSWritePages uint64 + // Number of times directory entries have been read with getdents(). + VFSGetdents uint64 + // Number of times attributes have been set on inodes. + VFSSetattr uint64 + // Number of pending writes that have been forcefully flushed to the server. + VFSFlush uint64 + // Number of times fsync() has been called on directories and files. + VFSFsync uint64 + // Number of times locking has been attemped on a file. + VFSLock uint64 + // Number of times files have been closed and released. + VFSFileRelease uint64 + // Unknown. Possibly unused. + CongestionWait uint64 + // Number of times files have been truncated. + Truncation uint64 + // Number of times a file has been grown due to writes beyond its existing end. + WriteExtension uint64 + // Number of times a file was removed while still open by another process. + SillyRename uint64 + // Number of times the NFS server gave less data than expected while reading. + ShortRead uint64 + // Number of times the NFS server wrote less data than expected while writing. + ShortWrite uint64 + // Number of times the NFS server indicated EJUKEBOX; retrieving data from + // offline storage. + JukeboxDelay uint64 + // Number of NFS v4.1+ pNFS reads. + PNFSRead uint64 + // Number of NFS v4.1+ pNFS writes. + PNFSWrite uint64 +} + +// A NFSOperationStats contains statistics for a single operation. +type NFSOperationStats struct { + // The name of the operation. + Operation string + // Number of requests performed for this operation. + Requests uint64 + // Number of times an actual RPC request has been transmitted for this operation. + Transmissions uint64 + // Number of times a request has had a major timeout. + MajorTimeouts uint64 + // Number of bytes sent for this operation, including RPC headers and payload. + BytesSent uint64 + // Number of bytes received for this operation, including RPC headers and payload. + BytesReceived uint64 + // Duration all requests spent queued for transmission before they were sent. + CumulativeQueueTime time.Duration + // Duration it took to get a reply back after the request was transmitted. + CumulativeTotalResponseTime time.Duration + // Duration from when a request was enqueued to when it was completely handled. + CumulativeTotalRequestTime time.Duration +} + +// A NFSTransportStats contains statistics for the NFS mount RPC requests and +// responses. +type NFSTransportStats struct { + // The local port used for the NFS mount. + Port uint64 + // Number of times the client has had to establish a connection from scratch + // to the NFS server. + Bind uint64 + // Number of times the client has made a TCP connection to the NFS server. + Connect uint64 + // Duration (in jiffies, a kernel internal unit of time) the NFS mount has + // spent waiting for connections to the server to be established. + ConnectIdleTime uint64 + // Duration since the NFS mount last saw any RPC traffic. + IdleTime time.Duration + // Number of RPC requests for this mount sent to the NFS server. + Sends uint64 + // Number of RPC responses for this mount received from the NFS server. + Receives uint64 + // Number of times the NFS server sent a response with a transaction ID + // unknown to this client. + BadTransactionIDs uint64 + // A running counter, incremented on each request as the current difference + // ebetween sends and receives. + CumulativeActiveRequests uint64 + // A running counter, incremented on each request by the current backlog + // queue size. + CumulativeBacklog uint64 + + // Stats below only available with stat version 1.1. + + // Maximum number of simultaneously active RPC requests ever used. + MaximumRPCSlotsUsed uint64 + // A running counter, incremented on each request as the current size of the + // sending queue. + CumulativeSendingQueue uint64 + // A running counter, incremented on each request as the current size of the + // pending queue. + CumulativePendingQueue uint64 +} + +// parseMountStats parses a /proc/[pid]/mountstats file and returns a slice +// of Mount structures containing detailed information about each mount. +// If available, statistics for each mount are parsed as well. +func parseMountStats(r io.Reader) ([]*Mount, error) { + const ( + device = "device" + statVersionPrefix = "statvers=" + + nfs3Type = "nfs" + nfs4Type = "nfs4" + ) + + var mounts []*Mount + + s := bufio.NewScanner(r) + for s.Scan() { + // Only look for device entries in this function + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 || ss[0] != device { + continue + } + + m, err := parseMount(ss) + if err != nil { + return nil, err + } + + // Does this mount also possess statistics information? + if len(ss) > deviceEntryLen { + // Only NFSv3 and v4 are supported for parsing statistics + if m.Type != nfs3Type && m.Type != nfs4Type { + return nil, fmt.Errorf("cannot parse MountStats for fstype %q", m.Type) + } + + statVersion := strings.TrimPrefix(ss[8], statVersionPrefix) + + stats, err := parseMountStatsNFS(s, statVersion) + if err != nil { + return nil, err + } + + m.Stats = stats + } + + mounts = append(mounts, m) + } + + return mounts, s.Err() +} + +// parseMount parses an entry in /proc/[pid]/mountstats in the format: +// device [device] mounted on [mount] with fstype [type] +func parseMount(ss []string) (*Mount, error) { + if len(ss) < deviceEntryLen { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + + // Check for specific words appearing at specific indices to ensure + // the format is consistent with what we expect + format := []struct { + i int + s string + }{ + {i: 0, s: "device"}, + {i: 2, s: "mounted"}, + {i: 3, s: "on"}, + {i: 5, s: "with"}, + {i: 6, s: "fstype"}, + } + + for _, f := range format { + if ss[f.i] != f.s { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + } + + return &Mount{ + Device: ss[1], + Mount: ss[4], + Type: ss[7], + }, nil +} + +// parseMountStatsNFS parses a MountStatsNFS by scanning additional information +// related to NFS statistics. +func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, error) { + // Field indicators for parsing specific types of data + const ( + fieldAge = "age:" + fieldBytes = "bytes:" + fieldEvents = "events:" + fieldPerOpStats = "per-op" + fieldTransport = "xprt:" + ) + + stats := &MountStatsNFS{ + StatVersion: statVersion, + } + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + break + } + if len(ss) < 2 { + return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + } + + switch ss[0] { + case fieldAge: + // Age integer is in seconds + d, err := time.ParseDuration(ss[1] + "s") + if err != nil { + return nil, err + } + + stats.Age = d + case fieldBytes: + bstats, err := parseNFSBytesStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Bytes = *bstats + case fieldEvents: + estats, err := parseNFSEventsStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Events = *estats + case fieldTransport: + if len(ss) < 3 { + return nil, fmt.Errorf("not enough information for NFS transport stats: %v", ss) + } + + tstats, err := parseNFSTransportStats(ss[2:], statVersion) + if err != nil { + return nil, err + } + + stats.Transport = *tstats + } + + // When encountering "per-operation statistics", we must break this + // loop and parse them seperately to ensure we can terminate parsing + // before reaching another device entry; hence why this 'if' statement + // is not just another switch case + if ss[0] == fieldPerOpStats { + break + } + } + + if err := s.Err(); err != nil { + return nil, err + } + + // NFS per-operation stats appear last before the next device entry + perOpStats, err := parseNFSOperationStats(s) + if err != nil { + return nil, err + } + + stats.Operations = perOpStats + + return stats, nil +} + +// parseNFSBytesStats parses a NFSBytesStats line using an input set of +// integer fields. +func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) { + if len(ss) != fieldBytesLen { + return nil, fmt.Errorf("invalid NFS bytes stats: %v", ss) + } + + ns := make([]uint64, 0, fieldBytesLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSBytesStats{ + Read: ns[0], + Write: ns[1], + DirectRead: ns[2], + DirectWrite: ns[3], + ReadTotal: ns[4], + WriteTotal: ns[5], + ReadPages: ns[6], + WritePages: ns[7], + }, nil +} + +// parseNFSEventsStats parses a NFSEventsStats line using an input set of +// integer fields. +func parseNFSEventsStats(ss []string) (*NFSEventsStats, error) { + if len(ss) != fieldEventsLen { + return nil, fmt.Errorf("invalid NFS events stats: %v", ss) + } + + ns := make([]uint64, 0, fieldEventsLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSEventsStats{ + InodeRevalidate: ns[0], + DnodeRevalidate: ns[1], + DataInvalidate: ns[2], + AttributeInvalidate: ns[3], + VFSOpen: ns[4], + VFSLookup: ns[5], + VFSAccess: ns[6], + VFSUpdatePage: ns[7], + VFSReadPage: ns[8], + VFSReadPages: ns[9], + VFSWritePage: ns[10], + VFSWritePages: ns[11], + VFSGetdents: ns[12], + VFSSetattr: ns[13], + VFSFlush: ns[14], + VFSFsync: ns[15], + VFSLock: ns[16], + VFSFileRelease: ns[17], + CongestionWait: ns[18], + Truncation: ns[19], + WriteExtension: ns[20], + SillyRename: ns[21], + ShortRead: ns[22], + ShortWrite: ns[23], + JukeboxDelay: ns[24], + PNFSRead: ns[25], + PNFSWrite: ns[26], + }, nil +} + +// parseNFSOperationStats parses a slice of NFSOperationStats by scanning +// additional information about per-operation statistics until an empty +// line is reached. +func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { + const ( + // Number of expected fields in each per-operation statistics set + numFields = 9 + ) + + var ops []NFSOperationStats + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + // Must break when reading a blank line after per-operation stats to + // enable top-level function to parse the next device entry + break + } + + if len(ss) != numFields { + return nil, fmt.Errorf("invalid NFS per-operations stats: %v", ss) + } + + // Skip string operation name for integers + ns := make([]uint64, 0, numFields-1) + for _, st := range ss[1:] { + n, err := strconv.ParseUint(st, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + ops = append(ops, NFSOperationStats{ + Operation: strings.TrimSuffix(ss[0], ":"), + Requests: ns[0], + Transmissions: ns[1], + MajorTimeouts: ns[2], + BytesSent: ns[3], + BytesReceived: ns[4], + CumulativeQueueTime: time.Duration(ns[5]) * time.Millisecond, + CumulativeTotalResponseTime: time.Duration(ns[6]) * time.Millisecond, + CumulativeTotalRequestTime: time.Duration(ns[7]) * time.Millisecond, + }) + } + + return ops, s.Err() +} + +// parseNFSTransportStats parses a NFSTransportStats line using an input set of +// integer fields matched to a specific stats version. +func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats, error) { + switch statVersion { + case statVersion10: + if len(ss) != fieldTransport10Len { + return nil, fmt.Errorf("invalid NFS transport stats 1.0 statement: %v", ss) + } + case statVersion11: + if len(ss) != fieldTransport11Len { + return nil, fmt.Errorf("invalid NFS transport stats 1.1 statement: %v", ss) + } + default: + return nil, fmt.Errorf("unrecognized NFS transport stats version: %q", statVersion) + } + + // Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay + // in a v1.0 response + ns := make([]uint64, 0, fieldTransport11Len) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSTransportStats{ + Port: ns[0], + Bind: ns[1], + Connect: ns[2], + ConnectIdleTime: ns[3], + IdleTime: time.Duration(ns[4]) * time.Second, + Sends: ns[5], + Receives: ns[6], + BadTransactionIDs: ns[7], + CumulativeActiveRequests: ns[8], + CumulativeBacklog: ns[9], + MaximumRPCSlotsUsed: ns[10], + CumulativeSendingQueue: ns[11], + CumulativePendingQueue: ns[12], + }, nil +} diff --git a/vendor/github.com/m3db/prometheus_procfs/proc.go b/vendor/github.com/m3db/prometheus_procfs/proc.go new file mode 100644 index 00000000..8717e1fe --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/proc.go @@ -0,0 +1,224 @@ +package procfs + +import ( + "fmt" + "io/ioutil" + "os" + "strconv" + "strings" +) + +// Proc provides information about a running process. +type Proc struct { + // The process ID. + PID int + + fs FS +} + +// Procs represents a list of Proc structs. +type Procs []Proc + +func (p Procs) Len() int { return len(p) } +func (p Procs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p Procs) Less(i, j int) bool { return p[i].PID < p[j].PID } + +// Self returns a process for the current process read via /proc/self. +func Self() (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.Self() +} + +// NewProc returns a process for the given pid under /proc. +func NewProc(pid int) (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.NewProc(pid) +} + +// AllProcs returns a list of all currently available processes under /proc. +func AllProcs() (Procs, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Procs{}, err + } + return fs.AllProcs() +} + +// Self returns a process for the current process. +func (fs FS) Self() (Proc, error) { + p, err := os.Readlink(fs.Path("self")) + if err != nil { + return Proc{}, err + } + pid, err := strconv.Atoi(strings.Replace(p, string(fs), "", -1)) + if err != nil { + return Proc{}, err + } + return fs.NewProc(pid) +} + +// NewProc returns a process for the given pid. +func (fs FS) NewProc(pid int) (Proc, error) { + if _, err := os.Stat(fs.Path(strconv.Itoa(pid))); err != nil { + return Proc{}, err + } + return Proc{PID: pid, fs: fs}, nil +} + +// AllProcs returns a list of all currently available processes. +func (fs FS) AllProcs() (Procs, error) { + d, err := os.Open(fs.Path()) + if err != nil { + return Procs{}, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return Procs{}, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + p := Procs{} + for _, n := range names { + pid, err := strconv.ParseInt(n, 10, 64) + if err != nil { + continue + } + p = append(p, Proc{PID: int(pid), fs: fs}) + } + + return p, nil +} + +// CmdLine returns the command line of a process. +func (p Proc) CmdLine() ([]string, error) { + f, err := os.Open(p.path("cmdline")) + if err != nil { + return nil, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return nil, err + } + + if len(data) < 1 { + return []string{}, nil + } + + return strings.Split(string(data[:len(data)-1]), string(byte(0))), nil +} + +// Comm returns the command name of a process. +func (p Proc) Comm() (string, error) { + f, err := os.Open(p.path("comm")) + if err != nil { + return "", err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return "", err + } + + return strings.TrimSpace(string(data)), nil +} + +// Executable returns the absolute path of the executable command of a process. +func (p Proc) Executable() (string, error) { + exe, err := os.Readlink(p.path("exe")) + if os.IsNotExist(err) { + return "", nil + } + + return exe, err +} + +// FileDescriptors returns the currently open file descriptors of a process. +func (p Proc) FileDescriptors() ([]uintptr, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + fds := make([]uintptr, len(names)) + for i, n := range names { + fd, err := strconv.ParseInt(n, 10, 32) + if err != nil { + return nil, fmt.Errorf("could not parse fd %s: %s", n, err) + } + fds[i] = uintptr(fd) + } + + return fds, nil +} + +// FileDescriptorTargets returns the targets of all file descriptors of a process. +// If a file descriptor is not a symlink to a file (like a socket), that value will be the empty string. +func (p Proc) FileDescriptorTargets() ([]string, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + targets := make([]string, len(names)) + + for i, name := range names { + target, err := os.Readlink(p.path("fd", name)) + if err == nil { + targets[i] = target + } + } + + return targets, nil +} + +// FileDescriptorsLen returns the number of currently open file descriptors of +// a process. +func (p Proc) FileDescriptorsLen() (int, error) { + fds, err := p.fileDescriptors() + if err != nil { + return 0, err + } + + return len(fds), nil +} + +// MountStats retrieves statistics and configuration for mount points in a +// process's namespace. +func (p Proc) MountStats() ([]*Mount, error) { + f, err := os.Open(p.path("mountstats")) + if err != nil { + return nil, err + } + defer f.Close() + + return parseMountStats(f) +} + +func (p Proc) fileDescriptors() ([]string, error) { + d, err := os.Open(p.path("fd")) + if err != nil { + return nil, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return nil, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + return names, nil +} + +func (p Proc) path(pa ...string) string { + return p.fs.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) +} diff --git a/vendor/github.com/m3db/prometheus_procfs/proc_io.go b/vendor/github.com/m3db/prometheus_procfs/proc_io.go new file mode 100644 index 00000000..b4e31d7b --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/proc_io.go @@ -0,0 +1,55 @@ +package procfs + +import ( + "fmt" + "io/ioutil" + "os" +) + +// ProcIO models the content of /proc//io. +type ProcIO struct { + // Chars read. + RChar uint64 + // Chars written. + WChar uint64 + // Read syscalls. + SyscR uint64 + // Write syscalls. + SyscW uint64 + // Bytes read. + ReadBytes uint64 + // Bytes written. + WriteBytes uint64 + // Bytes written, but taking into account truncation. See + // Documentation/filesystems/proc.txt in the kernel sources for + // detailed explanation. + CancelledWriteBytes int64 +} + +// NewIO creates a new ProcIO instance from a given Proc instance. +func (p Proc) NewIO() (ProcIO, error) { + pio := ProcIO{} + + f, err := os.Open(p.path("io")) + if err != nil { + return pio, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return pio, err + } + + ioFormat := "rchar: %d\nwchar: %d\nsyscr: %d\nsyscw: %d\n" + + "read_bytes: %d\nwrite_bytes: %d\n" + + "cancelled_write_bytes: %d\n" + + _, err = fmt.Sscanf(string(data), ioFormat, &pio.RChar, &pio.WChar, &pio.SyscR, + &pio.SyscW, &pio.ReadBytes, &pio.WriteBytes, &pio.CancelledWriteBytes) + if err != nil { + return pio, err + } + + return pio, nil +} diff --git a/vendor/github.com/m3db/prometheus_procfs/proc_limits.go b/vendor/github.com/m3db/prometheus_procfs/proc_limits.go new file mode 100644 index 00000000..2df997ce --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/proc_limits.go @@ -0,0 +1,137 @@ +package procfs + +import ( + "bufio" + "fmt" + "os" + "regexp" + "strconv" +) + +// ProcLimits represents the soft limits for each of the process's resource +// limits. For more information see getrlimit(2): +// http://man7.org/linux/man-pages/man2/getrlimit.2.html. +type ProcLimits struct { + // CPU time limit in seconds. + CPUTime int + // Maximum size of files that the process may create. + FileSize int + // Maximum size of the process's data segment (initialized data, + // uninitialized data, and heap). + DataSize int + // Maximum size of the process stack in bytes. + StackSize int + // Maximum size of a core file. + CoreFileSize int + // Limit of the process's resident set in pages. + ResidentSet int + // Maximum number of processes that can be created for the real user ID of + // the calling process. + Processes int + // Value one greater than the maximum file descriptor number that can be + // opened by this process. + OpenFiles int + // Maximum number of bytes of memory that may be locked into RAM. + LockedMemory int + // Maximum size of the process's virtual memory address space in bytes. + AddressSpace int + // Limit on the combined number of flock(2) locks and fcntl(2) leases that + // this process may establish. + FileLocks int + // Limit of signals that may be queued for the real user ID of the calling + // process. + PendingSignals int + // Limit on the number of bytes that can be allocated for POSIX message + // queues for the real user ID of the calling process. + MsqqueueSize int + // Limit of the nice priority set using setpriority(2) or nice(2). + NicePriority int + // Limit of the real-time priority set using sched_setscheduler(2) or + // sched_setparam(2). + RealtimePriority int + // Limit (in microseconds) on the amount of CPU time that a process + // scheduled under a real-time scheduling policy may consume without making + // a blocking system call. + RealtimeTimeout int +} + +const ( + limitsFields = 3 + limitsUnlimited = "unlimited" +) + +var ( + limitsDelimiter = regexp.MustCompile(" +") +) + +// NewLimits returns the current soft limits of the process. +func (p Proc) NewLimits() (ProcLimits, error) { + f, err := os.Open(p.path("limits")) + if err != nil { + return ProcLimits{}, err + } + defer f.Close() + + var ( + l = ProcLimits{} + s = bufio.NewScanner(f) + ) + for s.Scan() { + fields := limitsDelimiter.Split(s.Text(), limitsFields) + if len(fields) != limitsFields { + return ProcLimits{}, fmt.Errorf( + "couldn't parse %s line %s", f.Name(), s.Text()) + } + + switch fields[0] { + case "Max cpu time": + l.CPUTime, err = parseInt(fields[1]) + case "Max file size": + l.FileSize, err = parseInt(fields[1]) + case "Max data size": + l.DataSize, err = parseInt(fields[1]) + case "Max stack size": + l.StackSize, err = parseInt(fields[1]) + case "Max core file size": + l.CoreFileSize, err = parseInt(fields[1]) + case "Max resident set": + l.ResidentSet, err = parseInt(fields[1]) + case "Max processes": + l.Processes, err = parseInt(fields[1]) + case "Max open files": + l.OpenFiles, err = parseInt(fields[1]) + case "Max locked memory": + l.LockedMemory, err = parseInt(fields[1]) + case "Max address space": + l.AddressSpace, err = parseInt(fields[1]) + case "Max file locks": + l.FileLocks, err = parseInt(fields[1]) + case "Max pending signals": + l.PendingSignals, err = parseInt(fields[1]) + case "Max msgqueue size": + l.MsqqueueSize, err = parseInt(fields[1]) + case "Max nice priority": + l.NicePriority, err = parseInt(fields[1]) + case "Max realtime priority": + l.RealtimePriority, err = parseInt(fields[1]) + case "Max realtime timeout": + l.RealtimeTimeout, err = parseInt(fields[1]) + } + if err != nil { + return ProcLimits{}, err + } + } + + return l, s.Err() +} + +func parseInt(s string) (int, error) { + if s == limitsUnlimited { + return -1, nil + } + i, err := strconv.ParseInt(s, 10, 32) + if err != nil { + return 0, fmt.Errorf("couldn't parse value %s: %s", s, err) + } + return int(i), nil +} diff --git a/vendor/github.com/m3db/prometheus_procfs/proc_stat.go b/vendor/github.com/m3db/prometheus_procfs/proc_stat.go new file mode 100644 index 00000000..724e271b --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/proc_stat.go @@ -0,0 +1,175 @@ +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" +) + +// Originally, this USER_HZ value was dynamically retrieved via a sysconf call +// which required cgo. However, that caused a lot of problems regarding +// cross-compilation. Alternatives such as running a binary to determine the +// value, or trying to derive it in some other way were all problematic. After +// much research it was determined that USER_HZ is actually hardcoded to 100 on +// all Go-supported platforms as of the time of this writing. This is why we +// decided to hardcode it here as well. It is not impossible that there could +// be systems with exceptions, but they should be very exotic edge cases, and +// in that case, the worst outcome will be two misreported metrics. +// +// See also the following discussions: +// +// - https://github.com/prometheus/node_exporter/issues/52 +// - https://github.com/prometheus/procfs/pull/2 +// - http://stackoverflow.com/questions/17410841/how-does-user-hz-solve-the-jiffy-scaling-issue +const userHZ = 100 + +// ProcStat provides status information about the process, +// read from /proc/[pid]/stat. +type ProcStat struct { + // The process ID. + PID int + // The filename of the executable. + Comm string + // The process state. + State string + // The PID of the parent of this process. + PPID int + // The process group ID of the process. + PGRP int + // The session ID of the process. + Session int + // The controlling terminal of the process. + TTY int + // The ID of the foreground process group of the controlling terminal of + // the process. + TPGID int + // The kernel flags word of the process. + Flags uint + // The number of minor faults the process has made which have not required + // loading a memory page from disk. + MinFlt uint + // The number of minor faults that the process's waited-for children have + // made. + CMinFlt uint + // The number of major faults the process has made which have required + // loading a memory page from disk. + MajFlt uint + // The number of major faults that the process's waited-for children have + // made. + CMajFlt uint + // Amount of time that this process has been scheduled in user mode, + // measured in clock ticks. + UTime uint + // Amount of time that this process has been scheduled in kernel mode, + // measured in clock ticks. + STime uint + // Amount of time that this process's waited-for children have been + // scheduled in user mode, measured in clock ticks. + CUTime uint + // Amount of time that this process's waited-for children have been + // scheduled in kernel mode, measured in clock ticks. + CSTime uint + // For processes running a real-time scheduling policy, this is the negated + // scheduling priority, minus one. + Priority int + // The nice value, a value in the range 19 (low priority) to -20 (high + // priority). + Nice int + // Number of threads in this process. + NumThreads int + // The time the process started after system boot, the value is expressed + // in clock ticks. + Starttime uint64 + // Virtual memory size in bytes. + VSize int + // Resident set size in pages. + RSS int + + fs FS +} + +// NewStat returns the current status information of the process. +func (p Proc) NewStat() (ProcStat, error) { + f, err := os.Open(p.path("stat")) + if err != nil { + return ProcStat{}, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return ProcStat{}, err + } + + var ( + ignore int + + s = ProcStat{PID: p.PID, fs: p.fs} + l = bytes.Index(data, []byte("(")) + r = bytes.LastIndex(data, []byte(")")) + ) + + if l < 0 || r < 0 { + return ProcStat{}, fmt.Errorf( + "unexpected format, couldn't extract comm: %s", + data, + ) + } + + s.Comm = string(data[l+1 : r]) + _, err = fmt.Fscan( + bytes.NewBuffer(data[r+2:]), + &s.State, + &s.PPID, + &s.PGRP, + &s.Session, + &s.TTY, + &s.TPGID, + &s.Flags, + &s.MinFlt, + &s.CMinFlt, + &s.MajFlt, + &s.CMajFlt, + &s.UTime, + &s.STime, + &s.CUTime, + &s.CSTime, + &s.Priority, + &s.Nice, + &s.NumThreads, + &ignore, + &s.Starttime, + &s.VSize, + &s.RSS, + ) + if err != nil { + return ProcStat{}, err + } + + return s, nil +} + +// VirtualMemory returns the virtual memory size in bytes. +func (s ProcStat) VirtualMemory() int { + return s.VSize +} + +// ResidentMemory returns the resident memory size in bytes. +func (s ProcStat) ResidentMemory() int { + return s.RSS * os.Getpagesize() +} + +// StartTime returns the unix timestamp of the process in seconds. +func (s ProcStat) StartTime() (float64, error) { + stat, err := s.fs.NewStat() + if err != nil { + return 0, err + } + return float64(stat.BootTime) + (float64(s.Starttime) / userHZ), nil +} + +// CPUTime returns the total CPU user and system time in seconds. +func (s ProcStat) CPUTime() float64 { + return float64(s.UTime+s.STime) / userHZ +} diff --git a/vendor/github.com/m3db/prometheus_procfs/stat.go b/vendor/github.com/m3db/prometheus_procfs/stat.go new file mode 100644 index 00000000..1ca217e8 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/stat.go @@ -0,0 +1,56 @@ +package procfs + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +// Stat represents kernel/system statistics. +type Stat struct { + // Boot time in seconds since the Epoch. + BootTime int64 +} + +// NewStat returns kernel/system statistics read from /proc/stat. +func NewStat() (Stat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Stat{}, err + } + + return fs.NewStat() +} + +// NewStat returns an information about current kernel/system statistics. +func (fs FS) NewStat() (Stat, error) { + f, err := os.Open(fs.Path("stat")) + if err != nil { + return Stat{}, err + } + defer f.Close() + + s := bufio.NewScanner(f) + for s.Scan() { + line := s.Text() + if !strings.HasPrefix(line, "btime") { + continue + } + fields := strings.Fields(line) + if len(fields) != 2 { + return Stat{}, fmt.Errorf("couldn't parse %s line %s", f.Name(), line) + } + i, err := strconv.ParseInt(fields[1], 10, 32) + if err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s: %s", fields[1], err) + } + return Stat{BootTime: i}, nil + } + if err := s.Err(); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s: %s", f.Name(), err) + } + + return Stat{}, fmt.Errorf("couldn't parse %s, missing btime", f.Name()) +} diff --git a/vendor/github.com/m3db/stackadler32/.gitignore b/vendor/github.com/m3db/stackadler32/.gitignore new file mode 100644 index 00000000..a1338d68 --- /dev/null +++ b/vendor/github.com/m3db/stackadler32/.gitignore @@ -0,0 +1,14 @@ +# Binaries for programs and plugins +*.exe +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 +.glide/ diff --git a/vendor/github.com/m3db/stackadler32/LICENSE b/vendor/github.com/m3db/stackadler32/LICENSE new file mode 100644 index 00000000..e607441d --- /dev/null +++ b/vendor/github.com/m3db/stackadler32/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Senthil Arivudainambi + +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/m3db/stackadler32/Readme.md b/vendor/github.com/m3db/stackadler32/Readme.md new file mode 100644 index 00000000..3e8ff0c7 --- /dev/null +++ b/vendor/github.com/m3db/stackadler32/Readme.md @@ -0,0 +1,27 @@ +# stackadler32 + +## Note: This is a fork of [github.com/sent-hil/adler32](http://github.com/sent-hil/adler32) that provides digests that are allocated on the stack and can be incrementally written to. This is useful for places where you perform concurrent checksumming and there's no good place to cache a digest without needing to acquire it expensively (under lock, etc). + +Port of adler32 checksum function as described here: https://www.ietf.org/rfc/rfc1950.txt to Go. + +## Example: + +```go + adler32.Checksum([]byte("Hello World")) +``` + +## Tests + +```bash +$ go test +PASS +ok github.com/sent-hil/adler32 2.429s + +$ go test -bench=. +# This library is slightly faster than the one in standard library. +$ go test -bench=. +BenchmarkThis-4 10000 230169 ns/op +BenchmarkStdLib-4 10000 190834 ns/op +PASS +ok github.com/sent-hil/adler32 6.554s +``` diff --git a/vendor/github.com/m3db/stackadler32/adler32.go b/vendor/github.com/m3db/stackadler32/adler32.go new file mode 100644 index 00000000..ee6aca94 --- /dev/null +++ b/vendor/github.com/m3db/stackadler32/adler32.go @@ -0,0 +1,47 @@ +package stackadler32 + +var prime uint32 = 65521 + +// Digest computes an adler32 hash and will very likely +// be allocated on the stack when used locally and not casted +// to an interface. +type Digest struct { + initialized bool + s1 uint32 + s2 uint32 +} + +// NewDigest returns an adler32 digest struct. +func NewDigest() Digest { + return Digest{ + initialized: true, + s1: 1 & 0xffff, + s2: (1 >> 16) & 0xffff, + } +} + +// Update returns a new derived adler32 digest struct. +func (d Digest) Update(buf []byte) Digest { + r := d + if !r.initialized { + r = NewDigest() + } + for n := 0; n < len(buf); n++ { + r.s1 = (r.s1 + uint32(buf[n])) % prime + r.s2 = (r.s2 + r.s1) % prime + } + return r +} + +// Sum32 returns the currently computed adler32 hash. +func (d Digest) Sum32() uint32 { + if !d.initialized { + return NewDigest().Sum32() + } + return ((d.s2 << 16) | d.s1) +} + +// Checksum returns an adler32 checksum of the buffer specified. +func Checksum(buf []byte) uint32 { + return NewDigest().Update(buf).Sum32() +} diff --git a/vendor/github.com/m3db/stackmurmur3/v2/.gitignore b/vendor/github.com/m3db/stackmurmur3/v2/.gitignore new file mode 100644 index 00000000..1377554e --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/.gitignore @@ -0,0 +1 @@ +*.swp diff --git a/vendor/github.com/m3db/stackmurmur3/v2/LICENSE b/vendor/github.com/m3db/stackmurmur3/v2/LICENSE new file mode 100644 index 00000000..e4a085c5 --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/LICENSE @@ -0,0 +1,49 @@ +Copyright 2013, Sébastien Paolacci. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the library 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 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. + +Copyright 2018, Travis Bischel. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the library 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 BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/m3db/stackmurmur3/v2/README.md b/vendor/github.com/m3db/stackmurmur3/v2/README.md new file mode 100644 index 00000000..24fb7311 --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/README.md @@ -0,0 +1,131 @@ +murmur3 +======= + +### Note: This is a fork of [github.com/twmb/murmur3](http://github.com/twmb/murmur3), which is also a fork of `spaolacci/murmur3`) that provides streaming digests without any additional allocations, unlike `Hash` interface based original implementation. + +Native Go implementation of Austin Appleby's third MurmurHash revision (aka +MurmurHash3). + +Includes assembly for amd64 for 64/128 bit hashes, seeding functions, +and string functions to avoid string to slice conversions. + +Hand rolled 32 bit assembly was removed during 1.11, but may be reintroduced +if the compiler slows down any more. As is, the compiler generates marginally +slower code (by one instruction in the hot loop). + +The reference algorithm has been slightly hacked as to support the streaming mode +required by Go's standard [Hash interface](http://golang.org/pkg/hash/#Hash). + +Endianness +========== + +Unlike the canonical source, this library **always** reads bytes as little +endian numbers. This makes the hashes portable across architectures, although +does mean that hashing is a bit slower on big endian architectures. + +Safety +====== + +This library used to use `unsafe` to convert four bytes to a `uint32` and eight +bytes to a `uint64`, but Go 1.14 introduced checks around those types of +conversions that flagged that code as erroneous when hashing on unaligned +input. While the code would not be problematic on amd64, it could be +problematic on some architectures. + +As of Go 1.14, those conversions were removed at the expense of a very minor +performance hit. This hit affects all cpu architectures on for `Sum32`, and +non-amd64 architectures for `Sum64` and `Sum128`. For 64 and 128, custom +assembly exists for amd64 that preserves performance. + +Testing +======= + +[![Build Status](https://travis-ci.org/twmb/murmur3.svg?branch=master)](https://travis-ci.org/twmb/murmur3) + +Testing includes comparing random inputs against the [canonical +implementation](https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp), +and testing length 0 through 17 inputs to force all branches. + +Because this code always reads input as little endian, testing against the +canonical source is skipped for big endian architectures. The canonical source +just converts bytes to numbers, meaning on big endian architectures, it will +use different numbers for its hashing. + +Documentation +============= + +[![GoDoc](https://godoc.org/github.com/twmb/murmur3?status.svg)](https://godoc.org/github.com/twmb/murmur3) + +Full documentation can be found on `godoc`. + +Benchmarks +========== + +Benchmarks below were run on an amd64 machine with _and_ without the custom +assembly. The following numbers are for Go 1.14.1 and are comparing against +[spaolacci/murmur3](https://github.com/spaolacci/murmur3). + +You will notice that at small sizes, the other library is better. This is due +to this library converting to safe code for Go 1.14. At large sizes, this +library is nearly identical to the other. On amd64, the 64 bit and 128 bit +sums come out to ~9% faster. + +32 bit sums: + +``` +32Sizes/32-12 3.00GB/s ± 1% 2.12GB/s ±11% -29.24% (p=0.000 n=9+10) +32Sizes/64-12 3.61GB/s ± 3% 2.79GB/s ± 8% -22.62% (p=0.000 n=10+10) +32Sizes/128-12 3.47GB/s ± 8% 2.79GB/s ± 4% -19.47% (p=0.000 n=10+10) +32Sizes/256-12 3.66GB/s ± 4% 3.25GB/s ± 6% -11.09% (p=0.000 n=10+10) +32Sizes/512-12 3.78GB/s ± 3% 3.54GB/s ± 4% -6.30% (p=0.000 n=9+9) +32Sizes/1024-12 3.86GB/s ± 3% 3.69GB/s ± 5% -4.46% (p=0.000 n=10+10) +32Sizes/2048-12 3.85GB/s ± 3% 3.81GB/s ± 3% ~ (p=0.079 n=10+9) +32Sizes/4096-12 3.90GB/s ± 3% 3.82GB/s ± 2% -2.14% (p=0.029 n=10+10) +32Sizes/8192-12 3.82GB/s ± 3% 3.78GB/s ± 7% ~ (p=0.529 n=10+10) +``` + +64/128 bit sums, non-amd64: + +``` +64Sizes/32-12 2.34GB/s ± 5% 2.64GB/s ± 9% +12.87% (p=0.000 n=10+10) +64Sizes/64-12 3.62GB/s ± 5% 3.96GB/s ± 4% +9.41% (p=0.000 n=10+10) +64Sizes/128-12 5.12GB/s ± 3% 5.44GB/s ± 4% +6.09% (p=0.000 n=10+9) +64Sizes/256-12 6.35GB/s ± 2% 6.27GB/s ± 9% ~ (p=0.796 n=10+10) +64Sizes/512-12 6.58GB/s ± 7% 6.79GB/s ± 3% ~ (p=0.075 n=10+10) +64Sizes/1024-12 7.49GB/s ± 3% 7.55GB/s ± 9% ~ (p=0.393 n=10+10) +64Sizes/2048-12 8.06GB/s ± 2% 7.90GB/s ± 6% ~ (p=0.156 n=9+10) +64Sizes/4096-12 8.27GB/s ± 6% 8.22GB/s ± 5% ~ (p=0.631 n=10+10) +64Sizes/8192-12 8.35GB/s ± 4% 8.38GB/s ± 6% ~ (p=0.631 n=10+10) +128Sizes/32-12 2.27GB/s ± 2% 2.68GB/s ± 5% +18.00% (p=0.000 n=10+10) +128Sizes/64-12 3.55GB/s ± 2% 4.00GB/s ± 3% +12.47% (p=0.000 n=8+9) +128Sizes/128-12 5.09GB/s ± 1% 5.43GB/s ± 3% +6.65% (p=0.000 n=9+9) +128Sizes/256-12 6.33GB/s ± 3% 5.65GB/s ± 4% -10.79% (p=0.000 n=9+10) +128Sizes/512-12 6.78GB/s ± 3% 6.74GB/s ± 6% ~ (p=0.968 n=9+10) +128Sizes/1024-12 7.46GB/s ± 4% 7.56GB/s ± 4% ~ (p=0.222 n=9+9) +128Sizes/2048-12 7.99GB/s ± 4% 7.96GB/s ± 3% ~ (p=0.666 n=9+9) +128Sizes/4096-12 8.20GB/s ± 2% 8.25GB/s ± 4% ~ (p=0.631 n=10+10) +128Sizes/8192-12 8.24GB/s ± 2% 8.26GB/s ± 5% ~ (p=0.673 n=8+9) +``` + +64/128 bit sums, amd64: + +``` +64Sizes/32-12 2.34GB/s ± 5% 4.36GB/s ± 3% +85.86% (p=0.000 n=10+10) +64Sizes/64-12 3.62GB/s ± 5% 6.27GB/s ± 3% +73.37% (p=0.000 n=10+9) +64Sizes/128-12 5.12GB/s ± 3% 7.70GB/s ± 6% +50.27% (p=0.000 n=10+10) +64Sizes/256-12 6.35GB/s ± 2% 8.61GB/s ± 3% +35.50% (p=0.000 n=10+10) +64Sizes/512-12 6.58GB/s ± 7% 8.59GB/s ± 4% +30.48% (p=0.000 n=10+9) +64Sizes/1024-12 7.49GB/s ± 3% 8.81GB/s ± 2% +17.66% (p=0.000 n=10+10) +64Sizes/2048-12 8.06GB/s ± 2% 8.90GB/s ± 4% +10.49% (p=0.000 n=9+10) +64Sizes/4096-12 8.27GB/s ± 6% 8.90GB/s ± 4% +7.54% (p=0.000 n=10+10) +64Sizes/8192-12 8.35GB/s ± 4% 9.00GB/s ± 3% +7.80% (p=0.000 n=10+9) +128Sizes/32-12 2.27GB/s ± 2% 4.29GB/s ± 9% +88.75% (p=0.000 n=10+10) +128Sizes/64-12 3.55GB/s ± 2% 6.10GB/s ± 8% +71.78% (p=0.000 n=8+10) +128Sizes/128-12 5.09GB/s ± 1% 7.62GB/s ± 9% +49.63% (p=0.000 n=9+10) +128Sizes/256-12 6.33GB/s ± 3% 8.65GB/s ± 3% +36.71% (p=0.000 n=9+10) +128Sizes/512-12 6.78GB/s ± 3% 8.39GB/s ± 6% +23.77% (p=0.000 n=9+10) +128Sizes/1024-12 7.46GB/s ± 4% 8.70GB/s ± 4% +16.70% (p=0.000 n=9+10) +128Sizes/2048-12 7.99GB/s ± 4% 8.73GB/s ± 8% +9.26% (p=0.003 n=9+10) +128Sizes/4096-12 8.20GB/s ± 2% 8.86GB/s ± 6% +8.00% (p=0.000 n=10+10) +128Sizes/8192-12 8.24GB/s ± 2% 9.01GB/s ± 3% +9.30% (p=0.000 n=8+10) +``` diff --git a/vendor/github.com/m3db/stackmurmur3/v2/go.mod b/vendor/github.com/m3db/stackmurmur3/v2/go.mod new file mode 100644 index 00000000..3d68e4dc --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/go.mod @@ -0,0 +1,5 @@ +module github.com/m3db/stackmurmur3/v2 + +go 1.14 + +require github.com/stretchr/testify v1.6.1 diff --git a/vendor/github.com/m3db/stackmurmur3/v2/go.sum b/vendor/github.com/m3db/stackmurmur3/v2/go.sum new file mode 100644 index 00000000..afe7890c --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/go.sum @@ -0,0 +1,11 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/m3db/stackmurmur3/v2/murmur.go b/vendor/github.com/m3db/stackmurmur3/v2/murmur.go new file mode 100644 index 00000000..20f8ac6e --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/murmur.go @@ -0,0 +1,72 @@ +// Copyright 2013, Sébastien Paolacci. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package murmur3 provides an amd64 native (Go generic fallback) +// implementation of the murmur3 hash algorithm for strings and slices. +// +// Assembly is provided for amd64 go1.5+; pull requests are welcome for other +// architectures. +package murmur3 + +import ( + "reflect" + "unsafe" +) + +type bmixer interface { + bmix(p []byte) (tail []byte) + Size() (n int) + reset() +} + +type digest struct { + clen int // Digested input cumulative length. + tail []byte // 0 to Size()-1 bytes view of `buf'. + buf [16]byte // Expected (but not required) to be Size() large. + bmixer +} + +func (d *digest) BlockSize() int { return 1 } + +func (d *digest) Write(p []byte) (n int, err error) { + n = len(p) + d.clen += n + + if len(d.tail) > 0 { + // Stick back pending bytes. + nfree := d.Size() - len(d.tail) // nfree ∈ [1, d.Size()-1]. + if nfree < len(p) { + // One full block can be formed. + block := append(d.tail, p[:nfree]...) + p = p[nfree:] + _ = d.bmix(block) // No tail. + } else { + // Tail's buf is large enough to prevent reallocs. + p = append(d.tail, p...) + } + } + + d.tail = d.bmix(p) + + // Keep own copy of the 0 to Size()-1 pending bytes. + nn := copy(d.buf[:], d.tail) + d.tail = d.buf[:nn] + + return n, nil +} + +func (d *digest) Reset() { + d.clen = 0 + d.tail = nil + d.bmixer.reset() +} + +func strslice(slice []byte) string { + var str string + *(*reflect.StringHeader)(unsafe.Pointer(&str)) = reflect.StringHeader{ + Data: ((*reflect.SliceHeader)(unsafe.Pointer(&slice))).Data, + Len: len(slice), + } + return str +} diff --git a/vendor/github.com/m3db/stackmurmur3/v2/murmur128.go b/vendor/github.com/m3db/stackmurmur3/v2/murmur128.go new file mode 100644 index 00000000..d02199f3 --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/murmur128.go @@ -0,0 +1,182 @@ +package murmur3 + +import ( + "hash" + "math/bits" +) + +const ( + c1_128 = 0x87c37b91114253d5 + c2_128 = 0x4cf5ad432745937f +) + +// Make sure interfaces are correctly implemented. +var ( + _ hash.Hash = new(digest128) + _ Hash128 = new(digest128) + _ bmixer = new(digest128) +) + +// Hash128 provides an interface for a streaming 128 bit hash. +type Hash128 interface { + hash.Hash + Sum128() (uint64, uint64) +} + +// digest128 represents a partial evaluation of a 128 bites hash. +type digest128 struct { + digest + seed1 uint64 + seed2 uint64 + h1 uint64 // Unfinalized running hash part 1. + h2 uint64 // Unfinalized running hash part 2. +} + +// SeedNew128 returns a Hash128 for streaming 128 bit sums with its internal +// digests initialized to seed1 and seed2. +// +// The canonical implementation allows one only uint32 seed; to imitate that +// behavior, use the same, uint32-max seed for seed1 and seed2. +func SeedNew128(seed1, seed2 uint64) Hash128 { + d := &digest128{seed1: seed1, seed2: seed2} + d.bmixer = d + d.Reset() + return d +} + +// New128 returns a Hash128 for streaming 128 bit sums. +func New128() Hash128 { + return SeedNew128(0, 0) +} + +func (d *digest128) Size() int { return 16 } + +func (d *digest128) reset() { d.h1, d.h2 = d.seed1, d.seed2 } + +func (d *digest128) Sum(b []byte) []byte { + h1, h2 := d.Sum128() + return append(b, + byte(h1>>56), byte(h1>>48), byte(h1>>40), byte(h1>>32), + byte(h1>>24), byte(h1>>16), byte(h1>>8), byte(h1), + + byte(h2>>56), byte(h2>>48), byte(h2>>40), byte(h2>>32), + byte(h2>>24), byte(h2>>16), byte(h2>>8), byte(h2), + ) +} + +func (d *digest128) bmix(p []byte) (tail []byte) { + h1, h2 := d.h1, d.h2 + + for len(p) >= 16 { + k1 := uint64(p[0]) | uint64(p[1])<<8 | uint64(p[2])<<16 | uint64(p[3])<<24 | uint64(p[4])<<32 | uint64(p[5])<<40 | uint64(p[6])<<48 | uint64(p[7])<<56 + k2 := uint64(p[8]) | uint64(p[9])<<8 | uint64(p[10])<<16 | uint64(p[11])<<24 | uint64(p[12])<<32 | uint64(p[13])<<40 | uint64(p[14])<<48 | uint64(p[15])<<56 + p = p[16:] + + k1 *= c1_128 + k1 = bits.RotateLeft64(k1, 31) + k1 *= c2_128 + h1 ^= k1 + + h1 = bits.RotateLeft64(h1, 27) + h1 += h2 + h1 = h1*5 + 0x52dce729 + + k2 *= c2_128 + k2 = bits.RotateLeft64(k2, 33) + k2 *= c1_128 + h2 ^= k2 + + h2 = bits.RotateLeft64(h2, 31) + h2 += h1 + h2 = h2*5 + 0x38495ab5 + } + d.h1, d.h2 = h1, h2 + return p +} + +func (d *digest128) Sum128() (h1, h2 uint64) { + + h1, h2 = d.h1, d.h2 + + var k1, k2 uint64 + switch len(d.tail) & 15 { + case 15: + k2 ^= uint64(d.tail[14]) << 48 + fallthrough + case 14: + k2 ^= uint64(d.tail[13]) << 40 + fallthrough + case 13: + k2 ^= uint64(d.tail[12]) << 32 + fallthrough + case 12: + k2 ^= uint64(d.tail[11]) << 24 + fallthrough + case 11: + k2 ^= uint64(d.tail[10]) << 16 + fallthrough + case 10: + k2 ^= uint64(d.tail[9]) << 8 + fallthrough + case 9: + k2 ^= uint64(d.tail[8]) << 0 + + k2 *= c2_128 + k2 = bits.RotateLeft64(k2, 33) + k2 *= c1_128 + h2 ^= k2 + + fallthrough + + case 8: + k1 ^= uint64(d.tail[7]) << 56 + fallthrough + case 7: + k1 ^= uint64(d.tail[6]) << 48 + fallthrough + case 6: + k1 ^= uint64(d.tail[5]) << 40 + fallthrough + case 5: + k1 ^= uint64(d.tail[4]) << 32 + fallthrough + case 4: + k1 ^= uint64(d.tail[3]) << 24 + fallthrough + case 3: + k1 ^= uint64(d.tail[2]) << 16 + fallthrough + case 2: + k1 ^= uint64(d.tail[1]) << 8 + fallthrough + case 1: + k1 ^= uint64(d.tail[0]) << 0 + k1 *= c1_128 + k1 = bits.RotateLeft64(k1, 31) + k1 *= c2_128 + h1 ^= k1 + } + + h1 ^= uint64(d.clen) + h2 ^= uint64(d.clen) + + h1 += h2 + h2 += h1 + + h1 = fmix64(h1) + h2 = fmix64(h2) + + h1 += h2 + h2 += h1 + + return h1, h2 +} + +func fmix64(k uint64) uint64 { + k ^= k >> 33 + k *= 0xff51afd7ed558ccd + k ^= k >> 33 + k *= 0xc4ceb9fe1a85ec53 + k ^= k >> 33 + return k +} diff --git a/vendor/github.com/m3db/stackmurmur3/v2/murmur128_amd64.s b/vendor/github.com/m3db/stackmurmur3/v2/murmur128_amd64.s new file mode 100644 index 00000000..5272b322 --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/murmur128_amd64.s @@ -0,0 +1,246 @@ +// +build go1.5,amd64 + +// SeedSum128(seed1, seed2 uint64, data []byte) (h1 uint64, h2 uint64) +TEXT ·SeedSum128(SB), $0-56 + MOVQ seed1+0(FP), R12 + MOVQ seed2+8(FP), R13 + MOVQ data_base+16(FP), SI + MOVQ data_len+24(FP), R9 + LEAQ h1+40(FP), BX + JMP sum128internal<>(SB) + +// Sum128(data []byte) (h1 uint64, h2 uint64) +TEXT ·Sum128(SB), $0-40 + XORQ R12, R12 + XORQ R13, R13 + MOVQ data_base+0(FP), SI + MOVQ data_len+8(FP), R9 + LEAQ h1+24(FP), BX + JMP sum128internal<>(SB) + +// SeedStringSum128(seed1, seed2 uint64, data string) (h1 uint64, h2 uint64) +TEXT ·SeedStringSum128(SB), $0-48 + MOVQ seed1+0(FP), R12 + MOVQ seed2+8(FP), R13 + MOVQ data_base+16(FP), SI + MOVQ data_len+24(FP), R9 + LEAQ h1+32(FP), BX + JMP sum128internal<>(SB) + +// StringSum128(data string) (h1 uint64, h2 uint64) +TEXT ·StringSum128(SB), $0-32 + XORQ R12, R12 + XORQ R13, R13 + MOVQ data_base+0(FP), SI + MOVQ data_len+8(FP), R9 + LEAQ h1+16(FP), BX + JMP sum128internal<>(SB) + +// Expects: +// R12 == h1 uint64 seed +// R13 == h2 uint64 seed +// SI == &data +// R9 == len(data) +// BX == &[2]uint64 return +TEXT sum128internal<>(SB), $0 + MOVQ $0x87c37b91114253d5, R14 // c1 + MOVQ $0x4cf5ad432745937f, R15 // c2 + + MOVQ R9, CX + ANDQ $-16, CX // cx == data_len - (data_len % 16) + + // for r10 = 0; r10 < cx; r10 += 16 {... + XORQ R10, R10 + +loop: + CMPQ R10, CX + JE tail + MOVQ (SI)(R10*1), AX + MOVQ 8(SI)(R10*1), DX + ADDQ $16, R10 + + IMULQ R14, AX + IMULQ R15, DX + + ROLQ $31, AX + ROLQ $33, DX + + IMULQ R15, AX + IMULQ R14, DX + + XORQ AX, R12 + ROLQ $27, R12 + ADDQ R13, R12 + XORQ DX, R13 + ROLQ $31, R13 + LEAQ 0x52dce729(R12)(R12*4), R12 + + ADDQ R12, R13 + LEAQ 0x38495ab5(R13)(R13*4), R13 + + JMP loop + +tail: + MOVQ R9, CX + ANDQ $0xf, CX + JZ finalize // if len % 16 == 0 + + XORQ AX, AX + + // poor man's binary tree jump table + SUBQ $8, CX + JZ tail8 + JG over8 + ADDQ $4, CX + JZ tail4 + JG over4 + ADDQ $2, CX + JL tail1 + JZ tail2 + JMP tail3 + +over4: + SUBQ $2, CX + JL tail5 + JZ tail6 + JMP tail7 + +over8: + SUBQ $4, CX + JZ tail12 + JG over12 + ADDQ $2, CX + JL tail9 + JZ tail10 + JMP tail11 + +over12: + SUBQ $2, CX + JL tail13 + JZ tail14 + +tail15: + MOVBQZX 14(SI)(R10*1), AX + SALQ $16, AX + +tail14: + MOVW 12(SI)(R10*1), AX + SALQ $32, AX + JMP tail12 + +tail13: + MOVBQZX 12(SI)(R10*1), AX + SALQ $32, AX + +tail12: + MOVL 8(SI)(R10*1), DX + ORQ DX, AX + JMP fintailhigh + +tail11: + MOVBQZX 10(SI)(R10*1), AX + SALQ $16, AX + +tail10: + MOVW 8(SI)(R10*1), AX + JMP fintailhigh + +tail9: + MOVB 8(SI)(R10*1), AL + +fintailhigh: + IMULQ R15, AX + ROLQ $33, AX + IMULQ R14, AX + XORQ AX, R13 + +tail8: + MOVQ (SI)(R10*1), AX + JMP fintaillow + +tail7: + MOVBQZX 6(SI)(R10*1), AX + SALQ $16, AX + +tail6: + MOVW 4(SI)(R10*1), AX + SALQ $32, AX + JMP tail4 + +tail5: + MOVBQZX 4(SI)(R10*1), AX + SALQ $32, AX + +tail4: + MOVL (SI)(R10*1), DX + ORQ DX, AX + JMP fintaillow + +tail3: + MOVBQZX 2(SI)(R10*1), AX + SALQ $16, AX + +tail2: + MOVW (SI)(R10*1), AX + JMP fintaillow + +tail1: + MOVB (SI)(R10*1), AL + +fintaillow: + IMULQ R14, AX + ROLQ $31, AX + IMULQ R15, AX + XORQ AX, R12 + +finalize: + XORQ R9, R12 + XORQ R9, R13 + + ADDQ R13, R12 + ADDQ R12, R13 + + // fmix128 (both interleaved) + MOVQ R12, DX + MOVQ R13, AX + + SHRQ $33, DX + SHRQ $33, AX + + XORQ DX, R12 + XORQ AX, R13 + + MOVQ $0xff51afd7ed558ccd, CX + + IMULQ CX, R12 + IMULQ CX, R13 + + MOVQ R12, DX + MOVQ R13, AX + + SHRQ $33, DX + SHRQ $33, AX + + XORQ DX, R12 + XORQ AX, R13 + + MOVQ $0xc4ceb9fe1a85ec53, CX + + IMULQ CX, R12 + IMULQ CX, R13 + + MOVQ R12, DX + MOVQ R13, AX + + SHRQ $33, DX + SHRQ $33, AX + + XORQ DX, R12 + XORQ AX, R13 + + ADDQ R13, R12 + ADDQ R12, R13 + + MOVQ R12, (BX) + MOVQ R13, 8(BX) + RET diff --git a/vendor/github.com/m3db/stackmurmur3/v2/murmur128_decl.go b/vendor/github.com/m3db/stackmurmur3/v2/murmur128_decl.go new file mode 100644 index 00000000..a380b444 --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/murmur128_decl.go @@ -0,0 +1,34 @@ +// +build go1.5,amd64 + +package murmur3 + +//go:noescape + +// Sum128 returns the murmur3 sum of data. It is equivalent to the following +// sequence (without the extra burden and the extra allocation): +// hasher := New128() +// hasher.Write(data) +// return hasher.Sum128() +func Sum128(data []byte) (h1 uint64, h2 uint64) + +//go:noescape + +// SeedSum128 returns the murmur3 sum of data with digests initialized to seed1 +// and seed2. +// +// The canonical implementation allows only one uint32 seed; to imitate that +// behavior, use the same, uint32-max seed for seed1 and seed2. +// +// This reads and processes the data in chunks of little endian uint64s; +// thus, the returned hashes are portable across architectures. +func SeedSum128(seed1, seed2 uint64, data []byte) (h1 uint64, h2 uint64) + +//go:noescape + +// StringSum128 is the string version of Sum128. +func StringSum128(data string) (h1 uint64, h2 uint64) + +//go:noescape + +// SeedStringSum128 is the string version of SeedSum128. +func SeedStringSum128(seed1, seed2 uint64, data string) (h1 uint64, h2 uint64) diff --git a/vendor/github.com/m3db/stackmurmur3/v2/murmur128_gen.go b/vendor/github.com/m3db/stackmurmur3/v2/murmur128_gen.go new file mode 100644 index 00000000..58425bce --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/murmur128_gen.go @@ -0,0 +1,135 @@ +// +build !go1.5 !amd64 + +package murmur3 + +import "math/bits" + +// SeedSum128 returns the murmur3 sum of data with digests initialized to seed1 +// and seed2. +// +// The canonical implementation allows only one uint32 seed; to imitate that +// behavior, use the same, uint32-max seed for seed1 and seed2. +// +// This reads and processes the data in chunks of little endian uint64s; +// thus, the returned hashes are portable across architectures. +func SeedSum128(seed1, seed2 uint64, data []byte) (h1 uint64, h2 uint64) { + return SeedStringSum128(seed1, seed2, strslice(data)) +} + +// Sum128 returns the murmur3 sum of data. It is equivalent to the following +// sequence (without the extra burden and the extra allocation): +// hasher := New128() +// hasher.Write(data) +// return hasher.Sum128() +func Sum128(data []byte) (h1 uint64, h2 uint64) { + return SeedStringSum128(0, 0, strslice(data)) +} + +// StringSum128 is the string version of Sum128. +func StringSum128(data string) (h1 uint64, h2 uint64) { + return SeedStringSum128(0, 0, data) +} + +// SeedStringSum128 is the string version of SeedSum128. +func SeedStringSum128(seed1, seed2 uint64, data string) (h1 uint64, h2 uint64) { + h1, h2 = seed1, seed2 + clen := len(data) + for len(data) >= 16 { + // yes, this is faster than using binary.LittleEndian.Uint64 + k1 := uint64(data[0]) | uint64(data[1])<<8 | uint64(data[2])<<16 | uint64(data[3])<<24 | uint64(data[4])<<32 | uint64(data[5])<<40 | uint64(data[6])<<48 | uint64(data[7])<<56 + k2 := uint64(data[8]) | uint64(data[9])<<8 | uint64(data[10])<<16 | uint64(data[11])<<24 | uint64(data[12])<<32 | uint64(data[13])<<40 | uint64(data[14])<<48 | uint64(data[15])<<56 + + data = data[16:] + + k1 *= c1_128 + k1 = bits.RotateLeft64(k1, 31) + k1 *= c2_128 + h1 ^= k1 + + h1 = bits.RotateLeft64(h1, 27) + h1 += h2 + h1 = h1*5 + 0x52dce729 + + k2 *= c2_128 + k2 = bits.RotateLeft64(k2, 33) + k2 *= c1_128 + h2 ^= k2 + + h2 = bits.RotateLeft64(h2, 31) + h2 += h1 + h2 = h2*5 + 0x38495ab5 + } + + var k1, k2 uint64 + switch len(data) { + case 15: + k2 ^= uint64(data[14]) << 48 + fallthrough + case 14: + k2 ^= uint64(data[13]) << 40 + fallthrough + case 13: + k2 ^= uint64(data[12]) << 32 + fallthrough + case 12: + k2 ^= uint64(data[11]) << 24 + fallthrough + case 11: + k2 ^= uint64(data[10]) << 16 + fallthrough + case 10: + k2 ^= uint64(data[9]) << 8 + fallthrough + case 9: + k2 ^= uint64(data[8]) << 0 + + k2 *= c2_128 + k2 = bits.RotateLeft64(k2, 33) + k2 *= c1_128 + h2 ^= k2 + + fallthrough + + case 8: + k1 ^= uint64(data[7]) << 56 + fallthrough + case 7: + k1 ^= uint64(data[6]) << 48 + fallthrough + case 6: + k1 ^= uint64(data[5]) << 40 + fallthrough + case 5: + k1 ^= uint64(data[4]) << 32 + fallthrough + case 4: + k1 ^= uint64(data[3]) << 24 + fallthrough + case 3: + k1 ^= uint64(data[2]) << 16 + fallthrough + case 2: + k1 ^= uint64(data[1]) << 8 + fallthrough + case 1: + k1 ^= uint64(data[0]) << 0 + k1 *= c1_128 + k1 = bits.RotateLeft64(k1, 31) + k1 *= c2_128 + h1 ^= k1 + } + + h1 ^= uint64(clen) + h2 ^= uint64(clen) + + h1 += h2 + h2 += h1 + + h1 = fmix64(h1) + h2 = fmix64(h2) + + h1 += h2 + h2 += h1 + + return h1, h2 +} diff --git a/vendor/github.com/m3db/stackmurmur3/v2/murmur32.go b/vendor/github.com/m3db/stackmurmur3/v2/murmur32.go new file mode 100644 index 00000000..f61b58f7 --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/murmur32.go @@ -0,0 +1,100 @@ +package murmur3 + +import ( + "hash" + "math/bits" +) + +// Make sure interfaces are correctly implemented. +var ( + _ hash.Hash = new(digest32) + _ hash.Hash32 = new(digest32) +) + +const ( + c1_32 uint32 = 0xcc9e2d51 + c2_32 uint32 = 0x1b873593 +) + +// digest32 represents a partial evaluation of a 32 bites hash. +type digest32 struct { + digest + seed uint32 + h1 uint32 // Unfinalized running hash. +} + +// SeedNew32 returns a hash.Hash32 for streaming 32 bit sums with its internal +// digest initialized to seed. +// +// This reads and processes the data in chunks of little endian uint32s; +// thus, the returned hash is portable across architectures. +func SeedNew32(seed uint32) hash.Hash32 { + d := &digest32{seed: seed} + d.bmixer = d + d.Reset() + return d +} + +// New32 returns a hash.Hash32 for streaming 32 bit sums. +func New32() hash.Hash32 { + return SeedNew32(0) +} + +func (d *digest32) Size() int { return 4 } + +func (d *digest32) reset() { d.h1 = d.seed } + +func (d *digest32) Sum(b []byte) []byte { + h := d.Sum32() + return append(b, byte(h>>24), byte(h>>16), byte(h>>8), byte(h)) +} + +// Digest as many blocks as possible. +func (d *digest32) bmix(p []byte) (tail []byte) { + h1 := d.h1 + + for len(p) >= 4 { + k1 := uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24 + p = p[4:] + + k1 *= c1_32 + k1 = bits.RotateLeft32(k1, 15) + k1 *= c2_32 + + h1 ^= k1 + h1 = bits.RotateLeft32(h1, 13) + h1 = h1*5 + 0xe6546b64 + } + d.h1 = h1 + return p +} + +func (d *digest32) Sum32() (h1 uint32) { + + h1 = d.h1 + var k1 uint32 + switch len(d.tail) & 3 { + case 3: + k1 ^= uint32(d.tail[2]) << 16 + fallthrough + case 2: + k1 ^= uint32(d.tail[1]) << 8 + fallthrough + case 1: + k1 ^= uint32(d.tail[0]) + k1 *= c1_32 + k1 = bits.RotateLeft32(k1, 15) + k1 *= c2_32 + h1 ^= k1 + } + + h1 ^= uint32(d.clen) + + h1 ^= h1 >> 16 + h1 *= 0x85ebca6b + h1 ^= h1 >> 13 + h1 *= 0xc2b2ae35 + h1 ^= h1 >> 16 + + return h1 +} diff --git a/vendor/github.com/m3db/stackmurmur3/v2/murmur32_gen.go b/vendor/github.com/m3db/stackmurmur3/v2/murmur32_gen.go new file mode 100644 index 00000000..49c71330 --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/murmur32_gen.go @@ -0,0 +1,69 @@ +package murmur3 + +import "math/bits" + +// SeedSum32 returns the murmur3 sum of data with the digest initialized to +// seed. +// +// This reads and processes the data in chunks of little endian uint32s; +// thus, the returned hash is portable across architectures. +func SeedSum32(seed uint32, data []byte) (h1 uint32) { + return SeedStringSum32(seed, strslice(data)) +} + +// Sum32 returns the murmur3 sum of data. It is equivalent to the following +// sequence (without the extra burden and the extra allocation): +// hasher := New32() +// hasher.Write(data) +// return hasher.Sum32() +func Sum32(data []byte) uint32 { + return SeedStringSum32(0, strslice(data)) +} + +// StringSum32 is the string version of Sum32. +func StringSum32(data string) uint32 { + return SeedStringSum32(0, data) +} + +// SeedStringSum32 is the string version of SeedSum32. +func SeedStringSum32(seed uint32, data string) (h1 uint32) { + h1 = seed + clen := uint32(len(data)) + for len(data) >= 4 { + k1 := uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16 | uint32(data[3])<<24 + data = data[4:] + + k1 *= c1_32 + k1 = bits.RotateLeft32(k1, 15) + k1 *= c2_32 + + h1 ^= k1 + h1 = bits.RotateLeft32(h1, 13) + h1 = h1*5 + 0xe6546b64 + } + var k1 uint32 + switch len(data) { + case 3: + k1 ^= uint32(data[2]) << 16 + fallthrough + case 2: + k1 ^= uint32(data[1]) << 8 + fallthrough + case 1: + k1 ^= uint32(data[0]) + k1 *= c1_32 + k1 = bits.RotateLeft32(k1, 15) + k1 *= c2_32 + h1 ^= k1 + } + + h1 ^= uint32(clen) + + h1 ^= h1 >> 16 + h1 *= 0x85ebca6b + h1 ^= h1 >> 13 + h1 *= 0xc2b2ae35 + h1 ^= h1 >> 16 + + return h1 +} diff --git a/vendor/github.com/m3db/stackmurmur3/v2/murmur64.go b/vendor/github.com/m3db/stackmurmur3/v2/murmur64.go new file mode 100644 index 00000000..3dfd1d96 --- /dev/null +++ b/vendor/github.com/m3db/stackmurmur3/v2/murmur64.go @@ -0,0 +1,70 @@ +package murmur3 + +import ( + "hash" +) + +// Make sure interfaces are correctly implemented. +var ( + _ hash.Hash = new(digest64) + _ hash.Hash64 = new(digest64) + _ bmixer = new(digest64) +) + +// digest64 is half a digest128. +type digest64 digest128 + +// SeedNew64 returns a hash.Hash64 for streaming 64 bit sums. As the canonical +// implementation does not support Sum64, this uses SeedNew128(seed, seed) +func SeedNew64(seed uint64) hash.Hash64 { + return (*digest64)(SeedNew128(seed, seed).(*digest128)) +} + +// New64 returns a hash.Hash64 for streaming 64 bit sums. +func New64() hash.Hash64 { + return SeedNew64(0) +} + +func (d *digest64) Sum(b []byte) []byte { + h1 := d.Sum64() + return append(b, + byte(h1>>56), byte(h1>>48), byte(h1>>40), byte(h1>>32), + byte(h1>>24), byte(h1>>16), byte(h1>>8), byte(h1)) +} + +func (d *digest64) Sum64() uint64 { + h1, _ := (*digest128)(d).Sum128() + return h1 +} + +// Sum64 returns the murmur3 sum of data. It is equivalent to the following +// sequence (without the extra burden and the extra allocation): +// hasher := New64() +// hasher.Write(data) +// return hasher.Sum64() +func Sum64(data []byte) uint64 { + h1, _ := Sum128(data) + return h1 +} + +// SeedSum64 returns the murmur3 sum of data with the digest initialized to +// seed. +// +// Because the canonical implementation does not support SeedSum64, this uses +// SeedSum128(seed, seed, data). +func SeedSum64(seed uint64, data []byte) uint64 { + h1, _ := SeedSum128(seed, seed, data) + return h1 +} + +// StringSum64 is the string version of Sum64. +func StringSum64(data string) uint64 { + h1, _ := StringSum128(data) + return h1 +} + +// SeedStringSum64 is the string version of SeedSum64. +func SeedStringSum64(seed uint64, data string) uint64 { + h1, _ := SeedStringSum128(seed, seed, data) + return h1 +} diff --git a/vendor/github.com/m3dbx/pilosa/LICENSE b/vendor/github.com/m3dbx/pilosa/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/m3dbx/pilosa/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/m3dbx/pilosa/NOTICE b/vendor/github.com/m3dbx/pilosa/NOTICE new file mode 100644 index 00000000..99ea00db --- /dev/null +++ b/vendor/github.com/m3dbx/pilosa/NOTICE @@ -0,0 +1,87 @@ +Software license +================ + +Copyright (C) 2017-2018 Pilosa Corp. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"). +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Enterprise Edition software license +=================================== + +Files contained under the directory `enterprise` are subject to the following +license notice (Full license included in the file `COPYING`): + + Copyright (C) 2018 Pilosa Corp. All rights reserved. + + Pilosa Enterprise Edition is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Pilosa Enterprise Edition is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with Pilosa Enterprise Edition. If not, see . + +Third-party software licenses +============================= + +The file /pilosa/lru/lru.go contains a redistribution of lru +(github.com/golang/groupcache/lru); the license follows: + + Copyright 2013 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +The file /enterprise/b/btree.go contains a modified redistribution of b +(https://github.com/cznic/b); the license follows: + + Copyright (c) 2014 The b 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 names of the authors nor the names of the + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/m3dbx/pilosa/logger/logger.go b/vendor/github.com/m3dbx/pilosa/logger/logger.go new file mode 100644 index 00000000..ed5a2dc2 --- /dev/null +++ b/vendor/github.com/m3dbx/pilosa/logger/logger.go @@ -0,0 +1,84 @@ +// Copyright 2017 Pilosa Corp. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logger + +import ( + "io" + "log" +) + +// Ensure nopLogger implements interface. +var _ Logger = &nopLogger{} + +// Logger represents an interface for a shared logger. +type Logger interface { + Printf(format string, v ...interface{}) + Debugf(format string, v ...interface{}) +} + +// NopLogger represents a Logger that doesn't do anything. +var NopLogger Logger = &nopLogger{} + +type nopLogger struct{} + +// Printf is a no-op implementation of the Logger Printf method. +func (n *nopLogger) Printf(format string, v ...interface{}) {} + +// Debugf is a no-op implementation of the Logger Debugf method. +func (n *nopLogger) Debugf(format string, v ...interface{}) {} + +// standardLogger is a basic implementation of Logger based on log.Logger. +type standardLogger struct { + logger *log.Logger +} + +func NewStandardLogger(w io.Writer) *standardLogger { + return &standardLogger{ + logger: log.New(w, "", log.LstdFlags), + } +} + +func (s *standardLogger) Printf(format string, v ...interface{}) { + s.logger.Printf(format, v...) +} + +func (s *standardLogger) Debugf(format string, v ...interface{}) {} + +func (s *standardLogger) Logger() *log.Logger { + return s.logger +} + +// verboseLogger is an implementation of Logger which includes debug messages. +type verboseLogger struct { + logger *log.Logger +} + +func NewVerboseLogger(w io.Writer) *verboseLogger { + return &verboseLogger{ + logger: log.New(w, "", log.LstdFlags), + } +} + +func (vb *verboseLogger) Printf(format string, v ...interface{}) { + vb.logger.Printf(format, v...) +} + +func (vb *verboseLogger) Debugf(format string, v ...interface{}) { + vb.logger.Printf(format, v...) +} + +func (vb *verboseLogger) Logger() *log.Logger { + return vb.logger +} diff --git a/vendor/github.com/m3dbx/pilosa/roaring/containers.go b/vendor/github.com/m3dbx/pilosa/roaring/containers.go new file mode 100644 index 00000000..6097a8d0 --- /dev/null +++ b/vendor/github.com/m3dbx/pilosa/roaring/containers.go @@ -0,0 +1,399 @@ +// Copyright (C) 2017-2018 Pilosa Corp. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package roaring + +type sliceContainers struct { + keys []uint64 + containers []*Container + lastKey uint64 + lastContainer *Container + + containersPool containersPool +} + +// ContainerPoolingConfiguration represents the configuration for +// container pooling. +type ContainerPoolingConfiguration struct { + // Maximum size of the allocated array that will be maintained in the pool. + MaxArraySize int + // Whether a bitmap should be allocated for each pooled container. + AllocateBitmap bool + // Maximum size of the allocated runs that will be maintained in the pool. + MaxRunsSize int + + // Maximum number of containers to pool. + MaxCapacity int + // Maximum size of keys and containers slice to maintain after calls to Reset(). + MaxKeysAndContainersSliceLength int +} + +// NewDefaultContainerPoolingConfiguration creates a ContainerPoolingConfiguration +// with default configuration. +func NewDefaultContainerPoolingConfiguration(maxCapacity int) ContainerPoolingConfiguration { + return ContainerPoolingConfiguration{ + MaxArraySize: ArrayMaxSize, + MaxRunsSize: runMaxSize, + AllocateBitmap: true, + + MaxCapacity: maxCapacity, + + // Compared to the size of the containers themselves, these slices are + // very small (8 bytes per entry), so we can afford to allow them to + // grow larger. + MaxKeysAndContainersSliceLength: maxCapacity * 10, + } +} + +type containersPool struct { + containers []*Container // Nil if pooling disabled, otherwise present. + config ContainerPoolingConfiguration +} + +func (cp *containersPool) put(c *Container) { + if cp == nil || cp.containers == nil { + // Ignore if pooling isn't configured. + return + } + + if c.mapped { + // If the container was mapped, assume the whole thing has been + // corrupted and reset it to an initial state (without reallocating + // according to the pooling config as its likely it will just be + // mapped again.) + *c = newContainer() + cp.containers = append(cp.containers, c) + return + } + + if len(cp.containers) > cp.config.MaxCapacity { + // Don't allow pool to exceed maximum capacity. + return + } + + if cap(c.array) > cp.config.MaxArraySize { + // Don't allow any containers with an allocated array slice to be + // returned to the pool if the config doesn't allow it. + c.array = nil + } + + if cap(c.runs) > cp.config.MaxRunsSize { + // Don't allow any containers with an allocated run slice to be + // returned to the pool if the config doesn't allow it. + c.runs = nil + } + + if !cp.config.AllocateBitmap { + c.bitmap = nil + } + + // Reset before returning to the pool to ensure all calls to get() return + // a clean container. + c.Reset() + cp.containers = append(cp.containers, c) +} + +func (cp *containersPool) get() *Container { + if cp == nil || cp.containers == nil { + return NewContainer() + } + + if len(cp.containers) > 0 { + // If we have a pooled container available, use that. + lastIdx := len(cp.containers) - 1 + c := cp.containers[lastIdx] + cp.containers = cp.containers[:lastIdx] + return c + } + + // Pooling is enabled, but there are no available containers, + // so we allocate. + return NewContainerWithPooling(cp.config) +} + +func newSliceContainers() *sliceContainers { + return &sliceContainers{} +} + +func newSliceContainersWithPooling(poolingConfig ContainerPoolingConfiguration) *sliceContainers { + sc := &sliceContainers{ + keys: make([]uint64, 0, poolingConfig.MaxCapacity), + containers: make([]*Container, 0, poolingConfig.MaxCapacity), + } + + sc.containersPool = containersPool{ + config: poolingConfig, + containers: make([]*Container, 0, poolingConfig.MaxCapacity), + } + for i := 0; i < poolingConfig.MaxCapacity; i++ { + sc.containersPool.put(NewContainerWithPooling(poolingConfig)) + } + + return sc +} + +func (sc *sliceContainers) Get(key uint64) *Container { + i := search64(sc.keys, key) + if i < 0 { + return nil + } + return sc.containers[i] +} + +func (sc *sliceContainers) Put(key uint64, c *Container) { + i := search64(sc.keys, key) + + // If index is negative then there's not an exact match + // and a container needs to be added. + if i < 0 { + sc.insertAt(key, c, -i-1) + } else { + sc.containers[i] = c + } + +} + +func (sc *sliceContainers) PutContainerValues(key uint64, containerType byte, n int, mapped bool) { + i := search64(sc.keys, key) + if i < 0 { + c := sc.containersPool.get() + c.containerType = containerType + c.n = int32(n) + c.mapped = mapped + sc.insertAt(key, c, -i-1) + } else { + c := sc.containers[i] + c.containerType = containerType + c.n = int32(n) + c.mapped = mapped + } + +} + +func (sc *sliceContainers) Remove(key uint64) { + statsHit("sliceContainers/Remove") + i := search64(sc.keys, key) + if i < 0 { + return + } + + sc.keys = append(sc.keys[:i], sc.keys[i+1:]...) + sc.containersPool.put(sc.containers[i]) + sc.containers = append(sc.containers[:i], sc.containers[i+1:]...) + +} +func (sc *sliceContainers) insertAt(key uint64, c *Container, i int) { + statsHit("sliceContainers/insertAt") + sc.keys = append(sc.keys, 0) + copy(sc.keys[i+1:], sc.keys[i:]) + sc.keys[i] = key + + sc.containers = append(sc.containers, nil) + copy(sc.containers[i+1:], sc.containers[i:]) + sc.containers[i] = c +} + +func (sc *sliceContainers) GetOrCreate(key uint64) *Container { + // Check the last* cache for same container. + if key == sc.lastKey && sc.lastContainer != nil { + return sc.lastContainer + } + + sc.lastKey = key + i := search64(sc.keys, key) + if i < 0 { + c := sc.containersPool.get() + sc.insertAt(key, c, -i-1) + sc.lastContainer = c + return c + } + + sc.lastContainer = sc.containers[i] + return sc.lastContainer +} + +func (sc *sliceContainers) Clone() Containers { + var other *sliceContainers + if sc.containersPool.containers != nil { + other = newSliceContainersWithPooling(sc.containersPool.config) + } else { + other = newSliceContainers() + } + + if cap(other.keys) > len(sc.keys) { + other.keys = other.keys[:len(sc.keys)] + } else { + other.keys = make([]uint64, len(sc.keys)) + } + + other.containers = make([]*Container, len(sc.containers)) + copy(other.keys, sc.keys) + for i, c := range sc.containers { + // TODO(rartoul): It would be more efficient to use one of + // other's pooled containers instead of alllowing Clone to + // allocate a new one when pooling is enabled. + other.containers[i] = c.Clone() + } + return other +} + +func (sc *sliceContainers) Last() (key uint64, c *Container) { + if len(sc.keys) == 0 { + return 0, nil + } + return sc.keys[len(sc.keys)-1], sc.containers[len(sc.keys)-1] +} + +func (sc *sliceContainers) Size() int { + return len(sc.keys) + +} + +func (sc *sliceContainers) Count() uint64 { + n := uint64(0) + for i := range sc.containers { + n += uint64(sc.containers[i].n) + } + return n +} + +func (sc *sliceContainers) Reset() { + for i := range sc.containers { + // Try and return containers to the pool (no-op if disabled.) + sc.containersPool.put(sc.containers[i]) + // Clear pointers to allow G.C to reclaim objects if these were the + // only outstanding pointers. + sc.containers[i] = nil + } + + if sc.poolingEnabled() { + if cap(sc.keys) <= sc.containersPool.config.MaxKeysAndContainersSliceLength { + sc.keys = sc.keys[:0] + } else { + sc.keys = make([]uint64, 0, sc.containersPool.config.MaxCapacity) + } + + if cap(sc.containers) <= sc.containersPool.config.MaxKeysAndContainersSliceLength { + sc.containers = sc.containers[:0] + } else { + sc.containers = make([]*Container, 0, sc.containersPool.config.MaxCapacity) + } + } else { + sc.keys = sc.keys[:0] + sc.containers = sc.containers[:0] + } + sc.lastContainer = nil + sc.lastKey = 0 +} + +func (sc *sliceContainers) poolingEnabled() bool { + return sc.containersPool.containers != nil +} + +func (sc *sliceContainers) seek(key uint64) (int, bool) { + i := search64(sc.keys, key) + found := true + if i < 0 { + found = false + i = -i - 1 + } + return i, found +} + +func (sc *sliceContainers) Iterator(key uint64) (citer ContainerIterator, found bool) { + i, found := sc.seek(key) + return &sliceIterator{e: sc, i: i}, found +} + +func (sc *sliceContainers) Repair() { + for _, c := range sc.containers { + c.Repair() + } +} + +type sliceIterator struct { + e *sliceContainers + i int + key uint64 + value *Container +} + +func (si *sliceIterator) Next() bool { + if si.e == nil || si.i > len(si.e.keys)-1 { + return false + } + si.key = si.e.keys[si.i] + si.value = si.e.containers[si.i] + si.i++ + + return true +} + +func (si *sliceIterator) Value() (uint64, *Container) { + return si.key, si.value +} + +type stackContainerIterator struct { + // if heapIter is set, then we are falling back to the heap allocated iter + // since the containers weren't using a slice of containers + heapIter ContainerIterator + + e *sliceContainers + i int + key uint64 + value *Container +} + +func stackContainerIteratorFromContainers( + key uint64, + containers Containers, +) (iter stackContainerIterator, found bool) { + // This falls back to just using a heap allocated iterator + var heapIter ContainerIterator + heapIter, found = containers.Iterator(key) + iter = stackContainerIterator{heapIter: heapIter} + return +} + +func stackContainerIteratorFromSliceContainers( + key uint64, + sc *sliceContainers, +) (iter stackContainerIterator, found bool) { + var i int + i, found = sc.seek(key) + iter = stackContainerIterator{e: sc, i: i} + return +} + +func (si *stackContainerIterator) Next() bool { + if si.heapIter != nil { + return si.heapIter.Next() + } + + if si.e == nil || si.i > len(si.e.keys)-1 { + return false + } + si.key = si.e.keys[si.i] + si.value = si.e.containers[si.i] + si.i++ + return true +} + +func (si *stackContainerIterator) Value() (uint64, *Container) { + if si.heapIter != nil { + return si.heapIter.Value() + } + + return si.key, si.value +} diff --git a/vendor/github.com/m3dbx/pilosa/roaring/roaring.go b/vendor/github.com/m3dbx/pilosa/roaring/roaring.go new file mode 100644 index 00000000..7c9a0938 --- /dev/null +++ b/vendor/github.com/m3dbx/pilosa/roaring/roaring.go @@ -0,0 +1,4276 @@ +// Copyright 2017 Pilosa Corp. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package roaring implements roaring bitmaps with support for incremental changes. +package roaring + +import ( + "encoding/binary" + "fmt" + "hash/fnv" + "io" + "math/bits" + "sort" + "sync" + "unsafe" + + "github.com/pkg/errors" +) + +const ( + // magicNumber is an identifier, in bytes 0-1 of the file. + magicNumber = uint32(12348) + + // storageVersion indicates the storage version, in bytes 2-3. + storageVersion = uint32(0) + + // cookie is the first four bytes in a roaring bitmap file, + // formed by joining magicNumber and storageVersion + cookie = magicNumber + storageVersion<<16 + + // headerBaseSize is the size in bytes of the cookie and key count at the + // beginning of a file. + headerBaseSize = 4 + 4 + + // runCountHeaderSize is the size in bytes of the run count stored + // at the beginning of every serialized run container. + runCountHeaderSize = 2 + + // interval16Size is the size of a single run in a container.runs. + interval16Size = 4 + + // bitmapN is the number of values in a container.bitmap. + bitmapN = (1 << 16) / 64 + + //containerArray indicates a container of bit position values + containerArray = byte(1) + + //containerBitmap indicates a container of bits packed in a uint64 array block + containerBitmap = byte(2) + + //containerRun indicates a container of run encoded bits + containerRun = byte(3) + + maxContainerVal = 0xffff +) + +type Containers interface { + // Get returns nil if the key does not exist. + Get(key uint64) *Container + + // Put adds the container at key. + Put(key uint64, c *Container) + + // PutContainerValues updates an existing container at key. + // If a container does not exist for key, a new one is allocated. + // TODO(2.0) make n int32 + PutContainerValues(key uint64, containerType byte, n int, mapped bool) + + // Remove takes the container at key out. + Remove(key uint64) + + // GetOrCreate returns the container at key, creating a new empty container if necessary. + GetOrCreate(key uint64) *Container + + // Clone does a deep copy of Containers, including cloning all containers contained. + Clone() Containers + + // Last returns the highest key and associated container. + Last() (key uint64, c *Container) + + // Size returns the number of containers stored. + Size() int + + // Iterator returns a Contiterator which after a call to Next(), a call to Value() will + // return the first container at or after key. found will be true if a + // container is found at key. + Iterator(key uint64) (citer ContainerIterator, found bool) + + Count() uint64 + + // Reset clears the containers collection to allow for recycling during snapshot + Reset() + + // Repair will repair the cardinality of any containers whose cardinality were corrupted + // due to optimized operations. + Repair() +} + +type ContainerIterator interface { + Next() bool + Value() (uint64, *Container) +} + +// Bitmap represents a roaring bitmap. +type Bitmap struct { + Containers Containers + + // Number of operations written to the writer. + opN int + + // Writer where operations are appended to. + OpWriter io.Writer + + // Make sure to update the Reset() method if any new fields are added to + // this struct. +} + +// NewBitmap returns a Bitmap with an initial set of values. +func NewBitmap(a ...uint64) *Bitmap { + b := &Bitmap{ + Containers: newSliceContainers(), + } + b.Add(a...) + return b +} + +// NewBitmapWithDefaultPooling returns a new bitmap with the default pooling configuration. +// See the comment for NewBitmapWithPooling for more details about the pooling implementation. +func NewBitmapWithDefaultPooling(maxPoolCapacity int, a ...uint64) *Bitmap { + return NewBitmapWithPooling(NewDefaultContainerPoolingConfiguration(maxPoolCapacity), a...) +} + +// NewBitmapWithPooling returns a new Bitmap with the provided container pooling configuration +// and initial set of values. +// +// Container Pooling is useful for reusing short lived Bitmaps (common in the situation where +// temporary bitmaps are being created for the sake of computation instead of storage). In that +// case, allocating new containers over and over again is unecessarily expensive. Instead, when +// you need an empty bitmap, you can call the Reset() method on an existing one. That will clear +// all the data it contains and return its containers (up to the configured maximum) to its pool +// so that when you start adding new data, the already allocated containers can be reused. +// +// In exchange for reduced memory pressure / allocations, bitmaps with pooling enabled will use +// significantly more memory. This is for two reasons: +// +// 1. Even when there is no data in the bitmap, a configurable number of containers have already +// been pre-allocated and are waiting in reserve. +// 2. Every container that is allocated when pooling is enabled is pre-allocated such that it can +// seamlessly switch between a run, array, or a bitmap with zero allocations. This means it can +// be used for performing calculations very quickly and without causing G.C pressure, but it will +// use much more space. +func NewBitmapWithPooling(pooling ContainerPoolingConfiguration, a ...uint64) *Bitmap { + b := &Bitmap{ + Containers: newSliceContainersWithPooling(pooling), + } + b.Add(a...) + return b +} + +// NewFileBitmap returns a Bitmap with an initial set of values, used for file storage. +// By default, this is a copy of NewBitmap, but is replaced with B+Tree in server/enterprise.go +var NewFileBitmap func(a ...uint64) *Bitmap = NewBitmap + +// Clone returns a heap allocated copy of the bitmap. +// Note: The OpWriter IS NOT copied to the new bitmap. +func (b *Bitmap) Clone() *Bitmap { + if b == nil { + return nil + } + + // Create a copy of the bitmap structure. + other := &Bitmap{ + Containers: b.Containers.Clone(), + } + + return other +} + +// Reset reset the bitmap and the underlying containers for re-use. +func (b *Bitmap) Reset() { + b.Containers.Reset() + b.opN = 0 + b.OpWriter = nil +} + +// Add adds values to the bitmap. +func (b *Bitmap) Add(a ...uint64) (changed bool, err error) { + changed = false + for _, v := range a { + // Create an add operation. + op := &op{typ: opTypeAdd, value: v} + + // Write operation to op log. + if err := b.writeOp(op); err != nil { + return false, err + } + + // Apply to the in-memory bitmap. + if op.apply(b) { + changed = true + + } + } + + return changed, nil +} + +// DirectAdd adds a value to the bitmap by bypassing the op log. +func (b *Bitmap) DirectAdd(v uint64) bool { + cont := b.Containers.GetOrCreate(highbits(v)) + return cont.add(lowbits(v)) +} + +// Contains returns true if v is in the bitmap. +func (b *Bitmap) Contains(v uint64) bool { + c := b.Containers.Get(highbits(v)) + if c == nil { + return false + } + return c.Contains(lowbits(v)) +} + +// Remove removes values from the bitmap. +func (b *Bitmap) Remove(a ...uint64) (changed bool, err error) { + changed = false + for _, v := range a { + // Create an add operation. + op := &op{typ: opTypeRemove, value: v} + + // Write operation to op log. + if err := b.writeOp(op); err != nil { + return false, err + } + + // Apply operation to the bitmap. + if op.apply(b) { + changed = true + } + } + return changed, nil +} + +func (b *Bitmap) remove(v uint64) bool { + c := b.Containers.Get(highbits(v)) + if c == nil { + return false + } + // TODO - do nil check inside c.remove? + return c.remove(lowbits(v)) +} + +// Max returns the highest value in the bitmap. +// Returns zero if the bitmap is empty. +func (b *Bitmap) Max() uint64 { + if b.Containers.Size() == 0 { + return 0 + } + + hb, c := b.Containers.Last() + lb := c.max() + return hb<<16 | uint64(lb) +} + +// Count returns the number of bits set in the bitmap. +func (b *Bitmap) Count() (n uint64) { + return b.Containers.Count() +} + +// CountRange returns the number of bits set between [start, end). +func (b *Bitmap) CountRange(start, end uint64) (n uint64) { + if b.Containers.Size() == 0 { + return + } + + skey := highbits(start) + ekey := highbits(end) + + citer, found := b.containersIterator(highbits(start)) + // If range is entirely in one container then just count that range. + if found && skey == ekey { + citer.Next() + _, c := citer.Value() + return uint64(c.countRange(int32(lowbits(start)), int32(lowbits(end)))) + } + + for citer.Next() { + k, c := citer.Value() + if k < skey { + // TODO remove once we've validated this stuff works + panic("should be impossible for k to be less than skey") + } + if k == skey { + n += uint64(c.countRange(int32(lowbits(start)), maxContainerVal+1)) + continue + } + if k < ekey { + n += uint64(c.n) + continue + } + if k == ekey { + n += uint64(c.countRange(0, int32(lowbits(end)))) + break + } + if k > ekey { + break + } + } + return n +} + +// Slice returns a slice of all integers in the bitmap. +func (b *Bitmap) Slice() []uint64 { + var a []uint64 + itr := b.Iterator() + itr.Seek(0) + + for v, eof := itr.Next(); !eof; v, eof = itr.Next() { + a = append(a, v) + } + return a +} + +// SliceRange returns a slice of integers between [start, end). +func (b *Bitmap) SliceRange(start, end uint64) []uint64 { + var a []uint64 + itr := b.Iterator() + itr.Seek(start) + for v, eof := itr.Next(); !eof && v < end; v, eof = itr.Next() { + a = append(a, v) + } + return a +} + +// ForEach executes fn for each value in the bitmap. +func (b *Bitmap) ForEach(fn func(uint64)) { + itr := b.Iterator() + itr.Seek(0) + for v, eof := itr.Next(); !eof; v, eof = itr.Next() { + fn(v) + } +} + +// ForEachRange executes fn for each value in the bitmap between [start, end). +func (b *Bitmap) ForEachRange(start, end uint64, fn func(uint64)) { + itr := b.Iterator() + itr.Seek(start) + for v, eof := itr.Next(); !eof && v < end; v, eof = itr.Next() { + fn(v) + } +} + +// OffsetRange returns a new bitmap with a containers offset by start. +func (b *Bitmap) OffsetRange(offset, start, end uint64) *Bitmap { + if lowbits(offset) != 0 { + panic("offset must not contain low bits") + } + if lowbits(start) != 0 { + panic("range start must not contain low bits") + } + if lowbits(end) != 0 { + panic("range end must not contain low bits") + } + + off := highbits(offset) + hi0, hi1 := highbits(start), highbits(end) + citer, _ := b.containersIterator(hi0) + other := NewBitmap() + for citer.Next() { + k, c := citer.Value() + if k >= hi1 { + break + } + other.Containers.Put(off+(k-hi0), c) + } + return other +} + +// container returns the container with the given key. +func (b *Bitmap) container(key uint64) *Container { + return b.Containers.Get(key) +} + +// IntersectionCount returns the number of set bits that would result in an +// intersection between b and other. It is more efficient than actually +// intersecting the two and counting the result. +func (b *Bitmap) IntersectionCount(other *Bitmap) uint64 { + var n uint64 + iiter, _ := b.containersIterator(0) + jiter, _ := other.containersIterator(0) + i, j := iiter.Next(), jiter.Next() + ki, ci := iiter.Value() + kj, cj := jiter.Value() + for i && j { + if ki < kj { + i = iiter.Next() + ki, ci = iiter.Value() + } else if ki > kj { + j = jiter.Next() + kj, cj = jiter.Value() + } else { + n += uint64(intersectionCount(ci, cj)) + i, j = iiter.Next(), jiter.Next() + ki, ci = iiter.Value() + kj, cj = jiter.Value() + } + } + return n +} + +// Intersect returns the intersection of b and other. +func (b *Bitmap) Intersect(other *Bitmap) *Bitmap { + output := NewBitmap() + iiter, _ := b.containersIterator(0) + jiter, _ := other.containersIterator(0) + i, j := iiter.Next(), jiter.Next() + ki, ci := iiter.Value() + kj, cj := jiter.Value() + for i && j { + if ki < kj { + i = iiter.Next() + ki, ci = iiter.Value() + } else if ki > kj { + j = jiter.Next() + kj, cj = jiter.Value() + } else { // ki == kj + output.Containers.Put(ki, intersect(ci, cj)) + i, j = iiter.Next(), jiter.Next() + ki, ci = iiter.Value() + kj, cj = jiter.Value() + } + } + return output +} + +// Union returns the bitwise union of b and others as a new bitmap. +func (b *Bitmap) Union(others ...*Bitmap) *Bitmap { + output := NewBitmap() + if len(others) == 1 { + b.unionIntoTargetSingle(output, others[0]) + return output + } + + output.UnionInPlace(b) + output.UnionInPlace(others...) + return output +} + +// UnionInPlace returns the bitwise union of b and others, modifying +// b in place. +func (b *Bitmap) UnionInPlace(others ...*Bitmap) { + b.unionInPlace(others...) +} + +func (b *Bitmap) unionIntoTargetSingle(target *Bitmap, other *Bitmap) { + iiter, _ := b.containersIterator(0) + jiter, _ := other.containersIterator(0) + i, j := iiter.Next(), jiter.Next() + ki, ci := iiter.Value() + kj, cj := jiter.Value() + for i || j { + if i && (!j || ki < kj) { + target.Containers.Put(ki, ci.Clone()) + i = iiter.Next() + ki, ci = iiter.Value() + } else if j && (!i || ki > kj) { + target.Containers.Put(kj, cj.Clone()) + j = jiter.Next() + kj, cj = jiter.Value() + } else { // ki == kj + target.Containers.Put(ki, union(ci, cj)) + i, j = iiter.Next(), jiter.Next() + ki, ci = iiter.Value() + kj, cj = jiter.Value() + } + } +} + +// unionIntoTarget stores the union of b and others into target. b and others will +// be left unchanged (unless one of them is also target), but target will be modified +// in place. +// +// This function performs an n-way union of n bitmaps. It performs this in an +// optimized manner looping through all the bitmaps and performing unions one +// container at a time. As a result, instead of generating many intermediary +// containers for each union operation for a given container key, only one +// new container needs to be allocated (or re-used) regardless of how many bitmaps +// participate in the union. This significantly reduces allocations. In addition, +// because we perform the unions one container at a time across all the bitmaps, we +// can calculate summary statistics that allow us to make more efficient decisions +// up front. For example, imagine trying to perform a union across the following three +// bitsets: +// +// 1. Bitmap A: Single array container at key 0 with 400 values in it. +// 2. Bitmap B: Single array container at key 0 with 500 values in it. +// 3. Bitmap C: Single array container at key 0 with 3500 values in it. +// +// Naive approach: +// +// 1. Perform union of bitmap A and B, container by container +// a. 400 + 500 < ArrayMaxSize so likely we will choose to allocate a new array +// container and then perform a unionArrayArray operation to merge the two +// arrays into the new array container. +// 2. Perform a union of the bitmap generated in the step above with bitmap C. +// 900 + 3500 > ArrayMaxSize so we will need to upgrade to a bitset container which +// we will have to allocate, and then we will have to perform two unions into the +// new bitmap container: one for the array container generated in the previous step, +// and one for the bitset container in bitmap C. +// +// Approach taken by this function: +// +// 1. Detect that bitmaps A, B, and C all have containers for key 0. +// 2. Estimate the resulting cardinality of the union of all their containers to be +// 400 + 500 + 3500 > ArrayMaxSize and decide upfront to use a bitset for the target +// container. Note that this is just an approximation of the final cardinality and can +// be off by a wide margin if there is a lot of overlap between containers, but that is +// fine, we'll still get the same result at the end, we'll just be more biased towards +// using bitmap containers will still being able to use array containers when all the +// cardinalities are small. +// 3. Union the containers from bitmaps A, B, and C into the new bitset container directly +// using fast bitwise operations. +// +// In the naive approach, we had to allocate two containers, whereas in the optimized approach +// we only had to allocate one container, and we also had to perform less union operations. This +// example is simplistic, but the impact in terms of CPU cycles and memory allocations achieved +// by using the optimized alogorithm when unioning many large bitmaps can be huge. +// +// An additional optimization that this function makes is that it recognizes that even when +// CPU support is present, performing the popcount() operation isn't free. Imagine a scenario +// where 10 bitset containers are being unioned together one after the next. If every +// bitset<->bitset union operation needs to keep the containers' cardinality up to date, then +// the algorithm will waste a lot of time performing intermediary popcount() operations that +// will immediately be invalidated by the next union operation. As a result, we allow the cardinality +// of containers to degrade when we perform the in-place union operations, and then when the algorithm +// completes we "repair" all the containers by performing the popcount() operation one time. This means +// that we only ever have to do O(1) popcount operations per container instead of O(n) where n is the +// number of containers with the same key that are being unioned together. +// +// The algorithm works by iterating through all of the containers in all of the bitmaps concurrently. +// At every "tick" of the outermost loop, we increment our pointer into the bitmaps list of containers +// by 1 (if we haven't reached the end of the containers for that bitmap.) +// +// We then loop through all of the "current" values(containers) for all of the bitmaps +// and for each container with a specific key that we encounter, we scan forward to see if any of the +// other bitmaps have a container for the same key. If so, we calculate some summary statistics and +// then use that information to make a decision about how to union all of the containers with the same +// key together, perform the union, mark the unioned containers as "handled" and then move on to the next +// batch of containers that share the same key. +// +// We repeat this process until every single bitmaps current container has been "handled". Then we start the +// outer loop over again and the process repeats until we've iterated through every container in every bitmap +// and unioned everything into a single target bitmap. +// +// The diagram below shows the iteration state of four different bitmaps as the algorithm progresses them. +// The diagrams should BE interpreted from left -> right, top -> bottom. The X's represent a container in +// the bitmap at a specific key, ^ symbol represents the bitmaps current container iteration position, +// and the - symbol represents a container that is at the current iteration position, but has been marked as "handled". +// +// ---------------------------- | ---------------------------- | ---------------------------- +// Bitmap 1 |___X____________X__________| | |___X____________X__________| | |___X____________X__________| +// ^ | _ | +// ---------------------------- | ---------------------------- | ---------------------------- +// Bitmap 2 |_______X________X______X___| | |_______X_______________X___| | |_______X_______________X___| +// ^ | ^ | +// ---------------------------- | ---------------------------- | ---------------------------- +// Bitmap 3 |_______X___________________| | |_______X___________________| | |_______X___________________| +// ^ | ^ | +// ---------------------------- | ---------------------------- | ---------------------------- +// Bitmap 4 |___X_______________________| | |___X_______________________| | |___X_______________________| +// ^ | _ | +// ------------------------------------------------------------------------------------------------------------------------ +// ---------------------------- | ---------------------------- | ---------------------------- +// Bitmap 1 |___X____________X__________| | |___X____________X__________| | |___X____________X__________| +// _ | ^ | _ +// ---------------------------- | ---------------------------- | ---------------------------- +// Bitmap 2 |_______X_______________X___| | |_______X_______________X___| | |_______X_______________X___| +// _ | ^ | ^ +// ---------------------------- | ---------------------------- | ---------------------------- +// Bitmap 3 |_______X___________________| | |_______X___________________| | |_______X___________________| +// _ | | +// ---------------------------- | ---------------------------- | ---------------------------- +// Bitmap 4 |___X_______________________| | |___X_______________________| | |___X_______________________| +// _ +func (b *Bitmap) unionInPlace(others ...*Bitmap) { + var ( + requiredSliceSize = len(others) + // To avoid having to allocate a slice everytime, if the number of bitmaps + // being unioned is small enough we can just use this stack-allocated array. + staticHandledIters = [20]handledIter{} + bitmapIters handledIters + target = b + ) + + if requiredSliceSize <= 20 { + bitmapIters = staticHandledIters[:0] + } else { + bitmapIters = make(handledIters, 0, requiredSliceSize) + } + + for _, other := range others { + otherIter, _ := other.containersIterator(0) + if otherIter.Next() { + bitmapIters = append(bitmapIters, handledIter{ + iter: otherIter, + hasNext: true, + handled: false, + }) + } + } + + // Loop until we've exhausted every iter. + hasNext := true + for hasNext { + // Loop until every iters current value has been handled. + for i, iIter := range bitmapIters { + if !iIter.hasNext || iIter.handled { + // Either we've exhausted this iter (it has no more containers), or + // we've already handled the current container by unioning it with + // one of the containers we encountered earlier. + continue + } + + var ( + iKey, iContainer = iIter.iter.Value() + // Summary statistics about all the containers in the other bitmaps + // that share the same key so we can make smarter union strategy + // decisions later. Note that we slice to [i:] not [i+1:] because we + // want to include the current containers information in the stats. + summaryStats = bitmapIters[i:].calculateSummaryStats(iKey) + ) + + if summaryStats.isOnlyContainerWithKey { + // TODO(rartoul): We can avoid these clones if we can determine + // if the container is coming from an immutable bitmap and we + // know that we can mark the target bitmap as immutable as well. + target.Containers.Put(iKey, iContainer.Clone()) + bitmapIters[i].handled = true + continue + } + + // There was more than one container across the bitmaps with key iKey + // so we need to calculate a union. + if summaryStats.hasMaxRange { + // One (or more) of the containers represented the maximum possible + // range that a container can store, so instead of calculating a + // union we can generate an RLE container that represents the entire + // range. + // + // Use GetOrCreate here to take advantage of pooling if its enabled. + container := target.Containers.GetOrCreate(iKey) + if cap(container.runs) > 0 { + container.runs = container.runs[:1] + container.runs[0] = interval16{start: 0, last: maxContainerVal} + } else { + container.runs = []interval16{{start: 0, last: maxContainerVal}} + } + container.containerType = containerRun + container.n = maxContainerVal + 1 + bitmapIters.markItersWithCurrentKeyAsHandled(i, iKey) + continue + } + + // Use a bitmap container for the target bitmap, and union everything + // into it. + // + // TODO(rartoul): Add another conditional case for n < ArrayMaxSize + // (or some fraction of that value) to avoid allocating expensive + // bitmaps when unioning many low-density array containers, but this + // will require writing a union in place algorithm for an array container + // that accepts multiple different containers to union into it for + // efficiency. + // + // Use GetOrCreate to take advantage of pooling if its enabled. + container := target.Containers.GetOrCreate(iKey) + // If target already has a bitmap container for iKey then we can reuse that, + // otherwise we have to convert the existing container into a bitmap container. + if container.isArray() { + container.arrayToBitmap() + } else if container.isRun() { + container.runToBitmap() + } + + // Once we've acquired a bitmap container (either by reusing the existing one + // or allocating a new one) then the last step is to iterate through all the + // other containers to see which ones have the same key, and union all of them + // into the target bitmap container. Only need to loop starting from i because + // anything previous to that has already been handled. + for j := i; j < len(bitmapIters); j++ { + jIter := bitmapIters[j] + jKey, jContainer := jIter.iter.Value() + + if iKey == jKey { + if jContainer.isArray() { + unionBitmapArrayInPlace(container, jContainer) + } else if jContainer.isRun() { + unionBitmapRunInPlace(container, jContainer) + } else { + unionBitmapBitmapInPlace(container, jContainer) + } + bitmapIters[j].handled = true + } + } + + // Now that we've calculated a container that is a union of all the containers + // with the same key across all the bitmaps, we store it in the list of containers + // for the target. + target.Containers.Put(iKey, container) + } + + hasNext = bitmapIters.next() + } + + // Performing the popcount() operation with every union is wasteful because + // its likely the value will be invalidated by the next union operation. As + // a result, when we're performing all of our in-place unions we allow the value of + // n (container cardinality) to fall out of sync, and then at the very end we perform + // a "Repair" to recalculate all the container values. That way we never popcount() + // an entire bitmap container more than once per bulk union operation. + target.Containers.Repair() +} + +// Difference returns the difference of b and other. +func (b *Bitmap) Difference(other *Bitmap) *Bitmap { + output := NewBitmap() + + iiter, _ := b.containersIterator(0) + jiter, _ := other.containersIterator(0) + i, j := iiter.Next(), jiter.Next() + ki, ci := iiter.Value() + kj, cj := jiter.Value() + for i || j { + if i && (!j || ki < kj) { + output.Containers.Put(ki, ci.Clone()) + i = iiter.Next() + ki, ci = iiter.Value() + } else if j && (!i || ki > kj) { + j = jiter.Next() + kj, cj = jiter.Value() + } else { // ki == kj + output.Containers.Put(ki, difference(ci, cj)) + i, j = iiter.Next(), jiter.Next() + ki, ci = iiter.Value() + kj, cj = jiter.Value() + } + } + return output +} + +// Xor returns the bitwise exclusive or of b and other. +func (b *Bitmap) Xor(other *Bitmap) *Bitmap { + output := NewBitmap() + + iiter, _ := b.containersIterator(0) + jiter, _ := other.containersIterator(0) + i, j := iiter.Next(), jiter.Next() + ki, ci := iiter.Value() + kj, cj := jiter.Value() + for i || j { + if i && (!j || ki < kj) { + output.Containers.Put(ki, ci.Clone()) + i = iiter.Next() + ki, ci = iiter.Value() + } else if j && (!i || ki > kj) { + output.Containers.Put(kj, cj.Clone()) + j = jiter.Next() + kj, cj = jiter.Value() + } else { // ki == kj + output.Containers.Put(ki, xor(ci, cj)) + i, j = iiter.Next(), jiter.Next() + ki, ci = iiter.Value() + kj, cj = jiter.Value() + } + } + return output +} + +// removeEmptyContainers deletes all containers that have a count of zero. +func (b *Bitmap) removeEmptyContainers() { + citer, _ := b.containersIterator(0) + for citer.Next() { + k, c := citer.Value() + if c.n == 0 { + b.Containers.Remove(k) + } + } +} +func (b *Bitmap) countEmptyContainers() int { + result := 0 + citer, _ := b.containersIterator(0) + for citer.Next() { + _, c := citer.Value() + if c.n == 0 { + result++ + } + } + return result +} + +// Optimize converts array and bitmap containers to run containers as necessary. +func (b *Bitmap) Optimize() { + citer, _ := b.containersIterator(0) + for citer.Next() { + _, c := citer.Value() + c.optimize() + } +} + +var errWriterPool = sync.Pool{ + New: func() interface{} { + return newErrWriter() + }, +} + +func getPooledErrWriter() *errWriter { + return errWriterPool.Get().(*errWriter) +} + +func putPooledErrWriter(w *errWriter) { + // Avoid any ref to the writer strongly being held onto + w.Reset(nil) + errWriterPool.Put(w) +} + +type errWriter struct { + w io.Writer + err error + n int + + byte8 []byte +} + +func newErrWriter() *errWriter { + return &errWriter{ + byte8: make([]byte, 8), + } +} + +func (ew *errWriter) Reset(w io.Writer) { + ew.w = w + ew.n = 0 +} + +func (ew *errWriter) WriteUint16(v uint16) { + if ew.err != nil { + return + } + var n int + binary.LittleEndian.PutUint16(ew.byte8[:2], v) + n, ew.err = ew.w.Write(ew.byte8[:2]) + ew.n += n +} +func (ew *errWriter) WriteUint32(v uint32) { + if ew.err != nil { + return + } + var n int + binary.LittleEndian.PutUint32(ew.byte8[:4], v) + n, ew.err = ew.w.Write(ew.byte8[:4]) + ew.n += n +} + +func (ew *errWriter) WriteUint64(v uint64) { + if ew.err != nil { + return + } + var n int + binary.LittleEndian.PutUint64(ew.byte8[:8], v) + n, ew.err = ew.w.Write(ew.byte8[:8]) + ew.n += n +} + +// WriteTo writes b to w. +func (b *Bitmap) WriteTo(w io.Writer) (n int64, err error) { + b.Optimize() + // Remove empty containers before persisting. + //b.removeEmptyContainers() + + containerCount := b.Containers.Size() - b.countEmptyContainers() + headerSize := headerBaseSize + + // Alloc a new error writer or reuse an existing one + ew := getPooledErrWriter() + ew.Reset(w) + + // Build header before writing individual container blocks. + // Metadata for each container is 8+2+2+4 = sizeof(key) + sizeof(containerType)+sizeof(cardinality) + sizeof(file offset) + // Cookie header section. + ew.WriteUint32(cookie) + ew.WriteUint32(uint32(containerCount)) + + // Descriptive header section: encode keys and cardinality. + // Key and cardinality are stored interleaved here, 12 bytes per container. + citer, _ := b.containersIterator(0) + for citer.Next() { + key, c := citer.Value() + // Verify container count before writing. + // TODO: instead of commenting this out, we need to make it a configuration option + //count := c.count() + //assert(c.count() == c.n, "cannot write container count, mismatch: count=%d, n=%d", count, c.n) + if c.n > 0 { + ew.WriteUint64(key) + ew.WriteUint16(uint16(c.containerType)) + ew.WriteUint16(uint16(c.n - 1)) + } + + } + + // Offset header section: write the offset for each container block. + // 4 bytes per container. + offset := uint32(headerSize + (containerCount * (8 + 2 + 2 + 4))) + citer, _ = b.containersIterator(0) + for citer.Next() { + _, c := citer.Value() + if c.n > 0 { + ew.WriteUint32(offset) + offset += uint32(c.size()) + } + + } + + // Results of writing the header + n, err = int64(ew.n), ew.err + + // Return the err writer + putPooledErrWriter(ew) + + if err != nil { + return int64(n), err + } + + n = int64(headerSize + (containerCount * (8 + 2 + 2 + 4))) + + // Container storage section: write each container block. + citer, _ = b.containersIterator(0) + for citer.Next() { + _, c := citer.Value() + if c.n > 0 { + nn, err := c.WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + } + return n, nil +} + +// unmarshalPilosaRoaring treats data as being encoded in Pilosa's 64 bit +// roaring format and decodes it into b. +func (b *Bitmap) unmarshalPilosaRoaring(data []byte) error { + if len(data) < headerBaseSize { + return errors.New("data too small") + } + + // Verify the first two bytes are a valid magicNumber, and second two bytes match current storageVersion. + fileMagic := uint32(binary.LittleEndian.Uint16(data[0:2])) + fileVersion := uint32(binary.LittleEndian.Uint16(data[2:4])) + if fileMagic != magicNumber { + return fmt.Errorf("invalid roaring file, magic number %v is incorrect", fileMagic) + } + + if fileVersion != storageVersion { + return fmt.Errorf("wrong roaring version, file is v%d, server requires v%d", fileVersion, storageVersion) + } + + // Read key count in bytes sizeof(cookie):(sizeof(cookie)+sizeof(uint32)). + keyN := binary.LittleEndian.Uint32(data[4:8]) + + headerSize := headerBaseSize + b.Containers.Reset() + // Descriptive header section: Read container keys and cardinalities. + for i, buf := 0, data[headerSize:]; i < int(keyN); i, buf = i+1, buf[12:] { + b.Containers.PutContainerValues( + binary.LittleEndian.Uint64(buf[0:8]), + byte(binary.LittleEndian.Uint16(buf[8:10])), + int(binary.LittleEndian.Uint16(buf[10:12]))+1, + true) + } + opsOffset := headerSize + int(keyN)*12 + + // Read container offsets and attach data. + citer, _ := b.containersIterator(0) + for i, buf := 0, data[opsOffset:]; i < int(keyN); i, buf = i+1, buf[4:] { + offset := binary.LittleEndian.Uint32(buf[0:4]) + // Verify the offset is within the bounds of the input data. + if int(offset) >= len(data) { + return fmt.Errorf("offset out of bounds: off=%d, len=%d", offset, len(data)) + } + + // Map byte slice directly to the container data. + citer.Next() + _, c := citer.Value() + switch c.containerType { + case containerRun: + c.array = nil + c.bitmap = nil + runCount := binary.LittleEndian.Uint16(data[offset : offset+runCountHeaderSize]) + c.runs = (*[0xFFFFFFF]interval16)(unsafe.Pointer(&data[offset+runCountHeaderSize]))[:runCount:runCount] + opsOffset = int(offset) + runCountHeaderSize + len(c.runs)*interval16Size + case containerArray: + c.runs = nil + c.bitmap = nil + c.array = (*[0xFFFFFFF]uint16)(unsafe.Pointer(&data[offset]))[:c.n:c.n] + opsOffset = int(offset) + len(c.array)*2 // sizeof(uint32) + case containerBitmap: + c.array = nil + c.runs = nil + c.bitmap = (*[0xFFFFFFF]uint64)(unsafe.Pointer(&data[offset]))[:bitmapN:bitmapN] + opsOffset = int(offset) + len(c.bitmap)*8 // sizeof(uint64) + } + } + + // Read ops log until the end of the file. + buf := data[opsOffset:] + for { + // Exit when there are no more ops to parse. + if len(buf) == 0 { + break + } + + // Unmarshal the op and apply it. + var opr op + if err := opr.UnmarshalBinary(buf); err != nil { + // FIXME(benbjohnson): return error with position so file can be trimmed. + return err + } + + opr.apply(b) + + // Increase the op count. + b.opN++ + + // Move the buffer forward. + buf = buf[opr.size():] + } + + return nil +} + +// writeOp writes op to the OpWriter, if available. +func (b *Bitmap) writeOp(op *op) error { + if b.OpWriter == nil { + return nil + } + + if _, err := op.WriteTo(b.OpWriter); err != nil { + return err + } + + b.opN++ + return nil +} + +// containersIterator returns a stack container iterator where possible, and +// where not possible will fall back to a heap allocated iterator with the +// StackContainerIterator interface. +func (b *Bitmap) containersIterator(k uint64) (stackContainerIterator, bool) { + if sliceContainers, ok := b.Containers.(*sliceContainers); ok { + return stackContainerIteratorFromSliceContainers(k, sliceContainers) + } + return stackContainerIteratorFromContainers(k, b.Containers) +} + +// Iterator returns a new iterator for the bitmap. +func (b *Bitmap) Iterator() *Iterator { + itr := &Iterator{} + itr.Reset(b) + return itr +} + +// Info returns stats for the bitmap. +func (b *Bitmap) Info() bitmapInfo { + info := bitmapInfo{ + OpN: b.opN, + Containers: make([]containerInfo, 0, b.Containers.Size()), + } + + citer, _ := b.containersIterator(0) + for citer.Next() { + k, c := citer.Value() + ci := c.info() + ci.Key = k + info.Containers = append(info.Containers, ci) + } + return info +} + +// Check performs a consistency check on the bitmap. Returns nil if consistent. +func (b *Bitmap) Check() error { + var a ErrorList + + // Check each container. + citer, _ := b.containersIterator(0) + for citer.Next() { + k, c := citer.Value() + if err := c.check(); err != nil { + a.AppendWithPrefix(err, fmt.Sprintf("%d/", k)) + } + } + + if len(a) == 0 { + return nil + } + return a +} + +// Flip performs a logical negate of the bits in the range [start,end]. +func (b *Bitmap) Flip(start, end uint64) *Bitmap { + result := NewBitmap() + itr := b.Iterator() + v, eof := itr.Next() + //copy over previous bits. + for v < start && !eof { + result.DirectAdd(v) + v, eof = itr.Next() + } + //flip bits in range . + for i := start; i <= end; i++ { + if eof { + result.DirectAdd(i) + } else if v == i { + v, eof = itr.Next() + } else { + result.DirectAdd(i) + } + } + //add remaining. + for !eof { + result.DirectAdd(v) + v, eof = itr.Next() + } + return result +} + +// bitmapInfo represents a point-in-time snapshot of bitmap stats. +type bitmapInfo struct { + OpN int + Containers []containerInfo +} + +// Iterator represents an iterator over a Bitmap. +type Iterator struct { + bitmap *Bitmap + citer stackContainerIterator + key uint64 + c *Container + j, k int32 // i: container; j: array index, bit index, or run index; k: offset within the run +} + +// Reset allows the iterator to be re-used between iterating different bitmaps +// so if frequent iteration is needed across different bitmaps, the same +// iterator can be reused. +func (itr *Iterator) Reset(b *Bitmap) { + *itr = Iterator{} + itr.bitmap = b + itr.Seek(0) +} + +// Seek moves to the first value equal to or greater than `seek`. +func (itr *Iterator) Seek(seek uint64) { + // k should always be -1 unless we're seeking into a run container. Then the + // "if c.isRun" section will take care of it. + itr.k = -1 + + // Move to the correct container. + itr.citer, _ = itr.bitmap.containersIterator(highbits(seek)) + if !itr.citer.Next() { + itr.c = nil + return // eof + } + itr.key, itr.c = itr.citer.Value() + + // Move to the correct value index inside the container. + lb := lowbits(seek) + if itr.c.isArray() { + // Find index in the container. + itr.j = search32(itr.c.array, lb) + if itr.j < 0 { + itr.j = -itr.j - 1 + } + if itr.j < int32(len(itr.c.array)) { + itr.j-- + return + } + + // If it's at the end of the container then move to the next one. + if !itr.citer.Next() { + itr.c = nil + return + } + itr.key, itr.c = itr.citer.Value() + itr.j = -1 + return + } + + if itr.c.isRun() { + if seek == 0 { + itr.j, itr.k = 0, -1 + } + + j, contains := binSearchRuns(lb, itr.c.runs) + if contains { + itr.j = j + itr.k = int32(lb) - int32(itr.c.runs[j].start) - 1 + } else { + // Set iterator to next value in the Bitmap. + itr.j = j + itr.k = -1 + } + + return + } + + // If it's a bitmap container then move to index before the value and call next(). + itr.j = int32(lb) - 1 +} + +// Next returns the next value in the bitmap. +// Returns eof as true if there are no values left in the iterator. +func (itr *Iterator) Next() (v uint64, eof bool) { + if itr.c == nil { + return 0, true + } + // Iterate over containers until we find the next value or EOF. + for { + if itr.c.isArray() { + if itr.j >= itr.c.n-1 { + // Reached end of array, move to the next container. + if !itr.citer.Next() { + itr.c = nil + return 0, true + } + itr.key, itr.c = itr.citer.Value() + itr.j = -1 + continue + } + itr.j++ + return itr.peek(), false + } + + if itr.c.isRun() { + // Because itr.j for an array container defaults to -1 + // but defaults to 0 for a run container, we need to + // standardize on treating -1 as our default value for itr.j. + // Note that this is easier than changing the default to 0 + // because the array logic uses the negative number space + // to represent offsets to an array position that isn't filled + // (-1 being the first empty space in an array, or 0). + if itr.j == -1 { + itr.j++ + } + + // If the container is empty, move to the next container. + if len(itr.c.runs) == 0 { + if !itr.citer.Next() { + itr.c = nil + return 0, true + } + itr.key, itr.c = itr.citer.Value() + itr.j = -1 + continue + } + + r := itr.c.runs[itr.j] + runLength := int32(r.last - r.start) + + if itr.k >= runLength { + // Reached end of run, move to the next run. + itr.j, itr.k = itr.j+1, -1 + } + + if itr.j >= int32(len(itr.c.runs)) { + // Reached end of runs, move to the next container. + if !itr.citer.Next() { + itr.c = nil + return 0, true + } + itr.key, itr.c = itr.citer.Value() + itr.j = -1 + continue + } + + itr.k++ + return itr.peek(), false + } + + // Move to the next possible index in the bitmap container. + itr.j++ + + // Find first non-zero bit in current bitmap, if possible. + hb := itr.j >> 6 + + if hb >= int32(len(itr.c.bitmap)) { + if !itr.citer.Next() { + itr.c = nil + return 0, true + } + itr.key, itr.c = itr.citer.Value() + itr.j = -1 + continue + } + lb := itr.c.bitmap[hb] >> (uint(itr.j) % 64) + if lb != 0 { + itr.j = itr.j + int32(trailingZeroN(lb)) + return itr.peek(), false + } + + // Otherwise iterate through remaining bitmaps to find next bit. + for hb++; hb < int32(len(itr.c.bitmap)); hb++ { + if itr.c.bitmap[hb] != 0 { + itr.j = hb<<6 + int32(trailingZeroN(itr.c.bitmap[hb])) + return itr.peek(), false + } + } + + // If no bits found then move to the next container. + if !itr.citer.Next() { + itr.c = nil + return 0, true + } + itr.key, itr.c = itr.citer.Value() + itr.j = -1 + } +} + +// peek returns the current value. +func (itr *Iterator) peek() uint64 { + if itr.c == nil { + return 0 + } + if itr.c.isArray() { + return itr.key<<16 | uint64(itr.c.array[itr.j]) + } + if itr.c.isRun() { + return itr.key<<16 | uint64(itr.c.runs[itr.j].start+uint16(itr.k)) + } + return itr.key<<16 | uint64(itr.j) +} + +// ArrayMaxSize represents the maximum size of array containers. +const ArrayMaxSize = 4096 + +// runMaxSize represents the maximum size of run length encoded containers. +const runMaxSize = 2048 + +// Container represents a Container for uint16 integers. +// +// These are used for storing the low bits of numbers in larger sets of uint64. +// The high bits are stored in a Container's key which is tracked by a separate +// data structure. Integers in a Container can be encoded in one of three ways - +// the encoding used is usually whichever is most compact, though any Container +// type should be able to encode any set of integers safely. For containers with +// less than 4,096 values, an array is often used. Containers with long runs of +// integers would use run length encoding, and more random data usually uses +// bitmap encoding. +type Container struct { + pooled bool + mapped bool // mapped directly to a byte slice when true + containerType byte // array, bitmap, or run + n int32 // number of integers in container + array []uint16 // used for array containers + bitmap []uint64 // used for bitmap containers + runs []interval16 // used for RLE containers + + // Make sure to update the Reset() method if any new fields are added to + // this struct. +} + +type interval16 struct { + start uint16 + last uint16 +} + +// runlen returns the count of integers in the interval. +func (iv interval16) runlen() int32 { + return 1 + int32(iv.last-iv.start) +} + +// newContainer returns a new instance of container. +func NewContainer() *Container { + statsHit("NewContainer") + c := newContainer() + return &c +} + +func newContainer() Container { + return Container{containerType: containerArray} +} + +// NewContainerWithPooling creates a new container with the provided pooling +// configuration. +func NewContainerWithPooling(poolingConfig ContainerPoolingConfiguration) *Container { + statsHit("NewContainerWithPooling") + c := &Container{ + pooled: true, + containerType: containerArray, + } + + if poolingConfig.MaxArraySize > 0 { + c.array = make([]uint16, 0, poolingConfig.MaxArraySize) + } + if poolingConfig.AllocateBitmap { + c.bitmap = make([]uint64, bitmapN) + // Start as a bitmap since we had to allocate it anyways. + c.containerType = containerBitmap + } + if poolingConfig.MaxRunsSize > 0 { + c.runs = make([]interval16, 0, poolingConfig.MaxRunsSize) + } + + return c +} + +// Reset the container so it can be reused while maintaining any allocated +// datastructures. +func (c *Container) Reset() { + c.mapped = false + if c.pooled && c.bitmap != nil { + c.containerType = containerBitmap + } else { + c.containerType = containerArray + } + c.n = 0 + + // Reset all the container types. + c.resetArrayWithMinimumCapacity(0) + c.resetBitmap(false) + c.resetRunsWithMinimumCapacity(0) +} + +func (c *Container) resetArrayWithMinimumCapacity(size int) { + if c.pooled && c.array != nil && cap(c.array) >= size { + // We always keep the array capacity around if pooling is enabled, + // so just clear it. + c.array = c.array[:0] + return + } + + if size == 0 { + // Pooling disabled and we don't need the capacity, nil reference + // so G.C can reclaim. + c.array = nil + return + } + + c.array = make([]uint16, 0, size) +} + +func (c *Container) resetBitmap(allocated bool) { + if c.pooled && c.bitmap != nil { + // We always keep the bitmap around if pooling is enabled, + // so just clear it. + for i := range c.bitmap { + c.bitmap[i] = 0 + } + return + } + + if !allocated { + // Pooling disabled and don't need the bitmap so nil it out. + c.bitmap = nil + return + } + + if cap(c.bitmap) < bitmapN || c.bitmap == nil { + // Need the bitmap, but its too small or doesn't exist, allocate. + c.bitmap = make([]uint64, bitmapN) + return + } + + for i := range c.bitmap { + // Bitmap exists and is big enough, just clear it. + c.bitmap[i] = 0 + } +} + +func (c *Container) resetRunsWithMinimumCapacity(size int) { + if c.pooled && c.runs != nil && cap(c.runs) >= size { + // We always keep the run capacity around if pooling is enabled, + // so just clear it. + c.runs = c.runs[:0] + return + } + + if size == 0 { + // Pooling disabled and we don't need the capacity, nil reference + // so G.C can reclaim. + c.runs = nil + return + } + + c.runs = make([]interval16, 0, size) +} + +// Mapped returns true if the container is mapped directly to a byte slice +func (c *Container) Mapped() bool { + return c.mapped +} + +// N returns the cached bit count of the container +func (c *Container) N() int32 { + return c.n +} + +// Update updates the container +func (c *Container) Update(containerType byte, n int32, mapped bool) { + c.containerType = containerType + c.n = n + c.mapped = mapped +} + +// isArray returns true if the container is an array container. +func (c *Container) isArray() bool { + return c.containerType == containerArray +} + +// isBitmap returns true if the container is a bitmap container. +func (c *Container) isBitmap() bool { + return c.containerType == containerBitmap +} + +// isRun returns true if the container is a run-length-encoded container. +func (c *Container) isRun() bool { + return c.containerType == containerRun +} + +// unmap creates copies of the containers data in the heap. +// +// This is performed when altering the container since its contents could be +// pointing at a read-only mmap. +func (c *Container) unmap() { + if !c.mapped { + return + } + + switch c.containerType { + case containerArray: + tmp := make([]uint16, len(c.array)) + copy(tmp, c.array) + c.array = tmp + case containerBitmap: + tmp := make([]uint64, len(c.bitmap)) + copy(tmp, c.bitmap) + c.bitmap = tmp + case containerRun: + tmp := make([]interval16, len(c.runs)) + copy(tmp, c.runs) + c.runs = tmp + } + c.mapped = false +} + +// count counts all bits in the container. +func (c *Container) count() (n int32) { + return c.countRange(0, maxContainerVal+1) +} + +// countRange counts the number of bits set between [start, end). +func (c *Container) countRange(start, end int32) (n int32) { + if c.isArray() { + return c.arrayCountRange(start, end) + } else if c.isRun() { + return c.runCountRange(start, end) + } + return c.bitmapCountRange(start, end) +} + +func (c *Container) arrayCountRange(start, end int32) (n int32) { + i := int32(sort.Search(len(c.array), func(i int) bool { return int32(c.array[i]) >= start })) + for ; i < int32(len(c.array)); i++ { + v := int32(c.array[i]) + if v >= end { + break + } + n++ + } + return n +} + +func (c *Container) bitmapCountRange(start, end int32) int32 { + var n uint64 + i, j := start/64, end/64 + // Special case when start and end fall in the same word. + if i == j { + offi, offj := uint(start%64), uint(64-end%64) + n += popcount((c.bitmap[i] >> offi) << (offj + offi)) + return int32(n) + } + + // Count partial starting word. + if off := uint(start) % 64; off != 0 { + n += popcount(c.bitmap[i] >> off) + i++ + } + + // Count words in between. + for ; i < j; i++ { + n += popcount(c.bitmap[i]) + } + + // Count partial ending word. + if j < int32(len(c.bitmap)) { + off := 64 - (uint(end) % 64) + n += popcount(c.bitmap[j] << off) + } + + return int32(n) +} + +func (c *Container) runCountRange(start, end int32) (n int32) { + for _, iv := range c.runs { + // iv is before range + if int32(iv.last) < start { + continue + } + // iv is after range + if end < int32(iv.start) { + break + } + // iv is superset of range + if int32(iv.start) < start && int32(iv.last) > end { + return end - start + } + // iv is subset of range + if int32(iv.start) >= start && int32(iv.last) < end { + n += iv.runlen() + } + // iv overlaps beginning of range + if int32(iv.start) < start && int32(iv.last) < end { + n += int32(iv.last) - start + 1 + } + // iv overlaps end of range + if int32(iv.start) > start && int32(iv.last) >= end { + n += end - int32(iv.start) + } + } + return n +} + +// add adds a value to the container. +func (c *Container) add(v uint16) (added bool) { + + if c.isArray() { + added = c.arrayAdd(v) + } else if c.isRun() { + added = c.runAdd(v) + } else { + added = c.bitmapAdd(v) + } + if added { + c.n++ + } + return added +} + +func (c *Container) arrayAdd(v uint16) bool { + // Optimize appending to the end of an array container. + if c.n > 0 && c.n < ArrayMaxSize && c.isArray() && c.array[c.n-1] < v { + statsHit("arrayAdd/append") + c.unmap() + c.array = append(c.array, v) + return true + } + + // Find index of the integer in the container. Exit if it already exists. + i := search32(c.array, v) + if i >= 0 { + return false + } + + // Convert to a bitmap container if too many values are in an array container. + if c.n >= ArrayMaxSize { + statsHit("arrayAdd/arrayToBitmap") + c.arrayToBitmap() + return c.bitmapAdd(v) + } + + // Otherwise insert into array. + statsHit("arrayAdd/insert") + c.unmap() + i = -i - 1 + c.array = append(c.array, 0) + copy(c.array[i+1:], c.array[i:]) + c.array[i] = v + return true + +} + +func (c *Container) bitmapAdd(v uint16) bool { + if c.bitmapContains(v) { + return false + } + c.unmap() + c.bitmap[v/64] |= (1 << uint64(v%64)) + return true +} + +func (c *Container) runAdd(v uint16) bool { + if len(c.runs) == 0 { + c.unmap() + c.runs = []interval16{{start: v, last: v}} + return true + } + + i := sort.Search(len(c.runs), + func(i int) bool { return c.runs[i].last >= v }) + + if i == len(c.runs) { + i-- + } + + iv := c.runs[i] + if v >= iv.start && iv.last >= v { + return false + } + + c.unmap() + if iv.last < v { + if iv.last == v-1 { + c.runs[i].last++ + } else { + c.runs = append(c.runs, interval16{start: v, last: v}) + } + } else if v+1 == iv.start { + // combining two intervals + if i > 0 && c.runs[i-1].last == v-1 { + c.runs[i-1].last = iv.last + c.runs = append(c.runs[:i], c.runs[i+1:]...) + return true + } + // just before an interval + c.runs[i].start-- + } else if i > 0 && v-1 == c.runs[i-1].last { + // just after an interval + c.runs[i-1].last++ + } else { + // alone + newIv := interval16{start: v, last: v} + c.runs = append(c.runs[:i], append([]interval16{newIv}, c.runs[i:]...)...) + } + return true +} + +// Contains returns true if v is in the container. +func (c *Container) Contains(v uint16) bool { + if c.isArray() { + return c.arrayContains(v) + } else if c.isRun() { + return c.runContains(v) + } else { + return c.bitmapContains(v) + } +} + +func (c *Container) bitmapCountRuns() (r int32) { + for i := 0; i < 1023; i++ { + v, v1 := c.bitmap[i], c.bitmap[i+1] + r = r + int32(popcount((v<<1)&^v)+((v>>63)&^v1)) + } + vl := c.bitmap[len(c.bitmap)-1] + r = r + int32(popcount((vl<<1)&^vl)+vl>>63) + return r +} + +func (c *Container) arrayCountRuns() (r int32) { + prev := int32(-2) + for _, v := range c.array { + if prev+1 != int32(v) { + r++ + } + prev = int32(v) + } + return r +} + +func (c *Container) countRuns() (r int32) { + if c.isArray() { + return c.arrayCountRuns() + } else if c.isBitmap() { + return c.bitmapCountRuns() + } else if c.isRun() { + return int32(len(c.runs)) + } + + // sure hope this never happens + return 0 +} + +// optimize converts the container to the type which will take up the least +// amount of space. +func (c *Container) optimize() { + if c.n == 0 { + statsHit("optimize/empty") + return + } + runs := c.countRuns() + + var newType byte + if runs <= runMaxSize && runs <= c.n/2 { + newType = containerRun + } else if c.n < ArrayMaxSize { + newType = containerArray + } else { + newType = containerBitmap + } + + // Then convert accordingly. + if c.isArray() { + if newType == containerBitmap { + statsHit("optimize/arrayToBitmap") + c.arrayToBitmap() + } else if newType == containerRun { + statsHit("optimize/arrayToRun") + c.arrayToRun() + } else { + statsHit("optimize/arrayUnchanged") + } + } else if c.isBitmap() { + if newType == containerArray { + statsHit("optimize/bitmapToArray") + c.bitmapToArray() + } else if newType == containerRun { + statsHit("optimize/bitmapToRun") + c.bitmapToRun() + } else { + statsHit("optimize/bitmapUnchanged") + } + } else if c.isRun() { + if newType == containerBitmap { + statsHit("optimize/runToBitmap") + c.runToBitmap() + } else if newType == containerArray { + statsHit("optimize/runToArray") + c.runToArray() + } else { + statsHit("optimize/runUnchanged") + } + } +} + +func (c *Container) arrayContains(v uint16) bool { + return search32(c.array, v) >= 0 +} + +func (c *Container) bitmapContains(v uint16) bool { + return (c.bitmap[v/64] & (1 << uint64(v%64))) != 0 +} + +// binSearchRuns returns the index of the run containing v, and true, when v is contained; +// or the index of the next run starting after v, and false, when v is not contained. +func binSearchRuns(v uint16, a []interval16) (int32, bool) { + i := int32(sort.Search(len(a), + func(i int) bool { return a[i].last >= v })) + if i < int32(len(a)) { + return i, (v >= a[i].start) && (v <= a[i].last) + } + + return i, false +} + +// runContains determines if v is in the container assuming c is a run +// container. +func (c *Container) runContains(v uint16) bool { + _, found := binSearchRuns(v, c.runs) + return found +} + +// remove removes a value from the container. +func (c *Container) remove(v uint16) (removed bool) { + if c.isArray() { + removed = c.arrayRemove(v) + } else if c.isRun() { + removed = c.runRemove(v) + } else { + removed = c.bitmapRemove(v) + } + if removed { + c.n-- + } + return removed +} + +func (c *Container) arrayRemove(v uint16) bool { + i := search32(c.array, v) + if i < 0 { + return false + } + c.unmap() + + c.array = append(c.array[:i], c.array[i+1:]...) + return true +} + +func (c *Container) bitmapRemove(v uint16) bool { + if !c.bitmapContains(v) { + return false + } + c.unmap() + + // Lower count and remove element. + // c.n-- // TODO removed this - test it + c.bitmap[v/64] &^= (uint64(1) << uint(v%64)) + + // Convert to array if we go below the threshold. + if c.n == ArrayMaxSize { + statsHit("bitmapRemove/bitmapToArray") + c.bitmapToArray() + } + return true +} + +// runRemove removes v from a run container, and returns true if v was removed. +func (c *Container) runRemove(v uint16) bool { + i, contains := binSearchRuns(v, c.runs) + if !contains { + return false + } + c.unmap() + if v == c.runs[i].last && v == c.runs[i].start { + c.runs = append(c.runs[:i], c.runs[i+1:]...) + } else if v == c.runs[i].last { + c.runs[i].last-- + } else if v == c.runs[i].start { + c.runs[i].start++ + } else if v > c.runs[i].start { + last := c.runs[i].last + c.runs[i].last = v - 1 + c.runs = append(c.runs[:i+1], append([]interval16{{start: v + 1, last: last}}, c.runs[i+1:]...)...) + } + return true +} + +// max returns the maximum value in the container. +func (c *Container) max() uint16 { + if c.isArray() { + return c.arrayMax() + } else if c.isRun() { + return c.runMax() + } else { + return c.bitmapMax() + } +} + +func (c *Container) arrayMax() uint16 { + if len(c.array) == 0 { + return 0 // probably hiding some ugly bug but it prevents a crash + } + return c.array[len(c.array)-1] +} + +func (c *Container) bitmapMax() uint16 { + // Search bitmap in reverse order. + for i := len(c.bitmap); i > 0; i-- { + // If value is zero then skip. + v := c.bitmap[i-1] + if v != 0 { + r := bits.LeadingZeros64(v) + return uint16((i-1)*64 + 63 - r) + } + + } + return 0 +} + +func (c *Container) runMax() uint16 { + if len(c.runs) == 0 { + return 0 + } + return c.runs[len(c.runs)-1].last +} + +// bitmapToArray converts from bitmap format to array format. +func (c *Container) bitmapToArray() { + statsHit("bitmapToArray") + c.resetArrayWithMinimumCapacity(int(c.n)) + c.containerType = containerArray + + // return early if empty + if c.n == 0 { + c.resetBitmap(false) + c.mapped = false + return + } + + for i, bitmap := range c.bitmap { + for bitmap != 0 { + t := bitmap & -bitmap + c.array = append(c.array, uint16((i*64 + int(popcount(t-1))))) + bitmap ^= t + } + } + c.resetBitmap(false) + c.mapped = false +} + +// arrayToBitmap converts from array format to bitmap format. +func (c *Container) arrayToBitmap() { + statsHit("arrayToBitmap") + c.resetBitmap(true) + c.containerType = containerBitmap + + // return early if empty + if c.n == 0 { + c.resetArrayWithMinimumCapacity(0) + c.mapped = false + return + } + + for _, v := range c.array { + c.bitmap[int(v)/64] |= (uint64(1) << uint(v%64)) + } + c.resetArrayWithMinimumCapacity(0) + c.mapped = false +} + +// runToBitmap converts from RLE format to bitmap format. +func (c *Container) runToBitmap() { + statsHit("runToBitmap") + c.resetBitmap(true) + c.containerType = containerBitmap + + // return early if empty + if c.n == 0 { + c.resetRunsWithMinimumCapacity(0) + c.mapped = false + return + } + + for _, r := range c.runs { + // TODO this can be ~64x faster for long runs by setting maxBitmap instead of single bits + //note v must be int or will overflow + for v := int(r.start); v <= int(r.last); v++ { + c.bitmap[v/64] |= (uint64(1) << uint(v%64)) + } + } + c.resetRunsWithMinimumCapacity(0) + c.mapped = false +} + +// bitmapToRun converts from bitmap format to RLE format. +func (c *Container) bitmapToRun() { + statsHit("bitmapToRun") + c.containerType = containerRun + // return early if empty + if c.n == 0 { + c.resetRunsWithMinimumCapacity(0) + c.resetBitmap(false) + c.mapped = false + return + } + + numRuns := c.bitmapCountRuns() + c.resetRunsWithMinimumCapacity(int(numRuns)) + + current := c.bitmap[0] + var i, start, last uint16 + for { + // skip while empty + for current == 0 && i < bitmapN-1 { + i++ + current = c.bitmap[i] + } + + if current == 0 { + break + } + currentStart := uint16(trailingZeroN(current)) + start = 64*i + currentStart + + // pad LSBs with 1s + current = current | (current - 1) + + // find next 0 + for current == maxBitmap && i < bitmapN-1 { + i++ + current = c.bitmap[i] + } + + if current == maxBitmap { + + // bitmap[1023] == maxBitmap + c.runs = append(c.runs, interval16{start, maxContainerVal}) + break + } + currentLast := uint16(trailingZeroN(^current)) + last = 64*i + currentLast + c.runs = append(c.runs, interval16{start, last - 1}) + + // pad LSBs with 0s + current = current & (current + 1) + } + + c.resetBitmap(false) + c.mapped = false +} + +// arrayToRun converts from array format to RLE format. +func (c *Container) arrayToRun() { + statsHit("arrayToRun") + c.containerType = containerRun + // return early if empty + if c.n == 0 { + c.resetRunsWithMinimumCapacity(0) + c.resetArrayWithMinimumCapacity(0) + c.mapped = false + return + } + + numRuns := c.arrayCountRuns() + c.resetRunsWithMinimumCapacity(int(numRuns)) + start := c.array[0] + for i, v := range c.array[1:] { + if v-c.array[i] > 1 { + // if current-previous > 1, one run ends and another begins + c.runs = append(c.runs, interval16{start, c.array[i]}) + start = v + } + } + // append final run + c.runs = append(c.runs, interval16{start, c.array[c.n-1]}) + c.resetArrayWithMinimumCapacity(0) + c.mapped = false +} + +// runToArray converts from RLE format to array format. +func (c *Container) runToArray() { + statsHit("runToArray") + c.containerType = containerArray + c.resetArrayWithMinimumCapacity(int(c.n)) + + // return early if empty + if c.n == 0 { + c.resetRunsWithMinimumCapacity(0) + c.mapped = false + return + } + + for _, r := range c.runs { + for v := int(r.start); v <= int(r.last); v++ { + c.array = append(c.array, uint16(v)) + } + } + c.resetRunsWithMinimumCapacity(0) + c.mapped = false +} + +// Clone returns a copy of c. +func (c *Container) Clone() *Container { + statsHit("Container/Clone") + other := &Container{n: c.n, containerType: c.containerType} + if c.pooled { + // Clone the pooled flag, but allow the container types to + // be lazy alloced as needed. + other.pooled = true + } + + switch c.containerType { + case containerArray: + statsHit("Container/Clone/Array") + other.array = make([]uint16, len(c.array)) + copy(other.array, c.array) + case containerBitmap: + statsHit("Container/Clone/Bitmap") + other.bitmap = make([]uint64, len(c.bitmap)) + copy(other.bitmap, c.bitmap) + case containerRun: + statsHit("Container/Clone/Run") + other.runs = make([]interval16, len(c.runs)) + copy(other.runs, c.runs) + } + return other +} + +// WriteTo writes c to w. +func (c *Container) WriteTo(w io.Writer) (n int64, err error) { + if c.isArray() { + return c.arrayWriteTo(w) + } else if c.isRun() { + return c.runWriteTo(w) + } else { + return c.bitmapWriteTo(w) + } +} + +func (c *Container) arrayWriteTo(w io.Writer) (n int64, err error) { + statsHit("Container/arrayWriteTo") + if len(c.array) == 0 { + return 0, nil + } + + // Verify all elements are valid. + // TODO: instead of commenting this out, we need to make it a configuration option + // for _, v := range c.array { + // assert(lowbits(uint64(v)) == v, "cannot write array value out of range: %d", v) + //} + + // Write sizeof(uint16) * cardinality bytes. + nn, err := w.Write((*[0xFFFFFFF]byte)(unsafe.Pointer(&c.array[0]))[: 2*c.n : 2*c.n]) + return int64(nn), err +} + +func (c *Container) bitmapWriteTo(w io.Writer) (n int64, err error) { + statsHit("Container/bitmapWriteTo") + // Write sizeof(uint64) * bitmapN bytes. + nn, err := w.Write((*[0xFFFFFFF]byte)(unsafe.Pointer(&c.bitmap[0]))[:(8 * bitmapN):(8 * bitmapN)]) + return int64(nn), err +} + +func (c *Container) runWriteTo(w io.Writer) (n int64, err error) { + statsHit("Container/runWriteTo") + if len(c.runs) == 0 { + return 0, nil + } + var byte2 [2]byte + binary.LittleEndian.PutUint16(byte2[:], uint16(len(c.runs))) + _, err = w.Write(byte2[:]) + if err != nil { + return 0, err + } + runs := c.runs + nn, err := w.Write((*[0xFFFFFFF]byte)(unsafe.Pointer(&runs[0]))[: interval16Size*len(runs) : interval16Size*len(runs)]) + return int64(runCountHeaderSize + nn), err +} + +// size returns the encoded size of the container, in bytes. +func (c *Container) size() int { + if c.isArray() { + return len(c.array) * 2 // sizeof(uint16) + } else if c.isRun() { + return len(c.runs)*interval16Size + runCountHeaderSize + } else { + return len(c.bitmap) * 8 // sizeof(uint64) + } +} + +// info returns the current stats about the container. +func (c *Container) info() containerInfo { + info := containerInfo{N: c.n} + + if c.isArray() { + info.Type = "array" + info.Alloc = len(c.array) * 2 // sizeof(uint16) + } else if c.isRun() { + info.Type = "run" + info.Alloc = len(c.runs)*interval16Size + runCountHeaderSize + } else { + info.Type = "bitmap" + info.Alloc = len(c.bitmap) * 8 // sizeof(uint64) + } + + if c.mapped { + if c.isArray() { + info.Pointer = unsafe.Pointer(&c.array[0]) + } else if c.isRun() { + info.Pointer = unsafe.Pointer(&c.runs[0]) + } else { + info.Pointer = unsafe.Pointer(&c.bitmap[0]) + } + } + + return info +} + +// check performs a consistency check on the container. +func (c *Container) check() error { + var a ErrorList + + if c.isArray() { + if int32(len(c.array)) != c.n { + a.Append(fmt.Errorf("array count mismatch: count=%d, n=%d", len(c.array), c.n)) + } + } else if c.isRun() { + n := c.runCountRange(0, maxContainerVal+1) + if n != c.n { + a.Append(fmt.Errorf("run count mismatch: count=%d, n=%d", n, c.n)) + } + } else if c.isBitmap() { + if n := c.bitmapCountRange(0, maxContainerVal+1); n != c.n { + a.Append(fmt.Errorf("bitmap count mismatch: count=%d, n=%d", n, c.n)) + } + } else { + a.Append(fmt.Errorf("empty container")) + if c.n != 0 { + a.Append(fmt.Errorf("empty container with nonzero count: n=%d", c.n)) + } + } + + if a == nil { + return nil + } + return a +} + +// Repair repairs the cardinality of c if it has been corrupted by +// optimized operations. +func (c *Container) Repair() { + if c.isBitmap() { + c.bitmapRepair() + } +} + +func (c *Container) bitmapRepair() { + n := int32(0) + // Manually unroll loop to make it a little faster. + // TODO(rartoul): Can probably make this a few x faster using + // SIMD instructions. + for i := 0; i < bitmapN; i += 4 { + n += int32(popcount(c.bitmap[i])) + n += int32(popcount(c.bitmap[i+1])) + n += int32(popcount(c.bitmap[i+2])) + n += int32(popcount(c.bitmap[i+3])) + } + c.n = n +} + +// containerInfo represents a point-in-time snapshot of container stats. +type containerInfo struct { + Key uint64 // container key + Type string // container type (array, bitmap, or run) + N int32 // number of bits + Alloc int // memory used + Pointer unsafe.Pointer // offset within the mmap +} + +// flip returns a new container containing the inverse of all +// bits in a. +func flip(a *Container) *Container { // nolint: deadcode + if a.isArray() { + return flipArray(a) + } else if a.isRun() { + return flipRun(a) + } else { + return flipBitmap(a) + } +} + +func flipArray(b *Container) *Container { + statsHit("flipArray") + // TODO: actually implement this + x := b.Clone() + x.arrayToBitmap() + return flipBitmap(x) +} + +func flipBitmap(b *Container) *Container { + statsHit("flipBitmap") + other := &Container{bitmap: make([]uint64, bitmapN), containerType: containerBitmap} + + for i, bitmap := range b.bitmap { + other.bitmap[i] = ^bitmap + } + + other.n = other.count() + return other +} + +func flipRun(b *Container) *Container { + statsHit("flipRun") + // TODO: actually implement this + x := b.Clone() + x.runToBitmap() + return flipBitmap(x) +} + +func intersectionCount(a, b *Container) int32 { + if a.isArray() { + if b.isArray() { + return intersectionCountArrayArray(a, b) + } else if b.isRun() { + return intersectionCountArrayRun(a, b) + } else { + return intersectionCountArrayBitmap(a, b) + } + } else if a.isRun() { + if b.isArray() { + return intersectionCountArrayRun(b, a) + } else if b.isRun() { + return intersectionCountRunRun(a, b) + } else { + return intersectionCountBitmapRun(b, a) + } + } else { + if b.isArray() { + return intersectionCountArrayBitmap(b, a) + } else if b.isRun() { + return intersectionCountBitmapRun(a, b) + } else { + return intersectionCountBitmapBitmap(a, b) + } + } +} + +func intersectionCountArrayArray(a, b *Container) (n int32) { + statsHit("intersectionCount/ArrayArray") + ca, cb := a.array, b.array + na, nb := len(ca), len(cb) + if na == 0 || nb == 0 { + return 0 + } + if na > nb { + ca, cb = cb, ca + na, nb = nb, na // nolint: ineffassign + } + j := 0 + for _, va := range ca { + for cb[j] < va { + j++ + if j >= nb { + return n + } + } + if cb[j] == va { + n++ + } + } + return n +} + +func intersectionCountArrayRun(a, b *Container) (n int32) { + statsHit("intersectionCount/ArrayRun") + na, nb := len(a.array), len(b.runs) + for i, j := 0, 0; i < na && j < nb; { + va, vb := a.array[i], b.runs[j] + if va < vb.start { + i++ + } else if va >= vb.start && va <= vb.last { + i++ + n++ + } else if va > vb.last { + j++ + } + } + return n +} + +func intersectionCountRunRun(a, b *Container) (n int32) { + statsHit("intersectionCount/RunRun") + na, nb := len(a.runs), len(b.runs) + for i, j := 0, 0; i < na && j < nb; { + va, vb := a.runs[i], b.runs[j] + if va.last < vb.start { + // |--va--| |--vb--| + i++ + } else if va.start > vb.last { + // |--vb--| |--va--| + j++ + } else if va.last > vb.last && va.start >= vb.start { + // |--vb-|-|-va--| + n += 1 + int32(vb.last-va.start) + j++ + } else if va.last > vb.last && va.start < vb.start { + // |--va|--vb--|--| + n += 1 + int32(vb.last-vb.start) + j++ + } else if va.last <= vb.last && va.start >= vb.start { + // |--vb|--va--|--| + n += 1 + int32(va.last-va.start) + i++ + } else if va.last <= vb.last && va.start < vb.start { + // |--va-|-|-vb--| + n += 1 + int32(va.last-vb.start) + i++ + } + } + return n +} + +func intersectionCountBitmapRun(a, b *Container) (n int32) { + statsHit("intersectionCount/BitmapRun") + for _, iv := range b.runs { + n += a.bitmapCountRange(int32(iv.start), int32(iv.last)+1) + } + return n +} + +func intersectionCountArrayBitmap(a, b *Container) (n int32) { + statsHit("intersectionCount/ArrayBitmap") + ln := len(b.bitmap) + for _, val := range a.array { + i := int(val >> 6) + if i >= ln { + break + } + off := val % 64 + n += int32(b.bitmap[i]>>off) & 1 + } + return n +} + +func intersectionCountBitmapBitmap(a, b *Container) (n int32) { + statsHit("intersectionCount/BitmapBitmap") + return int32(popcountAndSlice(a.bitmap, b.bitmap)) +} + +func intersect(a, b *Container) *Container { + if a.isArray() { + if b.isArray() { + return intersectArrayArray(a, b) + } else if b.isRun() { + return intersectArrayRun(a, b) + } else { + return intersectArrayBitmap(a, b) + } + } else if a.isRun() { + if b.isArray() { + return intersectArrayRun(b, a) + } else if b.isRun() { + return intersectRunRun(a, b) + } else { + return intersectBitmapRun(b, a) + } + } else { + if b.isArray() { + return intersectArrayBitmap(b, a) + } else if b.isRun() { + return intersectBitmapRun(a, b) + } else { + return intersectBitmapBitmap(a, b) + } + } +} + +func intersectArrayArray(a, b *Container) *Container { + statsHit("intersect/ArrayArray") + output := &Container{containerType: containerArray} + na, nb := len(a.array), len(b.array) + for i, j := 0, 0; i < na && j < nb; { + va, vb := a.array[i], b.array[j] + if va < vb { + i++ + } else if va > vb { + j++ + } else { + output.array = append(output.array, va) + i, j = i+1, j+1 + } + } + output.n = int32(len(output.array)) + return output +} + +// intersectArrayRun computes the intersect of an array container and a run +// container. The return is always an array container (since it's guaranteed to +// be low-cardinality) +func intersectArrayRun(a, b *Container) *Container { + statsHit("intersect/ArrayRun") + output := &Container{containerType: containerArray} + na, nb := len(a.array), len(b.runs) + for i, j := 0, 0; i < na && j < nb; { + va, vb := a.array[i], b.runs[j] + if va < vb.start { + i++ + } else if va > vb.last { + j++ + } else { + output.array = append(output.array, va) + i++ + } + } + output.n = int32(len(output.array)) + return output +} + +// intersectRunRun computes the intersect of two run containers. +func intersectRunRun(a, b *Container) *Container { + statsHit("intersect/RunRun") + output := &Container{containerType: containerRun} + na, nb := len(a.runs), len(b.runs) + for i, j := 0, 0; i < na && j < nb; { + va, vb := a.runs[i], b.runs[j] + if va.last < vb.start { + // |--va--| |--vb--| + i++ + } else if vb.last < va.start { + // |--vb--| |--va--| + j++ + } else if va.last > vb.last && va.start >= vb.start { + // |--vb-|-|-va--| + output.n += output.runAppendInterval(interval16{start: va.start, last: vb.last}) + j++ + } else if va.last > vb.last && va.start < vb.start { + // |--va|--vb--|--| + output.n += output.runAppendInterval(vb) + j++ + } else if va.last <= vb.last && va.start >= vb.start { + // |--vb|--va--|--| + output.n += output.runAppendInterval(va) + i++ + } else if va.last <= vb.last && va.start < vb.start { + // |--va-|-|-vb--| + output.n += output.runAppendInterval(interval16{start: vb.start, last: va.last}) + i++ + } + } + if output.n < ArrayMaxSize && int32(len(output.runs)) > output.n/2 { + output.runToArray() + } else if len(output.runs) > runMaxSize { + output.runToBitmap() + } + return output +} + +// intersectBitmapRun returns an array container if either container's +// cardinality is <= ArrayMaxSize. Otherwise it returns a bitmap container. +func intersectBitmapRun(a, b *Container) *Container { + statsHit("intersect/BitmapRun") + var output *Container + if b.n <= ArrayMaxSize || a.n <= ArrayMaxSize { + // output is array container + output = &Container{containerType: containerArray} + for _, iv := range b.runs { + for i := iv.start; i <= iv.last; i++ { + if a.bitmapContains(i) { + output.array = append(output.array, i) + } + // If the run ends the container, break to avoid an infinite loop. + if i == 65535 { + break + } + } + } + output.n = int32(len(output.array)) + } else { + // right now this iterates through the runs and sets integers in the + // bitmap that are in the runs. alternately, we could zero out ranges in + // the bitmap which are between runs. + output = &Container{ + bitmap: make([]uint64, bitmapN), + containerType: containerBitmap, + } + for j := 0; j < len(b.runs); j++ { + vb := b.runs[j] + i := vb.start >> 6 // index into a + vastart := i << 6 + valast := vastart + 63 + for valast >= vb.start && vastart <= vb.last && i < bitmapN { + if vastart >= vb.start && valast <= vb.last { // a within b + output.bitmap[i] = a.bitmap[i] + output.n += int32(popcount(a.bitmap[i])) + } else if vb.start >= vastart && vb.last <= valast { // b within a + var mask uint64 = ((1 << (vb.last - vb.start + 1)) - 1) << (vb.start - vastart) + bits := a.bitmap[i] & mask + output.bitmap[i] |= bits + output.n += int32(popcount(bits)) + } else if vastart < vb.start { // a overlaps front of b + offset := 64 - (1 + valast - vb.start) + bits := (a.bitmap[i] >> offset) << offset + output.bitmap[i] |= bits + output.n += int32(popcount(bits)) + } else if vb.start < vastart { // b overlaps front of a + offset := 64 - (1 + vb.last - vastart) + bits := (a.bitmap[i] << offset) >> offset + output.bitmap[i] |= bits + output.n += int32(popcount(bits)) + } + // update loop vars + i++ + vastart = i << 6 + valast = vastart + 63 + } + } + } + return output +} + +func intersectArrayBitmap(a, b *Container) *Container { + statsHit("intersect/ArrayBitmap") + output := &Container{containerType: containerArray} + for _, va := range a.array { + bmidx := va / 64 + bidx := va % 64 + mask := uint64(1) << bidx + b := b.bitmap[bmidx] + if b&mask > 0 { + output.array = append(output.array, va) + } + } + output.n = int32(len(output.array)) + return output +} + +func intersectBitmapBitmap(a, b *Container) *Container { + statsHit("intersect/BitmapBitmap") + // local variables added to prevent BCE checks in loop + // see https://go101.org/article/bounds-check-elimination.html + var ( + ab = a.bitmap[:bitmapN] + bb = b.bitmap[:bitmapN] + buf = make([]uint64, bitmapN) + ob = buf[:bitmapN] + n int32 + ) + for i := 0; i < bitmapN; i++ { + ob[i] = ab[i] & bb[i] + n += int32(popcount(ob[i])) + } + + output := &Container{ + bitmap: ob, + n: n, + containerType: containerBitmap, + } + return output +} + +func union(a, b *Container) *Container { + if a.isArray() { + if b.isArray() { + return unionArrayArray(a, b) + } else if b.isRun() { + return unionArrayRun(a, b) + } else { + return unionArrayBitmap(a, b) + } + } else if a.isRun() { + if b.isArray() { + return unionArrayRun(b, a) + } else if b.isRun() { + return unionRunRun(a, b) + } else { + return unionBitmapRun(b, a) + } + } else { + if b.isArray() { + return unionArrayBitmap(b, a) + } else if b.isRun() { + return unionBitmapRun(a, b) + } else { + return unionBitmapBitmap(a, b) + } + } +} + +func unionArrayArray(a, b *Container) *Container { + statsHit("union/ArrayArray") + output := &Container{containerType: containerArray} + na, nb := len(a.array), len(b.array) + for i, j := 0, 0; ; { + if i >= na && j >= nb { + break + } else if i < na && j >= nb { + output.add(a.array[i]) + i++ + continue + } else if i >= na && j < nb { + output.add(b.array[j]) + j++ + continue + } + + va, vb := a.array[i], b.array[j] + if va < vb { + output.add(va) + i++ + } else if va > vb { + output.add(vb) + j++ + } else { + output.add(va) + i, j = i+1, j+1 + } + } + return output +} + +// unionArrayRun optimistically assumes that the result will be a run container, +// and converts to a bitmap or array container afterwards if necessary. +func unionArrayRun(a, b *Container) *Container { + statsHit("union/ArrayRun") + if b.n == maxContainerVal+1 { + return b.Clone() + } + output := &Container{containerType: containerRun} + na, nb := len(a.array), len(b.runs) + var vb interval16 + var va uint16 + for i, j := 0, 0; i < na || j < nb; { + if i < na { + va = a.array[i] + } + if j < nb { + vb = b.runs[j] + } + if i < na && (j >= nb || va < vb.start) { + output.n += output.runAppendInterval(interval16{start: va, last: va}) + i++ + } else { + output.n += output.runAppendInterval(vb) + j++ + } + } + if output.n < ArrayMaxSize { + output.runToArray() + } else if len(output.runs) > runMaxSize { + output.runToBitmap() + } + return output +} + +// runAppendInterval adds the given interval to the run container. It assumes +// that the interval comes at the end of the list of runs, and does not check +// that this is the case. It will not behave correctly if the start of the given +// interval is earlier than the start of the last interval in the list of runs. +// Its return value is the amount by which the cardinality of the container was +// increased. +func (c *Container) runAppendInterval(v interval16) int32 { + if len(c.runs) == 0 { + c.runs = append(c.runs, v) + return int32(v.last-v.start) + 1 + } + + last := c.runs[len(c.runs)-1] + if last.last == maxContainerVal { //protect against overflow + return 0 + } + if last.last+1 >= v.start && v.last > last.last { + c.runs[len(c.runs)-1].last = v.last + return int32(v.last - last.last) + } else if last.last+1 < v.start { + c.runs = append(c.runs, v) + return int32(v.last-v.start) + 1 + } + return 0 +} + +func unionRunRun(a, b *Container) *Container { + statsHit("union/RunRun") + if a.n == maxContainerVal+1 { + return a.Clone() + } + if b.n == maxContainerVal+1 { + return b.Clone() + } + na, nb := len(a.runs), len(b.runs) + output := &Container{ + runs: make([]interval16, 0, na+nb), + containerType: containerRun, + } + var va, vb interval16 + for i, j := 0, 0; i < na || j < nb; { + if i < na { + va = a.runs[i] + } + if j < nb { + vb = b.runs[j] + } + if i < na && (j >= nb || va.start < vb.start) { + output.n += output.runAppendInterval(va) + i++ + } else { + output.n += output.runAppendInterval(vb) + j++ + } + } + if len(output.runs) > runMaxSize { + output.runToBitmap() + } + return output +} + +func unionBitmapRun(a, b *Container) *Container { + statsHit("union/BitmapRun") + if b.n == maxContainerVal+1 { + return b.Clone() + } + if a.n == maxContainerVal+1 { + return a.Clone() + } + output := a.Clone() + for j := 0; j < len(b.runs); j++ { + output.bitmapSetRange(uint64(b.runs[j].start), uint64(b.runs[j].last)+1) + } + return output +} + +// unions the run b into the bitmap a, mutating a in place. The n value of +// a will need to be repaired after the fact. +func unionBitmapRunInPlace(a, b *Container) { + statsHit("union/BitmapRun") + for j := 0; j < len(b.runs); j++ { + a.bitmapSetRangeIgnoreN(uint64(b.runs[j].start), uint64(b.runs[j].last)+1) + } +} + +const maxBitmap = 0xFFFFFFFFFFFFFFFF + +// sets all bits in [i, j) (c must be a bitmap container) +func (c *Container) bitmapSetRange(i, j uint64) { + x := i >> 6 + y := (j - 1) >> 6 + var X uint64 = maxBitmap << (i % 64) + var Y uint64 = maxBitmap >> (63 - ((j - 1) % 64)) + xcnt := popcount(X) + ycnt := popcount(Y) + if x == y { + c.n += int32((j - i) - popcount(c.bitmap[x]&(X&Y))) + c.bitmap[x] |= (X & Y) + } else { + c.n += int32(xcnt - popcount(c.bitmap[x]&X)) + c.bitmap[x] |= X + for i := x + 1; i < y; i++ { + c.n += int32(64 - popcount(c.bitmap[i])) + c.bitmap[i] = maxBitmap + } + c.n += int32(ycnt - popcount(c.bitmap[y]&Y)) + c.bitmap[y] |= Y + } +} + +// sets all bits in [i, j) (c must be a bitmap container) without updating +// the value of n, meaning it will need to be repaired after the fact. +func (c *Container) bitmapSetRangeIgnoreN(i, j uint64) { + x := i >> 6 + y := (j - 1) >> 6 + var X uint64 = maxBitmap << (i % 64) + var Y uint64 = maxBitmap >> (63 - ((j - 1) % 64)) + + if x == y { + c.bitmap[x] |= (X & Y) + } else { + c.bitmap[x] |= X + for i := x + 1; i < y; i++ { + c.bitmap[i] = maxBitmap + } + c.bitmap[y] |= Y + } +} + +// xor's all bits in [i, j) with all true (c must be a bitmap container). +func (c *Container) bitmapXorRange(i, j uint64) { + x := i >> 6 + y := (j - 1) >> 6 + var X uint64 = maxBitmap << (i % 64) + var Y uint64 = maxBitmap >> (63 - ((j - 1) % 64)) + if x == y { + cnt := popcount(c.bitmap[x]) + c.bitmap[x] ^= (X & Y) //// flip + c.n += int32(popcount(c.bitmap[x]) - cnt) + } else { + cnt := popcount(c.bitmap[x]) + c.bitmap[x] ^= X + c.n += int32(popcount(c.bitmap[x]) - cnt) + for i := x + 1; i < y; i++ { + cnt = popcount(c.bitmap[i]) + c.bitmap[i] ^= maxBitmap + c.n += int32(popcount(c.bitmap[i]) - cnt) + } + cnt = popcount(c.bitmap[y]) + c.bitmap[y] ^= Y + c.n += int32(popcount(c.bitmap[y]) - cnt) + } +} + +// zeroes all bits in [i, j) (c must be a bitmap container) +func (c *Container) bitmapZeroRange(i, j uint64) { + x := i >> 6 + y := (j - 1) >> 6 + var X uint64 = maxBitmap << (i % 64) + var Y uint64 = maxBitmap >> (63 - ((j - 1) % 64)) + if x == y { + c.n -= int32(popcount(c.bitmap[x] & (X & Y))) + c.bitmap[x] &= ^(X & Y) + } else { + c.n -= int32(popcount(c.bitmap[x] & X)) + c.bitmap[x] &= ^X + for i := x + 1; i < y; i++ { + c.n -= int32(popcount(c.bitmap[i])) + c.bitmap[i] = 0 + } + c.n -= int32(popcount(c.bitmap[y] & Y)) + c.bitmap[y] &= ^Y + } +} + +func (c *Container) equals(c2 *Container) bool { + if c.mapped != c2.mapped || c.containerType != c2.containerType || c.n != c2.n { + return false + } + if c.containerType == containerArray { + if len(c.array) != len(c2.array) { + return false + } + for i := 0; i < len(c.array); i++ { + if c.array[i] != c2.array[i] { + return false + } + } + } else if c.containerType == containerBitmap { + if len(c.bitmap) != len(c2.bitmap) { + return false + } + for i := 0; i < len(c.bitmap); i++ { + if c.bitmap[i] != c2.bitmap[i] { + return false + } + } + } else if c.containerType == containerRun { + if len(c.runs) != len(c2.runs) { + return false + } + for i := 0; i < len(c.runs); i++ { + if c.runs[i] != c2.runs[i] { + return false + } + } + } else { + panic(fmt.Sprintf("unknown container type: %v", c.containerType)) + } + return true +} + +func unionArrayBitmap(a, b *Container) *Container { + output := b.Clone() + for _, v := range a.array { + if !output.bitmapContains(v) { + output.bitmap[v/64] |= (1 << uint64(v%64)) + output.n++ + } + } + return output +} + +// unions array b into bitmap a, mutating a in place. The n value +// of a will need to be repaired after the fact. +func unionBitmapArrayInPlace(a, b *Container) { + for _, v := range b.array { + a.bitmap[v>>6] |= (uint64(1) << (v % 64)) + } +} + +func unionBitmapBitmap(a, b *Container) *Container { + // local variables added to prevent BCE checks in loop + // see https://go101.org/article/bounds-check-elimination.html + + var ( + ab = a.bitmap[:bitmapN] + bb = b.bitmap[:bitmapN] + buf = make([]uint64, bitmapN) + ob = buf[:bitmapN] + + n int32 + ) + + for i := 0; i < bitmapN; i++ { + ob[i] = ab[i] | bb[i] + n += int32(popcount(ob[i])) + } + + output := &Container{ + bitmap: ob, + n: n, + containerType: containerBitmap, + } + return output +} + +// unions bitmap b into bitmap a, mutating a in place. The n value of +// a will need to be repaired after the fact. +func unionBitmapBitmapInPlace(a, b *Container) { + // local variables added to prevent BCE checks in loop + // see https://go101.org/article/bounds-check-elimination.html + + var ( + ab = a.bitmap[:bitmapN] + bb = b.bitmap[:bitmapN] + ) + + // Manually unroll loop to make it a little faster. + // TODO(rartoul): Can probably make this a few x faster using + // SIMD instructions. + for i := 0; i < bitmapN; i += 4 { + ab[i] |= bb[i] + ab[i+1] |= bb[i+1] + ab[i+2] |= bb[i+2] + ab[i+3] |= bb[i+3] + } +} + +func difference(a, b *Container) *Container { + if a.isArray() { + if b.isArray() { + return differenceArrayArray(a, b) + } else if b.isRun() { + return differenceArrayRun(a, b) + } else { + return differenceArrayBitmap(a, b) + } + } else if a.isRun() { + if b.isArray() { + return differenceRunArray(a, b) + } else if b.isRun() { + return differenceRunRun(a, b) + } else { + return differenceRunBitmap(a, b) + } + } else { + if b.isArray() { + return differenceBitmapArray(a, b) + } else if b.isRun() { + return differenceBitmapRun(a, b) + } else { + return differenceBitmapBitmap(a, b) + } + } +} + +// differenceArrayArray computes the difference bween two arrays. +func differenceArrayArray(a, b *Container) *Container { + statsHit("difference/ArrayArray") + output := &Container{containerType: containerArray} + na, nb := len(a.array), len(b.array) + for i, j := 0, 0; i < na; { + va := a.array[i] + if j >= nb { + output.add(va) + i++ + continue + } + + vb := b.array[j] + if va < vb { + output.add(va) + i++ + } else if va > vb { + j++ + } else { + i, j = i+1, j+1 + } + } + return output +} + +// differenceArrayRun computes the difference of an array from a run. +func differenceArrayRun(a, b *Container) *Container { + statsHit("difference/ArrayRun") + // func (ac *arrayContainer) iandNotRun16(rc *runContainer16) container { + + if a.n == 0 || b.n == 0 { + return a.Clone() + } + + output := &Container{array: make([]uint16, 0, a.n), containerType: containerArray} + // cardinality upper bound: card(A) + + i := 0 // array index + j := 0 // run index + + // handle overlap + for i < int(a.n) { + + // keep all array elements before beginning of runs + if a.array[i] < b.runs[j].start { + output.add(a.array[i]) + i++ + continue + } + + // if array element in run, skip it + if a.array[i] >= b.runs[j].start && a.array[i] <= b.runs[j].last { + i++ + continue + } + + // if array element larger than current run, check next run + if a.array[i] > b.runs[j].last { + j++ + if j == len(b.runs) { + break + } + } + } + + if i < len(a.array) { + // keep all array elements after end of runs + // It's possible that output was converted from array to bitmap in output.add() + // so check container type before proceeding. + if output.containerType == containerArray { + output.array = append(output.array, a.array[i:]...) + // TODO: consider handling container.n mutations in one place + // like we do with container.add(). + output.n += int32(len(a.array[i:])) + } else { + for _, v := range a.array[i:] { + output.add(v) + } + } + } + return output +} + +// differenceBitmapRun computes the difference of an bitmap from a run. +func differenceBitmapRun(a, b *Container) *Container { + statsHit("difference/BitmapRun") + if a.n == 0 || b.n == 0 { + return a.Clone() + } + + output := a.Clone() + for j := 0; j < len(b.runs); j++ { + output.bitmapZeroRange(uint64(b.runs[j].start), uint64(b.runs[j].last)+1) + } + return output +} + +// differenceRunArray subtracts the bits in an array container from a run +// container. +func differenceRunArray(a, b *Container) *Container { + statsHit("difference/RunArray") + if a.n == 0 || b.n == 0 { + return a.Clone() + } + output := &Container{runs: make([]interval16, 0, len(a.runs)), containerType: containerRun} + + bidx := 0 + vb := b.array[bidx] + +RUNLOOP: + for _, run := range a.runs { + start := run.start + for vb < run.start { + bidx++ + if bidx >= len(b.array) { + break + } + vb = b.array[bidx] + } + for vb >= run.start && vb <= run.last { + if vb == start { + if vb == 65535 { // overflow + break RUNLOOP + } + start++ + bidx++ + if bidx >= len(b.array) { + break + } + vb = b.array[bidx] + continue + } + output.runs = append(output.runs, interval16{start: start, last: vb - 1}) + output.n += int32(vb - start) + if vb == 65535 { // overflow + break RUNLOOP + } + start = vb + 1 + bidx++ + if bidx >= len(b.array) { + break + } + vb = b.array[bidx] + } + + if start <= run.last { + output.runs = append(output.runs, interval16{start: start, last: run.last}) + output.n += int32(run.last - start + 1) + } + } + output.optimize() + return output +} + +// differenceRunBitmap computes the difference of an run from a bitmap. +func differenceRunBitmap(a, b *Container) *Container { + statsHit("difference/RunBitmap") + // If a is full, difference is the flip of b. + if len(a.runs) > 0 && a.runs[0].start == 0 && a.runs[0].last == 65535 { + return flipBitmap(b) + } + output := &Container{containerType: containerRun} + output.n = a.n + if len(a.runs) == 0 { + return output + } + for j := 0; j < len(a.runs); j++ { + run := a.runs[j] + add := true + for bit := a.runs[j].start; bit <= a.runs[j].last; bit++ { + if b.bitmapContains(bit) { + output.n-- + if run.start == bit { + if bit == 65535 { //overflow + add = false + } + + run.start++ + } else if bit == run.last { + run.last-- + } else { + run.last = bit - 1 + if run.last >= run.start { + output.runs = append(output.runs, run) + } + run.start = bit + 1 + run.last = a.runs[j].last + } + if run.start > run.last { + break + } + } + + if bit == 65535 { //overflow + break + } + } + if run.start <= run.last { + if add { + output.runs = append(output.runs, run) + } + } + } + + if output.n < ArrayMaxSize && int32(len(output.runs)) > output.n/2 { + output.runToArray() + } else if len(output.runs) > runMaxSize { + output.runToBitmap() + } + return output +} + +// differenceRunRun computes the difference of two runs. +func differenceRunRun(a, b *Container) *Container { + statsHit("difference/RunRun") + if a.n == 0 || b.n == 0 { + return a.Clone() + } + + apos := 0 // current a-run index + bpos := 0 // current b-run index + astart := a.runs[apos].start + alast := a.runs[apos].last + bstart := b.runs[bpos].start + blast := b.runs[bpos].last + alen := len(a.runs) + blen := len(b.runs) + + output := &Container{runs: make([]interval16, 0, alen+blen), containerType: containerRun} // TODO allocate max then truncate? or something else + // cardinality upper bound: sum of number of runs + // each B-run could split an A-run in two, up to len(b.runs) times + + for apos < alen && bpos < blen { + switch { + case alast < bstart: + // current A-run entirely precedes current B-run: keep full A-run, advance to next A-run + output.runs = append(output.runs, interval16{start: astart, last: alast}) + apos++ + if apos < alen { + astart = a.runs[apos].start + alast = a.runs[apos].last + } + case blast < astart: + // current B-run entirely precedes current A-run: advance to next B-run + bpos++ + if bpos < blen { + bstart = b.runs[bpos].start + blast = b.runs[bpos].last + } + default: + // overlap + if astart < bstart { + output.runs = append(output.runs, interval16{start: astart, last: bstart - 1}) + } + if alast > blast { + astart = blast + 1 + } else { + apos++ + if apos < alen { + astart = a.runs[apos].start + alast = a.runs[apos].last + } + } + } + } + if apos < alen { + output.runs = append(output.runs, interval16{start: astart, last: alast}) + apos++ + if apos < alen { + output.runs = append(output.runs, a.runs[apos:]...) + } + } + + output.n = output.count() + return output +} + +func differenceArrayBitmap(a, b *Container) *Container { + statsHit("difference/ArrayBitmap") + output := &Container{containerType: containerArray} + for _, va := range a.array { + bmidx := va / 64 + bidx := va % 64 + mask := uint64(1) << bidx + b := b.bitmap[bmidx] + + if mask&^b > 0 { + output.array = append(output.array, va) + } + } + output.n = int32(len(output.array)) + return output +} + +func differenceBitmapArray(a, b *Container) *Container { + statsHit("difference/BitmapArray") + output := a.Clone() + + for _, v := range b.array { + if output.bitmapContains(v) { + output.bitmap[v/64] &^= (uint64(1) << uint(v%64)) + output.n-- + } + } + if output.n < ArrayMaxSize { + output.bitmapToArray() + } + return output +} + +func differenceBitmapBitmap(a, b *Container) *Container { + statsHit("difference/BitmapBitmap") + // local variables added to prevent BCE checks in loop + // see https://go101.org/article/bounds-check-elimination.html + + var ( + ab = a.bitmap[:bitmapN] + bb = b.bitmap[:bitmapN] + buf = make([]uint64, bitmapN) + ob = buf[:bitmapN] + + n int32 + ) + + for i := 0; i < bitmapN; i++ { + ob[i] = ab[i] & (^bb[i]) + n += int32(popcount(ob[i])) + } + + output := &Container{ + bitmap: ob, + n: n, + containerType: containerBitmap, + } + if output.n < ArrayMaxSize { + output.bitmapToArray() + } + return output +} + +func xor(a, b *Container) *Container { + if a.isArray() { + if b.isArray() { + return xorArrayArray(a, b) + } else if b.isRun() { + return xorArrayRun(a, b) + } else { + return xorArrayBitmap(a, b) + } + } else if a.isRun() { + if b.isArray() { + return xorArrayRun(b, a) + } else if b.isRun() { + return xorRunRun(a, b) + } else { + return xorBitmapRun(b, a) + } + } else { + if b.isArray() { + return xorArrayBitmap(b, a) + } else if b.isRun() { + return xorBitmapRun(a, b) + } else { + return xorBitmapBitmap(a, b) + } + } +} + +func xorArrayArray(a, b *Container) *Container { + statsHit("xor/ArrayArray") + output := &Container{containerType: containerArray} + na, nb := len(a.array), len(b.array) + for i, j := 0, 0; i < na || j < nb; { + if i < na && j >= nb { + output.add(a.array[i]) + i++ + continue + } else if i >= na && j < nb { + output.add(b.array[j]) + j++ + continue + } + + va, vb := a.array[i], b.array[j] + if va < vb { + output.add(va) + i++ + } else if va > vb { + output.add(vb) + j++ + } else { //== + i++ + j++ + } + } + return output +} + +func xorArrayBitmap(a, b *Container) *Container { + statsHit("xor/ArrayBitmap") + output := b.Clone() + for _, v := range a.array { + if b.bitmapContains(v) { + output.remove(v) + } else { + output.add(v) + } + } + + // It's possible that output was converted from bitmap to array in output.remove() + // so we only do this conversion if output is still a bitmap container. + if output.containerType == containerBitmap && output.count() < ArrayMaxSize { + output.bitmapToArray() + } + + return output +} + +func xorBitmapBitmap(a, b *Container) *Container { + statsHit("xor/BitmapBitmap") + // local variables added to prevent BCE checks in loop + // see https://go101.org/article/bounds-check-elimination.html + + var ( + ab = a.bitmap[:bitmapN] + bb = b.bitmap[:bitmapN] + buf = make([]uint64, bitmapN) + ob = buf[:bitmapN] + + n int32 + ) + + for i := 0; i < bitmapN; i++ { + ob[i] = ab[i] ^ bb[i] + n += int32(popcount(ob[i])) + } + + output := &Container{ + bitmap: ob, + n: n, + containerType: containerBitmap, + } + if output.count() < ArrayMaxSize { + output.bitmapToArray() + } + return output +} + +// opType represents a type of operation. +type opType uint8 + +const ( + opTypeAdd = opType(0) + opTypeRemove = opType(1) +) + +// op represents an operation on the bitmap. +type op struct { + typ opType + value uint64 +} + +// apply executes the operation against a bitmap. +func (op *op) apply(b *Bitmap) bool { + switch op.typ { + case opTypeAdd: + return b.DirectAdd(op.value) + case opTypeRemove: + return b.remove(op.value) + default: + panic(fmt.Sprintf("invalid op type: %d", op.typ)) + } +} + +// WriteTo writes op to the w. +func (op *op) WriteTo(w io.Writer) (n int64, err error) { + buf := make([]byte, op.size()) + + // Write type and value. + buf[0] = byte(op.typ) + binary.LittleEndian.PutUint64(buf[1:9], op.value) + + // Add checksum at the end. + h := fnv.New32a() + h.Write(buf[0:9]) + binary.LittleEndian.PutUint32(buf[9:13], h.Sum32()) + + // Write to writer. + nn, err := w.Write(buf) + return int64(nn), err +} + +// UnmarshalBinary decodes data into an op. +func (op *op) UnmarshalBinary(data []byte) error { + if len(data) < op.size() { + return fmt.Errorf("op data out of bounds: len=%d", len(data)) + } + statsHit("op/UnmarshalBinary") + + // Verify checksum. + h := fnv.New32a() + h.Write(data[0:9]) + if chk := binary.LittleEndian.Uint32(data[9:13]); chk != h.Sum32() { + return fmt.Errorf("checksum mismatch: exp=%08x, got=%08x", h.Sum32(), chk) + } + + // Read type and value. + op.typ = opType(data[0]) + op.value = binary.LittleEndian.Uint64(data[1:9]) + + return nil +} + +// size returns the encoded size of the op, in bytes. +func (*op) size() int { return 1 + 8 + 4 } + +func highbits(v uint64) uint64 { return v >> 16 } +func lowbits(v uint64) uint16 { return uint16(v & 0xFFFF) } + +// search32 returns the index of value in a. If value is not found, it works the +// same way as search64. +func search32(a []uint16, value uint16) int32 { + statsHit("search32") + // Optimize for elements and the last element. + n := int32(len(a)) + if n == 0 { + return -1 + } else if a[n-1] == value { + return n - 1 + } + + // Otherwise perform binary search for exact match. + lo, hi := int32(0), n-1 + for lo+16 <= hi { + i := int32(uint((lo + hi)) >> 1) + v := a[i] + + if v < value { + lo = i + 1 + } else if v > value { + hi = i - 1 + } else { + return i + } + } + + // If an exact match isn't found then return a negative index. + for ; lo <= hi; lo++ { + v := a[lo] + if v == value { + return lo + } else if v > value { + break + } + } + return -(lo + 1) +} + +// search64 returns the index of value in a. If value is not found, -1 * (1 + +// the index where v would be if it were inserted) is returned. This is done in +// order to both signal that value was not found (negative number), and also +// return information about where v would go if it were inserted. The +1 offset +// is necessary due to the case where v is not found, but would go at index 0. +// since negative 0 is no different from positive 0, we offset the returned +// negative indices by 1. See the test for this function for examples. +func search64(a []uint64, value uint64) int { + statsHit("search64") + // Optimize for elements and the last element. + n := len(a) + if n == 0 { + return -1 + } else if a[n-1] == value { + return n - 1 + } + + // Otherwise perform binary search for exact match. + lo, hi := 0, n-1 + for lo+16 <= hi { + i := int(uint((lo + hi)) >> 1) + v := a[i] + + if v < value { + lo = i + 1 + } else if v > value { + hi = i - 1 + } else { + return i + } + } + + // If an exact match isn't found then return a negative index. + for ; lo <= hi; lo++ { + v := a[lo] + if v == value { + return lo + } else if v > value { + break + } + } + return -(lo + 1) +} + +// trailingZeroN returns the number of trailing zeros in v. +// v must be greater than zero. +func trailingZeroN(v uint64) int { + return bits.TrailingZeros64(v) +} + +// ErrorList represents a list of errors. +type ErrorList []error + +func (a ErrorList) Error() string { + switch len(a) { + case 0: + return "no errors" + case 1: + return a[0].Error() + } + return fmt.Sprintf("%s (and %d more errors)", a[0], len(a)-1) +} + +// Append appends an error to the list. If err is an ErrorList then all errors are appended. +func (a *ErrorList) Append(err error) { + switch err := err.(type) { + case ErrorList: + *a = append(*a, err...) + default: + *a = append(*a, err) + } +} + +// AppendWithPrefix appends an error to the list and includes a prefix. +func (a *ErrorList) AppendWithPrefix(err error, prefix string) { + switch err := err.(type) { + case ErrorList: + for i := range err { + *a = append(*a, fmt.Errorf("%s%s", prefix, err[i])) + } + default: + *a = append(*a, fmt.Errorf("%s%s", prefix, err)) + } +} + +// xorArrayRun computes the exclusive or of an array and a run container. +func xorArrayRun(a, b *Container) *Container { + statsHit("xor/ArrayRun") + output := &Container{containerType: containerRun} + na, nb := len(a.array), len(b.runs) + var vb interval16 + var va uint16 + lastI, lastJ := -1, -1 + for i, j := 0, 0; i < na || j < nb; { + if i < na && i != lastI { + va = a.array[i] + } + if j < nb && j != lastJ { + vb = b.runs[j] + } + lastI = i + lastJ = j + + if i < na && (j >= nb || va < vb.start) { //before + output.n += output.runAppendInterval(interval16{start: va, last: va}) + i++ + } else if j < nb && (i >= na || va > vb.last) { //after + output.n += output.runAppendInterval(vb) + j++ + } else if va > vb.start { + if va < vb.last { + output.n += output.runAppendInterval(interval16{start: vb.start, last: va - 1}) + i++ + vb.start = va + 1 + + if vb.start > vb.last { + j++ + } + } else if va > vb.last { + output.n += output.runAppendInterval(vb) + j++ + } else { // va == vb.last + vb.last-- + if vb.start <= vb.last { + output.n += output.runAppendInterval(vb) + } + j++ + i++ + } + + } else { // we know va == vb.start + if vb.start == maxContainerVal { // protect overflow + j++ + } else { + vb.start++ + if vb.start > vb.last { + j++ + } + } + i++ + } + } + if output.n < ArrayMaxSize { + output.runToArray() + } else if len(output.runs) > runMaxSize { + output.runToBitmap() + } + return output +} + +// xorCompare computes first exclusive run between two runs. +func xorCompare(x *xorstm) (r1 interval16, hasData bool) { + hasData = false + if !x.vaValid || !x.vbValid { + if x.vbValid { + x.vbValid = false + return x.vb, true + } + if x.vaValid { + x.vaValid = false + return x.va, true + } + return r1, false + } + + if x.va.last < x.vb.start { //va before + x.vaValid = false + r1 = x.va + hasData = true + } else if x.vb.last < x.va.start { //vb before + x.vbValid = false + r1 = x.vb + hasData = true + } else if x.va.start == x.vb.start && x.va.last == x.vb.last { // Equal + x.vaValid = false + x.vbValid = false + } else if x.va.start <= x.vb.start && x.va.last >= x.vb.last { //vb inside + x.vbValid = false + if x.va.start != x.vb.start { + r1 = interval16{start: x.va.start, last: x.vb.start - 1} + hasData = true + } + + if x.vb.last == maxContainerVal { // Check for overflow + x.vaValid = false + + } else { + x.va.start = x.vb.last + 1 + if x.va.start > x.va.last { + x.vaValid = false + } + } + + } else if x.vb.start <= x.va.start && x.vb.last >= x.va.last { //va inside + x.vaValid = false + if x.vb.start != x.va.start { + r1 = interval16{start: x.vb.start, last: x.va.start - 1} + hasData = true + } + + if x.va.last == maxContainerVal { //check for overflow + x.vbValid = false + } else { + x.vb.start = x.va.last + 1 + if x.vb.start > x.vb.last { + x.vbValid = false + } + } + + } else if x.va.start < x.vb.start && x.va.last <= x.vb.last { //va first overlap + x.vaValid = false + r1 = interval16{start: x.va.start, last: x.vb.start - 1} + hasData = true + if x.va.last == maxContainerVal { // check for overflow + x.vbValid = false + } else { + x.vb.start = x.va.last + 1 + if x.vb.start > x.vb.last { + x.vbValid = false + } + } + } else if x.vb.start < x.va.start && x.vb.last <= x.va.last { //vb first overlap + x.vbValid = false + r1 = interval16{start: x.vb.start, last: x.va.start - 1} + hasData = true + + if x.vb.last == maxContainerVal { // check for overflow + x.vaValid = false + } else { + x.va.start = x.vb.last + 1 + if x.va.start > x.va.last { + x.vaValid = false + } + } + } + return r1, hasData +} + +//stm is state machine used to "xor" iterate over runs. +type xorstm struct { + vaValid, vbValid bool + va, vb interval16 +} + +// xorRunRun computes the exclusive or of two run containers. +func xorRunRun(a, b *Container) *Container { + statsHit("xor/RunRun") + na, nb := len(a.runs), len(b.runs) + if na == 0 { + return b.Clone() + } + if nb == 0 { + return a.Clone() + } + output := &Container{containerType: containerRun} + + lastI, lastJ := -1, -1 + + state := &xorstm{} + + for i, j := 0, 0; i < na || j < nb; { + if i < na && lastI != i { + state.va = a.runs[i] + state.vaValid = true + } + + if j < nb && lastJ != j { + state.vb = b.runs[j] + state.vbValid = true + } + lastI, lastJ = i, j + + r1, ok := xorCompare(state) + if ok { + output.n += output.runAppendInterval(r1) + } + if !state.vaValid { + i++ + } + if !state.vbValid { + j++ + } + + } + + if output.n < ArrayMaxSize && int32(len(output.runs)) > output.n/2 { + output.runToArray() + } else if len(output.runs) > runMaxSize { + output.runToBitmap() + } + return output +} + +// xorRunRun computes the exclusive or of a bitmap and a run container. +func xorBitmapRun(a, b *Container) *Container { + statsHit("xor/BitmapRun") + output := a.Clone() + for j := 0; j < len(b.runs); j++ { + output.bitmapXorRange(uint64(b.runs[j].start), uint64(b.runs[j].last)+1) + } + + if output.n < ArrayMaxSize && int32(len(output.runs)) > output.n/2 { + output.runToArray() + } else if len(output.runs) > runMaxSize { + output.runToBitmap() + } + return output +} + +func bitmapsEqual(b, c *Bitmap) error { // nolint: deadcode + statsHit("bitmapsEqual") + if b.OpWriter != c.OpWriter { + return errors.New("opWriters not equal") + } + if b.opN != c.opN { + return errors.New("opNs not equal") + } + + biter, _ := b.containersIterator(0) + citer, _ := c.containersIterator(0) + bn, cn := biter.Next(), citer.Next() + for ; bn && cn; bn, cn = biter.Next(), citer.Next() { + bk, bc := biter.Value() + ck, cc := citer.Value() + if bk != ck { + return errors.New("keys not equal") + } + if !bc.equals(cc) { + return errors.New("containers not equal") + } + } + if bn && !cn || cn && !bn { + return errors.New("different numbers of containers") + } + + return nil +} + +func popcount(x uint64) uint64 { + return uint64(bits.OnesCount64(x)) +} + +func popcountAndSlice(s, m []uint64) uint64 { + var ( + a = s[:bitmapN] + b = m[:bitmapN] + ) + + cnt := uint64(0) + for i := 0; i < bitmapN; i++ { + cnt += popcount(a[i] & b[i]) + } + return cnt +} + +// constants from github.com/RoaringBitmap/roaring +// taken from roaring/util.go +const ( + serialCookieNoRunContainer = 12346 // only arrays and bitmaps + serialCookie = 12347 // runs, arrays, and bitmaps +) + +func readOfficialHeader(buf []byte) (size uint32, containerTyper func(index uint, card int) byte, header, pos int, haveRuns bool, err error) { + statsHit("readOfficialHeader") + if len(buf) < 8 { + err = fmt.Errorf("buffer too small, expecting at least 8 bytes, was %d", len(buf)) + return size, containerTyper, header, pos, haveRuns, err + } + cf := func(index uint, card int) (newType byte) { + newType = containerBitmap + if card < ArrayMaxSize { + newType = containerArray + } + return newType + } + containerTyper = cf + cookie := binary.LittleEndian.Uint32(buf) + pos += 4 + + // cookie header + if cookie == serialCookieNoRunContainer { + size = binary.LittleEndian.Uint32(buf[pos:]) + pos += 4 + } else if cookie&0x0000FFFF == serialCookie { + haveRuns = true + size = uint32(uint16(cookie>>16) + 1) // number of containers + + // create is-run-container bitmap + isRunBitmapSize := (int(size) + 7) / 8 + if pos+isRunBitmapSize > len(buf) { + err = fmt.Errorf("malformed bitmap, is-run bitmap overruns buffer at %d", pos+isRunBitmapSize) + return size, containerTyper, header, pos, haveRuns, err + } + + isRunBitmap := buf[pos : pos+isRunBitmapSize] + pos += isRunBitmapSize + containerTyper = func(index uint, card int) byte { + if isRunBitmap[index/8]&(1<<(index%8)) != 0 { + return containerRun + } + return cf(index, card) + } + } else { + err = fmt.Errorf("did not find expected serialCookie in header") + return size, containerTyper, header, pos, haveRuns, err + } + + header = pos + if size > (1 << 16) { + err = fmt.Errorf("It is logically impossible to have more than (1<<16) containers.") + return size, containerTyper, header, pos, haveRuns, err + } + + // descriptive header + if pos+2*2*int(size) > len(buf) { + err = fmt.Errorf("malformed bitmap, key-cardinality slice overruns buffer at %d", pos+2*2*int(size)) + return size, containerTyper, header, pos, haveRuns, err + } + pos += 2 * 2 * int(size) // moving pos past keycount + return size, containerTyper, header, pos, haveRuns, err +} + +// UnmarshalBinary decodes b from a binary-encoded byte slice. data can be in +// either official roaring format or Pilosa's roaring format. +func (b *Bitmap) UnmarshalBinary(data []byte) error { + if data == nil { + // Nothing to unmarshal + return nil + } + statsHit("Bitmap/UnmarshalBinary") + fileMagic := uint32(binary.LittleEndian.Uint16(data[0:2])) + if fileMagic == magicNumber { // if pilosa roaring + return errors.Wrap(b.unmarshalPilosaRoaring(data), "unmarshaling as pilosa roaring") + } + + keyN, containerTyper, header, pos, haveRuns, err := readOfficialHeader(data) + if err != nil { + return errors.Wrap(err, "reading roaring header") + } + + b.Containers.Reset() + // Descriptive header section: Read container keys and cardinalities. + for i, buf := uint(0), data[header:]; i < uint(keyN); i, buf = i+1, buf[4:] { + card := int(binary.LittleEndian.Uint16(buf[2:4])) + 1 + b.Containers.PutContainerValues( + uint64(binary.LittleEndian.Uint16(buf[0:2])), + containerTyper(i, card), /// container type voodo with isRunBitmap + card, + true) + } + + // Read container offsets and attach data. + if haveRuns { + readWithRuns(b, data, pos, keyN) + } else { + err := readOffsets(b, data, pos, keyN) + if err != nil { + return errors.Wrap(err, "reading offsets from official roaring format") + } + } + return nil +} + +func readOffsets(b *Bitmap, data []byte, pos int, keyN uint32) error { + + citer, _ := b.containersIterator(0) + for i, buf := 0, data[pos:]; i < int(keyN); i, buf = i+1, buf[4:] { + offset := binary.LittleEndian.Uint32(buf[0:4]) + // Verify the offset is within the bounds of the input data. + if int(offset) >= len(data) { + return fmt.Errorf("offset out of bounds: off=%d, len=%d", offset, len(data)) + } + + // Map byte slice directly to the container data. + citer.Next() + _, c := citer.Value() + switch c.containerType { + case containerArray: + c.runs = nil + c.bitmap = nil + c.array = (*[0xFFFFFFF]uint16)(unsafe.Pointer(&data[offset]))[:c.n:c.n] + case containerBitmap: + c.array = nil + c.runs = nil + c.bitmap = (*[0xFFFFFFF]uint64)(unsafe.Pointer(&data[offset]))[:bitmapN:bitmapN] + default: + return fmt.Errorf("unsupported container type %d", c.containerType) + } + } + return nil +} + +func readWithRuns(b *Bitmap, data []byte, pos int, keyN uint32) { + citer, _ := b.containersIterator(0) + for i := 0; i < int(keyN); i++ { + citer.Next() + _, c := citer.Value() + switch c.containerType { + case containerRun: + c.array = nil + c.bitmap = nil + runCount := binary.LittleEndian.Uint16(data[pos : pos+runCountHeaderSize]) + c.runs = (*[0xFFFFFFF]interval16)(unsafe.Pointer(&data[pos+runCountHeaderSize]))[:runCount:runCount] + + for o := range c.runs { // must convert from start:length to start:end :( + c.runs[o].last = c.runs[o].start + c.runs[o].last + } + pos += int((runCount * interval16Size) + runCountHeaderSize) + case containerArray: + c.runs = nil + c.bitmap = nil + c.array = (*[0xFFFFFFF]uint16)(unsafe.Pointer(&data[pos]))[:c.n:c.n] + pos += int(c.n * 2) + case containerBitmap: + c.array = nil + c.runs = nil + c.bitmap = (*[0xFFFFFFF]uint64)(unsafe.Pointer(&data[pos]))[:bitmapN:bitmapN] + pos += bitmapN * 8 + } + } +} + +// handledIter and handledIters are wrappers around Bitmap Container iterators +// and assist with the unionIntoTarget algorithm by abstracting away some tedious +// operations. +type handledIter struct { + iter stackContainerIterator + hasNext bool + handled bool +} + +type handledIters []handledIter + +func (w handledIters) next() bool { + hasNext := false + + for i := range w { + next := w[i].iter.Next() + w[i].hasNext = next + w[i].handled = false + if next { + hasNext = true + } + } + + return hasNext +} + +func (w handledIters) markItersWithCurrentKeyAsHandled(startIdx int, key uint64) { + for i := startIdx; i < len(w); i++ { + wrapped := w[i] + currKey, _ := wrapped.iter.Value() + if currKey == key { + w[i].handled = true + } + } +} + +func (w handledIters) calculateSummaryStats(key uint64) containerUnionSummaryStats { + summary := containerUnionSummaryStats{} + + for _, iter := range w { + // Calculate key-level statistics here + currKey, currContainer := iter.iter.Value() + + if key == currKey { + summary.isOnlyContainerWithKey = false + summary.n += currContainer.n + + if currContainer.n == maxContainerVal+1 { + summary.hasMaxRange = true + summary.n = maxContainerVal + 1 + return summary + } + } + } + + return summary +} + +// Summary statistics about all the containers in the other bitmaps +// that share the same key so we can make smarter union strategy +// decisions. +type containerUnionSummaryStats struct { + // Estimated cardinality of the union of all containers with the same + // key across all bitmaps. This calculation is very rough as we just sum + // the cardinality of the container across the different bitmaps which could + // result in very inflated values, but it allows us to avoid allocating + // expensive bitmaps when unioning many low density containers. + n int32 + // Whether any other is the only container across all the bitmaps + // with the specified key. If true, we can skip all the unioning logic + // and just clone the container into target. + isOnlyContainerWithKey bool + // Whether any of the containers with the specified keys are storing every possible + // value that they can. If so, we can short-circuit all the unioning logic and use + // a RLE container with a single value in it. This is an optimization to + // avoid using an expensive bitmap container for bitmaps that have some + // extremely dense containers. + hasMaxRange bool +} diff --git a/vendor/github.com/m3dbx/pilosa/roaring/roaring_nop_stats.go b/vendor/github.com/m3dbx/pilosa/roaring/roaring_nop_stats.go new file mode 100644 index 00000000..c9e029ab --- /dev/null +++ b/vendor/github.com/m3dbx/pilosa/roaring/roaring_nop_stats.go @@ -0,0 +1,8 @@ +// +build !roaringstats + +package roaring + +// statsCount does nothing, because you aren't building with +// the "roaringstats" build tag. +func statsHit(string) { +} diff --git a/vendor/github.com/m3dbx/pilosa/roaring/roaring_stats.go b/vendor/github.com/m3dbx/pilosa/roaring/roaring_stats.go new file mode 100644 index 00000000..5bf3a6fc --- /dev/null +++ b/vendor/github.com/m3dbx/pilosa/roaring/roaring_stats.go @@ -0,0 +1,15 @@ +// +build roaringstats + +package roaring + +import ( + "github.com/m3dbx/pilosa/stats" +) + +var statsEv = stats.NewExpvarStatsClient() + +// statsHit increments the given stat, so we can tell how often we've hit +// that particular event. +func statsHit(name string) { + statsEv.Count(name, 1, 1) +} diff --git a/vendor/github.com/m3dbx/pilosa/stats/stats.go b/vendor/github.com/m3dbx/pilosa/stats/stats.go new file mode 100644 index 00000000..23ced62c --- /dev/null +++ b/vendor/github.com/m3dbx/pilosa/stats/stats.go @@ -0,0 +1,283 @@ +// Copyright 2017 Pilosa Corp. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stats + +import ( + "expvar" + "sort" + "strings" + "sync" + "time" + + "github.com/m3dbx/pilosa/logger" +) + +// Expvar global expvar map. +var Expvar = expvar.NewMap("index") + +// StatsClient represents a client to a stats server. +type StatsClient interface { + // Returns a sorted list of tags on the client. + Tags() []string + + // Returns a new client with additional tags appended. + WithTags(tags ...string) StatsClient + + // Tracks the number of times something occurs per second. + Count(name string, value int64, rate float64) + + // Tracks the number of times something occurs per second with custom tags + CountWithCustomTags(name string, value int64, rate float64, tags []string) + + // Sets the value of a metric. + Gauge(name string, value float64, rate float64) + + // Tracks statistical distribution of a metric. + Histogram(name string, value float64, rate float64) + + // Tracks number of unique elements. + Set(name string, value string, rate float64) + + // Tracks timing information for a metric. + Timing(name string, value time.Duration, rate float64) + + // SetLogger Set the logger output type + SetLogger(logger logger.Logger) + + // Starts the service + Open() + + // Closes the client + Close() error +} + +// NopStatsClient represents a client that doesn't do anything. +var NopStatsClient StatsClient = &nopStatsClient{} + +type nopStatsClient struct{} + +func (c *nopStatsClient) Tags() []string { return nil } +func (c *nopStatsClient) WithTags(tags ...string) StatsClient { return c } +func (c *nopStatsClient) Count(name string, value int64, rate float64) {} +func (c *nopStatsClient) CountWithCustomTags(name string, value int64, rate float64, tags []string) {} +func (c *nopStatsClient) Gauge(name string, value float64, rate float64) {} +func (c *nopStatsClient) Histogram(name string, value float64, rate float64) {} +func (c *nopStatsClient) Set(name string, value string, rate float64) {} +func (c *nopStatsClient) Timing(name string, value time.Duration, rate float64) {} +func (c *nopStatsClient) SetLogger(logger logger.Logger) {} +func (c *nopStatsClient) Open() {} +func (c *nopStatsClient) Close() error { return nil } + +// expvarStatsClient writes stats out to expvars. +type expvarStatsClient struct { + mu sync.Mutex + m *expvar.Map + tags []string +} + +// NewExpvarStatsClient returns a new instance of ExpvarStatsClient. +// This client points at the root of the expvar index map. +func NewExpvarStatsClient() *expvarStatsClient { + return &expvarStatsClient{ + m: Expvar, + } +} + +// Tags returns a sorted list of tags on the client. +func (c *expvarStatsClient) Tags() []string { + return nil +} + +// WithTags returns a new client with additional tags appended. +func (c *expvarStatsClient) WithTags(tags ...string) StatsClient { + m := &expvar.Map{} + m.Init() + c.m.Set(strings.Join(tags, ","), m) + + return &expvarStatsClient{ + m: m, + tags: unionStringSlice(c.tags, tags), + } +} + +// Count tracks the number of times something occurs. +func (c *expvarStatsClient) Count(name string, value int64, rate float64) { + c.m.Add(name, value) +} + +// CountWithCustomTags Tracks the number of times something occurs per second with custom tags +func (c *expvarStatsClient) CountWithCustomTags(name string, value int64, rate float64, tags []string) { + c.m.Add(name, value) +} + +// Gauge sets the value of a metric. +func (c *expvarStatsClient) Gauge(name string, value float64, rate float64) { + var f expvar.Float + f.Set(value) + c.m.Set(name, &f) +} + +// Histogram tracks statistical distribution of a metric. +// This works the same as gauge for this client. +func (c *expvarStatsClient) Histogram(name string, value float64, rate float64) { + c.Gauge(name, value, rate) +} + +// Set tracks number of unique elements. +func (c *expvarStatsClient) Set(name string, value string, rate float64) { + var s expvar.String + s.Set(value) + c.m.Set(name, &s) +} + +// Timing tracks timing information for a metric. +func (c *expvarStatsClient) Timing(name string, value time.Duration, rate float64) { + c.mu.Lock() + d, _ := c.m.Get(name).(time.Duration) + c.m.Set(name, d+value) + c.mu.Unlock() +} + +// SetLogger has no logger. +func (c *expvarStatsClient) SetLogger(logger logger.Logger) { +} + +// Open no-op. +func (c *expvarStatsClient) Open() {} + +// Close no-op. +func (c *expvarStatsClient) Close() error { return nil } + +// MultiStatsClient joins multiple stats clients together. +type MultiStatsClient []StatsClient + +// Tags returns tags from the first client. +func (a MultiStatsClient) Tags() []string { + if len(a) > 0 { + return a[0].Tags() + } + return nil +} + +// WithTags returns a new set of clients with the additional tags. +func (a MultiStatsClient) WithTags(tags ...string) StatsClient { + other := make(MultiStatsClient, len(a)) + for i := range a { + other[i] = a[i].WithTags(tags...) + } + return other +} + +// Count tracks the number of times something occurs per second on all clients. +func (a MultiStatsClient) Count(name string, value int64, rate float64) { + for _, c := range a { + c.Count(name, value, rate) + } +} + +// CountWithCustomTags Tracks the number of times something occurs per second with custom tags +func (a MultiStatsClient) CountWithCustomTags(name string, value int64, rate float64, tags []string) { + for _, c := range a { + c.CountWithCustomTags(name, value, rate, tags) + } +} + +// Gauge sets the value of a metric on all clients. +func (a MultiStatsClient) Gauge(name string, value float64, rate float64) { + for _, c := range a { + c.Gauge(name, value, rate) + } +} + +// Histogram tracks statistical distribution of a metric on all clients. +func (a MultiStatsClient) Histogram(name string, value float64, rate float64) { + for _, c := range a { + c.Histogram(name, value, rate) + } +} + +// Set tracks number of unique elements on all clients. +func (a MultiStatsClient) Set(name string, value string, rate float64) { + for _, c := range a { + c.Set(name, value, rate) + } +} + +// Timing tracks timing information for a metric on all clients. +func (a MultiStatsClient) Timing(name string, value time.Duration, rate float64) { + for _, c := range a { + c.Timing(name, value, rate) + } +} + +// SetLogger Sets the StatsD logger output type. +func (a MultiStatsClient) SetLogger(logger logger.Logger) { + for _, c := range a { + c.SetLogger(logger) + } +} + +// Open starts the stat service. +func (a MultiStatsClient) Open() { + for _, c := range a { + c.Open() + } +} + +// Close shuts down the stats clients. +func (a MultiStatsClient) Close() error { + for _, c := range a { + err := c.Close() + if err != nil { + return err + } + } + return nil +} + +// unionStringSlice returns a sorted set of tags which combine a & b. +func unionStringSlice(a, b []string) []string { + // Sort both sets first. + sort.Strings(a) + sort.Strings(b) + + // Find size of largest slice. + n := len(a) + if len(b) > n { + n = len(b) + } + + // Exit if both sets are empty. + if n == 0 { + return nil + } + + // Iterate over both in order and merge. + other := make([]string, 0, n) + for len(a) > 0 || len(b) > 0 { + if len(a) == 0 { + other, b = append(other, b[0]), b[1:] + } else if len(b) == 0 { + other, a = append(other, a[0]), a[1:] + } else if a[0] < b[0] { + other, a = append(other, a[0]), a[1:] + } else if b[0] < a[0] { + other, b = append(other, b[0]), b[1:] + } else { + other, a, b = append(other, a[0]), a[1:], b[1:] + } + } + return other +} diff --git a/vendor/github.com/m3dbx/vellum/.travis.yml b/vendor/github.com/m3dbx/vellum/.travis.yml new file mode 100644 index 00000000..c30a4fab --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/.travis.yml @@ -0,0 +1,20 @@ +sudo: false + +language: go + +go: + - 1.8 + +script: + - go get github.com/mattn/goveralls + - go get github.com/kisielk/errcheck + - go test -v $(go list ./... | grep -v vendor/) + - go test -race + - go vet + - errcheck + - go test -coverprofile=profile.out -covermode=count + - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then goveralls -service=travis-ci -coverprofile=profile.out -repotoken $COVERALLS; fi' + +notifications: + email: + - marty.schoch@gmail.com diff --git a/vendor/github.com/m3dbx/vellum/CONTRIBUTING.md b/vendor/github.com/m3dbx/vellum/CONTRIBUTING.md new file mode 100644 index 00000000..b85ec82b --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/CONTRIBUTING.md @@ -0,0 +1,16 @@ +# Contributing to Vellum + +We look forward to your contributions, but ask that you first review these guidelines. + +### Sign the CLA + +As Vellum is a Couchbase project we require contributors accept the [Couchbase Contributor License Agreement](http://review.couchbase.org/static/individual_agreement.html). To sign this agreement log into the Couchbase [code review tool](http://review.couchbase.org/). The Vellum project does not use this code review tool but it is still used to track acceptance of the contributor license agreements. + +### Submitting a Pull Request + +All types of contributions are welcome, but please keep the following in mind: + +- If you're planning a large change, you should really discuss it in a github issue first. This helps avoid duplicate effort and spending time on something that may not be merged. +- Existing tests should continue to pass, new tests for the contribution are nice to have. +- All code should have gone through `go fmt` +- All code should pass `go vet` diff --git a/vendor/github.com/m3dbx/vellum/LICENSE b/vendor/github.com/m3dbx/vellum/LICENSE new file mode 100644 index 00000000..7a4a3ea2 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/m3dbx/vellum/README.md b/vendor/github.com/m3dbx/vellum/README.md new file mode 100644 index 00000000..907b8b3a --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/README.md @@ -0,0 +1,183 @@ +# ![vellum](docs/logo.png) vellum + +[![Build Status](https://travis-ci.org/couchbase/vellum.svg?branch=master)](https://travis-ci.org/couchbase/vellum) +[![Coverage Status](https://coveralls.io/repos/github/couchbase/vellum/badge.svg?branch=master)](https://coveralls.io/github/couchbase/vellum?branch=master) +[![GoDoc](https://godoc.org/github.com/couchbase/vellum?status.svg)](https://godoc.org/github.com/couchbase/vellum) +[![Go Report Card](https://goreportcard.com/badge/github.com/couchbase/vellum)](https://goreportcard.com/report/github.com/couchbase/vellum) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) + +A Go library implementing an FST (finite state transducer) capable of: + - mapping between keys ([]byte) and a value (uint64) + - enumerating keys in lexicographic order + +Some additional goals of this implementation: + - bounded memory use while building the FST + - streaming out FST data while building + - mmap FST runtime to support very large FTSs (optional) + +## Usage + +### Building an FST + +To build an FST, create a new builder using the `New()` method. This method takes an `io.Writer` as an argument. As the FST is being built, data will be streamed to the writer as soon as possible. With this builder you **MUST** insert keys in lexicographic order. Inserting keys out of order will result in an error. After inserting the last key into the builder, you **MUST** call `Close()` on the builder. This will flush all remaining data to the underlying writer. + +In memory: +```go + var buf bytes.Buffer + builder, err := vellum.New(&buf, nil) + if err != nil { + log.Fatal(err) + } +``` + +To disk: +```go + f, err := os.Create("/tmp/vellum.fst") + if err != nil { + log.Fatal(err) + } + builder, err := vellum.New(f, nil) + if err != nil { + log.Fatal(err) + } +``` + +**MUST** insert keys in lexicographic order: +```go +err = builder.Insert([]byte("cat"), 1) +if err != nil { + log.Fatal(err) +} + +err = builder.Insert([]byte("dog"), 2) +if err != nil { + log.Fatal(err) +} + +err = builder.Insert([]byte("fish"), 3) +if err != nil { + log.Fatal(err) +} + +err = builder.Close() +if err != nil { + log.Fatal(err) +} +``` + +### Using an FST + +After closing the builder, the data can be used to instantiate an FST. If the data was written to disk, you can use the `Open()` method to mmap the file. If the data is already in memory, or you wish to load/mmap the data yourself, you can instantiate the FST with the `Load()` method. + +Load in memory: +```go + fst, err := vellum.Load(buf.Bytes()) + if err != nil { + log.Fatal(err) + } +``` + +Open from disk: +```go + fst, err := vellum.Open("/tmp/vellum.fst") + if err != nil { + log.Fatal(err) + } +``` + +Get key/value: +```go + val, exists, err = fst.Get([]byte("dog")) + if err != nil { + log.Fatal(err) + } + if exists { + fmt.Printf("contains dog with val: %d\n", val) + } else { + fmt.Printf("does not contain dog") + } +``` + +Iterate key/values: +```go + itr, err := fst.Iterator(startKeyInclusive, endKeyExclusive) + for err == nil { + key, val := itr.Current() + fmt.Printf("contains key: %s val: %d", key, val) + err = itr.Next() + } + if err != nil { + log.Fatal(err) + } +``` + +### How does the FST get built? + +A full example of the implementation is beyond the scope of this README, but let's consider a small example where we want to insert 3 key/value pairs. + +First we insert "are" with the value 4. + +![step1](docs/demo1.png) + +Next, we insert "ate" with the value 2. + +![step2](docs/demo2.png) + +Notice how the values associated with the transitions were adjusted so that by summing them while traversing we still get the expected value. + +At this point, we see that state 5 looks like state 3, and state 4 looks like state 2. But, we cannot yet combine them because future inserts could change this. + +Now, we insert "see" with value 3. Once it has been added, we now know that states 5 and 4 can longer change. Since they are identical to 3 and 2, we replace them. + +![step3](docs/demo3.png) + +Again, we see that states 7 and 8 appear to be identical to 2 and 3. + +Having inserted our last key, we call `Close()` on the builder. + +![step4](docs/demo4.png) + +Now, states 7 and 8 can safely be replaced with 2 and 3. + +For additional information, see the references at the bottom of this document. + +### What does the serialized format look like? + +We've broken out a separate document on the [vellum disk format v1](docs/format.md). + +### What if I want to use this on a system that doesn't have mmap? + +The mmap library itself is guarded with system/architecture build tags, but we've also added an additional build tag in vellum. If you'd like to Open() a file based representation of an FST, but not use mmap, you can build the library with the `nommap` build tag. NOTE: if you do this, the entire FST will be read into memory. + +### Can I use this with Unicode strings? + +Yes, however this implementation is only aware of the byte representation you choose. In order to find matches, you must work with some canonical byte representation of the string. In the future, some encoding-aware traversals may be possible on top of the lower-level byte transitions. + +### How did this library come to be? + +In my work on the [Bleve](https://github.com/blevesearch/bleve) project I became aware of the power of the FST for many search-related tasks. The obvious starting point for such a thing in Go was the [mafsa](https://github.com/smartystreets/mafsa) project. While working with mafsa I encountered some issues. First, it did not stream data to disk while building. Second, it chose to use a rune as the fundamental unit of transition in the FST, but I felt using a byte would be more powerful in the end. My hope is that higher-level encoding-aware traversals will be possible when necessary. Finally, as I reported bugs and submitted PRs I learned that the mafsa project was mainly a research project and no longer being maintained. I wanted to build something that could be used in production. As the project advanced more and more techniques from the [BurntSushi/fst](https://github.com/BurntSushi/fst) were adapted to our implementation. + +### Are there tools to work with vellum files? + +Under the cmd/vellum subdirectory, there's a command-line tool which +features subcommands that can allow you to create, inspect and query +vellum files. + +### How can I generate a state transition diagram from a vellum file? + +The vellum command-line tool has a "dot" subcommand that can emit +graphviz dot output data from an input vellum file. The dot file can +in turn be converted into an image using graphviz tools. Example... + + $ vellum dot myFile.vellum > output.dot + $ dot -Tpng output.dot -o output.png + +## Related Work + +Much credit goes to two existing projects: + - [mafsa](https://github.com/smartystreets/mafsa) + - [BurntSushi/fst](https://github.com/BurntSushi/fst) + +Most of the original implementation here started with my digging into the internals of mafsa. As the implementation progressed, I continued to borrow ideas/approaches from the BurntSushi/fst library as well. + +For a great introduction to this topic, please read the blog post [Index 1,600,000,000 Keys with Automata and Rust](http://blog.burntsushi.net/transducers/) diff --git a/vendor/github.com/m3dbx/vellum/automaton.go b/vendor/github.com/m3dbx/vellum/automaton.go new file mode 100644 index 00000000..70398f2d --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/automaton.go @@ -0,0 +1,85 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +// Automaton represents the general contract of a byte-based finite automaton +type Automaton interface { + + // Start returns the start state + Start() int + + // IsMatch returns true if and only if the state is a match + IsMatch(int) bool + + // CanMatch returns true if and only if it is possible to reach a match + // in zero or more steps + CanMatch(int) bool + + // WillAlwaysMatch returns true if and only if the current state matches + // and will always match no matter what steps are taken + WillAlwaysMatch(int) bool + + // Accept returns the next state given the input to the specified state + Accept(int, byte) int +} + +// AutomatonContains implements an generic Contains() method which works +// on any implementation of Automaton +func AutomatonContains(a Automaton, k []byte) bool { + i := 0 + curr := a.Start() + for a.CanMatch(curr) && i < len(k) { + curr = a.Accept(curr, k[i]) + if curr == noneAddr { + break + } + i++ + } + if i != len(k) { + return false + } + return a.IsMatch(curr) +} + +// AlwaysMatch is an Automaton implementation which always matches +type AlwaysMatch struct{} + +// Start returns the AlwaysMatch start state +func (m *AlwaysMatch) Start() int { + return 0 +} + +// IsMatch always returns true +func (m *AlwaysMatch) IsMatch(int) bool { + return true +} + +// CanMatch always returns true +func (m *AlwaysMatch) CanMatch(int) bool { + return true +} + +// WillAlwaysMatch always returns true +func (m *AlwaysMatch) WillAlwaysMatch(int) bool { + return true +} + +// Accept returns the next AlwaysMatch state +func (m *AlwaysMatch) Accept(int, byte) int { + return 0 +} + +// creating an alwaysMatchAutomaton to avoid unnecessary repeated allocations. +var alwaysMatchAutomaton = &AlwaysMatch{} diff --git a/vendor/github.com/m3dbx/vellum/builder.go b/vendor/github.com/m3dbx/vellum/builder.go new file mode 100644 index 00000000..4a515491 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/builder.go @@ -0,0 +1,508 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +import ( + "bytes" + "io" +) + +var defaultBuilderOpts = &BuilderOpts{ + Encoder: 1, + RegistryTableSize: 10000, + RegistryMRUSize: 2, + UnfinishedNodesStackSize: 64, + BuilderNodePoolingConfig: BuilderNodePoolingConfig{ + MaxSize: 10000, + MaxTransitionSize: 100, + }, +} + +// A Builder is used to build a new FST. When possible data is +// streamed out to the underlying Writer as soon as possible. +type Builder struct { + unfinished *unfinishedNodes + registry *registry + last []byte + len int + + lastAddr int + + encoder encoder + opts *BuilderOpts + + builderNodePool *builderNodePool +} + +const noneAddr = 1 +const emptyAddr = 0 + +// NewBuilder returns a new Builder which will stream out the +// underlying representation to the provided Writer as the set is built. +func newBuilder(w io.Writer, opts *BuilderOpts) (*Builder, error) { + if opts == nil { + opts = defaultBuilderOpts + } + + builderNodePool := newBuilderNodePool(opts.BuilderNodePoolingConfig) + rv := &Builder{ + unfinished: newUnfinishedNodes(builderNodePool, opts), + registry: newRegistry(builderNodePool, opts.RegistryTableSize, opts.RegistryMRUSize), + builderNodePool: builderNodePool, + opts: opts, + lastAddr: noneAddr, + } + + var err error + rv.encoder, err = loadEncoder(opts.Encoder, w) + if err != nil { + return nil, err + } + err = rv.encoder.start() + if err != nil { + return nil, err + } + return rv, nil +} + +func (b *Builder) Reset(w io.Writer) error { + b.unfinished.Reset() + b.registry.Reset() + b.lastAddr = noneAddr + b.encoder.reset(w) + b.last = nil + b.len = 0 + + err := b.encoder.start() + if err != nil { + return err + } + + return nil +} + +// Insert the provided value to the set being built. +// NOTE: values must be inserted in lexicographical order. +func (b *Builder) Insert(key []byte, val uint64) error { + // ensure items are added in lexicographic order + if bytes.Compare(key, b.last) < 0 { + return ErrOutOfOrder + } + if len(key) == 0 { + b.len = 1 + b.unfinished.setRootOutput(val) + return nil + } + + prefixLen, out := b.unfinished.findCommonPrefixAndSetOutput(key, val) + b.len++ + err := b.compileFrom(prefixLen) + if err != nil { + return err + } + b.copyLastKey(key) + b.unfinished.addSuffix(key[prefixLen:], out) + + return nil +} + +func (b *Builder) copyLastKey(key []byte) { + if b.last == nil { + b.last = make([]byte, 0, 64) + } else { + b.last = b.last[:0] + } + b.last = append(b.last, key...) +} + +// Close MUST be called after inserting all values. +func (b *Builder) Close() error { + err := b.compileFrom(0) + if err != nil { + return err + } + root := b.unfinished.popEmpty() + rootAddr, err := b.compile(root) + if err != nil { + return err + } + return b.encoder.finish(b.len, rootAddr) +} + +func (b *Builder) compileFrom(iState int) error { + addr := noneAddr + for iState+1 < len(b.unfinished.stack) { + var node *builderNode + if addr == noneAddr { + node = b.unfinished.popEmpty() + } else { + node = b.unfinished.popFreeze(addr) + } + var err error + addr, err = b.compile(node) + if err != nil { + return nil + } + } + b.unfinished.topLastFreeze(addr) + return nil +} + +func (b *Builder) compile(node *builderNode) (int, error) { + if node.final && len(node.trans) == 0 && + node.finalOutput == 0 { + // We're done with this node so its safe to put it back in the pool. + b.builderNodePool.Put(node) + return 0, nil + } + found, addr, entry := b.registry.entry(node) + if found { + // This node already existed in the registry (and thus the registry + // did not assume ownership of it) so its safe to put it back in + // the pool. + b.builderNodePool.Put(node) + return addr, nil + } + // If the node was not found in the registry, then the registry will + // have assumed ownership of it and is responsible for returning it + // to the pool (assuming the registry is not configured with size 0). + + addr, err := b.encoder.encodeState(node, b.lastAddr) + if err != nil { + return 0, err + } + + b.lastAddr = addr + // Entry can be nil when the registry table if configured to be size zero, so + // even if the registry should have taken ownership of the node and returned + // an entry, it will have no room to do so and will return a nil entry. + if entry != nil { + entry.addr = addr + } else { + // Safe to pool because the registry didn't create an entry for the node which + // means it didn't take ownership. + b.builderNodePool.Put(node) + } + return addr, nil +} + +type unfinishedNodes struct { + stack []*builderNodeUnfinished + + // cache allocates a reasonable number of builderNodeUnfinished + // objects up front and tries to keep reusing them + // because the main data structure is a stack, we assume the + // same access pattern, and don't track items separately + // this means calls get() and pushXYZ() must be paired, + // as well as calls put() and popXYZ() + cache []builderNodeUnfinished + + builderNodePool *builderNodePool +} + +func (u *unfinishedNodes) Reset() { + u.stack = u.stack[:0] + for i := 0; i < len(u.cache); i++ { + u.cache[i] = builderNodeUnfinished{} + } + u.pushEmpty(false) +} + +func newUnfinishedNodes(builderNodePool *builderNodePool, opts *BuilderOpts) *unfinishedNodes { + initialSize := opts.UnfinishedNodesStackSize + if initialSize <= 0 { + initialSize = defaultBuilderOpts.UnfinishedNodesStackSize + } + rv := &unfinishedNodes{ + stack: make([]*builderNodeUnfinished, 0, initialSize), + cache: make([]builderNodeUnfinished, initialSize), + builderNodePool: builderNodePool, + } + rv.pushEmpty(false) + return rv +} + +// get new builderNodeUnfinished, reusing cache if possible +func (u *unfinishedNodes) get() *builderNodeUnfinished { + if len(u.stack) < len(u.cache) { + return &u.cache[len(u.stack)] + } + // full now allocate a new one + return &builderNodeUnfinished{} +} + +// return builderNodeUnfinished, clearing it for reuse +func (u *unfinishedNodes) put() { + if len(u.stack) >= len(u.cache) { + return + // do nothing, not part of cache + } + u.cache[len(u.stack)] = builderNodeUnfinished{} +} + +func (u *unfinishedNodes) findCommonPrefixAndSetOutput(key []byte, + out uint64) (int, uint64) { + var i int + for i < len(key) { + if i >= len(u.stack) { + break + } + var addPrefix uint64 + if !u.stack[i].hasLastT { + break + } + if u.stack[i].lastIn == key[i] { + commonPre := outputPrefix(u.stack[i].lastOut, out) + addPrefix = outputSub(u.stack[i].lastOut, commonPre) + out = outputSub(out, commonPre) + u.stack[i].lastOut = commonPre + i++ + } else { + break + } + + if addPrefix != 0 { + u.stack[i].addOutputPrefix(addPrefix) + } + } + + return i, out +} + +func (u *unfinishedNodes) pushEmpty(final bool) { + next := u.get() + next.node = u.builderNodePool.Get() + next.node.final = final + u.stack = append(u.stack, next) +} + +func (u *unfinishedNodes) popRoot() *builderNode { + l := len(u.stack) + var unfinished *builderNodeUnfinished + u.stack, unfinished = u.stack[:l-1], u.stack[l-1] + rv := unfinished.node + u.put() + return rv +} + +func (u *unfinishedNodes) popFreeze(addr int) *builderNode { + l := len(u.stack) + var unfinished *builderNodeUnfinished + u.stack, unfinished = u.stack[:l-1], u.stack[l-1] + unfinished.lastCompiled(addr) + rv := unfinished.node + u.put() + return rv +} + +func (u *unfinishedNodes) popEmpty() *builderNode { + l := len(u.stack) + var unfinished *builderNodeUnfinished + u.stack, unfinished = u.stack[:l-1], u.stack[l-1] + rv := unfinished.node + u.put() + return rv +} + +func (u *unfinishedNodes) setRootOutput(out uint64) { + u.stack[0].node.final = true + u.stack[0].node.finalOutput = out +} + +func (u *unfinishedNodes) topLastFreeze(addr int) { + last := len(u.stack) - 1 + u.stack[last].lastCompiled(addr) +} + +func (u *unfinishedNodes) addSuffix(bs []byte, out uint64) { + if len(bs) == 0 { + return + } + last := len(u.stack) - 1 + u.stack[last].hasLastT = true + u.stack[last].lastIn = bs[0] + u.stack[last].lastOut = out + for _, b := range bs[1:] { + next := u.get() + next.node = u.builderNodePool.Get() + next.hasLastT = true + next.lastIn = b + next.lastOut = 0 + u.stack = append(u.stack, next) + } + u.pushEmpty(true) +} + +type builderNodeUnfinished struct { + node *builderNode + lastOut uint64 + lastIn byte + hasLastT bool +} + +func (b *builderNodeUnfinished) lastCompiled(addr int) { + if b.hasLastT { + transIn := b.lastIn + transOut := b.lastOut + b.hasLastT = false + b.lastOut = 0 + b.node.trans = append(b.node.trans, transition{ + in: transIn, + out: transOut, + addr: addr, + }) + } +} + +func (b *builderNodeUnfinished) addOutputPrefix(prefix uint64) { + if b.node.final { + b.node.finalOutput = outputCat(prefix, b.node.finalOutput) + } + for i := range b.node.trans { + b.node.trans[i].out = outputCat(prefix, b.node.trans[i].out) + } + if b.hasLastT { + b.lastOut = outputCat(prefix, b.lastOut) + } +} + +type builderNode struct { + finalOutput uint64 + trans []transition + final bool + + // intrusive linked list + next *builderNode +} + +// reset resets the receiver builderNode to a re-usable state. +func (n *builderNode) reset() { + n.final = false + n.finalOutput = 0 + for i := range n.trans { + n.trans[i] = emptyTransition + } + n.trans = n.trans[:0] + n.next = nil +} + +func (n *builderNode) equiv(o *builderNode) bool { + if n.final != o.final { + return false + } + if n.finalOutput != o.finalOutput { + return false + } + if len(n.trans) != len(o.trans) { + return false + } + for i, ntrans := range n.trans { + otrans := o.trans[i] + if ntrans.in != otrans.in { + return false + } + if ntrans.addr != otrans.addr { + return false + } + if ntrans.out != otrans.out { + return false + } + } + return true +} + +var emptyTransition = transition{} + +type transition struct { + out uint64 + addr int + in byte +} + +func outputPrefix(l, r uint64) uint64 { + if l < r { + return l + } + return r +} + +func outputSub(l, r uint64) uint64 { + return l - r +} + +func outputCat(l, r uint64) uint64 { + return l + r +} + +// BuilderNodePoolingConfig is the configuration struct for the BuilderNodePool. +// Note that unsafe.SizeOf(transition{}) is 24 bytes and unsafe.SizeOf(BuilderNode{}) +// is 48 bytes so the amount of memory used by the pool should be approximately +// MaxSize * (48 + 24 * MaxTransitionSize) not including the extra space required +// by the G.C. +type BuilderNodePoolingConfig struct { + // Maximum number of builder nodes can be retained in the pool. + MaxSize int + // Maximum size of the transitions array for an individual builder node. + MaxTransitionSize int +} + +// builderNodePool pools builderNodes using a singly linked list. +// +// The lifecycle is as follows: +// +// 1. Builder retrieves a node from the pool using Get() whenever it needs one. +// 2. After a node is compiled it is either: +// a. Discarded and immediately returned to the pool. +// b. Transferred to the registry (which assumes ownership of it) and will +// return it to the pool when it evicts the node to make room for another, +// or when the entire registry is Reset(). +type builderNodePool struct { + config BuilderNodePoolingConfig + size int + head *builderNode +} + +func newBuilderNodePool(config BuilderNodePoolingConfig) *builderNodePool { + // Pool will lazy alloc. + return &builderNodePool{ + config: config, + } +} + +func (p *builderNodePool) Get() *builderNode { + if p.head == nil { + return &builderNode{ + trans: make([]transition, 0, 10), + } + } + head := p.head + p.head = p.head.next + p.size-- + return head +} + +func (p *builderNodePool) Put(v *builderNode) { + if v == nil || + p.size >= p.config.MaxSize || + cap(v.trans) > p.config.MaxTransitionSize { + // Don't store nil or allow the pool to violate its config. + return + } + + v.reset() + v.next = p.head + p.head = v + p.size++ +} diff --git a/vendor/github.com/m3dbx/vellum/common.go b/vendor/github.com/m3dbx/vellum/common.go new file mode 100644 index 00000000..cd3e6a0d --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/common.go @@ -0,0 +1,547 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +const maxCommon = 1<<6 - 1 + +func encodeCommon(in byte) byte { + val := byte((int(commonInputs[in]) + 1) % 256) + if val > maxCommon { + return 0 + } + return val +} + +func decodeCommon(in byte) byte { + return commonInputsInv[in-1] +} + +var commonInputs = []byte{ + 84, // '\x00' + 85, // '\x01' + 86, // '\x02' + 87, // '\x03' + 88, // '\x04' + 89, // '\x05' + 90, // '\x06' + 91, // '\x07' + 92, // '\x08' + 93, // '\t' + 94, // '\n' + 95, // '\x0b' + 96, // '\x0c' + 97, // '\r' + 98, // '\x0e' + 99, // '\x0f' + 100, // '\x10' + 101, // '\x11' + 102, // '\x12' + 103, // '\x13' + 104, // '\x14' + 105, // '\x15' + 106, // '\x16' + 107, // '\x17' + 108, // '\x18' + 109, // '\x19' + 110, // '\x1a' + 111, // '\x1b' + 112, // '\x1c' + 113, // '\x1d' + 114, // '\x1e' + 115, // '\x1f' + 116, // ' ' + 80, // '!' + 117, // '"' + 118, // '#' + 79, // '$' + 39, // '%' + 30, // '&' + 81, // "'" + 75, // '(' + 74, // ')' + 82, // '*' + 57, // '+' + 66, // ',' + 16, // '-' + 12, // '.' + 2, // '/' + 19, // '0' + 20, // '1' + 21, // '2' + 27, // '3' + 32, // '4' + 29, // '5' + 35, // '6' + 36, // '7' + 37, // '8' + 34, // '9' + 24, // ':' + 73, // ';' + 119, // '<' + 23, // '=' + 120, // '>' + 40, // '?' + 83, // '@' + 44, // 'A' + 48, // 'B' + 42, // 'C' + 43, // 'D' + 49, // 'E' + 46, // 'F' + 62, // 'G' + 61, // 'H' + 47, // 'I' + 69, // 'J' + 68, // 'K' + 58, // 'L' + 56, // 'M' + 55, // 'N' + 59, // 'O' + 51, // 'P' + 72, // 'Q' + 54, // 'R' + 45, // 'S' + 52, // 'T' + 64, // 'U' + 65, // 'V' + 63, // 'W' + 71, // 'X' + 67, // 'Y' + 70, // 'Z' + 77, // '[' + 121, // '\\' + 78, // ']' + 122, // '^' + 31, // '_' + 123, // '`' + 4, // 'a' + 25, // 'b' + 9, // 'c' + 17, // 'd' + 1, // 'e' + 26, // 'f' + 22, // 'g' + 13, // 'h' + 7, // 'i' + 50, // 'j' + 38, // 'k' + 14, // 'l' + 15, // 'm' + 10, // 'n' + 3, // 'o' + 8, // 'p' + 60, // 'q' + 6, // 'r' + 5, // 's' + 0, // 't' + 18, // 'u' + 33, // 'v' + 11, // 'w' + 41, // 'x' + 28, // 'y' + 53, // 'z' + 124, // '{' + 125, // '|' + 126, // '}' + 76, // '~' + 127, // '\x7f' + 128, // '\x80' + 129, // '\x81' + 130, // '\x82' + 131, // '\x83' + 132, // '\x84' + 133, // '\x85' + 134, // '\x86' + 135, // '\x87' + 136, // '\x88' + 137, // '\x89' + 138, // '\x8a' + 139, // '\x8b' + 140, // '\x8c' + 141, // '\x8d' + 142, // '\x8e' + 143, // '\x8f' + 144, // '\x90' + 145, // '\x91' + 146, // '\x92' + 147, // '\x93' + 148, // '\x94' + 149, // '\x95' + 150, // '\x96' + 151, // '\x97' + 152, // '\x98' + 153, // '\x99' + 154, // '\x9a' + 155, // '\x9b' + 156, // '\x9c' + 157, // '\x9d' + 158, // '\x9e' + 159, // '\x9f' + 160, // '\xa0' + 161, // '¡' + 162, // '¢' + 163, // '£' + 164, // '¤' + 165, // '¥' + 166, // '¦' + 167, // '§' + 168, // '¨' + 169, // '©' + 170, // 'ª' + 171, // '«' + 172, // '¬' + 173, // '\xad' + 174, // '®' + 175, // '¯' + 176, // '°' + 177, // '±' + 178, // '²' + 179, // '³' + 180, // '´' + 181, // 'µ' + 182, // '¶' + 183, // '·' + 184, // '¸' + 185, // '¹' + 186, // 'º' + 187, // '»' + 188, // '¼' + 189, // '½' + 190, // '¾' + 191, // '¿' + 192, // 'À' + 193, // 'Á' + 194, // 'Â' + 195, // 'Ã' + 196, // 'Ä' + 197, // 'Å' + 198, // 'Æ' + 199, // 'Ç' + 200, // 'È' + 201, // 'É' + 202, // 'Ê' + 203, // 'Ë' + 204, // 'Ì' + 205, // 'Í' + 206, // 'Î' + 207, // 'Ï' + 208, // 'Ð' + 209, // 'Ñ' + 210, // 'Ò' + 211, // 'Ó' + 212, // 'Ô' + 213, // 'Õ' + 214, // 'Ö' + 215, // '×' + 216, // 'Ø' + 217, // 'Ù' + 218, // 'Ú' + 219, // 'Û' + 220, // 'Ü' + 221, // 'Ý' + 222, // 'Þ' + 223, // 'ß' + 224, // 'à' + 225, // 'á' + 226, // 'â' + 227, // 'ã' + 228, // 'ä' + 229, // 'å' + 230, // 'æ' + 231, // 'ç' + 232, // 'è' + 233, // 'é' + 234, // 'ê' + 235, // 'ë' + 236, // 'ì' + 237, // 'í' + 238, // 'î' + 239, // 'ï' + 240, // 'ð' + 241, // 'ñ' + 242, // 'ò' + 243, // 'ó' + 244, // 'ô' + 245, // 'õ' + 246, // 'ö' + 247, // '÷' + 248, // 'ø' + 249, // 'ù' + 250, // 'ú' + 251, // 'û' + 252, // 'ü' + 253, // 'ý' + 254, // 'þ' + 255, // 'ÿ' +} + +var commonInputsInv = []byte{ + 't', + 'e', + '/', + 'o', + 'a', + 's', + 'r', + 'i', + 'p', + 'c', + 'n', + 'w', + '.', + 'h', + 'l', + 'm', + '-', + 'd', + 'u', + '0', + '1', + '2', + 'g', + '=', + ':', + 'b', + 'f', + '3', + 'y', + '5', + '&', + '_', + '4', + 'v', + '9', + '6', + '7', + '8', + 'k', + '%', + '?', + 'x', + 'C', + 'D', + 'A', + 'S', + 'F', + 'I', + 'B', + 'E', + 'j', + 'P', + 'T', + 'z', + 'R', + 'N', + 'M', + '+', + 'L', + 'O', + 'q', + 'H', + 'G', + 'W', + 'U', + 'V', + ',', + 'Y', + 'K', + 'J', + 'Z', + 'X', + 'Q', + ';', + ')', + '(', + '~', + '[', + ']', + '$', + '!', + '\'', + '*', + '@', + '\x00', + '\x01', + '\x02', + '\x03', + '\x04', + '\x05', + '\x06', + '\x07', + '\x08', + '\t', + '\n', + '\x0b', + '\x0c', + '\r', + '\x0e', + '\x0f', + '\x10', + '\x11', + '\x12', + '\x13', + '\x14', + '\x15', + '\x16', + '\x17', + '\x18', + '\x19', + '\x1a', + '\x1b', + '\x1c', + '\x1d', + '\x1e', + '\x1f', + ' ', + '"', + '#', + '<', + '>', + '\\', + '^', + '`', + '{', + '|', + '}', + '\x7f', + '\x80', + '\x81', + '\x82', + '\x83', + '\x84', + '\x85', + '\x86', + '\x87', + '\x88', + '\x89', + '\x8a', + '\x8b', + '\x8c', + '\x8d', + '\x8e', + '\x8f', + '\x90', + '\x91', + '\x92', + '\x93', + '\x94', + '\x95', + '\x96', + '\x97', + '\x98', + '\x99', + '\x9a', + '\x9b', + '\x9c', + '\x9d', + '\x9e', + '\x9f', + '\xa0', + '\xa1', + '\xa2', + '\xa3', + '\xa4', + '\xa5', + '\xa6', + '\xa7', + '\xa8', + '\xa9', + '\xaa', + '\xab', + '\xac', + '\xad', + '\xae', + '\xaf', + '\xb0', + '\xb1', + '\xb2', + '\xb3', + '\xb4', + '\xb5', + '\xb6', + '\xb7', + '\xb8', + '\xb9', + '\xba', + '\xbb', + '\xbc', + '\xbd', + '\xbe', + '\xbf', + '\xc0', + '\xc1', + '\xc2', + '\xc3', + '\xc4', + '\xc5', + '\xc6', + '\xc7', + '\xc8', + '\xc9', + '\xca', + '\xcb', + '\xcc', + '\xcd', + '\xce', + '\xcf', + '\xd0', + '\xd1', + '\xd2', + '\xd3', + '\xd4', + '\xd5', + '\xd6', + '\xd7', + '\xd8', + '\xd9', + '\xda', + '\xdb', + '\xdc', + '\xdd', + '\xde', + '\xdf', + '\xe0', + '\xe1', + '\xe2', + '\xe3', + '\xe4', + '\xe5', + '\xe6', + '\xe7', + '\xe8', + '\xe9', + '\xea', + '\xeb', + '\xec', + '\xed', + '\xee', + '\xef', + '\xf0', + '\xf1', + '\xf2', + '\xf3', + '\xf4', + '\xf5', + '\xf6', + '\xf7', + '\xf8', + '\xf9', + '\xfa', + '\xfb', + '\xfc', + '\xfd', + '\xfe', + '\xff', +} diff --git a/vendor/github.com/m3dbx/vellum/decoder_v1.go b/vendor/github.com/m3dbx/vellum/decoder_v1.go new file mode 100644 index 00000000..d56e61db --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/decoder_v1.go @@ -0,0 +1,314 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +import ( + "bytes" + "encoding/binary" + "fmt" + "strconv" +) + +func init() { + registerDecoder(versionV1, func(data []byte) decoder { + return newDecoderV1(data) + }) +} + +type decoderV1 struct { + data []byte +} + +func newDecoderV1(data []byte) *decoderV1 { + return &decoderV1{ + data: data, + } +} + +func (d *decoderV1) getRoot() int { + if len(d.data) < footerSizeV1 { + return noneAddr + } + footer := d.data[len(d.data)-footerSizeV1:] + root := binary.LittleEndian.Uint64(footer[8:]) + return int(root) +} + +func (d *decoderV1) getLen() int { + if len(d.data) < footerSizeV1 { + return 0 + } + footer := d.data[len(d.data)-footerSizeV1:] + dlen := binary.LittleEndian.Uint64(footer) + return int(dlen) +} + +func (d *decoderV1) stateAt(addr int, prealloc fstState) (fstState, error) { + state, ok := prealloc.(*fstStateV1) + if ok && state != nil { + *state = fstStateV1{} // clear the struct + } else { + state = &fstStateV1{} + } + err := state.at(d.data, addr) + if err != nil { + return nil, err + } + return state, nil +} + +type fstStateV1 struct { + data []byte + top int + bottom int + numTrans int + + // single trans only + singleTransChar byte + singleTransNext bool + singleTransAddr uint64 + singleTransOut uint64 + + // shared + transSize int + outSize int + + // multiple trans only + final bool + transTop int + transBottom int + destTop int + destBottom int + outTop int + outBottom int + outFinal int +} + +func (f *fstStateV1) isEncodedSingle() bool { + if f.data[f.top]>>7 > 0 { + return true + } + return false +} + +func (f *fstStateV1) at(data []byte, addr int) error { + f.data = data + if addr == emptyAddr { + return f.atZero() + } else if addr == noneAddr { + return f.atNone() + } + if addr > len(data) || addr < 16 { + return fmt.Errorf("invalid address %d/%d", addr, len(data)) + } + f.top = addr + f.bottom = addr + if f.isEncodedSingle() { + return f.atSingle(data, addr) + } + return f.atMulti(data, addr) +} + +func (f *fstStateV1) atZero() error { + f.top = 0 + f.bottom = 1 + f.numTrans = 0 + f.final = true + f.outFinal = 0 + return nil +} + +func (f *fstStateV1) atNone() error { + f.top = 0 + f.bottom = 1 + f.numTrans = 0 + f.final = false + f.outFinal = 0 + return nil +} + +func (f *fstStateV1) atSingle(data []byte, addr int) error { + // handle single transition case + f.numTrans = 1 + f.singleTransNext = data[f.top]&transitionNext > 0 + f.singleTransChar = data[f.top] & maxCommon + if f.singleTransChar == 0 { + f.bottom-- // extra byte for uncommon + f.singleTransChar = data[f.bottom] + } else { + f.singleTransChar = decodeCommon(f.singleTransChar) + } + if f.singleTransNext { + // now we know the bottom, can compute next addr + f.singleTransAddr = uint64(f.bottom - 1) + f.singleTransOut = 0 + } else { + f.bottom-- // extra byte with pack sizes + f.transSize, f.outSize = decodePackSize(data[f.bottom]) + f.bottom -= f.transSize // exactly one trans + f.singleTransAddr = readPackedUint(data[f.bottom : f.bottom+f.transSize]) + if f.outSize > 0 { + f.bottom -= f.outSize // exactly one out (could be length 0 though) + f.singleTransOut = readPackedUint(data[f.bottom : f.bottom+f.outSize]) + } else { + f.singleTransOut = 0 + } + // need to wait till we know bottom + if f.singleTransAddr != 0 { + f.singleTransAddr = uint64(f.bottom) - f.singleTransAddr + } + } + return nil +} + +func (f *fstStateV1) atMulti(data []byte, addr int) error { + // handle multiple transitions case + f.final = data[f.top]&stateFinal > 0 + f.numTrans = int(data[f.top] & maxNumTrans) + if f.numTrans == 0 { + f.bottom-- // extra byte for number of trans + f.numTrans = int(data[f.bottom]) + if f.numTrans == 1 { + // can't really be 1 here, this is special case that means 256 + f.numTrans = 256 + } + } + f.bottom-- // extra byte with pack sizes + f.transSize, f.outSize = decodePackSize(data[f.bottom]) + + f.transTop = f.bottom + f.bottom -= f.numTrans // one byte for each transition + f.transBottom = f.bottom + + f.destTop = f.bottom + f.bottom -= f.numTrans * f.transSize + f.destBottom = f.bottom + + if f.outSize > 0 { + f.outTop = f.bottom + f.bottom -= f.numTrans * f.outSize + f.outBottom = f.bottom + if f.final { + f.bottom -= f.outSize + f.outFinal = f.bottom + } + } + return nil +} + +func (f *fstStateV1) Address() int { + return f.top +} + +func (f *fstStateV1) Final() bool { + return f.final +} + +func (f *fstStateV1) FinalOutput() uint64 { + if f.final && f.outSize > 0 { + return readPackedUint(f.data[f.outFinal : f.outFinal+f.outSize]) + } + return 0 +} + +func (f *fstStateV1) NumTransitions() int { + return f.numTrans +} + +func (f *fstStateV1) TransitionAt(i int) byte { + if f.isEncodedSingle() { + return f.singleTransChar + } + transitionKeys := f.data[f.transBottom:f.transTop] + return transitionKeys[f.numTrans-i-1] +} + +func (f *fstStateV1) TransitionFor(b byte) (int, int, uint64) { + if f.isEncodedSingle() { + if f.singleTransChar == b { + return 0, int(f.singleTransAddr), f.singleTransOut + } + return -1, noneAddr, 0 + } + transitionKeys := f.data[f.transBottom:f.transTop] + pos := bytes.IndexByte(transitionKeys, b) + if pos < 0 { + return -1, noneAddr, 0 + } + transDests := f.data[f.destBottom:f.destTop] + dest := int(readPackedUint(transDests[pos*f.transSize : pos*f.transSize+f.transSize])) + if dest > 0 { + // convert delta + dest = f.bottom - dest + } + transVals := f.data[f.outBottom:f.outTop] + var out uint64 + if f.outSize > 0 { + out = readPackedUint(transVals[pos*f.outSize : pos*f.outSize+f.outSize]) + } + return f.numTrans - pos - 1, dest, out +} + +func (f *fstStateV1) String() string { + rv := "" + rv += fmt.Sprintf("State: %d (%#x)", f.top, f.top) + if f.final { + rv += " final" + fout := f.FinalOutput() + if fout != 0 { + rv += fmt.Sprintf(" (%d)", fout) + } + } + rv += "\n" + rv += fmt.Sprintf("Data: % x\n", f.data[f.bottom:f.top+1]) + + for i := 0; i < f.numTrans; i++ { + transChar := f.TransitionAt(i) + _, transDest, transOut := f.TransitionFor(transChar) + rv += fmt.Sprintf(" - %d (%#x) '%s' ---> %d (%#x) with output: %d", transChar, transChar, string(transChar), transDest, transDest, transOut) + rv += "\n" + } + if f.numTrans == 0 { + rv += "\n" + } + return rv +} + +func (f *fstStateV1) DotString(num int) string { + rv := "" + label := fmt.Sprintf("%d", num) + final := "" + if f.final { + final = ",peripheries=2" + } + rv += fmt.Sprintf(" %d [label=\"%s\"%s];\n", f.top, label, final) + + for i := 0; i < f.numTrans; i++ { + transChar := f.TransitionAt(i) + _, transDest, transOut := f.TransitionFor(transChar) + out := "" + if transOut != 0 { + out = fmt.Sprintf("/%d", transOut) + } + rv += fmt.Sprintf(" %d -> %d [label=\"%s%s\"];\n", f.top, transDest, escapeInput(transChar), out) + } + + return rv +} + +func escapeInput(b byte) string { + x := strconv.AppendQuoteRune(nil, rune(b)) + return string(x[1:(len(x) - 1)]) +} diff --git a/vendor/github.com/m3dbx/vellum/encoder_v1.go b/vendor/github.com/m3dbx/vellum/encoder_v1.go new file mode 100644 index 00000000..0651fc86 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/encoder_v1.go @@ -0,0 +1,227 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +import ( + "encoding/binary" + "fmt" + "io" +) + +const versionV1 = 1 +const oneTransition = 1 << 7 +const transitionNext = 1 << 6 +const stateFinal = 1 << 6 +const footerSizeV1 = 16 + +func init() { + registerEncoder(versionV1, func(w io.Writer) encoder { + return newEncoderV1(w) + }) +} + +type encoderV1 struct { + bw *writer +} + +func newEncoderV1(w io.Writer) *encoderV1 { + return &encoderV1{ + bw: newWriter(w), + } +} + +func (e *encoderV1) reset(w io.Writer) { + e.bw.Reset(w) +} + +func (e *encoderV1) start() error { + header := make([]byte, headerSize) + binary.LittleEndian.PutUint64(header, versionV1) + binary.LittleEndian.PutUint64(header[8:], uint64(0)) // type + n, err := e.bw.Write(header) + if err != nil { + return err + } + if n != headerSize { + return fmt.Errorf("short write of header %d/%d", n, headerSize) + } + return nil +} + +func (e *encoderV1) encodeState(s *builderNode, lastAddr int) (int, error) { + if len(s.trans) == 0 && s.final && s.finalOutput == 0 { + return 0, nil + } else if len(s.trans) != 1 || s.final { + return e.encodeStateMany(s) + } else if !s.final && s.trans[0].out == 0 && s.trans[0].addr == lastAddr { + return e.encodeStateOneFinish(s, transitionNext) + } + return e.encodeStateOne(s) +} + +func (e *encoderV1) encodeStateOne(s *builderNode) (int, error) { + start := uint64(e.bw.counter) + outPackSize := 0 + if s.trans[0].out != 0 { + outPackSize = packedSize(s.trans[0].out) + err := e.bw.WritePackedUintIn(s.trans[0].out, outPackSize) + if err != nil { + return 0, err + } + } + delta := deltaAddr(start, uint64(s.trans[0].addr)) + transPackSize := packedSize(delta) + err := e.bw.WritePackedUintIn(delta, transPackSize) + if err != nil { + return 0, err + } + + packSize := encodePackSize(transPackSize, outPackSize) + err = e.bw.WriteByte(packSize) + if err != nil { + return 0, err + } + + return e.encodeStateOneFinish(s, 0) +} + +func (e *encoderV1) encodeStateOneFinish(s *builderNode, next byte) (int, error) { + enc := encodeCommon(s.trans[0].in) + + // not a common input + if enc == 0 { + err := e.bw.WriteByte(s.trans[0].in) + if err != nil { + return 0, err + } + } + err := e.bw.WriteByte(oneTransition | next | enc) + if err != nil { + return 0, err + } + + return e.bw.counter - 1, nil +} + +func (e *encoderV1) encodeStateMany(s *builderNode) (int, error) { + start := uint64(e.bw.counter) + transPackSize := 0 + outPackSize := packedSize(s.finalOutput) + anyOutputs := s.finalOutput != 0 + for i := range s.trans { + delta := deltaAddr(start, uint64(s.trans[i].addr)) + tsize := packedSize(delta) + if tsize > transPackSize { + transPackSize = tsize + } + osize := packedSize(s.trans[i].out) + if osize > outPackSize { + outPackSize = osize + } + anyOutputs = anyOutputs || s.trans[i].out != 0 + } + if !anyOutputs { + outPackSize = 0 + } + + if anyOutputs { + // output final value + if s.final { + err := e.bw.WritePackedUintIn(s.finalOutput, outPackSize) + if err != nil { + return 0, err + } + } + // output transition values (in reverse) + for j := len(s.trans) - 1; j >= 0; j-- { + err := e.bw.WritePackedUintIn(s.trans[j].out, outPackSize) + if err != nil { + return 0, err + } + } + } + + // output transition dests (in reverse) + for j := len(s.trans) - 1; j >= 0; j-- { + delta := deltaAddr(start, uint64(s.trans[j].addr)) + err := e.bw.WritePackedUintIn(delta, transPackSize) + if err != nil { + return 0, err + } + } + + // output transition keys (in reverse) + for j := len(s.trans) - 1; j >= 0; j-- { + err := e.bw.WriteByte(s.trans[j].in) + if err != nil { + return 0, err + } + } + + packSize := encodePackSize(transPackSize, outPackSize) + err := e.bw.WriteByte(packSize) + if err != nil { + return 0, err + } + + numTrans := encodeNumTrans(len(s.trans)) + + // if number of transitions wont fit in edge header byte + // write out separately + if numTrans == 0 { + if len(s.trans) == 256 { + // this wouldn't fit in single byte, but reuse value 1 + // which would have always fit in the edge header instead + err = e.bw.WriteByte(1) + if err != nil { + return 0, err + } + } else { + err = e.bw.WriteByte(byte(len(s.trans))) + if err != nil { + return 0, err + } + } + } + + // finally write edge header + if s.final { + numTrans |= stateFinal + } + err = e.bw.WriteByte(numTrans) + if err != nil { + return 0, err + } + + return e.bw.counter - 1, nil +} + +func (e *encoderV1) finish(count, rootAddr int) error { + footer := make([]byte, footerSizeV1) + binary.LittleEndian.PutUint64(footer, uint64(count)) // root addr + binary.LittleEndian.PutUint64(footer[8:], uint64(rootAddr)) // root addr + n, err := e.bw.Write(footer) + if err != nil { + return err + } + if n != footerSizeV1 { + return fmt.Errorf("short write of footer %d/%d", n, footerSizeV1) + } + err = e.bw.Flush() + if err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/m3dbx/vellum/encoding.go b/vendor/github.com/m3dbx/vellum/encoding.go new file mode 100644 index 00000000..988d4864 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/encoding.go @@ -0,0 +1,87 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +import ( + "encoding/binary" + "fmt" + "io" +) + +const headerSize = 16 + +type encoderConstructor func(w io.Writer) encoder +type decoderConstructor func([]byte) decoder + +var encoders = map[int]encoderConstructor{} +var decoders = map[int]decoderConstructor{} + +type encoder interface { + start() error + encodeState(s *builderNode, addr int) (int, error) + finish(count, rootAddr int) error + reset(w io.Writer) +} + +func loadEncoder(ver int, w io.Writer) (encoder, error) { + if cons, ok := encoders[ver]; ok { + return cons(w), nil + } + return nil, fmt.Errorf("no encoder for version %d registered", ver) +} + +func registerEncoder(ver int, cons encoderConstructor) { + encoders[ver] = cons +} + +type decoder interface { + getRoot() int + getLen() int + stateAt(addr int, prealloc fstState) (fstState, error) +} + +func loadDecoder(ver int, data []byte) (decoder, error) { + if cons, ok := decoders[ver]; ok { + return cons(data), nil + } + return nil, fmt.Errorf("no decoder for version %d registered", ver) +} + +func registerDecoder(ver int, cons decoderConstructor) { + decoders[ver] = cons +} + +func decodeHeader(header []byte) (ver int, typ int, err error) { + if len(header) < headerSize { + err = fmt.Errorf("invalid header < 16 bytes") + return + } + ver = int(binary.LittleEndian.Uint64(header[0:8])) + typ = int(binary.LittleEndian.Uint64(header[8:16])) + return +} + +// fstState represents a state inside the FTS runtime +// It is the main contract between the FST impl and the decoder +// The FST impl should work only with this interface, while only the decoder +// impl knows the physical representation. +type fstState interface { + Address() int + Final() bool + FinalOutput() uint64 + NumTransitions() int + TransitionFor(b byte) (int, int, uint64) + TransitionAt(i int) byte +} diff --git a/vendor/github.com/m3dbx/vellum/fst.go b/vendor/github.com/m3dbx/vellum/fst.go new file mode 100644 index 00000000..3748b555 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/fst.go @@ -0,0 +1,294 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +import ( + "io" + + "github.com/willf/bitset" +) + +// FST is an in-memory representation of a finite state transducer, +// capable of returning the uint64 value associated with +// each []byte key stored, as well as enumerating all of the keys +// in order. +type FST struct { + f io.Closer + ver int + len int + typ int + data []byte + decoder decoder +} + +func new(data []byte, f io.Closer) (rv *FST, err error) { + rv = &FST{ + data: data, + f: f, + } + + rv.ver, rv.typ, err = decodeHeader(data) + if err != nil { + return nil, err + } + + rv.decoder, err = loadDecoder(rv.ver, rv.data) + if err != nil { + return nil, err + } + + rv.len = rv.decoder.getLen() + + return rv, nil +} + +// Contains returns true if this FST contains the specified key. +func (f *FST) Contains(val []byte) (bool, error) { + _, exists, err := f.Get(val) + return exists, err +} + +// Get returns the value associated with the key. NOTE: a value of zero +// does not imply the key does not exist, you must consult the second +// return value as well. +func (f *FST) Get(input []byte) (uint64, bool, error) { + return f.get(input, nil) +} + +func (f *FST) get(input []byte, prealloc fstState) (uint64, bool, error) { + var total uint64 + curr := f.decoder.getRoot() + state, err := f.decoder.stateAt(curr, prealloc) + if err != nil { + return 0, false, err + } + for _, c := range input { + _, curr, output := state.TransitionFor(c) + if curr == noneAddr { + return 0, false, nil + } + + state, err = f.decoder.stateAt(curr, state) + if err != nil { + return 0, false, err + } + + total += output + } + + if state.Final() { + total += state.FinalOutput() + return total, true, nil + } + return 0, false, nil +} + +// Version returns the encoding version used by this FST instance. +func (f *FST) Version() int { + return f.ver +} + +// Len returns the number of entries in this FST instance. +func (f *FST) Len() int { + return f.len +} + +// Type returns the type of this FST instance. +func (f *FST) Type() int { + return f.typ +} + +// Close will unmap any mmap'd data (if managed by vellum) and it will close +// the backing file (if managed by vellum). You MUST call Close() for any +// FST instance that is created. +func (f *FST) Close() error { + if f.f != nil { + err := f.f.Close() + if err != nil { + return err + } + } + f.data = nil + f.decoder = nil + return nil +} + +// Start returns the start state of this Automaton +func (f *FST) Start() int { + return f.decoder.getRoot() +} + +// IsMatch returns if this state is a matching state in this Automaton +func (f *FST) IsMatch(addr int) bool { + match, _ := f.IsMatchWithVal(addr) + return match +} + +// CanMatch returns if this state can ever transition to a matching state +// in this Automaton +func (f *FST) CanMatch(addr int) bool { + if addr == noneAddr { + return false + } + return true +} + +// WillAlwaysMatch returns if from this state the Automaton will always +// be in a matching state +func (f *FST) WillAlwaysMatch(int) bool { + return false +} + +// Accept returns the next state for this Automaton on input of byte b +func (f *FST) Accept(addr int, b byte) int { + next, _ := f.AcceptWithVal(addr, b) + return next +} + +// IsMatchWithVal returns if this state is a matching state in this Automaton +// and also returns the final output value for this state +func (f *FST) IsMatchWithVal(addr int) (bool, uint64) { + s, err := f.decoder.stateAt(addr, nil) + if err != nil { + return false, 0 + } + return s.Final(), s.FinalOutput() +} + +// AcceptWithVal returns the next state for this Automaton on input of byte b +// and also returns the output value for the transition +func (f *FST) AcceptWithVal(addr int, b byte) (int, uint64) { + s, err := f.decoder.stateAt(addr, nil) + if err != nil { + return noneAddr, 0 + } + _, next, output := s.TransitionFor(b) + return next, output +} + +// Iterator returns a new Iterator capable of enumerating the key/value pairs +// between the provided startKeyInclusive and endKeyExclusive. +func (f *FST) Iterator(startKeyInclusive, endKeyExclusive []byte) (*FSTIterator, error) { + return newIterator(f, startKeyInclusive, endKeyExclusive, nil) +} + +// Search returns a new Iterator capable of enumerating the key/value pairs +// between the provided startKeyInclusive and endKeyExclusive that also +// satisfy the provided automaton. +func (f *FST) Search(aut Automaton, startKeyInclusive, endKeyExclusive []byte) (*FSTIterator, error) { + return newIterator(f, startKeyInclusive, endKeyExclusive, aut) +} + +// Debug is only intended for debug purposes, it simply asks the underlying +// decoder visit each state, and pass it to the provided callback. +func (f *FST) Debug(callback func(int, interface{}) error) error { + + addr := f.decoder.getRoot() + set := bitset.New(uint(addr)) + stack := addrStack{addr} + + stateNumber := 0 + stack, addr = stack[:len(stack)-1], stack[len(stack)-1] + for addr != noneAddr { + if set.Test(uint(addr)) { + stack, addr = stack.Pop() + continue + } + set.Set(uint(addr)) + state, err := f.decoder.stateAt(addr, nil) + if err != nil { + return err + } + err = callback(stateNumber, state) + if err != nil { + return err + } + for i := 0; i < state.NumTransitions(); i++ { + tchar := state.TransitionAt(i) + _, dest, _ := state.TransitionFor(tchar) + stack = append(stack, dest) + } + stateNumber++ + stack, addr = stack.Pop() + } + + return nil +} + +type addrStack []int + +func (a addrStack) Pop() (addrStack, int) { + l := len(a) + if l < 1 { + return a, noneAddr + } + return a[:l-1], a[l-1] +} + +// Reader() returns a Reader instance that a single thread may use to +// retrieve data from the FST +func (f *FST) Reader() (*Reader, error) { + return &Reader{f: f}, nil +} + +func (f *FST) getMinMaxKey(comparator func(byte, byte) bool) ([]byte, error) { + var rv []byte + + curr := f.decoder.getRoot() + state, err := f.decoder.stateAt(curr, nil) + if err != nil { + return nil, err + } + + for !state.Final() { + lastTransition := state.TransitionAt(0) + numTransitions := state.NumTransitions() + for i := 1; i < numTransitions; i++ { + transition := state.TransitionAt(i) + if comparator(transition, lastTransition) { + lastTransition = transition + } + } + + _, curr, _ = state.TransitionFor(lastTransition) + state, err = f.decoder.stateAt(curr, state) + if err != nil { + return nil, err + } + + rv = append(rv, lastTransition) + } + + return rv, nil +} + +func (f *FST) GetMinKey() ([]byte, error) { + return f.getMinMaxKey(func (x byte, y byte) bool {return x < y}) +} + + +func (f *FST) GetMaxKey() ([]byte, error) { + return f.getMinMaxKey(func (x byte, y byte) bool {return x > y}) +} + +// A Reader is meant for a single threaded use +type Reader struct { + f *FST + prealloc fstStateV1 +} + +func (r *Reader) Get(input []byte) (uint64, bool, error) { + return r.f.get(input, &r.prealloc) +} diff --git a/vendor/github.com/m3dbx/vellum/fst_iterator.go b/vendor/github.com/m3dbx/vellum/fst_iterator.go new file mode 100644 index 00000000..2cf7180a --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/fst_iterator.go @@ -0,0 +1,311 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +import ( + "bytes" +) + +// Iterator represents a means of visity key/value pairs in order. +type Iterator interface { + + // Current() returns the key/value pair currently pointed to. + // The []byte of the key is ONLY guaranteed to be valid until + // another call to Next/Seek/Close. If you need it beyond that + // point you MUST make a copy. + Current() ([]byte, uint64) + + // Next() advances the iterator to the next key/value pair. + // If no more key/value pairs exist, ErrIteratorDone is returned. + Next() error + + // Seek() advances the iterator the specified key, or the next key + // if it does not exist. + // If no keys exist after that point, ErrIteratorDone is returned. + Seek(key []byte) error + + // Reset resets the Iterator' internal state to allow for iterator + // reuse (e.g. pooling). + Reset(f *FST, startKeyInclusive, endKeyExclusive []byte, aut Automaton) error + + // Close() frees any resources held by this iterator. + Close() error +} + +// FSTIterator is a structure for iterating key/value pairs in this FST in +// lexicographic order. Iterators should be constructed with the FSTIterator +// method on the parent FST structure. +type FSTIterator struct { + f *FST + aut Automaton + + cache fstIteratorCache + + startKeyInclusive []byte + endKeyExclusive []byte + + statesStack []fstState + keysStack []byte + keysPosStack []int + valsStack []uint64 + autStatesStack []int + + nextStart []byte +} + +type fstIteratorCache struct { + fstVersion int + states []fstState +} + +func newIterator(f *FST, startKeyInclusive, endKeyExclusive []byte, + aut Automaton) (*FSTIterator, error) { + + rv := &FSTIterator{} + err := rv.Reset(f, startKeyInclusive, endKeyExclusive, aut) + if err != nil { + return nil, err + } + return rv, nil +} + +// Reset resets the Iterator' internal state to allow for iterator +// reuse (e.g. pooling). +func (i *FSTIterator) Reset(f *FST, + startKeyInclusive, endKeyExclusive []byte, aut Automaton) error { + if aut == nil { + aut = alwaysMatchAutomaton + } + + i.f = f + i.startKeyInclusive = startKeyInclusive + i.endKeyExclusive = endKeyExclusive + i.aut = aut + i.resetCache() + + return i.pointTo(startKeyInclusive) +} + +func (i *FSTIterator) resetCache() { + newVersion := i.f.Version() + if newVersion != i.cache.fstVersion { + // Reset the cache if the version is different, states cannot + // be reused between different FST versions. + i.cache = fstIteratorCache{} + } + i.cache.fstVersion = newVersion +} + +func (i *FSTIterator) stateGet(addr int) (fstState, error) { + if len(i.cache.states) == 0 { + return i.f.decoder.stateAt(addr, nil) + } + cached := i.cache.states[len(i.cache.states)-1] + i.cache.states = i.cache.states[:len(i.cache.states)-1] + return i.f.decoder.stateAt(addr, cached) +} + +func (i *FSTIterator) statePut(state fstState) { + i.cache.states = append(i.cache.states, state) +} + +// pointTo attempts to point us to the specified location +func (i *FSTIterator) pointTo(key []byte) error { + // tried to seek before start + if bytes.Compare(key, i.startKeyInclusive) < 0 { + key = i.startKeyInclusive + } + + // tried to see past end + if i.endKeyExclusive != nil && + bytes.Compare(key, i.endKeyExclusive) > 0 { + key = i.endKeyExclusive + } + + // reset any state, pointTo always starts over + for j := range i.statesStack { + i.statesStack[j] = nil + } + i.statesStack = i.statesStack[:0] + i.keysStack = i.keysStack[:0] + i.keysPosStack = i.keysPosStack[:0] + i.valsStack = i.valsStack[:0] + i.autStatesStack = i.autStatesStack[:0] + + root, err := i.stateGet(i.f.decoder.getRoot()) + if err != nil { + return err + } + + autStart := i.aut.Start() + + maxQ := -1 + // root is always part of the path + i.statesStack = append(i.statesStack, root) + i.autStatesStack = append(i.autStatesStack, autStart) + for j := 0; j < len(key); j++ { + keyJ := key[j] + curr := i.statesStack[len(i.statesStack)-1] + autCurr := i.autStatesStack[len(i.autStatesStack)-1] + + pos, nextAddr, nextVal := curr.TransitionFor(keyJ) + if nextAddr == noneAddr { + // needed transition doesn't exist + // find last trans before the one we needed + for q := curr.NumTransitions() - 1; q >= 0; q-- { + if curr.TransitionAt(q) < keyJ { + maxQ = q + break + } + } + break + } + autNext := i.aut.Accept(autCurr, keyJ) + + next, err := i.stateGet(nextAddr) + if err != nil { + return err + } + + i.statesStack = append(i.statesStack, next) + i.keysStack = append(i.keysStack, keyJ) + i.keysPosStack = append(i.keysPosStack, pos) + i.valsStack = append(i.valsStack, nextVal) + i.autStatesStack = append(i.autStatesStack, autNext) + continue + } + + if !i.statesStack[len(i.statesStack)-1].Final() || + !i.aut.IsMatch(i.autStatesStack[len(i.autStatesStack)-1]) || + bytes.Compare(i.keysStack, key) < 0 { + return i.next(maxQ) + } + + return nil +} + +// Current returns the key and value currently pointed to by the iterator. +// If the iterator is not pointing at a valid value (because Iterator/Next/Seek) +// returned an error previously, it may return nil,0. +func (i *FSTIterator) Current() ([]byte, uint64) { + curr := i.statesStack[len(i.statesStack)-1] + if curr.Final() { + var total uint64 + for _, v := range i.valsStack { + total += v + } + total += curr.FinalOutput() + return i.keysStack, total + } + return nil, 0 +} + +// Next advances this iterator to the next key/value pair. If there is none +// or the advancement goes beyond the configured endKeyExclusive, then +// ErrIteratorDone is returned. +func (i *FSTIterator) Next() error { + return i.next(-1) +} + +func (i *FSTIterator) next(lastOffset int) error { + // remember where we started + i.nextStart = append(i.nextStart[:0], i.keysStack...) + + nextOffset := lastOffset + 1 + +OUTER: + for true { + curr := i.statesStack[len(i.statesStack)-1] + autCurr := i.autStatesStack[len(i.autStatesStack)-1] + + if curr.Final() && i.aut.IsMatch(autCurr) && + bytes.Compare(i.keysStack, i.nextStart) > 0 { + // in final state greater than start key + return nil + } + + numTrans := curr.NumTransitions() + + INNER: + for nextOffset < numTrans { + t := curr.TransitionAt(nextOffset) + autNext := i.aut.Accept(autCurr, t) + if !i.aut.CanMatch(autNext) { + nextOffset += 1 + continue INNER + } + + pos, nextAddr, v := curr.TransitionFor(t) + + // push onto stack + next, err := i.stateGet(nextAddr) + if err != nil { + return err + } + + i.statesStack = append(i.statesStack, next) + i.keysStack = append(i.keysStack, t) + i.keysPosStack = append(i.keysPosStack, pos) + i.valsStack = append(i.valsStack, v) + i.autStatesStack = append(i.autStatesStack, autNext) + + // check to see if new keystack might have gone too far + if i.endKeyExclusive != nil && + bytes.Compare(i.keysStack, i.endKeyExclusive) >= 0 { + return ErrIteratorDone + } + + nextOffset = 0 + continue OUTER + } + + if len(i.statesStack) <= 1 { + // stack len is 1 (root), can't go back further, we're done + break + } + + // no transitions, and still room to pop + stateLast := len(i.statesStack) - 1 + state := i.statesStack[stateLast] + i.statePut(state) + + i.statesStack[stateLast] = nil + i.statesStack = i.statesStack[:stateLast] + i.keysStack = i.keysStack[:len(i.keysStack)-1] + + nextOffset = i.keysPosStack[len(i.keysPosStack)-1] + 1 + + i.keysPosStack = i.keysPosStack[:len(i.keysPosStack)-1] + i.valsStack = i.valsStack[:len(i.valsStack)-1] + i.autStatesStack = i.autStatesStack[:len(i.autStatesStack)-1] + } + + return ErrIteratorDone +} + +// Seek advances this iterator to the specified key/value pair. If this key +// is not in the FST, Current() will return the next largest key. If this +// seek operation would go past the last key, or outside the configured +// startKeyInclusive/endKeyExclusive then ErrIteratorDone is returned. +func (i *FSTIterator) Seek(key []byte) error { + return i.pointTo(key) +} + +// Close will free any resources held by this iterator. +func (i *FSTIterator) Close() error { + // at the moment we don't do anything, + // but wanted this for API completeness + return nil +} diff --git a/vendor/github.com/m3dbx/vellum/merge_iterator.go b/vendor/github.com/m3dbx/vellum/merge_iterator.go new file mode 100644 index 00000000..f00f7783 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/merge_iterator.go @@ -0,0 +1,188 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +import ( + "bytes" +) + +// MergeFunc is used to choose the new value for a key when merging a slice +// of iterators, and the same key is observed with multiple values. +// Values presented to the MergeFunc will be in the same order as the +// original slice creating the MergeIterator. This allows some MergeFunc +// implementations to prioritize one iterator over another. +type MergeFunc func([]uint64) uint64 + +// MergeIterator implements the Iterator interface by traversing a slice +// of iterators and merging the contents of them. If the same key exists +// in mulitipe underlying iterators, a user-provided MergeFunc will be +// invoked to choose the new value. +type MergeIterator struct { + itrs []Iterator + f MergeFunc + currKs [][]byte + currVs []uint64 + + lowK []byte + lowV uint64 + lowIdxs []int + + mergeV []uint64 +} + +// NewMergeIterator creates a new MergeIterator over the provided slice of +// Iterators and with the specified MergeFunc to resolve duplicate keys. +func NewMergeIterator(itrs []Iterator, f MergeFunc) (*MergeIterator, error) { + rv := &MergeIterator{ + itrs: itrs, + f: f, + currKs: make([][]byte, len(itrs)), + currVs: make([]uint64, len(itrs)), + lowIdxs: make([]int, 0, len(itrs)), + mergeV: make([]uint64, 0, len(itrs)), + } + rv.init() + if rv.lowK == nil { + return rv, ErrIteratorDone + } + return rv, nil +} + +func (m *MergeIterator) init() { + for i, itr := range m.itrs { + m.currKs[i], m.currVs[i] = itr.Current() + } + m.updateMatches() +} + +func (m *MergeIterator) updateMatches() { + if len(m.itrs) < 1 { + return + } + m.lowK = m.currKs[0] + m.lowIdxs = m.lowIdxs[:0] + m.lowIdxs = append(m.lowIdxs, 0) + for i := 1; i < len(m.itrs); i++ { + if m.currKs[i] == nil { + continue + } + cmp := bytes.Compare(m.currKs[i], m.lowK) + if m.lowK == nil || cmp < 0 { + // reached a new low + m.lowK = m.currKs[i] + m.lowIdxs = m.lowIdxs[:0] + m.lowIdxs = append(m.lowIdxs, i) + } else if cmp == 0 { + m.lowIdxs = append(m.lowIdxs, i) + } + } + if len(m.lowIdxs) > 1 { + // merge multiple values + m.mergeV = m.mergeV[:0] + for _, vi := range m.lowIdxs { + m.mergeV = append(m.mergeV, m.currVs[vi]) + } + m.lowV = m.f(m.mergeV) + } else if len(m.lowIdxs) == 1 { + m.lowV = m.currVs[m.lowIdxs[0]] + } +} + +// Current returns the key and value currently pointed to by this iterator. +// If the iterator is not pointing at a valid value (because Iterator/Next/Seek) +// returned an error previously, it may return nil,0. +func (m *MergeIterator) Current() ([]byte, uint64) { + return m.lowK, m.lowV +} + +// Next advances this iterator to the next key/value pair. If there is none, +// then ErrIteratorDone is returned. +func (m *MergeIterator) Next() error { + // move all the current low iterators to next + for _, vi := range m.lowIdxs { + err := m.itrs[vi].Next() + if err != nil && err != ErrIteratorDone { + return err + } + m.currKs[vi], m.currVs[vi] = m.itrs[vi].Current() + } + m.updateMatches() + if m.lowK == nil { + return ErrIteratorDone + } + return nil +} + +// Seek advances this iterator to the specified key/value pair. If this key +// is not in the FST, Current() will return the next largest key. If this +// seek operation would go past the last key, then ErrIteratorDone is returned. +func (m *MergeIterator) Seek(key []byte) error { + for i := range m.itrs { + err := m.itrs[i].Seek(key) + if err != nil && err != ErrIteratorDone { + return err + } + } + m.updateMatches() + if m.lowK == nil { + return ErrIteratorDone + } + return nil +} + +// Close will attempt to close all the underlying Iterators. If any errors +// are encountered, the first will be returned. +func (m *MergeIterator) Close() error { + var rv error + for i := range m.itrs { + // close all iterators, return first error if any + err := m.itrs[i].Close() + if rv == nil { + rv = err + } + } + return rv +} + +// MergeMin chooses the minimum value +func MergeMin(vals []uint64) uint64 { + rv := vals[0] + for _, v := range vals[1:] { + if v < rv { + rv = v + } + } + return rv +} + +// MergeMax chooses the maximum value +func MergeMax(vals []uint64) uint64 { + rv := vals[0] + for _, v := range vals[1:] { + if v > rv { + rv = v + } + } + return rv +} + +// MergeSum sums the values +func MergeSum(vals []uint64) uint64 { + rv := vals[0] + for _, v := range vals[1:] { + rv += v + } + return rv +} diff --git a/vendor/github.com/m3dbx/vellum/pack.go b/vendor/github.com/m3dbx/vellum/pack.go new file mode 100644 index 00000000..78f3dcd5 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/pack.go @@ -0,0 +1,55 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +func deltaAddr(base, trans uint64) uint64 { + // transition dest of 0 is special case + if trans == 0 { + return 0 + } + return base - trans +} + +const packOutMask = 1<<4 - 1 + +func encodePackSize(transSize, outSize int) byte { + var rv byte + rv = byte(transSize << 4) + rv |= byte(outSize) + return rv +} + +func decodePackSize(pack byte) (transSize int, packSize int) { + transSize = int(pack >> 4) + packSize = int(pack & packOutMask) + return +} + +const maxNumTrans = 1<<6 - 1 + +func encodeNumTrans(n int) byte { + if n <= maxNumTrans { + return byte(n) + } + return 0 +} + +func readPackedUint(data []byte) (rv uint64) { + for i := range data { + shifted := uint64(data[i]) << uint(i*8) + rv |= shifted + } + return +} diff --git a/vendor/github.com/m3dbx/vellum/regexp/compile.go b/vendor/github.com/m3dbx/vellum/regexp/compile.go new file mode 100644 index 00000000..d5a36c1e --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/regexp/compile.go @@ -0,0 +1,343 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package regexp + +import ( + "regexp/syntax" + "unicode" + + unicode_utf8 "unicode/utf8" + + "github.com/m3dbx/vellum/utf8" +) + +type compiler struct { + sizeLimit uint + insts prog + instsPool []inst + + sequences utf8.Sequences + rangeStack utf8.RangeStack + startBytes []byte + endBytes []byte +} + +func newCompiler(sizeLimit uint) *compiler { + return &compiler{ + sizeLimit: sizeLimit, + startBytes: make([]byte, unicode_utf8.UTFMax), + endBytes: make([]byte, unicode_utf8.UTFMax), + } +} + +func (c *compiler) compile(ast *syntax.Regexp) (prog, error) { + err := c.c(ast) + if err != nil { + return nil, err + } + inst := c.allocInst() + inst.op = OpMatch + c.insts = append(c.insts, inst) + return c.insts, nil +} + +func (c *compiler) c(ast *syntax.Regexp) (err error) { + if ast.Flags&syntax.NonGreedy > 1 { + return ErrNoLazy + } + + switch ast.Op { + case syntax.OpEndLine, syntax.OpBeginLine, + syntax.OpBeginText, syntax.OpEndText: + return ErrNoEmpty + case syntax.OpWordBoundary, syntax.OpNoWordBoundary: + return ErrNoWordBoundary + case syntax.OpEmptyMatch: + return nil + case syntax.OpLiteral: + for _, r := range ast.Rune { + if ast.Flags&syntax.FoldCase > 0 { + next := syntax.Regexp{ + Op: syntax.OpCharClass, + Flags: ast.Flags & syntax.FoldCase, + Rune0: [2]rune{r, r}, + } + next.Rune = next.Rune0[0:2] + // try to find more folded runes + for r1 := unicode.SimpleFold(r); r1 != r; r1 = unicode.SimpleFold(r1) { + next.Rune = append(next.Rune, r1, r1) + } + err = c.c(&next) + if err != nil { + return err + } + } else { + c.sequences, c.rangeStack, err = utf8.NewSequencesPrealloc( + r, r, c.sequences, c.rangeStack, c.startBytes, c.endBytes) + if err != nil { + return err + } + for _, seq := range c.sequences { + c.compileUtf8Ranges(seq) + } + } + } + case syntax.OpAnyChar: + next := syntax.Regexp{ + Op: syntax.OpCharClass, + Flags: ast.Flags & syntax.FoldCase, + Rune0: [2]rune{0, unicode.MaxRune}, + } + next.Rune = next.Rune0[:2] + return c.c(&next) + case syntax.OpAnyCharNotNL: + next := syntax.Regexp{ + Op: syntax.OpCharClass, + Flags: ast.Flags & syntax.FoldCase, + Rune: []rune{0, 0x09, 0x0B, unicode.MaxRune}, + } + return c.c(&next) + case syntax.OpCharClass: + return c.compileClass(ast) + case syntax.OpCapture: + return c.c(ast.Sub[0]) + case syntax.OpConcat: + for _, sub := range ast.Sub { + err := c.c(sub) + if err != nil { + return err + } + } + return nil + case syntax.OpAlternate: + if len(ast.Sub) == 0 { + return nil + } + jmpsToEnd := make([]uint, 0, len(ast.Sub)-1) + // does not handle last entry + for i := 0; i < len(ast.Sub)-1; i++ { + sub := ast.Sub[i] + split := c.emptySplit() + j1 := c.top() + err := c.c(sub) + if err != nil { + return err + } + jmpsToEnd = append(jmpsToEnd, c.emptyJump()) + j2 := c.top() + c.setSplit(split, j1, j2) + } + // handle last entry + err := c.c(ast.Sub[len(ast.Sub)-1]) + if err != nil { + return err + } + end := uint(len(c.insts)) + for _, jmpToEnd := range jmpsToEnd { + c.setJump(jmpToEnd, end) + } + case syntax.OpQuest: + split := c.emptySplit() + j1 := c.top() + err := c.c(ast.Sub[0]) + if err != nil { + return err + } + j2 := c.top() + c.setSplit(split, j1, j2) + + case syntax.OpStar: + j1 := c.top() + split := c.emptySplit() + j2 := c.top() + err := c.c(ast.Sub[0]) + if err != nil { + return err + } + jmp := c.emptyJump() + j3 := uint(len(c.insts)) + + c.setJump(jmp, j1) + c.setSplit(split, j2, j3) + + case syntax.OpPlus: + j1 := c.top() + err := c.c(ast.Sub[0]) + if err != nil { + return err + } + split := c.emptySplit() + j2 := c.top() + c.setSplit(split, j1, j2) + + case syntax.OpRepeat: + if ast.Max == -1 { + for i := 0; i < ast.Min; i++ { + err := c.c(ast.Sub[0]) + if err != nil { + return err + } + } + next := syntax.Regexp{ + Op: syntax.OpStar, + Flags: ast.Flags, + Sub: ast.Sub, + Sub0: ast.Sub0, + Rune: ast.Rune, + Rune0: ast.Rune0, + } + return c.c(&next) + } + for i := 0; i < ast.Min; i++ { + err := c.c(ast.Sub[0]) + if err != nil { + return err + } + } + splits := make([]uint, 0, ast.Max-ast.Min) + starts := make([]uint, 0, ast.Max-ast.Min) + for i := ast.Min; i < ast.Max; i++ { + splits = append(splits, c.emptySplit()) + starts = append(starts, uint(len(c.insts))) + err := c.c(ast.Sub[0]) + if err != nil { + return err + } + } + end := uint(len(c.insts)) + for i := 0; i < len(splits); i++ { + c.setSplit(splits[i], starts[i], end) + } + + } + + return c.checkSize() +} + +func (c *compiler) checkSize() error { + if uint(len(c.insts)*instSize) > c.sizeLimit { + return ErrCompiledTooBig + } + return nil +} + +func (c *compiler) compileClass(ast *syntax.Regexp) error { + if len(ast.Rune) == 0 { + return nil + } + jmps := make([]uint, 0, len(ast.Rune)-2) + // does not do last pair + for i := 0; i < len(ast.Rune)-2; i += 2 { + rstart := ast.Rune[i] + rend := ast.Rune[i+1] + + split := c.emptySplit() + j1 := c.top() + err := c.compileClassRange(rstart, rend) + if err != nil { + return err + } + jmps = append(jmps, c.emptyJump()) + j2 := c.top() + c.setSplit(split, j1, j2) + } + // handle last pair + rstart := ast.Rune[len(ast.Rune)-2] + rend := ast.Rune[len(ast.Rune)-1] + err := c.compileClassRange(rstart, rend) + if err != nil { + return err + } + end := c.top() + for _, jmp := range jmps { + c.setJump(jmp, end) + } + return nil +} + +func (c *compiler) compileClassRange(startR, endR rune) (err error) { + c.sequences, c.rangeStack, err = utf8.NewSequencesPrealloc( + startR, endR, c.sequences, c.rangeStack, c.startBytes, c.endBytes) + if err != nil { + return err + } + jmps := make([]uint, 0, len(c.sequences)-1) + // does not do last entry + for i := 0; i < len(c.sequences)-1; i++ { + seq := c.sequences[i] + split := c.emptySplit() + j1 := c.top() + c.compileUtf8Ranges(seq) + jmps = append(jmps, c.emptyJump()) + j2 := c.top() + c.setSplit(split, j1, j2) + } + // handle last entry + c.compileUtf8Ranges(c.sequences[len(c.sequences)-1]) + end := c.top() + for _, jmp := range jmps { + c.setJump(jmp, end) + } + + return nil +} + +func (c *compiler) compileUtf8Ranges(seq utf8.Sequence) { + for _, r := range seq { + inst := c.allocInst() + inst.op = OpRange + inst.rangeStart = r.Start + inst.rangeEnd = r.End + c.insts = append(c.insts, inst) + } +} + +func (c *compiler) emptySplit() uint { + inst := c.allocInst() + inst.op = OpSplit + c.insts = append(c.insts, inst) + return c.top() - 1 +} + +func (c *compiler) emptyJump() uint { + inst := c.allocInst() + inst.op = OpJmp + c.insts = append(c.insts, inst) + return c.top() - 1 +} + +func (c *compiler) setSplit(i, pc1, pc2 uint) { + split := c.insts[i] + split.splitA = pc1 + split.splitB = pc2 +} + +func (c *compiler) setJump(i, pc uint) { + jmp := c.insts[i] + jmp.to = pc +} + +func (c *compiler) top() uint { + return uint(len(c.insts)) +} + +func (c *compiler) allocInst() *inst { + if len(c.instsPool) <= 0 { + c.instsPool = make([]inst, 16) + } + inst := &c.instsPool[0] + c.instsPool = c.instsPool[1:] + return inst +} diff --git a/vendor/github.com/m3dbx/vellum/regexp/dfa.go b/vendor/github.com/m3dbx/vellum/regexp/dfa.go new file mode 100644 index 00000000..7e6fb29d --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/regexp/dfa.go @@ -0,0 +1,196 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package regexp + +import ( + "encoding/binary" + "fmt" +) + +// StateLimit is the maximum number of states allowed +const StateLimit = 10000 + +// ErrTooManyStates is returned if you attempt to build a Levenshtein +// automaton which requires too many states. +var ErrTooManyStates = fmt.Errorf("dfa contains more than %d states", + StateLimit) + +type dfaBuilder struct { + dfa *dfa + cache map[string]int + keyBuf []byte +} + +func newDfaBuilder(insts prog) *dfaBuilder { + d := &dfaBuilder{ + dfa: &dfa{ + insts: insts, + states: make([]state, 0, 16), + }, + cache: make(map[string]int, 1024), + } + // add 0 state that is invalid + d.dfa.states = append(d.dfa.states, state{ + next: make([]int, 256), + match: false, + }) + return d +} + +func (d *dfaBuilder) build() (*dfa, error) { + cur := newSparseSet(uint(len(d.dfa.insts))) + next := newSparseSet(uint(len(d.dfa.insts))) + + d.dfa.add(cur, 0) + ns, instsReuse := d.cachedState(cur, nil) + states := intStack{ns} + seen := make(map[int]struct{}) + var s int + states, s = states.Pop() + for s != 0 { + for b := 0; b < 256; b++ { + var ns int + ns, instsReuse = d.runState(cur, next, s, byte(b), instsReuse) + if ns != 0 { + if _, ok := seen[ns]; !ok { + seen[ns] = struct{}{} + states = states.Push(ns) + } + } + if len(d.dfa.states) > StateLimit { + return nil, ErrTooManyStates + } + } + states, s = states.Pop() + } + return d.dfa, nil +} + +func (d *dfaBuilder) runState(cur, next *sparseSet, state int, b byte, instsReuse []uint) ( + int, []uint) { + cur.Clear() + for _, ip := range d.dfa.states[state].insts { + cur.Add(ip) + } + d.dfa.run(cur, next, b) + var nextState int + nextState, instsReuse = d.cachedState(next, instsReuse) + d.dfa.states[state].next[b] = nextState + return nextState, instsReuse +} + +func instsKey(insts []uint, buf []byte) []byte { + if cap(buf) < 8*len(insts) { + buf = make([]byte, 8*len(insts)) + } else { + buf = buf[0 : 8*len(insts)] + } + for i, inst := range insts { + binary.LittleEndian.PutUint64(buf[i*8:], uint64(inst)) + } + return buf +} + +func (d *dfaBuilder) cachedState(set *sparseSet, + instsReuse []uint) (int, []uint) { + insts := instsReuse[:0] + if cap(insts) == 0 { + insts = make([]uint, 0, set.Len()) + } + var isMatch bool + for i := uint(0); i < uint(set.Len()); i++ { + ip := set.Get(i) + switch d.dfa.insts[ip].op { + case OpRange: + insts = append(insts, ip) + case OpMatch: + isMatch = true + insts = append(insts, ip) + } + } + if len(insts) == 0 { + return 0, insts + } + d.keyBuf = instsKey(insts, d.keyBuf) + v, ok := d.cache[string(d.keyBuf)] + if ok { + return v, insts + } + d.dfa.states = append(d.dfa.states, state{ + insts: insts, + next: make([]int, 256), + match: isMatch, + }) + newV := len(d.dfa.states) - 1 + d.cache[string(d.keyBuf)] = newV + return newV, nil +} + +type dfa struct { + insts prog + states []state +} + +func (d *dfa) add(set *sparseSet, ip uint) { + if set.Contains(ip) { + return + } + set.Add(ip) + switch d.insts[ip].op { + case OpJmp: + d.add(set, d.insts[ip].to) + case OpSplit: + d.add(set, d.insts[ip].splitA) + d.add(set, d.insts[ip].splitB) + } +} + +func (d *dfa) run(from, to *sparseSet, b byte) bool { + to.Clear() + var isMatch bool + for i := uint(0); i < uint(from.Len()); i++ { + ip := from.Get(i) + switch d.insts[ip].op { + case OpMatch: + isMatch = true + case OpRange: + if d.insts[ip].rangeStart <= b && + b <= d.insts[ip].rangeEnd { + d.add(to, ip+1) + } + } + } + return isMatch +} + +type state struct { + insts []uint + next []int + match bool +} + +type intStack []int + +func (s intStack) Push(v int) intStack { + return append(s, v) +} + +func (s intStack) Pop() (intStack, int) { + l := len(s) + if l < 1 { + return s, 0 + } + return s[:l-1], s[l-1] +} diff --git a/vendor/github.com/m3dbx/vellum/regexp/inst.go b/vendor/github.com/m3dbx/vellum/regexp/inst.go new file mode 100644 index 00000000..36f2e602 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/regexp/inst.go @@ -0,0 +1,62 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package regexp + +import "fmt" + +// instOp represents a instruction operation +type instOp int + +// the enumeration of operations +const ( + OpMatch instOp = iota + OpJmp + OpSplit + OpRange +) + +// instSize is the approximate size of the an inst struct in bytes +const instSize = 40 + +type inst struct { + op instOp + to uint + splitA uint + splitB uint + rangeStart byte + rangeEnd byte +} + +func (i *inst) String() string { + switch i.op { + case OpJmp: + return fmt.Sprintf("JMP: %d", i.to) + case OpSplit: + return fmt.Sprintf("SPLIT: %d - %d", i.splitA, i.splitB) + case OpRange: + return fmt.Sprintf("RANGE: %x - %x", i.rangeStart, i.rangeEnd) + } + return "MATCH" +} + +type prog []*inst + +func (p prog) String() string { + rv := "\n" + for i, pi := range p { + rv += fmt.Sprintf("%d %v\n", i, pi) + } + return rv +} diff --git a/vendor/github.com/m3dbx/vellum/regexp/regexp.go b/vendor/github.com/m3dbx/vellum/regexp/regexp.go new file mode 100644 index 00000000..920ddc37 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/regexp/regexp.go @@ -0,0 +1,119 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package regexp + +import ( + "fmt" + "regexp/syntax" +) + +// ErrNoEmpty returned when "zero width assertions" are used +var ErrNoEmpty = fmt.Errorf("zero width assertions not allowed") + +// ErrNoWordBoundary returned when word boundaries are used +var ErrNoWordBoundary = fmt.Errorf("word boundaries are not allowed") + +// ErrNoBytes returned when byte literals are used +var ErrNoBytes = fmt.Errorf("byte literals are not allowed") + +// ErrNoLazy returned when lazy quantifiers are used +var ErrNoLazy = fmt.Errorf("lazy quantifiers are not allowed") + +// ErrCompiledTooBig returned when regular expression parses into +// too many instructions +var ErrCompiledTooBig = fmt.Errorf("too many instructions") + +var DefaultLimit = uint(10 * (1 << 20)) + +// Regexp implements the vellum.Automaton interface for matcing a user +// specified regular expression. +type Regexp struct { + orig string + dfa *dfa +} + +// NewRegexp creates a new Regular Expression automaton with the specified +// expression. By default it is limited to approximately 10MB for the +// compiled finite state automaton. If this size is exceeded, +// ErrCompiledTooBig will be returned. +func New(expr string) (*Regexp, error) { + return NewWithLimit(expr, DefaultLimit) +} + +// NewRegexpWithLimit creates a new Regular Expression automaton with +// the specified expression. The size of the compiled finite state +// automaton exceeds the user specified size, ErrCompiledTooBig will be +// returned. +func NewWithLimit(expr string, size uint) (*Regexp, error) { + parsed, err := syntax.Parse(expr, syntax.Perl) + if err != nil { + return nil, err + } + return NewParsedWithLimit(expr, parsed, size) +} + +func NewParsedWithLimit(expr string, parsed *syntax.Regexp, size uint) (*Regexp, error) { + compiler := newCompiler(size) + insts, err := compiler.compile(parsed) + if err != nil { + return nil, err + } + dfaBuilder := newDfaBuilder(insts) + dfa, err := dfaBuilder.build() + if err != nil { + return nil, err + } + return &Regexp{ + orig: expr, + dfa: dfa, + }, nil +} + +// Start returns the start state of this automaton. +func (r *Regexp) Start() int { + return 1 +} + +// IsMatch returns if the specified state is a matching state. +func (r *Regexp) IsMatch(s int) bool { + if s < len(r.dfa.states) { + return r.dfa.states[s].match + } + return false +} + +// CanMatch returns if the specified state can ever transition to a matching +// state. +func (r *Regexp) CanMatch(s int) bool { + if s < len(r.dfa.states) && s > 0 { + return true + } + return false +} + +// WillAlwaysMatch returns if the specified state will always end in a +// matching state. +func (r *Regexp) WillAlwaysMatch(int) bool { + return false +} + +// Accept returns the new state, resulting from the transition byte b +// when currently in the state s. +func (r *Regexp) Accept(s int, b byte) int { + if s < len(r.dfa.states) { + return r.dfa.states[s].next[b] + } + return 0 +} diff --git a/vendor/github.com/m3dbx/vellum/regexp/sparse.go b/vendor/github.com/m3dbx/vellum/regexp/sparse.go new file mode 100644 index 00000000..7afbfceb --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/regexp/sparse.go @@ -0,0 +1,54 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package regexp + +type sparseSet struct { + dense []uint + sparse []uint + size uint +} + +func newSparseSet(size uint) *sparseSet { + return &sparseSet{ + dense: make([]uint, size), + sparse: make([]uint, size), + size: 0, + } +} + +func (s *sparseSet) Len() int { + return int(s.size) +} + +func (s *sparseSet) Add(ip uint) uint { + i := s.size + s.dense[i] = ip + s.sparse[ip] = i + s.size++ + return i +} + +func (s *sparseSet) Get(i uint) uint { + return s.dense[i] +} + +func (s *sparseSet) Contains(ip uint) bool { + i := s.sparse[ip] + return i < s.size && s.dense[i] == ip +} + +func (s *sparseSet) Clear() { + s.size = 0 +} diff --git a/vendor/github.com/m3dbx/vellum/registry.go b/vendor/github.com/m3dbx/vellum/registry.go new file mode 100644 index 00000000..d36facd2 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/registry.go @@ -0,0 +1,128 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +type registryCell struct { + addr int + node *builderNode +} + +// Registry is used as a form of LRU so that the number of nodes that need to be kept +// in memory is reduced. When the builder is compiling the FST and is presented with +// compiling a given node, it can check the registry to see if an equivalent node has +// already been compiled. If so, the registry will return the address of the already +// compiled node and the builder can use that. If an equivalent node has not already +// been compiled (or was, but has since been evicted from the LRU), the builder will +// recompile it into the encoder and then add it to the registry for future use. +type registry struct { + builderNodePool *builderNodePool + table []registryCell + tableSize uint + mruSize uint +} + +func newRegistry(p *builderNodePool, tableSize, mruSize int) *registry { + nsize := tableSize * mruSize + rv := ®istry{ + builderNodePool: p, + table: make([]registryCell, nsize), + tableSize: uint(tableSize), + mruSize: uint(mruSize), + } + return rv +} + +func (r *registry) Reset() { + var empty registryCell + for i := range r.table { + if r.table[i].node != nil { + r.builderNodePool.Put(r.table[i].node) + } + r.table[i] = empty + } +} + +func (r *registry) entry(node *builderNode) (bool, int, *registryCell) { + if len(r.table) == 0 { + return false, 0, nil + } + bucket := r.hash(node) + start := r.mruSize * uint(bucket) + end := start + r.mruSize + rc := registryCache(r.table[start:end]) + return rc.entry(node, r.builderNodePool) +} + +const fnvPrime = 1099511628211 + +func (r *registry) hash(b *builderNode) int { + var final uint64 + if b.final { + final = 1 + } + + var h uint64 = 14695981039346656037 + h = (h ^ final) * fnvPrime + h = (h ^ b.finalOutput) * fnvPrime + for _, t := range b.trans { + h = (h ^ uint64(t.in)) * fnvPrime + h = (h ^ t.out) * fnvPrime + h = (h ^ uint64(t.addr)) * fnvPrime + } + return int(h % uint64(r.tableSize)) +} + +type registryCache []registryCell + +// The registry is responsible for returning BuilderNodes that it controls to the BuilderNodePool once +// they are evicted. As a result, all the codepaths in the entry method that return false (entry was not +// found and the registry is assuming ownership of this node) will return the corresponding evicted node to +// the builderNodePool. +func (r registryCache) entry(node *builderNode, pool *builderNodePool) (bool, int, *registryCell) { + if len(r) == 1 { + if r[0].node != nil && r[0].node.equiv(node) { + return true, r[0].addr, nil + } + pool.Put(r[0].node) + r[0].node = node + return false, 0, &r[0] + } + for i := range r { + if r[i].node != nil && r[i].node.equiv(node) { + addr := r[i].addr + r.promote(i) + return true, addr, nil + } + } + + // no match + last := len(r) - 1 + pool.Put(r[last].node) + r[last].node = node // discard LRU + r.promote(last) + return false, 0, &r[0] + +} + +func (r registryCache) promote(i int) { + for i > 0 { + r.swap(i-1, i) + i-- + } +} + +func (r registryCache) swap(i, j int) { + r[i], r[j] = r[j], r[i] +} diff --git a/vendor/github.com/m3dbx/vellum/transducer.go b/vendor/github.com/m3dbx/vellum/transducer.go new file mode 100644 index 00000000..753c422d --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/transducer.go @@ -0,0 +1,55 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +// Transducer represents the general contract of a byte-based finite transducer +type Transducer interface { + + // all transducers are also automatons + Automaton + + // IsMatchWithValue returns true if and only if the state is a match + // additionally it returns a states final value (if any) + IsMatchWithVal(int) (bool, uint64) + + // Accept returns the next state given the input to the specified state + // additionally it returns the value associated with the transition + AcceptWithVal(int, byte) (int, uint64) +} + +// TransducerGet implements an generic Get() method which works +// on any implementation of Transducer +// The caller MUST check the boolean return value for a match. +// Zero is a valid value regardless of match status, +// and if it is NOT a match, the value collected so far is returned. +func TransducerGet(t Transducer, k []byte) (bool, uint64) { + var total uint64 + i := 0 + curr := t.Start() + for t.CanMatch(curr) && i < len(k) { + var transVal uint64 + curr, transVal = t.AcceptWithVal(curr, k[i]) + if curr == noneAddr { + break + } + total += transVal + i++ + } + if i != len(k) { + return false, total + } + match, finalVal := t.IsMatchWithVal(curr) + return match, total + finalVal +} diff --git a/vendor/github.com/m3dbx/vellum/utf8/utf8.go b/vendor/github.com/m3dbx/vellum/utf8/utf8.go new file mode 100644 index 00000000..54e23b93 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/utf8/utf8.go @@ -0,0 +1,268 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package utf8 + +import ( + "fmt" + "unicode/utf8" +) + +// Sequences is a collection of Sequence +type Sequences []Sequence + +// NewSequences constructs a collection of Sequence which describe the +// byte ranges covered between the start and end runes. +func NewSequences(start, end rune) (Sequences, error) { + rv, _, err := NewSequencesPrealloc(start, end, nil, nil, nil, nil) + return rv, err +} + +func NewSequencesPrealloc(start, end rune, + preallocSequences Sequences, + preallocRangeStack RangeStack, + preallocStartBytes, preallocEndBytes []byte) (Sequences, RangeStack, error) { + rv := preallocSequences[:0] + + startBytes := preallocStartBytes + if cap(startBytes) < utf8.UTFMax { + startBytes = make([]byte, utf8.UTFMax) + } + startBytes = startBytes[:utf8.UTFMax] + + endBytes := preallocEndBytes + if cap(endBytes) < utf8.UTFMax { + endBytes = make([]byte, utf8.UTFMax) + } + endBytes = endBytes[:utf8.UTFMax] + + rangeStack := preallocRangeStack[:0] + rangeStack = rangeStack.Push(scalarRange{start, end}) + + rangeStack, r := rangeStack.Pop() +TOP: + for r != nilScalarRange { + INNER: + for { + r1, r2 := r.split() + if r1 != nilScalarRange { + rangeStack = rangeStack.Push(scalarRange{r2.start, r2.end}) + r.start = r1.start + r.end = r1.end + continue INNER + } + if !r.valid() { + rangeStack, r = rangeStack.Pop() + continue TOP + } + for i := 1; i < utf8.UTFMax; i++ { + max := maxScalarValue(i) + if r.start <= max && max < r.end { + rangeStack = rangeStack.Push(scalarRange{max + 1, r.end}) + r.end = max + continue INNER + } + } + asciiRange := r.ascii() + if asciiRange != nilRange { + rv = append(rv, Sequence{ + asciiRange, + }) + rangeStack, r = rangeStack.Pop() + continue TOP + } + for i := uint(1); i < utf8.UTFMax; i++ { + m := rune((1 << (6 * i)) - 1) + if (r.start & ^m) != (r.end & ^m) { + if (r.start & m) != 0 { + rangeStack = rangeStack.Push(scalarRange{(r.start | m) + 1, r.end}) + r.end = r.start | m + continue INNER + } + if (r.end & m) != m { + rangeStack = rangeStack.Push(scalarRange{r.end & ^m, r.end}) + r.end = (r.end & ^m) - 1 + continue INNER + } + } + } + n, m := r.encode(startBytes, endBytes) + seq, err := SequenceFromEncodedRange(startBytes[0:n], endBytes[0:m]) + if err != nil { + return nil, nil, err + } + rv = append(rv, seq) + rangeStack, r = rangeStack.Pop() + continue TOP + } + } + + return rv, rangeStack, nil +} + +// Sequence is a collection of Range +type Sequence []Range + +// SequenceFromEncodedRange creates sequence from the encoded bytes +func SequenceFromEncodedRange(start, end []byte) (Sequence, error) { + if len(start) != len(end) { + return nil, fmt.Errorf("byte slices must be the same length") + } + switch len(start) { + case 2: + return Sequence{ + Range{start[0], end[0]}, + Range{start[1], end[1]}, + }, nil + case 3: + return Sequence{ + Range{start[0], end[0]}, + Range{start[1], end[1]}, + Range{start[2], end[2]}, + }, nil + case 4: + return Sequence{ + Range{start[0], end[0]}, + Range{start[1], end[1]}, + Range{start[2], end[2]}, + Range{start[3], end[3]}, + }, nil + } + + return nil, fmt.Errorf("invalid encoded byte length") +} + +// Matches checks to see if the provided byte slice matches the Sequence +func (u Sequence) Matches(bytes []byte) bool { + if len(bytes) < len(u) { + return false + } + for i := 0; i < len(u); i++ { + if !u[i].matches(bytes[i]) { + return false + } + } + return true +} + +func (u Sequence) String() string { + switch len(u) { + case 1: + return fmt.Sprintf("%v", u[0]) + case 2: + return fmt.Sprintf("%v%v", u[0], u[1]) + case 3: + return fmt.Sprintf("%v%v%v", u[0], u[1], u[2]) + case 4: + return fmt.Sprintf("%v%v%v%v", u[0], u[1], u[2], u[3]) + default: + return fmt.Sprintf("invalid utf8 sequence") + } +} + +// Range describes a single range of byte values +type Range struct { + Start byte + End byte +} + +var nilRange = Range{0xff, 0} + +func (u Range) matches(b byte) bool { + if u.Start <= b && b <= u.End { + return true + } + return false +} + +func (u Range) String() string { + if u.Start == u.End { + return fmt.Sprintf("[%X]", u.Start) + } + return fmt.Sprintf("[%X-%X]", u.Start, u.End) +} + +type scalarRange struct { + start rune + end rune +} + +var nilScalarRange = scalarRange{0xffff, 0} + +func (s *scalarRange) String() string { + return fmt.Sprintf("ScalarRange(%d,%d)", s.start, s.end) +} + +// split this scalar range if it overlaps with a surrogate codepoint +func (s *scalarRange) split() (scalarRange, scalarRange) { + if s.start < 0xe000 && s.end > 0xd7ff { + return scalarRange{ + start: s.start, + end: 0xd7ff, + }, + scalarRange{ + start: 0xe000, + end: s.end, + } + } + return nilScalarRange, nilScalarRange +} + +func (s *scalarRange) valid() bool { + return s.start <= s.end +} + +func (s *scalarRange) ascii() Range { + if s.valid() && s.end <= 0x7f { + return Range{ + Start: byte(s.start), + End: byte(s.end), + } + } + return nilRange +} + +// start and end MUST have capacity for utf8.UTFMax bytes +func (s *scalarRange) encode(start, end []byte) (int, int) { + n := utf8.EncodeRune(start, s.start) + m := utf8.EncodeRune(end, s.end) + return n, m +} + +type RangeStack []scalarRange + +func (s RangeStack) Push(v scalarRange) RangeStack { + return append(s, v) +} + +func (s RangeStack) Pop() (RangeStack, scalarRange) { + l := len(s) + if l < 1 { + return s, nilScalarRange + } + return s[:l-1], s[l-1] +} + +func maxScalarValue(nbytes int) rune { + switch nbytes { + case 1: + return 0x007f + case 2: + return 0x07FF + case 3: + return 0xFFFF + default: + return 0x10FFFF + } +} diff --git a/vendor/github.com/m3dbx/vellum/vellum.go b/vendor/github.com/m3dbx/vellum/vellum.go new file mode 100644 index 00000000..320f607b --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/vellum.go @@ -0,0 +1,113 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* +Package vellum is a library for building, serializing and executing an FST (finite +state transducer). + +There are two distinct phases, building an FST and using it. + +When building an FST, you insert keys ([]byte) and their associated value +(uint64). Insert operations MUST be done in lexicographic order. While +building the FST, data is streamed to an underlying Writer. At the conclusion +of building, you MUST call Close() on the builder. + +After completion of the build phase, you can either Open() the FST if you +serialized it to disk. Alternatively, if you already have the bytes in +memory, you can use Load(). By default, Open() will use mmap to avoid loading +the entire file into memory. + +Once the FST is ready, you can use the Contains() method to see if a keys is +in the FST. You can use the Get() method to see if a key is in the FST and +retrieve it's associated value. And, you can use the Iterator method to +enumerate key/value pairs within a specified range. + +*/ +package vellum + +import ( + "errors" + "io" +) + +// ErrOutOfOrder is returned when values are not inserted in +// lexicographic order. +var ErrOutOfOrder = errors.New("values not inserted in lexicographic order") + +// ErrIteratorDone is returned by Iterator/Next/Seek methods when the +// Current() value pointed to by the iterator is greater than the last +// key in this FST, or outside the configured startKeyInclusive/endKeyExclusive +// range of the Iterator. +var ErrIteratorDone = errors.New("iterator-done") + +// BuilderOpts is a structure to let advanced users customize the behavior +// of the builder and some aspects of the generated FST. +type BuilderOpts struct { + Encoder int + RegistryTableSize int + RegistryMRUSize int + UnfinishedNodesStackSize int + BuilderNodePoolingConfig BuilderNodePoolingConfig +} + +// New returns a new Builder which will stream out the +// underlying representation to the provided Writer as the set is built. +func New(w io.Writer, opts *BuilderOpts) (*Builder, error) { + return newBuilder(w, opts) +} + +// Open loads the FST stored in the provided path +func Open(path string) (*FST, error) { + return open(path) +} + +// Load will return the FST represented by the provided byte slice. +func Load(data []byte) (*FST, error) { + return new(data, nil) +} + +// Merge will iterate through the provided Iterators, merge duplicate keys +// with the provided MergeFunc, and build a new FST to the provided Writer. +func Merge(w io.Writer, opts *BuilderOpts, itrs []Iterator, f MergeFunc) error { + builder, err := New(w, opts) + if err != nil { + return err + } + + itr, err := NewMergeIterator(itrs, f) + for err == nil { + k, v := itr.Current() + err = builder.Insert(k, v) + if err != nil { + return err + } + err = itr.Next() + } + + if err != nil && err != ErrIteratorDone { + return err + } + + err = itr.Close() + if err != nil { + return err + } + + err = builder.Close() + if err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/m3dbx/vellum/vellum_mmap.go b/vendor/github.com/m3dbx/vellum/vellum_mmap.go new file mode 100644 index 00000000..5acd2f47 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/vellum_mmap.go @@ -0,0 +1,60 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !nommap + +package vellum + +import ( + "os" + + mmap "github.com/edsrzf/mmap-go" +) + +type mmapWrapper struct { + f *os.File + mm mmap.MMap +} + +func (m *mmapWrapper) Close() (err error) { + if m.mm != nil { + err = m.mm.Unmap() + } + // try to close file even if unmap failed + if m.f != nil { + err2 := m.f.Close() + if err == nil { + // try to return first error + err = err2 + } + } + return +} + +func open(path string) (*FST, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + mm, err := mmap.Map(f, mmap.RDONLY, 0) + if err != nil { + // mmap failed, try to close the file + _ = f.Close() + return nil, err + } + return new(mm, &mmapWrapper{ + f: f, + mm: mm, + }) +} diff --git a/vendor/github.com/m3dbx/vellum/vellum_nommap.go b/vendor/github.com/m3dbx/vellum/vellum_nommap.go new file mode 100644 index 00000000..e9852728 --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/vellum_nommap.go @@ -0,0 +1,27 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build nommap + +package vellum + +import "io/ioutil" + +func open(path string) (*FST, error) { + data, err := ioutil.ReadFile(string) + if err != nil { + return nil, err + } + return new(data, nil) +} diff --git a/vendor/github.com/m3dbx/vellum/writer.go b/vendor/github.com/m3dbx/vellum/writer.go new file mode 100644 index 00000000..d655d47f --- /dev/null +++ b/vendor/github.com/m3dbx/vellum/writer.go @@ -0,0 +1,92 @@ +// Copyright (c) 2017 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vellum + +import ( + "bufio" + "io" +) + +// A writer is a buffered writer used by vellum. It counts how many bytes have +// been written and has some convenience methods used for encoding the data. +type writer struct { + w *bufio.Writer + counter int +} + +func newWriter(w io.Writer) *writer { + return &writer{ + w: bufio.NewWriter(w), + } +} + +func (w *writer) Reset(newWriter io.Writer) { + w.w.Reset(newWriter) + w.counter = 0 +} + +func (w *writer) WriteByte(c byte) error { + err := w.w.WriteByte(c) + if err != nil { + return err + } + w.counter++ + return nil +} + +func (w *writer) Write(p []byte) (int, error) { + n, err := w.w.Write(p) + w.counter += n + return n, err +} + +func (w *writer) Flush() error { + return w.w.Flush() +} + +func (w *writer) WritePackedUintIn(v uint64, n int) error { + for shift := uint(0); shift < uint(n*8); shift += 8 { + err := w.WriteByte(byte(v >> shift)) + if err != nil { + return err + } + } + + return nil +} + +func (w *writer) WritePackedUint(v uint64) error { + n := packedSize(v) + return w.WritePackedUintIn(v, n) +} + +func packedSize(n uint64) int { + if n < 1<<8 { + return 1 + } else if n < 1<<16 { + return 2 + } else if n < 1<<24 { + return 3 + } else if n < 1<<32 { + return 4 + } else if n < 1<<40 { + return 5 + } else if n < 1<<48 { + return 6 + } else if n < 1<<56 { + return 7 + } + return 8 +} diff --git a/vendor/github.com/magiconair/properties/.travis.yml b/vendor/github.com/magiconair/properties/.travis.yml index f07376f9..6cee379f 100644 --- a/vendor/github.com/magiconair/properties/.travis.yml +++ b/vendor/github.com/magiconair/properties/.travis.yml @@ -1,5 +1,6 @@ language: go go: + - 1.3.x - 1.4.x - 1.5.x - 1.6.x @@ -9,4 +10,6 @@ go: - "1.10.x" - "1.11.x" - "1.12.x" + - "1.13.x" + - "1.14.x" - tip diff --git a/vendor/github.com/magiconair/properties/CHANGELOG.md b/vendor/github.com/magiconair/properties/CHANGELOG.md index 176626a1..ff8d0253 100644 --- a/vendor/github.com/magiconair/properties/CHANGELOG.md +++ b/vendor/github.com/magiconair/properties/CHANGELOG.md @@ -1,8 +1,29 @@ ## Changelog +### [1.8.2](https://github.com/magiconair/properties/tree/v1.8.2) - 25 Aug 2020 + + * [PR #36](https://github.com/magiconair/properties/pull/36): Escape backslash on write + + This patch ensures that backslashes are escaped on write. Existing applications which + rely on the old behavior may need to be updated. + + Thanks to [@apesternikov](https://github.com/apesternikov) for the patch. + + * [PR #42](https://github.com/magiconair/properties/pull/42): Made Content-Type check whitespace agnostic in LoadURL() + + Thanks to [@aliras1](https://github.com/aliras1) for the patch. + + * [PR #41](https://github.com/magiconair/properties/pull/41): Make key/value separator configurable on Write() + + Thanks to [@mkjor](https://github.com/mkjor) for the patch. + + * [PR #40](https://github.com/magiconair/properties/pull/40): Add method to return a sorted list of keys + + Thanks to [@mkjor](https://github.com/mkjor) for the patch. + ### [1.8.1](https://github.com/magiconair/properties/tree/v1.8.1) - 10 May 2019 - * [PR #26](https://github.com/magiconair/properties/pull/35): Close body always after request + * [PR #35](https://github.com/magiconair/properties/pull/35): Close body always after request This patch ensures that in `LoadURL` the response body is always closed. diff --git a/vendor/github.com/magiconair/properties/LICENSE b/vendor/github.com/magiconair/properties/LICENSE.md similarity index 84% rename from vendor/github.com/magiconair/properties/LICENSE rename to vendor/github.com/magiconair/properties/LICENSE.md index b387087c..79c87e3e 100644 --- a/vendor/github.com/magiconair/properties/LICENSE +++ b/vendor/github.com/magiconair/properties/LICENSE.md @@ -1,15 +1,14 @@ -goproperties - properties file decoder for Go - -Copyright (c) 2013-2018 - Frank Schroeder +Copyright (c) 2013-2020, Frank Schroeder All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, + + * 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. diff --git a/vendor/github.com/magiconair/properties/go.mod b/vendor/github.com/magiconair/properties/go.mod index 02a6f865..4ff090bd 100644 --- a/vendor/github.com/magiconair/properties/go.mod +++ b/vendor/github.com/magiconair/properties/go.mod @@ -1 +1,3 @@ module github.com/magiconair/properties + +go 1.13 diff --git a/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/magiconair/properties/load.go index ab953253..c83c2dad 100644 --- a/vendor/github.com/magiconair/properties/load.go +++ b/vendor/github.com/magiconair/properties/load.go @@ -132,11 +132,12 @@ func (l *Loader) LoadURL(url string) (*Properties, error) { } ct := resp.Header.Get("Content-Type") + ct = strings.Join(strings.Fields(ct), "") var enc Encoding switch strings.ToLower(ct) { - case "text/plain", "text/plain; charset=iso-8859-1", "text/plain; charset=latin1": + case "text/plain", "text/plain;charset=iso-8859-1", "text/plain;charset=latin1": enc = ISO_8859_1 - case "", "text/plain; charset=utf-8": + case "", "text/plain;charset=utf-8": enc = UTF8 default: return nil, fmt.Errorf("properties: invalid content type %s", ct) diff --git a/vendor/github.com/magiconair/properties/properties.go b/vendor/github.com/magiconair/properties/properties.go index cb3d1a33..bdfdd4b3 100644 --- a/vendor/github.com/magiconair/properties/properties.go +++ b/vendor/github.com/magiconair/properties/properties.go @@ -13,6 +13,7 @@ import ( "log" "os" "regexp" + "sort" "strconv" "strings" "time" @@ -69,6 +70,9 @@ type Properties struct { // Stores the keys in order of appearance. k []string + + // WriteSeparator specifies the separator of key and value while writing the properties. + WriteSeparator string } // NewProperties creates a new Properties struct with the default @@ -586,6 +590,12 @@ func (p *Properties) String() string { return s } +// Sort sorts the properties keys in alphabetical order. +// This is helpfully before writing the properties. +func (p *Properties) Sort() { + sort.Strings(p.k) +} + // Write writes all unexpanded 'key = value' pairs to the given writer. // Write returns the number of bytes written and any write error encountered. func (p *Properties) Write(w io.Writer, enc Encoding) (n int, err error) { @@ -635,8 +645,11 @@ func (p *Properties) WriteComment(w io.Writer, prefix string, enc Encoding) (n i } } } - - x, err = fmt.Fprintf(w, "%s = %s\n", encode(key, " :", enc), encode(value, "", enc)) + sep := " = " + if p.WriteSeparator != "" { + sep = p.WriteSeparator + } + x, err = fmt.Fprintf(w, "%s%s%s\n", encode(key, " :", enc), sep, encode(value, "", enc)) if err != nil { return } @@ -820,6 +833,8 @@ func escape(r rune, special string) string { return "\\r" case '\t': return "\\t" + case '\\': + return "\\\\" default: if strings.ContainsRune(special, r) { return "\\" + string(r) diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE b/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE new file mode 100644 index 00000000..8dada3ed --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE b/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE new file mode 100644 index 00000000..5d8cb5b7 --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE @@ -0,0 +1 @@ +Copyright 2012 Matt T. Proud (matt.proud@gmail.com) diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore new file mode 100644 index 00000000..e16fb946 --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore @@ -0,0 +1 @@ +cover.dat diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile new file mode 100644 index 00000000..81be2143 --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile @@ -0,0 +1,7 @@ +all: + +cover: + go test -cover -v -coverprofile=cover.dat ./... + go tool cover -func cover.dat + +.PHONY: cover diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go new file mode 100644 index 00000000..258c0636 --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go @@ -0,0 +1,75 @@ +// Copyright 2013 Matt T. Proud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pbutil + +import ( + "encoding/binary" + "errors" + "io" + + "github.com/golang/protobuf/proto" +) + +var errInvalidVarint = errors.New("invalid varint32 encountered") + +// ReadDelimited decodes a message from the provided length-delimited stream, +// where the length is encoded as 32-bit varint prefix to the message body. +// It returns the total number of bytes read and any applicable error. This is +// roughly equivalent to the companion Java API's +// MessageLite#parseDelimitedFrom. As per the reader contract, this function +// calls r.Read repeatedly as required until exactly one message including its +// prefix is read and decoded (or an error has occurred). The function never +// reads more bytes from the stream than required. The function never returns +// an error if a message has been read and decoded correctly, even if the end +// of the stream has been reached in doing so. In that case, any subsequent +// calls return (0, io.EOF). +func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { + // Per AbstractParser#parsePartialDelimitedFrom with + // CodedInputStream#readRawVarint32. + var headerBuf [binary.MaxVarintLen32]byte + var bytesRead, varIntBytes int + var messageLength uint64 + for varIntBytes == 0 { // i.e. no varint has been decoded yet. + if bytesRead >= len(headerBuf) { + return bytesRead, errInvalidVarint + } + // We have to read byte by byte here to avoid reading more bytes + // than required. Each read byte is appended to what we have + // read before. + newBytesRead, err := r.Read(headerBuf[bytesRead : bytesRead+1]) + if newBytesRead == 0 { + if err != nil { + return bytesRead, err + } + // A Reader should not return (0, nil), but if it does, + // it should be treated as no-op (according to the + // Reader contract). So let's go on... + continue + } + bytesRead += newBytesRead + // Now present everything read so far to the varint decoder and + // see if a varint can be decoded already. + messageLength, varIntBytes = proto.DecodeVarint(headerBuf[:bytesRead]) + } + + messageBuf := make([]byte, messageLength) + newBytesRead, err := io.ReadFull(r, messageBuf) + bytesRead += newBytesRead + if err != nil { + return bytesRead, err + } + + return bytesRead, proto.Unmarshal(messageBuf, m) +} diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go new file mode 100644 index 00000000..c318385c --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go @@ -0,0 +1,16 @@ +// Copyright 2013 Matt T. Proud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package pbutil provides record length-delimited Protocol Buffer streaming. +package pbutil diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go new file mode 100644 index 00000000..8fb59ad2 --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go @@ -0,0 +1,46 @@ +// Copyright 2013 Matt T. Proud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pbutil + +import ( + "encoding/binary" + "io" + + "github.com/golang/protobuf/proto" +) + +// WriteDelimited encodes and dumps a message to the provided writer prefixed +// with a 32-bit varint indicating the length of the encoded message, producing +// a length-delimited record stream, which can be used to chain together +// encoded messages of the same type together in a file. It returns the total +// number of bytes written and any applicable error. This is roughly +// equivalent to the companion Java API's MessageLite#writeDelimitedTo. +func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) { + buffer, err := proto.Marshal(m) + if err != nil { + return 0, err + } + + var buf [binary.MaxVarintLen32]byte + encodedLength := binary.PutUvarint(buf[:], uint64(len(buffer))) + + sync, err := w.Write(buf[:encodedLength]) + if err != nil { + return sync, err + } + + n, err = w.Write(buffer) + return n + sync, err +} diff --git a/vendor/github.com/mitchellh/mapstructure/.travis.yml b/vendor/github.com/mitchellh/mapstructure/.travis.yml index 1689c7d7..5e31a95a 100644 --- a/vendor/github.com/mitchellh/mapstructure/.travis.yml +++ b/vendor/github.com/mitchellh/mapstructure/.travis.yml @@ -1,8 +1,9 @@ language: go go: - - "1.11.x" + - "1.14.x" - tip script: - go test + - go test -bench . -benchmem diff --git a/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md b/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md index 3b3cb723..20eea2b7 100644 --- a/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md +++ b/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md @@ -1,3 +1,43 @@ +## 1.3.3 + +* Decoding maps from maps creates a settable value for decode hooks [GH-203] + +## 1.3.2 + +* Decode into interface type with a struct value is supported [GH-187] + +## 1.3.1 + +* Squash should only squash embedded structs. [GH-194] + +## 1.3.0 + +* Added `",omitempty"` support. This will ignore zero values in the source + structure when encoding. [GH-145] + +## 1.2.3 + +* Fix duplicate entries in Keys list with pointer values. [GH-185] + +## 1.2.2 + +* Do not add unsettable (unexported) values to the unused metadata key + or "remain" value. [GH-150] + +## 1.2.1 + +* Go modules checksum mismatch fix + +## 1.2.0 + +* Added support to capture unused values in a field using the `",remain"` value + in the mapstructure tag. There is an example to showcase usage. +* Added `DecoderConfig` option to always squash embedded structs +* `json.Number` can decode into `uint` types +* Empty slices are preserved and not replaced with nil slices +* Fix panic that can occur in when decoding a map into a nil slice of structs +* Improved package documentation for godoc + ## 1.1.2 * Fix error when decode hook decodes interface implementation into interface diff --git a/vendor/github.com/mitchellh/mapstructure/go.mod b/vendor/github.com/mitchellh/mapstructure/go.mod index d2a71256..a03ae973 100644 --- a/vendor/github.com/mitchellh/mapstructure/go.mod +++ b/vendor/github.com/mitchellh/mapstructure/go.mod @@ -1 +1,3 @@ module github.com/mitchellh/mapstructure + +go 1.14 diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/mitchellh/mapstructure/mapstructure.go index 256ee63f..f41bcc58 100644 --- a/vendor/github.com/mitchellh/mapstructure/mapstructure.go +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -1,10 +1,150 @@ -// Package mapstructure exposes functionality to convert an arbitrary -// map[string]interface{} into a native Go structure. +// Package mapstructure exposes functionality to convert one arbitrary +// Go type into another, typically to convert a map[string]interface{} +// into a native Go structure. // // The Go structure can be arbitrarily complex, containing slices, // other structs, etc. and the decoder will properly decode nested // maps and so on into the proper structures in the native Go struct. // See the examples to see what the decoder is capable of. +// +// The simplest function to start with is Decode. +// +// Field Tags +// +// When decoding to a struct, mapstructure will use the field name by +// default to perform the mapping. For example, if a struct has a field +// "Username" then mapstructure will look for a key in the source value +// of "username" (case insensitive). +// +// type User struct { +// Username string +// } +// +// You can change the behavior of mapstructure by using struct tags. +// The default struct tag that mapstructure looks for is "mapstructure" +// but you can customize it using DecoderConfig. +// +// Renaming Fields +// +// To rename the key that mapstructure looks for, use the "mapstructure" +// tag and set a value directly. For example, to change the "username" example +// above to "user": +// +// type User struct { +// Username string `mapstructure:"user"` +// } +// +// Embedded Structs and Squashing +// +// Embedded structs are treated as if they're another field with that name. +// By default, the two structs below are equivalent when decoding with +// mapstructure: +// +// type Person struct { +// Name string +// } +// +// type Friend struct { +// Person +// } +// +// type Friend struct { +// Person Person +// } +// +// This would require an input that looks like below: +// +// map[string]interface{}{ +// "person": map[string]interface{}{"name": "alice"}, +// } +// +// If your "person" value is NOT nested, then you can append ",squash" to +// your tag value and mapstructure will treat it as if the embedded struct +// were part of the struct directly. Example: +// +// type Friend struct { +// Person `mapstructure:",squash"` +// } +// +// Now the following input would be accepted: +// +// map[string]interface{}{ +// "name": "alice", +// } +// +// DecoderConfig has a field that changes the behavior of mapstructure +// to always squash embedded structs. +// +// Remainder Values +// +// If there are any unmapped keys in the source value, mapstructure by +// default will silently ignore them. You can error by setting ErrorUnused +// in DecoderConfig. If you're using Metadata you can also maintain a slice +// of the unused keys. +// +// You can also use the ",remain" suffix on your tag to collect all unused +// values in a map. The field with this tag MUST be a map type and should +// probably be a "map[string]interface{}" or "map[interface{}]interface{}". +// See example below: +// +// type Friend struct { +// Name string +// Other map[string]interface{} `mapstructure:",remain"` +// } +// +// Given the input below, Other would be populated with the other +// values that weren't used (everything but "name"): +// +// map[string]interface{}{ +// "name": "bob", +// "address": "123 Maple St.", +// } +// +// Omit Empty Values +// +// When decoding from a struct to any other value, you may use the +// ",omitempty" suffix on your tag to omit that value if it equates to +// the zero value. The zero value of all types is specified in the Go +// specification. +// +// For example, the zero type of a numeric type is zero ("0"). If the struct +// field value is zero and a numeric type, the field is empty, and it won't +// be encoded into the destination type. +// +// type Source { +// Age int `mapstructure:",omitempty"` +// } +// +// Unexported fields +// +// Since unexported (private) struct fields cannot be set outside the package +// where they are defined, the decoder will simply skip them. +// +// For this output type definition: +// +// type Exported struct { +// private string // this unexported field will be skipped +// Public string +// } +// +// Using this map as input: +// +// map[string]interface{}{ +// "private": "I will be ignored", +// "Public": "I made it through!", +// } +// +// The following struct will be decoded: +// +// type Exported struct { +// private: "" // field is left with an empty string (zero value) +// Public: "I made it through!" +// } +// +// Other Configuration +// +// mapstructure is highly configurable. See the DecoderConfig struct +// for other features and options that are supported. package mapstructure import ( @@ -80,6 +220,14 @@ type DecoderConfig struct { // WeaklyTypedInput bool + // Squash will squash embedded structs. A squash tag may also be + // added to an individual struct field using a tag. For example: + // + // type Parent struct { + // Child `mapstructure:",squash"` + // } + Squash bool + // Metadata is the struct that will contain extra metadata about // the decoding. If this is nil, then no metadata will be tracked. Metadata *Metadata @@ -271,6 +419,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e var err error outputKind := getKind(outVal) + addMetaKey := true switch outputKind { case reflect.Bool: err = d.decodeBool(name, input, outVal) @@ -289,7 +438,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e case reflect.Map: err = d.decodeMap(name, input, outVal) case reflect.Ptr: - err = d.decodePtr(name, input, outVal) + addMetaKey, err = d.decodePtr(name, input, outVal) case reflect.Slice: err = d.decodeSlice(name, input, outVal) case reflect.Array: @@ -303,7 +452,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e // If we reached here, then we successfully decoded SOMETHING, so // mark the key as used if we're tracking metainput. - if d.config.Metadata != nil && name != "" { + if addMetaKey && d.config.Metadata != nil && name != "" { d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) } @@ -314,7 +463,34 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e // value to "data" of that type. func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error { if val.IsValid() && val.Elem().IsValid() { - return d.decode(name, data, val.Elem()) + elem := val.Elem() + + // If we can't address this element, then its not writable. Instead, + // we make a copy of the value (which is a pointer and therefore + // writable), decode into that, and replace the whole value. + copied := false + if !elem.CanAddr() { + copied = true + + // Make *T + copy := reflect.New(elem.Type()) + + // *T = elem + copy.Elem().Set(elem) + + // Set elem so we decode into it + elem = copy + } + + // Decode. If we have an error then return. We also return right + // away if we're not a copy because that means we decoded directly. + if err := d.decode(name, data, elem); err != nil || !copied { + return err + } + + // If we're a copy, we need to set te final result + val.Set(elem.Elem()) + return nil } dataVal := reflect.ValueOf(data) @@ -438,6 +614,7 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error { dataVal := reflect.Indirect(reflect.ValueOf(data)) dataKind := getKind(dataVal) + dataType := dataVal.Type() switch { case dataKind == reflect.Int: @@ -469,6 +646,18 @@ func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) e } else { return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Int64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + if i < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %d overflows uint", + name, i) + } + val.SetUint(uint64(i)) default: return fmt.Errorf( "'%s' expected type '%s', got unconvertible type '%s'", @@ -678,27 +867,31 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re } tagValue := f.Tag.Get(d.config.TagName) - tagParts := strings.Split(tagValue, ",") - - // Determine the name of the key in the map keyName := f.Name - if tagParts[0] != "" { - if tagParts[0] == "-" { + + // If Squash is set in the config, we squash the field down. + squash := d.config.Squash && v.Kind() == reflect.Struct && f.Anonymous + // Determine the name of the key in the map + if index := strings.Index(tagValue, ","); index != -1 { + if tagValue[:index] == "-" { continue } - keyName = tagParts[0] - } - - // If "squash" is specified in the tag, we squash the field down. - squash := false - for _, tag := range tagParts[1:] { - if tag == "squash" { - squash = true - break + // If "omitempty" is specified in the tag, it ignores empty values. + if strings.Index(tagValue[index+1:], "omitempty") != -1 && isEmptyValue(v) { + continue } - } - if squash && v.Kind() != reflect.Struct { - return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + + // If "squash" is specified in the tag, we squash the field down. + squash = !squash && strings.Index(tagValue[index+1:], "squash") != -1 + if squash && v.Kind() != reflect.Struct { + return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + } + keyName = tagValue[:index] + } else if len(tagValue) > 0 { + if tagValue == "-" { + continue + } + keyName = tagValue } switch v.Kind() { @@ -713,11 +906,22 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re mType := reflect.MapOf(vKeyType, vElemType) vMap := reflect.MakeMap(mType) - err := d.decode(keyName, x.Interface(), vMap) + // Creating a pointer to a map so that other methods can completely + // overwrite the map if need be (looking at you decodeMapFromMap). The + // indirection allows the underlying map to be settable (CanSet() == true) + // where as reflect.MakeMap returns an unsettable map. + addrVal := reflect.New(vMap.Type()) + reflect.Indirect(addrVal).Set(vMap) + + err := d.decode(keyName, x.Interface(), reflect.Indirect(addrVal)) if err != nil { return err } + // the underlying map may have been completely overwritten so pull + // it indirectly out of the enclosing value. + vMap = reflect.Indirect(addrVal) + if squash { for _, k := range vMap.MapKeys() { valMap.SetMapIndex(k, vMap.MapIndex(k)) @@ -738,7 +942,7 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re return nil } -func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error { +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) (bool, error) { // If the input data is nil, then we want to just set the output // pointer to be nil as well. isNil := data == nil @@ -759,7 +963,7 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er val.Set(nilValue) } - return nil + return true, nil } // Create an element of the concrete (non pointer) type and decode @@ -773,16 +977,16 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er } if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { - return err + return false, err } val.Set(realVal) } else { if err := d.decode(name, data, reflect.Indirect(val)); err != nil { - return err + return false, err } } - return nil + return false, nil } func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error { @@ -805,8 +1009,8 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) valElemType := valType.Elem() sliceType := reflect.SliceOf(valElemType) - valSlice := val - if valSlice.IsNil() || d.config.ZeroFields { + // If we have a non array/slice type then we first attempt to convert. + if dataValKind != reflect.Array && dataValKind != reflect.Slice { if d.config.WeaklyTypedInput { switch { // Slice and array we use the normal logic @@ -833,18 +1037,17 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) } } - // Check input type - if dataValKind != reflect.Array && dataValKind != reflect.Slice { - return fmt.Errorf( - "'%s': source data must be an array or slice, got %s", name, dataValKind) + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + } - } - - // If the input value is empty, then don't allocate since non-nil != nil - if dataVal.Len() == 0 { - return nil - } + // If the input value is nil, then don't allocate since empty != nil + if dataVal.IsNil() { + return nil + } + valSlice := val + if valSlice.IsNil() || d.config.ZeroFields { // Make a new slice to hold our result, same size as the original data. valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len()) } @@ -962,13 +1165,23 @@ func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) // Not the most efficient way to do this but we can optimize later if // we want to. To convert from struct to struct we go to map first // as an intermediary. - m := make(map[string]interface{}) - mval := reflect.Indirect(reflect.ValueOf(&m)) - if err := d.decodeMapFromStruct(name, dataVal, mval, mval); err != nil { + + // Make a new map to hold our result + mapType := reflect.TypeOf((map[string]interface{})(nil)) + mval := reflect.MakeMap(mapType) + + // Creating a pointer to a map so that other methods can completely + // overwrite the map if need be (looking at you decodeMapFromMap). The + // indirection allows the underlying map to be settable (CanSet() == true) + // where as reflect.MakeMap returns an unsettable map. + addrVal := reflect.New(mval.Type()) + + reflect.Indirect(addrVal).Set(mval) + if err := d.decodeMapFromStruct(name, dataVal, reflect.Indirect(addrVal), mval); err != nil { return err } - result := d.decodeStructFromMap(name, mval, val) + result := d.decodeStructFromMap(name, reflect.Indirect(addrVal), val) return result default: @@ -1005,6 +1218,11 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e field reflect.StructField val reflect.Value } + + // remainField is set to a valid field set with the "remain" tag if + // we are keeping track of remaining values. + var remainField *field + fields := []field{} for len(structs) > 0 { structVal := structs[0] @@ -1017,13 +1235,21 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e fieldKind := fieldType.Type.Kind() // If "squash" is specified in the tag, we squash the field down. - squash := false + squash := d.config.Squash && fieldKind == reflect.Struct && fieldType.Anonymous + remain := false + + // We always parse the tags cause we're looking for other tags too tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",") for _, tag := range tagParts[1:] { if tag == "squash" { squash = true break } + + if tag == "remain" { + remain = true + break + } } if squash { @@ -1036,8 +1262,13 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e continue } - // Normal struct field, store it away - fields = append(fields, field{fieldType, structVal.Field(i)}) + // Build our field + if remain { + remainField = &field{fieldType, structVal.Field(i)} + } else { + // Normal struct field, store it away + fields = append(fields, field{fieldType, structVal.Field(i)}) + } } } @@ -1078,9 +1309,6 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e } } - // Delete the key we're using from the unused map so we stop tracking - delete(dataValKeysUnused, rawMapKey.Interface()) - if !fieldValue.IsValid() { // This should never happen panic("field is not valid") @@ -1092,6 +1320,9 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e continue } + // Delete the key we're using from the unused map so we stop tracking + delete(dataValKeysUnused, rawMapKey.Interface()) + // If the name is empty string, then we're at the root, and we // don't dot-join the fields. if name != "" { @@ -1103,6 +1334,25 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e } } + // If we have a "remain"-tagged field and we have unused keys then + // we put the unused keys directly into the remain field. + if remainField != nil && len(dataValKeysUnused) > 0 { + // Build a map of only the unused values + remain := map[interface{}]interface{}{} + for key := range dataValKeysUnused { + remain[key] = dataVal.MapIndex(reflect.ValueOf(key)).Interface() + } + + // Decode it as-if we were just decoding this map onto our map. + if err := d.decodeMap(name, remain, remainField.val); err != nil { + errors = appendErrors(errors, err) + } + + // Set the map to nil so we have none so that the next check will + // not error (ErrorUnused) + dataValKeysUnused = nil + } + if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { keys := make([]string, 0, len(dataValKeysUnused)) for rawKey := range dataValKeysUnused { @@ -1133,6 +1383,24 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e return nil } +func isEmptyValue(v reflect.Value) bool { + switch getKind(v) { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + return false +} + func getKind(val reflect.Value) reflect.Kind { kind := val.Kind() diff --git a/vendor/github.com/mojocn/base64Captcha/.gitignore b/vendor/github.com/mojocn/base64Captcha/.gitignore new file mode 100644 index 00000000..d191d913 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/.gitignore @@ -0,0 +1,11 @@ +.idea/* +.idea +examples/nohup.out +examples/examples +goTestOutPutPng/* +ex +.codecov +coverage.* +*.exe +_builds/* +_builds \ No newline at end of file diff --git a/vendor/github.com/mojocn/base64Captcha/CODE_OF_CONDUCT.md b/vendor/github.com/mojocn/base64Captcha/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..9099a7e4 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/CODE_OF_CONDUCT.md @@ -0,0 +1,84 @@ +# Code of Conduct + +## 1. Purpose + +A primary goal of Base64 Captcha is to be inclusive to the largest number of contributors, with the most varied and diverse backgrounds possible. As such, we are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof). + +This code of conduct outlines our expectations for all those who participate in our community, as well as the consequences for unacceptable behavior. + +We invite all those who participate in Base64 Captcha to help us create safe and positive experiences for everyone. + +## 2. Open Source Citizenship + +A supplemental goal of this Code of Conduct is to increase open source citizenship by encouraging participants to recognize and strengthen the relationships between our actions and their effects on our community. + +Communities mirror the societies in which they exist and positive action is essential to counteract the many forms of inequality and abuses of power that exist in society. + +If you see someone who is making an extra effort to ensure our community is welcoming, friendly, and encourages all participants to contribute to the fullest extent, we want to know. + +## 3. Expected Behavior + +The following behaviors are expected and requested of all community members: + +* Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this community. +* Exercise consideration and respect in your speech and actions. +* Attempt collaboration before conflict. +* Refrain from demeaning, discriminatory, or harassing behavior and speech. +* Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential. +* Remember that community event venues may be shared with members of the public; please be respectful to all patrons of these locations. + +## 4. Unacceptable Behavior + +The following behaviors are considered harassment and are unacceptable within our community: + +* Violence, threats of violence or violent language directed against another person. +* Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory jokes and language. +* Posting or displaying sexually explicit or violent material. +* Posting or threatening to post other people’s personally identifying information ("doxing"). +* Personal insults, particularly those related to gender, sexual orientation, race, religion, or disability. +* Inappropriate photography or recording. +* Inappropriate physical contact. You should have someone’s consent before touching them. +* Unwelcome sexual attention. This includes, sexualized comments or jokes; inappropriate touching, groping, and unwelcomed sexual advances. +* Deliberate intimidation, stalking or following (online or in person). +* Advocating for, or encouraging, any of the above behavior. +* Sustained disruption of community events, including talks and presentations. + +## 5. Consequences of Unacceptable Behavior + +Unacceptable behavior from any community member, including sponsors and those with decision-making authority, will not be tolerated. + +Anyone asked to stop unacceptable behavior is expected to comply immediately. + +If a community member engages in unacceptable behavior, the community organizers may take any action they deem appropriate, up to and including a temporary ban or permanent expulsion from the community without warning (and without refund in the case of a paid event). + +## 6. Reporting Guidelines + +If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible. admin@mojotv.cn. + +[Reporting Guidelines](http://captcha.mojotv.cn/) + +Additionally, community organizers are available to help community members engage with local law enforcement or to otherwise help those experiencing unacceptable behavior feel safe. In the context of in-person events, organizers will also provide escorts as desired by the person experiencing distress. + +## 7. Addressing Grievances + +If you feel you have been falsely or unfairly accused of violating this Code of Conduct, you should notify Mojocn with a concise description of your grievance. Your grievance will be handled in accordance with our existing governing policies. + +[Policy](http://mojotv.cn/) + +## 8. Scope + +We expect all community participants (contributors, paid or otherwise; sponsors; and other guests) to abide by this Code of Conduct in all community venues–online and in-person–as well as in all one-on-one communications pertaining to community business. + +This code of conduct and its related procedures also applies to unacceptable behavior occurring outside the scope of community activities when such behavior has the potential to adversely affect the safety and well-being of community members. + +## 9. Contact info + +admin@mojotv.cn + +## 10. License and attribution + +This Code of Conduct is distributed under a [Creative Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/). + +Portions of text derived from the [Django Code of Conduct](https://www.djangoproject.com/conduct/) and the [Geek Feminism Anti-Harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy). + +Retrieved on November 22, 2016 from [http://citizencodeofconduct.org/](http://citizencodeofconduct.org/) diff --git a/vendor/gopkg.in/yaml.v3/NOTICE b/vendor/github.com/mojocn/base64Captcha/LICENSE similarity index 87% rename from vendor/gopkg.in/yaml.v3/NOTICE rename to vendor/github.com/mojocn/base64Captcha/LICENSE index 866d74a7..373ff54e 100644 --- a/vendor/gopkg.in/yaml.v3/NOTICE +++ b/vendor/github.com/mojocn/base64Captcha/LICENSE @@ -1,4 +1,4 @@ -Copyright 2011-2016 Canonical Ltd. +Copyright 2019 Eric neochau@gmail.com Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -10,4 +10,4 @@ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and -limitations under the License. +limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/mojocn/base64Captcha/README.md b/vendor/github.com/mojocn/base64Captcha/README.md new file mode 100644 index 00000000..6b929545 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/README.md @@ -0,0 +1,269 @@ +# A flexible and various captcha package +[![Go Report Card](https://goreportcard.com/badge/github.com/mojocn/base64Captcha)](https://goreportcard.com/report/github.com/mojocn/base64Captcha) +[![GoDoc](https://godoc.org/github.com/mojocn/base64Captcha?status.svg)](https://godoc.org/github.com/mojocn/base64Captcha) +[![Build Status](https://travis-ci.org/mojocn/base64Captcha.svg?branch=master)](https://travis-ci.org/mojocn/base64Captcha) +[![codecov](https://codecov.io/gh/mojocn/base64Captcha/branch/master/graph/badge.svg)](https://codecov.io/gh/mojocn/base64Captcha) +![stability-stable](https://img.shields.io/badge/stability-stable-brightgreen.svg) +[![Foundation](https://img.shields.io/badge/Golang-Foundation-green.svg)](http://golangfoundation.org) + +Base64captcha supports any unicode character and can easily be customized to support Math Chinese Korean Japanese Russian Arabic etc. + + +## 1. 📖📖📖 Doc & Demo + +* [English](https://godoc.org/github.com/mojocn/base64Captcha) +* [中文文档](https://mojotv.cn/go/refactor-base64-captcha) +* [Playground](https://captcha.mojotv.cn) + +## 2. 🚀🚀🚀 Quick start +### 2.1 🎬🎬🎬 Use history version +[Tag v1.2.2](https://github.com/mojocn/base64Captcha/tree/v1.2.2) + +` go get github.com/mojocn/base64Captcha@v1.2.2` + +or edit your `go.mod` file to + +`github.com/mojocn/base64Captcha@v1.2.2` + +### 2.2 📥📥📥 Download package + go get -u github.com/mojocn/base64Captcha +For Gopher from mainland China without VPN `go get golang.org/x/image` failure solution: +- go version > 1.11 +- set env `GOPROXY=https://goproxy.io` + +### 2.3 🏂🏂🏂 How to code with base64Captcha + +#### 2.3.1 🏇🏇🏇 Implement [Store interface](interface_store.go) or use build-in memory store + +- [Build-in Memory Store](store_memory.go) + +```go +type Store interface { + // Set sets the digits for the captcha id. + Set(id string, value string) + + // Get returns stored digits for the captcha id. Clear indicates + // whether the captcha must be deleted from the store. + Get(id string, clear bool) string + + //Verify captcha's answer directly + Verify(id, answer string, clear bool) bool +} + +``` + +#### 2.3.2 🏄🏄🏄 Implement [Driver interface](interface_driver.go) or use one of build-in drivers +There are some build-in drivers: +1. [Build-in Driver Digit](driver_digit.go) +2. [Build-in Driver String](driver_string.go) +3. [Build-in Driver Math](driver_math.go) +4. [Build-in Driver Chinese](driver_chinese.go) + +```go +// Driver captcha interface for captcha engine to to write staff +type Driver interface { + //DrawCaptcha draws binary item + DrawCaptcha(content string) (item Item, err error) + //GenerateIdQuestionAnswer creates rand id, content and answer + GenerateIdQuestionAnswer() (id, q, a string) +} +``` + +#### 2.3.3 🚴🚴🚴 ‍Core code [captcha.go](captcha.go) +`captcha.go` is the entry of base64Captcha which is quite simple. +```go +package base64Captcha + +import ( + "math/rand" + "time" +) + +func init() { + //init rand seed + rand.Seed(time.Now().UnixNano()) +} + +// Captcha captcha basic information. +type Captcha struct { + Driver Driver + Store Store +} + +//NewCaptcha creates a captcha instance from driver and store +func NewCaptcha(driver Driver, store Store) *Captcha { + return &Captcha{Driver: driver, Store: store} +} + +//Generate generates a random id, base64 image string or an error if any +func (c *Captcha) Generate() (id, b64s string, err error) { + id,content, answer := c.Driver.GenerateIdQuestionAnswer() + item, err := c.Driver.DrawCaptcha(content) + if err != nil { + return "", "", err + } + c.Store.Set(id, answer) + b64s = item.EncodeB64string() + return +} + +//Verify by a given id key and remove the captcha value in store, +//return boolean value. +//if you has multiple captcha instances which share a same store. +//You may want to call `store.Verify` method instead. +func (c *Captcha) Verify(id, answer string, clear bool) (match bool) { + match = c.Store.Get(id, clear) == answer + return +} + +``` +#### 2.3.4 🚵🚵🚵 ‍Generate Base64(image/audio) string +```go +func (c *Captcha) Generate() (id, b64s string, err error) { + id,content, answer := c.Driver.GenerateIdQuestionAnswer() + item, err := c.Driver.DrawCaptcha(content) + if err != nil { + return "", "", err + } + c.Store.Set(id, answer) + b64s = item.EncodeB64string() + return +} +``` +#### 2.3.5 🤸🤸🤸 Verify Answer +```go +//if you has multiple captcha instances which shares a same store. You may want to use `store.Verify` method instead. +//Verify by given id key and remove the captcha value in store, return boolean value. +func (c *Captcha) Verify(id, answer string, clear bool) (match bool) { + match = c.Store.Get(id, clear) == answer + return +} +``` + +#### 2.3.6 🏃🏃🏃 ‍Full Example + +```go +// example of HTTP server that uses the captcha package. +package main + +import ( + "encoding/json" + "fmt" + "github.com/mojocn/base64Captcha" + "log" + "net/http" +) + +//configJsonBody json request body. +type configJsonBody struct { + Id string + CaptchaType string + VerifyValue string + DriverAudio *base64Captcha.DriverAudio + DriverString *base64Captcha.DriverString + DriverChinese *base64Captcha.DriverChinese + DriverMath *base64Captcha.DriverMath + DriverDigit *base64Captcha.DriverDigit +} + +var store = base64Captcha.DefaultMemStore + +// base64Captcha create http handler +func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) { + //parse request parameters + decoder := json.NewDecoder(r.Body) + var param configJsonBody + err := decoder.Decode(¶m) + if err != nil { + log.Println(err) + } + defer r.Body.Close() + var driver base64Captcha.Driver + + //create base64 encoding captcha + switch param.CaptchaType { + case "audio": + driver = param.DriverAudio + case "string": + driver = param.DriverString.ConvertFonts() + case "math": + driver = param.DriverMath.ConvertFonts() + case "chinese": + driver = param.DriverChinese.ConvertFonts() + default: + driver = param.DriverDigit + } + c := base64Captcha.NewCaptcha(driver, store) + id, b64s, err := c.Generate() + body := map[string]interface{}{"code": 1, "data": b64s, "captchaId": id, "msg": "success"} + if err != nil { + body = map[string]interface{}{"code": 0, "msg": err.Error()} + } + w.Header().Set("Content-Type", "application/json; charset=utf-8") + json.NewEncoder(w).Encode(body) +} + +// base64Captcha verify http handler +func captchaVerifyHandle(w http.ResponseWriter, r *http.Request) { + + //parse request json body + decoder := json.NewDecoder(r.Body) + var param configJsonBody + err := decoder.Decode(¶m) + if err != nil { + log.Println(err) + } + defer r.Body.Close() + //verify the captcha + body := map[string]interface{}{"code": 0, "msg": "failed"} + if store.Verify(param.Id, param.VerifyValue, true) { + body = map[string]interface{}{"code": 1, "msg": "ok"} + } + + //set json response + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + json.NewEncoder(w).Encode(body) +} + +//start a net/http server +func main() { + //serve Vuejs+ElementUI+Axios Web Application + http.Handle("/", http.FileServer(http.Dir("./static"))) + + //api for create captcha + http.HandleFunc("/api/getCaptcha", generateCaptchaHandler) + + //api for verify captcha + http.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle) + + fmt.Println("Server is at :8777") + if err := http.ListenAndServe(":8777", nil); err != nil { + log.Fatal(err) + } +} +``` + + +## 3. 🎨🎨🎨 Customization +You can customize your captcha display image by implementing [interface driver](interface_driver.go) +and [interface item](interface_item.go). + +There are some example for your reference. +1. [DriverMath](driver_math.go) +2. [DriverChinese](driver_chinese.go) +3. [ItemChar](item_char.go) + +***You can even design the [captcha struct](captcha.go) to whatever you prefer.*** + +## 4. 💖💖💖 Thanks +- [dchest/captha](https://github.com/dchest/captcha) +- [@slayercat](https://github.com/slayercat) +- [@amzyang](https://github.com/amzyang) +- [@Luckyboys](https://github.com/Luckyboys) +- [@hi-sb](https://github.com/hi-sb) + +## 5. 🍭🍭🍭 Licence + +base64Captcha source code is licensed under the Apache Licence, Version 2.0 +(http://www.apache.org/licenses/LICENSE-2.0.html). diff --git a/vendor/github.com/mojocn/base64Captcha/bindata.go b/vendor/github.com/mojocn/base64Captcha/bindata.go new file mode 100644 index 00000000..0ea5157c --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/bindata.go @@ -0,0 +1,513 @@ +// Code generated by go-bindata. DO NOT EDIT. +// sources: +// fonts/3Dumb.ttf (142.224kB) +// fonts/ApothecaryFont.ttf (62.08kB) +// fonts/Comismsh.ttf (80.132kB) +// fonts/DENNEthree-dee.ttf (83.188kB) +// fonts/DeborahFancyDress.ttf (32.52kB) +// fonts/Flim-Flam.ttf (140.576kB) +// fonts/RitaSmith.ttf (31.24kB) +// fonts/actionj.ttf (34.944kB) +// fonts/chromohv.ttf (45.9kB) +// fonts/readme.md (162B) +// fonts/wqy-microhei.ttc (5.177MB) + +package base64Captcha + +import ( + "bytes" + "compress/gzip" + "crypto/sha256" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("read %q: %v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +type asset struct { + bytes []byte + info os.FileInfo + digest [sha256.Size]byte +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (fi bindataFileInfo) Name() string { + return fi.name +} +func (fi bindataFileInfo) Size() int64 { + return fi.size +} +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} +func (fi bindataFileInfo) IsDir() bool { + return false +} +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var _fonts3dumbTtf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x67\x9c\x64\x47\x75\x3f\x8c\x7f\xeb\x86\xba\xa1\x6e\xce\x9d\x6e\xe7\xee\x89\x3d\x33\x3d\xa1\x77\x36\xcc\xee\x4a\xbb\xd2\xae\xb4\x8a\x28\xec\xa2\x84\x24\x84\x02\x02\x64\x24\x40\x22\x48\x22\x09\xb4\x20\x91\x83\x04\x92\x88\x02\x11\x45\x74\x6b\x00\x83\x4d\x14\x71\xb0\xbd\xc8\xc0\x02\x32\x18\x83\xd7\x80\xb1\xb1\x0d\xc8\x68\xef\xff\x53\xb7\x67\x07\xc1\xff\xf7\xbc\x78\x9e\x57\x36\x3f\x97\xd4\x7d\xea\x56\x38\x75\xce\xa9\xaa\x13\xea\x56\xcf\x82\x00\x70\x08\x20\x01\xfb\xce\x7a\xdc\x9e\xa5\xed\x57\x9d\x04\x48\x87\x01\xfc\xe5\x69\x8f\x9b\xe9\xbf\xf8\xb2\xad\x27\x02\xe4\xa5\x00\x9e\x70\xce\xae\x53\xf6\x3f\xed\x4d\xcf\x7c\x18\x90\xdf\x02\xc8\x0f\x5f\xfa\x94\x8b\xaf\xf9\xfc\x4f\x7e\xb7\x07\x28\x7f\x09\x90\x9e\x74\xe9\x33\xaf\xab\x21\x00\x80\xc6\xbb\x01\x08\x4f\xba\xe6\xf2\xa7\xd0\x03\x6f\x1e\x00\xf5\x59\x80\x5c\x7b\xf9\xd5\x37\x3c\x69\x93\x34\x71\x29\xd0\x78\x1f\x04\xec\xbf\xe2\x89\x4f\xb9\xfe\x81\xfe\xea\x23\x00\xbb\x19\x70\xf7\x5c\x71\xd9\xc5\x4f\xfc\xb9\xff\xc9\xf7\x00\xc4\x00\xb0\x74\xc5\x15\x97\x5d\x4c\x9f\x2a\xde\x01\x90\x5d\x00\x5a\x57\x3c\xe5\xba\xeb\x1f\x78\x83\xf4\x04\x80\xfc\x14\x10\xfe\xfd\xea\xa7\x5d\x7a\x31\xbe\x75\xe3\xf5\x10\x9a\x12\x20\xfc\xe6\x29\x17\x5f\x7f\x8d\xf0\x88\x7a\x0b\x40\xae\x00\x50\x7b\xea\xc5\x4f\xb9\x4c\xbb\xf5\x86\x04\x42\xfb\x77\x80\xf8\xfa\x6b\x9e\x76\xed\x75\x95\x4f\x5d\x7a\x2a\x84\xf1\xd7\x02\xe4\x91\x6b\x9e\x7e\xd9\x35\x43\x60\x12\x68\xbc\x03\x5c\x02\x5c\x16\x04\x78\xea\xa6\x67\xde\x79\x91\xbd\xf5\x3f\x50\x10\x7f\xca\xb9\xf9\xdc\x1b\x17\xdf\xc4\xe1\xe7\xbf\x73\xfc\xc5\xd9\x9e\xa3\x82\x34\x25\x7d\x1e\x80\x06\x21\xef\x91\xf7\x11\x7e\x91\x51\x68\xd2\x72\xb6\x27\x7b\xb3\x34\xb5\x5e\xfe\xfb\xf4\xa9\xbc\xe4\x53\xc2\xb7\x90\x0a\x17\xc0\x5b\xaf\xd7\x01\x01\xe2\x19\x39\x1e\x51\xb0\xc8\x2b\x21\x43\x12\x3e\x29\x1c\x04\xf0\xf2\x11\x24\xdf\x43\x1f\x8f\x3c\x16\xd5\xcd\xc0\x07\x55\xe0\xa4\x60\xfd\xf9\x9a\x1b\x9e\x7e\x2d\x76\xa0\xd6\xf0\x72\x1a\x20\x7d\x9e\x1c\x1d\xd1\x04\x90\x7f\x17\x3e\xc9\x25\x01\x90\x0f\x8e\x5a\x73\xc8\x3f\xc2\x71\x80\x50\xcd\x32\xe1\x3c\x78\xc2\x3b\xa0\x08\x77\x41\x15\x14\x04\xe2\xf5\x88\x85\x1e\x2c\xd2\x46\x2a\xbc\x18\x81\xb0\x1b\x8c\xbc\x0f\x86\xa0\x20\x24\x07\xe1\x0b\x2f\x06\xc8\x36\x48\xc2\x33\xb2\x4c\x78\x49\xf6\x2b\xe1\x94\xec\x28\x99\x07\x25\x17\xc2\x11\x5e\x0e\x08\x77\xa2\x49\x36\x65\x19\x79\x15\x44\x72\x23\x2c\xf2\x46\x30\xf2\xb7\xf0\x85\x0c\x26\x11\xb3\xec\xff\xa9\x4e\xa4\xd9\x23\xc2\xc3\x90\x85\x37\x42\x13\x03\xd8\xc2\x79\x50\xc9\x4f\x10\x09\xbf\x02\x84\x8f\x40\x25\xf7\xa2\x2a\x5c\x0e\x53\xf8\x11\x20\x5c\x9d\x1d\x15\x77\x66\x99\xf0\x43\x40\x9c\xc9\x32\xe1\x64\x88\xc2\x27\x20\x09\x97\x43\x12\xee\x04\x13\x3e\x0f\x26\x56\xb2\xa3\xe2\x01\xe8\xe2\x87\xb3\xa3\xc2\x77\xb3\x4c\xf8\x5c\x96\x09\x1f\x02\xc8\xb3\x00\x71\x27\x40\x2e\x07\xc8\x2f\xa1\x8a\x27\x83\x0a\xa7\x62\x5c\x78\x2e\x98\xf0\x3a\x68\xc2\x04\x20\xbc\x02\x4c\xd8\x02\x9d\x7c\x10\x2b\xc2\x34\x34\xe1\x12\x80\xec\x85\x40\x76\x67\xdf\x16\xce\xca\x32\x32\x8d\x31\xb1\x08\x43\x38\x17\xae\xd0\x87\x2f\x7c\x11\x55\xf2\x6b\x10\xf2\x10\x1c\xf2\xb5\x2c\x23\x9f\x86\x25\x44\x80\xf0\x43\x04\xe2\x9d\x50\xc5\x53\x01\xe1\xaf\xb2\xa3\xc2\xb9\x80\x30\x89\x3e\xd9\x0c\x46\x1e\x81\x23\xfc\x1a\x89\x60\xc0\x26\x7b\x41\x84\xbd\x70\xc8\x43\x80\xf8\x55\x88\xe4\xc3\x30\xc8\x0b\x60\x88\x3b\xf1\x54\xb2\x15\x01\xb9\x05\xa1\x70\x22\x44\x61\x33\x64\x72\x2f\x8a\xe2\x19\x60\xd2\x32\x0c\xe1\x47\xb0\xa4\x09\x04\xe4\x95\xf0\xc4\x9d\x38\x53\x7c\x1c\xea\xc2\x4b\x61\x8b\x17\xa2\x44\x6e\x81\x43\x3e\x84\x48\xbc\x10\x9e\xf0\x04\xc4\x82\x08\x55\xb8\x31\xcb\x84\xef\x01\xc2\xd7\x61\x91\x43\x28\xe7\x3c\xff\x9f\x3e\x5b\xa0\xff\xc1\xe7\x18\x9f\xa3\x8f\x2c\xf4\xe1\xf0\x3c\x79\x08\x6e\xce\x67\xfe\xc9\x7e\x9c\x43\xce\x27\xff\xdc\x0b\x8b\x5c\x08\x08\xcf\xfd\xfd\x3c\xe5\x73\x52\xc9\x8e\x92\x53\xb3\x8f\x91\x7b\x91\xe6\x73\x77\x1e\x54\xfe\xe1\xf3\xff\x98\xcf\x11\x0e\xc9\xbd\xd9\x0f\x79\x1b\xb2\x37\xdb\x43\xee\xcd\xde\x4f\xf6\x66\xf7\x90\xbd\xd9\xdb\x8f\xe1\xc9\x71\xce\x8c\xe6\x96\xdc\x9b\xfd\xd3\x3a\x2e\xc2\xe7\x97\x97\xf1\x1d\x47\x08\x21\xfb\xb6\x10\xb2\x8b\x74\x08\x21\x03\xb2\x8b\x90\x7d\xbc\x6c\x66\x92\xfc\x41\xca\x1f\x79\xcd\x2e\x42\xb6\x8c\x8a\x76\xed\x5a\xaf\x9b\x1f\x81\xc6\xfa\xe3\xbe\xbc\xcd\x3c\xd9\x78\x9c\xcf\xdb\xec\xfa\x83\xc6\xf9\x20\xfb\xf8\xc8\x5b\x8e\xd5\xfc\xbe\x72\x63\xc8\xf5\x01\x37\x08\xe0\xc9\xf8\x7d\x8b\xf5\x2d\x8b\xd1\x83\x81\xdf\xa8\x19\x54\xe8\xd9\x7f\x41\x03\xcb\xfe\x0b\x3a\xcc\xec\x11\x30\x58\xd9\x23\x30\x60\x67\xbf\x85\x09\x27\xfb\x2d\x2c\x78\xd9\x6f\x60\xc3\xcf\x7e\x03\x07\x41\xf6\x6b\xb8\x08\xb3\x5f\xc3\x43\x94\xfd\x27\x7c\x24\xd9\x7f\x22\x40\x21\xfb\x0f\x84\x28\x66\xff\x81\x08\xa5\xec\xdf\x11\xa3\x92\xfd\x3b\x12\xa4\xd9\xaf\x50\x40\x35\xfb\x15\x8a\xa8\x65\xff\x86\x12\xea\xd9\xbf\xa1\x8c\x66\xf6\xaf\xa8\xa0\x95\xfd\x2b\x52\xb4\xb3\x5f\xa2\x8a\x4e\xf6\x4b\xd4\x30\x96\xfd\x0b\xea\x18\xcf\xfe\x05\x0d\x4c\x64\xbf\x40\x13\x93\xd9\x2f\xd0\xc2\x54\xf6\x73\xb4\xd1\xcb\x7e\x8e\x0e\x66\xb2\x9f\xa1\x8b\xd9\xec\x67\x18\xc3\x5c\xf6\xcf\x18\xc7\x7c\xf6\xcf\x98\xc0\x42\x76\x04\x93\x58\xcc\x8e\x60\x0a\x4b\xd9\x3f\x61\x1a\x83\xec\x9f\xd0\xc3\x72\xf6\x53\xcc\x60\x73\xf6\x53\xcc\x62\x4b\xf6\x13\xcc\x61\x6b\xf6\x13\xf4\xb1\x92\xfd\x23\xe6\xb1\x3d\xfb\x31\x16\xb0\x23\xfb\x31\x16\xb1\x33\xfb\x07\x2c\xe1\xb8\xec\x1f\x30\xc0\xae\xec\x47\xd8\x84\xdd\xd9\x8f\xb0\x8c\x13\xb2\x1f\x62\x33\x4e\xcc\x7e\x88\x2d\xd8\x9b\xfd\x3d\xb6\xe2\xa4\xec\xef\xb1\x0d\x27\x67\x0f\x63\x05\xfb\xb2\x87\xb1\x1d\xa7\x64\x3f\xc0\x0e\x9c\x96\xfd\x00\x3b\x71\x7a\xf6\x7d\x1c\x87\x33\xb2\xef\xe3\x78\x9c\x99\x7d\x0f\xbb\x70\x56\xf6\x3d\xec\xc6\xd9\xd9\x61\x9c\x80\x73\xb2\xc3\x38\x11\xe7\x66\xdf\xc5\x1e\xec\xcf\xbe\x8b\xbd\x78\x7c\xf6\x1d\x9c\x84\xf3\xb2\xef\xe0\x64\x9c\x9f\x7d\x1b\xfb\x70\x41\xf6\x6d\x9c\x82\x8b\xb2\xbf\xc3\xa9\x78\x42\xf6\x77\x38\x0d\x17\x67\x0f\xe1\x74\x5c\x92\x3d\x84\x33\x70\x69\xf6\x2d\x9c\x89\xcb\xb2\x6f\xe1\x71\x78\x52\x76\x08\x67\xe1\xf2\xec\x10\xce\xc6\x15\xd9\xdf\xe2\x1c\x5c\x95\xfd\x2d\xce\xc5\x93\xb3\xbf\xc1\x7e\x5c\x9d\xfd\x0d\x0e\xe0\x29\xd9\x5f\xe3\xf1\x78\x6a\xf6\xd7\x38\x0f\xd7\x64\xdf\xc4\xf9\xf8\xb3\xec\x9b\xb8\x00\x4f\xcf\xd6\x70\x21\xae\xcd\xd6\x70\x11\xae\xcb\xbe\x81\x27\xe0\x99\xd9\x37\x70\x31\x9e\x95\x7d\x1d\x97\xe0\xfa\xec\xeb\xb8\x14\x37\x64\x5f\xc3\x13\xf1\x9c\xec\x6b\xb8\x0c\xcf\xcd\xbe\x8a\x27\xe1\x79\xd9\x57\x70\x39\x6e\xcc\xbe\x82\x2b\x70\x53\xf6\x65\x5c\x89\xe7\x67\x5f\xc6\x55\x78\x41\xf6\x20\x9e\x8c\x17\x66\x0f\xe2\x6a\xbc\x28\xfb\x12\x9e\x82\x5b\xb2\x2f\xe1\xa9\x78\x49\xf6\x45\x3c\x0d\x2f\xcd\xbe\x88\x6b\x70\x6b\xf6\x05\xfc\x19\x0e\x66\x5f\xc0\xd3\xf1\xf2\xec\xf3\xb8\x16\xb7\x65\x9f\xc7\x75\xb8\x3d\xfb\x1c\x9e\x81\x57\x64\x9f\xc3\x33\xf1\xaa\xec\xb3\x78\x16\x5e\x9d\x7d\x16\xd7\xe3\x35\xd9\x5f\xe1\x06\xbc\x36\xfb\x2b\x3c\x1b\xaf\xcb\xfe\x12\xcf\xc1\x1b\xb2\xbf\xc4\x73\xf1\xc6\xec\x33\x78\x1e\xee\xc8\x3e\x83\x1b\x71\x67\xf6\x69\xdc\x84\x37\x67\x9f\xc6\xcd\xb8\x2b\xfb\x0b\x3c\x1f\x77\x67\x7f\x81\x17\xe0\x9e\xec\x53\x78\x21\xde\x92\x7d\x0a\x2f\xc2\xdb\xb2\x4f\xe2\xc5\x78\x7b\xf6\x49\xdc\x82\x77\x64\x9f\xc0\x4b\xf0\xce\xec\x13\x78\x29\xde\x95\xad\xe2\x56\xbc\x3b\x5b\xc5\x41\xdc\x97\x3d\x80\x97\xe1\x3d\xd9\x03\x78\x39\xde\x9b\x0d\x71\x1b\xde\x9f\x0d\x71\x3b\x3e\x90\xfd\x39\x5e\x81\x0f\x66\x7f\x8e\x57\xe2\xfe\xec\xe3\x78\x15\x3e\x9c\x7d\x1c\xaf\xc6\x47\xb2\x8f\xe1\x35\xf8\x68\xf6\x31\xbc\x16\x1f\xcb\x3e\x8a\xd7\xe1\xe3\xd9\x47\xf1\x7a\x0c\xb3\x8f\xe0\x0d\x78\x20\xfb\x30\xde\x88\xd5\xec\xc3\xb8\x03\x9f\xc8\x3e\x84\x3b\xf1\xa9\xec\x43\x78\x13\xfe\x22\xbb\x1f\x6f\xc6\xa7\xb3\xfb\x71\x17\x3e\x93\x7d\x10\x77\xe3\x2f\xb3\x0f\xe2\x1e\x7c\x36\xfb\x00\xde\x82\xcf\x65\x1f\xc0\x5b\xf1\xf9\xec\xfd\x78\x1b\xbe\x90\xbd\x1f\x6f\xc7\x97\xb2\xf7\xe1\x1d\x78\x30\x7b\x1f\xde\x89\x2f\x67\xef\xc5\xbd\xf8\x4a\xf6\x5e\xbc\x0b\x5f\xcd\xde\x83\x77\xe3\xeb\xd9\x7b\x70\x1f\xbe\x91\xdd\x87\xf7\x60\x2d\xbb\x0f\xef\xc5\x37\xb3\x77\xe3\x7d\xf8\x9b\xec\xdd\x78\x3f\xfe\x36\x7b\x17\x3e\x80\x43\xd9\xbb\xf0\x41\x7c\x2b\xbb\x17\xf7\xe3\xa1\xec\x5e\x7c\x08\xdf\xce\xde\x89\x0f\xe3\x3b\xd9\x3b\xf1\x11\x7c\x37\x7b\x07\x3e\x8a\xc3\xd9\x3b\xf0\x31\x7c\x3f\x7b\x3b\x3e\x8e\x1f\x64\x6f\xc7\x9f\xe3\xe1\xec\x6d\x18\xe2\xef\xb3\xb7\xe1\x01\xfc\x30\x7b\x2b\x56\xf1\x0f\xd9\x5b\xf1\x09\xfc\x38\x7b\x0b\x3e\x89\x7f\xcc\xde\x82\x4f\xe1\x27\xd9\x3d\xf8\x0b\xfc\x34\xbb\x07\x9f\xc6\x91\xec\x6e\x7c\x06\xff\x9c\xdd\x8d\xbf\xc4\xcf\xb2\xbb\xf0\x57\xf8\x79\x76\x17\x3e\x8b\x7f\xc9\xde\x8c\xcf\xe1\x97\xd9\x9b\xf1\x79\xfc\x6b\xf6\x26\x7c\x01\xff\x96\xbd\x09\x5f\xc4\xaf\xb2\x3b\xf1\x25\xfc\x47\x76\x27\x1e\xc4\x7f\x66\x77\xe0\xcb\xf8\x75\xf6\x46\x7c\x05\xbf\xc9\xde\x88\xaf\xe2\x91\xec\x0d\xf8\x1a\xfe\x2b\x7b\x03\xbe\x8e\xdf\x65\xaf\xc7\x37\xf0\x68\xf6\x7a\xac\xe1\x68\xf6\x3a\x7c\x93\x20\x7b\x1d\xfe\x9a\x90\xec\xb5\xf8\x1b\x22\x64\xaf\xc5\xdf\x12\x31\x7b\x0d\x0e\x11\x39\x7b\x0d\xbe\x45\x68\xf6\x6a\x3c\x44\x94\xec\xd5\xf8\x3b\xa2\x66\xaf\xc2\xb7\x89\x96\xbd\x0a\xdf\x21\x2c\x7b\x25\xbe\x4b\x8c\xec\x95\x38\x4c\xcc\xec\x15\xf8\x1e\xb1\xb2\x57\xe0\xfb\xc4\xc9\x6e\xc7\x0f\x88\x9b\xdd\x8e\x87\x89\x97\xdd\x86\xbf\x27\x7e\x76\x1b\x7e\x48\x82\xec\xe5\xf8\x11\x89\xb2\x97\xe3\x1f\x48\x9c\xbd\x0c\x3f\x26\x49\xf6\x32\xfc\x23\x29\x64\x07\xf1\x13\x52\xca\x0e\xe2\xa7\xa4\x9c\xdd\x8a\x7f\x22\x95\xec\x56\x1c\x21\x69\xf6\x52\xfc\x33\xa9\x66\x2f\xc5\xcf\x48\x3d\x7b\x09\x7e\x4e\x1a\xd9\x4b\xf0\x0b\xd2\xcc\x6e\xc1\xbf\x90\x56\x76\x0b\x7e\x49\x3a\xd9\x8b\xf1\xaf\xa4\x9b\xbd\x18\xff\x46\xc6\xb2\x17\xe1\x57\x64\x3c\x7b\x11\xfe\x9d\x4c\x64\x2f\xc4\x7f\x90\xa9\xec\x85\xf8\x4f\x32\x9d\xbd\x00\xbf\x26\xbd\xec\x05\xf8\x0d\x99\xc9\x9e\x8f\xdf\x92\xb9\xec\xf9\x78\x84\xf4\xb3\x9b\xf1\x5f\x64\x3e\xbb\x09\xbf\x23\x0b\xd9\x4d\x78\x94\x2c\x66\x37\xe2\x28\x19\x64\x37\x82\xfb\x42\xcf\x03\x10\x03\xf8\x8c\xa6\x4b\x90\x24\x99\xca\x94\xca\xaa\x2c\x52\x2a\xc9\x12\x95\x28\x95\x45\x59\xa1\xa2\x24\x4a\x92\x22\x8c\x80\xa2\x50\x45\x96\x15\x2a\x51\x85\xaa\x8a\x22\x53\x4a\xa9\xaa\x6a\x0a\xa5\xa2\x2a\x49\x2a\x47\x40\x65\x49\x96\x45\x51\x16\x15\x9e\x97\x25\x49\x56\x54\x95\xca\x54\x94\x15\x59\xa4\x92\x2e\x89\xaa\x28\xc9\x54\x52\x75\x45\x97\x54\x95\xaa\x92\xa4\x51\x99\xf2\xd6\x79\x92\x37\x92\xc4\xbf\xa8\x42\x45\xaa\x28\x8a\x2a\x4a\x7c\x64\x9e\x24\x45\x94\x44\x91\xe7\xa8\x24\xcb\x2a\x85\xce\x38\xfd\x54\xa1\x8a\x22\xab\x94\xd3\x4f\xa5\x1c\x9d\x28\x2b\x8a\x28\x49\x92\xac\x8a\x23\xa0\x2a\x8a\x4a\x65\x55\x91\x14\x4e\xbf\x9a\x77\x51\x35\x8d\x23\x55\x25\x59\xa5\xbc\x80\x73\x2e\x8a\x54\x54\x73\x5e\x65\x49\x56\x34\x95\x33\x98\x8b\x46\x66\x92\xa4\x8a\x12\xa5\x92\xca\x14\x26\x69\x1a\xd5\x24\x99\xd3\xcf\x9b\xfc\x51\xca\x99\x50\xf2\xc1\x54\x55\x15\x25\x95\xcb\x4a\x55\x55\x8e\x40\x14\x79\x4e\x91\x28\x55\x15\x30\x43\x06\xe7\x94\x73\xa4\x53\x51\x51\x64\x45\x52\x64\x45\xe1\x63\xfe\x21\xfd\x9a\xaa\x68\x8a\xac\xaa\x1c\xad\xa6\x6a\x7c\x0e\x54\x4d\xd3\x39\x52\x4d\x96\x35\xca\xd9\xe2\xc2\x94\x24\x45\xd4\x38\x8b\x54\x96\xa9\xaa\x6b\xaa\xa2\x88\x54\xa5\x92\x22\x1b\xb2\xa4\x89\x12\x55\x64\xcd\x50\x0d\x49\xd7\x14\x4d\x92\x75\x85\xf2\x39\xca\x85\x9b\xb3\x31\xe2\x65\x7d\x76\x15\x49\x55\x35\x8d\xb3\xa9\x28\x1a\x4f\xb2\x26\xc9\x92\xc8\x73\xaa\xac\x28\x9a\x0a\xc3\xcc\xe9\x57\x39\x12\xa6\x48\xaa\x22\x2b\xb2\xca\x85\xcd\x25\xce\x67\x91\x6a\xe2\x08\x68\x1a\x5f\x2c\x9a\x2a\xab\x9a\xa2\x6b\xba\xa2\xe6\xe4\x33\x8e\x49\x97\xa9\xae\xa8\x39\x7f\x0a\xa7\x5f\xd2\x15\x85\x2f\x2c\x99\x6a\x4c\x57\x15\x45\xa2\x1a\x95\x14\x6a\xca\xb2\x2e\xc9\x8a\x22\xeb\xa6\x66\xca\xba\xae\xea\x32\x65\x0a\x55\x35\x6d\x24\x5c\x55\xd9\x48\x39\x13\xaa\xa6\x4a\xaa\xa6\xeb\x39\x9b\xeb\xf4\xeb\x92\x2c\x49\xba\xae\xeb\x9a\xac\x28\xba\x06\xd3\xa2\x18\x2d\x64\x55\x31\x38\xbb\x74\x44\xbf\x2a\x51\xce\xb7\x2c\x53\x7d\x44\x3f\xef\xa2\xab\x54\xd7\x64\x4d\x57\x99\xce\x54\x2d\x27\xdf\xd0\x35\x4d\x66\x94\x32\xbe\x15\x34\x2e\x4c\x49\x52\x25\x9d\xf3\xa2\x50\xaa\xe8\x06\xd3\x54\x55\x52\x74\x45\x52\xa9\xc5\x97\x10\x9f\x41\x66\xe9\x96\xcc\x98\xca\x64\x6a\xa8\x8a\xaa\x6b\xca\xef\xe9\x1f\x31\x91\x4f\x88\x96\x0f\xc6\x74\x5d\x92\x99\xaa\x72\xa2\x75\x8e\x80\xd3\xcf\x98\x26\xab\x2a\xd3\x60\x3b\x9c\x7e\x4d\xd3\x74\x5d\x35\x55\x49\xd7\xa8\x4a\x75\xca\x7b\x2a\xba\xce\x67\x51\x31\xa4\x11\x60\x4c\x37\x34\x85\xe9\x54\x67\x9a\xc1\x0c\x4d\xd7\x74\xdd\x30\x2d\xc6\x74\x6a\x52\xc5\xe4\x08\x78\x6f\xbe\x96\x64\x43\x57\x19\x27\x44\x65\x96\xc9\x34\x4d\x56\x99\x2a\x6b\x8a\xc3\xa7\x80\x6a\x1a\x35\x1d\xe6\x50\xd3\xd4\x4d\xaa\x58\x9a\xaa\x33\x36\x22\x4e\xcf\x45\x3c\xe2\x84\x7f\x31\xa6\xcb\x1a\x33\x0c\x43\xa6\x86\xc6\xc7\x34\x0c\x6a\x70\xc5\x60\x18\x86\xc1\xa8\xa6\x99\x0c\x8e\xab\x80\x73\xca\x91\x58\x9a\xcc\x17\x25\xd5\x69\x3e\x3d\x8c\xc9\x94\x2a\x23\xfa\x15\x85\x77\x31\x75\xd5\x60\x8a\x6e\xe8\xa6\x61\x6a\x4c\x67\xcc\xb0\x6c\x83\x31\x6a\x52\xd5\xe4\x4b\x89\x69\x8a\xa6\xcb\xb2\x2e\x9b\xba\xc6\xf8\xc2\xd7\x0c\xdb\x62\xba\x26\xab\x86\x2a\x6b\xaa\xbb\x4e\xbf\x62\xb9\x86\x4b\x4d\x4b\xb7\x46\xf4\x1b\x8f\xa5\x7f\x9d\x09\xfe\xc5\x18\xa3\xba\x61\x9a\x86\xac\x98\xba\xce\x89\x36\x14\x53\x56\x64\xd9\x34\x4d\x93\x29\xba\x6e\x32\xb8\x1e\xa7\x5f\xcf\x67\xc4\xd1\x64\xa6\x2b\x9a\xc2\x28\xe7\x9c\xd3\xcf\x45\x68\x4a\x23\x60\x9a\x9c\x7e\xd3\x50\x98\xc9\x2c\xd3\xd2\x0d\x9d\x19\xa6\xed\x70\xa1\x58\x8a\x6a\x71\x04\x86\xae\x68\x3a\xa5\xba\x6c\xe9\xba\xc1\x25\xa9\x99\x8e\x65\xe8\xba\xac\x99\x1a\xd5\x55\x4f\x51\x2c\x3e\xad\x8a\xe5\x99\x9e\x62\x59\xcc\x56\x54\x5b\xe7\x12\x56\x59\x9e\xf4\x8d\x94\xd3\xcf\x51\x33\xd3\xb2\xf8\x34\xe9\x3a\x27\xda\x54\x2c\xbe\xc1\x2d\xcb\xb2\x0c\x45\xd7\x2d\x03\x7e\xa8\x82\xcf\x14\x33\x4d\xdd\x65\x94\x8b\x42\x31\x14\x3e\x3d\xaa\x69\xf2\x6d\xad\xd9\xf2\x08\x58\x96\x69\x33\xdd\x32\x55\xc3\x32\x1c\xcb\x66\xa6\x61\x5a\x8e\xe3\x59\xa6\xa9\x38\xaa\xe6\x30\xc3\x64\x26\x53\x99\x41\x29\x93\x6d\x83\x59\xb9\x30\x2d\xcf\x31\x19\xa3\x9a\xa5\x53\xa6\x05\xaa\xe2\x50\x85\x31\xd5\x09\xad\x40\x75\x1c\xc3\x51\x34\xd7\xd0\x0d\xcb\xd2\x72\xe1\x1a\x6c\x23\x69\x9c\x09\x4e\xaf\x61\xd9\xb6\x43\x55\x9b\x31\xdb\xb2\x6d\x5b\xb5\xa9\x4a\xa9\x6d\xdb\xb6\xa9\x32\xe6\x98\x08\x63\x0d\x9c\x53\xd3\xb2\x98\x67\x50\xcb\xd0\x98\x6a\x29\xa6\x65\x50\xd5\xb2\x14\x55\xd5\x74\x47\x1e\x01\xc7\xb6\x5c\x93\x39\xb6\x66\x39\xa6\xeb\xb8\x86\x6d\x5a\xb6\xeb\x05\xb6\x6d\xa9\x9e\xaa\x7b\x86\x69\x19\x96\xa1\x19\xa6\xa2\x98\xd4\x35\x0d\x9b\xe9\xba\xc6\x1c\xdf\xb3\x4d\x43\xd1\x1d\xa6\x18\x7a\xa8\xa9\x9e\xa2\x1a\x86\xe6\xc5\x4e\xa4\xba\x9e\xe5\xa9\x9a\x67\x32\xd3\xb6\x47\xc2\x35\x39\x0f\xf9\x97\xa1\x73\x26\x6c\xdb\x52\x4c\xc7\x75\x5d\x45\x73\x4d\xd3\xe1\x49\x73\xb9\x62\x70\x5d\xd7\xb5\x35\xd3\xf4\x6c\x24\x45\x1d\xba\x6e\x5b\x96\xe3\x1a\x91\xa9\xd8\x96\x6e\x68\xb6\x6a\x3b\x96\xa2\x3a\x0e\xd7\x93\xcc\xa3\x23\xe0\x7b\x8e\x6f\x19\x9e\xab\xdb\x9e\x1d\x78\x81\xe5\xda\x8e\xeb\x87\xb1\xe7\xba\x5a\xa0\x19\x81\x65\x3b\xa6\x63\xe9\xa6\xad\xaa\x96\xe2\x5b\xa6\x6b\xf2\x49\xf5\xa2\xc0\xe5\x53\xe6\x99\xaa\xc5\x12\x5d\x0b\x54\xcd\x32\xf5\xa0\xe8\x15\xf5\x20\x70\x42\x4d\x0f\x6d\xc3\x76\x5d\xc3\xce\x13\x5f\x17\x56\xce\x09\xe3\x5f\xae\xeb\xa8\xb6\x17\xf8\xbe\xaa\x07\x96\xe5\xf3\xa4\x07\xaa\xae\xaa\xbe\x1f\x04\xae\x6e\x59\x81\x8b\x52\xc5\x80\x61\x38\xb6\xe3\x79\x56\x62\xab\xae\x63\x58\xcc\xd5\x78\x4f\xcd\xf3\xb8\x9e\x34\x43\x65\x04\xc2\xc0\x0b\x1d\x33\xf0\x99\x1b\xb8\x51\x10\x39\xbe\xeb\xf9\x61\x5c\x0c\x7c\x5f\x8f\x34\x33\x76\x5c\xcf\xf6\x6c\xc3\x76\x34\xcd\x51\x43\xd7\xf6\x2d\xd3\x30\xac\xa0\x10\xfb\x8e\xa3\x5a\xa1\xa5\xd9\x66\xc9\xd0\x23\x8d\x39\x36\x8b\x2b\x41\x85\xc5\xb1\x17\x33\x23\x71\x2c\x37\xf0\x4d\x37\x4f\x9c\x07\x27\xe7\xc4\xe4\x9c\xf8\xbe\xa7\xb9\x41\x14\x85\x1a\x8b\x1c\x27\xe4\x89\x45\x1a\xd3\xb4\x28\x8a\x22\x9f\x39\x4e\xe4\xa3\x52\x35\xc1\xe7\xc6\x0d\x7c\xbb\xe0\x68\xbe\x6b\xd8\xcc\xd7\x3d\xdf\xd5\x34\xdf\xe7\x3a\xcb\x8a\xd4\x11\x88\x42\x3f\x76\xad\x28\x30\xbc\xd0\x4b\xc2\xc4\x0d\x3c\x3f\x88\x0b\xa5\x30\x0c\x58\xa2\x5b\x89\xeb\xf9\x8e\xef\x9a\x8e\xa7\x6b\xae\x16\xbb\x4e\x68\x9b\xa6\x69\x87\xa5\x42\xe0\xba\x9a\x1d\xd9\xba\x67\x55\x4c\x96\x68\xcc\x75\x8c\x42\x35\xac\x1a\x49\xc1\x2f\x30\xb3\xe0\xda\x7e\x14\x5a\x5e\x9e\x5c\xd7\x75\xdc\x7c\x9d\xf0\xb5\x6e\x07\x41\xa0\xfb\x61\x12\xc7\xba\x91\xb8\x2e\x27\x3a\x32\x12\xdd\xd0\xf5\x38\x4e\x92\xd0\x70\xdd\x24\x44\xad\x69\xc1\xb2\x7c\xcf\x8f\x42\xb7\xe2\x69\xa1\x67\x39\x66\xa8\x07\xa1\xaf\xb3\x30\xe4\x7a\xd2\x2e\xa8\x23\x50\x48\xc2\x82\xef\x24\x91\x15\x24\x41\x31\x29\xfa\x51\x10\x46\xc5\x52\x1a\xc7\x91\x51\x32\x9c\x92\x1f\x84\x5e\xe8\x59\x5e\xc0\x74\x5f\x2f\x04\x5e\xec\xd8\xb6\xe5\x26\x69\x29\xf6\x3d\xdd\x49\x5c\xe6\xdb\x35\xcb\x28\xe9\x86\xef\x5b\xa5\x66\xd2\x30\x8b\xa5\xb0\x6c\x98\xa5\xc0\x09\xe2\x98\x93\x1a\x04\x01\xe7\xc1\xcf\x39\xb1\xf9\x74\xc4\x51\xc4\xc2\xa4\x58\x2c\x32\xab\xe8\xfb\x05\x9e\xac\x22\xb3\x18\x2b\x16\x8b\xc5\xd8\xf2\xfd\x52\x8c\x7a\x6b\x44\x7f\x10\xc5\x6e\xc5\xd3\x43\xdf\x72\xcd\x90\x85\x39\xfd\x11\xdf\x56\x76\x41\x1b\x81\x62\x12\x15\x03\xa7\x10\x73\xfa\xcb\x49\xc9\x8f\x83\x28\x29\x95\xab\x49\x1c\x73\xfa\xcb\x7e\x18\x79\xa1\xcf\xe9\x67\x81\x5e\xe4\x73\x65\xdb\xb6\x97\xa4\xe5\x38\xf0\x74\xb7\xe0\xb2\xc0\xa9\x5b\x66\x49\x37\x7d\xdf\x2a\xb7\x92\xa6\x59\x2a\x87\x65\xd3\xaa\x04\x6e\x98\x24\x76\xbe\x38\x42\xbe\xc2\x83\x7c\x9d\x3b\x9c\x09\x2e\x9a\x30\x29\x15\x4b\xcc\x2a\x05\x01\x27\xba\x68\x95\x46\xf4\x97\x4a\xb1\x15\x04\xa5\x18\xed\x31\x07\x8e\x13\x06\x51\xa1\xe0\xd7\x42\x96\x84\x8e\x6f\x27\x46\x9c\x44\xcc\x48\x0a\x86\x6d\xd9\x6e\x59\x1f\x81\x4a\xa9\x50\x89\xbc\x72\xd1\x89\x4b\x71\xb5\x94\x46\xc5\xb8\x50\xac\xd4\x9a\xa5\x62\xd1\xaa\x5a\x5e\x35\x4a\x92\x30\x09\x9d\x30\x36\x8c\x88\x55\xe2\xb0\xe8\x7b\xae\x1b\x94\x1a\xd5\x22\x5f\x72\x65\xdf\x08\xdd\xb6\x63\x55\x0d\x2b\x0a\x9d\xea\x58\xa9\x6b\xa7\xd5\xa4\x66\x39\xb5\xd8\x4f\x4a\x25\x37\xc9\x13\xe7\x21\xca\x39\x71\xf9\x74\x14\x8b\x05\x33\x29\xa5\x95\x8a\xe1\xa4\x51\x54\xe1\xc9\x49\x0d\xc7\x30\x2a\x95\x34\x2d\x3a\x51\x54\x2d\x62\x62\xda\x83\xe7\x25\x71\xa1\x5c\x8a\xda\xb1\x51\x4a\xbc\xc8\x2d\x99\xc5\x52\xc1\xb4\xcb\x65\xae\x27\x83\x1a\x1b\x81\x5a\xb5\x5c\x2f\x04\xb5\x8a\x57\xac\x16\x9b\xd5\x46\xa1\x52\x2c\xa7\xf5\xd6\x58\x35\xad\x38\x4d\x27\x6c\x16\x4a\xe5\xb8\x9c\x78\x71\xd1\xb2\x0a\x46\xbd\x90\xa4\x61\xe0\xfb\x51\xb5\xdb\x4a\x0b\xb1\x19\xd6\x22\x2b\x09\xc6\x3d\xa7\x69\x3a\x49\xe2\xb5\xa6\xab\xd3\x6e\xb3\x55\x6a\x39\x7e\xab\x10\x95\xd2\xd4\x2f\xe5\x89\xf3\x50\xc8\x39\x09\xf8\x62\x4f\x2b\x65\xbb\x58\x6d\xd4\xeb\x96\xd7\x28\x14\xea\xb5\x7a\xbd\xee\x35\x2c\xcf\xb2\xea\xf5\x46\x23\xf5\x0a\x85\x66\x8a\x5e\x3f\x40\x10\x14\x0b\xe5\x6a\x35\x19\x2f\x9a\x69\x29\x48\xbc\xd4\xae\xa4\x25\xcb\x4d\xab\x96\xe7\xf9\x51\xd3\x18\x81\x56\xa3\xda\x2a\xc7\xcd\x9a\x5f\x6e\x54\x3a\x8d\x76\xa9\x56\xae\xd6\xda\xdd\xa9\x46\xbd\xe6\x76\x9c\xb8\x5b\xaa\xa4\x85\xb4\x18\x14\xcb\xb6\x5d\xb2\xda\xe5\x62\x3d\x8e\xc2\xb0\xd0\x98\xe8\xd6\xca\x45\x2b\x6e\x26\x76\x31\x9a\x0e\xbc\x8e\xed\x95\x8a\x7e\xb7\xdf\x98\xf3\x3a\xdd\x74\xcc\x0b\xba\xe5\xa4\xd2\xa8\x87\xb9\x70\x2b\x7c\x85\x94\xf3\x75\x12\xf1\xc5\x5e\xab\x55\x9d\xb4\xd1\x6e\xb7\x6d\xbf\x5d\x2e\xb7\x78\xf2\xdb\xb6\x6f\xdb\xed\x76\xbb\x5d\xf7\xcb\xe5\x4e\x1d\xfd\xa5\x08\x51\x54\x29\xa5\x8d\x7a\x71\xaa\x6c\xd7\x2a\x61\x31\xa8\x39\xd5\x5a\xc5\xf6\xea\x75\x27\xf0\x83\xb8\x63\x8e\x40\xb7\x5d\xef\xa6\x49\xa7\x19\xa6\xed\xea\x44\x7b\xbc\xd2\xac\xd6\x5b\x63\x93\x33\xed\x66\xc3\x9f\x70\x0b\x13\x69\xad\x5e\xae\x57\xa2\x72\xd5\x71\x52\x7b\x2c\x2d\xb7\x0a\x71\x1c\x95\xda\xbd\x89\x66\x5a\x76\x8a\x9d\xa2\x93\x26\x73\x91\x3f\xe1\x04\x95\x72\x38\xb1\xd4\x5e\x0c\xc6\x27\x6b\x93\x41\x34\x99\x16\x6b\xed\x56\x52\xcb\x53\xa5\x52\x29\xa7\x65\x9e\x12\x3e\x1d\xcd\x66\xc3\xab\xb5\xc7\xc7\xc6\xdc\x70\x3c\x4d\xbb\x3c\x85\xe3\x4e\xe8\x38\x63\x63\xe3\xe3\xcd\x30\x4d\x27\x9a\x58\xda\x1c\x23\x8e\xab\x95\x7a\xbb\x55\x9e\x4d\x9d\x66\x2d\x2e\x87\x4d\xb7\xd1\xac\xb9\x7e\xb3\xe5\x46\x61\x54\x18\xb7\x46\x60\x62\xac\x35\x59\x2f\x8e\xb7\xe3\xfa\x58\x7d\x7a\x6c\xaa\xd6\xa9\xb7\xba\x93\xbd\xf9\x6e\xa7\x1d\x4c\xfb\xa5\x5e\xad\xd1\x4a\x9b\xd5\x38\xad\x7b\x5e\xcd\x99\xac\xa5\x9d\x72\xa1\x90\x54\xc6\xfa\xbd\x4e\x2d\x75\x4b\xe3\x65\xaf\x56\x58\x8c\xc3\x69\x37\xac\x56\xe3\xde\xe6\xb1\xcd\xd1\x74\xaf\x39\x13\xc6\x33\xf5\x72\x63\xac\x5b\x6c\xe4\xa9\x5a\xad\x56\x6b\x29\x4f\x05\x3e\x1d\x9d\x4e\xdb\x6f\x8c\x4d\x4d\x4e\x7a\xf1\x54\xbd\x3e\xc1\x53\x3c\xe5\xc5\x9e\x37\x39\x39\x35\xd5\x89\xeb\xf5\xe9\x0e\x36\x6f\x2f\xa0\x50\xa8\x57\x9b\xdd\x6e\xba\x50\x73\xdb\x8d\x42\x1a\xb7\xbd\x56\xa7\xe1\x05\x9d\xae\x17\x47\x49\x69\xca\x1e\x81\xe9\xc9\x6e\xaf\x59\x9e\x1a\x4b\x5a\x93\xad\xb9\xc9\x99\xc6\x78\xab\x3b\xde\xeb\x0f\x26\xc6\xc7\xa2\xd9\xb0\x32\xd7\x68\x77\x6a\x9d\x7a\xa1\xd6\xf4\xfd\xa6\xdb\x6b\xd6\xc7\xd3\x52\xa9\x58\x9d\x5c\x9c\x1b\x6f\xd6\xbc\xca\x54\xea\x37\x4a\xcb\x85\x68\xd6\x8b\x1b\xf5\x64\x6e\xfb\xe4\x4a\x3c\x3b\xd7\xe9\xc7\x85\x7e\x2b\x6d\x4f\x4c\x94\xda\x79\xaa\xd7\xeb\xf5\x26\xff\xaa\x97\x38\x2b\xe3\xe3\xdd\xa0\x3d\x39\xd3\xeb\xf9\xc9\x4c\xb3\x39\xcd\x53\x32\xe3\x27\xbe\xdf\xeb\xcd\xcc\x8c\x27\xcd\xe6\xec\x38\x8e\xdf\x53\x41\xa5\xd2\x6d\x8d\x4d\x4f\x35\xb7\xb6\x83\xc9\x6e\xa5\x51\x9c\x0c\x27\x26\xbb\x61\x3c\x35\x1d\x96\x8a\xa5\xea\xbc\x3b\x02\x0b\x73\x53\x8b\x63\xb5\xf9\x5e\x79\xa2\x3f\xb1\x69\x6e\xd0\x9d\x19\x9f\x9e\x59\x5a\xde\x3e\x37\xd3\x2b\x6c\x4a\xea\x9b\xc6\x26\xa7\xda\x53\x9d\x4a\x7b\x3c\x8a\xc6\x82\xc5\xf1\xce\x6c\xa3\x56\x4d\x5b\x73\x2b\xcb\x33\x63\xed\xb0\x31\xdf\x8c\xba\xb5\xe3\x2a\xc5\x4d\x61\xb1\xdb\x29\x2f\xef\xe9\x9f\x58\xda\xb4\x3c\xb9\xb9\x58\xd9\x3c\xde\x9c\x9c\x9b\xad\x4d\xe6\xa9\xd3\xe9\x74\xc6\xf8\x57\xa7\xc6\x17\xfb\xcc\xcc\x74\x3c\x39\x37\x58\x5c\x8a\xca\x83\xb1\xb1\x05\x9e\xca\x83\xa8\x1c\x45\x8b\x8b\x83\xc1\x4c\x79\x6c\x6c\xd3\x0c\x4e\x3e\xa3\x86\x5a\x6d\x6a\x7c\x7a\xbe\xdf\x3d\x7e\x22\x9a\x9d\xaa\x75\xd3\xd9\xc2\xcc\xdc\x54\x5c\x9c\xeb\xc7\x69\xa5\xda\xdc\xec\x8f\xc0\xe6\x41\x7f\xcb\x74\x6b\x79\xa1\xd6\x1b\xcc\xac\x0c\xb6\x4d\x2d\xf4\xfa\x8b\x5b\x77\x9c\x38\x58\x5c\x28\xaf\x94\xda\xdb\xa7\x66\xfb\x13\x73\x93\xb5\x89\x5e\x21\x99\x8e\xb6\x4e\x4f\x2c\x76\x9a\xcd\xc6\xd8\x60\xf7\xf6\xc5\xe9\xf1\xa4\xb3\xdc\x2d\x4c\x35\xf7\xd6\x2b\x2b\x49\x65\x6a\xb2\xb6\xe3\x8c\xc1\xe9\xe9\xf6\x1d\x73\x3b\x2b\xf5\x1d\xbd\xee\xec\x60\xa9\x39\x9b\x27\xce\xc3\x74\xbe\x4e\x9a\x63\x63\x63\x63\x8b\x8b\xf3\xc5\x99\xc1\xb6\xad\x5b\x0b\xb5\x6d\xd3\xd3\x9b\x79\xaa\x6d\x2b\xd4\x0a\x85\xad\x5b\xb7\x6d\x5b\xac\x4d\x4f\xaf\x2c\x02\x80\x38\xfa\x08\x9f\x5b\x7f\xbb\x56\x86\xc8\x73\xa4\x01\x10\x8a\x8d\x57\x72\x44\x00\x20\xfc\xd1\xfb\x39\x02\x88\x71\x52\x28\xf2\x58\xc0\xb2\x1d\xd7\xf3\x83\x37\xdf\x75\x77\x24\xc9\x54\x51\xb5\x7a\xa3\xd9\x6a\x77\xba\x63\xe3\x13\x93\x53\xd3\xbd\x99\xd9\xb9\xfe\xfc\xc2\xe2\xd2\x60\xd3\xf2\xe6\x2d\x5b\xb7\xad\x6c\xdf\xb1\xf3\xb8\xe3\x77\xed\x3e\xe1\xc4\x3d\x7b\x4f\x3a\x79\xdf\x29\xa7\x9e\x76\xfa\x19\x67\x3e\xee\xac\xb3\xcf\x39\x77\xff\x81\xc7\x9f\x77\xfe\x05\x17\x5e\xf4\x84\x8b\x2f\xb9\xf4\x89\x97\xe1\x7d\xc0\xbd\xf7\x7c\xe0\x23\xb7\xbc\xf8\x25\xb7\xbe\xf4\x20\x5e\xfe\xb2\xdb\x6e\x7f\xfb\x87\x3e\xf8\xe1\x57\xbc\xea\x95\xaf\x7e\xed\x6b\xde\xf0\xfa\x37\xde\xf1\xe4\xe7\x3e\x0b\x78\xfa\x4d\x78\xce\x0d\xcf\xc4\xf5\x9c\xa6\xe7\x01\xb8\xf1\x0f\xc9\xbc\x02\xc0\xf3\xaf\x12\xdf\xfd\x9e\x8f\x03\xd7\x5e\x77\xcd\x9f\x3d\xf5\x69\xaf\xc3\x9b\x3e\x19\x3e\x09\x9f\x00\xae\xbe\xf9\xf2\x2b\xf1\xde\xd5\xfb\x1e\x78\xd7\x3b\xee\x7f\xff\xf0\x9d\x1f\xc3\x5b\xde\xf6\xd1\xb7\xe2\x29\xcf\xd8\xe8\x2c\x91\xb7\x01\x38\x09\x3b\x20\x43\x47\x0b\x33\x58\xc6\x8d\x78\x0b\xde\x86\xfb\xf0\x01\x7c\x08\x7f\x8e\x4f\xe1\x73\xf8\x06\x1e\xc2\xf7\xf0\x63\xfc\x33\xfe\x05\xbf\xc6\xa3\xc8\xc8\xf5\xe4\xd5\xc2\x17\x84\xc3\xe2\x27\x6b\x41\xad\x58\x4b\x6b\x8d\x5a\xa7\xb6\xb9\xb6\xab\xf6\xbe\x7a\xa3\xe1\xe5\x6f\x59\x6a\x68\x63\x16\x9b\x73\x5c\xef\xc6\x07\x70\x3f\x3e\x86\x4f\xe0\x33\xf8\x12\xbe\x89\x6f\xe3\x61\xfc\x14\x3f\xc3\xbf\xe2\xb7\x7f\x80\xcb\xaf\x25\xb5\x72\xad\xf6\xc7\xb8\xb2\x1f\x03\xd9\x4f\xb2\x4b\xb3\x43\xd9\x5a\xf6\xb5\xec\xab\xd9\x83\xd9\x17\x8e\x31\x90\xbd\x33\x7b\x3b\x90\xdd\x9d\xdd\x95\xbd\x39\xdb\x75\xf4\x5b\x8f\xbe\xeb\xd1\x3b\x7e\xf7\x57\x0f\x3f\x61\x54\xfb\xf0\xae\x87\x9f\xff\x83\x6f\xfe\x60\xf5\x07\x67\x7d\xff\x0a\x10\x9c\x04\xe0\x74\xfc\x71\x3a\x13\x8f\xc7\x15\xb8\x2e\xcf\x5f\xff\xff\x57\x0b\x5c\x8d\x6b\xd6\x6b\x7f\x9f\x44\xc4\x48\x50\x40\x11\x6f\xc6\x5d\xb8\x1b\x11\x24\xc8\xa0\x50\xa0\x42\xc3\xbb\x71\x1f\xde\x8b\xf7\xe0\x7d\x78\x17\xee\xc5\x2a\x1e\xc0\x10\xef\xc0\xfd\x78\x3f\xee\xc1\x5b\xf0\x4e\x7c\x0c\x1f\xc7\x07\xf0\x22\xbc\x15\x6f\xc3\x47\xf1\x11\xfc\x39\x3e\x84\xb7\xe3\x83\xf8\x30\x9e\x8a\xa7\xe1\x72\x5c\x83\x3f\xc3\x95\x78\x32\xae\xc6\xd3\xff\x77\x86\xfe\xdb\xcf\x10\x86\xc0\xd4\xc9\x43\x68\xa7\xef\xff\x10\x21\xb7\x1f\x18\x92\xec\xc5\x43\xec\xaa\x3c\x00\x0d\xe2\x45\x17\x4e\x0f\x41\xa6\x6a\xb5\xdd\x57\xee\xba\x9f\x3c\x61\x7a\x08\x61\x6a\x08\x32\x51\x9f\x1e\x42\x9c\xaa\x9d\x70\xbf\xd8\x3e\xe1\xcc\xfd\xcd\x03\xb5\x83\xb5\x83\x7b\x9f\x78\xb0\x76\x42\xed\x8a\x8b\x9f\x78\xbf\xd4\xce\xe1\x99\xfb\x9b\x97\x1d\x3c\x30\x53\xbb\x1f\x8f\xdb\x7f\x65\xed\x7e\x9c\xb5\xbf\x7e\xff\x8e\x03\xa5\x8d\xec\x65\x07\x0e\x6c\x9e\x1e\x42\xe2\x78\xa4\x1c\xcf\xc1\x03\xb5\x13\x6a\x57\xad\x63\xb8\x2a\xc7\x70\xf0\xc0\xcc\xa3\xd3\x43\xc8\x53\x27\xd7\xee\x17\x3b\xa7\xef\x3f\x63\xff\xfd\x37\xef\x2a\xdd\xbf\x63\xd7\x81\x52\xbd\x5e\xdb\x7d\xff\x67\x4e\xdf\x7f\xff\x67\x76\x95\xea\x07\x0e\x4c\x0f\x41\x37\x28\xad\xd5\x76\x3f\xef\xca\x64\x9d\x66\x65\x6a\x08\x3a\x31\x3d\x84\x3a\xc2\xf2\xb8\xfd\xf7\xef\x28\xdd\x8f\x03\x07\x0f\x8e\x9e\x9a\xf5\xfb\x6f\x3e\x78\xb0\x74\xb0\x79\xe0\xd8\xf3\x10\x9f\xf9\xa3\x02\x82\x3f\x2e\xd8\xb1\x5e\x30\x44\x8e\x51\x6c\xef\x1e\x92\x9b\x4f\xcf\xab\x6e\x6e\xd6\x4b\xbc\xa0\x59\x6f\xd6\x0f\x94\xea\x07\x76\x4d\x0f\xa1\x4d\x9d\xfc\xb8\xfd\xbb\x77\x95\xea\xf5\x03\xd3\xc8\xef\x68\x04\x00\x1c\x20\x7b\x83\xb0\x59\x78\x08\x26\x02\xd4\x30\x8f\x2d\xd8\x83\xbb\xf1\x33\x3c\x42\x08\x31\x49\x8d\x8c\x91\x45\xf2\x32\xf2\x6d\xe1\xb2\x55\x84\xe8\x40\x9c\x1c\x22\x74\x86\xb8\xea\xf0\x10\xf6\xda\x2a\x4a\xe8\x20\x74\xbd\xe5\x55\xcc\x6d\xe4\x0e\xad\xe7\x86\x38\x34\xb3\x53\xc6\x77\x70\x08\x47\x70\x08\xc2\x05\x3b\x4b\xd0\x70\x08\x05\x1c\xc2\x38\x0e\x61\x19\x87\xb0\x17\x87\x70\x00\x87\x70\x25\x0e\xe1\x06\x1c\xc2\xad\x38\x84\x3b\x70\x08\xf7\xe1\x10\x1e\xc0\x21\x3c\x88\x43\x30\x2f\x18\xe2\x0b\x87\x57\xb1\x80\x43\xf8\x42\x3e\xc2\xd6\x8d\xb1\x76\x6d\xe4\xae\x5d\xaf\x1d\xe2\x2a\x67\x88\x9b\xd6\x56\x71\xdb\x46\xfb\x57\x6f\xb4\xba\x67\xa3\xd5\x17\x9c\x21\x3e\xb4\xb6\x8a\xbf\xfc\x83\x7e\xbf\x5b\xcb\xf9\x23\xc2\xda\x2a\x51\x37\xf8\xa8\x39\x43\x62\xae\x0d\xd1\x71\x86\xc4\x5f\x5b\x25\xe9\x31\x7c\xa4\x7e\x6c\x0c\x32\xbe\x51\xb6\x21\x09\x72\xee\x46\xed\x13\x1e\x3b\x0a\xb9\x7a\x6d\x95\x3c\x7b\xa3\xee\xa6\x8d\xf6\x2f\x7f\x2c\x75\xe4\xee\xb5\x55\xf2\x81\x3f\x28\xf9\xc8\xda\x10\x87\x9c\x21\xf9\xab\xb5\xd1\xf3\x77\x0f\x63\x88\x7b\x66\x86\xe4\xe5\x33\xab\xb8\x0a\x5f\x81\x38\xb9\x8a\x3a\x26\xf3\x69\xe2\xec\xa8\x87\xf9\xb4\x4d\xa2\x9e\x33\x5f\xc2\x57\x70\xd5\x06\xab\xb5\x35\x3e\x69\xa3\xba\x21\xea\xce\x10\xfb\xd7\x86\x98\x74\x86\xb8\x7e\x6d\x08\xd5\x19\x62\x6d\xfd\xf9\xbb\x6b\xab\x44\x38\x86\x85\xa8\x8f\xc5\x92\x8b\xa5\xee\x0c\x89\x35\x6a\x4b\x92\x5c\x3c\x8f\xc1\x4a\x76\xaf\x8d\x5a\x9e\xbb\xde\xe2\xb2\xb5\x21\xbe\xe2\x0c\xc9\x70\x34\x0a\xf9\xd4\x7a\xf9\x97\xd6\x66\xe7\x64\x8b\x84\xfd\x54\xd8\x4e\x3a\x16\xe9\xf8\xcd\xb0\xbf\x34\x68\x76\x15\x9a\x0a\xca\x8a\x38\x2f\x36\x7a\x84\x2a\x41\x2a\xc4\xfd\x28\xee\x2f\x0d\x1a\x9d\x81\x45\x94\x68\x45\xe8\x5a\x44\xb1\xc4\x70\x45\x1c\x74\x2c\x81\xe7\x52\x71\xbe\xbf\x22\xc4\x16\x09\x83\x54\x08\x53\xb2\x42\xe6\x7b\x64\x85\x74\x1b\x9d\xee\x62\xb4\x42\x3a\x8b\x83\x15\x71\xa0\x2c\x76\x56\x84\x6e\xa3\xd3\xa0\xa1\x45\x94\x1e\xb1\x88\xb2\xd0\xed\x34\x1b\x9d\xee\x8a\xb8\x9d\x58\x22\xc7\x3c\x58\x21\x83\x54\x8c\xc3\x88\x63\x13\x15\x4b\xec\x46\x01\x8d\xe2\x80\x36\x95\xb0\xd1\x13\x9a\x1c\xeb\xe2\x42\x67\xb1\x47\x9a\x3d\x71\x71\x85\x70\xbc\x9b\xc9\x0a\x11\xff\x44\xf8\x20\x21\xf3\xa2\xb1\x4e\x37\xb2\xdd\x76\xb7\xf3\xd5\x2d\x51\x91\xd9\x5f\x9b\xa4\x8a\x2a\x30\x99\x31\x26\xbf\x90\x55\xeb\x55\x96\xd4\x1b\x8c\x8d\x45\x71\x81\xd5\x57\xde\x1d\x15\x99\x63\xab\xda\xeb\xa3\xc9\x88\xda\xa6\x1e\x35\xd2\xf2\x95\xf5\x9a\xa3\x33\x9a\x24\x7e\x34\xd5\xeb\x97\x28\xef\xc9\x3c\x8d\x69\xac\x94\xd6\x5c\x26\x8a\x82\xcc\x54\xe6\x58\xa2\x78\xae\x63\x51\x81\x3e\x43\x56\x54\xc2\x58\x5a\xf2\x99\xca\x98\x6b\x1a\xb2\x2a\x89\x2c\x62\xac\x58\x08\x68\x45\x2e\x94\x0a\xb2\x63\xa9\x1a\xe3\x43\xd5\xd2\x12\x63\xa5\x52\x89\x51\x41\x54\x99\xe3\x38\xa5\x12\x13\x65\x47\x64\x95\xd2\x60\x61\x2e\xa2\x44\x94\xec\xda\x59\x53\x39\x29\x05\x16\x55\xd3\x56\x89\xd3\x5c\xff\x13\xe5\x4b\x64\x2d\xa6\xa9\xa2\xbc\x45\x16\x44\x91\x48\x53\x4a\xb4\x79\x73\xfd\xb8\x9d\xc7\xd5\x79\x43\x32\x6f\xc8\x7a\xc4\x54\xaa\x32\x91\xb5\x22\xe9\x21\x36\x16\x51\x2b\x49\x6f\x8f\x36\x47\xa5\x7e\xbf\x5f\xea\x9c\xb2\xef\x94\x33\x69\x79\x66\x10\x45\x53\x33\xfd\x92\x6c\x5b\x9a\xa6\x8a\xf4\xb8\x17\x1e\xe7\x7a\x4c\x91\xf9\xa0\xce\xe4\xe4\x84\x23\x31\x9b\x9a\x51\x22\xdb\x4e\x67\x7c\x32\x9a\xb4\x9c\x4a\xda\x8c\x14\x3b\x8a\x26\x23\x26\xa8\x16\xd5\x24\x41\x64\xf5\x95\xed\xc7\x77\x2a\x9d\x5d\x3b\x77\x75\x98\x91\x94\x65\x56\x8c\xa8\x20\x2a\xec\x72\x59\x61\x2a\x8d\x66\xe7\xe6\x22\xb9\x5d\xb7\xdd\x3c\xc7\xbc\xcd\xb6\xc6\x34\xa7\x52\x2a\xbb\x53\xe7\x4e\xc5\x21\x53\x45\x41\x1e\xdc\x7c\x5c\x34\x33\x33\xe1\x8a\xf4\xd1\xc9\x3f\x51\xc6\x00\x2b\xcb\xb2\x57\x0a\x9e\xf0\x4d\xf8\x28\x62\x16\x2b\xd8\x87\x3b\xf1\xcf\xc8\x08\x25\x65\x32\x41\x36\x91\x5b\xc8\x43\x84\xac\xe2\x4d\x38\x25\x57\xf0\x77\xe3\x14\xbc\x29\x57\xaf\x77\xcf\x0c\xb1\x72\x78\x88\xbb\x9d\x21\x6e\x5c\x1b\x62\xc5\x19\x92\x89\xb5\x21\x4e\x71\x86\x64\x79\x2d\x2f\x27\x57\xad\x0d\xf1\x26\x67\x48\x5e\xb2\xfe\x7c\x70\xfd\xf9\xdb\x87\xb1\x9a\x7b\xc5\x1c\xe5\x4f\xb0\x92\xc3\x8b\xd6\x4d\xbc\xec\x0c\x81\xb5\x55\x44\xd0\x21\xe7\x43\x5d\xe4\x0c\x51\x5a\x5b\xc5\x76\xac\xe0\x27\x79\x49\xc7\x19\xe2\xab\x6b\xab\x78\x08\x1d\x5c\x94\x97\xf0\x5e\x3f\x5b\x1b\x42\x77\x86\xf8\xcf\xdc\x66\x3c\xa6\x37\x51\xd6\x0d\xa8\xb7\x4e\x68\x65\x6d\x95\x4c\x6e\x60\xe3\x2d\x4e\x5e\x6f\x31\x5c\x5b\x25\x9f\xdd\xc0\xfa\x13\x67\x48\xfe\x66\x6d\x76\x2e\x1e\xa9\x4d\x4b\x08\xfb\x2b\xc2\xa0\x61\x09\x5d\x9b\xac\x08\x1d\xd7\x12\xc3\xf9\x54\x8c\x79\xe1\x52\xa7\xdb\x23\xbc\x2a\x5c\xea\xc7\x2b\xe2\x62\x5b\x09\x68\xb8\x22\x72\x05\xd9\xb6\x48\x83\x2a\x96\x18\x8f\x34\xf3\x7c\xca\xb5\xa0\xd2\x23\x8d\x4e\x37\xa0\x4a\x4a\xe6\x57\xc4\xc1\x8a\xb8\x98\x63\xe0\x1a\xb4\x27\x2c\xae\x90\x1e\x59\xe4\xc5\x24\x25\xf3\x83\x60\x5d\xbd\x36\x68\x33\xe4\x25\x71\xca\xdb\x8d\xfe\xef\x11\x4b\xe8\x70\xb5\xd9\x5d\xe1\xda\x33\x25\x5b\xc8\x42\x4f\xe8\x52\x4e\x70\x8f\x34\x16\x16\xb9\x26\xce\xd5\x77\x4a\xfa\x11\xf9\x53\x61\xe4\x36\xc3\xb5\x4d\xaa\x33\xbd\xb9\xef\xa4\x13\xd2\x64\x76\x66\xf6\x84\xba\x9d\x84\x54\xa4\xae\xad\xcf\x26\xfd\xe9\x3a\x35\xca\xa5\x88\x1a\x52\xb2\xf5\x19\xdf\xf4\x02\x8d\x24\xdb\x13\xea\xd8\xec\xe8\x67\x9f\x60\x73\x48\xcd\xa4\x48\x1e\xd7\xda\x77\xea\xbe\x96\x51\x0a\x35\x6a\x48\x5e\xb5\x52\xf5\xbc\xc5\xd9\x0a\xa5\xe5\x4e\x2f\x31\x2a\x95\x8a\x21\x19\x46\x6c\xa6\x9b\x97\x17\x92\xa4\xd7\x8c\x8c\xa4\xe5\x4e\xcf\x4e\x7b\xb2\x22\x53\x41\x94\x0d\x53\x53\x69\x32\x33\x3d\xee\x55\x9d\xb8\x1e\x1b\x95\x7a\xd3\x4b\x36\x2d\x4d\x1b\x89\x2d\xda\xb4\x75\xde\xcc\xd6\x83\x7b\x54\x53\x57\x65\xd1\x50\x0d\xc7\x28\x25\x0e\x35\x0c\x83\x6e\x2f\x76\xa7\x5c\x23\x09\x5d\x4a\x15\x31\xc7\xf1\xb4\xd6\x89\x27\x9e\xd8\x32\xe2\xd0\x3d\x7a\xeb\x9f\x26\x5f\x89\x46\x45\x23\x6f\xc5\xc2\xd4\xd3\x0d\xfd\x03\xb5\xbb\xbd\xde\xfc\x3c\xa1\x54\xd1\x4c\xc3\x28\xd6\x27\x52\x6a\xb8\x46\x32\x69\xc6\x63\x1f\x64\x5e\x64\x30\x46\x0d\xdb\x33\x6e\xba\x69\xe6\xf4\x59\xaa\x68\x96\xd1\xda\xb9\x7d\xeb\x34\x15\x08\x4d\x16\x97\xb7\xa4\x6c\xcc\x90\xa9\x6c\x38\x49\xb7\x99\xd4\x42\x93\x52\x41\xa0\xb3\xa7\xcd\x98\x92\xa1\x6b\xb6\xe7\xb5\xa7\x97\x5a\xb3\xe7\xb5\x0c\x45\xd4\x47\x77\x50\x46\x97\x30\xe2\x62\xc5\xe0\x0a\xf7\xc6\xe6\xbe\x59\x36\x59\x30\x54\xa9\x4a\x25\xad\x90\xa4\x3b\x56\x36\x27\x5b\x4e\x6f\x35\x67\x99\x21\x2a\x86\xac\x3a\xb3\x17\xcd\xda\xd4\x0b\xe3\xbc\x79\xd2\xae\x14\x0c\x2a\x88\x12\xff\xa2\xc9\xf2\xf6\x1d\xe9\xdd\x5c\x50\x54\x10\x1e\xad\xff\xa9\x72\xc6\x63\x71\x0b\x5e\xf6\x3a\xe1\x2c\xe1\x4b\x30\x50\xc6\x16\x9c\x83\x8b\xf1\x5a\xfc\x0d\x1e\xc6\x2f\x89\x4d\x26\xc8\x22\xb9\x82\xbc\x0b\x68\xf3\xed\xde\xe4\x4e\x5d\x34\xbf\xd8\x4d\x45\x85\xfb\x6f\x8b\x2b\xa4\xdb\x69\x0c\x52\x81\x2a\x16\x69\x5a\x62\xd8\x13\xbb\x0b\x9d\xc5\x15\x21\x25\x4b\x83\x7e\xd4\xb6\x48\xee\x94\xa6\xe2\x20\x5a\x1a\x28\xb4\x27\x74\x7b\x64\x61\xa9\x6d\x89\x0a\xd7\x21\x0d\x4b\x50\xe6\xb9\xbb\x48\xe2\x54\x8c\x47\x6e\x64\xb7\xc7\xf1\x34\xb9\xd6\xca\x35\x4a\x8f\x6c\x27\xdc\x39\xed\x74\x3b\x5c\x2b\x71\x25\x12\xae\x88\x79\x7b\x6a\x73\x6d\xd2\xed\x89\x83\x0e\xef\xca\xd5\xd2\xa0\xbf\xd4\x8f\xc4\xff\x31\x94\x92\x73\x72\x6f\x50\x37\x59\x2b\xaa\xb0\xc4\x11\x19\xb5\x4c\x2d\x12\xf5\x70\xf9\x7c\xaa\xcb\x44\x66\x85\x90\xfb\x12\x72\x52\x4a\x64\x5b\x32\xbd\xc0\xf7\x95\x68\xfc\xe8\xd7\x6b\x13\x8c\x09\xaa\x42\x9d\xce\xf4\x52\x6d\xc7\x05\x13\x9b\x6a\x5b\x16\xe7\xc2\x52\x60\x92\xd9\x62\xa7\xe4\x52\x9b\x35\xaa\xf1\xec\xbe\x6d\x73\xa1\x99\xdf\x50\x8b\x44\x26\xa7\x63\xbd\x68\xf2\x84\x2d\x73\x61\x2d\x64\xb5\x4b\x97\x64\xc7\x0f\x99\xac\xa8\x86\x4e\xa3\xb1\xad\x93\x8e\x4c\xa9\x6c\x4b\x54\x92\x25\x89\xc9\xcc\x74\x92\x30\x2a\x47\x4e\x7b\x7c\x22\x8c\xda\xb5\x12\x63\x36\x3b\x54\x5a\x5e\x5e\x08\xa3\xe9\xa6\x47\x99\x60\x79\x54\x37\x9d\x24\x0a\x97\x8e\x3f\x63\x56\x77\x4d\xf6\x9c\x3f\x1d\x56\x1e\xe6\xbb\x86\x75\x43\xe6\x2d\xef\x71\x6a\xb5\xba\x23\x52\x5a\x9d\xaf\x31\x91\x15\x4a\x45\x3d\x6a\xc9\xdc\x65\x66\xa6\xe9\x3b\xac\x13\x85\x3e\x15\x89\xcc\xa4\x17\x2d\xdd\x7c\xb2\x53\x2e\x95\x9c\xb0\x3f\x16\x53\xb6\xbc\x58\x66\x6a\x69\x2c\xec\xec\x3f\x6f\xff\x37\xd9\xd8\xec\x7c\x68\x46\xcd\x66\xf7\xb6\xd9\x3d\xe7\xb4\xf3\x3b\x62\x3b\x6e\xdb\x59\x5a\x98\x4c\x65\xd9\x6f\xcf\x17\x27\x0f\x2c\x4e\x4d\x52\xcb\xd2\x4c\x26\xb0\xf6\x99\x27\x6f\x73\xa8\xe3\x85\xba\xed\x94\x4a\x65\x47\x14\x04\x41\x76\x5a\xcd\x2a\x8b\x3a\xcc\x92\x7d\x47\x95\xe5\x42\xbd\xe9\x4c\x9e\x59\xfb\x07\xaa\x89\x0a\x0b\xbb\x93\xfd\x5a\x38\x3b\xbf\x58\x0a\x27\x3a\x29\x9b\x3c\xef\xd4\x25\x59\x54\x8e\x56\xff\x24\xd8\x80\x01\x25\xbb\x5b\xf8\x70\xae\x9f\x3a\xd8\x8a\x93\xf0\x2c\x7c\x1c\x9f\xc5\xf7\xf0\x2b\x42\x48\x8f\x3c\x05\xe0\x3b\x32\x5e\x21\x83\x46\xc7\x22\xbe\x25\x36\x83\x94\x50\xa5\x69\x89\x0a\xf7\x32\xc4\x81\x25\xe6\x7b\xbb\x27\x2c\x2c\x2a\x2b\xa4\xbf\x34\x10\x95\xc0\x22\x51\x3c\x58\x11\x3b\x4b\x83\x51\x44\x1c\x73\xad\x40\x94\xfe\xd2\xfa\xf6\xe4\xf1\xae\x62\x91\x1e\xe9\xd2\x9e\x20\x47\x2b\x24\xca\x03\x5b\x62\x93\x8e\x25\x74\x3b\x2b\x02\x47\xbc\xd0\x69\x8e\x7c\xad\x38\x9a\x6f\x76\x95\xc5\x85\x1e\x59\xe2\xa1\x70\x73\x61\xb0\x34\xbf\x94\x0a\xe4\xbf\x29\x5d\xb7\x7a\x63\x63\x5d\xb7\x31\x1f\x37\xf7\xee\x5e\x59\x33\xe2\x28\x36\x24\x91\x50\x27\xae\x16\x8a\x1e\x77\x42\xdc\xd9\x85\xb9\xd9\xca\xf1\x7b\x4e\x6a\x50\x45\x13\x0c\xaa\x88\x2b\x95\xed\xdb\x57\x2a\xef\x3e\x5f\x16\x05\x6a\x95\x2a\x06\x21\x42\x97\x1a\xaa\xdc\x38\xed\xf4\xd3\x9a\x29\x8b\x8d\xcd\x4f\x6e\xf4\x9e\xdc\x6b\x4c\xb7\xbb\x15\xaa\x32\xdf\x95\x1d\xd7\xa5\x94\x7f\xcd\x5f\x78\xfe\x85\xe4\xe4\x78\xa2\xdd\x74\x2b\x25\xcf\x71\x9b\x7b\x7a\x57\x57\x36\x2f\x6f\x2e\x53\x51\xd3\xe2\x5a\xa5\x1a\x4b\x2c\xee\xcd\xf4\x62\x55\x92\x5d\xcb\x95\x44\x41\x6e\xed\x88\x2d\x45\x94\x16\x2e\xbd\xe4\xd2\xa3\xef\xf8\x1f\x44\xec\x3e\x2a\x50\x51\xd6\x6b\x0d\x81\xd5\xc9\x83\xb4\x58\xf0\xa9\x61\x30\x3a\x7e\xf6\x39\x67\x8f\xc9\x86\xe5\x19\xf3\x97\x5f\x76\xc9\x93\xb9\x2d\x97\x0d\xcf\x36\x64\x59\x51\x4d\x63\x1f\x25\x02\x25\xad\xab\xe3\x5e\xaf\x17\x3b\xfe\xf4\xec\xfc\x6c\xaf\x5f\x59\x1c\x6c\x6d\x18\x2a\xd5\x0c\x87\x05\xd7\x7e\xeb\x5a\x91\x2d\x3c\xfd\xda\xa7\xcf\xe7\x6d\x24\x95\x51\x42\x75\x4a\x4d\xd7\x8c\xa8\x42\x65\x37\xe7\xfe\x8a\x4f\x5c\x70\x41\x3e\x7e\xee\xa9\xf4\xce\xdf\x7f\xce\x98\x11\x70\x02\x75\x49\x70\x1c\xa7\xbc\x38\xbf\x50\x69\xee\x6e\x6a\x92\x40\x35\xcb\x7a\xd4\xfd\x9f\x43\x2b\x02\xa8\xd9\xb3\x84\x83\xc2\xd7\x10\xa0\x83\x01\x4e\xc1\x79\xb8\x0c\xd7\xe2\xe5\xf8\x3a\x31\x48\x3d\xff\x31\xcf\xe3\xc9\x15\xe4\xe9\xe4\x66\x72\x07\xf9\xae\x50\x10\x2e\x1a\x0a\xc5\x99\x21\xe6\x67\x86\x30\xd7\x86\x42\xd1\x19\x62\x7a\x6d\x88\xe9\x99\x21\x66\x0f\xef\x2c\x81\x62\x16\x11\x66\xd1\xc1\x2c\x96\x30\x8b\x13\x30\x8b\x73\x30\x8b\x27\x61\x16\xcf\xc4\x2c\x6e\xc1\x2c\x5e\x8f\x59\xdc\x8b\x59\x7c\x1c\xb3\xf8\x02\x66\x61\x5e\xb0\x53\xc6\x21\xcc\xe2\xc7\x98\x85\x70\xc1\x10\xf3\xce\x10\x5b\xd6\x56\xf1\x54\x4c\x63\x36\x0f\x26\x67\x9d\x21\xae\x5d\x1b\xd5\x5c\xb7\xb6\x8a\xe7\x6c\xd4\x4c\x3b\x43\xdc\xbc\x36\x6a\x71\xdb\xda\xe8\xf9\xb5\xeb\xf0\x8e\xf5\xf2\x2f\xae\xf7\xfc\xf6\xe1\x21\xbe\x3c\x2a\x23\xea\xa8\x8c\x14\x47\x6d\xc9\xe6\xf5\xf2\x6d\xeb\xe5\x3b\xd6\xe1\x9e\xb5\x55\xf2\x9c\xc7\xd2\x41\x6e\x5e\xaf\x79\xfe\xda\x2a\x79\xe9\x63\xe9\x20\xb7\xad\xe3\xb8\x73\x1d\xe7\x5b\xd7\xe1\xbd\xeb\xe5\x7f\xbb\x36\xc4\xb7\x9d\x21\x79\x68\x1d\xfe\xe3\xa8\x5c\x08\x47\xcf\x42\xe9\x30\x86\xf8\xf1\xcc\x90\xfc\xdb\xcc\x2a\x51\x71\x7b\x1e\xdb\xbf\x02\x4f\xca\xe1\xb5\x78\x76\x0e\x8f\xe2\xcc\x1c\x9e\x8a\x67\xe3\xda\xfc\x7c\xf8\x5c\x9c\x89\xa3\x79\xee\xfc\xf5\xb2\x21\xae\x75\x86\x78\x72\x2e\xc2\x63\x25\xcf\x5e\x17\xd4\xed\xb9\x60\x56\x71\xef\x7a\xaf\x21\xce\x74\x86\x78\xd7\xda\x2a\x39\xef\x18\x46\xf2\xc4\x63\x18\xc9\x95\x1b\xfd\x9f\xe4\x0c\x09\x9f\x82\x6b\x9d\x21\xb9\x3e\x17\xca\xb1\xd6\x2f\xdd\xc0\xf4\xec\x75\x21\xdc\xee\x0c\xc9\x9b\xd6\x86\x78\x85\x33\x24\x6f\x5e\x7f\xbe\x77\x6d\x95\x7c\xe4\xb1\x63\x92\x8f\xae\x0d\x71\xd4\x19\x0a\x6c\x6d\x48\xd4\x5c\x0c\xb3\x73\x03\x2b\x0f\x6d\xc5\xf9\x15\x32\xb0\x08\x77\xed\x2c\x31\x4e\x85\xa5\x01\x0f\x88\x7b\x64\xa0\xa4\x62\xd8\x5f\x1a\x2c\x2c\x2d\xf6\xc4\x38\xc8\x9d\xce\x9e\xc8\xf5\xf3\x76\x92\x8a\x6d\x85\x46\x31\x0f\x73\x07\x3d\x71\xd0\x4f\x85\x41\x4f\xa0\x23\xcd\xde\x8f\x78\x38\x3e\x1f\x5a\x62\x95\xd0\x9e\xa0\x34\x7a\x42\x77\x61\x29\x8f\xac\xbb\x21\xf7\x35\x15\xae\xcb\xe7\x1b\x74\x64\x29\x52\x31\x56\x1a\xf9\x59\x6e\x9c\x92\xdc\x2f\xed\xf3\x11\x7a\x3c\x60\xef\xae\x10\x3e\x76\x64\x71\xaf\xb6\x4a\x72\x97\x54\x6c\xe6\x81\x7c\x2f\x8f\xf4\xb7\x0b\xa3\xb3\xd8\x7e\xee\x93\xe6\xf6\xea\x4f\x91\xa9\x69\x43\xd0\x2c\x1a\x4d\x4c\xcc\x54\x76\xdd\xd4\x3b\xed\x9e\xd3\xdc\x89\x76\xe1\x5f\xa9\xef\xaa\x94\xd5\xda\x5d\x57\x96\x65\x63\x62\xa9\xe7\x96\x03\x16\xa5\xb1\x4d\x8b\x8d\xce\xf5\x92\xd1\x38\xa7\x67\x14\x8b\x01\xa5\x66\x31\x35\xf6\xb1\x56\xbb\x7a\xf4\xce\xd4\x90\x62\x56\x6f\x77\x5c\xb7\x37\x96\x7c\x92\xc5\x71\xc4\xe4\x42\xa5\x70\xad\x9b\x04\x9e\x11\x8f\x33\xea\x58\xba\x4d\x03\x57\xa5\x76\x7e\xa7\x97\x95\x8a\x21\xed\xc4\xac\xd5\x4e\x35\x9b\x3a\xae\x23\x73\xc3\x75\xc6\x35\x0d\x6e\x97\xdc\x46\x7b\x2c\xb6\xdd\x4a\x21\x36\x2a\x8b\x6d\x93\xb1\xad\xcd\xee\xfe\xb3\x4f\xa9\xc4\x69\xb1\xe0\xda\x86\xed\xd7\xca\xac\xcb\x96\x77\xb0\x52\xad\xf1\x2c\x6a\x95\xdb\x2e\x75\x82\x88\x6d\xb3\xdd\x30\xae\x95\xdd\x6d\xfb\xf6\x4f\xe7\xb6\x90\x73\x43\x35\x37\xa0\xf6\x56\x1a\xf8\x76\x7c\x7c\xcf\xf0\x1c\x8f\xb9\x53\xb3\xfd\x38\x1e\x6b\x94\x1f\x3d\xfc\x7f\x37\xff\xd7\xbb\x93\xbd\x29\xd7\x2d\x05\x8c\xed\xd9\x1d\xfb\x8c\x46\xd5\xee\x07\x58\x5c\xa8\xb8\x94\x5b\x26\x4e\x16\x8d\x8b\xcb\x55\x5a\x6c\x4f\xc5\x01\x8b\x4b\x2c\x2a\x58\xea\x52\x3c\xc1\x9a\x45\x2a\x50\xdb\x8d\x9b\xb5\x8a\x3b\xcd\x2c\xb7\xf8\xc8\xb6\x78\x9c\x35\xd4\xa0\x4a\x99\x5f\x6c\x55\x34\x55\xa2\xcc\xa1\x74\x4e\x54\x58\x1c\x53\x6e\x1e\xab\x94\x31\x46\x6d\xaa\x18\x2a\x25\xd4\x60\x5c\x28\xb2\xec\x5d\x61\x13\x91\x3b\xcb\x22\xd9\xb1\x6c\x44\x81\x43\xdd\xc4\x35\xa8\xad\x5b\x0e\x8d\x37\xed\xdc\xdb\x8d\x27\x0c\x4a\xac\x4a\x5c\x68\x4f\xb8\x8f\x37\x9a\x35\x9f\xb2\xd8\x98\xbe\x64\x17\x2b\x06\xfa\xf1\xe5\x4d\x4b\xf3\x91\xa1\x8a\x02\x3d\xef\x06\xa3\xd5\x4e\xe9\xf4\xde\xf9\x32\x37\xc3\x46\x52\x1d\x2f\x57\x96\x97\x37\x55\xec\x93\x0d\xce\xd0\xf2\x55\x0d\x8e\x92\x19\xdc\xe2\x46\xf5\x47\x7f\xf6\x7f\x2d\xeb\xc8\xdf\x3d\x07\xd9\x4d\xe4\x11\xe1\x6b\x50\x10\xa3\x87\xcd\x38\x05\x17\xe2\x56\x7c\x1a\x5f\xc4\x43\xf8\x05\x1e\x21\x26\x49\xc9\x5e\x72\x13\x4e\xc6\x10\x9f\x9a\x19\x92\xe7\xcd\xac\x42\xc1\x3d\xb9\xd5\x9a\xc5\x59\xf9\x49\x35\x37\xcb\x8b\x6b\x43\xdc\xe3\x0c\xf1\x8e\xb5\x21\x14\x67\x88\x2f\xac\x9b\xeb\xff\x58\x1b\xe2\x2c\x67\x48\x82\x51\x3d\x79\xe2\xda\xec\x5c\xdb\x12\x95\x78\xde\x1f\xc5\xff\xf9\xb9\x40\xdb\x22\x41\x74\xec\xd8\x80\x36\xb8\x56\x1d\xbd\x6a\xeb\x72\x05\xc9\x2b\xfa\x4b\x23\x0f\xbd\x47\x2c\x32\x48\x49\xc8\xd5\xaa\x90\x3b\xec\xfd\xa8\x6b\x89\xa1\x45\x14\x8e\x81\x47\x08\xdd\x85\xa5\xf9\xc8\x12\x78\xd1\x60\xc9\x1b\xf4\xc4\x6e\xc8\xb1\xcc\xa7\xe2\xe8\xbd\x9b\x92\x1f\xb6\xe6\x07\x20\x0d\x8b\x74\xba\x2b\xe2\x80\xf6\xf2\xb8\x80\x67\xfb\x91\xff\xdf\x9b\x3c\xf2\x9c\x64\xd3\xa6\x79\xcf\xb9\xd1\xa1\x51\xa9\x6c\xb0\x31\xa3\x52\x0f\x6d\xc3\x8c\x8f\xfe\x0b\x95\x79\xf0\x5f\x2a\x1b\x49\xbb\x56\xf5\x9a\xe7\x36\xbd\x82\x67\xde\xe0\xa5\xc5\xc4\xb0\x69\x29\x2d\x4e\xa4\x5e\x68\x28\xd4\x08\xb8\x72\x31\x1a\xad\xfa\xb5\x86\xd4\xba\x68\x4b\xbe\xd2\x93\xc1\x4c\x52\x7e\xa1\x51\x8a\x9d\xa4\x6c\x94\x5b\x5e\x7f\x79\x53\xe2\x04\x06\x95\x34\x2d\xae\x27\xf7\x24\xb5\x24\x3f\xff\xf4\xc6\x27\xc6\x9e\xe7\x78\xdd\x6e\xc3\x30\x7c\xd7\x37\xbc\x42\xe8\xf3\x05\xc5\xa8\x37\x36\x31\xe6\xe5\xae\x6a\x52\x0a\x23\x2f\xdd\x3c\xdf\x35\x0c\xa2\xa9\xd4\x1b\x9f\xdf\xd2\x6a\x2e\x0c\xfe\x67\x92\x2d\x1b\xb2\x16\xa7\x0e\xf9\xa4\xe1\x7b\xbe\xf1\xb8\x77\x9e\x95\x2c\x6f\xdf\x9e\xce\x9c\x7e\xbb\x51\x6f\xd5\x0d\xee\xf5\x53\x6a\x15\x6b\x06\x63\x34\x4e\x1b\x17\xcf\x52\x22\x4a\xb3\xd4\xa6\x5a\xcf\xa5\x6e\x10\x1b\x12\xcb\x3b\xc6\xba\xe6\x25\xcd\x13\x5b\x2c\xa0\xae\xe7\xd0\xd9\xe3\x4c\x77\x07\x75\xc3\xd8\x48\xe6\x9b\xad\xe3\x13\xc3\x30\x0c\xdb\x94\xbc\x66\xab\xe9\x6d\xbd\x65\x6b\xed\x15\x64\xe2\x15\x39\xd3\xb6\xe1\x50\x45\xa2\x9a\x5d\x4c\x4e\x7c\xe3\x9d\x6f\x3c\xd1\x28\xa7\x15\x83\x52\xaa\x52\x2a\x88\xb9\xad\x98\xb8\xe0\xa2\x0b\xc6\x29\x0d\x9b\x49\x3c\x33\x3b\x93\xa4\xdb\x37\x4d\x1b\xce\xa3\x7b\xfe\x47\x92\xcd\x75\x52\x8a\x38\xbb\x59\xbc\x4c\x78\x14\x5a\x7e\xda\x3a\x83\x15\x9c\x87\x1b\x70\x1b\xee\xc2\xc7\xf1\x20\xbe\x4f\x44\x32\x41\x4e\x23\x07\xc8\xf9\xe4\x6a\x72\x13\xb9\x9d\xbc\x97\x3c\x48\xbe\x47\x7e\x2e\x50\xa1\x20\xf4\x84\xc7\x09\xcf\x16\xee\x11\xcf\x58\xc5\xa7\xd7\x9d\xec\x04\xb5\x1c\x5e\x83\x23\x39\x24\x78\x36\x3e\x9d\x3b\xae\x9f\x76\x86\x24\x3d\xbc\x0a\x19\x9f\x26\xa9\xeb\x2d\xe7\x37\x65\x6a\x38\x82\xda\xb1\x9b\x32\x35\x14\x50\xc3\x38\x6a\x58\x46\x0d\x7b\x51\xc3\x01\xd4\x70\x25\x6a\xb8\x01\x35\xdc\x8a\x1a\xee\x40\x0d\xf7\xa1\x86\x07\x50\xc3\x83\xa8\xc1\xbc\x60\x15\x0c\x35\x24\xb9\x13\x6f\xac\xe7\xf2\xfb\x2b\xf0\x0f\xaf\xa2\xb2\x51\x37\xb6\x51\x97\x38\x43\xec\x5e\xcb\xe9\xc1\x6b\xd6\x56\x71\x37\x9e\xbd\xde\xe6\x1b\xeb\xb4\xae\xe6\x84\x25\xc7\x68\x3c\x92\xff\xb7\x4e\xe3\x11\x14\x70\x04\xe3\x38\x82\x65\x1c\xc1\x5e\x1c\xc1\x01\x1c\xc1\x95\x38\x82\x1b\x70\x04\xb7\xe2\x08\xee\xc0\x11\xdc\x87\x23\x78\x00\x47\xf0\x20\x8e\xc0\xbc\x60\x48\x52\x67\x88\x9f\xaf\xad\xe2\x17\xeb\x63\x8d\x82\x8a\x7f\x5f\x5b\x25\x85\x75\x69\xac\x92\x33\x8e\x8d\x4e\xce\xde\x28\x3b\xef\x18\xfd\xe4\xfc\x0d\xfa\x7d\x67\x48\x2e\x5d\xcb\xf9\x20\x57\xac\xad\x92\xa7\x3c\x96\x6b\x72\xcd\xda\x2a\xb9\xfe\xb1\xbc\x92\xd7\xad\x0d\x71\x8d\x33\x24\x9f\x59\x1b\x85\x19\x5f\x1e\xf1\x4e\x7e\xb4\xb6\x4a\x8e\xd1\xb3\x2a\x54\x8f\x8d\x2e\x4c\x6c\xf4\x3e\xe2\x0c\x85\xcd\x6b\x39\xf5\xc2\xb6\xb5\x55\x61\xe5\xb1\xd4\x0b\xbb\xd6\x56\x85\x2b\xd7\x29\x1d\xb5\x79\xea\x88\x2a\xe1\xad\x87\xb1\x9a\xdf\x90\x15\x27\x57\xc9\xc9\xf8\x62\xbe\x10\x6e\xc5\x0b\x73\x38\x06\x01\xc8\x91\xc0\x19\xe2\xb7\x87\x87\x58\x58\x1b\xe5\x77\xaf\x0d\xc9\xc9\xce\x90\x48\x6b\x43\xbc\xfe\xf0\x2a\x9e\x4d\x24\xbc\x3e\x9f\x8e\xbb\x37\x72\xdf\x00\xf0\xdb\xbc\xf7\x17\x9d\x21\xbe\xb3\x36\x82\x3f\xc8\x45\xbb\x5e\x93\xe3\x70\x0f\xaf\x92\x02\x39\x99\xb8\x79\xc9\x60\x34\x02\x39\x7d\x8d\x8b\xf9\xd8\xf8\x82\x33\x24\x67\xe6\xe2\x3a\x56\xf2\x5b\x67\x48\x5e\xb4\xde\xf6\x75\x6b\xab\xe4\xcb\xeb\xe3\x0e\xf1\xc2\xfc\x9d\xec\x10\xb7\x3a\x43\xf2\x77\x9c\xbe\x3c\x08\x5d\x25\xbf\xd8\x68\xf1\x45\x67\x28\xc4\x6b\x5c\x90\x8f\xa1\x50\x98\x18\x51\x28\xcc\xe4\xe2\x7b\x0c\x85\xc2\x59\x6b\x43\xe2\x3a\x43\xe1\x62\x2e\xc6\x0d\x4a\x79\xc9\x4b\xd6\x66\xe7\x62\x25\xee\x2f\x0d\x2c\xd2\x23\xed\x66\x3c\x68\xd0\x38\x88\xe6\x17\x56\x84\xc5\x85\x4e\xb7\xd3\xe5\xf6\x2d\x15\xe2\x68\x69\xc0\xa3\x0c\x61\x29\xce\x2d\x20\x59\x5c\x21\x3c\xbc\xe8\x5a\x24\x4e\xc9\xfc\xc2\x0a\x89\xc2\x15\x71\x71\x29\x7f\x73\xa0\x8c\x6c\x65\x6e\xf2\x46\x27\xff\x8b\x2b\x3c\x9a\xe9\x47\x64\x14\x25\xf5\x97\xe6\xfb\x2b\xc2\x62\x33\x0f\xb1\xc2\x20\xe2\x4f\xf3\x3d\x52\x1f\x59\x49\xfe\x90\x1f\xf7\x75\xb9\xbd\x0c\xb9\x55\xce\x5f\xb0\xf6\x23\xee\x5e\xf4\x97\x06\xfd\x25\x6e\x2f\x1b\x3d\x21\xe6\xe6\x96\xdb\xd6\x80\x2a\x8b\xa3\xb7\xb4\x0b\x2b\x02\xb7\xbd\xa3\xe6\x3c\x8e\xa2\x41\xfe\x12\x76\xbe\xbf\x34\x58\x8a\x14\xaa\xac\x88\x8b\x0b\x4b\x3d\xd2\xed\x58\x42\x77\xa1\x13\x2f\xc5\xdc\xfc\x73\x04\x79\xd0\x25\x34\xba\x3c\x3e\x5b\x7f\x9d\x2b\xfe\xaf\x60\xfe\xcf\x82\xb9\x6f\xe7\x75\xf1\x6c\xd1\x6b\xb7\xdb\xe4\x37\xb6\xed\x18\x36\x0b\x4c\x59\x96\x75\xaa\xbc\xcc\x8c\x4d\x41\x0b\xbc\xd6\xc9\xad\xd6\x62\xc1\x0f\x28\x5d\x2d\xd4\x63\x53\x32\x63\x83\x9a\x86\xf1\xe4\x4e\x62\x24\x27\xcd\x52\x4a\x8d\x72\xe2\x28\xa2\xe9\x52\x36\x5d\x30\x92\xd0\xbb\xcd\xa8\x27\x9a\x61\x8e\x4f\x8e\x19\x46\xa3\xdd\x34\x0a\x25\x43\xf0\xba\xbd\xe5\x16\xf5\xc3\xc2\xa3\x5b\x1d\xd3\x35\x94\xb8\x54\x31\xcc\xc4\x63\x67\x18\x95\x82\xfb\x3a\xaa\x88\x24\x64\x86\x26\x8a\xd4\x4c\x48\xa1\xb5\x3c\xdd\xf5\xaa\xfd\xde\x54\x21\xb7\xf9\xfe\xec\x5c\xcf\xf3\x67\xa6\xc7\x7e\xca\x0d\xa0\xd9\x35\x8d\xfc\x2f\x10\x50\x96\x90\xe6\xdc\x05\xfb\xcf\x99\x6c\x3d\xbe\x65\x3a\x46\xeb\xb4\xd3\x4f\x6b\xfb\xb5\x6a\xf5\x66\x87\x2a\x86\x46\xdb\xa7\xee\x3b\x31\x8d\x8c\x17\x7a\x13\x93\x13\x7e\x58\x2e\xd3\x6d\x2f\xdb\xe6\x55\x4b\x05\x73\xee\xd4\xa3\x4f\x4e\x26\xdb\x55\x83\x6a\x9e\x61\x4e\x17\xe2\x0a\x33\x45\x51\xd2\xcc\x4a\xc1\x11\x45\xcb\xa3\xa6\x61\x2a\x7e\x9b\x31\x99\x1a\xb1\x2d\x2b\xd3\x2d\xc3\xd2\x55\x6a\x34\xc6\x26\x7c\xa3\x10\xba\x94\x56\x66\xb6\xb5\x8d\x4a\x29\x7e\xde\xff\x0a\xef\xff\xbb\xf0\x66\xe6\xdc\xf1\x02\x27\xea\x3a\x77\x67\x68\xb0\x90\xaa\x9a\x69\x50\x45\x10\xec\xa4\xcc\x0a\x93\x9d\xaa\x61\x48\x45\xdf\xf4\xda\x63\x93\x6a\xd5\x0c\x8c\x31\xc3\xf4\x15\xc9\x70\xcf\x6f\x5d\xd8\x6f\x55\x28\xf7\x0c\xa9\x17\x26\x66\x4e\x56\x12\x9a\x86\x2a\x32\xe6\x4d\xf6\x66\x93\x42\xbd\x5c\xf6\x28\x13\x55\xc3\x6c\x4d\xce\x16\x92\x6d\x8b\x55\x85\x0a\x02\x79\xf5\x71\xf1\x5c\xc1\xd0\x24\x66\xbb\x8a\x51\xad\xb7\x8e\xe7\xae\x0e\x35\x03\xdd\xd4\x59\xd8\x3a\xfb\xc0\xe3\x27\xe7\x2e\xb9\xf8\x92\x39\xdd\xd0\x07\x57\x5e\x76\xe9\x6c\xeb\xa4\x93\x4e\x6a\x51\xcf\x73\xa9\x65\x19\x05\x96\x37\x96\xe2\xf3\x3f\xfa\xb1\x07\x2e\x91\x8c\x90\x9d\x7b\xef\x3b\xef\x3d\x9b\x2a\xd4\xa7\x82\xa8\x19\xa7\xdf\xf1\xc6\x3b\x4f\x2f\xd4\x0b\xee\x25\x3c\xae\xf3\xeb\x8d\x4e\xe1\x25\xa4\xf4\x12\xbf\x56\xad\x79\xc1\x42\xd4\xe8\x7a\x46\x5a\x8e\x69\xa2\x16\x62\x45\x55\x35\x93\xba\x51\x62\x18\x69\x5a\x31\xa9\x40\x25\x6a\xfa\xb6\x2e\x09\x92\x11\x44\x45\xaf\xb3\x3b\xa1\x9a\xa1\x78\x89\x41\x9d\xa4\x62\xb6\xf7\xec\x58\xf4\x28\x15\x8d\xdf\xfd\xe8\x7f\x25\xf6\xff\x4e\x62\xb0\x60\x1d\xfd\x98\xb0\x5b\xda\x0a\x0b\x09\xc6\xb0\x03\xe7\xe3\x6a\xdc\x84\xdb\x71\x98\xcc\x91\x65\xb2\x83\x9c\x4a\x9e\x86\xff\x5a\xc5\x14\x16\x20\x4e\xe6\x7e\xdb\x02\x8e\x60\xe1\x98\xdf\xb6\x80\x02\x16\x30\x8e\x05\x2c\x63\x01\x7b\xb1\x80\x03\x58\xc0\x95\x58\xc0\x0d\x58\xc0\xad\x58\xc0\x1d\x58\xc0\x7d\x58\xc0\x03\x58\xc0\x83\x58\xc8\x7d\x4b\x1d\x0b\x98\xca\x1d\x0f\x7b\x23\x17\x6c\xe4\x5a\xeb\xb9\x21\xa6\x9c\x21\xc6\xd7\x86\x58\x70\x86\x18\xac\xad\xe2\xc5\x1b\x6d\x3e\x77\x2c\x47\xfa\x1b\xb9\xc1\x46\x6e\xf3\x06\x86\x05\x67\x48\xb6\xaf\x61\x48\xf6\xcd\x0c\xc9\x93\x67\x56\xf1\x4d\xdc\x96\xc7\xfb\xb7\x39\x43\xfc\x72\x6d\x88\xaf\x1e\x5e\xc5\x53\xf0\x4b\x7c\x35\x47\xfb\x62\xdc\x86\x6f\xe6\x1d\xbf\xe9\x0c\xf1\xd2\xb5\xd9\x39\xd2\x8f\x53\x12\xf2\xf8\xb5\x63\x91\x01\x8f\xa1\x95\x15\xd2\xe3\xb9\xb8\x1f\x0d\x96\x7a\xc2\xa2\x25\x34\x06\x34\xe2\xa1\x70\x83\x36\x3a\xdd\xa5\x0e\x37\x54\xd1\xca\x63\x0e\x59\xc5\x81\x45\x46\x57\x0d\xc4\x01\x8d\xe2\xfc\x5a\x6c\xd7\x12\x79\x6c\x9e\x92\x78\x45\x1c\xf4\xd6\xcf\x60\x73\xcb\x96\x0a\x83\xce\xa0\x97\xdf\x5f\x08\x53\x31\x56\x3a\x96\xd0\xfc\xfd\x7d\x84\x1e\xe9\x5a\xe2\xfa\xbd\x05\x6e\xe2\x7a\x62\x77\x64\x86\xf3\xf7\x8f\x83\xa5\x41\x73\x71\xa1\x13\xf7\x73\x7a\x68\x4f\x50\x2c\xb1\xdb\x23\xcd\x06\x0d\xb9\x05\x4f\xc9\x7c\xa4\x50\x9b\xe4\x01\xfa\xfa\x5d\xde\xd1\x5d\xe1\x91\x8d\xee\x8e\x0e\x75\x39\x81\x24\x25\xdd\xfc\x86\x58\x7f\xa9\x9b\x73\xbd\x9d\x28\xf3\x01\x0d\x39\xe9\x0d\x1a\xd3\x54\x50\xfa\x51\x7e\xc3\xa2\xdb\xb0\x84\xee\xd2\x42\x77\x45\x9c\xef\xa7\x02\x81\x28\x0a\xb2\x59\x48\x42\xd5\xa8\x54\x0a\xa5\xc8\x94\xe4\x92\x25\xa8\x63\x3a\x53\xbd\x9e\x27\x09\x54\x91\x1d\xd7\x39\x57\x55\x0b\x1d\xd7\x4c\xcb\x05\x55\x55\x4d\xdf\xf5\x4c\xb3\x54\x2c\x1e\x7d\x93\x26\x0b\x8a\xec\xf6\xb7\xed\x6a\x16\x57\x36\xcf\x59\xa5\x1d\xc5\x74\xae\x37\x5d\xac\x4e\xa5\xde\x67\x54\xc1\xf5\x4a\x45\xb5\x94\x58\x52\xd4\x1b\xaf\xbf\x26\x91\x14\xd9\x8f\x54\xcf\x73\x35\x2d\xd5\x54\xdf\x14\x7e\xcc\x51\x4b\x2a\xd5\xdc\x6a\xb9\x68\xd6\xa7\xa2\xc9\xc9\xc9\x68\xeb\xf1\x52\xb9\x3d\xe6\x31\x2b\x8a\x62\x73\xb2\xea\x4a\x63\x9b\x8e\xab\x4e\x9e\xb6\x7b\x6b\xb1\xd8\x50\xb5\x42\xa5\x62\x78\x9d\x66\x45\x2b\x3a\xaa\x56\xeb\x8e\xbb\xe9\x78\x9a\x98\xee\x62\xd3\x28\x16\x8b\xa6\xee\x68\x16\x15\x65\xa3\x38\xa7\x8b\xba\xef\xca\x9a\xa6\x49\xaa\xae\x31\xcd\x6d\xb8\x5a\xc9\x0e\x7c\xa9\xb8\xa9\xa1\x6a\x92\xc2\xa2\x89\x56\x45\x73\x77\x34\x0b\xdb\x3c\xd3\x0b\x62\x4f\x2b\xeb\x92\x1f\xd8\x8d\xfd\x17\x9c\xdf\x6d\x8e\x27\x86\xe4\x8e\x37\xcd\xd0\x94\x24\xed\xdc\x53\xd3\xe3\x77\x6e\xbe\x49\x0b\x7d\x57\xf6\x26\x67\x23\x53\x92\x9a\xb1\x11\xb3\x65\xc9\xd0\x44\xb9\xd8\xde\x26\x29\x0a\xd1\x64\x22\x6b\x92\xea\x45\x45\x57\xb3\x4c\x53\x53\x55\xd3\x36\x6d\xd3\xf4\xfd\xf8\xe8\x9a\x20\x48\xb2\x2c\x52\xdb\x95\x04\xc1\xf8\xb0\x31\x3e\xd3\x8f\xcc\xf1\x99\x7e\xbd\x71\x46\x53\xd3\xa2\xb1\xee\x58\x24\xcb\x62\x32\x75\xc9\x94\x36\xe1\x89\x54\x9d\x3a\x67\x5a\x75\x5d\x4f\x93\x64\x4a\xc8\x4c\x38\x33\x3d\xe1\x35\xa6\x8b\x4c\x52\x83\x4e\xd3\xad\xab\xaa\x6c\x7b\xb2\x39\xb1\xb4\xfd\x19\x5e\x55\x73\xe7\x8a\x9a\xa2\x39\x9e\xac\x07\x35\xb2\xb8\x3b\x9c\x9f\x1d\x37\x0c\x5b\x37\x34\xb5\xac\x99\x8d\x76\xa7\x22\x13\x81\x6a\xa2\x9a\xf8\x42\xd4\xbc\x49\x32\x28\xd1\x8a\xd7\x9c\x58\xec\xd6\xcb\xa6\x21\xc9\x4c\x5f\x7c\xfe\xb6\xe6\xa6\xf1\xa2\xa4\xf9\x53\xdb\x9a\x5e\xa7\x68\xfa\xb6\xa5\xc9\x84\x45\xae\xb7\xb5\x14\x55\x13\x4f\x53\xc7\x16\x36\x17\x8b\xd3\x92\x62\x3a\x92\xd6\x2c\x50\x51\x8c\x35\xb7\x28\xa8\xa5\xe3\x9b\x92\x20\x13\x49\xb2\x99\xa0\x69\x45\x5b\xf5\xd2\x72\xc9\x2c\x56\x55\x55\x12\x67\xe4\xa4\x39\x11\xf1\x19\x6a\x37\xcd\x5a\xbd\xa2\xb9\x4d\xd7\x8c\x93\x92\x9b\x56\x35\x66\x98\xbd\xe5\xed\xe9\xd6\x67\x2d\xba\xb5\x5a\x2b\x3a\xf7\xf5\xf3\xa6\x64\x37\xfe\x4c\x13\x05\x8d\x7e\xd8\x9d\x98\xee\x45\x8d\xd7\x1f\xd4\xa8\x66\x78\xcd\xee\x54\xc9\xa4\x41\x5a\xa9\x46\xaa\xa6\xa8\xb1\x47\x35\x5d\x23\xea\xd4\x49\x53\x5a\x12\xdb\x54\xa1\x80\x84\x94\xbc\x92\x38\x62\x0b\x0a\x5c\xcc\xe2\x74\x28\x18\xe2\xd4\x99\xd9\x39\x9f\xbb\xc7\x22\xdf\x37\x21\xdf\x24\x64\x10\x50\xa5\x1f\x29\x8d\xce\x62\x98\x8a\x61\x44\xe3\x15\xbe\xd1\x16\xb8\xb3\x3c\x50\x02\x1a\x07\xa9\x10\xf2\x8d\x41\x3b\x2b\x64\x86\xd0\xfc\x32\x24\xdf\xdd\xd1\x0b\xfc\x09\x4a\x83\xd0\x5d\x74\xbc\x98\x9a\x94\xfa\x2e\xa3\x54\x53\xa8\x20\x5a\x16\xa3\x82\x41\x0b\x91\xc1\x6d\x0b\xf5\xa7\xaf\x52\x65\x53\xd5\xd4\x42\x5a\x6e\x55\x0b\xa6\x20\x6a\x05\xc5\x33\x6a\x74\x7a\x5f\x87\x0a\xe4\xfd\x96\x2f\x4a\x94\x91\x52\x7f\xfe\xfa\xed\xa6\xa5\x6c\x7f\xee\x95\x8a\x44\x7d\xaa\xd3\xc4\x6f\x77\x3a\xbe\xd7\xf3\xf9\xca\xb5\xab\xdb\xb7\xaf\xd4\xa8\x50\xd0\x76\xdf\xba\x5b\x24\x82\x44\xeb\xcd\xc0\xa4\x6e\x7d\xcc\xbe\x45\x11\xcc\xea\x4a\xcd\x34\x74\xc8\x08\x8e\xde\x28\x3c\x59\xbc\x11\x0a\x6a\x18\xc3\x5e\x1c\xcc\x39\xbf\x65\x66\x76\x4e\xb6\xc4\x78\x85\x10\x4b\xc8\x4f\x0f\x97\xa2\x15\x92\x6b\x0a\xb1\x6d\x91\x70\x21\xff\xb1\x41\x4a\xe2\x3e\x57\x40\xb9\x43\xde\xed\x8d\x5e\x0d\x75\xf3\x43\xc4\xb8\xcf\xc3\x82\xc8\x12\xc2\x78\x84\x20\x3f\x36\x0c\xb8\x9f\x4d\x7a\x64\x71\xa4\x14\x17\x47\x57\x1e\x16\xfb\x51\x10\x09\xb3\xb4\x51\x0f\x95\xb1\xc6\xd1\x03\xf5\x8a\xe8\x9a\xfe\xd2\xee\xb3\x17\xcc\x56\xc5\x51\xce\xba\xe1\x9c\x4d\xbe\x22\x8a\x1a\x69\x99\x92\xae\x8b\x0f\xf5\xc2\xde\x53\xcf\x36\x4b\x69\x3d\xf0\x63\xc7\x31\xbb\xc7\x2d\x76\xcd\xc0\xd5\xc6\xbb\x66\x18\x97\xfd\xee\xa6\x8b\xba\xcb\x45\x6a\xea\x54\xd1\x1d\xc7\xed\x4e\x9b\x7e\xd1\x9c\x1e\xec\xa8\x29\x92\xa6\x97\x5b\x4d\x6a\x59\x0a\x29\x2e\x2c\x2c\x16\xf7\x1c\x98\x75\x69\x75\x72\xbe\x18\x94\x8b\xa5\x40\x11\x84\xd5\x60\xac\x3b\xe6\x77\x4f\x13\xc3\xe3\xee\x78\xcb\x5b\xf6\x4c\x5f\x78\xea\x80\x52\x22\x7a\xc5\xe2\xd3\x5e\xf9\x8e\x53\xbb\x67\x9d\xb9\xaf\x5f\x5c\x28\x9a\xc5\x62\x71\xe7\x15\x3f\xfe\xfe\x57\x4e\x35\x1c\x4f\x09\xa6\xfb\x0b\xc5\x4a\x6f\x50\xda\xf9\xea\xd7\xbc\x7c\x8b\x3f\x3d\x33\x15\x74\x2f\xfb\xe0\xd8\xa5\x8b\x92\x48\xa8\xa5\x53\xcd\x3c\xa1\xfb\x67\xcf\x7d\xde\x42\xa9\x3f\x96\x98\xd5\x5a\xcd\xac\x2f\xcd\xcd\x14\x15\x42\x0d\x4a\x65\x37\x31\xb7\xdc\x7e\xd7\xbb\xcf\xde\x72\xe5\x25\xe7\xf7\xcc\xce\xe4\x54\xd0\x60\x06\x03\x20\x83\x1d\x7d\xbd\x30\x25\x3e\x3d\x3f\x8e\x99\xc0\x29\xb8\x1e\x37\xad\x62\x17\xe2\x63\xd6\x38\xc6\x11\xc4\xc7\xac\x71\x8c\x02\x62\x8c\x23\xc6\x32\x62\xec\x45\x8c\x03\x88\x71\x25\x62\xdc\x80\x18\xb7\x22\xc6\x1d\x88\x71\x1f\x62\x3c\x80\x18\x0f\x22\xce\x7f\x13\xb5\xcb\x19\xe2\xd9\x87\x31\xc4\x05\x33\x43\x5c\x37\xb3\x8a\x18\x17\xe0\xba\xdc\x1e\xd6\x37\x72\x93\xeb\x39\x1e\x43\xa7\x62\x3c\xe8\x89\x22\xb7\x4c\x4a\x2a\x2a\x2b\x23\xdb\xc1\xe7\x37\x37\x8d\xf9\xed\xe3\x28\xb0\x88\x92\x8a\x61\x2a\x2c\x0d\x96\xbc\xc5\x9e\xd8\xed\x89\xf1\x7a\x3c\x98\xbf\xe0\x6b\xe4\x5b\x62\x85\xe4\x01\xe3\xc2\xd2\x42\xa7\xcb\x4d\xdf\x21\xd7\xd4\x35\xc7\x9f\x37\x83\xb8\x78\x82\x63\xfa\x8e\x49\x77\x5f\xb4\x1c\xd0\x42\x24\xea\xd4\x2c\x8f\x6f\x7d\x9a\x19\x1b\x82\x51\xb3\xa8\x31\xe6\xf6\x8f\x9f\x69\xfa\xb5\xf1\x13\x3a\xd4\x75\x58\xee\x58\xef\x3f\x9d\x12\x67\xba\x5f\xdb\x7e\xdc\x09\x6f\x9f\x3e\x6b\x7b\x83\x2a\x76\xa5\xd7\xf1\x1b\x8d\xb1\x42\xa7\x6e\x58\x92\xd9\xe8\x14\x54\x5a\xd8\xfe\xc4\xdd\x92\x66\x9e\xd5\xd9\xb1\x3c\xff\xca\xba\x3f\x31\xde\x36\xf2\x6f\xf1\xac\x1a\xd5\xa3\x8a\x39\xf5\x9c\xdb\xee\xdc\x57\x3b\xf9\x8c\x73\xa7\xa6\xce\x3f\x67\xcf\x5b\xfc\xb9\xc5\x41\xc1\x9f\x5d\x1a\x6c\x79\x89\x7f\xc2\xd9\x8f\xef\xec\x7b\xd5\xc1\x17\x6d\xe7\x04\xfa\x8a\xa3\x8b\xc6\x4d\x24\x78\xe3\xfc\x25\x07\xf6\x16\xaa\xc7\x6f\x9d\xbd\xb2\xba\xef\xfc\xab\xb7\x9f\x79\xd7\x6b\x0f\x6e\x2f\x4c\x75\xaa\x66\xf1\xc4\x8e\x64\x74\x4e\x2c\x74\x2e\xdb\xbe\xef\x15\x37\x5e\xd9\x31\x0a\x91\x47\x57\xe3\xce\x1c\x60\xc0\xc0\xaf\xc9\x5d\xc2\x43\x60\xf0\xf3\x23\xb5\x09\x2c\xe3\x78\xec\xc3\xd9\xb8\x10\xdf\x26\xbb\xf9\x0e\x24\xbb\xb9\xee\xb1\x48\x18\x2d\xc5\x2b\xa4\x4b\x3b\x5d\x25\x25\x31\xd7\x3f\x4a\xcc\x7d\x07\xd2\x23\xf3\x03\xa5\x9b\x9f\xcb\x0f\x16\x96\x9a\x5d\x8b\xd8\x84\x3b\x04\xfd\x68\x69\xb0\x42\xf2\xcd\x19\xf2\x56\xed\xbc\xf5\x22\xed\x74\x69\x2a\x84\x1c\x81\x25\x04\x1c\xd7\x62\x10\xe5\xd6\x9c\x3b\x16\x3c\x4a\xe6\x93\x44\x3b\x4d\xa5\xd1\xe1\x81\x3a\x57\x59\x2b\x42\x1c\x51\xee\x82\xf0\x19\xe5\xfe\xca\x76\x32\x9f\x92\x78\x7e\x71\xa1\x47\x16\x06\x0b\x3d\x81\xbb\x11\xf9\xed\xa7\x26\x0f\xaa\x07\x7c\xe0\x38\xd7\x84\xcd\x86\x45\x1a\xdc\xa9\x68\x2a\xdc\x1d\xe9\x74\x17\x3a\xdd\x06\x1d\xe4\x2e\x50\x3f\x9a\x8f\x28\x0f\xba\xb9\x57\x93\xbf\x6d\x08\x73\xfc\xa1\x25\x36\x79\x60\xde\xcb\xaf\x76\x5a\x44\xe9\x87\x16\xe9\x2e\x75\xba\xa3\x77\x19\x3d\xc2\x23\xf3\x0e\x55\xf2\x9f\x1a\x75\x07\x2b\x64\xbe\xd3\x5d\x21\xdd\xc1\x52\x2a\xcc\x2f\x75\x56\xc8\x60\x71\x85\xcc\xff\x93\xc8\x55\xa7\xea\x48\x6a\xf0\x6c\xa6\xda\x6a\x60\xb8\x67\x05\xb2\xa8\xa9\x1a\x51\xd4\x37\x48\xc1\x09\xb2\xac\x3a\x86\x28\xbe\xb7\x38\x57\xd4\x55\xc7\x50\x6c\xdb\x56\x45\xe3\x06\x95\x88\x54\x97\x24\x95\xc4\x76\x62\xb0\x38\x9e\xfc\xa5\x2c\xeb\xac\x60\xc4\x7d\x55\x26\x44\xb1\x15\x55\x11\x45\x99\xd0\xa8\xec\xab\xae\x14\x94\x23\x41\x55\x64\xc1\x2e\xfa\x92\xdd\xb2\x25\x26\xfa\xdd\x88\xaa\xaa\x4a\x15\x55\x92\x35\xd1\x36\x54\x39\x56\xf2\xbf\xf9\x57\xd4\x54\x41\x6f\xc9\x92\xa4\x28\x82\x6c\x78\xae\xc7\x54\x87\x49\xa2\x6a\x8f\x07\xa2\x24\x88\xa5\xe5\x22\x95\xec\xd4\x56\x4d\x83\x51\xd1\x57\x7b\x96\x2c\x88\x92\x22\xeb\x32\x0b\x27\xa9\xc5\xf5\x78\xc3\x15\x6d\x89\x49\x76\xa9\x50\x30\x65\x5d\x92\x55\x5b\x95\x1c\x4d\xa1\x86\xad\xea\x2a\x95\x64\x45\x95\x99\x24\x99\xa2\x64\x4f\xc4\xaa\x27\xab\x02\x91\x35\x85\x32\xa3\xcc\x74\xa6\x28\x72\xb4\x35\xe6\x91\x91\x9e\x1a\x35\x43\x35\x44\x49\xa9\x48\xb2\x24\x89\x94\x10\xc5\xb4\xab\x3e\x49\x25\x6e\x68\x25\x49\xb7\x45\x61\x39\x30\x02\x35\x51\x93\x2d\xd3\x92\xdb\xb0\xcd\x72\x25\x0d\xd2\x69\xe6\x31\x49\x97\x45\xba\x53\xb5\xd4\x40\x22\x54\x20\x54\xf1\xe7\xf4\x20\x0c\x74\x25\x88\x22\x5d\xf6\x54\xd5\xb5\x45\xb2\x99\xfb\x47\x8a\xac\x84\xb7\xab\x9e\x1f\x6a\x6a\x22\xbe\xa0\xbe\xa3\x9e\xdf\x6d\x76\xc6\x3d\x16\x31\xbf\x2e\x89\x02\x11\xa9\x22\x48\xa2\x68\x17\x6d\x57\x94\x65\x51\x90\x75\x23\x54\xd4\x1a\x63\x26\x93\x0c\x43\x17\x8e\x4b\x8f\x4b\x07\x82\x4c\x65\x41\x73\x1d\x5b\x15\x4c\xd7\x95\x59\xa8\x6a\xb6\x63\x0b\x92\x40\x24\x26\xf9\x55\x5b\x72\x64\x49\x8a\x06\xf1\xbc\x62\x2b\x92\x2c\xd5\xf7\x36\xa8\xb3\x6d\x89\xd5\x99\x64\x78\x86\x9d\xda\x82\x6a\x30\xc1\x9f\xf0\xd5\x90\xc9\x8a\xa8\xda\x2a\x0d\x7c\x5b\x32\x18\xb1\x25\xea\x57\x6d\x95\x30\x66\xab\x62\x3c\x19\xe4\x43\xaa\xb1\x64\xb7\x3c\x6a\xbb\x8e\x2a\xca\x9e\xc8\x0c\x83\x6e\xaa\xc8\xc4\x50\xed\xd4\x1e\x13\x05\x4a\xf5\x28\x0a\x54\x4d\x72\x00\x15\x61\xf6\x2b\xf2\x43\x21\x05\x85\x81\x02\xea\x18\xc3\x3c\xae\xc3\x87\xf0\xe7\xab\x18\x5b\x7f\xb5\x78\x32\x1a\x39\x7c\x1e\xae\xcb\x21\x70\x0f\x9e\x97\x2b\x53\x19\x0d\x9c\x9c\xe7\x54\x5c\xb7\x5e\x66\x6c\xe4\xcc\x8d\xda\xe2\x46\xae\xba\xde\x77\x88\x93\x9d\x21\xfa\x6b\xab\x98\xff\x83\x92\xd3\xd7\x56\x71\xf6\x06\xfe\xf3\x37\x70\x3d\x63\x23\x77\x17\xee\xc1\x58\xde\xfe\x79\xce\x10\x1f\xe1\xfa\xfe\x19\x33\x9c\x28\x0a\x71\x72\x76\xae\xdd\xe8\x58\x44\x99\x1f\x28\xf3\xfd\xa5\x41\x37\xdf\x89\x16\x09\xb9\x6a\xb7\x44\x25\x5a\xea\x2e\x5a\x62\xe8\x5b\x42\x14\xce\xaf\x90\xc5\xf9\x81\x45\x9a\x0a\x8d\x02\xda\xec\x11\x6b\x5d\xcb\x0c\x96\xfa\xf9\x4f\x40\xc2\xfc\xf6\x63\xfe\x6a\x71\xd0\x9d\x5f\x58\x21\x7c\x7f\xa6\xdc\x67\x5a\x21\x8b\xa3\x57\x82\xb4\x3b\xb0\x48\xc8\x15\x4b\xd8\xb4\xc4\x26\x8d\xf2\x20\x24\xff\xa1\x49\x33\xef\x90\x9f\xe3\x85\xdd\x85\x25\xbe\xad\xb9\x91\x18\x44\x83\xa5\x41\x7f\x89\xec\x09\xc7\x5b\x29\xbb\xe4\x1a\x7b\x42\x57\xd9\x5f\xb3\x4e\xc8\xf7\x49\xab\x44\x25\x2d\xec\xcf\x8c\xe9\x8b\x8f\xbb\xda\x76\x55\xb2\x16\xba\xb2\x58\xd2\x45\xeb\x44\xd6\x60\xb6\x2c\xa8\x8e\x9e\x36\x9b\x0e\x6f\x7b\x16\x6b\xe8\x1c\x4a\xa2\x20\xb3\x42\xa9\xc0\x2c\xcb\x92\x04\x22\xcb\x41\xb1\x9a\x37\x60\x8e\xc5\xe4\xb0\xcd\xca\x4c\x74\xaa\xd5\xaa\x63\x32\xd7\x8f\x78\x8d\x15\x32\x37\x2c\x87\x7a\x18\x46\x7a\xde\x3b\x6d\x34\x1d\xab\x5b\xd5\x8b\xc5\x02\x63\xe2\x40\x63\x92\x1c\x4c\x2e\x8a\xd4\x0b\x3f\x5b\x72\x75\x2b\x48\x74\xa7\xd5\xa8\xea\x72\x77\x61\x4b\x51\x97\x64\x3b\x60\x8d\xea\x35\x76\x7b\x7c\xa6\x48\x4e\xd5\xd3\x46\xcb\xa9\x6d\xaf\x96\x99\xf4\x54\xea\x7b\xa6\xce\xa3\x26\xbb\xd5\x6e\x39\x36\x63\x2c\x4c\x8a\x0e\x73\x4c\x26\x73\x82\x4e\xb0\x75\xc7\x60\x32\x13\x45\x81\xda\xb5\x6a\xcd\xe6\x85\xba\xfe\xf1\x89\x8b\x27\x4d\x5d\x60\xef\xd6\x03\x5b\x67\xf5\x46\x45\x96\x63\x8f\x32\x99\x08\x92\xdd\x6a\xb5\x1c\x59\x10\x64\xcb\xda\x7e\xf5\x82\x2c\x50\x41\x8e\x06\xd1\x40\x97\x04\xc9\xe2\x3e\x85\x7f\xf4\x5b\xe4\x4a\x7c\x0d\x1a\x8a\x68\x63\x3b\x9e\xb6\xe1\xe5\xc6\xf9\x65\xd4\x6e\xa3\xdb\x59\xcc\x43\xbd\x81\xc5\x03\x55\x65\xb0\x42\x16\x3a\x83\x7c\x72\xd7\x7f\xf9\xb9\x42\x78\xec\x3b\xe8\xd0\xd1\xfd\x28\x4b\x54\x9a\x3c\x00\xee\xac\x90\xc5\xfe\x60\x69\x91\xcf\xf5\x36\xc2\x23\xd7\xfc\x02\x50\x1e\x0f\x7f\x2f\x2e\x18\x42\x1c\x6a\xe2\xb9\x4c\x14\x7a\x2b\x46\xa9\x14\x52\xa3\x5c\x0c\x69\x5a\xf3\x54\x3a\x53\xf1\x68\xc8\x35\x94\xdb\xac\x55\x8c\xfc\x64\x84\x4d\xc5\x06\xa1\xc4\x98\x39\xff\x3d\xf9\x2f\x24\x2a\xf5\x24\xf4\xec\xa4\x17\x53\x41\x94\x45\x49\x35\x44\xaa\x79\x95\x62\x62\xd8\x12\xf3\x0a\x71\xc1\x4b\x16\x06\x9b\x1b\xde\xf4\xdc\x7c\xe2\x4d\xf7\xe7\x63\x45\x92\xa6\x67\x6c\xea\x26\x15\x97\x0a\xa2\x7a\xb7\x3b\xbd\xb8\x9c\x6e\xa7\xb5\xf1\xc9\x86\xd7\x6c\x36\xdd\xfc\x16\xa9\x37\x36\x36\xe6\xcd\x9c\xd4\x74\x39\x64\x76\x33\x99\xe9\xf5\xe2\x78\x61\x71\x3e\x4e\x56\x62\x59\xd3\xa9\x20\x31\xca\x98\x41\x4f\xa1\xa2\xa6\xd9\x5b\x9f\xd0\x33\xea\xcd\xba\x41\x45\x2a\xe6\xff\x32\x01\x70\x8f\x70\xb9\xe0\xe6\xbf\x7a\xdf\x84\x0b\x81\xfc\x7e\xae\x25\x86\xfd\xdc\xca\xf1\x10\x3a\xff\x71\x41\x97\x8b\xb0\xdd\xb1\x48\xa7\x1b\x8e\x8e\x14\x48\x7f\x69\xb0\x22\x74\x16\x1b\x74\xa0\xa4\x02\x37\xb0\x4a\xa7\x91\xbb\xc5\xcd\xfc\x56\x53\x67\x61\x3e\x7f\xd7\x9e\x92\x15\x21\x22\xdf\x9a\xda\xbf\x7f\xff\x94\x1a\xf8\xe6\x15\x5f\xda\x5f\x59\xb2\xd5\x20\x0a\x8f\xde\x11\x27\xb6\xa6\x6c\x0e\x22\x53\x24\x3b\xdb\x7b\x4f\xda\xdb\xd6\x35\xd5\x98\xba\xf0\xbc\x73\x5b\x91\x2f\x4a\xe9\x8e\x17\x79\x8a\xa9\x08\x4a\x65\xfb\xd4\xe5\x0f\x5f\xae\xaa\xaa\xa6\x8c\x59\xb1\x67\xab\xb6\x5d\x39\x71\xef\x89\x95\xa0\xdb\x69\x37\x6a\xa4\xa2\x88\xaa\xa4\xda\xae\xe5\xda\xb2\x5d\xd9\x92\xaa\x82\xf8\xba\xa8\x3f\xd8\x9c\x6e\x09\x94\xc6\xd8\xf8\x92\xad\x18\x24\xba\x5f\x10\x54\xc5\x92\x65\x4b\x69\x4e\xcd\x45\xbe\x7f\xab\xaa\x8a\x64\xea\xdc\x29\xcb\xe2\x46\xf3\x51\xd3\x0f\x54\xab\xa0\x2a\x8a\x6a\x8b\xaa\x25\xeb\x5c\x36\x52\xf6\x44\x32\x85\xdf\xc2\x40\x84\x16\x76\xe1\xed\x43\xec\x9e\x19\xa2\x32\x33\xc4\x6e\x27\xbf\xaf\x09\x73\x66\x88\xf8\xf0\x10\x58\xcb\xbd\xd9\x0a\x8e\xa0\x72\xcc\x9b\xad\xa0\x80\x0a\xc6\x51\xc1\x32\x2a\xd8\x8b\x0a\x0e\xa0\x82\x2b\x51\xc1\x0d\xa8\xe0\x56\x54\x70\x07\x2a\xb8\x0f\x15\x3c\x80\x0a\x1e\x44\x25\xf7\x66\x2b\xce\x10\x13\x87\xb9\x66\x35\x31\x91\xeb\x3b\x5e\xd2\x58\x1b\x62\xc2\x19\xa2\xcd\xc7\x74\x86\xd8\xb6\xfe\xbc\x63\x1d\x9e\xc0\xf5\xe1\x8e\x7c\x07\xe4\x3f\xa1\x1e\x58\x5c\xf3\x09\x91\x92\xaf\xfc\xfc\xa2\x44\xfe\xd3\x8f\xc5\x06\x8d\xf3\xcb\x6b\xf9\x7d\x88\x06\x55\x82\x46\x97\x2b\x49\x1e\xdb\x45\x96\xf0\x9c\x62\xd9\xac\x2e\x4c\x77\x7d\x33\xad\x55\x67\x8a\xae\x28\x28\xff\x3f\xf6\xde\x3c\x48\x8e\xeb\xbc\x13\xfc\x5e\x66\xbe\x97\xc7\x7b\x79\x9f\x75\x65\xdd\x95\x7d\x56\x75\xd7\x89\x26\xd0\xd5\x20\x1a\x00\x01\x82\x04\x48\x42\x3c\xc0\x13\x04\x29\x8a\xa0\x45\x8a\x12\x25\x40\xd4\x41\x49\x10\x48\x8a\x1a\x49\x24\x25\x92\x32\x25\xf9\x58\x59\xc3\x31\xe5\x19\x5b\xb6\x67\xe9\x62\x8f\x3d\xa6\xc6\x96\xb4\xdc\x19\x4b\xbd\x96\x3d\xb6\xbc\xb0\x35\xb2\x2c\x87\x83\xde\x95\x66\xd6\x76\xd8\x31\x6b\x03\x1b\xf9\xb2\xba\x4c\xef\x3f\xbb\xb1\xe1\x88\xf5\xce\x02\x8c\x60\x7e\x55\x79\xbd\x7a\xfd\x8e\xdf\x77\xfd\xbe\x56\x5e\xaf\xe9\x95\x7a\xd3\x4b\x47\x6d\x72\xe8\x59\x2c\x0a\x44\xaf\x57\x02\x6f\x71\x79\xc9\x95\x74\x6e\x75\xdc\xdf\x7f\x6b\x3f\x1d\x51\x72\xbe\x97\x27\x41\xab\xe3\xc9\x8c\xa0\x5f\xcc\xef\xba\x62\x57\xde\x1d\xad\xaf\x2f\xfc\xb8\x27\xe9\x3e\x71\x93\x85\xe5\x9c\xaf\xe7\x96\x17\x5a\xae\x5e\x28\x55\x5d\x86\x25\xa6\xeb\xb9\x2b\xf6\x6c\x54\xce\x06\xba\xee\x59\x06\x67\x93\xb9\x74\xe9\xd2\xc7\x85\x4f\x08\x7f\x07\x26\x94\x61\x03\xde\xc9\x67\xf7\xce\x6f\xeb\x8d\x79\xde\xdd\xa8\x65\x08\x3b\xc9\x7a\x3c\xe2\x3c\x1d\xaa\x32\x9f\xd8\x61\x10\x76\xc7\x42\x6f\x9a\xbd\x5d\x6b\x23\x32\x9a\x66\xb9\x4c\xed\x44\xe9\xb4\xf6\x6a\x83\xfe\x34\x54\x7d\x03\xd5\x5b\xc3\x18\x8d\x86\xc1\x87\xed\x15\x9b\xd9\x73\x73\x49\x25\x22\x4e\x39\x2e\xa3\xb9\xeb\xeb\x87\x97\x06\x47\x17\xdb\x7a\xad\xd9\xb2\x87\xef\xbe\xa7\x7f\x7a\x60\x2f\x2c\x2d\x38\x58\x11\x25\x31\xbd\xc4\x29\xe4\xed\xfc\xa1\xa3\xd7\xd7\x9d\x56\xb3\xf6\x42\x7c\xe0\xe0\x81\xd8\xee\xd8\xaa\x6f\x33\x6e\xf6\x08\x96\x16\x97\x02\x96\xd7\xec\x5c\xbe\x5a\xb0\x17\x97\x3b\xc1\x7b\x98\x24\xaa\x54\x5a\x3e\x95\xd8\x91\x4d\x31\x42\x5a\xa9\x24\x11\x4a\x85\x37\xae\xbf\xea\x03\xe3\x47\xfe\xe8\x81\x70\xee\xaa\x83\x87\x92\x77\xfd\xf0\x85\xbb\xbf\xf9\xc0\xd2\xcd\x37\xdf\xb2\x28\x21\x84\x44\x59\x95\x69\x61\x6f\xfe\xe8\xe7\x3e\xfb\xfc\x11\x51\x40\xce\xd5\xcf\x3e\xf3\xec\xd5\x4b\xd7\x2c\xd5\xb0\xee\xf8\x3a\x36\x54\x51\x97\x04\x59\x56\x55\xa7\x6e\x27\xc7\x8f\x1f\x4f\x16\xdf\x72\xfc\x2d\x4b\xef\x51\x44\x41\x90\x14\x0c\xd2\xa5\xbf\xb8\xf4\xcb\xc2\x47\xc4\x16\xef\xd3\xf5\x69\x9f\x8e\x3b\x3c\x3e\xf4\xff\xb2\x4f\x87\xdd\xff\x53\x9f\xb6\xfe\xef\xf5\x68\xba\x44\x3c\x62\x77\x6c\x6a\xcf\xcd\xb7\xaa\x69\x9f\x96\xcb\x68\xfe\xfa\xfa\xe1\xe5\xde\xb1\xa5\xb6\x5e\x6f\x26\xf6\xe0\x91\x7b\x07\xf7\x0f\xec\x45\xde\xa7\x92\x24\xd9\xe5\x72\xd9\xc9\xf3\x3e\xbd\xae\x5e\x3b\xfa\x54\x79\xd6\xa3\x0e\x53\x0c\xdd\x50\x83\xc5\xa5\xc5\x80\xe5\x55\x3b\x97\xaf\xe5\xed\xc5\xf6\xac\x47\x83\x95\x95\x0e\xca\xfa\x54\xa0\xc5\x92\x44\x34\x2a\xfc\xf9\x0d\x07\x3f\xb0\xf1\xae\xef\x3e\x10\x26\x87\xae\xba\x2a\x79\xe4\x87\x2f\xdc\xfd\x2d\xde\xa7\x4b\x18\x09\x82\xa2\x2a\x5a\x7e\x5f\xd6\xa5\xb2\x79\xf5\xb3\xcf\xf2\x0e\xad\x4b\xff\xa0\x43\x15\xc5\xa9\xdb\x73\x37\xf0\x0e\x7d\xcb\xf1\xa5\x33\x8a\x28\x0a\x92\x24\x20\x00\x30\x2e\x5d\xbc\x74\x56\x38\x20\x22\x30\x21\x82\x0e\x1c\x84\x23\xf0\x05\xf8\x2f\x08\x21\x0d\x55\xd1\x2e\xb4\x8e\x3e\x85\xbe\x8f\x06\x30\x81\xd7\x3a\x13\xf4\x4b\x9d\x09\xfc\xa8\x33\x41\xdf\x9b\x61\x96\x14\x14\x51\x7e\x7c\x69\x1a\x99\x6c\x01\x85\xf2\xd4\x98\x4c\xb8\xef\x79\x0b\x06\xf0\x1a\xfc\x88\x4b\xeb\x33\xe9\xd0\x4c\x3a\x32\x93\xee\x86\x4f\xc1\x4b\x33\xff\xf9\x63\xdb\x13\x20\xd6\x04\x26\xdb\x13\x28\x5b\x13\x78\x7d\x7b\x0b\xfe\x68\x7a\xed\x04\x5e\xb2\x26\xf0\x67\xdb\x5b\xf0\xd7\xd3\xb7\x4c\x80\x5a\x13\xf8\x3b\x9e\xa9\x3c\x6d\x01\x22\xb3\x73\x65\x6b\x82\xec\xed\x2d\x94\xec\xbc\x0b\x75\x66\xd2\x15\x33\x69\xd6\x3a\x74\xfc\xcd\x2d\x41\x0f\x4f\xa3\x95\x3f\xbc\xcd\xdf\x8b\x7e\x3c\x6b\x19\xfa\x72\xd6\x32\xf4\x6f\xb6\xb7\xd0\xf6\x9b\x5b\x86\xfe\x80\x47\x2d\x8b\x32\xb7\xc7\x90\x2c\x9d\xd7\x1f\x8b\xa3\x9d\x9c\xe0\xb6\x58\xaf\xb5\x45\x92\x78\x32\xa9\x27\x1e\xf1\xbb\x63\x14\x64\x46\x68\x03\x71\x5c\xe6\x66\xd8\xac\xd7\xcd\x52\xe6\x7c\x43\x94\xd3\x7b\x79\x4a\x9d\x28\xa7\xd8\x20\xcb\x10\xee\x0e\x7b\x59\xf8\x2d\xd7\xff\xeb\xe9\xde\x36\xe0\xcf\xa9\xb5\x9a\xe9\x88\x37\x44\xb9\xcb\x8d\xce\xd3\xb4\x60\xb1\x6e\xa0\x54\xb5\x93\x07\x63\x6e\x69\xee\xf1\x05\x95\xdb\x92\x46\x99\xf7\x37\x85\x10\x86\xb0\x88\xc6\x68\x03\x25\xa3\x6e\x80\xfe\xdb\xf8\x19\x77\x30\x5d\x95\xc9\x5d\xf1\xb0\xb7\x12\xc5\x07\x0e\x6c\x28\x73\x21\x89\x0b\xcc\xb3\xa2\xb2\xaf\x13\x67\xae\x51\x20\xcc\x71\x5c\xc6\xca\x95\x6a\xc1\x93\x04\x49\xb3\x2c\x67\x2e\xa9\x31\x62\x3b\x36\x71\xe6\xe7\xe7\xbb\x56\xa7\xf2\x0e\x26\xf1\x70\x26\x1e\x86\xc4\x24\x96\x2c\x2f\x3b\x96\xb3\xbc\xb2\xec\x10\x4d\x94\x19\x4b\x96\x96\x1d\x49\x52\xf6\x2a\x51\x7c\xe5\x95\x57\xc6\x66\xd4\x59\xa8\x31\x62\x8a\x66\xc4\x4a\x71\x89\x11\xcb\xd4\x58\x6b\x21\x61\x2b\xb7\xde\x7c\x1c\xf5\x53\xbd\x96\xbf\x83\x5f\xe6\xa8\xc4\x24\xf5\xdb\x57\x9c\x38\x2e\x3b\x2b\xa7\xf6\x64\x9e\x33\x8b\x49\xa4\xde\x8f\xf6\xa6\x40\x8b\x04\x51\x40\x08\x33\x5d\xc6\x13\x55\x9d\xf9\x85\x39\x87\x4b\x16\x53\xd8\x31\xcb\x3a\xf9\x6b\x17\x7f\xe3\xff\x17\x3f\x93\xb0\xd0\xb7\x89\x45\x14\x33\x1f\x49\xca\xe7\x59\x31\xfc\x70\xb4\xb8\xbc\xfa\xbf\xb2\x5a\x32\xe7\x10\x33\x72\x58\xe8\x50\x27\x70\x25\xf7\x8b\x92\x24\x9b\x34\x62\x8a\xa8\x3a\xcc\x75\x1c\xc6\x04\xd5\xcc\x3f\xdd\x79\xef\x55\xc8\xe8\x5c\xb7\x82\x49\xaa\xf7\x12\x89\x45\xcd\x46\x2b\x72\x7c\xbf\x10\xf1\x8e\x88\x7c\xa6\xb1\xb4\x73\x56\x6e\x6b\x30\x45\xb2\xfc\x6a\xe2\xc4\x7b\x37\xae\x88\x58\x0a\x15\x04\x51\x64\x0b\xc7\xae\x3d\xba\x40\x04\x81\x08\x92\xd6\x38\x74\xf5\xd1\x05\xd9\x89\xa3\xe8\x8a\x8d\xbd\xf1\xca\x26\x63\xc5\x30\xfd\x41\x12\xb3\x88\x15\xad\xf4\x86\x71\xb8\xbf\xc1\xa3\xdd\x78\x16\x37\xab\x56\x0b\x04\x13\xcc\x01\xb5\xc6\xb4\x95\xbb\x56\xde\x61\x59\xd2\xdf\xa9\xff\x2d\xfe\xaa\x54\x4f\x27\x97\x3e\x84\xea\xa2\x01\x2a\xcf\x28\xba\x12\x6e\x84\xb7\xc2\x07\xe0\x9f\x43\xb8\x05\x27\xe1\xb3\xdc\x15\x78\xd2\x9a\xc0\x17\xb6\x61\x02\xdd\x14\x23\xd5\x0c\x41\x1e\x67\x5a\x4f\xaa\x8a\x8e\x6a\x86\x50\xf7\x7b\x81\x27\x13\xb9\x3b\x1c\x0d\x5b\x23\xae\xad\x7a\x44\xae\x4d\x6d\x50\xf5\x31\x1a\x05\x63\x31\x48\xd2\x3b\x87\xe9\x62\xc3\xf5\x26\xd1\x10\x43\xcf\x10\xfc\x54\x77\x1a\x8e\x78\xce\x83\x10\xf6\xb8\x0e\x65\x20\x8f\xa4\x1a\x94\x4b\x78\xe0\x8a\x21\xd4\x49\x1b\x11\x13\xf1\xa8\x9a\x31\x1a\xf4\xc7\x42\x32\xca\x72\x1b\xc2\xef\x79\x8b\xcd\x22\xf6\x16\x5a\xc5\x13\x51\xa8\x49\xd2\x95\x92\x28\x3c\x62\x06\x6e\x60\x1a\xe9\x26\x5c\x5a\xf4\xa8\xe4\x62\x22\xfa\x71\xd5\x9b\x3b\xe4\x69\x22\x56\x74\x6f\x57\xac\x57\x2a\x71\x64\xfc\x94\xe9\xdb\x96\x86\x5d\xd7\xc5\xa6\xef\xf9\xa6\xe6\x79\x5e\x80\x03\x8f\x62\x85\x2a\xfb\xb0\x20\xbc\xbf\xb4\xe8\x31\x4d\xd0\xd2\x67\x49\xa9\xc6\x58\xde\x1d\xeb\x9e\x67\xe6\x0b\x65\x4f\x65\x06\xd6\xa2\xc0\xc5\x82\x20\x72\x45\x94\x31\x19\xeb\x5e\x83\x9a\x71\xa5\xee\xa9\x9a\x17\x7b\x9a\xca\xa2\x9f\xf0\x56\xfa\xc3\xdc\x31\x33\x8e\xe3\xfd\xba\xc9\x1e\xc0\xaa\x24\x61\xdf\x2b\x1d\x96\xbc\x95\xce\xa2\xe9\x35\xd2\x97\xce\x25\x73\xde\xdc\x46\x49\xd6\x6c\x5b\xf0\x8f\xe8\x5e\x90\xea\xe0\xa2\x86\x9d\x20\x4a\x25\x19\xfd\x4b\xfe\xca\xe5\x13\xb7\x9e\x58\xde\xb7\x7c\xcf\xfd\x0f\x3e\xea\x7b\x73\xc7\xae\x39\x52\xc7\x1a\xb3\x34\xcd\x73\x3d\x8d\x56\x34\xf4\xf2\x1f\x7e\x47\xab\xd4\x2b\x9a\x46\x31\xe2\x5a\x30\x11\x38\xd7\x3f\x5e\x3a\x71\xf3\x5b\xe6\x8e\x95\xc7\x73\x96\x99\xaa\x1e\x20\x83\x85\xfe\x2d\x3a\x24\xca\xa0\x80\x07\x75\x58\x84\x83\x70\x13\xfc\x34\x5a\xde\x82\x0d\xc8\x73\xb0\x70\x33\x34\xf9\x91\x41\x13\x6e\x9e\xfa\xa2\x33\x69\x02\x66\xc6\x37\x66\xc2\x1b\x60\xee\x68\x23\x26\xe4\xc0\x84\x79\x30\x61\x0d\x4c\x38\x0c\x26\x9c\x00\x13\x4e\x83\x09\x8f\x82\x09\x4f\x81\x09\x2f\x82\x09\x2f\x83\x09\xaf\x82\x09\xaf\x83\xc9\x3d\xdd\xce\xec\xe9\x73\xb3\xa7\xe7\xad\x09\xf4\xb6\xb3\x9c\x35\xd3\x9a\xc0\xed\x17\xb6\x60\x09\x7a\x70\xbb\xed\xac\xf1\x8c\xb5\x0d\x08\x60\x03\x5a\xb0\x01\x43\xd8\x80\x83\xb0\x01\x37\xc1\x06\xdc\x07\x1b\x70\x06\x36\xe0\x09\xd8\x80\x17\x60\x03\x5e\x82\x0d\x78\x05\x36\xe0\xeb\xb0\xb1\x93\xb1\xb6\x01\x3f\x80\x0d\x9e\xb1\x76\xb3\x35\x81\x63\xdb\xd9\xf3\xdf\xb2\x3d\x81\x0d\x9e\xa7\x36\x81\x77\x77\x26\xd0\xb4\x26\xf0\xe8\x76\x76\xfc\xc0\xf6\x04\x3e\xd0\xc9\xce\xa7\xd0\xe2\x76\x6b\x02\x5f\x4c\x75\xa1\xc7\x3b\x2b\xab\x6e\x8d\xc8\xdc\x8c\x3c\xaa\x11\x7f\x18\xf4\xb8\xe3\x8b\xdb\x8f\xc7\x62\xd2\x16\x47\x53\x53\x74\x12\x78\x7c\x3b\xe5\x41\x56\x7e\x8f\x5b\x7e\xfa\xad\xa4\x9f\x6a\x0e\x31\x0a\x87\x31\xea\x8e\x86\x6d\x21\xa9\x91\x51\x7a\xaf\xc7\xb7\xd4\x56\x2d\xdd\x23\x93\x56\x9f\x13\x8c\xf0\x87\x76\x03\xd9\xe3\x6a\x30\x9f\x07\xc9\x18\x0d\x86\xdd\x18\x8d\xd2\xcd\x97\x04\x3e\xdf\x6c\xc3\x4f\x39\x89\x6a\xe4\x0d\xcc\x1e\x54\x55\xd5\xe1\x85\x37\x9c\xff\x99\x8a\xcc\x90\x2c\x86\x65\xaa\xab\xca\xd3\x8e\xe3\x38\x44\x35\x5f\xc0\x58\x40\x22\xf6\xb0\x6a\x12\x81\x32\x86\x75\x6c\x84\xc5\xa7\xd4\x00\xcb\x3a\xa3\x58\xc0\xaa\x26\x18\x95\x83\xb2\xa0\xa8\x92\x21\x6b\xcc\xd1\xb1\x97\x2e\x5d\x92\x24\x23\x51\x55\x75\x43\x10\x09\x56\x05\xac\x63\x95\xa8\xe1\x52\x88\x03\x55\x35\xd5\x28\x8a\x54\x55\xc1\x22\xc6\x58\x60\x54\x16\xc2\x6e\x88\xfe\xd2\x71\xb0\xa0\xaa\x56\xdd\x57\x31\xc6\x06\xc6\xe8\xe7\x0b\xbb\x76\xed\x2a\x48\x1a\xb3\xa9\xb3\xb0\xb4\xb4\x14\x2f\xdf\x32\xef\x2c\xdf\xdb\xc1\x02\x46\x48\x9a\x3f\xdc\x30\xca\xaa\x8c\x44\xbc\x7c\xcb\xbc\xa7\x23\x31\x1c\xde\xd9\x15\x24\x2c\xe7\x7a\xfd\x5e\x0e\xc9\x4e\xa3\xd1\x70\x8c\x96\xa1\x86\xbe\x2d\xa8\x2a\x26\xa2\xa0\x06\x41\xa0\x36\xf6\x56\xbc\x66\xa3\xe9\xe9\x58\x15\x8d\x9c\x8a\xe5\xdd\x0f\xed\x76\x1a\x8e\x24\x20\xac\x99\x96\x9c\xfe\x24\xcb\xb2\x54\xcc\x30\xf8\x00\x97\xfe\x93\xf0\x11\xe1\x7b\xa0\x42\xc0\x3d\x0b\xab\x70\x05\xec\x83\x23\x70\x1d\xdc\x0a\x27\xe1\x34\x9c\x81\x0f\xc2\xc7\xe1\x33\xf0\x32\x7c\x05\xfe\x2d\x3a\x8e\xfe\x4e\xf8\x85\x2d\x08\xe1\x3a\x3e\x27\x0e\x23\x6f\xea\x5f\x42\x1e\xbc\x81\xbc\xe9\x1c\x40\x1e\xe4\x90\x07\xf3\xc8\x83\x35\xe4\xf1\xab\x4e\x20\x0f\x4e\x23\x0f\x1e\x45\x1e\x3c\x85\x3c\x78\x11\x79\xf0\x32\xf2\xe0\x55\xe4\xc1\xeb\xc8\x4b\xe7\x00\xe2\xd7\xf2\x30\xcc\xb5\xce\x04\x3e\x72\x61\x0b\x00\xad\xc1\x47\xf8\xac\xd0\x66\x92\x33\xbd\x6a\x0b\x8a\x70\x1d\x84\xfc\x7a\xcf\x9a\x40\x75\x7b\x0b\xbd\x7f\xf6\x84\xf7\x77\x26\xe8\xfc\x05\xde\xb2\xf3\xf0\x06\x3a\xbf\xd3\xb2\xf3\x90\x43\xe7\x61\x1e\x9d\x87\x35\x74\x1e\x0e\xa3\xf3\x70\x02\x9d\x87\xd3\xe8\x3c\x3c\x8a\xce\xc3\x53\xe8\x3c\xbc\x88\xce\xc3\xcb\xe8\x3c\xbc\x8a\xce\xc3\xeb\xe8\x3c\xb7\x15\xb4\xb6\xd3\x99\x97\xbd\x6d\x0b\xba\xb3\xb6\x6c\xce\xda\x72\xed\x4e\x5b\xe0\x23\xd6\x04\x6e\xdb\xde\x82\xdb\xe1\xba\xe9\xb9\x53\xb3\xab\xde\x36\x93\x1e\x9b\x3d\xe3\x13\xb3\xef\x9e\x9d\x49\xcf\xcd\xce\xbe\x34\x7b\xca\x97\x67\xdf\xfd\xab\x99\xf4\x8b\xb3\x36\xfd\xea\xac\x2f\xce\xf3\xbc\xd1\x2d\xf8\xe6\xf4\xce\x09\x84\xd6\x04\xbe\xb3\xcd\x8f\x08\x2e\x6c\x21\x79\xe7\x99\x28\xb7\xd3\x5f\x70\xd8\x9a\xa0\xcd\xed\x09\x7a\xbf\x35\x41\x57\x4f\x8f\xc7\xb6\x79\xcf\x72\x95\x22\x9c\x26\x44\x5e\x67\x4d\xd0\x6f\x4f\x8f\xbf\xc7\x03\x70\xb3\xb6\x64\x4f\xb8\x74\x01\x26\xe8\x27\x3b\x13\xf4\xd3\x9d\x2d\x74\x2b\xdc\xcd\xb7\xcd\xbb\xad\x09\xdc\xb4\xbd\x05\x6f\x83\xbb\xd1\xad\xbc\xb1\x0f\xcc\xa4\xc7\x66\xd2\x27\x66\xd2\xb3\x33\xe9\xb9\x99\xf4\xd2\x4c\xfa\x57\x33\xe9\x57\x67\xd2\x37\x77\x24\x74\xef\x4c\xfa\xe1\x54\x5a\x59\x6d\xca\x29\xc0\x1f\xf6\xfa\xc3\x30\xc3\xfe\x68\x60\x88\xdc\x14\xbd\x13\xa1\x13\x23\x7f\x2c\xf4\xe5\x54\x19\x6a\x92\x96\x81\xc2\x5e\x77\xd8\x34\x32\xaf\x59\x33\x1c\x8b\x83\x1a\x69\x0e\x0c\x14\xf2\x50\xd2\x96\x81\x46\xfe\x68\x50\x23\xa3\x7a\x8a\xe2\x6b\xa4\x39\xf5\x9d\x71\xda\xa3\x26\x7f\xd7\x28\x91\xeb\x5c\xa7\x08\xc6\x42\xe8\x8f\xc5\x81\x91\xae\x5c\x88\x2c\x66\xd9\x2e\xfd\x56\x32\x46\xeb\xe9\xf3\x13\x03\xf9\xa3\x7e\x2b\x31\xc4\x30\x30\x50\x10\xf6\x5a\xfd\x91\x21\xfa\x31\x2a\xa1\xba\x21\xca\x49\x2b\x05\x04\x35\x03\xf5\x07\x7e\x66\x4d\x42\xd3\x20\x5b\x7f\x6a\x65\x35\x50\x2b\x4b\xb7\xe9\x0e\x7b\x63\x14\xfa\xa3\xfe\xb0\xdf\xaa\xf3\xdf\xd5\x1f\xa3\x6e\xaf\x3b\xec\x79\xb1\x20\xf7\xc6\x22\xb7\xb5\x26\xdc\x0b\x87\xc6\x88\xbf\x94\xb7\x65\x9a\xcc\x13\x8c\x85\x51\x0a\x66\xea\xfc\x53\xbf\x2d\x84\x99\x52\xc4\x09\x05\xd2\x1f\xc8\x9d\xb8\xc8\xe7\x4e\x59\x03\xd5\x03\x43\xc8\x84\x54\xaf\xe2\x4a\x52\xdd\x98\xd2\x15\x78\x29\x10\x4e\x81\x8c\x4c\x38\x4e\xe1\x9e\xfe\x01\x27\x91\x4a\x86\x6d\x4e\x48\xd0\x1d\xf6\x06\xb5\xf4\x6c\x3f\x0b\xc3\x4d\xf5\x2a\x6e\xd0\xef\x8f\x85\x01\xb7\x78\x4e\x5f\xcc\x7f\x19\x77\x09\x70\x2e\x83\x14\xe9\xa0\x2b\x0e\x68\x36\x6d\x7a\xf6\x03\x9a\x6d\x5a\x1a\xb5\xcd\x38\xef\xfd\xb6\x29\x61\x82\x4d\x45\x94\x7f\xcb\x57\x09\xc5\x58\xfc\x33\xc3\x6a\x35\x8a\x12\xba\x4a\x2b\x86\x3a\x2e\x50\xef\xe2\x2b\xbe\xa4\xf9\xaa\x44\xd1\x37\x4d\xad\x94\x73\xfc\xa5\x8b\x1f\xa2\x86\xf6\xa0\x59\x8f\x23\x6c\xd6\xe2\xe8\xe2\xd0\x0b\xbf\xc9\x34\xdf\xf3\x34\xaf\x75\x31\x4a\x1f\xa6\x89\x54\x24\x0a\xba\xd7\x93\x55\x5f\x2b\x6e\x1a\x38\x45\x8f\x9a\xa5\x6b\x1f\xd1\xaa\xe5\xa0\xbc\xfc\x6e\x6c\x6b\x46\x83\xf9\xf3\x7e\x0a\x8a\xa8\x68\x78\xbb\x73\x9a\x38\x27\xff\x0a\x36\xa8\x48\xb0\x28\x8a\xd4\xa0\x7f\x81\x4d\x5d\xa5\x92\x69\xc6\x39\x0f\x1b\x8e\xe3\x85\x14\x13\x51\x16\x55\x93\x36\x7d\x77\x39\x56\x34\xe5\x24\x47\x29\x92\x17\x97\x0b\xc4\xa4\xd4\x57\xfd\xa1\x7f\x83\x28\x6b\x9a\x28\x08\x38\x05\x58\x5e\x4e\x53\x14\x11\x17\x70\x10\xda\x2a\x37\x36\x29\x22\x31\x6b\x8d\xba\x69\x69\xe5\x65\x8f\x12\x49\xc1\x02\x35\xe3\xb8\x6c\xe9\x66\xbd\x16\x6b\xba\x24\x0a\x18\x29\x76\x92\x76\x12\xd5\xa2\xd0\xc5\x29\x76\xd3\x64\x41\xc0\x9e\xa7\x29\x58\xd6\xa8\xe7\x98\x18\x2b\x7e\xc9\xc4\xa6\x69\x62\x41\x92\x25\x49\x66\xc5\x14\x67\x69\xe9\xd3\xb0\x20\x89\xf1\xb2\x2f\x48\x32\x6f\x46\x7a\x7b\x79\x3d\xe6\xd5\xc9\xb0\x28\x2b\x58\x33\x03\x93\xfa\x34\x58\x2b\xe3\x69\x2b\xcd\x72\x29\xa7\x4a\x22\xe2\x65\x93\x34\xaa\x61\x8d\xbf\x82\x10\x4c\xab\x34\x7b\x88\xac\x33\xab\x90\x2b\x98\xb7\x15\x69\x95\x9a\x5e\x41\xe6\xdb\x52\xe4\x61\x42\xed\x3b\xcd\xb9\xa5\x25\xdf\x9f\x9f\x9b\xaf\x69\xb9\x62\xd9\xd4\xe2\x72\xd1\xca\x63\x59\x0f\xfc\xe3\x04\x09\x86\x17\xf7\xe2\xf5\x8a\x16\xd7\x6a\xe6\x1c\x16\x65\xd7\x33\x0e\x8c\xfc\x48\xd3\x35\x49\x54\x2d\x81\x38\x72\xc1\x98\xb3\x24\x85\x2a\x72\x4d\xf3\x7c\x5f\xd3\xe4\xb4\xd7\x4d\xac\x25\x9e\x44\x37\xf5\x05\x8c\x31\x51\x4c\x47\x29\x64\x5e\x16\x52\xb1\x3a\x4b\x65\x8d\xd0\xb4\x95\x44\x6d\x79\x86\xa1\x29\x7f\x52\x3e\x52\x36\xca\xeb\x65\x4c\x75\x4b\x33\xcb\xe5\xd8\x9c\xbf\xf3\x38\x96\x65\xa6\x95\x8f\x94\x75\x2c\x10\xdd\x32\xdf\xf6\x56\x91\xa6\xcd\xd6\xfd\xd5\x95\x25\x93\xea\xaa\x1b\x51\xac\xe9\x16\x35\x89\xe9\x78\x9a\xef\x10\x41\x50\x0d\x6f\xde\xd7\xd3\xf1\xa5\x63\x43\x57\x31\xd5\xcd\x74\x54\x9a\x56\x21\x9f\xb7\xb0\x4c\x6d\x33\x7d\x03\xe5\xa8\x14\x23\xac\xe2\xf2\x92\xa7\xfa\x1a\x36\x4c\x93\x70\x3f\x0e\x96\x34\x03\x9f\x24\xe9\x9b\xbd\x46\xad\x6c\x69\xae\xa9\x15\x3f\x86\x31\xa6\x8a\x64\x5a\xe5\x72\xd9\x24\x8a\x13\x69\xde\xee\xb2\x96\xcb\xe5\x35\x82\x44\x29\xdf\xac\x56\xfc\x14\xd9\x4b\x22\x11\x44\xe5\x41\xea\x3a\x26\xc1\x9a\xa6\x61\xac\x49\x12\xb6\xa8\x24\x12\x2d\x97\xcb\x69\xfc\xcf\x62\x6b\xd8\xd0\x24\xac\x05\x61\xde\xe4\x73\xc0\x28\xe8\xfc\xf5\x66\xe0\x58\x9a\xee\x38\xc4\xac\x37\xea\x26\x9f\x64\xe9\x1f\x38\x1d\x50\x5e\xb7\xd7\xf5\x44\x0d\x7b\x61\xa4\x69\xbe\xe7\x6b\x4c\x57\x30\x00\xe8\x50\xbf\xf8\x7d\x41\x16\x5f\x00\x1d\x0a\xb0\x0c\xc7\xe0\x4e\xb8\x1b\x3e\x00\x9f\x80\xef\xc0\xf7\xe0\x47\x70\x11\xdd\x03\x5f\xdf\x82\x16\x18\x3b\xf1\x28\x06\xbc\x01\xc6\x0e\x66\x36\x20\x07\x06\xcc\x83\x01\x6b\x60\xc0\x61\x30\xe0\x04\x18\x70\x1a\x0c\x78\x14\x0c\x78\x0a\x0c\x78\x11\x0c\x78\x19\x0c\x78\x15\x0c\x78\x1d\x0c\x8e\x99\x01\x0c\x68\xf1\xbd\xc7\xb0\x26\x60\x6f\x4f\xc0\xee\x64\xb2\xbb\x3d\x01\x77\x2a\xfb\x17\x26\x10\x6e\x6f\xf1\x27\xb6\x66\x44\x82\x0f\x6f\x4f\xe0\xe1\xce\x16\xfc\x01\xb8\xf0\x30\xdf\x44\xfe\x70\x7a\x7e\x0b\xfe\x78\x76\xa5\x3f\x4d\xea\xfc\xab\x4e\x26\xff\xcd\xf6\xca\x2a\xea\x75\x83\x30\x08\x47\x44\x36\xd0\x22\x5f\x8e\x89\x3f\x5a\x17\x6a\x86\x30\x32\x90\x1f\x72\xa7\x00\xcf\x1a\x98\xc2\x58\x9e\xea\xe8\x93\x74\xb9\x4d\x78\xdc\x41\x9f\xb3\x45\x35\x6b\xc4\xe7\xa9\xf4\xb5\x56\x52\x6b\x25\x23\xd9\xcd\xc2\x38\xb3\xf0\x0b\x1e\xe8\xc9\x63\x3d\xd3\x8f\x23\xae\x2d\xf2\xf4\xf9\x74\x11\x9d\x86\x68\x86\xdc\x7f\xca\x0d\xc4\x3c\xd8\xd3\x8f\x51\x18\x0c\xa7\xe6\xa9\x84\xb4\xb2\x00\x2b\xce\xc1\x37\x46\xa3\x16\x91\x13\x9e\x62\xd9\x1d\x8e\x5a\x69\x5b\x85\x40\x1e\x0b\xad\xc1\xb0\xb5\xc1\x03\x50\xd3\x4d\x72\xc4\xdf\x1c\x12\x1e\x92\x83\xc6\x28\x4b\x97\x68\x23\xb9\x45\x64\x12\x0b\x3c\x78\x6b\x6a\x16\xe3\xef\xcc\xc0\xf7\x58\x1c\x0d\x79\x83\x32\x5f\xdf\xb4\xe1\xdc\xae\xcd\x35\xd4\x31\x0a\x51\xb0\x2c\x5a\x8a\xa6\xc5\x26\xa3\x9e\xd8\x4a\x44\x01\xa1\x44\xa4\x54\x1e\x62\xc1\x30\x68\xe8\x7b\x2a\x42\xb2\x6a\x17\xf6\x88\xa2\x22\x8b\x08\x49\x58\x64\xba\x46\xcb\x6e\xb0\x64\x13\x09\x59\x79\x33\x88\x54\x9c\xbf\xf8\x47\xcc\xd9\xef\x75\x7b\x2b\x5e\xef\xd6\x79\x3b\xc4\xe5\x56\x89\x3a\x74\xed\xf0\xb5\x15\xe6\x63\x46\xb1\x6d\xdb\x4b\xdd\x41\xce\xce\x99\xe2\x0b\x58\xc6\xac\x62\xab\xbe\x67\x8a\xb4\x52\xab\x16\xc2\x25\x3b\x5f\x71\xe4\xd6\x70\x4f\x58\x1a\x86\x04\x0b\xaa\x12\x44\x79\xe6\x2d\x2e\x26\x26\xb6\x0c\xad\xb4\x56\x5a\xfb\xb1\xf9\x5c\x51\x93\x30\x71\x8b\xf3\xc5\xfa\xa1\x50\x45\x32\x23\x76\xb3\xd5\xb0\x09\xc5\x34\x60\xcb\xa2\xaa\x28\x0b\xd1\x3c\x33\x42\xd7\xb4\x3d\x86\x04\xec\x1a\x02\xc1\x22\x8e\x08\x42\x48\xc4\xc2\x50\x13\xb5\x5c\x4f\x24\xb6\x4b\x4b\x95\x98\xaa\x44\xf3\x42\xac\x6a\x38\x6a\xd8\xa2\x6a\x3a\x24\xec\x2c\xd6\x99\xed\x63\xcb\x33\x1a\x73\x0b\x6e\x69\x3c\xbe\x22\x67\x57\x29\xd6\x52\xb5\xdb\x70\x02\xd7\x35\x8c\x6a\x35\x66\x82\xa4\xaa\x62\x38\xda\xd5\x77\x59\x64\xcb\x84\x96\x9a\xed\xa2\x2c\x18\x26\x13\xed\x5e\x70\xf1\xaf\x05\x41\x40\xed\xf4\x7f\x9b\xa4\x64\x39\xfe\x72\x5c\xee\x9b\x7e\x78\xbc\xd4\xab\xc9\x39\x2c\xc8\xaa\x68\x37\x1a\x35\x43\x0e\x55\x43\x67\xc4\x28\xc7\x45\xa6\x18\x86\xa9\x62\x99\x10\x19\xe7\x77\xf5\x3b\x36\x4f\xa2\xc6\xe4\x8c\x4b\x87\xcc\x21\xd4\x69\x85\xce\x62\x7f\x1d\x6d\xd9\xcd\x70\x65\xf7\x7c\x2d\x0c\xda\x01\xf6\x59\x58\xb7\xf3\x25\x9b\xaa\xf6\xc2\xd2\x52\x1d\x17\x99\x6d\x12\x11\x23\xd5\x16\x15\x44\x1f\x75\xb0\xb1\xd0\x5d\x2b\x36\xe7\x43\xa6\x96\xe6\x4b\x34\x08\x3c\xc5\x74\xa8\x2c\x8a\x88\x46\x21\x0d\xc3\x90\x3a\x4d\x1c\xb1\xf9\xf0\x8a\xbd\x9b\xe5\x70\x75\xb1\x42\x48\xa9\xc4\x7c\xc7\x56\x6d\x55\x50\x82\x25\x1b\xcb\x38\xc4\xa2\xe0\x9b\xa1\xa8\x19\xc6\xcf\x19\xc9\x52\x27\x64\xf5\x56\xcb\xc0\x3a\x0e\x45\x45\x51\xc4\x52\xb7\xa4\x86\xbb\x6a\x4c\x0a\xc3\xce\x52\x62\x38\x48\x16\x0c\x7b\x71\xb1\x49\x99\x28\xc9\x22\x76\x98\xa2\xc9\x32\x21\x76\x29\xac\x5f\x77\xc3\xf5\xb5\xb0\xe8\x7b\x86\xa7\xd2\xbc\xc1\xaa\xa1\xac\x53\x5a\x2c\x15\x28\xd1\xc3\x1c\x11\x04\x51\x55\x8c\xc8\xf7\x99\x1b\xf9\xf9\xd0\xae\x54\xeb\x5e\xe9\x8a\xc1\x92\x59\xbb\xb2\xa4\xda\xae\x4f\xa9\x4c\x01\x40\xbd\x74\xe9\xd2\x73\x28\x11\xde\x09\x32\x38\x10\xc0\x02\x1c\x87\xbb\xe1\x1d\xf0\x18\xfc\x4b\xd8\xbb\x05\xd1\xd4\x91\xe0\x02\x7d\x53\x36\xe3\x60\x7b\x0b\x4e\xfd\x83\x6f\xde\xb3\xbd\x05\xef\x9b\x7d\x43\xad\x09\xfc\x4c\x46\x11\xc2\x2d\x46\x3c\x4c\xdc\x40\x89\xec\x6f\x70\x1f\x62\x68\xf0\x58\xd1\x29\x18\x1d\x65\xd1\x4c\x24\x69\x0d\xc6\x59\xcc\x74\x0a\x17\xc5\xc1\x18\xf5\x87\xbd\xcc\x21\x3c\xca\x66\xb2\x81\xe4\x5e\x77\x2c\x24\xb2\x17\xf8\xd9\xa2\xd2\xe7\x73\xbb\xee\xf7\x3c\x22\x77\x87\xbd\x74\x66\x97\x39\x76\x23\x5e\x20\x4f\xa3\x4e\xfd\x74\xea\xca\x83\x3d\x88\x47\x48\x0d\xba\x63\xd4\x0d\xbb\x63\xe1\xe7\x1c\x55\x55\x65\x49\xbe\x46\xb3\x8c\x7a\x25\x87\x9d\xb9\x42\xab\x15\x31\xa3\x50\x2c\x18\x6a\xd1\x6d\x78\x0e\x96\x55\xdc\x3a\xfc\x31\x4d\x57\x9b\xb7\xef\x12\x45\x22\xe9\xaa\x88\x8d\xd0\x77\x55\x51\x55\x03\x47\x4f\x77\x44\x86\xe5\xe6\xe1\xd6\x4d\x46\x39\x2e\xa8\xae\xaa\xde\xa4\x9a\x86\x79\x62\xcc\x14\xaa\xa7\xf0\xe1\x45\xb7\x59\xab\x18\xcc\x54\x0b\xa3\x22\xeb\x3a\x36\x25\x82\x64\x28\x88\x23\x0b\xa7\x6c\x34\x92\x79\x47\xc4\x92\x1a\x38\x0c\x6b\xaa\x8a\x9d\xf9\xf9\xf9\x41\x71\x58\x32\x8a\xc5\x42\xa2\xc5\xaa\x24\x1b\xb9\x50\x35\xef\x39\xb2\xba\xfa\x8e\x7b\x0c\x49\x15\x8d\xe2\xb0\xe8\xac\xba\xee\xfc\xd2\x72\xe8\xa8\xfd\xe6\xc1\xe2\xbe\x0f\xee\x42\xe9\xde\x5b\x2c\x57\x1d\xaa\x0a\xaa\xbb\xea\x18\xa5\xb8\xea\x48\xaa\x2c\x09\x82\x88\x55\xd5\x7d\x4e\xc6\xa2\xaa\x55\x5d\xe6\x06\x5f\xbe\xb9\xb8\x50\x92\x0c\x43\xc7\x46\xa5\xd6\x5c\x94\x04\x59\xfe\x80\xea\xa8\x8c\xfd\x74\xe7\x58\x3b\xbd\x5c\xa2\x8e\x2f\xf1\x0b\xbc\x86\xeb\x08\xb2\x68\x30\xa3\xde\xaa\x1b\x7a\x94\x2f\xb9\x06\x33\x64\x59\x04\x60\x20\x42\x80\x9e\x14\x1e\x00\x0a\x0d\x98\x87\x55\xb8\x01\x9e\xe5\xf9\xbb\xff\x06\x7e\x03\xfe\x04\xd5\xe1\x1b\x30\x81\x47\x3b\x13\x44\x3b\x13\x78\xb6\x33\x41\x75\xee\x9b\x7a\x14\x9e\xe5\xdb\x0d\x99\x49\xcd\x99\xb4\x30\x93\x7a\x33\x69\x6d\x26\xdd\x31\x93\x4e\xce\xa4\x7b\x66\xd2\xa7\x67\xd2\x8f\xcf\xa4\x5f\x99\x49\xbf\x3a\x93\xbe\x36\x93\xfe\xfd\x4c\xfa\xd1\x4c\xfa\xdf\x66\xd2\x5f\x4d\xa5\x54\x93\x0a\x0c\x21\x4c\x95\x83\xa6\x4c\x02\x9f\x73\x01\xc4\x42\x6f\x90\x6d\x05\x99\xf2\xd3\xcb\x62\x82\xc2\x0d\x34\xe0\x09\x7a\x3c\x18\x98\xdb\x7f\x78\x82\x01\xe7\x86\xf1\x63\xe4\xcb\xb5\x56\xbf\x95\x78\x41\x58\x23\x7e\xc2\xf3\x0c\xc2\x6e\x20\x93\x6c\x4b\xab\xf3\x8b\xa7\x1b\x18\xd7\x16\xc6\xa8\xe7\xfe\xbf\xfa\x76\xf4\x2e\x2a\x61\x99\x48\x65\x42\x84\x8b\xbf\xa8\x29\xca\x7c\xb8\x6b\x6d\x57\xa8\x30\xc3\x62\xad\x23\x65\x73\xde\x0a\xdb\x68\x55\x11\xb4\x38\xd9\x5b\x56\x4c\xe5\x6d\xda\xa1\xf2\xc1\xcd\xdd\xae\xe9\x28\x72\x29\x2e\x2a\xc9\x89\x8e\x47\xab\xcd\xa6\x69\xc5\x96\x82\x0d\x4b\xfa\x9c\x22\x68\x12\x42\x92\xa0\x28\x82\xc6\xf2\xb9\x40\x29\x1f\x2a\x2b\x9a\xa2\xa8\x9a\xe0\x4a\x82\xa4\xb2\x70\x2e\x49\xc2\xce\xb1\x44\x12\x89\x6d\x86\xbb\xf6\xec\x29\xa4\xf7\x4a\x8a\xff\x4f\xa6\x25\x2f\x51\xb3\x90\x0b\xd9\x3c\xb3\x2c\xeb\x6b\x54\x29\x58\xf3\x85\xf9\x64\xbe\xa0\x32\xb5\x17\xb6\xca\x61\x3e\xb4\x86\x1f\x53\xb0\x32\x1f\x1e\x28\x2b\x58\x79\xdb\xa1\x1b\xfc\xc2\xf2\xca\xae\x44\x57\xcc\x5c\x90\x33\x93\x71\x78\xdc\xad\x94\x2b\xae\xa2\xcb\x44\xc2\xca\x1f\xdf\xa0\x98\x8a\x26\x12\x45\xb2\xe6\x4d\x5d\xd1\x14\x3f\x97\x67\xe5\x61\x4b\x57\xcc\x72\x29\xcf\x14\xdb\xd2\x58\xa5\x5a\x54\xca\x37\xb6\xcc\x5a\xb5\xc4\xca\xcb\xad\x56\xe8\x29\xe2\xc5\x3d\xff\x24\x9a\x01\x00\xa0\x80\x01\x7b\xd1\x49\xa1\x02\x06\xf8\x30\x0f\x47\xe1\x16\xb8\x07\x1e\x86\x4f\xc1\x6f\x6d\xc1\x26\x27\xbd\xe6\x96\xdb\x4d\x08\x60\x13\x5a\xb0\x09\x43\xd8\x84\x83\xb0\x09\x37\xc1\x26\xdc\x07\x9b\x70\x06\x36\xe1\x09\xd8\x84\x17\x60\x13\x5e\x82\x4d\x78\x05\x36\xe1\xeb\xb0\xb9\x63\xb9\xdd\x84\x1f\xc0\x26\xb7\xdc\x6e\x5a\x13\x10\x2f\xa4\xcb\xc7\x18\x36\xa7\x76\xe9\x1d\xc9\x99\x49\xc7\xa6\xd2\x04\x4e\x6c\x6f\xc1\x9d\xb3\x4f\xe9\xdd\x6f\xcb\x88\xb1\xe1\xfc\x36\x6c\x41\x15\x7a\x7c\x6b\x23\xd0\x9b\x56\x6f\x60\x33\xc9\x99\x4a\x59\xd5\x86\xc6\x74\x2b\xab\x11\xb9\xb7\x93\x69\x84\xfc\x51\x7f\xc8\x83\x98\x64\x9f\xa7\xfc\x0c\xc3\x41\x5b\xec\x79\x81\x9f\xce\x27\x4e\xe7\x9c\x8c\x45\x0e\x7d\x87\x41\x16\xd2\xd4\x0d\xc2\xe6\x3f\x48\x97\x1a\x74\x87\xfd\x56\x8a\x53\xb3\xc4\x89\x31\x4a\x46\xe9\x84\xf7\x79\x66\x70\x4d\xce\xd0\x24\xa7\x49\x0d\xbf\x5a\x18\xe6\x55\x47\x6d\x94\x87\xdd\xe5\xc0\xee\xbd\xaf\xe0\xaf\x28\x5f\x76\x92\xb9\x39\x07\x8b\x92\x20\x2d\x9f\x58\xc6\x48\x24\x05\xc6\x9c\x72\xa5\xe2\x38\xc9\x7c\xe2\x30\x95\x88\x08\x5b\x41\xa4\xaa\xa6\xb3\xb8\xbc\xe8\x60\x51\xb8\xf8\xb7\xe5\x7d\xe3\xb5\x20\xfd\x9f\x11\xea\x92\x54\x70\xd4\x3f\x5e\xbe\x7f\x38\x3c\x3b\x54\x45\x11\x49\x91\x24\x48\x22\xe6\xb9\x3c\x85\x03\xd7\x1c\x6d\xa8\xa2\xe9\xbb\xb8\x3c\xea\x75\x0b\xcf\xa9\x44\x2d\xa8\x58\x31\x7d\x55\x15\xef\x2a\x1c\xa8\x77\x9c\x95\x05\x55\x14\xd5\x15\x55\x93\x89\xa4\xaa\x87\x24\x9d\x2a\x85\x7d\x79\x86\x5d\xdf\xc4\x82\x28\xaa\x4c\x0d\x72\x79\x5d\x2f\xe4\x02\x55\x15\x1d\x1d\x4b\x86\x8c\x77\x4b\x32\xf5\x1c\x8c\xe4\xe0\x13\x7a\xbd\x95\x38\xac\x38\xb7\x1c\x3b\xaa\x7a\x56\x25\x2a\xbf\x3c\xe2\x6f\xbf\x4b\x25\xa2\x20\x15\x02\x59\x2a\xac\x35\xf4\x30\x0c\x0c\x91\xa8\x80\x81\x82\x80\x3e\x21\xdc\x0d\x1a\x14\x60\x09\xee\x84\x9f\x04\x13\x26\xf0\x85\xce\x16\xb4\xa1\xc8\xa3\x35\x47\x72\x2c\xf6\x86\x6d\x01\xc9\x86\x68\x22\x1e\x34\xd2\xf4\xb3\x34\x8c\x1e\x4f\x44\x19\x71\x9f\xb5\x81\xe4\x30\x05\xfa\xf5\x69\xad\x06\x43\xf0\xb9\x1e\x32\x1a\xa3\x51\x2f\xc3\xf3\xa9\x72\x61\x08\xa1\x17\x74\xb9\x03\x8a\x1b\xe5\xdb\x28\xa9\x67\x21\xf9\x29\xce\xef\x0f\x47\xde\x8e\xed\xbf\x2d\xca\xf5\xfe\x30\x19\xa3\x51\x8c\x96\xa8\x62\x3b\x3e\x63\xb4\x50\x46\xf3\x81\xdd\xee\xf5\x3c\x1a\x2d\x24\x2d\x4f\xf2\x7d\xfd\xe2\x6b\x51\xbf\xaa\xa8\x8a\xa6\x48\x54\x11\xa5\xea\xed\xd6\x95\xd5\xb5\xde\xb2\xaf\xb8\x36\x95\x88\x22\xb1\x42\xce\x95\x24\x55\x63\xa9\x4e\x4b\xac\x7a\x6e\xfe\xe0\xbc\x3d\xb4\xa8\x12\x15\xab\x96\xb5\xb8\xbc\x58\xdc\xf7\xa1\x35\x89\x19\x8a\x22\x0a\x48\xaa\x2c\x9c\xa8\x32\x83\x99\xcc\xae\x58\x94\x8a\x44\xd1\x19\x56\x0c\x45\x57\xec\x56\x45\xb1\x14\xbb\x58\xc8\x31\xaa\x28\xb9\x65\xdb\x76\xcf\x2d\x49\x8e\x63\x78\x05\xcf\x45\xa4\x5a\x5d\x1f\xaf\x57\x47\xb9\x3d\x1b\x1b\x25\x16\x04\xb9\xfb\x17\x95\xa2\xa2\xe9\x9a\xa4\xa8\x8a\x34\xdf\x7e\xef\x29\xb7\x9c\x78\xe9\x57\x4c\x24\x2a\xcb\xe5\x22\xa6\xb8\x4c\x50\x24\xc6\x98\x64\xc5\xca\xea\xa9\xd5\xca\x46\x8e\xd9\x86\xa1\x78\xbe\x9b\x13\x2a\xfb\xe7\x15\xc3\x70\x98\x94\x36\x69\xdf\xb9\x7d\x9e\x47\x15\xa5\xa0\x50\x96\x0b\x3c\x45\xd1\xd2\xa5\x95\x28\x8a\x58\xd9\x57\x51\x6c\x45\x32\x19\x91\xa2\x56\x2e\x37\xae\x2a\xc5\x74\x0d\xd1\xc0\xbd\xf4\x32\xfa\xaa\xa8\x02\x03\x17\xaa\xb0\x01\xd7\xc0\x09\x38\x05\x1f\x80\x5f\x86\xbf\x42\x74\x0b\xce\xc1\x0f\xf9\x54\x0d\x61\x17\x37\xb0\x86\xd6\x04\xf4\x0b\x5b\x60\xc0\xae\xa9\x35\xd8\x9d\x4a\xd9\xb9\xcd\x0b\x5b\x10\x43\x38\x9d\xf9\xe9\x37\xd7\x6e\x6f\xc1\xcd\xb3\xab\xef\x82\x1f\x4e\xcf\xed\xb2\x26\x70\x6a\x7b\x0b\xee\x9f\x9e\xe3\x6b\xd5\x39\x08\xe0\x1c\xb4\xe0\x1c\x0c\xe1\x1c\x1c\x84\x73\x70\x13\x9c\x83\xfb\xe0\x1c\x9c\x81\x73\xf0\x04\x9c\x83\x17\xe0\x1c\xbc\x04\xe7\xe0\x15\x38\x07\x5f\x87\x73\x3b\x6b\xd5\x39\xf8\x01\x9c\x9b\xad\x55\x2f\x64\x56\x64\xf8\xfc\x76\xf6\x9e\xdf\x9a\x1e\x7f\x7b\x7b\x0b\x7e\x30\x6b\xc1\x0f\x79\xc8\x0c\x4c\xe0\x2f\x3a\x5b\xa0\x83\x38\x0d\x8c\xfe\x04\xff\xa1\xba\x35\x01\x65\x7b\x02\xa2\x35\x81\x36\x67\xe8\x27\x7e\x30\x16\x7a\x2d\x43\xe0\x71\xc7\x23\x03\xd5\xfd\x11\x77\xc1\x8e\xd1\x06\xf2\x82\x90\x4c\x69\x09\x78\x8a\x15\x0f\xd1\x1b\x8b\x61\x77\x98\x74\x87\xbd\x3e\xa7\x37\x4a\x17\x1f\x91\x03\x8b\xf1\xd4\x63\x85\x06\xa3\x2c\x92\x35\x0b\x57\x1d\x8b\x83\xb6\xc8\xb5\x6b\x31\x1c\x8b\x53\xe2\x22\xcf\x10\xfc\xa0\x9b\x6a\xd5\xe3\x19\xd9\x73\xd2\x46\x35\x32\x55\x8f\x4d\x64\x88\x49\x8d\xd4\x53\x65\x3b\xb3\x5e\xae\x23\x6e\x81\xcd\xc8\x5b\x6b\xad\xa4\x95\xc2\x96\x3e\xa9\x8f\xa7\x74\x05\xbf\xa8\x95\xbd\xc8\x0b\x3c\xcd\x32\xcc\x90\x52\x8c\x1e\xf7\xe6\x5c\x1d\x23\x41\xf0\x12\x4f\x17\x35\xac\x4a\x92\xe4\x85\x9a\x57\xaf\xc4\x86\xa1\x0a\x98\x7b\x6c\xbd\xfe\x07\xbd\xbc\xab\x3b\x0e\x36\x9b\xf5\x42\xdd\xb4\x35\x19\x63\x01\x8b\xd8\xaf\x3e\x6e\x60\xc7\xf5\xdc\x67\xcd\x6a\x29\xc4\x3d\xec\x7a\x0e\xc6\x44\xa1\x9a\x59\x0c\x74\x4c\x54\xeb\x4e\x6f\xb1\x16\x60\xd3\x76\x55\xb3\x5c\x9b\xcf\xb9\x01\x53\x30\x2e\x36\x17\x3d\x45\x55\xd4\x52\xa5\x6a\x62\x01\x0b\x92\x56\x88\x8b\x9a\x29\xd8\x55\xd7\x9b\x5b\x58\xfe\x69\xb7\xe9\x8a\x9e\x16\x45\x91\x66\xb8\xe5\x4a\x33\xf2\x22\x95\xe1\x54\x99\x37\x45\x99\x7a\xed\x24\x8f\x0d\xc7\x55\xe3\x1e\xc5\x92\x20\x50\x4f\xb1\x35\xcd\x36\x3b\xbb\x37\xeb\xa5\x76\xcb\xa6\x12\xb3\x2d\x4c\x28\x71\x4e\x6b\xc5\x4a\xd5\xfc\x09\x4d\x3c\xcd\xb0\x2a\x4a\xa2\x4a\xd4\xb3\xc9\xb1\x04\x8b\x92\xa4\x50\x97\x1a\x54\x45\x9a\xd9\x4c\x5a\x26\xce\x05\x9a\xa6\xcf\xe9\x9a\x8c\x65\x4a\x05\xf3\x6b\x38\x88\x2b\xa6\x99\x8b\xf2\x66\xf7\xa1\xbf\xf6\x6a\xd5\xd8\xd4\x1a\xde\x19\x35\x57\xaa\x7b\x09\xc6\x02\xd5\x8c\x6a\x1c\x4a\xaa\x1f\xc5\x9e\x56\x2c\x04\x0f\x69\xb9\xf2\x5c\xa4\x45\x81\x2b\xb9\x0b\xb5\x00\x87\xa5\xaa\x99\x5b\x6c\x96\x34\x2f\x59\x58\x8e\xb0\x6c\xa8\x66\x5c\xa9\x79\x9a\x6e\xfa\x5e\xed\xc0\xe6\x46\xac\xc9\x92\x1e\xef\x3f\x7c\x34\xd1\x98\x6e\x99\x1f\xd5\x92\x9a\xab\xe9\xba\x82\xb1\x22\x99\x8e\xab\x9d\x8e\xe6\x17\x3a\xb1\x2a\x62\x39\xde\x48\x24\x41\x94\xbc\x85\xb2\xaa\x96\xc6\x49\xbc\x5c\xf1\xb1\x0f\x10\x81\x7e\xe9\x37\x84\xff\x2c\xfc\x29\x68\x10\x41\x1b\x76\xc1\x61\xb8\x1f\xde\x03\x5f\x85\x6f\xa2\x2a\xda\x8b\x1e\x40\xef\x41\x1f\x45\x2f\xa2\x9f\x41\xff\x1a\x7d\x1b\xfd\x27\x61\x49\x58\x13\x3e\x21\xfc\x9c\xf0\xbb\xe8\xa7\x60\x0b\x3e\x83\x32\x86\xcc\x04\xe9\x9c\xbb\xa5\x04\x7f\xc2\x3f\x1f\x80\x0d\x3e\xfe\x13\x6b\x02\x78\x7b\x0b\x72\xb0\x01\x07\xf8\xd4\xed\xcc\xa4\xde\x54\x9a\xa0\x1b\xac\x09\xdc\x7a\x61\x0b\x4e\xc3\x9f\xa0\x12\x3f\xf7\xd0\xce\x39\xf8\x8c\x35\x81\x8f\x6e\x4f\xe0\x4f\xac\x09\x7c\x71\x7a\xfc\xcd\xed\x09\x7c\xdf\x9a\xc0\xd7\xa6\x9f\xff\xc3\x85\x09\xfc\x0f\xdb\x5b\xf0\xa7\xb3\xbb\x36\x78\xd4\xda\x04\x6e\xb5\x26\x68\x69\x7b\x0b\x8d\xde\xfc\x2e\x5e\x67\x29\x99\x52\xdf\x9c\x9f\xdd\x93\x7e\xf3\xec\xf6\x16\xfa\xdc\x4e\x0b\xd1\x4f\xbe\xf9\x79\x3c\x2e\xed\x80\x35\x41\x5f\xd9\xde\x42\x5f\x43\x37\xc0\x67\xf8\x35\xbf\xb3\xd3\x66\xf4\x9d\x37\xb7\x19\xfd\x70\x3b\x3b\x5e\xcc\xda\x28\xe8\xd3\x63\x27\x6b\xbb\xb0\xb2\x3d\x81\xff\x60\x4d\x84\xde\xf6\x96\x30\x9a\x3e\x23\xbb\xe2\xe8\xf4\x8a\x63\xdb\x5b\xc2\xf5\x6f\x6e\x81\x70\xff\xf6\x04\xe9\xd6\x44\x78\xef\xf6\x04\x95\xac\x89\xf0\xb1\xec\x17\x0a\x9f\xdd\xde\x12\xbe\xf8\xe6\x5f\x28\xfc\x3b\xce\xe3\x96\x2e\x08\xe9\x5e\x9a\x90\xa9\x4f\xa2\xcf\x3d\xd2\xe9\x72\x90\xf1\x5c\xf6\xea\xb5\xb6\x90\xb4\x86\xa3\x5e\x8c\xc2\x41\x5b\x20\x61\x90\x51\x62\xa2\x14\x1c\x75\x63\xa1\xc9\x7d\xd6\xfc\x6a\xee\xfd\x4e\x01\x13\x37\xd6\xa5\x2b\x44\x33\x16\x7d\x4e\xa4\x99\x55\x65\x0a\xbd\x58\xe8\x4d\xd9\x33\x17\x11\x07\x51\x42\x92\xf9\x66\xb8\xbf\x04\x05\xe1\x28\x18\xf2\xfc\x6d\x8f\xc8\x7e\x97\xa7\x3f\xf4\xf9\xd3\x6a\x72\xaa\xb0\xd4\x5a\x75\xbf\x3d\x2d\xb6\x91\x95\x5c\xea\x0f\x53\x04\x35\xa8\x97\x50\x3b\xcb\xa1\xc8\x0c\x79\xe9\xce\xbe\x81\xb2\xd2\x1e\x59\x76\x55\x7d\xda\xa4\xd1\x20\xcb\xd5\x6e\x1a\x22\xcf\xc8\x4c\xb5\xa1\xe1\x68\xe8\x4f\x97\x3b\x03\xe1\x74\xb9\xf3\x33\xd4\x90\x45\xa4\x67\xf4\x9f\x29\x6e\xf0\xc7\xa9\x4e\x25\x5e\xee\xb6\xff\x27\xdd\x86\xfe\xdc\x10\x54\x9b\xb8\x4c\x71\xbd\xb3\x86\x54\x60\x05\x46\x04\x81\x18\xb9\x7b\x98\x46\x34\x7d\xa5\x45\x1c\xd7\x25\xb6\x5b\xc9\xbb\x44\x97\xde\x61\xe7\x4b\x94\x04\xb9\xe8\x6e\x66\x9b\xb4\x93\xcb\x63\x56\xc8\xe9\x9e\xa5\x5f\xfc\xeb\xd6\x28\xef\xba\xae\x9b\xbb\xb6\xdb\xba\xe6\xe0\x46\xae\x7c\xdd\xf1\xeb\xca\xc4\x71\x1d\x92\x57\x83\x15\x74\x3e\x57\xd4\x05\x57\xd6\xac\xd2\xed\xbd\xb3\x3d\xbd\xe4\x8a\xba\x53\x6c\xba\xee\xd2\xd2\x92\x4b\x64\x59\x95\x4d\xfe\x9e\x7c\x52\x29\xe8\x58\x14\x48\x69\x65\xbd\x22\x3b\xae\xa3\x58\x7a\xe4\xd2\xb4\x45\x44\xd7\x75\x92\xfe\xd3\x2d\xaf\x98\xfb\xc8\x35\xf5\xde\x87\xaf\x31\x22\x66\xa8\x9f\x62\x82\x55\x76\xf9\xe9\x74\xfd\x24\xb8\xce\x54\x51\x20\x7a\x3e\x9f\x67\x6e\xc1\x35\x64\x82\x65\xcf\x5d\x1d\x6e\x12\x59\x56\x64\x42\x55\xc2\xbc\xd6\xf5\xc3\xdc\xea\x7c\x4c\x74\x64\xc5\xae\xbb\x6b\xdf\x91\x56\xa5\x5d\xf1\x2f\x7e\x7b\xe9\xc4\x46\xde\x23\xa5\xd6\xa2\xfb\xd9\xd3\xe5\x5e\x2b\x4f\x24\x49\xc9\x9b\x7a\x23\x57\xb9\xf1\xc4\x8d\xa8\x9f\x6b\xe8\x66\xde\x26\xf1\xc2\x6a\x4e\x6f\xce\x2f\xba\x5e\x2b\x69\xb9\xb9\x2b\xd7\x97\x89\xe7\xac\x6c\xe4\x5b\x27\x7b\xc3\x7b\x7b\xad\xb5\x2f\x5e\xee\xd2\x7f\xec\x2e\xfd\xf7\xb2\x6e\xb9\xba\xee\x5a\xfa\x2f\x15\xf6\xe7\x03\x96\xb5\x2d\xb4\xf4\xe6\xc2\xa2\x9b\xeb\xe6\x89\x20\x62\x3b\x17\xeb\xad\x3b\x12\xd6\x48\x6e\x26\xa6\xac\xd6\x0b\xfd\xc8\xf0\x5b\xd7\x26\xb4\xa0\x33\x2f\x7c\x5f\xef\xde\x61\x6e\xdf\xc1\xcd\x7c\xb7\xaa\xa7\xbf\x2e\xfd\x47\x6c\xd7\x95\xd7\xde\xf9\xf6\xb7\xde\xe5\xee\xda\x7f\xa4\x95\x1f\x84\x85\xee\x7c\x1c\xe6\x7a\x51\xe5\xaa\xc3\xd7\xb6\xdc\x72\xc0\x74\x99\xb8\x8c\x38\x16\xd5\x23\x97\xf1\x5c\x5c\x3d\xae\xc4\x7a\x75\xff\x9e\x95\x14\x90\x90\xba\x2c\x50\x37\xb7\xeb\x8a\xb5\x9c\xa5\x69\x12\xc9\x8f\xf7\xae\xe7\x59\xbd\x68\x15\xee\x6b\xad\x58\x16\x93\x9e\xa8\x1c\xd8\x3f\xce\x69\xba\x26\x3b\x41\x4e\x77\x97\x96\x17\xdd\x4d\x3b\x6d\xbd\xcc\x43\x03\xe5\xfa\xf2\x8a\xeb\x2e\x2e\x34\xf4\x62\x71\x33\xbd\x4a\x21\x32\x31\x22\x3d\x57\x90\xcd\xa0\x9a\x6f\x5d\x73\xf5\x81\xb2\xdb\x5c\x4b\xdc\xd2\xd2\xf0\xe9\xb5\x47\x3f\xfa\xc9\x6b\xbc\x46\xd1\xee\xbf\x55\x6e\xf6\xf6\x54\xb0\x20\xd1\xde\xc3\x6f\xbf\xa7\xd5\x2a\x69\x0b\x66\xeb\xd4\xe9\xfb\x97\x7b\xf9\xee\xca\x92\xeb\xe6\x3d\x43\x4e\xbb\x44\xf6\xcb\xed\xea\xc6\xfd\xb7\xdf\xbc\xbc\x71\xba\x6b\x25\x39\xb6\x74\xb1\x74\xb9\x27\xff\x71\x7a\x12\x40\xbe\x74\x09\x18\xfc\xa5\x70\x0a\x34\xf0\xa0\x01\x9b\x70\x18\x4e\xc3\xe3\xd0\xdb\x82\x83\xf0\x18\x07\x52\x07\xad\x09\x1c\xbe\xb0\x05\x0e\x1c\x9c\x46\xd7\x74\xa6\xd2\x04\x1e\xb3\x26\xf0\xfe\x54\x03\xe9\x74\x56\x56\x47\xc4\xe7\x61\x6d\x86\xd0\x41\x32\x89\x91\x27\x73\x57\x9a\x17\xc8\xa3\x70\x8c\xc2\x36\x1a\xd5\xc8\xa8\xee\x71\x16\x95\x16\x91\x07\xad\x71\x46\x62\xda\x1d\x0b\x61\x37\x8c\x91\x28\xfb\xa9\x26\xc2\x77\xb4\xac\x30\x62\x8d\x47\x4b\x8c\xb2\x08\x8c\x74\x33\x08\xbd\x40\x26\x6d\xc1\x44\xdc\xd3\x56\x23\x72\x7f\x98\xf4\x87\xc9\xa8\x3b\x0c\xcf\x56\xf7\xd9\x25\x95\x05\x5e\x10\x6a\x55\x15\x49\x8a\xed\x5f\x55\xb2\x65\x89\xd2\x5c\x33\xa7\x50\xc5\xf6\xd7\x19\xcb\x35\xec\xca\x46\x4e\xc2\x58\x62\x92\xe3\x3b\xd8\x8a\xe3\x9a\x47\x24\x51\xfc\xe5\x25\xa5\xa0\x6a\x54\x65\x8a\xa2\x6b\x8a\xe4\xcd\x35\xab\x2c\x57\xb7\x54\x41\x40\xb9\xdd\x39\x5d\xc1\x41\xa9\xfc\x5e\x59\xc6\x48\x20\xca\x48\xd6\xa8\x94\x5b\xcd\x29\x8a\xa2\xec\xcb\xed\xce\xbd\xa3\x11\xfb\xea\xbc\x25\xcb\xb2\x7f\xcb\x88\x95\xca\x15\xcb\x6a\x7f\x5a\xca\x25\xcb\x16\xa5\x0a\x55\xaa\xa3\x8a\x20\x54\x36\x2b\xd6\x15\x91\xa2\xdb\x94\x15\x8b\x25\x66\x95\x4a\xb1\xad\x69\x58\x42\x08\xa3\xfa\xf0\x41\xab\x62\xbf\xf7\x41\xae\xdf\x5a\x96\xa4\x88\x76\xc1\xa2\x58\x14\x15\xa2\x44\x7b\x72\x96\x22\xa9\xd7\xe4\x5a\x39\x09\xab\x58\x1a\xaa\x82\x20\x48\xa2\x6a\x57\x2d\x7b\xd1\x7a\x48\x51\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\xfb\x61\x2e\x3b\x14\x2e\xfb\x61\x2e\xfb\x61\xfe\x3f\xeb\x34\xb8\xec\x87\xb9\xec\x87\xf9\xa7\xea\x3d\xb8\xec\x87\xf9\xc7\xf3\xc3\x68\x97\xfe\xeb\xa5\x73\xc2\x7f\x15\xfe\x47\x5e\xd9\xaa\x05\x2b\x1c\x1b\xdd\x02\xf7\xc3\xf3\xf0\x87\xc2\x9e\x14\x18\x7d\x8b\xc3\xaa\x1a\x9c\xe5\xc7\x3c\x38\xfc\xa8\xc1\xb7\x20\xbf\x53\xfd\xc9\x81\x37\xc0\x01\xe1\x8e\x2b\x5d\x50\xc1\x81\x1c\x38\x30\x0f\x0e\xac\x81\x03\x87\xc1\x81\x13\xe0\xc0\x69\x70\xe0\x51\x70\xe0\x29\x70\x40\xbd\xe3\x4a\x15\x5e\x04\x07\x5e\x06\x07\x5e\x05\x07\x5e\x07\x07\xa4\x3b\xf8\xa3\xce\xc2\x1b\x70\x76\x27\xe5\xec\x2c\xe4\xe0\x2c\xcc\xc3\x59\x58\x83\xb3\x70\x18\xce\xc2\x09\x38\x0b\xa7\xe1\x2c\x3c\x0a\x67\xe1\x29\x38\x0b\x2f\xc2\x59\x78\x19\xce\xc2\xab\x70\x16\x5e\x87\xb3\x3c\xe5\xac\x04\x67\xa1\xc6\xb1\x5c\x32\x93\x56\x67\x52\x77\x26\xf5\x67\xd2\x60\x2a\x4d\xe0\x2c\xa7\x5a\xe0\xaa\xdc\x69\x08\xe0\x34\xb4\xe0\x34\x0c\xe1\x34\x1c\x84\xd3\x70\x13\x9c\x86\xfb\x78\xba\xfd\x69\x78\x02\x4e\xc3\x0b\x70\x1a\x5e\x82\xd3\xf0\x0a\x9c\x86\xaf\xc3\xe9\x1d\x55\xee\x34\xfc\x00\x4e\x83\x70\xc7\x16\x9c\x80\x6f\xc1\xe9\x29\xaa\xdc\x91\x3e\x30\xed\xb8\x2d\x78\x62\xf6\xfe\x4f\x82\xc3\xbf\x9b\x40\xcd\x9a\xc0\x2f\x6f\x4f\xe0\x5b\x56\x56\x4c\x38\x6f\x4d\xe0\xbb\x17\x60\x02\xbf\xd9\x99\xc0\x77\x3a\x5b\x80\xe1\x37\xe1\x3b\x59\xb6\xfd\x4c\x72\x66\x52\x7e\x26\x95\x66\x52\x6d\x26\x25\x33\x69\x75\x26\x75\x67\x52\x7f\x26\x0d\x66\xd2\x89\x99\x74\xd7\x4c\x7a\x68\x26\x7d\x60\x26\x3d\x31\x93\x3e\x39\x95\x56\x56\xc3\x16\x27\x5f\x19\x19\x88\xd3\x91\xfa\x63\x34\x1a\x5e\x81\x86\x59\x9a\xb5\xe0\x67\x24\x12\xb2\xdf\xeb\x8e\x85\x0e\xf2\x07\x72\x2f\x16\x47\x53\x5a\x69\xc4\x6b\x0e\x65\x46\xac\x5e\x2c\x26\x9c\xcb\x8e\x73\x32\xa5\xda\x66\x37\xc8\xf2\xb7\xb9\x31\x85\xfb\x71\x38\x86\x49\x95\xce\xf4\x25\x2d\x81\xb3\x95\x8b\x59\x59\x83\x14\xc4\x78\x86\xc0\xe9\xad\x89\x4c\x52\xec\x93\x6a\xb0\x32\xb7\xc9\xd5\x93\xb1\x38\xa8\xb5\x76\xa8\xda\x38\xa1\xcb\x33\x51\xd9\x63\xa4\x7e\xe4\xe0\x9a\x5d\xbb\x01\xfd\x6b\xbb\x9c\x37\xc3\x39\xaa\xc5\x05\x37\x6c\xfd\x22\xd3\x7c\x5f\x16\x0d\x2f\x17\x2c\xfb\xa6\x1f\x19\xca\xa6\xa9\xeb\x84\xea\x36\x23\xae\x67\x2c\x11\xd7\x52\x09\x2d\xc4\x35\x5b\x16\x24\x4c\x98\x4d\xa9\x2c\x0a\xbf\x70\x33\x09\x0b\x45\x4a\x0c\x2a\xe1\xa8\xbb\x10\xd7\x71\x7e\x7e\x50\x9e\xc3\x48\x90\x86\xb7\xad\x48\xaa\x61\x48\xd8\xd0\x1a\x73\xf3\x16\x53\x59\x90\xaf\xb6\xfd\xe1\xc7\x8f\x2c\x5e\xfb\xdc\xfc\xc1\xbd\xe3\x0a\x76\x1c\xc9\xc5\xba\xa1\x63\x66\xd9\xb8\xd8\x5e\xee\xc4\x58\x52\x55\x66\xe5\x82\xdd\x9a\x5a\x5c\x8a\x86\x0f\xed\x61\xb2\xa6\x6b\xa5\x82\x8b\x31\xc6\xee\x5c\x2d\x47\xfc\xde\x68\xad\x40\x45\x51\xc4\x44\x0d\xea\xae\x61\xf8\xcd\x26\xf5\x2b\xb2\xe8\x17\x98\xac\x31\xea\x6b\xf2\xa4\x30\xe8\xf7\x0b\x85\x7e\x7f\xb0\x20\xd1\xc3\x6e\xa1\xfc\x78\x1c\x9f\x59\xa2\x39\x57\x23\x2c\xc8\x15\x0a\xd4\xf6\x42\xcb\xc3\x8a\x2a\x99\x8d\x56\xd3\xc6\xa6\xa1\x61\x2f\x9f\xff\xf0\x43\x1b\xef\xff\xe0\x87\xf7\x6b\x96\x41\xf1\x81\x8f\xfd\xb3\xa7\xdf\x7d\xf4\xf9\x67\x9e\x39\x6c\x61\x95\x92\x20\x48\x75\x47\x62\x55\xaa\x15\x9b\x20\xd5\xa4\x7a\x71\xef\xda\x82\x5c\xa4\xb2\xf6\x3c\x6a\x3e\xc7\x22\x6f\xff\x93\xe7\x3f\xb4\xdb\x2b\x84\x91\xa5\x10\x91\x52\x85\x28\x94\x48\x9a\x29\x49\x82\xa4\xf9\x9d\x4e\xdb\xb3\x4a\xfd\x95\x45\xdf\x89\xa8\xae\xef\x3f\xff\xf8\x53\x57\x6b\x86\x89\xed\x7a\x6b\x2e\xb0\xca\x39\x13\x6b\x94\x81\x06\xf8\xd2\x79\xe1\x82\xf0\x2d\xd0\x21\x82\x16\xec\x85\x43\xf0\x56\x38\x03\x2f\xc2\x37\xe1\x7f\x87\xd3\x5b\xf0\x34\x7c\x81\xaf\x4f\x18\xbe\x00\x4f\xf3\x29\xf5\xb4\x35\x81\xb3\xdc\xe2\xf3\x34\x9c\xe5\x63\xf4\xca\xa9\x94\x9d\xbb\x73\x7b\x0b\x1e\x9e\x9d\x7b\x79\x2a\xc1\x04\xfe\xba\xb3\x05\x64\xaa\x55\xfe\x0e\xfc\x1a\xd7\x2a\x7f\x87\xeb\x7e\x9c\x47\x5f\xce\x6a\x81\x8c\xb2\xbc\xfe\x14\x13\x13\xbf\x9b\xca\x3b\xb5\x8e\x0d\xb1\x9e\x64\x74\x62\xe9\x50\x1e\xc6\x42\x12\xf6\xba\xc3\x41\xbf\x95\x64\x88\x98\xc4\x02\x47\xe0\x29\x60\x6e\xcf\x0a\x37\x8b\xe1\x30\x49\x1f\x40\xf8\x10\x6d\x0d\xfa\x29\x26\x1f\x0b\x49\xcd\x10\xea\x3c\xb5\x3e\x16\x9b\x7e\xdd\x8b\x85\x32\xea\x75\x33\xe6\x82\x8c\x57\x57\xcc\x08\xcf\x52\xed\xa0\xc7\xf3\x4b\x91\x81\x9a\x1c\x9a\x77\x83\xa9\x6f\xdb\x10\x65\x8e\x9e\xf7\x64\x0e\x70\x5e\x33\x04\x79\xac\x54\x08\xc8\xde\xc6\x91\x23\x07\xe2\x3d\x8f\xd7\x24\xc6\x42\x9d\xe8\xa6\xc3\xa8\x58\xeb\x47\x54\x62\x51\x21\x7e\x8c\x60\x66\x11\x56\xaa\xd4\x6d\x9b\x9b\xf5\x44\xa2\x96\x56\x17\x9a\x17\x2a\x26\x93\x92\xdf\xb3\x38\x17\x17\x31\xa2\x3c\x41\x84\x31\xd3\x31\xa3\x95\x88\x08\xa2\xf2\x6d\xce\xc7\xc5\x8a\x85\x00\x47\x11\x66\xa6\x73\x03\x75\xa3\xb0\x48\x99\x44\x9d\x90\xa9\xaa\x44\x32\x66\xae\x38\x2e\x3b\x2c\x70\xe8\xc5\xbf\xb0\x83\x46\x3b\x32\x57\x09\x65\x3a\x09\xd7\x37\x76\x65\x84\x5d\x71\xd3\x41\x84\x84\x71\xdd\xe1\x55\x1f\x75\x9b\x92\x92\x23\xc7\xc3\x07\xee\x7f\x2b\xfa\x60\xc3\x61\x31\x5b\xb9\x25\x64\x5e\xc8\x92\x85\x84\xc5\x07\xaf\xbd\x61\xe1\x64\x23\xa7\xca\x0e\x63\x11\x2f\xac\xb9\xe7\x9f\x5d\x15\xf5\x7b\x6d\x9d\x19\xa6\xef\x38\x85\x42\x25\x62\xe1\xf7\x73\x05\x66\x31\x5d\x55\x36\x5d\x56\xd3\x3d\x4a\x7c\x47\x19\x60\xc6\x18\x61\xa1\x43\x6d\x56\x8a\x8b\x94\x57\x95\x72\xe4\x42\xe3\xfb\x7b\x25\x16\x45\x77\x95\x89\xe3\x87\x6c\xdf\xa3\x8f\x3c\xb2\x87\x58\xa6\xc6\xb9\xc5\xee\x7a\xf5\x2d\xd1\x60\x30\x98\xe3\x1f\x98\x61\x7a\x4e\x67\x35\x3d\x79\x5d\xb8\x37\xa2\x8a\x2e\xe9\x0e\x27\xc1\x95\x89\x42\xb0\x8c\xab\xae\xaf\x13\xe6\xfa\xf9\x3b\xad\xa3\x4f\x3f\x75\x7e\x5f\xc5\x60\x02\xb3\x98\xc6\x82\x88\x88\x44\x24\x4e\x6f\xd7\x5a\xe4\xb8\x2a\xe2\x9f\x98\x1f\x1f\xb8\xea\x60\x1c\x19\xac\x16\xc5\x07\x8f\x1c\x69\x94\xea\x2b\xb7\xd5\xa3\x62\xa1\x16\x47\xd5\x42\xde\x59\xb8\xff\xa1\x07\x3b\xf1\xee\xb5\x41\xc4\xf9\x37\x1b\x15\x46\x14\x55\xe7\x5c\xb6\xea\xa5\xcf\x0b\x8f\x0b\xbf\x05\x55\x18\xc0\x3b\xe1\xab\x70\xc7\x16\x3c\x09\x77\xec\xf8\x54\x9e\x84\x00\x9e\x84\x16\x3c\x09\x43\x78\x12\x0e\xc2\x93\x70\x13\x3c\x09\xf7\xc1\x93\x70\x06\x9e\x84\x27\xe0\x49\x78\x01\x9e\x84\x97\xe0\x49\x78\x05\x9e\x84\xaf\xc3\x93\x3b\x9b\xdb\x93\xf0\x03\x78\x12\x84\x3b\x60\x02\xbf\xde\xd9\x82\xb7\xc2\x2a\xb7\x9d\xbb\x46\xba\xde\x4a\x61\xcc\x47\x55\x5f\x4e\x47\x2f\xd7\x3b\x91\x67\x08\xe1\x58\x0c\xc7\x62\xc2\x59\x39\x0c\x91\x7b\x0e\xeb\x64\xa7\x7c\x2d\x67\xdc\x1b\xf1\xf2\x36\x6d\x31\xab\x30\xde\x0d\x32\x1a\xbe\x69\x01\xdb\x5e\x9c\xea\xb3\x35\x43\x90\xbd\xf4\xce\x36\x67\xee\xf3\x76\xb2\x99\xbb\x7c\x8b\xe0\x6b\xbc\x21\xca\x2d\x52\x6b\x25\x59\x21\x8a\xa4\xdf\x9a\x52\x74\x76\x83\x1b\x69\x60\x60\x22\x39\xf5\xce\xea\x8a\x5b\x5c\xdb\xb3\xb7\x16\x94\x03\x45\x12\x6b\x47\x8f\x1d\xad\xcd\x8d\x17\x02\x64\x6b\xaa\x48\x68\xb1\x52\xb5\x89\xc9\x24\x62\x27\xcd\xca\xea\xda\xcd\xfb\x07\x01\x41\xa2\xc8\xa8\xa9\xd3\x56\x6f\xbd\x36\x77\x70\xdf\x46\x8d\x89\xa2\x40\x1e\xb0\x6b\xf5\x9a\x5d\xca\x53\x89\x84\xa1\x9d\x2c\x2e\x87\x58\x10\x25\x95\x88\x2c\x5c\xbe\x07\x0b\x02\xb6\x5d\x2a\x13\x49\x44\x24\x5c\x0e\xc3\x05\x26\xd0\x5c\x18\x76\x7b\xdd\x90\xa4\x43\x9e\x2a\xa2\x40\x78\xed\xe3\x20\x0c\x58\xa9\xb7\xda\x0e\xec\x52\xa9\x64\x87\xcb\x8b\x89\x6d\x86\xcb\x61\xb0\xfb\x9a\x53\x1b\xb5\x2b\x51\xc0\xc2\x7c\xc9\xae\x75\xea\xb9\xa8\xe0\x12\x93\x89\x24\x5c\x0a\x35\x49\x90\xec\xf4\xdf\x68\xff\x51\x44\xf9\x15\x24\xb2\x91\x4d\x8b\xc5\x22\x15\x45\xfd\x4b\xf6\x81\x5b\x4e\x2d\xb3\xc0\xd6\xea\x9b\xf5\x62\x77\xae\x40\x18\x0b\x43\x1a\xe6\x8b\x76\x89\x09\x8a\x42\xec\xa5\xde\xa8\x74\xc5\x83\xcb\x54\x11\xb1\x65\x5b\x98\x30\x4a\x09\x95\xc2\xf9\x64\x3e\xf0\x4a\x65\x8a\xa9\x4a\x74\x93\xea\xf9\x30\x1c\xf6\x16\x29\x15\x14\x93\xa8\x4c\xcd\x92\x7a\x75\x45\x26\xac\x52\xad\x30\x22\x68\x36\x51\x6c\x8f\x30\x27\x8c\xc3\xda\xf1\x7a\xb0\x27\x5c\x7b\xef\xe9\xeb\x6c\x17\x40\x06\xf3\xd2\x27\x45\x45\xf8\x3d\x08\xa0\x05\xeb\x70\x3b\x3c\x04\x4f\xc2\xcf\xc3\xd3\x13\xf8\x85\xce\x04\x8e\x77\x26\x90\x5c\x98\x40\x7e\x7b\x02\xc7\xad\x09\x1c\xce\xcc\x62\x70\xcb\xf6\x04\x7e\x61\x5a\xb4\xf9\x4b\x9d\x2d\xb8\x03\xbe\x04\x09\x5f\xa9\x4f\x5d\xe0\xe3\xf6\x14\x04\x70\x0a\x5a\x70\x0a\x86\x70\x0a\x0e\xc2\x29\xb8\x09\x4e\xc1\x7d\x70\x0a\xce\xc0\x29\x78\x02\x4e\xc1\x0b\x70\x0a\x5e\x82\x53\xf0\x0a\x9c\x82\xaf\xc3\xa9\x9d\x71\x7b\x0a\x7e\x00\xa7\xb8\x7d\x3d\x7d\xcf\x97\xb7\xb9\xef\x67\x65\xb5\x39\x65\x6c\xcd\x52\xe9\xf9\x70\xc9\x88\x62\x66\x96\x8e\xcc\x2f\xee\xf7\x47\xc3\xde\xf4\x2b\x5e\x44\x5f\x4c\xc6\xbc\xec\x45\x8d\x57\x48\x18\xf4\x87\xdd\xc0\x8f\xc5\x66\x3a\xbc\x39\xea\xc9\xb0\x4a\x60\x08\x21\xb7\x7d\xf3\x41\xde\x16\xf1\x9b\xf8\x00\x64\x1e\x97\x92\xe1\x9c\xa1\x33\x18\x8b\x1b\x28\x16\x85\x47\x56\xde\xf1\xee\xf7\x0c\xa2\x4a\xe4\xb1\x78\x38\x1c\xc5\x7b\xce\xec\x61\xd5\xd8\xbf\xf8\xc7\x54\x6a\xec\x0f\x89\x2c\x13\x52\x6c\xb5\x55\x33\x5c\x09\x9d\x5a\xc1\x56\x24\x89\x68\x86\x13\x2d\x2c\x2c\xfe\xc7\x30\x8a\x47\xbb\xd6\x1b\x91\xa4\x53\x29\x1d\x22\x54\xd2\x98\xd6\x38\xb8\xd1\xbb\x78\x86\x99\x4c\x67\xb4\x5a\x67\xae\x9f\x73\xd2\x35\xef\x80\x63\x12\x91\xf0\xba\xdf\x57\x3e\xf9\xd1\xf7\x0f\x1b\xae\xa8\x91\x95\xb7\xbf\xef\x29\x74\xf2\x98\x8d\xdd\x46\x54\x88\x8a\xd1\x55\x9f\x7e\x4b\xbc\x67\xbc\xaf\x61\xa5\xda\x43\xbd\xe8\xe4\xc3\xbc\xf3\x53\x2b\x6f\x39\x7a\xf8\xf6\x46\x62\x4a\x84\x98\x85\x32\x63\x92\x28\x12\x56\x6e\x10\x27\x8a\xd1\xb1\xb4\xb5\x85\x88\x04\x91\x4f\xa2\x46\xc4\x3e\x74\x97\xc7\x58\xa9\x31\x1f\xa9\x92\xe0\x2c\x2f\x27\x8c\x55\x62\xff\xe9\x95\x23\x0d\xa7\x1a\x69\x64\xcf\x13\x7b\x24\xa6\x48\x52\xb8\x37\xc7\x0b\x2e\xe7\x92\xe1\x1f\xa4\x9b\x8d\xf3\xf4\xc5\x6f\x3f\xc3\xa2\x28\x62\xd7\x7e\xfe\xb3\xcf\xbf\x8d\x17\x62\xde\xf7\xb1\x8f\x7d\x6c\x1f\x2b\x0c\x17\xa2\x8d\x03\xfb\xe3\x3d\xef\x39\x5e\xfb\x17\x1f\x8a\xf7\x1f\xd8\x88\xf8\x63\x1b\x1d\xae\x7e\x59\xfc\xa6\x8f\xa2\xd2\x17\xec\xb9\xa4\xc6\x2a\x6c\xae\x77\x05\xe7\x97\x55\x2e\x9d\x11\xf6\x0a\xff\x0e\x1c\x28\xc0\x02\x8c\xe0\x3c\x6c\xc3\x77\xb6\x60\x1d\xbe\xca\x37\xf7\xe7\xe0\x1d\x3b\xeb\xe2\x3a\x04\xb0\xce\x47\xec\x10\xd6\xe1\x20\xac\xc3\x4d\xb0\x0e\xf7\xc1\x3a\x9c\x81\x75\x78\x02\xd6\xe1\x05\x58\x87\x97\x60\x1d\x5e\x81\x75\xf8\x3a\xac\xef\x8c\xaf\x75\xf8\x01\xac\x73\xd0\x8f\xe1\xab\xb0\xce\xb1\xc4\xe2\x4c\x5a\x9d\x49\xdd\xa9\x34\x81\x6e\x67\x02\xeb\xd6\x04\x76\x6d\x4f\xa0\x6b\x4d\x60\xef\x85\x2d\x38\x08\x5f\x85\xe7\x32\xf4\xf1\x78\x67\x0b\xf6\xc2\xaf\xf2\x06\x7e\x0e\xde\x36\x05\x35\xbf\x0a\x7b\xa7\x90\x7f\x47\x5a\x9d\x4a\x13\xd8\x6b\x4d\xe0\x60\x8a\x4d\x38\xeb\x61\x86\x0e\xba\x63\x61\x24\xfa\xc3\x80\xd3\xbe\x25\xdc\x1f\xdc\x0d\xc6\x68\x40\xda\x88\x24\x7c\x3d\x95\x47\x1c\x9f\x64\x0c\x4b\x5e\xe0\x8f\x51\x18\x90\x7a\xaf\x3b\xcc\xc6\x6c\xc2\xb9\x84\x86\xfd\x64\x98\x2e\xc6\xd3\x6f\x39\x3b\x62\x1b\x0d\x6a\x3c\xee\x8a\x53\x1b\x8f\xf8\x62\x6d\xa0\x66\xc6\x53\xc1\xab\x9a\xc9\x7e\xe6\x04\xaa\x19\x82\x39\x25\x9b\x4f\x5f\x62\x48\xad\xc4\x10\xeb\x1c\xb9\xf7\x85\x64\x30\xc6\xe1\x58\x44\x0f\x2e\x9e\xb8\xf1\xda\xf8\xf0\x27\xd7\x9d\x4a\x21\x62\xcc\x50\x15\xf2\x4e\x52\x8c\x0b\x24\xd7\xb9\xda\x69\x36\x1b\x0e\x8b\x1c\x1a\x0d\x87\xc3\xbf\x5d\x49\x57\xd9\x2b\x99\x24\x0a\x85\x74\x60\x5a\x7a\xc8\x98\xc5\xae\x1f\x9f\xef\xf2\x95\xb9\xca\x6a\x8d\x3a\x73\x88\xc8\x88\x20\x4a\x2c\x3a\xd0\x60\x8a\x48\x49\xb4\xb8\xb8\x14\x31\x09\x4b\x0a\xaf\x1e\x19\xef\xdb\xdc\x17\xa7\x83\xe6\xc1\xdf\x43\x6f\xe5\x83\x98\xa4\xda\x76\xbc\x6b\xb8\xab\x1c\x2d\x2d\x2e\x46\xfc\x2a\xe6\x9a\x3a\xb9\x3e\x5a\x69\x2f\x38\xe9\xab\x98\xe7\xf9\xc5\x46\xb4\x78\xdb\x9d\x77\xaf\x12\x41\x20\x12\xb3\x42\xd7\x09\x8a\xfe\xf0\xfe\xb7\x9d\x96\x25\xbf\xbd\xc8\xbc\x74\x3f\xa7\x6e\xc4\x50\xbd\x42\x04\xd1\x8e\xa4\xbf\x91\x14\x26\x8a\x66\xfa\x00\xa9\xb1\x72\xf8\x27\xfe\xbb\x9f\x39\x76\xe5\xdd\xeb\xe7\x9f\xf8\xe8\x9d\xa3\x87\x1e\x7e\xf7\x7a\xf3\xda\x55\x66\x31\x26\x49\x8c\xd5\x9b\x35\x66\x13\x3d\x45\x20\xa5\x72\xcc\x38\x7d\xa9\xa4\x93\x20\x17\x10\x6a\xda\x24\x77\xa0\x21\x48\x94\x13\x70\xa6\x2f\x67\xb9\x28\xc7\x58\x69\x8d\xd5\xe7\xe6\x1c\xe2\x38\x0e\x21\x8e\x83\x9d\x77\x11\xdb\xa4\xac\x5c\x6d\x3a\x56\x54\x64\xd6\x2a\x73\x03\x14\x3b\x0b\x8b\x0b\x8e\x94\xaf\x54\x5d\x64\xa5\xe7\x89\x13\x44\xec\xd3\xa8\xfe\x19\x4b\x0a\x8b\xa5\x80\x4a\xe9\x97\xc0\xe7\x4a\x70\xe9\x7d\xe8\x77\x84\x6f\xf0\x4a\x18\x75\x18\xc1\xbb\xe0\xd7\xe1\x77\xb7\xe0\x00\x7c\x85\x0f\x41\x1f\xf4\x69\xfd\x8b\xaf\x80\xbf\xa3\xff\xeb\xf0\x06\xe8\x3b\x4a\xbb\x0e\x39\xd0\x61\x1e\x74\x58\x03\x1d\x0e\x83\x0e\x27\x40\x4f\xb5\x63\x78\x14\x74\x78\x0a\x74\x78\x11\x74\x78\x19\x74\x78\x15\x74\x78\x1d\x74\xce\xde\xa6\x5b\xe9\x6e\xb0\x05\x0d\xf8\xca\xd4\xed\x70\xc0\x9a\x40\xef\xc2\x04\xda\x17\xb2\xba\x81\x07\x38\xc3\xfb\x16\xbc\x6d\xfa\xe6\x8c\xed\xe5\x5d\xdb\xd9\xf1\xab\xa9\x92\xfc\xe5\xce\x16\xfc\x3a\xbc\x97\x37\xf0\x46\xde\xd0\xec\xc1\xe7\x2e\xa4\xb7\xe9\x70\x8e\xdf\x76\xa3\x35\x81\x7f\x36\xad\xfa\x9f\xce\x91\x31\x72\xbd\xa0\x37\x0c\xba\xc3\x01\xf7\x7c\x8a\xfc\x60\x20\x0e\xc1\x79\xbd\x40\x1e\x32\xca\xab\xcf\xf2\x28\xd2\x18\x95\x50\x77\x8a\x5c\x92\x61\x9b\x33\x63\x85\x99\xdd\xbc\xc5\x11\xf8\x38\xc3\xfc\xc9\x18\xf5\x46\x29\xfe\xe1\xa5\x68\xc5\xb0\x3b\x1c\x71\x5b\x79\xfa\x39\xd5\x7d\xbd\x58\xc8\xea\xf0\x67\x84\xc6\x7c\xa6\x8d\xd1\x88\xc3\xfd\x4c\x21\x45\xcc\x1e\xf4\xe7\x09\xdf\xe2\xc3\x42\xc1\xa3\xac\x5c\xf2\xec\x52\x29\x76\x9c\x6a\xce\xa2\x95\x92\x37\xb1\x11\x41\x0e\x41\xa2\xc4\x01\xa9\x20\x8a\x68\x58\x3b\x7a\xf4\x70\x91\x17\x9d\x09\x9b\xe5\x72\xaa\x8c\xd9\xbc\xc6\x01\x09\xdb\x9d\x76\x98\x31\xba\x86\xf3\x73\x0b\x21\x93\xf8\x8c\xa9\x1f\x6e\xb7\x55\x55\x24\x8e\xcb\x64\x42\x1b\x45\x9d\xd5\xf7\xd7\x4d\x7e\x2a\x0c\xed\x20\x08\x8b\x54\xa3\x5a\xb8\xc8\x30\xc1\xac\x58\xa9\x39\x34\x08\x43\xc6\x4d\x56\x65\xc7\x91\x19\x33\xec\x5c\x58\x3f\x78\xe8\x9a\x39\xd7\xb6\x9c\x62\x31\xc5\xf5\xe1\x32\x2a\x31\x97\x21\x16\x62\x8c\xff\x94\x28\xcc\xb5\x05\x96\x1b\x96\xc6\x7b\x76\x85\x6b\x0f\xfd\xd8\xfd\x7d\x56\x2c\xd7\xec\x8d\xc7\x9f\xfc\xf8\x57\x64\xbb\x14\x76\xde\xb1\x56\x3f\x7c\xe4\xea\xfa\xdb\x0d\xc7\x08\x7b\xab\x4b\x36\x0b\x7c\x9b\xa8\x8a\x44\x88\x65\xdb\x84\x7a\x14\x11\x44\x69\x44\x89\xed\x85\x34\x8c\x6e\xa3\x61\xbe\xe4\x50\x3b\xa0\x44\x31\xf3\xa1\xc4\x2c\xbb\x56\xab\xdb\xcd\x96\x67\x4b\x34\x9c\x5f\xea\x94\xc2\x76\x48\x04\x44\x38\x87\x4a\xaa\x8a\xa4\x10\x28\x64\xdf\x68\xdf\x72\xd3\xcd\x6d\x7b\x69\xa9\x45\x89\x69\x6a\xa0\x00\x5c\xfa\xa2\xf0\x1d\xe1\x37\x81\x41\x08\x65\x58\x80\x4d\xb8\x19\x7e\x1e\x61\x00\x1c\xf0\xb1\xc1\x89\x78\x52\x1d\x24\x48\x31\x6c\x8a\x06\x46\xb5\xd6\x68\x5a\x51\x45\x6c\x66\xaa\x5c\x2c\x0c\x37\x50\xb6\xe8\x75\x50\xab\xc9\x0b\x6f\x8c\xd2\x11\x35\x6a\xa3\x1a\x49\x78\x64\xa9\x38\x0a\xc6\x12\x8f\xd2\xc9\xca\xa9\xb4\xfa\x63\x94\x42\xd5\x3a\x8f\xbd\xf3\x7b\x5c\x65\xcc\xaa\x2b\xef\x78\xca\x85\x20\x1c\xb5\xc5\xb4\x05\xcd\x1e\xd7\xf8\x0c\xd1\x6f\x4d\xc7\x8e\x81\x52\x5c\xb2\x81\x5a\x35\x39\xbd\x7c\x14\xa3\x5e\xd0\x1d\x05\x06\xf2\x42\x43\x4c\x9f\xc9\xb9\xaf\xdf\xec\x30\xe9\x8d\x85\x00\xfd\x88\x73\xbe\x50\x59\x77\x6a\xe5\x62\x77\x59\x12\x04\x81\x60\xcb\xd0\x5e\x8c\x83\x72\x58\x0e\xcb\xca\xed\xe9\x58\x0a\x63\x4f\xbf\xf8\x2b\x6d\xa2\x92\x7c\x69\xee\xc4\x5d\x77\xb5\xd7\x69\xb5\x99\xd8\xf5\xc1\xca\x6a\xe9\x48\x80\xe6\x58\x21\x34\x59\x8a\x36\xed\xa4\x56\xc0\xb4\xb5\xb8\xf8\xea\xda\x32\xbd\x36\x9c\x5f\x1e\xd4\x0b\x49\x25\x9f\x2f\xb9\xb6\x64\x68\x94\x85\x41\xc8\x4c\x9b\x32\x52\xea\xf7\x06\x45\x8e\x1d\xa9\x34\xb6\x49\x58\x4a\xc1\x76\xcd\xb6\x5b\x15\x0f\x8b\x44\x20\x8e\xc9\x4c\x27\x58\xbf\x72\x5f\x69\x9d\xc4\x25\x07\x2f\xdf\x76\xe3\x31\xb4\x54\xb6\xc2\x02\x35\x59\x3e\x34\xc3\x7a\x25\xb6\xdb\xb7\xb5\xd3\xb5\x9f\x96\x6a\x73\x61\x39\x5c\x0f\x19\x22\x02\xfd\x2c\x0b\xd9\xda\x83\x6d\xc2\xa8\x4d\xb1\x1a\x16\xa9\xaa\x9a\xb6\xd3\x59\x88\x39\xdc\xae\x5f\xb5\xb1\x4a\xc3\xfc\xf8\x78\xcd\xaa\x1d\xbb\xe1\x2d\x1b\x44\x20\x22\xa6\x0b\x21\xd3\x8b\x8d\xc7\xd6\x25\x8c\x29\xa6\xae\x9b\xfb\x72\x47\xd2\x96\xa4\x33\xd7\xf0\xea\x20\xa4\x50\x6f\x1e\x1b\xd7\x8e\x5e\x73\xa8\x58\x5a\xf2\xd4\xf0\x9a\xd0\xa7\x1a\x25\x61\xad\x46\x3e\x76\xdb\x37\x48\x90\x2b\x50\xaa\x2b\x32\x4e\x27\x16\x55\xc4\xf5\x03\xbf\x74\xff\x69\xd6\x28\xbb\x44\xb2\x4a\xcd\x46\x59\x61\x95\x7a\x85\xa6\xfb\xc5\xe9\xb0\xbd\xdc\x0e\x89\xa4\xaa\xe9\x4d\x4c\xca\xfa\x83\xfa\x4c\x60\x44\x0f\x9b\x25\xab\x56\x2e\x32\xbb\xd5\xac\x30\xa7\x40\x15\xe7\xa8\xed\x1a\x06\x2b\xa2\xe6\xc6\xcd\xd4\x31\x28\x31\xed\xb8\x18\x3b\xc4\xcf\x9b\x74\xbe\xce\x1f\xc5\x7c\x43\x22\x86\xae\xb3\x62\xa9\x40\xdf\x47\x25\x4a\xd3\x7e\x2d\xd9\xed\xc5\x38\x05\xff\x8c\x61\x51\x2f\xda\x8a\xa8\xd8\x8d\xf6\xee\xb9\xab\x3f\xf4\xc8\xe9\x5e\x71\x25\x27\x02\x28\xa0\x5c\x3a\x27\xfc\x73\xe1\x7f\x02\x1b\x8a\x30\x07\x7b\xe0\x5a\xb8\x09\x7e\x06\x01\xbc\x73\x0b\xde\x0b\xdf\xe5\x4b\xa6\x08\xdf\x85\xf7\xda\x19\xa9\x7e\x26\x4d\xe0\x50\x67\x02\xbf\x7e\x61\x0b\x74\x38\xc4\x6b\xdf\x4f\xa0\xbd\x3d\x81\x43\xbc\xea\xc6\x16\x5c\xf5\xf7\xd7\x59\x13\xf8\xc8\x85\x09\xbc\x7f\x3b\x63\xd7\xfc\x20\x67\xb7\xdc\xb9\xe7\xbb\xd6\x04\x2e\xa4\x98\xfb\x6f\xa7\x95\x2b\xa6\xbc\x8b\xa3\x9a\x21\x34\xb9\x6d\x2e\x18\x0b\x09\x77\x5c\xfa\x19\xc2\xc8\xe0\x03\x8a\x51\x8f\x7b\x03\x45\xc4\x6b\x74\x78\x41\x98\x55\xee\x68\x1a\x42\x20\x77\xd3\x49\x87\xda\xbc\x08\xb9\xcc\x4b\x11\xf1\x1a\x46\x83\x1d\x32\xe7\x74\xaa\x78\x81\x1f\xca\x3e\xf1\xb8\xaa\x39\x65\x75\xe4\x8c\x8f\x33\x38\xb2\x81\x32\xf6\x5b\x2f\x08\x03\x2f\x83\xe6\x49\xc6\x88\x28\x10\xd9\x23\x31\x0a\x7d\x4f\x26\xf5\x81\x81\xe4\xa4\x3b\xe4\x0f\xcd\x98\x9d\x5b\xd6\x46\x56\xd2\xc5\x23\x99\x0d\x68\xd8\xea\x0f\x47\xe9\x4c\x4b\x21\xd6\x28\x46\xdd\xe0\x5e\x16\xd2\xf4\x8f\x68\x53\x9d\xe9\xcc\xae\xd7\x6a\xe8\xcf\xde\xcf\x67\x41\xa9\xb7\x58\x7b\xcc\x0a\x4d\xc5\x0c\x65\x82\x5d\x7b\x79\xa5\x17\xda\xf5\x5a\xdd\x16\x25\x25\xd5\x40\x2f\x7e\x99\x58\x86\x46\x08\x21\xed\x74\x21\x47\xd7\x85\x56\xba\x1c\x17\xe8\xcf\xda\xc9\x5c\x62\x33\x8b\x9a\x6c\x21\x5b\xe1\xa4\xda\xa0\x6e\xab\xa2\x62\xc7\xf9\x90\x59\xa6\xc9\x98\x9d\x0b\x73\x76\x7a\x8e\x2a\x34\x5d\xf6\xa8\x9d\xcc\x27\x36\x15\x89\xf2\x71\x8b\xa9\xa2\x30\x67\xa4\x1a\x2a\x63\xe9\x5a\xc0\x96\xaf\x6d\xdb\x48\x25\xcc\x4e\x9a\x55\x26\x8a\x86\x2d\x48\x6a\x58\x0e\x4d\x2a\x85\x8d\x5a\x33\xb4\xd2\xdb\x28\x3d\x5a\xbb\x32\x34\x35\xac\x59\xe1\x6a\x9d\x10\xbb\xc4\x09\x9b\xd2\x5b\x28\x61\x8c\x16\x59\x8b\xa9\x4c\xa5\xb2\x1f\x61\x55\x11\x7b\x26\x15\x4c\x17\x33\xc1\xce\x7f\xdb\x0c\x7b\xa3\xb5\x52\xd9\x5e\xee\xef\xda\xc3\x2b\x00\xad\xa7\x0b\x8c\x24\x48\x1a\x73\x6c\x07\xbd\x9d\xd8\x5e\x40\x0f\x7c\xe6\x33\x9f\xdc\x68\x1f\x78\xfa\xd3\xcf\x5f\xdd\x0e\x7b\xc3\x2b\x8a\x12\xfb\x4b\x2a\x89\x22\xde\xfd\xae\x35\x2b\x94\x35\xaa\x51\x85\x49\xac\xb8\xb1\xb1\x51\xe2\xcb\xc5\x9d\xbf\x74\x7d\xd9\x8c\x3b\xf7\xd5\x89\xa8\xaa\xa5\xb5\x2b\xd6\x4a\x54\xe2\x5b\x1c\x51\x14\x81\x95\xd6\xf7\xac\x85\x56\x7c\xe4\xf9\x17\x9e\x3f\x6d\x1e\x78\xfc\xfc\xe3\x07\xc2\x2b\xeb\xc4\x0b\x7d\xc2\x4c\x1a\xf6\xfa\xbd\x90\xa8\xa2\x4c\xed\x5a\x29\x20\xa6\x24\xc9\x66\x6d\x7f\xdd\x90\x18\x61\x0e\x23\x98\x32\x46\x9e\x47\x6b\xcf\xdf\xae\x44\xde\xe2\x72\x7b\x79\xd1\x35\x8b\x9b\x1b\x23\xdb\x36\x88\x48\x24\xd1\x48\x3b\x16\x24\x28\x5f\xba\x13\xbd\x5b\xf8\x2d\xd0\x79\xd5\xa5\xb7\xc3\xf5\x5b\x10\x71\xfb\xca\x16\xdc\x02\x77\xbc\x29\xbf\xe1\x54\x3a\xee\xaf\xeb\x4c\xe0\x96\xce\x16\xf4\xe0\xf8\x14\x3e\x29\xfc\xa8\xc3\x71\xe8\xf1\x29\x17\x4d\xa5\x09\xf4\xac\x09\x54\x2f\x64\xf5\x9b\xba\x41\x6f\x2c\x8e\xc4\xa9\x13\xdd\x1f\xb5\xd2\x01\x86\x5a\xf5\xb1\x38\xe2\x01\xd8\xdd\x20\x34\x90\x5f\xf7\x7b\x29\x0c\x19\xb6\x05\xd2\x1a\xf1\x9a\x9c\xb1\xe0\xf3\x7c\x95\x36\xaa\xd7\xda\x88\x64\x1c\xa2\xad\xb1\x30\x70\x33\x73\xe1\xcf\x3a\xe5\x80\xe5\x07\x2d\x27\x1f\x78\xec\x7c\xb3\xcc\x48\x8a\x96\xf1\x95\x4c\xca\x91\x74\x3c\xa6\xe8\x37\x4c\xd1\x84\xae\x2b\xba\xee\x5b\xff\x3d\xef\x5c\x45\xc9\x35\x92\xc6\xcb\x44\x52\x35\x2c\x63\x8e\x54\xef\x8d\xaa\x39\x16\x05\x0e\x61\x8a\x44\x14\xcb\x34\x5d\xdf\x32\x59\x6e\xb5\xbb\x6a\x90\xb0\x58\x62\x36\x29\x55\xeb\x4c\xf8\xcc\xe2\xdb\xde\xfe\xf6\xd5\xe6\xb1\xeb\xaf\x6b\x1e\x8f\xda\x8c\xb9\x3a\x59\xff\xc8\xb9\x0f\x3f\xbc\xff\xa3\x8f\x7d\x60\x2c\xe9\xd1\xbe\x5c\x65\xf3\x33\x9f\x7d\xf1\x48\x29\x66\x08\x89\x11\xb7\x96\xdd\xf1\xf3\x5f\xfe\xd9\x9b\xf9\x90\x39\xaf\x4b\xaa\xa8\xb9\xac\x5c\x6b\xb8\xab\x77\x9e\xb8\x79\x11\x29\x2c\x4e\x11\xb2\xac\x21\x00\x09\xf4\x4b\x3f\x21\xdc\x2a\xfc\x29\x58\x50\x85\x9b\xe0\x19\xa4\x6f\xc1\x19\x78\x78\xca\x0c\xfe\x11\x0e\x03\x1f\xb6\x26\x00\xdb\x69\x87\x3f\x3c\xe5\xf0\xb6\xe1\x23\x53\xa9\x38\xfb\x6e\xd7\x4c\xba\x6a\x76\xf6\xd0\x4c\xba\x61\x2a\x71\x4d\xf1\x0c\x04\x70\x06\x5a\x70\x06\x86\x70\x06\x0e\xc2\x19\xb8\x09\xce\xc0\x7d\x70\x86\xff\xf7\x04\x9c\x81\x17\xe0\x0c\xbc\x04\x67\xe0\x15\x38\x03\x5f\x87\x33\x3b\x9a\xe2\x19\xf8\x01\x9c\x99\xf1\x7a\x7f\x3a\xc5\xad\xcf\x74\x26\x70\x4f\x67\x0b\xee\x9c\x81\xeb\x7b\xe0\x99\x69\x23\x77\xa4\xe2\x4c\xda\x35\x95\x26\x70\xa7\x35\x81\x7d\x7c\x19\xde\x39\x77\x68\x26\xdd\x30\x95\xb2\xf8\x63\x1e\xd9\x3f\x46\xa3\x7a\x1b\x21\x39\xc3\x20\xbc\xb0\x4d\xaa\xe2\xf1\xa5\xcf\xc0\xf2\x02\x27\xbe\x15\x86\x23\x6e\xcb\x96\x09\xd7\x14\x47\xfe\x34\x64\x6f\x64\xf0\x21\xe7\x65\x21\x1d\x59\xd4\x3f\x3f\xd5\x8b\x51\xe8\xf1\x6a\x1d\xfd\xd6\xa0\xdf\xaa\x65\xa6\x65\x71\x74\x1b\xcd\x51\x46\xed\x5a\x3d\x5c\xbb\x62\x57\xf8\xf9\xdd\x57\xa2\x9b\x62\x22\x11\x81\x50\xc1\x2c\x3a\x47\x53\xf8\x98\x4b\xf5\x18\x45\x44\xd8\x4d\xea\xc4\x0f\x03\x42\x34\x82\x48\xa9\x60\x6a\x54\x4f\x68\xf8\xee\xd2\xa1\x83\xeb\x36\x73\x6c\x97\x95\x74\x42\x89\x1d\xe7\xa3\x87\x25\x55\xcd\xed\x1e\x96\x86\xa3\x3d\xf5\xa8\xdb\x49\x18\x0d\x19\x09\x42\x9f\x84\xbd\x3a\x55\x58\xb9\x53\x2a\x50\x89\x58\x58\xd5\x08\xf1\x23\x9f\xd8\x73\xf3\x73\xf6\xd7\xa2\x02\x0b\x47\x83\x25\x46\x05\xe6\xb3\xce\xbd\x82\x36\xe6\xb6\xec\xce\xed\xb7\xde\x32\x7f\xed\xe0\x91\xf7\x3e\x7a\x24\x4a\x1b\x59\x3e\x70\x60\x73\xf7\x8a\x29\x92\xec\x1f\x6b\x2d\x2d\xd9\x12\xfd\xc4\x1d\x32\x29\xd5\x6d\x6e\x79\x3e\xf8\xc9\x4f\xff\xf8\x0d\x44\x56\xf5\xee\x15\x1f\x3e\x77\xee\xbd\x3f\xb6\xc0\x2a\x95\x02\x21\xba\x1f\x47\xf5\x03\x75\x3b\x5f\x28\x87\xcc\xd7\x0b\x61\x63\x4c\xd9\xd2\x68\x5c\xba\xe2\xe1\x15\x82\x04\xe2\xc4\xf9\x88\xd9\x9e\x69\x30\xae\x63\xc1\xa5\xfb\x84\xdf\x15\xfe\x08\x4c\x28\xc1\x22\x8c\xe1\x13\xf0\x37\xb0\xb1\x05\x27\x60\x99\xff\xf9\x7b\xb0\x0c\x27\xb2\xa5\xa0\x33\x81\xd1\x85\x09\xc8\xdb\xd9\xb2\xb0\xb4\xbd\x05\xc3\xbf\x3f\x6b\x4d\xe0\xbb\xe9\xea\xf2\x2d\x6e\xc9\xc2\xdc\xce\xca\xf7\xc6\x5a\x9d\x57\x7f\xea\x21\x92\xa2\xc6\x54\x1d\x11\x39\x01\x31\x09\xd2\x3f\xd5\xa8\xdf\x4a\xd5\x96\x14\xa6\x26\x3b\x71\x35\x49\x06\x3c\x0d\x21\x91\x79\xb2\x48\x10\x06\xfe\x88\xdb\x60\x85\x51\x7f\xc8\x83\x89\xc2\xac\x42\x79\xf6\x77\x9f\x8e\x29\x31\x9c\xaa\x2f\xe9\x36\xcc\xeb\xa8\x8c\x78\xdd\xb8\x36\x0f\x8c\x4e\x71\x2d\x69\x23\xe2\xcb\xad\xa4\xc5\xd3\xad\x32\x7b\x57\x32\x1d\x65\xdc\x68\xd0\xeb\x0e\x7b\xe1\xb4\x92\x3a\xea\x0f\xb9\xd9\x02\x31\x56\x6b\x35\x0b\x86\xe4\x94\x2b\xcd\x88\x79\xe8\xe3\xac\x56\xaf\x31\xa7\x14\x3a\xa4\x7e\x4b\xfd\xe2\x6f\x12\xcc\x4c\xf2\x18\x73\xe3\x95\xe5\x85\x8b\x7f\x5b\x96\x28\x35\x99\xc4\xca\x12\x25\xba\xa3\xa3\x4b\x4e\xad\x60\x59\xac\x58\x08\x08\xef\x74\x42\x31\xc6\x84\xaa\x98\xd5\xea\x55\x66\x59\xbc\xb6\x09\x26\x82\xf0\x53\xba\xe4\x18\xc8\xc1\x2a\x23\x9d\x77\xee\x61\xd5\x46\x95\x91\x42\x29\x4f\x56\xee\x5c\x61\x2b\x6b\xa3\x2b\xf7\x3c\xd4\x88\xc6\xe3\x91\xc3\xed\x66\xc7\x30\xc1\xe9\x66\x47\xa2\x95\x4e\x27\x34\xd3\x6d\x8c\x95\x4a\x45\x46\x8c\x30\x4f\x98\x9b\xea\x5f\x26\xc7\xd3\x4e\xa3\x5e\x77\x2a\x5c\x7f\x22\xa6\x2a\x32\x1e\x79\xb2\x91\xea\x5d\x9d\xeb\x3a\x26\x35\x59\xe3\x6a\x3e\x2a\xa2\x85\xf9\xc5\xc8\x63\x26\x4b\x87\x0f\xf7\x94\x84\x2b\x51\x87\xc8\x22\x37\x79\x31\x0f\xd1\xb0\x59\x6f\x45\x77\xe9\x85\xc8\x59\xee\xf6\xd1\x23\x9d\x43\x3f\x71\x68\xf7\x7b\x76\x37\x36\xd8\xc6\xca\x9d\x2b\xbb\xdf\xfe\xc0\x83\x9f\x23\x22\x31\x1d\x8b\x3b\x2b\x9c\xb9\xa4\xca\x64\x24\x08\x52\x7d\x7d\xf7\x7a\x83\x09\xaa\x4c\x2a\xbf\x36\x78\xe0\xc7\x1e\x18\x10\x51\x92\x56\x58\x44\xa3\x85\x85\x85\x28\x6d\xf8\x9e\x87\xea\x5c\x29\x72\xe2\x38\x76\x1a\x9b\x61\xe7\xc4\x4d\x6f\x59\x3b\xfe\xf2\x5d\x71\xbd\xd1\x99\x27\x41\xbe\xc8\xee\xe2\x36\x06\xfe\x1b\x24\x6a\x11\xcb\x4c\x3b\xc9\x49\x7b\x33\xaa\x96\x2a\x91\xc4\x78\x9d\x0f\x33\x45\xd0\x84\xe8\x0e\x23\x15\x62\x39\x36\x59\x38\x7e\xc3\xf1\xf9\xfa\x55\xfb\xf7\xc6\x9f\x4a\x3b\xdc\xae\xec\x79\xe7\xca\x9e\x77\xae\x10\xaa\x12\xc3\x94\x49\x56\xd3\xec\xe2\xa5\x77\x09\xb7\x09\xdf\x86\x00\x6a\x70\x02\x5e\x80\x83\x5b\x50\xe2\x59\x9f\x5b\xb0\x09\x16\x5f\xaf\x2d\x2b\x63\x84\x8d\xc1\x9a\x46\x3b\xc7\x9d\x09\xcc\x6d\x4f\x20\xb6\x26\xd0\xbe\x90\x2a\xf8\xd6\x9b\xf2\x33\x6e\x4d\x15\xfa\x14\x34\x72\xdd\xda\x10\xe4\xb0\xd9\x0d\xfc\x31\x42\x29\xb2\x23\x21\x2f\x70\x98\xb9\x10\x84\x12\x8a\xdf\x44\xba\x3a\xb5\x71\x71\x45\xa9\x9f\x15\x3b\x1c\x70\x9c\xe8\x91\x5a\xcb\xf5\xbb\xc3\x29\xbd\xb6\x10\x84\xbe\xec\x11\x99\xd4\x6b\xa4\xd6\x1a\x18\x62\x52\x6b\xa3\xe1\x20\x73\x42\x8b\xdc\x05\xdd\x0b\xd2\x2b\xd3\x95\x55\x98\x73\x5b\xcd\x96\x5b\x19\xef\xd9\x95\x73\xcb\x79\x97\x54\x51\x47\xf7\x5b\xc3\x8b\xc7\x37\x5d\x2a\x90\x1e\x91\x34\xed\x8c\x5e\x2a\x46\x44\xd3\xb5\xdc\xae\xb5\x51\xde\x6d\xcd\x2d\xe7\x5c\x22\x22\xf6\x1e\x77\xa1\x55\xca\xac\x51\xdc\xf0\xca\xb0\xc4\xa8\xe5\xdc\xd5\x7b\x77\x8f\x38\x9e\x43\x08\x93\x91\x7c\x26\xfd\x8b\x12\xdb\xa2\x4b\x37\xdf\x74\x7d\xcb\x35\x45\x51\xb5\x73\x6e\x21\xf0\x98\xee\x59\x3a\xe1\x8f\x60\x92\x28\x98\x0c\xa9\x29\x9e\x14\x58\x50\xae\x33\xa7\x26\xb1\xdc\xa6\xf0\xc4\x7b\x0e\x3c\xfb\xdc\x0b\xd7\xdc\x7b\xcd\x67\x7f\xfc\xb3\x9f\x42\x22\x21\x37\xfc\xe4\xe7\x3f\x7b\x4d\x97\x20\x42\x89\x8c\x44\x2c\xd7\xe6\xe7\x99\x45\x44\x62\x65\x56\xaf\x1c\xcb\xad\xed\x19\x97\x2b\x07\x0e\x5f\xdd\x62\xba\x7e\xf1\x87\x7f\xee\xa4\x83\xd9\x5d\x5c\x5e\x74\xab\xf7\xca\xb2\x20\x48\xaa\x2e\xdb\x4c\x22\x56\x10\x92\x03\xcf\x3f\xf7\xa9\x0d\xfe\x9b\xd2\x67\xe9\x44\x45\x6e\xe5\xf0\x91\xab\x01\x94\x4b\x97\x2e\xdd\x2b\xce\x09\xdf\xe4\x41\x22\x45\x98\x87\x11\x5c\x05\x5f\x42\x2a\x3a\xb2\x05\x27\xe1\xfb\xfc\xef\xff\x0c\xbc\xb6\x63\x8b\x3d\x09\x01\x9c\x84\x16\x9c\x84\x21\x9c\x84\x83\x70\x12\x6e\x82\x93\x70\x1f\x9c\x84\x33\x70\x12\x9e\x80\x93\xf0\x02\x9c\x84\x97\xe0\x24\xbc\x02\x27\xe1\xeb\x70\x72\x67\x87\x3d\x09\x3f\x80\x93\xdc\x16\xbb\x0f\xbe\x0f\x27\xf9\x18\xd9\xd7\xc9\x32\x80\x64\xf8\x3e\xdf\x16\xb9\xdd\xea\x35\x78\x03\x5e\xdb\xb1\x5b\xbd\x06\x39\x78\x0d\xe6\xe1\x35\x58\x83\xd7\xe0\x30\xbc\x06\x27\xe0\x35\x38\x0d\xaf\xc1\xa3\xf0\x1a\x3c\x05\xaf\xc1\x8b\xf0\x1a\xbc\x0c\xaf\xc1\xab\xf0\x1a\xbc\x0e\xaf\xf1\x60\x13\x13\x5e\x9b\x6e\xb8\xee\xf4\xc9\xe9\x58\xde\x91\x16\x66\x67\x57\xa6\xd2\x04\x9e\xe1\x15\x43\xd2\x6d\x7c\xa7\x6d\xa2\x35\x81\x03\xd3\x50\xfd\x3b\xb6\xb7\xe0\x37\x66\xf7\xbf\x3e\x93\x7e\x67\x2a\x4d\x60\x9f\x35\x81\xff\xbc\xbd\x05\x97\x66\xdf\x3c\x63\x4d\x10\x4d\x71\xc4\x1f\x65\xda\x15\xe7\x08\x36\x50\x33\xdb\x03\x44\x03\x99\x88\xe7\xe5\x25\x3e\x89\x85\x70\x8c\xda\x62\x53\xe6\x55\x9e\x07\x6d\x31\x8b\xbb\xf4\xc7\x68\xd0\x17\x76\xc2\x35\xf9\xf6\x5e\x23\x72\xe0\xf8\x7c\x1f\x08\x86\xa3\x64\x98\x70\xed\xa6\x1b\x0b\xbd\xf4\x21\xb1\xc8\x99\xe7\x79\x61\x9b\x30\xe6\x69\x82\x5e\x2c\xc8\x63\x71\x03\xa5\x50\x33\x69\x19\xc2\x88\x93\xe5\xa7\x58\x43\x0e\x79\xb2\x53\x1b\x8d\xa6\x21\xad\x9c\x4c\x5f\x0e\x65\x5e\x1a\x5a\xe4\xac\xfb\x72\x66\x52\xee\x0f\xb3\x0c\xde\x51\x0a\x24\x06\x57\x20\x5e\x8e\x27\x7d\x5d\x98\x95\xdc\x4f\x67\xd8\xc3\xbe\x7c\x8f\xef\x79\x7b\x84\x33\xfe\x70\xb0\xa4\x55\x56\x2a\xdf\x0b\x16\x7c\xc3\x8f\xa8\x4f\x7f\x1f\x6b\xf9\x85\xbc\x23\xda\x95\x5a\x8c\xae\x5d\xa4\x4c\x91\xb1\xef\x53\xaa\xc8\x7f\xf7\x5f\xa8\xa7\x4b\x98\x32\x8c\xa8\x2d\x09\xa7\xfc\x8d\x45\x2b\xf4\x43\x0b\xcb\x0a\xd3\xac\xb9\xc5\x39\x6b\xe1\x9e\x05\x2a\x62\x2c\x08\x95\x8d\xb2\xe1\xfb\x18\xa9\x66\x8a\x02\x30\x66\x7e\x88\xb5\x5c\x60\x68\x81\xef\xd3\x5d\xd4\xa7\xa2\x24\x60\x6a\x33\x4d\xd0\xac\x72\xa5\x6c\x99\x96\x8a\x30\xb6\x1c\xff\x04\x16\x44\x91\xf2\x1a\xad\x57\x19\xfe\xc2\xc2\x82\x4f\x45\x51\x92\x53\x4d\xcc\xa6\xd8\xf3\x5d\x62\x96\xa8\x9f\xb6\xa7\x54\x89\x29\xd6\xc5\x68\xc1\x6a\x34\x1b\x56\x7a\xbf\x4d\x2d\x43\x33\x2d\x89\x48\xd8\xf5\x3d\xec\x37\x2b\x39\xea\x77\x96\xe7\xad\xca\x46\x65\xf1\xba\x8a\x96\x8b\x3c\xd3\xdf\x15\x98\x7e\xbb\x42\xcd\xbb\x34\xa2\x57\x9a\x54\x44\x8c\x12\x7a\x95\xe1\x2f\x7e\xa5\x58\xb9\xa2\xbb\x60\xe5\xe6\x1b\xd5\x5a\x63\xef\x3b\x17\x6e\xbc\xf1\x2d\x0b\x95\x2b\x17\x9b\x47\xae\xbd\xee\x73\xf9\x41\x7f\x50\x18\x3c\xf2\xee\x77\x0d\xfc\x05\xff\x39\x94\x47\x2e\x25\xd4\x6a\xb4\x1a\x96\x96\xcb\xe7\xb5\xfc\xca\xca\x4a\x5e\xa4\xcf\x5f\xfc\xc3\xa7\xb0\x20\x89\x54\xf2\x8d\xc7\x3e\x64\x2d\xaf\x2c\xa7\x6d\xf1\x6b\xa5\x82\x45\xa8\x15\x58\xaa\xa6\xbe\xb3\xb2\xc7\x17\x04\x8c\x07\xa7\x87\x95\x51\x7f\x54\xc6\xa9\x62\xf8\xfd\x85\x13\xb7\x9e\x58\xf0\x05\x5d\xb1\x56\xee\xb9\xf7\xde\x95\xfc\x60\x30\x28\x1c\x37\x2d\x8c\xad\x8c\xd0\xbc\x52\xae\x98\xc3\xd3\x03\xbf\x5a\xa9\xf9\x86\xa1\x21\x85\x60\xab\x90\x2f\x5a\x83\x93\xb7\xde\xb8\xa8\xea\x26\x6e\x1e\xbf\xf9\xc4\xc2\xf0\xf4\xa0\x30\xe8\x0f\xf2\xa9\x62\x9a\xe2\x2f\x11\x8b\xd8\x4f\x92\xa5\xfc\xe0\xcc\x50\xf6\x29\x26\x32\xc8\x00\x97\x1e\x14\x7e\x4f\xf8\x1e\xe7\x0c\x48\x60\x04\xfb\xe0\x93\xf0\x43\xf4\xd9\x74\x76\x7d\x83\xaf\x1e\x31\x14\x76\xb8\xcb\x0b\xf0\x06\x14\x76\xe6\x76\x01\x72\x50\x80\x79\x28\xc0\x1a\x14\xe0\x30\x14\xe0\x04\x14\xe0\x34\x14\xe0\x51\x28\xc0\x53\x50\x80\x17\xa1\x00\x2f\x43\x01\x5e\x85\x02\xbc\x0e\x05\x6e\x93\x2e\x58\x13\xf8\xcc\x85\x2d\x10\xe1\x1b\x59\xc8\x3d\x48\x33\x89\x42\x01\x62\x2e\x59\x50\x98\x7e\xe7\xcf\xce\xce\x4d\xa5\x09\x7c\xc3\x9a\xc0\xf2\x76\xf6\xac\x5d\xd3\xe3\x78\x3b\xdd\xe7\x0a\xd3\x2b\xd2\xfd\xec\x08\xaf\xf8\xbc\x73\xf7\x03\x33\xe9\x5d\x33\xe9\x2b\x33\xe9\xbb\x53\x89\x7b\xe0\x27\xf0\x46\x27\x6d\xe0\xaf\xc3\x1b\xd3\x06\xee\x48\x74\x26\x59\x33\xc9\x9f\x49\x73\x33\x69\x65\x26\xed\x9a\x49\xe3\x99\xb4\x39\x93\x6e\x9c\x49\x0f\xcc\xa4\x77\xcd\xa4\xaf\xcc\xa4\xef\x4e\xa5\x95\xd5\xb0\x45\xe4\x70\x11\xc9\xdd\xe1\xa8\xc9\xdd\xa1\x68\x3a\x8f\x79\x92\x5c\x62\x88\x7e\xe0\xf0\x8f\xa8\x3f\xe4\x0b\x12\x37\xa1\x93\x56\x8d\xc8\x5e\xc0\x0b\x4f\xf3\x60\x77\x8f\xc8\xad\xfe\x88\xfb\xf3\x6b\xad\xa4\x9b\xae\x6d\x26\xb2\xd3\xd5\x66\xc4\xab\x01\x66\xd5\x89\x86\xa3\x0c\x8e\x8e\x5a\x42\xc6\xe8\xce\xed\x39\x59\xa0\x97\x81\x78\x49\xa3\x61\x5b\x18\xb4\x51\x07\xf1\x75\xc9\x33\xb8\xe1\xb5\xd6\x5a\x47\x35\x52\x4f\xfa\x6d\x6e\xb5\xef\x0f\xbb\x41\xb6\xdf\xfb\xb1\x18\xb6\xc6\xc2\x28\x2b\x74\x91\xee\xe9\xff\x4b\x75\xb3\x6a\x9a\xa6\x51\xed\xd5\xd0\x0d\xc1\xca\x7c\x19\x07\xbb\x3a\xc5\x8b\x3f\x32\x82\xdd\xfb\x0e\x56\xa9\x42\x49\xd2\xed\xd9\xc1\x42\x23\xff\x0a\x31\x0d\x8d\x2a\x94\xca\x94\xca\x12\x7a\x75\x89\x08\x44\xb7\x25\x11\xfd\xac\x3d\xbf\xd0\xa0\x26\x2f\x38\xad\x53\x9d\x4a\x94\xd2\x62\xaf\xbf\xab\x9a\xaa\x2b\xa2\x24\xe2\xc7\x4d\x9d\x0a\xf4\x6a\xea\x7b\x16\x51\x02\x85\x88\x34\xc8\x07\xf9\xa0\x7a\x60\x6f\xdf\x3e\x43\xcd\x3c\x91\x14\x35\x45\x8e\x58\xa2\x06\xa1\x01\xad\x6e\x56\x25\x49\xb6\xb1\x1b\x2c\xef\xaf\xed\x4e\x11\x19\x45\x98\x51\xe2\x05\x1e\xa1\x52\xb0\x51\x35\xd3\x8f\xd5\x79\x4d\x37\x89\xd5\x4a\x9a\x76\xb1\xdb\x5e\x0e\xa8\xec\x85\x38\x58\xed\xae\x06\x54\x24\x8a\x41\x4d\x6a\xee\x96\xe8\x12\x75\x73\xf5\x22\x35\xc2\x26\xfa\x17\x9f\x69\x5d\x73\x68\x5f\x81\xce\x05\xd5\x41\xbb\x53\xa0\x95\x64\xf1\x3f\xd2\x20\x57\xb2\x9e\xb8\xf8\xfb\xcf\x04\x73\xf4\xd0\x8b\x9f\x7b\xf1\xad\x87\x83\xd5\xce\xa2\x55\x1d\xef\x19\xff\x18\x11\x54\xeb\xe8\xe7\x8e\x12\x4d\xc1\x9a\x15\x50\x1a\x52\xda\xa4\xc5\xbd\x1b\xbb\x83\xb4\xb1\x82\x80\x89\x69\x5e\x7c\xa6\xba\x79\xe0\x50\x62\x4a\x22\x22\xef\x78\xfd\x5e\x42\x29\xc5\x76\x33\x69\x59\xd5\xf1\xc6\xfe\x64\xf7\x33\x68\x79\x57\xf7\xde\xfb\x4e\x8f\x68\x10\x06\x94\xf7\x4e\x50\x0a\xe8\x7c\x20\x88\x1a\x75\xdc\xd0\xae\x1e\x5c\xde\xcd\xdb\x4c\x4c\x5d\xb3\xab\xd5\x9a\x25\x51\xc3\x30\x8e\x7e\xe9\x9f\x7f\xe9\xda\xf0\xba\x65\x2a\x4b\xe9\x93\x4b\x76\x7f\x7d\xa3\x58\xdd\x35\xe8\x15\x4b\x36\x26\x36\x2d\xc6\x55\xee\xd7\xba\x74\xe9\xd2\x03\x62\x4e\xf8\x5d\xf0\x60\x19\xf6\xc3\x29\xf8\x28\xfc\x0c\x3c\x90\x22\x84\xf5\x9d\x15\x63\x1d\xde\xe0\x2e\x5c\xbe\x62\xac\x43\x0e\xd6\x61\x1e\xd6\x61\x0d\xd6\xe1\x30\xac\xc3\x09\x58\x87\xd3\xb0\x0e\x8f\xc2\x3a\x3c\x05\xeb\xf0\x22\xac\xc3\xcb\xb0\x0e\xaf\xc2\x3a\xbc\xce\x1d\xc1\x5b\xd0\x80\x75\xd8\xc7\x67\xf5\xfa\xb4\x1e\x57\xba\x5b\x3f\x75\x61\x65\x15\xb5\x6a\x59\xcc\x8a\x30\x1c\x4d\xab\xa2\x37\x53\x1d\x0a\x87\xd3\x2c\x8d\x36\xd7\x8a\x9a\xbc\xe0\x34\x92\xbb\x7c\x53\x16\x07\xfd\x56\x98\x15\x71\xf9\xfb\x24\x8e\x54\xb7\xce\x22\x0d\x66\x31\x30\xd3\x72\x02\x1e\x91\xb3\xa0\x2f\x31\x73\x27\xd5\xdb\x38\xe3\x39\x41\x01\xba\x4f\x4f\x28\x52\x5d\xdb\xa9\xd7\xeb\x4e\xda\x53\xd1\xf0\xe2\xef\x87\x4b\x54\x51\x14\xb3\xb4\x9a\xb4\x4f\x9d\xbc\x7d\x7e\xf0\xf6\xfb\x6e\xad\xd7\x17\x0c\x8a\x9e\x64\xae\xed\xb0\x4e\xef\xff\x60\xed\xcf\x83\xe4\xb8\xae\x3b\x51\xf8\xe4\x72\x6f\x66\xde\x7b\x73\x5f\x6b\xcb\xda\xab\xba\x7a\xa9\xaa\xae\xea\xaa\x42\x37\x80\x6a\xec\x68\x00\x04\x08\x10\x2b\x01\x02\x04\x44\x02\x22\x29\x2e\xa2\x48\x51\xa2\x25\x52\x92\x29\xd2\x22\xad\x85\x16\x2d\x1a\x24\x2d\x4b\x96\x65\x5a\x94\x3c\x5a\x2c\x99\x2a\xb6\x3d\x1a\x79\xe4\x8f\x1e\x49\x9e\x70\xeb\x9b\x17\x61\xf3\x3d\x4c\xc8\x7e\x13\x7a\x31\x56\xc4\xd8\x1e\xbf\x88\xf7\x66\x46\x36\xf0\x22\x6f\x56\xb7\x63\xfe\x9f\x08\xa0\xeb\x54\x66\x56\x66\x56\xd6\xbd\xe7\x9e\xe5\x77\x7e\x87\xee\x3f\xe8\x94\xb3\x16\xb3\x19\xee\x1c\xc3\x56\xb5\x57\xc0\xb6\x17\x32\xbb\x5a\x2a\x50\x47\x35\x2b\x21\x2b\x94\x2a\x76\x61\xa9\x95\xbf\xf9\xfd\xd6\xa8\x91\x65\x51\xfb\x40\xa7\x75\xf7\xe5\xf3\xd5\xd6\x20\x44\x0e\x9b\xdf\xbe\xaf\x2a\xd3\x68\xe7\xae\x9d\x42\xa7\x7d\xb0\x1d\x61\xb7\x3a\x6a\x55\x2f\x5c\x7b\x68\x69\x74\xb8\x1f\xbb\x4c\x2d\xec\x3d\xfd\xe0\x81\xc2\xea\xae\x55\xe1\x35\xc6\xc2\x76\xab\xc2\x98\x4f\x45\xca\xc2\x30\x62\xd5\xf6\xe1\xce\xd1\x76\xf5\xc8\xe1\x43\x7b\xb6\x87\x91\x1c\xcd\x86\x58\xf4\x17\x3b\xad\x6b\x0f\xbe\xe7\x93\x1c\xc6\x42\xc7\xd5\x0e\xab\xb4\x16\x22\x1c\xe4\x72\xec\xc0\xd5\x87\x5a\x07\x56\x3a\x89\xc9\x8a\xb1\x9f\xcd\xb1\xea\xe1\x03\xe3\x88\xe9\xcc\x60\x4e\x7b\xb0\xfc\xef\x9d\xf1\x6d\xa7\x5a\x2b\x0f\x5d\x3c\x1c\x32\x13\x97\xaa\xad\x6b\x8f\x3c\x3a\x68\x1d\x5e\x69\x62\xa6\xd2\xc8\xd0\x72\x85\xc2\xf1\xcb\x0f\xaf\x74\x2e\xdc\xb1\x2f\xec\xec\xac\x1a\x6c\xb0\x76\xe6\xe2\xa5\xb9\x95\x8f\x3e\x7a\xd6\x61\x98\xa6\x11\xbb\x5b\x1f\x10\xd7\xc4\xbf\x00\x06\x39\x68\xc0\x12\x1c\x82\x0b\xf0\x22\xfc\x5b\x41\x5f\x87\x53\xf0\x9d\x69\xe8\xe6\xec\xa6\xfd\x0a\x10\x00\x40\x03\x00\x86\x00\x70\x00\x00\xce\x00\xc0\x35\x00\x78\x02\x00\x9e\x03\x80\x97\x01\xe0\x75\x00\x78\x13\x00\xde\x06\xd8\xb4\x5f\x01\x7e\x06\xc0\xed\xd7\xc3\x70\x76\xda\x78\xf6\x70\x27\xed\x2d\x27\xc1\x77\x78\x6f\xb9\x09\xac\xa6\x30\xe5\x53\x10\xc0\x29\x68\xc0\x29\x18\xc2\x29\x38\x00\xa7\xe0\x0c\x9c\x82\x6b\x70\x0a\x9e\x80\x53\xf0\x1c\x9c\x82\x97\xe1\x14\xbc\x0e\xa7\xe0\x4d\x38\x05\x6f\xc3\xa9\xcd\xab\x9c\x82\x9f\xc1\x29\x1e\x87\x3a\x35\xed\x2f\x07\xd6\x04\xae\x6c\x4c\xe0\xb0\x35\x81\x6b\xd3\xf7\xf7\x4f\xfb\xc8\x3d\xb2\xb1\x0e\x8f\xc3\xe1\xe9\xb5\x93\x2d\x1f\xdc\x48\x3f\xf9\xb5\x8d\x09\x7c\xc7\x9a\xc0\x77\x37\x60\x02\xdf\x98\xc6\xf7\x53\xc4\x81\x21\x34\x04\x43\x4a\x9b\xbe\x2a\xb8\x39\x6d\xf5\xda\xf4\x7b\xb1\xc8\xcb\x9b\xc4\x4a\x98\xe8\xe0\xb1\xd8\x11\x78\x09\x29\x1f\xd6\x7e\xe2\x6a\x8d\x13\xd7\x6c\x69\x98\xb6\x56\xe6\x9d\x5d\xfd\xc4\xbb\x6a\xa4\xa0\xdf\xde\x68\xb8\x53\xa8\x8e\xc5\x20\xed\x60\xc1\xb5\x77\x32\x45\x50\x2f\x16\xfd\x14\x39\x39\xed\xeb\x9d\xcc\x9c\xcd\x26\x47\x4b\x8d\x66\x63\x69\x64\xf7\xc7\x52\x18\x0c\x7b\xc1\xc3\x34\xc3\xa2\xfe\x42\x05\xb3\x42\x5c\x10\x24\x67\xb0\x10\xb2\xa8\x3d\x5b\x65\x0a\x41\xe8\x73\x69\xb8\x07\xdb\x7e\xc4\x9c\x22\xaf\x84\x66\xac\xd2\x6c\x7d\x0a\x37\x7a\xdb\x22\xee\x54\x59\xbc\xb5\x1b\x36\x4d\x72\xf3\x3f\x60\xdb\x24\x98\x4a\x6a\x72\x18\x16\xa5\x67\xd3\xee\xa5\xa2\x80\xa9\xdc\xad\x45\x12\xc2\xb2\xca\x88\x2c\x5a\x38\x57\x2e\xb3\x78\x71\x61\x3e\x0a\x3d\x96\xad\x36\x58\xbc\xd8\xed\x09\x89\x77\x4d\x59\x67\x47\xed\xb1\x35\x0d\x4b\x8c\x19\xcc\x60\xbc\x57\xa7\x28\x13\xee\x85\x33\xcb\xc9\x95\x17\x6a\xdd\x3b\x4f\x1d\xcd\x46\x79\x8a\x45\x1c\xc6\xb2\x24\x08\x57\x99\x80\x33\x35\xe6\xfa\x59\x07\x49\xf2\xfa\xed\x02\x66\x8c\x19\x9a\x32\x2c\x11\xd3\xc2\x1e\x75\x22\x36\x8c\xeb\x91\x81\x13\xdf\xfd\x33\x3c\x61\x8b\x99\xe9\x3e\xce\xa2\x28\x64\xc7\x5e\x7b\xed\x37\x8f\x31\xff\xe4\xef\xff\xab\xdf\x7f\x86\xc7\x02\x8e\x7d\xf1\xb7\xbf\x78\x8c\xaa\x3a\x8b\x16\x06\x0e\xef\xd8\xaa\xca\x72\x29\xb2\x24\x01\xe3\xb0\x50\x75\x6a\x47\xba\x51\xd6\xd4\x30\x16\xc4\x0c\x66\x0e\x5b\x7b\xac\xb6\xe3\x2c\xab\xed\x59\xdd\x11\xb3\x28\x8c\x58\x62\x2c\xcb\xb2\xca\x3b\x79\x9e\xfe\xc3\xd3\x42\xec\x0c\x16\x22\x86\x91\xcd\xe7\x8e\x7c\xeb\xba\xf8\x35\xf1\xcf\x79\x9d\x76\x1f\x6e\x87\xfb\xe1\x73\xf0\xa7\xf0\xb7\xe0\x24\xbe\xdf\xdd\x5b\xbd\x3b\xcb\x89\x1f\x1f\x60\x25\x16\x87\xc9\x82\xdd\xf4\x47\x4b\xed\xc4\x31\x99\xf6\x53\xe9\x0d\x47\x83\xd1\x70\x34\x6c\x72\xfc\x76\xaa\x33\x47\xc9\x80\x89\x85\x7e\x63\x2c\x0e\x96\xc6\x62\xc8\x87\x48\x5b\xc4\x3c\xf7\xaa\xa4\x5d\x82\xfd\xfe\xd2\x58\x6c\xa6\xc0\x5c\x9f\x27\x5d\x05\x25\x4c\x13\xb6\x5c\xa9\xae\x0a\x95\x66\x83\x63\x09\x87\xb1\x38\x6a\xa7\xfd\x53\xa6\x41\xd3\x64\xfc\x26\x7e\xcf\x88\x03\x5f\x84\xc6\x60\x2c\x2e\x35\xdb\x02\x3f\xed\xf4\x34\x7e\x72\x29\x53\x68\x4b\xcd\x06\xc7\x92\x0f\x03\xb1\x44\x4d\x86\x7d\xdf\x44\x9a\xed\x7d\xab\x88\x34\x7a\xf3\x1f\x3b\xb1\x64\xd7\xab\x9d\x8b\xe7\xcf\xb6\x4a\x52\xe2\x33\xcf\x86\xd5\x23\x87\xf6\x17\x0a\x4d\x53\xff\xb6\x93\x91\xf2\x55\x9a\x8d\xb0\x66\x24\x7e\x40\x32\x62\xec\xf9\x99\xf2\xcb\xac\x5c\xca\x61\x96\x8f\xf3\xcc\xd1\x25\xb9\xa4\x73\x78\x89\xed\x9e\xa4\x22\x33\xa8\xeb\x67\x6c\xa6\xd2\xa3\x28\xc8\xe6\xa9\x13\x67\x22\x56\xf0\x45\x8f\x59\x3c\xbd\xe2\x7a\x91\x53\x58\x9a\xaf\xb2\xc2\xae\x5d\xbb\x0a\x83\x71\xc5\xc4\x58\x75\x4a\x85\xc2\xbe\xfd\xfb\x0a\xcc\x31\x75\xcc\x73\xc1\xdd\xb0\x13\x61\xaa\xa1\xa8\x60\x22\x36\x3b\xb4\x0d\x49\xd2\xb3\xd1\x87\x6d\xcb\x08\x42\xa7\x52\x08\xf0\x87\x3b\x0f\x5c\xbe\xcd\xa1\x72\x14\x6e\x3f\x74\x76\x70\xc7\x73\x35\xa6\xd2\xb4\x7d\x2f\xc3\xc2\xa7\xba\x16\xc6\x58\x15\x76\xac\x7c\xe2\x40\xeb\xf4\x6d\x3b\x1d\x64\x04\x05\x2b\x46\x88\x92\x30\x47\x55\x29\x28\xb4\x1f\x7a\xff\x93\x6b\xad\xbb\x2f\xdf\x59\x65\x5e\x34\xdb\xa8\xda\xd8\x33\x45\x16\xb5\xe7\x66\x1c\x5c\x0e\xa5\x2a\x42\x08\x31\xd7\x8f\x1c\x67\xa1\xd7\x0f\xe3\xc1\xd2\xa0\x80\x03\xdf\xdc\x55\x18\xef\x5a\x2d\x60\xd5\x30\xc2\x76\x54\x64\x8e\xc9\x30\x92\x99\x89\xab\xe7\x2f\x5f\x6e\xb5\x45\x99\x18\x8e\x81\x49\x76\xe6\xfd\x2c\xc3\x48\x18\x1f\xbf\xf8\xee\xa5\xea\x81\xbd\xab\x85\x82\xca\x4c\xcc\x27\x2f\x61\xe4\x58\x98\xa7\x89\xb5\x55\x3d\x71\xee\xae\x76\xb5\x1f\x85\x9d\x76\x3b\xdc\x7e\xb1\x7a\xcc\x59\xe8\xcc\xdb\x16\x26\x86\xd3\xc6\x38\xbb\x7d\xe5\x8e\xd7\x2f\x75\xee\x3d\xb7\x9b\xd1\x3e\x80\x06\xf2\xad\xdf\x11\x4f\xf3\x38\x85\x05\x25\x68\xc1\x76\xb8\x1d\x2e\xf3\xd0\xc4\xd1\x75\x38\x01\x6f\x71\x4d\xdf\x99\xf6\x57\x04\x78\x0b\x3a\x5c\x2b\x76\xf8\xf8\x9d\xc0\x09\x6b\x02\x77\xa6\xfd\xf7\xe0\xe1\x8d\x74\xfb\x07\xa7\xdb\xbf\x95\x68\xc9\x6f\x77\x26\xf0\x87\x89\xa6\x4c\xb1\x26\xc9\x5a\xde\xe7\x35\x9b\x52\x38\x5c\x6a\xb6\x25\x89\xb3\x7a\x24\x5a\xd3\x0b\xfc\x7e\x2c\xf8\x9b\x45\xf3\x61\xe0\x19\x3c\xce\xca\x61\x27\x89\xce\x6c\xf2\x56\xb4\x69\x6f\xbb\xc6\x58\xac\xf3\xa1\xcb\xbb\xd2\x06\xfe\x58\x1a\x71\xe6\xaa\x7e\x62\x17\x4f\xeb\x3c\x9b\xab\x02\x3f\xd7\x20\x96\x4c\x21\x96\x8a\x02\xd7\x90\xd5\x44\x2b\xf3\x86\x7b\xd5\x54\x57\x8e\x06\xd3\x08\xd9\x8a\xd5\xaa\x46\x56\xad\x9c\x15\x15\xbb\xd5\xaa\xd1\x6b\x37\xbf\xef\xd2\x72\x39\x9e\x69\x50\x9a\xeb\xb4\xfb\xe3\x20\x4b\x31\x35\x6c\x89\x2a\x72\x21\xf4\x4d\x24\x20\x82\x69\xfd\xa8\x65\x07\x98\x3a\x6e\x64\x71\x4f\xce\xaa\x97\xb3\x7f\x36\xa7\xa9\x12\xa2\x32\xb5\xa9\x44\x74\xa1\x56\x3e\xb0\x6f\x77\x8e\x4a\x54\x95\xad\x42\x2e\x6f\x49\x18\x19\xf3\xbb\x46\x4b\x65\x93\x66\x23\x0f\xd3\xf6\xf2\x6a\xce\x5c\xb3\x25\x23\xa2\x56\xd1\x93\xe8\x59\x7f\x30\x1c\x04\xe6\x76\xab\x14\xe7\x68\x63\xb1\x35\x57\xb6\x5d\x37\x13\xd0\x19\x5f\x94\x35\x6a\xd0\xa0\x49\x1b\xa7\x4f\xdf\xbe\x88\x24\xcd\x0d\xb0\x11\x6c\xa3\x32\x36\x03\x61\x77\x39\xa6\xb9\xd5\xd5\x95\x80\x66\x83\xdc\xea\x9e\x5d\x02\xba\x46\x02\x8a\x5d\xcf\x58\x26\xba\x89\x68\x8d\x1a\xd8\xf3\x3d\x4c\xa5\x82\x55\x2e\x95\x2d\x82\x75\x8a\x82\xf9\xb9\x79\x9f\x62\x35\x58\x3b\x37\x7c\xe8\xe1\x87\x46\xa5\xe3\xe5\x60\x5c\xda\xf3\x89\x5f\xfd\xf4\xfb\xb0\x8e\x35\xab\x74\xa2\xb4\xe7\x99\x5f\x7e\x66\x0f\x55\x24\x11\x37\xf6\xee\xd9\xdb\x08\xd6\xee\xb8\xa3\x6c\x62\x01\x13\x3c\x77\xf2\xf6\xa3\x0d\xf3\x2a\x3f\x87\x19\xcc\xb7\x7b\xb9\xc7\x1b\x6b\x07\xd7\x9a\x73\xd7\xa8\x22\x05\x7b\x0e\xaf\xe5\xfe\x35\x2a\xc5\x16\xa5\x8e\x2c\x2b\x4f\xfe\xe3\xc7\x9f\x99\xdf\x5f\x0a\x1c\xc9\x07\x04\xf4\xd6\x97\xc5\xe7\xc5\x5f\x00\x83\x59\xd8\x09\xbf\x0e\x7f\x07\x2f\xac\xc3\x31\x78\x67\xd3\x42\x7d\x07\x7e\x0e\xef\x6c\x5a\xa8\xef\x40\x06\xde\x81\x16\xbc\x03\xcb\xf0\x0e\x1c\x82\x77\xe0\x4e\x78\x07\xee\x87\x77\xe0\x49\x78\x07\x9e\x87\x77\xe0\x15\x78\x07\xde\x80\x77\xe0\x2d\x78\x07\x7e\x08\xef\x70\x0b\x55\x85\x77\xe0\x18\x77\xd4\xe2\xa9\x34\x81\x63\x3c\xe1\x38\x81\xa5\x8d\x54\x7e\x70\x63\x1d\xbe\xbc\xb5\xb7\x6c\x4d\xe0\xcd\x1b\xdd\xc5\x91\x87\xfd\xc4\x7a\xc5\x6d\x51\x32\xa4\x30\xb1\x5c\xa7\x31\xa4\x66\x1a\x46\xea\x0f\x83\x70\x89\x73\x38\x48\xa3\x46\x32\x0a\x39\x9f\x94\xb4\xd5\x8d\x90\xfb\x7c\xbc\x47\x55\x72\x1a\x2f\x18\x0d\xd3\xa2\x05\x5e\x4f\xdc\x48\x96\x71\xce\x78\x93\x7a\x88\x21\x4f\x3a\x18\x92\x5f\x31\x44\x65\xa9\x2d\x56\x1b\xa9\x2a\x4f\x4d\x5b\x5e\xde\xd0\x5c\x1a\x0e\xaa\x3c\xf4\xca\x4f\xd8\x1b\x0b\x69\xb5\x44\x1b\x4d\xdb\x77\xc5\xc2\x6e\x7b\xfe\xe2\xc5\x8b\xf3\xbd\x4b\x67\xef\xa8\x63\x5b\x97\xb1\x3f\xdc\xb9\xba\x63\xe8\xbb\x16\x96\x70\x36\x2a\x1e\x3e\x71\x76\xde\x9d\xc9\x6b\x42\x0b\x07\x2e\xc1\x95\xfa\xc1\x0c\x92\x64\xc4\x8a\x95\xfa\x89\x73\x5f\x3b\x92\x95\x75\x77\xbe\xb7\xad\x98\xd9\xbf\x3a\x8f\xe3\xfa\xac\x8b\x9d\x20\xc3\xdc\xd9\x7a\x8c\x79\x11\x2b\x26\x6e\x80\xeb\x77\x5d\xb9\x32\x8f\x24\x59\x76\x5b\x45\x0b\xeb\x4b\xab\xbb\x32\x6e\xbd\x18\xe1\x8c\xa2\x31\x1e\x10\xed\x1f\x6b\x30\x55\x67\x9e\xeb\x9d\x13\x24\x05\x63\xc7\xa2\xcc\x4b\xb4\xaf\x65\xe3\xec\x62\x16\xb7\x77\xec\xca\x64\x06\xf3\x79\x56\x6a\xf5\x8b\x99\xbd\x47\x8e\xd7\x1b\xc7\xfa\xb6\xad\xc7\xa5\x98\xe9\x19\xe6\xd6\x1b\x0d\xd7\x35\x25\x39\xac\xb4\x5c\x7f\xb4\x7d\x34\x1b\xc8\x0b\xfb\xee\x68\x34\x8e\x1f\x3b\xb4\x9a\xec\x6f\x06\x72\x06\x5b\xc5\x96\x18\xb9\xf5\x46\xdd\x2d\xd4\x32\x76\x10\x67\x92\xef\xe0\x66\x86\x8d\x7a\xb7\x92\x77\xf5\x7a\x67\xdb\x09\xac\x12\x83\xe9\x5a\x1d\x53\x84\xb0\xeb\x69\xe2\xbd\x7a\x65\xdc\xb8\xd0\x28\x55\x03\x8b\xb1\x7c\x7d\x50\xcf\x34\x8b\x59\xc6\xb1\x64\x46\x50\xce\xe8\x86\xa6\x62\xfe\x27\x33\xc3\x82\x06\xcf\x2c\xf0\xc7\x51\x5f\x99\x2f\xe9\xcc\x0f\xb2\x2e\x75\x23\x9d\x19\x44\xc5\xba\x9f\xd5\xdb\x19\xac\x62\x85\x63\x32\xdd\x52\xa9\xe4\x52\xd3\xc1\xba\xcb\xb0\x6e\xb3\xd2\x4c\x29\xef\xb2\xd9\xc1\xb8\x58\xdc\x39\x98\x63\x99\x56\x20\xba\x99\x82\xae\x2f\x64\xdc\x5c\x26\xe7\xea\x0b\x19\x6c\x6b\x12\x4b\x9e\x16\xbf\x07\xd5\x30\xc3\x6a\xbf\xd1\x3b\xb3\xbf\xc7\x30\x51\xf2\xa0\x00\xbd\xf5\x59\xf1\xbb\xe2\x3b\x60\x40\x03\x46\xb0\x0a\x07\xe1\xfd\xf0\x1d\xe1\x48\x32\x3f\x76\x71\x3d\x7c\x05\xca\xfc\xf5\x13\x40\xa6\x7a\x79\x17\x7c\x62\x33\xd2\x4b\xe0\xe7\x40\x36\x67\x0e\x81\x0c\x10\x68\x01\x81\x65\x20\x70\x08\x08\xdc\x09\x04\xee\x07\x02\x4f\x02\x81\xe7\x81\xc0\x2b\x40\xe0\x0d\x20\xf0\x16\x10\xf8\x21\x90\x69\xa4\x37\x3d\x5f\x32\x73\x36\xa5\xfe\x96\x74\x72\x2a\xa5\xf3\xe5\xdc\x46\xfa\x7a\x69\x63\x02\x9f\x48\xac\xe9\x1b\x13\x20\xd6\x04\x1e\xd8\x58\x87\x97\xb6\x8e\xfc\x04\x9f\x59\x30\x81\x6f\x76\x26\xf0\x52\x67\x1d\xd6\xe0\xf1\xe9\xad\xbf\x04\xdf\x9c\x16\xf9\x6d\x4a\xe6\x96\x14\x6f\x49\xf3\x5b\x52\x7f\x4b\xda\x05\x8f\xc3\xda\x34\x76\xb3\xb9\xed\xe4\x96\x74\x6e\x4b\xba\x32\x95\x52\xe8\xce\xd7\x36\xba\x8b\x88\x87\x3a\xc6\xd2\x00\x37\x2a\x58\x4a\x59\x5c\x78\xac\x64\x2c\x8c\xb8\x2d\x96\x2c\x53\x29\x76\x0d\xb7\xc5\x3a\x8e\x85\xde\x58\x68\xd6\x53\x1c\x5c\xe2\xc0\x9a\x82\x97\x1e\x1e\x0b\x23\x0e\x94\xf4\x63\xc1\x1f\xf6\x02\x1e\xa3\x49\x7b\x96\x26\x76\x54\x33\xf4\x0d\xd4\x34\xa6\xc6\x19\x2f\xdc\x10\xaa\x86\xe0\xa7\x16\x7a\x62\xbc\x35\x0c\xa1\xd1\xac\xe0\x4a\xa3\x99\x2c\x43\x1c\x47\x17\x4b\xc2\x15\x6c\xdb\x16\x66\xb9\xd0\x72\xba\x73\x45\x0b\xfb\x9e\x99\xa2\xfb\x24\x49\xa6\x2c\x62\x36\x89\xfc\x2f\x3b\xcd\x6a\x0e\x8f\x9d\x99\x99\x19\x67\xa7\x5d\xab\xb7\x84\x55\xd5\xaa\xcc\xd6\x03\xf9\x9f\xff\x24\x0c\x6d\x57\x13\x44\x61\xf0\xd8\x07\x9e\x5c\xb1\x78\x3d\xf9\xea\xbe\x03\x55\x93\xca\xa1\x6a\xcf\xd4\x2b\xd4\xa5\x7c\x6b\x38\xdb\x6a\x85\x66\xc7\xb2\xa9\x66\x84\x2e\xb6\x6d\x1b\xf3\x84\xa1\x57\x28\xb1\xea\x81\x2a\x93\xa9\x2c\x53\x2c\x12\x3b\x6a\x35\xaa\x0e\xcb\x65\x03\x1c\xce\xd1\x03\x9f\xfc\xe4\x27\x0f\x38\x44\x92\x57\xb1\x20\x62\x2c\x62\xd3\x61\xb2\x2b\xce\x31\xc7\x8f\x1c\x3b\xf1\xba\x5b\x67\xcf\x9e\x9d\x09\xf3\xf4\xd8\xd2\x03\x0f\x3e\x72\x08\xab\x46\x36\x74\x64\x4d\x3f\x8a\x25\x2c\x91\x5c\xd5\x32\xf3\xee\xc5\xf0\x74\x9b\x35\xe6\xe6\x8f\x3b\x08\x2b\xd8\xb4\xe3\x38\x76\x22\x05\x23\xc6\x54\x56\x3d\x55\xbd\xb4\x7e\x89\x49\xc8\x79\xfc\x9d\xf7\x73\x30\x23\x42\xe8\xc3\x0f\x15\xe5\xb0\x90\x77\x24\x5e\x9f\xdf\xb9\x78\xf1\x52\xbb\xd0\x28\x64\x6d\x26\x27\x9e\x88\x1f\xfa\x78\xe5\x97\x3e\xf0\xd8\x00\xab\x18\x39\xb2\xca\x3e\x1c\xf5\xaa\x58\xd4\x1c\x5c\x6a\xcd\xf3\x3c\xdc\x9b\x92\x21\xfe\x7b\xbe\xde\xbc\x0b\xbe\x0a\xe7\xd6\xb9\x3b\x3a\x5d\x6d\x00\x7e\xce\xdd\x50\x3e\x67\x00\x32\x00\xd0\x02\x80\x65\x00\x38\x04\x00\x77\x02\xc0\xfd\x9c\x9a\x11\xe0\x79\x00\x78\x05\x00\xde\xe0\xd6\x10\xc0\x0f\xb9\x33\x3b\x81\xd7\xad\x09\xfc\xfe\x8d\xee\xa2\xc0\x99\x06\x0d\x41\x19\x8b\x8d\xfa\x56\xea\x38\x18\xf1\xdf\x38\x59\x01\x12\x2b\x5e\x08\xbd\xb4\x15\x63\x30\x9e\x96\xb3\x35\xa7\xd5\x42\x9b\x88\x03\x71\x38\xaa\x60\x94\xd6\xd6\x4d\xb1\x92\xc9\xbf\xb1\x30\x4a\x5c\xcb\x30\x85\x62\x4a\xd3\x3c\xf5\x34\x75\x30\x8c\xc5\xbe\x17\x8b\xa2\x1c\xe6\x28\x55\x24\x0d\x57\xf2\x58\xb9\x79\x6f\xb9\x48\xb1\xa2\xea\xcc\xae\xce\x0d\xaa\x8f\xee\x0b\x7b\xfd\x7e\x30\x53\xb5\x75\x1b\x9b\xaa\x38\x1b\xca\xcc\x0d\x5d\x56\xaa\x37\xed\xca\xfe\xdd\xe3\x42\xff\xd8\x02\x99\x62\xb8\x9a\xf5\x12\xa3\x48\x13\x6c\x6c\x67\xab\xa1\xdd\xa8\xe4\xb0\x9d\x35\x04\x56\xdd\x2d\xde\x19\xaa\x8b\x77\x2c\x71\x7c\x96\x3d\xd8\xb1\x23\xa8\x76\x5b\xf5\x80\x6a\x58\x65\x61\xaf\x6c\xf1\xda\x1e\x5b\x32\x32\x8c\x47\x27\x28\xd3\x94\x14\x98\x1a\x16\xc3\xb0\x5a\x8c\x6d\xdb\x33\x0c\x46\x0c\x53\xfc\x68\xb8\x33\xac\xec\xdb\xb3\x9a\xaf\x9c\xba\xfb\xea\xde\xea\xbe\x6a\xff\x5d\x57\xde\xd5\x0f\x87\xdd\x1a\x0e\xf7\xa9\x66\x18\xee\x39\x7c\xb4\xda\x3f\x77\xf2\x8e\x1d\xcb\x8f\x2e\xcf\x1c\x39\x7c\x64\x86\x43\xbf\x30\x32\x02\x3a\x73\xe5\x91\xa7\xf6\xd9\xf3\xed\x79\x1b\x2b\x1a\xa3\xd5\x7d\xfb\xf7\x57\xc2\xb9\x46\x0e\x63\xdd\x8b\xc3\xf6\xd9\x73\x17\xfb\xd6\xf5\x7d\x4f\x3d\x72\x65\xc6\xf6\xbd\x6c\xc0\xb1\x88\x74\xae\x3f\x0c\xdb\x57\xaf\x5d\x5d\xe8\x5c\x58\x30\x35\x55\xc6\x0b\x97\xaf\x5c\x6e\xdb\x2e\x53\xb0\x3d\x33\xdb\x0e\x69\xae\x90\x63\xd5\x7d\x65\xc4\x6c\x1d\xdb\xc8\x0b\xc3\x99\x7a\x15\x10\x90\x5b\x1f\x93\x0e\x8b\x7f\x09\x26\x64\xa1\x0f\xf7\xc0\x17\xb7\x38\xd5\x9e\x80\x13\xbc\x2e\xac\xce\xc3\xb9\x0d\x43\xe4\xf4\x77\xdc\xa5\x1a\x4b\x75\xc5\x4d\x07\x40\xf2\x43\xf1\xc2\x47\x9c\x58\x9e\x81\x13\x2e\x0d\xb9\x83\x36\x16\x7a\x53\xd7\x3e\x6d\xa6\x99\xfc\x6b\xb6\x25\x77\xda\x98\x98\x2b\x98\xde\xb0\xcf\x63\x05\x8d\x6a\x6a\x5d\x54\x8c\x69\x57\xcb\xe6\x68\x2c\x84\x5c\x63\x88\x2f\x44\x73\xcd\x9a\xc3\x5c\xc7\x65\xef\x8d\x4a\xb9\x5c\xbc\x8b\x2b\x0c\x66\x60\xe1\x26\x74\x5f\x64\x3a\x33\x99\x93\x8d\xb2\x0e\x2f\x1c\x59\xfb\xf0\x8e\xe4\xcd\xcd\xcb\x97\xf5\x90\xed\xf8\xee\x43\x1e\xc5\x92\xa6\x45\xdd\xfe\x28\xc6\x8a\xa6\x33\xbd\xc9\xba\x47\x6a\x8c\x60\x35\xad\xe6\x33\x9d\xc6\xc2\xe8\x93\x1c\xdd\x99\x8b\xb3\x98\x03\xf3\x6b\xe7\xea\xce\x4c\x39\xe0\xfe\xc7\x15\xa7\xb5\xd0\x8d\x78\xbd\x97\x53\xaa\xcd\xc7\xac\xd5\x5f\x89\x77\x45\xdd\xa8\x7b\xb9\x1b\xcf\x37\x9b\x18\x4b\xc4\xe1\x45\x93\xcc\xa9\xb5\xc4\x87\xde\x1b\xad\xec\x58\x89\x6a\x77\x9c\xbd\xf3\xce\xcf\xdc\x02\x1e\x5d\x88\x06\xc3\x41\xc4\xc1\x07\x0f\xfd\xbb\xf7\xc4\x3b\x76\xec\xe8\x64\xb3\xba\xfc\x95\x9b\x6f\x7f\x9e\x59\xe9\x4d\x38\x54\xc4\xdd\x0b\xe7\x2f\x74\xd7\x7e\x75\xa7\xac\x73\x89\x3b\xe0\xd6\x8e\x0f\xbc\xef\x3d\x37\xff\xde\xa9\x95\x0b\x2c\x5a\xec\x76\x23\x9e\xca\x37\x4f\x7d\xe5\x6b\x5f\x3f\xcf\x54\x41\x7e\x24\x59\xe6\x89\x26\xe1\xda\xda\xda\x5a\xad\x7b\xfe\xec\xe9\xd9\x2f\x32\x93\xaa\xd1\xec\xf9\x8b\x97\x01\xd4\x5b\x37\x6f\x1d\x96\xde\xe0\x3e\x50\x96\xd7\x10\xee\x83\xa3\xf0\x1a\xfc\x33\xb8\x30\x81\xff\xd1\x99\xc0\x3f\x75\xd6\x21\x0b\x7f\xc4\x7f\x65\x34\xec\x8d\x05\xce\x4e\x98\xa6\xd2\xab\x9c\xbc\xb7\xef\x2a\xbc\x3b\xf7\xb4\x58\x4f\x0a\x13\xb3\xac\xd9\xe0\xee\x4e\x1a\x15\x52\xd2\x50\xcf\x88\x73\x84\xcd\x09\x69\x52\x60\x2b\xfd\x68\x48\x9c\xb7\x94\x17\x10\xf2\xdf\x3b\x25\xed\x4d\x0c\x43\x0e\x70\xf3\xc2\x20\x1c\x0d\x9d\x51\xe2\x80\xf7\xc2\xc0\x57\xf0\x2c\x47\xba\x35\x79\x7d\x56\x0a\x49\x99\x32\xef\x2d\x71\x35\x21\x0d\x2a\xcd\xb6\x30\x1a\x4b\xdb\x05\x3e\xf8\x9a\x63\xa9\x3f\x4a\x8d\xd8\x64\xdb\xd2\x68\xd8\x0f\xc5\xf7\x07\x4b\x9d\x2a\x0e\xb7\x2d\x56\xbe\x69\xcf\x76\xba\x01\x0d\xa9\x4f\x69\x30\xdf\xe9\xe5\xbf\x61\x6c\xcf\x89\x99\xc6\x4d\x31\xef\x46\x11\x0e\x2c\x95\xd8\xa6\xe3\x32\x3c\x7f\x56\x78\x18\x59\x96\x85\x70\x68\x09\x36\xb5\xdd\xf0\xa7\x31\x72\xa8\x64\xd3\x60\x64\x18\xb6\x61\x1a\x76\xad\x9c\x45\xb4\x98\x77\xa9\x2c\x69\x56\x7e\xa1\x96\xa7\x7e\x96\xd2\x6a\x39\xda\x6e\xc5\xe5\x56\x2e\x99\x73\xa3\x07\xe6\xa9\x4a\x0b\xc9\xea\x21\x63\xb9\xd4\x2c\x29\xb2\xfc\x71\xb2\x50\x36\x68\x26\xe3\x63\x49\x56\x57\x82\xc1\x62\x8b\x86\x33\x54\x49\x9c\x19\x13\xc5\xb5\x2a\x0d\xaa\xe5\x6a\x40\x55\x32\x8f\xa3\x7c\x84\xb1\xa9\x13\x4d\x96\x25\x9c\xeb\x2f\x6d\x2b\x9b\xd8\x72\x7d\x8a\x4d\x2a\x63\x1e\x41\xdf\x4e\x75\xc3\xb1\xa9\x4c\x83\x4c\xde\xfe\x73\x45\x96\xcd\xed\x48\xcb\x95\xb1\xa0\xe5\x5a\x89\x6e\xa3\x54\x0a\xe6\x03\x64\x1a\x44\xd8\xfb\xf1\x67\xcb\x07\xf6\xef\x16\x2e\x9d\x5b\xbc\x74\xe1\xdc\x7c\xb0\xd8\xeb\x06\xa6\x15\x05\x91\xfd\xac\x80\xfe\xc2\x36\x54\x8d\xe6\xfa\x8b\xfd\x5c\x79\xcf\x9e\x3d\x47\xe3\xdc\xee\x3d\xbb\x72\x7b\x5e\xba\x1c\x37\x8f\x1e\x3f\x39\xdf\x5c\xdb\xbf\xa7\x9c\xef\x8f\xc6\x4d\xee\x58\x95\x6f\x3b\x79\x66\x5e\xa2\x54\x96\x88\xf5\xcd\xf9\x2b\xf7\x5c\x99\xe7\xd8\x2a\x9a\xf5\xcd\x6f\x62\xd3\x36\x31\x77\x9a\xca\x4b\x8b\x83\x32\xd5\x64\x64\xbc\x2e\x6c\x7f\x7d\xc7\xd1\xcf\x7d\xee\x73\x47\x45\x59\x3d\x9c\x3c\xf9\xd3\x25\xea\x53\xbb\x10\x57\x03\x9a\x8c\xe1\xe4\x89\x07\xe3\xf2\xde\xdd\xf3\xe7\xce\x9d\x9b\x0f\x66\x1a\x33\x81\x28\x22\x8c\x4c\x9d\x94\xb7\x2d\xf5\xf3\x56\xa5\x5c\xb6\x12\x07\xef\x70\x38\x18\x0d\x82\xf2\x38\xb4\x6a\xb1\xa7\xca\xa2\x01\x29\x06\xe1\x5b\xe2\xff\x5f\xfc\x4b\xd0\xc0\x85\x16\x6c\x83\x63\x70\x11\xfe\x50\x88\xe1\x87\x1c\x47\x35\x11\xb2\x9c\x6f\xf8\x2f\x84\x94\xa3\x01\x6d\x49\x64\x4b\x32\xb7\x24\x6f\x4b\x9a\xdd\x92\xba\x5b\xd2\x60\x4b\x3a\xb9\x25\x9d\xdb\x92\xde\xb7\x25\xbd\x7f\x4b\xfa\xcd\x2d\xe9\x5b\x5b\xd2\x8f\x36\x25\x61\xeb\x5e\x04\xba\x25\x19\x5b\xd2\xe6\x5d\x75\x17\x43\x1e\x7c\x4d\x66\x23\x2f\x59\x19\x4b\xf5\x58\xea\x27\xeb\x6a\x2f\x25\x20\xad\xe0\xa6\x62\x48\xcd\xc4\xd1\x57\x46\x63\x41\x9a\xae\xc6\x9b\x64\x94\x75\xc5\xc3\x9c\x22\x5b\x69\x24\x7f\x3c\xcc\x93\x67\x29\xe4\xb9\x2d\x35\x07\x9b\xcb\x77\xdf\x8b\x85\x4a\x75\xca\xf0\xa7\x04\x63\x79\xd4\x4f\x55\x7a\x33\xad\x37\x18\x70\x94\x18\xc7\x17\x2a\x98\xf7\x9d\x57\x52\x96\xc0\x64\x35\x68\x73\xa6\xc0\x94\x71\x70\x4a\xf8\x50\x69\x34\xc7\xc2\xaa\xb0\xd4\xe6\x37\x39\x85\x86\xc5\xbc\xe8\xac\x9f\xc2\x15\x46\xd5\xb1\x14\xfa\xa9\x39\x28\xf4\x82\x7d\xd6\xfc\x42\x83\xfa\xed\xd9\xaa\x78\xde\xaf\xe5\x7d\x6c\x55\x4b\xd1\xcd\x09\x61\x84\x51\x52\xa9\x97\x29\x65\x2a\x42\xb3\x97\x67\xa9\x77\xc9\x20\xaa\xaa\x5b\xaa\x2c\x3d\x32\xbb\x74\xe0\xcb\x2d\x14\x66\x23\xe4\x87\xae\x6b\xf9\x21\xa5\xa1\xef\xc7\xf9\xaa\xf0\x64\xcb\x70\xc2\x10\xf1\x14\x75\x7d\xbf\xe2\x6b\x92\xc8\x8b\x68\xb2\x95\x52\x25\x5b\xba\xad\xe4\x97\x2b\xcd\x2c\x52\x54\xca\x43\x4a\x86\x65\x10\xc3\x0c\x0b\x79\xd4\xe8\x95\xc3\xa8\x18\x19\xd6\xe2\x68\xe8\x93\x6c\x36\x43\xae\x98\xae\x93\xf1\x91\xa4\xaa\xc5\x56\x31\xf6\xad\x6a\xbd\xf6\xbb\x48\x14\x45\x29\x1b\x67\xe3\xec\xdc\xe0\xbe\x25\x1a\x85\x1e\xa2\x99\x6c\x86\x60\xc3\xd0\x68\xa5\xd9\xb4\x90\x26\xcb\xc8\x0a\xc3\xbc\x4f\xab\xb3\x0b\x3e\xf5\x48\x6b\x4f\xd1\x60\xba\x8a\x66\x6f\x2f\x8e\x92\x4b\xf2\x66\xe4\xb3\x27\x67\x0d\xbf\x9c\xcf\x9b\x14\x53\xc3\x72\xfd\x42\xd6\x6f\xcd\xd4\x2c\x44\x14\x54\x47\x02\xf2\xb2\xc9\x9f\x65\x23\x8a\x4d\x64\xfa\xd9\x4f\x23\x53\xd7\x0c\xb3\xde\x6c\xf9\x9a\x6e\xa0\xe1\x3d\xb3\xf6\x6f\x1a\x28\x17\x52\xaa\xca\xe2\x7f\x31\x0e\x7f\x41\xf8\xd0\x49\x2b\x97\xcd\x59\x56\xb5\x5e\xb5\x68\x85\x16\x17\x02\x7f\xb1\xb7\xb0\xbc\xad\x78\xfb\x6c\x76\x6e\x76\x2e\x6b\x20\x4a\x28\x7a\xa5\xb8\x10\x28\x92\x8c\x13\xd9\x5f\xec\xcd\x5b\x06\xc5\x34\xbb\x6d\x65\x39\x8b\x5c\x47\x47\x58\xca\xd3\x42\x31\x26\xd9\xce\xc2\xac\x6f\x90\x4a\x7f\xa9\x6b\x64\xbb\xbd\x61\xd1\x32\x14\x95\x3c\x6d\x55\x4a\x11\xe2\xe7\xa9\xdf\x71\xe6\xec\x6c\x32\x8d\x03\x24\x8b\x62\xe9\xe0\x81\x3d\xd9\xb1\x7f\xe8\x53\xab\x56\xbe\x50\xf2\x89\xa8\x3b\x88\xe8\x84\x11\xbf\x51\xaf\xfb\x9c\xe2\xd0\x9a\x99\x9d\xb1\xb2\x4c\x92\x89\x44\x4f\xbd\x72\x52\x27\x8e\x13\x58\xb3\x57\x66\xaf\x20\xa2\xf2\x6e\xe7\x86\xe1\xb7\x3b\x6d\xdf\xdf\x5e\x24\xf5\x8a\x8f\x74\x24\x6a\x26\x12\xc5\x69\xce\xef\x05\xf1\x2d\xf1\x4f\x81\x42\x9e\xbb\x6a\x0f\xc0\x97\x40\x81\x09\x7c\x91\x67\x29\x38\x71\xe5\xa8\x82\xdd\x64\x00\x37\xf9\x5b\x29\x59\x18\x3c\xce\x6c\x99\x98\x90\x8d\x34\x36\x17\x0b\x9c\xea\x41\xe2\x01\xde\x69\x20\xc2\xe3\xa0\x30\x41\xe1\xcb\x92\x34\xaa\xb4\x05\x3c\x4a\x09\x61\x0d\x49\xf1\xb9\x73\xc3\x0b\x7c\xc6\xc2\x68\x29\x2d\x47\x1f\xa4\x8c\x6a\xc9\x5a\xb8\x2a\xf4\x82\xff\x93\x66\xb2\x59\x7a\xba\xd4\x2f\x05\xcb\xbd\x35\xa4\x12\x44\x33\xb9\x2c\x3d\x63\x55\xcb\x99\x9b\xff\x8f\xe5\x5a\xae\x95\x2b\xe6\x4a\xed\x60\x6e\x79\x61\x36\x47\x2d\x83\x0a\x7f\x9d\xab\x04\x0c\x53\x85\x62\x37\x70\x2b\xc8\xf3\x3d\x64\x94\xfa\xdd\x7e\xc9\x2c\xad\x96\x83\x99\xee\xce\x39\xa4\x52\x14\xec\x2c\xcd\x9f\x9e\x2d\x58\xdb\xf7\xee\xf6\x69\x36\x2e\x7e\xaa\x74\x68\xff\xd8\xa7\x1a\xf1\x7c\x7e\x05\xbf\xd3\xed\x04\x16\xa1\x28\x68\x97\x72\xd5\x72\x32\xa8\x22\xff\x60\x6e\x65\x65\x25\xe7\x16\xaa\x96\xf1\xd8\xec\x99\x32\x55\x55\xc3\x32\x82\x0c\x35\x85\xe5\x59\x64\x12\x19\x37\x0e\x1c\x38\xd0\x58\x29\xed\x3f\x72\x5c\x58\xa6\xd9\x42\xc9\xca\xcd\xcf\x2e\xe4\x68\x14\x94\x0e\x1f\xbd\xbd\x4e\x14\x3f\x7f\x1f\xad\xcd\xb5\x7d\x2a\xf9\xb3\x73\x73\xb5\xd2\xb6\xc1\xb6\x92\x11\x6c\x5b\xd9\xe6\x33\x93\xd6\x4f\xde\xbe\x96\x4b\xa6\x12\x39\xf3\xf9\xd3\xc6\xc1\xe3\xbf\xf1\xd2\x67\x8f\xc8\x92\xa8\x1d\xff\xfc\xe7\xbf\x74\x9a\x16\x22\x1d\x73\xa0\x4e\x81\x4a\x32\xe1\x20\x9b\x23\x1f\xdf\x95\x5b\x58\xe8\x95\x48\x1c\x67\x90\xf1\x98\x8a\x24\x12\x34\xeb\x0d\xff\x9e\x7b\x8d\x14\x3f\xfb\x92\xf8\x55\xf1\xc7\x10\x42\x05\x56\x61\x0d\xde\x0f\xdf\x85\x47\xd7\xa1\x0a\xdd\xcd\xdc\x5b\x15\x02\xa8\x42\x03\xaa\x30\x84\x2a\x1c\x80\x2a\x9c\x81\x2a\x5c\x83\x2a\x3c\x01\x55\x78\x0e\xaa\xf0\x32\x54\xe1\x75\xa8\xc2\x9b\x50\x85\xb7\xa1\xba\x99\x15\xab\xc2\xcf\xa0\xca\xb3\x62\x55\x2b\xc5\x1b\x76\x79\xdd\x61\xfa\xfe\xd8\x06\xac\xc3\x87\xe1\x81\xd4\xea\xc1\x15\xce\x70\x17\x8c\x82\xb1\xd0\xe3\x5e\x4b\xa2\xc8\xa4\x74\x24\x35\x13\x5f\xb8\x9f\x02\x06\x1b\x83\xb4\x8f\x41\xda\xca\x20\xb1\x7d\x84\x55\xa1\x82\xbd\xa0\x90\x02\x9c\xa6\x43\x29\xb1\x85\x38\xaf\xcd\xc8\x90\xaa\xcd\xc4\x13\xe7\x03\x90\x03\x18\x7a\xfc\xec\x21\x7f\xc3\x49\xa4\xab\x03\xae\xb0\x0d\xce\x43\xcc\x41\xb5\x95\x46\x6a\x33\x87\x41\x38\xe4\x6d\x0a\x42\xe1\xd5\xe2\xde\x7d\x7b\x77\x2c\xb9\xf3\x9d\xe6\xe1\x83\xfb\xab\xf9\x56\x35\xb6\xc3\x85\xd9\x19\x61\xf5\xde\xd3\xb7\x35\xef\x9c\xd9\xbf\x67\xd7\x9f\xc8\x92\x80\x91\x24\x4b\x54\x66\x4e\xd0\x1f\x2e\xe7\x71\x36\x9f\xc1\xfb\x1f\x3f\x87\x0b\x59\x46\xf5\x6c\x78\xa4\x12\xb2\x85\xdb\x3a\x76\xa3\x56\xa2\xb7\xbf\xba\x9f\xd5\x69\xfb\xcc\x99\x33\x0b\x32\x0d\xdb\xdd\x7e\xbe\xf8\x4b\x76\x7b\x36\xee\x5f\xbb\xf6\x6e\xe1\xd9\x70\xb1\x52\xd9\x57\xc9\x2f\xf5\x97\xf2\xd4\xa4\x95\x5d\x81\xdd\x9c\x69\xd8\x17\xbf\x73\xd7\xfe\x57\x8f\x63\x6a\x38\xcc\x6e\xd4\xcb\x2c\x99\xfe\x88\x9a\x94\xe6\x32\x01\x46\x14\x21\x39\xdc\x19\xb4\x2f\x5c\xba\xd2\x97\x54\x59\x60\x71\x1c\x86\x98\x32\x9b\x59\xc5\x4a\xe2\x20\x21\xe1\xcf\xfa\x4f\x3c\xf5\xb1\xf1\x8e\xfe\x83\x0f\xbe\x67\x0f\xa6\x1a\xc2\x48\x14\x5d\x16\x2e\x84\xdc\x6a\x61\x6e\x10\x87\x34\xf7\xbe\xc2\xd2\x70\x7b\xa5\x3a\x28\xbf\xd9\x1c\x6e\xb3\x2d\x16\x52\xac\x60\x64\x3f\xf5\x3f\x9e\x92\x28\x12\x45\xb4\xf2\xd0\x02\xcd\x05\x66\xe1\xed\xe6\xc1\x83\x47\x17\xb0\x6d\xa3\xf2\xf2\xa3\xcb\xfb\x3f\xb1\xdf\xcb\x66\xf0\xca\x47\x56\xaa\xfd\x2a\x95\x34\x13\x87\xaa\xf9\xf4\xff\xf5\x68\x62\x1d\x23\xd5\xc8\x04\x34\x97\xcf\x33\x87\xe6\x57\xb6\xaf\x56\xb0\x28\x8a\x32\x63\x86\xa1\x71\x1c\x2b\x02\xb8\xb5\x24\x5c\x95\xee\x01\x1b\x42\xe8\xc0\xdd\x70\x1d\x5c\x58\x87\x5f\x83\x25\x9e\xce\xfa\x35\x6b\x02\xdd\x8d\x64\x9c\xb4\xc5\x69\xb3\x7e\x5e\xf3\x24\xf9\x7d\x8e\xd2\x96\xfc\x58\x9a\x52\x47\x73\x92\x17\x71\x54\x4d\xfc\x98\x64\xb1\xe5\x31\xfc\x58\x0a\xb1\xc3\x73\x5e\x7d\x0e\xcc\x6e\xf3\x08\x7f\x33\x1d\x2f\x23\x2f\x08\x3d\x5c\xc1\xa6\xd0\xa8\x28\xa2\xeb\x4f\x41\x2a\x7e\x68\x48\x4d\x4e\x21\x5e\xe5\xa5\x4e\xc9\x4a\x3a\x05\xba\xf2\x35\x53\x08\xad\x6a\xb5\x9c\x77\x65\x5e\xc7\xc9\x1c\x83\xe1\x71\x9b\xb9\x37\xff\x3b\x47\x47\x33\x2c\x50\x55\x27\x11\x25\xa6\x89\xd4\x5b\xc7\xe8\x5c\x28\xcb\xea\x6d\x48\x96\x10\xd5\x24\x11\x91\x46\xd5\xa9\x36\x5a\x21\x8f\x3e\x4c\x0b\x6e\x4c\x96\x2f\xe4\x99\x29\x33\xa4\x51\x5c\x64\x4d\x1a\x45\x51\x3b\x64\x12\xd6\x4c\x3b\x13\x65\xec\xb0\x3d\x3f\xe3\x98\x6a\x88\x91\xc4\x58\x87\x15\x8a\x15\x27\xdc\x53\xc5\xa6\x49\x3e\xaa\x4a\x2a\x11\xdd\x90\x07\x1c\x65\x66\x62\xe9\x5c\x97\x85\xfa\x02\x75\x6c\x97\xad\x3c\xf3\xdc\x33\x2b\x77\xfc\xde\x25\x36\x1f\xce\xdc\x76\xdb\xd1\xd6\x27\x05\xf7\x7b\xd4\x13\x65\x82\x10\xa2\xc8\x5e\x68\x2f\x38\x7f\x74\xf3\x77\xbf\xcc\x54\xf9\x18\x52\xa9\x8a\x0f\x7c\xe1\x8e\x95\x27\x3f\xf0\xd8\xc0\xc2\xa2\x24\xd3\x07\xc3\x3d\x15\x2c\x89\x78\xcc\xd8\xcd\xbf\xbd\xf9\x9f\x2f\xc9\x0c\x5b\xb6\x85\xc7\xb8\x5a\x20\x76\xe2\x77\x85\xf7\x7d\xef\xd2\xae\xe7\x9f\x7f\x66\xe5\x21\x47\x93\x34\xa6\x32\xcc\x97\x0c\x90\x01\x6e\xad\x4a\xfb\xa4\x93\xc0\xa0\x09\x27\xe0\x15\xbe\x5e\x7c\xb4\xf3\x2f\xb3\x7d\x18\x8b\x7d\x21\xed\x82\x10\x0b\xdc\xa4\x4a\x39\x3a\xdb\x52\x33\xb5\xa3\x62\x29\x1c\x0c\x03\x3f\x79\xda\x61\x7b\x33\xbe\xdd\x16\x42\xbf\xea\xa7\xfd\x15\xbc\xc0\x1f\x05\x89\xc0\xa1\xf1\x29\xf9\x44\x8f\xf7\x97\x49\x6c\xa0\x0a\xf6\x2b\x3c\x29\x39\x05\xda\xf3\x45\x23\x96\xc4\xbf\xf6\xe7\xe7\x66\x2a\x39\xd5\xad\x37\xea\xce\x3f\x4f\x78\x5c\xb6\x7f\xac\xb1\xfa\xa9\x55\xdd\x64\x26\xf3\xf4\xdb\x9e\x6c\x14\x5b\x8d\x59\x83\x55\xab\x79\x9c\xa9\x16\xab\x19\xb6\xb4\x63\xc5\xd5\x7d\xa7\x31\xb3\x90\x61\x26\x33\x75\xbd\x5a\xaf\xea\x8d\xed\xc3\x41\xb1\xff\x81\xff\x52\x2e\x76\x3b\xc3\x46\xfd\xee\xbe\x6d\x27\xcf\x54\xc1\x4c\xc3\x6e\x2e\xf0\x74\x1e\x28\xe7\x50\xe3\xcc\xee\x6c\x66\x96\x17\xc2\xaf\xfe\xf2\x91\xc6\xdd\x7d\x1c\x66\x43\xcc\xc3\xc8\xc5\x7d\xfb\xf7\xde\xa6\x62\x84\xc2\x0c\x96\x08\x91\xde\xc0\x51\x3e\xd6\xcf\x7d\xe3\xdc\xa3\xff\xf8\xa8\x15\x84\x38\xbb\x98\xb9\xfa\xe7\x8f\xd6\xcf\x9c\x3b\xb3\x56\x5a\x5e\x5e\x29\x96\x0e\x1d\x39\x54\x9c\x3f\x79\xfa\xce\x9e\xcd\x2c\x3d\xf9\x69\x38\xfa\x79\xfe\xe8\x6d\x47\xe7\x7b\x8f\x3c\xfa\x48\x4f\x57\x65\xdb\xee\x3d\xf0\xee\x7b\xe6\xae\x7e\xfb\x9c\xde\xd2\x6d\x8c\x10\xe3\xa1\x3d\xc6\xa3\xec\x9c\xec\x31\x19\x6f\x32\x8b\xb2\xd4\xb2\xf1\xfb\xfe\xeb\xfb\xee\xfd\xf6\x39\xb7\xd1\xa8\xbb\x89\x06\x4b\x9c\x61\x00\x8e\x11\x5c\x14\x2e\x49\xcf\x03\x83\x00\x86\x70\x00\x8e\xc2\x63\xf0\x07\x82\xbe\x0e\x67\xe1\xd0\xb4\xe4\xea\x10\xaf\xe2\x99\x80\xde\x99\xc0\x87\x6e\xac\x83\x0a\x3a\x7c\x68\x4a\xab\xb0\xb9\xef\x73\x37\x26\x90\xdf\x98\xc0\x87\xac\x09\x5c\xe4\xb9\x91\x75\x58\x99\xee\x5d\x87\xed\x5b\xd2\xae\xad\x4f\x9c\xb5\x26\xb0\x9b\x73\x38\x1c\xda\xaa\x21\xda\xba\x12\x5f\x3b\xd6\xe1\xf6\xff\xe9\xe8\xbb\xa6\xe7\x7f\xf7\x8d\x09\x3c\xb8\x31\x81\xdd\x9c\xa9\x6a\x02\x8f\x4c\xe5\xc7\x6f\x4c\xe0\x90\x35\x81\x4f\x4f\xdf\x5f\xdf\x98\xc0\xe7\xac\x09\x7c\x7e\xfa\xb9\xef\xdc\x80\xc4\x43\xf9\x28\xff\x5a\x5f\x87\x63\x5c\xeb\x7c\xd4\x9a\xc0\xbd\xfc\x4b\x7d\x14\xee\x9d\x7e\xa9\x54\x4a\xf7\x3d\xbf\xd1\x5d\x4c\x2b\x90\xb7\x5c\x76\x31\xf0\xc7\xc2\x52\xc3\x4d\xbc\x70\x1e\x2e\xc3\xd5\x38\x4d\xb9\x0b\x58\xe1\xf4\x54\x43\x91\xb7\x2d\xe0\x85\x90\x61\xe2\x1b\x34\x15\xfe\xe2\x4f\x8b\x29\x71\x2c\x9a\x02\x2f\x34\x0b\xfb\xbd\x94\xc4\x7b\x30\x74\x78\xe9\xb4\x87\x7d\xcc\x1b\x13\x54\x39\x88\x09\xf3\xf4\x22\xe7\xf8\x16\x06\x63\xa1\x9f\x68\x29\xb1\xd1\x9c\x16\xa9\x25\x6b\x5a\x72\x42\x8e\xa4\x3f\xce\x69\xa1\xa2\x1c\x8b\xb6\x0d\xe7\x99\x63\x4a\x72\x64\xa9\x97\x08\x25\x58\xc1\x18\xcb\x94\xd7\x11\x4a\x02\x36\x91\x82\x98\x75\x5b\x38\x63\x8a\xb2\x76\x3b\xd2\x18\xbe\xdc\xb1\x0c\x53\xa5\x61\x29\x62\xba\xa6\x62\xac\x68\x22\xb3\x70\x98\xcb\x31\xf3\x11\xbd\xc9\x2b\xdd\x58\x44\xab\x7b\xc6\x3b\xfe\xc1\x0e\x65\xc6\xb2\xe5\xb9\x98\x03\x1e\x28\x41\x88\xef\x75\xf5\xb9\x48\x66\x98\x62\x01\x3b\xd5\x72\x81\x31\x99\xcd\x50\x3b\xea\xf6\x86\x31\x0b\x1d\xfa\x0d\x7e\xd0\x0c\xc3\x02\x0e\xdf\xcb\xca\xcd\x19\x87\x55\x1a\x33\x92\xc1\x79\xb3\xb0\xac\x69\x4c\xee\x9c\x3f\x7f\xbe\x1b\x6f\xdf\xb1\x3d\xe6\x75\x11\xaf\x0b\xdb\xbf\x4a\xf3\x91\x65\x25\x36\x2d\xe7\xa4\x3a\x7e\xbc\xc3\x0a\xe5\xea\xe2\x25\x26\x73\x3c\xc9\xe5\x1f\xfc\xdb\x7f\x7d\x9e\xc3\xe3\x2e\xab\xd1\xec\xb9\x8b\x77\x77\x3f\x23\x14\x5e\xc4\xb2\x46\xca\x97\xbf\x7a\xea\x33\x37\xff\xe2\x37\x4b\x4e\xb3\xec\x27\x13\x81\x4a\x22\x67\xa6\xba\x9b\xcd\x30\xea\x77\x2f\x75\xbb\x0f\xbc\xe7\xfe\x0e\x47\x75\xed\x0a\x6b\x6b\x35\x26\x30\x03\x4b\x92\x94\xac\x51\xaa\xf0\x29\xe1\x67\x52\x93\xcf\x87\x26\xec\x84\x0f\xc0\x41\x98\xc0\x83\x9d\x09\x8c\x39\x6b\xfc\x83\x30\xe6\xa3\x24\xdc\x92\x2a\x5b\xd2\xb9\x2d\xe9\x5d\x5b\xd2\xfd\x53\xa9\xbb\xe8\x2a\xe1\x12\xa7\x04\x1e\xb4\x85\x64\x35\xe3\xed\x95\x52\x8e\x5f\xde\x43\xc6\x10\x14\x1e\xb8\x09\xfe\xa5\xa9\x4c\x93\x67\x9c\xd3\x00\x6e\x73\xba\x89\x7b\x86\x58\x49\x06\x98\xd7\xa8\x0e\x70\x50\x4d\x9b\x2d\xf5\xc7\x42\xaf\x32\x2b\x21\x2c\x21\x57\x0f\x85\x8f\x63\xdb\x24\xcc\x22\xca\x8f\x32\x98\xa8\x8a\xc4\x4a\xb5\x9a\x69\x5b\xcd\xd9\x59\x67\x7c\x2d\x5a\x9c\x5b\x89\x75\x4b\xaf\xef\xaa\xf7\x58\x73\xbe\xeb\x3b\x3e\x31\xe7\xfb\xc3\x68\xb6\x22\x69\x96\x29\x61\x42\x08\xd6\xcc\x5a\xb5\xac\x63\x1f\x6b\x51\x14\x6a\x82\x88\x55\xec\x6a\x58\x41\x0a\x2e\xea\x12\xa5\xaa\x16\x3f\x20\xaa\xcb\x65\x49\x94\x04\x09\x99\x3a\x2b\xe9\x58\x37\x5d\xdd\xf0\xc2\x0f\xb7\x54\x4d\x0d\x0a\xa1\xc7\x66\x82\x72\xa1\xf0\xf5\x6d\xcf\x1c\x59\x9e\xbb\x34\xe7\x60\x77\x77\x69\x36\x3f\x3f\xd3\xf4\xdd\x4a\xa1\xd8\x5b\x68\xf9\x7b\x0e\x6b\xaa\x24\x4a\x12\xd5\x64\xc9\xb2\x32\x99\x8c\xa5\xb8\xd8\x29\x15\xf2\xa6\x24\x21\xac\xea\xa1\x8e\xb1\xa6\x10\x37\xa3\xeb\x81\x1f\xe8\x87\x9e\xe5\x6b\x0e\xbe\xf5\x4b\xd2\x6e\x58\x85\x00\x8a\x30\x84\x2b\x30\x82\x75\x20\x70\x94\xcf\xeb\x21\xef\x35\x92\x16\x7b\xc1\x8d\x75\xf0\xa0\xcf\x21\x61\xc9\x2f\xd6\x87\x21\x9f\xd7\x47\xad\x09\xac\xa5\x96\x86\x50\x51\x0c\xc9\x1f\x26\x7e\x73\x6a\x90\xd6\x8d\x29\x7c\xa0\xbe\x89\x8a\xe2\xbc\x30\xc1\x28\x99\x7c\x43\xce\xdf\x5f\xc1\x8a\xdf\x98\x36\xc9\xc2\xe9\x44\x1c\x0b\x83\xd1\x66\x58\x9d\x87\x5b\x85\x9f\x74\x2e\x5c\xb8\xd0\xa1\xbe\x45\x76\x7f\xf4\x23\x1f\xdd\x5d\x58\x1d\x6f\x0b\x0e\xbd\x7e\x33\x13\x58\xae\xa3\xca\x58\xb8\xff\xf8\x1f\x1c\x97\x44\x41\xce\xf4\x17\xdb\xc1\xdd\x7f\x7c\xf7\xdc\x91\x9a\xe6\x49\xa2\x88\x15\xbf\x12\x28\x8c\x30\x65\xfb\xe7\x0e\x75\xae\xdc\x7b\xb5\x2f\x0b\xa2\x44\x0c\xcf\x20\x2b\x8f\xbe\xef\xfd\xe3\xda\xda\xa1\x43\xb5\x81\x22\x21\x2a\x21\xcd\x32\x65\x05\xcb\xa6\x2c\x98\x71\xc6\x40\xfb\x82\x95\x5a\x41\x09\xb3\x61\x4d\x91\x15\x1a\x38\x86\x84\x91\x28\x2b\x8a\xca\x8c\x82\x41\x69\x26\x93\xa1\x15\x53\x93\x14\x55\xa0\x86\xaa\xf2\x57\xea\x79\x81\xd9\x50\xb3\x86\x46\x29\x52\x14\x51\x14\x24\x90\xa1\x25\x7e\x42\xf8\x27\x79\x1b\x68\x10\x42\x13\xf6\xf1\x35\x7d\xa5\xd3\x5d\x14\xc6\x62\x63\x64\x48\x75\x1c\x84\x68\xb8\xc4\x19\x9a\x9a\xd3\x3a\x37\x81\x97\x30\xf0\x0c\x98\x18\xe2\x20\x79\x32\x81\xd2\x16\x3a\x53\x9a\x28\xe1\xb7\x33\xb6\x28\x61\x3d\x63\x89\x37\xbf\x2d\xca\x8e\x50\x60\x9a\x8a\x5b\xc7\x8f\x1e\x0e\x8e\xfc\xf6\x39\xd9\xb2\x75\x69\xf7\x43\x7d\x67\x66\xa6\xf1\x85\xfc\x70\x65\x57\x43\xc6\x9a\x26\x48\x12\xce\x96\x45\xc9\x3a\xf1\x7b\xe7\xf2\x0a\x95\x4b\x6b\x79\xf1\x7f\x13\x83\x42\x99\xa9\x5e\xa6\xf0\x1f\x72\x3d\xeb\xf7\x94\x20\x9b\x63\x6e\xb5\xb9\xd0\x19\x9c\xb5\x15\xd3\x76\x48\x70\x47\x2b\x92\xf3\x8d\x8e\x53\xaf\x15\x19\x26\x84\xa9\x51\x6f\xa1\x4e\xa8\x27\x74\xaf\x2d\x7c\x56\x96\x15\x6f\x3e\xcb\xd7\x3d\x7a\xeb\x75\xf1\x51\x51\x02\x9d\xb7\xba\x38\x09\xd7\xe0\x0b\xf0\x97\x40\x61\x1d\xee\x85\x28\x8d\xc5\xf3\xf2\x0e\xbf\x3f\xe6\x3e\xea\x58\x92\x2a\x38\xb1\x66\x42\x25\xd5\xbe\x9c\x33\xbc\x37\xcd\xc9\x57\x37\x33\xf5\x1c\x1b\x65\xf0\x89\xda\x18\xd6\x39\xb6\x2e\x8d\xa5\xf6\xe3\xb4\x15\x0d\x47\x53\x55\xd2\x84\x9d\x32\x05\xa5\x06\x1c\x04\xc5\xa9\x4e\xb8\x47\xc3\x91\x7b\x6d\xa9\xd9\x4f\x13\x3c\xff\x52\x64\x62\xf0\x76\x29\x69\xa6\xa6\xcf\x21\x80\xc3\x06\xe7\xf4\x16\x57\xbd\x59\x1f\xd9\x8e\xae\x7b\xf3\xb5\xf0\x43\x84\x29\x0a\x42\x59\x0f\xbd\xe0\x35\x34\xb3\x52\x2e\x10\x36\xa2\x9e\xe7\x13\x89\x92\x7c\xb1\x40\x49\xe8\xa8\x88\x5a\x8e\xff\x73\x3f\xd0\x15\x44\x58\x71\xd6\x8f\xf7\xec\xd9\x13\xe7\xb3\xfd\xe1\x72\xb1\xb8\xec\x7b\x92\x70\x27\xf5\x4b\xf1\x91\x98\x2a\x58\x25\x56\x2e\x5f\xf4\x4b\x83\x25\xa2\x48\xc4\xb2\x6c\x82\x0c\xd3\x44\xc5\x65\x3f\xd3\x2a\xfa\x88\x66\x67\xe3\xd9\x13\xb3\x66\xe0\x85\x26\x91\x24\x01\x11\xd7\xb1\x50\xc6\x43\x02\x22\x4c\x77\xcc\x9c\x46\x34\x64\xeb\x02\x21\x94\xe8\xc4\x9c\x99\x99\x31\xa9\x22\x89\x28\x93\x5c\x2b\x5e\x99\x0f\x10\xbd\x72\x07\x32\x1d\x8f\x58\xcd\x56\xd3\x42\x82\x68\xf8\xde\x68\x27\xc5\x94\x7a\xbe\x47\x88\xe1\x55\xe7\x48\xbe\x18\x13\x33\x97\xcd\x0a\xe5\xaa\x8f\x64\x33\xb2\xf4\x16\xc7\x85\x97\x29\xc2\x18\x21\x2f\x13\x9b\xc4\xa2\xc8\x6f\x77\xfb\x99\xe2\xd2\x7c\xcd\xcc\x22\xbf\x66\x0e\xcd\x72\xa8\x10\x7f\xb9\x38\xfe\xa0\x16\x2f\x78\xb1\xec\x21\x2f\x8c\x28\x29\x15\x03\x9a\xfd\x22\xf2\xc2\x0c\xf1\xd4\x6c\x3e\x39\x93\xe2\xd3\xc6\xe2\x30\x13\xef\x18\x2e\x98\xbe\xe1\xcb\x61\x26\x42\xd4\xf3\x3c\x22\x8b\x02\x42\x41\xb9\x46\x5b\x77\x9c\xb8\xa3\xe5\xb7\xe6\xdb\xd9\xe2\xce\x9d\xe3\x22\x89\xb2\x19\xc2\xbf\x20\xf1\x3d\x8f\x9a\x05\x47\xa2\x66\xab\xbf\xb3\x76\xf1\x0b\x63\x24\xaa\x2a\x42\xc8\x36\x49\x3e\xd0\x91\x04\x2a\x68\xb7\x5e\x10\x3f\x23\xfe\xbf\xbc\xb8\x62\x0e\x76\xc2\x29\x78\x0f\xfc\x0e\xfc\x2d\x7c\x6c\x1d\x5e\x85\x9f\x6c\xfa\xe1\xaf\x42\x00\xaf\x42\x03\x5e\x85\x21\xbc\x0a\x07\xe0\x55\x38\x03\xaf\xc2\x35\x78\x15\x9e\x80\x57\xe1\x39\x78\x15\x5e\x86\x57\xe1\x75\x78\x15\xde\x84\x57\xe1\x6d\x78\x75\xd3\x0f\x7f\x15\x7e\x06\xaf\x72\x0c\xec\x69\xf8\x09\xbc\xca\xd5\xdc\x4f\xac\x09\x9c\xd9\x48\x5f\x2f\x6c\xac\xc3\xdd\xff\xd3\x9e\x3f\xdf\x80\x09\xfc\xb0\xd3\x5d\xe4\x9e\x38\x6f\x95\x84\xe3\xc4\xb6\x4e\x89\x26\xda\x22\xc7\x09\xf6\x62\x71\xc4\x5b\xf4\x24\xa6\xb8\x17\x70\x00\x8b\x60\x08\xa3\x60\x93\xb1\x70\x93\x4f\x96\xb3\xa5\xa4\x0c\x59\x61\xca\xfd\xc2\xa1\x59\x89\xdf\x95\x9e\x76\x2c\xf4\x07\xfd\x64\xb9\x4b\x46\x7b\xca\x0c\x57\x35\xd2\x4f\x70\x12\x20\x0e\x43\x34\x36\x2f\x23\xf1\x75\x70\x3a\xf4\x3b\xc2\xa6\xa6\xad\x34\x36\x2b\x0e\xc7\xd3\x26\x6a\xbd\x94\x42\x22\x18\x8b\xb1\xf0\x4c\x50\xc9\x47\xd4\xae\x97\xb3\x9f\xc7\x8a\x2a\x52\xa2\xd2\x60\xa6\x56\xb1\xc3\xf9\x85\xf9\x80\xd7\x4a\xd3\x30\x08\xa8\x89\x98\xee\xc8\xd4\xb1\x1c\x8a\x05\x11\x87\x3e\xad\x35\x6b\xcf\x53\x93\xda\xb3\xdd\xc5\x20\x19\x4e\x3c\xe4\x6e\x77\x3a\xad\x9b\x97\xe2\xc4\x4c\xb0\x98\x49\x71\xe8\x61\x4a\xa9\xad\x49\xb2\x23\x53\x6a\x65\x7c\x4c\xb3\xf9\x1c\x33\xac\x4c\x26\x0e\x96\xcf\x56\xf2\x91\x67\xd3\x72\x73\x2e\x58\x38\x11\x24\x03\x0a\x53\x42\x39\x2c\xb1\x5e\x2b\xbd\x92\xb8\xd4\xb4\xde\x1d\xe6\x47\x27\x28\x67\x25\xa1\x61\xbe\x1a\x04\xbd\xd1\xb8\x3c\x47\x5b\xa1\x5d\x2a\xe6\x28\x75\xa9\x84\x55\x5b\x46\x0a\xa6\x8a\x44\x10\x0d\x29\xd2\x33\x31\xa5\x71\xb1\xe0\xe2\xc3\x54\xf1\x42\x8c\x05\xc9\xbc\x42\x1d\xdb\xa6\xd4\xc1\xaa\x97\xa1\x82\xe6\xfc\x3d\x75\x6c\x87\x6a\xaa\x84\xe7\xb1\x69\x90\x02\xa6\x86\x9d\x4c\x1e\x8a\xc3\x6e\x39\x20\xaa\xa3\x95\x57\x43\x4b\xd7\x30\x2d\x56\x8a\xdc\x0c\xb4\x63\x6a\x0a\x07\x0b\x3b\x9f\x78\xfc\x89\x9d\xc6\xf2\x53\xdb\x30\xb3\x43\x6b\xe1\xdd\x0b\x3b\x3f\xf2\xe1\x27\xef\xdd\xf6\xf0\xf2\x9e\x0f\x7f\xe0\x09\xce\x3b\x71\x5f\x98\x0f\x69\x66\xa1\x7c\xe2\xcc\x99\xa6\x5d\xca\x98\x74\xbc\x80\x89\x8a\x50\xb2\x76\xcc\x5f\xba\x7c\x6f\x0f\x89\x92\x9a\x6b\x1e\x5a\x3b\xd4\x0c\x9a\xc5\x00\xef\x58\xc8\xed\x5c\xdd\x5b\x0e\xe6\x9a\x65\x1a\xcc\xe6\x34\x1a\xd3\x6c\x80\xa9\xa6\x04\x0e\xdd\xfb\xc2\x0b\x2f\xec\xc5\x96\x1b\x50\xab\x52\x2e\xdb\x0e\x9d\x52\x3e\xca\x02\xcd\x6d\xfa\x92\x9f\x16\x0b\xa2\x0c\x39\x98\x81\xbb\xe1\x37\x78\x74\xe0\x25\x68\xf1\xf5\xbc\x65\x4d\xe0\xf2\x46\xca\x9c\xc9\xa1\x52\x7c\xbd\xde\xcc\x72\x73\x1c\x85\x34\x68\x54\x46\x9b\xfd\x13\x62\xb1\x17\x6e\x17\x52\x50\xb4\x50\x69\x70\x23\x89\xa7\xc3\xb8\xe6\xec\x0d\xa7\x1f\xef\x73\xb2\x63\xac\x04\x86\x9c\x68\xf4\x20\x0d\x0b\x84\x86\x50\xe5\x81\xa3\x4e\xda\xd7\x8a\x23\x5d\x7b\xb1\x78\x37\xf6\x1c\x0d\x33\x8b\xc5\x47\x4e\x9d\x9b\x65\xa1\x67\xe3\xda\x81\xfd\xbb\xe3\x5a\x83\x91\x5f\x30\x5b\x13\x30\x2e\x96\x33\xac\x29\xd7\x0e\xec\x58\x60\x4c\xd1\x42\x27\x3e\x72\xe2\x44\xcd\xb4\x93\x81\x96\x98\xaf\x4e\x77\x5b\x84\x45\x09\x53\x27\x60\x2c\xf4\x1d\x9c\x12\x0b\x86\x71\xe5\x29\x6a\x5a\x58\x0f\x99\xac\x39\x99\xc8\x95\xe7\x6a\xd5\xb5\x1a\x4f\x42\xb2\xa6\x7e\x7b\xf7\xa1\xfb\x2e\xc4\x16\x93\x25\xea\x44\xf5\x5a\x3d\x72\x6a\xf5\x9a\x13\xd5\xcb\x45\x61\x89\x53\x00\x76\xef\xd9\x11\xd7\x1c\x01\xf3\xb8\x00\xd6\x98\xe7\x14\x8e\x1c\x3f\x31\x48\x4e\xc9\x2b\x9e\xd9\x4b\xb8\xd2\xdf\x55\x8b\x77\xad\xae\x44\xb5\x82\x86\x59\x35\xb1\xc1\x55\x39\x5c\xeb\xe2\x94\xc2\xd5\xa6\xbc\x10\xc0\xc8\x95\x18\xd3\xb1\x10\xcd\x36\x6b\x0e\xb3\x74\xcf\x56\x04\x59\xb7\x32\xdb\x75\x6a\xea\x51\xb7\xdb\x89\x74\xb9\x83\x25\x67\x7e\xf6\xbd\xd1\x52\xbf\xed\x44\x9d\x85\x96\x63\x3a\x26\x61\x24\xf9\x0d\x35\xa0\xb7\xbe\x28\xfe\x8a\xf8\x0b\xa0\x10\xc0\x0c\x8c\xe0\x38\xdc\x03\x0f\xc3\x1b\xf0\x53\x41\x5b\x87\x63\xbc\x7a\x64\x1d\x4e\xc0\x3d\xfc\xf5\xa7\x70\x63\x0a\xe0\xb9\x01\x3f\xe5\x9a\xe9\x84\x35\x81\xaf\xf2\xce\x73\x27\xe0\xab\x7c\xcb\x3d\xd6\x04\x8a\x37\xd6\x61\x11\xee\x81\x13\xd3\xc2\xab\x9d\x7c\x5f\xe2\x31\xa6\x12\xd7\x9d\xc7\x20\x80\x63\xd0\x80\x63\x30\x84\x63\x70\x00\x8e\xc1\x19\x38\x06\xd7\xe0\x18\x3c\x01\xc7\xe0\x39\x38\x06\x2f\xc3\x31\x78\x1d\x8e\xc1\x9b\x70\x0c\xde\x86\x63\x9b\xba\xf3\x18\xfc\x0c\x8e\xf1\x18\x66\x72\xf5\x7b\x37\xd2\x6b\xde\x3f\x45\xa0\x3e\xb0\x31\x81\x1b\x56\xea\x65\x26\xaf\x8f\x4f\xb7\xbf\x74\x23\xe5\xe9\x49\xbc\xcb\x9f\xf2\x96\x37\xeb\xf0\xdd\xe9\x3d\xa6\xf5\x2c\x7f\xba\x31\x81\xa2\x35\x81\x9f\x4c\x8f\xf8\x9b\x94\x73\x8d\x5b\x16\x4d\x4e\x27\x21\x35\xa7\xd9\xda\xa5\x46\x13\x7b\x61\x2c\x4d\x61\xd7\xa3\x14\xeb\xb3\x94\xb8\x86\x1d\x21\xb1\x12\x30\x8f\x9f\x8c\x85\x91\xc2\x95\xee\x60\x69\x88\x3c\xbc\xd5\xdf\x63\x2c\x85\x2e\x37\x2e\xc2\xa5\xc4\x74\xe0\x66\x6b\x9e\xd3\x53\x08\xcd\x4a\x5b\x4c\xf4\xeb\x74\x56\xa4\xe5\x30\x82\x87\xfd\x38\x2d\x72\x9d\x72\x16\x54\xf0\xc8\x73\x42\x8f\x1b\x6e\x8d\x0a\x56\x12\x5d\xcc\xfd\x4c\x91\x4f\xb0\xb1\xd4\x1f\xf6\xc2\xc1\x34\x4d\xd5\x1b\x8e\xc4\xf3\xc1\x7c\x18\x64\xe9\x7d\xd8\xd4\xc9\xaf\x3b\x16\xa6\x41\x96\xba\x3f\xa6\x14\xfb\xb9\x92\xcd\x89\xc8\xb2\xe5\xfa\xa1\x70\x86\x5a\x8d\x5a\x89\xca\x94\xb6\x82\x7f\xb2\x1d\xaa\x60\x44\x9b\xf3\xe5\x23\x6b\xbb\x82\xed\xc7\x9e\xaa\x50\xc7\x11\xee\xae\x85\x34\x97\xcb\xd1\xc0\xc2\x32\xb5\xe6\x3a\x8b\xc1\x7c\x39\xa0\xf3\xb2\x24\x44\x89\xee\x95\x30\x0e\xe6\x43\xa4\xa8\x3a\x2d\xef\x5c\x6c\xd0\x3c\xb1\x2a\xf6\xc2\x53\x7b\x2d\xd7\x30\x28\x55\x65\xae\x4c\x12\xc5\x99\x5c\xb4\xbc\xf7\x97\x25\x2a\xe8\xf5\xa6\x3d\x3b\x5b\xa3\x32\x0d\xb6\xef\x3d\x50\xb6\xf3\x99\x90\x62\x1b\x5b\xf9\xa0\x56\x6b\xe5\xcb\x27\xca\x54\xa4\xba\x1d\x7a\x0e\x2d\xdf\x51\x8e\xa8\x49\x69\x9d\x9a\x89\xd6\xcc\x52\xc7\x0b\xed\xb0\x10\x50\xf9\x17\xb4\x4e\x6d\x3e\xa3\x31\x46\x76\xce\x23\xdb\x95\x00\x5b\x61\xde\xa2\x01\x0d\xb3\xb4\x40\x73\xc5\xb2\xd5\x3c\x7f\xe6\x70\x80\x24\xa3\x5a\x36\xf6\xec\x2d\x9f\x28\x87\xf3\x7b\xcb\x1d\x1e\xa0\xa3\xa5\x5a\xdd\xb6\x72\x36\xc2\xc2\x01\xba\xb4\xba\x2f\x6f\x96\xc7\x2b\xdb\x96\xed\x7c\x26\xa0\xe1\x60\xdb\x20\xa0\x01\xd5\x98\x86\xcc\x72\x37\x5f\x5e\x5b\x3b\x58\x5e\xc8\x50\x9a\xcb\xe7\x28\xb6\x3c\x3f\xf9\x5a\xa3\x47\x1e\x79\x64\x5b\x79\xcf\xae\x1d\x79\x73\xfe\xb9\x9b\xff\xed\xb9\xe6\xe9\xe3\x07\x02\x24\x12\x8b\xd6\x69\x90\xa7\x98\x9a\x41\x96\xce\x5f\xbc\x70\xb6\x69\xb7\x67\x0b\x41\xf0\x2c\x4a\x14\x3e\x7f\x28\x0e\x05\x05\xc8\xad\xc7\xc4\x39\x11\x83\xc9\xfb\xc6\x2e\xc1\x3e\x78\x1c\xbe\x03\xcf\xac\x03\x82\xaf\x6c\x5a\x1b\x08\x02\x40\xd0\x00\x04\x43\x40\x70\x00\x10\x9c\x01\x04\xd7\x00\xc1\x13\x80\xe0\x39\x40\xf0\x32\x20\x78\x1d\x10\xbc\x09\x08\xde\x06\xb4\x39\x63\x10\xfc\x0c\x10\xb7\x36\x2c\xf8\x0a\x20\x3e\xe2\x91\x35\x81\x5f\xd9\x80\x75\x78\x0f\x7c\x84\x6b\xec\x8f\x58\x13\xd0\x37\xd2\xd7\x6b\x1b\x13\xb8\x72\x23\x39\xa0\xbb\x58\x6f\x60\x8e\xbf\xe6\xe4\x98\xa3\x0a\x6e\xa6\xf5\x08\xc9\x9b\xcd\xf2\x82\x51\xd8\x6f\x0b\x23\x6e\x98\x2c\x35\x2a\x78\xe4\x73\x83\xb9\x31\x45\xa9\x36\xa7\xb5\x06\x62\xca\xae\x39\xd8\x84\xb7\x72\xc0\xdc\x58\xe4\x4d\x05\x45\xcc\xb1\x10\x98\xa7\x52\x39\x4e\x3b\x16\x53\x82\x96\x5e\x2c\x86\x29\x48\x4a\x48\xcb\x19\xc4\xe1\x20\xb5\xa8\xf9\xc9\x05\xc3\xd2\x24\xd5\x5f\x1a\x2c\xf9\xd4\xa7\xc3\x0f\xfe\x7d\x29\x2b\x32\xb4\xeb\x95\xcb\x41\x93\x76\xef\xbd\x78\xaa\x64\x49\xc4\xf9\x96\x91\xa7\x9e\x5d\x20\xaa\x24\x22\xc7\x77\x0e\x5a\xc5\x38\x4b\x91\xac\x7b\x94\x66\x7c\xe3\xa3\x83\x61\x84\x11\x2a\x34\x66\xac\xd2\xea\x78\x85\x67\x72\x68\x5c\xad\x59\xa5\x65\x9e\x0a\xad\x1f\x39\x72\xa4\x9e\xd8\x18\xc8\xda\x7d\xf4\xc4\x9f\xe6\x0a\xae\x41\x91\x28\x4b\x7e\x36\x2a\xe6\x4a\x27\xe6\x0c\x3f\x43\xad\x5a\x35\xe6\x6c\xf8\x18\x63\x89\xfa\xfe\x9c\xdf\xbd\x70\xf2\x70\xc9\xd2\x25\x29\x38\x36\x47\x6c\x9d\xa1\xdc\x78\xd7\xf8\x1f\x90\x1e\x15\x48\x62\x5c\x04\x79\xdf\x38\x93\x5b\x3b\x7a\xb4\x74\xe6\x98\x4f\x9b\x3e\xc5\xa5\xed\x73\xb9\xe5\xed\x2b\xfb\xf3\xd4\x36\x0b\x48\xa2\x06\x26\x94\xca\x07\x55\x2c\x51\xab\x98\xf3\x30\x12\x54\xeb\x48\xee\x8e\x2b\xef\xee\xfa\xf5\xd8\x47\xd4\x90\x98\x45\x6d\xcb\xa2\x94\x48\x08\xd1\xb9\x12\xc9\xe6\x32\x54\xa3\x1a\xc9\xe6\xb2\xb4\xdb\x77\x55\xe2\x0f\xb6\x2d\xe7\x30\x12\x45\x5a\xe7\x4d\x10\x2d\x57\xd7\xa9\x24\xe9\x16\x52\x09\xb6\xaa\xa5\x0c\x2e\xb5\x7d\xaa\x37\xb6\x95\x72\x2b\x3b\x77\x95\x86\x1f\x1c\x22\x99\x98\x88\x50\xc9\x02\xc0\x30\xbe\xf5\xac\xf0\x25\x49\x06\x15\x4c\x88\x61\x1e\xee\x84\xdf\x81\xd5\x75\x58\x81\x97\xa6\x74\xad\x2f\xc1\xca\xb4\x04\x77\x53\x0a\xa7\x12\x4c\xe0\xd3\x9d\x75\xf8\x02\xcc\xf3\x43\x17\x60\x1e\xbe\xc0\xa3\x2a\x88\x57\xed\x8f\x5c\x7f\x2c\x0d\x24\x43\x48\x93\x91\xa9\x4a\xe3\xb4\xae\x3c\xe4\x3c\x48\x3d\xa8\xc0\x09\x47\x83\xd4\x0c\xe0\x4e\x3a\x77\x5c\xab\x53\xfd\xc6\x89\xa0\x92\xcf\xc4\x52\x98\xb8\x79\x1e\x56\x3c\x43\xac\x06\x86\x98\x78\x76\x8a\x6f\x08\x7e\xe2\xdb\x26\x8e\x98\x38\x1c\x2d\xb5\xa5\x54\x2b\x06\x86\x20\x80\x19\x67\x5c\xe4\xd5\xe8\x5e\x64\xe8\xda\x8f\x8a\xa1\xed\xd9\xc4\x66\xba\xf2\x27\x84\x29\x18\x11\x8f\x70\x87\xcc\x6c\xd4\xf2\xc8\x8b\x43\x0b\xd1\x32\xd9\xab\x23\x41\x44\xc8\x0d\x23\x42\x54\xa4\x12\x6f\xbe\x48\x5c\x22\x12\x14\xe5\xf3\x24\x47\xb0\x69\x91\x28\x74\x11\x12\x91\x6e\x9a\xd9\xd0\x27\x36\x41\xd4\x24\x44\xf1\x72\x04\x49\x48\x44\xc4\x46\x98\x62\x64\x36\x1b\x65\x82\x34\x11\x13\xdb\x77\x24\x37\x97\xe9\x8e\xf6\x2f\xc4\xb6\xa4\x16\x90\xa4\xb8\x1e\xc5\x44\x38\x31\x83\xb0\xc2\x88\xa0\x77\xee\xbd\xff\xc1\x87\x1e\x1e\x16\xe7\xbd\x03\xcf\x3f\xf7\xcc\x4b\xba\x17\x11\x62\x50\xdd\x71\xd0\x83\x48\x61\xa1\x47\x2a\xf3\x8b\x99\x8f\xdf\xfc\xc5\xc7\x73\x7f\x6c\x10\xee\x7a\x49\xd2\xf4\x1e\x3d\xcf\x5b\xe8\xf6\xb2\xa6\xa5\x0a\x39\x2f\x1f\x84\x26\x22\x26\x21\x51\x36\x22\x48\x75\x42\x42\xcb\x84\x44\x9e\x6e\xea\x48\x42\xc4\x32\x2d\xf2\xa5\xcd\x2f\xcd\xbf\x00\xbf\x7e\xef\xea\xb5\x7b\xaf\x5e\xeb\xd5\x8e\xef\x5b\xf0\xd4\xb8\x09\x14\xb4\x9b\x5f\x11\x2b\xc2\x7f\x05\x1d\x7c\xc8\x41\x0c\x7b\xe0\x04\x5c\x81\x27\xe1\x69\xf8\xff\x09\x26\x28\x30\x11\xcc\x29\x43\x03\x07\xb0\xa5\x55\x9f\x3c\x1d\x38\x52\xc6\xd2\x68\xa0\x08\x86\xe0\xa7\xf4\x0a\x5b\xb9\x42\x65\x5a\xf6\x19\xe2\x54\xa7\x4c\xdb\x62\x8d\xda\x89\xce\xe0\x71\xdb\xc1\x94\xc1\x29\x59\xe9\x9a\x4b\x69\x37\x8b\x30\x16\x9a\x4a\xb8\xd4\x18\x71\x4d\x21\xe0\x44\x33\x54\x97\x1a\xd5\xd4\x47\x4f\x2e\xc1\xbb\x79\x49\xbc\x99\x46\xc8\x6d\xcc\x4a\xa3\xc9\x0b\xed\x92\xad\x4b\x6d\x71\x55\xe0\x2d\x34\x84\x2d\x2c\x55\xb5\x2d\xa5\xec\x0d\xbc\xfe\x34\xbd\x3f\x8e\xde\x4c\xd1\xf6\x52\xc8\xfb\xae\x8f\xbe\x46\xcd\xde\x95\x9e\x17\x6a\x85\xed\xdb\x86\x4d\xe4\x99\x82\xe9\xe1\x5f\xec\x31\xf3\x9e\xaa\xea\x37\xff\xd4\x2b\x11\xc9\xce\x99\xbc\x95\x60\x66\xc7\xb0\x85\xbc\x2a\x35\xe3\x42\x6c\x7a\x8d\x4a\x81\x98\x54\xd2\x3f\xe6\xfb\x85\xb5\x98\x08\x9a\x43\x48\xa9\x94\xfb\x3d\x12\x86\x2e\x32\x0b\x81\x41\xb0\x6c\x24\x63\xcc\x9b\x2b\xcc\x1c\x29\xc8\x98\x90\x42\xa5\xe9\x79\x4d\x8f\x65\x8d\x0f\x78\x03\x4f\x45\x12\x41\xba\xed\x91\xb2\x47\x4a\xb4\xb0\x50\xf2\x10\x91\xec\xbc\x69\x66\x02\x8f\x44\x83\xc5\x39\xd3\xd3\x44\x8c\x90\xcc\xf2\xb1\xd7\x59\xec\xba\x12\xed\xbd\x6f\xbb\xd9\x9a\x29\x21\xa6\x2b\x48\x47\xa2\x84\x09\xd2\x24\x2b\x26\xc5\xd8\xcf\xac\xec\x5c\x8d\x51\x36\xb2\x10\x12\x05\x64\xda\xa6\x6d\x9a\x71\x75\x26\x83\x1c\xd7\x45\xd5\x3b\x4e\x9d\xa8\x90\xc0\x51\x50\x3c\xbf\xe8\x79\x33\xb3\x0b\x19\xa4\x33\x2d\x5e\x8b\xff\x89\xba\xc4\xb3\x34\xcf\x23\x02\x71\xae\x99\xd9\x28\x6b\x7a\xdb\x7e\xfd\x01\xe2\x67\xe2\xed\x86\x21\xf8\x5e\xd6\x8b\x87\x4b\xbd\x0c\x71\x98\x8c\x90\x6c\x96\xab\x9e\xa5\x91\xc4\x6f\x20\x96\x9b\xf5\xbc\xee\xd2\xc0\x6c\x36\x3d\x99\x98\x71\xa1\x60\x12\x4d\xf6\x31\x32\x88\x84\x92\xef\xea\x92\x30\x13\x91\x26\xc9\xe4\xf2\xa6\x57\x23\xc4\x8b\x8d\x4c\x26\x63\x9a\x91\x29\x23\x62\xbd\xc8\xb2\x9a\xb7\x48\x24\x12\x06\x2e\x42\x92\xaa\x6a\x36\xf6\x50\x7d\x71\x5b\x26\x5a\xec\x2c\xb8\x8c\x29\x88\xa8\x2c\xcc\xe8\x5e\x48\x0a\xc3\x76\xd3\x24\x84\x10\x6f\xc6\x2b\x48\x1e\xf1\x72\xb5\xcc\xe1\x17\x3f\xf3\xe2\xe1\xe6\xe2\x83\x8f\xbc\x77\x18\x1f\x5c\xdb\x93\xe1\xf7\x93\x31\x24\xe2\x2a\x12\x8b\x10\x21\x04\x91\x62\x29\x87\x88\xcb\x24\x64\x16\x0a\xb1\x89\xcc\xa8\x9a\x7c\xf7\xa8\xb2\xad\xd7\xce\x90\xac\x2d\x9a\x32\x65\x26\x21\x98\xc0\x94\xe7\xea\x4b\xe2\x45\xc9\xe5\x5c\xc2\x6d\xd8\x0d\xcf\xc2\x8f\xe1\xfb\xeb\x30\x81\xef\x71\xa5\x77\x10\xde\xe6\x0b\xeb\xdb\xd6\x04\x9e\xbb\xb1\xce\x8b\x60\x9f\xe3\x6b\x6f\xb2\xa5\xb3\x31\x81\x89\x35\x81\xde\xf4\x75\xb4\x91\x6e\xdf\x99\xd6\xbd\x1e\x84\x00\x0e\x42\x03\x0e\xc2\x10\x0e\xc2\x01\x38\x08\x67\xe0\x20\x5c\x83\x83\xf0\x04\x1c\x84\xe7\xe0\x20\xbc\x0c\x07\xe1\x75\x38\x08\x6f\xf2\x0b\x1d\xdc\x5c\xeb\x0f\xc2\xcf\xe0\x20\x5f\xeb\x7f\x00\xdf\x83\x09\xbf\xde\x0f\x3a\x13\x38\x7c\x63\x02\x07\x79\x25\xec\x3a\x9c\x9e\xde\xc9\x3a\x9c\xd9\xba\xa7\xe7\xac\x09\xfc\xc1\x46\x77\x91\xa7\xed\x78\xca\x2e\x1c\x6f\x72\xac\x2c\x8d\x45\x21\x45\x3f\xa5\x68\x66\x2c\x25\x3f\x75\x62\xb5\xa6\x65\x29\xdc\x06\x48\xa3\x6c\x38\x99\xe0\x05\xa1\x37\x16\x02\x5f\x49\x8b\x5c\x37\x83\x03\x61\xdf\x9f\xd6\x86\xf3\x73\x28\x53\x36\xe2\x91\x1d\xa4\xde\x1a\x8f\x1f\x20\xce\x6e\x94\xf6\xf0\x6b\x0b\x55\x6e\x25\xa7\x6d\x52\x2b\x58\xc1\xfe\xe6\x6a\x30\x18\xc6\xe2\xe8\xdb\x89\xab\x4e\x39\xde\x8f\x29\xc2\xe3\x76\xb9\x98\xa7\xe1\x7c\xa8\x31\xed\xe6\x7f\x8a\xcb\x75\x4f\xc3\xc8\xb3\x35\xc4\x34\xac\x52\x5a\x6f\xd6\xff\x4d\x10\x26\xeb\xb9\x65\x19\xa2\x94\x58\xa0\xf7\xd1\xc0\xb5\xb0\xc9\x59\x07\x88\x86\xcc\xed\x3c\x0b\x97\x2d\x16\x69\x79\x57\x48\x35\xac\x51\xe3\x08\x0f\x5a\x79\xf9\xd9\x8a\xdd\xed\x75\x2d\xaa\x33\x83\x61\x2c\x09\x16\x0d\x3c\x0b\x95\xf7\x6e\x5f\xb4\xed\x5a\xde\xc0\x6e\x68\x33\xc3\x35\x79\x8b\x02\x8a\x69\xbe\x9c\x22\x0e\x15\x99\xe5\xc2\xf2\x6a\x88\x90\x28\x5a\xc9\xd9\xc3\x9a\x5d\xc8\x17\x6c\x17\x63\x89\x04\xbc\xf8\x35\x68\x61\x85\xba\x16\x95\x30\xa5\x54\x40\xf9\x83\xb7\x9f\x6c\xf2\x00\x41\x30\xda\x36\x0c\xec\x00\xeb\xc2\xaf\x87\xdd\xca\xa1\xdf\xf8\x8d\xeb\x87\x4c\xc3\xf3\xd0\xed\xbf\xf5\xf9\xdf\xfa\xd5\xc4\x2a\x58\xfe\xc8\x72\xef\xea\xd5\xab\xfd\x23\x3c\x4b\x54\x59\x1e\x2e\xe5\x83\xac\x6d\xd0\x7a\x98\xdf\xb6\x6d\x39\x6f\x9a\x56\xa5\x52\xb5\xcb\x07\xf7\xed\x08\x2c\x5b\x22\xd4\x30\x54\x5c\x3e\x7a\xfb\xd1\x4a\xfb\xe6\xdf\x20\x49\xd3\xac\xe2\x7c\xbe\x7d\xe2\x8e\x33\x7d\xd9\xcb\x64\x6d\xac\x0a\x98\x51\xab\x79\xd7\xf9\xe3\xdc\x02\xca\x8d\x77\xed\x2b\x87\x33\x54\xe2\xb6\x8e\x71\xea\xab\x5f\xfb\xc6\xf9\xf2\xda\x02\x15\x54\x05\x81\x0a\xe2\xad\xcf\x0a\x4b\xe2\xdf\x81\x0a\x01\x2c\xc1\x5d\x70\x0f\x3c\x04\x1f\x82\xd7\xe0\xdd\xeb\x70\x3f\xbc\xc8\xc7\xfd\xfd\xd6\x04\x1a\xbc\xa6\xfb\x7e\x68\xf0\xd1\xa6\x6d\x49\xe6\x54\x4a\x59\xb0\xf2\x5b\xef\xee\x9f\x66\x12\xef\xde\x3a\xf2\xde\xad\x7d\x8d\x64\x1e\x6d\xc0\x04\x5e\x9b\x56\x61\x8f\xa5\x91\xa4\xa4\x61\x58\x69\xd0\x4e\x46\xa0\x58\xe5\x81\x2f\x43\xf0\x39\xb4\x8e\x87\x60\x47\xa9\x65\x99\x22\x6e\xbd\x46\x93\x37\x25\x68\xf2\x81\xc8\x7d\xab\xde\xb0\x69\x0a\xc1\x58\x6c\xa6\x6c\xd8\x62\x63\x54\xe5\x91\xb4\xc0\x0f\x86\x4b\x8d\xe9\xe2\x23\xf9\xdc\xcd\x6a\x4b\xcd\x41\xda\xa9\xe9\x31\xa6\x32\x67\x61\xb6\x8c\x5f\x2c\xa7\xf4\xea\xb6\x49\x99\xba\xc4\xdb\xb9\x60\x51\xd2\x58\xca\x9f\x16\xc7\xcc\x61\x98\x3a\xc9\xdf\x5d\x16\xc3\x5a\x14\x63\x8d\x61\xec\xfb\x16\x92\x64\xf9\x63\x4c\xa5\xaa\x44\x1c\xe6\xf9\x59\x07\x07\xb9\x42\x6d\x57\x39\xca\x3b\xe6\x55\x9e\xb6\x67\x12\x7e\x4f\x97\xe9\x12\xc6\x4c\xae\x45\xac\xc4\x87\x67\xe0\x9b\xac\x52\xce\x61\x9e\xb7\xc6\x16\x43\xd8\x69\xcd\xb6\x9c\x90\x15\x42\x2c\x69\x41\x24\x7c\xa9\xdb\xbd\x72\xf9\x4a\x97\xe3\xb5\xaf\xfc\xf1\x7e\x84\xd1\xec\xa9\xd3\xa7\x67\x79\xdc\x00\x49\x22\x9e\xbd\x7a\xff\x03\x5d\x2c\x49\xea\xc0\x1a\x3e\xf1\xd8\x03\xb3\x69\x9f\x41\x37\xe3\x60\x09\x21\x62\xeb\x4d\xbd\x7b\xf9\xd2\xf9\x59\xa7\x5a\x0c\x13\x67\xea\x57\xec\x2e\x36\xa2\xdc\x35\x0e\xd8\x66\x95\x66\x6b\x0f\x0e\x73\x79\xe6\x31\x5c\x58\xe8\x16\x9c\x5a\x39\x66\x2c\x93\x2b\x3a\x58\xa4\x0e\x0e\xa3\x00\x5f\xe1\x55\xe5\xfc\xf6\x40\xbd\xf5\xce\xcd\x5f\x08\x03\xf1\x17\xa0\x42\x16\x56\xe1\x5d\x70\x3f\x3c\x06\x1f\x87\xd7\xe1\xef\xd7\x41\x87\x0b\x5c\x4f\x96\x78\x00\x9f\xd7\x64\x5c\x80\x9f\xc3\x85\xcd\x9a\x8c\x0b\x90\x81\x0b\xd0\x82\x0b\xb0\x0c\x17\x38\x19\xc1\x9d\x70\x01\xee\x87\x0b\xf0\x24\x5c\x80\xe7\xe1\x02\xbc\x02\x17\xe0\x0d\xb8\x00\x6f\xc1\x05\xf8\x21\x5c\x48\x55\xe0\xff\x0e\x11\xfc\x1c\xa2\xcd\xb3\x44\x90\x81\x08\x5a\x10\xc1\x32\x44\x70\x08\x22\xb8\x13\x22\xb8\x1f\x22\x78\x12\x22\x78\x1e\x22\x78\x05\x22\x78\x03\x22\x78\x0b\x22\xf8\x21\x44\xbc\xb2\x23\xb2\x26\xb0\xff\xc6\x3a\xbf\x8b\xfd\xd3\x34\xf3\x85\x29\x73\x7b\x34\xed\x66\x70\x0f\x44\xd3\x7d\xf7\x6d\x1d\xf5\xc0\x96\xf4\x48\x72\x3f\xa9\x25\x7c\xa4\xd3\x5d\x54\x7c\x1e\xb6\xad\xb8\x0a\x0e\xd2\x2e\x19\x9c\xd6\x22\x19\x60\x69\xcd\x9f\xa0\x34\x37\xb1\x12\x69\x85\x48\x62\x0a\x35\x70\xb2\x5b\xe1\x4c\x2e\x1c\x2d\x11\x4c\xb7\xf3\x03\x38\xa8\xaf\xc9\x1b\xe6\x27\xc3\x36\xb1\x7f\x52\x0a\x38\x4e\x1d\xec\x73\x1d\x9c\x7c\x74\x4a\x1b\xd7\x68\x36\x46\xbc\x7e\x3b\x94\x9c\x52\xb1\xec\xd4\xb7\x7f\x3c\xd2\x98\x66\x1b\x82\x43\x35\x43\x96\x35\x5b\x42\xb6\x45\x91\x20\x61\xcd\xad\x3a\x3b\x0c\x93\x52\x4d\x73\x1c\x5b\xab\x8d\xe6\x4b\x86\xa3\x2a\xa6\xec\x74\x8f\xc9\x3a\x55\x23\x67\x79\xed\xd4\x82\x56\x54\xb5\xc0\xb3\x65\xa7\x91\x2f\x9a\x9a\x2f\x3b\x92\x97\x45\xb9\xa1\xa6\x65\x32\xbe\xdc\xad\x19\x8a\x20\xeb\x54\x14\xd7\x4c\xcd\xa0\xb2\x84\x14\x55\x92\xed\xc8\xd6\x65\x4d\x91\xf9\x21\x89\xaf\xa2\x21\x24\x63\x59\x16\x64\x4d\x63\x9a\xe6\x66\x4a\xc1\xbf\xab\x23\x89\x39\x1a\x11\xff\x84\x39\x19\x7b\xf8\xde\x47\x1f\x19\xb2\x20\x71\x64\xd6\x7e\xed\xd4\xc2\xf9\x8b\x77\x2f\x3a\xb5\x72\x49\xaf\x6f\xcb\x31\xcd\xc8\x15\x35\x24\x88\xb2\x9c\x5b\x18\x04\xfb\x3e\xf3\xe2\xa7\xf7\x12\x3d\xbf\xfa\xd8\xc3\x0f\xaf\x3c\x3b\x73\x78\x7b\x43\x96\xd4\xb0\xd5\x6a\x85\x9a\x36\xfc\xc8\xaf\x3c\xbf\xaa\x05\x81\xaf\x11\x73\x0d\x89\x32\xd3\xd9\x07\xb5\x42\xa9\xa0\x69\xd9\x42\xdc\xd0\x24\x37\x97\xd7\x10\xd1\x34\xd9\x54\x4f\x5f\x56\x12\xe5\xe8\xf8\xa1\x91\xdc\x30\xff\xaf\x18\x5a\x6e\xd5\xd1\x22\x8f\xca\x00\xe8\xd6\xad\x5b\xbf\x27\x1e\x14\x7f\xc2\x49\x92\x16\xe0\x21\xf8\x2b\xa1\xb0\x0e\x8b\xf0\x83\x4d\x3f\x7d\x11\x02\x58\x84\x06\x2c\xc2\x10\x16\xe1\x00\x2c\xc2\x19\x58\x84\x6b\xb0\x08\x4f\xc0\x22\x3c\x07\x8b\xf0\x32\x2c\xc2\xeb\xb0\x08\x6f\xc2\x22\xbc\x0d\x8b\x9b\x6b\xf7\x22\xfc\x0c\x16\x79\x64\x6b\xd1\x9a\x80\xb0\xb1\x0e\x18\x7e\x00\x8b\x7c\x3c\xfd\x78\x2a\x4d\xe0\xc7\x9d\xb4\x6b\x40\xfe\xc6\x04\x7e\x60\x4d\xa0\xb0\xb1\x0e\xd5\xad\xbd\x8b\x53\x5c\xdf\xc6\x94\x99\x29\x6f\x4d\xe0\xe1\x1b\xeb\xf0\x2d\xc8\xc3\xc3\xe9\x78\xfc\xa3\xce\x04\x36\x3a\x13\xf8\x2b\xde\x01\xec\x8f\x60\x63\xca\xc0\xba\x29\x55\xb7\xa4\xe3\x5b\xd2\xe5\x2d\xe9\x9e\x2d\xe9\xb1\x2d\xe9\xd9\x2d\xe9\xf5\x2d\xe9\x5b\x53\xa9\xbb\x18\xf2\x02\x88\xc4\x8a\xa8\xf3\x68\x55\xaa\x9c\x83\xb1\x28\x28\x53\x5a\x35\x4e\x5e\xc4\x31\x5f\x7c\xf0\x8e\xd2\xf2\xef\x36\x5f\xe6\xfb\xb1\xc0\x9b\xcc\x84\x6d\x89\x87\x77\x97\xda\x9c\x42\xa6\xcd\xe1\xda\x15\x3c\xf2\x38\xe9\xdb\xa8\x9f\xce\xa3\x58\x28\x0a\x7c\xcc\xa7\x80\x8b\x44\x61\x73\xcb\x25\x75\x2c\x9a\xd8\x4b\xdb\x77\xf0\x1e\x05\x5c\xa5\x57\x1a\x03\xbe\x93\x5b\xfe\x83\xc4\xfb\x4c\x1b\x01\x8f\xde\xda\xa3\x11\x6d\xaf\x4a\x55\xe1\xfc\x88\xe4\x32\x36\x89\x32\x11\x21\x26\x45\x37\xb7\x2f\xb9\xb6\x6c\x92\xc8\x33\x10\x73\xac\xbc\x44\x28\x11\x49\x61\x9b\x87\xb0\x2a\x90\x64\x3c\x12\x55\x56\x49\xf1\x50\x6c\xc6\xa5\xaa\x67\xce\x2c\xee\xa8\xe8\x6e\xa9\x50\xf4\x34\x66\xc8\x33\x27\xfb\x44\x4a\x2c\x62\x14\xcf\xde\x83\x34\x93\xb4\x6e\x8b\x75\x12\x7a\xba\x57\xcc\x65\xcd\x1d\x97\x0b\x39\xd3\x33\x29\xf2\x66\xea\x15\x93\x4a\xa6\xef\x05\xa6\x6e\x86\x61\xd6\x23\x58\xd4\x50\x61\x47\xd1\x4c\x2c\xd5\x28\x70\x90\x4e\x14\x49\x44\x66\xb9\x5c\x20\x9a\x44\x10\x32\x34\x9b\x20\xdb\x4e\x37\x23\x51\x52\x68\x3c\xf2\x88\x8e\x30\xc2\xb2\x4c\x08\x69\xeb\x58\xd4\x4c\x9e\x1e\x53\x4d\x47\x7c\xfc\x62\xf3\xc8\x8b\x9f\xfe\xe4\x01\x62\xd9\x81\x39\xbc\x7a\xef\xb5\xd1\x5f\x1f\x78\xed\xf8\xfc\xf9\xf3\xe7\x17\x14\xdf\x9d\x99\x69\x7a\xc4\x77\x0c\x24\x8b\xaa\xd2\x3f\xb3\x68\x6a\x44\xae\xac\xed\x5b\xf6\x0c\xb3\xd1\x6c\x98\xdc\x69\xec\xbf\xab\xe7\x0d\xbc\xea\xee\xdd\xbb\xab\x8a\xb7\x70\xe2\xf8\x89\x85\xfe\xe9\x9e\x99\x09\x7c\xe2\x35\x67\x66\xbc\xe6\xfb\x0f\x34\xb9\x33\xca\x6d\x28\x97\x98\xcd\x99\xba\xa9\x9b\x8d\xd9\x39\x1f\x1b\xa6\x89\x9a\xc7\x66\xb3\xc3\xd1\x30\xc3\x7b\xd1\x33\x46\x92\x67\xa7\x9a\x16\x9d\x39\x77\xd7\xc5\x85\x1d\xbf\xb4\xdf\x2c\x96\xab\xc9\x23\xe3\xee\x0b\xe1\x1c\x35\x32\xcc\xdc\x7a\x46\x00\xf1\x6f\x81\x42\x09\x96\xe1\x3c\x7c\x63\x1d\xd8\x94\x56\x78\x15\xf2\x9b\xeb\x48\x1e\x7e\x0e\xf9\xcd\x15\x20\x0f\x19\x4e\xc7\x98\x87\x65\xc8\xc3\x21\xc8\xc3\x9d\xdc\xe2\xc8\xc3\x93\x90\x87\xe7\x21\x0f\xaf\x40\x1e\xde\x80\x3c\xbc\x05\x79\xf8\x21\xe4\x79\x3d\x2c\x40\x1e\x56\xf9\x40\xc6\xa0\x73\x69\x02\xcc\x9a\x80\xb3\x91\xbe\x26\x76\x4b\x79\xba\x67\x1d\x2a\x5b\xd2\x60\xfa\xb9\x14\x15\x75\x62\x23\x6d\x99\x7e\xd7\x0d\x98\xc0\xf9\xc4\x6e\xa9\xe0\xaa\x21\xf8\x89\xf9\x2a\xa5\xf5\xa1\x42\x10\x4e\xa3\xc8\x83\xc0\x09\xfb\x1e\xf6\x93\x09\x90\xec\x6f\xa7\x08\x26\xde\xbb\x26\xf4\xd2\x26\x1a\x89\x51\x9c\xce\x0c\xb1\xc9\x39\x0c\xfa\x3f\xf2\x67\x3c\x62\xf3\x7c\xec\x89\x5c\xf2\x63\x73\xdc\xb8\xe5\x50\xde\xe4\xdf\x26\x1e\x31\x0c\x8a\x35\x6c\x98\x06\xd2\x3d\x9b\x92\x7c\xc6\x79\x4f\xe2\xbe\x51\xdd\xcb\x39\x14\x9b\x71\x1c\x9b\x7c\xd4\xea\x94\x96\x89\xb7\x12\x47\xba\x97\xf7\x90\x88\x24\x24\x19\x33\x07\x5f\xf8\xd5\x4f\xdf\x66\x56\x6b\x15\xd3\x74\x4c\xc7\x3c\xf1\xc6\x57\x7f\xf7\x4e\xfd\xf7\x6f\x7e\xf5\x5f\x51\x45\x93\x34\x2c\x22\x19\x09\xc2\x7b\xff\xfe\x49\x24\x4a\x86\xb7\xfb\x93\x2f\x7e\xf6\xe0\xec\xc5\x19\x14\xc5\x15\x33\xb1\x22\xcd\x6a\x63\xc6\xbb\x2e\xb4\x5f\xf1\x5a\x1e\xb1\x41\x05\x76\xeb\xbb\x92\x27\xfc\x77\x9e\xc7\xaf\xc0\x08\x0e\xc3\x9d\xb0\x2e\x74\xe0\x0b\xeb\xf0\xb4\x60\x6f\x6a\xd0\xa7\x21\x80\xa7\xa1\x01\x4f\xc3\x10\x9e\x86\x03\xf0\x34\x9c\x81\xa7\xe1\x1a\x3c\x0d\x4f\xc0\xd3\xf0\x1c\x3c\x0d\x2f\xc3\xd3\xf0\x3a\x3c\x0d\x6f\xc2\xd3\xf0\x36\x3c\xbd\xa9\x41\x9f\x86\x9f\xc1\xd3\xdc\xfb\x51\x05\x1b\x9e\x4e\xad\xce\xa9\x04\x13\x41\xe9\x4c\x04\xad\xb3\x2e\x34\xe0\x3e\x3e\x64\xb6\x4d\x13\x1c\x4f\xc2\x7d\x42\x6a\x64\xde\x67\xa5\xe0\xb8\x9d\xd6\x04\x7e\x7b\x63\x22\x34\xac\x89\x10\x6f\x70\x96\xe9\x66\xda\xd1\x6a\xd8\x1b\x0b\x88\x23\x50\x2a\x8d\x0a\x4e\xdc\x92\x5e\xda\x09\x63\xc4\x11\x60\x29\xb2\x35\x25\x9f\xac\x70\x8e\xe0\x30\x96\xfc\x44\xa3\xd5\x79\x59\x18\x07\xdb\x27\x7e\x55\x33\x25\x6c\xe3\x6b\x36\x27\x01\xaa\x34\x13\x4f\x8a\x6b\x25\xdf\xc3\x69\x6e\x36\xad\x15\x4d\x9b\x77\x72\xac\x5a\x93\x23\xdb\xa6\x2d\xe1\x38\x7f\x3a\xaf\x13\x0d\x03\x1e\xfe\xe2\xb5\x82\xcd\x34\x41\xd1\x16\xaa\x1e\xe6\x80\x59\x9e\xae\x1d\x0d\xfb\x0d\xde\x1b\xbd\x91\xe2\x18\x38\x72\xdb\x10\xc3\x69\x71\xca\x94\x44\x6e\x34\x4d\x19\x54\x38\xd3\xcb\x94\x16\xb9\x5f\x14\xc6\x52\xbf\x17\x7c\xdf\xcb\xba\x9a\x69\x9a\x44\x77\xdb\xad\xa2\xf0\x96\x96\x2b\xe4\x88\x59\x2d\xfa\xaf\x7a\x3e\xd1\x5c\xd7\xd3\x34\xfc\x22\xb1\x98\x26\xd3\x42\xa5\x15\x31\xe4\x62\x84\x35\xeb\xe6\x3f\xb8\x05\xdf\x44\x85\x59\x07\x19\x4c\x35\x34\xc9\xce\xdd\xfc\xb1\x8e\x2c\x26\x6a\x04\x13\xa2\x88\x22\x12\x21\xaa\x16\x32\x86\x81\x24\x45\x75\x9a\x5e\xd4\x6e\xe4\x12\x97\x09\xa9\xa2\x40\x5c\xaa\x05\xae\x2e\xf1\xbc\xbe\x51\x28\x56\x5c\xa4\x28\x94\xc8\x61\xb1\xee\xce\x74\xc8\x92\xaa\x48\x88\x60\xcd\xab\x7b\x85\x92\xa5\x22\x95\xa8\x5e\x40\x4c\x0b\x21\x44\x4a\xad\xee\xaf\x39\xba\xab\x31\x1d\x99\xa5\x4a\xd9\x24\x65\xad\x9a\xa7\x81\xab\xeb\xc4\x72\x33\x2e\x32\x4c\x43\xc6\x92\xa4\x69\xc4\xb2\x7c\xc3\xad\x6a\x48\x14\x15\x92\xb8\x3b\x32\x23\x12\x22\x96\x61\x12\xa3\x90\x8b\x88\x24\x21\xaa\x89\x84\x72\xb5\x2d\x89\xa2\x88\xbc\x61\x81\x60\xa2\xd5\xbb\xdb\x0a\xb7\xe5\xb4\x72\xab\x1d\x35\xd6\x64\xa2\x13\x05\x89\x64\x06\x21\x57\x44\x58\xd4\x3c\xac\xff\x91\x45\x64\x85\x10\xe9\x7d\x3c\xa1\x1c\x38\x66\x6f\xc7\xae\x82\x3b\xcc\xbb\x73\xad\xfa\x71\xdd\x0b\x49\x8e\x10\x2f\x88\x0c\x3d\xea\x77\x67\xef\xd3\x57\x3e\xf0\xd8\x43\x5d\x62\x0d\xee\x7f\xe0\x81\x41\x06\x65\x6b\xb3\xae\x61\x64\xa2\x8c\xa1\x59\x4e\xbe\xe1\xca\xb6\xe7\x24\x37\xdc\x38\xd1\x45\xa2\x6a\x9e\xf9\xe2\x19\x2f\x2e\x14\x5d\x24\x11\x1d\x15\x76\xef\xde\x19\xb9\x33\xe5\xa0\x71\x79\x85\xb8\x96\x89\x48\xce\xc3\x6e\x6f\xb4\x2d\x32\xa3\xc0\xd3\xf4\xb9\xbb\x2f\x5f\x9a\x73\x5b\x59\xbc\xfb\x5d\x7f\x7e\x99\x98\xa6\x45\x88\x24\x8a\x88\x94\xc8\xf2\xbd\x5d\xcd\x22\x45\xc2\x50\x14\x10\x22\x4b\x32\x7f\xec\xd4\x25\x46\x3e\x72\x91\x8a\x0b\x85\x9d\xe3\x71\x01\xc9\xc9\xd1\x26\xd1\x24\x49\x4c\xfc\x4d\x4d\x94\xd4\xcc\xca\xe3\x8f\x3d\xbe\x8c\x74\x53\x47\xa2\x28\x23\x2a\xc5\x07\xe2\x42\xb7\xe2\xce\x1c\x75\x1b\x79\xa7\xc1\x63\x24\xf6\xad\xcf\x8a\xb7\x89\x2a\x8f\x91\x2c\xc2\x2e\xf8\x08\xfc\x1f\x02\x47\x3d\xec\xe0\x13\xaf\x09\xd7\x37\xe7\xfc\x69\x08\xe0\x34\x34\xe0\x34\x0c\xe1\x34\x1c\x80\xd3\x70\x06\x4e\xc3\x35\x38\x0d\x4f\xc0\x69\x78\x0e\x4e\xc3\xcb\x70\x1a\x5e\x87\xd3\xf0\x26\x0f\x60\x9c\xde\x9c\xf3\xa7\xe1\x67\x70\x9a\x5b\x4d\xa7\x39\x88\x8c\xaf\x00\xd7\xe1\xe7\x70\x7d\x73\x05\xb8\x0e\x19\xb8\x0e\x2d\xb8\x0e\xcb\x70\x1d\x0e\xc1\x75\xb8\x13\xae\xc3\xfd\x70\x1d\x9e\x84\xeb\xf0\x3c\x5c\x87\x57\xe0\x3a\xbc\x01\xd7\xe1\x2d\xb8\x0e\x3f\x84\xeb\x7c\x05\xf8\x3c\x5c\x9f\x76\xe7\xfb\x7c\x27\x45\xae\xce\xdf\x98\xc0\xb3\xbc\x5b\xc8\x3c\x3c\xcb\xf7\x34\xf9\x8a\xb0\x0e\x45\xd8\x31\xdd\x72\x7a\x1a\xd3\xd9\x61\xa5\x8c\x23\x60\x4d\xe0\xf8\x46\xe2\x23\x6c\x1e\x71\xdd\x9a\xc0\x67\x37\xd2\x66\xcc\xff\x31\x59\x17\xbe\xb7\xd5\xfc\xf8\x7b\xd3\x36\xc3\x6c\x4b\xd2\xb7\xa4\xe2\x96\x34\xda\x92\xee\xdb\x92\x5e\x98\x4a\xbc\x31\xb1\x50\x69\x2a\x3c\x90\x5e\x4f\xd6\x0f\xee\x08\x84\x63\x41\xaa\x18\x62\x95\xa7\xda\x31\xaf\xb7\x48\x34\x54\x55\xe1\xde\x33\x8f\x71\x1a\x92\xd2\x46\x0a\x8f\xec\x88\xc9\x67\x3c\xbf\xa7\xe0\x14\x09\xd2\x1b\x8b\x21\xef\x90\x36\xe6\x1c\x25\xbc\x49\x03\xe7\x88\x4a\x33\x93\xdc\x43\x6e\x56\x70\x75\xd0\x6b\xf3\x86\xaf\x9c\xb2\xac\x62\x88\x3e\x8e\xb9\xef\xa1\xf0\x8a\x21\x9c\x46\x88\xaa\x53\xa4\x3f\x0f\xa8\xf6\x82\x7e\x2c\xf8\x7d\xee\x89\xff\x2e\x32\x4d\x13\xe5\x06\x96\xa3\x33\x2a\x9c\x31\x67\x9b\x39\x62\x9b\x16\xf1\x32\x5f\xa1\xa6\x4e\x50\x71\x86\x98\xbe\x82\x08\xc2\x2a\xa3\x98\xf9\xe5\x9b\xff\xcc\x8c\x52\x85\xf2\x9a\x2a\x95\xa8\xff\xcd\x2f\x65\x02\x62\x33\x49\x20\xd9\x1c\x91\x34\xaa\x61\x2c\x69\xb2\x28\x11\xcb\xb2\x78\x78\x1b\x23\x8c\x91\xc9\xd1\x51\xb5\xa6\x23\xed\x47\x48\xd4\xbc\xd2\xb1\x0f\xf9\x86\x92\xa8\x17\xb3\x58\xae\xf9\xb4\x4c\xf9\xda\xa7\xaa\x12\x32\x33\x55\x8f\x32\x24\x10\x51\xc1\xc8\x8c\x33\x1e\x4a\x6e\x11\xf3\x50\xbf\x44\xa9\x44\xc2\x72\x1e\x63\xd7\xd1\x49\x26\x93\x21\x54\xd6\x49\x90\x29\xf9\xfd\x93\x26\x45\x8a\x35\x32\x74\xc7\x41\x26\x16\x90\x9b\x4d\xce\x4e\x2a\xc2\x15\x95\xaa\xb4\xef\x67\xb7\x8f\x77\x64\x34\x66\xe0\xdf\xf5\xba\xad\xdc\xc9\x17\x4e\x7e\xf3\x24\xc9\x84\x0e\x5a\xba\x76\xf5\xca\x63\x24\xae\xcd\x78\x38\x5f\x2a\x86\xaa\xa2\x55\xc8\xd2\x03\xf7\x5d\x6e\x71\x08\xb8\x24\x25\x2b\xaa\xaa\x48\xb8\xb6\x76\x60\x4f\x91\x94\xb2\x94\xd6\x4e\x5f\xbc\xbb\xcd\x3a\x57\xdf\x7d\xb5\x53\xac\xb7\x5a\x97\xef\xbd\xda\x4e\xee\x50\xa6\xb5\xd8\x22\x46\x5e\x46\xb2\xdf\x6a\xd4\xcc\xcc\x68\xb1\x49\x12\x53\xaa\xb8\xb2\x6d\xb9\xe8\x64\xd3\x1c\x14\x92\x24\x89\x50\xb9\x38\x2e\x6e\xbb\x7c\xd7\xe5\x6d\xfc\x59\x53\x55\xf6\x46\x1e\x4f\x7d\x68\x79\xc0\xe0\xde\xfa\x96\xd8\x14\x15\x88\x60\x1e\xc6\x70\x02\x3e\x00\xbf\x09\xe0\xfe\x0b\x7b\xd8\x16\xb5\x63\x4a\x53\xb6\x45\xff\x28\xe2\x91\x17\xf4\x63\x49\xe1\xeb\x93\x88\x79\x57\x49\x9e\xf8\x4b\x7e\xfb\xd1\x30\x68\x72\x62\x26\x43\xf2\x37\x11\x75\x5b\x3d\x29\x15\x9f\x37\xf5\x18\xc5\xa2\xc7\xe9\x4d\xa5\x34\xad\x9d\x92\x9a\xa7\xc1\xff\xb1\xd0\x3f\x66\xea\x48\x92\x65\xc5\xcc\x65\xa2\xe5\xe5\x25\x2f\xb3\x73\x7b\xcf\xcc\xf8\x48\xfd\x92\xe9\x29\x88\x1a\xf5\x7a\x59\x4b\xb4\xb1\x96\x8f\xf3\xb3\x36\x35\x72\x9e\x2a\x13\x9f\x89\x26\xca\x57\xea\x9f\x29\x7b\xde\x5c\x7b\x31\xa2\x36\x32\x4a\xdd\x78\xf1\xc8\x69\x2d\xb1\xee\xe7\x77\xd4\x2c\xec\x55\x0b\x3b\xae\x2e\xce\xac\x78\x44\xb7\x5d\x33\x13\x65\x4d\x86\x08\x21\xf7\x56\x16\x23\x33\x3e\xb6\x48\x2a\xb3\xdd\x28\xd3\x9d\x6f\x9a\x2e\x43\xb6\xe6\x2f\x79\x99\x85\x76\x2f\x46\x58\xc6\x48\x58\xcd\x0c\x97\x57\x62\xb7\x3d\x5b\x92\x91\x8c\x2c\x13\x2b\x28\xc8\x14\xd6\x8e\x9d\xd4\xcd\x46\xb3\x6e\x12\x22\xc9\xc8\x2c\x97\x0a\x9a\x59\xb4\xe5\x32\x95\xf8\x4d\xb8\xcd\x66\xd3\xf3\x6c\x24\x2e\x2d\x1e\x2f\x10\x5b\x51\x4c\x2d\x74\xe3\xe5\xa5\x39\x93\x34\x9f\xd3\x14\xc9\x1b\xdf\x76\x66\xa1\xb0\x73\xb9\x63\x10\xd2\xf0\xf6\xc7\x95\xb5\xfd\xe3\x88\xc4\x39\x4b\xd6\x15\x24\xc9\xf1\x6d\x67\xee\x9a\xef\x9d\x75\x33\x15\x0f\x21\x91\xf8\x5e\xe5\xf4\x85\x0b\xcd\xc2\x5a\x4c\xb2\x01\x95\x93\x21\x03\xa0\x42\xf1\xe6\xac\xf8\x03\x11\x41\x16\x6a\xb0\x1b\x4e\xc3\x83\xf0\x14\x7c\x17\xfe\x11\xfe\xef\x75\x78\x02\xfe\x6a\x8a\xea\xd0\xfe\x97\x71\x3b\x4e\x40\xb3\x26\xf0\xa3\x1b\x89\x2a\xfb\x2b\xf8\x11\xd7\x7b\xb9\xa9\x36\x7c\x68\xe3\x7f\x55\x87\x91\xe4\x1a\x4f\x4e\xcf\xfa\xc2\x8d\xf4\xf5\x33\x1b\x13\x78\xc1\x9a\xc0\x7f\xda\x58\x87\xbf\x05\x8d\x5f\x1b\x26\xf0\x77\x9d\x75\xf8\x32\x54\xd2\x6e\xbe\x1e\xaf\x5a\x6b\xf2\xba\xb5\xc4\xd2\x5e\x1a\x8b\x83\x64\xc8\xb9\x69\x59\xcb\xa8\xd2\x70\x0d\xc9\xdf\x04\x88\x8e\x78\x1f\x48\xde\xe9\x5a\x1a\x6d\x32\x3b\x0c\xf8\x98\x4e\x91\xde\x1c\xe2\xc6\xa3\x33\xf5\x94\x8f\x97\xf7\x99\xe4\xfe\x6e\xaa\x53\x53\x53\xad\x37\x1c\xa5\xd4\xfb\x7c\x86\x24\x9e\x2d\xdf\xd6\xdb\x0c\xf6\xb4\x93\x91\xad\x6c\x1a\xf9\x89\xe6\xe4\x0c\x7e\x42\x25\xa5\xf7\x6d\x2c\x0d\x57\x13\xff\xd7\x0b\xc6\x42\x62\x90\x8d\x62\xe9\x35\x51\x26\x18\x89\x62\x18\x71\xde\xd3\xc4\xf8\xb7\xbd\xe8\x63\x76\xb5\x58\xa0\x17\xb7\x3f\x52\x64\x0c\x0b\xbc\xbd\x01\xcb\x17\xf2\x94\x48\xa2\xad\x49\x2a\xce\x16\xcb\x1e\xcd\x65\x83\xb4\x4d\xaf\x62\x9b\x04\xcf\x0e\x06\x13\x2b\x5b\x71\xec\x5a\x7d\x36\xac\x3a\xd8\x62\xe5\x46\xd3\x69\x1f\xbc\x79\xca\xa2\x21\x0b\x2d\x85\xcd\x50\xc3\xd0\x84\xc5\xc2\xd2\x5c\x95\x5a\xa6\xaa\xe8\xd9\x90\xe8\x24\xed\xfd\x2c\x89\x3c\xb0\xc8\xe9\x5c\xec\x66\xab\xe5\xf0\x9a\x29\x9b\x69\x85\xd0\x9e\x99\x9d\x79\x2b\x32\x23\x7b\x71\xa9\xe7\xd8\xbd\x6d\xa3\x90\x09\x9a\x82\x1c\xcf\x30\x98\xd3\x9a\x6b\x87\xb2\xac\x60\xc5\x2e\x94\x6c\x93\xd9\x8e\x19\xe6\xa8\x1d\xce\xce\x75\x0b\xf1\x78\x34\x7f\xf3\xd3\xb2\xac\x26\x73\x9c\xe5\x42\x2a\x68\x0a\x46\x96\x63\x63\x59\x12\x84\xa7\x57\xb1\x28\xe0\x8e\x2b\x54\x91\x1f\xfa\x98\xd7\x79\xa5\xf4\xfe\x92\x8c\x2d\xc7\xc2\xb6\x89\xa5\x3a\x8f\xc5\xd2\x5c\x36\xc4\xd8\xf1\x42\x56\x88\x35\xb2\x12\xd6\xe2\x88\xf2\x5e\x14\xb8\xde\x1b\x86\x4e\xc6\x66\x78\xe1\x52\xf9\xe0\xaf\xac\xac\xfc\xd2\x53\x1f\xdd\x45\xdd\x4b\xdf\xff\x93\xef\xbf\x8a\xf3\x8d\x85\x50\x29\x94\x62\x57\x66\xf7\xfc\xd9\xdb\x6f\xdf\x2b\xab\xec\x21\x3b\xb9\x5d\x1c\x66\x73\x54\x51\x4d\x43\x56\x18\x75\x42\x36\x73\xe1\xe2\x5d\x2d\xa6\x4a\xe2\xa1\x03\xbf\x75\x22\x2e\x44\x71\x21\x34\x05\x35\xde\x77\xe8\x48\x15\x67\x4b\x65\x86\x19\xb5\x45\x89\xdd\xf6\xda\x6b\x2f\x1f\xf8\xcf\xac\x5c\xca\x62\x1b\x61\x05\x5f\x72\x9a\xd5\x3c\xc6\xc4\x6f\x26\x93\x4e\xb8\x29\x0a\x7f\x23\x62\xa0\x50\x84\x15\xd8\x0f\xe7\xe0\x31\x78\x02\xbe\x02\x3f\x85\x7f\xb3\x0e\xe7\xe1\xc1\x69\x0a\xfd\x41\x38\xcf\xe7\xd1\x42\x67\x02\x5f\xe7\xf9\xa4\x05\xf8\x3a\xdf\x72\xde\x9a\x00\xda\x58\x07\x75\x7a\xcc\x3a\x04\x5b\x47\x27\xfb\x72\x1b\xeb\xd0\xde\xda\xb7\xfd\x5f\xce\x64\x4d\x60\xf7\x46\xfa\xfa\xee\x8d\xf4\xd8\xc7\x37\xd6\xe1\xfd\x5b\xc7\xfe\xf2\x96\xf4\xda\xd6\xd5\xbe\x6e\x4d\xe0\xf3\x37\xb8\x7b\xc4\xe5\x37\x36\xd6\xe1\x7b\x5b\xe7\xfc\xfa\x26\x72\xea\x3f\x76\xba\x8b\xc2\x66\x52\x28\x25\xea\xf7\x02\x65\x3a\x79\x84\x25\x4e\x9d\xca\x17\x91\xfe\x28\x65\xe8\xe3\xd8\x54\x65\xea\x10\x0b\x8d\x51\xa0\xf4\x46\xc3\xd1\x58\x6c\x0c\xaa\x95\xd1\x70\xb4\xd4\x18\xf9\x5e\xe0\xa5\x19\xde\x29\xae\x34\xc5\x87\x8c\x94\xfe\xc8\x10\x02\x4f\xa9\x34\x06\x0d\xac\x0c\x52\xf8\x54\x72\xa9\x69\xd9\x60\x32\xaf\x86\xe1\x60\x69\xd8\x1c\xb6\x85\xa5\x51\x5b\x48\x5b\xa3\xd9\x15\x43\x6e\xce\x0a\x86\xe0\x57\xb0\x9f\x06\x8b\x96\x1a\x4d\xdc\xd8\xec\xfd\x23\xad\x72\xc4\x6a\x20\x4c\x68\xb2\xbc\x1b\x7e\xcb\xbb\x9c\x35\x11\xe2\x38\x12\x64\xe8\x1a\x95\xe4\x9b\xff\x88\x0c\x22\x23\xe2\x44\xa5\xac\xbf\x52\x1c\xd1\xc8\xcb\xf6\x3a\x33\x26\x55\xe4\xef\x1b\xa6\x4a\xb3\x2a\x92\x6c\xdf\x27\x9a\x8c\x4c\x5d\x94\x72\x89\x39\x62\xaf\x48\x0a\x41\xae\xef\x20\x2a\x15\x2d\x64\xd0\x5c\x91\x57\xf5\x1b\x46\xcb\x44\x12\xa1\x36\x75\x69\xb6\x9c\x0d\xcd\xd2\x90\x90\xe6\xe2\x30\xeb\xcd\x7a\x3e\x91\x10\x22\x06\x6d\xcd\x12\x82\x28\xb1\x68\xe3\x36\x53\x56\x98\x61\x52\x2d\x59\xf5\x1c\xc7\x20\x12\x95\x78\xe8\x47\xa2\xc5\x23\xc5\xd6\xa2\x87\x0a\x8d\x79\x9f\x64\x33\x19\xb2\x9f\x34\x3c\x7f\xe5\xe6\x23\xb2\x24\x22\x2f\xef\x51\x49\x78\xcd\x5c\x5c\xde\x9e\xf5\x17\xda\x0b\x7e\x62\x1c\xd1\xda\xf1\x93\xc7\x05\x9d\x64\x0a\xb1\xe5\x2d\xb4\x2a\xc4\x57\xee\xd0\x89\x13\x96\xb2\x56\x2e\x93\x7b\x2a\xcf\xb7\x79\xb3\x73\x9d\x99\xfb\xae\x29\x92\x6c\xce\xcc\x2d\xf8\x8a\x24\x53\x49\xd7\xb3\xfd\xc5\xb6\x67\x71\x20\x81\x4e\xcd\x85\xc5\x45\xcf\xaf\x53\x55\x95\x3e\x9d\xdb\x8f\xf2\x95\x32\x91\x28\xd1\xa9\x81\xec\x4c\x0e\xcd\x5e\x5d\x2d\xb6\x2b\x3e\xb2\x69\xeb\xdc\xf9\xbb\xda\xd4\xa5\xbe\xff\x1b\xc5\x9d\xc5\xb5\xff\x8f\xbd\x37\x01\x93\xe4\xb8\xce\x03\x5f\x64\x64\x1c\x99\x91\xf7\x5d\xf7\x9d\xd5\x5d\xdd\x5d\xd5\x5d\xd5\x55\xd5\x3d\x47\xf7\xdc\x83\x01\x06\x73\xe0\x18\x00\x83\x6b\x00\x90\x00\x08\x5e\x20\x44\x80\x04\x29\x51\xa6\x40\x81\x04\x45\x11\xb2\x20\x42\x1a\x89\x6b\x5b\x32\x3f\xca\x14\x65\x89\x5a\x91\x54\xb1\x45\x8b\xb0\x4d\xd1\xc6\xca\x96\x7b\xbd\x3e\x77\xc7\xb2\xd6\x5e\x5a\x36\xed\x4f\xd2\xae\xbd\xd2\x67\x7f\xe6\x60\xbf\x8c\xac\x2e\x81\xbe\x76\xfd\x79\xe5\xb5\xd7\xfa\xf0\x0d\xf2\x75\x66\x64\x64\x66\x45\xe6\x8b\xf7\x5e\xbc\xf7\xff\x9f\xf8\xf8\x27\x6e\x09\x43\xeb\xf6\x57\x5f\xf9\xa1\x5b\x6e\xfe\x75\xaf\x50\xf2\x54\x1d\x53\x82\xf5\xec\xc1\xb3\x7b\xac\xdd\x56\xd3\xdd\xb0\x76\x6d\xd4\xbe\xe5\xf4\x89\x9a\x63\x72\xae\x5b\x41\x2f\x60\x79\x9d\xaa\xf3\xc6\xaf\xa0\xd7\x95\x0a\x68\x10\xc1\x32\xdc\x03\x1f\x85\xc7\xf6\xa0\x01\xcf\xc9\xef\x26\x90\x0c\x59\x7b\x72\xea\x0a\xe6\xa0\x17\x07\x92\x0d\x1f\x9e\x4b\xf1\x7c\x5f\x8e\x6b\x56\xde\x9f\x41\x30\x8f\xde\x3c\xe7\xe4\xac\x7f\x81\x44\xba\x86\x19\x3c\x3d\x98\xc1\xb3\x83\xf5\x8d\x58\xc6\x00\x32\x6f\x1d\xe5\x84\x98\x4d\xda\xc9\x09\x80\x25\x95\x59\x6e\xe8\xe4\x18\xbd\x9b\x93\x6e\x66\xe9\x48\x62\x2a\x3c\x1d\x4e\xc6\xe9\xe6\xce\x3c\x11\x01\x59\xca\x54\x2e\x70\x5a\x4a\xfe\xea\x4b\xfa\x78\x0b\xe7\xbc\x66\xe3\x49\x5f\x99\x8e\x33\x47\x3c\xdc\xc1\x55\x74\xda\x5e\xea\x36\xf5\x70\x7d\xb9\x8c\x36\x9c\x66\xc5\x73\x06\x83\x0e\x15\xc9\xcd\x3d\x87\x2b\x4c\xc7\x84\xaf\x08\x97\x32\x8e\x7e\x86\x66\x8e\xac\xa3\x29\xa4\x4c\xe2\xd8\x23\x8c\x29\x82\x70\xaf\x59\xaf\xea\x84\x5b\xc2\x59\x5a\xeb\x87\x85\x74\x6d\xa9\xfa\x57\x45\x20\x8a\xfd\x6e\x5d\xe7\x44\x11\x02\x61\xe2\xc8\x04\x79\x89\x96\x40\x28\x57\xc4\xb4\x7e\xbe\xae\x2f\x0f\xc7\xfd\x5a\x4a\x08\xd6\x42\xa2\x70\xf4\x27\xf4\xa8\x58\x0f\x8b\x91\x57\xaa\x5b\x5b\xe1\x60\x63\xb3\x50\x3f\x79\xea\x64\x6d\x2b\x4c\xc5\xf2\x3d\x57\xee\xf0\x89\x2e\x74\xaa\xd7\x3a\xcb\x21\x55\x88\xe9\xf4\xee\xb9\x72\x47\xdb\xe9\xb7\x6d\x3b\xad\x17\x8f\xee\x1c\x29\x86\xed\x4a\x48\xd2\xa6\x12\x37\x7b\xe3\x2d\xd1\x09\x93\xf6\x6a\xe8\xb4\xdb\x2d\x27\xbb\x57\x91\x84\x96\xc4\x3d\xe8\x5d\xb8\x70\xb1\xf7\x03\x77\xe9\xde\xd3\xe1\xfa\x52\x51\x69\x4b\xbc\x83\x2f\xa1\xbf\xa8\x38\x32\x57\xb5\x07\x53\x78\x07\x7c\x1e\xee\x87\x19\x7c\x6e\x30\x83\x8f\x0c\xf6\x40\x83\x8f\xc0\xe7\xe6\xfe\xd3\x81\xe4\x2d\xa4\x78\x21\x35\x16\xd2\x6d\x0b\xe9\x89\x85\xf4\xd9\xb9\xb4\xbe\x31\x9d\xa7\x8b\xd0\xb4\x7b\x40\x95\xeb\xe7\x70\xcd\xb9\x12\x93\xd8\x8c\x12\x75\x44\xa1\x39\x24\x64\x38\x47\x7c\x6b\xa6\x5d\x26\xf3\xdd\x70\x3c\xda\xc9\x2b\x4a\xd0\x78\x58\x55\xe2\x69\x1f\xc7\xa3\x38\x07\x39\x65\x55\x34\xb7\x20\x24\x11\x80\xa4\x04\x59\x2c\x4b\x4a\x06\x29\x59\xa3\x24\x55\xd0\xa4\xdc\x7b\xa8\xa7\x17\xe2\x80\xec\xbc\x3f\x5d\xce\x8c\x3a\xe2\x39\xac\x4d\x14\x44\xc8\xd2\x46\x5f\x27\xb6\xa9\x39\x5b\x5b\xfd\x9f\xd3\xa9\xc8\xf3\x78\xfc\xd0\x8b\x6a\x17\x7a\xc2\xb1\xd7\x37\xd7\xed\xb8\xd1\xb5\x6b\x87\x02\x2b\x3c\x74\xec\x58\x31\x1b\x20\x62\xd5\x9a\xba\x18\x4e\xd6\x88\x70\xed\xc8\x73\x84\x49\x6c\x2f\xb8\xc5\xb2\x44\x90\x77\x50\x3b\x1c\xc4\xed\xd5\x40\x34\x97\x57\xc3\x62\xaf\xdb\x09\x55\xa2\xca\xd8\xb1\x1f\x17\x74\xbb\xd5\x6e\xdb\xf6\xe1\x51\xc9\x16\x54\xb7\x82\xf3\xcb\xbd\x63\xad\xe5\x7a\xa0\x13\x4c\x4c\x47\x88\x97\xca\x7a\xe0\xd9\x44\x0f\xe3\x22\x0a\xa4\x53\xd7\xee\x35\xda\x35\x22\x4c\x5b\xd4\xda\x8d\x5e\x5b\xf8\x82\x30\x9d\x10\x8b\x29\x57\x02\xa7\x26\x96\x6b\xc5\x66\x63\xa9\x16\x96\x3c\x41\x58\x70\xad\x58\xe4\x9a\x2e\xf3\x42\x6a\xb7\xd5\xda\xa3\xfe\xa8\xad\x53\x41\x84\xad\x4f\xb3\x5b\xd3\xcc\x70\xb5\x46\xb8\xe3\x91\xda\xe5\xcd\x62\x7f\xb9\x6d\x87\x45\x87\x66\x87\x33\xa7\x26\xf3\xc4\x84\x5d\x2a\x94\x6c\x99\x9f\x55\x5c\xdd\x38\xbc\x1c\x76\x84\xb5\xbc\x2a\x9a\xc0\xc1\x7a\xe3\x0b\xe8\x17\x65\x4e\x5b\x0d\x7a\xd0\x87\x31\xec\xc0\x73\xf0\x75\xf8\xe5\x19\xfc\xea\x60\x06\x87\x06\x33\xd0\xf6\x67\xf0\xab\x0b\x96\xfe\x19\x58\x39\x37\xbf\x05\x91\x44\x67\xb4\x60\x02\x16\x9c\x01\x0b\xae\x80\x05\x8f\x83\x05\xcf\x81\x05\x2f\x82\x05\xaf\x82\x05\x9f\x05\x0b\xbe\x0c\x16\x7c\x03\xac\x03\x7b\xd5\x82\x6f\x82\x25\xed\xd5\x43\xce\x0c\xdc\xfd\x7c\x5b\xdf\xdf\x83\x65\xf8\x0c\x58\x73\x80\x9d\x5c\xca\x8f\x1d\xbf\xb1\x07\x13\xf8\x0c\x1c\x5f\xec\x39\xba\x3f\x83\xa3\x83\x19\x7c\xc6\x99\xc1\x57\xe7\x3d\xfc\xf9\x7d\x98\xc1\xd7\x07\xeb\x1b\xc4\x42\x39\xfe\x98\x85\x5b\xf9\x1a\x4a\x36\xf1\x49\x32\x9a\x49\x1e\xb4\x94\xd5\xad\xd3\x56\x38\xea\x8c\x2d\x99\x7b\x1c\x8e\xc6\x69\x37\x9d\x8e\xe6\x85\x71\x4a\x14\x4b\xf2\x74\x16\xd1\x79\x07\x12\xe5\x74\x47\xc9\xcc\xd4\x5d\xd4\xca\x24\x4b\xd2\x88\x66\xaa\x88\x59\x6a\xda\x9d\xd3\xe4\xcc\x99\x78\xa7\x7d\x2c\x89\x6f\x24\xb7\x74\x40\x5b\x9b\xf3\xe5\xca\x70\x9e\x01\xd2\xdd\x41\x53\xf4\xa8\xe8\x04\xa6\xee\x98\xe2\x05\x99\x4d\xc9\xc2\xcc\x23\x95\x2c\x2a\xfd\x8a\x41\xec\x5a\xb9\xa0\x0b\xe7\xe1\xbf\xb2\xbc\x7c\xf3\x77\x49\xb3\xcc\x83\x57\x03\xb6\xac\x62\x56\xb2\x64\x42\x1d\xd1\x49\xe6\xa1\xd7\xaa\x76\x89\x20\x6e\x9b\x9e\x4f\x4e\xc9\x72\x21\x1d\x31\x26\x87\x5d\xb7\xde\x29\x3d\x77\xbd\x5c\xf4\xde\x69\xc9\x77\xc0\x64\xba\x6e\x38\x89\xab\xb3\xb0\xa4\x67\x53\xb6\x1d\x79\xae\x6e\x37\x0b\x26\x29\x55\x2c\x45\x61\x79\x33\xac\xb3\xc0\x2e\x16\x8b\xb6\x70\x65\x9a\x5f\x14\x1a\xa4\x7a\xb4\x86\x03\xa1\x13\xd5\xf4\xd1\xf3\xd9\xa9\x77\xfc\xd4\x1d\x72\x7e\x55\x15\xac\xb6\x1f\x7c\xfc\xc9\x73\xb9\x53\xaf\x97\xac\x69\x69\x72\x47\xd8\x68\xa4\x05\xb4\x5d\xbb\xb5\xf6\x4e\x55\xd5\x3a\xbf\x42\x14\x8c\x75\xbd\x52\xad\xea\x2a\xd3\x7f\x21\x90\x33\xad\xa1\x1b\xfa\x72\xfb\xec\xd9\xb3\x6d\xbd\x50\xae\xd9\x92\x49\xe7\x9d\x85\xf5\xf5\xcd\x5a\xf6\xe1\x14\x7f\x21\xfb\xae\xad\x8f\xe1\x20\x49\x4c\x6c\xca\x76\x84\x31\x23\xcf\x31\xd4\xb9\x50\x02\x9c\x34\x96\x96\x3a\xd6\xe8\xf1\x11\xe7\x98\xe8\x38\x73\xd5\x97\x96\xba\x36\xd6\xe5\xf3\xe7\xaf\x3d\x15\x32\x37\xe9\xba\x62\x28\x11\x50\x70\xa0\x02\x87\xe1\x19\xd8\x83\xbb\x61\x06\xd7\x07\x33\xf8\xd0\x60\x06\x2f\x0e\xf6\x80\xc1\x87\xe0\xfa\x5c\x5f\x1e\x48\xee\x42\x2a\x2c\xa4\xb5\x85\xb4\xbd\x90\xde\x3a\x97\xd6\x37\xc8\xb4\x69\x29\xa1\xcc\x9e\x90\xcb\x6c\x7e\xbe\x9a\xbd\x83\x3b\xb9\xe9\x25\x73\xe9\x18\x95\xe8\xf4\x92\xa7\x33\xa7\x6e\x92\xb9\xbc\x78\xdc\x92\x84\xfa\x55\x2c\xab\x98\x86\x3b\xca\x02\xcc\x79\x94\xbd\x73\x4d\x2a\x99\xc9\x32\x93\x6f\x33\xcd\xe6\xc8\x96\xcc\x28\xec\xe6\xd5\x21\x69\xf6\x56\x85\x73\x04\x81\x38\xb3\xd8\xc8\x28\x07\xcf\xcb\x76\xa1\x5f\xb5\xa9\xef\x59\x15\x87\x13\x8b\x38\x2a\x37\x56\x4a\x0e\xa5\x8e\x60\x7a\xbd\xe5\x69\x37\x9f\x72\x54\x42\x69\xb8\xbe\x75\xac\xa3\x87\xbe\x43\x56\x8e\x3d\x5e\x17\x42\x30\x55\xb4\xd0\xcf\x12\x33\x59\xaa\x87\x8d\x4a\xd9\xc9\x14\xeb\x59\x07\x71\xa2\xeb\xa5\x7a\x27\x0c\x57\x96\xda\x0e\x51\x30\x17\xd2\x08\xb4\x88\x10\x82\x08\xdd\xb7\x89\x68\x1d\x21\x16\x57\x84\x2d\xe3\x4c\xad\x90\x2a\x98\x09\xc1\x44\x98\xb6\xd3\xf0\xf8\xa3\x11\x21\x84\x88\xcd\x48\x26\xe7\x12\xe2\xf5\x7a\xc2\xe0\x94\x08\xa6\x20\x2d\x0c\x89\xb0\x1c\x41\x6c\xc7\x26\x47\x57\x88\x70\xc4\x1f\x73\xea\xf5\xba\x23\xaa\xad\x36\xfa\x34\x69\x74\xbb\x22\xdc\x8e\x9c\xd1\xce\x09\xb5\x73\xe7\xdd\x77\x75\x8a\x87\xd7\x22\x41\x98\x70\x9d\xb2\x58\x99\x04\xfd\x7a\xe7\xe2\xc5\x8b\xa9\x28\xb0\xfa\xd9\xd3\x47\x43\x21\x4a\x75\x51\xda\x18\x4d\xea\xeb\xf7\x3f\xf8\xe8\xd8\xa9\x26\xb6\x50\xfd\xaa\xc3\x05\xd7\x8b\x95\xba\x23\x41\x9f\x0e\x3d\xfb\xec\xb3\x87\xf0\x77\xaf\xdc\x77\xf5\x6a\xcf\x12\x85\x24\x20\x11\x16\x2a\x55\xa3\xe5\x48\xf2\x48\xd5\x9f\x38\xd6\x3b\x7f\xcb\x99\x4e\xbd\x1f\xca\x6a\xbb\xce\x1d\xb7\x9f\x08\xf5\x5a\xb3\xed\xb0\x42\xb9\x12\xdb\x12\xaa\x2c\x3b\x90\xd9\x5f\xc1\x1b\x9f\x54\xfe\x9e\x52\x02\x1b\xca\x92\xbd\xf3\x73\xf0\xca\x1e\x5c\x80\x17\x64\x16\xd0\x05\x67\x06\xcd\x39\xf2\xf2\xd2\x8d\x3d\x18\xc2\x0b\x73\x84\xe6\xd1\x5c\x82\x19\xfc\xe0\x60\x06\xef\x1a\xcc\xe0\xbd\x12\x9d\x8c\x48\x83\x4d\xc0\xbb\xe0\x07\xe7\xe9\xc5\x07\x52\x77\x21\x0d\x17\xd2\x68\x21\x5d\x58\x48\x77\x2d\xa4\x1f\x9b\x4b\x32\xf3\x58\xc6\x19\x53\x4b\xf1\x2d\xc4\x72\xe8\x57\xdc\xa9\x4a\x20\xd8\x03\x14\xa3\xb0\xdb\xb4\x94\x4e\x6a\xa9\xd9\x2b\x9c\xf9\x03\x4d\xd6\x47\xad\xb8\x8a\x99\x24\x96\x95\x11\x50\x49\x85\x6e\x61\x96\x63\xbc\x36\x53\x19\xb4\xea\x6e\xf6\x95\x71\x1f\x67\x9a\x72\x1a\x0f\x73\x48\xd7\xec\x95\x8c\x76\xd4\x58\xf2\x7c\xa1\x5d\x5a\x2a\x05\x3f\x2f\x2b\xf6\xbd\x76\xbb\xf5\xe7\x8c\xd5\x84\x86\x1e\xae\x1a\x71\xe8\xdd\xdc\x32\xca\xb1\xe3\xd9\x9a\x6e\xac\xf3\xb0\x93\x03\x32\x3a\xd4\xd0\x88\xb2\x96\x54\x43\xd3\xb0\x0d\xa3\x9c\x24\xf5\x52\xd1\x0b\x8c\xe4\x54\xfb\x92\x11\xd9\x84\x1a\x95\x6a\xd9\xf0\x96\xba\x2d\xc3\x58\x1f\xf5\xe8\xba\xb7\x75\x78\xcb\xf3\x6a\xd5\x9a\xe7\x24\x83\xf5\xf5\x44\x66\xf6\x70\xcd\x34\x6c\xd7\x96\x5b\xc3\xac\x76\x8c\x9a\xcc\x17\x92\x35\xfa\x94\x69\x96\x61\xf8\x9e\x17\x14\x1c\x6f\xa9\xdb\x34\x9a\x06\xc1\xba\x27\x53\x87\xa8\xaa\x69\xe8\xb7\x93\x55\xc3\x6b\x55\x63\x9a\xac\xac\x0d\xad\xde\x85\xdb\x6e\x69\x27\x87\x0e\x1f\x4a\x8e\x4d\xde\xfa\xf0\xd5\x9e\xd7\x6a\x54\x0d\xc7\x11\xb6\xa3\x73\x51\x5a\x5a\xee\x18\xc9\x20\xa9\x1e\x3f\x7d\xb6\x6d\x18\x86\xfa\x85\xde\x9d\x77\xdd\xd9\x93\x60\x06\x94\x62\x91\x4c\x1e\x7d\xec\xc9\x23\xce\x89\xe7\x9f\x7d\xe6\x08\x2d\x37\x1a\x86\xcc\x87\xd3\x6d\x97\x26\xe3\xf1\x38\xa9\x4e\xc7\xd3\x2a\x75\x6c\x51\x4d\x4b\x81\x51\x57\xb9\x51\x9d\x8c\xd6\x13\xa3\x5c\x8a\xa9\x6a\x46\x05\x17\x1b\x38\xe7\x57\x64\xc0\xdf\x78\x1e\xbf\xa2\xa8\xc0\x20\x82\x35\x38\x06\x17\xe1\x15\x84\xe0\x6f\xee\xc1\x25\xb8\x7a\x10\xc1\xba\x04\x11\x5c\x82\x14\x2e\xc1\x04\x2e\xc1\x19\xb8\x04\x57\xe0\x12\x3c\x0e\x97\xe0\x39\xb8\x04\x2f\xc2\x25\x78\x15\x2e\xc1\x67\xe1\x12\x7c\x19\x2e\xc1\x37\xe0\xd2\xc1\x6c\x7d\x09\xbe\x09\x97\xe4\x0a\x22\xc0\x55\xb8\x24\x67\xe0\x4b\xce\x0c\x9e\xb9\x31\x83\xda\xdc\x47\x7e\xf4\x46\xf6\xda\x5d\x85\x47\xe7\x46\xe4\x41\xbb\xab\x73\x3f\x3a\x6b\xff\x17\x24\xd3\xdd\xa3\xf0\x8c\x3c\xf2\xa8\x33\x83\xbf\x93\xcd\xd7\x7f\x73\xb0\x07\xef\x00\x26\xdf\xf0\x27\x80\xc1\x3b\x64\x17\xcf\xcf\xa5\x19\xbc\xc3\x99\xc1\x87\xf6\x67\xc0\x9c\x19\x7c\x69\x7f\x7d\x83\x34\xa5\x5d\x39\x9d\x63\xdd\x49\x48\xa4\x6c\xee\x0d\x03\x2a\x6b\x24\x24\x18\x6c\x47\xb2\xe9\x48\x64\x3a\x0b\x75\x02\xda\xa4\x61\x8e\x40\x79\x50\x86\xcc\xe6\x98\x92\x79\x75\x9c\xd4\xb1\x12\x85\x74\x94\xd7\x82\x5b\x88\x65\x0e\x78\x66\x2a\x4c\xf3\x02\xf1\x4c\xe1\xee\xc8\x24\xe9\xc3\x39\x6d\x5e\x4b\x32\xdc\x8d\x47\xdd\x3e\x3e\x2a\x51\xa1\xf2\xd0\x97\x85\xc3\xe6\x1c\x96\x5c\x76\x9d\xee\x28\x32\x87\xa2\x7a\xb0\x0a\xba\x83\x63\x74\xbe\x7e\x34\x34\xfc\xfb\xd0\x05\x37\x76\x0c\x52\xda\x3d\x32\x72\x9c\x7a\x3b\xfd\x25\x82\x35\x4d\x35\x74\xcb\xa6\xba\xc1\x19\xa5\x86\x5f\xb9\x79\x3a\x1c\x74\x0b\x44\xd7\x05\xb5\xc3\xc4\x35\x45\x9c\xa2\xcb\x2a\x55\x8d\xc4\x55\x04\xb1\x5d\x67\xdd\x89\xa3\xc4\x89\x02\xcb\x76\x45\xad\x5e\xd3\x85\x5b\x6a\x94\x44\xa9\x5a\x77\x69\x90\x14\x85\x15\x35\x13\x97\xd4\x4a\x1b\x1b\xc3\x92\x9b\x44\xb1\xb3\x72\xa6\xde\xec\x47\xb6\xd3\x49\x53\x47\x98\xc2\xdc\x0d\x4f\x4f\x85\xa9\x1b\x22\x74\x84\x13\x69\x96\x4d\x6e\x75\x7a\xfd\xf5\xd0\x6e\x6e\x34\xdd\x7a\xbd\xe1\xac\xde\xb3\x22\x54\xdb\x26\x41\x60\x85\x05\x21\xb0\xe5\x53\xe1\x46\x95\x88\xc4\x89\x6f\xa8\x41\xb5\x65\x4b\xc8\x49\x09\x94\x47\xb8\x65\xb8\x9d\x76\xcd\x08\x23\x59\x77\x24\x3c\x11\x25\x65\x47\xf5\x84\x11\x09\xfb\x9c\x15\x15\x85\xab\x60\xaf\x41\x11\x56\xff\x14\x11\xba\xa0\x42\x8d\x56\x57\x56\x23\xe2\xb8\x0e\x09\xd7\xfb\x2b\x3f\xb9\xf1\xd0\xc3\x6f\x99\xd2\x20\x0e\xc8\x2d\xe9\x95\x7b\xae\xa4\x62\xe5\x3d\x92\xbc\xbc\x54\xad\x3b\x4e\xa7\x55\xef\x46\xeb\x9b\x93\xb2\x3b\xd8\xdc\x8c\x5c\x93\x60\xba\xf2\xc0\xa4\xb1\xbd\xbd\x93\x0a\x4e\xb8\x90\x7d\xb9\xbd\xc1\x20\xb2\x4a\x3a\x53\x37\x9e\x78\xf2\x89\xa1\xa0\x62\xed\xc9\x69\x69\x3a\x99\x96\x54\xac\x04\x2b\x8f\xaf\xb9\x9d\x6e\xc7\x25\x95\x46\x85\xea\x51\x14\x19\xdb\xc2\x20\xe8\xf9\x7f\xfa\x2e\x51\x88\xec\x9a\x61\x30\xcd\x8e\x36\x36\x27\x65\xab\xb1\x13\x09\xc7\x12\xc4\x68\x94\x84\xa0\x98\x58\xae\x2a\x36\x1e\xb9\xf6\xc0\xaa\xee\xba\x9e\x10\xa1\x6f\xd3\x1c\xd4\xd7\x8c\x1c\xd1\x12\xd4\x71\x6d\x2a\x8a\x31\x29\x27\x42\xc0\x1c\x9b\xe6\x27\xf0\x6d\x8a\x0e\x26\x44\xb0\x0a\x47\xe1\x04\xbc\x00\xbf\x2b\xd1\x08\xbe\x98\x57\xd1\xb1\xe9\x1c\x34\xb1\xd5\x95\xce\x4f\x34\xea\x6c\x76\xd3\x96\x85\x59\x1e\x04\xcd\x2c\x89\x6e\x1e\xb9\x91\xb4\xbb\xc3\xc9\xae\x92\xbd\xfc\x8c\x76\xd3\x31\xed\x2b\xd9\xcb\x2c\x0f\xce\xeb\x81\xe4\x8b\x9d\x43\xbd\xbc\x49\x87\xe7\x65\x4a\x79\x65\x69\x8e\x58\x34\x67\x5f\x94\x1c\xfa\x59\x1f\x2d\x49\xaf\xc2\x42\x0b\xb5\x58\xf7\x00\x8d\xb7\x4b\xd3\x39\xf9\x44\x0e\xb0\x9c\x69\xf2\xe6\x74\x92\x1b\x13\xc3\xaa\x5c\xd7\x9a\x46\x3b\x8a\xf2\x7e\x11\x8b\x27\x44\xb1\x10\x52\xb7\xd1\xee\x6e\xfe\xb0\xd3\xd8\x08\x3d\xe3\xe6\xaf\x29\x2a\x2f\x4f\x86\x2b\x8e\x30\x39\x23\xab\x6f\xdb\xce\xb6\x3f\x20\x02\x11\x8d\x86\xcb\x22\x9b\xfd\x23\xf1\xfd\xe5\x30\xbe\xed\xb0\xae\x2a\xae\xa5\xdb\xae\x2c\x3a\xbb\xa7\x34\xda\x18\xc9\x39\xb6\xb1\xd9\x14\x85\x42\x48\x24\x2e\x6b\xe3\xcc\xaa\x68\xf7\x96\xdd\x9f\x2a\xb4\x7b\x8e\x08\xa3\x48\xdc\x63\x88\x70\xf5\xad\x5f\x30\x6a\xd5\x02\x11\xb6\x68\x1c\x1e\x76\x72\xf4\x53\xb7\x5c\x2e\x3b\x34\x2a\xd5\x1d\xd1\x31\x9c\xa4\xdc\x2e\x59\xf1\x4a\x2c\x3a\x62\xf2\xc8\xc4\xb6\x9c\xde\xea\x8a\x9b\x0d\xbc\xb0\x4b\xd3\xcd\x8d\x48\x72\x8f\x95\x36\x0f\x9d\x5a\x13\xbd\xe1\x66\x44\xb8\xeb\x13\x4d\x55\x70\xb4\x31\xe8\xb9\x4e\xb9\x5c\x71\xed\xb0\x20\x1a\x27\x76\x8f\x3a\x61\x35\xaa\x50\x4c\x4c\x37\xb3\x18\x5e\xa9\xd6\x4f\x34\xe2\xf0\x06\x56\xb9\x24\x21\x23\x9a\x20\xd3\xa7\xd6\x88\xa6\xff\x23\xa3\x2d\x84\x5f\x68\x97\x25\xb9\xa1\xf8\xfe\x7b\xc2\xd5\xe8\xd9\x57\xb2\x3e\x89\xe1\x18\xc4\xf5\x2d\x43\x58\xd1\x78\x3c\x70\xf3\x4f\x60\x29\x96\x64\x6b\x59\xa7\x6b\x8f\xaf\x95\x87\xab\x5d\xd7\x91\x38\xa7\xb2\x68\xf0\xa7\xc2\xd5\xc8\xae\x96\x47\xe3\xad\x86\x08\x85\x58\x99\x1e\x6b\xd0\xcc\xde\xf2\x4b\x55\x91\x59\x71\xaa\x11\x8d\xb7\xc6\x51\xe3\x44\x5d\x35\x2a\xc2\xb7\x2c\x57\x57\x08\xcd\xce\xb4\x08\xa2\x51\x89\x1a\xae\x41\xba\x77\xdf\x79\x5b\x29\x6a\x96\x23\x21\xf9\xd6\x18\x56\x1d\xcd\x28\x59\xae\x95\xfd\x56\x2e\xe5\x82\x03\xd0\x37\x6e\xde\xec\x29\xbf\xac\x24\x72\x6d\xba\x07\xdb\xf0\x5e\xf8\x12\x3c\x0f\x33\xf8\xf8\x60\x06\xbf\x28\x2d\x91\x8f\xc3\x2f\x4a\xfd\xcc\x17\x92\xb9\x90\xfc\x85\x54\x5c\x48\x9d\x85\xb4\xb2\x90\xc6\x0b\xe9\xd0\x42\x7a\x76\x21\x7d\x6e\x2e\xad\x6f\xf8\x43\x59\xea\x2c\x53\x7e\x7c\x26\x13\xef\x77\xd1\x0e\xc2\x07\xb0\xdf\xd3\x9c\x87\x82\x05\x55\x25\xc7\x6b\x7c\x13\x44\x78\x1e\x79\xa8\xe2\x1c\xae\x14\x45\xf1\x74\x07\x8f\xf3\x5c\xb9\x38\xff\x4e\x02\x4b\x09\x2d\x24\xa3\x9d\xac\x95\x29\xea\xc9\x34\xcf\xa7\xcb\x3c\xbc\x39\x60\xf0\x2e\x1a\x4e\x27\xe3\x2a\x3a\x22\x1a\x9d\xd4\x8d\x6a\x71\xe5\xd8\x91\xf5\x9f\xb9\xcd\x68\x77\xea\xd4\x2c\xc6\x47\xe3\xe5\x4f\x78\xaa\xe1\x53\xd7\xe6\x9a\x71\x7f\x9f\xb6\xba\x2d\xf4\xa9\x66\xb7\x52\x8e\x89\x26\x28\x2d\xb6\xd2\x0b\x95\xe1\x4a\xd3\xc8\xe9\xc5\x8b\x95\x02\x35\x1a\xdd\xb5\x58\xa8\xc2\xb2\x02\xcf\x29\x14\xea\x71\xdc\x69\xb6\x23\x82\x15\xfa\x63\xd4\xb6\xf4\xe6\xf1\x53\xe7\xfb\x7e\x31\x79\x41\xc4\x62\xf3\xde\xdb\xcf\x34\x35\x43\x1b\xbc\x73\x5b\x02\xbb\xdb\xa2\xb3\xdc\x11\xc2\x36\x5c\xa1\xb9\x51\x5d\xc6\xec\xdd\x66\xb3\xe9\x56\xdd\xc0\x0b\x5c\x23\x0a\x5c\xfa\x3c\x56\x79\xeb\xec\xcd\x5b\x08\x21\x66\x31\xa6\x48\xab\xa0\x8f\xf7\xfb\x0f\xdc\xff\x40\x3f\xe9\x89\x1f\xeb\xdf\x8f\xfe\x71\xdc\x5f\xdf\xac\x54\x76\x4e\x9c\x6a\xf6\xd7\x36\x1f\xbc\xef\x9e\xa7\xdc\xb5\xf5\x61\x44\x1d\x5b\xaf\x1c\xda\xde\x5e\x69\x1e\x3b\x71\x66\x29\x67\x65\x1f\xac\x2c\xc7\xcd\xb2\x41\x0c\x23\x16\xf1\x70\x34\x8a\x2b\x27\x4e\x1c\x89\x5a\xe7\xce\x9e\x2a\x8b\x38\x70\xa8\xed\x55\x2a\x15\xf7\xca\xcf\x7c\xf6\x4f\xde\x9a\x3d\x3f\x8e\x97\xc5\x03\x5f\xfd\x73\x5f\xbd\x5f\x2e\xa2\x1c\x5a\x13\x98\xd2\xd1\x13\x4f\x3c\xb1\x29\x62\x23\x3a\xbc\x7b\x34\xfe\x33\x46\xa9\xd6\x74\xa9\xca\x35\x77\xa9\xb7\x16\xbb\xd5\x5a\x2b\x3e\xaa\xa8\x7a\x1c\xcf\xb1\xf5\x3e\xa1\x9c\x57\x62\x70\xa1\x0e\x5d\x99\xdb\x60\xc3\x0c\x3e\x35\xc8\x13\xc8\x72\xfc\x45\x89\xab\x37\xdc\x51\x64\x3e\x30\x5a\x54\xc1\x37\xd3\x26\x95\x36\x68\xce\x00\x65\xa1\x50\x42\xe0\xcd\xa9\x06\x98\x84\x84\xdf\xc1\xe3\x1c\xb5\x64\x07\x4f\x07\xd9\xd1\x50\x2a\xd9\x39\x7d\x81\x2c\xa6\x92\x35\x53\xa9\xa5\xb4\x02\xda\x47\x2d\xc9\x49\xdb\x92\xa5\xf7\x4d\x89\xee\x20\xb1\xaa\xd0\x91\xc2\xe6\x68\xb0\x5c\x17\xa5\xc3\x3b\xc7\xea\x4e\xb9\x54\x76\x6e\x7e\xdd\xe9\x2c\xaf\x84\xc2\x75\x5c\x51\x3a\x79\x6c\xab\x54\xa9\xd7\x2c\x95\xbc\x9e\x4d\xbf\xba\xf0\x4a\x1b\x1b\x1b\x25\x8b\x70\x9d\x9c\x78\x6a\x75\xa5\x7e\xfc\xf8\xf1\x3a\xf1\x7d\x6b\xc5\xa9\x57\x8b\x22\x3d\x32\x5a\x0b\x7f\xf6\x67\x1f\xf9\xc5\x47\x9c\xee\xfa\x91\xd4\xa9\x37\xea\x8e\x9c\x38\xa3\xae\x38\x76\x5c\x6a\x87\xfa\xe9\x33\xa7\xeb\x84\x0b\xd2\x39\x7b\xf2\x78\xdd\x15\x4e\xba\xb4\x12\x4a\x80\x07\xbb\x7e\xbc\x6e\xe9\x2a\x63\xaa\xd5\x6e\x9b\xba\x22\x1c\x12\x95\x08\xaa\x51\xa4\x50\x87\x84\x25\x6a\x55\x0e\x7d\xd8\x19\x4c\xb6\x4b\xaf\x67\xbe\x56\xfd\xd4\x6a\x36\xed\x5a\xb2\x28\xf3\xf8\x47\x6e\xb3\x29\x37\xcd\xd2\xea\xca\x5a\x89\x53\x2c\xea\xb7\x5e\xb8\x98\xda\x65\x81\xad\xf4\xe2\x85\x5b\xeb\x12\x7e\x16\x11\x9d\xae\x3c\x39\x09\x8f\x13\x66\x99\x42\xd1\xcd\xec\xfc\xce\xdd\x57\xee\x4a\x85\x2b\x98\xaa\x71\x4c\x57\xde\xb2\xb2\x32\x8c\x00\x0c\x18\xde\xfc\xa2\x92\xe0\x91\x64\xb8\x3f\x02\xb7\xc1\x67\x10\x47\x29\xda\x44\xa7\xd1\x5d\xe8\xcf\x2a\xae\x42\x32\x17\xe5\x77\xa4\x99\xf7\x79\x38\x2b\x3d\xa1\xa1\x33\x83\x3d\xb9\x6e\x33\x84\xbd\xb9\xb3\xfd\x3b\xf0\x79\x69\xf6\xfd\x8e\x33\x83\xaa\x8c\x08\x1d\x1c\x5b\x5d\x48\xe3\xb9\x94\xf7\xb0\xb5\x3f\x83\xbd\x45\x44\x48\xe6\xba\x9c\x85\x6f\xc9\x92\x1f\x99\xeb\x72\x16\x0a\x70\x16\x96\xe1\x2c\x6c\x4b\x84\xb6\xb3\x70\x1f\x9c\x85\xb7\xc1\x59\x78\x1e\xce\xc2\x4b\x70\x16\xae\xc3\x59\xf8\x1c\x9c\x85\xaf\xc0\x59\x78\x5d\x16\x0e\xed\xc1\x3d\xdf\x71\x8d\x27\xf7\xf7\xe0\x83\x8b\x7b\x3b\x3b\xe7\x7a\xcc\xae\xfa\x89\xfd\x19\x7c\x62\xb0\x07\xaf\x2d\xda\x7f\xde\x99\xc1\xdf\xd8\xdf\x83\xbf\xfd\x1d\xcf\xf2\x8f\xf6\xf7\x90\x76\xf0\x04\xa8\xf8\xe6\x63\xa8\xbb\xbf\x87\x86\x8b\x63\xe3\x85\xb4\xf3\xe6\x7b\x40\xc7\xf3\x2b\xa2\x33\xfb\x33\x74\x66\x20\xef\x02\x5d\xda\xdf\x43\xd7\xbe\xa3\xd5\x7b\xf6\xf7\xd0\x47\xde\x7c\xa7\xe8\xfb\xe7\xe7\x7d\x6a\x7f\x86\x3e\x35\x90\xf7\x87\xbe\x38\xdf\xf7\x17\xf7\xf7\xd0\xeb\x6f\xbe\x73\xf4\xf7\xf6\xf7\xd0\x6f\x7e\xc7\xdd\xfd\xce\xbe\x3c\xa2\xf8\x37\x60\x0f\x9e\x99\x03\x1e\xb8\x70\x43\x1a\xf2\xd9\x63\xce\x25\x54\x9c\x4b\x33\x78\xc6\x99\xa1\x0f\xca\x8e\x0e\xf6\xdc\x70\x66\xe8\x9b\xfb\xeb\x1b\xd3\x79\x4c\xb8\x8a\x46\xf9\x4a\xf2\x9c\xe6\x72\x73\x92\x17\x23\xca\x2f\xbb\x9f\xa9\xfb\x3c\x7a\x32\xed\xa3\xf1\x66\xba\x39\x91\xc1\x0c\x3c\xb6\xf0\x54\xd6\xc1\xd2\xbc\xfe\x31\xcf\xba\x08\x17\x45\x94\x12\x18\x63\x3c\xec\xa6\x5d\x89\x62\xd7\x9a\xa3\x6b\x64\xb2\x04\x19\x98\x8e\xb3\x3f\x27\xa3\xf1\x48\x46\x59\xc2\xa0\x2b\x31\xb0\x24\x24\x56\x18\xd4\x50\x6e\x69\xcd\x29\x09\xab\x78\x1a\x48\x2a\x83\x56\x1e\x99\xe9\x6e\x66\x33\x44\x4b\xc6\x64\x36\xd3\x71\x5e\x75\x3b\x1d\x4e\x46\xc1\x0e\x8a\xd0\xff\x4f\x9f\xeb\x2f\xd4\x93\x44\x3a\xc5\xeb\x0f\x74\xa4\xeb\x99\x1c\x4f\xa4\x97\x9b\x24\xc9\x2d\x81\x88\xcb\x86\x24\x96\x4b\xd6\xb7\xd6\x0d\xa6\x25\x9e\x91\x98\x85\x44\xe5\xdf\x6d\x54\x6a\x15\x83\x86\xa1\x93\x6c\x8f\xba\x3f\xf1\x74\x75\xd2\xab\x50\xaa\x97\x7a\xe6\x92\x21\x9d\x69\x49\x98\x98\x2c\x51\xbb\xd4\x30\xbc\xfe\x68\x9c\x50\x8a\x91\xae\x2a\xaa\x43\x28\xa9\x7b\xcb\xdd\xa6\x91\x04\xc8\x31\x74\x43\xa7\x51\x12\x52\xea\x78\x1e\xa5\xa1\xa1\x7a\xe7\xde\x3f\xa8\x51\x05\x13\xae\xaa\x06\x37\x64\x4b\x43\x53\x37\xcc\xd5\xc4\xa8\x94\x22\x9a\xcd\x64\x86\x83\x82\xc4\xeb\xad\xad\x27\x81\x21\xdd\x7c\x49\xab\xd0\x5e\x0a\x75\x1a\x18\xd4\x0b\x63\x23\x07\x0d\x71\xa8\xa3\x61\xc3\x4b\xd7\xb6\xda\xeb\x0f\xb4\xfd\xd0\xbc\xf9\x33\xff\x4d\x3d\xee\x1f\xaf\x6f\xbc\xe5\x88\xd7\xed\xb6\xcc\x64\x89\x52\x6c\x1a\xaa\x61\xd8\x5e\x39\xa9\x5e\xba\xe7\x9e\x4f\x15\xca\x86\x91\x18\x1e\xf2\x0a\xd4\x58\x45\x2f\x1d\xab\x1e\xdf\x3d\x94\x88\x82\x30\x56\x93\x64\x7d\xad\xd7\xf7\x02\xdb\x36\x24\x36\x0b\xf5\xab\x2b\x7f\xdd\x62\xad\xf5\x43\xd5\xea\xe9\x93\xdb\x5e\xd6\x48\x06\x68\x02\xcf\x37\x9c\xf6\x83\xeb\xd5\x8d\xb5\x5e\xe2\x17\x6c\x46\x15\x85\x72\x55\x35\x7d\xcf\x33\x24\x74\x62\x72\xec\xf4\x99\x6a\x0e\xe0\x22\x49\x30\x2d\x8d\xd3\x41\xf5\xf8\xee\xe1\xe4\xda\x35\xf9\x9b\x65\xbf\x91\x91\x18\xd4\x0a\xeb\x89\xad\x09\xe3\x0b\x26\x13\x46\xe0\xfb\x86\xe1\xdb\x06\x95\x2d\x69\xe8\x71\xda\xb9\xa5\x4d\x35\xdb\x32\x14\x3b\xa4\xc6\xda\x64\x3b\x39\xf2\x96\x8d\x6c\x3c\xae\xe9\x86\x6e\xc6\xa6\x24\xf5\xa8\x9e\x3e\xb1\xed\xb9\x54\xc1\xea\xb7\x1f\xfb\x6f\xf5\xc9\x41\x72\x73\x8a\x9b\xaf\xa0\x54\xf9\x6d\x30\xa0\x0d\x27\xe1\x3d\x32\x7b\xfc\x4b\xf0\x0f\x41\xc0\x0c\x1e\x92\xb5\x30\x32\x2f\x9f\x05\x34\x94\xd9\x35\xa3\x39\x2b\x6b\xa6\x8d\x64\x29\xca\x28\xaf\x70\xad\x20\x89\x2c\x90\x57\x9c\xe7\xe0\x9e\x9b\x7d\x49\xca\x29\xcd\x31\x89\xfe\x86\xc2\x1c\xa7\x82\x59\x38\xec\x4e\xfa\x4a\x57\x62\x1a\xef\xe4\x31\x69\xfc\x9f\xe3\x22\xff\x7c\xe9\x68\xea\xdd\x43\x75\x83\x3d\x39\xce\xc6\x81\xe9\x7e\x4c\x3d\x8a\x19\x66\xae\xa9\x62\x5c\x31\x91\xce\xa9\x47\x30\x62\xdd\x0b\x5d\xd5\x72\x7c\x07\x31\xcb\x74\x4c\x0d\x2b\xcc\x09\x1c\x53\x2d\x0e\x4c\x66\xba\xbe\xc9\xe2\xd8\xf5\x98\x6a\xba\x4c\x9e\xed\x15\x5a\x45\xbf\xdb\xae\xe1\x3f\xec\x0b\xfc\x8b\xc8\x34\x8b\x86\x93\xe9\x01\xfc\xcf\xee\x59\x7b\xe4\x2d\x4f\x6c\x1e\x7f\xdf\xb3\xef\x3b\x3e\x36\xab\xd5\x84\xfd\xe6\x85\x4f\xfd\xf0\x0f\x3d\xd5\x7a\xf2\xfe\x2f\xfc\xfc\x17\xae\x7a\x66\xb1\x58\x34\x2d\xf5\xf8\x0f\x1f\xdf\x7c\xec\x2d\x4f\x1d\xae\x9f\x39\xb5\x5b\x74\x8b\xc7\x6e\x39\x9f\x1e\x7e\xea\xc9\xa7\x0e\x9d\xf8\xe3\x27\xcc\x41\x91\x61\xaa\x52\x86\xb1\x66\xba\x9b\x8f\x3e\xfa\xe8\xe6\xa1\xa7\xdf\xf5\xee\xc3\x4f\x14\x6f\xed\x12\x8c\xfe\x75\xed\x3f\xe7\xd5\x64\x92\x9d\x73\xf3\x69\xf4\x4f\xf0\xbd\x32\x7e\xd9\x81\x3e\x1c\x83\x47\xe0\x6d\xf0\x17\xd1\x08\x1e\xd9\x83\x74\x9e\x19\xcd\xe1\xc8\xbc\xee\xf5\x88\x33\x83\x67\xf7\xf7\xe0\xcf\x2c\xf6\xa4\xce\x0c\xbe\xb0\x9f\x6f\xbf\xba\xbf\x07\x7f\xeb\xcd\x47\xd0\xf8\x06\xcc\xd0\xfa\x60\x0f\xde\x0d\x67\xa4\xe1\x79\x66\x9e\xe6\xf3\xfa\x8d\xf5\x8d\x78\xcc\x22\x4b\x89\x3b\x99\x1b\xc8\xa4\xc7\x89\xe5\xec\x3b\x9d\x6c\x66\xef\xd9\x94\x05\x91\x4c\xe0\xcd\xf6\x49\x2c\xdc\x71\xb3\xaf\xe0\x70\xb3\x9b\x17\x17\x4a\x4f\xa3\x9a\x57\xdd\x86\x72\x65\xbb\x35\xce\x27\xf9\x9c\xcd\x73\x58\x55\x6a\x28\x87\xe2\xc8\xec\x83\xcc\x1d\xa9\xca\x84\x62\x46\x9b\x12\x0a\x55\x62\xc5\xe5\x90\xb8\x92\xf8\x30\x73\x33\xc6\x2d\x49\x94\x35\xaf\xed\xea\x23\x99\x1b\x97\x63\x53\x86\x07\x73\x39\x5b\xe0\x2a\xa6\xdd\x94\x86\x34\x3d\x9a\x43\x7d\xc9\x19\x5d\x96\xcf\xb4\xf2\x32\xb2\x1c\xed\x31\x2f\x16\xcf\x3e\xab\xcd\x1d\x65\x3a\x8c\xa3\x57\x9a\x12\x5e\x19\xf5\x47\xdf\x73\xde\xf1\xcc\xc0\x0f\xcc\xf4\xf6\x23\xf5\x4f\xb4\x8a\xb1\xa6\xb2\x86\x69\x0a\x3f\xf9\x89\xa6\x6a\x12\x46\x7e\xcd\xa1\xa6\x69\x52\xd7\x75\x3c\x27\x6b\xf8\x7d\x5c\x55\xe5\x1e\x33\x89\x3d\xd6\x19\x95\x65\x85\x2f\x29\x44\x96\xd1\x59\x1d\x1e\x1a\x9a\x1c\x1b\xf4\x4e\x83\xab\x7e\xda\x49\xfd\x93\x81\x45\x28\xa1\x71\x21\xa1\xe6\xb2\x35\x32\x43\xb7\x58\x31\x0d\x6e\x9a\x85\x42\xc1\x54\xcd\xda\xa9\x13\x3b\x05\xc3\x63\xcc\xa4\xd9\x1b\xa2\x9b\x7a\xa1\x62\x8e\xa8\x91\x75\x5f\x2d\x27\xd4\xab\xaf\x14\x46\x6f\x39\x29\xbb\xaa\xed\x8c\x57\x0c\xa6\x39\xb6\x59\x30\x8c\x6a\x39\x61\x8c\x53\x46\xa9\x6b\x10\x5a\xb4\xa8\x55\x28\x6c\xef\x9e\xee\xe8\x8c\xe9\xa6\x6a\x08\x33\x2e\x98\x6b\x4b\x45\x46\x55\x2d\x2e\xd8\x86\x62\xe6\xa5\xc8\x42\xa3\x4c\x89\xd6\x3a\x66\x21\xf6\x28\xa5\x8a\xe2\x52\xae\x29\xa6\x13\x45\x4c\xa8\xca\xbf\xbe\xf3\x4e\x79\xe0\xdb\xe7\xdf\x96\x9e\xd4\x4d\xdd\xdc\x38\x71\x19\x9d\x6b\xfa\xeb\x93\x69\xa1\x91\x9e\x2d\xfa\xa1\xa1\xbd\xe3\xb4\xa1\xca\xdf\xcb\x33\x74\xaa\x9b\x8e\xc4\xe3\xa6\x94\xa2\x2f\xba\x42\x55\x84\xe3\x32\x86\x30\xf1\xa6\x27\x6e\x4d\x69\x5c\x8c\xd9\xb1\x1f\xbd\xb7\xd0\xf0\xd9\x5d\x43\x79\xd2\x47\x85\xe3\x52\xe1\x78\xf4\xce\x63\xcf\x6f\x1a\x81\x1f\x18\xf2\xb9\x0b\x55\xa3\x99\x1e\x4a\xfd\x7a\xa5\x60\x1a\x86\x6c\x99\x9c\x2c\x9a\xeb\x47\x4e\xd4\xfd\x8d\xc9\xb4\x60\x3b\x73\x6e\xc6\xe2\x28\x71\x55\xcd\xf4\xd3\xe5\xb5\x42\x6d\x67\x7b\xc3\x37\x7b\x15\xaa\xd9\xb6\xb9\x32\x39\x5a\xf3\xd3\x34\xf5\x8d\x95\xbc\x4b\x2f\xfb\x43\xb6\xab\x9f\xbb\xe5\x64\xa1\xde\x6f\x96\x4c\xa2\x28\x0a\x33\x1c\xeb\x39\x63\x79\xa9\x45\xcd\xb0\xbc\x54\xf7\x7b\xe9\x01\xbd\xa5\xeb\x08\xbf\x51\xab\xfb\xe9\xc5\x73\x47\x73\x94\x6d\xac\xaa\xae\x19\x78\x81\x69\x14\x8a\x05\x83\xcf\xe7\x8f\x04\x3e\xa8\xfc\x43\xf4\x7f\x82\x2f\x39\x36\xbe\x0c\xff\x03\xfc\x3e\x6a\xa0\x77\xc2\x3f\x85\x3d\x78\x1a\x5e\x9c\xa7\x17\xbd\x08\x4f\xcf\x63\x45\x07\x92\xb9\x90\xec\xb9\x34\x83\xa7\x25\x89\x6e\xe6\xe8\x1d\x1c\x3b\xbc\x90\x8e\x7c\x47\xab\x0f\xdf\xc8\x41\x19\x7e\x5c\x7e\xfa\x07\x6d\x7e\x69\x21\x7d\x6d\x21\x7d\x7d\x21\x7d\xe3\x3b\x7a\xf8\x3b\xfb\x7b\xf0\x9b\x8b\x63\xff\xc7\x42\xfa\xe7\x6f\x6e\x85\xba\xfb\x33\xf8\xb0\x33\x43\x99\x63\xf9\xa2\x33\x43\x47\xe7\xdb\xcb\xfb\x7b\xe8\xe1\x79\xcb\xf5\x0d\x5f\x1a\xfc\x92\x84\x3a\x6c\x4d\xfa\x39\x6f\x83\x8c\x3f\xcd\x0b\x98\xd8\x01\xcc\xc3\x68\x07\x4f\x25\x65\x22\x9e\xd3\xda\xec\x48\x2b\x7c\x4e\xe5\x8f\xa7\x39\x0c\xaf\xb4\xf3\x65\xb5\x65\x34\xaa\xe2\x51\x40\x43\x59\xa3\x2c\x33\xbd\xf3\x2f\x1d\x05\x69\x77\xce\x7a\xb6\x39\x19\xb7\x26\x39\xa0\xcb\xa4\xaa\x90\xff\x72\x6e\x65\x5b\xa8\x72\xa9\x8e\x62\x4d\x77\xa8\x6a\x38\xca\xa7\x0a\xbb\xb1\xd7\x1f\x6d\x26\x49\xa5\xba\xd4\xf2\xaa\x89\x47\xc5\xb2\xf0\xda\xe9\x4a\x12\x97\x2c\xaf\xbd\xbc\x5e\x35\xe2\xd0\xa5\xc6\xfa\x7a\xfb\xe6\x1d\xed\xd3\x3b\x9b\x9e\x61\x19\xa6\x21\xd6\x62\xb9\x9c\x97\x54\x92\x52\xe2\x2d\x75\x1b\x46\xd2\x69\xd4\xbd\x4b\xc6\x7a\xab\xb7\xbb\xbd\x7d\xc4\xab\x55\x6a\x5e\xb2\xdc\x88\xa9\xc1\x0d\x6a\xd8\x9e\x61\x7f\xd8\x2d\x24\x85\x9c\xdb\xcd\x2b\x94\xea\x49\x4e\xd8\xae\xc8\x4a\x01\x2d\x5f\xdb\xf3\x3c\xc6\x29\xa5\xde\x60\xeb\x78\xdb\xab\x15\x93\x9b\x5f\xfb\xaf\xec\x86\x51\x23\xde\x48\x32\x25\x26\xad\x48\x5b\xf8\x9e\xff\xf6\xf6\x56\xd3\x88\x74\xee\x19\x2b\xcb\x55\x3b\x2e\x19\x9d\x93\x89\xb7\xdc\x6d\x18\x3c\xf6\x96\x1a\x21\xe5\x9a\x65\xb8\x49\xb7\x37\x7c\x85\x76\x27\x3b\x55\xc3\xb5\x4d\xd6\x99\x36\x99\xc0\xdc\xa4\xb5\x66\x8d\x1a\x1a\x16\xcc\x68\x2e\xf7\x93\xf5\xf6\x71\x21\x1a\x93\xad\x96\x51\x29\x38\x51\x63\xc9\xb5\xa9\x63\x8b\x78\x3d\x7e\xd9\xb6\x39\xd5\x6d\x87\x1a\x9d\x46\x40\x8d\x66\xbb\x69\x50\x41\x15\xaa\x6b\x2a\xa5\x9e\xe7\xd0\xe4\x54\x9b\xaa\x54\xa1\xd5\xed\x41\x93\x52\x62\x47\x3f\xf3\x5f\xc9\x7d\x02\x18\x60\xbf\xf1\x4b\xe8\xf7\x94\xbf\x0c\x26\x14\xa0\x0d\x4b\xb0\x09\xbb\x70\x0e\xae\xc0\x93\xf0\x2c\xfc\x03\x74\x3f\xba\xbc\x07\x5d\x34\x92\x6a\xed\xc7\xa1\x23\x4d\x88\x1f\x77\x72\x2e\x01\x80\x1f\x9f\x73\x09\xb8\x68\x34\x97\xe2\xc5\xbe\xe5\x85\x34\x46\x23\x59\x3b\xb5\x07\x87\x17\xed\x6e\x5d\x48\x17\xe7\x47\xf3\xfa\xa9\xbb\xf6\xf3\xfe\x5f\xcd\xb7\xe8\xf2\xfe\x0c\x7e\x74\xce\x01\xf0\x93\xf3\x7d\x5b\xfb\x33\x34\x72\x66\xe8\xd6\x7d\xd8\x83\x1f\x47\x4b\xd9\xcd\xa1\x63\x68\x4b\xde\xe4\xaf\xc3\xeb\x72\xfb\x32\x1c\xcf\x75\x31\x5a\x92\xc0\xb9\xd9\x4d\x1e\x48\xf1\x5c\xca\x2f\x55\xd9\xdf\x83\xa5\xc5\xb1\x65\x38\x0e\x2f\xcf\x75\x71\x2e\xcd\xe0\x75\x67\x06\x67\x6f\xec\xc1\xad\xf0\x3a\xfc\x7a\x7e\xd3\x8b\x63\x2f\xed\xcf\xe0\x65\x67\x06\x1f\xdf\xdf\x83\xcf\x2f\x7a\xf9\x2a\xda\x42\xc7\x64\x64\xe8\x3b\xae\x85\x46\x32\x0e\x14\x57\xf1\x2e\x6a\xd2\x16\x95\xa1\x8a\xd1\x0e\x1e\x5b\x68\x9a\x2f\xc0\x5a\x88\x8c\x59\x98\x29\xd8\x20\x8a\x47\x7d\xdc\xca\x11\x7d\x2d\x65\x1a\x66\xed\x9a\xb4\x6b\xe1\x50\x82\xde\xec\xa0\xa9\x5c\xd7\x1d\xc9\x4c\x84\x94\x4a\xca\xda\xe1\x38\x5f\x0d\x08\xf2\x2c\x9c\x7e\xe6\x1c\x84\x23\x19\xeb\xa5\x51\xcc\x52\xca\xc2\x61\xd0\x1a\x0d\x27\xa3\xea\x01\x30\xd7\x68\x92\xdd\x45\xce\x58\x90\xdb\x60\xd2\xb7\xe8\xcf\x81\xaa\x95\xcd\xb1\x2c\x64\xed\xa3\x96\x04\xdb\x19\x4d\x65\xb5\xc3\x01\x93\x59\x40\x59\x34\x8d\xe8\x9c\xba\x54\x49\x25\x31\x61\x98\xe7\xf9\xc4\x54\x66\x68\x23\x26\x91\x59\x0f\x2a\x96\x07\x28\xe7\x57\xdb\x9c\x6c\xa6\xad\x1d\x3c\xda\x4c\x5b\xe9\xa4\x8f\x5a\xb2\x52\x4d\xd6\x95\x8d\xb3\x2b\x8f\x73\xce\x05\x25\xfa\xda\xd2\x2d\xf1\x70\x73\x52\xae\xc5\xa5\x78\xf7\xf1\x8f\x71\x8b\xdf\xa9\x5a\xa6\x1e\xaf\xff\x55\xc7\xe5\x46\xa3\x59\xe6\xdd\x0b\x6f\xc0\xf2\x9d\x5a\xcc\x93\x50\x15\x1c\xdf\x57\xe3\x86\xc6\x55\x1e\x86\xde\x6f\xde\x61\x14\x23\x6b\xe9\xf6\x7f\x66\xbb\x1c\x51\x55\x65\x36\xf9\x6d\x55\x67\x58\x65\xa6\xe9\x0a\x55\x18\x86\x9a\xac\x3e\x17\x57\x3c\xa1\x1a\x35\x43\xa3\xec\x5d\x76\xa3\x12\xaa\xba\xa1\x8f\x55\x46\x31\x37\x97\x55\x8d\x73\x95\xc7\xb6\x6e\xd7\x5c\xce\x57\xb8\xc5\xb9\x15\xdf\x33\x49\xa6\xb6\xce\x75\x6e\xaf\xc5\xdc\x30\x4c\x66\xda\x66\xff\xc1\x81\x5e\x9a\x6c\x0e\xe3\xc4\xb4\xfd\xfe\xa0\x1f\xa8\xaa\x52\x3f\x9f\xaa\x8c\x73\x35\xe6\xf1\x76\xd2\x33\x9a\x9d\xf4\x07\x55\xcb\xb6\x55\xd5\x8b\x8b\x86\xc9\x2f\x5c\xe0\x3a\x57\x55\x85\xd9\xaa\x9f\x14\x0d\x51\x29\xb8\x2a\x65\xa6\x88\x07\x6b\x3d\x5f\xa8\xaa\xe1\xc7\xab\x4e\x3c\x88\xb9\x69\x38\x82\xab\xf5\x43\xdb\x93\xd2\xc3\x0f\x70\x45\xa5\x0a\xe1\x86\xe7\x17\x7c\x83\xab\x58\xb1\x63\x6e\xc8\x7e\x14\x85\x9f\x63\x1a\x46\xe5\xe5\x81\x5f\x3a\x7a\x68\xf3\xea\x68\x93\x3b\x86\xc2\x97\x05\xdf\x3e\xee\xb8\x9c\x19\x86\xc9\xb9\xd8\x08\x04\xe7\x76\xc0\xfd\xd6\xb9\xf1\x0e\x6a\x72\xd7\xa9\x6d\xc4\x7e\xab\xd5\x52\xa9\x30\x55\x44\x8d\x4a\x95\xa9\xaa\xb0\xc5\xad\x6a\x58\xae\x18\x8a\x8a\x99\xea\x2e\x3d\xaf\x72\xce\x55\x55\xe8\x4c\x5e\x88\xe3\x93\x46\x73\x79\x2d\xae\x19\x95\x46\x73\xdb\x70\xfd\xa2\x6f\xd7\x6a\x35\x5b\xe7\x8a\xa2\xa8\x4e\x2b\xa6\xaa\xc2\xb3\xdf\x84\xeb\x7c\x1c\x04\xbc\xc0\x07\x63\x4e\xec\xb8\x9d\xb8\x44\x45\x8a\xca\x35\xdd\x14\x8e\xcf\xef\xe0\x44\x41\x6a\x7a\xa1\xab\x2a\x94\xb2\x38\x8e\x38\xe6\xd9\x13\xc6\x4d\x9b\x2b\x9b\x81\xe3\xaa\xbc\x22\xe2\x24\x16\x01\xcf\xae\xaa\x72\xdb\xce\x86\xbd\x52\x2d\x72\x5b\x57\x90\xca\xb9\xc3\x5d\x8b\x66\x4f\x4f\xb8\xee\x77\x3b\x2d\x87\x33\x9b\x07\xbc\x3e\xac\xa9\x5e\x18\x31\x47\x35\x02\x7e\xa7\xca\x35\xc1\xb3\x9b\x17\xf5\x4a\xc8\x93\xec\xff\x2a\xa5\x9c\x45\x71\xc4\x83\xb1\x4a\x0d\x53\xad\x0d\xba\x0d\x5b\x18\x9e\xe2\xc9\x35\x19\x84\x52\xb4\xa5\xfc\x53\xd0\xc1\x81\x36\x1c\x82\x6b\xd0\x80\x19\x9c\x19\xec\x81\x00\x2c\xd5\x20\x76\x66\x60\xef\xef\x41\x04\x18\xc4\x81\x5d\x24\x57\x60\xe4\xa2\x72\x38\xea\x5a\x38\x9e\x6e\xa6\xd3\x61\x14\x4c\xa6\xe3\x3e\x9e\xd2\xb4\xc5\xc2\x61\xc4\xa6\x23\xe9\x30\x4d\xa5\x4f\x42\x65\xd8\x33\x5f\x94\xde\x41\xe3\x69\xab\x99\xb3\x86\x8c\xf3\x92\xfe\x2a\x9a\x4e\x86\xaf\xbb\xa1\xcb\xad\x30\xb6\x84\x75\xbb\x57\x3e\xd5\xe7\x05\x5f\x35\xb6\x75\x3d\xfb\x25\x55\x42\xc8\xcf\x35\x4f\xf5\x04\x17\xfc\x31\xc1\x0b\x85\x43\xae\x50\x31\x17\x4b\x5c\xf0\xc2\xed\x3d\x6e\x9a\xa6\xfc\x45\xc5\x45\x4e\xb9\x8a\x14\x1c\x15\x1a\x3c\xec\xf7\xd7\x42\xb7\xaa\xd8\xbc\xea\x16\x6e\x6d\xb9\x6b\xc3\xcd\x02\xaf\xba\xdf\xaa\x6e\x6e\x6e\x35\xb6\x1a\x27\x1a\x58\x41\xaa\x20\xb6\xae\x58\x9c\x8b\x4f\x5b\x5c\xf4\x2e\x35\x1a\xa7\x7b\x3f\xcd\x35\x15\x89\xd1\x63\xc3\xd1\x63\x23\x61\xd9\xaa\xaa\xe9\x26\xff\xa0\xe0\x49\x21\xd6\x1a\x8d\x4b\x2b\x1c\x2b\x8a\xca\x21\xfb\xd5\x6e\xfe\x2b\xa5\x87\x6b\x72\xfd\x7f\x19\x76\xe0\x1c\x5c\x82\xbb\xe1\x31\xf8\x4b\x68\x0c\x0f\xee\xc1\x2f\xc0\x47\xe6\xa6\xf2\x47\xe0\x17\xa4\xca\xdc\x5d\x48\xf7\xcf\xa5\x19\x7c\xc4\x99\xc1\xc7\xf6\xf3\xed\xec\xc6\x0c\x7e\xc1\x99\xa1\x69\xe6\xd1\x8e\x06\x7b\x70\x19\x9e\x91\xe3\xf0\x8c\x33\x83\xf7\xe5\xc0\xbe\x68\x79\x3f\xcf\x80\xb5\x30\x9b\x0c\xe3\x1d\xd4\x65\x34\x87\xe8\xf5\x59\x9c\x53\xa5\x4a\xaa\xb1\x49\x4e\xbb\x6d\xe1\x70\x38\x19\x49\x0a\x49\x0b\x4d\xe3\x3c\x1f\x8c\x48\x92\x98\xa9\x4c\x93\x6d\x5a\x4a\xb8\x83\x47\xd3\x34\x4f\xe9\x56\xa2\x38\x88\x18\x4d\xf3\x7c\x7c\x99\xdd\x9a\x53\x4c\x84\x41\xc4\xf2\x40\x4c\x4e\xc2\x6a\xa1\x71\x38\x92\x26\xa6\xe4\x02\x90\x5a\x2d\xda\x51\xe2\xb1\x5c\x4f\x1b\xcb\x82\x12\x99\x66\x3b\x9e\x1e\x70\x3e\x4b\xd6\x85\x1c\x59\x35\xa0\x71\x33\xe7\x7d\x0e\xa2\x38\xca\x8e\xb6\x2c\x94\x66\x7e\xec\x78\x33\xcd\xd1\x07\x47\x72\x89\x2e\x07\x2d\xe9\x6e\x4e\xba\x63\x49\x91\x36\x9e\x4a\xd8\xc4\x51\x0e\x52\x38\x1d\x46\xe8\x07\xeb\x27\x96\x9d\xb4\xd3\x14\x76\x85\xef\x3e\xf7\xf7\x6b\xb6\xcd\x7c\x1b\xff\xd9\x9a\xa0\xae\x6a\x5b\xfa\x8a\xe6\x3b\x3a\x27\x5f\x55\x85\x10\xaa\x2a\x04\x2b\xf4\x63\x77\xad\x57\x57\x7b\x17\xff\x81\x6e\x77\x9a\x45\xd5\xa9\xd7\x6b\x37\xbf\x28\x0c\x0d\x2b\xdf\xe6\xdc\xfe\x1c\xb7\x05\x13\x41\x58\x70\x75\xa7\x76\xa8\x76\x4b\xdc\xaa\x73\xae\x66\xbe\xa8\xc6\xfc\x20\xe0\x41\xab\x51\xb7\x15\x5e\xdb\x9a\x6e\xd7\x19\x63\x8a\x75\xb8\xa7\x32\xce\x30\x11\x3a\xeb\xad\x3f\x31\x4c\x7c\x82\x88\xe1\x3a\x8e\xc1\x19\x43\x8e\xdd\x6a\xb5\xec\xef\xe2\x86\x61\x70\x9d\x99\x96\x63\x88\xcc\x1e\xe4\x58\xc3\x8c\x68\x81\xea\x45\x11\x77\xca\x9c\x73\x7f\x65\x65\x25\xd0\x34\xae\x51\x82\x8d\x6a\xb5\xc8\xdb\x1e\x8b\xd7\x0b\xeb\x1b\xa3\xb2\x51\x2a\x17\x0d\x9e\xe9\xb5\x52\xb5\xee\x0a\x8d\xeb\x86\xa9\xab\x0a\xb1\x79\x3c\xdc\x1c\x25\x35\xce\x85\xeb\xf2\xc8\x29\xf3\xfa\x66\xcd\xf2\x5d\xac\x56\x7b\xeb\x71\x61\xed\xe3\x8e\xc7\x4c\x82\xcd\x80\x31\xb6\xb1\x5e\xad\xb6\x78\x85\xb3\x36\xfa\xca\x64\x73\xf7\x3d\x5b\x86\x65\x7a\x4e\xa8\x3a\x61\xd9\x39\xfb\xe3\x47\x70\xa6\xf0\xb0\x61\x18\xaa\xae\x2a\x34\xa9\xdb\x5e\xa3\xc6\x91\x22\x7c\x42\x18\xa5\x63\x5e\x2c\x17\xf9\xc7\x5f\xaa\x9f\xe8\x7e\xdb\xf2\x3c\xa9\x22\x23\x9b\xbd\x83\xd9\x85\xe4\xd4\xa5\xbb\x96\xec\xaa\xc3\x79\xf6\x39\xe9\x1c\xf1\xb8\x6d\x9b\x16\x27\xfa\xfa\xb5\xe9\xf2\x85\xa5\xda\x2a\x67\x99\xb9\xab\x28\x88\xec\xda\x49\xc2\x1a\xbd\xb5\xa0\xbe\xbb\x7b\xac\xce\x3c\xcf\x26\x84\x70\xa2\xde\x49\x89\xa2\xbe\x64\x88\x62\x31\xd6\xb0\x4e\x15\x6e\x6a\xb7\xba\x9d\xb4\x69\x64\x3f\x86\xca\x99\xdd\xdc\xad\xab\x0a\x22\xf5\xdd\x86\x6e\x5a\x2a\x56\x14\xca\xb7\xde\xb7\xbd\xf5\xd6\xba\x53\x4d\x6c\x03\xa9\xc8\x60\x2c\xde\xac\xb3\xc4\x23\x06\x8f\x7c\xab\xbc\xb3\xbb\x53\x72\xca\x5c\x45\x54\xe8\x76\x27\xd6\x74\xbd\xc8\x45\xa6\xa7\xb9\xd9\x3a\xb6\x73\xa4\x5e\xea\xb7\x63\x4c\xb2\x6f\x18\xd0\xa7\xd1\x5f\xc6\x8a\xd4\x81\x21\x94\xa1\x0b\xdb\x70\x11\xde\x0b\x2f\xc3\xaf\xc0\xbb\x61\x06\xf7\x0f\xf6\xe0\x04\x3c\x32\xff\x90\x1f\x81\x13\xf2\xf3\x15\x73\x69\x06\x27\xe6\x05\xf1\xe1\x62\xcf\xb3\x37\xf6\xa0\x02\x1e\x3c\x3b\x07\x4a\x39\x38\x67\x6d\xd1\xe2\xd0\xfe\x0c\x9e\x9d\x2f\x69\x66\xe7\x9f\xda\x9f\xc1\xa9\xc1\xbf\xa5\x5b\x33\xfb\x89\x4d\x73\xcc\x2b\x25\x60\x3b\x68\x3a\xd9\x5c\xe8\x5b\xfa\x9f\xa4\x6d\xe3\xb0\xb5\x80\x33\x8c\x32\xad\xb1\x83\xe6\x58\xc5\x68\x2a\x8b\xdb\xf3\xd8\x53\x76\x82\x44\x2e\x4c\x5b\x39\x14\xc7\x9c\xab\x7b\x47\xf9\x31\xd3\x31\x99\xee\xb8\x42\x13\x87\xad\x60\xf4\x37\x12\xaf\xc1\x1f\x8c\x1c\x8a\x98\xd7\x73\x0c\x8c\x59\x44\xc8\xb7\xa8\x6f\x61\x6d\x95\x73\x82\x09\xc6\x98\xbc\x50\xd8\x6c\x30\xa2\xf3\xdb\x75\xee\x05\x2b\x92\xba\x5b\xab\x31\x8d\xfa\x87\xea\x54\xe8\x3a\x93\x8c\x92\x87\x99\x4a\x31\x42\xd8\xf5\x0b\xdc\x6e\xb6\x5a\x4e\xf1\xbd\x1e\xc1\x0a\x2d\x49\xce\x9f\x12\x33\x7b\x96\xad\x2b\xb4\x38\xba\x5f\xe1\xa6\x6d\xda\x86\x66\x08\xcb\x64\x44\xd5\x74\xae\x12\xea\x39\x36\xa6\x2a\x23\x44\xc1\x66\x42\xcc\x42\x12\x69\x9a\xe3\x38\xca\x79\x12\x9b\xfe\x56\xd1\x6c\x76\x96\x3c\x12\x9b\x6e\xcb\xf5\x5a\xb4\xd4\x6c\xdb\xec\x9b\x66\xb3\xbb\xe4\x1b\x0e\x29\x1e\xa9\x47\xdd\x6e\xaf\xb0\x92\x0c\x8b\x84\x30\xd5\x60\x48\x50\xca\x9f\x13\x84\xd6\x8e\x14\x8b\xe3\xfa\x77\x33\x86\x91\x96\x9e\xef\x74\x6f\xef\x70\x43\x60\xcc\xb8\x4e\x1f\xd4\xa8\xef\xfb\x34\x29\x1e\xa9\x53\x05\x21\x6c\x46\xdc\xae\xd7\x1b\x8e\xae\x62\x44\x0b\xe3\x7a\xa1\x99\x38\xcb\xab\x83\x88\x8a\x62\xe3\x62\x5d\x4b\x8a\x89\x4e\x3d\xd7\x56\x15\xd3\xe4\xb8\x70\xb8\x88\x29\x52\xa9\xe6\x54\x8a\x05\xb3\xd8\x0d\xa8\x82\x14\x4c\x88\xe4\xae\x33\x00\xbf\xf1\x02\xfe\x06\xfc\x12\xe8\x10\x40\x53\xce\x2f\x77\xc2\x23\xf0\x3d\xf0\x31\xf8\x61\xf8\x53\xf0\x55\xf4\x72\xf6\xda\x09\xf9\x6a\xa6\x50\x92\xdb\xbb\xe0\x56\xb9\x7d\xab\xcc\x0c\xdd\x83\x57\xe0\x25\xb9\xfd\x0c\x5c\x9f\x47\x59\x05\x7c\x26\xaf\x4e\x96\x35\x19\x32\x77\x34\x85\x08\x52\xf9\xdf\x04\x52\x38\x03\x29\x5c\x81\x14\x1e\x97\xb5\xca\x29\xbc\x08\x29\xbc\x0a\x29\x7c\x16\x52\xf8\x32\xa4\xf0\x0d\x48\x0f\x72\x47\x53\xf8\x26\xa4\xb2\xd2\x23\x75\x66\xd0\xda\xcf\x3e\x95\xbc\xff\x3d\x38\xbb\x90\x2e\xce\x25\xb9\x76\x7f\x15\xbe\x05\x57\x0f\xd6\xee\xaf\x42\x01\xae\xc2\x32\x5c\x95\xd0\x46\xe7\xe0\x2a\xdc\x07\x57\xe1\x6d\x70\x15\x9e\x87\xab\xf0\x12\x5c\x85\xeb\x70\x15\x3e\x07\x57\xe1\x2b\x70\x15\x5e\x87\xab\x12\xab\xee\xaa\x33\x83\x87\xf7\x67\xf0\x56\x67\x06\x8f\xee\xef\xc1\x87\x17\x57\x7a\x71\x21\x7d\xf2\xcd\xd7\xbc\x0e\xdf\x82\xeb\x07\xd7\xbc\x0e\x05\xb8\x0e\xcb\x70\x1d\xb6\xe1\x3a\x9c\x83\xeb\x70\x1f\x5c\x87\xb7\xc1\x75\x78\x1e\xae\xc3\x4b\x70\x5d\xfe\xf7\x39\xb8\x0e\x5f\x81\xeb\xf0\x3a\x5c\x97\xd7\xbc\xee\xcc\xe0\x4f\xec\xe7\xf5\x28\x3f\x39\xdf\xfe\xca\x0d\xc8\x0b\x68\x9e\x1f\xcc\x60\x36\xc7\x68\xcc\x59\x9a\xb2\xf9\x95\xed\xa0\xcd\x74\x1a\xe6\xb1\x97\xec\xdb\x6a\xd2\x38\xa0\x72\x99\x36\xfb\xb0\x83\x66\x77\x07\x75\x33\xef\x44\xc2\x36\xff\xe7\x3f\xf3\xa1\x20\xd2\x93\xa5\x66\xd5\x0a\x86\xfd\xc0\x54\x10\xa9\x04\x7a\x51\x8f\x4b\x65\x09\x8e\x54\x99\xbc\x53\xd7\xf5\x62\xe2\xda\x8d\x66\xc3\xc6\xba\x6e\xea\x9b\xdd\xdb\xbb\x04\xab\xf8\x5f\xce\x4f\xb4\x83\xd1\x9b\x4e\x4c\x8a\x15\xeb\xdf\x7b\xe2\x85\x34\x3b\xf1\x77\xff\xdd\x27\x1e\x5c\x71\xfa\x2e\x5d\xd7\x4b\xff\xc6\x89\xf2\x8a\x22\x48\x03\xe2\x54\x5b\xb6\x6e\xfe\x40\xd0\x5b\x5d\xf1\xed\xe5\x7e\xbf\xf1\x5e\x1b\xeb\x36\xb1\x2b\xf5\x66\xe0\xe8\xdd\x9d\xb2\x1e\x44\x89\xad\x63\xac\xeb\x7a\xf7\xa1\xf5\xfb\x1d\x5d\xb7\x0d\xfd\x95\xff\x4f\x4e\xcd\xe3\xa8\xc6\x1b\x7f\x16\xfd\x94\xf2\xeb\x12\x35\x6f\x0b\x4e\xc2\x79\xb8\x0a\x3f\x0c\xbf\x01\x1f\x85\x19\xbc\x32\x98\xc1\x8d\xc1\x0c\xbe\x32\xd8\x03\x04\x5f\x81\x57\xe4\x6b\x1b\x2c\xa4\xf2\x42\x5a\x5a\x48\xfd\x85\x34\x5e\x48\x47\x16\xd2\xa9\x85\x74\x76\x21\xdd\xbe\x90\x3e\xba\x90\x3e\x39\x97\xd6\x37\x62\x76\x80\x79\x14\x8d\xe6\x80\x14\xbb\xd9\x0c\xd4\xa2\x8c\x62\xb9\x12\x81\x62\xb9\x5c\x37\x87\xa0\xeb\x4a\x56\xdb\x5d\x94\x19\x71\xf3\xf2\xcf\x58\xae\xd8\x4d\xb3\x57\x2f\xa2\xf1\x30\x9a\x4a\x04\xd1\xd8\x52\x9a\x2c\x9b\x8f\x22\xb9\x1a\x22\x1d\xf3\xcc\x56\x94\xd9\xaa\x12\x5b\x65\xb3\x9f\xd9\xa3\x4c\x42\xd4\x35\xf3\x49\x67\x07\x8d\xe2\x20\xb6\x50\x36\xf7\xa5\x39\xce\x79\x90\x63\x02\x64\x06\xe0\xa4\xaf\xc8\x7f\x12\xe5\x89\xd1\x56\x77\x92\x66\x77\x1c\x44\x87\xd1\x24\xdd\x9c\x4c\x87\x93\xdf\x2f\x69\x9c\x59\x44\x51\x33\x53\x43\x55\x25\xcc\x12\x8d\xb8\xa3\x60\x86\x77\x1c\x3b\x73\x18\x14\x26\x0c\x35\x35\x6c\xcb\xab\x8c\x0b\x82\x73\x92\x4c\xe2\x9f\x22\x5a\xf6\xd2\x29\xf1\xf2\xcd\x7f\x15\x1b\x2a\x77\x0d\xf4\x8e\xc0\x42\xaa\x42\x58\xe6\x78\xe9\x3a\xc1\xdc\xa8\xd4\x6a\x56\xfd\x58\x1d\x21\xa4\xd4\x0c\x95\xa8\x34\x68\x38\x3a\xa7\x54\x18\xc4\x2a\x95\xca\x4e\xe6\x9c\xd5\xb7\x12\xc2\x3d\x41\x7d\xdf\x3d\x5f\xe0\xc9\xe1\x0a\x71\x54\xae\x72\xcb\x08\x7c\x5f\x57\x29\x37\x0d\xa2\x22\xd5\x0a\x1c\x5b\x4f\xd6\x5c\x5d\x25\x9a\x8e\x10\xe1\x9a\x52\xda\x2a\x2b\x08\x21\x4a\x54\xc2\xab\x01\x52\x53\xca\xc3\xa6\xb3\x6a\x75\x90\x82\x14\x45\x41\x48\xe3\x4c\x28\x0a\xc5\x94\x2a\x18\x2b\x08\x7d\x55\xa8\xa1\x51\x3f\x53\x5f\x3a\x7f\xdb\x6d\xe9\xe1\xad\xa7\xde\xf6\xd4\x84\x30\x95\x70\x9b\xab\x7c\x83\x58\x9c\x62\x62\x3a\xfc\x64\xe1\x68\x9d\x27\xc9\xda\x37\x78\xb5\xd5\xb6\x0c\x97\x63\xbe\x7c\xa1\xd8\xb9\x5c\xd7\x29\x52\x1f\xe0\x82\x23\x45\xc1\xca\x83\x5f\xb8\x2f\x69\x07\x9c\xf0\xd3\xab\x57\xaf\x5e\x5d\xa5\x94\xa9\x0a\x0f\xa2\xc4\x50\x35\x4e\x96\xef\x5e\x52\x11\x0d\x57\x2f\x2d\xab\x06\xdd\x4e\x09\xe2\xb1\xa1\x10\xce\x95\xfe\x43\x0f\x3e\xb0\xaa\x28\x98\xa8\x8a\x13\x46\x5c\x38\xb4\x38\xdd\x3e\x54\xae\x6e\x4d\xa7\x65\x15\x65\x4f\x43\x0a\xe3\xc4\x59\xe2\x2a\x4b\xb6\x46\x3d\x1d\xc9\xf9\xcc\x78\xe3\xaf\xa1\x77\x29\x7b\x40\xc1\x83\x86\x64\x7d\xd8\x85\xdb\xe1\x6e\x78\x08\x9e\x80\x2f\xa1\x02\xcc\xf6\xe0\xa7\xe1\x90\x74\x78\x7e\xda\x99\xc1\x93\x37\x66\xf0\xb3\x32\x06\xf7\x24\xfc\xac\x7c\x75\x31\x1c\x82\x9f\x96\x12\x9b\x4b\x39\x80\x99\xb1\x3f\x03\x63\xb0\x07\xf6\xe2\xb8\xbf\x38\x7e\xc8\x99\xc1\x6d\xfb\x33\xb8\x6d\xb0\x07\x17\x16\x3d\x3d\xbc\x38\xfe\xbe\x39\x97\xca\xdb\x06\x79\x5f\xef\xdf\x9f\xc1\xfb\x07\xf9\x1d\x1c\x54\x44\x66\xf2\x97\xf7\xf3\xe3\xbf\xb5\x3f\x83\xdf\x1a\xc8\x7e\x11\xda\x9f\x21\x34\x4f\xf5\x1e\x4e\x46\xf3\x05\xbf\xa9\xb4\xa3\x58\x73\x6c\xa1\x78\x24\xcb\x67\x10\x0b\xa4\xbb\xa5\x44\xb9\xa7\x96\x19\x75\xd9\x27\x21\x63\x63\x92\xa3\x2d\x33\xbc\x5a\x34\xcd\xce\xe8\x5a\x28\x96\xd0\x30\x53\x0b\xc5\x11\xad\xa2\x5d\x14\xb3\x3e\x3a\x00\xfe\x9d\xc6\x34\x66\x41\xda\x6a\xa6\x32\xc9\x27\x4f\x37\x1a\xc6\xf2\x1b\x9b\x0c\xa7\xb2\x2a\x71\x17\x6d\xca\xae\xbb\x93\x74\x9c\x69\x7b\x29\xa7\x93\xae\x24\xc6\x92\x9f\xda\x34\xce\xad\xc4\x94\x32\x1a\xc9\x09\x24\xcf\x92\x4c\x65\x36\xd3\x3c\x2f\xdc\x92\x10\x92\x99\x57\x26\x91\xdb\x32\xf7\x2b\x18\x45\x39\x2d\x41\xd6\x67\x37\xa0\x61\x4b\xb2\xfc\xa7\x93\xdc\x38\x44\x96\xdf\xe5\xc2\x33\x46\x14\x2b\x2a\xb1\x49\x81\xbb\xc5\x41\x4c\x54\x5b\xd5\x35\x3f\xf0\xb5\x2f\xfb\x1d\x87\x8e\xbe\xad\x69\x0a\x56\xb8\xc6\x95\x3b\x55\xac\x60\x15\x53\x1e\x44\x87\x9c\xa6\xb0\xab\x0e\xf3\x5d\xc3\xa8\x7f\x5d\xa8\x8e\xad\xa9\xd5\xdf\x37\xb8\x4a\x34\xa6\x7e\x4f\x60\x13\x84\xb0\x61\xeb\x44\x2f\x1e\xaf\x32\x84\x11\x15\xd9\x47\x49\x78\x4c\x18\xe6\x1e\x21\xb6\xe3\x32\xae\xe2\x78\x50\x54\x88\x82\x54\x2e\x9c\x8a\x20\xb6\xaa\x5e\x51\x78\x3c\x8a\x28\x57\x88\x97\xfa\x6a\xd0\xf1\x75\xc2\xb8\x28\x4f\x15\x84\xa9\xd5\x0b\x54\x8c\xb8\xed\x1b\xdc\xe7\x2a\x56\xcd\x42\x12\x8b\xcc\x93\x33\xb8\x5d\x11\x82\xa8\x76\xc4\x75\xcb\x30\x99\x8a\x39\xe7\xaa\xb3\x64\x53\xdb\xd6\x31\x12\xae\xa1\x20\x85\xb9\x8e\x4d\x39\x23\xb4\xb8\x51\x24\x1a\x15\x06\xbf\x5b\xc5\xaa\x5d\xb4\xed\x9a\xa3\xba\x01\xdd\x53\x35\xce\x94\xf4\x7c\x5a\x4b\x6f\x3b\xa6\x7a\x99\x2e\xe0\x99\x6d\xab\x9e\x20\x0a\xe6\x1a\x27\x4b\xd4\x0b\x23\x8d\x7b\x44\x14\x7f\x4b\x06\xd1\x7a\xb7\xa7\xf7\xbf\x9d\x3b\x06\x22\x08\x33\xc3\x50\x91\x8f\x11\xe2\xe6\xd4\x5f\x2a\xe9\x3c\x08\xfd\x9f\x10\x6d\x9f\x87\x9e\x46\x3f\xf4\x92\x8a\x09\xe7\x9e\xef\x33\xc1\x14\x85\xd3\xf7\xbf\x5d\x25\x44\xe1\x2a\x52\xd5\xcc\x19\xf3\x55\x82\x95\xfe\xbd\xa9\x6a\x34\xcf\x94\x44\x8d\xeb\x41\x3b\x53\x0e\xa4\xf7\xb6\x21\x41\xea\x79\x82\x99\x56\x3e\x5c\x55\xb1\x6b\x57\xaa\x55\x97\xab\x5c\x8f\x87\x31\x2f\x0a\xac\x92\xca\xd9\x9a\xa2\x50\xa6\xc4\x6b\xb1\xd1\x70\x38\x26\xb5\x33\x2d\xd1\x74\x94\xac\x7f\x4c\x49\xef\xbe\xa1\xaa\x13\xa4\x72\x6e\xd7\x6c\x51\xe4\x2a\x42\x2a\x42\x98\xa4\xb7\xf7\x88\xaa\xab\xaa\xa2\x9e\xb0\xdb\x36\x89\xd7\x03\xab\xcc\x89\x2e\x31\xd1\xde\xa5\x7c\x5d\xf9\x35\xb5\x03\x16\x94\xa1\x07\x13\xb8\x0a\xaf\x00\xf8\xa3\x49\xc4\xe2\x03\x52\x74\xc9\xb1\x2e\x43\xbf\xe8\x0f\xd2\xe9\xba\x72\x6d\x4b\xae\x5c\x59\x98\x0d\xa3\x91\x24\x6b\x94\x4c\x06\x32\xc5\x2e\x9b\x4e\x68\x5f\xd2\x3a\x0e\xab\xca\x34\xb0\x14\x16\xc5\x07\xf0\xe9\xb2\x70\xb2\x95\x83\x29\xb1\xe6\x64\x9c\x7d\x88\xd1\x0e\x8a\x3e\x4d\x09\x23\x3b\x8a\x2e\x34\xbb\x5c\x2c\xa2\x5f\x55\x2c\xc7\xa5\xa7\x89\x63\x0b\xbb\xf6\x57\x74\x8f\x54\x8f\x54\x4d\xd7\xb6\xf4\xd6\xa5\x87\x4f\x2d\xdf\x59\xd5\x4d\xdd\x1c\x4c\x27\x83\x60\x3c\x1d\x7a\x41\x33\x20\x9e\x5a\xdc\xac\x05\x5e\xa7\xd3\xb2\x8b\x1b\x45\xbb\x63\x17\x57\x7b\xbd\x88\x70\xce\xa3\xc6\xf6\xd6\x76\x83\x99\x86\x4e\x84\x17\xea\x48\x51\x6b\xe3\xba\x1d\xd9\xc5\xed\xa2\x11\x44\xa5\x50\xb7\x9c\xc8\xd3\xc3\x30\x31\x55\xd5\x59\x19\xac\x79\xef\x25\xb6\x49\x94\x7f\x42\x39\x61\xdc\x34\x74\xaa\x61\x2b\x38\x2a\x4c\xc3\xd2\x03\x89\x37\xea\x9c\x21\x86\x5e\xdc\x0d\x74\xea\xfa\xb8\xba\xf5\xc9\xa5\xd1\x13\x3b\xd4\xa1\x8d\xed\xc9\x24\xad\x6d\x6e\x6e\x35\x0c\xa2\x6a\xd5\xe3\x45\x66\x86\x71\xd1\x23\x55\x62\xeb\xb6\xde\x68\x35\x74\x8e\x18\x37\x8c\xa5\xd5\x15\x5b\xd7\x14\x6e\x16\x0b\x05\x43\xc1\x54\x55\x7d\x2d\xd2\x8b\xa3\x82\x5e\x2d\x05\xbc\x18\x69\x3a\xa7\x88\x59\xa4\x76\xe8\xd0\xe1\xea\x49\xac\x31\x15\x08\x04\xe8\xe7\xd0\x12\xfe\x12\x68\xe0\xc3\x12\xf4\xe0\x0e\x78\xf7\x1e\x14\xde\x14\x0e\xd4\xf7\x61\x06\x17\x07\x33\xb8\x3c\x98\xc1\xf1\xc1\x0c\x4e\x0e\xf6\x24\xd6\x75\xee\x21\xef\x42\x51\xaa\xd5\xa2\x33\x03\x7c\x63\x0f\x74\x38\x09\x17\xe7\x6b\xc2\xf9\xb1\xcc\xa2\x39\xd8\xb7\xbc\x90\x7a\x73\x49\x7a\xc1\xad\xc0\x52\x6a\x79\x25\x00\xcb\xcc\x58\x89\x08\x1a\x66\x9a\x72\x33\x1d\xf7\x24\x7a\xed\x64\x3a\xde\xcd\x79\xbb\x47\xf1\x30\x0a\xa8\xa4\x46\x69\x05\x99\x65\x20\x31\x05\x64\x70\x28\x8e\x7e\x37\xbd\xbf\xcb\x19\x26\x2f\x7f\x5f\xc2\x18\xd7\x2b\x0e\xb1\x2e\x34\x43\x6c\x9a\x1b\x97\x53\xc3\x6e\xd4\xca\xba\xa3\x9b\xc7\xac\xd0\x71\xf4\xca\x24\x30\x75\x86\x83\xa2\xef\xe8\x9f\x56\x54\x66\x32\xa2\xe8\x9b\x76\xa7\xd7\x0b\x30\xa6\x8a\xa6\x63\xa2\x6b\x3a\x31\x91\x93\x8c\xb7\x0e\x55\xec\xe1\xd1\xe3\xdf\x1f\x1c\xbb\xed\x62\xb3\x88\xf5\x8d\xb7\x1c\xc6\x2a\x09\x0a\x81\x59\x3c\x6e\x77\x7a\x2b\xbe\x8e\xff\x1a\xd1\x2d\xdd\x4d\x4a\xba\x8a\xa9\x29\x53\xf6\xde\x9b\x6c\xf4\x57\x02\x45\x95\xb1\xd7\x10\x55\xd0\x7b\x71\x45\xc6\x1d\x52\x38\x06\x8f\xcb\xd8\xeb\xf9\xff\x98\xd8\x2b\x96\xb1\x00\xc9\x2a\x74\x10\x7d\x95\x6b\x18\x6f\x8a\x08\xe0\xff\xe7\xf1\xd7\xdf\x0f\x12\x5f\x73\xe2\xa2\x6b\x38\xf7\xfa\xd5\xdb\x46\x5a\x39\xa4\xd6\xae\x9a\xd9\x52\x0a\x22\x84\xa8\xf4\xeb\x7e\xba\xd4\x4b\x4c\xdd\xd4\xdf\x63\x68\x65\xab\x56\x2b\xeb\x16\xc1\xba\x39\xd0\x0c\xad\x72\xcf\x40\xb3\x2d\x5b\xd7\x30\x61\xe6\xbd\x3a\xd5\x09\xc2\x38\x29\xa7\x5a\x32\x1a\x8d\x12\xaf\xad\xb4\xb5\x66\x50\xbe\x33\xf5\x87\x5b\x87\xcb\x5a\x33\x40\xbc\x71\xe8\xf0\x6e\xba\xeb\xa7\x9d\x8e\x8f\x31\x22\x26\x71\x0c\xe4\x64\x7e\x80\xf9\xf3\x8e\x66\x0c\xae\xa6\xf2\x6a\x5f\xd5\x84\x8a\xac\x43\x4f\x6f\x6f\x3f\xbd\x65\x3a\x9e\xaa\xea\x86\xad\xbf\x64\x68\xc5\x4a\x49\x4b\xd3\xfb\xd6\x25\x9f\xa7\x06\x1a\x60\xf4\xa7\x95\x21\x7e\x11\x74\xf0\xa0\x06\xcb\x70\x04\x2e\xc2\x65\xf8\x5e\xf8\xd3\xf0\xd3\x7b\x90\x48\x6c\x94\x1c\xdb\xe4\xbb\xb2\xf7\xf7\x27\x07\x33\x78\x7a\x90\x19\x14\x4f\xc3\x4f\xce\xb3\x18\x0e\x24\xb1\x90\x0a\x0b\xa9\xbe\x90\x3a\x0b\xa9\xb7\x90\x4e\x2e\xa4\x4b\x0b\xe9\xf2\x42\xba\x63\x21\xdd\xb9\x90\xee\x5f\x48\x9f\x9c\x4b\x79\xc6\x41\x0e\xb3\x9a\x19\xd6\x12\xcb\xb4\x63\xe1\x38\xcc\xb3\x89\x3b\x8b\x8f\xa1\x9b\xd9\x18\xb2\xe2\x36\x9d\x8c\x9b\x74\x05\x6d\x4e\xe4\xc1\x58\x02\x49\xa7\xdd\x66\xda\xcd\xc6\x78\xdc\x98\xca\x95\xa9\x80\xb2\x69\x9c\x93\xc2\xd0\xbe\xc2\x5a\x92\xb9\x7b\x9c\x66\x0a\x71\x9a\x4e\x86\x51\x67\xf1\x11\x59\x48\xc6\x64\xb3\x97\x63\xbc\x48\xb0\x8b\xde\xea\x96\xc2\xf5\xd5\x96\x56\x3c\x8a\x3e\xd8\xba\xbd\x25\xbe\xfb\xe6\x23\xc4\x12\x8a\xc6\xe3\x82\x66\xa1\xf5\x50\x57\x54\x5e\x30\x15\xfe\xbf\x9c\xf6\x5c\xb3\xde\xa8\x9b\x9c\x17\x87\x05\x61\xa1\x46\xd5\x55\x1d\x62\x34\x4f\x36\xb9\xc8\x76\x71\x4b\xdc\xbc\x29\x0a\x1a\xc7\x0a\x7f\xb7\xe0\x82\xab\x7e\xe8\xab\x9a\xe3\x3a\xda\x45\x55\x51\x28\xd7\x30\xe7\x6a\xba\xb1\xe1\xaa\x54\xe8\xe8\xb0\xe9\xd9\x96\xec\x4a\x53\x14\x85\xb8\x05\xdf\x52\x3f\xca\x89\xa6\x12\x8a\xf8\x5a\x71\xb7\xc5\x31\xfa\xdf\xb9\xef\x72\xaa\xd8\x15\xbe\xa2\x61\xee\x71\xf1\x35\x1e\x86\x81\xf6\x41\xb7\xc6\x7b\x3b\xbd\xb5\x70\xb0\x3e\x2c\x98\xab\x9b\xdb\x0f\x5c\xed\x3d\xd0\xc4\x54\xeb\xdd\xd5\x33\x8a\xdd\x75\x77\xeb\xf8\xa9\x6a\x84\x79\xef\x9e\x11\xe6\x6e\xe4\x8a\x58\x77\x22\x57\x0b\xc2\x40\x33\x8c\x95\x47\x46\x9a\xeb\x87\x06\x51\x88\xa2\x12\x4e\xd5\xec\x01\xca\x5a\x7a\x68\x73\xd2\xe4\x9c\xaf\x9b\xf5\x76\xc7\xe5\xf8\x8b\x2a\x37\xb9\x1d\x26\x5c\x88\x70\x6d\xd0\x0f\xdf\xda\xbb\xdc\xc4\xa0\x03\x41\xef\x52\x56\xe6\xdf\x75\x1e\x4f\x3c\x2c\x51\x04\x5f\x85\xbf\x04\x7f\x6e\x0f\x7e\x04\x3e\x20\x15\xa5\x07\x1f\x80\x1f\x99\x23\x57\x1d\x48\x1f\x9f\x4b\x33\xf8\x11\x67\x06\x3f\x7a\x23\xdf\xbe\x7e\x03\x66\xf0\xe0\x42\x2f\xec\xc1\x2e\x38\x73\x5d\xeb\xcc\x81\x97\x0f\x34\x85\x37\xdf\xb3\x07\xe1\x5c\x67\x64\xdd\x1f\xec\xab\x2c\xa4\xe6\xe2\xe8\xda\x5c\xca\x41\x9b\x8f\xec\x67\x5e\xe4\x41\xaf\xbb\x73\x63\x38\xeb\xfd\x17\xf7\xff\x03\xd1\x49\xbc\x88\x4e\x76\xfe\x5f\x5b\x0d\xfa\x37\x02\x94\x79\x2d\xf0\x41\x84\xb2\x2c\x4b\x7a\xfe\x6f\x63\x94\xbf\x6c\x85\x36\x37\xfc\xd0\xd2\x8c\xb3\x4e\x71\xe7\x8d\x6a\xbc\xcc\xdf\x53\x0a\x28\x62\xc1\xc8\xb7\xb1\xca\x0b\x9c\xdd\xfc\x47\x3c\x76\x55\x63\x83\xb1\xb9\x96\x53\xff\x54\x6d\x37\xd5\xb9\xce\xef\x17\x3c\x8e\xc7\x8e\xa1\x2a\x4c\xef\x70\x9d\xc5\x67\xba\x5c\x18\x06\xe3\x8a\x4a\xf5\xb3\x9c\xc8\x75\xa6\x20\xae\x72\x7f\xb9\xd7\xf3\xed\xf2\xf7\x05\x54\x55\x78\x95\x99\xc2\x60\xba\x69\x62\x16\xc5\x21\xf7\x05\xe6\x95\xa3\x4f\x2b\xaa\x6a\x7b\x8e\x67\x0b\xcb\xf4\x6c\x4e\xa9\x6e\x68\x84\xf3\x28\x74\x55\x4e\x38\xa5\x58\x75\x4a\xdc\xae\x96\x4b\xc2\x08\xfc\x40\x39\xc5\x2b\x56\x7c\xa6\x62\x2f\xf5\x37\x62\x5e\xb1\xfc\x9e\x97\xf4\x78\x7d\x69\xcd\x37\x90\xef\x2c\xf7\x37\x22\xc7\xe5\xb5\x33\xbd\xd2\xfa\xfa\xa8\x3a\xaa\x1d\xa9\x61\x05\xa9\x9a\x6a\xe9\xc8\xe4\x5c\x7c\xd2\xe0\x7a\xf7\x5c\xb5\x7a\x2c\xbd\xce\x34\x8c\xf4\xfe\x03\x6b\xfd\xfb\xfb\xba\x65\xaa\x2a\xd7\x0c\xfe\x6e\x4d\xde\x57\xa5\x7e\x6b\x2a\x57\x31\xb9\x27\x64\x52\x99\x9e\xdd\xbc\x5d\xab\xb7\x7c\x3b\x89\x0b\xb6\xbf\x3e\xd9\x2a\x71\xb3\xea\xaf\xf6\xfb\xbe\xa8\x54\x2b\x82\x47\xa1\x87\x73\xa3\xfc\x6c\x4d\xa5\x0a\x61\xba\xdf\xaa\xd7\xec\xda\x7a\xcc\xb2\x1b\xa0\x32\x68\x89\xa1\x08\x1f\x46\x2f\x2b\x06\x84\x30\x84\xcb\x00\x3e\x93\xa8\x67\xa3\x68\x32\x4d\x9b\x92\x74\x7a\xee\xfb\xe4\xf4\x8e\x99\x21\x27\x63\x00\x7d\xa5\x2b\x31\xef\x25\x07\x64\xbe\xb8\x25\x71\xc9\x76\x50\x77\x07\xbf\x3a\x60\xa1\xcb\x98\xac\xcb\xed\x5d\x28\x85\x1b\xfd\xae\xb0\xe2\xe7\x93\xb4\xec\xaa\x56\x18\xea\xd5\x66\xc7\x65\x86\x61\x8b\xc0\x0b\x58\x27\x14\x9a\x66\x46\xd8\x34\x4d\x5c\x3e\x62\x59\x84\xfb\x7a\xd8\xec\xac\xd6\x96\x2f\x37\x45\xe6\x6c\xb0\xee\xf4\x24\xfa\x0b\x83\x64\x7d\x38\x2e\x63\xc3\xd0\xac\x42\x0b\xb3\xb0\xd0\x7b\xcb\x23\x7a\x63\x69\x25\x2c\x6f\x95\x18\xc1\xd8\x10\x04\x37\xaf\x2e\x5b\x2d\x4a\xa9\xa1\x3b\x82\x60\xc6\xea\xcd\x70\x30\x58\x71\xad\x5e\xb7\xa6\xb2\x72\x53\x2f\x95\x4b\xfa\xf2\x2d\x87\xd7\x00\x54\x10\xf0\x31\x7c\x06\xdd\xfe\x9f\xcc\xf9\xde\xf9\x43\xe4\x7c\xff\x5b\x7f\x98\x9c\xef\x7f\xf7\x0f\x97\xf3\xdd\x80\x8f\xa9\xab\xe8\x22\x94\xa1\x03\x67\xe0\x7d\xf0\xb0\xfc\x7d\xf3\x75\x99\xa3\xd9\x9b\xb7\x32\x83\x47\x9c\x19\x3c\xb0\x3f\x83\xd1\x8d\x19\x44\xfb\xf9\xdf\x6f\x97\xab\x31\x8f\xc0\xdb\xe7\xf3\xf8\x03\x30\xca\x13\x87\xf7\x67\x90\x0e\xf2\x31\x39\xb4\x3f\x83\xb7\x3b\x33\x38\xb6\x3f\x83\x63\x12\xfa\xf8\x3b\xc6\x41\x99\xd3\x2f\x5a\x6a\xf3\x0f\x46\xa2\x49\xdf\x34\x12\x55\x45\x92\x45\x66\x83\xd1\xb4\xd4\x8e\x1c\x0f\x1b\xc9\x6c\x0f\x4b\x6d\x76\xe5\x80\xa4\x9b\x7f\x30\x20\x38\xfa\xb7\x46\x64\xe5\xfd\x1f\xfb\xe3\x1f\x7b\xff\x8a\x1c\x93\xe4\xca\x93\xcf\x3c\x75\xdf\xcd\x8b\xff\xce\x71\xa9\x3d\xfa\xcc\x07\x9e\x79\xa4\x9e\x8d\x4d\xf3\xad\xcf\x7d\xe8\xd9\xc7\x94\x27\x16\x43\xc4\x34\x4d\x63\xc1\xf9\x6b\x6f\x7f\xcb\x95\x62\x3e\x4e\x0a\xd6\xac\xc0\xf2\xd3\x77\x7e\xcf\xf7\x7f\xef\xd3\xcb\xff\xc6\x40\x65\xb6\x1d\x62\xba\x1c\x2a\x42\x55\x8c\x16\xa3\x55\x25\x7f\x30\x58\x32\x0a\x25\xc7\x0b\x21\x05\x21\x77\x3e\x68\x06\xe6\x5c\x10\xce\x32\x0f\x5e\x0e\x9b\x6d\x79\xf6\x98\x17\x2d\x42\x28\x53\x15\x95\x65\x27\xe6\x71\x50\x0b\x3e\xa8\xfc\xdd\x3f\xca\x27\xfd\x2f\x25\x89\xf3\xbf\xa0\x7c\xd2\xc1\x7f\x65\xe9\x99\x7f\x94\x4f\xfa\x47\xf9\xa4\x02\x02\xf8\x55\xb5\x86\x9b\x20\x20\x84\x16\x0c\x60\x1b\xce\xc1\x1d\x72\xc1\xf2\x47\xd1\xfb\xd0\xe5\x3d\xf8\x0d\xb8\x20\x27\xa4\xdf\x70\x66\x60\xdc\xd8\x83\x97\xe0\x02\xfc\x46\x9e\x4a\x39\x98\xc1\x0f\x48\x44\xfd\x97\xe0\x07\xb2\x3d\x68\xfb\xc6\x1e\xf8\xf0\x03\x68\x3b\xcf\x19\x5d\xb4\xbc\xe0\xcc\xe0\x03\xfb\x7b\xf0\xb1\xc5\x9e\xac\xb7\x1f\x9a\xb3\xb1\xbc\x32\x47\x98\xfa\xc7\xfb\x7b\xa8\x3e\x6f\x01\x33\xf4\xbe\xc1\x0c\x7e\x6f\x90\xf9\x97\x2f\xcc\xb5\xea\xef\xa1\xf7\xcd\x75\xe9\x81\xe4\x2f\xa4\xd2\x42\x6a\x2c\xa4\xf6\x42\x5a\x5f\x48\x5b\x0b\xe9\xf4\x42\xba\x75\x21\xdd\x09\x2f\xc0\xfd\x52\xba\x77\xb1\xef\x63\x8b\x7d\x1f\x5f\xec\xfb\xa1\x85\xf4\x4b\x07\x12\xaa\x1f\xb4\x43\xbb\xf3\x7d\x33\x78\xc1\x99\xa1\x47\xf6\xf7\xd0\xbb\xe7\xc7\xd6\x37\x90\xe4\x23\x0f\xb3\xa9\x76\xca\xf2\x0c\xd2\x1c\x1e\x08\x4d\x25\xbc\x5a\x97\xc5\x55\x3c\x9d\x6b\xb2\x38\x88\xc2\x78\x8a\xe7\xed\x77\xd0\x54\xc6\x17\x51\x2b\x8e\x24\x3c\x75\xbc\x93\x9f\x3b\x67\x5b\x64\xd1\x8e\x12\x4f\xa2\x38\xb2\x24\xea\xc0\x68\x33\x95\x2e\x8a\x24\x00\x18\x4f\x65\xe9\x50\x76\x95\x1d\xa5\x53\xc5\x35\x64\xe1\xd0\xc2\x36\xea\x4b\xdd\x35\x92\x71\x7e\xa9\xe0\x72\x35\x97\x5a\x4a\x37\x60\xb4\x95\x29\xd6\xec\x5f\xee\x71\xb7\xf2\x9a\xdf\x3c\x9e\xde\xca\xf1\xb0\xfb\x4a\x57\x62\xc1\xb3\xcc\xcd\xce\x19\x48\x6a\x99\x4a\xcd\x43\xfc\x68\x3a\x8a\x02\x0b\xc9\x7b\x0a\x68\x28\x53\x54\xd1\x78\x73\x92\x93\x93\x4c\xab\x0a\xcd\xcc\x64\xb9\x6c\x20\x31\x2d\x52\x4b\x65\xad\x6e\x8e\x57\x94\x9b\xd0\xb9\x76\x46\x6f\xf7\x97\x8b\x66\xd5\x2c\x14\x8b\xd6\xdf\x6e\xba\x66\xa3\x96\xe0\x60\x19\x1d\x73\x3c\x8d\xe0\xfa\x5d\xa9\x5e\x3c\xfa\xbf\x72\x17\xeb\xc2\x64\x26\x8d\xca\x37\xd7\xac\xa6\xc9\x35\xd7\x7b\xc5\x8c\xcc\x24\x29\x39\x66\xd3\x74\xea\x8d\x3a\x7a\xcc\xef\x06\x9a\x1f\x08\xfd\xe6\x17\x58\xb9\x68\xd3\x46\x15\x7d\xa0\x32\x1d\x8f\x8b\x4e\xbd\xd1\x70\xa8\x6d\x3a\xe5\x42\xc9\xb1\x32\x3f\x00\x23\xec\x37\x6a\x55\xc7\x67\x98\x72\x4c\x4f\xeb\x8e\x6d\xd2\x2b\x05\xac\x9b\x1a\x36\x6d\xca\x39\x41\x4f\xe2\x4a\xb3\x4e\x5d\x5d\x27\xc8\xac\x35\xea\xe6\xed\xd8\x77\xa8\x46\x89\x4a\x68\x8b\x06\xba\xa6\xdb\x0e\x56\x10\xa1\xba\xeb\x3a\xba\x69\x6a\x86\xe9\x94\x4a\x25\x47\x51\x05\x43\x8c\x33\x55\xd7\x83\x62\x60\x51\x99\x31\x12\xb0\xa0\x45\x83\x66\xbd\xe9\x33\x95\x52\xac\x50\x84\x19\x6d\x6c\x35\x30\x52\x08\xa5\x48\x55\x25\x3f\x70\x54\x28\xa6\xed\xc2\x2d\xdf\x7f\x8b\x4f\x89\xaa\xb3\xa6\xaf\x6b\x8c\x66\x66\x8b\xa2\x7a\x66\x31\x89\x74\x9f\x09\x6a\xad\xf9\x94\xeb\xb6\x69\x6a\x0a\xc2\x4c\xa5\x41\x35\xd0\xa2\xd0\x67\xac\x5a\xaf\x30\xad\xda\x2d\xd8\xa6\x29\xf8\xd1\x60\xcd\x64\x7a\x71\x52\x67\x6e\x60\xd6\x98\x59\xa9\x94\x4d\x54\xa2\x1a\x63\x35\x8b\x73\x82\x8f\x1c\xd1\x64\x75\xa0\x76\xde\xf0\x0b\xa6\x69\x33\xbf\x12\x30\x7e\xfe\x61\x17\x1b\xba\x8a\x9d\x56\xbb\xf5\xb8\xdf\x0d\x78\xff\x6a\xbf\x57\x40\x61\xd0\xf5\x09\x41\x38\xe8\xfa\x18\x11\xd2\x64\xca\x61\xdd\x2a\xd5\x1e\x0f\xda\xe9\x52\x54\xbf\xf0\x08\x37\x04\xd6\x31\xe1\x8d\xad\x86\xac\xe5\x32\xb9\xd9\x38\x79\xea\x54\x1d\xab\x9c\x1f\x7e\xef\x61\x2a\x84\xa5\x73\xae\xe2\x87\xdd\xa3\x6b\xf7\x3f\xf0\xd0\x86\xd9\x32\xd7\x1e\x7c\xf8\xc1\x47\x7a\xb7\xdf\x7a\xbe\xd7\xd4\x8b\xa5\xb2\xa9\x53\x84\xa9\xa7\x5b\x42\x30\x4c\x38\x3f\x5d\x5c\x29\x3a\x4b\xcb\x6d\x13\x1b\x96\x81\xb1\x6d\x32\xcc\x92\x42\x92\xb9\x38\x39\xcf\x89\x6e\x98\x74\xed\x9e\x2b\x77\xaf\xe0\x52\x7b\xc9\xc9\xee\x6a\xed\xb1\xb5\x20\x0d\x58\xd6\x80\x29\xba\x1f\xf8\xba\xbf\x3e\x1c\xc6\x2e\xd6\x35\x1d\x33\xd3\x34\xa9\x53\x2d\x15\x4d\x73\x3c\x48\x1c\x1e\x14\xa8\xd6\xec\x76\x9d\xb5\x4b\xdd\xde\xdd\x57\xee\x5d\x63\x8e\xe7\x6b\xcc\x60\xd9\xc8\xa5\x0f\x2f\x51\xa5\x71\x62\x29\xe8\x76\x5a\x2e\x0e\x8b\x25\xdd\x2c\x9a\x7e\xf6\xce\x70\x7d\xed\xce\xcb\x77\xae\xb9\x8a\xd7\x58\x59\x5b\x75\x3f\x63\x9a\x54\x65\x96\x4e\x1b\xe7\x1a\x8d\x73\x0d\x4d\x50\x82\x33\x3b\x52\x80\xf7\xc6\xd7\xd0\xd3\xca\xdf\x03\x06\x2e\x54\x60\x08\xc7\xe1\x09\xf8\x3c\x7c\x11\xbe\x06\xbf\x06\x7f\x1f\x6e\x83\x19\xfc\x7d\x19\x8b\xfe\x94\xd4\x7d\x1f\x80\x8f\xcb\x2d\x83\x4f\xbd\x29\x26\x5d\xd9\x9f\x41\x65\x90\x43\xe6\xff\x89\xfd\x1c\xa2\x6f\x0d\x3e\x0e\x1f\x90\x2d\x3e\x20\xd3\xf3\x73\x4e\xe7\xec\x2b\xea\x32\xc9\x55\x35\x49\xa7\x96\xd2\x6c\xd1\x28\x1c\x4e\x72\x5c\xef\xb0\x8a\x73\xba\x76\xb9\x46\x36\xa5\xe1\x01\x6c\x89\x5c\x76\xc8\x1d\xdc\x79\x0e\xc6\x9c\x7e\x33\xa7\x6f\x1f\x4d\xfb\x0a\x8d\x23\x99\x59\xc9\xc2\x66\x1f\x35\x6d\x14\x44\x23\x09\x04\x39\x27\x6e\x6e\x45\x79\x2a\xbb\x85\x6c\xd4\xca\x49\x48\x72\xc0\x01\x94\x27\x3c\x4a\x55\x28\xb3\xe1\xd9\x9c\xe8\x6d\xca\xa4\xdb\x3c\x9c\x8c\x36\xd3\x3c\xd9\x52\xba\x82\xe9\xa4\x8f\x64\x10\xef\xaf\x0b\xa3\x2a\x42\x7a\x24\xb5\x19\x53\xb1\xa1\x5e\x15\x8e\xe5\x08\x42\xa2\xc8\xfd\x9f\x0d\xae\x52\x3b\xae\xc5\xf1\xc6\x5a\x2a\x9a\xb7\x35\xb7\xd7\x5f\x4e\x34\xd7\x75\xb9\xa6\x51\x15\xc7\xd5\xbe\xd5\xac\xc5\x98\xac\xac\x45\xeb\x6b\xcb\xae\xa1\x30\x03\xbf\x2d\x2e\x0a\x44\x0d\x21\xc9\x5f\x6d\xad\xd2\x4e\x3f\x44\x6d\xa2\x09\x8d\x62\x6a\xd9\x2e\x8f\x7d\xe1\x56\xcb\x15\x57\x70\xe1\x06\x6e\xe0\xb8\xed\xc8\xaa\x96\x13\x8d\x2a\x8a\xe9\x57\xaf\x52\x8d\x91\x40\x98\xb4\x79\x36\x8e\x8b\xc2\xea\xac\x4d\x6a\xcd\xad\x97\x89\x1b\xb7\x5c\xb7\xd0\xa8\x51\x15\x21\x1c\x09\x62\xdc\x76\x84\xa8\x14\x9b\xb6\x43\x14\x97\xea\x4a\xd4\x11\x51\xe0\x50\x8c\x10\x17\x63\x77\x18\x9b\xd4\xa3\x8c\x84\xe2\xd1\xf1\x11\x4c\xb9\xa1\x89\xe5\x14\x2b\x4a\xbc\x16\x31\xf4\xa8\x51\xa9\x55\x85\xdb\x69\xc4\x18\x53\x3f\x76\x91\x88\x1f\x7f\x87\xd1\xc8\x1e\x9e\xaa\xba\xc0\x86\x72\xbb\x28\xd6\x3a\xf1\xe8\xa1\x8a\x40\x46\x62\x69\x7e\x18\x8b\x88\xa4\xae\x16\x86\x3e\xe5\x8a\x4a\x3b\xae\xa3\xaa\x38\x5e\x8b\xf5\x4c\x6b\x69\x8c\x3b\x34\x61\x9c\x95\xb7\xca\x38\xa9\x96\x29\xd1\x39\x22\x8a\xb0\xda\xcd\x22\xde\x74\xda\xcd\xaa\xe1\x26\xc2\xad\x2c\x3d\xbc\x56\xde\xea\xb7\x34\xf7\x0c\x0d\x88\xe9\x11\xf2\x74\x47\x8b\x92\x82\x10\xd5\x66\x7b\xc9\x89\xd6\x62\x8a\x95\xf8\x64\xbf\x78\xf4\xd0\xba\xc0\x44\xc5\xc2\xaa\x56\x4b\xc6\x11\xca\xdc\xdc\x4f\xba\x03\xfd\x1c\x26\xf8\x23\x60\x40\x04\x6d\x38\x01\x17\xe1\x3e\x78\x02\x3e\x0a\xff\x72\x0f\xe2\x39\xe7\x5b\x0f\x2a\x72\x7b\x15\x2e\xc9\xed\x3b\xe1\xda\x3c\xaf\xcb\x84\x77\xca\x57\xb8\x22\xf1\x27\x65\x5e\x57\x4f\xe2\x46\xa7\x72\xcd\xad\x07\x67\xa0\x07\x57\xa0\x07\x8f\x43\x0f\x9e\x83\x1e\xbc\x08\x3d\x78\x15\x7a\xf0\x59\xe8\xc1\x97\xa1\x07\xdf\x80\xde\x41\x5e\x57\x0f\xbe\x09\x3d\x99\xd7\xd5\x73\x66\xd0\xd9\xdf\x83\xdb\xe6\xfd\xef\xc1\xdd\x73\x49\x66\x56\x5d\x83\x6f\xc1\xb5\x83\xcc\xaa\x6b\x50\x80\x6b\xb0\x0c\xd7\x60\x1b\xae\xc1\x39\xb8\x06\xf7\xc1\x35\x78\x1b\x5c\x83\xe7\xe1\x1a\xbc\x04\xd7\xe0\x3a\x5c\x83\xcf\xc1\x35\xf8\x0a\x5c\x83\xd7\xe1\x9a\xcc\xac\xba\xe6\xcc\xe0\xad\xfb\x33\x78\xa7\xc4\x61\xc9\xb7\x12\x77\xfc\x85\x79\x46\xa4\x74\xbd\x95\xf4\xdf\x9b\xde\x94\x79\xe1\xff\xe1\xd4\xa8\xff\x88\x93\x95\xf4\xe0\xec\xff\xa9\x54\xb7\x5a\x5b\xeb\xbd\xd0\x6a\x34\x1b\xa3\x8a\x8f\x11\xeb\x55\xac\xb6\xdd\xec\x2c\x85\x4c\x51\x49\xef\xfc\xa7\x89\xaa\x30\xab\xdb\x4c\x82\xc1\xc6\x7a\xa4\x9a\xa6\x67\x9d\xdf\x7e\xc7\x16\xc3\x1c\xff\xf9\x4a\xcd\x6a\x6e\xaf\xaf\x86\x56\xb3\xd9\xdc\x2c\xfb\x58\x61\xbd\x92\x95\x5a\xcd\x74\x29\x60\x0a\xa6\x4b\x17\xfe\xbb\xec\x64\x3b\x6d\x25\xe1\x60\x7d\x3d\x24\x16\x33\x19\x62\xb7\x6e\xbf\x6b\x8b\x62\x86\x95\xcb\x95\x69\x85\xc5\xbd\xcd\x88\x99\x1c\xbd\x56\x3e\xba\xb3\x53\x0e\x8f\x9c\x38\xd1\xff\x6c\x48\xac\x98\x86\x2b\x6b\x1b\xe5\xd8\x2a\x6f\xac\x2d\x07\x76\xa5\xd6\x0e\x2d\xa2\x5a\xa6\xb9\xfd\xe2\xa9\xef\x8b\x2d\x2b\xf4\xac\xff\xbe\x32\x29\xf3\x48\x9e\xce\xd0\xd7\xde\x74\x7a\x40\xac\x88\x85\xbd\xb5\x61\x39\xc9\x4f\xb7\x2a\xb5\x76\x60\x13\xd5\x36\xcd\xf2\xee\x89\x53\xcd\x17\x22\xd9\x41\xf6\x3e\xea\xd0\x78\xe3\x4f\xe3\x89\x72\x53\xd2\x3f\x5d\x83\x3f\x09\x5f\x85\xdf\x84\x6f\xa3\x0a\xba\x8c\xbe\x07\x62\xd8\x43\x1c\x3e\x9f\x99\xb9\x88\x3b\x33\xb4\x71\x63\x06\x5f\xd8\x5f\xdf\x40\xd2\x30\x53\x64\x16\x44\x8e\x22\x3e\xc7\xaa\x9d\x97\xc6\x48\x64\x93\x79\xa2\x79\x4e\x58\xb0\x83\x47\xf9\x52\xae\x24\xb9\xcc\x35\x65\x76\x30\xd3\x95\x52\x25\x66\xa6\x53\x4a\x0f\x3c\x50\x3c\xca\xeb\xac\x0f\xc0\xc0\xe6\x34\x39\x39\x85\x6c\x5c\x45\x9d\xc5\x45\x87\x39\x5e\xfd\xa2\x55\x9e\x81\x9e\xb9\xaf\xca\x64\x34\xaf\xca\x96\xc7\x64\xfc\x38\xa5\x8c\xb2\xd1\x64\x98\x9d\x4b\xe2\x49\x5f\xe9\x4a\xe2\xa8\x03\xc6\xfe\x3c\x3d\x2a\x4f\x5e\x8a\xba\x61\x1e\xdb\xc1\xf3\x6b\x49\x8e\xbb\xec\x21\x27\x39\xe4\xca\x30\x8e\xe2\x61\x14\x37\x53\x69\x99\xb2\x03\x23\xb1\x3b\x7f\xfc\xdc\x3c\xcb\x9a\x47\xe8\xd7\xdd\x46\xc5\xc7\x12\x62\x2a\x74\x96\x7f\x6b\x84\xb1\x6a\xbb\xce\xda\x68\x5a\xf2\x7b\xdd\x86\x10\xe5\x6a\x59\x2f\x4d\x86\x6b\xbe\x70\x19\xfb\x17\x93\x27\x52\xdf\xcf\x54\x98\x5f\xaa\x59\x87\xbf\x6b\x1d\x63\x95\x51\xa2\x32\x2e\x84\xc1\xc5\x7a\xb1\x71\x2a\x36\xbc\x80\x9b\xad\x76\xc7\x11\x96\xe8\x94\xb7\x1e\x25\x8e\x6d\x60\xcb\xb5\x6d\x91\xde\x52\x24\x71\xb9\x66\x85\x5d\x81\x11\x66\x5c\x77\xbd\xc0\x72\x8a\x4e\xf5\xd8\x89\x93\xf5\x24\xad\x46\x1a\x21\xc4\xb2\x9c\x62\x24\x91\xa9\xd2\xbb\x56\xeb\xc7\x6f\xde\x39\x6c\x45\xbc\x6c\xf9\xc3\xed\x23\xd5\xea\xe9\x93\x5b\xce\x1d\x3f\x7a\xa6\xba\xda\x2c\x08\x57\xf1\xea\xbf\x61\x35\x1b\x35\x91\xd6\x04\xc7\xa2\xda\x0a\x37\x46\xe3\x52\x61\x38\xe8\xb9\xa5\x84\x70\x42\x30\xb1\x9c\x23\xdf\x77\x2d\xd9\x3e\x34\x8d\xa8\xc5\x38\x5f\xa9\x9f\x3c\x7e\xb4\xd4\x5e\x29\xe8\x8c\x69\x9c\x15\x97\x4b\x2b\xa5\x8e\x5e\x68\x39\x93\xdd\x53\xd5\xf4\xfc\xe9\x6d\x3f\x32\x88\x68\x92\xf2\xa0\x28\xa2\xb8\x60\x5e\x7e\xf1\x17\xb9\xe7\x7b\xbc\xb5\x3b\x5e\x71\xc2\x02\xe9\x2c\x6d\x7c\xe4\x6c\xb4\xb1\xbe\x6c\x59\xad\x61\x5a\x31\x4d\x56\x5d\x2b\x98\x1b\xbb\xb7\x76\x08\x57\x55\x22\x88\x68\x19\xec\xb7\x4a\xc7\x37\xbc\xc8\xef\xf4\x0f\x2f\x59\xe5\x72\xd5\x59\x7f\xec\xda\xfd\x4b\xa5\xc0\xc0\x26\x0a\x1b\xa5\xdd\x06\xf1\xc2\x58\xf0\x30\xf0\xe8\x03\xaf\xa2\x5f\x70\x8b\x35\x53\x44\x86\x62\x75\x1c\x62\x5f\x4a\x86\x1b\x6b\x7e\xa9\xea\x70\xca\x85\x19\xf9\x42\x53\x09\xc7\x48\x8f\xa3\xea\xa9\xb3\xa7\xde\x2b\xea\xab\xc9\xee\xc9\x53\x55\xa7\xe0\x09\xec\x94\xb1\xa6\x33\x22\x88\xe6\x39\x06\x2e\x96\x88\x51\xa9\x3b\xa5\x62\xc1\xe2\x36\x57\x38\x71\x8e\xb9\x71\x62\x15\x0a\x05\x0b\x87\x21\x0e\x49\xab\xe4\xfb\x3a\xe7\xc4\x09\xb1\xae\x31\xab\x52\x8a\x79\x69\x35\x16\x45\x5b\xf5\x71\xa1\xb3\x1a\xfa\x6b\xfd\x35\x3f\x5c\x77\x30\x13\x06\x16\x31\x11\xe5\xcb\xdb\x9b\x1f\xfc\x63\x1f\x9a\x54\x3b\xb1\x49\x5c\x6e\xd7\x5d\x96\x5a\xbd\xd1\xa1\xea\xc6\xe3\x8f\x3f\x7e\x7b\xe6\xa3\x8a\xc9\x47\x4e\xb4\x6e\x3d\xb9\xed\x3b\x36\x45\x94\x68\x9e\x1f\x6d\x1d\xdd\xad\x84\xeb\xfd\x9e\xbb\x7e\xa2\x43\x04\xb2\x7c\x4a\x09\xd5\x2d\xaf\xea\x88\xa5\xcd\x9d\xdd\xa3\xa5\xf5\x6b\x57\xef\x6c\xad\xf4\x9f\x7e\xee\xbb\x36\xea\x35\x9b\x71\x4c\x83\xa5\xf4\xc8\x87\x0e\x0f\x1f\x5e\x29\xad\xc6\x9a\x46\xb1\xd8\x79\x2b\xa3\x08\x13\x92\x6e\xee\x54\xb6\xbf\xf7\x7b\x9f\x1f\x4d\xfb\x9c\x72\xd7\xb7\x9c\xf5\x43\xbb\xd5\x8d\x07\xae\x5c\x4e\xd3\xc3\xbd\x18\xab\x0a\xd2\x08\x71\xd8\x85\x8d\xb7\xbe\xe3\xb9\x63\x8d\xd3\x3b\x1b\x42\x14\x62\x17\x53\xdd\xaf\x95\x1a\xe7\xd2\x8d\x27\x9f\x78\x64\xa5\x7c\xaa\x6c\x06\xb6\x20\xf2\x7d\x73\x36\x41\x05\x1b\xfe\xa4\xf2\x9c\xe2\x42\x00\x75\xd8\x82\x87\x00\x90\xf4\x8c\x70\x28\xf9\xf7\xa7\x99\x22\x96\xd9\x20\x12\xef\xba\x23\xed\x98\x70\x18\x57\x51\x5e\x36\xb2\xa3\xa4\xe3\x26\x9d\xb2\xaa\x42\x33\xe7\x2d\x6d\xe6\x7e\x9c\xe4\x14\x4a\x37\x47\x99\x0d\x34\xad\xa2\x1d\x25\x42\xdf\x5c\xbd\xf7\xde\x7b\x57\x79\xe0\x9b\x4f\xfe\xe5\x7b\x2b\x13\x9b\x07\x51\x78\xf3\x7a\x9c\xd8\x1a\x3b\x14\x44\x26\x46\xc7\x3b\xe7\x6e\x3d\xd7\xd1\x35\x6e\xac\x3e\x74\xff\x3d\xed\xc8\xc7\x6a\xf5\xd8\x47\x3c\x66\x32\x85\x55\x76\x57\x9f\xf8\xcd\x27\x38\xe7\x1a\x5b\xb2\x62\xcf\xe6\xb6\x5d\x39\x7b\xee\x6c\x25\xe8\xa6\x9d\x66\x1d\x55\x18\xe6\x2a\xb7\x5d\xcb\xb5\x89\x5d\x39\x5c\xe5\x0a\xfe\x54\x34\x9c\x1e\xaa\x1e\x0e\x58\x73\x69\x79\x62\x33\x03\x45\x5f\x50\x14\xce\x2c\x42\x2c\xd6\x5a\xdd\x88\x7c\xff\x25\xce\x31\x5a\xbd\x67\xd5\xb2\x38\xc2\xf4\xdb\xa6\x1f\x70\xab\xc0\x19\xe3\x36\xe6\x16\xd1\x01\x2c\x28\xbd\xf1\x02\x3e\xad\xfc\x8f\x72\xfe\xef\xc0\x9a\xcc\x8e\x7b\x14\x3e\x09\x3f\x8f\x18\x4a\xd1\x19\xf4\x24\xfa\x28\x3a\xbb\x07\xaf\xc1\x4c\xce\xf9\x63\x38\x7d\x80\xfe\x3b\x86\x08\xc6\x90\xc2\x18\x26\x30\x86\x33\x30\x86\x2b\x30\x86\xc7\x61\x0c\xcf\xc1\x18\x5e\x84\x31\xbc\x0a\x63\xf8\x2c\x8c\xe1\xcb\x30\x86\x6f\xc0\xf8\x60\xa6\x1f\xc3\x37\x61\x2c\xd1\x7f\x31\x9c\x86\xf1\x3c\x00\x9b\x4b\x33\x18\x3b\x33\x38\x74\x23\xb3\x3e\xc6\x70\xc8\xcd\x01\xa9\x0f\x5a\x1d\x5b\xb4\x3a\x2d\x97\x2e\xf2\x4c\xbb\x3b\xf7\xf7\xe0\xda\xa2\xcd\x7b\xbe\xa3\xa7\xe7\x72\xab\xe4\x35\x88\xe0\x35\x48\xe1\x35\x98\xc0\x6b\x70\x06\x5e\x83\x2b\xf0\x1a\x3c\x0e\xaf\xc1\x73\xf0\x1a\xbc\x08\xaf\xc1\xab\xf0\x1a\x7c\x16\x5e\x83\x2f\xc3\x6b\xf0\x0d\x78\xed\xe0\x5e\x5f\x83\x6f\xc2\x6b\xf2\x5e\x5f\x86\x19\xbc\x26\xaf\xf0\xcb\x0b\xe9\x7f\x5b\xdc\xe3\x6f\x1f\x5c\x1f\x85\x73\x09\xf6\xd0\x7d\x48\xa6\x00\xa0\xe7\x9c\x19\x7c\xfa\x86\x4c\xd9\x0b\x27\xd1\x70\x32\xa5\xfd\x3c\x2c\x80\xbb\xf1\x30\x8e\x24\x3b\x5b\x1f\x77\xb3\x77\x71\xdc\x47\xdd\x66\x18\xc4\x39\xa3\x69\xbe\x50\x95\xe3\x6f\xd1\x3c\xff\x68\x1a\x85\x79\xae\xea\xdc\xad\x4f\xbb\x93\xa1\x04\x2c\x96\xd3\x42\x0d\x31\xda\x8a\x76\x94\x38\x3b\x24\xe1\xb1\xa7\xd1\x64\x9a\x2f\x50\x76\xfb\x39\x26\xbc\x64\xdc\x92\x7e\xc3\x9b\xa7\x47\x59\x0c\xc5\x82\x28\x4e\x77\x94\x71\x9e\xe0\xb1\xa3\xc4\xd3\x49\x24\x27\x13\xc4\xe2\x28\x90\xd7\xc8\xa6\x94\x28\x27\x1b\x4c\xd9\x68\x1e\x94\xed\xf6\xd1\x64\x33\x9f\xd7\x2c\xd4\xe9\xe7\x90\xdd\xdd\x03\x2c\x93\x6c\x5e\x9c\x48\x02\xd5\xf9\xe4\x66\xa1\x3c\x50\x9b\xc3\x82\x4d\xa2\x38\x73\x2c\x16\xcf\x30\x8f\x01\xcf\xe9\xba\x06\xa8\x8a\xe7\xc5\x5a\x8b\x99\x57\x96\x60\x9d\xa1\xae\xd5\x6e\x96\xa8\x51\x28\xc4\xa8\xa3\x15\x62\x1b\x6b\x71\x64\xff\x14\x53\x14\xd5\xf4\x3c\x4a\x0b\x05\x77\xc4\x45\x6c\x18\x05\x4d\x57\x44\x44\xa8\x65\x72\x55\xe3\xa2\xf7\x89\x40\x57\x05\xa5\x22\xa4\x31\xfd\x4b\x05\x52\xc8\x2c\x70\x8d\x2a\x88\xea\xb4\xb2\xdb\x48\x56\x7b\xbd\x50\x30\xd5\xd4\x6c\x95\x12\xa3\x54\xaa\x58\xc2\xd0\xa9\x65\x3b\x49\xe2\xb8\x9b\x85\xc7\x45\xcd\x70\x15\xc3\x1d\xdf\xfc\x91\x62\x2d\x72\x85\x81\xa2\x6e\xb1\xff\xfc\xe1\xa5\x7b\x2e\x9f\x4d\xec\x56\xab\x61\x0f\x1e\xbb\x76\x6f\x2b\x5e\x31\x2b\x3f\x84\x91\xa2\xd2\xca\x88\xae\x4f\x28\x22\x4c\x47\x4e\x91\xaa\x2a\xd3\x8e\x6d\xbe\x65\xd9\x08\x4c\xa2\xd2\xd4\x3d\x1f\xba\x09\x8e\xfb\x31\xb6\x83\x58\xc3\xba\xe3\x52\x5c\xea\x2c\xbb\x3c\xbd\xfb\xca\xe5\x96\xd7\x2e\x9a\x54\x53\x10\xd5\x92\xe6\x6a\xa5\x7e\xfe\xc2\x79\xd4\x71\x57\xd6\xd6\x02\xaa\x52\x11\x06\x91\x31\x78\xec\xe1\xbb\xeb\xae\xab\x11\x2a\xb8\xd0\xaa\x9d\xee\xdd\xe5\x32\xd3\x34\x2b\x1d\x4c\x6b\x95\xf3\xad\x6c\x12\x77\x93\xba\x8d\x0d\x6b\xb8\x7b\x4b\xab\xff\xd4\x72\x4a\x0c\x3a\x7d\xe6\x1d\xd7\xd2\x8d\xba\xd6\x0e\xc2\x23\x67\x2f\x2e\x6f\xbc\xe5\xde\x73\xb1\x6d\x62\xd7\x36\xbc\xa0\xe0\x5e\xd9\xbc\xb8\xdd\xd6\xe8\xe9\xd3\xc9\xb9\xbb\x1f\x5c\x19\x3e\x74\xf9\x78\x50\x37\x82\xe5\xb0\x7e\xfb\x95\x07\x06\x4b\xb7\xbe\x57\x38\x04\x13\x33\xa4\x88\xe0\x15\x8c\xb9\x61\x60\x95\x99\x0f\x9f\x47\x0a\xa1\x9c\x13\x6c\x15\x0a\xd5\xdf\x3b\x4a\x55\xe2\x08\xbf\xc6\x55\xac\x50\x4a\xb9\xa6\x11\x4b\xc4\x9c\x1b\x8d\xce\x92\x77\xfa\x63\xdb\x22\x36\xee\xfd\xd2\xc5\xb0\x21\x62\x41\x11\x65\xd4\x0b\xfc\x6c\x38\xdc\xae\x86\x34\x5b\x5b\x7d\xf0\xa1\x6b\x03\x5b\x55\xb3\x4b\xe0\xfe\x63\xcb\x54\x25\xc1\xfa\xfa\x9a\xcb\xa9\x27\x5e\xa1\x96\x28\x1c\x8d\x2b\xab\x61\xb2\xb5\xb3\x53\x1d\xdc\x73\xc7\xc5\x74\x30\x12\x98\x15\x37\x52\xcb\x37\x35\xea\xa9\xc9\x28\x3d\xf4\x83\x2f\xbf\x98\x62\xce\x48\xfb\xf2\xfa\xe5\x57\x0e\xb7\x4e\x9d\x3c\xd9\x4a\x86\xeb\x2b\xb6\x30\x28\x8d\x45\xa1\x67\xc4\xa5\x46\x10\xf7\xdd\xc7\xad\x62\xb1\x68\x13\x6a\x19\x8e\xa0\x58\x70\x42\xb4\xc4\x52\xe9\xff\xc5\xdd\xbf\x87\x4b\x72\x55\xf7\xc1\xf0\xda\xb5\x6b\xef\xba\xec\x5d\xd7\xae\x4b\xdf\xaa\xfa\x76\xba\xfb\x5c\xbb\xcf\xad\xbb\xe7\x9c\x99\xd3\x73\xd1\xdc\x34\xa3\x19\x69\x46\xd2\x48\x47\x33\x1a\x21\x21\x8d\x90\x46\x02\x09\x5d\x40\x20\x18\x30\x58\x48\x32\x32\x20\xac\x01\x19\x23\xb0\xfd\x58\x46\xd8\x26\x1f\x4e\x10\xcd\x01\x5f\x32\x1f\x96\x91\xfd\xfa\x49\x27\x4e\xe2\xc8\x11\xaf\x79\x43\x94\x37\xf0\xc4\x76\xb0\xde\x84\xc4\x41\x73\xde\xa7\x76\xf5\x69\x44\x48\xde\x3f\x12\x89\x07\x21\xf1\xd0\xeb\xec\xba\xec\x5d\xa5\x5a\x7b\xaf\xb5\xf6\x5a\xbf\x9f\xc7\xcc\x4a\xd6\x99\x68\xce\x16\x9c\x7a\xbd\xe1\xe6\x3b\x73\x15\xca\x19\x76\x67\x4d\xae\x6b\x3a\xd5\x0d\x8e\x55\xd9\x9d\x69\xe4\xb7\xef\xec\x47\xad\xd3\xad\xb0\x39\x51\x5f\x28\x1f\x5f\x3f\x39\x15\x6d\x6b\x57\xa8\xc3\x88\xe2\x55\x0a\xd5\xe3\xd7\xac\x4f\xd5\xf7\x6c\x9b\x31\xa9\xec\x84\x04\x93\x2c\x89\xb6\x4f\x2e\xbe\xf7\x43\x1f\xec\xd5\x5a\x11\xd7\x6a\xdb\x8e\x76\x6a\x57\x5e\x75\xac\xe6\x36\x26\xaa\x66\x87\xed\x3d\x79\xfb\xc2\x4d\x5f\x38\xd2\x5e\x29\x33\x5c\xed\x1d\x9a\x59\xbe\xeb\xee\xbb\x3a\x53\x3b\xdb\x15\x26\x7c\x35\x0a\x36\xfa\x04\x7a\x2b\x26\xa0\x43\x08\x73\x70\x00\xee\x81\xc7\x05\xf2\xf3\x47\x53\xaf\x25\x46\xa1\xa8\xfe\xee\x85\x01\xf5\x45\xf8\x4e\x30\x3c\x0a\xad\x15\x38\xa4\xcb\x29\x50\x4f\xd0\xdc\xb2\x84\x53\x10\x66\xa1\x54\x54\xa1\x4b\x1e\xad\x09\xcd\x17\xb1\x4a\xc9\x4b\x6d\xe5\x4e\xa2\x9f\x29\xdf\xe4\x58\x81\x05\xca\x9f\x50\x44\xaf\x2f\x2d\x2d\x06\xcf\x11\x44\x74\x82\x15\x39\xaf\x69\x9c\x61\xc3\x71\x76\x30\x43\x67\x19\xa6\x59\x96\xa3\xeb\xba\x66\x98\x44\x0f\x7e\x61\x89\xe9\x98\x50\x3d\x1b\x55\x3d\x62\xda\x26\xb1\xaa\xb5\xaa\xa5\x49\xba\x73\x1f\x96\x64\x0d\x0b\x0e\x73\x2b\x70\x2c\x9d\x59\x0a\xd1\xa3\x5a\xd3\xf3\x32\x8c\xea\x39\x95\x60\x9d\x64\x0a\xd5\x37\xeb\x4c\x22\xc4\x6a\x34\x1b\xa6\x55\xab\x56\xcd\x52\x45\x27\xe5\xd9\xe5\x1c\x51\x75\xb2\xd0\x97\x6e\x25\xa6\x65\x11\x93\x98\x5c\x2b\x14\xf4\x0a\x63\x15\x5d\x37\x55\xa4\x26\x1f\x7a\x90\x0c\x4f\xf5\x3a\x9e\xa0\x17\xb6\xa3\x65\x3d\xaa\x54\x4c\x2f\xef\xd9\x9a\x2c\x61\x45\x23\x0a\x0f\xbc\xcc\x7c\x6b\x66\xaf\x8c\x15\x0d\xcb\x94\x50\x62\xb8\xae\x2c\x88\xd8\xbd\x90\x2b\xc4\xe1\x9a\xc1\x8b\x99\x89\xea\x84\x67\x96\x73\xc6\x01\xab\x31\x3d\x9b\xb1\xf2\xb9\xbc\xa5\x61\x2b\xd4\xa2\xcb\x26\xe3\x85\x66\x2c\xba\xe9\x80\x06\xc1\xe6\xaf\xa1\x27\xa5\x2a\x30\xc1\xc1\xdd\x85\x5d\x70\x08\xae\x86\x0f\xa3\x39\xf4\x17\x1b\xf0\x7d\xf8\xa6\x58\x4d\xbf\x07\xbe\xf8\x25\xf0\x4d\xf8\xbe\x58\x47\x6a\x23\x69\x00\xb5\xf6\x00\xee\x7e\xf1\xd5\x79\xe6\x5b\xe7\x64\xc7\x52\x34\x96\x66\xc7\xd2\xf2\x58\xda\x3d\x96\xf6\x8f\xef\x7a\xf7\x88\x71\xeb\x58\x7b\x00\xbe\x3d\x80\x13\xc3\xb4\x6d\x7d\xf4\x7b\x6a\x38\x80\xef\xdb\x03\x78\xfb\x70\x00\x6f\x6f\xa7\xf2\x7d\xc3\x01\x7c\xcf\x1e\xc0\xbb\x5e\x1c\xc0\xfb\x87\x03\x78\x7f\x3b\x0d\x5a\x3d\x36\x4c\x7f\x1f\x1f\x1d\x7f\x72\xb8\x01\x7f\x0e\x3e\x7c\x4f\xf4\x79\x71\xab\x77\xe4\x8d\x7b\xff\xa6\x3d\x40\xfe\x70\x00\x35\x41\xf8\x9d\xfe\x36\x87\x03\xd4\x6c\x8b\x3b\xa0\x76\xe2\x83\x5f\x68\x0f\xd0\x5c\x7b\x03\xfe\x02\xfe\x4c\xbc\x9c\x77\xc3\x9f\x8f\x5e\xd2\x05\x34\x37\xda\x99\xfd\xf3\x11\xc8\x85\x3f\x92\x04\x90\x05\x32\x87\x03\x38\xfc\xe2\x06\x64\x91\x09\x87\x47\x2f\x68\xeb\xcc\xd9\x71\xdb\xf2\x58\xda\x3d\x96\xf6\x8f\xa5\x63\xa3\x5e\x06\xf0\xe7\xf6\x00\xbe\x3b\x4c\x1e\xe4\xd5\x7d\x38\xc3\x01\x72\xda\xc9\x43\x6d\xb5\x1e\xb6\x07\x28\x12\xec\xe5\xc2\xdf\xef\xf5\x51\xa7\x27\x18\x7b\x53\xa0\xe9\xe6\x28\x89\xae\xd7\x6d\x34\x4d\xdc\xa4\x8a\x88\xae\x87\x7d\xd4\xa1\x8d\x9e\x47\x85\x23\x87\x3a\x64\x9c\x72\xda\x5b\xec\x76\xfa\xa8\x63\x4a\x41\xaf\x4a\x95\x80\xfa\x02\x0f\xa2\x41\x6b\xe2\x5c\x91\x8e\x5f\x12\xc1\x40\xd4\x47\x4b\xa2\xe4\x79\x79\x51\xb8\xb4\xa8\xa9\x34\x7b\x34\x96\x94\xa0\xbb\xd4\x47\x4b\xa1\x2f\x58\xf0\x95\xa6\x89\xbc\x20\xf4\x84\x1c\xf4\xba\xc1\x52\xd2\xbb\x9f\xae\xe5\x22\x04\xd1\x48\x61\xe1\x45\xc5\x76\x4f\x98\xc3\xb5\xc4\xcb\x6c\x2e\x77\x3b\xbd\xc5\xc0\xa7\x81\x12\xa3\xa5\xc5\xa0\x8f\x76\xa2\x4e\x95\x36\x69\xa3\x96\xf2\x98\x27\xe7\x36\xd2\x2c\x2a\xb1\x8d\x4b\x9b\x55\x91\x08\x2b\xf2\xa1\x96\x3a\x89\xb5\x82\x3b\xdd\x20\xb9\xf1\x41\x53\xc7\x08\x13\x46\xa8\x7a\xb7\xca\x8a\x8c\xb8\xc4\x6e\xd8\x36\xc5\x8a\x44\x18\x21\xd2\x32\xf3\xc3\xac\x21\x49\xd8\xc8\x17\xf2\x26\xb1\x89\xf1\x08\x21\xcc\xd7\xa9\x76\xf1\x4f\x18\x91\x30\x36\x28\x26\xf7\x52\x8b\x4a\x36\x43\xd2\x9b\xec\x92\x4d\x08\xd6\xb8\x41\xec\x79\x8f\x52\x82\x10\x92\xec\x28\x8e\x6c\x53\xc1\xa6\xe3\x10\x4a\x30\x42\x58\x23\x76\xcb\x26\x0a\xb9\x4b\x35\x25\x84\x11\x66\xbe\x6e\x37\xed\xc4\x7d\x22\x2e\x59\x94\x30\x96\x54\xaa\xe7\x69\x35\x08\xa6\x7d\x4c\x14\x95\xf8\x59\xb6\xf3\x7d\x3b\x05\x43\x0c\x96\x55\x0d\x37\xf6\x4c\x04\xd3\x01\x8b\x6c\xe2\x92\xfa\x25\xf5\x73\x46\xc6\x71\x75\xc5\x9c\x26\x3a\x95\x29\xe5\xac\xba\x7f\xff\xde\xb2\x62\x97\xec\x42\xb7\x5c\xde\x56\x46\x48\x92\xcb\x6b\x05\xe2\x12\x5f\x97\x28\x95\x12\xf7\x23\xdf\xca\x13\x99\x28\xb2\x2c\x61\x46\xd9\x29\xdd\x20\x58\xa1\x84\xb9\xd4\x9f\xf1\xba\x2c\x5f\x2c\x1a\x94\x33\xbb\x19\x1c\xa5\x32\x21\x12\xa3\x8c\xc8\x1f\x32\xaa\xf5\x86\x4b\x74\x5a\x5e\x9b\xc4\x4c\xc3\x24\x71\x8c\x30\xc2\x12\x66\x06\x23\xc4\x64\x9c\x10\x89\x64\x58\x4d\x0d\x72\x39\xa6\x7a\xd9\xfc\x59\x44\x0a\xab\xbe\x9a\x8f\xcb\x0f\x22\xd2\xd8\xd3\x48\xde\x07\x26\xc9\x1b\xc6\x84\x10\x8c\x35\x55\xc6\x4a\x79\x67\x99\xc9\x12\xbd\xca\x12\xcf\x97\xdc\xc2\x5f\xf4\x7c\xe5\x21\x23\x2a\x25\x6f\x93\x6a\xca\xdd\x0a\x2b\x30\xc5\x2e\xe4\x8b\x36\x91\x98\xc7\x0c\x83\xc9\x58\x55\x25\xf5\xcd\x7a\xdd\x26\x9c\x09\x36\x63\x2a\xe3\xe4\xbf\xa3\x4a\x64\xc2\x4c\x46\x35\x05\xdb\x7e\xa0\x2a\xf9\x56\x7e\x11\x33\x3b\x66\x04\x49\x58\x63\xf4\x00\xa5\xb6\xc4\x08\x41\x48\xa6\x3a\x61\x58\x2d\x56\x6a\xb6\xa4\x69\x0a\x23\x96\x65\x14\x8b\x79\xa6\xfb\xec\x2a\xe6\x31\x8c\x90\x2c\xbc\x76\x00\x03\xdc\xcd\xcf\xe1\xcb\xf1\xf5\xa0\x41\x08\x75\xe8\xc2\x31\xb8\x19\xde\x0f\x4f\xc1\xb7\x45\x04\x68\x3f\x3a\x83\xae\xde\x80\x73\x70\xfb\x08\x88\x46\x84\xda\xd1\x2a\xbc\x3c\xda\x76\x7c\x74\x04\x30\xa3\x8c\xa5\x10\x6e\x47\xab\x42\x49\x3f\x32\x02\xa4\x99\x1b\xb5\x6c\xc0\xf1\xb1\x74\xcb\x58\x7a\xc7\x48\x12\x3e\xc3\x39\x08\xe0\x1c\x34\xe0\x1c\x74\xe1\x1c\xec\x87\x73\x70\x02\xce\xc1\x19\x38\x07\xf7\xc3\x39\x78\x08\xce\xc1\x79\x38\x07\x4f\xc3\x39\x78\x16\xce\xc1\x73\x70\x6e\xcb\x67\x38\x07\x2f\xc1\x39\xe1\x33\x3c\x36\x1e\xc9\x6f\x8e\xfb\xf8\xdd\xb1\xf4\x4f\xc7\x47\xbf\xb3\xd5\x2f\x81\xbf\x84\x97\xe1\xbb\xf0\xf2\x56\x7c\xf3\x65\xc8\xc1\xcb\x30\x05\x2f\xc3\x0a\xbc\x0c\x97\xc2\xcb\xb0\x0e\x2f\xc3\x6d\xf0\x32\x3c\x00\x2f\xc3\x23\xf0\x32\x3c\x09\x2f\xc3\x33\xf0\x32\x7c\x05\x5e\x86\xe7\xe1\x65\x11\xdf\x7c\xd9\x1e\x20\xfc\xe2\x00\xfe\xcb\x70\x80\x56\xed\x01\x7a\xcb\x8b\xb0\x81\xe6\x04\xae\x43\xf2\x90\x6f\x4f\x67\x38\x34\x67\x0f\x10\x1b\xce\x2f\xd4\x17\x83\x5e\xa2\xd0\x82\xd0\x21\x14\x39\x72\x3d\x4c\x63\x29\x31\x22\x5a\x28\x71\x49\xbc\xc0\x5f\x1a\x51\x4f\x09\xa2\xe9\xc4\x0e\xf0\x4c\x29\xac\x36\x3a\x69\xc1\x4e\xb5\x51\x4b\x4c\xfd\x2d\x90\x7c\xd4\x4b\x0c\x91\x66\x23\xf1\xb2\xc3\x51\xbc\x2a\x14\xae\x8f\x89\xd2\x8c\x8c\x34\x05\x38\x8c\x91\xd2\xeb\x2c\xb7\xa4\xc4\x89\xe8\x8a\xfd\x06\xe1\x07\x78\xd5\x4e\x9a\xc4\x17\xe2\x56\x9a\xc1\xb4\x28\xdc\x96\x94\x26\x85\x26\x2e\x93\x40\xee\x4c\x53\xd1\x97\x04\x44\x61\xd8\xc2\x4a\x37\x96\x04\xa2\xa1\x60\x0e\x6c\xa3\xe4\x22\xe1\x3b\x28\xd5\xb1\xc5\xd2\xc7\xe1\xc8\x5f\xda\xf2\x85\x46\x21\x36\x31\x61\x25\xcf\xe2\xd1\x19\xb4\x15\x42\x43\x23\xaa\x52\x71\x6d\xb8\x18\x4b\xe8\x61\x45\x54\x4c\x13\x6e\x3e\xa8\x55\x23\x83\x53\xae\x68\x96\xc9\xe9\xdb\xb1\xc2\x74\x35\x6b\x62\xdd\xc8\x17\x54\xb5\xd1\xa0\x5c\xd2\x2c\x4a\xc3\x6c\x78\x33\x35\x15\x49\xe3\xa6\x86\xa9\x6e\xe4\x33\xdc\x54\xa8\x4c\x79\x63\xb2\x3e\xcc\xf8\xdc\xd4\x99\x46\x23\x2a\xc9\x94\xe7\xce\x5b\xd3\x35\x8f\x62\x55\xab\x4d\x96\x0e\x4c\x2c\xbc\xf9\x86\x6b\xeb\xfb\x7e\xf9\xf2\x5d\xd7\x6d\x8f\xf0\x0c\xaa\x59\x95\x62\x96\x1a\x31\xa5\x36\xdd\xa3\x6b\x32\xcd\x5d\xb2\x3a\x41\x73\x95\x85\xd2\x4e\xd9\x9f\x9f\x9b\xb6\x34\xdb\x9d\x2e\x59\x1a\x36\xa3\xf9\x89\x0a\xc9\xec\xce\xed\xa8\x97\x76\x2c\x4f\x73\x97\xea\x81\xe6\x57\x2a\x13\x59\x4a\x55\xc9\x08\xf6\xbe\xab\x27\xa8\x84\xa9\xcd\x65\xc5\xdd\xb6\xff\xd8\x33\xf1\xa5\x97\x5f\x3d\xb3\x76\xd7\x4d\xc7\x4b\x1c\x73\x4b\xf1\x5c\x43\x93\x09\x77\x5f\x59\x3e\x7d\x74\xbb\x9b\x8d\xa7\x73\x87\xae\xb9\xa1\x55\xdd\xbd\xda\xb6\x4a\xa1\xc1\x0b\xd5\xf9\x8a\x55\x9d\x98\x0c\x76\xbb\xf3\x8b\x8b\xfe\xf2\xe1\xe5\xb2\x86\xb5\x89\xfd\xab\x93\x37\xdc\x78\xc3\xa4\x66\x72\x53\x5b\xeb\x53\xcc\x8b\xcb\xd3\xe5\x4e\x43\xa2\xea\x8b\xd9\x92\x85\x28\x2f\xd4\xda\xd5\xde\x27\xaf\xb9\xfc\xb1\x6d\x99\x45\x6e\xc8\xb9\x99\x5b\xee\x7b\xe8\x48\xfd\xb2\x03\xab\x1d\x4a\x91\x44\xcc\xef\x50\xac\xba\xbe\x8a\x0d\xcb\xc4\xc8\xf0\xeb\xf5\x86\x8f\x73\xe5\x2a\x37\xa2\x79\x85\xd3\xcc\xde\x59\xab\xd9\x6c\x5a\x9a\x2e\x51\x4b\x94\xeb\x72\xc7\x72\xb8\x4e\xb9\x4e\x17\xde\xdc\xd3\x2c\x0b\x65\x4a\x99\x85\x78\xf5\xde\xfb\xee\x5d\xe5\x12\xa5\xae\x6d\xe2\xf7\x21\xfa\xdb\xd9\xb9\x76\xb7\xda\x7b\xc7\xdb\x6f\x9d\x6c\x4c\x72\xcc\x72\x93\xb9\x0c\x0b\xae\x3a\xfb\xce\xed\x27\x9e\x58\xc7\x94\x67\xac\x07\x5f\x79\x3f\xcf\xbb\xea\xbc\xdb\x6c\x4c\x58\x96\xe1\x4d\xce\xec\x7d\xdf\x7c\xa6\x58\xc3\xb2\xec\xba\x8a\x92\x9d\xb9\xea\x9a\xeb\x97\x27\x0e\xed\xdd\xe6\xa2\xa3\xf5\x2b\x67\x6e\x77\x72\xd4\xad\xcc\xc7\xa5\x7d\xfb\xf7\x95\xb4\xda\x44\x9e\x7a\xd4\x9e\x6c\xc4\x94\x36\x27\xa8\xae\x50\x3c\x73\xe2\xea\x13\x33\x93\x97\xed\x9c\x99\x08\x2a\xae\xa4\x69\xd1\xae\x93\xcb\x33\x57\x1d\xbf\x72\xa6\xd0\xe9\x6e\x8b\xfd\xa5\xe5\x25\xff\xb7\xea\x3b\x8f\xb7\xae\xff\xfa\x89\x99\x6d\x35\x17\x1b\x85\x99\xf8\xf0\x2f\x5d\xd1\x3c\x7e\xf9\x65\x15\xcd\xe3\x48\xcb\x59\x3a\x36\xb4\xdc\xa1\xeb\xce\x2c\xaf\xbd\xe7\xde\x5b\xea\xbe\xa9\xe4\x33\x96\x41\xb4\xee\x47\xae\x58\xbd\xe7\x8e\x37\xcf\x64\x72\x84\x48\xf7\xce\xdd\xf6\xb6\x7b\x7a\xd5\xbd\x3b\x16\xad\xbd\x2b\x19\xa3\xdd\xab\xf7\xa2\xb7\xfe\xe9\x5b\x56\xef\xbb\x66\x2a\x63\xd7\xb6\x81\x02\xe1\xe6\x43\x52\x5f\xfa\x53\xe1\x2f\x54\xa0\x0f\xc7\xe1\x57\xe0\x2f\xe1\x37\x36\xe0\x5d\x90\x15\x53\xc1\xa7\xc5\x8e\x8e\x98\x75\xb2\xf0\x5d\xc8\x6e\xcd\x3a\x59\xc8\x41\x16\xa6\x20\x0b\x2b\x90\x85\x4b\x21\x0b\xeb\x90\x85\xdb\x20\x0b\x0f\x40\x16\x1e\x81\x2c\x3c\x09\x59\x78\x06\xb2\xf0\x15\xc8\xc2\xf3\x90\x15\xf8\xf6\x00\x59\xf8\xb4\x98\xcf\x08\x64\x47\x9b\x9b\x57\xd8\x03\xd8\x37\x1c\xc0\xbe\xf6\x06\x1c\x82\x2b\xc4\xf1\xd4\x6a\x7c\xcf\x70\x00\xef\x69\x6f\xc0\x17\x46\x57\x0d\xe0\xd3\xf6\x00\x5e\x4c\x2c\xc0\xaf\xb4\xe7\x17\x48\xe2\x84\x88\x18\x5b\xd5\x94\x6a\x26\xf2\x05\xf7\xe2\x16\xff\x1d\x1e\x39\x30\xbd\x34\xd7\xa2\x99\x3a\x24\xcb\x5d\x91\x31\xe1\xc5\x92\x9f\xa8\x72\x95\x26\xc7\x6a\x55\x2a\x4a\x7b\x5b\x68\xe4\xd7\x04\x22\x93\x61\x94\xe9\x1a\x7a\x34\xa4\x41\x3a\x81\x24\x76\x4b\x38\xe2\x01\x69\xe1\x9d\x28\x46\x7e\xc6\xc4\xa1\xa0\x6a\x48\xc1\xcf\x45\x60\x83\xd6\x1a\xdd\xe4\xec\xc4\x18\x1a\x51\xd8\xa4\x99\x98\x7d\x1c\xa2\xdf\x30\x5d\xa6\x60\x5b\x65\x1a\x7d\x88\x6a\x9a\x46\xa9\xea\xd8\x1a\xd9\x28\x67\xa8\xaf\x39\x0a\x51\xfe\x2e\x1f\x9b\x12\xd5\x26\xa6\x5b\xde\xf5\x4e\x48\x35\xc7\x71\x34\xaf\x51\x2d\x5b\xf9\x8c\x89\x96\x35\x85\x2a\x9a\xa5\x68\x8a\xc5\x0d\x55\x21\x2c\x7b\x6d\xbe\x35\x37\x1b\x30\x83\x32\x5d\xc5\x54\xa5\x66\x21\x1b\xea\x6e\x81\xab\x2e\x5b\x0c\xcd\x62\x21\xcf\x99\x6d\x18\x1a\x61\x44\x51\xa8\xa1\xcb\x58\xa3\xb2\xca\xdd\x69\x47\x51\x64\x42\x09\x65\x2c\xd4\x6c\x5d\xa2\x2a\x95\xea\x98\xe9\x32\xd5\x32\x9e\xaf\x31\x46\x8a\x04\x9b\x96\x4d\x29\x65\x04\x13\xce\x28\xa1\x61\x27\xeb\xb5\xa6\x27\x34\xd3\x9c\xdc\x51\xb6\x5d\xce\x03\x16\xed\xdc\xb3\xb7\x16\x30\x27\xe4\x1a\xb3\x33\xb1\xa2\x2a\x3c\xe4\xd8\x0a\xf3\xc8\xab\x5e\x7b\xc3\x0d\x53\x53\xd7\x9e\xbc\x0e\xed\x0c\xb7\xf5\x77\x97\xc2\x5a\x94\xe5\xb6\x33\xe3\x48\x54\xc1\x84\xc8\x66\xc0\xc3\x6d\x3b\xd6\xde\xbc\xe7\x83\x1f\xfc\xf9\x4b\x6c\x33\x9f\x0d\x59\x78\xf4\xb3\x9f\xfd\xec\x51\xed\x00\xa5\x9c\xeb\x94\x22\x45\xc7\x34\x99\x66\x7c\x2d\x5c\xdd\xb5\x3b\x0a\x0a\x4c\x96\x88\x4a\x15\x46\xb4\xc3\xbf\x74\x58\xd1\x44\x74\xe1\xe0\x13\x4f\x3c\x71\x90\x59\x4c\xdd\xf9\xd8\xae\xb9\x1b\x4e\xdf\x30\x17\x1c\x7c\xe2\x13\x9f\x38\x7c\xe4\xcd\x7f\x78\xea\xe2\x73\x9a\xe7\x79\x1a\xd3\xb1\x5a\x5a\x76\xc2\x4e\x56\xc5\x92\x6a\x13\x8b\x85\xdd\x95\xed\xc5\xb6\xa2\x98\xb9\x68\x22\xbf\xbc\x7e\xf9\xfe\xb2\x43\xa8\xc4\x03\x9b\x62\x00\xb0\x40\xdd\xfc\x18\xfa\x2f\xf8\x1f\x80\x05\x01\x54\x61\x37\x1c\x82\x2b\xe1\xad\xf0\x0e\xf8\x20\x7c\x14\x7e\x05\x9e\x81\x2f\xc2\xdf\xa3\x43\xe8\xdb\x1b\x68\x0f\x7c\x51\xe8\xc9\x0b\xa3\xf2\x87\x7b\x21\x14\x39\x56\xb6\x3d\x80\xc6\x8b\x69\x39\x44\x8a\x09\x6c\x8b\x2a\xb5\x01\xe8\x6d\x81\xa6\x04\xe7\x86\x03\x38\xd7\xde\x00\x03\xce\xc1\xbd\x62\xb1\xdd\x63\x0f\x20\x33\x1c\x40\xa6\x2d\xac\x8b\x17\x20\x80\x17\xa0\x01\x2f\x40\x17\x5e\x80\xfd\xf0\x02\x9c\x80\x17\xe0\x0c\xbc\x00\xf7\xc3\x0b\xf0\x10\xbc\x00\xe7\xe1\x05\x78\x1a\x5e\x80\x67\xe1\x05\x78\x0e\x5e\xd8\xb2\x2e\x5e\x80\x97\xe0\x05\xb1\x4f\xfa\xc2\xab\x52\x0b\xee\x15\x58\x18\xa9\xd7\x98\xf4\xbf\x3c\x1c\xc0\xb2\x80\x91\x49\x47\xb8\x01\x07\xb6\x46\x22\x70\x33\x0e\x0f\xd3\x6b\x8e\x0e\x07\x70\xb4\xbd\x01\x57\x81\x0d\x2f\x8c\x9f\xe4\x9a\xe1\x00\xae\x69\xa7\x63\xbe\x6e\x38\x80\xeb\x46\xf2\xf5\xc3\xf4\xf8\xed\xc3\x01\xdc\x3e\xea\xf5\x6d\xc3\x01\xbc\xad\xbd\x01\xef\xfc\x91\x27\x7d\x70\x74\xff\x8f\x0d\x07\xf0\xb1\x76\xda\x67\xe2\x27\x86\xf6\x00\x7e\x63\x38\x80\xdf\x68\xa7\xf2\x6f\x0e\x07\xf0\x9b\x23\xf9\x99\x61\x4a\x33\x9c\xf4\xf0\xf9\xe1\x06\xfc\xd6\x78\xc4\xc9\x93\x7e\x79\x98\xfe\xfe\xc9\xe8\xf7\x9f\x8c\xee\xf6\xe2\x30\x05\x35\x48\xe4\xbf\x1a\xb5\xfd\xa7\xb4\x77\xe4\x0e\x07\xc8\x4d\xdf\x08\x6a\x0c\xd3\xdf\x99\x21\x0c\xd0\xbe\xf6\x00\x1d\x4a\x66\x19\x91\x35\xda\x68\x26\x66\x8c\xb2\xd8\x15\x65\xd0\xdd\x46\x6a\x1f\x08\xb2\x1e\x8f\x46\x48\x14\x8e\xa0\x6a\x53\x18\x43\x7d\xd4\xe9\x2e\x06\x8b\xbd\xc5\x6e\xd8\x0d\x12\x3f\xa9\x1b\xec\x4c\xdc\xb1\x34\x2d\xc3\x44\xa9\x67\x15\xf6\xa5\x65\x01\x38\xde\x42\x22\x76\xd2\x13\x73\x52\xb7\xd1\x4c\x1d\x3a\x3f\x31\x77\x52\x44\xe8\x96\x54\x4f\x77\x19\x13\x13\x43\x84\x57\x90\xb2\x86\x9a\xbd\x36\x52\x04\x11\x7b\x5a\x86\xb8\x05\x64\x15\xa6\xe9\x58\xc2\xfa\x11\xe4\x8a\x02\x0a\x50\xe4\xa4\x35\x05\x95\xfa\x56\xdc\x14\x35\x1b\xb4\x29\x9e\xa3\x17\x98\x48\x84\x72\xc6\xc1\x57\x31\x07\xa6\xfb\x83\xd5\x46\x1f\x09\x60\xf3\x74\x1f\xb4\x25\xfe\x48\x3c\xd8\x25\x01\x70\x90\xee\x71\x2e\x21\xb5\xab\x2a\x44\x51\x25\x84\x75\x4e\xa6\xd6\x8e\xe7\x14\x52\x95\xd9\x3d\x46\x2e\x97\x37\x4c\x3d\x0c\x42\xdd\xa3\xde\x04\xb5\xe2\xa8\xc8\x15\x09\x53\x16\x10\xc3\xb4\x14\x3b\xb6\x75\x77\xda\xa8\x55\x72\x92\x37\xe5\xed\xa5\x5e\xd3\xf6\xa6\x7e\x91\xa8\x54\x27\x44\xa1\x9e\x4b\x25\x8c\x30\x92\x74\xaa\xcb\x58\x7a\xb7\x84\x25\xaa\x1b\x9f\xc9\x10\x62\x33\x83\x98\x8c\xde\x4f\x55\x4d\xe3\xba\x21\xe9\xae\x8f\x80\x72\x53\xa3\x84\xa9\x84\x44\x9e\x6b\x61\x8a\xf5\xc9\x12\xa5\x0f\xd0\x9a\xac\xe8\x87\x75\x4c\x54\xec\xe7\x72\x8a\xe7\x99\xd4\xd2\x99\xc1\x74\xcf\xf7\x74\x59\x42\x44\x22\x12\x31\x30\x92\x15\xaf\xed\x71\xa2\xe4\xa2\xb2\x45\x8d\x8c\x63\xeb\x5c\x93\x98\x9a\xbf\xb2\xad\xbb\x84\x2a\xd9\x62\x74\x06\xcb\x32\xc9\x75\x17\xa6\x0d\xc5\x90\x35\x4b\xaf\xd4\x62\xd5\xac\x78\x92\x82\x11\xd1\x6d\x43\x27\x46\x5c\x2c\xe8\x46\x62\xaa\x08\x7f\x92\x84\x89\x23\x47\x18\x23\xaa\x1b\xea\x36\x53\x89\xa4\x59\xba\x69\x5b\x51\x54\x72\x03\x53\xd3\x28\x96\xb0\x4c\xec\xc0\x9e\xb9\xcd\xdb\x55\x9a\xf6\x9a\x35\x82\x64\x8a\x6f\x10\xef\xf2\x58\x7e\xc6\xcb\xd8\x4d\x4f\xa5\x2a\x2f\xe4\x73\xba\x37\xe5\x11\xe1\x0c\xd3\xcb\x54\x89\x38\x81\x2e\x91\x97\x75\x53\xd3\x1a\x79\xdd\xfc\x27\x7a\x60\x13\x87\xdd\xf8\xfb\xa7\xdc\x99\xb9\x76\xa8\x5a\x96\xa5\x4e\x1c\xa9\xe9\x5e\xc6\x55\x45\x41\x88\xe9\xcd\xe7\x0b\x04\x13\x52\xb0\x4c\xc5\xc9\x78\xf5\x49\x3d\x08\x03\x7d\x92\xe7\x42\xef\xf8\x25\xaa\xe7\x07\x7a\x6e\xb5\x64\x87\x9a\x51\x9f\x9e\xf5\x72\x6b\xb6\xf2\x11\xe3\x86\x63\x37\x57\xac\x62\xd6\x53\x7e\x99\x17\x8b\x25\xcb\x72\x4c\xdb\xd0\x67\x3c\x96\x61\x24\xa7\x2b\x99\x8c\x43\xac\x64\x79\x71\x27\x1b\x55\x5e\x5c\x5d\xe9\xe5\x08\x61\x73\x27\xe7\x0c\x53\xd7\x54\x4b\x76\xbc\x40\xf7\xda\x0b\x6d\x6f\x6e\x96\x12\x99\xdc\xc9\x65\x99\x70\x23\x8a\x63\x43\x32\xf2\xcd\xa2\xb7\xb0\xb4\xe0\x85\xb5\x6a\x3d\xc7\xca\xc4\xad\x54\x2a\x2e\x71\x32\x19\x85\x48\x92\xac\x1a\x19\x5f\x9d\xb9\x76\xfd\xda\x19\xc6\x75\xbd\x68\x9b\x11\xcb\xd5\x2b\x15\x8f\x15\x6c\x3d\x8a\xf2\xaa\x56\x65\x18\xc9\x32\x80\xbe\xb9\xb9\xf9\x51\xe9\x66\xe9\x1d\x60\x41\x01\xa6\xa0\x07\x97\xc2\xf5\xf0\x41\xf8\x03\xf8\x2b\xe4\x89\xb8\xe7\xb7\xb6\xec\x04\x11\x43\x59\x4a\xa9\xbb\x62\x94\xd8\xf7\x99\x9a\x89\xd3\xf2\xad\x70\x44\x89\xd7\x30\xa5\x7a\x4a\x7d\xd2\x6b\xa1\x5a\x0b\x8f\x12\x98\x84\xfd\xbf\x34\xc2\x44\x4f\x73\xce\xd3\xbd\x7e\xc1\xf0\x1c\x0b\xb6\xb0\x34\x55\x40\xf8\x35\x61\xca\xf1\xa5\x04\x3f\xdc\xa5\xef\x6c\x45\x51\x9b\xcb\x02\x91\x60\xb9\xd1\x0b\xba\x8b\x41\x7a\xef\x44\xcf\xc2\xc5\x60\x94\x46\x99\x66\x1c\xf4\x62\x1c\x2a\x29\xee\x41\x55\xd8\x2e\xa8\xaa\xd4\xd2\x64\xad\x5e\x67\x34\x92\xe5\xbe\xd4\x49\x77\x1f\x11\xba\x81\x99\x9c\x29\xe6\xa4\xaf\x04\xaa\x6a\x1a\xd6\xc5\x7f\xab\x9a\x5c\xc7\xde\xb4\xb7\x1a\xcc\x7d\xb6\xed\x6f\xdb\xb6\x60\x2a\x26\xd7\xe5\xe9\xdb\x9e\xa9\xb5\xbd\x39\xb7\x52\x9b\xcc\x66\x8b\x8e\x79\xf1\x69\xdd\xae\x4e\x9a\x66\x2e\x1f\xb9\x6a\xd6\x32\xeb\xd3\x73\xff\xf7\x44\x75\xb5\x68\x66\x55\xd9\xb0\x1c\x45\x33\x6d\x65\x7a\xff\x9f\xe9\xa1\xef\xc8\x66\xb9\x54\x36\x8d\x4a\x39\xaf\x2c\xdc\x30\xcd\x2d\x1b\x8b\x3b\x6e\xbb\x6e\x61\xe1\xca\x1a\xb3\x33\x05\x29\x3b\xd9\x9c\xcc\x46\xb3\x1e\xa5\x74\xe6\xea\x05\x45\xa3\xcc\xf7\x03\xa6\xbb\x19\xdf\x54\x3d\x73\x61\x65\x47\x56\xb1\x5d\x47\x29\xf6\x8a\xb2\x59\x4c\x4e\x93\x75\x8d\xfe\x66\xb4\x63\xda\x9b\x34\x6b\xad\x6a\xc9\x57\xad\x82\x45\xb3\x94\x4d\xb7\xa6\xf4\x76\xb1\x51\x6b\x14\x83\x72\xbf\xbc\xb0\xb0\xad\x31\x37\xb3\xe0\xfb\xb1\x85\xa9\xa2\xc8\x66\x21\xeb\x2b\x2a\xb7\x2c\x1c\xcd\x57\xc5\xcf\x4a\x4d\xd3\x35\x59\x63\x9a\x6c\x36\xdb\x1a\x37\x64\x45\x32\x0d\x85\x4a\x68\x41\x46\x92\xac\x98\x2d\x33\xe3\xcf\xa2\x52\xed\x92\xbd\xfb\x9b\x49\xb3\xbc\xff\xbd\xde\xce\x87\xf7\x4f\x4c\x9f\x38\x71\xbc\x21\x7b\x95\xc6\xdf\xe4\x4a\xbe\xa3\xcb\xae\xc3\xb0\x15\xe4\x2a\x39\xef\x89\x56\x71\x6f\xcd\x9b\xf6\x19\x91\x88\x99\xcb\xe6\xcc\xda\x75\xd3\x66\x31\x2a\xbb\x3a\xe7\x8e\x69\x16\xe3\x92\xbb\xf3\xc1\x5d\x8c\xeb\x5c\xd7\x74\xed\xba\xc1\x4d\xc5\x2b\x16\xcd\x52\x94\xf7\xb2\xdd\x6d\xdd\x9c\x5f\x32\x54\x55\x51\x95\x2b\x3f\x77\xa5\x2a\x53\x85\x12\x4d\x57\x82\x20\x83\x55\x59\x99\x3e\x72\xf8\x50\x53\xe7\x0a\xc1\x7e\x6c\x16\x2b\xc6\xc4\x9e\x22\x95\x55\x59\xa2\xfa\xf4\xb1\x6a\xb4\xab\xd8\x3c\x7e\xe2\xc4\xb4\xa6\x53\x59\x5d\xb8\xf6\x9a\xf5\x85\xdd\xc5\x9d\xbb\x76\x97\x54\x9a\x6d\x1e\xbf\xea\xca\xc6\xdb\x76\x3e\xbc\x9f\x32\x53\x55\x90\xe0\x9d\xce\xce\x34\x1b\xfe\xee\xbb\x56\xdc\x74\x84\xdb\x7c\xdd\xf7\x7c\x5d\x46\x48\xb6\x08\x58\x82\xdb\xec\xab\xd2\xff\x01\x0a\xb8\x10\x43\x03\x16\x60\x3b\xec\x87\x77\xc1\xef\xc3\x1f\xc3\x5f\xc2\x2b\x48\x45\x11\x5a\x45\xd7\x6f\xa0\x18\xa5\x28\x5d\x73\xb0\xbe\x65\xeb\xaf\xc3\x77\x61\x7d\xcb\xd6\x5f\x87\x1c\xac\xc3\x14\xac\xc3\x0a\xac\xc3\xa5\xb0\x2e\xfe\xbd\x0d\xd6\xe1\x01\x58\x87\x47\x04\x52\xd5\x3a\x3c\x03\xeb\xf0\x15\x58\x87\xe7\x61\x5d\xd8\xfa\x2a\xac\x43\x1a\x26\x55\xdb\x1b\x60\x8e\xff\xca\x0c\x37\xa0\x84\x0a\x30\x37\x2a\xfa\x5c\x1f\x49\xcd\xb1\xb4\x38\x3e\xda\x1b\x4b\x3b\x7e\x78\x37\x7b\x00\xb7\xbd\x38\x80\x37\x0f\x07\x70\x9b\x3d\x80\x07\x5e\x4c\xad\x8d\x39\x51\x45\xbd\x01\x1f\x19\xdf\x67\x63\x2c\xfd\xcb\x91\x94\xd8\x55\x28\x86\x00\xc5\xd0\x40\x31\x74\x51\x0c\xfb\x51\x0c\x27\x50\x0c\x67\x50\x0c\xf7\xa3\x18\x1e\x42\x31\x9c\x47\x31\x3c\x8d\x62\x78\x16\xc5\xf0\x1c\x8a\x47\x76\x15\x8a\xe1\x25\x14\x0b\xbb\x6a\xce\x1e\xa0\x1d\x89\x1f\xf2\x9d\xf6\x06\x94\xe0\x97\xc5\xeb\xd3\xe0\x97\xa1\x24\xba\x33\x47\xd2\xfc\x42\x4f\x59\x14\x39\x47\x75\x45\xa4\x65\x0a\x2e\xb8\x34\x7d\x1b\x2f\x35\x17\xbb\xc9\x94\xd3\xf3\x53\x9c\x61\x81\x8a\x99\xa6\x24\xd5\xfc\x20\xb1\x08\x84\xa9\xd0\x42\x4a\x1a\x3f\x45\x0a\xf5\x93\xa9\x65\xb1\x2f\x2d\xf9\x69\x15\x6a\x3a\x9d\xc4\xa8\xd7\x49\x3c\x9c\x4e\xe2\x9a\x2c\x06\x5b\xd9\x63\x4d\xaa\xd0\x8e\xa0\xa8\x35\x25\xa5\x96\xd2\x78\x2b\x22\xab\x5b\x6a\x8c\x26\x0f\xe1\xde\xf8\x7d\x29\xa8\x0b\x78\x4e\x54\x4f\xa9\x3c\x93\x41\x54\x5b\x52\x48\x25\x25\xe5\x6c\x4a\xa6\x22\x81\x57\x91\xb2\x43\xa4\xe8\x4c\x75\x45\xc4\xb2\x13\x13\x46\x18\x20\xc9\x74\x26\xa8\x2c\x44\x0e\x5b\x6f\x34\x8a\xc4\x19\xea\x74\xc7\xf5\xaf\x7d\x29\x38\x52\xd7\x4b\xc6\xa2\x5f\x41\xbf\x12\x58\xe5\x72\x41\xd7\xc3\x6c\x8e\x4f\x08\x12\x76\xa2\x50\x5d\xbd\x77\xb2\xed\x79\x71\xce\xff\xbf\x34\xd3\xe0\x94\x5a\xa6\xf9\x0f\xb4\xd0\x55\x89\x6e\xe8\xec\x66\x19\x61\x45\x33\x18\xc6\x93\x3a\xa6\xa6\xed\xf1\x0c\x51\x75\x4c\x64\x49\x32\x2c\xc3\x0a\xbc\xc0\x92\xb1\x44\x0e\x6a\x8a\xa2\x67\x32\x3e\x63\x8e\x65\x73\xc7\x94\x9d\x8c\x2b\xf0\x02\x2c\x4d\x31\x32\x32\x56\xa8\xa4\x69\x4e\x10\x90\x0f\x10\x4c\x24\xe2\x74\x3c\x82\x55\x95\xa8\x88\x68\xcc\x64\x7e\xde\xd3\x4d\xce\xa8\x16\x16\xa2\x8b\x6b\x56\xa5\xe0\xee\x61\x36\xb2\xa6\xca\x87\x8f\x1e\x2e\x3b\x39\x6f\xfe\xe4\x75\xeb\x73\x56\x2e\xf4\xce\x5e\xfb\xb9\x63\x11\x93\x55\x4d\xa7\x3a\xd5\x2d\x83\x2a\x9a\x5e\xd1\x57\xdf\x72\xe3\xa9\x79\x49\xa2\x4a\x63\xf5\xe2\x91\x7a\xb5\xaa\xdb\x8c\x4a\x14\x97\x30\x42\x58\x91\x65\x4c\x74\xdb\x32\x35\x86\x9d\xfc\x21\x82\x88\x8e\x1d\xcf\x95\x4b\x3b\xe2\x5c\xce\xc8\xa8\xc4\x72\x32\x3a\x75\xbc\x8c\xb1\x87\x3a\x75\x2f\xa8\x4f\x4a\xc4\xf1\x54\x82\x1f\x59\xd4\xb3\xd9\x50\x95\x0d\xa6\x5e\x52\x2b\xc9\x46\x90\xbf\x62\x82\x62\xee\x6a\xb2\x84\xee\xf0\x6a\x13\x93\x39\xaf\xd9\x68\xb6\x89\xc9\x55\x46\xf5\x4c\x50\xf6\x3a\xbe\x00\xb7\x24\x6e\x98\xd5\x89\x24\x49\x38\x53\xad\xd5\x3c\x99\xc8\x46\xa6\xd9\x9c\xf4\xcc\x53\xfe\x84\xa7\x63\x49\x22\xbb\x64\xaa\x22\xb6\x47\x5b\x24\xc9\x0b\xca\x85\x39\x8b\x64\xb3\x36\x91\x91\xac\x69\x7e\x90\xb3\x4c\x2f\xe3\x19\x99\x4a\xa5\xea\x39\xba\xd8\x93\xd3\x82\xc0\x25\xba\x6d\x9a\x9a\xdf\xf1\x88\xce\x65\x3e\xa1\xe7\x1c\x94\xd7\x18\xb7\x2d\x43\xc9\xfd\x51\x6b\xdf\x07\x7f\xee\xbd\x3b\xbd\x9a\x72\xe4\x13\x4f\x7c\xe2\x88\xa2\x29\xe1\x13\x17\xbf\xfd\x84\x93\x63\x44\xd2\x38\x31\x1c\xdd\x76\x19\xb1\xd4\xa3\xbf\xf1\xcc\x3f\x58\xc7\x58\x22\x7a\x7e\x47\xf7\xed\xf7\x28\x01\x2b\xac\xed\xdc\xd9\x8a\xb7\x75\x7b\x45\x22\xcb\x1a\x51\x99\xba\xf8\xae\x1d\x5a\x50\xdb\xb5\x63\xb5\x68\xe6\x13\x4b\xf2\xe4\xc9\xa3\x5e\x23\x34\x14\x24\x11\xa2\x61\x05\x00\x0c\x30\x37\x7f\x49\xfa\x47\x58\x01\x15\x6c\xc8\x0a\x26\x97\x6b\xe1\xd3\xf0\x3b\xf0\x35\x78\x11\xfe\x3d\xfc\x67\x94\x47\xb9\x0d\x11\x22\x4e\x94\xf4\xcb\xf0\xcf\x46\xca\xfa\x6d\xf8\xf2\x56\x1c\xf7\x29\x08\xe0\x29\x68\xc0\x53\xd0\x85\xa7\x60\x3f\x3c\x05\x27\xe0\x29\x38\x03\x4f\xc1\xfd\xf0\x14\x3c\x04\x4f\xc1\x79\x78\x0a\x9e\x86\xa7\xe0\x59\x78\x0a\x9e\x83\xa7\xb6\x3c\xad\xa7\xe0\x25\x78\x4a\xc4\x71\xbf\x01\xdf\x86\xa7\xc4\xfc\xf4\x94\x3d\x80\x6f\x0e\x07\xf0\x6d\x7b\x00\xdf\x1a\x0e\xe0\xcb\xf6\x00\xbe\x33\x1c\xc0\x3f\xb3\x07\xf0\x1f\x46\xbf\x7f\x3b\x6a\xff\xbb\xc4\xd3\xc8\xb7\x07\xf0\x0d\x81\xb7\x76\xb7\x18\xda\x01\xa0\xa3\x21\x7e\x03\xa5\xc8\x24\xce\x58\xf2\xc6\x52\x3c\x96\x1a\x63\xe9\xd0\x58\x3a\x35\x96\xbe\x39\x96\xbe\x33\x96\xfe\x76\x24\x25\xde\x4d\x3a\x2f\x51\x22\x9c\x8d\x7a\x8a\xce\x91\xcc\x1a\xfd\x34\xce\x2a\x18\x82\xc5\xce\x53\x62\x45\x25\xd6\x91\x50\x7e\xdf\x44\x16\x12\x71\x60\xd4\x31\x51\xad\xd1\x6c\x2c\x89\x3d\x9e\x30\xa0\x82\x2a\x33\x99\xa8\x02\x33\x99\x3f\x6a\x55\xf1\xbf\xb4\x9c\x64\x69\xb1\xd7\xed\x08\x06\x60\x13\x8f\x6d\x18\xbc\xb4\x18\x4b\xf5\x34\x7e\x13\x2e\x76\x45\xb7\x5b\x66\x9a\x18\x45\x68\x62\x4b\x24\x70\xa6\xe4\xd6\x7d\xdc\xeb\x74\xc5\x15\x8a\x47\x93\xb9\x4a\x40\xb3\xd0\x64\x60\x62\x9f\x5a\xcc\x3c\x5e\x30\xaa\x1a\x14\x15\x7e\xdd\xe5\xc6\x72\x9a\xe3\x82\x7b\xe8\xff\xdf\x2c\xee\xed\xcf\x6b\xf3\x57\x5e\x7c\x7c\x57\x8e\xe8\x9a\x4a\xd0\x7d\x51\xd6\xf3\x75\x69\xc1\xc5\x5e\x90\xf1\x35\xe2\x67\x83\xdb\xb9\xa6\x65\xb2\x52\xa6\xf0\xb0\x55\xcc\x67\x75\x0d\x73\x9b\xb8\xbd\xa2\xe7\xf9\xfb\x9a\x9c\x37\xd7\x1b\x9a\xeb\x75\xe3\x44\x4b\x9a\x35\x26\xbb\xd9\xe2\xb5\x5e\x54\x34\xb3\x41\x46\x53\x35\x45\x56\x2c\x97\x60\x75\xfe\xae\x55\x4d\x61\x44\x56\x55\x33\x57\x88\x5d\x55\x42\x9a\x9b\xc9\x24\xea\x48\x35\x16\x78\x2a\x53\x33\xd5\x89\xc9\xac\x59\x8a\xc2\x57\xfe\x86\x39\xba\x97\xc9\x68\x5e\xa8\x69\xc5\x62\x01\x5d\xb1\x7a\xf2\xf8\xb1\x79\x16\x64\x2e\xdb\xf7\xf8\x1e\xdd\x5f\xad\x1e\xd8\xb7\xa7\xf8\x16\x2d\x93\xf1\x74\x52\x08\x35\x4b\xce\x97\x63\xad\xb1\x6f\xff\xa1\x69\x2b\xca\x67\x2f\xde\xc2\x3c\x4d\x55\x65\xaa\x32\x76\xb7\x3b\x59\xd2\xb4\xcc\xb2\x4b\x10\xc6\x05\x95\x60\x5d\xd7\x2d\x9b\x73\x2d\x5a\x89\x65\x42\x28\xd1\x88\x9e\xf7\xca\xba\x55\x6f\x4c\x98\xc5\x88\xd0\x30\xb2\xb4\xf9\x79\xc6\x55\x2a\x3f\x59\x5c\x6b\xe8\xe5\x89\xda\xa7\x4c\xae\x6a\x3a\xaf\xb9\xba\x42\xcc\xa9\xa6\x1b\x68\x5a\xc6\xcf\x9e\x32\x1c\x97\x68\xae\x6d\x52\xdf\x55\x43\x6f\x72\x59\x7b\x0b\xe7\xd1\x6a\xa4\x59\x18\xd3\x89\x53\xf3\x96\xa3\xd3\x6a\xfb\x54\xd3\xb2\x88\xee\x56\x4b\x25\xcb\xcc\xd8\xb6\xce\x2c\x66\x64\xaa\x95\x5a\xc6\xac\x95\x7c\x8a\x65\x9d\x22\x59\xe6\x9a\x4c\xdc\xc9\x8c\x9e\xc9\xb8\x1a\x0b\x33\x5c\xd2\xfc\x07\xf4\x92\x46\xa8\x82\xb4\x52\x86\x22\x2c\xff\xc1\x9e\xf3\xbf\xf2\xa9\x03\x5e\x55\xbb\xfb\xa1\xcd\x87\x55\x6a\xee\x7c\xd7\x3b\xdf\xb9\xf6\x0f\xb9\x17\xea\x96\xe7\x05\x56\xb6\x59\x9f\xcc\xf6\xdf\xff\xfe\xf7\xf7\x2d\x59\x75\xfd\xcb\xb5\x6a\xb0\xed\xcc\xaa\x6c\x5a\x26\x41\x9c\xc9\x97\x7c\xe0\x12\x0d\x47\x7b\xf6\xed\x6f\x55\xf6\x1f\x3c\x58\xf1\x3c\x6e\x3b\x32\xd3\x3c\x55\x95\x49\xd4\xdf\xd9\x8f\x58\x69\xa6\x20\x00\x12\x05\x67\x76\x71\xf3\xaf\xd0\x1f\xa0\x6f\x83\x03\x05\x98\x81\x55\xd8\x0f\x0f\xc2\xd7\xe1\xbe\x0d\x78\x18\x1e\x18\x21\x63\x3c\x00\x0f\x8f\x54\x30\x95\x06\xf0\xb0\x3d\x80\xe7\x12\x2b\xe0\xf1\xf6\x00\x2e\xb4\x37\x40\x87\xc7\xe1\x82\x38\xc9\x1d\x4b\xde\x58\x2a\x8e\xa5\xd9\xb1\xb4\x73\x2c\x7d\x79\x24\xcd\x2f\xf4\x62\xdc\x4b\xdc\x0a\xc1\xa2\x44\xeb\x02\xb1\x70\xb1\x2b\x76\x1d\x3c\xe1\x26\x2c\x76\x3b\x2d\xdc\x54\x4c\xec\x07\x74\x29\xdd\x36\x4e\xb5\x54\x50\x13\x8b\xfc\xab\x14\xaf\x6a\xe4\x5c\xa4\x39\xc2\x22\xa4\x29\x89\x78\x69\xea\xc4\x0b\x6a\xd9\x74\xd7\x37\xc6\xa1\xaf\xa4\xde\x4d\xb5\x51\x4b\xba\x52\x68\x72\xca\x4e\xd4\x42\xcd\x6a\xb3\xd1\x59\xee\x76\x84\xff\xb1\xdc\x97\x9a\xc9\x10\x7a\x4b\x7d\xdc\x8b\xd1\x09\x85\x33\xae\x2a\x44\x42\xb2\xac\xb9\x39\xa6\x4a\xe8\x70\x5d\x4d\xd6\x20\x89\x7e\x08\xcb\x8a\x1d\x59\xaa\xc4\x32\x6e\x26\xde\x21\x73\xae\x29\x44\x31\xa7\x42\x53\xfe\x33\x3d\xdc\x1d\x2b\x96\x61\x45\x71\x84\xca\x61\xab\x98\xa9\xd6\xa7\xf2\x96\x6b\x59\x0b\xa1\x5d\x55\x95\x7c\x54\x54\x16\xc2\x72\xa8\x58\xaa\x37\x6d\xc9\x3a\xd7\x65\x45\xd7\x54\xac\xd4\xc3\x10\x65\x42\xb5\xac\xc4\x5c\x0d\x26\x2d\x25\x9b\xcb\xaa\x47\xc3\x4a\xc0\x8a\x85\xac\x62\xfa\xa6\x5a\xb0\x10\x96\x65\xcd\xce\xa8\x51\xb0\x3b\xc2\x98\x30\xa6\x1b\x86\xac\x6a\x44\xd6\xe7\x8e\xc7\xba\x66\x05\x9e\xc7\xc2\xa9\x2a\xe6\x9a\x20\xdf\xd5\x5d\xc7\x54\x83\xf5\xfa\xa4\x2a\xab\x86\xeb\x4d\x28\x06\xa3\xd6\xa4\x15\xa8\x8a\x1f\x78\xca\x8d\x2a\xe7\x96\xae\x1a\xe1\x74\x18\x4e\xfd\x65\x31\x5e\x8d\x0c\xcf\x52\x0a\x51\xfe\x9e\x89\x2b\x22\x77\x76\x32\xc6\x46\x6c\xc6\xcd\xa2\xe5\x59\xf9\xa9\xa9\xe9\x5c\x1c\xce\x7a\x76\x6c\x9a\x4d\x53\x53\x24\x35\xf1\x44\xa2\xba\xcf\xc2\x6c\xce\x0c\xab\x81\x22\x35\x0e\x34\x58\xbe\x50\xb4\xae\x8d\xad\x49\x2b\x59\x52\xdd\x8c\x2a\xb6\x9e\x69\x50\x2d\x95\xdc\x85\x68\x21\x46\x12\x35\xf3\xaa\x92\xf8\xef\x0a\xd3\xb9\x6a\x1f\x6a\xe8\x56\xb9\x52\xb6\xac\x3a\x6c\x6e\x02\xdb\x7c\x5a\xba\x1b\xeb\x52\x03\x0e\x02\xc0\x01\x38\x00\x8f\xc3\xbf\x6c\x2d\x56\xde\x05\x2c\x3d\x26\xfd\xb5\xc8\x61\xed\x09\x4c\xde\xb3\xf0\x61\xf8\x4d\xd8\x80\x97\xd1\x0c\x30\xd8\x80\x01\xdc\x21\x38\x8d\x91\x08\xed\x8c\xbe\x8b\xad\x74\xf1\x14\x05\x25\x99\x2d\xc3\x6e\x2f\xa5\x08\x45\x22\xb5\xb0\x17\x06\xdd\x34\x15\x40\xa1\x0d\xa5\x99\xe6\x18\xa6\xc6\xa3\x00\x5f\xc1\xfe\x52\x1f\x37\x85\x33\x8d\xab\x54\x6c\xb0\x29\x29\xfd\x97\x97\x02\x6a\xa4\xfc\x60\xb5\x57\xed\xa6\xed\x44\xe9\xfc\xdf\xe8\xd6\x13\x37\x59\x38\xcf\x7d\xbc\x14\xa3\x9e\xa8\x62\xa2\x2d\x29\xa5\x4d\xae\x0a\x1f\x3a\xf1\xb3\x03\x91\x08\x38\xaa\x44\x14\x0c\xcc\x48\x00\xbc\x2f\x09\x26\xbe\x57\x25\xb3\x27\x37\xc6\x5b\x61\x29\x91\x5b\xd8\x6d\xf4\x51\xb8\x18\xa0\x73\xfe\x64\x73\xd2\x17\x65\xc9\xf3\xd7\xcf\xa8\x06\x92\x34\x5d\xfb\xc7\x54\xc2\x0a\xb6\x0d\x15\x29\xda\x23\x5e\xa5\x54\xf5\x2b\x54\xd6\xb1\x33\x3d\xdd\x34\x35\xa4\x30\xd9\xcc\x6d\x73\x75\x5d\x21\x06\x5b\x3a\x33\x27\x2b\x4a\x6c\x28\xb2\x4e\x94\xf8\x60\xd6\xcd\x06\xc1\x57\xbd\x69\x9f\x38\xae\x61\x78\xb3\x13\xe1\xbb\x75\xae\x28\x84\xe4\x3d\xf2\xa8\xd7\xd0\xac\x6a\x25\xd2\x79\x8f\x79\x9e\xaf\x63\xa6\x17\x4b\x11\xd3\x13\x3b\x96\xd9\xae\xff\x5d\x3f\x30\x14\xa2\xf3\xd2\xb4\x1f\xef\xd9\xb3\x27\x2e\xe6\x97\xba\x2b\xa5\xd2\x8a\xef\x61\xb4\xce\xfc\x72\x7c\x38\x66\x0a\x55\x75\xbb\x50\x2c\xf9\xe5\xce\xb2\xae\x60\xdd\xb6\x13\xfb\xcb\xb2\x48\x69\xc5\xcf\x4d\x95\x7c\xc2\xf2\xd3\xf1\xf4\xb1\x69\x2b\xf0\x42\x4b\x00\x4e\xe9\x19\xd7\x26\x39\x2f\xb1\x2a\xb9\xe1\x5a\x05\x4d\xd7\x88\x63\x20\x5d\x67\xba\xa1\x5b\x93\x93\x93\x16\x53\xb0\x44\x72\x49\x5f\xf1\xea\x6c\x40\xd8\x8d\xc7\x89\xe5\x7a\xba\xdd\x9c\x6a\xda\x04\x49\xa6\xef\xf5\xa4\x5b\x89\xeb\x67\x88\xca\x98\xae\x78\x13\xba\x57\x77\x08\x95\x09\x32\x8b\xc5\xc8\x6a\x50\xc5\xcd\xb8\xd7\xb8\x19\x0b\x5f\x21\x21\x89\x5a\x9e\xeb\x9a\x6a\xc6\x0f\x74\xea\x57\xf7\x10\x09\xe7\x97\x22\x73\x26\xaf\x13\xfc\x20\x29\xea\x98\x61\x12\xbb\xc4\xce\xb0\x57\xae\x60\x94\x31\xcf\xf7\x74\xdd\xf4\x6a\x33\x7a\xb1\x14\xeb\x56\x21\x9f\x47\x95\x9a\x4f\x64\x2b\x6b\x1b\x53\x89\xd9\xce\x2a\x8c\x50\x4a\x88\x97\x8b\x2d\xdd\x66\xc4\x6f\xcd\x2f\xe5\x4a\xcb\xb3\x13\x56\x9e\xf8\x13\x56\xd7\xaa\x84\x8a\xee\xaf\x94\xfa\xef\xd4\xe2\x39\x2f\x96\x3d\xe2\x85\x59\xa6\x97\x4b\x01\xcb\x7f\x96\x78\x61\x4e\xf7\xd4\xbc\xe0\xf0\x57\x7c\xd6\x58\xe8\xe6\xe2\x1d\xdd\x39\xcb\x37\x7d\x39\xcc\x65\x09\xf3\xbc\x34\xdc\x47\x82\xca\x04\x9b\x3a\x7e\xec\xf8\x94\x3f\x35\xdb\xca\x97\xd6\xd6\xfa\x25\x3d\x9b\xcf\xe9\xe2\xad\xe9\xbe\xe7\x31\x2b\x72\x31\xb3\xa6\x96\xd6\x26\xae\xff\x4c\x9f\x48\xaa\x4a\x08\x71\x2c\xbd\x18\x18\x04\xc3\x0f\xf5\xf0\xd0\x58\x0f\xef\xdc\xfc\xfd\xcd\xa3\xdb\xb5\xb5\xc7\xb6\x8e\x49\x3f\x18\x1f\xbb\x0f\x76\xa1\x5f\x9d\xbd\x7c\xf6\x6a\xb0\x46\xc7\xfe\x9d\xc0\xce\x2e\xc3\x0e\x38\x00\xc7\xe0\x7a\x78\x00\x3e\x04\x1f\x83\xdf\x85\x3f\x83\x6f\xa1\x1c\x3a\x26\x38\xc8\xef\x6b\x6f\xc0\xff\x09\x8f\x0b\x7d\xcd\xfc\x4f\xd1\x94\xbb\x8d\xff\x35\x14\xe6\xff\xef\xeb\xde\x48\x6a\x7d\xc1\x72\xd4\x4c\xa9\x10\x32\x6b\x72\xc2\x62\x12\x92\x43\x5b\xf5\x92\x6f\x92\xa9\x6a\x38\x7d\x42\x55\x55\x3f\x63\xb0\x7c\x21\xcf\x25\x55\xd5\xd5\xa9\xd2\x8e\x92\x2c\xc9\xd2\xed\x76\x7a\x19\xb7\xa6\x26\x2c\x86\x90\x1c\x5a\xaa\xaf\xa4\x97\x05\x33\xff\x83\xcb\xd6\xe2\xe4\xb2\x2b\x7e\xf6\xf4\x7d\xcd\x8e\x6d\xd9\x08\x8b\x5c\xd5\xef\xb4\xaa\xd5\xaa\xc5\xcb\x13\xf5\xdc\x49\x2e\x29\x06\x0e\x17\x62\xae\x96\xda\xa1\x6a\x3b\x19\xae\x4a\x58\x51\xd5\xd2\xa5\x8d\x03\x86\xaa\x72\x4d\xbd\xc9\x8e\x2d\x99\xff\xd8\x85\x0c\xab\x5c\x0e\xe7\x4b\x86\x5a\x9a\x0f\x54\xcb\xf1\x98\x8a\x25\x55\x5c\x78\x90\xab\x2a\xd3\xd5\x57\x1e\xfc\x99\x9a\x0e\x00\xcc\xf1\xda\x6b\x42\x16\x4a\xb0\x0c\xfb\xe1\x3a\xb8\x0b\xde\x0b\x0f\xc3\x33\xf0\x75\xf8\x0b\x64\xa3\x83\x42\xab\xef\x68\x6f\xc0\xbf\x10\xe0\xf7\xf3\x0b\xa8\x4a\x7d\xb1\x5f\xd3\x5b\xee\x36\x5b\x28\xd1\x4c\x65\x2b\x9d\xbf\x4a\x95\xb0\x69\xa2\x31\xaa\xc9\x08\x75\x2a\x1c\xa9\x15\x6a\x36\x96\x45\x40\x25\x6c\x2a\x89\x32\x25\x52\x20\x12\xfc\x52\x17\x4c\x2c\xd5\xa3\xc0\x73\x8c\xdf\x48\xea\x8c\x26\xc4\xd6\x8a\x91\xb5\x64\x55\x0d\x2d\x2f\xab\xaa\x44\x21\xb9\x82\xa4\x2a\x8a\x54\xea\x67\x0b\x58\x62\x8e\xcf\xb5\x7c\x31\xaf\x4f\x1c\xc8\x62\x22\xb1\xc7\x54\x5d\xe5\x91\xed\x14\x55\x9c\xd1\xfd\xc0\xd7\x56\x88\x57\x20\x12\xc6\x8c\x97\x0f\x94\x0c\xae\xaa\x85\x4a\xe5\x6d\xcc\xb6\xed\x82\x57\xda\x15\x7a\x8e\x1c\xc4\x13\x8e\xd3\x9c\x88\x3f\xf5\xb3\xa7\xcd\xcf\x70\xec\xc5\x8a\x6a\x10\xbb\x64\x31\xcb\xb3\xf8\x9c\xc7\x6a\x96\xc3\x34\x19\x21\x99\x58\xf6\x62\x81\x67\x7d\x53\x92\x09\xd2\x74\x95\x15\xad\x6a\x25\x8e\xbc\xba\xcd\xb0\x8c\x03\xdb\x6b\xdb\x5c\x52\x98\x54\xa6\x35\x9b\x17\x8b\x79\x9d\x21\x3b\x5c\xca\x66\x5c\x8d\xb4\x8a\xab\xa1\x95\x67\xb2\xed\x59\xb3\x59\xbf\x1e\xf9\x94\x2a\x3c\x78\xe5\xdc\xcf\x94\x26\x33\xd0\x37\xef\x91\x66\x70\x1e\x2c\x98\x10\x48\xe0\x7b\xe1\x5e\xf8\x47\xf0\xfb\xf0\x27\xf0\xaf\xe0\x3f\xc1\x27\x36\x80\xc0\xe7\xb6\xaa\x9b\x08\x04\x40\xa0\x01\x04\xba\x40\x60\x3f\x10\x38\x01\x04\xce\x00\x81\xfb\x81\xc0\x43\x40\xe0\x3c\x10\x78\x1a\x08\x3c\x0b\x04\x9e\x03\xb2\x15\x35\x22\xf0\x12\x10\x11\x35\xb2\xe1\x73\x40\x84\x2f\x49\xec\x01\x7c\x68\xb8\x01\x7f\x30\x6a\xd9\x80\x3f\x1d\x49\xb0\x01\x67\x46\x88\x62\x67\xe1\x9c\x48\x2e\x38\x63\x0f\xc0\x18\x21\x89\x7d\x68\x38\xbf\x50\x6f\xd0\x71\x29\x1a\xea\x55\x69\x33\x4d\x61\x49\xfe\x48\xd3\x5e\xfa\xa8\x17\x2e\xb5\x12\x4b\x3e\xf1\xe1\x1a\x55\xda\xf3\x85\xe6\x36\x46\xf5\xff\x5b\xdb\x5a\xa2\x0a\xb4\x85\x3a\xa2\x8a\x15\x35\xb7\x8a\x7c\x96\x04\xf5\x3f\x4d\x66\x23\x81\x72\x6f\x26\x0e\x66\x4d\x6c\x7f\x05\xa3\xc4\xbb\x94\x4c\x09\xa5\x79\xff\x52\xb7\x33\xae\x7d\x8d\x51\xb3\x2f\x35\x7a\x26\xae\xd3\xa0\x84\x04\xc2\x7e\x0b\x35\x53\x34\x90\x64\x6e\x31\x05\x50\x72\x60\x4a\x3e\x0d\xc4\x06\x76\xad\x85\xda\x48\x40\x2a\xf7\x90\x69\x6b\x58\xf5\x97\x3b\xcb\x3e\xf3\x59\xf7\x9d\x7f\x5b\xce\x4b\x9c\xec\x7a\xf2\x4d\x41\x93\xcd\xdf\x7c\xfd\x55\x65\x1b\xeb\xee\x17\xcd\x22\xf3\x9c\x48\x57\xb1\x44\x5c\xdf\x3d\x60\x97\xe2\x3c\x23\xb2\xe1\x31\x96\xf3\xcd\xf7\x75\xba\x59\x4a\x48\xd4\x98\xb4\xcb\x3b\xfb\xab\xc9\xbc\x20\xb3\xb8\x36\x61\x97\x57\x58\xf2\x41\xd5\x0f\x1f\x3e\x5c\x27\x94\x52\x62\xef\x3e\x72\xec\xeb\x85\x28\x63\x32\x22\xc9\xd8\xcf\x67\x4b\x85\xf2\xb1\x19\xd3\xcf\x31\x7b\xa2\x16\xb3\x44\xf9\x28\xa5\x98\xf9\xfe\x8c\x3f\x7f\xf2\xca\x43\x65\xdb\xc0\x38\x38\x3a\xa3\x3b\x06\x27\x85\xfe\xae\xfe\x4c\xc6\x90\x30\xd1\x33\x1c\x5f\xbc\x88\xb0\xf9\x4d\x4d\xa1\x64\xd7\x3b\x67\x57\xde\xb3\x4f\x89\xe5\xa5\xab\x9b\x66\xa9\x14\xbd\x3b\x98\x9e\x5b\x8c\xb0\xac\x52\x8c\x65\x3f\x27\x61\x63\xe7\xfb\xf7\x06\x44\xc3\xb9\x6d\xfe\x7f\x24\x46\x36\xd2\x89\x24\x91\xa0\xe8\x9b\x27\x0a\x07\x8f\x1c\x29\x9f\x38\xea\xb3\xa6\xcf\x68\x79\xfb\x4c\x61\x65\xfb\xea\xbe\x22\x73\xac\x88\x60\x66\x52\x9d\x31\xf9\x80\x4a\x31\xb3\x4b\x05\x8f\x12\xa4\xda\x87\x0b\xc7\x6f\xbc\x75\xde\xaf\xc7\x3e\x61\x26\xe6\x36\x73\x6c\x9b\x31\x1d\x13\xc2\x66\xca\x7a\xbe\x90\x63\x1a\xd3\xf4\x7c\x21\xcf\xe6\x97\x32\xaa\xee\x77\xb6\xad\x14\x28\x91\x24\x56\x2f\xdb\x8c\x61\x3b\x63\x18\x0c\x63\xc3\x26\xaa\x4e\xed\x5a\x39\x47\xcb\x2d\x9f\x19\x8d\x6d\xe5\xc2\xea\xda\xae\x72\xf7\x9d\x5d\x22\xeb\x16\xd1\x19\xb6\x6f\x42\xdc\x76\x15\xc2\x4c\xeb\x5e\xab\xa8\x5e\x2f\x73\xd3\x52\xfc\xc9\xe9\x68\x5e\x57\x5d\xc6\xe7\x42\x43\xb2\xfc\xbc\xee\x7b\x0e\x95\x09\x55\x64\xa3\x98\xf3\x28\x65\xf9\x95\xec\xb1\xe4\xed\xe7\xcc\x14\x37\x23\xd5\x35\x36\xf6\x57\xdf\x0c\xef\x14\x2c\x32\x9f\x84\x6f\x20\x15\x7e\x67\x03\xd6\xe1\x07\x5b\xba\xb6\x0e\x01\xac\x43\x03\xd6\xa1\x0b\xeb\xb0\x1f\xd6\xe1\x04\xac\xc3\x19\x58\x87\xfb\x61\x1d\x1e\x82\x75\x38\x0f\xeb\xf0\x34\xac\xc3\xb3\xb0\x0e\xcf\x89\x2d\x28\xa1\x6b\xeb\xf0\x92\xd8\xc8\xda\x00\x1f\x7e\x00\xeb\x42\xb3\xf2\x63\xa9\x38\x96\x1a\x63\x69\x66\x2c\xdd\x3c\x92\x06\xb0\x6e\x0f\xe0\x5f\x0f\x61\x03\x36\xe0\x4b\x42\x03\x37\xec\x01\xdc\x38\x1c\xc0\x97\xc4\x81\xd7\xd0\xa3\xc6\x3f\xd5\xaa\x8c\xce\xbe\x0e\x3e\xf4\x4d\x6f\x24\x25\x97\x7e\xfe\x75\x70\x8f\x5f\x7a\xc3\x68\x3e\x80\x31\xd2\xdb\xe2\x7f\xb7\x46\xfe\x63\xf8\x27\xf0\x4d\xf8\x0e\x62\x68\x0f\x7c\xe9\xf5\x5f\x27\x9f\x1d\xaf\x93\x5f\x19\x4b\xff\x66\x2c\xfd\xed\x58\xfa\x4f\x3f\x2b\xab\x68\x3d\x25\x26\x40\xff\x2b\xc4\x04\xe8\x7f\x4c\x4c\x40\x95\x70\x44\x9d\xf8\x23\xbc\x04\xa8\xfa\x6a\x62\x82\x37\xd6\x1a\x7c\xf1\x8f\x64\x42\xc9\x3c\x0e\xb8\xef\x7b\xe8\x7a\x49\x37\x0c\xb9\x23\x73\xae\xf1\xec\xa7\x55\x13\x87\xad\x50\x37\x18\x53\x0b\x6b\x87\x96\xcb\xbb\x42\x55\x57\xf4\xfa\xf4\xf4\x84\x35\x35\x3d\x69\xd8\x39\x9b\x18\xd8\x9b\xcc\x5a\xc5\xd5\xd0\x6b\x7a\x3c\x62\x5e\xb5\x5c\x76\x65\x4a\xa9\x93\x9b\x9d\x99\xcd\x53\x4d\x53\xe5\xd8\x96\x90\x94\x9d\xca\x32\x97\x7b\xb3\x9e\x66\x39\xbe\xad\x32\xee\x18\xaa\xed\xb8\x3a\xc6\xbc\x32\x51\x33\xaf\xc3\x5c\x97\xdf\x38\xcb\x79\x57\x26\x84\x70\x47\x55\x24\xdd\x9a\x53\x75\x8d\xa9\xb6\xca\x19\x57\x79\x57\xd6\x54\xaf\x6d\xab\xc4\x30\xa5\x70\xf6\xce\xb8\x79\xc5\x3c\xe1\x72\x6e\x76\x7a\x3a\xca\x4e\x4e\xce\xe4\x74\x82\xd5\x70\xc9\x23\x5e\xa9\x40\x7c\xc2\x54\xae\xe6\x0a\x39\x95\x22\x42\x75\xbd\x54\x2d\x73\x55\x41\xd4\x6b\x66\x64\x09\x4b\xb2\xa9\xba\xaa\xd7\xcc\xa8\xa1\x6f\x51\xdf\x56\x54\x4a\x28\x23\xd9\xb9\xd9\xb9\xec\x92\xa4\x10\x0c\xd6\xd8\x1e\xf8\xef\x63\x63\x8f\xc0\x53\xf0\xeb\xf0\x05\xf8\x7d\xf8\x1b\xd4\x42\xb5\x0d\x38\x87\xaa\x42\x91\xaf\x85\x2b\xb7\xe6\x98\xd7\xa0\x12\x07\xa3\x2a\x9c\x4b\x91\x06\xc6\x12\x1b\x4b\xf6\x48\x1a\xc0\x39\x7b\x00\xf1\x70\x00\x71\x7b\x03\x76\xa1\x2a\x5c\x3b\x82\x20\xbc\x72\x24\x1d\x1c\xb7\x1d\x19\x49\x03\xb8\xd6\x1e\xc0\xc9\xe1\x06\x3c\x3a\xbe\xdf\x13\xe3\xf3\x3f\x33\x3e\xff\x57\xc7\xd2\x9f\x8f\x8e\x8a\xde\x10\x1a\x8a\x3b\xa0\xf9\x17\x47\x71\xc1\x6f\xc1\xbf\x16\x2f\xe0\x25\xf8\xaf\x62\x26\xfb\x96\x98\xc1\x06\xf0\xaf\xc5\xc9\x3f\xf9\x78\xe1\x4f\xb7\xd1\xf2\x0f\x7f\xa2\x11\xc2\x7f\xf6\x46\x9a\x2e\xa5\x9b\x7e\xe2\xc1\xbf\x8b\xfa\x1b\x66\x5e\xdc\xdc\x04\x67\xf3\x71\xe9\x32\x6c\x4a\x0d\xb8\x7a\x14\xcb\x3f\x88\xfe\xe1\xec\xe5\xb3\x57\x6f\x6e\x42\x66\xf3\x8b\x52\x13\x57\xa4\x06\x9c\x18\xed\xc5\x9d\x80\xcf\x2e\xd5\x1b\x14\xf4\xd1\x31\x34\xf6\x6d\xee\x80\xf7\xc1\xe3\xf0\x1b\xf0\xa7\xf0\x1f\x01\x5e\x33\x67\x01\x8d\xd4\x46\xc0\x48\x8d\x61\x3a\x12\xdd\x93\xba\xa3\x82\x7c\x89\xf6\xbc\x60\x29\xc6\x8a\x80\x95\x92\xa8\xe0\x62\x16\xda\xd5\x49\x94\xaf\x1b\x34\x5b\x48\x80\x7e\xfa\x5b\xf1\x3b\x24\x58\xbe\x9a\x2d\xac\xf8\x82\x6d\xb9\x17\x4b\x9e\xe8\x1f\xa7\x90\x1c\x23\x64\xab\x7e\xda\xef\xd2\xeb\xb2\xad\x76\xf1\x4f\x2c\x83\x60\x59\x56\xac\x42\x2e\xbb\xb2\xb2\xec\xe5\xd6\xb6\x2f\x5a\x39\x9f\xa8\xbf\x66\x79\x89\xe3\x59\xaf\x57\x34\x85\x48\xba\x56\x8c\x8b\xd3\x0e\x33\x0b\x9e\x2a\xeb\x3e\x97\x2c\x52\xac\xd6\x3f\x52\xf1\xbc\x99\xd6\x42\x96\x39\xc4\x2c\xcf\xc7\x0b\x87\xaf\xd6\xb2\xb9\xac\x3e\xbb\x63\xc2\xa6\x5e\x2d\xda\x71\xcb\xc2\xe4\xaa\xa7\x1b\x4e\xc6\xca\x65\xf3\x16\x27\xba\xae\xdf\x5c\x5d\xc8\x5a\xf1\xd1\x05\xbd\x3a\x3d\x9f\xcd\xcd\xcf\x36\xad\x0c\x27\x8e\xe6\x2f\x7b\xb9\xb9\xd6\x62\x4c\xa8\x4c\x89\xf4\xee\xd7\xde\xf4\xbf\xd8\xcf\x75\x57\x56\xe3\x4c\x6b\xba\x2c\x13\x99\xd8\x16\x55\x48\x90\x8b\x0e\x1e\xbd\xd2\xb0\x1a\xcd\xba\xa5\xeb\x58\x26\x56\xa5\x1c\x69\x56\xc9\x91\x2b\x0c\x8b\x07\xcb\x34\x9b\x4d\xcf\x73\x88\xb4\xbc\x70\x45\xa4\x3b\x8a\x62\x69\x61\x26\x5e\x59\x9e\xb1\xf4\xe6\x43\x9a\x82\xbd\xfe\x65\x27\xe6\xa2\xb5\x95\xb6\xa9\xeb\x0d\x6f\x5f\x5c\x3d\xb8\xaf\x9f\xd5\xe3\x82\x2d\x1b\x0a\xc1\x72\x7c\xd9\x89\x53\xb3\x8b\xd7\x64\x72\x55\x8f\x10\x49\xf7\xbd\xea\xd5\x27\x4f\x36\xa3\x83\xb1\x9e\x0f\x98\x9c\x4c\x37\x62\x8f\x8b\x6c\x7e\x51\xea\xe1\xdb\x47\xdf\xf7\x7e\xb8\xf3\x33\x1f\xdb\x7e\xdf\xf6\xb7\x8a\x63\xb6\xf8\xbe\x83\xf1\xb7\x7f\x1f\x50\xf4\x6b\xed\xcf\xb4\x3f\x02\x66\xfa\xed\x4b\xdf\xff\xb1\x75\xfc\x71\x78\x1a\x06\xf0\xa7\xf0\x3d\x14\x88\xdc\xec\xfb\xda\x3f\xf9\x95\xea\xa7\x41\x63\x7e\xef\x27\xba\x1e\x5d\xbc\xf9\xa7\x51\x95\x8e\xfe\xe4\xd7\x9d\x3b\x7f\x3a\x35\x4d\x05\x07\x76\xa2\xdf\x93\xae\x82\x0c\x2c\xc0\x5e\x38\x0a\x0f\xc0\xa3\xf0\xab\xf0\x0a\xfc\xdc\x06\x7c\x4f\xb8\xac\x29\x76\xc6\xe5\xa2\x9a\xec\x7b\x23\x62\x32\x6d\x24\x0d\xe0\xf8\x70\x03\x6e\x86\x1b\x47\x98\x1a\x67\xc7\xd2\xbb\xc6\xe7\xfe\xfc\x58\xfa\xe8\xf8\xaa\xcb\xed\x01\x7c\x6e\xb8\x01\x5f\x18\x1f\x7b\x61\x2c\xfd\x87\x91\x34\xbf\xd0\x53\x68\x20\x6c\xb6\x2a\xad\xd1\x6a\x5a\xe4\xbc\x18\x06\x8a\x47\x9b\xa2\xdc\x51\xe4\x23\x89\xba\xc6\x34\x59\x30\x59\xbe\x52\xec\xea\x94\x31\x4a\x10\xfa\x0b\xc8\xb4\x45\x2a\xf6\x8b\x68\x4b\x52\x44\xfe\x9f\xdf\xe8\x75\x97\xfc\xa5\x45\xea\xf7\xb1\x80\x82\x10\x59\xc3\xcd\x9a\x67\x8e\xea\xad\xab\x8d\x66\x63\xb9\x57\x6d\x28\x35\x5f\xf4\x44\xbd\x74\x24\x7d\xd4\x69\x2e\xa6\x04\xae\xa6\x64\xa1\x94\x23\xd2\x44\xbe\x27\xec\xc2\x54\xe5\x45\x83\x28\x9f\x48\xef\x22\x8c\x52\xa5\xd6\x47\x9d\x3e\xee\x2c\x2d\x77\x05\x88\x23\xee\x2c\xa7\xc6\x65\xd0\x97\xfe\x69\x53\x37\xb4\x4c\xb3\x5a\xd4\x74\xaa\x11\x37\xe3\xca\x3a\xde\x85\x25\x59\x4b\xec\x2a\xdd\xd5\x2c\x4d\xcf\x38\x26\x31\x39\x91\x64\xd9\xf5\xc3\x1d\x56\x54\xaa\x66\x72\xe1\xcc\xcc\x6c\x36\xd3\x9e\x9b\x32\xe7\x4f\xff\x9e\xe7\xc8\x52\xd6\x22\x28\xd6\x34\x4d\x25\xaa\x96\x5d\xee\x2c\x85\x84\x12\x2a\x23\x49\xd2\x4c\x55\xad\x1c\xbc\xf4\xb2\x86\x20\x23\xf6\x6a\xff\x3f\x83\x69\x48\xd3\xc2\x6c\x56\xcb\x54\x99\xfe\xa8\x56\xd2\x4d\x43\x73\x75\x59\xd1\xcd\x62\x3e\xab\x31\xf3\x70\xa6\xca\x32\x34\x37\x31\x69\x2d\x45\xfd\x9d\x6b\x91\x2c\x61\x2c\xc9\x0a\xd1\x55\x99\x18\xa6\x49\x74\x89\x28\x99\x3d\x91\x16\x06\x2e\xd1\xb4\xcc\x74\x71\xe5\xea\xf9\xa6\x86\x89\xe3\x18\x39\xa2\x68\xf2\x2e\xcd\x35\xb5\x52\x26\x19\x00\x91\x4d\xd3\xfc\xc3\x65\x3d\xd6\x75\xc9\xf2\x35\x4e\x64\x95\xe8\x13\x3d\x24\x29\x22\x31\x98\xb9\xba\x16\x27\xc3\x92\x33\x41\xa8\x6b\x18\xe3\x6d\x8c\x2b\xa4\x20\x2b\x3a\x95\x4d\x2c\x2b\xa1\x76\x42\x2b\x4f\xd4\x2d\xbd\x32\x31\xd1\xb1\x99\x46\x2d\x4b\x47\x04\x69\xc9\x90\x8e\x60\xac\x14\x6c\xcd\x52\x25\x59\x37\xc4\xf3\xe0\xfb\x75\x2f\xe3\xe9\x1a\xc1\x8a\xac\x78\x7a\x69\x4d\xd3\x0c\x43\x8f\x75\xf1\x5a\x29\xd6\x0d\x92\xc9\x67\xea\x58\xd3\x63\x3d\x5b\x0a\x6d\x8d\x6b\x88\x3b\xc4\xaa\x37\xea\x96\x8c\x29\x21\x0a\x13\x48\x5b\x5a\x90\x0d\xf5\x62\x53\x27\x48\xb5\xf4\x58\x8f\xa6\x5c\x83\x45\xfb\x23\xcd\x32\x6d\x5d\xf0\xb1\xc9\x8a\x66\x5b\xc5\xb9\xa2\xaa\xa9\x1a\xd1\x65\x10\xeb\x12\x6c\x3e\x29\x71\xcc\xa4\x06\x9c\x1a\xd9\x64\xc7\xe0\x2f\x44\x7e\x94\xbe\x75\x6c\x64\x93\x5d\x0d\xa7\xe0\x0c\xdc\x03\x1f\x83\x6f\x20\x1b\x18\x0c\xe0\x9f\x0b\xee\xe3\xff\xe5\x58\x2e\xfe\xf1\xec\xa8\xe4\x7c\xbf\x39\x2e\x49\xce\xa4\xb5\x75\x7d\x5c\x17\x3b\xa4\xb1\x48\x65\x55\xa8\xf8\x44\x5b\x48\x60\xc6\xd7\xb7\xa0\x93\x70\xa7\x26\x50\x61\x62\x9c\x7c\x9f\xe2\x3b\x8d\x71\xd8\x13\xda\x96\xe6\xf2\x87\xc9\xb2\x95\x74\xbb\xdc\x50\xaa\x02\xec\xad\x99\x6e\xd7\x8a\xc5\xa8\x8f\x7a\xbe\x20\xa9\x4a\x31\x9c\xfa\x64\x69\xc4\x3f\x85\x82\x10\x3d\xf2\xbf\x69\xb2\x79\xcb\xdd\x25\xff\xc7\x8c\xb6\x9e\x45\x33\xae\x19\xd9\x2a\x31\x89\x2d\xab\x7c\xa6\x60\x53\x6a\x33\x45\x2f\xd7\x5c\xed\xe2\xed\xb6\x4c\x28\xf5\xe7\xb7\xed\xaa\xeb\x7e\xc6\x26\x33\xbb\xce\x94\x19\x63\x8a\xcc\x6a\xe8\xb7\x89\x91\x9d\x2c\xfb\x95\xa8\x68\x13\xcb\xd0\x0e\xd8\x48\x25\xba\x5e\x28\xd7\x7d\x7f\x66\x72\xc2\x26\x12\x4e\x66\x70\x2c\x11\x93\x30\xc6\x08\xd3\x33\x16\x61\xb5\x1d\xc4\x54\x25\x66\xe9\x5c\x51\x68\xcd\x4f\x46\xcf\x98\xc2\xfc\xc6\x44\xc3\xdf\x7d\x53\x40\x08\x21\x6c\x39\x10\x8e\x00\x21\xee\xf4\x34\xe3\x2a\x25\x4c\x91\x90\xe6\x27\x9e\x83\xcd\x04\xcc\xc9\xff\x6e\x3c\x97\xba\x61\x96\xff\x98\x59\xf7\x83\xc1\x0c\x61\x36\x7b\x9f\x5d\x2e\x97\xed\xc4\x77\x43\xbf\x42\x2a\xcd\x26\xf3\x57\x02\x7b\xa9\xbf\x47\xae\x5f\x79\xf5\x55\xf5\xfc\xf6\xb9\x80\x11\x85\x39\x76\x91\xcd\x74\xbd\x56\xb9\x7e\xf9\xe5\x97\x37\x58\x4e\x29\x1f\xd8\xb7\xe6\x33\x56\x28\xb3\xc2\xc2\x52\xb7\x3c\x7f\xf2\xfa\x9b\x3a\x76\x9c\xb5\x98\x9c\x89\x6d\x95\xa9\x7a\x3e\x2a\xdb\x66\xb2\x7a\xac\xde\x77\xdf\x7d\xab\xf8\xc1\x99\xf5\xeb\xae\x9b\x36\x59\x2e\xeb\x91\x00\x33\x99\xca\xc1\x54\xc0\x3c\x43\x26\xe5\x5b\x77\x4d\x5f\x76\x70\x7f\xbd\xdc\xf2\xc5\xf6\x69\xfd\xf8\x91\x3d\xbe\x5e\xaa\x4e\xd8\x4a\xae\x18\x85\x16\xc3\x58\xa2\xc9\x01\xd8\xdc\xdc\x7c\x69\xf3\x49\x29\x16\xf6\xde\xa9\x51\x4e\xd3\x7b\x37\xdf\xba\x63\x49\xe4\x34\x09\xdd\x91\x02\x89\x8a\x63\xfa\xe6\xc5\x8b\xd3\xd2\x57\xf1\x35\x23\xbc\xcc\x6b\xe1\x16\x78\x3b\x7c\x00\x1e\x87\x3f\x43\xa6\xb0\xed\xbe\xfd\xe3\x7a\x44\x5e\xa5\x47\x26\x16\x6a\x14\xfc\x8f\xdd\x1c\x01\x1c\xb8\xa5\x49\x58\x38\x3a\x8b\x22\x4d\xa0\x47\x1b\x26\xca\x24\xdf\x7c\x1f\xed\x44\xfd\x94\x8a\x53\x14\xe3\x37\xd3\xca\x3e\x2f\x96\x96\x46\xa0\xbe\x23\x14\x5d\xbc\x85\x37\x82\xc3\xe4\xb8\x28\x9b\xe9\xe3\x4e\x1f\xf7\x96\x5b\xc2\x8a\x14\xad\x92\x6f\xa2\xe6\x34\x32\x91\x52\x13\xfc\x83\x82\xc0\xa0\x8f\x9b\xdd\x58\xda\x2e\x78\x5d\xf1\x4e\xb4\xd8\xeb\x76\x62\x24\xf9\x51\xaf\xdb\x8d\x91\xaa\xca\xf2\x9e\xf7\x6d\x67\x2e\x92\x0c\x93\x5f\xfc\xcf\x9a\x44\x34\x39\x70\x19\x62\xec\xf7\x8a\x73\xb3\xad\x68\x2e\xf9\xda\xa4\xec\xea\x6a\x27\x23\x50\x3e\xbc\xda\xd1\x9c\x69\x68\xaa\x6d\xef\x7b\x6c\x27\x96\xa9\x42\xa6\x1c\x46\x4c\xaa\xf9\xed\xd6\x8c\x93\xad\xc4\xa5\x8b\x65\x56\xa9\x37\x9c\xa0\x14\x46\xbb\x76\xcc\x7f\xfe\x30\x9f\xa8\x97\xa9\x91\x0f\xd7\xc2\xa9\x0f\xbb\x32\xcf\x50\xc7\x52\x35\x7e\xb2\x45\x6b\xcd\x1a\x7a\xa2\xda\x8c\x8a\x21\xd1\x18\xa5\xf9\x5a\xe3\x68\xb4\x38\x53\xe5\x54\xfc\x93\x8f\x72\x94\x57\x9a\x73\x21\x93\x99\x69\x7a\xae\x9d\xcb\x95\xc3\xb0\x5e\x9d\x08\x08\x96\xe8\x27\xa9\x65\xea\xd5\xdd\x7b\x2f\x6b\x65\xf2\xd9\x0f\xb0\x90\x2d\x5f\x7b\x64\x7f\x55\xe3\x5a\xfb\xce\x15\xea\x87\x3e\xb5\x58\x7d\xaa\xce\x98\xc5\x1d\xa6\x39\x41\x99\xda\x5c\xa6\x4e\xb5\x5a\x75\x62\xc7\x73\x3d\x87\x07\x9e\x43\x1f\xc0\xb2\x5a\x3b\x20\x7d\x5a\xc9\x15\xf3\x0a\xb3\x4d\x4b\x2b\x2c\x9a\x85\xa5\xac\xaa\x50\x05\x79\x8d\x66\xd3\x5f\x56\xf5\x5c\x3e\xf7\x4e\x94\x2d\x78\xf2\x5b\x31\x42\x88\xf8\x85\x6c\x3e\xc3\x0a\xc5\xd8\x54\xa3\xf6\x49\x05\x93\xda\x81\xc9\xcc\x8e\x9a\x82\x91\xf4\x5b\x4a\xc3\x94\x2d\x19\x5b\x99\x2c\xa7\x41\xde\xfe\xfb\xef\x11\x42\x8c\x7c\x48\x91\x16\xa1\x47\x5b\xad\x53\x27\x4f\xb5\xb2\xd3\xec\x93\xad\x93\xe8\xdf\x87\xad\xf9\xe5\x28\xea\xef\xd9\x5b\x6d\xcd\x2d\x5f\xbf\x7e\xcd\xed\xce\xdc\xfc\x62\x40\x6d\x4b\x8f\x56\x57\x56\x66\xaa\xbb\xf6\xec\x9f\xa4\x3a\x45\x34\x6a\xcf\x4c\x85\xd5\x22\x27\x9c\x87\x2c\x5c\x5c\x5a\x0a\xa3\x3d\x7b\x76\x04\xb5\x4b\x0f\xec\x2d\xb2\xd0\xb3\xa9\xe5\x46\x51\xe4\x9c\xf8\xfc\xd3\x9f\x39\x94\xbc\x58\x1c\x4e\xb1\x53\x5f\xfb\xbd\xaf\x9d\x4c\x2c\x47\xba\x3a\xc7\x30\xa5\x4b\xb7\xde\x7a\xeb\x32\x0b\x79\xb0\x7d\xe7\x5a\xf8\x39\x5e\x28\x55\x1d\x2a\xab\x9a\x33\x39\x3d\x17\x3a\x71\xa9\x16\xae\x49\xb2\x1e\x86\x60\x8e\xf4\x61\x79\x8c\x91\x7e\x04\xae\x81\x5b\xe0\xfd\xf0\x8b\xf0\x29\xf8\x6d\xf8\x2a\xfc\x67\xd4\x93\x16\x7e\x1c\x2f\xfd\x5a\xc1\xc8\xb2\x01\xb7\xc1\x69\x61\xe7\xdd\x26\x6a\x42\x06\xf0\x77\xed\x14\x3b\xfd\xef\xb6\x10\x7f\x22\xf8\x2e\x44\x5b\xf5\x78\x11\xe4\x20\x82\x29\x88\x60\x05\x22\xb8\x14\x22\x58\x87\x08\x6e\x83\x08\x1e\x80\x08\x1e\x81\x08\x9e\x84\x08\x9e\x81\x08\xbe\x02\x11\x3c\x0f\x91\x40\xfc\x49\x11\xd8\x7f\x14\x3b\xfd\xef\x46\x54\x29\xaf\xea\xe9\x34\x7c\x17\x4e\x6f\xf5\x74\x1a\x72\x70\x1a\xa6\xe0\x34\xac\xc0\x69\xb8\x14\x4e\xc3\x3a\x9c\x16\xa3\x7d\x00\x4e\xc3\x23\x70\x1a\x9e\x84\xd3\xf0\x0c\x9c\x86\xaf\xc0\x69\x78\x1e\x4e\x8b\x9e\x4e\xdb\x3f\xac\xce\x3b\x33\xdc\x80\x47\xc7\x3d\x7d\x04\x0c\x08\x47\x68\x47\x5b\x6d\xbf\x03\x47\x47\xb1\xce\x64\x84\xbf\x3b\x1c\xc0\xef\xb6\xd3\x51\x7e\x79\x38\x80\x2f\xb7\x37\xe0\x6b\xa3\x73\xd3\x33\xfe\x7a\x38\x80\xbf\x6e\x6f\xa0\x99\xad\x3b\xa0\xce\xf8\xf8\x6d\xf6\x00\xad\xbc\x08\x03\x78\x4f\x7b\x80\x78\x7b\x03\x30\xe2\xf0\x9e\x51\x50\x77\x4b\x32\xc6\x92\x3b\x96\x0e\x8f\xa5\xa3\x63\xe9\xca\xb1\xf4\x73\x63\xe9\xd1\xb1\xf4\x91\xb1\xf4\xc4\x58\xfa\x95\xb1\xf4\x9b\x63\xe9\x77\xc6\xd2\x97\xc7\xd2\xd7\xc6\xd2\xf7\xb7\x24\x34\x33\x96\x3a\x23\xe9\xb5\xc2\x99\xff\x31\x17\x79\x7c\xed\xff\xcc\x49\xfe\xa9\x99\x6d\xbf\x9f\x09\xf4\xec\x64\x25\x36\xf5\x30\x1b\xd6\x3c\x03\x23\x12\x7b\x7a\x4e\x0f\x0b\x45\x61\x48\x47\x9d\x3b\x93\xd5\x4b\x2f\x64\x6d\xb3\x52\xad\x58\x58\xd7\xb9\xb6\xdc\x38\xd2\x94\x25\x22\x3d\xe4\x85\x5a\xb6\x59\x8d\xac\xcc\x52\xcb\x33\x24\x89\x44\x19\xbd\xa0\x65\xf3\x45\xb1\x74\x16\xbb\x77\x68\x9a\x9e\xcf\x3a\xe9\x85\x9a\x66\xb2\xe5\xe6\x91\x06\x91\x08\x7e\xe5\xf9\x37\xd8\x44\x7c\xda\x6b\x78\xc4\x8e\x26\x2c\xa2\x11\xf4\xf3\xde\xf4\xcc\x4c\xc6\x9a\x9a\x6b\x95\xef\xb1\xb0\x6e\x11\x2b\x2a\x57\x33\xb6\xee\x55\x4a\x91\xa9\x7b\x41\x56\x54\xbd\x68\x5a\xf3\xfa\xf9\xeb\x6c\x5d\xb7\xb8\xfe\xa0\x57\x4f\x2e\xaf\x59\x3a\x7f\x64\x7c\x71\xe5\x1e\x13\x6b\x16\x31\xa3\x72\xd5\x73\xb4\xe6\x8e\x48\xf3\x82\x9c\x99\x5c\xaa\xeb\xcd\x53\xf3\x27\xc5\xa5\xec\xbf\xed\x7d\x83\x4d\xd5\xc0\xc1\xdc\xfc\x75\xe9\x29\xe9\x02\x64\x61\x01\x0e\xc3\x9b\xe1\x43\xf0\x3b\xf0\x1c\xfc\x15\xfc\x57\xe4\xa0\x0e\x3a\x09\x3d\x18\xc0\x6f\xb5\x07\x68\xbd\xbd\x01\x37\x42\x4e\x4c\xd0\x3d\xc8\xc1\x8d\x62\x8a\xc9\xd9\x03\xf8\xe3\xe1\x06\xbc\x34\x6e\xb9\xd1\x1e\x20\x4b\xec\xba\x48\x81\x1f\xe3\x14\xf1\x38\x35\xe2\x13\xb7\x93\xfa\x63\x0c\xb1\xe5\xb4\xd1\xc4\x7e\x8a\x55\xe6\x51\x41\x8e\xbc\x2c\x70\x53\xd1\x8f\x46\x8c\x3a\xbd\xc5\xa0\x29\x6a\x6f\x85\x3a\x89\x8d\x8e\x11\x94\xbf\x9f\x9c\x9e\x26\x53\x4a\x8d\x14\xf3\x78\xb9\x3b\xaa\x8c\x5b\x0c\xd0\x4f\xc7\x30\x2e\x73\x4c\x8c\x79\xb1\x36\x19\x56\x2f\xdd\xb7\x16\x4e\xee\xdf\xb9\xbd\x18\x4d\xe5\xf8\x1f\x53\x2a\x49\x4c\x2b\xce\x86\xdc\xe0\x06\x43\x5a\xc6\xe1\xae\x97\x9b\x4d\x9c\x4a\xa7\x59\x2d\x50\xc7\x71\x9c\xb0\xc0\x6a\xb5\xe4\xe2\xc7\x39\xc3\xae\x43\xdd\xb0\xe8\xd4\xe6\xab\x39\x46\x25\x4c\x2e\x5b\x3d\xb9\x52\xdb\xb9\xb2\x1c\x86\xcd\x40\x66\x3c\x6e\xed\x6e\x45\xcb\xad\x49\xb7\x3a\x13\x65\xb8\xab\x4d\xee\x99\xa4\x8e\x17\x1e\x9b\xbc\x64\xc6\xe2\x74\x7a\xc7\xc1\x5a\xb8\xb6\xef\xd2\x6a\xd4\xaa\x47\x9c\xea\xa6\xe3\x66\x3d\x97\x3b\x4b\x3b\x2e\xa9\xd5\xf6\x5e\xbc\xff\x8d\x30\x4a\xf4\xd1\xda\xe5\x57\x5e\x3d\xe9\xcc\xcf\xc4\x14\xb3\x38\x62\x72\xd0\x0c\xab\x57\x5c\x79\xf5\xc7\x75\xa2\xa8\x53\xfb\x76\x74\x42\x2e\x71\x9f\x87\xbd\xde\x82\x9b\x4c\x2b\x7d\xca\x19\xa7\xcc\x2b\x3a\xe1\x8e\x9d\x6b\x61\x86\xaf\xbe\xa7\x1d\xc6\x9e\x71\x22\x5c\xdb\xb9\x23\xe4\xbe\x45\x68\xa9\xd5\x0d\xc3\xa9\x7a\xcd\x39\xb2\xf8\x69\x6a\xd5\x16\xa2\x68\xef\xc1\x4b\xab\x53\xa7\xae\x58\xa5\x18\x9b\x0e\x9f\xdf\xb1\x27\x5a\xb9\xf3\x96\x93\x53\x02\x66\x4a\x9b\x3a\x75\xeb\xbd\x3b\x5b\xc7\x0e\xee\x2a\x46\x79\x4d\xa2\xf5\x85\x6e\x38\x79\xf5\x95\x97\xd7\x9c\xe6\x54\xd3\x89\x96\x26\x0b\xd4\xbd\xf8\xad\x37\xc2\x28\x41\x05\xd8\xfc\x65\x74\x85\xf4\x3c\x38\x50\x85\x15\xb8\x19\xee\x87\x0f\xc1\x53\xf0\x3c\x7c\x64\x03\x6a\xe0\x0a\x3b\xcc\x1d\x21\xcc\x03\xb8\x23\xf4\xf6\x19\x70\xa1\x26\xa4\x4b\xc6\x6d\xb7\x8c\xa4\xf4\xfc\x77\xa4\x68\xb5\xf0\xf0\x70\x03\x3e\x3a\x3a\x3b\x45\x9f\xff\x8c\xa0\xfa\x4c\xcf\x85\x01\xac\xb6\x07\xf0\x99\xf6\x06\x1c\x11\xd0\x6a\x29\xc7\xae\x3e\x4c\x7f\xdf\x36\x4c\x01\xd1\xbe\x24\xd0\x62\x71\x4d\x14\xfc\xc7\x82\x6c\x09\x2b\x81\xad\xa4\xda\xd5\x42\x3d\x11\x0f\x4b\x79\xaf\x97\xfb\x52\x67\x04\xe3\x93\xac\xb1\xfe\x52\x9a\x65\x1d\x78\x22\x18\xad\x24\x67\xb4\x04\xe2\xea\x62\x17\xbf\xf6\xb7\xfc\x53\xa7\x54\xae\x87\x84\x10\x5e\x8c\x8a\x9c\x65\x6f\xda\x39\x3f\x9f\xf5\x35\x4c\xa9\x84\x55\x1e\xaa\x25\x59\xe3\x86\x97\xdd\xb5\xad\x46\x75\xa6\xbb\x73\x8b\x4b\x5f\xa2\x86\xa5\x70\x9e\x29\x51\xc7\xb1\x29\xf5\xb3\x01\xe5\xdc\x9d\x9c\x6d\x65\x69\xce\x57\x39\xb3\x6c\x3a\xb1\x18\x6e\xbf\x75\xef\xeb\x76\x67\x25\x51\x63\x4a\xa9\x4a\x93\x95\x38\x5b\x92\x7e\xf9\xf4\x2f\x5e\xfc\xa3\x27\x9d\xa9\x99\x76\x18\xed\x3b\xb0\x37\xda\xf1\xf0\xb5\x13\x97\x1d\x39\x5c\x3b\xfd\xb5\xd3\x9c\x79\x53\x53\x07\x1e\x7b\xec\xb1\x03\x5c\xd2\xcc\xc9\x23\x1f\xff\xf8\x2f\x1d\x09\x4b\x21\xd7\x30\xa6\xd4\xf6\x43\xce\x33\x32\x46\x74\xf7\x7b\xde\xfd\xe0\xee\x70\xba\x51\x73\x6b\x07\x6a\xf6\x2b\xfd\xd7\xbb\x07\xe0\x9b\x9b\x9b\xef\x93\xae\x92\xbe\x01\x01\x34\xa0\x05\x87\xe1\x24\x7c\x0f\xa9\x28\x8b\xca\x68\x0d\x1d\x41\xdf\x46\x2f\x0f\xd0\xbf\x6d\x0f\xa0\xd9\x16\x76\x7d\x13\xbe\x0b\xcd\x2d\xbb\xbe\x09\x39\x68\xc2\x14\x34\x61\x05\x9a\x70\xa9\xc0\xde\x68\xc2\x6d\xd0\x84\x07\xa0\x09\x8f\x40\x13\x9e\x84\x26\x3c\x03\x4d\xf8\x0a\x34\xe1\x79\x68\x0a\xbb\xfe\xce\x17\x37\xc0\x85\x66\xca\xe8\x84\xfe\xed\x18\x43\x6c\x00\x07\x5e\x4c\x7c\x9a\x65\x38\x20\xbe\xf9\x65\x7b\x00\x6b\xc3\x0d\xd8\x33\x6e\xb9\x53\xe0\x46\x6f\xc0\x5b\x7e\xa4\xe5\xae\xe1\x00\x0e\xd8\x03\xf8\xad\xe1\x00\x9a\xf6\x00\xbe\x30\xdc\x80\xaf\x6f\xdd\x5f\x9c\xf1\x2f\x87\x1b\x48\x1e\xb7\x34\xed\x01\xca\x0d\x37\x50\xf1\xd5\x3d\xa1\xc6\x70\x03\x35\x7f\xa4\xa5\x3d\xdc\x40\xcb\xe3\x96\x03\x89\x4f\x90\x32\x38\xa1\xa3\xc3\x0d\x74\xdd\xab\xc7\x80\x6e\x18\x1d\xb9\x29\x1d\x0b\xfa\x74\x3a\x16\xf4\xd9\xe1\x06\x7a\xf6\xd5\x63\x41\xdf\x18\x9d\xf9\x52\xe2\x5f\xbc\xb7\x3d\x40\x77\xb5\x37\xe0\x79\xb0\x84\x7d\xb0\x02\x6b\x42\x97\x2d\x7b\x00\xae\xa0\xa6\xb0\xe0\x79\x71\x69\xd2\xf2\xf5\x17\x53\x12\xa9\x15\x7b\x00\xbf\x3a\x4c\xa7\x8b\xaf\x0e\xc5\x31\x91\xdc\xe1\xda\x03\x24\x0f\x37\x90\x36\xbe\x6a\x45\xc0\x90\x0d\x60\xcd\x1e\xa0\xd6\x70\x00\x5f\xb7\x07\xe8\xba\xf4\x0e\xe8\xe3\xa3\x2b\x7e\x67\xd4\xfe\xec\x70\x00\xcf\xdb\x03\xf4\xd5\xe1\xfc\x42\x58\x35\x25\x45\x04\xdf\x47\x36\x7c\xb5\x51\xa5\xa2\xea\x03\xf5\x52\xda\x72\xc1\xd6\xbd\xd8\x97\x70\xd5\x94\xfc\x9e\x2f\x0a\xf4\x95\xa5\x18\x0b\xb5\x6f\x21\xda\xf4\x04\x5a\x52\x98\x78\x09\xb8\x1e\x98\xb2\x22\x52\x2e\x82\xbe\xb4\x44\xbd\x12\x4a\x39\x23\x6b\x22\xec\x98\xc2\x81\xf4\x51\xaf\xd1\x5d\x16\x55\x20\x41\x18\xd4\x52\x7e\xdd\x99\x94\x37\x32\x14\xdc\x47\x02\x9b\x2c\x71\x34\xfc\xa5\x3e\x0a\xb7\xf0\xe3\x6b\x9d\xc4\x14\xe9\x75\x97\x04\x12\x6b\xb3\x41\x15\x13\x25\xa3\x69\xf4\xba\x23\x42\x5f\xf4\xb3\xf4\x30\xbf\x1e\x46\x19\x4e\x59\x10\x84\xac\x79\xf4\xf2\xa3\xcd\x70\x92\x2d\xde\x7c\xd3\xe9\xeb\xc2\x9c\x6d\xb2\x20\x0e\x18\xc6\x12\x09\x14\xb4\xca\xeb\x8c\xf9\x0e\xbb\x8d\x15\x02\xcb\x72\x19\x53\xf9\x5c\xb2\x5a\x3a\x53\x95\x0c\xb5\x82\xfc\x8b\xba\x61\xd1\x60\x8a\xcd\xb9\x2a\xcf\x45\x45\xf4\x0d\x8b\x14\xdb\x9d\x6e\x40\xb0\x8c\x8b\x4b\x8b\xcb\x45\xce\xcd\xb0\x5f\x15\x7d\xb0\x62\x5c\x71\x74\xd3\xa2\x8e\x5f\x9c\x6d\x56\x77\x06\x14\x6b\x4e\x38\xc5\x64\x09\x6b\xcc\x50\x15\xca\x1c\x93\x53\x33\x9c\x64\xe1\x7c\xb5\xb2\xbe\x8d\x79\x74\x62\xbe\x13\x38\xad\xe9\x88\x65\xac\xbb\xfe\xea\x2e\x95\x62\x56\xdc\xb6\xbd\x5f\xa9\x5e\x3d\xa7\xc8\x72\x10\x39\x8a\x38\xe3\xe8\x3b\xb6\x09\x82\x5f\x49\x92\xe4\xe6\xa9\x53\x27\xaa\x4e\x31\x70\x2e\xde\xfc\x33\xff\x88\x9a\x57\x8c\x19\xc5\x58\x66\x1a\xd7\x58\x2e\x94\xd5\x47\xc3\x6e\x7f\x4f\x85\x4d\x05\xac\x50\x2c\x30\x9e\xff\x45\x16\x32\xdd\xb4\x90\x4b\xcd\xd0\xb1\x2c\x86\x3d\x46\x6c\x2f\x60\x4e\x75\xa2\x19\x3a\x06\xc6\xb3\x2c\xc8\x17\x1d\x36\x15\x44\x56\x31\x97\x0b\x03\x36\x77\xe9\xce\x5e\xa7\x13\x53\x22\x49\x89\xc7\x32\x77\x73\xd5\x0a\x67\x42\x82\x55\x4d\xb8\x37\x4c\x96\x59\xe5\xd8\xb1\xc3\xc5\xe0\x68\x95\x7a\xa1\x47\x83\x50\x96\x15\x2b\xe3\x51\x62\x9b\x7a\xe5\xea\xb9\xea\x9e\x6a\xb5\xce\x58\x3e\x2c\xb6\xa6\x27\x83\xa8\xdd\xee\x54\xc2\xd9\x90\x59\x2c\x98\x6c\x4e\x86\x1a\xd3\xa2\xb9\xfd\x55\x4d\x96\x9c\xd9\xc5\x5e\xb1\xb8\xd0\x2c\x50\x56\xaf\x52\x5d\x25\x1a\xa1\x5a\x30\xe5\xd8\x55\x96\xc9\x64\x5f\xf9\xfc\xcf\xec\xa3\xa5\xfb\x42\x77\x4a\xff\x4a\x3e\x28\x35\xa0\x23\xf0\x1e\xee\xdb\xdc\x94\xae\xdc\x4c\xfe\xb9\x1d\xe7\xe4\x0f\x4b\x0d\xe8\x8a\xf6\x03\xf0\x38\x5c\xb5\xb9\xb9\x79\x71\xf3\x59\x6c\xca\x0f\x4b\x0d\xd8\x21\x78\x35\x0e\xdc\x7b\x05\x00\xa8\xa3\xf6\xab\x5e\x15\xf7\xfe\x00\x7c\x15\x61\xb8\x69\x03\x36\x5f\x53\xf4\x2c\x1b\xd6\x61\x53\x2c\x05\x9b\xf6\x00\x91\x17\x5f\xd3\x70\x3a\x16\x59\xc3\x26\x52\xfa\x52\xa3\x3e\x22\x9f\xc3\x61\xd0\xab\xd2\x6a\x1a\xc7\x91\xba\x3d\x13\x85\x69\xd1\x5e\xba\xeb\x9a\x06\x77\xb0\x92\xe6\xd9\xa5\xb8\x76\x52\xb7\x57\xa5\x44\x50\xfd\xbc\x3a\x04\xd4\x47\xbd\x70\xb1\x2f\x85\xaf\x62\xd9\x4b\x5b\xd3\x8d\x61\x69\xc9\x8b\x25\x69\x2a\xde\xd6\xdb\x16\x23\x4d\x95\xe5\xbd\x1f\xd8\xc1\x5c\x09\x73\x8b\x5f\xfc\x8f\x1a\x26\xba\x1c\x66\xb8\xa4\xf3\x3f\x2c\xce\xcd\xb5\xe3\x96\xa2\x10\x2e\x65\xb7\x6f\xef\x7a\x5c\xd2\x6c\xea\xd5\x2e\xcf\x99\xa6\xa6\x3a\xf6\x81\x8f\xee\xc4\x84\x2a\x64\xda\x65\xc4\x54\x74\x7f\xbe\x3d\xeb\xe4\xaa\x71\x79\x36\x2c\x30\xa6\x60\x8d\x56\x8b\x54\xb9\x78\x73\xa5\xc4\xa8\xa2\x1a\xdc\xa9\xcd\x74\x6a\x77\xef\x0d\x17\x97\x96\x82\xc9\x9a\x63\x38\xd4\x52\xa5\xe9\x50\xe6\x99\x30\xc3\xcb\xf5\xa6\x53\xdd\xb7\xbb\x1f\x2d\x1d\x9d\xd3\x1d\x66\x70\x83\x3b\xcd\x7a\x99\x33\xa2\x21\x87\x3a\xf9\x5a\xe8\x34\x12\xa7\x2f\x6f\x22\x5e\xdb\x2d\xad\x87\xea\xc2\xf1\x65\xa7\x39\xd9\x74\x9c\xce\x8e\x1d\x41\x6d\x7e\xaa\x1e\x30\x8d\xaa\x3c\x5c\xac\xd8\xe1\xdc\x4c\xd3\x71\xb0\x99\xe3\xd4\xcf\x17\x38\xe3\x9a\x32\x32\x59\x4b\x61\x58\x2b\xc5\x8e\xe3\x99\x26\xd7\x4d\x0b\x7f\x42\xc9\x47\x05\x11\x40\xd7\x8b\x4b\x66\x71\x39\xab\xa8\x54\x41\xde\x64\x73\xca\xef\xaa\x7a\x3e\x9f\x7f\x17\xca\x16\x3d\xf9\xee\x34\x80\x5e\xcc\xe5\x33\xac\x18\x95\x4c\x35\x9e\xbf\x9e\x4a\xf2\xc4\xa5\x93\xde\xda\x84\x22\x4b\xd2\x17\xd4\x86\x49\x2c\x19\x5b\x5e\xd6\xa0\x41\xc1\xba\x38\x1b\xae\x85\xd5\xbd\x7b\x76\x16\xab\x57\xdd\x70\xcb\x25\xb5\xbd\xb5\xa5\x9b\x6e\xbc\x69\x29\xec\xce\x4f\xd0\x70\xaf\x6a\x85\xe1\x9e\x43\x47\x6a\x4b\xd7\x5e\x79\x7c\xc7\xca\xdd\x2b\x93\x87\x0f\x1d\x9e\x74\xe2\x7c\xc8\x29\x31\x03\x36\x79\xe3\xdb\xde\xb3\xd7\x99\x6d\xcd\x3a\x54\xd1\x38\xab\xed\xdd\xb7\xaf\x1a\xce\x34\x0a\x94\x1a\x5e\x1c\xb6\xae\xb9\xf6\xfa\x25\xfb\x93\x7b\xdf\xf3\xb6\x1b\x27\x1d\xdf\xcb\x07\xcc\xe7\x12\x67\x33\x4b\xdd\xb0\x75\xcb\x99\x5b\xe6\xda\x27\xe7\x2c\x4d\x95\xe9\xdc\x9b\x6e\x7c\x53\xcb\xc9\x70\x85\x3a\x93\xd3\xad\x90\x15\xa2\x02\xaf\xed\xad\x10\xee\x18\xd4\x21\x5e\x18\x4e\xd6\x6b\xc0\x37\xbf\xb4\xf9\x38\xda\x2d\xdf\x3a\xd6\xa7\x1b\xe1\x6d\xf0\x18\x7c\x09\xbe\x06\xcf\xc1\x3f\x87\xff\x27\xd1\xab\x0b\xf0\x1d\x61\x5a\x5d\xb0\x07\x70\xee\xc5\x0d\x38\x05\x17\x46\x39\xb4\x37\x8d\xa5\xb7\x8c\xa4\xc4\xa6\xdc\x80\xfb\xc6\x7f\x5d\x10\xf8\xb1\x1b\x30\x18\x9f\xf9\x7b\xe3\x63\xe7\x04\x1a\xec\xfc\x42\xe6\xb5\xd5\xab\x3e\xee\x61\x65\xc4\xc2\xd1\x69\xa1\x5e\xb5\x25\xd5\xe2\x34\xae\x92\xba\x5d\x42\x8f\x7a\x69\x2e\xab\xa8\x9c\xf5\xbd\x46\xb3\x31\xa2\xe3\x45\xc2\x0a\x89\xd1\x62\xb7\x29\x72\x1b\x52\x66\xaf\xbe\xd4\xe8\xd5\x4c\x29\x08\x17\x03\x3f\xe8\x2e\x37\x7a\x31\xf2\x44\xd4\x97\x36\xaa\x34\x51\xc5\x4e\x1f\x27\xd7\xfd\xed\xeb\xa6\x54\x1f\xe0\x2a\x77\xe7\xa6\x2b\xf4\xa3\x15\x2e\x27\x7e\x89\x63\x31\xae\x2e\x53\x85\x8a\x6f\x5b\xe3\x14\x61\x99\x47\x71\xcc\x5d\x4e\x99\x9b\xfc\xff\x2e\x9b\x53\x2d\x1b\x53\x8d\x53\xea\xfb\x36\xc1\xb2\xfc\x7e\xae\x32\x15\xeb\x2e\xf7\xfc\xbc\x4b\x83\x42\x34\xb1\xab\x92\x2d\xba\xd6\x2d\xae\x86\x35\xce\x31\x3d\x3b\xcf\x0d\x4c\x29\x97\x27\xb2\xbc\x4c\x25\x89\xd2\xc0\xb7\x78\xb5\x52\xa0\x23\x6f\x88\x13\xea\x4e\x4d\x4f\xb9\xf8\xf3\xaf\x93\xea\xfc\xb7\x9f\xe3\x51\x48\xb1\x16\x64\xd1\xaf\xcd\xcf\xdf\xf8\xa6\x1b\xe7\xa9\xe3\x3a\xf4\xc6\xaf\xed\x23\x94\x4c\x5f\x75\xf5\xd5\xd3\x94\x73\x2e\xbc\xba\xe9\x5b\x6e\xbb\x7d\x9e\x62\xac\x76\xec\xee\xfd\xf7\xdc\x3e\x2d\xc6\x6b\x64\x72\x2e\xc5\x84\xe8\x8e\xd1\x34\xe6\xdf\x74\xfa\xba\x69\xb7\x56\x0a\x29\xa5\xf4\x43\xce\x3c\x35\xb3\x85\x33\xee\xc4\xc4\x84\xcb\xab\xcd\xa9\x3d\x34\x2c\x14\xb9\xc7\x69\x34\x37\x1f\xb9\x13\x95\x98\xf3\x5c\xa1\xe4\x52\x89\xb9\x34\xcc\x06\xf4\x46\xea\xf8\x59\x2e\x1e\x5c\xf0\xf0\xc6\x9b\xa7\xd1\xe7\xe5\x33\x63\x5d\x39\x03\xef\x85\x4f\xc2\x1f\xc1\x3d\x1b\x70\x37\x3c\x2b\x74\xe4\x6e\x7b\x00\xfe\x70\x00\x7e\x7b\x03\x1a\x70\x37\xf8\x63\x46\x9f\x83\xc3\x01\x1c\x6c\x6f\xc0\x17\xe1\x59\xb8\x7b\xdc\xfa\xd5\x21\xa4\x80\xca\x5f\x6c\x6f\xc0\x87\xe1\xb7\x85\x2f\xb3\x3e\xaa\x93\x39\x03\xbf\x0d\x1f\x1e\x11\xe6\xa5\xd2\x00\x3e\x2c\x48\x7e\x5e\xe3\xc5\x08\xfb\x8b\x81\x20\x94\x18\x25\x5b\xf8\xbd\x46\xb7\xd7\xe8\xa3\x46\x4d\x60\x91\x21\xaa\x2c\x8a\xc0\x44\xcd\x5f\x4a\x3a\xe8\xb6\x24\xda\xe8\x05\xa6\xe4\x27\x0b\x14\x6d\x49\x16\x6a\xa1\x34\x30\x21\xb2\x28\x1a\x7d\xa9\x93\xe9\x0b\x32\x7c\x74\xed\xeb\xa6\x11\x5f\x76\x4b\x01\xcf\x77\x1a\x6e\x3e\xf0\xf8\x07\xeb\x25\x4e\x39\x95\x30\xd9\xcd\xe5\x1c\x55\x28\xc9\x24\xff\xdd\x42\x2a\x61\x6c\x18\xaa\x61\xf8\xf6\x97\x04\x59\xba\xaa\xe6\x26\x9a\x13\xcf\x50\x59\xd3\x89\x42\xa8\xc1\x39\xbd\x39\x5b\xc9\xf1\x6c\xe0\x52\xae\xca\x54\xb5\x2d\x2b\xe3\xdb\x16\xcf\x2d\x2c\x2e\xe0\x67\x5e\xaf\x8f\xfc\xc3\x34\x2c\x46\xdc\xa1\x51\xa5\xc6\xa5\x8f\xcf\xdc\x7a\xc7\x1d\x0b\xf5\xcb\x8f\x5d\x51\xbf\x32\xdb\xe2\x3c\x63\xd0\xb5\xf7\xff\xdc\xfb\xee\xda\xfb\x81\xf7\x3e\xd8\x97\x8d\xec\x9e\x5c\xf9\x92\x8f\x7f\xe2\xc9\xc3\x51\xcc\x11\xc2\x59\xaa\x50\x95\x5e\xff\x85\xcf\x7f\xee\x1a\x8e\x28\xe2\x1f\x34\x64\x0d\xeb\x19\x5e\xaa\x4e\x64\x16\x4e\xaf\x5f\x33\x83\x54\x1e\x97\x62\x4e\x15\x1d\x09\xbe\xde\x91\x8d\xf5\xc3\xef\xf6\x4e\x78\x08\x3e\x0d\x5f\x85\x17\xe1\x07\x70\xff\x06\x7c\x0a\xce\x8b\x6f\xf7\x53\xf6\x00\xec\xe1\x00\xec\x34\x5e\x71\x1e\xbe\x0b\xe7\xb7\x6c\xa8\xf3\x90\x83\xf3\x30\x05\xe7\x61\x05\xce\xc3\xa5\xa2\xd8\xf3\x3c\xdc\x06\xe7\xe1\x01\x38\x0f\x8f\xc0\x79\x78\x12\xce\xc3\x33\x70\x1e\xbe\x02\xe7\xe1\x79\x38\x2f\x6c\xa8\xf7\xc0\x79\xf8\x94\xf8\x6c\xcf\xdb\x03\xf8\x17\xc3\xb4\x8f\x7f\xf3\x1a\x7f\xbe\x8d\xaa\x80\x3e\xf8\x61\x02\xa9\x70\x4a\x63\xf2\xa3\x49\xa6\x75\xc1\x27\x8a\x94\x45\x41\xda\x88\x3b\xcb\x8d\x30\x10\x94\x03\xd5\x57\xf1\x05\xe3\x5e\xbc\xb5\xb1\x36\x22\x6a\x4f\x8d\x2a\x8f\x8a\xa4\xb9\x7a\x8c\x53\xef\xb3\xd6\x22\xc9\x74\xbf\xd8\x47\x81\xe4\xbd\x6e\x5f\xf8\x97\x8c\xa6\x08\x7c\xbb\xb5\x5a\xcd\x95\x31\xa2\xd9\xee\xc5\x7f\x15\xce\x32\x55\x55\xad\x68\xa1\xd9\xba\xe9\x4d\xa7\xa6\x3a\x77\x9c\xb9\xae\x56\x9b\x36\x19\xfa\x10\xcf\x38\x2e\x6f\x2f\xb1\x7d\x07\xdc\x4a\xde\xe6\x0e\xa7\xed\xa3\xd4\xae\x2d\x46\xd4\xf1\x42\xee\xd4\xca\x11\x73\x55\xab\x1a\xf2\xa8\x5c\x75\xa2\xe5\xa9\xe2\xc5\x3f\x9c\xea\x35\xf2\x3c\xdb\xda\xdf\x9e\xba\xe1\x4d\xd7\xd5\xa6\x3a\x21\x71\xf9\xec\xf6\xbd\x35\x99\x65\xd7\x76\xad\xa1\x76\xeb\x40\x2b\x4b\x33\xb5\xde\x54\xed\xe4\x99\x3b\x97\x7b\x87\x96\xe2\x0c\x57\xa3\x4b\xae\xbe\x63\x7f\xb4\x73\xd7\xce\xd7\x4d\x3d\x5e\xe9\x70\x1e\xb6\xa6\xaa\x9c\xfb\x4c\x62\x3c\x0c\xb3\xbc\xd6\x3a\xd4\x3e\xd2\xaa\x1d\x3e\x74\xe9\x9e\xed\x61\x56\xce\x4e\x87\x54\xf2\x17\xda\x53\x67\xee\x38\xfb\x61\x2e\xa9\x2a\x65\xfd\x5a\x9b\x57\xa7\xe6\xb2\x34\x28\x14\xf8\xfe\x5b\xee\x9c\xda\xbf\xda\x76\xa9\x84\xa9\x30\x02\x6b\x87\xf6\xf7\xb3\xdc\xe0\x26\x77\x5b\x9d\x95\x3f\x73\xfb\x97\x5d\x35\xb5\x7a\xe7\xf5\x87\x42\x6e\xd1\x72\x6d\xea\xcc\xdb\xee\xee\x4c\x1d\x5a\x6d\x52\xae\xb2\xac\xa9\x15\xa2\xe8\x8a\x37\xbd\x75\xb5\x7d\xf2\xf8\xde\xb0\xbd\x56\x33\x79\xe7\xe0\x89\xeb\x4f\xcf\xac\xbe\xef\xee\x6b\x92\xe5\x15\x74\x50\x37\xef\x97\x76\xc9\xcb\x63\x9d\x3a\x0b\xf7\xc2\x07\xe0\xa3\xf0\x4d\x34\x85\xd0\x06\x9c\x47\x79\x31\x85\xff\x35\x7c\x63\xab\x42\xea\x3c\x04\x70\x1e\x1a\x70\x1e\xba\x70\x1e\xf6\xc3\x79\x38\x01\xe7\xe1\x0c\x9c\x87\xfb\xe1\x3c\x3c\x04\xe7\xc5\xbf\x4f\xc3\x79\x78\x16\xce\xc3\x73\x42\x85\x44\x85\xd4\x79\x78\x49\x28\x62\xaa\x45\x5b\xab\xcb\x2f\xa0\x3c\x9c\x17\xba\xf5\x0b\xed\x01\x3c\xf9\xe2\x00\xf2\xc3\x01\xe4\xdb\x1b\x50\x84\x5f\x80\x27\xd3\x9a\xea\xf1\x39\xe7\xc5\x0a\xb4\x01\xa7\x47\x2d\x1b\xf0\xc1\xb1\xf4\xe8\x8f\x9c\xf5\xb1\xe1\x06\x7c\x06\xe5\xe1\xaf\xd3\x9a\xcd\x27\x51\x4a\x7f\xf7\x32\xfc\xa1\xf8\x3d\x8d\xfc\xd1\xcd\xcf\x8e\xa5\x47\x47\xd2\x00\x9e\x14\xc1\xf6\xd7\x56\xbd\x53\x8a\xd2\xa5\xc4\xa1\x59\xec\x4b\x3d\xec\x77\x53\xc0\xcc\xe6\x62\x77\x31\x10\xfb\x61\x1d\xda\x42\xb4\xa9\x08\xc4\xfd\x5e\x27\xe5\xf4\x16\x7c\xac\x81\x2f\x10\x5b\x6a\x4b\x8b\x69\x59\x53\x2f\x71\xa0\x04\x0f\x6a\x57\x14\x36\xa5\xad\x82\x04\xb5\x85\x3a\xd5\x66\xa3\x23\x06\xb5\xd8\x4d\x39\x8b\xcc\x64\x22\x89\xd1\x88\x4d\x51\xf1\x53\x8e\xf1\xaa\x29\x59\x29\x54\x66\x0a\xfb\x2f\x37\x9a\x26\xae\xf5\xd1\x72\xb7\xb7\x2c\x35\x3b\x7d\x12\xf6\x31\x7a\xf4\x75\x9b\x14\x26\x66\xd6\xaf\x3e\x12\x5f\xfa\xd8\x9a\x5b\x2e\x64\x39\x37\x35\x95\xde\x4d\x8b\x71\x81\xe6\xda\x87\xdc\x7a\x7d\xc2\xe5\x59\x97\x65\xbb\xdd\xee\x0f\xe6\x35\x8a\xf9\x6e\x2e\x63\xa9\x90\x2c\x8c\xb6\x11\x72\x6e\xf3\x63\xfd\x0f\x2e\x72\x8c\x25\x5a\xe1\xd5\x89\x1a\x77\x29\x4e\x96\x4d\x99\x67\xf7\x4d\x70\x15\x33\x9a\x9d\x99\x99\xcd\x72\x99\xc8\xaa\x30\x7c\xe2\x3d\x97\xec\x89\x13\x63\xeb\xce\xbf\x40\xb7\xa4\x96\xa7\x4a\x15\x1a\x6f\xeb\x6e\x2b\x65\x67\x67\x66\xb2\xe2\x2c\x9e\xb1\x0c\x7a\x2c\x3b\xdf\x9a\x4e\x34\x8e\x70\xcf\xf3\x8b\x13\xd9\x99\x93\xa7\x6f\x5c\x48\x8c\x32\x99\xdb\x61\xc6\x0d\x8a\x7e\xf7\x2d\xb7\xde\x86\xdf\xf1\x7a\x2d\xaa\x7f\x24\xfb\xad\x19\xee\x99\x89\x3f\x94\xc9\x72\x54\x2b\x53\x09\x3b\x59\xf9\xbf\xc8\x2a\xc7\xd8\x4a\x86\x26\x4f\xcc\x5f\xfa\xe9\x5f\xfd\xf5\xcb\x77\xdf\xb8\xf6\xc1\x87\x3e\x70\xba\xf7\xd6\xbb\xee\x5d\xab\x1f\x59\xe0\x36\xe7\xb2\xcc\x79\xad\x5e\xe5\x8e\x30\x0a\x78\x94\x2c\xa1\x41\x36\xa0\xb2\x41\x83\x5c\x40\x99\xe5\xd0\xdc\xbe\x09\x49\x66\xc2\x1e\x4d\x1e\x8b\xe7\xb2\x39\xce\xa3\x15\x5e\x9b\x9c\x74\xa9\xeb\xba\x94\xba\x2e\x71\xdf\x2e\x6c\xf3\x52\xa5\xee\xda\xd9\x22\xb7\x17\x78\x26\x40\xb1\x3b\x3d\x33\xed\xca\xf9\x72\x25\x83\xec\xe4\x38\x75\x83\x2c\x7f\x1c\xd5\x3e\x6e\xcb\x61\x31\x0a\x98\x9c\x34\x6e\x6e\x8e\xe6\x95\x77\x4b\x0d\x98\x4d\xe3\x1e\xe1\x25\x00\x9b\x9b\x9b\x7f\xbf\xf9\x73\xd2\xdf\xcb\x77\x48\x0d\x98\x4c\xdb\xf7\x2d\x03\x80\x39\x6a\x9f\x7a\x55\x3c\xe4\x3e\x38\x07\x8f\xc0\x87\xe1\x93\xf0\x45\xf8\xc7\xf0\x37\xa8\x8b\xfe\x78\x03\x2e\xa0\xc9\x11\x51\xe3\x50\xfc\xde\x03\x67\xb7\x62\x25\x43\xf8\x2e\x0c\xb7\xd6\xf9\x21\xe4\x60\x08\x53\x30\x84\x15\x18\xc2\xa5\x30\x84\x75\x18\xc2\x6d\x30\x84\x07\x60\x08\x8f\xc0\x10\x9e\x84\x21\x3c\x03\x43\xf8\x0a\x0c\xe1\x79\x18\x8e\x62\x25\x43\x41\xb4\x28\xe6\xb9\x0b\x10\xc0\x05\x68\xc0\x05\xe8\xc2\x05\xd8\x0f\x17\xe0\x04\x5c\x80\x33\x70\x01\xee\x87\x0b\xf0\x10\x5c\x80\xf3\x70\x01\x9e\x86\x0b\xf0\x2c\x5c\x80\xe7\xe0\xc2\xd6\x3c\x77\x01\x5e\x82\x0b\x29\x52\x04\x9a\x1c\x81\x72\xe6\xc7\x52\x71\x2c\x35\x46\x92\x20\x7b\x84\xb5\xe1\x00\xd6\xda\x1b\xf0\x66\x34\x09\xf7\x6c\xe5\x50\x9d\x85\xef\xc2\xd9\xad\x67\x3a\x0b\x39\x38\x0b\x53\x70\x16\x56\xe0\x2c\x5c\x0a\x67\x61\x1d\xce\xc2\x6d\x70\x16\x1e\x80\xb3\xf0\x08\x9c\x85\x27\xe1\x2c\x3c\x03\x67\xe1\x2b\x70\x16\x9e\x87\xb3\xe2\x99\xee\x1f\x3d\xd3\x06\xbc\x6f\x2c\x3d\x3a\x96\x7e\x61\x2c\x3d\x36\x96\x7e\x71\x24\x0d\x60\x38\xca\xed\xff\xdd\xf1\x98\xff\x78\x2c\xfd\x8b\xd1\x38\x37\xe0\xaf\xc6\x57\xfe\x3b\x38\x2b\xda\x52\xfa\x4a\x3e\x1c\xa0\x49\x7b\x80\x6a\xc3\x01\xdc\x63\x0f\xd0\xb6\x17\x61\x80\xa2\xd7\x38\x9f\xb3\x91\xcc\xaa\x38\x99\xe2\xaa\x0d\x13\xf9\x7d\xd4\xeb\xae\xa2\x6e\xc7\x44\x4d\x1a\x4b\x7e\x8a\x7c\xaa\xf8\xc9\xac\xdb\x46\x7e\x47\x59\x8a\x71\x6f\x94\x6d\xb0\x05\x88\xde\x59\x16\x29\xd1\x4d\x91\x9f\x24\xbc\x5f\x13\x2b\xbd\xc5\x20\x71\xb3\xbb\x29\xb7\x9c\x98\x14\x85\x1d\xe5\xc7\x38\x4c\x3a\x69\x48\x23\x72\x05\x1a\x4b\x8a\xc8\x85\xf6\x4c\x49\x20\x9c\x53\x85\x0a\x50\xd5\x60\x84\x76\x4e\x6b\xcd\x3e\xee\x54\x1b\x5b\x19\x0d\x4b\x89\x03\x8f\x7e\xfb\x75\x9b\x57\x2f\x7e\x33\x5b\xf2\x38\xad\x1d\xde\xbf\xe2\x54\x8f\xa3\x7f\xe4\x94\xf2\x56\x38\xc9\xf4\xb8\xf0\xff\x32\x77\x2e\xd0\x51\x9c\xd7\x1d\xff\xdd\xdd\x99\x7d\xcc\xac\x66\x47\xec\x03\x49\x2b\x89\x11\x92\x16\x21\x90\xb4\xe8\x81\x11\xe2\x21\x8c\x78\x43\x50\x6c\x21\x88\xa0\x18\x09\xad\x41\xf1\x4a\xc2\xab\x87\xc1\x8f\x98\x34\x4a\xfc\xc2\x09\x07\x43\xe3\xf8\xd8\x0d\x49\xb0\x43\x1b\x92\xb8\x0e\x49\x37\x44\xad\x69\x6d\x53\xd3\x52\x47\x49\xa9\x8f\xed\xd2\x13\xe2\xba\x75\x1c\xbb\xad\x7d\x6a\x5b\xcd\x31\xf1\xf6\xec\x68\x90\x9b\xc6\xa7\xed\x39\x39\x3e\xc9\xec\xd9\xdd\xff\x7c\xef\x99\x33\xdf\x9d\x7b\xbf\x7b\xef\x77\x43\x33\xe3\x7f\x12\xd0\x22\x11\xaf\xdb\x08\x17\x46\x6b\x22\xc1\x48\x81\xe1\x5b\x19\xcc\xcb\xf3\xe8\x79\xf9\x01\x4f\x28\x6c\xcc\xf7\x84\x4c\xbf\x47\x8f\x95\xce\xce\xf7\xba\x14\xd5\x13\xc8\xb7\x5d\x3f\xbf\xbd\x35\x27\x60\xea\x1e\x43\x57\xd4\x82\xfa\xea\xd2\x72\xb5\x68\x6e\xd3\xac\x2a\x55\x5c\xca\xc2\xed\x09\xc5\x6f\x18\x8a\x6a\x68\x15\x55\x73\xcd\x80\x3f\x10\x2d\x2a\xab\x8d\x2c\xbc\x77\xc3\xbc\x4d\x47\xe7\xae\x6e\x5d\x66\xa9\x33\x66\x28\x21\x35\xcf\xc8\x53\x03\x66\xbe\x5a\x5c\x5b\x53\x57\xaa\x2a\x7e\x7f\xc0\x2c\x8c\xb6\x68\xfe\xe2\xf9\x05\x0b\x07\x96\x04\xbc\x5a\x9e\x56\x12\x0b\xa9\xaa\xaa\x86\xaa\x66\x17\x7a\x22\x0d\xd7\x34\xc7\x74\xb7\xdb\xed\x4e\x7d\x54\x44\xf6\xc7\x1e\x7f\xb4\x3c\x64\x18\x91\xca\x4a\x3d\x62\x79\xdd\x91\x58\xc0\xab\x05\xf4\x88\xe6\xcd\xc4\x9a\x1a\x1b\x63\xb1\xc6\xc6\xa6\x6a\x45\x5f\x17\x8a\xcd\xfa\x6c\x69\xe9\xe8\x7c\xbd\x30\xa4\x79\x02\xd1\xc2\x58\x4c\xcf\x0f\xcf\x34\xc3\xaa\xcf\xaf\x04\x2b\xe2\x95\xf9\x6a\xd0\xd0\xd4\x70\x51\xd1\xc1\x81\xe5\xb7\xdd\x71\xb0\x4d\x33\x0d\x5d\x5d\x75\xf7\x7d\x5f\x18\xfe\xd8\xb1\xc3\x87\xd7\x99\xaa\x5f\xf7\x44\xa3\x5a\x41\x34\xe4\x31\xad\x32\x2b\xdf\x23\xfe\xa0\x9e\x57\xdc\xda\x5c\xed\x2d\xd6\xbd\xda\x31\xa9\x3c\x1a\x28\x08\xb7\xdd\x35\x76\x67\x4b\x38\x36\xb3\xc0\xf4\x79\xdc\xba\xee\xf3\xf8\x74\x8f\xa2\x05\x15\xc5\xa5\x68\x91\xba\xba\xda\xb0\x59\xd2\x98\x98\x17\x99\x51\xa0\xe7\xe5\xb5\x8d\x7d\xf6\x9e\xf5\x9a\x11\x54\xf3\xcb\xe3\x55\x51\x73\x56\x61\x50\xd5\xf4\xc0\x34\x6d\x5d\xeb\xd0\xd6\x0f\xd6\xa6\x7f\x6e\xa7\x7f\xd9\x49\x5f\x43\x7f\xf6\xd6\x6c\xe7\x8a\x1b\x3e\xfe\xd5\xe9\x3a\x95\xd3\x79\xfb\xf1\xc9\x8e\x44\xa0\xfe\x99\x6c\x36\xfb\x72\x76\xa7\xbc\xa6\xb4\xb8\xe2\x24\xa6\xf2\xb2\x8f\x4a\xda\xc9\x9b\x92\xc5\x9a\x9d\xf5\xee\x5c\xbd\x1e\xd9\xe7\xe4\xad\xcd\x1e\x91\x47\x95\x5e\x57\x9c\x76\x7b\x1c\xfd\xef\xbf\xc4\xf2\x6c\x36\xfb\xcd\xec\x4e\x97\xa6\xd4\x3a\xed\x79\xe9\xcf\x2e\xc7\x9f\xcd\x66\xbf\x9c\x3d\x22\x2d\xca\x1e\xa7\xfc\x1a\xd6\x64\x6f\xe3\xf8\xa2\x2f\x34\x5f\x8f\x99\xfd\x5a\xf6\x88\xdc\xaa\xac\x73\x7c\x00\x97\xb1\xce\xde\x8f\xf6\x0e\x3e\xc7\x51\x9e\xe0\x25\x7e\xca\xeb\xfc\x42\x0a\xe5\xeb\x67\x88\xa0\xdb\xef\x84\x38\x53\x51\x28\x3a\x58\x6f\xff\x27\xe9\xb2\xe5\xc2\x88\x99\xe1\xd5\x4b\x19\x4e\x5c\x3a\x83\x8f\x57\x39\x61\x53\xaa\x98\xed\x85\x6f\x53\xfc\xb8\xad\x01\xcf\x7d\x16\x12\x67\x35\x71\x3a\x89\x73\x23\x71\x46\x89\xf3\x39\x9b\xe7\x8d\xf3\x18\x71\xbe\x47\x9c\x73\xc4\xaf\x52\xfc\x38\xff\x4c\xdc\xe6\x6c\xe3\x66\x86\x32\x5b\x63\xad\x93\x74\x62\x61\x5d\x45\x9b\x1d\x64\x53\xf6\x2e\x7e\x4e\xd7\x55\xca\xde\x45\x21\x5d\xcc\xa5\x8b\x66\xba\x58\x47\x17\x9f\xa0\x8b\x3e\xba\x38\x40\x17\xf7\xd0\xc5\x97\xe8\xe2\x8f\xe8\xe2\xfb\x74\x71\x9e\x2e\x5b\x8b\xde\x65\x66\xb8\x61\x22\x43\xd2\xcc\xd0\x33\x71\x86\x4f\x3b\xd7\x74\x86\xbb\xa6\xd1\xfd\xd3\xd7\x79\x35\x2a\xd6\x91\xba\x0c\x27\xcc\x0c\xc7\x26\xa6\xd2\x1e\x9a\xc8\xf0\x50\xdd\x19\xce\x39\xa3\xcb\xf0\xaa\x99\xe1\xc2\xc4\x19\xfe\x61\x7a\xe4\xff\x38\xdd\xde\xcb\xbf\xd2\xde\x3b\x13\x19\xde\x99\x6a\x4f\x94\x09\xfb\x0e\x8b\x31\x91\x11\xa3\xee\x8c\x14\x4e\xb7\x97\x34\x33\x12\xbb\x44\x86\x03\x75\x89\x05\xee\xff\xcb\xdf\xf2\x23\x30\x43\xfd\x6d\xaf\xa6\xaa\xa1\x88\x56\x30\xa7\xac\xd8\x08\x2d\xa8\x09\xe5\xb9\x44\x2d\x09\x69\x85\xda\xcc\xa2\x62\xc3\xef\x2f\x69\xbc\xc9\x36\x3c\x2d\x2a\x30\x0d\xab\xcc\xb6\x1f\xcd\xd3\x1a\xe2\x1b\xe3\x8a\x4b\x75\x7d\x26\x1c\xd1\x0a\xe2\x65\xa5\x46\xa8\xde\xae\xa8\x14\x87\xb4\x22\x7f\x41\x61\xcc\x36\x3c\x8d\x35\x7d\xd2\xef\xd7\x8a\x66\x9a\x46\x59\x99\x35\x65\x78\xda\x10\xdf\x58\x69\x1b\x9e\xfe\xae\xad\xb2\xde\x12\xae\x0c\xab\xf9\xc5\xe5\x41\x2d\xef\xee\x50\x75\x75\x75\xc8\x98\x5b\x53\x33\xeb\x66\xc3\xed\x0f\x2a\x25\x4b\xe2\xa6\x3f\x34\xbb\xb4\xd8\xd0\x42\xd1\x82\xa0\xdf\xed\xf6\x6b\x5a\x7c\x7b\xdd\xb6\x7c\xbf\x16\x0c\x68\x07\xc2\x15\x21\x35\x98\xab\x1a\xb8\xeb\x57\xab\x9a\xaa\x51\x3c\x6b\x76\xc8\xd4\xe2\x2d\xc5\xfe\x70\xa4\xc0\x31\x2a\x8d\x6f\xaf\xfb\x84\xe9\xf7\x07\x03\xda\x7b\xcf\xfd\x6e\xae\xc1\x4e\xeb\x05\x1f\x73\xf4\x82\x5e\xf6\x67\x7f\x22\xb3\xa7\xd3\x8f\x4c\xeb\x0b\xfb\xdf\xee\xb7\xcb\x4f\xd1\xdb\x67\xa6\xf5\x8b\xfd\xd9\x5f\x72\x7c\x3a\x7d\xcb\x74\xfa\x08\x15\xae\x5d\xf6\x5a\xd9\xbd\xae\xef\x2b\xd7\x4d\xf3\xd3\xbd\x8c\x70\x88\x2f\xf1\x14\xef\xfd\xda\xbe\x01\xbf\x11\x03\x66\xef\x20\x94\x93\x63\x43\xde\xb0\xe1\x9a\x33\xb5\xa1\x90\xe4\xa6\x91\x13\xfb\xc1\x3d\xc7\xd9\x68\xa8\x54\xa6\x8c\xbc\x83\x52\xeb\x9e\x53\x1e\xf7\x78\x73\x85\x72\xac\x93\x1d\x0f\xaf\xe1\x1a\x3b\x58\x8c\x78\x6c\x33\x70\x5b\x45\x38\x35\x95\xe3\x8d\xb6\x81\x86\x63\x6c\x3a\xa7\x69\xca\xf5\x2c\x5c\xea\x9a\xb9\x5c\xea\xa3\xae\xc0\x47\xc7\x49\xfd\x50\x2f\x2c\x2a\xd2\xb7\x58\x0d\x56\xb4\xb9\x7e\xad\xea\xd3\x54\xbd\x30\x56\xa4\x77\x9a\xe5\x65\x85\xef\xbf\x6b\x86\xcc\x90\x19\x9b\x15\xb3\x6a\xa3\xf3\x9a\x6b\xaa\x63\xba\x69\xe8\x72\x39\x36\x3b\x1a\xf0\xe8\x5e\xdd\x13\x8a\x86\x66\xab\xe1\x48\x58\x35\xac\x86\x44\x83\x15\xb4\x96\x97\x45\xab\x12\x4b\xe7\xa9\x3e\x5d\x8d\x2e\xb5\xe6\x6f\xa9\x2e\x31\x5b\x56\xae\x88\xe8\x45\xa5\xb3\xee\xb7\xd6\xad\x5a\x16\xd1\xfd\x5a\x38\x62\xf7\x10\xa9\x4b\xd4\x45\x4d\x4d\x57\xa3\xb5\x56\xac\xbc\x4c\xd5\xf3\xcc\x82\xc8\x9a\xd8\xe2\xc5\x8b\x63\xa1\x92\x72\xd3\x18\xaa\xee\x74\x1f\xfb\xa8\x18\xa3\xfb\x75\x9f\xcf\x30\x8d\x68\xa1\x1e\x94\xe6\x6a\x35\xa8\x29\x9e\xf8\xea\xd5\xab\xe3\x8b\xad\x55\x1b\xda\xa5\x59\x2f\x2a\xb1\xcc\xd8\xfc\xea\x9a\x98\x5e\x10\xb5\xd6\x6f\xda\x5c\xa9\x79\x23\xc5\x7b\xf5\x8a\x79\xb5\x11\xdd\x1d\xa9\x9e\x37\xaf\xc2\x5a\xd4\xb4\xc8\x32\xa2\x8b\x16\x2f\x8a\x04\x82\x7a\xe5\xf5\x9b\xd7\xda\x5b\x8f\x68\x9d\x8f\x6c\x31\xd6\xb4\x7f\xf1\x81\x23\x1b\x14\xb7\xcb\xdf\xfe\xc8\x23\x5f\xdd\xa2\x97\x14\xe4\x79\xec\x9d\xff\x4b\x74\xb7\xa2\x69\xd1\x48\x44\xdf\x30\xd6\x1a\xab\xa9\xa9\xb7\xb4\xd2\xd2\x42\xd5\x18\xf2\xa9\x6e\x2d\x3a\xa7\x32\x1e\xd9\xdd\x6b\xd8\xbe\x99\xd9\xd7\xb2\x3b\x65\x5c\xb9\xcf\xe1\x23\x3c\xac\x39\x7b\xbd\xed\xb3\x99\x93\x39\x3b\x94\x6b\x1d\x99\x33\xc7\xaf\xfc\x48\xb6\x34\x2d\x6b\xda\x92\xcd\x22\xd9\x51\xd7\x4e\x65\xfe\xb4\x3c\xda\xff\x80\xd7\x99\x57\xb9\x79\xd2\xea\x8a\xd3\xea\xf0\x31\x96\x0c\x36\x74\x34\x6c\xe6\x43\x0f\xef\x18\xe4\x9d\x80\x19\x6d\x10\x5d\x0b\xa5\xb7\x43\xb9\x09\x35\x19\xa8\x7f\x16\x1a\xce\x42\xd3\x36\xb8\xa6\x11\x16\xbf\x09\x4b\x4f\xc1\xb2\xff\x84\xd6\x30\xac\x38\x04\xd7\x5e\x86\xb6\x46\x58\xff\x20\x6c\x3c\x0c\x9b\x0f\xc3\xd6\x17\x60\xc7\x71\xd8\x79\x11\x7a\x2e\x43\x72\x23\xec\xa9\x80\x4f\x5e\x86\xe1\x5e\x18\xad\x82\xfd\x3b\xe0\xf6\xbd\xf0\xa9\x8b\x70\xf0\x14\x8c\xed\x85\xfb\xdf\x80\x23\x0f\xc3\xb1\xa7\xe1\xc1\x36\x78\x68\x02\x1e\xb9\x02\xc7\xdf\x80\xaf\x5d\x84\xaf\x57\xc0\xc9\xc7\xe1\x1b\xbb\xe0\x5b\xbb\xe0\xf1\x6d\x70\xfa\x41\xc8\x5c\x84\x1f\x14\xc0\x9f\x77\xc0\x5f\x00\x4f\xed\x87\x73\x47\xe1\xfc\xcf\xe0\x42\x15\x3c\xa7\xc0\xc4\x25\xb8\xf8\x2c\x3c\x7f\x1c\x5e\xac\x82\x97\xae\xc0\xa5\x71\xf8\xc9\x05\xf8\xe9\x3e\x78\x79\x02\xfe\xe9\x34\xfc\x4b\x05\xbc\xb6\x16\x5e\x0f\xc0\xbf\x1d\x85\xb7\xaa\xe0\x3f\x16\xc1\xbb\x6b\xe1\x17\x6d\xf0\x5e\x0a\xde\x6f\x45\x64\x1c\x71\xdf\x8e\x78\x53\x88\x3e\x1f\x09\xbc\x8d\x98\x87\x91\xd0\x04\x12\xc9\x20\x33\xaf\x20\x45\xaf\x20\x25\xed\xc8\xac\xb3\x48\xf9\x36\x24\xee\x43\xaa\xc6\x90\xea\x36\x64\xc1\x9b\x48\xe3\x41\x64\x51\x02\x59\x0a\x72\x6d\x01\xb2\x72\x1b\xb2\xa6\x18\x59\x97\x41\x36\xed\x47\xda\xef\x46\x3a\x0e\x22\x9d\xf3\x91\xad\x47\x91\x6d\xaf\x20\xdb\x53\xc8\xce\x14\x72\x43\x2f\xb2\xeb\x69\xa4\xe7\x20\xb2\xa7\x1d\x49\x3d\x8b\x0c\x9e\x44\xd2\x8b\x90\xd1\x43\xc8\x2d\x27\x91\x3b\x3a\x90\x3b\x41\xc6\x1a\x91\x7b\xc6\x90\x43\x0f\x23\x47\xda\x90\x63\xbb\x90\x87\xd6\x22\x7f\x78\x08\xf9\x4a\x23\xf2\x95\x76\xe4\xc4\x38\x72\xe2\x05\xe4\xc4\xdb\xc8\xc9\x0b\xc8\xa9\xa3\xc8\xe3\x20\xdf\xc9\x20\x19\x13\x19\x3f\x81\x8c\x9f\x45\xc6\x2f\x21\x4f\x1e\x47\x9e\x1c\x47\x9e\x7c\x01\x79\xca\x87\x9c\xeb\x40\xce\xed\x43\xce\x1f\x46\xce\x9f\x42\xce\x8f\x23\x17\x2e\x20\x3f\xde\x8f\x3c\xbf\x1f\x79\xb1\x15\xb9\x9c\x42\x2e\x8f\x21\x97\x1f\x46\x2e\x9f\x46\x5e\x51\x90\x57\x13\xc8\x6b\x3f\x43\xfe\x75\x09\xf2\xd6\x51\xe4\xad\x53\xc8\x5b\x4f\x23\x93\x3e\x64\xd2\x42\x26\x97\x20\x93\xdb\x90\xc9\x61\x64\xf2\x30\x32\x79\x12\x99\x3c\x8b\x4c\x5e\x42\xae\x9c\x46\xae\x5c\x40\xae\xbc\x82\x5c\xb9\x82\xfc\x32\x8c\x64\xdf\xc4\x85\x0f\x17\x15\xb8\x58\xe2\x7c\xb7\x01\x61\xde\x45\x9c\x07\xbe\x05\x1c\x2c\xa8\xb4\x38\xd8\x85\x97\x56\x07\xbb\x31\x59\xe3\x60\x05\x95\xad\x0e\x56\xc9\x63\x87\x83\x3d\xa8\xf4\x39\xd8\x4b\x15\x03\x0e\xf6\x11\xe4\x0f\x1c\xac\xd1\xc2\xa3\xb8\x11\xc5\x0f\x8c\x72\xd9\xc1\x82\x26\x9d\x0e\x76\x61\xc8\x2e\x07\xbb\xb1\x64\xc0\xc1\x0a\x9a\x7c\xde\xc1\x2a\x45\xf2\xa0\x83\x3d\x68\xf2\x84\x83\xbd\xb4\xcb\xb8\x83\x7d\x94\xba\x02\x0e\xd6\x18\x75\x55\xaf\x1c\xdc\x77\x20\xdd\xb7\x67\xef\xb0\x55\xb5\x7b\xae\x55\x9f\x48\x34\x5b\x3d\x07\xac\x4d\x7d\xbb\xf7\x76\x27\x53\x56\x47\x72\x60\xa8\x6f\x70\xa0\xd6\x5a\x91\x4a\x59\x76\xb1\x21\x2b\x9d\x1c\x4a\xa6\x47\x93\xbd\xb5\x0d\x6d\x23\xfd\x3d\xd7\x25\xf7\x8c\xa4\xba\xd3\x0b\x6a\x13\x89\x44\xcb\xbe\x03\xe9\xa1\x96\x86\xde\x91\xfe\x1e\xfb\xa7\x33\x99\xce\xd5\xb6\xec\xcc\x0f\x92\xad\xbe\x21\xab\xdb\x1a\x4e\x77\xf7\x26\xfb\xbb\xd3\x37\x59\x83\x37\xfe\x5a\x7f\xff\xe3\xfc\x37\x18\x24\x2b\x19\x64\x1f\x07\x48\xd3\xc7\x1e\xf6\x32\x8c\x45\x15\xbb\x99\x8b\x45\x3d\x09\x12\x34\x63\xd1\xc3\x01\x2c\x36\xd1\xc7\x6e\xf6\xd2\x4d\x92\x14\x16\x1d\x24\x19\x60\x88\x3e\x06\x19\xa0\x16\x8b\x15\xa4\xec\x9c\x0f\x5a\x1b\xb2\xcf\x92\x0c\xd9\x1e\xbc\xa3\x24\xe9\xa5\x96\x06\xda\x18\xa1\x9f\x1e\xae\x23\xc9\x1e\x46\x48\xd1\x4d\x9a\x05\xd4\xda\x7d\x26\x68\x71\x46\x35\x44\x0b\x0d\x36\x97\x92\x2b\xfd\x01\xea\xb4\xdb\xbb\xda\xb7\xf5\xdf\x6a\x7e\x58\x69\x8b\x3e\x7b\x24\xdd\x58\x0c\x93\xa6\x9b\x5e\x92\xf4\xdb\x7d\xde\x84\xc5\x20\x37\xfe\x3f\xae\xef\x7f\xcf\xff\xed\xdc\xc9\xdc\x9c\xb3\x8f\xec\x77\xa9\xff\xd0\x57\xd3\x9f\x81\xb8\x70\xe1\x66\xa6\x1d\x54\xbd\x88\x18\xc5\xf8\xc8\x3d\xe1\x3a\x01\xf2\x30\x08\x62\x92\xcf\x0c\xc6\x89\xda\x73\xd5\x83\x57\xdc\xa2\x88\x2a\x1e\xf1\x8a\x8f\x12\x4a\x99\x85\x45\x19\xb3\x29\xa7\x82\x4a\xe2\xcc\xa1\x8a\xb9\x54\x33\x8f\xf9\xd4\x50\x4b\x1d\x09\x16\x50\x4f\x03\x8d\x34\xb1\x90\x6b\x58\x44\x33\x8b\x69\x61\x09\x4b\x59\xc6\x72\x5a\x59\xc1\xb5\xac\xa4\x8d\x55\xac\x66\x0d\x6b\x59\xc7\x7a\x36\xb0\x91\x4d\x7c\x8c\xcd\xb4\xf3\x71\xae\xe3\x7a\x3a\xd8\x42\x27\x5b\xd9\x66\x8b\xbb\xdb\xd9\xc1\xef\xb1\x93\x1b\xd8\x45\xb7\xf8\x79\x9a\xc7\x78\x86\x6f\xf0\xfb\xfc\x25\x2f\xf0\x3d\xfe\x94\xd3\x7c\x97\xbb\x78\x82\xef\xf0\x22\x87\x18\xe3\xf3\xdc\xc7\xbf\x73\x2f\x9f\xe1\x01\xbe\xc8\xdd\xa2\xf1\xc7\xbc\xc3\xdb\xbc\xc9\x27\xed\x65\xd1\x7e\x52\x0c\x70\x33\xfb\xec\x27\x68\x3f\xb7\x72\x80\xdb\xb8\x83\xdb\xc9\x70\x27\x9f\xe2\x20\x9f\xe6\x0d\xce\x10\x22\x4c\x84\x1b\xf9\x3b\x9e\xe7\x22\xc3\x5c\x60\x82\x24\x7f\xc3\x37\x39\xcf\xb7\xf8\x2b\x7a\x78\x8e\x3d\x8c\xf2\xb7\x8c\x70\x0b\x7b\xf9\x7b\x7e\xc4\xb7\x79\x9d\x1f\xf2\xd7\x3c\xcb\x93\xfc\x40\xad\x1d\x18\x49\xa5\xfc\xbb\x07\x53\x83\x03\xb5\x89\xc4\x82\xbc\xa1\x64\x7f\xdf\xf4\x99\x2f\x95\x1c\x1a\xca\x01\x7f\xf2\xe6\x91\xee\x54\x0e\xe9\x7b\xd2\xc9\xee\xe1\x64\x3a\x87\x03\x37\x8f\x24\x87\x86\xfb\xa6\xca\x2a\xab\x46\xd2\x83\xc6\xbe\x64\xba\x6f\xb0\x77\x77\x72\x60\x38\x99\x4e\xf6\xc2\x7f\x05\x00\x00\xff\xff\xaf\x8c\x15\xbc\x90\x2b\x02\x00") + +func fonts3dumbTtfBytes() ([]byte, error) { + return bindataRead( + _fonts3dumbTtf, + "fonts/3Dumb.ttf", + ) +} + +func fonts3dumbTtf() (*asset, error) { + bytes, err := fonts3dumbTtfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/3Dumb.ttf", size: 142224, mode: os.FileMode(438), modTime: time.Unix(1575019249, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8d, 0xf4, 0x8b, 0x5d, 0xf3, 0xae, 0xdb, 0xb3, 0xa6, 0xd6, 0xfd, 0xb, 0xb3, 0x2e, 0x45, 0xec, 0x18, 0xe0, 0x9b, 0xab, 0xe3, 0x1d, 0x76, 0x3a, 0x38, 0x8c, 0xe, 0x1, 0xf6, 0xaf, 0x20, 0xd0}} + return a, nil +} + +var _fontsApothecaryfontTtf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\xbc\x79\x98\xa5\x59\x59\x27\x78\xde\xb3\x9f\xf3\xed\xcb\xfd\xbe\xbb\xaf\x11\xf7\xc6\x96\xb1\xdc\x2d\x22\x33\x32\x23\x72\xcf\xaa\xac\xac\xca\xda\xa1\xb2\x16\x28\x8a\x5a\x2c\xaa\xa8\x82\x2a\xd6\xc6\x02\x5b\xa4\x11\x19\x14\x68\x1c\x44\x64\x0a\x41\x5c\xdb\x56\x14\x1f\xda\xb6\x1d\x17\xdc\x66\x1e\x6c\x46\x07\xc7\x05\x15\x41\x6c\x41\x54\xb4\x61\x64\xba\x9b\xbc\xf3\x9c\xf3\xdd\x88\xcc\xd2\xbf\xe6\x79\x26\x3e\xc8\x88\xba\xf7\x5b\xcf\x79\x97\xdf\xef\xf7\xbe\xe7\x43\x80\x10\xf2\xd1\x5b\x10\x41\x2f\x3d\x7f\xfe\xce\x9b\x1f\xf8\xb7\x3f\xfe\x83\x08\xfd\xe3\xcb\x11\x42\xf5\x0b\x67\xcf\x9d\x47\xdf\x8f\x16\x10\xfa\xc7\xe3\x08\xa1\xa5\xcb\x77\x6c\x0c\xbf\xeb\x9b\xff\x38\x46\x08\x1e\x43\x08\xdd\xfd\xd0\x93\x0f\x3e\xfd\xb3\x57\xbe\xfe\x46\x84\xc8\x7d\x08\xc1\x95\x87\x5e\xfb\x6c\x1b\x75\xf0\x1b\x10\xa2\x9f\x44\x08\xd1\x47\x1f\x7c\xe6\xe9\xd9\x0c\x11\x84\xcc\x31\x48\x3e\xfa\xc4\x1b\x1e\x79\xe3\x4f\x7e\x24\x47\x88\xbd\x13\xa1\x2f\xff\xcc\x63\x0f\x3f\xf8\xf2\xab\x7f\xfc\xa7\xbf\x8c\x10\xfa\x2a\x42\x68\xfa\xd8\x63\x0f\x3f\xc8\xff\x9c\xfc\x10\x42\xb0\x80\x10\x5a\x78\xec\xc9\x67\x5f\xff\xd5\xdf\xf9\xd6\x0d\x08\xc1\xaf\x20\x04\x1f\x7c\xe2\xa9\x87\x1e\xfc\x71\xf8\xe2\x2f\x20\x44\x7f\x09\x21\xf4\x99\x27\x1f\x7c\xfd\xd3\xe8\xe7\xf1\x3a\x42\x70\x03\x42\xa8\xfd\xca\x07\x9f\x7c\xf8\xb3\x95\x9f\xfc\x4b\x84\xfe\xfe\x38\x42\x70\xf5\xe9\xa7\x9e\x79\xf6\xdc\x03\x3f\xf1\x28\x42\xff\x60\xee\xff\x9b\xf6\x59\x01\xa1\xff\x34\xfa\xed\xa7\x5f\x12\x1c\xff\x06\x72\xc8\x5f\x23\x84\xd0\xef\x36\x3e\xfd\xc6\x83\xdf\xb3\xf7\x5e\xfd\x22\xf9\x5b\x82\xcd\xfd\x22\xf3\x2f\x2a\x8e\x21\xe4\xea\x17\xd1\x15\x7a\xfb\xec\xbd\x08\x91\xbf\xb5\x67\xba\xfe\xe7\x51\xfb\xc9\xa3\x78\x15\x39\xf6\xbf\xb1\x3d\xca\x7c\x76\xf2\xe0\x1c\xf0\x4d\xf8\x3a\x62\x08\xe1\x77\xe0\xff\x88\x10\x7a\x67\xf1\x1b\xfe\x1c\x6d\x01\x36\x07\x70\x52\xec\xf8\x96\x83\x23\xe7\x3f\xc3\x67\x9f\x7d\x04\x9d\x44\xed\x4d\x44\xda\xb3\x1d\x74\x85\x60\x68\x14\xf7\x64\x4f\xfb\x04\xea\xd8\xdf\x37\x23\x04\x6b\x08\xc1\x9d\xa8\x03\x97\x66\xdf\xc2\x8f\xcc\xbe\x8c\x5f\x3c\xfb\x0a\x79\xd5\xec\x4b\x64\x07\x71\xf4\x0d\xb4\x0a\x3f\x84\x12\x38\x39\xfb\x2a\x7c\x18\x11\x5c\x41\x97\xd1\x3f\xa1\x06\x3c\x82\x5c\xf4\x07\x48\xc2\x1b\x67\xbf\x8b\x3b\xb3\xbf\x82\xff\x8a\x22\xfc\x9a\xd9\x0c\x9f\x9c\x7d\x0e\xbf\x62\xf6\x87\xf8\x86\xd9\x5f\xe0\xd1\xec\xeb\xf8\xe1\xd9\x55\xfc\xca\xd9\x9f\xe1\x33\x68\x11\x76\xd0\x49\xe8\xa3\x18\x7f\xfb\xec\xab\xf8\xdb\x51\x8e\x9f\x9d\x7d\x01\x9f\x46\x47\xf1\x57\xd0\x06\x69\xcc\xbe\x80\xaf\xce\xfe\x89\xdc\x8c\xd6\xc8\x0f\xcf\xfe\x0b\x39\x35\xfb\x06\xfe\xd2\xec\x2a\x79\x15\xba\x4c\x3e\x82\x14\xa6\x88\xe2\x4f\xa3\x25\xf2\x04\x12\x78\x86\x18\x45\xb3\xaf\x91\xb7\xce\xfe\x96\xfc\x30\x5a\xc7\x7f\x38\xbb\x4a\x7e\x07\x4d\xc9\x03\xb3\xaf\xe1\x0f\x20\xc0\x7f\x35\xfb\x06\x79\xd5\xec\xeb\x64\x77\xf6\x59\x7a\xfb\xec\xf3\xe4\xe2\xec\x7f\x90\x87\x66\xff\x1b\x59\x9a\x7d\x1d\xce\xa0\x04\x3e\x3b\xfb\x2a\xd4\x10\xc1\x1b\x68\x15\x5f\x41\x0c\x1a\x28\xc7\xb7\xce\xbe\x82\x6f\x9e\x7d\x1a\x57\x66\xff\x88\x1f\x46\x1e\x5e\x99\xfd\x3f\x70\x75\xf6\x1f\xf1\xed\xb3\xdf\xc7\x0f\xcf\x7e\x14\xbe\x73\xf6\x19\xb8\x7f\xf6\x5e\xfc\x1e\xe4\x00\x47\x7d\xf2\xe4\xec\x0b\xf8\xc9\xd9\x57\xf0\xf9\xd9\x9f\xe2\x5b\x66\x9f\xc1\xaf\x9c\xfd\x0d\x7c\x73\xf6\x25\xf8\xc3\xd9\x57\xe0\xa7\x66\x7f\x8c\x5f\x35\xfb\x0c\xbe\x32\xfb\x15\xf2\xe4\xec\x93\xf8\x7d\x08\xe1\x57\xcf\x3e\x8c\xf3\xd9\x97\xe1\xf9\xd9\x8f\xa3\xff\x8e\x46\xe6\x37\x7e\x2b\x6a\xc2\x0a\x1a\x42\x1f\x35\xe1\x21\x94\xc2\xcb\x51\x52\x58\x96\xb1\x7d\xfb\xff\xfa\x7c\xbe\xee\x44\xc4\xfe\x55\x47\x14\xed\x20\x84\xb4\xb5\x32\x8c\x9e\x6b\x57\xda\x8d\x4d\x34\x9b\x19\x3b\x6e\x97\xdb\x75\xf3\xf7\xec\x8b\x9f\xbf\xf8\xf9\x1b\x3e\xf3\xc8\x0b\xad\x0d\xf8\xe1\xe4\x23\x63\x39\x87\x56\x8a\xae\xb3\x56\xca\xb8\x90\x4a\x3b\xae\xe7\x07\x61\x14\x27\x69\x29\xcb\xcb\x95\x6a\xad\xde\x68\xb6\xda\x9d\x6e\x6f\x61\xb1\x3f\x58\x5a\x5e\x59\x5d\x3b\xb2\xbe\xb1\xb9\x35\x1c\x8d\x27\xd3\xed\x9d\xa3\xc7\x76\x8f\x9f\xd8\xdb\x3f\x79\xea\xf4\x99\xb3\xe7\xce\x5f\xb8\xe1\xc6\x8b\x37\x5d\xba\xf9\x96\xcb\xb7\xde\x76\xfb\x1d\x77\xde\x75\xf7\x8b\x5e\x7c\xcf\x95\x7b\xef\xbb\xff\x81\x97\xbc\xf4\x41\xf4\xff\xff\xcf\xcb\x1f\x7e\xd9\x43\xff\x9f\x0e\xb0\x71\x06\xa5\xf3\xed\xcf\xe0\x53\xf4\xf3\x62\x4f\x3e\xaf\x5f\xaf\xff\xce\x79\xde\xbd\xdd\x7b\xbb\xff\x13\x81\x1b\x5c\x09\xbe\x3f\x74\xc3\x9f\x8a\xfe\x2e\xe9\xa6\xef\xcf\x16\xf2\xef\x2b\xbf\xbd\xf2\xda\xea\xf3\xb5\x77\xd4\xd7\x1a\xb8\xf1\x8f\xcd\xbf\x6c\xfd\x5d\xfb\xeb\xdd\xe7\x16\xa6\x8b\xef\xea\x3f\x37\xf8\xbe\xe5\x9f\x5f\x7d\xc7\xda\x27\x37\x6e\xdd\xbc\xb2\x75\xfb\xe8\xad\xe3\x5f\xda\xfe\xe9\xa3\x9f\x3a\xf6\xd2\xdd\x5f\x38\xfe\x77\x7b\xcf\xee\xbf\xfd\x94\x3c\xbd\x73\xe6\x1d\xe7\xbe\x72\xc3\xf9\x8b\xf2\xa6\xa7\x2f\x1d\xbf\xf4\x7b\x37\x3f\x7f\xcb\xd3\xb7\xfc\xf1\xe5\x2b\xb7\x7e\xe8\xb6\x9f\xbe\xfd\xd9\x3b\x7e\xf9\xce\x77\xdc\xbd\xf6\xa2\xdf\xbd\xe7\xa3\x57\x7e\xed\xde\xdf\xbc\x7f\xfd\xfe\x8f\xbf\xe4\xb7\x1f\x3c\xf9\xe0\xaf\x3c\x94\xbd\xfc\xe2\xc3\x97\x1e\x69\x3e\x5a\x7d\xec\x81\x6f\x7b\xd9\x2b\xe8\x13\xaf\x7d\xf2\x27\x9e\xe2\x4f\x87\x4f\x7f\xf0\x55\x1f\x7b\xf5\xf8\xd5\x1f\x7d\xa6\xfc\x2c\x7f\xf6\x0f\x9f\xfd\x43\x84\x8d\x2f\xc3\x0a\xfe\x00\x22\x48\x20\xb4\x3d\x8a\x7a\x24\xea\x44\xa7\x7f\xeb\xb7\x3a\xa0\x3a\xf8\xc5\xdf\xfa\x37\xf8\x03\xdf\x7a\x04\x21\x86\x3a\x28\x43\x5f\xc3\x3f\x8f\x02\xb4\x80\x1e\x46\xaf\x43\x6f\x43\x68\x7b\xd0\x1f\xf4\x07\x5c\xa4\x79\x9a\x6f\x4f\xb7\x87\x49\xaf\x2b\xb8\xe0\x83\x26\xe4\x99\xe0\x62\xba\x0f\xd3\xed\xe9\xa0\x3f\xe9\x4f\xb7\xa7\xdb\xd3\xd1\x30\x1f\xe6\x59\x9e\x89\x54\xf0\x00\xb8\xe0\x79\xd6\x82\x06\x4d\x05\x17\xab\x50\x1c\xd8\x1f\xf4\xb7\xc7\xdb\xe6\xb8\xc1\x3a\x0c\xfa\xe3\xed\x69\xd2\xed\x4f\xc6\xe6\xe8\xcc\x9e\x92\x0f\xfa\xdb\x3c\xcf\xcc\x07\x83\x75\x10\x5c\x64\xcf\x01\xc1\x04\x73\xc0\x40\x18\x85\x5b\x75\xd4\x58\xee\x12\x52\x69\x72\xca\x30\x61\xaa\x97\x4a\xfa\x5e\x02\x5a\xf4\x56\x9a\xb1\x23\x28\xe5\xd4\x01\x2e\x4b\xbd\x10\x63\x81\x09\x06\x96\x08\x02\x84\xe3\xc0\xf1\x28\x01\x01\x94\x33\xc2\xca\x15\xc6\x64\x5b\x68\xc2\x93\xd2\x79\xcf\xcf\xe2\xe6\x42\x09\x9a\x92\x72\x37\x75\x35\xa7\x5d\xc9\xa8\xfa\x1b\xd5\xaa\x2c\x95\x4f\x77\x52\x17\xec\xcf\x8f\x00\x21\x00\x95\x23\xcd\xe4\x68\x58\x73\xcb\x77\x8e\x1a\xa1\x43\xa9\x74\x80\x62\x0c\x80\xa9\x2e\x79\x69\x6b\x7a\xe7\xb2\x0a\x6f\xaf\x36\x62\x86\x01\x00\x93\x00\x9b\x1b\xe7\x32\x0b\xca\xbd\xb3\x6a\xe9\xd8\xc8\xab\x2c\x94\x59\xc8\xc4\xb7\xbe\xc7\x11\xcd\xa8\x13\xc5\x6e\xb5\xdd\xae\xba\x41\x02\x47\x73\x89\x99\x8c\x02\x57\x71\x41\xa5\x32\x5e\x3e\xfb\x16\xbc\x05\x7d\x19\x7f\x1a\x25\x68\x82\x3e\x8c\x50\xb2\x01\x99\x48\x03\x3c\xcd\x87\xf9\xa4\x3f\xb0\xc3\xde\xeb\xf2\xae\xc8\x5a\xa4\x81\xb3\x52\x9e\x95\x52\x31\xcd\xf2\xfe\x06\xac\xc3\x60\x32\x1e\xf4\xc5\x60\x52\x4c\x21\x17\x3e\xe4\x69\xde\xc4\x66\x98\x37\xa0\x1b\x00\xef\xf5\x07\xfd\x13\x30\x9e\x4e\xc6\xfb\x30\x35\x3b\xef\x41\x56\x6a\x91\xd1\x30\x1d\xe5\xc3\x51\x3e\xdd\x9e\xe6\xd9\x1e\x98\x7f\x5b\x90\x99\x53\xe7\x69\x0b\xdb\x3f\x04\x1f\x74\xcd\x5c\x76\xed\x84\xed\xc3\x78\x70\xab\x9b\x63\x90\x0c\x4a\x9c\x10\x07\x00\x4b\xfa\x2a\x85\x85\x22\x8c\x51\x0c\x40\x19\x11\x8e\xc0\x84\x99\x11\x84\x35\xc0\x8c\x33\xc2\x5d\x10\x18\x6b\x00\x02\x2a\xf0\x53\x0d\x29\xe7\xcc\xa5\x18\x30\x13\x04\xa4\xef\x40\xa3\x2c\xed\x28\x62\xc0\xae\x4f\x09\xd3\x34\xf3\x98\x19\x6c\x30\xa7\x64\x66\x47\x97\x4b\x4a\x31\x66\x24\x75\x14\x25\x0c\xbf\x0f\x48\xf5\x7e\x7a\x6e\x03\x00\x03\xec\x6c\x25\x27\x73\x15\x62\xd8\xea\x57\x29\x60\xc0\x18\xb7\x57\x25\xd7\x18\xb0\x0a\x52\x37\x24\x57\x3a\xb1\x7a\x07\xc6\x72\x71\x71\xc4\x85\x4f\xe3\x71\x79\x7d\x62\xcc\x2c\x73\x1c\x57\x98\x03\x34\x21\x18\x08\x61\x7a\xfd\x2c\x7e\x53\x5d\x38\x20\x05\xa1\xf6\x06\x5c\x0c\x9e\xf9\x8d\x35\x11\x52\xba\x71\xf7\x0e\x82\x45\x9c\xa6\xae\x64\x9a\x6b\x20\xc6\x24\x40\x78\x6e\xe2\xf3\x65\x13\x5b\xd8\xec\xcb\xb3\xbf\x84\xab\xf8\x97\xd1\xe7\xd1\x5f\xc2\x9f\xc1\x37\xf0\x8a\x89\xbb\xc6\xe4\x45\x37\x4f\xcd\x40\x76\xfb\x83\xae\xe0\x25\x9e\xa7\x99\x19\x74\xfb\x15\x2f\xa5\x59\x29\x2b\xf1\x62\xc4\x7b\x7d\xe3\x54\xf9\xd0\x7c\x6d\x76\xb0\x5e\x26\xb2\x3c\xcb\xb7\x0b\x5f\x2c\xb6\xd1\x3e\x8c\xa6\xbb\xd8\x38\x63\x6a\xcf\xc1\xcd\xae\xa3\xe1\xf6\xc8\xf8\x68\x96\x8f\x8b\x7d\xf7\x70\x13\xb7\xec\x5f\xfd\x41\xbf\xb8\xda\x60\x1d\x36\x60\x3c\x38\x01\xe3\xed\xc3\xb3\x99\xe9\x1f\xe6\xe3\xed\xe9\x64\x3a\xe8\x0e\xba\x66\x9f\xf9\x31\x83\xde\xfc\x0e\xec\xd6\xe3\x83\xfe\xa4\x2b\xac\x61\xd8\x23\x93\xbe\x98\x0e\x4e\xc0\x74\xbb\x3f\xe9\xef\xc3\x1e\xe4\x99\xb1\xa9\xd1\xd4\x5a\x50\x3a\x3f\xb2\x65\x8d\xf9\x9f\x3d\x80\x79\x3a\xb3\xb5\xc0\x3e\x7a\xc9\xc6\x92\x51\xb6\x3d\xca\xf2\x2c\xc0\x76\x30\x36\xa0\x3f\xe8\xf7\x0e\x2e\x9e\x8a\xd1\xe1\x81\xf6\xc4\x83\x75\xe2\xc3\xfc\xcb\x52\xf1\x68\xdd\xc1\x2a\x98\x9b\x2c\x0e\xb5\x17\xba\xee\xee\x5f\xb8\xcd\x77\x1a\xf4\x6d\x98\x9a\xef\x3d\xdd\x07\x3b\x50\xc5\x07\xa3\x2c\xdf\x3d\x18\x26\xf3\x69\xaf\xf0\xc7\x7c\x98\x8d\xb2\xbc\x2b\x78\x40\xb2\x5d\xe3\x2d\x79\x7f\x52\xec\x33\x3d\x98\x35\x91\x9a\x27\xb2\x33\xd3\x84\xd2\x3c\xea\xad\x82\x1d\xb8\x81\x89\x86\x27\x60\xbc\x4f\xa6\xdb\x53\x70\x29\xd3\xa5\x26\x03\x70\x43\x15\xc8\x45\x55\xd7\x04\x88\x53\xae\xba\xb9\x20\xbe\x4f\x18\x00\x76\xb9\xa2\xba\xe4\x78\x84\x52\xa0\x2c\x2b\x7b\x15\x86\x29\x61\x95\x90\x33\x90\x8e\x12\x84\x38\x01\x25\x94\xba\x65\xae\x3d\x68\xc6\xdc\x3a\x14\x75\xc0\x06\xa6\xbe\xcf\xa9\x2f\x3d\x61\x7c\x43\x28\x10\x94\xfa\x0d\x11\x79\x91\xf2\x41\x33\x0c\x04\x30\x75\x89\x56\xac\xe4\x13\x5a\xb8\x1d\x15\x94\x09\xad\x4a\x4e\xd6\x34\xae\x2a\x08\x50\x92\xf2\xaa\x1f\x87\x54\x28\x27\x70\x30\xa1\x59\xa0\x18\x25\x18\x30\x15\xda\x0f\x20\x88\x1c\x8d\x31\xa6\x1e\x0b\x5f\x82\x09\xfc\x06\x6f\x02\x51\xe6\xc6\x29\xf1\x55\xa0\x63\x49\x01\x8b\x90\x7a\xe6\x08\x16\x13\x12\x01\x91\xda\xcb\xb8\x75\x74\x42\x85\xe6\xc2\x8f\x22\x47\x50\x46\x71\xa8\x1c\x21\x99\xb9\x8b\xa0\x2a\x95\x83\x31\xd3\x4c\x33\xd1\x2a\x69\x45\x00\x08\xe1\x94\x02\x30\x26\x35\x2d\x79\x09\xc7\x14\x58\xe8\x57\xa8\xc7\x15\x15\x38\x77\x28\x65\x04\x80\xfa\x6e\x00\x0c\x84\xa7\x7c\xc5\x29\x17\x98\x6a\xe1\x2f\x00\x69\x82\xa7\x98\x4b\x01\x1b\x7f\x77\x08\xc5\x26\xee\x50\x46\x19\x60\xa9\x1d\x4f\x32\x82\x31\x26\xc0\x5c\x11\x66\x98\x61\x8c\x19\x8f\xaa\xba\x2a\x54\xec\x57\xfd\x1c\x80\x53\xdf\x33\xa7\xf7\x6a\xaa\x2e\xb9\x0c\xa2\xbe\x5a\x94\xce\x1b\xb9\x50\xad\x72\x48\x08\x0d\x7c\x95\x09\x42\x30\xe1\x20\x8f\xf7\xd4\x62\xc4\x01\x13\xcc\x08\x28\x51\x44\x39\x4c\xbd\x20\x8b\xa9\xeb\x08\x47\xfa\xe6\x4e\x81\x87\x55\x60\xf8\x83\x00\x44\xbc\x72\xc9\xf7\x53\x33\x44\xc0\x30\x30\x65\x66\x82\x3b\x9d\xb8\xdb\xf1\x4a\x66\x9e\x6c\xe4\xc4\x98\x02\x85\x80\x00\xa1\x44\x34\xa4\xab\xdc\x61\x3b\x76\x35\x65\x84\x28\x77\x69\xc7\x93\x2e\xf3\x99\x99\x44\x02\x98\xb9\x8c\x9b\x50\xa6\x2e\xd5\x42\xdf\xcc\x2c\xc7\xb0\xd6\x8d\xcf\x34\x84\xc0\xd8\x4c\x36\xad\x50\x65\x0c\xcc\x84\x32\xca\xcd\x55\x31\x26\x5c\x38\xd5\x5a\x37\xf3\x95\x47\xa9\xfd\x18\x13\x86\xcb\xd2\x4c\xd4\xfa\x03\x09\xa5\x8c\x09\x2a\xbc\x73\x1b\x79\xa0\x18\x21\xd8\x98\x22\x80\x54\x91\x1b\x55\x97\xc2\x23\x57\xbf\x8b\x10\xf8\xcf\x34\x5e\x7b\x05\x80\x2b\x40\x08\x93\xd3\x31\x05\x87\x71\x33\xe8\xa5\xd5\xb0\x9f\x79\xc2\xde\x21\x40\x56\x5b\x3e\x17\x73\x66\x32\xb8\xc9\x1a\x98\x09\x29\x28\x61\x42\xf8\x9a\x81\x3b\xe8\x07\x66\x80\x92\xb8\xcf\xa5\xc7\x89\x19\x7d\x33\x86\x5c\xa7\xed\x4a\x85\x11\x30\x13\xc5\x44\x59\x6a\xd6\xf7\x5c\x01\xcc\x3c\x07\xc9\x76\xe2\x76\xd7\x65\x8c\x44\x84\x28\x6b\xcf\x98\x89\xb0\x16\x37\x2e\x10\x20\xf6\x3f\x39\x30\xe1\x85\xfd\x25\xcf\xe3\x94\x10\x5c\xec\x43\x4d\x12\xb3\xee\x42\xa3\x76\xda\x59\x63\x5a\x50\x09\x66\x90\x48\xb5\x1d\xb9\x40\x59\x1e\xf6\x9a\x01\x37\xe6\x02\xe5\xb8\x29\x35\x10\xb8\x0d\x40\xee\xad\x71\x00\x89\x21\xe3\xb1\xae\x93\xd5\x9a\x02\xe6\x51\xc1\x8d\x91\x62\x20\x4b\xb4\x2e\x23\x4c\x15\xd3\xc2\x63\x4c\x72\x73\x37\xda\x7e\x65\x06\x20\x58\x3b\xcd\x7c\xc3\x18\x67\x5f\x99\xbd\x0d\xfe\x1e\x7f\x0b\xe5\xe8\xcd\xe8\x7b\xe0\x14\x5c\x86\x27\xe0\xdd\xf0\x11\x84\xb6\xb3\x83\x38\x69\x02\x93\x09\x54\x93\xf1\x36\xef\xf5\xf3\x69\x11\x4c\xf7\xa0\x88\x28\xd7\x6f\xf3\xf8\xda\x84\x7c\x34\x35\x9b\x89\x5d\x36\xca\x99\xf0\xb5\x3d\xe9\x0f\x78\xaf\x2b\xb2\xc3\x40\xe8\x43\x7e\x78\x91\x00\x78\x01\xe6\x6c\xc6\xb1\x79\xa5\x55\xe0\x06\x62\x4f\xbc\x0b\x87\x79\x29\xcf\x2c\x50\x98\x87\x3b\x2e\xba\x76\xeb\x99\xff\xf5\x07\x63\x9b\x3a\xe6\x09\xe7\xda\xe9\x0f\xb6\xc3\xb0\x9d\xce\x91\x86\x45\x8c\xdb\x06\xcb\xf8\xa4\x88\x90\xfd\xc1\xb8\x78\x12\x93\xcd\x76\x61\x68\x73\x8a\xf0\xa1\x01\x16\xe0\x6c\x4f\x27\xe3\xed\xc9\xd8\x60\x1b\x03\x34\xc7\xd7\x9e\xfe\x30\xc1\x90\xe2\xf7\xfc\x06\xb6\xaf\x0b\xfc\xc5\x18\x4d\xf6\xa0\x09\x25\x5e\xca\x4a\x69\x62\x23\xfb\xa4\xbf\x3d\x9e\x9e\xc0\xe3\xc1\x78\x0f\xb2\xbc\x64\xaf\xdc\x02\xfb\x74\xe6\x08\x7b\x22\x83\xbd\xe6\xe3\xd9\x5f\xc0\xc6\x86\x81\xb7\xdc\x1d\xe1\x78\x7e\x85\x06\x58\x32\xef\xb7\x01\x7b\xbd\xb2\xc7\x4e\x9e\x0b\x54\x35\xed\xb9\x49\x99\xf5\x15\xa5\xd4\xf8\x1b\xa1\x19\x8d\xcb\xa9\x9f\x39\x7e\xa0\x88\xb1\x02\xc2\x9c\x74\x47\x75\xa0\xaa\x1c\x06\x44\x43\x60\x82\x6d\x39\xae\xe6\xb2\xde\xa8\x55\x99\xbe\x53\x75\x16\x7d\x8f\x60\x6c\xc1\x06\x55\xd5\x28\xa6\x40\x05\x38\x04\xc3\x3e\x00\xf1\xbd\x16\xc6\xc4\x91\x01\x23\x40\x30\x0e\xdd\x48\x8a\x73\x35\xe3\x2d\xd8\x25\x1c\x63\x2a\x54\x14\x29\xce\x85\x06\xa9\xa4\x90\x5c\x85\xc4\xf8\x2b\x10\x42\x09\xc6\x09\xcb\x53\x6f\xb5\xb6\xe0\x38\xd5\x1b\xc7\x22\x88\x59\x2a\x01\xeb\xa8\x9d\x83\x10\x40\x83\x55\x92\x7b\x49\x24\xa6\xd2\xe2\x5b\x42\x34\x61\x54\x95\x1d\x00\x46\x63\x47\x13\x00\x87\xa4\x99\x00\x7b\x3a\x00\x90\xb5\xbe\x3b\x69\x34\x38\x6f\xb6\x16\x16\x9d\x72\x25\x82\xc8\x7c\x83\x71\xa2\x7d\x4c\x7c\x3e\x36\xf1\xc2\x64\x00\xd9\x2a\x27\x84\xa4\xa5\x3e\x68\x5f\x01\xd9\x65\x5c\x59\x2c\x4d\x94\xe7\x98\x0c\x97\x72\x21\x97\x4b\xe1\x36\xf3\x29\x8b\x4c\x50\xa2\xe2\x88\xeb\x37\x40\x71\xaa\x3f\xcb\x68\xd4\x5b\x75\x26\x92\x68\x4c\xb5\xd3\xd6\x0b\x23\x2a\x31\x7c\x8e\x90\x40\x50\x8c\x93\xef\xbd\xb0\x9a\x86\xf6\x6c\x34\x97\x8d\x4a\xbb\x53\x69\x38\x81\xc6\x5c\xfa\x7a\x65\x03\x80\x0a\x2f\xee\x64\x4b\x11\x91\x42\x7b\x0d\x6e\x12\x80\x27\x13\xce\x4c\xfc\x5c\xe8\xde\x3e\xb8\xbb\x41\x08\x96\x32\x71\xa3\xaa\x8f\xd3\xf6\xc2\xc8\x15\x9a\xba\x1c\x3c\x7f\x4b\x06\x65\xc5\x30\x0d\x58\x93\xe1\xbf\x25\x3c\xd5\x26\x42\x2b\x4f\x7b\xbe\x09\xc6\x14\xe3\xd2\xb4\xda\xcf\xa2\xcc\x64\x39\x00\xd0\x5c\xb3\x7e\xec\x33\x4a\x18\x10\xcc\xf3\x72\xbb\x55\xae\x58\xa8\x0c\x58\x94\x6a\x3b\xe3\xa7\xef\x0d\x31\x21\x40\x19\x55\x2d\x5e\xf3\x52\x47\x35\xbc\x7a\xc5\x71\xa8\x63\x82\x19\x01\xec\xdd\x1c\x2c\xb7\x3d\xd0\x81\x6b\xc6\x9a\x60\xa6\x75\x4c\x19\xc6\x47\x9a\xbc\x1c\xdb\x50\xed\x0c\xfd\x23\x2a\x65\x61\xd9\x93\x18\x28\x26\x34\x59\xec\x6f\xad\x3f\x30\x38\xe2\x12\xca\x28\x5c\xfd\x2a\xe3\xa5\x7e\x63\x99\x05\x69\xa7\x95\xe9\x77\xdf\xde\xcf\x7c\xc1\x89\xc2\x62\xb1\xb1\xb4\xd6\x6c\x70\x03\x08\xb4\xc0\x94\x32\xfe\xad\xff\x9b\x80\x24\x84\x72\xc2\x31\x39\xf9\xd0\x02\x77\x40\x09\x07\x1b\x48\xb1\x33\x19\xac\x52\xe0\xfc\x77\xb0\x8a\x06\x13\xaf\x13\x2e\x36\x7b\xcb\x26\x93\x3a\x08\x39\xb3\x2f\xcd\x7e\x9b\x78\xf8\x17\x90\x46\x4d\xb4\x8e\x4e\xa1\xf3\xe8\x0d\xe8\xad\xe8\x07\xd0\x8f\xa2\xff\x15\x7d\x09\xa1\x84\x0b\x9e\xe5\xd9\x74\x7b\xda\x37\xc1\x4c\xf8\x30\x58\x87\x6d\xc3\x39\x8c\x6f\x67\x03\x13\x0b\xf2\x6c\x34\x2c\x20\x56\x77\xbe\x4f\xaf\x3b\xe8\x9b\x9d\x86\x59\x9e\x2e\xa6\xdb\xbd\xf1\xc0\x10\xd0\x3d\x18\x4d\x0f\x60\xb3\xc5\x75\x01\x5c\x8f\x4e\x8b\x80\x61\x88\xce\x74\x1f\x4f\x13\x9e\x37\xcd\x85\x4c\xd4\x34\x64\xb6\x70\xe3\x79\x70\x30\x11\xc1\x5c\xd9\xfc\x2e\x76\x99\x87\x25\x73\x73\xd3\xed\x6e\x81\xf3\x4c\x14\x31\x97\x30\x70\x54\x4c\x0f\xe1\xeb\x3e\x9e\x6e\x4f\x27\x7d\x13\xf0\x0c\xd8\xcc\xde\xdb\x96\x2c\x08\xe2\x16\xa5\x69\xe2\xc8\x88\xf3\xd1\x62\xbb\x22\x78\xb3\x4c\x98\x1f\x08\x7d\x71\xf9\xa8\x13\x54\x6b\x17\x4e\xdd\x82\x49\xb7\x7f\x9e\xdc\xd6\xce\xd6\x08\x79\xe9\xad\x2f\xee\x77\x93\xf8\x35\xb7\x0a\x0d\xf0\x1d\x18\x4e\x61\xc5\xb1\x22\x8e\x6a\xf9\x92\x62\xae\xe2\x66\x48\xd3\xc6\xd6\x3d\x1b\xeb\xb1\x27\x19\x25\x5c\xa4\x8e\x04\x1c\x39\x89\xc3\x17\xd7\x9f\xba\x9f\x9f\x6d\x25\x7a\x31\xa9\x87\x8e\x5a\x17\xed\x4d\x37\xaa\xf6\x17\x8e\x87\x9e\xcc\x30\x93\x8a\x7b\x94\x84\x3b\xe7\x19\x3b\x79\x7e\x39\x5e\x6f\x95\xbc\x63\xf2\x72\xcb\xc7\xeb\xcb\xe5\xad\x3b\xee\x14\xea\xac\x8f\xb1\x14\x9b\x2b\x52\x7a\xcf\xde\xf7\xd4\x91\x45\xee\xc6\x8e\x0f\x84\xb9\xf1\xfa\xe6\x15\xbf\xdb\xcc\x4a\xcd\x50\x60\x26\x84\xc2\x0e\x98\x38\xb1\xe0\x2e\x66\x6d\x4a\xeb\xd5\x72\x3b\x13\x5e\x6d\xb1\x37\x54\xf2\x58\x3b\x5f\x52\x18\xa8\x5e\x2b\x5d\x5c\xde\x1d\xac\xbc\x68\xf7\xd8\xe2\xb2\x28\x3b\xe5\x8d\x1b\xcf\x3f\x71\x6c\x74\xe3\xf9\x57\x30\x25\x94\xc6\x00\x0a\x84\x53\x50\xbc\x50\xfb\x42\xfb\xa5\x5e\x4c\x6b\xa3\xdb\xde\xf6\xe8\xe3\x83\x72\xc8\x39\xe1\x80\x7d\x27\xce\x97\x6a\x0b\x99\x82\xdb\xee\xfc\xb5\x0f\x39\x57\x07\x8b\xfd\x34\xd0\xfe\xb2\x17\xa5\x0d\xa8\x65\x8d\x93\xa5\xb0\xd2\x2a\x9f\xa8\x72\x22\x04\xc5\x8c\x2c\xba\x17\x57\xd7\xcf\x12\x2c\xa2\x7b\x8e\x74\x37\xbb\xb5\x4b\xfd\x9b\xce\x84\x0a\xd3\x7b\xf6\x6e\xda\xf4\xb9\x6b\x8c\x1a\x00\x6e\xfe\xd0\xaf\xde\x71\x9b\x9b\x75\xab\xdd\x98\xcb\x6c\xe9\xf1\xc7\xff\x4d\x69\x77\xdc\xa8\x74\x52\xc7\xd2\x79\x0c\x20\x0c\x6f\x13\x88\xcf\xfe\x06\xff\x1e\xfe\x30\x02\xf4\x4e\xf4\x2d\x70\xa1\x06\x2b\x70\x0c\x21\x10\x83\x83\xf4\x66\xcd\xcb\x12\x86\x39\x6b\xe8\xd9\xc9\xef\x5d\x23\x0e\xb8\xc8\xc5\xd7\x52\xde\x68\xd3\xd0\x84\xac\x64\xec\xf9\xc0\x62\x8b\x64\x3b\xb7\x24\xc3\xdd\xf2\xb4\xf8\xc0\xba\xc3\xe1\xc9\xec\x36\x99\x67\xd0\x55\xdc\x15\x5c\xe4\x73\x16\x72\x98\xe3\xf7\x60\x97\x0c\xf3\xd1\xb0\xa0\x5b\xf6\x36\x0f\xb8\x52\x9e\xe5\x86\x8a\x1d\x24\xf9\x43\xe6\x67\x0e\x3d\xf8\xc3\xde\xf2\xe1\xa9\x0e\xd3\x78\x91\xa1\x59\x91\x33\xa7\xf3\x07\x3a\xc8\xf9\xf3\xdd\x93\xe2\xdb\xe2\x79\x05\xdf\xb6\x8f\x79\xed\xb4\xf8\x67\xe0\x07\x5d\x9e\x27\x4e\x2d\xf4\x94\x0a\x3c\x0b\xac\x30\x0d\x1d\xa9\x68\xd4\xc2\xc0\x41\x30\x87\x31\x4a\xb4\x70\x99\x8e\xe3\xb3\x69\xa3\xbe\xb3\xfd\x64\xb9\x4a\x59\x19\x07\x01\xc6\x8c\x2a\xe6\x02\x05\x4a\x98\xf4\xca\xfd\x08\x56\x7a\x51\xe5\xc5\xb7\xde\x56\x8a\x31\x10\x2f\x2c\x51\xc0\xd4\xa9\x8c\xe4\x62\x2d\xe0\x22\x09\x6f\x72\x45\xa3\x59\x02\x3c\x68\x70\x17\x63\x55\x66\x51\xc0\xdd\x92\xa3\x83\x5b\xc1\xf1\x2b\x8e\xa3\xb0\x60\x58\x60\x9d\x7b\x15\xe6\x32\x57\x09\x8a\x09\xf3\x42\xd1\x09\x63\x21\x23\x15\xc8\xb4\x17\xd7\x6b\x5c\x6e\xf7\x37\xa9\xcf\x3d\x93\xd3\x35\xe3\x41\xaf\xcd\xbc\xea\xa2\xdc\xeb\x95\x1d\x01\x90\x57\xef\xbb\xef\x89\x66\xb6\x3c\x22\x49\xbf\xec\xc7\x74\x59\x88\x6e\xeb\xdb\x4f\x9c\x5d\x5c\x0f\xbc\xcb\x6e\xbd\x95\x08\x47\x3a\x57\xbf\x21\xfd\xb0\xd1\x59\x69\x09\xd1\x69\x1f\x77\xf1\xda\xea\xca\x9a\x72\x36\x8e\x4e\x8f\x64\xa9\x1f\x1d\x5d\xc9\x31\xf8\x51\x3d\x2d\x61\xec\x24\x0b\xec\x34\x26\x6d\xce\xba\xcd\x23\xdd\x16\xc1\xc7\xa6\x3e\xfc\x0c\x10\x21\x6a\xe3\xce\x7a\x23\xd0\x54\x0a\x4c\x31\x26\x4c\x0e\x2a\x41\x42\x13\x63\xad\x4a\x2a\xa9\xb9\x22\xd2\x77\xa7\x77\x57\xca\x9c\xd5\x2b\xd5\x85\x85\x04\xa4\x49\xc1\x44\x78\x82\x61\x8a\x29\x53\x41\xae\x61\xf1\xbb\xa6\x37\x97\xd2\x96\x0c\x30\xa1\x11\xa1\x29\xa4\x82\x30\x22\x02\xec\x29\x02\x4a\x6d\x9c\xec\x9d\x3e\x5b\x06\xb2\xa6\x30\x00\x83\x82\xf8\xe1\x5f\x05\xb7\x72\xa4\xde\xd6\x06\x1b\x30\x51\x8b\x0c\xe1\x32\x24\x52\xc8\xb4\x12\x4a\x10\x4b\xe9\xfe\x89\xd6\x52\xa7\xac\x39\xa5\xd2\xa3\xd4\xa1\x82\x48\x8c\x81\x48\x0f\x27\x5a\x84\x4e\x00\x89\xee\x65\xd5\x97\x9e\xfc\xe0\x1a\x71\xca\x81\x50\xb4\xbd\xb3\xb1\xd0\x6e\x73\xde\x1e\x9c\xda\x39\xa1\x53\x91\xc9\x3c\xa8\x1d\xeb\xf5\x96\xb4\xb3\x58\x5b\xec\x55\xab\x72\x89\xbf\x88\x74\x7a\x9b\x47\x57\x86\x71\xb0\x3d\xd9\x3a\xe6\x03\x4b\x2b\x89\x50\x9e\xea\x07\x2e\xe1\x01\xde\x04\xa7\x5b\x3f\xee\x97\x92\x68\xb0\xb8\xc7\x31\x42\x04\xad\xc2\xfb\xd1\xbb\xf1\x27\x51\x0d\x35\xd1\xcd\x08\x25\x5d\x6b\xb9\xa5\x42\x94\x2c\x9c\x6f\x32\xed\x4f\xc6\x7b\x30\xd9\xce\xb6\x07\x73\x85\xa3\x94\x89\x94\x37\x20\x6d\x82\xe0\x0d\x28\x0c\xb6\x67\xdd\xc9\xe6\x8c\xb1\x81\x91\xd3\xed\xe9\x13\x8c\x0b\xc5\xcd\x98\x60\x0c\xcc\x25\x9c\x72\x65\x87\x61\xa0\x44\x3d\xb0\x4a\xa0\xc9\xb5\x80\xb5\xf2\x09\x63\xa9\xe3\x59\xe1\x89\x81\x83\x85\xf0\xf0\xbf\x05\x4c\x16\x8e\x2e\x93\x2e\xd3\x4a\x59\x28\x20\xdc\xef\x09\x41\x79\xdc\xc7\xb8\x4e\x80\x9b\x33\x2a\xe1\x72\x8f\xb2\xf8\xc6\xb5\x05\x20\xc2\x17\x96\xb2\x73\xe9\xab\x40\x29\xd6\x21\xfd\x0b\x6b\xc2\x05\x62\x55\xfa\x64\x46\xe0\x28\xfe\x3c\x3a\x85\x5e\x85\x50\x62\x72\x57\x0b\x9a\x30\x07\xdf\x07\xfa\x10\x3f\xd0\x52\x0e\xc2\x55\x00\xfc\x1a\x26\x9e\x87\x2c\x4b\x0b\x38\xb6\x02\xe1\x7c\x1b\xce\x63\x4d\x41\x10\x0e\x24\x90\x7c\xbc\xdd\x15\x63\x73\xdc\x7f\x05\xcc\x7c\x0a\x98\x11\x2e\x34\x33\x8e\x47\x9d\xa4\x4a\xee\x4b\x82\xfe\xaa\xb7\xa2\x94\x10\x54\x61\x52\x8d\x00\x33\x27\x89\x39\x37\x5c\x3e\x2a\x0f\x55\xe0\x72\x41\xeb\xbb\xc7\x9e\xd1\xee\x93\xaf\xac\x50\xaf\x4c\xd4\x66\x39\x54\x9c\x00\x21\x84\x73\xca\x94\x52\xeb\xc1\xea\x52\x94\xbc\x8c\x37\x5c\x3e\x17\x1e\x64\x82\xff\xc8\x80\x6a\x6e\x62\x80\x54\x81\x96\x5c\x4b\xa1\xfc\x84\x3e\xfe\xda\x97\xfd\xee\x73\xfd\x6d\x47\x18\x2c\xe8\xa6\x86\x39\x33\xe9\x71\x2c\x28\xd7\x49\x6b\xfa\x64\x7d\x75\xa1\x9c\xe5\xef\xfb\xd0\xff\xf2\xa0\xec\xde\x7b\xf5\xf7\xbf\x27\x3d\x72\x41\xd6\x1f\x1f\xb5\x62\x45\x0c\x4d\x34\xdc\x53\xba\xc7\x57\xdf\xf2\x07\x8f\x3d\xf7\x6a\x51\x92\x06\x86\x99\x0c\x20\xbd\xb2\x19\xe3\xd9\x57\xaf\xfe\x37\xf4\x1b\xf8\x47\xd1\x09\x3b\xc6\xfd\x39\x3c\xb9\x46\x58\x88\x8f\x0f\x25\xb0\x7f\xce\x33\x6c\xfc\x3c\x1c\xea\xe4\xe0\x23\x7c\xdd\xa7\xdd\x00\x7a\x36\xb2\x36\xf1\x0b\x45\xa8\x34\x6f\x42\x88\x15\x70\xa6\x12\xcf\x93\xd2\xf5\xa4\xa7\xc9\x4b\xf6\x88\x17\x11\x6f\xa9\x14\x29\xe9\xb9\x5a\x4b\x21\x28\xe3\x9e\x02\x01\x04\xeb\x85\x96\xd4\xcc\x73\x75\x89\x96\x42\x0e\x3e\x30\x15\xa4\x03\x87\x45\x0e\x09\xdc\xac\xcb\x1c\x4f\x38\x1a\x63\x9f\x08\xee\xe6\x24\x2d\x7b\xcc\x91\x9d\x9e\x02\x82\x1d\xea\x1a\xb2\xaf\xf0\x5b\x35\xc7\x94\x50\x4e\x25\x73\xc2\x66\xd0\xab\xb2\xe7\xaf\x7e\x3c\x5c\x58\x52\x9d\x1b\x0d\x40\x74\x41\x71\xad\xb4\x97\x39\x02\x5c\x9d\x89\xf6\xe5\x73\x83\x9d\x87\x1e\x3a\xb2\x7a\xc2\xdd\x1a\xd4\xc9\xff\xf8\x20\x30\xa7\xb4\x78\xae\xed\xf5\x1b\xc1\x1d\x3f\xf0\xf1\x63\xa2\xde\x09\xaa\x2e\x60\x48\x1b\xdb\x6a\xf7\x81\x47\x1f\xdb\x5d\x3f\x7f\x73\x93\xa6\x61\x24\x1c\x2b\xf8\x78\xd6\x8e\x09\x7c\x07\x9c\xc0\xbf\x8c\x9e\x41\x7f\x80\x50\xf2\x02\xd9\x2d\xcf\x72\xc3\xff\x26\x96\xc6\xcd\xc9\x57\x3e\xff\x22\xb5\x7e\x6d\x69\xd7\xf5\x33\x62\xfd\xb7\xd7\xed\xaf\x82\x28\xf1\x03\x1a\x6a\x07\x7b\xd5\x02\x43\x6c\x72\xee\xc1\x5c\x6d\x5b\x35\x94\xf7\xf8\xaa\xe1\x8f\x56\x96\xf3\x61\x1d\xdb\xdc\x66\x66\xe5\x5a\xfa\xe3\xa5\xd4\xb8\xd1\xf6\x35\x98\x68\x9c\x64\xff\x50\x4d\x9c\xee\x42\x21\xb6\x07\xf3\xf8\xd1\x9f\xf4\x4f\xe0\xf1\xf6\x78\x3a\x99\xde\x0d\xc4\x27\x19\x4b\x55\xa0\x9c\x3c\xce\xfd\x92\x8d\xa9\x04\x73\xcf\xc3\x94\xbb\x94\x92\xc8\x2d\x4a\x06\x5c\xc7\x22\x0e\x8d\x15\xd2\x82\x8c\xb9\x55\xee\x12\x41\x48\x00\x98\x02\x2d\xb5\xd3\x48\x09\x2b\x17\x31\xe1\x30\x6b\xc0\x9e\x8b\x19\xc5\x5d\xc8\x73\x78\x80\x51\x1a\x58\xfc\x42\x3d\x37\x4b\xa4\xeb\x73\x20\x3c\x60\x25\x92\x08\x8d\x41\xe2\xaa\x93\x12\x4a\xb5\xa2\x94\x70\xee\x67\xc6\x45\xb1\x08\x31\xc1\x11\xc5\x4a\xba\xd0\x96\x80\x09\xc1\xa4\x14\xe9\x34\x2a\xa4\x6e\x73\x9f\x54\x62\x8f\xba\x6e\x52\xaa\x71\xa6\x78\x90\x78\xdc\x98\x0b\x33\x60\x92\x8b\x22\x11\x70\x41\x18\x66\xc4\x75\x33\x5c\xa3\x32\x60\x2e\xc5\x82\x71\x15\xb8\x0e\xa3\x8c\xd1\x10\x80\x84\x03\x42\x05\x8d\xc2\x8c\xb3\x72\x6a\x28\x6b\x50\xd6\x56\xb3\x52\x98\x12\x5c\xae\x24\x49\x02\xef\xc5\x10\xf5\x15\x35\x37\xc1\x89\x0c\x5d\xca\xa8\x67\xa8\x2a\x75\xb1\xab\x5c\xcf\xd1\x38\x53\x54\x04\x98\x92\x52\x2c\x05\x15\x84\x71\xcd\xcb\x1c\xbb\xc0\xd8\x66\x1e\x48\x03\xee\x94\xe3\x08\xc0\x91\xcf\xb4\xc6\xac\x18\x0d\x22\x49\x2e\x62\x63\x6b\x97\x51\x08\x3f\x0b\x5f\x42\x8f\xa2\xdf\x40\x08\xb2\x43\x45\xe4\xa0\x4c\x65\x4c\xa6\xd0\x80\xfb\xdd\x43\xb5\x77\x52\x94\xa3\x7a\x07\x81\x73\x1d\x4f\xba\x73\x61\x77\x1e\x21\xfb\x27\xf0\x81\xee\x82\xb7\x87\x45\xdd\x24\x2f\xe0\xdd\xc0\x9a\x8a\xc9\x40\xbd\x79\xac\xc8\x4a\x59\xa9\x09\x26\x24\x8f\xe6\xa2\x49\xa1\x71\xe7\xa3\x69\x3e\x6c\xcd\xab\x6a\xe6\xcc\xc3\x7c\x54\x20\xad\x6b\x28\x6d\x32\xb5\x21\xc8\x56\x75\xba\x82\xc3\x79\x26\xa8\x74\x49\x39\x8c\x53\x57\xd7\xe2\x38\x16\xd4\xd0\x7d\x92\x2b\x0f\x33\x4c\xbc\x48\xc7\x84\x10\x02\x04\xfc\xa8\xc2\x4a\x2e\x21\x86\x1e\x1a\x76\xe9\x83\xcb\x9d\xb0\x16\x4f\x0c\x08\x02\xc0\x54\x2a\x15\x88\xd8\xa4\x7d\x42\x3c\x37\xe6\x22\x04\x09\xf0\x62\x00\x60\xda\xa3\x8c\xd6\xda\x7e\xc5\xc7\x04\x4c\xc4\x30\x54\x98\x96\x4b\x6e\xa6\x25\x58\x4f\xe6\x11\xc3\x56\xc4\x25\x18\x87\x61\x9d\x7b\xa1\x4b\xb8\x10\x44\x12\x47\x8b\x72\x5a\x58\x89\x84\x80\x01\x16\x0c\xfa\x3e\xf4\x6c\x4d\x0f\x84\x76\x2f\xc4\x11\x70\x1c\xba\x0b\xbd\xb0\x23\x6d\x81\x05\x0b\xa7\xe2\x97\x5b\xc4\x00\x44\x42\xb1\x34\xc4\x93\x4b\xea\x08\x5c\x75\x5c\x49\x29\x63\x44\x78\xfb\xbd\xd0\xa4\x12\x4a\xb8\xb1\xd8\x42\x06\x01\x49\x45\xad\x7e\x33\xed\x49\xf6\x0e\x26\xa2\xee\xad\xda\x33\x1c\x9b\x11\xca\x8c\x29\x07\x18\x24\x57\xc6\xfa\x01\x87\x5e\xce\x5a\xa9\xb6\xfc\x19\xb0\xf6\xdb\x8b\x7e\xc7\x75\x00\x08\x2b\x95\x8d\x63\x51\x8a\xb9\xc7\x14\xa5\xdc\x91\x0b\xf4\x7c\xca\xec\x8d\xd8\x78\xd5\x98\xbd\x09\xbd\x07\x3d\x85\x72\x74\x02\xa1\x6d\x5b\x97\x11\xd6\x82\xae\x45\xfd\x7d\x18\x5c\x23\xa5\x56\x3d\x2b\x1d\x44\xf6\x1e\xb7\x14\x76\x3a\x99\xf6\x07\xfd\x57\x9b\x67\x55\x6e\xe2\x3a\xd4\x51\x94\x51\x83\x1e\x4c\xfe\xb9\x4c\x14\x76\x89\xef\x84\x4e\x22\x05\xb5\xea\x2b\x93\x81\x5b\xe1\x9c\xe6\x04\x97\x5c\x1d\xa4\xf2\x66\xab\xcf\x76\x2e\x2f\x9a\xa8\x4e\x5d\x67\xb8\xaf\x89\xa4\xc4\xd7\x18\x88\x31\x02\xe2\x39\x91\xa4\x58\xed\x4d\xc2\xb2\x96\x18\xd2\x38\x52\xb8\x7d\xa9\xa6\x11\x02\xe4\xa2\xcf\xa0\xab\x30\x42\x5b\x05\x0f\x2f\x65\x86\x69\x1b\x63\x36\x5e\xd0\xb5\x45\x9e\x5d\x98\x57\x7a\xed\x0d\x0f\xe6\x70\x68\x0f\x9a\x30\x02\x06\xcc\xc9\x16\x2e\xe5\x0c\x33\xef\xcc\x5a\x2c\x34\x28\x91\xae\x9d\x09\x6a\x5c\x29\x95\x55\x2f\xf7\xf3\x40\x72\x2a\x09\xa3\xcc\x2a\x39\x1d\x52\x33\x48\x86\x50\x00\x07\x94\xaf\x01\x20\x72\xa3\xc0\xa3\x0c\x9b\x1f\x2a\x82\x52\x55\x28\xd0\x76\x7c\xe5\xec\x8b\xe8\x49\xf4\x4a\x94\xa3\x85\x42\xe7\x9c\x0b\x6d\x56\x86\x9b\x4c\x0b\x15\x4e\xa4\xc2\x44\xe4\x82\xfa\xac\x0e\xc3\x20\x8d\x6b\x61\x8d\x17\x31\xab\xb8\x82\x41\x9f\x5a\x31\x71\x3f\xaf\xd7\x9a\x55\x46\xa2\x98\x07\x3a\x64\x11\x75\xa9\xbd\xe1\xae\xa0\x65\x8d\x35\xe0\xc0\x53\x2e\xc2\xb3\x4f\xcf\xfe\x06\x72\xfc\x09\x54\x47\x97\xcc\xa8\xf4\xba\xc6\x7f\xad\xcf\xee\x1e\x02\x20\xeb\xe3\xe6\xdf\x3d\x30\xae\x3e\x3d\x10\x20\x6d\x51\x8b\xbc\x20\x87\xaf\x82\xc9\x25\xf0\x0f\x94\xd4\x23\x91\x80\x9f\x55\x45\x67\x8b\x66\x92\x71\xe5\x26\xd5\x7e\xce\xda\x1e\xbf\xfa\x85\xb3\x4b\x89\x97\xfb\x44\x6b\x5e\xdd\xc2\xc0\x69\x6a\xa0\x35\x4f\xda\x2c\xcf\xc2\x6a\xea\x3a\xbe\xcf\x7c\xe5\x57\x35\xf5\x1d\xc0\xef\x81\x9e\xbf\xcb\xfb\xf7\x3e\xd7\x78\xf7\x6d\x40\x9d\xa8\x39\xbe\xef\xbd\x57\xc2\x07\xfb\xd9\xb7\xde\x74\xd7\xbf\xbf\x6f\xff\x81\x25\xde\x6d\xba\x53\x4c\x7d\xc6\x8c\xc5\x94\x8e\x3f\x18\xde\x73\xcf\xb1\x07\x26\xed\xa4\x62\x70\xa4\xc7\x41\xfa\x86\xd7\xd2\xd9\x5f\xcd\xbe\x09\xff\x09\xbf\x0f\xd5\xd1\x26\xba\x84\x1e\x36\xd8\x66\x32\xee\x8f\xcd\x53\x41\x7e\x30\xef\x82\xaf\x5b\x05\x64\x6c\x25\x4e\xf3\xa9\x0d\x3e\xeb\x58\xf8\x50\x24\xc1\x26\xd8\x31\x9a\x2b\xd0\x85\xfe\x91\x91\xc3\x3d\xed\xa7\x5c\xf8\xd8\x8c\x4f\x76\x93\x04\xa2\x45\xf3\x8e\xd5\xfe\xc8\xe0\x68\x37\x6a\x34\xb7\x57\xa2\xbc\x8e\xc9\xa6\xa3\x3b\xfe\xb8\x7d\x7e\x6f\x79\x3f\xf0\xe5\xfa\xc5\x23\xab\x77\x74\xd7\x8e\x1c\x7d\xa8\x51\x53\x61\x78\x7e\xd8\x38\x7d\xac\xde\xdf\x8b\x16\xb2\x31\x86\xc6\x40\xc4\x01\xce\xe3\xe5\x91\x9b\x32\x2d\x58\xbf\x92\x4d\xca\x42\x02\x80\x84\x5d\xa1\xc5\x4a\x79\xb1\x1d\xec\x1e\x89\x82\x3b\xa6\x27\xef\x1e\x77\x36\x5c\x5f\x54\x4b\x8d\x8b\x5d\xfa\x27\x97\x1f\x7c\xf0\xce\x85\x53\xc9\xca\x66\xfb\x35\x37\x9c\xfb\xee\x07\x96\x08\xd9\x38\x97\x11\x36\xdd\xdd\xf9\xc0\x0d\xb7\xbc\xb5\x9f\xfb\x6e\x94\x5f\x5a\xbd\xf7\x0f\x5e\x4c\x61\xb3\xc7\xe1\xea\xc7\xab\x7b\xf9\x30\x63\xc7\xd6\x6f\x3b\xbe\xba\xa7\x55\x7d\xc3\xef\x27\xc7\x39\x25\xdc\xf0\x8c\x68\xf6\x21\xf8\x5e\xfc\x1f\x10\x41\x8f\xa0\x3f\x43\x28\x1f\xf7\xd2\x64\x0e\xaf\x2d\xb6\x08\x20\xdb\x1e\x1e\x36\x45\xd8\x2d\xb5\x8c\x9f\xcf\x1d\xca\xd6\x26\x37\x85\x25\xd3\xf9\xd0\x8c\xd8\xc8\x44\xf5\xf1\xa0\x2b\x0e\xbb\x25\x8c\xc9\x4f\xc6\x89\xad\xbe\x16\xa4\xbf\xd7\x3d\xcc\x42\xdb\x63\x13\x66\xa6\x63\xab\xe3\x17\x57\xb0\x45\xde\x7f\x5e\x46\x15\x16\xd6\x94\xb0\xf1\x96\xbc\x34\x3a\xfc\xa6\xd0\xe6\xf9\xa0\xd7\x1d\x74\xd7\xa1\x37\x4f\x76\x96\xef\x98\x5d\x0e\x4e\x64\x19\xc2\x9b\xe1\x7b\x01\x18\xaf\xdf\xa7\xdc\xd4\x21\x84\x8a\xa0\x21\xba\xc2\x15\x8c\x4a\x6e\x03\xb6\x01\x8f\x04\x13\x2a\xa3\x5c\xa4\x26\xbc\x02\xe5\xb5\xe9\xcd\x1e\xa8\x80\x2b\xe3\x94\xd4\x82\x19\x4f\xa5\x8e\x4d\x36\x10\x60\x8a\x81\x0b\xf6\x0a\x21\x3a\xa2\x13\x7b\x2a\x2c\x52\xb5\xf6\x3d\x45\x99\x0a\x09\xd8\xc8\xc0\xf4\x9e\x15\x36\xa9\xd4\xa9\xf6\x1d\xed\x53\x0a\x84\xe2\xc0\xa4\x13\x9f\x87\x5e\xa8\x39\xc6\x94\xba\x8c\x01\xc5\x52\x7a\x3c\x50\x10\x9e\x3b\xde\x6e\x6a\x41\x08\xa8\x20\xcc\x3d\x9b\x92\x88\x21\xc9\x00\xd0\x07\xc0\x1f\xa7\xaa\x1b\xdf\x42\x01\x5c\x42\x9d\x14\x17\xa5\x1f\xa6\x28\x57\x01\x6b\xff\xbb\xfc\xc2\x91\x6a\x9c\xeb\x9c\x71\xdf\xa0\x07\x0c\xa2\x68\x00\x01\xa9\x1d\x83\x2e\x18\x03\xf0\xb9\xc3\x55\x90\x97\x07\x3f\x06\x65\x1e\x54\x20\x50\x94\x60\xfc\xbf\x83\x55\x5e\x7d\xca\x81\x72\x51\xeb\xc7\x1e\xc5\x44\x2a\xa8\x4b\x0a\x64\xe8\xb5\x7c\x1e\x08\x6d\x4b\x77\x52\xab\x58\x47\xb8\xec\xd1\xab\x7f\xfd\xb1\x7e\x39\xf3\x30\x07\xc6\x78\xea\x27\x51\x50\xd2\xa4\xe8\x7a\x30\x24\x44\x26\x6e\xa8\x08\xee\xb8\x9e\xa0\x40\x89\x1b\x94\x57\xcf\xfd\x7a\x29\x30\x61\x12\xe1\xd9\x0c\x11\xec\xe2\x3f\x40\x0f\xa0\xcf\x20\xb4\x68\x2b\xe2\x83\x75\x22\xba\x16\x75\x5c\xaf\x17\x99\x6d\x3c\x1d\x1b\x27\xf5\x21\x4f\x45\x61\x6d\x36\x7e\x15\xee\x6e\xa2\x9c\x2f\x02\x98\x97\x5f\xac\x95\x58\xed\xe8\x10\x7b\x18\x2b\x39\x68\xe0\x39\x8c\x84\x7b\x64\xdb\x06\x0c\x73\x62\x7e\x28\xbd\x1e\x80\x95\x9e\xa5\x8d\x45\x7f\x90\x89\x14\xe9\xb5\x1c\x68\x55\x53\x03\x81\x86\xd7\x09\x48\xeb\x30\x80\xbf\x60\x94\x57\xfa\x22\x39\xdd\x3e\x19\x01\x70\x56\xf1\x15\x23\xd2\xab\x0c\xeb\x8b\xc3\xa3\x3c\x77\x7c\x83\x47\x3b\xdf\xfd\x9e\x97\x5a\x8b\x93\x0c\xb0\xa1\x70\xd5\xfe\xe8\x91\xee\x02\xe9\xa5\x3b\x6b\x1d\x52\xe5\xb9\x88\x65\x40\x35\x93\x9c\x33\x0a\xbe\x73\xfc\xcd\xea\xb1\xd3\x61\x5e\x2e\x9d\x78\x58\x7e\xfb\x66\x25\x54\x82\x1a\x24\x2a\x81\x31\x21\x95\x90\xbe\x70\x23\xde\x90\x1d\xbc\x75\x2a\x4f\xb5\xeb\xfa\x4b\xdb\xf5\x72\x4a\x08\x25\x60\x85\x16\x11\xd7\x1a\xa0\x5c\x00\x86\xc9\x6b\xaf\xdc\xf3\xd1\xbe\x81\xe6\x49\xd4\x57\xc7\xd7\x5a\xf9\x7a\xe4\x24\x67\x17\x3a\x9b\x74\xa1\x1b\xe6\x8e\xeb\xa9\x58\x48\x60\x70\xdc\xb5\x15\x64\x45\x2c\xe0\x92\xb1\x17\x3b\x5e\x5a\x9f\xc6\xb9\x1f\x61\x5d\xaa\xef\xf2\xba\x1b\xf3\x7b\x5f\x14\x3f\xfb\x50\x51\xf4\x23\x94\x46\x81\xb8\xa1\xd4\x80\x5a\xf3\xa5\xdb\x8d\x71\x3d\x81\x80\xba\xcc\x15\x0e\xd3\xcc\x2d\xe5\x8d\x46\xc9\x05\x11\x70\x89\x87\x8c\x08\x06\xbe\x71\x2a\x4c\x84\xd7\x2e\xb7\x5b\x95\xa6\xab\x64\xc8\xa5\x47\x63\x9a\x40\x6d\xb8\xd0\x1c\xb5\xb4\xa3\x74\xe8\xef\x08\x11\x4a\xaa\x39\x23\x82\x08\x2e\xc0\x57\x92\x31\xfa\xec\xf7\x3a\xce\xa3\xdf\xe6\x54\xa3\x26\x3e\xbf\xd8\x8b\x48\xec\xa6\xfe\x30\x09\x28\xa5\x94\x03\x08\xdd\xee\x96\x02\x62\x2b\x0d\xd6\xce\x3e\x37\xfb\x0c\x7c\x0e\x7f\x0a\xbd\x12\x08\x42\x49\x36\xca\xf2\x17\x84\x98\x83\x46\x8b\x54\xec\x83\x2d\x2e\x66\xd7\x95\xd3\x26\x45\xc1\xaf\xe8\x20\x6a\xe2\x42\xcf\x2f\x74\xf5\x5e\xb7\xdf\xeb\xaf\xe2\x03\xed\x70\x3a\xda\x1e\x5e\xb3\x56\x6b\xaa\x22\x31\x34\x78\x0e\xa9\xd6\x61\xd0\xb5\xfc\xad\xcb\x57\x71\xdf\x16\x01\x4e\xc0\xd8\x76\x97\x0c\xed\x91\x73\x5c\xdc\x1d\xf4\x8a\xe2\xa5\xe0\x1b\xd0\x5b\x87\xee\x60\x1d\xb6\xcd\xa5\x0a\xf3\xbd\x86\xd1\x0e\xba\xd5\x84\xd5\x28\x7d\x10\xdd\x41\x7f\x03\xd6\x59\x41\x36\x27\x63\x5b\x65\xb0\xc2\xc9\xc1\x73\xa6\x84\x34\x4a\x82\xd7\xef\xf0\x1a\xa1\x13\xca\xd8\xdd\x7a\x9d\x8c\x9d\x48\x78\x90\x2c\x64\xba\xbb\xae\x35\x8f\x65\xb9\xe4\xef\x1e\xdb\x8c\x05\xf1\x92\xd8\x01\xea\x03\x26\x5a\x2e\xde\xbf\x7c\x4b\x75\xd4\x77\x49\x23\x06\x60\x44\x79\x8a\x53\x42\x89\x8b\xb1\xc4\x98\x62\x2e\xd2\x50\x65\x4e\x0a\x49\xf5\xb1\xa7\x6e\xd9\xba\x83\xf9\x37\xf4\x74\x94\x30\x87\x86\xcd\x04\x24\xf5\x4a\x6d\x6d\x40\x3c\xe5\x2c\x30\xd3\x02\xae\x36\xa1\x26\x66\x41\x82\xef\xe9\x30\x02\x32\xab\xea\xe3\x09\x09\xfd\xa8\xa4\x80\x70\xcd\x8c\xb9\x72\x10\x54\x71\x61\xa2\x92\xf0\xd2\xf1\xda\xe6\xbf\x39\xb9\xdf\xad\x42\xcb\x09\x06\xc2\x3f\x72\xb2\x7d\xdf\xc6\xb3\x43\x66\x38\x14\x26\x80\x7d\x13\x7f\x89\xef\x0a\xd5\x2f\x85\x92\x13\xc2\x89\xa7\x09\x46\x20\xc2\xb2\xb7\x1f\x16\x75\x69\x59\x7e\xe4\x1e\x6e\x6b\x75\x1e\x61\x4c\x52\x2c\x77\x16\x3a\x97\xaa\x6e\x12\x89\xc6\x4a\xf7\x58\x9e\x0a\x49\x09\x01\x19\xef\x31\xcc\xf2\xbc\xe9\x8c\xf3\x64\xf1\x6d\x17\xc2\x05\x07\x0a\x3c\xe6\x2b\xdb\xc2\x65\xe2\xa8\x57\x3d\xba\xd3\x58\x5e\x13\x3b\xc7\xaf\x7e\xdc\x0f\xd6\xc6\x11\xf3\x03\x11\x8e\x77\x16\xa9\x15\xbc\x88\xd9\xa5\xc2\x15\x26\xc0\x59\xea\x32\x03\xd3\x09\xc3\xa7\xcf\x69\x73\xbc\xb3\x22\xa7\xda\xf1\x0c\xa8\x01\xcf\x04\x76\xc2\xb9\xa6\x82\x0a\x95\x96\x4f\xb5\x7a\xba\x56\x9b\x2c\x9d\xbf\x30\xf0\x65\x6f\xe9\xb6\x0f\x6d\xe4\x35\xb8\x20\xa4\xcf\x13\x95\xb1\x0a\xe0\xe3\xb9\xa7\x39\xa3\x4a\x03\x18\xc4\x6d\x48\x0b\x0d\x32\x69\xfb\xb4\xfe\xaf\xd9\xaf\x63\x89\xbf\x84\x32\xf4\x6e\xf4\x3c\xfa\x2c\xd4\x10\x62\xf3\x54\x5c\x14\x7b\x46\xc3\xe9\x2e\x1e\x6e\x0f\x4c\x26\xb6\x11\xb1\x57\x28\x64\xfb\x30\x9e\xee\x93\xeb\x95\x1f\xe3\x0d\x85\xe1\xf8\xb8\xc4\xad\x9a\x3f\x87\xd9\xa3\xc2\x1d\xe6\x70\xc0\xf8\x81\xd5\xf1\x0f\x74\xba\x3c\xcd\x8b\xda\xf7\x60\x15\x1f\x5c\xc5\x64\xfa\x7d\x3c\xb0\x6a\x45\x80\xb3\x91\x71\xb3\xc4\x5c\xc5\x10\x8f\x00\x78\x03\x78\x03\xa7\x87\xc0\xa1\x7b\x5d\xd1\x7f\xbc\x0f\x93\x7d\x6a\xfd\xa3\x08\xd2\x78\x94\xed\xd2\x61\x36\xb2\xea\xbc\x68\xe0\x00\x17\x15\xb7\xe1\xf6\xa4\x3f\xb1\x4f\x24\x8a\x8b\x6e\x40\x7f\x6c\x60\xc6\xf6\x74\x62\x8f\x84\x37\x27\xa1\x62\x04\x4b\xd7\xf6\xf5\xf9\x4e\x8f\x50\x4e\xf0\x8b\x2a\xee\x2d\xe5\x8b\x4b\x26\x56\x53\xac\x8b\x3a\x26\xc8\xd2\xc2\xad\x0f\xab\x6e\x3d\x65\x82\x28\x20\x84\xc7\x91\xcf\x2d\xd9\x22\x54\x07\x45\xc7\x8b\xa0\x5e\xa9\x11\xe5\x66\x0e\xa5\x2f\x3d\xd6\x56\x55\x8f\xd9\x32\x70\x50\xb6\x1d\x40\xc4\xab\x4a\x00\x2f\x20\x3d\x27\xf6\x4a\xca\x0b\x04\x60\xea\x24\x86\x72\x56\x86\x9b\x94\x12\xa7\x4d\xb7\x6a\x86\xd9\xc5\x8e\xa1\x79\x45\xf3\x44\x59\x40\xb0\x81\x83\xc8\x89\x1d\xc9\x1c\x46\xe7\x1f\x6f\x5e\x88\x48\x78\x53\x5a\x59\x14\x0f\xde\xbe\xe0\x27\x83\x8b\xfb\xa3\xbe\x83\x29\x60\xcc\x0b\x7a\xa8\x2a\x71\x47\xb5\x1d\x0a\xc0\x79\xc0\x9d\xa4\xe9\x69\x0a\x40\x42\xc7\x76\xc4\x10\x4c\xc0\x5d\x5e\xc8\x02\x2d\xf8\xd2\x4e\xaa\x08\x15\x00\xcf\xcf\xc1\x01\x55\x54\x98\x27\x22\xfe\xc2\xf1\xb7\xbc\xd3\x9d\xac\x96\x19\xd6\x0c\x30\x66\x2e\x21\xa1\xd0\x7e\xa6\x2b\x09\x3e\xf1\x1b\x3b\x4c\x4a\x22\x0c\xc7\xf3\x93\x01\x30\x4e\x4b\x8e\xb0\x1d\x2f\x98\x49\xb7\xd4\x1b\xbb\xdc\x20\x09\x2a\x59\xaa\x4d\xde\xa0\x6e\x9c\x2b\x00\x91\xee\x7c\x28\x7d\xea\x5c\xba\x71\xcb\x45\x6e\xc6\x96\x43\x3d\x97\xca\xc1\x81\x4a\x3e\xfa\x54\xd9\xb5\xbb\x9a\xb0\x12\x79\xd4\xb6\xe5\x80\x85\x4e\x4a\xaa\x39\xb8\xc9\x6e\x7c\x7a\x4d\xca\xb7\x64\x83\xa3\xfa\x6d\x6f\x3d\x56\x31\xee\xc2\x2c\x64\x06\x26\x23\xdb\x72\x23\x68\xcc\x19\x40\xe0\xc6\x54\xa9\xfd\xff\xbc\x87\x93\xdc\x11\xdc\x70\x6a\x86\x6c\x2f\xea\x5f\xcc\x3e\x0b\x7f\x82\x7f\x11\x9d\x43\x8f\xa1\xab\x08\x6d\x5b\x73\xce\x9b\x70\x10\x74\xd7\xf1\x06\x58\xee\xc8\x0f\x51\x84\xb1\x44\x63\x37\x2d\xc8\x76\xf1\x30\x3f\x40\xa9\xbe\x95\xcc\x36\xa0\x0f\x56\xe3\x28\xe8\x33\xef\x95\x78\x70\x5d\x0f\xe3\xdc\x73\xa0\x6f\x43\xbd\x0d\xf6\x96\x5b\x5c\xdb\x46\x4d\x30\xe0\xda\x98\x7f\xc9\x24\x9f\x6b\x32\x9f\xf5\xc8\x5e\xd1\x1e\xd8\x9b\x43\x0e\xeb\x29\xf4\xd0\x1d\x0f\x6b\x65\x23\x13\xe0\x47\x45\xe5\x78\x5e\x20\x98\x5a\x77\x3e\x44\x3d\xfd\xc1\xa4\x37\xea\x1d\x65\x03\x8d\x99\x5f\x4f\x1b\x2f\x7b\xf2\x8e\x70\xa5\x5c\x7b\x04\x27\x2c\x24\x5a\x50\xc5\xd8\xa4\x6f\x99\x38\x13\x4a\x2b\x4d\x19\xb6\x62\xb6\x50\x9e\xc6\xde\xf4\x7f\x5a\x68\x0a\xb9\xf1\xe2\xfb\x56\x36\x45\x52\x0f\xe1\x19\xce\x01\x3f\xb5\x74\x66\x50\xf2\xb0\x09\xcb\x84\x30\x49\x85\x1b\x2f\x6c\x6e\x2d\x26\x5e\x2c\xe1\xea\x67\x08\x56\x3a\x70\x3c\xa1\x1d\xe2\x40\xe2\x11\xdb\xda\xc6\x0c\xe0\xac\x2c\x9d\x5d\xfb\xce\x90\x03\x48\xc6\x62\x63\xb2\xb8\x14\x04\x82\x5b\xb3\x97\x6e\xdc\xdb\x5c\xef\x45\x9a\x12\x22\x28\x86\x95\x63\x32\x8c\xbd\x44\xa5\xf8\xd4\xd2\x52\x50\xdf\x28\x3d\xfa\xe6\x37\x0c\xca\xcd\x40\x28\xcf\xa9\xfa\xa5\x56\x00\x32\xd7\x82\x61\x86\x71\xb3\xdd\xda\xba\x43\xf1\x4a\xf5\xa1\x05\x0c\x10\x08\xad\x84\x01\xb9\x80\x7f\x8d\xcb\xb4\xb1\x53\xee\x56\xd3\xdd\x95\x57\x3e\xf8\x44\x83\x17\xd5\x20\x3d\x21\x58\x60\xcd\x05\x00\x17\x31\x4b\xdd\x35\x9f\x01\xad\xfa\xe3\xf2\xfe\x68\x65\xe3\xca\xd0\x5f\xde\xd8\x64\x92\xc0\xbb\x58\xc7\xa5\x84\x82\x6d\x67\x91\x7e\x9f\xda\x8e\x2a\xdb\x57\x68\x4c\x1b\xae\xfe\x1c\x60\x21\xe3\xea\x8e\xbf\x21\x5f\x7d\x21\x50\x9c\x08\x2a\xa8\xd5\x03\x80\x32\xa0\xb1\x6c\x83\xac\x11\x50\xbc\xa9\x85\x34\x03\x3d\x6f\x07\x36\xa0\xdc\x2d\xb7\x5d\x77\xc3\x01\xdb\x12\xc7\x21\x5e\x3b\x72\xe2\xa9\x7f\xb5\x7d\x43\xb9\xbd\x56\xdf\xef\x94\x17\xe2\x90\x49\x06\x24\x74\x3d\xc6\x69\xa5\xd1\x62\xe2\xee\xad\xee\x91\x23\xe1\x02\x04\x1d\x4f\x30\x2a\x30\x2d\x78\xf0\xd7\x67\x7f\x0f\xbf\x83\x3f\x85\xa6\xe8\x75\xe8\x7b\xd1\x47\x10\x82\x83\x8e\xa1\xb9\x0d\x1c\x34\x41\x1d\x74\x54\x4d\xd6\xe1\x05\xcd\x42\x85\xa5\x0e\xd9\x3e\xec\xc1\x68\xda\xc4\x36\x82\xf3\xa2\x99\x61\xd0\x2f\x50\x49\x7e\x1d\x86\x30\x1c\xaf\x67\x08\x57\x77\x60\x22\xbf\x6d\xd3\x36\xec\x7a\x2e\x43\xfa\xe6\x22\x29\xb7\x7d\xf1\x96\x88\xf5\xaf\x15\x5f\xa7\xdb\x53\xab\x30\xc3\x0f\x13\x95\x97\x2a\x99\x8a\xb7\xd3\x95\xc5\xc5\x5a\x25\x15\xaa\xd7\xdd\x5a\x7d\x60\xb0\xb4\xa4\x80\x7b\xb5\x3b\xb6\x4b\x9d\x54\xfb\xbe\x27\xab\x8b\x9d\xed\x53\xc3\x09\x1f\x70\x76\xf5\xf3\x2a\x13\x83\x64\x70\x76\xb8\xe8\xb9\x1a\x3b\xe3\xd1\xe6\x33\xd3\xe3\xb7\x3b\x32\xab\x36\x5e\xbc\x53\xef\x75\xab\x51\xbd\x96\xd7\x9c\x30\xf3\xcb\x9c\x82\x08\x13\x46\x30\xe3\xca\x6b\x54\xd6\x37\x1b\xf9\x79\x3f\x5a\x5e\xc9\x99\xe7\x4d\x16\xf2\xc4\x8b\x3d\x4d\xeb\xf2\x96\x72\xc4\xb9\x23\xb1\x50\x7e\xd2\x52\x92\x08\x4a\x19\xfc\x77\x26\xf2\x76\xa3\x92\x51\x49\x99\x3b\x1a\xde\x74\xee\x5d\xab\x47\xb7\xb6\xb2\x58\xe6\xe5\xcb\x5b\xc2\x2d\xc3\x89\x8b\x00\x4b\x65\x2e\x19\x0d\xd6\xef\xb8\x61\xb2\x1f\x45\x0f\x03\xbc\xcf\x29\xab\x32\xd4\x36\xa7\xed\x2c\xf1\x4e\x3e\xda\x6a\xa8\xbc\xfa\x9a\xd3\xa3\xf7\x5f\xbc\xed\x75\x81\x24\xc4\x11\xf5\x5a\x7b\xa1\xb1\x5a\x0e\x6d\xe5\xd1\x64\x06\x75\xaf\x92\x6b\x1b\x27\x47\x4f\x86\x3c\x5c\x4c\x6e\xa8\x75\x8e\x60\x08\x95\xe7\xa9\xf6\x4a\xb2\x5a\x17\x39\x48\xe9\x94\x9a\x81\x13\x01\x54\xf3\x6a\xcf\x38\x05\xc2\xb3\xab\xb3\xaf\xc0\x0c\xff\x1c\x3a\x8d\x7e\x18\xa1\x79\xbd\xbe\x3b\x30\x79\x78\x34\x9d\x27\x6c\x31\x6f\xeb\x98\x6f\x25\x3b\xbf\xd9\xa1\x32\xbb\x7d\xd0\xee\x31\x3a\x01\x63\x43\xb6\x8a\x65\x11\xe2\x80\x20\xed\x91\xc9\x74\xde\x24\x32\x1a\x5e\x3f\xf3\x82\x37\x48\x5a\x98\xce\xea\x35\x9e\x64\xbf\xd8\xc0\xeb\x70\x7d\x8b\x9e\xb9\x02\xfc\x5e\x58\x5f\xbf\xf7\xc3\x7b\x9c\x62\x0e\xd8\x4b\xce\xbd\x74\x18\x3b\xa2\xc2\x68\x49\x94\xcb\xe4\x4c\x47\xd5\x7d\x61\xf2\x92\x60\x0a\x2b\x0c\xb1\x4d\x3f\x14\xab\xbd\x1b\x2e\xb5\x2a\x52\xe8\x5f\xa4\xda\xa7\xfc\x9e\xf3\x49\xaa\x05\xa5\x44\x30\x4f\x9b\x2c\xc1\x29\xb8\xca\x15\x42\xdf\xf8\xfe\x17\x8d\x5b\x91\x16\x1e\x2b\x5a\x50\x01\xa8\x93\x4a\xa0\x59\x89\x9c\x3b\xb3\x2b\x41\x6a\xb7\xec\x85\x92\x63\x49\xb4\x6c\x72\x42\x30\xe5\x41\x53\x77\xce\x35\xf1\xab\x08\xa6\x4c\xe2\xb5\x2e\xa5\x98\x2b\x03\x07\x75\x39\x92\xa4\xd9\x62\x8f\x5d\x48\x5f\xb6\xd1\x88\xb4\x95\x98\x0d\x12\xc4\x98\xea\xde\x96\x77\xe6\x0d\xef\x3c\x1e\xfb\x18\x7b\x7d\x7e\x19\x40\xf2\x79\x62\x0a\x73\x6a\x60\x67\x77\xaa\x7c\x00\x25\x05\xb5\xd8\x92\x29\x3f\xa5\x14\x43\xb7\xa4\x30\x05\x4e\x1d\x00\xd7\x25\x93\xef\x7c\x66\x57\x5e\x29\xd5\x29\x16\x56\x60\x20\xd4\x4b\x55\xe8\xc6\xb5\xd1\x63\xe9\xc5\x57\x2c\x21\x3e\xfb\xb3\xd9\xc7\xb0\xc6\xbf\x8e\x12\x34\x40\xb7\xa0\x87\xd1\x4f\xa1\x5f\xb3\xea\x66\x7a\xa0\x46\xf5\x07\x36\x4d\x6d\x1f\xe8\x56\xdc\xc0\xfc\x22\x2f\xb1\xc3\x7e\x07\x4b\x61\x9a\xf3\x09\x3a\x60\x37\x83\x75\xc3\x95\xa7\xc9\xbc\xe3\xcf\xcc\xee\x68\x58\x2c\xa7\x10\x3c\xb9\xae\xb5\x23\xdb\x35\x69\xe9\x80\x15\xf9\xd0\x9d\xb7\xa9\x1f\xb6\x72\x58\x54\x37\x0f\x1e\xf3\x4e\x7c\x1b\x2a\x38\x39\x30\xbb\xb9\xa8\xd9\x1d\xf4\x45\xf6\xd7\x75\xf0\xb4\x23\x53\xe1\xfb\x58\x02\xa1\xd8\x65\xc7\x04\x0f\xc1\xd1\xfd\x7c\xa1\x52\x3a\x7e\xcc\x0c\xdc\xd5\x7f\x88\x54\x46\x40\x35\x3e\xf6\x6a\x21\x27\xf7\x56\x22\x27\xad\x66\x9e\x74\xf2\xbb\x29\x76\x6b\x8f\xbf\xf4\x96\x73\x4f\x1f\x25\xa4\x52\xfa\x4d\x4a\x55\x44\xeb\x4a\x54\xea\x47\x18\x55\x8e\x43\x37\x23\x6f\x65\xe1\xd4\xc3\xdf\x57\x51\x66\x52\x22\x5d\x06\x22\x18\xd5\x9a\x28\x00\x8e\xa9\xce\xdd\x10\xfc\x6a\x8c\xc9\x33\x77\x9d\xbe\xf3\x9e\x54\x63\x72\x2a\xaf\xd9\x9a\x8b\x4b\x09\x77\xca\x7e\xd5\x51\x49\x83\x95\x92\x33\x7d\x71\x2f\xa3\xcc\x56\xc6\x59\xe0\xd7\x9a\x52\x66\x50\xf2\x94\xc4\x5b\x71\x27\x8f\x3c\x80\x38\x68\x07\xb6\x17\x10\x18\xc9\x19\x4f\x8e\x26\x79\x0f\x93\x76\xa3\xbf\xb2\xc7\x8c\x45\x7e\x45\xea\x7c\x35\x5d\x78\xf5\xd3\x01\x05\x7e\x6a\xa3\x7d\xf6\xc6\x56\x4d\x73\xee\x4e\x9f\x3d\xd6\xbd\x69\x7d\xc5\xd1\x0f\x7c\xe7\x99\x0b\x9d\xea\xd5\x3f\xa5\x98\x08\x79\x7e\xb2\x18\x97\x18\x60\x46\x7a\x47\xd7\x9a\x55\xfc\xb2\xe8\xfe\x87\x3a\x61\x59\x31\x4e\x98\xc1\x6a\xd2\x51\x1c\x63\x93\xa2\xba\xd9\xce\x3d\x3f\xe8\xaa\x85\xc1\x4e\x63\x74\x65\x29\xe0\x80\xa9\xeb\xe8\x10\x83\xa3\x44\xd6\xbb\xab\xd7\x1b\x09\x7a\xb5\x4b\x09\x31\x49\xc9\x3f\xc2\x79\x52\x6a\x56\x23\x02\x10\x99\xfc\x80\x16\x67\x9f\x82\x3f\xc7\xff\x0e\x95\xd0\x12\xba\x0f\xbd\x1f\x21\x28\xa4\x8a\x03\xe1\x64\xee\xc5\x76\x26\x0b\xb1\xe4\xa0\x91\xe7\xa0\x5e\x74\xa0\xb1\xe4\xa3\x61\x76\x5d\xb7\x8d\x95\x5b\x0f\x5b\x72\xb3\xe2\x98\x64\xae\x97\xc2\x01\xed\x9d\xec\x41\x21\xc7\xe5\x0d\x48\xaf\x6f\x53\x1d\xf4\x45\xb7\x27\x32\x8b\x7b\x8a\x2a\x14\xb4\x97\x7b\x5b\x65\x0f\x1a\x8d\xc1\x9d\x9d\x4e\x8b\xd3\x9e\x8a\x7c\xe6\xf8\x6e\x8e\x59\x56\x8a\x9a\x8d\x66\x23\x0c\xfd\x7a\x77\x93\xd3\xd6\xc2\xe9\x8d\xf5\xbc\x04\x90\x2f\x7f\xd7\xf9\xad\x5b\x52\xae\x3c\x60\xbd\xf1\xe3\xc3\xd5\x95\x5e\x27\x49\x00\xb0\x10\x01\x71\x97\x72\x1e\x29\x15\x74\x96\x3e\xc0\x2f\x8d\x47\x8f\x2d\x24\x10\x25\x17\x46\xfd\x8e\x12\x00\x84\x3a\xa1\x47\x0d\xb7\xf5\x56\x77\x47\xed\x72\x18\x60\xee\x62\x4c\xa0\x59\xd9\x39\xfd\xe2\x8d\xb2\xa6\x70\x3c\x92\xce\xb0\x71\xf6\x4c\xa9\x21\xb3\xd2\xe5\xad\x7a\x47\x79\x2e\x75\x2e\xe8\xcc\xeb\x4f\x7d\x0f\x93\xac\x74\xb9\xd9\xe2\xa2\x43\x3f\x19\xc3\xe2\xe2\xf1\xe9\xfe\xde\xd6\xbd\x37\xa5\xc1\xad\xc7\x3d\xfd\xd1\xb7\xfd\xe6\x34\xe7\xbc\x51\x5b\x59\x5e\x33\xb8\x3e\x72\x5c\x06\x44\x36\x64\x3f\x65\xc2\x0b\xe0\xf8\x1d\x4f\x06\xc1\xee\xcd\xcb\x8f\x6f\x6c\x1d\x05\xe8\x48\x07\x80\x81\x62\x3e\xa5\x2e\x67\x84\x2a\xb7\xdb\x7a\x24\x4f\x42\xa7\xd7\x21\x92\x80\xc3\xba\xa7\x4a\xeb\xdd\x23\x3f\x77\xff\x93\xcc\xcc\xe9\xc9\xd9\x5f\xa0\xff\x13\xbe\x89\x62\x34\x41\x37\xa0\x6f\x43\x68\xdb\x60\xd0\x42\xbb\x32\xc8\xf3\x9f\x2d\xd8\xe0\x83\x1e\xef\xce\x87\xfd\x60\x6d\xcc\x9e\xa1\x5f\x27\xa0\xa8\xc3\xf1\x00\xe6\xf3\x37\x98\xe6\x4d\x62\x0e\x6a\xc0\x75\x33\x65\x8e\x98\x8c\xa7\xa3\xe1\x47\x89\xf0\xb4\xc7\x28\xa5\x40\x64\xee\x72\x45\xe9\x8e\xef\xc4\x4e\x89\x6b\x2e\xcb\x5e\x5a\x36\xce\x11\x3b\xd6\x8b\xa8\xa2\xd8\x15\xf4\x2c\xd1\xec\x08\x58\xc6\xc0\x4d\x46\xe7\xc7\x85\x22\xb9\x1b\xf2\x3a\x03\xec\xa8\x38\x8c\x52\x3f\xe5\x14\x03\x95\x5a\xd0\x8b\x86\x33\x41\x9c\x86\xda\x4a\x4a\xe5\xec\x88\x39\x90\xfa\x79\x6f\xd9\x31\xcc\x01\x0b\xc7\xb0\x7d\xc6\xa4\x97\xad\x05\xdc\xc4\xfd\x4d\x2a\xeb\x82\x68\x6e\xf0\x3e\xb6\x5e\x00\xf7\x70\x0c\x94\x70\x1a\x6f\x02\x95\x81\xe0\x45\x67\x6e\xa8\x02\xe9\xd5\x99\xd0\x86\x27\xa3\x78\xf6\x04\xfa\x75\xb8\x8a\x32\x54\x41\x67\xd0\xbd\xe8\xfb\x10\x4a\x8a\x75\x30\xbe\xed\xa1\x31\x06\x3c\xb2\x0f\x6e\xdb\x6c\x46\x99\x41\x47\x07\xa5\x4e\xbb\x66\xa7\x34\xaf\xea\x58\x4d\x71\x0f\x4f\xf6\x60\x94\x25\xc5\x92\xc3\x00\xdb\xd4\x39\x1a\x6e\x4f\x27\x66\xf4\x06\x87\x52\x76\xa1\x31\xce\x8b\xb4\x76\x4d\x54\xb1\xf2\xa8\x58\x38\x63\x28\x42\x21\xdc\x8c\xb2\x0f\x63\x52\x06\x97\x80\x04\xc2\x55\xae\x6c\xd9\x13\x80\x0c\x99\x8b\xb9\xa2\x89\x67\x3b\xa3\xcc\x47\x40\x65\xec\x36\xbd\x90\x4b\x4c\x31\x25\xe0\x08\xb7\x09\xdc\xd5\x9e\x8c\x63\xac\x28\x04\x5a\xb8\x98\x81\xc0\x4e\xd7\x77\x22\x27\x2a\x3a\x52\x40\x68\x0e\xa0\x74\x57\xba\x3e\x60\xc5\x12\x6d\xa7\x28\x4a\x04\xe1\xe0\x08\x07\xfe\xc4\x40\x53\x97\x37\xc1\x15\x96\x3a\x52\xd7\x0f\x34\x50\x92\x39\x56\xd9\xe5\x0e\x13\x6e\xe4\xfb\x9c\x60\x8c\xb9\xc4\x40\x29\x53\x2a\xd2\x01\x8f\x35\xe5\x0a\x5f\x5d\x04\x33\x19\xdd\xe3\x3b\x86\xcf\x51\x77\x61\xad\x44\x93\x91\xe1\xd1\xca\x67\x16\x53\x13\x37\xc2\x7e\x7f\x2d\xc9\x6c\x2a\x05\x97\x30\xbb\x78\x80\xb0\x68\xe7\x78\x9b\x32\xc9\x84\xc4\x05\x77\xfb\xea\xec\xe7\x70\x05\x03\x22\xe8\x12\x7a\x1e\xa1\xed\xb1\x18\x32\xdb\xa0\x68\xa2\x4d\xf7\x3a\xd8\xb1\x4f\xa7\x87\xe8\x66\xff\x20\xb6\x75\xe7\xbf\x0f\x56\x65\x91\xac\x65\xeb\x9a\x83\x45\x2b\x23\x0f\x0f\xa2\x57\xe9\x20\xe5\x5d\xeb\x85\xd9\xa0\xd7\x88\xd6\x1e\x5c\xcf\xde\xae\x5f\x28\x6a\xf7\x0f\x88\x01\x76\xff\x80\x63\x9a\x2e\x6d\xfe\xe2\x11\x4c\x39\x89\x24\xe7\x56\x2e\x90\x0b\x57\x36\x8e\x95\x2b\x6c\xd1\xe3\xc2\xb6\xa7\x7c\xc7\x53\xd3\x0b\xe7\x59\x62\x5b\xa1\xad\x7a\xa3\xa3\x11\x5b\xdd\x78\xfc\x9e\xb3\xd5\xb0\x98\x9e\xab\x1f\xd9\xfa\xc4\x91\xc5\x00\xfc\xd8\x99\x97\x04\xe7\x3f\x58\x30\x41\x18\x77\xa2\xda\xb9\x7b\x1e\xbb\x42\x36\x13\x37\x96\xca\xd6\xbc\xb5\x4a\x43\x38\x7f\x66\xef\x91\xf7\x86\xdc\x23\x4c\x00\x68\xc9\xb9\xf0\x55\xd0\xc3\x9b\x3b\x9b\xf7\xfc\x1f\x04\x7f\x90\x80\x1f\x3e\x10\x58\xa8\x64\x3b\xb8\x30\x66\xf1\x6a\x5e\x77\x34\x96\x06\xf0\xb8\x3a\x6e\x9e\x39\x96\xb7\x72\x0c\x40\xdd\x0a\x23\x8c\x00\x65\x3e\x29\xd5\x76\x87\x8b\x9e\x80\x24\xaf\x86\x3f\x1b\xdd\x17\x78\x18\x0b\x22\x09\x15\x3a\xae\x95\x53\xc5\x09\xc3\x9c\x14\x0b\x52\xfc\x85\xd1\xee\x06\xf8\x8c\x49\xc7\x0d\x18\x59\x73\x5d\x00\xc8\x1b\xb5\xc9\x25\x69\xf2\xae\x24\x04\x6f\xb5\x62\xa1\x18\x21\xb2\x54\xcf\x57\x11\x22\x28\x47\xaf\xc7\x15\xf8\x00\x1a\xa2\x3b\xd0\x4f\x21\x04\xc5\xf8\xa6\x56\x6d\x2a\xd0\xe5\x01\x25\xee\x8a\x2e\x9f\x77\x32\xe7\x59\x3e\xb2\x6a\xd4\x74\x34\x14\x07\x2a\xd3\xc0\xe2\x94\xe1\x74\x74\x0d\xba\x8e\xfb\x1b\xc0\x45\x77\x9d\x0c\xd6\xb1\xb1\x05\x03\x86\x4b\xf6\xcb\x51\x51\xdf\x6a\x99\x90\x78\x02\xc6\xd3\xa1\x2d\x82\x16\x68\x09\x56\xa1\x7f\xa8\x90\x1d\x46\xc1\x61\x13\x46\x4d\x3c\x6a\xc2\x68\x98\xa5\x1c\xbe\x4e\x94\x70\x8a\xf6\x11\xc0\xae\x1b\x71\x8a\xb1\x9b\x55\xf4\x6b\xbf\x53\x06\x50\xe2\xfd\x24\x8b\x62\x9d\x50\x8a\x1f\xae\x6e\x4e\x5b\x6f\x6c\x69\xdd\x7a\x63\x6b\x7b\xab\xfa\x30\x57\x98\x33\xaf\xcd\x4a\x10\xa9\xef\x7a\xad\xac\xe5\x1e\x0d\x31\x00\x3b\xde\x79\xae\xbc\xb6\x10\xb2\x7a\xd3\x4b\x0c\xb5\xc6\x40\x84\x5b\x5a\x3c\xb9\xfa\x46\x76\x34\xc3\x11\x00\xd6\xbe\x36\x06\xe5\xc4\x94\x03\x29\xed\xb0\x37\xae\x9e\xec\x67\xbe\x60\x92\xba\xd2\xcb\x83\xa6\xd7\x6b\x42\xb8\xb0\xea\xb9\x6f\xea\x08\xad\xe1\xbb\x25\x60\xc5\x0d\xee\x72\x94\xa7\x62\x5e\x74\x4a\x00\x68\xbb\xae\x57\x6c\x96\x5c\x0e\x58\x00\x66\x5d\x86\x41\x00\x61\x45\x53\xb4\x2d\x3e\x03\x63\x81\xa6\xea\x37\x14\x14\x6d\x81\xc0\x88\x72\xe6\x2d\x35\x40\x01\x03\xd7\x5d\xa1\xb5\x68\x53\x4f\x05\x42\xcd\x97\xfe\x14\x32\x69\xd6\x8e\x1d\x8c\x6d\x2b\x9a\xd4\xbe\x46\x64\xf6\x85\xd9\x2f\x61\x0f\x2b\x84\xd1\xad\xe8\xdf\x23\xb4\x98\x6e\x2f\x4e\x47\xf3\x26\xa4\x43\x8d\xfa\x00\x20\xcc\x81\xe4\x81\x77\xcd\x9b\xd3\x47\xd7\xb5\xf4\x6d\x80\x71\xce\x0d\xb0\x8d\x27\xec\x9a\xa3\x1b\xef\xbd\xae\xca\x73\x6d\xdb\xc7\xd3\xfd\x6b\x2b\x8a\xba\xf3\xd4\x36\x1e\x8c\xe7\xc5\x25\x8b\x62\x86\x87\x21\xe2\x90\xf5\xc0\xdf\xe3\xab\x49\x4c\xd3\xe5\x95\xbb\xef\xeb\x80\x4c\x1c\xc1\x08\x27\x42\x60\x4e\x74\xbe\xbc\x19\x6c\x1d\xad\xe6\xac\xef\x0a\x4e\x08\xa5\x98\xde\xfb\xd4\xe6\xfa\x85\xf3\x3c\xa5\x85\x6b\x13\x4a\x74\xb4\xd3\x19\x9c\xbd\x78\xf6\x4c\x35\xb4\xc9\x09\x9b\x81\xd2\x3a\x0d\xe1\xec\x85\xd3\x5f\xcb\x8c\xab\x4a\xbb\x10\x8d\x52\xce\x45\xa0\xfc\x1e\xce\x2b\x47\x37\xc3\xad\xad\x50\x93\xf2\xa3\xb7\xac\x2f\x04\xe0\x47\xf3\x28\x50\x68\xcf\x84\x33\x61\xdb\x11\xab\x2b\xd5\xb3\x17\x4f\x2f\x75\xb1\x0d\x03\x52\x7d\x91\xe0\x1f\x21\xd8\x0f\x8e\x6c\x06\xb6\xab\xc4\x4c\xa8\xe6\x14\xb8\x1b\xc6\x22\xaf\xb9\x0a\x84\xa1\x35\x8e\x13\xf3\xfc\xc8\x4e\x1e\x37\x33\x0c\xd4\xa9\x08\x42\x09\x30\x16\x47\x79\x7f\x6d\x79\xc1\x17\x18\xe2\x72\x25\xfa\x45\x52\xca\x3c\x07\xa0\xd4\xa8\xbf\x5e\x9b\x90\x23\x09\x66\x41\x85\xdb\x4b\x31\x82\x05\x48\xb7\x96\x89\xa4\xc4\x08\xd6\xd3\xe5\xd0\x33\xe9\x99\x4a\xcc\xb8\x8e\x6b\x95\x44\x71\xca\xb0\x5d\x75\x68\xa2\x42\x16\x2e\xad\x0e\xb2\x08\xfb\x9c\x4b\xed\x05\x56\xbb\x40\x47\x67\xdf\x80\x3f\xc5\x9f\x42\xc7\xd1\x2d\xe8\x71\xf4\xd3\x08\x25\x87\x15\x14\x13\x6d\xaf\x91\x90\x42\x59\x1e\x6e\xf7\x27\x36\x0a\xdb\xba\xdf\x74\x5e\x9d\x9f\x07\xec\x3c\x31\x1e\x3f\xdd\x9e\x8c\x2d\xb4\x14\xa9\x48\x07\xd3\x91\xe1\x42\x3e\x0c\x7a\xfd\xa2\x9b\x7d\x34\x1e\x14\xeb\xf5\x87\x84\xbf\x00\xde\x1e\xe4\x80\x83\x75\x63\xc2\x2e\x5c\x2e\xc4\x8c\xeb\x48\xed\x60\xbd\xa0\x5d\xd6\x30\x7b\x57\x08\x93\x3c\xc6\x98\xca\xf8\x7c\x7f\xe9\x8c\x5f\x3e\xb6\x78\x8c\x26\xda\x78\x92\x90\xd8\x4e\x3f\x67\x5a\x36\x93\x64\x14\xc4\x8c\x2a\xbd\xd6\xea\xdc\xd5\x3e\x59\x2e\x31\x8c\x9f\xc4\x0c\xe7\x15\xe2\x39\x22\x20\x14\x98\x24\x25\xa7\x5e\x0b\x37\x5a\x9c\x93\x88\x71\xcb\x8b\x31\x04\x72\x3b\xa3\x9a\x6b\x1e\x33\x4a\x78\xa5\x76\x69\xf5\xca\xd2\x72\xad\xee\x38\x4e\x96\x1e\x1b\x79\x8e\x81\xb1\x8e\x57\x73\x03\x2d\x31\x96\x3c\x8a\xf0\x74\x61\x23\xd4\x9b\xed\xd6\xb6\x57\xd4\x05\x7c\xf8\x6f\x80\x81\x85\xbc\xea\xd6\x3b\x18\xba\x0b\x47\xef\x3e\x3a\xa6\xae\x10\x49\x9e\x66\x1c\x83\xc7\x4a\x59\x14\x86\x5e\xc5\xd5\xf5\xac\xba\x34\x18\x2c\x1f\xd3\x0e\xc7\xa3\xc5\x5e\xd5\x61\x57\x6b\x40\x5c\x21\x98\x43\x30\x80\x2f\xf8\x71\xe3\xd9\x83\xb5\x94\x01\xf1\xdc\xd0\xe5\x11\xe5\x94\xfa\x18\xde\xc4\x6d\x3f\x5f\xec\x25\x9d\xc1\xca\x1e\xe1\x9e\xb7\xb0\xb8\xb1\xfa\x92\x76\xa3\x5d\x2f\xc5\xcd\xba\x09\x1c\xb1\x76\x40\x7b\xcd\x4a\xb5\xe9\x3a\x8e\xc6\x5b\xd3\x1b\x96\xcb\x65\x80\x6a\x2a\xe2\xd8\xa1\x3e\xa2\x68\x03\xf9\xf8\x39\xfc\x1d\x28\x45\xef\x42\xcf\x03\x46\x08\xae\xbd\x52\xe1\x70\xd5\x5f\x96\xbf\x50\xb9\x9a\x4c\xaf\x45\x8d\x06\x2e\x98\xc4\x9c\x28\xf7\x0f\x18\xed\x01\x4b\xdd\x85\x61\x76\x10\x68\xd2\xd2\xbc\xbb\xad\x58\x6a\x83\xaf\xf5\x3c\x5a\xc5\x8b\x5c\xd7\x40\x72\x5d\xa3\xf1\x75\xdc\x76\xfb\xda\xe9\xaf\x19\xcf\x75\x46\x69\x7b\x4a\x32\x4b\x82\xe6\x60\xc4\x9e\xe2\xf0\x32\x07\x9c\x69\x6e\xbc\x83\x62\xf9\xe2\x21\xc1\xe6\x82\xc3\xa3\x4d\xc6\x1b\xe5\xd6\x20\x72\x30\x76\xb2\x45\xc6\x89\xa4\xac\x42\x48\xc0\x07\x67\xcf\x02\x3e\xb2\x71\xe2\xfc\x44\x39\x19\xc6\x9a\xfa\x0e\xa6\x98\x73\x2f\x48\xa3\x06\xe5\xc2\xb9\xf7\xf6\xdb\xcf\xde\xb2\x1a\xa4\x97\x6f\x78\xca\xbd\x79\xec\x72\x82\x09\xa6\xbc\x58\x18\x62\xfb\xcc\x28\x86\xa2\xff\x9d\x78\x7d\x27\xa8\x6a\x72\xf1\x45\x77\x9d\x3d\x55\xaf\x07\x0b\xd5\xcb\x8f\xbd\xfe\xec\xda\xad\xa5\x5a\x96\x8d\x57\xba\xd3\x9e\x70\x20\xa4\x2e\xc1\xba\x1a\x29\x0c\x94\xa7\x95\x38\x84\xd3\xab\xdb\xc3\xa5\x65\x80\xe1\xb8\xc2\xaa\x9e\xab\x18\x93\x38\x5f\x6a\x0c\x56\x93\x34\x4f\x2e\x0c\x6e\x7b\xd7\xb7\x75\x3b\xfe\x70\x67\xef\xf9\xb3\x54\x57\x42\xa7\x6c\x17\xed\x61\x70\xc7\xb7\x7b\xaf\xbb\xf5\x4a\x1e\x6d\xdd\x75\xf9\xde\x2b\x8f\x7b\x52\xb1\x76\x92\x97\x1a\x25\xdf\xc4\x36\x46\x3d\x8f\x08\x00\x81\xa9\x0b\xef\x0d\xcb\x8d\x7a\x2e\x9d\xcc\xaf\xe6\xa5\x15\x5c\x14\x04\x7e\x8d\xb0\x44\x2c\xd4\x6b\x77\xdd\x78\xe3\xa5\x30\xbe\x01\x5c\x19\x96\xc2\x54\x66\xa1\xf4\x7a\xbe\xeb\x30\xce\x44\x12\xaf\x38\xe1\x91\x9b\x16\xbb\x81\xfb\xc4\xee\x8d\x0f\xaf\x2f\x0b\x28\xd9\xa5\xb6\x26\xab\x11\x26\xb8\xb6\xa0\x59\xab\xf9\x82\x70\x60\x2e\x65\x92\x40\x55\xa9\xe5\xa5\xd3\x67\xdf\x73\x76\x74\xdb\x94\x97\xc3\x9b\xd7\x76\xae\xdc\xd7\x6b\xe8\xa8\xc6\x32\xf2\x1e\xe2\x53\xcc\x58\x27\x8c\x02\x26\x98\x88\x03\xef\x45\xa7\x7c\xef\xf4\xe9\x93\x67\xd2\x34\x67\x3d\x8c\x15\x53\x21\x8e\x3d\x55\x6b\xdc\x76\xeb\xc6\xe0\xbc\xdf\x6c\xbf\xf8\xd4\xc9\xb7\xbd\xae\xbb\x18\xe5\x98\x48\x46\x25\xc5\x86\xa0\x50\xea\x67\x20\xd7\xc7\xaf\xba\xfb\xec\x6b\xfd\x70\x71\xf5\xde\x51\xd9\xdf\x48\x73\xe5\xc5\x5e\x49\x28\x7f\x10\xb9\x49\x49\xb8\x52\x70\x4a\x64\xa1\xed\x7e\x61\xf6\x35\xfc\x49\xfc\x09\xf4\x08\xfa\x1a\x54\x60\x05\x21\x58\xc5\xff\x62\xb1\xbf\xdd\x0a\xb2\x31\x9c\x63\xd4\x89\x6d\xbc\x11\x87\x4b\x78\x5e\x28\xe2\x0d\x6c\x6f\x31\x17\xfc\xa0\x4b\x62\x98\x5f\xb7\xc4\x76\x03\x43\x51\xcd\xeb\x1e\xd4\xe0\xc6\xdb\x07\xd0\xd7\xbe\x1d\xe0\xba\xa5\x3a\x07\x4e\x36\x1a\x8e\xfe\x45\x35\x9d\x0b\x1f\xf7\x0e\xf1\x93\x6d\x00\xfa\x97\xdb\xa8\xa8\x18\x16\x1d\xff\xa3\x17\xde\x65\x1f\x78\xaf\xbb\x61\xd5\x83\xa2\x57\x03\x9a\x10\x1c\x16\xb3\xe7\x0e\x6a\x18\x54\x77\xfb\x70\x08\xe6\xee\x07\xcf\x61\x42\x1a\x79\xa0\x04\x10\x42\x68\xfb\x4e\x41\x28\xbf\x71\x0c\xc2\xe4\x5f\x27\x55\xeb\xb4\xbc\xe0\x37\x42\xcd\xec\xc2\xcc\x16\xae\x69\xcd\xd4\x70\xed\x25\x25\xc7\x77\x82\x92\xa6\x82\xc9\xc8\x8b\x25\xd5\x36\x57\xd7\xf2\xf3\xe7\xda\xe3\x90\x10\x2a\x55\xee\x50\x49\xab\xa7\xf1\x6e\xcf\x45\x33\x67\xa3\x75\xf6\x42\xb9\xe4\x0a\xaa\x99\x35\x27\x6a\x58\x0d\x57\x31\x84\x4c\x69\x02\x94\xaa\xd4\xe5\x9c\x85\xb7\x77\xba\x82\x72\x4c\x09\x51\x9c\xd5\x02\x4e\x2d\xa9\x75\x98\xe6\x4e\xd4\xf4\x7b\x65\xba\xee\xe4\xbe\xc3\x5d\x42\x84\x00\xb9\x79\x81\x12\xea\xdc\xda\x36\xb7\xce\x53\x2f\xad\xb6\x02\x5f\xda\xaa\x82\xdb\x9b\x8a\xbd\x8a\x5d\x2d\x5b\x71\x72\xce\x38\xf3\x83\x90\x5d\x7d\x19\x63\x8a\xd9\x53\x06\x22\x28\x61\xdf\xe7\x98\x32\x4a\x08\x65\x5a\xe2\x88\x45\x40\xf6\x82\x4a\x95\x78\x67\x12\x5f\x53\x4a\x2b\x99\xd7\x04\xf0\x59\x04\xf8\xdd\x60\x20\x3e\x11\x49\xee\x5e\x7e\xab\xa3\x63\xf7\x47\xce\xf2\xb2\x72\x00\x93\x39\x92\x53\x82\x15\x68\xaf\x9a\x8f\xee\x6f\x54\x03\xca\x44\x94\xed\x37\xb3\x86\x57\x52\x02\x4c\xde\x2a\x16\xab\x63\xc6\x64\x20\x08\x67\xfd\x9f\x61\x9f\x7a\xb6\xff\xad\x57\xe1\x62\xa5\x28\xa7\x1c\x73\x26\x53\xc9\x88\xe1\x95\x00\x5c\xd0\x24\xad\x1f\x8b\x15\x21\xd8\x4b\xd2\x9b\x56\x02\x6a\xcb\xf6\xcc\xd5\xda\x55\x21\x27\x07\x20\x92\x10\x4c\x84\x13\x55\x2b\x4c\xd3\x53\x1f\xd2\x41\x10\xbd\xe9\x36\x73\x9f\x81\xe6\x94\x03\x48\x42\x29\x13\x83\xd7\x7c\x22\xfe\xb1\x45\x93\x67\x43\x99\x84\x9e\xe7\x4a\xe9\x51\xb8\x0b\x4b\xcd\x08\xe5\xde\x91\x7c\x65\x47\x70\xea\x0b\x6d\xc8\x33\x15\x7e\x42\xba\xce\x52\xbc\x46\x01\xff\xcf\x1b\xdd\x54\x72\x03\xdb\x75\xcb\xe9\xda\x5a\x0a\x9f\xfd\xd3\xec\x2f\xf1\x0f\xe0\x9f\x44\x19\xda\x46\xb7\xa3\xd7\xa0\x1f\x45\x5f\x2a\xf2\x90\x01\x16\xe3\x69\xd1\x57\x31\xb0\x8d\xf4\xf9\x60\x7a\x48\xe9\x4b\x73\x98\x70\x20\x81\x4f\xcc\xae\xd3\x24\xe5\x76\x09\xf6\x41\x66\x38\x70\x18\xbb\x7c\xc5\xea\x2f\xf3\x95\x72\xf3\x85\xd8\x07\xc7\x6e\x8f\xf7\xa0\x68\x3a\x99\x5e\x6b\x41\x1c\xf4\x45\x71\xb9\xf9\x0a\x76\xdb\x71\x77\x3d\x2a\xe1\x7d\x38\x80\xd3\x99\xed\xe6\x3d\xc4\x4e\x56\x91\x9b\x2f\x81\x99\xcc\xcf\xb9\x7d\xf0\x2c\xfd\x5e\xb7\x3f\xde\x9e\x8c\xa7\x40\x18\x77\xe5\xf4\x22\xc1\xe0\x6f\xf7\x77\x4d\xc4\xad\x08\xe7\xfc\x91\x0b\x29\x05\x4c\x5f\x7e\xc6\xf1\x15\xd7\x4e\x41\x57\xb1\x6a\x18\xfb\x10\xcb\x1b\xab\x9b\x7e\xdc\xc3\x12\x13\xe6\x0b\xbf\x72\xec\x56\xa9\x58\xc8\x97\x8e\x95\x03\xd9\x4a\x02\x21\x56\xcb\xa5\xfd\xf1\xce\x5e\x58\xb4\x36\xff\x3d\x05\x70\xc4\xe2\x86\x5f\x6b\x7a\xcb\xe9\xfe\xf3\xe7\x9e\x81\x34\xf1\x04\xe7\x86\xe2\xd4\x5e\xd6\x0a\x2f\xae\x34\xeb\x95\xdb\x56\x26\x0e\x27\xec\xb6\x7d\xe9\x5e\xbd\xe5\xb7\x8e\xfc\xd8\xf9\x7a\xa5\x12\xf4\x97\xc2\xc6\x70\x97\x52\x15\xee\x6d\x5d\xa9\x9c\x3c\x72\x31\x58\x3c\x79\x5b\x5b\x28\x00\x0a\x4a\x36\x16\x3c\xc5\x19\xe3\x3a\xf0\xc3\xb2\x74\x98\x86\xe7\x6c\x6e\x9b\x6c\x91\x90\xba\x6c\x39\x0b\xf9\x03\xe5\x8d\x5a\x28\xff\x49\x81\x88\x1b\xc7\x9c\x94\x46\xf8\xec\x05\x6a\xb3\xa1\x92\x8c\x3b\x71\x63\xb3\xf3\x00\x11\xce\xd5\x1f\xc3\xe7\x4b\x4b\x65\x4f\x89\x80\xb1\x28\xe9\x1f\x39\x4f\x2b\xca\x60\x73\xa6\x92\x55\xc7\xe1\x98\xb5\x13\xc5\xb1\x72\x55\x9e\xdd\xb5\x37\xa9\x94\xb8\xe8\x71\x5f\x05\x95\xe5\x64\xd8\xe5\x64\x95\x71\xe9\x02\x09\x92\xfe\x99\xe6\xa6\x6e\x62\x60\x10\xf6\xca\x37\x9f\xf9\xe9\xb3\x97\x2a\xab\x71\xf1\x62\x08\xa0\x5e\x73\x50\xf7\xd7\xce\xdd\xc5\x40\xc3\x2d\x82\x74\xbd\x46\xb3\xf7\xa2\xed\xb2\x9b\xbe\xe4\xf8\x38\x1b\xac\x2d\x04\x56\x6e\x31\x91\x04\x7b\x92\x51\x90\x1e\xd0\x4a\x35\x3e\x77\xfa\xae\xbb\x4f\x9d\x8d\xeb\xae\xeb\x84\x0c\x4b\x17\x61\xb4\x36\xfb\x1c\xfe\x32\xfe\x63\x74\x2f\xfa\xa0\xb5\xd3\x34\x4f\xaf\x01\x97\x79\x4d\xc7\x32\x25\x38\x08\xd6\x07\xc5\xc0\xed\x7f\xd1\x65\x39\x5f\x7a\x4c\x0f\xbb\x61\xaf\x61\xf0\xf1\xfc\xa5\x05\x73\xf0\x2b\xb8\x09\xbf\xf3\x06\x11\xfb\xbf\x75\x18\x5c\x53\x76\x8b\xaa\xe1\xfc\xcc\x76\xbd\x09\x7e\xa7\x5d\xc1\x0d\x5c\x1a\x96\x23\x94\x16\x9c\x6a\xce\x8c\x29\x09\xcf\x59\x3a\x72\x7e\x67\xb3\xd7\xa9\x38\xa2\x52\xed\xdf\x71\xc7\xf9\x9b\x21\x14\x4c\x3b\x52\x31\xae\x5d\x47\x32\xcc\xc0\xc4\x97\x74\x21\x2d\xc9\xaa\x7b\xfa\x3f\xfc\xe4\xc6\x6e\xf7\xf4\xe5\xfe\xdb\x6e\xb8\xf4\x1d\x1d\xdd\xc5\x82\x02\x69\x3c\x7a\xf2\xcc\x1b\xdb\xe7\x9b\xcd\xd6\x64\xe5\xfd\x3f\x72\x4c\xe7\x32\xf5\x44\xcf\x15\x84\x45\x92\xf2\x88\xdd\x79\xdb\x68\x32\x5e\x5b\xdd\x95\x4e\x6d\x61\x65\xff\xc2\x9d\x3b\xeb\xae\xc7\xa8\xe0\xf8\x99\xf2\x68\xb7\x45\x98\xa6\x79\x60\x98\x0a\x2b\xde\xb0\x62\x88\x1c\x2b\x2d\xd4\xee\xad\x2c\xc5\xc1\xb1\xe9\x7b\xf7\x97\x97\x97\x9b\x67\xf2\xd2\xdd\xd0\xf0\x85\x4f\x4c\x64\x62\x4a\x29\xc6\x94\xe2\x82\xf1\xbc\x9f\x96\x55\x59\x6e\x05\xe7\xce\xdc\xfe\x7b\x9f\x3e\xdd\x5a\x22\x64\x71\xd5\xff\x23\xc2\xaa\xb8\x73\x7c\xaf\x5e\xab\x62\xb2\x50\xdb\xbd\xf7\xfe\x5f\xbd\xe9\xd8\x09\x6f\x45\x96\x64\x16\x88\x45\x4f\x11\xee\x51\xee\x74\xd8\xfd\xe5\xc0\x0f\x16\xba\x0f\x6c\x9d\xfd\xe1\xe3\xe7\xd3\x7c\xb3\xfd\x68\xbd\xef\x61\x42\x11\x9d\xfd\x97\xd9\xdf\x92\x63\xf8\x73\x68\x0b\xbd\x01\xbd\x17\xfd\x3c\x42\x49\x13\x4a\xa9\xb8\xee\x75\x13\x85\x5c\x11\xd8\x79\x30\x99\xdc\x56\x79\x8b\x5e\xb3\xf5\xa2\x8d\x61\x9e\x7e\x8b\xe6\x5a\xf3\x6d\xb1\x54\xab\x98\xe6\x5e\x5f\x74\x0b\x4c\xda\x1d\xbc\x60\x85\xee\x64\x7a\x5d\x11\xb9\x3f\xe8\xb3\xb4\xb8\xd6\x0b\xad\xe7\xe0\xcd\x1b\x87\x9d\xd4\xf8\x3a\xcd\x78\x0f\xdb\x93\x08\x8d\x1d\x55\x0e\xb8\x12\x56\xad\x25\xa2\x15\x2d\x94\x92\xde\xfe\x82\xfc\xee\x8f\xe9\x73\x4b\x71\x65\x1c\x6d\x64\x47\xbe\xed\x62\xff\x65\xaf\xbe\xf3\xf8\xa9\x57\x53\x12\x63\x9a\x38\x11\x25\xe4\xb6\xb3\x27\x96\x57\xde\xf8\xf8\xda\xad\xcf\x0c\xcb\xe3\xd2\x89\x76\x69\x78\x89\x7e\xf4\xbb\x65\x7b\x7f\x90\xf9\x92\x13\x45\x7d\x46\x5c\xdd\xeb\xf8\x25\x5a\xf4\x4f\x09\xc9\x54\x3d\x97\x2e\x00\xf4\x04\xe3\x0e\x67\xac\x52\x5d\xbe\x65\xeb\xc8\x56\xa6\xb5\x0a\x77\xf7\x27\x6f\x7f\x5c\x99\x18\x74\xf9\x63\xa7\x2e\x9c\x8b\x85\xae\x24\x3b\xd3\xed\xbb\x36\x5a\x2b\xae\x94\xc0\x09\x63\x1c\xff\x10\x38\x82\x51\xca\x83\x5e\x78\x61\xff\xce\xbb\xf6\x3a\x59\x59\xd7\x72\x2f\xd6\x40\x04\xc5\x8c\x63\xae\x56\x2b\x67\x3e\xf2\xbe\x7f\xbd\x98\x24\x58\x48\xd9\x02\xac\xc2\x38\xd2\x04\x40\x49\x4a\x70\x9a\x2d\xbd\xeb\xa3\x9f\xb8\xa9\x39\x74\x4c\x36\xc4\x54\xcc\x5f\xd4\xe2\x85\x8e\x96\x51\xe4\x04\x3e\x4b\xd3\xf6\xde\x9d\x77\xec\x9d\x76\xf3\x18\x83\x23\x54\x45\xfd\xcc\x73\x97\xf1\x4e\xc7\xf1\xa4\x04\x1c\x04\xc3\xbc\x5e\x3b\x72\xf9\xdb\x57\x17\xfb\x4c\x4b\x17\xc4\xca\xda\xd6\x7b\xee\x6b\xf5\x27\xc9\xb1\x28\x26\xa0\xfd\x46\xb6\xaa\xca\x01\xbb\xe9\xcd\x3f\x84\x10\x9e\x7d\x63\xf6\x75\xfc\xa7\xf8\x4f\xd0\x27\xe0\x39\x84\x60\x17\x8a\xb7\x0d\x4c\xc6\x07\x34\x68\xd0\x1f\x74\x0f\x9b\x60\xd3\xa2\x83\xeb\x9f\x8b\x2d\xa3\x6c\xba\x0b\xc3\x96\x5d\x4d\x34\x39\xd0\x4a\xc6\x76\x45\xf5\xc1\xbb\x08\x56\xa1\xbb\x4e\x0e\x50\xdf\x01\x96\x1b\x0d\xf3\xd1\xdc\xcd\xad\x4d\x14\xf5\x84\xfe\x60\x62\x25\xb7\xf4\x05\x04\x6a\x1d\x26\xd3\xc9\x01\x0a\xdc\xb5\x7d\x96\x2d\x48\x73\x66\x92\x24\x2f\xce\x51\x64\xb4\xb9\xd8\x73\x3d\xca\xe3\xf3\x85\x09\xe6\x44\xab\xd0\xe5\x83\x55\x58\x87\x17\x4a\x3c\xd7\x94\x1d\xdb\xb1\x79\x2d\xb6\x1d\x26\x45\x1f\x4c\xde\x9e\x57\xaf\xd7\x61\x30\x1e\x4c\x0a\xfd\xa0\xa8\x65\xa7\xa2\x64\x57\x9a\x96\x0e\x28\xe3\x64\xfe\x84\xf6\xd6\xd2\x83\xe5\xec\x25\x7b\xbf\xd7\x13\x43\xd1\xeb\xf7\xba\x78\x93\xc9\xd0\x85\x39\x70\xa2\xe0\xfa\x95\xf2\x31\xfd\x91\xed\xdb\x86\xf5\x38\xa4\x82\x83\xab\xca\x91\xef\x68\x66\x5f\xb3\xc3\x83\x69\xc6\x39\xb0\xca\xfd\xe1\xef\xfb\xab\x97\xd6\xaa\x15\x69\xb8\x55\xa3\xc6\x49\xb1\x66\xae\xd4\x4b\xd4\xee\xfb\x5c\x97\xf8\x8e\x4e\xbd\x80\x4b\x4e\xa9\xb4\x18\x13\x13\xee\x95\xa9\xe3\x8e\xea\xa9\xe3\x00\x01\xdb\x1c\x66\x57\x7c\x52\xa6\x6d\xa7\x78\xb0\xb9\xd5\x4b\x1d\x62\xb9\x9e\x39\x20\xd8\xf4\x13\xcf\x7b\x76\xd5\x4b\xa9\x07\x57\xff\xdc\xbe\x7c\x4e\x10\x4a\xbd\xcd\xda\xdb\x87\x2c\xea\x65\xbe\x23\x03\x8f\x17\x2b\x95\xb0\x6d\xef\xae\x35\x1c\x4e\x83\xe5\xc6\x46\x75\xb4\xe2\xfe\xbe\x78\xac\x46\x64\x10\x62\xcc\x32\x55\x1e\x48\x62\x9b\xaa\x98\xd6\xca\x71\x55\x43\x6a\x27\xee\x3a\x95\xb4\xb9\x79\xd7\xe9\x0b\xb7\xab\x13\xb5\x56\x52\xe7\x14\xec\x2a\x3c\xec\xc7\x1d\xa1\xfc\x14\xc0\xa5\xa1\x6e\x3e\xe8\x7b\x91\x5b\x15\x76\xb9\x12\x70\x27\xee\xb4\x35\x10\x46\xa5\xf4\x95\xd6\xd2\x65\xf3\x15\xd9\x56\xe3\xce\x13\xdf\xb3\x92\x66\xd8\x0d\x35\x11\xf0\xeb\x7e\xe8\xd7\x3a\x9a\x47\x25\xde\xf0\x05\x17\x84\x02\xb7\xad\x78\x84\x30\x2f\xa1\x14\x13\xd5\xc8\x2e\x9e\xb9\xeb\xae\xd3\x0b\x59\xdd\x6b\x46\x82\x30\x82\x05\xe1\xc5\xbb\x17\x89\xf0\x4e\xec\x79\xd2\x00\x56\x4e\x9c\xda\x91\xaa\x18\x2a\x3b\x94\x8a\xcb\xd0\x4b\x7a\x1b\x47\xba\xb1\x2b\x98\xa2\x2e\x90\x7a\xda\x5f\x22\xc5\xeb\xf6\x48\xb3\x3b\xde\x5c\x8c\xec\xcb\xc6\x98\x00\x5f\xd3\x5e\x9c\x24\x6e\xca\x3c\xe5\xd7\x2f\xd6\x7d\xc5\x28\xa7\x0d\x01\x40\x47\xd1\x24\x3e\x41\xd9\xdb\x31\x56\x41\x7b\x6d\xad\x13\x3a\xca\xa3\x44\xad\xd0\x6c\xbd\xee\x6b\x2a\x39\xe6\x84\xf1\x90\x6b\x46\x5d\xe9\xef\xef\x95\x1c\x12\x52\xfb\x6e\x28\x81\x21\x0d\xa8\x13\x3b\x4c\xba\x21\x2f\x65\xed\x93\x77\xdd\x7e\xfa\xac\x1f\x53\x0a\xae\x74\xd8\x34\x17\xe6\xe1\x30\xd8\xb7\xa9\x28\x3f\x4f\x7b\x64\x41\xc9\x76\x2b\x6c\x84\x25\x00\x3f\x04\x8e\x8f\x27\xcb\xee\xa2\xc9\x5b\x1a\xd3\x52\xf5\xc6\x9a\x27\xb9\xe2\x8e\xeb\x95\x78\x00\x91\xc7\x0c\xfb\x67\x42\x62\x4c\x99\x93\x0c\xd6\xc7\xbd\xd4\xe5\x54\x52\x03\xbc\x78\xc0\x8f\xd4\xbd\x10\x03\xa2\xb3\xab\xb3\xbf\xc3\xff\x1a\xff\x3e\x6a\xa0\xe7\xe0\x04\xec\x1f\xbe\xdd\xcf\x87\x03\x30\x39\xcc\x47\xe3\xf9\xeb\x88\x26\xfd\xc5\x17\x86\x91\x51\xb1\xd0\xd4\x12\xb0\xeb\x9d\xa3\x78\x39\xe6\xf6\x61\x6e\xb9\x9e\x8f\x96\x52\xde\x80\x51\x56\xe0\x88\xed\xe9\xe4\x70\x35\x77\x77\xd0\xef\x64\x49\xaf\x00\xaa\xd7\xe9\xef\x06\x58\x8f\xda\xd7\x5c\xba\x58\x94\x78\x78\xb9\xc9\x21\x42\x9f\xd3\x52\xdb\xfc\xc2\xe7\xad\x4f\xd7\xc2\xc5\xbc\xd8\x33\x0f\x84\xa5\x54\xcc\x6b\x9d\xbd\x6b\xeb\x23\xfb\xfb\x70\xa8\x21\x95\xd2\xfc\x05\x0b\xca\xaf\x2b\x15\x1d\xac\x12\x18\x1c\x2e\x2e\x30\x21\x23\x6b\x81\x98\x8e\x72\xf8\x8c\xc5\xca\x44\x2e\x25\xf5\x81\x35\x7a\x46\x23\x6b\xe2\x00\x57\xef\xc2\x9c\x86\x95\x20\x77\x56\x7c\xb1\x16\xf9\x6e\xf8\xfd\x03\x95\x17\xe4\x47\x85\x32\xf6\xb4\xe4\x4c\x33\x2e\x45\xc6\x58\x20\x7d\x00\x21\x01\x08\x55\xfe\xe6\x60\x38\x5e\x5c\x77\x29\x05\xae\xb8\x2a\x7a\xcd\xec\x6b\xd5\xc2\xa0\xca\x6e\xf9\x57\x57\xff\x04\x07\x20\xca\xa2\x2b\xfc\x25\xe9\x8a\xb0\xea\xa4\x14\x1c\xe6\x48\x18\xfe\xab\xcb\xbc\x91\xd6\x5c\x56\x2c\x26\xe1\x7a\x31\x74\x63\x45\x81\x62\xd1\x69\xaf\xaf\x76\x1b\x05\xea\x94\x02\xfc\x92\x6a\x49\xbf\xcd\xc1\x30\x58\xe1\x79\x35\x49\xe6\xa2\xbf\xe5\x65\x86\xc8\x52\xee\xfa\x81\x23\xa8\x43\x99\x5d\x90\xb9\xba\xd6\x09\x30\xe5\x4c\x51\x83\xea\x08\xf3\x02\x59\x2c\x03\xb1\x6a\x0b\x53\x61\x9e\x90\xa5\x7f\x1b\x05\xbe\x0a\x54\x2c\x02\x42\x3c\xae\xa4\x6b\x63\x1d\x7c\x89\x0a\xea\x3a\x2c\x19\x68\x77\xa3\x95\x07\x84\x82\x0e\x07\x93\xed\xc5\x92\x66\xf0\x2b\x09\x25\x98\xea\x68\xf1\x1d\x7f\xf4\xec\x66\xac\x4c\x78\x95\x58\x78\x5a\x11\x86\x89\x14\x91\x97\x76\xb7\x36\x06\x6b\xa1\x17\x10\x2c\xfd\x52\x27\xed\x2c\x70\xd6\xe9\x44\x55\xfe\xff\xb2\xf5\x26\x50\x92\xa5\x57\x79\xe0\xbb\xff\xbe\xbd\x7d\x8b\x3d\x22\x23\x32\x22\x72\xdf\x62\xab\xaa\xcc\xca\xac\xea\x5a\xbb\xaa\x7a\x5f\xd5\xad\x5e\xd4\x6a\x6d\xad\x96\x84\xd4\x16\x12\x92\x40\x42\x30\x06\xc6\xc6\xd8\x66\x31\x18\xb0\xd9\x06\x0f\x0c\x60\x38\x1e\x0c\x0c\x23\xcc\x80\x01\x1f\x5b\x9a\x31\x9e\xc1\xd8\x63\x0c\x8c\xc1\x63\xc0\x68\x0c\x0c\x1c\xcd\x60\x54\xe5\xf3\xfe\x17\x11\x99\xd5\xf2\xe9\x3e\xa5\x56\x65\xe6\xcb\xc8\xc8\xff\xbf\xf7\xbb\xf7\x7e\xf7\xfb\xa8\x94\x71\xa5\xa7\x33\x73\x60\x79\xa2\x04\x80\x36\x9a\xfd\x41\xdd\x95\xd4\x92\x74\x08\xf9\xe2\xb7\x31\xc3\xfb\xef\xfa\xdf\x3f\x5d\x93\x14\x11\xe1\xad\x1a\x4e\xb9\xd0\x04\x63\x26\x7d\xee\xab\xa0\xb1\xb6\xba\xd2\xd3\x39\x43\x88\x18\xa6\x7c\x79\xa0\x7c\x9a\x84\xa1\xe0\x84\x08\x96\xaf\x4a\x31\x68\x85\x69\x56\xdc\x4b\xd1\x72\x81\xbb\xc4\x15\x1e\xa1\x5a\x95\xe2\x54\x3a\x5d\xbd\x30\x5a\x6f\x33\x4c\x6c\x31\x5e\xbe\x83\x08\x11\xe9\xfb\x54\x85\xc3\x30\xca\x24\xe5\xbd\xfe\xd6\x4e\x27\x54\x16\x75\x52\x84\x3c\x2a\x28\x33\x5e\xa0\x05\x95\x84\x09\x5e\x2a\x63\xa9\xcc\x73\x49\x29\xc8\x65\x55\x8e\x91\xf3\xc8\xbd\xbf\xc0\x2e\xfa\x55\xe7\x85\x72\x07\x78\x99\xe0\x4e\xb1\x17\x94\x88\x6c\xbe\xff\x3d\x9b\xdf\xdb\x52\x29\x33\x4d\xce\x62\xb8\xfb\x71\xdf\x9c\x7d\xba\x18\x99\xf6\x58\x7c\xff\x06\x7a\x09\xef\xf9\x19\xba\xd0\xec\x14\x68\x4c\x96\x57\x6c\xf4\x25\x20\xa3\xfc\xf4\xe5\xad\x99\xcb\xbd\x4d\xad\xa8\xe6\x31\xb4\x00\x7e\x18\x30\x69\x77\xbd\x4a\xcb\xdd\xa8\xdc\xb9\x38\x6a\x37\x28\x8d\xc2\x5b\xfb\x3b\x6f\xec\xab\x3e\xa7\x09\x97\x0c\x91\x22\x0a\x26\xfa\xe6\xeb\x3f\xf0\xcc\x63\x1b\xc3\x5b\xd9\xd1\xf1\x95\x9b\xbb\x7b\x1c\x30\x98\x6a\xd5\xab\x71\xd7\x50\xdf\x26\x58\xcc\xdd\x7c\xfb\xf8\x78\x27\xf7\x18\x05\xfc\xe7\xb5\xbc\xf8\x42\x1e\x56\x6a\x81\x27\xb4\x40\xac\x23\x1e\x79\x61\xbd\xd3\xf1\x83\x02\x20\x6e\xec\x1c\x79\x2d\x95\x07\x34\xec\xab\x3c\xe6\xa9\x57\x3b\xb8\x78\xb2\x53\xf5\x25\x55\xd4\xc7\x24\x74\xeb\xcc\x3e\x58\xba\x2e\x12\xcc\x5c\x1e\xdd\xb9\x7e\xe9\x6a\x73\xed\x5a\xb6\xf7\xfc\xdb\x7f\xfa\xbd\x0f\x23\x40\x9e\x2f\xa0\x01\x08\x71\x5e\xdb\xb9\x54\xdf\xe0\xd9\x5a\xef\xc1\x07\x6e\x3f\x34\x1e\x3d\x55\xa9\x92\x2e\xef\x29\xb6\xab\x83\x72\x15\x87\x09\x7c\xe9\xc6\x48\x7a\x2f\x3f\xff\xc3\x5f\x7f\xed\x52\xb3\x40\xa3\x26\x4e\x12\x2a\x71\xbe\xd7\x0c\xb8\x55\x2b\xa4\x3c\xb4\xa8\xd1\x2e\x06\x17\x47\xfe\xc3\x8f\x3f\x84\xb8\x60\xd5\x20\xf7\x64\xd5\xad\x26\x98\xb7\xe8\xb9\x9d\x64\xb5\xbf\xb5\x75\xfd\xda\xd1\x49\xa3\x1d\xd2\x56\xba\xdb\x2c\xf2\x8c\x9b\xc6\x81\x5d\x29\x2e\x4f\x1c\x22\xa6\xd6\x8d\x7d\x56\xaa\x20\xea\x6a\x85\x66\x51\xbf\x96\xba\x1a\x40\x07\xe7\x57\x1f\xfe\xe6\x9f\x7e\xe7\x07\x02\xb9\x4f\x08\x17\x56\xae\xcf\xc1\x8e\xbc\xf7\xc7\xf8\x12\xfa\x59\xe7\xad\xce\xff\x0a\xbf\xe6\x38\x70\xb0\xfc\xbd\x75\x8b\x70\xdb\xe5\x67\x7f\xb1\xb6\xc2\xe8\xa6\x65\xeb\xd1\xee\x0a\x4e\xa6\x83\xe1\xb8\x67\x15\x0a\xca\xd6\xdf\x0e\x2a\x67\x6b\x6d\x98\x4e\xa6\x83\xdd\x85\x92\xf2\x2e\x62\x7c\x50\xca\x00\xf5\x58\x2f\x29\xbb\x88\x96\x14\x5d\x94\x27\x69\x32\x0f\xed\xe5\xe6\xcd\xec\x60\x81\xc4\xf2\x02\x41\x2e\x57\x0b\xcb\x70\x5c\xae\xfd\x96\x07\xb3\xeb\xa3\x2e\x5f\x8a\x91\x2e\x4e\x76\xf1\xb5\xb3\x69\x5c\xf2\xb4\xbb\xe5\xf9\x4d\x96\xa5\xcc\x31\x94\xd3\xe2\x33\x21\xdd\x76\x40\x17\xe3\xa1\xbc\x55\x64\x29\xdb\x33\x29\x32\x90\xdd\x42\xb3\x3f\x47\x8f\x95\x65\xce\xb8\xcc\x4c\x76\x89\x67\x09\x59\xe7\x3f\x29\x2f\xbe\x4f\x59\x9c\x65\xf9\x64\x79\xc7\x36\x61\x71\x4d\x67\x05\x88\x6e\x43\x36\xca\x66\x07\x27\xa8\x4c\x8d\xf3\x1f\xbd\x67\x8b\xb4\x64\xc1\x5b\xb0\xd0\x7e\x36\xbd\x3f\xeb\x15\x2f\xf5\xcc\xbb\x3d\x98\x6b\x4d\xcc\xbb\xb5\x6d\xc8\xd2\x24\x5f\xb4\x6f\x8b\x8f\xc3\xef\x69\xb6\x13\xe7\x0c\x0b\x85\x00\x7c\x40\x92\xb9\xdc\x8a\x35\x08\xa1\xf4\x66\xac\x28\xa0\xa0\xe5\x0e\x6a\xe4\x23\xfb\x45\xf1\x82\x31\xf3\xb8\x09\x2b\x9e\xa4\x18\x83\x00\x63\xd2\x07\x99\x5f\xe6\x1c\x84\x02\xf4\xc2\x5b\xf5\x6e\x1b\xc3\xf7\x02\x93\x41\x63\x1f\x3d\xf9\x68\x81\xfd\x28\x08\xc9\xf2\xa6\xe6\xa2\x48\x1a\xac\xd5\xab\x31\x01\x48\xaf\x8a\x4a\x2c\x6f\x6d\xf1\xb4\x38\x8d\x68\xa5\xa2\x95\x64\x0c\xb4\xaa\x57\xf6\x4f\x08\xdc\xaa\x87\x05\x50\x41\x1b\x53\x7d\x6d\xd7\xc7\x45\xac\xb4\xbb\x18\x56\xc7\x92\xab\xdc\x33\x52\x09\x8e\xfe\x15\xd7\x7e\xfd\x21\xc4\x2e\x6d\xc6\x1e\x10\xc6\x84\x60\xca\xa7\x0c\x08\x20\x64\xa8\x42\x88\x16\x69\xd3\xcf\x02\xb4\xfe\x20\x0f\xab\x62\x27\x49\x09\x6b\x19\x97\x10\x10\x69\x52\xdc\x2b\x2e\x98\x4b\x30\x62\x92\xe4\xbe\x29\xb9\xdc\x5a\x3c\xfb\x02\xec\x75\x33\x93\x33\x41\x59\x9a\xa5\x18\x31\xce\x99\x4d\xda\xbb\x37\xfc\xc3\x7d\xc2\xb1\x94\x88\x46\xb2\x4a\x43\x6d\x18\xc3\x20\xa8\xd0\x05\xf4\x53\xed\x2d\xf6\xec\x5b\x0a\x64\xe9\xeb\x40\x30\x20\xd4\xd5\x81\x44\xb5\x26\xd7\xda\xca\x1c\x61\x42\x29\xc1\x24\xc8\x0b\xc0\x08\x18\x53\x13\x15\xf1\x7e\xf7\xc3\xa4\xda\xf7\x5a\xa1\x61\x94\x08\x5b\x26\x16\x6f\x0a\x30\xcd\xec\x9b\xe6\xad\x08\xc6\x79\x29\x7c\x80\xbe\x11\x48\x6f\x6b\x3f\xeb\xaf\x05\x82\xa6\xb2\xa8\x75\x23\x13\x77\x76\x36\xfb\xeb\x7e\xd0\xb5\xd4\x2a\x0c\x14\x63\xb7\x42\x00\x32\x26\x6b\x7e\x3d\x3a\x17\xbe\x76\xe1\xb9\xdb\xdd\xe3\x72\x78\xcf\x42\x5a\xe4\xc0\x80\x82\x2b\x00\x2b\x00\x8d\x08\xa1\x04\xea\xd4\xf6\x69\x37\x76\xba\xcf\x9e\x7b\x7f\xc0\xeb\xa4\x16\xce\x1a\x1d\x02\x84\x40\x81\x13\x08\x08\x1b\x44\x18\x6e\xb8\x83\xee\xfa\xd6\xca\x7a\xe8\x71\x0e\xa0\xed\xca\x2c\x01\x0f\x4c\xf1\xdd\xb1\x26\x5c\x87\xfd\xed\xd1\xea\x9e\xcb\x29\x46\x70\xf7\x33\x45\xf8\x32\x50\x54\x27\xec\x68\x7d\xad\xdd\xe2\x6e\x79\x64\x98\x8e\x94\xab\xa4\x26\x42\xda\x8a\x43\xca\xbc\x6d\x28\x05\x84\x92\x68\x2d\xc8\x49\x83\x47\xaf\x4f\x9f\x58\x69\x34\x2d\xde\x88\xdc\x0a\x95\x14\x53\x4a\xa8\xd0\x84\x12\x82\x13\x13\xf8\x21\xe7\xaa\x48\x16\x9d\xbd\xf5\x55\x25\x40\x18\x14\x02\x51\xe1\xfa\x6a\x3c\x58\x09\x11\x20\x21\x7d\x91\x70\x83\x01\x4b\x43\x83\xe2\x85\x62\x12\x19\x3f\x30\x11\xa7\x08\x70\x9a\xb6\xaf\x3f\x75\x6e\xd2\xef\x8e\xa2\x54\x31\xcc\x6a\x98\x64\x5e\x1e\x86\x82\x49\xa2\x19\x00\x2c\x34\xba\x31\x57\x7e\x11\x46\xbd\xc0\x20\x24\x61\xae\xd2\x40\x6b\x46\x74\x7b\x6b\x9b\x0d\x4f\x58\x93\x0a\xe2\x38\xf0\x3d\xe8\x1f\x3b\x8f\x3a\xff\xa3\xe3\xf4\x4f\x57\x8f\xec\xd4\xe4\x18\x59\x56\xfd\x99\x5a\x7c\xc0\xd9\x26\x14\xc0\x77\x51\xe0\xce\xaf\x72\xb9\x4f\x5d\xe6\xd3\x32\xd2\x1d\xc3\x64\x8c\xbb\xe5\xfc\x73\x32\x38\x86\x7c\x7a\x4a\x55\xb2\x21\xc6\x03\x1f\x3c\xcc\xe7\x5a\x7f\x79\x76\x58\x3e\xf3\x34\x3a\xf4\x06\xa7\xac\xbf\xd3\x76\xdf\x28\x3b\x5b\x31\xc3\x16\x42\x08\x9b\xc4\x35\x5c\x2b\xbe\x92\x13\x23\x99\x22\x2e\x18\x8d\x29\x00\xc7\xc6\xcd\x56\x4f\x7e\x0c\x03\xb8\xaa\x9a\x07\x32\x8a\x19\xc1\x22\xec\xb4\xac\x6c\x0a\x70\x93\x0e\xe4\x75\xb7\xca\x6b\x9c\x20\xf4\x05\x60\xb1\x0e\x30\x02\x19\x70\x42\xe1\x47\x2f\xf5\x73\x3f\x16\x75\x8c\x84\x59\xc7\x0a\xb1\xe2\xc8\xa1\xa8\x45\x15\x28\xca\x00\x49\xc1\x12\x43\x8b\xc4\x64\xa2\x4a\x86\x63\xf7\xc4\x5b\xaf\xf4\x0d\xa5\x45\x1d\x4a\x99\x74\x39\x72\x63\xc5\x10\xa1\x52\x06\xdc\xf3\x4e\x30\x80\x1f\x74\xcf\xfd\x93\x69\xef\xa1\x2a\x15\x14\x15\xe5\x1f\x97\x81\x56\xa4\x04\xa7\x18\x78\x71\x0d\x44\xbb\x52\x9f\xfe\xfe\xc9\x96\xbf\x19\x77\x0b\xac\x6b\xc5\x9c\x2d\x7e\xd2\x18\xa8\xc7\x10\xda\x44\x58\xb9\xf5\x0c\x84\x95\x18\x29\x25\xa5\xdd\x56\x52\xe9\xaa\xb2\xfc\xc4\x18\x25\x57\x5a\xe3\x9f\x1f\xd7\xac\x36\x70\xc2\x5d\xa5\x8c\xf4\x29\xd7\xd2\xc6\x19\x1c\x30\xa1\x42\xc9\x6d\x86\x26\x08\x52\xdd\xf1\x36\x2e\x7c\xf0\x83\x07\x59\x9c\x16\x39\x74\xcd\x11\xe8\x3d\xe8\x97\x9c\xc8\xb9\xe6\xfc\xa0\xe3\xcc\x92\x79\xeb\xec\x54\xaf\xca\xb6\xcd\xec\x41\xc9\xf2\x37\xcf\xcd\x58\x6f\x01\xaa\x96\x70\xea\x60\x36\x19\xf7\xcb\x76\xc6\x19\x46\x7e\x13\xb2\x34\x6b\xe2\xe4\x0c\xc7\x8d\x95\x38\x70\xbe\xbc\x31\x9b\x77\x5c\xec\x17\x95\x50\xf0\x0c\xd2\xdb\x85\xb2\x45\x58\x42\xb7\x47\xed\xb8\xe7\x84\x52\x25\x39\x41\x42\x30\xf8\x43\x6c\xd2\xce\xf5\x67\xb2\xcd\x14\x60\x7d\xc5\x15\x14\x33\x04\x9c\xcb\xa8\x5b\x3f\x20\xe4\xe6\xec\xea\x39\x8c\x19\xa3\x34\x09\x1b\xc2\x75\x31\xc1\x77\x7f\x9c\xbb\xc1\x38\x7f\xfa\x46\xa7\xe2\x09\x26\xcb\x99\x18\x52\x0d\xec\x2b\x16\x08\x17\x53\xc6\x10\x7d\xe0\x91\xe1\xab\xbb\xe3\x9b\xa2\x04\xc4\xaa\x52\x8b\xb4\x42\x12\x71\xe2\xdf\x8c\xeb\x3e\xe7\x1c\x10\x43\x94\x71\x23\x02\x6a\xa4\xa1\xec\x57\x00\x0b\x95\x93\xa3\x3a\xa1\xba\x9e\xf9\xa2\xa2\x25\x7c\xae\xd4\xb8\xca\x54\x90\xc9\x7a\xd2\x39\xf7\xd4\x9d\xeb\x37\x2a\xbb\x2b\x0d\x0a\xbc\xb6\xf2\xf2\x95\xfe\x8b\x6f\xdd\xdd\xca\x63\x4b\x18\x0d\xf9\x8e\xc1\x64\xce\xd1\x42\xb4\x64\x57\x13\xa1\x23\x8e\x09\x89\xec\xf0\x49\x7a\x9d\x8d\xe7\xde\x36\xbc\xf3\xa1\x41\x2c\x8d\x7b\x69\x24\xea\xba\xf8\x61\x71\x56\x0d\x9a\xa2\xcd\x62\x1a\xf0\xa8\xb1\x16\x3f\x70\xe5\xce\xe3\xd3\x66\xe8\x51\x04\x45\x98\xa7\x5e\xb0\x67\x79\x2c\xe0\xf0\x7b\x5f\xc0\x02\xfd\x1c\x7c\x93\xe3\xc4\xa5\x16\x56\x91\xc4\x0b\x14\xe3\x21\xce\x7c\x74\x48\x0e\x0a\x00\x94\x8d\x86\x83\xb3\xff\x58\x0d\x8e\x72\x04\x84\x6d\xaa\xce\x4a\x26\xee\x81\xdd\xea\x5a\x8e\x93\xce\x90\x54\x66\x16\x64\x1c\xd8\x01\x6f\x6f\xb1\xde\xd5\xcb\xce\x36\xc9\x7a\xa5\xc2\xe8\x19\x58\x3f\x2a\x50\x97\x0d\x3d\x56\x7b\xa1\x5b\xc4\x92\x92\x23\x97\x2f\x6b\x84\x52\x30\x6e\xce\xa4\xc9\xf2\x74\xbe\xab\x36\xec\x9d\xb2\x2b\xf3\xb9\xc2\xca\xe2\x04\x96\x25\xf3\x26\xcc\x7b\xc9\xf9\xd9\xc9\x6c\xbe\x50\x86\xdf\xc4\xb6\x32\xee\x75\x4f\x05\xab\xca\xfe\x72\x71\x15\xb0\x05\x42\xc9\x7c\xe1\xae\x9c\x04\xc3\xe8\xbe\xc2\xa1\x57\x00\xc8\x5e\x11\x34\xe9\xbc\xc4\x9e\x94\xed\x82\x63\x18\x8e\x8b\xa7\xec\xa0\xf2\xb1\xc7\x90\x6d\x23\x8a\x5d\x13\x56\x64\xa5\x28\x8a\xb1\x96\x3c\xeb\x82\x12\x9c\x22\x6f\xba\x9b\xef\x7a\x12\x09\xcc\x49\x51\xfe\x49\x52\xa3\x6c\x9d\x60\x8e\x23\x37\x09\x88\x8c\xf7\xb6\x15\xa5\x18\x42\x95\x88\xa4\x5f\x7d\x46\xf3\xeb\x0d\x45\x62\x12\xf2\xca\xc6\xe6\x03\x37\x04\xed\xd6\x76\x86\x4f\x66\x22\x30\x92\x78\xdc\x12\x7e\xda\xc1\xb0\x43\x71\xaf\x9b\x55\x5c\xea\x4a\x66\x48\xf3\xf0\x28\x25\xa5\x06\x30\x0e\x24\x25\x14\x61\xae\x7b\xb1\x90\x55\x66\x89\x40\x2a\x6c\x8e\xc2\x23\xbe\xed\x09\x0d\x46\xb8\x9b\xe2\x28\x18\xb7\x62\x13\xd8\x50\x09\x4c\x25\x14\x43\x44\xfc\x3a\xe7\x18\x11\xef\xc2\x61\x1d\x49\xbb\x8e\x40\x71\x8d\x73\x23\xfc\x78\x35\xef\x75\x11\x6d\xee\xf1\x5e\xe2\x4a\x9f\x2a\x4f\xc4\x2a\x24\xd2\x68\x1c\x3d\x3c\xd8\xd8\x41\xfc\x81\x93\xb5\x41\x82\x35\x89\x49\xa4\x62\x0f\x8a\x00\x5e\x80\x28\xaa\x54\xef\x1a\xd3\xcf\x56\x87\x99\x2f\x62\x40\xb1\x48\x8c\x95\x50\x57\x5b\x7b\x11\x43\xb8\x48\xf5\x0c\x33\xa8\x13\x92\x1b\x52\x54\x1c\x22\x14\x92\x4a\x00\xc5\x8d\x0a\x75\xc8\x13\x43\x6a\xeb\x33\x0f\x51\x2e\xad\xe8\xbc\xa0\x06\xa2\xbc\xeb\xa1\x02\x46\xa1\x8c\x85\x5a\x26\xc2\xc5\xa0\x02\x83\x7e\x20\x60\x84\x31\xd3\xcc\x0e\x3f\xd2\xfd\x8a\x9c\x0c\xb3\xd5\xa6\x51\x3a\x2c\x5e\x89\xb0\x22\xe4\x88\x28\x26\x7d\x79\xe1\xdc\xc3\x83\x22\x7c\xfa\x80\x7c\x62\xea\x77\x6e\x07\x4a\x31\x5a\xf5\x85\x6d\x82\x10\x3b\x73\xc6\xc4\x1d\x0c\xdf\xf1\xfa\xa8\xb5\xd1\x5e\xed\x8c\x2d\xce\x81\x79\xa8\x27\x18\x98\x4c\x7b\x95\x84\xb7\x2f\x1e\xc5\xa5\x85\x89\x2f\xbd\x6c\xf5\x46\x7b\xad\x97\x60\x0a\x8c\x2e\x19\xb3\x26\xd0\x4b\xf2\xac\x70\x79\x2a\x7c\x61\x95\x30\x91\xd7\x68\x57\x1e\x58\x89\xc0\xbd\x70\x5c\x27\x7e\x14\x0b\x04\x3c\x08\x3d\x49\xac\x9e\xb5\x9d\x0e\x52\x53\x49\xb5\xad\xa5\xd8\x7e\xab\x7b\xce\xdd\x78\xe7\xdb\x56\x7b\xca\x66\x13\x82\x79\xe2\x86\xa5\xd8\x05\xb1\x7d\x0e\xee\x57\x3c\xca\x08\x46\x14\x51\x19\xdc\xba\x55\x53\x50\x54\x7d\x0c\x53\xa8\x1d\x1e\x8c\x52\x41\x8b\xb7\x9d\x12\x2a\x8d\x96\xac\x28\x4d\xa1\xd4\x1e\x29\x60\xa4\xa7\x13\x1d\x72\x14\x5f\xeb\x64\x5f\xd1\xfd\xb2\x49\x90\x72\x2a\x95\xdf\x10\x06\x29\x1b\x63\xe8\xbd\xff\x8c\xbe\x13\xfd\x8c\xf3\x6b\x76\x0a\x74\xa6\xe4\xe7\x3d\xc6\xd3\x22\xf9\x1f\xcc\xaf\xe6\xe8\x7e\xde\x23\x4c\x87\xac\x77\x9a\x5b\xba\x0b\xde\xf4\x7d\x61\x65\x89\x07\x2c\xe7\x75\x50\x54\x33\x67\x96\xbf\xca\x19\xd3\x32\x3a\x2c\xfe\x39\x98\x33\x32\xe7\x73\xec\xff\x1a\x31\xa5\x7c\xa4\x67\xd9\xb4\xf7\xf5\x08\xee\x53\x6f\x1f\xee\xc0\x31\xb4\x57\xd6\x42\xad\x95\x88\x24\xdf\xe9\x31\xdf\xf6\xc2\x56\x75\x23\xc6\xc1\x8d\x0f\x25\x4f\x6c\xd7\x7d\x4e\x18\x2d\x52\x33\xa9\x1b\x62\x35\x04\x28\x47\x8c\xe2\xc3\xd5\xc9\xe3\xa8\x29\x7d\x1d\x04\x8c\x12\xce\x0c\x63\x99\xbb\x53\x63\xda\x66\x76\x4c\x4c\xd6\x3f\xd9\xfa\x38\x11\x5a\x0b\xf2\xf1\xad\x4b\xc3\xdc\x2f\x72\x93\x47\xb1\x2b\x5c\x1a\x0d\x55\x4a\x99\x61\xdc\x1e\x7c\xc2\x8d\x6c\xa0\xeb\x5b\xed\x19\xa2\xc2\xf5\x9a\x91\x8b\x40\x11\x37\x2f\x80\x06\xe2\x86\x69\xae\xa2\xd6\xee\x13\xb5\xf7\x5d\xf7\x70\xd4\xd0\x03\xc9\x08\xa6\x44\x5a\x6d\x2b\xe9\x4b\x18\x2b\x19\x09\xa9\x85\xd7\xae\x73\xc6\x7d\xf4\xb7\x83\xfe\x4a\x76\xf1\xdc\xd5\xef\xdf\x5f\x3d\xd0\xd6\x70\xc0\x6e\x2c\xdb\xe3\x8d\x44\x95\xc7\x3e\x8f\xfa\x01\x93\x45\x9d\x25\xb1\x10\xe4\x66\xa5\x57\xc0\x8f\x20\x0d\xaa\x5b\x57\xfe\xc6\x7a\xef\x7c\xfb\x92\x8f\x11\xa1\xe5\x00\x1d\x63\x1d\xe8\xb2\x22\x20\xd4\xaf\x24\x9a\x23\x50\xd3\xda\xa4\xbd\xfa\x8d\x97\x37\x73\xaf\x5c\x96\x86\x66\x72\x15\x33\x13\x31\x37\xf5\xab\x2a\x60\x51\xcb\x50\x2f\x16\x7d\xcf\x6e\xa6\x02\x50\x10\x74\xc1\xd2\x0d\x84\x92\xc2\x10\x06\xc1\x64\xe3\xbb\xaf\x8f\xcf\x05\xf5\x96\x8b\x7d\x8f\x39\x0e\xbe\xf7\x47\xf7\xfe\x18\x7f\x17\xfa\xac\xf3\x1f\x9d\xcf\xa3\xd0\x71\xa0\xb7\x60\x05\x95\xcd\xcf\xf9\xb9\x58\xf2\xdf\x7d\x48\x96\x4a\x41\xa3\xf1\x6c\x32\x28\xc3\xb5\xd5\xe1\x2a\x92\xc9\x78\x3a\x3e\x9d\x09\x2f\x0e\x50\x3a\x7a\x13\x21\xe8\xcc\xe1\x5a\x0e\x37\xed\x18\x2a\xcf\xf2\x43\x74\x30\x2b\xcf\xdb\xb0\x5c\x3a\x1d\xb0\x25\x65\x69\xbe\xd0\x36\xb6\xad\xe9\x9e\x05\xbe\x36\x09\x9e\x8a\xfd\x2f\x46\x5d\x09\x5b\x3e\xd5\x9e\xbb\x5d\x58\xd4\xca\x23\xcb\x9a\x9a\xe5\x74\x32\x98\xec\xc2\x60\x3a\x1b\x4d\xca\x44\x69\x79\xc1\xf3\x39\xd0\xbc\xf3\x3b\x9c\x37\x11\x4a\xb9\xd2\x37\xcd\xa1\xba\x73\xf5\x82\x8b\x70\xf6\x12\xda\x1f\xee\x20\xcd\x46\x07\xd3\x83\xc5\xf3\xf2\x64\xd9\xc6\x4e\xca\x9e\x41\xb9\x6d\x3e\xcf\xa3\x65\xad\xbf\x4c\xa5\x60\xff\x15\xcb\x46\xf3\x7c\x5e\x37\x3e\x65\x28\x7e\xe9\xdd\x3b\xc3\xeb\x2a\xc9\x87\x59\x39\x13\x1b\x9d\xed\xe1\xf4\xf8\x26\x1e\xdc\x87\x35\xe6\x1c\x5c\x74\x5f\xfb\x1d\x1e\x47\x32\xcc\x0f\x8f\x6b\x1b\x91\x65\x0f\x4a\xbe\xcb\x65\x46\x84\xc7\xb0\xa9\xe3\x2a\xb7\x61\x52\xf8\xf5\xcd\xd5\x6e\x54\x14\x8d\x8c\xb4\x23\x97\x63\x02\xb5\xa8\x94\x20\xc2\x32\xb0\x5c\x41\x61\x92\xf6\x03\x1a\x21\x54\x2b\x6a\x4c\x32\xed\xb0\x40\x29\xce\x5d\xc3\x29\x21\x42\x45\x71\xa2\x6d\x1b\xd9\xdd\xdf\xae\x33\x51\x54\xa8\x88\xad\xbe\xff\xda\xc6\x80\x95\x38\x0e\x21\x25\xb3\xb6\x2a\x7d\xab\xbc\x3c\x40\xf8\x82\x5b\xb1\x55\x30\xe6\xa8\xb3\x72\x2d\xba\xb2\x42\x0a\xd0\xcf\x58\x53\xd2\x4a\x07\xb8\x54\x82\x68\x6e\xc3\x01\xf3\x0c\x63\x32\x0f\x68\xe0\x67\x9b\x08\xaa\x7e\x1d\x59\x81\x5a\x0c\x77\x7f\xbd\x78\xb8\x14\x14\x79\xc2\x6c\x54\x8f\x8f\xf2\x58\x71\x2a\x89\x28\x92\x30\x60\x4f\x18\xe4\xf9\xc5\x15\x5e\x4d\xc2\x88\x57\x25\x68\xc6\xa5\x92\xa4\x1d\x13\xaa\x70\xd9\x80\x60\x65\xc7\xd6\x8e\xc8\x6c\x51\x11\x12\x0c\x8d\x63\xff\xf2\x2c\x07\xca\x88\x57\x8a\xe6\xa2\xf9\x48\xb8\xaa\xd7\x30\x0a\x32\x59\xa6\xbc\x30\xc8\x4d\x5c\xa4\x02\x96\x20\x42\x08\x1f\x6c\x5d\x7d\xff\x2a\x2b\x37\x45\x71\xc0\x28\xe5\x89\xeb\x93\xa8\xd7\x11\x05\x5c\x88\xad\x8e\xa6\xf2\x58\x67\x8a\x28\x26\xee\x0e\x90\xd8\xcc\x39\x8d\x48\x5d\x6e\xa5\x5a\x60\x1c\xd5\x80\x81\xa7\x0c\x22\x1c\x7b\x5a\xda\x37\x0c\x53\x44\xad\xed\x40\xa5\xb7\xba\xdd\x08\x15\x27\x82\x28\x00\x49\x55\x8a\x32\x4d\x74\x40\x52\x41\x32\x12\x09\x6a\x88\xf0\xd0\xf7\xd9\xa4\x8b\x41\x8b\x22\x23\xba\xe7\xae\xbf\x16\x77\x8f\xeb\xd5\x67\xb6\x69\x4d\x30\x52\x94\x71\x88\x14\x85\x18\x29\x72\x2c\x1b\xd4\x9e\xd8\xda\xf4\x3f\xfa\x58\x9d\x62\xab\x7e\x81\x14\x00\x27\x22\x88\x5a\xe3\x67\x7e\x76\x57\xae\xf9\x98\x61\x93\xe9\xcf\x7c\x2c\xef\x26\x5a\x14\x47\x44\x52\xe5\xd7\x0f\xae\x5f\x9f\x14\x2f\x45\xf1\x6a\x14\x10\xa0\x4c\xf1\xb9\x99\x80\x5b\x07\x3b\x7d\xc0\xda\xc3\x0c\x53\xe5\x3f\xf8\xd1\x27\x47\x2f\x76\x39\xe1\xca\x2d\x85\x1e\x15\x20\x41\x09\x26\xe9\x6e\xbd\x7f\x00\x7e\x7b\x35\x90\x1b\x75\x69\x09\x34\x14\x51\x4d\xa5\xbb\x3b\xf4\xea\x59\xe7\xca\xfe\xd0\x95\x45\xe4\xb4\xc8\xc0\x2b\x8e\x91\xe0\x2e\xc2\xdc\x86\xe3\x72\xf1\x48\x78\x9c\x40\xa0\x83\xf9\x00\x33\xea\x9f\x6b\x55\x3a\xc1\x51\x40\x37\x3d\x77\xa5\x17\xca\xdd\x56\x9a\xf3\xf2\x73\x19\x2d\xbb\x12\x76\xe8\x0f\x88\x20\x5e\xbc\xbd\xc2\x8a\x1d\x48\x4c\x11\x22\x4c\xbb\xbe\x62\x14\x63\x46\x14\x86\xfc\xc1\xed\x47\xbf\x62\xa7\xe6\x0b\x62\x45\xb9\x84\x69\x13\xa1\x70\xe2\xe6\x56\x58\x52\xe6\x61\x52\x93\x54\x62\xec\x1a\x8d\x88\xf0\x6b\xe3\xab\xd7\xf6\xab\x1e\x84\xad\xe4\x63\x9f\x51\x49\x24\x2a\x14\x90\xf0\xa8\x20\x4c\x06\x7d\xb6\xfd\x33\x4f\x4e\x9a\x21\x0d\x1e\xff\x88\x1e\xbc\xde\x4a\xac\xde\x2f\xf7\xa5\x51\xc2\xb0\x92\x3b\x44\x6c\x03\x8d\x85\x89\x31\x42\xe5\xa8\xff\x58\xe5\xdc\xf5\xf8\xd5\x4b\x2d\x2b\xae\x41\x94\x1f\x38\x0e\xbd\xf7\xf9\x7b\x7f\x82\x3b\xe8\x5f\x38\xe0\x6c\x3b\xff\x03\x7c\x18\xbe\xc2\x71\x60\x44\xef\x03\xe0\x45\xd5\x5a\x62\x84\x63\x38\x84\xe9\x09\x58\x80\x60\xe5\xd6\x36\x81\xf5\xe7\x59\x81\xf1\x22\x58\x1f\x2c\xc7\x63\x09\x6b\xa2\xc4\x9b\x6f\x70\x14\xe1\xe6\x60\x3a\xca\xf2\x83\x7c\x32\x1e\x76\x17\xbb\x55\x13\xbb\x74\x33\x8f\xbf\x07\x4b\xcf\x95\x79\xf8\x1b\x1d\xe4\x73\x12\xca\xee\x29\x3f\x65\xde\x50\xc6\xc7\x68\x39\xeb\xeb\xcd\x79\xfc\x76\x60\x57\x76\x61\x4f\xbd\xfc\x16\x6a\xd0\x6d\x18\xbc\x89\x25\x50\xfe\x7f\xdb\xf7\x3d\x68\x41\xf1\x45\x87\x70\x26\xe7\x58\x61\xb9\x79\x7f\x7b\x1e\xa2\xe7\x9a\xda\x0b\x59\x99\xe2\x5f\x94\x26\x65\x7f\x77\xbe\x44\xc6\xd3\xb9\xe5\x4b\xb9\x60\x72\xb6\x0c\xbb\x08\x76\x0f\x76\x3c\x5b\x52\x20\xa6\x19\xf4\xd2\x03\x0c\x70\xf7\x2f\x04\xad\x04\xb9\xf2\x04\x62\x0c\x68\x0e\xa0\x29\x1a\x0c\x92\x2e\xf5\x10\xc2\x80\x22\xd1\x40\xa4\x3d\x4a\xd6\xf3\x14\xc3\xdd\xdf\xc4\xc2\xaf\x6e\x7b\x17\x8d\x2a\x0e\xbf\xd4\xac\x1a\xe6\x5e\x46\x01\x51\x26\x4d\x28\x5b\xc6\x82\x83\xa0\x19\x1f\x93\xd5\xf3\x76\x0b\xb2\xa5\x3b\xa1\x2c\xed\xa0\x00\x10\x63\xa1\xa4\xac\xd2\xaf\x6e\x4d\x4d\xb2\x7a\x51\x06\x1e\xcb\x1a\xd4\x6e\x17\xda\x8e\x30\xc8\x58\x4a\x13\xf9\x49\xef\xe0\xf9\x4d\x9e\x47\xff\xad\x94\x40\x13\x61\x84\x4b\xa5\xa6\x55\xa3\x8a\xeb\x28\xb5\x90\x83\x8b\xfe\x4e\x2d\xd0\x8c\x48\xe2\x56\xaa\x64\xf3\xb9\xbd\x5e\xec\xb1\x8c\x22\xca\x81\x6b\xa6\x84\x5f\xe1\x86\x12\x44\x23\xca\x84\xf0\x2b\xeb\xc9\x41\x9b\x80\xf1\x65\x95\x51\x49\x45\x51\x08\xb0\xe2\x02\x7a\xa4\xea\xd6\xdb\x88\x06\x48\x09\x84\x50\xac\x7c\x82\xf1\x76\x47\xfa\x3e\x3f\xee\x67\x0f\x0c\x1b\xfd\x92\x55\xcb\x25\xcd\xdb\x41\x58\x7c\xf3\x98\xa2\x73\x3d\x5a\xef\x44\x9d\xd8\x08\x77\x6e\xb0\xb2\x68\xda\xb1\x86\x27\x0d\xfc\xf7\x18\xd0\xb7\x16\x81\x5d\xba\xad\x8d\x23\xbd\xda\x08\xa7\x4f\x03\x7e\xff\x73\x7b\xcf\xe7\xae\x45\x8e\xd6\x9a\x0f\x70\x05\x30\x50\x80\xaa\x29\xb1\x99\x76\x57\xa6\xaf\xb7\xde\x97\x05\x11\x6a\xca\x9a\x49\x5d\x9f\x85\x0c\x11\x5e\x3c\x9d\x83\x6a\x2b\xa4\x60\x35\x5e\x6b\xef\xdc\xd9\x75\xdf\x07\x48\x48\x26\x08\x15\x84\x37\xf6\xdb\x57\x1e\x0b\x5a\x6b\xd7\x65\x16\xf3\x1c\x31\x97\xb7\xab\x1b\x93\x48\x03\x72\x11\xa5\x91\x5f\xd9\xb8\xfa\x95\x37\xf4\x66\xeb\x8b\xbf\xe7\xae\xd7\x3b\xd9\xfb\x5a\xaf\xee\xa5\x65\x85\x12\x9a\x88\x89\x3a\xd5\xa2\x28\xd7\x4a\xc5\x9c\xc1\x1e\xbb\xfe\x89\xcb\x1b\xb9\x47\x9f\x3c\x0a\x5b\x43\x3e\x5e\xb1\x01\x09\x53\xad\xdc\x86\xc2\xcb\xba\x06\x33\x11\x48\xad\x85\x5b\x32\x27\x44\xf8\xe0\xc6\xbb\xfe\x72\x38\xda\xae\xaf\x88\x55\xaf\xf8\xf9\x7a\x32\x49\xe5\xb5\x8d\xf6\x2b\x47\xbd\x7d\xfa\xb4\xfb\x52\x63\xbb\xb9\xe2\xfa\x42\x87\xe1\x98\x71\x1c\x2a\x97\x95\xe2\x80\x08\x30\x11\x26\x2c\x50\x26\xc1\x9a\x2a\x36\x17\x71\xa5\xd8\x14\xb1\x4d\x82\xe3\x10\x67\xe7\xde\x2f\xe2\x8b\xe8\x0b\x4e\xe4\xac\x3b\x57\x9d\x57\x17\xfc\x80\xfc\xd4\x2e\x61\x38\x98\x9d\x61\x6f\x5b\x21\x89\xfc\x20\x4b\x87\xd3\xd9\xd4\xb6\x18\x3c\x6c\x65\x08\x86\x83\x71\x01\x2c\x4a\x5d\x90\xee\x70\x30\xf1\x20\x6f\xe1\xf9\x4e\x8f\x7d\x8e\x07\xf0\x0f\x9f\x98\x8c\x5c\x77\x65\xe5\x81\xed\xfd\xcb\x27\x94\xf4\x7a\x33\xd6\xbd\xd8\xef\x13\xda\x5b\x7d\xe4\xe4\xf0\x89\xb5\x55\x8f\xf7\x2f\xbe\x78\x4e\xa8\x6f\xe9\x74\x5e\xf8\xa1\x4f\x76\xea\x82\xad\xdf\xfe\xe8\xc3\xcf\x3e\xf4\xf0\x07\x1e\x8a\xbc\xd6\xf9\x17\x2f\xc6\xbf\xf3\xc2\x2b\x3b\x17\x68\xc0\xd8\xa3\xb3\x5a\x70\xf5\xdd\x5f\xf7\xc4\xd5\xd7\xaf\xc6\x09\xe5\x95\xe6\xe1\x85\x9b\xc8\x45\xaf\xa0\x6b\x57\xdf\xf3\x9e\x67\xde\x92\xfb\x59\xfb\xaf\x3c\xfb\xf4\xed\x5b\x7d\x92\x6f\x3e\xfe\xd8\xf3\x6f\x7b\xf4\xb1\xd5\x56\xda\x7c\xed\xa5\x37\x66\x6f\x7f\x6c\x1b\x1b\xf1\x7c\x66\xba\xe7\x3e\xf9\xf8\xf5\x77\xdd\xfe\x9a\x0f\x3e\xe4\x05\x41\xf0\xd8\x87\xae\x4e\x3f\xf0\xfe\x57\x9e\x6c\x48\x16\x0e\xda\xc7\x8c\x32\x71\xf3\x73\xaf\x1e\xbf\xf3\x56\xdd\x33\xd7\xde\x71\xf1\xe2\xf5\x97\x8e\xef\x5c\x38\x4c\x85\x74\x2c\xaf\xe2\x1e\xfa\x00\xfa\xac\xf3\xac\xf3\x0f\x9d\xcf\x3a\xbf\xef\x38\x7d\xab\x8c\xb2\xb4\xe2\x5b\x8e\x4e\xc7\xa7\x00\x78\x2e\xbb\x6e\xdf\xc8\x92\x25\x31\x3d\x5d\x69\x5c\xc0\xbb\x94\x59\xfc\x38\x3b\x28\x35\x5c\xb3\x9c\x0f\xba\xec\x8c\x53\xe9\x97\x8c\x75\xbb\x25\xf3\x78\x3a\x59\x18\xc0\x8c\xa6\x73\x2a\x60\xf1\xe1\x2e\x4f\x17\x54\x87\x01\x9f\x95\x9d\xe6\x84\xa5\x73\x42\xe9\x10\xdf\xbf\xdf\xc2\x99\x0d\x75\xb3\x2f\x91\xcb\xb3\x53\xb2\x72\xbd\x1c\xce\xd1\x22\x13\x79\x75\x5f\xd8\x62\x9a\x58\x70\x84\x83\x96\x5f\xaf\xb1\xe9\xeb\x83\x35\x79\x7e\x7c\xed\x9b\xde\xfb\x61\x66\x41\x04\x43\x4a\x54\xa3\x4c\xaf\x60\x74\x49\xad\x88\xd2\xc4\x44\x37\x59\x16\x8a\x4b\x6c\xd8\x76\x99\xa9\xae\xaa\x4b\x2c\xc8\xf8\x7a\xe4\x95\xaa\xfa\x48\xb4\x9b\x6c\x03\x70\x9b\x6b\xe9\x51\xe1\xd7\x54\x01\x09\x94\xe0\x8c\xa8\x8f\xbe\xff\xdb\x1e\xde\xbd\x94\x55\x57\x77\x3f\x7d\x51\x35\x13\x8f\x96\x73\x24\x84\x29\x61\x75\xbf\x62\x75\xbc\x48\xe4\x86\xeb\x48\x45\xad\x46\x2d\xe7\x9b\x2e\xef\x55\x3a\x0f\x16\xe8\x4d\x3c\xba\xde\xd9\x16\x22\x69\xbb\x2b\xcd\x4e\xaf\xb2\x4a\x6c\x93\x97\x20\x97\xab\x41\x95\x61\x6b\x0f\x45\x84\xc0\x92\x30\xe1\xd7\x06\xab\x0d\x5f\x52\x22\x48\x8c\xc0\x75\x91\x5f\x19\xae\x7f\xe5\x97\xe5\x2d\x80\x10\x30\x23\xdc\x8e\x50\x4c\xb0\xf2\xee\xdf\xfe\x68\x83\xf0\xe2\xd6\xaa\xac\xf8\x9f\x92\xb7\x31\x28\xb5\x47\x39\x8b\x75\xe0\xba\x1e\x4f\x18\xc5\xd1\x4b\xbf\xf1\x72\x2a\x8a\x37\x25\x70\xb3\x04\x71\x17\x80\x48\x14\xa1\x5e\xfa\xdc\xbb\xdf\xd7\xdf\x6b\xc6\xc8\x57\x08\x84\x5b\x5b\x5d\xad\xca\x22\xdd\x23\xc1\x54\x8d\x27\x80\xb9\x66\x4d\x57\x49\xf8\x56\x8c\x6c\x46\x60\xfd\xab\xed\x91\x09\x10\x79\x51\xe8\x71\xff\xcf\x50\x1a\x5e\x1e\xac\x3d\x54\xd3\x82\x21\x60\xb2\x96\x6f\x9c\xc3\xea\x78\x27\x15\xd2\xba\x26\x33\x67\x7a\x2f\xc0\xef\x40\x9f\x75\x02\x67\xe0\x7c\xc2\xf9\x26\xe7\x47\x9d\x5f\x76\x1c\x98\xeb\x41\x1c\xa3\x72\x7c\x51\x1e\xd2\xe5\x2f\x7c\x4e\x12\x86\xe2\x74\x16\xe7\xa3\xec\x3b\xdb\xb3\xdc\x22\x8b\x69\xa8\x07\x4b\x01\xa0\xd3\x53\xbe\xac\x1d\x87\x3b\xd8\x3a\xbe\x0e\x96\xdb\x50\xbb\x30\xa0\xe5\x05\x98\x1f\x3b\xab\x6c\xd3\x5f\xa0\x81\xe2\xc8\x96\xdd\xc2\x85\x50\xef\x31\xcc\x60\xa1\x3b\x91\xdf\x37\xe0\x18\x32\x78\xee\xe1\x6b\xbe\x7f\xf1\xca\xab\x17\x1e\x5f\xe1\xfa\xf8\xc6\x07\xdd\xd6\x1b\x77\x6e\xb9\xa2\xbf\xb7\x77\xed\xcb\x1f\x7f\x30\xd2\xcd\xe7\xaf\x73\x9f\xa0\xbb\xbf\x86\x03\x4a\x6e\xad\x73\x76\xf9\x2d\x69\x3d\x08\xce\x7f\xf8\xff\x61\x2e\xef\x25\xed\x9a\xb9\x70\x27\xac\xd6\x6a\x57\x67\xdf\xfe\x34\x6b\x37\xe3\xe3\xef\xd8\x03\xe5\x86\xc6\x37\xa6\x83\x80\x0a\x2a\xe2\x95\xce\xe0\xed\x8f\xa8\x24\xd6\xca\x4d\x7a\x95\x60\xdd\xbf\x20\x47\xcd\xed\xc8\x43\x84\xc0\xd5\x9a\xb7\xf5\xc8\xe0\x21\xa0\xac\x51\xdb\x93\xcd\xed\x9d\x94\xc3\x4f\x12\x2d\x38\x43\xd4\xb0\xd9\x8f\x5d\x93\xc6\x93\xd4\x08\x5f\x5e\x78\xa4\x7b\x18\x71\x81\xef\xfe\xfb\x4f\xfd\xe2\x95\x51\xb3\x5a\xf9\xd8\x73\x2f\x3f\xf9\xe4\xd1\x51\x9e\xe7\x7e\x77\x65\xbf\xd2\x23\xe8\x78\xf4\xa3\x4f\x3d\xbf\x73\x50\x0b\xde\xf2\xc6\xd1\x8b\xe3\x0b\x19\xda\x72\x8f\x2f\xbe\xef\xca\xd7\x4c\xc6\x51\xe7\x78\xf6\xda\x95\xaf\xff\xca\x3e\xa1\x9c\x7c\xf1\x83\x01\xea\x68\x40\xd5\xb7\x5d\x7e\xf4\xc5\x17\xee\x7c\x37\xd6\x08\x18\xe1\x8a\x75\xbe\xfc\xfa\x7b\x9e\x7f\xee\xf2\xe4\x08\xd3\x3c\x13\x8d\xca\x0e\x84\x19\xc1\x84\x88\xa4\xc2\x8d\xaf\xdc\x95\x5e\xaf\xfa\xc0\x36\x0f\x32\xcf\x8b\x6a\x0d\x8c\x38\x32\xa0\x00\x22\x2f\x67\x9a\xa6\xa2\x96\xaa\x15\x49\x19\x80\x44\x54\x0a\x0c\x31\xe7\x45\xa9\x26\x52\x36\x69\x34\x95\x9f\xb8\xcc\x97\x2e\xe9\x4e\xb2\x4b\x2d\x13\x50\xf4\xbf\x88\xe3\x67\xaf\xfd\xd0\xcd\x3b\xaf\x70\x5e\x6f\x9c\xbf\xf0\xe8\x63\x2f\x9f\x4c\xc6\x35\x97\x43\xb9\xdf\xf4\x47\xf7\xfe\x29\xfa\x73\xf4\x6f\x9d\x77\x39\xff\xc1\xf9\x63\xe0\x8e\xd3\xef\xee\x42\x77\x68\x87\xe3\x73\xcf\x8e\xb3\xfd\x80\xf9\x41\x78\x53\xa1\xba\xa8\xe4\xe7\x71\x31\xf1\x20\xe5\xf7\xf7\x90\xe7\xfc\xd4\xd1\x34\xb7\xed\xf3\xc1\x64\x3c\x1c\x9d\x96\xc1\x9c\xf1\x26\x24\xa7\xca\xc6\x6c\xd8\xeb\x9e\x86\xe6\xfb\xf8\xa5\x8b\x4e\x15\x8c\xcf\xf8\xbd\xbe\xc9\x65\x21\xff\x12\xea\xcb\xd9\x2a\x9c\x97\x25\x38\x9e\x8e\xb2\xd9\x74\x07\x86\x6c\x58\x4a\xed\x0c\x17\x62\x5a\xb3\x72\x1b\xe3\x88\xb0\xc8\x2a\x89\xe1\xcc\xd7\x8a\xf2\xca\xd6\x6a\x25\x55\x91\xcb\x46\xfb\xa2\xbd\xb2\xb6\x5e\x73\x19\x46\x01\x63\x5e\xaa\x5f\x19\x75\x22\xb3\xbd\xa6\x42\xa9\xea\x95\xcb\x9d\xbd\x17\xde\x3f\xe9\xf7\x25\x22\x80\xe8\xb8\xeb\x49\x4e\x84\x8e\xae\xc8\x0e\xc1\x45\x59\x6a\x7a\x87\x4c\x74\x2e\x74\x23\x41\xa1\x86\x23\x6d\xfb\x5e\x0c\xdb\xd6\x11\xa2\xcc\x17\x5e\xba\x9a\x0c\x06\xe8\xc2\x5e\xce\x04\xa5\x0c\x11\x2a\x9a\x4d\xbe\xed\x6a\x41\xb8\x90\xc9\x7a\x5f\x28\xe4\x5a\x41\xf7\xa2\x12\x39\x18\x9e\xff\xd0\x68\x7f\xd4\xbf\x55\xeb\xb8\x6e\xc7\xdf\x6b\x33\x55\xd9\x7e\x9a\x06\x89\x4e\x5c\x83\x71\xa0\xc3\xf6\xf6\xe6\xea\x66\x70\x6e\x2a\xfd\x50\x05\x51\x98\x15\x15\xbe\x16\x39\xe3\x6f\x1f\xb6\x1a\x2f\x9d\x07\xf5\xe0\xc7\xe2\x64\x77\xf4\x86\xa0\x4c\x0b\x0d\x42\x8f\x6d\x79\x6c\x36\x7b\xcf\x75\xb7\x75\xda\x4e\xf7\x6a\xb3\x2d\xf5\x54\x9f\x62\x44\x88\x24\x14\xc9\x35\xbb\xc9\xb7\xf9\xc6\xcd\x41\x3d\xf4\x55\xbc\x39\xe9\xb6\x27\x26\xca\x11\x30\x2a\xb0\x40\x18\x83\x09\x2f\xe4\xc7\xe3\x1b\xdf\x7e\xe1\xad\x99\xed\x04\x13\x44\x8a\x20\x8a\x91\x20\x78\x77\x5e\x7c\xab\xd0\x56\xe9\x04\xbb\x4a\x51\x5c\x2a\x92\x2a\x24\x99\x50\xc2\x57\x21\x25\xd8\xbb\x31\xf9\xe6\xeb\x07\xd3\x60\xa5\x4e\xc1\xf5\x15\x00\xa3\x88\x2a\x5f\x84\x45\x64\x36\x26\xf6\x8e\xba\x1b\x17\x4f\x56\x82\xc8\xb8\xf9\xec\x9d\x83\xe2\x35\xc9\x95\x76\x1c\x68\xc1\x14\x25\x08\xbb\xeb\xcf\x7b\x7b\xd3\xca\x9a\xef\x2b\x5c\x69\x3d\xd6\xae\xc0\x79\xc2\x56\x9b\x2f\x3f\x42\xa6\x6f\x7d\xf9\xf8\xc6\xd6\x1e\xe7\x4a\x8b\x7f\xb3\xa9\x18\x08\xed\x20\x07\xee\xfd\x23\x34\x41\x7f\xe8\x3c\xe7\xfc\x03\xc7\x81\xb9\x2e\x26\xcf\xca\x03\x95\xde\x77\x8c\xf8\x5c\xcc\xbc\x2c\x6f\x4e\xf9\x8f\xa7\xec\xc6\x85\xae\xe1\x9b\x45\xb9\xf2\x2c\x9e\xd7\x4d\xa7\xa6\xc9\x7c\xce\xbe\x2e\xbd\x77\x4a\xc9\xfc\x53\x2a\x59\xf1\x59\x4d\x58\x5e\x3f\x5b\x7f\x59\x10\x77\xff\xe5\x84\xdf\x05\xe4\x06\xc2\x2e\x96\x32\x01\x5c\x42\x54\xcb\x12\xae\x88\xa9\xaf\x5e\xd9\x4f\x9a\x82\x67\x95\x93\xc9\x5a\xff\x52\x7a\x51\xaa\xe9\xf4\xbd\x6f\x79\xfd\xa9\xf5\x26\xb2\x82\xac\x5b\x41\x22\x04\xf5\x2f\x5c\xde\x25\xee\x96\xb7\x65\xd8\xe6\xcb\x83\x63\x97\xaf\x0d\x8f\x2e\x1c\x9f\x9c\x3f\xb8\x00\x4c\x22\xc1\x46\xa3\xbd\x73\xb3\xf1\xb8\xbb\xc2\xf4\x5e\xfb\x19\x64\x02\xa2\x43\x1a\x33\x8f\xbb\xec\x38\xe0\x97\x36\x37\xd7\xd7\x52\x2d\x98\xf1\x7d\x04\xb5\xce\xf1\x3b\x9f\x7a\x69\x6b\x5b\x8a\x83\x68\xdc\x1f\xac\x6e\x1e\x25\xab\x46\xaf\xb7\x4e\x1e\xde\xee\x07\x54\x51\x8e\xd0\x0f\x70\x21\xb0\x2b\xc2\x98\xb1\x4b\x63\x16\x66\x5e\x5d\xb9\xbe\xb7\x39\x36\xbd\xb8\x8a\x90\x97\xd5\x1b\x95\x5a\xcd\x95\xaa\x9d\x1c\xbe\xf8\xfa\xf5\x6b\x95\x44\xb0\xc7\x0e\x9f\xa9\x6b\xe1\x31\x5f\x06\xe9\x68\x4f\xd7\x12\xb3\xde\x78\xb4\xab\x42\x8c\x74\x65\xf5\xc2\x97\x5f\xdc\xdf\x6f\xb7\x38\x8f\xc2\xbb\x7f\x84\x10\xf7\x32\x75\xfe\xca\x34\x0a\x38\xab\xd7\x37\xd6\x0f\x5e\xdd\x6a\xa5\xd6\xd3\x80\x20\x86\x39\x16\x74\xf7\x5d\x1b\xe7\xa4\xf0\xbd\x7e\x3c\x1d\xba\xbe\xa0\xbc\xfa\xd0\xf8\x98\xf0\x38\x3d\x7f\xe1\x85\x47\xf7\xc3\xaa\x92\xd2\xac\x64\x6b\xbb\xeb\xcd\x0c\xe1\x76\x6d\xc7\x9f\x35\x08\x72\x4a\xbe\xff\x1f\xa1\x4f\xa3\x5f\x77\xbe\x13\x22\xc7\x99\x3b\xda\xfb\x88\x25\x3d\x7e\xc6\xa1\x7e\x41\x34\x9a\xd9\x45\xb3\x16\x3e\x13\x45\xcb\x5e\xe3\x69\x5b\xf1\x34\xb0\xcd\x0d\xde\x78\x92\xb7\x90\x2d\x67\x93\x52\xe1\xa4\xd7\xe5\x9b\xa4\xbb\x74\x5d\x3a\xcb\xbb\x3f\x44\xd6\xda\xb4\xcc\xde\x73\xa1\xd5\x61\xc6\xad\xf7\x42\xf9\xdd\x32\xeb\x4a\xe3\x41\xca\xe6\x51\xd2\x7e\xd7\x02\xa6\x2e\xbd\x58\x47\xb3\xe9\x21\x9d\xd8\x6a\xbf\xd7\x65\xdd\x72\xa2\x37\x99\x2e\x24\x8e\xe7\x14\xc6\xe2\xe7\x19\xef\x80\xfd\xe1\x2e\x2e\x68\xc2\xc5\x49\xcc\x7e\x07\xbb\xec\xd5\x73\xa0\xca\x06\x1f\x96\xb2\x74\xe4\x03\x4a\x80\x48\xd0\x18\x90\xcb\x47\x5f\x75\xe3\x87\xb2\x3b\xac\x15\x1b\x61\x18\x46\xe5\xd0\x1f\x63\x3f\x5b\x0b\xb8\x55\x65\x20\xf5\x86\xbb\x2a\x3b\xbe\x06\x42\xfd\x5a\xd4\x74\x3d\x06\x80\xa5\x44\x08\xab\x46\x1c\x49\x3a\xb8\xbc\x56\x29\x22\xc3\xdc\x61\xb4\x40\xac\x26\x0f\xc2\x36\x2d\xea\x6d\x4c\xa1\x66\x3b\x2b\x3f\x27\xd0\xf1\x5b\x65\x18\x0a\x4e\x4b\x06\x3e\xab\xc1\xdc\xc4\xc5\x3b\x1f\x85\x92\x00\xc2\x08\x18\xcf\x86\x97\x07\x54\x46\x71\x1d\x59\xd7\x28\x88\x54\xe2\x86\xac\xc0\xb5\x3a\x5a\x0f\xc6\xc9\x63\xc6\x56\xeb\xda\x8a\xd3\xcd\xed\x72\xc2\x3a\xbb\xd3\xbe\xf1\xe8\x83\x9f\x18\x01\x7a\x07\xca\xdf\x0b\xb9\x4f\xad\x17\x0a\x25\x54\x53\x81\x18\x01\x91\x05\x6a\xe3\x43\x2e\x63\x4c\x48\x90\xa6\xe4\xb1\x13\x84\xa9\x60\xc2\xa8\x90\x26\x06\x11\x2f\x15\x1b\xcd\xad\xbc\x6b\x48\xac\x22\xbe\xed\xae\x6d\x62\xa4\x45\xf3\xc6\xe8\x93\x27\x9b\x3b\x19\xc6\x28\x08\xd7\x81\x32\xe2\x0b\x5a\x6e\xfb\xa1\xe2\xe9\x98\x2a\xe5\x0a\x46\x38\xe6\x10\x12\xaa\xc2\xc4\x04\xe4\xe3\x3f\x84\xf3\xae\xd7\xf0\xee\xbc\x7d\xfd\x89\xac\x88\x80\xb8\x88\xb5\x7e\x58\xf7\xba\x19\xf9\xfe\x8f\xd0\xbe\x88\xb5\xa0\x82\x6d\x5a\x0e\x92\xe2\xa5\xfe\x25\xe1\x28\x2d\xd0\x2d\x33\x32\x3e\xb7\x7d\xf9\x6b\xa7\x4f\xf4\x3d\x1f\xa9\xf7\xbb\xdb\x45\x29\xab\xfc\x6e\x6d\x4d\x64\xbe\xf0\x62\x66\x0b\x07\x8c\xac\xf4\x91\x16\xe5\xf9\xff\x53\x87\x62\x17\xfd\xa2\xf3\x82\xf3\x59\xc7\x81\xa5\xf1\x78\x13\x1d\xcc\x03\xdf\x82\xdf\x7a\x4a\xa1\xb0\xf4\xbb\x53\x51\x00\xcb\x00\xec\xfa\x90\xce\xe7\x15\xa7\x2b\xf8\x67\xad\xaf\xc6\xb3\xfe\x3c\xbe\x1d\xc2\xc1\xe9\x3c\x62\xa9\x00\x7f\xba\x49\x77\x02\x45\xfd\x3b\x27\x76\x4c\xcf\x70\x12\x17\xe2\x04\x6f\x22\x67\xb0\xe1\x0e\x4c\xc6\x67\x60\x4c\xe9\xcd\x06\xb7\x44\xb4\xd1\x49\x2e\x6f\xec\x35\x10\xaa\xf0\x49\xa8\xb1\xa8\xe4\x27\x4f\x3d\x7b\xed\xf5\xd4\x20\x0c\xd8\x73\xf3\xd8\x47\xbe\xe0\x18\x71\xb7\xcd\xd2\x50\x98\x4e\x4d\x11\x04\x9d\x40\x16\x29\xcc\xed\xe1\x70\x65\xff\xf1\x4b\xc3\xb6\x91\xc2\x93\xa1\x4e\x54\x51\xf2\xdc\xfd\x05\xed\xa5\x07\x1b\x17\x93\xce\x7a\xaa\x05\xd1\xd4\x8a\x25\xba\x32\x76\xa9\x62\x46\x48\x5d\x6f\x6e\x1f\xae\x36\xfd\x34\x74\x2d\x47\x3d\x89\xa4\x62\x4c\xa7\x5e\xab\x25\x78\x90\xb1\x61\xd2\x64\x34\xf6\x2b\x28\x90\xd4\x65\x0a\x01\x46\x5e\xf6\x89\x27\x5f\x7d\xe9\xf6\x8c\x23\x69\x5a\x34\xad\x48\x0e\x00\x42\x50\xf4\x49\xbb\xe1\xeb\x12\x6b\xd0\x6e\xae\xac\xbf\xf8\xe1\xca\x8d\xd1\xc1\xea\xbe\x12\x1f\xb9\xb3\x7d\xe7\xcb\xa2\xad\x6a\xaa\x39\x61\x82\x7b\x06\x97\xa6\x30\xc5\xeb\xa6\xa1\xcc\x7d\x6f\xf7\x6d\x7f\x3d\x7c\xf2\xe0\x16\x67\x97\xc7\x4f\x3d\xf2\x37\x77\xda\x81\xe2\x04\xd3\x90\xd0\x2b\x46\x96\x2e\x72\x50\x54\x38\x3e\x62\x18\xb5\x7c\xc5\x29\x15\xe9\xe6\x37\xdc\x79\x68\x67\x8f\xd0\xd9\xe6\xc3\xcf\x5f\x7f\x6e\x4b\xb9\x1e\x01\xd0\x66\x47\x04\x96\xf6\x83\x00\x73\xd5\xeb\xa4\x81\xa0\x18\x51\x13\xf4\xdc\x0f\x3d\x7e\xf0\xd4\xd7\x2b\x3d\xdd\xfc\xe8\x23\xad\x0f\x3e\x35\xd8\xe6\xc5\xc5\x74\xb3\x90\x08\x17\x95\x5a\xf1\xbf\x76\xef\xf3\xe8\x5f\xa2\x7f\xed\xbc\xee\xfc\x87\x85\xbe\x26\x67\xc3\x26\x62\x79\x9a\x8d\x96\xfd\x49\x9b\x7a\xef\x1f\x5e\x5d\xb4\x1b\x53\xdd\xe2\x1f\xee\xa1\xee\x0e\x6c\x02\xcb\x93\xb3\x74\x86\xfb\x54\x39\x97\x27\xc6\xea\x92\xc4\x73\x99\x08\x34\x3d\x41\x67\xf0\x6d\x7e\x90\x8d\xec\x52\xff\x62\x62\xf3\x5f\x1b\xb0\x96\x49\x7e\xf7\xd4\xa8\x6d\x32\x98\x4c\x2f\xa2\x79\xf0\xcf\x96\x69\x3a\x5d\x18\x6e\x9e\x49\xdb\x2e\xc2\x9e\xec\xbc\x7c\x67\x1d\x80\x84\xdd\x68\x38\xeb\x37\xcc\x33\x55\x3b\x96\x06\x82\x08\xca\x37\x37\xf7\xb6\x2f\x98\x86\xb1\x2e\xbd\x88\xe9\xa8\xe3\x6d\xd4\x95\x6b\x90\xa4\x08\x90\x0a\x64\x40\x11\x25\xc2\xab\x34\x6b\xda\x92\x95\x09\x66\x32\x4b\x95\x09\x04\x9a\x34\x32\xc2\xab\x51\xef\xbd\x08\xd1\xe2\x06\xd7\x1b\x55\x57\xa3\x72\xf0\x18\x52\x96\xfa\x35\x16\x10\x56\x5b\xf7\x3a\x49\x11\x96\x23\x46\x2b\xcd\x18\x8f\xd6\xf6\xd6\x37\xb2\xa2\x0c\x67\xda\x73\x13\x81\x30\xaa\x3f\x61\x9a\xab\x93\x15\x9e\x76\xfd\xf2\x1c\x14\xe1\xc3\xe3\x1b\x8f\xbd\x7d\xb5\x95\xdb\x51\x01\x13\x81\x54\xa1\x70\x09\x4d\x6a\x13\x24\x25\x63\xe8\x1b\x38\xab\x02\xe1\x4c\x7a\xc6\xf5\x38\x42\x10\xf4\x3e\xf2\xd8\x49\xfe\x83\x27\xc4\x75\x11\x46\xa2\x36\x94\x6f\x7d\xfd\xbd\xcf\x3e\x3e\xe4\xc4\x6e\x3a\x90\x52\x98\xd5\xca\x71\x59\xbb\x78\xaa\x12\x99\x78\x95\xb5\xe3\xeb\x97\x6a\x12\xe9\x84\x85\x2a\x62\x5e\xae\xf3\x5e\x8c\x5f\xbc\x79\x61\x6d\xda\xc8\xee\x3e\xc5\x75\xc5\x27\xaa\xf6\xc0\xb5\x93\x7e\xcf\xce\x5f\x30\x16\x71\x23\x76\xe7\x4e\xe8\x08\xab\x66\xb3\x85\x11\xee\x3e\xf8\xf4\x7b\x5e\x7b\x8e\xf6\xbb\xbe\xe2\x82\xf2\x3a\x0f\xc9\xf5\xef\xcc\x2f\x3f\xf6\xc1\x26\x03\xf0\xa8\x22\x4c\x04\x44\xb8\xa1\x60\x94\x0a\x81\xad\x31\xd4\xa6\xe7\x72\xc6\x05\x15\x22\x18\xac\x4e\xae\xbe\x80\xd3\xcc\xe8\xe2\x8c\xfe\xf6\xbd\x7f\x8d\x3f\x8f\xfe\x8d\xf3\x4b\xf0\xf7\x1c\x27\x5e\xe0\xb4\xc4\x32\xc9\x4a\x50\x58\x9c\x52\x1b\xf9\xc6\xa7\xb2\x65\x99\x55\x48\x29\xf2\xe9\xf4\xbe\xb9\xeb\x7c\xff\x66\x74\x60\xf9\xc9\x96\x52\x6c\x39\x44\xe5\x09\x5b\x90\x0d\x51\xf1\xdf\x45\x32\x5f\x68\xe2\x2c\x0f\xdc\x9c\x87\x6d\xd9\xdc\xf6\x7c\xf5\x58\x8f\x27\x7c\xd4\x2a\xb9\x3c\x2d\x54\x7c\x6d\x3e\x6f\x8c\x9f\x39\xf4\xb6\x2f\x8e\x16\x03\xe2\xe9\x9b\x90\xea\x19\xeb\x99\x33\xa7\x9d\x7b\xf7\x0f\x39\x17\x9b\xf7\xa8\x14\x4d\xe1\x2c\xe5\x0b\xdd\xa8\xf9\x07\x26\xcb\x8f\x0f\xca\xd0\x5f\xd4\x58\x6f\xa2\x37\x64\x67\x91\x70\xf9\xe6\x0d\x66\xc7\xf8\xec\xc5\x3a\xb3\xdb\x60\x79\xde\x87\xe8\x20\x5f\x26\x86\x7c\xc9\x56\xdf\x85\x01\xe3\x65\x02\x6a\xc3\xbf\x47\x58\xf8\xf5\x9d\x95\xb7\xe0\x5a\xda\xeb\xa5\xdd\x8e\xbc\x12\x14\xf9\x9e\x10\xea\xa5\x33\xeb\x0b\x20\x25\x97\x6e\xbd\x7b\x11\x18\xd3\xd4\xea\x64\x93\xee\x86\xcc\xa2\x38\xd1\x66\x37\xaf\x2a\x4a\xec\xf2\x48\x91\x34\xa3\x95\xec\x12\x66\xd4\x25\x1e\x02\x90\x99\xf4\x29\xeb\xb1\x4a\xc0\xd6\x35\x20\x12\xc9\x22\xd7\x63\x12\xa5\xd5\x86\x2f\x8a\xaf\x30\x1b\xbd\xb6\xbd\xb3\xbd\xd7\x2e\xaf\xe7\x6e\xd9\xfd\xa7\xc0\x49\x27\x94\x12\x34\x4b\x11\x40\x1c\x04\x5c\xaa\xa0\x6a\x70\x35\x72\x29\x13\xd2\xe7\x1e\xc0\xf7\x9a\x1e\x93\x69\xd8\xa6\x98\x22\x95\x72\x5f\xab\x15\x12\x28\xea\xca\xed\x4a\x37\x31\x56\xcf\x44\x12\x44\x98\xf2\x8a\xff\x16\x2c\x59\xd7\x26\x0e\xa3\x2a\xdb\xec\x21\x42\x5c\x5d\x33\x9e\x66\xbc\x28\xa9\x0e\x7b\x80\x28\xe5\xb3\xd4\x17\xc5\xdb\xeb\x7b\x8c\x2a\xcb\xbc\x41\xde\x15\xd5\x69\xa6\xd5\x54\x85\x46\x84\x42\xb8\x5a\xe0\x71\xea\xad\xed\x37\x62\x13\x16\xb1\x5e\x88\x40\x20\x6b\x22\x68\x82\x2a\x71\x73\x53\x94\x16\x29\x55\x88\x49\x1d\x63\x22\x3d\x6e\x89\xdb\x44\x10\x6a\x85\x1d\xf2\x8d\xcb\xaf\xad\x5a\x9d\x42\x24\x18\x42\xc4\x86\x7e\xed\x52\x4a\x93\x1d\x86\xb0\x08\x6a\x3b\xe8\x07\x4b\xe0\x06\xb0\x11\x28\x22\xf6\x5a\x8f\xbc\x3d\xfd\x81\xeb\xd2\xcb\x43\x2d\xdd\xee\xd1\xf7\x22\xaa\x49\x16\x54\x8c\xa2\xcc\x8f\x38\xfc\x9d\xbf\x8b\x6a\x59\x83\x02\xf1\x6a\xe2\xd6\x6b\xd9\xad\x4b\xab\xc3\x38\xb9\x94\x24\x02\x21\x04\x5c\x1b\x4b\x15\xb5\x6b\x15\x18\x30\x77\xe3\x95\x8d\xf3\xaa\x5f\x37\xcf\x0c\x8a\x3a\x95\x2a\xc6\x0a\xdc\x45\x44\x7f\xe7\xe4\xc6\x66\x2d\x94\x5c\xb1\xae\xab\x05\x20\x63\x99\x8f\x82\xd1\x02\xd9\x04\x6b\x95\xfd\xee\xb9\xf4\x12\xc7\xf5\x15\x57\x19\x66\xc2\xde\xf9\x36\x3d\xd8\xee\xe6\x9d\x28\x91\x04\x13\x29\xd9\xdd\xaf\xeb\xde\xf4\xfc\x6e\x7d\xd4\x0d\x19\xc6\x9c\x07\x8d\x8a\x2c\x7e\xaf\x54\x5b\x94\x4b\x78\xd8\xf5\x4c\xc0\x75\x11\x62\x31\x0d\xce\x27\x49\x7f\xe5\xe8\xf1\xf0\xbd\xb7\x49\x56\x31\x86\x48\x5d\x0b\xaa\xd4\x50\xf8\xae\xbf\x4d\x88\x97\xe6\xf0\x7d\x47\xbd\xd4\x18\x81\x99\x4b\x65\xd4\x26\x42\x62\x23\xae\x7c\x6f\xed\xa5\x9b\x8d\x55\x82\x18\x8d\xc2\xcb\x1e\x11\x76\x9a\x8b\x09\x37\xaa\x56\x31\x9a\x14\x50\x98\xa5\x71\x67\x73\x97\xaf\xcc\x6a\x5e\xc3\xf0\xcb\xe1\xa8\xbe\x91\xd4\x94\xdd\xa2\xa4\x5c\x08\xa9\x84\xbb\x54\x2a\x24\x92\x72\x1d\xf8\x86\x13\x43\x39\x45\x8c\x50\xcf\x07\x22\xbc\xea\xf6\x03\xaf\x3b\xe4\xde\x5f\xdc\xfb\x33\xf4\x7f\xa3\x5f\x73\xbe\xc1\xf9\x46\xe7\xa7\xe0\xfb\x6d\x9e\xed\x9d\x76\x09\x8b\x7b\xcf\xdb\xe8\xb4\xab\x62\x45\x37\xca\x32\xb4\x14\x69\x9b\xf7\x64\x26\xbd\xc1\x62\xc8\x36\xe7\x80\xcc\xa6\xf9\xa8\x88\x62\x93\xb2\x30\xea\x95\x83\x43\xe6\xc3\xd2\x48\x7a\x41\x59\x59\x26\xd9\x63\x66\xc1\x21\x9e\xce\x86\x7c\xd1\xf9\x99\x4d\x67\x8c\x7b\xb8\x57\x84\x84\xa4\xa8\x62\x16\xb4\xc7\xd9\x68\x32\xb8\x08\xc3\x6c\xae\xf0\x9f\x66\x4d\x94\x2c\x23\x94\x5d\xc6\x58\xd8\xd3\x9e\x06\xd6\xd9\xb2\xc2\x9a\x4d\xf3\xc9\x78\x3a\x2a\x47\x1d\x67\x58\x94\xde\x3c\x66\x8f\x97\x5c\x91\x61\x69\x67\xb5\x5b\x00\xc5\xc9\x99\x9d\xe8\x51\x36\x5b\x0c\x38\x17\x6b\x8c\x67\x54\x75\x17\x41\xcc\x62\x94\x91\x85\xae\xd9\x7d\xbc\x95\x92\x15\xbe\x70\xf7\xb4\x91\x70\x41\x01\x2b\x5f\xcf\x5c\xe1\x64\xa1\xa9\x06\xd7\x29\xef\xac\x9c\x6b\xbc\xc8\xbb\xf5\xdd\x0b\x57\x42\xce\x14\xc9\x9b\xd5\x20\x61\x84\xbb\x8c\xba\xd2\xa8\x04\x10\xe6\x8d\xf1\xf5\x48\x4f\xfa\xb1\x55\x96\x02\x2a\xf2\xaa\xc9\x0c\xe5\x98\x09\xfc\x61\x9f\x9d\x9f\x5e\x54\x35\x6d\x25\x25\x2b\x7e\x9e\xd2\x2b\x2b\xbc\x42\x10\xc6\x98\x07\x22\x16\xae\x11\xb1\x4e\x53\x20\x2c\x71\x7d\xa9\xc2\x24\x36\x1e\x02\x26\xa5\xcb\x0d\x28\xc0\x7c\x2f\x0b\xe5\x1a\x26\x95\xdc\xad\x12\x1c\x23\xbc\xd2\x61\xb1\x49\x51\x6a\x8f\x3f\x96\x2d\x78\x32\xa0\xfd\x5c\x11\x74\x81\xba\x75\x56\x75\x4b\xdb\x4f\xca\x3c\xa2\xfc\x23\xe6\x3f\x81\x39\xd5\x15\x3f\x28\x0a\x99\x6d\x16\x11\x45\xf1\x93\x2f\xe5\x97\x67\x9b\xf1\xb0\x23\x38\x22\x81\x12\x6a\xef\x46\xfd\x7c\x37\xf5\x22\x69\xa4\x6b\x64\x05\x70\x28\x91\xd2\x51\xe8\x73\xa0\x9c\x24\x2d\x9f\xe1\xe2\xd5\x07\x22\xa1\xd6\x23\x8b\x23\x44\x99\x9f\xc7\xa8\x73\x89\x24\x55\xaf\xea\x2b\xa6\xf9\xdc\x47\xac\xb8\x11\x5e\x2d\x26\x07\xbb\x7b\xd4\x7b\xad\x08\x51\xd6\x09\x46\x55\xba\x92\x29\x56\x3a\x86\x23\xa6\xd3\x7c\x6b\x2c\xfd\x6b\xe7\x57\xea\xd6\xc1\xb1\xe4\x85\x60\x26\x0c\x91\x3e\xe3\x0c\xfb\x87\x88\xb8\xdb\x59\x6e\x0c\xa0\x1f\xb5\x5b\x09\x12\xbc\xda\xce\x5b\xdf\x9b\x11\x61\x1a\xdd\x4e\xdc\x32\x22\x5b\x4b\x3c\x46\x10\x70\x26\xdc\xe2\x29\x0c\x13\xb0\x3b\x0e\x2a\x0a\x0a\x24\x0c\x0c\x73\x22\x34\xf9\xba\xbf\x79\x7c\x7c\x18\x62\x84\xa4\xab\x45\x01\xe0\x11\x12\x00\x54\x4a\x00\xec\x25\x8d\x28\x73\xd3\x0c\xc5\x4d\x4e\x24\xd3\x71\xbb\xd9\xec\x84\xd2\x53\x9c\x21\x42\x00\xc2\xbb\xef\x8a\xb8\xfe\x57\x8c\x62\x56\xcf\x57\x08\xe9\xd4\xa8\x20\x94\x29\x65\x47\xa6\x96\x90\xc9\x8a\x4f\x83\xac\x5f\xc4\x42\x8f\x72\xce\x54\x46\x80\x61\x5f\x5b\x21\x60\x53\xc2\x20\xdd\x0c\xfd\xae\x0b\x04\x08\xc2\x57\x3e\xd2\x7a\xf7\xb3\x1b\x51\x2c\x91\x2b\x02\x04\xc2\x00\xe1\xc8\x16\x87\x84\xa6\x9d\xd8\x13\xc0\x98\x97\x57\x1b\x8d\x80\x03\xd4\x25\x8f\x3b\xb1\x11\x16\x5c\x91\x98\x5b\xff\x10\x21\x43\x8a\x39\x16\x45\xb0\x47\x36\x15\x30\xc2\x30\x26\x4c\xfb\x9e\x66\x54\x12\x8d\x10\xf8\xa3\xf1\xc1\xd7\x7c\x14\x31\xc5\x70\x39\x1d\xc6\x94\x14\xa5\x71\x14\xe7\x7e\x0d\x61\xc6\x81\x10\xce\x3c\xc2\x50\xf1\x85\xcd\xe2\x97\x43\x81\x62\xbb\x6a\x0d\x3a\x8d\x69\xeb\x3a\x02\xda\xab\x54\xb3\xc4\xfa\x3a\xde\xfb\xa7\xf7\x7e\x09\xdd\x43\x3f\xef\x7c\x0a\xce\x9d\x32\xe2\x9a\x70\x90\xb7\xe0\xfe\xb6\xaf\xbd\x43\x09\xcf\xf2\xd1\xb4\x04\x09\xc5\x35\x9b\x8c\x86\xf3\x95\xb2\xe2\xc2\x9d\xa0\xe2\xfe\xf5\xba\x1e\xf4\x98\x7d\xce\x9c\xff\x70\x1f\xdc\xe9\x5a\x70\xbf\x8b\xce\x50\x16\xe6\x90\x2b\xce\x4e\xe5\x9d\xb9\x5d\x23\x19\x5a\x59\x54\x8b\xc1\xd8\x26\x2c\xf6\x40\x27\x4b\x19\x84\xe5\x94\xf6\x8c\x52\xd1\x42\x78\x18\x0d\x6c\x2b\xe7\x7e\xbb\xbf\xb2\xdc\xb0\xaf\x2d\x59\x00\xa3\x33\x13\xc5\xc9\x59\xc0\x96\x97\x1b\x80\x8b\x97\xd4\x84\xe4\xac\x5d\xf7\x22\x2e\x41\x9d\xeb\xac\x7f\xe9\xe6\x53\x98\xf0\x26\xbb\x5a\xd9\xba\x70\x2e\xd0\x45\x24\x70\x2b\x4d\x2f\xb6\x34\xca\x00\x11\xfa\x8e\xf6\xfa\x0e\x46\x04\x01\xd1\x81\x0a\x68\xf3\xe5\xf5\xdb\x7b\x6a\xb3\x4e\x10\x18\x66\x14\xd4\x9e\xbe\xde\xa2\x24\x2f\xee\x39\x45\xa2\x28\x3f\xb8\x9f\x57\x12\x23\x3d\x8f\xda\x19\x3a\x09\x0f\x5a\x91\x2a\x7e\xbd\xb9\x5f\x07\x64\xb9\x0f\x3f\x84\x68\x20\x22\x49\xed\x0a\x00\x62\x98\x08\x97\x0b\x2e\x61\x67\x58\x7f\x1b\x00\xc1\x89\x27\x43\x56\xc0\x7e\xa2\xb5\x2f\x54\x40\xa4\x21\x04\x88\xf4\x27\x93\x61\x70\xc8\x5a\x4c\x31\x43\x4b\xe2\xa4\x16\x14\xbf\xe5\x91\x4b\x83\xdc\xe5\x54\x50\x65\x55\x8b\x25\x22\x9e\x47\xb5\x4f\x65\x91\xfe\xc3\x56\xa5\x62\x18\x4f\xb2\xcc\xe3\xb6\xc2\xcd\x8c\xa6\x9a\x10\x5f\xc7\xdd\x5b\x4f\x56\x40\xbb\xcc\x95\x01\xd7\x65\xc1\xc1\x6d\x37\x89\xd7\x87\x74\xbb\xd7\x1b\xbe\xa5\x02\xe8\x3b\x8a\x1b\x13\x66\x00\x18\x44\xd8\x7e\xf6\xa9\x69\xef\xf6\xb0\xbe\xea\xd5\x31\xd2\x26\x85\xa0\xb8\xd8\xb2\x6e\x64\x62\x0c\x05\x22\xb2\xf7\xfd\xc8\xcd\xf7\xf4\x79\xac\x91\xb2\x2b\x1a\x88\x01\xa8\xf2\x36\xa9\x96\x8e\xbc\x64\xb0\xbd\xd3\x0a\xa5\x6f\xe9\x05\x88\xa6\x57\x36\xdb\xb1\x1b\x99\xf5\x50\x01\x13\x84\x72\x80\x2f\xfe\x4b\x7b\x39\x12\x95\x79\x99\x97\x02\xf5\xb9\x26\x14\x90\xcb\x9b\x82\x15\x1f\x70\xb5\x47\x38\xec\x79\xa6\x88\xcb\xe0\x92\xbd\xd5\xeb\x9d\xfd\x47\x1e\xab\x1b\x6e\xb5\x1c\xb0\x35\x1f\x54\xbe\x08\x30\xc5\xc2\x94\x12\x5e\xa4\xc8\x21\x04\x85\x3a\x4c\x0b\x2c\x56\x21\x5c\x87\xcd\x8d\x5e\xdb\xe7\xba\xb1\xb9\xd5\x8b\x5c\x85\x63\xa0\x42\x30\xe6\x16\x65\x0e\xe1\xf3\x0d\x0d\xa1\x42\x5b\xb9\x53\xe2\xeb\xd2\xeb\x57\x87\xa4\xbb\xbf\x77\xe3\xef\xbe\x48\x1c\x07\xdf\xfb\x53\x07\xa1\x7f\x8c\xfe\x9d\x03\xce\x17\x9c\x3f\x77\x9c\x7e\x8a\xb3\x34\xf1\x51\x29\x3d\x60\xaf\xd6\xbc\xf5\x72\xb6\x4e\x98\x4b\xa3\xcf\x99\x45\x56\x2a\xef\x84\xd8\x8e\x23\x9f\x75\xd3\xf9\x27\x2c\xfb\x40\xe3\x65\x61\x34\x19\x5b\x7b\x9f\x2e\x27\x76\xf0\x93\x67\xfd\xd9\x92\xbc\xc9\x13\x0f\xce\x68\xda\x73\xc6\x0f\xb2\x83\x65\x36\x9d\x1b\xad\x4e\x17\x3c\x59\xb2\xec\x1c\x59\xb7\xac\xf9\xf5\x5b\x3a\x12\x9e\xa0\xa5\xf2\x09\xeb\x95\xac\x23\xee\xc1\x2e\x5c\xa4\xe3\x13\xb0\x2d\xfb\x63\xc8\x60\xd6\x85\xe1\x3f\xc7\xb8\xf8\x2d\xf8\x56\xea\x63\xf8\x3d\x0f\x61\x22\x50\x64\x3c\x82\xb8\xca\xbc\x4a\x86\xfe\xea\x57\x21\x11\x29\xe1\x31\xea\x75\x8f\x9e\xfa\xa5\x0d\xb4\x1f\xe6\x1e\xc5\x20\xeb\x75\x03\x90\xba\x14\x10\x61\x5e\xe6\x0a\xef\xce\xfa\xde\xea\x6e\xe6\x02\x61\x21\xde\x7a\xfa\x57\x9a\x39\x10\x1a\xb5\x9b\xe7\xee\xfe\xe9\x2f\x73\x8d\x8c\xf8\x79\x30\x4f\xaf\x14\x81\x97\x70\x5a\xd4\xc6\x81\xbf\xf2\x8f\x9e\xde\x46\xbe\xe5\xcf\x29\xd3\xd9\x1a\x5e\xd7\x44\x71\x2f\xa5\x84\x10\x16\xac\xfb\x96\x3f\xe4\xd6\xeb\xd2\x92\xef\x0c\x57\x41\x35\xdc\x47\x5b\xbf\xf4\xe2\xa8\x13\xc9\x22\xb8\x62\x17\x28\x0b\xa3\x48\xc2\xa7\xfe\x5a\x2d\xf5\x43\xc1\xc9\xcd\xbf\xd6\x11\x45\x3a\x7c\xd8\x2f\x12\x27\x06\xe5\xbb\xa8\x0e\xf0\x1c\x42\x0f\x55\x5e\x26\x47\x6b\x0a\x03\x17\x79\x3b\x3b\x7f\x54\x1a\x4a\xaa\x48\x9a\xa0\x1a\xe4\x19\xfe\x3b\x3f\x8e\x74\xd5\x35\x99\x8b\x8a\x2b\x57\x1c\xc3\xea\xed\x87\xba\x18\xa3\xc0\x2d\x0e\x9c\xac\x0d\x52\xe1\x6d\x44\x09\x57\xbe\x88\x94\x9f\xae\xf0\x87\xfe\xd6\xcf\xd4\x87\x6d\x62\x77\x1a\x55\x00\xc6\xd7\xe0\x4b\x7b\x80\xa9\x0e\x6d\x3f\x6a\xbd\x5e\x6b\xff\xfd\xbf\xf5\x30\x6b\x46\x04\x23\xe0\x71\x30\xd4\x24\x30\xb5\x55\x41\x59\x81\x8d\xb5\xf0\x84\xa2\x83\x87\x6f\x57\x85\xdd\x32\xb7\x9d\x63\x69\x95\x56\x4b\x06\x8e\x34\x41\xad\x56\xd3\xf0\x13\xdf\x5b\x4b\xc3\x58\x03\x9a\xec\xe9\xb0\x13\x34\x59\xa3\xec\x5b\x10\x30\x6b\x47\xe8\xc5\x8c\xbb\x48\xdd\x7d\x1b\x38\x0e\x72\xe2\x7b\x3d\xe7\xb7\xd0\x2f\x38\x47\xce\x37\x3a\x4e\x5e\xae\xb8\xd8\x05\xde\xe1\x62\x92\x5e\x1c\x8b\x85\xaa\xad\xd5\xa3\x28\x0e\x3c\x34\xa1\x05\xa3\x79\xc8\xb5\xde\xdd\x31\xbb\xbf\x8a\xe5\x2c\xb7\x85\x68\xb9\xda\xdc\x5c\x58\xfb\xee\xc2\xe0\xd4\x9f\xd5\x7e\xe1\x64\x7c\xa6\xdb\x5e\x7c\x59\xc2\x78\xf7\xdb\x15\x5b\xe5\xa8\x74\x2b\xd2\x48\x6a\x12\xbb\x59\xcf\xa7\xd8\x04\x49\xe6\xbb\xa8\xcb\x09\xc6\xca\xe0\x98\x26\xae\xe5\x46\xed\x51\x37\xd3\x91\x96\x20\x25\xa2\xac\x14\x3b\xa0\x31\x8f\x19\xb7\x74\x73\x4c\xa5\x67\x18\xd3\x44\x28\x1a\xbb\x91\xb0\x85\x0b\xf4\x44\x2d\x9d\xa6\x75\xdb\x17\x16\x9c\x7e\x1a\xfb\x47\x61\xbd\x8d\x7b\x97\xaf\xb6\xb2\x4f\x35\xbf\x76\x33\xf0\xa4\x74\x29\x22\x82\x93\x02\xd8\xf0\x57\x3e\x73\xee\x73\x6b\xf4\xc3\x37\x2b\x9c\x59\xfd\x69\x40\x04\x83\xc8\x08\xfa\x8f\x88\x08\xca\x39\x27\x83\x4f\xb6\x8f\x2f\xa7\x9d\xab\x97\x57\x56\xab\xfe\xba\xf0\xfc\x34\xc4\x84\x4b\xc9\x28\x91\x00\x2e\x2f\xd9\x53\x54\xa4\x98\x89\x4a\x6d\xf7\x2f\xd1\xb5\xcf\x9d\xfb\x85\x77\xa5\x46\x22\x26\x62\x15\xf8\x88\xeb\x52\x63\xe1\xde\x1f\x3a\x18\x3e\x88\x7e\xd5\x39\x74\xde\xe6\x38\xf1\xe1\x7c\x33\xdb\x42\xeb\x05\xad\x70\xee\x7e\xc7\xce\xe4\xd2\x79\xbf\x60\x07\x76\x91\x75\xfb\x5f\x98\x31\x9d\x76\xe7\x76\x60\xb8\x79\xfa\x0c\xdb\x83\x36\x98\x0a\x23\xdd\xd0\x04\x95\x60\xa7\xed\xc9\x76\xcd\x8f\x5d\x45\x31\x30\x22\x09\x95\xae\x51\xcc\xba\x7d\x9a\xf3\x3c\xed\x79\x46\xf7\xdc\xfe\x0a\x26\xc6\xc3\x70\x15\x88\xd2\x89\xef\x35\x03\xee\xb7\x7a\x3a\xc8\xfd\x8c\x70\x78\xba\xae\xeb\x1b\xfc\x82\x5b\x20\x25\xae\xd1\xaf\x00\xa1\x95\xa8\xb1\x35\x78\xe5\xa4\x9f\x3e\x79\xa9\xbe\xda\xaa\x84\x4a\x98\x85\x87\x8d\x95\x9f\x0f\x7c\xb8\xf0\x89\x60\xeb\x4e\xbb\xd5\xbe\x55\xb9\x76\xcc\x3c\x46\xd8\x17\x9f\x47\xd8\xcb\x6b\xfd\x46\xf7\xce\x46\xd2\x3b\xbe\x59\xef\x6f\xd6\x3b\xe8\x7b\xae\xb5\x8e\x9f\x09\x3e\x79\x82\x22\x3a\xd7\xa3\xc0\x0e\xbe\x77\xdd\xf9\x69\xf4\x07\xce\xaa\x73\xe8\xfc\x55\xc7\x99\x4d\xc6\xa8\xec\x97\x14\x3f\xb6\x9d\xfd\x2c\x6d\x52\xcb\x0e\x55\x92\xf1\xd2\xcc\xaf\x28\x47\x36\xc1\x72\x99\x6c\x4d\x83\xe7\x6b\xf5\xd3\xe1\xf8\x0c\x4d\x24\x4d\xa2\x34\x39\xdb\xf3\xb4\x34\x27\xfb\x76\x96\xac\xa9\x83\x7c\xbe\xd5\x3a\x1e\x8e\x8b\x4a\x0b\x95\x1f\x19\x8e\xbf\x4d\x95\xc8\xba\xf1\xb0\x6d\xcd\x79\x91\x4e\x39\xb5\xb0\x96\x51\x0a\x24\xc4\x14\x49\xcf\x4d\x88\x14\xa5\x20\x2c\x45\xac\x1b\x6f\x63\x15\x89\x4c\xf1\xe2\xcc\x99\x77\x0e\x94\x35\x85\x57\x94\x50\x4c\x50\x81\xd0\x5b\x1d\x0a\x40\x3c\x59\xea\x73\x70\x95\x10\x69\x0c\xb3\x43\x71\x6c\x95\x3c\x68\x84\x08\x21\x0f\x04\xb7\x61\xeb\xb6\xa8\xb5\xbd\x9a\x1f\x36\x5d\x62\xc0\x30\xca\x00\xe7\xe1\xe4\x82\xea\xbd\xb7\x7b\xfd\xbd\x1e\x3e\xf9\x7f\x45\x33\x75\xd9\xbc\xab\x19\xf0\x02\x1d\x0f\x31\x47\xb1\xb7\x83\x25\xd5\xc8\x5f\x53\xb5\xb0\xb9\x53\xe1\xb7\xef\xfe\x1f\xb7\x1f\xb8\xb5\xdf\x8a\x14\x27\x02\x61\x82\x01\x09\xee\x2a\x6d\xa4\x6b\x25\xe8\x31\x16\xbc\x55\xdf\xcc\x0e\x36\x68\xf0\x9e\xab\x9d\x2f\x6f\x98\xa3\x1d\x83\x1c\xe4\x6c\x82\x80\x7f\x86\xfe\xad\x73\xe8\x7c\x9d\xe3\xc4\xa7\xc9\xf0\x2c\xa3\xe2\x94\x95\x93\x1e\x24\x6d\x52\x82\x3f\xfb\x81\xc5\xc1\xc5\xc7\x30\x1b\x2f\x72\xda\x12\xee\xce\xb9\xba\xa7\x6a\x38\xcb\xc6\x9b\xa5\xc7\xce\x69\x6a\x67\xc8\x61\x05\x9e\xfd\x27\x14\x11\x82\x76\x87\x79\x81\x7c\x62\xaa\x19\x42\x84\x55\x43\x23\x85\xf1\xf9\xbc\x83\x80\x4d\xbf\x1a\xa8\x22\xfe\x90\x9a\xa7\xa8\x1e\xdd\xf4\xc2\x8e\xf9\xef\xf2\xdb\xda\x5a\x74\x51\x2a\x24\x16\x4c\x05\x2b\xb1\x7f\x73\xac\x69\x69\xdb\x4f\xad\xec\x8a\xdf\xe0\x94\x53\xce\x09\x8d\xc2\x6a\x9f\x53\xaa\xc3\x0a\xa7\x18\x53\xd6\x6c\x88\x44\x2a\x54\x54\x48\x3f\x99\xf0\xc4\x27\x9f\x7c\xd7\x14\x63\xa0\xd6\xa3\x93\x9a\xec\x9d\x57\xbb\x15\x37\x41\x88\xce\xcb\x38\xd9\x79\xe5\xb8\x97\x16\x20\x04\x38\x25\x3a\x79\xdb\x7f\x13\x57\x57\xbd\xbb\x3f\x35\xfd\x6c\x0d\x99\x46\xa8\x8d\xc0\x94\x00\x63\x2a\x1a\x54\xb3\xbf\xfc\x4a\x6a\x7d\x32\xb8\x65\xec\x23\x44\xa9\x5c\xb8\x35\xf4\xfa\x27\xaf\xc4\xd2\x5b\x79\xe0\x9d\x90\xbb\x92\x0a\xe2\xd7\x45\xdd\x28\x40\x6e\x11\xff\xe9\xbd\x6f\x82\x3f\x73\x1c\x67\xdd\x79\xd0\x71\xf2\x92\xc2\x6c\xbb\xb4\x65\xcb\xdf\x2e\x7e\x14\x6f\xe7\xa9\x13\x81\x55\x22\xcd\x13\x9e\x8e\x2c\xb3\xba\xf8\x25\x1c\xc2\x74\x36\xb6\x22\xe7\xe5\xbe\x66\x2f\x0b\x40\xf1\xd7\x0e\x2f\x3d\xa0\x37\x50\x27\xed\x67\xae\xa9\x62\x6e\xdc\xca\x07\x7e\x24\x6d\x44\xa1\xe2\x54\x11\x8a\xa0\x8b\x40\xfa\x61\x5d\xff\xcc\xfb\x73\x57\x03\xc5\x60\xd2\xbc\x8b\x36\xf4\xc5\x2b\x47\x2f\x43\x86\x11\x57\x84\x32\x44\x09\xd4\xc2\x6e\x91\x35\xb9\x2e\xe3\x05\x57\x3e\x96\x48\x6b\x08\x01\x81\xe1\x76\xdc\xea\x17\x45\x53\x11\xa7\x1d\xe4\xe4\x68\xe2\xfc\x14\xfa\x4f\xce\x23\xce\x13\x8e\x13\xdb\x63\xc2\x47\xf9\xb8\xd7\x2e\x8d\x6e\x47\xd3\xd9\xc1\x6c\x1e\x13\xad\xcd\x42\x09\xae\xca\x1f\x78\x5e\x06\x7d\x49\xa7\xc6\x7e\x76\x11\x52\xb3\x74\x3c\x11\xcd\x68\x21\x7b\x66\xab\x06\x84\x38\x46\x18\x0b\x37\xd0\xd6\xa2\x9f\x62\x2e\xb0\xbd\x6d\x46\x44\x89\xab\xec\x6e\xb8\xe0\x3e\xa1\x1c\x33\x4e\x42\x53\xa4\x77\x4c\xe2\x1a\x23\xa0\xbd\xcb\x80\x3e\xa7\x2e\x0e\x18\x2e\x57\x33\x6c\x36\x67\x2c\x5d\x19\xd8\xb5\x15\xe3\x0a\xeb\xf6\xba\xdb\xad\x02\x26\xf3\xaa\x76\x5e\xad\x23\x8a\x30\x95\x83\xf3\x82\x7a\x02\xbe\x0a\xc1\xdc\xaf\xe4\x0f\xee\xfd\x16\x7c\x1e\x7e\xc2\x89\x9c\xbe\xf3\xeb\x8e\x63\x2b\xaf\xf9\x5d\x28\xe7\xd9\x23\x7b\x27\xd2\x52\x93\x71\x54\xdc\xad\xe1\x60\x98\xb5\xf1\x02\x32\xda\x0b\xda\x04\x3b\x2e\xec\x9e\xea\xd4\xcf\x6f\x6b\xd9\xcb\x2e\xde\x25\xeb\x77\x62\x4f\x4b\x1b\xce\x68\xfa\x4c\xc6\xc3\x25\x9a\x9d\xcd\x4d\xf7\x06\x7c\xbe\xc4\xb7\x73\x46\x0b\x60\xa9\x3f\xd0\x86\x53\x15\xfc\x74\xd1\x5a\x2f\xeb\xd8\xf2\x4e\xcf\xc1\x48\x71\x10\x8b\x5f\xd6\xef\x73\xc4\xbd\x5c\x73\x8e\xb1\x94\x24\x26\x2e\x5d\x49\x82\x88\x00\x25\x98\x70\x54\xeb\x00\x13\x3f\x22\x92\x7e\x17\x10\x36\xed\xd6\x96\xd2\x34\xa2\x9c\xb8\x80\xa6\x7d\x64\x70\xa0\x03\xca\x18\xcb\x40\xe5\x31\x66\x34\x0d\xdd\x5b\x83\x86\x10\xfb\xfb\xeb\xb1\x47\xb1\x0c\x4b\xc7\x1e\xa0\x82\x56\xce\xcd\x32\xca\x24\x62\xc0\x89\x87\x02\x93\x07\x39\x06\x2d\x59\x36\x78\xfc\xc9\xcd\x02\x1a\x48\x12\xb8\x04\x63\x46\x89\x4a\x67\xaf\xbc\xb0\x9d\x07\x80\x98\x02\x64\x80\x28\xe4\x93\xd0\x4f\x15\x07\x85\x24\x67\xc1\xb9\xce\x9d\x21\x63\x44\xf8\x09\x9e\x1d\xb7\xb7\xb8\x5a\x1d\x5e\xa9\xf4\x03\x2c\x04\xf6\xbe\xc0\x9b\xf1\x2a\x27\x8d\x3a\x08\x56\x3a\x3c\x3e\x24\x95\x2b\x6d\x3c\x47\x4d\x43\x00\x7d\x1f\x52\x51\x08\x5a\xed\x2b\xb9\x52\x4f\x8f\x42\x8a\x28\x23\x6e\x52\xdf\x2b\x80\xa2\x72\x7d\x3f\x0a\x35\xd1\x04\x0a\x34\x0a\xec\x68\xbb\x37\x8c\xc2\x40\x09\xcc\x63\xbb\x3e\x04\x84\x98\x90\x35\xa5\x58\x61\x26\xc6\xda\x65\x40\xb0\x8b\x5c\xcc\xa2\xea\x86\x3f\xe9\x1c\xa7\xfd\x28\xcc\x39\xc7\x22\x62\x84\x07\x9c\x18\x49\x03\xdd\x4a\x93\xad\xec\x42\x1a\xb7\x0f\x4c\xcd\x05\x10\xe0\x61\x17\x20\x30\x41\x25\xc2\x91\x27\xb3\x16\x35\x3b\xdc\xc3\x54\x2a\x94\x66\x7a\xb3\x7d\x70\xe1\x44\x14\xe0\xca\xf3\x85\xe5\xd7\x7d\xee\xde\xef\xc2\xef\x63\xe4\x80\xf3\x90\xf3\xfd\xce\x3f\x70\x9c\x78\x74\xa6\xf5\x39\x29\x9d\xcd\x17\xf2\x30\xa3\x52\x79\x26\x29\x0f\x6a\x9e\xe5\xb3\xa5\xac\x27\xbc\x99\x0f\x57\x6e\x66\xc4\x45\xe9\xc2\xce\xcc\xb1\xed\x07\xcb\x7b\x9b\xe4\xe9\xc1\x97\xf8\x6b\xb7\x51\x39\x96\x5f\x72\x8f\x9a\x50\x56\x65\x8b\x14\x51\x7c\xd4\x43\x67\x08\x9c\xec\xef\xc3\x77\x63\x5e\x09\x38\x2d\xd5\x0c\xa5\x50\x9c\xdf\xcc\xd6\x73\x4f\x2a\x55\xe0\x4c\x6b\xd3\x87\x00\xd1\x40\x6f\xde\xea\x5d\x38\x24\xe4\xf1\xdb\x5f\xf9\x2d\x20\x14\xad\x92\x12\xd9\x37\x34\xc3\x58\x7e\x27\x03\x10\x81\xb5\xe4\xc7\xd6\x67\x10\x10\xa8\x74\xed\xb0\x2f\x00\xe1\x8a\xbf\xee\x12\xcc\x34\xaa\x6b\x8a\xc1\xf3\xdc\xaf\x79\xed\xf8\x2a\x26\xe3\xfd\xe3\x29\xb1\x8d\x27\xc4\x2e\x77\x6a\x08\x67\xd5\xde\x49\xaf\x09\x30\xbc\xb3\xb2\x85\xd2\x74\x3d\x08\x62\x40\xb1\x89\x09\xfa\x8d\x27\x01\x2b\x46\x04\x65\xc2\x8d\x25\x08\x17\x80\xa3\x90\x49\x82\x00\x38\x53\x94\xcb\x40\x84\x06\xad\xbf\xef\xa0\x43\x3d\xea\xf9\xf9\xda\x37\x3c\x78\xfb\xa3\x69\xff\xd3\x40\x39\x89\x43\xee\x2a\x2f\x5b\x7b\x07\xba\xf8\x89\x07\xc2\xed\xbb\xbf\x61\x85\xdd\x84\xa2\xdc\xa4\xbd\xf3\xef\xdf\x22\x6e\xc4\x24\x47\x44\x7a\x12\x30\x92\xa0\x68\xf0\x40\x7a\xe5\xab\x2f\xa9\x57\x06\xa9\x2b\x38\x56\x4a\xbd\xd1\x8a\xde\x7e\xf9\xd2\x47\x56\x36\x73\xb0\x36\x58\x44\x10\x3e\xde\x38\x9e\x6e\x8f\x98\xda\x5c\x3d\xda\x79\x16\xe9\x47\xde\x5a\xad\x73\xb4\x32\xd8\x3d\xe8\xc4\x9a\x58\x8c\xfb\x27\xf7\x7e\x17\x7e\x12\xfe\xc4\x79\xc0\xf9\x94\xe3\x40\xde\x02\x1f\x92\xfc\xd4\xf5\xc2\x46\x0d\x6f\x49\xbf\x39\xed\x3b\x5b\x30\xb6\xd0\x98\xb0\x32\x27\xa5\x8a\x75\x76\xda\x18\x62\x0b\x92\x5a\xb6\x0c\x49\x45\x5e\xe2\xbd\x25\xe7\x77\x6e\x2e\x7a\x3a\x8b\xfe\x2b\xc0\x10\xc5\x98\x70\xb6\x9e\xc4\x12\x31\x4a\x99\x38\xdc\xcb\x12\x26\xa6\x93\x01\x66\xe0\xbb\xcc\x77\xe3\xc8\x35\x95\xed\xce\x74\xfb\xa5\x64\xf5\x6a\x7c\x7d\x25\x78\xe6\x4a\xf5\xf0\x6a\x2d\x48\x3c\x31\xe2\x0a\x51\x82\x5d\x4f\xf6\x1e\x1b\xfc\xa5\x56\xe3\xc4\x9b\x35\xdc\xed\xed\x8d\xbd\x7a\x35\x96\x92\x13\x0c\x54\xf9\x48\xcb\xc9\xb5\xce\x2e\x13\xb5\x46\xbc\x77\xd8\x8c\x35\xa3\x45\xb0\xf9\x0c\xd0\x80\xe1\xe0\xea\xa3\x59\x16\x33\xda\x94\x2b\x0d\x37\xa0\xbd\x71\xfe\x40\x6b\x2d\xcb\x43\xc4\x20\xf0\xa8\x0e\x74\x3c\x6c\xf4\xf2\x50\x0b\x4a\xc4\x68\xe5\x13\x6f\x1c\x3e\x5b\x91\x06\x49\x1a\xb9\xf8\x37\x81\x91\xe8\xe6\xc3\x89\x6b\xb0\x54\xee\xc6\xbb\x5e\xfd\x40\x75\x83\x12\x84\x85\xf4\x5c\x13\xb6\x3c\xc1\x30\x51\x21\xd2\xa4\xd2\x74\x77\x5a\x6b\x4f\xb6\x92\x1c\x47\xba\x19\xb4\xdb\x82\x5a\x3f\x32\xf7\xde\xef\xc1\x5d\xf4\x79\xe7\x11\xe7\x31\xe7\x6d\xce\x57\x39\xbf\xe5\x38\xfd\x92\x1b\xbd\x6c\xce\x4f\xad\x8a\x9b\x07\x67\xf3\x41\xd9\xd3\xf0\x11\x4b\x3d\x9c\xce\x2b\xbf\xd1\xd9\x5b\x57\xe2\x86\x59\x3a\x2c\xf5\x4f\xe7\x46\xf3\xa5\xae\xd6\x12\x9a\xcd\x96\x92\xa9\x76\xf2\x5a\x8e\x2c\x16\x64\xd5\x85\x5b\xe8\x9c\x03\x93\xa7\x87\x0b\xc4\x38\x3c\x83\x49\x8e\xd1\x62\x74\x31\x99\x3b\x22\xf3\x34\x9b\x1b\x92\x2e\xa5\x16\x59\x9a\xf0\xcc\x83\x01\x54\xb5\x39\x77\x79\xfd\x7c\xce\x64\xb8\x7f\xee\xc6\xa4\xa5\x4a\x3d\x10\x12\xa0\x48\xe7\x8c\x49\x1e\x56\x36\x7b\xfd\x7e\x01\xc7\x88\xc0\x88\x71\x2b\xa5\x44\x99\x24\xca\x30\x9f\x99\x24\xaa\x05\x47\xb5\x28\x50\x34\xa6\x18\x75\x7a\xc3\x30\x1d\x62\xc6\x98\x4f\x95\x46\xad\x20\xe0\x99\x10\x9e\x7b\xbe\xbb\x02\xd8\x53\x98\x73\x9a\x24\xf5\x0a\x42\xba\xe7\x47\xc9\xfa\x68\x63\xc3\xf7\x77\x8e\x0e\x36\x5c\xd7\x3e\xdb\xd8\x2e\x32\x60\x2f\xac\x9e\x73\x8d\x14\x08\xd1\x86\xf6\x25\x2b\x02\x05\x2a\xca\x57\x42\x11\x06\x93\xf5\xda\xfd\x88\x23\xaa\x6a\x89\x26\xcb\x35\x1c\x1f\x71\xcf\x5f\x91\xac\x93\x98\x73\x37\x1e\x1f\x3c\x39\x3d\x56\xa2\xa5\xfc\x47\x47\xc7\xab\x71\x01\x46\x10\x4e\xe2\xc0\x95\x2e\xa3\x40\x45\xdd\xcf\x57\x5d\x86\x7a\xcf\xef\x7c\x4a\x5d\x1d\x74\xf3\x8a\xb4\x8b\xa0\x8d\x4e\x93\x53\xbb\x16\x98\xaa\x1e\xfc\x5f\x7c\xaf\x56\xf5\x02\xc9\xa8\x48\x77\xfd\x64\x68\x1a\xf5\xab\x4d\x2d\x5c\x6c\xea\xd5\x6d\xad\x8d\x87\xb5\xcb\x1b\xb4\x88\x4b\x6a\x3b\x4e\x18\xdf\xdd\xb9\x75\xfb\x63\x91\x5f\xe1\x5a\x20\x20\x20\x98\xe2\xb1\xb1\x36\xe4\x98\x04\x05\xd0\xd4\x41\xb7\xd6\x5f\xbb\x21\x3f\xb5\xfb\x42\x1f\x0b\x37\x71\x23\x45\x10\x10\xaa\x88\x55\xeb\x42\x82\x30\x84\x29\x37\xd9\xea\xc9\x8d\xd6\x11\xf5\x09\xf7\x28\x77\xc8\xbd\xff\xff\xde\x1f\xc0\x2f\xc3\xcf\x39\xdb\xce\x39\xe7\x35\xe7\x6b\x1c\x67\xb6\x0c\x05\x67\x1b\xd5\x96\xab\x7d\x8c\x4e\x1b\xe0\xbb\xb0\x03\xbd\x6e\xf1\x27\x67\xbc\xf8\x6c\x5e\x4a\x05\xcf\x0b\xe0\xb9\x82\xf8\xec\xd4\xce\x69\x07\x86\xbd\xf9\xa3\x06\x43\xce\x76\x60\x3a\x3c\xb5\x55\x59\x96\x16\x69\xc2\xba\x83\x1f\xa7\xfd\xad\x43\x96\x64\x95\x34\x0d\x30\xce\x83\x7a\x5e\xa9\xb9\x27\x9f\xd8\x3d\xd8\x0a\xbc\x27\xdf\x7d\xfe\xc2\x66\xab\x62\x00\xa5\x5e\x45\x51\x86\x1f\x5b\x05\xee\x19\xa3\xd3\x48\xd1\x97\x5e\x7f\x2f\x34\x24\x03\x50\x49\x65\xe7\xd3\xaf\x79\xde\xea\xe6\xfa\x07\x66\x2c\x4e\xb3\xdc\x65\x18\xb3\x02\x37\x2a\xb7\xa2\xb6\x6e\xb5\x76\x05\x13\x2e\x16\x04\x1a\x49\xad\xd6\xf2\x30\x60\xcd\x23\x37\x2e\x00\x80\x09\xd4\x4f\x9d\x6f\x0f\x7a\x38\xab\x12\x9c\x85\x41\x5a\x09\x42\x5f\x6b\xc0\x1b\x6b\x9b\x1f\xb9\x3a\x7b\xac\x23\xd5\xb0\x7e\xb1\x53\xe9\x46\xd6\x62\xfe\xe3\x38\x43\xc6\x4d\x28\x25\xe8\x3d\x19\xa1\x7e\x54\x1b\x67\x1b\xe8\xf6\xc5\x73\xaf\xf4\x7b\x83\x22\x52\xf8\x2e\xa7\xdc\xea\xfc\x79\x75\x9e\xd3\xea\xfa\x0d\x04\x22\x70\x37\x6a\x27\x49\x8d\xd0\x2d\x8d\x43\xc5\x19\xa5\xa4\x00\x56\x42\x99\xb2\x37\xf1\xb3\xf7\x3e\x0f\xdf\x81\x7e\xd3\xf9\x5a\x18\x38\x0e\x58\xa0\x98\x70\xab\xa5\x3a\x1d\x59\xc9\x9f\xc1\x59\xb5\xe3\xc5\x9b\x7b\x70\x86\xb1\xcb\x92\x2c\xb1\x46\x46\x88\x2d\x96\x2c\xac\x61\x61\x36\x3a\xb0\x2b\x8a\xe3\x5d\xbb\xe8\x79\x66\x91\x28\xcf\x66\xd9\x64\x3c\xb3\xcd\xa3\xe2\xef\x2f\xc2\x74\x3c\x58\x4c\x0e\xf1\xc2\x57\xc9\x5a\x40\x9f\x29\xd5\xcb\x55\xcf\x8b\x68\x7a\x82\x16\x9b\x1b\x4d\x94\xf0\x65\x24\xb2\x34\x53\x66\xdb\xa8\xa7\xbc\xe6\x52\x66\xc6\x2e\x54\x96\xe5\xe3\x5c\x43\xe6\xcc\x5e\xd3\xdc\x06\xca\x0a\xf2\x0d\x07\xcb\xa8\x58\x20\x93\x13\x98\xce\xee\xa7\xe6\xc3\x05\x1f\x01\x68\xd7\x3a\xfb\x8b\xa7\xc7\x97\xaf\x08\x09\x28\x73\x63\x12\x15\xb7\x00\x63\x2c\x91\x27\x2c\x6b\xdb\x02\x7b\x46\x55\xd3\x0f\x14\x09\x38\x8e\xb2\xc7\xdf\x11\x52\x3f\x94\xde\xdc\xb6\x59\x91\x0a\xaf\x87\x91\x25\x19\x90\x66\xdc\xab\x50\x6a\xad\xea\x03\x74\x94\x5a\xb1\x28\x12\xdd\xe8\xba\xf8\xb7\xb9\x5c\x5b\x7b\x78\x6b\x7b\x6b\x6a\x6d\x1a\x35\x15\x94\xbb\x41\x68\x12\x8e\x2d\x0b\x03\x11\xb6\x6f\x10\x06\x22\xbb\xc8\xd7\xac\x66\x24\x46\x2d\x6f\x35\xe5\x56\x33\x4e\x31\xee\x31\xe5\xd2\xba\xeb\x13\x6b\x92\xa9\x43\x11\x79\xd8\x7f\xf5\xe9\x66\x43\x1b\x84\xb4\x6a\xa2\x15\x19\x13\x3c\x97\x58\x2d\xb0\x0c\xea\x95\x24\x7e\xc9\xca\x72\x98\x08\x45\x05\x0a\x28\x41\xdf\x85\x03\x4d\x29\x12\x89\xb5\xaa\x23\x1c\xf6\x4f\x82\xe4\x83\xb7\x64\xa5\xe5\xd5\x19\x61\xc0\x80\x97\xd4\x4c\x42\x7d\xe9\xa6\xbd\xf4\x06\xc9\xbc\x24\x16\x81\xc7\x98\xf5\x2a\xb6\x5e\xfb\xa8\x9c\x41\x4a\x6b\xe4\xe3\xae\x54\x56\x77\xcf\x4d\x03\xc5\x29\x82\x1a\x55\xf6\x5d\x1b\x04\xcd\xc4\x88\xcd\xa4\x6b\xae\x7a\x2c\x20\x77\xef\x89\xb4\xe5\x3f\x79\xe5\x4a\xd5\xf3\xbc\xdb\xfb\xc0\x28\x09\x44\x39\x1b\xc0\x44\x93\xa2\x86\xd7\x09\x0a\x09\x80\xdc\x56\x0d\xd9\xac\x53\x37\x8e\x79\x60\xa7\xb7\xbe\x0e\x09\x05\x74\xa0\x19\xa7\x84\x75\xa6\xdb\x9d\x35\x6b\x17\xef\x05\x3d\x4a\xb1\x2f\xec\xe4\x51\x70\xca\x94\x76\x7d\xa3\x0d\xb8\x44\x32\xaa\x3c\x99\x32\xb8\x91\x76\xe2\x22\x68\xe3\x2a\xa5\x08\x13\x9a\x18\x59\x6a\xd9\x59\x37\x3a\x56\xf6\xac\xf8\xbd\x7f\x71\xf7\x77\xe0\x0f\xe1\x27\x1c\xec\x3c\xef\xbc\xcf\xf9\x6a\xe7\xf3\xce\x7f\x86\xd0\x71\x4e\x60\x98\xf4\xa7\x8b\x93\x7c\x66\x7c\xe5\x11\xce\x86\xdd\x41\x6f\x50\x16\x5e\xb0\xb4\x8b\xbb\x8f\x3b\x3a\x77\x45\x1e\x2c\xc7\x7c\xa7\xe3\xf7\x1d\x58\xfe\x85\x8d\x74\xb3\xf8\x60\x69\x71\xb6\xbc\x65\x67\x07\x6c\x67\x1a\x5e\xe5\x82\xcb\xe9\x36\xf2\xfc\xe2\xce\xd3\xfd\x69\x90\xcc\xe6\xb6\xbb\x67\x54\x5a\xe7\x95\x9b\x5d\x73\xce\x66\xc7\x64\x4e\x0d\x2f\x9f\x35\x47\xd9\xf1\xa9\x54\xe5\x29\xcf\x9f\x5d\xb7\x4c\x65\x5a\x6d\xf7\x3b\x81\x56\x2c\xd2\x21\x27\x2c\x95\x9c\x02\x2d\xa0\xe8\xde\xcb\x64\x47\x55\x22\x84\x94\x5f\xab\x04\xe2\xab\x9e\x07\x74\x9e\x7b\x6f\x7b\xec\xe6\x33\x4f\xcd\x56\x7c\x4f\x46\x34\x54\xbc\xd9\x57\x1b\x55\x4c\x2a\x2c\x9f\xa4\xe7\xea\xdd\xc1\xb0\x49\xa8\xa2\xf8\x67\x39\x25\x6a\x90\x36\x2b\xed\x28\x0e\xe3\xf5\x83\x0b\xc5\x49\xbe\xf2\x6a\x9c\xb6\x1a\x27\xea\x91\xce\x56\xe4\x01\x04\x2d\x58\xc3\x81\xaf\xfc\x22\x47\xfb\x51\x12\x05\x58\x10\x44\x79\x96\x12\x83\xb3\xa3\x46\xbc\x13\x0e\x7d\xf0\x2b\x18\x28\x42\xb2\xda\x17\x95\x80\x48\x54\x6a\xbd\xb1\x02\x96\x43\xc5\xf4\xb6\xbf\xe5\xda\x83\xc3\x35\x8d\x2a\xf9\xc3\x1f\xe0\x7e\x28\x57\x2a\x51\x8a\x78\x3d\x19\x88\xa4\xce\x1f\x59\x65\x92\x61\xc6\x5d\xc2\xd0\x1b\x2b\x03\x04\x3a\x58\x49\xb5\xd6\x5c\xa4\x2f\x7a\xc7\x55\x06\x58\xad\x34\x3b\x5d\x39\x8a\x5d\x41\x15\xf9\x67\x18\xe0\x87\x15\x6d\x50\x56\xf7\xfa\x55\xcd\x09\x41\x04\xb0\x51\x39\x6a\xbb\xf5\x44\xee\x48\x0a\x9e\xef\x22\xc2\x18\x45\xf5\xf3\xa8\xd7\x7f\xe4\xe3\x2b\x1d\x84\xd6\x2a\xeb\x6b\x8f\x77\x95\x27\xd4\xe6\x71\xb8\x9a\x21\x12\x7a\x47\x97\xab\x03\x2e\x04\xcf\xb0\x1d\x1f\x7e\x84\xf8\x3c\x5a\x33\x21\x21\x2b\xbd\xbd\xb1\x54\x1b\xc3\xbb\xbf\x0f\x95\x68\x75\xb0\xda\x33\x98\x0a\x15\xf9\x51\x18\xad\xc0\x7b\x0a\x34\x61\x05\x09\x5d\x1f\xe3\x08\x6b\x82\x29\xe2\x19\xf1\x70\x60\x38\x69\xa7\x7b\x43\xa2\xc3\x84\x73\x8c\x64\xd6\x76\xd7\x2a\x76\x33\x0b\x01\x62\x22\xf4\x35\xda\x78\x77\xbd\x43\x9a\xcd\xd1\xe8\xc4\x64\xde\x7e\xb5\xc0\x34\x82\x92\x7a\xd0\x4f\x7d\x40\x58\xf4\x98\x49\x65\x8b\xb4\x43\x46\x0d\x96\x5b\x69\x24\x34\x27\xed\x95\xc4\xc5\x77\x3f\x85\x58\x83\x17\x51\x49\x70\x84\x90\xac\x04\x81\xe0\xc8\xf6\x39\xfe\xde\xbd\xff\x13\x21\xf4\x9f\x1c\x70\xfe\x06\x3c\xea\x38\xfd\x91\xb5\x8e\x2a\xc9\x83\xf9\xfd\xae\xaa\x8c\x77\x6d\x02\x48\x17\x86\xab\x76\x5b\x70\x38\xe9\x95\xf3\xef\x72\x5b\xd8\x5a\x53\x2c\x9c\x87\x19\xb7\x33\xbd\xd1\x41\x1b\x46\xb3\x63\x98\x0c\x26\x73\xae\xf7\xec\x18\xac\x8b\xf1\x64\x51\x66\x2c\xd6\x8d\x8b\xbf\x2e\x20\xf2\x7c\x11\x21\x1c\x1d\x2c\xe5\xba\x4f\x3f\x6f\x72\x6a\xfe\x78\x46\xb0\x78\x3e\x24\x5f\xdc\xbd\xb2\x6b\xbf\x90\x78\x1d\x4f\xed\xab\x3d\x78\x33\xef\xc6\x43\x29\x6b\x43\x3a\x4a\x9a\x30\x3d\x28\x65\x5b\xd3\x84\x1f\xe2\xfb\x50\xcb\x26\xde\x9d\x1b\x6a\x2d\xb3\xd7\xa4\xf8\xc3\x7e\x41\x96\x66\xc5\x63\x2f\xa2\xf1\xa2\xd8\x2a\x3e\x0f\xfe\x1d\xdc\xfd\x9f\x30\x0b\xeb\xf1\x04\x15\x01\xd6\x37\x8d\xa8\x28\x52\x08\xd7\x2c\x4d\x3b\x51\xcd\x1a\x9a\x11\xaf\x72\x85\x6f\x5f\xb0\xad\x60\x60\x58\x59\xc6\x6c\x0b\xc1\xfa\xd5\x87\x2b\x71\x19\x68\xa9\xca\x94\x02\x22\x43\x93\x26\x94\x6f\xb7\x30\x22\x0c\x28\xd7\xdc\xe7\x1c\xd9\x8d\xa6\x71\xff\xfd\x4d\xc0\x24\x90\x52\xce\x9d\x97\x50\x71\xaa\x11\x42\x0a\x6b\x6e\xf5\x4c\x71\x11\x44\xbd\x98\xa2\xd9\x06\xbe\x5c\xf3\xab\x8a\x97\x5a\x8b\x76\x8d\x4a\xfa\xc4\x24\xda\x93\x3e\xd5\xdc\x7e\x99\x60\xd8\x55\x22\x14\x9c\x18\xc1\x28\x71\xd1\x24\x6e\x44\x9a\x6b\x36\x97\xef\x42\x45\x7c\xdf\xfe\xd8\xd6\x75\x44\x19\x70\xc1\x39\xa3\x3e\x02\x42\x18\x26\x94\xc9\xe2\xc1\xaa\xb9\xc5\x70\x9c\xba\x99\xab\xb8\x41\xb8\x80\xa8\x92\x25\x05\x44\x2a\xe5\xd5\x30\xd5\x26\xab\x4c\xa2\x10\xe0\x69\xf4\xa1\xe2\x99\x24\x77\x39\xc0\xd0\x54\xd3\xce\xec\xe9\x4f\xbf\x71\xa1\x51\x03\x01\x42\x79\x12\x80\x02\x09\xb0\x72\x7d\x3b\x6a\x27\xe9\xfe\xf0\xb9\x07\x58\x25\xea\xb9\xbd\xac\x4f\x5a\x75\x1d\x17\xd9\xd8\xb5\x04\x15\x44\x4c\xcb\x36\xd2\xa5\xf6\x31\x05\x54\xdd\xdf\xce\x1e\xe8\x56\x48\x0b\xdc\x9a\x20\x98\x28\x2a\x8a\x94\x14\x2b\xbf\xba\xff\x24\x69\x6c\x84\xdd\xf8\x8b\xdf\x51\x42\x02\x19\x7b\x3d\x8f\x33\x49\x74\xf1\x6d\x7c\xcb\x31\x14\x4c\x51\xa1\x43\xdf\x30\x82\x2d\x37\x05\x08\x07\x9d\xec\x7e\xe8\xab\x9f\x9a\xb6\x92\x88\x85\xc0\x29\x44\xc1\x54\x68\x20\xc6\x0a\x42\x81\xdd\x6f\x13\x26\xe9\x85\x1b\x0d\xf2\xf8\x6e\x50\x60\xf3\x95\xc6\xd6\xb3\x95\xbd\xdd\x8c\x08\xc0\xb2\xea\x27\xb1\x2f\x98\xa5\x77\xe2\xf2\x97\x40\x98\x36\x9e\x01\x2f\xd6\x82\x13\x56\x4a\x89\xc5\xcd\x4a\x43\x35\x4d\x5e\x20\x85\xd1\x70\xd0\xce\x8b\xfa\xf2\xde\x3f\x77\x00\xda\xe8\xc7\x9c\xc4\xa9\x38\xcf\x38\x3f\xeb\x7c\xd6\x71\xe2\xf4\xb4\x1b\x38\x6f\xf4\x0c\x07\x7c\xcc\xa7\xb3\x79\x05\xd7\x2b\x90\xdc\xa9\xe6\x5f\x39\xbd\x1e\xf6\x8a\xb3\x7f\x88\x0e\xb2\x43\xb0\x70\xf3\x22\x9c\xaa\x25\x9f\xa0\xf1\xf0\x60\x36\x5d\xea\x20\xfb\xa8\x54\x08\x58\x3c\x63\x39\xc6\xe9\x75\x79\xaf\x3b\xd8\xc4\xdd\xb9\xa4\x46\x49\xa0\xb7\x5c\xe2\x85\x73\xf6\x7c\x63\x63\x1e\x1e\xa6\xb3\x89\xf5\xd8\xce\x66\x2c\x4d\xac\xff\x50\xe9\x7b\xc5\xb3\xaa\x15\xe0\x76\x83\xc6\x56\xf3\x28\x4e\x45\xdc\x7a\xbe\x13\x55\x09\xfc\x0a\x02\x5e\x59\x15\xdd\x87\xca\xc5\x01\x49\x53\xd7\x2f\xde\xc6\x56\xa5\x4f\x8a\x23\x4c\x6b\xd5\xf8\x7c\xe5\x56\x60\x9d\x20\x84\xa6\x35\x3f\xa2\xb4\x19\xb3\xcf\xdc\xe9\xd0\x95\x76\xa0\x53\x7b\xc4\x59\x5c\x27\x58\x10\x49\xa4\x62\x96\xc3\x06\x88\x6a\xcc\x85\x0a\x6e\x57\xce\xc7\xd5\x7a\x68\xdd\x19\x28\xb6\xf5\x16\x71\x65\x50\x44\xd5\x58\x67\x18\x04\xa2\x88\x29\x49\x33\xd7\xf0\x92\xdd\x65\x82\x3b\xdd\xc4\xed\x0d\xbd\xbc\xe5\x0e\xa2\x02\xf3\x6b\xdb\x7c\xe4\xb3\x95\xf3\xae\xcc\xf2\xca\x61\x7b\x23\xcb\xd5\xb7\x52\x02\x3d\x00\xa6\x80\x30\xab\x57\xe9\x7a\xed\x4b\x9b\x0f\xf6\x1a\xc0\xad\x5a\x29\x61\xdc\x36\xa6\xfd\x70\xb8\xfe\xc6\xed\x0a\x49\x08\x14\x35\x6b\x60\x28\x27\xb4\x76\xfb\x7d\xdd\xaa\x6d\x59\xa5\x84\x09\x29\x8d\x0c\xe8\x9c\x95\x89\x75\x6c\xb7\x97\x28\x49\x8a\x72\xdb\xab\x1d\xae\x1d\x87\xc5\x07\x3d\x1d\x53\x04\x54\xbb\x44\x28\xf4\xeb\xc3\x76\xc5\x08\x48\x92\x4e\x2f\xf0\x28\x20\xe1\x90\x7b\xdf\x7c\xaf\xea\xfc\x7f\xe8\x37\x9c\x8a\xf3\x6e\xe7\xa3\xd6\xa7\xb5\x34\x16\x2b\x30\x38\x59\x1c\x9c\xe1\x80\x4f\x8a\x5f\xe0\xf4\x10\x6c\x63\xf1\xa0\x04\xe2\x4b\xb9\xc8\xe4\x74\x77\x66\xde\x73\x98\x5e\x84\x71\x89\x4e\x96\x98\x7d\x38\x1e\x9e\x82\xfc\x52\x7b\xde\x9e\x03\x5b\xa5\xe0\xa4\x05\xbc\x24\x5e\xde\xc7\x2e\x4a\x8b\x24\x33\x27\x32\x1e\xc3\x6c\x3c\x9d\x14\xcf\xe9\xf9\x88\x6d\x42\xa6\x5c\x17\xb9\xbe\x40\x42\x88\xfa\xe6\xb9\x2b\x8d\x56\x87\xeb\x67\xf7\xc7\x15\x3f\x46\xa0\x05\x21\xc5\x1f\xa6\x15\xbb\xed\x28\xd6\x4c\x51\x0c\x08\x51\x9a\xe7\x47\xe9\x85\x56\xe6\xeb\xd0\xb8\x73\xc4\x4a\x74\x54\x87\x59\xee\x15\x69\x9f\x4b\xe5\xca\xc0\x18\x04\x57\xa3\xc0\xef\xae\x9e\x70\xb9\x19\xef\x27\x59\xe8\xf5\xed\x44\x42\x48\x6e\x22\x42\x08\xf3\xeb\x27\xa4\xe9\xe1\xe2\x7e\x13\x1a\x37\xf2\x2d\x36\xdd\xb2\x2c\x22\x77\x77\xa5\x6d\x28\x21\xe8\xe9\xc6\x01\x17\xc4\x15\xdd\x34\x9b\xad\x37\xc0\xf5\xcf\x0d\xce\x9d\xa3\xac\x9f\xfd\xaa\x44\x2e\x13\x86\x70\x6e\x2c\x85\x09\x23\x4c\x5d\xae\x83\x7a\x30\x26\x9f\x7c\xfb\x2b\x4f\x34\xf7\xab\x46\x20\x2c\x75\x62\x9d\x3d\x11\xc1\x9e\x92\xca\x0d\x61\xff\xa5\xf3\x4f\xec\xb7\x24\x67\x00\x46\x46\x5e\x82\x11\x24\x1b\x95\x8c\x90\xf5\xc1\x5e\xa2\x40\xe9\x40\xdc\xbd\x07\x9e\x47\xad\xe5\x66\xb2\xd3\x1d\x3f\x7d\xf1\x3d\xe7\x71\x5c\x1c\x6e\x17\x51\x8d\xb0\xca\xe3\x4d\x71\xe7\x7f\xfe\x38\x19\x85\x15\x17\xa3\xe2\x65\x52\xeb\x3b\xa0\xef\xfd\x31\xda\x45\xff\x9b\xf3\x6e\xe7\x0b\x8e\x13\x97\x83\xa6\x22\x69\x63\x96\x7a\x88\x27\xbc\xdc\x96\x5a\x82\xd9\x91\xdd\x6d\x2e\xb3\xe6\x72\x88\x33\x39\xb3\x52\xcd\xbb\xac\xfb\xe6\x6d\x96\xc1\xfd\xa9\x39\x2e\x37\x53\x97\x34\xd6\xc4\x32\x18\x7a\x0b\x0e\xc3\x3c\x76\x4c\x76\xa0\x4c\xb1\xcb\x30\x65\xf5\x45\x37\x61\xd8\x9b\x23\xf2\x63\x34\x9b\x8e\xe7\x62\xa1\xe3\xe9\xec\x0c\xcf\xad\xdc\xea\x9a\x4b\x5f\xa4\xf3\xad\x1e\x2b\x31\x8a\x0e\xce\xf2\x88\x7e\x44\x7a\x79\xb5\x63\xc5\x29\x19\xa2\x80\xbc\x9c\x00\xa9\x67\xed\x90\x62\x1a\x13\x8a\xb0\x57\x39\x5e\xbd\x48\x01\x74\x76\xc8\x6a\xd5\xa8\x37\x5d\x49\x34\xe3\x04\x6b\xee\xa9\xdd\x9e\x6b\xa8\x59\xa5\x2e\xe3\x48\xc6\xac\x5d\x75\x95\x30\xda\xd5\xa7\xce\x10\x50\x94\x6f\x7f\x1d\x20\x88\x3b\xcf\x56\x2b\xcc\xe5\x40\x89\x32\x3e\x43\x30\x5a\x47\xe7\x73\x57\x52\x8a\x85\xb5\x96\x58\xaf\x8e\x7c\x4b\x19\x8d\x42\x8c\x42\xe1\x26\x9d\xbc\x11\xd0\xb9\x69\xa2\xb4\xc3\xaa\xcc\x05\x20\xc8\x6a\x43\x60\xc9\x19\x1d\xb4\x6a\x81\xe2\x1a\x53\xdb\x4d\x5b\x88\x61\x32\x21\xeb\x83\xcc\x67\xbe\xf6\xd1\x2c\x8f\x1a\xfe\x70\x47\x2a\x8a\xd0\xf7\x60\x8c\xd0\xca\xcd\x27\xd6\xfd\x2b\xad\xab\xed\x5e\xfd\xf0\xba\x8f\x8a\x18\x47\x98\xfc\x2f\xec\xbd\x6b\x8c\x64\xe9\x79\x17\xfe\x3e\xcf\x7b\x7f\xcf\x7b\xee\xe7\xd4\xa9\x7b\x55\x57\x55\x57\xf5\x6d\xfa\xde\x55\x33\xd3\xd3\x73\x9f\xd9\x5d\x8f\x77\xf6\x32\x7b\xf1\xae\x77\xbd\xde\xec\x25\xbb\xff\xff\x7a\xc7\xb1\xd7\x76\x82\x8d\x82\x08\xfe\x40\x62\x1c\x21\xf8\x10\x11\x25\xe6\x22\x6c\xd9\x41\x38\x02\x3b\x8e\xac\x10\xa1\x24\x88\x28\x21\x36\x1f\x20\x10\x10\x0a\x88\x20\x1c\x08\x09\x12\x42\xe1\xa2\x4c\xa3\xf3\x9e\xaa\xee\x9e\x55\x14\x29\xdf\x33\xad\x99\x3e\xd3\x5d\x75\xaa\xea\x9c\xf7\x7d\xae\xbf\xe7\xf7\xeb\x7b\x81\x8d\x4c\xbc\xbb\xcc\x25\x70\x8f\x85\xad\xad\x76\xea\x39\x27\x1e\x1a\xab\x06\xcd\x20\x90\x89\x83\x66\x34\xf4\xf6\x24\xb6\xca\x20\x18\xae\x99\x14\xca\x36\xd6\xaf\x7c\x7e\x83\x9d\x0b\xb5\x78\x70\x0f\x30\x4a\xda\x8f\xa5\x05\xd7\x0c\x38\x17\x86\x0b\xc5\x20\xac\x50\x6b\x80\xc2\x04\x12\xea\x4b\x86\x22\x95\xb2\xd3\x89\x03\x86\xc0\x28\xaf\xa4\x95\x6c\xc8\x28\x64\x37\xf7\x9a\x4b\xdd\xeb\xdd\x1b\xd1\xfa\xbd\x67\x56\xa4\x01\x4a\xd1\x09\x77\x98\xd8\x8b\x36\x60\xfd\x2f\x5d\x59\x2b\xac\xac\x70\x39\xc2\xd8\xd5\x8b\x3d\x47\xea\xc9\x06\xad\xa5\xa4\xbd\x24\x8d\xa0\x0e\xb7\x30\x3e\xfe\x3d\xf2\xb7\xf1\x37\x08\x25\xbb\xe4\x39\x42\xd2\xda\x4c\xcc\x49\xa4\x4e\x02\xbd\x10\x44\xee\x30\xe0\x0f\xc9\x01\xbb\xe2\x43\xf9\xbd\xbb\x00\x37\x9e\xca\x3c\x6e\xc2\xc1\xd8\xe1\xaa\x27\xfb\x65\xbe\x38\xf8\x2c\x00\x3c\xc5\x8c\xa4\x1d\xb5\x14\xa8\x8a\x03\x05\x99\x14\xd5\x40\x86\x89\x07\xb1\x4d\x11\xad\x0f\x82\x41\x96\xf1\xe5\x3c\x07\x44\x01\xbe\x01\xe9\x45\x81\x73\x1c\x42\xce\xc7\x89\x12\xa9\xf0\xcb\x65\xb6\xcf\x85\x34\x60\xb8\x27\x8c\x6d\x8c\x53\xf6\x9b\xbf\x20\x6e\xd4\x86\x99\xaf\x42\x2e\x29\x72\x1d\x47\x87\xd7\xd4\xe3\xaf\x7d\xe9\x87\xcf\x59\xdc\xf9\xfc\x57\xb6\x57\x9f\xf5\xae\xef\xfa\xe0\x70\x59\x32\xed\xd7\x6e\xf2\x5f\xfc\x4d\xb6\xe9\xe7\x16\x29\x77\x3a\xb3\xff\x8d\x2a\xf8\x2e\x41\xf2\x19\xf2\xd3\xf0\x49\x42\x96\xb3\x53\xad\xf4\x2b\x70\x30\xde\x1f\xcf\xa5\xe0\xe4\x59\x41\x2f\xc7\x40\x5e\x39\xf4\x45\x45\x30\x73\x1d\x4b\x47\x26\x23\xf3\x6a\xdb\x6e\x9d\xcd\x86\xbb\xae\x2c\xb5\x20\x51\x94\x1d\xcc\xe4\x21\x94\x4e\xc2\x41\x4b\x61\xc1\x25\xe6\xca\x55\xb3\x8a\xa2\x66\x71\xc1\x87\x27\x90\xd6\x74\xde\x7f\x3a\xc1\x3a\xed\x3a\x1b\x91\x2d\xb2\xf1\x83\x13\xac\xd4\xe4\x61\x16\x9c\x4d\x38\x99\x7c\x9a\x97\xa3\xab\x76\xeb\x7c\x5a\x6a\xde\x8d\xe8\xa2\xd3\xd8\x5b\x74\xe0\x17\xe0\xc0\x7c\xc1\xb7\xbc\x10\x87\x18\x9c\xb6\xbd\x8e\xd0\x89\x8a\x17\xd3\x89\x73\x81\x55\xb3\xe3\x34\x5f\xdf\x3d\x71\x58\xeb\x20\x4a\xc3\x34\xdc\x19\x6e\x97\xd7\x65\x6e\xe4\xe0\x7b\xf0\x7f\xad\x15\x82\x4a\x2a\x11\x81\xd2\xf0\xfc\xe0\x76\x87\x4a\x2f\x8c\x22\x65\x98\x11\x98\x3d\xd2\xd0\x0d\xe9\xa2\x73\x6a\x83\xcd\x5e\xc3\x0f\x91\xa1\x35\xdc\x30\x86\x10\x5e\x5b\x6d\x26\x46\xeb\x58\x26\x42\x48\xb9\x3a\x5a\x6b\x37\x1b\xe5\xbd\xe6\xc6\x2b\x57\x10\x5d\xf6\xda\x2d\x36\x48\x90\xe2\x1f\xfd\x02\xe3\x71\x73\xb9\xff\xc2\xd4\x8e\x98\x30\x09\xcf\x42\xb5\xd9\xb7\x9c\x89\x5c\xea\x7d\x69\x65\x05\x95\xfe\x29\x00\x5f\xc7\x49\xf7\x50\x89\xac\x7c\x49\x10\x81\xe6\x12\x18\x80\x11\x81\x52\xfe\xf0\x48\xf8\x99\x18\xa7\x46\x58\x49\x25\x15\x3e\x2f\xf4\xde\x4b\x02\x8c\x42\xda\xdf\xe8\xe4\x83\x90\x03\x14\xb5\xc1\x87\x3b\x5c\xf9\x92\x51\xea\x99\xc6\x95\x59\xf3\xb1\xb8\xb4\x77\x4c\x53\x8f\x32\x2a\xa9\xa6\xc0\x5c\x65\x09\xa9\x50\x4c\xa8\xa0\x0f\x2c\xed\x9a\x46\xa0\x05\xa3\xd2\x0d\xe4\x29\xeb\x73\x07\x0a\x31\x22\x88\xfb\x59\x87\x0b\xce\x0c\x2a\x8c\x59\x22\x43\x2b\x23\xca\xb9\x5c\x6a\xae\x5e\xcb\x4b\x27\x28\xb4\xab\x7c\xc9\xa8\x8d\x60\xd1\x31\xba\x72\x13\x0a\x1a\xdc\xd8\xaf\x3f\xdb\x8e\x59\x84\x36\xe3\xc2\x0a\x9f\x85\x0a\x62\x63\x68\xd3\x07\x94\x8a\xd1\x32\x91\xae\xe7\x2b\x5b\x2f\x76\x3c\x6d\x5d\x9e\xe2\xbc\xa3\xb3\xa8\x42\xa5\x2b\xcb\x93\xb5\x6b\x52\x7a\xf6\xfc\xd3\x5c\x47\x50\x0b\xd3\x32\x4b\xa3\x52\x33\xc7\x91\xcf\x05\x87\x2f\x20\x0b\xb2\xfa\xf7\xfd\xcc\x4a\xee\x64\xf7\x29\x05\xab\x65\xfd\xde\xec\x56\x03\xad\x34\x7e\x4d\xd4\xc4\x83\x9f\x57\xd1\xb3\xab\x5d\x3f\xe4\xfa\xda\xd6\xdd\x84\x71\xcb\x8c\xe0\x65\x92\x22\xb5\x57\x5e\xe3\x32\xcc\xa0\x14\xb8\x66\x3a\x0c\x05\x47\x94\x18\x34\xbf\xfc\x34\x0f\x2d\xc3\x46\x3d\x14\x3a\x16\x5e\xc0\x6b\xb4\xab\x83\xa0\x60\x36\x51\x8c\xf2\x4c\x44\xc2\xfa\xc3\xb7\x1a\x17\x6e\x7a\xdc\x38\x82\x65\xca\x74\xac\xad\x8b\x2f\xcb\x0c\x01\x00\xe5\xc2\xe2\x33\x13\x95\x76\x54\xe8\xd0\x04\x00\x3a\x62\x54\x82\x27\x3f\x90\x47\x5c\x09\xba\x39\x1c\x74\x3b\x16\xa8\x40\xa1\xe3\xdc\xa2\xd3\x57\x73\xa3\xeb\x2a\x50\x46\x49\x8f\x5b\x87\x6d\xf8\x43\x34\xf0\x6d\xf2\x26\xf9\xff\x41\x11\x92\x1e\xb8\x9c\x35\x80\xc9\xa0\x52\x9d\x5d\xcc\xc2\x85\x15\x20\xa1\x8c\xd6\xf6\x4e\xe4\x24\x8f\x70\x7c\xb6\x79\x30\x14\x1d\x07\x5c\xd8\x2d\x8e\x4e\x24\x4c\x5c\x5e\x3f\xb7\x2d\xdb\xd5\x96\xdb\x84\xd9\xee\x6c\x38\xa0\xd3\x83\x7d\x57\x09\xa3\x8e\x56\x76\x7e\xa6\x72\x03\x9d\x56\xb6\xe5\x1c\x72\x3b\x97\xaa\x9c\xed\xcd\xe7\x74\xb2\x05\xef\x81\x58\x10\xf9\x95\xe1\x41\xc5\x7a\x7a\x04\xfb\xb3\xfd\xd9\x11\x56\x54\xf9\x0f\x8d\x8a\x17\x35\xb9\x90\xff\xaa\xcc\xc9\x43\x45\x68\xf7\xf5\x13\x28\x40\x89\x62\x45\x19\xab\xe2\x96\x29\x2d\xb3\xcc\x65\xc6\x8c\x9f\xf7\x0e\xb8\x97\xf8\x0e\x1f\xee\xb5\xb5\x96\x69\xd0\xea\x6d\x1c\xd4\x62\x63\x46\xca\x03\xff\xd2\x8b\x1e\x32\xa1\x44\xee\xfb\x6e\x10\x7a\xb9\xf9\xe4\x20\x76\xe3\x61\x32\x0d\x45\xf9\x23\x04\x7c\x99\x09\x1e\x2b\x2a\x78\x2c\x94\x83\x41\xe4\x89\x9f\xe8\x46\x84\x14\x14\x64\x85\xe7\x82\x7b\xaf\x75\xee\xcd\xe1\x96\x1b\x22\xe1\xc8\xb5\x81\xda\x82\x26\x0e\xb9\x8d\x39\xa2\x7e\xe1\x28\x15\xd5\x04\x44\x95\x0d\x20\x55\xb1\xc7\x7c\xae\xc3\xa8\xdf\x4d\x23\x1d\x89\x72\xa9\xa7\x6d\x4e\x95\x97\x95\x6f\x1a\xa7\xa3\x66\x6c\x9b\x82\x71\xa6\x75\x92\x70\x06\x9f\x2d\x40\x82\x62\x96\x51\x26\x58\x77\xdc\x5f\x5b\x5b\x9a\xc4\xa1\x44\xe6\x7a\xf0\x02\x04\x75\xbb\x85\xdb\xc0\xcf\x03\xf3\xf8\xce\x28\x4a\xbd\xe0\xc9\xab\x07\xdb\x0a\x39\x57\x20\x24\xa2\xb4\x00\x41\xd8\x2f\x36\xb7\xd3\x47\x97\x5b\x61\xa4\xb4\x05\x4e\x6b\xa1\x48\xb6\xf0\xc1\xaf\x79\x9d\xfe\x64\x72\xc9\x39\x6a\x00\x1b\x32\x23\x32\xc1\xcb\x90\x06\x98\xc2\x94\xd3\x40\x68\x15\x7a\x36\x4f\x86\xdb\xcf\x67\x3b\x6b\x45\x2a\x10\x10\x7d\x57\x00\x91\xca\xb3\xe5\x3e\x46\xce\x4c\x69\x42\x95\xa8\x40\xa7\x94\xa7\x4a\xd3\xca\xa6\x31\x54\x40\x9b\x1b\xe7\x0f\x95\xf2\x4c\x7d\xf5\xa6\xd0\xbe\x29\x13\xee\x7a\x1c\xa6\xe5\x6e\x17\xac\x4c\xf3\x13\x6b\x14\x77\xf4\xb1\x15\x47\xd1\xbf\x3b\xfe\x2d\xf8\x57\xf0\xcf\x88\x25\x23\x72\x9e\x3c\x41\x48\x3a\x17\xdc\x70\xc0\x9a\x45\x00\x70\x76\x12\xa2\x4c\x88\x5c\x7d\xb5\x8b\xf3\xec\x65\xb2\x09\x62\x30\xab\x72\xe8\xa0\x5c\xc0\x0e\x6c\xbb\x5b\x93\xd9\xff\xee\xaf\x6b\x53\xb4\x8a\x46\x3b\x08\x6b\xb2\x51\x80\x89\x97\x37\xcf\xad\x07\xa1\x35\x9d\xee\x39\xf7\xa9\x34\xbc\x74\xe1\xa3\xcd\xba\x5e\xbb\x7b\xee\xd9\x1f\xeb\x76\x8a\xc6\x93\xc1\xd2\x4e\xfd\xb3\x8c\xbe\xde\x6f\x0f\x07\x5f\x7a\x6d\xe3\xc9\x59\x4f\xd4\xce\x7d\xfb\x23\xca\x03\xb8\xc3\x76\xc7\xe7\x9e\x08\x6d\x5e\xdf\x5c\xff\xd0\xa8\x76\xf5\x72\xf7\x42\x7f\xb9\x5e\xdb\xdf\x9f\x6d\x0d\x86\x6e\xf8\xc8\x57\x47\xc9\xa3\xdb\xeb\x2f\xdf\x9d\x52\xfe\xe6\xe3\x77\x8e\xae\xe6\x0c\xe8\x32\x34\x9f\xf9\xc0\x0b\xcf\x7f\x5a\xe2\xfa\xcd\xa7\x5f\x5a\xb9\xf7\x51\x69\x95\xd3\xc4\xe6\xc7\xdf\x3d\xce\xe1\x3f\xc3\xcf\x90\xa7\xc8\x3d\xf2\x2b\xe4\x5f\x93\xdf\x25\x24\x1d\x8a\x13\x21\xf6\xca\x61\xef\x4e\xab\x70\xe9\x60\xdf\xe1\xb4\xc4\x19\xc6\xa3\x05\x5d\x48\x15\x70\xcf\xd1\x48\xef\x47\x77\xa5\x7b\x93\x45\x7f\xd9\x51\x04\x0e\xc7\x93\xe1\xe0\x21\x02\xcd\xd9\x65\x3a\x3b\xa1\x61\xa2\x15\x60\x6c\xb7\x98\x5e\xa1\x0b\x09\xfb\x2e\xe4\x45\x56\xeb\x88\xe9\x99\xea\xc3\x9c\x7f\x7c\x21\x79\x9a\xa7\xe3\x83\xcb\xb0\xf7\x10\x45\x21\x14\x0b\x2f\xbd\x28\x7b\x7f\x81\xc5\xdd\xf3\x8c\x16\x91\x2f\x45\xe9\x6c\xc7\xba\xb6\x96\xd8\x8d\x35\xc7\x9b\x40\xd1\x2b\x02\x47\xf1\x5e\xe1\x45\x81\x73\xc3\xa5\x4c\xb6\xb3\xef\x5b\xcd\x3c\xfb\xc8\x63\xcd\x76\x2f\x34\x46\x3a\x2b\xec\x34\x2d\x1f\x03\xaa\xb4\x1f\x25\x00\x79\x98\xb9\x21\xa7\xf1\x38\x91\x2b\x41\x27\xb6\xca\x17\x52\x52\x81\xd6\x2b\xb4\xc7\x34\x45\x21\xfc\x20\x64\x5a\x64\x42\x69\x1a\x28\x54\x18\xc4\xdd\xa5\x5e\x62\x25\x67\x92\x51\x0e\xa0\x54\xb1\xbe\xd4\xbb\xfc\xb4\x1f\x68\xdb\x99\xbe\x57\xdb\xd5\xac\xcc\x4d\x11\x21\x42\xb0\xea\x4a\xaf\xc9\x68\xb3\xbb\x7a\xd8\x69\x48\xbe\xfc\xec\x70\x9b\xf3\x28\x59\xc9\xe2\x94\xd2\x44\x59\x84\x1f\xa1\xc2\x52\x56\xbf\x75\xf8\xe4\x07\xaf\xdd\xee\x0c\xe3\xf2\x03\xc4\xc8\x05\x53\x0e\x21\xc7\x03\x6e\x95\xad\x75\x3b\x35\xcf\xa1\xfe\x5d\xef\x4a\xa1\x5a\xcf\x6f\x3e\xf9\x17\x03\x8e\x60\xa4\xaf\xdd\xb4\x3c\x57\x99\x17\x3d\x40\x64\xe0\x05\xbd\xa5\xc0\xf8\x48\x11\x1c\x1d\x09\x72\x6d\xad\xe0\x20\x85\xc7\xac\x29\xae\x5c\xbe\x73\x77\x76\x18\x53\x57\xb9\x08\x22\x8d\xe0\x97\x51\xbd\xac\xe8\x81\x9d\x58\x9b\x63\x4c\xce\x51\xf1\x08\x51\xd8\xe7\x66\xe7\x0f\x9f\xea\x9e\x2f\x7d\xbc\xc8\x5a\x9d\xcc\x94\x3b\xf9\xdb\x4e\x00\x68\x7d\xb4\xbf\x3d\x5a\x05\xba\x32\xdc\xe9\x5f\x30\xb0\x3b\x58\xaa\x35\x00\xea\xad\xe5\x71\xdd\x53\x40\xd8\xf1\x7f\x3d\x5e\x42\x05\x3f\x47\x9e\x21\xdf\x4f\x3e\x47\x7e\x9d\x90\xe5\xc5\x8d\x76\x1b\xae\xb2\xd8\xbb\x0f\x37\xb0\xe7\xcb\xb0\x34\xf3\xbd\x33\xed\x99\xc9\x42\x1b\xb9\x5a\x80\xd5\xe2\xac\x38\x1e\xe8\x22\xee\x9c\x9e\x8c\x54\x55\xc4\x23\xf3\x32\xc8\x62\xfc\x64\xb6\x09\xe2\x04\x3e\x33\x47\x42\x14\x4e\xb6\x65\x1e\x33\x57\x1e\xca\x8d\xbe\x3e\x54\x90\x2e\x93\xcf\xfd\xc9\x42\xb0\xdb\x45\xb2\x45\x4d\xc0\x25\xb8\x71\x78\x74\xf5\x51\x3f\xde\x99\xee\x7c\xe6\x26\xd0\x5a\x57\x24\x81\x51\x49\xae\xb3\x20\x96\x82\x03\x43\x1a\xd5\x58\xa6\x18\xf0\x80\x33\x2f\xac\x21\x68\x15\x85\xad\x8e\x58\xbd\xc0\x6c\xd6\x0f\x0c\x65\xbe\xd4\x5c\xd5\x79\xdf\x47\xf6\x79\xb1\x5c\xd4\x28\x6d\x8d\x6e\xd4\xeb\x32\xd3\x0d\x33\xa0\xaf\x32\x96\xc9\x34\xed\x3c\xb3\xbb\xc1\x59\xb3\xbd\x35\xbb\x14\x48\xec\xae\x3e\xf7\x58\x7f\x6b\x3d\xf0\x2e\x9e\xdf\xdb\x3b\xa2\x26\xb4\x02\x90\xb9\x69\x47\xca\x86\x6d\xdd\xab\x79\xd4\x61\xf1\x95\x52\xb6\xe0\xc8\x55\x21\x1a\x91\xa3\x5a\x66\x5a\x26\x59\x11\xc5\x3c\xf1\x85\x1f\xf7\x61\x57\xf0\xa5\xf1\xd1\xa3\x5f\xd8\x5c\x4d\xdb\x14\x53\xc7\xc2\x23\x24\x30\x6d\x1a\x99\xa1\x8c\xb2\xa8\xae\x26\xef\x5e\x7f\xf5\x30\xd9\x8a\xca\x5c\xd5\xd6\x7d\x6d\x10\x84\x70\x33\x7a\x46\x06\x89\x2e\xd3\x38\xa0\x11\xcb\x1b\x93\x3b\xb0\x82\xf1\xc6\xda\x64\xd9\xf8\xf5\x6e\xe7\x6a\xdd\x68\xaa\xcb\x34\xb5\x76\x78\x50\x8c\xba\x61\x72\x7e\x7b\xef\x20\x6f\xf4\x64\x40\x37\x5b\xb6\xde\x5c\xf9\xdc\xd5\xcd\x5e\x57\xb0\x4d\x1e\x32\x1a\xa2\x0d\x5e\x5a\xab\x15\xa5\xd9\xe7\xe5\xfe\x91\x0c\x24\xa5\xc0\x18\x0d\x1a\x17\xd2\xa3\x57\x6e\x7f\x7a\xdd\xb6\x62\x8a\x54\xb8\x81\x52\xe9\xea\xd7\x86\xaa\x16\xc1\xe3\xdf\x39\xfe\x5d\xf8\xeb\xf0\x8b\xe4\x2e\xf9\x1a\x21\x95\xac\x9c\xe3\x99\x0f\x30\x74\x44\x73\xe5\x7d\x1d\x3c\x44\xbe\xe5\x96\xc7\xf4\x64\x56\x6e\x4e\xda\xee\x32\xaa\x53\x35\xe1\x32\x71\x28\x5c\xad\xab\xf6\x3e\x52\xb9\xd3\xa9\xdd\xd9\x29\xe7\xdd\x6c\x5a\x8c\x4f\x20\xd9\xa5\x79\x5b\xc4\x3e\x55\x82\x35\x27\x66\x16\xa7\x46\xf8\x6f\x0a\x3f\x69\x9b\xdb\xfb\x45\xdd\xd2\x66\x16\xa9\x64\xe9\x9a\xf5\x27\xad\x00\x91\x25\x3c\xd1\x2b\xf5\x86\xaf\x57\x76\xd6\x7c\x23\x02\x64\xd2\x1f\x1a\x55\xaf\x2a\x97\x5e\x76\xab\xa9\x43\xd7\x54\x2e\xc3\x09\xb8\xc7\xf2\xab\x52\xaf\x2d\x31\x8f\x27\x2c\x51\x91\xe1\x01\x33\xd9\x60\x64\xd4\xd5\x83\x66\xc8\xa4\xc7\x1b\x9b\xd4\xd6\x8a\xa9\xe0\x94\x59\xf0\xd2\x20\xe9\xf7\xf2\x5e\x68\x11\x42\x3b\xfe\x48\x2b\x2e\x83\x52\xe5\x35\x52\xca\x7b\x81\x89\x6c\xa0\x02\x14\x54\x18\xf8\x92\x6b\x0d\xf7\x96\xee\xdc\xb9\x1b\xf7\x43\xc3\x29\x72\x70\xfd\x06\x8e\x42\x0d\xaf\x5c\xd9\x1d\x8f\x36\x0b\x99\xd7\x93\x32\x89\x68\x50\x3a\x57\x27\x6b\x04\x75\x3f\x16\x11\x50\x2e\x99\x02\x9a\xab\x28\x62\xf8\x16\xda\xc3\xf6\xca\x3b\xbd\x32\x28\x00\x21\xc3\xdc\x81\x33\xb5\x06\xce\x34\x37\xd6\xe7\x71\xb7\x76\xfb\xc6\x9d\x02\x7d\xe9\x81\xe5\x5a\x2a\xdf\x72\x69\x64\x2a\xfd\x48\xd5\xe3\x61\x3e\x28\x4f\x1d\x19\x1f\xb0\x66\xb8\x2a\xc3\xf4\x50\x69\xaa\xe6\x18\x8c\xff\x72\xfc\x3f\xe0\x3d\xf8\x17\xe4\x2e\xf9\x51\x42\xd2\x0e\x64\xc5\x43\xe3\x9b\xa7\xf4\x85\x5d\x5c\xe0\xec\xe7\xbe\x6b\x3c\x27\xc4\xad\x9a\x5c\x79\x76\x56\x5d\xb3\xb4\x25\xfb\x33\x17\xfe\x9e\xa0\xec\x17\x27\xc4\xca\x99\x89\x05\x8f\xe6\x89\x87\x75\xdd\xb0\xf2\x91\x7f\x2d\xf4\xdb\x72\xba\x92\xcd\x24\xdf\x1a\x1d\x1d\x4d\x8f\x3e\x28\x69\x1e\xa6\xad\x48\x16\xa9\x17\xfa\x51\x8e\x80\xa2\xe1\xef\xe6\xed\x51\xce\xbc\x27\xae\xac\xdc\x7d\x2c\x61\x5c\x72\x97\x61\x61\xa4\x3d\xc6\x85\xd7\xf7\x9a\x49\xf4\xe7\xfd\xc6\xbd\xb5\x83\x4b\x8a\xad\xaf\xce\xec\x58\x33\xc6\x55\xb7\xd7\x6a\x79\x8d\x06\xb5\x09\xa3\xfc\xc2\xc1\xde\x9b\xed\x3e\xe3\xc3\x70\x34\x53\xcb\x59\x03\x64\x6b\xd2\xec\x07\xf0\x02\x13\xed\x28\xd0\xe8\x6b\xbb\xf4\xe2\xe5\x7e\x03\x69\x92\x3e\x75\xa1\x25\xb8\xf6\x73\x35\x68\x28\x1f\xa0\x86\x4a\x27\xa1\xcc\x55\xd8\x18\xd6\x6e\xbc\x9a\x1a\x5c\x5b\x96\x41\x19\xff\xa6\x88\x92\xd5\x0c\xe7\xc8\x98\xb7\xa4\xeb\x9c\x6f\xe2\x33\xcd\xd0\x0f\x3f\xb8\xd7\x5e\x8a\x0b\x59\xeb\xdb\x28\xd2\x4b\x88\x35\xd3\x1d\xf1\x40\x23\xae\x5c\x8e\x22\x96\xd6\x36\x6e\x65\x46\xf9\xd4\x66\xad\x35\x2e\xad\xea\x59\xd5\xb6\xe5\x3d\xfa\x37\xc7\xdf\x83\x5b\x78\x44\xee\x90\xaf\x10\x92\x0e\x82\x05\x94\x55\x8a\x22\x9f\xcf\xaa\x56\xc1\x5c\x77\xde\x05\x39\x78\xdf\xbd\x9b\x8b\xa5\x4d\x86\xa7\x0a\x46\x15\xc6\xf5\x64\x37\x16\x73\x65\xc8\xb9\x5c\xc2\xc9\xfd\xca\x1c\x9c\xbd\x6a\xf3\x9d\x48\x46\x0c\x4f\x21\x75\x0f\x63\xa8\x16\x42\x19\x30\x9d\xfc\x24\x70\x4e\x71\x67\xdb\xd4\x5d\x25\x2f\x54\x09\x37\x1a\x7d\x34\xa6\x19\xdd\x1a\x8f\x1b\x75\xa7\x14\xae\x7a\x51\xab\xae\xa4\x93\xde\x4a\x20\xf7\x5c\xec\xcb\xb4\xb9\xec\x7b\xd2\x8a\xc4\xe9\x05\xff\x15\x50\xa1\x8e\x28\x0d\x83\x46\x44\x07\x59\x6a\xa8\x46\x2a\x58\x68\x5d\x47\x40\x49\xe0\xc0\x95\xed\xf4\x6b\xd2\x93\x75\xeb\x35\xd2\x36\x26\x9e\x0c\xa4\x62\x32\xcf\x41\xf1\xa6\x27\x03\x13\x30\x8a\x6c\xd4\xdb\x98\x7c\xa4\x59\xcf\x50\xa2\xd0\x52\x62\x9d\x22\xec\xbe\x14\xb8\x92\x1a\x2f\x4d\x78\xda\xdb\x0d\x2f\xda\xd5\x3b\x8d\x88\x7b\x26\x8d\xe3\x32\xd2\x0c\xa8\xce\x07\x9f\xd9\x18\x96\xbb\x1e\x5d\x42\xac\x5c\x2a\x44\x45\x3c\xca\xc6\x63\xf3\xeb\x65\xf0\x21\x6b\x6d\xdf\xa3\x14\xbc\xe5\xe5\x75\x8f\x3b\x46\x7f\x90\x94\xc5\x3a\xb4\x2b\xc3\x78\xae\x1b\x81\x3c\x5f\xea\xca\x32\x26\x47\x2e\xb2\xf1\x5b\x2d\x40\xf0\x05\x32\xc6\x23\x2f\xe9\xb7\x0a\xeb\xcb\x46\x71\x75\x7f\x68\x3b\xeb\x6b\x45\x79\xdf\xff\xf9\xf1\xbf\x47\x0d\xdf\x22\xaf\x91\xdf\x2a\xef\xfb\x9c\x48\xb6\x0b\x01\x56\x57\xff\x32\x5c\x81\xdd\xe9\xde\x5c\xe4\x6a\x0e\xa8\x80\xaa\xe7\x34\xdb\xdb\x9f\x9d\x0c\x6c\x6d\xe2\xc1\x78\x56\x86\x08\x83\xc9\x60\x72\xba\xbf\x17\xac\x33\xd5\xaa\x49\xab\x15\x73\x19\x2b\x83\x7e\x26\x37\x3d\x23\x41\xfd\x50\xbc\x70\x26\xae\xdd\x9b\xf6\xa0\xea\x94\x1c\xc2\x82\x8e\xd4\x55\x1c\x4f\x54\x52\xdc\xc1\x49\xa4\xb2\x80\x64\xfd\x18\xf2\xa8\xd3\x59\x4e\xd2\x30\x44\xe1\xa3\x37\xd9\x98\xee\x73\x55\x49\xde\xf8\xc0\x80\x0b\xa5\x14\x57\x0c\x04\x9a\xe6\xca\x72\x27\x90\x00\x54\x32\x1d\xd6\xb4\x11\x40\x31\x6c\x98\x68\x94\xaa\x84\x53\xc1\xa4\x83\x01\x22\xd7\xfb\x8d\x4e\x20\xa3\x4e\x6c\xc1\x63\xf0\xa3\xc1\x8d\x5b\x57\xf6\x7d\x16\x51\x15\xf8\x59\xaa\x2d\x7a\x0a\xfc\x83\xb5\x61\x31\x96\x4e\xc6\xc9\x0b\xeb\x01\x65\xb1\xd7\x62\x65\x2c\xcc\x28\xa5\xda\xca\x88\x51\xc5\x3d\x3f\xb7\x59\x48\x93\x51\xdd\x57\x5c\x50\x14\xcc\x13\x80\x50\x0f\x1c\x67\x8b\x40\x8f\xe9\x30\x57\x5e\xc0\x34\xe3\x8d\xde\x78\xad\x1d\x1b\xc1\x3d\x86\xf0\xc5\x72\x5d\x06\xba\x91\x4d\x56\x3a\x1b\xde\xee\x53\x7e\xd0\xc5\x72\xd1\x50\xaf\x02\x4d\x21\x95\x36\x92\x96\x73\xce\xe7\x85\x54\x2a\x74\x10\x0d\x55\x9c\xd0\x4f\xbd\x0e\x58\xe6\xa0\x5c\x04\xa3\xde\xca\xb8\xbf\x1c\xd4\x3b\x65\xbc\xd3\xde\xf9\xdc\x8c\xb5\x0d\x7f\xf0\x03\x6a\x39\x8d\xef\x5f\x8e\x2f\xd4\x46\x69\x6c\x10\xbc\xd8\x42\x28\x6a\x46\x03\xed\x2a\x5f\x78\x0d\xd8\xf9\xd8\x5a\x81\x1c\x31\x32\xfa\xd2\xf2\xb8\x53\x37\x88\x54\x46\xbe\xa7\xb8\x7b\x13\x73\x75\x0f\x3f\xa1\x1c\xe1\x95\x77\x99\x4a\x94\x6c\x39\x29\x6a\xa1\x83\xac\x29\x19\x20\x17\xee\xa1\xc8\x8c\x20\x78\xfc\x8f\x8f\x7f\x1b\xfe\x10\xbe\x41\x6e\x91\xbf\xe7\x7a\x66\x2e\x4a\xe8\x61\xad\x07\x27\xac\x4c\x0b\x8e\x10\x67\x5c\x86\xc5\x43\x0c\xdf\x0f\x75\x45\x0e\xf6\xc7\x47\x30\xaf\x86\x1e\x8c\x67\x67\x44\x96\x5d\x25\xa5\x22\x68\x3a\x49\xaa\x9c\xb0\xcd\x62\xe8\xd0\x79\x8e\xd3\xb1\x8f\x13\x28\xaf\x5b\x4e\xd2\xcd\x93\xba\x33\x2d\x7e\xfd\x77\x3a\x1b\x2b\x2b\xb3\xb5\xc0\x6f\xa6\x34\x14\xdc\x7a\x1e\xeb\xac\x6d\xb6\x69\x2c\x42\x25\xa9\x80\xa4\xd7\x69\x44\x0a\x98\x6b\x1e\x22\x95\x5e\x96\xc6\x4a\x50\xca\x78\xb3\x1e\x06\x2d\x00\xfc\x3a\x67\xbe\x12\xe0\xcb\xd0\x04\xed\xde\x28\x0f\x94\x8f\x34\x13\x08\x2a\x6c\x60\x7b\x7d\xb3\xeb\x05\xcc\xd7\x69\x4c\xf9\x62\x04\x51\xfa\x28\x9b\x0d\x7f\xef\xb6\x32\x00\x12\x82\x95\xe7\x37\xbb\xb1\x0d\x95\x41\x34\x4c\x72\x90\x00\x0d\xeb\x21\x80\x90\x51\x9a\x7a\x02\xfe\x42\x99\xb1\xb7\xef\x34\x7b\x37\x77\xe5\x76\xc1\xa3\x24\x66\xc3\x27\x9e\x1b\xd1\x9a\x8c\x8c\x40\xaa\x05\x07\x05\x2c\x10\x8a\x0b\x2f\xee\xae\xaf\x74\x43\x2d\xa8\xc0\xb0\x9b\x2c\x5d\x1f\x0b\xaa\x68\x3d\x0f\x91\x6a\xeb\x79\xa1\x2b\xa2\x08\x69\xa4\xb2\x51\x2c\x11\x44\xdc\xa7\x4b\x4f\x3f\x3f\x88\x73\x91\xa8\x58\x54\x72\x4d\x8c\x49\x93\x6f\xf1\xe8\x91\xc3\xfa\x4b\x1a\x7c\xa9\x59\x88\xca\xb1\x19\x31\x6e\xac\x42\x8a\x26\xcd\x21\x62\xdd\x4b\x6d\x1f\x11\x55\xd0\x59\x59\xed\x04\x55\xac\xf0\xf3\xc7\xdf\xa1\x06\xbe\x49\xfe\x3f\x68\x96\xd9\x73\x05\x07\x59\x00\xdf\x67\x65\x12\x7b\x12\xc4\xcd\xbf\xce\xcc\xe5\xb9\x21\xa9\x87\xfa\x0f\xb3\x05\x3e\x7b\xd1\x18\x7b\x7f\x03\xcd\x3d\x6f\x52\x9c\x12\x6c\x8f\x27\x47\x78\x32\x7e\xea\x56\xc2\xfe\x9c\xaa\x70\x6f\xd7\x59\x98\x6c\x61\x69\xb2\x45\x7a\x32\x5c\x14\xd7\xe7\xfd\xb0\x6a\x35\x55\x26\x6b\xef\x0c\x45\xc4\x42\x2a\x43\x9c\x8e\x09\x9c\xf6\xff\x8a\xb3\x2c\xcb\x42\xae\xa3\x2b\xeb\x9d\x25\x85\x38\x89\x7b\xbe\x82\x2a\x6c\xae\x6d\x6c\xde\x59\x0d\x93\x42\x16\x5a\x24\xfd\xed\xa8\x62\x86\xf7\x34\xe3\xc2\xe8\x6e\xc7\x08\x2e\x54\x50\x5f\x4e\xc5\xf6\x3e\x8d\xe2\x8b\x9d\x34\x60\xac\xc3\x45\x3f\x8e\xea\xb5\xad\x22\x0b\xa4\x68\x8f\x57\x3b\x4a\xca\x78\xa0\x79\xb9\x90\xb8\x4a\x8a\x56\xee\x7b\x89\x8d\x8c\xc3\x4d\x18\x6e\xd8\xd7\xf4\x76\x3f\xf3\x95\xe0\x9e\x17\x83\xae\xab\x5a\x1c\xa4\x17\xb7\xa4\x46\x50\x00\x5a\x9e\xfb\xc0\x46\x3b\xf6\x1c\xc8\xd0\xa5\x38\xae\xed\x14\x96\x69\x2f\x50\x2a\x19\xe7\x3a\xa9\xe7\x91\xa1\x6c\x50\x98\x2c\x64\x86\x49\x13\xf7\xd6\x57\xbb\xb1\x96\x4c\x23\x5a\xa6\x80\xbb\x52\x6b\x54\x67\xda\x0f\x3a\x8c\xe6\x16\x45\x26\xac\xb2\x59\xf7\x7a\x42\x55\xe4\x68\x4f\xd0\x0a\xe5\x68\xee\x35\x0b\x37\x37\x44\xb2\x5c\xc4\x46\xd9\x72\xb3\x09\xe9\xf9\xad\x8e\x86\x2f\x02\x67\xb2\xfd\x74\x6f\xf6\x48\x74\x38\xd2\x8d\xf3\xf7\x3a\x1a\xcb\x94\x1b\x0d\x13\x26\x4b\xae\x5f\x4d\xad\xd4\x61\xfd\xc2\xf3\x5b\xf6\xc5\x55\x34\x8c\xa1\xe6\xeb\xdd\xa5\x83\x76\xf9\xc2\xb7\x2f\xad\x24\x4a\xb8\x66\xb3\xf2\x0a\xc1\xb5\xd1\xbe\xb6\xf5\x46\x3b\xd0\x8c\x2b\xd3\x2e\x3a\x9d\x7a\x27\x90\x22\xfa\x4e\xf8\xcc\xac\x93\x18\x41\x15\x13\xb9\xa4\x38\x3c\xca\x6e\x1d\x74\x26\xbb\x06\x7c\x55\x66\x5b\xca\x47\x55\x7a\x6e\x21\x01\x91\x32\x69\xd3\x4a\x48\x8c\x52\x5f\xa1\x88\xf3\x46\x33\xb1\x02\x85\x6d\x14\xb5\x10\x69\x11\xf9\x8d\x9a\x33\x94\x82\x4b\xc6\x90\x0a\x13\x68\xa7\x8a\xe3\xb5\x77\xb6\x19\x18\x5b\xdf\x6e\x84\xbd\xc4\xd4\x03\xee\x3a\x14\x65\x14\xa0\x93\x40\x54\xc2\x49\x66\x74\xcf\x9c\xfb\xd0\xb4\x9b\x7a\x11\xa5\x8a\x4a\x93\x36\x0f\xaf\x27\x84\x20\x21\xc7\xff\x16\x77\xe0\xf7\xc9\x2b\xe4\x7f\x11\x92\xce\xe7\x04\x17\x18\x80\x69\x25\xb2\xbd\x08\xab\x1c\xe0\x32\xcf\x64\x19\x42\xbb\x38\xef\x4c\x39\xea\x64\x53\x2d\x18\xe3\xe4\xdc\xab\x56\xd6\xd2\xfd\x37\x1d\x9f\xe0\x1b\x16\xdc\x0c\x0e\xb5\xb5\x68\x65\x4d\x7b\xb0\x48\xe8\x17\x6e\x7a\x7a\x16\x49\xd6\x83\x2e\x16\xbb\x0b\x89\xcd\x6a\x8b\xac\xcf\xc9\x1f\x4f\xf2\x84\x1e\x54\x14\xbc\xee\xa4\x21\x2e\x32\xc0\x2a\x6b\x3c\x70\x41\xc8\xc1\xd9\x8d\xf2\x12\xda\xce\x4e\xa6\x1d\xf8\x87\x79\xf1\xe0\x46\xa7\x21\x85\x99\x74\xac\x51\x9c\x1b\x13\x49\x0a\x1a\x15\x1d\x48\x68\xad\xfa\x4c\x08\x1a\x4f\xca\xbb\xca\x00\x6b\x71\xab\xdf\xd3\x41\x26\x59\x79\x41\x07\xdb\x22\xd0\xa1\xed\xd6\xc3\xc0\x48\x37\xa9\x1a\xc7\xd8\xcc\x77\x23\x1e\x7b\x20\xa4\x46\x1e\x2c\x8f\x06\xa1\x66\xc0\x84\xdd\xeb\x05\x06\xb9\x6f\x12\xe1\xf9\x22\x8c\x3c\xc5\x84\x16\xcc\x7a\x9e\x41\x26\x2d\xdf\x1e\xe5\xa1\x9f\x84\x01\x03\x6c\xfb\x31\x00\x08\x54\x22\x02\x0c\xb8\x86\x72\xfb\x74\x0e\x5a\x41\xe8\xa8\xb1\x93\xe5\x08\x5c\x2f\x26\x8d\x43\xce\xe3\x56\x02\x68\xe3\x80\x53\x10\x03\xee\xcd\xb5\xa1\x83\xe6\x44\x0b\x46\x95\x0a\x7d\xf8\x49\x1a\xf7\x76\x33\x4f\x4a\x4f\x48\x9b\xb6\x77\x5e\xe1\x8a\x8a\xf0\xfa\x6e\x14\x2a\x41\x39\xb2\x54\x73\x2c\x34\xe3\xb1\xbc\x91\x06\xac\xcc\xcf\x59\xfd\xc9\x71\x23\x34\x81\xca\x3b\xf5\x56\xaf\x46\x95\x95\x5c\x51\x1d\x2d\x4f\x45\x20\x2d\xb6\xe3\xa5\x66\x24\x38\xe5\x28\x29\x3c\x78\x4d\x84\x91\x00\x2f\xe6\x4a\x70\xa6\xb3\x83\xbd\x9d\x66\xa4\x11\x84\xf0\x77\x97\xf2\xc0\x66\xd6\x50\x44\x21\x02\x41\x7d\xe9\xd7\x22\xdd\xf6\x2d\x20\x0a\x9f\x1f\x4c\x12\x5f\x28\xc1\x13\x86\x11\xab\xf2\xcf\xa8\xbc\xf4\xe0\xef\x35\xb3\xdc\x80\xd0\x7e\x6d\x7c\x37\x47\xee\xc5\x4d\x56\x48\x19\x73\x47\xb6\xc4\x12\x04\x2b\xa4\xc4\xec\x9a\x6d\x48\x46\x05\xe7\x12\x40\x65\xeb\x37\x22\xc5\xa9\x04\x0c\x4b\x3f\xf1\xb7\x8e\x97\x30\x84\xbf\x4b\x5e\x20\xdf\x21\x24\x75\x8a\x89\x27\x54\xf6\xa7\x43\x78\x27\x73\x55\xe9\x82\x6c\xa4\xb4\xcf\x07\x73\xc4\xa2\xeb\x98\xcc\xc5\x15\x42\x76\x86\xd5\x64\xbe\x74\xd3\x2b\xb4\x12\x69\xa8\xaa\x9f\xbb\x15\xd4\x6a\x77\x76\x86\xcc\xb0\xa8\x75\xf0\x14\xc3\x1f\xa0\xc4\x93\x79\xad\xb9\x8f\x9a\x9d\x51\xb4\x76\xdb\x64\x7c\xe6\x97\x0e\xaf\x3f\x5e\x87\xb9\x4f\xf8\x59\x8a\xed\x73\x87\x57\x6e\x8f\xcf\x4d\xea\xc6\xf7\xfd\xed\xfa\x5e\xb7\x66\x03\x50\x51\x0b\x21\xf6\xae\x7d\xf8\x2b\x8f\x22\xe3\x5a\x2c\x15\xa2\xe5\x48\x45\xcb\x6c\xc1\xb6\x8e\x14\x33\x62\xad\x82\xb9\x85\x9b\x5b\x91\xe3\xda\xa0\x3c\xb4\x54\x34\x9a\x81\x50\x8c\xbf\x66\x37\x37\x03\x0a\x10\xaa\x84\x09\xc6\xd2\x90\x49\x14\x97\x5a\x56\x73\x46\x19\x15\x0e\x8e\x58\x69\x6b\x0a\xaf\xc0\xbc\xc7\x95\xa2\x77\xbe\xfd\xf6\x13\x59\x01\xd8\xe8\x8d\x53\x16\x28\x15\x8e\xb2\x55\xa3\x8c\xae\x8f\xd7\x47\xb7\x44\x19\x37\xd0\xd2\x05\x5c\x7d\x64\xa7\xb7\xee\x31\xa5\x99\xeb\x79\xd6\x18\x4a\xe1\xd7\xe1\x93\xa0\x00\x55\xe7\xf2\xa3\xaf\x1c\xae\x4d\x9b\xf5\xdd\xa0\x13\x78\xe3\x75\x1a\x20\xdd\x29\x56\xe4\x4a\xef\x22\x39\x56\x49\xda\xf1\x6f\xb6\x64\x99\x02\x09\xe3\x59\x05\x4e\xcf\xb8\xb3\x2a\x01\xa9\x68\x3d\xf5\x64\xcb\xb1\xcd\x53\x60\x01\x33\x5b\x1f\x58\xe9\x2d\xe7\xdd\x07\xff\x27\x7d\xb2\xfc\xb9\x6c\x08\x5f\x7a\x9e\x8e\x10\x1c\x7b\x34\xd3\x4c\xe8\xd0\x7a\x6e\x10\x89\x2a\xcd\x65\x48\xeb\x57\x6c\x7d\xa4\x1f\xfc\xc1\xd5\xd1\x8e\x9d\x75\x7b\xfb\x8c\x2d\xa9\x73\x75\x26\x73\x6f\x3d\x0b\xd6\x56\xce\xbf\x7c\xeb\xb0\x4e\xad\x54\x48\xb9\xf4\x40\x53\x50\xb6\xa1\xa2\xd2\x5c\x67\x41\xaf\x33\xbe\xe5\x70\xbb\xdf\x3b\xfe\x7d\xf8\x06\x7c\x8b\x0c\xc9\x47\xc9\xef\x55\x73\x66\x6e\x9d\x54\x9d\xed\xb9\x55\xab\x88\x8d\xcb\x7f\xcb\xcc\xf5\xac\x76\x56\xf5\x28\x79\x19\x0e\xa1\xaa\x74\x86\xe0\xb4\xc8\x21\x74\xb3\xdb\x67\x66\x95\xab\xe7\x4f\xca\xdf\xb8\x45\x58\x0d\x88\xed\x57\x82\xa3\x67\xa4\xac\x3b\x98\x05\x18\xc2\xa0\xea\xb4\x87\x50\x9a\xf4\xbd\x8a\xe7\x6f\xff\x24\x60\x9d\xd7\x43\xb2\x53\xb6\x9e\x53\x9e\xcf\xf1\x64\x93\x0f\xcf\x74\x1d\xca\x55\x79\xe0\x5e\x9d\xba\xb7\x01\x1f\x63\xd4\x60\xdc\x4d\xcd\x76\x84\x29\xa5\x6f\xae\x32\x65\x19\x05\xea\x46\xbb\x30\x14\x94\x79\xca\xcd\x6f\x50\xce\x43\xb1\xb1\x73\xe3\xc5\x73\x14\xa9\xda\xbc\xbb\x4d\x55\x62\x3c\x41\x75\x9c\x2c\xa5\x2d\xbd\xc9\x07\x22\xed\x0d\xd6\x29\x7a\x00\x4c\x04\xb5\x74\x25\x98\xd6\x59\xcd\xff\xfa\xca\xcd\x2d\x2a\x84\x08\x8c\x2f\x19\x80\x66\x5a\x21\xf8\xbb\x2f\xdf\xd8\xdb\x50\x0d\x3f\xe4\xac\xf4\x9d\x4c\x20\x0d\x52\xa8\x6d\xf9\x2b\x69\xea\xa7\x26\x6d\xa6\x32\x2a\xb4\xf2\x75\x64\x7c\x4f\x3b\x39\x3d\x97\x6a\xe8\x00\x40\x22\x67\x5c\x68\x63\x95\x66\x86\x83\x69\xa4\xfd\x68\xcc\xc7\xd3\x61\x6a\x25\x47\x8a\x7c\x0e\x1d\x02\x16\x0d\x9a\x85\xee\xa6\xa3\x9f\xa6\xaa\xa0\xed\x16\x80\x10\x20\x53\xe4\x0a\x11\xbd\xb4\xe6\xc7\xa8\x7a\x16\xf0\x6f\x40\x38\x0c\x1d\xf1\x32\xa0\x86\xd5\xf5\xa5\x65\xa4\x9e\x8d\x94\xf2\x83\x5e\x31\xf4\xae\x89\x4d\x45\xa9\x13\x00\x0e\x94\xf6\xd3\x6e\xb6\x1a\xac\x59\x14\x6c\x09\x86\x23\x2a\x25\x0a\xcf\xe6\x9a\xe1\xe6\x9a\xf4\xc0\xa7\x1e\x22\x50\xe3\x35\xe2\x31\x17\x92\x4b\xa5\x28\x05\x26\xc0\x8c\xfd\x95\xb4\x95\x39\x35\xc8\x31\xe4\xa9\x76\x1c\xe5\x15\xd8\x45\x72\xc1\x78\xd6\x62\x74\xec\xe7\xb6\xcc\xfb\x39\x8a\xd2\x1c\xbb\x0c\x94\x52\x4e\xe7\xd8\x24\xca\x1d\x0e\x82\x01\xe5\xf9\xb9\x71\xdf\x1f\xd5\x07\x2e\x8e\xfe\xea\x71\x03\x0e\xf1\x5f\x92\xa7\xc9\x37\x09\x81\x83\xf1\xc1\xd8\xf1\x33\x66\x8b\x76\xb3\x0c\x30\x5b\xb0\xdd\x1f\xc1\x19\xcd\x8e\xd9\xfe\x74\xbf\x22\x89\x9c\x47\xb1\x87\xe0\xb0\x82\x15\xe0\xd4\x59\x33\x87\x3e\x87\x00\x72\x51\x3b\x53\x79\x2b\xf2\x2a\xd7\x1f\x6e\x56\x0c\x50\x95\x6e\xba\x93\xf7\xaf\x30\x62\x30\x3f\x61\xb1\x37\xdd\xdb\xad\x9d\x15\x12\x71\x31\x71\x56\x09\x2c\x49\x01\x2d\x78\x77\x65\xc8\xa8\x90\xad\x7b\xf4\xb0\x59\x94\x59\x05\xf0\xa2\xb7\x53\x8b\x26\x4c\x50\x49\x4d\x8d\x05\x4b\xa6\x97\x50\xc6\x04\xad\x27\x6e\xc2\x05\x28\x8a\xc2\x46\x1d\x5e\x5e\xd9\x76\x73\x4b\x24\x54\x7d\x0d\x7b\x42\x08\x60\x18\xb6\x55\x4b\xb1\x3c\x50\x59\x19\xa1\xd6\x1d\x81\xd1\xe0\xdc\xc5\xe5\xae\x43\xa2\x02\x4f\xb3\x9d\xcc\x13\x81\x2f\xbd\xe2\xb1\xbc\x12\x4c\xa2\xab\x7b\x9f\x2f\x63\x58\x83\x54\x9b\x94\x19\xcd\xfb\x69\x8d\x57\x7d\xdb\x49\x03\xf0\xab\x1c\x28\x5c\xdc\xfb\x61\x31\xae\x0f\x83\xed\x15\x6c\x6c\xad\x7f\x50\x4f\xb2\x8e\x6d\x6d\xb4\x0a\xc9\x0c\x50\x30\x05\xa7\x5c\xa3\x1c\xf8\x1b\x77\x56\xe5\x56\x3a\x0a\x4d\x2d\xac\xac\xb6\x10\xb1\x9c\x64\xfe\x28\xb9\x20\x5e\xde\x5c\x73\xfc\xa8\x0f\x5e\xc0\x56\x9c\xae\x15\xbb\x6c\x74\x75\x6c\xdb\x0c\xb5\x10\xf1\x2a\x30\x9d\x44\x0a\x01\x95\xdf\x5a\x9a\x0e\xfd\xa5\x62\x45\x5e\x1f\x2c\xe7\x08\x4c\x76\x15\x43\x36\x9c\x98\x86\x6e\x27\xde\x5f\xbe\x74\x87\x82\x91\x0c\x25\x4b\x6d\x45\xbb\x20\xbb\xa3\x7b\x6a\x92\xf7\xdb\xb6\xb9\x6f\x80\x20\xd9\x3b\xfe\x2e\xf9\x09\xfc\x1d\x67\xcb\x9c\x1e\x42\x54\x94\x19\x6d\x15\x93\xed\x5e\x81\xfd\x8a\x13\xe6\x60\x3f\x39\xd8\xaf\x70\x08\x95\x60\xd6\x29\xfc\x4f\xe4\x19\x56\x7a\x08\xf9\x02\x9b\x2c\x86\x67\x53\x93\x32\xf3\x1e\xc7\x8e\xf7\xe0\x07\x41\xfa\xbc\xba\x35\xe0\x92\xd7\x39\xe7\xe3\x0c\x7a\xbe\x52\x8e\x5c\x8e\xe2\x9c\x98\xc2\xe5\x0d\xdc\xba\x14\x97\x79\xa6\xe2\x34\x40\x00\x2e\x85\x42\x8d\xbf\x0a\x0f\x7e\xfc\x8b\x8d\xec\x62\xb1\xd5\x9a\x73\xc2\xda\xda\x72\x72\xae\xcb\x1e\x81\xd6\x23\x6c\x2f\x69\x44\xaa\x57\x6d\x06\xa3\x4c\xdc\x4a\xf6\xd8\x23\x0f\xfe\xd3\x23\xac\x73\x2e\x5d\x2e\x7c\x6d\xb9\xa3\xb1\x12\x2e\x6c\xd7\x71\x7b\xab\x7e\x31\x6d\x7e\x11\x3e\x0e\xda\x53\x7f\xb6\x57\xfe\x6c\xaf\xfc\xb1\x7b\xa5\x4b\x3e\x8d\x7d\x68\x93\x65\xf2\x32\x21\xcb\x03\x07\x51\x2b\xfd\x76\x55\x54\x14\x72\xc1\x54\x39\xd7\xfa\xbf\x42\xf9\xf4\x94\x6f\xd7\xa1\xd8\x16\xb3\x9d\x21\x3d\x41\xc3\x39\x81\x03\x47\x06\xe0\xa8\x76\x27\x9b\x00\xff\x13\x40\xd7\x21\x64\x9e\xf4\xe5\xe8\xda\x33\xf1\xf4\x6a\x8a\xc8\x0d\xa3\x45\xab\x3e\xae\x9d\x1b\xd7\x0e\x0b\xe6\x0f\x1f\xdc\xa9\xef\x4d\x2e\xc7\xcf\x1f\xf5\xd5\x60\xd2\x06\xc3\xd2\x0a\xb2\xc4\xd4\x70\x14\x48\xd6\xba\xd6\x5a\x5b\x4b\x7a\x71\x12\x01\xe5\xb5\x80\x72\x04\x4d\x95\x94\xfc\x8f\x80\x25\xe0\xa3\x62\x4e\xe5\x02\xbb\x43\x00\xe6\xf3\x9e\xa7\x11\x03\x4f\xa2\xaa\xdf\x3d\xac\x27\x58\x5e\x8a\x66\xd7\x32\xd4\x31\x77\xe5\x4d\xc6\x1b\x0d\xc5\x41\x07\x16\x50\xa8\x42\x87\x73\xe6\x46\xce\xd0\x27\x48\x76\xe1\x97\xc8\x3f\xc2\x7f\x40\x5a\xe4\x36\x21\xe9\xf4\x74\x34\x68\x32\x9e\x9c\xc8\xa7\xd7\x8a\xdd\x62\x76\x5a\xe3\x5f\x5c\x0d\x07\x59\x18\x3c\x04\x36\xbc\x0c\x45\xed\x93\x15\x60\x35\x81\xd8\x80\x04\x2f\xb2\xa1\x2a\xf3\x69\x06\xf1\xb6\x0c\x44\xde\x82\xd4\x54\x03\x05\xbe\x0d\x4b\xbb\x41\x19\x8b\x24\x07\xa0\xcc\x44\x5e\xe1\xa3\x2f\x14\xfc\x47\xae\x68\x64\xb9\xcd\xba\xd8\xf3\x29\x6b\xf4\xf2\x51\xcd\x2f\x7d\xab\xfc\x27\x4c\xa9\xde\x0e\xed\xc6\x0a\x54\xc4\x02\x15\x33\x07\x04\x07\x00\x4f\x5a\x69\xc2\xc6\x24\x5f\x5d\x12\x82\x3a\x4e\x1a\x24\x5d\xf8\x2a\xf9\x65\xfc\x87\xa4\x4d\xee\x10\x92\x0e\xaa\x82\x78\x5e\xd4\xf2\xbd\xdd\xe9\x15\xd8\x3a\x55\x1d\x98\x4c\x67\x97\xf1\x4c\x6c\x56\x51\x9e\x41\x31\xff\xac\x73\x50\x46\x35\xb0\x74\x19\x5e\xe7\x99\xac\x05\xa5\x13\xa7\x2a\xd3\x14\x6c\x20\x5d\x50\xc5\x38\x1c\xa0\xc1\x38\x96\x65\x3c\x2e\xb8\x8b\x56\x64\xe0\xd4\x72\x29\x0f\xbc\x20\xb2\xa9\x61\x14\x51\x62\x58\x30\x34\xf8\x57\x25\x4c\xee\xf8\x6b\x90\x20\x08\x8e\xd8\x6c\x85\x54\xd6\xfb\xba\xb0\x2c\x30\x08\x9c\x79\xc2\x0b\x5a\x7a\x29\x63\xe8\xb7\x12\x23\x15\x4a\xa1\x94\x64\xcc\xe3\x56\xfa\xb8\xea\x3f\xd5\x17\xbe\x22\x8c\x64\xf0\x75\x20\xf8\x4b\xa4\x4b\x9e\x21\xf7\xc9\x97\xca\xcf\x3a\xcf\xa1\x43\xba\xdb\x83\xda\x6c\x77\x76\x70\x02\xf1\x9e\xce\xd1\xe0\x27\x35\xad\x85\xca\xfd\x49\x3d\xad\xe2\x53\x3a\x70\xeb\xa1\x2a\x04\x5c\x86\x62\x21\xe1\xba\xbf\xd0\xa3\xab\xbe\x1c\x74\xac\x38\x03\x82\x9b\x03\xce\x2a\xd0\xd9\x16\x88\xf7\xad\x91\xe9\x6c\xfa\x03\x5c\x52\x87\x36\x14\x9e\x87\xc0\xf4\x7c\x06\x19\x39\x15\x9c\xc2\x06\x03\x25\xa1\x2d\xbc\x32\x49\xa5\x4c\x72\xaa\x28\x56\x00\x2e\xaa\xe3\x20\x06\xc3\xc2\x4a\x09\xd1\xb3\x1c\xca\x18\xea\xbe\xe3\x25\xca\x23\xc3\xca\xdb\x20\x29\x7a\xaa\x8c\xac\x98\x28\x3c\x83\x0a\x34\xcf\x6a\xc9\x9c\xad\x90\xe9\xc8\xa4\x52\x71\x8d\xc0\x58\x69\xe4\x28\xe3\x82\x33\xfc\x29\xa8\x87\xac\x9b\xb1\x64\xd8\x17\x48\xdd\xc8\x96\x34\xf5\xa9\x37\xac\x5b\x2a\x98\x90\x9e\x83\x11\x53\x65\x03\x63\xb7\xac\xda\xaf\x7b\x8a\x4b\x16\x73\x2a\x19\x48\xdf\xa9\x21\x23\x97\x4b\x83\x98\x26\x6d\xde\xfe\x15\xea\x15\x17\x68\xb8\xd4\x08\x0c\x17\x10\xd4\xd7\xad\x99\x74\x13\xa5\x01\xfe\x40\x69\x90\x20\x45\x96\xc5\x4b\x6d\x45\xf7\x9b\x4e\x4a\xb9\x4c\x7d\xa4\x0b\xc3\x8d\xf0\xad\xca\x7a\x63\x13\x2e\x8f\xd2\x90\x10\xc2\x48\x0a\x5f\x07\xc0\x5f\x23\x2d\x72\x93\x7c\xc4\xf5\x5d\xc7\xce\x59\x0f\x16\xbc\xe1\x67\xfa\xa2\x5b\x30\x3e\xd8\x9f\x1e\xce\x21\x1d\x62\xce\x41\x51\xad\x60\x37\x86\x70\x30\x71\x74\x7d\x65\x7e\x13\xc2\x69\x41\xb6\x0b\xc5\x6c\x7a\x30\x5d\x6c\x05\x27\x1e\x73\xa6\xdc\x79\x96\xce\xec\xca\x59\xd9\x97\x0f\x39\x2c\x3b\x08\xde\x16\x0e\x88\xa7\xd0\x22\xe3\xb4\xbc\xad\x30\x05\x23\x8d\x97\x78\x59\xa5\xce\xed\x31\x29\x4c\x3f\xc4\x48\x33\xe7\x4e\xda\x94\x8b\x1f\x07\x47\x78\x4b\xa9\xe7\x73\x26\x51\x22\x04\x10\x78\x9e\xe6\x6b\x94\x23\x55\xbe\xa7\x04\xa3\x5c\xb8\xe9\x54\x6c\x03\xe5\x18\xf8\xb6\xbc\x11\x82\x81\xc7\x6c\xc8\x51\x08\xfc\x4c\x79\xfe\x2b\x63\xe8\x3a\xd0\x8c\xd0\x69\xd0\xec\x68\x6c\x27\x00\xd2\x00\x32\xd9\x92\x4a\xa2\x6c\xb5\xa3\x4e\xd2\x64\xae\xb1\x4e\x59\xd2\x86\xfe\x75\xe9\xe3\xb2\xa3\x87\xe5\x45\x3b\x0d\xb7\xcc\xc4\x80\x49\xe4\xa5\xc1\x72\xcd\x8d\x06\x21\x93\x20\x28\xd7\x41\x7d\x3c\xec\x0f\xec\x20\x2b\xdf\xac\xc7\xa8\xcf\x85\xea\xe6\xe6\x52\xd0\xec\x5b\x69\x69\x69\x68\x48\x40\xfe\x3e\x71\xd0\x39\x42\x88\x4f\xda\xf3\x63\x20\x01\x79\x74\x7e\x8c\x44\x90\x37\xe6\xc7\x94\xb4\xc9\x97\xe7\xc7\x8c\x04\xe4\x3f\xcc\x8f\x39\x89\x20\x99\x1f\x0b\x12\xc0\x35\x42\x09\x30\x4d\x08\x69\xba\x67\x95\xc7\x40\xda\x64\x6d\x7e\x8c\xc4\x92\xe7\xe7\xc7\x94\x9c\x27\xef\xcc\x8f\x19\x69\x93\x5f\x9e\x1f\x73\xd2\x27\xff\x7d\x7e\x2c\x48\x1b\x86\xe4\x36\xb9\x4f\xee\x93\xd7\xc9\x7d\xf2\x2e\x79\x8f\xbc\x45\xde\x20\xcf\x93\x57\xc9\x3b\xe4\x1d\x42\x6e\xdf\xbf\xff\xfa\xfd\x77\xdf\x7b\xeb\x8d\xe7\x5f\x7d\xe7\x1d\x42\xae\x91\x8f\x93\xfb\xf3\xc7\xbc\x46\x5e\x25\x9f\x20\x3f\xe4\x9e\x5d\x3e\x8f\x5c\xfb\xf8\xfd\xf7\xde\x7a\xe3\xb5\x57\x3f\xf1\x43\xb7\xef\xbf\xfb\x1e\x21\x8f\x93\x37\xc8\xeb\xe4\x6d\xf2\x29\xf2\x31\x42\x1e\x7f\xe3\xf5\xb7\x3f\xf5\x31\xf2\x27\xbc\xd6\xc5\x3f\xf9\xec\x0f\xbd\x93\x8b\xef\x7f\xad\x3f\xd5\x1b\x7b\x8e\xbc\x41\x3e\x41\x3e\x49\xde\x76\x0f\xe8\x93\x6d\xb2\x4d\x76\xc8\xa6\xfb\xbe\x4d\xfa\x84\x3c\xf7\xc6\x27\x3e\xf9\xf6\xfd\x77\xfb\xdb\xdb\x3b\x9b\xdb\xdb\xdb\xfd\x3f\xe5\xf9\x5d\x9d\xb6\xfc\x73\xfc\x23\x64\x97\xfc\x71\x7f\xbe\xdf\xad\x05\x24\x94\x30\xc2\x89\x20\x92\x28\xa2\x89\x21\x1e\xb1\xc4\x27\x01\x09\x49\x44\x62\x92\x90\x94\x64\x24\x27\x35\x52\x90\x3a\x69\x90\x26\x69\x91\x36\xe9\x90\x2e\xe9\x91\x3e\x59\x22\x03\x32\x24\x23\xb2\x4c\xc6\x64\x42\x56\xc8\x2a\x59\x23\xeb\x64\x83\x9c\x23\x9b\x64\xcb\x7d\xa2\x5d\xb2\x47\xf6\xc9\x01\x99\x92\x19\x39\x4f\x2e\x90\x8b\xe4\x90\x5c\x22\x47\xe4\x32\xb9\x42\xae\x92\x6b\xe4\x3a\xb9\x41\x6e\x92\x5b\xe4\x36\x79\x84\x3c\x4a\x1e\x23\x1f\x20\x77\xc8\x07\xc9\xe3\xe4\x2e\x79\x82\x3c\x49\x9e\x22\x4f\x93\x7b\xe4\x19\xf2\x2c\x79\x8e\x3c\x4f\x3e\x44\x5e\x20\x2f\x92\x0f\x93\x97\xc8\xcb\xe4\x23\xe4\x15\xf2\x51\xf2\x2a\xf9\x39\xf2\x2d\xf2\x0d\xf2\x4d\x40\xf9\xa9\x77\xdf\xde\xdb\xde\xde\x2e\x3f\xd5\xf1\x31\x41\xb7\x62\x03\x42\x48\xbd\xbc\x9a\xee\xff\x40\xde\x24\x40\xd8\xfc\xda\xc0\xfc\xef\xfc\xdf\x7f\xfa\xe0\x67\x7f\xbb\xfc\xfe\xab\x3f\xb8\x7e\xad\xfc\xfe\x9d\xce\x6f\xfc\xb9\xff\x17\x00\x00\xff\xff\x43\xbc\x0b\xe0\x80\xf2\x00\x00") + +func fontsApothecaryfontTtfBytes() ([]byte, error) { + return bindataRead( + _fontsApothecaryfontTtf, + "fonts/ApothecaryFont.ttf", + ) +} + +func fontsApothecaryfontTtf() (*asset, error) { + bytes, err := fontsApothecaryfontTtfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/ApothecaryFont.ttf", size: 62080, mode: os.FileMode(438), modTime: time.Unix(1575019249, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf6, 0x8, 0xa0, 0x92, 0x91, 0x84, 0x8e, 0xc5, 0xbf, 0x5d, 0xb4, 0xca, 0x3c, 0x4, 0xed, 0xcb, 0xe0, 0xa0, 0x12, 0xe1, 0x41, 0x1b, 0xe, 0xf9, 0x2c, 0x3b, 0xaa, 0xa5, 0x94, 0x34, 0x47, 0x30}} + return a, nil +} + +var _fontsComismshTtf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xfc\x07\x9c\x5c\xe5\x79\x2f\x8e\xbf\xed\xbc\xa7\x4c\x9f\xd3\xa6\xb7\x33\x73\xa6\xf7\xb6\x65\x76\x77\xb6\xef\x6a\x77\x25\xad\x56\xbd\xaf\x84\xba\x84\x84\x24\x40\x42\x08\x04\x18\x10\x18\x6c\x83\x01\x37\x8c\x0d\x86\xb8\x10\x9b\x6a\x1b\x1b\xae\x2b\x8e\x1d\xdb\x1f\xfb\xda\x49\xfe\x37\xce\x4d\xbb\xc9\x75\x72\xff\x3f\x27\x37\xc5\xc1\x89\xe3\x9f\xc4\xef\x73\xce\xcc\x4a\x83\x11\x24\xd9\xd5\x6a\xdf\x39\x33\x73\xf6\xcc\x53\xbf\xcf\xf7\x79\xde\x03\x20\x00\xc0\x09\xda\x80\x80\x6f\xac\x59\x2a\x56\x6e\xb7\x56\x7f\x08\x60\xf3\xdf\x00\x00\x1b\xd7\x8e\xcf\xaf\x5f\x3e\x0b\x9f\x05\xb0\x6f\x2d\x00\xa0\xb1\xf7\xd8\xf2\x89\x5f\x9f\xba\xf4\x2c\x80\xda\x9f\x02\xc0\x4c\xec\xbd\xe9\x74\x64\x6f\x69\xbf\x00\x00\xde\x0e\x00\x28\xec\x3f\x71\xe0\xd8\x5d\xd5\x6f\xad\x01\x00\xcf\x00\x00\xa4\x03\x47\xcf\xee\x2f\xa4\x8f\xef\x03\x00\xff\x1b\x80\x6a\xe9\xe0\x75\xc7\xce\xfc\xfa\x43\x2f\x8d\x02\x98\x2d\x01\x60\xfd\xde\xc1\x7d\xcb\xd7\x7d\xdf\xbb\x6f\x06\xc0\xbe\x8b\xc6\xf9\x0f\x1e\xdc\xb7\xcc\x7d\x9c\xd8\x01\xec\xfb\x06\x00\x20\x7e\xf0\xd8\xe9\x33\x4f\x7f\x1f\x3c\x0e\x60\x68\x1e\x00\x1c\x39\xb2\xef\xe4\xf5\xdc\x66\xde\x02\x60\x3a\x02\x00\x72\x1e\x3d\xbe\x77\x19\x9c\x2d\xec\x01\xd0\x9f\x02\x00\xc7\x8f\x2d\x9f\x39\x01\x4f\xa2\x32\x80\x7d\xff\x1b\x00\x10\xb9\x7e\xf9\xd8\xbe\xbf\x7c\xfd\x5b\x7f\x0c\x00\xb4\x02\x80\x06\x4e\x1c\x3f\x75\x7a\xfd\xf1\xe4\x22\x80\xd1\xa3\x00\xa0\x63\x27\x4e\xee\x3b\xf1\xff\xfc\xf8\x8f\x3f\x03\x00\x7e\x00\x00\x70\x04\x00\xe0\x81\x3a\x58\xf9\xf2\x00\x6b\x77\x05\x41\x08\x54\xbb\x6b\x04\xec\x60\x73\x77\x8d\x41\x08\x3c\xd5\x5d\x13\x10\x02\x37\x76\xd7\x0c\xe0\xc0\xeb\xdd\x35\x05\x01\xf0\x27\xdd\x35\x0b\x24\x08\x4c\x89\x1b\x5f\x56\xb0\xb2\x86\xc0\x01\xe2\xdd\x35\x02\x2c\x58\xec\xae\x31\x70\x80\x0f\x76\xd7\x04\x38\xc0\xfe\xee\x9a\x31\xb4\xd5\x5d\x53\x60\x07\x3f\xec\xae\x59\x20\x80\x5f\x01\x0c\x20\xe1\xbb\xd7\xdf\x59\x77\xae\xbf\xb3\xee\x5c\x7f\x67\xdd\xb9\xfe\xce\xba\x73\xfd\x9d\x75\xe7\xfa\x3b\xeb\xce\xf5\x77\xd6\xe6\xf5\x7f\x76\xfa\x17\xc7\xa6\x8e\x5f\x7f\xfa\x54\x7f\x5f\x04\x7c\x16\x4c\x83\x1f\x81\x63\x60\x0a\x1c\x07\xd7\x83\xd3\xe0\x14\xe8\x07\x7d\x20\x32\x7e\xfc\xd8\xa1\xbd\x7b\x8e\x1f\x3f\x12\x59\x3a\xb6\x7c\xea\x20\x18\x07\xc7\xc1\x31\x70\x08\xec\x05\x7b\xc0\x71\x70\x1c\x1c\x01\x11\xb0\x04\x8e\x81\x65\x70\x0a\x1c\x5c\xb7\xef\xc0\x8d\x47\x97\x4f\x82\x75\x60\x1f\x38\x00\x6e\x04\x47\xc1\x32\x38\xf9\x5f\x3a\xc3\x7f\xe9\xc5\xe5\x42\xa9\x04\xca\xa0\x00\x4a\xa0\x74\xe5\x8d\xef\xf4\xbe\x2b\xef\x9a\xde\x77\x6c\x7f\xe7\x43\x83\x69\xb0\x0f\x1c\x03\xfb\xdf\xf2\x89\x41\x1b\x82\xdc\x4d\x93\x91\xe7\x71\x62\x52\x5b\x3e\xe8\xd1\x0e\xee\x9e\xc8\xbf\x89\xde\xfc\x43\xf8\x43\xf4\xaf\x60\x0e\x8c\x80\x09\xb0\x11\x34\xc0\x1c\xb8\x09\xfc\x23\x5c\x8d\x00\x7c\x10\xbd\x8c\xce\xa1\x4d\xf0\xf0\xd6\x3d\x5b\xf7\x00\x04\x08\x00\xed\xb0\xdb\xed\x72\x39\x9d\x0e\x87\xdd\x6e\xb3\x59\xad\x16\x8b\x20\xf0\x3c\xc7\x61\x8c\x10\x34\x0c\xe7\xc1\x57\xe0\x9b\x77\x4f\x1e\x9c\xf8\xcf\xff\x7b\x89\x21\x53\x20\xfb\x12\x4b\xa7\x40\xf6\x05\x42\x26\x0f\x4e\xbc\x40\xe9\xe4\xc1\x09\xc3\xce\xb6\x03\x80\xde\x43\x5e\x03\x18\xb0\x60\x43\x3b\x0c\x39\xae\xcd\x23\x96\x10\x08\x28\x43\x30\x62\x08\x0b\x58\xca\x42\x04\x31\x80\x60\xea\xa6\x62\xd3\x03\x8a\xad\x62\xcb\x79\xc9\xf8\x07\x8b\xad\x4b\x2d\xe3\x07\x94\x4b\x70\xf6\xe0\x57\x00\x00\xdc\xec\xc1\xe5\xe7\xdb\xeb\x36\xf7\xb9\x9a\x5f\x01\xdc\x9b\xdf\xe8\xdb\x52\x75\x45\x5d\x89\xa8\x2b\xba\x1d\xa5\x2e\xd7\xe0\x89\xcb\x1f\x20\xaf\xfd\x66\x62\x3b\x21\x86\x65\xa3\x37\xbf\x03\x7e\x82\xbe\x09\x58\x20\x82\x41\x70\x6f\xbb\x09\x5b\xad\xf6\x50\xbc\x51\x2b\x17\xb3\xe9\xa4\x1e\x09\xf9\x54\x45\x72\x5a\x05\x8e\xa2\x81\xbe\x5a\xb9\x98\xcf\xa6\xe3\x01\x8f\xaa\x48\x56\x02\x38\x62\xb7\x13\xb7\xb3\x2f\x06\x03\xdd\xeb\x2a\x1a\xd7\xe3\xbc\x54\xf8\xed\x2f\xf0\xb6\x23\x85\x42\xa1\x7b\xc5\x01\xd0\xea\xbd\xe2\x96\x71\xc5\xcd\x46\x53\x51\x29\xab\x63\xa5\x5a\x69\x52\x55\x67\x1b\xf5\x1a\x6e\x34\xd9\xba\x5e\xa7\xac\xa2\x1a\xcf\x36\x9a\x7a\x92\xd5\x93\x8a\xaa\xd7\x6b\x4d\xca\xd6\x46\x20\xd5\x62\x49\x45\x96\xec\xbe\xa4\x9c\x56\x72\xb0\x1c\xc9\x3a\x1c\x16\x94\x89\x42\x41\x95\x21\x2c\x84\x93\x51\xc8\x08\xf9\x70\x56\xab\x60\x06\x69\x7e\xc6\xe3\x0b\x41\x24\xc9\x35\x3d\xd8\xae\xb5\x95\xc1\xe0\x20\x46\x1f\xf3\x91\x1f\xfd\x33\xb6\x96\x4b\xaf\x5c\xfe\x13\x0e\x71\x10\xc1\x55\x93\xfe\x30\x66\xf9\x46\x4c\x5e\x37\xc1\x70\x08\xb9\xd6\x2f\x7d\xe9\xf9\xa0\xc5\x6e\x0f\xf2\xa9\xdf\xff\x61\xd3\x90\x20\xfc\x02\xdc\x81\xdd\xc0\x06\x64\x30\x0a\x6e\x6d\x57\xe1\xd8\x58\x7b\x3c\x3a\xdc\x2a\x65\x03\x3e\x8f\x0c\xda\xc3\xad\x81\xbe\x5a\xa5\x94\x4f\x27\x13\x5a\x54\x74\x72\x04\xc8\x04\x09\x0c\x6a\x46\xdb\xc8\x8d\x29\x86\x7d\x1d\xe9\x8d\x8c\x8c\x18\x02\xbc\x96\xfc\x7a\x25\xd8\x15\x5b\x1f\x18\xeb\x15\xdb\x98\x21\x36\xb1\x51\xaf\x25\x3b\xa2\xa3\x2c\x6d\xea\xc9\x46\x53\xa5\x2a\x6b\x8a\x2b\x0c\x15\x55\x51\xf5\xa4\xde\xd4\x93\x23\x50\x4f\x52\x56\x52\x64\x3d\xd9\xa8\x27\xf5\x24\xab\xc8\x12\xdb\x68\x4a\x6c\xa3\x8f\x16\x1c\x61\x5f\x19\x11\x2a\x3a\x8f\xf3\x8a\x5a\xa8\x65\xe9\x16\x8e\xc7\xac\xd5\x22\x73\xae\xd0\x40\x02\x61\x2f\x1b\xa2\x44\xca\x66\xb2\x0c\x15\x70\xd1\x11\x6a\xd6\xac\x8e\x00\x5f\x87\x6f\xc4\xb4\x7d\x6b\x58\x87\x33\x94\x1f\x1d\x28\x61\x76\xfa\x41\x9b\xd7\xbf\xe9\x81\x01\x7d\x4e\x4a\x43\x88\xdd\x31\xc6\x3e\x34\x3d\x33\xca\xba\xad\xbc\x4d\x14\x7d\x44\x64\x10\x47\xad\x7e\xde\xed\xdd\x78\x5d\x2e\x83\x28\xac\x71\x1d\x7b\xfc\x15\xfc\x36\xda\x09\x38\x30\x05\x3e\x0e\xb5\xf6\xfd\xf0\x89\x27\xda\x9f\x98\x7d\xf8\x03\xef\x7b\xe0\xfe\x8b\xb7\x9f\x3f\x77\xe6\xa6\xd3\x7b\x97\x77\xed\xdc\xbe\x6d\x69\x71\x6e\x76\xac\x9d\xd0\xa2\x2a\xfd\xe8\x47\x1e\x7b\xe4\xfe\x8b\x77\x76\x9e\x3d\x7e\xfd\x91\x43\x07\xf6\xed\xdc\xbe\x61\x69\x71\xcd\xc2\xdc\xec\xc4\x58\x7b\xa0\xaf\x54\xc8\x67\x13\x5a\xd4\xab\x3a\x2c\x04\x70\x80\xcb\xa6\xd3\xd9\xe3\xd7\xd3\x1b\x3e\x7a\xf2\x06\xfc\x11\x3a\xdd\x57\x6f\xb2\x44\x66\xd1\x34\xfb\x08\xa1\xad\xea\x80\x03\xd8\xa8\x0b\x51\xaf\xb8\xe1\x4e\xb8\x06\xed\x5b\x40\x13\x25\x04\xcf\x77\x95\xd4\x1a\x69\x19\x7a\x6a\x5d\x2a\x5e\x6a\xb5\x8a\x2d\xe3\xb7\xf3\x92\xf3\x52\xab\xe5\xbc\xa4\x9a\x1e\x79\x6f\xc1\xfe\xba\xfd\xff\xb5\xbf\x0e\xaf\x65\xf3\xef\xfc\x75\x4d\x17\xf9\x6d\xa5\x9f\x07\x4f\xf4\x2a\xfd\x09\x53\xe9\x95\x66\xa3\x19\x4b\xea\x6c\x93\xb2\x31\xb5\x54\xa5\xac\xae\x51\x36\xc6\x36\x9a\x31\xaa\x19\x76\xc0\x36\x9a\xc6\x8f\xf1\x32\x3d\xd9\x6c\x24\x95\x30\x6c\x34\x95\x41\x48\x59\xa5\xd9\x68\x76\x9e\xa4\xac\xba\xb2\x58\xf9\xa1\x2c\xcd\xc2\x46\x53\x8b\x25\xa9\xe1\x67\xb2\xc4\x2a\x2a\x4b\xd9\x2a\x65\xb5\xce\x0b\x46\x90\xf1\xdb\x3c\x7f\xa3\xd9\xa8\x52\xb6\xa1\x56\x4c\xd7\x34\x4c\x6c\x18\x36\xb5\x46\xb3\xf1\x94\xa8\xb3\x36\xbb\xdd\x61\x3f\xca\xba\x1c\xad\x3c\xe1\x4a\x79\x8b\x1c\x8e\x27\x6c\xbc\x2e\x04\xac\xb2\x16\xcc\x04\xbc\x15\xde\xe2\xab\x5a\xd9\x6a\x14\x43\xe4\x51\xcb\xbc\xcd\xed\x4a\x28\xae\x60\x48\x4e\x78\x4a\xa5\x60\xbe\xe8\xb0\x16\x05\x97\x4b\xe7\x6c\x82\xe2\xd5\x22\x49\x8b\xaf\x5c\x63\xdd\x16\x9b\x87\xb5\x55\xbd\x5e\xea\x68\xa6\x0d\xeb\xc2\x10\x07\x20\x5e\xe0\x5c\xae\x18\x6b\xe3\x05\xe4\x48\x46\x13\x2e\x5e\xa8\x54\x39\xa7\x57\x65\xec\x52\x58\x73\x12\xdb\x68\x14\x52\x97\x8e\x19\x14\x45\x38\x03\xdd\x30\x38\x00\x21\xc2\xc1\x41\xa8\x14\xc9\xd8\x14\xde\x52\x41\x73\x31\x9d\x11\x66\xd7\x63\xea\xab\xc3\x7c\x1e\xb1\x9a\xdb\x4d\x31\x33\x33\x03\xdb\x8b\x08\x4d\xaf\x41\xfc\xda\xd5\x8c\x90\xd0\x47\x9a\x15\xc2\xc9\x3a\x62\xaa\x2d\x0b\x2f\xa7\xac\x8c\xa8\x43\x51\x43\xa5\x65\x6a\xf1\x78\x14\x0f\x22\x01\x8b\x83\xda\xb5\x29\xc4\x86\x02\x18\xc2\xf8\xa4\x95\x0d\x39\x1c\x56\x46\x8c\x63\x51\x43\x10\x15\x76\x52\x3e\x3c\x02\x09\x1f\xe7\x6c\x14\x1b\xe8\x01\xbd\xf9\x75\xf8\x13\xf4\x53\x20\x00\x11\x2c\x80\x4f\x82\xcf\x80\xe7\xc0\xdf\xb4\x8f\xc0\xe7\x9f\x6f\xbf\xf0\xb1\xcf\x3f\xf3\xa9\x0f\x3d\xf4\x81\x7b\xef\xbe\xeb\xfc\xa1\x03\x7b\x76\x6f\xda\xb0\x6e\x64\xa8\x1a\x0b\x29\x2e\x0b\x06\xcf\x7d\xfe\xb3\xcf\x7c\xec\xd1\x47\x1e\x7e\xe8\x7d\x0f\xde\x77\xee\xd4\xb1\x23\x07\xae\xdb\xbd\x6b\xdb\xda\xf9\xc1\x66\xbd\x5a\xf6\x28\x92\xe3\x3c\x73\xd7\x1d\x9f\x62\x9e\x4c\x13\x90\xcf\x06\x08\xa0\x64\x7a\x32\x26\x32\x60\x14\x02\x26\xe1\x3a\xf2\x2c\x7a\x04\x3e\xfa\x3e\xb8\x05\xc1\x53\x2b\x31\xc8\xb0\x6e\x33\xab\x18\xc6\x6c\x46\x73\x63\x55\xbc\x54\x6c\x5d\x2b\x2c\xfd\xa7\x4d\xb8\x6b\xc0\xa7\xc0\xf3\xbd\x06\xfc\xbc\x69\xc0\xb2\xa4\x0e\x43\x23\x72\x25\x31\x65\xa9\x19\xa5\x44\x23\xe4\xc7\x92\x46\x04\x33\x0e\x34\x1b\x49\xbd\xf3\x6d\x9a\x9a\x9e\x54\xaa\x12\x5b\x51\xcd\x1c\x91\xa4\xb2\x11\xd9\x14\xc3\x60\x1d\x50\x12\xf5\x64\xad\xd9\x31\x71\x33\x47\xe8\xc9\x66\x8c\xd5\xb5\x5a\xa3\x4e\x93\x46\xba\x30\x0d\x9b\x95\x54\xf3\x3d\x2a\x65\x8b\xd0\x78\x03\x65\x3b\x99\x45\x31\xa2\x65\x55\xae\xa8\xc9\x8a\xaa\x34\x1b\x75\xc9\xf8\x9b\xac\xc2\xd6\x92\x8a\xaa\x18\x27\x96\x8b\xf0\x9f\x60\xb4\x00\xd1\xdc\xda\xa8\x4b\x21\xec\x14\xc4\xab\x32\x19\xb2\xc6\x1f\xb7\x7a\x6b\x24\x26\x87\x19\x8c\xd2\xe1\x09\x05\x22\x08\x99\x75\xba\x17\x92\x7c\x1e\xee\xcf\xba\x51\x3a\xc7\xce\x61\xb5\x7f\x9a\x43\x08\x29\xf1\x76\x64\x83\xdb\xc5\x08\x98\x23\x16\x99\x64\xeb\x6c\xc6\xb1\x00\x05\x59\xa2\x28\xea\x23\x0d\xc8\x94\xad\x71\xc5\x87\x19\xb5\xec\x2f\x33\x3c\xa2\x2c\x4b\x21\xb4\x78\xf8\x44\x1f\x5b\x72\xaf\x82\x62\x02\xaf\x8d\x0b\x72\x2e\x1a\x54\xa9\x54\xb7\x0f\x11\x91\x58\x28\xfa\x10\x41\x04\xc1\xbe\xdd\xc5\x12\x2e\x45\x78\x6e\x30\x04\x25\xea\x74\x87\x5b\xb1\x74\xe6\xb2\x15\x32\x3e\xaf\x23\xb0\x5a\xd4\xda\x92\x93\x1e\x6b\xf4\xd9\xdc\xa9\x1b\xed\x0e\x87\x63\x88\x23\xae\x18\x71\x46\xf3\xee\x60\xd8\x33\x2c\xec\xda\xce\x2a\xe1\x33\x61\x2d\xe6\x0d\x30\xc8\x05\x17\x09\x3b\x39\x8e\xb0\x42\x18\x35\x1c\xc8\x4c\x39\x75\x17\x47\x08\x17\xe5\x31\x84\xc4\xa5\x21\x44\x1c\xae\x38\x19\xbc\xbe\x30\x64\x85\xa8\x79\x02\x61\xa7\x4d\x90\x58\xbb\x58\x52\x72\xbb\xfc\x69\x9b\x05\x92\x3a\x6d\x60\xe4\x0e\xa6\xf9\xc5\x33\xc5\xe8\x2d\x9a\x2f\x38\x48\x18\xe1\xaf\x79\xa7\x47\xc1\x1c\x00\x1c\x40\x6f\xfe\x1e\xfa\x01\xfa\x9f\xc0\x05\x22\xa0\x0c\x86\xc1\x5a\xf0\x3e\xf0\x49\xf0\x12\xf8\x5c\x7b\x01\xbe\xfc\x72\xfb\x8b\x07\x3f\xf7\xe4\x5d\xe7\x6f\x3a\x7d\xf2\xf8\x75\x3b\x37\x2f\x2d\x36\x2b\x49\x01\xdc\x7b\xf6\xa6\xd3\x27\x0f\x6e\xdd\xbc\x61\xb2\x52\x4c\x90\xc7\xc9\xc3\x9f\x26\xcf\xe7\x99\x25\xbb\x35\xc8\x34\x17\xc6\x19\xf9\x13\xec\x63\xb3\xd4\x1d\xa5\x9c\xd7\x43\x47\xce\x6e\x85\x1b\x20\xbc\x77\xc5\xb6\x8b\xc5\x4b\xad\xa2\x61\xcb\x97\xa0\x69\xd0\x9d\xf0\x5d\xbc\xf4\x1f\x9a\x71\xd7\x7a\xef\x05\x2f\xf7\x5a\xef\xcb\xa6\xf5\xea\xa6\xc9\x2a\xaa\x01\x55\x1a\xc9\x5a\x52\x87\x3a\x55\xa9\x32\x08\x2b\x4d\x23\x1d\xeb\x89\xae\xd5\x9a\x36\xaa\xc8\x12\xc5\x0d\xd0\xec\x06\x58\x96\x9a\xcf\x1a\x10\xa6\xa1\x76\x5e\x41\x13\x15\x23\x00\x8f\xc0\x4e\x5c\xbd\x72\x66\xe3\x54\xc9\x02\x74\x60\xe3\xad\xdd\xf7\x9b\x1e\xa1\xc5\x58\x2a\xd7\x3a\x97\x40\x3a\xa7\xd0\x0c\xcf\xd1\xeb\xb5\x46\xb5\x62\x66\x7d\xe3\xaf\x16\x89\xf9\x57\x6e\x74\xd8\x6c\x98\xda\x03\x03\x1c\x57\xb4\x12\x32\x65\x81\x0d\x3d\xcf\xa0\x66\x3a\xe4\xb0\xda\x2b\x8e\xcb\xaf\x9d\x2b\x31\xd8\x1d\xb5\x67\xe7\x06\x46\x31\x5a\xfd\xd2\x75\xd0\x77\x5d\x78\xe8\xf4\xc5\x0d\xea\xd0\x58\x10\x7e\x60\xbc\xda\xc7\xa1\x58\x6a\xe0\xb4\x8f\x10\x68\x09\x5e\xfe\xa0\xcb\xb1\xeb\x4e\xbf\xbb\x24\xa5\x2b\xf3\x1b\xc6\xed\x03\xe5\x7b\x92\xce\x98\x9b\x6a\xa1\xbc\x7d\x52\x17\x78\xba\xfe\x43\xec\xa6\x88\xcb\xe5\x3c\x76\x62\x90\x69\x17\xee\x4f\xba\x62\x2e\x4e\xb2\x28\xa2\x16\x81\x1f\x70\xf2\x10\x72\xce\x14\xef\x64\x08\x8e\x78\xe8\xe5\xdf\xa3\x22\x43\x90\x1e\xe4\x05\xc2\x50\x56\x46\x47\x90\xa0\xca\xd9\xc4\x02\x86\x83\xa2\x6b\x3a\xc4\x5e\xfe\x31\x1a\xd4\xd3\x63\x82\x2a\x1d\x8e\x09\x45\xe6\xef\xbd\xe1\x20\x82\x54\xc8\x57\x66\x04\xbe\xbe\x70\xf9\xe9\x7d\xf0\x17\xfb\x18\xeb\xa1\x5f\x3c\x1c\x5f\x9e\x61\xc2\x38\x57\x1c\x15\xf8\x5c\xa6\x8a\xf8\x2f\x89\x7a\xd0\x17\xfe\x15\xf9\xcc\x03\x1c\x16\x94\xac\xcd\xb2\xf5\xf8\x44\x68\xd2\xc7\xb9\xdd\xae\xcc\x81\xcd\xc9\x44\x89\x81\x10\x3d\xfe\x34\x52\x35\xb7\x93\x91\xcf\xef\x9e\x89\xcd\x78\x39\xb7\x2c\xd1\x3d\xe1\x91\x4a\x78\x73\x8a\xe6\x03\x2e\xbb\x0b\xdb\xbd\x16\xc6\x97\x85\x25\x48\x8c\x55\x28\x43\x10\x44\x92\xcf\xef\x74\xa8\x66\xfc\x7e\x11\xfd\x39\x7a\x0a\x58\x80\x0f\x0c\x83\xf3\xe0\x7e\xf0\x28\xf8\x5e\x7b\x13\x7c\xec\xb1\xf6\x87\x26\x1e\x79\xff\x03\xef\xbd\xe7\xb6\x5b\x6f\x39\xb3\xbc\x7b\xc7\xf6\xa5\xc5\x99\xe9\xf6\xc8\x60\xbd\x1a\xf6\x2b\x76\x8e\x3e\xfc\xd0\x83\xf7\xbd\xe7\xae\x3b\x4f\x1e\xbf\xfe\xf0\xbe\xe5\xdd\x5b\x37\xac\x5e\x98\x5f\x35\x33\x3d\x31\xd8\xdf\x2c\x1b\x78\xd1\x2d\xa0\x72\x95\x07\x82\x00\x8a\xc4\x03\xd8\xf4\xde\x09\x08\x4f\x76\xed\xb9\x68\xda\xf1\x7f\x01\x6f\xbc\x2b\xc6\xe8\xda\xf8\x49\xf0\x58\xaf\x8d\x3f\x66\xda\x78\xd7\xc2\x0d\x04\x81\x3b\x06\x67\x04\xd0\x46\xb2\xa1\x8b\x94\xa5\x5a\xc7\xc2\x3b\x56\xdc\x89\xc4\x1d\x8c\x6e\xfc\xd6\x93\xba\x5a\x35\xa1\x67\x11\xaa\x46\x3c\x4f\x36\x93\xba\x09\x29\x1a\x23\xd0\xb0\x6a\x36\xa9\x27\x65\xdd\x38\xa5\x01\x51\x29\x2b\xb1\x32\xdb\x0d\xe9\xe6\x5f\x54\x13\xb1\xa4\x3e\x02\xeb\x8d\xa6\x11\xaf\xc5\xa6\x2a\xb1\x7a\xb2\xae\x37\x1b\xdf\x3b\x8e\xa1\xdd\x27\x06\xec\xa3\x8b\x5b\xfc\x76\xbb\xdd\xa6\x42\x7e\x70\x2d\xc1\x99\xf7\x8d\x3c\xee\xcd\x6d\xe0\x21\x54\xce\x1e\x5a\x6c\xce\x25\x82\x03\x54\x38\x95\xdb\x96\x08\xbb\xe3\xfe\xfc\xc2\x86\xe1\xc1\x7c\x0e\xfa\x1a\x9b\x37\x8a\x5a\x85\x69\x8e\xc6\x94\x2a\x8a\x38\xdd\x72\x49\xad\xec\xb7\x41\x98\x87\xd8\x92\x58\x7f\xdb\x06\x01\x86\x07\xf6\x06\x21\x83\x91\x9f\xf3\xc6\x33\x79\xfd\x99\x71\xe1\xf2\x1f\x5a\x1d\x18\x21\xcb\xe6\x8c\xa2\xcc\x87\x20\x6c\x0a\x98\xab\xda\xe0\xd2\xd0\x49\xd1\xed\x80\x10\xb2\x03\x7b\x60\x15\x32\x76\x85\xa1\xfe\xd5\xf1\x01\xbf\x76\x79\x68\x4c\xc4\x70\xb5\xcb\xfd\xdd\xf4\x0d\x9b\xfb\x31\x76\xb0\x6e\xdf\xd4\x81\x4c\x6d\x5f\xba\x2e\x26\x26\x94\xf9\x19\x87\xa0\x97\xe4\xbc\x5b\xb3\x07\x73\x38\x37\xec\x1f\x6d\x52\xcd\xe5\x8e\x0d\x05\xfb\xf2\x07\xb1\xc0\x0f\xcb\x08\xf9\xbc\x30\xcf\x90\x01\x5b\x8a\xd9\x34\x1c\x7b\x16\x43\x94\x50\xec\x29\x4f\xc8\x22\x63\x84\xac\x43\xc2\x14\xe1\x38\x07\x6a\x0d\x54\xbc\x9e\x3a\xbc\x1f\xe1\x74\xcc\x6d\xc3\x09\x06\x19\x95\x25\x82\x5f\x06\xaf\x62\x0e\x58\x40\x18\xcc\xb5\xbd\x30\x12\x69\x47\x9d\x01\x1f\xf0\x48\x6e\xa7\xdd\xca\x22\xc5\x8a\x18\x0c\x3d\x57\xa2\x23\xec\xb5\x93\xae\x39\x78\x40\xa4\xd7\x1c\x22\xa6\x39\xd4\x92\x8a\xa9\x5e\x07\xd4\x55\x53\xf3\x49\xe3\x87\x26\x95\x4e\xa9\x51\x4d\xd8\x43\x76\x25\x63\xe5\xec\x9e\xbd\x56\x42\xec\x8e\x10\x26\xde\x7a\x59\xca\x51\xd1\x8b\x98\x22\xfc\xcd\x5d\xc7\x90\x95\xb1\x4a\xf9\x91\xa3\x70\x7e\x74\x74\xac\xcd\xd8\x58\xab\xdd\xe7\x42\x67\x1f\xa2\x06\x94\x03\x00\xbd\x79\xe9\x4d\x00\x55\xf4\x02\x70\x81\x1c\xd8\xd5\xd6\x60\x3e\xdf\x2e\x64\xf4\x78\x28\xe0\x51\xec\x56\x81\x12\x94\x89\xf8\x3c\x8a\xdb\x8e\x00\xc3\xf9\x32\x00\x46\x56\x7c\x02\x5e\x0d\xe7\xe0\x1a\xe6\x1d\x01\xf9\xde\xcf\x93\xef\x9a\xb7\xae\x55\x58\x1d\xeb\x4d\xb3\xde\x64\xa9\x5a\x5b\xc1\xc5\x1a\x4d\x52\xd5\x30\xf6\x11\x33\x92\x26\xf5\x49\xe1\x3e\x96\xe3\x5b\xa7\x09\x39\xef\x74\x28\xf2\x41\xaf\xa5\xd9\xb0\xad\x97\x2b\xbc\xc3\xe3\xf1\xf8\x2f\x30\xc4\x71\xd8\xca\x38\xc3\x75\xed\x40\x1f\x04\xcf\xfe\x11\xe2\xef\x87\xec\xff\x7d\x8a\xf0\x5f\xbc\xb5\xef\xe0\x0d\x77\x6b\xdf\x55\x15\x67\xc4\x01\xd9\x27\xff\x3d\xbc\xf8\xea\x4d\x04\x7a\x8b\x54\xfb\x5f\xb7\x9b\xda\x7a\xb3\x0a\x3d\xe8\x17\x40\x04\x65\xb0\xa9\x1d\x86\x95\x4a\xbb\xea\x29\xe5\x32\xc1\x80\x24\x80\x42\x2e\xa3\xc7\x3c\x02\xa0\x8c\xbd\x10\xc3\x30\xf6\x6e\x9f\xb6\xfb\x49\x63\xa0\xd2\xfb\x49\x2b\xc6\x27\x55\x4d\xa8\x5e\x6f\x98\x48\xc8\x84\xf4\x6c\xcc\x38\x66\x62\x2b\xd6\xfc\xbf\x73\xbc\x5b\x06\x54\x2b\x21\x6f\x51\x77\x09\xb0\x1c\x98\x0e\x25\x1f\x40\xdc\x83\xea\x86\xc3\x76\x02\x71\x53\x4d\x3b\xbd\x56\x6b\x21\x17\x9c\xee\x2f\xdb\x96\x12\x21\x24\x06\x03\xf2\x73\xf5\xc3\x1b\xd7\xe6\x66\x4e\x9f\x1a\x7e\x22\x88\x5f\xfd\xa6\xdb\xf5\xd3\x3f\x28\xdd\xfc\x4a\x76\xe2\x0f\x8f\x95\x32\x8c\x2e\xba\x71\x69\xf4\x73\xf7\x9c\x38\x7d\x6b\xe4\x9b\x61\xc2\xc4\x2d\x1d\x1b\x3d\x0e\x0b\xe8\x7b\x20\x08\x66\xc0\x47\xdb\x23\x70\x76\xb6\xbd\xaa\x35\x3d\x39\x3e\x58\xaf\xa6\xf4\x90\x47\x71\x3b\xed\x94\xa0\xe9\xc9\xf1\xd1\x91\xa1\x56\xbd\x56\xca\x65\xf4\x78\x2c\x12\xf0\x28\x92\xdb\x69\x15\x38\x20\x58\x05\xc9\xed\x96\xe2\xcd\x7e\x04\x33\x57\xe2\xe2\x7f\xa6\x08\x7b\x7b\x30\xec\x0a\x2e\x03\x66\x7b\x05\x37\xdb\x31\x11\xb6\x1b\xb4\x4c\x63\x37\xc2\x9a\x11\xab\x3a\x69\x58\xe9\x3a\x80\x71\xd4\x08\x79\xd4\x81\x0c\xcc\x9a\xec\x04\xc1\xa6\xf1\x5c\x5d\x6f\x52\xb6\xd6\xa4\x3f\x97\x32\x16\xc5\x1e\xb5\xf8\xec\x7e\x6f\x85\xda\x73\x5e\xe2\x0a\x0e\x10\xce\x36\x8b\xa8\x94\x76\xbb\x6d\x2a\x66\xd7\xa4\xdd\x9c\x9c\xe1\x44\xda\x87\x19\x81\x55\x2c\x76\x0e\xa9\x5e\x46\x73\x06\x56\x8f\xba\x35\x0a\xa9\x3d\x68\x73\xc0\x9f\x0b\xa2\x92\x0b\x0e\xc8\x59\x57\x9c\x58\x3c\x25\xaf\x2d\xd4\xe6\x2c\xde\x2a\xcd\x3a\x26\x19\x5e\xb9\x1e\x63\xbb\xcf\xea\x28\x96\xf8\x60\x74\x18\x5b\x59\xab\xc8\x66\x65\x89\x87\x11\x3f\x37\x17\x88\x2a\x6b\x11\x0e\x68\xb1\x80\xa0\x38\x86\x39\x53\x07\x80\x85\x8f\xc3\xdf\x80\x28\x98\x01\x5f\x6b\x6f\x34\x75\x30\x3a\x3d\x35\x31\x3a\xd2\xdf\xac\xd7\x2a\xe5\x62\x3e\x1e\x53\x65\xa7\xdd\x3a\x3d\x61\xa8\x61\xb0\xbf\x59\xab\x14\xb3\xe9\x94\xa1\x89\xb0\x2a\x3a\xed\x56\xea\xb5\x02\x81\xc8\x32\x20\xf5\x3c\x09\x07\x39\x4c\x59\x37\x41\x80\x15\xdd\xd9\xa1\x14\xd2\x11\x2c\x5e\x85\x60\xdd\xda\x42\x6d\x41\x03\x7e\xb5\x9c\xd7\xe6\x3b\xde\x2d\x63\x75\xf5\x54\xbc\x86\x9e\x9a\x3a\x4b\xb5\x46\xdd\x48\x49\x8d\xa4\x62\x14\x0a\x83\x90\xca\x95\x26\x95\x63\x6c\x8c\x2d\x69\xb2\xd4\xad\x6e\x9b\x31\x53\x5d\x8a\x5c\x95\x8c\xc2\xb9\xd2\x34\xea\x09\x53\x85\x43\x30\xc6\x6a\x8d\x3f\x75\xbb\x45\xb7\xb5\xe4\x51\x4b\x90\x19\x5f\x4d\x2d\xb2\x9c\xa5\xfd\xeb\x31\x2b\xfb\x9c\x53\x1f\xad\x94\x59\x8b\x98\x60\x26\x73\x4e\xa6\xb4\xcc\xa6\xc8\x41\xca\x49\x09\x68\xdf\xe5\xa1\x9b\x9a\x0c\xb5\xcb\x68\x15\x84\x68\xeb\x56\x08\x11\x3b\x6a\x3f\x35\x81\x4f\x4c\xf0\x5a\x04\xc2\xad\xd9\xff\xc1\xa1\x75\x65\x48\x1a\x78\x69\x3f\x76\x86\x27\xc5\x04\xbb\x54\xc2\x6e\x8d\x2c\x1e\x44\x82\xd7\x5b\x81\xa2\x19\x07\xf2\xe0\xe7\xe0\x51\x60\x07\x71\xb0\xa5\x1d\x86\x89\x44\x5b\x77\xcb\x92\xd3\x61\xb3\xb2\x20\x1a\x0e\xfa\xbd\x6e\xa7\x83\x67\x30\x54\x35\x18\xbc\xc2\xbb\x5d\x53\x68\x5d\x41\x05\x41\xa2\x57\x50\x09\x33\x12\x5c\xb1\x64\xea\x80\x1a\x6d\xca\x5d\x3e\xcd\xb4\x5f\xb6\x62\xa6\xee\xc6\x78\x2d\xe8\xb7\xc8\xbe\xb4\xaf\x88\x19\x06\x06\xe7\xa9\x25\xed\x67\x9c\xb1\x8c\x6e\xf1\x48\x49\x51\x63\xec\xf5\x84\xe7\x23\x5c\x73\xaf\x2d\x98\xc8\xf9\xfa\x09\xb5\x0e\x71\xd8\x2a\x8f\x44\x18\x31\x9e\x6a\xc8\xfe\x85\xcd\xd8\xaa\x50\x21\x05\x00\x01\x08\xe4\xe0\x4f\x60\x09\xa8\x40\x03\xa3\x60\x09\x7c\xae\x3d\x0b\xd7\xaf\x6f\x6f\x28\xad\x9b\x19\x1f\x1b\x6e\x0d\xf4\x35\xea\xd5\x42\x2e\x63\xda\x54\xc8\xf0\x6d\x4a\xc0\xba\xf9\x99\xb1\xb6\xf1\x54\xc9\x78\x22\x16\x32\x3d\x9e\x12\xb0\x9a\x22\x6e\x2d\x9d\x5f\xe5\xa3\xf6\x76\x09\xb6\x57\x64\x60\x42\xfa\x56\xf1\xd2\x3b\xfa\xfc\x7f\xa2\x3e\x6d\x83\xf5\xbd\xa2\x5a\x6f\xfa\x7e\x27\x29\x28\x4d\x03\xf5\xe8\x6c\x8c\x6d\x24\x69\x52\xd7\x74\x03\x9d\x94\x8d\x14\x61\x98\x52\xc3\x88\x06\x9a\x19\x32\xd5\xa4\x5e\x37\xa9\x93\x4e\x02\x31\x9e\xd5\x74\x4d\x2f\x42\xe3\x3c\x0e\x68\x96\xa1\xe9\x8d\x7b\x33\x69\xab\xcb\xe9\x16\xd8\x44\xb1\x90\xb0\x60\x96\x52\x8e\x70\xa9\xd0\x14\x12\x43\xe1\xc5\xf9\x22\xe4\xdd\xc8\x9e\x22\x0e\xa9\x5e\x3d\x7b\xb4\xdd\xa6\xac\x1d\x39\x2c\x5e\x9b\xaf\x5a\x3f\xbf\xf7\x94\x9f\xc5\x98\x11\xe4\x91\x19\x45\x25\x24\x1a\xd3\x62\x3c\xf4\xc4\xa8\x35\x8c\xa9\x2c\x8b\x22\x85\xac\xec\x83\x10\xe5\x35\x06\xc2\x80\x9f\x78\xa3\x2d\x08\x83\x12\xe3\x95\xf8\x7c\x3c\x3d\x80\x14\x2f\x62\xfc\x12\x5f\x9e\xd4\x91\xc3\xe2\x91\x10\xcf\x22\x08\x59\xbe\x93\x83\xee\x07\x9f\x06\x1f\x06\x2c\x50\xc1\x54\x5b\x81\x1e\x4f\xdb\x6b\x73\x3b\x05\x0e\x29\x36\x02\x24\x2b\x85\x50\xb9\x1a\x64\xaf\xca\xb4\x2b\x3d\x05\x78\x7a\xa5\xe7\xe9\xa5\x72\x3b\xb1\x50\x2f\xc2\x4e\x24\x55\x2c\x1e\xd9\x56\x70\xea\x02\xcf\x30\x1e\x6f\x89\x13\x43\x98\x95\x7c\x7e\x6f\xb8\xd8\x88\xda\x57\x87\x07\x9d\x51\x81\x24\x42\x87\xa4\x44\x1f\xc3\x27\x82\xd1\xc9\x69\xf3\xea\x7e\x1f\x11\xf4\xd7\xc0\x02\x34\xb0\xa6\xed\x87\xf1\x78\x3b\xe1\x8e\x48\x6e\x06\xc4\x22\x21\xc5\xf8\xad\xc4\x60\x08\xc2\xd0\xb5\x11\xcd\x95\xcb\x0c\x81\x78\xef\x65\xc6\x3b\x99\xd1\x6d\xa4\x7c\x07\x34\xb2\x7f\x43\xbc\xca\x8b\xd1\xab\x14\x9a\x32\xfb\xbd\xa9\x72\x76\xf1\xba\x85\x7c\x29\xbf\x77\xe2\x48\x3d\x50\xa9\xa4\xb3\xae\x48\x71\xd5\xcc\x91\x6a\xa8\x52\xd2\x8a\x8e\x68\x1d\x1f\x85\xff\xf3\xb0\x45\x3c\xfa\xb7\xcf\xef\x9e\xb5\x69\x87\x20\xbc\x30\x70\x60\x26\x60\xf7\x54\xbc\xee\xe3\xbf\x3e\xd3\x3e\x3c\x25\x89\x9e\x82\x17\x00\xfa\xe6\x9b\x6f\xfe\x0a\xbe\x8a\x5e\x02\x16\xe0\x01\x55\xb0\x16\x6c\x02\xbb\xc0\xed\xed\x06\xdc\xbd\xbb\xbd\xdc\xd8\xb9\x7d\xfd\xa2\xca\x1b\xff\x8f\x37\x0a\x56\x40\x22\x1b\x49\x84\xa5\xa4\x14\x21\x62\x8c\x88\xb2\x48\xe2\x76\x36\x93\x42\x34\xe0\x1f\x19\x5a\x80\xe3\x2b\x2e\xd0\x32\x8b\x5a\xa3\x2a\x30\xe3\x6a\xf1\xad\xe1\x15\xbc\xc5\xd4\xc7\xc1\xee\x5e\x29\xec\x36\x95\xa5\x34\x95\x66\x63\x08\xd6\x92\x76\x28\xea\x9a\x6e\x7c\xf4\x92\x2c\x19\xd6\x9d\x85\xb1\x5e\x0e\x66\x85\x71\x31\xa4\x55\x84\xdd\x27\xcc\x87\x0a\x7b\xb5\x5a\x68\x24\xcd\x42\x96\xe2\x8e\x3c\x6b\xf7\x84\x12\x0b\x2e\x27\x1f\x39\x78\x5d\x48\x4b\x0e\x30\x3c\xb4\x56\x1e\x2f\x0c\x65\x37\x84\x64\x04\x11\x24\x88\xb3\x9d\x94\xb4\x47\x03\x4e\x88\x10\xc3\xb9\xd6\x52\x88\x90\xdd\x1e\x4b\x5f\x54\xb5\x9b\x6d\x02\xe6\x21\xc4\x42\x2a\x79\x68\xa7\x6b\x2e\x64\xfb\x4b\x77\x20\x0f\x05\xd7\x29\xab\xdb\x1a\xcb\x97\x1f\xf4\x10\x66\xf3\xd2\x96\x89\x68\x74\xe8\xdf\xe1\xcd\x32\x29\x25\xe3\xc9\xb9\xe1\x5d\xe7\xff\xdd\x93\xef\x5f\x28\x6c\x8b\xac\x6d\xd5\x16\x28\x84\x64\x5b\xa5\x7c\x57\xe4\xba\xd8\x3a\x69\xb6\x78\x76\xcd\x43\x25\x69\x9c\x40\x88\xd6\x0d\x35\x4f\x6d\x5e\xf6\x2f\xca\x03\x2c\x85\x24\xe3\x9e\xd7\xa7\x8f\x67\x37\xcf\xc3\x46\xd1\x61\x61\x76\xdf\x32\xdd\xf1\x8c\x17\xe1\x4e\xf4\x5d\xe0\x00\x29\xb0\xbb\x1d\x87\xe9\x74\x3b\xa3\x04\x7c\x02\x35\x22\x56\x28\xe0\xf3\x28\x4e\x81\x22\x2b\xe1\x80\x9d\x70\x21\x05\xbe\x05\xa2\xb5\x7e\x2b\xc5\x81\x42\x2f\x4c\x4b\xf7\xaa\x21\x6d\x46\x9c\x58\xb2\x23\x30\xaa\x9a\x75\x3c\xae\xa8\x2b\xe4\xfd\x15\xcc\x61\x44\xe8\xea\xc7\xd7\x97\xc6\x2e\x88\x31\x0d\xe3\x40\xae\x0f\xf3\x11\x2f\x62\xe6\xda\xa3\x10\x95\xec\x19\x86\xd3\xf4\xbd\x37\x24\x86\x5d\xb1\xe4\x00\xfc\xc7\x40\xfc\x38\xe3\x7c\xfc\xd3\x9f\xfe\xa4\x88\x8f\x1d\x39\x7a\xf9\x45\xc6\x1d\xb7\x0f\xbe\xfa\xfa\xeb\x5f\xb3\x04\xa5\x94\x24\xec\x6c\x05\x79\x7b\x40\x30\x3f\xe7\xd7\xd1\x08\xfa\x22\xc8\x82\x43\xe0\xfe\x76\x0b\x1e\x3e\xdc\x3e\xb2\x69\xff\xbe\x0d\x6b\x52\x32\x45\x7b\x77\x6f\x5a\x5a\xb3\x30\x39\xdc\xea\x6b\x56\x53\x56\x8a\xe2\x31\xe2\x6d\xb1\x64\x94\x25\x19\x4a\x1c\x34\xe2\xa2\xa1\x60\x71\x13\x5c\x82\x0b\x10\x2e\xf4\x34\x35\x3a\x2c\x8b\x61\x8a\x86\x30\xde\x31\x2c\x77\x25\xb2\x00\x0e\xf7\x4a\xe4\xb0\x21\x91\x84\xa2\x1a\xd6\xd5\xe8\x00\x58\x9d\x35\x8b\x50\xb5\x6b\x8d\x83\xf0\x0a\x01\x68\xc4\x5f\x51\x2f\x42\xbd\x5b\x42\xca\x26\x9d\x58\xaf\x35\xd4\xab\x2f\x59\x11\x61\xc3\xc4\xf3\xdd\xef\xc6\x08\xd4\x93\x46\x98\x86\xaf\x73\xf6\xe3\x67\xcf\x1c\xa2\x70\xcf\x81\xd3\x61\xeb\x78\x91\xe7\x53\xd1\x18\x2d\x46\x18\x84\x9c\xc5\xcd\x85\x96\xf7\x24\x8b\x10\x24\xd9\xef\x26\xe2\x1b\x5a\x99\xfc\xd6\x1b\x07\x02\x90\xb3\x87\x21\x8a\x8e\xc2\x76\x51\x92\x30\x82\x28\x7a\xba\xef\xfd\x0c\x9f\x49\x89\x5e\x8c\x2f\x7c\xe0\xd1\x33\x3e\x17\x2b\x46\x88\x30\xd0\x3a\x97\x62\x50\x04\x42\x44\x4f\xf9\xea\x1a\xcb\xd6\xdc\xe8\xe0\xe9\xbb\xce\x15\x86\x09\xf4\xc4\xa7\x78\x6b\x42\xcf\x86\xe2\x10\x5b\xda\x0e\xd9\xe5\xfe\xa3\x97\x09\xb2\xbb\x10\xc3\x06\xe3\x0d\x71\x15\xe5\xfc\x56\x3b\xa6\x02\x5f\x9a\xc6\x90\x08\x16\x0b\x7f\xfe\xf6\xc1\x4f\x28\x0e\xd5\xee\x48\xf2\x7c\x83\x21\xc3\x7d\x9a\x6c\xb1\x88\x71\x07\x73\xe6\x67\xf3\x45\x37\x52\x4c\x6d\xfe\x12\xfe\x19\x7a\x0e\x8c\x80\x4f\x81\x67\xdb\x0b\xf0\xe9\xa7\xdb\xcf\x4c\x7d\xe4\x83\x0f\xbd\xf7\xc2\xed\x1b\xd6\x97\x52\xdc\x13\x1f\x79\xf4\xa1\xf7\x3d\x78\xef\x1d\xb7\x9f\x3b\x75\xf2\x86\x7d\x7b\x77\xad\x5b\x3b\x3f\xd5\xa7\x2a\x3c\x47\x48\x2b\x47\x6a\x35\x22\x86\x44\xd2\x3a\xc6\x22\x2f\x8b\x00\xb5\xc5\x68\xc5\x46\xd1\xb6\xb1\x43\x08\xee\xba\x92\x06\x56\x54\xeb\xbc\x12\x76\xde\x05\xd0\x81\xb7\xa7\xdc\x5d\xe0\xe9\x5e\x75\x3f\x6d\xc6\x21\xda\x8d\x33\x46\x2c\xa9\x9a\x3a\x4f\x16\xa0\x56\x6f\x34\x87\x61\x87\x0a\x63\x3b\xc1\x66\x85\x11\x6e\x74\x75\xab\x5c\xe1\x1f\x94\x4e\x55\x53\x44\x9d\x77\x1b\xca\x7d\x0b\x5b\x26\x99\x1c\xb0\xf1\x6e\xc3\xb9\x64\x55\xea\xd8\x86\xa6\xa8\x15\x55\x33\xc0\x4f\xe7\x4c\x49\x3d\x59\x1f\x41\x94\xd5\xeb\x8d\xba\x61\x36\x92\x69\x57\xcd\xc6\x1d\x89\x74\x84\x40\xc6\x5f\x67\xd8\x84\xdc\xcc\x30\x1e\x31\xc1\x30\xdb\x46\x05\xb5\x32\x43\x50\x3c\x92\x89\x45\x74\x8e\x41\xfe\x06\x85\x38\x90\xc8\x2c\x2d\xdd\xcd\x21\x9b\x67\x78\xd2\x49\x11\x39\x2b\x22\xe7\x5c\x21\x1b\x66\x30\x27\x56\x19\x58\x90\x20\x46\x88\xc4\x10\x17\x4a\xdd\x9b\xcb\x64\x52\x11\x96\xcb\x42\x58\xac\xa3\xa0\x52\x0f\x39\x20\xc4\x10\xa5\x3c\x75\x51\x85\xa4\xa0\xe3\x34\xc4\x7d\x79\xca\x31\x0b\x4d\x87\xd5\x8e\x21\xf4\xca\x10\x42\x52\x2e\x53\x14\x4f\xde\x2a\x56\x91\xc5\x93\x65\x26\x19\x41\x2a\x38\x78\x82\x88\xcd\xdb\x6c\xaf\xa3\x10\xe1\xd1\x32\xcf\xa7\x3c\x32\x26\x16\x7b\x48\x92\xa8\x98\x53\x52\x6e\x27\x64\x2d\x7b\x93\xe9\x45\x8f\x7d\x73\xa8\x7e\xa3\x15\x8d\x41\x84\x5c\xde\x82\x56\xb8\x29\x2b\x20\xfd\x94\xd5\x2b\xb9\x73\x6e\x9f\xdd\xcd\x21\x97\x54\xb0\x6c\x46\x4e\xbb\xcd\x66\x17\x70\x5d\x71\x51\x06\x63\xc6\xc1\x90\x7c\xd8\xc3\x10\xde\x2d\x32\xbc\x13\x69\x42\x76\xc1\xc2\x42\x8c\xac\x56\x81\x43\x0c\x65\x18\x6a\x11\x29\x6f\x1b\x74\x36\xa4\x16\x03\x4d\x0c\xf8\xe6\x9f\xc1\x7f\x40\xff\x0d\xb0\x20\x06\xd6\x80\x2d\xe0\xf1\xf6\x18\xdc\xba\xb5\xbd\x6d\xd5\xe6\x8d\xeb\xd6\xae\x9a\x1e\x1a\xec\x6b\x54\x2b\xb9\x8c\x9e\x88\x86\x15\xbb\x95\xa3\x60\xe3\x7a\xe3\xf8\xa4\x79\xdc\x00\x87\xc6\x71\x8e\x02\x0f\x83\x08\x62\x7c\x85\x49\x08\x1b\xef\x12\x65\xff\x13\xc0\xaf\x6b\x82\x0d\xb0\xb5\xd7\x04\xb7\x76\x70\x4b\xa7\xb3\x2c\x76\x32\x9b\x69\x45\x46\x4c\xee\xd0\x54\x66\xed\xd0\xd4\xb3\xb0\xd3\x7d\xee\x04\x14\x03\x3e\x74\x1a\x62\xaa\x61\x45\x9d\x57\x75\xe2\xb6\xd9\xc9\x30\x4c\x4e\xd7\xe8\xa9\xc5\xf5\x90\x89\x9c\xcb\x15\x19\xfc\xc0\xad\x98\x29\xee\x9c\xdf\xaa\xe6\x2a\x28\xe6\x74\x62\x36\x92\xa4\xc3\x0c\x23\xe0\x86\xa4\x53\x6b\xac\x71\xe0\xbe\xa6\x85\xbd\xd1\x15\x22\x98\x3b\x7a\x3b\x64\x02\x01\xc2\x56\xd6\xf8\x3c\xba\xdb\x2d\x13\x47\x88\xfe\x54\x4a\x43\xe8\x70\x38\xde\x10\xf0\xf8\xc8\xe8\x78\xfe\xf2\x2e\x0e\x0d\x8f\x32\x09\x9b\x6f\xe9\x99\x0b\xfb\x19\xf6\xb3\x5f\x49\x26\x31\xc4\xbe\x2a\xcb\xd4\x2f\xa0\x64\xe2\x33\x4f\xb0\x82\x94\x10\xe8\xc9\x5f\xed\xf6\x3b\xfe\x9e\x08\xd4\x1d\xd5\x18\x6f\x0d\xbb\xe3\xd4\xd3\xb7\xd1\x4a\xf9\xb1\x1c\xa1\x31\x7f\x6c\xdc\xeb\xf5\x79\x21\xec\xe4\xbd\x7f\x81\xbf\x42\xdf\x04\x39\x70\x02\xbc\xd4\x5e\x07\x6f\xb8\xa1\x7d\x72\xe2\xc0\xfe\x4d\x4b\x73\xb3\x93\x13\x83\x03\x8d\x7a\xd8\x23\xd9\xc9\x91\x1d\x1b\x96\xd6\x2c\xcc\x4d\x4f\x4e\x0c\x1b\xc7\xca\x1e\xc9\x89\x04\x92\x8c\x12\xf7\x10\xab\x6c\x61\xf7\x2e\x2f\xb2\x87\x00\xa5\x56\xaa\x05\xa9\x42\x69\x76\x3a\x3f\x8c\x34\x14\x45\xf0\x48\x4f\x96\x58\x09\x24\x26\x8e\x37\xa3\xc9\x6f\x33\xf3\xef\xa4\xcd\xae\x1a\x8f\x80\x1b\x7a\xd5\x78\x43\x37\x92\x98\x24\xba\x11\x02\x58\xca\x16\xa1\xc9\x7d\x98\x91\xc5\xe4\xc9\x29\xdb\xe5\xd8\x3b\xd8\xa5\xcb\xb3\xab\x06\xa4\x91\x75\x03\xc4\x9b\xaf\x35\xf5\xdb\xed\x81\x1a\x6b\x45\x35\x70\x7e\xf7\x5d\x49\xbd\x08\xbb\x95\x93\xa2\x2a\x1f\x3c\xe2\x93\xd2\xb6\x35\x5b\xb2\x09\x44\x6e\x5b\x55\xe0\x19\x1e\x63\x7e\xf7\x75\xd7\xed\x74\x70\xcc\xba\xfd\x7a\x12\xf1\x4a\x63\x8f\x1e\x67\xd9\x48\x7d\x93\x7f\xcb\xd6\x8a\xcf\x2b\x44\x20\xe5\x39\x57\x6a\x99\x45\xcc\x5d\x87\x2d\xde\xa6\x60\xdb\x77\xf4\xe8\x41\x37\x66\x1d\xbc\x0b\x52\x8b\x65\xb6\xac\x85\x79\x88\xfc\xf1\x41\xaf\x5b\x91\x20\x96\xed\x5a\x8e\x53\x02\xab\xc2\x15\x3a\xe4\x2d\xd6\x31\xd2\x32\xd3\x77\x53\x12\x65\xf0\xd2\xcc\xe4\x26\x2f\x46\xd1\x94\xa4\xf8\x89\xfb\x46\x2b\xa1\xb9\xd4\xbe\xeb\xeb\x15\x0a\xdb\x28\x98\x6a\x2e\x1e\x2d\x24\x10\xc7\x88\x6e\x98\x73\x04\x71\x36\xb1\xca\x1b\x0a\xe9\x08\x07\x4f\x9f\xae\x54\x18\x8e\xf2\x52\x8a\xa1\x05\x97\xdf\x3b\x11\x8c\x50\x84\x30\x4f\xb1\x4d\x4b\xf4\xb9\xbc\x25\x1b\xed\xf8\xef\xbf\xc0\x9f\xa3\x3f\x01\x76\x90\x03\x9b\xc1\x41\x70\xbc\x9d\x87\x87\x0e\xb5\x0f\x8f\x4f\x8e\x47\xc3\x6b\x16\xa6\x27\xc7\xdb\xd5\x68\x58\x16\xf1\x0e\xb2\x4f\x20\xe9\x65\x56\xdb\xc2\x3a\x00\xd5\x28\x75\x4c\x17\x57\x00\xc1\x55\x3d\xbf\x4d\xc1\xe0\x2d\x20\xe0\x50\xaf\x2e\x0f\x75\x5a\x2d\x94\xa5\x26\xac\xac\xd7\x92\x0d\x1d\xc7\x3a\x49\xa2\x7e\xc5\x37\xd9\xae\x56\x3a\x04\x56\x47\x9b\x7a\xdd\xcc\x02\xdd\x1c\xdf\x83\xe9\x3b\xfd\x18\x55\x51\x4b\x62\x43\x55\x64\x43\x95\xb1\xa4\x5e\xd7\x9b\x8d\x1f\x97\x46\x19\xda\xdf\x6c\x06\x43\x08\x0d\x34\x4f\x25\xfc\x0c\x84\xd8\x4a\xac\xca\xd4\xe3\x53\x03\x2f\xaf\xf7\xc5\x36\xa5\x34\x1e\x0d\x44\x32\xb1\x5a\x36\x1d\xe4\xd5\x0c\x22\x1c\xe2\x9d\x9e\x5a\x64\xf5\xf1\xf4\x88\xa7\x38\xb2\xff\xb1\xd5\x29\x07\x42\x28\x28\x40\x41\xd6\xab\x1b\x1d\x5e\x9e\xf1\x06\x9a\xba\x9d\xa1\x0b\x12\xdc\x8a\xe7\x2a\x8d\x2a\x26\xee\x60\x5a\x10\x72\xd3\x97\x7f\x26\x49\x79\xb7\xe8\xb3\xce\xb9\xab\x89\x53\x9f\xe6\xe4\xd7\x8f\xdb\xaa\xd9\x1d\xa2\x73\x5d\xc0\x39\x0b\x11\x12\xe5\xa2\xad\x66\xbd\xb5\x82\x29\x85\x36\xaf\xd7\x9a\x59\x7e\xaf\x2a\xf9\x6a\x01\xc7\xc7\xee\x1c\x7b\xda\xe1\x2d\x78\x08\xf4\x58\xdc\x0c\x0c\x63\x9b\xd7\x55\xf6\x89\x1c\x6b\xe5\x36\xc6\x78\xd3\x77\xff\x18\xed\x40\xff\x00\x12\x60\x33\x78\xb1\xbd\x16\x6e\xd9\xd2\xde\x9a\x5c\xbf\xb8\x7a\x61\x7a\x72\x6c\x74\xb8\x55\x2a\xa4\x93\xb1\x90\x6a\xdb\xb4\x71\xfd\xe2\xda\xd5\xb3\xd3\x93\xe3\x63\xa3\xed\xe1\x81\x4a\xe7\xb0\xdb\x61\x03\x4e\xc2\x20\x32\xc0\x3a\x18\xea\x46\x4e\x9e\xc5\x0e\x2a\x01\x2f\x8d\xcc\xc2\x0a\x86\x95\x2b\x45\x96\xe1\xae\x6a\xab\xeb\xb3\xad\x77\x6b\x13\xbf\x73\x67\xad\x02\xb6\xf4\xaa\x7b\x8b\xa1\x6e\x58\x69\xd2\x20\x8c\xb1\x34\xd9\xc1\x6c\x5a\x2d\xa9\x54\x9b\x66\x49\x6d\xb8\xa7\xe1\xd4\x94\xa5\x86\x4e\x3b\xda\xef\x90\x97\x6a\xe7\x78\x2c\xa9\x04\x61\x55\x5e\x19\x67\x68\x34\x4d\x62\x87\x6a\xb5\x66\xbd\x01\x8f\xcb\x09\xa8\x28\x8a\x32\xb7\x75\x2c\x76\x74\xed\x24\xae\x34\x2a\xbe\x48\x3a\xf3\xc9\xbd\x2e\x5e\x38\xf9\xd8\xbd\xf7\x32\xb6\x5d\xf7\xf9\xbc\x39\x06\x63\x41\x7c\xe0\x43\x4f\x9c\xf7\x2b\x41\x99\x58\x97\x1e\xe2\x6a\x8d\x1a\xca\x1d\x98\xcd\x64\xdd\xf1\xa5\xf6\xc2\xba\xad\x88\x0d\xb2\x70\x0c\x3e\x48\x5c\xae\x28\x82\xf0\xa9\xb3\x2e\xe7\x63\xcf\x68\x1a\x59\xae\x64\xc8\x40\x5e\x51\x27\x29\xad\x59\xd4\xf3\x5b\xea\x36\x91\x23\xd8\xad\xb5\x28\xbb\xba\x3c\xe5\xe2\xf8\x72\x94\x38\xf6\x32\x8a\x9a\x4f\x7c\x6b\xa7\x64\xf3\xe4\x83\x74\xef\x8b\x8c\xc7\x53\x44\x98\xb0\xf7\x76\xe6\x01\x7e\x09\x7f\x82\x3e\x03\xac\xc0\x0b\xfa\xc0\x61\x70\x0e\xdc\x07\x1e\x6a\x0f\xc3\xfb\xef\x6f\xbf\x77\xf8\xce\x5b\x8f\xac\x5b\x5c\xbd\x90\xb4\xdd\x73\xfb\x6d\xfb\x96\xb7\x6f\x35\x1e\xcc\xcd\x4e\x0e\xd7\xcb\xf9\x44\x54\x71\xdd\x40\xce\x0a\xa4\x8a\x49\xf8\x46\x56\x04\x54\xa4\xd4\xef\xdb\xb8\x7e\x00\xee\x7b\x4b\x95\xb8\xe2\x80\xd7\x8e\xb1\xd7\x18\x38\xda\x07\xee\xef\x55\xd1\xfd\x9d\x42\x65\xc5\x23\x93\x05\x98\x34\x3b\xa1\x55\xc5\x84\x5b\x58\x8b\x75\x9a\x42\x57\xcb\x45\xd3\x2b\x15\x55\x32\xa3\x66\xb7\x3c\xd4\x8b\xb8\xd1\xac\x99\xf8\xac\x6a\xfc\x74\x8b\xc8\x8e\x77\x86\x8d\xd2\xb1\xd3\x09\x32\x5c\xd4\x9c\x52\xa2\x49\x9a\xd4\x4d\x14\xa8\xca\x12\x4d\x76\x43\xc0\x8f\xcb\x6d\xc2\xb4\xfb\x86\xbc\x7e\x8c\xfb\xcb\x09\x2d\x46\x6d\x9b\xd3\x35\x88\xc4\x5c\x7a\x6d\x4a\x8b\x13\xeb\xae\x96\xc6\x23\x6e\xf9\xb8\xbe\xcf\x8a\x19\xe7\xc2\x76\x1b\x44\x99\x78\x6b\x73\x3e\x15\x42\x50\xf0\x34\x19\x86\x64\x3d\x08\x21\x12\x86\x0c\x1b\x86\xb5\x23\xe9\xb8\x1c\xab\x52\x08\xb1\x43\x2e\xa0\x59\x3b\x83\xc2\x98\xf5\xbf\xe8\x51\x05\x08\x5b\xb2\x1c\x0c\xb1\x88\x8c\x94\x64\x7b\x29\xee\xb3\x40\xcc\x46\x02\x70\xf3\x54\xa5\xaf\x8e\x88\x57\x2f\x95\x47\xfe\x0d\xdb\xe4\xf2\x1e\xa6\x95\x2e\x38\x95\x4b\x7f\xa5\x86\xe6\x5e\xf6\x79\x1e\x4c\xc8\x7d\x10\x31\xf6\xba\x53\x70\x3b\x8f\xa7\xe4\xf7\x92\xd8\x4c\x40\x9d\x45\x48\x14\xcb\xc1\xea\x2d\x65\x81\x65\xe3\xc7\x04\xc5\xed\xd4\x6d\x58\x94\xdd\x0c\x36\x40\x7e\xd6\x26\xdb\x87\x37\x68\x28\x76\x71\xc0\x53\xf4\x20\xa6\x05\x83\xc8\xea\xb3\x73\xdc\xb0\xc2\x61\x6c\x75\xf9\x32\xed\x5f\x61\x22\x27\xea\x0c\x65\xdd\x09\xc5\x0d\x08\x00\x6f\xfe\x1f\xf8\x23\xf4\xbb\xc0\x01\xca\x60\x3b\x38\x09\xce\xb7\x6b\xf0\xd4\xa9\xf6\xe9\xc6\xae\x1d\xdb\xb6\xae\x5f\xa7\xca\x7b\xb7\x6d\xdd\xb8\x7e\xdd\x9a\xf1\x46\x2e\xa2\xca\x56\xe6\x38\xd9\x77\x88\x8d\x43\x36\x0e\x58\x3d\xee\xa5\xdc\xc8\xd0\x46\xb8\xc2\x27\x8c\x14\x5b\xdd\x5c\x6c\xda\xca\x3b\x19\xc8\x15\x3e\xe1\x54\xaf\x7d\x9c\x32\xed\xc3\x54\x65\x08\x36\xbb\x20\x5c\xbd\x5a\x7e\x25\xf5\x64\xcd\xec\x18\x56\x2b\xe5\x8e\xdb\x4a\x1d\x36\xc1\xb4\x0a\x93\x51\x88\x99\x45\x9e\xd2\xf3\x6d\x02\xac\x8e\x3f\xcb\x0d\xdc\x53\xd4\x25\xcd\xd0\x6d\x9c\xee\x47\xe9\x41\x8a\x20\x1c\xab\x34\xa4\x00\xcb\x46\xd5\x2d\xb1\xe9\xbd\xd9\xe9\x07\x96\xfc\xd9\x35\xa9\x48\x90\x0b\x44\xca\xeb\xfb\xa3\x7d\x9e\x38\xc3\x08\x54\x08\xf9\xec\x2c\x84\x61\x8e\xf5\xb4\x6e\xf3\xb6\x0b\xc9\x10\x62\x18\x27\xeb\xf0\xb2\x02\xeb\x4a\x56\x2b\xe9\x5d\x83\x59\x29\xbd\xb8\x6e\xe8\x24\xfb\xa8\xd3\xea\x12\x30\x42\x18\x86\xbd\x59\x4b\x8a\xa2\x96\x1b\x2d\x61\x5c\x17\x7d\xd5\x29\x42\x3c\x9e\xc1\x41\x45\xfe\x45\xeb\xb6\x23\x44\x7e\xe6\x36\x17\x22\xb5\xcc\x19\x6b\xd9\x5a\x74\x4a\x90\x61\x6d\x52\x81\x4e\xf5\x29\x89\xeb\x06\x6e\x18\x50\xcb\x1e\x2c\xb9\x7c\xc4\x2d\x97\x3c\xf5\x49\xa5\x1c\xe3\x05\xab\x27\xce\x4c\x55\x4e\x49\xbc\x9a\xf7\xc0\x89\xaf\x21\x11\x02\x8c\x31\x16\x2c\x16\x21\x1f\xf4\x43\x4e\x15\x59\x3a\x20\x53\x33\xff\xfe\x0e\xf8\x1a\xfc\x1c\x60\x81\x03\x84\x41\x11\x5c\xdf\x4e\xc3\x52\xa9\x5d\x4e\x18\xd0\x38\xe2\x33\xdb\x7a\x02\x2e\x24\x42\x8a\x95\x23\xc0\x2d\x71\xb9\x4c\x26\x17\xd0\xe8\x55\x46\xec\x5a\x9d\x11\x70\xad\x78\x1c\x02\xa5\x5e\x65\x96\x0c\x65\x8e\xc0\x46\xd3\x1c\xca\xec\x65\xf4\xcc\xc6\x5f\x07\xfd\x88\xe6\xc3\xa4\x9e\x74\x98\xe3\x85\x8a\xe4\xb7\xdb\x6b\x6e\x3d\xe6\xf5\x04\xe4\x9c\x18\x8f\x46\x21\xb5\x79\xa3\x21\x77\x8a\x70\xce\x98\x98\xd6\x43\x82\x2b\x26\x25\x63\x16\x2f\xc5\x16\x6f\x46\x21\xcd\x9a\xdf\xbb\x35\x38\x98\x83\x03\x21\x3d\x3c\x1c\x1a\xae\x4f\x41\x9b\x92\x6e\xb7\x83\x03\x8c\xc5\x53\xf4\xd6\xb6\x5c\xfe\x63\x87\x27\xef\xab\x4c\x7b\xf2\x3c\x96\xd3\x73\x55\xd6\x94\xc9\x0c\xf8\x27\xf8\x84\x39\x7d\x99\x03\xc3\xe0\xa6\x76\x01\x8e\x8c\xb4\xdb\xde\xfe\x66\xb5\x33\x72\x19\x0a\xf8\x25\x27\x87\x86\xea\xc9\x84\x16\x8b\x78\x55\xc5\x6d\x17\x28\x41\x83\x59\x55\x81\x50\x5b\x99\xea\xfb\x2d\x0a\xfd\x9a\xd9\xaa\x2b\x1b\x0d\x8c\xf4\xca\x66\xc4\xa4\x0f\x63\xec\x15\x3e\xdd\xa4\xbb\x4c\x09\x89\x6c\x0f\xab\xde\xc9\x44\xaa\xa2\x36\x70\x63\x04\x9a\x13\x4a\x57\x44\xb5\xca\x91\x4d\x79\x89\x57\x2c\x6b\x21\xca\x78\x97\x14\x5d\x4e\x4a\x49\xdf\x05\x44\x84\x48\x9e\xd8\xfc\xc9\x14\x2f\x4d\x44\x02\x02\xeb\x51\x55\x65\x60\x02\x23\x2c\xf0\x2e\xa5\xe0\x4a\xb1\xc4\x12\xf3\x14\xbd\x17\x2c\x7b\x66\x68\x20\xd4\xce\xe6\xad\xcc\x00\x1c\x08\xf4\x07\xfb\xa3\xa3\xa9\xcb\xbf\x84\xbc\xa3\x35\xc4\xb8\xa3\x99\x31\x9b\xe7\xcb\x76\x24\x89\x2c\x46\xec\x36\x18\xc1\x98\x3a\x1c\xa1\xfc\xe6\x70\x9f\x95\x71\x94\xa3\x63\xa9\x0e\xd2\xff\x32\x9a\x84\xbf\x04\x2e\x90\x07\xd7\xb5\x13\xb0\x50\x68\x17\xbd\x29\x6b\x2e\x93\xd2\xa3\x5e\x45\xb2\x72\x18\xb0\x1c\x0f\x01\x80\x19\x1d\x79\x21\x46\x30\x77\x15\xbc\x5f\xbb\xe1\x06\xae\xc8\x2c\x07\x0a\xbd\x32\x2b\x98\xc1\xa1\x43\x71\x39\x56\x06\x53\x93\x35\x03\x8e\xb1\xcc\x4a\xc1\xa4\x27\xaf\x8e\x27\x32\x8a\xe5\x57\xb7\x9c\x0e\x8a\xeb\x56\x3d\xb5\xef\xbb\xbc\xba\xf0\x81\x27\x47\xa8\xcd\x83\x08\x14\x3f\x78\x72\x58\x71\x69\x98\xfa\x3e\x73\xae\x39\x24\x6a\x72\x4e\x0a\x7e\xe2\xf2\x47\x39\xa8\x2d\xa5\x46\x4a\xb5\x9c\x7f\x30\xb1\xb1\x52\xcc\xd5\x07\x23\x56\x99\xb5\x5b\x3d\xcb\xfd\x13\x6b\xfa\x38\xd9\xe6\x75\x4c\x94\x95\xe4\x5c\xbf\xcd\x97\xce\x6e\x3e\x5e\x02\x18\x20\x50\x46\x9f\x81\x0f\x01\x01\x28\x60\x00\xbc\xa7\xdd\x07\x07\x07\xdb\xad\x74\xb3\x5e\xad\x24\x13\xb1\x48\x28\xe0\xb7\xf0\x4c\x7f\xbd\x5a\x29\xa6\x13\xb1\x88\xdf\x61\xe1\x19\x07\x9b\xcd\xd2\x62\xa9\x88\x01\x41\x94\x15\x59\x5b\x7f\x1a\xf6\xf7\xc2\x5c\xd5\xe4\x43\xe0\xbb\xda\x55\x57\x42\xfd\x60\xb0\x57\x42\x83\x1d\x3a\x76\x04\x4a\x1d\xe2\x2b\xd9\xed\x4c\x1b\x72\x31\xc3\x9e\xa6\x6b\x0a\xdb\xa8\x1a\x11\x71\xa5\xc4\xac\x57\x75\xb3\x54\x49\xc6\x92\xca\xa9\x7b\xc7\x7e\xdf\x7b\xc3\xa9\x53\x27\x43\x1b\x1f\x78\xf0\x7d\x0f\x68\xfe\x53\x7b\xf7\x9f\x90\xdc\x76\x1f\x61\x24\x3b\x87\xd3\x01\xb7\x60\xf7\x3f\xf6\xc4\x27\x1e\xdd\x28\xda\x83\x34\x8b\x73\x65\xb7\xfe\xf8\x87\x3e\xfa\xd1\x85\x3f\x45\x10\xa6\x4a\x36\x08\x5d\xb9\xff\x11\x55\x82\x43\x02\x84\xf6\xd2\x20\xc2\xf6\x20\x9c\xa8\xb1\x2e\x5b\x40\x45\x30\x32\x32\x08\xb1\x22\x4d\x54\x59\x39\xe9\x83\x89\x61\xd3\x7a\x7e\x84\x46\x90\x00\x64\x50\x03\x7b\xda\x1a\xac\xd7\xdb\x8d\xa0\x47\x91\xf8\x52\x2a\x1e\x0d\xfa\x3c\x8a\x64\xe3\x31\xc2\xbc\xdb\xe9\x74\xa7\x7c\x10\xa6\xae\x14\xee\xef\x64\x39\x57\x24\x93\x02\xf5\x5e\xc9\xd4\x3b\xd5\xf9\x48\x97\x74\x56\xd4\x92\xca\x52\xd9\xcc\x2b\x5d\xb0\x97\xd0\x9b\x7a\xb2\xd6\xa8\xeb\x57\x11\xa1\x99\x78\x0e\x8e\x2e\x7d\xa4\x79\xfd\xe6\x09\x47\xe6\xd0\x7d\x6f\x62\x98\xff\xca\x83\x4b\x6a\xca\x17\x61\x12\x07\x1e\x81\x98\x43\x76\x1f\xde\xf6\xc5\x47\xae\xaf\x79\x5d\x31\x86\x19\xbd\xeb\xec\x68\xd5\x76\x4a\x8f\x0e\xc9\x19\xad\x90\x1f\x99\xaa\x6c\x4d\xb8\x5d\xd2\x5c\x7f\x39\xd9\x72\xb9\x6c\x63\x7d\xd5\xad\x0b\x6e\x62\xa3\x5e\x1a\x69\xf7\xad\x9a\x1a\x13\x3c\x56\xaf\x56\xa9\xf8\xc3\x59\xa3\x52\x82\x6f\x7e\x0f\xbe\x07\x7d\x0a\xb0\xa0\x0a\x6e\x06\xb7\x80\x17\xdb\xab\xe1\xb9\x73\xed\x5b\x57\xdd\x72\xf6\xcc\xe9\x93\x27\x8e\x1f\x3a\xd8\x1a\xac\xd7\x72\x71\x17\x45\xb7\xdc\x74\xfa\xe4\xa1\xeb\xf6\xec\xda\xb1\x65\x7e\xd5\x70\x6b\xb0\x3f\x1e\x23\x00\x20\x9e\x12\x42\x53\xa4\x12\x20\x95\x33\x0e\x3b\x71\x39\xd8\x42\x88\x16\x22\xb4\xb0\xa1\xb9\x07\xc1\x2d\x3d\xe4\xdb\x0a\xf1\xd6\x32\x96\xef\xda\xf6\x7e\x67\xf4\xbd\x05\x9c\xeb\x95\xf0\xb9\xde\xbe\x8d\xd8\x29\x97\x0c\x24\x5d\x6f\xae\x54\x5a\x0d\x4d\xd7\x62\xb2\xd4\x61\xa7\xaf\x8e\xae\xe1\x6e\x42\xa8\xea\xf5\x11\x23\xc8\x19\xff\xae\xa6\x73\xfd\x4a\x3a\xa7\x72\x87\x95\x6d\x36\x06\x61\x47\x75\x9a\x64\xea\x4e\x69\xb2\xc9\x31\xb5\x10\xf1\x7b\x8b\xe2\xff\x8f\x55\x03\x33\x14\xfa\xeb\x08\x21\x8e\x95\x53\x23\x88\xe0\x55\xbc\x30\x8e\x33\x3a\x2b\x86\x73\x78\x7c\x73\x2a\x85\xd0\x9f\x50\x57\xb4\x16\xd6\x72\x0d\x0c\x39\x06\xa9\x72\x96\x77\x63\x3b\x87\x10\x09\xf0\x24\x9c\xdb\xbe\xa0\x78\xbd\x1e\x48\x98\x80\x02\x51\xbe\x86\x32\x16\x89\xc7\xa5\x25\xc4\x22\xe2\x08\x06\x6a\xf1\x2d\x98\xac\x89\x8d\xe5\x43\x91\x31\x0f\xfc\xae\x35\x10\xdd\xc4\x59\xae\x83\xb4\xd9\x84\x61\x87\xc5\x9b\x9f\xe5\x5c\x65\xd4\xe0\x04\xab\x9a\x70\x6b\x4e\x0e\x41\x4c\x9c\x42\x45\xbb\xf4\x47\x82\x18\x6f\x67\x92\x03\x7d\x35\x0b\xc7\x11\x6f\xa0\xe9\x08\xa1\xd4\x98\xc3\xae\x11\xe8\x76\xd9\x28\xc3\xc9\x49\x39\x23\x71\x36\x7b\xc0\x86\x39\x36\xed\x66\x38\x52\x3c\x60\x0b\xae\x2f\x23\x26\xb5\xa6\x71\x1b\xc6\x80\x05\xe8\xcd\xbf\x42\x2f\xa0\xcf\x01\x37\xd8\x02\xde\x03\x3e\x01\xbe\x04\x5e\x07\xdf\x07\xdf\x6c\x6f\x81\x3f\xf8\x41\xfb\x87\xe7\xbf\xfb\x9d\x6f\x7f\xf5\x95\x2f\x7f\xe1\xd9\x4f\x7d\xf2\xe2\xd0\xef\x7f\xe7\xdb\x9f\x7e\xec\xee\x3b\x6e\x3f\x7f\x68\xe7\xf6\x8d\xf3\x95\x9c\x1b\xbc\xf4\x22\xf9\xcc\x5d\xcc\xc8\x67\x88\x1e\x4f\x70\xe4\xab\xde\x69\xa6\x5a\x65\x66\x65\xf6\xa3\x1f\x66\xd8\xc7\x1e\x79\x14\x53\x7f\xca\x4e\x45\xb5\xc0\xae\xeb\xa7\xe3\xfb\xae\xbb\xf1\xd4\x59\x78\x68\x65\xe7\x48\xab\xd8\x19\x81\x34\x5b\xa5\xe6\x00\xa4\xd9\x2f\x72\x5e\x9d\x87\x74\xbe\x9d\xa2\xbf\xf6\x2c\xcd\x21\xf0\x83\x5e\xb3\xf9\x81\x59\xb4\xd5\x0c\x35\xeb\x54\x96\x54\xaa\x9a\xdd\xa4\xba\x1a\x4b\x9a\x81\xab\x5b\x05\x84\xa0\x6a\x84\xfc\x46\x97\x91\xa1\x1d\x3a\xad\x33\x8a\xde\x1d\xcf\x35\x1d\xbb\x83\x0e\x3b\x23\x90\x06\xf0\x37\x8a\x89\x0e\xa7\x9b\x85\x2b\x13\x68\x9d\xef\x52\xb5\xd1\x99\x91\xec\xce\x61\x34\x30\x4b\xcd\x61\x96\x15\xbb\x63\xb5\x6e\x09\xa2\x2a\xac\x66\x9e\xbd\xde\xd4\x1b\x83\x66\xe4\x94\x54\xb3\x2e\xd1\xf4\xa4\x62\x5e\x49\x18\x75\x80\x0d\x85\xb7\x26\x02\x1c\x97\xae\x43\x54\x74\xba\xb2\x01\x6f\x33\x69\x2f\xb4\xde\xc3\x5b\x7f\x67\x6d\x8a\x12\x16\x1b\x20\x13\xd9\x12\xb2\x13\xe1\xff\x79\xb1\x98\x24\x98\x09\x25\x36\x95\xcb\xe3\xce\xbc\x3f\x32\x3c\x16\xd2\x4e\x3f\xb7\x34\x88\x21\x65\x62\x43\xb7\xca\xb9\x67\x56\xb7\xc4\xc0\x88\xd5\x8a\x10\x29\x72\xe9\xf5\x1f\xb1\x7f\x7d\x2a\x4a\x29\xc4\x75\x2e\xba\xed\x35\x81\x61\xb2\x99\xe5\xac\x2b\x1e\x6a\xb1\x0c\x9f\x2f\x6e\x87\xbc\x93\x41\x3c\xb6\x58\x59\x0e\x59\xd3\x0b\x9c\x18\xed\xc3\xa4\x24\xeb\x1e\xc7\x5f\x63\xca\x30\x14\x23\x5c\xd2\x19\x96\x61\x28\xec\xb7\xbc\x1f\x4a\xc8\xe6\xe2\x08\xc3\x48\xd4\xe2\x7d\x39\x66\x67\xb8\x18\xbc\x3e\x54\x40\x68\x38\xcd\xf1\xfd\x2a\x4b\x98\x44\x34\xff\x52\x21\x87\xb9\x8f\x7c\x9d\xe2\x3c\xc7\x07\x58\xf7\xbc\xa8\x78\x05\x01\xad\x6f\x57\x9e\x24\xb8\xbf\xbc\xa3\xb4\xa7\xd2\x76\xf2\x08\x61\xd6\xab\xe6\x02\xc8\x82\xd0\xc0\xd0\x07\xa3\x69\x69\x9d\x34\x9b\x69\x42\x88\x49\x36\xb6\xb5\x7a\xea\xb9\x80\x7e\x31\xe8\xbf\x6e\x20\x12\x28\xb6\x32\xab\xb5\xb1\xa9\xf0\x23\xa3\x62\xb8\x8f\x47\x18\x5a\x18\x8b\xa7\xc0\x20\x26\x22\x41\x96\x1f\x4d\xe6\xe5\x86\xdd\x6e\xa5\x8c\xd5\x9a\x87\x98\x47\x08\x12\x2a\x46\xff\x14\x21\x88\x6c\x54\x48\x0e\x1b\x0b\x9e\x71\xac\x96\xf0\xfa\x64\x46\x73\x71\x04\xf1\x1e\x96\xa3\x2e\xbb\x5d\xe0\xf9\x0e\xd3\xf4\x22\xde\x88\x5e\x06\x1c\x08\x83\x29\x30\x07\x3e\xd4\x1e\x81\xf3\xf3\xed\x85\xe4\xf4\xf8\x60\xb1\x90\x0b\xb8\xe8\xaa\xd9\xa1\xc1\xfe\x64\xc0\x45\x00\x05\xbc\x2c\x8a\x32\xa1\xbc\xcf\xe3\xf1\xad\x9a\x65\x3d\xb2\x4a\x00\xa2\x16\xbe\x5a\xae\x0f\xc1\x7e\x98\x84\x2b\x49\xd9\x40\x2a\x2d\x73\xbb\x94\xb9\x73\xe3\xea\x5e\x8d\x6b\xc4\xcd\xb7\xd5\xbf\xfd\x60\xbe\xd7\xda\xe7\x4d\x6b\x2f\x35\x1b\xaa\x9e\xb4\x43\x55\x5f\x69\x2d\x89\xe6\xde\x0a\x45\x34\x73\x72\xd7\xb6\x55\xd3\x16\x69\xd6\x00\x7b\x49\x5d\xa3\xf8\x2a\x2d\xd1\x50\x2b\xaa\x82\x15\x55\x6b\xc0\xd0\x96\xc1\x80\xbf\xed\x68\x7e\xbd\x35\x30\xd8\x4a\x6d\x98\x88\xdf\x7b\x2e\x12\xe7\x79\x51\xbc\x7d\xe3\x21\xdb\xfe\xf1\x51\x07\xcb\xf1\xa5\x5d\x23\x1f\x38\x94\xd5\x67\x58\x6a\x17\x44\x9b\xd5\x6a\x4f\xec\x5f\x77\x8b\xbf\x2e\xa5\xf3\x07\xb6\xa6\x0b\x43\xd3\xf1\xe8\x83\xaa\xb4\xc9\x09\x2b\x10\xc2\xb9\x47\x12\x8f\xed\x87\x10\x32\x5b\xaf\x77\xda\x1e\x81\xbb\xb6\x6d\x80\xda\xe5\x1f\xfd\xe8\x18\x56\xd7\x6d\x43\x10\x0b\x75\xd5\x7f\xf3\x4f\x37\x1d\xfc\x0e\x72\xc7\x21\x84\x07\x2e\xbf\xf1\x93\xdb\x2c\x4e\xb5\xe8\x92\x4e\x6e\xc0\x10\x0d\xc3\x7a\xb3\x99\x30\x99\x88\xff\x8e\xc2\xe8\x0d\xe0\x04\x01\x50\x01\x1b\xc1\x7e\x70\x0b\xf8\x44\x7b\xc6\xcc\x67\xfd\x67\x97\x37\x2c\xd6\xa3\x41\x97\x03\x9d\x5d\xde\xb6\xb4\xb8\x76\xf5\xfc\xd8\x70\xbf\x91\xf1\x55\x17\xba\x99\x1c\x3f\x71\x9c\x84\x59\x92\xcb\xec\xdb\xc4\xee\xbc\xf1\x14\x7b\xe4\xf0\x41\x7c\x00\x50\x99\xd0\xf2\x12\x5c\x0b\xe7\x31\x9c\xbf\xaa\x18\x23\x28\xa9\x66\x54\x32\x77\xb5\xbd\x03\x9f\x0f\xde\x16\x85\xe6\xaf\x91\xbc\x44\x23\x9d\x28\x1d\x2e\xd7\x6c\x15\xe1\x6e\x8c\x31\x1e\x63\x93\x02\x26\x2b\x7d\x22\xd6\x0e\x59\xaa\xe9\x57\x9f\x2f\xc2\xc6\xd5\xfd\x06\x1d\x08\xc1\x76\xb8\xc5\x4e\xc5\x49\x93\x2b\x7b\x5e\x92\xd5\x8a\x5a\x0d\x43\x25\x08\x25\xaa\xc5\xca\x7a\x55\x4f\x2a\x5f\x10\x07\x17\xb5\x3e\x48\x06\x25\x77\xc0\x1f\x18\x54\x59\x7d\x6a\x81\x67\x12\x9e\xd3\x81\x33\xa3\x2c\xb7\x70\x1d\x9c\xe6\xf9\x84\x94\xd9\x4d\x11\x82\x65\x4d\x0f\x7c\xe8\x67\xde\x72\x22\x28\x63\x24\xba\xcb\x96\x9c\x83\x20\x18\xe4\x31\x55\x52\xc7\xbf\x70\x68\x23\xc7\xaf\x6a\x08\xb6\x1b\xde\x93\x70\x8b\x1e\x4c\x98\x72\x22\x29\x89\x1c\x72\x45\xa3\x16\x81\x32\x02\xef\x44\x85\x88\x5f\xe3\x21\x97\x81\xf3\x27\x8e\x39\x30\x53\xd7\x38\x76\x41\xe1\x10\x82\x10\xba\x37\x9d\xc2\x10\xee\xa8\x2a\x76\x17\xb9\xf4\xf9\xe7\xbe\xf5\x8d\xcf\x8d\xdb\xe6\x67\xa7\x92\x6e\xf7\x83\xc1\x84\x56\x26\x18\x4e\x20\x0c\x55\x4f\xda\xbb\x6d\x43\x52\x49\xec\x0d\x25\x62\x0a\x85\x36\x39\xc0\xb0\xf3\xaf\xfc\xde\x8f\xbe\xe4\x0d\x85\xca\xd0\x85\xac\x7c\x20\xde\xc4\x18\xe2\xd2\x36\x04\xe1\x6f\x20\x41\x94\xb3\x47\xcb\x30\xb5\x96\x98\xa8\xef\x4f\xd1\xad\xe8\xab\x20\x05\x36\x81\x1b\xda\x05\xb8\x79\x73\x7b\x4b\x7a\xb8\x55\x29\xe5\xb3\x9a\x38\x3f\x39\xde\x6e\xa4\x13\x2e\x96\x21\xfe\xa0\x9f\xc1\x32\xeb\xb0\xa9\xac\x25\x4a\x93\x33\x69\x78\x45\xf3\xc5\x6e\x36\xea\x34\x70\x5a\x6f\xd3\xf3\x15\x2d\x6f\xee\xd5\xf2\x66\x13\xa2\x14\x60\x52\x4f\x36\xba\x0c\x53\xa9\x5a\x31\xf0\x8a\x01\x32\x56\x08\x24\x23\x01\xa9\x34\xa9\x33\x66\x8d\x5a\x84\x2b\x5d\xc5\x46\xb3\x51\xad\xa8\x8d\x66\x4c\xd7\x8c\xff\x58\xf2\x96\x74\xa2\xfc\xc3\xf5\xbb\x2d\x90\x47\x88\x19\x98\xfa\xa1\x96\x5d\xad\xe4\x6d\xfe\xe6\x1a\x49\xbe\x67\xac\x4e\x20\xc4\x23\xfd\x77\xad\x5b\xe3\x74\x36\xb3\x37\xc1\xc1\xa2\xdb\xe2\xe3\x19\x61\xe3\xba\x13\x43\x21\x44\x46\xfb\xce\xc9\xe2\x6c\xd3\x16\x61\x83\x2c\x63\xa5\x77\xb9\x2e\xff\xdd\xb6\x3a\xc6\x54\xc8\xd8\xa2\x1b\xef\xff\xec\xb0\x63\x7e\x8d\x70\x3e\x14\xbd\xbb\xd0\x74\x13\x48\xbc\x8b\x11\x64\xad\x65\x36\x3b\xa3\xb7\x37\xab\x1c\x29\xce\xc4\x59\x88\x36\xaf\x99\x60\x05\x59\xc9\x37\x30\x53\x28\x2d\xdc\xd4\x57\x71\xe2\x54\xdf\x06\x6c\xf7\x11\xc8\x4f\x94\x0e\x04\xa7\x77\xe4\xd7\xa5\xdc\xa1\xa2\xe4\x35\xa3\xe4\xf7\xd1\xd3\xe8\x0d\xe0\x00\x1a\x18\x07\x8b\xe0\x4c\xbb\x0a\xd7\xad\x6b\x2f\xa5\xe6\x5b\x92\x93\xa2\xf9\x19\x73\xae\x2a\x65\xac\x57\x91\x09\x2b\xf1\x11\xe2\x5e\xcd\xc6\x00\xab\xcc\xd0\xd8\x30\x1c\x80\x0d\x7c\xa5\x81\xd6\x71\xc0\x6b\x72\x82\x6f\x1d\x1b\x69\x80\x75\xbd\x8a\x58\x67\x86\xc1\x8e\x93\x34\x56\x68\x1e\x73\xae\xbb\xb7\xe1\x4e\x59\xca\x98\xd3\x20\x66\x46\x5e\x99\x17\xe9\xec\x3a\xec\xfa\x92\x89\x33\x0d\xcc\xae\x18\xd9\x1c\x9e\x3e\xb9\x9c\x62\x98\xc8\xaa\xed\x07\x8a\x29\x06\x59\x63\x97\xe7\xe6\x6f\xb8\xff\x67\xff\x7f\x1e\x43\xa4\x58\xa4\xf8\x64\x7a\xcd\x93\x70\xe7\x4c\x36\x0c\x21\x11\x18\xaf\xcd\x0d\x73\xa7\xa7\x5f\xd9\xb8\x7c\xfb\x66\xb7\xc6\xab\x6b\x37\x37\x76\xef\x2f\x0b\xcf\x57\x1b\x22\x14\x5b\xe7\xe2\xd9\x18\x9a\x82\xbe\x33\xb7\xdf\x76\xd6\x49\x98\x76\xe3\x68\x21\x7f\xfe\xd2\xd7\x1e\x7d\xfe\x2f\x5f\x99\x62\x98\xd7\xa6\xf5\x73\xfd\x41\x25\x65\xe3\xa8\x35\xcb\x27\x8b\x33\xda\xf6\x33\xad\xa6\xc7\xc5\x2c\x08\x44\xb4\xd6\xbf\xf5\x37\xaf\x3c\xc5\xda\x94\x64\xc0\xc6\x63\x0c\x8f\xfc\x54\xc0\xec\xbe\xdd\x7b\xf6\x09\xc4\xdb\x32\xed\xff\x05\x94\x45\x6f\x80\x04\xd8\x09\xbe\xd8\x5e\x82\xbb\x76\xb5\x77\x17\xb6\x6c\x5a\x5a\x98\x9d\x9e\x1c\xeb\xcb\xa5\x62\x21\x55\x20\x60\xc7\xb6\x4d\x1b\x96\x4c\xd2\x7d\xa4\xaf\x60\x4e\xb2\x19\x47\x45\xa7\x9b\xc4\x87\xd8\xc6\x08\x1b\x59\xc3\x8a\x1c\xbb\x01\xd9\xa9\x28\x52\xa7\x97\x46\xb6\xe1\x02\xcc\x40\x1d\xc2\x6d\x57\xb4\xd3\x55\x4f\x97\x8d\x2b\x76\x20\xff\xb5\x50\xfe\xbb\xf4\xc7\xb6\x81\x5d\xbd\xaa\xdb\xd5\x19\x6e\xeb\xd0\xe8\x2c\x35\x09\xf5\x2e\xe5\x2e\x99\x44\x85\x12\x86\x86\x3b\x35\x8c\x90\xd9\xe5\x2e\xba\x31\xd1\x38\x3a\xd2\x29\x3c\x87\x8c\xe8\x59\x33\x19\x77\x3d\xd9\x41\x61\x66\x76\xeb\x04\x4e\xf1\xba\xf3\x67\x4f\x50\x69\x66\xf5\xea\x79\x37\x53\xcf\x44\x46\xe0\xc8\x6d\x8e\xc9\x99\xe9\x09\xc4\x5a\xd7\x6f\xbd\x70\x62\x88\x65\x5b\x51\x89\x71\xdc\x7c\xf7\xc5\x43\x61\xb7\xcf\x27\x90\xc5\xa5\x50\x08\x43\x54\x2a\x96\x8a\x48\xb6\x58\x49\x26\xec\x2d\x21\xc6\xef\xbb\x75\xd9\xa1\x6a\x0a\x67\xbd\xe5\xc2\x7b\xf7\xcd\x73\x3c\xfa\x8b\x71\x4a\x0a\x8e\x59\x3f\x21\xe2\xae\xdd\x14\x62\x97\x5b\x43\x47\x0f\xb9\x30\x52\x64\x29\x15\x1b\x7c\xe9\xd5\xd7\x2e\x7d\x5b\xe4\xa5\x54\x8d\xe5\xa6\xc7\xab\x4e\x3e\x2e\xfb\x70\x34\x32\x86\x20\x24\x5e\x6f\x05\x21\x77\x8c\x42\x94\x58\x85\x2b\xc3\x03\x0a\x2f\xa5\xfb\x38\x6e\xee\xcb\xdf\xfb\x89\xa9\xd3\x3f\x40\x56\xf4\x06\x08\x82\x59\xf0\x68\x7b\x14\xae\x5a\xd5\x9e\x9b\x9a\xea\x6f\xd6\x2b\xa5\x54\x24\x14\x90\x5d\xb6\x99\xa9\xb6\x39\x18\x9b\xe9\xcc\xfe\xc8\x2e\x1b\x61\x29\x71\x0c\xb2\xed\x31\x73\xaf\x16\xf1\xd1\x19\xd1\xd0\x5f\xcf\xa4\xb6\x81\x3c\x56\x34\x78\xad\x21\x98\x77\x22\xe2\x62\x60\x55\xaf\xce\x56\x5d\x1d\x48\xec\xe8\x89\xb2\xdd\x61\xee\xee\xec\x5a\x52\x49\x74\x45\x7f\xd5\xb5\xaa\x15\x43\x4d\xa6\x96\xba\xad\x93\x15\x35\x7d\xb6\x58\x2a\x96\xf0\xf0\xf9\xd0\x40\x72\x88\x65\xa7\x96\xcf\xdf\x72\x8c\xa5\xb6\xe9\xd5\x0b\x73\x22\x9c\x3c\x7b\xe1\x81\x3d\xf3\x1c\x3f\xe6\x8a\x33\x8e\xa1\x79\x27\x63\xbe\x56\x52\x50\x3c\x91\x88\x23\x88\x7d\xbe\xf3\xbb\x6c\x9e\x98\xcc\xc2\xc7\x08\x71\x89\x1a\x7e\xfc\x2e\xb7\xfc\xd2\xab\xaf\x3d\x67\x28\x46\x91\x33\x41\x42\xc4\xad\x7f\xd0\x95\xeb\x8b\x16\x97\x94\x0a\xd8\x2e\x3c\x06\x19\xaf\xa7\x82\x55\x3f\x03\x07\x82\x01\x54\x29\x4d\x2a\xbc\xd4\x61\x9f\xfe\x19\xdd\x87\x5e\x00\x0d\x70\x1f\x78\xa9\xbd\x64\xf6\x39\xfa\xef\xb9\xfb\xe8\xe1\x83\x7b\x97\x77\x6d\xdb\x02\x6e\xbe\x69\xef\xf2\xb6\x2d\x1b\x26\xfa\xeb\xb9\x58\x48\xb2\x1d\xdc\x77\x80\xdc\xe6\x26\x3e\xc5\x73\xe2\x7a\x72\x1b\x4b\x49\xea\x0e\xd6\x71\xe2\x24\x7b\x4b\x28\xe0\x76\x3a\x18\x1f\xab\x20\x5a\x2a\xf3\x34\x3e\xb2\xb8\xe6\xbe\x8b\x4d\x04\x27\x56\x88\x3e\xa3\xfe\xe9\x6c\xfe\xba\xa4\xb6\xcc\x9c\x03\xcd\x5d\x61\x26\x22\x74\xbe\xdd\xa9\xae\x31\xb1\x32\x71\x8d\x4e\x08\x34\x01\x60\x10\x4a\xe6\x2e\x30\x3d\xa9\xc5\xd8\x5a\xb2\x62\x8e\x8c\x1a\xc0\xc0\xac\x61\xb4\x98\x51\x2e\x77\x32\x50\xc7\x7b\x28\xdb\xd9\xa2\xa8\x27\x3b\xe0\x51\xed\x66\xa1\x30\xec\xb4\x47\x6a\xa6\x2a\x75\x73\x7b\x6f\xad\x49\x93\x4a\xd0\x78\xa2\x2a\xa9\x12\x5b\xe9\xcc\xad\x28\xe6\x66\xaf\x4e\x43\x44\x51\xab\x8a\x5a\x45\xae\xfc\xa7\x4e\xd7\x46\xfe\xbe\x91\x2c\x11\x66\xb9\xea\xf5\xc2\xdf\xbf\x1e\xc2\x60\x42\x08\x0a\xf8\x6f\x5f\x9d\xa8\x11\x02\x71\x7c\xfc\xc2\xd4\xe2\xd6\xbd\x5e\xbf\x23\x5c\xe6\x7c\xe1\xeb\x9a\x37\x4c\x5f\x9c\x88\x63\x48\x11\x53\x10\xd4\xf9\x87\xe6\x33\x75\xbd\x59\x85\x01\xce\xee\x0c\x73\x50\xb0\x08\x02\x7a\xe6\x19\x68\xb1\x08\x56\x08\x03\x7e\xbf\xdf\xaf\x32\x9b\xf3\xfb\xda\x5e\xc2\x2d\x9f\xdb\x5d\x45\x18\xbb\x1c\x3c\xfc\xe5\x11\x06\xeb\x85\xa3\xe5\xff\x23\xfb\xcb\x4d\x0f\xf4\x56\x78\x45\x96\x65\x98\xad\x89\xd6\x5b\x9a\xc3\x77\x07\xa6\x87\xe3\x73\x99\x06\x83\xb0\xc5\xb6\xc1\x73\x38\x58\xf3\xe6\xa7\x5c\x88\xc3\x4c\x2d\xbb\x68\xf9\x80\x36\x73\x63\x55\x51\xcb\x3c\x83\x31\xb2\xdb\x86\xa2\xb3\x1e\x19\x32\xbb\xdc\x10\xa2\x60\xc0\x86\x3d\x9e\x02\x84\xd0\x6a\xb3\xda\x20\xa4\x02\x4c\x97\x0a\xf5\xf1\xdb\x0e\x71\xb4\x88\x19\x29\xd8\x99\xce\x43\xbf\x46\x6f\x80\x10\x58\x03\xee\x68\x37\xe1\xda\xb5\xed\xc5\xc4\xfc\x44\xad\x90\x4b\xfb\x55\x0b\x3b\x35\x31\xd6\x1e\x2e\xe4\xd2\xc9\x84\xf1\x88\x27\x5e\x40\xbc\x22\x05\x18\x40\xea\x9a\x82\x63\x70\x18\x27\x20\x1c\xee\x8d\xb5\xad\x8e\x5d\xfc\x36\x02\x7d\x3b\xfa\x1c\x06\x6b\x7b\x6d\x61\xad\x69\x0b\x86\x1b\x9a\xd9\xac\x9b\x05\xcd\xbd\xd7\x8d\xce\xfc\x70\x97\xbe\xeb\x4c\xf3\x5d\x99\x45\xeb\x6e\xd9\x7b\x7b\x5a\x34\xd4\x0a\x2f\x7f\x6c\x61\x01\x37\x4a\x85\xd9\xa3\xa9\xd1\x3e\xfb\xfa\xb9\xa9\x4d\xd6\x42\x75\x70\xd7\x70\xa6\x91\x4b\xf8\x83\xbc\x6b\x73\xf1\x46\x8e\xdb\x1d\xb0\x39\x2d\xca\xd4\x64\xce\x3a\xda\x1e\x19\xa3\x41\xb7\x2e\x58\x67\x5a\x67\xd6\x89\x1a\x2f\xaf\x1a\x2c\x33\x99\xf5\x73\x15\x16\xee\x43\x10\x3d\xff\x90\xcd\xfd\xd8\x73\x7f\xf1\x15\x59\xbe\xfb\x82\x05\xb2\xa7\xef\xb1\x28\x2f\xfc\xe4\x53\x0f\x38\xb9\xf7\x3c\x48\x58\x31\xe9\xf5\x3c\xf5\xb3\x3f\x78\xc9\x4a\x89\x9c\xf6\xdb\x6e\x3f\x47\xc9\xc6\x23\x58\x88\xf8\xa5\xe8\xb7\xff\xf6\xcb\x4f\xb2\x0e\x25\xe5\xb3\x3c\xfc\x94\x51\xfd\x7e\xa8\x23\x79\xf0\x6d\x13\x83\x24\xc1\xe9\x76\x11\xa6\x52\xed\xb4\x27\x16\x09\x05\x14\xc9\x6d\x15\x38\x82\x80\x1e\x8f\x84\x02\x66\x73\xc2\x0a\x28\xb1\x13\x8e\xd8\xe3\xd8\x03\x9d\x10\xc6\xaf\x48\xfc\xed\xd3\x3b\xd7\x0c\x86\x71\x90\xea\x15\x76\xaa\x67\x3a\x5b\x52\xaf\xa6\xaa\x4e\xf6\xea\xde\x17\x62\x25\x13\x39\x82\x55\x9b\x85\x42\x46\x10\xe2\x09\x17\x84\x01\x4f\x18\xc9\x52\x23\x1e\x96\x03\x01\x2c\x4b\xc3\xfe\x20\xc6\xe8\x27\x83\xe4\x9e\xcf\x3c\x73\x3f\x29\xbf\xf0\xfc\xf3\x97\x7e\x9a\x12\x7d\x01\x2b\xa6\xb3\xdf\xfc\xfa\xef\xbd\x5a\x74\x89\x71\x0b\x66\xe7\xbf\xf3\xda\x6b\x9d\x68\xf5\x7f\xe1\xc3\xe8\x07\x20\x00\xda\x26\x57\x3e\x3a\xda\x1e\x4b\x35\x6a\x99\x94\x28\x70\xa4\x35\xd0\x57\xe9\x4c\xac\x7b\x45\xea\xb0\x11\x39\x17\x0a\xae\xdc\xe3\xa1\xd8\x2a\xbe\x2d\xfa\xff\x36\xd4\xed\x03\xa3\xbd\x9f\x72\xd4\x84\xba\x6c\xcc\x30\x91\x46\x53\x69\x0e\xc3\x2e\x86\x35\x31\xab\x2c\xb1\x54\xad\x76\x79\xb6\xde\xa1\x65\x73\x78\xad\x3b\x27\xaa\x86\xe0\x1f\x37\xad\x55\x5b\xd6\x2f\x67\xa3\x03\x9e\x18\xc6\x08\xda\xab\x7d\x65\x2b\xa2\x8e\x3e\x9e\x65\x39\xc4\xb0\x1a\x4b\x8b\x6a\x94\xb1\x8c\x4d\xf1\x08\x21\x58\xc8\xe7\x1a\x5e\x97\x1f\xb1\x7a\x4d\xf8\x7c\x3f\x83\x95\x60\x5f\x9a\xe2\x98\x7a\xf6\xcc\xd9\xb3\x8c\xff\x85\xaf\xed\xd8\xce\xf3\x0e\x7b\x74\x1d\xc1\x2c\x0e\xfb\x3e\xfc\xe9\x27\x3f\xe6\x12\xa5\x94\xc6\x9d\xbe\xf3\x63\x5b\x0b\x04\x67\xc7\xd2\x2e\x4a\xa8\x97\x85\xce\xee\xf4\x2c\xfa\x43\xd3\x3f\x67\xc1\x8d\xed\xa2\x99\x53\xfb\x26\xda\xc3\xad\xa2\x1e\x0c\xf8\x14\x87\x85\x22\xf3\x36\x19\x29\x3d\xa1\x45\x7d\x1e\xc5\xc2\xd3\x3e\x98\x82\x09\x18\xc5\x30\x7a\xd5\x2f\xff\xa3\x16\x4d\x57\x80\xd1\x6b\xe6\x4c\x73\x74\x94\xed\x6e\x49\x34\xfc\xd3\xc8\x97\x46\xa8\x0e\xc3\x6a\x67\x2b\x88\xb9\x13\xa4\xc3\x59\x36\x3b\x41\xd8\x74\xd3\xab\x42\x35\xfd\xf3\xd6\x8a\x63\xf9\x63\xeb\x27\x7f\x77\xeb\xdc\x4f\xee\x5e\x1c\xfa\xf0\x0d\xb8\x4c\x6d\x90\x19\x5f\xe0\xb9\x1d\x76\x0b\x14\x47\x5b\x93\x37\xac\xae\x0b\xee\xc1\x2a\x62\x1d\x59\xdc\x2c\x85\xd7\x40\x5f\x79\xff\xb6\x7f\x79\xfa\xf4\xdf\x8c\xd7\x23\x43\x47\x37\x2f\x5c\x10\x1c\x61\x1f\x45\x5f\xba\x70\xf1\xd8\xed\x9c\xfc\xc8\xc2\xdc\x3f\xde\xea\x21\xef\xfb\xc8\x17\x1e\x80\x0c\x81\x9e\xcf\xbf\xfe\x8d\x67\x59\x4e\x10\x1c\xa9\x6f\xfc\xe2\x95\x4f\xa8\xfe\x98\x6c\x21\x90\x3c\x7e\xdb\x58\x39\xb8\x1a\xca\x19\x31\xff\xbf\xbe\x7d\xe2\xaf\x42\x82\xaf\x9e\x60\x06\xce\x4d\x8c\x93\x95\xfc\xf9\x02\x02\xe8\x0d\x20\x82\x2a\x38\xd2\xce\xc2\x5a\xad\x5d\x0f\xe8\x71\x9f\xe2\xb4\x52\x50\x29\xa5\xf4\x80\x47\x91\x8c\x35\x21\x6e\x8e\xda\x4b\x38\x00\x3d\x50\x82\xb0\xd4\x1b\xf5\xe0\x35\x81\xff\x15\xb9\x96\x40\xad\x57\xae\xb5\x15\xfc\x28\x77\xe1\x62\xb7\x53\xd1\x45\x8b\x06\xea\xb8\x8a\x16\x7b\xab\x69\x71\xac\xa0\xd9\x07\x46\x47\xfb\x38\xeb\xd6\x7d\xd7\x6d\xe8\x67\xd9\x7e\x77\x9c\xd8\x77\xec\x7b\xe4\xa8\xdb\x1f\x50\x09\x37\xb9\x46\x92\x59\x84\x78\x5d\xc6\x74\xed\xe0\x0c\xcb\xa1\x3f\xcf\x59\x9e\xfd\xfc\xa1\x43\x36\x84\xc4\x54\x3a\xc1\x72\x95\x2f\xbe\xf2\xd5\x4b\xbf\x27\x88\x52\x32\xb7\x36\xb5\xda\x25\x88\x09\x0f\xbc\xe3\xe8\xd1\xbb\x08\x23\x26\xa4\xea\x57\xbf\xf3\xdd\xae\xd5\xe1\xbf\xc3\x3c\xc8\x80\x5d\xe0\xa1\xf6\x88\x39\x59\x5f\xde\xb9\x7d\xeb\xe6\x8d\x1b\x96\x16\xe7\x5a\x8d\x7a\x22\xea\x17\x6d\x3c\x0b\x16\xe6\x66\xa7\x27\xfb\x1a\xf5\x6a\x39\x11\x55\x45\x1b\x70\x10\x39\x4d\xb4\x05\x38\x0b\x27\x71\x1f\x2e\x43\x15\xc3\xc9\xab\x72\x32\xc3\xd5\xdb\xc7\x26\xde\x6d\xab\xd2\xe4\x35\x66\xed\xa1\x69\x80\x15\xb6\xa4\xad\x04\xfd\x2b\x19\x43\x6c\xf4\xe6\x8b\x7a\x4d\xec\x66\x0c\x57\xad\x3b\x8a\x86\xd1\x4a\x15\xd5\x93\x2c\x92\x8a\x6a\x8e\x42\x57\xca\x0d\xb5\xd1\xa4\xe8\x8f\x4a\x53\x35\x55\xb3\xe6\xa2\xe2\x42\x7f\x53\x5a\xad\x0d\x2f\xbf\x2f\x3b\xfc\x95\x4f\x6e\x1f\xd8\x79\x30\x3a\x7c\xd7\x56\x6d\x66\xb8\xdf\xad\x5b\xbd\x7d\xdb\x9e\x39\xd5\xef\x73\x95\x27\x5f\xfc\xc4\xc5\x3b\x05\x47\xc4\xe1\x5e\x5b\xfc\xf8\x31\x77\x0c\x27\x8a\xdb\xf7\x30\xa9\x6d\x94\xda\xad\x72\xd6\xe7\x4a\x6f\xc6\xf0\xd7\xd3\x8f\x9c\xa8\x0c\xc2\xe4\x6b\x0f\xae\x59\x5c\x7a\xf6\x61\x5e\x7c\xf4\x6b\xbf\xf8\xb2\xe8\x7e\xe1\xf2\x53\xaf\x6c\xff\xf0\x36\x2a\x7d\xe1\xaf\x9e\x7b\x88\x73\xde\xf6\xf1\xad\x97\xef\xc0\xac\x94\xb4\x44\x3e\x0d\xd1\x0f\x9e\x14\xd3\xaa\xcb\xfe\xc9\xcb\x5f\x84\x91\xfb\x11\x8e\xb9\x9c\x3e\xf1\xbf\xfd\xeb\xf7\x3e\x4a\x2d\x6c\xd3\x26\x7d\xe5\x87\x87\x7e\x8c\xdc\x31\x88\x0e\xff\xf4\xfd\x1d\x9d\x3d\x85\xfb\x31\x05\x01\x30\x06\xee\x6e\xf7\xc3\xf1\xf1\xf6\x44\xa4\xbf\x90\xd2\xe3\x1e\xc9\x4e\xc1\xe8\x60\x7f\xb3\x5e\x2d\x98\xdb\x84\x3c\x92\x5d\xa0\x20\x47\x46\x9c\x44\x41\x0c\x17\x19\x45\x83\xb0\x09\xab\x58\xc0\xb0\xda\xa3\xad\xe2\x3b\x8e\xb9\xbc\x3d\x9b\x57\xc1\x78\xaf\x9e\xc6\x3b\x16\xde\xa3\x1a\xd0\x69\x5b\xac\x8c\xe6\x27\xa1\x51\x23\x5d\x1d\x01\x35\x15\x96\x78\x8b\x56\xea\xb5\x24\x78\x45\x69\x04\x06\x57\xdd\x64\x71\xc3\xe1\x1f\x71\x63\x43\x99\x4d\x1c\xb7\xda\x61\x39\x73\x1f\xdc\x6d\xb5\xa8\x17\x37\xb9\x12\x82\x32\xda\x9e\x64\x6e\x39\x7f\xf9\x5f\x1d\x91\x0b\x8b\x5c\x96\x53\xb4\x6d\x43\x14\x16\x90\x6b\x79\xcf\xc7\x1f\x66\xa5\x0f\x3f\xff\xd7\xdf\x26\x96\xcb\x3f\xfb\x65\xbb\xfd\xb5\x4f\xd9\xdd\x4f\xbd\xf6\xcd\xa7\x10\x73\xf0\xe1\xcb\xcf\x12\x46\xf8\xf2\xaf\xbe\xf6\x34\x75\x2a\x69\xd5\xf1\xb9\x6f\x97\x6b\x8f\x9e\x7d\x93\x73\xfc\xe0\x1f\x5e\x7d\x02\x3b\xe5\xa4\x5d\x7e\xf2\xbf\x35\xfb\x2e\x3f\x67\x72\x05\x7f\x87\x5e\x42\x2f\x03\x17\x48\x83\x69\xb0\x11\xec\x6e\xeb\x70\xd3\xa6\xf6\xe6\x5c\x64\xa0\x90\x8b\xfb\x66\xc8\x5a\x27\xd1\x15\xc2\x71\xc4\x33\xcf\x2e\x11\x36\x64\x65\xdd\x8d\x29\x38\xd0\xdb\xcd\x2c\x76\x1b\x05\x2b\xc2\x04\x2b\x62\x1b\x00\x9b\x7a\xc5\xb6\xa9\xcb\x09\xe8\xc9\xee\xbd\x11\xcc\x72\xa3\x81\xe9\xd5\xed\x23\xcd\x86\x4a\xae\x6e\x20\xe9\x22\xdd\xee\x3b\x64\x49\xed\x21\x63\x70\xb7\x23\xd0\x1c\x86\xd5\x8a\xaa\xc0\xdf\x64\xb3\xc1\xd9\x8b\x8d\x2c\xc6\x24\xf0\x83\x73\xcd\x0a\x65\xff\xf9\x77\x57\x37\x30\x24\x04\x92\xc4\xf8\x85\x82\x0a\xd9\x82\x4c\x20\xc3\x78\x1a\x7b\xe2\x18\x42\x88\xaa\x42\x70\xe3\xeb\xdf\x5a\x9b\x24\x90\x10\x41\xb3\x06\x36\xfc\xf0\x1b\x7e\x5a\x69\xdc\x78\xb2\x4f\x42\xf8\xf0\xd9\xeb\x9b\x2a\x8a\x69\x02\x0b\x61\x3d\xbd\xbc\xd7\xfb\xc9\x91\xfe\xf3\xb7\x5d\x1e\xc1\xc3\x7d\x77\xdb\x37\x4e\x06\xe6\xf2\x2d\x82\x20\x39\x59\x9f\xc9\x6d\x5c\xd5\xb8\x95\x29\x2e\x06\x32\x62\xe9\xb5\x51\x5f\x70\x94\xe0\x89\xd2\x42\x4c\x0b\xe8\x07\xc3\x0b\xc5\x98\x34\xc4\x30\xf0\x9e\x9b\x9b\x2d\x08\x2b\xb9\xf9\xb3\x27\xcb\x45\x53\xea\x3f\x85\xff\x86\xde\x00\x56\x10\x01\x23\x60\x2d\x38\xd5\x2e\xc2\xc5\xc5\xf6\xba\xc4\x70\x3d\x2a\xbb\xc0\xea\x89\xbe\x7a\xb5\x5c\x4c\x78\x65\xd1\xc5\x83\x55\xec\x9a\xd5\x6d\x0b\x55\xc3\x94\x21\x7d\xb0\x0a\x8b\xf8\xea\xb6\xc9\x4e\xf5\x68\x94\x28\xd7\x6e\x26\x5f\xd9\x12\xb9\xd8\xab\x88\xc5\x95\x08\x3d\x08\x3b\xcc\x4c\xcc\x94\x66\xa3\x53\xa9\x5f\x91\x7f\x97\xf7\x34\x74\x60\xee\x56\x53\x7a\x6f\xeb\x53\xc1\x57\x06\x5d\x59\x5d\xd3\x93\xaa\xf2\xa8\x42\x82\x81\x01\xbf\x2a\x62\xe1\x78\x36\x83\x42\xfa\xd0\x30\xcb\xcd\x1e\x7b\xfa\x13\x04\xf9\x2c\xde\xd8\xf8\xe0\xfe\x63\x51\x2f\xc1\x12\x6f\x73\xa6\x0f\x7e\xf1\xf8\x12\xcb\x4d\x05\x7c\x02\xc3\xb6\xe7\x15\x14\xf4\x69\xc4\xe6\xc3\x10\x22\x2c\x3a\xfc\x52\x16\xd2\x82\x8a\xb6\x1e\xdf\x89\x60\x22\x1c\x5e\x63\xbb\xfc\xeb\x4f\x9d\xb6\x04\x9e\xfb\xfa\xb7\x3e\x3b\xbb\xad\x3d\x15\x8c\x64\x59\xd8\xa2\xb7\xed\xae\xa7\x7c\x3c\x25\x92\xb6\xf4\xd5\xd7\xbf\xff\x55\x97\x10\x72\x38\xfc\xf6\x87\x6e\x45\x90\x50\xca\xb1\x6c\x44\x0d\x30\xb0\x35\x8c\xba\x33\xe6\x8f\x61\x0b\xfa\x5d\x53\xde\x47\xc0\xbd\xe0\x91\x76\x1b\x5e\xbc\xd8\xbe\x6f\xdb\x9d\x77\x5c\xb8\xfd\xa6\xd3\x47\x37\x6d\xd0\xe3\x5e\xd5\x61\xb3\x9e\x3f\x77\xcb\x99\xfd\xcb\xbb\x76\x6e\x9b\x29\x45\x83\x92\x78\x72\xf8\x04\xb9\x67\x80\xf8\xfd\xa4\x95\x23\x94\x92\x02\x60\x1b\x63\x5b\x34\x08\x67\x7a\x7a\xad\x5d\xf3\x37\x37\x56\xbd\x5b\x9d\xd8\xab\x92\x19\x70\xb1\x57\x25\x17\x3b\xa1\xff\x2a\x47\x39\x02\x2b\xaa\xe1\x1e\xc9\xc6\x48\xa7\x2b\x66\x54\x88\x90\xb2\xc9\x2b\x7d\xb0\x2b\x1e\xb3\xa2\x06\x05\xeb\xe6\x48\x24\x95\x25\x65\xe5\x46\x09\x6a\xc5\x24\x3b\x1b\x4d\xbd\x08\x9b\x7a\xb2\x51\xaf\xad\xb0\xdf\x2b\xef\xeb\x4e\xa1\x18\x80\x50\x63\x3b\xd3\x79\x70\x43\xcd\x9b\x8d\x6c\xc7\xc8\xa5\xee\xaa\xe8\x16\x86\x21\x64\x32\xbe\x93\x77\x7a\x4a\xb5\x21\x16\xdd\x1d\x83\x36\x47\xf8\xf4\xe8\x89\xdf\x5d\x55\xb4\x32\x02\x26\x10\x17\x52\xeb\x47\xe7\xbf\xb3\xae\x9f\x65\x18\xd7\x90\xde\xac\x3f\x1b\x9f\x3d\x3e\x98\xe3\x88\xc0\x67\xf8\xc8\xcc\x45\x7e\xe4\xb6\x96\x7a\xab\x33\xa6\xca\x39\xec\x88\x54\x90\x28\xa8\xf2\x2f\x8e\x94\x1c\x18\x21\xbe\x1a\x1b\x93\xd3\x8e\x10\x72\xf8\x7d\x43\x76\x01\x6e\xab\xf9\x21\x41\xeb\x30\xa1\x76\xfd\xdc\xd4\xc2\xe1\xb0\x83\x40\x08\x59\xc7\x0e\xce\xe9\x69\x34\x4a\x0f\x7a\x3c\x8f\x06\xb9\x4b\xdf\xb4\xaa\xcb\x11\x88\x07\x8b\xab\x8b\x3b\xc5\x42\x5a\x5d\x9b\xd6\x6c\x02\xc2\xc3\x7d\x77\xec\xd6\x6e\x1a\x8a\xa0\x96\x68\x83\x98\xd6\xf4\x25\x65\xab\x5a\xd8\x39\xd7\x50\x42\x75\x16\x93\x80\x7b\xa7\xdd\xe7\x76\x27\xa1\xd5\x3f\x76\xb3\x25\x67\x79\x68\x38\x16\xe8\xdb\x81\x32\x11\x2d\x1a\xbf\x33\x1f\x9b\x11\xd3\xce\x30\xb4\x07\x58\x0e\x66\x9b\xeb\x7e\xde\xed\x37\xa1\x4f\xa3\x37\x80\x05\x24\xc0\x34\xd8\x0c\x1e\x6e\xb7\xcd\x69\xd9\xdc\x86\xc5\xa9\xd1\x62\x21\xa9\xc7\x24\xa7\x15\x6c\x18\x1b\x1d\x19\x1a\xac\x16\x72\xb1\x88\xcf\x23\x39\x29\xf0\x93\x29\x37\x59\x35\xb7\x8a\x4c\x09\x54\x89\x84\x29\x19\x83\x23\x70\x10\xe7\x20\x1c\x7c\x4b\x31\x59\xbc\xb2\x35\xe6\xdd\x72\xd0\x55\x9b\x19\xbc\xc6\x34\xac\xd8\xd3\xc1\x60\x95\x5e\x2f\x36\x79\x9f\x2c\xec\xde\x6a\xa3\x5b\x5b\x5e\xb9\x65\x8c\x7e\x85\x0d\xea\xdc\x4f\x46\x54\x82\xb0\xbb\xd7\xa5\x73\x82\x8f\x87\x88\xed\xd4\xb8\xc0\x78\x62\xb5\x0d\x56\xa6\x18\x9d\x58\xc5\x73\x9b\x2e\x7c\xf9\x11\x16\x21\xa4\xf4\xc9\xfe\x89\x0f\xde\x3c\xb0\xb0\x77\x37\x17\x75\xb8\x76\xec\xfc\xd2\xfb\x0a\x8b\x9a\x3b\x8f\x1d\xb9\xdd\x3f\x3e\xb7\x87\xe7\xd7\x45\x65\xdf\xcc\x54\x94\xd9\x5e\x81\x6e\xa7\x87\x66\x1c\x0a\xe6\x13\xee\x12\xda\x75\xd3\x7a\x88\xe1\xb6\x82\xc7\x43\xe8\x3f\x3d\xf1\x38\xe7\x7f\xf6\xf5\x6f\x3e\xbb\x6a\x87\xd3\x19\x3a\x90\x77\x7f\xed\x8c\xc4\x1f\x3c\x19\xb5\x3b\x9d\xe5\x17\xbe\x74\xf3\xc0\x74\xcb\x25\xb8\x75\x44\xd6\xbc\xf4\xfd\x9f\xbc\xec\xe0\x5a\x7e\xdb\xbd\xf7\xdd\x09\xef\x66\x79\x47\xd0\x2b\x31\x10\x42\x9c\x5a\xcb\x18\xd8\x00\xbf\xf9\x06\xfc\x33\xf4\x79\x50\x03\xb7\x9b\xf7\xd9\xbb\x70\xa1\x7d\xc7\xe0\x4d\xa7\x4f\x1e\xdd\xbf\x6f\xed\xea\x55\x9a\x9f\x3d\x73\x78\xff\xbe\x9d\xeb\xa7\x06\xd3\x51\x55\x26\x27\x4f\x90\xb2\x8d\x14\x2d\x14\x24\x68\x70\x6b\x73\x1d\x82\x3b\xdf\xb2\x67\xc9\x84\x05\xef\x50\x89\xf5\xe8\x62\x27\xb8\xd0\xab\x8b\x0b\x57\xb6\x27\x35\xcd\x5b\x53\xf5\x76\x8a\x9a\x57\xba\xcc\x2b\x8d\x88\xee\xa3\xce\xc8\xab\xd2\xa5\x86\x3a\x0c\x78\x11\xad\xbc\xfe\xea\x9d\xaa\xba\xcd\x0b\xd5\x28\xd8\x54\xcd\xac\x3f\xcc\x99\x74\xf3\xfe\x54\xcd\xee\x06\x03\x55\xf9\xd1\xb6\x6c\x8d\xd3\x45\x89\xcd\xc4\xfa\x4e\x31\x64\x72\x6e\x78\xdc\x87\x31\x42\x24\x3a\x72\xa8\x24\x27\x03\x4d\xea\x1f\xb0\x9c\xaa\xf8\xc2\x94\x5d\x6d\xbf\x69\xd2\x82\x50\xba\x5c\xd6\x6b\xcd\x68\xc4\x1c\x76\x95\xb4\x07\x38\x2b\x86\x24\x24\xe5\x43\x21\xc4\x30\x36\x11\xa3\xdd\xac\xee\xd0\x5b\xeb\xef\x28\x6b\x18\x5a\xdc\xfd\xf2\x9a\x03\xd0\x0d\x09\x44\x07\xc2\x31\x0e\x5a\x64\x1b\x69\x66\x20\xe2\x63\x91\xf1\x74\x03\xdb\x5d\x5b\x02\x76\x5b\x25\xe2\x67\x2c\x3b\x06\x23\x81\x88\x76\xce\x2a\x49\x8e\x8c\x55\x65\x30\x62\xac\xd6\x51\x51\x5b\xe3\xb6\x15\x07\x52\x34\x9b\x3c\x45\xa2\xb3\x41\xef\x18\xb2\x28\x45\x5f\xe3\x5c\x39\x2d\x36\x09\x15\x84\x84\xd3\xc1\x60\x2b\x56\x08\xf5\x84\xe0\xc4\xa4\x3b\x6a\x97\xdd\xd6\x9c\x7d\x60\xef\x60\x3e\x9e\x16\x90\x85\xdf\x46\x04\x59\x64\x59\x6a\x0b\xc6\xc3\x09\xd9\x5f\x90\x4a\x02\x35\xb1\xe1\x6f\xd0\x07\xd0\x1b\x40\x01\x83\xe0\xfa\x76\xd6\xbc\x53\x65\xdf\x40\x5f\x21\x97\x4e\x1a\x21\xdd\x82\xcc\xc2\xdb\x64\x79\x1c\x16\x24\x13\x02\x08\x29\xf9\x31\xf4\xf7\x6c\x12\xba\xd6\x4e\xcc\xdf\xd2\xb8\xff\x1a\x37\xa4\x4c\xe8\xac\x79\xdb\x8c\x9e\xc1\x73\x23\xfc\xc2\x9e\xa1\xf3\x4e\x1d\x54\x95\xa8\xdc\x25\xca\x57\xa6\xd7\xe0\x0d\xd5\xba\x0b\xba\xce\xae\x17\x19\xe7\xdd\x4f\x7c\xf4\xfd\x6e\xd7\xae\x13\x14\x0a\x1f\xf9\xd4\x73\xf7\x48\x31\x57\x94\xe5\x5b\x6b\x05\x39\x67\xc7\xe1\x94\xa7\x14\xc1\xc4\x7e\x70\xc9\xed\xd7\x64\x6b\x1b\x32\xf7\xdf\x7e\xe1\x3e\x4b\xae\x60\x8b\x4c\x31\xa4\xa1\x97\x62\xcc\x5d\x77\xde\x89\x94\x16\xc3\xac\x8e\x6d\xe4\x1c\x62\x4a\xa1\xcb\x7b\x1f\x7c\x10\x73\x9a\xd9\x62\xbf\xe3\xe2\x03\x77\xd8\x23\x23\x0d\x37\x17\xed\x20\xe9\xbf\x43\x7f\x81\xde\x00\x29\xb0\x1d\xdc\xdc\xae\xc0\x1d\x3b\xda\x3b\xf3\x83\xe5\x62\x3e\x6e\xdf\xb6\xb8\x30\x57\x2e\xe6\xb3\x71\xfb\x08\x01\xe3\xa4\xde\x94\x09\xe7\x26\xd6\x20\xd1\xc3\x44\xf7\x52\xb2\x69\x0e\xc3\xb9\xb7\xdc\x64\xa8\x83\xfa\x4c\x10\xf2\x4e\xd8\x63\x0e\xec\xe8\x15\xdb\x0e\x53\x6c\x52\x17\xbc\x75\xf2\x5a\xe7\x4e\x54\xb2\xd4\xbd\x57\x96\x5e\xaf\x19\xc5\xb6\x91\xc6\xd4\x1e\xee\x42\x96\x56\xf6\xd5\x98\xbb\x3b\x6a\x3d\xb4\xd8\x95\x69\xe0\x66\xa3\xde\x40\x9b\x97\x2a\xa7\x6f\x1b\x2c\x11\xc8\xe0\xeb\x43\xab\xe7\x99\x74\x76\xf5\x64\xb6\x4c\xf0\x48\xbf\x2f\xb8\x87\xed\x53\x45\x69\xc4\xa5\x0b\xf2\xb6\xca\x30\x22\xc5\xe4\xd8\xac\x8e\x10\xc4\x34\x25\x26\x2c\xd6\xe9\x91\xb3\x84\x22\x12\xf5\xdd\xd2\xec\x7b\x70\x36\x03\xbf\xbb\x33\x26\x13\x1c\x8e\x6d\x76\xd6\x32\xbe\x9f\x7e\xdb\x15\x78\xe1\x5b\xce\x61\x67\xcb\x27\x87\xb5\xb1\x84\xf6\x95\x67\x1d\xac\xf5\xd5\xef\x2a\x1b\x73\x77\xde\x73\xf1\x14\xeb\x52\xd2\x11\xfe\xd9\xaf\xc7\x13\x23\x91\x00\x84\x92\xcd\x6a\xb3\x0d\x0d\x7d\xe4\x63\x98\xd7\x3c\x52\xfc\xbb\x3f\xcf\xe6\x47\xc2\xd5\xd0\xa8\x40\x10\xe3\x55\x1b\x41\x00\xd0\x9b\xbf\x7a\xf3\x5f\xb1\x8a\xfe\x05\x48\xa0\x0e\x0e\xb7\x93\xb0\xd1\x68\x37\xbd\xa5\x42\x2c\xe4\xf7\x8a\x2e\x1b\x8b\x41\x26\xe4\xf7\xda\x30\xcb\xf3\x2e\x87\xc3\x55\xab\xc8\x19\x7c\xf5\x6e\x26\xad\xb7\xdd\x53\xf2\x5a\x56\x9b\x01\x8d\x5e\xf1\x37\x4c\xf1\x27\x51\x6f\x39\x69\xee\x70\x89\xa9\xe6\x46\xf7\xee\x2d\xc4\x8c\x42\xb2\x23\x5d\xb1\xd3\x2d\x6d\xa8\x0a\xdc\x39\x72\xea\xf1\xfa\xc4\xbd\x27\xd7\xba\x47\x56\x35\x26\xcf\xac\x4d\x2c\x3b\x1c\x8e\x1b\x67\xd3\x6b\x4e\xfb\x9b\x21\x87\x73\xd5\x9a\x53\xfb\x77\xaf\x17\x54\x9a\x59\x3d\xfd\x85\x53\x91\xb0\xa0\xf0\x6e\x45\x94\x9a\x2f\xc3\xb9\xcf\x04\x9c\xcf\x5c\x7e\xe1\x8f\x32\x1f\xdc\x24\xa8\x67\xbf\xb6\xfb\xdf\xe1\x28\x64\x0f\x7f\xff\x82\x20\x6a\x6e\x97\xcf\xf1\xc0\xe5\x3f\x80\xc2\x29\x44\x84\x86\x98\xf8\xea\xe5\xe7\x77\xef\x44\xd8\xad\x21\x03\xb7\x19\x12\xfa\x1b\x72\x1b\xfa\x17\x90\x06\xbb\xc1\xed\xed\x2a\x5c\x5e\x6e\xef\x29\x6c\xd9\xb0\x6e\xcd\xe8\xf0\xd0\x40\x5f\xa3\x52\x2a\x24\xa3\x41\x8f\x2a\x3a\x78\xb2\xb4\x6e\xcd\xc2\x6c\xa5\x54\xc8\x65\x92\x89\xa8\xc3\xc2\xcf\xe2\x0c\x84\xb3\x2b\x09\xf7\x3f\x1e\xe3\x7d\x8b\xd8\x66\xc1\x72\xaf\xd8\x96\x3b\xce\x7e\x85\x90\xaf\xd7\xba\x94\x85\x21\xc0\xaa\x49\x09\x75\xc4\x67\x58\x69\x52\x57\xf5\xa6\xfb\x2a\x3b\x84\xa9\x96\xd4\x93\x1a\x45\x6c\x0f\xd9\x21\x4b\x6c\xa5\x51\x95\x25\xf5\xca\xdd\xdc\x54\x05\xfd\x7a\xf5\xa4\x5b\x9e\x2b\x8d\x28\x59\x3c\xb3\xee\xa3\x7d\xc3\xff\x3b\x96\xd5\x6b\xb6\x41\xd1\x15\x49\x27\x72\xff\x3d\xb5\xfa\x81\xb5\x8b\x28\xe4\x78\x34\x8a\xf9\x5f\x79\xab\xde\xca\xd4\xc2\x77\x2a\x8e\x39\x8b\x97\xc3\x74\x5e\x19\xf7\xa5\x1f\xb6\x79\xc5\xf4\x96\xfe\x47\x37\x6e\x63\xa8\x87\xa2\x50\x6b\xd7\xcc\xec\x6a\x9b\xa2\x04\xa4\xca\xfe\xbf\xee\xef\xfb\xdb\x3b\x36\x20\x12\x8e\x3e\xf1\xe4\x17\xef\x72\xdb\xff\xfc\xf2\x5f\x6e\x7a\xf0\x3b\x89\xc6\xd0\xe9\xf7\x6f\x80\xe5\x6f\xf2\xae\x1b\x9e\x7c\xfa\xc5\x60\x08\xc3\xf9\x9d\xfb\x61\xf1\x67\xd4\xae\x14\x25\xdb\xab\xbf\xce\xc2\x3c\x0a\xd8\x6d\xed\xcb\xbf\x1c\xfd\xf1\xef\x20\x46\xc9\xca\xf2\xb9\x4f\x7d\xe1\x95\x74\x86\xf1\x5b\xed\x88\xbc\xef\x5f\xff\xf6\x20\xc4\xfe\x00\x5c\xe1\x55\x28\xfa\x07\xa0\x82\x31\x70\xb6\x5d\x31\x6b\xf4\xd0\xe8\x40\x21\x9f\xd1\xe3\x31\xc9\xc9\x11\x43\x63\xb5\x95\x3b\x79\x70\x94\x00\xd6\x3a\x04\xfb\x60\x0d\x87\xa0\x15\xc1\x5a\x4f\x71\xfe\xb6\xe1\xd8\x6b\x1b\x77\xed\x1a\x75\x39\xec\x6c\x25\xe8\xc4\xdf\x8e\x7d\x2b\x6f\xa1\xd7\x7b\x78\xbb\x22\xec\xf2\xeb\x9d\x96\x0b\x5b\xea\x60\x21\xb8\x6b\xfb\xd6\x72\xfb\x8e\xf3\x67\x3f\xbe\xd0\xba\xa5\x3d\x76\x20\xb3\xfe\x93\xdb\x2e\x9e\x9a\x68\xce\x4e\x73\x56\x39\xb5\x79\xed\x6b\xf7\xec\xfd\x98\xde\xaf\x16\x46\x96\xb7\x4e\x78\xc2\x2d\x81\x50\x77\xf2\xba\x89\x17\xce\xdc\xf4\x21\xad\x2f\xa6\xad\x59\x3a\x34\x31\x0e\x9b\xbf\x73\xd0\xa2\x7e\xf0\xff\xe3\xec\x3f\xc0\xe3\xba\xce\x3b\x61\xfc\x9e\x72\xcf\x2d\x33\xb7\xcc\xdc\x36\xbd\xdd\xe9\xbd\xcf\x00\x18\x00\x83\x5e\x09\x02\xec\xbd\x89\x5d\x14\x8b\x28\x8a\x94\x44\x89\xa2\x48\x55\xcb\x92\x6c\xcb\xb2\x65\x4b\x2e\x72\x89\x65\xc7\xf6\xc6\xf6\xc6\x71\xe2\x12\xc7\xf5\x9f\xb5\xd7\xde\x24\x8e\xff\x49\xec\xcd\xda\xce\x26\xcf\xb6\x64\xf3\xed\x6e\x76\xb3\xcf\x8a\xfa\x9e\xb9\x33\x03\x80\x12\x24\xfb\xdb\x47\x7a\xc4\x47\x20\x08\x10\xe7\xbc\xe7\x3d\xef\x79\xdf\x5f\xf9\xf9\x97\x3f\x15\x12\x9e\x3c\x79\xcf\x3d\xac\xfa\xea\x4b\x7f\x73\x45\x23\x4b\x3b\x01\x52\xd3\x5a\xf4\x73\x7f\xfb\xb9\x2f\x39\x44\x57\xc1\x90\x8e\x5e\x48\x27\x36\x41\x3d\x65\x44\xbf\xf1\x95\x9f\x7e\xd6\x21\xc5\x4d\x9f\x70\xf9\xc1\x73\xd6\x7a\xfe\x1f\xf8\x3f\xe0\xff\xa0\x9c\x16\xa6\x3f\x63\x61\xfa\xf3\x85\x7c\xcc\x34\x14\x89\x41\x05\x4b\x16\x25\x66\x86\x83\x8a\x43\x62\x68\x0a\x23\x1b\x03\xa8\x74\x10\x81\xe0\x6a\x8a\x6e\xbd\x1d\x3f\xa3\xbf\x88\xc1\x0d\x30\xfd\x31\x33\xd2\x1d\xba\xaf\xae\xa1\x0a\xba\x9d\xce\xb5\xf5\x2a\x37\xb4\xae\x38\x4e\xbd\xc1\x80\x57\x2b\x6e\xb7\x74\xf2\xff\x57\xd8\xf5\xe8\xe6\xcd\x17\x47\xc7\x3f\xfc\x30\x18\x59\xd9\x72\x6e\xbe\xb9\x8d\x11\x9c\xc9\xdd\x4b\xff\xea\x41\x24\xab\x71\xb8\x3f\x1f\x46\x17\x7f\x7b\x7f\x1b\x7d\xec\xd4\xe7\xff\xc6\xa3\xbd\xe7\xc9\x77\xdf\xb4\x69\x1f\xf9\xf9\x57\xe0\x42\xd0\x7e\xf5\xb1\x43\xc7\xa1\x96\x55\x53\x7f\xfd\xe3\x4f\xde\x85\xbc\x76\x91\x7e\xe0\xe5\x7f\xfb\xcd\x48\xaf\x87\xf9\x08\xfc\xf7\x54\x84\xda\x44\xbd\xa3\x3d\x08\x96\x96\xda\x9b\x33\xa3\xc3\x43\x03\xa9\x58\xd8\xaf\x8b\x3c\x9e\x1b\x1b\x1e\x1a\xa8\x64\x12\x31\xb3\xfb\xff\x8a\xca\x41\x8a\x82\x84\xb1\xbb\x48\x70\x0c\x65\x40\x02\x98\x00\x8c\xdd\x3e\x34\x7f\x6b\x2d\xa8\x8d\x22\x6d\x8c\x5a\x5a\xbf\x48\x4b\x3d\x28\x6c\x57\xc8\x65\x6d\xd0\x6a\xf5\x8e\xbb\x2d\xe2\xf8\x1a\xf2\x78\x6d\x40\xce\xd4\xd7\xb0\xeb\xeb\x79\x69\x12\x20\xf5\xe2\x83\x77\x2e\x34\x1a\x4f\x9d\x72\x3a\xaf\xbc\xf7\xf1\x27\x78\x56\x5a\x39\xb5\x33\x5b\xdc\xb9\x73\xd7\x56\x81\x70\x0f\x3c\xfe\xd8\xbd\xbc\x27\xa4\x31\xce\x17\x5e\xfe\xe4\xcd\x98\x26\x24\x69\xdb\x5d\x8f\x35\xf7\x1f\x2a\x0b\x5e\x67\x9c\x53\x9e\x7e\xe1\xe5\x47\x02\x8a\x5f\x63\x98\x23\x0f\x8f\xee\x7c\x17\xbf\xb3\xfd\x8d\x57\x76\xb0\x85\x4a\x6a\x00\xc1\xb2\xae\xa5\x0f\xbe\x78\xad\xdd\x92\x21\x72\xa5\x35\x3d\x4d\x93\x9a\x2f\x2f\x33\x6a\xb2\x49\xc8\xdc\xe8\x00\x91\xd4\x44\x90\x9e\x7d\xf7\x0b\x13\xb1\x19\x4e\xd6\x92\x4d\x88\xc6\x47\x86\x44\xe2\x8c\xfb\xe8\x6d\x37\xfe\xaa\x5b\x35\xdc\xfa\x3b\x10\xb4\xfa\x6f\x93\xd4\xc3\xed\x1a\x98\x9a\x6a\x4f\x27\x46\x5a\x83\xcd\x68\x24\xe8\x77\x1b\x9a\xd3\xce\xd3\x88\x9a\x18\x6b\x0d\x36\xcb\x89\x48\xd0\x4d\x6b\xd8\x4f\x89\xb4\xd7\x2e\xd3\xde\xc4\x18\x92\xd7\x2d\x7f\x8f\x93\x7d\xbb\x70\xec\x5b\x82\x13\xc6\xa8\xa9\xf5\x0b\x3f\x65\xbd\x79\x2c\xe6\x50\x67\xd1\xac\xbe\x84\xda\x5d\x72\x6b\x79\xbb\x5d\x66\x09\xd4\x1b\xf5\xde\xa2\x17\x50\xbc\x51\x5d\x27\x68\x4c\xac\x65\x97\x95\xe5\xb4\xcf\x03\x21\xf4\x9b\x92\xc4\x00\x46\x37\x0c\x95\x76\xb9\x97\x6a\x61\x84\xe2\x9e\x40\xe7\x37\xc2\xa5\x3d\xba\x8d\x71\x07\x00\xb6\xeb\x80\x00\x92\x4f\xb2\x8c\x27\x08\x68\x9f\x59\xd9\xeb\x4c\x62\x0c\x7f\x95\x28\x62\xa4\x3a\x54\xd3\x89\xbe\xf1\xc4\x17\xdf\x43\x10\xe4\xc7\x24\x80\xe7\xff\xcb\xaf\x7e\xf5\x5a\x39\xa5\x08\xb2\xcf\x83\xe8\x66\xbe\x5a\x8b\xa9\x5c\x8e\xb0\xe0\xe6\x87\x3e\x7a\x5d\xae\xcd\x9a\x49\x8f\x9a\xf0\x60\x32\x5c\xfe\xa7\x7f\xfe\x5f\xdd\xbc\xf9\x31\xe8\x84\xcf\x51\x22\x15\xa3\x36\xb5\x5d\x20\x1e\x6f\x27\x34\x96\x0a\x6b\x2c\x85\x09\x2b\xd8\xed\x42\x58\xeb\x8f\x3b\xde\xc8\xd4\xa1\xd6\x4d\x37\xe2\xeb\x17\x2a\xbe\xf6\x38\xec\x03\x0d\xe3\xfd\x7e\x71\xa7\x5a\x8d\xc4\xbb\xfd\xe5\x20\xd0\xbd\xfe\xca\xdc\xee\x82\x91\x8d\x27\xdd\xb9\xd8\xc2\x81\xff\xc9\xc9\xce\x50\xb5\x72\x68\xcf\x42\xbc\x40\x2b\xb4\x6a\x0c\xd4\x16\x4f\xaf\xe4\xe0\x25\x43\xda\xfb\x47\x27\xb2\x3b\x1b\x02\x9e\x5d\x7c\xf1\xeb\xb7\xec\x80\xd6\xd3\x72\xe8\xdc\x1f\x7d\x6c\x65\x11\x87\x43\x72\xe2\xf8\x9f\xbc\xb2\xbb\x1b\x2b\x7f\x03\xfc\x08\x50\x2e\x6a\xd4\x9a\xea\xb4\xdb\xed\x31\x33\x97\x49\x25\x42\x01\xaf\xdb\xd0\x14\x49\xb0\x0d\x16\x33\x16\x07\xc7\xeb\x36\x6c\x10\x2b\x12\xc6\x98\x76\x98\x45\xb4\x3a\x77\x28\xf4\x8a\xcb\xb7\xb9\xb1\x57\xa7\x0f\xed\xf5\x3f\x77\xbb\xaf\x67\xd7\x2d\x10\xbb\xea\x4a\xbd\xb6\x6c\xf7\x3c\xf6\x83\x63\xad\x3d\xdb\x5d\x06\xeb\x5d\x65\xf5\x74\x49\x30\x5e\xa4\xe9\x66\x04\x43\x3a\xb1\x92\x0a\xa9\x10\x38\x0d\xcf\xb6\x12\x12\xc3\x3a\x84\x30\x10\x29\xed\xd5\x8a\xb1\x80\x0f\x62\x5f\xb8\xbc\xd7\x49\x63\xd6\xed\xc5\x36\x8d\xa1\xcb\x11\xfa\xee\x8c\xfd\xa3\x1f\xfb\xd8\x2b\x7c\xd3\x90\x93\xcb\xae\x1f\xfc\xe0\x8f\x7f\x20\x40\xb2\xe0\xae\xe6\x64\x41\xf6\xba\x10\x3d\x58\xf8\xa7\x7f\xfe\xdf\xff\x2b\xe7\xea\x44\x00\x33\x58\xf2\xf8\xeb\x19\xb5\x41\xb3\xef\x7e\xee\xb9\x77\x4b\xc5\xee\x49\x03\xff\x06\x3c\x0e\xbf\x48\x89\x54\xc2\xd2\xfb\x4b\x26\xdb\x29\x35\x1e\xf4\x1b\xba\x2c\xf1\x04\x53\xe1\xa0\x5f\xe5\xb1\x37\x0c\x55\xd8\xd7\xf9\x5a\x53\x34\xda\x00\x95\xe0\xdf\x68\x38\xda\xbd\x23\xf5\x8a\x6e\x44\x0a\xa0\x2f\xc4\x99\x30\x3b\xe9\xbd\x87\x41\xed\x54\xe0\xfa\x3b\x1d\x49\x25\x19\xf0\xa7\x26\x8c\x92\xc3\x11\x71\x08\xac\x96\x9b\x6a\x5e\x0e\x4b\x9c\xb8\x5c\x92\x1a\xb1\x64\x38\xe6\x0b\x0c\x19\x21\x0c\xcf\x7a\xca\x00\x9b\x27\x71\x6e\x07\x40\xee\x98\xd3\xa4\xc5\x91\xb3\x1e\x17\x3e\xd3\xa4\x51\xc4\x4d\x20\x54\xf2\x74\x37\xd2\x7d\x48\x7f\xfd\xb3\x94\x9d\x8a\x51\x87\xdb\xd1\x6e\xa4\x07\x14\x87\x28\x44\x02\x3e\xaf\x5b\x73\x88\x98\x62\x58\x02\x7d\x5e\x12\xa2\x70\x44\xeb\xc3\x64\x0a\x05\x0b\x97\x5b\x78\xad\xf5\x26\x24\xee\x2a\x1e\xe6\xcd\xd1\x6f\x3d\x27\x44\x20\x59\x0a\x45\x86\x45\x89\xe9\x0e\x9f\x6a\xd5\x86\xd9\x97\xe0\xd2\xeb\x2f\x7f\xf0\xe5\x97\x95\x1c\xf9\x87\xcb\x57\x88\xdb\x88\x3b\x7c\xcd\x57\x5f\xfd\xf6\xb7\x02\x83\x29\x90\x52\x76\x7f\xf1\xf7\x3e\xf7\xf5\xc4\x94\x78\xc4\xc6\xb1\x2e\x0d\x00\xc3\x96\xf7\xf3\x2a\x2f\xb2\xaa\x47\xc5\xb4\x37\x24\xc8\x6c\x52\xb0\xf6\xec\xef\xa9\x9f\xc3\xff\x46\xb1\x94\x97\x9a\x6b\xbb\x80\xcf\xd7\xf6\xdb\x64\x49\x60\x5c\xba\x6a\xa3\x29\x4e\x45\x00\x01\x75\xc3\xcd\xea\xfd\xfd\x55\xca\xb7\xfe\xef\xef\xeb\x12\xa1\xf4\x55\x46\x5d\x3c\x21\x01\x6b\x7b\xd4\x2e\x3b\xdd\x8e\xb3\x92\x3c\x48\xf4\xc6\x03\xac\x2b\x5a\xe2\x6d\x98\x57\xd3\x31\x08\x80\x2b\x34\x0b\xbf\x54\x62\x80\xeb\x7e\x4e\x6c\xdd\x44\x6a\xf1\x11\x00\x8d\x20\x27\x4b\xb2\x18\x49\xec\xa0\x28\xfc\xfa\xeb\xaf\x7f\x01\x06\xc0\xbf\xa2\x6c\x54\x8a\xda\x4c\x1d\xa0\x1e\x6f\x0f\x59\xf8\xb4\xdc\xd2\xe2\xc2\x60\xb3\x52\x8a\x07\xec\x23\xb5\x4a\xa9\x90\x8b\x47\x23\x06\xbb\x0d\xef\xd5\x30\x42\xb4\xb2\xcc\x88\x3b\x19\x37\x45\x3c\x6e\x9a\x48\x62\x0d\xe6\x40\x04\xae\xc3\x46\x74\x05\xa6\x7a\xa4\x93\x37\x1c\xdc\x8d\xd0\x11\x1b\x20\xce\x22\x44\x53\x1b\xba\xd5\xf2\x57\xd6\xcb\x4a\x0d\x81\x72\xbf\x0a\xe9\x0e\xbe\xac\xdb\xb5\x7f\x7a\xbb\x4c\x39\xd2\x1f\xcb\x5a\xff\x0c\x81\x72\x43\x47\x65\x43\xd7\xf4\x2e\x03\xb4\xde\xa8\xff\x68\xa2\x7e\x5f\x63\x86\x18\x89\xf9\xe0\x03\xf1\x11\xbf\x97\xc1\x10\x60\xf4\x44\x6a\xb1\xa1\x09\x8c\x18\x1a\x9e\x8c\x06\xca\xf4\xe6\xc1\x90\xe7\x50\xd3\x61\x72\x86\x74\x4a\x2a\xdc\xe3\x1f\x3a\x8c\x90\x04\x90\x86\x69\x86\x8f\xed\xce\xe0\xd4\xb6\x10\xf7\x92\xa9\xb3\xf4\x44\x39\xee\xa5\xd1\x94\x0b\x1c\x1c\x99\x7a\x8c\xa6\xb7\xd4\x27\xbc\xe6\xad\xd7\xc7\x02\xde\xd1\x44\xc1\x53\xb9\x10\x11\x9c\x5a\x86\x96\xcf\x3d\x75\x64\x85\x25\xfa\x21\x89\xb5\xdf\xfd\x91\xcb\x47\x09\xaf\x26\x69\xbd\x98\x27\x00\x73\xa7\x77\x5e\xb2\xeb\x7e\x8c\x04\x29\x49\xa3\x94\x0c\x72\x76\x2d\x5e\x5e\xa0\x6d\x7a\x68\xbf\x9b\xb5\x3a\x8f\x3f\x82\x69\x64\xa3\x44\x2a\x49\x6d\xb6\xe6\x94\x63\xd6\x9c\x32\x77\x60\xff\xd2\xdc\xd0\x40\xca\xaf\x39\x0e\xec\xdf\xb6\x30\x37\x33\x35\x91\x73\x6b\xd8\xc0\xe6\x5e\x6c\xda\xb0\x29\xe0\x98\xb9\xcc\x48\x3b\x99\x20\x45\x82\x2c\x91\x26\x16\xc0\x0c\x08\x42\x37\x5a\x25\xef\x5a\x9a\x1a\xab\xca\x3c\xad\xd7\xde\xac\xcc\xf3\xe6\xfd\xda\x48\x13\x0c\xc4\xfb\xad\x6a\x2b\xd5\xa2\x1e\x1d\xbf\x87\x6d\x59\xc7\xc1\xb5\x38\x1c\xd5\x7e\xcf\xda\x22\x77\xbc\x09\xd2\x32\x0a\x74\xa5\xdc\x05\x51\x93\xde\xf9\x04\xc5\xfd\x7e\x0e\x11\x8f\x39\x56\x9c\x87\xe4\xc4\xd1\x02\xb1\x57\xc3\x83\x7b\x86\xcd\x06\x4e\x1c\xd9\x9e\x28\x60\x08\x81\x51\x08\x24\x13\x7e\x80\x21\xd2\x53\x1a\x11\xd3\xbb\xea\x61\x4e\x56\x12\xd8\xde\x1e\xba\x63\xcc\x69\x12\xb9\x3a\xc7\x0f\x6f\xf5\x8a\x2c\x21\xe3\x15\x57\x82\xa4\x40\x02\x3c\x84\x76\xf9\x7d\x35\x33\x08\x40\xab\xc0\xf1\x8f\xdf\xfa\x03\x52\xf3\x46\x15\xe9\xa5\xcf\xfc\xe5\xbf\x36\xed\x9f\x7b\x71\x0a\x80\xd2\xd0\x81\x60\x3a\x1e\xc8\xce\x01\x67\xa4\x22\x04\x9d\xae\x87\xea\xc0\x60\xb4\x0a\x00\xf2\xe5\x6d\x98\x57\xe3\x5a\xea\xa7\x7f\xf7\xe5\x8f\x71\x92\x9a\x74\x89\xc5\x1c\x98\xe7\x85\x5a\x79\x0a\x61\x41\x10\x57\xd2\x66\x37\xcf\xfd\x31\xf8\x7d\xf0\x15\x2a\x47\x1d\xa7\xee\x6f\x57\xc0\x89\x13\xed\x93\xe5\xc3\x87\x66\x07\x9b\xf5\xb4\x7b\xe7\xe6\x4d\xf3\x13\xe5\xac\x26\xd8\x38\x1c\x89\xd0\xcc\xe8\x30\x33\x45\x91\x58\x8c\x00\x07\x09\x04\x88\xb2\x52\x04\x3b\xd7\xc6\x6b\xab\x83\x85\x37\x34\xa9\xde\x38\x84\xdf\x49\x9d\x58\xbf\x45\x27\xba\xef\xfc\xfe\x42\x57\xd7\xe1\x9b\x7b\xd2\x24\xf1\x1e\x07\xdb\xd0\xad\x54\x6f\x58\x5b\xd9\xe8\x36\x1b\xe3\x89\x38\x31\xfb\xa8\xe8\xb2\xa5\xef\x5c\x00\xf5\x46\xaf\x0f\xa9\xf5\x72\x90\x05\x90\xd0\x0d\x1d\x64\x36\x8f\x6a\xc5\x60\x84\x00\x08\x01\xa0\xbd\x95\x6b\x35\x2d\x11\x95\x44\x41\x40\xa2\xdb\x27\x5f\x95\x19\x88\xc7\x26\x13\x8a\x57\x94\x08\x4f\xe2\xbc\xee\xe0\x42\x02\x67\xb7\xf1\x1c\x96\xdb\x82\x5d\x76\x55\x39\x40\x3f\xe2\x9c\x55\x6c\x4e\x9e\x57\x69\x3e\x99\x1a\xbd\x58\x49\x85\x10\x04\x40\xe1\x05\x02\xbc\x27\xb6\x4e\x6b\x5e\x8c\x10\x67\xc4\x76\x09\x21\x9b\x5f\x57\x2a\x6a\x80\x20\x36\x5c\x84\x00\x20\xc2\x00\x38\x1f\x70\x4f\x0e\x00\xc0\x0a\x04\x16\x22\xfc\x0e\x00\x81\xd4\x68\x00\x3a\x1c\x83\x01\x00\x80\xa4\x04\xce\x89\x4e\x30\x54\x44\x10\x0a\x06\xc7\x63\x8f\xbb\x6c\x0b\x79\xe5\xf2\x11\x5d\x20\x4d\x59\x60\xa0\x75\xe2\x7e\x07\xc6\xe0\xeb\xd6\x89\x5b\xa0\xf6\x52\x0f\xb7\x9b\x60\xdf\xbe\xf6\xfe\xcc\xfc\xec\x40\xa3\x54\x88\xf9\xa5\xd1\x4a\xa9\x90\x09\xa3\x65\xbc\x6b\x47\x2e\x86\x35\x1b\x6d\x2e\x32\x8e\x2d\x8c\x97\x22\x5e\x86\x38\x2a\x28\x03\xc2\xc8\x0b\xc1\xe8\xfa\x77\x86\xbc\x26\x69\xd2\x5a\xab\x78\xdf\xf4\x06\x1b\xa5\xf6\xad\xdf\xbd\x7d\x56\x42\x14\x41\xef\xf0\x58\x94\x45\x65\xb5\xf5\xd5\xeb\x0e\xaf\x4e\x9b\xdf\x20\x01\xd7\xd3\x4a\xd0\x56\xa1\x2a\x7a\x43\x47\xfa\xaa\x6c\x95\xf5\x05\x7e\x36\x38\x81\x90\xee\x1f\xbe\x8f\x47\x20\x10\x5e\x8c\x5f\x3c\x9b\x71\x63\x40\x0b\xa1\xcc\xb1\xf1\x16\x4a\x97\x4b\x53\x0c\xdb\x4c\xe7\xb8\xc5\xc6\xc4\x11\x8c\x56\x9c\x71\x4e\x1e\x6d\xc7\x99\xca\xf8\x9e\x72\xce\xc6\xc0\x00\xa1\xed\x9e\xa5\xc1\xe8\xd9\x1c\xfd\xa2\x4f\xb7\x43\xf6\xa6\xe1\x27\x10\x00\x76\xca\x0d\xae\x83\xcd\xad\x69\x77\x18\x73\x9b\x35\xad\x96\x4c\xdf\xfa\xa7\x01\x82\xfd\xae\x9c\xbf\x74\xa1\x38\x06\xc0\xf0\x8b\x9f\xb1\xe9\x9f\xfd\xbd\xaf\x7e\x56\xe2\xcd\x8b\x52\xf2\xf7\xff\xf2\xa7\x7f\x64\x77\x04\x42\x3e\xe9\xfd\x1f\x29\x21\xd4\x18\x79\x60\xd6\x96\xf7\x11\xe8\x88\x32\x18\xd2\xa6\x0a\x46\x81\x10\xf6\x9e\xe3\x00\x23\x8b\x0e\x79\x8f\x87\xa7\x28\x9a\x02\xaf\xff\x25\xf8\x53\xf0\x65\xca\x46\xe5\xa8\x6d\xd4\x01\xea\x24\xf5\x42\x7b\xc2\x52\x9c\x29\x1f\xdb\x3e\xd8\x3c\x71\xc7\xfe\xdd\xf3\x83\xcd\x7a\xb5\x9c\x66\x9d\x38\x18\x0e\x62\x15\x47\x69\x39\xb9\x97\xb1\xef\x66\xb2\x07\x99\x70\x98\xb0\x51\x93\x10\x8a\xb8\x5d\x76\x12\x8f\x93\xec\xf4\x54\x31\x0f\xe6\xd7\x3c\x94\xfa\xb4\xb7\xd7\x5a\xfd\x0d\x6c\xf5\xc0\xa0\x1b\x24\xca\xde\x0e\xce\x6f\x24\x4c\x13\xb1\xda\xfb\xd6\xa9\xb2\x54\x69\xaa\x89\x1e\xbb\xb1\xab\x02\x45\x0c\x92\xb1\x10\x9d\x16\xbf\xad\x93\x33\xd7\x14\x83\x57\xc5\x13\x2d\x56\x5b\xff\x66\x0b\x02\xdd\x7a\x38\x5a\xe7\x38\xa1\x07\x21\x49\xc4\xcd\xfa\xd7\xe6\x55\x82\x26\x33\xd9\x49\x14\x0b\xe7\xce\x45\xdc\x18\x62\x25\xb6\x94\xaa\x27\xeb\x1e\x07\x04\x60\x61\xee\x3d\xf8\xce\x3b\x42\x46\x3a\x7a\x97\xe2\xf6\x85\x6e\xb8\xd2\x7e\x4c\x2b\x51\x5f\x1d\x43\x8c\x1d\x8c\x84\x49\xf9\xd1\xec\xf6\xb8\x13\x40\x04\x11\x63\x60\x9a\x55\x2f\x05\x5d\x80\xce\xa6\xb3\xd9\x48\xd4\x61\x62\x10\x75\xb5\x80\x0a\x4e\x0c\x29\x0e\x1a\xa0\x9c\xcf\x7d\xeb\x77\x63\xf1\x1d\x24\x3a\xac\x94\xfc\x31\xd6\x1e\xf2\x37\xfc\x03\xe0\x1e\x42\x17\xc5\xe0\x28\x03\xda\x10\xd2\x73\x21\xd5\x46\xec\x6e\xc0\x9a\xce\xca\x48\x82\x93\x59\xa9\x9e\xf0\xd7\x3d\x43\xe9\xfa\x90\x0f\x23\x47\xf1\x1a\xb4\xf3\x4e\x84\xcc\xaf\x03\x9e\x23\x08\x00\x57\x37\x6b\xbe\x06\x16\xe1\xbf\xa7\x92\xd4\x01\x4b\x97\xa6\x53\x95\x64\xb6\x6d\xd9\xbc\x69\x6e\x7a\x72\x7c\x6c\x28\x97\x49\xc4\x22\xba\xbc\x6b\xc7\xb6\x2d\xcb\x9b\x37\x2d\xcc\x74\x3e\xd8\x1e\x1a\xa8\xe6\x73\x99\x88\x4f\xe7\x68\x06\xab\x22\x96\x11\xc4\x4e\x17\xc7\x13\xb4\x30\xb3\x0b\xee\x18\x80\x79\xe4\xa2\x21\x82\x6b\x93\xb7\x56\xe7\xdf\xc2\x9a\x49\xd6\x46\x43\xdb\xb7\x78\x71\xac\x9f\xc4\x6d\x50\xc0\x10\x46\xb3\x20\x87\x1a\x43\xcc\x3e\x02\xbb\x6a\xc9\x09\xf7\x29\x8b\x9d\x6a\xc5\x2a\xe7\x08\xd3\x1f\x15\x74\x5f\xae\xd6\x49\xd5\x2a\xa4\x37\x8e\x33\xe2\xb5\xb2\xd1\xc7\x29\x32\x9d\x3f\x3b\x02\x3e\xae\xe0\xc0\x20\x00\x69\xcd\x80\x83\x09\x1f\x72\x44\x68\xbf\x1b\xb0\x24\xa6\x5f\xd3\x74\x82\x59\x87\xe0\xd8\xcf\xc9\x72\x84\x0f\x8d\x05\xb7\xa5\x20\x41\x74\xd4\x81\x00\x52\x34\x1e\x79\x3c\x41\x3a\x1c\x09\x85\x75\x7f\x03\x08\x3e\xa4\x6b\x08\x8b\xee\x0c\xbc\x9b\xd7\x1e\x67\x6c\xba\x66\x87\xf0\xec\xcf\xa0\xf3\x95\xaf\x03\xc6\x53\x11\x68\xc7\x58\xdd\x9d\x95\x38\x1d\x23\xd5\x48\x61\x04\xf2\x83\x13\x9c\x9c\xa3\x45\xe8\xb2\x95\x58\xce\x34\xa7\x79\xbb\xdb\x5b\xa5\x61\xe3\xa3\xcf\x0a\x4c\x9d\x01\x80\xb9\xf1\x6f\x60\xc9\xed\x86\x8c\xd3\x24\x30\x16\x73\x70\x4e\xdc\x9d\x9d\xaa\x30\x04\xbe\x4d\x39\xa8\x51\xea\x5e\xea\x31\xea\x5f\xb4\x37\x83\xc7\x1f\x6f\x3f\x31\x7f\xc7\xf6\x6d\x5b\x16\xe6\xeb\x65\xd3\x75\xf7\x85\x73\xc7\x76\x2f\x2d\xcc\xcf\x4e\xb6\xea\x19\x1d\x43\xdd\xc5\xde\x7d\xe1\xc2\xdd\x0f\x3e\x80\x1f\x0d\x88\x76\xba\x19\x0a\xd3\xcd\xd3\xa7\x18\xf6\x3a\x73\x99\x22\x05\x0f\x51\x59\x12\xbb\x74\xcf\x19\x70\x0c\x2c\x41\x70\x6e\x5d\xed\xd9\x45\xa1\x14\xfa\x07\x55\xb6\x68\xcf\xad\xdf\xa4\xc1\xd3\xdb\xcf\x73\xd4\xe3\xeb\xf7\xf3\xf1\x55\x07\x0f\xb5\x47\x56\xb5\x06\x74\x56\x0a\xee\x4a\x7f\xd5\x6b\xd5\x02\x88\xd7\x56\x2d\x35\x1a\xf5\xca\xba\x22\x55\x5f\x8f\x9f\xb0\x84\xc2\x46\xbb\xed\xb3\xd5\xc3\x1c\x84\x7d\x45\x22\xab\xd4\x65\xba\x33\xf8\x21\xd0\xe3\x92\xad\xb2\x5d\xe3\xff\x70\x56\xa2\x69\xbb\x7f\x67\xcd\x0c\x61\x0c\x6d\xe9\x56\xe9\xcf\xb2\x19\xbd\x38\xda\x58\xd4\x87\x20\x04\xd1\xdd\xc7\x33\x7e\x8d\x75\x65\xef\xcf\x6f\x33\x69\x5b\x31\x3f\xcd\xd3\x90\x0e\x09\xcd\x84\xca\x21\x44\x87\x38\xae\xd9\x20\x44\x18\x19\x64\x71\xf3\x74\x7e\x7b\xd6\x05\xa0\xd7\x1e\x62\x60\x60\x32\x16\xcf\xfb\xe4\x69\x9f\x93\x9f\xcf\xe6\x74\xdd\xe3\x31\x66\x9e\x27\x07\x47\x22\x2e\x1a\x02\x00\xfd\xc1\x72\x5c\xe7\x01\x02\xf3\xf4\xb2\xcf\x50\x63\xdb\x30\x4c\x25\xea\x92\xcf\xe5\xcc\xdc\xf2\x8b\x3c\xd4\xdd\x05\x2f\xcd\x30\xce\x02\x21\x29\x4d\x1b\x1a\x4c\xde\x93\x8c\x15\x3c\x31\x9a\xab\xe8\x19\x5e\xf9\xc8\xd7\xa7\xa7\x9c\xce\xa8\xca\x2c\x43\xb7\x5b\x71\xa8\x4f\x3e\xf5\xec\x35\xb7\x2c\x05\xdc\x36\xc3\x5b\x89\x79\xca\xe3\xe7\xcb\x31\x06\x0e\x8b\x2c\x00\x7c\x8a\xc3\xee\x9c\xee\x16\x69\xc3\x07\xfe\x19\xda\x04\x27\xeb\x2a\x47\x62\x00\xda\x02\xde\xbb\x7b\xbd\xbf\x30\xe2\x28\x1f\xb5\x89\xba\xda\xae\x5b\xbd\x3f\x73\x66\xa4\x98\x77\x2b\xb6\xd1\x91\xd6\x60\x33\x9b\x31\xdd\x92\x6d\x02\x2f\x2e\xe2\x31\x0a\x1b\x0c\x16\x10\xd1\x46\x41\x0b\x34\x91\x09\x34\x28\xad\xb7\x51\xeb\x36\x96\xfb\xa1\xb2\x41\x40\xac\x22\x6d\xdf\xdc\xec\x03\xf5\xf8\x2a\x69\xa9\x47\xad\xe8\x15\xb9\xb7\x41\xb7\xbb\xfa\x14\xf1\x44\x64\x7d\xaf\xbf\x3f\x64\xb7\x68\x9d\x41\xa0\x1a\x3a\x58\x82\x99\xf8\xb0\xce\x00\xe2\xca\x96\x5a\x0c\x3b\x51\xa8\xc5\xe9\xd8\xcc\xa3\x08\x47\x4b\x79\x91\xf6\xf9\x81\xb8\x54\x9b\x11\xd9\x18\x70\x10\x07\x30\xb6\x28\x31\xc2\xa9\x09\xcc\x2c\x95\x36\x31\xec\x84\x2b\xa0\x6c\xa9\x4a\x34\xaa\x08\x22\xe6\xec\x08\x83\x4c\xbc\x08\x60\x53\x73\x5e\xbb\x5b\xf4\x7c\xf9\x0f\xff\xe8\x8b\xa6\xf3\xfd\x1f\xa8\x43\xf8\xce\x17\xee\xd7\xe9\x1d\x07\x30\x83\xab\xee\xf8\xfb\x3f\x79\x38\x85\xec\x82\x0a\x0c\x86\x7b\x78\x1c\xb1\x4a\xc2\x93\xfa\x83\x1f\xfe\xf0\x9b\xb2\xd0\x32\xe9\x67\x4e\x16\xfd\x0c\x00\x88\xb7\x7f\xa8\x7b\x76\xff\x84\xfa\x0e\xfc\x99\xe5\x3a\x95\xa4\x9a\xd4\x8d\x76\x03\x0c\x0c\xb4\x07\x7d\x95\x52\x26\x65\x86\x43\x01\x8f\x4b\x57\x1d\x02\x47\x37\x0a\x89\x58\xd8\x92\xdd\x97\x6c\x1c\x0d\x11\xa6\x20\xc3\xd4\x72\x30\x06\x7d\x80\x82\xa0\x71\xdb\x9b\xe3\xcd\xfc\x96\xb7\x02\xc7\x34\xa8\x81\xf5\x1b\x30\xd0\x03\x74\x77\x96\xd8\x8c\x30\xf5\xbe\x8e\x4a\xa2\x0b\xea\xee\x3c\xea\x15\xc2\x74\x8d\x9c\x34\x55\xe9\x02\x66\x56\xf5\x67\x52\x7a\x15\x00\xc4\xf1\xf1\xb8\x16\x49\x2a\xbe\x98\x16\xd5\xa5\xa0\x27\x8c\x9c\x8e\xc1\x58\x18\xaa\xba\x57\xd3\x0d\x94\x43\xd8\xe6\x35\x4d\x23\x85\x19\xb7\x2b\x16\xf4\x83\x6f\xb3\x5f\x3b\xbf\x88\xcc\xef\x83\x4f\xfb\xdc\xa5\x6c\xb2\x19\x34\x5f\xfb\x9a\x5f\x70\x46\x49\xf5\x9b\xc0\x46\xa3\x52\xa7\x94\xac\xd5\xbf\x02\x16\x19\xac\x25\x46\xf6\xab\x69\x6c\x0f\xc7\xb3\xdc\x5e\x0a\xbf\x7e\xe8\xf5\x71\xea\x3f\xc3\x7f\x43\xf9\xa8\x08\x35\x4b\xed\xa4\x9e\x69\x0f\x5b\x0c\xc8\xa5\x2d\xcb\xf3\x9d\x07\xdb\x58\x21\x17\x09\x2a\x04\xc3\x1d\x4b\x53\x13\x63\x8d\x7a\xb9\x90\xcb\x24\xc2\x7e\xb7\x02\xed\xb4\x26\xd2\xda\x24\x31\xb7\x99\x8b\x70\x04\xb4\x40\x19\xde\xd6\xb6\x2e\x6c\xc8\x3e\x78\x9b\x85\x1c\xdb\x80\x1e\xd9\x6f\xfd\x34\xea\x15\x2b\x3f\x59\xb3\xd6\xbe\x10\x97\xd2\x59\x5a\x46\xd1\xbb\x35\xe7\xaa\x85\xa2\x45\xc7\x67\x22\xc4\x8c\x27\xac\xfe\x99\xa5\x2e\xa2\xdc\xae\xf3\x33\xee\x2e\x47\xbc\x79\xcc\x8a\x4e\x7a\x02\x02\x04\x60\xcc\xe1\x24\x00\x88\x30\xbb\x45\xf3\x16\x9d\xe6\xec\x66\x51\xe5\x00\x32\xb1\x18\x00\x28\x57\x80\x00\xc3\x01\xe2\x65\x84\x94\xdd\x9f\x34\x32\x76\xb1\x65\xb6\x16\x39\xde\x9d\x4c\x79\xdc\x34\x67\xf3\x04\x87\x5d\x0f\xd1\xec\x40\x84\x85\x08\x32\x03\x89\x8f\xef\xbf\x8b\x46\xe4\x9e\x8b\x17\x2f\xb2\x4c\x86\xe7\xe1\xd7\x62\x73\xae\xe2\x95\xd7\xa6\x00\xe7\xb4\xf3\xf2\xa7\x7e\xbc\xb0\x48\xb3\x82\xe8\x73\x80\x0b\x07\x7e\x54\x45\x08\xd8\xe4\xec\x30\xcd\x2b\x0e\x0c\x31\x7c\x59\xb4\xa7\xb7\xac\xa4\x23\x44\x74\x44\xd2\xbb\x42\x7d\xe4\xf9\x83\x88\xa3\x3c\xd4\x04\xf5\xb1\xf6\x0c\x98\x9c\x6c\x4f\xf9\xc7\x5b\xf9\x64\x38\x68\x88\x98\xb2\x18\x92\xe9\x64\x3c\x1a\x0e\xfa\x0d\x4d\x61\xb1\xa2\x71\xb2\x28\xca\x9a\xc1\x51\x6e\x37\x65\x17\x69\x12\x27\x4a\x97\x2b\x99\x86\x7e\xa0\x40\x76\x3d\x67\x72\x35\xd3\xb4\xde\x86\x49\xfe\x96\x97\x51\x9d\x9a\x5c\xbf\x69\x93\x5d\x68\xc9\x5a\xde\xb1\x1e\xcd\xe5\xce\xae\xe8\xab\xe5\xbf\x55\x31\xae\x7a\x93\x30\xb7\x23\x7c\x7a\x96\x51\x9f\xc1\xc1\x42\x7a\x8a\x61\x57\xaa\xa5\x26\x0c\x3c\xe9\xf7\xd4\xb7\x5c\xd8\xf5\xe9\x99\xa5\xf1\x9b\x57\xb7\x04\xa7\x08\xd3\x18\xba\xe7\x91\x76\x68\x2c\xed\x9c\x1b\x8b\xcd\x7a\x3a\xcf\xe8\xa9\xa1\x3d\x1c\xb7\xd9\x69\x12\xc7\x7c\x53\x12\xa6\xfe\xf3\xfc\xfd\xa2\xf6\x7b\xdf\xfa\xd6\xef\x44\xa4\x2f\x7f\x3e\x9e\x08\x3d\x02\xe9\xe5\x3b\x66\x5f\x34\xe8\xc6\x83\x7a\x25\x32\x0a\x51\xad\x7c\xfc\xdc\x22\x64\xe2\xba\x10\x99\x7e\xff\x8b\x34\xa3\x24\xb4\xd4\x17\x7f\xf2\xe3\xaf\xb3\x0e\x3d\xee\xe7\xc7\xcf\xb7\x7a\xcc\x90\xaf\x23\xce\x62\x86\x5c\x6e\x97\x7e\x0d\x33\x04\x13\x42\xbf\x1d\x37\x64\xc3\x34\x7e\xdb\x6a\x6e\x4c\x0e\xe9\x5e\xbd\xeb\xc8\x21\x3d\x78\xc6\x1b\xc8\x21\x46\x56\x74\xd2\x10\x10\x86\x4d\x45\x9c\x00\x7a\x7c\x3e\xa8\x68\xb5\x50\x50\xf7\x04\xa0\xa6\x0e\x7a\xbc\x10\xc1\xbf\xa9\x70\x88\x7e\xe9\x03\xef\x7f\x09\x14\x7f\xf7\x4b\xff\xf2\xb5\x6f\x15\xed\x5e\x0f\x8f\xd8\x99\xef\x7e\xfb\x5f\xfd\x61\x59\xf6\xfa\x04\x6c\x5b\xf8\xce\x77\xbf\xd3\x75\xb1\xfc\x02\x1a\x05\xbf\xa0\x26\xa9\xf7\x53\x1f\xa4\x7e\xda\x3e\x06\x5e\x7a\xa9\xfd\xf2\xc2\x07\x5e\x7c\xef\xf3\x4f\x3f\xfe\xe8\x8d\xab\xf7\xdf\x77\xee\xe8\x91\x03\x7b\x46\x73\xd1\x0f\x7e\xe0\xc5\xf7\x3e\xf3\x8e\x27\x1f\xbf\x71\xff\x7d\x17\xce\x9d\x39\x7d\x72\xc7\xb6\x95\x4d\x0b\xa3\x03\xc9\x68\x28\x20\xc2\x38\x76\x5e\xc7\x97\x9c\xf8\xd2\x65\x3b\x8f\xd5\x09\x3c\xfc\x1c\x7e\x5f\x85\x71\xca\x22\xf1\x90\x46\xad\xf0\xcc\x3b\xc0\x05\x70\x06\x9c\x84\x0b\x20\x09\xc1\xc9\xf5\x51\xd9\xd5\x37\xb0\xf0\xa2\xdd\x6b\xb0\xd5\xeb\x00\xbd\x29\x2c\xdf\x36\xbb\xac\xad\xee\x49\xea\xa5\xf5\xab\xfb\x52\xf7\xaa\xb4\xda\x3c\x96\x18\x87\x46\x8c\x48\xc9\x1a\x7b\x25\x56\x81\xbf\xab\x23\x74\xab\xea\x5d\x7d\xce\xf6\xab\xa6\xee\x35\xba\x8e\x0d\x55\xaf\xd5\xbb\xfa\xac\xab\xcd\xa3\x6e\x8b\xa2\xdb\x3e\xea\x39\xa2\x59\x04\x3a\xad\x93\xd8\xac\xaf\x53\x2e\xd5\x4d\x9d\x21\x5a\xe7\x6e\xb0\x6e\xde\x0a\xd1\xd4\x04\x53\x83\xd3\x18\x20\x56\x31\x7c\x99\x18\xc0\x39\x8f\x62\x83\x9d\x17\x90\x9e\xaa\x89\x18\x39\x38\x36\xe6\x69\x8c\x9d\x56\xdd\x39\xc1\xc0\x6d\xec\xb9\x19\xc8\xde\x54\x8d\x41\x0c\x99\x18\xa1\xcb\xd9\x62\x88\xa6\xa3\x8a\x29\x06\x36\x35\x6e\x32\x50\xa6\x81\x0c\x20\x44\x76\xa7\x31\x3f\x5d\x0d\xa6\xae\x39\x6d\x75\x99\x75\x8e\x55\xef\x5f\xb0\x0b\x6e\xa7\x3f\xb3\x65\x1a\x42\x8f\x14\x14\x58\xc0\x20\x24\x78\x63\x1c\x00\x60\x2c\x1c\x4e\xd2\x20\xe8\x0a\xb3\xb6\xa3\x18\x0c\x72\x36\x1b\x2d\x61\xbf\x2b\x18\xde\x39\x51\x03\x70\x7c\xe8\xfe\x88\xc4\x2a\x88\xa4\x05\x61\x76\x6e\xbe\x4d\xdb\x76\x5c\xf8\xc0\x39\x96\xf0\x8e\x6c\x19\x00\xc8\xcd\xcf\x88\x08\xd1\x29\x87\xba\x79\xff\xde\x79\x8e\x4c\xcc\x2d\xfc\x02\xd2\x4a\x4c\x72\x9c\xf8\x4c\xa3\xec\x52\x0c\x09\x0a\x82\xc8\x08\x00\xba\x9d\xb1\x31\x0e\x84\x05\x9f\xe8\xb8\xf8\x89\xab\x7b\x31\xa4\x7d\x21\x56\x3e\x73\x5d\xd3\x55\x0d\x08\x08\x92\x99\x91\xd6\x34\x10\xed\x76\x01\x1e\x7e\xc9\xaf\x6a\x74\xa5\x7a\xc7\xcf\x69\xd4\xcb\x8b\x6e\xf0\x0b\x2a\x41\xed\xa1\x1e\x6a\xd7\xc1\xde\xbd\xed\x7d\x85\xed\x0b\x63\xc3\x11\x5d\xdc\x69\xf1\x21\x1a\xb5\x4a\x21\xe2\x73\x8a\x2c\xb5\x1b\xaf\xf0\xb4\x1c\xc7\x21\x4c\x5c\x16\x29\x02\x16\x80\x13\xde\x46\x89\x28\xbc\x95\x98\xe4\x1b\x2a\xae\x29\x6a\xef\xfa\x30\xda\xdb\x47\x8a\x77\xc1\x72\xcc\x86\x9d\xc5\xd5\x48\x29\xaf\x79\xd8\x56\xd7\xe2\xac\xd7\x66\x5c\x4f\x84\xe8\xf6\x4e\x88\xa1\x83\xf9\x4e\xed\x14\xf5\x45\x11\x87\xb1\xd2\x0c\xa6\x27\x43\xa3\x2c\x6f\x1e\x4f\x68\x4b\x10\xd0\x76\x1a\x7b\x72\x39\x3b\x84\x44\x8b\xf0\x34\x69\xcd\x8c\x38\x39\xd4\xd9\x6a\x3f\x56\x73\xcb\x25\x3d\xee\x46\xfc\x7c\x71\xb9\xec\x8c\x08\x62\x6c\xbf\x07\x81\xa0\xd7\x6f\xb7\x61\x00\x40\x26\xa4\xd0\x92\x12\x9a\x1f\x6a\x8f\x0b\xb6\x83\xa7\x9e\xbd\x24\x28\x4a\xb2\x61\x89\x6a\xb8\xbc\xe3\x9b\x17\x26\x6c\x78\x64\x7a\xf6\x27\xc4\x27\x88\xb6\xe0\x96\xa3\xcd\xc3\xac\x26\x0b\x59\x41\x97\xbd\x10\xd0\x9c\x4b\xf4\x3a\x3d\x0f\xbf\xef\xe2\x31\x96\x0f\x7b\xec\xd2\xe3\xd7\x74\xc5\x81\x00\x3d\x31\x31\xde\xd5\x8e\xfa\x0b\xf0\xa7\xe0\x5f\x52\x02\x15\xa5\xe6\xa9\x3d\xd4\xd1\x76\xd2\xda\x9d\xe2\x68\x31\x9b\x0a\x1a\x3b\xf1\x66\x3b\x1d\x56\x68\x8c\x69\x6d\x81\xd9\x4a\x11\x2f\x4b\x24\x71\x68\x30\xd6\xef\x47\xf5\xf5\x3d\xdf\x88\xd6\xcf\x53\xab\x3d\xa8\x37\xef\x41\xdf\xc5\xb0\xcb\x54\x44\xe6\x3a\xaf\x87\x75\x4e\x0f\x3d\x41\xdd\xaa\xf5\x4b\x8f\x81\xd2\x7d\xe9\x04\x00\xd3\x6f\x43\x29\xab\x9f\xdf\xdd\x87\xff\xff\x44\x24\x4e\x33\xc1\x44\xa3\x19\x33\x69\xfe\x5d\xa9\x85\x84\x87\xc1\x18\x22\xe8\xce\x5f\xbd\x5e\x4c\xd0\x04\xb2\x66\xd5\x48\x94\x05\xc8\x19\x34\xe6\x5d\x2c\xd6\x5a\xd7\xf3\x3b\x73\x06\x00\x0c\x20\x90\x73\x61\xfd\x88\x31\x61\x64\x39\x80\x16\x15\xaf\x37\xc7\x00\x18\x35\xc0\x11\x10\x08\x8d\x6f\xf2\x45\x70\x38\x30\x71\xfd\xd6\xef\xc7\xbc\x15\xff\xa0\x67\xa8\x14\x48\x60\x9c\x0c\x6d\xdb\x6f\x6b\x05\xf3\xa3\xa0\x53\x13\xb0\x88\x61\x03\x65\xf7\x35\x7f\x33\x40\x3b\x5c\xb9\xa8\xbf\x66\x1f\xb7\x2f\xdb\x1b\x01\x32\x66\x43\x60\x06\x88\x4a\x62\xaf\x4a\x23\x28\x2b\x89\x61\xaf\xab\x53\x13\xdf\xfa\x07\xe8\x02\xff\x8e\x12\xa9\x12\xb5\x83\x3a\x45\xbd\xb3\x3d\x6a\xb9\x20\xd4\x77\x6e\xdb\xb2\xb8\x30\xde\x1e\x0d\x19\xca\xf1\x43\x07\x77\x2c\x2d\x2e\xcc\xcd\xd4\xcb\x5e\x03\xed\xc5\x6e\x1b\xce\xdf\x71\xe8\x20\x3a\xc2\x44\x29\x92\x8c\x45\x51\x82\x21\x8e\x25\x6a\x06\x7a\x21\x98\x59\xaf\xb0\x60\x74\xb2\xb0\xd1\xda\x80\x40\xb4\xc1\x44\x6f\x66\x03\x23\x04\x10\xef\xee\x53\xbd\x62\x05\xba\x42\x12\xbd\x7e\x7c\x6f\xc6\xdb\x49\xb0\x43\xa0\xdc\x9d\xf4\xe9\x8c\xda\xa5\x57\x58\xd0\x45\x64\xed\x55\x1f\xc2\xc8\x34\x56\x0d\x26\x1b\x9d\xb7\xa8\xc5\x25\xaf\x44\x18\x8b\x21\xde\xa8\x83\xc4\xc4\x34\xcb\x86\xfc\x4d\x91\xde\x8f\xa0\xd3\xa7\x9a\xa9\xa3\x11\xda\x2c\x64\x26\x18\xb2\x58\xc9\x09\x88\xf1\x1e\x30\x0c\x01\xd1\x6c\x43\x49\x18\x3a\xd0\xbc\x65\x3f\x8b\x81\x6a\x17\x30\x0d\x72\x77\xcb\xf7\x67\x68\xcc\x8c\x0d\x6e\x67\x99\x85\x1a\xe3\x9c\x19\xf6\xe3\xd8\xc1\x93\xf1\xf7\x3a\xfc\x0c\xa0\x95\x71\x04\x91\x18\xf4\xf0\x28\xe2\x05\x53\xb8\x3d\x3e\x1e\x8e\x42\x20\xdf\x37\xa2\x45\x6e\xfd\x58\x82\x64\xf2\xe9\xf3\x82\xf2\xf2\x97\xbf\xf8\xe1\xa0\x3d\xce\xf9\xeb\x34\x00\x2c\xb1\xbb\x83\xb1\x85\xe9\x7d\xe9\xea\x99\x7c\x38\x11\x13\x78\x86\xc5\xb5\xb4\x28\xf8\xe4\xc4\x27\xbe\xfe\xf5\x4f\xeb\x4a\xca\xc7\x5d\x3b\x92\x20\x4c\x1b\x70\x90\xf3\x04\x5d\x8e\x45\x16\x08\x8d\x96\xd7\xd7\x39\x51\xb7\x7e\x0c\x8b\xe0\x9b\x94\x4a\xe5\xa9\x15\xea\xa8\xe5\xb2\x72\xec\x58\xfb\x78\x6d\x79\x69\x6c\x68\x20\x93\x30\x35\xfb\xcc\xf0\xd0\x40\xa3\x96\x49\xf8\xc9\xae\x1d\xf8\x88\x8c\x53\x4e\x3a\x35\x41\x86\xf7\x31\x5b\x20\x13\xe6\x89\x51\x1b\x5e\xdb\xc8\x42\xff\x61\xd9\x3b\x5f\xad\xb7\xab\xf1\x66\xa8\x63\xeb\xf7\xf0\x58\xf7\xb0\xf5\x2d\x14\x2b\x5d\x20\x64\xe7\x38\xf5\xdb\xbe\x5d\x49\xd4\x37\xb4\x7d\x75\xe3\xb6\x39\x36\xb3\xca\xac\xb1\x4e\xdc\x6a\xdb\x57\x5d\x13\x42\xad\xff\x05\xc3\x9a\x71\x33\xe9\x6e\x31\x6c\x2e\xe0\x85\x70\x76\xc6\x73\x64\x4f\x3a\xae\xb1\x4a\x74\xe9\x93\x65\xda\x16\x6e\xb7\x09\x69\xe6\x0a\x2e\x87\x12\x23\xd2\x64\xeb\xf4\x98\x33\xca\x3a\x92\xdb\x10\x5b\xfb\xe8\xb6\xa8\x0a\x90\xc7\xe1\xe2\x83\xcf\x7a\x8b\xec\x9c\x5f\xa7\x11\x84\xde\x40\x29\xe2\xe6\xc0\x34\x98\x06\xba\xbf\xbc\xc7\x0c\x82\x4c\xb2\x60\xb7\x15\x86\x6f\xfd\x63\x05\xc1\x74\xfe\xa1\x7c\xb8\xe0\x8b\x4e\x6a\x69\x56\x7b\xfe\x93\xaf\xbc\x28\x33\x27\xcf\x63\x56\x89\x29\x91\xcf\xfe\xbb\xdf\x7a\x3f\xeb\xd0\x52\x92\x21\x05\xcb\x18\x26\x02\xe5\xcd\x77\x8c\xba\xf9\x39\x02\xd8\x4d\xe0\x51\xc0\x8a\xb2\x28\x97\x23\x71\xda\xa6\x85\x38\x36\x3f\xdc\xad\x9f\xfe\x35\xb8\x01\x7e\x4e\x19\xd4\x10\x35\x42\x5d\x6a\x17\x2d\x4d\x4f\xcf\x70\x6b\xb0\x99\x8f\x86\x54\x99\xa3\x46\x86\x5b\xc5\x7c\x36\x9d\x0c\xf8\x3c\xba\xc0\xd1\xb4\x0d\x12\x67\x11\x64\x41\x12\x0a\x70\x55\x5c\x70\x23\x52\xe3\x86\x27\x2d\xb9\x81\xa4\x27\x88\x33\x22\x30\xf4\xb5\xb3\x55\xaf\x58\xdd\x58\xa3\x27\x33\x66\xe5\xb8\x02\x58\x57\x7b\x5b\x7e\x96\x9d\x9b\xa7\x91\x60\x6a\x40\x09\x3a\xa2\x0d\xc4\x1a\x83\xfe\x04\x21\xb9\x40\x4b\x72\x9e\xe7\xd9\x48\x38\x22\x19\x59\x7b\x92\xb3\x97\x2b\x15\x25\xa6\xd1\xf4\x68\xb5\x49\x48\xde\x67\x30\xc2\x42\x93\x46\xc5\x80\xac\xf0\x8f\x00\xb0\xac\x02\x58\x8b\xde\x7d\xd9\x2e\x9e\xbd\x74\xef\x9d\x4e\xc7\xcc\x22\x74\x46\xf7\x04\xdb\x1c\xc3\xca\x2e\x9a\x66\x6c\x7e\x5d\xb7\x99\x17\x1f\xbe\x7e\x59\x60\xfd\x3e\x1d\x5d\x1e\x1a\x0a\x56\x20\x76\xc2\x22\x04\xd6\xed\xfe\x17\xe0\x06\xf8\x3d\x2a\x4d\x1d\xa7\xee\x6b\x97\xac\xb9\x54\xe1\xc0\xbe\xbd\x13\x63\xed\xd1\x11\x37\x7d\xc7\x91\x43\x3b\x36\x4d\x8d\xb5\x1b\x85\xa0\x2e\x23\x1b\x9d\x88\xed\x62\x86\x18\x02\x28\x2f\x51\xe7\x32\xe0\xd0\x6d\x8e\x5a\x05\x6b\x7a\xf8\x96\x4b\xd8\x5b\xc1\x43\x1b\x8c\xa5\x1a\x3d\xc6\xf2\x9a\x06\x60\x77\x2e\xd5\x1b\xe5\xf6\xa9\x2b\xb7\x71\x90\xba\x4e\x09\xf5\x46\x3d\x08\x1a\x86\xb9\x0a\x8c\x5f\xdf\x19\x27\x09\xb2\x2a\xb8\xdf\xb9\x75\x3e\x97\xdb\xed\x0e\xc6\xa5\x05\xcd\xeb\x82\xb0\x70\x74\x98\xa3\x07\xdc\x4b\x0f\x77\xe2\x5a\xd8\x2e\x79\x25\xae\xe8\x9b\x2e\xd2\x10\x02\x29\x9d\x73\x45\x7d\x34\x64\xc5\x82\x18\x0e\x8f\x61\x46\x76\x68\x2a\x80\x0c\xf0\xd3\xe1\x32\xe3\x09\x3c\xb6\xb5\x1a\x23\xa8\x73\x39\x47\xdc\xee\x32\x57\xb1\x85\x00\x32\x1c\x4d\x3f\xe3\xc5\xf1\x73\xe1\x40\xd3\xeb\x1f\xc0\x80\x88\x6e\xbf\x33\x69\xee\x6f\x4a\x64\x5c\xb4\xbb\xcb\x04\xd8\x38\xbf\xcf\xc9\xfb\xf5\x09\x87\xc7\x70\xf8\x27\x01\xeb\x0c\x49\xe9\x4d\xa1\x98\x62\x73\xdb\x91\x1d\x00\x06\x01\x28\x84\xf5\xac\x12\x9c\x41\x40\x92\x1a\xe1\x86\x5f\x49\x38\x19\x5e\xf5\x23\xc8\xd2\x88\x4f\xa4\x02\x86\x86\x9b\x7c\xb7\x2a\xfb\x0f\xc0\x0d\x0f\x50\x6e\xcb\x0d\x71\xd2\x72\xe2\x9b\x98\x1a\x6a\xd4\x52\x66\x38\xe8\xf7\x08\x1c\x9c\x9a\x18\x1d\x1e\x68\xd4\x2a\xa9\x44\x2c\x1c\xf4\xfb\x3c\x4e\xc1\xc6\x41\x97\x8e\xb1\x2c\x51\x18\xc7\x26\xa0\xa5\x78\xe6\x83\x4e\x28\x43\x1b\x04\xa9\xb5\x93\xd0\xea\x71\x21\x5b\xad\x0d\x05\xfe\xde\xea\x59\x95\xda\xd8\x65\xaf\xb7\xa7\x5d\x1f\x8c\x6e\x56\x32\x55\x4d\x57\xac\x86\x77\xb5\x87\xb9\xe8\x01\xdf\x82\xb0\x5b\x9c\xe9\xdd\x16\x8e\xa5\x0b\x69\x9d\xaa\x8f\x94\xb2\x22\x42\x24\xa6\xf2\x6a\x9a\xd8\x5a\x19\x14\x33\x01\x49\x7a\xc1\x36\x46\xe6\xb5\x18\x96\xa5\x66\x46\x60\x8c\x24\x47\xec\x41\x00\x78\x04\x34\xba\x02\x90\xa6\xe5\x32\x26\x3d\x0a\x21\x2d\x05\x59\x08\x1a\x50\x3a\xb8\x65\xf9\x10\xcf\x6f\x76\x48\xcd\x59\x27\xbe\x0f\x0a\xae\x3c\x37\x70\xfe\x2c\xb8\x84\xc8\x1c\x4b\x9c\x51\xa8\x8c\x8d\x71\xde\xc8\x0c\xb1\x39\x62\x00\x84\x82\x8f\xdc\x8d\x44\x67\x14\x4a\x2f\xfc\x98\x77\x79\x6b\x8c\xdd\xe4\x48\xb7\x53\xf0\x13\x48\x81\x5f\x50\x21\x6a\x13\x75\xb6\x9d\xeb\xa2\x0f\x9b\x8d\x5c\x46\x9e\x9f\x9d\x2c\xe6\x32\xa9\x98\x97\x25\x78\x08\x57\x75\x15\xfb\x1d\x84\x0a\x4f\xc2\x22\xf4\x42\x76\x4d\x5b\x64\xad\xfb\xb5\x11\x9e\x69\x55\x3c\x64\x03\x80\xa1\x55\x2a\x69\x56\xdd\xdb\x89\xf4\x51\x60\xf9\xa1\xc7\x1b\x9d\x85\xea\x72\x47\x7a\x0f\x9f\x7a\xdf\x1b\x9a\x18\xba\x04\xcc\xce\x47\x56\xd5\x94\x0c\x9d\xb1\xfe\xf4\xff\x5e\x0c\x57\x20\x5e\xa8\x56\x73\x08\xeb\xae\x24\x6f\x66\x00\x0c\x78\x3d\xb5\x09\x96\xce\x45\x3c\x7b\x8b\x2e\xc6\xce\xf3\x31\x87\x49\x58\xa9\xb2\x35\x84\xe1\x34\x87\xdd\x08\xd0\x4e\xaf\x28\xf2\xcc\xdc\x50\x53\x11\x30\x80\x38\xca\xbb\xb0\xa8\x8d\xed\x96\x9e\xbe\xe6\xe6\xef\xbb\x37\x11\x32\x69\x04\x93\x6e\x42\x3f\x75\x37\x24\xc2\xcd\x77\xaf\x04\x8c\x09\xac\xaa\x31\x57\x6a\xcb\xe6\xad\xb3\xac\x4d\x96\x02\x0e\xe1\xa1\xc7\x1a\x02\xc2\x2e\xe1\xf2\x3d\x08\xa0\x98\x6a\x8b\xec\xdb\x3d\xb8\x0f\xfb\x47\xdc\x43\x5d\x8c\xf7\x2f\xe1\x16\xf0\x4b\x4a\xa2\xb2\xd4\x81\x9e\xa7\xab\x33\x99\x08\x06\x7c\x9a\x53\x24\x54\xcc\xa5\x39\x79\x98\x49\xcb\x31\xc8\x43\x17\x84\x20\xd6\xd7\x6c\xb1\x64\xfb\xde\x8c\x7c\xea\xad\x68\x6c\x03\x4b\xd7\x18\x5c\x07\x69\xed\xac\x96\xb3\xc1\x10\x66\x04\xf4\x6e\x4f\xb3\x07\x8a\x53\x2a\xba\x51\x29\x03\xf6\xae\xc7\xe3\x4b\xfb\x27\xa6\xa7\x2a\xed\xad\x03\xdc\x6e\x79\xcf\xae\x2b\x49\x55\xb7\x67\xec\x83\x7b\x66\xea\x99\xa2\xc8\x12\x3a\xb7\x6b\xe8\xa3\xa7\x3c\xbc\x1e\x55\x22\x20\x71\x43\x76\x9c\xf8\xfc\x37\x97\xb1\x73\xf6\x8a\xf3\xfb\x70\x04\x4c\x3c\x60\x67\x90\x2d\x6f\x73\x08\xdb\xde\x73\x76\x0c\xb0\x75\x21\xf0\xc2\xad\x1f\x38\x23\xd6\xcf\xfc\x73\x74\x15\xfc\x92\x8a\x50\xdb\x2d\xce\xd2\x8e\x1d\xed\x9d\xb9\x6d\x2b\x9b\x17\xe7\x67\x5a\x83\x03\x8d\x7a\xb5\x9c\x49\x85\x43\x1e\x5d\x73\x70\x88\x9a\xea\x44\x99\x19\x10\xa6\x60\x0e\x9a\x20\xd0\xb9\xca\xd6\x3f\xb2\xde\x42\xb2\xfb\xcd\x67\x76\x8a\xda\xb1\x7e\x45\x76\x74\x41\xed\x05\x6b\x34\x11\x61\xaa\x89\x35\xbc\x6f\x65\x75\x95\x50\x22\xbe\xca\x6d\xee\xba\xa3\x74\x52\x6c\x06\xc4\x13\xa6\x05\x07\xee\x86\x19\x46\xe5\x7a\xa5\x6a\x58\x75\x63\x5d\xaf\x18\xb0\x6e\x46\x1a\x69\x39\x9e\xe6\xd5\x17\xf3\xb5\x52\xe9\xc3\x71\x57\xd0\x94\x62\x46\x30\xe2\x28\x3e\x17\x9a\xfd\x9b\xa0\x83\xbb\xca\xc5\xaa\x67\x42\xa5\x6a\x64\x3c\x64\x3e\x51\x71\x44\x59\x46\x44\x5a\xdd\xdd\x30\x57\x18\x56\xd2\x0b\x5b\xb3\xc0\xc3\xd3\x0a\x4d\x57\x26\x87\x12\x25\x56\x64\xea\x66\x6e\xe5\xb1\x53\x91\x4d\x65\xf4\xad\x97\x8a\x09\x89\x7d\xe4\xe3\xc5\x6d\x77\x44\x72\x3b\x0e\xc6\x3e\x71\x05\x4a\x2f\xdf\xfa\xdf\x08\xcc\xa4\x92\xdb\xb7\x5f\x5e\x61\xb8\x8c\xcb\x4e\xf0\xb9\x9b\x03\xe7\x01\x9b\x9f\x7f\xfe\xf0\x0e\x80\xb4\xb4\x43\xf8\xf6\xad\x7f\x84\xb8\x81\xe7\xdf\x77\x6c\x1a\x80\x7a\x37\xf2\xbe\x04\x9f\x04\xbf\xa4\x5c\xd4\x04\xf5\x60\xbb\x66\x75\x01\x87\xc6\x47\x1b\xf5\x72\x36\x14\xf4\x3b\x38\x4c\x8d\x8f\x0e\x0f\x59\x40\x6b\xb7\x26\x70\x94\x81\x6d\x43\xc0\xd2\xe0\x82\x6e\xa8\x75\xf6\x21\x7e\x5b\xcf\xef\x6d\x6b\x8a\xd5\x6d\x88\x6f\xd0\xdf\xb3\xb8\x05\x5d\xf8\xf0\xed\xd0\x75\xe5\xf6\xc8\x34\xd6\x24\x22\x75\xa3\xdc\x07\xee\x75\x51\x8d\x10\x35\x07\x62\xd3\x83\xa3\x0d\x9f\xe7\xec\xe6\x1d\xcf\x0c\xcd\xec\x29\x37\x67\x97\x8b\x97\x0f\xef\xfa\xe4\xe2\xfe\xc5\x9c\x91\xa1\x31\x52\x33\x07\x16\xde\x75\x7a\xd7\x3d\x64\x5f\x32\xb3\x6d\xeb\x68\x39\x16\x42\x90\x0e\x9b\x07\x16\x5f\x39\x7c\xe8\x8a\xdb\x53\x0b\x2a\x36\x1c\x3b\xb6\xd2\xe6\x69\xe6\xcc\x99\xb3\x0f\xa9\xb6\x95\x99\xe5\x71\x4e\x38\x74\xe5\x7e\x70\x5c\xe7\xa6\xc7\xbc\x55\xa0\xc7\xc5\xd0\x43\x8f\xdf\x7f\x01\xe9\xa6\xe9\xa2\x87\x66\xf3\x41\xe8\xf7\x89\xde\x4b\x4f\xdc\xbc\x93\x23\x76\x57\x77\x5d\x09\xdc\x0f\x7e\x49\x39\xa9\xaa\xe5\x8a\x57\xab\xb5\xeb\xae\x52\x3e\xec\x71\xd9\x59\xaa\x52\xca\x67\xd3\x7e\x8f\xcb\x8e\x21\x55\xa1\xd2\xd0\x8f\xd7\x2c\x7a\x5b\x6f\x20\x6a\xbc\x11\xe5\x92\xde\x40\xf3\xd9\xb8\x6d\xc5\x7a\x4e\x8d\x56\x53\x7b\xcd\x0f\x3f\xb2\x6e\xf9\xac\x4b\xe6\xae\xc5\xc5\x2d\x1f\x29\xcf\xed\x6f\x0f\xac\x0c\x36\xf6\xec\x9d\x8f\xe7\xdb\x57\x73\xf1\xd9\x7d\x3b\xcd\xb2\x57\x94\xa7\x17\x66\x2b\x19\x0b\xfc\xea\xde\x3a\xfb\xf1\xc3\x03\x77\xea\x5a\x5a\x0e\xb6\xbe\x79\xfc\x63\xbf\xfd\x67\x01\xc7\x03\x4f\xbe\xe3\x1e\x4e\x3b\xfa\xad\x0f\x6d\x99\xe2\x4a\x8b\x3b\x3e\xf9\xa7\xa7\x9c\xce\x98\xe2\xf4\xd9\x4f\x5c\xda\x39\x0f\xc3\x01\x47\xee\x4f\xbe\xff\xe8\xf3\x0c\xe6\x95\xcc\xaa\xca\x49\x1a\xfc\x15\xe5\xa1\xa6\xa9\x0f\xb6\x27\xc0\xcc\x4c\x7b\x36\x36\x50\x36\xfd\x6e\x4d\x9a\x18\x6a\x94\x4b\xb9\x58\xd8\xef\x75\x6b\x12\x4f\xa0\x28\xb1\x90\xa2\x60\x30\xcc\x52\x6e\x37\x55\x62\x19\xc3\x41\x8c\x21\xd8\x80\x31\x10\x06\x5e\xc0\x43\x02\xd7\x93\x48\x7b\x18\x93\xb7\x55\x2c\xbd\x7d\x25\x57\x07\xd8\x33\xeb\x17\x72\xa6\x87\x67\x27\x89\x55\x1e\x5b\x57\x40\x7c\x3d\x8e\xfd\x36\x24\xbb\x55\x8d\x75\x61\xa2\xeb\xc9\x6e\x84\x21\x8d\xad\xff\xe2\x83\x77\x38\xd5\x33\x97\x2e\x9d\xb5\x31\xe3\xf3\xd7\x87\x86\x06\x86\xb0\x72\xe4\xd4\xc9\x43\xd0\xa1\xa5\x19\x1b\x91\xaf\xde\x78\xe4\x4a\xdc\xa5\xfa\x68\x3e\x79\x60\xe4\x26\xe3\x6c\x41\x4c\xdb\xa5\xfb\xaf\x3e\x74\x6f\x50\xd3\x7d\x34\x9b\xde\x39\xfa\x04\x09\x9e\xff\x31\x89\xc6\x63\x49\x00\x7c\x0e\x71\xe8\xe0\xc7\x68\x08\x78\xb9\xa6\x23\x14\xc4\x2a\x6b\xa3\x6d\x52\xc0\xc4\xb8\x54\xaa\xb3\x44\x89\xb3\x68\xd7\x6f\x29\xa6\x0a\x11\xed\x73\x47\x21\x2c\x96\xea\x2c\xe3\x8c\x33\x78\xe7\xab\xb2\xb5\xfe\x41\xb0\x07\x7e\x9e\x8a\x53\xc7\xa8\x9b\xed\x06\x38\x7e\xbc\x7d\x62\xe5\x58\x3e\x93\x30\xa5\xc3\x2b\xf3\xd3\x53\x93\xe3\xed\x61\xcb\x4e\x36\x9f\x31\x83\x5e\x4d\x22\x18\x1b\x3c\xf6\x1b\x76\xe2\xa0\x48\xb8\xb8\xa2\x38\x40\x5f\xf0\x60\xb4\xd5\xc5\x64\x75\x81\x73\x1b\x27\xdb\xdb\xe9\x6f\x83\xd4\xf1\xf5\x0b\x7d\xbc\xdf\x55\xe9\x5c\xde\x9a\x1a\x84\xd6\xf8\xbf\xdb\x12\xa9\x76\x55\x2b\x7b\xd7\x39\xe9\x0b\xd3\xac\x0a\xf7\x74\x5e\x72\x86\xd6\x59\xe4\x8a\xda\x75\xa6\xd3\x54\xbd\xd1\x87\x77\xe3\xf5\x1b\xf3\x39\x86\x87\x00\x64\xb2\x10\xc3\x6c\x86\xcf\xb4\x1d\xb6\x51\xc2\xe2\x22\x2b\xcf\x42\x64\x67\xce\x0e\x97\x30\x57\xb1\x55\xe3\xac\xe8\x65\x75\xcc\x65\x1e\x2c\xcb\x0c\x64\x59\x34\x09\x03\x92\xcd\xcd\x40\xb7\x00\x23\x0a\x37\x7d\x64\x84\x97\x08\x6d\x13\x6c\x2c\x64\x49\x08\x31\x28\x16\xc5\x80\x87\x2d\xc8\x2e\x3d\x93\xf7\x87\x72\x1f\xa8\xd9\x00\x50\x1b\x06\x82\x00\x15\x07\xbe\x18\xd6\x31\x27\x34\xce\x1e\x1d\xe3\x88\x5f\xcb\x78\xeb\xaa\x19\x1e\x73\xb3\xa2\x96\xf0\xeb\x5c\x50\x52\x9b\x2f\x65\x24\xcc\xd8\x24\xd6\xce\x20\x86\xa7\x2f\x5e\x64\x19\xa7\x0b\xa6\x24\x6d\xcc\x3f\x48\xd3\x76\x86\x83\x4a\x02\xdb\xf3\x97\x0b\x91\x70\x73\xe6\x19\x6b\xdf\x3e\x41\xfd\x21\x7c\x8e\x92\xa8\xb8\x85\x23\x4f\x24\xda\x49\x57\x38\x18\xf0\xe9\xbd\x41\x41\xcc\x0c\xae\x1f\x14\x74\x45\xa4\x4c\x97\x2a\xdf\x6e\xe0\xf0\x6b\x06\x05\xab\xf6\x0d\x89\xf5\x1b\x95\x58\x27\x22\xd5\x9b\x13\xd4\xaa\x6b\x22\x52\x16\xde\xaa\x1f\xf9\x72\xa0\xc2\xf3\x04\x00\xc2\x71\x99\x80\xe4\xd5\x22\x50\x55\x6a\x66\x00\x00\xdd\xe7\xc3\x9a\x32\x18\xf0\x42\x04\xef\xaa\xc0\x9b\x8f\xde\x7c\x14\x65\xde\xf9\xd4\xa7\x6f\xc5\x62\xa2\x23\xca\x23\x66\xec\xd3\x9f\xf9\xcc\x67\x72\xf6\x86\x1d\x92\xe9\x4f\x7f\xfa\xd5\x6e\xb6\x58\x02\xbb\xe1\xaf\xa8\x14\x75\x8c\xba\xd4\xce\x5b\xd1\x9a\x3d\x74\x70\xef\x6e\x0f\x3e\xb2\x7f\xef\xee\xed\xdb\x16\xdb\x83\xb5\x72\xa9\x98\xcb\xa6\xe3\x1e\x19\xf3\x1c\x0e\x51\x76\x9c\x8c\xb4\xf7\xaf\x59\x1e\x83\x2e\x1c\x77\xc3\x72\xfe\xf6\xf0\x6c\x6f\x10\x9e\xdd\xc7\x6d\xa7\xc8\xac\xa9\x96\x8d\xd6\xaa\x53\x56\xef\x5d\x66\x89\xa2\x12\x46\x6d\xd4\x1b\xb5\x78\x01\x34\x6a\x05\xd8\x58\x45\xdc\x27\x6e\x33\x66\xb1\xda\x47\xa4\xa6\xad\x9a\xe5\x0e\x81\x72\xe7\xf3\xfe\x16\x04\xeb\x77\xb1\x38\x99\xe1\x58\x40\x12\x59\x80\x79\x1b\xae\xc6\x68\x5b\x71\xd8\x93\x8b\x42\x5a\x56\x62\x93\xb8\x8a\xc6\x94\x18\x72\x72\x3c\x07\x30\x07\x1b\xc2\xc4\xc9\x8a\xc8\x79\x3c\x88\x48\x7e\xc8\xa1\xa8\x89\x21\x42\x30\x56\xa3\x6d\x8e\x18\xe2\xda\x93\xe1\x09\x64\x13\xc3\x0e\xc7\x40\xd0\x1f\x10\x78\xa8\x3d\x5c\xa9\x0c\x79\xc2\x99\xe7\xb6\xb2\xd0\x91\x74\xe5\x6b\x0e\x46\x77\xc7\x77\x5f\x0c\x8a\x9c\xac\xa4\x4f\x55\x4c\xbb\xc1\xe8\x88\x56\x10\x44\xe4\xb1\x25\x86\x94\xe8\x84\x1e\x19\x2b\x97\x42\xa2\x92\x60\x6d\xd2\x8b\xc5\x80\x7f\x30\x32\x59\x8d\xf8\x59\xc0\xc7\x7c\x43\x92\x5b\x49\x24\xb3\xc4\x31\xd7\x75\x46\x7f\x1a\xbc\x17\xdc\x47\xf9\xa8\x09\xea\x54\x3b\x61\xd5\x0d\x91\xf1\xb1\xd1\x91\x56\x2e\x65\x68\x32\x47\x53\xe3\x63\x83\xcd\x7a\x22\x16\x71\x6b\xaa\x9d\xc6\xe5\x80\xbf\x3f\x1d\x2c\xb4\xde\xe8\x28\xb2\x61\x8d\xb0\xe1\x0c\xb0\xb3\xba\x35\xd2\x15\x31\xef\x73\xca\x99\x3e\x7a\xac\x52\xae\x55\x1b\x89\x2e\x7e\xac\xf7\x39\x5d\xbc\x66\x57\xea\xcb\xaa\xe9\x6a\xfa\xff\x09\x96\xbc\x41\xc3\x4d\x58\x27\x67\x63\x39\x21\xde\xaa\xfb\x3c\x80\x59\xe2\x9d\xce\xba\xd4\x92\xa3\x4e\x95\x67\x11\xe1\x8c\x58\x00\x1a\xee\x95\x69\x1b\x1b\x41\x48\x72\x2a\x88\x88\x86\x7f\x10\x28\xf1\xc9\x1f\xd0\x51\x55\x85\x5c\xde\xc6\xb9\x6c\x82\x69\xc6\x31\x13\x57\x15\x84\x16\x24\xbf\x39\x6c\x6b\x7b\xc3\x2d\xdd\x6e\xc7\x44\x89\xb9\xa3\xc8\xa9\x0c\xd3\x30\x1c\x2b\x6b\x5e\x4c\xf4\x80\xb7\x2c\x19\x20\x45\x21\x0a\xde\xfa\x2f\xd4\x9f\x82\xbf\xa7\x44\x4a\xa7\x5a\xd4\x93\xed\x01\x30\x3c\xdc\x1e\xa9\x34\x6a\xc5\x9c\x45\xe0\xf2\xba\x0d\xcd\xc6\x50\x43\x95\x92\xf5\xb8\xea\x3c\x70\xbd\x8a\x64\xa3\x30\x8d\x05\x06\x0b\x18\x32\xdc\x40\xca\xb1\x76\x0b\x76\x12\x72\x17\x1c\xfb\xe6\x70\x7f\xab\xb1\xf8\x10\x35\xbc\x7e\x75\x87\x57\xcf\x7a\xff\xa8\x37\xea\xb7\xb9\xd9\xf4\x74\xfb\x1a\x44\xb3\x5e\xaa\xb5\x6a\xa7\xce\xa8\xad\x9b\x7d\xe7\xdd\x11\x1b\x0f\x00\xe1\xf9\x68\x5a\x42\x28\xee\x4a\x06\x32\xdc\x60\x38\xd2\x09\xae\x60\x88\x41\xc8\x19\xf0\x42\xc5\x59\xcf\x84\x20\x6f\xd7\x43\xd9\xbc\x07\xd1\x41\x23\x11\x8d\x00\x8f\x00\xfe\xea\xf2\x51\x14\xbc\x76\xee\x1c\xd0\xf8\x68\x3a\xee\x5c\xca\x8f\x40\x1a\xb1\xc8\x78\xc7\x95\x07\x1e\xf3\xb2\x3e\x0f\x53\xf8\xcc\xdf\x37\x9b\x04\xd1\x4c\xf5\xa8\xea\x47\x24\x14\x8c\x72\xfb\x2c\xdd\x83\x17\xc0\x17\x60\x80\x1a\xa0\x9e\xa6\xbe\xde\xde\x0d\xde\xf9\xce\xf6\x33\xe3\xef\xb8\x78\xf7\xf9\x93\x07\xf7\xef\xdd\x3e\xd7\x1a\x2c\x46\x3c\x8f\xdd\xb8\x7e\xed\xbe\xcb\xa7\x4f\x1e\x3f\xbc\x77\xf7\xd6\x99\xa9\xf1\xb2\xcf\xc3\x92\x33\x01\x6c\xe3\xe9\x54\x0a\x0b\xb6\xcd\x8c\x3a\xc9\x1c\x9e\x21\x87\x73\x04\x52\x89\x38\x51\xcf\x3c\x76\x03\x5c\x07\xa7\xa1\xae\x3a\x91\x03\x12\x00\x2e\xf7\xab\x0d\xa3\xd5\x83\x20\xf4\x7d\xc2\xd6\xf0\xe3\xbf\x49\xdf\x60\x75\xf1\x2f\x53\xef\x5c\xbf\xf8\xef\xec\x86\xb6\xd9\xa3\x6d\x5a\x5d\xe6\x46\x7d\x08\x44\x8c\x62\xa5\x57\x03\x6b\x3d\x34\x5d\x06\xf4\xda\x3d\xf5\x46\xd9\xe8\x6b\xa5\x94\x4b\x5d\x68\x8d\x35\xff\x8e\x24\x2c\x84\x72\x17\x44\x5e\x29\x5b\x0a\x0b\xe5\xbe\xff\xd0\x6d\xd4\x4f\x6b\x3e\xd1\x05\x78\xf5\x04\x37\x3b\x15\x8f\x05\x85\xfe\x6d\x1f\x74\xa8\x5a\x9a\xae\xce\xd8\x68\x08\xa1\x1e\x5f\x4c\xda\xf2\xa6\x4d\xd3\x73\x72\x64\x0e\x08\xe3\x4c\x43\xf3\x38\x4f\x41\x58\x74\x16\xd2\xc3\xd0\x55\xe2\x30\xe7\x0c\x47\x87\x72\xe3\x31\x9f\x9f\xc3\xb4\x20\x79\x20\x63\x18\x86\x81\x3d\xfe\xb8\x23\x28\x5c\xb4\x7b\x20\x00\xac\xca\xe1\xc0\x08\xc3\xc4\x68\xe8\x08\x46\x53\x82\x37\x57\xb4\xb9\xd2\x6a\x76\x73\x52\x83\x00\x00\xdc\xc4\x6c\xd0\x15\xcf\x72\xbc\xea\x76\x97\x79\x97\x12\x82\xa6\x89\x78\x6e\x8b\xff\x81\x96\x7b\xa0\x14\x88\x01\x3d\x83\x19\xdf\xa0\xb6\x95\xe5\x21\x9b\x33\x38\xdb\x23\x47\x62\x22\x00\xcd\x14\x28\xc8\x61\xdd\xc5\xf0\x2d\x28\xfa\xb2\xc9\x24\x04\x48\x89\x01\x90\xf0\x87\x69\xc0\xba\x1a\x4f\xd0\x84\xd0\x04\x0a\x71\x48\x0f\x0d\x18\x02\x1d\x2f\xd9\x59\x3d\x61\x47\x7a\x16\xc5\x83\x35\x87\x47\x0c\xbc\x52\x20\xe2\x40\xd8\xce\xc8\x52\x80\x40\xda\x95\x87\x96\xb6\xfb\xaf\xe0\xdd\xf0\xdb\x14\x47\x39\x29\x2f\x35\x44\x4d\x52\xcf\x50\x3f\x68\x1f\x04\xcf\x3e\xdb\x7e\xee\xce\x77\xbe\xe3\xfa\xc3\x77\x9f\xbf\xeb\xe0\x81\x7d\x7b\x76\x6d\x5d\x69\xa5\x7d\x0e\xea\xf1\xc7\x1e\xbd\x71\xfd\xe1\x2b\x77\x1e\xd8\xb7\x6b\xc7\xf6\x85\xb9\x99\xb1\xc1\x72\xd6\xa5\xb1\xad\x28\xc6\x92\x83\xe6\x1f\x60\xf2\x01\xa6\x99\x64\xf2\xf7\x33\xf7\x4c\x90\xe1\x51\x4d\x27\xac\xe2\x22\x9e\x4d\xa7\x1e\x7f\x0c\xde\x80\x8f\x8e\x75\x5e\x52\xbb\xd6\x03\x34\x57\x5d\xfb\x5b\xaf\xad\xeb\xaa\xbf\xd5\x95\xf6\xf6\x23\xea\x5d\xd4\xb3\xeb\xe3\xed\xd9\x3e\x00\x80\x21\x5a\xe7\xa4\x57\x47\x81\x6e\xa8\x4c\xdc\xa8\x5a\xd2\x1d\x4c\x04\xf4\xb5\xc2\x57\x95\xc2\x6f\x03\x5e\x13\xba\xa1\x37\x2c\xc3\xfe\x55\x63\x89\xee\x54\x5a\x65\x8c\xee\xdc\x99\x30\x8d\x75\x77\x60\xc3\xe2\x8c\x5b\x35\x5e\x27\x02\x83\xdd\x20\xb3\x08\xa0\x0d\xb3\xa7\x38\xee\x56\x93\x10\x00\x57\x81\xa6\x01\x8c\xb8\x90\x7c\x07\x7b\x6d\x68\x5c\xe0\xdf\x0d\x9c\x81\x85\x99\xe1\x43\x32\x03\x31\xf1\x7f\x64\xef\x30\xe3\x4c\x25\xff\x7a\x6f\x11\xe3\xda\xfc\xe7\x4a\xd9\x7c\xca\xbc\xf5\x8c\x7d\xa5\xda\x9a\xe3\xf9\xd2\x57\xa5\xb0\xa6\xf0\x38\x5d\xfd\x3f\xa7\x52\x8c\x1e\x65\x68\xc2\xb9\xc3\x1c\xb4\x17\xc5\x20\x27\xd3\xf6\xe5\x6f\x66\x8a\xf9\x6c\x48\x55\x79\xde\x81\x36\xaf\x6c\x36\x25\xbe\x3c\x7c\x4e\xe6\xa0\xc0\x0d\x10\xfb\xc1\x73\x0a\x28\x1f\x57\x1c\xa3\x1e\x06\xdc\x03\x68\xc3\x16\x02\xd0\x3d\x25\x3b\x4d\x01\x05\x83\x70\xbb\x9c\x83\x10\x06\x42\x80\x49\xba\x93\xfb\xb3\xd9\x01\xff\xa3\x0c\x36\xa3\x83\x32\xb4\xed\x1d\x7e\xf5\xe3\x83\x5b\x1d\x34\x44\xae\xd6\x2f\x5b\x08\xf0\x01\x3f\xfd\x4c\x6c\x5a\xc0\x32\xef\x86\xdc\xf9\xec\x61\x2c\x37\xe2\x60\x34\x0c\xe4\x14\xbd\x39\x48\x64\x46\x9c\xf2\x12\x8c\x6d\xe3\x13\x3c\x8d\x1b\x91\x02\xc3\x78\x95\x0c\x46\x28\x95\xa4\x1b\x1e\x5a\x89\x8a\xc8\x35\x2e\xa1\x14\xee\xdc\x13\x70\x0c\x0c\xa3\xba\xe5\x6a\x96\xa5\x0e\xf7\xfa\x42\x3e\x8b\xf1\x1c\x70\x19\xaa\xd3\x21\x8b\x3c\x81\x99\x78\xcc\x67\x67\x31\x95\xf4\x80\xcc\x6a\xf9\xf3\xeb\xf2\x7f\x66\x83\xd6\x90\xd2\x4b\xf8\x7d\x83\x1b\xa6\x61\xd4\x1b\x86\x6e\xf4\x40\x4e\x4c\x37\xd7\x6b\xf1\x84\x08\x18\x5d\x64\xd4\x58\x25\xe1\x96\x8e\x27\xc2\x82\x5f\x4a\x39\x1e\xc5\xe1\x7c\xd4\xc1\xf2\x20\x15\x87\x9a\x33\x01\x38\xad\x1c\xe3\x3c\xc1\x3c\x23\x32\x0c\xfc\x99\xab\xe4\x29\x35\xdc\xfe\x42\xd9\x6d\x64\x95\x51\x77\x0e\xd5\x52\x15\x95\x67\x71\xcc\x63\xb6\xdd\xe3\xd0\x19\x89\x56\xed\x06\x0a\x06\x84\x61\x91\xb5\xd8\x64\xff\x44\x7d\x0b\xfe\x27\x8a\xa7\xa2\xd4\x4a\xdb\x0b\x62\xb1\x76\x5c\xb1\x06\x1a\x36\x16\x46\x3c\x2e\x45\x12\x08\x15\x72\xac\x91\xe3\xde\xfc\xf3\xae\xb2\xe2\x62\xeb\x7f\xce\x58\xef\xe7\x2c\x5b\x19\x2f\x11\xef\x7b\xd6\x76\x72\x67\x84\x29\x1a\xf1\x84\x05\xf0\x62\x0c\x5d\x74\xa6\xd5\x24\xcd\x46\xe7\x09\xb1\x73\x4e\x4e\x71\x1b\x23\x25\x82\x68\x1f\x40\x98\xf3\xd8\x1d\xba\x33\xe7\x64\xe1\x6c\xe5\x28\x96\xc3\xa9\x65\x9a\x76\xf1\x8a\x14\x90\x85\xe6\xbc\x43\x0e\x01\x20\x87\x21\xc0\x03\xe7\x9c\x8c\xc5\x36\xd3\xc1\x75\xf0\x8f\x54\x95\x1a\xa6\x6e\x50\x8f\x51\x3f\x69\x1f\xb0\x50\xc0\x13\x8f\x3d\x7a\xf3\x91\xeb\x0f\x3d\x78\xee\xec\xf1\x63\x87\x0f\xee\xdf\xb7\x75\xd3\x90\xd7\x63\x50\xdd\x0f\x3e\x70\xe1\xdc\x99\xd3\x77\x1c\x3e\xb8\x7d\xdb\xd6\xcd\x9b\xe6\x66\x27\x06\x6a\x85\x6c\xda\x34\xf0\x50\x8b\x1f\x68\x34\x06\x5a\x35\xeb\x17\xc5\x21\x63\xaf\x47\xd1\x98\x4a\x82\x54\x4e\x8e\x36\x60\x16\x80\x07\x56\x39\x76\x85\x1e\x1a\xb8\xf5\x5a\xeb\x37\x00\x61\xfd\xda\x5c\xb2\xb6\xa6\x0f\x6c\x00\x15\x36\x48\xa2\x47\x32\xee\x99\x1b\xd5\xaa\x89\x4e\x92\x60\x88\x66\xae\x2a\xdd\x77\x72\x49\xa7\x46\xee\xcf\x36\x7a\x15\x46\x22\xae\x74\xa7\x1c\x05\x10\x4f\x74\x75\x25\x34\x95\x24\x98\x46\xad\x27\x39\x5a\xe9\xce\xf7\x56\x0d\xe3\x88\x99\x50\xfb\xb7\x9f\x35\xc8\x35\x0d\xdd\x30\x75\xc5\x6c\x1c\xcb\x18\x5e\x88\x6d\x2a\xcd\xa5\x54\x97\x9d\x20\xe0\x11\x05\x2f\x02\x00\x93\xd4\x22\x6d\x03\x08\x3b\x72\x5c\xa0\x08\x12\x9a\x13\x3a\xd4\x81\x31\xd9\x5d\xd2\x32\xae\x7c\xc4\x39\x32\x13\x35\x5d\x00\xd3\x6e\x41\x80\xe9\x1a\x4c\xfb\xec\x88\x70\x3b\x58\x0d\xb2\x10\x3b\xdc\x9e\xba\x9a\x61\x1c\xc1\xe0\x60\x31\x24\x88\x3e\x04\xa4\x4c\x9a\xd1\x6d\x2c\xa4\x63\x80\x61\x83\x20\xb3\x8f\xa0\x57\x91\xe8\x4c\x11\x75\xc2\x4d\xc4\x9a\xc7\xe7\x64\xf9\x92\xcb\x0d\x01\xaa\xb8\x3d\x21\xb9\xb0\x9b\x71\x30\x4e\x4f\xe7\x7d\x14\xf3\x33\x84\x46\xf4\xb0\xdf\xa4\x09\x4c\x04\x46\xbd\xb5\xe0\x68\x4a\x7f\xed\x73\x34\xe2\x95\x84\x2b\x2b\x10\xec\x15\x45\x1b\x62\x89\x2f\x06\x80\x0d\xd8\x98\x03\x9c\x47\x0a\x8e\x8d\xd3\x30\xb9\x12\x68\xda\xd4\x58\x74\xa1\x9e\x06\x30\x3a\xc7\x18\xd5\x3a\x1b\xf1\x57\x80\xb7\xc5\x21\x45\xb0\x83\x5b\xd8\xba\xb5\xbe\x80\x0e\xa0\x77\x52\x3c\xa5\x52\x69\x6a\x91\xda\x4f\x1d\xa7\x3e\xd8\x1e\xb7\xa6\x5c\xc5\x5d\x3b\xb6\xae\x6c\x9a\x1b\x1b\xea\x94\xe5\x7e\xa7\x8d\xc5\x47\x0f\xed\xd9\x3c\x31\x36\x52\x4c\xf8\x25\x1b\xa1\x9c\x0a\x17\x0a\x06\x43\x47\x8f\x30\x66\x28\x22\x09\xc4\xd8\x7e\x00\x4e\x80\x11\x50\xbc\x5d\x00\xba\xa7\x07\xfe\x26\xe5\x95\xb7\x0e\x9d\x55\xc6\xe3\x9b\xe7\x60\xa0\xde\x28\xaf\x01\x59\xeb\x46\x1e\x24\x3a\xf5\xe7\xaa\x63\x8c\x65\x18\x63\xac\x33\x8c\x89\xa3\x4e\x4d\xdf\x39\xa3\x26\x03\x57\x91\x4f\xd6\x15\xa2\x23\xab\x1a\x35\x3b\x97\x4d\xd7\x72\x9a\xd1\x8d\x32\x53\x34\x1b\x75\xe0\x66\x6d\x5a\x32\x9b\xb0\x6b\xa1\x70\x23\x97\xcf\x67\xe5\x01\x47\x46\xfa\xdd\xe6\xe4\x54\x73\x70\x42\xdc\xf7\xf8\x13\x73\x84\x95\x4a\xc7\x77\x9d\x4e\x2e\x2d\x2f\x06\x9c\xe6\xb1\xe6\x57\x9f\x4b\x26\x09\x4d\x33\x8c\x9c\x5c\x78\xfc\xfd\x6c\x28\xad\x98\xb5\x03\x4b\xe5\x66\xb3\xd9\x74\x1d\x96\x02\x81\xb4\xc2\xda\xf4\xa4\xaa\xb2\xe2\xdc\xb4\x9d\x11\x03\xd2\x50\xd6\xb0\xa1\x4d\x72\x04\xcc\xac\xb0\x8e\x50\xf0\x56\x13\x03\x00\x62\xef\x8d\x5d\x4c\x3c\x45\x43\xc8\x5c\xda\x87\xcc\xcf\x82\x95\x2f\x80\x8b\x7f\xfb\xcd\x87\x9c\xf2\xdd\xf7\xb1\x5a\x36\x18\xfe\x1e\xd8\x7a\xe0\x38\x00\x8e\xf0\x1f\xdc\xfa\xfc\xb7\xb0\xe8\x30\x4a\x2e\xf7\xf1\xa3\x34\x9d\x03\xff\x5d\x30\x36\x6d\xc7\x6a\x02\x01\xa0\xa6\x27\xa7\xed\xff\x4f\x6c\x0e\x34\x7c\xbd\x1d\xde\x8f\xae\x53\x9c\xa5\x57\x79\x80\x3a\x4e\x9d\xa6\x3e\xd5\x9e\x05\x77\xde\xd9\x3e\x53\x3c\x75\xf2\xc4\xb1\x3b\x0e\xef\xdd\xba\x69\x71\x6c\xb4\x59\x8f\x47\x42\x01\x8f\xcc\xb3\x34\x86\xa7\x4e\x1c\x3b\xbc\x7d\xeb\xf2\xa6\xf9\xe1\xc1\x62\xdc\x23\xf2\x84\x92\x79\x2e\xe0\xf3\x05\x44\x3b\x51\x67\x0e\xc2\xed\x60\xb9\xb3\xcf\xcb\xb7\xef\xf3\x5b\xeb\x43\xbc\x4d\xa3\xbd\xbf\xdd\xcb\xd4\x9d\xeb\xb7\xfb\xce\xde\x76\xeb\x43\xa0\xeb\x94\x69\xf1\x90\xc9\xed\xee\x40\x95\x7a\x65\x03\x38\xb9\xb5\xdd\x8d\xde\xa3\x2e\x11\x4f\xf4\xb8\x02\x8d\x37\x07\x80\x6e\x74\x3e\xb9\x8e\x18\xb3\x0e\xc6\x7c\x45\x87\x14\x54\x52\x5b\x6c\x8d\xd6\x70\x20\xe0\x1b\xf1\xbf\x38\x30\x31\xd5\x2c\x2f\x48\x7b\x9f\xbe\x91\xf7\x12\x86\x25\xe5\x63\x3b\xcf\x8c\x57\xea\x65\x49\x52\x22\x63\xfb\x1e\x3d\x33\x7d\x8c\x10\x42\x00\x6a\x25\x14\x2c\xd2\x36\x8e\x43\xa2\xa7\x9e\xd1\x1c\x8e\x30\x58\x78\xe2\x3d\x9d\x20\x88\x56\x0f\xce\xd5\x06\x9a\x8d\x66\xe0\x19\x26\xaa\x19\x86\x26\x63\x8e\x60\xf8\xef\xc6\xb6\xa1\x4a\x7c\x2b\x77\xeb\x32\x0d\x16\xde\xb3\xf8\xe7\x9d\x1d\x3f\x7d\x02\x99\xff\x02\x2c\xdc\x33\x0a\xc0\xc5\x7f\xff\xd5\x1b\x86\x6d\x7c\x01\xd2\x5a\xd6\x99\x7b\xfa\x47\x8f\xbe\x06\x00\x22\x43\x09\x55\x4f\x02\x08\xa0\x33\x82\x96\x13\x19\xc1\x0d\xbf\x72\xeb\x77\xfe\xb0\x17\x05\x87\x4f\xd1\x74\x15\xe4\xd5\x3d\x00\x44\xc1\x4e\x89\x50\x74\x6f\xe7\x4f\x53\x32\x65\x50\x79\xea\x4e\xea\x1e\xea\x73\xed\x05\x70\xe9\x52\xfb\xde\xea\xdd\xe7\x4f\x1c\x58\x5e\x5a\x9c\x9f\x99\x9e\x6a\xb7\x06\x9b\x99\x64\x3c\x1a\xf2\x68\x0e\x91\x63\x09\xa4\xee\x3e\x7b\xf8\xc0\xbe\x3d\x3b\xb7\x6f\x9d\x1d\xa9\x66\x42\x8a\xc3\x86\x35\x07\x17\x8d\x44\xa2\x0a\x71\xad\x9c\x81\x87\xc1\x3e\x50\x05\x60\xdf\xed\x93\xba\xff\xab\x9d\x5f\xb7\xfb\xfb\xa8\x4b\xeb\x77\xff\x52\x4f\x96\xc6\xf2\x01\xed\x1c\x69\x6b\x23\xd1\xaa\x43\x54\xa4\xe7\x7e\x5b\x57\x3a\x31\xa0\xf4\x42\x20\x08\x7a\x11\xc0\x74\x22\xa0\xde\xd0\x83\xa8\x62\xf4\xad\x41\x0b\xa0\xfb\xae\x37\xf4\x0a\x5c\xd5\x34\xe8\xc6\x81\x81\xba\x07\xbf\xde\x00\x0f\x79\xca\xae\x42\xae\xe4\xf7\x0e\x4c\x04\xe3\x8a\xa6\x28\x8f\xee\xd9\xe3\x1f\x96\x07\xbf\x53\x9e\x1f\x1f\xa8\xce\x47\xa7\xcf\x6f\xd5\x1e\x66\x58\xc2\xbc\xb0\xeb\xf4\x40\x6b\xb0\x2e\x49\xf5\x13\xf5\xc7\xce\xcc\x1d\x22\x34\x61\x88\xcc\x2a\x98\xa3\x19\xc0\x47\x0e\xa4\xca\x02\xad\xca\xa1\xd0\xd8\x64\xd4\x3e\x27\xd9\x83\xb2\xf4\x5b\x9f\x8a\x67\x45\xd1\xbb\x63\x78\x5b\xb6\xd9\x68\x36\x54\xf7\xcb\x4c\x54\x1a\xcc\xb1\x12\x8a\xf8\xdb\x90\x2c\x4d\xc0\x3d\x43\x34\x04\x1e\xe3\xd6\x56\x1a\xcc\x3d\x1f\x7b\xdf\x71\x08\xb8\xd3\x47\x79\xff\x33\x5f\x2d\x82\x0a\x00\xb7\x5e\xfd\xee\x15\x55\x98\x59\x46\xf4\x68\xd8\xff\xd4\x0f\x9f\xfa\x67\x08\x81\x14\x64\x5d\xc4\xc6\xb2\xb0\x68\xdb\xba\x0c\x60\x48\x07\x00\x1d\x9c\x82\x9c\xe1\x86\xf0\xd6\xf8\x9f\x3b\x65\xa7\xd3\x0c\x09\xf7\xec\xa0\xe9\x58\x14\x4c\xa9\x7b\xa0\x12\xed\x45\xc6\x3e\xb4\x9f\xf2\x52\x26\x35\x40\xbd\x83\x7a\x8e\xfa\x0f\xed\x53\xe0\x5d\xef\x6a\xbf\xbb\xfd\xf8\xb5\x2b\xf7\x5e\x3a\x79\xe2\xe0\xfe\x7d\x9b\xe6\x67\xa7\xeb\xd9\x88\x4f\x77\x8a\x76\x82\xa9\x67\x9f\xb9\x7e\xed\xea\xa5\x73\x77\x9d\x3e\x79\x62\xff\xbe\x1d\xdb\x56\xe6\xdb\xf5\x6c\xc8\xe7\x66\xdd\x1e\x56\x57\x55\x3d\xe2\xe3\x8a\xf9\x7c\x11\x62\xcb\x96\xf2\x22\x13\xbf\xc0\xc4\x9f\x7d\x86\xa9\x14\xcb\xa1\x00\x89\xef\x3a\xf6\x34\xbc\x0e\xae\x82\x36\x00\x57\xd7\xc5\x4d\xdf\x2b\xa2\x6b\xed\xf9\xc6\x92\xe3\xd7\x96\x1e\xbf\x36\xa5\x5c\xa5\xde\xb5\x3e\xa8\xde\x65\x05\x55\xa4\x6b\x64\x95\x58\x15\x02\xed\xca\x49\x05\x81\x55\x5e\xd4\xdf\x9c\x64\x86\x80\xb2\x71\x8a\x31\xf4\x4a\xef\x15\x3d\xda\x09\x30\x09\x36\x7a\x34\x6d\x86\x30\x95\x4e\xa0\xf5\xdc\xf9\x2c\x87\x51\xc8\xf4\x66\x2b\x6b\xdf\xb7\xeb\x55\xf6\x35\x7d\xd0\x48\x46\x1d\x6a\xd2\x1e\x11\x25\xd9\x6e\x66\xec\x63\xa2\xcb\xa6\x71\xb2\x37\x91\xfe\x6e\x2e\x97\xcb\xf9\x87\xfd\xef\x6b\x4c\x4e\xd7\x4a\x8b\x03\xa5\x67\xae\xc5\x4c\x96\x91\x5e\xd8\x7d\x32\x37\xdb\x1e\x11\x64\x25\x32\xb1\xf7\xc9\x3b\xa7\x8e\x74\xf2\x10\x6b\x67\x6a\xae\x46\x95\x53\x88\xe2\xe5\x90\x91\xb5\xe9\x2c\x00\xbc\x64\x6f\xdb\xfc\xd1\xb4\x43\x04\x3e\x77\x54\x56\x69\xe0\x2e\xc9\x41\x5e\x93\x79\x72\x43\x3f\x74\x57\x52\xd3\x94\x78\xf1\xe8\x42\xb5\xda\x1a\xcf\xa9\xee\x0f\x89\x81\x9d\x12\xfc\x13\xbf\x4d\x87\x05\x21\xa4\x06\xb9\xce\x33\x5b\x65\xc2\xc8\x21\xb8\x89\x4d\xc8\xa4\x6f\x9d\x45\x00\x80\xf9\xf7\x2c\xfc\x04\x41\x48\x8e\x9f\x92\xf5\x2f\x81\xa9\x83\xdb\xc0\xad\x57\xbf\x73\xc5\x29\xae\xec\x46\xb4\x96\x71\xa6\x9f\xfc\xe1\xcd\x5b\x00\x88\x01\xec\x21\xe3\x76\x03\xdb\x24\x9e\xb6\x79\x05\x0f\x07\xb0\x04\x99\x20\x6d\x17\x69\xc8\x2a\x69\xbf\x20\xb0\xd0\x69\xa6\x59\x86\x07\xb7\xbe\x5a\xf8\xd1\x13\x4e\x8e\x18\x45\xd5\x73\xf8\x24\x01\x00\xc5\x4d\x30\x1e\x9b\x8b\xad\xde\x60\x17\xac\x57\x8d\x46\x65\xa8\xb3\xd4\x65\xea\x4b\xed\x15\x70\xe5\x4a\xfb\xbe\xca\x9d\x47\xb6\x6f\xdb\xb2\xbc\x69\x71\x72\x74\x68\xa0\x91\x0c\xb8\x54\xeb\x85\x73\xe9\xc2\xb1\x23\x87\x0e\xec\x9e\x1b\xae\x24\x03\x4e\xb9\xf3\xd6\x51\x65\x2e\x12\x0a\x45\x66\x18\xfd\xd2\x45\x66\xdf\xde\xa9\x58\x84\x8e\x3a\x89\xbe\xf3\x1c\x3c\x06\x0e\x75\x4e\xd7\xa1\xdb\xf2\x99\x65\x9f\x26\xff\xdf\xa4\xb5\x55\x10\xcf\x95\xf5\xa1\x77\x65\xa3\xe7\x12\xea\x07\xdb\xba\x6c\xd6\x0f\xb6\x75\x76\x77\x68\x5d\x3a\xeb\xf7\x65\x2c\x0b\x2e\x66\xb5\xbe\x6d\xe8\xc6\x1b\x73\xda\x6a\x4a\xfb\x99\x16\x0f\x34\x71\xab\xfc\xac\xa7\xaa\x67\x52\xb1\xf0\xe3\x7b\xf6\x78\x47\xfd\xef\xef\xe4\xb3\xe2\x52\x74\xfa\xd4\x1e\xe9\x26\x4b\xa4\xf7\xed\x39\x39\xd0\x9a\x9d\x94\x18\x56\x31\x37\x2d\x3f\x76\x66\xe2\x04\xe9\x64\x34\x89\x91\x80\x40\x58\x84\x25\xb7\x7f\x24\xec\x94\x81\x60\xf7\x56\xe3\x76\x0f\xd2\x72\xf1\x50\x64\x0c\xd9\xb5\x2f\x7d\xa8\x97\xd5\xf6\x9b\xcd\x46\xa3\x29\x3f\x2c\xf9\xba\x49\xcd\x63\x14\x3d\x0d\x3c\x3f\x20\x7b\x6b\x46\x2e\x97\x4d\xdd\xda\x4f\xc3\x85\xe7\x17\xff\x1c\x02\xee\xd8\x29\xde\xff\xe8\x77\x22\x60\x02\xde\x7a\xf5\x7b\x97\x55\xe1\xe0\x49\x04\xa0\x9e\xd1\x52\x4f\xfd\xeb\x6b\x80\x06\x00\xca\x41\xce\x01\x24\x96\xa3\xb1\x6c\xc6\xa6\x13\xaa\x13\x8a\x82\xa7\x9c\x15\x3d\x50\x4b\xa5\x33\xe6\x0c\xb4\xbb\x6f\xe5\xff\xb8\x97\xdd\xae\xcf\x31\x74\x08\x78\x62\x73\x9d\xe4\x66\x21\xde\x7e\x07\x1a\xe8\xbd\x14\x4f\x15\xa9\xfb\xa9\xef\xb5\xf7\x59\xfe\x7a\xa3\x17\xce\xdd\x75\xe7\xa9\x13\xcb\x73\xc3\x83\xe5\x5c\xca\x34\x34\xc9\xc6\xc1\xcb\x77\x9e\x3a\x71\xc7\xe1\x83\xfb\x77\xed\x58\x9e\x1b\x1d\xb2\x08\xd0\xb9\x94\x26\xd9\x18\xca\xef\xc5\x05\x03\x17\x4c\xba\xb0\x7f\xef\x1e\x46\x58\x62\x66\x14\x22\xb8\x89\x3f\x18\x23\x99\x4b\xa3\x60\xc8\xd2\x60\x5b\xcf\x93\xeb\x23\xbc\xac\x37\x54\xb7\xb9\xfa\x56\x4d\xbe\xb7\x0e\x9f\x55\x32\xdd\x06\x3e\x7c\x3d\x23\x85\xce\x33\xdb\x1a\x37\x6a\x96\x45\x91\x56\xaf\x54\x8d\xa2\xd6\xed\xbf\xf4\xa6\x8f\xdd\xc1\x4b\xc3\x20\x3d\x24\xf7\x1b\x0d\x04\x7a\x76\x53\x05\x18\x37\xab\xa5\xb8\x66\x46\x98\x6a\xa9\x9a\xa8\xd6\xf4\x55\xc1\xa7\x6e\x59\xdc\x8d\x2d\xfd\x12\xc3\x1b\x89\x80\x94\xb2\xe9\x93\x0f\x6e\x3a\xbc\xfd\x20\x37\x36\xdc\x9a\xc4\xb3\xf7\x80\x68\x6c\x78\x88\xb6\xcf\x2c\x6e\x9a\x44\xf2\xd6\x23\x4f\x9d\x1e\xfa\x6d\xe1\xf1\x65\x7d\xcc\x19\x93\x0e\xdf\xf7\xf1\x73\xb2\x61\x04\x11\xb7\x79\x6f\x38\x0c\x01\x2a\x97\xcb\x05\x08\x90\x66\xb3\x83\x99\x48\x14\x3c\x71\x27\x26\x52\x10\x91\x7c\x24\x13\x12\x04\xbb\x91\x4c\x23\x31\x90\x54\xd1\x2e\x29\x48\x60\x3e\xb8\xc4\xc9\x93\x95\x22\xc6\x91\x05\xc6\x09\x01\x3f\x73\x19\xdb\x0a\x26\x64\xce\x9c\x72\x61\x1c\xb4\xcd\x64\x96\xfe\xfc\x3f\x3e\x75\xda\x8e\xda\xef\x7d\xe1\xbf\xff\x4c\x32\x5a\xad\x93\xe9\x4d\x0e\xa7\x12\x4f\xd0\xa1\xc8\x04\x8d\xa0\xe0\x31\x4a\x10\x78\x4d\x0e\x34\x6d\x9a\xcc\xd0\xfe\xd8\x02\x11\x95\x84\xca\x1c\xae\x41\x35\x09\x79\x25\x91\x4a\x69\x54\x4f\xbf\x40\x47\x97\x28\x1b\x95\xa7\xee\xa5\x1e\xa0\xfe\xa2\x7d\x0c\x5c\xbd\xda\x7e\xb0\x79\xdf\xe5\x0b\x77\x9e\xe8\xa4\x90\x7d\xdb\xb6\x2c\xcf\x8e\xd7\x4b\x99\x44\xd8\xa5\xcb\x76\x9e\xbe\xff\xf2\xa5\x8b\x17\xce\x1d\xed\xfc\xd6\xce\xed\xdb\x96\x16\x67\xc7\x9b\xd5\x52\x21\x93\x08\xeb\xb2\x9d\xa1\xbc\x1e\x9c\x73\xe1\xdc\x34\xd3\x46\x90\x51\x55\x22\x7a\x89\xc7\x43\xfc\x26\x49\xdd\x75\xea\x22\x6a\x82\x2a\x28\x80\x75\x4a\xe4\x3d\x1a\x6e\x57\xaf\xa2\xd5\x43\x99\xbf\x4d\xcc\xbc\xfd\xa5\xb7\xa6\x5c\x7e\x75\x7d\xf4\x5c\xed\x45\x4f\xc5\x7a\x38\x49\xeb\x55\x57\xad\xf0\xd9\x28\x76\x50\x77\x8a\x7a\x7b\xd8\x34\xba\x53\xbc\x48\xa2\x13\x34\x24\x11\x67\x3a\x2f\xf6\xd1\x3e\x83\x8a\xa9\x37\xba\x9d\x7d\x33\x92\xe8\xb2\xac\x74\x4d\x55\x08\x93\xa8\xff\x41\x29\x10\x96\x65\x62\xd7\xd2\x63\xfc\x87\x17\xef\xd8\xb7\x17\xd3\x23\x63\x63\x6d\x7a\xe6\x1e\xd3\x1c\x6e\x01\x79\x66\x71\x71\x0a\xc9\xdb\x0f\x3d\x79\x7a\x70\xd6\xe7\x65\x30\x7d\xe4\xd2\xc7\x2e\xa2\x58\x44\x25\xcc\xe6\xfd\xc1\x10\x8d\x4a\xe5\x62\x11\x60\x31\x00\xa2\x11\x33\x0a\xdf\x71\x8a\x46\x34\x1f\x43\x74\xae\xe2\x6d\x48\x76\x95\xb1\xab\xaa\xaa\x06\x1a\x1e\xf9\xcc\xa4\xe7\x8b\x98\x70\x2c\xfc\xb3\xc3\x15\x24\x87\xf4\x6c\x9b\x73\x97\x69\x6c\x7a\xeb\x0a\x00\xfc\xc1\x83\x78\x16\xb1\x2b\x37\x74\x84\x03\xb6\xd9\xcc\xe2\x4f\x7f\xf5\xf4\x6b\x1f\xd7\x1c\x01\x49\x1a\x38\xc6\x9e\x73\x73\xba\x99\xa0\xc7\x26\x30\x44\x36\x79\x05\x7b\x4c\x16\x00\x80\x1a\x3e\x2f\xf6\x0f\xf8\x7d\x56\xf8\xf0\x91\xf1\x2a\xe8\x84\x2d\xaa\xdf\xa5\xdb\x48\xe3\x85\xf7\xfd\x03\xf8\x6f\xac\x08\xc9\x6a\x24\x1d\xa7\x24\xaa\x46\x3d\x44\xdd\xa4\xfe\x6d\xfb\x24\x78\xf4\xd1\xf6\x63\xa3\x37\xae\xdd\x77\xe5\xee\xf3\x77\x9d\x39\x7d\xea\xd8\xd1\x3d\xbb\x36\xcf\x0d\x37\xcb\xf9\xa4\xcf\xa3\xca\x22\x81\xd4\x8d\xeb\x0f\x3e\x70\xe5\xde\x53\x27\x8e\xee\xdf\xbb\x67\xc7\xb6\xcd\x73\xa3\x43\xcd\x7a\x39\x9f\xf4\xa8\xb2\x1d\xe3\x48\x08\x57\x7d\xb8\xba\x89\x99\xe1\x59\xc6\xb5\xff\x20\x13\x71\x11\x67\x80\x44\x23\x69\x52\xbc\xe7\x01\xd4\xc9\x41\x75\xb0\x9e\x40\xd7\xcf\x40\xb2\xc5\xe6\xee\x47\xd3\x46\x6e\x0d\xbf\x41\x2c\xad\x1f\xab\x3d\xba\x3e\x9c\x1e\xed\xf1\xf6\xbb\x0e\xfd\x3d\xb5\x25\xe6\xb6\x90\x6a\x58\x19\x89\xf9\xff\x16\x55\xdd\x5c\x14\xb1\x82\xaa\x52\x6e\xd4\x47\x81\xf5\x2d\x3a\x77\x5c\xa2\x68\x75\x82\x3b\x51\x65\x76\xc3\x4a\x37\x88\x59\xff\x95\xbb\x16\x31\x13\x35\x35\xee\x0e\xd5\xb3\xc9\xa8\xe7\x3f\x6e\xbe\xe3\xd0\x6e\xc4\x8e\x8e\x8f\x8d\x12\xff\x87\x60\x7c\xa0\x9e\xa1\x85\x99\xc5\x85\x29\x22\x6e\x3f\xf8\xd4\x5a\x70\x7d\xfc\x6e\xd9\xe5\x8c\x12\x66\x65\x4f\x30\x08\x51\xb1\x5c\x29\x00\xcc\xf8\x59\x90\x3f\x08\x3d\xae\x3b\x77\x21\xcc\xa8\x44\x04\x90\xd1\x73\x4e\xa7\x1a\xf3\x7a\x12\xed\x44\x3c\x0f\xc6\x32\x81\x1f\xb3\x8a\xcf\xc7\x23\x6f\x60\x90\x73\x0e\xb5\x21\x06\x70\x62\x4a\x44\x21\x50\xc5\x38\xaa\xb7\x14\x04\x6d\xad\xeb\x00\xdb\x8b\x51\x08\xc8\x95\xfd\x2e\x8c\x02\xbe\x46\x66\xd3\x9f\xfc\xec\x3d\xaf\x7d\x46\x97\x3a\x71\x76\x34\xbe\x62\x33\x74\x33\x4e\x67\x77\x62\x04\x79\x69\x2b\xf2\x98\x1c\x6c\xf8\xbd\xc0\xeb\x0e\x0d\xf0\x82\x8e\x19\x18\x9a\xc0\x2e\x37\x02\x90\x2c\x8e\x18\x76\xa7\xf9\xf2\x47\xff\x16\x12\x9b\x8a\x6d\x94\x55\xb7\x77\xa2\xec\x3c\xc5\x50\x72\x2f\xce\x7e\xd1\x3e\xb5\x1a\x67\x17\xef\x3e\x7f\xee\xae\x33\x27\x8f\x1f\x3d\xd2\x0b\x33\xaf\xe6\x90\x78\x02\x3b\x51\x76\xf9\x74\xe7\xe3\xfb\xf6\xec\xde\xbe\xb5\x1f\x66\x5e\xcd\x61\x67\x71\x24\x14\xc4\xd5\x24\x5d\xbd\x0f\x53\x9d\x50\xdb\xbd\x93\xd9\x77\xc0\x4d\x14\x7f\xb0\x1b\x68\x97\xde\x3a\xd0\x5a\xfd\xff\xae\x4e\xb4\xde\x3e\x73\xbd\x5d\xb0\xbd\x5d\xa8\xdd\x56\x34\x6d\x90\xbe\xba\x76\x55\xbf\x71\xa8\xbd\x39\xd2\xac\xdc\xd5\xa9\x9c\xac\x72\x6a\xad\xa8\x5a\x17\x6a\x8b\x51\xdd\x3b\xa8\x66\xd2\x8f\x7b\xea\x5a\xda\xa9\x26\xb5\xff\xde\x8d\xb5\xf1\xd1\x91\x71\x72\x70\x1f\x34\xcd\xd6\x08\x92\xa6\x96\x36\x4d\x10\xb1\x9b\xc8\x9c\x31\x06\xd3\x87\x2e\x77\x63\x0d\x73\x6b\xb1\x46\xf7\x42\xcd\xd0\x4e\x1c\x61\x18\x87\x1f\x32\x3c\xb2\xbb\xe2\x3e\x28\x45\x0e\xd8\x5d\x48\xcb\x19\xc5\x48\x73\xac\x18\xf8\x09\xe7\xf0\xba\x39\x94\x8e\xca\xfe\x21\x57\xbe\x2c\xfb\x1b\x8a\xe9\x71\x97\x0d\xb6\x1b\x6d\x1a\x84\x42\xeb\x61\x18\x75\x3a\x00\xbd\xe7\x7e\x15\x21\x7f\x37\xd6\x9e\x7f\xed\xd3\xa2\xb1\x1a\x6b\x4a\xbc\x1f\x6b\x47\xba\xa1\xe6\xf3\x02\xdf\x54\x8e\xb7\x29\x71\x84\x94\x58\x4c\x43\xb2\xf7\x88\xe0\x01\xae\xbc\x96\xac\xce\xc8\xf1\x0f\x7e\xe8\xef\xc0\x2d\x5e\x81\xb6\x6e\x1d\xf5\xd7\xd4\x7f\x42\x5f\xa3\x38\xca\x4d\x4d\x53\x4f\xb7\x07\x2d\x14\x56\x74\x62\xac\x51\x2b\x15\xd2\xc9\x48\xc8\xe7\xd1\x55\xa7\x68\xe7\x59\x38\x35\x5c\x29\x64\x33\xe9\x64\x97\x86\xca\x13\x6a\xd4\x89\x27\x74\x51\xc6\xae\xa1\x28\x00\xc3\xeb\x04\x0a\x5b\x1b\x0e\xa4\xde\xae\x18\x1a\xde\x00\x76\xd5\x2d\x86\xac\x59\x73\xb7\x16\x52\xd7\x6d\xbc\xce\xf4\x66\xce\x8e\x6a\x83\x30\xb5\x46\xbc\x5e\x5b\x23\x5d\xf7\xfb\xc1\x11\xcb\xb6\xca\x4e\x7b\x4d\x6f\x83\x77\xaf\xf0\xaa\xea\x34\x20\x63\x17\x62\xa6\x23\xa0\xc5\x01\x00\x82\xd0\xca\x99\xb4\x6e\x00\x00\x38\x59\x0e\xb9\x0b\xac\xca\x1b\xa5\x00\x2d\x0d\x1c\x96\x64\x33\xc0\x42\x88\x9e\x91\x6c\x41\xba\x74\xc8\x6e\x2c\x9e\xe4\x21\xc4\x2f\x3c\xff\xde\x17\xa0\xf1\xfd\xef\x5f\x78\xed\x3f\x69\x36\x51\x10\x44\x3c\xf4\x67\xc0\x76\xfe\x9c\x93\xf0\x36\x81\x45\xb4\xa0\x37\xa2\xf3\x88\xa8\x49\x26\xc9\x3b\x3e\x35\x81\x95\x2f\x7e\xf0\x43\xdd\x75\xfe\x9f\xd4\xdf\xa1\x17\x29\x1b\x65\x50\x93\xd4\x7b\xda\x23\x96\x52\x68\x63\x74\x78\x68\xa0\x56\x2d\x17\xbb\xab\xea\x52\xed\x3c\xc1\x70\xa2\x51\x2d\x17\xf3\x59\xcb\xb4\x27\xe0\xf3\xa8\x76\x96\x12\x65\xac\xd7\x9c\x58\x1f\xcb\x02\xcf\x3a\xc9\xb2\xc2\x1b\x5c\x80\x7f\xed\x49\x5c\xd5\x2d\xdb\x40\x3c\x74\x5d\xaa\x37\xf4\x8a\x45\x23\x5c\x95\x65\xb5\x0e\x8a\xf5\x7c\xe9\xe9\x0a\x38\xba\x1a\xfb\xcc\xea\xac\xbf\xbb\xe8\xa2\xdc\x94\x64\x87\xc4\x48\x8d\x09\x27\xef\xaf\x40\x00\x50\x3d\xa3\x00\x08\x58\x91\x16\x08\x56\x44\x1b\x42\xba\x6e\x42\xdd\x28\x47\xfd\xd8\xa5\x01\xc8\x4c\x26\x68\x51\x15\x88\xa8\x3b\x15\x2d\x11\xf7\xa2\x98\xb2\x95\x06\x80\x16\x3d\xdb\x4c\xf7\x84\xf1\xfc\xf3\xcf\xbf\x87\xce\x7d\xfa\xa5\x17\xff\x18\xdb\x6c\x06\x61\x78\xfb\x97\x3f\xfe\x5b\xff\xd2\xe3\x74\x46\x79\xf3\x27\x80\x3a\x72\xc4\x86\x9d\x61\xb0\x7c\xca\xae\xa9\x9c\xdd\x4d\x00\x64\x06\x32\x23\x9d\xf5\xa6\x18\x70\x05\x1d\xb7\x5c\xb8\x57\xa8\x17\xda\xa3\x96\xd3\x6f\x64\x79\x66\x6a\x74\x78\xb0\xd9\x5d\x6e\xbf\xdb\x21\x31\x90\x5a\xb2\xd4\xe2\xc6\x2c\xa8\x5b\xb9\x98\x8f\x38\x04\xac\x18\xd8\xad\x61\xef\xd2\xc2\x26\xc6\xc6\x65\xc7\x40\x7e\x4d\x6e\xb1\x5b\xf7\xff\x26\x8e\xa4\xb7\x2f\x79\x7e\x03\x1f\x60\xeb\x86\xed\xe4\xbc\x4a\xb9\x7f\xc5\x56\x08\xa3\x1a\x91\x2e\xca\x68\x9d\x8a\x40\x3f\xa4\x99\xbe\x6c\x3e\xf1\x83\x35\xbc\x55\xbc\x51\xaf\x91\x0c\xa8\x37\xf4\x8f\xba\x2b\x49\x4f\x5a\x73\x15\x12\x92\x18\x69\x27\x63\x9e\x3d\xb1\x02\x04\xf4\x48\x44\x42\xf0\x04\x2b\xe8\x95\x4c\x68\x84\xb6\xdb\xbc\x31\x5f\x20\x3c\x1a\x89\xe5\x38\xc5\x48\x31\xee\xb8\x06\xfc\x31\xd3\xef\x43\x98\xb7\x99\x10\x02\x8e\x93\x39\x89\x41\xba\xb7\x29\x1a\x03\x7e\x0f\x0f\x32\x7b\x64\x12\xce\x91\x3b\xbe\xfb\xe1\x27\xd8\xf7\xbd\xef\x7d\x1f\x00\xa2\x5f\xf4\x34\x96\x21\x94\xc3\x08\x40\xdb\x42\x29\x22\x09\x3e\xd6\x76\xe8\xd0\xef\x7f\x8f\x17\xed\x5e\x0c\x21\xff\x81\x8f\xfe\xd6\xfb\x21\xb6\x2c\x28\x79\xd5\xd6\xa9\x9e\x28\x02\x1e\x42\x37\x28\x96\x72\x52\x11\x6a\xaf\xd5\x9f\xde\xb7\xaf\xbd\x3f\xb9\x67\xd7\xce\x1d\xdb\xb7\x6e\xde\x34\x33\x35\x36\x3a\xd0\x2c\x97\x0a\xb9\x4c\x3a\x1e\x35\x83\x7e\xaf\xa1\x29\x0e\x1b\x03\x77\x6d\x5d\xd9\xbc\x69\x61\x6e\x6a\x62\x6c\xb4\x9e\x14\x39\x4c\x19\x5e\x1c\x1c\x56\xb0\xdb\x8d\xc3\xd5\xb9\x55\x00\x51\xa1\x5f\x0b\xfd\x86\xa9\x67\xa3\x5d\xaa\x6f\xa4\x37\xd6\xbf\x94\x1a\xd6\xdc\x93\xe9\x96\x42\xeb\x4c\x14\xd7\xf6\xaa\x37\x0c\x5d\x7b\xb0\x5b\x9b\x65\xaa\x25\x52\xeb\x5d\x53\x9d\x3f\xd5\x28\xd6\x22\x8c\xc9\x98\xf5\x86\x2e\x09\x29\xdf\x10\xaf\x85\xed\xa7\xdd\x95\xb0\x2c\xc7\x14\x2d\xb2\xcd\xed\x10\x7c\x10\xd0\x76\x7b\x24\x2e\x23\x74\x27\x94\xbc\xd9\xac\x9e\x03\x6a\x08\xec\x14\x3c\x28\xaf\xaa\xd9\x58\x03\x71\x4e\xd6\x98\xe0\x80\xa2\xe4\x0a\x7e\x88\x58\x9b\x09\x20\x22\x76\x81\x77\xda\xd1\x26\x12\x30\xc7\xed\x7a\xd0\x91\xf6\x0d\xba\x05\x5b\xc3\xeb\x8d\x34\x68\x00\xee\xf8\xee\x47\x9f\x80\xfc\x47\x9e\x7d\xee\x13\xb4\x18\x98\xda\x2a\xfa\xb0\x43\x87\x87\x65\x2f\xaa\xf9\x1d\xc6\xc2\x76\x64\x73\x9d\xbf\xf0\x8d\x6f\xd8\x3a\x37\x88\xf4\xe1\x8f\x7c\xe4\x23\x18\x33\x21\x37\x00\x36\x57\xef\x9e\x78\x05\x39\xd0\x00\xa5\x51\x25\xea\x2a\xf5\xdd\xf6\x1e\xf0\xe0\x83\xed\x87\x36\xdd\x77\xf9\xdc\xd9\x93\xc7\x0e\xee\xdc\xbe\x75\x65\xa2\x59\x2d\xe7\xd3\x51\x9f\xee\xe4\x09\xa6\x3a\x0f\xa8\xb3\xc7\xac\x6a\xa4\xf3\x9b\x9b\x37\x4d\x4d\xb4\x47\x5a\xd5\x7c\x3a\x1a\xf2\xe9\x2a\x5b\xc7\x01\x17\x1d\x68\xc6\x71\xf6\xcc\xa6\x23\x68\x0e\x4e\x81\x36\x68\xa1\x90\x88\xfa\x58\x3d\x8b\x7e\xd3\xa9\x42\x40\x4f\x6d\xec\xd7\xec\xdf\xaf\x6d\x13\xb6\xa9\x07\xd7\xef\xec\x83\xeb\x3c\xb7\xfa\xa0\xb1\x2e\x78\x9c\xd0\x3d\x5c\x8d\xe5\x10\xa7\x83\x9e\x2f\x85\x75\xd8\x28\xa5\xc7\x32\x04\xdd\x74\xd8\x58\xb5\x92\x03\x7a\x2f\x27\xf6\x5e\x49\x56\xc7\x90\x21\x4c\xb5\x52\x5b\xa5\xe6\x57\xd6\x30\x67\x9d\x2f\xfc\x92\xaf\x9a\xd0\x23\xba\x9a\x08\xa7\x83\xc9\xf8\x26\x43\xb4\xa9\x6a\x64\xf2\xd6\xf7\x99\x81\x62\x7a\x8e\xa6\x87\x39\xf9\xc3\x60\x50\x42\xd8\x9d\xcb\x94\x09\x99\xe2\x1c\xb7\xfe\xfa\x70\x78\xc0\x85\xb1\xed\x83\xb7\x7e\xe4\xd4\x26\x69\x7a\xab\x97\x75\x72\x8e\xd9\xfa\x34\xf7\xbb\x60\xbb\x1c\x78\x2a\x29\x07\x91\x18\x9c\x16\xdc\x35\xc2\x3a\x9c\x66\x04\x10\x20\x10\x32\x66\x6b\xe6\x0d\x2f\x0c\xab\xee\x22\xa2\xdd\x25\xcd\xe7\x6b\x29\xf0\x0b\xd8\xad\x08\x38\x2f\xfa\x1b\x34\xb6\x2b\x26\x76\xd8\xbc\x76\x69\xfb\x87\x26\x27\xbe\xfe\x39\x49\xf9\xcc\xf7\xbe\xf1\x65\x9a\xfd\xfc\xad\x57\x2e\x5e\x7d\xe0\x22\x2f\x7d\xf6\x4b\xbf\xf7\x0a\x64\x80\x08\xb6\xe1\xd2\xb9\xf3\xe7\x2f\x7c\x0a\xec\x64\xec\x5f\xfd\xe1\x0f\x7f\xd7\x86\x19\x35\xe5\xb7\xff\xe5\x3f\xfd\xe4\xd6\xf7\x58\xe9\xa7\xc0\xfd\xdc\xd3\xb4\x4d\xca\x0a\x0e\x39\xe8\x22\x02\xc3\x39\x62\x98\x01\x90\xa7\xa1\x49\xbb\x79\xb7\xa9\xc4\x30\x51\x22\x19\x22\xfb\xb9\x4e\x9d\x4b\x31\xf0\x7b\xe8\x49\x8a\xa7\x02\x54\x99\xda\x4f\x9d\xb3\x78\xf5\xe7\xcf\xb7\x2f\xcc\x6c\xdf\xb2\xbc\x99\xa5\xf7\x2d\x6f\x9e\x69\x55\x18\xea\xd0\x01\x7c\xdc\x8b\x4b\x0a\x8e\x9f\x61\x8e\xd4\xab\x15\x54\x63\x10\x34\x98\x48\x58\x20\xd9\x9d\x13\xe3\xa0\xb5\x0a\x20\xec\xbe\x8d\x5a\x96\x51\x71\x5f\xc7\xe1\x0d\x01\xd2\x8b\x86\x16\x75\x7e\x7d\x34\x9c\x5f\xff\x7c\x66\xe2\x09\x23\x6e\xae\xaa\x78\x36\x7a\x1a\x0d\x3d\xed\xd5\x9e\x5c\x51\x00\x74\xce\x36\x30\x13\x6b\xd2\x8f\x5d\x7d\xd5\x55\x45\x87\x44\x25\x9e\xb0\x84\x61\x22\xc4\x24\x8c\x0e\xd6\x79\x74\x74\x5b\xc3\xbf\xe0\x6c\x41\x49\xae\xfb\x22\xc1\xf0\xd5\x6c\xfe\xfe\x7a\x4e\x44\x90\x2e\x8f\x5f\x79\xa4\x3e\x40\x03\xd9\xcf\x6d\x7a\x60\xf2\xe6\xe0\x18\x21\x58\x69\x2e\xbd\xf7\x95\x17\x38\x70\xeb\x67\x3c\xcf\x7f\x74\x2e\xef\x74\x95\x14\xf7\x89\x3f\x9a\x7d\x62\x3c\x85\x80\xcd\xb9\xe8\xd6\xa2\x9b\x41\x20\x4d\x3b\x69\xce\x10\x6a\x02\x2b\xef\x02\x10\x42\xe6\xaf\xee\x1d\x16\x20\xf6\xf8\x0e\xa7\xb2\x47\x07\x3c\x68\x56\x36\xd1\x81\x96\x2b\x14\xfc\x6d\x11\x8e\x37\x1e\x71\xb9\xf6\xc6\xcb\x18\x57\x1a\xd7\x0a\x95\x7d\xb7\x92\xe1\x62\xed\xe1\xe3\x91\x77\x54\x66\x10\x7e\xf7\xc7\xf5\xcc\x2b\x30\x06\xa7\xb2\xdb\xce\x3f\x7c\xa2\x10\x54\x5a\xb5\xf4\x92\x76\xe1\x2b\xcb\x71\x67\xd0\x58\xdc\x8e\xd5\x04\x56\x53\x9b\x6f\x3d\xa9\x7a\xbf\x00\x61\xce\x17\x9c\xd9\x79\x28\x22\x02\x50\x49\x53\x14\xe9\x64\x79\xf8\x5d\x74\x93\xe2\x28\x0f\x95\xa3\xf6\x50\xa7\xa8\xbb\xa8\x2b\xed\x12\x38\x7b\xb6\x7d\xae\x78\xd7\x99\xd3\x53\x93\xe3\xed\x11\x0e\x9e\x39\x7d\x64\xef\x96\xc5\xf9\xe1\xa1\x22\xa1\x0c\x9c\x76\xe2\xe0\x71\xe6\x80\xca\x78\xed\x24\x36\xb3\x7b\x17\xd8\xb2\x7e\x4b\xfb\xde\x43\x6f\x71\xdc\x7b\x3b\xba\x85\x3a\xbb\x7e\x47\xcf\xf6\x07\xc9\x86\x95\xbb\x8d\xbe\xf8\xa3\x6a\xf9\xc1\x5a\xb2\xac\xb7\x6f\xa5\x85\x2b\xaf\xae\xaa\x0b\x26\xea\x8d\xde\x84\xc9\xec\x4d\x16\xc9\x6d\xfb\x8c\xf4\xd5\xdd\xac\x94\x0d\xdd\xd2\xfa\xd7\xa2\x59\x2d\xc1\x08\x6a\x7a\xf4\x44\xa6\x70\x7f\xb3\xc0\x83\x7f\x7c\xe8\x22\x0d\xe4\xc0\xd7\xbe\xb8\xa5\xcd\x60\xda\xf5\xf2\xd8\xc0\x27\xde\xc3\x81\xc4\xf0\xe5\x2c\xc0\xc4\x2e\x1a\xb9\xd8\x72\x3e\xea\x1f\x56\x59\x96\xe1\x80\x33\xe1\x54\x72\x86\x43\x31\x7e\x58\xf5\xb0\x62\xd1\x66\x9e\xf8\xe6\xf4\xcd\x18\x3e\x7b\xdf\xe5\x01\x09\x62\x57\xe6\xd5\x3b\x06\xfd\x7f\xcf\xd8\x79\xf8\x8b\xa5\x59\xe8\x08\x6b\xc9\x91\x53\x02\xc0\x93\x43\x0f\xcb\xe2\xb7\x21\x3c\xff\x60\xbe\x72\xe8\x16\xc2\xf5\xea\xf5\xc1\xa5\x3f\x8d\x88\x80\x7e\xd7\x27\xf4\xcc\xe1\xe6\x2e\x31\xb3\xe4\x4e\x4f\xec\x2b\x6d\x2a\x4c\x7b\x24\x12\x1c\x6a\x01\x00\x70\x11\xad\x64\x52\xb2\xc4\xdf\x33\xb8\xed\x19\xdf\xd1\xb2\xdb\xdd\x02\x57\x2f\x9f\x81\x20\xe7\x0d\xce\x6f\x7b\x57\xb5\xf8\x5f\x19\x41\xb5\x76\x93\x86\xdf\x46\xe7\x28\x07\x15\xa2\xea\xd4\x69\xea\x3e\xea\x11\xea\xa9\xf6\x10\xb8\x71\xa3\x7d\x73\xe0\xfa\x03\xf7\xcf\xce\x4c\x49\x90\xba\xf6\xe0\xa1\x03\x5b\x97\x27\xc6\x06\x04\xfa\x4e\x7c\xcf\xdd\x7e\x5c\x73\xe1\xc4\xbd\xcc\x59\x1b\xc3\x31\x4e\x0f\x63\x3a\xc9\x83\x85\xa5\xc5\xf9\x53\x27\xfb\x8e\x52\x85\x56\xa1\xd5\x07\x4b\xb6\x56\xcf\xea\x5b\xe8\xde\xaf\xfa\x4a\xdd\x58\xbf\xbf\x37\x7a\xb3\xc3\xc4\xfa\x16\x45\x27\x97\xf7\x10\x25\xfd\x5d\xee\xaa\x2a\xd4\xba\x1d\xf3\x9e\xeb\x90\xb1\x76\x46\xeb\x9d\x43\xca\x98\x56\x85\x65\x5a\xd3\x1c\xc6\xea\xb9\xae\xf9\xcd\xad\xed\x77\x57\xe4\xa1\x7b\x76\x13\x95\x20\xb0\xbe\x33\x58\xaa\x79\xe2\xb2\x12\x98\x52\x12\x46\x64\x30\xee\xa9\x26\x85\xd8\xd5\x7a\x81\x83\x80\xfc\xc7\x6b\x67\x21\x90\x53\xf9\xc6\xd2\x17\x96\xdb\x0c\xb2\xe3\xc4\x37\x0a\xe2\x99\xd9\x9b\x2c\x74\x66\x00\x54\xbd\xf5\x60\x94\xe7\xed\x52\xa2\x86\x69\xce\x6e\x84\xc2\xc1\xd0\x74\x22\xad\xb9\x10\xba\xa3\xd4\x54\x19\x16\x02\x08\x71\xda\xe9\xdd\xf2\xd4\x88\x38\xfd\x58\x02\x9f\xbd\xef\xde\x01\x01\x43\xe8\xfa\xf1\x1d\x03\xfe\x77\xb1\x18\xb9\x8b\x9c\x46\x50\x6a\xc8\x84\x10\x96\x0f\x01\x00\xd0\xd6\x09\x40\x97\xe4\x0f\xc3\xd1\xe6\x75\xaf\xfe\x45\x08\xce\x5d\x2b\x96\x1e\x7b\xed\x3f\xd8\x20\xac\x56\x1f\x49\xb9\xaf\x38\x3e\x67\x43\x30\x34\xf0\xb3\x50\xf8\xdb\xc3\x99\xe5\x3b\x4f\xdc\x68\x16\x74\x96\xe0\x2d\x2b\xc0\x69\x22\x00\xf7\xcf\xd2\x08\x60\x08\xc5\x44\x76\xbf\x79\x67\xc0\x8c\x06\x16\xb2\x61\xb9\xc4\x62\x70\xf5\xca\xd9\x9c\x27\x18\x0c\xfe\x37\x04\x8b\xc5\xff\xca\x01\x4c\x0b\xba\x8d\xa2\x5f\x7f\xed\xf5\xd7\xe1\xd7\x50\x8b\x72\x51\x29\x6a\xcc\x52\x33\x7c\xae\x3d\x62\xe1\x98\x26\xf7\xef\xdb\xb9\x5d\x11\x08\xa6\xae\x3d\x78\xf9\xcc\xd1\x3b\x0e\x1f\xdc\xbf\x6f\xfb\xb6\xcd\x4b\x8b\xf3\x93\x1a\x9b\xc4\x23\xc3\xe1\x20\xce\xdf\x60\xee\x8b\x31\x69\x2f\x69\x2c\xef\xb9\x74\xcf\x36\x24\x21\x70\x66\xf5\x65\xd3\xea\xab\x17\x82\xdb\x14\x62\x37\x4e\x02\xbd\x18\x39\xb3\x01\x04\xc9\x1a\x05\x46\xba\x75\xf6\xba\x4b\xde\x02\x34\xaf\xe6\xf8\x4a\xb9\xde\x4f\x09\xb5\x35\xf3\x40\xa3\x6b\xfd\xb6\x1a\x2e\x9d\x0a\xaf\xd1\x1b\x01\x5a\x85\x43\x85\x30\x41\x40\x18\x63\x0d\x72\xb4\x16\x2e\x6b\xb9\xde\xb2\xe1\xbc\xa1\x0d\x30\x8d\xa0\xdb\x99\xd6\xec\x92\x2f\x90\x39\xaf\x44\x68\xde\xeb\xf5\x8e\x28\x74\xf6\xff\x25\xee\x3d\xa0\x24\x49\xab\x33\xd1\xfb\x9b\xf0\x91\x11\x91\x99\x11\x19\xe9\xbd\xb7\x55\x69\x2a\xcb\x64\x55\x65\xd9\xae\xea\xaa\x6a\x5b\xed\xfd\x74\x4f\xcf\xb4\x9f\xee\x9e\xf6\xbe\x67\xa6\xc7\xf4\x58\xcc\x60\x04\xc3\xc0\xc0\x80\x10\x08\xc4\x80\x0c\x20\x81\x04\x02\xad\xfc\xae\x58\xa4\xa7\x27\x76\xd1\x3e\x40\x0f\xc4\x41\x5a\xad\xe0\x21\xad\xa6\xfb\x9d\x8c\xcc\x72\x33\x3d\x80\xce\xbe\xb3\xaf\xcf\xc9\xaa\xcc\x32\x59\x1d\xff\xff\xc5\xbd\xf7\xbf\xe6\xfb\xba\xae\x55\x8b\x1c\x42\xec\x78\xfd\xf8\xd5\x13\x84\xf9\xde\x67\xd7\x34\x28\x12\x59\x7b\xfc\xc4\x78\xdf\x87\xd6\x74\x39\x6d\x66\x75\x4f\x16\x21\xbb\x36\x10\x5b\x1d\x8b\x39\xe2\xca\xa4\xec\x62\x11\x52\xa4\x99\x6c\x2e\x11\x40\x31\x67\x3c\x81\x19\xe6\x59\x3f\x83\x31\x41\x5c\x4d\x8a\x4c\x3f\xdf\x94\x27\x6f\xc4\x84\x1f\x9c\x1a\x54\x30\x21\x52\xb9\xf7\xe4\xfd\xbd\x5e\xfc\xeb\x3e\xe2\x2f\x28\xde\xb0\x9d\xd1\x08\xd3\x87\xe3\x8c\xe2\x90\x03\x5d\xc2\x6e\x19\x0f\xf6\x3c\xea\x71\xdf\x9f\x8b\x9e\xba\xfa\xeb\x77\x64\xd2\x5b\xbf\x9e\xf1\xde\xdf\x9f\xd9\x66\xc8\x88\x0e\x25\x67\x7a\xe6\x46\xa6\x7a\xce\x4a\x85\xb9\xb1\x27\xaf\x8c\x8c\xfa\x82\x39\xc9\x69\x4f\xdb\x3c\x22\xa2\x12\x9b\x34\x28\xd1\x82\x11\x8f\x9b\xe1\x49\xf0\xc5\x48\x42\x2f\x3b\x4a\x37\xfb\x02\xae\xb2\x40\xd0\x95\xef\x62\x54\x0c\x04\x62\xfe\x33\x7d\xc3\xe5\x3c\x70\x80\x81\xe2\xaf\x90\x07\xac\x1a\x5f\x10\x6a\x70\x3f\x9c\x85\xcb\xf0\xc1\xe6\xb8\x15\x4b\xf6\x5e\xba\x30\x37\xbb\x7a\x6a\x72\x42\x11\x59\x7c\xe9\xdc\xb1\x83\xbb\xe6\xd7\x8f\x35\x7b\x65\x9e\x02\x65\x45\x0c\x80\x1d\xba\x90\x49\xa5\x32\x3e\x5a\x76\xe9\x34\x71\x9a\x3b\xe4\xe6\x22\x1a\x5b\x58\x7b\x60\x3f\xda\xf5\x66\x87\xd1\x28\xbd\xfe\x73\x8a\xcc\xf7\x9a\x76\xd9\x75\x8f\x30\xf1\x4d\x1d\x90\x6f\x34\x32\x6d\x75\xc8\xda\x9b\xdc\xc9\xa2\x95\x19\x46\x6f\x38\x1b\x84\x50\x1b\x31\xfa\x3d\x3d\x4a\xc7\xc6\xb4\xfe\x5c\xf2\x43\x5c\x2d\xd0\xeb\xcc\x07\x2f\xf9\xaa\x46\xce\x57\xd5\x07\xfe\xc2\x8e\x09\xc6\xc2\x77\xaf\x3f\xc4\x20\x35\x93\xaf\xaf\xbd\x3d\x70\x55\xc0\x12\xb2\x55\xa7\xde\xff\xf1\x67\x05\x64\x46\x67\x73\x08\xc7\x8c\xbc\xdb\x15\xcf\x8b\x4e\x1f\x6d\x12\x2d\x1a\x6a\xc8\x3e\xac\x17\xc8\x84\x69\xe4\x76\x77\x55\x1d\x1a\xed\xd2\x02\x07\x2d\xff\x72\xea\xec\xa9\x56\x9c\x60\xfa\xee\xcb\xe6\xf7\xf7\x07\xfe\x03\x27\x72\x36\x99\x68\xfc\xb0\xb7\xe6\xad\x44\x93\xfe\xaa\xab\xe4\xef\xf7\x1c\x22\x5f\x57\x12\xf6\xf0\x6b\x04\x9d\xb8\x5a\xee\xba\xf5\xfa\xf7\x6d\x7a\xee\xe3\xae\xdc\x3e\xe6\x68\x79\x9c\xd0\x27\x7f\xc5\x95\x9b\xec\x5d\x5b\xce\xaf\x79\xe1\xda\xba\x42\xc2\x11\x54\x44\x23\xc4\x4f\x61\x7b\x2c\x38\xa4\x98\xc8\x48\x91\x8d\xa6\xab\xa0\xa6\x0b\xdb\xd0\x33\xf6\x51\xed\x40\x39\x62\x1f\x44\x97\xaf\x3c\x88\x5a\xf1\xc3\xea\xcd\xfb\x43\x0a\xc2\xe5\xca\xff\x60\x65\x4e\x25\x56\xcd\x06\x08\x9e\x27\xb7\x80\x87\x5e\x38\x02\xd7\xe0\xed\xcd\xa6\xa5\x5e\x78\xf8\xec\xe9\x13\x73\x23\xc3\x83\xb5\x00\x87\xaf\x9e\x3c\xbc\x6f\xd7\x8e\xf5\xd3\x23\xc3\x83\x03\xb5\x42\x40\x62\x60\x82\x6e\xdc\x48\x57\x25\xa8\x19\xa1\xbe\x6e\x5a\x57\xd9\x4c\x86\x75\xda\x2f\x3f\xb8\x83\xa0\x1d\x4b\x43\x11\x8d\xd7\x17\xb9\x2e\xef\x7d\xae\xb8\x07\xdf\xc5\x8e\x7b\x88\x1a\x3a\xad\xd3\x20\xcb\x25\x51\x47\x1c\xa3\x05\x8b\xf6\xee\xad\x9c\x08\xb2\xa4\x25\xbb\x16\xf5\xed\x58\x33\x99\x5a\x62\x26\xd1\x17\xa4\x35\x56\x6a\xb7\x75\x78\x9c\x3a\xcc\xc6\x3d\xc8\x6c\x9f\x2f\xdb\x44\x83\x96\xab\x72\xbd\x9d\xda\x86\xea\x21\xd1\xc8\x23\x2f\x29\x84\xd7\x45\x27\x4a\xdd\xe5\x62\x0f\x8f\xb0\x83\x60\x6f\xa8\xe2\xc0\xc4\x86\xfa\x22\x6b\x87\x0b\x75\xc4\x21\xa4\xb8\x87\x0d\x4a\xd6\xb8\x91\x4b\x0d\x12\xbe\x5e\x53\x10\x43\x7a\xf2\x7d\x6b\x53\x2c\x55\x44\x35\x8c\xd9\xd8\x58\x90\x10\x07\x8f\x69\x52\x48\xcc\xbe\xed\xf8\xbb\x79\x7c\xe7\xab\x6e\x4e\x55\x43\xfe\x6e\xea\xa0\x8a\x29\xf9\x5c\x0e\x46\xcd\x90\x29\x36\x4f\x37\x8f\xf3\xf6\xe2\x1d\xc5\x67\x9f\x0e\x1a\x3c\x61\x11\x42\x76\xff\x16\xbb\xef\xe6\xe9\x4b\x17\x1c\xea\xf1\xe3\x67\xef\x97\xa5\x61\x43\x72\x87\xfa\xb4\x1d\x67\x8f\x1f\x60\x9c\xc7\xcf\x5f\xfe\xdc\x85\xc7\x1e\xb9\x48\x64\x67\x4a\x17\xee\x3f\x79\x7a\x9f\x20\x54\x02\x2e\x84\x9d\x2e\xff\x83\xc7\x0e\x1f\x26\x8c\x23\x21\x85\xae\x5f\x3d\xff\xf8\xb0\xbf\xee\x74\xb8\x3c\x84\x90\x8d\x5e\xbc\xca\xc3\x6b\x36\x73\x72\x3b\x76\xa6\x31\xc1\x46\x3a\x6d\x21\x83\xc1\x9b\xc9\x39\x90\xa0\x0e\x27\xe0\x26\xbc\xbb\x39\x6a\x45\x23\xc7\x2f\x5d\x38\x73\xf2\xa1\xd9\xd6\x19\xd3\x2f\xb0\x14\xdf\x38\x77\xfa\xe4\xf1\xfb\x76\xef\x5c\x37\xd5\x1c\x6a\xf4\x57\xf3\x7e\x85\x87\x71\x3a\x3f\x4f\x27\xe3\xd4\x15\xa6\xde\x2e\xda\x93\x66\x1d\xd7\x0e\xef\x24\x8b\x4d\x4e\x1d\xc5\xda\xb7\x06\xc6\x5b\x4e\x6e\xec\xbc\x47\x6c\xe2\xb4\x98\x3c\x5a\x01\x45\x11\xb5\x11\xb2\x70\x6f\xdf\x03\x1d\x0b\x34\xf4\x56\x8e\x73\x49\x91\xa7\x85\x81\x36\x3a\x4a\xd8\xea\x79\x7d\x33\x3c\x16\xc4\xa2\xd1\x42\xc7\xb2\x55\xd4\xb5\xaa\x73\x7f\x13\x28\x6b\xaa\xaa\xf1\xf2\x35\xc6\x8d\xd2\xb4\xb1\xeb\x8f\xba\xbb\x6a\x1c\x22\x0e\x42\x7c\xfe\x1e\x07\x25\x36\xd2\x1f\x9b\x6b\x16\xea\x48\xc0\x58\xcd\x16\x7c\xb3\x5e\x84\x0c\x25\x44\xf9\xf8\x94\x86\x30\x8f\x7a\x72\xfd\xb3\x69\x8a\x10\x92\x11\x92\xd4\x10\x61\x4b\xbd\x21\xca\xe8\x1c\xa6\x49\x29\x36\xf6\xde\xd9\xe8\x44\xb8\x87\x92\x3b\xbf\xec\x16\x45\x35\x54\xdc\xce\x28\x76\x8d\x68\xde\x5a\x36\xa7\xe0\x6f\x0e\x6f\x26\x18\x21\x2d\x7a\x99\xd1\xee\x14\x7d\x8e\x4d\xee\x38\x46\x0e\xff\x56\xbb\xef\xb1\x13\xe7\x2e\xc9\xfa\xb1\xe3\xc7\x8e\x4b\xd2\xb0\xcb\xe6\x0d\xf5\x13\x65\xf7\xa9\x63\x07\x04\xe5\xa9\x27\x77\xbd\x7a\xf1\xe6\x63\x17\x18\x29\xe4\x57\xb4\xc3\x47\x0e\x1f\xe6\xb9\x5a\x0b\x25\x0e\xa7\x24\x88\x7b\xce\x1c\x7c\x08\x73\xf6\xb8\x1c\xba\x7e\xe5\xe1\x27\xeb\x89\x9a\xcb\xa3\x99\x2c\x16\x1d\xb5\x08\xae\xbb\x5d\x76\xd9\x2c\xee\xd3\x93\x58\x4c\xe3\x89\xdd\x82\x95\xb1\x00\x84\xb7\x91\x83\xa0\xc0\x10\x3c\x0d\xaf\x36\xa7\xad\x39\xa0\xa3\x4f\x3f\x75\xe5\xf2\xa5\x0b\xe7\x1e\x3e\x35\x33\x36\xda\x1c\x1e\x88\xc9\x2c\x86\xc7\x1f\x7b\xe4\xdc\xc3\xa7\x1e\x3a\xba\x6f\xd7\x8e\xb5\xd3\x63\x03\x95\x98\x9d\x8a\x6d\x63\x92\xa3\x81\x14\x8d\xd4\xe9\x60\x89\xf5\x98\xc6\x8d\x37\x9a\x92\xc6\x72\xc0\xfc\x7b\x33\x82\x3b\xee\x31\xef\xb3\xd0\x0d\x57\xe9\x74\x40\xb7\xb7\xbf\xdd\x89\xf4\x73\xc1\xc3\xb1\xa4\xe2\x32\xeb\xac\xd1\x81\xcd\x1b\x05\x21\xdf\x60\x54\x3a\xc4\x6f\x9d\x2c\x46\x32\xc5\x2d\x00\xc7\xea\x9f\x33\x7b\xea\x48\xf5\x54\x13\xb1\xe8\x60\x7e\xa2\xb7\xe0\xad\xa5\xf5\xef\xd3\x81\xf4\xcb\x6e\x77\x42\x7a\xc0\xe3\xa0\x18\x3b\x28\x0d\x65\x73\x06\xc1\x32\xe9\x8f\xae\x19\x2e\xd4\x31\x87\xb1\x3d\x5a\xf7\x30\xcc\x87\x45\xc9\xd3\x2d\x23\x16\xbd\xb7\x59\xc1\x18\x11\x49\xe2\xd3\x98\xeb\xed\x8e\x32\x8c\x9d\x27\x34\x61\x0b\x8f\xbc\xef\x78\x4f\x4f\x81\xc1\x8a\x07\x23\xaf\x1a\x64\x08\x13\x18\x35\xcb\x32\x95\x3c\x9b\xf2\x3d\x95\x58\x45\xd4\x8b\x6e\xd3\x28\x10\x7f\xa8\x41\x84\xbe\x8d\x64\x66\x1a\x73\x65\xef\xeb\xff\xe2\xb7\x6f\x76\xdb\x35\x84\x48\x21\x52\xb3\xfb\x1e\x39\x75\xe1\xa2\xcb\x76\xb4\x05\x26\x79\xd8\x90\x3d\xc1\x7e\xa4\xed\x7a\xf8\xe8\xfd\xac\xf3\xd4\xc3\xe7\xd1\x98\x16\xe2\xb6\xee\x3f\xb8\x99\xe3\x0f\xb0\xd8\x61\x93\x6d\xf2\x91\xc3\x87\x0f\x63\xde\x11\x57\x82\x57\xae\x5f\x7c\xac\x2f\x5a\x35\xfd\x36\x2f\x25\x48\x53\x7a\xbc\xe3\x97\x6e\xde\xb8\xc2\x48\x41\x55\xb1\x69\xa9\x59\xe2\x88\x31\xab\xb6\x8a\xac\x1a\x62\x08\xf2\xf5\x58\x96\x07\xf0\x4e\xb2\x0b\x18\x90\xa1\x0e\x4f\xc1\x6b\xcd\xb5\xe8\xf6\xed\xe6\xd3\x87\x1e\x7b\xf4\xda\x95\xcb\x17\xce\x9c\x3e\x79\x62\x6e\x62\x6c\xa4\x39\xd4\xe8\xeb\xad\x06\x25\x8e\xe2\x27\xad\x36\x82\x63\x87\xf6\xee\xde\xb9\x7d\xfd\xf4\x44\xb5\x18\x54\x05\x96\xc0\x46\x7a\xf9\xd2\xaa\x24\x75\x47\xa9\xbf\x8b\xf6\x64\x59\xdd\xf9\xf8\x03\xdb\x09\xda\xbe\xdc\x45\x2d\xc0\xaa\x71\xcf\xc0\xf7\x2d\x91\xb5\x1c\x5e\xdb\xe1\xf6\x72\x78\xdd\x5e\xf0\x59\x5c\x72\x18\x59\x7e\xab\x3d\xeb\xb3\x98\xd4\x58\x89\xac\x45\x78\x58\xb8\x42\xf5\x8e\xee\xae\xd5\x9a\xc4\x2e\x70\x0f\x5a\xf0\x4a\x2e\xaa\xbc\xae\x40\x57\x6a\xc9\x8e\xb5\xac\x92\xce\x19\xa9\x16\xa2\x4b\xb8\x1d\x00\x5d\xf5\x87\x37\x8f\x78\xcf\xaf\x75\x65\x6d\xa3\xfa\xe7\x30\xa1\xc3\x1b\xcf\xec\xad\xe4\x5a\xf6\x49\x63\x98\x50\x2d\x6c\x50\xc6\x86\xfa\xa2\x6b\x26\xf3\x35\x56\x20\xd8\x11\x6c\x78\x19\xf6\xce\x9f\x23\xaf\x4d\x72\x77\xc9\x3a\xd6\x7c\x8a\x57\xa1\x54\x60\xcb\xd9\x91\xa9\x3c\x4b\x6c\x48\x51\xc3\x62\x4f\x25\xce\x32\x2e\x8c\x99\x98\x2d\x3c\xf1\x9e\xe3\x2f\x72\x44\xf1\x20\xec\x53\x43\x44\x34\xa6\x34\xd5\x28\xa1\xb2\x7f\x58\xc2\x8c\x83\x22\x33\xef\xea\xae\x13\x21\x16\x59\x3f\x17\xcc\x6e\x30\x0a\xca\x8c\xe7\x4e\xdd\x16\xde\xe2\x09\x3b\xcd\x5d\x9a\xff\xe2\xa5\x8b\xe7\x3d\xc2\xa1\x93\xe7\x0e\xc8\x52\xd3\xb0\x21\xe4\x8f\x8d\x1e\x38\x76\xe8\x01\xde\x7e\xe2\xcc\x35\x34\x40\x03\x36\x35\xd0\x27\xb9\xb1\x16\xb5\xc7\x1e\xd8\x7f\x6c\xe7\x60\xd8\x87\x90\xdd\xed\x3d\x7d\xdf\xc1\x13\x84\xeb\xb1\x85\xae\x5c\x3f\xf8\x35\xa7\xaf\xc7\x08\xca\x3e\x42\xd0\x26\xdf\x98\x85\x2f\x59\x4f\x8a\x76\x4d\xf7\x15\x11\x42\x65\xcf\x84\x8c\xa9\x46\x89\x2b\xab\x0f\x0c\xb7\xe3\x1e\x15\x6f\x21\x17\x40\x86\x08\x34\x61\x0b\xbc\xd6\x9c\xb1\x18\x92\x07\x37\xac\x99\x9d\x1a\x1f\x19\x1e\xac\x94\x93\xd1\x80\xc7\xd0\x14\x9b\xc4\x52\xbc\x79\xf5\xe4\xf8\xb0\xc5\xc4\x56\x29\x77\x15\xa3\xe1\x80\xe1\xe0\xc1\xe3\xb3\x3a\xf6\x4d\x8f\xa0\x1b\x0e\x87\x61\xa3\xda\xba\xf9\xbe\x22\x59\xa8\x61\x0c\x97\x4a\x0d\xd4\x09\x8d\x7f\x81\x0e\xcc\x9f\xdd\x00\x57\xbc\x07\x8d\xb2\x73\xb1\x9e\xa1\xa2\xa4\xd3\xca\x8f\x5b\xc4\x47\x8b\x3c\x14\xba\x73\x85\x62\xa2\x93\xe5\xea\x7a\x37\x5b\xb3\x14\x13\x9d\x2c\xd7\x93\x1a\x5a\xe9\xcc\xca\x9c\x65\x95\xfe\xc1\xd3\xab\x6a\xaa\xca\xcb\x46\x6e\x58\x9e\xa9\x7a\x7d\x32\x93\x99\x3e\x99\x1d\x3e\xd2\x5f\xbd\x7f\x20\x5d\xeb\x3b\xf4\xc3\xf4\xfc\xba\xc1\xf8\x5a\x4e\x92\xbc\xf9\xf9\x35\x1f\x60\x6c\x03\x68\x4f\x2e\xc0\x4e\xbd\x60\xf6\xf0\x77\xa9\x46\x59\xc5\x65\x38\xce\x31\x36\xd1\xc5\x4b\x28\xa5\xb9\x72\x05\x3b\xfe\xcb\xea\xbe\x96\x97\xd2\xb3\xc3\xc2\xeb\xcf\xe3\x93\xbf\x34\x7a\xf1\xb7\x75\xf5\xc3\x87\x0f\x7c\x44\x92\xe7\x0e\x7c\xee\x38\xfa\x9e\xaa\x5d\x39\xd7\xbc\x82\xf5\xa4\x14\x7b\xfc\xce\x4f\x6e\x3d\x47\xbd\x31\x81\xfb\xa5\xeb\x37\x11\x08\x36\x51\xa5\x0a\xb5\xf9\x54\xa7\x7e\x49\x4f\x13\x8f\x07\x91\xf1\xbd\x92\x55\xc1\xff\x2c\x4e\xe0\xcf\x00\x07\x26\x54\xe0\x30\x5c\x84\x5f\x69\xce\x59\xfd\x69\xb3\xfb\xf7\x6e\xdb\xb0\x6e\x6a\xb2\x2b\xe3\xe6\xf0\xd9\x43\xbb\x76\x6c\xda\xb0\x6e\xcd\xec\x60\xb5\x2b\x1f\x96\x19\x58\xb7\x81\xcf\x67\xb3\xf9\x13\xf4\xbc\xc1\x14\x7b\x38\x72\x84\x3b\xc5\xb3\x29\x8d\xf5\x2a\xac\xff\x81\x4d\x78\x16\x55\x71\x1e\xa7\xf0\x62\xa9\x75\xa1\x4c\xdf\x61\xad\xb4\x6c\xc6\x2f\xc4\xa7\xbc\xac\xec\x7a\xcf\x1e\xb4\x76\xce\xcc\x4a\x6c\xb6\x76\xb2\x65\x0a\x7a\x2c\xc2\x3d\xcb\xa7\x54\xad\x93\x8e\xe9\x32\x97\x94\xa7\x48\xfb\x2c\xad\xb3\x86\x2b\x44\x16\xc6\x03\x17\x59\x83\x2d\xfe\x25\xa3\x9d\x52\x5b\x08\x61\x5b\x1b\x5c\xb6\xe4\x8d\x3b\xc2\x46\x43\x68\x0b\xc7\x0f\x15\xd3\xba\xc4\x0f\xf8\x62\xac\x74\x4a\x92\x92\x13\x12\x4f\xc9\xe4\xe6\xe0\x36\x5f\xdf\x54\xd2\x83\xa8\xc8\x44\x6e\x6d\x2b\x52\x77\x91\x2d\xf9\x7a\xf9\x63\xae\xc0\xee\x4c\xcc\xc9\x60\x0f\xc3\xb2\xbc\xdc\xfd\xc8\x85\x02\xd1\x46\x6a\x07\x88\xcd\x8f\x48\x3e\x8f\xf5\x88\x6c\xc4\x1c\x3a\xb5\x33\xb2\xdb\x5b\x93\xe9\xc0\x85\x88\x4b\x99\xca\x85\x13\x2c\xc2\x63\xf8\xb4\x3d\x4c\x47\x37\x2b\xe2\x99\x44\x74\xea\x2c\x62\xb2\x71\x77\xa0\x67\xd3\x9d\x1f\x57\x04\x4c\x71\x24\x98\x57\x7b\xe4\x71\xe7\x15\x8c\x9a\x43\x98\x1f\x1c\x7e\xf5\x96\x60\xf3\xa0\x33\x1c\xea\xca\x3e\x2a\xf7\xab\xc5\x08\xc3\x10\x5e\x8f\x31\x34\xc1\x67\x8c\xe0\xc7\x7f\x94\xcb\x20\xc6\xa6\x04\x44\xc6\xe5\xd2\x55\xc1\xb9\x2e\x9d\x22\x7a\x0a\xb1\x09\x6f\xdf\xbf\x2a\xa1\xae\x5c\x83\xa1\xb2\x61\xe7\xb9\xea\x9a\x76\x5f\x36\x8e\xe1\x0f\x5b\x15\xf7\x3a\x9c\x84\x9b\xf0\x91\xe6\x8c\x15\xc3\x6e\x78\xf0\xe0\x81\xdd\x5b\x37\xaf\x99\x1d\xa8\x15\xbd\x3c\xbe\xf2\xd0\x7d\x7b\x77\x6c\xdd\x3c\xbf\x61\xb2\x75\xc2\xe9\x56\x58\xb8\x46\xcf\x9e\xa5\xf1\xa8\xc9\x54\x28\x27\x9e\xe2\x2e\x88\x6c\xde\xc1\x06\xfd\xc7\x77\xe0\x0d\xa8\x17\x77\xe3\x3c\x46\x93\x2b\xb0\xd1\xe8\xb4\x9d\xb5\x67\x44\x7f\xde\x61\x67\x09\x17\x93\x6f\x11\xd0\x76\xca\xf1\x9d\xd0\xd4\xc2\x46\x07\x19\x0b\xec\xa7\xb5\x85\xec\xc9\x22\x38\x88\x35\x8e\xd1\x39\xf0\x2e\x92\xd8\x2d\xc3\x47\x47\xff\x63\x61\x62\xd4\x4a\xb3\x45\xdf\x00\x90\xb6\x2b\xba\x11\x8e\xbb\x32\xac\x2d\x3d\x27\x0d\x0c\xf8\xc2\x3c\x1f\x0d\x17\x05\xb1\x3e\x27\x90\xc9\xf9\xe4\xe5\x74\x2a\x1d\x74\x11\x84\x08\xcf\xd9\xdc\xe9\xed\x9b\xbb\x69\x3c\xca\x96\x7c\x7d\xbf\xcf\x30\x12\x23\x13\x66\x53\x38\xe6\xa4\x24\x45\xec\xdd\x8f\x9e\x2f\xb2\xb6\x91\xea\x01\x6a\x0b\x60\x8c\x03\x03\x24\x55\x2e\xf7\x50\x85\xe1\x05\xc2\x50\xc6\x96\x4a\xe7\x03\x81\xa3\x61\xd3\x36\x95\x0b\x27\x31\x41\x04\x87\x63\x98\xdb\x30\x8c\xa8\x3d\x92\x5c\x27\x5c\xc0\xf1\xe8\xd4\x50\xd8\x83\xb8\x75\x3d\xb5\x8d\x77\x7e\xda\xcb\x63\x4c\x7c\xde\x2e\x97\x33\x41\x06\xdd\x65\x7f\x17\x46\xcd\x06\xe5\x86\x9a\x1f\xbf\xc6\x2b\xe8\x13\x2c\x23\x29\x1e\x06\xd3\x7c\xf2\x31\x5b\x9f\x3a\xed\x6c\xc3\x46\x8b\x1a\xa1\x5f\xfb\x5e\x36\x8f\x18\x9f\x66\x13\xd8\x42\x8a\xeb\xaf\x19\x49\x84\x30\xb2\x47\x99\x75\x6b\xbd\x9f\x68\xc1\x66\x90\x21\xb2\x22\x2b\x4a\x2d\x9e\x06\xce\xc2\x4d\x18\x1f\x03\x1b\x04\xa0\x1f\x8e\xc3\x55\x78\x1c\x9e\x85\x5f\x6b\xae\xb7\xa6\x8f\x07\x9f\x7d\xfa\xa9\x27\x8e\x1d\x9a\x5d\x3d\xbd\x6a\x6c\xa4\xa7\x18\x6c\x85\xb5\xcf\x3e\x7d\xfb\xd1\x9b\xbb\x77\xce\x6f\x98\x18\x1b\x19\x1e\xec\x29\x8b\xf4\x34\xbd\xfc\x94\x87\xa9\x3a\x68\x32\x7e\x82\x3b\xab\xb0\x79\x83\x0d\xaf\xbb\x85\xaf\x5f\xc3\x13\x78\x10\x95\xf1\xcd\x3c\x5e\x3c\x0e\x35\xda\x24\x78\x1d\xa9\x2d\xb4\xa0\xfb\xf3\x8b\xb9\x88\xc5\x83\xd1\x3d\x46\x8c\x97\x85\xb8\xb1\x4e\x2e\xa5\xad\x25\x52\x5d\x86\xa5\xfa\x82\x91\x59\x3c\x16\x95\x50\x72\x39\x11\xb9\xc5\xfd\xc4\x2d\x98\x92\x65\x19\xb8\x65\x7a\x77\xf5\x9e\x8e\xdc\x9d\x6e\x35\x2c\xa6\x92\xf5\x21\x54\xaf\xb8\xcc\x64\xcc\xe2\xe3\xaa\x70\x46\x09\x7d\xc2\x11\x4b\x05\xdc\xa9\xec\xb4\xaf\x3f\x99\x32\x84\x9d\x26\x43\xd8\xd1\xc1\xed\x3e\x06\x91\xf1\x8d\x91\x1b\x27\x62\x06\x41\x08\x53\xce\x77\x7b\x77\x01\x31\xb9\xa0\x52\x50\x26\x38\xba\xae\x3c\xbe\x5f\x50\xfd\x82\x99\xd3\xf3\x22\xa5\xb2\xa7\x7f\x55\x30\x93\xce\x30\x92\xc3\x1f\x51\x31\xc6\x44\xe7\x29\xc3\xa8\xf1\x6e\xdb\xba\xc4\x0e\xdd\xce\xbd\x12\xf4\x28\x43\x29\x8e\x0b\x26\x39\x4c\x9b\x61\x81\x11\x82\x3a\x2b\xf1\x5b\x18\x82\x38\x16\x47\xcd\x0a\xcb\xf7\x8d\xf2\xf9\xcd\x8c\xff\x12\xb3\xdd\x0c\x0f\x8e\xf1\xec\x06\xd5\x21\x88\x3d\xeb\xef\xfc\xcb\x00\x4b\x13\xbe\x2e\xc3\xa9\x1b\x89\xd2\x15\x86\x0c\xea\x69\x96\x5d\xb7\xfe\x99\xf3\x8c\x16\xd1\xae\x2a\x91\x0f\xfd\xa7\x46\x83\xb0\xb4\xca\x08\xf9\x09\x84\xed\x71\x2c\x15\x77\xcb\x8c\xe8\x10\xcc\xe4\x23\x24\xad\x9b\xb5\x00\x47\xb1\xe0\xf0\xf3\x98\x62\x1b\xaf\x6a\xa8\x66\x8b\x67\x53\x43\x88\x2a\x46\xa4\xb6\xfa\x05\xaa\xf0\xbc\xca\x57\x90\x48\x38\xa6\xdd\x87\x8f\xc3\xf8\x14\x78\x20\x0b\x53\xf0\x38\xbc\x08\x1f\x82\x3f\x6b\xee\x46\xaf\xbc\xd2\xfc\xf0\xcc\xfb\xde\xfb\x9e\x77\xdd\xba\x79\xf0\xc0\xbe\xf5\x6b\xc7\x07\x72\x2e\x87\xcc\x52\x78\xe9\x3d\x6f\x7f\xfa\xfc\xd9\x93\x27\x8e\x1f\x3b\x72\xf8\xc0\x7d\xfb\x76\x6c\xdf\xba\xd9\x2a\xd7\x8f\x8f\x36\x13\x26\xbf\x76\x3d\xdf\x1c\x1a\x6a\x06\x69\xa5\xfb\x09\xee\x39\x2f\xdb\x17\x61\x0b\xbb\x1e\x7c\x19\xbf\x84\x37\xe2\x19\xb4\xb9\x89\xfb\x30\x3a\xbb\x6c\xc0\xbd\xdd\x2d\xbb\x00\xb8\xff\x95\xb9\xd4\x0e\x02\xcf\xc2\x2b\xcb\x11\xf8\xca\x9b\xcb\xbe\x8b\x94\x6e\xed\xca\xfe\x72\x34\xa6\xde\x0c\xc7\xfa\x3d\xf1\xd8\xe9\xca\xb7\x14\x4e\x5a\x40\xac\x95\x6b\xed\xf7\x6a\x1d\xa5\x38\xcb\x9b\x2e\xc7\x66\xfb\xf8\x65\x41\x73\x49\xd9\xaf\xa7\x5e\xae\x73\x6d\x29\x64\xd3\x85\xc4\x70\xde\x91\x8b\xd9\xf5\xa4\x18\x52\x6c\xaa\xe2\xab\x78\xaa\xbc\xdf\x90\x2b\xde\xf2\xd1\xfe\x40\x90\x65\x9b\xc3\x16\x44\xa3\xf1\x4d\xb1\x6b\x1d\x8c\x72\x34\xf8\xe4\xae\x02\xc6\xd8\xd3\xb5\x02\xa4\x84\x73\x28\xe1\x58\xb7\x33\xa4\xba\x72\x82\x5d\x66\xb1\xa0\x3c\x36\xa4\xa9\xc8\xe7\x5c\xc5\xd9\x53\xbb\x15\x69\x09\xaf\xf9\x2d\xa5\x05\xb8\x0a\x94\x1d\xad\x85\x13\xac\x3f\x7c\x56\xe2\x48\x66\xa7\xc3\x27\x06\x1a\x09\xf4\x3d\xea\x11\x5d\x4c\xc1\x1e\xd2\x7d\x02\x42\xac\x21\x7b\x90\xee\x93\xdc\xa1\xc6\x19\x92\x0a\xad\x1e\x1a\xed\xe0\xb6\x96\x29\xdc\xf9\xf1\x12\x70\x27\xb4\xcb\x94\x0c\x06\x55\x95\x8a\x1b\xe7\x9f\x39\xb3\x88\xdc\xc1\x06\x61\x9d\x09\x06\x33\xbe\x09\x4e\x73\x08\x26\x6f\x28\x1c\x42\x22\xbb\x8a\x41\x2c\xb6\x65\x1b\x92\xe2\x53\x8e\x6c\x5b\x44\xb1\x68\x8f\x31\xb8\x0d\xe2\xba\x12\x0c\x55\xc7\x10\x55\x6c\x72\x33\x57\x79\x98\x46\x0b\x0c\xa2\xaa\x33\xac\x77\x2c\x65\x04\xdf\x06\x06\x54\x2b\x8e\x3e\x0b\x8f\xc2\x73\xf0\x95\xe6\x0e\xf4\xfc\xf3\xcd\x17\xb6\x3f\x77\xfb\xc9\x27\x1e\x3a\x71\xec\xc8\xa1\x07\xf7\xee\xde\x3c\x3f\x58\x8d\xda\x78\x06\x3f\x73\xfb\xa9\x27\x2f\x9d\x79\xe8\xc4\x41\xab\xeb\x7b\xfb\xcc\xf8\x60\x9f\xc8\x12\xb8\x49\x07\x02\xcc\x80\x4e\xf3\xd9\x24\x57\x3e\xc7\x5d\xd5\xd8\xb2\x9b\x8d\x9f\xda\x8e\x46\xf1\xad\xc7\xee\x23\x23\xf8\x40\x1f\x2e\x63\x34\xb3\x04\x61\xb3\x31\x3c\xbc\x28\x4f\x88\x3a\x45\xae\x7f\x0f\x70\x17\x90\x3b\x03\xcf\x2f\x47\xee\xf3\x0b\xb1\x99\xe5\x30\xad\x36\x94\xa5\x72\x97\xe5\x89\x17\xed\xe7\x1b\x20\x5b\xb5\xda\xb7\x3b\x81\x5a\x7d\x01\x8c\xc6\x02\x12\xad\x58\x7d\xb9\x61\x5d\x39\xd5\xcf\xaa\xc8\x72\xc4\x1d\xa0\xa6\x86\x50\xeb\xf8\x58\xe7\xac\x78\xae\xac\xc5\xb7\x84\x7d\x5b\xfc\x65\x23\x95\x72\x38\x42\x62\xb0\x3f\x10\x66\xd9\x70\x2c\x27\x08\x95\x69\x84\x27\x37\x85\x6f\x2a\x9e\x99\x68\xdb\x2d\xd3\xf0\x13\x3b\x0b\x88\xc4\xe2\x42\x21\x9b\x66\xbe\x4d\x88\x78\xd6\x61\xf1\x88\x70\x32\x65\xc4\x9e\xab\x57\xd2\xac\x3c\x5c\xdf\xcf\xda\x02\x9c\x37\xef\xcc\x18\x69\x6c\x7a\x62\xbd\x8a\xc7\x5d\xb0\xab\xc1\xd0\xe7\x23\x2e\x9e\x61\xc7\xab\xa1\x38\x62\xe9\xc8\x1a\xac\x78\x29\x4a\x4f\xcb\x5e\xdc\xe7\xca\x6f\x8c\xa4\xc7\x23\xdd\x7a\x21\x6f\x98\x31\xdb\x8b\x38\x11\x99\x1a\x0f\xb8\x11\x1d\x2c\x0b\x62\x2b\xa6\xeb\xe5\x10\xc6\x71\x77\xc5\xe5\x4c\xe2\x71\xfb\x65\x8a\x87\x34\x25\x48\xf9\xa9\x55\xef\xbd\xaa\xf2\x06\x7a\x82\x30\xa2\xed\xfd\x05\x39\xe4\x53\xab\x7e\x56\xe0\x38\x39\x1b\xd5\xa2\x7a\xe0\x97\xff\xba\x5a\x23\x8c\x92\xe5\x58\x6f\xb7\xbb\x9b\xf8\xcc\xe8\x80\xcd\x43\x5c\x39\xbb\x9e\x4e\x7e\x4b\xb1\xe7\x2b\x63\x98\x2a\xa4\x5c\x9b\x79\x81\x6a\x51\x56\xe2\xb2\xac\x16\xb0\x2c\xe8\xff\x40\xdf\xc3\x1f\xb5\x34\x82\xaa\x70\x02\x2e\xc2\x63\xf0\x91\xe6\x6a\x74\xeb\x56\xf3\xf1\xd9\x47\x6e\x5c\x7b\xe0\xc0\xa6\x8d\xfd\x09\x97\xca\xe3\x47\xae\x5d\x38\x73\xec\xbe\x3d\x9b\x36\xae\x5f\x3b\x3b\xd2\x9b\x49\xd8\x55\x16\xba\xa9\xf7\x12\x97\xb2\xb3\xa9\xd2\x39\xf6\x21\x89\x8d\xe8\x6c\xa1\xc0\x56\x8e\xac\x9e\xea\xc5\x3d\x35\x1c\x59\x26\x7b\xd3\x18\xb6\xaa\x1d\x5a\x9b\x53\xbb\x13\xe5\xfd\x7c\x94\x2d\x0a\xe0\xdc\x5a\x8e\xae\x5b\x8b\x29\xcb\xf6\xdc\xb5\xd9\x66\xb5\x2b\x22\xd2\x89\xf9\xad\xc2\xd8\x62\xf3\x6d\x5b\x7e\xd1\x72\xbb\xc4\xf2\xa7\x9d\xe0\x4e\x5f\xb2\x6e\xa9\x45\xc5\xbe\x45\x9e\xe2\x61\xbc\xd0\x11\x61\x71\x29\x38\x2d\xb9\xcd\xb6\x62\x5f\x0b\x60\xd1\xee\x24\x57\xef\xd9\xc9\xf0\x3d\x7c\xa2\x24\xba\x82\xe1\x54\xd2\x6f\x6a\xc7\x8e\x73\x23\x45\x29\x30\x97\x34\x09\xc2\x36\xff\x33\xc7\xd2\x7e\xdb\xec\xec\xec\x1c\x0e\x07\x7a\x0f\x47\xdc\xa5\xec\x29\x4d\x45\xac\x18\xe2\x8f\xa5\x3c\x0e\xea\x23\xb2\x7b\xc7\xde\x75\x13\x63\x6a\xdc\xee\x22\x9c\x23\x9b\xe9\xe2\x34\xc5\xcf\x18\x54\x74\xc7\x05\x8e\x0d\x65\xa8\x9d\x4a\x9e\x54\x9a\x91\x56\xc5\xa4\x88\x9b\x22\x52\x2c\x95\x8a\xe9\x84\xd7\xcd\xe0\xfe\xb8\x1b\x05\xf0\x83\x5a\x94\x41\x95\x03\xbc\x3d\x1a\x7a\x15\x05\xdc\x65\x16\x67\x07\xee\x7c\x16\x21\xe4\x0f\xe4\xd9\xb8\xdf\xb6\xed\x06\xa5\x8d\xdc\x45\x51\xac\x7b\x4c\x8c\xbb\x1d\xf1\x1a\x8b\xd0\x2b\xac\x42\x49\x7f\xf2\xaa\xda\xaf\x96\x03\x0c\x5b\x61\x39\x86\x61\x92\x51\x4d\x65\x44\x2d\xc8\x3a\x12\x33\x8d\x1c\xaf\xf3\x4a\xc0\xc6\x72\xcc\xba\x39\xa2\x27\x19\x3d\xbb\x2a\x76\xe7\x26\x16\x39\x4e\x65\x99\xd8\xef\x2a\x1c\x8f\x30\x5a\xc2\xcf\x4b\xc0\x83\x13\x2a\x70\x0c\xce\xc3\x75\xeb\xfc\x78\xe3\x46\xf3\xe6\xec\xd5\x2b\xc7\x1f\x3c\x78\xe0\xbe\xf9\x0d\xf5\x84\x8d\xc7\xd7\xae\x5e\x39\x77\xfa\xe8\xde\xdd\xf3\xad\x53\x64\xb3\x9e\x49\xd8\x6d\x2c\x74\x51\x2f\xe5\x84\xd2\x19\xae\x7c\x81\x4b\xd9\x55\x36\x25\xb0\x11\x97\x05\xa3\xf2\xe1\xd5\xd5\x16\x84\x9a\x6f\x20\x83\xb0\x00\xa4\xb5\x9f\xbd\x05\x86\xde\xe2\x9c\xd0\x84\x1b\xcb\x51\x74\x63\x05\x8f\x86\xd9\x99\x77\xb3\x50\xd4\x56\x5b\xbd\x17\x8a\x2c\x10\x75\x74\xe0\x96\x40\x64\x65\xb6\x5b\x00\x1a\x46\x2b\x41\xb4\x90\x15\x68\x33\x72\xbc\x09\x44\xb1\x5a\xcf\xe3\xd9\x80\x2b\xcb\xda\x6a\x63\xbe\x94\xcf\xd4\x12\xd3\x53\x09\x6e\xa4\xe8\xad\x67\x22\x6e\xbc\x88\xa0\xb9\xb5\xab\x67\x48\x24\xd0\x7b\x30\xb1\x2a\x7b\x4a\x1b\x66\x58\x99\x97\xf7\xc4\x0c\x3b\xf5\x31\x22\xa7\x96\x6f\xcf\x94\xa7\xa2\xc5\x00\xc3\x70\xb5\x44\x95\xd7\x14\x9f\x2a\xb1\x7c\x68\x3c\x32\x86\x15\x87\x46\x6d\x3e\x9b\xe2\xad\xbb\xec\x7d\x16\x7e\x4a\xc5\x52\x31\x91\x6e\xe1\xe7\x6c\x04\xc3\xbe\x2e\xac\x45\xbb\x27\x0f\x22\xbf\xbb\x8c\x11\x42\xd9\x81\x3b\x9f\xc3\x18\x79\x7c\x25\xd5\x13\x94\xb6\x5d\x67\x48\x0b\x3b\x42\xaf\xc7\x44\xa4\xbb\xd6\x82\xce\xcb\x1c\x23\xcb\x3e\x6e\x28\xf9\xb0\x05\x1e\xc2\x39\x64\x3f\x4f\x51\xa9\xe8\xe4\x38\x2e\x45\x9d\x89\xe9\xa1\x9c\x53\x90\xc5\x9c\x10\x9f\xd0\xd3\xc4\x11\x41\x88\x1c\x18\x90\xef\x3c\x8d\x16\xb1\xc3\x73\xc8\x6f\xf9\xbd\xff\x8e\xbe\x83\x9f\x02\x15\xdc\x30\x00\x27\xe1\x12\xdc\x82\xe7\xe0\x37\x9b\xf3\x96\xdf\x6b\x3e\xf3\xd8\x8d\x9d\xdb\xb7\x6e\x9e\x9a\xcc\xeb\x0a\x8b\xe1\x99\xdb\x8f\xdc\xb8\x78\xf6\xc8\x7d\x7b\xe7\x37\x4c\x4d\x8e\x8f\x36\xbb\xf2\x2e\x5d\xa6\xbd\x34\x74\x8a\x73\x89\x3c\xa7\xf5\x9c\xe7\x3c\x67\x39\xcf\xe3\x5c\xd1\xc5\x16\x35\x36\x53\x65\x7d\x9e\xdd\x43\xd7\xae\x5c\xc6\x19\x8c\x8e\x2c\x5a\xa1\x46\x69\xe9\x98\xd9\xc1\xd0\xcf\x80\xd1\x5b\x55\x50\x8e\xdc\xcb\xd9\xbd\x71\xfe\x64\xc9\x26\x2d\xa2\x69\xb1\xe4\x6a\x4d\xa2\x2c\x59\x25\xeb\xd9\x32\x0b\x54\x42\x56\x92\xb2\x67\x61\x4e\x3c\x16\x5d\x7e\x6c\x58\xc0\x9c\x15\x89\x59\x58\x22\x16\xe9\x80\xf5\xe7\x39\xcb\x36\x71\xf5\x9e\xaf\x7b\xbb\xfd\xe9\x64\xd9\x1f\xf0\xfb\x73\x95\x40\x21\x5c\x6e\x7a\x25\x7a\xec\x38\x3f\x92\xef\xf1\x15\x03\x26\x46\x58\x24\x36\x57\x7a\xd7\xb1\x09\x69\xd5\xfa\x0d\x13\x34\x12\xec\x3d\x18\x4f\x84\x42\x23\x0d\x7e\xa4\x31\x1d\x36\xab\x1c\x71\xa6\x83\x7d\x9c\xaa\x78\xbd\x8c\xc8\xb1\xaa\xa7\xe9\x1d\x92\xa9\xdd\x69\xb8\x72\xb9\xbe\x54\xb4\x8b\x57\x23\x52\x54\xa5\x1e\xa2\x84\x6f\x8a\x71\x93\x2d\x96\x0a\xc5\x24\xcb\x10\x44\xbd\xf1\x49\xc5\x67\x73\x06\x0c\x42\x53\xeb\xb0\x0f\x37\x7d\x43\x54\x98\x1a\xc1\x08\xe1\xfa\x76\x96\xe4\x5f\xc0\x83\x6e\x85\x25\xd9\xbe\x16\xd8\x88\xe9\xef\xd2\xbc\x41\x69\x46\xae\xf8\xbb\x19\x76\xd7\x0d\x11\x09\x03\x86\x1b\xd3\xa2\xc7\x53\x14\xf8\x61\x8a\x50\xc9\xcc\x8a\x8c\xea\x67\xb4\xc4\xf4\x70\xd6\x6b\x13\x59\xd6\x86\xe5\xda\x21\x84\x02\x2e\xc4\xac\xde\x20\x72\xb2\x47\x53\xb2\xb7\xd4\x01\xb5\x12\xc0\x42\x2f\x77\x0b\x4b\x92\x9d\xd2\x08\xda\x84\x68\xda\xc5\x6a\x51\xe9\x93\x0a\x11\x31\xf6\x01\xdf\x41\xdd\x63\x20\x80\x0a\x5e\xe8\x83\xe3\x70\x1e\xae\xc1\xe3\xf0\x7b\xcd\x6d\xe8\x89\x27\x9a\x4f\xce\xdd\x7a\xe4\xea\x15\x8b\x83\xe2\xbe\x4d\x1b\xf3\x8a\xc4\xe1\xc7\x1e\x69\xd9\xad\x63\x7b\x77\x5b\x8d\xa1\x63\x8d\xae\xbc\x5b\x97\x45\x06\x7a\x68\x34\xdc\xcb\x9d\xbe\xc0\x15\xdd\xba\x8b\x2d\x56\xcf\xb0\x27\x4e\xb3\x27\x34\x36\x5d\x66\xfd\xbe\x23\x33\x37\x06\xf0\xf5\x7e\x9c\xc6\x4b\xed\xef\x8d\xe1\xe5\xe8\x6b\xb4\xb9\xda\xb5\x7b\xf0\xef\xff\xac\x90\x6b\xb1\x25\xfe\x89\xe5\x08\x7c\x62\xc1\x21\x5a\xc3\x98\xa9\x61\xb4\x84\xc0\xb6\x45\x8b\x25\x57\x04\x59\x6d\x8b\xa6\x2f\x7a\x45\xcb\xac\xb5\x13\x62\xc8\xf2\x89\x4b\x70\x5c\x61\xca\xac\x40\xab\xd3\x14\xe0\x5c\x52\xb0\xb5\x4c\x99\xd5\x56\x9c\x4c\xd5\x5d\x15\x7b\xd2\x65\x64\x8d\x94\xae\x5f\x5f\xd7\xf0\x97\x8d\x91\x9c\xc7\x23\x27\xa6\xa6\xe2\x6c\xb3\xb0\xbe\x10\x30\x5b\xe1\x15\xc7\x84\x9e\x3a\x9e\x0a\x48\xb3\xb3\xb3\x33\xa7\x0e\x85\xdd\xc5\xf4\xc9\xe8\x46\xcc\xcf\x85\x34\x99\x62\x53\x65\x1d\x5d\x4f\x5f\x9a\x09\xbb\x6b\x94\xd5\x93\xa1\x5e\x97\xcd\xcb\x3b\x90\x8d\xe7\xc3\xdd\xa1\x20\x51\x42\xf5\x44\x12\x87\x63\xe1\x48\xd7\x71\x2d\x8b\x69\xa1\x58\x2a\xc6\x32\x01\x83\xc1\x67\x42\x93\x58\x94\x93\xc5\xa0\x88\xab\xae\x9c\x4b\x4f\x9b\x55\xb7\xe9\x59\xd7\x0c\x0c\xba\x4f\x21\xbf\xab\x8c\x5a\x26\xae\xff\xce\xe7\x18\xc3\xd7\xe5\x72\x26\x69\xd3\x7c\x84\x63\xfa\x73\x17\x05\xe1\x10\x21\x25\x2d\xd6\x8f\x11\x7a\x3b\x15\xf8\x89\xe4\x83\xf2\x80\x56\x0e\x4a\xa2\x33\x4c\x29\x2e\x99\x59\x86\xd7\xfc\x54\x3b\x3e\x9c\x15\x55\x62\x08\x5c\xa1\x91\x0b\x12\x47\xa8\x96\x49\x92\x70\x38\x52\xec\xbb\x73\x1d\x89\xd4\x4d\x69\xf8\x4b\x0a\xc7\x07\x1e\x63\x54\xd9\x81\x93\x72\x7b\x9e\xf3\x1b\xf0\xf7\xf8\x2f\x41\x04\x2f\x54\x61\x1c\x9e\xe9\xcc\x52\x24\x06\xfa\x4a\x85\x4c\x2a\x16\x09\xf8\x4c\xa7\x80\x47\xea\x89\x48\x28\xe0\xe3\xa0\x90\xcb\x10\x27\x35\x2b\xdd\x26\x55\xed\x2a\x95\x3c\x36\xce\x18\xae\xe1\x6e\x9c\x40\xaa\xb4\x14\x4f\x35\x16\xd8\xe8\x1b\x6d\x9d\x54\xed\x75\xb3\xf1\x73\xbc\xdf\xc8\x5b\x4c\x51\x84\xd0\xc2\xd4\x4a\xb9\xdd\x37\xbc\x44\x92\xba\xd0\x08\xde\x69\x03\xb7\x78\x52\x2d\x71\xc1\x64\x8a\xad\x2c\x0e\xe3\xaa\xac\x18\xf1\xa7\x75\xa7\xe8\xda\xe0\x34\x54\x55\x47\x08\xb3\xaa\x12\x08\xcb\x9e\x40\x00\x49\x52\x7f\x31\xc3\x28\x01\xe4\x72\x9b\x2e\x4a\xf0\xc3\x6e\x5d\xec\x0d\x33\x92\x91\x4e\x4a\x82\x3b\xd6\x8f\x3f\x22\xb8\xdd\x74\x2a\x9e\x90\xf4\x0d\x6f\xa7\x88\xec\xde\xb3\x7b\x37\x55\xdf\xf9\xce\xe2\x9d\x77\x69\xd4\x17\x13\x48\xd7\xd7\x5e\xc7\x0c\x1f\xf1\x50\x84\xd9\xc3\x87\x0e\xa1\x3e\x5f\xd8\xf7\x00\xeb\x4c\xe3\x90\xc3\xd1\x5b\xde\xd8\xee\xf6\xfe\x5b\xf8\x16\xfe\x30\xc8\xe0\x85\x29\x78\x57\x73\xc4\x52\x56\x18\x18\x1b\x1e\xec\xad\x57\xba\x0b\xb9\x4c\x2a\xe0\x33\x25\x96\xe2\x55\x56\xf1\xa1\x94\xcb\xa4\x2c\x42\x4a\x53\x00\x27\xb5\x79\xec\x2a\xe7\x34\x46\x26\x4a\x28\x86\x23\xb8\xcf\xb6\x24\x05\xd3\x68\x1f\xf0\x1b\x6d\x02\xaa\x5f\xe4\xee\x5c\xd2\x85\x79\xb3\xac\x42\xa7\xd2\xb0\x7c\x46\x68\xa1\x21\xdf\x62\x34\xb4\x04\x84\xad\xe1\xe8\xce\xd0\x4a\x67\xd5\x63\x4b\x53\x2b\x6d\x3f\xa0\x84\x63\x76\xbb\xa2\x8a\x0c\x29\x8f\x3a\x75\x87\xd3\xe1\x20\x9c\x20\xa4\x22\x32\xc1\x98\x55\xa8\x8d\x97\x18\x1f\xd6\xc3\x5e\xe2\xb0\x97\x33\x71\x46\x0c\x23\x91\x6f\x16\xa8\x2c\xba\xa9\xcd\xe1\x34\x5c\xdd\xa6\x82\x23\x8d\x3e\x82\x5d\xb2\x34\x51\x76\xaf\x65\x11\x42\x9f\xff\x02\x36\x0f\x1c\x38\xf0\x3c\x2b\x4a\x6e\x41\x42\x42\xdf\xc0\x4b\x2f\x9b\xac\x3d\xc1\x44\x3e\xff\xff\x60\xca\x86\xdc\x68\xd5\x4e\x7b\x50\xb4\xa9\x01\x86\x9d\xcb\x7b\xda\xab\xfe\x63\xf4\x20\x7e\x1a\x54\xf0\xc1\x3a\x78\x4f\x73\x14\xad\x5f\xdf\xdc\x10\x5d\xb3\x7a\x72\x6c\x78\x70\xa0\xaf\xb5\xc8\x61\xb7\xd3\xa1\x29\x22\xcf\x62\x98\x5d\x3d\x35\x39\x32\x38\xd0\x57\xaf\x74\x97\xa2\x9a\x4c\xdd\xd4\xa5\x3b\xa9\xd7\x45\xbd\x85\x59\x3c\x82\x02\x7e\xbc\x38\x84\xdc\x68\x4f\x0a\x69\x6f\xd4\xe9\x7e\x8b\x25\x5f\xbe\xee\x25\x58\xbf\x7c\xdd\xd7\xaf\xc8\xe0\x2d\x4e\xad\x0c\x20\xc3\x9a\x5a\xa9\x55\xeb\x95\x20\x6a\xb3\x17\x74\x5a\x55\x56\xce\xad\x2c\xc8\x09\x3a\xa3\x6c\xac\xb5\x15\x49\xae\xa7\x1e\x44\xef\x75\x77\xbb\x72\xb1\x62\xbf\x4f\x55\xa2\x83\xe9\xa8\x77\x93\xd3\x99\x20\xc3\x01\xc7\x41\x81\x71\x33\xb5\x44\xce\xf0\x48\x8c\x6a\x26\xbc\xbe\x44\x3e\x9f\x4e\xf0\x76\xdc\x4b\x0d\x3d\x81\xfd\xf1\xb8\x2f\xca\xf2\x41\x0e\x39\x62\x5a\x84\xb1\xe3\x66\xa0\x8f\x75\x8c\x0c\xf2\x38\xbd\x5f\x22\xe1\xb5\xe4\xf3\x97\x86\xd8\x47\x1f\xe9\xdf\xc3\x07\x78\x41\x5e\x93\x4c\x50\xb7\x97\x60\xc4\xd5\x37\xbb\x04\x35\x84\x84\x9e\x9e\x27\x6e\x13\xc6\xef\xc1\x18\x33\x6f\x47\x84\xb4\x36\x05\xb9\x92\x8c\x61\x59\x99\x1f\xa3\x53\xf8\x63\xc0\x82\x0a\x7e\xd8\x08\x1f\x6f\xce\xa0\xf9\xf9\xe6\xa6\xc8\x86\x35\xb3\x53\x93\xa3\xcd\x46\x7f\xd9\x1a\x85\x8b\x85\x3d\xad\x1d\x11\x18\xbc\x6e\x76\xf5\xd4\x78\xd3\x12\xc8\xac\x95\x72\xd9\x88\x47\x93\x39\x02\x86\x93\xfa\x4c\xea\x2b\x8c\xa3\x9e\x96\xcd\x09\xe2\x00\x5e\x3e\x1b\xde\x58\xd8\x98\x5f\xd4\x5b\xbd\x69\x7b\xe6\x97\x6f\xcf\xfc\x52\x92\xa0\x33\xad\xd2\xd9\x1e\xd6\x8a\x61\x3a\x93\x2a\x2b\xcf\xf7\x9c\xcb\x6c\xfd\xe0\xc2\x9d\xb2\x68\xa1\xa2\x6d\x0b\xd5\xd6\xa4\xd1\xec\x91\xcd\xce\x54\xfa\x9a\xaf\x12\x54\x35\x4f\x45\xdf\xe5\xb4\x27\x10\x42\xb8\x37\xaa\x10\x72\x88\x2a\x9e\x4d\x7a\x9a\xa8\xe1\x62\x41\xf2\xbb\x4a\xc1\x40\xae\x8c\x55\x5e\x10\xa8\x2b\xec\x43\x9a\x96\xab\xc6\x19\x25\x88\x15\x45\x55\x9c\x71\x0d\x1f\xb4\x87\x76\x99\xc5\x1e\xd1\xd7\xeb\x53\x94\xc8\x98\x7b\x1d\x1e\xbe\x7c\x62\x86\x3b\xb8\x6d\xeb\x73\x44\x8d\x3c\xee\x8e\x12\xd5\x5f\xec\xb6\x79\x90\xa7\xdb\x1b\x98\x9e\xa4\xba\x28\xa2\x46\xe3\x85\x67\x05\xe4\x8d\xf1\x58\x7c\xf5\x9f\x30\x1b\x72\x63\xec\x2a\xe8\xd6\x3e\x7d\x0e\x63\x7c\x00\xbc\x30\x60\xe5\xc3\x3f\xdd\xc9\x87\x8f\x3e\xf1\xe8\xb9\x63\x3b\xb7\x6f\x9b\x5a\xd5\xdb\x95\x72\x0a\xf0\xec\x53\x17\xce\x9d\x39\x7d\xf2\xc8\xa1\x83\x07\xb6\x6f\xdb\xb8\x7e\xed\xcc\x68\xce\x94\x6e\xd1\x2b\xbd\x34\xe5\xa4\x3d\x31\x26\xc3\xb1\x86\x1a\x62\x9f\x2a\xef\xdd\xf4\x2c\x7e\x1a\x5f\x40\x67\xd0\x49\x3c\x8a\x72\x18\x9d\x59\xc9\x2a\xdf\x68\x8f\x18\x2c\xf6\x7d\xfc\x42\xfb\xd6\xd9\xad\x33\xf7\x48\x87\xa3\xa8\x15\x9d\x5a\xca\x8d\x0b\x4c\x45\x9d\x20\x82\xab\x2e\x34\xad\x2f\xc9\xfc\x85\x50\x47\x60\x6e\x25\x59\x4d\x09\xc5\x2c\x9e\xd7\x85\x28\x63\x91\xa7\x66\x81\xe9\x58\x6d\xfb\xa4\x95\xc2\x7f\xc3\x4c\x4f\x25\x84\x74\x12\xb5\xc8\x92\x51\x4a\x19\x54\xd5\x20\x43\x7d\x6a\xd2\x90\x82\xaa\xad\xda\xe3\x2d\xeb\x65\x7b\xd8\x9e\x08\xc6\x7c\x5e\x57\xda\x1e\x0b\xa4\xca\xdd\x9a\xbf\x40\x10\x89\xaf\x8b\x2b\x1b\x09\x93\xcd\x55\x35\xc1\x19\x67\xc5\x99\xfe\x0d\x2c\x4e\xf3\x58\xd4\x49\xa5\xac\x49\x6a\x84\x11\xf4\x9c\xae\x72\x84\x88\x6a\x68\xa8\xbb\xdb\xae\x69\x01\x77\x11\x63\x9c\x74\x71\x0e\x44\x06\x22\x8e\xba\x23\xc6\xaa\x33\xbd\x4e\x4c\x88\xca\x63\x9f\x57\xb0\x95\x12\x21\xbb\xa1\xf8\xd0\xdf\x78\x45\x5e\x45\xa9\xb0\xa1\x79\xf9\xa0\xe4\xe1\xfa\x79\xc9\xc8\x45\x3e\xaa\x1b\x2a\x42\x9a\x96\x7c\xe7\x43\xa2\xfb\xd6\x3b\xb6\x6c\x96\x05\x9b\xe6\x1f\x60\x30\x51\xf7\xbf\xeb\x09\x8d\xd9\xfb\x00\xe1\x9c\x71\x23\xf2\xf6\x2f\x6c\x88\x32\x6e\x0d\xd9\xe7\xdc\x36\x4e\x62\x15\x4e\xd5\x75\x11\x53\x51\x50\x03\x2e\x56\x4a\xb9\x8a\x98\x30\x31\x95\x95\x65\xaf\xcd\xbe\x73\xf7\xcb\xcf\x0b\x9a\x33\x13\x60\x2f\xdf\x96\x04\x95\x25\x3a\xc6\x1f\x46\x79\x29\xc0\xf2\x5a\x7b\x16\xfb\xbf\xa3\xef\xe1\x4f\x82\x02\x41\xa8\x58\xfd\xaa\x17\x9b\x55\x74\xee\x5c\xf3\xfc\xcc\xce\xed\x36\xe6\xc0\xd6\x4d\x33\xcd\xa1\x1e\x11\x0e\xd3\x87\x4f\xf9\x98\x2e\x9d\x26\x7a\x39\xfe\x20\x77\x5c\x65\x73\x26\x1b\x09\xdd\xb7\x6a\xa2\x07\xe7\xf0\x12\x53\x5e\xa9\xb1\x10\xae\xde\xa3\xe9\x1d\x8a\xcb\x69\xf1\xce\x2d\x47\xca\xb9\xf6\x7d\x3d\x4c\xca\x56\xd9\x44\x45\x49\x33\xc9\xb6\x53\xd5\x9d\xae\x30\xb2\x3c\xe7\x17\x44\x6d\x8c\x10\x97\x19\xb5\x20\xb4\x94\x7c\x5e\xc6\x47\xbe\x98\x92\xe9\xf0\xa7\xb5\x22\xd0\x16\xfa\xf4\xc5\x0c\xe2\x10\xda\x82\x19\x84\x89\x98\x11\x0b\x79\x81\x53\x0b\xc5\xf4\x94\x22\x10\x3a\x3e\x3e\x94\xcc\x32\x4c\x28\x3e\x96\xc9\x67\x93\x29\x8a\x45\x26\xfc\xe2\xa1\x3d\x2c\x42\x78\x34\xbf\x9b\x97\x78\xfb\x9e\x6a\xca\x89\x31\x26\x61\xc6\xfe\x9f\x8b\xc5\xae\x4c\x48\x70\x57\x10\x6b\x96\x0c\x87\x20\x90\x6c\x94\xe5\x59\x56\xf2\xf9\xcb\x8c\x50\x78\x3e\xe1\x67\xf8\xb8\xaf\x99\x8d\x72\x08\x21\x66\x16\x1f\xe7\x64\x51\x14\xc8\xe8\x66\x96\x93\xf3\xef\x25\xc5\xa4\x27\x3c\xd6\xa0\xc4\x1f\x1a\x1c\x4a\x64\xef\xbc\x46\x08\x36\x43\xf3\x86\x3e\x65\x3c\xc2\xd2\xfb\x8f\x92\xc4\x7c\xc4\x44\x1f\xe1\x14\x82\x8b\xf9\x67\x68\xda\x70\x77\x7b\x99\x21\x19\x63\x62\x78\xba\xa2\xdd\xcf\xd4\x30\xcd\xb9\x25\xca\x72\x78\xdf\x20\x46\x58\x4f\xb2\x46\x36\x77\xe7\x8e\x2e\x15\x87\x4c\x0f\x43\x55\xc5\xa6\x2a\xd5\xe9\xf6\x5e\xff\x10\x7d\x17\xbf\x17\x04\x70\x41\x16\x76\xc2\x71\xb8\xd4\xac\xa1\x13\x27\x9a\x0f\x4d\x6e\xda\x58\xe0\xf1\x8e\x75\x93\xf5\x5a\x81\x85\x7d\xd4\x77\x88\xa6\xd6\x3b\x99\x94\x42\x7d\x94\x13\x77\x71\xf7\x8b\x6c\xc4\xce\x9a\xdb\x46\x73\x38\x82\x51\x6d\x65\x76\x65\xa1\xfc\xba\x92\x6b\x7f\x85\xc4\x51\x0d\x4e\x2c\xdf\xec\x13\x2b\xb2\x28\x49\xb3\x53\x93\xe8\x59\x1a\x5b\x59\x3c\x73\x58\x6d\x5e\xa4\xd3\x2b\xb8\xb0\xcb\x5d\x4b\xe5\xaf\x5a\x35\xb9\xd0\x9f\xb3\xbc\x33\xb0\x9d\xcf\x6d\x6f\xb3\x55\x79\xe8\xb9\xad\x97\xf4\x1c\xa7\x64\xe7\xa4\xc6\xde\x80\x48\xd8\xc9\x89\xe7\x78\x1a\x8e\x8d\x3d\x54\x6b\xed\x2e\x89\xbc\xeb\x70\x31\x2f\xe0\xc1\xc2\x53\x9c\xca\x8a\x4f\xb8\xa9\x88\x31\xa6\x21\x46\xe4\xed\x85\x19\x77\xe5\x4c\x33\xc8\xab\xbc\x23\x2c\x64\xf7\xef\xe1\x25\x87\xca\xd9\x92\xe9\x5c\x48\xbd\x9c\xf4\x89\x98\x26\xbd\xa3\xe9\x24\x87\x99\x74\x14\xfd\x6b\x79\x2f\xb1\x47\x52\xeb\x84\xe3\xcc\xa6\xa0\x6f\x6c\x90\x11\x4f\x0e\xb6\xf6\x94\x09\x87\x36\x1a\xfa\x3a\xdb\x75\x96\x96\x8b\xc7\x35\x75\x5b\xdc\x87\x5e\xe2\xed\x92\x47\x3c\xaf\xcf\xaa\x01\x97\xab\xdb\xc7\xaa\x82\xec\xe5\x30\x61\x83\xbe\x92\x52\x57\xd6\xb8\xeb\x71\x76\xda\xb6\x5f\x4f\x63\x7b\x8c\x99\xdb\x68\xfb\xa4\xd3\x1b\xe9\xf7\xb9\x29\xb1\xe9\x0e\x41\x18\x0c\x46\xad\x4c\xda\x3f\xa0\xff\x86\x6f\x80\x02\x01\x28\xc3\x41\x38\x0f\x37\xe1\x6d\xcd\x91\xf6\xf4\xca\xf5\xd9\x99\x69\x1b\x8b\xe1\xea\xe5\xbd\xbb\xe7\x37\x4c\xf6\x89\xf4\x08\x3d\x73\xba\xc0\x78\x27\xbc\xb4\xe4\xa4\xf1\xe8\x03\x5c\xf0\x04\x97\xe5\x39\x55\x65\xb3\x26\x1b\x5c\x57\xbb\x78\x01\x5f\xce\xe2\x85\x19\x96\xce\xe1\xb3\x93\xf5\x58\x48\xf5\x37\xb4\x95\x73\x2c\x6f\x24\x9e\xbd\xd7\x14\xcb\xb2\x82\x28\xb7\x58\x11\xb5\x48\x51\xef\x79\x63\x5b\xde\xa0\xd3\xf9\xb7\xb8\xbb\xc9\x94\xd5\x5b\xc1\xc5\x56\x16\x44\x97\xdf\xf9\xad\x7b\xdb\x58\x31\x84\xb6\x54\x0a\xfd\x93\x60\xde\xcc\x7b\x07\xb2\xab\x6a\x99\x84\xd3\x29\x97\xfb\x63\x09\x8e\xab\xa6\x4b\x8d\x39\x4a\x83\xb1\xb1\x73\x85\x20\x83\x10\xe6\x98\xd0\x7b\x8e\x6c\xe7\xf1\x70\x31\xee\x36\xb7\x14\x83\xbc\x2c\x39\x42\x9c\x43\x63\xb8\xa1\xac\xc7\x45\x18\x5e\xf6\xe4\x36\x0d\x45\x52\x79\x22\x07\xdc\x21\xd1\x02\x09\x09\x33\x38\x52\x7d\x24\xe1\x97\x85\x2d\x7a\x20\x13\xb6\x6e\xf2\x74\x74\x8c\x17\xb9\x7e\x8f\xe8\xe2\x59\xdc\x17\x19\x20\x42\xdf\x46\x3a\x39\xcb\x10\xc7\x49\x12\x0b\xcc\x6c\xf0\x1b\x2c\x9d\x1c\x18\x4c\x64\xee\xbc\x46\xc3\xae\xb2\xdd\x6b\xe8\x53\xce\x6b\x2c\xdd\x75\x3c\xc2\x6d\x8e\x7a\x47\x90\xcf\xdb\xa5\xf4\xda\x26\xc3\xf5\x18\x1b\x92\x08\x2b\xae\x2b\x45\x90\x3d\x8a\xd8\x6d\x93\x12\x65\x75\xce\x0c\xf6\xba\x56\x2b\x41\xc3\x5d\x0c\x33\xb2\x3b\x88\x26\x1d\x81\xe0\x36\x9d\x62\xac\x28\x8a\x4d\x19\x88\x44\x9e\x17\x25\xc5\xe6\xe7\x79\x00\xf6\xee\x9d\xbb\x7f\x87\xbe\x85\xb7\x82\x1b\xd2\x56\xd6\xec\x11\x78\xda\x3a\x53\x3e\xf3\x4c\xf3\xd9\xe6\xed\x47\xe7\x9d\x8a\xc8\x52\x78\xf2\xd6\xd5\x23\xfb\xf7\xed\xd9\x35\x37\x33\xdd\x3c\x4b\xaf\x1b\x94\x5f\x95\x60\x7a\x83\x4c\xe1\x14\x97\xb9\xc8\xd5\x3c\x6c\x2d\xc2\x66\xb6\xaf\x6d\x3c\x89\x9f\x58\x96\x1d\x2b\x2d\x70\xff\x2c\xd8\x80\xb7\x9e\x63\x5b\x4c\x84\xdd\xa3\x29\x34\xba\x62\x4c\xb5\xdc\x8e\xe2\xac\x26\xaa\x37\x3b\x81\x15\x73\x08\x4b\x4a\x68\x0b\xd9\xaf\x76\x70\x80\x16\x39\xec\xda\x71\xc1\xb2\x02\xfa\x22\x56\x96\x19\x88\x6a\xbd\x27\xd5\x0a\x03\xcd\x64\x8c\x45\x6e\x71\x44\xa8\xc4\x34\x3d\x15\x4a\x85\x63\xc9\x59\xca\xe9\xa6\xdd\xed\xf6\x0e\x39\x36\xa6\xa7\x6d\x3c\xa6\xe3\xa3\x63\xe1\x24\x26\xb1\x64\xe3\x74\x57\x92\x20\x9e\x4a\xde\xe2\xfe\xe3\xdb\x58\xae\x9a\xaf\x5e\xaf\xf8\x79\x7b\x85\x63\xf3\x85\x51\x7b\x98\x11\x53\x1e\x5b\xc0\xc6\x72\xde\x4a\x3a\x63\x33\x62\x86\x1e\x4b\x12\x46\x30\xd2\x46\x84\x43\x02\x62\x53\x1c\x09\x0c\x5e\x4a\x7b\x44\x84\x13\xbe\xe1\x62\x80\x43\xf3\xee\xb0\xac\xda\x04\x2f\x4b\x59\xf4\x9f\xfc\xd4\x4f\x0a\xb6\x70\x2f\xc6\xb2\x23\x8a\x65\xaf\x6e\x93\x42\x35\x69\x2f\xc9\xc5\xcd\xe8\xe8\x28\xc3\x78\xc3\x43\x13\x91\xd8\x9d\xcf\xd1\x68\x74\x43\x8c\x9f\xb2\x97\x83\x59\x86\xd9\x7a\xe2\x68\x2e\x3e\x4a\xc3\xbe\x2e\xfb\xd8\xa3\xbd\xac\x54\xd0\xb7\xf3\x76\x46\x72\xa8\x5a\x58\xa4\x44\xf1\xea\x98\x20\x1c\x89\x04\x7d\x94\x15\x54\xc9\x15\xa9\xd2\x6d\x5e\xe7\xce\x30\xa3\xb9\xa2\x68\xca\x6e\xc6\x1b\x5e\x3f\x42\xb2\x6e\xf0\xdc\xa6\xa0\xf0\x38\x12\xa9\x8a\x90\x95\x79\x6d\x59\x9a\xa7\x81\x05\x05\x7c\xd0\x05\x0f\xc2\x59\xb8\x66\xf5\xf5\x5c\xbf\xde\xbc\x31\x73\xf5\xc0\xfe\xbd\xbb\x77\xee\xb0\x09\x0c\xbe\x7c\xf1\xd8\x03\xdb\xb6\xcc\x34\xfa\xab\x12\x47\x80\x60\xc2\x88\x18\x13\x00\x7c\x9a\x16\xdc\x4c\xc1\x4e\xc3\x87\xb8\x13\x2a\x9b\xd6\x59\xff\xfd\xab\x2e\xe2\x73\xf8\x7c\xb9\x1b\xa7\xf1\xa2\xce\xce\x70\xa3\xb1\xe4\x59\x50\x1b\x5c\x8f\x17\xf9\xaf\x2a\xff\xc6\xff\xac\xf1\x96\x45\xd1\x9d\x7b\xcf\x31\xbc\x61\xb8\xc5\x2a\x80\xdf\x13\x50\x96\xbf\xe9\x44\xa7\x6d\xd3\x42\x16\x9b\xd0\x57\x98\xa3\xa5\xdc\x56\x32\xc5\x2d\xf7\x39\x6d\xd3\xd3\xce\x6c\xf5\xd4\x5d\x3d\xf6\xf8\x16\xbe\xea\x3b\x9d\x4c\xe9\xd9\x74\xc2\x9d\xb9\x26\xd2\x55\x23\xf5\x6c\x96\x72\x33\x66\xe4\x6c\x29\x49\x31\xcb\xda\xfc\xc5\x7d\x87\x77\xf0\xa8\xbf\xf0\x6b\x88\x11\xb7\x06\x85\x4e\x68\xc1\x30\x82\x56\x7e\xce\x32\x45\x9c\x2a\xd8\xc3\x3c\xeb\x93\x95\x62\x24\x18\xc1\x1e\xf7\x40\x48\x17\x44\x34\xce\xd7\xc3\x5f\x4a\xf8\xa9\xc0\x3c\x92\x89\x4a\x84\x4d\x45\x57\x23\x56\xcb\x14\x45\xb7\x80\xfb\x5d\xf9\x0d\xfc\x68\x24\x9e\x49\xb9\x72\xb9\x42\xf8\x51\xf6\xd9\xd1\x71\x81\xc6\xfc\xa3\xf7\xfb\x85\x3b\x9f\xa5\xe1\xf0\xbc\xa1\x8f\xba\x6b\xfe\x12\xa5\xfb\x8e\xa9\xca\xce\x84\x0f\xbd\x84\x19\x49\x98\xd4\x2f\x28\x41\xdd\x53\xf1\x72\x9c\x20\x8a\x41\x0e\xf9\xdc\x65\xa5\xae\xac\xf6\xd7\x63\xac\xe6\x95\xd8\xa1\x64\x3c\x81\x83\x7a\x3d\xe9\x14\x05\x34\xcc\x4f\xc4\xff\x8b\x83\xaf\x1c\xe1\x89\xea\x8a\x34\xc2\x91\xe7\x09\xa7\x2b\x44\xf5\xcb\x40\x80\xdc\xfd\x21\xfa\x28\xfe\x38\x48\x16\xcf\xcf\x27\x9b\x6b\xd1\xb5\x6b\xcd\xeb\x07\xcf\x9d\x39\x7e\x74\xdd\x9a\x89\xf1\xba\x22\x92\x2b\xa7\x4f\x1c\x3d\x7c\x70\xf7\xf6\xe1\xbc\xc9\xc1\x56\xbb\x3c\xbf\xe1\x78\x99\x4e\xaf\x9e\xa6\x7d\x7d\x03\x74\xd6\x47\x8d\x00\x63\x9c\x4c\xa6\x69\x31\x16\x8d\xb0\xf2\xa5\x03\x5b\x71\x1f\x3e\x99\xc7\x27\xcc\x15\x7e\xaa\x8d\x18\x8b\xb8\xa2\xd1\x69\xaf\x68\x74\x08\xa4\xde\x48\xd4\x72\xaf\x2e\xc1\xdd\x70\x6d\x39\x6a\xae\x59\xa8\x69\x4b\x21\x5b\x3d\x13\xce\x28\xc7\x26\x3b\x81\xe5\x82\x88\xb2\x6b\x18\x59\x43\x75\xed\x36\xe0\xc5\x50\xc5\x6c\x57\xa2\xad\x17\x2a\xb2\x5a\xbd\x6a\x3d\xb5\x9e\x54\xb4\x3b\x59\x69\x4f\x37\xb8\x8c\x2a\xb7\x58\x03\x6a\xa1\xb0\xdd\x23\xd6\x2e\x4b\x2f\x46\x30\xab\x78\x8a\x8d\x74\x26\xa7\x72\x42\xce\x13\x8e\xf8\xe7\x10\x42\x36\x2e\x96\x61\x11\x83\x25\x5f\x49\x42\xe1\x3a\x8b\x10\x22\xbe\x32\x8f\x30\x87\x33\x9e\xad\x05\xa2\x62\x8c\x0b\xbc\x21\x6a\x3c\x8b\x31\x8b\xb0\x2b\xd8\x72\x46\x68\x28\x2c\x2a\x24\xc1\x64\xd6\xbc\xe7\x01\x8c\x78\x93\x2a\x7e\x26\x9f\xe3\x78\x7f\xc1\x26\x4b\xde\x50\x89\xda\xd2\xf8\x98\x29\xc9\x88\x19\xd8\x69\x63\xd9\xc2\x9d\x30\x42\x7a\xbf\xe8\x9c\x9d\x5d\x33\xa7\xb0\xcd\xda\x40\x5f\xdc\x17\xa3\xb8\x18\xca\xac\x5f\x55\xc3\xc2\xf8\xc4\xea\x41\x45\xee\xd7\x6d\xe8\xbd\x5d\x58\x1d\x1a\x1a\x18\x66\xd9\x98\x82\x58\x8c\x45\xc1\x39\x5c\x4b\xaf\x41\x8a\x6c\xb3\x09\x8e\x8d\xeb\x85\x4f\x64\xd9\x92\x64\x38\xed\x0c\x1d\x30\x93\x07\x4f\x57\xba\x30\x53\x97\x09\xe5\xd7\xac\xc1\x7a\x8a\xd7\xd3\x19\x00\x7a\xf7\xce\xdd\x1f\xa1\x8f\xe2\x17\x40\x86\x0a\x3c\x08\xd7\xe0\x63\x1d\x9b\xd2\x7b\xf6\xe1\x87\x8e\xae\x5d\xd3\x1c\x52\x45\x96\xe2\xab\xa7\x8e\x1f\xdd\xbf\x67\xcb\xd8\x50\xa3\x37\xe0\xe3\x61\x97\x53\xde\xbe\x9d\xae\x6a\xe6\xba\xe8\x86\x55\xd3\x74\xe3\x86\x4c\x8a\x16\x5a\x08\xb1\x5d\x3c\x7f\xb9\xba\x0b\xe7\xf0\xa1\x31\x13\xa3\xfd\x0b\x08\xb1\x00\xd2\x68\x2c\x40\x64\x29\x05\xfa\xe6\xc4\xc4\x3d\x8b\xc9\xfb\xef\x6d\x56\xda\xf3\x2f\xd6\x1c\x43\x74\x71\x34\xca\xd5\x3e\x61\xb4\x01\xb2\xd0\x26\x6e\x06\x91\x35\x32\xb7\x38\x3e\xbf\xa8\x51\xd7\x42\x82\x05\x95\x54\x72\x10\x59\x7e\x28\x19\x6b\x27\x4d\x17\x66\x37\x89\xd5\x2e\xdc\x4e\xb0\x47\x97\x72\x7a\x17\x43\x59\x4d\x55\x35\x89\xcf\xac\xb5\x0b\x15\x57\xbe\xdb\x1b\xc2\x88\xb8\x1c\xe9\x38\x41\x14\xcb\xde\x6e\x11\xd5\x0d\x16\x71\x9c\xaf\x22\x20\x24\xa4\x4d\x5f\x2c\xe5\x27\x58\x70\x12\xcc\xaa\x3e\x8c\x48\xa6\x4e\x31\x32\xa4\xb4\x64\x08\x84\x10\xcc\x05\x79\xda\x1f\x93\x11\x92\x11\x66\xb3\x6c\x7a\x8e\xa5\x2a\x65\x6d\x86\x99\xdd\xc2\x88\x34\xc8\x48\x2e\xdd\xe1\x8a\xe6\x34\xf4\xe3\xc9\xd5\x04\x23\x64\xfa\x52\xeb\x65\xf6\xce\x04\x21\x9a\x5e\x62\xcd\x77\xff\x92\xc6\x14\xa7\x6b\xc3\x51\x0b\x2c\x0e\xf9\xfa\x19\x22\x8c\x4d\x7a\x8e\xf8\x07\x9d\xd2\x5a\x5e\x8a\xeb\xb9\x2d\x93\x33\xf3\x98\xf3\x2b\x36\x89\x69\x0e\x39\x8e\x86\xec\x92\x80\x91\x28\x38\x22\x5b\xa6\x33\xa4\x2a\x38\xd7\x6f\x9c\x5f\xcb\xbb\x46\x25\xd3\xae\xa3\xff\x93\x6a\x54\xf1\x3a\xb4\xd2\x1e\x67\x8a\xda\x23\x08\xf7\xdd\x6f\x03\xa0\x96\x45\xf9\x08\xbe\x0d\x1a\x34\xe1\x24\xbc\x13\xbe\xd6\xdc\x81\x5e\x7c\xb1\xf9\xae\x89\x77\xbc\x70\xe3\xbe\xed\x5b\x37\xcf\xcf\xcd\xa8\x56\xf2\xf0\x85\xc7\xcf\x1c\x3e\x78\x60\xf7\x86\xb9\x99\xe9\x89\x44\x40\xa6\x33\x73\xfc\xba\xb5\x6b\xd7\x0d\xd6\xa9\xf9\x18\xbd\x78\xfe\x22\x7d\x6a\x6f\x84\xfa\x62\x8c\xaf\x9b\xf6\x55\x68\xdf\x33\x4f\xb3\x6f\x4b\xb3\x4e\xfb\xce\x91\xd3\xa7\xf0\x01\x5c\xc7\x01\x8c\x0e\x2f\xcb\x62\x59\x55\x98\x05\xb9\xa1\x85\x5a\x8c\x65\x66\x7e\xae\xee\xde\x1b\xb1\x74\x18\x5e\x5c\x8e\xa5\x17\xdf\x5c\x09\x54\x91\xc5\x96\xba\x30\xbf\x9f\xea\xd8\x16\x43\x6f\x79\xa1\x72\x47\xe8\xbd\xad\xcc\xb9\x60\x6a\x56\x00\xcb\xea\x87\x79\x63\x7e\xb2\x33\xc0\xb0\x60\x78\x88\x15\x8c\x2f\x80\xaf\xd3\xdd\x5a\x6b\xfd\x66\x2a\x16\x4d\x55\x53\x66\x4f\xdd\xf5\xab\xb9\x60\x3c\x10\x29\x3b\x93\x9e\x48\xa1\xec\x74\x26\x98\x89\x48\x38\x12\x4e\x63\x84\x45\x84\xe4\x44\x9a\xa3\x24\x1b\x64\x39\xc2\xe3\xb4\xdd\x83\x09\xed\x0a\x09\x3c\x4a\xb9\x03\xb1\x64\x10\x21\x41\xa3\x84\x53\xfc\xd8\xc6\xb2\xc9\x6e\x89\x35\xb4\x70\x38\x1c\x09\xf7\xc7\xf2\x8c\xe4\xad\xda\x10\x52\x68\x82\x4b\x65\xe3\x7b\x25\x8e\x93\x6d\x04\x33\x1e\x57\x50\xe4\x59\x9e\xc3\x18\x21\x06\x13\x53\x92\x48\xdd\x95\x15\x70\xb3\x3b\xcd\x4b\xa3\x63\x84\x22\x52\xdf\xc2\x60\x86\xbb\xb3\x0a\x21\x24\xca\x03\xaa\x32\xbd\x7e\x6e\x56\x63\x1b\xfd\x7d\x0d\x41\x0c\x16\x11\x61\x35\x35\x55\x98\x1b\x1a\x64\xf9\xf1\x89\x91\x49\xc9\xd9\xab\xcb\x6b\x05\x5b\xcc\x93\x5c\xbd\x61\x7e\x86\xb0\xa2\x4e\x10\xde\x32\x49\x63\x2a\x46\x88\xed\xbe\x5f\xe3\x25\x85\xd3\x37\xaf\x59\xb3\x29\xe4\xe8\x16\xdd\x9a\x4c\x78\xf4\x7d\x41\x45\xcd\xe6\x50\xd3\xaf\x6b\x84\x60\x84\xb1\xc8\x33\x0c\x65\x1e\xae\x8c\x61\xd1\xc9\x04\x7a\x64\x4b\xd9\xe2\x87\xe8\xc3\xf8\xa6\x35\xe5\x5b\x87\xdb\xf0\x7b\xcd\xed\xe8\xe9\xa7\x9b\xcf\x1c\x7b\xec\xd1\x9b\xd7\xaf\x5e\x39\x73\x7a\xed\x9a\xb1\x81\x74\x2a\xe9\xb0\x48\x7c\x9f\xba\x74\xee\xcc\xe9\x93\xc7\xf6\xef\xd9\xb5\x75\x94\xa7\x70\x41\x2e\xd3\x8d\xab\x26\xe8\xfc\xc6\x28\xf5\xba\x82\xd4\x1d\xa6\xee\x42\x8e\x76\x55\x1f\x3f\xb4\x0b\x8f\xe2\x41\x7c\xa1\x0f\x8f\x34\x7b\x71\x17\x3e\xe7\x5d\x66\xc0\xac\xb0\xa8\xd1\xe1\x8b\x69\xb4\xbb\x61\x3a\x52\x6f\xf7\xa0\xac\xfb\x99\x6d\x57\xfb\xe1\xe9\xe5\xf8\x7b\xfa\x9e\x9c\xbe\xc9\xe5\xe6\xcc\xe8\xe0\xa6\xe3\xf1\xac\x6e\xab\x4e\xfe\xc5\x1a\x97\x31\x5d\x66\xdd\x8c\x75\xc0\xc4\x45\xd9\x1c\x2a\xa1\x05\x63\x56\xea\x94\x28\x16\xe7\xd0\x97\xe1\xb4\xa7\xce\x56\x56\x92\x0a\xb5\xc2\xf9\x10\xa9\xf8\xfb\xf4\xb4\xff\x4c\x22\xe3\x4a\xfb\xcb\xee\xbe\x48\x38\x1c\xc9\x31\x0c\x4f\x14\x4f\x95\x45\x84\x74\x39\x75\x11\x85\x2b\x98\xe3\x52\x86\x53\xc6\x84\xc5\x69\xf7\xa7\xb0\xcb\xe3\x2a\x6a\x1c\x8f\x44\x8e\xc1\xb8\x68\x53\xb0\x40\x04\x5e\x6c\x6d\xa2\xe9\x62\xd2\x75\x45\xc6\x88\xc9\x30\x99\xcd\xcf\x25\xe3\x5e\x8a\x04\x3b\x21\xbc\xea\x43\xac\x87\xaa\x51\xb1\x9b\xaa\xa1\xf0\xa0\xcd\x4d\x5c\xf9\xa8\xa6\x14\x71\x8d\xa9\xfb\x7b\xcd\xee\x50\x3c\x97\x76\x66\xc2\x43\x81\x3b\xc3\x2d\xc8\xd9\x06\xca\x8f\x4c\xce\x8b\x4a\xb5\x39\x5a\xe6\x84\x3e\x9d\x63\x70\x21\x7c\xeb\x04\x83\x99\xb5\x7d\x85\xf3\x3d\x86\x8c\x9e\xa4\x41\x7f\xb0\xae\x71\x22\x11\x87\x87\x6b\xd3\xdd\x32\x6d\x19\x4a\x89\x77\xc6\xe6\xa7\xd3\xb4\x42\x3d\xeb\xd6\x6f\x5a\xc3\x9b\x43\xaa\xd3\x74\x89\xb6\xb8\x56\xd8\xb4\x6a\xf5\x3c\x61\x9d\x71\xc6\x55\x90\xfa\xa9\x3d\x14\x6a\x4a\x5e\x6c\xe6\x23\x76\x63\xa8\x5d\x09\x34\xd1\x7f\xc5\x37\x40\x82\x10\x34\x61\x1e\xfe\x63\x73\x3b\xda\xb4\xa9\xb9\x39\x3e\x37\xb3\x6a\x70\xa0\xbb\xab\x90\x8c\x1b\xb2\xc8\x50\xbc\x71\x7a\x62\xd4\x9a\x93\xc9\x24\xe3\x5e\xbb\x22\xf3\x60\x98\x82\xdf\xeb\xf5\x3b\x0d\x41\x53\x14\xcd\x69\x08\x76\x4d\xb3\x8f\x8e\x59\x1a\xa3\xf1\x24\xef\xf5\x78\xbc\xeb\x87\x47\x71\x1d\x8f\x78\x71\xc6\x8e\x51\x7d\x65\x30\xf5\x96\x34\xe6\xbf\x00\xad\xf9\x5b\x19\xbe\x3a\x6c\x5a\x0e\xbc\x4d\x0b\xc0\x1b\x40\xed\x1a\x34\x59\x3e\x47\xd3\x69\x97\xe9\x88\xe1\x76\x5e\xa6\xde\x2c\x87\xeb\xac\x73\x6f\x9a\x0b\x7d\x39\x1d\x57\xd5\x10\xc7\x88\xeb\x73\xd2\x3b\xe6\xd6\x97\x53\x9b\xe2\xfd\x63\x95\xae\x86\x61\xe4\xc2\x07\xd7\x4d\xd4\x1e\x9e\x98\xdb\x1b\x76\x96\x05\x4e\x2d\x0e\x76\xe7\x62\xba\x5d\x12\xa8\xe0\x98\xce\x0f\x5c\x08\x3c\x55\x4a\xab\xfe\x55\xa3\x6e\x91\xa1\x6a\xa0\xb0\x8d\x2a\x76\x07\xd2\xd2\xe9\x7e\x8f\x1d\xfd\xed\xa6\x61\x22\xdb\x3c\xeb\xd3\xc2\xeb\x57\xce\xbe\xbc\x67\xc3\x6b\x86\xfc\xd8\xe9\x33\x57\x09\x6b\x1b\xfe\xfb\xdf\x3a\xc4\x17\x8f\x7e\xf5\x9f\xc7\x58\x55\xd5\x22\x0e\xe9\xc0\xa1\xd9\x7c\x14\x39\x13\x6a\xe0\xda\xbf\x8d\x7e\xcf\xe4\x8d\xbc\x1b\x3f\xe5\xd6\x45\x51\x72\x97\xf6\xe9\x49\xc2\xa5\x99\x83\x03\x4a\x7b\x87\x0d\xf4\x77\xf8\x88\xc5\x85\x19\x87\xfd\xf0\x89\xe6\x34\x3a\x70\xa0\x79\xff\xec\x9e\xdd\x3b\xb7\x6d\xd9\xbc\x61\xcd\xec\xd8\x48\x6f\xbd\x5a\x2a\xa6\x93\x89\xa0\xd7\x22\xc2\xbc\xcf\x6a\x86\x9a\x18\x1b\x1e\xea\x76\xda\x65\x9e\x82\xdb\x2b\xe8\x2e\xa7\xd3\x15\xa4\x23\xae\x7d\x13\x43\x38\x87\xd7\xb9\x96\x52\xb2\x8d\x05\x9b\xb1\x34\x10\xf5\x73\x46\x67\xee\xb9\x79\x43\x70\x60\xf9\xe6\x1d\x78\x93\xd5\xe0\xda\x3b\x98\x7a\xa3\x22\xaf\xb3\x65\x22\x86\x5b\x5b\x5c\x0f\x21\x56\x45\x4b\x7b\xe8\x5c\x54\x34\x5e\x4e\xbf\xbb\x60\x07\xda\x9f\x5d\x33\x7a\x3a\xd0\x6b\x64\xbd\x67\xcb\x21\x23\x9d\xb2\x79\x8c\xff\xb9\x66\xdd\xf6\x42\x3e\x5f\x19\x6c\x74\x0d\xd6\x62\xe9\xc8\xc8\xc6\xd1\x68\x11\xdb\xc3\xb2\x3b\x26\xaa\x2c\x61\x64\xcd\x97\x8d\xd9\x0d\x1b\xc7\x08\xce\xc9\xee\x2f\xd4\x4f\x06\xfb\xd5\x60\xdf\xb6\xc9\xd9\xe1\x50\x22\x9c\xb4\xb9\x1c\x29\x7b\xd4\xc8\x11\xd3\x53\x72\x9b\x86\x8a\x5d\x85\x55\x21\xec\x73\x65\x7c\xbd\xee\x72\x28\x55\x0b\x38\xb3\x25\x2d\xec\x79\xfd\xe2\xc3\x1f\xf8\xec\xf6\xed\x6e\xe9\xd4\xe3\x17\x2e\x09\xf2\xaa\x99\x17\xbf\x74\x80\xc7\xb3\x58\x4f\xa9\x81\xbc\xe8\x64\x19\x5e\x0d\x35\xf7\xac\x49\x25\x90\x33\xa5\x84\xef\xdc\x3c\xfd\x9a\xa2\x19\x79\x5d\x78\xe8\x77\xdf\xbf\x76\x56\x16\x8d\x3c\x2f\xba\xf2\x66\x9e\x78\xcc\x2e\xd3\xeb\xb1\x21\x57\x6e\x26\x6d\x29\x7c\xfe\x1a\x7c\x19\x7d\x1b\x54\x48\xc0\xb9\x66\x19\x25\x93\xcd\x94\x19\x0e\x06\x7c\x86\x43\xe6\x69\x3c\x1a\x0c\xf8\x3c\xa6\xd3\xa1\xc9\x14\x58\xaa\xf0\x54\x11\x39\x1c\xc5\x26\x72\x22\x0d\x01\x5e\x90\x7d\xea\x88\xff\xa2\x37\xf5\xdd\xbe\x29\xd7\x12\x85\xe4\xf2\x4d\x4b\x2e\x29\x9b\x2e\x50\x4d\xa6\x5a\x7b\xc6\x2d\x51\xb7\x75\x74\xfa\x5d\x5a\xb0\x2c\x4a\x2c\x11\xc5\x64\x48\xc3\xc4\x30\x22\x54\xd3\x7a\x53\x01\x8c\x0d\x33\x44\x35\xc7\x50\xd8\x4b\x08\xfa\x4a\x8a\x9c\x3a\x35\x3b\x43\x02\xc7\x8f\x9f\xb8\xf3\x7e\xaf\x58\x65\xeb\xe7\xae\xdd\x38\x17\x90\xea\x6c\xef\xd5\xf3\xe7\xdb\x33\xca\x18\xfd\x23\x79\x3b\x68\x30\x09\x1f\x81\xcf\x35\xd7\xa2\x57\x5f\x6d\x7e\xf4\xf0\xfb\xde\xfd\xe2\xdb\x9e\x78\xfc\xc2\x99\x87\x4f\x1d\x3d\xbc\x77\xcf\x8e\x6e\xd3\xae\x8a\xf8\xa5\xf7\xbd\xf7\xe9\x27\x1e\xbf\x76\xe9\xc2\xf1\xa3\x87\x1f\x3c\xb0\x65\xae\x14\xf2\x98\x86\x88\x07\x06\x85\x58\x24\x12\x7b\x91\x8e\xf4\xd1\x54\xa2\xc6\xe6\x02\xec\xc4\xf1\xe9\xfb\x30\x4b\xd0\x4b\xcb\x33\xd1\x0b\x23\x1c\x3f\xaf\xa7\xfe\x67\x3a\xc7\x97\xe0\xd5\xe5\x2b\xf6\x6a\x5b\xb4\x77\x11\xd2\x2d\x93\x14\x8b\x92\x68\x2a\x59\xeb\x04\x5f\x8b\x23\xeb\x8b\xac\x16\xe6\x62\xea\xc9\x74\x99\x9d\x54\xf5\x62\x13\xf3\xb2\xd2\x44\x3b\x2f\xbd\xa4\x33\xb6\x42\xa4\x30\xb5\x68\xe5\x96\xda\x05\x63\xae\xa5\x9c\x55\x9b\x15\xd1\xfa\xd8\xc9\x85\x7f\xa9\xb4\xbb\x92\x0c\x37\xa3\x23\xe1\xe1\x69\x77\xc9\xed\x72\x4f\xce\xb8\xc3\xde\x1e\x1c\x8b\x0e\x5e\xe0\xe8\x54\xf2\xc0\x24\x87\x10\xc9\xf6\xce\xcf\xc6\xbb\x54\xb3\x6c\x6b\xaa\x66\xc6\x13\xc0\x78\xf2\xf1\x09\x8d\x20\x1a\xf5\x8d\x6e\x9f\xd8\x11\x08\x05\x13\xb2\xb7\x61\xc4\x6b\x87\xb0\xd7\x15\x33\xe2\x98\x51\x9d\x6c\xbc\xa6\xa5\x8c\x60\x79\x5f\x23\xed\x4c\x37\x87\x82\x0d\xd1\x25\xfa\x7d\x43\xfd\x7d\x47\xba\x5d\x6b\x1a\x7a\x7a\x4d\x9e\x73\x60\x1b\xcb\x20\x1a\x74\xf5\xb9\x05\xbb\x5d\x22\x8c\x9f\xc3\x18\x3b\xe7\x09\x95\x23\xe9\x4b\x76\xfc\x3b\x43\x97\x0c\x1a\x9f\x4a\xcc\x50\xd7\x9e\x50\x13\xbd\xfe\x94\x11\xe8\x71\x67\x38\x2e\xe1\x37\x10\x39\xd0\x08\xab\xe9\xf4\x71\x45\x1f\x71\xbb\x09\xd1\x1d\x0d\xbb\xbf\x21\x13\x84\x1d\x7a\x7a\x28\xd8\x9b\x39\xe7\x70\x0e\x7b\x0d\x86\x1f\xe4\x79\xb5\x68\xd6\x6f\xd4\x0a\xa6\x5e\xb4\x71\x29\x9b\x03\x53\x85\xd3\x38\x57\xd4\x99\x98\x32\x12\xe2\xaa\xe7\x62\x92\xb7\x1c\x10\xc3\x13\x36\x33\x14\x16\x3d\x53\xcf\x31\x8c\x63\xf3\xad\x6a\xd2\xf0\x98\x84\x67\x58\x99\xeb\x32\xed\x2c\x46\x98\xf3\x06\x90\x4b\x71\x38\x35\x69\x2a\xac\x14\x6d\xdd\x1c\x6a\xf7\x26\xfc\x3d\xfa\x26\x7e\xcd\x8a\xe9\x9e\x84\x0f\x37\x57\xa1\xa7\x9e\x6a\xde\xde\x76\xed\xca\xe5\xfb\x76\xed\xd8\xb6\x6e\xcd\xdc\xec\x4c\x46\x6f\x05\x74\x8f\x3e\x72\xe3\xf2\xa5\x73\x27\x8f\x1d\xda\xb5\x63\xdb\x96\x8d\x6b\xe6\x66\x56\x8f\x37\xaa\x85\x64\xd8\xeb\x10\xf1\x14\x77\x21\xc7\xc6\x5d\xac\x76\xa8\xf7\xe8\x11\x1c\xc7\xe8\xd0\x62\x56\x6b\x31\xa5\xf5\xd6\xa6\xf6\x67\xb5\x87\x1c\x82\xa7\x96\x03\xf3\xa9\x37\x00\xb3\x85\xcb\x2e\xc2\xa6\xac\x33\xe9\x72\x4c\x76\x32\x18\xa9\xa8\xb1\x50\x33\xeb\xf4\x0e\xb2\x4b\xa2\xd1\x66\x8f\x69\x54\x5a\xf0\xaa\xbf\x01\x87\x2a\xea\x24\xbb\x5c\x66\xc5\x82\x62\x47\xdb\x37\xc6\xa6\x6a\x1d\x0a\xc8\x36\xfc\x3e\xdd\xb5\xaf\x1c\xab\x76\x25\xfb\xbb\x4a\xeb\x07\x7d\xf6\x9e\x3d\x41\xb3\x62\x5f\xe3\xf2\xfb\x08\x2d\xfa\x67\x8a\x2c\x93\x0b\x4f\xee\x8f\x04\x55\xcd\x3e\xd9\x43\xf7\x94\x7b\x58\x8c\x90\x23\x9b\x0c\x85\x43\x08\x71\x9e\x82\x19\x90\x36\x53\xde\x66\x17\x03\x84\x43\x5e\x31\xe9\x70\x48\x61\xbb\xb7\x7c\x7f\x3d\x63\xa4\x57\xf7\xd8\x82\x05\xc1\x90\x1d\xa9\xf2\x78\xdf\x43\x12\xbf\x4f\xe1\x70\x41\xad\x16\xf2\x42\xdd\x63\x90\xa0\x98\xa9\x6a\x06\x0d\x8d\x3b\xd2\x11\xf4\x57\xcd\x1b\x6e\xae\xaf\x5e\x6c\xf2\xce\x83\x9b\xf0\x9d\x1d\x4c\xd1\x93\xad\x50\xc4\x4a\xfe\x88\x26\x78\xb4\xf5\xa3\x1e\x07\x22\xa3\xa6\x24\x96\xd9\x8a\x2f\xee\x0a\x36\x9d\x6e\x97\x66\xac\xc6\x44\x8c\xca\x63\x9b\x23\x05\x95\x8d\x8a\xac\x0d\x63\x1e\x13\x67\xc8\x63\x53\x8d\x78\x50\x9f\x7b\x47\x54\xf6\x54\x23\x9c\x3d\xd2\x25\xbb\x91\x9e\x13\x13\x73\xef\xe6\x68\x9f\x3f\xb8\xda\x1f\x73\xa9\xaa\x8f\xf0\x94\x28\x61\xdf\x40\x80\xa5\x71\x85\x10\x62\xcd\x38\xcb\xf8\x18\x99\xb3\xce\x07\x51\xd8\x0b\xbf\xd1\x5c\x8b\xf6\xed\x6b\xde\x37\xb9\x7d\xdb\x96\x4d\x1b\xd6\xcf\xcd\x4c\x4f\x36\x06\x2a\xe5\x52\xbb\xbd\x22\xe4\x33\x9d\x76\xad\xe5\xd8\xf7\xac\x6d\x7d\x6b\x7c\xb4\x39\xd4\x18\xe8\xeb\x2d\x44\x42\xa6\x61\xe3\x29\xd8\x54\xa9\x2d\x0d\xaf\x51\xe7\xce\xd1\xde\x25\xb9\x06\x8b\x3a\xb2\x65\xed\xf8\x7f\xb7\xb5\x7b\x13\xbc\x7a\x61\xdf\x72\x78\xed\x7b\xa3\x7b\x6f\x05\x68\xa4\x3d\xea\xbc\x84\x39\xa2\xb7\xe3\x7f\xcb\x84\xb1\x5c\xa7\x46\x6f\x39\xf6\x36\x7d\x71\x7b\xe0\x59\x45\x8b\x9e\x3d\xb5\x44\x11\xa4\x22\xd7\xed\x96\x6f\x37\xd3\xbe\xb3\xf9\xa8\x43\x0b\x65\x92\xde\x9a\xdb\x27\xb0\x73\x2f\x17\x87\xd6\xed\xea\x79\xa0\xbb\xbe\xfa\x5d\xe7\x88\x3d\x22\x36\x24\x27\x16\x5d\xe2\x96\xda\x88\xc8\x4b\xa2\x3e\xdf\xfd\xaf\x44\xed\xc7\x18\x15\x77\x05\x99\xe9\xf7\x38\xf5\x34\xcd\xe7\xbb\x79\xc6\x28\x10\xb7\xac\x0c\x84\x25\x1f\xd2\x8b\x4e\x7b\x2c\x8c\x7f\xea\x2e\xf8\xea\x66\x2d\x98\xe9\x8e\xa8\x8e\x68\xae\xf4\xfa\xe7\xc8\xce\x4f\xdf\xb8\xeb\x51\x8e\x7f\xf0\xc8\x07\x78\xc7\xfd\x77\x7e\xfa\x2b\xe8\xdb\xd8\x91\x54\xa7\x65\x0f\x95\x7d\xea\x7b\xf6\xee\xc6\x8a\x1a\x34\x02\x77\x1e\xbc\xfd\x24\x55\x64\x9b\x82\xb9\x67\x9e\xb9\x85\x08\xc7\xda\x98\x61\x55\x96\xa8\xa7\x1b\x7b\x15\xa9\x37\x69\xf3\x10\x33\xe3\x34\x72\x71\x4b\x13\x1a\x33\xe8\x35\x7c\x17\x14\xc8\xc3\xde\x8e\x5a\xa5\x9e\x4b\xc6\xa3\x1e\xb7\x4b\x53\x25\x0a\xc9\x78\x54\x97\x68\xc0\x17\xd4\x05\x9e\x25\x8b\x6e\xbc\xd1\x28\x95\x1a\x0d\x74\x8f\x7d\x5a\x74\xdf\xf7\x10\xab\x6c\x77\x68\x5a\x6a\x52\xd1\x64\x8c\xeb\x28\x87\xb5\x0b\x63\x25\xb4\xa8\xb6\x6d\xe9\xd9\x7e\xd0\xe8\xd1\x33\xe9\x84\xdf\x57\xf7\x8c\xc9\x25\x89\x0a\xdc\x70\x76\xfe\x56\x8a\x50\x9e\xd5\xc3\xe1\x11\x5d\x72\x25\x7c\x95\x68\x3a\x10\x1c\x88\x65\x05\xfc\xc5\xd8\x20\x62\xb3\x67\x70\xcf\x7e\x2a\x72\x15\x62\x5f\x75\x0d\xd9\xa3\x08\xe1\xd5\xee\x4a\x14\xb3\x11\x3f\x4b\x18\x5f\xbf\xad\x7d\xc5\x7e\xf4\x29\x62\x80\x02\x69\xd8\xd5\x8c\xa2\x4c\xa6\x99\xb5\x27\x62\x51\xbf\xcf\x63\x38\xed\x36\x99\x85\xb0\xe1\xb4\x8b\x38\xac\x8a\x04\x13\x14\x5e\x72\xd3\xf7\xba\xda\x85\xcb\x0d\x43\x66\xf9\xe5\x66\xde\x64\xe2\x62\x51\x73\xb9\x8b\xe4\x3a\x96\xa9\xa7\xe2\x32\xcb\x9f\xce\xed\x32\x7a\xfb\xb3\x5d\xa9\xd0\xe0\x4c\x23\xeb\x7a\x5e\x58\x9f\x4d\xe9\x8d\xde\xe9\xaa\x9f\x73\xf1\x52\x5f\x69\xec\x7c\x89\xa3\xd8\x66\x5f\x87\x77\x1e\x6c\xb2\x7c\xb6\x7f\x22\x88\xf8\xae\x13\x23\xe7\xc6\x39\x6a\xe4\x24\x52\xca\xca\x2e\xa4\xe4\xa8\x63\xe6\x22\x0e\x18\xd6\x35\x4e\xa0\xbd\x84\x01\x0f\x0c\xc3\xce\x66\x14\x35\x9b\xcd\x91\x70\xa3\x3f\xab\x51\xe8\xed\xa9\xc6\x22\x61\x17\xcf\x72\x72\x57\xa2\xe8\xd5\x89\x4c\x50\x75\x59\x45\xac\xa1\xbd\xfe\x46\x61\xce\xce\x25\x56\xa1\xb9\xfc\x12\x9b\x9d\x4b\x6c\xdf\x15\x0b\xf1\x43\x79\xb1\xc7\xbb\x4d\x4e\xbd\xa2\xa4\xd5\xa6\x74\x5b\x4e\xb3\xfa\x0d\xbe\xdf\x19\xb4\x87\x6c\x6e\x46\x16\xc3\xd9\x71\x4d\x15\xdc\xb2\x5f\xb4\x3b\xba\x6d\x43\x6e\xac\x52\x2c\x65\x18\x51\x74\x0b\x0e\x3f\xa7\xd8\x0b\xf9\xa2\xac\xda\x44\x2c\x2a\x5e\xca\x9b\x8a\x59\xb6\x45\x1b\xf8\x16\xf2\xc9\x2a\xee\x52\x0c\xb1\x66\xc3\x38\xc1\x4b\x4e\x9b\x21\x1a\xde\x22\xd7\xc4\x88\xca\x9e\x52\x96\xe1\x15\x3f\xa7\x1a\x8c\x20\x79\x5d\x18\x23\xc9\xd3\xad\x06\x29\x17\x50\x8d\x18\xef\x08\x5a\x78\x40\x1f\x84\xef\x11\x05\x14\xc8\x5a\x6b\x95\xcb\x35\xf3\x89\x54\xc2\xd0\x71\x26\x11\x0b\x99\x86\xae\xda\x24\x0a\x8e\x80\x0f\x7b\x30\x4f\x90\xb9\x18\xc7\x96\x56\x4a\xa2\xaf\x68\x1a\x30\x21\xb7\x7c\xad\x72\xcb\xf2\x64\x9d\xc6\x2f\x97\xd5\x85\xd7\x66\x9d\xb5\xe6\x5d\xeb\xed\x22\x60\x94\x8b\xa6\xea\xcf\xa6\xc2\x7a\x4a\x4d\x18\xde\x88\x66\xf7\xc5\xa5\x89\xbc\x69\x94\xb2\x98\x91\x03\x49\x4c\x3c\xbe\xba\xc1\xf3\xac\x12\x8c\x2a\x8a\xa2\xb0\x78\xb8\x37\x61\x36\x43\xeb\x4b\x19\x9e\xa2\xf2\x5e\xe9\x63\x0c\xe1\xa6\x4f\x8a\xce\x7a\x11\x53\x9f\xbf\x3f\x2d\x09\x82\xfd\x50\x13\x21\xb9\x7d\xad\xbf\x0c\xdf\x25\x2e\x90\x21\x06\x07\x9b\x09\x14\x8f\x37\x13\x76\xdd\xa9\xd8\x20\x1c\xf4\x7b\xdd\x76\xc5\x26\x30\x14\x53\x46\x14\x38\x4e\x70\x45\x39\x82\xfc\x4b\xf6\xfa\x9e\xb1\xe9\x8a\xab\xf6\x43\x7c\xf9\x55\xc7\x3b\x08\xb1\x50\x60\x81\xa2\xce\x2d\x91\xad\xb5\xbe\x50\x6e\x9d\x84\xcd\x9e\x09\x47\x4c\x28\x45\x8c\x6e\x7e\x88\x11\x03\x73\x88\x30\xa2\x5e\x62\x5c\xfe\xaa\xdf\xb0\x05\x03\x5c\x89\x55\x12\x35\x03\x7d\x17\x31\x8e\xa7\x33\x81\x1a\x3f\xc3\x6a\x43\x02\x11\x38\x35\xda\xe4\x43\xbe\x72\x31\xaa\x1e\x19\x24\x92\x1b\x6b\x61\xeb\x94\x52\x80\xef\xc2\x3b\x41\x86\x38\x6c\x6e\x06\x2d\x15\x5a\xcd\x70\x72\x10\x09\x05\x7c\x1e\xad\x75\x81\x04\x99\x31\xc5\x86\x50\x60\xc1\x94\xdd\x6b\x23\x3b\x57\x14\xb8\x87\x14\xad\xd9\x29\xd5\xb6\xaf\x28\xd6\x6e\xa7\x5c\x71\x49\x2e\xb3\x67\xac\x1a\xf0\x49\x86\x37\xe3\x2d\x59\x97\xc4\x49\x61\xd5\xc0\x44\x8b\x66\x93\x92\x5b\x4f\x39\x63\x8c\x52\x4b\x24\xde\xc3\xd7\xf7\xdb\x02\x89\xbc\xb7\x8f\xd5\x06\x59\xc9\xd9\xed\x76\x63\xc6\x99\x4c\xf7\x18\xbe\xb9\xad\x44\x76\xb1\xe2\xa0\x15\xdd\xa1\x97\xd0\x23\xd6\xae\xb9\x61\x08\xde\xdf\x1c\x47\xc3\xc3\xcd\x66\xa3\x3b\x93\x0e\xa8\x78\xa8\xd1\xdf\x9b\xcd\xa4\xe3\xd1\x70\xc0\x63\x1a\x76\x9b\x24\x50\x10\x78\x41\x12\x78\x5e\x60\x59\xbe\x31\xc4\x1b\xba\x6e\x24\x7d\xa5\x9e\x2a\xae\xe0\x02\xce\x63\x9d\x27\x28\xbb\x7c\x8c\xbc\xd4\x28\x35\x96\xe5\x4c\xee\x59\xae\xbc\x97\x41\xc8\xc2\xf0\xf2\xc5\x19\x5e\x09\xf2\x85\xcc\x6d\xe7\xb9\xd5\xd3\x6b\xed\x7e\xbb\xbd\xb7\xc6\x75\x0e\x0f\x8b\x67\x88\xd6\xe3\x19\xef\x80\x2d\x44\x79\x67\x72\xb5\x12\x74\x7e\xd0\x13\xf5\x16\xa4\xd2\xaa\x81\xfe\x80\xb8\xc7\x5d\x2b\x46\x11\x61\xf5\x1c\xc7\x46\x47\xd5\xa4\xaa\xc4\x58\xd9\x35\x19\xd2\x7c\xc8\xdb\xed\xb5\xdb\x3c\xee\x92\x16\xc5\x23\x91\x66\xb0\xc1\xaa\x43\x17\x3c\x85\xed\x1e\x5b\xa6\x2b\xd8\xef\x3c\xb8\x4e\x9c\xdc\x60\xfb\x34\x15\x4a\x03\x84\x93\x59\x9b\x53\x16\xdd\x23\x57\x51\x30\xb1\x8a\x73\x07\x9a\x69\x35\x42\xf5\x6c\xb5\x5b\x0d\x1d\x1a\x21\xac\xb5\xd6\xaf\xa0\x9b\x24\x00\x76\x08\xc1\x38\x9c\x6a\xe6\xad\xee\xf5\xe8\x40\x3e\x97\x49\xc4\x1d\x8a\x8d\x87\x91\xe1\xc1\x81\x7a\xad\xd2\xdd\x15\xf5\xbb\x5d\xba\xc8\x52\x9c\x2a\x8e\xf5\x79\x09\xaa\x2c\xdc\x2a\xad\xe5\xfc\xd9\xc1\x4c\x67\x01\x2b\xf7\x6a\x51\x4f\x2e\xc1\x4b\x45\xb1\x36\x23\xdd\x32\xc0\xbd\x89\xc9\xdc\x5c\x32\xa8\x8b\xcf\x9a\x6a\xb8\x2a\x8a\x1e\x87\x2f\x34\x84\x28\x83\x7c\x7a\xf0\x6d\x42\xb7\x3d\xc2\xeb\xa9\x9a\x1a\xe2\x79\xb9\x97\x15\xd5\x30\xc7\x7a\x26\x62\x6c\x82\x18\x5d\x5e\x77\xd2\x28\x99\x1e\x51\xf3\x56\x92\x69\xca\x1a\x19\xcc\x45\x46\x55\xf4\x2d\xca\x6f\x5f\xa5\x06\x0a\x19\xef\x24\x61\x85\xc1\x78\xaf\x9b\xd8\x8b\x3b\x6d\x46\x57\x97\xaf\x57\xe5\x8d\xa4\x64\xc4\x26\x79\x35\xd5\x28\xf2\x69\x62\xa6\xd3\x43\x5d\xfb\x57\x71\x54\x73\x32\x5c\x7a\x48\x14\x59\x45\xd4\x65\x7d\x5f\xfb\x74\x92\x44\x37\xe0\x03\xa0\x80\x1f\xc6\xe0\x52\xb3\x1b\x8d\x8f\x37\x27\xc2\x8d\x81\xbe\x4c\x2b\x88\x8c\x9a\x2a\x0f\xcd\xa1\x46\x5f\xad\xd2\x5d\x2a\x84\x83\x81\x96\x1f\x6e\xad\x6b\x6e\xb4\x1e\x44\x01\x84\xba\x97\x35\xe8\xfd\x2c\x58\xae\x5c\xdc\x6e\x18\x5f\xbe\xb8\xe3\xd6\xad\xbb\xb4\x94\x2a\x7e\xe3\xc2\x76\xa2\xbc\x65\x14\xf1\x4b\x2b\xab\xa2\xd8\xe2\xd2\x46\xd2\xa6\xe4\x55\x42\xa5\x2e\x86\x45\xfd\xd7\x9c\x29\x7b\x44\x74\x26\x7b\xf8\x24\xb2\x3b\x46\x30\x2f\xd2\x22\x1b\x4c\x8c\xea\x6e\x1c\x4a\x06\x75\xc5\xe3\xcd\xda\x43\x82\xd3\x57\xcd\x87\x09\x45\x46\x9a\x70\xe1\x31\xdb\x07\x28\x37\x78\x9f\x1a\x0a\xd4\x13\xfd\x02\x8f\xaf\x54\x58\xb5\xb4\x5d\x72\x97\x0b\xb6\x55\xd8\x08\x7b\x88\xe8\xe2\xf6\x32\xb5\xc8\x2a\x9f\x41\xa3\xc1\xae\xaa\x3d\x72\xa4\x41\x04\xc9\x64\x84\xee\xba\x20\xb1\xaa\xe8\x94\x5d\xc7\x2c\x36\xe7\xbb\x27\xc9\x30\x7c\x04\x24\xd0\x21\x68\x4d\x5b\xcc\xc3\xa7\x9b\xb3\x56\x96\x35\x36\x37\x3b\x35\x31\x32\x3c\xd8\x57\xaf\x95\x0a\xb9\x88\xa9\xe0\x8d\x6b\xdb\x04\x9e\x63\x03\x95\x52\xa1\x3d\x12\x10\x0e\xf9\x5a\x36\x43\x16\x79\x16\x6b\x76\x41\x76\x3a\xe5\xb5\xb1\x49\x14\x42\x01\xe4\x44\x3c\x42\x6b\x57\xd0\x95\xfc\x2c\x25\xbe\x9f\xb1\x1d\xcb\xb6\x64\xed\x3d\x92\xa8\x9d\xa2\xa3\xd5\x42\xbb\x10\xac\x27\x3b\xd5\x21\xd6\x4c\x9a\xa9\x5a\x7b\xfa\x79\x71\x94\xbf\x15\x40\x70\x3d\xf5\x65\xf2\x0b\x9c\x8b\xe9\xc4\xe8\x96\x0e\x86\xcb\xd0\x67\xd9\x52\x38\x9f\xf2\x88\x83\xf8\xef\x9c\x7e\x4d\xf1\x69\x49\xf5\xfb\xa1\xfb\x63\x34\x46\xaa\xe3\xb4\x6b\xdf\x6a\x1c\x50\x78\x8d\xc9\xa7\xeb\xe5\xa0\xf7\xfb\x84\x71\x44\xb5\x90\x33\x45\x38\x39\x2c\xe7\x9d\x77\x5e\x77\x2a\xde\x53\xe5\xc0\x04\x53\x9e\x9f\xe6\x03\xd9\x7c\xbf\xee\xf7\x45\x32\xfd\xb2\x54\x08\x16\x8a\x86\xbb\x14\xe8\x0f\x0d\xe4\x1a\x65\xbf\x24\xe5\x7a\x0b\x23\x02\x13\xcf\x56\x7a\x39\x21\x9d\xf2\xb8\x18\xd1\x59\x31\x42\xe1\xcc\x78\x8a\xe1\xfd\x89\xc4\xaa\xd0\x2c\xc7\x9a\x39\xe7\x8e\xf8\x46\x35\xe3\xad\x0f\xcd\xe6\xd4\x54\x66\xba\x12\x2d\x98\x96\x2f\x86\x22\xca\x61\x05\x44\xf0\xc1\x5c\xd3\x83\xfc\xfe\x66\x40\x93\x25\x01\x7b\x5d\xba\xd3\xae\x71\x2c\x05\xb7\x82\xbc\x6f\x52\x4b\x5f\xe9\xa0\xbc\xe0\x5f\xbe\xa4\xfe\x65\x67\x1f\xab\x3d\xb1\xad\x56\xb8\x10\x87\x71\x2e\xb9\x70\x52\x4f\x15\x77\x5e\xb1\xc7\x8e\x1f\x25\xae\x7c\x2a\xf0\xee\xe2\xd6\x6e\x9e\xf1\x54\x4e\x57\xd3\x68\x70\xee\xac\xe8\xe8\x3d\xf3\x7e\xc9\x38\xfb\x08\x76\xe5\x14\xf6\xab\xcd\xeb\x2e\x91\x91\xdc\xa7\x77\xce\x5b\x9c\xf0\x37\xe1\xa3\xe8\x37\x41\xb5\xd4\x6c\xeb\x30\x0a\x67\x9a\x05\x34\x36\xd6\x1c\x8f\x0c\xf7\xf7\x74\x67\x53\x89\x58\xc0\xef\xf3\xb8\x75\x4d\xb1\x94\x52\x46\x1b\xbd\xd5\x52\x21\xe2\x72\xf0\x2c\x03\xb9\x10\x2a\xdc\xe3\x5a\x7e\x5e\x4e\xab\x00\x63\xcb\xaf\x6f\x6c\xf1\xfa\xea\xb5\xb6\x7b\x51\x51\xb2\x83\x04\xcb\x91\xd4\x2b\x6d\x60\x58\x73\x84\x2a\x4a\x59\x2d\x56\x0b\x43\x28\x3d\xed\x2c\xae\xa5\x58\xed\x70\x06\x59\x3e\xa2\x78\x45\x07\x43\xdc\x3e\xd9\xeb\x48\x2a\x9c\xec\xe6\x25\x3b\x43\xf4\x14\x11\x6d\x11\x06\x0b\x0e\xc4\xa0\x5e\x85\xb7\x33\x8c\x6c\x63\x39\xde\xc1\xe8\xbc\x46\x11\xcb\xc9\x08\x23\xb4\xcd\x5b\x76\x66\x05\x24\x4d\xa5\x4a\x6a\x44\x20\x63\x55\x77\x77\x36\x19\x8c\x05\xb6\x88\x1e\x53\x34\x0a\xe1\x91\xec\x3a\x81\xea\x01\xc2\xd2\x71\xf7\x68\xd6\xef\xf1\xda\x05\x4e\xc9\xd9\xdc\xf6\x00\x8b\x64\xd9\x85\x31\x86\xce\xbf\xab\x2b\x1f\xe8\xcb\x00\x44\x01\x60\x59\x00\xfe\xdf\x00\xa4\xaf\x01\x28\xdb\x01\x54\x17\x80\xc6\x03\x68\x77\x00\x1c\x37\x01\x74\x0d\x40\xff\x1e\x80\xeb\x69\x00\x33\x0b\x60\xfe\x14\xc0\xf3\x2a\x80\xf7\x59\x00\xff\x4e\x80\xe0\x0f\x00\xc2\x2f\x01\x44\x3f\x0e\x10\xdf\x0e\x90\x74\x01\xa4\xd7\x00\x64\xb3\x00\xb9\x21\x80\xfc\x13\x00\x85\x27\x00\x8a\x5f\x03\x28\x7d\x03\xa0\xfb\x27\x00\x35\x1d\xa0\xe7\x65\x80\xde\x2f\x02\xf4\xf7\x03\x0c\x7c\x11\x60\xf0\x79\x80\x61\x16\x60\x64\x1c\x60\xf4\x77\x00\xc6\x3e\x0b\x30\xfe\x1d\x80\xc9\x49\x80\x55\xdb\x01\xa6\x15\x80\xd5\x07\x01\x66\xfe\x06\x60\x6e\x0d\xc0\xda\x47\x01\xd6\x67\x01\x36\x66\x01\xe6\xb7\x02\x6c\xfa\x0e\xc0\x16\x16\x60\xeb\x67\x00\xb6\x63\x80\x1d\x22\xc0\xce\x67\x01\x76\xfd\x00\x60\xf7\xe7\x01\xf6\xfc\x14\x60\xef\x37\x00\xf6\x7d\x02\xe0\xbe\xad\x00\xfb\xef\x00\xdc\xff\x45\x80\x07\x1e\x02\x38\xe4\x05\x38\xfc\x4f\x00\x47\xbf\x0c\x70\x82\x05\x78\xe8\x32\xc0\xc9\xcf\x03\x9c\xde\x0d\xf0\xf0\x5f\x01\x9c\xf9\x06\xc0\xf9\xb3\x00\x17\x35\x80\x4b\xcf\x03\x5c\xb9\x0f\xe0\x9a\x0e\x70\x7d\x1e\xe0\xa6\x0c\xf0\xc8\x13\x00\x8f\xfe\x00\xe0\xb1\xff\x02\xf0\xf8\x01\x80\x27\xbe\x08\xf0\xe4\x1f\x02\xdc\x5e\x0d\xf0\x0c\x06\x78\xe6\xa7\x00\xcf\xbd\x0f\xe0\xf9\xbf\x02\x78\x5b\x14\xe0\x1d\x97\x01\xde\x05\x00\xef\xfa\xd7\xf6\xe3\xdd\x5f\x03\xf8\xa5\x32\xc0\xfb\x75\x80\x0f\x28\x00\x1f\x4c\x03\xbc\xf2\x4d\x80\x57\x59\x80\x8f\x75\x01\x7c\xfc\x22\xc0\x27\xbe\x0d\xf0\xa9\x35\x00\x9f\xfe\x75\x80\xcf\x24\x01\x5e\xfb\x4d\x80\xcf\x9d\x05\xf8\x8d\x3f\x00\xf8\xad\x97\x00\xbe\x70\x14\xe0\xb7\x9f\x06\xf8\xd2\xe7\x01\x7e\xf7\x3b\x00\x5f\xb9\x03\xf0\xb5\x34\xc0\x1f\x9c\x07\xf8\xc3\xbf\x01\xf8\xe3\x0f\x01\xfc\xe9\x97\x01\xfe\xfc\xa7\x00\x7f\xb1\x1b\xe0\x9b\x51\x80\xbf\x7a\x19\xe0\xaf\xbf\x0d\xf0\x2d\x2f\xc0\x7f\x7d\x1e\xe0\xbf\x01\xc0\xff\x75\x00\xe0\x3b\x7f\x0d\xf0\xbd\x83\x00\xff\xb7\x02\xf0\x83\xa3\x00\x3f\xdc\x0a\xf0\xa3\x2c\xc0\x3f\xae\x03\xf8\xa7\x77\x00\xfc\xf3\x1f\x02\xfc\xe4\x47\x00\xff\xe2\x07\xf8\x9f\x2f\x03\xdc\x11\x01\xee\xfe\x10\x10\xfa\x6b\x40\xf8\x8f\x01\x31\x67\x01\x71\x5f\x06\x24\x7c\x1a\x90\xf8\x21\x40\xd2\x2d\x40\xf2\x67\x00\xd9\x5e\x02\xa4\x5c\x07\xa4\xce\x03\xd2\xbe\x0c\xc8\xa1\x03\x72\x1e\x05\x64\x64\x01\x19\x7f\x03\xc8\xec\xfa\xff\xeb\x81\xbf\x0d\x3b\x5b\x37\x09\xfa\x41\xe7\xd1\x0b\x18\xfd\x29\x60\x9c\x07\x8c\xfb\x00\x93\x04\x60\xfc\x8f\x80\x51\x11\x30\x3a\x7a\xf7\x75\x74\x13\x30\x7a\x07\x60\xcc\x00\x46\x93\x80\xb1\x0b\x30\x92\x00\xe3\x79\xc0\xb8\x74\xf7\x2e\x7a\x0d\x30\xbe\x01\x18\x4f\x01\xc6\x73\x80\xf1\x6a\xc0\x78\x00\x30\xfe\x55\xc0\xb8\x0e\x18\x97\x01\x50\x1c\x30\xda\x05\x18\x5f\x06\x4c\x78\xc0\xf8\x69\xc0\xe8\x3b\x80\x5a\xcf\xc9\x83\xed\xaf\xe3\x4f\x01\x26\x32\x60\x7c\x08\x30\xde\x0a\x18\x7f\x1f\x30\xe9\x03\x8c\xf2\x80\xd1\x3f\x03\xc6\x3f\x02\x8c\x0b\x80\xa9\x0e\x98\x9c\x00\x4c\x52\x80\xf1\x46\xc0\xa4\x17\x30\xfe\x13\xc0\x78\x0c\x08\xfe\x5b\xc0\xa4\x02\x98\xac\xb9\xfb\x13\xfa\xb5\xbb\x3f\x21\x49\xc0\x64\x02\x30\xfe\x0c\x60\xf4\x30\x60\x1c\x04\x8c\x5a\x7f\x8b\x00\xc6\xbf\x0f\x18\xad\x01\x8c\x0f\xdc\xbd\x8b\x5f\x00\x8c\x29\x60\x7c\x0e\x30\x1e\x02\x84\x5e\x01\x8c\x1f\x6b\xbf\x3f\xea\x02\x8c\xb6\xde\xdd\x8b\xdf\x01\x18\xa5\x01\x93\x9d\x80\xf1\x3a\xc0\x58\x04\x84\xaf\x03\xc6\xc7\x01\xa1\x6f\x03\x46\x3f\x02\x8c\x6e\x01\xc6\xfb\x00\xe3\x8f\xdd\xfd\x09\xf9\xe6\xdd\x9f\xe0\xd7\xee\xfe\x04\x7f\xe8\xee\x4f\xf0\x03\x80\xd1\xa7\x01\xa3\x0c\x60\xf4\x4e\xc0\x58\x06\x8c\x5a\x6b\xe4\x03\x82\xbf\x08\x18\xfd\xaa\xf5\xde\x80\x7a\x00\xa3\xdf\xb8\x7b\x97\x5c\x05\x4c\x5a\x6b\x75\x06\x30\x39\xd5\xfe\xdc\xfa\xbf\xe0\xb5\x9d\xbf\x3d\xd3\x5e\x4f\x54\x01\x8c\xbe\x0e\x18\xbd\xa7\x7d\x9d\xa4\x0b\x30\x29\x75\x3e\x67\xee\xbe\xde\x7a\x8e\x7f\xa7\xf3\xf8\x1a\x60\xfc\x47\xed\xb5\xc0\xdb\x00\xe3\xd6\x75\x6c\xe9\x7c\xde\x0e\x18\xf7\x74\x1e\xb5\x36\x16\xd0\x26\xc0\xa8\x09\x18\xdd\x06\x8c\x5e\x05\x8c\xd7\x74\xf6\xb6\xf5\x98\x06\x8c\xc7\xef\xde\xb1\x9e\xdb\x80\x60\xe1\xee\x1d\x2c\x58\x9f\xef\xe2\x91\xf6\x3e\xa1\x64\xe7\x77\xa2\x80\xf1\xef\x01\xc6\xad\x7d\xf7\x00\x46\x7f\xb9\xec\xbd\x57\x01\x46\x3f\x06\x8c\x5a\x78\xfb\x3b\xc0\xe4\x81\xce\xdf\xf3\x03\x5e\xc4\x67\xfa\x7f\xef\x03\x3a\x6e\xe4\xee\x1f\x82\x0f\xee\xf5\xef\x0f\x5a\x37\x0f\x60\x20\x40\x81\x01\x16\x38\xe0\x41\x00\x11\x24\x90\xc1\x06\x0a\xa8\xa0\x81\x1d\x1c\xe0\x04\x1d\x0c\x70\x81\x09\x6e\xf0\x80\x17\x7c\xe0\x87\x00\x04\x21\x04\x61\x88\x40\x14\x62\x10\x87\x04\x24\x21\x05\x69\xc8\x40\x16\x72\x90\x87\x02\x14\xa1\x04\x5d\xd0\x0d\x65\xa8\x40\x15\x6a\xd0\x03\x75\xe8\x85\x3e\xe8\x87\x01\x68\xc0\x20\x0c\xc1\x30\x34\x61\x04\x46\x61\x0c\xc6\x61\x02\x26\x61\x15\x4c\xc1\x34\xac\x86\x19\x98\x85\x39\x58\x03\x6b\x61\x1d\xac\x87\x0d\xb0\x11\xe6\x61\x13\x6c\x86\x2d\xb0\x15\xb6\xc1\x76\xd8\x01\x3b\x61\x17\xec\x86\x3d\xb0\x17\xf6\xc1\x2b\xf0\x28\x3c\x06\xcf\xc2\xfb\xe1\x19\xf8\x10\x7c\x12\xfe\x03\x7c\x1d\x7e\x15\xee\x83\x3f\x82\xfb\xe1\x0f\xe0\x0f\xe1\xcf\xe0\x8f\xe1\x4f\xe0\x4f\xe1\x20\xfc\x05\xfc\x39\xfc\x47\xf8\x14\x3c\x00\xdf\x84\x6f\xc0\x7f\x86\x07\xe1\xef\xe1\x30\x1c\x82\x23\x70\x0c\x8e\xc2\x49\x78\x08\x4e\xc1\x69\x38\x03\x0f\xc3\x59\x38\x07\xe7\xe1\x22\x5c\x80\x4b\x70\x05\x2e\xc3\x35\xb8\x0a\xd7\xe1\x06\xfc\x10\x3e\x0f\x7f\x09\xdf\x81\xef\xc2\x17\xe0\xaf\xe0\x6f\xe1\xff\x80\x5f\x87\xdf\x80\xaf\xc2\x67\xe1\x73\xf0\xfb\xf0\x2b\xf0\x3b\xf0\x15\xcb\x22\x61\x44\x5a\x2b\x8b\x28\x62\x10\x8b\x38\xc4\x23\x01\x89\x48\x42\x32\xb2\x21\x05\xa9\x48\x83\x4f\x20\x3b\x72\x20\x27\xd2\x91\x81\x5c\xc8\x44\x6e\xe4\x41\x5e\xfe\x81\xa3\x17\x1e\x7a\xb0\xbb\x5e\x6e\x3f\x29\x97\xab\x0b\x4f\x6a\x0b\x4f\x2a\xcc\xfe\x07\x2b\x95\x6e\xce\x7a\xd9\xd7\x6b\xbd\xaa\x59\x1f\xfb\xac\x8f\x65\xeb\x63\xbd\xf5\xb1\xdc\xfe\x4a\xcf\xc2\xbb\x76\x5b\x2f\xbb\xac\x8f\x0b\x6f\x5c\xe9\x5a\x78\x62\x7d\xb7\x5a\xe9\xbc\xb1\xf5\xab\xd5\xf6\xd7\x16\xff\x13\xbd\x0b\x4f\xfa\x3a\x4f\xba\x17\xbe\xd2\xdd\xd7\x46\x14\x69\x7f\xc2\x5f\x05\x64\x3d\xf1\x43\x6b\x1d\x5a\xaf\x59\xfc\xaa\xb5\x32\x6b\x3a\xdf\x59\xfa\x87\x16\x7e\x0b\xf0\x3d\x51\xba\xfc\x27\xdb\x7f\x63\x39\x5a\x3f\xf4\xbf\x1d\xad\x1f\xfc\x5f\x42\xeb\xff\x17\xff\xee\x83\xfd\x70\x60\xd9\x6b\x11\x3e\x0c\x00\x1f\x7b\xc3\x4f\xfd\x72\xe7\xf3\x2b\xf0\x2a\x7c\x04\x00\x3e\x6a\xbd\x7a\x10\x00\xc6\xe0\x01\x78\x09\x5e\xee\x7c\xff\xfe\x15\xbf\xf5\x81\x5f\xf0\xff\x70\xf0\x17\xf8\x99\xf7\xae\x78\x75\x08\x0e\xc3\x11\x38\x0a\xc7\xe0\x38\x9c\x80\x87\xe0\xa4\x75\xb7\x3d\x0c\x67\x3a\x77\xdb\x05\xb8\x08\x97\xe0\x32\x5c\x81\xab\x70\xcd\xba\xdb\x6e\xc2\x23\xd6\xbd\x7d\x0b\x1e\x87\x27\xe0\x49\x78\x0a\x6e\xc3\xd3\xf0\x0c\x3c\x0b\xcf\xc1\xf3\xf0\x02\xbc\x0d\xde\x0e\xef\x80\x77\xc2\x8b\xf0\x2e\x78\x37\xbc\x07\x7e\x09\xde\x07\xef\x87\x8f\xc3\xaf\xc0\x27\xe0\x93\xf0\xab\xf0\x29\xf8\x34\xfc\x1a\x7c\x06\x5e\xb3\xee\xcf\xd6\x9d\xfa\x9b\xf0\x5b\xf0\x79\xf8\x02\x7c\x11\x7e\x1b\x7e\x07\xbe\x04\x5f\x86\xdf\x85\xdf\x83\xaf\xc0\x57\xe1\xf7\xe1\x6b\xf0\x75\x00\xa0\xf8\x3a\x00\xf4\x43\x18\x28\x78\xe1\x2a\xbc\x02\x1f\x83\x8f\xc3\x67\xad\xbb\xfc\xcf\xe0\x9b\xf0\x2d\xf8\x0e\xfc\x03\xfc\x04\x5e\x87\xbb\xa8\x1b\xed\x43\xe7\xf1\xd7\xff\x5f\xea\xee\x2f\x44\xb2\xa3\xfa\x03\xf8\xf7\xde\xaa\x3a\xe7\x54\xd5\xbd\xfd\x27\xd9\xdf\xcf\x24\x98\xa5\xd1\x26\x90\x17\x37\xb0\x48\xd3\x4d\x3f\x44\x32\xc4\x15\x46\x8d\x1b\x37\xec\x0c\x83\x2e\x4a\xfc\x83\x84\x3c\x09\xbe\x18\x24\x2f\xe6\x49\x25\xd1\x88\x7f\x12\x13\xa3\x31\x43\x62\x62\x12\xd0\x84\xac\x2e\x61\x43\x08\x98\x85\xd5\xb7\x88\xe8\xfa\x22\x8a\x20\xa8\x28\x08\xb2\x25\xe7\xdc\xdb\x33\xb3\xab\x3b\x13\x7c\x10\xac\x9e\xed\xdb\xb7\xb9\x55\x75\x3e\x7d\x4e\xd5\x6d\xfa\x65\xeb\x5f\x4e\x46\x93\xeb\x26\x87\x27\x37\x4c\xe6\x6f\xbb\xf6\x42\x7d\xe1\xba\x52\x00\x4c\xf0\xc8\x4e\xdf\x33\x78\x0d\x3f\xc3\x1b\xb8\x80\xdf\xe1\x4f\xf8\xbb\xf5\x3d\x55\x7d\xa6\x7e\xd5\xfa\x5e\x33\x79\x6b\xdf\xb7\xba\xe0\xad\xef\x7f\xd6\x2a\x2c\xf0\x37\xfc\x63\xf5\xa8\xa8\x3a\x54\x1d\xae\x6e\xa8\xde\x51\x2d\xab\x5b\xab\xf7\xd9\xe3\xb6\xea\xb6\xea\xb8\x3d\xee\xa8\x36\xfb\xc7\x56\x29\xff\xe3\xf7\x80\x1f\xf7\x6b\xe2\x4e\x7c\x0c\x1f\xc7\x36\x3e\xf1\x5f\xa8\xb6\xaf\xf7\xf5\xf6\x30\xbe\x85\x47\x30\xc2\xa3\xf8\x36\x1e\xc3\x77\xf0\x5d\x3c\x8e\xef\xe1\x09\x6c\x5b\x05\x7e\x7f\xa7\x06\xb5\xea\x7e\x88\x17\xf1\x82\x55\xe3\x8f\xae\x50\x7f\xb6\xcb\xd5\x0d\x2a\x9c\xc0\x14\x54\xfd\x02\x53\xcc\xca\x97\x31\xc5\xbc\x3c\x88\x29\x16\xf6\xbc\x2c\x0f\x60\x8a\xf5\xf2\x7b\x4c\xb1\x51\x9e\xc1\x14\x9b\xf6\xbc\x55\x9e\xc5\x8d\x18\x96\xfb\x70\x23\xc6\xe5\x7e\xdc\x88\x69\x79\x18\x47\x30\x2b\x0f\xe0\x08\xe6\xe5\x6b\x38\x82\x45\x79\x0e\x47\xb0\x2c\xdf\xc4\x11\x6c\x95\x97\x71\x14\xc3\x72\x3f\x8e\x62\x5c\xbe\x82\xa3\x98\x96\x2f\xe2\x9d\xd8\x2a\xbf\xc2\x0c\xc3\xf2\x3a\x66\x18\x95\x17\x31\xc3\xb8\xbc\x82\x19\xae\xb7\x77\x0e\x97\x97\x31\xc3\xb4\x3c\x82\x19\xd6\xca\x93\x98\xe1\xd6\xf2\x18\x66\x38\x66\xcf\xeb\xe5\xd7\x98\xe1\x78\x79\x14\x33\x9c\x28\xcf\x63\x86\x3b\xca\xe3\x98\xe1\x64\xd9\xc6\x0c\x9b\x76\xfd\x56\xd9\xc6\x1c\xc3\xf2\x55\xcc\x31\x2a\x2f\x63\x8e\x71\x79\x08\x73\x5c\x5f\x5e\xc2\x1c\x87\xcb\x0b\x98\x63\x5a\x1e\xc4\x1c\x6b\xe5\x69\xcc\x71\xac\x3c\x87\xb9\x8d\x3c\xc7\xf1\xf2\x03\xcc\x71\xa2\x9c\xc5\x1c\x27\xed\x79\xab\x9c\xc7\x02\xc3\xf2\x3c\x16\x18\x95\x73\x58\x60\x5c\x5e\xc2\xc2\xa2\x5d\x58\xb4\x0b\x4c\xcb\x36\x16\x58\x2b\xa7\xb1\xc0\xb1\x72\x06\x0b\x1c\xb7\xf7\x4f\x58\xdf\x93\xe5\x1c\x96\x18\x95\x33\x58\x62\x5c\x9e\xc6\x12\xd7\x97\x9f\x60\x89\x69\x79\x08\x4b\xac\x95\xc7\xb1\xc4\xb1\xb2\x8d\x25\xd6\xcb\x1f\xb0\xc4\xf1\xf2\x24\x96\xb8\xbd\x3c\x85\x25\x3e\x68\xaf\x4f\x96\x67\xb0\xc4\x46\x39\x8b\x35\xac\x97\xdf\x60\x1d\x6b\xe5\x8f\x38\x81\x61\x39\x8b\x13\x18\x97\xb3\xd8\xc0\xb0\x3c\x8b\x0d\x8c\xcb\x53\xd8\xc0\x5a\x39\x8f\x0d\xac\x97\x37\xb0\x89\x61\x79\x05\x9b\x18\x97\xd7\xb1\x89\xb5\x72\x0e\x5b\x18\x97\x57\xb1\x85\xf5\xf2\x5b\x00\x23\x00\xaf\x47\x0e\x70\xae\x76\xce\x85\x50\xd7\x75\xed\x6a\x57\x7b\xe7\xbc\xf7\xde\x79\xe7\xea\xda\x07\xef\x42\xf0\x5e\xff\x42\xed\x82\xa3\x10\xba\x93\xc0\x21\x78\xed\xe0\x6b\xbd\x58\xff\xea\xda\xd7\xc1\x5e\xbb\xda\x7b\xd2\x41\x6c\x48\x3b\x04\x6d\x3a\x70\x5d\xbb\xee\xc4\xce\xba\xe6\x9c\x4e\x56\xbb\xdd\x33\xaf\x81\xf8\xfe\x6d\xe7\x82\x3e\xd7\xfb\x34\x20\x49\x67\xb1\x48\x6b\xa7\x71\x75\x91\x79\x0b\xbf\xb7\x90\x37\x0e\xd5\x2e\x78\xa6\xe0\x29\xf8\x40\x24\x81\x82\xf3\xce\x87\xba\x0b\xa0\xb3\x50\x1f\x8c\x37\x6b\x47\x0d\x6a\x21\x6d\x2b\x8b\xbe\x0e\x74\x29\xc8\xe6\xdf\xd3\x6a\x0b\xa1\xb7\x90\x3b\xd0\x92\x23\xc1\x7b\xb5\x10\x69\x97\xde\x12\x56\x16\x17\x34\x74\x0e\x76\xa0\xda\x93\x17\x26\x6f\x27\x14\x69\x65\xb1\x54\x39\xcd\x52\x50\x8b\xc6\xe7\x2c\x6f\x61\x8f\x85\xb5\x19\xb4\xb7\x50\x6f\x09\xbe\x03\xb9\x7f\x6b\x51\x8c\xf7\x9e\x35\xd3\xfb\x5b\x9a\xa4\x16\xe7\x43\xe0\xce\xe2\xbc\x45\xa6\x8d\xac\xa8\x3a\x8b\xce\x4b\x5c\x7b\x0a\x91\x39\x30\x05\x62\x4e\xcc\xa4\x1d\xc8\x59\x0f\x67\x97\xd7\x1c\x7a\x0b\x09\x59\x11\xea\x15\x7a\x30\x8b\x8e\xab\xb3\xd8\x09\xef\x82\xba\xf7\xf7\xd6\x5e\x08\x75\xe8\xca\xd4\x84\x6f\xc2\xd2\x66\x5e\x59\xd8\x0a\xc3\xd9\xa7\x4c\xbd\xc5\x39\x62\xf2\x2c\xa4\xa9\x61\x76\x9e\x43\x14\xb3\x30\x73\x56\x4b\x70\x81\x14\x6c\x95\xa7\xa5\x20\x96\x43\xb5\x68\xde\xbc\x0d\x49\xba\x04\x45\x5b\x6f\xf1\x57\xb0\xf8\xb0\xa7\x39\x0b\xa1\xb7\x88\x73\xdd\x3a\xba\x52\x03\x06\x0d\x23\x04\x1d\x43\x58\xaf\x0e\xb6\xba\xbd\xcd\xc1\xbd\x25\xb0\x90\xce\xcb\xe2\x02\x87\x24\x42\xc2\xc4\x22\x8d\x08\x6b\x81\xb0\xa3\xce\x42\x66\x21\x4b\xa2\x27\x8a\x4c\xd4\x59\x58\x2d\x51\x2d\x3a\xb0\xce\x63\x30\xb9\x14\xe4\xac\xd2\x77\x79\x8e\xba\x25\x67\xd9\x12\xad\xda\xfd\x2d\xc3\x46\xd4\xa2\x2b\x59\x94\x6f\x16\xf2\x36\x01\x13\x39\x4f\xc2\x41\x22\x69\x6a\x44\x5c\x10\xca\xd1\x2c\x22\xb1\x91\xc8\x9e\xcc\xa2\x45\xe8\xb5\xe2\xd8\x45\xd2\xb4\x69\x61\x6a\x0d\xee\xb5\x68\xb3\xf5\xef\x42\x07\xdb\x63\x59\x19\x77\x2d\x44\xce\xaa\x21\x74\x96\x78\xb0\x65\xd4\xae\x2c\xd1\x2c\xe4\x75\x88\xb0\x6b\x61\xb3\x30\x0b\xb3\x44\xb3\xa4\x48\xca\x89\xb1\x8d\x51\xb4\x83\x78\x66\x4b\x5f\x6f\x21\x5d\x16\x9e\x39\x0b\x73\xd0\xe5\x44\x12\x9c\x0b\x49\xdb\x8e\xc5\xda\xa5\x20\x75\xd3\x9e\xe6\x88\xa4\x2f\xd3\x37\x65\x19\x0f\x22\x88\x7c\x20\x8e\x51\x4b\x4c\x2d\xdd\x6a\xd0\xf0\x35\xb8\x28\x14\x13\x2b\x27\x26\x47\x91\x9a\x14\x39\x09\xc7\x98\x06\x31\xad\x2c\x5a\x84\x41\x77\x29\x71\x89\xad\x20\x03\x4b\x16\x61\x5b\x2c\x6a\xf1\x9d\xa5\xdb\xcb\x42\x48\x97\x59\x94\xe3\x6d\xd5\xae\x64\xac\x81\x98\xc5\xb2\x95\xb4\x5e\xf6\xb7\x5c\x35\x34\x8b\xee\x4a\x51\xc7\x22\xcf\x8e\x39\x48\x67\xd1\xe0\xd4\x92\x45\x34\xfc\xe4\x29\x72\x9b\x13\xa7\xc8\x31\xa5\x61\x4a\x12\x38\x50\x54\x8b\xa6\x4f\x2f\xf7\x59\xeb\xcf\x2c\x8d\xae\x75\xfd\x78\x38\xea\xdd\x29\x6b\xeb\x2c\xd4\xc1\x0c\xb4\x63\xe1\xcb\x2c\xec\x99\xa3\x6e\x3d\x66\xc9\x56\xfb\xfb\x34\xe0\xea\x51\x5a\x59\x92\xdd\xcb\x3d\x3b\x5b\x0d\x22\x1c\x99\x7d\x90\x24\x94\xb2\xc4\x24\x92\xb2\xa7\xa4\x16\xc9\x91\x53\xce\xa3\x94\x63\xe0\xc0\xd1\x8b\x58\x29\x8a\xf7\xd1\x67\x61\xb3\x88\xd5\xa0\x2e\x27\xcf\x91\xbc\xa7\xa6\xc9\x39\xdb\x5e\xe6\xc9\x60\x29\x5f\x9a\x1c\xb5\xd8\xeb\x9e\xe7\x2d\x84\x1d\x8b\x3f\xc8\x72\x68\x9c\xc0\xec\x49\x24\xaf\x2c\x5e\x84\x6c\x82\x28\xe2\x43\xcc\x91\x73\x13\x2d\x35\xd9\x73\x92\x41\x93\x25\x27\x49\xb9\x19\xe7\xce\x92\x74\x41\x69\xfa\xf4\x72\xdf\x08\xeb\x67\xbd\x63\x21\xf6\x9c\x3a\x4b\xd3\x34\xbd\x85\x2c\x49\xd9\x72\x23\xab\xa6\x39\xdc\xdd\xdf\x44\xbc\xd8\xf6\x11\x6c\x07\x6f\x74\x05\xee\x6f\xf9\xbf\x71\x56\x0b\x8b\xe4\xac\x2b\x8f\x83\xf8\xd8\x5b\xd2\x1e\x8b\x7e\x86\xb9\xf1\x9c\x65\xd8\x36\xd2\x24\xc9\x4d\x33\x6e\x9a\x14\x44\x2d\xf1\x32\x8b\x7e\x9c\x31\x0d\x52\x8a\x66\x11\xb3\xb4\xda\x56\x16\x83\x35\x3b\x85\x16\xbb\x7b\x0f\x5d\x66\x91\xa4\xf9\xb6\xca\x6b\xe8\x40\xcb\xff\x5f\xa5\x96\xc0\x12\x9b\x6c\x63\x99\x85\x6d\x02\xb3\xa4\x26\x71\xd3\xa6\xd4\xac\x2c\xa3\xb6\x89\x4d\x8e\xb9\x69\xaf\x6a\xda\x44\x42\x92\x43\x4c\x12\x23\xa5\x18\x42\xf2\x6d\x94\xd4\x59\x86\x9d\x45\x82\x5a\x02\x9b\x45\xc7\xd5\xef\x18\x6d\x6f\xc9\xf9\x52\xcb\xee\xfe\x16\x35\x10\xdb\x3e\xcc\xd2\x1e\x6c\x79\xcb\xd5\x0d\x44\x02\xc7\xd8\x36\xba\x21\x9a\x25\x76\x96\xac\xd3\xa6\x26\x49\x33\x48\xb9\x49\xb1\x69\x83\x34\x71\x34\x68\x63\x9b\x63\xd3\xb6\x57\xb7\x6d\xee\x2c\x29\x69\xfc\x66\x09\x6a\xd1\xfb\x69\xca\xc3\x9c\x13\x07\x1d\x32\xeb\xb7\x86\x81\xb6\x1d\x8b\x35\x2b\xb4\xb8\x6a\xc1\x76\xd3\x1d\x4b\x0c\x56\xd9\x6a\x11\x91\x01\xf9\xee\x5b\xc3\x95\x1a\x70\xcd\x21\xb3\x48\x6f\x61\x09\xd1\x6b\x58\x9a\x7b\xb5\x50\x6a\xb3\xb4\x83\x94\x35\x35\x66\x19\x0f\xda\xa4\xa9\x69\x07\x87\xda\x41\xa6\x48\xd2\x84\x94\xd5\x92\x53\xa0\x1c\x06\x29\xf6\x96\x91\x59\x38\x86\x68\x96\xe1\x70\x30\x18\xd8\x3d\x26\x30\x0f\x7a\x4b\xd3\xe4\x9d\x42\xd3\x2f\x79\xf6\x3a\xf5\xb6\xa4\xb7\x63\xfd\x56\x67\x96\x70\x90\x05\x55\xf5\x44\xf5\x25\x04\xd4\x9e\xdc\x69\x00\x3f\xef\x8e\xf5\x37\xf0\x9e\xea\xb3\x97\xfd\x8e\xe1\xf6\x9e\xbc\xfb\xce\xbb\x80\x9b\x31\xb9\x70\x5d\x7d\xb1\xb4\x40\x7d\x11\x7f\xd9\xf9\x2d\xd0\x8e\x9f\xd3\xc3\x7d\xd5\xbd\xc0\x29\xd4\x1f\xaa\x3f\x7d\xcb\xdd\x77\x7d\xf2\xa3\x1f\xb9\xfb\xee\x4f\x4d\x6e\xbf\x6b\x32\x99\x4c\x4a\x29\x65\x56\xca\xc5\x5b\xde\xff\xde\xe3\x37\xdd\xb4\xdb\x4f\xff\x1d\xfd\xc0\xbb\xfe\xfc\xe1\xe1\xf2\xaf\xb8\x36\x9c\xd1\xb7\x9f\xff\xfc\xf0\xde\xd5\xb1\x9c\xba\x78\xde\xdf\xe3\x4f\xa3\xff\x5f\xe9\x56\xfd\xfc\xe9\x8b\xe7\x01\xff\x6a\x39\x55\x9e\xf1\xf7\xfc\xcb\xef\x99\xaf\xd9\x3b\xaf\xe1\xa7\x10\x3b\xaf\x21\xb8\x19\x09\xc0\x17\xaa\xb7\xa3\x42\xf5\xcf\x00\x00\x00\xff\xff\x73\xb3\xfd\xb3\x04\x39\x01\x00") + +func fontsComismshTtfBytes() ([]byte, error) { + return bindataRead( + _fontsComismshTtf, + "fonts/Comismsh.ttf", + ) +} + +func fontsComismshTtf() (*asset, error) { + bytes, err := fontsComismshTtfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/Comismsh.ttf", size: 80132, mode: os.FileMode(438), modTime: time.Unix(1575019249, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9c, 0xa9, 0xab, 0x91, 0xc5, 0x60, 0x5a, 0x17, 0x13, 0x2b, 0x13, 0x3, 0x0, 0x48, 0x81, 0x6d, 0x20, 0x3e, 0xa0, 0xbe, 0xac, 0xaa, 0x25, 0xf5, 0x87, 0xbd, 0x3f, 0x1, 0x3e, 0x41, 0xd6, 0x89}} + return a, nil +} + +var _fontsDennethreeDeeTtf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\xfc\x09\x78\x1c\xc5\x99\x3f\x8e\xbf\xd5\xd3\xfd\xbe\x92\xfa\x98\x99\x9e\xee\xe9\x91\x66\x46\xd2\x4c\x4b\xd3\xba\x47\x9a\x9e\x9e\x96\x75\x58\xb2\x65\x0b\xdf\xd8\xc6\xd8\x06\xe3\x0b\xdb\x31\xe6\x34\x60\x62\x6e\xcc\x19\x02\xc6\xe6\x72\x38\x96\x2b\x90\x10\x08\x04\x48\x38\x12\x08\x49\x08\x21\x27\x47\x12\x42\xb2\x84\x0d\x84\x84\xb0\x09\xc7\x26\x84\xdd\x78\xb3\x60\x8d\xff\x4f\xd5\xc8\x6c\x0e\xf6\xf9\x3e\xcf\xff\x37\xe3\xd6\xf4\x51\x55\x5d\x55\x5d\xf5\x79\x3f\x9f\xf7\xad\x36\x30\x00\x50\x61\x17\x44\xa0\xff\xf0\x23\x8a\xa5\xb1\x0f\xf6\x5c\x0e\xc0\x06\x01\x60\xe5\xa6\x93\x36\x6e\x7f\xf2\xc6\xaf\xff\x12\x40\x19\x07\x88\xac\xdc\xba\xf1\xf4\xed\x07\x0f\x42\x04\xd8\x9c\x77\x01\xa0\x6e\xeb\x89\x67\x7d\xe2\x81\xce\xb7\x3e\x07\xd0\xb0\x03\x98\xdf\x71\xdc\x96\x8d\x9b\xff\xb8\xbb\x6d\x11\x00\x3c\x09\x00\x95\xe3\x8e\xdb\xb2\xd1\xe8\xc3\xef\x01\xc0\x7f\x01\x40\xdb\x71\x27\xed\x38\xf3\xa5\x37\x8a\x5f\x00\x60\x57\x03\x44\x1e\x3a\xf1\x94\x4d\x1b\x7f\xba\xf7\x92\x33\x01\xea\x6e\x04\x60\xaf\x9c\xb4\xf1\xcc\xed\xac\x14\x39\x06\x80\xa5\x00\xa0\xf5\xe4\x8d\x27\x6d\x49\xbe\xbf\x06\x81\x8d\xde\x02\xa0\xe0\xf6\x53\x4e\xdf\xf1\xad\xcf\x2f\xb8\x03\xd8\xec\xcf\x01\x48\x73\x45\xdd\x19\xc0\xfb\xcf\xde\x2c\xad\x8f\x8e\xfc\x05\xd4\x3a\xe0\x9f\x67\x36\xbe\xd3\x54\xfb\xfd\x53\x7b\xf5\x8b\xd5\x75\x75\x80\x8f\x00\x00\x8a\xf4\x50\xcb\x43\x33\xab\x4b\x60\xa2\xee\xd7\xd5\x2f\x56\xef\xaf\x83\x8f\xae\x1c\xfa\xbc\x2b\xce\xbc\x1b\x39\x06\xe6\xc2\xc7\x7f\x58\xe4\x39\x76\x35\x28\x50\xa7\xdc\xac\xf8\x00\x2c\x5d\xfb\x8d\xfc\x14\x3e\x21\x99\x00\x12\x28\xd3\x09\x77\x01\x7c\x61\x29\xc0\x82\x43\x19\xe7\x2d\x6a\x6d\x85\x71\x68\xfd\x50\x52\x7e\x56\x5d\xc6\x7c\x9a\xc9\xbe\xd2\x0a\x2c\x3e\x4b\x5c\x95\x01\x36\x8b\xe2\x0f\xd4\x36\xe9\x0e\xf8\xb1\x74\x07\x6c\x51\x06\xe1\x8c\xc8\x7e\x38\x15\x17\xc0\x4c\xbc\x0e\x6e\x64\x47\xc3\x16\x69\x3f\x1c\x90\xf6\xc3\x90\x0c\xf0\x4a\x64\x3f\xac\x92\x7a\x61\xa7\x74\x1b\xec\x90\x7a\xe1\x42\x69\x06\xe8\x91\xfd\xb0\x38\xb2\x5f\x5c\x3b\x2d\xb2\x1f\x8e\x88\xec\x87\xee\xe9\x73\x7c\xdb\x70\x68\x5f\xa4\xef\x85\x9d\xbc\x8c\x43\x9b\xf4\x2e\x5c\x42\x6f\xc0\x66\xf9\x49\x18\x8b\xdc\xc3\x9f\x16\x40\xe4\x0a\x3e\x0a\x00\x22\x37\x01\x44\x7e\x07\x20\x87\x00\xd2\x5f\x00\x22\xd7\x02\xc8\x37\x02\x44\xde\x05\x50\x9e\x04\x50\x2a\x00\x72\x11\x40\xee\x00\x50\xe6\x00\xc8\x0f\x02\x44\xfe\x13\x40\x7e\x0e\x40\xfe\x26\x80\xd2\x07\x80\xbd\x00\xf2\xfb\x00\xf2\x62\x00\x79\x33\x80\xb4\x1f\x40\x9a\x51\xfb\x8d\xec\x17\xfd\xc0\xb7\x97\xe4\x07\x61\x4c\xdc\xf7\xd3\x00\x91\xcf\x02\x44\xd6\x02\x44\x2e\x06\x88\xbc\x00\x20\xb7\x02\x48\xff\x51\xab\x8f\x7c\xfa\xdf\xdc\xbf\x05\x40\x9e\xac\xd5\x41\xec\xdf\x01\x10\xf9\x1e\x80\xfc\x85\x5a\x5d\x94\x18\x00\xb6\x03\xc8\x6f\x03\xc8\x71\x00\xf9\xd3\xe2\x9e\xef\x45\xf6\xb3\xfb\x22\xfb\xe1\xa2\xc8\x7e\x58\x27\xdd\x31\x5d\xe6\x7e\x58\x14\xd9\x0f\x67\xcb\x7f\x84\xba\xe9\xeb\x5f\x94\x01\x7e\x8a\x57\xc0\x66\xe9\x72\xd1\x2f\x0f\xf0\xfe\x12\xc7\xb7\x01\x48\x77\xc2\x48\x64\xba\x0d\xb5\x76\xb0\x11\xf9\x16\xd1\x96\xb5\xec\x00\x5c\x28\x03\x3b\x8e\x9f\x97\x5e\x10\x79\xb7\xe0\xfd\x00\x74\x3f\x00\xff\x95\xde\x05\x40\xf9\xe3\xb7\xba\x49\x00\x65\x27\x80\x7c\xc1\xdf\x6f\xd2\x35\x7f\xbf\x29\x7f\x04\x40\x13\x00\x97\xfc\xf3\x16\xd9\x0f\x9f\xe5\xbf\xca\xab\x7f\xbf\xc9\x3f\x05\x90\x37\x00\xc8\x6f\x00\x44\x6e\xfe\xf8\x4d\x79\x60\xfa\x19\x5c\xf5\xf7\x9b\x24\xfd\xfd\xc6\xfb\x4c\x5e\x01\x10\x79\xff\x63\x36\x3e\xb6\xf8\x33\x77\xff\x7e\x8b\x6c\x9e\xbe\xbe\x59\x94\x91\x90\x01\x5e\x9d\xde\xaa\x32\xc0\xbf\xc9\xc0\x6e\x94\x81\x1d\x2e\x03\x3b\x55\x06\x78\x5b\x06\xf8\xa5\xbc\x02\x06\xf9\x6c\x97\x7a\xe1\x09\x31\xee\xf9\xf8\xdd\x03\x4f\x44\xf6\x88\x5f\x3e\x96\x0f\x8b\xec\x87\x49\x19\xe0\xe5\x3a\x80\x0b\xa5\x9d\xf0\x80\xb4\x13\xb6\xb0\x95\xd5\x2f\x46\xf6\x43\x3f\x7f\xae\xf4\x2e\xff\x3d\xf8\x52\xdd\xaf\x01\x94\x5f\x8a\xfa\x2d\x96\x67\x00\x2a\xef\x40\xbf\xfc\x18\x9c\x39\x3d\x17\xe2\x91\xfd\x30\x5b\xba\xe9\xe0\xd7\xf8\xb8\x38\x34\x3f\xe4\x01\x00\x79\x86\x98\xb2\x91\xe9\x2d\x53\x43\x11\xb6\x88\x23\xa4\x38\x96\x59\x3f\x00\x4c\xc2\x38\x28\x80\x70\x3e\xdc\x01\xf7\xc3\x97\xe0\x20\x1b\x90\xbe\x2f\xfd\x50\x7a\x35\x72\x7e\xab\xd5\xda\xd4\xda\xdc\x9a\x6f\x2d\xb4\x0e\xb5\xce\x69\xfd\x5c\xeb\x17\x5a\xef\xcf\x25\x73\xf9\xbc\x94\xc7\x7c\x34\x6f\xe6\xed\x7c\x53\xbe\x39\xdf\x9d\x9f\x97\xdf\xf2\x9e\xf4\xa1\x74\xf0\x20\xc7\x45\xb8\x03\x3e\x0b\x5f\x82\x07\xd8\x80\xf4\x3d\xe9\x87\xd2\xcb\x91\xf3\x5b\x13\xad\xa9\xd6\x4c\x6b\x6b\x6b\xa1\x75\x46\xeb\x9c\xd6\xbb\xfe\xa1\x9c\x78\xde\xce\x37\x4e\x97\xb3\xf9\x3d\xf6\x21\x3b\x78\xf0\xe0\x1b\x00\x07\xbf\x0d\x70\xf0\xa9\x83\x7b\xa7\x3e\x9c\xfa\x60\xea\xdd\x03\x77\xbc\xfe\xd5\xd7\x1f\x79\xfd\xe1\xd7\xbf\xf2\xfa\x83\xaf\xdf\xfa\xfa\xf5\xaf\x57\x5e\x2f\xbf\xde\xff\xeb\xef\xff\xfa\xc9\xd7\x5e\x7d\xed\x95\xd7\x5e\x7c\xed\xa7\xaf\x7d\x07\xe0\xb5\xef\xbf\xf6\xf5\xd7\x6e\x7f\xed\x92\xd8\x5b\xca\x5b\xa2\x95\x73\x00\x60\xf6\xff\x81\x91\xff\xd7\xc7\xfa\x87\xe3\x08\xc4\x60\x27\xfc\x0e\x50\x6a\x98\x86\xe7\x7f\xc4\x63\x06\xd2\xf4\x9e\xf4\xff\x28\x9b\x4d\x97\x28\x8b\x3e\x27\xa8\x83\x7a\x68\x00\x15\x34\xd0\xc1\x80\x28\xc4\x20\x0e\x26\x24\xc0\x02\x1b\x92\xe0\x40\x0a\x1a\xa1\x09\xd2\x90\x81\x2c\x34\x43\x0b\xb4\x42\x0e\xf2\xe0\x42\x1b\xb4\x43\x01\x3c\xe8\x80\x4e\xe8\x82\x6e\xe8\x81\x5e\xe8\x83\x22\xf4\xc3\x00\x94\xc0\x87\x32\x04\x50\x81\x10\x06\x61\x06\x0c\xc1\x30\x8c\xc0\x28\xcc\x84\x31\x18\x87\x59\x30\x1b\x26\x60\x0e\xcc\x85\x49\x38\x0c\xe6\xc1\x7c\x58\x00\x0b\x61\x11\x2c\x86\x25\x70\x38\x2c\x85\x65\xb0\x1c\x8e\x80\x15\x70\x24\xac\x84\x55\xb0\x1a\x8e\x82\xa3\x61\x0d\x1c\x03\x6b\x61\x1d\xac\x87\x0d\xb0\x11\x00\x2e\x81\x4b\xe1\x53\xf0\x69\xb8\x06\x3e\x03\xb7\xc0\x67\xe1\x0e\xb8\x13\x3e\x07\x77\xc1\xe7\xe1\x0b\x70\x2f\xdc\x03\x5f\x84\xfb\xe0\x4b\x70\x3f\x3c\x00\x0f\xc2\x97\xe1\x61\xf8\x0a\x3c\x02\x8f\xc1\xa3\xf0\x04\x3c\x0e\x5f\x87\x27\xe1\x45\xd8\x0e\x9b\x60\x33\x1c\x07\x2f\xc1\x27\xe1\x76\x38\x19\x8e\x87\xd7\x60\x07\x6c\x03\x80\xcb\xe0\x46\x78\x13\x4e\x85\x3f\xc0\x5b\xf0\x09\x38\x03\x7e\x0d\xbf\x85\xdf\x00\xc0\xbf\xc3\x09\x70\x36\x00\xdc\x0d\x5f\x83\x0b\xe0\x58\x38\x09\x7e\x07\x00\xbf\x87\xd7\xe1\x44\x38\x07\x7e\x0e\x11\xd8\x05\x17\xc3\x3e\xd1\xbf\x3f\x82\x67\xe1\xc7\xf0\x13\x78\x0e\x9e\x87\xaf\x02\xc0\xb7\x00\xe0\x65\xd8\x02\xbf\x80\x7f\x85\xb7\xe1\x1d\xf8\x19\xec\x84\x17\xe0\xa7\x00\x70\x11\x5c\x01\x17\xc2\x95\x70\x39\x5c\x05\x7b\x60\x2f\xec\x86\xeb\xe0\x7a\x00\xb8\x16\x6e\x86\x7f\x81\x9b\xe0\x29\xf8\x36\xfc\x00\x4e\x81\x67\xe0\xbb\xf0\x3d\x38\x13\x7e\x08\xdf\x87\xa7\xc5\x3d\x56\x4e\x7f\x2f\x83\x87\xe0\x5d\xb6\x84\xfd\x42\x1a\x97\x56\x4b\x67\x4b\xb7\x44\x7a\x22\xf3\x22\x1b\x22\x9f\x8c\xdc\x18\xb9\x3b\xf2\x47\xb9\x41\x2e\xcb\xdb\xe5\x9b\xe5\x1f\x29\xa0\xb4\x29\x37\x2b\x2f\x62\x0c\xe7\xe0\xd1\x78\x32\x5e\x82\x3f\xa0\xc9\x86\x82\xf6\x98\x71\x6d\xec\x39\x6b\x89\x53\x6a\xbc\xa7\xb9\x2b\x77\x6e\x9b\x51\x78\xb9\xe3\xc5\x9e\x58\xdf\x45\xfd\x67\x97\x1e\x0b\x30\x7c\x77\x08\x87\xdf\x9e\x79\xda\xd8\xfe\xd9\xf9\xb9\xcb\x0f\xbb\x65\x41\xd3\x47\xdf\xc2\x82\x99\x8b\x9b\x0f\x7f\x60\xd9\x15\x47\x3c\xb3\x6a\xf2\xe8\xae\x63\xee\xd8\x98\xdf\xbc\x63\x2b\x6e\xfb\xc9\x09\x3f\x3a\xa5\xee\xd4\xb3\x4f\x3f\xed\x8c\x07\x76\x56\xcf\xfe\xdd\xb9\xd5\xf3\x7f\x7b\xe1\xf1\x17\xfd\xf1\xd2\xa6\xcb\x17\x5c\x71\xfd\x55\xe6\x55\xf3\xae\x5a\x79\xd5\x9e\xab\x1e\x12\xdf\xfd\x7b\x8e\xdf\xdb\xb3\x77\x7c\xef\x13\x7b\xff\x7a\xf5\xae\xab\x77\x5d\x7d\xe7\xd5\x8f\x5c\xb3\xe4\x9a\x25\xd7\xec\x98\xfe\xee\xbe\x66\xf7\x35\xf7\x5c\xf3\xa3\x6b\xde\xe7\xdf\x6b\xad\xff\x3f\xbf\x7d\xff\x1f\xbf\x3b\xfe\xe9\x7b\xf5\xb5\x77\x5e\xfb\xc8\xb5\x4f\x5f\xfb\xab\xeb\xb4\xeb\x4a\xd7\xad\xb8\xee\xdc\xeb\xee\xbe\xee\x91\xeb\x9e\xba\xee\xe5\xeb\xde\xbb\xbe\xee\xfa\xd2\xf5\xc7\x5c\x7f\xd9\xf5\x2f\xed\x5b\xb1\xef\xf8\x7d\x4f\xef\xfb\xc5\xbe\xb7\xf7\x7d\xf0\x99\xf2\x67\x2e\xba\xa1\xef\x86\xeb\xc5\xf7\x77\x37\x7c\x70\x63\xd7\x8d\xcb\x6f\xdc\x70\xe3\x8e\x1b\xdf\xbe\x29\x73\xd3\xea\x9b\x3e\x79\xd3\xf5\xfc\x2b\x0c\x3b\x47\xfc\x5b\x94\x9b\x21\x02\x04\x6d\x30\x08\xe0\xc7\x73\xf1\xf6\x5c\x3c\xe7\x54\xc2\x8a\x5f\x4a\xda\x16\x92\xc1\x6c\xcb\x71\x0b\x41\xd9\x0c\xca\x05\x37\x4f\x48\x09\x7e\xad\x85\x25\x6d\x2b\xca\xd0\xcd\x17\x59\x21\x28\x6f\x8e\x0c\x1e\xf8\x40\x7a\x69\xaa\xe7\xc1\x96\x74\x30\x7c\xcc\xf6\xbe\xf1\xb1\x79\xa9\x56\xf7\xae\xd9\x43\x85\x96\xa6\xe6\xf1\x19\x6a\x7d\x83\x36\x58\xdf\x30\x68\x90\x5a\x3f\x4a\xca\xcd\x1f\x7c\xa2\xa4\x54\xde\xcd\x44\x9b\xd7\x2f\x1d\xd8\xb4\x74\xe9\x71\xc5\xc2\xfa\x8d\xfe\x22\x96\x59\x38\x63\x76\x3c\xda\x78\xe0\xe0\x50\x83\x3a\xa2\xd6\xab\xea\x4c\xa3\xe1\xb0\xfa\xfa\x06\x90\xe0\xc7\x07\x3f\x64\x3f\x54\x1e\x82\x3a\xc8\x70\xda\x57\x16\xf5\x8b\xd0\xc7\xd4\x85\xcd\x18\xe8\xea\xec\xea\x5c\x7a\xc1\xf2\xa8\xa1\x9b\x4b\x35\x63\xa9\x55\x1f\xd3\x57\x37\xb0\x79\xb2\xd6\xd7\xd7\xd7\xf7\xe1\x7f\x7d\x76\x85\x11\x5b\x19\xd3\xa3\xb1\xd5\x96\xb1\x45\xd7\xa3\x1c\xcf\xb6\xc8\x2b\xa4\x31\xec\x04\x0d\x1a\x01\x12\x6e\xa4\x10\xd4\x6e\x61\xd1\xdf\x1d\x7c\xb7\x79\xa6\xdc\xe9\x79\xdd\xf2\x07\x87\x76\xe4\x15\x6c\xab\xd3\xd0\xde\xe1\xb5\xd7\x35\x55\x6f\xfa\xdf\x7d\x90\xe0\x0c\x00\xf9\x3b\xa2\x7f\x5b\x78\x9d\xfd\x44\xc4\x8f\xf8\x09\x3f\x92\xa3\x9c\xd8\xdc\x84\x1b\x71\x13\xb9\x30\xc7\x37\x69\xc5\x91\xef\xaf\xbc\x7b\xed\x55\xef\xef\x39\xe6\x2a\x16\xc9\x56\xa7\x8e\x60\x4e\x73\xf5\x0f\xbb\x8f\xb9\xf2\xbd\x3d\xc7\xec\xae\xfe\xa9\x99\x45\x57\x56\x7f\x99\x65\x5e\x64\x4d\xf5\x35\x96\x97\xc6\xaa\x2e\x7b\xb5\xea\x6e\xac\xbe\x76\x6c\xb5\x83\xbd\xcc\xb7\x63\x59\x7e\x23\x47\xdd\x53\x0f\x42\xe4\xe7\x18\x83\x3e\xa8\xc0\x18\x00\xb3\x93\x4e\xd2\x2f\x85\x7e\xc2\x2d\x78\x05\x2f\xde\xcc\xf8\x83\xb5\xdd\xa0\xe0\xf1\x27\xea\xc6\xfd\x66\xe6\xc7\x0b\x5e\x21\x28\x87\x95\x30\x48\xc4\x67\xb2\xa0\xec\x15\x22\x71\x24\xb4\x2d\x27\x29\xcd\x9a\x33\xbf\xa1\xbe\x31\x56\xda\x3a\x30\x72\xe2\x82\xb1\x3f\xdf\xf5\xa7\xcf\xcf\x7f\x72\x89\x38\x33\x50\x7a\x7e\xde\x2f\x8e\x3c\xe6\xbc\x6d\x9f\x9d\x7f\xde\x97\xe6\xce\x7c\x6f\xe7\xd2\x95\x61\x19\x63\x9f\xa8\x4b\x63\x6f\xf5\xdf\x2f\xeb\x6d\xae\x9f\xfa\xdd\xda\x47\x1e\xf8\xee\x0b\xf1\x3f\xfd\x47\xc4\xc5\x5e\xb6\xf0\xab\x2b\xa5\x73\x26\x56\xae\xb9\xed\xee\x6d\xab\x8d\xcd\x07\x2e\x98\xba\x2d\x7e\xdb\xee\x1d\x13\xc3\x2c\x2a\xd5\x29\x13\xf3\x4f\x3a\x36\xac\x70\xd4\x51\x60\xe6\xc1\x37\x50\x53\x1e\x86\x28\x74\x41\x1f\xcc\x84\xd5\x00\xac\xc4\x6b\x6e\x30\x37\xdf\xc7\x82\xf2\x4c\x16\x69\x66\xa2\x5d\x33\x59\x58\x09\xca\x5e\x1f\xf3\x0a\xdd\xcc\x60\xbc\xd2\x09\xe6\xd7\x7f\x6c\xf2\x61\xf6\x31\xa9\xd9\xb7\x8f\x7d\xfc\xb8\x2d\x8f\x6f\xd9\xfc\xf8\x27\x8e\x7b\xfc\x1a\xfd\xc8\xf1\x19\x33\x08\xc7\x8e\xb3\x75\x59\x5b\x3d\x36\x34\x43\x1d\x3d\xce\x8e\xae\x8f\xdc\xbf\xe2\xc0\xca\x48\xc3\xc6\x27\x78\xca\x2d\x5f\x9b\x4e\x39\x3c\x43\xfd\x87\x84\xca\xc3\xc7\x3e\xba\x79\xd3\xc3\x5b\xb6\x3c\xbc\x69\xf3\xa3\xc7\x56\x77\x1e\x73\x57\x77\x07\x8b\x6c\x5e\x59\x99\xd1\x9a\x5b\xfb\xf9\xae\x42\xe4\xd8\x95\x43\xc3\x2d\x1f\xde\xac\x3c\xfa\xc1\x42\xe9\xe0\xa6\x47\x37\x6d\x7e\x78\xf3\xe6\x87\x37\x6f\x7a\x74\x53\xf5\x93\xc7\xdc\xd5\xed\xfd\x53\xd2\x9a\xbd\xbd\xf1\xe0\x7b\x78\x96\xf2\x00\x68\x30\x0f\xa0\x9d\xe5\xd1\xb6\x92\x4e\x33\xf3\x4b\x15\x25\x5f\xf0\x78\x2b\x21\x28\x57\x42\xde\xd4\x8a\x5f\xfa\x9b\xe7\xed\xf2\xa4\x0e\xab\xf0\x56\x77\xb3\x20\x67\x8b\x49\x9c\x1c\x66\x95\xd0\x21\x39\x3d\xf5\x8b\x4f\x9e\x73\xd8\xec\x79\x4f\x6c\x59\x7d\x27\xbb\x7c\xf0\xee\x15\x13\x2f\x5f\xfa\x66\xf5\xd5\x1b\xf7\x75\x75\xde\xbc\x6d\xce\x82\xfa\x7a\x27\xda\xb7\xa1\x2f\xdc\x7c\xe4\xe0\xac\xe5\x9f\x90\x12\xc7\x3a\xf1\x99\x47\xb3\xaf\x1f\xbd\xbe\xd4\x72\xee\x49\x57\xc6\xf6\x0e\x0c\x6c\x7d\x46\xba\xef\xfe\x4f\xae\x79\x74\xc1\x11\xab\x27\xae\x2c\x9d\xb0\x60\x13\xeb\x7d\xe7\xb3\x3f\xeb\x1b\x3d\x79\x70\xdb\xd7\x3c\xec\xad\xfe\xfe\xd2\xde\xf6\x35\xf3\x2e\xbe\x7c\xea\xd8\x6b\x8f\x5d\x52\xde\x58\x2a\xbd\x71\xc9\x1d\x97\xc7\x4f\x61\xbf\x07\xc6\xe7\x1c\x23\x31\xe7\xe0\xe3\x27\xd9\xdf\xce\x2d\x60\x70\xa0\xba\x47\x7a\x12\xdb\x21\x06\x90\x68\x62\xa1\x8f\x84\x71\x3b\xe6\x24\x1d\xb7\x20\x1d\x90\xbe\x73\xdf\xd2\xfb\x87\x66\xcc\x18\xba\x7f\xe9\x7d\xdf\x91\x8e\x62\x36\xfb\xe0\x1b\xef\x3f\xf3\xed\xea\x63\xc9\xea\x63\x4f\x3d\xf3\xfe\x37\xd8\xff\x08\x5e\x32\x54\xdd\xc3\x3e\x98\x2e\xc3\xad\x84\x95\x78\x10\xf3\x0a\x9e\x9f\x34\x13\x0d\xec\x8a\xbf\x29\x40\xfa\x4e\x75\xcf\xfb\xcf\x3c\xc5\x16\x24\xd9\x82\x6f\x3f\xf3\xfe\x37\xaa\x58\x7d\xa7\xfa\x4e\x95\x78\x19\xaf\x44\xde\x8f\xb4\x63\x37\xc7\x4f\x26\xa6\xcd\x74\xbd\x91\x2a\xa1\x40\x4e\x27\xe9\xd4\x8e\xd1\xcd\x8b\x39\x96\xfc\xdb\x33\x41\xde\xe3\xf3\x10\xf9\x11\xb9\xe2\x40\xcc\xbc\x4a\x28\x00\xf6\x6f\xcf\xd4\x8a\x62\xef\xcb\xb9\xf6\xa2\xd7\x3e\xd0\x96\x93\x67\x17\x7d\x53\x6d\x30\xe3\x4d\x1a\xca\x0d\x19\xd4\x1b\xfd\x4c\xba\xb3\xa3\x67\x74\x8e\xaa\x4b\x75\x2d\xd9\x66\xd6\x12\xd7\x1a\x1a\xda\x0b\x75\xf5\x6a\xa2\x59\xc9\x64\x9b\xeb\x65\x55\x9f\x1c\xed\xe9\xf4\xd2\x4d\x95\x54\xbd\xd2\xac\x22\xaa\x8d\xf1\x78\x7d\xbd\x55\x29\x2a\xc6\x61\xc3\xb3\xcd\x56\xaf\x2d\x6b\xcf\x19\x9d\xdb\x58\x0a\x31\xd2\x10\x6f\x4b\xc4\xa3\x7a\x73\x9d\x54\xaf\xa8\x61\xa6\x35\x6a\x5a\xf5\x75\xcd\x4e\x92\x39\xf1\xc5\x13\x43\x43\xb3\x17\x46\x1b\x25\xdb\x6e\x6e\x68\x88\x47\xe3\xf9\x6c\xa0\x2a\xaa\x54\x9f\xd5\x63\xf1\x84\x6b\x6a\x11\x1c\x1c\xe0\xfd\xb3\x8a\xd9\x91\xdb\xe5\x4b\x41\x07\x60\xb9\x20\x17\x0f\xfd\x78\xce\xb1\x73\x71\x97\x3d\x5a\xbd\x93\xad\x63\x57\xb2\xb5\xac\x7a\xe7\x6e\xe9\x53\xbb\xd9\xa9\xac\xba\x87\x5d\x59\xdd\x23\x9e\xcd\xce\xea\x4f\xd9\xe9\x4c\x12\xe3\x41\x58\x1f\x37\xa8\x84\x65\x2f\xf8\x63\xcf\x51\x7b\xe6\xcc\x37\x2e\x64\xd2\xc5\x2b\x4f\x7a\xa7\xbb\xfb\xba\x9d\x5d\x5d\x3c\xfd\x0e\x76\x93\xd4\x25\xb5\x83\x0a\x90\xc8\x8f\xb2\xb2\x9f\x2b\x65\x99\xe5\xde\xd2\xd1\xc9\x36\x77\x76\xb0\x9b\x32\x47\x64\xb3\x47\x64\x6a\x7c\xf4\xc2\x83\x1f\xb2\x73\x58\x3d\x24\x00\xc6\xd8\x3f\x1b\x8d\x6b\xfe\xc1\x58\x7c\xe1\x9f\x4c\x04\x30\xd0\x0f\xbe\x20\x9d\x2d\xf0\x1c\x1c\x97\xf9\x6b\x97\x4a\xd9\xa5\x25\xe5\x39\x31\x3f\x17\x1f\xfc\x7d\xe4\x5e\x81\x57\xdd\x1c\xa9\x92\xa6\x6d\x49\xe8\xe6\x0b\x52\x50\x36\x2b\x91\xa4\xf9\xb7\x48\x55\x90\xc4\xa0\x98\x06\x9f\x0f\x4f\x7c\x61\xc7\xa9\xcf\x6f\xdf\xfe\xfc\xa9\xa7\xbf\xf0\x59\x63\xfd\x61\xb3\xc6\x11\x27\x4f\x4f\x45\x15\x63\xe3\x61\xb3\xc6\x50\x99\xb3\x23\x15\x53\x1e\x7e\xaa\x7a\xcb\xd3\x4f\x57\xef\x78\xe6\x19\xb6\xe1\xe9\xa7\xd9\xe6\xa7\x0e\x54\x1f\xa9\x3e\xb5\x62\x09\xa3\xef\xdc\x73\xc2\xa9\x33\xc7\x1f\x65\x73\x96\x2f\x62\xf4\xad\x7b\x4f\x3e\x7d\xa6\xa8\xeb\x2b\x00\x91\x26\xe5\x66\x88\x03\xf8\x81\x5f\x0a\xe2\x7c\xf2\xb7\x85\x7e\xdc\x1a\x66\xf6\xdb\x1b\xb6\x9e\x71\x2c\x6b\x73\x4b\x5b\x37\x94\xde\x89\x34\x5d\x58\x1a\x3b\xf5\xc3\x8b\xdf\x29\xf1\x7c\xa7\x01\x44\xee\x51\x1e\x00\x07\x80\x09\x83\xef\x06\x33\x19\x1f\xde\x31\x96\x2b\x85\x3e\xe5\x42\x90\x5e\xbc\x7f\xf3\x17\xb7\x25\xbd\x1b\x4f\xfa\xea\x7f\x4f\x5d\xc5\xee\xbe\xe8\xf0\x81\xad\x53\x03\x4c\x5a\x2f\x6b\xd7\x3f\x7d\xf1\x40\xe9\xc4\xf7\x1f\xaa\x7e\x30\x75\xda\xf6\x3f\x94\xa4\xbb\x44\x5d\x8e\x38\xf8\x76\xe4\x02\xe5\x01\xe8\x00\x68\x2f\x55\x82\x72\xc1\x0b\xb8\x89\x29\x78\x79\xb4\xdd\x43\xb3\x07\x89\xc3\x35\xb8\xf9\xc2\x28\xf3\xad\x24\x7b\xf8\x86\xcb\x8e\xba\x64\xd9\xf9\x27\x9f\x32\xe7\x94\xae\xeb\x96\xff\xcb\x73\x67\x5f\xb2\xf6\xb9\xea\xeb\x8f\xde\xf8\xad\x81\xfb\x93\x6f\x7d\xee\xb8\x67\x8b\x89\xde\x1b\x2e\x3b\xf9\x76\xfd\xe8\xd9\xb7\x5b\xe9\x7b\x3e\xbf\xea\xb6\x11\xe3\xcf\xb7\xdd\x55\xfd\x60\xc9\xc0\xe6\x23\x36\xd7\x30\xb3\x1b\x20\xf2\xef\xca\xcd\x20\x41\x0a\x80\xc5\x99\x62\xf3\xc6\xe7\x02\xbf\x34\xca\x72\x01\xf3\xe3\x1c\x24\x49\x5a\x5d\x5d\x2d\x0d\xcc\x5b\x54\x9d\x5c\xb4\x6c\xea\x67\xd2\xf5\xf9\xc4\xa5\x23\x03\x5b\xd9\x63\xd2\x03\x53\xcb\x37\xdf\x77\x46\xa9\x74\xe6\x3d\xae\xdc\x7e\x20\x73\xc9\x1f\x78\x5b\x16\x1f\x7c\x3b\x72\x97\xf2\x02\x34\x03\xa4\xa7\x7b\x24\x52\x92\x45\xc5\xbd\x5a\xcd\x7d\xd1\x44\x37\xff\xe6\xd5\x6c\xf7\xd6\xfa\xd2\x58\xf5\x88\xe3\x7e\xcb\xe6\x54\x7f\xf3\xe8\x8d\x1b\x8e\xe9\xbb\xff\xe2\x1b\x2e\xfd\xd5\x83\x1d\x91\x15\xd2\x64\xf9\xfe\xea\xc6\xff\x79\xe8\xed\xea\x07\x5e\x7b\xef\xf1\xab\xd7\xbf\xf5\xfb\xdb\x5f\xfa\x9b\x71\xa4\x72\xce\x20\x7a\x4b\x12\x08\x6e\x32\x1b\x21\x52\xf1\x3f\x32\x6a\x52\x10\x03\xa9\x6f\xcb\xb9\x3f\xd8\xb1\xe6\xea\x6f\xb1\xb3\xbf\x5c\xfd\xf9\x8a\x0d\x5f\xe4\x43\xe9\xc1\xe5\xff\xf9\xdf\xec\x4e\xf5\xbb\xfb\x9e\x65\xca\xb3\xfb\x6e\xaa\xfe\x58\xb9\xa7\x5f\xab\x7e\xb9\xfa\xd2\xda\xd3\x7e\xb6\x63\xc7\x4f\x77\xb0\xb9\x2f\xb2\x71\xe9\x0c\x60\xb0\x01\x20\xf2\x19\xe5\x66\x3e\x27\x58\x2e\x4f\x6e\x98\x23\x88\x1f\xea\xa2\xc0\x94\x7e\x53\x3d\xf5\xd2\xe1\xd2\x56\xe9\xc7\xac\xba\x67\xe2\x8c\xea\x96\x89\x79\x09\x25\xbf\xfd\x0f\xa5\x03\xb7\x55\xbf\x74\x61\xa9\x74\x31\xeb\xa8\xa9\xbc\x5a\x9d\x1f\x00\x1b\xba\xe1\x70\x80\x9a\xad\xf9\x3b\x0b\xeb\x34\x33\x07\x0f\xed\xfc\x9d\x11\xe6\x46\xec\x7f\xad\xb4\x00\x41\xaf\x66\xaf\x6b\x4d\x45\x42\xa9\xe3\x2c\x37\x1d\xd1\x96\x0d\x87\x7e\xfd\x8c\x8d\x96\x2e\x6b\x87\x6f\x3a\x6d\x62\x50\x32\xd6\x1f\x36\x3e\xae\x8b\xa9\xa2\x9e\xa7\x74\x75\x6c\x3d\x34\x8d\xb6\x76\x76\xa6\x52\x2b\xd7\x6d\xb8\x6f\xcd\xd1\xf7\x6f\x58\x77\x64\x63\x64\x66\xe3\xa6\x85\xb3\xac\xc4\xb2\x6b\xdb\x73\x91\x95\x8b\x06\xfc\x4c\x76\xe9\xd5\x9b\xec\xcb\x4f\x5f\x63\xc6\x8f\x7b\xbc\xbf\x47\xde\xbe\x71\xe6\xac\xb6\xf6\xed\x3f\x3c\xdc\xb0\x07\x9f\xdf\xbe\xfd\xd9\x53\x4f\x7d\x76\xfb\xf6\xe7\x07\x6d\xa3\x5e\xeb\xb9\x6d\xd5\xaa\x3b\x56\xae\xbc\x63\xd5\xaa\xdb\x7a\xf4\x7f\x7c\x3e\xc2\x0c\x9b\xe2\x81\x4b\x2c\xa8\x40\x02\x0f\x91\x0d\xbf\x64\xda\x31\x60\x3f\xd8\x72\xce\x0f\x4e\x5f\x73\xcd\x53\xd5\xcb\xbe\xcc\xba\x57\xac\xbf\xef\xd0\xf3\xa9\xae\x53\xf6\x7e\x77\xdf\xb3\xd5\x0f\x9f\xdd\x77\x13\x1b\xf8\x60\x75\xbf\xc6\x0e\x67\x3d\xd3\x0f\xa8\xfa\xf5\x17\xab\x4f\x4d\x5d\x59\x1b\xc3\x02\xb7\x22\xdf\x84\x04\x78\x1f\x8f\x5c\x1f\x47\xc7\xff\x11\xcd\x62\xff\x0f\x74\x93\xbe\xfb\xcf\x70\x07\x92\xc0\xe3\x73\x22\xdf\x80\x04\xb4\x02\x7c\xdc\x7d\xfe\x0e\xa5\xff\xf1\xa6\x27\x4d\xa3\x76\x64\xcd\x3f\x14\x3e\xf5\xd5\xbf\x85\x71\x6e\x2f\xe0\xdb\x91\xdb\xe5\x5f\x02\x02\xd4\x4b\x36\x0b\x58\xe4\xf6\xa9\xbd\xd2\xa9\x07\xbe\x16\x99\x27\x97\xaa\x37\x55\x6f\xfd\x02\xfb\xcd\x11\xec\x77\xa2\x4e\xab\xd8\x3b\x91\xdb\x23\x0f\x0a\xcd\x02\x89\x9c\x9d\x8b\xe7\xec\xdc\xaa\xc8\x3c\x9e\xf8\xc0\xd7\xa4\x9d\xbb\xd9\x33\xbb\xff\xa1\xcc\x04\xb3\x59\x50\xcf\x44\x22\xe9\xd4\xa9\xbd\xf2\x2f\xab\x99\x23\xaa\x2d\x5f\x60\x9b\xd8\x56\x51\xe6\x25\x07\x3f\x94\x6e\x56\x6e\x86\x14\xf4\x00\x24\xfe\x2f\xe5\xf3\x71\x1d\x70\xc9\xae\xd3\x2e\xb9\x63\xd6\x31\x47\x6f\x75\x8b\xa5\xb7\xd6\x1d\xb1\x62\xdd\x9a\x7f\xe8\x04\xa5\x74\xdc\xe5\xa7\xcd\xdd\x73\xfa\xa9\xfb\xe6\x8c\x9d\x7f\xc5\xfc\x93\xd8\x67\x8e\x5f\xbe\x6e\xd9\x87\x8f\x7e\x6c\x7f\x6f\xae\xae\xa3\xa3\x95\x9b\xa1\x01\x96\x02\x30\x7e\xff\xa4\x5f\x09\xe3\xc8\xfa\x98\x60\x78\x85\x60\xa6\x14\xce\x64\x41\x1f\x73\xf3\x48\x2e\xa7\x08\x7e\x33\xb3\xe3\x96\x5f\x31\x03\xc9\x2b\xe4\xf2\x40\x68\xc7\x40\xf6\x5b\xdb\x6d\x39\x97\x6f\xe3\xc6\xa7\xcd\x6f\x85\x78\x8c\x30\xf2\xdc\x11\x97\xef\xda\xb9\x31\x5b\x61\xad\x63\x0b\x53\xd9\xe3\x97\x5e\xfd\x1b\x76\xdc\x67\xd7\x4e\xac\x94\x96\x1c\x3d\x6f\x13\xeb\x9d\x37\x7f\xdb\x49\xf7\xae\x7b\xfc\x73\xd6\x4b\xdf\xad\xbe\xf9\x7c\xf5\xd3\xcb\x27\x58\x84\xad\xdf\xcb\x4c\xd6\x5b\xfd\x9f\xea\x73\xef\x55\x27\xff\xeb\xaf\xec\xeb\xef\xb0\xe3\xd9\x1f\x1f\x7a\x50\x3a\xb9\x61\xf7\x85\x27\x3c\xa0\xdc\xc9\x7e\x35\x36\xf5\x2f\x2c\xdf\xde\x1e\xfe\xf0\xd2\x55\xb7\x1f\x66\xc4\x82\xfe\xb9\xdb\x3f\x39\xfb\x76\xcb\xb2\xa4\xf3\xd6\x4f\x3d\x7c\x86\xcb\x66\xfc\x96\x1d\xfe\xfc\x93\xd5\xff\x78\xe5\x2b\x5f\xad\x7e\xbf\x7a\xfa\xd7\x7e\xb2\xf0\x6b\x7f\x61\x5f\x7d\xff\x7d\xf6\x8d\x3f\x55\xcb\xd5\x87\xaa\xef\xdf\x7b\x0f\x84\x5c\xa7\xc8\x4f\x2a\x77\x43\x11\x96\xc2\x2a\x58\x03\x1b\x60\x2b\x9c\x09\xe7\xc1\x25\x70\x05\x7c\x06\xfe\x05\xbe\x00\xf7\xc1\x43\xf0\x34\xfc\x00\x5e\x80\x9f\xc1\xbf\xc1\x6f\xe0\x4d\x78\x07\xde\x87\xff\x86\x0f\x59\x84\xd5\x31\x83\x59\x2c\xc7\x3a\xd8\x0c\x36\xc6\xe6\xb0\x05\x6c\x39\xdb\xc2\x4e\x60\xa7\xb0\x33\xd8\xc5\xec\x0a\x76\x0f\x7b\x84\x3d\xce\xbe\xc9\x9e\x63\x3f\x66\x3f\x63\x2f\xb3\xd7\xd9\x01\x09\x24\x19\x80\x25\x7d\x87\x1c\xb2\xad\xb4\xd4\xc2\x7c\xb2\xc5\x81\x43\x1e\xb9\x5e\x58\x88\x28\x12\x39\x2e\x09\xc6\xe6\x97\x13\x66\x58\x71\x3c\x37\x6f\x47\xa2\xcc\xf5\x6c\x5f\x8a\x24\x9d\xd0\x33\xfd\x52\xd8\xee\xf8\x09\xa7\x12\x14\x58\x04\x1d\x3b\x69\xfb\x41\xd9\xb3\x9d\x80\xec\xa4\x13\x78\x76\xb2\x85\x05\x05\x2a\x25\x38\x35\x21\x8f\x3c\x97\x5c\x2f\xe1\x29\x76\xd2\x2f\x78\xb6\xc3\xd3\x66\x99\xe3\x07\x1e\xd9\x0e\x3f\x0e\xbd\x30\x28\x38\x49\x3f\xf0\x1c\xdb\xe2\x59\x3d\xc7\x76\xcb\xed\xb6\x1f\x90\x4d\xa1\x47\x96\x2b\xee\xe0\x7b\x41\xc9\xf6\x83\x7c\xe0\xe5\x6c\x27\x28\x78\x0a\x2f\x8a\x97\xea\x94\xdb\x05\xb9\xf7\x3d\xc5\xb6\x9c\x40\xe4\xac\xed\x91\xf8\xeb\x39\x3c\x7d\xbb\xef\xb8\x8a\x28\xa8\x10\xf8\xb6\x13\x7a\x4e\x92\xe7\xf7\xf9\x19\xcf\xb7\x1c\xd7\xe3\x89\x3d\xbf\xcc\x8b\xb4\xc3\x82\x47\xfc\xba\xe3\x07\xf9\x22\x73\x6d\xc7\x2e\x04\x24\x6e\x48\xfc\x4f\x94\xd9\x8e\x5f\x68\xb7\x93\xc3\x2c\x28\xb8\x8a\x5d\x72\xf2\x9e\xeb\x78\xae\x9d\xe4\xcd\x29\x85\x9e\x22\x6e\xac\x24\xed\x82\x2b\x5a\xa8\x58\x8e\xed\xf2\x2e\xf2\x42\x7e\x9e\x92\xb6\x1f\x96\xc9\x76\x5c\x9e\x27\xcb\xdc\x02\x6f\x23\x3f\x10\x67\x1c\x3f\xcc\xf3\xf6\xd9\x3c\x47\xc1\x0d\x0b\xa2\x63\xdb\xf9\x81\x23\xea\x9b\xb4\x7d\xd1\xab\x39\xdb\x09\x1d\x9f\x5f\xf1\x3d\x6e\x64\x02\xcf\x25\x85\x17\x39\xcc\x82\x7c\x10\x7a\x81\xe3\x7b\x81\xc3\x7f\xc3\xc0\x2d\x7b\x79\x47\x74\xaa\x1f\x48\x3b\x5b\x4a\x0b\x74\x8b\xee\x3d\x71\x3d\x21\x91\x41\x79\x4b\x2f\x56\xd6\x93\x65\x6c\xb8\xaa\xfa\x85\x05\x79\x22\x6b\xce\x69\xb1\x46\x63\xd7\xfa\x89\xfc\x2e\xa4\x13\x6f\x11\xa9\xe6\x74\xa4\x2b\x3a\x0d\xb7\x25\x35\xe6\xe6\x56\x9f\x7d\xfa\x44\xa5\xfa\x93\xd3\x47\xf7\x2d\xa0\xa2\xd5\x11\x39\xac\xb8\xa2\x25\x7d\xd4\x63\xf6\x16\x7d\xc4\x2e\x12\xdd\xd9\x61\xaf\x27\xe6\xa6\x9a\x63\xd5\xb4\x9e\x27\xa2\xbc\x61\x59\x84\x3a\xd5\x77\xc5\x54\xeb\xd7\x73\x8a\x56\x85\xa8\xfa\x3b\x5d\x2f\xee\xe9\xdf\x62\xd8\x48\x96\x45\x06\xb2\xca\x9e\xe8\xf1\xd5\x9b\x2d\xb2\xd9\xd6\xfa\xa1\xea\x7c\xa3\x41\x45\x49\xb3\xd8\x9e\xf5\x53\x7f\xd6\xd9\xd7\xd6\x4d\xac\x5a\x66\x2c\xf3\xa6\xd6\xa0\x61\x31\xbb\x98\xae\xe8\xa3\xf6\x68\x3a\x1e\x47\xcb\xc8\xd9\x9d\xff\xb9\x1a\xc3\xf5\x79\x63\x7d\x75\x73\xd1\x8a\x7a\x5b\x8a\x46\x9a\x72\x96\x9e\x4e\x17\x47\x2b\x45\x7b\xb4\x32\x61\xf4\x57\xb0\x62\x39\xac\xa5\xa1\x81\xd4\x86\xea\xcd\x66\xbd\x1a\xd3\x11\x29\xaf\x13\x51\x4c\x2e\x4a\x7b\xd7\xaf\x9e\xda\x64\x59\xe9\x4e\xa4\xa2\xf4\xbd\x65\x54\x5c\x60\xd0\xea\xa9\x02\x76\x10\x8d\xe6\x0d\x8b\xd2\xa4\x1b\x69\xdd\x40\xcb\x40\x23\x4d\x15\x23\x2d\x1d\x98\xd3\xb9\x20\x12\x27\xad\x4e\x6d\xfb\xf0\xa9\xd1\xae\xae\x22\xa5\x3b\xac\x0e\x03\xc9\x88\x3c\x65\x19\x3a\x7d\xb8\x3f\x6d\x75\x2c\x68\x69\xd0\xf3\x48\x91\x66\x5b\x6f\x33\xc9\x26\xbd\xc3\x30\xd2\x44\x45\xd2\xd3\xcb\x16\xe8\x1d\xba\x72\xf7\xe4\xa4\x61\x13\x35\x55\xb7\x57\xff\xad\x3a\xe5\x22\x91\x4d\xdb\x29\x63\xdb\x86\x6d\x1b\x9f\x62\xdb\x07\xaa\x5f\x5c\x63\xdb\x93\x2b\x8e\x92\x66\xb2\x0b\xee\x75\x07\x68\x60\xea\x43\x97\xc8\xa8\xfe\x7b\xf5\x4d\x9b\x26\x91\xed\x35\xba\xa8\xfa\x9b\x0f\xc9\x58\x15\x09\x98\xdf\x60\xd2\x62\x83\x1a\xcb\x64\x90\x41\xe9\x19\x64\x18\xdb\x8e\xb6\xe9\xc5\xba\xea\x69\x2e\x99\x0d\x44\xe4\x1a\xec\x73\x19\xa2\xc5\x5d\x06\x4d\x52\x5b\x7e\xd0\x26\xb2\x0d\xc3\x35\xdc\x2e\xdb\x25\xea\x32\xba\x8c\x8c\x41\xae\x3b\x48\xc3\x9e\x4d\xf1\x56\x7e\xe9\xd9\xcc\x37\x6c\xdb\x6e\x72\xf8\x35\xdb\x26\x7a\x8c\xe6\x6d\x1d\x70\x5d\x63\x90\x0c\xd7\x35\x32\x63\x99\xae\x01\xd7\x30\x26\x29\xe1\x18\x06\x51\x6a\x3e\xb5\x2a\xa4\xce\xa2\xf8\x70\xbf\x3d\x48\x03\x64\xd8\x34\xc7\xa1\x25\x16\x1d\x4b\xc7\x52\xaf\x4c\x5d\x43\x4d\xb4\xd8\x5c\xda\x65\xe8\x47\x1a\x83\x99\x49\xa2\x79\x09\xa3\xab\xcb\x58\x25\x1b\x44\x03\x2e\x8d\x19\x43\x4d\x64\xac\xa0\x35\xc6\x1a\x5a\x63\x10\x4d\x0e\xd8\x94\xa1\x8c\x6d\x0c\x76\xb9\x94\x09\xca\x03\x34\xb0\x62\xc0\x5d\x4c\x99\xc5\x36\xb9\x64\x6c\xcb\xac\x31\xb2\x8b\xa8\xcb\x18\x23\x83\xa8\x6d\x91\x6b\xcf\x6b\xe2\x2d\xd9\x18\x66\x7a\x53\x34\x98\xe9\x4c\x76\xd9\x8b\x5d\x1a\xfc\xe9\xe2\x0c\x4d\x62\xda\x58\x44\x99\x4c\xfe\x08\x6a\x4d\x19\x44\xdb\x68\x6b\x62\x5e\x82\x26\xfb\x5a\x56\x90\x41\x76\xc6\xb5\xc9\x98\x5c\x61\x4c\xd2\x24\x19\x06\x0d\x8a\x3e\x74\x6d\xe2\x5d\xd4\x45\xd4\xac\x0d\x18\xbc\x81\x00\xdc\x6e\x02\x44\xae\x55\x6e\x83\x1c\x4c\xc2\x6a\x38\x07\x2e\x82\x4f\xc1\x1e\xb8\x0e\x6e\x82\xbb\xe1\x49\xf8\x0e\xfc\x0c\xfe\x15\x5e\x85\xdf\xc2\x1f\xe0\x3f\xe0\xbf\xe0\x03\xc6\x98\xc2\x12\x2c\xc5\x72\x6c\x16\x9b\xcb\x36\xb0\x2d\x6c\x3b\xbb\x8a\x5d\xc3\xf6\xb1\x7f\x61\x77\xb0\xcf\xb3\xfb\xd8\x83\xec\x51\xf6\x04\xfb\x1e\x7b\x8e\xfd\x2b\xfb\x15\x00\xf3\x4b\x89\x64\x96\x91\x23\xb9\x1c\x03\x9d\x92\x63\x11\x46\x59\x40\x65\xaf\xec\x49\x71\xaf\xec\x3b\x1c\x43\x6d\xf2\xc9\x8e\x25\x92\x4e\xe8\x94\x6a\x62\xcb\x2d\x8c\x72\x46\x3a\xca\xf8\x7e\xde\xf1\x5b\x6d\x4b\xa1\x7c\xe0\x05\x9e\x5f\x64\x15\xbf\x5c\x83\x6c\x2f\xe0\xe0\xe7\x05\xbe\xe3\x87\x3e\x07\x8a\x92\x00\x44\xc7\x0f\x0a\xae\x57\x03\xbb\x80\x1c\xbf\xe0\xf9\x3c\x79\xc1\x75\x92\x8e\xcd\x31\xcf\x09\x38\x7e\x0b\x6c\xe5\x99\x39\x9a\xda\x6e\xd2\x27\xbb\x34\xc6\xdc\x22\x73\xc9\x2d\x77\xb3\x3c\xd5\xb0\xd6\xab\xa1\x98\x1f\x78\x25\x71\xa8\x90\x1f\x44\x99\x80\x44\x0e\x5a\x4a\xd2\x09\x03\x8f\x92\x7e\x28\x80\xb5\xe0\x46\x99\x80\xb1\x28\x13\x18\xe6\xd9\xbe\x47\xa5\x69\x3f\x42\xbe\xc8\x82\x8a\xc3\x81\x97\xec\x92\xb0\x13\x2e\x6f\x40\xe8\xf0\x7f\xa2\xde\x79\xf1\xd7\xe5\xb6\xc8\x2e\x04\x2e\x79\x2d\xcc\x2e\x50\xd2\xe7\x55\xb0\x1c\xdb\x73\xed\x92\xc3\x9b\x1a\x70\x60\x0c\xbc\x80\x1b\x8f\x80\x9c\x4a\x10\x06\xe5\x22\x73\xf3\x54\xab\xac\x9b\xac\x21\xef\xff\x26\x4c\xda\x7e\x99\x7c\xdb\x55\x6c\x5e\x7b\x9b\xa3\x29\x39\x61\x40\x87\x76\x3c\x57\xe1\xb6\x43\x58\x94\x16\xc6\x7b\x91\x5b\x02\x9e\xb9\xe0\xda\x61\xcd\x6e\x78\x2e\x07\x69\x3f\xf0\x5c\x9f\xb7\x9c\x7d\x32\x77\xf0\x12\x1d\xb1\x6f\x22\xff\xa2\xaa\x5b\x37\xf5\xee\xfb\x76\x7e\xe5\x96\x6b\x69\x73\xae\xa9\x03\x11\xf1\xda\xc4\x93\x64\xbd\x7d\x69\x7a\xf7\x23\x13\x1d\xc6\x95\x77\x7c\xbb\x77\xf9\x86\xee\x80\xa9\xd5\xdf\x3c\x1d\x10\x22\x5a\x6d\x57\xa7\x47\xac\x22\x05\xb9\x3e\x9c\xb0\x08\x0d\xec\xab\x1f\xa7\x3c\x8d\x90\xb7\x65\xc1\xf1\xb3\xad\x91\xcd\x0b\x2c\xc7\xb7\x46\xac\x4a\xe2\x07\x8d\xc9\x62\xf5\x2f\xca\x51\xab\x74\x5a\xb5\x94\xe6\x1b\xba\x8e\x06\x9d\x73\x2b\x11\xef\x54\x5a\x7a\x66\xdf\xba\xa5\x14\x9f\x1c\x09\x02\x83\x2c\x2a\xbb\x52\x17\xe9\x4d\x86\x81\x44\x53\x6f\x1b\xba\xce\x5e\xd1\x0c\xd2\x3b\x63\x2a\x59\x1d\xba\x45\x3a\xe5\x62\x2a\xea\x1d\xd4\xd0\x60\x8c\x58\x34\xf5\xfa\xe5\xb9\x13\x56\x3f\xfe\x09\x33\xdf\xb7\x6c\x81\x3e\x6b\x75\x66\x96\xd5\x9b\xd4\x27\x46\x9a\x88\x74\x42\xab\x4f\x1f\xb1\x2c\x8b\x02\x32\x2e\x2d\x8e\xa4\x09\x71\x62\xe2\x4c\xb9\x79\x64\xe9\xd2\x3c\xa6\x62\x48\x84\x16\xd1\x66\x36\x23\xd2\xfc\x5e\xc7\x1b\x74\x41\x50\xcc\x6d\x0e\x8a\x96\x4e\x1d\xe9\x74\x93\xd1\x81\x64\x15\x71\xa9\x61\xb0\x6b\xf4\x0e\x32\xb0\x43\xb7\x70\xc4\x22\x0a\x74\x4b\xa7\xea\x25\x95\xa2\xd5\x16\x37\x2a\xe9\x8e\x74\x31\x6d\x37\x5a\x4d\x7d\xe9\x5c\xc7\x23\x96\xae\x9f\x40\xb9\x0e\xa2\x9c\x61\x58\x79\xab\xa9\x49\xb9\xad\xfa\x7e\xf3\x90\x4e\x74\x10\x6c\xdc\xbe\xf8\xc4\x4b\x3e\x7f\x44\x39\x4f\x86\xa1\x5b\xcb\xa4\x38\x7b\xf5\xde\x2d\xa3\xbc\xa2\x84\xb4\xaf\xda\x5b\x35\xd2\x69\xa2\x67\x27\x7b\x76\xad\x5f\x4d\x3a\x25\x7b\x37\x9e\x9a\xdb\x71\x55\x7a\xf4\xd7\x67\xec\xec\xa8\x9c\x66\xe4\xad\x67\x2a\xda\x08\xce\x6c\xd2\x47\x69\xa0\x71\x82\x96\x91\xb1\xcc\x38\x11\xe7\xac\xa7\x5d\xa4\xd3\x32\x5a\x40\xc6\xb2\xbe\x2e\xea\x6e\x59\x46\x51\x4f\xef\xd2\xa8\xf9\xc8\xf4\xfa\x7e\x3d\x4d\x54\x38\x22\xbf\x8a\x16\xe8\x39\x1b\x2b\xd4\xb9\x2f\x9f\x46\x4c\x2f\xb4\x96\x27\xf4\xa2\x41\xcb\xb0\xd2\x59\x24\x2b\x6d\xad\x48\x2d\xb0\xac\xb4\x95\xee\x20\x6e\x64\xf2\xcd\x11\xa4\x7c\xbe\x03\xfb\xf3\x9d\xd4\x49\x46\x07\x15\x2d\xa2\x34\x11\x59\xbb\xee\x2c\x1c\xbd\x6a\x66\x87\xfd\x9f\x0f\xe9\x73\x46\x69\xdd\x16\x9d\xe6\x20\xce\xd1\x27\xe3\x7c\xd0\x54\x46\xa9\xa3\x42\xfd\x1d\x54\x31\x4a\x2d\x88\x38\x87\xca\x6a\x71\x0e\xcd\xa1\xd8\x12\x4a\x53\x07\x22\x37\xc5\xfa\xe9\x54\x21\x43\x27\xeb\xe5\xcc\x4a\xa2\xb5\x49\x9c\x30\x26\xa8\x93\xf2\x8d\x5d\x64\x51\xda\xb0\xb0\x1f\x11\xd3\xe4\xb6\xce\x53\xf4\x7b\x89\xb8\x35\x23\xb2\x0c\xd2\x75\x0b\xed\xb4\xc1\x3b\x6c\x82\x46\x46\x91\x46\x70\x94\x2a\xe4\x45\xf3\x7a\xb1\x42\x06\x59\xba\x61\x53\x47\x2e\x4d\x79\xb2\xd2\x5c\xbb\x09\x7c\xdc\x0b\x3e\x1c\x03\x5b\x60\x1b\x7c\x12\xce\x86\xf3\xe1\x62\xb8\x02\xae\x86\x7d\x70\x17\xdc\x0b\x0f\x8a\xc8\xe1\x37\xe1\x19\xf8\x01\x3c\x07\x3f\x81\x5f\x08\x96\xfb\xef\xf0\x0e\xfc\x95\x29\x4c\x63\x26\xcb\xb0\x3c\xeb\x60\x7d\xac\xcc\x06\xd9\x08\x9b\xc5\x26\x39\x7f\xb5\x93\x36\x39\x6e\xde\xf6\x5c\xa4\x40\xb6\x91\x62\x9c\xfb\x84\x4e\xe8\x84\x36\xba\xe4\x59\xe4\x7a\x54\xf6\x0a\x5e\xa1\x28\x55\xc2\xca\x18\x23\x0f\x09\xb3\xcc\x72\x92\x1c\x2a\x2a\xa3\xcc\x73\x29\xa0\x56\xaf\xe0\x05\x15\xdf\x13\xa2\x22\x2c\x05\x05\x37\xdf\xc2\x38\xfb\xe2\xe4\xcf\xf6\x03\x0e\x18\xc4\x01\xc3\x2b\xd9\xa1\xe7\xdb\xdd\xcc\xb1\x39\x4a\x95\x3d\x12\xbc\xcf\xe3\xf3\x38\x28\x90\x13\x16\x5c\x4e\x72\xed\x8f\xf0\xc2\xa9\x11\x48\x5b\x60\x1b\xa7\xc9\xfc\x22\x47\xb8\xd0\x8b\x32\xa7\xc2\xe1\x2d\x0c\x12\xbe\xed\xd6\x30\x25\xe9\x04\x05\x9e\x3b\x74\x39\x3f\xab\x11\xe5\x16\x46\x4e\x81\x53\xc0\xd0\xb7\xfd\x30\xf0\x6c\x4f\x49\xfa\x36\xd9\x4e\xd9\xf5\x02\xbf\xc0\x29\x27\xc7\xcc\x1a\x07\x4e\xfa\x81\x1b\x84\xd3\x4c\x34\xf4\x14\xc7\x2f\x04\x6e\x58\xbb\xbd\xa8\xa3\x2f\xee\xee\x0b\xb6\xcb\x01\x2a\xf4\x24\xff\xc1\xd1\x14\xa2\xd9\x72\xf4\xfa\x5c\xf5\xed\x94\xf6\xfc\x69\x2b\x5b\x52\x78\xcd\x1a\x33\xd1\x35\x0f\x1f\x9a\x87\x2d\x8f\x9e\xdd\x36\x33\x36\xaa\xa5\xc2\x1d\xdf\x3b\xfd\x13\x8d\xff\xda\x3b\x71\xf6\x55\x9f\xc5\x96\xe6\x97\x12\x5a\xd7\x68\xf5\x99\x2d\xdd\x29\xa9\x01\x4f\x3f\xfb\xdb\x38\x21\xaf\x9d\xfb\xc7\xf6\x76\x1c\xc5\x5c\x52\xe3\x63\x10\xa3\x49\x44\x4d\xe3\xfb\xed\x9a\x36\x3b\x65\x36\x0f\x44\x1b\x52\x75\xc9\x11\x53\xab\xdb\xab\xb5\xd7\x27\x4f\x47\x4c\x35\x9b\x5a\xbb\xd9\xde\x62\x36\x6b\xda\x95\x66\x2a\x35\x9a\x6a\xd4\xb5\xd9\x66\xb3\x59\x31\x4d\xb3\x59\xa7\x94\xd6\x82\xe6\x28\xe2\x56\x4d\x93\xc6\xb4\x89\x6c\xcf\x80\x86\xa3\xed\xd8\x3e\x75\x56\xaa\xab\xa7\xb5\x0b\xdb\x87\x24\x93\xdf\x24\xd5\x85\x53\xff\x9d\x6d\xc2\x36\x13\x31\xc5\xee\x89\x19\x98\x6a\x0b\xbb\xb1\xa5\xba\xb3\x23\xd7\x88\x4d\x49\x76\x98\x91\x37\xbb\xaa\xcf\x86\xcd\x6d\xe6\x2b\x29\xc4\xad\x5d\x66\x53\x5d\x7b\xaa\xfd\xde\xae\x96\x6e\xb3\xbd\xab\xed\x74\x4d\xd3\x52\xca\x5e\xa3\xff\xe8\xf4\x1c\xdb\x26\x35\x46\x67\xae\x1b\xb9\xb2\xba\x7f\x0d\xa7\x57\x1b\xc8\xbe\xb8\x93\x12\x59\x32\xb4\x6c\x71\xc5\xa5\xea\xdb\x0f\xff\xd7\x65\xdf\x5c\xd2\x79\x86\xbd\xe3\x92\xdb\xbe\x9f\xf9\xc1\xf3\xe7\x12\x19\xe9\x2e\x8b\xc8\xb8\x7f\xc6\x5d\xee\x56\xa2\xe3\x5f\xff\x34\x85\x9d\xd6\xdc\x4e\x5a\x9e\x9f\x6b\x84\x86\x61\x1b\x94\x9e\x49\x9d\x36\xdf\xd7\x75\x2b\x6c\x37\xa9\x9f\x32\x3a\x75\x52\x86\x75\x52\xa7\x4d\xa4\xbb\x86\xad\x77\x1a\x9d\xe4\x98\xd4\x12\xb1\x8c\x4e\xd2\xbb\xba\x3a\x1b\xd4\xce\x3c\x75\x51\xd8\x9f\xa7\xfe\x4c\xde\x56\x1b\xf2\xfd\x69\xc2\xa9\xbb\xf4\xb9\xd4\x69\x27\x8b\x46\x5f\xa3\x31\x33\xd3\x4f\x96\x4b\x34\x73\x6e\x66\x26\x1a\xcb\x39\x92\x53\xc6\x30\x74\x44\x1c\xe0\x5c\xdd\x20\x0a\x0d\xca\x63\x97\x41\x9d\xd4\x4f\x73\x0d\x4e\xc1\x89\xfa\x29\xa4\xb9\xc5\x28\x9f\xd1\xfc\x33\xd3\x08\x67\x52\x48\x33\x67\xf6\xc5\x66\x5a\x19\x23\x0d\x00\x7d\x62\xde\x5e\xac\xec\x05\x07\x7a\x60\x12\x16\xc0\x5a\xd8\x08\xc7\xc1\x0e\x38\x0b\xce\x83\x9b\xe1\x41\x78\x04\xbe\x06\x4f\xc2\x53\x1f\xcd\xda\x97\xe0\x8f\xf0\x3e\xfc\x15\x0e\x32\x99\xa9\xac\x99\xe5\x99\xc7\xba\x59\x91\x05\x42\x99\x2e\x60\x4b\xd9\x6a\xb6\x89\x1d\xcf\x4e\x67\x67\xb2\xf3\xd8\xc5\xec\x72\xb6\x1b\x20\x21\xdc\xfc\x4e\x8c\x71\x46\x53\xe0\x0a\x30\x12\x7a\xa5\x31\x96\x65\xc9\x84\xe9\xb4\x85\x95\xa0\xe0\x85\x7c\x06\x33\x0a\xa8\x85\x25\xe3\xdc\x58\xb9\x9e\xc3\x55\xaa\x17\x78\x61\xc4\xf7\x82\xd0\xe3\x74\x20\xf0\x2d\x4e\x60\x2c\xa7\xe0\x4e\x9b\x78\x9b\xeb\x25\x3f\x6c\x61\x5c\x6d\xe5\x6c\x2e\x6f\x39\xaf\x09\x0a\xa1\xdd\xc2\x0a\x8e\xef\xd8\x8a\xed\x3b\x36\x79\x76\xc2\x17\xe2\xd7\xf6\x4b\x9c\x2d\x89\x6a\x14\x19\xd9\x25\xa1\x06\x5b\x18\x97\x6c\xa5\x9a\x66\x6b\xe7\x93\xd4\xf3\x6d\x37\x74\x6c\xcf\xf1\x1d\x77\x98\xd5\x36\xc7\xb7\x5d\x7e\xcc\x8b\x6d\xb7\x93\x3e\x39\x3c\x4b\xd9\xf3\x4b\x4e\x81\xd3\x91\xb2\xb8\x33\x9f\xe8\x4e\xd2\x76\x0b\x9e\xe2\xdb\x6e\x20\xd8\x0f\x9f\xf4\x25\x5e\x2a\x59\x8e\x2b\x26\xab\x2f\x32\x0a\xc9\xea\x3b\x1c\x33\xec\x50\xb1\x43\xe4\x60\xc4\x55\x70\x4d\xbb\x09\xa4\xf0\x78\xbd\xc3\xc0\xe5\xd4\x83\xc4\x84\x26\xdb\xb7\xb8\x6c\x24\xcb\x3f\x74\x45\xa4\xe4\xc5\x73\xe0\xa8\x31\xac\x42\x8d\xae\x10\x27\x63\x02\xc6\x78\xa2\xe0\x9d\x5f\xbd\x7a\x4b\x4b\x33\x56\x5f\x3e\x6d\xe2\xdb\xda\x98\x87\x61\x05\x4d\x0d\xdb\xcc\xb0\xb3\x85\xb5\xdc\xff\x60\x43\x94\xba\x8f\xee\x7f\xff\xeb\x5d\x78\xcd\xd7\xa7\xae\xf9\xd4\x37\x13\xcd\xcd\x88\xcd\x68\x22\x76\x21\xa2\xe6\xa5\x35\xed\xc8\x14\xe2\x49\xa5\x59\x95\x25\x6d\xf1\xee\xb9\x7d\xb9\xfc\x99\xf3\x53\x15\xac\xbe\x87\x78\xf8\x7c\x6d\xb4\xf1\xf5\x25\x66\xe9\x42\xd4\xaa\x97\xb4\x35\xf7\x9b\x6d\x3c\x2f\xe2\xf2\xdb\x47\x8d\x18\xae\xd8\x75\xe2\xe9\x49\x1f\x27\x0e\x47\x9c\x6f\x4e\x20\xb2\x7a\x73\xb4\xef\xb7\xa6\xd9\x3c\x30\x70\xb8\xc6\x3f\xa6\xa6\xa1\x86\xa6\xa6\x99\xc8\xbf\x7a\x75\x7d\xb4\x1e\xd1\x0a\xe6\xa3\x11\xf0\x1a\x60\x88\xdd\x85\xac\xa6\x61\xb7\x96\x89\x48\x2d\x1c\x76\xa6\x7e\x7f\xb8\x3e\x12\x1b\xab\x9b\x85\x8d\x5a\x7f\x73\x33\x9a\xb3\x71\xe4\xf0\x04\xa6\xb4\x14\x9a\xec\x93\xa9\x94\xa9\xb5\x25\x5a\x06\xb4\x7e\x0d\x4d\xb3\xdf\xc4\x14\x2f\x85\x37\xc4\x4c\x75\x69\x9a\x16\x8d\x8c\x36\x52\x8b\x89\x89\x4a\x0a\x4d\x13\x47\x4c\xd4\x4c\x73\x76\x2a\x55\x97\x9c\x68\x49\x69\xf3\xcd\xc6\x96\xae\xfa\xfa\x54\xaa\x4d\x53\xf6\x6e\xbf\xea\xc6\x0b\xce\xad\xfe\xa8\xfa\xe6\xdc\xce\x92\xb1\xb4\x91\xe8\xc7\x91\x4d\x99\xf3\x06\xec\x31\x3a\x6f\x8a\xaa\x6f\xb9\x23\xb7\xde\xf0\xa7\x4f\x69\xf4\xe2\x11\xf3\xe7\xf3\xf9\x36\xd8\x79\x67\xf5\xcf\xdf\xfd\xd2\xe5\xbd\xe4\x52\xc6\xfd\xb5\x9d\x21\x76\x27\x11\xfd\xb1\x73\x2e\x19\xb6\xb6\x92\x12\xb1\x9d\x93\xc6\x0a\x1a\x33\xd6\x64\x8c\xc1\xc9\x9d\x44\x2b\x88\x32\x44\xc6\x1a\x7b\xc5\x20\x4d\xc4\xe9\x7c\xda\xc9\xe5\x48\x6d\xea\x56\xbf\x98\x7f\x9d\xcf\xdf\x27\xcf\xdf\xb8\xa2\x59\x21\xfa\x64\x97\x6d\xbb\x47\xcc\x35\x5a\xe6\x13\x4d\xba\x93\x36\x11\x9d\x59\x19\x1f\xa5\xf5\x0e\xcf\x62\xd8\x86\xcd\x19\x9d\xcd\x73\x1b\xf7\x50\xbf\x3d\x60\xbb\x33\xc3\xd9\x71\xea\x1a\x70\xed\x91\x56\x1a\x48\xa9\x06\x57\x60\x44\x47\x67\x26\x8d\x52\xd2\x1d\x34\x9a\xfc\x81\xc5\x99\xf4\x20\x51\x17\x91\x39\xd4\x45\x6d\xe1\x36\xab\x8b\x97\x3b\x49\x19\x35\x65\x70\x61\x54\x2b\xd9\xa0\x8c\x4b\xd3\xf5\xca\x90\x4d\xae\x6d\x58\x7a\x26\xa3\x0b\xed\x84\x64\x91\x6b\x2b\x0e\x17\x8d\x44\x5d\xb6\xdb\x65\x74\x11\x65\xec\x0c\xb9\x76\xa6\x8b\xa7\x00\x00\xb1\x9e\x2d\x72\x98\xb2\x17\x2e\x84\xa7\xe0\x7b\xf0\x23\xf8\x31\xfc\x1c\x5e\x85\x37\xe0\x0f\xf0\xc7\x69\xed\x44\x42\x39\xb5\xb3\x71\x36\x87\xcd\x63\x8b\xd8\x11\x6c\x35\xdb\xc6\x4e\x62\xa7\xb1\xb3\xd8\x05\xec\x52\x76\x15\xbb\x96\xdd\xc8\x6e\x67\x77\xb3\x07\xd8\x23\xec\x29\xf6\x3d\xf6\x23\xf6\x4b\xf6\x2a\x7b\x83\xfd\x5e\x8a\x4a\x19\x29\x2f\x79\x52\x8f\xb4\x5c\xda\x22\x1d\x2f\x9d\x25\x9d\x2f\x5d\x28\x5d\x2a\x7d\x5a\xba\x0a\x80\x39\x25\x87\x84\x83\x09\xc9\x21\x8f\x02\x72\xcb\x7e\xe0\xda\xb5\xb9\x15\x90\x6b\xbb\x9e\xb0\xef\x1e\xa7\x15\x5c\x6c\x84\x49\xdb\xb5\x1d\x37\x70\x2d\x57\x9c\xf3\x5c\xec\x66\x7c\x2f\xca\x9c\x76\x3f\x74\x4a\x4e\x94\x4d\x5f\xa1\xb2\x5b\xf3\x80\xd5\x8a\x22\x97\x0a\x5e\x28\x45\x42\xdf\x8b\x94\xf9\x0d\x2a\x9c\x8f\x88\x72\xad\x84\xd5\xc2\x94\xd0\xa3\xbc\xc2\x95\x5a\xe8\x05\xa1\x13\xfa\xed\x41\x51\xe2\x85\x85\x85\x51\xc6\xc9\x8a\x63\x87\xb9\x50\xf8\xa5\xc2\xc0\x0b\x45\xb9\x8a\x25\x28\x07\x67\x13\x82\x64\x08\x78\x88\x32\x2e\x91\xfc\xb0\x9d\xcb\xa5\xa0\x06\x43\x5c\x20\x7a\x7e\x72\x98\x95\x05\x0f\x08\x6b\xbe\xaf\xb2\xe7\x73\x2e\xe1\x09\x05\x58\x93\x53\x81\xd0\x4e\xbe\x38\x59\x0a\x3c\x12\xc8\xc6\x21\xf1\x90\xe8\x73\xa6\xfd\x66\xbc\x09\x05\xc5\xb7\xbd\x50\x38\xd7\x9c\x80\xcb\xac\x9a\x2f\xd0\x0f\x14\x01\xbc\x7e\x99\x53\xa2\x90\x97\xc6\x91\x4f\x21\x87\xe3\x52\xa9\x26\x2b\x05\x97\x12\x77\x17\x7f\x45\x5d\xf8\x41\xcd\x27\x27\x52\x71\x06\xe6\x97\xb9\x66\x2a\x39\x21\xc7\xca\x64\x0d\xb9\x38\x3f\xe3\xe7\x49\xe8\xc6\xbc\xe7\xf8\x49\xdb\xab\x41\x7d\xb9\xa6\x61\x03\x47\x78\x24\x05\x45\xb3\x39\x63\xe2\x12\x55\x08\x3b\x6e\x25\x84\x33\xce\x11\x2e\x45\xde\xd5\x1c\x75\x85\x12\x2e\x70\x32\xc5\xef\x9b\xb4\x3d\x2a\xe7\x6a\xd2\x8d\x4b\x5e\x85\xd3\x42\xdf\x09\x0f\xa9\x4c\x91\x5a\x68\x68\x27\x14\xfb\xfc\x4f\x28\x1e\x33\x67\x5e\x35\x59\xed\x88\x0b\xbc\x92\xbc\x5d\xbc\x71\xa1\x28\xd0\xf5\x5c\x9b\x97\x52\x70\x7d\x47\x80\xba\x6f\xf3\xcb\x7e\x20\xd5\x7d\xb3\x61\x0c\x3b\x54\x35\xee\x61\x1c\x6f\xc1\x5c\x32\x19\x57\x94\x78\x06\x3d\x05\x31\x86\x0a\x5e\xab\x60\x4c\x8b\x7b\x07\x2e\xf3\x37\xab\x71\x15\xe3\x0a\xa2\x97\x44\xe5\xc8\xc5\x88\x4a\x3c\xf9\x73\x74\xd8\x4e\xc5\x59\x62\x34\x96\xf2\x47\xf1\x0c\x98\xce\xc4\xe3\x79\x25\x93\x44\x54\x32\x38\xfa\x29\x25\xde\x16\xa8\x71\x5e\x98\xa2\x2a\x6a\x43\x6a\x62\xe2\xea\x6f\x64\x3c\xc4\xd1\x78\x86\xd1\x9f\x31\x7e\x7c\xf5\xa1\x9c\x83\xd8\x1b\xcf\xe4\xd8\x6d\xca\x6e\x54\x0e\x9c\x93\x51\xe3\x6a\xb4\x19\x33\x8c\x25\x51\xdd\xbe\x42\x45\xc4\x5d\xf1\xcc\x0d\xec\xa2\x41\x25\x1c\x55\xd5\xd1\x92\x52\x52\x72\xa8\x78\xaa\x1a\xd5\x15\x54\xa6\x3e\xe7\x2b\x3d\x6a\xa9\x77\x22\x39\x40\x99\xf8\x44\x6c\xd2\x4a\x4e\x38\x83\x49\x75\x30\x5e\xca\x0f\xc6\xf5\xee\xcc\x60\x6c\x66\xa6\x34\x9a\x41\x25\x53\x9a\xaf\xe0\x51\x73\x62\x83\xda\x68\xc6\xbb\x10\x7b\xab\x6d\x3e\xf6\x22\x4e\x0c\xe6\x3d\xa5\x17\x55\xa5\x95\x95\x32\x19\x4f\x53\x9d\xea\xbe\xd1\xc1\x8e\xe4\x20\xc6\xa4\x16\xc4\x12\xf6\xe6\x15\x2c\xa9\x31\x9c\x7a\x56\x55\x25\x03\x07\x7b\x0e\x57\x7b\xe3\x14\xc6\x27\xd4\xf0\x68\xb5\x37\x39\xb8\xd9\x68\x76\x4a\xb9\x4c\xbe\xf7\x06\x2f\xd3\x1b\xd7\xdb\x9d\xb4\xbb\xdb\xcc\x65\x7a\x93\x9e\x6d\x66\xf4\xd6\x73\xbc\xde\xd2\x85\x5e\xaf\xd2\xe1\xc7\x93\xc9\xde\x5e\xc5\xd6\x46\x55\x67\xbb\xaa\x84\x25\xd5\x51\x7a\x94\x52\x4f\x0f\xd6\xb5\xc7\xeb\xd8\xef\x58\x03\xe6\xf3\x71\x54\x30\xee\x24\x15\x55\x41\x54\x7b\x94\x5e\x0f\x73\x68\x4c\xad\xee\x6c\x55\xf2\xb9\x7c\xa6\x17\xa5\xfe\xb8\x12\x4f\xaa\x4e\xa6\xda\xe8\xe5\xd5\x7c\x32\xaf\xe4\x63\x1a\xf6\x38\x19\xa5\xd7\xd1\x50\x55\xf3\x88\x39\xc4\x38\xc6\x9d\x9c\x17\x3f\x3e\x13\x47\x8c\x2b\x6a\x06\x93\x8e\x93\x44\x25\x13\x8b\xc7\x1d\x55\x45\x25\xc3\x8b\x57\x9c\x41\x2d\x53\x5f\x97\x8b\xbf\xa7\xc6\x73\xea\x9d\xa8\xec\xa5\x15\xd4\x65\xdb\x87\x6f\xb0\x0d\x4a\x12\x45\x29\x5a\x27\xb0\x3f\x5a\x57\x57\x57\x17\x25\x4a\xbe\x6e\x90\xb1\x75\x56\xa6\xcb\xd8\x26\xce\x73\x88\xcd\xd8\x77\xba\xb4\x78\xe0\x99\x1a\xbf\x3b\xc4\xf3\xf8\x9e\x31\x67\xc8\x66\xe7\xb1\xe7\xc8\x66\x72\x17\x51\x57\x63\x83\x61\xaf\x21\x72\x2f\x9c\x5a\xfc\xad\xa3\xc9\xb0\x57\x90\xbb\xfd\xfa\x35\x44\x34\x40\xe4\x76\xb9\x02\xcd\xdd\x6d\xdb\x2f\xb3\x33\xee\x47\x85\x09\xfc\xa7\x72\x9f\xb1\xa2\x8b\x0c\x7b\x2c\x33\x38\x60\x0c\xd8\x5d\x19\x9b\x06\xa8\xcb\xb0\xbb\x86\x12\x2b\xec\xb1\x30\x4b\xb4\x62\x8d\x39\x7f\x5e\xc2\x58\x3c\x6e\x91\x39\x4c\x93\x8b\x57\x4c\xd2\x60\x86\x88\x46\x52\x44\x6b\x16\x2f\x36\x16\xdb\x83\xe4\xda\x87\x95\xb2\x44\x99\xde\x80\x56\x90\x4b\x83\xdd\x96\x9d\x21\xe3\xb0\xc1\x28\xd5\x45\x57\xd8\x8b\xed\x0c\x25\x66\x51\xa2\x9e\x32\xe4\x66\x88\x16\x8f\x65\x06\xc9\x75\x07\x8c\x2e\xc3\xcd\x8c\x65\xc6\x5c\x63\xd0\x2a\xd1\x98\x31\x48\x34\x38\x66\xd0\x00\x69\x3d\x34\x30\x48\x9d\x49\x1a\xa4\xc1\x31\x7b\x20\xde\x47\x83\x44\x4d\x0e\x0d\x18\x34\x48\x25\xcb\xa0\x78\x1f\xb7\x5d\xae\x4b\x46\x86\xba\x0c\xb2\x07\xc9\x18\xb4\xed\x7c\x76\xbb\x31\x23\x4b\x34\xc3\x70\xea\x33\x99\x01\x63\x80\xec\x01\x6e\x9a\xb8\xad\x24\xdb\xb0\xc9\xe6\x96\xcb\x1d\xec\xe2\xa7\xdb\x2e\x5b\x41\xb4\xb8\x2d\x3d\x28\xba\x9a\xa8\xb1\x81\x32\x34\x49\x6d\xe9\x31\x32\x32\x5d\x86\x61\x74\x91\x4d\x91\xd6\x43\xfd\x9e\x11\xdd\x6e\x0b\x33\x69\x18\xbc\x4c\x97\xec\x8c\x30\x94\x36\x91\x6d\x67\x32\xb6\x5d\xbb\x66\x00\xf4\x0b\x1b\x78\x93\xb2\x17\xb6\xc1\x59\xf0\x59\xb8\x1b\x1e\x80\x27\x85\x26\x7e\x63\x9a\x59\x47\x99\xc5\x9a\xa6\xf9\x75\x1f\x1b\x66\x33\xd9\x04\x9b\xcf\x16\xb3\x65\x6c\x35\x5b\xcb\x36\xb1\xb3\xd8\x2e\x76\x05\xdb\xcb\xf6\xb1\x9b\xd8\xc3\xec\x09\x61\x03\x7f\xce\x5e\x61\xbf\x66\x6f\xb2\xb7\xd9\x7f\x4b\x11\xc9\x90\x4c\x29\x09\xc0\x7c\xc7\xe6\x26\x87\x1c\x72\x03\xd7\xf6\xb9\x65\xe3\x86\x0f\x6d\x11\xd8\x20\xdb\x21\xbf\xd4\x6e\x87\x7e\xd2\x4f\x3a\x96\xeb\xa0\x62\xb9\xb6\x63\xbb\x36\x39\x5c\x78\xf3\x04\xae\x5d\xcb\x2b\xf6\x1d\x97\x93\x69\x61\x20\x6d\x37\x5f\x64\xe4\x06\x52\xdc\xe3\x7a\x5c\xb1\x93\x76\x3e\xa8\xc5\x6f\x84\xad\x70\xb9\x3d\x75\xc8\x4a\xf8\x95\xa0\x1c\x09\xca\xed\x1c\x50\x3d\xd9\x2d\x8c\xb2\xd0\x0b\x25\xb7\x32\xcc\x94\xd0\x11\xd0\xcd\x51\x9b\x5b\x1b\x97\x84\x97\x52\x48\x6a\x6e\x96\xc4\x51\xe9\x90\xd8\x16\xe7\x14\x61\xf8\x42\x3b\x69\xd7\x8c\x5a\x58\x08\x1c\xcf\x3d\x14\xde\xa9\x99\x35\x2f\xf0\xb9\x89\x29\x74\x33\x54\x9c\x20\x1f\xd4\xc4\x7b\xd0\xee\xd8\x9e\xc2\x25\x7c\xcd\x49\xc9\xed\x47\x98\xe4\x74\x5b\xd8\x29\xe1\xc2\xa4\x8f\x5c\x98\xa1\xa8\xd4\x34\x75\xe7\x06\x43\xfc\xb5\x9d\x9a\xd1\x0d\x0a\xe1\x74\x05\x42\xae\xc9\x87\x99\x4d\x5e\xc0\x6d\x94\xf0\x28\xb8\x8e\x5b\xa8\x55\x4e\x18\x02\xe1\x86\x9c\x16\x08\x22\xe0\xe4\xe5\xb8\x91\xe1\xb7\xa2\xa4\x2d\xf2\x08\xbb\x29\x5a\x2a\x9c\x09\x56\x0b\x0b\xca\xbc\x5e\x05\x2f\xcb\xac\x5a\x15\xec\x02\xef\x5c\xde\x13\x61\x40\xd3\x8e\x59\xae\x10\x2c\xc7\x2f\x8b\xba\x45\x99\x88\x4a\x89\xbe\xe2\xb5\x2d\x89\x88\x96\x27\x1c\x12\xd3\x06\xcf\x0b\x1d\x3b\xef\x39\xb6\x27\xad\x7f\xfa\x4c\xca\x89\xc1\x9b\xd6\x75\x5d\xbf\xee\x84\x34\xae\x2a\xd2\x4a\x31\xd4\xf5\x2f\x33\x9b\xa8\x39\x36\x24\x59\xc6\x64\x75\x41\x8e\x0c\xa1\xf5\x75\x32\x8c\x34\x21\xe9\x62\xbf\x03\xf3\x23\x48\x45\xcb\xd2\xf5\x0a\xe9\x6b\x69\xe4\x07\x4b\x2b\xec\x3e\x4b\xa7\x34\x22\xd6\x55\x51\xcf\xfd\x82\x68\x15\x8d\x8c\xb0\x5b\x29\x77\x1a\x55\xff\xed\xcf\x23\x44\x46\xbd\x46\xeb\x2c\xa6\xfe\x9c\x96\xe6\xea\xdb\xf5\x8e\x1c\x7d\xbd\xd8\x94\x2b\x5a\xae\xa6\x13\x15\x3b\xd2\x64\xa0\x91\x2e\xea\x7d\x76\x1a\xa9\xda\x3a\xdf\x9a\xb0\x3a\x46\xf2\x23\x38\x92\xd7\x83\x9b\x70\x69\x60\x75\x50\x5f\x3e\x5f\xb4\xf4\x1c\xc5\x52\x4d\xad\x46\xba\x58\x7d\x3c\xad\x7f\x69\x24\xdd\xc1\x5a\xd2\xe9\xa9\x2a\xe5\x3b\x62\x2a\x21\x56\x3a\x28\xa6\x2e\x98\x08\x68\x84\xac\xe2\xc8\x48\x60\x10\x59\x95\x0e\xa9\x2d\x70\x52\xc5\x0e\x2a\x16\xd3\xfa\x09\x81\x81\x6d\x91\xa2\xd5\xa1\x77\x58\x41\xf5\xf9\x01\x55\x4f\x37\xe9\x41\x7a\xe4\xcc\x46\x57\xef\xc3\xee\xd4\x48\x60\x20\x05\xfa\x08\xd7\xda\xf5\x43\xd6\x04\xf6\x55\x5f\x19\xc9\x4f\xb0\xdb\x2c\xa3\xaa\x75\x8c\x74\xcc\x5e\x69\xac\x43\x22\xde\x35\x94\xce\x75\x9e\x1f\x58\x13\x13\xd1\xde\x91\x68\xa1\x23\x4d\x0d\xcd\x88\xb9\xfa\x54\x53\x13\xa5\xd3\x94\x4e\x5b\x02\x21\x32\x5a\x53\xd3\xee\x62\x90\xce\xc5\x63\xbd\x99\xcd\x39\x1d\x3b\x28\x6b\xae\xb3\x62\x05\xc3\x50\xf6\x9e\xa7\x37\x35\x51\x6e\x65\x82\x3f\x09\xe2\x9d\x5b\xaf\x62\x62\x53\xba\x89\xd0\xf2\x86\x89\xfa\x42\x53\xbf\x2d\xd7\xa7\x77\x20\x0d\x73\x92\x9d\xc8\x91\xde\xa7\x17\x13\x89\x26\x9d\xb0\x23\x37\x1b\x6b\x4f\xad\xa3\x15\x31\x92\x62\xaf\x7b\x69\x22\x6a\xb2\x52\x49\xcb\x32\x12\x3a\xe1\xfc\x1c\xd1\xcf\x3c\xba\xf4\xc0\xef\x74\x7d\x21\xfb\x62\x3a\xdf\x82\x18\xe4\x86\xd1\xb2\x90\x76\x32\xea\xc3\x04\xce\x3b\x1c\x3b\x28\x9d\xc7\x46\x57\x9f\x9d\x28\xdb\x81\xde\xda\x69\xcc\x62\x44\x83\x71\x4a\x24\x88\x72\x7a\xdf\xb0\xb8\xc7\x36\xe2\xd6\x67\xa9\x89\x2b\xfd\x8c\x1e\xa6\x74\x9c\x87\x41\xae\x69\x98\xf2\xad\x7a\x1f\x8d\xd0\x6c\x49\x69\xa2\x04\xce\x27\xdf\xa6\x26\x6a\xf2\x72\x7d\x98\x6f\x45\x22\x1c\x26\x0f\x8d\x62\x91\x5c\x9f\x0e\xef\x6b\x1a\xd1\xad\x1e\x55\x9f\x4d\xbc\x12\x69\xa4\x1e\xdf\xa3\xa6\x0e\x2b\x9f\x49\x74\x50\x1f\xb6\xd2\xbc\x56\xa2\xa6\x5c\x0e\x97\x12\x4d\x28\x63\x31\x7d\xb6\x6f\x23\x0d\xe3\x5a\x5e\x50\xfb\x00\x1d\xab\xcf\x69\x59\xbb\x54\x5f\x9c\xc4\xb5\x62\xbc\x36\x0f\x2e\x6d\xeb\x31\x70\xb2\x8d\xb6\x5b\xa4\xeb\x14\xe8\xf3\x69\xb9\xb3\x89\xb6\xf1\x6e\xc1\x74\x1a\xf5\x25\xe9\x32\xf5\xb8\x16\x15\x94\xb6\x92\xd5\x9a\xef\x23\xb3\x9f\x5a\xd1\xea\xd3\x8d\x84\xe8\x50\x8f\x66\xa7\x35\xbd\xc9\xa3\xe1\x5c\x5a\x77\xd5\xce\x4e\xab\x49\xcf\x75\x60\x8e\xa8\x0f\x73\x64\xa5\x03\x1a\x6e\x4a\x60\x07\x7f\x46\x94\xa0\x3e\xbf\x8e\x2c\xbd\x49\x27\x63\xda\x7f\xf2\x82\x72\x16\x9c\x05\x77\x8b\x08\xfe\x63\xf0\x04\x3c\x05\xcf\xc3\x4b\xf0\x6b\x78\x13\xde\x82\x3f\xc1\x5f\xe0\x43\x38\xc8\x22\x8c\x98\xca\x62\x2c\xc9\xd2\xac\x95\xb5\xb1\x51\x36\x8b\x4d\xb2\x45\xc2\x5f\x72\x0c\x3b\x96\x6d\x65\x27\xb2\xd3\xd8\xb9\xec\x22\x76\x15\xbb\x9a\xdd\xca\xee\x64\xf7\xb0\x2f\xb1\x2f\xb3\x47\xd9\xe3\x5c\xb5\x84\x76\x58\x72\x92\x1c\x79\xb1\x9b\x05\x2e\xb9\x81\x50\x28\xb6\x1b\xb8\xd3\x82\x83\xff\x43\x0a\x5c\x0e\xdb\x6e\xe0\x1e\xf2\x81\x0e\xb3\xd0\xa9\x8c\x32\x37\xcf\x15\x09\xcf\x12\x94\xdb\x43\xcb\xe1\xc8\x64\x73\x4c\xe1\x68\xee\xd8\x48\x28\x4a\xf4\xa8\xec\x51\xb9\x28\x95\x8b\xcc\xf4\xcd\xb0\xc2\x2c\x0e\x6d\xa5\x31\x56\xee\x66\x9c\xc7\x92\xcb\x35\x83\x08\xd0\x14\xbc\x42\x50\x18\x65\xb1\xb0\x92\x73\xc2\x42\x37\xf3\xe4\x76\xe1\x6d\x10\xd8\x59\x0b\x39\x89\xd0\x7c\xcd\xd5\xc1\x09\xf3\x74\x40\x9f\x63\x61\xcd\x6f\xe9\x09\xba\xec\x72\x56\x1d\xe4\x83\x16\xe6\x7b\x42\x44\x88\x08\x77\xe0\x91\xe5\x3a\x7e\x58\xf3\xcd\x52\xc0\x84\xe4\xf1\x0f\x19\x0b\xa7\xb6\xae\xe0\x23\xa6\xee\x07\xca\x74\x60\xab\x46\xd1\x45\xe8\x85\x3c\x4e\xec\x39\x51\xe7\x28\x5e\x8e\x32\x5e\xab\x9a\x30\x49\xda\x7e\xc5\xf7\x14\xc7\xe5\xf6\xa0\x24\x3c\xb5\x7e\x58\x0b\x55\x71\x43\x10\xd6\x30\x9e\xdc\xf0\xd0\xca\x03\xae\x27\x04\xf4\x7a\x8a\xed\xb7\x13\x47\x6e\x5b\x34\x24\x68\xe7\x5a\xa6\x85\x85\xbe\x53\x0e\xed\x69\xd7\x2b\x4d\x6b\x2c\xf6\x93\xdb\x4c\xe5\x9b\x63\x3d\x4d\x9a\x2a\x37\xa9\x1a\xa2\xd3\x8c\x4a\xa7\x66\x3a\x88\xa6\x8b\x0e\xa2\x63\x2e\x69\xc0\x61\xce\x19\x47\x17\x4c\x9e\x73\xe6\x1c\xa5\x68\x9e\x83\x1b\x37\xa0\x86\xa8\x2e\x67\x27\x34\x6f\x42\x53\x4b\x15\x11\x35\x6c\x5e\xfb\x89\xcf\x98\x98\x9d\x15\x6f\x8e\xcf\x3a\xe3\x8c\x61\xec\x74\xd7\x7e\xa7\xbd\xfa\x28\x8b\x6c\x38\xd2\xbc\xf5\x04\x33\x85\x0a\x6a\xc7\x7f\xdd\xbc\xf0\x49\xbc\xcf\xfe\xc4\x9e\x65\x43\x87\xbd\x39\xcc\xc2\x75\xca\x89\x87\xdf\x54\xac\x5e\x1f\xa9\x60\x27\x06\x9d\x18\xb8\x5a\x11\xab\x5f\x71\xcc\x54\x4a\x6d\xd6\xd0\xcc\x9a\xa8\x65\xb5\x94\xa3\x55\xff\xd3\xc9\xaa\x59\x33\x65\x2a\xb8\x5f\xe9\x8a\xc7\x35\xc7\xe9\x44\x4d\xab\x1e\xa5\x69\x5a\x73\x5c\x53\xb5\x40\x5b\x94\x95\x64\x4d\x7b\x5e\x5b\xe7\x36\x36\xf4\x75\x76\xba\xd5\xbf\x16\x53\x6a\x73\xbc\x13\xab\xbf\xc9\x6a\xa8\x60\xa7\x8b\x2d\x0d\xa9\xe6\x62\xaa\x2d\x8b\xb8\x28\xd5\x75\x5d\x67\x73\x91\x25\xda\x3a\xd1\xc5\x03\x07\x11\xa5\x97\x31\x8b\x72\x9d\x3b\x35\x37\x85\xa6\x74\x97\xd6\xa6\xcb\x6e\x2a\xde\x89\xda\x2c\xb3\x13\xb5\x49\x33\xdb\xbc\xae\x88\x88\x9a\xd9\x36\xf5\x5e\xb3\x92\x65\xff\x66\xc5\x50\x55\x54\xb7\x3a\x5b\x63\xfb\x34\x34\x1d\xc7\xd4\x9c\xea\x06\x07\xe3\xcd\x88\xe5\xcf\xc7\x53\xa9\x71\x27\xeb\x7c\xca\xec\x34\x53\xf1\x66\x53\x39\xcb\x22\xa2\x79\xf9\x12\xe9\xfa\x5e\x9d\x74\xd4\x89\x43\xc1\xa1\x8f\xae\xeb\x48\xa8\xeb\xa7\x7c\xfa\x96\x6d\x37\x9c\x3d\x6c\xd1\xea\x85\x5e\x82\x9b\xb4\x93\x4f\x29\xd4\xe9\x8d\x86\x80\xdd\xd9\xfa\x92\x53\x74\xa4\x5b\xb7\x1e\x59\xcb\x14\x55\x48\x4b\x2f\x39\xb7\xf5\xab\xc7\xb2\x07\x58\x7c\x5b\xe2\xc0\x7d\xef\xee\x29\xff\xe4\x33\xb7\x92\xae\x7b\x88\x4b\x5e\x3b\xd2\x34\x9a\x86\x7b\x73\x67\x9e\x58\x66\x27\x3f\xb8\x24\x71\x5c\x93\xfe\x95\x9d\x4d\x1e\xa1\x65\xcd\xca\xe9\x56\xd9\xca\xe9\x96\x45\x98\x23\x6c\x6a\x4d\x50\x13\x5a\xd8\xaa\x5b\xd4\x9a\x68\x6a\x6d\xca\x11\x35\xd6\xe9\x16\x35\x35\xf1\x5a\x1d\xfa\xf2\x4a\xf0\x4a\xeb\xd5\x9b\xa9\x95\x68\x56\xce\xa2\xbe\x3e\xdd\x43\x33\xe3\x79\x39\x2f\x67\x0d\x61\xd6\x29\x97\xb1\x8c\x89\xb2\x93\xc5\x3e\x2c\x53\x99\x1b\xe9\xbe\x61\x2a\x37\xf5\x35\x59\x85\x42\xd0\x68\xcd\xb3\x74\x1a\x4a\x58\xde\x50\x53\x93\x95\x6b\xea\x6d\xf5\xf8\x07\x73\x5e\x13\x36\xa1\x92\x69\x42\xdd\x43\x8e\xad\x3a\xe9\xc4\xf1\x0e\xf9\xfd\x73\x3a\xbf\x3d\xaf\x6b\x53\x82\x9f\x6e\xc2\x68\xb4\x15\x13\xf1\x28\x36\x61\x13\x3f\xb4\x2c\xcb\x82\xda\x3b\xca\x72\x5c\x79\x14\x4e\x81\x1d\x4c\x61\xa3\x6c\x9c\x1d\xc5\xd6\xb2\xcd\xc2\x33\xb3\x9d\x9d\xc1\xce\x65\xbb\xd8\xa7\xd8\x57\xd8\x63\xec\x9b\xec\x69\xf6\xac\x58\x8b\xf4\x3a\xfb\x1d\xfb\x03\x7b\x97\xbd\xc7\xfe\x8b\xfd\xb5\xb6\x2a\x49\xaa\x93\x34\x29\x26\x75\x48\x3d\xd2\x49\xd2\xa9\xd2\x19\xd2\x59\xd2\x2e\xe1\x9f\xb9\x5a\xba\x5e\xba\x4b\xfa\x82\x74\x9f\xf4\x90\xf4\x88\xf4\xa4\xf4\x94\xf4\x7d\xe9\xc7\xd2\xcf\xa4\x0f\xa4\x6a\x44\x8a\x28\x91\x74\xa4\x35\x52\x88\x74\x45\xfc\x48\x18\x99\x88\xac\x8c\xac\x01\x48\x94\x6c\xc7\xa6\x64\x82\xfc\xb6\x20\x0c\x42\xce\xda\x3c\x11\xe4\x71\xfc\x16\x4e\x4d\xdd\xbc\xcd\x39\x6f\xcd\x1d\x50\x5b\xfe\x94\x70\x0b\x1c\x9f\x44\x90\xb8\xe0\x72\xa6\xe5\x4d\x47\xb7\x4b\x0e\x79\x54\x70\xf3\x11\x57\x11\x85\x3a\xc8\x11\xb6\xc0\xf9\x2d\x2f\xb3\xc8\x59\xab\x9f\x14\x71\x21\xdb\x09\x1d\xce\x9c\x1d\x72\xec\x1a\x35\x76\x84\xb2\x77\xc8\x0e\xfd\xda\x2d\x2d\xdf\xb6\x5c\x3b\xf4\x3f\xe2\xce\x25\x9b\x1c\x01\xba\x64\x27\x13\x9c\x10\x46\x2a\xbe\xd3\x5e\x8a\x9b\x62\xdf\x17\xac\x38\x08\x3d\x97\x1c\x37\x99\x65\x82\x77\x87\x7e\xad\x78\x4b\xb1\x7d\x51\xb0\x70\x34\xf1\x33\xfc\xa7\x2c\x58\x6a\x39\xe2\x39\x22\x28\x7f\x28\xf0\x6d\x97\x78\xf3\xac\x16\x66\x7b\x36\x39\x81\x1b\x7a\x61\x99\xb3\x3f\x2f\xa8\xc1\xab\x1b\xd6\x1c\xcf\x5e\xd0\xc2\xdc\xe9\x85\x47\x64\x73\xea\xc8\x51\x55\xf8\x49\x38\xf0\xf2\x76\x5a\xc2\xdb\xcc\x81\xb6\xdc\xee\xdb\x2e\x4f\x4f\x1c\x7f\x05\x3d\xf5\x14\xdf\x71\xfd\x1a\x6d\x6e\x9f\xa6\xa7\xb5\xce\xa9\xf5\xaf\xf0\xd1\x04\x6e\xd9\xf7\x6a\x80\xcc\xcb\x16\xb9\xb8\xd1\x11\xd4\x36\xa8\x21\x7a\xb2\x76\x91\x7c\xdb\x6d\x17\x31\x32\x5e\xc2\xb4\x6f\x4a\xa4\xe6\x0d\xf7\x6d\x97\x77\x40\x68\xbb\xc1\xf4\x71\x37\xb7\x09\x39\xdb\x0f\xda\xa7\xaf\x2b\x35\x1b\x41\x76\x49\x54\x41\x90\xf8\xda\xba\x87\x9a\xcb\x4c\xf1\x5c\x9b\x77\xaf\x2d\x9c\x74\xc9\x5a\x85\x0b\x81\xd8\x75\xa9\x46\x97\x9d\xe9\x25\x06\xb5\xc5\x54\xa5\x51\x56\xb2\xfd\x12\xb7\x6f\x7c\xb0\x70\xb2\x1e\xfa\xb6\x97\x9b\xae\x69\xc0\x07\x84\xed\x7a\x39\x61\x0e\xc4\x8a\x0a\xd1\x00\xde\x3d\x9e\x6b\x17\xc4\x52\x2c\xd1\x60\xc5\xf6\x83\x61\x11\x52\xe4\x6d\xe0\xf6\x37\x28\x8b\x7d\x87\xef\x97\xbd\x9c\xed\xb8\x5e\xe8\x85\xb5\x18\x61\xed\xd9\x89\xfe\xb3\xf3\xbc\x24\xb1\x9e\x81\x77\x99\x10\x41\xe2\x19\xf2\x07\x22\x7a\xa0\x85\x75\x33\x31\x96\xf9\x38\x71\x02\x5e\x23\xbf\x16\x4f\xf1\x39\xd7\xe7\xe3\x6f\xba\x0a\xdc\xba\xb9\x24\x56\xc8\x71\x33\x2d\xa4\x52\x50\x98\x5e\x96\x11\xd4\x5c\x80\xa1\x70\xb3\xf9\x3c\x69\xe7\xa5\xeb\xb0\xa3\x88\x1a\x3b\x19\xe3\x8a\x12\x47\xec\x5c\x85\x3b\x34\x44\x54\x35\x0d\x59\x83\xa2\x28\x2a\x22\x9a\x1a\x8d\x8d\x8f\x4f\x96\xb5\x21\x2c\x2f\x53\x15\x33\xbb\x4d\x31\x47\x07\x0a\x05\xac\xde\x8a\x71\x37\x8b\x2d\x0b\x4c\xe5\x8c\xb3\xe3\x88\x59\x2d\xae\xdc\x83\x39\xe3\x2e\x5e\x00\xb7\x68\x6a\xdc\x51\x31\xae\xaa\x7c\x5f\x04\xf8\xb4\x54\x0a\x31\xae\x68\xa8\x69\x26\x37\x89\x1a\x3a\x9d\xd9\xf2\x50\x87\xe2\x66\xd9\x8b\xe5\x6c\x3c\x70\x4d\x6e\x33\x51\xfc\x11\xa1\x02\x9e\xb5\xba\x7c\x21\xde\x30\x84\x0a\x22\xde\xa0\x61\x79\x61\x73\x31\x8b\xcb\xdd\xb5\x88\xd2\x8c\xe2\xa2\xa2\xd9\x37\x54\x8c\x17\x95\xb9\x2a\x6a\xb8\x16\xf3\x8a\xc8\x8f\x8b\xb0\x3c\x3e\xae\x69\xd2\xae\x62\x51\x84\x31\x87\xfa\x1c\xd4\x54\xc4\x72\x3c\x6e\x16\x51\xc1\xa1\xa1\x03\xdf\xd3\xb4\x1b\x55\x55\x3a\x0e\xc7\x75\xbf\x33\x3b\x3e\x95\x52\x50\x3d\x76\x11\x46\xa5\xd1\xa0\x88\x4e\x1c\x8b\xc5\xf1\xa1\x4e\x77\x52\x84\x2d\x10\x4d\x73\x72\x2a\xab\x69\x9b\x16\xe9\x33\x76\xe3\x65\x4d\x3d\x38\xb9\x49\xd3\x22\x65\x4d\x9b\x0a\xb2\x4e\x1c\x31\x3f\x26\x5d\xc0\x2b\x8b\x67\xab\xea\x65\x8a\x32\xa4\xa1\xaa\xbe\x88\xc8\x13\xdc\x85\x52\xdc\x75\xfb\x1c\x87\xed\x52\xf1\x38\x55\x49\x37\x96\x47\xeb\x30\xae\x8e\x63\xa0\xcc\x5d\xab\xaa\xd5\x5d\xd8\x89\x8e\x9a\x2f\x67\x31\xae\x15\x87\x52\x6e\xa7\xa3\x76\x94\xb5\xec\x64\xd6\x54\xcd\x2c\x2a\x68\x2a\x2e\x76\x16\x87\x86\x55\x6c\x56\x14\x6d\x3c\x9e\xd5\xe2\x9d\x9d\xcb\x34\x6d\xea\xc5\xb8\x22\xdd\xa9\x69\x88\x8f\x68\x88\x53\x7f\x29\x16\x7f\xaa\x2f\xc5\x49\x76\x2b\x62\x75\x72\xa1\x69\xaa\x69\xc3\xc5\x21\xe9\x57\x9a\x76\xe0\x5e\xdc\x85\xe5\xa1\x65\xaa\xba\x6c\xb9\xb2\x6c\x95\xaa\xae\x5d\xa8\x2d\x93\x1e\x51\x55\xde\xc7\xb7\x6a\xda\xd4\x5f\xc6\xe3\xe3\x43\x7d\x7d\x2a\xef\x7a\xa5\x83\x37\x28\xce\x5b\x23\x9d\xac\x69\x4f\x68\xda\xad\x9a\xd6\xd7\xe7\x68\x8b\x4c\x14\x0f\xa4\xfe\xf3\x8a\xa6\x5d\xa0\x68\x88\x4a\xf5\x11\x44\xc9\xed\xcb\x22\xa2\x52\x74\x52\xbb\xca\x98\x75\xb3\x46\x6e\x6a\x51\x7b\x0e\x3b\x71\x3c\x5e\xc6\xf1\xf8\x78\x19\xe3\x6b\xc7\x15\x6d\x48\x79\xd4\x39\x45\x53\xee\xae\x7e\x03\x1b\x6d\x77\xdd\x77\x31\xa5\xe0\xad\xe8\x68\x88\xbb\x1c\xd3\x74\xb5\x4d\x7d\xd9\x66\xd5\x41\x3c\xa3\xcf\xcc\x56\x9f\x6a\x9f\xd9\xd7\xdb\x38\x84\x33\xfb\xcd\x21\xec\x08\xe2\x7d\x4a\xdf\xac\xb8\x89\xcf\x39\x68\x2e\x67\x6f\xb8\x88\xf8\x70\xf5\xbb\x98\x55\xe2\xc7\x37\x48\x1e\x93\x1e\xc5\xbe\x01\x6f\x68\x57\x5c\x4b\x65\x30\xee\x74\xf6\x69\x1a\x1f\x02\x9a\x3a\xae\x69\x66\xa7\xda\x89\xaa\x3a\xc9\x87\x1d\xc6\xc7\x35\x55\xcb\xa2\x19\x57\xd1\x51\x35\xcd\x19\xca\x22\x6a\x0a\xce\xab\x1e\x40\xfc\x3c\x1b\x1c\x52\xca\x07\xa1\xfa\x5a\xb3\xbb\x9b\xc1\xe3\x0f\x3e\xe8\xa4\x2e\x1d\xc6\xce\xce\xec\xa2\xec\xee\xa1\xac\x86\x18\xd7\x56\x67\x5d\x45\x3c\x66\x31\x3e\x51\x53\xcc\xac\x76\x0b\x7b\x10\xe3\x0e\x62\xe3\x0c\xa5\x03\x47\xe6\x6b\xc5\x4e\xb3\x2d\x3f\xab\x33\x9b\xd5\xfa\x54\x5c\x94\x6d\x8e\x3b\x67\xce\xc3\x2c\x6a\xcd\x7c\x04\xa3\xd2\x3b\xaf\xa8\x8d\x8b\xc1\x38\xa4\x95\x45\x4f\x2b\xee\xb8\xd6\xe8\xa3\x89\x9a\x3b\x8e\xa6\x12\x1f\xea\xcc\xc6\xe3\x93\x41\xc7\x30\xa7\x73\xa8\xa6\xe2\x93\x4e\x56\xf5\xdb\x5d\x5c\xd0\x6d\x3a\xce\x92\x18\x86\xb9\xce\x21\x6c\x89\x66\xb3\xaa\x1a\x1f\xd7\x8a\xb8\x24\xbd\xa8\xb3\x23\xe5\x3a\xab\x53\x59\x77\xdc\x55\x94\xbc\x65\xa3\x86\xfe\x6c\xde\xe0\xc6\x99\x4a\x61\x50\xe9\x4b\xa5\x50\xeb\xf7\xe2\xfa\x18\x6a\x7c\x26\x34\xe7\x35\x5e\x65\x1c\xe7\x9d\xa2\x2a\x62\x2a\xaa\xd9\x3e\x57\xd3\x54\x95\xb3\x32\xd3\x41\x17\xfb\x8a\x6a\xb9\x73\x7e\x93\x39\xe4\xac\x56\x06\x2c\x75\x93\x26\xc6\x84\xda\xa9\x8d\xab\x8a\x6a\xb7\x16\x35\x1c\x72\x1d\x2d\xd6\x5c\xc6\x49\x53\x33\x6b\x53\x5e\x19\x57\xc6\x4d\x34\xcd\xa1\xac\xd6\xa9\x65\x9d\x3e\x3e\xff\x55\x3e\x3c\x54\xb7\x39\x50\xcb\x1a\x8e\xe3\x24\x6a\xce\x96\x92\x89\x9b\xb4\x86\x46\x74\x50\xed\x74\x1d\xd4\xb4\xb2\x36\xe4\xc6\xb1\x7f\xa1\xa2\x56\xc6\x3a\xb5\x78\x6a\x21\xe6\x0f\xc3\xdd\x41\x7c\x12\x4d\x8e\x4c\x43\x8e\x36\x19\x9f\x63\x14\x71\x9c\xcf\xc6\x96\x34\x62\xbe\x2d\xde\x14\xd5\x82\x0e\x25\x1b\x1f\x9f\x44\x75\xb9\xa6\xb4\x0e\xa2\x66\x62\xcf\x68\x1c\x4d\x13\x7b\x0c\x6c\x0d\x55\xd7\xd1\x14\x65\x5c\xed\xc4\x72\x1c\xb1\xc8\x47\xb5\xa2\x04\x9d\xe8\x98\x98\x49\x39\x3d\x16\x62\x1f\x4e\x8e\x8f\x63\x34\x44\x9c\xd4\x86\x00\x02\xb1\x90\xfd\x5f\x95\x47\xe1\x12\x78\x1c\x9e\x82\xef\x8b\x55\x7f\xb5\xb5\xda\xef\x31\x89\x21\x53\x59\x9c\xa5\x59\x85\x0d\x7d\x14\xbb\x3a\x9a\xad\x67\x9b\xd8\x36\x76\xb2\x88\x89\x9f\xcf\x2e\x65\x57\xb0\xab\xd9\x3e\x76\x33\x7b\x50\x70\xa5\xaf\xb3\x6f\xb1\x7f\x63\xbf\x61\x6f\xb2\xb7\xd8\x7f\xb0\x3f\x4b\xb6\x94\x96\x7a\xa4\x61\x69\x5c\x5a\x2c\x1d\x2f\x9d\x02\xc0\x4a\x4e\xe8\x5b\x2d\x42\x80\x39\x96\x4b\xc2\xc4\xba\x1e\x0a\xb7\x9e\xed\xb9\x1c\xe5\xa7\x19\x88\x23\xe8\x85\x73\xc8\x59\xc7\x2d\x87\xcf\x99\x01\xd9\xc9\x16\x66\x39\xa1\x9f\x14\x8b\xf9\x1c\xab\x9b\x21\xb7\x82\x24\xf8\x4d\x18\x94\x43\xbf\x10\xa1\x69\x1d\x69\x7b\xe4\xe6\x3d\xbf\xc0\x8d\x67\xd9\x0f\x03\x27\x74\xfc\x36\x11\xe0\xf1\x43\x27\x74\xc8\x36\xb9\xc4\xf4\x90\x6c\xf2\x2b\xd3\x4b\x71\xca\x2e\x71\x3d\x18\x29\x70\xa6\x14\x3a\xdc\x64\xba\x79\x6a\x9f\x36\xed\x35\x5b\x4c\x62\xb1\xb3\x17\x24\xfd\xd0\xb3\x0b\x41\x5e\xb1\x6b\xda\x2d\x98\x5e\xad\x32\xad\x14\x83\x5a\xe8\x3a\x98\x8e\xf4\x14\xa6\xed\x11\x37\x91\x7e\x6d\x41\xb6\x2b\x56\x64\x8b\xc8\xca\x21\xe7\x5a\xb9\x66\xe9\x9d\xb0\xc8\xf8\xed\x79\x23\x14\x27\x28\x08\xf9\x59\xf6\x6d\xdf\x73\x84\xf4\x0b\x5c\x47\x90\x03\x57\xd8\xc0\x90\x67\x2f\x8b\x75\x39\xb5\x38\x3e\xd5\xd6\x91\x73\x96\x22\x4c\xa9\x88\xd8\xff\xaf\x63\xd0\x2f\x88\x90\x98\x90\x9f\x85\x8f\x92\xf1\xfe\xad\x59\x5e\xbf\x66\x98\xa9\x46\xd5\x48\x38\x5e\x7d\xc7\x75\x92\x3e\x59\xb5\xd5\x44\x3c\x8d\x88\xc6\xd7\x42\x51\xa1\xe7\xf8\x49\xc7\xf5\xda\xff\x97\xd0\x08\x93\xae\xd4\xfc\x9d\xc2\x21\x38\xbd\x12\xde\x11\xcb\xe9\xb9\x8d\xe7\x95\x2f\xb8\x01\x97\xb0\xb5\xe0\x97\x6f\x0d\xb3\x82\x38\x1b\xd4\x62\x4f\x01\x67\x00\x9e\x58\x20\xe1\xdb\x49\xdf\x23\x9e\xc7\x0f\x6b\xab\xc3\x85\xe3\xd6\x73\x9d\x43\x12\xb5\xb6\x62\xbc\xf6\x8b\x94\xf4\x0b\x81\x94\x73\x7c\x99\x52\x91\x88\xac\xc9\x75\x43\xb2\xa6\xca\x72\x5d\x97\x5c\x97\x90\xad\xa8\xdc\x20\xc9\x75\x72\x34\xc2\x3f\xd1\x3a\x39\x26\xd7\xc9\x72\x4c\x93\xeb\x64\xd2\xee\xee\x96\x65\x55\x96\xe5\x74\x69\x63\x62\xad\xf7\xb2\x5c\x37\x9f\x6e\x98\xb4\x4a\xf2\xe2\x58\x44\xee\x8e\xd6\xc9\xb2\x5c\x9f\x94\xd5\x16\x8a\x6a\x11\x6f\x41\x44\x66\x46\x75\x8f\x2c\x47\x7f\x29\xcb\x8e\x5c\x4a\xab\x75\x43\x47\x55\x64\xef\xce\x23\xeb\xa2\x31\x55\xbb\xce\x8b\x6a\x5f\x49\xc6\x62\x8e\x2c\x3b\x56\xe2\x13\x83\x52\xfd\x95\xef\xb1\x2f\xd9\x8d\x72\x49\xad\x93\x13\x75\x72\x34\xa1\x69\x4e\x9d\xa6\x25\xb4\xea\x4d\x09\x9e\x21\x4a\x27\xb9\xb1\x34\xc5\xa2\x5a\x5a\x4d\xa9\x89\xdb\x5d\x4d\x8e\xc9\x72\x7d\xc4\x8b\x29\xcd\x31\x39\x92\x77\x2d\x97\xdd\x1c\x8d\x59\xae\x56\x27\xd7\x5d\x20\x27\xea\x78\x75\x2c\x47\xae\x8b\xc8\x51\x59\xae\xd3\xa2\xaa\xac\xca\x8e\xe3\x38\x5a\x75\x5d\x2a\xce\xc2\x88\x75\xa5\x56\xe7\x46\xaa\x4f\xaa\xf2\x2e\xdd\xf4\x64\xb9\x28\xcb\xa9\x58\x54\xdd\xae\xaa\xf3\xeb\xba\xfa\x4a\x5d\xa5\xbe\x52\xb1\xbe\xe0\x58\xdd\xb2\xd6\x52\x8c\x68\xf9\x3e\x23\x53\xaa\x6f\x2f\x95\x54\x92\x13\x75\xc5\x94\xcc\x3f\x5e\x5d\x37\x91\x27\x27\x64\x47\xae\x93\x5f\x97\x1a\xe4\x84\x46\x72\x24\x12\x89\xd5\xc9\x5a\x9d\x1c\x21\xd9\xab\x8b\x98\x92\x9c\xa8\x7e\x8b\x28\x9d\x48\x6c\xa9\xab\x9b\x5d\x57\xc7\xb6\x3b\x09\xd5\x49\xc8\x75\x69\xb9\x2e\xad\x45\xeb\x93\x72\x34\xe5\xa8\x64\xa6\xce\x4d\x58\xe9\xa8\xe3\xc8\x75\x4e\x8c\x9c\xba\x98\x9c\xf8\x94\xe3\xd4\xa5\xb5\x16\x39\x21\x0f\xa9\x2d\xce\xb9\x6a\x22\x4d\xb2\xac\xa5\xa2\x89\x23\x65\x2f\x2a\x27\xa2\x72\x2c\x42\x72\x54\x76\x5c\x55\x75\xa2\xaa\xe3\x38\xe9\x93\x9c\x54\x8b\xf2\xe8\xe6\x46\xcf\x44\x4c\x9c\x50\xa8\xd9\x29\x4d\xb1\x74\xe2\x86\x27\xd1\xd8\xb2\xba\xf1\x06\xe4\x8a\x10\x13\x89\x85\x1a\x8e\x21\x16\xb0\xd1\x4c\xac\xd3\x11\x57\x64\xf5\x58\x1f\x3a\xf6\x0c\x44\x1d\x07\x25\xce\xfb\xba\x31\xb1\xac\xa9\x7d\x79\x9b\x75\x9f\xf4\x43\xe1\x0f\xd6\x11\x4b\x5e\x77\xa9\x60\xea\xc8\x55\xec\xd8\x4e\x24\x4c\x24\x10\xaf\x46\x9a\x5a\xfc\x8a\x96\x40\x4c\xe8\x3d\xad\xc2\x34\x8e\xa1\x46\xed\xcb\xd9\x35\xfb\xf7\xe1\xa2\x16\x4c\xac\x9b\xd1\x93\xe8\xde\xd2\x38\xde\xac\x85\x12\x8e\xad\x43\x2c\x34\x69\x05\x4a\xe8\x89\x46\xd4\x07\xb5\x81\xba\x46\x4d\xd7\x17\x2e\x2b\x3b\xa8\x0f\xce\xc4\x41\x5c\xd8\xa8\x21\xb6\xce\x4d\xf7\x23\x2e\x5c\xa8\x35\x15\x12\x1a\x26\x90\xb0\xc5\x6c\x22\xa2\x41\x44\x8c\x45\x10\xf5\x6e\x26\x5a\xd2\xd2\xa3\xeb\x54\xc2\x1e\xc4\x56\x12\x0b\xd5\x34\xad\x51\xd7\x35\x1f\xc7\x5a\x4d\x7e\x72\x26\xef\x06\x6d\x46\xcb\xdc\x44\x81\xcd\x0e\x74\xaf\x2e\xb1\x0c\xdb\xea\x30\xbd\xa0\xb1\xb1\x7b\x46\x63\x39\xd7\x32\x1a\x4d\x74\xab\xad\x73\x2b\x0d\x18\xf4\xb7\xba\xd9\x96\x85\x8d\xb9\xa8\xb9\x5c\xcf\x24\x31\x9b\xc1\x15\x59\x6c\xc5\xc6\x12\x62\x62\x0c\x75\x9d\xb4\x56\x44\xed\xd6\x16\xca\xe4\x49\x6f\x21\xc2\x96\x84\xd6\xaa\x25\x12\x85\xc6\x52\x41\xd3\x75\xd4\x50\xd7\xf4\xf6\x19\xd4\x82\x3d\x84\x89\x46\x4c\x34\x6a\x9a\x63\x69\x09\xbd\x51\xd7\x13\xd8\x88\x7a\x6b\xaa\xa5\x75\x46\x22\x11\x4a\x09\x5d\x4f\x10\xe9\xd8\x93\xd0\xa9\x9b\x5b\xad\xd2\x20\x26\x74\x9e\xb3\x1d\x4b\x09\x22\x0d\x5b\xc8\x34\xcd\x1e\x2c\x61\xa3\xde\xda\x8a\x05\x9c\x21\xc5\xc7\x7c\x8d\x9b\xa7\xda\x4b\x8b\x57\x28\x7b\x61\x2b\x5c\x0b\x37\xc2\x83\xf0\x18\x3c\x05\x3f\x82\x97\xe0\x57\xf0\x06\xbc\x05\x7f\x65\x71\x66\xb3\x34\x73\x99\xc7\x16\xb3\xe5\x6c\x95\xf0\x3f\x6e\x67\x67\xb1\xf3\xd8\x45\xec\x53\x6c\x37\xbb\x4e\xac\xad\xf8\x1c\xbb\x87\x3d\xc4\x1e\x61\x4f\xb0\x1f\xb2\x17\xd8\x4b\xec\x97\x22\x96\xc4\x45\xb2\x58\x1c\xe0\xd5\xde\x9a\x71\x85\xb6\x76\x5c\xe7\x23\x5f\x22\x17\xb9\x6e\x50\x8b\x13\x39\x31\xc2\x6e\xf1\x0e\x79\x85\x4b\x65\x0e\x7f\x62\x81\x45\xc9\x2e\xb5\xb0\x90\xcb\xab\x42\xc4\x0b\x5d\x0a\x28\x6f\xe7\xbd\x3c\x17\xf0\xe5\xd0\x69\x53\x1c\xbb\xbd\x94\x70\x6c\x2b\xca\x0a\x41\x4d\xd7\x24\xfd\xd2\x18\x0b\x24\x37\x94\xbc\xda\xda\xcf\xd0\x0f\xc8\x73\xf3\xc2\xb3\xe7\x51\x92\x43\x6b\xa9\x16\x97\x9f\x5e\xc3\xcd\x35\x5b\xd2\x0f\x6b\x71\x17\x6e\x1c\x6a\xab\x2d\x85\xe4\x21\xb1\x80\x93\xeb\x74\x11\xa6\x11\x8e\x43\xa7\xf6\x3a\x92\xe2\x84\x4e\x30\x2d\x10\xa7\x25\x92\x97\x17\x56\x11\xc5\x7a\x4b\x81\x95\xbe\x40\xe4\x40\x68\x75\x4f\xb8\x2b\xcb\xed\xb6\x08\x53\x15\x1c\x3b\x0c\x7c\x3b\xe9\xd8\x6e\xd9\x13\x82\xd8\x2d\x08\x59\xcc\xf5\xb9\x08\xe0\x08\x55\x2c\x79\x05\x2f\x61\xff\xad\x2d\xa9\xd9\x16\xae\xf8\x4a\x35\x21\x1f\x78\xe2\xa5\xa1\xda\x1a\x88\x9a\xb4\x15\xef\x3b\x39\x61\x59\x2c\x1a\x6d\x17\xef\x15\xd5\x62\x53\xb5\x95\x0f\x01\x59\xe4\x84\xae\x30\x67\x8e\x1f\xe6\x03\x24\x0e\xf8\x49\xbb\xb6\x66\x15\x85\x2f\x36\xe0\x46\x17\x6b\xeb\x58\xc5\xaa\x7b\xb2\x9d\x82\xcb\xde\x3a\xf9\xe6\xee\xdc\x62\x45\x49\x28\x86\xa2\x34\xc5\x95\x46\xb3\xe1\x05\x59\xe5\x07\xb5\x4f\x83\x2c\x37\x70\xc9\xa7\x6c\x59\x3f\xd0\xfd\xe4\xe0\x9c\xf4\x51\x86\x32\x53\x96\xb3\x8a\xac\x34\x24\xea\xb4\x9c\x92\xda\x62\xd5\x27\x64\x79\x95\xf1\x6a\xfd\x44\x42\x36\xf2\x32\x2b\x57\x7f\xda\xc0\x3e\xdd\xd1\xaa\x6c\x59\x7c\x53\xde\x58\x39\x27\xf7\x99\xa3\xa2\x56\xbd\x62\x36\xa7\x52\x2b\x27\x12\x4a\x7e\xde\xbc\x9b\xee\x91\xb0\xdb\xfb\x9f\xf6\xc6\x94\x52\x67\xa7\x0a\x72\x77\x34\x95\xcb\xda\x61\x7e\x65\x36\xa5\xd4\x35\x35\x14\xa2\xd9\x7a\xa7\x31\x53\x5d\x97\x57\x22\x9a\xac\xac\xec\x97\xeb\x33\xb1\x36\xa3\x5b\x51\x0c\xa5\xfb\x99\x9e\x54\xbc\xaf\xfa\x62\x7f\x54\xee\x9e\x50\x52\xf5\xdd\xb9\x42\xb7\xd7\x9f\x5f\xa9\x64\xeb\xf3\x8d\x99\xac\x37\x94\x93\xeb\x1b\x14\xb9\x3f\x55\x1f\x34\x74\xb3\x07\xc7\xe4\xa9\x87\x8d\x7c\x7d\xf4\xb7\xd9\x7f\x57\x8b\x0d\x79\xb9\xbf\xc1\x51\x7b\x3c\x25\xd2\x99\x57\x82\xfe\x21\x4a\xaa\xed\xa9\x20\x9b\x0a\xe2\x2d\xfd\x1d\x75\xfd\x3d\x4a\x34\xe5\x75\xcb\x72\x4e\x51\xb2\x72\xa6\x7a\xb4\xa2\x28\x33\xd9\x71\x59\xb9\x7a\x58\xab\xdb\xc0\x8e\x56\x52\x8a\x62\x25\xb2\x89\x44\x4a\xb1\x0c\x23\x51\x7f\x5b\x34\x7a\xb2\x25\x2b\xf5\x56\xc6\x48\x18\x41\x22\xa5\xea\xfd\xb2\x92\xca\x1a\x0d\x29\xab\xa1\x21\x35\x91\x4d\x24\x8c\xa1\x44\x2a\x9a\x1d\xca\x2b\x29\x65\xaf\x76\x03\xa6\xba\x9a\xb5\x66\x1c\x55\x53\x99\x99\x1a\xce\x6f\xbe\x15\x8f\x46\xc4\x7e\xc4\x35\xa9\x36\x53\xdb\xca\xb5\x70\xf5\xbd\x15\x2b\xe6\x1c\xb1\x73\x57\x5b\x0a\xdb\x38\xf1\x47\x73\x62\x44\x43\xbc\xb5\xff\xc7\x6c\xce\xbd\x1c\xb7\x1b\x4f\x4a\x21\xce\x2e\xd7\xe3\xc8\x49\xfd\xda\xc8\x81\xff\x0e\x67\x3f\xd7\x62\x06\x13\xbd\x7d\x78\xf6\x96\xae\x2b\x2e\x35\x59\xba\x9d\xad\xff\x30\xc1\x71\x99\xa8\x19\x35\x2d\x35\x61\xb6\x76\x1e\x39\x0f\x2b\x23\x23\x38\x82\x5d\xd8\x9c\x9a\x87\xb3\x11\xd9\xf0\xec\x7e\xac\xe0\x88\x89\x7d\xad\xda\x60\x0c\x11\x97\x20\x96\x4b\x87\x25\x50\xdb\x80\xcd\x5d\x6d\xd8\x3b\x43\x9b\x87\xa8\xcd\x36\x51\xeb\x4d\xcf\xc3\xce\x76\x5c\x91\x42\x4d\xab\x6b\x98\x8d\x15\x6d\x76\x4d\xe6\xcc\xd3\x46\xfa\x51\x3b\xc9\x4c\x2e\xd4\xcc\x36\xcc\x34\x70\xbb\xd2\x33\x4b\x8b\xf6\xa2\xb9\x02\x47\x9a\x47\xb4\xfe\xe4\x0c\xad\xd3\xe8\x3e\x2c\x31\xd2\xbc\x04\x19\x78\xad\xc5\xea\x13\x6d\xb3\x53\x43\xf9\xd4\xfc\x94\x1b\x6b\x1f\x69\x1b\x1d\xc5\x9e\x8e\xb6\xca\x48\x97\xd6\x8d\xed\xda\x40\x1b\x87\xf6\x53\x52\xcd\x98\x32\x2b\xfd\x5d\x9a\xa9\x55\xb4\x44\xb6\xad\xbb\x31\x29\xe3\x44\xbb\x39\x10\x4f\x74\x75\xcf\xd7\xda\x52\x6d\x6d\xd8\x65\x6a\x66\x2a\x1a\x35\xdb\xb4\x66\x4c\xa5\x52\xf5\x5e\x63\x22\xd5\xad\x99\x66\x4b\x37\x92\xda\xcc\x91\x33\x65\x46\xd2\xd8\xd6\x86\x22\x05\xa2\x66\x72\x78\x2c\x09\x5f\xe6\x45\xca\xa3\x30\x01\x67\xc2\x25\xb0\x5b\x20\xe5\x6d\x70\x3f\x3c\x0c\x8f\xc3\x37\xe0\x3b\xf0\x13\xf8\x57\x78\x1d\xde\x84\xff\x80\xff\x84\x0f\xe0\xa0\x78\x03\xb3\x91\x65\x59\x8e\xf5\xb3\xd9\x6c\x92\xcd\x17\xa8\xb9\x8d\xed\x60\x97\xb0\xcb\xd9\x8d\x22\x62\x73\x37\xfb\x32\x7b\x84\x7d\x8d\x7d\x83\x7d\x9b\x7d\x9f\xbd\xc0\x7e\x2e\x78\xfd\x7b\x62\x15\xbb\x1b\x90\x53\x0b\xb9\x58\x14\x21\x59\x49\x3a\xc2\x2b\x19\xd6\x82\xe9\x79\x8f\xc4\xff\x5d\xe3\x0a\xd8\xb0\xdd\x04\x52\xc1\x93\x22\x05\xaf\xe2\x87\xbe\x43\x89\x4a\x58\x71\x2c\x86\xe4\xe6\x83\x72\x84\x12\x8e\x9b\x08\xcb\x91\xa0\x1c\x26\x1d\xcb\xe1\x45\xf8\x21\x2f\x39\xb4\xfc\xd0\x4f\x3a\x95\xda\x52\xda\xb0\x92\x98\x7e\x47\xd2\x0b\x39\xc9\x56\x38\x91\x2d\x85\x05\x8e\x07\x5e\x5e\xb1\x4b\x76\x2d\x78\x1c\x94\x45\x44\x7d\xfa\xc5\xc1\x82\xab\x58\xb5\xd7\x0e\x6b\xaf\x57\x72\x40\xe1\xa8\xe2\x29\x62\x1d\x40\x6d\x69\x2d\x3f\x28\x89\xb5\xac\xae\x53\x09\xf2\x22\x94\xed\x87\x4e\xc9\xae\x04\x02\x92\x2d\x27\x2c\x38\x96\x08\x6b\x8b\xf0\x89\x53\xaa\x25\x73\x6b\x11\x96\x28\x73\x42\xaf\xe4\xf8\x61\x21\x10\xc1\x12\xb1\x5c\x56\x78\x14\x7d\xce\xe6\x39\xed\xb7\x2d\xc7\x12\x5a\x41\x08\x00\xa7\xe6\xfb\x23\x7b\x98\x25\x87\x99\x17\x24\x5b\x98\x5f\xf6\x82\xda\x7b\x41\xed\xd3\xaf\x7d\x8a\xc5\x68\x4a\x0b\x13\x02\x23\xf0\x0a\x8a\x9d\xac\x79\x22\xfd\x40\x38\x40\x85\x6b\x8d\x6b\x25\x41\xe8\x43\xf1\x22\x4f\xce\x4f\x3a\x76\x68\x39\x7e\xd8\x5e\xa3\xdd\xa1\x5f\x70\xc3\xc0\xc5\xd0\x71\x3d\xa7\xb6\x42\x42\x5c\xe2\x7a\x41\xe4\xf4\xc3\xe9\xb7\x42\x0b\x6e\xce\xb7\xc9\x0d\x72\xf6\x74\xd0\xc8\xe1\xbd\x14\x70\x4d\x12\x78\xd2\x3d\x7b\x54\x15\x15\xc4\xd8\x75\x3f\xcc\xb1\x59\x2c\xd7\xa8\x23\x9a\xf5\xa8\xdc\x88\x4a\xae\xe7\x9b\x0a\x16\xcf\x3a\xa2\x09\x11\xd3\xca\xb2\xf3\x92\x91\x53\x4e\xea\xce\xc4\xb4\x95\x3d\xad\xe7\xc5\x06\xee\xbf\x20\xea\x57\xdf\xde\x18\xaa\x3d\xcb\x16\xaf\xb6\x95\x63\x66\x9f\x39\x20\x7f\xfa\x95\xb8\xa2\x28\x69\x45\x2c\x4c\xfa\xe6\x22\x57\xbe\xe5\x57\x6f\xcd\x53\x3f\xb7\xe9\xce\x74\x55\x59\x3c\x1b\xd5\xc2\x88\x34\x1c\x4b\xeb\x32\x8d\xe7\x62\xe9\xfa\xaa\xa5\x2a\x23\x8b\xd9\x45\x69\x54\xd3\x6a\x32\x17\x73\x1a\xaa\xf8\xff\x63\xea\x4d\xe0\xdc\xb8\xaa\x74\xf1\xba\x6a\xdf\x73\x4a\xaa\x45\x2a\xd5\xa6\xad\xb5\x54\x49\x55\x6a\xa9\xd5\x8b\x4a\xa5\xea\xd5\xee\xd5\x7b\xdb\xee\x78\x8b\xed\xc4\x76\x12\xdb\x09\x89\xe3\xec\x09\xd9\x48\x42\x36\x02\x09\x4b\x98\x40\x42\x20\x43\x78\x99\x10\x18\xf6\x21\x81\x79\x8f\x79\xc3\xf0\x18\xe0\x41\x06\x18\xc2\x10\xf6\x9d\x19\x08\x81\x21\xe4\x31\x7f\xc0\x6e\xf1\xff\xd5\x2d\x39\x19\xc7\xdd\x92\x4a\x2a\xa9\x54\x71\x9d\xfb\x9d\x73\xbe\xef\x3b\x79\x97\xce\xcc\x93\xcb\x53\x86\xde\x35\xf2\x46\xaa\x77\x89\x2e\x2c\x8c\xd3\x8a\x30\x4e\x2e\x4c\xa5\x12\x42\x21\x91\x32\x04\xe8\x7d\xb4\x0b\xf4\x47\x8a\x9e\x00\xa1\xf7\xdd\x42\x4a\xfc\x5d\xca\x48\xf5\x7e\x4c\xe1\xab\x82\x60\x08\x14\xca\x42\x4a\x10\x14\xa7\xdb\x54\x94\xb8\x04\x29\x63\x7b\x0a\x84\xef\x0a\xc2\x25\xe9\x8e\xb2\x00\x06\xa5\x8a\x52\x9e\x77\xb6\x83\x50\x0e\x60\xea\x52\xba\x09\x2e\x49\xc1\x57\x13\x97\xbc\x56\x48\x6c\xcf\x1e\x0b\xe8\xc5\x85\x1b\x9a\xa7\xee\xe8\xbd\xb0\x30\x23\x4c\x03\x39\xef\xb5\xa9\x44\xd3\x48\x5d\x3c\xd7\xdb\x27\xe4\x53\x4d\x28\xc0\xf0\xe5\x00\x03\x4d\x81\xe7\x0d\x85\x56\x28\x28\xb4\xf7\x0b\x3a\x4d\x8c\xed\x54\x58\x0b\x00\x62\xbf\xd0\x05\x60\x35\x48\xfd\x01\x41\xd8\x24\x08\xab\x20\xa4\xd6\x4c\x4a\xaf\x1e\x17\xcb\x7a\x59\x49\x75\xc7\xbb\x82\x81\x5a\xec\xff\xd2\x04\xac\x29\x4d\x45\x18\x5f\xd0\x45\x5a\x16\x28\x50\x41\xc8\xd3\xa7\x8b\xd3\x82\x90\x09\xb1\xe7\x8c\xf4\xf9\xde\x97\xa7\x9f\xfa\x7e\xc2\x01\x98\x07\x80\x05\x48\x3f\x04\xc1\x68\xcd\x84\xcc\x90\x28\xf6\xee\xd3\x8c\xe4\x85\x31\x91\xfc\xf0\x0b\xe6\x26\xb8\x0f\x7a\xdf\xfa\xde\x37\x66\x16\xcc\xde\xeb\xdf\x70\x4d\xf5\x1e\xf2\x0f\xe9\xb5\xf7\x1e\xec\x0d\x42\x91\x3c\x2a\x9a\x52\x62\x7d\xfa\x38\xbc\xf2\x27\x0d\x37\xcc\xa4\xe4\x5b\xee\xbe\x6e\xc9\xfc\xc1\x3b\x89\x01\xa3\xc5\xa0\x23\x48\x9b\xa0\x08\x33\x50\x04\x2b\x57\x5c\xd8\x91\xd3\x95\x85\x0c\xa4\x45\x11\xe4\x6d\x62\xa9\x06\xd5\x4c\xb5\x98\x2e\x8a\xd5\x22\x0c\x8d\xd6\x68\x25\x59\x14\xa1\xe4\x8b\x85\xe1\x62\xa3\x98\xcc\x0f\xda\x55\x80\xea\x60\x57\x9c\x1f\x14\x0b\xb5\x69\xb1\x98\xc9\xc7\x06\xd3\x0d\x31\x93\x06\x28\x76\xd3\x90\x11\x33\xc5\x8c\x58\xcc\x64\x4c\x9a\x4e\x9b\x83\x20\x8a\x8a\xa2\x54\xc5\x8c\x02\x83\xc5\x6a\xb1\x5a\xdd\x31\x64\x8f\x55\xab\x62\xe6\xa8\x60\x5e\x05\x2b\x27\xab\x02\xb4\xd6\xa7\x41\x14\x1b\x0d\x28\x99\xfa\x70\x1a\xaa\x99\xcd\x2b\x3b\xe8\x6e\x31\x23\xde\xb9\x07\xe4\x2b\xed\xe4\x85\xf0\x78\x06\x3e\x5a\xb7\x8b\xd3\xd0\x18\xf2\xa1\xb4\x02\x23\xeb\x1e\x87\x34\x74\x01\x6e\x1d\xc7\xb4\x55\x02\xb1\xea\x25\xc5\x85\x74\x69\x04\x32\xa2\x29\x86\x87\x62\x68\x61\xac\x9f\x9f\x48\xc2\x58\x72\x9b\xb8\x23\x0c\xff\x45\x10\xe3\xc9\x10\x66\x8b\x22\xa4\x45\xc8\x84\xd1\x3b\x3d\x56\x0c\x4f\xf6\xb4\x38\x0f\x45\x3b\x5c\xbe\xa6\x45\x5f\x84\x98\x0e\xc5\xa8\x84\x6b\xbf\x8a\x5b\x5f\xa4\x4f\x72\xcb\xdc\x05\xdc\x29\xee\x5a\xee\x26\xee\x3e\xee\xad\xdc\xdf\x70\x4f\x71\x1f\xe2\x3e\xce\x7d\x8a\xfb\x3f\xdc\xff\xe5\xfe\x85\xfb\x57\xee\x5b\xdc\x77\xb9\x1f\x72\x3f\xe5\xfe\x9d\x7b\x81\xfb\x2d\xf7\x32\xf7\x27\xee\x2f\x04\xc9\x20\xb1\xc9\x30\x69\x93\x80\xcc\x92\x65\xa6\x44\xd8\x43\x0e\x92\x0b\xc9\x09\x8e\x53\x43\xd4\x6a\x78\x26\xea\x86\x12\x22\xaa\xf0\x52\xd5\x03\x93\x55\x2f\x8c\x12\xd1\xed\x08\xbc\x6a\x36\xe8\x11\x75\x37\x62\xf1\xa2\x4f\x35\xdb\xb1\x2d\x25\x36\xe0\xb9\x7e\xa7\x44\xd0\x44\x5d\xb5\x8d\x41\xe2\xa1\xe6\x55\x6b\x1d\xdb\xa5\x8e\xdf\x19\x70\x66\x89\xc9\xba\x3a\x21\xb6\xb4\x03\xc6\xbe\xd5\x9d\x41\x62\x98\x5e\x87\x49\x0b\x6c\xd7\x0e\xe3\x59\x08\x54\xcf\x32\x7b\x22\xbd\xc1\xd9\x1b\xd3\x67\x45\x7a\x93\xea\x66\x54\x7f\x08\xe3\x49\xe7\xac\xf2\x92\x75\x6b\x18\xc4\xeb\xa0\xee\xb9\x54\x33\x83\x3e\xf5\xf5\xd5\x92\x41\xd0\x6f\x49\x04\x7d\xde\x6d\x07\x4d\x26\xf7\xd4\xcd\xc0\xf1\xbd\xbe\x84\x92\x46\xd1\x93\x55\x56\x22\x9e\x70\xc0\x04\xf8\x4c\xa1\xd9\x8e\x82\x2a\x44\x1c\xdd\x10\x15\xbb\x68\x06\x7e\x9f\xb4\xeb\x3b\x36\xe3\x0f\x61\xa4\x98\x8a\x70\xe5\x59\xe2\x6e\x10\xc2\x66\x2f\x78\x93\x20\x23\xdd\x2c\x09\x90\xa7\xd4\x8c\x53\xfa\xde\x2f\x50\xd8\x70\x41\x2e\x3f\x70\x11\xcd\x0b\x02\xcc\x5d\x90\x13\xf2\x94\x96\x21\xd7\xcd\x97\xaf\xeb\xfd\x39\xb1\x3e\x33\x96\xd7\x29\x9d\xa6\x34\x41\xc7\x68\x42\xa0\x3a\x79\x88\x6c\xca\xeb\x6b\x4f\x94\xb7\x25\xa6\x29\xdd\x45\x31\x4e\x97\x69\xca\x99\xee\x14\xe8\xde\x39\x9d\x2e\xc3\x9c\x31\xad\x2f\x0b\xdb\xe6\x28\xf5\x7d\x4a\x9b\xd3\x14\xe6\x62\xcf\xa7\xe8\x5a\x67\xac\xd1\xa8\x91\xd1\xa6\x40\xc7\x9a\x42\xae\x51\x4b\x8d\xa5\x84\xd8\xdb\x9a\xb4\xd6\x7c\x49\x10\xc6\x04\xe1\x6f\x05\xa1\x2c\x08\xbd\xeb\x00\x9c\x44\x22\xf6\x52\x6a\xec\x99\xe5\xfc\x1c\xed\xa6\x9a\x82\x58\x2d\x5b\x72\xef\x85\x1d\x56\x6a\xb9\xde\x72\x92\xc3\x74\x63\x2d\x0f\x63\xf0\xa8\x41\x69\xae\xf7\x16\x65\x2a\x4f\xe7\x9a\x47\x53\xcd\xc6\x54\xca\x2f\xcf\xdd\x3d\xe5\xcc\xbd\x4d\x6e\x37\x87\x4b\xce\x74\x4e\x75\xdf\x31\x57\xcb\x0e\xef\x9a\xab\x2d\x5f\x36\x66\x4c\x53\x61\x9a\xd6\xb2\xc3\xb1\x9f\x08\x54\xa0\x4f\x0e\xc3\xb1\x1a\xc0\xc7\x7a\x8f\x39\x59\x78\x49\x56\x21\x0d\x59\x10\xb1\x78\x04\xa4\x92\x0a\xa5\xe5\x66\x3c\xf1\x4a\xe8\x10\xa1\xa6\x5e\x49\x56\x89\x11\x7b\x2d\xb4\x4b\x13\xed\xda\x32\xc0\x99\x77\xe6\xb7\x88\x6a\x2d\xdb\xbe\x08\x37\x80\xf4\x7c\xec\xc4\xea\x7d\xd9\x6c\x0d\x41\xbd\x20\x09\xe5\x6c\xad\x84\xb3\x38\x5d\xa8\x95\xb7\xb6\x87\x31\xf0\x6a\xdb\x1a\x2d\x55\x92\xce\xf3\xf6\xc3\xe8\xb4\xa4\xba\x31\x6f\x11\x60\x02\x17\x73\x20\x39\x38\xd1\xfc\x22\x2c\x2d\x65\xdf\x32\x39\xbe\x75\xbc\x5d\x4a\xdb\x43\x13\x42\x65\xc5\x5c\x1d\x16\x61\x58\xc8\x35\x9d\x6c\x73\xb5\x56\x82\x4a\x45\x14\xd5\x6d\x99\xf1\x9a\xd8\x86\x92\x0a\x18\x25\xca\xa2\x54\xca\x42\xd1\xdc\x26\x9d\x0b\x30\x89\xf5\x94\xd4\x94\x60\x12\xb2\xab\x4b\xa8\xb6\xa1\x0d\xeb\x95\x18\x40\x2d\x87\x50\xcb\xa6\x4b\x6d\x48\x8c\xa8\x20\x41\x7b\xbd\x27\xc0\x04\x2c\x01\x24\x46\x40\x9a\xc0\xf5\xeb\xcb\x45\xc0\x25\x18\x2a\xe0\x56\x58\x82\x25\x09\xb6\xc1\x32\x0e\xe5\x41\x92\x38\x8e\xf3\x98\x19\xde\x67\xe8\xd3\xdc\x05\xdc\xa7\xb9\x7f\xe6\xfe\x95\xfb\x37\xee\x3b\xdc\x0f\xb8\x9f\x73\xff\xc1\xfd\x9a\xfb\x3d\x89\x11\x9e\x88\x44\x25\x63\xa4\x43\x26\x19\x63\x66\x07\xd9\xc3\x14\x00\x6f\x22\x6f\x27\xef\x22\x8f\x93\x27\xc9\x07\xc9\xc7\xc8\x57\xc9\x37\xc8\xf3\xe4\x87\xe4\xa7\xac\xd7\xfc\x47\xf2\x97\x18\xc6\x94\x58\x36\x56\x8f\xb5\x62\xed\xd8\x44\x6c\x2e\xb6\x25\xb6\x12\x5b\x65\x19\x6c\x78\x29\xf6\xaf\xf9\x88\x2d\xe7\x31\x1b\x06\x2d\xea\xb4\xa6\x4b\x24\x5c\xe5\x4d\x0d\x7d\xd0\x99\xbd\x9c\x1f\xf3\x6d\x08\x33\x2b\xdd\x8e\x24\x4a\x69\xd5\x44\x13\xfd\xb6\xef\xf8\xb1\x81\xee\x34\x31\xcc\x30\xdb\xd3\xc3\x9b\xae\xda\x21\x96\x4b\xfc\xf0\xe2\xd3\xa1\x19\x5e\xbe\x46\xdf\x75\x23\x0c\x40\xec\x91\xd6\x6f\x47\x1b\x66\xe0\xf9\x4e\xa4\x0c\xf0\x3d\x33\x08\xf7\xf7\x98\x4d\x5a\xdb\xb4\x0d\x35\x1d\x3e\x1d\x1b\x88\xb9\xb6\xa5\xc7\x10\x08\x2b\x22\xf6\x55\x43\x34\xca\x11\xd9\x55\x89\x7d\xa5\x50\x98\x92\x56\xa2\xe8\x52\x0b\x63\x9b\x6e\xd7\x22\xf0\xa7\x1b\x9e\x6e\xbb\xfd\x28\xd2\x19\x25\x54\x47\xd7\x0f\x68\x24\x33\x32\x4c\xdf\x35\x99\x5d\x85\xd6\x3f\x0b\x36\x6b\x5e\x7a\x67\x91\x5e\x3f\x9e\x04\x67\x53\x67\x9f\xf1\x27\x43\x88\xa7\x87\x49\xaf\xd9\xf5\x5c\xa0\x7a\xe4\x77\x11\x85\x32\xbd\x7f\xcf\x44\xbb\xd3\x7f\xcc\xde\xd2\x37\xbd\x01\xab\x86\x46\x5f\x1b\x69\x5b\x54\x2b\x11\x2f\xfc\x36\xed\x30\x46\x59\x0c\x1b\x8e\x92\x8a\xde\x6f\x36\x9f\xf5\xf7\x08\xd1\x9f\xd5\x6f\xdb\xea\xa6\x8b\x8c\x80\xc9\xc0\xaa\x15\xa5\xc5\x5a\x7f\x07\x3f\x60\x8f\x2b\xba\x11\x95\x72\x3b\xb5\xfe\xa7\x47\xa7\xcc\x88\x6e\xd8\x23\x9f\xea\x25\x12\x78\x9a\xe7\x77\x2a\xfd\x66\x2c\xd5\x6c\xd3\x8e\xc8\x3f\xac\x60\x10\xd5\x15\x74\xd3\xab\x69\xb6\x19\x74\x5c\x43\x77\x6d\xa6\xb8\x68\xeb\x86\x17\x46\xfe\xf0\x04\x7a\xba\x3d\xf0\xe8\xed\x65\x98\x9a\xcc\xa9\x2a\x20\x86\x3f\x80\x65\x11\x57\xa6\x00\x46\x8b\xea\xc5\xc3\xa3\xc2\xf6\x8a\xfa\x61\x2c\xdf\x3b\x87\x52\x6b\xe3\xe2\xaf\xb3\xb8\x52\x46\x94\xfe\x45\x5d\x59\xf1\xb2\xb9\xce\xe8\xd6\xc6\x80\x24\x5e\x72\xdf\xa5\xfb\x3e\xde\xfb\x53\xfd\x4d\xbd\x47\x54\x90\xd2\x32\x4a\x40\x44\x94\x40\x0d\xd7\xca\xfe\x7d\x59\x00\xb5\xd5\xca\x6e\x5e\x2f\x85\x9b\x5a\xf8\xe7\x93\x07\xf1\xf2\xc6\x7d\xa9\xc1\xc1\x38\x48\xe5\x13\xae\xd7\xba\xe9\x68\x3d\x03\x9d\x0f\x1f\x50\xc8\x13\x71\x01\x0f\xee\x16\xe7\x0f\x9e\x39\x57\x99\x29\x4f\x62\x65\xe3\x4d\x18\x1e\xd8\x3a\x7d\xd2\x3d\x7d\x83\x84\x20\xad\xab\x5f\x70\x50\x29\x60\xf6\xe8\x14\x0e\xaf\xa8\x67\xa8\x04\x30\xb0\x03\x55\xc9\x4c\xaa\xcf\xcd\x63\xab\x05\x2a\xe6\xa4\x39\x75\x4e\x6a\x79\xe0\xc4\xc7\x26\x25\xe8\x3d\x82\x15\xb5\xbc\xd6\x6c\x61\x2b\xf6\x11\xa9\x25\x59\x6b\x73\x73\x18\xdb\x31\x1c\x13\x1c\x75\xed\xea\x49\x68\xcd\x81\xe7\xb5\x36\xc2\xd4\x26\x04\x6f\x65\x6e\xa3\xaa\x22\x4c\xa9\xb1\x1d\x98\x49\x4a\xae\xe3\x48\x39\x10\xc8\x6b\x3b\x65\xd8\xdd\x3b\x22\x49\xe5\xb2\xa0\x4b\x2a\x68\x1a\x90\x8f\xac\x9c\xbe\x41\x92\xd6\x2d\xec\x5e\xfb\x0e\x64\x21\x35\x20\xa1\x56\x46\xd4\x40\x52\xb1\x2c\x49\xea\x54\x72\x5d\x6c\x5e\x92\x2e\x3f\x78\xfa\x98\x24\x01\xc4\xe6\x01\x62\x1a\xdd\x31\xb9\xf1\xf4\xff\x9e\x6f\x6d\x9c\x1b\xf8\x43\xbe\xbd\xe9\x8c\xb0\x69\x6e\x9d\xae\x02\x4a\xe2\xe9\x4f\x4f\x81\x37\xf0\x07\xc7\x81\x8e\x73\xd0\xc9\xa1\xe3\xce\x4d\xfe\x0b\x9c\xc0\x33\x19\x69\x4a\x7d\xc0\x9b\x2b\xcf\xad\x6c\x3a\xaa\x5a\xe9\x72\x6e\xdd\x7f\x4a\xdf\x05\xa0\x4f\xd7\xf4\x94\x30\x5c\x83\x74\x56\x04\xf1\x35\x52\x16\xa0\x5d\x04\xb1\xda\x9b\xfc\x15\x00\x7c\x25\x23\x89\xc0\xa7\x52\xda\x44\x10\x7b\xd7\xd4\x91\x6f\x56\xaf\x03\xb5\xa8\x3e\xf0\x42\x1a\x7a\x57\xf4\xbe\x06\xe9\x7d\x25\x51\xf2\x56\xc8\xf3\xb1\x9f\x15\xa7\xf4\x54\x32\x8d\x17\xdd\xf4\xe5\x2b\x1e\x8c\xa5\x87\xcf\xfc\xe4\xcb\xe4\xd7\x00\x4d\x51\x1c\x97\x20\xbd\x15\xd2\x6a\x0d\x32\x4d\xbc\xa9\x54\x2a\xaa\x4d\x80\x3b\x00\x7e\x77\x07\xc2\x99\x58\xa1\xda\x54\xc3\x15\xa0\xfb\xf3\x53\x6f\xfe\xd9\x75\xbf\xca\x27\x16\xb5\xde\x77\x7b\x77\x7f\x43\x44\xb2\x23\x36\x4c\xf2\xc5\x66\xaf\xf2\xe4\x96\xd8\x77\x9b\xe9\xe4\xa6\xe2\x52\x13\xaa\xed\x00\x96\x20\x8b\x3b\xc5\x3b\x44\x55\xcd\x32\x90\x35\xaf\x97\x20\xa8\x89\x62\xb5\x5d\x02\x6f\x1a\x66\xda\x8b\xfb\x40\x6c\x6f\x09\xc6\xab\xb0\xb3\xa4\x6e\x85\xbe\x36\x37\x9d\x6d\xad\x13\xd7\xab\xc3\x63\x50\x6b\xd9\x22\xa8\x99\x62\x29\x2d\xce\xd6\xa4\xd9\x12\xec\xee\x34\x33\xa0\x06\x6a\x90\xcd\xd4\xc4\x74\x55\x85\xda\x78\x76\xa6\x0a\x85\x39\x10\x1d\x61\x3c\x3b\x0b\xcd\xec\x22\x34\xd5\x2d\x30\x2e\x29\xcb\xd0\x14\xb7\x42\x50\xdd\x0a\xe9\x12\xb4\x16\xc4\x00\x1a\x13\x6a\x29\x0b\x40\x8e\x05\xd9\xd6\xba\xec\xf8\xd6\xf1\x5a\xb3\x34\x99\x2a\x41\xd0\x9c\xad\x35\xd3\x6a\x50\x6a\x36\xb3\xa0\xce\x42\xa5\x00\x19\xf0\xc6\xa4\xda\xb8\x54\x83\x6c\xb6\x88\x59\x80\x92\x98\x29\x89\x90\x2e\x89\x2a\x88\x0f\x94\xda\x22\x94\x37\xc3\x9c\x55\x13\x11\x6a\xa2\xe4\xcc\xc0\x64\xd9\x1b\x9a\xce\xc3\xd8\x24\xd4\x44\xab\x23\x5e\x6a\x37\xe1\x6a\x1d\x0e\xb6\xb6\xe0\x96\x26\x4c\x7b\x38\x21\xce\x22\x66\x21\xe8\xb6\x01\x36\xe9\x25\xb1\xd9\x04\x98\x54\xa0\x94\xd9\x09\xe3\x90\xd2\x01\x96\xb6\xaa\x5b\xa0\x54\xac\xeb\xc1\x16\x71\x8b\x28\x66\xab\x99\xf1\x34\x80\x18\xae\x3d\x0c\x74\xd2\x3a\xfd\x2c\xb7\x9d\xbb\x97\xfb\x26\xf7\x6d\xd6\xc9\xfb\x35\xf7\x9f\x8c\xaf\x29\x91\x34\xc9\x92\x32\x71\x49\x8b\xad\x3d\x5b\xd8\xca\x73\x2e\xb9\x84\x5c\x4f\x6e\x26\xaf\x27\x6f\x20\xef\x26\x8f\x93\xf7\xf7\x7d\x3c\xfe\x9e\xfc\x23\x63\x69\x7a\xed\xa8\x4d\xa7\xa7\x55\x8d\x91\x35\xc3\x25\xc6\xf2\xd1\x72\x2d\x97\x23\xb6\xde\xce\x93\xc0\x0b\x81\xa6\xa9\x5b\xe8\xfa\x61\x20\x76\x03\x77\x80\xc9\xbb\xba\x9e\x61\x62\x88\x19\x05\xd2\x71\xbb\xa6\xa6\x1a\x26\xea\x26\x73\xd0\xe4\xdc\x01\x17\xf4\x88\x5b\x14\x2e\x23\xac\x72\xa9\xdb\x7a\x5a\x37\x63\x8a\xe5\x06\x6e\x27\x30\xe2\xc4\x0b\x1c\x81\x38\x61\xde\xca\x22\xfe\x59\x70\xc9\x90\x2f\x2b\x2b\x18\x61\x88\x67\xdc\x12\x5b\x7b\x85\x2c\x14\x06\x61\xd7\x0e\x1c\x37\x70\xec\xf0\x6f\x5f\x51\xc5\xcc\x2b\xd0\x72\xc3\x57\xb3\x4e\x16\x7a\x86\x5e\x8b\x78\x3d\x61\xae\x1f\x69\x53\xd1\x76\xdc\x48\x01\x1b\x3d\xd6\x6d\xa7\x2f\x00\xe8\xd0\x28\x7a\xb3\xfb\xb5\xb3\xeb\xd2\xab\x37\x9d\x5a\xbf\xe5\x16\x06\xe4\x5a\xff\x58\xed\x57\x62\xf1\xd9\x67\x9c\xf0\x6e\x2d\x5c\xa0\x3a\x76\xb8\x91\x1d\x1f\x35\xed\xbe\x98\x2d\xe2\xc7\x9b\x7e\x54\x0c\xf5\x3b\x35\xcd\x0e\x23\xb6\xde\xd6\x3d\xdd\x8b\x78\x3c\xac\xfa\xea\xd8\x8c\x27\xca\xca\x14\x8e\xa7\x9b\x7e\x8d\x29\xb4\x0c\xdd\x63\x21\xbe\x44\xbc\x40\xc3\x81\x8d\x1b\x00\x46\x67\xee\x03\x00\xbc\xc1\x29\x65\x9d\x89\x52\x5b\xaa\x89\xe5\xb6\xda\xfb\x44\xef\x31\x48\xa6\x26\x10\x40\xc5\x7d\x79\x98\x4c\xa7\xf7\x03\xac\x02\x80\xba\x75\xa3\x5b\x05\xf2\xe7\xff\xa4\x78\xce\xf9\x52\xca\xdf\x56\x9b\xc4\x6c\xa2\xa2\x0a\xb7\xf5\x9e\xb9\xfb\x27\xb5\x0d\xe1\x7b\x21\xa6\x45\x51\x54\xa5\xd5\xe5\x63\xfc\x3a\x11\x86\xf7\x91\x1b\xc9\x5b\xef\xc4\x72\xf3\xae\xd1\x78\xe9\x4a\x63\x48\x52\x37\x48\x38\xa1\xa2\x5a\x5e\x12\xcf\x15\x2a\x00\xb8\x4d\xda\x00\xdb\x26\x56\x97\xb7\x49\x20\x22\x96\x45\xd0\x04\x88\xa7\x60\x15\x26\x41\x05\x74\x20\x3d\x77\x4e\x36\x2b\xe1\xaa\x94\xc5\x89\x33\x63\xd9\xac\x28\x89\x98\xc6\x0d\x13\x00\x19\x4d\x19\xc9\xc2\xf0\x04\x0c\xc3\x06\x18\x38\xb9\xff\x74\x6f\x03\x0c\xdc\xb8\x5e\x3d\xfd\xd2\xa4\x3a\xf0\xba\x55\x3c\xfd\x0b\x48\x76\x37\x6c\x18\x78\xdd\x36\xc4\xf5\xb0\x0a\xeb\xcf\x0c\x6d\x18\xde\xa0\x0e\xbc\x69\xdb\x19\xa1\x2d\xa5\x9b\x22\xb4\x07\x3e\x2e\x8a\xfb\x61\x55\x9a\x30\x3b\x6d\xf9\xcc\x12\x38\x30\x70\x3c\xdd\x2c\x9f\x7e\xaf\x2a\x82\x2a\x89\x90\x1d\x49\x95\x26\xd4\x81\x1f\xb4\xb3\x72\xf5\xcc\xde\xb6\x2a\x8d\xc8\xe5\xd8\x6f\x87\xb3\x13\xd9\xe1\x52\x7b\x83\x04\xc3\x00\xd9\x1a\xfd\x2c\xc0\xae\x0b\x01\xc4\xb5\x6b\x7b\xbf\x3c\xf0\x51\x35\x0d\x28\x40\x3a\x0d\xcd\x80\xdc\x4d\x6e\xc2\xde\xeb\x7a\x2b\x00\x28\x42\x26\xcb\xfa\x2f\x78\x6d\xba\x36\x70\x0d\x02\xcc\x9e\x19\x9f\xcd\xc2\xda\xeb\x7f\xd7\x20\xef\x27\x5f\xd8\x52\xab\xcd\xee\xec\x3d\xfe\x87\xe7\x01\xee\xcd\x1b\x9f\x20\x87\xbf\x45\xdc\xa6\x94\x09\x77\x04\xb8\xf9\xaf\x45\x90\x32\x6b\xc5\x1d\x69\x72\x80\x7c\xf9\x54\x36\xab\x25\xde\xdb\xbb\xab\xd7\x51\x8f\x93\x0f\xc6\x8c\x0f\x81\x0a\xd7\x82\x08\x2d\x3b\x8d\x6d\xac\xe2\x96\xad\xe2\xe0\x06\x18\xaa\x40\xb0\xa8\xc2\xfa\xdc\x5e\x08\xc4\xf4\x45\xb0\x04\xcd\xf5\x62\x2d\xfd\x91\x14\xde\xae\x6e\x01\xcc\xcc\x56\x33\xb5\x30\xb0\x6d\xd9\x92\x85\xec\xbb\x76\xe2\x6c\xab\x10\x48\xf9\x64\x5a\x2c\x0c\x64\xb3\xa2\x08\xea\x22\x8c\xc4\xc7\x83\xcc\xce\x9c\x24\xed\xab\x2d\x41\x53\x6a\xae\x17\xc5\x3b\xdd\xf9\x39\xec\x62\x69\x83\x59\xb2\xf2\xe2\xfa\x6a\x5a\x0c\x4a\x52\xab\xa0\xa2\xa9\x35\x8d\x15\x38\x3c\x54\x54\x67\x61\xbe\xa0\x16\xbc\xea\x84\xb4\xd0\x06\x08\x16\x27\xc4\xd2\x6d\x4e\x69\xa2\x21\xd5\xb2\x30\x32\x02\x4b\xd2\x86\xa1\x62\xad\xb8\x1e\xb2\x93\x83\x99\x12\xc0\x7c\xbe\xb6\x78\x20\x99\x2e\x77\x6b\xd9\xba\x7b\x0a\x9a\x60\xca\xa5\xbc\xa1\xe6\x0b\x22\x56\x9b\x98\x16\x03\x11\x60\x8b\x38\x2e\xee\xc2\x71\x30\x35\x80\x59\x31\x80\x12\x16\x9b\x4d\x48\xe9\xcd\x0c\x48\x55\x44\x09\xb8\xbe\xce\x68\xdd\x7a\xfa\x79\xae\xc9\x2d\x72\x9b\xb8\x6d\xdc\x4e\x6e\x37\x77\x92\xbb\x86\xbb\x91\xbb\x9d\xbb\x8f\x7b\x80\x39\xe4\x7f\x8c\xfb\x24\x73\xe6\xf8\x67\xe6\xb7\xff\x1c\xf7\x3c\xf7\x7d\xee\xc7\xdc\xcf\xb9\x5f\x72\x2f\x72\xbf\xe3\xfe\x1f\xf7\x27\x6e\x8d\x70\x64\x1d\x49\x90\x24\x31\x58\x9e\xdd\x60\x8a\xff\x19\x32\x47\x36\x92\xad\x64\x27\xd9\xcd\xfc\x8b\x4c\x43\x65\x61\x09\x4d\x1d\x4b\x44\x37\x75\xb4\x4d\x34\x81\xc9\x82\xad\xd1\x58\xe0\x3b\xb3\xa4\xb3\x81\x74\xd1\x03\x04\x3d\xa5\x1a\x5e\x3b\xe8\x06\xae\xdf\x0d\x52\xcc\x30\x76\x9a\xf4\x39\x7e\xd1\x4f\x93\xb4\xcd\x80\x59\x22\xe9\x31\x5b\x4b\x92\x30\x88\xc6\x66\x49\x27\x60\xbe\x40\x01\x93\xb5\x78\x81\xcb\xa8\xd7\xbe\x83\x60\x9b\x6d\xdf\x64\xf5\x4d\x27\x04\x98\x90\x24\x9a\x19\xf8\x8e\x3f\x60\xa2\x9d\x2e\x11\xaf\xad\x76\x98\xec\x88\x89\x9f\x60\x80\x91\xef\x6c\xc6\x44\x67\x8c\x70\xb3\x13\x44\x05\xbe\xb3\x6c\xb9\x88\x2a\x1e\x66\x08\xb5\x3e\x83\x6f\x90\x30\xfe\xb8\xdb\x27\x25\xba\x8c\x6a\x1f\x82\x6f\x3b\x22\x29\x9e\x25\x90\x33\x2e\x39\xeb\xf0\x47\x9c\x73\xb7\xff\x84\xd9\x0d\x2c\x56\x04\x0d\x1c\x34\xbb\x8c\xe9\xd0\xf1\x4c\x17\xa8\xe9\x3b\x66\x94\x58\x33\x37\x90\xa8\x30\xea\x90\x17\x97\x7e\xf7\x4e\xaf\x2d\x33\xf5\x0d\xa3\x24\x6b\x58\xdb\x31\x7c\xeb\xd5\x9f\xf8\xe4\x9b\x57\x31\xff\xbe\x23\x7b\x2e\x94\xb7\x55\xce\x7d\xf4\x89\x2f\x5d\xf9\xa1\xc1\x2c\x4a\xf8\x0f\xbb\xbe\xf2\x86\x91\xad\x92\x64\x49\xd2\xa2\x2c\xdf\x3e\x36\xd6\xbd\xf1\x21\x9c\x45\xf4\x6a\x6f\xce\xbf\xf6\x68\xe6\xe0\x4d\x37\x6d\xbd\xb1\x9b\xb7\xbc\xda\x62\x57\x92\x67\x8f\xcc\x20\x6a\x0b\xcf\xca\xda\xac\x26\x5b\xf9\x6d\xdd\xae\x3f\x9a\x1f\xcb\xc9\x52\x5d\xab\x0f\xc9\x88\x27\x1e\x1f\xab\x5f\x36\xa4\x23\x66\x6e\x5d\xb4\x7e\x31\xf4\x32\xe2\x9f\xa5\xba\x6c\xc5\x3e\xa0\x49\x6b\x3e\xa6\x53\x52\xbe\x22\x69\x98\xef\xfd\x50\x92\x88\x9e\x1f\x20\x92\x74\xe6\xe7\x20\xf7\x9e\x97\x24\x62\x21\xf6\xfe\x22\xcb\x03\xff\x4f\x66\x46\x32\x28\x59\x78\x8d\xf4\x3e\x49\x1a\x63\x5f\x83\xd9\x3b\xb1\xc6\x84\x85\x79\x39\x6f\xe1\x10\x4a\xa3\xdd\x51\x59\x92\xf2\x38\x9a\xef\xe6\xcd\x2b\x67\x64\xad\xbb\x3a\x2a\x6b\xdd\x7c\xef\xa3\x8b\x8d\x33\x95\xee\x60\xfa\xcf\xce\x64\xfd\x70\x37\x6f\xdd\x3e\x3b\x6a\xd0\xcf\xbf\x3c\xd5\xfb\xd2\xbd\x8e\xc3\xf8\xcb\x1f\x2e\x03\x60\x59\x6d\xbd\x61\xdb\x48\x46\xe0\x9f\xfd\xcd\x77\x10\x36\x3e\x39\xf7\xe0\x4f\x0e\xb4\xde\x3e\xb4\xeb\x91\x77\xfd\x85\xeb\xfd\xf6\xe5\xbf\x9b\xfd\x28\x82\x7c\x35\xf9\xb7\xf7\x5c\x33\x27\x31\xa2\xb5\xf4\x05\x78\xee\x7e\x29\x07\xd0\xbb\x7c\xfb\x3c\xdc\xf8\x00\xd1\x1e\x6e\x7d\xf8\x91\xdd\x53\xb0\x1b\x56\x40\xda\x24\xad\xc0\x0a\x00\x6c\xc2\xec\xee\xac\x84\x07\xa4\x91\x4c\xa3\x3a\xa9\xae\x48\xb9\xac\x93\x53\x71\x44\xe9\x9d\x3a\x08\xbd\xe7\x8e\xe7\xc8\xc6\xa5\x9d\xe0\x91\x1b\x11\x71\xea\xe4\xf5\x44\x17\x25\xd7\x2b\x4f\x49\x2a\x66\x5b\x43\xeb\x8a\xc9\xd6\x8a\x3a\xe5\x7a\x65\x35\xe7\x65\xbd\x30\x2d\x70\xb2\x92\x34\x5c\x2e\x7b\x92\x34\xa5\x4a\x28\xb6\x72\x92\x24\xa9\x92\xd7\x6a\x49\xaa\x24\x95\xb3\x8e\x3a\xa9\x96\xcb\xe5\xb2\x5a\x56\x5b\x65\x49\x2d\x97\x1d\x75\xce\x69\xcd\x4d\x0d\x0c\x4e\xb9\xa5\xb9\xf2\xb0\x37\x97\x83\xb9\xc9\x29\x15\xe6\x12\x03\x1e\xb4\x72\x62\x4b\x6a\xa3\x34\x39\x29\x7a\x60\x29\xe0\x79\xdc\x10\xbb\xde\xeb\xf4\x33\xdc\x10\xb7\x9e\xdb\xc3\x5d\xc4\x5d\xc2\xae\xf6\x1b\xb8\x5b\xb9\xbb\xb9\xf7\xf6\xf5\xf6\x5f\xe5\xfe\x8d\xfb\x1e\xf7\x53\xe6\xe3\xd1\x23\x09\x92\x22\x3a\x71\x48\x83\x8c\x13\x9f\xcc\x93\x2d\x64\x17\xd9\xdf\xe7\x75\x5f\x41\xae\x65\xd9\xf6\x1b\xc9\x9b\x59\xee\x1c\x9c\xb5\xe7\xd2\x6c\xcd\x46\x4b\x77\x31\x1d\xf1\x8b\x2c\x64\x20\x67\x20\x36\xe0\xb8\x9d\x1a\x4d\xab\x86\x69\x78\xfe\x80\xcb\x5c\xbe\xfd\x8e\xeb\xb8\x16\xbb\x4e\x83\x76\x89\x68\xb8\x2e\x49\x6c\xcb\xf7\x1c\x37\x28\xc5\x98\xfc\x8d\xf1\x6e\x2d\x66\xa7\xc5\x6c\xc8\x5c\x8f\x95\xf3\x1d\xda\xaf\x33\xb1\x94\x31\xea\x4e\x58\xc8\xb8\x4f\x2c\x4d\x67\xb0\xc0\xac\xfa\xdd\x59\xe2\xd8\xc8\x44\xdf\x0c\xde\x18\x4c\x3d\xce\x0a\x5d\x4e\x04\x12\x7c\xd3\xf3\x89\xee\x75\x03\xbf\xd2\x17\x92\x50\xb3\x1b\xb8\x36\xf4\x7d\x7b\x98\x0b\xa4\x1f\x71\xc4\x5d\x34\xcc\xae\x7f\xf6\x82\x75\xd9\x4b\x1c\xbf\x6f\xfa\x13\xe8\x6c\x4b\x98\x37\x47\x7c\x5e\xf6\xa1\xe6\x2b\xa9\x79\xc0\x00\x53\x1f\xf6\xf4\xb3\x58\x8d\x49\x1b\x31\xcc\xb1\xfb\xee\x99\x91\x69\xa6\x6e\x78\xa6\x17\x66\xaa\x5e\xd4\xbf\xe8\xb7\x31\x3a\x49\xd2\x36\x3b\x6e\xd4\xa2\x65\xbd\xe9\xc8\x67\x48\x63\x1b\x4c\xcf\xf1\xc3\x00\x49\x5e\x6a\x01\x3c\xfd\xf5\x13\x8f\x7c\x6b\xa1\xec\x60\x59\x85\xe9\x8c\x24\x0d\x0f\xef\x0c\xa0\xe9\x6f\x9c\x3b\xd0\xca\x96\xc9\xc3\xbd\x4f\xce\x1d\x9d\x6f\x56\x86\x1f\x28\xff\xfb\x13\xf7\xfe\xe3\x57\x56\xfe\xfe\x0d\x17\x42\xb9\x9c\x83\x7f\xdb\x9a\xfd\x9b\xde\xda\x47\x41\xf5\x20\x9b\xf3\xa4\xdf\xab\xe5\x52\xa9\x8c\x59\x49\xc5\x15\x55\x55\x57\x34\x47\xdd\x70\x14\x2a\xbd\x67\xca\x4e\xf6\x40\x56\x55\x9d\x13\x93\x65\x04\x3b\x45\x6a\x57\x5e\xa2\x41\xd6\x01\x90\x86\x25\x51\x25\x97\x65\x37\x1e\x80\xde\x29\x14\x61\x4e\x9a\x13\x2a\x2b\xcd\xbd\xb7\x0e\x40\xfc\x56\xdc\x9d\x5c\x8f\x10\xdb\x0a\x35\x79\xed\x63\x00\x2d\x24\x6b\x5a\x21\x05\xe8\x95\xb2\x92\xb4\xb1\x9c\xcd\xae\xe4\x50\xf2\xca\x4d\xbe\x8c\x90\x75\xee\x99\x1a\x1c\x68\xb5\x36\x6c\x77\x36\x9c\x40\x68\xed\xce\xa9\xce\x46\xe7\x44\x7e\x75\xf7\x6e\x28\x3b\xf7\x08\x3c\x9c\x28\xdf\x8e\x57\x5f\x0d\x6f\x17\xc5\x6b\x26\x31\xb6\x4b\x92\xd6\xf6\x6f\xc8\x95\x11\xf0\x9c\x49\x0f\x8e\x24\x67\x73\x9d\xac\xe0\xab\xb0\x71\x37\xee\x16\x57\x36\xc2\xee\x39\x90\xb7\xed\xce\x7a\xd9\x11\xe1\xaf\x01\x56\x40\xc5\x8d\xd9\xb9\xb2\xe3\x1e\xf0\x60\xf8\x41\x44\xfa\x19\x80\x2b\x96\x6e\x38\xf1\xee\xcf\x86\xa9\x93\x22\x16\x7b\xef\x86\x3d\x6f\xaa\xa7\x01\xce\x21\x9b\x48\x96\x64\x5f\x7e\xc8\x9e\xbb\xae\x97\xeb\x7d\xe4\x8f\x97\xa7\x81\xfc\xe2\x8e\xb2\x33\x3e\x79\xf2\xc4\x13\x53\x45\x61\x7b\x18\x85\x5f\xe3\xdf\xb4\x69\xb5\x4a\x2f\x3a\xf7\x77\x8a\x48\x33\x90\x81\x41\x01\x22\xfe\x2f\xfb\x11\x45\x48\xad\x1b\x12\xed\x74\x2e\x99\x1e\x54\x46\xc3\x3d\xea\xc2\x28\x40\x3c\xbe\x9d\x02\x8c\x34\x20\x3d\x7d\x71\x79\xa4\x08\xe7\x80\x08\xd7\xc1\x64\x57\x81\xa9\xe5\xa2\x48\x37\x1c\xa4\x57\x55\xd2\x9b\x2f\x9e\x03\xaf\x0b\x00\xbd\xdf\x88\xaa\x01\xa2\x22\x8a\xa3\x62\x22\x0b\x5a\x52\x34\xd3\x34\x6d\x8a\x92\x61\x8a\x8a\x29\x52\x80\xc1\x8e\xd0\x2c\x24\x34\x18\x1c\x1d\xdd\x2e\x88\xf3\x31\x03\x56\x95\x79\x65\x08\x00\xb6\x8b\x20\xee\x47\x03\x72\xc3\xb0\xd1\x06\x5b\x81\x21\x58\x1a\x4f\x2b\x83\x37\x9f\x4f\xb5\x8b\x41\x14\xc2\x74\x70\x28\x0d\x83\x20\xcc\x0b\xe5\x8a\x90\x51\xe8\x28\xa4\x83\xe4\xa8\x28\x0e\xc7\xc5\xa9\x8c\x28\x2e\x06\x30\xad\x78\xd6\x98\x3b\x35\x38\x07\xe9\x29\x68\x6b\x43\x60\x77\x5c\xc3\x9c\x9f\xb1\xa6\xa6\x61\x0e\x04\xd8\x24\x02\xcc\xd1\xd4\x38\x4c\x8b\xfe\x90\x08\x62\xdf\x47\x88\x3a\xf4\xc3\xdc\x2c\x77\x3e\x77\x37\xf7\x26\xee\x6d\xdc\x3b\xb9\xf7\x72\x4f\xb0\xca\xfd\x33\xfd\x9a\xde\xaf\xb9\x97\xb8\x3f\x70\x7f\x22\x40\x12\x44\x26\x69\x62\x90\x1c\x29\x31\x34\xd1\x25\xd3\xcc\xd7\x76\x13\xd9\x4e\xf6\xf6\x19\x93\x97\x92\x53\xe4\x3a\xa6\x28\xb9\x9f\x3c\x48\xde\x49\xde\xc5\x71\xa4\xaf\x82\x33\x21\x49\x0c\x53\x67\x0e\x1e\x76\xc7\x46\x66\x22\xeb\xb8\x36\xfa\xf6\x59\x95\x04\x2b\xe6\x59\x6e\x98\xd6\x28\x6c\x6a\xc1\x34\x21\xa6\x8e\x29\xa6\x67\x0b\xba\x1e\x0d\x1c\xd7\xf2\x83\xae\x9f\x72\x9d\x26\xb1\x10\x10\x88\x67\x98\xc6\x20\xd1\xd0\x0c\x01\x8c\x1e\x22\x8e\x51\xa2\x9b\x81\xa7\x83\xde\x67\xb1\x74\x82\x76\x88\x3e\x4a\x61\xb8\x31\x3c\xe6\x49\xc8\xe8\x24\xcc\x7f\x23\x3c\x80\x28\xad\x60\x72\x5f\xea\x05\xae\x55\x61\x4c\x0d\xd0\x53\xd4\xf0\xda\xbe\xe3\x8f\x92\x4e\xd0\x36\xdb\xaa\xdf\x19\x25\x4c\x6b\xd7\xf7\x14\xa1\x7d\xd2\x86\x6f\xb9\x03\x61\x62\x14\x38\x2e\x63\x06\x22\xa3\x2e\x86\x19\x92\x61\x46\x64\x48\xd3\xf1\xcd\xbe\x26\xc2\xec\x63\xa5\x10\x37\x51\x46\xf4\x33\xfd\x30\xfb\x63\xc7\xc2\x04\x6b\xdd\xc8\x1a\x28\x8c\x65\x15\x53\x67\x2e\xb8\x4e\x85\x15\xb7\x58\x41\x6f\x9a\xf8\x96\xcb\x48\x92\x2e\x0d\x0f\x39\xdc\xd1\x8b\xbc\x18\xb1\x6f\x61\xe1\x3b\x36\x23\x5e\x32\x5e\x4d\x08\x4d\xfc\x08\xc1\x30\xf9\xb4\x11\x35\x22\x5c\x34\xed\xd8\x20\xfd\xf1\x27\xb6\x95\x41\x68\x8e\x3d\x7b\xa5\xd0\x15\xe8\x05\xba\x0e\xa9\xcb\x28\x6d\x5c\x05\xdf\x1b\x87\x84\x4e\x61\x97\x90\x3f\x74\xf3\xf1\x79\x7a\x34\x3f\x9d\xbf\xae\xfa\xd4\xae\xde\x24\xa5\x24\xb8\x7a\x68\x6c\xef\xbd\x55\x8b\x8c\xeb\x73\xff\x6e\x4c\x4f\x3f\x7e\xdb\x87\xf7\x3e\x58\x3a\x6f\x57\x8e\x7c\xdf\x78\x6c\xe2\x43\x02\x4d\x50\x61\x39\x5f\xbf\xb6\xfc\xf8\x34\x9d\x7b\xeb\x79\xb5\xaf\xed\x7e\xd3\xc6\xf8\x4c\xf7\x99\x69\x67\xbc\xd1\x6d\x36\x9d\x94\x7e\x68\x6b\xa1\xe4\x7e\x26\x99\xd6\xf5\x78\x41\xd8\x66\x34\xca\x2f\x6e\xcc\x53\xba\xb5\xf7\x11\xea\x08\x06\x39\xff\xb2\xf2\x70\xaf\x7a\x25\x21\xb7\xf8\xfe\x36\x2a\xdc\x5c\xb8\xdd\x49\xbe\x75\x9e\x5e\x9f\xba\x1d\xa8\xa1\x53\x20\x44\x10\x9e\xd5\x21\x2e\xfd\x9a\x8a\x7b\x9a\x9b\x27\xe8\x52\x1a\xf6\x82\x40\x6b\xa9\xde\xc0\x6d\xb3\x29\xdf\x18\x9b\x86\xd4\x5b\x8f\x0a\xc2\xbe\x14\x6d\x08\x82\xc1\xba\x09\xe4\xfd\x9b\xed\xe3\xd3\x65\x63\x75\x7c\xb4\x49\x77\xfd\x53\xba\x48\x69\x5e\xa7\xe5\xe9\xb2\x20\x94\x7b\x76\x22\x31\xed\xca\xe5\x51\xf2\x22\x15\x9e\x29\xe7\x1d\x12\x3b\x91\x04\xa1\x36\xde\x7b\x64\x3c\x57\xee\xfd\xdc\x49\x95\x53\xb5\x72\xe1\xf5\x90\x4b\xe5\xee\x29\xe7\xf3\x7a\xaa\x49\xf3\xe4\x1b\xfb\x04\x00\x4a\xd7\x1f\x9e\xce\x8b\x43\x50\x16\xba\x74\x1b\x8d\x5b\xfa\x5c\x8a\xa6\x12\x09\xfa\x61\x80\xff\xba\xf5\x1b\x3b\xac\x37\xbf\x65\xcb\xc9\x4b\x04\x65\x8b\x00\x7b\x14\xc8\x8e\x01\x6d\x0d\x2f\x0a\x02\x88\x0a\x15\x45\x71\xcf\x25\xb7\xba\x4f\x11\xf1\xe5\xcb\xf7\xec\x69\xaf\x7d\x0c\x28\xf4\xae\xfe\xd4\xc4\x96\xf6\xbb\x53\x13\x37\x2b\x5b\xee\xff\x30\xd1\x9e\x7f\xd0\x1a\x7d\xf6\x16\xb2\xb5\xb2\xf8\x8f\x6f\x55\x6e\xde\x42\x45\x0a\x42\xe5\x1a\x5f\xb8\x94\xd2\xf7\xcd\x0a\x8e\x37\xd1\xb9\xe6\xa9\xff\xba\xef\xaf\x8e\xef\x1e\x16\xd6\xd3\x1d\x4a\xbb\x8b\x47\xa0\x6b\x0b\x50\xa0\x59\x4d\x31\x2d\xb8\x94\xd2\xcb\x1b\x60\xd0\xf7\x1c\x13\x1f\xf9\x62\xef\xbb\x1f\x1b\x4e\x15\xcf\x69\x09\x9d\xf2\x95\x64\xeb\xe2\x89\xd7\xb4\x21\x93\x07\x59\x0b\x43\x9e\x27\x2c\xd2\xba\x58\x59\x7b\xba\xe0\xee\x11\xcf\x93\x47\xf2\x8b\xc3\x8a\x62\x85\x5f\x30\xf5\x85\x78\x25\xd8\x5b\xb6\xde\x21\x52\x70\x05\x10\x40\x10\x2b\xca\x91\x2b\x95\x82\x50\x10\x68\x73\xce\xb8\x6a\x5d\x05\x28\xc6\x01\x0a\x56\x41\xb0\x04\x10\xe8\x02\x6e\x51\x28\x75\x05\x17\xe8\xf5\x30\x11\xa4\xc0\x00\x57\xf0\xa0\x25\xba\x2e\x35\x84\x94\x50\x28\x50\x05\x52\xf4\x38\x08\x00\x3b\xc9\xac\x01\xc3\x86\xd2\x16\x5c\x0a\x65\xdb\x48\x01\x80\x62\x09\x1c\xc7\x05\x0c\x17\xbd\x97\x3e\xc9\xad\x72\xd7\x72\x77\x72\xf7\x71\xef\xe1\x9e\xe0\xfe\x96\xfb\x3b\xee\xd3\xac\xee\x13\x66\x3b\x51\xae\xf3\x47\xee\x0c\xe1\x08\x65\x3c\xee\x02\x53\xea\xd6\xc9\x30\xeb\x3f\x4c\xbc\x92\xef\x84\x11\xea\x2a\x72\x07\x79\x1b\x79\x84\xbc\x9f\x7c\xa8\xef\xbf\xf0\x1c\xf9\x0e\x73\x5f\xf8\x15\xf9\x4f\xf2\x07\xf2\xc7\x18\x1f\x13\x5f\xc1\x4c\x61\x54\x01\x6c\x9b\x06\x35\xcc\x10\x04\x30\xe3\x04\xc3\x33\x99\x0d\x83\x1d\x42\x0e\x37\xd2\xf3\x3a\x35\x57\x57\xcd\xb3\x7a\x5e\x74\x6c\x3f\xf0\x2d\xbf\xed\xc7\x46\x49\xe0\xfa\x8e\xdf\x0d\x50\x4d\xab\xa6\x17\x74\xa2\xce\x03\x0d\x53\x9c\xaa\x6b\xb9\xdd\xb3\x40\xab\x49\x2c\xda\x36\xf5\x14\x83\x58\x96\xeb\xbb\xdd\xc8\x2b\xda\x33\x22\x16\x9c\xe9\xdb\x7e\xc4\xa9\x18\x25\x91\x67\x98\x8f\xcc\x6e\x27\x8a\x62\x67\x5d\x04\xc3\xb0\x67\xb3\x40\xc8\xfe\x1a\x5e\x37\x44\x59\xee\x06\xd2\x71\x75\xc7\x06\xd6\x7d\xe8\xb8\xa6\xdf\xf7\x2e\x8b\xd4\x5d\x9e\xa9\x8f\x7b\xa6\x5e\xd1\x4c\x06\x51\x3c\x43\x67\x9d\x82\x88\x66\xe2\xd4\x3c\xb0\xfd\x2e\x8d\x8c\x85\x3c\x67\x96\xd0\xc8\x14\x11\xc7\x75\xf4\x23\x1f\x6f\xb4\xd1\x43\x3f\xdc\xe6\x7a\x18\xe5\x80\xcc\x04\x6e\x9a\xa0\x1d\x05\x59\xdf\x0d\x7c\xab\x14\x63\x9c\x39\xdb\xed\xf3\xec\xa2\x6e\x04\x6b\xbd\x9a\x86\x67\xfa\x86\xd9\x2f\xfb\x8c\x12\x66\xfc\xed\x69\x2c\x74\x1a\xba\xe3\xbe\xda\xb9\xf0\x7c\xc3\x73\x9d\x70\xe3\x28\x61\xc6\xe2\xd4\x30\x19\x1f\x90\x41\x42\xab\xc6\x14\x6a\x94\x19\xb9\x46\x8e\x3f\x21\xaa\xb4\x5c\x88\x3a\x09\x35\xdd\xd4\x03\x97\x22\x13\x7d\x99\x91\x6a\xf8\x6c\xc4\x74\x4d\xd7\x33\x22\xe1\x56\x78\xea\x43\xac\x18\x7e\x2d\x92\xfa\x04\xd0\xcb\x5f\xbf\xe3\xf6\x9d\x17\xa5\x1e\x3c\x8f\xd8\xfa\xa4\x3b\x4c\xc5\xfc\xb0\xb2\x5b\x11\x66\x0b\xd4\x04\x43\x14\x04\x0a\x74\xcf\x4d\xbd\x4f\xec\x9e\x55\x80\x2a\x15\xa0\x3b\x04\xb3\x3e\x0e\x8a\x70\x45\x41\x00\xa8\x6c\xbf\xe1\xe6\xc2\xc4\x61\x85\xba\xb7\x3b\x69\xa1\xf5\x39\xf2\x8e\xc3\x4a\xef\x9f\xd6\xa4\xa6\x79\xee\x43\xb6\x7b\xf3\xde\xfb\xae\xb8\x84\xc4\x3f\x34\xf1\x0f\xcf\x29\xad\x78\xcc\xb8\x7f\xd8\x2f\xd2\x59\x61\x57\x0e\x16\xe9\x35\x55\x51\x74\x3c\xd8\x7c\xac\x7d\xac\x65\x08\xed\xcd\xf2\x90\xe9\x05\x42\x45\x81\xb6\x28\x52\x17\x52\x86\x10\xd1\xfc\x48\xe2\x9b\x79\x9a\x82\x2b\xd4\xe9\xdd\xeb\x5d\x50\x84\xb7\x51\x51\xf9\x74\x8b\x0e\xff\x9c\x16\x40\xe9\xfd\xb0\xfd\x3b\x4a\xa9\xa2\xf4\x7e\x34\xec\x38\x69\xf2\x35\x41\xd5\x0a\x3d\x4b\xa0\x79\x51\x24\xef\xa6\x54\x11\x84\x4a\xef\x1e\x81\x1c\x13\xc0\x10\x5c\x45\x11\x0a\x42\x4a\x74\x41\x29\x88\xa2\x40\xa9\x45\x05\x7a\x3a\x7d\xd8\xa0\x07\x40\xcd\xde\xd4\xbe\xfc\xea\x45\xda\xe6\xa7\x84\x4a\x9b\x0e\xf0\xb0\xe3\x1d\x7b\x84\x20\xd9\x39\x5a\x9e\x4d\x1d\x70\x1f\x9d\xd9\x4a\x61\x16\x26\x17\x68\x70\xa8\xd1\x7b\x61\x82\x92\x2b\x0e\x2b\x43\xda\xe6\xac\xdc\xae\x0d\xe5\x7b\x47\xd6\x4d\x92\x1f\xce\xd4\x85\xc2\x8e\x0f\xc3\xa2\x21\x9f\xe9\xcd\xf2\xa3\xb1\xdb\xa8\x32\xac\xb8\x50\x11\x0a\x85\x82\x91\x6a\xb9\x6b\xf7\xd0\xc9\xd8\x6b\xa8\x22\xac\x1d\x84\xb4\x43\xaf\x98\x35\x16\x26\x26\xf2\x41\xbb\x4d\x07\xdf\xab\x50\x21\x2f\x50\x90\xe2\x90\x1a\x5c\xff\x21\x50\xe8\x93\x94\xee\xbb\x70\x0b\xbd\xf1\x3b\xe7\x75\xaf\xd8\xf9\x3e\x45\x6e\x8a\xe3\xca\x88\x4d\xf7\x25\x12\x14\xe2\x94\x26\x93\x89\x44\x82\xd2\x7a\x62\xf5\xdd\x2d\xda\xfb\xdf\xd7\x52\x9a\xa0\x89\x04\x5d\xa5\x94\x26\x92\xb1\x6d\xdf\xbb\x93\x7a\x77\xce\xe5\xb6\xe9\x87\x7a\xf7\xf4\x1e\xeb\xb5\x13\x74\x2f\x79\x2a\x5b\x5c\xfd\xa9\x32\x4e\x13\x1f\xfe\x92\x6d\x36\x6f\x7d\x78\xe7\xfa\x63\xab\xd5\xea\x83\x76\xef\xcf\xfb\x8e\x7d\xf5\x37\xfb\xb2\xdb\xda\x9b\x60\xe3\x81\xd8\x76\x7a\xbd\x99\x48\x1e\xcc\x1d\x4a\x5c\x4a\x93\x74\x42\x68\x48\x5a\x62\x88\x42\x2b\x99\x28\x51\x4a\xab\x45\x21\x91\xa8\xd3\xc4\x83\x34\xbb\xca\xfe\xef\xb4\xbc\x13\xe3\x65\x8b\x66\xe9\xec\xc8\x78\x32\x8b\x52\xd2\x6e\x4d\x89\x89\x84\x96\x48\xd8\x23\xd4\xaa\x51\x9a\xa5\x49\xba\xc5\x6c\x8f\x08\x34\x4b\xed\xc4\x4c\xce\x2b\x25\x0a\x86\x36\x08\xc7\x92\xc3\xeb\x12\xe1\x2a\xe5\xe6\xe6\xa9\x9d\x08\x57\xd5\x22\x4d\x24\x69\x92\x26\xa8\x9d\x48\x50\x01\x52\x89\x44\x22\x91\xa4\x89\x63\xc2\x35\x09\x7a\x8c\x52\xfa\x40\x96\x3e\x9e\x48\xec\x6d\xd3\xf2\x1c\x4d\xa9\x54\xf5\x28\xb5\xe9\x86\x73\xeb\xaf\xcb\x26\x0c\x93\xde\x49\x57\x29\x5c\xa3\x1d\xba\xa8\x96\x48\xe7\xf7\x0e\x4d\x99\xd7\xf3\x36\xb5\x3d\x4a\x6b\xeb\xae\x4d\x8c\x1c\xd5\xa6\xc4\xf2\x74\x52\xa7\xee\xc8\xa8\xb2\x57\xa0\xc3\x93\x94\x6e\xa7\x89\x59\x6b\x7d\xa2\x5d\xad\x53\x6f\x88\xe6\x4a\x34\x59\xa5\x89\x59\xb9\x0a\x23\x5d\x3a\x34\xcc\x28\xa6\x81\xb6\xbd\x5a\xdc\x4e\xb7\x27\xe8\x44\x62\x3b\x5d\xa0\xe3\x98\x4c\xe6\xb4\x24\xa5\x76\x32\x49\xe9\xc2\x48\x92\x4d\x3b\x6e\x30\x9e\xc8\x0f\xe8\x93\xdc\xe5\xdc\xfb\xb9\x0f\x71\x9f\xe0\x3e\xc5\x1c\xb8\xbf\xc4\x3d\xcb\xfa\xc7\xdf\xfe\x6f\xd5\xab\xdf\xf7\xe3\xf9\x3a\xc2\x93\x24\x51\x89\x49\x06\x49\x99\xd5\xae\x42\xbc\xb9\x48\x36\x91\x15\xc6\x12\x39\x4a\x4e\x90\xcb\xc8\x55\xe4\x3a\x8e\x23\xa6\x17\x18\x61\x5c\x31\x51\x77\x81\x49\x3c\x9d\x66\x18\x29\x5d\x0b\x2d\xd4\x35\x6a\x98\x86\x6e\x82\x6d\x6a\x68\x02\x9a\x36\xeb\x4c\x62\x44\xe3\x63\xba\x98\xc8\x99\x01\x6d\xc7\x47\xdb\x1a\x70\xbb\x61\xde\xda\x0e\x61\xa4\x61\x46\xd8\xd3\xef\xd4\x1c\xd7\x61\x85\xac\x80\xe8\x9a\xd9\x47\x9d\x81\x07\x36\x3a\xa3\x84\x05\x8d\xf6\x06\x92\x24\x76\x18\x72\x53\x35\x46\x9f\x0e\x01\x6c\xdb\x8c\xe4\x34\x8e\x0d\x08\xb5\x10\x59\x46\x9c\x61\xcf\x60\x34\x66\xd3\x77\x98\xd0\x86\x25\x89\xbe\x1b\x25\xb9\xe1\x9d\x08\x2a\x96\x08\x63\x88\x34\x89\x87\x36\x8b\xb6\x1a\x76\xa8\xfe\xaa\xb1\x2c\xe3\x74\xbc\x8a\x2c\x9b\xc4\xd3\x42\x28\x4d\x3d\xb4\x89\x19\xc9\x47\x43\x74\xe9\x61\x44\xab\x33\xfb\x8e\x3c\xcc\xfc\xba\x6f\xa8\x63\xf6\x6b\x64\x61\x0e\x4c\x91\x39\x28\x68\x2c\x9a\xb2\x8e\xad\xcd\x9c\x77\x98\x78\x27\x88\x2a\x74\xc8\xb2\xfe\x10\x6a\xc6\x6a\x00\x7b\x5e\xf2\x12\x0d\xa8\xee\x2d\x8a\x9b\xc5\x3b\x1f\x04\x80\xe6\xdc\xbe\x41\x87\x24\x82\xcf\xbe\x47\x14\x10\x6a\x90\x1f\x88\x98\x56\xd5\xf0\xa6\x18\xfe\xda\x5b\x64\xb7\x3b\xa1\xbb\xf6\xa6\x6a\xf2\x4a\x80\xe2\x18\xa4\x37\x6e\x33\x4b\xc5\xcf\x77\x8a\xbd\xbb\x7e\xdb\x19\xfb\x1f\xf3\x9f\xeb\x7d\xe0\x75\x8f\xfc\xea\xe9\xb1\x06\xdc\xf7\xf0\xc5\xef\xdc\xd3\x80\x3b\x9f\x09\x1e\x7b\xa8\x9a\x06\x71\xac\xf7\xd2\x7d\x9f\x3a\x31\xf8\xc1\x5b\x4f\x35\x4e\x5e\x60\x22\x9c\xb8\xea\xd4\x95\x7f\xf5\x49\xf2\xcb\x6a\x75\xf0\xb6\x46\x3a\x2d\x56\x79\x63\xb3\x5f\x1e\xaf\x4f\xc2\xc4\xd0\x73\xa2\x2a\x06\x45\x92\x4a\x83\xf8\x51\x51\x6c\x88\x17\xa4\xc5\xde\x17\xd2\xe9\xaa\x28\x8a\xb1\x00\xd6\xfe\x4f\x23\x16\x64\xa0\x58\x1d\x2f\x89\xa5\x6e\xb5\xd4\x3c\xc8\xfc\x2c\x3f\x1a\xfe\x4d\x8b\xe9\xb5\xb7\x8b\x20\x92\x01\x48\xf7\x9e\x05\xc4\x9d\x22\xc4\x3a\x99\xe4\x72\x11\xa0\x5d\x4f\x5f\x50\x4c\xcf\x3f\x13\x11\x41\xae\xce\x64\x62\x37\x8a\x00\x90\x29\x8a\xc5\x3d\x99\x4c\x1a\x66\x32\x19\x51\x84\x06\x88\x45\xd8\x5b\x4a\x8b\xb5\xf0\xa8\xd2\x5d\x11\xc4\x30\x64\x8d\xb5\xd3\xcf\xe8\x17\x52\x9a\xa8\xd2\xd4\x39\x89\xb7\x86\x97\xd0\xfe\xab\xe9\xed\xbb\xdd\x63\xb7\xbd\x4d\xbf\x30\x79\x68\x03\x24\x12\x29\xaa\x51\xda\x8f\xed\x14\x80\xe6\x12\x94\xd2\x75\x22\x10\xe7\xa4\x16\x6e\x1e\x2a\xd1\x2b\x0f\x24\xf7\x4f\x0e\xfd\xaf\xe3\x3b\xaf\x3c\xd0\x9e\x78\xec\x81\xee\x78\xef\x54\xe9\xda\xd7\x2d\xec\x38\xef\xbd\xd4\xdb\x9d\xbb\x9e\x0e\xee\x5c\xa0\x3f\xbd\xea\x7c\x9d\xd2\xa6\x45\x49\xe2\xd4\xea\xce\x4d\xe7\xbe\xe5\xf2\xc9\x15\xe7\x68\xe9\xa9\x66\x55\x59\xb8\xf3\x38\x4c\xac\x17\x28\x8f\x54\x2b\xea\xf1\xfd\x49\x7a\x01\x75\x6e\x2c\xdd\x9e\x48\x84\x01\x26\x91\x28\x85\xd7\x3a\x24\x36\x27\x29\x15\x58\xd8\x14\x07\x44\x51\x28\xc1\x90\x90\xa8\xd2\xa1\xc4\x08\x1d\x49\x24\x53\x34\x21\x24\x12\xc9\x0b\x72\xbd\x87\x81\x9e\xa4\x1a\xdb\x51\x1d\x83\x14\xad\xb4\xc3\xff\xc1\xdb\x2c\x38\xb1\xfe\xd8\x5c\x42\x17\xb4\x6a\x22\x91\x4c\x24\x74\x8d\x6a\xe7\xe4\x68\x8e\x56\xe5\x3c\x15\xaa\x42\x87\xea\x29\xad\x9a\x4d\x66\x62\x39\x9a\x48\x25\xf4\x5c\x92\xe6\x68\x2a\x0c\xdb\x09\x36\xec\xb7\xc8\xf0\xdf\xfb\xe9\x93\xdc\x85\xdc\xbb\x58\x5e\xfa\x14\xf7\x11\xee\x93\xdc\xff\xe2\xbe\xcc\x7d\x9d\x21\xc0\x9f\x71\xbf\xe2\x7e\x4f\xd6\x91\x38\x49\x11\x93\xd8\x64\x88\x8c\xb3\xac\x74\x81\x69\xf8\xce\x21\xe7\x92\xf3\x98\x12\x4f\xb7\x5d\x66\x98\x62\x33\xcd\x5d\x64\x3c\x7f\x96\x5c\xcf\x4c\xfe\x98\xb1\x3e\xfb\xed\xfa\x86\xa7\x6b\xb6\x85\x3e\x0c\x12\x93\x69\x24\x34\xd5\x36\x99\xfd\x56\xc7\xf5\x05\xc2\xcc\x22\x99\x3f\x20\x3a\x6e\x60\x5b\x6e\xa7\x56\xa5\x66\x60\x32\xd5\x7f\xdf\xa2\xc5\x43\xc6\x1f\xf1\x22\xd3\xfd\x48\x7c\x67\x7a\xb1\x81\x6e\x60\xfb\x91\x6f\x57\x78\xe1\xad\x43\x26\x42\x70\xa8\xa9\xbb\x2c\x1b\x6c\x9f\x9d\x5e\x62\x31\x06\xae\x63\x23\x53\x1e\xd8\x91\x29\xa1\xe3\x62\xa0\x9d\xb5\xaf\x77\x5c\x8c\x3a\x7e\x95\xf0\x42\x66\x85\x6f\x46\xe7\x8a\x0c\xed\xd1\xd4\xfb\x1c\x34\x9f\xc9\xcf\xa3\x01\x2b\x8c\xc0\xf6\x6a\xd5\x2a\x1a\x24\x64\xff\xb7\x31\x2c\xd8\x87\x59\x6c\x57\x46\x66\x43\xb6\xa1\xbf\xc7\x59\x63\xc8\x80\x85\x8f\x28\x02\xad\xe3\xd2\x0f\x25\x4d\x9e\x97\x12\xc9\x43\x66\x69\xc4\x41\xbe\xc8\x23\xbf\xdd\x37\x8b\xc9\xa2\xdf\x92\xea\xc5\x56\xb2\x35\xc2\x6b\x15\xe3\xfa\x47\x97\x93\x98\xe4\xf9\x1b\xb1\x88\xa9\x77\xf2\xc9\x8b\xde\x30\x82\x8e\xe9\x1c\xe2\x91\x47\x3e\x79\xac\xc6\xf3\x29\x99\xdc\x49\xfe\x70\xe6\x9f\xdf\x39\x5b\x3c\xd4\x75\x52\x3c\x8f\x3c\xcf\x27\x93\x7c\x12\x93\x49\x9a\xe0\x4b\xfc\xec\x8c\x33\xb2\xfd\x6a\xc8\xce\xe2\x2e\x72\x65\xb8\x9f\x71\xe6\x17\x37\x0f\xbc\xe4\xa3\x72\x66\xac\x56\xf3\x93\xc9\x81\x1b\x92\x25\x34\x66\x8b\xbc\x79\xe6\x9f\x7d\x67\x74\x10\x7d\x67\xd6\x0c\x8f\xc9\xf1\x53\x78\xc8\x37\x47\x92\x7e\x49\x4b\x9b\xa6\x6f\xf2\x3c\xd9\x47\xc7\x8a\x63\xd2\xda\xbe\x6d\xed\x74\xac\x5d\x33\x9d\xe5\xe2\x90\x78\x35\x9f\xe4\x0f\x6d\x9f\x9d\xf5\xb7\x19\xdb\x97\x66\x93\xb8\x0d\x97\x66\x96\x78\x07\x67\xbb\xcb\xfe\x0c\xef\x6f\x9f\x75\x5a\xfe\x2c\x3f\xcb\x2f\x1d\x9a\xf1\xef\xa8\xb9\xa5\xd9\x62\xb6\x50\xf2\x0f\xd5\x78\xfa\xe4\x47\x50\xee\xe6\x01\x47\x2f\xc3\xba\x54\x33\x11\x11\x89\x78\x18\xb7\x6c\xf1\xf3\x5b\xb1\x9d\x59\x45\x2d\xcc\xb3\x90\x17\xa5\xa1\xdc\x8d\x98\xfb\x56\x2f\x75\x1b\x4a\x20\xc9\xbb\x20\xf6\x5b\x42\xfb\xad\x02\xe9\x6a\x55\x9f\x19\x52\x9b\xef\x40\x44\x59\x93\x77\x2d\x22\xe6\xeb\x16\xe4\x2b\x58\x47\xdc\x85\xd0\xfb\xab\x5f\x6a\x48\x62\xb1\x3f\x7a\x86\x3c\x02\x00\xd2\xe2\xa2\xb6\x15\x0f\xd7\x2b\x6e\xf8\x5e\x96\x5f\xef\x5a\x79\xd4\x10\x8e\x5f\x06\x72\x33\xb3\x08\xab\x88\x07\xd7\xa1\x5c\x9d\xc7\xc3\x78\x58\x56\x97\x10\xbb\x9a\xd5\xf4\x0e\xa3\xb4\x8a\xab\x20\x6d\xed\x4a\x5b\x0f\xd7\x71\x8b\x0c\x72\xb0\x79\x68\xa7\x3c\x53\x99\x54\xea\xc3\x13\x9f\x99\xd9\xdf\x2d\x95\x56\x2b\xf5\xd9\xf3\x0f\x4b\xf6\x82\xac\xef\xdc\x9a\xdf\x37\xa8\x68\xc3\x55\xe9\xb2\xf3\x71\x70\x4a\xaa\x1a\xda\x60\x07\xa4\x31\x4b\x1e\x9b\x5e\x1d\x82\xdb\xe4\xfd\x8b\xde\x04\x76\x67\x76\xa1\x37\xa1\x35\xe2\x33\xe8\x47\xc6\xf3\x4e\x0a\xbb\x1a\xd6\xb9\x5a\xff\x3a\x7e\x8c\xdb\xcf\xdd\xc1\xdd\xcd\x78\xfb\xcf\x32\xf5\xed\x7f\x32\x1e\xe8\x1a\x5b\xe9\xa3\xbc\xad\x4b\xa6\xc8\xfa\xfe\xf5\x7b\x88\x1c\x27\x97\x92\xab\xc8\xeb\xc8\x3b\xc8\xbb\x98\x6f\xec\x27\xc8\x67\xc8\x17\xc8\x57\xc8\xd7\x58\x8e\xc6\x68\x99\xa8\x26\x09\x2b\x2a\x31\x2b\x36\x8f\x2d\xea\xa9\x24\xe9\xeb\x25\x19\x3f\xdf\x19\x88\x31\xb7\x56\x3b\x70\xbb\x81\x1e\x78\x81\x11\xe6\x6a\xba\xe1\x31\x4e\xa9\x6e\xbb\xb6\xe1\x99\x5e\xdb\x1f\x08\x97\x77\x06\x0b\x34\xd5\x4c\xd9\x96\x1b\x73\x1d\x37\x70\xed\xc0\x0d\x6c\x4c\x87\x2b\xbe\x57\xdd\x40\xdc\xae\x3a\x4a\xec\x60\x80\xd9\x4c\xd3\xc8\x1e\xba\xd2\x17\x13\xb1\xd0\xc2\xbc\x49\xce\x5a\x95\xf8\x76\x34\xd5\xe2\xac\xcf\x47\x5f\x45\xea\xc7\x5c\x33\x32\x67\x65\x3f\x8c\xf3\x64\xb1\x4e\x7a\x74\x45\x6a\x1e\xab\x7e\x77\x6a\xcc\x18\x0e\x0d\xdd\xa5\xac\x6c\x1d\x5e\xd2\xb4\x5f\xa0\xf6\x7c\xb6\x31\xbc\x6b\xf7\x7d\x27\x02\x97\x4d\x6a\x3a\xdb\xea\xb2\x19\xc1\x3d\xe2\x50\xb5\xcf\x66\x7b\xba\x5d\x61\x83\x33\xf4\xbe\x20\x37\xaa\x77\x63\x34\x5d\x29\xf0\xdd\xc0\xf2\x93\xc4\x0c\x74\x8f\x31\x6a\x75\x40\x3b\x40\x46\x16\x65\x5b\x19\xde\xb0\x3b\x76\x92\x29\x92\x75\xdb\xc5\x8e\xd7\xb1\x51\xf3\x50\xf3\xf4\x6e\xd4\x85\x63\xc5\xbc\x7e\x45\xcf\xd4\x98\xb3\x87\x17\x74\x58\xe2\x1a\xf8\x8c\xa9\x1f\x0d\xe4\x08\x7c\x06\x26\x58\xad\xde\x1f\xf8\x20\x6f\xc5\xcf\xf7\xf8\x45\x3e\xce\xfe\xf0\xf1\xb8\xc2\xf3\xd9\x87\xcf\x8f\x2f\x7a\x0d\x4b\x89\xd7\xee\xfa\xf2\xa9\x5b\x7c\x4b\xe1\x79\x85\xe7\x9b\x8b\xfc\xd2\x74\xe6\x7f\x29\xe1\x8b\xe2\x8a\x17\xb7\xf8\x38\x5f\xbb\xcb\xca\x5e\x7f\x2a\x7b\x7e\x3c\x7e\xbd\xf2\xe2\xfb\xdf\xf8\xfe\x74\x59\x88\xc7\xf9\xf0\xcf\xde\x99\x45\xfb\x9d\x0f\x5e\x44\xf4\x59\x25\x9e\xe3\xf9\x38\xcf\xdf\xd6\xfe\xb8\xa2\xac\x65\xf3\xe3\xea\x78\xec\xab\x7b\xf9\x33\xff\x72\xdb\x0d\xca\x12\xbf\x78\xfd\xa9\xbd\x1e\x7f\xfd\x5e\x5e\xbc\x70\xfb\x29\xde\x52\xe2\x56\x2e\xce\x2b\x71\x85\x8f\xed\xda\xa3\xb4\xe3\xd3\x95\xf8\xde\x94\xa4\xf1\xf1\xb5\x8c\x90\x54\x9a\x96\x15\xfb\xa5\xa2\x58\xe7\xef\x5d\x3b\xc5\xf3\xb1\x47\x17\xe3\x4b\x6b\x8b\x96\x15\xfb\xea\x34\x6f\x59\xd9\x0a\xfb\x0e\x89\xf1\xb5\xdd\xe1\x11\xc6\x1b\x89\x4c\x7c\xbe\x7b\x42\xad\xc7\x8f\x67\x79\x3e\xf6\x74\xc5\x52\x94\xc5\xb8\xc5\xaf\xbd\x57\x51\x62\x5d\xbe\xa1\x64\x2b\x0a\xaf\x58\x16\x6f\xf1\x4a\x9c\xcf\x9e\x10\x4a\xfc\xeb\xf8\x86\xc2\x97\xd3\x96\x92\x55\xf8\x6c\x2e\xc7\xc7\x95\x8a\x65\xc5\x15\x3e\x67\xe5\x72\x8d\x06\x6f\x4d\x14\x1a\x6b\x2f\x2a\x8a\xd7\xe6\x1b\x7b\xbc\x38\x1f\xcf\xfe\xdc\x8a\x4b\x92\xd2\xf0\xf8\x53\x4b\x59\xa1\x1e\x8f\x9f\xf2\xbc\x46\x3c\x1e\xf7\xb6\x5b\xd3\x95\x99\xb6\x45\x1f\xd3\x11\x1a\xd6\x58\xa1\x57\xba\x13\x51\x0e\xf2\x63\xe3\xcb\xa8\xdb\x80\xe3\xf9\xde\xcb\xdd\x71\x94\x64\xd4\x75\x6b\xe9\xe1\x67\xc8\x53\x64\x20\x6e\xd9\x43\xcb\x96\x5e\x1a\x40\x44\xf7\x23\x32\xe2\x7d\x85\x6f\x7d\x4f\x2f\x00\x7c\x11\x3f\x14\x6b\x6d\xba\xe3\x96\xa1\xe5\x73\x10\x0b\x87\xd7\xfe\x7c\xa0\xf7\xf2\xdb\xc8\xf0\x8f\xd6\xdf\x8c\x88\xd7\x1d\xc5\xb5\x7f\x7a\xf1\xfe\x4f\x1f\xed\x6c\x1e\xd3\x34\xc2\xbd\x15\xf5\xd8\x65\x28\xa3\x3c\x24\x0f\x61\xd6\xc4\x83\xe8\x94\xe4\xc7\xe4\xdb\xd2\xc1\x98\x1e\x0c\xbd\x7e\xf0\x3a\xe9\xe8\x46\xc9\xd2\xcf\xbb\x49\x3a\x8a\xcd\xc3\xf2\x32\x8e\x1f\x45\x7d\x4c\xd6\x91\xc8\x15\x94\x03\x94\xec\x31\x9c\xda\x27\xe9\x47\xe5\x73\x9a\x33\x92\x54\xc0\xa5\x09\xfd\x2a\x41\xc6\x83\x43\x68\x49\x85\xeb\x84\x9a\x95\x97\x65\xb9\x20\x6d\xda\xba\x63\xd7\x92\xac\x63\x71\x97\x7d\xce\x90\x2d\x59\x16\xce\x77\xb4\xb1\x92\x22\x2f\xe7\x03\xcc\x8f\x21\x6e\x9b\x40\xf9\x62\x79\x3d\x3a\x0a\xe2\x5d\x23\x90\xbb\x7f\x59\x1e\x3a\x80\xcb\x52\x50\x18\x43\x49\xc7\x7c\x63\x4c\xc6\xa1\x31\x1c\x92\xa4\x9a\x28\xeb\x78\x8e\x7e\xa7\xa5\x63\xde\xc2\xb1\x3c\x0e\x8a\xf9\xfc\xb8\xbd\xae\x36\x66\xc9\x32\x16\xe4\x86\x04\xd6\x90\x8d\x08\x72\xf8\xbd\xa4\xf0\xa4\x61\xa6\x34\x1e\xd9\x89\x46\x86\xfe\x98\x97\x45\x43\x2f\x68\x36\x62\x1e\x65\xcb\x46\xd4\x11\x30\x9e\xd5\x1b\x89\x75\x88\x32\xc7\x71\x3a\xab\xbb\xa7\xe8\xd3\xdc\x02\x77\x1e\x77\x11\xeb\xea\xdf\xc3\xbd\xb1\xef\xd4\xff\x7d\xee\x67\x8c\x47\x1b\x55\xdd\x63\x51\xdd\x9d\xe3\xc8\xba\x41\x82\x86\x6e\x77\x5c\x8c\x42\x05\x1a\xa6\xd7\xf5\xcc\x18\x0e\x98\xe8\xa2\xc5\x64\xfc\x7e\xa7\x16\xb9\x06\x60\x14\xdc\xb4\xbe\xcb\x80\xd7\x51\xd3\xb3\xc4\x84\x01\xd3\x0a\xa3\xa5\x86\x02\xb1\x90\x18\xaa\xe9\xa5\xf3\xa4\x1b\x44\xac\x4d\xc7\x35\xa3\x30\xf5\x4a\x59\xc6\x8f\x1a\x62\x68\xb6\xfb\x97\x7f\xdf\xfd\x86\xb1\x3a\x4d\xdb\xc5\xb6\x19\x91\x3c\x19\x1a\x62\x68\x02\xcf\xf2\x3e\xa3\x1f\x88\x86\x60\xb4\x99\xe1\x67\xdb\xf4\x54\xdf\x0d\x63\x49\xad\xef\xfb\x43\x99\x46\xd4\x67\x64\xf6\x10\xd2\xb0\x7a\x7a\x98\x8d\x84\xc1\x8d\x44\x52\x78\x26\x7a\x0f\x1c\x9f\xc1\x8e\x48\xf6\x8f\x9e\x3b\xf0\xb7\x24\xcd\x1f\x52\x0e\xf1\x6d\xa5\xa2\x64\xab\x25\x5e\x56\x95\x7f\x3c\x76\x4c\xc9\xb6\xbf\x7d\xcb\xad\x7f\xda\x96\x25\x69\x25\x4e\xde\xb3\xa8\xe4\x93\x71\x43\xe3\x17\x64\x95\x5f\xe0\xef\x3e\x76\x4c\x79\x47\x3c\xdb\x5e\xe0\x77\x7f\xe9\x6b\x9b\x6a\xc4\xf2\xdf\x34\x95\x3a\x75\xf3\xdd\x83\x5d\xfe\xcc\xcb\x8f\x0d\x5f\xca\xb7\x6e\xdc\x7d\x32\x1e\x4f\xf1\x0f\x9c\xe4\x63\xaf\x55\x16\x64\xad\x30\xda\x48\x1d\xe2\x17\x3e\xaa\x28\x77\x67\x1b\x53\xca\x6e\x7e\xb7\x22\xfb\x71\xa9\xc5\x2b\x8b\x7c\xbc\xcd\x2b\xd3\xf1\x36\x9f\x9a\x8a\x1b\x79\x45\x89\xc7\x53\x0a\xcf\xf3\x59\x79\x98\xcf\xa6\x52\xf1\xcc\x78\xba\x14\xff\x08\xcf\xc7\x2b\xa3\x6b\x5f\x57\x14\x72\xbe\xa2\xf4\x76\x55\x0c\x6d\x21\xb5\x3b\x5e\xf2\xdf\x93\x4a\xfd\x32\x9e\xe2\x53\x24\x91\x4a\x7d\x49\x51\xee\x1e\x6a\x57\x52\x0b\x0b\xca\x9f\x78\x5e\x51\x94\x07\xf8\x86\x42\x9f\x2e\xe4\x92\xee\x2d\x4b\xfe\x2d\xce\x4a\x6a\xb9\xe6\x6a\xbb\xae\x49\xae\xdd\xfd\x42\xef\x9b\xa9\x24\xcf\x9f\xfc\xc6\xc0\xcc\xf3\x26\x5f\x2a\x26\x79\x4c\x5d\xb6\x92\xda\xe3\xde\x6b\x99\x0b\x17\xf3\x23\xf8\x1f\x0b\xe4\x7d\x64\x72\xb3\xe3\x1c\xef\xe9\xfc\x7f\xfc\x3b\x9f\x34\xe2\xb1\x5c\x6c\x3c\x79\xe6\x7f\xbe\xaf\xf7\x22\x4f\x04\xf2\x3c\xb9\x23\xf6\xfe\x12\x9f\x7a\x3d\xbf\xb2\xdc\xe5\xef\xbb\x85\x5f\xc1\xf7\xf1\xa9\xee\xc8\xf4\xdd\xc9\x63\xc9\xa4\x51\x1e\xb9\xa6\xbb\xbe\xb5\xbc\x7c\xd2\x2d\x5d\xb6\xcc\xf3\x7b\x96\x53\xcb\xcb\x37\x9f\x5c\x3e\x79\x6c\xf9\x18\xbf\x77\x65\xb9\x58\x5a\x3e\x8f\x5f\xd9\xeb\xe0\x72\x11\x5d\x67\xcf\xec\x88\xb9\xb7\x56\x5f\x26\x3f\xe7\x4d\xfe\xd8\xaa\x90\xe4\x91\x4f\x15\x53\x3e\x9e\xdc\x9b\xfc\x38\x7f\xf9\xb6\x37\xf2\xcb\xc9\xa4\xc9\x8f\xf0\x23\xbd\xb7\xa4\x92\x49\xb3\x78\xe7\x48\x52\x9d\x5a\x5e\x4e\x26\x79\x1c\x29\x95\xfa\x35\x01\xa8\xd1\x27\xb9\x7d\xdc\xbd\xac\xfb\xf4\x28\xf7\x3f\xb8\xa7\xb8\x8f\xb1\xda\xc0\x3f\x71\x5f\xe4\x9e\xe5\x9e\xe3\xbe\xcd\xfd\x90\xfb\x0f\xee\x45\xee\x25\x56\x15\x20\xec\x7a\x48\x91\x0c\xc3\x0b\x75\x32\x42\x3c\x32\xf1\xca\x74\xc5\x7d\xac\x0b\x75\x9c\x5c\x46\xae\x0c\x71\x7f\xb8\x78\x06\x9e\x89\x2e\xf3\x9b\x00\x34\x07\xd8\x3f\xd5\x01\xe6\x9a\x68\x7a\x3a\x13\x8d\xf8\x81\xe3\x76\x06\x7c\x7b\xa0\x6d\xa2\xed\x43\xf8\xcf\x17\x1d\xdf\x19\xe8\x0c\x74\xa6\xc3\xb7\x08\x51\xfd\x06\xe2\xb5\xf5\xb4\xe9\x31\x49\x1f\x28\x68\x6a\xb6\x25\x10\xd7\x86\x01\x0d\x6d\x37\x08\x77\x4f\xeb\xaa\x67\xb6\xfd\xae\xba\x81\xf8\x9e\x19\x78\x86\xca\x1e\xa5\x7d\xc7\xd4\xbd\x3e\x91\x39\xe2\xbb\xd9\xba\xe5\x32\xb7\x28\x76\x6d\xb1\x36\x91\x66\xba\xbe\xc5\x92\x6f\xd7\x0f\x18\x03\x3c\x7c\x22\xba\xc7\xd4\x7c\x6c\x3a\xa1\x17\x30\x1f\x5c\x86\x16\x3c\x3f\xb2\x33\x8c\xac\x0c\xfb\xc3\x2a\x68\xd4\xf4\xa6\x6c\xd7\x48\xfd\x17\xe9\xf6\x6a\x0c\x04\xa0\x1e\x75\xe5\xc3\x37\x89\xb6\x46\x46\xbc\x01\x93\xc4\x45\x0d\x25\xf6\x59\x6c\xbb\x5f\x61\xf9\x7f\xdf\x73\xb7\xcd\xba\x5c\xe1\xd3\x35\xd3\x63\xe3\x6b\x98\xdd\x94\x63\x7b\x7a\x89\x04\x91\xb7\x09\x4d\xbf\x9f\x6a\x29\x45\x69\x2b\x0d\x9e\x6f\xa8\x66\x7c\x4f\x2a\xc5\xf3\xfc\x31\x65\xea\x58\xe3\xba\x85\x2f\xc6\xf9\x46\x1c\x4f\x3c\xc0\xdf\x23\x6b\x71\xfe\xda\xb8\xbd\x1a\xbf\xe8\xbc\xf6\xa7\x6e\x5d\xb8\xe7\xe2\x40\x69\xec\x5e\x50\xbe\xf4\x01\x23\x3e\xe4\x16\xd6\x0f\x1e\x52\x2a\x5b\x07\xff\xc7\x93\xdb\xac\xbd\x97\x56\xda\x4a\xfc\xcd\x0f\x7c\xfd\x22\xab\xbd\xd0\xb6\x2a\xe1\xd2\x1f\xb7\x7e\xbc\xf0\xd8\xf8\xcc\x54\xe5\x16\x85\x3f\x7d\x3f\xb9\x66\xe0\xff\x4b\x1d\xe3\x79\xd1\x39\x7d\xff\x42\x25\x3e\xf0\x2d\xfe\xd0\xe9\x6b\xae\xe5\x0b\x9b\xd7\x55\xf8\x63\x3c\xcf\x9f\xbe\xeb\xe4\xc0\x13\xfc\x21\xe5\xf4\xbb\x4f\x0e\xdc\xc9\x1f\xe3\x0f\x9d\x49\x6d\x8b\xf3\xbb\x07\xbe\x1a\x3f\xc6\x9f\x7e\xbe\xcd\x0f\xdc\xc9\x2f\x2e\xf2\xbb\xb3\xa7\xff\xc8\xf3\x71\x85\x24\x16\x5b\xb1\x6b\xe3\xdb\xe2\x8b\x6b\x27\x16\xf9\x58\x77\x4a\x99\x5a\x3b\x31\xc5\xb7\xb3\xfc\x54\x3c\xb6\x9f\xd7\x9c\x45\xbe\xc1\x2b\xed\xb5\x53\xca\x34\xbf\x8d\x9f\xe2\x63\xe7\x2a\x8d\x94\xd2\x3e\x2f\xc5\x2b\x6b\x03\x43\x4a\x23\x76\x07\x3f\xc5\xb7\xd7\x0e\xf3\x15\x3e\x1e\x3b\xc2\x4f\xc5\xdf\xb1\xd0\xd8\xf6\xa9\xca\xe2\xb6\xdc\x39\xbd\x41\xa5\x91\x22\x57\x4c\x55\x76\xaf\xdd\x70\x2b\x5f\xda\x67\x9d\xe4\x95\x7d\x72\xf6\x58\x56\xd9\x73\xed\x10\x5f\xa1\x4f\x4e\x35\xe5\x64\xb2\x9a\xe4\xf7\xe1\xf0\x17\x46\xf9\xde\x87\x17\x64\xc4\xde\x26\x59\x3e\x8e\xc7\x93\xe1\xda\xc2\x63\xee\x9c\x16\x71\xb1\xd7\x1e\x46\x54\xd4\xcd\xb8\xaa\xfd\x96\xfc\x6d\x91\xfc\xa0\xd0\xdc\x35\x8f\x6b\x37\x27\xa7\x7a\x3f\x5e\x8c\x99\xf3\x4f\x1b\xf3\xdf\xe8\xbd\xe1\xcb\x0f\x7b\x24\x20\x39\xfe\x70\x6f\xef\x3c\xca\x9b\xdf\x12\x7b\x14\x7b\xc5\x3f\xf6\xde\xc9\x3f\x7c\x2b\xb9\x7e\x38\xcc\x4e\x84\xb5\xff\x77\x73\xf3\xff\x90\x17\x49\xf5\x50\x72\xb3\x61\x18\x49\x6d\x2b\x9f\x9d\x9d\xdc\xaa\xed\xac\x1e\xae\x26\x4b\x63\x4d\x5c\xd5\x70\x78\xdf\x7c\x15\x83\x83\xd5\xea\xae\xea\xd4\x2e\x1e\xab\x4d\x9c\x9a\x37\x36\xb7\xf9\x7d\xf3\xd5\xe4\x9c\x27\xd7\x47\xbd\xfd\xb5\xe3\x53\xa5\x09\xac\x4e\xe1\xfc\x2e\x4f\xcd\xe0\x6c\x6e\x58\xf6\x26\x79\xcf\x9b\x3f\x9e\xc4\x76\x55\x6e\x7b\xf3\x78\x22\xe9\xe1\xd4\x54\xd5\xf0\x9a\x53\xd5\xc1\xa9\xf6\x7c\xb3\x6a\x4c\xd5\x9a\xcd\xe1\x66\xd5\xe3\xe5\xb2\x68\x60\xb2\xad\x1b\x3b\x07\xd1\x6b\xb6\xf5\x6a\x6d\x70\x78\x8b\x66\xce\x17\x4c\x44\x03\x9b\xf3\xd5\xcd\x83\x83\x9b\x87\xbd\x79\x6f\x33\x1a\x9e\x8c\xc9\xcd\x9e\x8e\x3b\x71\xa7\x8e\xfb\x71\x3f\x7a\x83\x9e\xbc\x79\xb3\x71\xbc\x31\x7d\x3c\xb9\x0f\x77\xf2\xb5\xc9\x9d\x86\x51\xe3\xe6\x59\xbe\xf1\x27\xfa\x18\x77\x88\x7b\x63\x5f\x23\xfc\x38\xd3\xa3\x7d\xa2\xef\xf4\xfa\x79\xee\xff\x72\x5f\x67\xaa\x95\x9f\x70\x2f\xb2\xfe\x51\x8f\x24\x88\xc4\x6a\x8d\x51\xf7\xa8\x4b\x26\x99\xdb\xeb\x0e\x72\x0e\x39\x9f\x5c\x48\x6e\x26\x77\x90\x7b\x5e\x99\x04\xf8\x04\xf9\x5b\xf2\x71\xf2\x29\xf2\x19\xf2\x25\xf2\x35\xf2\x2d\xf2\x3d\xf2\xf3\x18\x17\x1b\x88\x41\x2c\x11\x53\x62\x7a\x2c\x1b\x2b\xc5\xaa\xb1\x66\x6c\x34\x52\x11\x9b\xc4\xb4\x58\x23\xc4\x50\x75\xbb\x6f\x68\xd8\x2f\x41\xda\x9d\x7e\x01\xd2\xc2\x0e\x0b\x45\x03\x8c\xb1\xc2\x9c\x7a\x4c\xec\xb0\x59\x17\x8e\xeb\x77\xf3\xc4\x21\xe1\xf2\x1e\xae\x97\x91\x14\xc6\xdb\x40\xcc\x58\x92\x58\xae\xe3\x82\xbe\xae\x44\xb4\x01\xc3\x4b\xfb\x5d\xcf\x60\xcd\x14\x67\x94\x74\x5c\x36\x63\xd0\x65\x89\x51\x37\x68\x07\xa6\x66\x9b\xcc\x40\x95\x19\xfb\xb0\x98\x10\xd4\xcc\x0e\x35\xc2\x20\x60\x51\xa6\x36\x0e\x5f\x6c\x9e\xed\x4e\x63\xf8\x4c\x18\x59\x58\x69\xb2\x82\xa6\xd7\xf5\x59\xcf\x99\x95\x13\xa8\x31\x4d\x7c\xcf\xb5\x28\x33\xf3\x09\x2c\xdf\xf2\x59\x00\x62\xca\xe2\x48\xa5\x1c\xf8\x81\x86\x51\xf5\x22\x70\x6c\xf4\xfa\x69\x5a\x25\x92\xa7\xd8\x6c\x6c\x56\x98\xc3\x94\x88\xce\xec\x10\x19\x0f\x39\x4c\x4e\x1c\xf4\x74\xd3\xd0\xd9\xbc\x20\x33\x62\x1a\xf9\x8e\xab\xdb\x9d\xf0\x81\x1d\xd9\x07\xb9\x2c\x8e\x9a\x6c\x6e\x84\xe9\xbb\x86\x87\x8e\x6d\x78\x81\x11\xe6\x55\xbe\xe7\xd8\xe8\x44\x5f\x07\x75\x2f\xb0\x68\xdf\xcd\xc8\xb6\xfc\x0a\x7a\x41\x92\xe8\xed\x20\x3c\x11\x8e\x5f\x22\xbe\x4b\xc3\x88\x8d\x36\x2b\xe1\x44\xb4\x3f\x56\x80\x71\xcd\x68\x40\x86\xef\xb8\x61\x38\x64\x13\x3d\x92\xc4\x08\xbf\x2b\x3b\x0b\x14\xdb\x67\x07\xc1\xba\x16\x73\x66\x62\x4d\x3b\xdf\xd0\x83\xbe\x57\x10\xb3\xeb\xf1\x6b\x26\x7b\x3d\xd5\xd8\x79\xac\x99\xfa\x28\x33\x41\x8c\x88\x4e\xaf\x0c\x86\xb5\x58\x25\x76\xe0\xfe\x87\x71\xa8\xf7\x1b\x54\x4a\x42\xfb\x96\xc5\x2f\xcb\x21\x7c\x64\x53\x00\x43\xd4\xc9\x46\xb4\x48\x8d\xfc\x90\x94\xec\xfe\xdb\x51\xdc\x2e\x23\xe2\x52\x01\x87\x96\x87\x10\x3b\x3b\x97\x2f\x3e\x75\x6b\xef\xcc\x32\x11\xff\x5a\x2a\xe4\xed\x03\xf2\xa9\x3b\x83\x97\x67\x86\x4a\x9d\xd7\xbe\xef\x3a\x22\xde\x59\x78\xc9\xad\x7d\x36\xd7\xbc\xf5\xe6\x13\x83\xe7\xb4\xdf\x7d\x6a\xfd\x7a\x65\x1e\x00\x0b\xd8\xb9\x27\xb5\x6e\xbb\x5e\xc0\xb8\x90\x5f\x6b\x49\x83\x28\xc7\xee\x45\x59\xc3\xb5\xe3\x63\x31\x27\x23\x48\x79\x65\xed\xef\xec\x42\xac\x03\x9a\x8c\x85\xbf\xc8\xb2\xa5\xeb\xbd\xcf\xcb\x29\x51\x33\x7b\x54\xc7\x02\xea\xe4\xd3\x88\xa8\xcb\xbd\xbd\xec\x86\xac\x26\x04\x40\x29\xd5\xbb\x5d\x47\x19\x41\xce\x17\xc8\x11\x36\xd3\xa6\xf7\x23\xd4\x6d\xfc\x59\x03\x65\x19\x41\x4f\x08\xf7\xc9\xf2\x76\x59\x06\x59\xee\x3d\x85\x48\xba\x21\x7a\x2e\x60\xef\xcf\xba\xde\x90\xa4\x2f\xda\x05\xf4\xd2\x79\xdc\xf7\x51\xf9\xef\x0b\x85\xfb\x96\x97\xff\x4e\x42\x1b\xf3\x49\x5c\x96\x71\xc8\x42\xd4\xe4\x21\x65\x5d\xef\x1b\x12\x26\x48\x33\x55\xc6\xaa\x84\x25\x45\x1d\x44\xa9\x30\xa4\x0d\x15\x60\xa0\xf7\x04\x22\x02\xd8\x28\x8b\xe4\x51\x65\x1f\xae\x47\x94\x7a\x93\x92\x24\x5b\x28\xf2\x10\x5b\x67\x96\x1b\xfa\x72\xb0\xf6\x1f\x0c\xb5\xcb\x3a\xc8\x28\x1d\xcc\x83\xac\xc7\x76\x69\xa8\xdb\x16\x16\x30\xee\xe2\xda\x74\x78\xfc\x92\x2e\xa7\x44\x94\x63\x65\xc9\xb6\xd7\x3e\x25\x49\x28\x63\x8a\xc6\x3e\x20\x15\xe4\x31\x84\x52\x02\xe5\x7c\x43\xd6\x35\xb9\x30\x9e\x0f\xf4\xa1\x33\x75\x79\xe0\x5f\x11\xcf\x7c\x53\x1f\x42\x2d\xf6\x57\xb2\x1c\x20\x9e\xf9\x5d\x20\x8f\x4b\xf9\x31\x7b\x39\x3f\x3e\x26\xd7\xca\x43\x48\x1f\x8b\x0f\x1f\xed\xdd\x95\xde\x04\x9b\x6e\x9d\xee\xfd\x14\x14\x80\x6a\xfa\xc8\x59\x51\x61\xf8\x6b\x30\xc9\x83\x58\xb3\xc9\xe0\x9b\x9f\x4c\xa7\x01\x3e\xf4\x64\x46\x94\xd7\x01\xc0\xbe\xf5\xe0\x92\x1c\x19\xfc\x08\x49\xcd\xc0\xe0\x98\xd5\xac\xd6\xe5\x54\xf6\x4e\xf8\xf4\x2f\x47\x7b\x37\xbe\x4e\xbc\xec\x03\x1f\x30\xc5\x33\xcf\x64\x0e\xac\x9d\xae\x92\xe7\xda\xc5\xbb\xbf\x74\x4b\x1a\xb6\x7c\xf0\xbe\xf4\x7c\xdb\x13\xa7\x8f\x2a\xd0\x00\x98\xfe\xe5\x58\x66\xcc\x1f\x9a\x99\xd1\x79\x10\x05\xa0\x01\x4d\x37\x8a\x5a\x79\x2c\x5d\x4d\x67\x8a\x90\x11\x33\x43\xca\x18\x00\xa4\x07\xab\x69\x66\xac\x96\x69\x40\x35\xd3\x80\x62\x31\x93\x16\x21\xfc\xcf\xcc\x88\x43\xe2\x20\x93\x12\x0f\x16\x21\x5d\x4c\x43\x51\x14\x45\x28\x27\xc1\xcc\xa8\x1d\x31\x3d\x06\x76\xc6\x17\x33\xd5\x41\xbb\x28\x36\x4c\x48\x8b\x30\x08\x0a\xa4\xab\xcc\xf7\xb1\x41\x45\x05\x36\xa2\x98\xbe\x72\x50\x54\xc4\x8c\x38\x03\x33\x55\x30\x85\x41\xd1\x22\xe9\xf4\x28\x88\x50\x0c\x5f\x99\x29\x8a\x62\x86\xbd\x65\xa6\x91\xce\x54\x21\x03\x45\xf0\xa9\x88\x83\x50\xa4\x2b\x50\x6d\xc0\x60\x15\x46\xa9\x32\x34\xe4\x17\xa1\x08\x62\x5d\x1d\x4e\x8a\x9b\xc4\x69\x00\x88\x0e\x72\x77\xfa\x08\x0c\x41\x3a\xd3\x0d\xb7\x8d\x0a\xb3\x75\x00\xa5\x58\xa4\xa2\xdd\xa8\xce\xa4\x33\x22\x40\x75\x28\x0d\xd5\x41\x51\x11\x4c\x31\x0d\x30\x23\xa6\x45\x31\x03\x69\x31\x23\x8e\x8d\xcd\xfb\x90\x11\x45\x48\xa7\x21\xa5\x35\x1a\xd5\xc8\x7b\xe8\x00\x9c\x43\x60\xf7\x01\x71\x05\xa6\x8b\xa2\xd8\xd7\x3c\xaf\x4b\xd0\xa7\xb9\x73\xb8\x4b\xb9\xcb\xb9\x6b\xd8\x4c\xf0\x3b\xb9\x7b\xb9\x07\xb8\xb7\x71\x8f\xb3\xa9\xe0\x1f\xe7\x9e\xe1\xfe\x9e\xfb\x47\x36\x81\xed\xab\xdc\x37\xb9\xff\xe2\x4e\x13\x93\xe4\x59\x7d\x7a\x8a\xac\x27\xe7\x93\x0b\xc8\x09\x72\x13\xb9\x8d\x39\x51\xdc\x4f\xde\x42\xde\x4e\x1e\x66\xb5\x6a\x34\x74\x4b\x07\x34\x2d\xdd\xc2\x28\x5d\x03\xdd\xd3\xfb\x0d\xab\xa8\xaa\xa5\x87\x4b\x42\xe0\x39\xae\xdf\x0e\xba\x2a\x17\x39\xe7\x06\x5e\x24\xf1\x88\x7a\xdf\x6c\x16\x90\xd7\x55\x59\x86\x08\x4d\x62\xb9\x9c\x8b\xb6\xae\x85\x49\x20\x9a\x7e\x5a\x0d\x4c\xdd\xa3\x06\x1b\xc2\x13\xe6\x7e\x95\x48\x20\x18\x59\x78\x9b\x61\xe4\x0c\x6c\x56\x4f\xc6\x7e\x40\x76\x75\xd3\xb1\xfd\xc0\x61\xa8\x90\x95\x90\x98\xcb\x44\x64\x0b\x41\xcd\x70\xe9\xf0\x03\x56\x39\x62\x54\x69\x16\x26\xc3\x27\xfd\xf0\x77\x5b\x8f\x96\x3b\xdb\x0d\x21\xa8\xed\xa2\x17\x2e\x13\x0c\x40\x86\x60\xd9\x67\xaf\x4b\x86\x4b\xa5\xab\x47\xaf\xf5\x98\x02\x3a\xdc\xbb\x3d\x4b\x1c\x36\xbe\x2d\x3c\x15\x96\x1e\xf5\xee\x02\xb7\xed\x47\x6f\x80\x9e\x69\x3b\xe1\x27\x86\xc7\x95\x24\xa6\x35\x18\xbe\x8c\xd5\xdf\x03\x3b\xf0\xd9\xfb\x47\xef\xe4\x30\xf9\x0d\x7a\x06\xd3\x4d\x46\x13\x18\xd8\x74\xdc\x70\xb9\x08\x33\xdb\xf0\x89\xf0\xdc\x45\x35\x2c\xd3\x0e\x4c\xf6\xee\x6c\x05\x18\xd8\x59\x38\x2c\xed\x28\x8f\x94\xb1\x22\xc4\xd0\x1c\xd8\x04\x07\x01\x50\xc2\x79\x74\xcb\x95\x96\x04\x7a\x09\xb0\x36\x93\x54\xdc\x3d\xbd\xb7\x3f\xdc\x01\xbc\x40\xb4\xaf\x46\x78\xb4\x8c\x23\x00\x0e\xa8\xd7\x4a\x5b\x26\x92\xcd\xdc\xfa\xfd\x19\x0b\xdc\x3d\xbd\x67\xb7\x60\x8b\xfc\xa2\x3c\xd5\x71\x37\x5d\xf7\x39\x6f\x5e\x5d\x2b\xe7\x85\xac\xe4\xa5\x63\xf7\xe3\x94\x96\x5e\x3b\xac\x81\x5a\x19\xd1\x62\x47\x71\x1e\x60\x6a\xed\xb3\x12\x4a\xe5\xfa\x06\x15\x0b\x8a\xda\xd2\x50\x89\x75\x61\x0a\x60\xed\x93\x39\xf2\x12\x78\x12\x74\x24\x68\x49\xad\xde\xc2\x5c\x8b\xbc\x13\x5a\x38\x2d\xb6\x24\x9c\x92\x3a\x30\x27\xb9\x2a\xb4\x72\x30\x05\x53\x92\xa4\x49\x08\x52\x78\xaf\x85\x8e\x86\x7b\x20\x27\x21\xe4\x5a\xe0\xe2\x1b\xf0\x10\x5c\x8c\xd3\x38\xa5\x4a\x80\x00\x3b\x30\x27\xa9\xa0\x96\xa7\xca\x92\x24\x49\x53\x88\xda\x94\xd4\x02\xdc\x24\x81\x1a\xbe\x40\xda\x23\xe6\xa4\xac\x2b\xad\xe0\xa1\x4d\xb8\x07\x51\x05\x25\x06\xb9\x1d\x12\x4a\x1d\x69\x04\x5a\x30\x02\x5d\x45\x92\x72\x52\x4e\xfa\x7e\x0b\x4e\xa9\x07\xa5\x9b\x54\xe9\x21\x55\x3a\x25\x49\x65\xd4\x7a\xef\x91\xa4\x3f\x48\x92\xf4\x96\x32\x6c\x92\x24\xe9\x94\x96\xa3\x4f\x5b\x5e\x77\xde\xda\x7f\x93\xb2\x77\x03\xdd\xfa\x27\xa0\xdf\x19\x16\x60\x90\xc2\x5f\x53\x51\x08\xa3\xcf\x3a\x80\x99\x69\xba\x77\x07\x79\x96\x9c\x7a\xd2\x92\x93\x60\x3a\x45\xfa\x01\x71\xd0\xa3\x62\x1d\xe0\x91\x3b\x88\x70\x72\xb2\xf7\xb9\x07\xf7\xde\x4a\xd4\xfd\x40\x4b\xbd\x89\x91\xaf\xf4\x5e\xb8\x4a\xa0\xe4\xa3\xb1\x99\x2f\xd4\x15\x70\xa9\x68\xd0\x78\x96\x0e\x0e\x16\x84\x11\x13\x14\x50\x14\x35\x5e\x00\xa5\x50\x30\x4d\x41\x10\x20\x18\x11\x84\x61\x04\xcb\x03\x6a\x81\x60\x15\xa8\x09\x60\x99\x75\xc3\xb3\x94\x41\xc3\x5d\x5a\x82\xba\x02\xa6\x60\xd5\x95\x7a\xf4\x63\xb8\xe6\xa4\x65\xd0\xc1\x42\xcb\x13\xa1\x6e\x88\x26\x54\xe4\xb8\xd0\x2a\xb4\x04\x7a\x54\x10\x68\x41\x78\xda\x32\xa8\x69\x5a\x09\x51\x19\x14\xc0\x1a\x1c\xe4\xe3\xe1\x87\x5a\xd4\xdc\x2b\x98\x75\x0a\x05\xcb\x68\x15\x5c\xa8\x0b\x50\x57\x94\xf8\xb9\x75\xb3\x5e\x10\x2d\x13\x2a\x20\x28\x00\x85\x3a\x35\x2d\x0b\xc2\x7d\xa5\xb8\x00\x86\xd5\x82\x25\x3e\x0e\x69\x83\x42\xb6\x9c\xa8\x52\x0f\x04\x50\x26\xa1\x2e\xd4\x4d\x25\x72\x72\xb5\xcc\x30\x86\x2b\x94\xe3\xb8\x51\x16\x93\xce\xa3\x8f\x71\xbb\xb8\xdb\xb9\x7b\xb9\xbf\x62\x1d\xb3\x27\x99\x8f\xd8\x17\x59\x04\xfa\x11\xab\x2b\xfd\x86\x7b\x99\x3b\xcd\xf4\xd9\xa9\xfe\xac\x9a\x2a\x19\x63\x19\xf4\x46\xb2\x9d\x39\x83\x5f\x40\x2e\x21\xa7\xc8\xeb\xc8\x5d\xe4\x3e\x16\x95\xde\xcd\x3c\x72\x3e\xc4\xf4\x72\xff\xc0\xd8\x9c\x9e\x19\x98\x9e\x19\x5e\xc9\x20\x10\x2f\xf0\x34\xca\xea\xe9\x51\xe5\xdc\x46\x36\x2d\xdf\x65\x1d\x33\x1f\x6b\x21\xd0\xa5\xae\xe3\xfa\x69\xd5\x46\x1f\x5d\x1d\x75\x2b\xc4\xa6\x41\xc7\x6d\x87\xc9\xb9\x87\x2e\x1b\xd8\xe6\xb5\x03\x53\x1f\x88\x31\x68\x17\x50\x86\x18\x3b\x76\xed\xec\xfc\x03\xb4\x2d\xb7\xab\x76\x55\x3f\x7c\xe3\x76\xdf\x8e\xc6\xeb\x78\xcc\x90\x86\xc1\xc0\x68\x46\xb5\xdf\x09\xc3\x57\x24\x1a\x0b\x9c\xc8\x6b\xd2\x88\x1c\x1c\xbb\x3e\x73\x98\x34\x5d\xdb\x44\xdb\xb1\xd1\x78\x05\x7e\x85\x40\x8e\x95\xa9\x19\x26\x3c\x6b\xc7\xc0\x4a\xfa\x91\x1a\x25\x49\xa2\x8f\x49\x92\x08\xb7\xb3\xb4\xd9\xd4\x19\xe7\xc9\x46\x1d\xfb\xe3\xb2\x5f\x15\x93\x84\xa1\x2a\x84\xf4\x61\x44\x46\xcd\x36\xdb\x81\xe5\x22\xc3\xde\x16\x2b\xa6\xf9\x16\x53\x71\x33\x9a\x3c\xc3\xa7\x6c\xdc\xc1\xab\x9f\xdc\x0d\xe3\x96\x1e\x0d\x1f\x7b\x65\x1a\x36\xeb\x5a\x46\xd8\xdd\xd3\xfa\x44\x4f\x37\x44\x91\x6e\xff\x45\x16\xa3\x8b\x05\x6c\x76\x02\xdb\x14\x49\xe7\x3c\xa6\x9c\xf6\x58\xc9\x3f\xb6\x04\xea\x24\x94\x5f\xa7\x42\x69\xc3\xb9\x3f\x80\x17\xb2\x64\x4f\x78\xd9\xab\x00\x2a\x64\x21\xa7\xaa\x13\x93\x30\xdc\x7b\x01\x00\xa1\xf7\xa0\xea\x8e\x7f\xf0\x1f\x26\x3e\x75\xae\x8a\xc6\x50\x3b\x0b\xaa\x04\xd9\xec\x64\x49\x0d\xdf\x61\x43\xfb\x82\x3f\x4b\x8f\x9d\x99\x04\x40\x95\xbc\xfd\xdc\x27\x10\xda\x1b\x7a\x5f\xf9\x16\x60\x16\x20\x07\x90\x13\xdb\x47\x96\x9f\xc7\x8f\x9d\x91\x94\x24\x40\x36\x5b\xca\x82\x94\x53\xe2\xa0\x26\x92\xbd\x7f\x95\x44\x71\xc3\x60\x3e\x7b\x4e\x76\xd8\x94\x7b\x2f\x38\x65\xc3\x04\x80\x61\x2d\x93\x75\xd4\xf2\x39\xe0\x64\xcb\x92\x93\xcd\x86\x18\xf1\x07\x05\x5b\xaa\x26\xb3\xe5\x52\x2d\x76\x3e\xa8\x28\x25\xe2\xd9\xde\xc3\x92\xe4\x00\x10\x2b\x2b\x79\xe0\xc0\xa4\x28\xe6\x40\x4a\x14\xb2\x52\x09\x40\x95\xc4\x92\xe4\xe4\x6f\x14\x55\x00\x14\xdf\xa4\x3a\xa0\x96\x0e\x23\xde\x25\x95\x41\x2a\x97\xa4\xb2\xa4\xca\x82\x9c\x01\xe7\x88\x58\x13\x92\x42\xde\x2b\x4b\x09\xbe\x26\xd4\xcb\xa9\x78\x59\xcc\x4a\x19\x4d\xda\x20\x95\x1d\x74\x10\x40\x72\xc8\xdb\x25\xe9\xcb\x92\x74\xe6\xb9\x0d\x1b\x86\x45\xcf\xf1\x13\xd9\x36\x53\xbe\xb6\x9d\xe1\x6c\x36\x47\xfe\x67\xa2\x90\x75\xd4\xc9\xb6\x23\xb5\x9d\xac\xba\x76\x7a\x78\x78\x38\xeb\x20\x64\x21\x0b\x22\x3f\xae\x4a\x65\xb5\x3c\xec\xa8\x6d\x84\x52\x76\xed\xad\xe5\x34\x42\x3b\x76\x91\xfa\x2b\x49\xa2\x8f\x45\xb6\x33\x69\x58\x5c\x79\x47\xef\x7b\x6b\x3f\x12\x15\x49\x1c\x03\xc8\x00\x40\x08\x91\x06\x92\x20\x16\xc5\xc8\x5e\x05\x32\x45\x3f\x0b\xb1\xbf\x21\x37\xa6\xd9\xf3\xb0\x50\x14\xd3\xc5\xc9\x6d\x69\x48\x77\x61\x0f\x00\x14\xd3\xd0\xfb\xd4\xda\xfa\xcb\xcf\x3a\x52\x54\x33\xd1\x70\x5f\x28\x1e\x25\xd9\x53\xb1\xdb\x32\x90\xe9\x8e\x15\x37\x6f\x3e\x31\x56\x9c\x69\xcc\x34\xaa\x90\x09\xd1\x51\x17\x2a\x49\x48\x57\xa1\x35\x00\xb0\x00\xe3\x0a\x00\x8c\xf0\xd0\x9d\xe1\x13\x30\x06\xd5\x46\x15\x1a\xe0\x67\x61\x21\x7c\x72\x61\xa6\x21\x02\xa4\xab\x63\xe1\x8e\x62\x66\x54\x2c\x61\xd5\xcc\x16\x01\x1a\x33\xdd\xb1\x99\x46\x17\x1a\xd5\x96\x7e\xc2\x17\x44\x86\xd7\x40\x84\x6a\x77\x61\x6c\xb3\x28\x76\xab\x33\xd5\x99\x6e\xa3\x9a\x6e\x8c\x91\xe9\x93\x33\x99\x1d\x8d\x99\x3d\x7b\x1a\x3b\x5e\xbb\xc9\x0f\xcc\x1d\x8d\xae\x50\x15\xc7\x42\xb4\x59\x04\x28\x2e\xec\x10\x41\x7c\x0a\x16\xa8\x64\xab\xcc\xe5\x0c\xa0\x0a\x8d\xf0\x63\x21\x9f\x84\x86\x66\x75\x61\x6c\xac\xd1\x68\x00\x88\xc5\x54\x4e\x2c\x36\x42\xfc\x07\x0d\x10\xbb\x20\x34\x43\x40\x9b\x16\x39\x8e\x70\xdc\x5f\x8e\xae\xe3\xfe\xf2\x6e\x6e\x80\xe3\xf4\x8a\x5e\x59\xc7\x9d\xe1\x8e\xcd\x70\x84\xfb\xe6\xba\x20\xf6\x38\x7d\x17\x27\x70\x1c\xb1\x6b\x23\xc4\xef\x74\xbd\xb6\x61\xc6\x1e\x5f\xee\x3d\x53\x2a\x0d\x55\xb4\x21\x7b\x5d\xf0\x65\xad\x6e\x94\xea\x19\x9b\x0b\xb8\x0d\x1c\xb7\xee\x33\xf4\x49\x6e\x94\xdb\xc5\xed\xe7\x0e\x71\x47\xb9\x8b\x19\xb6\xbb\x8b\x7b\x23\xf7\x0e\xee\x51\x86\xec\x3e\xc6\x7d\x8e\x61\xba\xe7\xd8\x24\xec\x5f\x70\xbf\xe6\x7e\xcf\xfd\x7f\xdc\x69\x32\xc0\xdc\xc6\x34\x52\x21\x75\x36\x55\x37\xaa\x48\x1e\x27\x97\x91\x2b\xc8\x75\xe4\x4e\xf2\x46\xf2\x14\xf9\x24\xf9\x7b\xf2\xbf\xc9\xb3\x6c\xc6\xc2\xb7\xc9\x8f\xa3\xc9\x0a\x1c\x47\x0c\x8f\x19\x01\x6b\xf9\x58\x89\xf4\x9d\x27\x74\x46\x93\x77\x03\x67\x80\xc6\xd0\xb4\x91\xf1\x42\xbd\x8e\x9a\x0e\xba\xa6\x6b\x5b\xfa\x40\x92\xd8\xae\xee\xc5\x06\xc2\x30\x92\xf6\xda\x41\xcd\xf4\xd4\x30\x70\x90\x01\x30\xf5\xbe\x62\xc5\xf4\x23\xd1\x4b\x5f\xba\xd2\x56\xdb\x83\x44\x8b\xa6\x5d\xda\xae\x1a\x8d\xb1\x76\x23\x1e\xe8\x60\x9f\x1d\x6e\xba\x8c\x5d\x14\xf8\x4e\xbf\x32\x1f\x19\x2c\x9a\xba\xdd\xa9\xb1\xac\x1e\x03\x17\xb5\x48\x2e\xdc\x77\xb9\xb5\x7c\xb7\xa2\xf7\x0d\xc6\x22\xbb\x46\xb3\x53\x0b\x53\xe1\xae\xe7\x9e\xf5\x83\xf0\x7c\xfa\xdf\x88\x06\xac\x7e\xe0\xd4\xd8\x48\xca\xc8\xa0\xc2\x63\x6e\x66\xc6\xd9\x81\x60\x2c\xc4\x45\x1e\x3b\xee\xd9\xf1\x5b\xcc\xb9\x92\x55\x02\xac\x51\x12\xd1\x38\xce\x72\xa0\x98\x58\x2f\x8c\x97\x35\xc6\xdd\x8c\xa6\x6c\x5b\xae\xcd\x26\x6b\xb1\x06\x44\x10\xc9\x93\x5d\x6a\xe8\x8e\x1d\x59\xe7\x68\x91\xe1\x05\x9b\xc6\xd0\xaf\x79\x76\x18\x3f\xd5\x66\x2b\x98\x13\x7e\xc7\xf0\x01\xdb\x72\x76\x99\x61\x3e\x90\x8e\x1d\x38\xec\xc4\xd6\xc2\x07\x91\xf1\x9a\xa1\xb3\xb1\x38\xe1\x99\x08\xfa\xd3\x70\xa2\xb4\xde\xb5\x91\xf6\x39\xa5\x96\xff\xaa\x6b\xaf\x6f\x06\xbe\xdd\x71\x2d\xb3\xef\x04\x12\xbb\xa1\xd4\xde\x2a\x69\xf8\x81\x93\x47\xc2\x6c\x5f\x46\x4b\x93\x46\xbb\x47\x50\x93\x8f\x3e\xd0\x7b\xff\xd6\x30\xeb\x5d\xba\x3a\x95\x95\x6f\x3f\xb2\x68\xdd\x0e\x78\xf2\xdd\xec\x55\x4b\xf5\x7c\x57\xc2\xe9\xaa\x21\x12\xbb\x72\xee\x4d\xd7\x2c\x76\x7b\x5f\xbf\x66\xf6\xa1\xad\x38\xaa\xd5\x07\x36\x8d\xee\x29\xe5\x0f\x3c\xa3\x1f\x97\x66\xf4\x51\xc4\xf7\xd5\xf5\x23\x48\xec\x4c\x31\xd5\xcb\x4b\x16\x22\x5a\xb2\xa6\x21\x48\x18\x6f\xa4\x04\xed\x47\x4b\xa3\x5a\x17\xb1\xf7\x73\x49\x1a\x7d\xf3\xd8\x71\x59\x07\xd4\x34\x94\x81\x74\xdf\x9c\xbc\xb4\xf7\x2e\x0d\x75\x72\x71\x7c\xaa\xb7\x45\x4e\x08\x10\x13\x35\xf2\xe6\x23\x6b\x2f\x49\xe4\xd3\x87\x17\xf7\xaf\xca\xab\xee\xda\x21\x90\x35\xa2\x8f\xe6\xbb\xd2\xac\x3e\x9b\x57\x14\xd0\xe4\x8a\x3e\xf4\xf2\xb9\x10\x1c\xb1\xe4\x23\xbd\x63\xa3\x5a\xd2\x3d\x3e\x2a\xe7\xb1\xa2\x49\xf9\xfc\xe8\x6c\x77\x54\x9f\xed\x2e\xca\x63\x5d\xe8\x6a\x26\x29\x25\x12\x28\x24\x7a\xef\x4a\xc7\x85\x94\x04\x80\x96\x84\x88\xa9\x75\xa3\xb1\xb7\x1c\x39\x77\xed\x22\x4d\xcb\x0f\x01\x8e\xc6\xbe\xb0\x8a\xa3\x5b\x65\x3c\x77\xcd\x81\x3a\xe2\xac\x25\x6b\x98\x47\x49\xce\x4b\x32\x68\x32\xc8\x79\xec\xca\xf9\xd8\x99\xa5\xa1\xad\x03\x0a\x8a\xbc\x50\x3d\xfd\xd9\xd9\x46\x63\x14\xf3\x75\xad\x2e\x03\xca\x03\x9f\xd5\x64\x09\x4f\xff\x57\x5e\xab\x6f\x2d\x25\x24\x0b\x70\xa0\xa8\x4b\xd5\x34\xea\x28\xd5\x65\x39\x8f\x38\x8a\x52\x7e\x75\xab\x54\x97\xe8\x93\x1b\x37\xca\x3a\x62\xae\x77\x65\xef\x7b\xbd\x35\x1b\x10\x75\xbc\x12\x0b\xba\x2e\xeb\xba\x7c\x2f\xb9\x72\xbc\xf7\xc1\x43\xba\xbe\x71\xcf\x81\xd8\x7a\x72\xdb\x07\xec\x71\x1c\x5f\x3b\x6d\x23\xca\xbd\x7f\xef\xfd\x42\xc7\x8d\x40\xde\x22\x37\xb0\xf7\x93\xd3\x28\xef\x1f\xf0\x89\x97\x48\xe3\x8a\x8c\xd9\x0e\x9b\xb7\x9b\x9f\x44\x59\x7e\xcd\x41\x1d\xbf\xc1\xf7\xae\xb6\x31\x9d\x40\x44\x5b\x26\x4f\x14\x10\x57\x1a\x32\x6e\xc4\xaa\x35\xa1\xb3\x41\xc0\xb6\x6c\x37\x74\x1b\xb1\x21\x37\xe4\x82\x8c\xb6\x3d\x81\xd3\xae\x8e\x4a\x39\x7c\xea\x2b\x85\x7f\xd0\x75\x3d\x67\x86\xcf\xe9\x3a\xe2\x33\xb8\xf9\xe2\x71\xdb\x96\x27\x50\xb6\x6d\xb9\xb0\xa1\xd0\x18\xb7\x65\x79\x23\xaa\xa6\x2c\x23\x66\xb6\x60\x99\xa2\x30\x8f\xca\xf4\x98\x3e\x81\xe3\x28\xeb\xb8\x64\xe2\x0e\x0d\x2f\xc4\x0b\xb1\xb5\x0e\x1b\x53\x39\x5c\x49\xef\x6a\xc8\xd2\x5e\x79\xa2\xb0\x11\x71\xb3\x2a\x37\x1a\xf2\xfe\x75\x32\xe2\xb8\x8d\x1b\xe4\xa9\x1c\xca\x7b\xf0\x90\x7c\x08\x0f\xc9\x88\x1b\xc7\x75\x2c\x60\x41\x97\x27\x1a\x36\x16\xfc\xce\x38\x8e\xef\x19\xb7\x57\xb0\xb0\xa2\xa3\x8d\xf2\x6b\x0a\x87\xe4\xc1\xed\xd8\x90\x37\xa0\x8c\x58\xdd\x6e\xeb\x9b\x73\xe1\x37\xb9\x20\x28\xb4\x32\x38\x51\x18\x32\x1a\xfa\x8a\x8d\x13\xff\xba\x52\xc0\x8d\x90\x97\xb7\x63\xa1\x60\xed\xc6\x72\x46\x46\x7c\x0d\x5e\xac\x6e\x56\x71\xe3\x48\x69\x0f\xca\xa8\x17\x6c\x1d\xe5\x8d\x7b\xe4\x8d\xb8\x11\x65\x19\x27\xd8\x39\xb4\x75\x36\x9f\xb1\x81\x58\x14\xc7\xe5\xf0\x0b\x72\x1c\x37\xcc\x38\xa6\x0f\xd2\xc7\xb8\x0a\xb7\x91\x3b\x97\xbb\x99\x7b\x3d\x77\x2f\xf7\x66\xee\xed\xdc\x23\xdc\x93\x8c\x6d\xfa\x1c\x73\x7e\xff\x29\xf7\x4b\xee\x37\xfd\x99\xc5\x94\xa8\x6c\x6a\xf1\x3c\x59\x26\x47\xc9\x71\x72\x25\x79\xe0\x95\x2a\xef\xdf\xf4\x7d\x22\xfe\x27\xf9\x02\x79\x96\x3c\x4f\xbe\xcf\xf4\xd2\x2a\x13\x37\xc7\xec\x30\x06\x9a\x6d\x53\x43\x48\x12\x1f\x3b\x6e\xc7\x8d\x29\x6e\xc7\x63\x46\x37\x7a\x98\x7f\xa6\x54\xc3\x0c\xcc\x76\x44\xf0\xb7\x59\x2d\xb6\x3b\x4b\xc2\xfb\x96\xe9\x95\x75\x8d\xa2\xe5\xbb\xbe\xeb\x8d\x92\xae\xd7\x89\x42\x76\x34\xf7\x24\x1a\x4c\xcb\xd8\xeb\xed\x08\xbb\x7a\xbe\x63\xf7\x09\x9f\x4c\x63\x1c\xb9\x20\x38\xb6\x69\x98\x7a\x18\xf3\xa2\xb1\x82\xfd\xd1\xbf\x9e\x19\x46\xd3\x88\x7a\xd6\xde\x40\xec\x51\x62\xa3\xdd\x69\x12\xab\xef\x75\xe6\xbe\x32\x2c\xb1\x1d\x4d\x12\x41\xaf\x0f\x60\x59\xcd\x33\x1a\x2c\x82\x46\x34\x8d\xdc\x77\xec\x24\x61\x61\x2c\x49\x22\x8d\x91\xee\xb9\x78\x56\x50\x6a\x8d\x12\x9f\xe9\xba\x1d\xec\x9b\x95\xd9\x5e\x34\xa0\x38\x88\x8c\xca\xfb\x93\x78\xed\x70\x2d\x8a\x68\x77\x25\xa2\x3b\xcc\xdb\x22\x72\xb2\xb0\xf5\xf6\xab\x08\xd7\x0f\x81\xaa\x61\xfa\x68\x76\xfd\xc0\xef\x8c\x12\xdb\xea\x4f\x76\x8c\xe6\xe4\x98\xfe\xab\x2f\x34\x74\xaf\x83\x7d\x85\x37\x23\xa7\x46\xac\x12\x34\x5f\xa1\x97\x50\x33\xd2\x4f\x44\x84\xb9\x28\x11\x88\xe8\x71\x7a\xa0\xf7\xad\xed\xd9\x38\x33\xdf\xb5\x19\x96\x26\xd7\x57\xfe\x72\x97\x04\x30\xb2\x68\x7d\x43\x90\xb4\x47\x5a\x0f\xfd\x93\xb5\xef\xf8\x83\x78\xac\x92\xab\x87\xb8\xea\x41\xf5\x33\xa8\xbd\x70\x77\xfe\xfe\x4f\x2e\xd6\xe5\x37\xbd\xf7\x9f\x5a\xe7\x1c\x6d\xfa\x44\xe8\xfd\xe4\x73\x3e\x02\x80\x56\x7d\x6b\x7e\x46\x1b\x45\xbf\x32\x02\x8b\x1a\x82\x0c\x23\xf1\x39\xb4\x70\x06\xdd\xe3\x5b\x2f\x5d\xd0\x66\x8e\x6d\xd5\x4c\x4f\x9b\xd1\xba\xea\x97\xb2\xc6\x68\xef\x0f\xf4\xc0\x7e\x09\xf7\xef\xc2\x2d\xb2\x24\x81\x8c\x37\xbf\x27\x52\x59\xe3\xae\xd7\x8e\x1c\xde\x85\xca\xc6\x19\xdf\x97\x51\xc3\x8e\x1d\x6b\xa0\x94\x93\x65\x40\x5c\x7b\x41\x96\x24\xf2\x5d\x51\x46\x69\x28\x25\xa0\x56\x97\x34\x94\xb0\x92\x12\x40\xaa\x63\x22\x21\xcf\x68\xb8\xf6\xe3\x37\x54\x2e\x3b\xf7\xef\x4f\xa4\xad\x91\xd5\xad\xd2\xfc\xb9\x85\x79\xad\x65\x48\x8b\x33\x39\x44\x09\x41\x1b\x91\x66\x34\x4d\x43\x1f\xe5\xbb\x47\x67\xf2\x08\xb0\xb8\xf8\xda\x75\xc5\x99\x5d\xbb\x2c\xc8\xa4\x00\x11\x34\xc4\x63\x64\x72\xa0\xf8\xbb\xfa\xcf\xf0\x36\x7f\xb4\x72\xcc\x1f\xd5\x24\xac\xe7\xf3\x39\xb9\x0e\xa8\x8d\xc2\x2e\x59\x26\x6f\x93\xea\x28\x43\x5d\xd2\x60\x46\x43\xf4\x25\x4d\xc2\xde\x5d\xdd\x51\xad\xaa\xc8\xdd\x7c\x3d\x3f\x9a\xd7\xb3\x5a\x6e\x24\x5f\xa9\x7f\x52\x93\xa4\xcb\xb0\x52\x47\xac\xc8\xb2\x66\x69\xb9\x1c\x7d\xac\xf7\xfb\xe2\x94\x84\xf8\x17\x4e\x87\x2b\x57\x4e\xde\xf5\x37\xbb\x3b\x16\xca\xb2\xa4\xad\xc6\x14\xf2\x83\x0f\x1c\x9f\x0d\x0f\x14\x01\x1f\xea\xb5\x7a\x72\x3e\x8f\xf8\x95\x8d\xc3\xb7\x1f\x39\x17\x25\x34\x5a\x17\x5c\x55\xb9\xf6\x81\xfc\xec\x8f\xae\xbb\xa1\xde\xbd\x5a\xb6\xb4\xcf\x77\xc5\x19\x58\x9f\x93\x66\x71\x3c\xbb\x88\xab\x28\xaf\xca\x27\x61\xe9\x08\xde\x8e\x12\xae\xe2\x56\x94\x57\x47\x1a\xd8\x2c\xad\x62\xd2\x95\x1a\x22\x16\xf7\xe6\x8f\x8c\x49\x79\x44\x67\xb7\xb5\x1f\xb7\x4a\x15\x1d\xba\x38\xf4\x90\x95\x07\xc8\x6f\xd3\xce\x51\xa5\x51\x19\x57\xa1\x3b\x34\x8a\x5a\x5e\xdb\x93\xd9\xaa\x69\x79\x2d\x5f\xc7\x70\x91\xb1\x8a\x03\x80\x96\x55\x87\x31\x6b\x08\x87\x50\xae\xe3\xa8\x86\x98\x47\x44\xed\xf6\xf7\x39\x07\xf7\xaf\xaf\xeb\x2f\x7f\x4c\x5a\x9a\xc5\xc3\xc7\x25\x5c\x02\x58\x92\x36\x86\xd8\x1a\xba\xb3\x58\xef\xe2\x58\x1d\xbb\x72\xbb\x04\x00\x4b\xd8\x11\x46\x97\x70\x09\x53\x3b\x30\x8f\x75\x80\x70\x29\x96\xae\xc1\x2e\xca\x12\x6a\xdf\x2e\xec\x43\x3c\xdf\x80\x45\x79\x11\x87\xd0\xca\x36\x50\xc3\xbc\xac\xc1\x58\x08\x88\xd1\x2e\x6f\xa6\xd2\x07\x10\xc3\xd5\x0c\x51\x63\x32\x7d\xd0\xf3\x72\x78\xc2\x16\x71\x66\x36\xa2\xdd\x75\xd1\x4d\x5a\xd2\x68\x17\x65\xd4\x24\x59\xc7\x7a\x25\x8f\x16\x6a\x79\xce\xed\xc7\xc7\xb7\x70\x1e\x77\x1e\x77\x9c\x7b\xcd\xff\xcf\xd4\x9b\xc0\x37\x72\x96\xf7\xe3\x7a\x25\xbd\xcf\x6b\x6b\xde\x91\x34\xe7\x3b\xba\x8f\x91\x66\xac\xcb\xb2\x35\x1a\x8d\x7c\x6b\xed\x5d\xef\x7a\x77\xbd\x47\xf6\x48\xb2\x21\x9b\x7b\x73\x90\x63\xc9\x41\x2e\x02\x1b\x42\x12\xd2\x24\x24\x84\x86\x90\x34\x49\x49\xa0\x21\x94\x84\x70\x24\x14\x7e\x0d\x47\x5b\x0a\x94\xb3\x85\x02\x25\x14\x0a\x14\xda\x02\x2d\x4d\x4a\x69\xf9\x93\xb5\xf8\x7f\xe6\x1d\x39\x5b\xaf\xbd\x96\x25\x6b\x34\x33\xd6\x3c\xef\x73\x7c\x8f\xd0\x1b\x43\x37\x85\xde\x1c\xba\x2d\xf4\x07\xa1\xfb\x43\x0f\x86\xde\x17\xfa\x60\xe8\xb9\xd0\x0b\x5c\x55\xe2\xf3\x1c\x99\xff\xb7\xa1\xef\xf0\x2c\xf7\x5f\x42\xbf\x0c\xfd\x16\x61\x44\x91\x8c\xb2\xa8\xcc\xe7\xee\x01\xb7\x6a\x0b\x5a\xe5\x33\x2e\x5d\x23\xcc\x2c\x6b\xb6\x09\xc4\x8d\x6a\x40\x92\x81\x89\xa1\xc7\x3c\x0d\x4c\x62\xab\x7e\x0d\xdf\xb5\x2d\xdb\x6a\x87\x7b\x5e\x6f\x09\x11\x7b\xd3\xeb\xd0\x0f\x15\xbd\x05\xc4\x25\x1c\x8b\xb6\x65\xbb\x3d\x6e\x05\xd6\x73\xbc\x8e\x6b\x99\xe5\x02\x1a\xb9\xb3\x06\xae\x53\xb6\x49\xfc\x80\x61\x77\x34\x8f\x0b\x29\x06\x0e\x0d\xdd\x60\xf2\x32\x2a\xe7\xad\x80\x84\x1d\x50\xbf\x47\xf1\x82\x05\x09\x64\xd0\x27\xf0\xd3\xe4\x91\x15\x7b\x30\x20\xef\xf9\xe1\xcd\x73\x95\x11\xc0\x84\x07\x21\xee\x1d\xe1\x71\x3c\x4a\x90\x28\x17\x10\x61\x96\x9f\x02\x7a\x0e\x1f\x5c\x69\x36\xd6\xb9\x36\x70\xd7\xb4\x5d\xc7\xc2\x01\xd4\x85\x6c\x3a\x0f\xba\xa6\xeb\x8d\x32\x51\x4e\xd4\xb4\x5c\xd3\x1b\xd1\xd6\xfd\x7d\x74\x46\xa6\x83\x3c\xe0\x73\xc3\xae\xb0\xf3\xdc\x82\x01\x20\x17\x8e\x9c\x53\x1a\xfe\xc2\xa0\x5f\xbb\xfa\x70\xc1\x80\x77\x9e\x25\x2b\xf5\x1d\xf0\x91\x1d\x50\x78\xe1\xa6\xca\x62\x72\x81\x1a\xde\xb5\x5f\xb8\xe6\x58\xea\xbb\xad\x95\x9b\xee\x7d\x02\x0a\xf9\xbf\x57\x68\x7d\x61\xf8\xf9\x8b\x1a\x46\x38\x06\xd7\xdc\xf4\x17\xb0\x12\x3d\x7b\xdb\xaf\xaa\x55\x58\x80\x92\x1e\x94\x84\x09\x9d\x3b\x35\x05\x9a\x52\xcb\x86\x9c\x9f\x4e\xc4\x8c\x31\x7d\x5e\xa6\x63\xf7\xd1\xea\xb8\x7e\x8d\x5f\x6d\xca\xb4\x2a\x57\x0b\x72\x9e\xd2\xbb\x65\xc3\x58\x30\x52\x22\x5d\x96\xf3\x72\x4f\x96\xe5\xbc\x48\x0c\x5a\x00\x79\x01\xe0\x62\x4a\xc3\x4b\x74\x25\xd7\x9c\xa6\xb0\x50\x85\xea\xc6\x8d\x46\xbd\x59\xac\x43\x75\x36\xcc\xed\xa0\x8c\x3a\x6c\xfc\x6f\x2e\x0d\x15\x19\xc0\x40\x4f\x27\xe3\x60\x54\xbc\x06\x14\x86\xd7\x4f\x94\x52\x90\xd6\xd1\xf6\x78\x59\xae\x0f\xbf\xe2\xe5\x2b\xf2\x4b\x06\xc0\xc5\x75\x39\x3d\x56\x35\xaa\x1f\xac\x17\x1a\x72\xb5\x5e\xb9\xc6\xaf\x26\xf1\x7d\xf1\xa9\x23\x99\xad\x9a\x46\x84\x24\xb9\xe1\xe8\xfc\xdd\xc3\xff\x39\xcb\x4f\xaf\xce\x25\xda\x6d\x35\xa2\xe4\x48\x9c\xe6\xda\x07\x6f\x17\x7e\xf1\xf1\xff\xbe\xe3\x33\x7b\x6a\xd7\x69\xd7\xbe\xed\xf1\x2f\x66\xbf\xf4\xb5\x37\x11\x12\xcf\xd4\x55\x42\xe2\xcf\xcc\xbc\xcf\xbc\x98\x90\xcb\x7e\x74\x17\xf1\x6a\xea\xb6\x1a\x39\xad\xbc\x2d\xee\xc5\xe3\x5a\x9c\x64\x16\x49\x4d\xf3\x6f\x8b\xa2\xea\x55\x65\x32\x45\xb2\x22\xa9\x91\x2c\xaa\x91\x9a\x46\x88\x68\xc6\x35\xb1\x16\xaf\x11\x26\x93\x42\x44\x8d\xd7\x88\x58\xaf\xd7\x62\x42\xad\x4c\xea\xc4\x9b\x2a\x93\xa9\x6c\x59\x13\x62\xe5\xa9\x0c\x81\x8d\xf7\x89\xdb\x48\x4d\xd3\xdb\xf1\xc9\x54\x7c\x31\x3b\x45\x54\x93\x90\xc5\x6d\xd9\x45\x88\x9f\xe6\x47\x72\x92\x8d\xc7\x45\x00\x98\xf6\x73\xf5\x00\x1e\x56\x86\x7a\x9c\xd4\xc8\x14\xd9\x16\xe7\x5a\x1a\x64\x8a\x78\x64\x5b\x3b\xb1\xe9\x03\xbe\x18\xf7\x16\x89\x47\x16\x17\x27\x93\x8b\x6a\x36\x9e\x09\x8d\x78\xda\x91\xdb\xf0\x7d\x21\x16\x6a\x86\x56\x43\x3b\x43\x67\x87\xce\x0b\x5d\x12\xba\x36\x74\x63\xe8\x96\xd0\x23\xa1\xe7\x42\xcf\x87\x3e\x19\x7a\x91\xcf\xb5\xbf\x34\x42\x91\xfd\x8a\xb3\x68\x02\x57\xea\xc0\x8f\xba\xc1\x19\x34\x7e\x65\xba\x93\xfb\x97\x5e\x80\x2e\xe3\xde\x36\xb7\xa0\xdb\xd0\xdb\xd1\x3d\xa1\x90\xd2\x61\x3a\xd3\x59\x12\xf9\x19\x8d\xe5\x57\x80\x11\xcf\xee\x2c\xa1\x1c\xd2\x15\x99\x55\xbc\x5e\xe0\x4f\x66\xb5\x11\x71\x49\x01\xe9\x92\xbf\x58\xf1\x46\x9f\xed\xd9\xae\xed\x45\x1c\xdb\xf5\x6c\x3f\x1d\xe0\xd4\x3d\xcf\x51\x19\x9f\xdf\xfa\x4b\xbc\xc6\x75\x13\xbc\x02\xf2\xab\xad\x12\x9f\xaa\x06\x52\x85\x9e\x56\x40\x16\x73\x98\x86\x35\x87\x69\xc4\xd6\x14\x27\xb0\xc4\x71\x3a\x7e\xb6\xc4\x77\xa3\x8d\x88\xd6\x61\xa7\xb4\xb1\x3a\x41\xcd\x56\xf5\x2f\x52\xee\x30\xc7\x34\x9b\x39\xcc\x9c\x43\xc1\x57\xc0\x85\xf1\xbf\x33\xad\xca\x8d\x0e\x02\xb5\x2b\xa7\xc3\x46\x76\xce\x5c\x7a\x86\x0b\x58\x6b\x66\x80\x96\x75\x47\x10\x1a\x12\x00\x7a\x89\xca\xcc\x91\x09\x6a\xa0\x58\xd5\xb5\x47\x9c\x49\xcd\xc3\x9a\x07\x24\x10\x62\x1c\xd5\x6e\x81\xa4\x8d\xbf\xdf\x1e\xa7\x6e\x9b\x84\x5f\xd0\x44\x73\x54\xbf\x6c\xe4\xcd\xc5\xe0\x11\x32\xb2\x8a\x56\xfd\xc0\x11\x64\x58\x56\x90\xae\x10\xee\x30\xe3\x87\x31\xee\x70\xfd\xcb\x7f\xfc\xc1\xa3\x85\x3c\x0c\xff\xe1\xea\x95\xbf\xa0\x4b\x36\x78\x3d\x90\x29\x54\x64\xaf\x56\x40\x85\x67\x9e\x8b\x25\x48\xe3\xc8\xd4\x7f\xfd\x79\x1d\xde\xf9\xe7\x1b\xef\xbc\xf3\x33\x4a\x3e\x0f\x90\x07\x19\xa0\x0e\x00\xd4\xce\x50\x7a\xc8\x00\xb8\xa2\xb3\xa5\xb7\xa7\x22\x35\xb6\x4d\x96\xca\x37\xac\x19\x3d\x18\xbe\x0c\xb0\x77\x8d\x2e\xa4\x7e\xb4\x47\xee\xdc\x0a\x74\xf8\xb6\x4a\x7e\x4a\xae\x04\xc4\x9c\xd3\xfe\x78\x21\x9e\x84\x83\x27\x2e\xbf\x46\x77\x60\x65\x2f\xc0\x9a\xbc\x02\x80\xc6\xe5\x85\xc9\x9f\xc8\x72\x7e\x7a\x7a\x2f\xe7\xc7\xc8\xdc\xc4\x4d\xa6\x54\x06\xff\x9f\x38\x3c\x27\x31\x0e\xa0\xba\x6b\x10\x77\xfd\x3d\x00\x0f\x1a\x56\x8e\x52\x68\xd0\x6c\x24\x5c\xf0\xc3\xce\xc6\xbf\xee\x15\xe7\x93\x4b\x63\x5b\x20\x45\xa7\xf2\x79\x90\x97\x61\x7e\xaf\x02\x06\x35\x40\x46\x6f\x34\x0c\x99\x56\x94\xc2\x34\x9d\xa2\x20\xcb\x53\x32\x18\xfe\x56\xfc\x03\x91\x8d\x3a\xa5\x34\x11\x59\x48\x91\x82\x0c\x4a\xcf\x00\x59\x86\x79\x19\xa8\x2c\x2f\x1b\xc6\x98\xbe\x52\x30\xe8\x9a\x9c\x2a\xd4\xc7\xc7\x0d\xa3\x42\xf1\x7d\xc7\xef\x7d\xcf\x5b\xde\x34\xfc\xf2\xf0\x67\xdb\x6a\x9d\xf8\xbe\x14\x21\xdf\x88\x5c\x90\xbd\x65\x5a\x5b\x22\xb7\x6c\x90\xe1\xcf\xcd\xf9\xc7\x1e\xfa\xcf\x3b\x29\xf9\xe6\x81\xb5\x35\xff\x7a\xeb\xd7\x9e\x1c\xbe\xf2\xd7\xcf\xbe\xbd\x45\x4c\x92\x35\xff\x49\xcb\x12\xf4\x24\x21\xe4\x57\xb5\x6d\x24\xae\xd1\xc3\x44\x49\x5e\xbf\x1a\x3f\x48\x96\xe2\x67\x65\xe3\xfd\xd5\xeb\x09\x39\xc8\x2d\xe3\xe3\x67\x69\x07\xfb\x64\x45\x22\x6f\x26\xd7\xfb\xe5\x48\x70\xe9\x0e\xff\xb4\xfc\x23\xff\xfa\x7d\xf1\xcd\xe7\x1d\xcc\x63\x42\xde\x58\xd7\x34\xf3\xc0\xb6\x78\x61\x8d\x90\x55\x73\x55\x23\x84\xdc\xd0\x1b\x2c\x90\x73\x98\xff\x94\xb8\x16\xd7\xfc\x8c\x4e\xf3\x9f\x1d\x7f\x9a\x4c\x69\xd3\x9a\xb9\xe8\x2d\x4b\xa4\x3e\x6d\x6a\xf3\x45\x32\x6d\x08\x71\xbf\x02\x23\xe4\x48\x76\x35\xde\xd1\xcd\x7e\x3c\xed\x4c\xaf\x67\x33\x7d\x42\xea\x84\xc8\xb3\x75\x52\xf1\x2e\x55\xb9\xdf\xff\x2a\xc9\x0a\x46\x3c\xce\x41\xa8\xfe\x96\xe3\x24\x6b\x92\xd1\x7e\x65\x89\x46\x4c\x2d\xae\x8a\xd9\xac\xc8\x6b\x27\x20\x2a\x31\x35\xcc\x38\x98\x80\xd4\x35\xb3\x1e\xaf\x13\x92\xd5\xb2\xc4\xd4\xb2\x75\xff\x37\x42\xa1\xd0\x0c\x8f\x39\xdb\xf1\x7d\xa1\x5b\x47\xfa\x33\xdf\x08\x7d\x9b\x33\x6e\xfe\x2d\xf4\xab\x51\xed\x44\x78\xe5\x54\x7d\xcd\x33\xeb\x00\x3a\x83\xbb\x8a\x5e\x8d\x6e\xe4\xfa\x33\xf7\xa2\x07\xb8\x27\xc9\x53\xe8\xc3\xe8\x79\xee\x75\xff\x65\xf4\x3d\xf4\x03\xf4\xcf\xe8\x5f\xc3\x89\x70\x36\x5c\x0e\xdb\xe1\x66\xf8\xb4\xf0\x45\xe1\xcb\xc2\x37\x86\xdf\x1c\xbe\x95\xfb\x89\xde\x1b\x0a\x21\xd6\x09\x1c\x34\x1c\xe0\x6a\x11\x2e\x77\xcd\x34\xb5\xe0\xda\x72\x89\xc9\x47\x84\x81\x9d\x3d\xd7\x49\x60\x9e\xae\x99\x1a\x33\x5d\x53\x35\x47\xda\x0c\xd0\x40\xfe\xad\x04\x62\x55\xc7\x63\x1d\x96\x40\xa3\x47\x48\xd7\x0c\x3a\x60\xc1\xa6\x08\xa7\xf1\x84\x23\x9e\x63\x07\xaa\xae\x3d\x3f\x1f\xe1\xdb\x55\x15\xb5\x80\xb0\x67\x93\x32\x2e\x73\x13\x61\xd7\x63\x9e\x53\x75\xdb\x61\x7f\x63\x9e\xb5\x80\xfc\x64\x85\x69\x5e\x29\xb0\x9e\xe4\x82\x80\xfe\x76\xb1\xca\x46\xe6\x95\x41\x92\xa1\x05\x33\x01\x4e\x85\xf6\xaa\x7e\xb9\x14\xe8\x38\x3b\x7e\x81\x68\x3b\xfa\x1c\xea\x06\xbe\xf3\x41\xef\xab\x1b\xe8\x33\x07\x0e\x28\xfa\xa6\xa7\xe6\xc8\x50\xcb\x61\x1d\x97\x6b\xfb\x55\x39\x95\x7a\xb3\xe8\x63\xa3\xbe\x59\x97\x7b\xf8\x3b\x9a\xed\xf1\xe6\x1a\xe3\x8e\x00\x41\x2f\x90\xfb\x3a\x13\xce\x00\x77\x83\x31\x81\x83\x47\xba\xd3\x01\xc0\x2f\x48\x9f\x46\xd2\xd1\x23\xcc\x5f\x37\x18\x33\xfc\x1f\xd9\x68\xcb\xcf\xc0\x9c\xae\x5f\x33\x75\xb8\x62\x4f\xf0\x18\xff\x9f\xdf\x4f\x02\x0a\x93\xcd\x1c\x7d\x64\x52\x3a\x52\x27\xb4\xb8\x0f\x74\x90\xfe\x10\x8d\xe3\x76\x9c\x51\x7d\xe7\xaf\x12\xbc\x19\xc7\x46\xc0\x19\xd7\x0b\xcc\x4e\x1d\xe6\x58\x7e\x32\xe5\xbf\xae\xae\xd9\xa4\x5b\x0a\x4a\x37\xfd\x94\x8b\xb4\xb7\x59\x65\x6e\xda\xc8\x04\x66\xd2\x81\x7f\x0c\x67\x30\xba\x84\x7b\x3c\xf3\xb2\x9a\xf1\x07\xcc\xc0\x73\x8b\x1f\x9c\x37\x72\x25\x33\x35\x4e\x05\x33\xb9\x6c\x37\x97\xe6\xb5\x1d\xcd\x71\xc3\x63\x9f\x89\x2d\xc1\x84\x20\x48\x36\x48\xf0\x28\x94\x74\x5d\xc2\x58\xca\x82\x8d\x01\x92\x80\xe1\x01\x0c\x49\x2a\xd9\x27\xef\x70\x2e\x14\x24\x01\x24\x0c\x60\xeb\x80\x0f\xad\x03\x60\x49\xff\x36\x30\x74\x3d\x66\x7b\xe2\xa9\x4e\xf9\x4c\xff\x09\x90\xc9\x4a\x52\x19\x67\x75\x00\x9c\x85\x85\x3b\xb1\x54\x71\x05\xc9\xdf\x18\x16\xb0\x10\x33\x56\x56\xee\xff\x74\xd6\x06\x58\x90\xb2\x88\xbc\x02\xd2\x65\xc3\x8f\x94\x18\x40\x4b\xca\x96\xd0\xe3\xf8\x1e\xc0\x27\x6f\xce\x0a\x92\x90\xc8\x43\x16\x21\x1d\x84\xe3\x07\x05\x00\x38\x21\x65\x1f\x42\x6f\xed\x63\x6f\x41\x10\x16\x3a\xb8\x83\x4b\x80\x6d\x41\x48\x88\x18\xf0\xc6\xfb\x1d\xdc\x14\x3a\xad\x15\x7d\x9a\x64\xa5\x95\xe4\xaa\xaa\xaf\xb0\xbe\x2e\xf4\xa5\x4e\xb9\x2f\x89\x8d\x6c\x3f\xb9\x98\xed\x2c\x64\x01\x67\x3b\x6b\x18\xce\xdc\x9a\xec\xd3\x85\xac\x7d\x2b\xb4\x86\x15\x07\x5a\x00\x2b\xfd\xb2\x8d\x5b\x20\xe0\x22\xea\x64\xb3\x36\x15\xd8\xf0\xc1\x85\xfe\x84\xde\x87\x64\xb8\x00\xd0\x81\x56\x19\x43\x47\x48\xc2\xc6\x57\x04\x21\x1c\x87\x7e\x73\xaf\xd0\x92\x88\x27\xad\x08\xde\x11\xa1\xa5\xf7\x2f\x8c\xe7\x59\xa7\x94\x2d\xb7\x1e\xb2\xb3\x2d\x49\xac\xb2\x8c\x79\x8f\x5c\xca\xb6\x74\x5b\x93\xb3\x62\xf1\x66\xbb\xd5\xb9\xd5\x6e\xe1\x09\x47\xd2\xf5\x56\x0b\x6b\x74\x41\x60\xc7\x05\xec\x75\x04\x86\x9b\xb8\xd3\x6c\xc2\x58\x55\x1a\x43\x3f\x45\x31\x28\x97\x25\xc0\x20\x31\x6e\xab\x00\x42\x13\xb7\x6c\x28\x41\x7c\xe3\x8c\x5a\x11\x97\x4b\xe5\x6c\x0b\xc2\x53\x12\x96\x74\x81\x65\x87\x29\xbb\x2c\x94\xf5\x32\x2e\x27\x29\x34\x59\x16\xb7\x18\x05\x41\x28\x03\x94\x00\x24\x90\x58\xc9\x96\x2e\xcb\x72\xb3\x46\x21\x0b\x3a\x63\x3a\xe0\x6c\x52\x92\x98\x20\x00\xce\xfa\x9b\xc7\xac\x4f\xb3\xe3\x63\x25\xe9\x65\x41\x2a\x09\x4f\x02\xbe\x8f\x1c\x24\x75\x4d\xdb\x7b\xae\x16\x27\x3a\x21\x09\x92\x18\x0b\x5c\xa7\xc7\xc6\xc6\xc6\x12\x84\xe8\x3f\x8a\x93\xf8\xc5\x5b\xb2\xf5\xf8\xa5\xfc\x7e\x3f\xc4\x66\xb5\x27\x4d\xb2\x3e\xfd\xf9\x91\xab\x75\xfc\x35\x7f\xeb\x78\x7c\xeb\xac\x86\x6e\x41\x5f\x25\x1a\x8a\xd6\x09\xa9\xa7\x62\x71\xed\x2c\x42\xcc\x5b\x37\xd6\x3f\x7b\x84\xc4\xb5\x83\xc4\x3c\xfe\x87\x67\x11\x42\xa6\x09\x31\xeb\x26\x8f\xe6\xe6\xa5\xc7\xef\xd0\xb2\xe6\x6b\x1b\xe3\xf1\x9f\x74\x27\xe3\x07\xeb\x24\xae\x2d\x65\xfb\xd3\xf1\x69\xad\x9e\xd5\xc8\x34\xa9\xc7\xb5\xfa\xac\x72\x50\x5b\xf2\x72\x84\x1c\x3c\x4b\x5e\xdb\xa1\xc4\xd7\x07\x2a\x91\xe7\xc8\xea\xfa\xc1\x55\xd2\xcf\x12\x42\xe6\x0d\x42\xce\x5a\x5f\x8f\xaf\x6b\x7d\x62\x6a\xdb\x3b\x39\x42\xb2\x2d\x97\x1c\x24\x26\xe9\x37\x54\x2d\x4b\xe2\xdb\xfb\x09\x32\x96\x38\xa8\xad\x6b\x59\xa2\x6c\x21\xca\x38\xc9\x12\x33\x4b\xc8\xfa\x52\xb6\x4f\x4c\x73\x3a\x5e\x8f\x9b\xd9\xa5\xec\x92\x19\xef\xab\x1d\xb2\x14\xef\x13\xd2\x5f\x8a\x93\x69\x42\x9b\x64\xba\x4f\x6a\x3a\xe9\x93\xfe\x92\x36\x2d\x4d\x92\x3e\x21\x69\x46\xa6\xe3\xa4\x4f\x3a\x6a\x9c\x48\x93\xfe\xda\x65\x9a\x24\x9e\x25\xf5\x38\xd1\xfa\x24\xde\xd7\xb4\x72\xee\x78\x7c\x26\x47\xc8\x4c\x9c\x8d\x67\xb3\xd3\xf1\x69\xa2\x4d\xfb\x4b\x93\xbf\x56\x12\x2d\xae\x11\xcd\x5f\xb9\xcc\x7e\xdd\xbf\xbb\x72\xc7\x41\x42\xd6\x2b\x99\x3e\x3f\xd5\x84\xa4\x62\x24\x4b\x56\x49\x25\xb3\x44\xe2\xd9\x7a\x3c\x1e\xaf\x13\x8d\x44\x8a\x9b\xe7\x3d\xcb\x4f\xbb\xc6\x97\xc9\x78\xdc\xdf\xa6\x49\xb4\x2c\x5f\x28\x35\x42\x34\x2d\x9b\xd5\xb4\xe0\xb1\xf8\x48\x87\x31\xf2\x30\xbe\x2f\x74\x69\xe8\xc6\xd0\x13\xa1\xa7\x42\x1f\x0e\xbd\xc8\x6b\xe2\x7f\x1e\x65\xd6\x89\xd1\x0c\xdd\xcf\xaf\x27\xd1\x1c\x5a\x44\x2b\x68\x0d\xad\xa3\xfd\xe8\x0c\x74\x36\xba\x00\xdd\x88\x4e\xa0\x3f\x40\xf7\xa1\x07\xd1\xc3\x23\xbd\x91\x2f\xa0\x6f\xa3\x97\xb8\xe2\xc8\x2f\xd0\xff\x86\x23\xe1\x78\x58\x0e\xeb\x9c\xcd\xc6\x8d\x21\x49\xe0\x3b\xed\xf8\x2b\x1b\xe1\x92\x87\x7c\xb0\xc1\xc9\xa4\x9c\x37\xaa\x3b\x3a\x53\x4d\x06\x58\xe5\xf6\x07\x81\xd0\x07\xc7\x94\x9a\xda\x6b\x9e\xd5\x2c\xf0\xf1\x0a\x16\xc8\x40\xb6\xc4\x74\xc3\x12\xf7\xe0\xc2\x9a\xae\x95\x47\x72\xaf\x7c\xad\x30\xfd\xf5\x94\x11\x55\x71\x7a\x6e\x37\xe2\x76\xab\x7e\x40\xb5\xa3\x26\x77\xb6\xf6\xc2\x66\x6f\x0e\x61\x8f\x6d\x5a\xf8\x73\x51\xb4\xd7\x5c\xb6\xbc\xc0\xe7\x51\x0f\xfc\x0e\x37\xe7\xd4\xfe\x7d\x1c\x4d\x4e\xbc\x40\x98\x3b\x80\x99\x33\xdb\xdc\x1c\xef\x04\xcb\x1a\x37\xef\x76\x5c\xab\x81\x00\x33\xb7\xec\x06\xc5\xbb\x5b\x65\x9c\x87\xee\x59\x9b\xd8\x73\xe6\x7a\xba\x9f\x6e\x33\xd7\x3e\x65\xeb\x38\x6a\x61\x7a\x7c\xa7\xf0\xa6\x1f\x97\xed\x92\xc0\x27\x39\x58\x74\x5d\xcb\x1b\xed\x80\xe7\x72\x1f\x05\x8d\xd8\xae\xbf\x46\xf1\x8e\x02\xa7\x07\xf2\x9d\x73\x5e\xb3\xa4\x1c\x15\x08\x7c\xe0\x64\x97\x98\x1b\xcc\x7c\x48\xc0\xc2\xf5\xf8\xba\xc9\x8f\x94\x37\x13\x46\xae\x10\x81\x9e\xed\xc8\x63\x32\xc0\xb0\xfa\x67\xc2\x73\xc9\xa8\x31\x1b\x80\x61\x1d\x6e\x12\xe1\x67\x24\xf6\xe8\x37\xf8\x62\xd8\x09\x3c\x33\x79\x43\x62\xb4\xe0\xd9\x1e\xd3\xca\x36\xd3\xec\xf0\x39\x7f\x79\x03\x29\xf1\x37\x6f\x46\x14\x45\xf1\x5d\xaf\xcf\xc0\xe9\x6d\x72\x38\xb0\xc7\xff\x28\xd2\x08\xc9\x27\x67\xc3\x6a\x7c\x75\xb8\xb3\x44\xb8\xe2\x24\x88\x24\x1e\xcf\x10\x20\x22\xbf\x3d\x01\xe5\x79\x20\x6d\x55\x15\xc5\x1e\x11\xcf\x26\xf3\x5f\xda\xd7\x43\x1f\x52\x45\x92\x01\x80\xb1\x21\x88\xa5\xef\x10\x72\x3a\x99\x9f\x47\x8f\x91\xd2\xd5\x64\xf8\xfd\x57\xe6\x09\x89\x8f\x53\x72\x54\x45\xc2\xb7\xc9\xbe\xd2\x78\x55\x9c\x28\x91\x3f\x6f\xa7\x4b\x6d\xd5\xa4\x22\x21\xed\x89\x0c\x89\x43\x3c\xd3\x16\x27\xb5\x0c\x90\x61\x71\x4d\x5d\x51\x27\xe6\xcb\xf3\x30\x5f\x16\xdd\x87\x61\x9f\xab\x4e\x90\xc9\x72\xb9\xad\x8a\x25\x92\x34\xd2\xc5\x78\xa6\x3d\xfc\x54\x46\x7c\x76\x3e\x33\x81\x0a\x99\xcc\xc6\x90\x94\x27\x92\x02\x01\xe8\x4d\x90\xa4\xb0\x73\xc5\x25\xf3\x44\x6d\xcf\xcf\xbb\x71\x42\xd4\xde\x44\xb8\xe2\x32\xa3\x3d\x41\xda\xed\x8c\xf8\x7a\x37\x0e\x95\x48\x5b\x9d\x10\x27\x54\x77\xf8\xb5\x69\x41\xcc\xa4\x45\x37\x33\x7f\x43\xca\x14\x27\xa1\x61\xcc\xbb\x71\x20\xae\x38\xef\xd7\xda\xe3\xb3\xea\x0a\x4c\x0e\x5f\x9a\x2f\xaf\xa0\xc7\xd5\xf8\x90\x4e\xcc\x4f\x2c\x1f\x8e\x1f\x05\x42\xfc\x53\x43\x32\xa5\xda\x9b\x5d\x75\x65\x25\xd1\x9a\x4f\x58\x13\x19\x12\xcb\x03\x94\xc6\x8d\x74\x9a\x64\x32\x24\x93\x51\x79\x84\xc8\xd2\x74\xfa\x9e\xb6\x9b\x29\x49\xc9\x56\xf6\xc2\x92\x08\x13\x24\x27\x1f\x55\x93\x56\x3c\x8e\xef\xbb\x45\x4c\xa7\x49\xe9\xb0\xc2\xa5\x28\xfd\x93\x3b\x2e\x80\x72\x41\x26\x4d\x40\xb5\xe7\x08\x99\xf4\x64\xf1\xf1\xd2\xa4\x38\x01\x64\xce\x4f\xb2\x95\x12\x11\x27\xc5\xb6\xa2\xa4\x45\x02\x13\xa5\xe5\x40\x0c\x54\x9c\x28\x02\x44\x0c\xf4\x23\x3b\x43\x08\x49\xab\x86\xae\xaa\x71\x45\x24\xb0\x56\x22\xe4\x5b\x36\xb9\xfd\xe4\x4f\x45\x71\x17\xfa\xd3\x4c\xb9\x00\xe0\x96\xe6\x40\x55\x81\x5c\x8f\xc8\x24\x28\xb0\x63\x2f\x4c\x90\x4c\x19\x52\xa6\xb8\xac\x74\x35\x57\x2c\xd6\xe2\x5b\x10\x21\x7d\x89\x28\x0a\x21\x25\x71\x72\x8e\xbf\xc6\xa5\xc4\x5f\x7d\xf6\xc9\x70\xd8\xc9\x8a\x9e\x21\xc2\x0e\x70\x4b\xe9\x39\x52\x2e\x8a\x93\x64\x9e\x2c\x87\x71\x9a\x28\xb0\x46\x1c\x8d\xa4\x49\xda\x2e\x4d\x42\xb9\x08\x84\xc0\x1c\xb1\x21\xde\x6e\x13\xd3\x21\x7b\x27\xd3\xf3\xa2\xda\x14\xc4\x65\xe2\xef\x44\x06\x48\xd3\xb1\x49\x7a\x42\x2d\x67\x95\x09\x32\x09\x45\xb2\xa3\x48\x48\xba\x54\x82\x7d\x84\xac\xe0\xa5\xa4\xb8\xec\x68\x40\xe6\xe0\x6c\x7f\x43\xd5\x69\x72\xbe\xb8\xb5\x70\xf6\x3e\x71\x5d\x87\xb3\xf9\xfb\x35\xdf\xdf\x57\x69\xc6\x61\xb5\x42\x8e\xab\x44\x14\x89\x2b\xae\x91\xd3\xd8\x05\xe4\x52\xff\xb4\x40\x26\x03\xe2\x9e\x4c\x97\x34\x4d\x95\x58\xb8\xd2\x51\x8b\xe5\x49\x22\x4f\x91\x22\xa8\x93\x62\x5c\xe1\x27\xd4\x26\xcb\x19\x2a\xa6\x6d\x32\x57\xca\x88\xa6\x50\xab\xa9\x69\xb1\x34\x01\x25\x42\x26\xa1\x44\xd4\x8c\x4b\xe6\xd2\x0a\x4c\xf8\x7f\x23\xa2\x90\x49\x67\x8c\xa8\x62\x5a\x24\xf1\x51\xff\xe4\xeb\xf8\xc6\xd0\x8d\xa1\xa7\xf8\x04\x3f\x60\x01\x7c\x8d\xa3\xa2\x7e\x16\xfa\x79\xe8\x3f\x43\xbf\xe1\xfa\xe1\x11\x44\x90\x80\x92\x48\x47\x19\xce\x03\x58\xe0\xee\x15\xbb\x79\xbf\xe4\x75\xe8\x7c\x74\x31\xba\x1c\x5d\x8d\xde\x84\xde\x8a\xee\x45\xf7\x73\xf7\xb0\xa7\xd1\xb3\xe8\xa3\xe8\x05\xf4\x29\xae\x24\x3e\x52\xba\x23\x36\x34\x90\x6b\x12\x33\x50\x15\xd1\xcc\x4d\xbd\x01\xfe\x09\xc4\x0d\x30\xff\xae\xb9\xd9\x03\x9d\x43\x1e\xeb\x2d\x20\xb3\xbc\x89\x77\x72\xbb\x55\xee\x37\x1f\x98\x8f\x8d\x3c\x1a\x81\x00\xdf\x22\x17\xa0\xeb\xb6\xc3\xdd\x36\x92\x1d\xd9\xeb\x21\x15\x07\xe2\x23\xdd\x06\xd7\x31\x27\xa6\x5f\x33\xf0\x01\x8d\x65\x5b\xae\xb5\x80\x92\x5e\xaf\xc4\x3c\xab\x81\xec\x68\x95\x77\x1b\x78\xec\x0c\x46\x4e\x7c\x34\x3f\x72\xf1\xf5\x23\x72\x30\xd0\xe7\xfa\x95\xbc\x6f\x69\xf3\x74\xd9\xe4\x22\x54\x65\xb7\x80\x1c\x3b\xc0\xc4\x57\x47\x60\x51\x93\x39\x5e\xd0\x9b\x25\x2e\x1a\xc9\x74\xb2\x53\x5e\xbb\x39\x74\x2a\x53\xe7\xd2\x26\x7c\xb0\x15\xa4\xe8\x81\x19\xa3\xed\x27\xf6\x4e\x40\x57\x72\xbb\x81\xf6\x6e\x50\x98\xe8\x1a\xa7\x2b\x30\xd3\x5f\x0f\x3a\x01\xe6\xcb\xdb\x94\xeb\xd5\x35\x2f\x88\xf1\xc4\xf4\x36\x91\x07\x5c\x3e\x8f\x97\x6a\x58\x73\xaa\x23\xf3\x09\xff\x40\xdc\xaa\x5f\xcb\x70\x31\xd3\xae\xa7\x8d\x5a\xaf\x9b\x66\xba\xe8\x6f\x1f\x97\xf1\x67\x96\x9a\x69\x2a\x44\xd3\x02\x05\x60\x79\xc0\x35\x2a\x33\x00\xd9\x04\x06\xc0\xe4\x3d\x31\x98\xf3\x73\xc6\x85\x9d\xab\x37\xdf\xb0\x15\xb7\xe5\x9b\xe1\xbc\x73\x81\x02\x08\xa7\xa1\xd7\xe7\x2f\x00\x99\x1a\x6d\x00\x0a\xf9\xb3\x8f\xbd\x5b\x86\xdc\x16\x29\x2f\x6d\xb9\xee\xba\x39\xa8\x99\x67\xff\x55\x75\xf8\x02\x8a\x9c\x7b\x48\x7e\xec\xf5\xb2\x01\x18\xe8\x65\x7f\x2e\xdf\xfa\x22\x7c\x48\x3b\xf6\x8e\xfd\xb3\xdb\x7f\x36\x87\xbc\xa3\xf8\xf2\xbd\x0f\xb7\x87\x7f\x18\xe9\x41\x0d\xdc\x1a\xb8\x26\x6d\xc3\xf0\x63\x4c\x36\x0c\x21\x4f\x41\xce\xc9\x40\x73\xd4\x60\x74\xf8\x6b\x96\x13\x72\xb2\x21\x63\xf8\x1f\x5c\x97\x24\xca\x58\x0d\x28\x1d\x9e\x49\x29\xcd\x4b\x54\xa0\x2e\xdd\x9d\x0b\x47\x29\xfd\x1a\x3d\x6a\xa6\x62\x93\xb5\x9a\x39\xfc\x6d\xdb\x10\xf2\x52\x0d\x86\x3f\xce\x51\xc0\x50\x33\xa1\x10\x33\xf2\x6d\xa3\x92\x03\xd8\x6d\xd4\xdf\x55\xcb\xb7\x91\x52\xa9\x81\x09\x27\x7f\x0f\x10\xfe\x07\xc8\x41\x74\xcc\xdc\xd8\x66\x80\x1c\x7e\x1f\xad\x88\x51\xd3\x90\x6a\x40\xb7\xc8\x35\xa0\xab\x72\x2e\x7f\xb4\x0d\x00\x54\xae\x6c\xbc\x9c\xc7\x39\xf4\x7d\x35\x09\x02\x16\xcc\xe1\x32\x45\x0f\x52\x90\x19\x93\x29\x1b\x9e\xcb\x40\xca\x03\x74\xff\x44\x32\x8c\x01\xcb\xb1\x3b\xe5\x9a\x6c\x48\x79\x19\xdf\xa8\x12\x42\x76\x94\x3b\x44\x14\xef\x13\x89\x08\x22\xf1\x43\xc1\xe6\x87\x28\x8a\x40\x40\x14\xaf\xba\xeb\xd1\x4b\x1f\xba\x69\x4e\x25\x67\xec\xb2\x15\x7f\x49\xbb\xf2\x2a\x6b\x4c\x4c\xc5\x79\xd8\x5d\x16\xf7\x5c\x25\x02\x79\xec\xe2\x43\xc1\x93\x12\x98\xd0\xcc\x9e\x37\x15\xff\xec\x7c\xf4\x61\x24\x5d\xaa\x9c\xfc\xd0\xbf\xbf\xa3\xfb\xb7\xef\x7e\x8c\x88\xa2\x0d\xb0\xe7\x87\x87\xe4\x78\x7a\xae\x55\xba\xe1\xf2\x2e\xba\xf2\xb9\x3d\xca\x25\x69\xf1\x63\xd7\xa7\x6d\x02\xaa\xba\xa5\x24\xaa\x5d\xb5\x24\xaa\x2a\x81\x12\x81\x74\x51\x21\x69\x50\xa1\x28\xaa\xa4\xa8\xa4\x8b\xe9\x12\x21\xa9\x31\x51\x25\xe9\xb4\xbf\x57\x9b\xff\xfc\x9d\xf0\x77\x5a\x1c\x3e\x42\x8a\x84\x6c\x29\xa9\x64\x72\x52\xb4\x41\xce\xda\x76\xc9\x2e\xa9\xb3\x90\x63\xdd\x2e\x74\x41\xe9\xb2\x1c\x4c\x42\x97\x74\xfd\x45\x7a\x72\x8e\x74\xd3\x93\x69\xd5\xb2\xdc\x94\xba\x43\x15\xc9\xac\xa2\xda\xb3\xe9\xb4\x5a\x4a\xb7\x8a\xb6\xff\x01\x25\x3b\x0d\x69\xc0\xd9\x34\x88\x36\xf8\xb1\x55\x24\x22\xf1\xe3\x1d\xf8\xaf\x5f\x12\xfd\x97\xf7\xf7\x35\xad\xf8\x77\xa7\x21\x91\x28\x82\x22\x25\x20\x0d\x69\xff\x47\x55\x55\xd5\x50\x68\x1b\xc7\x81\x4a\xf8\x85\xd0\x55\xa1\x6b\x11\x46\x0b\x68\xc0\x51\x9d\x17\xf2\xce\xcc\x71\x74\x1d\x7a\x13\x57\xe7\xfc\x18\xfa\x04\xfa\x0c\xfa\x4b\xf4\x15\x8e\x45\xfa\x11\xfa\x29\xf7\xe0\x79\x19\xfd\x37\xfa\x6d\x80\x4a\x0a\x8f\x85\x69\x38\x19\x9e\x08\x37\xc3\x57\x84\xdf\x10\xbe\x2e\x7c\x63\xf8\x04\xef\xcf\xdc\x1f\xfe\xc3\xf0\xfb\xc2\x1f\x08\x7f\x28\xfc\x91\xf0\xf3\xe1\x17\xc3\x9f\x0b\x7f\x31\xfc\x8d\xf0\xb7\xc2\xbf\x0b\x0f\x23\xe1\x08\x8e\x64\x22\xc5\x88\x15\xa9\x47\x9c\x88\x17\x59\x89\x1c\x8e\x9c\x15\x0a\x29\x1d\x8d\x69\x44\x57\x88\x53\x71\x3d\xd7\xf3\xb3\x36\xdb\x09\x50\xeb\x05\x3f\x35\x35\xcb\x9a\x9f\xf3\x8e\x5c\x77\x38\xfc\x49\x31\xad\x53\x22\x0a\xa6\xc6\x35\x15\x82\xe9\x76\x87\x71\x89\xbd\x72\xc4\xc4\x7c\xa3\x0c\x4c\xee\x87\x1e\x96\xf8\x36\xdb\x7e\xd6\xea\xe8\x7c\x2e\xa4\x31\x8f\xf9\x99\x33\x57\x79\x70\x47\x6e\xeb\x8e\xeb\x04\x9e\x0c\xfc\x25\x55\x47\x53\x4d\xcd\x73\x5e\xcb\x9d\x3b\xdc\x0a\x97\xef\x87\xae\xf8\x09\x61\xa4\xe7\xb0\x6a\x47\x92\xf9\x6d\x87\x67\xc5\x2e\x97\x45\x32\xf5\x1c\xe2\x79\x37\xa7\x0d\xb9\xa6\xa6\x62\xcd\xd9\x54\x32\xb5\xf9\xf6\xfc\x6f\x5d\x9e\xa5\x76\x23\x9c\xe0\x64\xea\xaf\x59\x38\x74\xfc\xc3\xe3\xc2\xc7\x1a\x61\xae\xe9\x71\xbb\x43\x87\xd9\x6e\x10\x5e\x47\x9e\x0e\xae\xed\x16\x90\x39\x02\x1e\x05\xe6\xf0\xdc\x0a\x87\x71\x6c\x80\xc7\x43\x9c\xca\xbb\xcd\x7e\xa0\xe5\xe2\xc5\xfe\xef\x13\x3f\xfe\xf2\xf4\xd4\xc6\x0e\x33\x9d\x20\x6d\x1e\x09\x54\x68\xc1\xc9\x09\xce\x6f\xe0\x6c\x6b\x76\x1d\x3b\x08\xc8\x5c\x32\x26\x10\x99\x60\x01\x2b\xdc\x0d\x22\x7a\xa0\x62\xc5\x21\xaf\x81\x64\x84\xbf\x85\x51\x6f\x6a\x53\x6f\xc2\xde\xd4\x81\xd7\x4c\x97\x9d\xb2\x47\x37\x4b\x5a\xa0\x33\x61\x8f\x78\xdf\x44\xe3\xaa\x10\xda\xc8\x63\xde\x0b\x70\x0f\x41\xcb\x0c\xdb\xa6\x36\x32\x0e\xe2\x85\x06\xdf\x61\xcb\xe5\x37\x4d\x12\xa4\xcb\x6c\x04\x31\x08\xc0\x54\x9d\x05\xd4\xd1\x9c\x8e\xbf\xbe\xf9\x6f\x16\x3f\x59\xf7\x1c\x8d\xb3\xcc\x46\x0e\x43\xfc\x8f\x52\xe2\xcb\x01\x47\x54\xf0\x03\xe0\xfe\x46\xa6\x66\x71\x28\xd6\x48\x55\xc3\x71\x03\x7d\x68\xff\x18\x46\xb6\x16\x7c\x4e\xe0\xdf\xee\xda\x25\x8d\x99\xb6\x67\x7b\xc1\x8c\x30\xf8\xdb\xf1\xf3\x17\xc8\x06\x72\x3c\x83\xca\x05\x77\x1c\xcb\x0e\x6c\xe5\xab\xa3\x33\x50\x40\x0d\xa4\xbd\x26\xef\xe1\xfa\x7b\xe4\x04\xf3\x14\xc7\xcf\xf5\xfd\xf7\xdf\xa6\x82\xbd\xc3\x9b\x88\x2c\xa8\x63\x46\x66\xc6\xd6\x08\x96\xe1\x06\x2d\x40\xaf\x3b\xf2\xd7\xf7\xec\xda\xed\x47\x61\xa2\x0d\x14\x5d\x09\x12\xf7\x5a\xac\x9d\x0e\xd7\x52\x00\x10\x28\x05\x14\xc3\x18\x0b\x00\x20\x53\xb2\x34\x18\xac\x76\xe9\x2c\x74\xf7\x0b\x58\xce\x5d\x8a\xe5\x85\x69\xcb\x82\xe1\x63\x20\x99\x39\x28\xec\x94\xf1\x75\x37\x49\x00\x39\x2a\xe1\xa7\xa1\x14\x7f\x9f\xbf\x01\x7f\x45\x13\x24\x26\x80\x24\x08\xfe\x6d\x3e\xe0\xa3\x86\x01\x20\x61\x0a\x94\xca\xfe\x92\x48\x81\xd5\x72\xdd\xd9\x09\x6c\xe6\xd0\x37\xbb\x39\xc9\x35\x65\x7f\xcd\x04\xfe\x1f\x1f\x15\xf8\x4f\x1d\x9e\xb6\x0b\x1e\x9a\x05\x0c\x00\x0f\x51\xe8\xee\xca\xb7\x73\x70\x9a\x79\x36\x40\x78\xa6\xbd\xbb\x2d\x4f\xce\xb6\xa5\x36\xde\x26\x00\x85\xb3\xa1\x8c\xf9\xf3\x61\x37\x74\x07\x03\x4a\xc3\x27\xda\x6d\x3e\xc6\x9c\x9d\x64\x40\x05\x80\xae\x24\xc9\x6d\xc0\x30\x3b\x7b\xf2\x0b\x94\xbe\x47\x10\xc2\x97\xc0\x40\x74\x6a\xb9\xc1\x86\x81\x41\x38\x7f\x37\x24\xc2\x0b\x6e\x1b\x98\x04\xed\xf6\x60\xb6\x66\xae\xf2\xb1\x05\x80\x2c\xaf\x6e\xe4\x28\xbd\x60\xb7\x38\x73\x0f\xdc\x91\x6e\xc2\xea\x05\x94\x46\xba\x94\x6e\xb8\x39\x26\x01\x94\x97\xc2\x6f\xe1\xd0\xdb\x9b\x04\xe1\x0e\x8c\x67\x29\x08\xc2\x37\x01\xfc\x5f\x78\x1f\x84\x25\xd3\x9c\x64\x0c\x9d\x10\xe0\x12\x01\x67\x52\xdd\x85\x31\x90\x84\x01\xb8\x78\xdb\xd9\x82\x30\x3c\x01\x35\x60\x42\xb9\x9b\x03\x89\xb6\x67\x0d\xb3\xc6\x84\x89\x2e\xcd\xad\xe6\x64\x41\xce\x01\x06\x19\x9b\x50\x6b\xcf\xce\x09\x90\xc7\x98\x0e\xa4\x1c\x95\x6a\xb5\xfd\x94\x6e\x7c\x53\xc2\xe1\x27\x29\x05\x78\x9e\x02\x6c\xfc\xa6\xdd\xfe\x3b\x71\x1f\xac\xa2\xc7\x00\x86\xab\xbb\x64\x59\xc8\xc4\x4d\x98\x0d\xff\x23\xa5\x27\x3f\x08\x27\xa0\x3b\xbb\x5f\x10\xf6\x9f\x86\xf7\x9f\x2e\x08\x67\xef\xa2\xfb\xc3\xcf\x0b\x82\x7f\x8e\x1f\xa3\x74\xe3\x37\x03\x69\x30\x3b\x39\x29\xf8\xa7\x1e\x4f\xf8\x07\xc4\x59\x02\xe1\x2b\x29\xfd\x7f\x94\x3e\x46\xe9\xe4\x24\xa3\xbb\xe5\x80\x68\x36\xfe\x27\x98\xd2\xb7\x60\x0a\x80\x87\xcf\x03\x84\xcd\xc9\x1c\x00\xe0\x36\x33\x4e\x74\x21\x67\xe6\xe2\xa5\x8d\xdd\xd5\x12\xd4\x60\x20\x75\x61\x20\x0d\xba\x20\x9d\x3d\xc0\x74\x16\xbf\xc0\xae\xa2\xf8\xa9\xe1\xa7\x21\xa5\x99\x47\xff\x1a\x0c\x0c\x8f\x01\xa3\x00\x27\x98\x2c\x9b\xf4\x82\xc9\x5c\x5e\x60\x00\xd7\x4d\xca\xb9\xe1\xe7\xaa\x8b\x93\xad\xd4\x2c\x2c\x4e\xc9\xb3\x30\xe1\x4a\x93\x78\x72\x8b\x24\xc3\x57\x19\xc8\xa7\xa1\x7f\x36\x01\xe0\xe3\xc3\xbf\x86\x1c\x96\x2e\x8b\x85\x6d\x14\x7e\x01\x26\xa7\xed\xd9\x13\x12\x35\xb2\x20\xb1\xda\x24\xa5\xfe\x5b\x80\x0a\x03\x4a\xe5\x9a\x50\x03\x41\x58\xf5\xdf\x76\x20\x0d\xa8\x40\x73\x20\x4b\x02\x30\x81\x52\x36\x9b\x03\xa0\x18\x76\x0c\x4f\x02\xfc\x09\xea\xcf\xe2\xee\xef\x43\xc3\x1f\xe6\xcd\x7b\x50\xe8\x53\xcf\x3d\xc7\x8c\xdb\xe7\xa0\x56\xcb\xed\xce\xdd\x33\x9b\xa3\x00\x12\x3d\x23\x67\xe2\x4d\xae\x9d\xff\x1e\xc7\x72\x8e\x3e\x8a\x9e\x03\x89\x01\xa4\x66\xf0\x04\xcc\xaf\xd1\x76\x4d\xae\x94\xb7\xd4\x72\x39\x3a\x29\xc0\xee\x5c\x5e\x62\x37\xec\x80\x1c\xd0\x3c\xd7\x6a\xc2\xad\x1d\x6d\x3a\xe0\x6f\xc6\x59\xda\xe5\x67\x1a\x9b\x03\x9a\x72\x40\x06\x6a\x0e\x40\xc6\xd2\x6c\x2d\x27\x49\xab\xee\xc4\x9c\x9f\xce\x81\x60\x48\xab\x2c\x27\x38\x55\x13\x76\x36\x64\xc6\xf6\x24\xc1\x2b\xd5\x66\xa1\x90\xc8\xe5\x04\x41\x1a\xd0\x36\xec\xc9\xec\xae\x4d\x18\x26\x3b\xc3\xc8\x99\x03\x13\xe3\xb2\xaa\x01\x05\x67\xd9\x3f\xe0\xd4\x22\xb6\xfa\x78\xd2\x30\x80\x4e\xd9\x92\xb8\x04\xd4\xbf\x12\xf2\x65\xea\xef\x32\x0c\xfc\x93\x22\x60\x7e\x29\x0a\xb9\x49\x93\x52\x41\xf0\xb3\x32\x99\x81\x09\x93\x6d\xa1\x5b\x5b\x4b\xcb\xb3\xec\x0c\x3c\xad\x0a\x17\x50\xfe\x9e\x10\x6a\x74\x20\x60\x41\x2b\xb6\x29\xcc\x9a\x8c\x26\xf3\x5d\x58\x95\xa9\x1c\x5c\xf2\x78\x80\x07\x32\xc8\xf2\x6c\x8e\xd6\x68\x8e\x4d\xfa\xd7\xbf\xe0\xbf\x3d\x04\x33\xef\x0a\x5d\x0a\x03\x58\x05\xca\x2e\xea\xc8\x70\x01\x8d\xa5\x80\x81\x50\x33\x19\x50\xda\xa5\xb3\xa6\x04\x53\xbb\xb0\xd0\x5b\xaa\x51\xc9\xd8\x05\xe5\xed\x70\x8f\x2b\xad\x82\xec\x47\xa6\x59\x46\x57\xa5\xad\xf1\x36\x0c\xfc\xab\xb1\x90\x01\x28\x57\xa4\x74\x82\xba\x13\x38\x27\x0d\x56\x41\x38\x8d\xe2\x62\x1f\xa8\x0c\xcd\x05\x09\x64\x19\x9a\x71\x28\x7a\x82\xc9\x28\xc6\x03\xa1\x06\x5d\x09\x80\xd3\x12\x31\x76\x6b\xc0\x64\xc8\x1a\xac\xa9\x02\x4c\xc2\xea\x60\x00\x09\x0f\x60\x95\xce\x86\x42\xae\x9f\x03\x85\xbf\x8b\x5f\x08\xbd\x2d\xf4\xa9\xd0\xe7\x42\x5f\xe4\xa8\xbf\x00\xab\xfd\x32\x57\x54\x11\x90\x84\x32\x9c\x89\xb7\x39\xbb\x0a\xd4\xcb\x2f\x45\x57\xf2\x99\xf8\x9b\xb9\x7b\xc2\xfd\xe8\x41\xf4\x08\x7a\x8e\xe7\x4a\x7f\x8e\x3e\xcb\x7d\xa1\x7f\x86\x7e\x8e\xfe\x03\xbd\x12\xd6\xc2\x99\x70\x33\x3c\x17\x1e\x84\xd7\xc3\x97\x85\xaf\xe2\xcc\x3d\xcf\x51\x03\x23\x29\xa6\x9a\x44\x0b\x34\x11\x80\xb7\xf5\x38\x69\x8f\x2b\xb1\x04\xc3\x6d\x9e\xe3\x6c\x36\xeb\xfc\x95\x23\xf0\x63\xd0\xf4\x02\x52\x99\xe7\xe8\x1c\xcc\xc7\xd4\x06\x02\xce\x2a\xe6\xf9\x8d\xe7\x76\x3d\xc7\x8a\x90\x51\x1d\xa9\x71\x4e\x8c\x63\xf9\x8b\x67\xd7\xf1\x5c\xe6\x31\xa7\xc2\x07\x3c\x8e\xc7\xbc\x40\x72\x8e\xb3\xc8\x35\xc2\x1d\x53\x99\xc7\xbc\xae\x49\xfc\x7a\x30\x62\xf9\x99\x92\xc7\xfc\x25\xd3\x2c\x93\xea\x68\x69\x1f\x31\xa4\x39\xd8\x99\xdb\x31\xdb\x9a\xe5\x96\x03\x22\x8d\xc3\x46\xe2\xe2\xfa\xa8\x52\x74\x83\xd1\xb5\x3b\x9a\xf4\x58\xa3\xf5\x88\x2b\x61\x05\x80\xec\x91\xbc\x54\xc0\xc1\x09\x9a\x6b\xdd\x60\xa5\x67\x5e\x1b\xf9\x2f\xef\x1f\x04\x66\x2e\x97\x32\x77\xbb\x0e\x17\x4d\xf7\x4b\x3f\xd7\x0c\xec\xf4\xb9\x7f\xb3\xed\xf9\x4f\xef\x06\xc2\x2f\x81\xf9\x54\x80\x23\x1f\x49\xd8\xb9\x1c\x0f\x60\x9d\x6a\x0c\x8e\xf4\x35\x4f\x79\xf4\x07\x4a\xc3\xa6\xce\x82\x95\xd7\x09\x16\x66\x12\xa4\x6a\xdc\x25\xcb\x76\x98\xc9\xb8\x23\x84\x16\xec\xbb\xc3\x3a\x9b\x4a\x5d\x9e\xed\xd9\x8c\xab\xba\x57\x4f\x25\x34\x7c\x49\xc7\x41\xbf\x33\xa0\x7a\x07\x48\xf8\x11\x4f\xd2\x0d\x58\x9a\x96\xe9\xfa\x25\x6c\x30\xfc\x72\xd4\x39\xc4\x05\x9c\x2d\x37\x98\x3d\x71\xef\x47\xdb\x0c\x44\x6e\x74\xc7\x26\x9c\xb9\xe9\x05\xe8\x70\x32\xd2\x2f\xdb\x2c\x51\x03\xc4\x78\xf0\x1d\x88\xee\x58\x6e\xb8\xc4\x9c\x28\x31\x22\x91\x28\x8d\x8e\xcd\x46\xa9\x10\x8d\x8e\xd5\xa3\x63\x4a\x54\x4d\x44\x63\xe1\xe8\x58\x34\x11\xf1\x3f\x12\x63\xd1\x64\x74\x2c\x1a\x4d\xd2\xe8\x58\x94\xd0\xa7\x1a\xd1\xa8\x10\x8d\x46\x33\x9d\xf3\x94\xb3\xed\x7f\x88\x8e\xad\x91\x87\x56\xd5\x4e\x74\x3d\x19\x89\x36\x12\x63\xd1\x68\x74\x5c\x8f\x0a\x05\x92\xa0\x11\x7b\x67\x24\x8a\xe2\xc3\x77\x44\xa3\x89\xef\x45\xa3\x2c\xda\xc9\x08\x63\xb3\x67\xf6\xa2\xf6\x93\x87\xc6\x12\x49\x81\xbe\xcb\x4e\xd0\x8f\xe9\xc9\x24\x8b\x46\x99\xaa\x1c\xeb\x87\xc7\xef\x7e\x19\x3d\xab\xa5\xa2\x1d\x61\x2c\xaa\x8c\x45\x13\x0a\xa5\x6c\x8c\x52\x85\x0e\x1f\x56\xfc\x27\x24\xc8\x15\x66\x32\x43\x92\x09\x9a\x11\x0c\x41\xf9\x63\x93\x46\x93\xd1\xe8\x78\xc4\x4e\xe2\x7c\x32\x1a\x29\x9b\xaa\x89\x1e\x49\x24\x55\x93\x8e\x45\xc7\xde\x12\x55\xc6\xfc\xdd\x51\x59\x74\x2c\x12\x4d\x44\xa3\x63\x34\x21\x44\x85\x28\x63\x8c\xd1\xe1\x51\x43\x42\x5e\x44\xbd\x9b\x8e\x99\x91\xe1\x8b\x42\xf4\x84\x28\xdb\xd1\x68\x3b\x1a\x35\x92\x09\xe1\xb8\x20\xac\x8d\xd5\x27\x3b\xf5\xce\x64\xa7\x3d\x6e\x31\xb5\x11\xa5\x85\x76\x84\x96\x27\xe3\xd9\xce\x78\xb5\xd3\x11\x48\x54\x19\x6b\x1b\x51\xff\xc3\x1e\x6b\x10\x62\x47\x95\x28\x8b\x8e\x45\x7f\x14\x8e\x45\x15\x4a\xa2\x91\x48\x24\x39\x16\xa5\x63\xd1\x08\x89\xda\x63\x11\x39\x1c\x55\x86\x9f\x25\x24\xa3\x28\x17\x8d\x8d\x2d\x8f\x8d\xa1\xe3\x4c\x11\x98\x12\x1d\xcb\x44\xc7\x32\x34\x31\xae\x47\x13\x06\x13\x88\x6c\xbc\x49\x51\x33\x09\xc6\xa2\x63\x2c\x49\xd8\x58\x32\xaa\xdc\xc9\xd8\x58\x86\x16\xa2\x4a\x74\x56\x28\xb0\x37\x09\x4a\x86\x44\xa3\xd4\x48\x28\x87\xa2\x76\x22\xaa\x24\xa2\xc9\x08\x89\x26\xa2\xcc\x14\x04\x96\x10\x18\x63\x99\x2b\x98\x51\xc0\x2f\x5c\x98\xb2\x65\x00\xe5\xf5\x56\xb0\x4e\x51\xac\x8a\xc4\x5f\x78\x94\x54\xe1\x8c\xd4\x43\xe0\x57\x84\xa0\x28\xbb\x28\x2c\x01\x58\x90\x92\x95\xa3\x22\xc0\xc1\x9c\x98\x9c\x04\xa6\xcd\x00\x88\xd0\x0f\xfb\x79\x5f\x03\x94\xfd\xe9\xea\x69\x15\xf5\x43\xe1\xbf\xe1\xfd\x60\x11\xa0\x63\x37\x3a\x96\x2c\x82\x5f\xc5\x2e\x5d\x0f\x04\x14\x05\xe0\x7e\x20\x1b\xeb\x2f\x51\x05\x40\x11\x9b\x45\xbe\x34\x2e\x01\x25\xd5\xd3\xd0\x3b\xff\xe7\x41\xd8\x5d\x00\xe5\xe8\x4c\x53\x69\x5c\x94\x1a\xe4\xa9\x17\x86\xa5\xa3\x00\x56\x9a\x5a\x44\x11\x95\x14\x88\x7d\x3a\x3d\x96\xa2\xa2\xb8\x6b\x7f\x97\x81\xd8\x5f\x84\x3e\xec\x4a\x51\x80\xe2\xb6\xcc\x14\xc0\xae\x5d\x34\x6d\x29\x14\x14\x20\x50\x90\xd3\x84\x90\x3e\x00\x24\x23\x00\x62\x03\xf1\x23\x29\x34\x45\x91\x74\xa0\x09\x50\x24\x01\xe7\x9a\xa6\x44\x91\x3a\xb0\x54\x94\xfd\x3b\x17\xb9\xdf\xd8\x4c\x61\x9b\x62\xa1\x65\x57\xb4\xc7\x94\xfd\x50\x19\x83\xcc\xce\x54\xaa\x31\x93\xea\x96\x0a\x0b\x09\xa5\x21\x14\xb7\xf5\x62\xe0\x4e\x15\xcd\x5c\x61\x57\xaa\x94\x90\x4f\x13\xb3\x3a\xe4\xb2\x70\x30\x07\x45\x48\x75\x00\x94\x25\x10\x45\x42\x8b\x00\xf4\xb1\x02\xc9\x96\x89\x58\x20\x04\x0a\x0a\x2d\x52\x45\xb1\x52\x1d\x8b\x8a\x22\x50\x10\xa9\x58\x9d\x21\x05\x68\x12\x50\x52\xa0\xa4\x28\x65\x2a\x55\xc4\x94\x28\x2a\x90\x02\xb1\x68\x14\x8a\x33\x8a\xe2\x85\x15\x51\x54\x08\x11\xa1\xa9\x88\xa4\xe1\xaf\x5a\x9d\x3e\x28\xa2\xff\xcc\x2a\x74\x14\x42\x28\x14\x88\x2c\xcb\x4d\xe8\x40\x4a\x2c\x16\xc1\x82\x99\xb0\xb4\xe4\xd0\x53\xbe\xd9\x7f\x80\xef\x0b\x5d\xcc\x15\x4a\x9e\x0b\x7d\x22\xf4\xb9\xd0\x97\x47\xfa\x5f\x3f\x0f\xfd\x16\x49\x48\x43\x19\x64\x22\x1b\xad\xa3\xd3\xd0\xe9\xbc\xff\x78\x1c\xdd\x88\x6e\x41\x6f\xe5\xee\x1a\xef\xe2\xd8\x8a\xf7\xa3\xa7\xd1\x47\xd0\xf3\xe8\xff\xa1\xbf\x41\x5f\x47\x7f\x8f\xbe\xc7\x67\x49\x7e\x91\xcc\xc1\x01\x76\xc0\x9a\x31\x79\x6d\xcd\x4c\xf6\x5a\x2f\xd1\x2f\x72\x4d\x37\x98\x13\xb1\x24\x19\x39\x65\xf4\xfc\x52\xd9\x0f\x7f\x1c\x60\xd1\xe1\xd2\xf2\x7e\x79\x65\x45\x6c\xcf\x24\x2e\x29\x6b\x65\xbb\xec\x17\xf0\x5d\x8f\x55\x30\xd3\xaa\x1d\x85\x69\x6a\x02\x59\x6e\x50\xd7\xe8\x4e\x67\x09\xb9\x61\xd3\x0b\xdb\x01\xf6\xd3\x73\x5c\x62\x9b\x65\x1c\xf8\xb2\xea\x7e\x68\xed\x6c\xfa\x52\xf0\xca\xc6\xaf\xd9\x74\xc7\x0b\xe6\x2e\xfe\xe2\x10\xa0\x2d\x79\xc9\x43\x38\x80\xd3\xaf\xd3\xf9\x98\x86\x37\x0e\x59\x40\x47\xc2\xcc\x63\xee\xa8\x40\x1c\x95\x48\x76\x99\xaf\x8a\xc0\xf1\x96\x3c\x56\x3a\x9a\x33\x6a\x31\xfa\xd1\x7b\x24\xd1\xc8\xc7\x54\x16\xd3\x3c\xd7\x19\xe9\xd0\xf3\x82\xd8\xb4\x02\x6b\x61\x7d\x34\xc0\xe1\x55\x71\xd8\xb6\x6c\x45\xfb\xbf\x6b\xc9\x48\xbb\x59\x0b\x16\xa8\xa0\x92\xf3\xd7\xa2\x00\x03\x11\x94\xb6\x81\xce\xbc\xd7\xe5\xa0\xd1\x91\xc6\x52\x60\xb8\x11\xcc\xb7\x88\x4a\x98\x67\x8e\xac\x43\xbc\xb2\x0b\x23\x5f\xee\x00\xb3\x0a\xbc\x17\xeb\xfa\x8b\x2e\x04\x38\xd6\xc0\xd9\x43\x63\x96\x89\x7e\x7e\xe5\x23\x8d\xd2\x3a\xc6\x0a\x8e\x63\x9c\x96\x70\x4a\x8e\x7d\x3d\x2a\xf8\x3f\x04\x1f\xb1\x68\x34\xe6\x97\x7c\xf8\xa2\x73\xa6\x1b\x2f\xf6\xb7\x66\xce\x8c\xe3\xc5\x68\x34\x87\xa3\x38\xa6\x8c\xd1\x12\x36\x2e\x52\xc7\x95\x68\xf4\xf4\xf8\x0f\xc6\x57\x94\x68\xbc\x1c\x45\xdd\xe1\xdf\xc5\xd0\x5d\x13\x45\x7c\xd1\xfa\xc3\xe5\xf8\xe1\xad\xa5\x77\x9f\x99\x50\xc7\xb1\x9c\x37\x8c\xc3\x2b\x0a\x2e\xef\xd8\xf1\xf0\xd3\x61\x68\xd8\xff\x5f\x35\x65\xe0\x31\xcd\xb0\xa2\x8d\x84\x51\xca\x69\x5e\xf9\x70\xce\xc0\x63\xe9\x98\x95\xc8\x8d\xb3\x54\x76\x78\xb4\x8c\x23\x34\x8a\x0f\x4f\x45\xc7\xb3\xc9\x4a\xbc\x81\x71\x1c\x37\x3e\xdf\x34\xa4\xc9\xe1\x37\xa7\x12\xd1\xc6\x0a\x36\xc6\x1b\x25\xab\x61\x4f\x95\x0f\xe3\xdc\x78\x39\x95\xcd\xd9\xb3\xa5\xe8\x78\x0c\x47\xa7\x8c\x71\x37\xd6\x40\xcf\x2d\x45\x37\x3e\x1e\x2f\x8f\x27\x7e\x92\xfb\x17\xa1\x1d\x2b\x47\xa7\x62\x4c\x68\xda\x38\x52\x2b\x63\x77\x6a\x96\xe8\x42\xd5\x70\x73\x86\x2b\x15\xa6\x26\xc6\xa6\x9a\x38\x61\xd8\x8d\x68\xb4\x84\x71\x2e\x9a\x1d\x1e\xc1\x18\x2f\xa2\x4b\x72\xd1\xe1\xf6\xa2\x19\x43\x47\xb0\x81\xb1\xaa\xe4\x14\xc5\xc0\x6a\x3c\xae\x8c\x3f\x9e\x48\x5c\xa9\x46\xf1\xb8\x9a\x8d\x2b\x71\x57\x31\x04\x71\x2a\x8a\x8d\x5c\x3c\x66\xa8\xb1\x98\xb1\x92\x53\x94\xf8\xac\x62\x24\x72\xb3\x65\x6c\xe0\xfb\xe8\x43\x60\xd4\xf3\x34\x0f\x0b\x82\x91\x5d\xa4\xb0\x96\x7f\x0c\x8e\x00\xc0\x14\xc0\x59\x46\x45\xa6\x17\xfb\xb5\xf0\xf0\xe5\x83\x07\xb7\x1e\xb8\xfe\x44\xc5\x80\x8a\x9f\xf8\x83\xbc\x32\x4f\x01\x1e\x9b\xfa\x06\xda\xfa\x41\x3f\x6e\xa7\xae\x30\x00\x96\xbb\xe3\x30\x7f\xc5\x14\x9d\x3f\xf9\xbf\xde\xf2\x57\x0b\xb2\xbb\xd2\x9a\x84\x9b\x2e\xaa\xff\xc1\xed\x32\xca\x54\xd1\x39\xaf\x2a\xc0\x6d\xd5\xf2\x40\xa9\xb1\x22\x17\x6b\x87\x76\x70\x26\xe4\x3c\xd4\x21\x6f\xec\x80\x65\x00\x34\xb7\x3c\x05\x3d\x98\x97\x61\xb2\x48\xfb\x49\x00\xd8\x03\xd0\xed\x6c\x57\x80\x9e\x0b\xf9\x7a\x05\x5a\x33\x74\x07\x00\x5d\x96\x81\xb6\x32\x3b\xa0\x56\x85\x83\x06\x50\x3a\x16\x5b\x86\x1e\x5d\x0e\xca\x9c\x1d\x74\x7e\x0a\xe8\x15\xb2\xbe\x8b\xca\x15\xc8\xc6\xfc\x75\xa5\xb9\x85\x26\x5a\x20\x1f\x84\xf9\xfc\x3c\x9d\xd2\x67\x68\x2d\xde\xd8\xae\xcc\xe7\xf7\x00\x0a\xd9\xc5\xf6\xf0\xff\x55\x96\x8d\xd9\xb2\xb1\x66\x98\xc9\xea\x7c\x65\x61\x01\x9a\x13\x95\xde\x7c\x9d\x36\xa0\x4a\xa7\x2b\x7e\x68\xbf\xca\xc8\x83\x21\xf7\xa6\xea\x54\xa6\x3d\xaa\xe4\x2a\x8d\x94\x1e\x85\x95\xaa\x3c\x2d\x29\xf5\xc6\x1a\xad\x18\x95\x0a\xd4\x65\x2a\x1b\x89\x84\x5c\xa1\x79\x30\x0c\x63\xdc\x4e\x29\x46\x83\xca\x72\xa1\x01\x44\xc8\xfb\x91\xd3\x90\x23\x19\xa8\x54\x80\xff\x06\x00\x95\xfd\xf0\xd8\xe1\xbd\xcc\xb7\xe2\x17\x42\x2b\xa1\x1b\x42\x6f\xe3\xba\xb1\xef\x09\x3d\x1e\x7a\x26\xf4\xf1\xd0\xa7\x42\x9f\x0e\xfd\x55\xe8\x6f\x43\xdf\x0d\xfd\x28\xf4\x33\xce\x6a\xff\x5d\xe8\xf7\x9c\x81\x99\x42\x39\x54\x42\x53\x68\x19\xad\xa2\x35\x1e\x35\x2f\x45\xd7\x72\x95\x8d\xf7\xf0\x89\xcd\x53\xe8\xa3\xe8\x79\xf4\x49\xf4\x69\xf4\x17\xe8\x8b\xe8\xeb\xe8\xdb\x3c\xaf\x7f\x39\x50\x6a\x72\x09\x0b\x46\x2e\x2a\x89\x90\x28\xd6\x19\xef\x4a\x7a\xc1\x30\xbd\x6c\x13\xae\x27\x6b\x06\xf6\x15\xa6\x02\xc4\xb2\xc3\x11\xcb\xee\x39\x9e\xc3\x08\x17\x87\x53\x11\x10\xb3\xec\x76\x23\x44\x61\xa6\xe2\x75\x23\x6e\xd7\xd3\x99\xca\xfc\x4d\x38\x9e\xbf\x65\x4f\xe5\x52\x1d\xbd\x00\x4a\xeb\xf5\x94\x4d\x7b\x6b\xcf\xe1\x0a\x4c\x9a\xae\x75\xb8\x1f\xa2\x67\x97\xb1\xd6\x19\x29\x29\xb9\x5d\x3e\x51\x1f\x11\x07\x2d\x13\x07\xae\x64\xf6\x6b\x0a\x71\xa6\x1a\xf8\x7d\x33\x73\x13\x5a\xeb\xff\xd0\xe1\x58\x56\x93\xf5\x5c\xae\xca\xc4\x1c\x8f\x75\xb4\x9e\xcb\x43\xb2\xca\x3c\x8b\xa9\x7c\xac\xcd\xc7\x27\xac\x13\xfc\xda\x29\x0e\xbb\xc7\xe9\xf5\xdc\xd6\x30\x68\x83\xe9\xbc\xa3\xc8\xb9\xe5\x5c\xae\x48\x65\x6a\xe0\xb1\x11\x78\x93\xf0\xde\x1f\xd1\xe6\x90\x3e\x87\x6c\x57\xe7\x62\xd3\x6e\xc0\x0b\xaa\xbe\x66\x94\xe6\xb8\x5d\x5c\x40\xbc\xc0\x70\x6d\xae\xdd\xa4\x8d\x26\x51\xde\xa8\xbd\x88\xfd\x5a\x89\x27\xf4\x1e\x27\xf2\x94\x1c\x9d\x69\x9e\xca\x1c\xaf\x1a\xa4\xdd\x9e\xc3\x55\x64\xc1\x63\xa6\xcd\x02\x84\x04\x7f\xc8\xaf\x17\xca\x81\x1d\xe4\x88\x15\x6a\x99\x25\x2e\x6e\x57\x1a\x49\xe6\xeb\xcc\x3f\x4b\xae\x5f\x93\xb8\x76\xf8\xe9\x77\x08\x02\x60\x80\xe4\xbb\xfe\xa6\x84\xb6\xa0\x52\x4a\x04\x90\xc7\x01\xbf\x07\x70\xa9\xf9\x19\x0c\xed\x1b\x0f\xa4\x01\x20\x83\xf7\xdf\xa2\x47\xae\xba\xa2\x91\x4d\xd2\xc3\xcd\xe2\x2d\xc9\xe9\x67\xde\x92\x70\x86\xbf\x38\xcf\x13\x9a\xfb\xd7\xcf\xd0\xf0\xeb\x96\x6f\x98\x8e\xde\xf5\x92\x84\x31\xce\x60\x0e\x4c\xfa\xcc\x6e\x33\xfa\xe8\x3f\xfe\x7c\x87\xf0\xfe\x0b\x9e\xcc\x0c\xf1\xfa\x32\x08\xd6\x7c\x78\x2e\x99\x11\xa3\x64\x50\x4a\x66\xc6\x87\xaa\x80\xe7\xd7\xd1\x5b\x33\x20\x64\x04\xbd\x94\x64\xb1\x21\x64\x6c\x3c\xbf\x05\x5d\x91\xd4\xb5\x9e\x9e\xd1\x93\xc3\x4b\x34\x61\x79\x1a\x97\x84\x69\x74\x7e\x32\x19\x13\xb2\xb1\xa4\x2e\xc0\xf0\xb9\x1e\xe0\x7f\x92\xb4\x18\x08\xc3\x97\xb2\x49\xfa\x72\x52\x4f\x0e\x7f\x84\xe1\xeb\x82\xa0\x0b\x18\x8a\x42\x52\x10\x24\xab\xd7\x90\xa4\x71\x11\x92\xfa\xee\x24\x08\x2f\x09\xc2\x25\x72\x57\x5a\x06\x1d\x63\x49\x2a\x6e\xb1\x76\x83\x50\xf4\x60\xf6\x32\xbc\x1d\x2e\x49\xc2\xd7\x63\x97\xdc\x20\xc4\x76\xa7\x2e\xf4\xf0\xc5\xd9\xeb\x1b\x57\xde\x3a\xfc\xc5\xf2\xbc\x30\x07\xe8\x75\x37\x24\x63\x0d\x3d\x79\xf1\x60\x78\x58\xc8\x24\x1b\x90\x85\xe6\x15\x00\x91\x86\x30\x36\xa6\x4b\xb8\x84\x41\xc2\xc3\x9f\xe1\x39\xa4\xef\xc6\xc2\x86\x07\x10\xfe\x99\x26\x00\xef\x41\x6a\xf7\x0a\xc2\x76\x41\xd8\x0f\x42\x72\x83\x61\x7c\xf5\x34\x2d\x6a\x45\x29\xd9\x9b\xee\x09\x3a\x51\xc3\x7f\x83\x63\xb0\x21\x35\x24\x61\x7a\x59\xa3\xb8\x28\x60\xc0\x82\x90\xc1\x2f\xe4\xe7\x04\x81\x53\xdd\xe7\xc5\xcf\x0f\xbf\x3c\xf7\xf4\x3f\xc6\x2c\x80\x2d\x00\xb0\x0c\xf2\x83\xe0\xb5\xab\x0c\x8c\x1a\xa5\xc3\xbb\x54\x3d\x71\x7e\x98\xa2\x1f\x7e\x81\x6d\x87\xbb\x60\xf8\x9d\xef\x7f\x73\x7e\x99\x0d\xdf\xfa\xf6\x6b\x2a\x77\xa0\x4f\xcb\x1b\xef\x3d\x32\xcc\x41\x1e\xfd\x11\x65\x62\x6c\x51\xbe\x08\x5e\xfb\x90\xe1\xfa\xf9\x64\xfc\x4d\xb7\x5f\xb7\x95\xfd\xe0\x21\xa4\x43\x3b\xef\x75\x05\x71\x3b\xe4\x61\x1e\xf2\x50\x4e\xe7\x97\xf7\xa4\x35\x69\xd9\x00\x99\x52\x88\xef\xa2\x85\x2a\x54\x8c\x4a\x5e\xce\xd3\x4a\x1e\x6a\xed\x2a\x2e\x25\xf2\x14\x0a\x2e\xcd\x36\xf3\xf5\x7c\x22\x93\x33\x2b\x00\x95\x5c\x8f\x6e\xc9\xd1\x6c\x75\x8e\xe6\x8d\x4c\x38\x27\xd7\xa9\x21\x03\xe4\x7b\x32\x18\xd4\xc8\x1b\x34\x6f\x18\x0c\xcb\x32\xcb\x01\xa5\x92\x24\x55\xa8\x21\x41\x2e\x5f\xc9\x57\x2a\x7b\x6a\xe6\x54\xa5\x42\x8d\x73\x05\xf6\x06\x58\xbf\xbc\x22\x40\x6b\x51\x06\x4a\xeb\x75\x28\x30\xad\x29\x43\xc5\xd8\xb1\xbe\x07\x1f\xa0\x06\xbd\xed\x20\xc4\x8f\x9b\x89\xf3\xe1\x09\x03\x9e\x9b\x30\xf3\x73\x50\xaf\xb9\x50\x58\x87\xc9\xe8\x13\x20\x43\x0f\xe0\x96\x69\x22\x97\x0b\x40\x2b\x4e\x82\x2e\xcb\x85\x49\x2e\xd2\xe4\xef\x8a\xae\xfa\xb1\x7e\x4b\x3f\x01\x53\x89\x5d\x74\x8f\x1f\xfe\xf3\x40\xc7\x13\x7e\x9a\x4d\x29\xc8\x14\x0c\x3f\x7a\xcb\x53\x79\xff\x64\xcf\xd1\x2d\x90\x37\xfd\xe5\x6b\x8e\xba\x14\xc2\x1a\xe4\x83\x16\xae\x79\x2a\x6f\xfd\x77\xfc\x54\x68\x5b\xe8\xbc\xd0\x95\xa1\x6b\x43\x37\x85\xee\x0a\xdd\x1f\xfa\x13\xae\xaf\xf7\xd1\xd0\x9f\x85\xfe\x2a\xf4\x37\xa1\xaf\x85\xfe\x2e\xf4\x9d\xd0\x4b\xa1\x1f\x86\x7e\x12\xfa\x97\xd0\x2f\x42\xbf\xe2\x3a\xdf\xbf\x47\x84\xfb\xd0\x36\x51\x07\x79\x68\x01\x6d\xe3\x4c\x84\x83\xe8\x08\x3a\x1f\x1d\x0b\x85\x14\x3f\x6b\xd5\x1d\x46\x34\x5d\xf2\x33\x2a\xff\x52\xd5\x3c\xc6\xbb\x17\x7a\x01\x69\x66\x90\xbc\xaa\x26\x68\x01\x74\x37\x40\xf1\x12\x17\xab\xa6\x65\x96\xa5\x70\xc4\xb1\xdd\x6e\x01\x11\x46\x34\xc5\xd4\x73\xc8\x21\xaa\x53\xa9\x76\x4d\x1b\x5b\x6e\x37\x62\x2d\x20\x2e\xe7\xa6\x6f\xaa\xdb\xfa\x51\xc5\xca\x21\x9d\x39\x5d\x4e\x2d\xe0\x4e\xd6\x3c\x4c\xbd\x86\xec\x09\xf8\x06\x9b\xdf\x98\xcb\x9b\xf4\x0c\x6b\x2c\xe8\x3f\x70\x89\xfc\x4d\xe6\x25\x9f\xd6\x04\xa6\x4a\x44\x73\x6c\xac\x06\x36\x6b\xdd\xff\xdb\x32\xf0\x46\x23\x09\x6f\x84\xbb\xed\x12\xc6\xe9\x9e\x5c\xb6\xd3\x19\x51\x28\x71\x10\x3d\x79\x67\x25\xc0\x09\x7b\x9c\x80\xcf\x19\x9a\x9d\x20\xa8\x42\x80\xd1\xf5\xb3\x62\xae\x01\x3a\x02\xed\xba\x96\xc9\xf1\x43\x24\x60\x4c\x8d\x7c\x38\x47\xc0\x5d\x8f\x1b\x04\x78\x77\x0b\x71\x82\x77\x88\x02\x64\x30\x66\xe3\x18\xbf\xf7\x0b\x18\x96\xce\x4b\x67\x22\x17\xe0\x8c\x20\xc0\xe0\xbc\xb4\x90\xc1\xb8\x08\xe9\x5e\xa6\x78\xdd\xf0\x77\xb1\x45\x63\x2a\xa3\x61\x3c\x87\x71\x0c\x4f\xe1\x98\x80\x35\xf4\x20\xda\x9e\xd1\x36\xde\x5f\xdc\x15\x9b\xc3\x78\x1f\x26\xe3\x78\x1b\x4e\x5a\x73\xdd\x2c\x3e\x34\xd0\xf0\x36\x18\xe8\x73\xda\x36\x61\xd7\x00\x63\xd7\xc5\xb8\x31\x87\x61\x10\xfe\x6e\x12\x6f\x74\xa7\xea\xf5\x2a\x6a\x37\x04\x3c\xd5\x10\xd2\xf5\x6a\x72\x2a\x29\x84\xdf\xd9\xc0\xd5\xc6\x2b\xdc\xa1\xed\x43\x82\x50\x14\x84\xe1\x75\x00\x56\x2c\x16\x7e\x25\x39\xf5\x89\x6d\x99\x01\xee\x25\x1b\x02\xad\x14\xcb\xf1\xe1\x2f\xf6\x94\x93\xdb\x26\x5a\x56\xa2\x89\x57\xab\x19\x98\x82\x3f\xd2\x31\x4e\x0f\xef\x93\x66\x33\x78\xd0\x38\x37\xd9\xa8\xcf\x26\xdd\xe2\xe0\xf6\x59\x6b\xf0\xce\x78\xa7\xd1\x2c\x58\x73\x69\xc5\x7e\xf7\xa0\x9a\x6a\xee\x1b\x54\xb7\xbd\x7e\x4a\x9f\xc3\xc2\x1c\xae\xa6\x9a\xe1\x1f\x0b\x58\xc0\x4f\x35\xe1\xc2\x2a\xc0\x47\x86\x8f\x5b\x29\x78\x25\xae\x80\x0c\x29\xa0\x24\x7f\x0e\x88\x05\x05\x0a\xdb\x1a\xe3\xb1\xd7\x42\x07\x85\xaa\x72\x1c\xed\x47\x7a\xf8\x06\xe8\x14\xfa\x9d\xea\x36\x80\x93\x0f\x65\xd6\xa8\x52\x4d\x75\x2e\x20\x4b\x20\x7e\x37\x7c\x6c\xff\x5d\xa9\x54\x95\x80\x72\x5e\x02\x8a\xa9\x6a\x81\x2c\x90\xb9\x6c\xb5\xb8\xb3\xd3\x24\x9e\x53\xdd\x55\x6f\x29\xa2\xf8\x3a\xe7\x74\x68\xcf\x89\x8a\x1d\x76\x56\x00\xfa\x64\x25\x0d\xa2\x45\xfa\x8d\x2f\xc2\xd6\xad\xa9\xfb\x66\xa6\x77\x4e\x77\x0a\xb2\x59\xeb\x0b\xa5\x75\xb6\xbf\x49\xa1\x29\xa4\x1b\x56\xaa\xb1\xbf\x5a\x80\x52\x89\x52\x65\x97\x31\x5d\xa5\x1d\x28\x28\x40\x82\x42\x99\x8a\x85\x14\xe4\xd9\x2e\xf1\x0c\x80\x19\x32\x91\x14\x1b\x22\xcc\x40\x6a\xff\x56\xa2\x74\xa0\x03\x8b\x52\x18\xa0\x9a\x26\x50\x4d\xc9\x85\x0e\xc4\x26\x15\x10\xa1\xb3\xe8\x08\xd0\x87\xad\x00\xb1\x49\x10\xfb\x64\x71\xb1\x98\x07\xb2\x15\x6a\x59\xb2\x13\xb6\xc2\x56\x11\x76\xc1\x36\x52\xcb\x80\x28\x86\x42\x21\x87\xeb\x55\xbf\x88\x5f\x08\x9d\x17\xfa\x64\xe8\xaf\xb9\x5f\x4f\xe0\x0d\xf9\xaf\xa1\x5f\x86\xfe\x0b\x85\xb9\x9e\x90\xc2\xfd\xd6\x66\x38\x62\x66\x0f\x3a\xc8\x19\x00\x77\xa3\x77\xa1\x47\xd0\x13\xe8\x29\xf4\xa7\xe8\x23\xe8\xeb\xe8\x9b\xe8\xbb\xe8\x87\xe8\x27\x7c\xd6\xfc\x5b\xf4\xfb\x30\x09\x4b\xe1\x54\x78\x22\xdc\x0a\x77\xc2\xfd\xf0\x20\xbc\x16\x5e\x0f\xef\xe7\x15\xac\x19\x88\x5c\x06\x45\x99\xa6\x3b\xae\xc3\x65\x18\xd4\x60\xd2\x2a\x73\x23\x59\x87\xa9\xc4\x05\xcd\xb2\x2d\xb3\xec\x86\x5d\x13\xfc\xca\x4a\x33\x03\x8a\x92\xac\x30\xc2\x88\xdb\x71\x2d\x37\x1c\xb8\xae\xf9\xd5\x9e\xe6\x7f\xeb\x29\x5d\x54\xb6\x91\xeb\x5f\x7c\x1a\x34\xfc\xcb\x57\x1f\xa9\x6e\xf8\x01\x28\x30\x87\x1d\x8d\xa3\x75\xe6\x39\xae\x15\x30\x03\x5c\x87\x79\xfe\xf3\x1d\xaf\xe7\xf5\xbc\x0e\x33\x75\x45\xf6\x1f\x0e\x47\xc2\xb6\x59\xd6\xc2\x04\x10\x6f\x22\x8e\x58\x43\x38\xa8\x11\x03\x6f\x9f\x11\x53\xc8\x2f\x49\x4b\x9b\x86\xfa\x9e\x5f\xdc\x56\x47\x66\x1c\xdc\xfd\x7f\x14\x45\xba\x6d\x84\x35\x62\xbb\x1e\x0e\x68\x46\x3a\xe3\x46\xb2\xfc\x17\x82\xb3\x60\xf2\xe1\xa5\xb3\x99\xe9\x8d\xe2\x89\xb7\x59\x3a\xbb\x38\x90\x73\xdb\x74\x4d\xeb\x39\x36\x60\x2d\xd0\xbb\x08\x42\x99\x36\xba\xc5\xc8\xc8\x89\x8d\x87\x39\x8e\xdf\x8c\x94\xab\x44\x1f\x71\x23\xcd\x32\x0e\x84\x8a\x6d\xdc\xf1\x63\x54\x99\xe7\x86\x6d\x54\xd2\xd8\x29\xa7\x5c\xff\x58\xcc\x4d\xdd\x6f\x0e\xb9\xb1\x09\x07\x60\xf2\x64\xb5\x1c\x94\xc5\xea\xe8\x09\x6e\x20\x74\x54\xe2\x82\xc8\x44\x65\x81\xf7\x41\x90\xc7\x8e\x64\x92\x37\x13\x62\x17\x6b\x05\xe4\x39\xaa\xe3\x76\x4b\xa3\x61\x2c\x56\x4d\xee\xaf\xc9\x51\x9d\xdc\x12\x93\x87\x3e\xe6\x54\x55\x93\x79\x5d\x5b\xd7\x6c\x93\x33\x2e\x3a\x9a\xee\xf8\x91\xdf\x3f\x81\x8e\x66\x46\xfe\xe8\x44\x11\x66\x67\xd2\x8a\x02\x84\xf8\x5f\x40\x8a\x94\xac\xcf\x02\xb4\xf3\xca\xc5\xcd\xb6\xb0\xbb\xa4\x3c\x4b\x8a\x77\x0e\x88\xd8\x5a\x5d\xf9\x65\x8a\xac\x17\x09\x11\xbf\xa6\xac\xaf\x3b\xa9\x74\xb7\xbd\xb3\x1e\x11\xe9\x25\x77\x5d\x76\xf8\xa3\xc3\xff\x6f\xe2\xee\xe1\xc3\x0a\x88\x72\x9c\x88\x80\x28\x11\x41\xf1\xd7\xca\xd1\xed\xb8\x00\x4a\xab\x95\xda\xb1\x28\xfa\x77\xb5\xc8\xef\x2e\x3f\x42\xae\xa8\xdf\x95\xcc\xe5\xc6\x41\x2c\x1e\xb3\x9d\xd6\x4d\xe7\x4e\x18\xd0\x7d\xf6\x4c\x09\xbd\x7f\x5c\x20\x47\x0e\xd0\x2d\x47\x4e\x9e\x21\xcd\x17\x67\x48\x69\xf5\x26\xe2\xef\x58\x54\x9b\xb1\x5f\xbd\x5e\x24\x20\x46\x27\xce\x3b\x22\x65\x49\xea\xdc\x59\xd2\x5c\x57\x4e\x62\x11\x20\xb2\x87\x28\x22\x4b\x28\xdf\xda\x42\x5a\x2d\x50\x48\x5a\x1c\x28\x03\xb1\xe5\x80\x35\x3e\x35\x23\xc2\xf0\x61\x52\x52\x8a\x1b\x8d\x16\x69\x85\x3f\x2c\xb6\xc4\xf2\xc6\x60\x40\xc2\x7b\x9a\x61\xc1\x52\x36\xae\x9e\x81\xd6\x00\x1c\xa7\xb5\x0a\xb3\xdb\x09\x38\xeb\x83\x55\x45\x21\x30\xab\x84\xf7\x10\x23\x21\xda\x96\x25\xa6\x41\x40\x37\x74\x8b\x70\x60\x78\x8e\x28\x16\x8b\x82\x26\x2a\xa0\xaa\x80\x3e\xbc\xfe\xea\xf5\xa2\x18\x5d\x3e\xb0\xf1\x3d\x48\x41\x32\x22\x12\xb5\x48\x88\x0a\xa2\x42\x8a\xa2\xa8\xcc\x26\xa2\xe1\x2d\xa2\x78\xc5\x91\x57\x2f\x14\x45\x80\xf0\x16\x80\xb0\x8a\xf7\xcc\xac\xbe\xfa\x99\x2d\xad\xd5\x41\xe4\x37\x99\xce\xf6\x93\xc2\xf6\x41\x54\x53\x80\x88\xf4\xd5\x4f\xce\x82\x13\xf9\x8d\x65\x41\xd7\x3a\x62\xa5\x89\x65\x0f\x66\xbe\x06\xc7\xc8\x49\x43\x9c\x55\xee\x75\x06\xc5\xc1\xfa\xf6\x73\x95\xb2\x5c\x4c\x47\xff\x53\x7c\x09\x00\xbf\x50\xd5\x92\x42\xb3\x0a\x72\x8a\x02\xbd\x54\x4c\x01\x74\xf2\x40\x2b\xc3\x99\x9f\x03\xc0\x57\x0c\x91\xc2\x58\x32\xa9\xf6\xbd\xf0\x23\xb3\xe7\xfc\x7d\xe5\x3a\x50\xf2\xca\xbd\xbf\x90\x61\x78\xd5\xf0\x1b\x20\x1f\x2e\x50\xd1\x59\x47\xdf\x0d\xff\x73\x7e\x56\x4b\x26\x64\x72\xc1\x4d\x5f\xbe\xea\x81\xb0\xdc\x3c\xf9\xe3\x2f\xa3\x5f\x02\x34\x28\x9d\x16\x41\xde\x09\xb2\x52\x05\xa3\x41\x6e\x2a\x14\xf2\x4a\x03\xe0\x56\x80\x97\x6f\x25\x70\x32\x9c\xad\x34\x14\x7f\x05\xe8\xfd\xf4\xca\x77\xfc\xf3\x75\x3f\xcf\xc4\x56\xd4\xe1\x4b\xc3\xdb\xbf\x49\x09\xda\x13\x6e\xa2\x4c\xbe\x31\x2c\x3d\xb5\x16\x7e\xa9\x21\x27\xb6\xe7\xb7\x36\xa0\xd2\xf1\x60\x2b\xa4\xc8\x5e\x7a\x2b\x55\x94\x14\x4f\xb2\xb6\x68\x05\xf0\xaa\x94\x56\x3a\x05\x70\xe6\x60\xbe\xb3\x72\x18\x68\x67\xcd\x9b\xae\xc0\xde\x82\xb2\x13\x46\xdc\x5c\x39\xd5\x8a\xd2\x45\xa5\x39\x05\xd5\x96\x49\x41\x31\xf2\x05\x99\x2e\x54\xc5\x85\x02\x1c\xe8\x36\x0c\x50\x3c\xc5\x4b\x19\x55\x2a\x57\x14\xa8\x4e\xa7\xe6\x2b\x90\x1d\x00\xb5\x84\xe9\xd4\x02\x34\x52\x2b\xd0\x50\xd6\x60\x5a\x94\xb6\x41\x83\xee\x04\xaf\xb2\x13\xe4\x02\xb4\x96\xa9\x07\xf5\xbe\x52\x48\x01\xa0\x0b\xbd\x54\x2b\x9a\x9a\xde\x39\x5d\x6d\x14\x66\x92\x05\xf0\x1a\x0b\xd5\x86\xac\x78\x85\x46\x23\x05\xca\x02\x94\xb2\x60\x80\x33\x25\x56\xa7\xc5\x2a\xa4\x52\x79\xae\x7a\x45\x8d\x02\x05\xb9\x40\x15\xa0\xf7\x16\x3a\x14\x8a\x3b\x60\x50\xae\x52\x02\x55\x2a\x5a\xf3\x30\x53\x74\x6a\x73\x19\x98\x9a\x81\x2a\x2d\x77\xe9\x65\x66\x03\xae\xd6\xe0\x48\x6b\x8d\xac\x35\x60\xce\x21\x7d\xba\x40\x48\x0a\xbc\x5e\x07\x60\xbb\x56\xa0\x8d\x06\xc0\x8c\x04\x05\x63\x2f\x4c\x43\x52\x03\xd8\xba\x53\x59\x83\x42\x7e\x42\xf3\xd6\xe8\x1a\xa5\xa9\x8a\x31\x2d\x03\x50\x7f\xed\xe1\x49\x27\x9e\xc0\x9f\x0b\xed\x0e\xdd\x19\xfa\x7b\xee\xfa\xf4\x63\xee\x1c\xf3\x6a\xe8\xf7\x48\x44\x32\x4a\xa1\x22\xb2\x51\x8b\xaf\x3d\x6b\x7c\xe5\x39\x03\x5d\x82\xde\x88\x6e\x46\x6f\x45\x6f\x47\x8f\xa2\x27\xd0\x07\x46\x3a\x1e\x9f\x42\x9f\xe5\x28\x4d\xa7\x13\x8c\xe9\x34\x59\x51\x39\x58\xd3\x5f\x62\xca\xdc\x0a\xdd\x0e\x21\x53\xeb\x64\x90\xe7\xf8\x89\x26\xd3\xca\xc4\x76\xfd\x40\x6c\x7b\x76\x84\xd3\xbb\x7a\x8e\xce\x88\x9f\x33\x0a\xa8\x6b\xf7\x98\xaa\xe8\x8c\x68\xcc\xaf\xf9\xed\x90\x1d\xb1\x41\x0b\xb0\x45\xfe\x32\xc2\x3b\x97\x9a\xa9\xc9\x1a\x0b\x4b\x65\xdb\xb3\xbb\x9e\x3e\x8e\x1c\xcf\x12\x90\xe5\xd7\xad\x3c\xe2\x6f\x26\x97\x3c\xf3\xe5\x6d\x05\xdd\x0f\xf1\x1c\x5b\x62\xaa\xaf\x81\x85\xfc\x20\x6c\x9b\x9e\x65\x7b\x96\xe9\x7f\x8e\x18\x55\x5c\xbc\x82\x94\xb9\x7e\x32\x9f\x64\x11\x47\xd7\xaa\x01\xae\x87\x8b\x81\x72\x6e\x2a\x31\x2d\x3b\x60\xc0\x06\x3f\x6b\xa6\x35\x22\x00\x74\x71\x10\xbd\x03\x9f\x87\xcd\x75\xe9\xd4\xb7\x6e\x75\x34\x72\xe3\x92\xf4\xa3\x7d\x35\x5f\x8b\xc5\x9b\x8f\x58\xfe\xcd\xaa\xca\x8d\xdd\xfd\x3b\xf9\xfe\x61\x66\x8e\xc8\x6c\x01\x3e\x9e\xb9\x41\x33\xd4\xed\x56\x55\xd3\x8f\xd8\x5a\x47\x73\x34\x27\xc0\xf1\x04\xc6\x9f\x26\x1e\x49\xf7\x39\x9e\xe5\x68\xcc\xad\x06\xc6\xcc\x9a\xc3\x43\x7c\x01\x39\x9e\x4a\x22\xab\x4b\x00\xed\xf9\xbb\x00\x80\x5c\x6f\x15\x52\x56\xbf\xd0\x11\xab\xb4\xd8\x51\x86\x1f\x1b\x3e\x0e\x89\x64\x9f\x00\x28\xe4\x70\x06\x66\x64\xf9\x74\x80\xfd\x00\xa0\xec\x5c\xb5\x2b\x80\x7e\xf7\x9f\x98\x9c\x76\xb6\x98\x74\x77\x55\x67\x48\x2a\x56\x52\x84\xb7\x0c\x3f\x71\xfb\x8f\xab\x4b\x81\xfb\x92\x4c\x29\x55\xc4\xfd\xdb\x2e\x1c\x8b\x52\x68\x1e\x46\x37\xa2\xfb\x6f\x23\xc5\xc6\xdb\xda\xe3\x85\xe3\x7a\x4d\x54\x96\x44\xd2\x57\x88\x52\xdc\x4a\xcf\x10\x4a\x00\x64\x97\xb8\x04\xbb\xfa\xfb\xb7\xed\x12\x81\x12\x52\xa4\xa0\x0a\x30\x9e\x84\xfd\x30\x03\x0a\x10\x0b\xe4\xc1\x69\xa9\x94\x48\xf6\x8b\x29\xd2\x3f\x39\x95\x4a\x51\x91\x12\x99\x2c\xf5\x01\x0c\x55\x9a\x4c\x41\xb3\x0f\x4d\x58\x82\xc8\xe5\xa7\xbf\x3a\x5c\x82\xc8\x8d\x8b\xca\xab\xaf\xcc\x28\x91\x37\xef\x27\xaf\xfe\x0c\x12\xbd\xa5\xa5\xc8\x9b\x77\x11\xb2\x08\xfb\x61\xf1\x64\x6d\xa9\xb9\xa4\x44\xee\xde\x75\x52\xe8\x88\x72\x83\x42\x27\xf2\x51\x4a\x4f\x87\xfd\x62\x9f\x75\x3b\xf1\x93\x5b\xc1\x82\xc8\x45\x72\xa3\xf8\xea\x7b\x15\x0a\x8a\x48\x21\x35\x99\x2c\xf4\x95\xc8\x0f\x3a\xa9\x78\xe5\xe4\xa1\x8e\x22\x4e\xc6\x8b\xe1\x5f\x35\x53\xfd\x54\xb3\xd0\x59\x12\xa1\x09\x90\xaa\xe2\xcf\x01\xec\x3b\x1f\x80\x6e\x5c\x3b\xfc\xb7\x33\x9f\x53\x64\x20\x02\xc8\x32\x34\x3c\x74\x3b\xba\x89\x0c\xdf\x3c\x5c\x07\x20\x14\x8c\x14\x9f\xbf\x90\x6b\xe5\x6a\xe4\x1a\x02\xb0\x70\x72\x7a\x21\x05\x1b\x6f\x7d\xb9\x8e\x3e\x80\xbe\xb0\x56\xad\x2e\xec\x1d\x3e\xf1\x9b\xef\x02\xdc\x99\xd1\x3f\x86\x8e\x7e\x07\xd9\x0d\xd1\xf0\x9f\x08\x70\xf3\x1f\x53\x10\x8d\x8d\xfc\x1e\x19\x9d\x89\xbe\x7c\x65\x2a\xa5\xc6\xde\x3b\x7c\xdb\xb0\xab\x5c\x84\xfe\x34\xac\x3f\x03\x0a\x5c\x0b\x14\x5a\xa6\x4c\x3a\xa4\x42\xd6\x76\xd2\xdc\x12\xd4\x4a\xe0\xad\x28\xb0\x98\x3e\x04\x1e\x95\x2f\x80\xad\xd0\x58\xa4\x55\xf9\xc3\x49\x72\x42\x59\x03\x62\x2c\x54\x8c\xaa\x1f\xd8\xd6\xd6\x52\x90\x7a\x64\x2f\x59\x68\x65\x3d\x31\x93\x90\x69\x36\x92\x4a\x51\x0a\xca\x0a\x4c\x8e\x4f\x7b\xc6\xde\xb4\x28\x1e\xae\x6e\x85\x86\xd8\x58\xa4\xf4\x36\x7b\xcb\x80\xf4\x48\x61\x89\x15\xca\x19\xba\x58\x91\xa9\x57\x10\x5b\x59\x85\x30\xb5\xa1\xaf\xc3\xd1\x5a\x5e\x59\x80\x2d\x59\x25\xeb\x54\xfa\xe2\x72\x07\xc0\x5b\xe9\xd3\xc2\x5b\xac\x42\xbf\x2e\x56\x53\x30\x39\x09\x5b\xc5\xa5\x5a\xbe\x9a\x5f\x84\xd4\x4c\xce\x28\x00\x6c\xc9\x54\x57\xce\x4c\xc8\xc5\x5e\x35\x35\x61\x5f\x09\x0d\x60\xf1\x42\x46\x57\x32\x59\x4a\x2a\x0d\x22\x53\x8f\x02\xac\xd1\x69\xba\x8f\x4c\x03\x53\x01\x16\xa8\x07\x05\x92\x6f\x34\x20\xa9\x35\x0c\x10\x2b\x84\x88\x10\x1a\xf1\x8c\xa2\x8b\xf8\xf3\xa1\x46\x68\x25\xb4\x3d\xb4\x2b\xb4\x37\x74\x20\x74\x79\xe8\x1a\xee\x0c\x73\x57\xe8\xde\xd0\x03\xa1\x47\x42\x1f\x09\x3d\xcf\x95\x39\xfe\x3a\xf4\x95\xd0\x37\xb8\x92\xd1\x29\xc7\xcc\x97\x43\xff\xcd\x7d\xb4\x42\x28\x8a\x62\x28\x81\x74\x5e\x67\xd7\x39\xe3\x7f\xd3\xff\x78\x2f\x3a\xc0\xf5\x8b\x98\xae\xf0\xb0\x44\x98\x46\x0a\x48\x63\x1a\x31\x19\x61\xc0\x69\xc1\xe5\x76\xd8\x73\xad\x05\xd4\x5d\x42\x3d\xe2\x00\x01\x2d\xa9\xe8\x4e\xc7\xeb\x71\x05\xf9\xa4\x9f\x68\x93\x39\x34\xc2\xf8\x05\x5f\x0d\xd4\x61\x1e\x97\x44\xd2\xc2\xa6\x9a\x40\x7e\x10\x0d\x73\x9b\x4c\x5e\xb1\x72\x5a\x8b\xe3\xd9\x1c\x7a\xed\x5a\x04\x4c\xd6\x71\x19\xef\x6f\x06\x6e\x92\x81\xc2\xa6\xe5\x46\x18\x31\xe5\x02\x72\x3a\x4a\x97\xd3\x8e\x38\xf9\x09\x22\x1c\x7c\x67\x72\x24\x3a\x47\x84\xb3\xae\x17\x34\xf8\x36\xd1\x72\x01\x54\xdc\xaf\x10\xaa\x23\x04\x5f\x0e\x71\xfc\xf8\xa6\x09\x96\xcd\xa1\xf6\x84\x1b\x6f\x98\xa7\x24\x3a\xf9\x6e\x25\x10\x9f\xf0\x07\x98\x73\x7b\xf4\x00\xeb\x79\x81\x5b\xba\x67\x11\xd6\xe3\x48\x87\xae\xc3\x6c\xc0\xcc\xb5\x58\x50\x58\x73\x35\x90\xa0\x31\x6a\xa1\x7f\xdf\xfa\xf2\x43\x4e\x27\x1e\x1f\x99\xb8\x11\xa2\x92\xea\x9e\xe6\x2d\x57\x7f\xec\xf9\x77\xec\x27\x99\x27\xcf\x39\x78\x7e\x7c\x57\xe9\x8c\x3f\x7a\xff\x97\x8e\x3f\x93\x4b\x11\x91\x7c\x7a\xdf\x57\xde\x3e\xb9\x53\x14\xcb\xa2\xb8\x12\x8f\x9f\x98\x9a\xea\xdd\xf8\x20\x59\x20\xc4\xa9\xbe\x23\x73\xc3\xb9\xc6\x91\x9b\x6e\xda\x79\x63\x2f\x53\x76\xaa\x2b\x3d\x31\xbe\x70\xce\x3c\x21\xea\xf2\x57\xe3\xea\x82\x1a\x2f\x67\x76\xf5\x7a\x6e\x3b\x33\x95\x8e\x8b\x13\xea\x44\x2d\x4e\xc8\xb1\x27\xa6\x26\x5e\x5f\xd3\x08\x31\x6e\x59\x29\xff\xac\xf6\x6b\x42\x7e\x27\x4e\xc4\xcb\xe1\x0f\xaa\xe2\x86\x4b\xe4\xa4\x98\x29\x89\x2a\xc9\x0c\x7f\x28\x8a\x48\xcb\x44\x90\x28\x9e\xfc\x29\xc4\x87\xdf\x15\x45\x54\x26\x64\xf8\xfb\x78\x3c\xf2\xdf\x71\x2e\x24\x43\xc4\x32\xb9\x46\x7c\x52\x14\xa7\xf8\x61\x70\x79\x27\x3e\x98\x28\x93\x4c\x3c\x53\x26\x35\x22\xb6\x7b\xed\xb8\x28\x66\x48\x3b\xd3\xcb\xb0\xe3\xf3\x71\xb5\xb7\xbf\x1d\x57\x7b\x99\xe1\x73\x2b\xf5\x93\xa5\x5e\x4e\xfe\x9d\x35\x33\x71\xb4\x97\x29\x9f\x58\x68\xeb\xf8\xf3\xbf\x9e\x1d\x7e\xe9\x4e\xcb\xe2\xf8\xe5\x67\x8b\x00\xa4\xa8\xb4\xde\xbe\x6b\xd2\x10\xc6\xbe\xfa\x1f\xdf\x23\xb0\xfa\xd4\xe0\x81\x1f\x9f\xd9\x7a\x57\x6d\xdf\xc3\x8f\xfc\x3e\x34\xfc\xd5\xaf\x3f\xbe\xf0\x1c\x81\xf8\xd5\xe8\xdb\x8f\x5d\x33\x10\x39\xd0\x5a\xfc\x02\x7c\xeb\x1e\x31\x0d\x30\xbc\x62\xf7\x16\xb8\xf1\x5e\xa4\xbe\xa7\xf5\xec\xc3\x07\x66\xe1\x00\xac\x83\xb8\x5d\x5c\x87\x75\x00\xd8\x4e\x52\x07\x52\x22\x39\x53\x9c\x34\xea\x95\x19\x65\x5d\x4c\xa7\xac\xb4\x42\x26\xa5\xe1\x95\x47\x60\xf8\xad\x8b\xd2\x68\x75\xeb\x5e\x70\xd0\x8d\x84\x90\xd9\xcb\xdf\x88\x34\x2a\xda\x4e\x71\x56\x54\x48\xaa\x55\x8b\xe6\x13\xad\x75\x65\xd6\x76\x8a\x4a\xda\x49\x39\x7e\x59\x60\xa5\x44\xb1\x59\x2c\x3a\xa2\x38\xab\x88\x84\xb6\xd2\xa2\x28\x2a\xa2\xd3\x6a\x89\x8a\x28\x16\x53\x96\x32\xa3\x14\x8b\xc5\xa2\x52\x54\x5a\x45\x51\x29\x16\x2d\x65\x60\xb5\x06\xb3\x91\xdc\xac\x5d\x18\x14\x9b\xce\x20\x0d\x83\x99\x59\x05\x06\xb1\x88\x03\xad\x34\x6d\x89\x1d\x22\xce\xcc\x50\x07\xca\x12\x38\x4e\xa8\xc6\xaf\xf7\x09\xfc\x62\xa8\x16\x5a\x0c\x1d\x0c\x5d\x10\xba\x84\x5f\xed\xd7\x87\x6e\x09\xdd\x1e\x7a\xef\x88\x6f\xff\xf5\xd0\xb7\x43\xdf\x0f\xfd\x84\xeb\x78\x0c\xb9\xe7\x8d\x86\x2c\x54\x47\xd3\xc8\x45\x5b\xd0\x1a\xda\x87\x4e\x1f\xe1\xba\xaf\x42\xd7\xf2\x6a\xfb\x0f\xd0\x3b\x5e\xf3\x2e\xe7\xec\x0f\xd5\x54\x4d\x52\xd6\x6c\x22\x07\xf8\xa2\x32\xe1\x49\x4e\x24\x1c\xb1\xec\x6e\x15\xcb\x8a\xce\x74\xc7\x8d\xd8\xdd\x4d\x1b\x72\xbb\xcc\xaf\x53\xaf\x53\x40\x2a\x89\x72\x33\x72\xc7\xb2\xbd\x42\x38\x30\xa1\x74\xf9\xbc\xd2\xf6\x73\x11\x3e\x13\x70\x78\x3b\xdf\xc2\xa3\x3e\x13\x2f\x19\x83\xe9\x44\x99\x70\xec\x13\x2f\xd3\x79\x5a\xc0\x2a\x6e\x6f\x01\x59\x26\xe1\xa4\x6f\x9e\xde\xe8\x9c\x3d\xee\x8e\x74\x78\x39\xd2\x98\x39\x2e\xd2\x9c\x9e\xe7\x96\x46\x44\x12\xcc\x7a\x9e\x6d\xc2\x48\xb7\x87\xab\x40\xba\x01\x46\xdc\x26\x3a\x97\xf4\x0d\x2e\x58\xee\x21\xe7\x3f\x16\x88\xfe\x78\x1a\xbf\xc7\xaf\x9b\x03\x3c\x2f\x7f\x51\xf6\x5a\x69\xee\xf1\x84\x69\x94\xf6\x8c\xaa\x58\x95\x53\x1b\x89\x5f\x63\x8f\xd4\x33\x03\xd1\x4c\x4d\x77\x98\xe3\x57\xaa\xa7\x9c\x33\xfd\x6f\xdd\x04\xea\xb0\xae\x1d\x8c\x68\x03\x43\x4f\x9e\x90\xa9\xfc\x0e\xe6\x70\x5b\x1d\x13\xbd\xd2\x02\x78\xe1\x6f\x8f\x3d\xfc\x9d\xe5\xa2\x45\x8a\x0a\xcc\x19\xa2\xd8\x6c\xee\xf5\xa0\xe1\xae\x0e\xce\x6c\xa5\x8a\xe8\x3d\xc3\xe7\x07\xe7\x6e\x69\x94\x9a\xf7\x16\xff\xe5\xfd\x77\x7e\xf6\x2b\xeb\x9f\x7a\xfb\xf9\x50\x2c\xa6\xe1\xdb\x3b\x53\x7f\x32\xdc\x78\x0e\x14\x07\x52\x69\x47\xfc\x2f\xa5\x58\x28\x14\x49\x4a\x54\xc8\xba\xa2\x28\xeb\xaa\xa5\x2c\x9d\x0b\xa5\xe1\x27\x8a\x56\xea\xcc\x94\xa2\x58\xc7\x66\x8a\x04\xcc\x24\xaa\x1e\xbf\x44\x85\x94\x05\x20\x36\x45\xaa\xa0\xd7\xa7\x56\xcf\x84\xe1\x95\x84\xc2\x40\x1c\x08\xa5\xf5\xc6\xa1\x5b\x22\x30\x7e\x0b\x39\x90\x58\x24\x10\xde\x09\xd5\xf8\xc6\x47\x00\x5a\x04\x6d\xa8\xd9\x24\x10\xa7\x90\x12\xc5\xd5\x62\x2a\xb5\x9e\x26\xa2\x53\x6c\x8c\x15\x09\xa4\xac\x3b\x66\x73\x91\x56\x6b\x69\xb7\xb5\x74\x8c\x40\xeb\x40\x5a\xb1\x56\xad\x63\x99\xfd\x07\x0e\x40\xd1\xba\x43\x18\x83\x63\xc5\x13\xe4\xea\xab\xe1\x5d\x94\x5e\x33\x43\xc2\xfb\x44\x71\xe3\xf4\xa5\x74\x91\x00\x39\x6d\xc6\x81\x73\x12\x0b\xe9\x6e\x4a\x70\x15\x58\x3d\x40\x0e\xd0\xf5\x55\x38\x30\x80\xf8\xae\x03\x29\x27\x35\x29\xfc\x31\xc0\x3a\x28\x64\x35\x35\x28\x5a\xf6\x99\x0e\x34\x1f\x20\x04\xbf\x08\x70\xd5\xd6\xeb\x8f\x3d\xfa\x39\xbf\x74\x92\x68\x7e\xf8\x28\x1c\xbc\x7b\x42\x06\x38\x0d\x6d\x47\x29\x94\xfa\xf5\x83\xe6\xe0\xba\x61\x7a\xf8\xe1\xdf\x5e\x21\x03\xfa\xd9\xad\x45\x6b\x7a\xe6\xf2\x63\xef\x9f\xcd\x0b\xbb\xfd\x28\x7c\xa9\x7b\xd3\xf6\xfd\x15\x7c\xc1\x19\x2f\x4b\x14\x1b\x60\x40\x4e\x80\x00\xff\xcb\xbf\x28\x85\x64\xb4\x46\x4d\x39\x9d\x90\x73\x52\xdb\x7f\xc6\x84\xd0\x06\x18\x1f\xdf\x8d\x01\x26\xeb\x20\xcf\x5d\x5c\x9c\xcc\xc3\x69\x40\xe1\x3a\x98\xe9\x49\x30\xbb\x2d\x4f\xf1\xd2\x11\xfc\x86\x92\xbc\xe3\xe2\x01\x38\x3d\x00\x18\xfe\x07\x55\x74\xa0\x12\xa5\x6d\x1a\x4b\x81\x9a\xa0\x4c\xc6\x32\xa3\xa2\xce\xa8\xc4\x28\x06\xc8\x75\x85\x46\x36\xa6\x42\xae\xdd\xde\x2d\xd0\x2d\x61\x1d\xf6\x4b\x5b\xa4\x1a\x00\xec\xa6\x40\x4f\x27\x3a\xa4\x9b\xb0\x6a\x82\x29\x41\x0d\xb6\x4e\xcb\x52\xee\xe6\xb3\xb1\x7a\x31\x50\xc1\x2f\x07\x6b\x32\xe4\x40\xd8\x22\x14\x4b\x82\x21\xe1\x36\xc8\x5e\xa2\x4d\x69\x73\x9c\xce\x1a\x94\xae\x78\x30\x27\x39\xe5\x29\x7b\x36\x37\x00\x79\x16\x3a\x6a\x0d\xcc\xae\xad\xb3\x2d\xf3\xe5\xd9\x39\x18\x80\x00\xdb\x29\xc0\x00\x27\xa7\x61\x8e\xba\x35\x0a\x74\xa4\x23\x84\x2d\xfc\x6c\x68\x21\x74\x76\xe8\x76\xee\xb8\xf5\x10\xf7\xd5\x7d\x86\xfb\x15\x04\x3d\xbd\x4d\xe7\x39\xee\x3b\x87\x64\xa4\xa3\x34\x2a\xf0\x6c\xa2\xc7\xfd\xb7\xb7\xa2\xed\x68\x37\x3a\x34\x42\x4c\x5e\x86\xae\x44\xd7\x71\x46\xc9\x3d\xe8\x01\xf4\x10\x7a\x84\x2b\x84\x73\x16\x1c\x83\x04\xd2\xb9\x69\x01\x77\x8c\x24\x5c\x44\xd6\xb2\x4d\xe2\x9a\x9b\x2c\x09\xde\xcc\x2b\xdb\x7e\x59\x23\xf5\x3c\x6e\x97\x8d\x98\x46\x92\x38\xf0\xdc\x76\xb0\x67\xd9\x65\xd7\xeb\xb9\x49\xdb\x6a\xa0\x32\x01\x02\xc8\x19\x39\x6f\x33\x3f\x81\xd1\xfc\x8c\xa3\x8d\x34\xe6\x39\x1a\x68\x23\x14\x4b\xd7\xeb\xf8\xd9\x47\xc1\x0f\x37\xba\xc3\x35\x09\x39\x9c\x84\xeb\x6f\xf8\x3b\x10\x94\x15\x9c\xee\x8b\x1d\xcf\x2e\x97\x38\x52\x03\xb4\x24\xd6\x9d\x8e\x6b\xb9\x6d\xd4\xf5\x3a\xac\xa3\xb8\xdd\x36\xe2\x5c\xbb\x91\xa6\x08\x1e\x81\x36\xdc\xb2\x1d\xf1\x0b\x23\x8f\x1b\x78\x9b\x36\xe1\xd0\x45\xbf\x42\xd2\x59\x00\x86\x64\x96\xcb\x4e\xb9\x72\xf3\x5c\x89\x3b\xea\x70\xa0\x1f\x73\xfd\xea\x8f\xef\x0b\x27\xac\xf5\x02\x69\x20\xee\x8c\xc3\x34\xae\x82\x6b\x95\x78\x73\x8b\x37\xf4\xb8\x35\x8c\x15\xd8\x73\xf9\xbb\xec\x3f\xd1\x09\xb4\x18\xc9\x48\xc2\xc2\xb5\x4c\x0e\xbc\xe4\xb8\x1a\x3f\x35\x71\x83\x0c\x86\xd3\xa7\xf5\x60\x10\x61\x13\x66\x86\x73\xf8\x47\x1f\xdb\x55\x04\xa1\x31\xf5\xd5\xe3\x42\x4f\xc0\xe7\x69\x1a\x24\x5f\x8f\x71\xfd\x0d\xf0\xfd\x69\x88\x69\x18\xf6\x09\x99\xb3\x6e\xbe\x68\x0b\x3e\x37\x33\x97\xb9\xae\xf2\xf4\xbe\xe1\x0c\xc6\xc8\xbb\xba\x36\x75\xe8\xce\x4a\x19\x4d\x6b\x83\x7f\xd1\xe7\xe6\x9e\x78\xcb\xb3\x87\x1e\x28\xbc\x6e\x5f\x1a\xfd\xa3\xfe\x78\xff\x19\x01\xc7\xb0\xb0\x2d\x33\x71\x6d\xf1\x89\x39\x3c\xb8\xff\x75\xd5\x6f\x1c\xb8\x7b\x75\x7c\xbe\xf7\x89\x39\x6b\xba\xde\x6b\x34\xac\xa4\x76\xd6\xce\x6c\xc1\x7e\x31\x21\x6b\xda\x78\x56\xd8\xa5\xd7\x8b\xff\xbe\x9a\xc1\x78\xe7\xf0\xc3\xd8\x12\x74\x74\xf6\xeb\x8b\xcd\x61\xe5\x38\x42\x6f\x72\xdd\x5d\x58\xb8\x39\x7b\xc2\x4a\xdc\xbf\x05\xbf\x31\x79\x02\xb0\xae\x61\x40\x48\x10\xbe\xaa\xc1\xb8\xf8\x4b\x4c\x0f\x36\x76\xf4\xf1\x56\x19\x0e\x81\x80\xab\xc9\x61\xe4\x2d\x0b\x49\x57\x9f\x9a\x83\xe4\xfd\xe7\x0a\xc2\xe1\x24\xae\x0b\x82\xce\xa7\x09\xe8\x03\x3b\xcc\x8b\xe6\x8a\xfa\xfe\xe9\x76\x03\xef\xfb\x0b\x39\x8f\x71\x46\xc3\xc5\xb9\xa2\x20\x14\x87\x66\x2c\x36\x67\xc7\x8b\x6d\xf4\xef\x58\xf8\x44\x31\x63\xa1\xf0\xb1\x04\x08\xd5\xe9\xe1\xc3\xd3\xe9\xe2\xf0\xa7\x56\xb2\x98\xac\x16\xb3\x6f\x85\x74\x32\x7d\x47\x31\x93\xd1\x92\x0d\x9c\x41\xdf\x3c\x2c\x00\x60\xbc\x78\x74\x2e\x43\x6b\x50\x14\x7a\x78\x17\x1e\x2f\x6b\x83\x24\x4e\xc6\x62\xf8\x59\x80\xff\xb9\xe5\x9b\x7b\xca\xef\xb8\x6f\xed\xf2\x4b\x04\x69\x4d\x80\x83\x12\xa4\xa6\x00\xb7\x9a\x2b\x82\x00\x54\xc2\x94\xd2\x83\x97\xdc\x62\x3f\x8d\xe8\xaf\xaf\x38\x78\xb0\xb3\xf1\x11\xc0\x30\xbc\xfa\xcf\xfa\x6b\x9d\x47\x93\xfd\x9b\xa5\xb5\x7b\x9e\x45\xea\x77\x1f\x28\xb7\xbf\xfa\x26\xb4\xb3\xb4\xf2\xd9\xfb\xa5\x9b\xd7\x30\xc5\x20\x94\xae\x71\x85\xcb\x30\x7e\x72\x41\xb0\x9c\x7e\xf7\x9a\xa7\xff\xe7\xae\x3f\xbc\xe8\x40\x53\x58\xc4\x7b\xa4\x4e\x8f\x9c\x03\x3d\x53\x80\x2c\x4e\xa9\x12\x2b\xc3\x65\x18\x5f\x51\x07\x1d\x3f\x76\x21\x7d\xf8\x8b\xc3\x97\x3e\xd2\x4c\xe6\x4f\x6b\x09\xdd\xe2\x71\xb4\x73\xe5\xd8\xa5\x1d\x30\x32\x10\x57\xfd\x90\xe7\x08\x2b\x78\x82\x96\x36\x5e\xc8\xda\x07\xe9\xeb\xe2\x93\x99\x95\xa6\x24\x95\xfd\x03\x4c\x7e\x61\xbc\xe4\x1d\x2a\x96\xdf\x4d\x31\xd8\x02\x08\x20\xd0\x92\x74\xce\x71\x29\x2b\x64\x05\xdc\x18\xe8\x6f\x88\x96\x00\x93\x71\x80\x6c\x39\x2b\x94\x05\x10\xf0\x32\x59\x93\x30\xb6\x05\x1b\xf0\x1b\xa1\xef\x25\x41\x07\x5b\x70\xa0\x45\x6d\x1b\xeb\x42\x52\xc8\x66\xb1\x04\x49\x7c\x11\x08\x00\x7b\xd1\x82\x0e\x4d\x5d\xea\x08\x36\x86\xa2\xa9\x27\x01\x40\x2a\x0b\xa1\x50\xc8\xe3\x79\xd1\x7b\xf1\x53\xa1\xfd\xa1\x6b\x43\xb7\x85\xee\x0a\x3d\x16\x7a\x7f\xe8\x43\xa1\x8f\x87\x3e\xc9\xfb\x3e\x7e\xb5\x13\xd4\x3a\xbf\x0d\x9d\x44\x21\x84\x39\x8e\x3b\x3b\x72\xec\x6a\xf2\xf9\x43\xff\xb5\x7a\xc7\x8f\x50\x6f\x40\xb7\xa2\x77\xa2\x87\xd1\x07\xd0\x33\x23\xfd\x85\x6f\xa1\xef\x71\xf5\x85\x9f\xa3\xff\x44\xbf\x41\xbf\x0d\x8f\x85\xe9\x6b\x39\x93\x1f\x55\x80\x74\x98\x8e\x75\xe6\x27\x01\x5c\x38\x41\x77\x18\x97\x61\x30\xfd\x94\xc3\x0e\xf8\xbc\x56\xd5\xd6\x14\xb6\xc9\xe7\x25\x96\xe9\x7a\x6e\xd9\xed\xb8\xe1\x36\xf2\x6c\xd7\x72\x7b\x1e\x51\x64\x85\x39\x5e\x37\x98\x3c\x60\xbf\xc4\xa9\xd8\x65\xbb\xb7\x99\x68\x35\x50\x19\x77\x98\x96\xe4\x29\x56\xd9\x76\xed\x5e\xa0\x15\xed\xe8\x01\x0a\x8e\xb9\xa6\x1b\x60\x2a\xb8\x6d\x2e\x07\x61\x70\xb9\x9d\x20\x8a\x6d\xaa\x08\xfa\x61\x8f\xdb\x71\x06\x9f\xba\xd3\xf3\xb3\x2c\x7b\x09\x75\x6d\xcd\x32\x81\x4f\x1f\xba\x36\x73\xd9\xa6\x8d\x09\x97\xfe\x61\xda\xb4\xc3\xb4\x92\xca\x78\x8a\xe2\xe8\x1a\x9f\x14\x04\x30\x13\xab\xea\x80\xe9\xf6\x70\x20\x2c\xe4\x58\x0b\x08\x07\xa2\x88\x64\x5a\x23\x6e\xa0\xe3\x4d\x4c\xe2\x70\xef\x03\x62\x73\xd3\x2c\xad\xc1\x7d\x11\xbc\x39\x44\xcc\x20\xc8\xba\xb6\xe7\x96\x0b\x61\x8e\x99\x33\xed\x11\xce\x2e\x98\x46\xf0\xd1\x2b\xb7\x28\xd3\xd9\xa8\xed\xd3\x46\x5c\xf8\xdb\x51\x79\xe8\xd4\x35\xcb\x3e\x35\xb9\x70\x5c\xdd\xb1\x2d\xff\xce\x36\xe2\xc2\xe2\x58\x67\x1c\x0f\xc8\x53\xc2\x72\x95\x33\xd4\x70\xe0\x79\x13\xe8\x25\xf9\x77\xdb\x30\x32\x5c\xd4\x98\xe6\xd9\x98\x70\xd2\x17\x0b\x58\xc3\x9b\x11\xd3\x66\xb6\xa3\x07\xc4\x2d\xff\xd4\xfb\xb9\xa2\x7f\x58\x28\xf9\x31\xc0\x57\xbc\x75\xcf\x89\xbd\x17\x24\x1f\x78\x1d\x32\xb5\x19\xbb\x89\x69\xa6\x29\x1d\x90\x84\x85\x2c\x66\xa0\x53\x41\xc0\x80\x0f\xde\x34\xfc\xd8\x81\x05\x09\xb0\x54\x02\xbc\x47\x60\x13\xd3\x20\x09\x57\x65\x05\x80\xd2\xee\xeb\x6f\xce\xf6\x8f\x4a\xd8\x3e\x61\xc9\x42\xeb\x2f\xd1\xbb\x8f\x4a\xc3\xbf\xd8\x10\x1b\xec\x8c\x07\x4d\xfb\xe6\x43\x77\x5d\x75\x09\x1a\x7f\xa6\xff\xe9\x6f\x49\xad\xf1\xb0\x7e\x4f\xd3\xcd\xe3\x05\x61\x5f\x1a\x56\xf0\x35\x15\x4a\x2d\x07\x76\x5c\xd8\xb9\xb0\xa5\x0b\x9d\x1d\xf1\x1a\x73\x3c\xa1\x24\x41\x87\x52\x6c\x43\x52\x17\x02\x98\x1f\x8a\xfd\x7d\x06\x27\xe1\x2a\x65\xee\xc0\xa2\x0d\x92\xf0\x4e\x4c\xa5\x4f\xb6\x70\xf3\xa7\x38\x0b\xd2\xf0\x87\x9d\x97\x31\xc6\x92\x34\xfc\xa7\xa6\x65\xc9\xe8\x1b\x82\xa2\x66\x87\x65\x01\x67\x28\x45\x8f\x62\x2c\x09\x42\x69\x78\x87\x80\x2e\x14\x40\x17\x6c\x49\x12\xb2\x42\x92\xda\x20\x65\x29\x15\x30\x2e\x63\x01\xbf\x2a\x1f\xd5\xf1\x99\xa0\xa4\x6e\xea\x5c\x71\xf5\x0a\xee\x8c\xcd\x0a\xa5\x0e\x8e\x8c\xc1\x9e\x77\x1f\x14\xbc\x44\xf7\xdc\xe2\x42\xf2\x4c\xfb\x8f\xe6\x77\x62\x58\x80\x99\x65\xec\x9d\x55\x1f\xfe\xa2\x8f\xd1\x55\x47\xa5\x9a\xba\x23\x15\xef\x54\x6b\x99\xe1\x39\xd1\x19\xf4\xc3\xf9\x09\x21\xbb\xe7\x59\x58\xd1\xe3\x27\x87\x0b\x63\xed\xf0\x5b\xb0\xd4\x94\x6c\x28\x09\xd9\x6c\x56\x4f\xb6\xec\x8d\x3b\xf0\x4c\xf8\x52\x2c\x09\x1b\x47\x40\xb6\xf0\x55\x0b\xfa\x72\xbf\x9f\xf1\x3a\x1d\x9c\x7b\xaf\x84\x85\x8c\x80\x41\x1c\x87\x64\x6e\xf1\x19\x90\xf0\x53\x18\x1f\x3e\x7f\x0d\xdf\xf8\xbd\xd7\xf5\xae\xda\xfb\xa4\x14\x6f\xd0\x69\x69\xd2\xc4\x87\x63\x31\x0c\xe3\x18\x27\x12\xb1\x58\x0c\xe3\x89\xd8\xfe\x47\x5b\x78\xf8\x99\x6b\x31\x8e\xe1\x58\x0c\xef\xc7\x18\xc7\x12\xe1\x5d\xdf\xbf\x0d\x3b\xb7\x0d\xd2\xbb\xb4\xb3\x86\x77\x0c\x1f\x1f\x76\x62\xf8\x10\x7a\x3a\x95\xdf\xff\x13\x69\x1a\xc7\x9e\xfd\x92\xc9\x1a\xb7\xbc\x67\xef\xe2\x85\xfb\x2b\x95\x07\xcc\xe1\xef\x0e\x5f\xf8\xf5\xff\x38\x9c\xda\xd5\xd9\x0e\xab\x67\x86\x77\xe3\x37\xb2\x58\xe2\x48\xfa\xac\xd8\x65\x38\x81\xfb\x42\x5d\x54\x63\x35\x0c\xad\x44\xac\x80\x31\xae\xe4\x85\x58\x6c\x02\xc7\x1e\xc0\xa9\xfd\xfc\xaf\xd3\x72\x8e\x4d\x17\xcb\x38\x85\x17\x26\xa7\x13\x29\x22\x26\xcc\xd6\x2c\x8d\xc5\xd4\x58\xcc\x9c\xc4\xe5\x2a\xc6\x29\x9c\xc0\x6b\xac\x33\x29\xe0\x14\x36\x63\xf3\x69\xa7\x10\xcb\xea\x6a\x0e\x2e\x4c\x34\xa3\x31\x7f\x95\xb2\xd3\x5b\xb0\x19\xf3\x57\xd5\x3c\x8e\x25\x70\x02\xc7\xb0\x19\x8b\x61\x01\x92\xb1\x58\x2c\x96\xc0\xb1\x0b\x85\x6b\x62\xf8\x42\x8c\xf1\xbd\x29\xfc\x44\x2c\x76\xa8\x83\x8b\x03\x9c\x54\xb0\xe2\x60\x6c\xe2\xa5\x33\x26\xde\x9c\x8a\xe9\x0c\xdf\x86\xf7\x63\xb8\x46\x3d\xeb\x82\x6a\x4c\xce\x1c\xaa\xcd\xb2\x37\x8e\x99\xd8\x74\x30\xae\x46\xaf\x8d\x4d\x9e\xab\xce\xd2\xe2\x5c\x42\xc3\xf6\x64\x5b\x3a\x24\xe0\xe6\x0c\xc6\xbb\x71\x6c\xa1\xbc\x18\xeb\x54\x26\xb0\x53\xc3\xe9\x02\x4e\x54\x70\x6c\x21\x5e\x81\xc9\x1e\xae\x35\x39\xc4\xd4\x53\x77\x57\xf2\xbb\xf1\xee\x18\xee\xc7\x76\xe3\x65\x3c\x4d\x12\x89\xb4\x9a\xc0\xd8\x4c\x24\x30\x5e\x9e\x4c\x60\x3f\x8c\x73\x6f\xd7\xc8\x0f\xf0\x53\xa1\x2b\x42\x1f\xe0\xce\x8b\x7f\xc6\x15\xb8\xbf\x14\xfa\x2a\x9f\x1f\xff\xc3\xff\xe9\x5e\xfd\xd7\x28\x9e\x47\xd1\x18\x4a\x70\x0f\xc6\x1c\x2a\xf2\xde\x95\x9f\x6f\xae\xa0\xed\x68\x9d\xa3\x44\xce\x45\xc7\xd0\xeb\xd1\x1b\xd0\x75\xa1\x10\x62\x8e\xa7\xfb\x71\x85\x11\xcd\x06\x4e\xf1\xb4\x1a\x7e\xa4\xb4\xcb\xa4\x4c\x34\x15\xeb\x4c\xd7\x18\x98\x4c\x25\x0c\x08\x1b\x99\x2d\x06\x30\x3e\xce\x8b\x09\x94\x19\x88\x69\xb9\xc4\x2c\x47\xec\x9e\x5f\xb7\x76\xfc\x34\x52\x67\x41\xee\xe9\x76\xab\x96\x6d\xf1\x46\x96\x87\x34\x95\x8d\xb2\x4e\xcf\x01\x93\x58\x6d\xc4\x83\x46\x67\x09\x25\x90\xe9\x87\xdc\x64\x95\xc3\xa7\xfd\x04\xb6\xc3\x02\x3a\x8d\x65\x02\x81\xaa\x9f\x59\x06\x98\x61\x47\xe7\x30\x66\xe6\x5a\x9c\x68\xc3\x8b\x44\xd7\x0e\x8a\x5c\xff\x46\x90\x2a\x16\x10\x47\x88\x34\x90\x43\x4c\x1e\x6d\x55\xd2\xc5\xda\x29\x61\x59\x8e\xe9\x38\x95\x59\x36\x90\xa3\xfa\xa9\x34\x76\x88\x89\xd8\xc8\xb5\xc6\x66\x9a\x43\x02\x58\x1d\x1b\x29\xf2\x70\xf1\xeb\x91\xa0\x0e\x1b\xf5\xc8\xfc\x1a\x98\x3b\x24\xba\x44\xe5\xd1\x94\x4f\x6c\x4d\xae\xbc\xc3\xc9\x3b\x5e\xd0\xa1\x23\xbc\xea\xf7\x53\xcd\x70\x15\xe0\xe0\x2b\x4e\xac\x0e\x95\x43\x79\xba\x83\xde\xf6\x00\x00\x34\x06\x87\x73\x16\x8a\x79\x9f\x7b\x8c\x0a\x04\xaa\x90\x89\x04\x48\xab\x0a\xb7\x22\xf1\xff\x3b\xc4\xbd\x3e\x60\x2f\xf4\x36\xee\xae\x24\x8e\x03\xe4\xa7\x40\x5e\xdd\xc5\x0a\xf9\xcf\x77\xf3\xc3\xb7\xfd\xaa\x3b\xf5\xbe\x2d\x7f\x39\xfc\xe0\x9b\x1f\xfe\xf9\x0b\x53\x75\xb8\xeb\x3d\x17\x3f\x74\xb0\x0e\xb7\x7d\xc2\x7b\xfc\xc1\x8a\x0c\x74\x6a\xf8\xca\x5d\x7f\x76\x2c\xf7\xa7\xb7\x5c\x59\xbf\xfc\x3c\x46\xe0\xd8\x1b\xae\x3c\xfe\x87\xcf\xa3\x7f\xab\x54\x72\x6f\xa9\xcb\x32\xad\x8c\xe9\x3b\xdc\xe2\xf4\xc4\x0c\xf4\x6b\xdf\xa2\x0a\xf5\xf2\x28\x29\x03\x7d\x8e\xd2\x3a\x3d\x4f\xa6\xc3\x2f\xc8\x72\x85\x52\x1a\xf6\x60\xe3\xaf\xea\x61\xcf\x80\x7c\x65\xba\x40\x0b\xbd\x4a\xa1\x71\x84\xeb\x59\x3e\xe7\x7f\xca\x54\xde\x78\x17\x05\x8a\x22\x20\x0f\xbf\x0a\x84\xec\xa5\x10\xee\x1a\x89\x6d\x79\x80\xce\x84\x7c\x5e\x5e\xde\xf2\xff\x53\xf6\x26\xf0\x71\x14\x57\xfe\xf8\xab\xee\xe9\xaa\x9e\x99\xee\x9e\xe9\x99\xe9\x69\x8d\x34\x67\xf7\x68\x46\x33\x3a\x3c\x9a\x9e\x9e\xd6\x69\xa3\xcb\x96\x2d\x9f\xb2\x6c\x63\x8c\x85\x84\x75\x58\x20\xcb\x58\x3e\xc0\x36\x47\x88\x0d\x84\x04\x42\x20\x09\x67\x38\xc3\x72\x07\xc8\x01\x64\x49\xb2\xc9\xf2\xcb\xb5\x39\x08\xd9\x10\x42\x7e\x09\xe1\x97\x6c\x7e\xe1\x30\x4b\xb2\x09\x59\x58\x6c\x8d\xff\x9f\xae\x1e\x19\x43\xd8\xff\x6f\x23\x7f\x3c\x5d\x5d\x5d\x55\x5d\x55\x5d\xf5\xea\xbd\x57\xf5\xbe\xef\x49\xe7\x20\xc8\x7c\x4d\x0d\x73\x50\xc0\x18\xd7\xc4\x85\xf8\x48\x4d\x4d\x00\x77\xd5\xd4\x08\x02\xce\x63\x21\x8e\x37\x25\x02\x42\xbd\x5d\xab\x40\x59\xc0\x82\x4d\xb2\x0a\xc5\xc0\x93\xca\xb9\x1c\xe7\x49\x73\xfe\x61\xcf\xa7\xec\x29\xb4\x65\x9e\xfb\xc8\xc6\xec\xc4\x65\xd7\x2b\xe7\xfa\xb6\x2d\xc3\x1e\x8f\x9f\x0b\x71\x5c\x95\xb6\x73\x18\x73\xb5\x1e\x8e\xe3\x5c\x02\x46\x99\xd9\x90\x1d\x9d\x4b\x70\x17\x6c\xf5\x6d\x69\xcf\x7d\x6d\x72\xdd\x05\x5b\x8b\x6d\x77\x5c\x5b\x6e\xad\xcc\x25\xf6\x5d\xda\xbb\xf6\xec\xbb\x38\x63\x63\xed\x01\x2e\xb6\xae\x97\xfb\xdd\x9e\xed\x0a\xc7\x35\x6a\x1c\xf2\xcc\x6d\x58\xb7\xe2\xcc\xeb\x76\xb5\xaf\xc9\x8c\x25\x1e\x68\x4c\xcb\xbd\x47\x26\x71\xdb\x52\x2f\xc7\x13\x2e\x14\x57\xdc\x5b\x7c\xdc\x38\x97\x39\x98\xf8\x88\xc7\x63\x13\x18\x8f\x27\x61\xcf\x75\xec\x19\xf4\x71\x9c\x97\x92\x4d\x81\x15\x04\x6f\x02\xe7\xbc\x9e\x34\x97\xf3\xb4\x70\x2d\x1e\x9f\x9f\xf3\x78\x3d\x1e\xdf\x78\x6d\xe5\x66\xcc\xcd\x72\x21\x9a\x31\x58\xc0\x7e\x2e\x55\xb4\x3f\xf0\x90\x86\xa7\x96\x4e\x9c\xe1\x51\xbc\xa1\xb4\xc7\xe3\xf3\x78\x94\x10\x17\x1a\xae\xe5\x6a\xb9\xb4\x54\xc7\x79\xd3\xde\x12\xa7\xf8\x43\xe9\x88\xaf\x86\xa9\xe5\x3c\x7e\x8f\x52\xeb\xe3\x6a\x39\xbf\x4d\xb6\x3d\x1e\x9b\x5c\xc4\x29\xff\x77\x3f\x77\x1f\x9c\x4b\xbd\x57\xdd\x0b\x0f\xc0\xa3\xf0\x15\xf8\x1a\xfc\x00\x9e\xa3\x1c\xe0\xbf\xc1\x6b\xf0\x67\xe4\x42\x6e\xe4\x47\x2a\xd2\x51\x8e\xfa\xd3\xeb\x44\xbd\xd4\x86\x6f\x18\x9d\x89\xce\xa6\x96\x78\xd4\xd1\x9c\xaa\x60\x9d\xda\xdc\x39\xc0\xf3\x8b\x87\xeb\x29\xc8\x1f\x05\xd6\xa7\xbf\x59\x33\x6c\x28\x21\x5d\x23\x26\x8e\x21\x95\xda\x48\x84\x82\x3a\xf5\x5e\x45\x4a\x59\xd3\x8b\x28\x58\x24\xc5\x07\x24\x99\xac\xa5\x6b\xd9\x52\x7d\x9a\x53\x2d\x95\x5a\xfd\x57\x21\x5a\x0c\xea\x6f\xce\x9e\x97\x55\x08\x83\x80\x2d\x26\x32\x6c\xd9\xd2\x4d\x07\xb7\xcb\x9e\x78\x2e\x42\x8d\x10\x32\x9c\xaa\x64\xa9\x34\x58\x5c\xf4\x5e\xa2\xd1\x13\xb8\x19\x9d\x50\xcb\x03\xdd\x01\x25\xcc\x64\x89\x15\x5a\x84\xaf\xcf\x64\x89\xb3\xe3\x97\xb2\x27\x32\x55\x7c\xd3\xe3\x5c\x0e\xa0\x3d\x51\x95\xea\x19\x34\x93\x9a\x9f\x3b\x0e\x56\xe8\x01\xb6\xf7\xb4\x56\x4a\x88\x7a\x68\x3f\xcd\x0d\x0b\xa9\xb2\x59\x34\x2b\x3d\xcc\x46\x68\x44\x35\xc7\x22\x30\xa4\x45\xc9\x87\x43\x81\x5c\x10\xf8\xac\x4f\xe5\x79\xd1\xe3\xdb\xa6\x26\x5a\x32\x84\x8f\xf3\x84\x5f\x6d\xaa\x71\x5f\xdc\x6c\x16\x1b\xe2\xcd\xbe\xe6\x16\x3e\x94\x0a\x1f\xb8\x6d\xc0\x47\x7c\x3c\x7f\x90\xc4\x89\xff\x26\xde\xb7\xe3\x63\x2d\x24\xa3\x66\xb6\xf1\x84\x27\xbc\x6f\xa2\x9e\xe7\xfd\x12\x3a\x82\xfe\x7a\xe2\x3b\x37\x75\xc7\xb7\x95\x33\x7e\x9e\x27\x3c\xcf\xfb\x7c\xbc\x8f\xf8\x7c\x9c\x87\x4f\xf0\xdd\x5d\x99\x96\xd5\xf3\x38\xd2\x4d\xd6\xa3\x0b\xec\x7c\xe1\x13\xff\xf7\x30\xfb\x1f\x26\x91\x4f\x14\xea\xeb\x4d\x9f\x8f\xbd\xd0\x97\x20\xe1\xee\x38\xaf\x9e\xf8\x8e\x99\x59\x12\x23\x66\xa6\x5b\xb5\xeb\x94\x31\xfd\x64\x9b\xa9\xb6\xf8\xcc\x44\x28\xa0\xaa\xa6\xca\xf3\x68\x33\x57\x88\x17\xc4\x85\xcd\x43\xc5\x00\x53\xac\x57\x33\x03\xf1\x9c\x30\xcf\xfb\xf8\x6d\xab\xbb\xbb\xcd\xa1\xf0\xea\xfe\x6e\x1f\x19\x22\xfd\x5d\xfd\x7c\x86\x74\x97\x07\xcc\x2e\xde\x5c\xdd\x9d\x69\x36\xbb\xf9\x6e\xbe\x7f\x5b\x97\x79\x79\x7d\x36\xd1\x1d\x8f\x44\x13\xe6\xb6\x7a\x9e\xbb\xef\x51\x22\x95\xeb\x30\x59\x72\x3e\x69\x10\xeb\x55\x42\x08\x41\xc2\x28\x59\xb9\xd2\xac\x5b\x45\x8a\x35\x1b\x48\xc8\x96\xb3\x08\x2f\x88\xb9\xda\x83\xa4\xf6\x85\x8a\xff\x32\x22\x62\x51\x5a\x8f\x99\x37\x11\x57\xdd\x2a\x10\xe7\x83\x4a\x57\x2e\xd8\x78\x23\x21\x44\x0a\x49\xeb\xfb\x08\xa9\x6b\xd0\x70\x5d\x8a\x34\x10\xb2\x9e\xe0\xca\x67\x5e\x0d\x11\xc4\x30\xef\x18\x61\xa9\x05\x63\x2c\xf6\xf5\x85\x56\x91\xd1\x86\x54\xd6\x2e\x4b\x33\x1b\xca\x5a\x1d\x09\x11\x3c\x79\x3e\x96\x1a\x6b\xfa\xf0\x06\x42\xce\x72\x11\x29\xdd\x43\x46\xc9\xa8\x14\xec\x27\xa4\x1c\xd2\x1a\x8d\x51\x22\x6e\x20\x1b\xb0\xb8\xaa\x2c\xae\x1a\x6d\x20\x2b\x25\x2c\x59\x83\xb9\x75\x52\x57\xaa\x5d\x6e\x68\x6a\xfb\x7a\xd7\x96\x72\x22\xb1\x21\xd5\xd0\xbd\x7d\x54\xd4\x7b\x25\x65\xdd\xaa\xba\xcd\x31\x39\xd4\x94\x16\xcf\xdf\x4e\x62\x1d\x62\x3a\x1c\x8a\x95\xb0\x58\xd0\xa4\x42\xe7\x86\x1c\xbe\x4c\xda\xd2\x67\xb4\x91\x72\xd7\x7a\x62\xb4\x85\xf2\xee\x2e\x62\x3a\xc0\xf3\x19\x3f\x29\x87\x48\x03\xd4\x57\xe7\xf1\x1d\xb0\x05\x2e\x87\x2b\xe8\xb9\xfd\x1f\x51\xeb\xdb\x3f\xd2\x73\xa0\x0b\x74\xa5\x77\xe4\x36\xc7\x1b\xa6\x33\x7f\xb7\xa1\x49\x74\x1e\xda\x83\x2e\x45\x37\xa2\x5b\x29\x6e\xec\x97\xd0\xd7\xd1\x77\xd1\x0f\xd1\x4f\xa8\x8c\x46\x8f\x65\x92\xa0\x0f\x51\xa5\x12\x85\x62\x33\xe8\xa2\xee\xf7\xa1\xaa\xbd\x24\x3d\x9f\x9f\x61\x19\x8a\xd6\xaa\x5b\xd9\xb2\xa5\x58\x86\x15\xa6\xfe\xe9\xc2\x06\x3d\x53\xaa\xe8\x59\x3d\x6c\xa8\x46\xd1\x64\xed\xe5\xdd\xf1\x5a\x17\x54\xfd\xba\x96\x65\xb2\x99\xac\x95\xd5\xad\xac\xa5\x93\x80\xbd\xe2\x1b\xe9\x65\x28\x5b\x0e\x2e\x41\xba\xc5\x52\x98\x69\xce\x81\x87\x4e\x55\x8d\x89\x28\x69\xa1\xd8\x24\x8b\x50\x25\xa6\xee\x78\xb5\x58\xc4\xf9\xa8\x5a\x91\x9a\x4c\x56\x75\xc0\x59\xe9\x7f\x7a\xe6\x49\xa3\x3b\xe9\xce\x8c\x0c\x19\x54\xfb\x5d\xaa\xa7\xc0\x70\x24\xac\x50\xb7\xc8\xce\x94\xe6\xaa\x0a\x6a\xc3\xf1\x95\x6c\x07\xf5\x2a\xee\x84\x95\xa5\x9e\x9a\x16\xb7\xba\x74\x7a\xc0\xdd\x39\x43\x55\x5c\x94\xf6\x14\xea\xac\xd3\xd9\xf8\xa2\xb8\x4d\xb4\x38\xe2\x78\x57\xb2\xcc\xac\xa5\x51\xaf\x9d\x8a\x41\x4f\xd4\x2a\x98\xe8\x16\xa1\x87\x45\x69\x2c\xe5\x37\xf4\x92\xee\xa3\x16\xc9\x8a\x9e\x25\x25\xa3\xa4\x93\x90\x41\x42\x86\x52\x7e\xcf\x69\x5d\xb6\xaa\xd1\x53\xa9\x23\x3d\x5b\xf4\xa5\x82\xab\x65\xd2\x93\xfa\x8e\x43\x0e\xcb\xa4\xcc\x04\xd5\xd5\x9b\xec\x43\xbc\xe6\xde\x6e\xf0\x7d\xbc\x9b\xfe\xf1\x6e\xb7\xcc\xf3\x91\x9b\xb7\xbb\xfb\x8c\xbc\x26\xbb\xeb\x8f\xfe\x60\xee\x62\x53\x93\x79\x5e\xe6\xf9\xc6\x3e\xbe\xbf\xb3\xe6\x6b\xb2\x9d\xc8\x2d\x1b\x6e\x8d\x77\xf3\xf5\x47\xb5\xc8\x81\xb9\xc8\x76\xb7\xfb\x80\xfc\xc6\xfd\x1f\xbf\x3f\x90\xf4\xba\xdd\xbc\xfd\xb7\xa9\xab\x4f\xbf\xe9\x86\x1d\x48\xe9\x96\xdd\xb5\x3c\xef\xe6\xf9\xcb\x8a\x5f\x94\xe5\x85\x48\x5d\x6b\xb0\x95\x79\x76\x13\x7f\xe2\xc7\x97\x5d\x28\xf7\xf3\x7d\x07\xe6\x36\x19\xfc\x81\x4d\xbc\x70\xee\xea\x39\x5e\x93\xdd\x5a\xad\x9b\x97\xdd\x32\xcf\xac\x1f\x91\x8b\xee\xce\x94\x7b\x93\x5f\x0c\xf1\xee\x85\x1a\xaf\x4f\x6e\xd4\x34\xe6\x55\x59\xd6\xb6\x6f\x5a\x98\xe3\x79\xe6\xb6\x3e\x77\xff\x42\x9f\xa6\x31\xcf\x76\xf2\x9a\x16\x49\xd1\x36\x78\x5a\x17\x36\xda\x35\x74\xe7\x3d\x35\xee\x9e\xf2\x54\xb0\xc1\x3d\x19\xe1\x79\xe6\x89\x94\x26\xcb\x7d\x6e\x8d\x5f\xb8\x4b\x96\x99\x32\x9f\x97\x23\x29\x99\x97\x35\x8d\xd7\x78\xd9\xcd\x47\xa6\xbc\x09\xfe\x52\x3e\x2f\xf3\xc9\x80\x26\x47\x64\x3e\x52\x5b\xcb\xbb\xe5\x94\xa6\xb9\x65\xbe\x56\xab\xad\xcd\xe7\x79\xad\x2d\x9a\x5f\x78\x43\x96\x8d\x22\x9f\x1f\x31\xdc\xbc\x3b\xf2\x7b\xcd\x2d\x8a\x72\xde\xe0\xe7\xfa\x23\xde\x06\xb7\x7b\xce\x30\xf2\x6e\xb7\xdb\x58\xad\x75\xa6\xba\x8a\x1a\x77\x87\x42\x70\x5e\x2b\x44\x2b\x89\x23\x84\x48\x56\x5d\xa1\x75\x80\x28\x3a\x26\xad\x75\x95\xbf\x94\x5b\x89\x28\x11\x45\xd1\xfa\x6f\x7e\x12\x3d\x80\x58\xb7\xa6\xe7\x06\x34\x25\xc1\x12\x42\xb2\x8f\x4a\x84\x5c\x1d\x7d\xe1\x57\x4a\x14\xe3\xef\x91\x47\x98\xe6\x15\x97\x5f\x9c\x1b\x18\x26\x24\x3a\xba\xf0\xee\xd6\xca\x5f\xae\x47\x4d\x2f\x2f\x3d\x4c\x08\xd9\x3f\x46\x16\xfe\xf9\x8d\x6b\xbe\x3a\x56\x1a\x2c\x84\x42\x08\x3e\x45\x14\xe6\x7c\x22\x11\x29\x27\xe5\x48\x44\x25\x67\x91\x4c\x42\xba\x43\xba\x2c\x60\x15\x14\x2b\xf7\xd1\xd8\x7e\x71\x6c\xb9\xa8\x29\x67\x1f\x12\xc7\x48\xe3\xa8\x34\x40\x5a\xc7\x88\x52\x90\x14\x82\xa4\x14\x91\x2c\x22\xea\x05\xd2\xb1\x59\x54\xc6\xa4\xe1\xc6\x2e\x51\x8c\x92\xfe\x36\x65\x8f\x57\x22\x67\xe5\x88\x26\x46\xf7\x7b\xeb\xb5\x3a\x49\x92\xa2\xe2\x8a\x55\x6b\xd7\xf7\x4b\x0a\x89\xaf\xd7\x87\x73\xba\xa8\x69\xa4\xa7\x14\x2a\x24\x64\x69\xa0\xce\x22\x75\x05\x42\x86\xda\x88\x34\x2d\x2d\x25\x19\x99\x90\xa3\x2d\xb8\xf6\x9a\x01\x29\xb7\x95\x0c\x88\x56\xb4\x40\x44\x85\xd4\xe5\x0b\x12\xc9\x15\x48\x4e\x14\xeb\x05\x49\x21\xc3\xca\x11\x4d\x21\x75\x1a\x29\xd4\x91\x98\x50\x57\xd7\xaa\xbb\xea\x0b\x9a\x24\x91\xa8\x94\x17\xb1\x96\xd3\x09\xc1\x92\xdd\x2e\xd1\xee\x34\x52\x93\x68\x75\xe0\x44\x1d\x40\x7f\x52\x27\x09\x61\x25\x1a\xd2\x09\xa9\x23\x92\xa6\x13\xa2\x10\x4c\xdc\x11\x25\xef\x71\x11\x22\x01\x80\x42\xf5\xee\x7e\xee\x09\xe8\x85\xb3\x61\x07\xdd\xd5\xbf\x12\x3e\x5e\x45\xea\xff\x35\xf5\xcb\xb9\xa8\x75\x67\x1c\xbd\x3b\x00\x72\xc5\x10\x09\x2b\x7a\x29\x4b\x1c\x52\x41\xc2\xaa\x41\xbd\xf9\xb2\x2a\xc9\x12\x8d\x9a\xf1\x9b\xa5\x7a\x07\x35\x80\x38\xc4\x2d\x54\x45\x19\x30\x4a\xc1\x40\x37\x52\x31\xeb\x38\x10\x0e\x11\x2f\xd2\x08\x0a\x07\x55\x23\x50\x87\xca\x96\x73\x6a\x33\x93\x55\x1d\x32\x75\x4a\x2d\x63\x3a\x1b\x62\xd4\x45\x25\x9d\xfe\x55\xf4\x1b\x7a\xaa\x53\xd5\xb3\xa4\xa8\x3a\x87\x3c\x1d\xef\xf5\x36\x37\x41\x16\xcf\x7d\x3a\xff\xb1\xe3\x04\xa3\x48\x01\x3f\x8b\xaa\x11\x34\xb3\x36\x2d\xa9\xaf\xe2\xfe\x70\xd4\x46\xd4\x74\x5c\xba\x67\x9c\xc2\xa9\x34\x62\x13\x37\xe4\x98\xc2\x53\xa3\x77\x2b\x63\x52\xb6\xc3\x31\xfb\x27\x46\x96\x7d\x18\x05\xf8\x6d\xf2\x36\xbe\x28\xa7\xe4\x48\x3a\xc1\x4b\x41\xf9\x9b\x13\x13\x72\xa4\xf8\xe2\xc5\x97\xfc\xd7\x50\x04\x05\x64\x37\xba\xbd\x4f\xae\xf3\xb9\xc3\x21\xbe\x57\x0a\xf2\xbd\xfc\x15\x13\x13\xf2\x8d\xee\x48\xb1\x97\xdf\xf8\xfd\x9f\xac\xa8\x47\x9a\xf9\x89\x0e\xff\xdc\xe1\x2b\x62\x65\xfe\xc4\x5f\xee\x68\x3a\x8f\x6f\x3e\xb8\x71\xd6\xed\xf6\xf3\xd7\xce\xf2\xcc\x45\x72\xaf\x14\x8a\x2e\xc9\xfb\xb7\xf1\xbd\x8f\xc9\xf2\x15\x91\x7c\x87\xbc\x91\xdf\x28\x4b\xa6\x5b\x6c\xe6\xe5\x3e\xde\x5d\xe4\xe5\x4e\x77\x91\xf7\x77\xb8\xc3\x75\xb2\xec\x76\xfb\x65\x9e\xe7\x23\x52\x13\x1f\xf1\xfb\xdd\x35\xad\x81\x84\xfb\x51\x9e\x77\xa7\x96\x2c\x3c\x27\xcb\x68\xbb\x2c\x57\xd6\xa7\xc2\xa1\x5e\xff\x46\x77\xc2\xbc\xdd\xef\x7f\xd5\xed\xe7\xfd\xc8\xe3\xf7\x7f\x5f\x96\xaf\xc8\x15\x53\xfe\xde\x5e\xf9\xbf\x78\x5e\x96\xe5\x6b\xf9\xbc\xcc\x3d\x11\xad\xf5\x65\x2f\xee\x37\x2f\xce\xac\xf1\x0f\xd4\x67\x43\xeb\xf7\xfa\x16\xae\x78\xbd\xf2\xbc\xdf\xc7\xf3\xb3\xff\xca\x76\xfd\x42\xe5\x13\x71\x1f\x4f\xfc\xe7\xaf\xf1\x8f\x64\xaf\xd2\xd4\xde\x69\xbe\x85\xbc\xd2\x8b\xee\x41\xed\x83\x99\xcc\x64\x45\xe1\x5f\xf9\x03\xef\x0b\xbb\x99\x5a\xa6\xd5\x77\xe2\xe9\x7b\x2a\x6f\xf0\xc8\x8b\x7e\x81\x2e\x67\xee\x4f\xf0\xfe\x8f\xf2\x6b\x06\xca\xfc\xd5\x17\xf3\x6b\xc8\x3d\xbc\xbf\xdc\xd2\x79\x85\x6f\xc2\xe7\x0b\x27\x5b\xf6\x96\x97\x36\x0f\x0c\xcc\x66\x13\xe7\x0f\xf0\xfc\xc8\x80\x7f\x60\xe0\xf0\xec\xc0\xec\xc4\xc0\x04\xbf\x69\xcd\x40\x3c\x31\x70\x36\xbf\x66\x53\x86\x0c\xc4\x49\x36\x33\xd2\xdd\xa2\x6e\xaa\x6f\x18\x40\xbf\xe7\x55\x7e\x62\x83\xd7\xc7\x13\xde\x1f\xf7\x9b\x64\x76\x93\xef\x8b\xfc\xae\xa1\x8f\xf3\x03\x3e\x9f\xca\xb7\xf0\x2d\x95\xeb\xfc\x3e\x9f\x1a\x3f\xd2\xe2\x0b\x76\x0c\x0c\xf8\x7c\x3c\x69\x49\x24\xaa\x3a\x01\x5c\xcf\xdd\x07\x9b\xe1\x2a\xba\xfb\x74\x1b\x7c\x1e\x1e\x80\xc7\xa9\x6e\xe0\x9f\xe1\x7b\xf0\x23\xf8\x19\xbc\x08\xbf\x81\x57\xe0\x0d\xf8\x0f\xaa\x15\x40\x74\x3e\xf8\x51\x0d\xe5\x17\x1a\x50\x0b\x32\xa8\xb7\x5a\xc7\xbb\xe2\x66\xba\x0b\x35\x89\xce\x47\x17\xd8\x7c\xbf\xbd\x78\x5a\x86\x4a\xb2\x14\x6f\x02\x13\x95\xa5\x43\x95\xa5\xa8\x89\xaa\xa1\x50\xa3\x11\xd3\xca\x64\x4b\xac\xa9\xb3\x45\x95\xe8\x26\xb6\x87\x2f\xc9\x98\x19\xb6\xc4\x96\x3a\xed\x22\x6c\xae\x7e\x19\x32\x8a\x4a\x40\x35\xa8\x49\x1f\x96\x89\x1a\xd2\x35\x2f\xca\xea\x98\x0d\x11\x3d\x6b\xd9\xd9\x03\x4a\xd0\x50\x8b\x66\x39\xb8\x0c\x99\x86\x6a\x19\xe1\x20\xbd\x0b\x98\x19\x55\x31\xaa\x07\x99\x9d\xf3\x6e\xba\xa2\x65\x29\x5a\x14\x9d\x5b\x74\x9b\x28\xa4\x66\x4d\x8d\x0a\xdf\x59\xd3\xa2\x27\xc0\xed\x07\x4e\x88\x5a\xf3\x51\xef\x84\x86\x45\x71\x70\x29\xb7\x60\x98\x0e\x9c\xa1\x03\x65\x58\x75\x56\xc1\x39\x9b\xde\x1c\xcd\xea\x58\xff\x39\x76\x7b\xf5\x94\x09\x20\x8a\xb3\x2b\x6f\x17\xe2\xc4\x3a\x40\xbc\x16\x35\x89\x73\x36\x94\xe8\xbb\x68\xbc\x49\x3d\x7b\x2f\x62\xee\x16\xe9\x2e\x97\xfd\xb8\x5e\x35\xa8\xfb\x1a\x0a\x37\x95\xd1\x0d\x25\x81\x2c\x07\xdb\x84\x0b\xdc\xcf\x85\xfc\xb2\x5c\x94\xf3\x3c\x9f\x0f\xaa\xee\x11\xbf\x9f\xe7\xf9\x09\xb9\x63\x22\xbf\xbf\xf7\x7b\x6e\x3e\xef\x26\x53\xd7\xf2\x57\x4a\x21\x37\xbf\xcf\xad\x6f\x70\xef\x38\xbb\xf8\xd4\x25\xbd\x57\x4e\x5b\x72\x7e\x63\xaf\xfc\xfd\x07\xc3\xee\x5c\x36\xba\x34\xb6\x4d\x4e\xad\x8a\x7d\xfe\xbe\x21\x6d\xd3\x79\xa9\xa2\xec\xfe\xe4\xb5\xcf\xed\xd0\x8a\xbd\x45\x2d\x65\x2f\xfd\x6e\xed\xff\xf4\xde\xd1\xda\xd5\x91\xba\x58\xe6\x8f\x5f\x83\xf6\xb2\x6f\xfb\x27\x78\x5e\xc8\x1c\xbf\xa6\x37\xe5\x66\x5f\xe0\xb7\x1d\xdf\xbb\x8f\x8f\x0e\xba\x52\xfc\x04\xcf\xf3\xc7\x8f\xce\xb2\xf7\xf2\xdb\xe4\xe3\x9f\x9b\x65\x8f\xf0\x13\xfc\xb6\x13\xfe\x21\x37\xbf\x91\x7d\xd6\x3d\xc1\x1f\xff\x45\x91\x67\x8f\xf0\x7d\x7d\xfc\xc6\xc8\xf1\x77\x78\xde\x2d\x23\x4f\x5f\x33\xb3\xcf\x3d\xe4\xee\x5b\x98\xea\xe3\x99\x72\x87\xdc\xb1\x30\xd5\xc1\x17\x23\x7c\x87\x9b\xd9\xc2\x87\x32\x7d\x7c\x9e\x97\x8b\x0b\x73\x72\x27\x3f\xc4\x77\xf0\xcc\x99\x72\xde\x2f\x17\xcf\xf6\xf3\xf2\x02\x9b\x93\xf3\xcc\xe5\x7c\x07\x5f\x5c\x18\xe5\x53\xbc\x9b\x39\x87\xef\x70\xdf\xd8\x9b\x1f\x7a\x2a\xd5\x37\x54\x3b\x5c\x89\xc9\x79\x3f\xda\xdd\x91\xda\xb8\x70\xe1\x25\x7c\x62\xb3\x36\xcb\xcb\x9b\xa5\xc8\x44\x44\x1e\xd9\x97\xe3\x53\xdc\x7d\x1d\x8d\x92\xcf\x97\xf6\xf1\x9b\x49\xd3\x77\x97\xf0\x95\x2f\xf4\x4a\x84\x54\x56\x48\xd2\x24\x99\xf4\xd9\x6b\x0b\x4f\x6a\x87\x9b\x51\x96\x54\x8a\x4d\x84\xc8\xc1\x41\xb2\x21\xf4\x26\x7a\x38\x8e\x5e\x8a\x36\xae\xef\x21\x0b\x87\x7d\x1d\x95\xff\xd3\xc7\xa8\x3d\x4f\x84\x7b\xfe\xb5\xf2\xb1\x1f\xdc\x6c\x20\x0b\xd5\xf2\xa3\x95\x4d\x3d\x44\x1a\xbc\x8e\xb9\x8d\x54\xe2\xef\x54\x6e\xe2\x6f\xbe\x04\x1d\x68\xb2\xa5\x13\xef\xc2\x5b\x87\x1b\xff\x17\x7a\x03\xa5\xb7\xf9\x06\xc3\xe1\xb0\x2f\xb4\x8a\x8f\x74\xb7\xaf\x0a\xad\x4b\x8f\xa6\x7d\x89\x42\x23\xd9\x10\x22\x4d\x9b\x7b\xd2\xc4\x3a\x2b\x9d\x5e\x9f\xee\x58\xcf\x93\x74\x23\xe9\xe8\x09\x0f\x16\xf9\xcd\x3d\x69\xdf\x19\x86\xd4\xb0\xc4\xd8\x52\x3f\xd9\x91\x68\x23\xe9\x0e\xd2\xb3\xde\x08\xd6\x90\xee\xda\x26\xc9\x68\xe7\x0d\xa3\x67\xd2\x47\x8a\x69\xa9\x68\xf4\x90\x29\x9f\x41\x3a\x3a\xd2\x61\xa3\xb1\x23\x1d\xeb\x28\xf6\x34\xa6\xc3\x1d\xf5\x8d\x8d\x4d\x8d\x69\x83\x97\x92\x42\x98\xf8\x8a\x4a\x78\x5d\x8c\x18\x8d\x45\x25\x5d\x1f\x6b\x5a\x19\x52\x7b\xa2\x2a\x21\x61\xd2\xd8\x93\x1e\x8c\xc5\x06\x9b\x8c\x1e\x63\x90\x84\x0d\x89\xf8\x06\x0d\x85\xac\x23\xeb\x14\xb2\x85\x6c\x21\x46\xcc\x90\x06\x07\xc3\x93\xf9\xce\x49\xdf\x66\xb2\x8e\xaf\x6f\x5f\x17\x0e\xd7\x43\x0f\x95\x37\xfe\x8b\xbb\x03\xb6\xc1\xc7\xab\x36\xc2\x77\x53\x7b\xb4\x2f\x55\x91\x5e\xbf\x0d\xff\x02\xcf\x51\xab\x95\xdf\xc2\x1b\x74\xff\xa8\x82\x3c\x48\xa4\xba\x46\x67\xf7\xa8\x8c\xda\x29\xda\xeb\x5a\x34\x8c\xb6\xa3\x73\xd1\x61\x74\x39\xba\xf2\x94\x27\xc0\x7b\xd1\xc3\xe8\x8b\xe8\x29\xf4\x75\xf4\x7d\xf4\x13\xf4\x02\xfa\x15\xfa\x3d\x03\x0c\xcb\x60\xc6\xc3\xc8\x8c\xc2\x44\x98\x04\x93\x66\x1a\x99\x25\x8e\x15\xb1\x8a\x54\x8d\x6e\x84\x84\x83\x8a\x5e\x05\x34\xac\xaa\x20\xf5\x52\x55\x01\xa9\x91\x12\x25\x45\x2c\x3d\xb1\x42\x91\x7a\x54\x52\xa2\xbe\x2e\x32\x59\xb3\x5c\x87\x32\xc8\x5e\xde\xed\xf5\xd2\x31\x85\x31\x96\x21\x95\xf1\x21\x2d\x9b\xc9\x62\xc5\x95\x40\x21\x36\x6c\x04\xcc\xb2\x11\xa6\x9b\x29\x99\x25\xa8\x94\xa5\x3e\x06\xb3\x54\x30\x2a\x5b\x45\x4b\x0d\xe9\xd4\xe7\xb4\xe3\x33\x9a\xd2\x04\xab\x5e\x2d\x71\x61\x9b\x08\x68\x1c\xb5\x36\x5e\xf4\x5b\x4d\xf5\x11\xc4\x7e\x62\x53\x16\xaa\x9a\x4c\x11\xd5\x28\x9b\x74\xcf\x99\xaa\x13\xb8\x70\x27\x32\x8d\xac\xc6\x51\x30\x1f\x4b\x33\x35\x93\x12\x20\x6a\x59\xec\x58\x29\x5b\xa6\x15\x22\x8e\xf6\xc2\xca\xe8\xc4\xa8\x8a\x69\x29\xc7\x3c\x45\xa7\x6e\xb3\x6c\x19\x26\x81\x14\x0a\x87\x48\xcf\x21\xdb\xc2\x49\x86\x18\x8a\x1a\x56\xa8\xbf\x20\xd5\x39\x69\x64\x66\xb2\x8a\x5e\xb2\x6f\x74\x07\x3e\x28\x4b\xe9\xa8\x4a\xfd\x46\xa8\x66\x36\x6c\x90\x8c\x1e\x36\xac\xb0\x41\x1d\xf8\x67\x74\x92\x71\x9a\x43\x14\xc3\xd2\xb8\x2a\x9a\x91\xae\x99\x29\x62\x58\x3e\x44\x7d\x7b\x87\xd5\x8c\x99\x40\x66\x96\xb3\x29\x36\xd1\xa9\x0a\xc7\x39\xf6\x47\x15\x30\x59\xd5\x71\x90\x61\x66\xb2\x36\x39\xa4\x1e\x3d\x7c\x28\x6c\xb7\x95\x73\xdc\x84\x17\x17\x1d\xc1\x66\x35\x8a\xcc\x44\x37\xed\xcc\xb0\x62\x55\xb1\x82\x28\x5c\x8f\x59\xaf\xd2\xf4\x5c\x88\xf6\x63\xbd\xaa\x2c\xa1\x20\x88\xa7\x1c\x8e\x3b\x8e\x61\x35\xaa\x89\x65\xaf\xb9\x99\xe4\x2a\xff\x4e\xe4\x84\xb7\x78\x71\xdf\x0f\x24\x9b\x7d\xa4\x5e\x00\x6d\xae\x93\xba\x68\x11\xf3\x75\x39\xd1\x57\xfe\xf9\x18\x59\x2d\x11\x42\xfa\xa3\x24\x37\x90\x23\xa4\xb4\x6e\x60\x7a\xee\x92\xca\x89\x01\x24\xdc\x29\x46\xeb\xf4\xad\xd2\xdc\x11\xeb\x2f\x5d\xb9\x44\xe9\xa2\x7b\xf6\x23\xe1\x48\xf4\x3f\xb2\xf5\xdf\xaa\x6d\xbc\xe4\xf0\x54\x6c\xb8\xf8\xb9\xb9\xa5\x4b\xe5\x1e\x8c\x49\x94\x94\xae\xf4\xbb\x56\x2b\x51\xe2\xf6\xd6\x2d\x34\x8b\x31\x22\x31\x57\x11\x29\x44\x16\x26\x0b\x4c\xa6\xc6\x2b\xd6\xc9\x0b\x5f\xd6\xa3\x4c\x09\x87\x24\x12\x3d\x29\x49\x9a\xa2\x54\xbe\x2d\xf9\x85\x90\x5a\xe1\x14\x12\x25\x0a\xfa\x2a\x21\x44\x91\x2a\x9b\xe8\x05\x6d\xf0\x78\x31\x11\xfd\x95\x8f\x28\x44\x22\x58\xaa\x8b\xa2\x73\xa8\x4f\x9b\xca\xcb\x44\xd1\xc9\xbf\xe5\x89\x24\x11\xac\x78\xbc\x57\x4b\xd2\x6a\x49\xc2\x92\x54\x79\x80\x10\x54\xb6\xb9\xe7\x28\xa9\xbc\xab\x28\x79\x51\xfc\x9e\x1e\x25\x46\xa0\x8e\x6c\x7e\x4c\xfa\xc7\x68\xf4\xea\x81\x81\x2f\x8b\x44\x27\x75\x3e\x32\x20\x91\x9c\x46\x48\x48\xca\xc9\xae\xca\xbf\x8a\xc4\x83\x1a\xfd\x49\x92\x16\x49\x42\x0e\xc6\x88\x18\xcd\x85\x72\x51\xcc\x56\xee\x25\x84\x60\xac\x13\x49\x40\xb7\xc9\x9b\xc9\x52\x42\xc4\x4a\xbb\x28\x4a\x1a\x11\x78\xcc\xb8\xd4\x64\x5e\x19\xb0\x16\x5e\xa1\x5c\xbb\xa4\x60\x89\x88\x67\xd5\x61\x49\x61\xd6\x87\x88\xa2\x6b\x24\x4a\xdc\x59\xb2\xd0\x69\xd7\x5f\x54\x24\xbf\x40\x24\x26\x29\xea\xfa\xc2\x53\xa2\x48\x24\xe2\xe7\x98\x07\xc5\xa8\x54\x20\x38\xe1\x21\x52\x5d\x5e\x52\x42\x52\xb4\xb5\xce\x52\x72\x27\x1a\x24\xf6\xa7\x84\x9c\x78\x5e\xc9\x91\x10\xf3\x19\x49\xb2\x08\x39\xf1\x27\x4b\x6a\x15\xeb\x0a\xfa\x40\x5d\x6b\x41\xaa\x4f\xe6\x08\x77\x87\xbb\x69\xac\x72\x34\xb0\x02\xaf\xb8\xa4\xb3\xf2\x3b\x2c\x63\x9c\x0e\x9c\xb3\x68\x54\x68\xff\xc4\x7c\x3c\x16\xea\x75\x14\xfb\xe4\x7d\x81\x00\xc6\x8f\xdc\x57\x23\x48\x2e\x8c\xf1\xe6\xa5\x38\x8b\x6a\x51\xec\x51\xe4\xef\xc2\xb1\x82\xd6\x98\x6e\x90\xfc\x91\x23\xf8\xab\xaf\x2e\xa9\x1c\xbc\x54\x38\xff\xc1\x07\x55\xe1\xc4\x93\x35\x5b\x17\x8e\xa7\xd1\xcf\x8a\xf1\x2b\xbe\x7f\x71\x00\xaf\x7c\xe8\xea\x40\x4f\xd1\x10\x3a\xc7\x64\x9c\xc7\xb8\xf3\xd5\x42\x4d\xc1\xcc\x75\x75\x29\x3c\x16\xbc\x98\xb3\xb8\x40\x3e\x1e\x4a\x16\x02\xe9\x40\x4d\x1c\xd7\x08\x35\x39\xb9\x80\x31\x0e\xc4\xd2\x01\x0a\xac\x56\x93\xc7\xe9\x9a\x3c\x8e\xc7\x6b\x02\x02\xb6\xff\xa9\x35\x42\x4e\x88\x51\x53\xe2\x58\x1c\x07\xe2\x01\x1c\x17\x04\x01\x27\x7d\x58\xad\x09\x96\x84\x40\x01\xeb\x35\xa6\x50\x93\x8e\xe9\x71\x21\xaf\xe2\x80\x80\x63\x58\xc6\x81\x34\xc5\x7d\xcc\x73\x82\x8c\x97\x13\x21\x70\x41\x4c\x90\x85\x1a\xa1\x0b\x77\xa5\xb1\xea\x8d\x09\x1a\x0a\x04\x96\x60\x01\xc7\xed\x94\x35\x71\xea\x3f\x3c\xe9\xc3\x35\xf9\x40\x4d\x1a\xd7\xe0\x38\x36\x39\x81\xc4\x70\x9c\x5b\x83\xd3\x79\x1c\x4b\xe3\x25\x9c\x9c\xcb\x99\x71\x1c\xc7\x42\x43\xb0\xc9\x27\xac\x10\x3a\x31\xc6\x4e\x25\x37\x06\xce\xc1\x39\x1c\xa8\x29\xdb\x71\x4b\xbc\xdd\x0d\x18\xcb\xf1\x38\x27\xe8\xf9\x74\x57\xa0\x46\xc0\x38\x9d\x0b\xe0\x74\x4c\x90\xbd\xaa\x10\xc0\xb8\x4b\x08\x08\x42\x0d\x0e\x08\x35\x42\xa1\xd0\x63\xe2\x1a\x41\xc0\x81\x00\xf6\x87\xf2\xf9\xb4\x83\x3d\xb4\x15\x0f\x23\xbc\x71\xab\xb0\x06\x77\xc6\x05\xa1\x6a\xf3\xec\xf2\x70\x4f\xc0\x30\x9c\x07\xbb\x60\x2f\xf5\x09\x7e\x04\xae\x82\x6b\xe1\x7a\xb8\x9b\x7a\x05\xff\x22\x3c\x09\xff\x08\xdf\xa4\x1e\xd8\x9e\x85\xe7\xe1\x3f\xe1\x38\x52\x51\x1d\xd5\x4f\x77\xa0\xa5\x68\x3b\x1a\x47\x53\xe8\x10\xba\x8c\x22\x51\x5c\x83\xae\x43\x9f\x46\x37\x53\x5d\x35\x09\x2b\x9a\x82\x89\xaa\x29\x1a\x71\xc4\x35\xac\x18\x4a\x75\xc3\xca\xd1\x6a\x29\xf6\x92\x60\x19\x99\xac\x59\xb4\xca\x41\x70\x90\x73\x2d\xc3\x31\xf1\x70\xf6\xbe\xa9\x2f\x20\xa3\x1c\xa4\x12\x22\x6e\x44\x5a\x16\xb2\x44\x57\x42\xb6\x10\x48\x54\x33\x10\xb4\x54\xc5\xe0\xc2\xd4\x09\x8f\x2d\xfb\xa5\x1c\x03\x41\x07\xc2\x5b\xb5\x29\xa7\xa5\x53\x7d\x32\xa9\x12\xe4\xac\xa2\x66\x74\xd3\xca\x50\xae\x90\xaa\x90\x28\xca\x84\x03\x0b\xc1\xa9\xf6\xd2\x61\x5a\x54\x73\x44\x8f\x4a\x53\x32\x69\x3f\x34\xed\xdf\xa2\xe2\x2c\x77\x7a\xd6\x66\x41\xf5\x2c\x31\xec\x65\x82\x32\x90\x36\xb3\x6c\xd2\x74\x3e\x7b\xa9\xcc\x2a\x4e\x5a\x83\x5a\x40\xdb\xb9\x8b\xdd\x28\x43\xdd\xb7\xd9\x5d\xa1\x29\xce\xde\x9d\x95\x2d\x9a\x4e\x01\xc4\x50\xf5\x8c\xfd\x46\xbb\x5e\x3e\xa4\x6a\x31\x3b\x19\xd5\xbf\x5b\xba\x65\xd2\xf2\x9d\x92\x32\xd4\xfc\x86\x18\x61\x6a\x37\xe9\x78\x60\xa0\xde\x71\xed\xe5\xc2\x96\x6c\xed\x07\x76\xdf\x39\x3a\x2c\x55\xb7\x54\x5a\x3a\x5d\x01\xd8\x75\xd1\x51\x71\x6d\xb2\x25\x49\x52\x5e\x86\xa8\xec\x0a\x7c\x16\xc6\x44\x24\x3d\x24\x9b\x4c\x35\x8b\x58\x49\x60\x52\xdf\xe5\x93\xb3\x23\x95\x4f\xdf\x5c\xc2\x64\x5c\xd0\xe7\x09\xbe\x2d\x49\x5a\x30\xce\xe0\xe0\x3e\x71\x65\x9b\xaf\xb1\x76\xe9\x96\x1a\x0d\x67\x47\x2a\x3f\x5a\x49\x9a\xd1\xff\x4d\x76\x94\xb2\x2b\xf6\x3f\x63\xf4\x04\x17\x92\x75\xde\x88\x68\x04\x98\x6b\x48\x47\x28\xb0\x30\x1a\xc2\xc1\x54\x4b\x88\x19\x23\x3d\x18\x77\x2c\x7c\x4b\x24\x62\xb2\x61\x59\x90\x44\xe5\x60\x73\x88\xc8\x4c\x19\x77\x60\xbc\xf0\x95\x5a\xf4\x1f\xd8\x10\x71\x49\xc4\xcd\x62\x73\xa5\xf7\x8c\x66\x74\x13\x6e\x26\x9d\x42\xb3\x48\x3a\xc4\x12\x3e\x43\xcc\x06\x71\x73\x2d\xee\xc0\x1d\xa2\x18\x12\x09\x16\xed\x50\x33\xc9\x84\xc8\x08\xae\x15\x09\xae\x6d\xc6\x59\xf2\x31\xb2\x0d\x4f\x93\x4e\xd2\x11\x14\x31\xc1\x78\x2d\xa9\x15\x83\x38\x98\xec\x48\x8a\xa2\x28\x76\x10\x12\xea\x10\x9b\x31\x59\x21\xe2\xa0\x9d\x40\x1c\x11\x6a\xc5\x48\x56\x5c\x43\xb6\xad\x20\x23\x84\x04\xb1\xcc\xe0\xda\xb5\x22\x11\x4b\x62\x0b\x6e\xc6\x2d\xb8\x2c\x8b\x62\xad\x58\x2b\xfe\xba\x19\xcf\x05\xcf\x12\x0f\x05\xc5\xcf\x06\xc5\x39\x51\x4c\x92\x50\xe5\x76\x51\xfc\xab\x28\x8a\xd7\x25\xf1\x0a\x51\x14\xe7\x42\xb5\xdc\x13\x9a\x51\xee\xd1\xb6\x1c\x92\x37\x2d\xe3\x56\xfd\x17\xe6\x7e\xd9\xe4\xc5\x31\x0e\xdf\xc9\x09\x5e\x9b\xfa\xb8\x30\xee\xea\xe4\x36\xad\x45\x3f\x42\x73\xf7\x69\x92\x0f\xab\x99\x38\xf7\xa0\x10\x33\x38\xa1\x01\xe3\x5b\x2e\x47\xde\xd9\xf6\xca\x33\x37\x6c\xba\x04\x05\xb7\x60\x2e\x51\x69\x6b\xf9\x61\xe5\xf5\x3d\x5e\x0e\x3d\xc6\x74\x7d\xb7\x41\xc6\x59\x4e\x08\x73\xee\x08\x17\x8b\x45\xbd\x2d\x2a\x96\xb1\x2c\x07\xdd\x51\x2c\x47\xa3\xaa\xea\xf5\x7a\xb1\xd5\xe2\xf5\x36\x11\xac\x19\x98\xd3\xb0\x57\x8b\x72\x2a\xc6\x9a\xda\x10\x36\x34\x39\x16\xce\xf6\xf7\xe3\x06\x19\xab\x5e\xad\x41\x6e\x70\xfe\x87\xb3\x6a\xbb\x16\xe6\x62\xd1\x66\x43\xc0\x0d\x61\x41\xc5\x29\xc9\xed\x6d\x8e\x36\x7b\xb9\x31\xaf\x97\x8b\x7a\x9f\xd0\xc2\x9c\xaa\x6a\x1e\x41\x8e\x79\xb1\x16\x8b\xf1\x6e\xfb\xa5\x1a\xa7\x6e\xf2\xaa\x0d\x1c\x8e\x6a\xe1\xe6\x68\x16\x37\x78\x71\x83\x2c\xbb\xcf\x6c\x50\x1b\xa2\x82\xa6\xe2\x14\xf6\xca\x18\x47\x1b\x38\x55\xd3\xb0\x9d\x57\x74\x7b\x71\x58\x6b\xc6\xfd\xbc\x1b\x07\xc2\x1c\x8e\x24\x3d\x69\xce\xc0\x5e\x2c\xb7\xe3\x06\x6f\x83\x2a\x3b\x48\xae\x9a\x6a\xd3\x70\x99\x03\x80\x25\x94\x26\x9d\xcd\xdd\x01\xeb\xe1\x23\x70\x15\x7c\x86\xee\x98\xdd\x47\x71\xc4\xbe\x47\x29\xd0\xcb\x54\xaf\xf4\xef\xf0\x17\x38\x4e\xed\xb3\xfd\x55\x5f\x35\x69\x54\xa0\x12\xf4\x72\xb4\x9a\x22\x83\x8f\xa3\x9d\x68\x0e\x5d\x8a\x8e\xa2\xab\x29\x55\xfa\x1c\xc5\xc8\x79\x84\xda\xcb\x7d\x83\x9e\xe6\x34\x54\x4b\x35\x54\x7b\x26\x63\x2f\x32\x2c\x23\xc4\x51\x7d\xba\xa3\x39\xd7\x09\xf5\x96\x9f\xa5\x3b\x66\x26\xa9\xb7\x19\x5d\x2e\x9b\xc9\x9a\x81\xa0\x4e\x4c\x92\x55\x88\xa2\xd9\xbc\xa9\x55\xca\x16\x6d\xe1\xdc\x20\x59\xea\xb0\xcd\x28\x5a\xaa\xc2\x32\x94\xb5\xb3\x38\xca\x31\x96\xf4\xfa\x45\xff\x07\x44\xd7\xb2\xe5\x60\x39\x68\xda\x05\x17\xab\x70\x34\x46\xc9\xa0\x80\x34\x94\x0d\x74\x7c\x54\x9b\x25\x9b\x7c\x39\x46\x63\x56\xc6\xc1\x9a\x0c\x3b\x08\x8e\x65\x93\x22\x4c\xaa\x59\x5d\x25\x7a\x46\x27\xe1\x53\xec\x97\xcd\xc8\x51\x35\x35\xe5\x09\x17\xe1\x18\xa8\x4a\xdf\xb1\x46\xf1\x21\xe7\x35\x3e\xe4\xf0\xed\x54\x6c\x56\x15\x7a\xe6\x49\x27\x0a\xa9\xba\xcb\x7e\xcf\x98\xc4\x26\x55\x36\x4b\x6f\x53\x64\x12\xd2\xd5\xa2\xa5\x65\x09\xe5\xbd\x35\xaa\x4c\x33\x35\x6a\xc5\x4d\x8f\xc9\x53\xfe\x94\xba\x3b\x78\xef\xcd\x65\x9b\x6e\x29\x8e\xf3\xb1\x53\xde\xb0\xe9\xae\xa5\xc3\xbb\x1b\xa1\xea\x41\xcf\xac\xcd\x45\x66\xab\x89\x34\x7a\x5c\xcc\xa2\xbe\x13\x68\x94\x63\x3a\x67\x50\xcb\x69\x83\xaa\xfc\x99\x7e\x1c\x6c\xc7\xc9\x4b\x83\x38\xb1\xec\xcc\x97\xf0\xeb\x11\x34\x62\x4f\xfb\x20\xc6\x41\x1c\xc1\xb5\xc1\x60\x5b\x3b\x6e\xaa\xbc\x8e\x31\xc1\x95\x1b\x82\xd9\xd6\x87\xbe\xd1\xf6\xd4\x99\x41\x12\xce\x15\x23\x38\x28\xe2\x48\xa4\x3d\x11\xb4\x4b\x58\x56\x1c\x7f\x57\xbc\xe3\x44\x3b\xc6\x24\x88\x3e\x7d\xe6\xbd\x04\x17\x97\x55\x7e\xf8\x02\x26\x11\x8c\x6b\x31\xae\x15\x8a\xe7\x0c\xfc\x82\x3c\x7e\x42\x94\x7d\x18\x47\x22\x89\x08\x16\x6b\x65\x37\x0e\x7a\x7c\x95\x9f\x8a\x82\xb0\x2c\x56\x17\x19\x8e\x34\xa9\x52\xe5\xf5\x4c\x32\xac\x62\x8c\x9b\x42\x35\x91\x4c\x30\x39\x8c\x33\x91\xa4\x98\x89\x44\x6c\x1e\xf1\xa5\xa8\x2e\xa6\x7d\x91\x64\xa2\x9e\xd9\x8e\x83\x44\xf4\xb8\x23\x95\x9b\x45\x31\x83\x31\xd2\x22\xa2\x81\x33\xb8\x5d\x10\x6a\xb1\xe8\x89\x46\xc4\x04\xc6\x41\x51\x48\x88\x99\xba\x83\x42\x10\x63\x22\x7c\x22\x98\xc1\xc1\xc4\x28\x21\x47\xc5\x24\x16\x93\x09\x31\x29\x06\x25\xaf\x54\x83\x33\xe7\x08\xf5\x5e\x9f\xb7\xce\x48\x8a\x1e\xbe\xde\xdb\x90\xf4\xbb\x93\x42\x44\xac\x09\x89\xcb\xc4\x64\x86\x64\x08\xc6\x62\x06\x7d\x5a\x14\x7f\x20\x8a\x27\x7e\xb6\x6c\x59\x93\x60\x64\x4c\x4f\xa4\x48\x2d\x5f\x8b\x99\xa6\x48\xa4\x16\x3d\xed\x89\x46\x32\xc1\xf6\x62\x46\x2c\x66\x22\xc1\x85\xe3\x4d\x4d\x4d\x91\x0c\xc1\x11\x1c\xc1\x02\xdf\x1a\x14\x93\xc1\x64\x53\x26\x58\x24\x38\x11\x59\xf8\x54\x32\x40\x70\x91\xd9\x11\x7c\x4d\x14\xb9\x3b\x1c\xd8\x99\x00\xee\x5b\x73\x63\xe5\x57\x0b\x2f\x0b\xb2\x28\x14\x30\xae\xc1\x18\xdb\x2c\x12\xeb\xc3\x42\x5c\x70\xe0\x55\x70\x4d\xdc\x8c\x60\xe6\x1f\xd0\xc1\x00\x7d\x8e\x7b\xe3\x42\x20\xde\x3e\x14\xc0\x81\x32\x1e\xc1\x18\xc7\x03\xb8\xf2\xd4\xc2\xd2\x5d\x8b\x88\x14\xe9\x1a\xc7\xb9\x2f\x8e\x8f\xa1\xc8\x1c\x73\x59\x0d\xae\x29\x17\xe2\x83\x83\x53\x85\x78\x57\xbe\x2b\x9f\xc6\x35\x36\x77\x54\xc6\x29\x1f\x0e\xa4\x71\x33\x8b\x71\x2f\x6e\x95\x31\xc6\x2d\x3c\x2e\x77\xf1\x1e\x5c\xc0\xe9\x7c\x1a\xe7\xb1\x19\xc1\xbd\xf6\xc3\xde\xae\xbc\x80\x71\x20\x5d\xb0\x33\x0a\x35\x4b\x84\x04\x49\xab\x91\x38\xc6\xf9\xae\x72\xa1\x2b\x5f\xc6\xf9\x74\xb3\x32\x65\x7a\x05\xca\xaf\x61\x01\xa7\xcb\xbd\x85\x41\x41\x28\xa7\xbb\xd2\x5d\xe5\x7c\x3a\x90\x2f\xa0\xce\xd9\xae\x9a\xb5\xf9\xae\x91\x91\xfc\xda\x8b\x56\x98\x96\xba\x36\x5f\xf6\xa6\x85\x82\xcd\x6d\xc6\x31\x8e\xf7\xae\x15\xb0\xf0\x00\xee\xe5\x44\x3d\x48\x51\xce\x30\x4e\xe3\xbc\xfd\x5a\x5c\xe7\xc3\xf9\x90\x56\xc6\x85\x42\x3e\x9f\xc7\x58\x88\xfb\x6b\x85\x78\xde\xe6\xff\x70\x1e\x0b\x65\xec\x6d\xb4\x19\xda\x80\x00\x80\xe0\x4f\x27\x25\x76\x1f\x6e\x04\x1d\x20\xb8\x14\x99\x72\xa9\x6c\xcb\xaf\x1a\x26\x72\x08\x13\x25\x8e\x14\x36\x8e\x68\x4c\x26\x2b\x97\x32\xd9\x3f\x3d\x32\x75\xeb\xec\xec\x59\xdd\x67\xa3\x83\xc3\xc3\x87\x10\x3a\xbb\xfb\xac\xd9\xd9\x5b\xd0\xd4\x23\xcc\xd3\xdc\xd1\x3e\xf4\xfc\xaa\xab\x8a\x7d\x1d\x15\x61\xe3\x4d\x88\x41\x37\x6e\xac\x08\x1d\x7d\xc5\xab\x56\xa1\xe7\x7b\x8f\x72\x80\xd0\xc3\x95\x51\x66\x08\xe7\x80\x05\x40\x86\xac\xa3\x87\xef\xba\x0b\xe7\xde\x31\xc1\xae\xc7\x47\x4f\x4a\x2c\x76\xea\x81\x24\xa4\xc8\x12\x6a\x44\xa6\x51\x2c\x5b\x6c\xa9\x6c\x99\x2d\xc8\x94\x5b\x9c\x98\xb0\x22\x87\xc2\x2a\x8b\x1f\x99\x42\xb7\x38\x35\x41\x87\x36\x6e\x3c\xe8\xd4\xe4\xd6\xa9\x47\x98\x4b\xb9\xa3\xbd\x95\x26\x5a\x11\xf4\xd6\xc6\x1b\x11\x83\x6e\xda\x88\xde\xa2\x15\xa9\x34\xf5\x1d\xa5\x67\xaa\x10\x8c\x32\x4d\xec\x6d\xec\x1c\x04\x6d\xba\x2c\x21\x5d\xcb\xd8\x8d\x36\x97\x22\xa3\x18\x36\x8a\x65\xf6\xb6\x65\x07\xda\xbb\x8e\x75\x1a\x7b\x56\x9e\x71\xc0\x3a\xe3\x98\x55\xda\xc3\xce\x7d\x6e\xd0\x18\x6f\x1b\xf9\xdc\xca\xd2\x8e\x36\x5a\xc6\x6a\x00\xf6\x01\xee\x51\x28\x00\x20\xe7\x50\x3d\x85\xf1\x4a\x29\xa9\x30\x35\x1b\x4a\x15\x2d\x95\xa4\xaa\xf6\x40\xb6\x60\x6d\xda\xbd\x5b\xb4\x89\x7c\x86\x79\x63\xf0\x4c\x66\xe2\xac\x11\x64\xa2\x9d\x95\x2f\x49\xb2\x7e\x0f\xba\xe1\xa3\x9d\xad\xd3\x0b\xad\xe8\x6b\x9a\x2c\xdd\x7d\x55\xc7\xdb\x4f\xb9\x86\x5e\xea\xe0\xb8\xbe\xc4\xe4\xf6\xcf\xf8\x7c\x57\x7d\xbc\x2b\x1e\x5f\x36\x74\xf7\x0b\x47\xd1\x2b\xc5\x37\xbf\xb2\xa6\x37\x19\xef\xba\x6e\xee\x77\x7f\x8e\x86\xee\xee\x06\x06\x0e\xa1\xd5\xec\x61\xd7\x5a\x48\xc0\x10\x00\x0a\xab\x8e\xad\xe1\xa2\x31\x12\x05\xf6\x20\xd8\xfe\xa7\x84\xd4\x30\x9b\xb5\xd4\xb2\x55\x36\x8a\x6a\x58\xb5\x54\x12\xae\x1a\x39\xa9\xd4\x95\xb8\xae\x65\x33\x59\x0a\x77\x99\x31\x4b\x56\x19\x8d\xe6\x3a\x62\xb1\x58\xac\x23\xd7\x20\xbb\xdd\x72\x43\xae\x93\xde\x35\x64\x65\x8f\xdb\x3f\x70\x60\xfd\x81\x26\xab\xa9\x39\x97\x6f\x6f\x3e\xb0\x7e\x7f\x42\x16\x04\x39\xb1\x7f\xfd\x81\xe6\xb6\x7c\x63\xbe\xd1\x8e\x3b\x90\xf4\x0b\xa2\x9f\x29\x34\xc8\x3c\x2f\x37\xbc\x57\x14\xef\x96\xb3\x0d\x1d\xf1\x78\x34\xda\x89\x5a\x0e\x6c\x38\x10\xf7\x4b\x82\x9c\x38\xb0\x61\x7f\x0b\xcd\xda\xd6\xb2\x7f\x83\x9d\x55\xf0\x27\xed\xb8\xf6\x7c\xbe\xa9\xd1\xb2\xfb\x9c\x3f\xf9\x96\xeb\x5d\xd7\xd7\xe1\x3a\x80\xfa\x6c\x29\x93\xad\xd7\xec\x5e\x35\x52\xd9\x54\x35\x40\x9b\x4a\x83\xc5\x70\x27\x53\x0c\x2b\x21\xec\x7c\x5c\x25\x14\x4e\x38\x1d\x53\xb6\xd0\x52\x64\x96\x68\xb7\xd0\x84\xf4\xa0\x9a\x9d\x41\x0d\x39\x9d\xe4\x43\x29\x27\x67\x4a\x42\x64\x31\x18\xc2\x8a\x1a\x0a\xab\x71\x74\xaa\x48\xe7\x45\xb4\x9f\x97\x22\x46\x67\x58\xb6\x12\x95\x24\xd1\x87\x7e\x76\xb0\xf2\x80\x2c\x0a\x7e\x64\x34\xf6\x1c\x19\x23\x82\x12\xae\xfb\x56\x7f\x7b\x22\xe5\x8f\xab\x38\x82\x6b\xea\x52\xf1\x3b\xc4\x50\x2e\xee\xf6\x11\xa4\xf0\x9e\x50\x9d\xaf\x76\x89\x5f\x66\x85\xb6\xd2\x27\xe2\xcb\x19\xaf\x0f\x65\x02\xee\x65\x23\x84\x7b\x10\xf5\xf9\x02\x82\x5c\xb9\xa1\x65\x92\x41\x27\x03\x3e\xc9\xb7\xf0\x26\xc3\x78\x7d\xf1\xdb\x42\x3e\xa6\x2f\xb1\xed\x58\x24\x11\xf0\xc7\xdc\xfe\x55\x01\x59\xfa\xed\x9f\x83\x49\x3f\x12\x45\x51\x78\xc4\x2b\x4a\xde\xf6\x73\xbf\xe3\xc5\x41\xd9\x2f\x86\x78\xc1\x15\xf4\x07\xfa\x1b\x5f\x0a\x6a\xcb\x3d\x1e\x74\x8d\x10\xf3\x04\x02\x1c\xc3\xb0\x61\x9f\x0f\x11\xc6\x4d\xa2\x98\x65\x7c\x53\x6e\xfc\xac\xe0\xf5\x79\xdb\x77\xbb\xbc\x82\x24\x79\xb3\x9e\x5f\xcc\x0f\xf2\xb2\x2b\x26\xf8\x79\x9e\x17\x04\x11\x33\xac\xdf\x2f\xf6\x03\x30\xd5\x79\x9c\x07\x16\x88\x33\x93\xe5\xea\x6c\xbe\xeb\x2e\xb4\xf7\xc4\x31\xf2\xa3\x13\xc7\x00\x80\x81\x87\x2a\x63\xec\x6a\xee\x51\x90\x61\x04\x00\x39\x63\x51\xaf\x0e\x46\xac\x84\x82\x34\xa6\xbe\x05\xd9\xc3\xcc\xca\x56\xaf\xa7\x66\x88\x3d\x67\xec\x64\x9c\xdd\xe1\x04\x9f\x1a\xa5\xa6\x2d\x93\x65\xba\xa9\xf5\x0a\x93\x6a\xcb\xad\x44\x0c\x62\xc3\xdb\x3a\xfb\xd6\x8e\x3e\xb8\x67\x70\xb0\xf2\xed\xc3\x33\x5b\xfb\xa6\x1b\x0e\xcf\x6c\x1d\xbe\x92\x77\xb3\xbd\xcf\x18\xdc\xd0\xf2\x75\xbe\xb5\xa3\x28\xf1\xd9\xdd\x93\x4b\x4a\xb3\x2d\xd6\xe4\xc5\xb7\x60\xe2\x3c\xe9\x47\x3d\xfe\xfa\x9e\x49\x8e\x93\xc4\xee\xde\xd8\xd6\x95\x87\x4f\xfc\x01\x2f\x3b\x63\xf2\x92\x9b\xce\xb8\x61\xe7\x67\xb6\xf6\xc8\x41\x7a\x5d\x47\x50\x2a\xf2\xcc\x06\x63\x89\x6b\xeb\xca\xa3\x57\xf7\xdd\xb2\xfb\xe1\xdd\xd9\x48\xdb\xd2\x35\x73\x0f\x5f\x30\xc5\x22\xe7\x59\x33\x6d\xf3\x4f\x5d\x07\xd8\x30\xb7\x1d\x82\x90\x05\x08\xda\x73\x2c\x81\xc2\x4a\xc8\x87\xb0\xae\x2d\x41\x19\xb3\x54\xff\x21\x71\x2f\xaf\x10\x05\xaf\x7f\xc0\x23\x0c\xc8\xbc\xe4\x5d\xed\x46\x87\x3f\x10\xc1\xb9\x07\x05\x69\xa5\xe4\x15\xa5\x21\x59\xd8\x2c\x78\x45\x71\x50\x10\x57\x49\x5e\x51\x5c\x2d\x0b\x5b\xbc\x5e\x11\x00\x58\x98\x38\xf9\x26\xce\x70\x8f\x83\x0a\x4b\xe0\x2c\x5b\x22\x76\xa9\xe1\x80\x12\x62\x08\x76\xe9\x5a\x3a\x9b\x61\xcc\x52\xc0\x2a\xa7\x6d\xfa\x4a\xc7\xb1\x3d\x13\x9c\x89\xd0\x82\x74\x0d\x23\xcd\xfe\x04\x94\x02\x52\xf2\x61\xd0\x33\x20\x8d\x48\x42\x94\x6a\xc4\x91\x1a\x56\x8b\x65\xd3\x50\x42\x98\x1d\xbc\x1e\x49\x3b\xa7\xf6\xec\x39\x6f\xa6\xf2\xd6\x67\x6f\xa8\xbc\x73\xde\x79\xbb\x77\xef\x9c\x42\x72\xe5\xcb\xe7\x4c\x4d\x8d\x9f\xfb\xe7\xab\xae\xfe\xeb\xf8\xf8\xce\x9d\xdb\xc7\xde\xb9\xf2\xea\x77\xd1\xed\x9f\x7c\xeb\x23\x47\xde\x3a\x9a\x59\x95\xe5\x5c\x41\x92\x1f\x6c\x2a\xad\x1b\x1c\xf2\x6d\xbe\x3b\x97\x62\xbc\xfb\xb7\x0d\x8e\x5e\x7c\x8d\xf9\xcf\xdc\xe3\x7b\x76\x4e\x56\xde\xbc\xe1\xd3\x95\x3f\xcf\xcc\xec\xda\x3d\xb3\x13\x79\x3f\xfb\x19\x24\x4d\xef\xdc\x53\x59\x18\x7b\xfb\x63\x57\xbf\x35\x3e\x36\x35\x79\xce\xb9\x6f\x5f\x75\xe5\xf1\xd1\xb1\xe9\xe9\xe3\xff\xfa\xb1\xd7\x2f\xbd\xf4\x8d\x2b\x44\x09\xc5\xbf\x3b\x1a\xaf\xe5\x2f\x9d\x3f\x6b\x34\x12\x39\xf8\x6c\x6b\x03\x73\xc1\xf2\x89\x96\x0d\xc0\xc0\xa3\xf0\x38\x3b\xc4\x4a\x40\xc0\x07\x10\x44\x86\xc2\x06\x15\x9d\xad\x5e\x1f\x45\x9b\xa5\x1f\xff\x58\x8a\x39\x17\xf4\x32\x5a\x52\x5f\xf9\xcf\xca\x7f\xd6\xa3\x25\x8b\x21\x4a\xe3\xb7\xa0\x20\x7b\x27\x73\x12\x30\x40\x30\x25\x13\x5d\x4e\x6d\x61\x07\xd1\xb9\x0b\x75\xcc\xc9\x8a\x82\xd0\xc7\x00\x5c\xa7\xfa\x3d\x00\xed\xb0\x01\x66\x00\x90\xac\xd2\xc3\xaf\x4b\x11\x1d\xf3\x2d\x8c\x1e\xb4\x6f\x95\x94\x69\x14\xcd\xd2\x12\xa4\x65\x95\xd0\xe2\xad\x5c\x6a\x44\x66\xaa\x4a\x56\xd8\xbf\xf3\x93\x31\x7f\x64\xd5\x54\xac\x0e\x27\xba\xfd\x22\x72\x15\x7a\x12\xd7\x0c\x4f\x14\xb5\xca\x7d\xcd\xf1\x81\xa1\x7c\x3e\x6d\x56\xbe\xdd\x58\x5f\xdf\x88\x26\xce\xe8\xee\xea\x39\xe3\x77\x7f\xcf\x37\x73\x0d\x55\x3e\xce\xb7\x45\xc2\xae\x81\x65\x45\x53\x94\xfa\xf6\xd6\x2f\xfc\x75\xdf\xb5\xc5\x62\x38\xb6\x69\x2a\x7f\xe7\xc1\x62\xf1\x20\x53\x7b\x70\x39\xca\xe5\x6e\x58\xb7\xf6\x7a\xb6\xf8\x77\x7d\x3b\x7b\x9e\x74\xb1\x07\x98\x9d\xdc\x3d\xe0\x05\x15\x00\x51\xea\x6c\x14\xcb\x76\xc3\x16\x49\xb6\x59\x2a\xa3\x8d\x9b\x0f\x1f\xda\xb2\xe5\xa2\x83\x9b\xf7\xde\x73\xef\xde\xfd\x77\x7d\x9e\x3b\xdb\xbe\xbd\x68\xcb\x96\x43\xcb\x3f\xbf\x77\xfe\xde\x7b\xf6\xed\xbb\x07\x10\xea\x72\x95\x59\x37\x77\x2b\x78\x01\x10\x1d\xbe\x4a\x08\x13\x4e\x67\xce\xd1\x73\xa1\x54\x2e\x91\xa8\x3c\x39\xc0\x9d\xa3\xd7\x34\x24\xc2\x0d\xa1\x1f\x02\x82\xed\x00\xec\xdd\xdc\x6d\xf6\xa8\x40\x8a\x2e\x3b\xff\xec\xb1\x5f\x36\xd8\xbb\x2f\x1b\xbe\x6f\xe4\xd1\x1f\xfe\xe2\x4b\xdc\x6d\xcb\xdf\x7d\x98\xdb\xf4\xee\xc3\xcc\xef\xf8\x6f\xdc\x74\xfb\xb7\x00\xc1\xe5\x4c\x1b\x3a\xcc\x2e\xb7\x79\x86\x0f\x9b\xd9\xd7\x0f\xfb\x24\x31\xb0\x5e\x90\xd6\x87\xdc\x7e\xf1\x4c\x0f\xf3\xfb\x11\xc9\xbf\xd9\x2f\xfa\xfc\x67\x86\xa4\x49\x51\xb4\x5f\x87\x76\x56\x46\x59\x9b\x03\xa9\xb1\x57\x69\xda\x62\xba\x34\x5b\x06\x29\x5b\xd5\x96\x67\xd1\xce\x4d\x7d\xbd\xed\xad\x0d\x4b\xfd\x81\xc2\xb2\xfa\x64\x7c\xf3\xd8\xfe\xa9\x5d\xeb\x2b\xbf\x29\x35\x36\x37\x07\xfd\xcc\xe3\x3b\x5d\x68\xc3\xca\xd5\x5b\x93\x76\x3f\x4e\xc2\xe3\x2c\xb3\x38\xc6\x2d\xdd\x0c\xb2\xa6\x81\xd8\xea\x75\x2f\x1d\xda\x9b\x63\xce\xe5\xf1\x7a\xe4\x41\x9e\xfa\xca\x4f\x2b\x3f\x5d\x0c\x39\xbc\xd0\xdd\x68\x2f\xbb\xc9\x95\xa5\xfd\x47\xb2\x16\x05\x9c\x26\x2a\x41\xc7\xdf\xde\xf1\xf6\xdb\x3b\xde\x7e\xe7\xdc\xb7\xdf\xde\xc1\x9c\xb7\x18\x7a\xfb\xed\x1d\xc0\xc2\x16\x78\x83\xbd\xd3\xf5\x18\xb8\xa0\x06\x9a\x00\x82\x66\x4a\x55\xb8\x0f\xe9\x94\x0f\xeb\xa8\x2d\xec\x0a\xb4\xf0\xc7\x0f\xf4\x96\xff\x83\xbd\x77\xd5\x35\xe8\x13\x7f\xfc\x40\x0f\x32\xdf\xf9\x9b\x2e\x05\x44\x79\xb8\xff\xcd\xfe\x13\xc8\x00\xf5\xef\x9f\x57\x65\xcb\x40\x83\x13\x2d\x95\xe5\x2d\x13\xbb\x0b\xbf\xc9\x16\x5e\xfe\x42\xb1\xf8\x05\xf4\xf8\x9a\xa6\x81\x3d\x80\xe0\x25\x97\xc5\xea\xdc\xad\xf6\xdc\xae\x43\x46\x50\xcf\x92\x97\x5e\x3d\xf0\x6a\xc7\x6b\xaf\xb9\x2c\xb4\xa3\x72\xfb\x8b\x2f\xd2\x34\xe5\xc5\x34\x41\x5b\x32\x64\xf5\x97\x3a\x5e\x7b\xad\xe3\xd5\x03\xdc\xad\x2f\xbc\x50\xf9\x1c\x7d\x7f\xc5\xf5\x30\xcb\x70\x0d\x36\x5f\x1b\x34\x53\x4a\x85\x71\xb9\x1e\xbe\xe4\x12\xa7\x6f\x7f\x45\xdf\x31\x00\xa2\x9d\xdf\x99\xbf\x06\x65\x37\x7f\x65\xc8\xfb\x76\xed\x9a\x97\x8d\xd0\x67\x0e\x1f\xba\x91\x1b\x58\xd9\xdf\xb7\xea\x8a\xab\x3f\x6e\x8f\x91\x9b\x5d\x07\x98\xdd\xdc\x76\xa8\x03\x40\x16\x1d\xd0\x09\x14\xb7\xb9\x54\x1f\xa2\x59\x97\x20\x3a\x58\xd1\x7d\x03\x58\x22\x58\xc4\x2b\x38\x17\x72\xe1\x15\x02\xcf\x7a\x44\xd7\x90\xcb\x85\x39\xf7\x20\xf5\xfa\xe3\x12\x78\xb7\x80\x57\x7b\x39\x0e\x6f\x71\x79\x79\x2c\x52\x77\x1e\x68\x9d\xcb\x62\xbe\x44\xe7\x8b\x3d\xf7\x16\x27\x9e\xcd\xff\x52\xae\xc9\x99\x7e\xe8\xb6\x8e\x7c\xbe\xa3\x33\x97\xeb\x5c\x3d\xb5\x6a\xf5\xf4\xf4\xea\x55\x53\xae\xd7\xf2\x1d\x1d\xf9\x86\xce\xce\x86\xa1\xa9\xe9\x55\x43\xd3\xd3\x80\xd0\x9e\xca\x28\xf3\x5b\x00\xfb\x1b\xa4\x28\x91\xb2\x5b\xa8\xd2\x6a\xda\xac\x11\xf3\x91\x15\xeb\xca\x2d\x0d\x9d\xa1\x68\x7a\x57\xcf\xf2\x33\x0f\x4e\x2e\xdd\x6b\x2d\x69\x4b\xa4\xfc\xcb\xfa\x57\x58\xab\xef\xb6\x68\x1f\xbd\xee\x9a\x65\x1b\xb8\x29\x5a\x1b\x9b\xef\xd7\x28\x83\x40\xf4\xa5\xa8\x6a\x43\x50\xb6\xd8\x86\xd0\xf8\x5a\x57\x71\x59\x6f\x21\xdb\x28\x94\x83\xe7\xae\x6f\xe9\x3b\xa3\xe0\x4a\x37\x49\xdc\xd4\xf4\x94\x5a\x93\x33\xce\x9b\x41\xaa\xda\xd0\x42\xd7\xe0\x5f\xba\x2c\x36\xb3\xd8\xbe\xba\x53\x24\xc1\x87\x8c\xe0\x7b\xe1\x5f\x7e\xaa\xa6\x31\x12\x6d\x50\x42\x3f\xfe\xb7\x53\x21\x97\x85\xe4\xa6\x4c\x43\x9d\x3f\x13\x7e\xfe\xbd\x10\xad\x63\x1b\xfa\xbc\x2b\xca\xd4\x2d\x7e\xe3\x36\xf6\xf7\xe8\xf3\x17\x5d\xe4\x7c\x63\x40\x9f\xe7\xc1\x79\x26\x9b\x29\x85\x07\xfa\x08\xc1\xd3\xec\x3b\xe8\x49\x9c\x03\x5b\xd0\x72\x58\x52\x05\x93\x90\xaa\xa0\x65\x4d\x5b\x3f\xd9\xbf\x52\xba\x9c\x7d\xe7\xc8\xe6\x5d\xc7\x1a\x1b\x3f\x7d\x61\x3e\x0f\x08\x2e\x64\xdf\x41\x7b\x9d\xf4\x41\xe7\x33\x98\x65\xab\x94\x35\xdf\xac\x26\xc7\xb9\xd3\x92\xdb\xe9\x2b\xaf\xa2\xbd\x28\xf2\xdf\xa6\x47\x91\xd3\xd3\x33\x76\x7d\x58\x95\x96\x1f\xf9\x40\x8d\xd4\x0f\xad\xde\xeb\x1f\x52\xcd\x4b\x4e\x2f\x12\x18\xbb\xce\xcc\xf3\x8b\x65\xbe\xaf\x16\xf5\x1f\x5a\xa5\x17\x3f\xa4\x2d\x7f\x53\x66\xe5\x55\xe6\x79\xda\xae\xbf\xaf\xcc\xd3\xdb\xfb\xfe\x32\x11\xac\xa8\xfc\x99\x7d\x9c\xbb\x1d\x8a\xb6\xac\x56\x65\xfb\x1d\x7e\x92\x0a\x42\x55\xca\x9b\xc9\x86\x55\x86\xd5\x19\xb6\x6c\x51\x49\x68\x51\x3c\x40\x7f\xe0\x5b\xda\x07\xbb\xda\x87\xac\x16\xf7\xd8\x86\xc9\x68\x6b\x97\xd5\x9c\xdc\xb9\x69\x94\x9f\x3a\x0f\x67\xf0\xec\x94\x7b\x6c\x78\x32\xda\xda\x69\x35\x25\x67\x36\xb1\x95\xf1\x0d\xa7\x6e\x46\x4f\xe5\xf3\x3e\x3e\x59\x29\x2d\x54\x18\x06\xfd\x68\xf2\x71\x4f\x33\x8d\x6d\x6b\xa1\x75\x5b\x5e\xf9\x33\xfb\x18\x77\x3b\x6c\x03\xa8\xff\x60\x6d\x4e\x2d\x86\xd6\x07\xaa\xa4\x66\xb2\x7f\x1b\xf3\xff\xd7\x2e\xcc\xf8\x47\x37\xed\x4c\x36\x5b\x5d\xad\xd1\xc9\x0d\x63\xee\x16\x6b\xa8\xbd\x6b\xb0\xbd\x85\x1f\xdd\x34\x93\x6c\xb2\x3a\x5b\xa3\x93\xc3\x63\xee\xa9\xf7\xb5\x65\xf4\xbf\x6b\xf6\xd4\xd3\xde\x0f\xc9\xbf\x61\xdc\xdd\xd2\x46\x63\x9b\x3d\xbf\x7b\xe4\xe1\xdf\x9d\x6a\xa6\xfb\xc3\xbb\xe4\x77\x0f\x3f\x62\xb7\xff\x45\xf4\x0f\x6c\x03\xfb\x57\x7b\xfd\x09\x9e\x46\x81\x5e\x7c\xf4\xf0\xa1\x2f\x3c\x76\xe8\xf0\x23\xcc\xb3\x87\x1f\xf9\xc2\xa1\x43\x8f\x3d\x0a\x2c\x5c\x7e\xf2\x38\xfe\x29\x72\x53\xfe\xba\x13\x60\x19\xfa\x9f\x71\xd8\x1f\x16\xf7\x37\xeb\xf5\xd7\xfe\x5f\x11\xf7\x7f\x60\xf5\xf1\xff\x3f\xee\x01\xd9\x3c\x28\x13\xa0\xeb\xf3\x29\x0e\xf4\xd1\x0f\xb2\x9c\x76\x1f\x4c\xc2\xe3\xe8\x5f\x9c\x74\xd6\xfb\x57\xef\xc7\x4f\x5b\xac\x51\xe5\xa1\x93\xff\xc6\x3c\xc4\xdd\x6c\xd3\x1a\x0e\x19\xa8\xf2\x10\xfb\xc8\xc8\x89\xcd\x31\xee\x89\x77\x87\xe8\x58\x2a\x00\xb8\xf2\xdc\xad\x90\x07\x08\xea\xa6\xe1\x70\x97\xaa\x9e\xd1\x39\x4d\x91\x53\xc5\x6e\x5b\x5c\x33\x4b\x7a\x4a\x36\x14\xfd\x3d\x26\xf4\xed\x67\x9e\x99\x1e\x63\x3f\x3d\xdd\xda\x79\xa4\xf2\xed\x29\x34\x33\x51\x2c\x4e\x54\x6e\x7a\xe6\x99\xa9\xf1\x85\xe7\xc6\xa6\xd1\x64\x17\xf3\xeb\x63\xc5\x57\x9e\x44\xc7\x2a\x77\x2d\xeb\xa8\x3c\xd4\xb5\xb4\xf2\x4a\xd7\xe0\xb1\x62\xf1\xd8\xfb\xf4\x20\xe5\x0f\xd1\x83\xd8\x3f\xef\x53\x85\x2c\x41\x8e\x3d\xae\xa3\x0e\x31\x3e\xa0\x0d\x49\xa1\x8b\x2b\x37\x0b\x12\x1a\xab\x7c\xf3\x7d\x1a\x11\xe6\x91\xeb\x24\xe1\xaa\x3d\xe9\xb7\xbf\x76\xba\x4e\xe4\xbc\xf3\xbb\xe2\xf1\xae\xd3\x95\x22\x4c\x57\x22\xd6\x75\xfe\xe6\xaa\x5a\x04\x58\x28\x9c\xfc\x77\xf2\x18\x77\x2b\xa8\x50\x80\x43\x36\x67\x1e\x56\x1d\xe9\x66\x91\x37\x47\x94\xff\x42\xba\x1c\x52\xc3\x6a\xd6\x3a\xcd\x68\x8d\x0a\xa4\xf5\x98\xd8\x8b\x59\x36\x93\x95\xff\x86\x65\xa7\x08\xa6\x45\xd9\x90\x53\x65\xcb\x69\x08\x65\xca\xa9\xac\x44\xa7\xa0\xe6\xa8\x5d\x74\x2d\x93\xd5\x65\x74\x0b\xeb\xca\xf5\xb5\x77\x7a\xdc\xfd\x07\xa2\x61\x44\x36\xf5\xb6\xb5\x79\xbc\xec\x25\x5f\xd6\xa2\xe6\x8a\x56\xab\xb3\x7d\x39\x39\xbb\xb3\xb3\xb2\x30\xb9\x79\x65\xa5\x8d\xe4\x8a\x4f\xee\x98\xd8\x96\xaa\x73\xbe\xc0\xf4\x18\x73\xde\xd9\x5b\xb7\x95\x8a\xc8\xf3\x62\x11\xb1\xf9\x7e\xa6\x7c\x67\xde\x75\x78\xf0\x8c\x35\xc7\x0e\x6d\xdb\x38\x75\x69\xc7\x92\x68\x34\x10\x88\x26\x2e\xde\xc1\x23\x6e\xe7\xc2\x79\x6e\x7e\xca\x68\x42\xfc\x95\x73\x5b\xce\xae\x51\xf7\xfd\x38\xaf\xa3\x4a\x7a\x61\xe3\x86\x4c\x02\x7f\x0b\x7d\xb4\xa9\xa9\x64\x6e\x9c\xba\xb8\x74\xd1\xa6\x83\x2b\xd9\xc9\xed\xf3\x97\x9d\x11\x8e\x55\x7e\x62\x7f\x4d\x76\xec\x58\x91\xe9\x5a\xba\x77\xcf\xc5\x36\xff\x13\x44\x75\xa1\x3b\x7b\x47\x56\x76\xcd\x5e\x60\x5d\xb2\xed\x9a\x6d\x23\x8c\x17\xb3\xdc\xfc\x85\xcc\x63\x80\x4e\x3e\x0f\xe0\x6a\xe4\x9e\x85\x3e\x80\x60\x26\xab\x5b\x86\x59\xb2\x74\xcb\x28\x5b\xe5\x34\xa5\x45\x54\x80\x0c\x12\x5b\x8a\x37\xed\x4e\xb0\x85\x48\x92\x22\xa9\x90\x9a\x22\xd5\xae\xb3\xc5\x7f\xc3\xe9\xa7\xf4\x35\x4b\xa5\x59\x79\x0b\x5a\x21\x77\x48\x4b\x37\x20\xed\x96\xc6\xa6\x86\x3c\xcf\x87\xa4\xdc\x48\x43\xeb\xd6\xc6\x4c\xd1\x90\xe5\x8b\x9e\x37\x92\x84\x79\x46\x5e\x58\xcd\x30\xf7\xc8\x0b\xfb\xe4\xde\x55\x17\x4e\xcd\x3f\xbd\x7c\x55\x61\xf7\xcc\x3d\x4f\x54\x5e\x46\xfb\xae\xba\xa1\x2b\xe6\xf7\x75\x5d\xff\xb1\x2f\x7d\x8b\xf7\x04\x71\x73\xe5\x15\x74\x65\x53\xd8\xc3\xfa\x19\xe1\x87\x8f\xec\xa4\x63\xe5\x8e\x6b\x6e\x5f\xd7\x8f\xd8\x33\xb7\x8d\x5e\xb7\xbc\xbd\xcc\x7c\x9b\xae\x37\x6b\x4e\xbe\xc2\x3e\xc8\x7d\x19\x6a\xa1\x15\x20\xe8\x48\xba\xef\x1f\x21\x8e\x10\xcc\x85\xec\xa1\xb0\x28\x24\xdb\x04\x17\xb2\x66\x12\x5e\xe5\xa4\x73\x56\x9c\x71\x06\x26\xcb\xf7\xaa\x7e\x4e\x1a\x5f\xd1\xb3\xcc\xdb\xbf\xaf\xc6\xcf\xfc\xf3\x9e\x1f\x5f\x70\xc1\x8f\xf7\xec\x7b\x76\x76\xd7\x74\x2c\x32\x52\xf9\xf9\x17\x51\x11\xdd\xc3\x44\x72\x99\x43\x2f\xb6\x9b\x88\x3b\x32\xbf\x72\x75\xbe\xf1\xd0\xaf\xda\x8a\xdc\xe5\xf3\x23\x57\x1c\x7d\xf3\xe8\xd1\x37\x8f\x1e\xf9\xd3\x47\x7b\x02\xea\x31\x14\x15\xad\x85\xef\x52\x7e\xcd\xe6\x3d\x5d\xad\xdc\xad\xc0\x00\x07\xe0\x46\x29\x37\x4a\x31\x4c\xe5\x3c\x36\x55\xb9\x91\x91\x8e\xff\xdc\xf5\xf0\xf1\xe7\xb8\xc4\xbb\x53\xce\xfc\xaf\x8c\x72\x5f\xe3\x6e\xa5\x7a\x54\x4d\xf9\xe0\x98\x55\xf4\xf7\xc7\xe9\xe8\xe4\xd4\xe2\x08\xe3\x3e\x31\xbe\x18\xe6\x76\x1e\x7b\xf7\xe4\x31\xc3\x38\xc6\x21\x7b\x58\xbc\x7b\xd2\xfe\xe5\xd0\x31\x40\x70\x51\x65\xcc\x75\x11\x77\x2b\x28\xb4\x26\x45\xcb\x20\x29\xb3\x68\xb9\x51\x46\x77\xc8\x4c\xca\xa5\x9f\x78\x83\x39\x6c\x4f\xdc\x13\xd3\x4b\x9b\x98\x9b\x16\x66\x9a\x96\xb2\xb7\x4c\xb7\x76\x7e\xb4\x52\xc7\xa4\x4f\xcc\x3d\xf9\x6a\xd1\x64\x45\x76\x5b\x7b\xf1\xd5\x27\x6d\xf9\x9a\xb9\x8a\xbd\x93\x0d\x82\xab\x2a\x43\xd8\xb2\x01\x65\xfd\x01\xd9\xfc\xbc\x2b\x8e\xaf\xb3\x69\xa2\xc1\x5a\x2a\x32\x14\xfd\x89\x7b\x57\x6d\x62\x5e\xbc\x71\x10\x4d\xeb\xff\xc8\xfd\x53\x17\x35\x8d\x85\x5e\x34\xc6\x3e\xe5\xea\x00\x05\x1a\x61\x9d\xb3\xbe\x57\x47\x5c\x0c\xbd\xf7\x2d\xdf\x9b\xf6\xdd\xa8\x3a\xeb\x25\x44\xca\x94\xc1\xb6\xe7\x2b\xe5\x59\xb3\x99\xac\x33\xe1\x4f\x53\x85\xa0\xa7\x7c\x9d\x2d\x19\xc1\xdb\xba\x25\x1c\x62\x8c\x96\x58\xd2\x2f\x2f\xd9\xd2\x29\x0c\x0f\x94\xbd\x9e\xa5\xbb\x63\xb5\x4c\x5f\x47\x7d\x36\x1c\xee\xbb\xa8\xe0\x16\xb4\x43\x7d\x7d\x87\xfa\xfb\xed\x5f\x4d\x70\x73\xa4\x6e\xb4\x54\x1a\x33\x8c\xb1\x52\x69\xb4\x8e\x30\x7f\x99\x8e\x87\x19\xcf\x40\xb1\xa5\x89\x2f\x0c\xcb\x5e\xd6\xd3\x37\x32\xd6\x5e\x60\x84\xf5\xdd\xe5\xb2\xb7\x6b\x3c\x24\xba\xdc\xe7\xb9\x74\xed\xcc\x73\xc7\x1e\x3d\xe7\x9c\x47\xc7\xce\xdd\xa2\xeb\x4a\x68\xe5\xfa\xe1\xeb\xd7\xac\xbe\x61\x78\xfd\xa0\x02\xe8\xe4\x57\x2b\xaf\x30\x3f\xc7\x5f\x81\x38\x00\xab\x75\x23\x23\x8e\x28\xb9\xb2\x82\x56\x39\x60\x14\xab\x24\x88\x21\x2c\x66\x84\xae\x34\xea\x8b\xa3\xe1\x54\x92\x5f\xce\xd7\xbd\x78\x69\x57\x1a\xf5\xc7\x56\x9c\xe5\x5a\x19\x7a\xa9\xf2\x4a\xec\xce\xc6\xc6\x7b\xee\xb9\x95\xf9\xcd\xd2\x37\xd1\x65\xf6\x4d\xe5\x5f\x9e\x5b\x40\xaf\x54\xae\xb4\xc7\xdb\x28\xba\x8c\xbd\xcd\x15\x73\x74\x58\x1f\xa6\x1d\x0f\xfe\xcf\x34\xe6\x2b\xff\x26\xc6\x15\x3b\x4d\x87\x5e\x79\xe7\x7d\x0a\x75\x06\xb6\x00\x62\xef\x74\xfd\x12\xb0\xcd\x09\xb8\x19\x05\x99\x6e\x7b\xf1\x52\xd8\x3b\x17\xae\x63\xf6\x9c\xf8\x2a\x3b\x78\xe2\xab\xec\x0a\xe4\x2a\x56\x6e\xa9\xdc\x7e\x3f\xfa\xed\x46\xf4\xfb\xe3\x0d\xf6\x50\xa1\x79\x99\xf7\xf2\x06\x11\xcd\x2b\x3b\x03\x6a\xf0\xc4\x57\x99\x3d\x0b\xd7\xd9\x39\x7f\x59\x89\x6e\xac\x24\xee\x47\x3b\xd0\xf4\xf1\xe7\x68\x4e\x8a\xc4\x8f\xfe\x60\x73\xf1\xf4\xaf\xe4\x70\xf4\xf4\x57\x82\xce\x6a\x98\x01\x02\xa5\x6a\x98\x85\xba\x53\xf1\xae\xd3\xd2\x70\x90\x87\xcd\xd5\x30\x06\x11\x3e\x52\x0d\x7b\x60\x19\x5c\x0b\x2c\x20\x17\x0b\x0c\x08\xcc\x0b\x34\xcc\x01\x03\x7e\xf8\x11\x0d\x63\x3b\x1e\x7e\x4d\xc3\x84\xc6\xbf\x4a\xc3\x3c\x0d\xbf\x43\xc3\x6e\x00\x98\x43\x7c\x35\x8c\x20\x8a\x8e\x56\xc3\x0c\x48\xe8\x40\x35\xcc\x42\xf9\x54\xbc\xeb\xb4\x34\x1c\x8c\xa0\xa7\xab\x61\x0c\xb5\x8c\x54\x0d\x7b\xe0\x52\xa6\x81\x86\x3d\xa7\xd5\xcd\x6b\xbf\x97\xb9\x8f\x86\x85\xd3\xe2\x25\x1a\x7e\x8b\x86\xfd\xf6\x7b\x99\x27\x69\x38\x08\x0c\x04\x98\x6f\xd3\x70\xe8\xb4\xf4\x0a\x2d\xc7\x09\x87\x4f\x8b\x8f\xd0\xbc\x7f\xa0\xe1\x3a\x9a\xc6\x29\x33\x76\x5a\x9a\xc4\x69\xe1\xb4\x9d\x9e\x75\xd1\x70\x33\x0d\x07\xec\x30\x7f\x5a\x9d\xf9\xd3\xca\x17\x4e\x8b\x17\xaa\xf5\x1f\x39\x78\xc1\xe4\xd4\xf8\x8e\xc9\xe4\x83\xc9\x86\x83\xbb\xf7\xcf\x27\x77\xec\xde\x75\xc1\xf8\xdc\xc1\x5c\x4b\xb2\x58\x28\xb4\xb5\x24\x7b\x66\x67\x93\xc3\x33\xd3\x3b\xf7\xed\x4d\x0e\x4f\xee\x9d\x9c\x3f\x30\x39\x31\x3c\x39\xbd\x7f\x76\x7c\xbe\x7f\x72\x6e\x6e\x32\x39\xb2\x73\x7e\x72\x72\x62\x72\xb2\x63\xf3\xe4\xfc\xde\x99\xdd\x73\xc9\xd6\x96\x42\xe1\xf4\x70\x72\xcd\xf8\xc1\x64\xd1\x6a\xa2\xe5\x35\x25\x67\xe6\x66\xf6\xcd\x8c\xcf\x26\xe7\x27\x67\x27\xc7\xf7\x4e\xd2\x42\x16\xcb\x18\xd9\x39\xb3\x37\x39\xb5\x7b\x6e\x5f\xf2\xc2\xf1\xbd\xc9\x1d\xf3\x93\xe3\xfb\x26\x27\x92\xfb\xf7\xce\xcc\x4d\x27\x97\xef\x9e\xdb\xd7\x67\xc7\xec\x9e\x4f\x9a\x2d\xe5\xe4\xd4\xfc\xee\x5d\xc9\xc1\x99\xe9\x9d\xcd\xab\x77\x4f\xcf\xec\x68\xd9\xb1\x7b\x17\xec\x86\x73\xe1\x20\x12\x61\x12\xce\x83\x39\x78\x0d\xe6\x60\x37\xcc\xc3\x2e\x18\x87\x59\xd8\x08\xfb\xa8\x37\x89\x09\x18\x87\x79\x98\x60\x6f\x65\xbf\xc8\x7e\x83\xfd\x26\xfb\x0d\xf6\x1f\xd9\xa7\xd9\x47\x60\x04\x0e\xc2\x05\x30\x09\x53\x30\x0e\x3b\x60\x12\x92\xf0\x20\x24\xa1\x01\x26\x60\x12\xe6\x60\x06\xf6\xd2\xb8\x73\xe9\xdd\x3e\xd8\x0f\xb3\xb4\xb4\x1c\xb4\x40\x12\x8a\x50\x80\x02\xb4\xd1\x70\x0f\xcc\xc2\x2c\x24\x61\x18\x66\x60\x1a\x76\xc2\x3e\xd8\x4b\xef\x26\x69\x09\xf3\x70\x00\x26\x61\x82\xde\x4f\x57\x4b\x99\x87\x7e\x5a\xea\x1c\x7d\xc3\x08\xec\x84\x79\x98\xa4\xa9\xec\xdf\x0e\xd8\x4c\xf3\xed\x85\x19\xd8\x0d\x73\x90\x84\x56\x68\xa1\xef\xfb\xef\xe2\x93\xb0\x06\xc6\xe1\x20\xad\x97\x05\x4d\xa7\xd5\xcf\x0e\xcf\xd0\xd6\xec\x83\x19\xda\x2b\x49\xfa\xae\x59\x98\x84\x71\x5a\xbf\xf7\x6a\xf2\xc1\x7a\xd8\xf7\x33\xb4\x2d\x53\xf4\x7d\xfb\x20\x09\x17\xd2\x5c\x49\xd8\x41\x53\x8e\xc3\x3e\x9a\x3a\x09\xfb\x69\xad\xe6\x60\x1a\x92\xb0\xbc\x9a\xba\xef\x54\x1a\xfb\x9b\x24\xc1\x84\x16\x28\xd3\xd2\xe6\x61\x37\xec\x82\x24\x0c\x56\x7b\xac\x19\x56\xc3\x6e\x98\x86\x19\xd8\x01\x2d\xb0\x83\x3e\x5d\x7b\xea\x4b\xda\xb5\x9e\x39\xed\xde\xae\xfb\xe9\xdf\x96\x7e\xdd\xf7\x3d\x9f\x83\x83\xae\xb8\xab\xd5\x35\xe4\x5a\xe1\xea\x76\x0d\xb9\xda\x4f\x3d\xfd\x2d\x7d\x3a\x09\x6b\x61\x1c\x0e\xc0\x38\x4c\xd0\x11\xd3\x03\xf3\x30\x0f\xfb\x69\xad\xc7\x29\x8d\xa3\x7f\x27\xb3\x70\x23\x7c\xd8\xdf\x1b\x94\x26\x32\xc0\x82\x0b\x38\xc0\x40\x80\x07\x9b\x82\x78\x41\x00\x11\x24\xf0\x81\x1f\x64\x08\x40\x10\x42\xa0\x40\x18\x54\xa8\x81\x08\xd4\x42\x1d\x44\x21\x06\x71\x48\x40\x12\x52\xa0\x81\x0e\x69\xa8\x87\x0c\x64\xa1\x01\x72\x90\x87\x46\x68\x82\x66\x68\x81\x25\x50\x80\x56\x28\x82\x01\x25\x30\xa1\x0c\x16\xb4\x41\x3b\x74\x40\x27\x74\x41\x37\x2c\x85\x65\x70\x06\xf4\x40\x2f\xf4\x41\x3f\x0c\xc0\x72\x58\x01\x83\xb0\x12\x56\xc1\x10\xac\x86\x35\xb0\x16\xd6\xc1\x7a\xd8\x00\xc3\xb0\x11\x46\x60\x13\x6c\x86\x2d\x70\x26\x6c\x85\xb3\x60\x1b\x9c\x0d\xdb\x61\x14\xce\x81\x31\x18\x87\xcf\xc3\x51\xb8\x02\xbe\x01\x37\xc2\xab\x70\x25\x7c\x12\x3e\x01\xb7\xc3\x83\x70\x2f\x7c\x1c\xfe\x37\x1c\x81\x4f\x23\x06\xb1\x70\x2d\xdc\x04\x1f\x83\xff\x05\xbf\x41\x2e\xb8\x03\x1e\x82\xbf\xc2\x5b\xf0\x9f\x70\x0f\x7c\x01\xfe\x05\xbe\x07\x8f\xc2\xb9\xb0\x03\x3e\x05\x13\xf0\x43\x98\x84\xef\xc3\x0f\xe0\x27\xf0\x23\xf8\x31\x3c\x0b\xaf\xc1\x14\xfc\x0c\x9e\x83\x9f\xc2\x63\x30\x0d\x7f\x82\xeb\xe1\x05\x78\x1e\x7e\x0e\x3b\xe1\x18\xfc\x3b\x5c\x0d\xe7\xc1\x0c\x9c\x0f\xbb\xe8\xd7\xb8\x0b\x76\xc3\x1e\xb8\x80\x8e\xec\xfd\xb0\x0f\x0e\xc0\x85\xf0\x3a\x5c\x04\x87\xe0\x20\x1c\x86\x4b\xe0\x62\xf8\x2a\xdc\x0d\x97\xc1\xa5\xf0\x11\xb8\x1c\xde\x80\x37\xe1\x69\xf8\x05\xbc\x08\xbf\x45\x1c\xfc\x0a\x7e\x4d\x31\x9c\x7e\x09\x2f\xc3\x97\xe0\xcb\xf0\x24\x3c\x05\xdf\x86\xaf\xc0\x13\xf0\x1d\xf8\x28\x3c\x03\x57\xc1\xc3\xf0\x4f\xf0\x4d\xf8\x3a\xbc\x8d\x30\x22\x88\x47\x6e\xb8\x06\x6e\x86\x07\xe0\x56\xb8\x05\xfe\x08\xff\x00\x37\xc0\xe7\xe0\x7e\xf8\x0c\x7c\x16\x79\x90\x97\xec\x9f\x9b\x29\x14\x7a\x8b\xd5\xab\x51\xbd\xb6\xd3\x6b\xb1\xaf\xdd\x35\x3b\x33\x3f\x8e\x2f\x98\xdc\x3b\xb9\x6f\xdc\x35\xb0\x7f\x7e\xb7\x7b\x7c\x6a\x66\xa6\xdc\x6a\x98\x34\xcb\xf2\x42\xa1\xb5\x7a\x2d\x3a\x23\x05\x9d\x3c\x09\xcc\xff\x17\x00\x00\xff\xff\xbf\x59\x54\x1d\xf4\x44\x01\x00") + +func fontsDennethreeDeeTtfBytes() ([]byte, error) { + return bindataRead( + _fontsDennethreeDeeTtf, + "fonts/DENNEthree-dee.ttf", + ) +} + +func fontsDennethreeDeeTtf() (*asset, error) { + bytes, err := fontsDennethreeDeeTtfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/DENNEthree-dee.ttf", size: 83188, mode: os.FileMode(438), modTime: time.Unix(1575019249, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa7, 0xa7, 0xf3, 0x48, 0x28, 0x29, 0x9c, 0xee, 0x6e, 0xf2, 0x38, 0x86, 0x9c, 0x1d, 0x65, 0xc9, 0x91, 0x9c, 0x77, 0x77, 0x1a, 0x3e, 0xf3, 0xb9, 0x19, 0x41, 0x1e, 0xb5, 0xc, 0x97, 0x23, 0xdf}} + return a, nil +} + +var _fontsDeborahfancydressTtf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\xbb\x09\x9c\xd3\xd4\xfe\x37\x7c\x4e\x9a\x9c\xd3\xe9\x24\x99\xa6\x69\x9a\xe9\x36\x5d\x32\x6d\x98\x7d\x49\xd3\xcc\xc2\x2c\x2c\x33\x6c\xc3\x22\xc3\x3a\x20\x30\x80\x30\xa0\x33\x83\xca\xbe\x08\x8a\xa2\x82\xa8\xc8\x15\x77\x41\x2f\xa2\x17\x41\x11\x50\xae\xa2\xf7\xaa\xd7\x05\xbd\x28\x6e\x80\xb2\xb8\x5c\x51\xaf\xeb\xf5\x22\xde\x2b\x30\x3d\xf3\x7e\x92\x0e\x8a\xdb\xf3\x7f\x9e\xe7\x7d\xdf\xf6\xd3\x36\x49\x93\xd3\x9c\xdf\xfa\xfd\xfe\xce\xaf\x00\x02\x00\x32\xc1\x0a\x60\x03\xa5\xc3\x9b\x4b\xca\xf7\xf6\xb9\x85\x01\x00\x56\x00\x00\xc6\x4c\x6b\x6f\x9d\x53\x7d\xb4\x7d\x3f\x00\xb6\x52\x00\xe0\xe2\x99\xad\x97\xcf\xe9\xee\x06\x36\x00\x96\x03\x00\x80\x7d\xe6\x25\x8b\x66\x0c\x9f\xd7\x55\x0b\x00\xb3\x02\x80\x79\xce\xb6\x8b\x5a\xa7\x9f\x3a\x86\x56\x02\x00\x9e\x06\x00\x24\xdb\xda\x2e\x6a\x15\x03\xdc\x95\x00\x80\x53\x00\x80\xdc\xb6\xf6\xb9\x0b\xbb\xd7\x3a\xce\x00\x00\x6f\x06\x00\x6e\xba\xa4\x73\x5a\xeb\xb7\xf7\x1d\x1c\x09\x00\xbd\x0d\x00\xf0\x56\x7b\xeb\xc2\x39\x74\x97\xed\x23\x00\x60\x36\x00\x20\xdc\xd1\xda\x7e\x11\x77\x47\xea\x0b\x00\x16\xdf\x0c\x80\x6d\xea\x9c\xce\xcb\xe7\x26\x06\xf7\x1e\x0c\xc0\xb2\x53\x00\xc0\x0c\xeb\xde\x21\x00\x1a\x7c\x87\x9f\x9c\xd5\xfb\x7b\x90\x69\x37\xef\x0b\xbc\xc8\x3d\xfd\xbd\xf5\x29\x77\xc3\xee\x6f\xc9\xc8\xcc\x87\x70\x0d\x00\x20\x7d\x3e\x48\x5f\x83\x6b\xc9\x30\xd0\x2f\x2b\xd1\xfd\x6d\xf7\x86\xcc\x87\x7e\xfc\xe6\xdc\xa3\xcd\x3a\xd2\x66\xdb\x01\x74\x6b\x9f\x02\x4e\x50\x02\xfa\x02\x40\xb3\xe7\xc6\xa0\x0f\xc1\x9b\x01\x03\xec\xcc\x9d\x8c\x06\x00\xf4\xa7\x3f\x6d\x6f\x82\x19\x94\xcb\xbc\xe0\xdc\x63\x13\xa0\x1e\x1d\x01\x16\x9e\x3d\xb7\x3f\xb0\x29\x1c\x06\xf5\x20\x6c\xbb\x82\x79\x9b\x5c\x00\x35\x5c\x0b\x77\x4e\x01\x70\xe3\x07\xff\x35\xbf\xcd\x4a\xd8\x2c\xe1\x52\x95\x3d\xaf\xf7\x40\x2f\xdb\xdd\x00\xd8\xbe\x02\xbd\x6d\xa7\x81\xce\xdc\x09\x00\x7d\x1c\x00\x2a\x0f\x00\x6a\x6b\xfa\x65\x0b\xa6\x25\x48\xdd\x02\x0c\xeb\x58\xcf\xb5\xb6\xc7\x01\xb0\x85\x01\xa2\x97\x75\x7f\x4b\x5f\x0e\x00\x3d\xa2\xe7\xd8\x6b\xa0\xd0\x76\x1b\x00\xb6\xfb\x00\xb0\xfd\x03\x18\xd6\xf9\x21\xd0\x68\x8e\x71\xee\x65\xfe\x26\xb3\x19\x00\x4c\x01\xc0\xdc\x01\x00\xf3\x35\x68\x45\x3e\x00\x98\xe5\x00\x30\x0d\x00\xa0\x47\xc1\x74\xdc\x0a\x80\xcd\x94\xc9\x6e\x00\xd0\x0a\x00\x98\xc1\x00\xd8\xfb\x01\x80\xe7\x00\xc0\x0c\xe9\x4e\x31\x37\x01\x80\x0a\xc0\x74\xf4\x03\x00\xe6\x7d\xa3\x38\x00\x38\x06\x00\xfa\x23\x00\xf6\xdb\x7b\x8e\xd9\x01\x60\x3e\x39\x6f\xbe\xe6\x7d\x3f\x07\x80\x79\xbf\xe6\x5c\x50\x25\x00\x74\x17\x00\xcc\x28\xd0\xca\xcc\x4f\xcf\x9d\xde\x05\x00\xa2\xc0\x74\xb4\x01\x00\x1b\x03\x00\x5d\x00\x00\xf3\x11\x00\xf4\xa3\x00\xe0\x51\x00\xa0\x87\x00\xa0\x1f\xe9\x4e\xd1\xdf\x02\xc0\xac\x05\xd3\x91\x06\x00\xfd\x31\x00\x8c\x07\x00\x24\x02\xc0\x3c\x08\x00\xbe\x1b\x00\xfa\x45\x00\x18\x00\x00\xe3\x06\xc0\x36\x00\x00\xca\xfc\xbc\x0e\xf4\x31\xe7\xcf\x8c\xe9\x79\xbd\xfc\xd3\x67\x8f\x6e\xa8\x1e\x6b\x71\x03\x9b\xb9\x05\x7d\x00\x40\x04\x7e\x32\x2e\x0a\x9c\xaf\xfe\x1f\x2d\xce\x46\x33\x08\xdb\x33\x1c\x99\x2c\xc7\x67\x39\x05\x97\xe8\x96\x3c\x72\xb6\xd7\xe7\x0f\x04\x73\x42\xe1\x48\x54\xc9\x8d\xc5\xd5\x5e\x79\xf9\x05\x85\x45\xc5\x25\xa5\x65\xe5\x5a\x42\x4f\x1a\x15\x95\x55\xd5\xbd\x6b\x6a\xeb\xea\xfb\xf4\xed\xd7\xbf\xa1\x71\xc0\xc0\x41\x83\x87\x34\x0d\x1d\x36\x7c\xc4\x05\x23\x9b\x47\x8d\x1e\x33\x76\xdc\xf8\x96\x09\x13\x2f\x9c\x34\x79\x4a\x2b\x98\x3a\x6d\xfa\x45\x33\x66\x82\xff\x0f\x1e\xb6\xff\xbb\xcb\x68\x30\xc5\x92\x8a\x13\xd8\x00\x0d\xae\x00\x9b\xc0\x76\xf0\x22\x78\x19\xbc\x02\xde\x04\x87\x6c\x57\x74\x77\x9b\x3e\x6d\x1d\x7d\xe1\xfc\xa3\xdd\x1f\x77\x4f\xeb\x9e\xd6\x7d\x6f\xf7\x3d\xdd\x77\x77\xdf\xda\xbd\xae\x6b\xd3\xaf\xbc\xf1\xc7\x07\x33\x27\xfd\x44\x08\x0d\xc6\xc3\xec\x89\x8c\x40\xc6\xfb\x0e\xfa\xc7\x67\xbe\x23\xdf\x31\xcc\x31\xcc\xf1\x6c\x66\xef\xcc\x63\xec\x16\x2e\x9f\x3b\xc4\xaf\xc8\x42\x59\x3b\x9d\xa3\x9c\x1b\x9c\x47\xd2\x4f\x61\xb1\xeb\x32\xd1\x27\xbe\xea\x6e\x73\x9f\x94\x76\x78\x26\xca\x09\xf9\x44\xf6\xc0\xec\xb7\xbc\xab\x7d\xc0\xf7\x96\x7f\x45\xa0\x77\xe0\x9d\xe0\x2d\x39\x4d\x39\x3f\x84\x96\x86\x73\xc2\x3b\x23\x9b\xa3\xf5\xd1\x7d\xca\x88\x9f\x3d\xff\x93\x7b\x7f\xac\x36\xf6\x52\xfc\x2a\xb5\xb0\x17\xd5\x6b\x67\x9e\x3b\xef\xee\xfc\x11\xf9\xcf\x17\xdc\x52\x58\x5b\xf8\x43\xd1\x0d\xc5\x03\x8b\x49\xc9\x43\xa5\xf9\xa5\xfb\xcb\xc6\x95\x0f\x2e\x3f\xa1\x4d\xd1\x3e\x4d\x5c\x97\xb8\x4e\xcf\x3e\xff\x59\x75\x1d\x00\x40\xb7\x2d\xef\x89\x50\x45\x54\x2e\x55\x4d\xd5\x53\x83\xa8\x51\xd4\x44\x6a\x06\xd5\x41\x5d\x4a\xcd\xa3\x16\x52\x4b\xa9\xe5\xd4\xd5\xd4\xb5\xd4\x6a\x6a\x2d\x75\x33\xb5\x9e\xda\x40\xdd\x49\x6d\xa4\x76\x50\xbb\xa8\x27\xa8\x97\xa8\x57\xa9\x43\xd4\x87\xd4\x17\xd4\xd7\xd4\xb7\x54\x97\x0d\xd8\x6c\x36\xd9\x16\xb4\x45\x6c\x71\x5b\xbe\x6d\xaa\xad\xcd\x76\xb1\xed\x32\xdb\x7c\xdb\x4a\xdb\x75\xb6\xdb\x6d\x77\xdb\x36\xda\x1e\xb0\x3d\x0a\x00\x90\x91\xac\xc9\x1e\x59\x4b\x1a\x6a\x5c\x45\x38\x6e\x24\x65\x2d\xa9\x26\xcd\x43\x75\x94\xde\x73\xd0\xfa\x22\x8e\x19\x99\x96\x11\x46\x58\x2e\x37\x92\xe6\x86\x92\x34\x54\xcd\x63\x24\x55\x0f\x8e\xab\x71\x1c\xc7\x1e\x55\xf2\xc8\xe6\xb9\x3a\x32\x54\x8c\x54\x05\x29\x28\x0b\x26\x65\x15\x95\x40\xa4\xc4\x0d\x84\x25\x8f\xa1\x79\xea\xa0\x47\xc5\x9e\x12\x18\x57\xe3\x25\xb6\x78\x09\x34\x34\xd9\x63\xe8\x71\x35\x69\xa4\x9f\xba\x11\x37\xe2\x2a\x52\xb3\x20\x0a\x41\x09\x61\x8f\x9c\x05\x51\x09\x0c\x41\x8f\xac\xc4\x8d\x64\x1d\x34\x6f\x02\x65\x41\x84\x25\x1c\x37\x90\xec\x51\xcd\x97\xc7\x90\xcd\x73\x0d\x8f\xe4\x91\x25\x1c\xc7\xaa\xa2\x2a\x71\x25\x44\x9b\xfb\x9a\xf9\xb3\xb8\x80\xca\x82\x1e\xf3\xd6\x55\xa4\xc4\xb1\x39\x5c\x52\x46\xe6\xd8\x4a\x96\x4d\x92\x3d\x32\x46\x38\x5e\x02\xb3\x68\x84\x35\x59\xf3\x68\x12\x46\x32\x8e\xe2\x38\x96\x42\xd0\x23\x79\xcc\x77\x59\xab\x83\x49\xc3\x13\x82\xc8\xba\xdc\x23\x1b\x49\xc3\xa3\x49\x6e\x8c\x64\x8f\x61\x4e\xc8\xba\x7f\xd9\x83\x3d\x21\x98\x34\x14\xd5\x9c\x93\x29\x5e\x8f\x66\xe8\x46\x0d\x8c\x1b\x2a\x8e\xab\x5a\x1d\x95\x34\xe2\x25\xd0\x14\xac\x79\x82\x1e\x37\xd4\xa4\x9c\x34\xe2\x05\x94\x1a\x55\x4d\x79\x78\x8c\x10\xb4\x6e\xa1\x0e\xaa\x71\x25\x8e\xe3\x7a\xd2\xf0\x18\xd5\x4c\xd2\xc0\x0a\x2e\xa0\x90\x5a\x00\xd5\xa4\x11\xd7\x3d\x46\x5c\xd5\x92\x72\x52\xab\xa3\x93\x06\xc2\xba\x39\x70\x52\x4d\x9a\x92\x51\x4d\xad\x24\x4b\x90\xf9\x13\x8a\xa6\xa8\xa8\x84\x51\x54\x45\xd5\x0a\xa0\xaa\x99\xfb\x3f\x6d\x28\x1a\x92\x3d\xb2\x1b\x23\xac\x25\x65\x4f\x08\x7a\x0c\x35\xa9\x9a\xfa\x94\x3d\x38\x6e\xd0\xb2\x64\x69\xd7\xa0\x31\x52\x6b\x28\xa3\x04\x1a\x8c\xc7\x1c\x5d\x53\x3c\x32\x52\xe3\x86\x47\x4e\x5a\xdf\xc5\x0d\xf3\x53\x8d\x20\xd5\xc0\xc8\xf0\x18\x48\xa5\x55\x83\xf1\xa8\x09\x83\xc6\xba\x47\x31\x18\xa4\x33\xc8\x60\xdc\x2a\x8d\x0d\x73\x60\xd9\x63\x19\x44\xd2\x7c\xca\x49\xd9\x40\xa6\x5a\x54\x0f\xd6\x11\x36\x4c\xfd\x2a\x75\x58\x4b\x1a\x32\x52\x0d\x39\x29\xe3\x02\x88\x93\x75\x50\x33\x7f\x09\xc7\x0d\x2d\x59\x07\x69\x73\x96\x8a\x29\x6e\x0f\x36\x68\xd5\xfc\xc6\x54\x00\x6d\xb8\x4a\x20\xd6\xcc\x91\x0c\xd9\x9c\x98\x69\x9f\xf1\x12\xe8\x31\x4d\x46\xa5\x62\xa6\x7d\x9a\xb2\x4a\x1a\x0c\xc2\xc8\xa0\x71\xd2\x08\x61\x53\xf5\x52\x16\x8d\xb2\x28\xcb\xb2\x70\x09\x13\x57\x4d\xeb\xd7\xeb\x90\x79\x0f\x5a\xd2\x40\x59\x54\xdc\x60\x90\x4a\x63\x64\xc8\x49\x8d\xc6\x71\x83\xa1\x62\x09\x43\x36\x15\xa3\x99\x13\x31\x92\x46\x96\xcd\xba\x39\xd3\x44\x92\xb2\x35\x49\xd3\x23\x50\x09\xf4\x58\xf7\x8d\x4c\xf5\xa0\x27\x46\x56\x6f\x62\x51\x24\x3b\x38\xc9\xce\x7a\x24\x7e\xcc\x38\xa7\xdd\xeb\xe0\xdd\x4d\x25\x76\x9a\xf5\x52\x34\xed\x28\xd2\xa4\x00\xe7\xc9\xba\xa0\x7e\x39\x2d\x51\x1c\x0d\xcb\x42\xf2\x9b\x25\x45\x4e\xc9\xd1\xbb\x88\x16\xd6\x6d\xb0\xfb\x29\x7f\x49\x9e\xd6\xe2\xb1\x07\x3d\x05\x3b\xbc\xee\x51\x0b\x1c\x76\x27\xbf\xba\x6a\xc1\x48\x96\xee\x5d\x52\xe4\xf5\x89\x3c\xab\xb9\x9d\xb2\xdb\x1e\xf1\x64\x78\x63\xee\x92\x06\x81\x1a\xa3\x50\x8b\xec\x95\x7d\xc3\x89\x70\xd0\x95\x11\x08\xc6\x3c\x19\x82\x3b\xa8\xe7\x69\xde\x92\x48\xd0\x1b\xbf\xc8\xe1\xb0\x17\xf8\x6b\x94\x91\x83\xb5\x32\x79\x01\x9b\x93\x35\x31\x83\x16\x2e\x29\xf1\x23\x36\xc2\xba\x3f\x29\x1a\x70\xb0\xa2\xb5\xdf\xb2\x91\x79\x41\xbb\x97\x77\x07\xd9\x29\xc3\x0a\xa6\x50\x53\xa7\xcc\x1b\x79\xad\x97\xa5\xa7\x4c\x62\x8b\xfc\xfd\x73\xbc\xd9\x12\x62\x6b\x55\x9a\xe3\xbd\xb4\x3d\xe6\x1a\x5c\xa7\x48\xac\x5d\x70\xf2\x91\x11\xa3\xa6\x57\x69\xf2\x20\x84\x6b\x54\x3b\xa7\x87\xa6\x8f\x13\x65\xbb\x17\x21\xda\xce\x55\xdb\x63\x2e\x7b\x91\xa7\xc8\xef\xa5\x3d\x2c\x43\xbb\x69\xd6\x2e\xa8\x01\x1a\x21\x56\x62\x63\x3e\x9a\xa5\x69\x7b\x06\x4f\xf1\x76\x4e\x0d\x64\x38\x8b\xca\xa4\x0c\xda\x97\x55\x53\xc9\x39\x3c\xa5\x45\x0c\x45\x5d\x3e\xce\x41\x3b\x19\xc1\x25\xf8\xfc\x34\x4d\x45\x58\xe7\x84\x5c\x16\x15\x05\x63\x76\xc9\xe1\x75\xba\x05\x07\x8d\x28\xc7\xf4\x8c\x6c\xd6\x2e\xd0\x61\xb9\x60\x30\x5d\x26\x23\xaa\x4c\xe1\xca\xec\x76\x7b\x5b\x4b\x5e\x4c\xca\x66\x55\xce\xcd\xc6\xfc\x34\x1b\x94\x9d\xac\xc4\xba\x2a\xc2\x4c\x19\x1d\x92\x87\xf7\xb6\x07\x5d\x5e\xa7\x53\xe0\x1b\x73\x82\x25\x52\x7f\xd6\xce\xb1\x0e\xc1\xc9\x6a\x41\x47\x5f\x7a\xfd\xf4\x00\x62\xf5\x3c\x9a\xe6\x68\xd6\xae\x49\xf6\x58\x28\x83\xf5\xe7\x44\x9c\x34\x15\xce\xf0\x85\xa8\xe5\xd3\x79\x45\xfa\x83\x5d\x62\x1d\x76\x7b\x48\xf4\x38\x19\x86\xb1\x07\x24\x64\xb7\x67\xb0\x76\x7b\x86\x9d\xa6\xed\x88\x42\x34\x6d\xa7\x69\xc1\x6e\xbe\x9b\x6f\x9f\x66\xc6\x2e\xa0\x87\x08\xc1\x60\x34\x42\x4b\x37\x55\xb3\x05\x9e\xbe\x33\x7a\xeb\x92\x23\x72\xe7\x86\xae\x37\x3d\x14\xca\x16\xaa\xf3\xe8\x26\x2f\xbb\x00\xd1\x94\xbf\xeb\xe0\xe2\xd9\xc1\x2c\x44\xd3\xcd\x9c\x5e\x90\x94\x7c\xa2\xdb\x6f\xbb\x49\x29\x18\xd4\xbb\xa9\x52\x4d\xf5\x56\xed\xf0\x29\xbb\x28\x3c\x97\x83\xbe\x8c\xd4\x3b\xc9\x0e\x27\x4b\x79\x03\x43\xd9\xd4\xb8\xfe\x3b\xe3\x34\x7c\x8f\x23\xdb\x83\x34\x1c\x17\x24\xcf\x05\xe9\x4b\xed\xbd\x2b\x5e\x40\x3e\x89\x2b\xa6\xbc\xb4\x87\x16\xec\x2e\x4a\xa0\x90\xea\x2f\xe3\xef\x8f\x10\x99\xf1\x8b\x35\xaa\x2a\xb0\x88\xb5\x67\x64\xd3\x9c\xc7\x3b\xc0\x2d\xfb\xdb\x04\x27\xcb\x0a\x4b\x38\x97\xc0\xd6\xc1\x89\x39\xb2\x8a\x10\xe7\x74\x06\x53\xff\xe9\xed\x92\x9c\xc1\x4c\x3e\x94\xf7\x49\x9e\x9d\x6c\xce\x13\xa8\x83\xc1\xde\x67\x85\x6c\x09\x82\x29\xf5\xff\xa4\xa7\x97\x45\x7c\xae\x11\x52\xec\xa8\x43\x5d\x74\xeb\x8c\x8b\x0a\xca\x2e\xa7\x5f\x13\xb5\xcd\x4f\x0c\x1e\x03\x1d\x8d\xfe\xe5\xd3\x1a\x5b\x2e\x0f\x38\x78\x72\xc2\x6f\x2f\xd2\xa1\x5c\x2a\x79\xbe\x71\x70\x76\xd6\xce\xd9\x4b\xb2\x4d\x11\xd1\x34\x8d\x29\xbb\x2b\x16\xe3\x85\x92\x18\x6b\x67\xb9\x12\x77\xc4\x65\x1e\xa7\x24\x96\xb5\x7b\x11\xab\x28\x2e\x8e\x8d\x7c\x41\xd3\x9e\x50\x25\xf9\x46\xa2\x6d\xdf\xce\x2b\x71\x4b\xd9\xa1\xae\x33\xb7\x0e\x5b\x47\x3d\xd3\x49\xde\xa3\xed\x99\x14\x99\xe4\x74\x50\x91\x10\xc3\xd3\x4d\x76\x64\x1f\xd5\x24\xf9\xd9\x20\x1b\x92\x10\x2a\x73\xd8\x11\x2a\xe0\x3d\x03\xeb\x84\x61\xb5\xe4\xd9\x98\xc7\x1b\x8b\xd9\xed\x59\x2c\x5a\xf3\x97\x53\x6b\x68\xaf\x7d\xd2\x22\x5a\x44\x4b\xec\x03\xda\x1b\x6a\xaa\x4b\xd7\xde\x62\x77\xf0\x1c\xdb\xaf\x8a\x8e\xf1\x7e\x2a\x26\x74\x96\x6d\xbd\xd2\x4d\x4f\x67\x2f\xea\x3a\x3c\x2e\x8a\x5d\x94\x0b\xb9\xd8\x71\xb9\x59\x6e\x8f\xc3\x10\xbc\x7e\x5a\x18\x26\x66\x51\x03\x79\xde\x9e\xc1\x23\x4a\xe5\xd9\xbe\x76\x7b\x96\xc3\xcd\x53\x7e\x67\x98\x45\x14\x2d\xf8\xbd\x99\x6e\x6f\x51\x5e\x49\x16\x5d\x6f\xb8\x54\x64\xa7\xb2\xec\x88\xb6\x0b\xbc\xe8\xa3\xed\x4e\x8a\xb7\xc7\x28\x87\x9f\xbd\xd8\x27\x39\xd8\xe2\xa9\x2d\xc1\x82\x58\x80\xd6\x6f\xad\xcd\xf6\xcb\x3e\x71\x50\x86\xcb\x3e\x91\xb7\xfb\xf2\x0a\xd6\x1e\x78\x75\x60\xc4\x91\x87\x26\xd8\x9d\xac\x5f\x62\x27\xa2\xb2\x01\xed\xe3\xa6\x5f\x56\x56\xab\xae\xcd\xcb\x60\xb3\xa5\x12\x27\xeb\xa4\x32\x9d\x14\x4d\xf3\x34\xc7\xb1\xc8\x99\x41\xd3\x2e\xd1\x2e\x09\x3c\xcd\xf6\xcd\xe3\x5d\x31\x3b\x4d\xd9\x59\xbb\x2c\xd7\x6b\x45\x0a\x6d\x67\xec\x34\xad\xb2\xac\x1a\xb4\x2b\x31\x39\x9b\xb6\xab\x01\xce\xae\xc7\x68\x96\x0b\xa8\x41\x9a\xa6\x1c\x41\x54\x87\x10\x46\xf6\x10\xcf\xdb\x69\xaf\x43\x76\x56\xaa\x45\x54\x86\x93\x2d\xca\xf2\x17\xf9\x45\xcb\x71\x33\x62\xaa\x3d\x28\xd3\x2c\x2d\xd9\xed\x0c\xed\x8b\xd0\x7d\xc6\x64\x64\x8b\x65\x06\x8d\x28\x7b\xc0\xd1\xc8\x96\x38\x39\x5a\xe8\x5d\x84\x68\x7b\x26\x3f\xb5\xca\x5e\x10\xa3\x69\xc5\x59\xcb\x3a\xca\x94\x58\xac\x56\x15\x5d\x34\x4d\x61\x27\x6d\xfa\x09\xcd\xda\x8b\x90\x5d\xcc\xcc\x74\x20\x84\x28\x7f\x8c\xa1\x11\x45\xcb\x14\x2f\x2a\x2d\xb4\xd7\x81\x68\x1a\xd1\xf6\xbc\xa0\xcb\x45\x3b\xec\xb4\x10\x71\x16\xa9\xd5\x43\x98\x9c\x2c\xef\x95\x0b\xfa\x7a\xb6\x2a\x76\x0f\x9d\x41\xdb\x1d\x8e\x0c\x96\x76\xf0\x94\x69\x47\x8c\x65\x4d\x7f\x9f\x3b\xde\x2d\xb1\xae\x46\x85\xf7\xaa\xee\xc6\xb5\x7d\xe7\x5c\x3c\x89\x92\xa9\xbe\x53\x46\x34\xce\x67\x7d\xb5\x7a\x0c\xb1\x23\x47\x56\x2e\x59\xa2\x38\xb9\x40\x01\xb7\xcc\x17\x72\xd5\xd0\x79\xd1\x7b\xfc\x73\x02\x8e\x8b\x29\xe4\xa6\xee\x09\xd6\x8b\x11\xa7\x3d\x74\x80\xe5\x43\x7e\xba\xc9\xa7\x66\x52\x79\xc5\x05\xac\xbd\xac\xc4\x97\x85\x82\xb4\xb7\xb7\x64\xf7\x06\x1f\x2a\x2a\x8b\xa9\xaa\x48\x09\xa1\x6c\x47\x91\x94\xe3\xf4\xe7\xc9\xc1\x48\x30\xe8\x0c\x44\x22\x4e\x87\x23\x53\x44\x6a\x16\x25\x48\xb4\x33\x57\x70\x87\xdc\x8c\xdd\x9c\x87\x5d\x44\xee\x55\x8b\x84\x11\xd9\x01\x8e\x95\xec\xb4\xbd\x5a\xca\xa3\x1d\x99\xbe\xac\x68\x4d\x11\xab\x88\xb2\x43\x0b\x46\xec\x6c\x4d\xc8\x33\xe9\xa3\x1f\x04\x1a\x39\xb4\xc3\x10\x4d\x72\xd0\x08\xd1\x0e\xd6\xdd\xf7\xf0\xda\xa2\x82\xa9\x97\xae\x5c\x1c\xe1\x86\xbd\xfd\x48\x76\xe6\x06\xe8\x1c\x91\xe9\xb0\xd7\x0f\x64\xdd\x34\x8f\xd8\x82\x3c\x6a\x52\x41\x20\x2c\x0a\x2c\xb2\xdb\x39\x3b\x1b\xca\x96\xbc\x2e\x27\xe7\x0c\x7a\x72\x04\x96\x96\x68\x07\x25\xd3\x99\x76\xd6\x9e\x27\xbb\x5d\x11\x37\xc7\x3a\x58\x61\x3a\x4d\xd3\x19\xb4\x93\xaa\x2b\x0b\x55\x21\xfb\x40\xb9\xc1\x2d\xfb\x47\x38\xe5\x02\xbb\x74\x35\x2f\x3b\x54\xf2\x8f\x01\x99\xac\x8c\xed\x91\x83\xac\xa3\xc0\x65\xf7\xbb\x87\x30\x34\x5d\x42\x53\x8e\x4c\x9a\xa5\x11\x25\x95\x61\x1a\xfb\x79\x87\xdd\xef\xa0\xed\xde\x5a\x5f\x90\xa5\x63\x76\xda\x9d\x09\x68\xd0\xab\x7b\x15\x75\x31\x73\x04\x34\x82\x0b\xc0\x78\x30\x13\x00\x51\xd6\x74\x59\x33\x64\x43\x36\x24\xf3\xfd\xdc\x9e\x26\x61\x01\xcb\xa2\x6e\xe8\xaa\x6e\x94\xcb\x92\xdb\xdc\x45\xd8\x59\x00\xe3\x35\x26\x30\x32\x81\x24\x56\x54\x3d\xae\x1a\xaa\xa0\x1a\xa2\xe4\xd1\x92\x35\x30\x5e\x00\x91\xa8\xc9\x6e\x59\xc2\x2a\xa3\x79\x24\x37\x56\xe2\x6a\xc2\x90\x0d\xb5\x38\xcc\x85\x59\x9f\x57\xf4\x79\x71\x58\xf4\xf6\x6c\x8b\x37\xe0\xa1\xe8\x86\xb8\x57\x71\xdc\x80\x2e\xb9\x94\x8a\x57\x16\x61\xb1\x11\xc5\xe3\x62\x15\xfb\xa2\xef\x2d\xb4\x1f\x6d\x0c\x0e\xba\xc4\x5d\x5b\xd5\x38\x14\x35\x8f\xdf\xb9\x13\xde\x83\x0b\xf7\xa3\x42\x2e\xec\xdd\xe9\x65\x8e\xa0\x5f\x3f\xc4\xf5\xe4\xe9\xe5\x85\xb0\xf6\x92\x5b\x10\xc2\x61\x9f\x37\xe7\x5a\xf2\xf4\x25\x8d\x03\x33\xc9\x41\x3f\x8b\xb8\x1f\xb2\x72\x2f\x72\x73\x8b\xe6\x44\x97\x37\xc1\x21\x6f\xe2\x54\x36\x3b\x43\x18\x18\x6f\x2e\x24\xc9\x7a\xf7\x38\xb4\x73\x27\x17\x50\xa2\x3b\x5c\x7e\x9e\xf1\x3e\xe6\x35\x19\x14\xb0\xf5\xb1\xb5\x30\xc7\x80\x1d\x88\x20\x00\x54\x00\x44\x4d\xa6\x94\xb8\x6e\xa8\x8c\x26\x4b\x14\x56\xd4\x72\x31\xf9\x5b\xc7\x1e\x47\xf7\xef\xc9\xf6\x45\x6e\x85\x7b\x10\x77\x65\x9b\x28\x96\xaf\xcc\xd8\xff\xeb\x43\xcc\x1b\xf7\x93\xa5\x8e\x8c\x57\x6e\xf5\x73\x98\xbc\x38\x47\x84\x41\x0a\xce\xfa\xd5\x21\xe0\x00\xbd\xc1\x74\xdb\x3f\x99\x77\x40\x1d\x18\x0c\x46\x81\x99\xe0\x32\xb0\x18\x5c\x0d\xee\x05\x5b\xc0\x1e\x00\x4c\x5d\xd8\x64\x2d\xa9\xbb\xaa\xa1\x6c\x93\x35\x59\xc2\x0a\x92\xf0\xb9\x0d\x54\x00\x75\xb1\x04\x2a\x48\xb2\x29\xaa\x18\x57\x15\x55\x37\xb4\xa4\x1e\xd7\x7b\x36\x92\x72\xb9\x4c\x99\x50\x56\x57\xf5\x98\x47\x32\x37\x0d\x35\x29\x7a\x82\xd0\x1a\x46\x89\xea\x09\x43\xd3\x55\x3d\x61\x02\xef\xa4\x6e\xa8\x0a\x92\x54\x6b\x6c\x55\x8f\x68\xb2\x64\x9e\xa3\x26\x98\x9e\xf3\x29\x05\x2b\x51\x55\xd7\x64\xcd\x55\x07\xad\xcb\x18\xf3\xd4\xb8\x6a\x30\x9a\xdc\xf3\xb5\x6e\x98\x5f\x6b\xf0\xf2\x11\x08\x95\x85\x56\xf5\xf3\x3b\x87\xb3\xf9\x39\x73\x59\x76\x6e\x3f\x36\x67\x31\xc7\xcd\x1d\xee\xcb\x9c\x50\x20\xa2\x1b\xfa\x15\x8c\x61\xcb\x58\x76\x2d\xcb\xae\x1a\xe1\xbd\x81\x65\x57\x0d\xf6\x6c\xf7\x3b\x43\x2c\xcb\x79\x59\x38\x3c\xe6\x91\x10\x1b\xf2\xda\xaf\x0e\x65\xcf\x35\x10\xc7\xd6\xac\x60\x53\x4f\x38\xfc\xab\x6a\xd8\x9c\x55\x83\x0f\xb0\x65\x6c\x2c\x1b\xb6\x65\xb3\xfd\x10\xcb\xc2\x63\x39\xd9\x73\x6b\x42\xd9\xde\x41\x91\x0c\x97\x6b\x62\xae\x58\x7a\x25\xd7\xf5\x5d\x19\x1b\xf2\xd8\x11\x6c\x73\xb1\x83\xc2\x42\xae\x61\x20\x97\x38\x5a\x8d\x32\xef\x20\x72\xbb\xb7\x7c\x18\xc4\x2c\xb9\xd7\xcb\x8e\xe6\x8a\x67\x8f\xc8\x66\xc7\xb0\xf9\x7f\xfe\x1b\x82\x57\x66\xa3\xf2\x61\xe4\x28\x0b\x97\xf8\x6d\xec\x18\xb6\xf0\x09\xd6\xc5\x8d\x66\x7b\x8f\x3d\x55\x90\x4b\xba\xd9\x8d\x63\x58\x96\xcd\x92\x48\x37\xfb\x3d\xca\x21\x8b\x33\xa2\x6d\xd9\xb9\x15\xc8\x55\xad\x4d\x75\xb1\x1c\xf9\x2c\x90\x55\xd6\xaf\x23\xa7\x70\xdd\x8a\x6c\xc4\x66\x23\x16\x95\x56\x20\x76\xe8\x5e\xbb\x32\xd3\x1b\x9c\x46\x3e\x42\xd9\x5e\x16\x8e\xf2\x95\xb5\x8a\x2c\xbb\x22\x1b\xb3\xac\x17\xb1\x6c\xef\xb1\xe4\x33\xb6\x00\xb1\x70\x05\x00\x80\x05\x3a\x00\xb6\x53\xcc\x41\x50\x08\x2a\x41\x1f\x30\x12\x4c\x04\x53\x41\x3b\x58\x00\x96\x83\x1b\xc0\x3a\x70\x2f\x00\x50\x32\x49\x8f\x84\x55\xc1\x23\x7b\x82\xd0\x9d\x05\x65\x29\xa2\x1b\x7a\xb4\x04\x1a\xb2\x26\xc4\x4b\xa0\xc9\x74\x6a\x60\xa2\x0e\xaa\x06\x63\x39\xb5\x69\x06\xba\xaa\x43\xb7\xac\x25\x0c\x21\x9a\x3e\x88\x0a\xa0\xe5\xb4\xba\xaa\x33\x9a\x84\x24\x59\x51\xf5\x44\xcc\xd4\xba\x8a\x7f\xf2\x73\xd9\x8d\x05\xad\xbc\x0e\x26\x54\xec\x91\x15\x01\xab\x42\xc4\xfc\x51\xac\x98\x24\x52\x4f\x40\x59\x52\x54\xd3\x30\x90\x12\x51\xf5\x88\xae\xea\xd4\x73\x63\x06\x56\x6e\x7b\x7e\xcf\xd0\x6b\x66\x1e\x8f\x5f\x42\x2e\xbd\xb4\xbe\xf5\xb5\xd7\x5e\xce\xc4\xcf\x66\x86\xc3\x37\x3c\xef\x6f\x45\xf0\xaf\x41\xbb\x2f\x33\xd3\x13\x21\xc9\xdb\x50\xf8\x7e\xea\xee\x60\xc6\x1e\x3e\x88\x62\x7e\xe9\xf9\x70\xea\x13\xa6\x94\x61\xfc\xd0\xc6\xf8\x33\xa5\xd7\xb2\x6b\x27\xba\x12\x65\xd5\x9f\x8d\xc9\xbc\xb1\x12\xb5\x96\x29\x36\xa7\xc7\x01\x83\xd5\xfb\x91\x73\x11\x5f\x9f\x9a\x9e\x7c\x5e\xa2\xee\x0b\xdb\x83\x64\xbe\x04\xb7\x0a\xcc\x41\x61\x02\x6f\x40\xe7\xf3\x8f\x91\xb5\x55\x35\x2d\xd7\xf5\xd9\x39\x01\x5d\xea\x64\x16\x30\x8d\xf0\xad\xe7\x61\x33\x7f\xb9\x93\x0b\x31\x0d\xbb\x32\x9f\xbb\x00\xcd\x40\x11\xc9\x13\xe4\x33\x19\x3f\x62\x18\xb2\xf3\xc6\x44\x06\x07\x17\x79\x24\x4f\xce\x9f\xfc\x71\x96\xf6\x3c\x8f\x18\xd4\x3b\x9c\x68\x0e\x87\x3d\xe3\x29\xff\xcb\x99\xce\xf9\x99\x63\xb2\x7a\x47\x1a\x63\xed\x19\x45\x64\xed\xb6\xea\xab\xb5\x30\xcf\x91\xef\x3c\x99\xb0\xd7\xd0\xd9\x7d\x76\x4f\x77\xf6\xef\xd5\x6f\x6e\x05\xf9\xc8\x93\x19\x5e\x23\xe6\x48\x1e\x8f\x93\xf1\x38\x01\x00\x1c\x00\xdd\xdf\x31\x7f\x60\x3e\x02\x59\xc0\x0f\x0a\x80\x0e\xea\x40\x03\x18\x0e\x26\x83\xd9\x60\x01\xb8\x16\xdc\x08\xee\x02\x00\x46\x24\x20\x99\x1a\x54\x75\x60\x58\x0a\x13\x65\x77\x16\x8c\xda\xd4\x44\x8f\xf2\x90\x0d\xeb\xae\x3a\x68\xea\x4f\xf2\x68\xe5\x86\x9e\x50\x4d\xb6\x1e\xc5\x92\x12\x55\x93\x4c\xb9\x8c\x15\xdd\xa6\x21\xd3\x25\x65\xad\x3c\xa6\x95\x87\xa0\x9b\x51\xa2\xaa\x69\x02\x46\xd2\xe6\x31\xb5\xa7\x5b\xaa\xd4\x64\x49\x89\x62\x19\x2b\x71\x3d\x19\x31\xc3\x36\xc2\x51\x55\x4f\x9f\x10\xd3\x2c\x3b\x91\x7f\xa6\xca\x1d\xf0\x10\xe9\x26\xfd\x1f\x24\xf9\x08\xba\x6c\xf0\xf1\xdd\x88\x2c\x7c\x65\x24\xfa\xac\xea\xad\x11\xe8\x1d\xdb\x49\xc5\xf1\xba\xfc\x8c\x76\x30\xb6\x57\x3d\xfb\x5c\xce\x3d\x4b\x2a\xf7\xee\xfe\x5e\x5c\x29\xe3\x2c\x21\x01\x6f\x0c\xe6\xfa\xb8\x76\xe4\xbd\x6b\xe0\x8c\x87\xd0\x0c\x2a\x9f\x7b\xe6\x02\x4c\x48\xf8\xb9\x66\xee\xb9\x9c\x85\xe1\xfb\xe6\x6a\x28\x6f\x61\x78\xfb\x37\xc8\x27\x2e\x76\x23\x84\x7c\x45\xf0\xa6\xfa\x8f\xb2\x07\x5d\x38\xb8\xb3\xe1\xa9\x61\x28\x55\xca\xb5\x22\xf1\xda\xb8\x43\x21\x05\x3e\xd8\x25\x32\x1f\xb9\x49\x77\x51\xd7\x55\x8f\x88\x18\x41\x67\xc8\x76\xf5\x6e\xcc\x11\xd2\xfc\xd6\x85\x08\xc2\x01\xaf\xcf\xe4\x7c\xde\xf8\xd3\x2e\xb2\x2c\xce\xc2\xe7\xdd\x7b\x11\xc2\xe4\x07\xee\xe5\xfb\x86\xde\x9c\xab\xe4\xfb\xd0\x23\x61\x6d\x2f\xde\x5d\x5f\x44\xba\x67\x6a\x9c\x0f\x7f\xdf\x7c\x6a\xc0\x67\x41\x83\x7b\x61\x9a\x9b\xfc\xe5\xf5\x3f\x14\x15\x3d\x12\xeb\xe5\x43\xcf\x61\x14\x77\xef\xbe\x60\xe5\x97\x93\x78\xa6\x0a\x79\x3f\xeb\xe3\x5d\x12\x89\x3d\xee\xdd\xed\xc9\xf5\xfa\x7c\x22\xf2\x89\x00\x00\x60\x95\xba\xe9\xe3\xcc\x61\x90\x0f\x12\xa0\x16\x0c\x00\x23\xc1\x64\xb0\x10\x5c\x63\xc6\x67\x53\x55\x59\x50\x46\x8a\x24\x9a\x51\x36\x22\x4b\x48\xc1\x50\x8a\xa8\x58\x09\x9b\xba\x54\x93\xba\x61\x69\x04\x7b\x34\x39\xa9\x27\x54\x05\x31\x96\x23\x99\x5f\xc4\xcc\xb8\x29\x47\xd5\xa4\xed\x27\xc7\x33\x33\x0d\x94\x14\x35\x51\x07\x15\x3d\x86\x82\xd0\x1d\x82\x5a\xb9\x61\x53\xb0\xa2\xa2\x20\x94\x95\xa8\x9a\x30\xe2\x50\xf3\x48\x48\x89\x44\x55\x4d\x8e\xa8\xf0\x8f\xa1\x1d\xfd\x5f\x47\x0b\x82\x59\xaf\x87\xaf\x86\xaf\xa0\xcf\x85\x38\x8c\xa7\x6e\x8a\x87\x86\x90\xd4\x04\x6e\x92\xf7\x4f\xec\xd8\x47\x1b\x0a\x26\x97\x2f\x5b\x16\xbe\x1b\x1e\xad\x3c\xe0\xda\x8b\xc9\x7b\xd8\x7b\x35\xe6\xbc\x91\x5b\x82\x03\x67\xbb\x6b\x2a\x1b\x6c\x7f\x71\x79\xc9\x19\x4e\x5c\x70\x73\x79\x57\xbf\x86\xe7\x2b\xc2\x9b\x56\xfd\x93\x5d\x80\xc4\x91\x18\xbb\x85\x71\x51\xdb\x76\xb6\x30\x43\x49\x31\x1d\xa3\xd0\x41\xea\x9f\x5e\xe6\xf0\xeb\xe3\xee\xbc\xc1\x3b\xce\x8b\xc8\xe9\x21\xe1\xeb\x45\x84\x4e\x4d\x27\x47\x30\xc6\x50\x9b\xb4\x6a\x45\xf8\xc2\x70\xc5\x35\x9d\x68\xd7\x80\x33\xfb\xd8\x29\x1d\x57\x45\x5c\x6a\xdd\x85\xe5\x0f\x5f\x27\xde\x36\xa7\xe2\x1e\xaf\xd4\x59\xd8\x70\x35\x61\xb8\xe9\xae\xc6\xd8\xc8\x82\x35\xde\x10\xf9\x1a\xb9\x72\x66\x6c\x40\xe2\xd4\x19\xf8\x68\x2d\x7a\x14\x56\x0e\x61\x2f\x9a\x15\x2f\x1c\x32\xaf\x3d\x9e\x7a\x30\xec\x0d\xd5\x85\xe3\x80\x32\xf3\x35\x7c\x95\x79\xc3\xca\xd7\xbf\x99\xab\x7f\x23\x2f\xff\x46\x12\xb6\x2a\xc6\x06\xd9\x47\x41\x38\xf6\xf7\xc7\xfa\xea\xd7\x63\xc1\xb1\xe6\x58\x8e\x7d\xd6\x58\x2f\x5d\xea\x86\x41\x98\xae\x3e\x77\x2f\x85\x6f\xc1\x61\x80\xe9\x19\xeb\x57\xd8\x68\x17\xda\xbe\x6b\x17\xdc\x68\x81\x1b\x3e\xec\xdb\xe9\x85\xc3\xb6\xe1\x34\x1e\x79\xcc\xe5\xcf\xa2\xbd\x3b\x7d\x00\x20\x00\x80\xcd\xb6\x8d\x39\x06\x32\x81\x04\xe2\xc0\x00\x35\x60\x20\x00\x30\x2c\x38\xcd\x80\x1d\x16\x74\xa7\xe8\x8c\x68\xe5\xa2\xee\x8c\x84\x19\xcd\x13\x84\x6a\x58\x70\xcb\x4a\xbc\x06\x3a\x8d\x24\xe3\x49\x9f\x66\x7a\xb5\x1c\x16\xf4\x44\x4c\xcc\x84\x7a\x12\x7b\xaa\x61\x8f\x55\xc1\x2d\xf0\x8e\xfd\x63\xa7\x85\xc9\xcc\xcb\xa1\x57\xfd\x67\x01\x79\x9b\x1c\x81\x33\x70\x65\x11\x39\x15\xe7\x2a\x77\x55\xc2\xf5\xed\xa7\xc7\x8d\x0e\xaf\x1e\x6e\x3c\x04\xef\x24\xe1\x2d\xdb\xb6\xdf\x35\xda\x35\x30\xde\x5c\xa0\xb3\x33\x99\x63\x29\x8d\x84\x57\x55\x52\x5b\xc2\xd4\x96\x54\x55\xea\x65\xb8\xe5\x53\x0a\x0d\x65\xdd\x08\xa5\x5e\xde\xbe\xad\xed\xe1\x45\xf0\x0f\x8b\xbc\x95\xb7\x91\x4b\x53\x5f\xaf\x28\xaa\x47\xa2\x48\xad\x68\x24\x03\xc9\xd7\xe4\x14\x64\xf1\xd9\xb3\xed\x52\x6d\x55\x63\xd0\xc4\x5c\x08\xd8\x6c\x3c\x73\x0c\x94\x80\x4a\xd0\x1f\x8c\x04\x00\x5a\xde\x23\xc8\x42\xc2\x42\xa2\x5a\xcf\x2e\x16\x14\x55\xc0\x82\x28\x45\x74\x28\x58\x15\xbc\x88\xaa\x27\x0c\xa0\x99\x78\x28\x0d\x4f\xe4\x9f\x3c\xa6\xc7\x17\xcc\xeb\xa5\x88\x4a\xe5\xa3\x89\x65\x83\xd7\xb2\x2c\xf2\x4e\x2c\x1f\x31\x02\x65\x0f\xee\x4a\xad\x82\x59\xaf\xfa\x9e\x2c\x20\xef\xb3\x13\xa1\x7a\x1d\x29\xc4\xae\x3b\x59\x76\x8b\xf7\xaf\x81\x01\x6d\xee\xde\x46\x7f\xf8\x19\x5b\x90\x11\x4d\x2d\xcf\x66\x45\x6a\x85\x97\x39\x86\xc6\xd8\x83\xe5\x64\x76\x0c\x2e\x8c\xf6\x9a\xe8\xc2\xac\xb7\x33\x5b\x2c\x20\xd7\xd5\x94\x93\xa5\x5e\xd8\x5c\x4e\xde\x26\x29\x84\xa0\x04\x33\x2e\x55\x3a\x63\x4b\xd8\x0a\xbb\x13\x0e\x25\x5e\x96\x45\x9c\x17\xfd\x95\x9d\x26\x34\xc4\x46\xe4\x77\xa5\x42\xd9\x21\x33\xcd\xc7\x00\xdd\xfd\x2d\x80\xf4\x02\xe6\x2d\x50\x07\x9a\xc1\x24\xd0\x6e\xea\x55\x34\x43\xbc\xc7\x04\x6b\xaa\xa9\x4d\x27\x83\xcc\x59\x25\x8d\xa4\xa1\x20\xac\xa2\x2c\x68\x02\x75\x01\x47\x74\xa0\x19\x6a\x4c\x93\x93\x35\x30\x51\x02\xa3\x58\xb2\x0e\xc9\x66\xdc\x51\xad\xbd\xa8\x35\x6d\x3d\x61\x82\xf4\xb4\xba\x15\x04\x35\x59\x38\x27\x91\x98\xa0\x52\xeb\xa0\x38\x8e\xeb\x33\xc8\x95\x70\x8b\xa8\x0f\xb9\xee\xca\x36\xc4\x2d\x38\xb3\xd0\x83\x76\x25\xab\xfe\x7e\x89\xef\xfe\x83\xff\x65\xd9\xb3\x67\xa8\xec\x5e\x7d\x3a\xa0\x13\x0d\x8c\x1f\xa8\xda\x76\x01\x47\x76\xc0\x1b\xa6\xdc\xef\x0b\xfb\x12\xf7\xf5\xf1\x91\xfb\x8b\x50\x18\x4e\xba\xbb\x5e\xaa\xab\x1e\x10\x1c\xd2\x01\x6f\xe7\x22\x82\x72\xf6\x94\x8f\x13\x69\x2f\xc7\xbc\x45\xfe\x3b\x6c\xd8\xec\x8b\x12\xd3\x97\x6f\xad\x98\x34\x7d\x28\xf9\xf7\x9b\xa3\x5a\x38\xb4\xe4\xd6\x89\x85\x0b\xe5\xc8\x55\x33\x8b\xef\xfa\xd6\x4d\xfe\xc6\x61\x4a\x53\x87\x3e\x5a\x34\xbc\xb1\x68\x5f\x02\x1f\xeb\xe0\x10\xdc\xf6\xa7\x30\xc6\xcf\x2f\xf1\xa9\x88\x9b\x77\xc9\x34\xa2\xaa\xa3\x8a\x12\x5c\x9b\x8b\xc4\x23\xe4\x4f\x61\x1f\xe2\x38\x0c\xfb\x8b\x3d\xf1\xb7\x93\x79\x07\x54\x82\x46\x0b\x19\xcd\x04\x97\x82\x95\xe0\x06\x00\x60\xb9\x6c\xba\x9a\x25\x40\xac\x44\x4b\xa0\x19\x80\x3d\xd5\x30\x0d\x5c\x54\xc5\x48\x94\xc0\x98\x6a\xe8\x66\xe8\x35\xf4\x9f\x04\x68\x24\x65\xcd\x23\x4b\x2a\x92\xdc\x05\x50\x4f\xa6\x1d\x56\xd5\x4d\x21\x33\x52\x44\x4e\x8b\x95\x39\x2f\x28\xa7\x8d\xce\x14\xa7\x76\xee\xc7\x2c\x5f\x13\x8d\xb8\x19\x36\x14\xd5\x4c\x9b\x57\xfc\x6b\x8c\xf7\x81\xfd\xe4\xa3\x96\xba\x8f\x36\xbf\x04\x9b\xd8\xda\xbd\x45\x7b\x47\xe0\xfd\xbb\x10\xc6\x7f\x6d\x86\x2e\x8c\xc5\x8d\x9b\xd0\x93\x8d\x2b\x9a\x38\xf2\x38\x1c\x5f\x71\x51\x87\x58\xcd\xd4\xef\x62\xc5\xe1\xf0\x00\x5b\x35\x43\x1c\xd9\x35\x1b\x16\x72\x1c\x39\x5a\x84\x60\x79\x70\x50\xbb\x54\x5b\x39\x00\xce\x10\xb7\x85\x7d\x61\x04\xdf\xe2\x2a\xc9\xbe\x29\xf5\x0b\xaf\xbc\x64\x3b\x8c\x4c\x17\x51\x6a\x22\xf2\x61\x2f\xc7\xbc\xf3\x52\xf5\xa4\xa7\x2e\x1e\x72\x44\x23\xff\x68\xe5\xde\x7b\x09\x71\xcb\xb7\x7d\xd0\x78\xb0\x6c\x17\x0a\x2b\xb3\xeb\xb6\xe1\xb0\x78\x87\x7e\xa9\x56\x78\x4f\x09\x6e\xdf\xc6\x61\xd8\x61\xf3\x3d\xc9\x89\x08\x09\x6d\xe1\xe6\x19\x5c\xdb\xb2\xdb\xda\x44\x34\x69\x89\x6f\xdc\x1a\x8e\x43\x5c\x1c\x3f\xc9\x59\x9c\xa9\xe0\x1d\x11\x6d\xf3\x8a\x71\x6d\xcb\x9c\x89\x1a\xf9\xfb\x2c\xae\x9e\x0b\x73\xd0\x75\xc3\xdc\xa1\xbe\x45\xde\x66\x11\x03\x00\xb0\xa5\x93\xbe\xcc\xdb\xc0\x03\x14\x10\x07\x45\xa0\x37\x18\x00\x46\x5b\xb8\x06\x0b\xa6\xe5\x2a\x92\x09\x4f\xa1\xe9\xb8\x40\x57\x19\xad\x5c\xc2\x82\x1b\x2b\x82\xa1\xe8\x18\x46\x6c\x9a\x19\x6a\xf5\x98\x69\xa8\x05\xd0\x6d\xc9\x56\x50\xa1\x26\x47\xd2\x69\x4d\xff\xb9\x53\xc3\x7f\xc1\x09\x83\x77\x72\xdc\xce\xfd\xa9\x09\x70\x4c\xea\x66\x8e\x6a\x1c\x0b\xaf\xe2\x8a\x7b\x47\x70\x4d\xf1\x4b\xa9\xaf\x28\xf7\x34\xee\x3d\xd1\x47\xfd\x9d\x8b\xf0\xda\x32\xce\xcf\xef\xe1\xba\xaa\xb1\x08\x67\x0b\xb9\xe4\x5d\x45\xb0\xbd\xc7\x15\x67\xc4\x52\xa3\x7d\x9c\x9b\x7a\xd8\xcf\xbc\x8d\x5b\x52\xcc\x56\x91\xfc\x85\x5b\xf0\x16\x42\x70\x10\x37\x51\xb6\x05\xbd\x63\xcb\xd4\xc1\xa4\x30\x57\xa0\x3c\xfd\xf0\xf2\x54\x21\xfc\xab\x4e\x5e\xe4\xb8\x39\x11\xb2\x39\xe2\x8e\x70\x1c\x1c\xe4\x26\x8f\xf1\x28\x12\x41\xe4\xd3\x88\x2f\xe2\xc3\x1c\xa7\xa6\x17\x35\x81\xed\x71\xe6\x08\xd0\x41\x03\x18\x06\xc6\x83\x79\x66\x54\x13\xb0\xa2\x2a\x51\x5b\xb2\xda\x74\xf4\xb4\xb5\x28\xaa\x60\x68\x50\x33\x64\x33\x88\x27\x54\xf3\x04\x64\xa6\x1d\x8f\x6c\xa8\x58\x8a\xeb\x22\xa3\xc9\x82\xbb\x00\xc6\x55\x93\x42\xe9\xa2\x95\x8e\x14\x54\x00\x7f\x06\x0e\x3c\x52\x7a\x34\x6c\x5a\xb7\xc5\xb7\x4c\x43\x0e\x8b\x86\x9e\xa0\xce\x70\x1c\xfe\xfe\xfb\xac\x86\x79\x97\x87\x61\xd1\x08\x8e\x9c\x68\x29\x1a\x7e\xe7\x23\x1c\x87\x60\xc0\x1d\x56\x8b\xbe\xce\x4b\x7c\x8f\x17\x63\x95\xbb\x12\xcb\xd3\xdc\x13\x50\xeb\x4c\x6a\x8b\xdb\xab\xb9\x03\x0e\x91\xf3\x71\x88\x23\x59\x77\xf9\xee\x8b\x88\x62\xd0\x11\x1c\xdc\x21\xd5\x55\x0d\xa0\xca\x87\x92\xe3\x73\x8b\x26\xde\xe0\x8e\xab\x18\x61\xd4\xea\x0e\xb7\x3c\x7b\x33\xe4\x66\x71\xcc\x11\x8e\x3c\xc3\xfd\x8b\xf4\x1e\x45\xf6\x2c\x21\xbb\xe6\x70\x45\x1c\xec\xcd\x91\x2f\x11\x82\xfa\x80\x0b\xc7\xdd\x35\xac\x08\x17\x62\x0e\x47\x34\x84\x33\x04\xea\xd9\x84\x97\xfc\xad\xde\x19\xe4\xdc\xc3\x20\xc5\xcd\xf5\xe1\x83\xff\x21\x59\x5c\x9b\x6b\x50\x7c\x54\xe1\x84\x69\x4f\x92\x3f\x5d\x29\x16\x59\x04\x3f\xce\xa1\x5e\x2c\x4c\x2e\x29\x1a\x03\x10\x28\x04\xc0\x76\x80\x79\x07\x04\x41\x29\xa8\x06\x8d\x60\x0a\x98\x6b\x4a\x56\x33\x65\x5b\x02\xa3\x36\x24\x25\xb5\xb0\xec\x91\xd2\xf9\xd1\xa6\x3a\x63\x49\xc6\x23\xfd\x24\x41\xc1\xd0\xe3\xba\xc1\xa4\xb1\x2f\x2a\x80\xae\xf3\xe2\xa3\xa8\x9a\xb4\xc7\x82\x65\xaa\x84\xb0\x53\xb6\xa0\xb0\x89\xcd\x62\x9a\x47\xa2\x7e\x4a\xa5\x86\x19\x11\xe0\x9b\x5b\xf6\xb3\x2c\x3e\x39\xe5\xdd\xa1\xe1\xab\x1f\x81\xf6\xe9\xe1\xf7\x86\x35\x68\x64\x7b\x1d\x82\xae\x1a\x4a\xf5\x69\x62\x20\xd3\xcd\xfa\x38\x24\x22\x72\x97\xe8\xc3\xcf\xf5\xf7\x85\xf0\x00\x97\x95\xf5\x06\xb5\xcf\x18\x59\xcf\x71\xe1\xc6\x29\x45\xe8\x3b\xed\xa1\xfe\x6c\x21\xf7\x18\x5c\xc6\x35\x66\x9e\x19\x52\xad\xcd\x1b\x5b\xf3\x10\x74\x4c\xf0\x31\xef\x20\x8e\xbc\xcc\x7e\x82\xc9\x91\x45\x3b\x5f\xfc\xaa\xf5\x52\x72\xb4\x3d\x0c\x7f\x58\x4f\xb9\x1e\xf0\x9a\x58\xf8\xa8\x29\x3c\x11\x96\x23\x84\xc3\x68\x95\x17\x3f\x39\x19\x56\x10\x29\xde\x5c\x98\x60\x67\x08\xa4\x5b\x9b\xde\x71\x79\xa3\x2f\x7e\x69\xab\x86\x46\x5d\x46\x3e\x2e\xde\x3f\xb9\x79\xd8\xe4\xf9\x9d\xab\xef\x27\x0f\x4d\xf6\x99\xe9\xf8\xf4\xf0\x0b\xbd\xab\xac\x9a\x07\x00\xb6\x3b\x99\xf7\x41\x02\xf4\x01\x4d\xa0\x05\x00\x31\x62\x42\x1e\x39\x69\x66\x5f\xcd\x82\xa5\x08\xcb\x48\x42\xa6\x89\x19\x48\x32\x81\xac\x9e\xd4\x93\x46\x5c\xcd\xd5\xcc\xb3\x22\x58\x51\x05\x93\x35\x16\x40\x93\x4d\x18\xb2\x26\xfe\x5e\x1e\xe6\x6c\x4e\xee\xe8\x80\x31\xe3\x9e\xe6\xfc\xbe\x59\xb7\xf9\x8b\x97\x45\x8a\x39\xc1\x36\xfc\x76\x1f\x1c\x91\x6a\x79\x4c\xaf\xbe\x97\x83\xac\x07\x4d\x58\x4f\x66\x7e\x8a\x39\xd8\x6f\xbf\xc3\x71\xef\xa7\x6e\x3d\x82\xb9\x17\x73\x9a\xe6\x78\xea\xab\x07\xc1\x67\x2d\xa7\x6d\x36\x9d\x76\xbb\x8f\x79\x9f\x9b\x4d\x3e\x7e\xa6\x78\x2f\x99\xed\x16\x33\xca\xfb\x16\x2e\x3f\x31\x2e\xd2\xd0\xa8\xed\xf2\x7d\x3d\x70\xd0\x54\xb2\x03\xe3\x5d\xec\x77\x6b\x5a\xa5\x6d\x78\xcf\xeb\xe8\x43\x0e\x0e\x7e\x09\xf9\x3f\xc4\xaa\x3f\x42\xba\xb9\xd9\xae\x21\xea\x98\xa2\xae\xef\x7f\x72\xdb\x74\xfc\xb2\xdd\xc3\x1c\x04\x6e\xa0\x80\x32\xcb\xc2\x66\x80\x85\x66\x66\x0e\x41\x37\x4e\xbb\x99\x05\xe0\xe3\x7a\x22\x66\x93\xdc\x72\xd2\xb0\x26\x9a\x50\xa2\x38\xd6\x93\x7d\x51\x10\x2a\xaa\x69\x75\x3d\xb9\x03\xfe\x84\xb7\x64\xac\xc9\x8a\xaa\x60\x55\xb1\x30\x7b\x5c\x4f\x58\xc5\x15\x0b\xcb\x9b\xa6\x66\x1a\x2e\x93\x36\xb3\x73\x56\x76\x0d\xcc\xba\x90\xdb\xf4\x36\x39\x72\x79\x9c\x90\x69\xdc\xdb\x5b\x20\xbb\x7e\xfd\x08\x4f\xb3\xb8\xfc\xab\xdd\x15\x30\xa4\x46\x85\xaa\xf5\x9a\xc8\xfa\xa2\x54\xa0\x7e\x86\xd8\x9c\xfa\xc6\xc4\x67\x85\x09\x6e\x46\xb7\x17\xf9\x54\x84\xda\x9b\xf0\x64\x84\xd4\xcb\x0b\xb9\x15\x6f\x57\x6a\x4f\xf4\x43\x9b\x1a\xc9\xeb\xfd\xfa\xc5\xc7\x2c\x78\x0f\x16\xce\xf0\x31\x07\x3f\x58\xfc\xb7\x89\x73\x4f\x90\x03\x13\x38\x58\x38\xe3\xb3\xe5\x93\x9f\xfd\xf7\x04\xb2\x5d\x5c\xd7\xe7\x1a\x7e\x7d\xdf\x9b\xeb\x9f\xdd\x32\x3e\x8c\xd0\x25\xf9\xa5\x95\x95\x9f\x8a\xc3\xd6\xdc\x3d\x5b\xc4\x13\x6f\x46\xe4\x9f\x56\x1a\x0a\xce\xaa\xf2\xa2\x2d\x8b\xea\xaf\x51\x0b\xa3\x65\x37\x8c\x6f\xee\xff\xf8\xd1\xfe\xe8\xbd\xca\xaa\x1b\xc4\x29\xab\xc8\x5f\xa6\x89\x95\x5c\xfc\xe4\x90\x61\xbe\x1a\xc0\x00\x03\x00\xdb\xfb\xcc\x51\x10\x04\x95\x60\xac\x55\xc3\x00\x50\xb3\xa2\x20\xc2\xe9\x20\x18\x82\xe5\x62\x52\x47\x4a\x58\x8d\xeb\x4e\x23\x69\x0a\xd7\x48\xd7\x2d\x4c\x5f\xb5\x49\x9a\x61\xa6\x6b\xa7\x6a\x4a\xba\xdc\xba\x50\xb1\xa2\xdd\x79\x21\x8f\x29\x37\x92\x42\x82\xf9\xc9\xa3\x6d\x9a\x99\xf5\x0d\x09\xe1\x28\xdc\xac\xc1\xd1\x75\x88\x7c\x5d\x33\x76\xcb\x6b\x1c\x87\x4e\x4d\x39\xd2\x14\xbe\xfa\x51\xf2\xdf\xe9\xe1\x23\x43\xb7\x17\x69\xbe\xa7\x5a\xb4\x01\x7b\xa2\xe8\x4e\xf4\x76\xd5\x77\x89\x87\x1a\xa8\xdd\xaa\x26\x92\xef\x66\x5e\xde\x5e\x88\x91\xa8\xc6\x31\x42\x78\x8a\x18\xae\x87\x55\x4f\x5f\xd1\x92\xda\x28\xd5\x56\x0d\xc8\x19\xd4\x5e\xc9\xfe\xa1\x19\xf5\x69\xca\x58\xbd\x9e\x39\x4a\xd0\xfa\xd4\x17\x0f\x78\x39\xc4\xc1\x2a\xee\x33\x04\xe3\x8b\x77\xbf\xfc\x75\xeb\x65\x30\xde\x11\x26\x33\x9a\xc7\x8e\x08\x17\x46\xd4\xaf\x9b\x39\x1f\xd7\x0d\xd6\x4e\x59\xd5\x3e\x03\x86\x8a\x5f\xab\x27\xdf\xbd\x9d\xfa\xe6\xf1\xaa\x73\xc5\xcc\x38\x87\xf0\xd7\x7f\x81\xc9\x4f\xfe\x1c\x1f\x55\x98\xe0\x66\xba\xc8\x8b\xe1\xb0\x2f\xc4\x5b\xdd\x1d\x26\xa7\x38\x66\x3b\x62\x71\x0a\x6f\x4f\x6d\xf2\x57\xbc\xc2\xf6\xbf\xc3\x35\x8e\xfd\xcf\xe4\xc3\x76\xf1\x79\x47\x78\xc6\xb7\xcb\x67\xdd\x43\x23\xd9\x47\x05\x7a\xee\x21\xf0\xbf\xb8\x87\x5f\x71\xa7\x14\xda\xb6\x73\x17\xdc\x88\x8a\xf6\xe3\x42\x2e\xec\xdd\xe5\xfd\xe7\xaf\xc9\x94\xed\xc8\x2f\x7f\x93\x4c\xfc\x2d\x7a\x65\x62\xbf\xee\xa5\xb6\xdb\x99\xf7\x81\x1f\xc4\x80\x06\xea\xc0\x20\x30\x1a\x4c\x00\xb3\x00\x80\xb4\x20\xb9\x31\x92\x64\x46\x4f\xea\x09\x31\xa9\x27\x62\x51\x2c\x5b\x01\xcb\x65\xde\x8e\x1a\x35\xbd\xd2\x22\xdb\xa6\xe9\x99\xd8\x5a\x37\x71\x5c\x44\xd5\x19\x33\xde\x89\x69\x4c\xa7\xa9\x49\x46\x36\x2c\x56\x11\x55\xf5\x84\xfc\x1b\xb3\x84\x4f\xc2\xcb\xd6\xef\xbc\x83\xa8\x5f\x9f\xd4\xc8\x99\x05\x7d\x3f\x24\x6a\xe3\x64\x38\x40\xac\xaf\xac\x1f\xc0\x36\xc2\x8d\xf5\xe4\xeb\x10\xe7\xce\x7d\xba\x99\x3c\x18\xae\x24\xf5\x5e\xf8\x81\x57\xdc\xa5\xfa\x9e\x8d\x7f\xe8\x73\x90\x7c\x0d\x23\x31\xec\x55\x1c\xcf\xfe\x52\x2e\xcc\xfb\x71\x72\x44\xbb\x66\xed\x63\xa3\xef\xa5\xc4\xaf\xdc\x7e\x28\x0c\x1f\x7c\xd8\x3f\xf2\x53\x11\x25\x2e\x82\xde\x27\x7d\x2c\x0a\x8b\x5c\xd8\x37\x7a\x4e\xe2\xe1\x33\x75\x50\xc4\xd5\x7f\x9f\xbc\x82\x0b\x8b\x95\x5e\x11\x21\xec\x15\x53\xd7\x17\x85\x7d\x61\x1c\xf7\x99\x36\x85\x4d\xb8\x2c\xfe\x9a\x57\x3a\xac\x5e\x9e\x0e\xe6\x10\x18\x00\xc6\x58\x15\xa8\x85\xe0\x0a\x70\x03\xb8\x0d\xdc\x0b\xb6\x5a\x3c\x24\x4d\x3e\x0a\x60\x5c\x37\xc3\x51\x09\x74\xc6\x92\xd5\xb0\x5c\xd6\x92\xd5\x50\xb2\xb9\xab\x61\xb9\x68\xe8\xce\x98\x1a\xb6\x21\xf3\x44\xcb\xcb\x12\x86\x26\x0b\x8a\x8a\x22\x4a\xd8\x66\x12\xd0\x58\xd2\xe4\x23\x8a\x79\x8e\xa4\xe8\x56\x22\x0e\x42\x77\x01\x34\x12\xd0\x6d\xc2\x1d\x23\xae\x44\x6d\x50\x93\xa5\xa8\x0d\x4b\x96\x50\x93\x8c\x26\x53\x05\x30\xa6\x95\x4b\x26\x28\x54\x0d\x59\x50\x4d\xe5\xf4\x44\xc4\xa4\xa9\x0f\xa4\x98\x56\x75\x2e\x15\x97\x53\x73\x61\xe7\x9f\xbc\xe4\xd4\x00\xd5\xbb\x68\x62\xab\xb8\xa1\x8e\x85\x6c\xdf\xc1\xde\xd6\x1a\x36\xd3\xdd\xba\xa7\x20\x7b\x71\x1b\x4b\x1e\x5e\x4c\xee\xba\xc9\x05\x67\x36\x0c\x2b\x3d\xf4\xd8\x41\x96\x65\x37\xbf\x4e\x48\x0e\x19\xb3\xcd\x05\x37\x2e\x59\x53\xaa\xd7\xa1\x1b\xc8\x3d\x6b\x5c\x2c\x9c\x39\x90\x9a\x36\x3c\xdb\xc5\x76\xad\x98\xcb\xde\x75\x11\xcb\x4e\xdd\x3f\x12\x1a\x88\xbd\xe2\x42\x8c\x5c\xec\xbd\xb5\x70\x26\x8b\x2e\x89\x23\x78\x94\xcb\xce\x0e\x15\xc4\xb2\xd9\xd4\x5c\x57\xff\x16\xae\xf7\x88\xf5\xc9\x8d\xa8\x06\x85\x72\xe0\x0a\xe4\x7a\xe5\x54\xce\x75\xf7\x5c\xfc\xd2\xbf\x98\x43\x64\xf1\xc4\x7e\x35\xe4\xc4\x4b\xd9\xbe\xbe\x13\xf7\x4c\x80\x0d\xfb\x72\xdb\x07\xa1\xd4\xa2\x7c\x58\xd6\x6e\xc0\xc4\x32\x96\x8c\xb9\x70\x14\x22\x17\xdf\xed\xfd\x87\xf0\x2a\x4b\x06\x6d\x3c\x43\x81\x4b\x86\x20\xb8\xe7\x60\xec\xe1\x32\x91\x24\xeb\xfa\x20\x78\xf7\x23\xd9\x8f\x2d\xb9\xad\xa6\x6d\xed\x70\x72\x6a\xb5\x04\xe7\x4e\x58\x4b\x16\x41\x83\x75\x91\x57\x86\xc7\x98\xf8\x93\x7b\xf3\x91\x41\x3a\x0a\x06\x91\xe5\xc5\x19\x05\x6c\x36\xdc\xe3\xe2\x4e\x61\x54\x53\x60\xd5\x9a\x91\x2b\x7b\xb4\x78\x70\x10\x9b\x2b\x5a\x75\x84\xee\xb9\x88\x30\x47\x80\x0a\x12\xa0\x3f\x18\x0e\x26\x81\x8e\x34\x2a\xcf\x30\x93\xb9\x99\x9c\xb0\x64\x21\x4b\x0b\x80\xaa\xc9\x6a\xa8\xab\x0a\x36\xa9\x76\x06\xb4\xdc\x18\x43\x29\x9a\x09\x0d\x45\x87\xaa\x4d\x4b\x1a\xc9\x6a\x28\x63\x8f\xac\xe9\x99\xe7\xa5\x37\x31\x4d\x91\x92\x86\x66\xf9\x53\xcc\x13\x84\xd8\x44\xed\x3d\xfb\xf0\x10\xb5\xef\x15\xd8\x00\x5b\x53\x65\x10\x54\x70\x5b\x1a\xf6\xf1\xa7\x3d\x5c\xde\x6a\x59\x74\xc7\x32\x97\x1a\xdb\x6b\x4f\xa7\x2a\xe0\x3c\x58\x7a\x80\xfa\xa2\x29\xb0\x0f\xa2\x68\xf3\xee\x7d\x53\xc8\x3a\xe3\xb9\xf1\x9d\xa5\x01\x1e\xe3\xb2\x65\x79\x2d\xcf\xed\x16\x87\xe5\xb5\x94\x54\xf2\x1d\x0d\x0d\x81\x54\x79\x19\xcf\xe7\xf9\xa9\x03\x65\xb6\xe7\x6a\x03\xa9\xf2\x78\x66\x20\xcf\x4f\xbd\x5e\xca\x1c\xc1\x07\xba\xda\xc8\xdd\x18\x43\xd7\x53\xad\x98\x0b\x18\x46\x5b\x60\x1e\x6e\xdd\x47\xba\x30\x86\xd7\xda\xe6\x1d\x68\x08\xb8\xdf\xe8\x3a\x83\xa1\x02\xbb\xf7\x61\x72\xc6\x48\xed\xde\xf9\x68\x5b\xd9\xed\x07\xca\x30\xd5\x94\x5a\x33\x5f\xee\x57\x3b\x34\x9c\x9a\xd1\x20\x05\xf2\x43\x36\xa4\x18\x3c\xaf\x85\x71\x20\x20\xf9\x91\x62\xe0\x9e\xf8\xd3\xce\xdc\xc1\x1c\x03\x01\xd0\x0b\x18\xa0\x2f\x18\x0a\xc6\x83\xe9\x26\xca\x17\x22\x61\x8b\x7c\x2a\x52\x79\x1a\x86\x2a\x31\x1d\xea\xf1\x98\xaa\xc7\xf4\x0c\x28\xc8\x91\x70\x0d\x4c\xa8\xf1\x02\x28\x87\x25\x19\x5b\x72\xb7\x28\xbe\x55\x81\x55\xd2\x80\xe1\xbc\x7a\xbb\x20\x6b\x69\x20\x90\x07\x71\xa4\x5c\x52\xd4\x88\x60\x62\x2d\x8f\xe4\x2c\x82\xf1\x1e\x49\x87\x05\xdd\x56\x07\x43\x17\x06\x76\xf3\x4b\xa7\x46\x0f\x5d\x72\x7f\xd7\x01\x58\xe6\x21\xe6\xf4\xc8\x01\xb8\x5b\x82\xb5\xb0\xf1\x96\x11\x7b\x5a\x96\x41\x05\xe3\x8a\xed\x4d\xeb\x78\xcc\xdf\x45\x8d\x6b\x6e\xc5\x7c\xd3\xd9\x75\xa1\x11\xf3\x3c\xfd\x6b\x9b\x4e\x6e\x79\x03\x7a\x92\x12\xd9\xde\x0d\x24\xd8\xbc\x17\xaf\x23\x1b\x71\xc0\x56\xd6\x9c\x3a\xdd\xb5\x4f\xe1\xf9\xfc\x80\xad\x15\x6e\x67\x8e\x1d\xbe\x60\xf4\x17\x43\xf9\xbd\x4d\x6d\xe4\x83\xa9\x79\x10\xc1\xda\x13\xde\xfb\x31\x7e\xea\x3b\x68\x90\x13\x64\x8b\xfb\x64\xc3\x2d\xa5\xfe\x99\x65\x18\x4b\xeb\xb6\xf0\xfc\xee\xed\x17\x6e\xdd\x31\x89\xe7\x5a\x96\xd5\x92\x4f\xf8\x4e\x4b\x73\x8f\x90\x2d\x5b\x56\xf7\xd1\x9b\x4e\xb7\x19\x3c\x39\x14\x80\x79\x68\xfa\x56\x52\xca\x50\x6c\x4e\xd8\x86\x15\x78\x7b\xa9\x19\x9a\x10\x68\xed\x5e\xc8\x7c\xc3\xbc\x0f\x22\xa0\x04\xf4\xb1\x6a\xab\x33\x2c\x5e\x1f\x91\x20\xa5\xa8\x4a\x4f\xdc\x91\xcb\xeb\x20\x94\x22\x16\xd4\x8f\x5b\x58\x5f\x93\x25\x60\x46\x6c\x43\x86\x8a\x9e\x86\xf9\xe6\xa9\x6e\x13\x6c\x99\x11\x49\xcc\x84\xba\xcb\x76\x5e\x05\xcc\x02\xa7\x56\x38\x49\x63\x85\x88\xaa\x53\x2f\x8e\xbb\x16\xbe\x44\xb6\xfe\x10\xa8\xee\x4b\x4e\xce\x09\xc3\x41\xf3\xd7\x37\xaf\x86\x63\x88\xf8\x40\x1f\x8e\x5c\xb7\x32\xc2\xc1\x75\x1d\xb6\x82\x41\x3e\x72\x6f\x40\xa8\x8d\xe8\x70\xcc\xc4\xd4\x75\xee\xc8\xf0\x33\xb3\x7c\x2a\xd7\x17\x8e\x09\x36\x3e\xbc\xf3\xb1\x8d\x63\x5d\x83\x7b\x8d\x2e\x4a\x72\xb3\x6c\x79\x7d\x33\x62\x84\xbd\x66\x14\x77\x78\x15\x3e\x38\xa3\x6f\xfd\x65\x94\xbd\x84\x79\xbf\x18\x93\xad\x10\x63\xf2\xc7\x45\xd7\xf6\x22\xde\x4e\x6e\xd9\x6a\xb2\x15\x47\xe0\xed\x53\xfe\x45\x8d\xbc\xde\x37\xdf\x2f\x92\x9b\x06\x21\x5c\x0c\xc7\xa0\xe1\x11\x44\x76\x2c\xba\xbc\xd7\xfa\x1b\x2f\x7d\x01\x76\x75\x70\x67\xc8\x27\xe4\x2b\xe8\xc6\x90\x22\xc4\xc4\xc4\x03\x73\xba\x5e\x4f\xf8\x23\x91\x65\xa3\x7d\x3a\xb2\x70\xc2\x34\xe4\x67\x3e\x00\x6e\x60\x80\xa1\x60\x9c\x65\x93\xa2\x85\x2c\x95\xc8\xcf\x6c\x51\x30\x99\x68\x08\x4a\xa6\x15\x0a\x1e\xa9\xa7\xbe\x26\x6b\x61\x41\x77\xc6\xe2\x05\x90\xf1\x84\xcc\x2c\x10\x89\xf5\xb8\x70\xd8\x48\x0a\x7a\xe2\xbc\x02\x88\xad\x19\xde\xd3\x69\x90\xc5\x97\x9d\x48\x35\xc2\x2a\x0f\xf9\x01\xc3\x18\x79\x09\xfe\xb5\x75\x83\x9a\x0f\x33\xf2\xb9\xe9\xd7\xaf\xb9\x41\x51\x70\xa0\x75\xd3\xd3\xf0\x5b\xf2\xdf\x05\xb7\xdc\x69\x2b\xad\xa8\x93\xc8\xe7\x2b\xc8\xbd\xa9\x02\x29\xa0\x04\xa8\x6e\xf8\xc7\x2b\xe6\x9f\x79\x2f\x3c\x62\x81\xdc\xbf\x6e\x28\xf3\x01\xb9\xec\xbe\x57\x52\x2f\xac\x8f\x62\x38\xe0\x03\xdf\x1f\x31\x7e\xfa\x6b\xd8\x87\x7c\x4e\xee\x6e\x80\x95\x0f\xe5\x4b\x38\x70\x03\x79\x92\x71\x4a\xa4\xc8\x0f\xef\xae\x20\x77\x6f\xa2\x06\x4f\x80\x1b\x56\x47\xff\x96\xe8\x3e\x45\xe2\x6f\xce\xc2\x01\x29\x80\x95\x53\x7f\x81\x15\xf8\x83\x36\x7e\x8e\x38\x3c\xbf\xa5\xa4\xc7\x5f\xe7\x32\xcb\x98\xa3\x20\xd7\x62\x39\xc3\x41\x0b\x98\x06\x66\x81\x65\xa6\x6c\x64\x01\xab\x11\x2c\xc8\x11\x43\x33\x09\x7a\x24\x6a\x6d\xa7\xab\x6c\x35\x30\x57\x8f\xe9\xd0\x4c\xfc\x02\x4a\xdb\x95\x61\xe6\x24\x13\xea\x47\x7a\x3c\xd7\x24\x38\x02\x36\xe1\x8e\x8e\x15\xfd\xfc\xf2\x50\x44\xc6\x69\x77\x35\xc1\x83\x2e\x7b\xac\xf2\xdb\x39\x61\x1a\x42\x42\xd1\xe9\x37\xdd\xee\x6e\x72\xcd\xbc\x00\xfc\xf3\x01\x9e\xe7\x9f\x22\x8f\x86\x2e\x9e\x07\x6f\x23\xbc\x74\xd6\x0f\x27\x93\x4f\xa1\x8f\xdc\xc7\x54\xf0\x51\x7f\xc0\x55\x1f\x35\xf8\x40\xea\x4f\xff\x8e\x0b\xe4\xd5\x29\x3c\xe6\x66\x51\x9a\x3f\xc0\x07\x30\x76\xe3\x2e\x35\x34\x7c\x9e\xa7\x5f\x6d\x13\x1c\x07\x97\x28\x98\x5c\x81\xfd\xd4\xc5\x52\x34\xb0\x2f\x24\x78\x92\xe4\xd5\xae\x0b\xa4\x40\xd4\x4f\xbf\xaf\x04\x98\xa3\x12\x79\x54\xea\x9e\x47\x2e\xe5\x5f\x26\x02\xbf\xab\x99\xac\x9a\xff\x83\x9b\x3c\xe2\x46\xb0\x8d\xdd\xb5\xc7\xb1\xed\x00\x9c\xd1\x20\xc4\xc9\x7d\x79\x43\x30\x2e\xe5\xe1\x05\x0a\xba\x5e\xc1\x53\x0e\xf2\xfc\xc7\x4b\xc9\x9b\x8e\x04\xa9\xe4\xb1\xf4\xdc\xbf\xa3\x5c\xf4\x39\xbe\x43\x1c\x96\x37\xbe\xe4\x80\x82\xc9\x43\x01\x38\x6e\x69\x80\xc3\x51\x7c\x2f\x9b\x43\xfe\x90\x8f\x03\x92\x1f\x47\x31\x1c\xc7\x05\xd2\x9c\xaa\xbb\x9d\x69\x64\x8e\x83\x08\x28\x07\x35\x3d\xb2\xbf\xcc\xcc\x3e\xb2\x80\xe1\xf9\x92\xc7\x82\x55\x1c\xea\xb1\x50\xa8\x33\x96\xc4\xac\xc5\x65\x43\x88\xd6\xc0\x84\xe9\xd0\x3d\x62\xb7\x54\x62\xd1\x7a\x13\xf9\x0b\xbf\x92\xbc\x14\x11\xb0\x2a\x88\x3f\x71\x4f\x33\x03\xd9\x3a\x61\x23\xe7\xee\x06\x64\xdb\x3c\x0e\x3e\xff\x06\xcf\xf3\xcf\x93\x2d\xf3\x4e\xa4\x0c\xd8\x22\x91\xd3\x66\xbc\xdc\xc2\x04\x82\x5c\xc0\x2f\x14\xf3\x15\x9c\x3f\xf5\xd4\x49\x85\x9c\x6c\xe5\x79\x8e\xda\x18\x08\x04\xf2\x95\xbc\xfc\x3c\x49\xc2\x5d\xfe\xf0\x70\x2b\x45\xc0\x56\xb8\x2c\x40\x56\xf2\xfe\x03\x8d\x0e\x35\x55\x1a\x30\xed\xf9\x8d\x52\xe6\x38\x4f\x36\x4a\x10\xcc\x23\x1d\xfc\x2b\x84\xe7\xf7\x36\x93\xa5\x5f\x21\x04\x5b\xf7\xfa\xee\xc3\x78\xef\x2b\xb0\x15\x37\x38\xbc\x64\x65\x9e\xa1\x94\xf1\xb0\x8d\xe7\xf9\x8d\x0a\x6e\x3d\xcc\x71\xef\x6f\xcf\xd0\xc9\x90\x66\xa7\x8e\x71\x1e\x3c\xcd\x2b\xcf\xf3\x1d\xe2\xd0\xfc\x96\x92\x37\x03\x98\x6c\xe7\x15\xd8\x9c\xba\xdd\x08\x28\x96\x85\x57\x20\x90\x01\xa6\x77\xcf\x45\x3b\x98\xb7\x81\x66\xad\x0c\x5f\x08\x66\x82\x4b\xc0\xe5\x60\x21\xb8\xf9\x5c\xa4\x04\xe9\x48\x29\x39\x19\x39\x2c\x1a\x0a\x96\x30\x50\xf5\x64\x9d\x55\x2e\x17\xcc\xbc\x6f\x28\xe9\xd0\x69\xa1\xb5\xdf\x88\x9d\xe6\xc5\x1e\x39\xfd\xf5\x79\x85\x12\xa6\x5c\x32\xcd\x3a\x5a\x03\x19\x19\x2b\x3a\x2e\x4f\xd7\xde\xb1\x64\xe8\x30\x1d\x45\xd3\xe2\x36\xd2\xd2\x37\xa3\x2b\xb5\x73\xde\xbd\xf0\xef\xe4\x61\x72\xc6\x37\xb0\x17\xd9\xdf\xa9\xc2\x3e\x37\xc3\xfa\x69\xdc\xca\x84\x9b\x9c\x1c\xe5\x5a\x78\x3d\xfe\xea\x66\x0e\x8e\x4e\x5d\xd8\x17\x2f\xbd\xad\x98\x2c\x5a\xee\x83\x2b\xdb\x6d\x13\x07\xf9\xc8\x46\xbf\xab\x26\x92\x80\xa3\x27\xa6\xae\x70\x87\xfb\x90\x0f\xda\x22\xd8\xd7\x17\x0e\x6b\x10\x24\x33\xf2\x0d\xe9\xa4\x06\x14\x63\x9f\x8f\x9c\x41\x88\xeb\xeb\xc6\x5c\xe4\x45\x5f\x38\x15\xc5\xef\xcc\x9c\x50\xbe\xdc\xe7\xa3\xb6\x16\x8b\x7d\x33\x62\xa9\xb1\x91\x29\x43\x8a\x5e\x64\xde\xae\xc6\x64\x1b\x14\x31\xd9\xbc\xe5\x3e\x72\xe9\xbd\x6e\x38\xff\x1e\xf7\x1e\x37\x8c\x7a\x91\x54\x3f\xf1\x36\x8e\xcc\x26\x0f\x20\x34\x70\x18\x7c\x7f\xf9\xe5\x2a\x95\xb3\x31\xb2\xd2\xe7\x26\xeb\x06\x62\x54\x04\x47\xe1\xbe\x61\x4c\x76\x3e\xb6\x72\xf1\xc5\x83\x3a\xe6\xc0\xc3\xcb\x44\x02\xd5\xd1\x45\x3a\x37\xcb\x75\x4d\x11\xf9\xb3\x0f\x26\x38\xee\x7a\x77\x75\xdf\xcd\x3e\x77\x04\xb5\x15\xe3\x88\x9b\x7c\x3d\x3a\x82\x23\x3a\x72\xeb\xbe\x88\xdf\x9f\xc6\x60\x97\xe3\x99\xcc\x11\x2b\x02\x99\x71\x79\x26\x98\x6f\xc6\x1f\x09\x0b\x11\x43\xf3\xc8\x11\x41\xd5\x23\x12\x4c\x2b\x46\x50\x10\xb6\xd8\x07\x56\x15\xc1\xe2\xc7\xba\xaa\x58\xee\x01\x74\x01\x5a\x80\x2c\x5d\x7b\xb6\xaa\xa5\x12\x34\xcf\x81\x8a\x7e\x3e\x18\xfb\xb9\xe9\xc7\x7e\xbe\x4b\xed\x3b\x0e\xf1\x52\x5c\x67\x40\xfe\x13\xea\x15\xb2\x05\xb6\xa4\x8c\x4f\xde\x70\xea\xfb\x78\xfe\x78\x6b\xf3\x76\xa4\xf0\x5b\x2a\x0e\x1d\x4f\x55\xc0\x56\xb2\x91\xfa\xb2\x29\xf0\x09\xc7\xf3\x5f\xb6\xd2\xa5\x4d\x01\xb2\x11\x47\xe1\xcc\x29\x5d\x81\x73\x40\x8c\x6f\x70\xa8\xa9\x32\xcb\xf8\x0f\x94\xd2\x79\x0d\x8e\x78\xaa\xd4\xef\x37\x5d\xa1\x8c\x39\x82\x4f\x90\xce\xdd\x9d\x0d\x70\xf5\x97\x18\x93\x8d\x5d\x67\xc8\x5d\x18\xff\x0b\x9e\xa0\xa7\xf1\x3c\xbf\x72\x25\x59\x13\x85\x9d\x3c\x9e\x42\xa4\x7f\x62\x0c\x67\x70\xd4\xbf\x61\x5b\x43\xc0\xfd\xd5\x3e\x9e\x3f\x70\x12\x07\x02\x6e\x72\x7b\xaa\x45\xa1\x56\xc3\x0e\x9c\x5a\x36\xcf\xd3\xaf\xae\x29\xdc\xf5\xb0\xe5\x03\x16\x12\x93\x7e\xda\xb4\xfe\x34\xd1\x3d\xdb\x36\x8e\x39\x06\x14\x50\x0c\x6a\x2c\xc9\x42\xc1\x23\xeb\x50\xb1\x96\x90\xac\x05\x24\xac\x0a\x0a\xb6\x24\x0c\x05\xd5\x10\xe0\xf9\x75\xaa\x5f\x08\xe8\x35\xf2\x0f\x3c\x0a\x16\xb4\x06\x9a\x02\xe4\x58\x4b\x0b\x1f\xc0\xa3\x60\x4e\x4a\x83\xb9\x9f\x7c\x42\x8e\x9d\x0a\x8d\x98\xef\xe9\x5f\xd7\x44\xe5\x98\x9e\x5f\x14\x08\x44\x03\xd4\x3b\xa5\xcc\x31\x4c\x8e\x91\xd7\x9c\xc5\x67\xa0\x86\xfd\x7e\x89\xbc\x43\x7e\x68\xac\x20\xed\xbc\x02\x27\x96\x91\xd7\xc9\x51\x84\x60\x21\x0c\x6e\x5a\x03\x35\x58\x90\xca\x31\x11\x51\x7e\x4b\x49\xd7\xe3\x15\xe7\xbc\x1a\xf7\xf0\xfc\x36\xfa\x61\xe6\xb0\x15\x2d\x87\x80\x16\x0b\xa7\x43\x49\xd6\x7e\x9c\x89\xd4\xb3\x14\x66\x55\xe2\xc2\x82\xa1\x1b\x50\x52\x24\x77\x08\x5a\x6b\xfb\x6a\xd2\x10\x32\xce\xc3\x90\x36\x8f\x49\xa0\x64\x25\xaa\x1a\x9a\xaa\xc3\x73\x2b\xc4\x1e\x4d\x36\x31\xf9\x28\x6a\x3f\x79\x79\x02\x86\x75\xd6\x44\x9f\xdd\xb4\x09\xfb\xa7\x62\x58\x9f\x1a\x44\x6e\xc3\x12\x9c\xfa\xdd\xfc\xab\x57\x0f\xe0\x6e\x92\xe7\x95\x91\x7f\xc3\x60\x78\xf8\x02\xb9\x7f\xed\xd0\xed\x0d\x0e\xf5\x15\x8c\x73\x58\xfc\x5d\x29\xb5\xc7\x54\xff\x05\xbb\x27\xe0\x27\x22\x6d\xd4\xf2\x52\xe6\x30\x26\xcf\x7e\x55\xbb\x17\x0e\x30\x01\x33\x79\xf2\xf9\xce\x39\x64\x57\x00\x2a\x0d\x4f\x47\xc9\xb3\x18\x7e\x5d\x76\x46\x22\xb7\x61\x7c\x70\xa0\xf4\xc8\x9a\xe7\x87\x46\xfb\x94\xc0\xa9\xd0\x93\x0a\x71\x73\xc4\xe1\x79\x13\x4a\xc9\xe5\x15\x7e\xa5\x71\x2a\x36\x30\x19\x5f\x11\x50\x66\xd5\xe1\x8a\x73\x78\x7b\x1a\xba\x83\xf9\x08\x84\x80\x0a\x34\x6b\x55\x61\x04\x98\x0a\xe6\x5a\x5a\x06\x36\x20\x97\x9b\x3a\x15\x21\x96\xd1\x2f\x92\x08\x23\xc8\x5a\x12\xaa\x8a\x15\xdd\xa0\x99\xae\xd3\xb1\xcd\x74\x1f\x1d\xfe\x7c\x2d\x47\x52\x54\x3d\x01\xcb\x43\x10\x29\x38\xa6\xfc\x68\x0a\x11\xcd\x92\xe0\x79\x87\x98\x0b\xc8\xce\x0f\xe1\x4c\x97\x08\x27\xa5\xca\xcf\x92\x6b\xcb\x70\x45\xe7\x07\xa9\x32\x78\x71\x0f\x04\xba\x15\x7e\x5b\x8b\x6b\x61\xfc\x6b\x4c\x1d\x18\x1a\x20\xdd\xe4\x43\xe9\x1a\x78\xe3\xd4\xd4\x35\x98\xbf\x22\x80\xc9\xd6\x1e\xb4\x03\xbf\xe5\xaf\xc1\x01\x9a\xca\x8c\x4b\x99\xa1\x4d\xe4\x8f\x1f\x5a\x4e\x74\xa8\xac\xeb\x79\xbe\x29\x43\x0d\x7c\x43\xfe\xfb\xb7\x9e\x23\xcc\x47\x98\xec\x24\x5d\xa9\x7f\xd9\xc9\xad\x18\x43\x8a\x8a\x54\xe0\xe8\x2a\xb2\xf5\x53\x8c\xe1\x65\x8f\x58\x38\xe9\x19\x78\xd9\xa7\xe4\xe2\xb2\x24\x1c\xf7\xb5\x14\x90\xba\x01\x79\x41\xc2\x9b\xe0\x8d\xb8\x8d\xc7\xd7\xdc\x17\xf8\x3b\xb9\xcc\x82\x43\x13\x4a\xf7\x48\xf8\x8e\xef\x03\xef\xc5\x52\xa7\xeb\x24\x05\xe3\x1e\xc3\xf3\xc6\x7f\xdc\x4e\xff\x01\xa9\xbb\xc3\xca\xd9\x25\xa0\x0a\x0c\xb5\x2a\xec\x12\x16\x64\xc1\x48\x5b\x20\x16\xdc\xd6\xbb\xa2\x0a\xa6\xbc\x23\x31\x0b\x2d\xfd\x94\xb8\x7f\x56\xff\xf5\xfc\xb4\xea\xd8\x83\x7a\xe0\xf6\xaf\x4a\x4f\xb4\x9c\x34\x2d\xee\x2b\x09\x07\x70\x74\x14\x9a\x07\x5b\x20\xe4\xdc\x67\x47\xfe\x94\x89\xb7\x34\xf4\xa4\x59\xba\x20\x24\x38\xf5\xb3\x23\x4d\x59\xd0\x77\x94\xfa\x99\xe3\x18\x7f\x49\x3a\xeb\x60\xcb\x69\x33\x46\x7c\x47\x6e\xe7\x30\x0e\x10\x3e\x0a\xf7\x16\x3b\xc9\xb2\xf9\xa7\x25\xb2\xdb\x6d\xe6\x5b\x93\x9a\xec\xdd\x07\x5b\x71\x2a\xd0\xc3\x3e\x52\xdd\x6c\x0e\xb9\x25\xed\x6d\x18\xb6\x98\x00\xc5\xc2\x27\xf6\x01\xcc\x11\x50\x02\x7a\x83\x11\x60\x1a\xe8\x00\x8b\xc0\x75\x56\x67\x15\xd4\x0c\x19\x9a\x51\x19\x04\xa1\xfc\x73\xf7\x8b\xd7\x40\x84\x25\x2b\x92\xe8\xb9\x69\xb4\x62\xb1\x64\xac\xc4\x4d\x96\x8c\xcd\xc8\xa3\xb9\x7f\x0c\x39\xb2\x66\x40\x06\xca\x9a\x21\xa8\x4a\x4f\x5b\x5e\xd2\x10\xd4\xf3\x0d\xf0\xf7\x43\xd1\xcb\x9d\xb0\x05\xe7\x95\xc2\xf1\xf3\xa8\x97\xc9\xa6\x16\xd8\x3e\xc5\xdf\x14\x20\x77\x6c\xdc\x68\x4a\x0e\x4e\xf9\xa1\x1f\x9c\x49\x3e\x81\x7e\x72\x07\xf5\x79\x53\xa0\x03\x72\x18\x4b\xe4\xbb\x8e\x29\xc7\xd1\x28\xae\x4e\xe1\xfd\xb8\x79\x3b\xda\x4d\x1e\xb4\xbd\x44\x1e\xdc\x8e\xf6\xd6\xe2\xd5\xbc\xb4\x71\x38\x3d\xaf\x8c\x3f\xab\x85\x87\x5b\xe4\x8f\xfe\xbc\x07\x40\x52\xbe\x06\x47\xfc\x87\xde\x81\x40\xd4\x8f\x5f\x30\xc3\xf7\x15\x67\x4f\x29\xa5\xb4\xf7\x0a\x8c\xc9\x06\xee\xa9\xda\xd5\x70\x9e\x15\xd8\x6e\xb9\xbd\xa3\x93\xbc\xef\x8a\x1d\x2a\x10\x77\x91\x3b\x30\x86\x1d\xbb\xf6\x64\x6e\xdb\x07\x17\xe0\xd1\x7e\x69\x69\xd7\xbb\x98\xb5\xd5\x76\xe2\x65\x64\x96\xab\x90\x8f\xe4\x4a\xc4\xce\x2b\xf0\xd9\x52\x32\x6b\xfb\x6e\xda\xc5\x9f\xfd\x66\xcb\x5e\x78\xbd\x52\x46\x1a\x25\xf8\x71\x89\xb3\xbe\x18\x5e\xcf\x13\xc8\xa5\x35\x54\xd9\xf3\xd9\xf5\xf4\x79\xc1\xdd\xaa\x5f\xe0\xa5\xcc\x51\x50\x0a\xaa\x2c\x36\xd8\x0a\xe6\xa4\x73\x27\x34\x34\x5a\x46\x92\x4b\xd6\xce\x4f\x9f\x10\xc7\x4c\xc1\x9b\x30\x5d\x33\x6c\xe9\xc4\x09\x7b\xf2\xe6\xf9\x49\x33\xae\x5b\x59\xf3\xbc\x35\xa0\xff\x21\x6b\x2e\x85\x26\xb2\x75\x8a\x1b\x8f\x07\xf0\x61\xea\x15\x72\x3b\x6c\x4b\x19\xf3\xc9\x69\xa5\x1b\x70\x01\x9c\xed\xc0\xf3\x4f\xe3\x43\xa9\x0a\xd8\x46\x6e\x37\xd3\xe6\x7c\xbe\xb5\x95\x6e\x68\x0a\x90\x75\x38\x0a\xe7\x4d\xe9\xe2\x4d\x69\x87\x46\xcc\xc3\x0d\xf6\xd2\x54\xc5\xb9\x9c\x59\x6b\xe6\xcc\x3c\xb7\xdf\xda\x63\x8e\xe2\xa5\xa4\x56\x7a\xc8\xd7\xe2\x26\x2b\x03\xb4\x74\x1c\x63\x72\x4b\x4a\x22\xeb\x30\x5e\x06\x9f\xe2\x37\x12\x3b\x1f\xa5\x4e\x36\xad\x6e\x86\x1b\xcf\x7e\x79\x1c\x63\xd8\x49\x7d\x09\x3b\x1a\x02\xee\xf9\x3c\x3f\xd3\xca\x99\xab\x53\xf3\x5d\x31\xaa\x15\xce\xc3\xa9\x35\xf9\xe3\x4b\x2a\xf8\x4e\xb1\xeb\xde\xdf\xc9\x9a\x00\x38\xba\x53\xdd\x97\x33\x43\x98\xe3\x40\x02\x01\x50\x0a\x7a\x5b\x5d\xc2\xd3\xc0\xc5\x60\x2e\x58\x6e\xad\x05\x61\x8f\x20\x39\xb1\x47\xc6\x11\xd5\xd0\xe3\x82\xd3\xd0\x55\xc6\x23\x21\xac\xa8\x31\xc9\xea\x21\xd4\x44\x2c\xc9\x5a\xd2\x24\x8d\x0a\x4a\x37\x21\xa0\x20\x34\xe3\xab\x93\xf1\x68\x86\x9e\x50\xa3\xd8\x74\x98\xa4\x1e\x57\x95\x68\x08\x4a\x48\x52\xf4\x64\xba\x6a\xa8\x9b\x78\x32\xdd\x6d\x96\xb4\x56\x50\x70\x54\x2d\x87\x1e\xc9\x6d\xad\xf7\x46\xca\x05\xfa\xcf\xfc\x9f\x37\x6f\x9e\x33\x90\x3f\x3b\xd0\xfd\xf0\x3d\xf7\x3c\xcc\xc4\xf2\x22\xad\x5c\x20\x15\x1f\xc9\xf7\xe7\xff\x38\x64\xc9\xc3\xfd\xc9\x9f\x47\xf7\xd9\xd0\x3e\xa4\xa9\xff\xf8\x25\x1c\x26\xed\xb0\x4f\xff\x29\xe3\xfa\x67\x31\xfc\x63\xfe\x8e\x48\x47\xf1\x25\xfe\x3c\x9e\x86\x98\xef\xdf\x6b\x44\x46\x41\x75\xbb\x2d\xc6\x4f\xe1\xf3\xae\x27\x35\x58\xe2\xf2\x04\x81\x83\xef\x46\x4b\xcf\x0e\x8f\x09\xf4\xdd\x26\x70\x7f\xe9\x18\x39\xd6\x9f\x7c\xfb\xed\x85\x13\x38\xf7\x9f\xf1\x31\x38\x0a\x96\x1d\xc3\x3b\x6b\xf9\x3c\xbd\xa5\xbf\xf1\x9f\xf2\x85\xd9\xc3\xc8\x3f\x97\xe0\xfd\x57\x9c\x84\xf7\xdc\xe7\x76\x8e\xc9\xe3\x71\x86\x6b\x08\xbf\x21\xf5\x15\x69\x5a\xe7\xc6\xff\xf2\x76\x46\x7f\x08\xe3\x5c\xef\xd3\xb1\xf6\x28\xbf\xfa\xda\x9b\x1f\x7b\x6c\xee\xe4\xbc\x21\xfe\xf1\x1b\x5e\x39\x9c\xf7\xcd\xe7\xb5\x38\xd9\x3f\x35\x5c\x88\x87\xbc\x6e\xd0\x53\x93\x63\x6e\x64\xde\x05\x7e\x90\x0f\x2a\xc0\x60\x30\x1a\x4c\x3f\x57\x3f\x4a\xaf\x02\xa5\x53\x19\xa8\x81\x3f\xe6\x32\x4f\x35\x4c\x97\x83\xac\x0a\x92\x56\x1e\x84\xaa\x82\x4d\xee\x24\x24\x23\x3d\x0c\xdf\xb4\x7b\x23\x12\x16\x8d\x04\xfc\xdd\x88\x62\x9b\x0b\xc5\x96\x7c\xf2\x78\xef\x85\x27\x63\x99\xc7\x53\x95\x70\x8a\x44\xce\x60\x18\x25\x9b\xe0\x17\xa3\x22\x0d\xb0\xad\x7f\xd9\xee\x86\xf1\x87\x96\xae\x7b\x6a\xdd\xbe\x16\x9e\xe3\x67\x53\xab\x5a\xc8\x1d\x23\xdb\xba\x01\xef\xe7\x61\x0d\xbc\xa9\x1e\x9f\x5d\x7b\x7e\xc8\x48\x95\x9b\x21\x83\x7a\xbd\x8c\x79\xf7\xc0\xe4\x39\x64\x6f\x93\x3b\x40\x16\x9c\xc0\x18\xb6\x72\xdb\xbc\xf7\x63\xb4\xf7\x39\x38\xf3\x04\x99\xd5\xd0\x36\x69\x74\xe9\xd6\x3e\x52\x5b\x29\xe6\x5b\xc8\x77\x3c\x0f\xdd\x4b\xe7\x3e\x4e\x36\x8f\x75\x93\xf7\xf9\x28\xcc\xe3\x61\xd3\xc8\x26\xf2\xfe\x2f\x42\x00\x8e\x9a\x96\x6a\xf2\x9d\x19\x28\xc9\x1c\x03\xd9\x20\x0c\x0c\x30\xd0\x5a\x57\x9f\x0e\x3a\xc0\x92\x73\x56\xea\xb6\xc9\x52\x44\xb5\x98\x47\x8f\x9d\xea\x4c\x79\x10\x9a\x96\x0a\x25\xd3\x14\xcb\x0d\x55\x4f\x1a\x9a\x9c\x14\x9c\xb1\xb8\x1a\xb6\x21\x68\xda\xaa\x55\x4c\x4a\x37\x4d\xc5\x64\xd1\x46\x59\x9d\x1f\xb2\x65\x91\x7a\xe2\x9c\x95\x5a\x3d\x78\x56\x3b\x64\x5c\x4f\x42\xab\xd0\xa9\x1a\x11\x43\x8e\x94\x2f\xa7\x37\x72\x8f\x3d\x3c\x2f\xd5\xf5\x51\xc0\x4f\x7a\xb9\xef\xd9\xbc\xf9\x1e\xc6\x65\xb8\xe7\x71\xd1\xb3\x3f\xc0\x3e\x93\x5a\x2e\xec\x73\x55\x50\xe5\xef\xd9\x40\x5e\x73\xde\x45\xde\xbb\x3c\x0a\x1f\xbc\xab\x7e\x0a\x39\x3d\x3b\x0f\xf3\x51\x58\xd4\xff\xe1\x9d\x8f\xdd\x42\xbd\xc5\xe5\xb2\x43\xf8\x92\xc9\x5d\x6f\x67\x8d\xc5\xe3\xb2\x8a\x0a\xf9\x76\x78\x29\xce\xbb\xc0\xd3\xdf\x4f\x3d\x90\xe7\x3f\xf3\xf7\x3c\x1e\x53\x38\x9c\x4f\xcd\x9f\xca\x1c\xe3\xff\xfa\x4f\xf2\x97\x67\xc9\x3f\x52\x5c\x6e\xae\x1b\x3f\x8c\x0e\xc1\x59\x30\xf1\x36\x7e\x18\xd5\x18\x38\xf7\xe2\x91\xa9\xe3\x23\xc9\xaa\xb5\x52\xed\x5c\x6c\xf8\x97\xac\x86\x53\xe1\x0b\x57\xb2\x59\x64\xc3\x8d\xf0\x96\x52\x9e\x27\x2f\xae\xbc\xf1\xaa\x68\xe7\x0a\x0c\x3f\x1a\xf4\x2d\xf9\x88\xfc\x0b\x52\xc1\xaf\xd5\xa5\xfb\xd7\x9e\x2c\xed\xfe\xfb\x84\x09\xed\x23\x6b\x1a\xb2\x97\x17\x84\xf9\xeb\x3c\xac\x37\xb5\x27\x2f\x1a\xc8\x47\xb1\x18\xc8\x00\xa0\x7b\x11\x22\xcc\x7b\x20\x04\xf2\x7b\xea\x9d\xcd\x60\x22\xb8\x18\x2c\xb6\x2c\x56\x70\x62\x4f\x3a\xf0\xea\x4e\x35\xae\xfc\x48\xe4\x73\x7b\xac\x56\x8b\x94\x1b\x7a\x22\xa2\xc8\x11\x53\xde\x3d\x16\x9b\x5e\x54\x57\xad\x55\xce\xf3\x1b\x1d\x3d\xb2\x12\x8d\x45\xca\x7f\x93\xc0\xff\x22\x1e\xdb\xfe\x00\x1f\x3b\xf8\x00\x9c\x9c\xaa\x3e\x5e\x36\x60\x11\x59\x5f\x7b\x30\x55\x0d\x67\x58\x65\x93\x3b\xe1\xb7\x95\x61\x38\xf2\xbf\xf9\x64\xfd\x0f\x53\xe0\xe4\x64\xd6\xb6\x2f\x46\xf2\x3c\x6f\x8b\xe3\x91\xfc\x6d\xfc\xea\xb3\x53\x42\xc3\xe7\xc9\xfd\x6a\x87\xd0\x95\x5c\x9f\x4c\xac\x76\x9d\x82\x0f\x97\x92\x3e\x7c\xe0\x39\xd3\x9a\x13\x96\x35\xef\x2f\xb3\xbd\x70\xde\x5e\x29\xf3\x1e\x59\x40\x4e\xb5\x8c\x27\x1f\x90\x4d\x08\x9d\x88\x42\x47\x55\x93\x42\x66\x1f\x47\x08\xb6\xef\xda\xe3\xd8\xb6\x0f\xb6\x1f\x23\xb3\x8c\xee\xda\x1f\x3a\x14\x8e\x1b\x49\xce\xf0\x3c\xe4\x3a\x66\x3c\x48\xbe\x69\x94\x3a\x0e\xe2\x0b\xc8\x5f\x7a\x8a\x26\x27\x2e\x5d\x74\x2c\x8f\xbc\xca\x2b\xb0\x77\xea\x2f\x86\xff\x9c\x8d\xbb\x7f\xda\x04\x56\x0f\x49\xf7\x32\x66\x03\x73\xd8\x62\x01\xa3\x7b\x3a\x1d\x18\x09\xc6\x15\x35\x9a\x05\xdd\x21\x98\x34\x64\xab\xe7\xbb\xa7\xb0\xe7\xd1\xe4\x74\x6b\xb6\x62\xc6\x6a\xd5\x8d\xe3\x4a\x5c\xd5\x64\xdd\xf4\x86\xa8\x1a\xd7\x9d\xb1\x5f\x33\xfc\xb0\x05\x79\xc5\xf3\xea\xa1\xda\xb9\x01\xcf\xd5\xfc\x84\x04\xd5\x40\xbd\x4e\xb6\x1f\xf6\xf7\xf9\xc7\x60\xee\x19\xb1\xd9\xb3\x61\xd3\xc8\x81\xe4\xed\x96\xd9\xa9\x3f\xc0\x51\x2f\xc5\xfa\x54\x7f\x50\x8f\xff\x2e\x46\x56\xc9\x78\x47\xdf\x19\x81\xa1\x79\x78\x6a\x04\x8f\x59\xa2\xc3\x22\x5b\xe9\x40\x1f\xb9\x2f\x20\x98\xf4\xbd\x79\x42\xea\x11\x9f\x8f\xbc\x83\x7d\x9d\xae\x41\xbd\x46\x15\x26\xb9\x36\xea\x12\x3c\x90\xbc\x34\x76\x45\x6a\x95\xcf\x17\xf1\x51\x23\x29\x81\x39\x0c\x11\xd9\xf2\x09\xda\x31\xe1\xb1\x04\xba\x8e\xff\x32\x36\xb6\x6d\x65\x2f\xf2\xdd\x14\x37\x86\xcd\x87\xf1\xbb\x03\x77\x35\x54\x87\x8b\x71\x42\x1c\xbd\x35\x96\x17\xc1\x09\x8c\xf0\x86\xc9\x97\xc1\x8c\x49\x7d\x7c\x6e\x72\xcb\x40\x8c\x8a\xe1\x28\x3c\xdf\x87\x89\x8f\x3b\x44\xb2\x3b\xa5\xba\xea\x81\x39\xe4\x87\x09\x37\xab\xe4\xa3\x36\xbf\x5f\xf4\xa1\x08\xbc\xab\x2c\x2d\x57\x54\xcd\xbc\xfd\xe3\x0a\xff\xe8\x34\x57\x54\x15\xc1\x23\x0b\x86\x6c\x35\x1a\xc6\xf5\xf3\x88\xa2\x49\xc7\x31\xfc\xa5\xf4\xa4\x9e\x82\xe0\xef\x73\x48\x66\x27\xb9\xfb\xf3\xfe\xa8\x99\xf7\x8f\x1f\x8f\xa3\x78\x24\x0c\xa5\xea\x60\xf8\xf3\xcf\x47\x7e\x4b\xfe\xc8\xbc\xd3\xe4\x27\x37\x07\x5d\xf5\x51\x03\x4e\x9f\xd2\x75\x17\xba\xca\x6f\x6e\x6f\x0e\x0d\x9f\xeb\xe9\x57\x3b\x84\x0a\xf6\xcf\x50\x53\x15\x16\x8f\xde\x57\xca\xbc\x8d\xc9\xdd\x9f\x93\x12\x67\x31\x5c\xc5\x47\xc9\xa2\xfe\x06\xb9\xc4\x15\x83\xd5\xa5\xe4\x08\xd9\x8f\x10\x4c\x40\xd7\x3d\x78\x03\xfc\xfb\xe7\x70\x7a\xff\x80\x9b\x5c\x39\x04\xa3\x12\x38\x0d\xff\x23\x7a\x93\xb9\x45\xbe\xe7\x3b\xc4\xa1\x79\xe3\x4b\xba\x5e\x30\x2d\xcc\x1d\xc0\xd1\x24\xb6\x30\xfe\x7c\x5c\xc0\xbc\x0b\x5a\xc0\x45\xe7\xd0\xd4\xcf\x20\xbe\xc9\x88\xd2\xcd\xa4\x0a\x76\x46\xb4\xb0\x10\x57\x0d\xe1\xd7\x68\xb8\x5c\xc6\x56\xe6\x49\x57\xd0\xc3\x62\xd2\x3c\xdf\x3a\x12\xb6\xc5\xf5\x5c\x35\xa6\x9f\x4f\xb3\xcf\x83\xb9\xd4\xce\xc3\x93\x8e\x4f\xf2\x0f\xf6\x1f\xef\xd5\xcb\x8f\x93\x68\x1c\x1c\x33\x18\x8e\xbe\x93\x7b\xf0\x38\xb5\x93\x3c\x7c\x21\xbc\x70\x92\x7f\x90\x9f\x6c\x16\xae\x5a\x4f\x36\x8c\x19\xf7\xd9\xf5\xe8\xb3\xa1\x83\xe1\xda\x81\x1c\x1a\x4b\xde\x6a\x9f\x48\xee\x9c\x17\x25\xdf\x63\xe8\x22\x9b\x7f\xc8\x19\x7a\x99\xa7\x4f\xcd\x20\xdb\x07\xd6\x46\xef\xc1\xcc\xbb\xf8\x38\x69\xd5\xe1\xac\x13\xd8\xe7\x93\x3e\x26\x37\x65\x66\xe1\xe8\xc2\xfd\x6d\x79\xd7\x7c\xd1\x9b\x38\x60\x6a\xbc\x77\x3a\xbc\xe3\x63\x8c\xc9\x9f\xd8\x43\xfa\x83\x70\x9a\x79\x16\xb9\xf7\xf1\x49\xd3\xff\x46\x2a\x2f\xf6\xaf\x18\x0b\xb7\x8d\x5d\xdf\xbb\x37\x26\xed\x0b\x22\xb0\xea\xe6\xce\x8d\x9e\x07\x0f\xc1\x69\xa9\x38\x77\xb1\xab\xa9\xd7\xd8\x62\xa3\xe7\x33\xed\xa3\x6d\xe8\x3e\xe6\x5d\x10\xb3\xd8\xfa\xa0\x74\xb5\x5d\x82\x62\xd2\xb0\x9d\x13\x90\xac\x25\x0d\x97\x2c\x42\xfd\x5c\x6f\xbf\x6e\x00\xd5\xb2\xa6\x0c\xa8\xa8\x2e\xe3\x17\x65\x1b\x19\xc7\x55\x45\x12\x35\x43\x16\x7f\xc9\x03\x5e\xe9\x06\x6b\xc4\x60\x33\x04\xad\x81\xda\xfc\x6e\xd0\x80\x9b\x94\xfb\xc4\xd5\xdd\xc0\xc4\xa1\xe4\xe4\xe1\x54\xf2\x0d\x72\x5a\x21\xdb\x51\xa5\x09\x38\xbb\x01\x96\x4e\xe4\xc3\x96\xd6\xae\xa5\xe2\xb0\xbc\x09\xa5\x15\x7c\xe7\x32\x2c\xd9\xae\xc3\x6d\xb8\x2c\xda\x09\xa5\x86\x0c\xab\x64\x19\x0d\x50\x6f\x96\x31\xef\xe2\x6e\x40\x4a\xed\x35\x50\x81\x00\x07\xf2\x31\x39\xfd\xe5\x4d\x32\xf9\x2f\x0b\x0f\x43\x80\x31\xb9\xc3\xd3\xb5\xf2\x30\x42\x87\x6d\x13\x9a\x60\x73\x43\x40\x22\x57\x77\xbd\x1e\xa0\xbe\x1d\x03\x5b\x70\x6a\xe9\x7c\xb9\x5f\x5d\x53\x98\xdc\xea\xe7\xfd\xef\x63\xb2\x25\x2f\x0a\xdb\x52\xa5\xe7\x15\x2a\xcf\xd5\x80\xed\x5d\xcc\x61\x70\x01\x98\x01\x2e\x01\x0b\xc0\x55\x60\x1d\xd8\x04\x80\xa0\x47\x24\xec\xd2\x64\xdd\x66\xad\xed\x4a\x2e\xcd\x23\x59\x7f\x49\x50\xb0\xa8\x89\x96\xad\x49\x58\x4e\x6a\x3d\xb2\x34\x77\xd2\xff\x6a\x42\x59\xd0\xca\x37\x36\xac\x2a\x36\x2b\xd9\xa8\xb9\x7a\xd2\xa0\x94\x98\x79\x9d\x35\x82\x61\x33\x64\x2c\x26\x75\x51\x45\x36\x4d\xb6\x29\xff\x7b\x64\xeb\x97\x88\xff\xd5\x33\x03\x7c\x15\x15\x87\x31\xff\x7c\xa5\xaf\xb5\x99\xc7\x7c\x76\xa6\xd1\x82\x4f\x1f\x66\xd6\x93\xdb\x4b\xdb\xd4\x42\xd8\x60\x15\x4e\xd6\xe5\x37\x2f\x1d\x8a\x02\x0d\xd7\x65\x28\xb0\x39\x65\x74\x7e\x17\x55\xf0\xe9\xd6\x54\x12\xb6\x95\x92\x43\x6f\x72\x89\x90\x6d\xfe\x57\x7c\x4b\x5b\x80\xe7\xf3\xfd\x5c\xf3\x5e\x69\x7b\xf3\xde\xa6\xd3\x9f\xcc\xe3\xf8\xdd\xbc\x94\x3a\x61\x11\xdd\xba\x26\xfa\xa1\x9e\xc5\xb8\xd4\x03\x0d\x99\x39\xa9\x5e\x96\xf7\xbf\x59\x46\x0f\x30\xb3\x50\x2f\xa9\xa7\xbc\xfc\x06\xc6\xa7\xc9\xbd\x51\x1e\xe2\x37\x78\xfc\x02\x4b\x0e\x68\x99\x75\x1d\x65\x6b\x14\x32\x93\xce\x3d\x8c\x31\xb9\x5d\x7a\xbf\xf6\x13\xd8\x64\x95\x5f\x6e\xe6\x9e\x37\x06\x85\xc8\x53\x12\xcc\x6f\x92\xf6\x92\x6d\x08\x75\xd2\xce\x40\xf4\xec\xb1\x56\x84\xe0\xac\xdd\xcf\xb0\x4b\x25\x68\x6f\xe9\x62\xe0\x2d\xb5\x9d\xb5\x9f\xf0\xf0\xea\xdd\xd2\x6e\x72\xef\x65\x2e\x38\xf4\xe4\xbb\x64\x4d\x6d\x0a\x49\xd4\x1d\xe9\x32\x95\x69\x3f\xd6\x67\xd7\x93\xe7\x74\x7b\x8e\x4a\x58\x9b\x96\x8e\x17\x32\x77\x31\x47\xad\xff\xb6\x54\x81\x06\x30\x14\x8c\x02\xd3\xd2\x15\x1a\x53\x89\x75\x3f\x29\xb1\xdc\x62\x0f\x58\x72\x85\x4c\x25\x02\x23\x69\x55\xad\xa8\x12\x08\x45\x43\x93\x75\x97\xa1\xa2\x98\x8c\x55\xfd\xbc\x1e\x47\xd9\x26\x27\x75\x1b\x56\x64\x4d\xc6\x51\x35\xf9\xcb\x48\x2b\x90\x2b\x56\xce\x9b\x7b\xcb\xc9\xd6\xc0\x90\x00\x99\xd3\x29\xe5\x29\x18\x1b\xcf\x8e\x3a\x7e\xe6\x5f\x70\x92\x73\xe5\x02\xb1\xa3\xf4\xfa\x65\xdd\xf0\xd9\xed\x01\x4e\xba\x8f\xd9\xf7\x0a\x04\xee\xd5\x9c\x12\x1a\x61\x42\x80\xa6\x86\x6d\x87\x5e\x7f\x40\x41\x79\x18\x77\x0a\xb6\x29\xd4\x93\x0d\x99\x39\x67\x8e\x48\x81\xa8\x9f\xc9\x2e\x63\x8e\x62\xb2\xb2\xd7\xa1\xa6\x6f\x17\x9c\xb6\x88\xef\xbc\x5e\xbb\x78\x6f\x21\x0e\x60\xf2\xe8\xd0\x8f\x31\x86\x93\x1b\xdf\x12\x1a\x02\xb5\x79\x90\x5e\xd8\x4d\xbe\x22\x87\x79\x8c\x21\x93\xfb\xdc\xd3\xb9\xee\xd5\x1c\x4f\xae\xb1\x2a\xf8\xe3\x4b\x3e\x21\xef\x1e\xf8\x9b\x08\x7d\xee\xce\xe8\xee\xc0\xa3\xc4\xa8\x38\x2f\xd1\x9b\x31\xe4\x32\x44\x31\xc7\x40\x21\xd0\x2c\xb9\x8d\x02\x40\x64\x22\x86\xac\xa5\xe5\x66\x9c\x93\x1b\xb6\x99\xe4\x35\x61\x9c\x57\xc1\xa4\x54\xa8\x6b\x50\x34\x64\x51\x55\xd2\x3d\x2a\xfa\xef\xa7\xa3\x6d\xd0\x4d\xf5\x3f\x70\xb3\x44\x16\xac\x9e\xb7\xb2\x01\xd6\x5a\xb2\x9a\x0d\x4f\x70\x81\x56\xbc\x1b\xfa\x53\x55\x30\x7a\x62\xe9\x1d\x49\xf2\x34\x86\xcf\xee\xee\x5f\xf7\xd4\x69\x64\x60\x6e\x17\x8f\xc3\x16\x52\x32\x81\x7e\x86\x9a\xd2\x2c\x30\xf4\x5a\x19\x73\x0c\x63\x8c\xc9\xe2\xd0\xbf\x1b\xba\xaa\x60\xad\x25\x9c\xd9\x1e\x32\xf5\xdf\x7c\xf4\x78\xf6\xfd\x1d\xe4\x4d\xf2\x3e\xc6\xb0\x17\xf4\x6f\x6c\x82\xb1\x22\xd8\x1f\x93\xef\xc8\xe3\xd1\x28\x1c\x72\xf2\x76\x1e\xef\x72\x63\x72\x45\x8f\x6c\xba\x9e\x39\x1f\xe5\xa7\xeb\x9f\x0b\x98\xef\x99\x23\x16\x17\x1d\x00\xc6\xa4\x2d\x28\x0b\x4a\xb2\xeb\x27\x13\x82\xaa\x0e\x75\xac\x98\xce\xaf\xc5\x2c\x69\xc8\x62\x5c\x8d\xc9\x9a\xa8\xa6\x53\x35\x56\xfe\xe7\xf4\x7c\x31\x99\x9b\xb9\xb2\xe3\xf1\x9b\x0e\x58\xf5\x94\x39\xc4\x2e\xc1\xd2\x03\x58\xc2\x07\x36\x6e\x84\x08\x4e\x39\x73\x2b\x9c\x89\x9f\xba\x52\x86\x79\x51\x7c\x60\xdd\xc1\x2f\xc9\x26\x6a\xe7\x3c\x05\xaf\xfe\x58\x12\xeb\xa3\xc6\xb2\x1e\xfe\x63\xbb\xa4\xc1\x11\x3f\x73\xa3\x29\x16\xe6\xb2\x32\xe6\x08\x26\x8b\x06\x3c\xc5\x37\x40\xff\xea\x03\x96\x50\x2e\x2d\x48\x15\xba\x31\x7c\x0a\xaf\xe4\xc9\xe1\xdb\xbb\xc9\x2d\x18\xc3\x0e\x0c\xdd\x03\xc3\xbb\xdc\x30\xb9\xee\x04\x9c\xf9\x85\x82\x4f\x34\x61\x5c\x4a\xbe\x3a\x27\x92\x17\xce\x33\x90\x74\xef\x46\x2f\xc6\xf3\x3b\xbd\x1b\xc6\xef\xf4\x6e\xc8\xe7\xf5\x6e\x88\x3d\xbd\x1b\xcc\xff\x7d\xef\xc6\xbd\xd4\xe5\x8f\xc1\x1c\x68\xa4\xae\xfd\xa8\x8c\xbd\xa5\x66\x07\x77\xd4\x9d\x99\xbb\xd8\x2d\x08\x61\x47\x7b\xe9\x1d\xc9\xa3\xa9\xb5\x70\x20\x64\x9f\xa0\xd6\xf5\xcb\xde\xf1\x59\xce\xa0\x8d\x3b\x46\x91\x67\xca\xb6\x0e\x6f\x2d\xc8\xe6\x10\x2a\xe8\xc8\x1d\xbe\xf5\x5e\xa1\x7f\xee\x88\xfc\x72\xb6\xb5\xa6\x77\x76\xea\xba\x42\x8e\xcd\xcd\xa6\x16\x15\xd8\x86\x19\xde\xd4\x75\x11\x87\x37\x37\x9b\x5a\x98\xcf\x78\xd0\x13\x5d\x87\xc8\xcb\x08\xfd\xfb\x8f\xa3\x11\x9b\x5d\x56\x36\xd1\x3b\x13\x8d\xde\x71\x02\x21\x38\xce\x96\xf9\x44\x8d\x57\xd8\x93\x1a\x83\x20\x80\xcf\xef\x40\x9f\x96\xa6\xce\xde\x7d\xe7\xc4\x82\x55\x4f\x14\x20\x8a\x49\x1d\x6e\x73\x57\x1b\xfd\x02\xa9\x27\x7a\x8b\xde\x58\x80\x62\x42\x65\x2c\x5b\x14\x40\x5e\xaf\x28\x33\xa1\x32\x74\xae\x6f\xac\x83\xfe\x82\x11\x7f\xab\x6f\xa3\xfc\xbc\xbe\x0d\xf7\xb9\xbe\x8d\x12\xd8\x53\x44\xfe\xdf\xe8\xdb\x60\x7e\xde\xb7\x51\x6e\x11\xf5\x88\xf2\xbf\xea\xdb\xa0\x8e\x9c\x1d\xe9\xbd\x97\x6b\x1f\x93\xf3\xf4\xe4\x1b\x53\x1a\x64\xdd\x9f\x22\x08\xc8\x29\xb8\xdc\x05\x65\x18\xba\xb2\xf1\xbe\xe1\x1d\x10\x20\x54\x76\x7b\xbf\xe5\x1c\x62\xaf\xa3\xb2\x06\x8d\x41\x6c\xbf\x2e\x7f\xa0\x71\x86\xd8\x3b\xd9\xef\xe0\xba\x3d\xa7\x4a\x5d\xe4\xd0\x87\x22\xcc\xdf\x8c\x96\x93\x57\x71\x36\xf5\xda\x20\x52\x91\x2a\x0a\x71\x6c\xcc\x4b\xfd\x00\x17\x32\xe2\x33\x03\x06\xbf\xde\x8f\xdb\xdc\x77\x62\x6a\x4c\x2e\x64\xa0\xbc\xcf\x73\x23\x42\x9b\x0f\x42\xe1\x34\x79\xc3\x75\xb0\xf7\x8a\x02\xb9\xa5\x00\x21\xd7\xf2\x5b\x58\xf6\xde\xdb\x47\xde\x7a\x67\x33\xcb\x0e\xef\x48\xfe\xc0\xb5\x0a\xfd\x73\x87\xe7\xdd\x41\xde\x58\xb7\xa8\xb2\xb8\xdf\xd1\x89\xa5\x2c\x39\x9b\x0d\x19\x66\xdc\xad\x64\x16\x4d\x65\xfa\x02\x36\x14\x82\x33\xf2\x7f\xec\xd7\xe8\xc7\x78\x7f\xab\x5f\x23\x6e\x35\xbd\xff\xdf\xf5\x6b\x84\x20\x56\x7f\xfe\x8f\xa5\xdf\xea\xd7\x58\x32\x6c\x01\xbc\x89\xbc\x7d\xc4\x9b\xa8\xfa\x7a\x5a\x00\x46\x67\x5e\x35\x68\x11\x2c\x22\xc3\xd6\x55\xb2\xe4\x89\xb9\xc1\x4c\xd8\xda\x4a\xbd\x52\x2f\x93\x57\xbc\x59\x46\x4e\x31\x2c\xba\x20\xf5\x8e\x2b\xd8\x78\x6c\xa2\x1c\xcd\xac\x82\x45\xde\xda\x0d\x77\xdf\x7d\xc3\x50\x67\x1f\x65\x88\x5a\x9a\x79\x21\xb5\xaf\xca\x1e\x26\x03\xe7\x0d\x66\x9f\x99\x8f\xf7\xb6\x54\x55\x4c\x87\xaf\xe6\x33\xde\x5e\x98\xbc\xf3\x19\x22\xaf\xcd\x5e\xa0\x90\xe6\x56\xb6\x63\x11\x79\x07\x07\xe0\x8c\xd1\x6f\x51\x99\x0b\xe5\xb6\x6c\x27\xd9\x5b\x8f\x50\x1e\x2c\x62\x1a\x82\x0c\x79\x77\xf6\x0c\xe5\xca\x65\xd3\xb6\xc3\xbf\xb6\x66\x1e\x3b\xfd\xdd\x77\xe8\xe3\x8f\xa7\x8a\x15\x89\x7a\x7f\xaa\xac\x58\x0e\xe6\x74\x0c\x96\x8b\x99\x73\xb1\x6e\x1a\x33\x91\x71\xff\x6e\xaf\xc6\x8f\xf6\x27\x24\xab\x61\xf9\xef\xf4\x6a\xa8\xe7\x7a\x35\xf0\xff\xa2\x57\x83\xfa\x12\x5e\xdc\x5a\x4a\xb6\x4e\xdf\x97\xba\x0b\xba\xdd\x9f\x61\x48\x91\xaf\xe0\x75\x63\x56\x46\x63\x9f\xc7\x32\xc7\x2d\x5c\xbc\x24\x14\x42\xd9\x63\xd6\x3e\x00\x77\xfd\x73\xd6\x8a\x6b\xa9\xfd\x65\x15\xae\xef\xe7\x90\x57\x52\x57\x8b\xde\x9c\x6c\xea\x3e\x38\xa7\x73\xe6\xd9\xc5\x3d\xff\x8d\x62\xdc\xe4\x8f\x37\xee\x20\x8e\x2b\x83\x08\xe6\xbc\x20\xdf\x84\xd0\x03\x6f\x40\xdf\xf7\x64\x5f\x0d\x14\xd7\xc7\x5c\x28\x7b\x09\xf9\x88\xe6\x5d\x64\x86\x0c\x67\x97\x91\x97\x6f\xa0\xa8\x11\x70\xfa\xe2\xe0\xc3\x45\x1f\x1e\x22\x53\xf6\x5c\x88\xb3\xc5\x6c\x14\x3a\xf4\x20\x74\xa1\x17\x26\xb2\x53\x9d\x8d\xb1\xe1\xf9\xe7\xfc\x73\x2e\xfd\x26\xe3\xfa\x3f\xef\xd3\x88\xeb\xc6\xff\x9f\x7d\x1a\x55\x2e\xd7\x87\x64\xf7\x4c\x2f\xbc\xea\x71\x8e\x63\xff\x48\xde\xf5\x4f\x9a\x09\x2f\xfa\x80\x75\x9d\xdd\x0d\x13\xff\xfd\x2f\xd9\x4f\xff\x81\xcb\xc9\xf6\x66\x55\xe6\x94\x72\xde\xd4\xc9\x77\x22\x59\xe4\xdb\x51\x2c\x62\x27\xc2\x6f\xb2\xbd\x5c\x36\x42\x2e\xd4\xb5\xc9\xdf\x30\x53\xac\x36\xfa\xc2\x62\xd8\x14\x42\x64\x3b\xca\xa6\x42\x62\x8e\x77\x87\x3f\x4b\x2c\x25\xdf\x76\xbd\x68\xca\x99\x6e\x08\x65\x33\x2e\x17\x79\x57\xfc\x70\x06\xb9\x8f\x7d\x94\x0c\xe3\xee\x19\x44\x1e\x6f\x3b\xe2\x22\xef\x0a\x0c\xac\xce\xbc\x67\x53\xc6\x6d\x4f\xc0\xaa\x9a\xac\x08\xd9\x9f\xdb\x17\xa1\x7c\x16\xf6\x0a\x31\x0b\x43\x68\xd4\x5e\x96\x7d\xb9\x9d\xfc\x27\xa3\x88\xcc\x61\x91\xf8\xa7\xb7\x73\x32\x73\xb6\xb2\x53\x9c\x0d\xb9\xc3\xf2\x9e\x08\x21\xf2\x96\x17\x16\xb7\x7b\x33\x51\x0e\x5a\xe3\xf0\x93\xe7\x62\x38\x5b\x94\x51\x0e\x82\xc5\x99\xde\x34\x3e\xa7\x37\x32\xc2\x6f\xf6\x68\xa8\xbf\xd9\xa3\x51\x02\x4d\x89\xff\x76\x8f\x86\xf2\xff\xa6\x47\x83\x82\x39\x99\xc2\x47\xe4\xf0\xcc\x4c\xb8\xe6\x09\x96\x65\xb7\x92\x37\x67\xee\x4b\xdd\x04\x4b\x5c\x9f\xa1\x6e\xf2\x26\xbd\xd8\x97\xe9\x95\xb3\x7a\xb1\x65\x99\x32\xa1\xde\xc9\xf9\x6a\x34\xcb\x65\x52\x4d\xd9\x5e\x6f\x6e\x28\x37\x96\xeb\x72\xa1\xae\x0d\x81\x86\x36\xa9\xca\xe8\x07\x75\x38\xcc\x4b\x76\xb2\xd9\x8f\xd7\x66\x44\x53\xd7\x7b\x4d\x3b\x5e\x90\xcf\x08\x2c\x79\xd5\xf5\xe1\x0c\xb2\x89\xdb\x41\x9a\xd8\xcd\x83\xc8\xb6\xd7\x4d\x0e\xbd\x59\x5e\x8b\xd0\xe6\x1d\x30\x89\x6a\xec\x1e\xb2\x33\xb7\x34\x54\xc0\xc2\xde\x2c\xcb\xae\x09\xa1\xd1\x4f\x67\x66\x3e\x7f\x9b\xbd\x98\x5c\x39\x88\x2f\x46\x38\x17\x3e\xc5\x86\xb6\x72\x53\x84\x7e\xb1\xe1\x79\x7f\xce\x46\xe4\x30\x17\x82\x79\xa9\x4f\x4a\xbd\x21\xaf\xcb\x8b\x42\x65\x4c\xba\x5e\x39\x97\x39\xc9\x88\xbf\xdf\x9f\x11\xff\x55\x7f\x06\xf5\x7f\xd6\x9f\x11\xfd\x9f\xfa\x33\xf0\x2f\xfb\x33\x98\xdf\xeb\xcf\xb8\xa4\x6d\x0d\xbc\x95\xbc\xfd\x99\x5c\x97\x4b\xfe\x3d\x55\x81\xfe\xe5\xd0\x3f\x96\x9d\x5b\xec\xfa\x66\xb0\x73\xf6\x22\xf4\xc6\x72\x16\x16\xa6\xb6\x57\xa1\xf6\x55\xbd\xc8\x83\x73\x64\x38\xba\x95\xfa\x4f\x1f\x99\xec\xcb\x76\xea\xc1\x62\x58\x78\x41\xea\x55\x57\xa0\x8a\x4c\x0c\x22\xb9\x0a\xc6\x6b\xb2\xac\x68\xd7\x77\x2a\x45\xe5\x21\x59\xfe\x8c\x61\xd8\x2a\x17\x62\x83\x8f\xc8\x81\xd4\x22\xb4\x77\xc2\x88\xc2\x39\xb2\x4c\xb5\xe4\x09\x55\xf6\x48\xea\xa1\xe0\xe8\xbe\xbd\x1e\x61\xc4\x04\x22\xef\x9c\xc4\xe4\xb5\xf5\x37\x92\x4d\x6b\x5c\x70\xf0\x6a\xe1\x7e\x01\x02\x0f\xe3\xaa\xbc\xe0\x1a\x96\xdc\x49\x0e\x20\x54\xd7\x00\x1f\xb8\xf4\xa2\x28\xfc\xe0\x86\xe0\x5c\x59\x20\x4f\xd7\x23\xa6\x17\x2c\x44\x55\x01\x44\xde\xbb\x7b\xee\xc5\x93\xfb\xb4\x4e\x83\x1b\x3b\x04\x52\x13\x1d\xd2\xab\x98\xbd\xd0\x39\x5f\x25\xef\xcb\xd0\x99\xc9\x2e\x72\xfd\x3f\xec\x9d\x7b\x7c\x53\x45\xde\xf0\x7f\x93\xe4\xcc\xa1\xcd\xb4\x4d\x4e\x6e\x27\xb4\x4d\xd2\x36\x4d\x68\x02\x6d\xd2\x36\x49\x2f\x49\x4b\x93\x52\x5a\x6e\x41\x68\xbb\x20\xb7\xa6\x25\xb4\xc5\x5e\x34\x6d\x91\x8b\x28\xae\xe8\xbb\x0b\x55\x50\x56\x44\x81\xa2\x2b\xf4\x55\xd6\xd7\xc5\x55\x51\x3f\x02\x0a\xed\xae\x14\x57\xc0\x15\xf4\x55\x64\x57\x70\x05\x7d\x56\x76\x5d\x75\x7d\x64\xdb\x33\x7d\x3e\x39\x0d\x08\x2c\xb8\xec\xed\x9f\xe7\xc3\x5f\xf9\x4d\x4e\x32\x67\x66\x32\x33\xbf\xcb\xf9\x66\x7e\xf9\xc5\x0f\xea\xb8\x54\x3c\x37\x0b\xa7\x72\x5f\x4e\x4e\xc5\xa9\xd9\x58\x99\xad\x33\xf0\x3c\xc4\x62\xf1\x1d\xf8\x6e\x46\x75\x15\x36\x23\xcf\x93\xa7\xbd\xfc\xe1\xd2\x7f\x9c\xcd\x88\xf4\x9d\x6d\x65\x3d\x8e\x73\x03\x92\x0e\x7a\x14\x39\x84\xfb\x07\x76\x27\xe6\xec\x22\xe4\x40\x6d\xe5\x26\x6c\x4c\x78\x28\x77\x4f\x9f\xf0\x00\x72\xd3\x43\x92\xf5\x01\xfd\x00\x21\x09\x47\x6a\xa4\xcf\xfa\xf5\xf4\x10\x36\xa0\xe2\xea\xa1\x87\x15\x13\xcc\xc1\xac\xdc\x84\x3a\xe2\x8b\x4b\x17\x7e\xa4\xd7\x1b\xf5\x92\xa5\x36\xe9\xff\xf5\xc5\xa5\x09\xff\x87\xe7\x8d\x7a\xc9\x32\x3b\xa3\xc2\x07\xe9\xb6\x9e\x90\x0f\xdd\x7c\x04\x63\x7a\x48\x98\x45\xdf\x60\xd9\xb7\xd1\xd3\xd2\x1f\x24\x10\xd2\xd1\x41\x5f\x36\x20\x7f\x02\xae\xa6\x37\xbd\xc9\xb2\xa8\x48\x2e\xd9\x88\xbc\x3e\x9e\x3b\xb2\x8b\x90\xdd\xc7\x58\x9e\xe7\x68\xbf\xf0\x8c\x51\x52\x8c\xca\x58\xe1\xcd\xe8\xae\x16\x48\x11\x54\xd1\xe9\x3f\x62\x6c\x71\xdf\x89\xb1\x03\x2d\x87\x17\x4b\xbe\x60\x54\x97\xb0\x19\xd2\x4b\xd9\x0c\xcd\xc5\x07\xa5\xe2\xbf\x7b\x5d\x7f\x87\xcd\x58\x32\x88\x27\x21\x5c\xa3\xf7\xeb\xe9\xf0\xf4\xe9\x84\x67\xab\x06\x85\x35\x08\x1d\x3a\x44\x87\xdf\x4d\xa9\x88\x6a\xa8\x00\x3a\x19\xed\xfc\xbd\x7a\xbd\x41\x2f\xb9\xc3\xc6\xa8\x30\x1d\xa6\x5f\x25\x66\x7d\x88\x12\xb1\x4e\xa7\xa2\xe7\x3f\x2d\x71\xd2\x1e\x62\x44\x4e\x3b\xfd\x9a\x0e\x33\x0c\x62\xff\x7a\xff\x72\x94\x80\x58\x61\x69\xd4\xf0\xc9\x0c\x66\x09\x29\xce\x68\x27\x78\x6c\x74\x7e\xc7\x65\x24\x33\x8a\x7f\x85\xcb\xb0\xaa\xae\x97\xcb\xb0\x4b\x96\xd0\xcf\x6f\xc2\x88\x17\x7b\x79\xb6\xbb\x9b\xd5\xfd\x00\xa3\xd1\xc2\x16\xda\x87\x55\xc8\xf3\x6e\x53\xe7\xb2\x52\xf9\x4a\x4d\xa3\xfd\x8f\x83\x29\x13\x9a\xa3\x3d\xde\xe4\x8d\x4b\x7f\x8e\x65\x47\xcb\xd9\xe3\x36\x49\x43\xb4\xf7\xdb\xb7\x4d\x67\x1f\x4f\x9d\x23\xc9\xb5\x31\x0a\x4c\xcf\x1e\x75\x6f\x47\x46\x96\xe7\x55\xf4\xd4\xcf\xea\xeb\xe9\x09\x3d\x02\xdf\x0e\x03\x3d\x8b\xd1\x73\xf6\x0f\x39\xda\x87\xd9\x57\x4b\x55\x8f\xae\xd8\x59\x6e\x28\xcc\x42\x9e\xbf\x08\x4b\x49\xbd\x72\x82\x79\xba\x8d\x3e\xe9\xe4\x8d\xbe\x5a\xec\x60\x69\xb7\x53\x6f\x9c\x57\x80\x73\x71\x8c\xc9\x60\x0e\x32\xaa\xab\x33\x19\x6c\x8c\xc9\xf0\x5c\xc6\x64\x5c\x34\x67\x2e\x32\x19\x58\xfa\x2f\x31\x19\xd6\x8b\x6f\xc9\x9e\xa6\x27\xfa\x51\x91\x42\x89\x72\x85\xb5\x1f\xd2\xdd\x76\xec\x0c\xf5\x09\x6b\x50\x89\xea\x53\x8c\x10\x3d\x80\x9e\x77\x63\x37\x92\x1c\xc5\x92\x25\xe5\xfc\xa9\x21\x55\x17\x9a\x57\x2b\xbc\x83\x13\xda\x79\x4c\x8f\x45\x27\x4d\x71\x41\x00\x3d\x4f\xba\x30\x2f\xbd\x27\x2e\x9d\x8b\x4f\xee\xa6\x87\xfb\xc5\xb5\x73\x87\x5d\xc8\x22\x81\x51\xe9\xfa\xa3\x9f\xed\x14\x75\xc8\x1d\xd1\xe5\x43\x4f\xfc\x9e\x3a\x59\xda\xc7\xb2\xa7\xd0\x6f\x73\x71\xea\x12\x7a\x7c\x80\x65\x51\xe0\x51\x6d\xd4\x1a\xea\x45\xe5\x87\x68\x8f\x3d\x07\x8d\x3b\xca\xe9\xb9\x53\xf4\x73\x0e\x77\xa3\x79\x78\x0e\xc1\x5d\xf7\xeb\x7f\x41\xb7\x27\xd4\x8b\xff\x07\x7f\x82\xc3\xf7\xbd\xa7\xdf\x67\xa2\x45\x1e\x95\x81\x1d\x31\x8b\x9c\x58\x93\x7e\x51\x8e\xb1\x18\xb2\xc7\x19\x0e\xc6\x82\x07\x26\x89\x5c\xc2\xb5\x49\x0c\xcf\x05\x12\x23\xa6\x9e\xbf\x1f\xc4\x90\xdc\x76\x30\x78\xbc\x56\x1f\xe0\x8f\xa8\xb0\x1e\x1b\xaa\x70\x23\xca\x39\x2d\x57\x0e\x7e\x72\x41\xd9\x1e\x4e\x99\xd0\xa4\x2e\x76\x97\x4b\x9f\x4a\x4e\x4a\xcc\x19\x3c\x13\xed\xbe\x6c\x94\x4d\xc7\x70\xf8\x1d\xfa\x78\x01\x72\x7c\x10\xdd\x0b\x8e\xd3\x7e\x39\x8b\x79\x3a\xd9\x80\x56\x8f\x49\xa4\xcf\x34\x7e\xc0\xd1\x93\x4a\x06\xb9\xb6\x47\x3d\x8d\x1d\x3f\x47\xc5\x58\x88\xc4\xdc\x09\x5a\x22\x1f\x4d\x5f\x1b\x51\x93\x18\xe5\x10\xfe\x62\x7c\x90\xad\x62\x34\xff\x08\x83\xa1\xb9\x8c\xc1\xb0\x8c\x58\x23\xa2\xb7\xcb\x66\x58\xa4\xff\x6e\x06\x23\x52\x8f\x9c\xd8\x6c\x43\x8e\x46\x49\x84\x1e\x0a\xa2\xb2\x6a\x5d\x40\x4f\xfb\xbb\xbb\xb1\x61\x12\x83\xdc\xe7\x1d\xc8\x7b\xfe\x3c\xed\x97\xac\x0f\xf0\xa1\x73\x18\xab\x3e\xaf\xab\xee\xc3\x93\xe4\x05\xc6\x04\x1d\x5b\xf5\x28\xd3\x43\xdf\x96\xce\xa0\x47\x1f\x65\xb6\xbb\xf1\x72\xa2\xea\x9e\x20\x6b\xb4\x93\xc1\x5f\xa5\x4e\x68\x54\x79\x3d\x01\xd9\xcc\xe4\x8a\x46\x75\xb1\x3b\x80\xde\xf7\xc5\xa5\x9d\xb7\x45\x87\x19\xbf\x6b\x67\x34\xb8\x7d\xe8\x56\xa3\x4d\xba\xb9\x1d\x63\xba\x5f\xbe\xdd\xb3\x1c\x55\xe2\xe8\xe6\xbb\xef\xbe\x50\xfd\xb0\x22\x6d\x8f\x45\xb9\x95\xf6\x63\x8c\xfc\x3d\x4f\xc4\x6d\xda\x85\x26\xe1\xc9\x3c\xd7\x2a\x14\xb2\x72\xc9\x89\x10\x6e\xa3\x8f\x29\x2c\x24\xd5\xc4\xd1\x72\x62\x40\x6b\x6d\xf4\xd1\x4d\x3d\xd2\x8d\x09\x43\xb7\x3c\xb4\x03\xdd\x6c\xb0\xd3\x15\x2a\xf4\x74\x56\x62\xe1\x18\x74\x33\xa1\xa5\xe2\x5a\x0f\x66\xe5\xc6\x5e\x05\xd3\xa5\x3b\xf8\x48\x0c\xe2\x21\x46\xf5\xb7\xfc\x85\x2a\xaa\x1e\xff\x86\xbf\x90\xb2\xd6\xff\x08\x7f\x71\x5b\xeb\x59\x03\xfe\x93\xb2\xfb\x80\x1e\xef\x95\x44\x68\x3f\xf2\x0a\x0f\x34\x9d\x35\x9e\x92\xeb\xb1\x26\x0e\x37\x9d\xc0\x7b\x84\x75\xc8\x1b\xfd\x19\xfc\xfa\x26\x52\x53\x23\x7d\xdd\xaf\xa7\xfb\xb0\x01\x4d\xac\x1e\xfa\xb1\x18\x1e\xa8\x68\xc4\x3e\xd6\x26\xac\x13\x57\xf6\xed\x36\xe9\x2b\x51\xad\xf8\x43\x8e\x17\x4b\x8c\x0a\xb7\xd2\x2e\x6e\x83\x2e\xc8\xd1\x5f\xe8\xa5\x1b\x0f\x60\x4c\x5f\x13\x6e\xa5\xfb\x30\x6e\x45\xab\x49\x37\x9d\x40\x0c\x92\x8d\x81\x65\x55\xa8\x65\x68\xf1\xfe\xe8\xb8\x4b\xd6\xa3\x32\x1f\xcf\x35\x12\x32\x47\xfc\x61\x5e\x16\x7e\xa9\x30\x49\x74\xa8\x12\x0b\xef\x99\x83\x36\x27\xa9\x57\x0a\xa3\xae\xa9\x17\x45\xf6\x42\xb6\x9d\x51\x7d\x2f\x7b\xa1\xfe\x5e\xf6\x42\xf7\xcf\xb0\x17\xba\xeb\x62\x2f\x92\x64\x19\xe4\x89\x75\xeb\x1a\x4a\xc8\xe0\x49\x6e\xe3\x9a\x35\x1b\x65\xf7\x98\x53\x6b\x08\x2f\xac\xaa\x24\x5e\xb2\xce\xdf\xb2\xd1\x4b\x3f\x9a\x5c\xb0\xba\xce\xef\x2f\x9e\x76\x0b\xc1\x74\x1b\xd2\x17\xd7\x4c\x2d\x4e\x94\x91\x2d\x7c\x9d\x61\x41\xd6\x7c\xde\x4c\x64\x67\x88\xd7\x3c\x61\x94\x25\xaf\x4e\x72\x80\x54\x13\xf3\x52\xda\x85\x39\x62\x4e\x4a\x92\xa3\x1e\x83\x6d\xf0\xe3\xb4\x24\x99\xdc\xc6\xa8\xc8\xb3\xfb\x87\xa1\xf8\x4f\xbf\x99\x31\x9d\x70\x3f\xc5\xfb\x51\x16\x22\xfb\xf1\x16\x37\x31\xe7\x4c\x2b\x76\xbc\x37\x76\xb1\xb6\xfc\x9b\x5b\xf0\x0b\xed\xc7\xd0\x2d\xdd\x5c\xe2\x94\x0c\x82\x47\x29\xfc\xe4\x1e\x9a\x4d\x7f\x78\x17\x87\xdf\xd6\x85\x0c\xef\xa7\x60\x93\x76\x47\x5a\x9d\x81\x2c\xef\x5a\xb9\x65\x4b\x78\xa6\xd9\xcf\x4f\xbb\x67\xd7\x5e\xf3\xd1\xb7\xdc\xd8\xe1\x15\xb6\x2b\x4c\x29\x5a\x2e\x36\x97\x65\xbf\x67\xd4\x57\x72\x17\xb9\x57\xe1\x2e\x46\x76\xd1\x6b\x70\x17\x17\x03\x40\xe2\xb7\x34\x17\xb9\x8b\x6b\xef\x22\xd2\xf8\x2f\xa7\x67\xd2\x0f\x5d\xcd\xc7\xd3\xe2\x45\x13\x4e\x75\x06\x0f\xd3\x43\xe8\xe7\x93\x52\x7d\xc8\xe7\xb5\xf7\xf8\xa6\xed\x6d\x5d\xb5\x7d\xd5\xae\x60\x82\x9c\xcc\x93\x14\x06\x69\x7f\xe5\xdc\x53\x09\x3a\x82\x74\x68\x41\x21\x1e\xd2\x24\x57\x88\xb6\x16\xfa\x20\x66\xd9\x19\x78\xc9\x52\x3b\xa3\xde\x5d\x5d\x4f\x4f\x07\x38\x3d\xed\x3d\x88\x31\x72\x93\x47\xb4\xeb\x30\xb3\x63\x27\xf2\x0e\xd0\xc7\x7c\x73\x67\x4c\xb6\x3f\x5c\xa8\x9a\x6b\xc3\x24\x78\x8e\x90\xaf\x5a\x17\x6d\xa3\x87\xa7\x72\xc3\xc4\x80\x18\x82\x32\x2b\x03\xc3\x57\xac\x79\x6c\x88\xce\x4e\x91\xb7\x60\xa2\x36\xf1\xb5\x79\x0b\xf6\x9f\xe2\x2d\xd2\x2f\xe1\x2d\x8c\x88\xb5\xfc\x83\xbc\xc5\x1d\xb2\x24\xb2\x65\xe3\xa2\xdf\x0a\x65\x3c\x4f\xeb\xb9\x35\xeb\xd7\xaf\x91\x75\x39\xb8\x45\xc4\x30\xd4\x85\x46\xcf\x0c\xce\x28\xec\x48\x4e\x27\x6b\x56\xd3\x2f\x13\x7f\x4c\x85\xb0\x01\x75\xfe\xa8\xb0\xe6\xec\x3c\x33\x26\x06\x34\xca\xfb\xc8\xd6\x2d\x77\x4b\x96\x13\xa3\xdc\x4f\x6c\xd5\x82\x2b\x71\x0a\x9e\x46\xac\x56\x52\x87\x26\x60\x73\x25\xe7\xe5\x25\x33\xcc\xfc\x60\xab\x99\x60\x74\x30\x25\x53\x62\xab\x65\x54\xe4\xa9\x5f\xd3\x33\x3b\x07\x4f\x12\xa3\x91\x63\x36\xe2\x3d\xc8\x87\x92\x5e\xc1\x1b\xb1\xdb\x81\x4d\xf3\x2b\xa9\xa9\x8a\xbe\xb8\x92\x73\x2f\xc2\x4e\x5d\xcb\x72\xe4\x41\xf7\xdf\x26\x4f\xa0\x07\x56\xa2\x90\x8d\x10\xfa\x79\xe7\xca\x88\xa1\xfe\x36\x8c\x7a\xc7\xff\x66\xe8\xcf\x1f\x8f\x3e\x9a\xde\xfa\xc2\x8a\xe3\xb6\x8f\x9e\x0f\x06\x43\x55\x6e\xaf\xa6\xdd\x92\x4a\x96\xaa\xe3\xb5\xc2\xb0\xd9\xa0\xcf\xc4\x26\x13\xc4\x58\x0b\x0b\xa3\xbe\x16\x6b\xa1\x66\xb5\x9a\x11\xd6\x22\xff\x52\xd6\xc2\x12\x9b\xa9\x57\xb2\x16\xe2\x2c\xcd\x8c\x9a\x4b\xff\x22\x6b\x91\x89\x56\xbe\xfa\x20\x72\x09\xeb\xfb\xc6\x96\x2c\xa6\xaf\x79\x5e\x15\x1e\x44\xc5\xdf\x7e\x4b\x7f\x89\x5e\xc8\x4d\x41\xb6\xf7\x33\xe9\x6b\x1f\x54\x23\x57\x4e\xc2\x23\x87\x2b\x09\x49\x90\xfc\x12\x57\x92\x7b\xc9\xb2\xc1\x3f\x89\xba\xcd\xe3\x97\xbe\x24\x2f\x8c\xc7\xe9\xc2\x0c\x74\xbb\x8d\xde\x4e\xf4\x3b\xa3\x3b\xef\x1a\x71\x0e\x2f\xb1\x4b\x83\x62\x89\xe7\xa3\x25\x1b\xa3\xa6\xbd\x7f\x08\x06\x29\x7d\x93\x61\x0e\x1a\xfe\x2b\x2f\x60\xa4\x9b\x0f\x30\x0c\x2a\xdb\xfa\x44\xdc\x23\xbb\x50\xd9\x01\xba\xd9\xf9\x91\xe7\x83\x90\x51\x2e\xaf\x3c\x43\xc8\xb9\xba\xd9\x1b\xfe\x5c\xa2\xaa\xdb\x83\x27\xd2\x4f\x88\x68\x67\xd8\x0e\x2e\x5c\xbc\xdf\x4c\xbf\x48\x30\x22\x2d\x95\x39\xf8\x0b\xf3\x5a\xf9\x9d\x78\x81\xb1\x90\x7d\xc6\x70\x7f\x97\xb1\x50\x5f\x1f\x63\x91\x7f\x3d\x8c\x85\x38\xaf\xd5\x97\x33\x16\x68\x58\x72\x3b\x7d\x77\x2f\x5f\xf8\x46\x99\xbc\x57\x59\xa5\x5a\xdd\x5d\x55\x4a\xff\x3b\x38\x4f\xf8\x1d\xb2\x3f\x6b\x2a\xca\xeb\x2f\xc4\xcf\x2b\x52\x97\xa8\xf1\xe6\xa2\x9b\xf9\x72\x33\xae\x4d\xc5\x93\x5b\x72\x50\x9c\xe4\xad\x52\x1d\x7d\x93\x4f\x72\xa7\x66\x23\xdb\x74\xe1\x1b\x9d\x8e\x7e\x8b\x75\x21\xc5\x78\x73\x95\xc5\x21\x9f\x2b\x49\x63\x4b\xe9\xe7\x53\x6f\x15\xde\xd1\xe9\x52\x75\x92\x78\xf4\x36\xc3\x21\x86\x1e\x1d\x60\x1e\x9b\xbe\x25\x9b\x59\x4a\x8e\x98\xa6\xce\xe9\xc8\x38\x57\xad\xc4\x28\x6b\x0f\xbb\xaf\xb4\xc7\x9b\x97\x3a\x06\x67\x2b\x27\x6f\x34\x99\x53\x71\x36\x66\xd8\x7b\xaa\x17\x7e\x36\xb3\x48\xcb\xd1\x7d\xa2\xb7\x6d\x63\x9b\x74\xf8\x77\x3a\xf9\x1e\x3a\x33\xc4\x79\xf2\xc7\x27\x7f\x3a\xfd\xce\x8c\xc1\xb9\x3c\xaf\xd4\x31\xa9\xa8\xc9\x1e\xe3\x56\x56\x31\x9a\xeb\xe0\x2b\xa2\xce\x9e\xca\xf5\xfd\x7c\x85\xf1\xda\x18\x1b\xc3\xd2\x5f\x1d\xf6\x32\x93\x08\x3f\x6d\x1a\x36\xb0\x95\x82\xf0\x10\x7d\xeb\xad\xca\x63\xf4\xd7\x4c\x66\x80\xa7\xaf\xea\x15\x85\x06\x27\x2a\xaa\x11\x10\x13\xe1\xa3\xf2\x83\xc9\x15\x8b\xc4\x08\xdc\x49\xef\xa8\x74\x61\xad\x4e\x67\xe4\x25\x9d\x36\x46\x83\xe9\xaf\xde\xa2\x8b\x12\xb3\xd0\xac\x04\x03\xed\xf5\x3a\xe8\x66\x45\x1a\xd2\xda\xa9\x40\xbf\x60\x18\xa4\xf8\x72\x0d\xbb\x1a\x3d\xfc\x16\x2a\xf2\xea\x39\xfa\xac\x9f\x65\x6c\xa8\x08\xbf\x61\xb8\x2b\x2a\xfd\x61\xc4\xae\xb5\x09\x16\x27\x1f\xb5\x6a\x59\x83\x03\x8f\xb0\x15\x78\x3a\xa3\xf9\xcf\xb2\x15\x16\xab\xe7\x9a\x6c\x45\xdd\xbe\x99\x7d\x33\xf9\x32\xbe\x2f\x23\x83\xc7\x0e\x66\x1a\x1a\xe7\x47\x63\x7f\x24\xdf\xd0\x27\xa9\xa3\xc7\x66\xa0\xbc\x99\xfc\x78\x9e\x1e\x4e\x8a\xdc\x4d\xf7\x4f\x99\xfa\xeb\x65\xf8\xcd\xf2\x32\x34\xbf\x94\xe0\x29\xf4\x9b\xba\x9b\x68\x7f\xa3\xe1\x0f\xf8\xcf\xf4\xf0\x07\xc9\xe5\x0b\x55\x45\xae\x32\x69\x73\x72\x20\xac\x2e\x74\x95\x31\x1a\xdc\x47\x37\xe4\xa0\x92\x81\xa8\x1b\xfd\x06\x7d\x35\x3e\x01\x1b\x16\xbf\x30\xc7\xdc\x75\xd8\x45\x2b\xd0\xeb\x41\xed\x2c\xd4\x74\x10\x63\xfa\x1b\xf9\x9e\x9c\x0d\xa8\x50\x74\xb6\x07\x1e\x9f\x31\xfb\x67\xf4\xd6\x05\xfc\x6d\x53\xd0\xd2\xa9\x77\xbb\x5c\x98\x6e\x6d\x4e\x41\xea\xbb\x42\xdd\xea\x0d\x7b\x50\xa1\xb0\x52\xbe\x40\x11\xc8\x98\x9a\xe5\x88\xbd\x42\x6c\x6d\x36\x31\xef\x31\xea\x2b\xd8\x0a\x56\xe5\xf6\x48\x2f\x0c\xa4\x2e\xcf\xed\xd1\xea\x62\xa0\x80\xc8\x01\x78\x24\x23\x6c\x05\x92\x7e\x2f\x5b\x91\x7c\xa5\x7d\xdf\x79\x6a\xb9\x52\x5f\x75\xba\x56\xef\xc9\x3c\xed\xc3\x01\xe3\x03\x8a\xe5\xa7\x25\x5d\xf4\xc0\xb9\xbd\xc2\xda\x97\x3e\x35\xd0\xe3\xcc\x8a\x80\x9e\xee\x3d\x8d\x55\x03\x99\xc8\x59\x33\x74\x56\x59\x6e\xbe\xc9\xee\x24\xf5\x6d\x98\x93\x2e\xc5\x73\xb1\xdd\x50\xff\xb5\x6f\x54\x86\x70\x9f\x18\x72\x58\x61\x67\xd4\xf8\x34\x6d\x1c\xe5\x42\xe8\x14\xd6\x67\xe2\x4f\x8f\xdc\xa9\xfe\x4c\x8e\xb6\x9d\xc6\x98\xf6\xab\x87\xce\xed\x65\x98\xbd\x92\xbf\x04\x90\xdd\xa7\xe7\xe8\x73\x42\x8e\x5e\xf2\xc8\x64\xe4\xc4\xc2\x80\xe8\x88\xa6\xd0\xd7\x79\xa2\xeb\xc7\xf4\x88\xd9\x80\x7c\xc2\x7d\x8e\x58\x24\x22\x97\x89\xf9\x4a\x9f\x30\x8a\x6b\xb2\x14\xd6\x7f\x0f\x4b\x61\xf9\xb7\xb3\x14\x1d\x27\x4a\x74\x4e\xe7\x5e\x4c\x76\xe6\xea\x6a\xaa\x08\x26\x9a\x78\x47\x10\x9f\xd8\x2b\x3b\x43\xfb\xed\x73\xd3\xad\x28\x55\x0c\x76\xec\xcb\xac\x6a\x2d\x67\xf4\xbe\xa5\xa3\x0c\x28\x4b\x78\x20\x74\xdc\x60\xc4\x27\x6a\x85\x6e\xe4\xb5\xd1\xbf\xbe\x4c\xb2\x93\xa5\xf1\x47\x49\x70\x0e\x4f\x48\x26\x2f\xaf\xda\xc1\x6d\xaa\xda\x1e\x38\x31\xd0\x48\x48\x0f\x51\x51\x8b\xe8\xb1\x16\xf8\x65\xba\xe4\x89\xe2\x23\x32\xe1\x8f\xbe\xf8\xd1\xc2\x2a\x31\xee\xb5\xdc\x2e\x3d\x10\xb5\x9c\xee\x56\xe9\x47\xa2\x60\xf1\x18\x9f\xa0\x03\x06\x72\xf6\x25\x82\x9f\x91\xd3\xaf\xc7\xc5\x15\x84\xec\x2b\x8c\x74\x93\x74\xfb\x5e\x8c\x69\x1f\xd7\xe7\x39\x84\x32\xc4\x98\xc9\x5e\xb2\xd3\x51\x96\x4c\x4f\x73\x08\x07\xb8\x1d\xf4\x5d\x86\x09\x49\x1f\xd2\x1b\x86\xe6\xd5\x30\x0c\xf2\xf5\xf4\xca\x5b\xb9\x4f\x83\x43\x77\xa3\x90\x3b\xe4\x39\x44\x50\x4d\x0f\xb7\x8d\x0e\x84\x93\x50\xe6\xf1\x7d\xf4\x65\xb7\x50\xcf\x49\xaa\x48\xbd\xb2\x3c\x73\xc4\x29\x88\xbe\x0a\xc6\x0b\x3f\xeb\x05\xc7\x40\x14\x63\xfe\xf0\x52\xd9\x1f\x19\xed\x3f\xcd\x52\x58\x72\x10\x23\xb2\x14\x6e\x8f\x15\x7b\xae\xc6\x52\x58\xaf\xc5\x52\xc8\xba\xe8\x33\x1d\x8d\x8b\x56\x1d\xaf\xe1\xfd\x7a\xfa\x78\x88\x33\x1b\x31\x76\x3c\x35\xa9\x6f\x70\x2d\xca\x4f\xec\x68\x56\xd4\xd9\x97\xb5\x7d\x84\xd6\x6c\xd2\xcb\x55\xf7\x33\xbb\x9e\x3b\xc5\x2d\x97\x1b\x93\x27\x36\x6a\x8a\x3c\x01\xdf\x23\x7b\x5e\x7c\xd0\xc8\x98\x31\x0e\x25\x49\xab\x25\x61\x5f\xfc\xe8\xc1\x65\xe2\x73\x8d\x15\x76\x46\x8b\xe9\x73\x19\x7b\xfd\xef\x34\x9d\x10\x5d\xa5\x1d\xe6\xad\x44\x6b\xc5\x7a\x4c\xff\x7f\xf9\x1b\x18\xa3\xfc\x92\x57\x12\x7d\x7a\xb7\xf9\x93\xc5\x1f\x7d\x45\x07\x09\xc6\x67\x8c\x3b\x77\x18\x95\xcb\xe4\x84\x3e\x4f\x42\xca\x40\x66\xd0\x36\x40\x07\x77\x3f\xa3\xfc\x96\xab\x37\xf4\xe8\x1f\xa3\x6d\xce\x2b\x75\x79\x84\xa9\x62\x54\xe2\xb9\x63\xf9\x50\x0a\xd3\x00\xd0\xb5\x11\x0a\xdd\x88\xee\x11\x11\x0a\xe6\x3a\x09\x0a\xd9\x51\xda\xbb\xbc\xb1\xd3\x8b\x78\x71\x6c\x36\xa3\x01\xb9\xbe\x96\xed\x39\x2f\xac\x1f\x1e\x68\xbd\xcf\x41\x3f\x46\xeb\xb7\x15\x17\x3c\x79\x82\x71\x62\xf9\xd6\x04\x36\x65\x82\x68\xf8\xa0\xf7\xbd\x6c\x46\xd4\xd2\x49\xd5\x49\x96\x88\xa1\xa3\xde\x94\x77\x7c\x27\xf3\x10\x2f\x8e\xc3\x66\x35\xfd\xc9\x31\x62\x38\xa0\x59\x17\xa2\xdf\x0c\x63\x8c\x64\xe7\xbb\x03\x08\x8d\x41\x26\xfc\x05\x3d\x69\x30\xa0\x8c\xe3\xf7\x11\xbc\x55\x89\xe9\xff\x23\x21\x45\x79\xe6\xb4\x2c\x21\xfd\x12\x43\x7d\x84\x97\x28\x16\x7d\xf3\x2b\x78\x09\xf7\xd5\x79\x09\xcf\x08\x2f\xe1\xb9\x2a\x2f\xf1\x3d\xea\x56\x76\x80\x6e\x8f\xef\x08\x6d\xbb\xf3\xc5\xea\x68\xef\x9f\xa0\x13\x38\x24\xdf\x8d\x55\xf8\xc5\xb5\xdd\x67\x90\x6b\xb0\x04\x15\xe3\xed\x11\x35\x62\x0c\x78\xf7\xaa\x57\x0f\xd3\x37\x25\xf3\x1b\x0d\x78\xd9\x1b\xaa\xa8\xea\x6d\x8d\x45\x38\xa4\xc8\x17\x97\x36\x58\x20\x06\x92\x0e\x8a\x83\xf1\x54\xc9\x93\x09\xde\x6f\x97\xbf\xc8\x46\x55\xc5\x4f\x2d\xc2\x6a\x0e\xa3\xd5\xb8\x83\xd0\xc1\x7b\x3f\xa2\xaf\x61\x8c\xca\xf0\x97\xa5\xa9\x5b\x39\xa4\x58\x75\x10\x15\x1f\x36\xb0\x07\x03\x18\xdb\xbe\x4c\xa8\x1b\x19\x8b\xac\x4b\x66\x01\x03\x40\xff\x22\x0d\xe0\x82\x98\x5f\xb7\x20\xaa\x7b\x91\x78\x6a\x88\xc5\x85\x35\x51\x87\xc5\xed\x52\xe6\xe7\xe9\x94\x6a\x36\x57\xc3\x6a\x35\x4a\xb5\xce\x93\xa7\x15\x8f\x7c\xb1\xb8\xd2\x63\x0e\x9f\x15\xb9\x14\x1e\xb7\x27\x5f\x3c\xee\x25\x09\x89\x10\x84\x78\x18\x96\xfb\x72\xdb\x59\x3c\xa4\x44\x99\x8f\xf2\x46\x78\x01\xd1\x72\x71\xbb\xd2\xad\x92\x52\xe5\xc3\x1b\x54\xeb\x2d\xe9\x95\x5a\xa5\x32\x5d\xb9\x50\x67\xb9\x57\x99\xdb\xb0\x99\x59\xbe\x5e\x71\xac\x02\xcb\xe5\xc8\x34\xd1\x3c\x17\xb9\x70\x5a\xaf\x36\x25\x39\x19\x6b\xc3\x0e\x05\x2b\xac\xd4\x97\xce\xe7\xdc\x4e\x1f\x32\xe2\xdc\x14\x8c\x26\x32\xd6\xca\x99\x29\x99\x5c\x4a\xda\xfa\x44\x29\x2e\x78\x1c\xf7\xfe\x84\xcb\xaa\xa5\xaf\xb4\xcd\x1c\x57\x16\x44\x13\x67\x69\xe9\x86\x95\xa5\xf2\x80\x73\x36\x7d\xb2\x39\x6d\xfd\xd8\x4e\xa6\xf7\xae\xb4\xf9\x3f\x3b\xf0\x71\x32\x66\xe4\x4a\x64\x5a\x83\xe2\x52\x92\x49\x52\x7d\x4a\xf2\xe8\x9f\x62\x2b\x83\x95\x0b\xfc\x8c\x36\x45\x98\x28\x9f\x9d\x54\x9a\x56\x69\x59\xeb\xe8\xa6\x43\x86\x24\x54\xe6\x15\xbe\x4e\x49\x4e\xf7\x2f\xb4\x62\x46\xb1\x59\xa1\x1d\xd1\xbb\x65\x74\x48\xfa\x63\x5c\x02\x59\x31\xfb\xad\x5e\x3c\xe5\x27\x37\x15\x21\x56\x87\x93\x90\x46\x9d\x24\xc9\x88\xf9\x75\x2e\x65\xbe\xc7\xe2\xf2\x58\x5c\xca\x7c\xab\x9a\x4d\xb7\xba\x18\xad\x52\x5c\x61\xd6\x3c\x4d\xb4\x9c\x7f\x19\x7f\xc3\x68\x35\x6a\xa4\x51\xb0\x58\x73\x61\x54\x73\x3d\xee\xa8\x5b\x8d\xac\xae\x77\x95\x0d\x7b\x90\x89\x90\xf1\xaf\xa5\xf9\x9b\xdb\x99\xcd\x0d\xb9\xca\x35\x69\xda\x86\xb6\x34\xeb\xc3\xf1\x1b\xd1\x99\x80\x5c\x77\x9a\xf1\xa7\x24\xa7\x69\x77\x8f\x8e\x0e\x54\xae\x0f\xdd\x39\x96\x9e\x6a\x9e\x3f\x5b\x9b\x96\x92\x82\xb5\x72\x7f\x72\xbb\x1f\x99\xb4\xb8\x64\xe1\x57\x27\xe9\x09\xb9\x32\xf5\x75\xeb\xfe\x93\x63\xc7\x76\xee\x60\xba\xc6\xae\xcf\x9d\x85\xe6\xcd\xca\x2d\x89\xf7\xcf\x6c\x47\x15\xb5\x59\xfc\x03\xbd\x38\x3d\x8b\x0e\x4f\x93\xa7\xdc\x55\x23\xd3\x8e\xd3\x5a\xe5\x58\x47\x8d\xf2\x59\x49\x25\x69\x95\x16\x6b\x9a\x36\x9e\xfe\xee\x25\x7a\x7e\x8c\xca\x3c\x1b\x47\x47\x66\x6a\xb6\x29\xe7\xa9\x73\xc8\x92\xac\xbc\x91\x2f\xea\x46\xbe\xa8\x1b\xf9\xa2\x6e\xe4\x8b\xba\x91\x2f\xea\x46\xbe\xa8\x1b\xf9\xa2\x6e\xe4\x8b\xba\x91\x2f\xea\x46\xbe\xa8\xff\x65\xf9\xa2\x00\xd4\xf0\xcd\xc5\x0c\xb0\x65\x70\x21\xb1\x2e\x02\xd5\x45\x59\x02\x2c\x94\xc5\x64\x29\x98\xa0\x32\x26\xcb\x2e\xf9\x0c\x03\xe3\x62\x59\x9c\x01\x30\x28\xe1\xe1\x98\x1c\x07\x0a\xe8\x8d\xc9\x04\x46\xc3\xee\x98\x9c\x00\xa3\xa0\x10\xa4\x80\x64\x71\x00\xd0\x06\x47\x63\x32\x02\xcb\x45\x59\x02\x89\xa8\x24\x26\x4b\x61\x3c\x9a\x12\x93\x65\x97\x7c\x86\x81\x9b\x51\x77\x4c\xc6\x90\x8e\xce\xc4\xe4\x38\x30\x49\x46\xc5\x64\x02\xf9\x92\x31\x31\x39\x01\x14\x92\xb9\xe5\xe1\xfa\xf6\x48\xa8\xc9\x54\x11\x6a\x6b\x58\x66\x2a\x8f\x84\x3b\x3a\x9e\x36\xf9\x03\xe5\x39\x53\x2b\xca\xb2\x4d\xb9\x0e\x47\x41\xb6\xa9\xac\xa5\xc5\x34\xa3\xb9\xb1\xa9\xb3\xc3\x34\x23\xdc\x11\x8e\x2c\x09\x2f\xcc\x36\x55\x44\xc2\xe1\xdb\x43\x91\xf0\x8c\x70\x63\x57\x4b\x28\x72\x95\x7a\x8a\x6a\xc3\x91\x8e\xe6\xf6\x36\x53\x6e\xb6\xc3\x71\x41\x76\x66\x3b\x1c\xa6\x60\x43\x67\x7b\x7d\x38\x62\x72\x8d\x15\xef\x30\xd6\xd4\xdc\xd6\xdc\xd9\x1c\x6a\x31\x45\xc2\x2d\xe1\x50\x47\x38\x56\x99\x58\x97\x58\x95\xbf\xbd\xa5\x33\xd0\xd5\xd9\x19\x8e\x94\x87\x3b\x9a\x1b\xdb\xea\xdb\x5b\x3a\x1b\xc4\xf2\x42\xb1\x3c\x7e\x59\xa8\xa9\xbd\x3d\xbb\xa1\xbd\x15\xca\x21\x0c\xf5\xd0\x0e\x11\x08\x41\x13\x98\xa0\x02\x42\xd0\x06\x0d\xb0\x0c\x4c\x50\x0e\x11\x08\x43\x07\x74\xc0\xd3\x60\x02\x3f\x04\xa0\x1c\x72\x60\x2a\x54\x40\x19\x64\x83\x09\x72\xc1\x01\x0e\x28\x10\xe5\x32\x68\x81\x16\x30\xc1\x0c\x68\x86\x46\x68\x82\x4e\xe8\x10\x4b\xd1\xef\x87\x21\x02\x4b\x20\x0c\x0b\xc5\x72\x23\x74\x41\x0b\x84\x20\x72\x9d\xf7\x2e\x82\x5a\xb1\x86\x0e\x68\x86\x76\x68\x13\xef\x9b\x2d\xde\xf9\xca\xf7\x9d\xb1\xf7\x4d\x10\x84\x06\xe8\x84\x76\xa8\x17\x3f\x61\x02\x17\x8c\xbd\xa4\xbd\x51\xb9\x19\xda\xa0\x19\x3a\xa1\x19\x42\x62\xbb\xa3\x77\x6b\x81\x30\x84\xc4\xf6\x5e\xde\xb2\xef\xda\xf5\x5d\xab\xfc\xd0\x0e\x2d\xd0\x09\x01\xe8\x82\x4e\xe8\x14\xef\x53\x2e\x5e\x8b\xf6\xbf\x4d\xfc\x76\xf4\x7a\xc3\x25\xd7\x17\x5e\x72\x7d\x3c\x2c\x13\xeb\x6e\x87\x76\xc8\x86\x06\x68\x87\x56\xa8\x10\x6b\x0f\xc3\xed\xe2\xe8\x84\xbf\xcb\x4e\x3d\x6c\x85\x8d\x57\x4d\xb3\xdc\x04\x80\x24\x48\x2a\xe6\x71\x66\x00\x03\x0b\xa3\x20\x0e\xe2\x41\x0e\x04\x12\x20\x11\x92\x40\x01\x4a\xe0\x40\x05\x6a\xd0\x80\x16\x74\xc0\x83\x1e\x46\x43\x32\xa4\x40\x2a\x18\xc0\x08\x26\x48\x83\x74\xc8\x00\x33\x64\x82\x05\xac\x30\x06\xb2\xc0\x06\x76\x18\x0b\xe3\x20\x1b\x72\xc0\x01\x4e\xc8\x85\x3c\xc8\x07\x17\xb8\xc1\x03\x05\x50\x08\x45\x50\x0c\x5e\xf0\x41\x09\x94\xc2\x78\x28\x8b\xcd\x8c\x09\x50\x01\x13\xa1\x12\xaa\x60\x12\x4c\x86\x29\x30\x15\xa6\x41\x10\xa6\xc3\x4d\x30\x03\x66\x42\x35\xd4\x40\x2d\xfc\x00\x66\xc1\x6c\xb8\x19\xe6\xc0\x5c\x98\x07\xf3\x61\x01\xd4\x41\x08\xea\xa1\x41\x1c\x9b\x45\xd0\xc8\x64\xb7\x75\xb5\xb4\x28\xda\xda\xdb\x5a\x43\x91\x5b\x9a\xdb\x1a\x23\xe1\xce\xae\x48\xdb\x48\x6f\xd1\xf0\x30\x48\xfe\x27\x00\x00\xff\xff\x42\x3b\x70\xc1\x08\x7f\x00\x00") + +func fontsDeborahfancydressTtfBytes() ([]byte, error) { + return bindataRead( + _fontsDeborahfancydressTtf, + "fonts/DeborahFancyDress.ttf", + ) +} + +func fontsDeborahfancydressTtf() (*asset, error) { + bytes, err := fontsDeborahfancydressTtfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/DeborahFancyDress.ttf", size: 32520, mode: os.FileMode(438), modTime: time.Unix(1575019249, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xa, 0x6f, 0xbb, 0xde, 0x9b, 0x89, 0x57, 0x92, 0x8b, 0x62, 0x79, 0x6c, 0x67, 0x99, 0x6, 0x71, 0x9e, 0xc7, 0x84, 0x87, 0x81, 0x44, 0xad, 0xe4, 0x47, 0x6f, 0xb0, 0x68, 0x7c, 0x9b, 0x0}} + return a, nil +} + +var _fontsFlimFlamTtf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xbc\x0f\x74\x1b\xd7\x79\x27\x7a\xef\xdc\x6f\x66\x3e\x10\x97\xc0\x80\xbc\x83\x19\x92\x00\x09\x62\x40\x0c\x48\x82\x22\x88\x01\x30\xa0\x08\x92\x90\x04\x49\xb0\x4c\x59\x90\x44\xd9\xb4\x44\x4b\x94\x4d\xdb\xb4\x4d\xdb\xb4\x4d\x3b\xb4\x43\x27\x6c\xac\x26\x6a\xa2\x24\x6a\xa2\x24\x4a\xe3\x6e\xbc\x8d\xdb\xa4\x1b\x27\x75\xb2\xce\x26\xdd\xa4\xdb\x6c\x37\xdd\x4d\x5b\xa7\x75\x5f\x9d\x36\x6d\xd3\x34\x6d\x73\xba\xd9\xc6\x6d\xd3\xd6\x69\x9d\x46\x86\xde\xb9\x03\xda\xdd\x3d\xef\x9c\xf7\xce\x83\x04\x02\xf3\xef\xfe\xbf\xf7\xfb\xfd\x7e\xdf\x77\x41\x28\x21\x84\x93\x1d\xc2\x48\xfd\xd8\xc9\xc9\xe2\x97\xf7\x7d\x26\x42\x08\x6d\x12\x42\x6e\xbe\xe3\xfe\xf3\x1b\x4b\x2f\xfd\xce\x1f\x12\xc2\xea\x84\xd0\x27\xee\x3e\xff\xc8\xc6\xf5\xeb\x84\x11\x65\xc4\x26\x84\xe0\xdd\xeb\x8f\xdf\x85\xbf\xf5\xa3\x28\x21\xda\x0a\x51\xec\xcb\x6b\x77\x9e\x5f\xfd\xe1\x07\x1e\xff\x0e\x21\xe4\x45\x42\x48\x65\x6d\xed\xce\xf3\xdd\xb7\xc1\x6f\x13\x42\x81\x10\x92\x59\xbb\x7f\x73\x6b\x7b\xe0\xfa\xef\x12\x42\x9f\x91\xef\xfb\xee\x7c\xf8\x01\x72\xeb\xf5\x9f\x10\x65\xf0\x87\x84\x10\x7b\xfd\xc1\x3b\xce\x93\x87\x3e\x77\x95\x10\xf8\x0a\x21\xf4\xd9\xfb\xcf\x6f\x6d\xa8\xb3\x9a\x47\x08\xcd\x11\x42\x52\x0f\x9c\xbf\xff\xce\xa9\x3b\x27\xbf\x41\x94\x21\x24\x44\x55\x36\x1e\x7c\x64\xb3\xfc\xc1\xd9\xdb\x89\x92\xe1\x84\xd0\x50\x50\x17\x4a\xc8\x6f\xbf\xfa\xbd\xdf\x3e\x17\xad\xfd\x88\x84\x91\xc8\xd7\x6f\x7e\xe3\x3d\x4f\x76\x3e\x9f\xb5\xaf\xff\x52\x7b\x49\xf3\xb4\x7f\x24\x84\xc8\xfb\x69\x70\x03\x25\x44\x9f\x6b\xdf\x44\x0e\x68\xe5\xeb\xbf\x74\xfd\x3b\x9a\xb7\x7b\xfe\xdf\x5e\x6b\xc1\x99\x35\x4d\x21\x8f\x05\xc7\x0a\x31\xc8\x24\xd9\x4f\x08\xf0\xdd\x3b\x28\xab\xd3\xcb\x44\x25\xa8\xfe\x9c\x2a\x4b\x3c\xd0\xf9\x64\xbf\x4f\xee\x52\x7a\xe4\x03\x6f\xbc\x9e\x21\xca\xaf\xb4\xc8\xd6\x4f\xde\x38\x6e\x2e\xa4\x52\xa4\x4e\x52\xa9\xa4\xfa\x07\xed\xe3\xd4\xd3\xe7\xe8\xe7\x57\x08\xfd\xf8\x9f\xff\x8b\xbc\xaa\x95\xc9\xc1\x20\xc3\xe9\xdd\xf7\x11\x42\x94\x6b\x84\x40\x89\x10\xf6\xa7\x84\xc0\xf3\x84\xc0\x59\x42\xe8\x8b\x84\x28\xbf\x46\x88\xf2\xbb\x84\xb0\x24\x21\x6c\x81\x10\x2a\x8f\xe7\x3b\xcf\xb1\x6e\x42\xd8\xfb\x09\x51\xfe\x1b\x21\x10\x27\x84\xc9\x56\x7e\x84\x10\x18\x22\x84\x7d\x31\x28\x27\x61\x9f\x25\x84\x7d\x8d\x10\x05\x3a\xf9\xb0\xcf\x13\x02\x32\xad\xbf\x24\x84\x1d\x21\x44\xfd\x57\x42\x40\x9e\x7b\x1b\x21\xb0\x42\x08\xfc\x22\x21\xf0\x65\x42\xe0\x89\xdd\x73\xd7\x76\x9f\xfb\x27\x42\xe0\x9f\x08\x61\x5f\x26\x44\x7d\x8a\x10\x95\x10\x02\x4f\x11\x02\xf7\xef\xde\xf7\xf3\x84\xc8\x01\x01\x37\x11\x02\x57\x3a\xe7\xb4\x10\x21\xf0\x03\x42\xa0\x9f\x10\xf8\x0e\x21\xac\xd8\xa9\x0f\xdb\x43\x08\x7b\x2f\x21\xec\x6f\x09\xa1\xbf\xdc\x29\xb7\x4c\x9f\x3d\x4a\x08\xa8\x84\xb0\x77\x10\xc2\xe2\x84\xc0\x74\xa7\x1e\x8a\x2b\xeb\x7a\xfd\x97\xd8\x15\x42\x94\x02\x21\xea\x15\x42\xd8\x37\x09\x61\xef\x21\x04\xe4\x35\x99\xf6\x19\x42\xd8\xfd\x84\x28\xef\xda\xad\xf7\x3b\x08\x51\x67\x77\xcb\x7d\xd3\xf5\xbf\x92\x65\x93\xf9\x33\x9d\x10\x78\x8e\x10\xfa\xdf\x08\x51\x5e\x23\x44\xf9\x6b\x42\xe8\xff\xe8\xbc\xe5\x79\x79\x2e\x18\x0b\x9d\xd1\x22\x08\x93\xdf\x68\x3f\x21\x54\x23\x6f\x0e\x21\xaa\x90\xff\xbd\xfb\xc9\x1b\x23\x8e\x81\xaa\xe9\x18\xea\x0a\xf3\xee\x48\xd4\x88\xf5\xf4\x0a\x33\x6e\xd9\x7d\xfd\x03\x89\xe4\xe0\x50\x6a\x38\xed\x64\x46\xb2\x6e\x6e\x74\x6c\x3c\x3f\xb1\x67\xb2\x30\x55\xf4\x4a\xe5\x8a\x5f\x9d\xde\x3b\x53\x9b\x9d\x9b\xaf\xef\xdb\x7f\xa0\x71\xf0\xd0\xe1\xe6\x0d\x47\x6e\x5c\x38\x7a\xd3\xb1\xd6\xf1\x13\x27\x17\x4f\xdd\x7c\xcb\xd2\xad\xa7\xcf\x2c\xdf\x76\x96\x9c\x5b\x21\xff\x3f\x5e\xe7\xff\xdf\x2f\xb3\xdd\xcf\xdb\xef\x58\xbd\xf3\xff\x33\xad\xbb\x82\xbf\x77\xcb\xee\x25\x2b\x41\xab\x18\x84\x11\x20\x6f\x25\x6f\x23\xcf\x90\xcf\x90\x17\x94\x3f\x63\x6f\x4b\xf5\xa5\x92\xd7\xaf\xcb\x39\x4d\x9e\xdc\x3d\xfb\x6d\xf6\xb6\x94\x9d\x4a\x5c\xbf\x7e\xfd\xaf\xae\xff\xe5\xf5\x3b\xae\xdf\x71\xfd\x33\xaf\xbf\xfb\xda\x33\xdf\x5d\xf8\xee\xa1\xff\xc7\x6c\xfc\x3f\x5e\xc6\x8b\xff\xe7\xbb\xf7\x55\x42\xac\x35\x42\x86\x32\x84\xb8\x19\x42\x8a\x4f\x13\x32\xfd\x6d\x42\x66\x9e\x26\xa4\xbe\x46\x48\x63\x83\x90\x66\x82\x90\x85\x45\x42\x6e\x2a\x11\x72\xec\x15\x42\x5a\xd7\x08\x59\x14\x84\x9c\x7e\x81\x90\xb3\xaf\x76\x2a\xb1\xfe\x15\x42\x1e\xc9\x10\xf2\xf8\x2a\x21\x3b\x2b\x84\xfc\xf4\x12\x21\x97\xd6\x09\xf9\x60\x8e\x90\x0f\x6d\x10\x72\x75\x95\x90\x8f\x7d\x97\x90\x7f\xbf\x41\xc8\xb3\xaf\x12\xf2\x1f\x90\x90\x5f\xbd\x4a\xc8\xaf\xbf\x44\xc8\xff\xa8\x13\xf2\x8d\x15\x42\x5e\x5e\x23\xe4\x4f\x77\x08\xf9\xee\x36\x21\xdf\xcf\x13\xf2\x77\xaf\x12\xf2\x8f\x39\x42\xfe\xf9\x0a\x21\xd7\xbe\x42\x28\x79\x99\x50\x2c\x10\x1a\x79\x89\x50\xb3\x4a\x68\xff\x57\x09\x4d\x27\x08\x1d\x15\x84\xee\xf9\x1e\xa1\xde\xb7\x08\xdd\x7b\x91\xd0\xfa\x12\xa1\x47\x9e\x23\xb4\xb5\x43\xe8\xe2\x6b\x84\x9e\xb9\x48\xe8\xb9\xd7\x08\xbd\xfd\x69\x42\xef\xde\x21\xf4\xde\x6b\x84\xde\xbf\x44\xe8\x03\x35\x42\x1f\x79\x99\xd0\xc7\x5f\x23\xf4\x6d\x75\x42\x2f\x6c\x10\xfa\xee\x14\xa1\xef\xfb\x14\xa1\x1f\x2e\x10\xfa\x34\x10\xfa\xf1\x6d\x42\x3f\xf1\x12\xa1\xbf\xfc\x25\x42\x3f\x93\x20\xf4\x0b\x39\x42\xff\xf3\x1a\xa1\xbf\x2e\x08\xfd\xcd\x8b\x84\xfe\xce\xb7\x08\xfd\xbd\x65\x42\x5f\xce\x13\xfa\xad\x8b\x84\x7e\xa7\x49\xe8\x5f\x5e\x25\xf4\x6f\xf2\x84\xfe\x7d\x8e\xd0\x57\x9f\x27\xf4\x5f\x17\x09\xbd\x5e\x23\x0a\xfb\x3a\x51\xb4\x2d\xa2\x60\x95\x28\xe1\xe7\x88\x12\x79\x85\x28\xc6\x73\x44\xe9\x59\x27\x8a\x99\x90\x36\x81\x3c\x46\x0e\x5e\x3f\xab\x79\xea\xdf\x11\x83\xd8\x24\x4f\x4e\x91\x7b\xc8\xfd\xe4\x2d\xe4\x43\xe4\x93\xe4\x3f\x92\xff\x4c\xbe\x49\xfe\x94\xfc\x35\xf9\x5b\x3a\x41\x6f\xa1\x67\xe8\xcf\xd1\x8f\xd3\x4f\xd2\xcf\xd2\xff\x44\x7f\x8d\x7e\x8d\xfe\x0e\xfd\x26\xfd\x73\xfa\x7d\xfa\x8f\xf4\xc7\x0a\x51\x42\x4a\x4c\xe9\x57\x86\x95\xbc\x52\x54\x7c\xa5\xa9\xb4\x94\xdb\x94\x3b\x94\x75\xe5\x61\x65\x4b\x79\xbb\x72\x49\xf9\xa0\xf2\xb4\xf2\x8b\xca\xa7\x95\xaf\x2b\x7f\xa6\xfc\x95\xf2\x0f\xca\x8f\x19\x61\x3d\x6c\x90\x65\xd8\x01\x76\x03\x3b\xce\x4e\xb3\x3b\xd8\x1a\xfb\x39\xf6\x0c\xfb\x15\xf6\x3b\xec\x25\xf6\x32\xfb\x0b\xf6\x2a\xd8\x30\x0c\xa3\x70\x08\x8e\xc2\x29\x38\x0b\x6b\xf0\x20\x6c\xc1\xdb\xe1\x02\x7c\x01\xfe\x0b\x7c\x0d\x7e\x17\xfe\x00\xfe\x18\xfe\x0a\x7e\x00\x7f\x0f\xff\x0c\xaf\xab\x8a\xaa\xab\x96\x3a\xa1\xee\x53\x17\xd5\x7b\xd5\x87\xd5\x27\xd4\x9f\x52\x3f\xad\x7e\x59\xfd\x0d\xf5\xb7\xd4\xdf\x57\xbf\xa5\x7e\x57\xfd\x81\xfa\xaf\x9a\x5c\x05\x2c\xdd\xb4\x3c\x3f\x6e\x6a\x8e\xab\x3b\xe9\x72\x65\xc4\x32\x75\xc7\x2d\x97\x54\x2f\x6e\xe9\x8e\xee\xc8\x0b\x65\xbf\x9c\xd6\xdd\x72\x69\xa4\x68\xe9\x96\x9e\x76\x1d\xcd\x8c\x5b\xbe\x65\x0a\xdd\xd5\x9c\xec\x2c\xad\xcc\xd0\xa2\xa9\x8d\xd3\xb4\x19\xf7\x8a\xf3\xb4\x5c\x51\x8b\x96\x6e\xba\x4e\x5a\x17\x33\xd4\x37\x85\xee\xa4\xdd\xd2\x88\xe5\xf9\x6a\x3c\x49\x35\x27\xed\x96\x2b\x96\x57\xb4\x4c\xf9\x6c\x5a\x77\xe4\x8d\x8e\xeb\x7b\x45\xd3\x2b\xf9\x5e\xd1\xf2\x2a\xaa\xa5\x17\x7d\x2f\x9e\xa4\x32\xb3\xb4\xee\x3a\x15\x55\x1e\x09\x3d\x5b\x2e\xf9\x25\xd5\xaa\x94\x5d\x27\x3d\xe2\x99\x5e\x65\x86\xc6\x4d\xaf\x22\x13\x0b\xca\xe5\xb8\x65\x47\x77\x2b\xaa\x65\xea\x6e\x59\xb5\x34\xd3\xf2\x8a\x7e\x76\x9c\xea\x5e\x70\x46\x2f\x5a\x7e\xbc\xf3\xdf\x14\x43\x34\x2e\xab\xa0\xe9\x69\x3d\x1d\xa5\x69\x3d\xad\x6b\xc1\x81\xfc\xab\x39\x59\xd7\xd1\xb3\x93\x34\xeb\xca\xfa\xf9\x15\xbf\xe4\xf9\x96\xaf\xbb\x8e\xa6\xbb\xe9\x28\xd5\x74\x33\x6e\xc5\x7b\xe3\xbd\xf1\x99\xe0\x6a\xf0\x6f\x9e\x96\xdc\xac\xe3\x3a\x93\x54\x77\x55\xd3\x2b\xab\x96\x67\xf9\x9e\xe5\x5b\xbe\x25\x1f\x8e\x9b\x42\x17\xba\x6c\x66\xf9\xdf\x31\x5d\x47\x0f\xbe\xbb\xba\xa3\x07\xdf\xd3\x6e\xda\x2d\x97\xe6\x69\xf0\x84\xef\xa9\xc2\x2a\xb9\x6a\x7c\x86\x96\x4b\xae\x23\xf3\xf3\xcb\x59\x4f\x8f\x7b\x7e\x39\xeb\x78\xa6\xb0\xbc\xb2\xeb\x99\x71\xcf\xcf\x96\x3d\x61\x79\x7e\xd6\xb5\xe2\x96\xe7\x7b\xb2\xb6\xaa\x19\xb7\x4c\xaf\x9c\x75\x5c\x4f\xd6\xd3\x2f\x67\xe5\xad\x96\xa9\x7b\x7e\xf0\xd0\x0c\x95\x1f\x96\x57\xce\x96\xad\xb8\x55\xce\xba\xbe\xe3\x5a\x66\x90\x74\x27\xb1\x72\x7a\x92\xca\xc4\x2b\xbe\xab\x06\x03\xc2\xb4\x7c\xd7\x51\x4d\x61\x95\x5d\x55\xe6\xac\x7b\xb2\x3a\xda\x38\xcd\xba\xb2\x4b\xfc\x8a\x2a\x33\xf2\x4a\xae\x13\x37\x2d\x33\x4a\x83\x61\xe1\xab\x96\xe7\xbb\x9a\x2a\x86\x64\x1d\xb2\x4e\x94\x16\xad\x72\x69\x24\xc8\x38\x4a\x83\x0f\x55\x37\x8b\x43\xd4\xab\x94\xb3\x6e\xd6\x55\x85\xe5\x97\x5d\x47\xd5\x85\x17\xf7\xca\xd9\x49\xea\xc5\x4d\xdd\xc9\xba\x65\x79\x21\xed\xaa\x5e\xd1\xd4\x1d\xcb\xd4\x2d\x53\xf6\x50\xda\xcd\xba\xd9\xb2\xef\x59\x45\xd9\xf8\xc3\x45\x2b\x3e\x43\xfd\x37\x2e\xc9\x0e\x29\xfa\xaa\xe5\xbb\x65\x47\xd5\x3b\x55\x95\xdd\xe0\xea\x23\x7a\x31\x38\x52\x65\x6b\xc9\xfa\xcb\xf6\x29\xb9\x8e\x19\x1f\xa2\xba\x93\x9d\xa4\x7a\xd1\x2a\xca\x07\xdc\xb2\x93\x1e\x36\xe3\x96\x97\x55\x87\xa8\x6c\x9a\x4e\x6e\x9e\x2f\x87\x58\xb6\xec\xc9\x0e\x99\x94\x23\x61\x44\x76\x86\x6c\x3f\xab\x5c\x72\xb2\x23\x72\xa4\xca\x42\x8f\x08\xdd\xf2\x7c\x27\xed\x8e\xc4\xad\xb2\x2b\xbf\x97\x4b\x6e\xd9\xb3\x64\x65\x77\x13\x72\xe5\xa7\x1f\x1c\x76\x4a\x23\x3f\x2b\x7e\x76\x92\xca\x71\x16\x74\x93\xaa\xc7\x2d\xd9\x3a\x9d\x27\xe4\x61\xa7\x3b\x4c\xbd\x33\x0d\xbd\x52\x90\x8c\x7c\x7a\xc4\xf2\xca\x8e\xec\x1d\x4f\x0e\x62\xbf\x22\x13\xce\x96\x55\x5d\xd6\xcc\xf4\x8a\x7e\xa5\x5c\x29\xbb\xb2\x79\x82\x26\xf0\x3b\x89\xc6\x4d\xcf\x4f\x4f\xd2\x4e\xf2\xd9\x20\xa5\x72\xc9\x95\x8d\x1d\xb4\xbd\xd3\x69\xa7\xa0\xbd\x86\xa8\xa9\x9b\xd6\x6e\x3b\x0c\x51\xaf\x28\x07\x8e\x6c\x1f\xc7\x55\xcd\xa0\x5d\x2c\x39\xdf\x64\x1e\x32\xfd\x92\x9c\x2c\xf1\x4e\x75\x3b\xdf\xfc\xac\x1b\x14\xa6\xe2\x67\x5d\x35\xb8\x27\xab\xca\x11\x35\xac\x0b\x4b\x77\xe4\x5d\x49\x2a\x57\x1d\xd7\x49\xcb\xe1\xee\xfa\x9d\x9c\x7d\xcf\xaa\xf8\x6e\xd0\x52\xae\x5f\x94\x8f\x8f\xe8\x71\x4b\x8e\x10\x37\x18\x4b\x32\x2d\x59\x43\x99\xaa\x7c\xc2\x93\x43\xda\x51\xe3\x5e\xa7\x92\x69\x35\xee\x05\xb3\xc5\x32\x3d\x57\x95\x83\xdc\xd5\x92\x54\xc8\x6a\xca\xba\xb9\x96\x69\x75\x9a\x59\x36\xac\x2e\x2c\xd3\xab\xc8\xee\x0a\x6a\x1f\x9c\x75\x1d\x61\x79\x15\x3f\xed\x3a\x6a\x30\x31\xe5\x62\x99\x9e\xa4\x9d\xa9\xed\xe9\xc1\xb8\x2b\xcb\x69\x17\x4c\xb1\x6c\x30\x59\x3d\xd9\x9e\xb2\xbf\x83\x9e\x95\xed\xea\xf8\xbb\x13\x4c\xde\x26\xcb\xea\x09\xab\xe2\xcb\x52\xc9\x11\xe0\x96\xbc\xe2\xbf\xd5\x76\x96\x76\xfa\x46\xce\x0c\x7f\xb7\x77\x83\xe9\x27\xbb\xc0\x35\x83\xd9\x90\x76\x2d\x61\x15\xe5\x60\x94\xf3\xd9\xcf\x5a\xba\x2c\xa5\x2c\xb9\x1c\x2e\x9a\x6e\x5a\x95\x72\xda\x95\xed\xde\x29\x9f\xeb\x04\x75\x92\xa5\x93\xb5\x29\xb9\x7a\xdc\x92\xa9\x2a\x17\xb4\x88\x6a\xc5\x38\x8b\xf0\x18\x0a\x83\x66\xc3\xc8\xf0\xf5\x5f\x4b\x9a\x0a\x63\x47\x58\x34\xac\x86\xbd\x79\xa6\xfc\x92\x0a\x4c\x0b\xe9\xa0\xc5\x68\x77\x9a\x8d\xf7\x8d\x44\x92\x68\x09\x01\xc6\x90\xc6\x22\x53\x91\x7e\x4a\xc7\xa2\xba\x12\x63\x91\x1e\x4b\x4b\xe7\x58\x52\x6d\x3f\xaf\x31\xb5\xfd\x96\xd2\xe0\xa0\x60\xfa\x8b\x88\x10\xc2\x68\x4e\x0d\xa9\x9a\x15\x52\x99\x1a\xd2\xe2\x21\x55\xd3\x92\xf4\x8a\xc6\xba\xba\x51\x68\x1a\x32\x9e\x60\x0a\xa5\x03\x3d\xb1\x3d\xfd\xa9\x6b\xbf\x1c\xcb\xb1\x21\x8b\xfd\x3b\x8d\xc5\xc2\x2c\xcc\x86\x78\xb4\x5b\xd5\xbb\xf9\x08\x6a\xa1\x34\xaa\xed\x8b\x1a\x6a\xf4\x20\x26\x50\x33\xbb\x00\xf8\x67\x54\x1e\xe3\xdf\x1c\xb3\xd8\x7d\x59\xf6\xf8\xc7\xac\xf9\x23\xb1\x3d\x13\x85\x9c\xd5\x9d\x8f\x6c\x8d\xeb\xb7\x22\x3f\x9a\x4b\x0b\x7d\x30\xba\xd0\x37\x78\x9b\xe5\x54\x94\xe8\xa9\xd5\x33\xf9\xc7\x73\xdd\x8b\xa3\xc7\xcf\xfe\x30\x2c\xfe\x56\x61\xd1\x7d\xa1\xe8\xf0\x5d\xd3\xa9\x23\x07\xab\xe7\xfb\x9f\x32\xba\xd4\xff\xb8\xbf\xf7\xfe\x13\xe6\xa5\xf0\xd5\x07\x62\xb9\x5c\x78\x8f\xf7\x93\x57\xc2\x21\xe5\x02\x7b\xfd\xbf\x84\x73\x91\xd8\x50\x7f\x38\x85\x8c\x85\xd2\xb5\xb1\xbe\x5c\xe4\x2c\x67\x61\xc6\x62\x9a\xb8\x2b\x16\x62\x0a\xc7\x50\xe1\x64\x9f\xe0\x7d\xec\xac\x15\x56\xe9\x93\x62\x68\x24\x35\x62\x1d\x1e\x52\x4e\xee\x19\x7f\xfd\xa3\xd5\x2e\xac\xe1\x67\xdd\x81\x70\x35\xce\x4a\x71\x96\x19\x38\x39\xa7\x4d\xd7\xbc\x18\x9b\x88\x4d\xc7\xd4\xe1\x68\xff\x48\x38\xa4\xb0\xd1\x6e\xc6\xda\x8d\xee\xc1\xf4\x9e\x70\x38\xe7\xc5\x98\x3b\x68\x75\x4d\x32\x96\xab\x6d\x65\xd5\x74\xed\x95\x71\x96\x8e\x24\x63\x3d\xc8\x98\x18\xca\x1a\xa1\xf1\x88\xa3\x6a\xa1\x48\x38\xa7\xa9\x5d\xc0\x5e\x3f\x32\xa1\x29\xd3\x85\x42\x25\xc6\x7e\x6b\x62\xfc\xda\xb0\x16\x8e\x7c\x4a\x84\x87\x22\x61\xcd\x9a\x1f\xf1\x4d\xf8\xd9\xa1\x18\x2b\x7c\x7a\x68\xfc\x68\x4e\x0d\x8d\x76\x5f\xb3\xa3\x4c\x41\x0e\x4f\xf7\xe5\xac\x54\xd7\x0b\x5a\xf7\xc0\x4f\x7e\x20\x98\xe2\x68\x49\x35\xc6\xfe\x2e\xa4\xa5\xc3\xcc\x62\x16\x26\x7f\xf2\xfd\x71\x36\xc2\xe0\x4f\x58\x6c\x0a\xa1\xf7\x35\xb6\x87\x69\xe9\xf0\x4f\xbe\x5d\x61\xe1\x1c\xfd\xd9\x90\x15\x63\x2c\xc9\x62\x23\xa1\x7d\x43\x96\xa8\x4d\x5b\x43\x61\xd3\x6d\xce\x4c\xd2\x3b\xd6\x93\x42\x4d\xa5\xd5\x4f\xce\xb7\x1a\xfd\x21\x27\x3c\x9e\xd0\xbb\x5e\x9f\x9b\x57\xa7\x55\xfa\xb3\x7d\x13\xda\x10\x5a\x4c\x55\x99\xf2\x28\x8b\x5a\x38\xd2\x7e\xbe\xa7\xcc\xb4\xfd\x31\x73\x6c\x84\x4d\x6b\xfa\xb0\xc6\xb4\xd4\x60\xa8\x12\xce\x69\x4c\xad\x30\x5d\x99\x51\xba\x15\xb8\x16\x3a\x8a\x4c\x0b\xfb\x61\xa6\x1e\x65\x23\x0c\xa7\x23\x18\x9d\x61\x35\x16\x6b\x30\xbd\x4f\xeb\xff\xc9\x78\x38\xd1\x75\x4d\xb0\x23\x9a\x31\x4b\x2f\x85\x5a\x0c\x95\x9e\xb8\x92\xea\xb1\x47\x3e\x33\xad\xf0\xa9\x50\x85\x45\x0a\x32\xb5\x50\x45\x65\xd3\x91\x4a\x88\x25\x92\x0c\x27\x94\x50\x7f\x3c\xc9\xaa\xba\x60\xf9\xe5\x96\xa6\xb2\x70\xfb\xa3\x91\x54\x31\xe4\xb8\x0a\xdb\xaf\xa9\x27\xda\x8b\xe9\x9b\x99\x36\x3f\xae\x1e\xd4\xe2\x53\x19\xee\xb5\xb4\x13\x21\x4d\xb0\xd7\x34\xc6\x5e\xff\xaf\x4c\xed\xe7\x6e\x32\x7c\x36\x37\x93\x8e\xbf\x7e\x41\xe9\xcd\x26\x42\x3d\xfa\x78\x42\x99\xaa\xf1\x5e\x7a\x69\x8f\x76\x4a\x63\x53\x19\x95\x1d\xd5\xd4\x48\xff\x98\xca\x8e\x32\xcd\x98\xd5\x16\x58\x43\x57\xda\x69\x76\x84\x69\x07\x74\xf6\xae\xa1\x7e\x0d\x2b\xd7\x7a\xfb\xe6\xfb\x35\x2b\xe2\xcc\x31\x65\xca\x52\x34\xa8\xa3\x9f\x10\x8d\xd4\x10\x33\x23\xcc\xea\xbf\x34\xa7\x69\xd3\x7c\x24\x5c\x62\x91\x1a\xe3\x09\x31\xce\xc2\xd3\x4a\x4f\xef\x58\x4c\x0b\x0d\xb8\x43\x7d\x82\x73\x35\x5a\x68\x7f\x58\x15\xfb\x42\xea\xc9\x76\xa5\xdf\x62\xd1\xf0\x34\x0b\x97\xd4\x87\x7b\xc6\xb4\xd0\xb4\xa2\x09\x2f\x59\xc3\x69\x2d\x52\x63\x6c\x5e\x53\x6b\x1a\x9b\x8b\x56\x50\x4d\x09\x1e\x6f\xaf\xb3\xc4\x78\xb7\xd1\xeb\xb7\xe7\x54\xa6\xd2\x5f\x60\xa1\x58\x85\xe1\xb8\xdb\xbe\x4b\x65\x5a\x4c\xef\x0d\x6b\xf4\xec\x98\xa5\xb1\x70\xac\xa6\xb5\x7f\x26\x14\x8f\xb0\xb1\x31\x8d\xd1\xe9\x11\x2d\x52\x08\xc5\x22\xed\xe7\x55\xce\x62\xe9\x10\xa3\x7f\x1b\x0a\x79\x9a\x36\x17\x3a\xa8\x38\xcd\x7d\x47\x19\x6b\xc4\xb4\x9e\xaa\x76\x44\x6d\xb0\x64\xa2\x7b\x56\x6b\xff\x2f\x8c\xe6\x62\x6a\xf2\x73\x43\xe1\x3d\xfd\x9a\x86\xbc\x6f\xbc\xb6\xa7\x02\x46\xac\x67\x3c\xc9\x94\xd1\x6e\x6d\x3c\xc1\x56\x7b\x54\x8d\x79\xec\xb0\xca\x2a\x22\x64\x0e\x2b\xe2\xfd\x69\x8d\xf5\x3f\x55\x88\x31\x2d\x1f\x7f\x7f\xac\xbb\x2b\xc4\x96\x42\x89\x1c\x86\xe6\x18\x6f\x32\xd6\x8a\xe8\x87\x34\x86\xfb\x99\xa2\x63\x53\x3b\xca\xb0\x60\xb1\xf6\x2f\x58\xd3\xda\xf4\x74\x44\x53\xbb\xea\x2d\xa1\x8f\xf6\x9f\x51\x75\x85\xc3\xc7\x62\xa7\x98\x38\x55\x3a\xc3\xd5\x93\xd1\xbe\x33\x31\x7d\xb1\x6b\x98\x1e\xe2\x2a\xe3\xec\x66\x36\x76\x58\x63\x87\x99\xba\xc0\xc6\x60\xa9\xe6\x0f\x68\xe6\x0c\x53\xff\x4e\x3b\xc2\x34\x06\x10\x62\xac\x7f\x81\x86\x18\xa2\xa6\x85\x18\x32\xc6\x96\xb4\xf0\x74\x24\xc2\xb4\x48\x58\x60\x45\xeb\x8f\x45\x35\x55\x55\x58\x48\xed\x8d\x44\x13\x61\x47\x70\x74\x72\xc2\x8a\x59\x11\xc6\xb4\xf1\x91\x90\xd6\xa5\xef\x19\xd3\x34\x8d\x45\xb4\xf0\x78\x4a\xc9\xa9\x56\x92\x45\x44\xba\x7f\x24\x87\x11\xe4\x31\x4b\xa6\x13\xc9\x31\x75\x62\x88\x55\xb4\x2e\x9b\x0d\x69\xd0\x6b\xc5\xc2\x39\x2d\x66\x2a\xac\x2f\x06\xbd\x89\x09\x4d\xcb\x8d\xc4\x78\x1a\x2b\x0c\xfb\x51\x4d\xb2\x90\x1a\xe3\xa9\x98\x13\xd6\x62\xa1\x88\x85\x0c\xc2\x4c\xc4\x98\x16\xb7\x72\xad\x87\x2e\x45\x7b\x06\xfa\x92\x53\x4f\x4e\xef\x0c\x9d\x3b\x91\xc9\x7a\x7c\xc5\x1c\x3b\x15\x3d\xc6\x5e\x7b\xf5\xdb\x6b\xbf\x32\x1e\x67\xe9\xf7\x17\x1f\x11\x82\xa9\x43\x0c\x99\x52\xb8\xb4\xd2\x54\x97\xb6\x6e\x6d\xbf\x3e\xd1\xfe\xf8\xdc\x7f\x38\x1f\xfd\xe8\x4a\xf6\x97\xf5\x67\x96\x44\xfc\xb3\xef\x0c\x8d\xc4\x18\x7b\x54\xd3\xc2\x4c\xbe\xb4\xe0\x2f\x43\xcc\x76\x4d\xc6\xd8\xff\xfe\x52\x14\x45\x51\xe7\xa2\xe1\x6e\x60\x9a\xc6\x98\xa6\x85\x6c\x3b\x3a\x8c\x07\x99\xb6\x9f\x85\xa6\x0c\x85\x1d\x64\x87\x15\x6d\xbf\xa6\xcf\xb0\x83\xec\x20\x9b\xe6\xa6\xa7\x95\xbb\xd9\x01\x79\x81\x85\xe2\xfd\x61\x65\x3f\x63\xbc\xca\x98\xd2\x3f\xae\x19\xa3\xb2\x58\x07\xb5\x79\xb6\x3f\x54\x63\xe5\x6e\xf9\xbf\x3f\x11\x62\x8c\xb5\x98\x56\x8a\x1b\xa3\x1a\xa6\xc2\x2c\xa6\x72\x16\x2a\x30\x6d\x3a\x5c\xd1\xf6\x0d\x31\x31\x14\x1e\x8f\x09\x16\x4b\x6a\xd8\x77\xff\x3d\x89\x9a\xc6\x27\xb4\xb9\x34\x53\x22\x66\x2c\x36\x12\x1d\x7c\x90\xed\xef\x63\x11\x7c\x29\x36\x14\x8e\x85\xb5\xb8\x15\x4b\xab\x36\xe6\x98\x95\x66\x09\x8b\x09\x4d\x63\x21\x2d\x11\xe9\x8f\xa5\xc2\xe3\x18\xd5\x23\x21\x33\x11\xb5\x6d\x16\x4b\x6b\x4a\xb2\xc2\x12\x7c\xac\xa4\xb3\xb4\x60\xa2\x2b\x1f\x99\x50\xad\x5f\x8d\x84\x3e\xcd\x94\xd3\x0b\x7d\x0d\xf7\x13\x0f\x86\x34\x56\x3b\x37\x1c\xbb\x52\x63\x21\xfc\xca\xcd\x67\xc7\x3f\x7c\xf3\xce\xfd\xfb\xc2\xfb\xb5\x79\xd9\x5c\xf3\x6c\xac\x4b\x4d\x8c\x68\x8c\x89\x14\x73\xbb\xd8\xf0\x01\xed\x16\x5d\xeb\xdd\xcf\x19\xcb\x94\xb4\x1e\x37\xa6\x64\xa6\xb4\x54\x05\x19\x3b\x12\xd3\x74\xbd\xfb\xc0\x59\x4d\x63\xca\x49\x35\xca\xee\x4e\x6a\xec\x44\x77\x77\xd7\xe9\x88\x76\x33\xd2\x39\xb5\xc2\x22\x56\x2e\xa4\x78\xc0\x92\x06\xbd\xbd\x8b\xf1\x5b\x34\xc6\x23\x2b\x23\x6e\x6e\x38\xa4\xe4\xde\x79\x58\x63\x5d\x7e\xa8\x86\xa1\x52\x44\x99\x41\xb6\x5f\xd1\xe6\x99\xb6\x8f\x6b\x9e\x19\x9a\x8e\xb1\x42\x4f\x24\x94\x16\x91\xc1\xe5\x87\x63\x2a\x17\xb5\xbe\x83\x2c\x62\x1f\x60\xac\x25\x56\xd9\xc4\x89\x28\xdb\xa7\xf8\xaa\x76\xc4\x36\x46\xab\x91\xfd\xda\x59\x55\x3b\xab\x19\x4d\x8d\x47\x42\xa1\xcf\xdd\xf0\xc8\xa3\xee\x8d\x2c\x2d\xf6\x76\xff\x36\x63\x7b\x36\xf7\xe3\xc8\xc1\x95\x77\xcf\xb2\xf4\xc9\xb1\x8f\x7f\xe4\x8c\xd0\xa6\xd3\x4c\x3d\x1c\x4e\x8c\x17\x98\xb6\x14\x1f\x38\xc4\xb4\x93\xa1\xde\x1b\xc3\xfd\x87\x7a\x58\x4b\xe3\x15\x2b\xc4\xf6\x45\x7b\x6e\x9a\x4d\xaa\x21\x96\xd0\x0e\x24\x0f\x19\xac\x26\x30\xda\x08\x15\x27\xef\x60\xc8\x84\xd0\x04\x3b\x8c\x2d\xc8\x37\xa3\x46\x4d\x22\x12\x0d\x0f\x86\xc3\xa9\xf9\x48\xc4\x2a\x0c\xb1\x42\x3f\xea\xdd\x5d\x07\x42\xb9\x53\x89\xf3\xb1\x50\x8c\x59\x91\xee\x03\xac\xda\xf5\xce\x10\x0e\x8e\xa9\xfb\xd0\xf1\x46\x8e\x86\xf6\xc7\x58\x0b\xd9\x11\x85\x1f\xd5\x1a\x91\xd0\x61\x2c\x08\x3d\xeb\x0b\x31\x6d\x59\x78\x30\xc2\x34\xa6\xa5\x45\xd2\x63\xa1\x6a\x96\xc7\x55\x66\xf4\xb0\x91\x5c\x45\xd3\x58\x78\x5e\xe4\x22\x21\x56\xeb\x47\x8c\xe5\x34\x6d\x82\x8d\x30\xc1\x38\xaa\xdd\xba\x08\x85\x14\x25\x14\xea\x15\xbe\xa2\x1d\xc6\x9e\x23\xca\x68\xd7\x89\x63\x37\x23\x6b\xc5\xf8\x11\xa6\x9e\xe8\x3e\x27\x0e\x9f\xcc\xc9\x7e\xd5\xac\x6f\xfc\x7c\x43\xd3\x42\xa1\x50\x6c\x3e\x16\x63\xfb\x19\x1b\x17\x4c\x75\xb3\x8c\x79\x6a\x85\x6b\xfb\x98\x9a\x1d\x4e\xa5\x95\x90\xa6\x15\x14\xcd\x09\x33\x36\x1f\xd1\xa6\x63\x61\xa1\x46\x58\xe8\x05\xe5\x2c\x6a\x63\x39\xed\x48\x58\x5b\xe0\xec\x98\x1e\x65\xd1\x05\xa6\x29\xc7\x99\xd2\x73\x2b\x53\x4f\x59\x47\xfa\xd2\xcc\x88\x4e\x33\x6d\x4a\xb3\x87\x63\xfd\x87\xc7\xbb\x93\x13\xda\x61\x96\xe4\x18\xb3\x22\x27\xb8\x71\xa6\x76\x4a\x0b\x75\x1f\xc5\x34\x3b\xdb\x65\x2c\xb1\x5c\x78\x9f\x08\x6b\xa1\xe3\x6e\x8b\xa9\x47\x34\xed\x4c\x1f\x0f\x2d\x4d\xdf\xaa\x68\x4e\x95\x58\x84\x10\xa2\x2c\x68\x35\x32\x40\x2a\x64\x8e\x34\xc8\x8d\xe4\x04\x59\x21\x6b\xe4\x71\xf2\x0e\xf2\x1e\x72\x85\x3c\x4d\x9e\x25\x5f\x20\xbf\x46\xbe\x49\xfe\x92\xfc\x84\x32\x8a\x34\x4a\x4d\x42\x68\xdc\x8a\x5b\xba\xa9\x49\x82\xab\x99\x9a\x29\x79\x84\xe4\x59\xe5\x5e\xc3\x67\x92\xfb\x4b\xf2\xc5\x84\x57\x29\x07\x74\xd7\xf5\xb3\x8e\x64\xcb\x34\x80\xda\x25\xd7\xd2\x3b\xcc\x2e\xc0\xd8\x81\xae\x50\x76\x25\xe7\xf3\x02\x0c\x2b\xe9\x4f\x94\xc6\x83\x3b\x75\x09\x6d\xfd\xec\x2e\x3c\xf6\x03\x98\x1a\xa0\xde\x74\x70\x47\x51\x32\x85\x62\xe7\x96\x80\x39\x94\x4b\xae\x16\xa5\xa6\xb0\x24\xe7\x30\x03\x61\x60\x92\xea\x71\xab\x28\x51\x79\x00\x80\xcb\x93\x92\xe4\x4b\x70\x2e\x93\x14\x96\x04\xe9\x92\x08\xa6\xdd\x92\x17\xe0\x7d\xcb\xab\xcc\xd3\xac\x63\xc9\x74\x7d\x49\x2e\x77\x19\x8f\x1f\x1f\xa2\x32\xd5\x28\x35\x03\x62\xa8\x07\x2c\x31\xc0\xd4\x12\x9b\x7b\xbe\x4b\x17\x46\xce\xad\x1b\xd8\x13\xcf\x77\x45\x84\xe0\xf6\xf0\x61\x23\x79\xa6\x94\x7b\xfe\x32\x20\x20\x00\xe4\x73\xf5\xa1\xee\xda\xa2\x01\xe0\xdc\x50\xf6\x32\x48\x31\x9c\x6c\x00\x6c\x70\x5c\xc6\x89\x19\xbc\x55\xc7\x65\xb1\x04\xb0\x64\x27\xfa\x8f\x20\x2c\xe3\x12\x2e\xe7\xb0\xe7\x66\x80\xd5\x52\x74\xa4\x00\x38\x39\x81\x30\xec\x23\x5f\x8f\x64\xc7\xf6\x72\x67\x36\x14\xc5\x16\x07\x0e\x07\x92\x89\xf0\x44\x1e\x80\xdd\xc6\x39\x2e\xc3\x32\x47\x58\xc1\xc8\x03\x4b\x1c\x6b\x09\x88\x1f\xb2\x62\x46\x0b\x6a\x4d\x83\xb7\xf8\x05\x03\x13\x29\x5b\x40\x4f\x7c\xcd\x8e\x44\x8e\xed\xeb\x79\xd8\x35\x17\x8d\x7c\x09\x8a\x63\x60\x67\x16\x13\xf6\x8a\x40\xed\x5e\x0e\xb8\x0d\x90\x59\xe3\x03\xc3\x35\xdc\x7b\x24\x8f\xfa\x43\x7c\x23\xb3\x05\xb8\x9d\x38\x1b\x07\xdc\xaa\x21\x20\xd7\x6a\x74\xfe\xe4\x84\xdd\x78\x60\xef\xd7\x95\x39\x5e\x1d\xdc\x73\x71\x29\xb7\xd3\x77\x8c\xae\xd0\xf7\xbd\xaf\xfd\x0c\xcf\x88\x3c\x80\x48\xb4\x37\x4b\xd6\x48\x63\xf3\x8f\x7e\xdc\xe4\xb9\x0d\xeb\xc9\xdb\x4f\x50\xac\x2d\xa5\x9c\xe3\x8d\xdc\x9a\xdd\x4a\x14\x56\x6c\x63\x6d\xd1\x58\x13\xc6\x72\x7e\x69\x23\xb1\x86\xb8\x8c\x3c\xb5\xbc\x9a\x19\x3f\x2e\x06\x1f\x78\x2e\x34\x53\xcd\xdd\x38\x05\x38\x74\x3c\xbf\x65\x3c\xed\x9e\x62\x49\xac\x36\x1a\xb9\xdb\x06\x52\x6b\xf6\x6a\xb3\x20\x7a\x1e\x56\x4e\xf4\x9e\xe7\x62\x1d\x0a\x80\x83\xa7\xb9\x93\x84\x15\x04\x68\xda\x30\x35\x93\x5b\xcd\xf3\x35\x58\xe5\x9f\x42\x50\xba\x40\x80\x7e\xdb\xc4\xf8\xf2\xce\x85\x4f\x6d\x42\x6f\x39\xf7\x58\x7a\xe8\xe7\xab\x76\xe6\xc2\x36\x70\xde\xfb\x90\x0d\x17\x45\xdf\xbb\x40\x9b\xab\xf3\x73\xe5\xcb\x36\x6c\xe2\xbb\xbc\x6d\xdc\x4e\xe1\x26\x6e\x5e\x40\x44\x24\xfd\x84\x28\xdf\x54\x5e\x53\xdf\x4b\x0a\xe4\x10\x39\x4b\x1e\x20\xef\x22\xef\x25\x1f\x22\x1f\x27\x9f\x24\x9f\x23\x5f\x22\xff\x95\xfc\x1e\xf9\x13\xf2\x17\xe4\xfb\xe4\x1f\xc9\x4f\x68\x88\xc6\xa8\x49\x93\x34\x43\xc7\xe9\x1e\xea\x11\xd2\x5b\xb4\x24\xbd\xf5\x4a\xbe\xfc\x12\x37\x85\x1c\xa1\x43\x34\x18\x77\x92\xc1\x3b\x9a\x93\xed\x68\x14\x6e\x39\x10\x88\x98\x1c\x55\x95\x72\x69\x92\xfa\x6e\xc9\xaf\x48\xce\xa8\xe9\x9a\x6a\xe9\xf1\x19\x5a\x94\xac\xbf\xe4\x57\x66\xa9\x1b\x08\x50\x66\xda\xd5\x8b\x6f\x68\x03\x66\x40\x56\x75\x39\xaa\x83\x21\x2b\xd9\x77\x65\x96\xea\x4e\xd6\x4d\x97\x77\x95\x87\x91\x78\x20\x30\xa4\x25\xbd\x94\x53\xa9\xec\x48\x76\x5b\x76\x1d\x5d\xb5\x74\x37\x18\xc8\xda\x48\x5c\x32\x69\x47\x37\x3b\x8a\x8c\xa3\xea\xf1\xa4\x9c\x9f\x92\xa7\x96\x5c\x75\x57\x02\x72\x4b\xbb\xec\x5c\xf2\xe3\x8a\xcc\x59\x0b\x44\x9a\xa2\x1f\x94\x21\xb8\x45\xdd\x25\xb1\xe5\x92\xcc\x22\xd0\x08\x02\x2d\xc4\x2a\xfb\x9d\xe9\x28\x99\xbd\x57\x9a\x0c\x48\xb1\x57\x76\x87\x68\x59\x4e\xa6\xf2\xf7\xf7\xcf\x75\xf7\xc2\xed\x73\xa2\x3f\xbb\xc2\xf9\x7a\xa6\x8e\xce\xa8\x91\xeb\x7b\xbb\x01\x7d\x43\x93\xd3\xa7\x0e\x40\x26\x05\x20\x4a\xd6\xf1\xc4\x0b\xe1\x7d\xb8\x51\x07\x80\x35\xbb\xab\x9f\x9f\x99\xae\xd1\x2a\x80\x9d\x10\xc7\x87\xb0\x0a\x9b\x36\xf2\xd2\x4d\x83\xf6\x50\x59\x44\x0f\x62\x1d\xc0\xc0\x1c\x2d\x65\x5a\x02\x8c\x5b\x19\x60\xa1\x04\x1c\x78\x72\x06\xa1\x90\x49\xb5\xf3\x33\x49\x68\x85\xc6\x2b\x7b\xf8\xa2\x41\x0b\x76\x93\x2f\x23\xb4\xaf\xec\xa0\x9d\xe0\xb8\x2d\x68\xd3\xae\xf7\x28\x4b\x3c\x97\x6f\xac\x40\xfb\xeb\xd0\x48\xa5\x78\x4b\x2c\xd0\x25\xe3\x9e\x30\xcc\xed\xb1\xdb\xdf\x06\xdc\x40\xdc\xa6\x76\xd7\x5d\x7c\xb3\xfd\x75\x23\x7a\x34\x83\x21\xb6\x43\x05\x6c\x02\x4e\xfb\xed\x67\x8b\x7b\x0d\xec\xbf\xd9\x40\xa0\x3c\x7d\x1a\x71\x1d\xed\x57\xf8\x0b\xb0\x8d\xf8\x58\xfb\x4f\x96\x61\x01\xab\xce\x34\x2c\x3e\x8f\x68\xa0\xfa\xde\x66\x64\xef\xb6\xae\xd6\x8e\x7b\xa1\xde\xca\x60\x42\xd8\xab\xf6\xb3\xf6\x16\x5f\x4e\xf5\x9d\x8b\x0d\x95\x1d\x03\xe0\xea\x6a\xa1\x99\x69\x2f\x1a\x8b\x53\x67\xf2\x55\x61\xf3\x89\xc3\x4e\x32\x35\x7d\xc7\xfb\x6f\x13\x89\xc2\x86\x77\x30\x37\x78\x7a\xa8\xcf\xc6\x68\xa8\x5a\x1d\x19\x7a\xbe\xda\xe2\x78\xb0\x17\x90\xc3\x60\x24\x57\xe8\x3b\x83\x06\x7f\xa2\x07\xea\x4d\x10\x00\xfd\x77\x71\x48\xc0\x91\x41\x48\x15\x96\x00\x12\xcd\x02\xdc\x34\xa6\x0c\xc2\x12\xc7\xb1\x13\xb8\x05\xa5\x0b\x88\x90\x6b\x5c\xea\x52\xf2\x2d\xc4\xcd\xbc\x3d\x60\x36\xa1\xb4\x9a\x48\xcc\x94\x8d\x7c\xfc\x04\x07\xfd\x86\x95\x6a\x62\x03\x32\xb9\x25\x6e\x2c\xd8\x5b\xa9\x8d\xcc\x9e\xdb\x41\xd8\x2b\x10\x8b\x2e\x27\xc4\x05\x9b\x1b\xdb\x08\x73\x37\xe5\xf1\x50\x11\xb3\x47\x10\x01\x45\xf9\x24\x5e\xe0\x28\x97\xae\x60\xa9\xb9\x60\x44\x4e\x63\xcb\x00\x98\x76\x60\x39\x8f\x68\x80\xe0\x24\x2f\x6d\x13\x94\xb4\x3c\x39\x41\x9e\x23\xcf\x93\xff\x44\xfe\x0b\x79\x91\xfc\x5f\xe4\x15\xf2\xcf\xa4\x4d\x55\xda\x4d\xb3\x74\x82\xee\xa5\x2d\xfa\x00\x7d\x0b\x7d\x3b\x7d\x27\x7d\x2f\xfd\x04\xfd\x2c\xfd\x3a\xfd\x03\xfa\xc7\xf4\xaf\xe9\xdf\xd3\xd7\x14\xa2\xe8\x8a\xa1\x4c\x2a\x15\xe5\xb8\x72\x87\xf2\x98\xf2\x76\xe5\x03\xca\x2f\x2a\x9f\x55\xbe\xac\xfc\x86\xf2\x75\x42\xa8\x17\x48\x8a\xf3\xd4\x2b\x76\x66\x65\x20\xd8\x98\xe9\x28\x15\x56\xa0\x22\xbb\x69\x33\xd0\x78\x3b\xb3\x54\xda\x37\xb7\x1c\xcc\xc7\x59\x5a\xf2\x8b\xf3\xd4\xd5\x9d\xec\x2c\xf5\x83\x93\x9e\xb4\x46\x15\xe6\xa6\x75\xcd\x8c\x7b\x56\xa0\xe1\x6a\x81\xa2\xa6\x45\xa9\x65\xea\x81\xb5\xaa\xf8\x15\xaf\x68\x5a\x4c\x8f\x77\x0e\xfc\x60\xda\x64\xcb\x95\x79\x5a\xf1\x4b\x93\x54\x4e\x7f\x69\x72\x34\x5d\x1b\xa7\x69\x99\x4b\xc5\xcf\x3a\x81\xe4\xdc\x6b\x7a\xa5\x28\x95\x05\x76\x3b\x12\xaf\xab\x5a\x81\x56\xa9\x07\x07\x69\xdd\xb4\xfc\xb2\x6b\xe9\x66\xdc\x0b\x24\xee\x40\xa6\xca\xba\x4e\xc7\xf8\x4d\xd2\x60\x22\x4a\x7b\xe9\x58\xc1\x4c\x4b\xbb\x7a\x20\x38\x45\x95\x78\xa0\x06\xf9\x66\x47\xd8\xd2\x74\xcb\x2b\x79\x71\xab\x68\x06\x06\xce\x0f\x24\xbb\x60\x55\x89\x7b\x56\x39\x50\x00\xcb\xc1\xa3\xbe\xa5\x67\x27\x69\xa0\x61\x55\xfc\x72\xda\x75\x34\x55\xae\x69\x42\x0f\xaa\xe3\x59\xba\x5c\xec\xca\x6e\xd9\xb3\xe4\xd5\xb4\xab\x4a\xb3\x59\xf4\xb3\x8e\xda\xd1\xec\xdc\x4e\x39\xdc\x40\x0d\xf3\x5d\x55\x56\xad\xbc\xab\x66\x05\x4f\x94\xf5\xb4\x3e\x22\x0b\x27\xa1\x85\x13\xac\x57\xc1\x37\xdd\x14\x1d\x89\x4f\x76\x5f\xa0\x77\xe9\x1d\xd9\x36\x6e\x95\xf5\x8e\xf2\xac\x77\x44\xb2\x92\xab\x07\x4a\xa2\x15\xe8\xd4\x51\x6a\x76\x24\x4a\xdd\xec\x20\x06\x3d\x10\x4e\x77\x75\xb1\x8e\x12\xd8\x81\x1a\xb2\x78\x5e\xa0\x48\xba\x81\x3c\x27\xd7\x5f\x53\xf3\xcd\x00\x9a\x58\x66\xb0\xdc\xbe\x51\xd2\x8e\x44\x2b\xd7\x6a\x27\x1d\xa0\x95\xce\x4a\xdc\x11\x8b\xd3\xaa\x90\x4b\xbf\xbc\xdb\xb3\x3a\xda\xb5\xd3\x59\x19\x5d\x27\xad\x06\xc3\xa3\xfc\x6f\x0a\x5e\xd9\x55\xe5\x73\x81\xc8\x2a\x3b\xa0\xe2\x77\x04\x7d\x2f\xc0\x49\x6a\x50\x20\xc7\x95\xad\x1e\xa5\xa6\x15\xf7\xdc\x40\x47\x2d\x97\x14\x1b\x86\x8f\xb5\x70\x70\x8f\x01\xf9\xd2\xe5\x45\xc8\x58\xa7\x4a\x5d\x1a\xb6\xf8\x05\x91\xc7\xc8\xde\x3d\x45\x6f\x76\x05\xd7\x0a\x87\x87\x17\xa1\x56\x68\x5e\xec\x1b\xc8\x20\x64\x9a\x00\x85\xf4\x5e\xc3\x98\x19\xcd\xec\xd4\x32\x55\x3e\x74\x2b\x34\x97\xea\x83\x15\xa8\xd6\x10\x00\x0d\xd8\x7b\xbb\x30\x52\xb5\x05\x68\x80\x96\x2e\xd4\xdd\xbe\xf8\x5c\xa1\xb1\x90\x37\xbd\x56\x0d\xeb\x10\x1e\xa9\xc7\x2c\xe3\x70\x39\x55\x85\xcd\x8c\x30\xc2\xc3\xdd\xe3\x93\x23\xee\xbf\x08\x1b\xb1\x90\x80\xc2\xc0\x14\xec\x19\xa4\x46\xc1\xc0\x06\x24\x50\x79\x5b\xe8\x8f\x6c\x4c\x7c\x1d\x1f\xe8\x92\xab\x5e\xef\x6d\x88\xcd\x0c\xc2\xf0\x19\x9e\xeb\xbd\x07\xda\x5f\x9a\x1e\x02\x5d\xad\xdb\x98\x4f\xd9\xa0\x4f\x35\xb8\x0d\x21\x0b\x38\xee\x49\xa7\xd0\x78\x71\xcf\x21\xc4\x8d\xae\x2e\xe0\x98\x68\x71\x90\x38\x8a\x6f\xb7\xbf\x86\xa9\x14\x6d\xe1\xe9\x7e\x9e\x4a\x54\x01\x32\x62\x01\x38\xf2\xe1\x03\x06\xf0\xb7\xc7\xfa\x15\xe7\x36\xc0\xf6\xda\x3a\xba\xc3\x4b\xb5\x54\x0a\x80\xf3\x48\xda\xe9\x6e\x62\x13\xb0\x64\xea\x74\x45\xbf\x1f\x86\xd4\xc7\xad\xf6\x4b\x56\x37\x02\xa4\x5e\xcb\xce\xf1\xe5\xea\x8d\x53\x7c\xa7\xfd\x42\xcc\xca\xc8\xdb\xba\xc6\x12\xd0\xe7\x23\xa8\x51\x5a\x78\xb0\x8f\x03\xd7\xef\x41\xdd\xac\x36\x11\x12\xcb\x88\x0d\x80\x06\x42\xe8\x64\x9e\x9b\x0f\x62\xfb\x65\x2c\x60\x1e\x93\xd1\x85\x94\x4d\xaf\x00\xf4\xdc\x0b\xc0\x85\x3b\xcd\x9d\x53\x18\x3d\x98\x33\x20\x72\x16\xf0\xbe\x91\x25\xe0\x7c\xdf\x78\xe6\x4c\x08\x96\xa1\x79\xca\x05\xb8\x2d\xdc\xae\x9e\xd7\xf9\xd0\x34\x60\x0b\x17\x01\x44\x15\x78\x0b\xa1\x89\x33\x31\xcc\xc5\xdf\x6d\x03\xff\x52\xe8\x3e\x88\x9c\x00\x3c\xa2\x08\xbe\x0a\xb0\x82\xf9\x12\xb8\x53\x3d\x27\x0c\x58\x01\xe0\xa9\x12\xdf\xd0\xdb\x4f\xad\xe8\x26\xc4\x6f\xe6\x1b\x46\xb8\xaf\x92\x86\xda\x16\x18\xdb\xa0\xd1\xbb\x32\xdd\x93\xf9\x9e\x43\x08\x37\x0e\x03\xf0\xcd\xf6\xd2\x92\x30\x8c\x4d\x44\x18\x9f\x36\x7a\x94\x6d\xa8\xdd\xac\x85\x7a\x61\x8b\x6e\x16\x4f\x40\x0a\x6c\x9e\x2b\xd8\xbc\xd0\xf0\xfa\xb6\xe0\x25\x0e\x5a\xbe\x51\xf5\x26\xf8\xc2\xcd\x73\xc9\x4f\xd7\xf3\x89\x2b\xcd\x05\x03\x6b\x42\xa4\x1e\xae\x40\x22\x05\x5f\xb9\xd8\x5c\xbd\xbc\xfa\x78\x38\x87\x7b\x9f\x38\x16\x2b\xf7\x62\xcb\xde\xdc\x40\xe8\x73\xd0\x06\x48\x14\x72\x70\x6d\xb3\xbd\x0d\x8d\xf1\x64\x0e\x30\xf5\xf5\xde\xee\xbe\xf9\x8c\x0d\xb8\xff\xc3\x25\x43\xc0\x80\xfa\xfc\xc4\x7c\x2a\x63\xb4\xaf\xa5\xc4\xda\x89\xc7\xf6\xf4\x80\x73\x7c\x30\x22\x6a\x67\x6f\xcf\xd7\x4a\x79\x04\xa3\x50\x7f\x77\x7f\x57\x16\x73\xcf\x6d\x26\xa0\xe7\xb4\x7f\x5b\x29\xf1\xbd\x0d\x5a\xe7\x21\x33\x55\xb5\xd7\xa0\x9a\x01\xac\xd9\xb9\x02\xd8\x1c\x57\x84\x6d\xdb\xa3\xc7\x04\xd8\x88\x3c\x61\xc3\x26\xc7\xcd\xf9\xe3\x80\xfb\xe6\xc5\xcc\xd1\xd5\x1d\x10\xfc\x54\xaf\x98\x1d\x37\x60\xac\x87\x97\x52\x7d\xbd\xb6\x0d\x09\xbb\xa1\x75\x21\xe4\xf8\x5c\x05\x70\x9d\xe7\xc0\x2e\x35\x0d\x01\x29\x3b\x73\xd1\xb6\x11\xba\xfa\x2f\xa7\xd6\xc0\x28\x55\x01\x00\x9a\x91\xdb\xc1\x30\xba\xef\xe0\x1c\x76\xd2\xfd\xb8\xa1\xcc\x19\xfc\xdb\xe6\x00\x8a\x8f\xde\x07\xbc\x50\xb5\x85\xb1\x8a\x0b\x60\x34\x0d\xe0\xdb\xc6\xb6\xc0\x0c\x72\x2e\x10\x78\xa5\x08\x9b\x36\xdc\x31\x0a\xfc\xf2\x7a\x21\xc3\xd7\x00\xd8\xbe\x84\xc0\x25\x03\x9a\x85\x8b\x2c\x09\x3b\x55\x7e\xf3\x1e\xdc\x28\x71\x99\x4b\x13\x57\xec\x06\xfb\xe9\x54\xb5\x00\xd9\x7e\x1c\x57\x51\xf0\x10\x83\xc4\x7a\x6a\x23\x21\xcc\x28\x9a\x5e\x09\xa6\x8e\x21\x6f\xa5\x6c\x80\xa9\x5b\x10\x77\x72\xb0\xc5\xf1\x56\x37\xb1\x85\x5b\x00\x3b\x00\xdb\x57\x2f\x25\x66\x8e\x23\x6c\xe2\x25\xe8\xba\x9d\x25\xb7\x70\xc5\x58\xed\x29\x0e\x9c\xc3\x14\x70\x93\xad\xf1\x4b\x00\xa3\x6f\x01\x58\x49\x88\xcc\xbb\x7b\x60\xc7\x88\x8f\x35\x5e\xec\x7e\x0b\xb7\x7f\xaa\x17\xb4\xbd\x0d\x8e\xf6\xc5\xc5\xf0\x93\x3d\x11\x1c\x7b\x8c\x3f\x03\x46\x0e\x57\x52\x8b\xe6\x47\x0c\x7c\xd6\xf0\xba\xb5\x43\x79\x18\xbd\x11\xf0\xe8\x3c\xc4\xe3\x57\x4b\x8f\x4e\x22\xbf\x82\x80\xa3\x67\x52\x88\xd1\x9f\xcf\xe3\x15\x0e\xf0\x8c\x38\x75\x8b\x48\x71\xde\x7f\xc2\xe6\x36\x2e\xd4\xae\x72\x30\x50\x23\x13\x84\xb4\xd7\xd8\xb7\xb5\xa7\xc9\x8d\xe4\x69\xf2\x1f\xc8\x7f\x24\x5f\x25\x2f\xd1\x6e\xda\x4b\xfb\x69\x9a\x8e\xd1\x02\xf5\xe9\x3c\x3d\x44\x6f\xa4\x67\xe8\x79\x7a\x17\x7d\x3f\xfd\xf7\xf4\xb9\xc0\x43\xfe\x12\xfd\x43\xfa\x3d\xfa\x0a\xfd\x07\xfa\x63\x85\x2a\xa8\x08\x65\x9f\x72\x83\x72\x4c\xb9\x55\xb9\x47\xf9\xa4\xf2\xbc\xf2\xdf\x95\xdf\x53\xfe\x40\xf9\x13\xe5\xcf\x09\xa1\xd2\x68\xeb\x71\x2b\x2e\xad\x8e\x2e\xe1\xb3\xa3\x99\x71\xd3\xd2\x2d\xa1\x6b\x51\x2a\x19\xa2\x69\x49\x33\x2a\x81\xb5\xb4\xb2\x81\x99\x9e\xa1\x45\xab\x28\xd7\xf7\xb2\x2b\x4f\xf9\x6e\x69\xa4\xe2\x55\x3a\xfe\x5d\xcd\xd4\xe3\x9e\x04\xe8\xba\xa5\x8c\xd3\x6c\x39\xeb\x68\x81\xcd\x90\xa7\x24\xdd\xac\x94\x7d\xb7\xe2\x55\x7a\xa5\x59\x28\xb9\x59\xa7\x5c\xf1\xdd\xc0\xb1\x5c\x94\x0f\x06\x96\xdc\xcd\xba\x95\x72\xd6\x49\x77\x1c\x99\x65\x3f\x70\x75\xa6\xdf\x34\x41\x96\xb4\x3c\x25\x69\x2f\x24\x76\xf6\x2c\x4d\xb7\x4c\x6d\x9c\xee\xba\x8e\xd9\xae\x6b\x51\x5a\x09\x33\x1e\x78\x6d\xdc\x72\x40\x3b\x77\xed\x51\x60\xc8\xa5\x71\xee\x38\x8c\x02\xfb\x1f\xb8\xac\xb2\x8e\x34\x81\x8e\xa6\xc7\xbd\xc0\xb2\x98\x12\xaa\x77\xc0\xf7\x9b\x20\xbc\x34\xd2\x81\x08\x23\x81\xb5\x0c\x58\x71\xe7\x9a\xe5\x95\x47\x02\xdb\xea\xea\x32\x5f\xc9\x67\x03\x47\x68\xc9\x97\xb6\x94\x49\x16\x5d\x1c\xa2\xa2\x83\x82\x3a\xd7\xcb\x7e\xd6\x11\xe3\xd4\x2d\x4b\x13\x1c\x70\xe4\x72\x36\xf0\xbc\x77\x5c\xae\x7a\xd6\x2d\xcf\x53\xd7\x32\x45\x00\x29\x64\x71\x4d\x5d\xb6\xfb\xae\xa7\xcb\xf2\xdc\xe0\x6e\x27\x70\xa7\x79\xbe\x34\x64\x8e\x1b\x78\x73\xb3\x1d\x14\xe0\x75\x28\x49\x5a\xed\xa0\x18\x5f\x35\x2d\x89\x14\x82\xdc\xca\x6f\xb8\x3a\x55\xb3\x23\x20\x58\x5e\xe0\x2e\x95\x28\x68\x88\x9a\x81\x6f\x36\xf0\x83\x9b\x4e\xe0\x59\x94\x6d\x9a\x96\xdd\xaf\xe9\x66\x87\x89\xcd\xd3\xc0\x73\x1a\xf8\x63\xcb\x59\xd7\x32\x65\x32\x56\xbc\xf3\xb0\x24\x26\x56\x90\xb0\x6c\x73\xc9\xb6\xe4\x63\xc5\xce\x45\x89\x26\x3c\xd7\xb7\x8a\x1d\x17\x99\xa5\x67\xcb\x81\x41\xaf\x48\x40\x53\xee\xb0\xb0\x21\x5a\x29\xef\xe2\x07\x3f\xeb\x6a\xf2\xd1\xa0\x0e\x01\x20\xd2\xdd\xa0\x10\xa6\x57\x29\xcb\x32\x39\x9a\x44\x2c\x01\x4e\xd2\x4d\xaf\x1c\x40\xa2\x6c\x20\x27\x94\x95\x85\xbd\xd9\x2d\xa0\x07\x6e\x1c\x85\xf0\xb4\x7d\x60\xa2\xc4\x33\x5f\x97\x2c\xe7\xb6\x8f\x70\xd1\x1d\x6e\x41\xce\xc0\xd2\x62\xbe\xb4\x74\x3a\xbb\xd8\x13\xe7\xc3\x7e\xef\x41\x0e\xbc\xbe\xe2\xaa\x80\xd4\x98\x9f\xb2\x61\xf9\xcc\xd1\x6d\xec\xe9\x31\x1f\xc9\x19\x90\xb2\x8d\x46\xef\xac\x37\x05\xca\xfe\xb9\x62\xae\xc0\xd5\x68\xcb\x86\x78\xfa\x9f\x4f\x18\x00\x6b\xe5\xc9\xbe\x30\x44\x63\x46\x0b\xc1\x2e\x2d\xd4\x45\xab\x37\x64\x58\x31\xef\xbe\x9d\x44\x0b\x5a\x06\x6c\x20\xfa\x37\x80\xe9\xd6\x9f\x15\x00\xbc\x04\x0d\xbb\x7d\x15\x91\x23\xc4\x23\x7c\xd1\x48\x1d\x7c\x4b\x2e\xbb\x37\x81\xd8\x13\xdf\xd3\x03\x53\xe3\x99\x2e\x6d\x07\x92\x87\xed\x10\xdb\x42\x18\x9f\x45\x84\xc1\x13\x29\xde\xb3\xb7\x09\x98\xcf\x03\x17\xa0\x4f\x3c\x6d\x03\xd8\x39\xaf\x3b\x87\x5d\xf4\xbf\x6f\x61\xa6\x6f\xa6\x9d\x19\x4c\x43\xc8\x53\x84\x61\xc0\xeb\x5f\x82\x06\x94\xe8\xd7\xe0\x02\x0c\xce\x65\xc4\xdc\x21\x14\x1b\xed\x52\x15\xe8\x56\x76\x0e\xd1\xe0\xeb\x78\xe2\x34\x1a\x17\xb6\x6d\x68\x34\x1b\x0d\x9e\x3c\x63\xf0\xd0\x2d\x36\x8a\xf7\x75\x21\x07\xe8\xe9\x41\x58\x84\xae\x62\x4a\x19\xab\x21\xb4\xbf\x6b\x2f\x03\x0c\xcd\x3a\x13\x3d\x4a\x4e\x40\xbe\x2a\xed\xe6\x32\xef\x8d\x85\x87\xa1\x8e\x00\x20\x68\x82\xaf\xe0\x6a\xfb\x25\x1c\x9a\x0d\x08\x09\xb6\xbe\x9d\x48\x89\xe1\x8f\x36\xa0\xc6\x47\xa3\x7c\x01\x38\x2d\x6d\x22\xdc\xcf\xa0\x2d\x38\x40\x74\x84\x57\xe9\x97\x8c\xa3\x27\x45\xf6\xe1\xf6\xf7\xa6\x75\xa8\x09\x01\x1c\x52\xc0\x13\xf8\xca\x15\x84\x89\x5b\x38\xe6\x7a\x1e\xc0\x1d\x8c\x68\xfd\x47\xf2\x08\xfa\xc4\xe8\xe4\x80\x1a\x1b\x9f\x72\xd0\xbb\x21\x73\x76\x2f\x80\x68\x6f\xe6\x20\x34\x74\x05\x11\x5f\xec\xda\xbb\x88\x70\x05\x9e\x59\x4b\x86\x61\x13\xa1\xef\x6e\x3e\xe5\xdb\xcf\x0e\x8c\x84\xc2\x39\x84\x56\xc6\x3e\x1e\x5d\xc0\x26\x47\x59\x52\xc0\x65\x0e\xeb\x98\x12\x60\x00\x6c\x18\xb0\x20\xc4\x1a\xc2\x52\x02\x7b\x94\xfb\x62\xcb\xa0\xed\xcd\x00\x1f\x9e\x81\x9a\xa8\xf5\x86\x70\x9d\xc7\xc6\x4b\x90\x08\x8d\x9b\x43\xc8\x53\xb9\x81\xe1\xa5\x0c\xf2\x04\x97\x48\xce\x40\xed\xe9\xea\xec\x7d\x8d\x68\xf9\xbe\x8f\xa6\xae\x02\x2f\x94\xa3\x3f\x97\x7d\x79\xd3\x86\xc4\xa5\x17\x4f\x4e\x19\xd0\xf8\x3e\x8a\xc4\x4e\xae\xfe\x5d\x7b\x7c\xa4\xfe\x6c\xee\xe4\x79\xbb\xd1\x68\xf0\xcb\x90\xc7\xb5\xb9\xfd\x46\xfe\x77\x7f\xa3\xf0\xa5\xe7\x78\x24\x7e\xe0\x86\xb7\x3f\x8a\xcf\x3b\x8f\xf2\xd4\x16\xb4\xbf\x35\xfe\xb9\x95\xde\x27\xab\x89\xd4\xce\x8c\x99\x74\xbf\x55\x8a\x76\x4f\x9c\x6b\x18\x5b\x1f\xa1\xb4\x32\x66\xc0\xbf\xf7\x6a\xf8\x67\x43\xfc\xa2\xf5\xb8\x61\xd7\x07\xee\xf9\xf0\xde\xd1\x49\xd3\x3a\x92\x16\x8b\x5b\x28\x70\xd1\x80\x45\x3e\x7e\x43\x13\x6e\x18\x97\xa6\xf7\xdb\xb0\x06\x3c\xcf\x97\x86\xc3\x39\x4c\x2d\x02\xbc\x38\xf0\x50\xfe\xec\x20\xc7\xf6\x0f\x79\xd7\xed\x29\xec\x2a\xd6\xb8\xdd\x4c\x74\xf5\xe7\x3f\x85\x20\xd6\x44\xe2\x2a\x8e\x9c\x2b\x6c\x25\x50\x39\x02\xdd\x77\x00\x94\xb8\xdf\x0d\x91\x1e\x68\xe4\xec\x0c\xe4\x4b\x99\x42\x3e\x71\xb1\xa2\x95\x4a\x9c\xe7\x12\xc0\x7b\x27\x6c\x18\xd1\x5d\x0a\x46\x13\x8c\x1a\x18\x97\x8d\xfe\x13\x99\xc2\x6a\x13\xed\xc1\xc7\x12\x76\x55\x54\x71\xf6\x46\xe4\x7c\x0b\x2f\xf1\x4f\x09\xb0\x79\x48\xb7\x9b\xb8\xd4\x7e\x11\xaa\xf9\xe6\xb6\x81\x1b\xa2\x9a\x79\xba\x96\xc9\xd8\x1b\x7c\x89\xd7\x6c\x14\x62\x81\x03\x4f\x65\xb6\x85\x01\xf0\xe8\xf8\x50\x08\xd1\xb8\xd6\xb2\x39\xc4\x0e\x00\x40\x0e\xef\x0e\x61\x21\x53\x40\xa3\x09\x08\x99\xea\xed\x71\xd8\x80\x9c\x68\xd5\x41\xc0\x4a\xdd\x2e\x34\xab\x4d\x58\x82\xb1\x34\x5f\x15\x17\x00\x1f\xb5\x40\x8e\x23\x9e\xb1\x73\x00\x55\x84\xdc\x7d\x07\x1d\x73\xe0\xa7\x11\x1a\x00\xf5\xa6\x61\xf3\x14\x0c\x98\xf5\xe7\x00\xf3\x9b\x58\x45\xed\xc3\xfc\x19\x34\xf6\xec\xaf\x62\x3d\xd1\x80\x70\x37\x34\x17\xec\xee\xc3\x1b\x27\x6e\x86\x1e\x05\x6c\x1b\x85\x9d\x12\x08\x58\x50\x4f\xae\x00\x7e\xb2\x0f\xae\xf2\x8d\x04\xe0\x25\x14\x3b\x7c\xf6\x16\xfb\xa2\x68\xa6\x72\x80\x0f\xa7\x37\x71\x7d\x1b\x37\x0c\x40\x10\x78\x4f\x38\xd1\xf7\x96\xb5\x1c\xcf\xc9\xa1\xb6\x2d\xc4\x9a\xd0\xb4\x1d\x5c\xb7\x11\x77\x78\x6e\x63\x39\x07\x83\x77\xc1\x0b\xcb\xa1\x5e\xdc\x36\x60\xc1\x4b\x26\xc7\xeb\x3d\x45\x28\x40\x78\x76\xa2\x17\x76\x50\x20\x26\x60\x4a\xb7\x33\x4d\xb0\x81\x90\x7d\x84\x5c\x7f\x07\x3c\xaf\x7e\x80\x3c\x4e\xae\x90\xdf\x20\x7f\x45\xfe\x86\x5c\xa3\xfb\xe8\x8d\xb4\x45\x6f\xa1\xb7\xd1\x3b\xe9\xbd\xf4\x51\xfa\x04\x7d\x8a\xfe\x0c\xfd\x20\xfd\x08\x7d\x86\x7e\x9a\xfe\x77\xfa\x07\xf4\x4f\xe9\x5f\xd0\xff\x49\x5f\x51\x26\x15\x5f\x99\x53\x0e\x29\xe7\x94\x35\xe5\x01\xe5\x31\xe5\x3d\xca\x17\x95\xdf\x51\x5e\x56\xfe\x4c\xf9\x09\xa3\x6c\x80\x8d\x31\x8f\x4d\xb3\x7d\xec\x38\xbb\x95\x9d\x63\xf7\xb0\x87\xd9\x53\xec\x53\xec\xd3\xec\xd7\xd9\xef\xb3\xef\xb1\x1f\xb0\x1f\xb1\x6b\x40\x41\x87\x6e\xe8\xed\x68\xd5\x49\xaa\x05\x02\xb4\x96\x0c\x50\x83\x15\xa5\x96\xa2\x6b\x92\x4b\x05\x9c\xde\x49\x77\x48\x7e\xc5\xf3\x3b\x54\x76\xd7\x70\xe9\x8e\x5c\xfc\x2d\xe1\xc5\xcd\x0e\x90\x08\x10\x83\x5f\xf1\xe2\xa6\x25\x17\xf8\xc0\xe0\xe9\x4e\x00\x30\xdc\xb2\x6f\x95\xa5\x45\xb0\xf4\x78\x10\x38\x51\xf1\xa9\x29\x66\xa8\x64\xf6\x3d\x92\xeb\x97\x4b\x4e\x59\x8b\x52\x1a\x94\x83\x76\xb8\x6f\xd9\x1b\xa2\xbe\x34\x89\x1d\xa9\xee\xdf\x84\xee\x72\x36\xb0\x20\x71\xcb\x9f\xa4\x69\x5d\xb5\x82\x38\x16\x5f\x58\x15\xcf\xf2\x82\x30\x97\xca\x2c\x75\x03\x54\xe3\x64\xdd\x34\x93\xf6\x3b\x10\xe6\xfc\x62\x92\x8a\xa8\xe2\xea\xd9\x59\xda\xe3\x55\x02\x1d\x5e\xb7\xfc\xdd\x40\x9c\x40\x12\x0c\x14\x75\xaf\xa3\x6b\xbf\x11\x2f\x14\xf0\xee\xa2\x25\x2d\x5b\x60\xba\x3c\xff\x4d\x6b\x9d\x36\x47\x4c\x99\x4a\xa0\x01\x98\x96\x9f\x1d\xd9\x95\xed\x82\x78\x30\x55\xf2\x5c\x49\xfd\x25\xb4\x90\xb4\x3b\x90\xff\x3a\xa8\x22\x1b\xa8\x7d\x81\x30\x60\x16\xfd\xb2\x66\x99\xf1\xdd\x08\x2e\xcb\xf4\x02\x70\xd0\x51\x08\x75\x73\x37\xaa\xc9\x55\xcd\x5d\x5b\xd9\x31\x8b\x41\x79\xa5\x35\x0d\x62\x5a\x02\x84\xd2\x21\xe5\x6a\xc7\x70\x97\x3d\x53\xe2\x1d\x55\x58\x7e\x27\x26\xcc\x55\x3b\x26\x3e\x49\x03\x0c\x20\x3a\x82\x47\x00\xa1\x64\x41\xfe\xad\x8d\x25\x96\x2a\xbf\xd9\x18\x81\x94\xf0\x46\xf4\x8b\x2a\x02\x0e\xef\xea\x41\x80\x95\xbb\x0b\x35\x1c\x6a\x05\x40\xb0\x58\x96\x6d\xef\x07\xf8\x6f\x9c\xa6\x75\x4d\xa7\x01\x3f\x2f\xb9\xd9\xc0\x8a\xeb\x41\x80\x53\xba\xec\x3a\x5e\xdc\x0c\x34\xa4\x8e\x90\xe3\xbb\xe5\x8a\x57\x51\x85\x84\x16\x66\x20\x62\xc8\x5c\x3c\x59\x04\xab\x32\x4b\xfd\x92\xf3\x46\x69\xde\x08\xe0\xb2\x3a\x30\x61\x17\x49\x04\x78\x53\xf3\xe5\xb8\xf4\xb2\x4e\xd6\x12\x9e\xec\xef\xa0\xf1\x34\x39\x08\xfd\xf8\x9b\xda\x89\x29\x1c\xdd\x2b\xfa\x65\xbf\xe4\xfa\x81\xe0\xab\x06\x9a\xb3\x63\x5a\xa6\x70\x2c\x3d\x88\x12\x2a\xb9\xe5\x92\xe7\xfa\xaa\xee\xf9\xf1\x37\xb5\x13\x57\x15\x7a\x30\xe4\x5c\x55\xef\x94\xa0\xa3\x6b\x48\xb8\xa5\x67\x5d\x2d\xc8\xbc\xd2\x11\x84\x64\x15\xd5\x20\x58\x4a\x95\xed\x14\x40\x19\x55\x0e\x77\xdf\xcb\xca\x53\x7a\x80\x16\x03\xd7\x4e\xd6\x4d\xab\xd6\x6e\x3c\x91\xd9\x09\xe2\x0c\xc2\x30\x77\xc1\x94\xe9\x15\x7d\xf9\x74\x5a\xb7\x3c\xb5\x13\xe3\xe7\x07\xc1\x94\x7e\xa7\xe5\x75\xb1\x8b\xdf\x9c\xdd\x18\x31\x57\xb5\x4c\x89\x91\x25\xc4\x33\x3d\x3f\x10\xaa\x03\x80\x9b\x75\xac\x00\x23\xcb\xee\x1a\x96\x35\xcf\x4e\x52\xd3\xf2\xdd\x00\x51\x3a\x9d\xf0\x2a\x99\x63\x39\xcb\x5e\xdd\x7b\x73\x5e\x8b\xf3\x75\xef\x68\xae\x78\xf3\xb6\x5c\xf2\x7a\x47\x0f\xbd\x3b\x65\x3f\xe4\xb6\x00\x8c\xe7\x7f\xe1\xd0\xdc\x9e\x82\x10\xcf\xae\xac\x98\x07\x8c\x16\xa2\xe0\xb8\xc8\xa1\x65\xdb\x20\xf0\xcc\xbe\xa3\x0e\x37\x10\x0a\x0b\xcd\xaf\xe6\x00\x07\x6e\x95\x2b\x26\x36\x6d\xc3\x46\x23\x1f\xd8\x69\xb1\x8a\x73\x77\x7d\x3a\x79\x6d\x39\x21\x9a\xdb\xc7\x9d\x2f\x9c\x39\x7d\xf6\x39\x63\x72\xf4\x42\xfb\xb5\x0c\x5e\xde\xfa\x65\xf6\xa4\x51\xc7\x06\xd6\x0d\x6c\x1a\x00\x58\xc8\x01\x0e\x16\x11\xc6\xb2\x68\x94\x5d\x04\xad\xa7\x24\x70\x29\xa1\xf7\x5d\x2b\x00\x74\x0f\x38\xfb\xb8\x50\x75\x03\x0d\xe0\x37\xb8\x75\x80\x54\x76\x70\x7f\xe5\x62\x0d\x0a\x7e\x08\xea\xd7\x9e\x37\x78\x3d\x53\xcb\x81\xa8\x69\xe9\xa9\x59\x99\x79\x1d\x6b\x20\x8d\x86\x71\x70\x00\x20\x3c\x1a\x94\x68\x05\x00\x6a\x22\x27\x51\x84\x8d\xa0\x87\x30\x95\x6b\x56\x81\xb3\x10\x47\xd4\x22\x50\x5a\xa7\xab\x79\x34\xb0\xda\x7e\xb1\x89\x0d\x06\x15\x0d\x4a\x6d\x43\x8f\xa9\x51\xba\x59\xb3\xf9\x02\x18\xaf\x7f\x15\x41\x49\x71\x88\x47\x0a\xa0\xab\xa2\xde\x7e\x81\x23\x52\x3b\x7a\x03\x18\xc9\x19\xc0\xd7\xbf\xdd\xd5\x15\xfd\xe0\xc0\x41\x00\x63\xcf\xfe\x0d\x84\x1f\x2e\x01\xea\xa7\xda\x3b\x1c\xf8\xac\x05\xc6\x92\x41\x9b\xdc\xa8\x71\x18\x1f\x01\x2b\xd6\xc2\x44\x5d\x60\x2d\x91\x6b\x1a\xd8\xbe\xcc\x6b\x08\x42\x8b\x40\x62\xa9\xfd\x7d\xdb\x48\x5d\x1b\x8d\x16\xa8\x68\xf2\x7c\x4a\x96\x65\x81\x8a\x85\x2a\xcf\x18\x3c\x3c\x0a\xbc\x0e\x9c\xf7\xa4\x51\x1f\x05\xc0\xf0\x08\x60\x06\x00\x93\x61\x94\x44\x37\xde\x23\x5b\x0a\x90\x97\x10\x74\x73\x50\x43\x30\x27\xdb\x2f\xd6\x0d\x38\x10\xca\x18\x75\xc4\xee\xc3\xf9\xf1\x51\xc3\xa8\x03\xe5\xa0\xdf\x10\x9b\xdc\x11\x05\x23\x67\x00\xd6\x13\xf5\x54\x6e\x79\x76\xa8\x5d\x3d\x1c\x8a\xf7\x34\xa2\xf3\xfd\xc5\x06\x28\xaf\x21\x02\xc2\x2b\xf6\xaa\xc8\x1d\x1b\x0d\x5c\x06\xc6\x44\xfb\x9f\x72\x0b\x06\x46\x8f\x42\x6e\x99\x23\xec\xcd\x02\xac\xe4\xc0\x4e\xa4\x00\x4c\x17\xb0\x01\x50\x43\x68\x7c\xb7\xeb\xa6\x04\x5f\xc5\x40\xb2\x69\xa9\x43\xa9\xc5\x1a\x46\x93\xf4\x73\xa2\x8e\xf9\xd8\x40\xfb\x5b\x12\x5c\xf2\xb2\xd5\x42\x88\x79\xc2\x00\xec\xca\x42\xe2\x87\xe1\xee\xf6\xd5\xe8\x0d\x06\x47\x8e\xb8\x86\x35\x68\x72\x00\x9a\x41\xe0\x89\x14\x36\xb0\xab\xd8\x78\x7d\x93\x8b\x92\x19\x36\x56\xe8\x0f\x39\x00\x87\xed\x26\xd6\x8c\xd7\x57\x39\xbb\x0d\x07\x6e\x30\x56\x60\x30\xb2\x4a\x57\x10\x10\x81\x66\x16\xb0\xf5\x7a\xbe\x58\x89\xaa\xc9\xa1\x09\x1d\xe8\xd3\x72\x64\x86\x47\xda\xb5\xbd\x59\x84\xd8\x8d\x00\xf6\x2a\xe6\xad\xa3\x5d\xca\x1f\x2e\x21\xb4\x80\x2f\x03\x2e\x01\x02\x84\x4e\x22\xec\x19\x13\x47\xd2\x90\x33\xc0\xa8\x43\xd7\x77\x38\xbc\x7e\xa1\x77\x1f\x62\xbf\x62\x14\x12\x58\x19\x33\xb2\x73\x0b\x2d\x00\xc4\x4c\x1e\x61\xdf\x00\xa6\xc6\xf6\x28\xdf\x5f\xe2\x5d\xf1\x2a\xf2\x05\x4c\xc1\xa0\xb2\x06\xd7\x2e\xce\x0e\xe1\xc1\x81\x9c\x33\xc1\x4d\x76\xa4\x87\x2b\xaf\x55\x13\x02\xbe\xca\x01\x8c\x1c\xa4\x20\x43\xcf\x70\xa3\x66\x87\x93\x3d\xea\x07\xac\x83\xee\x28\x34\x06\x1e\x3f\xf0\xb3\x9e\x09\xab\x6f\x9d\x30\x2e\x1a\xd0\xfe\xe3\xbe\x05\x84\x3b\xbd\xe2\xcd\x46\xee\xe5\xe7\x36\x17\x16\x9e\xdd\xfa\x14\x6c\xc1\xd0\x29\x40\x83\x6f\x00\xf0\x15\x01\xc8\xb7\x9b\x9b\xe9\x5f\xca\x18\x97\x2f\x5a\xc9\x3c\x8c\x55\x72\x4b\xd5\x8c\x01\xdb\xb2\xff\x53\xb2\x09\x1a\x05\x61\xb4\x58\xec\xe2\xe9\xcf\xbf\x0c\xff\xfa\x3d\x48\x94\x9e\x39\x7e\x80\xe6\xb7\xee\x7a\xe7\x2b\x0d\x0e\xe1\x89\x67\xdb\xad\xfd\xca\x8f\x3e\xf6\x31\xb0\x60\xfa\x16\xbc\x20\x36\x39\xf6\x3c\xc1\x21\x01\x8b\x25\x3c\x7e\x00\x71\xee\x26\x81\x37\xde\x86\xd4\x3b\xdb\x85\xcf\x18\x8b\xaf\x72\xfe\xde\xc3\xcb\x10\x62\x09\xc1\x71\xe2\x8e\xcf\xbf\x43\x8e\x39\xdb\x68\xa2\xd1\xfe\xee\x35\x58\x01\x31\x39\xd2\x44\xd8\xb6\x4f\x7c\xa0\x6a\x00\x74\x8f\xdb\x74\x45\x3c\x0d\x00\xa9\xab\x0d\xbc\xa9\x07\x96\xc1\x68\x2c\x80\x7a\x63\x1e\x32\x1b\x06\xd4\x31\x5f\x90\x8d\x9d\x03\xb4\xeb\xb8\x0e\x9b\x20\x30\x95\xca\x8d\xab\x50\x13\x58\xe7\x3c\x91\x38\x90\xe4\xb0\x83\x8f\x32\x5c\xc6\x53\x66\x4f\x17\x18\x98\xdb\x16\xdc\xb8\x14\x0c\x47\xb4\x13\xb5\x96\xd0\xdf\x6b\x83\xdd\x97\x2c\xde\x95\xb8\xac\x3c\x80\x2d\x5b\x65\x86\x7f\x1e\xb4\x78\x69\x95\x73\x2e\xc4\xc4\x7d\x06\x24\xdf\x9a\x28\x21\xdc\x1e\x31\x2e\xf1\x14\x2f\xac\x60\x69\xd9\x48\x41\xdf\x5b\x61\xb1\x8e\xeb\x89\xb1\xf8\x5a\xa9\x06\x33\xc7\x11\x62\x7a\x7f\x7c\x3b\x0f\x29\x0e\xe9\x2e\x58\xc6\x25\xe1\x9e\x87\xbb\x47\x12\xc3\x27\x71\x1d\x6e\xbb\x1b\x16\x74\x13\xf4\xe3\x30\x78\xef\x02\x6f\x21\xd2\x5b\xc0\x5e\x86\x06\x60\xd9\x45\xa4\x27\x0d\xa7\x0c\x5d\xfb\x81\xc3\x1a\x56\x0b\x80\x7d\x67\x32\x76\x93\xe3\xbd\x4a\xbe\x50\xa7\xbd\xfa\xf9\xc2\xb1\x51\x34\xba\xee\x6a\xb7\xec\xe6\x86\x1d\x56\xf3\x30\xea\xef\xbd\x37\xb5\x56\x79\xb8\x54\x7f\xe4\x71\x9a\x80\x35\xbb\xfb\x58\x0e\xa6\x5d\x58\x81\x15\x48\x18\x1c\x7a\x0e\x95\x1a\x38\x7e\x6a\x71\xbb\x94\x07\x78\x2e\x21\x78\x15\xaf\xc4\xac\xe7\xeb\x2f\x70\x3c\x7b\x3b\xbc\x80\xbc\x06\x46\x69\x09\xe2\x77\xc1\xb3\x08\x3b\xf6\x05\x81\xeb\xc9\x28\x3c\x8d\x5d\xef\xc0\xde\x3b\xed\x88\x06\xa1\x1b\xa1\xa5\x47\x6b\x0b\xc8\x4b\x23\x03\x08\xe2\xc6\xdb\x00\x04\x2c\xc3\x26\x60\xf4\x94\x00\x34\x0a\x22\x57\x32\xb6\x61\x20\x04\x71\x85\x6f\xe8\x26\x02\xe7\x68\xe3\x45\xc4\x66\xe8\x1c\x60\x02\x12\x6b\x30\x93\x4c\x9d\xea\xc5\xa1\x51\xb1\xd2\x8c\x86\x66\x4e\x8d\x32\xfb\x2b\x58\xe7\x35\x23\x95\x5f\x36\xc2\x47\x53\x68\x38\x3f\x83\xe6\xbb\xc0\xe8\xfb\x20\x58\xc9\x2f\x15\x0c\x44\x0e\xc6\xc0\x71\x63\x59\x6c\xd6\xf5\x58\x73\x6f\xda\xe0\x35\x70\x86\x13\x6f\x1f\xc5\xa7\xc1\xc6\x67\xf3\x73\x4f\x18\x3b\xb8\xce\x71\x0b\x60\xcd\xde\x00\x2c\xee\xb7\x71\x0b\x9f\xe3\x5d\x37\xdb\xc6\x3a\xee\x18\x9c\xb3\xf3\xe9\x1e\xc0\x3b\xa6\x91\x9f\xbe\x69\x39\xfa\x10\x87\x7a\x9d\xdf\x3f\xd4\xd3\x93\x5f\x13\x5b\x9c\x8d\x2e\x00\xbf\x37\x82\x10\x0d\x5d\xc8\xc1\x23\xc3\x57\x0d\xf7\x1e\x0e\x4f\xf4\xc0\x9d\x51\x10\x09\xb9\x1a\x02\xe6\x20\x9f\xbe\xd9\xdf\x57\xc2\x02\x64\x08\x21\xa4\x40\xc8\xf5\x2f\xc3\xb2\xa6\x93\x39\xf2\x2e\x72\x85\x3c\x43\x3e\x4f\xbe\x48\xfe\x07\xf9\x0b\xf2\xbf\xc8\x3f\x90\x1f\x53\x4a\x91\x1a\xd4\xa6\x29\xea\xd2\x2a\xad\xd1\x9b\xe8\x22\xbd\x9d\xde\x43\x37\xe9\x3b\xe9\xfb\xe8\xc7\xe8\x27\x02\x15\xee\x65\xfa\x1d\xfa\x7d\xfa\x0f\x8a\xa1\x38\xca\x98\x32\x15\x60\xf1\xdb\x94\xdb\x95\x7b\x94\x0d\x65\x4b\xd9\x51\x2e\x2a\xef\xeb\xa8\x6f\x43\xd4\x74\x2c\x11\x78\x9b\x85\x1e\x04\x10\x9b\xba\xd8\xb5\xd5\x5a\x94\xba\x5a\x00\xaf\x3b\x32\x5b\x10\x07\x52\xde\x75\x68\x7b\x15\x66\x05\x82\x5b\x34\xd8\x56\x12\xec\x91\xf0\x44\xc7\x41\xe6\x05\x71\xc8\x45\x3f\x70\x8b\xf9\x12\xa5\x94\x25\xd2\x8a\x2a\x4e\xda\x95\x78\xb4\x14\x60\xe9\xc0\x5b\x96\xd6\xb5\x11\xd3\xd3\x77\x5d\x2c\x93\x54\x8d\x9b\x96\x88\x06\x82\x5f\x25\x50\x52\x76\xc5\x26\x09\x7f\xdd\x74\xb0\x81\xa1\x13\xd5\xe1\xfa\xe5\x8e\x62\x54\x1a\x09\x74\x1d\x57\x8f\x7b\x81\x53\x67\x96\x7a\xf1\xc0\x91\xe7\xa6\x25\x06\x92\x20\x5b\xdf\x85\xe3\xea\x1b\xf8\x30\xd8\xd3\xd2\x71\x5b\x79\xfe\x6e\xa0\x8a\xd7\x39\x94\x70\xc5\x14\xc1\xae\x93\xdd\xcb\xba\x19\x6c\xea\x90\x65\xf7\x25\x4a\xd5\x54\xdd\x77\x83\x42\x54\xca\x9d\xc8\x92\x72\x69\x52\x91\xd8\xb5\xe4\xaa\x45\xab\x57\xe8\x69\x3d\xf0\x2e\x56\xac\x62\xa0\x21\x06\x7e\xc3\x40\x4b\x94\x90\xb1\xe8\x77\xa4\xb1\xa0\x75\x1c\x6d\xa4\x13\x3a\xe3\x44\x69\xc0\x15\xbc\x20\x36\x20\x4a\x3b\x28\x77\xa4\x53\x84\x72\x27\x40\xa6\xbc\xcb\x2c\xdc\xac\xab\x0d\xef\x46\xb0\xbf\x29\xb5\x55\x7c\xc7\x4d\xeb\x6a\x20\x61\x96\x1c\xcd\x0c\xc2\x6e\x8a\xe5\xb4\x64\x3f\x41\xeb\xba\x1a\x95\xbd\xed\xbf\xe1\xdb\xaa\x04\x74\x27\xee\xf9\xbb\x7e\x7d\x7d\x44\xbc\xb1\x77\xe2\x8d\xfd\x0a\xae\x2a\x79\x42\x00\x06\x8b\xe5\x8e\xaf\xad\xe4\x58\x1d\xdf\x97\xda\xc1\x87\x81\xff\x2b\x48\x73\xd7\xa1\x16\x24\x2c\xab\x15\xf7\xb2\x96\x44\x6a\xbb\x6e\xcb\x72\x36\xe0\x0e\x81\xf3\x4d\x1e\xbe\x11\x2d\x90\x2d\xeb\xe6\x10\x2d\x67\x95\xda\x9f\xdc\x74\xff\x10\x00\x6c\x5e\x4c\x2c\x20\x54\x0b\xb9\x4c\x95\x97\x56\x33\x62\xc1\x7b\x32\x65\x88\x85\x8f\xef\x5b\x29\xd8\x06\x82\x35\x7b\xe6\x86\x56\x0d\x00\x2e\x1d\xe9\xd1\xff\xa8\xde\x78\x34\x5a\x3e\x60\x04\xcb\x6b\x6e\xee\xd0\x9a\xf1\x33\x8f\xf4\xb9\x98\x17\xf5\x55\x7e\x34\xfa\x8c\x44\x0e\x00\xa1\x21\xee\xf4\xe5\x32\x98\x32\x52\xcd\x43\xd9\x82\x1a\xbe\xb4\xf5\xd8\x63\x55\xa5\x0a\x90\x18\xf5\xe0\x4c\x1f\xb4\x5f\xde\x84\xad\x4c\x36\x62\x57\x8d\xfd\x7b\x70\x19\x61\x09\xa0\xc1\x53\x91\x0a\x1d\xd7\xff\xc8\x18\x1a\x6e\x20\xc0\x26\x5f\x83\x36\xc6\xdc\x1a\x6e\xf0\x70\x0c\xeb\x7c\x19\x0f\xea\x36\x74\x45\xb6\x74\x7a\x0b\x6e\x03\xdf\xb1\xf7\x1c\x01\xbc\xd3\x6a\xbf\x10\x8a\x1a\x18\x8f\xd3\x3c\xbf\x63\x04\x37\xf3\x0b\x05\x0e\x17\x52\xe0\x4d\x23\xc0\x5a\x75\x7c\x22\x3f\x57\x2c\x2d\x1a\x8b\x98\xe9\xbe\x11\x61\x39\x63\x18\x55\x40\xe8\xdd\x87\x8b\x18\xb9\x99\x53\x00\x81\x88\xdd\x77\x08\xbe\x2e\xef\x97\x09\x5f\x27\x79\x5e\x6a\x7f\x6f\x6e\x70\xed\x25\x27\xb6\x7d\x79\xa8\xcf\x30\x8c\x5c\x06\x97\x01\x17\x38\xb4\xd6\x30\xc4\x56\xc1\x5e\x40\x5c\x34\x60\x44\x39\xba\x05\x7c\x5b\x22\x44\xa7\xaf\xd8\x05\x88\xa3\x87\x79\x02\x57\x6d\x84\xd8\xb9\xd7\x9f\x07\x58\x03\x5c\xad\x61\xa3\x86\xdb\x80\x62\x91\x2f\x0e\x84\x12\xca\xd2\x16\xc2\x26\x96\x00\x52\xdc\x9b\x08\x31\xd8\x42\x68\xb7\xf0\x52\x0d\x5b\xcf\x83\xbd\x06\xb6\xbd\x66\x24\x52\xfd\x83\x99\x0d\x4e\x97\x07\x4f\x83\x34\xe4\x5d\x95\x9a\xb1\x86\xad\x5e\x53\xac\x71\x01\xab\xf4\x45\xb1\x84\x2d\xc0\x06\xe2\x12\x42\xfb\x2b\xf3\x26\x74\x1d\xa1\xdc\xda\x87\xb8\xf0\xb2\xa9\xf3\xcc\x33\x8b\x1c\x16\xdb\x76\x03\x40\xdf\x67\x24\xce\x47\x0d\x43\x40\x89\x97\x4a\xb8\x94\x49\xed\x40\x9d\xae\x8d\x4f\xe4\x12\x93\xc9\x3a\x5c\xbb\x76\x4b\x08\x1a\xa9\xb1\x43\xf6\xf2\xc6\xc4\x31\x5c\xe2\xcd\x3b\x4c\xbe\x9e\x69\x88\xbd\x9a\xbe\xd3\x5a\x4e\x60\xe1\x33\x1f\xeb\x7a\x22\x5d\x8c\x7d\xd2\x3a\xba\x7f\x30\x9f\x5b\x89\xc6\x72\x99\x56\xc1\x06\x08\xab\x83\xfb\x37\x91\xd7\x46\x3f\x91\x82\x87\xde\x72\xbf\xd7\xc0\xaf\x09\x6e\x7f\xe4\xa7\x4b\xbc\xbd\xf5\x92\x35\x75\xce\x1c\xf9\xf5\x85\x0c\x40\x06\x60\xb9\x54\x0f\xe9\x6b\xbc\x36\x4f\x1b\x2b\xa5\xe5\x29\xbf\xb1\x93\x82\x1c\xcf\xd7\x96\x32\xb6\x91\xba\x00\xa3\x33\xd5\xda\xb1\x59\x7a\xf7\xcf\xf5\x1b\x4f\x1f\xbf\x93\x8b\x7e\xad\x9a\x81\xf7\xab\xc1\x7a\x7d\x61\x95\x2f\x9d\x1f\xd8\xc9\xe1\x83\xc3\xd6\x3d\x80\xab\xa2\xc9\xb9\x61\x77\x65\x21\x8f\x1b\xd5\x06\x07\x01\xdb\xb8\x6a\xdb\xf5\x6a\x9d\xe3\x0e\xae\x36\x39\xac\xda\xb0\x64\xe4\xae\xac\x65\x2e\x2b\x83\x70\x79\xe1\xe4\x41\x34\x9e\x88\xc8\x86\x72\x62\x89\x68\xf7\xa6\x40\xbc\x9c\xc7\xf5\x9c\xb8\x98\x10\x47\x1d\xd8\xc9\xf0\x7d\x2e\x78\xfb\x72\x18\xba\x45\xd3\x56\x13\x3c\xd3\x30\x56\x4b\x76\x03\xaa\xd2\x3a\xb7\x6c\x7a\x1f\xf0\x84\xc0\xd5\xda\x36\x07\xb1\x25\x60\x13\x46\xcf\x01\x18\xa3\x0e\x18\x55\x5c\x6a\x5f\x9b\x19\xe5\xc9\x5b\xf0\xfc\xef\x45\x22\x29\x0e\x3d\x83\x76\x61\x85\xe7\x5a\xdc\x58\xbc\x8c\xe2\x22\x8f\x3c\x80\xe1\x87\x7a\x63\x23\x49\x78\x9a\xf3\xcb\xb9\x44\x72\xbc\x01\x89\xc1\x7b\x31\x67\x6f\x0b\xa1\xbe\x0b\x00\x87\x1e\x45\xb8\xbc\xbc\x5c\xe3\xcf\x00\x44\x1e\xde\xc8\x43\xe2\x22\xe0\x05\xe3\x74\x5c\x42\x9e\xe2\x60\x57\xf1\xb2\xfd\x72\x2a\xc5\xb7\x8c\x63\x0f\x5d\x36\x2a\xa7\x0d\x71\xc1\x5e\x80\xa1\x58\x3a\x72\x81\xb5\xff\xf4\xc0\xad\x00\xc0\x3f\xd0\x03\xb0\xd4\x04\x7e\x05\x70\x3d\x25\xae\x00\xa2\x58\x59\x32\x32\xb0\x2e\xce\x74\xc3\x22\x1a\x0b\xc0\x21\x03\x1b\x63\x47\xf2\x07\x27\xb9\xbd\x64\xe4\x72\x22\xd7\x00\xd8\xc8\xaf\xc2\x32\xd7\xb4\x77\xa9\x00\x68\x86\x25\xc2\xaa\xb5\x10\xb7\x53\x7a\xe8\x99\x74\x1a\x16\x5a\x9c\x2f\xca\x59\xc9\xef\xa6\xb0\x61\x43\xb3\x86\x90\xbc\x0f\xe1\xc0\x51\xbe\x29\x00\xdf\x43\x71\xdb\x48\xc0\x1a\xc0\x31\x42\x42\x84\x28\xdf\xa4\x2f\xaa\x1f\x22\x36\x29\x93\xe9\x20\x1a\xf2\x51\xf2\x41\x72\x95\x3c\x43\x48\xaf\x17\x28\x0b\x22\x88\x0e\x31\x85\xee\x96\xdc\xce\x4a\xcd\x02\x0b\xe6\x49\xfb\xb6\x6b\xb4\xfc\x92\x5c\xe5\x82\x1d\x82\x23\xa6\x57\xd6\x3b\xdb\x7d\x34\xf3\x0d\x7a\x9a\xb6\x3a\xa1\x8a\x41\x7c\x55\x7c\x86\x96\xa5\x79\x28\xbe\x11\x3b\x10\x84\x43\xed\xae\xa3\x5a\x6f\x67\xad\xee\x10\xe6\xb2\xa3\x5b\xa6\x93\x76\x3b\x91\x5b\xae\xa3\xf9\xa6\xe5\xbd\xb1\x90\x3b\xaf\xa4\xfa\x7a\xaf\x6c\xf0\xbc\x78\xf6\xd9\x92\x68\xdc\xf2\x14\x80\xdd\x38\x6a\x41\xde\xd6\xa7\x32\x82\x8b\x83\xd6\xe4\xf0\x34\x8d\x81\x3d\x3d\x8e\xf3\x13\x86\xdd\x82\x82\xd8\xe4\x5d\xd9\x4c\x13\xd6\xaf\x56\x8d\x8d\xc0\xb5\x1d\x9a\x01\xd8\x00\x5c\x00\x7b\x19\x71\x05\x70\xb5\x50\xda\x94\x53\x5c\xbf\x1f\x71\x1d\x8c\x0d\xe8\xbb\x7b\xbe\xbc\xb4\x09\xc6\x86\x01\xf0\xda\xa6\x01\x1b\x5c\xfd\x50\xe1\xb1\x31\x3e\x6d\xe5\xcc\x63\xae\xf9\xf9\xfe\x9d\xf8\xde\x52\x26\x75\xf3\x07\x2e\xb7\x2f\xe6\x0c\x80\xe5\xf4\x9c\xcd\xf7\x8d\x3b\xa3\xa3\x6e\x44\x49\x19\x76\x22\x37\x32\xff\xae\x3f\x47\xcc\xdf\x38\x8a\x38\x3d\x03\xbc\xd4\xb4\x71\x23\x8f\x07\xa6\x61\xe4\xe4\x65\x88\x1d\x5b\xd8\xcc\xac\x81\x24\xb1\x6f\xeb\x82\xd6\x6c\x78\x15\x57\x11\x76\x7a\xda\xdf\xd9\x04\x5c\xe7\xdb\x80\x9b\x68\xac\xf3\x75\x7e\xcb\x68\xa9\xca\xb7\x34\x05\x0c\xb1\x95\x68\x19\xb0\x23\xf1\x4f\x82\x90\xeb\x19\xe5\x2b\xda\xdd\x64\x86\x6c\x90\xb7\x90\xb7\x93\x77\x93\x0f\x92\x7f\x47\x3e\x49\xbe\x48\xbe\x4a\x7e\x9b\xbc\x44\xbe\x45\xbe\x4b\xfe\x86\xfc\x88\x3a\x74\x9c\x96\xe8\x1c\x3d\x4f\x77\xe8\x7b\xe8\x87\xe8\x47\xe9\xa7\xe8\xaf\xd0\x17\x76\xbd\x8a\x42\xd7\x4c\xad\xe3\xca\x8a\x52\x4b\xd3\x2d\x3d\x6e\xc9\x56\x4e\xeb\x9a\x93\x0d\xa2\x38\x02\x1d\xb0\xec\x06\x6e\x9f\x37\xf7\x75\x4a\x30\xa3\x1b\x43\xd4\x17\x5e\xa5\xec\x96\x3c\x9f\xc9\x9b\xa4\xc9\x76\x03\xd4\xe2\x97\xbc\xa2\x5f\xea\xec\xe6\x74\x82\xcd\xa1\x8a\xa9\xd3\x8e\x74\x27\x47\x55\x10\xf0\x2a\x2c\xe1\x15\xcb\x6e\x67\x77\x98\xd9\xc1\x12\xc5\xce\xbe\xc2\x20\x70\xae\x23\x8b\x39\xba\xb6\x1b\xaf\xd3\x89\x5e\x29\xb9\x22\x30\xc7\x32\x59\x39\x16\x67\x69\xda\x0d\x76\x4e\xfa\x81\x2d\xef\x84\xec\xc8\xa1\x17\x55\xe2\x5e\xc7\x1d\x2a\x91\x4b\x31\x88\xcd\x09\xbe\xca\x11\x5a\x76\xd2\xa6\x63\x05\x9e\xba\x20\xbb\xb2\xd7\xd9\x55\x5a\x0a\x84\xca\x4e\x98\x4f\xd6\x91\x77\x07\xb1\x35\x66\x80\x6c\x3a\x81\x35\xb2\x0c\xd2\x2c\x3b\xa2\xb3\xb5\xcd\x14\x9e\x15\xf7\xca\x25\x67\x57\x75\x73\xfd\xa0\x9a\xd2\x82\x07\x82\x4e\xd6\x09\x7c\xad\x7e\x10\xe4\x18\xb7\xca\x7e\xd9\xf5\x64\xbb\x58\x01\xe2\x90\x93\x23\x2b\xbf\x05\x5b\x65\xdd\x28\xb5\x7c\xd7\xb4\xbc\xd2\x0c\xdd\x55\x9b\x1c\xbd\x23\x01\x06\x0e\x4f\xfa\xdc\x4a\xfe\x42\x63\x61\xc4\x83\x58\xaf\x90\xe4\xd9\x00\x0e\x06\x64\x38\xa6\xdc\xe4\x52\x3e\x08\x8f\x03\x2e\xf9\xab\x5c\x66\xf2\xfe\x54\x7a\x6f\xbe\x99\x68\x5f\x00\x40\x49\x9c\x4a\x5c\x40\x1d\x3a\xaf\x6a\xaa\x39\x71\x8b\x48\x19\x05\x83\xcb\xc3\xc9\xf3\x2b\xa3\x33\x55\x50\x48\xe5\x26\xbc\x68\xc0\x0e\xe0\x56\x6d\x4b\xf0\x75\x35\x0a\x8d\xd4\x5a\xea\x22\x54\x8d\xc4\x22\x8a\xb1\x4a\xc6\x36\x76\x10\xce\x25\xd1\x36\x62\xf7\x21\x6e\xe2\x5a\x02\x52\x5f\xab\xcd\x46\xf9\x0e\x74\xf5\xe0\x7d\x49\xae\x3f\x9a\x81\x1d\x03\x9e\x01\xf3\x41\x03\x2e\xd9\xdd\x4f\x01\x5c\x04\x0e\x3f\xd5\x0b\xf5\x7a\x0a\xeb\xa5\xee\x5e\xc4\x8d\xc8\x20\xf6\x3f\x81\xcb\x39\x10\x00\x98\xb0\x71\x19\xe9\x99\x02\xbc\xc5\x84\x46\x9d\xd7\x4b\xd8\xa5\x25\x0a\xfb\x23\x29\xc8\x6c\xc2\x15\xb8\xc0\x01\x92\x6e\x13\xe0\x6d\x11\x80\x44\x7e\x01\x56\x25\x3d\x4f\x2d\x3a\xa1\xc4\x16\xc2\x8a\x8d\x50\xc2\x90\x05\xd5\x45\xc9\x3c\xc1\x0b\x61\xb7\x95\xab\x81\x9d\xc1\xd0\x50\x50\x55\xdc\xce\xc0\x6a\x4f\x24\x3f\xb8\xf7\x22\x40\x2a\x7e\x93\x30\xae\xe2\xd7\x10\x10\x07\xee\xb4\x61\x68\xe4\x68\x2f\xac\xc3\xbe\xc9\x3d\x83\x4d\xed\xee\xda\x7a\xe1\xc0\xc8\x71\xb7\xba\x0d\xdc\x58\xb2\xfe\x02\x13\xcb\x25\xb1\x75\xeb\x49\x7b\xf2\xea\x72\x5e\xc4\x06\xf2\xb5\xd4\xcc\xd1\xc3\xd0\x04\xb0\x5f\xca\x24\x0c\xf8\xe2\x1f\x7f\xe1\xf0\xc1\x5b\x1e\x7e\x2c\xf5\x93\x6d\xc8\x15\x1a\xed\x3f\x6b\x01\x60\xca\x35\x90\xd3\x4c\x06\xc4\x86\x01\xdc\x7e\xf6\xab\xbf\xf0\xef\xee\x7d\x87\xa8\x05\xc1\x16\xdf\x7f\x6e\xe6\xd7\xda\xff\xfa\x87\x00\x35\x5e\xb9\x37\xe1\xdc\x9f\x13\xf1\xb7\x61\x6a\xbb\x10\x7e\x12\x8d\xad\x98\x5e\x07\xd6\xb7\xc6\xfa\x2e\x2d\xd5\x16\x33\xb0\x77\x4f\xbe\xcf\xe5\x23\x0f\x1a\xe7\xa6\x0b\xd1\x6e\xef\x56\xc0\x2d\xc4\x2b\xad\x90\xde\x3b\xbb\x90\xb9\x5a\xb3\xe1\x32\x08\xb8\x90\x01\xfe\xb4\x58\x4f\x8c\x9f\x07\x30\xae\xd6\xbd\x3b\x81\xc7\xde\x0a\x39\xfb\x32\x00\x98\xf3\xcd\x42\xca\xdf\x67\xa0\xd8\x12\xb5\x94\xfa\x1e\xc0\xb5\x14\x6c\x40\x3e\xb7\x8c\x82\xb7\x4a\x7c\x1b\xfb\xf7\x86\x67\xb1\x59\x8a\xcd\x27\xea\xf5\xef\xda\xd3\xf7\x81\x9d\xb8\xd0\x48\x5d\xc8\xd4\x1a\x35\xc8\x5d\x12\x29\x51\x30\x90\xaf\x01\x4e\xb8\x7c\x75\x39\x05\xb9\x4b\xb8\x69\xf0\x3a\x46\xbb\x21\x9f\x0b\xdd\xf8\x02\x0c\x24\x6b\x50\xc5\xfa\xd4\x24\xc0\x64\x28\x83\xbd\x21\x00\x30\x38\x6c\x3d\x0b\x10\xba\x5d\x60\xb2\x27\x6f\x60\xe2\x41\xe0\x03\x6a\xea\x80\x93\xda\xb1\x9b\x88\x3c\x72\x2f\x1a\xb9\x66\x0a\xc2\xb7\xc2\x4d\x91\x06\xd4\xc9\x20\x21\xed\xbf\x57\x5e\xd2\x4e\x93\x71\x72\x9a\x9c\x23\x77\x92\x07\xc9\x16\x79\x2a\x58\xd1\xae\x92\x8f\x93\x5f\x24\x9f\x21\x5f\x20\x5f\x21\xbf\x49\xbe\x41\xfe\x88\xfc\x1d\xf9\x11\x69\x53\x2d\x88\xae\x98\xa2\x47\xe8\x29\x7a\x56\x32\x3b\x42\x68\xdc\x8b\x07\x61\x05\x71\xcb\xf4\x98\xa5\xe9\x42\x17\x6c\x77\x57\x74\x87\x4b\xf9\x3d\xe5\x80\x4e\x94\xfc\xc0\x1c\x05\x61\x76\xa6\x08\x53\xcd\xd1\x92\xd4\xf2\x8a\xbd\x95\x79\x5a\x99\x57\xca\x95\xb2\x1b\x38\xb9\x3b\xa1\xca\x4e\xba\xa3\x77\x0b\xc9\xb2\xac\xdd\x39\x3b\x49\x2d\x11\x38\xe2\x9d\xac\x1e\xe8\xd7\xc1\x39\x5d\x04\x52\x6c\x70\x93\x5c\x03\x2c\xd3\xf2\xb2\x9d\xf9\xdb\x59\xa3\xca\xee\xae\x23\x5e\x0f\xf6\xf5\xca\xe3\xf8\xee\x45\xd1\x89\xa3\xeb\x30\x85\x6c\x27\xfe\xb1\xe8\x67\xdd\xce\xe2\xd5\x09\x40\x8c\xcb\x45\x32\x88\xaf\x0b\x58\x86\xef\xa6\x03\xa6\x14\xc4\x0c\xc6\xad\xa2\x5c\x14\x75\x2d\x60\x89\x9d\xd0\x00\x4d\x2e\xe5\x95\x72\xda\xf5\x83\x65\x55\xef\x04\x11\x06\x51\x9f\xbe\x5c\x51\x02\x17\x83\xa4\x45\x01\xbf\xf1\x3b\xd1\x77\x25\xe7\x8d\xed\xb8\xa5\x71\xaa\x9b\x41\xc8\x80\x5c\x85\xbc\xb2\xb4\xe5\xd9\x49\x4a\xbf\xd4\x3f\xb6\x99\x41\x0e\x7d\x51\x10\x60\xe4\x6b\x17\xc7\xef\xc9\x66\x27\x0e\xaf\xaf\x36\x9a\x7a\x79\x19\x4b\x85\x8d\xe5\x42\x0a\x0c\x84\xed\x0b\xe7\xc3\x09\x03\x3f\x78\x7f\x82\x37\x42\xe3\x76\xce\x00\x04\x0e\xb6\xe8\x1d\xb6\x71\xea\x43\x6e\x28\xc7\x17\x61\x11\xab\xc3\xbd\xcb\x1c\x52\x4b\x18\x73\x4a\x1c\xfa\x9c\xd9\x70\xa9\x01\x2b\x63\x3d\x29\x5c\x8c\xf4\xe0\x46\x4b\x80\xf2\xd8\x06\x6e\x00\xac\xe3\xd6\x3a\xf6\xdd\x82\x38\x75\x18\x2e\x86\x1f\xe2\x3b\x1c\xaa\x0b\x78\x05\xfb\xe7\x4a\xf8\xb8\x6b\xd8\xcd\x02\x74\xb3\xe8\xe3\x19\xc8\xee\x0d\x31\x08\x1d\x33\x00\x46\xcf\xf1\x04\xda\xfc\x4a\xee\x6d\x3d\x08\x97\xc2\x23\x17\x0c\x14\x89\x6d\xe8\x1e\xba\xc7\xed\x55\xaf\x40\x28\x1a\xd1\xf2\x99\x2a\xe2\x74\x6f\x01\xc2\xc3\x17\x0c\x11\x7f\x4c\x4e\x92\xdc\x6b\xdb\x46\x62\xee\x26\xec\x8a\xe3\x05\x7e\xfe\x5d\xe1\xc7\x91\xaf\xc3\xfe\x74\xb4\x1b\xd7\x10\x6e\xee\x87\x6d\xbe\xd1\xac\x83\xa0\x6f\x49\x40\xf5\x22\x24\x2e\x61\x1e\xb0\xfb\x6e\x80\x7c\x43\x3b\x9d\xbf\x69\xef\x91\x43\x5c\x14\x9e\xc3\xf6\xf7\x33\x9f\xfc\x19\xf7\xa7\x7b\xdb\xaf\x1e\xbb\xa7\xb4\xfa\x88\xb9\x74\xf8\x96\x5f\x55\x3f\x41\x27\x7f\xb5\x7a\xef\x1f\x16\x07\x4b\xf5\x0d\x8c\xcc\x5d\x00\x28\x2c\x8b\xd6\x7f\x6d\xff\x54\xfb\xa5\xf5\xa9\x31\x10\x94\x8d\x4f\x3f\xcd\x1e\x5d\xf8\x4a\xc2\x74\x6c\xdb\xce\xe7\xeb\xe7\xbe\x71\x36\x1d\xe9\x6a\x8c\x53\xc8\x25\xd2\x7b\xad\x83\x35\x4c\x65\x72\xe8\xcc\xf2\xc6\x42\x13\x16\x6b\x2b\x39\xa8\x36\xc4\xa1\xfe\x52\x63\x6a\x06\x47\x9c\x44\x93\xc7\x4f\xc4\x74\x23\xd7\xca\x81\xc1\x39\xee\xb9\x29\xb1\xd1\x00\xb1\x91\x29\x88\xe1\x93\x22\xb7\x50\x8d\x26\xa1\x3c\x53\x48\xf1\xe4\x1d\xa9\xcd\x12\x70\xa3\xb4\x80\x36\x36\xa2\xc9\x9e\x43\x99\xcc\x85\x7a\x73\x21\xd7\x50\x1f\x69\x19\xf1\x9b\x04\xd0\x73\x28\x66\xcf\x81\xc8\xa0\x30\xc4\xce\xd6\xa5\xc4\xd5\xd5\x4b\x58\xbd\xb0\xf2\xf6\x64\xfe\x4a\xb5\x37\x19\x1e\xce\xe7\x71\x6a\x20\x87\x8b\xb9\x55\x48\x47\x2e\xe0\x5a\x62\x89\xb7\xde\x0f\x33\xfd\x77\x55\x79\xea\xad\x1c\x9e\x38\xeb\xdc\x0f\x62\x9d\x57\xc6\xb8\xd8\x00\x5c\x07\x7c\xca\x78\x10\xee\xf4\x05\x6e\x09\x81\x57\x04\xe2\xb3\x1c\x51\x64\x4f\xf7\xa7\x1b\x84\x90\x18\x21\x4c\x55\xbe\xae\x3d\x49\x8a\x64\x9d\x3c\x49\x9e\x22\x97\xc8\x07\xc8\xa7\xc8\x67\xc9\x97\xc8\x57\xc9\x6f\x92\xff\x49\x7e\x40\xfe\x85\xf6\xd2\x2a\x3d\xd5\x41\x2f\x49\x1a\x28\x31\xa2\x33\xe6\x77\x7f\xaf\xc3\xd5\xa2\x34\x10\x50\x24\xdd\x4e\xbb\x95\x19\x39\x93\x8a\xbe\x5b\xf2\x59\xc7\x53\xb3\x2b\xe2\x98\xc2\x33\x2b\x7e\xd1\xaf\x48\xb0\x2b\xd1\x8a\x7c\xc4\xf2\x7c\xab\x52\xce\x3a\x6e\x5a\x17\x7a\xda\xad\xf8\x92\xbb\xeb\xc2\xef\x48\x23\xae\x1f\x6c\x87\x71\xb3\x9d\xa8\x21\x57\x37\x9d\x8e\x24\xd2\x99\xdb\x9e\xa9\x07\x59\x95\x83\x9f\xad\xf0\x83\x2d\xf7\xa5\x60\x13\x8d\xef\x5a\x12\x69\xc8\xd2\x95\xf5\x4e\xa4\x8d\xa6\x06\x7e\x28\x33\xde\xf1\x4b\x49\x18\x1c\x44\x1a\x07\x7e\x1f\xc7\x94\x73\x5e\x38\xc1\xfe\x7a\xcf\x55\xcd\x5d\x17\x65\xc9\xf5\xd5\x0e\xb2\x4e\xbb\xe9\x59\xea\x05\xdb\xe8\x83\x6d\xf2\xd9\x71\xda\x89\xe0\xd2\x9d\x37\x42\x82\x76\x63\xa2\x87\x68\xe5\x4d\x1f\x6b\xb0\x31\x41\xb7\x8a\xc9\x4e\x8c\x93\x19\x2c\x2b\xa6\xe5\xc7\x83\x1f\x05\x29\xb9\x25\xba\x18\x9d\xde\xc1\x0b\x29\x63\xfd\x6e\x5a\xb5\xad\x51\x03\x60\xfc\xa1\xa3\x43\x09\x91\xb9\xbc\xb5\xa8\x69\xd1\x58\xc2\x2e\xa5\x26\xc2\x50\x68\xd9\xe9\x4a\x8a\xe3\x6a\xaa\xba\x9e\xaa\x64\xfb\xe7\x62\xd1\x5c\x26\x5e\x8c\xf4\x34\x73\x00\x46\xae\x19\xee\x33\x46\xdd\x6a\x5c\xb3\x13\xbd\x21\xa3\x01\x17\xb1\xec\x01\x2e\x63\xf8\x06\x9c\xee\x0d\x59\x76\x9d\x37\x38\xf4\xf7\x00\x40\x81\x83\xcd\x9f\xb6\xc3\xe5\x82\x61\x1b\xd1\x7d\x3a\xc5\xb2\x1b\x19\xab\xbf\x04\x26\xe3\x2f\x86\xf7\x19\x88\x1c\x5b\xd5\x91\x03\x62\xdf\x10\xe7\xed\x25\x2d\x62\xd0\x82\x1e\x32\xa2\xa3\xd8\xb0\x11\xc3\xb7\x89\x04\x80\xc8\xd7\x91\xcd\x72\xe4\x83\x47\xf2\xed\x57\x11\x90\xda\x85\x44\x06\x52\x29\x68\xbf\x32\xe5\xa0\xde\xd7\xbf\xd7\x30\x96\x50\x3d\xc9\x0d\x03\xcd\x28\x18\xb9\xd2\x88\x0b\x58\x13\x88\xfd\x7b\x11\x8e\x44\x38\x26\x16\xf8\x9e\x2e\xbb\x81\x10\x9a\x31\xc3\x4b\x40\x6d\x68\x72\x1e\x9a\xe7\x75\x4c\x65\x1a\x86\xd1\xb2\x0d\x57\xb5\xb5\x27\xeb\xcb\xb6\x51\x38\x7c\xdc\x48\xec\x3d\x11\xd7\xba\xef\x58\x4c\x94\x00\xb6\xef\xea\xc1\xe7\x45\x73\x0d\x6e\xbd\x25\x57\xad\xf1\x0d\xa3\xb1\xd8\x7e\xb9\x8e\x99\xf9\xa9\xbe\xe8\xb4\x73\xf2\xb8\x00\x6d\xcf\x25\xe3\x99\x5a\x7e\xf8\x8b\x55\x2e\x61\xd9\xd8\xde\x0c\x14\x42\xd1\xd4\xc8\x17\xab\x3c\xf3\x74\xeb\xa5\xea\xb1\x24\xc2\x1a\x2e\x42\x8b\x47\xbb\x97\x61\x01\x16\x52\xb8\xa7\x0b\x6a\x39\x10\x02\x72\xb5\xe5\x54\x2d\xc1\x97\x04\xde\x30\x00\xb5\x61\x07\x05\x70\xde\x5c\x36\x70\x0d\x72\x07\x0f\x88\xd9\x03\xc0\xfa\x62\x3a\x1a\x58\xc8\x40\x3a\xcd\x57\x52\x08\x17\x11\x54\x3d\xbf\x84\xa9\xa6\x81\x17\xab\x88\x35\xdc\x2e\x41\x4f\xbc\x7b\xdc\xc8\xdc\xe9\xe4\x60\x83\xe3\xce\xe8\x7d\x80\xb9\x06\x3b\x5f\x82\xa9\xc3\xb0\x6c\x20\x4c\xce\x02\x2e\x64\x70\x7a\x1e\x0c\x81\x62\x0d\xd9\x6d\x02\x2f\x1a\x99\x45\x04\x6c\x01\x2e\x61\x6c\x5e\xd2\xf6\xba\xc0\x4c\xde\xe8\x95\xfc\xc3\x22\x84\x7c\x91\x2d\xa8\x07\x48\x83\xbc\x8d\x7c\x90\x7c\x9c\x7c\x8a\xfc\x4a\xb0\x7f\xee\x5b\xe4\x3b\xe4\x87\xe4\xc7\x94\x50\x4e\x7b\xe9\x00\x1d\xa5\xcb\xf4\x4e\x7a\x3f\xdd\xa4\x4f\xd0\x9f\x22\x84\x5a\x9e\x1f\x18\x69\x39\xee\x3b\x6e\x63\x47\x38\x9a\x9e\xd6\x1d\xcb\xd4\x1c\xdd\x4d\xeb\x59\x37\xc0\xe1\x25\xdf\xd5\x25\x05\x29\xf9\xee\x3c\xf5\x7c\xcf\x2a\xee\x46\x21\x5a\x9e\xee\xea\x41\x1c\xa3\xe3\xa6\x4d\xcd\xb4\x4a\x7e\xd1\xd2\x2d\x49\x57\x3d\xd3\xf7\x76\x29\xca\x0c\xb5\x7c\xaf\x58\x96\xbc\x24\x2b\x13\x72\xe7\x69\x76\x9c\x5a\x7a\x27\x94\xdd\x2d\xbd\x19\x7f\x2f\x8d\x71\x10\xb0\x26\x4d\x5e\x36\x70\x5b\x77\x42\xe6\x77\x55\xce\x78\x27\x72\x7f\x86\x96\xb3\x8e\x65\xea\x41\x2c\xa6\x93\x75\xd3\x7a\xb0\xc1\xa7\xc3\x5e\xd3\xc1\x5e\x03\x2f\x10\x31\x4d\xbd\x13\x72\x68\x06\x53\x2a\xf8\xbd\x8c\x8e\x66\xdb\xf9\x91\x19\xab\x93\x95\xeb\xe8\x69\x73\x44\x26\xee\xb9\xc3\x6f\xa8\xba\x66\xf0\x33\x2b\x7e\x27\x5e\x4e\x15\x6f\x90\x15\xe7\xcd\xd4\x3a\xbf\xd8\x12\x04\xd9\xc7\x3b\x1b\x9e\x24\x77\xf1\x3b\x2e\xfd\xac\xcb\x3a\x3f\x99\xe2\x06\xeb\x61\x10\xdd\xd8\xd9\xd4\x64\x75\x62\xed\x3a\x61\x08\xf4\x6b\x00\xf9\xfc\x05\x9e\x01\x14\xf4\xad\x29\xdb\xec\x7d\x71\x32\xa6\x69\x00\xa1\xc9\x26\xef\x89\xf4\x54\x9a\x99\xbc\x91\x6b\x94\x0c\x0e\x46\x3e\x5f\x17\xc6\x82\x61\x80\x16\xc7\x14\x62\x1e\xc0\xe8\xaf\xe4\xaf\x26\xaa\x17\xc3\x21\x80\x92\x91\x4b\xd8\xea\x7c\x78\x2a\xd2\x15\x49\x0b\x23\xd1\x6c\x72\x00\xfd\x21\xd1\x82\x2a\x07\xc1\xab\x1c\x12\x0d\x1b\xc3\xfb\x52\x08\xd8\x34\x30\x7c\x4f\x02\x61\xa0\x9c\xec\x05\xd8\x33\x16\x1f\x5c\x32\x04\xb8\xc7\x85\x7e\x0a\x87\xf6\x19\xc3\x43\x35\x39\xc2\x62\xfa\xb7\xb8\x91\xab\x02\xa6\xe7\x74\x75\x0d\x45\xcb\x46\x58\x01\xcc\x1e\xc1\x6a\x7a\xb0\xba\x95\xcd\x62\xa2\x66\xe0\x94\x63\x94\xa3\x6b\xb0\xa3\x9e\xc9\x47\x4e\xff\xdf\xcc\xbd\x71\x74\x5b\x67\x76\x1f\xf8\x3e\xf0\x47\xe0\x92\xfc\x48\x7c\x24\x3e\x00\x8f\xe4\x23\xf9\x08\x3c\x02\x8f\x22\x48\x82\xc0\x03\x01\x51\x10\x09\x49\x90\x04\x49\x90\x04\x49\x90\x44\x59\xb0\x05\x59\xb4\x0d\xdb\xb4\x4d\xdb\xb4\x45\x8f\x39\xb6\x26\x66\x66\x94\x19\x76\xa2\x49\x94\xc4\x93\xb8\x1d\x27\x51\xb3\xce\x8c\xbb\x75\x1b\x27\x71\x12\x6f\x92\xb6\x6e\x76\xda\x4e\x92\x49\x93\x69\xe6\x24\x4e\x3b\x4d\x27\xbb\xb3\xdb\x49\x4e\xd2\x9d\x66\xb3\x1b\x0b\xd9\xf3\xbe\x07\x3a\xd9\x3d\xa7\xff\xed\x9e\xb3\xc7\x7f\x10\x32\x81\xf7\x1e\x00\xbe\x7b\xef\xef\xde\xdf\xef\x77\x65\xfb\x76\x7f\x10\xf2\xa3\xe1\x50\x7c\x98\x44\x8b\x20\xda\xbf\x97\x0b\xc0\x61\x4d\xaa\xeb\x8b\x03\x56\xbb\x58\x22\xf0\xf4\xd2\x80\xce\xc1\x1a\x05\xf2\x3f\x44\xe3\xcb\x84\xd9\x03\x08\x0c\xd6\x74\x6a\x12\x8f\x1d\xe6\x7d\xc3\x29\xe2\xc1\xfe\x12\x0d\x1c\xf6\xf5\x82\x16\xb2\x9b\x33\x39\xf0\x1a\x1f\x3a\xe6\xf4\xf5\x10\xaf\x97\xaa\x7a\x9d\x1a\xfd\x21\xf4\x87\x6c\x9d\xd3\x64\xf7\x0a\xa8\xe7\xa6\xfe\x4d\x13\xbd\x27\x27\x06\x69\xe9\xe4\xaa\xf5\xc0\xa7\x6d\xf0\xb4\x0e\x5d\xf0\x81\x27\x06\xc6\x31\xf9\x63\x44\xc3\xf3\x67\x17\x4e\x46\x64\xc1\x22\xa4\x47\x7f\xb2\x25\x49\x00\x69\xeb\xe0\x8d\x75\x58\xfa\xeb\xc2\xef\x97\xe0\x97\xbe\x5c\xd2\x01\x42\xe8\xe7\x7b\xcf\x57\x01\xa3\xc1\x85\x18\xee\x82\x3f\x86\x8f\x6a\xc2\x28\xb3\x97\x25\x8f\x9e\xeb\x8f\x83\xba\x9e\xe2\x54\x10\xb5\xea\xc0\xbe\xd5\xd9\x3e\x7b\xe1\x78\xec\xb0\xb5\x31\x12\x49\x25\x5f\xaa\x2c\x9e\x44\xb1\x94\xa2\x2a\x55\xd3\x3a\x27\xa3\x69\x54\x0b\xf9\x1e\xe8\x35\xb9\x59\x5f\xd3\x69\xdd\xc2\x96\x49\x85\xa1\xb9\xd7\x4f\x8f\x72\xf2\x3f\xcd\xe9\x5c\x5c\x1a\x3d\xcf\xf3\xe1\x27\x39\x67\x9f\x01\xc8\x29\xc0\x72\x8a\x42\xdc\x85\x69\xa0\x45\xad\xe8\x4b\x98\x9f\x2a\x10\xd6\x5d\x20\xe9\xe8\x29\x73\xfa\x4b\x46\x6a\x8d\x68\xf8\xb2\x3c\xb5\x1f\x76\x6a\xcd\x10\x74\x3b\x8d\xa9\x9b\x80\x53\xf1\x8d\x63\x20\xb1\x0a\xda\x10\xa9\xa9\x27\xdb\xef\x94\x6d\x7e\xbd\x0f\x24\x78\xcd\xe4\x5b\x7c\x03\x08\x3d\x02\x53\x98\xa2\x38\x18\x27\xd8\x9a\x36\xa0\x69\xed\x2f\xb2\xf7\x59\x55\x1b\xd3\x72\x5a\x51\x3b\xaa\xdd\xd0\x9e\xd2\x9e\xd7\xb6\x3b\xd9\xfe\xef\x6b\xf7\xb4\x9f\xd5\xb4\x50\xd4\xfd\xfb\x8e\x78\xf7\x78\x20\xe6\x96\xe2\x39\x27\x1b\xcd\x1c\x64\x6e\x5c\x70\x6f\xfe\x20\x4b\xc6\xc2\x9d\x41\x4a\x4e\xdd\xcf\x01\x7f\x54\xf5\xe1\xe3\x13\x2c\x90\x0c\x47\x95\xb4\x36\xa3\x48\x22\x6e\xda\x8f\x85\xbd\xc6\xd2\x0c\xf3\xbc\x5e\xe2\x09\xd5\x57\x50\x4e\x3f\x01\xd5\xbe\x57\xff\x56\x3c\x0c\xa5\x6d\xe9\xa8\x75\x13\x1d\xe9\x89\x8b\xcc\xdd\xca\x40\xc6\xf7\xa8\x15\x1e\xdb\xe2\x03\x4b\x0c\x1c\x6e\xca\xd5\x07\x96\x84\x30\xd2\x46\xa5\xc6\xcd\x74\xc5\x71\x2c\x9b\xdb\x16\xed\x3f\xb5\x3c\x0e\x32\x8c\x6a\xe1\xf7\xba\x7a\x78\x77\x9f\x25\x88\x57\x8a\x69\x3e\xb2\xcc\x79\xdf\x41\x0e\x2e\x6b\x84\x1a\x47\x93\x84\x94\xa5\x8a\x08\x5d\xe4\xbc\xef\x41\x18\x4b\x7e\xa4\xb9\x21\x1e\x1e\x11\x47\x67\xec\xfe\xe3\x26\x6d\xa5\xb6\x48\x1c\xcd\xe3\x75\x03\xc6\x37\xf9\x46\xaa\x27\x40\x8f\xf6\x3a\x4b\x99\xe0\x95\x75\x0b\x16\xab\x82\x5d\xae\x4c\x85\xbe\xff\x0f\xb6\x80\x22\xf9\x7e\xc6\x2c\x21\x8b\x1d\x71\xfa\xf8\xdd\x3b\x54\xe8\x03\x4a\xb1\xc8\xe6\x99\x4f\xd9\x62\x7a\x26\xd0\xc3\x8f\xf7\x70\xdd\x32\x74\x22\x54\xe4\xfc\xa4\x6e\xaf\x71\x50\x93\x52\x8f\x81\xae\xe1\x33\xa9\x9b\xfc\xf4\x0f\x44\x25\xb6\xed\x57\xb1\xb2\x5a\x87\x18\x18\xd8\x96\x24\x8e\x9e\x4a\x5b\x75\x83\x76\x4d\xbc\x2e\x50\xa9\x1b\x30\x60\x48\xf1\x3a\xa4\xae\xff\x20\x93\xb8\x8d\x89\xc7\x65\xca\xfd\x7e\xfb\x34\xcd\x37\xe8\x2b\x75\xfd\x23\x2d\xa2\xd9\xda\x39\xed\xaa\x76\x5d\x7b\x5c\x7b\x56\xfb\xa4\xf6\x69\xed\x8e\xf6\x63\xee\x37\x9b\x8f\x2a\x0e\x92\x2a\xd8\x02\xee\xb7\x3b\xef\x73\xf2\x49\xb7\x1e\x93\x51\xb7\xfa\xca\x27\xe2\xc9\x40\x32\x2a\xf7\x8a\x18\x8f\x5d\xe3\x3e\x0e\xbb\x78\x28\xa1\xf8\x5b\x91\xf0\x5e\x8f\xc6\x23\x33\x27\xe6\x59\x3e\xaa\x70\x56\xa0\xc3\x2c\xef\x8e\x7a\x86\x59\x51\x75\x18\x17\x88\x25\xd5\xa4\x45\xf5\x86\x54\x57\x32\x36\xef\x8b\x07\xa2\xd2\x0d\xca\x35\xbd\x90\x82\x55\xad\x3d\x39\x65\xce\xbd\x92\x2a\xa5\xe5\x9a\x5d\xa3\x35\xbd\x60\xbc\xd1\xe4\x65\x8c\x3f\x6d\xea\xc6\xf7\xac\xa3\x21\xc2\xf0\x71\x70\xb2\xfa\x27\x70\x34\x54\x30\x05\x10\x9d\x4a\x51\x68\xac\xff\x78\xa6\x57\x1f\x9e\xd7\x69\x7a\x5e\x60\x5d\x40\x6c\x0c\xc6\x53\xa0\xec\x74\xfb\x9d\xf2\xc0\x88\x55\x80\xd5\x7d\x0a\xd0\xbb\x67\x06\x96\xaa\xc4\x31\x9b\x34\x8c\xa2\xa5\xbb\x41\x72\xd5\x21\xbd\xda\xf5\x8f\x88\x08\x4e\x6e\x3e\xb2\xf4\x36\x08\x1b\x1b\xe9\x35\x82\x95\x5a\x0d\x85\x09\xb2\x54\x2c\x02\x28\x9f\x3b\x80\xa7\x42\xa0\xa1\xa7\x41\x54\x1c\x9b\x00\x60\xe6\x8e\x93\xc0\x6a\x8a\xa8\xc1\xd7\x2d\x39\x78\x41\x07\x4d\x5e\x10\x28\x85\x03\x24\xc1\x8e\x3b\x48\x55\x9d\x4d\x1d\x56\x13\x40\xe2\x12\x00\x18\xc5\x02\xc7\x6d\x00\x4b\x67\xa8\x54\xa6\x0d\x01\x6c\x48\xda\xd6\x34\xad\xd7\x4d\xea\xac\xc5\xde\xd7\x84\x66\x6a\x96\x36\xab\x54\xf2\x27\xb4\xb3\xda\x45\xed\xaa\xa7\xeb\x1d\x53\x7c\xbe\xd8\xbc\x2f\xb7\xe8\xe2\xe7\xac\x8c\x66\xf2\x8e\x4a\xaa\x01\x7f\x3e\x9c\xcd\xed\x89\xce\x92\x81\x0e\xdf\x2d\xbe\x37\x29\x0c\xb2\x48\xd8\xbd\x25\x33\xf9\x5c\xd2\x13\xc2\x29\xca\xbb\x27\xd2\x6d\x5c\xfd\x01\xbb\x27\x3b\x3b\x33\x76\x60\x83\x0b\xdb\xb4\x65\x68\xbf\x2e\x64\x01\xe9\xf4\x57\x01\xa4\x4a\xc0\x9a\xde\x02\xae\x07\xf4\xd8\x31\x2e\x57\x25\xaf\x91\x63\x8f\x4d\xec\xf6\xf6\x42\x16\x4c\x48\x4a\x0f\x07\xd9\xfb\xb7\x92\xd3\xe6\xd9\xd3\xd3\x81\x6a\xb3\xac\xdf\x9c\x7e\x5b\x94\x7b\xba\x0a\xc1\xe9\x7a\x99\x17\x04\x91\x6e\x50\xe2\x12\xd2\xeb\x25\x44\x3e\x21\x69\xcb\x46\xa9\x8c\xbe\x97\x4c\xf9\xf0\x00\x39\xa8\xd9\x58\x1d\xf1\x91\xb4\x0d\x32\x24\x0a\xc0\xa0\xfb\x51\x84\x95\x7b\x26\xef\xfe\x96\x16\xd7\x8e\x68\xd7\xb5\xc7\xb4\x67\xb4\x4f\x68\x9f\xd5\xbe\xa0\x7d\x51\xfb\x49\xed\x67\x15\x22\xf9\xaa\xf6\x75\xed\x8f\xb4\x3f\xd1\xbe\xab\xfd\x05\xf3\xb3\x7e\xa5\xb2\xf4\x3e\xa6\xa8\x3f\xd0\x15\x88\x76\x7c\xf3\x14\x9d\x72\x9e\x39\xf9\xa1\xd0\x62\x7e\x51\x35\x10\x33\x79\x6f\xb6\x9b\xcc\xe4\x16\x57\x58\x2e\x99\xcf\x39\x0a\xb9\xfb\xbb\x7c\x2c\x1c\x09\x07\x14\x13\xb0\xc3\x8f\x8c\x7f\xac\x9a\xcb\xe5\x13\x2e\x72\x77\xd1\x84\x67\x0c\x10\x98\xf0\xe5\x54\x84\xf2\x07\xa4\xea\x46\x7a\x1c\x3e\x27\x99\x73\x9f\xb7\x98\xfb\x98\xd3\x17\x88\x7e\xdc\x24\xe8\x74\x4e\xdd\x27\xc7\xd4\x6f\xe3\xb1\xce\x64\x37\xf1\x7f\xfb\xa9\xfc\x06\x3c\x16\x9b\x8c\xe6\xdd\x53\x78\xe2\xca\x58\x40\x35\x0b\xdc\xd7\x7a\xa3\x5f\xaf\xda\xf1\x44\x7d\x72\xc6\x8d\xa3\x51\x15\x4e\x7d\xb6\x11\xf9\x44\x21\x34\x06\x3d\xf5\xa6\x89\x81\x48\x6f\x24\x3a\x5c\x2f\x9a\x7a\x85\xaa\xb4\x71\xeb\x76\xaa\x1c\x6b\x0f\xc0\xa6\xcc\xb1\x56\x74\x56\x90\x75\xe6\x98\x01\xa4\xe6\xfb\x9d\xa6\xff\xb9\x5f\xf7\x95\x38\x56\x05\x6f\x11\xc6\x8f\x81\x63\xf2\x2a\x21\x3b\xab\x03\x93\xaf\x52\xb3\x27\xb0\xdb\xe2\x35\xd1\x3b\xde\x00\xe7\xd9\x05\xe2\x82\x5a\xd4\xe2\xb2\xa1\x37\xd3\xb4\xce\x47\x9f\x02\x7b\x86\x4f\x5e\x30\x37\x7a\xfa\x44\x93\xb8\xa1\xaf\x42\x6e\x20\x30\xcc\x5b\xd4\xea\xed\x6d\xe8\x29\xc8\x7a\x19\x33\xa7\x41\xa7\x67\x0c\x04\x1f\x07\xba\x9e\x35\x38\x7b\xad\xd7\x17\x7b\xc0\xde\x20\x6a\xd1\x6d\xfd\x16\xb8\x7d\x2b\x30\x48\xab\x76\x4f\xbc\x31\x18\x92\xb7\x7a\x13\x67\xe6\x5a\x30\x4f\x47\x79\x60\xac\xc6\x2f\x84\x75\x14\x89\x30\xf2\x68\x63\x3d\x18\xa6\xf9\x07\xbb\xbf\xd5\x8c\x8f\x59\xc5\xb4\x0c\x7d\xb1\x5d\x6c\x8a\x66\xff\x29\xab\xf4\xe6\xad\xc1\xe3\xe5\xdc\xef\x33\xc9\xd6\x1a\x5f\xd3\xff\xba\x62\xa5\xb7\x86\xfe\xcf\x89\xbf\x37\x32\x60\x38\xff\xe9\x0b\x55\xe2\x52\xaf\x56\x7f\xf8\x8f\x62\xed\x3f\x6b\xdf\xc4\xb3\x14\x1a\x6e\xac\x89\x60\xff\xf3\xc3\x94\x3d\x6d\x84\x5f\x06\x2d\x9c\x12\x48\x25\x2f\xf3\x91\xe7\x2c\x63\x0b\x12\x9b\xbc\xee\xde\xb8\x4a\xa8\x94\x16\x7d\x2f\x11\x6d\x98\x13\x8f\x44\x32\xbd\xdf\x87\x0d\x3e\xf5\x4c\xb0\x7f\x61\x42\xf6\xdf\x84\x8c\x3e\xde\xb8\x95\xde\x6a\xa5\xd6\x8b\xb7\x2a\xd6\x0e\xd1\x66\xea\xe9\xa1\x73\xf1\xed\x5d\xb9\xef\x61\xf3\x81\x44\x8a\x8f\xbd\x2c\xcd\x8d\x94\xd5\xff\x39\x3b\x7b\xbd\xb1\x0b\xda\x8e\x7e\xa1\x7a\x07\x5b\x77\xad\x96\xbd\xb6\x65\xa6\xef\xd6\x9e\x0a\xee\xa6\xe8\x81\x0c\xb1\x7c\x9d\x5f\xcc\x1b\x8b\xe3\x24\x82\x8f\xa7\xde\xe0\x9f\x9a\xef\xf0\x2e\x34\xad\xeb\x8e\xdf\xd1\xa6\xb4\x73\xda\x53\xda\xa6\xf6\xa3\xda\xdf\xd7\x7e\x5a\xfb\x8a\xf6\x8e\xf6\x9e\xf6\xbe\xf6\x81\xf6\xbb\xda\xef\x6b\x7f\xaa\xfd\x8d\xf2\x06\x48\xb0\x14\xcb\xb0\x22\xbb\xc0\x1e\x60\x37\xd8\x93\x6c\x93\xbd\xca\x6e\xb3\x2f\xb0\xd7\xd9\x3f\x61\xef\xb1\x7f\xc6\xfe\x2d\xfb\x03\xf6\x1f\x7c\x7e\x1f\xf7\x49\x9f\xe1\xb3\x7c\x33\xbe\x05\x5f\xc1\x77\xc0\xb7\xe2\x2b\x7b\x77\x93\x07\xf2\xa3\x3e\x8f\x41\xd1\xb1\x37\x4c\xe6\x93\x39\x75\x2f\xe5\x17\xb3\x0e\x8b\x7a\x76\x6e\x99\x9c\x5b\x0b\x64\xf6\x6c\x27\x95\x7a\x5f\x19\x14\xaa\x1b\xcb\xb3\xb2\x64\x9e\xee\x25\x19\x96\xd1\x80\x5b\x13\x44\xb2\x2e\x06\x77\x73\x4a\x32\x17\x55\xe6\x9e\xc9\x6e\x8f\x42\xed\xde\x20\xee\x49\x3d\xda\xb4\x93\x57\x5a\x68\xf7\x7c\xd1\x45\x15\xe6\xf2\x89\x64\x34\x9b\x8c\x07\xf2\x61\xaf\xe0\x0e\xc8\xa8\x9a\x3b\x28\x57\x82\x68\x38\xda\x09\x86\xb9\x44\x40\xa9\x72\x3a\xa2\xa6\x5c\x22\x1f\x8e\xe6\xbc\xc0\xd0\xa5\x94\x34\xa1\x6c\x72\xd1\xad\x69\xfc\x81\x29\xf7\xa2\xe2\x49\xb7\xd4\xc8\x27\x3b\xb3\x86\x0e\x24\x51\xbc\x61\xf7\x9c\x9e\xc3\x40\x3c\xb6\xd7\xb2\x53\x75\x8d\x27\x09\xf6\x64\x3c\xca\x0f\x44\xe1\x87\x29\x45\x50\x0e\x78\x56\x20\xea\x8e\xcd\x77\x30\xc8\x9e\x10\xd9\x6b\x58\x2a\x81\x72\x22\x39\x19\x56\x77\xfc\x3c\xeb\xee\x4c\x60\x62\x1e\x19\xd6\xd3\x53\x67\x3c\xea\x73\xac\x5b\x91\x9c\x63\x1e\x41\x39\xd1\x61\xf6\x3a\x2e\x00\x71\x4f\x9a\x77\xa6\x3c\xde\x46\x90\x29\x59\xb3\x6a\x87\x7e\xac\xcc\x5e\xec\xd8\xf5\x45\xf7\x8c\x21\xb3\x53\xfe\x40\x34\xd2\x19\x98\x28\x48\xa6\x54\xce\x1d\x42\xb8\x9b\xef\x3d\xb2\x6d\x90\xed\xf5\x2a\xbd\xd6\xa5\xe7\xab\x10\xe8\x90\xa5\x03\xe1\x0e\xd9\xd5\x73\x33\x8c\x64\xa3\x4e\x32\x1b\x9e\x60\x5e\xb7\x32\x9f\x64\x1f\xe1\xa5\x53\xa3\x2f\x15\x80\xd9\x95\x7d\x97\x6e\x3c\x52\xbb\x5d\x58\x5e\x5c\x05\x04\x52\x95\xf1\xc4\xf4\x63\x27\xe2\xed\x3a\xd0\x37\x76\x69\x09\xd2\x10\xfb\x43\x99\x63\xd1\xfd\x27\x33\xc2\x45\x2c\x02\x33\xb9\xfc\xf4\xa3\x3f\x95\xf1\x4b\xd1\x1f\xdc\x9f\xf4\xbd\xe1\x5f\x6c\x10\xd6\x77\x78\xcf\x71\x13\xfe\xa1\xd0\x83\x20\x6e\x64\x4e\x4a\x7a\xbc\x0b\xb4\xd1\xfe\x28\x37\x6f\x08\x21\x90\x72\x42\x8f\x08\x3b\x6d\xe9\xc2\x91\x43\x99\xc4\x08\x4f\xec\x43\xf8\x14\x67\xc7\x25\x71\x82\x55\x04\xa5\xb1\xa5\x4b\x3d\x7c\x8a\x9a\x1b\x74\x17\x33\x87\xf0\x40\x8c\xd3\xe0\x8a\x89\x35\xd0\xd0\x49\x12\xa6\x65\x61\xb0\x4f\x0a\x0b\x78\x6c\x01\x29\xc0\xc0\xb1\x0c\xb3\x37\x89\x9a\x5b\x6a\xa0\x31\x78\x56\xe7\x08\x3f\x09\x8c\xce\xc6\x22\xed\x02\xc9\x2a\xd1\x28\x7b\xec\x7a\x08\x40\xef\xc3\xbc\x7f\x65\x30\x48\x89\x7d\x36\xfa\xdb\x87\xd0\xc4\xa9\xcb\xdd\x01\xf0\x4d\x34\x81\x48\x82\xdd\x25\x04\xf7\x1b\x14\x3d\x01\x8c\x0e\xef\x0f\x48\x20\x7c\x5c\x6f\x3b\x67\xfb\xa9\x21\x8e\x0c\x53\x8d\xf4\xf1\x93\x70\x66\x03\xec\x83\xc4\xe1\x5e\x1f\x2f\x9b\xed\x14\x22\x4b\x3a\x68\x2c\x58\x64\xef\x61\xec\x6c\xaf\x7f\xf4\x1c\xda\xd6\x58\xb4\x44\x2d\x04\xd8\x57\x36\x48\x0c\x3c\xda\xd3\x3e\xa1\x57\x89\x26\x57\xc0\xeb\x26\xad\xa9\x89\x2a\x98\x43\x0d\xd9\xdf\xb5\x69\x60\x83\x63\xf0\xac\x34\x9a\x80\x51\x01\xb7\xeb\x43\x43\xc5\x22\xda\x2d\xcb\xa6\x2a\x11\x11\x2b\x60\x1d\x87\xe7\x40\x7c\x8d\x47\x0f\x4a\x39\xb3\x1f\x3c\x90\xb3\x48\x9f\x3b\x0f\xb2\x26\xb3\x83\x7d\xe3\x03\xc7\x07\x6f\xa1\xc5\x8f\x9f\x1e\x3f\x43\xfe\x87\xd0\x3b\x42\xfb\x0e\x83\x5a\x48\x37\x60\x88\x26\xd2\x13\x27\xc4\x95\xd0\x1d\x0e\x6e\x1d\x0d\x99\x0d\x93\x0b\x58\xc1\x7e\x32\xfd\xce\xc6\xfa\xc5\xc7\x2a\x9b\xbc\xfd\x1f\x7e\xfb\x57\x9f\xde\x28\x88\xfa\xe1\x33\x2b\xbf\xa3\x8b\x32\xc0\x86\x58\xef\x8f\x2e\x3f\xb0\x58\xec\xfb\xeb\xbf\x80\x73\xa7\xb0\x46\x30\xd6\x23\x8f\xb6\xde\x4b\xfe\x49\x09\x68\xbc\xb0\x02\x7c\x31\x64\xef\x16\x9c\x8d\xc6\x2f\xfe\x85\xef\x7b\x07\x57\x5a\x44\x5b\x14\xf9\x21\xde\x30\x52\xc1\x4f\x72\x5e\x7d\x6a\x7e\x65\x81\xec\x96\x8e\x6d\x13\xe9\xa9\x1b\xf2\xe8\x0f\x57\x80\xf6\x7f\x3c\x31\x75\x0d\x9c\x8c\xfd\xd9\x93\x11\x9e\xfc\xc6\xa7\x4e\xbd\xfa\x78\x91\xb8\x04\x4e\xdc\xe0\x63\xaf\x99\x16\x80\x6d\xba\x31\x08\x19\x0e\xc1\x32\x4a\x9b\xa0\x81\x9f\xe2\xaa\x2f\x4e\x17\x2e\xe2\xa7\x27\x22\xcb\xfe\x87\x2d\xdc\xc3\xc0\x27\x74\x6b\x83\x1c\xec\x1a\xa5\xc5\x1f\x6a\x7f\x13\xb5\xaf\x81\x09\xfe\x43\x8b\x04\x24\x3f\xf9\x06\x45\x3f\x45\xeb\xf4\xba\x14\xdc\x5e\xd7\xd7\x64\xa1\x69\x74\x9f\x4d\x09\x69\x0a\x7c\xc2\x47\xa7\xa2\xfc\xfb\x06\xcc\x1d\xa2\x86\xb0\x2b\x36\xe4\x36\x7d\x62\x44\x02\x5c\x82\xcb\x0d\x29\x4b\x54\x28\xeb\xd4\x30\x10\x9e\xaf\x55\x5d\xd0\xfd\x98\xb4\xe8\xa9\x80\xd8\x74\xc4\xd3\x43\x52\x34\x44\x1a\x8b\xe7\x51\x3e\xc2\xf8\xd5\xa3\xa6\xef\x51\xcb\x96\x4d\x9d\xa4\x55\x25\xe3\xc8\x45\xf3\x0e\xea\xa9\x12\x89\xdd\xd5\x5d\x67\xd7\xa6\xa5\x63\xa4\x37\x2a\xeb\x26\x46\x1f\x11\x44\x1b\x64\xe8\x83\x67\xcd\xbb\xd2\xb9\x5b\x94\xf7\x00\x7d\x57\xa6\x47\x3e\x4b\x18\x7d\x41\xac\x35\xa2\xfb\xf7\x3f\x03\x4c\x87\xfa\x47\x5b\x55\x0c\xf9\xf4\xe8\x17\x90\xbb\x0c\x7e\x97\xeb\x6b\xba\xc8\x3f\x82\x35\xcb\x44\xf7\x4f\xa0\x90\x9d\x45\xcf\xa8\xf5\xc0\xdc\x3b\xfc\x4d\xc8\x27\xbb\x56\xce\x8d\xbd\xa6\xd3\xb1\x33\x74\x07\xc6\x6d\x0e\x9a\x7a\x92\xe3\xd4\xa1\xd7\xfa\xe1\x59\x6a\x6c\x92\xb9\x06\x2e\x89\x8a\x16\xc8\xd4\x34\x53\xf9\x3c\x7d\xd0\xfd\x81\x36\xad\x5d\x52\x75\xdb\x53\xda\x8b\xda\xa7\xb4\x3b\xda\x5d\xed\x27\xb4\x7b\xda\xbb\xda\xaf\x68\xff\x42\xfb\x77\xda\x77\xb4\x3f\xd3\xfe\x92\x69\x8c\x58\x1f\x0b\xb3\x71\xb6\x9f\x1d\x66\x27\xd9\x2a\x7b\x48\xf5\xaa\xb6\xd8\x27\x35\x8d\xed\x09\x5f\x64\x90\xf9\xbb\xe4\x9e\xef\x93\xb3\xc2\x72\xca\x9a\x78\xde\xe7\x78\xbd\x26\x16\x96\x1d\x6b\x0d\xd9\x11\x85\x46\x03\xd1\x80\x57\xe7\x2d\x86\x86\x0e\xb2\x64\x66\x85\x39\xca\xd8\x26\xee\x67\x11\xd5\xff\x52\x13\x24\x15\xbb\x3a\xad\xe4\x48\xc7\x2a\x41\x51\x1c\x3a\x95\x96\xea\x17\x79\xaa\x95\x8e\xed\x45\xd4\xd3\x99\x74\x7b\x63\xe9\x78\x2c\x1a\x8e\x86\x95\xef\x53\xd8\x8d\xd1\x31\x25\x5b\xf1\x7a\x4e\x6a\xd0\xe3\x56\xe2\x61\x19\x48\x28\x8f\x8c\x6c\xc6\x2d\x1a\x27\xc3\x91\x3d\x17\xe9\x70\xe7\x60\x2a\x81\x28\x17\x5a\x65\x1c\xdb\xb1\x8e\x70\x03\xaf\xfa\x39\xc1\x72\x9e\x23\xb1\x47\xb9\x53\xf4\xb4\x0e\x2b\xd0\xeb\x44\x79\xfe\x13\x09\x25\x3e\xc9\xe7\x3a\x17\x93\xed\xf8\x47\xa9\xd4\xe1\xe5\xb6\x78\x58\x4d\xb4\x03\x6e\x3e\xf4\x77\x4a\x51\x2f\x3b\xe5\x12\xc9\xb0\xea\x70\x79\x1f\x4b\x34\x9f\x63\xdf\x34\x25\x16\x9e\x91\x45\xdb\xb4\x8a\x47\x57\xe4\xfc\xd1\x72\xd9\xe0\x82\x1b\x36\x6f\x09\xe3\xb5\xe9\xa5\xc3\xcf\xb4\x1f\x59\x3d\xfe\x82\x20\xbf\x3f\x05\xdd\x2a\x08\x37\x2e\xf6\x1e\x96\x47\x47\x29\x55\x47\xa8\x5b\x38\xf2\xe5\xb1\xb7\xd2\x25\xf6\x51\xaf\x9f\x2f\x2d\xf2\x1d\x41\xb8\x85\x8b\xf3\xb7\x68\x87\x77\xbf\xec\x3e\x26\x5e\x75\xd0\xeb\xe3\x46\x83\xf8\x63\x61\xac\x13\x9a\x7c\xe2\x3a\xff\x90\xf0\xd5\xfe\x27\x81\x9e\x67\xfe\x46\x13\x02\x02\xf4\x9d\x75\xa2\x3a\x07\xaf\xd8\x7c\xe0\x89\xf6\x77\x6d\x32\xc9\xde\x37\x40\xbd\x09\xf4\xc6\x4a\x26\x3b\x4e\x29\x13\x8e\x74\x98\x53\x15\x82\xcc\x32\xd5\x4d\xf0\xbe\xc7\xdb\xf7\x90\xa2\xe9\xe3\x0b\x21\x49\xab\x6c\x0b\xdd\x4f\x02\xc1\xeb\x12\x5b\x40\xf8\xda\x16\xdd\x0d\x1c\x74\x80\xd0\x83\x9c\xa3\x66\x71\xec\xea\xfb\x8f\x53\xff\x0d\xb1\xe6\xa2\x1d\xea\xe9\x6b\xd2\x36\x2c\x59\x4c\x53\xe2\x01\x0e\xaa\x9b\xfc\xee\x36\xd1\x3a\x6d\x0d\x0c\xf0\x2d\xab\x6e\xf3\x6d\x6e\x59\x65\xe2\xeb\xd4\x1a\x9e\x19\x0b\x8d\x2e\xac\x21\x34\x68\xb6\xde\x23\x74\x7f\xc0\x81\xad\xf1\x8c\x38\xf7\x37\xef\xfc\x7c\xfb\x37\xad\xad\x3a\xed\x9e\x7d\xe4\x87\x7e\xfc\x0d\xf7\xe3\x29\xdf\xb1\xca\x27\x97\x0e\x5e\x5d\x6b\xd7\x78\x79\xe4\xb3\x5c\x2c\x7f\x1a\x58\xfe\x9f\x7e\xfc\x18\xd2\x29\xa0\xf5\xee\x20\x3b\xc2\x16\xae\x41\x6e\x6c\xac\x1e\x3f\xf4\xf5\x04\x7b\xce\xe4\xb3\x97\x09\xc5\x06\x2c\x8c\xbd\xbc\x6b\xf3\x3b\x62\xb7\x10\x7e\x19\xb8\x5b\xa5\x72\xc9\xb2\x9b\x3b\xdb\x62\x1b\xb4\x4e\xb9\x0b\x0d\x4e\x92\x92\xd7\xf5\x2d\x67\xa2\x47\xf2\x48\xaf\x4e\x1b\xa0\x06\x80\x86\x55\xdc\x32\x51\xd6\x43\x53\xa9\xab\x4c\x8f\x2f\x18\xe0\x6b\xbc\xd7\xdf\x7f\xb9\x6a\xc9\x02\x85\xae\x8b\x96\xaf\x17\xb4\x26\x9e\x1e\x28\x6e\x1b\x28\xe3\x48\x90\x9c\x0a\xb0\x53\x02\xa6\x9e\x94\x3c\xf0\x6c\xca\xb8\x63\x08\xf6\x6a\x9a\xc8\x45\xcb\xa2\xff\x65\xb2\xc1\x37\x2d\x37\x85\xaf\xbf\x8b\xe3\x87\x48\xc4\x9e\xa0\x2d\x43\xe8\xcd\xf1\x01\xf2\x8d\x37\x89\xde\xc4\x87\xf6\x6a\xca\xca\x3c\x54\x34\xc4\xa6\xc1\xf5\xaa\x18\x7e\x9e\x36\xf8\x8e\x7f\xf1\xce\xf6\x9a\x94\x3b\xbe\x33\x87\x0e\xf0\x2d\xce\x47\xce\x5b\x70\x1a\xb4\x43\xd2\x05\xdd\x15\x10\xa0\x95\x94\x17\x8f\xee\x87\x76\x40\xdb\xd6\x3e\xaf\x7c\xe1\x7e\x5a\xfb\xb2\xf6\xae\xf6\xcb\xda\xbf\xd0\xfe\xb5\xf6\x5b\xda\xbf\xd3\xfe\x48\xfb\xb6\xf6\x5d\xed\x7f\xd3\xfe\x0f\xe5\xce\x33\xc0\x24\x1b\x65\x71\x96\x62\x0b\x6c\x89\x95\xd8\x31\x76\x46\xcd\xa4\x5b\x6c\x83\xdd\x64\x9f\x64\x3b\xec\x07\xd9\x8f\xb1\x2f\xb1\x9f\x65\xff\x94\xfd\x0a\xfb\x80\x7d\x8d\xfd\x5b\xf6\x47\xec\x2f\xd9\x5f\xfb\xba\x7d\xfd\xbe\x90\x6f\xd4\x67\xfa\x6c\xdf\x9c\xaf\xe0\x2b\xf9\x8e\xfb\x6a\xbe\x2b\xbe\xeb\xbe\x96\xef\x69\x35\xe1\xca\x4c\xb8\x25\xab\x0c\xb2\x58\x90\x85\x95\xa5\x96\x0a\x43\x7b\xde\xe8\x4a\x3c\xe4\xac\x28\x45\xbd\x12\xf6\x25\x92\x9e\xcd\xf7\x22\xeb\xb8\xee\xac\xb0\xbd\x17\x49\x4f\x13\xa8\x06\xd3\xea\xbf\xc5\xdc\x62\xce\x71\x0f\xe5\xf9\xd5\x7b\xa5\x73\x2e\x11\xf7\xc4\x5e\xcc\xbb\x2f\xb3\x1f\x57\x78\x09\x85\xd6\x13\x6e\xe4\x49\xe6\x54\xe0\xc9\x27\xd5\x70\x4b\xd5\x5f\x9d\x4a\x35\x17\xf7\x08\x2d\x0a\x0f\x66\x72\xc9\xd8\xa4\xd7\x91\x73\xeb\x62\xaf\xe6\x8c\x27\xdd\x12\x38\x96\x53\xb6\x59\x4a\x12\xe7\x45\x11\xf7\xe8\x99\x9c\xe3\xfd\x73\x2a\x1c\xcd\xed\x1d\x7a\x4a\xfd\x3e\x17\xf7\x77\xce\xaf\xe2\x54\x7e\xca\x6b\x2c\xc4\x3b\x2f\xf7\x46\xee\xb9\xa9\x70\xc7\x43\x2f\x10\xed\x74\xbd\x95\xd5\x8d\xba\x36\xbf\xd2\x70\x39\x1d\x6f\x99\x44\x32\xbe\x57\x2b\x27\xd4\x64\x3f\xbf\xe7\x51\xdd\x71\xad\xe9\x8c\xf4\x12\x6a\x98\x9e\x57\xa3\xb7\xce\x40\xc0\x1f\xf0\xb4\xf8\x6a\x90\xe8\x71\x95\x02\xd1\x6c\x38\x9f\xeb\xf8\xf2\x65\xdc\x07\x6e\x99\xaa\x7e\x19\x88\x28\xd7\x6f\x85\xbc\xd5\x4b\xd4\xbc\x3d\xeb\x5e\x79\xa7\x8d\x95\x57\x94\xb8\xa8\x27\x81\x4b\x24\x9d\x09\x96\x4d\xc4\x03\xd1\x70\xc7\x8b\xaf\x33\x79\xf0\x3a\x56\xea\x52\x3b\x1a\xc1\x6c\x62\x6a\x8f\x88\xed\xa9\xd3\x02\x91\xac\xea\x65\x75\xf4\x8a\x0a\x19\x84\xa3\xf9\x44\xd6\x33\xc3\x9e\x67\xd9\x70\xc7\xee\x7e\xaf\x2f\xd3\x61\x8e\x07\xdc\x00\x1c\xf7\xd9\x9f\xba\x70\xe0\x59\x7b\x3e\x8c\x3b\xaf\x07\xf6\x57\xcb\xe5\x1d\x93\xde\xbe\xfc\x05\xbb\x02\xf0\x82\xde\x2c\x2d\xcd\xd9\xdf\x5d\x7f\xbf\x6c\xd9\xb8\xf0\xe0\xdc\xc9\xb9\x47\xc3\x7d\xa1\xc9\x83\x9f\x99\x68\xdf\x0f\x8c\x25\xe6\x66\x16\x66\x1e\x94\xa7\x26\xfb\x83\xa6\x5d\x7e\xff\x1f\x3e\xd3\xd8\x8d\xbd\x68\x09\xc1\x1d\xf1\x5e\xc3\xb9\x03\x18\xcd\xf5\xef\x1f\x0d\xfe\xd2\xcf\x06\x53\xd2\x7e\xe1\x33\xfa\x7f\xba\x68\xf8\x56\x87\xe6\x22\x03\x54\x11\x68\x49\x12\xf6\xbe\x81\xd9\xf6\x17\x52\x0e\xaf\xf3\xde\x7d\x55\x38\xb2\x86\x99\x30\xba\xaf\x4d\x1e\x81\x38\x34\xca\xe9\x8d\x70\x40\x7e\x75\x72\x9e\x13\xad\x11\x7b\xdf\xef\x47\x77\xa0\x8c\xd5\xc8\x25\x92\x65\x2e\x08\x6d\x0d\x8d\xc8\x22\xfb\x1a\x2e\x0f\xd2\xa9\xb1\x9a\x7f\x80\xee\xdf\xa3\xc9\x23\x60\x3b\xa6\x41\xf0\x1f\x46\xf0\xfe\xaf\xa5\x1c\xbe\x4a\xdc\xe9\x0f\x45\xd8\xaf\x62\x60\x49\xe7\xf7\x77\x47\x0f\x51\x2a\x05\xf6\x3d\x24\x32\x7c\x3c\x83\x96\xb8\xbf\x9a\xd8\x07\xa2\xc3\xe3\x96\x29\x51\x23\xf2\xfb\xd9\xd7\xed\x14\x51\x8d\xf8\xfd\x6f\x15\x51\xf4\x71\xc3\x86\xcc\x0f\x43\x47\x89\x68\x60\xc9\x2c\x83\x1c\x81\x54\x76\x8a\xd7\x61\xd7\xc1\x1b\x06\x56\xe9\xc4\x4a\x71\x30\xa8\x17\xcd\x42\x36\x87\x9e\x0b\xc2\x3a\x17\x47\x93\x52\x95\xa1\x08\xe6\xf6\x09\x67\x8d\xc4\xd9\xe1\xc1\xf8\x81\x69\xa2\x55\x2e\xa4\xe8\x59\x09\xf7\x89\x8b\x2b\x47\x7a\x44\x85\x7a\x47\xba\xe7\x29\x8d\x6a\x51\xc7\xe2\x80\x43\x6c\x5b\x02\x3d\xc7\x0d\xf0\xe8\x45\x72\x02\x61\x03\x23\x67\xca\x26\x0d\x07\xee\x02\xdc\x0d\xb8\xb5\xe2\x42\x12\xd9\x49\xcb\x36\x51\xa9\x97\x44\x76\x10\xf7\xbf\xb3\x30\x13\x65\x3f\x17\x9a\xa6\xd9\x60\xa1\x2c\x2b\xed\x3a\x2e\xf4\x18\xa8\x8c\xb1\xd3\x07\x93\x25\x92\xd4\xfe\x10\x55\x9d\x1f\xfc\xc2\xf1\x61\x4e\x53\x71\x18\x25\x90\xac\xbf\x3b\x71\x82\x4f\xe4\x52\x96\x4d\xb5\xd2\xc8\xc8\x74\xc0\x8f\x52\xdd\xce\x3e\x9b\xfa\xb9\x7f\xf9\xed\x52\x91\xf8\xed\x44\xec\xf8\x39\x5d\xaa\x0c\x5b\xdb\xb2\x73\xa3\xf4\xa3\x9f\x6d\xfc\xe2\x95\xec\x27\x3f\xac\xf6\xfd\x48\xe5\x77\x92\xaf\xe6\xfa\xda\x07\xd3\xf6\xa9\x17\x4e\x4c\xa0\x04\xeb\xd2\xbe\x2f\xcd\x46\x7e\xf5\xf3\xc7\x1e\x3a\x69\x15\x4a\x42\x09\xfa\x39\xa4\x39\x7f\x2e\x25\xc0\xc9\xc6\x0b\xf1\xaf\xfe\xcc\xa5\xa7\x2e\xdc\xdb\xf9\xce\x0e\x33\x39\x5b\x29\xf2\x06\xc7\xd0\x2b\x02\x3c\x9a\xc4\xfe\x00\x15\xed\x2b\x47\xf0\x06\x07\xed\x60\x6d\xa4\x97\x03\x75\x31\x35\xff\xf0\xb2\x38\xb9\x18\x18\x94\x0e\xef\x1b\x13\xd7\xf3\xc4\xdf\x84\x90\x44\x24\x70\xec\xbc\xd1\x74\xd3\x34\x07\xe7\xa9\x35\x1c\xbe\x64\x88\x1f\xee\x36\xf9\xc1\x15\x1d\x82\x38\x27\xfd\xc0\x69\xd0\x2d\x58\xb0\x4c\xd0\xcc\xc1\x03\x83\xf5\x14\xa7\xa7\x23\x10\x64\x70\x4c\xf7\x40\xfa\x1e\x95\xfa\x9a\x53\xc1\xc2\x59\x5d\x9e\x9a\xe5\x18\x7d\x10\xee\x57\x0f\xc2\xd5\x61\x4e\x0f\x8d\x4b\x0b\xe1\x90\x1c\xf2\x41\xe8\x47\x16\xe4\x4d\x06\x33\x34\x8b\xfe\x79\x71\x79\x61\x68\x60\x39\x63\x01\x72\x83\x30\xf0\x9c\x35\xfa\x08\x9d\x9b\x4f\xd1\x2d\x7d\xdb\x1e\x7d\x89\xdf\xd6\x81\x3b\xf4\xea\x44\xf8\x9a\x45\x3a\x8d\x9e\xee\x49\x96\xaf\xcd\x62\xec\x35\xa4\x69\x17\xfc\x6e\xba\xef\x29\x03\x7c\xf1\xa4\x70\x6e\x83\xe3\x13\x91\x9e\x99\x6b\x93\xfc\x33\x0c\x86\xf4\x3d\x6c\x70\xdc\x8c\xb7\x30\x78\xc3\x1a\xcc\x56\xab\xbd\x7e\x98\x3c\x5d\x5a\xaf\xa1\x39\xd8\xc7\xb1\x4d\x54\x31\xfd\x03\x58\xb8\x36\x70\x32\x95\x72\xd1\xc4\x1a\x0d\x3c\xe7\x60\x8b\xce\xc5\xe9\x44\x14\x0d\x19\x3f\x88\xba\x30\xb0\xb9\x70\x1c\x69\x1b\xd9\x29\x1a\x3d\x81\x35\x17\x74\x60\x35\x25\xea\x44\xd7\x18\x47\x43\x07\x6d\xa2\x45\xc9\xfd\x40\x43\x39\x2e\x00\xa9\x32\x3f\x30\x0b\x2a\x5a\xe1\x0b\x85\x22\x4f\x6b\xda\x7e\xd5\xeb\x79\xdd\x4f\xda\x61\xed\x07\xb4\xbb\xda\x57\xb4\x7f\xa2\xfd\x92\xf6\x6f\xb4\x7f\xab\x1c\x20\x3d\x95\x4d\x80\xf5\xb1\x41\x36\xcc\x26\x59\x92\xcd\xb3\xfd\xec\x10\x3b\xc9\xce\xb0\x55\xd6\x60\x4d\xf6\x58\x67\xea\x7b\x8b\x7d\x9a\xed\xb2\x2f\xb1\x7f\xc8\x7e\x96\xbd\xcb\xfe\x19\xfb\x2a\xfb\x6d\xf6\x0d\xf6\x47\xec\x4f\xd8\x77\x59\xdb\x17\xf0\x0d\xf9\xa6\x7c\x33\xbe\x8c\x6f\xc9\x77\xc8\x57\xf5\x9d\xf7\x5d\xf1\x3d\xd4\xe9\xa5\x46\x95\xb2\x58\x25\xae\xe8\xdf\x5a\xae\x78\x1e\x92\x4a\xfb\x92\x8d\x46\x26\x94\x5d\x4d\x32\x1e\x50\xee\x37\x89\x83\x2c\x9f\x48\xc6\x3a\x6c\x65\xd9\x19\x06\x67\xbc\x17\xc6\x54\x34\x8f\x84\x23\x6a\x23\x86\x5a\x65\xb2\x57\x6f\xab\x6e\x6c\x4e\xd5\x9f\xb9\xbd\xbd\x25\xee\x49\x02\xfe\xc0\x94\x5b\x77\x2b\xd1\x86\x92\x79\x7b\xc4\xe5\x4c\x38\x3b\xcf\xdc\xd2\xd7\x4d\x97\x9e\x6f\xdc\x94\xd7\x34\xf5\x4a\xda\x03\xcc\x51\x6d\x0d\x15\xad\x27\x3d\xdf\xc7\x31\xb7\xf6\x77\xe2\xc9\x4e\x13\x66\xd2\x53\x09\x27\xe2\xca\x56\xce\xad\xdd\xb3\x8b\xb9\x78\x2c\x90\xec\xe4\x36\x95\x6f\x92\xd9\x70\x34\xa7\x56\x4c\xb8\x31\x3f\xac\xea\xf5\x4e\x46\xc8\x76\x16\x3d\x78\x96\xaf\x01\xff\x9e\xeb\xdd\x5e\xc6\xd8\x93\xf3\x28\xea\x56\x27\x8f\x25\x73\x9d\x5c\x1c\xcd\x4e\xee\xc9\x4d\xa2\xf9\x4e\x2b\xbe\xe3\x90\xa3\xf2\x4a\xce\xc9\x77\x28\x2e\x91\x6c\x2e\x19\x95\xd1\x4e\x05\xaf\xd8\x6f\xf9\x44\xdc\x33\xb6\x75\x5f\x90\xeb\x8e\xec\xe9\xf8\x63\xdd\xd1\x7c\xa7\x12\x88\x77\xb2\x4b\x22\xde\x1d\x0d\xe7\xbd\x66\x7f\x36\x9f\xe8\xf6\x44\x36\xb9\x29\xcf\xcf\x2e\x16\x64\x1e\x65\x57\xba\x48\x25\x93\x57\xaa\xa4\xbd\x91\x41\x36\x13\xce\x76\xca\x00\x2f\x4b\xfe\x5d\x56\x8b\xd7\xb8\x8e\x05\x94\x72\x46\x59\x12\xa9\xab\x0f\x67\xdd\x5a\xe0\xe3\xb4\x28\x55\xea\xce\xc7\xb3\x6e\x1e\xf4\x9a\x44\xde\x0f\x87\xfd\xba\xbd\xf4\x8a\xdd\x58\x13\x81\xeb\x8e\x7b\x17\x45\x32\xeb\xa5\x37\x6e\x2d\xed\x9b\x39\xa8\xeb\xa5\xf0\x4a\x39\x77\x59\x8c\x0c\xdd\x05\x1c\xbd\x50\x81\x44\xca\x91\x6f\x1d\xfa\x46\x2a\x17\x35\x9c\x03\x0b\x4d\x11\x5f\x98\xff\x91\xd1\x6e\x3b\x7c\xcd\x31\x7a\x46\xab\x3b\x07\x43\xd6\xd4\xcc\xf4\xe8\x9d\xba\x78\xe9\xc6\xe2\xc9\x3a\x50\x11\xfe\xb9\xf3\x73\xfc\x76\xbc\xdf\xa9\x55\xea\x0f\xec\xf3\xf1\x12\x2f\x04\x4f\x63\xb0\xfd\x3b\x22\x85\x14\xa8\x4a\x3c\x2d\xc8\xa1\xe1\x79\x73\x90\x5d\xac\x51\x3b\x35\x70\x38\xdc\x35\x3b\x43\xc5\xb4\xec\x8d\xa0\xce\x7b\x33\x3a\x96\x87\x88\xdd\xab\x70\x33\xbd\x6f\x1f\xac\x74\x5b\xef\x3d\x8c\x0a\xfb\x3a\x6a\x84\xe5\xa1\xa2\x49\x34\x7a\xb0\xfd\x2e\x1a\x7c\x7f\xe8\x9d\xc1\x27\x51\x28\x90\xde\xf5\x38\x5a\xeb\xf4\xee\xea\x91\x1e\x9f\xa8\x71\x84\x8f\xdc\xff\x70\x3a\x44\x05\x7a\x5f\x40\xb0\x2a\x65\x06\x46\xfb\x7b\x2e\xe8\x5c\x16\xd0\xd3\x95\x36\xec\xc5\x5e\xc4\x46\x52\x45\x0b\xbc\x64\x70\x83\x4c\x27\x39\x48\x4d\xfe\x06\xed\x72\x6a\xbf\x9e\x9c\x85\x2d\x39\x00\x99\x0b\xc6\x87\x99\xa9\x83\xda\xef\x86\xfb\x3e\x22\xe2\x1f\x0e\xf6\x89\x6f\x56\x6d\x37\x2f\x16\x46\x62\xe8\x4f\x56\x0b\xe0\x9c\xda\xef\x12\x43\x57\x38\x3b\x06\x8a\x1f\xa5\xfb\xdf\xd2\x65\xec\x18\x51\xcf\xf1\x91\x91\x9e\x50\x2d\xdc\x07\xce\xd9\x7b\x10\x04\x61\xa6\x51\xbd\xff\x5d\xb3\x6f\x0a\xec\x8e\x28\x0b\x7e\x70\x82\x73\xe2\x69\x0b\x1b\x7a\x25\xd8\x53\x21\x33\x45\x93\xd9\x02\xf6\x87\x38\xaa\x36\x05\x4f\x40\x9a\x4e\x75\x2c\x4f\x94\x58\xe4\x94\x2a\x54\x31\x72\x32\x7c\xed\xc4\xfc\xaa\x70\x4e\x44\x45\x95\xb7\xff\x3c\x45\x06\xf0\x7e\x26\x21\x4f\x0e\xbd\x5d\x14\x28\x01\xcd\xaa\x11\xdf\xef\x14\xd1\x37\xab\x17\x84\x9f\x9c\xae\xfd\x4f\x65\x33\x23\xf6\xab\x3f\x79\x32\x86\xd5\xa3\xa7\x74\x80\x5e\xbb\xf2\x95\xc1\x6a\xef\xbe\xe9\x67\xd6\x5e\x7c\xee\x96\x9d\x9b\x5f\x5d\x1c\x3a\xfc\x1b\x40\xf5\xe0\x29\x3e\x15\xa5\xa2\xb5\x56\x48\xdd\xdd\x1d\x6b\xff\x61\xd5\x1e\x9c\x48\x5e\x5f\xf6\xfd\x3a\x9e\x9a\xb0\x4d\x3d\x9f\xeb\xeb\x1f\x0b\x14\xca\xaf\xe6\x76\xf5\xd4\xee\xd9\xb1\x8d\x2f\xfe\xa2\x5e\x09\x5c\xbc\x75\xc7\xcd\x73\x67\x7e\xca\x81\x10\xe5\xb7\xec\x97\x6e\x06\x06\xa3\xfd\xe9\x13\x8f\xdd\x45\x03\x26\x0d\x67\x09\xc6\xd6\xf4\x01\xd4\x39\x76\xc4\x9a\x4d\x6b\x1b\x9c\x17\x31\x1c\x3c\x75\x94\x1f\x3c\x5b\xc3\xc9\x21\x63\xe0\x39\x8e\xba\x8e\x2b\xd9\x44\x2c\xd2\x6b\x3b\x7a\xd9\x30\xac\x34\xc6\x0f\xa3\x29\x51\x03\x95\xa8\xca\x0b\xe5\x3b\x38\x70\x74\xb5\x1a\x7b\x94\x72\x17\x4c\x7d\x8d\x36\x55\xdb\x68\x15\x0d\xc1\x2b\x24\x2b\xa6\x70\xb0\xc2\x20\x49\x40\xaf\x92\x5d\xb6\x83\xfd\x13\x39\x39\x79\x20\xc5\x8b\x98\x0f\x5b\x17\xfb\x38\x8e\x86\x24\x20\xa6\x46\x97\xfd\x44\x1b\xdc\x24\x72\x38\xc7\xbe\x33\xd8\xd2\x89\xeb\x20\x3c\xe7\xc7\x03\xe3\x02\x26\xc2\x5d\x38\xd0\x8d\xf0\x0c\xb9\x67\x40\x01\x85\xf4\xf0\x0a\xd9\x54\x43\xdf\x51\x07\xb8\x55\x22\xc9\x85\xe0\x44\x74\x4b\x96\x74\x12\xe3\x0f\xf1\x12\x4e\x3e\x44\xdd\x2f\x97\x42\x3d\x45\x9a\xee\x72\x14\xa9\x9c\x04\x9a\xa2\x4e\xc8\x0f\xea\x16\x6a\x6b\xb0\xa6\xce\x16\xf5\xc0\x39\x09\xd4\xfa\xe3\x14\x39\xcf\xeb\x3a\xb2\x53\x42\xae\x56\xc5\xaa\xe0\xeb\x26\xa7\xf8\x51\xe8\xd4\xb0\x29\x3f\x0d\x9a\x38\x41\x67\xe6\x62\x91\x56\x71\x93\x36\xc8\xd8\xf2\xfb\x6b\x36\xa7\x32\x66\x27\x20\x4f\x4d\xe2\x69\x3f\x85\x1e\xf4\xfb\x81\xbe\x2b\x9c\x6f\xa0\x9a\x22\xd4\x10\x9f\x95\xd4\x18\xd4\x34\x6d\x42\xe5\xae\xaf\xfa\x0d\x2d\xaf\x3d\xa1\xbd\xa2\xbd\xa6\xfd\xb0\xf6\xae\xf6\x9b\xda\xef\x6a\x1f\x6a\x7f\xac\xdd\x57\x98\x6d\x9a\x9d\x67\xab\x1e\x2f\x89\xfd\x03\x76\x8f\xfd\x05\xfb\x4b\xf6\x91\xaf\xcb\x97\xf0\xa5\x7d\x05\xdf\xb2\xef\xa8\xef\xa4\xc7\x33\x74\x21\x54\x90\xf9\xc3\x8a\x38\x18\xf6\xa8\x47\x33\xcc\xc5\x3b\x6e\xa9\xae\xbc\x55\xbc\xd1\x84\x93\x5f\x5c\xf1\x79\x00\x4c\x05\x9f\x68\x36\xa2\x6c\x49\xc2\x6a\xa5\x98\x67\x8a\xba\x98\xcb\xe4\x9d\x79\x96\x57\xc6\xc6\xca\xc3\xdb\xef\xcd\x09\x99\x7a\xaa\xb2\x4f\xeb\x48\x36\x93\x4e\x20\x1a\x48\xe6\x3b\x6d\x14\x65\xdd\xe1\xc6\x59\x15\x12\x65\xdc\x8b\x87\xb1\x64\xdc\x3d\x81\x9a\x92\xab\x26\x4d\x5c\xb9\x24\xcb\x2e\x35\xbb\x70\x91\x62\x3c\x91\xec\x78\x93\xe7\x54\x7b\x3e\x16\xf0\xc8\x84\xf1\x58\x40\xc6\xa3\xf9\x44\x34\x90\xcf\x7a\x0d\xfd\xc0\x04\x73\x3a\xe4\x22\xaf\xf3\x1f\x64\x2e\x04\x5d\xcc\x2a\xdb\x16\xd5\xb0\x51\x73\x08\x25\x8b\x48\x74\x16\x04\x25\x94\xcd\x57\x3e\x36\xe5\xd9\x90\x05\x32\x1d\xeb\x52\xcf\x79\x35\x9f\x8d\xe6\x92\x79\x05\x98\x3c\x39\x67\x2e\xd9\x1d\xed\x44\xfe\xa8\x9c\x60\xe1\x78\x32\x1e\xf5\x1a\xff\x6e\xc6\x8d\xe7\xb2\x0a\xfa\x65\xc3\x99\x7c\x40\xc6\xc3\xca\xf3\x24\x90\x8d\xba\x29\x3f\x9f\x53\x16\xa2\xf1\x40\x34\x12\x56\x72\x55\xef\x9d\xaa\x73\x4e\x30\x45\x90\xf6\xc7\x3d\x32\x40\xd2\xaf\x0c\xd1\xbd\xbe\x97\x27\x26\x8a\x1c\x60\x99\x15\x96\xe8\x0c\x62\x62\x39\x95\x9d\x73\xde\xd2\x2a\x17\xb3\x2a\x5e\x67\xdc\x1f\xf6\x4f\x45\xd4\x8e\x31\xf7\xb8\x93\x5e\x0a\x8e\x46\xb2\x99\x68\x2e\x96\x8c\x27\xc3\x1d\x1e\x76\x32\xee\x39\x9c\xb9\x80\x3b\x1c\x8d\xcf\xb3\x68\x40\x46\x3d\x85\x68\x5c\x2d\x89\x52\x60\x2b\x9b\x77\x51\x5b\x38\xae\xd8\x60\xb9\xa4\xef\x3b\xd9\xc1\xfe\xe7\x25\x15\x52\x85\x42\x65\x17\x58\x0d\x1e\xa2\xc7\xb3\x16\xba\x8f\x00\x12\x3f\x3c\x1c\xcf\x45\xfb\xad\xea\xaf\x2c\xec\xa4\xae\x0e\x4f\xce\x0c\xdf\xbf\xd0\x7a\x0b\xe5\x94\x03\x4e\x1c\x90\x72\x79\xc0\xe0\xa3\xd3\xb5\x40\xcf\xba\x28\x56\x8d\xe2\x81\x17\x76\x8e\x5e\x9e\x3a\xf2\x9c\x6f\x5f\x57\xcc\xbd\xd3\xaa\x69\xf4\x3f\xc9\xd7\xd0\x40\x9d\xea\x30\xe4\xc0\x25\x1b\x3b\x80\xde\x04\x8e\x5e\x80\xbe\xc6\x37\x49\xac\xeb\x2d\xf0\x1d\x04\xfb\xd7\x40\x7d\x4f\x49\xa4\x30\x79\xe3\x6b\x3d\x7d\xb7\xa4\x21\x2a\x25\x75\xc3\x0e\x77\x0d\x7d\x79\x69\xd1\x80\xe0\x04\xf0\xf4\x44\x3f\xe9\x08\x84\x29\xc5\xcd\xaf\x72\xa0\x5c\x20\x2c\x2f\xf3\x55\x9b\x2f\x9c\xa2\x03\x07\xfd\x91\xe8\xb3\xf8\xf3\x2a\x7a\x56\x44\xa0\x1b\xa8\x50\x66\x80\x50\xa2\xde\x0c\xcd\x5e\x13\x25\x9b\x67\xf6\x31\x83\x97\x0a\x34\x79\x01\x7a\xc3\x10\xed\x5a\xef\x49\x5a\x35\x7a\x2f\x01\x83\xa7\x50\x08\x07\x64\xcf\x28\xa8\xe8\x50\x99\x50\xe6\xe3\xfb\x50\x5a\x65\xfa\x16\x86\x2f\xf7\x04\x88\xea\x65\x83\x3b\xca\xc6\xa3\x22\xe8\x76\x66\x08\x54\xdf\xfa\xc0\xa2\xa1\xa1\x6f\x71\x83\xfb\x20\xb1\xd6\xdd\xb7\xb2\x80\x52\xea\x2a\x83\x55\x91\xeb\x00\x42\xa7\x65\xef\x43\xbc\xf5\x96\x61\x96\xdd\x53\xa2\x3f\xd0\xf5\x14\xe8\x81\x88\x58\xa3\xe0\x45\xea\x3b\xcd\x1b\x44\xc5\x64\x58\x2c\xac\xe0\xe4\x12\xe1\x48\x8e\xf4\x4d\x8a\x2d\x5b\x4d\x03\x43\x73\x33\xfd\x62\x68\x31\xda\x53\xd0\xef\x7f\x28\x84\xee\x5b\x0b\x9d\xe0\xab\xf7\xbf\x06\xe1\x88\x82\x3e\x1b\x5d\xf8\xb1\xe1\x51\xaa\x15\x69\x6c\xde\xd3\x93\xf4\x04\x22\x03\x04\x91\xa2\x14\x95\xf9\x77\x60\xc3\xe0\x4d\x4a\x03\x29\xac\x71\x90\x7c\xef\x74\x1c\x0d\x7d\x9b\x17\x52\x7e\xa3\x30\xfa\x54\xf4\xdc\x93\x3f\xb9\xf3\xf2\x09\xa7\x5c\xb9\x38\x53\x90\xba\x58\xdd\xd6\x67\x1e\x39\x36\x9e\x06\x61\x30\xba\x11\x9d\x1d\x89\x39\xb7\xdf\x6b\x7e\x58\x7a\x65\x20\x2d\x47\x3e\x9a\x5b\xdc\x37\x38\x0a\x8c\xf6\xf3\x34\x09\xa4\x80\x4a\x7a\xfe\xd9\xcd\xd1\xb0\x71\x6c\xd1\xfc\xc8\xfe\xf3\x8b\xd9\x54\x76\xda\xf7\xd9\xf7\x5e\xf9\x74\xee\xf8\xa6\x75\xa6\xeb\x8c\x21\x80\xc2\xc9\x08\xa8\x85\x55\x9c\x5e\x09\x84\x1a\xd4\x44\xbd\x82\x55\x69\x6e\xa0\x29\xf9\xec\x18\xa4\x59\xa5\x26\x61\xf4\x1c\x35\xed\x0d\xa0\x3b\x58\xa3\x75\xfe\xc6\xba\x34\xef\xb5\xdf\x94\x04\xa9\xde\x13\xc7\xc0\x9f\x5d\x7a\xd8\x04\x0c\x2b\x65\x36\x1c\x93\xa7\x6c\x5e\x17\x35\x5e\x42\x32\x47\x8b\xb1\x6a\x4d\x04\x07\xb9\xac\x50\x76\xaa\xba\x0e\x79\x0b\xab\xa4\x03\x7c\x8d\x16\x66\xe4\x2a\xa1\x92\x3e\xfb\x19\xe3\x62\x32\x95\x38\x46\x66\x7c\x01\x14\x9f\x95\xbc\x56\x2a\x62\xe4\x3c\x6f\xd9\x2d\xac\xd5\xe3\x8c\x2c\x14\x50\xa1\x55\xa0\x41\xe3\x67\x6a\xd8\xac\x37\x8c\xa9\x03\xe9\x54\x28\x27\x4d\x03\x96\x44\x95\x2f\x5f\x9a\x8c\x52\x51\x36\xd3\x45\x94\xdc\xec\xc2\x6f\xe9\x56\xcb\x88\x1f\x05\x4a\x06\x2e\x84\x8d\xd6\x40\x6f\x62\x51\x18\xa8\xea\x0d\x6a\x7e\x54\x59\xa5\xb1\xd7\x50\xd0\x6f\x01\xf4\xf0\x9c\x3f\xb2\x61\x81\xe6\x1f\xb7\x9b\xb4\x29\x69\xcb\xbc\xc3\x0f\x5d\xa3\xc7\x66\x6d\xfd\x0e\x0d\xdf\xb0\xec\x96\xcd\x79\x29\x6d\xe8\xe8\xba\x6e\x84\x72\x99\x47\x27\x83\xd1\x61\xde\xf3\x0c\x36\x71\x6a\x16\x2d\x6c\x19\xb2\x05\x5a\xa5\xe1\xb3\xee\x67\x61\x4d\xf5\x11\xd6\x78\x7d\x8d\x74\x24\x32\x3c\xcd\x09\xc7\xc3\xa8\x71\xa1\x5b\x78\xfd\xf4\x71\xda\x32\x6a\xf3\xb3\x54\xd7\x34\x2d\xae\xfa\x85\xa6\xdf\xd0\x1a\xda\x4f\x29\xae\xfa\x2f\x68\xff\xa3\xf6\x67\xca\x7f\x60\x88\x0d\xb3\x18\x4b\xb2\x39\x96\x67\x07\xd9\x79\x76\x9d\x7d\x3f\xfb\x3c\xfb\x22\x7b\x97\xfd\x32\xfb\x57\xec\x77\xd8\xef\xb3\xff\xc8\xfe\x17\x9f\x4f\xcd\xbe\xa7\x7c\x73\xbe\x45\x5f\x51\x4d\x1d\x22\xd1\xcc\x84\x4f\xce\x30\xe5\xc5\xec\x19\x39\x46\x3a\xc0\x27\x90\x8c\xef\x21\x1f\xcf\x61\xdf\x8d\xe8\xca\x22\x2b\x91\xec\xac\x5b\xf3\xf4\xef\x6a\x31\x5d\x32\x1e\x64\x71\x35\x32\x5f\x54\xe3\x72\x26\xa3\x99\x15\x8f\x13\xe7\x26\x30\x6f\xb8\x1d\x4b\x7a\xe7\x89\xbb\x71\xd0\xfa\x78\x69\xa3\x32\x79\x8e\xc7\x92\x8b\x59\x65\x24\x9a\x55\xac\x78\x25\x16\xf4\x74\x2c\xd1\x88\xc7\xb0\xeb\xb4\x92\xc2\x7b\x95\x79\x87\x9d\x3e\xd5\x61\xc9\xaa\x1d\x82\x8b\x1f\x3b\x36\x65\xf3\xaa\x5e\x57\x61\x39\xd6\x59\x86\xd7\xc9\x37\xea\x30\xf9\xb8\x5f\xc1\x1a\x37\xa2\x7a\x9b\x01\x12\xf3\x6e\xa2\x38\xc0\xdc\x72\x3e\x20\xa3\x39\x35\x1f\xc8\x26\x14\x18\x52\x99\xc2\xdb\xab\xe7\xe2\x87\x7c\xae\x3b\x1c\xe8\x8c\x1e\x72\x79\x37\x62\x27\x72\xc9\xbf\x03\xda\xd4\x67\xe3\x9e\x32\x1c\x57\xac\x3e\x95\xf2\x3c\x48\x93\xc9\x27\x73\x1f\x4b\x0f\xe3\xfe\x6e\x95\xd2\x72\xb1\x79\xe6\x1d\xd0\xcd\x85\x5d\x7b\xce\xa6\x39\xcf\xef\x32\xe6\xed\x3e\x74\xf3\x69\x3e\x12\x8e\x27\xf3\xdd\xaa\x8d\x38\xc3\x3a\xa9\xa7\x3b\xb2\xe7\xe7\xe9\xf5\x4d\x27\x98\x37\xaf\x57\xbb\x40\x12\xde\x78\xdf\xfb\xc8\xc2\xde\x05\xa9\x2d\x05\x79\x85\x5b\xc2\xf1\x3d\xd2\x6f\x3e\xe7\xe9\x7e\xb2\x8b\x8a\x73\xa3\xf8\xca\xf1\x8e\x69\x69\x32\xe1\xe5\xb5\x0e\xa6\x49\xc4\x7d\x26\x8c\x6f\xc4\x23\x67\xd6\xcc\xdb\xe9\xcd\x2a\x5f\xc3\xd2\x3f\x98\x9d\x37\xfa\x93\x73\x4f\x5c\xfc\x69\x69\x99\xd9\xbf\x47\xcd\x52\xff\x59\x6b\x64\xee\xda\x60\x5f\x37\x3f\x3c\x6e\x57\x68\x66\xd0\x9f\x20\xa3\xeb\x90\x28\x80\xec\x34\x0c\x6c\x39\xfa\xf9\x65\xd3\xd6\x53\x13\x3d\xd3\x4f\xb6\xbf\x6b\x55\xab\xeb\x27\xb2\x68\x1c\xcd\xbb\x85\xad\x69\x11\x8f\x8c\xa4\x1c\xa0\xfb\xc0\xe2\x79\xd6\xb5\x70\x64\xaa\x68\x52\xfa\x44\x3e\xed\xc8\x12\x86\x06\x0a\x75\x61\x70\xe7\x2d\xd1\xd2\x6b\xef\xee\xbe\x39\x31\xed\xbb\x47\x20\xeb\x62\x5f\xc3\xc1\xbe\x45\x1a\x1f\x6f\xe8\x34\x78\x95\x63\x1d\xd3\x41\x4a\xdf\xff\xa8\x21\x41\xc7\x06\x30\x35\xca\x47\x86\x9a\xc0\xf0\x65\x20\x6d\xd4\x6c\x40\x96\x11\x3b\x6f\xdb\x05\xc7\x40\xcf\x01\xae\x17\xbb\xbb\xa4\x5d\x02\x82\xff\x73\x4d\x5f\xc5\x9b\x58\xda\x07\xb9\x6f\x64\xcd\xbf\x44\xa2\x54\x2f\x52\xaa\xac\xdf\xd5\x31\xd8\x0e\x17\x65\x45\x72\xf4\xc7\xc1\xd3\x3a\x17\x6c\x1d\xe3\x99\x14\x26\xcf\x52\x53\xf0\x32\xd0\xdd\xbe\x92\x58\x42\x15\x18\x38\x86\x4a\xba\x18\x38\xc7\xe7\x73\xb2\x01\x3a\xef\x87\xde\x1a\x0c\x86\x47\xeb\xba\x63\x80\xcc\x02\x60\xb3\xaf\x61\xec\x06\x45\x7a\x37\xd0\x7f\xd3\x4d\x42\x76\xa5\x92\x3b\xc2\xa5\x5e\xa1\x89\xd3\xe0\xfa\xe8\x41\x1b\xd8\xd6\x6f\x13\x37\x5a\xd4\xc2\xfd\x3f\x5f\x05\x71\x01\x41\x23\x73\xec\xbb\x2d\xe0\x68\x1c\xed\x54\x78\x5e\xb2\xf5\x62\x5a\xf0\xd0\x7e\x1b\xa4\x63\xd5\xc2\xe8\x09\xa9\xe3\xc4\x04\x70\x22\x0e\xde\xe4\x2b\x53\xe0\xcb\x8b\x25\x1c\xde\xb7\xde\xa2\xd1\xeb\xa0\xe4\x09\x4a\xad\x03\xeb\x87\x97\x31\xe4\xdb\x1a\xcb\x87\x2e\x72\xd9\x22\x51\xdc\x32\x57\xc7\x23\xe5\xea\x50\x82\x42\xd7\x1b\x35\x9a\x8e\xfb\x0d\x20\x1a\x5e\x6b\xd6\x37\x52\xbd\x09\x29\xdf\xcf\x9c\x59\xfe\xec\x63\x8f\xdc\xda\x5e\x07\x86\x5e\xdc\xfc\xa1\x7d\xef\xa1\xb8\x14\x0b\x3f\x46\xb6\xfe\xad\xe4\x51\x7d\x62\xc1\x00\xc6\x1f\xc0\x1a\xa1\x54\x74\x83\x7d\x43\x9c\xb8\x36\x1c\x7c\xa7\xc2\xb0\x49\xd9\xb1\xfb\xa5\xbe\xe1\xa2\xb5\x61\xa7\x8e\xfe\xe1\x2a\x10\x9c\x3d\x3b\x56\x74\xec\x3a\x2f\xdf\x5e\x1d\x9f\x3b\x74\xf5\xf3\xbf\x51\x78\x21\xf9\x50\x2f\x37\xca\xdf\xa6\x92\x55\x5b\xb7\xf4\xb9\x63\x1b\xdf\x66\xab\x20\x50\xea\x45\x1f\x72\x2b\x1c\x94\xb9\x84\xa5\x93\x74\x9b\x44\xcf\xe7\xc4\x1b\x45\x2a\xeb\xcd\xb1\x3e\x5c\xec\xc2\xb9\x28\x37\xf9\x0e\xd0\xff\x2a\x88\x6f\x70\x64\x96\xf9\x4e\xf7\xd9\xc7\xc2\x93\x97\x69\xe4\x69\x5d\x9f\xf9\xa4\x04\xd6\xd1\x72\x31\xc6\xed\xee\xc0\xc0\x9c\x63\x54\xf8\x16\x7a\x97\x79\xaf\x1f\x0d\x10\xcc\x89\x19\x51\x31\xb0\x61\xa7\x6c\x1a\xce\xa6\xc9\x14\x1c\x1f\xac\xa5\x6b\x8e\xdc\x7f\x8d\x68\x43\xa4\x96\x23\x3a\x1f\x5c\xa8\xa6\xf1\xd0\x08\x12\xc7\xb0\xd5\x97\x4b\x95\x28\x7a\x65\x0b\xa8\x3a\x00\x6d\x71\x6b\x83\xaf\x1a\x44\x13\x57\x10\x59\x36\xf8\x2e\x09\xab\x62\xc8\x6d\x98\xa5\x5a\xfb\xaf\xb0\xff\x9a\xce\xed\x06\x0d\x3f\xe9\x3b\xd9\x98\xed\xc3\x9d\xc6\xed\x8a\xfd\xc9\xf8\x1b\x28\x47\x1f\xe7\x35\x1a\x0c\x82\xf2\x93\xe6\x26\x47\xa9\x84\x34\x4a\x12\xd3\x63\x75\x07\x66\xc3\x4e\xf3\x5d\x11\x79\x58\x58\xf2\xd4\x7e\x5c\x1d\xe3\xd8\xe6\x57\x26\x38\xae\xce\x96\xe5\xfe\x53\x6b\xe3\x8f\x8a\xc1\x9b\x74\xf8\x3c\x2c\xda\x41\x6a\xcd\x21\xba\x2b\x93\x27\x2c\xd0\x2e\x38\x76\x11\x3c\x9d\xe6\x4d\x8b\xf6\x3d\x00\x14\x4b\xda\xa2\xc2\x29\xef\xf9\x53\x5a\x56\x7b\x5a\x7b\x4e\xa9\x9e\x7e\x5c\x7b\x4b\xfb\x1f\xb4\xdf\xd0\x7e\x53\xfb\x86\xda\xb4\xf2\x3d\xed\xaf\x55\x3e\xe1\x2c\xc4\x86\xd9\x34\x3b\xce\xce\xb1\xcb\xac\xc1\x1e\x63\x1b\xec\x13\xec\x0e\xfb\x11\xf6\x33\xec\x1f\xb1\x5f\x60\xef\xb3\x0f\xd8\xbf\xee\x78\x4b\x7e\x87\xfd\x39\x6b\xfb\xba\x7d\x41\xdf\x8c\xcf\xf1\x15\x7d\x87\x7d\xa7\x7c\x17\x7c\x57\x7d\x0f\xfb\x1e\x53\xb3\xa5\x88\x12\x24\x45\xa2\xfe\x78\x2c\xe9\x28\x87\x12\xd5\xb6\x0a\x47\xb3\x4a\x33\x19\xf0\x90\x83\x1b\x40\x13\xb9\x64\x68\xc8\x63\x5a\xb9\xf8\x64\x6f\x80\xa4\x66\xdf\xb9\x7c\x42\xf5\xe2\xd4\x78\x29\x9e\x74\x42\x8b\x8a\x75\xe4\xd5\xda\x2a\x89\x78\xd8\x86\x85\xa3\x39\x6f\xf6\xa4\x3c\x72\xa2\x32\xea\x79\xe7\x65\x3b\x9b\x3c\xf7\xac\xff\xd4\xec\x49\x61\x0b\x6f\xf8\xa1\x7c\x5f\x02\x7b\xf6\x80\x4e\xd6\x45\x09\xf1\x98\x0b\x3c\xd4\x5c\x2a\xd9\x91\x56\x7a\x66\x7a\x6a\xde\xac\x26\x38\x32\x1e\x4b\x4e\xa9\xdf\xa9\x15\xcb\x39\x27\x29\xe3\xc9\xb8\x7f\x32\xec\xd9\x27\x86\xa3\x39\x6f\x72\x94\xcd\x25\xa6\xa2\x59\xf7\x70\x07\x58\x3e\x11\x08\xab\x7d\xad\xd9\x4c\x34\x2c\x94\x84\x4c\xe1\xb9\x40\xd8\xf3\x89\xfc\x5b\x66\x92\x32\x2a\x54\xbc\xb1\x78\xac\xdb\x85\x06\x6e\x76\x51\xef\xc6\x51\x8b\x2a\x14\x2e\x8a\x84\x95\x73\x4d\x60\x6f\x77\xed\xdf\x66\xa6\x6e\xbf\xb7\xc3\x21\xab\xf0\x47\xae\xd3\xef\x72\x7f\x17\xef\xea\xb8\x69\x26\x3b\x96\x0a\xb1\x8e\x6d\xf3\xa4\x77\xc0\x9c\x22\x80\x79\x6e\x84\x2e\x84\xec\xfc\x4b\x2d\x82\x70\x92\x89\x6e\xa9\x28\x00\xaa\x97\x97\xcf\x75\x5e\x3a\xb5\xb7\x64\xd6\x4d\x3a\xaa\xbb\xe6\x1e\xbb\xdb\xcb\x1a\x5e\x23\xb2\x33\xdb\x0a\x67\x73\x7b\xde\x99\x39\xe5\xbd\x9d\xf1\x18\x09\xfe\x8e\xaa\x5e\xad\xa5\xe8\xcc\xc9\x5c\xb0\xd3\x49\x4f\x2a\x7f\xa9\x51\x5e\x74\xaf\xef\xd8\xe1\x98\x75\x16\xc9\xba\xd9\xcf\x97\x9e\xbd\x26\x6b\x63\x17\x12\x3e\xb3\x78\xe4\x59\x3e\x3f\xa6\xa7\x52\xf7\xca\x9b\x40\xe9\xc8\xa7\xba\x0e\x89\x0a\xa0\xa7\xea\x77\x4b\x29\x94\xcf\xfe\xfc\x73\xfb\xda\xab\xb0\x40\xad\x85\x79\xd8\x96\x61\x3f\xff\xc2\x1a\xa2\x0b\x56\x29\x7e\xf0\xd9\xa8\x0d\xc9\xef\x5c\x3c\x70\xbc\x9f\x10\x1d\x13\x07\xa3\x54\xb1\xca\xf6\xd5\xdc\xe7\x33\xe5\xb4\xef\x75\x6e\x5d\xed\x4f\x3b\x96\x55\xa4\x40\xae\xbd\xeb\x3b\x46\x54\xa6\x1a\xe0\x00\x7d\xb3\x00\x2f\x92\x59\xaf\x4a\x2a\x4a\xaa\x81\xf2\xc3\x30\xd9\x0e\x30\x7e\xd8\xa4\x6d\xde\x14\x24\xf9\x7a\xbb\x41\x81\xa3\x3a\x6f\x9a\x75\x7d\x8d\xbd\x6d\x96\x05\xfc\x4f\x73\x3c\x37\xc0\x01\x4e\x95\xb6\x89\x32\x67\xa5\x2d\x5d\x08\xbe\x8e\xa1\xf6\x43\x05\x18\x06\xdb\x96\xa0\x76\x8b\x02\x53\x34\xca\xfe\x9a\x83\xdf\xff\x90\xfc\xbd\x24\xc3\x71\x10\xee\xd2\xe9\x89\xf7\x53\x56\x66\x9f\xb8\x9b\x9b\xae\x17\x81\xf1\x25\x10\x1d\x0d\xb9\xf5\x6f\x15\x94\xe2\x08\x86\x67\xd9\xf5\x40\x37\x2f\xa3\x8e\xf6\xf7\x84\x80\xc9\x52\x46\xb0\xa7\x9d\xa6\x23\x61\x41\xd4\xe8\x9f\xcf\x1e\x22\x4a\x9c\x04\xd8\xd7\xa0\xa7\x38\xe2\xd3\x6d\x39\xd1\x73\x0b\x9b\x18\x39\x6c\xac\x93\xbe\x4a\xc7\xe6\xbe\x0b\x4e\x77\xc1\x6b\xb6\xee\x56\xae\x83\x67\x47\x06\x24\xbb\x55\xc5\x81\xfb\xbf\xcf\xcd\x92\x45\x8f\xb3\xbf\x38\x18\xad\xde\xff\xd6\x0e\x61\x43\xf8\xb4\xa1\xe5\xca\xfd\xef\xe0\xce\x46\x98\xfd\x45\x45\x60\x64\x11\xf6\x70\x14\xf7\xef\x6d\xc0\x62\xaf\x93\x5d\x00\xa5\x53\xe5\x87\x87\xa8\x49\xe7\x07\x78\xab\xaf\x7d\x35\x32\x42\xa3\x63\x6c\x4b\xaf\x93\x51\xaf\x9b\x75\xde\x02\x9a\x02\x7c\x28\x56\xe0\xd4\x04\xb5\xa8\xac\x1b\x15\x21\xb6\x40\xa9\xeb\x13\xb4\xb8\x08\x67\x8b\xb6\xd2\x81\x07\x61\x6c\xe2\x83\x82\xb3\x9c\xb8\x7d\x6d\x18\xb9\x7c\xd9\x2a\xcb\x66\x29\x30\x0c\xdd\x90\xc1\xf0\x80\x3f\xe5\x5b\x5e\x5d\x3f\xb3\xf4\xfe\xa6\xa8\x63\xfc\x69\x5a\xb8\xf1\xc8\x01\x7d\xb7\xfd\xed\xdf\x5c\xe1\x12\x2e\x82\xda\xae\xec\x3e\x74\xd8\x64\xef\xb0\xc5\x2f\xb7\xf8\x47\x1f\x01\x6f\xf3\xf2\x73\xbf\xbc\x10\x52\x48\x25\xfd\xeb\xef\xef\xe0\xeb\x29\x7d\x38\x30\x1e\x0b\x84\x39\x7f\x82\xf5\x56\x5a\x06\xb6\xaa\xa5\x17\xcf\x4f\x8d\xd2\xe0\xfc\x27\x1e\x7d\xf2\x1f\xb2\xb7\x89\x93\x0e\xdb\xbd\xca\xc9\xd0\xfc\x2c\x71\x27\x34\x6b\x8c\xdd\xa4\x5b\xa0\x5b\xe0\x9b\xc0\x1a\x5f\xaf\x7c\x31\x40\x8d\xc2\x36\x9d\x3d\x3d\xc8\x48\xea\x46\x3d\xd4\x4f\xbb\xb4\xc6\x53\xeb\xb6\xc1\x6e\x1a\xe0\x6f\x16\xc4\xe8\x0b\xfc\x0d\xe8\x0d\x0a\x3d\x6e\x81\xb6\x6d\x88\x3a\x87\x30\xaa\x91\xb9\x4d\x09\xbf\x5f\x6c\x10\x0d\xe7\x91\x9b\x10\x20\x08\x29\x86\x12\x58\xf4\x73\x6e\x1b\x86\xb4\x2a\x9c\x78\xfd\x9d\x74\xfb\x7f\x5d\xa2\x8d\xfd\x67\x5f\x5f\x2f\x56\xb1\x8e\x4d\x8c\x3f\x07\xa2\x07\xf3\xd8\xc5\x6d\x14\x91\x16\x5c\x94\x57\xf9\xf5\x19\x88\xb4\x88\x8d\x1b\x16\xc6\x7d\xc4\x9f\x19\x0c\xf6\x93\x58\xb7\xac\x46\xd9\x37\x34\xfa\x12\xa4\x65\x14\xc9\x58\x99\xc6\xd4\xe8\x9b\xf8\x91\x50\xff\x63\x06\xde\xa0\xd0\xa7\xe8\xd2\x79\x9d\xcb\xf6\x87\x65\x39\x75\xe3\xe2\x11\x09\xc8\x86\x59\x7c\x9b\xac\x8a\x51\x91\x8b\xc7\x4c\xd2\x3f\x3f\x8e\x26\xf4\x55\x19\xfe\x12\x1f\xbc\x69\x4a\x11\x5b\xe6\x6b\x12\x38\xf4\x32\x22\x9f\x8e\x1f\xd0\xeb\x24\x5b\x92\xf6\x45\x20\x6c\x4a\x9c\xc1\xdc\xb2\x71\x6a\x36\x15\x3b\xb6\x7d\xdb\x7c\x21\x84\x0d\x32\xb1\x65\xda\x98\xe8\x29\x41\xdf\x42\x28\xcc\x1b\x6b\xfb\x2f\x80\x76\x04\xb6\x39\xe7\x85\x12\x6d\x71\xba\x7b\x7c\xfa\xd0\x0a\x27\xec\x5a\xb4\xc3\x0f\x9e\x35\x10\x79\x8e\x76\xf4\xd1\x2b\x5c\x2d\x6d\xa8\x87\x43\xb8\x3a\x49\x7c\x13\xb9\xe3\x40\xb9\x80\x6d\x44\x22\x29\x87\xe4\x44\x3f\x46\x3d\xae\x56\xd7\xd7\xfd\x52\xcb\x68\x37\xb4\x4d\xed\x33\xda\xe7\x3b\x6c\xe2\x7f\xaa\xfd\xb2\xf6\xcf\xb4\xaf\x69\xbf\xab\xfd\xa1\xf6\x6d\xed\xbf\x6a\x7f\xcd\x06\x58\x84\x99\xcc\x66\x2b\xec\x04\x3b\xcf\x1e\x60\x1b\xec\x25\xb6\xcb\xbe\xc0\xde\x66\xef\xb2\xf7\x55\x3e\x53\x18\xa2\xb3\x73\xac\xd3\x51\x53\x89\xc0\x13\xf1\x0f\xe5\x87\x56\x58\x32\x17\x0b\x78\x5c\xfc\x15\x96\xe9\x96\xd1\x70\x26\x9f\xcd\xb8\xc8\xaa\xcb\x1f\x88\x75\x08\x5b\xa1\xce\xc4\x28\x9f\x51\x3a\x94\x78\x32\xe0\xe2\x95\xa4\xf2\xb7\x89\x06\x3c\x43\xb2\xb8\x57\xb1\x07\xd9\x9e\xf4\xc4\x1b\xb5\xa8\xd5\x43\x32\x9a\xe9\x28\x20\x72\x4e\x32\xeb\x86\xe6\x44\xce\xeb\x05\x05\xd9\xc7\x9d\xb1\xc5\x9c\x4a\x0d\xde\x98\xc7\x33\x48\x0b\xec\x99\xe2\xe4\xe2\xdd\x1d\xfd\x51\x87\x12\xa6\xe6\x18\x59\xcf\xd7\x24\xbc\xc7\xbb\xed\xd0\x69\x55\x02\xd8\xdb\x16\xdf\x71\xff\x4d\xc6\xfd\x9e\x6f\x49\x47\xd2\xa4\x1e\xee\xfd\x9f\x60\x67\x9b\xb8\x5f\xf1\x83\xf7\x3c\xd6\x12\x41\x0f\xe2\xa9\x96\xdf\xde\x3e\x21\x4f\x3a\x10\xeb\xf8\x16\xe4\xf2\x1d\x69\x41\x76\xcf\x0c\xae\x43\xb5\xc8\xa8\x75\xe0\x0a\x88\xba\x4f\x0f\xc7\x94\xd8\x46\x69\x07\xbc\x35\x0a\x99\xbd\x29\x57\xe7\x0c\xb1\x80\x97\x08\xfd\x81\xce\x52\x20\xf6\xe6\xb5\x07\x0b\x47\x66\x75\x71\xe0\xa8\xf5\x57\xf5\xcb\xc3\x13\x63\xd9\x83\x13\x0b\xe5\xe9\x64\x24\xd1\xd7\x9f\x9e\x7d\xf5\x73\x57\x80\xa3\xd9\x6b\xb3\xd9\x1c\x6e\xbd\x1f\x6f\xff\x7c\xe1\xcc\x1f\xd4\x4a\xb8\xf3\xdc\x97\x53\x76\x80\xf5\x26\x8c\x85\x03\xcd\x53\x57\x46\x4f\x9c\x9d\x8e\xec\xeb\x1b\x96\x4d\x13\x10\x7c\xcb\x00\xe4\x8d\x5f\x6a\xf8\xfe\x1c\xa8\x39\x10\x65\x14\xa8\xff\x86\x81\xd8\xa2\x41\xe1\xcb\x82\x9f\x8f\x21\xad\xa7\x4a\xed\xb7\x6c\x32\x9b\x55\x5e\x33\x4b\xa9\x12\xe7\xe0\xef\xa0\x06\x04\xae\x48\x2a\xa6\x9c\xca\xe0\x4d\xb1\x2a\x1e\x18\xa0\x62\x4d\x97\x6b\xa2\x14\x5d\x00\x4c\xa4\x7c\x0d\xa7\x04\xac\xa7\xce\x27\x88\xb6\x61\xad\x1a\xe0\x5b\xf6\xcc\x02\x51\x6c\x91\xa8\x58\xe8\x1f\x0d\x5f\x43\xdb\xe9\x1d\xd2\x59\x35\x72\xcc\x86\xd1\xe4\x54\xb1\x01\xbe\x4d\x33\x63\xb8\x32\x2a\xb2\x87\x4c\xd1\x93\x9f\x0a\xf1\xc7\x93\x74\x2c\x43\x85\xa2\x4e\x27\x26\x40\x4d\x44\x46\x30\xb4\x6c\x52\x83\x47\x0f\x21\xdd\xff\x73\x3c\x7c\x81\x64\x7c\xb8\xa0\x0b\xd1\x04\x35\x53\x45\x87\x07\x1f\xec\x1d\x4a\xaf\xd3\x1a\xe9\x15\xde\xe0\xe3\x8b\x5c\xac\x57\x30\x76\x0a\x44\xc1\x2b\x76\xef\xc3\x54\x47\x7e\x12\x3d\x7d\x07\xb3\xaa\x6d\xcf\x8d\x2d\x4e\x2d\x80\xf7\x3f\x49\x68\xf2\xba\x8e\x54\xf0\xb4\xe1\xbf\xb4\xc6\xf5\xcb\x63\x43\x89\x32\x97\xc3\x47\xfc\xb2\x2f\x1c\x98\xb2\x0e\x2c\x4c\x67\x57\xbf\xbb\x76\xb7\x7c\xe8\xda\x73\x7f\xb0\xc6\x8b\xd3\x51\x16\x1f\x3e\xcb\x12\xbf\xc0\xb4\x4d\x00\x46\xab\x62\xf2\xe7\x8f\xa6\x3e\x1c\x1a\x80\x69\x65\xbf\xf8\x95\xf6\xbf\xb9\xfc\xf3\x35\xaa\xdc\x66\xda\x9f\x7e\xe9\xc8\x95\x13\xd9\x6a\x79\x93\xdc\xe7\x01\xe0\xce\x89\x30\xe9\xfc\xd3\x8b\xc5\xb4\x83\x35\xe0\x5e\xc9\x98\xba\x6c\x12\xf5\x7c\x86\xf3\xcf\x4d\x15\xa9\x56\x4f\x61\x64\x1f\x2f\x02\x91\x87\x30\xf4\x30\x7a\xcf\xd0\x81\x61\xd2\x75\x72\x23\xc6\x36\x3d\x36\xd6\xd5\xd3\xb2\xf4\x74\x1d\xdf\xdf\xc5\xb7\x64\x77\x60\x07\xbc\x04\x4a\x09\x28\xdd\x06\xde\x4a\xbf\x12\x23\x7a\xdd\x0a\xbe\x10\x0c\x73\xfe\x46\xea\xfc\x22\x68\xec\x31\x6a\x56\xbb\x26\x17\x6e\x12\x06\x03\xd0\xb7\x37\xec\x70\x68\x23\x0d\xda\x4c\x41\xbc\x35\x9d\xe5\x3f\x18\x26\x9e\xbd\x6e\x0c\x06\xbb\x2e\x66\xfb\x39\xff\xd2\xbc\x71\xe2\x08\xa1\xd4\x48\xcb\x13\xa7\xb0\x13\x3d\xd7\xb2\xcc\x1d\x3e\xf8\xe4\xea\xd4\x42\x6a\x27\x34\x5c\xac\x14\x53\xb7\x88\xcb\xed\xda\xaa\x03\x39\xf9\x7c\x69\x17\xb7\xe5\x0e\x48\x36\x21\x83\xcf\xf2\xe8\x95\xf4\xce\x5b\xc6\xd8\x33\xb0\x7a\x5f\xa9\x6f\x83\x1a\x17\x26\x79\x4a\x5c\xcd\x71\x29\xc1\x85\x7d\x57\x05\x3e\xb9\x49\xd4\xc2\x13\x43\xa3\xfb\xd7\x8d\xf5\x4d\xa2\x17\x82\x44\x38\x98\x24\xec\x3b\xbc\xa7\xa1\x78\xdb\x5f\xd4\x96\xb5\x67\xb5\x1d\x15\xef\x7e\x49\xfb\x55\xed\xb7\xb4\x6f\x68\x7f\xa8\xfc\x2b\xff\x77\xe5\x70\xc2\xd9\x20\xd3\xd9\x18\x3b\xcc\x2e\xb3\x6b\xec\x39\xf6\x32\xbb\xcb\xfe\x3b\xf6\x15\xf6\xf3\xec\x9f\xb3\xdf\x67\x1f\xb2\x3f\x66\xff\x95\x7d\xe4\x23\x5f\xbf\xea\x20\x2d\xfa\x8a\xbe\x53\xbe\x8b\xbe\xab\x8a\x3f\xf6\xac\xef\xa6\xef\x93\x6e\x5c\x0c\x47\xc2\x32\x1a\x99\x60\x6a\x57\x4c\x20\xb3\x67\x97\xe0\x15\xec\x81\xbd\xf8\x98\xf4\x36\xbb\xfd\xad\x6f\xa5\xfb\x78\x31\xcb\xd4\xf0\x22\x32\xc1\xfc\x63\x9e\xce\x22\xeb\x39\xa4\x24\xdd\xf2\xd3\xc9\x2b\x51\x84\x27\xa0\x88\x7b\x0c\xb3\xd8\x94\x1b\x56\xd4\x23\xf7\x40\xca\x09\xaa\x3b\x1c\x50\x65\xe7\x3c\x73\x63\x48\xc7\x58\x31\xba\xf7\xc3\xf1\x58\x4c\xc9\xbd\x95\x8e\x7f\x47\x76\xad\x02\x9e\x54\x9a\x88\x4c\x87\xce\xda\x69\x3a\xb9\x21\x2b\x1a\x96\x0a\x66\x24\x73\xf9\x78\x2c\x30\xd5\x89\x96\xdd\x9e\x4f\x7a\xc0\xdb\x23\xe6\x8d\xab\x15\x5d\x56\x71\x63\x73\x89\xee\x80\x74\xcb\x6e\x45\x91\x9a\xf2\x8e\xaf\x2a\xda\x4c\xd4\xa3\xd1\x2a\xa7\xa6\x98\x7b\x35\x07\xbc\x80\xd6\xdd\x79\x3f\x61\xf5\x86\xd4\xfa\xbb\xc5\x7c\x77\x58\x99\xbf\xa8\x03\x27\x94\x0f\x83\xd2\x73\xcf\xb3\x78\x2c\x1a\xf0\xfc\xc9\x73\x6e\xdc\x54\x5b\xe6\xc2\x1e\x7f\xd7\x2d\xad\x33\xf9\xce\x1c\xdf\x8d\xbd\x8a\x56\xe7\xf9\x3f\x4d\x85\xb3\x39\x05\x87\x72\xce\x3c\xf3\x87\x32\xf9\xc5\x5c\xe6\x20\x53\x0b\xf6\xa6\xdc\xc4\x90\xdb\xdb\xc2\x16\xcd\x26\xe2\x2a\xcd\x44\x73\xc9\x09\x16\xf1\x64\xa9\x6a\x89\xdd\xc7\xfe\x2d\xce\xde\xb2\x18\xb5\xbd\x55\x59\x60\xc5\x92\xdd\x7b\xaa\x0f\x6f\xbb\x9a\xfb\x65\xc4\xf6\x5c\x5e\xdc\x0b\xf3\xe4\xe3\xca\x04\xab\x33\x28\xf7\xf2\x55\xc7\x8c\x3c\xf2\xb1\xfd\xa7\xa2\xbb\x75\x24\xf1\x9d\x2a\x5f\x2a\x96\x42\x44\x81\x80\x78\xd4\xd3\xb8\x2b\x1c\xe6\x33\xdf\xb3\x8c\xa9\xab\x12\x48\xc7\xaf\xf7\x87\x0a\xd5\x82\x59\x2e\x1e\xcb\x38\xc0\xf6\xea\xf8\x50\xda\xe6\x02\xb0\xf7\xcd\x95\x2d\x09\x2a\x4d\x85\x46\xf7\xdb\x97\x96\xdb\x77\xc0\x31\x10\x31\xbe\x06\x8c\x0e\x1f\xfc\xdc\xb3\xaf\x95\x0e\xf5\xb9\x91\xa5\xa0\x37\x74\xdb\x04\x26\x8f\xbc\x98\xb8\x71\xa8\xfc\xd0\x90\x9f\xc5\xac\xe3\x63\xc2\x99\x7c\xf9\xc6\x30\x00\x99\x0e\x1f\x61\xeb\x1c\x57\x46\xd1\xe4\x74\x6a\x18\x1b\xc0\x03\xbd\x4d\x50\x41\xb6\x2b\xf9\x05\x54\x08\x45\x5e\xad\xc7\x0f\xca\x55\x9e\x3e\x16\x5b\x4d\x2f\xce\x71\x21\xe1\x1f\x9a\x5b\x42\xef\x10\x6a\x55\xc9\x37\x38\xcd\xee\xe7\x18\xcf\x98\x00\x9d\x4c\x30\x07\x93\x67\x89\xb6\xda\xf6\xf5\x89\x2d\xf6\x1e\x1e\x4a\x60\xbb\x9d\x2e\x87\xc6\xd6\xd9\xbd\x2b\x79\x8a\xbc\xd8\xde\xb5\xba\xd9\x7e\xec\xc8\xdd\xf6\x66\x68\x6c\x90\x9d\xc6\xd9\x05\x5e\x2a\x81\xfa\x5f\xa6\xa1\x27\x84\x35\x36\x1a\xce\x0a\xbe\x49\xfc\x99\x1e\x04\x0e\x96\x6a\xed\xaf\x9f\x9b\x10\xdb\xe1\xb3\x2d\x37\x4a\x56\xa4\xec\x3b\xca\x0a\x52\x47\xaa\xfd\x46\xff\x35\xaa\xf3\x55\xa4\x00\x39\xb8\x42\xe6\xd8\x15\x38\xba\x8d\xb7\xb0\x49\xd8\xd4\xb1\x41\x27\x46\x81\x26\xf5\x8e\x3c\x3a\xc2\xee\xf0\xd0\x54\x05\x85\x32\x55\x45\x21\xd0\xfe\x1b\xb4\xff\x6a\xee\x30\x68\x1d\x7c\x2b\x9e\x2b\x11\x8f\x1f\x4d\xb1\x26\x1f\xbf\xa4\x63\xf4\x71\xc2\xf5\x28\x7c\xfe\xd1\x70\xa5\xad\x73\xe2\xa5\x70\xb0\x69\x48\xe2\x74\x32\x42\x1b\xa0\x8b\x41\x6c\xb0\xaf\x3f\x39\x46\xb7\x25\xfa\xcf\xee\xeb\x85\xd8\x6a\x17\x41\x64\x4c\xae\xa0\xc9\xde\x7d\x78\x8e\x37\x6d\xff\x13\x9b\x16\xf8\xe7\x18\xa1\x64\x99\x02\xe2\x42\x8e\x3f\x15\x25\x38\xcd\x8d\xbb\xc4\xdf\xb0\xe9\x0e\xef\x5d\x3e\x3e\xc8\x8d\xda\x64\x34\xb5\xdb\xc4\xcc\x53\x84\x89\x97\xe0\x7c\x62\xdf\xeb\xd6\x0e\xdf\xbd\x35\x98\x4f\x6f\x94\x86\xe7\xed\xcb\xfd\xf6\x68\x18\xa9\x62\x6f\x2f\xd7\xfd\x45\xc7\xe8\x1d\x91\x54\x5e\x2b\xc2\x3c\xf7\x2b\xc5\x66\xf1\xe8\x97\x5a\x6f\x54\x0c\x61\x05\xfb\x2d\xc2\x56\xef\x5c\xf0\xa5\xe1\xd7\x60\xd0\x43\x4f\x9f\x59\x2e\x51\x65\x0b\xce\xb9\x67\x32\x03\x33\x93\xa6\xd3\xde\xb6\x51\x02\x1e\x1e\x28\xfc\xcc\xbf\x37\x74\xf9\xae\xd1\x8a\xbe\x50\x7f\xf8\x52\x0a\x22\xdd\xd8\x36\x42\xcf\x0e\x0c\x1d\x1c\x7d\x64\x45\xe7\xaf\xcc\xd9\xa2\x28\xac\x47\x8e\x34\x2b\xe5\x33\x0f\xdb\xe9\x86\xd0\xf5\x4f\x1e\x98\x0e\x06\xba\xe8\xce\xd3\x3e\xa0\x21\x88\x2e\xf9\x21\x1e\x8c\xe2\x2a\xa3\x35\x89\x13\x41\xc4\x4f\xd3\xe5\x30\x56\x29\x17\xe2\xb9\x28\x2f\x3b\xb8\x12\x37\xa8\xb5\x61\x1d\xdb\x07\x22\x48\xdb\xae\xda\x10\x15\x0c\x1d\xd3\x8d\x75\x5a\x3e\x69\xa4\x8a\x0d\xc0\x68\x54\xec\xe9\xe3\xa4\x6f\x49\xd1\x12\x1b\x8e\xd8\x04\x6d\x99\xc2\x30\x74\x34\xc4\x0b\x41\x7d\x4b\x92\x8e\xbe\x2e\xde\xfb\x1c\x68\xc7\xd0\x09\x12\xf2\xd4\x30\x51\xf2\x90\x72\x4d\xe3\x29\x72\xd2\x06\xdf\xa2\xcd\x0a\x8e\x1d\xfe\xa0\x5e\xfd\x95\x17\x86\x46\xb0\x66\x73\xe0\xa1\x5f\x36\xc3\x21\xe2\x64\x20\x65\x26\x1f\xa1\x17\x82\xd8\x16\x9c\xb7\xa4\xfb\x57\x50\x14\x80\x0e\xdc\x06\xdd\x4e\x8c\xec\x88\xab\x0b\xd8\x22\x1b\xbb\xc0\x91\x05\xc7\xc1\x5c\xa2\x42\x54\x47\x64\xdf\xe0\x04\x51\xeb\xd8\x32\x61\xe8\x45\xe1\x6b\xff\xf3\xc2\xba\x63\xa4\xf8\x5a\xb9\xfe\xcd\x46\x93\x20\x04\xb5\x40\x0f\xf6\xa5\xcc\x12\x11\x40\xb2\x66\xf1\x16\x5f\x35\xe4\xe5\x41\xba\x0d\xb4\x80\xe1\x9b\x15\xda\x24\x95\x40\x6b\x16\x04\x36\x24\x07\x41\x4f\xd9\xc0\x9a\xfd\x32\xe3\xb2\x96\xba\x87\x67\xba\xf9\xcd\x1e\x2a\x1a\xba\xbe\xff\x00\xad\x49\xb3\xb1\xcb\x37\xc4\x96\xc9\xd7\x79\xba\x28\xc6\x33\x96\xb5\x99\x46\xee\x08\x60\xd6\x20\x69\x9d\x36\x74\x6a\x61\x5d\x8c\x8d\x9a\xb4\x0a\x43\xef\xe9\xa3\x72\xd9\x82\xc9\xa1\x43\xd7\x92\x2a\x27\x7e\xe0\x4f\x6b\x4b\xda\xa6\xf6\xfd\xda\x0f\x6a\xaf\x6b\x3f\xad\xa6\x29\xbf\xae\xfd\xae\x72\xfc\x02\x9b\x63\x59\xb6\xc2\x8e\xb2\x53\xec\x3c\x7b\x90\xfd\x8e\xea\x72\xfd\x17\x35\xb1\xef\xf3\x0d\xfa\xa2\xbe\x71\x9f\xe5\x4b\xfb\x96\x7c\x47\x7c\xa7\x7d\x35\xdf\x65\xdf\x83\xbe\x87\x3b\x9b\x4f\x3d\x0a\x74\x87\x3b\xd6\xb1\xf5\xca\xe7\x92\xb9\x45\x35\x0d\xf1\xba\xeb\x9d\x5c\xe8\xed\x27\xcb\xec\x99\x1c\x2a\x8e\x6f\x34\x9b\x59\x61\x51\x5f\xdc\x3f\xc3\xd4\xbc\x24\xee\x0f\x2b\xde\x58\x5e\x8d\x53\xf2\x8b\xf9\x90\xda\x13\xb6\xb7\x27\xc3\x1f\xf0\x4c\x8a\x3b\x92\x91\xdc\x62\x7e\x31\xba\xc7\x0c\x4e\x74\xa2\xee\x3c\xeb\x8e\x86\xb3\xce\x01\x16\x55\x6d\x1d\xd5\x75\x71\xe6\x59\x3c\x1a\xf6\x68\xc0\x1f\x3f\x2d\xde\x1d\x50\x2b\x55\x3d\x03\x44\xa9\xd4\x7a\x5e\x83\x49\x95\xf1\x6a\xcb\x4b\x54\x0d\x73\xd4\xdc\xc1\x8d\xcc\x8b\xf9\x64\x48\x39\x3a\xc7\x63\x6a\xcb\xb1\xc7\x8c\x0a\x24\xe3\xe1\xc0\x1e\x80\x08\x47\x3c\x5f\x11\xcf\xa1\xd0\x8d\xe2\x21\x35\x2e\x89\x77\xbb\xb5\x7b\x50\xb1\x17\x3c\xae\x70\x67\x45\x48\x47\xaa\xa2\x7a\x56\xdd\x6a\x3d\x46\xde\x23\x51\xcb\x8e\xdf\xc9\xc7\xdc\xac\xa8\x77\x16\x37\x19\x7a\xbb\x65\xdc\x07\x6a\x4f\x89\x82\x3e\xde\xd9\x3a\x03\x0e\xf5\x1e\x02\x7f\x6b\x72\xa2\x38\xed\x1d\xd5\xa0\x37\xf7\xe8\x0c\x91\x64\x34\xd3\x81\x65\xb1\xce\x4a\x94\x64\x2e\xef\x79\xa5\xa8\x6b\xf0\x98\xda\x2a\xcd\x7a\xeb\xcd\xdc\xef\x33\xa1\xd2\x52\xa7\x98\x50\x59\xd0\xa3\x9c\x2b\xd4\xa4\x36\xa3\x26\x92\x9e\xf8\xa4\x5b\x59\x7c\x2b\xa6\x44\xbe\xf3\xd9\x26\x92\x39\xaf\x2d\xa8\x98\xe2\xca\xe6\xc9\xa3\xd2\xed\x81\x17\xf5\x51\x28\xde\x9c\xcf\xc4\xe7\x8f\xbd\x39\xd1\xef\x04\xa7\x0e\x9f\x29\xb4\xe6\x5e\xdc\x38\x14\x4a\x8e\xdd\x02\x46\x17\x52\xd9\xb1\xb5\xe8\x30\x8e\xc5\x4c\xa0\xbe\xda\x9f\xad\xf0\x54\x76\xb6\xaf\xe7\xc2\xb9\xfd\xed\x1f\x04\xd2\x0b\x3f\xcc\x39\x26\x1f\x13\x38\x11\x3a\xf8\x8c\x5d\x0a\x0e\xf6\x24\x2b\x3d\x81\xf7\x6d\xc1\x9f\x7f\x84\x86\x4e\x1e\xcc\xd7\x01\x5d\xf2\x4b\x9f\xa5\x6a\xa3\x51\xca\x4d\xb0\x0a\xcf\xcf\xce\x06\xef\x65\xc6\xe9\x5a\x58\x58\x17\xf6\x63\xe2\x28\xf1\x89\xc9\xe0\xd1\x99\x83\x10\xf3\x63\x16\xdb\x00\x11\x55\x70\xa1\x7d\x60\x5d\xb8\x98\x82\xde\xb0\x30\xd2\xfb\x7b\xa9\x1a\xb8\x5d\x11\x60\xdf\x04\x90\xc8\x10\x6a\x58\xe3\xe6\x40\xa6\xcd\x61\xd5\x04\xf8\x26\xc4\x64\xf4\x78\x7f\x4f\x00\xdb\x74\x9b\x87\x03\x20\xb1\xb1\x01\xba\x45\xc5\xd2\xdb\x02\x44\xec\x7b\xab\x54\x25\x54\x09\xfd\x33\xa0\x2a\x85\x66\x41\x15\xb5\xd6\x31\x7c\xc4\x31\x4c\x93\xda\x25\x02\x56\x51\x49\x91\x4e\x3b\xc5\x14\xfa\x26\xcb\x44\xe8\x0e\x0c\x8d\x70\x87\x7d\x7d\x95\x10\x3d\x04\x81\x1a\x05\x17\x38\x7c\xe7\x81\xe0\x21\x54\x24\x11\xfc\x8b\xee\xe1\xa8\x08\x14\x49\xa4\x21\xec\x14\x51\x95\x32\x23\x3c\x9c\x07\xaf\xba\x27\xa1\xe9\x19\x1a\x3b\x40\xe5\x99\x1c\x17\xc5\x60\x3f\x6f\x02\x8b\x73\x00\x9f\xcd\x13\xf6\x2d\xf1\x96\x55\xaf\x1b\x96\x1d\xe8\x1e\x19\x6a\xbf\xa9\x43\x7a\x84\xa5\x32\x2c\x6e\x7e\xb5\x88\xd1\x7e\x32\xcc\x43\x41\x93\x00\x6e\xdb\x4d\xcb\x48\x09\xbb\x24\x44\xe4\x30\x5b\x4b\x8f\x0f\xb4\xb7\xa4\x6e\xbf\x59\xe0\x3c\xb4\xbf\x18\x1b\x41\x8a\x95\x02\xc3\xd1\x41\xc9\x11\x39\x0c\x31\x3a\xad\x83\x06\x4e\xbe\x7e\x6a\x92\x68\x21\x2b\x60\xcf\xcd\x11\x70\x60\x12\xef\x52\xab\xae\x1f\x1b\xd0\xab\xa2\x20\x2b\xf6\xbe\x21\x7f\xba\xf5\x81\xd9\x3c\xf1\x9f\xbf\x56\xfd\x93\xcf\x6d\x3b\xba\xd0\x0b\xa9\x91\x7d\xad\x0d\x37\x4c\x3f\x3a\x22\xca\xf5\xe1\xac\xd5\x24\xbc\x3e\xb7\xaf\xb1\x59\xfa\xbe\x47\xaf\x1e\x34\x1a\x86\x71\xff\x7b\x30\xac\x1f\xdc\xbf\xca\x69\x03\xbc\xfd\xde\x6e\x22\xb1\xab\x27\xf6\x15\xff\xfb\xf3\x04\xda\x94\xeb\x07\x7e\x92\xdd\x2b\x03\x9b\x87\x2e\xdc\x2b\x1e\x7a\xa6\xba\xc1\x44\x60\xd2\xa9\xfd\xc1\xa7\x47\xd9\x76\xe5\x6d\x67\x47\x62\xff\x35\x31\x73\x4e\x08\xca\x3d\x6f\xc4\x73\x25\x6e\x0b\xbe\xc6\x9f\x8f\xd2\xeb\x9c\xf8\xec\x6b\x6e\xb9\x24\xf8\xb2\xaf\x88\xd4\x6d\x3d\xf9\x02\xe7\x12\xd0\x27\x8f\x2b\x92\xef\xe0\xcd\xa6\x35\xb1\x5f\x97\x23\xaf\x90\xc0\x3d\x7f\x04\xce\xc9\x98\x71\x87\xf4\xbb\x9c\x84\x01\xd9\x2c\xbc\xdd\xfe\x56\xea\xe5\x9f\x15\x5f\x7f\x13\x62\xc8\x67\xea\x2d\x50\x1d\x62\x1d\xea\xbb\xdf\xe0\x44\x0d\x92\xfd\x57\x39\xea\xb4\x74\x92\x69\x54\x1e\xef\x75\x40\xdc\x32\x44\xad\x6f\x12\x9c\xf0\x76\xba\x88\xb1\x51\x1d\x43\xbe\xc1\x59\xa4\x08\x28\x54\x69\xf0\x73\xb0\x79\xe8\xf1\x02\x86\x9f\x04\xa1\xce\x21\xcc\x16\xa1\xfb\xda\x0e\xc0\x41\xab\x80\x7b\x96\x26\xc4\x83\x7d\x08\x5c\x4c\x95\xd2\xd4\xa0\x87\x62\x14\x7a\x44\xdf\xe1\xb8\x45\xd7\x72\xa0\xf0\xcd\xd5\x4d\x87\xbb\xc5\xc8\xc4\xf7\x13\x16\x1e\x03\xbf\x76\x10\x34\xf9\x3c\x99\x3b\x9b\x3f\xfe\x40\xe3\x8e\x53\xd0\x11\x1b\x22\x93\x13\x87\xcd\x8b\xbc\x7f\x85\x6a\x14\x3b\x8c\xf8\xac\x9b\xde\x3e\xe9\x82\x2f\x24\xaf\xf3\xa3\x51\x5c\x0c\x82\x76\x05\xdf\x82\x2c\xe0\x40\x3f\xc7\x52\x04\xb5\x37\xcd\x26\x1d\x3f\xe4\xac\x62\x2e\xb1\xe6\x0c\x27\x25\x1f\xfa\x04\x90\x9a\x38\x6d\x08\xf4\x7c\x06\x1b\x6f\xd0\xec\x93\x10\x78\x71\x04\x17\x57\x38\xe1\x16\x5e\xee\x07\x96\x96\x08\x5b\x3a\xaa\x82\x6b\x9a\x54\x9a\x43\xe0\x5d\x4d\x68\xe3\x9a\xa5\xcd\x6b\xc7\xb4\xb3\xda\xaa\x72\xb2\x7c\x42\x7b\x46\xfb\x7e\xed\x87\xb4\x37\xb4\x7b\xda\x97\xb5\x7f\xaa\xbd\xa7\xfd\x9a\xf6\xaf\x94\xc3\xf2\x84\xcf\xcd\x14\xb9\x80\xe7\xe1\xef\xad\xbb\xf7\xf6\x41\xc5\xf2\x6a\x77\xa6\x6a\xbc\x64\xa2\x2a\x69\x78\x9d\x27\x17\x1e\x29\xd9\x9e\x17\xa9\x92\x8a\xfa\x9b\x73\x3a\x92\x14\x47\xed\x92\x52\x08\xc9\x43\x1c\x9d\x0e\x7c\x36\x97\xe8\xea\x58\xae\x28\x3f\x1d\x6f\x2c\x9e\xcc\x39\xca\xe8\x57\x91\x07\x9c\x19\xa6\xc6\x2c\x9e\x19\x6d\x44\xc1\xad\x98\x8b\xa1\xd4\xb8\xbc\xd3\xfc\xdf\xa3\xd0\xee\x6d\xb0\x77\x92\x4e\x32\xfe\x11\x22\xcf\x35\x8d\xc0\x74\xfc\x05\x9c\xbb\x61\x86\xba\x47\x96\x69\xcd\x1c\x8e\x8e\xf6\xf0\xa2\x21\x7f\x5d\x3a\x48\x03\x62\xf0\x48\xf7\x29\xdf\x10\xe8\xfc\x08\x71\x29\x52\xf0\x2f\x12\xcf\xf7\x10\xb7\xe7\x62\xe1\xe0\x9a\x48\x97\xc9\xa8\x42\x5f\x8f\x4e\x17\x8a\x16\x82\xfd\x24\x49\x4f\x15\xa5\xef\x2f\x75\xe0\xe4\xa5\xa5\x44\x7d\xf2\xc0\xd4\x0d\x37\xbe\xe8\xb0\x44\xc9\x91\x8d\xf4\x5b\x88\x3e\x82\x74\xd1\xde\x26\x8e\xcc\x79\x7f\xec\x66\x98\x76\x84\x19\x7d\x4a\xbf\x4d\x81\xc1\x4d\x9a\xba\x60\x6e\x50\x43\xa6\xd8\x0d\x38\x36\xf0\xee\xda\xed\x46\x26\x16\x1b\x00\xee\x4e\x84\x3f\xfd\x7d\xc5\xca\xdb\x73\xbe\xfc\xa1\x22\x39\xe6\xe4\x30\x20\x8b\x34\x9c\x24\x4b\x1a\xa7\xe3\x16\x4d\xc6\xb9\x85\xf0\x3c\xcd\x8f\x11\xa7\x86\x53\xd4\xd1\xf7\x20\xd9\x68\xd2\xe8\x69\x70\xcc\x0c\x23\x98\xb3\x31\xee\xb7\x27\xc6\x8a\xb6\x04\xb5\xdf\x01\x9a\x23\x67\xf4\xe3\x4f\xd9\xdb\x2b\x8f\x1b\xbc\xa0\x0f\x0c\x94\x4f\x3e\x84\x91\x87\x4d\x5d\x4f\x57\x41\x2d\x8c\xc7\xd2\xce\x6d\xeb\xd0\x4a\x75\x47\xdf\xa1\xc2\xd0\xf7\x19\xb4\x63\xe3\x75\x7e\xf8\x8c\xc0\xdd\xc4\x03\xba\x0e\x5a\x0b\x1e\xec\x9b\x74\xff\x84\x86\x35\xad\xfd\x9f\x7d\x55\xfc\x84\x36\xa4\x4d\x68\xb6\xb6\xa0\xed\xd7\x0e\x69\xc7\xb5\xaa\x76\x5e\xf9\xe8\xbc\xaa\xfd\x98\x72\x78\xfe\x97\xda\x6f\x6b\xdf\xd0\xfe\xbd\xf6\x27\xda\x9f\x69\xdf\xd3\xfe\x86\xf9\x59\x5f\xc7\xcd\x59\xad\x44\xfb\xdb\xd1\x55\x24\x9b\xc9\x79\xeb\xb4\x02\x6a\xa1\x96\x37\xed\x09\x67\xbc\xf1\x91\x42\x79\x31\x6f\x46\x75\x90\x7d\xac\xa1\x8f\x78\xa4\xf3\xb0\x27\xdb\x94\x7b\xab\xa4\x12\xc9\xae\xff\xcf\x3c\x99\x92\xf1\xff\x77\x3d\x99\xd8\x5a\x22\x71\x97\x6a\x75\xe4\x0e\x34\xca\xbd\x8b\x22\x75\x9b\x9c\x89\xc1\xf8\x82\xfc\x3d\x7b\xdf\x10\x1a\xbd\x97\x00\xab\x28\xd7\x40\x93\x13\x93\x33\xa7\x06\xf5\xe9\x03\x77\xd5\xde\x19\x3d\x65\x57\x74\x47\xa4\x30\x3e\x5e\xd4\x53\xbd\x8b\xf7\xfe\x7f\xe0\xed\x84\x9f\x48\x7f\xf2\x40\xda\xac\x98\x62\xf5\xc6\xa4\xbd\xe5\x7c\xcb\xb2\xd3\x73\x0f\x89\xde\x17\x47\x8f\x20\x3c\xb1\xec\xc7\x54\xc0\x6c\x5a\x42\x94\x8b\xb4\x61\x14\x2c\xbb\xc5\x7b\x02\x38\x38\x2f\x89\x88\x50\x80\x43\x2d\x0e\xac\xc1\xef\x97\xf6\xdc\x78\x11\xa9\xe1\x68\x7b\x1d\xbe\x4b\x95\xa9\xd0\xa7\xff\x8e\x5b\x94\x83\x1d\x51\xad\xdc\xbd\x43\xfb\x3b\x6e\x51\x67\x95\x5b\x94\xbf\xf7\xbf\xe5\x16\xd5\x02\x5d\x63\xb8\x9d\xda\xe2\xa7\x7f\x40\x97\xd8\xb6\x6f\xa1\xf4\xdf\xb0\x8b\x3a\x71\x61\xcf\x2e\xaa\x3b\xf4\xff\xb4\x8b\xd2\x22\xde\xfc\x1b\x65\xcd\xd1\x2e\x68\x2d\xe5\xb2\xb3\xa3\xed\x6a\x3f\xa3\xbd\xa3\xfd\xa2\xf6\x6b\xda\x6f\x68\xbf\xa5\xfd\x9e\xf6\x97\xda\xdf\xb0\x5e\xd5\x0d\x9b\x64\xfb\xd8\x9c\xa6\xa9\xce\xbb\x22\x44\x79\xce\x1e\xde\xea\xe2\x68\x40\xed\x00\x0c\xab\x4d\x85\xaa\x77\xb1\xd7\xdc\x72\xf2\x8b\x53\x8b\xcc\x7b\x52\x36\x17\x55\x91\x36\xd6\x31\xb5\x5f\x61\x8b\xf9\x78\x37\x02\x53\x7b\x9e\xf5\x9d\x3e\xba\x5b\x8e\xfb\x3b\xb6\x20\x1f\xaf\x35\x8e\xab\xee\x75\x3e\x91\x54\x2b\x88\xd5\xbe\x0f\x7f\x20\xba\x67\xb0\xe9\x15\xf1\x39\x4f\x04\xe1\xb5\xe1\x3b\xca\xc0\xbd\x89\xeb\x84\x52\xe2\x75\x04\xda\xfe\x3d\x0d\xb5\x5b\xc2\xe6\x92\xec\x63\xa1\x89\xfb\x4e\x3c\x1a\x69\x38\xeb\xa9\x48\xb2\xaa\xe5\xd6\x1d\xc9\xaa\xf5\x77\xf9\x29\x7f\x78\x6f\x22\xdd\xed\xfd\xe1\x7b\xf7\x59\x2e\xea\xdd\x27\xf1\x40\x3e\xec\x8d\x74\x93\x81\x48\x36\xe9\xfb\xe8\xea\x69\x39\x19\x8a\x4e\xb6\x06\x57\xfa\x5f\xce\x65\xa3\xff\xea\xd0\x8a\x41\x1e\x97\x91\x48\x00\x89\x3f\x0e\xe7\x03\x17\xbf\xa3\x1f\xef\x97\x68\x05\xd9\x60\xae\x7d\x7c\x62\x7a\xe4\x1f\x9c\x7e\x8c\x76\x79\xef\xd0\xfa\x6a\x6f\x66\x63\x63\xf0\x27\xee\x39\x06\xda\x1f\xb5\x37\x6c\xdf\x3b\x0f\xec\x03\x17\xcb\xcb\xa4\x97\x4d\xc8\x1d\x81\x94\xce\x1f\xec\x03\x5f\x2b\xc8\x2d\xd9\x3f\x5f\xa5\xde\x4c\x0b\x20\xb3\x44\xa2\x58\x28\xea\xa3\xe7\xcc\xdd\x96\xbc\xd0\x0f\x04\x1f\x14\xb2\x2e\x28\x7a\x45\xf0\x67\x7a\xae\xf7\xa5\x8b\x29\xe2\xc7\xc7\x74\xb6\x31\xe0\x17\x3d\xd1\xf6\xea\x86\x8e\xc7\x7a\x80\x42\xb9\x40\xb2\x29\x52\x8f\x0e\xc9\x2b\x13\x69\xaa\x16\xd9\x26\x64\x8d\x4a\x74\x6c\x44\x18\xa0\x96\x01\x9e\x3d\xa8\x04\x69\xe9\x56\x7b\x7b\xa6\x47\xa6\x49\x82\xe9\xf4\xe0\x3c\x80\x89\xa3\xed\xaf\xcf\x4f\x8d\xcd\x58\x17\xa6\x78\xdd\x60\x37\x0c\xbe\x29\xb0\x39\x7c\xd5\xec\x79\xad\xbc\x61\x6d\xa3\x5c\x4f\xeb\xa8\xae\x96\x52\x56\xc1\x16\x48\x1e\x3c\x30\x19\x0a\xa7\x9b\x4a\xe0\x66\xea\x04\xa4\x8d\x81\xc5\xdf\x3a\x79\x65\x7e\x97\xa7\x1c\xb9\x6d\xb4\x1b\x87\x26\x96\x5f\x49\x19\xe0\x6b\x1b\x46\xd1\x3e\x36\x82\x99\x5c\xe8\x50\x69\xe1\x33\xcd\x7f\x7c\xe8\xeb\xad\x72\x95\x8e\x5d\x02\xf1\x96\x51\xf0\x3f\x2c\xce\x76\xb7\x4c\xdc\xaa\xd2\xdc\x43\xe0\xf5\x5a\xf9\x0e\x78\xb9\x22\x48\x7f\x78\x49\x64\x1e\xed\x3e\x72\x8f\xf8\x8d\x59\xb7\xa6\xa0\xf0\x0d\x1d\xd4\xf3\x19\xfe\xc6\x54\x9f\xb1\xe6\x00\xfc\xd5\x61\xc0\x44\xb0\x5f\x7f\x1d\x78\x03\xb0\x1e\x5e\xa2\xcc\xd3\xfe\x11\xfe\xf7\x02\xc4\x5f\x1e\x36\xc5\x58\x1c\xd5\xf6\xf7\x4c\x03\x4d\xa5\xd9\x2b\x94\x01\x43\xe0\x96\xee\x50\xee\x1a\x91\x55\xcf\x86\x2b\xdb\x69\x14\x61\xf1\x94\x30\x1e\x58\x02\xf8\xc8\x13\xee\x7d\x3f\x76\x84\x63\xeb\xd1\x01\x0c\x3e\x03\xec\x00\x34\x7f\x1d\x98\xbc\x89\xbb\x77\x35\x4d\xb3\x34\x8d\x8d\xc0\xc0\xc3\x5a\x55\xbb\xa9\xfd\xa8\x76\x4f\xfb\xc7\xda\x2f\x68\xbf\xad\xfd\xa1\xf6\xc7\xda\x9f\xb2\x2e\xd6\xdb\xd9\x62\x3e\xcd\xf2\xec\x02\x5b\x65\x4f\xb0\x67\xd8\xf3\x6c\x87\xed\xb2\x1f\x61\x3f\xc1\xee\xb1\xaf\xb0\x9f\x63\x1f\xb0\xdf\x64\xbf\xc7\xfe\x13\xfb\xcf\xec\x7b\xec\x23\x17\x6d\x47\xc2\x7b\x8a\xe3\x68\x38\x10\xcb\xa9\x0d\x00\x0a\x1c\xfa\xd5\xc6\xa2\xa4\x3f\xe0\x96\x29\xc9\x40\x32\xe0\x24\x03\x89\x19\x16\x70\xab\x11\x67\x85\x39\x07\xd8\x04\xcb\xc5\xf7\x36\x8f\x3a\xd9\xc5\xfc\x1e\x09\x25\x90\xf4\x87\x03\x1e\x79\x30\xa3\xb8\x27\xea\x47\xc6\xe3\xcf\x7b\xbb\xbc\x15\x48\x0e\xff\x9d\x41\x98\x5a\xf0\x13\x0f\xff\x1d\x37\x4e\x8f\x6c\x92\x8b\x79\x4b\x06\x3c\x84\x99\x73\x6f\xcb\x64\x47\x10\x9b\xf0\xf6\x45\x76\x08\x19\x09\x75\x6a\x6f\x91\xa7\x82\x95\x71\x6f\x05\x67\xce\xc5\x94\x19\x75\x67\x25\xa2\x9d\x76\x76\x26\x1a\xc9\x2a\x2a\xa0\x5a\x5c\x91\xf5\x6e\x48\x17\x66\xca\x6c\x2e\x91\x9b\xca\x4e\xb0\x70\xcc\x53\xd9\x26\xe3\x31\xaf\xcf\x9b\x8c\xaa\x52\xce\xd3\x62\xe7\xe2\xdd\x32\x1b\x75\x8f\x10\xcd\xaa\xf7\xb7\x98\x4b\xcc\x30\xd5\x9f\x4f\x24\xfd\x53\x2e\xd6\x8e\x86\x23\x61\xc5\x3a\xe9\x04\x97\x64\x3e\x1a\x8e\xe6\x12\x13\xcc\x43\xeb\xb9\x8e\x31\x68\x32\x17\xe8\xe8\x99\x73\x1d\x74\x9f\xeb\x88\xb2\xd5\x05\xb9\x90\xd7\x8d\x22\x8a\x80\xb2\x87\xa3\x3b\xbc\x0d\xf7\xc0\x1d\xc7\x3c\xf7\x43\xe9\x50\x71\xb2\x1f\x4b\x8f\xd5\x09\xb2\xca\x70\xcf\x0d\x7b\x39\x4f\x2e\x9d\xeb\xf8\x7d\xb9\x17\xcc\xbe\xfa\xed\xf7\x0c\xeb\xe9\xde\x55\xc9\x89\x4b\xd9\x34\x21\xf1\xcc\xb3\x29\xba\xcd\xe5\x8d\x29\x60\xea\x82\xe0\x6f\x1b\x42\x8e\xf6\x43\x6f\x38\xbc\x26\x39\x35\xd6\x70\x2e\x64\xeb\xa3\xdd\x10\xc5\xa5\x7f\xaf\x5c\x52\x5a\x24\x2a\xdc\x41\x5f\xb7\x28\xb8\x69\x72\x53\x40\xd2\xf2\x72\x55\xd6\x2c\xeb\x2d\xdb\x6c\x0a\x80\xdd\x22\x88\xc8\x78\x8a\xf4\xe9\x24\x15\x4d\xbd\x84\xf0\x28\xe9\x4e\x6a\xdd\xb6\xd3\x90\x30\xcc\x12\xc4\xc0\x92\x24\xe8\x05\x6a\xaf\xcd\xcf\x52\x91\x7f\x6f\x79\x84\x86\xa3\xa4\x83\xfa\x8f\xa4\x86\x62\x53\x41\x37\x74\x94\x86\x8f\x08\x5a\xf2\xc1\x6e\xe5\x26\x0a\xa2\x77\x89\x8c\xf9\xc1\xbe\xcb\x7d\x87\xf4\x12\xf5\xcc\xec\x1b\xd0\x01\x49\x82\xea\x46\xaa\x28\x73\x5d\xf7\xdf\xb1\x4c\x51\xf2\xad\x53\x85\xc7\xf7\x7f\x37\x97\x4d\x8c\x1b\xd4\xfe\xd6\xe8\x20\x51\xe1\x4d\xe9\xe8\x54\xe0\xba\x90\x10\xed\x5a\xe3\x75\xa0\x02\xc3\x96\x3c\x0d\xfc\x95\x69\xda\x5f\x3e\x09\xe0\xa7\x1e\xbd\xcc\x7e\x0d\xfc\xbb\x26\x84\x91\xa2\xe4\x7e\xce\xaf\xf7\x41\xd6\xc3\x53\x04\x7a\xdd\x2a\x3b\x54\x87\x0d\x19\xcf\xd5\xcb\x92\x6a\x28\x56\x45\x49\xbe\x33\xdc\x17\xe9\xfd\xe8\xdb\x13\x83\x06\x2d\xfa\x84\xcf\xea\x3b\xca\xcb\xf7\xbf\x53\xd6\xcb\xc6\xe1\x21\x2a\x92\x30\x27\x26\xa3\xfb\x9d\x9d\x13\x13\xb0\xa7\x82\x44\xe9\xfe\x53\xe2\xa4\xaf\x9a\x49\xf0\x12\xd5\x05\x50\x13\xc6\x7b\x83\x79\x59\x16\x5b\x4b\x31\x3e\x3e\x07\x33\x3b\x8d\x65\xbf\xc4\xc3\xa3\xe1\xf4\xa9\xe9\xd0\xb3\xa6\x4d\x2e\x5e\x53\x49\xc0\xdc\xa4\xb5\x94\x08\x87\x38\x38\x77\xff\x27\x24\xfc\x7e\x92\xb0\x67\x4e\xc8\xd1\x97\x1c\x5d\x72\x6e\x1e\xd9\x1f\x7c\x44\x5a\x85\x60\x58\x82\x20\x20\xd0\x1f\x12\xb3\x97\xa5\xb7\xb1\x5b\x08\x54\x66\xe7\x69\x6c\xd4\x3d\x5a\x51\x07\xd2\x68\x56\x92\xfd\xc9\x07\x39\xed\x84\xc2\x23\x73\xc8\x4e\x82\x02\x9f\x32\xdf\xbd\x36\x2b\x01\xe8\x69\x7a\xd3\xdc\xd6\x89\x06\x5e\x21\x4a\xed\x6e\xea\xe0\x78\xb1\xf7\xf4\x28\x48\xe7\xdd\x8f\x51\x62\xa0\xa6\x32\x53\xf8\x49\x50\x2d\x0d\xe0\x36\x36\x24\xe6\xcf\xe9\xbc\x92\xd6\xf9\xfc\x83\xa0\xaa\x4e\x55\xf7\x17\x92\x37\xd3\xb4\x89\x87\x46\x88\xca\x36\xe1\x91\x10\x36\x04\xbf\x2d\xb6\xe9\xc0\x51\xfb\x4a\x17\x51\x75\xd3\xcd\x6f\x4a\xd9\x00\xf9\x55\xc3\x7b\xbb\x1c\xc8\x8c\xbc\xa1\x03\x64\x7c\xfa\x15\x72\xc3\xee\x8d\x61\x28\x43\xb7\xe9\x1b\xe6\x33\x61\x21\xa8\x41\x4b\xfb\x88\x84\x69\x56\x71\x69\x80\x76\xd4\x5b\xd4\x37\xed\xcc\x79\xc2\xb6\x0e\xa7\x08\xba\x3a\x46\x69\x9a\xea\x22\xa3\x00\x3a\x3b\x08\xca\x1c\xa6\x9a\x05\x0c\x5e\x46\x83\x83\xd6\x71\xa9\x97\x7a\xf2\x05\x8a\x5e\x87\xb8\x55\x29\x63\xff\x29\x5a\xd3\x69\xcd\xc4\x3a\xd1\x0e\x76\x88\x96\x96\xa8\x66\x71\x6c\x83\xcc\x55\xf7\xf9\x1b\x6e\x19\x34\xa6\x6a\xa1\x6f\xa1\xa8\xa5\xb4\x9a\x76\x59\x6b\x68\x6b\xda\x13\xda\xb3\xda\x96\xf6\xaa\xb6\xab\xfd\x88\xf2\x1d\x74\xab\xa2\x0f\x94\x8e\xe9\x0f\xb5\x6f\x6b\x7f\xaa\xfd\x17\xed\x23\x06\xd6\xcf\xa2\x6c\x92\xcd\xb2\x05\x4d\x0b\x79\x45\x8e\xda\x8e\x1b\x90\x01\x7f\xd0\xe7\x77\x23\xe0\x62\x3e\x93\x5b\x54\x85\xf9\x3c\x0b\x24\xdc\xe2\x3c\xef\xde\xf9\xde\x42\xba\xa8\xec\xfe\xbf\xb8\xfa\x1b\xf0\xb6\xce\xf3\x3e\x18\xc7\x03\xfc\x80\x73\x83\x78\x48\x3c\x24\x0e\x80\x43\xf2\x90\x3c\x04\x40\x00\x24\x21\x11\x02\x0e\x3e\x24\x82\x12\x24\x41\x12\x24\x41\x12\x24\x41\x16\x24\x43\x32\x2d\x53\x16\x2d\xc3\x36\x6d\xd1\x32\x6d\x33\x36\x6d\x33\x36\xe3\x70\x89\xec\x2a\x89\x92\x3a\x1f\x4d\x9d\xc6\xf9\xd7\x69\xbd\xce\x69\xd2\x34\xdb\xbc\xce\x6b\xd3\x7f\xf3\x76\x59\xe7\xab\x75\x33\x6f\xcb\xbb\x66\x9b\xdf\xcd\xef\xde\xac\x4b\xb7\x36\x36\xd9\xf7\x3a\xcf\x01\xe5\x5d\x6f\x72\xf9\x12\x6d\x81\xc0\xc1\xd7\x73\xdf\xbf\xfb\xfe\x7d\x78\xa2\xaa\x12\xcc\x76\xcc\xd3\xf2\x7b\x98\xed\x8a\x16\x49\xc4\x5d\x92\x17\x91\x08\x5b\x0d\x8a\x7d\x8e\x44\x15\x5b\xd9\xe9\x56\x64\x96\x89\x5b\xba\x07\x48\x63\x08\xdb\x1f\x46\xb2\xf5\x32\x1f\x9b\xc5\x58\xa7\x55\x50\xed\x38\x14\x47\x73\x9d\x2d\x54\x74\x8b\x98\x26\x1d\xc8\x3c\x8a\xcd\x85\x0e\xc9\x8c\x5b\x45\xdd\xa2\x96\xd9\xc9\x72\x76\xce\x9c\xe7\x63\x41\xab\x0d\x64\xa2\x1e\x45\x9a\x2a\x04\x3f\x16\xba\xca\x93\xea\x76\x7e\x41\xd4\x36\xb5\xc9\xe4\x12\x1e\xa5\x93\xa6\x60\xdf\x8b\x4c\x14\x9e\x61\x72\xda\xf9\xe6\x37\x87\xbe\xbf\xfb\xa9\xf8\x33\x83\xe9\x74\xe9\xf5\xc5\x76\x71\x71\x3d\x73\x49\x1f\x4f\x90\x2a\x42\x7f\xf8\x8d\xc1\x37\xab\xa2\x21\xc7\x14\xaa\x86\x72\xfb\x57\x73\x9b\x3f\xfb\x5c\xb4\xa2\x2d\x2f\x0e\x9c\x5a\x5c\xa0\x8a\xa9\x82\x0a\x5f\xec\x3b\xc8\x6f\xdd\xd3\x8b\x44\x3f\x4a\xd5\x54\x32\x99\xd2\x26\xdd\x1c\x69\x65\x27\x46\xd9\xa7\xa0\x91\xba\x79\x6b\x38\xe3\x0d\xeb\x6c\xb1\xac\x73\xd3\x10\x26\xfa\xc3\x55\x28\x5e\x33\x99\xe4\x08\x1d\xd1\x80\xd0\x13\xb3\x50\x41\xc9\x2a\xa5\x8e\x0f\xf0\x79\xa4\x12\x39\x12\x3b\xa7\x52\x47\x83\xea\x9c\x48\xcf\x12\x7c\x43\x84\x64\x8c\x66\x51\xab\x91\xd6\x84\x39\xe3\x27\xde\x28\x37\xb4\x3a\xb4\xf4\x4c\x98\xf3\x54\x92\x8a\x29\xeb\x10\x11\x31\x95\x88\x97\x07\xce\x13\x6d\xdf\x25\x8a\x83\x17\x68\x11\xd5\x58\x53\xa3\xf3\xc3\xd4\x98\x1a\x13\x48\x2d\x6b\xf5\x86\x81\x11\x77\x25\x29\x86\xf3\xbe\xfb\x08\xa8\xea\x1a\x7b\x93\x80\x52\x52\xb4\xd2\x97\x32\x95\x9a\x89\xc8\x8b\x41\xdf\xcb\xbb\x8a\x42\x4d\xf2\x76\x72\xe6\x2e\xbd\xd6\xc8\x0c\x17\x39\x1e\x9f\x2a\x1f\xda\xc6\x0d\x43\xe0\x6b\x15\xd1\x3f\xb8\xe7\xb2\x3e\x5b\x99\x7e\x86\x1b\xc2\xdf\x9b\x3b\xab\x86\x8f\xcd\x71\xe3\xe2\xbd\x43\xd1\xba\xb1\xf9\x1e\x50\x6f\xf2\xd0\x76\x94\xd5\x06\x4c\x03\x1c\x91\xed\x0d\xc3\x90\x27\x07\xaf\x41\x4b\xf3\x2f\xfb\x93\x7b\x76\x72\x43\xd5\xd2\x67\xbb\xf5\x1d\x27\x62\xa6\x2a\x94\x07\x54\xd1\x75\x07\xc2\x0f\x73\x4a\xce\x23\x49\x57\x43\xa0\xd5\x74\xfc\x0e\x71\x7a\x3c\x86\x27\x7a\xc4\x9a\x67\x7b\x9b\x5c\xa3\x46\x2c\xdc\xbd\x5a\xf4\x3d\x03\x15\x6b\xc9\x17\xdc\x7c\x3d\x35\xf0\xa0\x57\x59\xf3\x8e\x1c\x2b\x70\x14\xab\x7a\x23\x0d\x75\xc9\xd3\xa7\xc7\x34\x8c\xdd\x45\x38\xbf\x5d\xc5\xb6\xb3\xb4\xc6\xb1\xeb\x14\x35\x8a\x1a\xf2\xfb\x04\x5f\x87\x3e\x97\x12\xed\x98\xdb\x9f\xae\x01\x5d\xfb\x62\x02\x26\xc8\xe1\x70\x48\x20\xee\xaa\x7a\x8a\x8e\x9a\x63\xd9\xf1\xac\xe3\x1f\x38\x5e\x76\xbc\x2e\xb7\x10\x7f\xe4\xf8\x97\x8e\x9f\x38\x3e\x90\x58\xc4\xc3\x38\x1b\x91\xdb\x88\x83\xec\x98\x74\x7b\x79\x94\x3d\xcd\x5e\x64\x37\xd8\x2b\x92\x8b\xfb\x1d\xf6\x8f\xd9\x3f\xdf\xd2\x0e\x06\x95\x60\xd8\xb3\xe5\xc0\x22\xcd\x07\x3b\x21\xed\x91\x84\x94\x57\x64\x43\xe1\xa0\x6d\x45\x6e\x4e\x31\x33\x91\xcb\xe4\x6c\x60\x92\x53\x22\xb9\x44\x3c\x17\xcf\xd9\x4e\x87\x2c\x24\xc3\xd0\x65\x24\xbb\xbd\xcd\x08\x86\xa4\xe3\x61\x22\x53\x60\xf9\x5c\xc7\xec\x30\x21\x1d\x5d\x64\x1c\xd7\xed\x61\x77\x28\x9b\x2f\x24\x72\x51\xa9\xb8\x1e\x95\xd6\x54\x99\xf0\x56\x1e\x91\xcd\xe6\xb1\x90\x86\x5b\x62\x23\x3b\xd0\xb1\xd3\x47\x45\x3b\xde\x27\xee\x11\x96\x91\x70\x65\x2b\x93\x44\x7a\x8b\x6c\x6d\x8f\xed\x1f\x72\x2c\x98\x2f\xe4\x73\x16\xe8\xb1\x93\x1c\x3f\x16\x5c\xdb\x19\xdb\xee\xdb\x82\x10\x99\x3a\x69\x75\x57\x6e\xe9\xf1\x6b\xfd\x5b\xc1\x26\x07\x25\x6c\x91\x77\xd6\xb4\x5d\x4d\x0b\x59\xb9\x28\xf8\xff\xc4\x53\x2a\xf2\x8f\x9c\x0d\xaf\x6e\x2f\x10\x22\xb6\x9d\xa9\x34\x7f\x09\x05\xb7\x98\xab\x76\x7e\xa4\xf4\x5f\x19\x61\xb9\x84\xcb\x16\xfb\xe7\xe2\xd1\x88\x12\x56\x32\x1d\xd2\x96\x22\x79\xb3\x1e\x25\x64\x5b\x0a\x4b\xfa\x72\xa1\x73\x25\x09\xf6\xc6\xb7\xf7\xa7\xd5\x39\x60\x60\x20\xf2\xf5\x54\x22\x97\x3b\xa1\x97\x4a\x49\x7d\x74\xff\xce\x87\x0c\xd1\xb5\x7d\x60\xdf\x7e\x37\x78\xe2\x00\xe7\xf5\x12\x17\xb3\xc9\x25\xb3\x52\xd3\x35\xef\x67\xd3\xa2\xdd\xd8\x5c\x11\x31\xc3\xd0\x46\xaf\xc4\xf4\x5b\xcb\xdf\x1c\x55\x55\xe7\xf6\x9d\xca\x98\x1f\x3c\xc9\x50\x02\xfa\xe2\xe5\x26\x80\xa4\x7a\x25\xf7\x2b\x63\x49\xe7\x2d\x95\x68\x73\xdd\x3f\x3a\xe6\xeb\x77\xb5\xa0\xb7\x68\x6f\x98\x15\x65\xe5\x11\x13\x21\xdb\xa4\xa1\x06\xab\x80\xa5\xcc\xcd\x5a\x4f\x7c\x28\x0c\xd1\xa0\x4a\x53\x85\xe8\xbd\x93\xff\x38\xdc\x8b\xe4\xdf\x3b\xe6\x55\xaf\xeb\xd0\x0e\xa1\x45\x8e\x5b\xc0\x2e\x59\x43\xb7\xb3\x5b\xab\xf9\xba\x65\x56\x23\x57\xc7\x03\x44\xf3\x9b\xe5\xaf\x0e\x25\x71\x7c\x7b\x6d\x01\x47\xfb\xe1\x75\x9d\xee\xd7\xea\xd8\xd3\xcb\x3e\xe2\x6d\xd0\xdc\xc6\x3b\x4d\x50\xda\xe4\x93\x7b\xb1\x23\xcc\xc1\x31\xcb\x3e\xd0\x4f\x86\xc9\xeb\x9a\xe3\xe1\xc3\xe0\xbe\x93\x5e\xd7\xf2\x78\x96\x97\x0f\x8d\x52\x51\xa7\x79\x9e\xdd\xd1\x68\x43\x9d\xab\xce\x4c\x41\xd5\xeb\xe5\x36\xa9\x6d\x68\x02\x4d\x01\xcc\x12\xf9\xee\x26\xef\x5d\x5e\x97\x72\x79\xa0\x2f\x5d\xae\x56\x0d\x12\xf3\x24\x52\xfe\x33\xd0\x53\x9a\x81\x60\x56\xab\x8a\xd9\xd7\xca\x82\x1f\xea\xd6\xf5\x0b\x81\x1f\xc0\x7b\x3f\xa8\xf7\x84\xa6\xd5\x93\xe4\xbb\x8f\xeb\x17\xfb\xfa\x9c\xfd\x77\xa6\xef\xf0\x20\xe4\xf1\x5d\x2e\x86\x8f\xf1\x39\x4f\x71\x2d\xb0\xe3\x89\x7b\x01\xf1\xc5\xc4\xec\x4a\xdf\xc4\xd1\x97\x6a\x84\xbe\xed\x7b\x07\xd5\xd5\x44\xff\x6b\xed\x95\x98\x98\xd7\x30\x70\x2f\x62\xa3\xd3\xa5\x9e\x2e\x4e\x4b\xc1\xac\x78\xf9\xf3\xe0\xa9\x76\x70\x64\x7c\xf0\x93\x5f\x1d\x0a\xd4\x37\x5b\x75\x8c\x3e\x7d\x72\x4a\x2d\x2e\xd4\x5e\x79\xfc\xce\x1d\xf7\xa4\xd2\xe9\x3a\x5f\x65\xfc\xa9\x4b\x02\xb8\x67\x67\x43\xf2\x09\xee\xbb\xdf\x7c\x23\xe4\xa1\x3e\x67\x11\xfe\x03\x2d\xe2\xaf\x82\x6e\xd1\x93\xc1\x34\x17\x31\x9e\x2a\x09\x50\xd7\xe7\x55\xb8\x9e\x89\x11\x1a\x45\x23\x59\x9a\x0e\x2a\xc1\x37\xd2\xb8\x95\x24\xa1\x7c\x1b\xbb\x7a\x40\x43\x23\xc5\xd7\x84\xba\x5a\xf2\x5c\xba\x05\x7d\xea\x93\x68\x2e\x0e\xba\xb5\x75\x03\xa9\x63\x81\xd8\xa2\xb6\xf9\x23\x2c\x56\x77\x8e\xf4\x9f\xb8\xf1\x9e\xba\x64\xea\x37\x85\x89\x45\x5c\xf6\xc3\xb8\x11\x5b\x4f\xce\xa9\xa8\x98\x38\xbb\x23\x46\xb4\x62\x90\x8e\xe7\x82\xea\x0a\x0f\xdc\x07\x75\x41\x5d\xc5\x89\x19\x4a\xd3\xb5\xb1\x4c\xdf\x1a\xe5\x8e\x96\x6f\x75\x85\x70\xa3\x7a\xb9\xa0\xa1\x5a\xaf\xbf\x6e\xe2\xc5\x9e\x9e\x5d\xe2\x6a\x1e\xeb\xc6\xc0\x75\xd0\x92\x3a\xf8\xb8\xda\xba\x78\xf0\xcd\x56\xa4\x47\xe0\x06\x99\xd1\xcb\x3c\x94\x09\xec\xd0\xf6\xcc\x00\xcb\x7f\xef\x38\x14\xc4\x7a\xac\xd6\x30\xf5\x45\xc2\x82\x5a\x6f\xaa\xda\xa2\x73\xdf\x3c\x11\xe6\x92\x6d\x31\xcf\x91\x2e\x2f\x3a\x1c\x0f\x3a\x1c\x7f\x3f\xec\xfe\x5b\xcf\x5f\x3b\x66\x1c\x7f\xea\x78\x97\x29\xac\x9b\xc5\xd8\x04\x33\xe5\xd9\x77\x8e\xdd\x64\xaf\xb0\xdf\x75\x76\x49\x16\x52\xdc\xb9\xcb\x79\xc4\x79\xda\xf9\x84\x4c\xcf\x7d\xc9\xf9\x05\xe7\x57\x9d\xbf\xe1\x7c\xc3\xf9\xa6\xf3\xf7\x9d\x7f\xec\xfc\xb1\xf3\xcf\x9d\xff\xcd\xf9\xbf\x9c\x1f\xba\x98\xab\xcb\x25\x5c\xfd\xae\x11\x57\xd2\x35\xe5\x32\x5d\xd3\xae\xbd\xae\xc3\xae\x13\xae\x7b\x5c\x0f\xb8\xae\xb9\x96\x5d\xcf\xb9\x3e\xe7\xfa\xaa\xeb\x1b\xae\x6f\xbb\xbe\xeb\xfa\xa7\xae\xff\xbf\xeb\x5f\xb9\xfe\xd2\xf5\x7f\xba\xde\x77\x6d\xc0\x09\x42\x2f\x42\x18\x46\x04\x49\xec\xc0\x34\x0e\xe1\x38\x9a\xb8\x88\xcb\xb8\x1f\x0b\x58\xc2\x27\xf0\x49\xdc\xc2\x57\xf1\x4d\xfc\x14\x3f\xc3\xfb\xf8\xef\xf8\xa5\xdb\xe9\xf6\xb9\x03\xee\x21\xf7\x98\x3b\xed\xde\xe9\xde\xeb\xae\xb8\x8f\xb8\xeb\xee\x73\xee\xbb\xdd\x57\xdc\x0f\xb8\x1f\x77\x3f\xdd\x39\xad\xed\x7f\x94\xa0\x75\x4c\x86\x55\x97\x62\xcf\xcc\x95\x88\xdf\x99\x50\x12\x1d\x99\xb7\x14\xcd\x15\x12\xb9\x3e\x3b\xe9\xae\x90\x2f\x84\xf3\x52\x1c\x11\x0d\x07\x03\x32\xdf\xd7\x2d\x3b\x2d\x53\xc6\x24\x46\xfc\xcc\x36\x2c\x89\xbb\x24\x00\x8d\xf6\xd9\x23\xa7\xbc\x84\xb3\x5b\xcc\x2c\x39\xb5\x35\x0b\x7d\x85\x9c\x92\x88\xd8\x43\x7a\x3b\x55\x51\xb1\x79\x57\x72\x05\x2d\x93\x6a\x6c\x0d\x9f\x3c\x35\xcd\x82\x59\xe8\xcb\xd9\x4e\x25\x52\x88\x6e\x9f\xfc\x52\x2b\xc8\xec\x38\x29\x25\x6a\xd3\x81\x2c\xdc\x68\x35\x72\xf6\x99\x2f\xfd\x59\x13\x12\xb8\x06\xf3\x85\x2d\xb7\x11\x79\x3e\x7b\x0a\xf6\xce\x34\x6b\x63\xe4\x5c\x54\x2e\x67\xa5\x45\x55\x36\x97\xc8\x4a\xc1\x5e\x58\x42\x5b\xeb\xc9\x14\xec\x64\x9a\xf8\x0c\xb3\x17\x0c\x1d\x9c\x18\x97\x1a\x85\x5c\x3c\xe7\xb1\x0d\x42\xc2\x5b\xfa\xbf\x42\x7c\xcb\xce\xb0\x90\xed\x24\xe1\xca\x96\xcf\xce\xb4\xda\xd2\xe8\xc9\x3f\xed\x7c\x5c\x35\x2a\xdb\x4b\x5b\xa9\x60\xbd\x64\x16\x0c\x0e\xc9\x01\x9e\x64\xe7\x46\x02\x92\x83\x1b\x49\x74\x96\xcd\x09\x8f\xcd\xba\x0a\x76\xaa\x8d\xb4\x77\xb1\x9d\xe2\x73\x59\x7b\xd8\x26\x0d\xe4\x25\x51\xb6\xe3\xb0\xdd\x51\xbc\xcb\xaa\x52\x48\xd8\xa5\x53\x1d\x61\x99\x0e\x1b\xad\x60\x5a\x9d\x72\xd4\x36\x50\x89\x8f\xd9\xae\x2d\x76\x93\xaa\xd8\x59\x83\x63\x99\xce\x5b\xd8\xc9\x19\x93\xb7\xb6\x5e\x14\xdb\x09\xdd\x7e\xcd\x6d\x8e\x9b\x75\x27\x9d\xe8\x60\xeb\x49\x77\xea\x5c\x50\x0d\x9b\x36\x69\xcd\x8c\xda\x26\xbe\x85\x68\x24\xe1\xb6\x1e\xc0\x86\xe9\xb2\xcf\x96\xd7\xec\xee\xf8\x2f\x4a\xbf\x98\x9c\xdb\x0e\x3c\xb6\x3e\x7d\x21\xd9\xbd\x5b\x9f\x00\x97\xdd\x5a\x8f\x49\x2a\xf2\xe8\xd6\x66\x3e\x17\x0d\xda\x89\x42\xb6\xbf\x99\xbb\xe3\xd2\x98\x70\x2b\x36\xf7\x2c\xd7\x61\x78\x99\xd6\x43\xda\x36\x30\xf2\x55\xca\xca\x1e\xa2\x10\x1f\xb3\x1d\x5a\x3a\xac\x63\xf9\x0e\x17\x3a\x6f\xb3\x14\xbf\x24\xa2\xee\x0e\xed\x79\xcc\x36\xa6\xb1\x89\x0c\x05\xa9\xa4\x0f\x49\x21\x63\x64\xd4\xd3\xd1\xf2\x98\x63\xb7\x5b\x7b\x19\xe1\x38\x66\xb7\xf4\x6e\x55\x36\x03\xb6\x3e\x26\x9c\x35\x13\xd6\x5b\x11\xb2\xb3\x89\xdc\x1d\xa9\x8f\x22\x93\xd5\xdc\x41\xb5\xd3\xa4\xb8\xd5\x8e\xae\x46\x5a\x2d\xc8\x16\xbf\x63\xb0\xd3\x99\x8c\x7a\xb6\x64\x2e\x76\x86\x74\xdc\x2d\x87\xc4\xa1\x6c\xc8\x56\xaa\x46\x3d\xb7\x19\x75\xf2\xa5\x8e\x8f\xd9\x43\xe2\x84\x44\x07\xb7\x09\x89\x16\x22\xb1\x0d\x39\xe5\x00\x27\x3b\xc5\xa4\xa3\x5c\x26\x67\x3f\x60\xb6\x60\x03\x9d\xa8\xc7\x1d\xca\x86\x73\xf6\xe5\x5a\x77\x6f\x46\x6d\x7b\xb6\xb0\x24\x4d\x24\xb2\x21\xdb\x9f\x2e\x9b\x4b\x8c\xde\x76\x61\x0b\x6f\x25\xcc\x48\x4d\x8f\x9d\xeb\x12\xe9\x48\x6a\x6d\x4e\x79\x36\xde\x91\xf5\x48\xfb\x9f\x2d\x7e\x84\xf5\x1a\x74\xc2\x52\xd5\xf0\x16\x57\xe2\x36\xa7\xd1\x8e\x3a\xc8\xc9\xef\xa5\x85\xaa\xe4\xe7\xe5\x36\xd1\x70\x0b\x1d\xc9\x86\xcf\x66\xa2\x47\xb6\x8c\xf0\x3c\x6e\x25\x68\xbf\x4b\x72\xd6\x95\xef\x70\x0a\xc3\x5b\x5f\x44\x5b\x25\x2b\x17\x86\x85\x5c\xc2\x63\x5b\x86\x26\xe2\x4a\x38\x97\xbd\xbd\x43\x8a\x7f\x3c\x3b\xb3\xa7\x6b\x1d\x5f\x9e\x84\xb2\xb5\x9b\x54\xa7\x59\x21\x1b\x9f\x94\x6a\xe0\x6c\x2e\xe1\x5a\xd9\xf6\x47\xd3\x3b\xc5\xca\xd1\x51\xaf\x4f\xc0\x82\x0c\xb7\x8a\xcf\xb1\xd7\xcf\x8e\x06\x4e\x56\xd7\x0d\xed\xd5\x2b\x07\xd4\x95\xbd\xae\x74\xb5\xe4\xf1\x00\xb1\xc6\x63\x3b\xbe\x7b\x60\x76\xd7\x45\xde\xf7\xd1\x7f\x91\xa8\x3e\x36\xb8\xf7\x53\x47\x99\x9e\xbe\xeb\xf7\x8e\x9d\xad\xf0\x54\xe2\xdb\xb5\x7f\xfd\xf8\x5a\x7b\x22\xb4\x6b\xbb\x05\xfe\xc3\x3b\xfd\xa3\xf5\xc3\x0f\xbd\x53\x33\xf9\xd2\x8d\x63\x01\x0e\x2c\xe5\xbe\x50\xa4\x51\x25\xbd\x5a\x51\xeb\xdb\x14\xbf\x37\x31\x33\x39\x33\x7d\xf9\x9f\x29\xe1\x71\x60\xb0\x3f\x6d\x9a\x7a\xd5\x94\xeb\xe4\x52\x72\xea\xb2\x1a\x9c\x56\x43\x5d\x54\xd1\x6f\x96\xbb\x4e\x65\x1f\x38\x79\xd4\xba\x4f\xb3\x75\xed\x5b\x3f\x3e\x9f\x37\x54\xd7\xfc\x6c\x1a\x82\xd3\xdc\xe6\x3b\xbb\x86\x51\xa4\x4a\xf7\x20\xaf\x08\xc0\x3b\xcd\x93\xfe\x19\xf2\x84\x8a\x81\x33\xfa\xc8\x5e\x55\x1a\xc9\xed\x19\x6d\xfc\xb4\x7b\x32\xf8\xfb\xd0\x8a\x04\x95\x38\x89\xa2\xc2\x88\x03\xef\x22\x33\x2c\x8a\x86\xb7\x20\x8a\xf8\x61\xb9\xeb\x3a\xd6\x01\x2a\x05\x46\xb1\x4a\x26\x4d\x1c\xd9\x88\x95\xb9\xa9\x31\x07\x6d\xd2\xc4\x70\x19\xe8\x9a\x50\xa9\x0c\x94\xf8\x54\x37\x50\xe1\x53\x5e\x8a\x0f\x10\x95\xa8\xaa\x95\x08\xd9\x6e\x14\x09\x53\x41\xb5\x28\x7e\xdf\x35\xc5\x87\x02\x41\x65\x73\x25\x59\xa4\xe0\x88\x41\x4d\xc1\xa7\x67\xe0\x1e\x34\x17\xad\xe6\xf3\xe5\xdf\x09\x1d\x89\x91\xf2\x38\x96\x09\xcb\x62\x85\xd0\x6a\x00\xfe\x0b\xe0\x4d\x1d\xb5\x98\x66\xd4\x79\xa5\x0c\xff\x8e\x2a\xd0\x33\x5c\x27\x5a\x01\xe2\xc7\x89\xf6\x6c\xe3\x46\xd9\x6a\xf0\x8c\xc0\x5e\x62\x2d\xbd\x6c\xd0\xca\x8f\x7d\x39\x42\xe9\x2d\xa4\x46\xa7\x90\xfd\xf0\xab\x54\x22\xc8\xf0\xa9\xb2\x70\xcd\x54\xd8\xc2\xc1\x50\xf3\xc0\x59\x23\xd9\x4e\xa7\xab\xd5\x06\xaa\xe6\xf7\xe6\x38\xd5\x38\x51\x5f\x57\x0c\xe8\x8e\x8e\x04\x79\x03\x68\x90\xa8\xf3\x86\x38\xe0\xa7\xca\x0d\x43\x77\x96\x70\x61\x10\x7a\x93\xd0\x26\xf0\xd6\xe6\x0f\x56\x68\xe5\xa3\xf7\x4b\x84\x12\x4b\xf5\x8e\x94\x08\x6d\x97\x60\x47\x0d\xf8\x2f\x6c\xd4\xb1\x59\xf5\xfa\x92\x28\xb2\x75\xc0\xe5\x3d\x3b\xae\xaa\xd4\x4e\xf1\x59\xbe\x77\x92\xb0\x67\xf3\xb3\x45\x2a\xa1\x01\xbd\x46\xd4\xa4\x39\xde\x75\x8a\x68\x11\x7a\xfb\xc3\x9b\xf0\xf5\x1a\x64\x3a\xdf\x07\xdf\xac\xfa\x4f\xa2\xa5\xd3\x81\x04\x30\xb7\xf9\xc3\x34\x7a\x9c\xbf\x25\xac\xd7\x12\x0b\x1b\x9a\xbb\x00\x02\x6f\x77\x79\x1e\x70\xe1\xa3\xf7\xf6\x16\xd4\x16\x7b\x6d\x96\xe6\x36\x2b\xcb\x38\x3c\xe5\xe2\xa6\x49\x73\xf8\xf0\x07\x28\xc3\x79\xab\xc6\x1b\x9b\xc5\x06\xef\x3b\x48\x46\x9d\x73\x50\x6c\x49\x74\xb3\x7f\xc8\x43\x21\x43\x30\x0d\x83\x27\x09\x6b\xbc\xd5\xd5\xc5\x3f\x5c\x20\xff\x0c\x9c\x2d\x4d\x90\x20\x0d\x9c\x54\x2a\xeb\xac\x55\xf5\x86\xa1\x78\x17\x37\xa8\x84\xd2\xe6\xcf\xb0\x2d\x8b\x96\xeb\x83\xba\x06\x7e\x6f\xd7\x86\x9e\xd6\x79\x60\xaf\xf3\x7b\x93\x39\x22\x7d\xf0\x18\xc4\x47\xa9\xee\xd3\x98\x75\x7d\xef\x70\x78\xe7\x20\xff\xa8\xce\x6b\xa8\xbb\x5e\x23\x18\xfa\x47\x6f\x80\x60\xc4\x87\x2f\x9d\x3a\xf1\xed\xc1\x6d\xea\xb3\x03\x0f\x3f\x96\x76\xde\xe4\xb4\x81\x2a\x3c\xec\x2a\xd7\x43\x5d\x54\x06\x9b\x13\xd4\x84\xaa\xaa\x31\xb1\x0a\x9e\x76\x79\x89\x6f\x26\x87\xe3\x16\xc4\x50\xfb\xd8\x6e\x13\x34\xee\x82\x60\x0d\x12\xc5\x14\x70\x62\x0c\xfc\xc3\x8f\x94\x60\xa9\xc1\xca\x15\x95\x44\x9a\xdf\xa8\xc0\x34\xca\x6a\xf5\x67\xa3\x8a\xda\x13\xf9\xb1\x0a\xc1\xe6\x7b\x22\x14\xee\x5f\x26\xbc\x8e\xfe\x00\x62\x60\x4b\xfb\x06\x00\x5d\x39\x56\x06\xf9\x72\xfa\xa6\x99\x46\xa4\xcb\x88\x87\xe0\x1f\x67\x2b\xc5\x24\xc1\xb7\x43\x43\x8d\x88\x37\x38\x25\x75\x8d\x28\xb4\x9b\xef\x1b\xe6\xa1\x23\x48\x96\x84\x2a\x1a\x9c\xeb\x23\xc1\xfc\x44\x8b\x36\xdf\xa6\x8d\xef\x91\xf3\xdd\xb4\xc1\x29\xbe\x9d\xd2\x03\x79\x68\x4d\x24\xcb\xa2\xc8\x41\xc9\x06\xb8\x28\x43\x6c\x94\x91\xe4\xce\x39\xd7\x0c\xd7\x1b\x1b\x5f\x1b\x1c\x13\x89\x51\xa7\x9a\x4c\x72\x35\x19\x23\xaa\x84\x77\x92\x5a\x33\x36\xdf\xc4\xd4\x10\xf4\xa1\xfb\x49\xab\x53\xa5\x96\x8b\x4e\xf7\xbe\xd7\x97\xd7\x30\x34\xf9\xe3\x7c\x5f\x6a\x34\xab\xdf\x1a\xdc\x81\x4a\xb1\x4e\x45\xb5\x1c\x99\x20\x02\xca\x2a\xe1\x7d\x43\x90\xe9\xf9\xeb\xd2\xd8\x9e\x9b\x97\xf7\x2f\xac\x40\x5b\xe3\x3a\x2f\x6e\xbe\x57\x5b\x10\x68\xfc\xac\x9c\x4c\xab\x06\x20\x06\x47\x17\x8f\xf4\xf5\x7c\xe6\x6b\xaf\x2f\xc5\x00\x56\x7d\xe3\x27\xa1\x3f\x09\x76\x4f\x6a\x1c\xfc\xc3\x77\x01\xdd\x40\x71\xf3\xe7\x77\xdd\xb7\x20\xf4\xf9\xfc\xf5\xae\x4b\x29\xbd\x5b\x79\x2b\xdd\x10\x66\x6f\xe2\x28\xeb\xe5\x80\x4a\x6c\xe4\x5b\x81\x73\xeb\x8d\xca\x32\x16\xeb\xad\x39\xa8\xff\xf1\x9b\x17\x9f\x52\xcd\xc1\x2f\xb2\xdc\x9f\x10\xf4\x52\xb2\x19\xea\x69\xfe\xcb\x33\xdb\xff\x49\xcc\xf8\xc3\x50\x95\x1a\x3c\x56\xf3\x38\xdb\x48\x8a\x15\xad\xc2\x63\xcc\xf3\xa7\x9f\xfb\x47\xe5\xba\x69\x5d\x0a\x47\xff\xa7\xff\x2c\x74\xed\x9f\x5d\xfa\x73\xd7\xec\x2b\x04\x04\x15\x5a\x6f\x62\xd1\x82\x64\x17\xbb\x34\xb5\x96\x82\xeb\x6e\x0e\xcc\x09\x4a\xcf\xf8\x39\xe1\xe8\x31\x32\x66\x41\xb5\x6a\x38\x80\x7c\x04\xbb\xfa\x52\x35\x22\x5f\xb7\xe0\xe4\xbc\xa4\x42\x72\xaa\xee\x8d\xac\x1b\x14\xab\x72\x0b\xd9\x09\xfa\xf1\xb2\xf8\x4a\x17\x50\xeb\xd9\xae\xbe\x46\x54\xde\x7f\xcc\x0c\x1f\xc6\xb1\x41\x97\x9b\x88\x7e\xba\x6f\x00\x2d\x0e\xf7\x7e\x41\xc7\x43\x68\xd2\xde\x84\xf5\xaf\xa6\x0e\xda\xeb\x63\x81\xa6\x68\xf9\x7a\x6b\x44\x87\xdc\x54\x03\xed\xf5\x7b\x7a\x5a\x4f\x1c\x51\x0d\xa4\x8b\x18\x99\x41\x1d\x81\x5e\xbe\x6b\x02\xb3\x55\x80\x36\x5f\x41\x3b\x46\x74\x93\xb4\x9b\xa0\x57\x42\x3d\x37\xa4\x07\xb2\x80\xef\x25\xd1\xff\x90\x76\xea\x41\x94\xef\xe9\xb5\x6e\xd8\x75\x6a\x56\xa0\xb4\x40\xdf\x03\xc6\xaf\x11\xdd\x95\x13\xb1\x59\x68\x4b\x1a\xd7\x42\x7f\xe8\xfc\xb3\x21\x85\xd7\x35\xde\x7f\x2d\xa9\x97\xf4\xde\x28\x81\x4c\x63\x7b\x1f\x28\x7b\x92\xa3\x06\x2a\xc7\xa8\x08\x32\x75\xb5\xb4\x80\xfa\xc2\x63\x7f\xf3\xf9\xb8\x2a\x5a\x27\x5e\xfa\xee\xc9\xa6\x4a\x91\x53\x38\x36\x28\x96\x90\xbb\x5f\x74\x3d\xa2\x52\x8a\x2a\x70\x1d\x28\x09\xfe\xc9\x00\xd6\xc4\x2a\x5f\x01\x6f\x9a\xbd\x0c\x6a\xac\x3f\x2a\xd4\xc5\x24\x35\x8b\x3a\xf4\xf9\xf2\x1c\xbd\x46\xf4\x2a\x17\x18\xde\xad\xf2\x72\xca\xb3\xbb\xce\x6f\x71\x0a\x9f\x13\x10\xd4\x06\x11\x37\x92\xbc\xb2\xf9\x2a\xa0\xc5\xce\x7c\x75\xea\xe1\x3b\xbe\xa4\x33\x32\xae\x6c\x53\xaf\xf5\x6b\x65\x5e\x53\x29\xb3\x0f\xd4\xe4\x62\x99\xda\x14\xb9\x34\xbf\x1a\xd3\x61\xc4\xd4\x3a\x38\xe7\x66\x13\x6b\x6a\xec\xe1\xa8\xde\xf7\x3c\x74\x51\xa2\xc1\x7e\x51\xac\xe1\x06\x17\xf1\x8c\xaa\xa6\xa1\x2f\x18\xf7\x04\x39\x2e\x65\x28\xd5\xa6\xe8\x03\xb4\x66\x88\x57\xc4\x99\x43\x74\x2a\xbe\x02\x88\xc0\x61\x75\x70\x86\x16\xb1\x34\x7b\xce\x87\xc8\x1d\x64\xcc\x73\x32\x84\x78\x95\x07\x03\xa9\x11\x2f\xb4\x59\xcc\x1c\x12\x2d\x43\xd4\x0d\xa8\x58\x11\xb1\x32\x92\xa6\x21\x34\x52\xd1\xd3\xa3\xaa\xd5\x18\x7a\xef\x52\x85\xe6\x7f\x94\x06\xc7\x51\x06\xd2\x07\xa6\x70\xe2\x8c\x46\xfd\x0f\xa9\x50\x3f\xe5\x12\xd9\x20\x51\xff\x54\xec\xec\x4e\xe2\x14\x0b\xbe\xe0\x1d\x14\xdb\x8f\xeb\x0b\x3a\x9f\xc3\xe5\x11\x54\x84\xd6\xc4\xc8\x49\x58\x25\x21\x55\x12\xb1\x98\x98\xad\xc5\x4a\x64\x9a\x6f\xa7\x01\x6e\x7d\xbe\x06\x76\x0f\xee\xe4\xf5\xed\x1e\xdc\x02\xcc\xe0\x20\x3f\x12\xc1\x35\x26\x38\x87\x06\x55\x3b\x95\xb1\x3e\x08\x3c\x72\x90\x1f\x8f\x78\xfd\xc4\xeb\xa6\x71\x6f\x1f\xd4\x54\x95\x12\x07\x10\x7e\x98\xb0\x20\x10\x38\x86\x16\x41\x6d\xf0\xe5\x1a\x4d\xf6\x53\x9a\x92\x28\x6c\x83\x5e\xb5\x3e\xbd\x04\x34\x5b\x00\x5e\x1c\x40\x28\x82\x59\x2c\x01\x9e\xab\x31\xa0\xe7\xd4\x1c\xf0\xa0\x07\x58\x88\xe1\xd8\x21\x90\xe7\x0e\x03\xe1\xfb\x08\xf4\x78\x58\x88\xe2\x8e\x00\xa8\xf7\xca\xd3\x41\x90\xf3\x79\x73\x5d\x70\x7a\x71\xb8\x51\xe8\xde\x79\xe2\xd5\x0a\x91\x01\xb4\x1f\x99\x20\x6c\xbf\x1a\xa3\x83\xa7\xe0\x55\x5e\x89\xad\xe3\xee\xac\x31\xf8\x0c\x57\xd7\x3c\x5d\x40\x8c\x23\x10\xe4\xa3\x77\xea\x8a\x5b\xac\x6b\x54\xe7\xd4\x02\x4d\x5d\x00\x8d\x9e\x55\x0d\xac\x80\xd6\xba\x9c\xe0\x2d\xad\x64\x5d\x20\x2d\x60\x11\xeb\xe2\x61\x1f\xd0\xfb\x10\xa1\x56\x26\x5c\xef\x89\x5f\x04\xce\xe6\xb0\x8e\x75\x3c\x1c\xa6\x5a\x4c\x60\x05\x33\x7e\x54\x1d\x13\xd2\x73\xe6\x4d\x0f\x77\x64\x1d\x0f\x38\x1e\x75\xac\x38\x3e\xe5\xb8\x21\xf3\x17\x7f\xb7\xc3\x98\xf8\x0b\xc7\x4f\x1d\xff\x59\x3a\x74\xba\x98\x4f\x6e\x70\x4b\xac\xc2\x8e\xb1\x06\xbb\xcc\xae\xb3\x9b\xec\x77\xd9\x5b\xec\xcf\xd9\xbf\x63\xff\x99\xfd\xdc\xe9\x90\x2e\x01\x9a\x64\x4f\x6f\x73\x66\xa4\x96\x32\x34\xc2\x3c\x8a\x5c\x23\xd8\xa1\x4f\x51\x89\x2f\xe5\xae\x35\x6a\xc3\xd2\x49\x16\x99\xb2\x40\x6c\xc0\xf6\x34\x63\x36\x43\x37\x5b\x08\x17\xac\x7f\x24\x14\xb4\x2d\x00\x72\x11\x19\xd8\x22\x35\xed\x05\xc9\x3b\x2b\x4c\xb1\x82\xa4\x24\x29\x2e\x3f\xf3\xb0\x4e\x06\xba\x12\x0e\x66\x64\x9c\x51\x62\x48\x66\x2a\xda\xea\x7e\xab\x81\x1c\xcb\x04\x33\x61\x45\xcd\x5a\x5d\xbb\x47\xe6\x43\x4e\x31\x89\xb2\x3c\x41\xdb\xc0\xd2\x42\xa0\x09\x3b\x4e\xd9\x94\x9e\x65\xb6\x81\xa4\x4d\x67\x0b\x6f\xe5\x35\xdb\x82\xff\x48\x47\x36\x6f\x76\x8c\xee\xa5\xc9\x5a\xc6\x8e\x81\xb4\x91\x84\x39\xc5\x14\x77\x38\x5b\x88\xda\x03\xc4\xa0\xad\xd9\xb4\xd9\x77\xb9\x42\xd8\x6a\x78\xc7\x82\xe1\x9c\x19\x8d\x2b\xa1\xac\x8d\xa8\x2d\x20\x6d\xfd\x9e\xd9\x71\x15\x30\x13\xb6\x99\x7d\x22\xa2\x74\x66\xa0\xb2\x7d\x96\x14\x6c\xb5\xe3\x4a\x1d\x94\xdb\xd4\x5c\x21\x27\xf1\xf3\x24\x1b\xed\xe0\x57\x0b\xfb\x65\x43\x36\xa2\x0d\x65\xf7\x58\x77\xaf\xc4\xb7\x3c\x3f\x3b\xe0\x79\x86\x65\xed\x78\xc7\x4e\xaa\x8c\xb4\x03\x97\x62\x9f\x42\x2e\x21\x43\xeb\xe5\x8a\x45\x42\xec\x84\x0d\x97\x73\x1d\xf9\x8e\x7d\x3d\x59\x69\x9d\x6d\x4b\xfd\xad\x17\x22\xac\x46\x3b\xa4\xbe\x7c\x2e\x2e\x71\xe8\x58\xb0\x63\xac\xbd\xd5\xf1\x27\x3c\xee\x0e\xd4\xcb\x86\xb7\x52\x02\x72\xf1\xe8\xa8\x75\x77\x2e\x6d\x7c\xcf\xf6\x83\x2a\x87\x48\xc6\x8a\xc9\xc1\x1d\xa1\x7c\xf9\xfa\x79\x4e\xc6\x82\x2a\x3d\xa2\x12\xdb\xc2\xc7\xf6\x0d\xeb\xe7\x3e\x8b\xe0\x43\xff\xe2\x4a\xad\x65\x14\x93\xdb\x36\x02\xa5\xea\x6a\x76\x5c\x40\x37\x0d\xf5\xb5\x5d\xc3\x23\x3b\xf9\xb1\x69\x34\x52\xd6\x77\xd5\xaa\x36\xd2\x80\x0c\x20\x44\xb7\xad\xc5\x0e\xee\x9e\x5d\x5a\x7c\xd8\x75\x58\xbf\xa3\x6b\x01\xe8\x3e\x0d\x8e\x45\xf0\x06\x6f\x5b\xdf\xf8\xcd\x9f\x6b\x1e\xa7\x84\x00\xd4\x3d\x59\x1f\xe8\xeb\x7f\x88\x96\x7d\x27\xa3\x41\xa1\x03\xaf\x5b\xfd\x51\xf0\x10\x4a\xc6\x7b\x48\xc3\x3b\xa2\x71\x5e\xa4\xe2\x4f\x8b\x31\xd1\xe2\x9b\x1f\x21\x70\x18\xfe\x60\x9a\x39\x2a\xb1\xb9\xcd\x9f\xd1\x4c\x16\xc5\x3a\xd5\x93\x98\x38\xce\x92\xa9\x1a\x62\x75\x6c\xbe\xb9\x4c\xb0\x1e\x2b\x76\x78\x12\x42\xb9\xc0\x31\x9f\xa4\x05\x5a\xa4\xe5\x6e\x76\x79\x4d\xbb\x23\xa4\x0c\x5d\xef\xc2\x5c\x8c\xba\x2e\xc6\x9a\x7c\xb3\x85\x9d\x7e\x51\xfb\x9e\x08\xba\xa0\x04\xdf\x53\x4b\xf0\xb1\x6f\xfa\x46\xdb\xd6\xb7\x3b\x10\xd4\xd4\xcd\x6a\x13\x40\x19\xfe\x1c\x82\x23\x49\xd6\x5a\x25\xaa\xd5\x41\x2a\xa7\x86\xd5\xe1\x52\x8a\xd4\x63\x81\x8d\xb7\x1a\x3a\xea\xc0\x3c\xaf\xf1\x74\x4a\xb5\x1a\x56\xf4\x9d\xa7\x64\x7a\x2e\xc5\x1b\xa2\xdc\x1f\xc6\x1c\x37\xd2\xa1\x23\x5d\x7d\x68\x13\xcd\x63\x9e\x10\x39\x48\xed\x2a\xc2\xe7\x88\x2f\xc5\x96\x80\xfd\x3b\xe0\xfc\x05\xda\x00\xf7\xde\xff\xd1\x7b\x58\xe2\x0b\x2a\x4f\xd5\x29\x75\x9f\xf3\x3f\xd2\x9d\x43\xfc\xa3\xf4\xd3\x5e\xbe\x7b\x1f\xe0\x52\x8b\x69\xa8\xf3\xda\x47\x6f\xb5\xb5\xe0\x15\x17\xaf\x92\xda\xfc\xe8\x4d\xc4\x0f\xe2\x6c\xaf\x4b\xe7\xf0\xf0\x70\x6e\xf0\x40\xe5\xea\x67\xde\xbe\xf1\xc7\xff\xbc\x56\xd2\x8e\x0f\xf4\x2a\xf5\xb5\x98\xbd\x32\x6e\xef\x39\x60\xfe\x54\xbb\xf7\xa9\xbf\x62\x77\xbf\xf3\xdd\xee\xb2\xfa\xcb\xf7\x69\xcc\xb7\xb2\x2e\x37\xad\xfc\xcd\xa3\xfd\x35\x6d\xfc\x2f\xd6\x6b\x86\xa6\xf2\x14\x66\x01\x43\x24\x8b\x48\xa6\x85\x58\x17\x73\xa9\xda\xc5\x3f\xd8\xfc\xf9\x07\x37\x9f\xc5\x45\x8d\x5a\xdc\xa8\xa7\x93\xd4\x00\xa0\xd1\x7c\x35\x8d\x1a\x85\xcf\x15\xf9\xc4\x2e\xd2\xaa\x73\xc9\x8a\xaa\x97\x8b\xef\x77\x2b\x10\x81\xa0\xf8\x5b\xfa\xd1\x72\x72\xc8\xaf\xa3\x42\x6a\x43\xab\x9b\xc6\xc8\x0c\x72\x09\x9d\xab\x45\x43\xd5\x52\xb1\xba\x3e\xb0\x5b\x94\xf4\x34\x4a\x25\x9e\x54\xb7\x9d\x48\xa5\x8a\x49\x71\xd2\x87\xe0\x69\xe2\xb8\x67\x07\x62\x45\x2f\x5b\x48\x41\x8c\x3f\xc4\xa7\x7a\xeb\xd8\xeb\xab\x20\x7d\x4b\xbb\x85\xe6\x43\x63\x84\x55\xbe\x4a\xa4\xae\x13\xdd\x20\x7a\x45\x51\x52\xab\xbc\xd8\xae\xaf\xac\x1c\x38\x1d\x03\xcd\xf2\xbe\xbe\xa6\x88\xa9\xa7\xdd\x18\x3c\x36\x4b\x3c\xad\x57\xcd\x14\x38\x86\x76\xa0\xb2\x08\x5a\xc0\xb6\xbb\x86\x7b\xb0\x56\xc2\xb2\xf5\x2e\x62\x16\xb3\xd8\xf1\x10\xc8\xba\x4a\x74\x0d\x50\x8b\xaf\x42\xdc\x7f\x40\xc7\x49\x1f\xa7\x45\x9c\x1a\xc0\x12\xce\x05\x50\x2a\xd2\x3c\xf1\x79\x54\x4d\x80\xa8\x95\x04\x5f\x11\xf3\xdd\x77\xf6\x2a\xa0\x35\x5a\x02\x5f\x25\xbd\x45\x2f\xf4\x2e\xa9\xbd\x8f\x71\xbe\x9a\xc2\x3a\x5d\x9e\x14\xea\x02\xe7\x58\x21\x79\x13\x0e\xa4\xda\x43\xca\x4d\x8d\x2f\xf3\x39\xfa\x02\x03\xdd\x9d\x85\xa0\xd3\x43\xc0\xb2\x33\x74\x03\xe9\x39\x9a\xb3\x3e\x20\xa0\xc2\x4e\x5a\x04\x17\x8e\xed\xb2\x6e\xac\x78\x92\x8e\xb2\xe3\x79\xc7\xb7\x1c\xff\xd8\xf1\x07\x8e\x7f\xe7\x78\xdf\xf1\x21\x73\x32\xc1\x22\x2c\xc5\xb2\x6c\x37\xab\xb0\xe3\xec\x2c\x5b\x60\xd7\xd9\x67\xa5\x67\xf3\x0f\xd8\x1f\xb0\x3f\x62\x3f\x65\xff\x83\xfd\x9d\xd3\xe1\x24\xa7\xdf\x19\x72\xa6\x9d\x39\xe7\x8c\xf3\xa0\xb3\xe9\xbc\xdb\x79\xbf\xf3\x11\x39\xed\xfd\x94\xf3\x86\xf3\x96\xf3\x2b\x76\x0e\xbf\xbd\x83\x0e\x76\x74\x37\x43\x4c\x9a\x37\x7b\xfc\xcc\xe3\x67\x09\x4f\x34\xa1\xd8\xff\x8f\x27\xa4\x18\x27\x67\x7b\x9e\x24\xcc\x42\x22\x9f\x35\x0b\xf9\xb0\xdc\xec\x06\x3d\xd2\x36\x53\x12\x7b\xc2\x4a\x38\x18\x95\x89\x5c\xc1\xb0\x75\xea\xca\xa4\x48\x49\x01\xda\xc3\x12\xd6\x11\x2e\xa7\xb0\x39\x5b\x84\x23\x57\x4b\xd1\x88\x3b\x1c\x54\xe5\x8c\x2b\x63\xcf\x3a\xb7\xa2\x0c\xac\x23\x54\x9e\xd9\x72\x92\x63\x5b\x41\x2b\x89\x68\x24\x91\xb7\x1e\x3e\x2f\xb3\x07\xdc\xe1\xa0\xa4\x07\x59\x57\x6e\x67\xb0\xc8\x23\x55\x0e\x47\x64\x9e\xa4\xad\x83\x94\x6b\xb4\x78\xc7\x1d\x26\x97\x88\xca\x40\xdf\xad\xda\x22\x03\xfb\xe4\x1c\xd7\x6d\x97\x81\xa0\x12\xb5\x4a\x58\x66\x0f\xcb\xd9\xa2\xda\xac\x34\xa3\xb1\xc7\x5a\xe1\x6c\xbe\x93\x6f\x35\x16\x94\x59\x62\xb2\x0e\x84\xa5\x57\x4b\x27\xb0\xc0\x16\xef\x44\xad\x57\x43\x3a\x80\x65\xc2\xf9\x82\xf5\xa8\x1e\x99\x7d\x10\x1f\xb3\xc3\x07\x55\xbf\x4d\x1c\x4a\x28\xe6\x14\x0b\x14\x12\x85\x11\xd6\x51\x12\x29\x5b\x7e\x63\x9d\x8c\xbf\xb0\x12\xcc\xaa\xf6\xc0\xaf\x33\x77\x8d\xc8\x19\x8d\xb4\x83\xb6\xae\xc1\x7e\x20\x19\xc6\x19\x8d\x24\x3c\x4a\xd0\x2a\xe9\xd6\xb3\x0b\x07\x65\xd0\x99\x5d\xf8\xec\xe2\xaa\x86\x0b\xb6\x16\x75\x8b\xab\x6b\xef\x08\xe5\xe0\x52\x91\xa3\x23\xb7\x2a\xd3\x5f\x22\x52\x6f\x6a\x13\x26\xed\x60\x76\xc5\x7e\xc9\xb7\xb6\x7b\x76\x15\xb2\x1e\x4e\x95\xf3\x4a\xa9\x6b\xca\x14\x6e\xcb\x78\xb6\xf6\xfc\x85\xc4\xed\xe7\xe2\xb1\xa9\xcb\x05\x29\x73\x8d\x47\xb3\x4a\x68\x6b\x02\x25\x77\x9e\xd9\xce\x1e\x32\x2c\xe7\x79\xce\x1b\xe3\x67\x2f\x24\x76\xf5\xf4\x4e\x97\xfd\xde\x8a\x5a\x13\x75\xc0\xf7\xe5\xe4\xc0\x11\xae\xf6\x1e\x55\x35\x43\xe8\x31\x55\xbb\x18\x5f\xab\x16\xb5\xc7\x7a\xc7\xfd\x20\xe8\xd8\x16\x6d\x5f\x61\xc0\x9f\x75\x61\x57\x17\x6e\xff\x6f\x64\x66\x8e\xc3\xd7\x1f\x0f\x99\xea\x62\xb2\xf1\xb9\x5f\xbf\x32\xaa\x62\x71\x2e\x96\xd4\x00\xff\xf8\xc4\x9f\x6a\x80\x86\x2c\xfb\x6d\xd2\x46\x82\x95\x6e\x57\xba\x04\xd4\x05\x1a\x2a\xa1\x6e\xb5\x83\xda\xe6\xfa\xae\x7d\x25\x52\xeb\xaf\xf2\xa6\x9a\xe9\x1a\xec\x25\x65\x68\xcc\xb9\x47\x53\x37\xcd\x59\xde\x93\xd7\x6b\x75\x1d\x0d\xf2\x8f\x8d\x07\xd4\x18\x9d\x72\x1a\xa6\x5e\xe5\xc3\x79\xed\x67\xa2\x18\x19\x26\xef\x63\x44\xdb\xa6\x41\x73\x48\xb2\xd8\xe0\x58\x71\xf3\x47\x56\x2f\x09\x8e\xbe\xcc\x78\x80\x55\x8f\xef\xb2\x0e\x15\x15\x50\xf1\xec\x41\xbc\x45\x89\x03\x1c\x08\x9e\xde\x78\xab\x81\xba\x93\x2f\x12\x53\x8a\x25\xeb\x1c\xdf\x78\xdf\x4c\xab\x49\x40\x98\xdc\x49\xfe\xcb\xa4\x5e\x1c\xa0\xf4\x02\xf0\xa8\x22\x96\x88\x96\x84\xa9\x1c\x1e\xdc\x81\x65\x08\xde\xcc\x6f\x1e\xe1\x8f\x9c\x37\xea\xc5\xf2\x1c\xd7\x11\x33\xea\x6a\x83\x10\xd3\xe6\x26\xb7\xd5\x68\x20\x6f\x60\x20\x43\xbc\xa8\x69\xc5\xba\xa0\x13\xdd\x4d\x0e\x50\x13\x7c\x16\xe8\xdf\x4f\x4d\x8f\x07\xfa\xde\x00\xd5\xf1\x8e\x89\x22\x27\x55\x53\x53\xba\x41\xe8\xe9\x13\x69\xfe\xf5\x3b\xb4\x22\x03\x35\x78\x32\x4d\x5d\xbb\x10\x2b\x6e\xbc\x3e\x8f\x79\x95\xda\x94\x2a\xc6\xc6\xf6\xab\xb4\x00\x8f\xf3\x41\xe9\x3b\xb3\xb1\xc2\x77\xf5\x68\x65\xa7\x36\xe7\xf7\xf6\x1f\x52\x18\xd0\x14\x22\x7a\x80\x48\xd9\x96\x24\x9a\x4f\x6f\xbc\x1e\xd3\x9d\x6a\x6e\x1a\x3c\x9f\x2f\x27\x8e\x91\x58\xd4\x52\x4b\x9c\x56\xd4\xe5\xfe\xc9\xbd\x85\xe5\x05\x1e\x6b\x24\x51\x3e\x90\x20\x32\xc7\xfd\x54\x6a\x0b\x3a\x33\xa8\x16\x67\x63\xb3\xc0\xe6\x5b\x75\xb5\x18\x2b\x91\xff\x40\x68\xc0\x7b\x4f\xac\xad\x23\x72\x3c\x89\x36\x9d\x0d\xa6\x5a\xda\x9c\x27\x49\x5c\xdf\x1e\x1f\x1c\x3b\x3a\x36\xf0\xec\xfe\xcf\xa5\xac\x27\xd4\x7a\xd5\xd4\xb0\xf2\xb6\x1e\x08\x4a\xc1\x91\xcd\xa5\x55\xb5\xf0\xe8\x83\xc3\xc5\xd2\x47\xe6\xb7\xbf\xfb\xea\xbc\x98\x3c\x26\x4a\xdd\xe1\x54\xcc\x6a\xdb\xf9\xb6\x3d\x80\x6a\x7d\x36\x1a\x24\x78\x9a\x74\x75\xf3\x77\x9f\xf8\xc3\x01\x9d\x97\x55\xe2\xd6\x3d\xb4\x8f\x5f\xaf\xe8\xc6\x1f\x9f\xe8\xbd\xe2\x1b\x3d\xfe\x79\xab\x1e\x5e\xcd\x94\x00\xbc\x5a\x12\xe9\x16\xa5\x6a\x26\x6f\x03\x2d\xe2\x6a\x3d\x46\xad\xfd\xc7\x04\x38\xd4\x18\x4f\xed\x98\x3c\x13\x5d\xb2\xd0\xd8\x3f\xa7\x58\xc0\x0d\x0d\x9a\xb6\xc2\xbd\xa7\x0d\xd5\xed\xc3\x1a\x96\x88\xbc\xd3\xbb\x7a\x40\x57\x27\x80\x46\x11\x40\xfc\x22\x35\x9b\xbb\x42\x7c\xec\x0b\x94\xbb\x13\xc6\xcd\x98\xc0\xa1\x5e\x9a\x1c\xaf\x24\x55\x5a\xd3\x78\xaa\xb1\x23\x21\xad\x60\xc9\x6a\x4c\x66\xb1\xaa\xa9\x9c\xd3\xd8\x3d\xa4\x8f\xde\xc9\xc9\xa8\x61\xa1\xb4\x22\xce\xec\xd1\xc1\xa9\x6b\x3b\x4a\x75\xf8\xdc\x00\x4a\x6a\xb2\xad\xf1\x87\x82\xe5\x75\xab\x94\xe2\x06\xad\x09\x2a\x36\x78\x99\xdf\xa4\x1f\x61\xe2\x38\xbf\x63\xa0\x91\x9f\xa0\xfd\x77\x27\xd3\xe0\x02\x5c\xd5\x98\xa3\xc1\x55\xe2\xa7\x73\x34\x7c\x91\xb0\xb3\x40\xa5\x8a\x58\xa5\x67\x9d\x94\x84\xce\x03\x2f\x89\xee\x6f\x02\xfd\x4f\xd3\x6b\x02\xf4\x54\x48\x5b\x25\xd2\x8a\x64\x62\xd6\xbe\x30\x43\x54\x57\xf9\x8d\x9a\x28\xa5\xb5\x79\x7d\x01\xba\x99\x2a\x82\xaa\xd8\xdd\x65\x9a\xbd\xbf\x0e\xbc\x9e\xd4\x6f\x61\xbe\xda\x18\x7a\x08\x6f\xa8\xe6\x62\x1a\x8b\x49\xbd\x06\xcc\xaf\xf5\x3e\x0d\xad\xad\xa2\x4d\x1a\x77\xdf\x4f\x95\x98\xbe\xdc\x2c\x0a\x4e\xfa\xf2\xf9\x0c\xa7\x53\xbb\x4c\x1c\x3a\x49\xe2\x26\xc5\xd0\xfb\x59\x7a\x85\xf0\xf9\x1e\xa4\x71\xf8\x74\x09\xaf\x10\xe6\x4a\x3a\xee\x1f\xa7\x6a\x7c\x42\xbd\x49\x4f\xf6\x33\x9f\x84\x65\xc0\x1c\x66\xb9\xf7\x2e\x0d\xc3\xf7\x02\xab\x84\xfc\x79\x60\x8d\x9e\xf6\x82\x56\x82\xd7\x1c\x93\xb2\xde\xce\x7a\x34\x47\xc5\xf1\x8c\xe3\x05\xc7\xa7\x1d\xbf\xe2\xf8\x92\xe3\x55\xc7\x6f\x3a\x7e\xc7\xf1\x4f\x1c\x7f\xe4\x78\xc7\xf1\x81\xe3\x17\x8e\x5f\x32\xc6\xba\x99\xc1\x26\x58\x9a\x9d\x60\x77\xb2\x87\xd9\xa3\xec\x49\xf6\xab\xec\xd7\xd9\xb7\xd8\x3f\x64\xdf\x67\xff\x8c\xfd\xc9\xed\xb4\x84\xbf\x61\xbf\x74\xba\x9d\x3e\x67\x9f\xb3\xdf\x69\xdc\x4e\x28\xb3\x5d\x6f\x3a\x41\xb3\xb9\xb8\x85\xd0\x22\x36\x0b\x3e\x1c\xec\xe4\x00\x75\x82\x69\x65\x01\x8e\x4c\xd9\xd6\x6c\x22\x20\x75\xae\xd2\x96\x2d\x34\xc2\x6c\xde\x57\x7c\x92\x45\xec\x5b\xc9\x9d\x9f\x05\xd9\xac\xbf\x98\xb6\x41\xa1\xed\x4e\x66\x6b\x4a\x24\x0c\xec\x78\x81\x06\xc3\x9d\x33\x56\x2e\x52\x42\x59\x5b\x9a\x64\x01\xa6\x68\x24\xac\x76\x0c\xc8\xc2\x19\xb9\x53\x09\xd9\x66\x6d\xd1\x78\x67\x87\x53\xe8\xfc\x90\x8b\x4a\xb1\x6c\xd4\xed\x51\xec\xb2\xda\xb1\xa6\x49\xc4\x6d\xeb\x69\xb9\xbd\xe9\x1c\xfe\x56\x7d\x8c\x5a\x95\xca\x6d\xdd\x54\xea\x5d\xa2\x11\xf7\x6d\x09\xaa\x2c\x21\xf6\xae\xc4\xce\xcb\xb4\x93\x0d\xe2\x09\xb7\xc7\x66\xda\xe4\x12\x5b\x55\x4f\x46\xfd\x67\x3b\x16\x9f\x52\x9b\x92\xb1\xea\xa0\xd3\x2a\x8f\xe1\x8e\xe8\xc4\x5e\xd7\x49\x9f\x06\x45\xc6\x4a\x76\x16\x83\x99\x42\xc7\x0f\x2e\xde\x59\xaa\xca\x3a\x5d\xb0\xfa\x80\x48\xb8\x43\x41\x73\x4b\x6f\xb6\xce\xee\x2e\xb2\x45\x55\xcb\xd9\xdb\xaf\xc8\x56\x52\x72\xa7\xa4\xe5\x25\xe7\x4d\x52\x6e\xb6\x14\xc0\x1d\xd7\x06\x0b\x0c\xcb\xfb\x90\x1a\x00\xc9\xc1\x95\x82\xe2\x29\xeb\xad\x0a\xc9\xfc\x4f\x99\x8f\x29\x4b\x6d\xc7\xa1\x21\x9e\x73\xce\x73\x4d\x6d\x1a\x3b\x0e\x1d\xc9\xd7\xeb\xba\xa6\x8e\x7f\xda\xf4\x86\x55\x43\x2f\xce\x22\x05\x90\xa0\x89\x83\x0b\xfa\xa8\x7f\xcf\x4b\xc2\x7b\xa8\xf2\xd4\x23\x73\xaf\x2e\xcd\xa7\xa3\xbd\xfc\xed\x07\x2f\x75\x8f\x1c\xd9\xec\x8b\xa9\x22\xd5\x6c\x7d\xd6\xbb\xf6\x52\x54\x57\x0d\x6e\x94\xaa\x07\xee\x54\xe7\x1b\x81\x6e\xeb\xac\xeb\x8e\xd6\xcf\x3e\x93\x6c\x24\x53\x46\x92\x4f\x44\x04\x81\x92\x87\xbe\xfd\xc4\x53\xdf\x9e\x5e\x77\xad\x71\x12\x3a\x87\x3e\x0b\xe5\x18\xdf\x9c\x2b\x76\xfb\x50\xab\x9c\x0c\xf3\x3a\xd7\xe6\x4b\x64\x4c\xf5\xbe\x71\x70\x82\xe6\x89\xfd\x82\xf7\x1d\xd7\xe0\x0d\x34\xf9\xc6\x8f\x5b\x1a\xe7\x57\xbb\x9c\x7c\x59\x58\xf7\x7d\x0f\x6d\xbc\x1d\x1c\xa9\xbb\x13\x74\x70\x82\x8c\x3a\xe0\x1f\xd3\x75\xd2\xab\x5c\xb0\x37\x56\x81\xf1\xb3\x50\x1f\xf7\x2d\x6b\x18\x79\x80\xd6\x36\x6e\xb5\x83\x0a\x47\x70\xca\x84\xc7\xb9\x7b\xff\x0e\xa2\x1d\x7b\x68\x5f\xc4\x08\x78\x95\x4f\x6c\xbc\x62\x7d\x49\xfb\x4f\x78\xc3\x4e\xb5\x42\x43\x83\x1b\x6f\xa7\x81\xe0\xfe\x3a\x70\x13\x54\xac\x12\x3d\xd5\x47\xcd\x14\xf1\x81\x48\xb3\x48\x7a\xb5\x41\xd0\xd5\x9a\x6d\x5d\x8f\xab\xc3\x02\x37\x80\xd7\x38\x2d\x8f\x38\xf7\x43\xf0\x7c\xa4\xd6\x18\x3d\x0a\xaf\xeb\x6c\x10\x34\x27\xfa\x8e\x68\x10\xc1\x43\x00\x3f\x33\xc8\x09\xe4\x3d\x36\xee\x03\x46\x03\x1b\xb5\xd9\x96\xd3\xe8\x8e\x16\xa1\x2e\x74\x85\xa2\x07\x80\xb9\xe4\xde\x11\xe2\xf3\xde\xc9\x16\x57\x47\xf6\xa2\xe8\x3a\x87\x3e\xe7\x1c\xa5\x5b\x6a\xd5\xef\x4d\xef\x8a\x80\x5a\xe5\x33\x7e\xb5\x55\x3a\xd8\x45\xe0\x35\xda\x7c\x33\x9d\xda\xa1\xbc\x3f\xd0\x17\xf5\x82\x8a\x9a\xfa\x16\xa6\xfb\x67\x3e\xb1\x77\x84\x8b\x8a\xa8\x9d\xf3\x69\x75\x35\x9d\x1b\xac\x78\xac\x36\x43\x88\x5a\xe6\x64\xfb\x9e\xa5\x2b\x81\xcf\x0f\x1f\xdc\x89\x89\x5f\x02\xff\xda\x9f\x69\x65\x76\x1f\xfb\x8b\x68\xe0\xf7\x4c\x3d\x5c\xb9\xd4\x7c\x3a\x32\xd2\xfa\xbc\x2f\x9b\x78\xe2\x33\xec\x2a\xdb\xbd\x52\x0e\x67\x3e\x2a\xdd\xf3\xe9\xee\xf1\x43\xfd\x23\x7d\xbd\x33\xcf\xac\x3f\x99\x7f\xee\xd9\x93\x5c\x69\xbe\x30\x10\xe6\x80\xef\x1f\x5d\x7a\xeb\x3f\x07\x8b\x77\xae\x07\x7a\x0a\xe3\xd3\x40\xee\x91\xd4\xd3\xad\xa7\x56\xff\x6f\xf6\x1d\xf8\xe1\x1f\x84\x8f\x53\x93\x42\x05\x1f\xb9\x9e\x4c\xf0\x2f\x06\x6e\x05\x05\xff\x32\x30\xf4\x20\x3d\xe2\x0e\x7f\x2a\xc9\xbf\x8d\x41\x9f\x68\xf9\xf7\x5e\x74\x6e\x87\xef\xd3\x91\xe1\xdf\x71\x4d\x70\xfd\x09\xec\x42\xdb\x17\x50\xaf\x5c\xd3\xb6\x85\x1f\x2d\x2a\xa1\xe7\xfc\x54\x1f\xaa\x28\x23\xcf\xc7\x9f\x1c\x7c\x3e\xae\x3e\x34\x83\xa7\x18\x9e\x1e\xa1\x6d\x17\xc2\x4f\x4e\xbc\x1c\x61\xdb\x9b\x07\x28\x8c\xf3\x31\x50\xb4\x81\x47\x7b\x29\xe0\x7b\x72\x82\xde\xce\x3f\x19\x10\xa0\x03\x39\x7d\xfb\xd5\xd3\xf0\x5d\x78\x8c\x46\xfc\x03\x7f\xac\x60\xef\x35\x6c\x7f\x7c\xff\x63\x13\x99\x03\xed\x1f\x9e\xbc\x76\x8e\x67\x66\xe6\x77\xcd\x86\x39\x7c\xf9\xa5\x19\x97\xeb\xdf\x00\xff\x45\x11\x91\xe7\x8a\xc9\x00\x44\x6b\x04\xe3\x47\x3e\x53\x3d\xae\xde\x55\x70\x3d\x8f\xbe\xe5\x30\xba\xaf\x03\x81\xf3\x55\x5f\x60\x78\x37\x4a\x6e\xbf\x6f\x32\x70\x64\x1b\xc2\xad\x59\x77\x69\x5f\xf8\xd3\x19\x34\xf2\x2e\x3c\xc9\x33\x57\x34\xfe\xfc\x2e\x57\xf7\x23\x01\x0c\x5d\xde\x89\xd1\x8b\x44\xae\xc7\xe2\x4f\x03\xfe\x33\xba\x6b\x84\xee\x34\x88\x9e\x1a\xc6\xb3\x6e\xea\x7e\x66\x50\x79\xd4\x43\xbe\x76\x18\x57\x66\x45\x7f\xac\xc2\x7c\x73\x23\x6e\x05\x0f\xe1\x21\xdf\x15\x6d\x57\x4d\x79\x12\xbe\x45\x10\x1e\x52\x66\xb9\xc3\x21\x03\x95\xf1\xaa\xfb\xe7\x8e\x71\xc7\x71\xc7\x15\xc7\x8b\x8e\x5f\x75\xfc\x96\x54\x88\xfe\x99\xe3\x27\xcc\xc3\xc2\x2c\xc3\x8a\x32\x51\xa7\xc5\xe6\x58\x9b\x3d\xc6\x9e\x67\x37\xd8\x2d\xf6\x75\xf6\x2d\xf6\x87\x32\x43\xe7\x2f\xd9\x7f\x60\xbf\x60\x1f\x4a\x07\xa0\x21\xe9\x21\x6d\x3a\x4b\xce\x8a\xf3\x88\x4c\xd1\xb9\xdb\x79\x9f\x73\xc1\x79\xfd\x36\x0f\x31\x63\x81\x29\xa7\x6d\x8c\xa6\xd8\xca\x28\xb3\xd0\x27\xc7\x73\x36\x8d\x25\x1b\x74\x49\xa6\xa2\xc7\xcf\x82\x1d\x0e\x4b\x5f\x2e\x51\xb0\xcf\x7b\xa9\x3d\x55\xa4\x25\x8d\x55\x55\xc2\x5b\xba\x28\xdb\x89\x33\x92\xc8\x65\x4d\xf7\x56\xb6\xbf\xa4\x3c\xca\x32\x12\x8d\xcf\x30\x79\x1f\x89\x5c\x66\x0f\x4b\xe4\x65\x24\x4b\xa2\x90\x09\x77\x6c\x33\x6d\x1f\xb1\x0e\xc2\xb2\x8e\xbb\x78\xd4\x53\xe8\xc8\xf5\xe3\x76\x82\x5b\x67\x29\x5e\xc8\x5a\x80\x2e\x11\x0c\x17\xb2\x89\x68\x5c\x66\xbd\x14\xfe\x77\x2b\x84\xa0\x4d\x06\x94\x4a\x11\x39\x3e\xdb\x62\xff\xe5\xa4\xb5\x50\x21\x67\x8e\x29\x16\x20\xc8\xe6\xcc\x68\x3c\x61\xda\x4c\x80\xb0\xbd\x3d\x8f\x86\xed\x8c\xe9\x7c\xa1\x4f\x06\x0b\x24\x14\x77\xf0\x63\xc7\x1c\x59\x19\x82\xf6\x3a\xdf\x7d\xfb\xe1\xd4\x11\x67\xce\x76\x13\xbd\x7d\x80\x17\x3a\x83\x3d\x7b\x2f\x9e\x73\x07\x33\x76\xc0\xb1\x74\x76\xb0\x69\x08\x05\x25\x6a\xfb\x94\x86\xad\xa3\xdc\x86\xa7\x92\xa2\xd0\x81\x4a\x1d\x1f\x6d\x8f\x92\x09\x67\x86\x98\x5c\xf3\x7b\xac\xa7\x9a\x2f\xc4\xed\x18\x66\xe9\xd4\x1a\xce\xda\xaa\x8c\xb1\x4e\xdc\x41\xc1\x6d\xbb\xd7\xc9\xc9\xa3\x92\x88\xaa\xb6\x1f\x44\x56\xe6\xf5\x6d\x19\x73\xcb\x8a\x18\x8d\x48\xa2\xc8\xed\xeb\x4d\x74\xa8\x35\x09\xd3\xdd\x91\x75\x44\x6c\x42\xb7\xfd\x52\x49\x5a\x45\xa6\x90\x88\x4a\xb2\x83\x4d\xf4\xc8\xe4\x3a\xf3\x48\xd3\x16\x9d\x99\xb7\xb9\x06\x51\xf9\xce\xc5\xa3\xd2\x46\x28\xe1\xbc\xf1\x95\xfc\xde\x5f\x6d\x11\xa0\x17\xef\xf8\x8d\xaf\xec\xba\xf9\xe1\x99\x96\xe6\x1d\xac\xb7\x09\x80\x77\xa4\xa9\xcf\xd3\x2f\xe0\xeb\x26\xb3\xa7\xa7\xc6\xda\xf4\x3f\x2f\x5e\xc8\xce\x81\x50\xaf\xd4\x6b\x2a\xf0\x51\xdf\xc5\x9a\xf3\x8d\x82\x37\x12\xcf\x7b\x08\x0b\x60\xcf\xa9\xa8\xc5\xca\xd8\x4c\x95\xd3\x06\xb0\xfb\x62\x0c\x48\xa6\x4b\xe7\x5f\x2c\x27\xe7\x9a\x20\x12\x7a\x0c\xb9\xe8\xac\xd6\xa0\xfe\xc9\xae\xb8\x68\x88\xd8\xc2\x50\x21\x86\x79\x0a\x8c\x47\x7b\xd1\x02\x8f\x7d\xaf\x11\x13\xe1\xb1\xc8\x70\x79\xb0\x5b\x40\x65\x69\xe7\xee\x24\xb8\x10\x22\x0d\xa8\xea\x03\x9b\x7f\x93\x22\xea\x8b\x6f\xbe\xad\x06\xef\x52\x41\xcb\xb8\x10\x25\xbe\x40\x18\x3c\xa3\x11\x2d\x12\x06\x1e\x21\x2d\xd5\x00\xb5\x41\xec\x87\xc0\x0a\x87\xee\xbc\xca\xa1\x6c\x5e\x91\x31\x27\xb2\x31\x4d\xc6\x62\x58\xaa\xde\x24\xa0\x5c\x62\xcd\x75\xac\xf1\x74\x93\xbc\xd7\x38\xb7\x7a\x43\x75\x71\x63\x6d\xf8\x60\x0c\x7c\x91\x16\xa0\x51\x2b\xe5\x9c\x5d\xa3\xe9\xc3\x10\xd7\xfb\xe8\xc9\xde\x8d\x1b\x73\xaa\xd7\x05\xac\x38\x6b\xbe\xdc\xc8\x90\x20\x34\xd3\xe0\x1b\x5f\xeb\xbf\x42\x00\xcf\xee\x15\x68\x6b\x34\xa7\x3b\xeb\x7c\xd6\xf0\x2a\x67\xa6\xf9\xc6\x2b\x4b\x84\x15\x67\x93\xaf\x10\xdf\x39\xed\xef\x0f\x9d\x12\x44\x5a\x45\x15\x73\xb8\x38\x7c\xdf\xc6\x7d\x7d\xe7\x55\x6a\x19\x5c\xb4\x10\x38\x10\x23\x82\x33\xdd\x75\x8a\x53\xff\x59\x6c\xdc\xa2\x5d\x21\x2d\xad\x5a\x57\x4d\x98\x83\x12\xec\x75\xf6\x87\x67\x88\xca\x02\xda\x5c\x7f\xc2\x7f\x01\xd4\x48\xa6\x62\x98\xa5\x4a\x62\x28\x99\xd6\x69\xa3\xbd\x23\x8c\x92\xb3\xac\x26\xf5\x22\xf5\x6c\xfc\x64\x7a\x7c\x22\x53\x31\x05\x26\xfa\xd8\xcd\xf1\xc1\xa0\xab\x0c\x6d\xf3\x86\xa9\x8e\xfa\x58\x3a\xd1\x2b\xb8\x11\xdb\x7c\x37\x1e\xa7\xd2\x8f\xf3\x1e\x61\xe2\x87\x45\x1e\xc3\x54\x77\x2c\x69\x60\x87\xcf\x98\xec\x25\x4a\xbb\x7f\x9e\xee\x7a\x79\xee\xcd\x79\x1d\xd8\xfc\xb7\x5f\xfe\xab\x0b\x0b\x5e\xa5\x7f\xea\xe8\x39\x4d\xcb\x7e\x83\xdd\xf7\xeb\x3a\x5f\x36\x7f\xa3\x27\xd2\x17\xee\xc5\x66\x55\xdb\xf1\xe9\xee\xbf\xef\xdb\xfd\x7a\x6a\xc7\x89\x9b\x77\x7c\x9e\x8d\xfe\xa6\xaa\x25\xd5\xe7\x9e\x91\x66\x73\x22\xe9\xbf\x6f\x9e\x5a\xe9\x24\xa7\x26\xd0\x77\x89\x63\xf7\xee\x06\xd4\xa6\xf5\x4e\xcc\x95\xea\x9a\x88\xfd\xa7\x4b\x2b\x4f\x8f\x8b\x9e\x09\xce\x8e\x1e\x10\x06\x38\x7e\xf8\xba\xa1\xaa\xa1\xa7\x40\x73\x54\x31\xf1\x68\x80\xa8\x1e\x3c\x11\x33\x56\x88\x50\x49\x01\x6b\xa2\xbb\xdb\xaa\xf9\xa5\xba\xbe\xdb\x83\xfe\x04\x74\xd1\x9d\x4d\x42\x90\xc7\x03\x98\x58\x68\x02\x0d\xd0\x74\xbf\x39\xeb\x7d\x81\x0b\xdc\xe4\x9f\x88\xd2\x2a\x57\x83\x57\x34\xa2\x55\x55\x79\xe9\xf5\xae\x89\xcb\x7e\x3c\xd1\x43\x5a\xf8\x93\x50\xd3\xab\x94\xd2\xbc\xf7\x10\xe0\x9f\x84\x0a\x0b\xe5\x55\xc5\xe6\xbb\xaf\x3d\x34\x36\xfa\x10\xf3\x6d\x18\x1a\x08\x66\xea\x66\xfa\x46\x5d\x1c\x39\x48\x62\x85\x4c\x5d\x5d\x4f\xd3\x6a\x6a\xe2\xe0\xa4\x17\x2b\xa4\xb5\xc1\x91\x7c\x2a\x62\xe2\x06\xe1\xe8\x81\x94\xb6\x4e\x24\x6e\x72\xb1\xaa\xaa\x7c\x15\x55\x51\xea\x4f\x70\x15\x7d\xe7\x4d\xa7\x27\xe6\xfb\x44\x0a\xdb\xce\x96\x54\x3c\xd7\xad\x2f\xe8\x9a\x58\x34\x92\x77\x67\x91\x16\xb7\x54\x5a\x47\x0a\xaf\x80\xce\xe6\x78\x7d\x85\x88\x42\xf7\x8a\xa0\xff\x35\x5c\x78\xe1\xa9\xf8\xa2\x20\x2c\xeb\xce\xf3\xd4\x1a\xdf\x8f\x3e\xa7\x8a\x05\x0e\xea\x7e\x12\x31\xce\x2b\xba\xe2\xb6\x2e\x59\xa4\x20\x04\xe9\xc5\x43\x39\x50\x7e\xb7\xb1\xde\xb5\x1d\xaf\x2c\xae\xfb\xbb\x57\xab\xd4\x88\xa9\xd8\x7e\x4a\xc3\xd5\x2e\xb4\xc9\x28\x56\xd4\x7b\x7b\xb0\x86\x55\x0d\x8b\xc0\xa5\x10\x1f\x3d\xcb\x97\x9c\x5d\xc1\x7b\xaa\x69\xd1\xd2\xc4\x91\x38\xc7\x42\xf8\x02\x68\x61\xe4\x82\xf5\x30\x98\x07\x16\xb0\xb0\x40\xf3\x0e\x87\x23\x23\xeb\xe0\x0f\x3c\xc2\x71\xda\xf1\xaa\xe3\x5b\xd2\xf5\xe7\x47\x8e\x3f\x77\xfc\x7b\xc7\xfb\x8e\xff\xee\xf8\x5b\xe6\x94\x4e\x78\x03\x32\x4b\x61\x8a\x55\xd8\x11\x76\x9a\x5d\x62\xf7\xb3\x27\xd9\xb3\x6c\x8d\x7d\x93\xfd\xb6\xe4\xdb\xff\x88\xfd\x6b\xe9\x8a\xf7\x33\xf6\xff\x38\x9d\x4e\xaf\x33\xe8\x4c\x39\x73\xce\x92\xf3\x80\xb3\x26\x9d\xaf\xe7\x9c\x0f\x3a\x9f\x74\xae\x3a\x1c\x0c\xc1\x8e\x0d\x5e\x54\x92\x9e\xa2\x0a\x82\x52\x2e\xe3\x67\x9d\xd1\x61\xd0\x33\xc4\x94\x60\x36\x6f\xb5\xfd\xb2\x9c\x79\x14\x8f\x5b\x89\xda\x89\xab\x89\x5c\x3e\x6b\x9b\x26\x14\x12\x7d\x59\xc9\xf2\xcc\x86\x25\x5a\xb0\x4a\x9e\x75\xbc\x5a\xc5\x2a\x14\x94\xfa\x44\x29\x70\x94\x9c\xf8\x68\x3c\x97\xc8\x17\xf2\xd3\x2c\x9c\x29\x48\xb6\xbe\xec\xf1\x2d\x88\x65\xdd\x9d\x3d\x0a\xb3\xfe\x13\x82\x9e\xa0\xc7\x25\x43\x16\x12\x52\xe2\x17\xde\xca\xea\x57\xc3\xc1\x68\xa2\x43\xed\x92\x34\x76\x9b\x1c\x26\x83\xf0\x67\x98\x3c\xb0\xf3\x39\x3b\x13\x20\x9c\x35\x13\x85\xa8\x5c\x29\x65\x3b\x11\xa8\xb9\x44\xdc\xbd\x05\x36\x3c\x1d\xee\xdf\x14\x8b\xb8\x25\xb5\x2c\x94\xdd\x8a\x9c\x9b\x66\xb9\x78\x54\x29\x28\xc1\x70\xce\xe6\x6f\xc5\x2d\x40\x16\x94\x2b\xba\x82\xe4\x71\x66\x47\x58\x2e\x92\xf0\x33\xdb\x60\xcf\x7a\x80\x44\x21\x11\xb6\x97\x57\x8a\x24\xf3\xd9\x76\xd2\xb7\xab\x62\xd0\xce\x3e\x8a\x4f\x39\xa3\x6e\x5b\x04\x94\x95\x7c\x31\x25\x5b\x08\x77\xd2\xad\x3b\xfa\xe9\x91\xce\x4a\xcb\x82\x50\xca\x98\x14\x34\x6f\xc5\xe0\xd9\x23\x47\x09\x23\xad\xda\xae\x86\x33\xb2\x7a\xb9\x6d\xaa\xa3\xf5\x42\x75\xfc\x01\x6c\x42\xa2\x74\x5c\x8d\x4a\x17\x22\x77\xc1\x76\xe3\x8e\x4c\xb1\x9c\x99\x95\xfb\xb1\x42\x67\xf3\xd7\x61\x23\xe6\x25\xe9\xdf\xfa\x7d\xeb\x36\xd6\x3b\x9e\xe9\x70\xdc\x3c\xf6\xe8\x32\x11\x55\xec\x2a\x29\x0d\xb8\x6f\x47\x32\x74\x72\x58\xb7\x82\x54\xed\x3f\xb3\x36\xd5\xed\xb6\x7d\x93\xac\xf5\x19\xab\x57\x89\x2a\x51\x3b\x8a\x35\x17\x4f\x38\xd7\x99\x91\x4a\x7d\xaf\x3a\x31\x70\xe8\x1f\x18\x9f\xdf\x25\x54\x86\xa3\x87\xc5\x9c\x6e\xd5\x91\x0f\x16\x75\x95\xf8\xa7\x7e\xc5\xfa\x59\xaf\xaf\xc6\xaa\x43\x9b\x1b\x73\x66\xf2\xc1\xeb\x91\x8b\x29\xb5\x3b\xf0\x54\x8f\x4a\x18\x18\x3e\x7e\xc7\x3c\x80\xcd\xb7\x65\xe1\x19\xcd\xce\x7a\x5d\xc1\xa8\xd6\xfe\x01\x37\xee\xfc\xce\xc2\xd8\xa4\x10\xc0\xf2\xba\x5e\x52\xab\x18\x1c\x1d\xd8\x57\x5e\x7f\x6e\x2f\x07\x8a\x43\x5f\xf8\xa1\x30\xe0\x1b\xf5\xbf\x94\x4a\xae\xcc\x95\x45\xba\xfa\x8b\xcd\x0f\x66\x35\x0e\x97\x41\x04\xe2\x9e\xc8\xee\x38\xea\x8d\x25\x52\x29\x70\x01\x3c\x9e\xe1\x54\x36\xb4\xe1\xe3\xda\xa6\xd9\x52\xb5\x96\x96\x9a\x55\xd5\xd9\xae\xbe\xc5\x3a\x91\xda\x82\xca\xde\x11\xe4\x55\x36\xdf\x1e\x38\xa5\x35\xd9\xe6\x46\x8b\xd3\xf8\x24\xa9\xa9\x98\x5a\xa5\x59\x95\xb3\x66\xd9\xc8\x06\x57\x4c\x03\x28\x04\x31\x9b\x53\x68\x3c\x80\x14\x38\x34\xce\x45\xa6\x6b\x53\x27\x9e\xd4\x4b\x14\xde\x59\xe3\x4d\x7d\xb4\x50\x21\xd2\x55\xf6\x46\x9d\x57\xa1\x96\xcb\x04\x4e\x5c\xf0\x4a\x6b\xe4\xa4\xe8\xbd\x93\xd2\xe9\x14\x80\x60\xe0\x40\x94\x03\x9b\x4b\xf9\x38\xa7\x89\x8c\xb1\x3d\xa3\x36\xde\x26\xa1\xaa\x44\xb3\x84\x03\x09\x82\x6f\x47\x0a\xf3\x20\xe5\x1c\xb5\x90\x18\x63\x6f\x1d\x89\xd3\xf8\x34\xfd\xb4\x7b\x3a\xd9\xbc\x55\x55\xd3\x7a\xc5\xb5\x97\x22\x79\xbd\x61\xaa\x98\x1c\xdf\x5c\x25\x6e\x92\xd8\x3f\x65\x3d\x77\x6a\x6a\x22\xe8\x6f\x58\xa7\x32\x27\x4f\x1f\xd8\x5b\xbc\x77\x3a\x46\xc2\x7b\x85\x04\x87\x86\x9a\x7f\x27\x5e\xe1\xbe\xc3\x06\x44\x34\x37\x57\x8c\x11\x78\x49\x10\x79\xf6\x71\x95\xc4\xc8\x49\x55\xaf\x94\x0d\xbe\xbf\x9f\xb0\xf1\x96\x9a\xe6\xe3\xec\x2f\x77\x14\x44\x55\xf0\x5a\x76\x9b\x36\x5a\x50\x37\x17\x4b\xb1\x83\x5d\xc9\xd1\x69\x7e\x20\x90\x3c\x30\xa8\x89\x4c\x5e\xbc\x9d\xd2\x62\x14\x0f\xe9\xf8\x1a\x26\x32\xc4\xe9\x50\x3f\x50\x9c\x89\x82\x0a\xbd\x1e\x11\x0c\x97\xd7\xaa\xbb\xf2\x22\xe8\x57\xdb\x7a\xd1\x9c\x2f\xd1\xae\x3c\x00\xad\x34\x33\xa2\x1b\x16\x7a\xaf\x5d\x38\x74\x5f\x22\x18\x10\xa8\xbb\x1e\x0f\xee\xe7\xad\xbf\x7e\xfe\xee\x13\x73\x91\x3e\xce\x66\x73\x3e\xb7\x0f\xd8\x4c\x21\x39\x17\xc3\xbf\x7d\xec\xdd\x54\x69\xa4\x57\xc0\xe5\x2e\x9a\xb3\x30\x01\x1e\x03\xbc\x85\xd4\x77\x0f\x9b\x7a\x59\xd7\x38\x90\xed\xe6\x2a\xe7\x78\x0d\xeb\x06\x2f\xf1\xf9\x53\xa1\xfe\x80\x2e\x46\xc6\xb2\x9b\x7f\xc5\x59\x0d\xc4\x55\x08\x08\xc1\x1f\x1c\xd6\x87\x4e\x50\xe4\xeb\x04\xd5\xfb\x05\x7e\xd7\x4e\xaa\x85\x1e\xd4\x0c\xdc\x52\x41\x2f\x05\x00\xfa\x1a\xc0\xd7\x34\x71\xb3\xcf\xa9\xde\xe0\xe4\xf1\x10\x34\xca\xdf\x8b\x35\xaf\xd7\xf7\x2d\x83\x76\x9d\x67\xd3\xa8\x2c\xf0\xef\x69\xbc\x3d\x4f\x8b\xc0\x7d\x01\x3e\x8b\x59\xdb\x81\x40\xd0\xe0\x36\x6a\xe2\xbe\x84\x6e\x22\x70\x98\x02\xc7\xb0\xc2\xd7\x29\xb6\x7a\xd3\x00\xa9\x6b\xe2\x06\xb0\xac\x8a\x8a\x3a\x07\x22\x52\xfd\xdd\x7c\xfc\x90\xb6\xff\x02\x09\x72\x7f\x21\xc9\xef\x1a\x93\x21\x85\x07\x0e\x09\x68\xab\x94\x6c\x52\x33\xb9\xf2\x2e\x87\x01\x5a\x87\xe0\xb3\x75\x52\x2e\x14\xd5\xb7\xc0\xbe\x60\xdc\xfc\xd1\x0f\xf9\xea\xf8\xfd\xdc\x2c\x53\x1b\xea\x2c\x47\xb9\x84\x58\x89\xe6\xc2\xe7\x08\x18\x3f\xfa\xa3\x34\x9a\xb4\xca\x41\x50\x39\x28\xc5\x47\xba\x91\x22\x14\x0d\x32\xf0\x3a\xd8\x3d\xe1\xee\xd4\x92\x5c\x4d\x97\xa0\xc1\x28\x62\xa2\xc7\xdf\x3d\x1f\xea\x52\x82\xb3\xfa\x95\x21\xa2\x05\x15\xb4\xa8\x12\x75\x3d\x81\xde\xe8\x12\x70\xb5\x0f\x84\xc4\x28\xaa\x84\x93\x09\xd0\x9c\xd0\x4e\x07\x47\x4f\xcb\x81\x21\xc0\x8b\x26\xee\xf3\x01\x4b\xc8\x1c\x01\xe8\x64\x80\x12\xe3\x1a\x80\x9a\x26\xac\x97\xa6\x4d\x38\xdf\xe5\x70\xd8\xfe\xd8\x58\x72\xbf\xe3\xd8\xe3\x78\xca\xf1\x25\xc7\xaf\x75\x54\x9f\xff\xd5\xf1\x3f\x1d\x1b\x0c\xd2\x11\xa3\x9f\x8d\xb2\x71\x56\x64\xfb\xd8\x51\xd6\x60\x57\xa5\x4b\xec\xb3\xec\x33\xec\xf3\xec\x2b\xec\x1b\xec\xdb\xec\x4d\xf6\xfb\xec\x6d\x87\x83\x49\x61\x79\x67\x56\x38\x64\x41\x88\x84\x32\xa6\xc8\x41\x61\x28\xb8\xe5\x9a\x1d\x91\xd2\x03\x3f\x93\xae\x75\x91\x84\x39\xc8\x0a\x56\x7d\xca\x99\x85\x7c\x58\x5a\xde\x79\xec\xf0\x3b\x97\x2a\x03\x59\xb3\x16\xa0\xcb\x14\xf2\xb2\x4e\xca\xcd\xd0\x14\x53\x22\xd6\x2f\x14\xec\xc8\x20\xab\xd0\xc5\x13\x91\x44\x24\xe7\x56\x15\x99\x21\xd0\xb1\x28\x8d\xdf\x4e\x03\x8a\xdb\x71\x3e\x36\xce\x90\x37\xb0\x55\x01\xe6\xff\x2e\x16\x90\x45\xc2\xde\xc3\x65\xc3\xb6\xda\xd4\xba\x9c\xb1\x8f\xad\x62\xc3\xd9\x84\x19\xb5\xcb\x4a\x6e\x2b\xd5\xc0\x82\x5c\x7e\x66\xa1\x44\x7b\x2f\x65\x76\x6c\x4d\xb7\x32\x23\x94\x8c\x4c\x4d\xf0\x33\x5b\x14\xe0\x67\x1d\xf5\xd8\x16\xbc\x0b\xe7\x67\x58\x22\xea\x96\x95\x36\x62\x3b\xf3\x49\x9c\x24\x0f\xfb\x42\x36\x1e\x55\xdc\x99\x4e\x16\x44\x5e\xb2\x2c\xec\x2d\x9d\x05\x90\x65\x49\xb6\x69\xfc\x92\x89\xd2\x21\xa4\xd8\x66\x82\x36\x9c\xb4\xee\xdd\xe6\xaa\x6c\xb9\x72\x17\x72\xf1\xdb\xd2\x58\x7b\xd1\x65\x8f\x54\xa3\x5b\x79\xae\x51\x67\x1d\xe0\x65\x35\xb6\xb2\xf3\x90\xef\x4c\xc9\x48\xa7\xd5\xcd\x9f\x8a\xe4\x58\x80\xf0\x4a\x31\xb8\x3f\xd9\x4e\x7d\x77\x5c\x0c\x0d\x0a\xbd\x32\x79\x37\x25\xd7\x22\x9e\x66\xc3\x6a\x93\x5f\xdf\xff\x2d\xf5\xfd\xc4\xb6\x70\x10\xa8\x55\x75\x43\xdf\x99\x25\x0c\x6c\xdf\x97\xe9\x1b\x58\x4b\xdd\x35\x44\xed\xf6\x7c\x1a\x88\x75\x5f\xa9\xa6\xde\xe4\xa3\x51\x5d\x6b\x27\x6b\x55\xd6\x4c\xcf\xa6\xf9\x0a\xe1\x5a\x3f\x46\xaf\x11\xb6\x5f\x02\xa8\xef\x79\xcc\x96\x48\xa4\x37\x6e\x46\x2f\xd0\x02\x2d\x68\xfd\xfb\xf9\x78\x41\x08\x0b\x14\xe9\x55\x42\xa3\x37\x8c\x22\x15\x0d\xfd\x62\xdf\x33\x7b\xe6\x89\xbd\x85\x74\x8d\x66\xa6\xe6\xbb\x4e\x89\x86\x40\xec\x70\x82\x2f\x6c\x36\xee\x1c\xa3\x62\x19\xd2\x46\x8b\xaf\x09\xcc\xd1\xac\x28\x72\xaa\x42\x08\x9d\xb5\x11\xba\x3a\x07\x8d\xd6\x28\x38\x35\xb5\x83\x96\x84\xdf\x7d\x71\x22\xbd\x00\xac\xa8\x4b\xa5\x65\x6c\xfe\x74\xce\xa0\x61\x67\xd7\x13\x42\x14\xd3\xb3\xa2\x9d\xaa\xdc\x31\xa1\x1a\x57\x86\xf4\xbf\x77\xf4\x5e\xb3\x20\xda\x82\x85\xd7\xee\xed\xd2\x52\x75\xc4\x23\x7c\x41\x88\x27\x22\x58\xa5\x81\x7b\x35\xac\x90\xff\x61\x8e\x46\x7f\x00\x3d\x3d\xa5\x12\x96\xf9\x02\xd7\xb0\x0c\x8c\x9d\xd6\xa8\x52\xe4\xf7\xe6\xf7\xef\xe4\xcb\x88\xdd\x17\xc6\x83\xf9\x65\x2c\x50\x71\x3e\x06\xe5\x61\xb8\xdf\x01\x38\xfa\xfa\xfc\x33\xa2\xb8\x2b\x62\x1c\x89\x00\xd6\xd1\xdb\x4e\xf7\x85\x92\x03\x13\x13\xc7\x0f\x4f\x91\xc0\x72\xe8\xfa\xeb\xc7\x46\xbe\x56\x1a\x66\x1e\xf6\xda\x82\x55\xb3\x1b\xff\xf6\x50\x6f\x77\x4f\xa8\x16\xbc\x52\x54\xb5\xca\xe7\x37\xff\x74\xef\xbf\xcc\x1f\xe1\x6a\x43\x88\xb7\x3f\x10\xbc\x99\xa4\x6c\x37\xb4\xba\x06\xbc\xd9\x4c\xa5\xf6\x0c\x8d\x85\x35\x6a\x07\x2e\x2c\x25\x81\xaf\x81\x6e\x81\xb2\x8f\x82\xc6\xaf\x41\x8f\xbc\x8c\x2a\x6a\x88\x4c\xd4\xcc\x59\xe2\x6b\x44\xab\xc0\xb6\x43\xa0\xa1\xb3\xa0\x79\xc2\x12\x5a\xd6\xc1\x82\x3a\x55\x62\x58\x31\xba\x47\x38\x3f\x70\xc8\x42\x94\xd4\x7f\x67\x9b\x83\xee\x1a\xc5\x6a\x85\x1e\x1f\xd4\x83\x85\x1a\x4a\xe2\x06\xf8\x2d\x53\x6d\x91\x72\x77\x5a\x2d\x5a\xf0\x27\xa8\x40\x9f\xd7\x16\xb4\xa1\x43\x3c\xa5\x2d\x11\xf5\xec\xda\x1e\xd7\x9f\x64\x24\xda\x6a\xfa\x01\x3f\x96\xc8\xfb\x98\xcf\x4b\xcb\x62\x49\xe7\xab\xdc\x02\x45\xb4\xd8\xe3\x21\xb4\x35\xac\x62\x65\xd9\x58\xa1\x45\xa8\x6b\xb4\x04\x2a\xd5\x6f\xa8\xea\x12\x0f\x85\x56\x2a\x2a\x06\x1e\xd1\x68\xdb\xd9\xa2\x58\x13\xa3\x57\x92\xa0\x81\xe3\x31\x88\x58\x89\x6b\xab\x50\xb1\xc8\xd3\xea\x32\x28\x7f\x3c\xa9\x1d\x9e\xe2\x78\x3a\x4b\xc7\x26\xc1\x97\x0c\x2c\x83\x16\x05\x2d\xd3\xb2\xc0\x32\x82\xf7\x3b\x1c\x76\x2e\x0e\x96\x3d\x43\x8e\xa6\xe3\x0f\x1c\xff\x87\x44\x03\xff\xcd\xf1\x3f\x1c\x7f\xc7\x14\xd6\xc3\xc2\x6c\x84\x25\x58\x86\xe5\x59\x99\x1d\x66\x77\xb1\x87\x65\x86\xe7\x27\xd9\x17\xd8\x6f\xb3\xef\xb3\x3f\x64\x3f\x62\xff\x81\xfd\x57\xf6\x37\xec\x43\xa7\x53\x7a\x83\x86\x9c\xc3\xce\x6d\x4e\xd3\xb9\xc7\x79\xc2\x79\xd6\x79\xd1\x39\xe7\xbc\x2a\x59\x0b\xcf\x3a\x3f\xe5\xfc\x8c\xf3\xf3\xce\x2f\x3b\xbf\xe1\xfc\x2d\xe7\x77\xe4\xa4\x4c\xf6\xfb\x51\x8f\x3c\x02\x3b\x5b\x0e\x25\xa8\x48\x8b\xe4\x7c\x21\x53\xc8\x49\xf5\x57\xde\x3e\x4e\xd5\x2d\x5f\x6d\x0b\x4c\x28\xaa\xbd\x2d\x97\xb9\xd2\x71\x99\x23\x6d\x9b\x56\xca\xe8\xb5\x70\x50\x8d\x76\xa8\x0c\x1d\xb7\xa2\x60\x21\x9b\x29\x84\x25\x7d\xae\xd0\xd9\xab\xe4\x4c\x39\x66\x8b\x04\x95\x50\xb6\x90\x2d\x48\x59\x91\x22\xd9\x5d\x72\x89\x71\xdb\x99\xdb\xde\xfa\x4c\xb3\x4c\x4e\x9e\x3e\x5b\x1e\x5f\x8a\x53\x89\x28\x4c\xed\x90\xc2\x22\x9d\xee\x38\x27\xfd\xb5\x82\x72\x4d\x61\x3d\x78\x64\x8a\xd9\xa6\x5a\xb9\x88\xb4\x07\xb1\x20\x84\x0c\x7d\x96\x0b\x8c\x44\x21\x2c\x19\x6e\x21\x5b\xc9\xd3\x91\x70\xb8\x65\xa3\x6c\xf5\xbb\xca\x96\x87\x74\x36\x2f\x8f\x45\x4f\x58\x06\x54\xab\x92\xa4\x30\xc5\xdc\x5b\xda\x7b\xf7\x6d\x95\xca\x96\xf4\x3e\x92\xd8\xda\xd1\x48\xed\x8a\x54\xdb\x4e\x75\x24\x52\xd9\x2d\x95\x88\xcc\xbb\x76\x6f\x05\xa2\xa9\x9d\xc5\x8c\x5c\x94\x84\xb6\xee\x4f\x9e\xdf\xf2\xd0\x96\x87\xb9\x6d\x1f\x9e\x1b\x93\x03\xab\x48\x22\x57\x88\xdb\xee\x60\xe6\x58\xb0\xc3\x2d\xdc\x12\x3a\xe7\xcc\x68\x64\x4b\x05\x94\x93\xa8\x48\x3e\x05\xa5\x10\xce\x65\x4d\x7b\xb1\xb4\x15\x8a\x73\x7b\xd1\xe4\x56\xc2\xd9\x9c\xb4\xf9\xb4\xcf\xed\x8e\xaa\x2c\x9c\x2d\x98\xd1\x31\x1b\x46\x48\x26\x9d\xcc\xa3\x8e\x5b\xd7\xd3\x21\x0c\xda\x59\xe0\xb2\x54\x6c\x69\xae\xec\x59\x9b\xcc\xd7\x2e\x74\x84\xce\xb7\xc9\x0c\x1d\x9c\xd3\x19\x13\x9a\x72\xa7\x56\x50\xd4\x0e\xea\xb1\x6b\x64\xd6\x7e\x8d\x24\x5e\x93\xc3\xbc\x0e\x2a\x72\x7e\xaf\xd5\x88\x3c\xbb\xc0\x8b\x83\xb9\x3d\x8f\x06\x13\x9e\x9e\x23\xf9\xe7\x66\x38\x41\x45\x57\x0f\xff\x8d\x3e\xd2\x1a\xc5\x81\xbe\x9e\x4b\x55\xa1\xfd\x5f\x81\x36\x17\x98\x6b\xd6\xd2\xde\x43\x44\xa2\xd2\xd4\xf0\xa0\x67\xe1\x52\x4f\x39\xcd\x49\xf7\xf4\x79\xc3\xe5\xb2\xeb\xf1\x7f\xf0\xd8\xc6\xdb\x92\x86\x07\x8e\x6d\xa7\x1b\xcd\x12\xf8\xb3\xa7\x78\x6e\x92\xab\x66\x79\xd4\xcf\x09\x58\x6f\x9b\x7c\x11\xdd\x7b\x8a\xaa\x98\x72\xd7\x0b\x5f\x94\xf9\x8c\x18\xd9\x69\x75\xcf\x95\xf8\xf1\x6a\xcb\x30\x76\xed\x32\x34\xad\x25\x59\x7c\x26\x52\xcd\xaf\xbd\x57\xe9\x3b\xff\x1e\xf7\xf4\xb8\x5e\x37\xd4\x2a\xf4\xb4\x30\x36\x97\x70\xb0\x07\xea\x4c\xa0\xd2\x10\xa6\x8e\xfa\x2c\xfc\x41\xea\xf7\xa5\xeb\x91\x2f\xe9\x82\x55\xdb\x62\x64\xe3\xae\xc1\xfe\x22\x89\x59\xce\xf9\x28\xeb\x0d\xf5\x80\x39\x44\xba\x88\xf8\xf1\x8d\x5b\xbe\x03\x31\x6a\xc3\xd9\xc0\xc5\x10\x2d\x6e\x2c\x5f\x09\xa2\xab\x4b\x37\x53\x24\x5e\xa5\xb7\x96\xc0\x83\x27\x74\xe7\x0a\xe5\xf6\x03\x93\x33\x1b\xb5\x93\x23\x04\xef\x5d\x00\x35\x75\xde\x1d\xe8\xbb\x48\x80\xd7\xf9\xc9\x7c\x86\xf4\x24\xb0\xab\x6b\xc4\xbb\xc0\x4d\xab\x56\x0e\xec\x33\x3d\x79\x6c\xf3\xd7\x69\xa3\xb6\x48\xfe\xcb\xd2\xca\x5f\x13\x46\xa3\x2b\xb2\xc8\x41\xbe\xcb\x20\xdc\x02\x68\x7c\xcf\xa0\x57\x5b\x1c\xe8\x03\xe0\xac\x95\x55\xa8\x25\xf2\x78\x92\x06\x3e\x7a\xcb\x6c\xc5\x8c\x65\x02\x8e\xef\x06\x0f\x4d\x38\xd7\xeb\x84\x3a\x36\xdf\xe8\xdb\x0e\x68\x3a\x08\x7a\x12\x7a\xd3\x73\xc7\x58\x82\x35\xf7\x85\x28\x38\x4d\xe2\x8c\xbf\xb5\xf9\x0b\x00\x3f\xa7\xf6\x50\xa0\xa4\x5a\x07\x3b\x6f\x82\xd6\x20\xc4\x06\xa7\x18\x52\xce\x86\x58\xe6\xa4\xa2\xef\xc8\xb6\xa9\x05\x70\xef\x3d\xe0\x0b\x83\xa3\xfb\x76\xa1\x9e\x38\xc6\x31\x70\x8a\x4a\x73\x5c\x5b\xc0\xc6\x3b\x83\x33\xe8\x62\xbf\x75\xcc\x27\xe6\xcc\x7d\x03\x6a\x43\x35\xa3\x3b\x54\x6a\xf1\xa2\x51\xe6\x4d\x88\xcd\x5f\x98\x1a\x2a\x1f\x10\x50\xaa\xa9\x87\x7a\x5f\xa9\x60\x28\x91\x44\x49\x50\x74\x3c\x9d\xd2\x75\xb5\xeb\x22\xcd\x17\xc5\x36\xcf\xd0\xcc\x8b\xe7\x3e\xf7\xef\x03\xdf\xdb\x35\x98\x5f\xff\xfe\x64\x23\x1e\x7e\x39\xec\x1b\x0e\x8c\x60\x76\x67\x74\xf6\x49\x97\xcb\xd5\x75\x30\x70\x6d\xdf\x37\x06\x7e\x36\x76\x38\xee\xed\x12\x8a\xf4\x7f\x11\xbe\xd9\x53\xfb\x33\x7f\xf1\xe5\xed\xf3\x8f\xd5\x3c\xe5\x07\x4f\x86\xaf\xdd\xed\xdf\xd8\x07\x0c\xc2\x75\x58\x1d\x0e\xcc\x01\xef\x1e\x6a\xa9\x1e\x37\x26\xa0\x8f\x05\xb6\x7d\x61\xe2\xf0\xf8\xa7\x65\x0c\x9d\xbb\xcb\xe7\x6a\xf9\x5a\x70\xe5\x7e\x2d\x31\x30\xe8\x52\xfc\x38\x96\x7e\xd4\xff\xe2\xfe\x7f\x72\xf7\x9d\xf7\xf6\x93\x3b\x17\x5f\xa8\xf9\x81\xb1\x3b\x70\xe4\xea\x8b\x46\xd9\x79\x7e\xf3\xbf\xac\x37\xd9\x66\xb4\xfb\x0e\xe5\xd8\x60\xd8\x8f\x6f\x10\xf0\xd9\x10\xde\x84\x72\xe9\x04\xa2\x6f\xb9\xb0\x5d\x71\xed\xf7\x6c\x57\xbe\x31\xa8\xe4\x31\xda\xcb\xe9\x79\x60\x4f\x1f\xa2\x7b\xe7\x15\xf5\x87\x00\x02\x7e\x1f\x9a\x01\x65\x2a\xc2\x79\xf5\xc0\x84\x6b\x29\xf3\xf2\xb8\xf8\x0b\x31\xe8\x7a\xa9\x97\x26\x3e\x33\xfc\x9d\xb0\x4b\xbb\x76\x92\xfc\x20\x84\x03\xbe\xef\x20\x20\x5e\x8a\x92\x8f\x4e\x1f\x52\x27\xef\x49\xac\xf7\xfb\x88\x7d\x0e\xea\x67\x76\x1e\xe0\xbf\x36\xe0\xa3\xf3\x7b\x88\x02\x07\x5d\xae\x39\x1f\xf7\xbd\x4c\x13\x50\x9f\x42\xe9\x82\x0b\xa3\xd3\x4d\xeb\x8b\x73\xf8\x4d\xee\xfb\x12\x94\xf0\x77\x70\xa6\x7e\xed\xba\xf0\x7e\x1f\x01\x78\xfe\x7f\xf0\xa7\xbe\x1f\x8e\x8c\xc4\x87\xee\x9b\x72\x3d\x3f\x18\x7e\x79\xc2\x07\x3f\xf0\x67\x33\xc7\xfc\x23\x2d\xf8\xfc\xdb\x5d\x19\x0c\xba\x72\x47\x72\x0f\x29\x01\xc1\xbf\x18\xc6\xd5\xfd\x88\x1f\x3b\xc9\xef\x0f\x50\x4b\xf1\xed\x98\x0c\x1c\x06\xb0\x8b\x32\x84\xf1\x23\x94\xda\x9f\xa1\xcb\x3d\x83\xbd\x67\x77\x2b\xd7\x68\xe4\xfe\x41\x1f\xfc\x3e\x4c\x2c\x6c\x9f\x3c\x30\xe9\x7f\x91\x3c\x8f\x92\xf6\x4a\x93\x3f\xa9\x0d\xa0\x2b\x76\x38\xfa\x39\xea\xed\xb9\x3f\x7f\x18\xa1\xfb\x5c\xf7\x28\xcf\x45\x5b\x33\xb3\xfb\x8a\xbe\xed\x27\xb7\x07\xaf\x06\x9e\x1c\x41\x62\x3c\x96\xf2\x5d\x67\xfc\xfa\x30\x9d\x55\xc5\xd5\x01\x4c\x6f\xa3\xfb\x03\xfd\xc7\x5d\x0b\x1e\x27\x4e\x78\x43\x07\x41\x8a\x1f\x6a\xcd\x8f\x2b\x50\xd0\x54\x72\x06\x70\x47\xd7\x3c\x59\xe0\x6d\x8e\xa3\x46\xbe\x92\xc3\x31\x2e\xeb\xf5\x47\xee\x77\x1d\x27\xa4\x4b\xcd\x1f\x38\xfe\xc4\xf1\x67\x8e\x9f\x3a\xfe\xab\xe3\x7f\x30\x37\xf3\x33\x8d\xe9\x2c\xc2\x92\x6c\x87\xac\xd9\x75\xd6\x64\xb3\xec\x3a\x7b\x8a\xad\xb1\x2f\xb1\xaf\x4b\x9c\xf2\x43\xf6\xef\xd9\x7f\x62\x1f\x39\xdd\xce\x1e\x67\xd8\x39\xe4\x8c\x3b\x67\x9c\x87\x9d\x27\x9d\xe7\xb6\xaa\x72\x38\xa2\x78\x5c\xc1\x88\x5c\x51\x45\xb7\xf2\xb6\xed\xf4\xb2\x8e\xbb\x77\x54\x32\x0a\x6d\xc4\x12\xc8\x07\x24\x0a\xb1\x2a\x65\x30\x22\x33\xb8\x0b\xa1\x70\x26\x97\xdf\xc3\xf2\x2e\x59\xa8\x3d\x8a\x6d\xb3\x61\x26\x3a\xc8\x46\xb9\x5d\x9f\xc3\x9e\xce\xa6\x4c\xdd\xf2\xdc\x80\x55\x7e\xc2\xf2\x7e\x94\x70\x36\x13\xec\x30\x21\x12\xf9\x42\x22\x93\x0b\xf4\xe5\xcc\xa8\x5c\x9b\xb1\x0e\xff\x2f\x18\x56\xe4\x16\xe8\x36\x43\xdb\x2d\xbd\x5a\xe3\x1d\x8e\x41\xc1\x2e\x2b\x72\x35\x65\xf5\xf6\x72\x11\x24\x13\x45\x23\x9d\x6c\xbb\xc4\xa8\x22\xad\xb9\x3b\xb4\xec\x4c\x61\xab\x42\x5b\xe8\xc8\xad\x74\xf6\x46\xee\x60\x36\x67\x23\x23\x09\x32\xb6\x78\x87\x05\xf9\x17\x12\xe2\x74\x38\x04\xd2\xff\x66\x4b\xf0\x9c\xeb\x98\x90\x27\x22\x6e\xe9\x7c\x1e\x8d\x58\x4d\xcc\x96\x9f\xa0\x7d\x9b\x8c\x1c\xd3\xa9\x12\xb5\x59\xd5\xcf\x86\x20\x61\x25\x94\x55\xb3\x32\xfe\x2e\x3e\xc9\x72\x4a\xd4\x26\x82\x5b\x0d\x81\x27\xba\x25\x0c\x75\xdb\xe6\x86\x6e\x55\xc6\x96\x4a\xd6\xbc\xf5\x26\x64\x0a\x36\xf5\xfe\x63\xf5\x6a\xc8\x5e\x49\x49\x5a\x86\x14\x2c\xdb\xd6\x28\x1d\x3a\x87\x1d\x7a\x1a\xb7\x29\x1e\xb9\x0e\xc9\x6f\xab\xa8\xda\x32\x55\x3b\x87\xdc\x6d\xa7\xa2\x26\xa2\xee\x44\xe7\x15\xb2\x2d\x18\x25\x02\xcd\x25\xec\x38\x25\xe9\x70\x6a\xda\x7a\x63\xeb\xd5\x52\xed\xdf\x81\xba\x33\x3a\x76\x42\x45\xdf\x44\x59\xf7\x75\x43\x4b\x65\xcf\x1c\xda\x3b\x38\x26\xb4\xd9\x6a\xac\xe1\xf5\xf9\xc6\x0b\x33\xb1\xec\x4c\x03\x30\x77\xed\xf3\x7b\x87\x1f\x11\xfd\x53\xf7\x8f\xfa\xbc\xbe\x20\x40\xe5\xbb\xfd\x95\x58\x3a\x96\xf9\x03\x70\x15\xab\x03\x2f\xd7\x52\x66\x53\x13\xfc\x63\x7e\x20\x27\x94\x67\x39\x25\xf5\x3b\x2f\x1b\x7a\xcf\x3e\x26\x0c\x95\x44\x7f\x40\x12\xc5\x38\x1d\xdc\x1e\xf2\x00\xc4\x49\xab\xcd\x55\x52\xa9\xec\x50\x8a\x55\x66\xa2\xad\x0d\x13\x40\xef\x9d\x40\x9b\xa8\x6f\x1f\x9d\x1a\x70\xbe\x4a\x03\xe7\xbd\xae\xf1\x69\xa1\x61\x60\x7b\x9a\x16\x37\x9a\xd4\xa6\x36\xe8\xbc\x87\x32\xce\x83\x91\x23\x2a\x75\xed\x4a\x7b\x37\x2e\x60\x60\x9f\x8e\x45\xe7\x0d\x5a\x00\x68\x56\xe0\x5c\x18\xbe\xee\x9d\x1b\x63\x5a\xc9\xe0\xa3\xa7\x9d\x0b\x62\x60\xc2\xec\x76\x8d\x9c\xdc\x58\x22\xee\xf1\x80\x1b\x28\xa9\x55\x67\x9b\x1b\x75\x10\x5f\xda\x58\x53\xb9\xb3\x49\xa1\x83\xbd\x3e\xc2\xa2\x2a\x68\x49\x00\xcb\x04\xd3\xe4\xc6\xea\xf9\xed\x84\x35\xbe\xf1\x51\x1d\x7d\xce\x26\x51\x05\xea\xde\x49\x0e\x74\x5d\x02\x25\x76\xa2\xcb\x99\x9b\x6c\xd6\x04\xea\x31\x5d\x0f\x8c\x21\x31\x6a\x60\x22\xa2\x97\xc0\x4d\x0b\x9b\x1a\x60\x15\xb4\xd2\xb4\xbe\xf1\x9a\xcb\x9d\xd9\x0d\x9a\xd8\x0d\x67\xc5\x82\x95\xc9\xf9\x8d\x57\x92\x77\x0c\x10\x9f\xe7\x5d\x19\xdf\x50\x97\x27\x55\x71\xd6\x76\x6f\xef\xeb\x22\xf4\xdd\x21\xe0\x7e\xc1\xef\xee\xdb\x5d\xa2\x8d\x05\xbe\x08\x9e\x75\x4e\x57\x93\xa4\xec\x48\x92\xd7\xb5\x77\x12\x43\xbe\x91\xcb\x1b\xf5\x16\xd7\xd1\x7b\x45\x68\x4b\x50\xbc\xf9\x23\x48\xf5\x5d\x25\x3e\xbd\x57\xe6\x1b\xa8\xd4\x76\xbe\x35\x94\xd5\xe9\x6e\x05\x1f\xfd\x98\xa7\x53\x06\xa9\x49\x4e\xc2\x24\x8e\xa0\xab\x4d\xce\x1f\x9d\xea\x01\x44\xac\x28\x52\xa5\x40\x6f\x13\xe9\xba\xc0\x70\xc6\xfd\x6e\x6d\x61\xdb\xfe\xd7\x3e\xb9\xf9\x77\xb1\xcd\xf7\x8c\x4f\x16\xaa\xed\x1d\xfe\xfe\xd3\x8b\xcb\xe8\xe9\x22\x94\xcc\xbf\x75\x4f\xa3\x69\xc2\x73\xfd\xf4\x01\x1e\x83\xff\x53\x0f\xb3\xfd\x53\xec\xd1\x9b\x95\x99\xac\xc9\x71\x13\x7a\x89\xe0\x56\x92\x3f\xb9\xb7\x5e\xdb\x78\xdf\x7a\xff\xb9\xa7\x8f\xea\x1f\x25\xf3\xf9\xd2\xc8\xde\xb2\xa6\x09\x20\x06\x21\x04\xc0\x1f\xf7\x03\x9b\xef\xfc\x4c\x4b\xcf\x23\xf4\xcb\x73\xbf\x2d\x04\x0d\x1e\xab\x70\x0b\x24\x2d\x57\x84\x7f\x34\xb1\xa3\x1e\x13\x7d\x5f\xd2\xe6\x58\x8a\x8d\x15\x6a\x54\xbe\xf8\xc4\x8f\xd8\x4d\xdc\x33\x46\x3b\x4e\x93\x88\x69\x8b\xea\x1a\xf1\x16\x1e\xf6\x21\x35\x71\x49\x1f\xbb\x9f\xd7\xf4\x5a\xd9\x58\x43\x69\x05\xab\x02\x8b\x74\xd4\x87\x05\xa1\x35\x0b\xde\xa2\x1a\xb8\x5b\xd3\xd6\x84\xff\x13\x72\xbd\xc3\x1f\xeb\x2d\xe1\xb4\xd7\xf0\x9d\x33\xf4\xc0\xc3\x48\x9b\x15\x33\xd9\x7b\x8d\x88\x34\x01\xce\x0d\x93\x6a\x6a\x9a\x06\xef\x46\x7a\x2d\x25\xa4\x63\x7a\xd4\x9d\xc4\x6a\x31\x7a\xf8\x26\x8f\x7d\x0d\x54\xaa\xc5\x76\xdf\x41\xcf\x64\xab\xaf\xc5\x6e\x12\xdd\xe0\xaa\x9a\x3c\x7b\x41\xa8\x3c\xff\x22\x61\xf4\x31\xe3\x5a\x0e\x3d\x4f\x58\xed\x21\x61\xcf\x78\x0a\x99\x4b\xe0\x8b\xc6\x3a\x5a\xc5\xb4\xd5\x05\x26\xb1\x66\x52\xf2\x7b\x25\xfd\xc0\x93\xc4\x67\xe7\x20\xd2\x33\xcf\xa5\x47\x7e\x2d\x15\xbc\xff\x7a\xde\x35\x34\xf4\x2b\x20\xd4\xdd\xd3\xa9\x5a\x3b\x55\x3c\x72\x4a\xe9\xe5\xd4\xfd\x02\x17\xd1\x6f\xbb\xef\x4c\xb5\x2a\x6a\xbb\xd7\xff\xa6\x71\x69\x58\xeb\xbe\x73\xba\x1b\x8d\x84\x57\xbf\x2f\xdb\x3f\x35\xf0\x15\xe3\x96\x00\xb0\xf3\x05\x4f\x86\xde\xd2\x76\xbc\x50\xea\xfe\x4d\xbe\xd0\x20\x83\xff\x9a\x9f\xde\xa4\x6a\x51\x23\xfa\x2c\x8b\x01\x66\x5d\x27\x6d\x96\x13\x79\x1f\x4a\x72\x7c\x8d\xbf\xe0\x85\xc7\x83\xe0\x3d\x9c\x6b\xde\xa3\x26\xd6\xc0\xe5\x10\x30\xbf\xdb\xa1\x49\x2f\xef\xaa\x47\x75\x8c\x3a\x0e\x3a\x8e\x39\xee\x96\x0e\x6c\x4f\x3a\x3e\xe9\xf8\x8c\xe3\xa6\xe3\xcb\x8e\x6f\x38\x7e\xcb\xf1\xa6\xe3\x5f\x38\xfe\xc4\xf1\x6f\x1c\xff\xd1\xf1\x81\xdc\x4e\x75\xb1\x00\x1b\x94\x49\x13\xb2\x48\x48\xea\x9d\xe7\xe3\x8a\x14\x99\x62\xf9\x40\x5f\xc1\xdc\x0a\x94\xc8\x16\xe4\xa9\x2b\xb1\x61\xae\x90\xc8\x17\xb2\x09\xb3\x60\x26\xe4\xf2\xc8\xe5\x51\xd8\x56\x66\x81\x6d\x33\x11\x0c\x67\x72\xd2\x67\x59\x22\x14\xb5\x63\x8e\x1c\xbc\x6d\xd8\x20\x57\x0b\x09\x3b\x03\xa1\x20\x17\x33\x1d\x9f\x00\x45\x2e\xec\xe5\xd4\x69\x4b\xf7\x53\x88\x76\x0e\x4f\x0b\x1d\xda\x70\x47\x9e\x84\xc1\xa8\x4c\xf9\xc9\x17\x72\x51\x3b\x5c\x49\xaa\xa7\xb6\xc2\x19\x2c\x50\xa8\x74\x0c\xdc\x22\x9d\xf0\xa5\x84\x12\x8c\xda\xb1\x74\x52\x71\x15\x92\x54\xf7\x2d\x4b\xe9\x29\x66\x1d\xb3\xc1\x8e\xbb\x9b\x2c\x1c\x6c\x8e\xfc\x87\x57\x09\x26\x0c\x88\x98\xae\xa5\xf9\xe0\x8e\xe4\xd4\x85\xf1\x28\xa1\x99\x4c\x2d\x4c\x6d\xfe\x2b\x90\x6a\x9d\xa3\x07\xa6\xa1\x1a\x49\x3d\x25\xcd\x09\xc1\xcd\x5d\xc7\x63\xde\xc1\x92\xa6\xb1\x95\x53\x91\xae\x83\xfa\x3c\xa1\x45\x8b\x7c\x91\xcf\x43\x5b\x6c\x13\x05\xc6\x4a\x34\xba\x9f\x66\x55\xb0\xb3\x9c\x40\x4d\x41\xb3\x04\xaa\xe9\x88\xec\x26\xef\x9e\x64\x15\x83\xdb\x04\xe6\x08\xf3\x5a\x5b\xd2\x35\xf5\xc4\x01\xa2\xe1\x53\x1e\xcf\xf0\x84\x61\x22\x9d\x16\x7b\xc3\xe4\xba\xdc\x1d\xd6\x9b\x86\xd5\x7a\xcf\xa9\xd4\x75\x9e\xd0\x04\xe5\x33\x10\xb3\xc9\xa6\xb3\x0b\x3c\x7c\x46\xe3\x73\x82\x26\x76\x1b\x68\xe9\xc0\x9c\xd0\xf9\xb2\x0a\x74\x4d\x54\x92\xeb\x20\xb5\x91\x8c\xcd\xc7\x40\x7d\x4f\xc4\x66\x0d\x62\xcf\x79\xd4\x3d\xa7\x1f\x3d\x28\x3e\x04\x3e\x89\x2b\x0b\xd9\x6f\x7f\xfa\xab\x07\xd1\xf7\x5c\x36\x31\xc3\xde\x61\xc3\xbf\xd7\xfe\xfa\xd4\x87\xe3\xbe\xa9\x64\xb0\x8b\x54\xfd\x0d\xf1\xf6\xdb\x77\x7c\x61\x8c\x8f\x8c\x5c\xd7\x8b\x13\xcf\xf5\x77\xff\xf6\xeb\x3f\xd8\x7c\xc1\xfc\x53\xdc\x2d\x66\x3d\x98\xca\x4e\xed\x79\x98\xe8\x92\xfe\xe8\x91\xeb\xa0\x7b\xa7\x4f\x50\xe0\x89\xa9\x6c\x76\x4f\x40\x5c\xe4\x8f\xa4\x46\xf8\x29\xa1\xea\x17\x8e\xf0\xc0\x25\x84\xc5\xf1\x29\xf0\x1d\x65\x0a\x1f\xd5\x43\xa5\xc9\x44\x54\xf5\x7b\x2f\x0c\xd2\xbd\x47\x7d\x8f\x24\x2e\xee\x1e\xbd\x40\x74\xa0\x38\x49\xe6\x00\xd2\x4c\x57\x62\xbb\xe8\x78\x78\xa0\xe9\xba\x87\xee\x78\x6a\xe4\x6a\xe2\xd2\xbe\xc4\x45\xd0\xa9\xe8\xfe\xa8\x99\xb9\xf4\x29\xea\x6b\x88\xc9\xf3\x99\xe4\xc3\x89\x7d\xe9\x3d\xe4\xbd\xdb\x3b\xc0\xe9\x01\x75\x52\xff\x14\xa2\xd3\xfb\xa7\xc4\x4b\x83\x17\x93\xb1\xae\x2b\xfd\x3d\xca\xc4\xb5\x41\x7a\xc6\xd5\xfd\xb8\xf5\x75\x19\x94\x9e\x69\xbf\xf0\xa4\x1c\xdb\x1d\x97\x1d\x4f\x3a\x9e\x73\xbc\xe8\xf8\xb2\xe3\x9b\x8e\xdf\x76\x7c\xd7\xf1\x8e\x54\x98\xfc\xdc\xf1\x77\x72\x8b\x1b\x64\x13\x6c\x8a\xe5\xd8\x31\x76\x17\x9b\x67\x0b\xec\x31\xf6\x34\x7b\x5e\xba\xc6\xda\x9e\xb1\x2e\xfb\x6b\x93\xf0\xd8\xe2\x90\x4e\x33\xb7\x87\xd9\x36\x39\x56\xcf\x15\xc8\x17\xf2\x2e\xd9\x9b\x45\x65\x84\x8b\xad\x2b\x34\xa3\x11\xbf\x14\x12\x4a\x3b\xe7\x44\x46\x0e\x5e\x12\xb9\x7c\xc0\xfa\x9a\xc9\x06\x2f\x62\xf5\x66\x1d\x3b\xc0\x42\x47\x7b\x70\x7b\xf4\x6a\x7f\x83\xa4\x8a\x22\xe1\x89\xda\x10\x5f\x1a\x2c\x67\x6c\x56\xe8\x16\xb5\x53\xe9\x7c\x75\xfc\xcc\xfe\x2e\x28\x52\xb3\x17\xf9\x38\x47\xc5\x23\xfb\xb8\x5c\x54\x26\xcb\xcb\x86\xca\x1e\x7a\x48\xef\x18\x73\xca\x9e\x00\x77\xba\xc1\x42\xb4\xa3\x45\x94\xa6\xfb\xb7\x87\x11\x11\x9b\x26\x24\x05\x8b\x32\xb5\xa5\x63\x68\x23\x1b\xa2\x7c\x6e\xcc\x5e\x86\xca\x54\xb3\x60\xf8\xe3\xfc\x94\xa8\x6d\xdb\x66\xfb\x9f\x49\xc6\xcf\x96\x1d\x5a\xe7\xa7\xce\xde\x57\x95\x8a\x08\x65\x6b\xc2\x21\x0d\x62\x13\x9d\x5c\x17\x17\xd4\x89\xfc\x03\xfe\x58\x25\x95\x39\x3e\x3d\x3e\xf5\x45\xae\x25\x35\x7d\xef\x9d\xbb\x27\xd2\xc0\x82\x51\x7d\x8e\xa9\x44\x74\x66\x24\x59\x49\x99\xe9\xb7\x50\x35\xf6\xec\x5c\xb3\xc5\x60\x14\x2b\x57\x78\x73\xf2\x5c\xfd\x62\x64\x0e\xc3\xc3\x3e\xaf\x56\x01\x4f\xc5\x10\x08\x96\xf6\xe4\x78\x52\x67\x1a\x1f\x3a\x0a\x10\xae\x78\x41\x9e\xb8\xc9\xc1\xdb\x2a\xa6\x77\x00\x53\x3b\x55\x2c\xee\x3c\xea\xf1\x2c\x12\x78\x0b\xbc\xf7\xb4\xd6\xd3\x67\x14\x63\x49\x0c\x9e\x01\x78\xe0\x3e\x75\x91\xe0\xbb\xaf\xcb\x49\x0f\x28\xa0\xfe\x3b\xd5\x59\xf2\x9e\x86\xdc\xa1\x34\x39\xaf\x1a\x31\x00\x5d\x17\x8b\xf9\x0c\x48\x0c\x9d\x86\x6f\x33\x1c\x4b\xa6\xa8\x9e\x32\xa7\x7a\xab\x31\xf6\x63\x0c\xdf\x41\xe8\x1d\xac\x6c\x26\xef\x0c\xc2\xd8\xcb\xbe\x91\xae\x10\x0f\x75\xd5\xc9\xbb\xb9\xd3\xf9\x04\xc1\x98\x63\x6f\x60\x8e\xe6\xc4\x3c\x68\x0e\x44\xd3\x3b\x2a\x1b\xef\x80\x08\x86\x66\xb2\xd9\x59\xd0\x2c\x89\xc9\x19\x42\x1b\x5a\x2d\x75\x40\x31\xaa\x8b\x2d\xd0\xbe\x81\x9e\xae\xdc\xe4\xd8\x48\x3c\xe3\x0d\x53\x7d\x6f\x54\x1d\x2d\x70\x35\x56\x13\x3c\x78\xb4\xd4\x54\xcb\x42\xa4\xea\x7c\x4f\x7f\x72\xb2\x5b\x94\x3d\xa9\xc0\xe1\xf3\x13\x83\xdf\xfa\x60\xf3\x67\xbf\xbc\xfe\x74\xf0\xe0\x84\x94\x0a\xa4\xe7\x87\x9f\x9d\x5b\x14\xc0\xa5\x4b\x1c\xd7\xbc\xc5\x6a\xe5\xcc\x6f\xfe\x2a\xfb\xd4\x17\x9e\x29\x6d\x98\xa0\xcd\xbf\xdc\xb1\x3c\x7a\x16\x48\x6a\x1a\x80\x62\x75\x75\xf6\xee\x7f\x5a\xea\xf2\x44\x26\xda\xa2\x55\x1a\xff\x5f\x40\x9c\xe5\x17\xb5\x57\xf8\x74\xef\xdb\x6f\x7c\x8d\xbd\x85\x0a\x82\x4f\x43\x5b\x4a\xa2\x5c\x56\xf5\xe8\x99\x39\x6d\x21\xad\x17\x2e\x17\x21\x12\xf7\xd1\x81\x41\xe3\x55\x52\x3e\xe1\x1c\x9e\x3c\xa6\x2e\x37\x62\x37\x8c\xed\x17\x11\x8c\x7a\x1e\x69\xaf\xe8\xe4\xfa\x44\xd9\x58\x49\x2d\x96\x85\xd6\x06\xcd\xa9\xdc\xf7\x30\x47\xdb\x39\xbc\x60\xbc\x29\xc0\xee\xff\x20\xd5\xd2\xea\xeb\x2a\x17\x5a\x31\x45\xc5\x74\xd2\x0c\x66\x2b\xea\xce\x3d\x24\x32\x0f\x1a\xe5\x7a\x8a\x5e\xf0\xa2\x7f\xf0\x54\xe4\xe4\xa1\xa2\xb6\x10\x43\xf7\xaf\x70\xce\x57\x0c\xf0\x15\xa2\xc5\x21\xff\x0a\x61\x41\xbb\x32\x76\x7f\xff\x0a\x07\x25\x61\xc2\x6c\xf3\x55\xc2\xb2\xd8\x7f\x18\xb4\xaa\xd1\x7c\xec\xd0\x36\xf6\xe4\xea\x1a\x70\x3c\xc3\xaf\x46\x7a\x22\xbd\x27\x02\xbd\xb5\x8b\xc3\x6e\x25\xfc\x80\xd7\x4f\xe1\x73\x9c\xc6\x4f\x6b\x8b\x74\x7a\x4c\x60\xe4\x24\xf8\xb9\x00\x51\x8d\x80\x96\xc3\x91\x95\x38\xf3\x17\xee\xf7\x1c\x7b\x1d\x2f\x38\xbe\x22\xd9\xf4\xff\xc8\xf1\xfd\x0e\xde\xfc\x89\xcc\x4b\xff\xef\x8e\xff\xc5\x9c\xcc\xc7\x42\x6c\x98\x8d\xb1\x49\x96\x61\xd3\x6c\x2f\xab\xb2\x63\xec\x22\xbb\xcc\x1e\x61\xd7\xd9\x27\xd8\x73\xec\x45\xf6\xb2\xc4\x9e\xaf\xb1\x37\xd8\xef\xb1\x3f\x66\xff\x8a\xfd\x25\xfb\x2b\xf6\x01\xfb\x6b\xf6\xb7\x4e\x87\xd3\x23\x39\x95\xfd\xb7\xb9\x93\x1e\x45\x8d\x7a\xfc\xce\x8c\xbd\x3f\xeb\x84\x2c\x74\xe2\xcd\x6d\x4a\x7d\x21\x90\xc8\x05\x12\xe6\x1e\x16\x0a\xda\x5c\xf9\xad\xc9\x6f\x22\x90\x8b\xda\x14\x40\x89\xb3\xc2\x4e\xc5\x13\x54\xb3\x5b\x89\x46\x16\x48\x0d\x8e\xb0\x3e\xe9\xd2\x68\xa1\x25\x69\xd6\x9a\xcf\xe6\x73\xd2\xc1\x3a\x22\xc3\x6c\xfd\x8c\xa9\x9d\x75\x99\x84\x67\x19\x99\x37\x35\xc5\x3c\x6e\x19\x69\x3e\x16\xbc\xad\xbb\xca\xcb\x68\x73\x39\xdf\xb5\x13\xd0\x73\x53\x4c\xa6\x84\x44\x12\x51\xb7\xe4\xcc\xe7\xc6\x3a\x03\x4e\x7b\xe0\x18\xd9\x52\xa0\x85\xfe\xb7\x64\x85\x78\x42\x51\xb7\x28\xe9\xf1\xce\xed\x73\xd1\x2d\x74\x29\x03\x0b\xed\xc1\xa6\x9d\xe1\xee\x91\x24\x48\x5b\xcb\xb6\xb5\x60\xb3\x19\x8a\x1d\x6e\x44\xce\x26\xe0\x9b\x4a\xc7\xfd\x4a\x2a\x09\x3a\x9c\x48\x69\xa9\x24\x1d\x24\x6d\xea\x87\x67\x2c\x98\xcd\x75\x56\x5f\x12\x09\x47\x3a\x13\x51\x89\xa0\xa5\x9f\xda\xc7\xd7\x2f\x99\x89\xc1\x4c\x38\x67\x5f\xa5\x24\x84\xca\x87\x8f\x24\xc6\xe4\x24\xb6\x43\xd5\xc8\x14\x3a\x57\x67\x5f\x72\x47\x25\x2d\xb9\x2a\xd1\xc8\x68\xe7\x57\xa5\x33\x52\x3c\x31\x6a\x3f\x99\xce\x51\x6d\x87\x1d\xda\x96\xd9\xd1\x0e\xaf\x5e\x2a\xc8\x5d\xef\x9e\x1a\xc0\x5a\xcc\xf7\x65\x7d\xc7\x5d\x15\xd1\x3d\x12\x4b\x2d\xad\x27\xa9\x5a\x3a\x33\x65\x3e\xe6\xd6\xcc\x58\x23\xdd\x5c\xe4\xcd\x2a\x62\x58\x4a\xb5\x12\x67\x34\x0e\xe2\xc3\x7d\xc7\xf7\x25\x2e\x6c\xbc\xc7\x4b\x40\x31\xc5\x8f\xe4\x11\x83\x59\x4a\xc5\x62\x47\x87\x76\x65\x94\x0b\x17\xfc\xc4\x91\xbe\xba\x3d\xdb\x7f\x58\x49\xb6\xd3\x35\xf2\x1c\x3f\x37\xf2\x0a\x55\x70\xe4\x77\xde\xdc\x3d\x10\x1e\x87\x73\x7d\x41\x25\xea\x3d\x61\xa8\x98\x3a\x69\x1d\x25\x9e\xe7\x85\x67\xe3\xeb\xb3\x18\x73\xe6\xea\x34\x92\x6b\x79\x1e\xd4\xb4\x1b\xd8\xf8\x31\x66\x02\x1a\x7b\x0d\xab\x54\x59\x08\xdc\x17\xea\x52\x9e\xa1\x4d\x8e\xc0\x36\xce\x6e\x48\xae\x43\x32\x74\x2f\x5f\xa1\xcd\x4a\x8a\x52\x6c\xcd\xf9\x04\xe7\xe7\x46\xa8\x59\x41\x24\xb2\xc6\xe1\x7a\x14\x7d\x5d\xc6\xa6\xea\x0d\x73\x03\xac\xc9\x4f\xf7\xaa\x44\xcd\xde\xcd\x4f\xfa\xbd\x80\xdf\xcb\x52\x3d\xf7\x72\x2c\xa8\x9b\x6f\x73\x12\x2c\x36\x4f\x7c\x89\x5a\x80\xf7\xac\x16\xda\x9e\xef\x8a\xf5\x86\x7b\x03\x9b\xef\xa9\xb4\x88\x59\xb5\x05\x2a\x26\xc9\xef\xae\x69\xd8\xce\x9e\x75\x79\xb9\xba\x19\x9b\x03\x9f\x03\x3f\xfb\xff\x52\xf5\x3e\xd0\x6d\x9d\xe7\x99\x27\xbe\xcb\x07\xb8\x2f\xc1\x8f\xc4\x47\xe2\x03\x71\x49\x5e\x92\x97\x00\x08\x80\x22\x48\x42\x04\x40\x80\x22\x25\x52\x24\x24\x51\x12\x24\x41\x12\x25\xc1\x12\x24\x41\x12\x24\xc3\x12\x2d\xd1\x36\x6d\x53\x36\x65\x33\x36\x9d\x28\x89\x9c\x2a\x89\xd2\x28\x89\x92\xa8\x8d\xd2\x71\x1b\xa7\xf5\xb4\x6e\x92\xb6\xd9\xa9\x67\xea\xd3\xa4\x53\xa7\xc9\x4c\xd3\x6e\x9a\x7a\xa6\x9e\x8e\xa7\x75\x3b\x99\x19\xf7\x6c\x76\x9b\xd9\x88\xec\x1e\x7c\x17\x90\xb3\xd1\x39\xf2\x31\x45\x5c\x82\x8c\xf5\xfe\x7d\xde\xdf\xd3\x2a\x17\xe2\x9a\x40\x48\x50\xb3\x1e\x15\x24\x68\xfd\x87\x0d\xe7\x51\x36\x5a\x0f\x13\x2a\x24\x30\x67\xf2\x44\xca\x68\x3e\x4d\x28\x13\xd7\x5e\xd5\xb7\x9a\xeb\x26\xbb\x44\x34\x33\xa6\x7d\x0b\x0b\xf0\x6f\x5e\x17\x15\x52\xa9\x80\x8e\xf7\xc0\xed\x5e\xd6\x5e\x2f\x91\x38\xda\xb9\x6e\xc8\x0a\x2d\x03\x66\x7a\x5c\x2c\x81\xb4\x77\xe6\x24\x48\x3f\xb2\xee\xe0\xd5\xea\x52\x7b\x3b\xcf\xe7\xef\xbf\x57\xf0\x74\x24\xb6\x87\x66\x02\x45\xed\xdd\xae\x21\x33\x6b\xc8\x6e\x7f\x6c\xfd\xd5\x86\x66\xe7\xdb\xd9\xd6\x87\xfb\x07\xa7\x9e\x14\xfd\x97\xa6\xad\x3b\x27\x3f\xfb\xbb\xbd\xd1\x89\xad\x74\x63\xe2\xf7\x6e\x2e\xc5\xa6\xdf\xcc\x5b\xfc\xed\xf8\xd4\x5f\xb1\x49\x80\x4d\xc7\x6f\xe6\xa9\x3d\xb0\x69\xb8\x73\x3f\x44\x5b\xe0\x64\x6f\x34\xb4\xfe\x3a\x67\x05\x8a\x8a\x5d\x43\xe2\x15\xf9\xed\x6f\x19\x1b\x3f\xff\xad\x33\x23\x85\xc6\x86\xf9\xcb\xdf\x48\xe6\xf3\x71\x2c\x6e\xdc\x8e\x27\xbb\x83\x83\xdb\x1f\xfd\x78\xe9\x27\xb9\xe1\x9d\xcb\x2f\x76\x0b\x73\xc8\x73\xe3\xad\x03\x9b\x45\x01\xec\xd5\xee\x4b\x26\x99\xf9\x28\x97\xec\xd3\x26\x20\xba\xcf\x71\x6d\x18\xe1\xa3\xd8\x11\xe4\x45\xcc\xf6\x85\x7a\x9e\x12\x8d\xfa\x5d\x42\xb4\x40\x64\x14\x80\x9e\x17\x90\x8b\x05\x9e\x93\xb8\x65\x50\x34\x0e\xca\xa2\x4d\x43\x9b\x26\x47\x2f\xf0\xdb\x06\xef\x0c\xf0\x49\x23\xf0\x8c\x44\x25\x09\xe4\xd3\xdd\x51\x02\x46\xae\xea\xad\xf1\x12\xbc\xad\x64\x51\x48\xf0\x17\x9d\x44\xde\x93\xfd\x3a\x7a\x34\xf4\x68\x99\x68\x85\xdf\x71\x69\x82\x13\x44\x14\xde\x97\xf8\xcd\x24\xfa\x1f\xa6\xc0\x85\xca\xe6\x08\xed\x75\x96\x10\x6e\xe1\x16\x07\x8f\xfb\xfa\x47\x2f\x8a\x35\x03\x85\x18\x89\x72\xb4\xc3\x0f\x83\x64\xf9\x96\xf9\x4b\xad\xf8\x38\x13\x77\xc2\xed\x44\x9c\x2c\x84\x62\x19\x9a\x8c\x52\xff\x15\xff\x4b\xd3\x53\x47\x8c\xe6\x67\xe3\xb2\x90\x94\x13\x07\x73\x9b\xce\xca\x9b\x30\xa3\x59\x6c\xe9\xa4\xe0\x93\x72\x6a\x5f\x0c\xbc\xfb\x84\x39\x67\x89\x55\x5a\x02\x3d\xde\x19\xbd\x91\x44\xa8\x28\xcf\x35\x0b\x6b\x01\x37\x10\x3a\x31\xe4\x72\x81\x2f\xf3\x87\x3c\x24\xe7\x61\x76\x78\x3b\xbc\x5c\x65\x66\x59\xb0\xe8\xc0\xb8\xc4\x22\x16\x65\x34\x86\x82\x85\x0c\x62\xdc\xac\xa6\x58\x87\xa3\x47\xd5\xa4\xdf\x76\xbe\xe3\xd8\xec\x98\x77\x9c\x74\x9c\x53\x7d\xdc\x55\xc7\x0d\xc7\x1d\xc7\x57\x1c\xaf\x3a\x7e\xd7\xf1\xef\x1c\xff\xde\xf1\x1f\x1c\x7f\xe7\xf8\x9f\xcc\xcb\x3a\x14\xcf\x32\xce\xc6\xd8\x36\xb6\x93\xed\x67\xf3\xec\x04\x3b\xcb\x2a\xf5\x9e\xae\xc1\xd5\xe0\xd7\x7d\x0a\xf1\x5f\x97\x03\x7a\x58\x44\x8f\x04\x23\xc1\x11\xe5\x1a\x17\x56\x8b\xb9\xa4\x37\x52\x2d\x4e\x5d\xd5\xf8\xee\x57\x6c\xde\x29\x16\x0e\x46\x9c\x81\xc8\x58\x22\xd2\x36\xc5\x52\x49\x55\xc6\xb9\xbc\x4a\x5f\x16\x09\xa7\x6c\xe9\xbc\xee\xf3\x7f\xa0\x01\xb0\xfb\x34\x3d\x18\xfe\xa0\xaa\xfb\xc0\x37\x5b\x95\x9b\xb5\xfb\xa6\x74\xb8\xae\x64\x50\xf1\x70\x34\xfd\xe0\x62\xa8\x5e\x7a\x06\xd5\x98\x2d\xa0\x57\x33\x44\xa4\xf6\xfc\xb0\x0d\xd5\xa8\xf1\x00\x95\x18\xad\x5a\x69\xdb\x5d\xa2\x2d\x6f\xb3\xbf\x1f\x65\x1c\x5e\x73\xe9\x4b\xc8\x84\xcd\x91\xa8\xd6\x97\x6a\xb8\x59\x23\x5a\x28\xd9\x5e\xd0\xd5\xaf\x84\x7a\xce\xba\xf8\x62\x82\xd5\x13\x52\xb0\x76\xfa\x1b\xf1\xd7\x0f\x77\x6d\x69\xb9\xdd\x13\x26\x14\x56\x30\x62\x9f\x1e\xb3\x38\x1d\xfa\x44\x32\x6a\x54\xd3\xfc\x3b\x86\x05\x88\xbb\xa1\x81\xd9\x5d\xff\x65\x5e\x40\x5a\xd3\x56\x9e\x4b\x0a\x3e\xa9\xfb\x26\x27\x5a\xb3\x88\xf7\x3e\x0b\x73\x3a\x14\xfa\xde\x2f\xdd\xb8\x11\xe9\x43\x73\xc4\xda\x78\xff\x52\xca\xe5\x46\x3e\x43\x73\x26\xc6\xda\x43\xef\x48\xef\x43\x84\xe9\xac\xb9\x80\x8a\x59\xa1\xa3\xed\x04\xd7\x05\x94\x65\xb5\x07\x14\x73\xd1\xa6\x33\x84\x02\xd1\x64\x12\xdc\xb3\x39\x46\xc6\x02\x75\xef\xc5\xf1\x36\xe2\xb1\xac\x31\x8d\x49\x49\xd3\x71\x10\xb5\x9f\x32\x36\xcf\x02\xa3\x33\x46\x2c\x0b\x05\x91\x0f\xcc\x70\x4e\xcb\xe4\x8b\x8c\xb6\x70\x7a\xb4\x89\x8f\x4f\xc8\xbc\x20\x8a\x92\x98\xe6\x44\x62\xdb\x26\x81\x18\x3a\xd9\x3f\x6e\x8f\x80\x9a\xba\x37\xb9\x45\xdb\x0c\xe7\x56\x86\x92\x29\xaf\xa4\x39\x82\x65\x19\xc9\xd8\xf5\xf5\xe9\x10\x1a\xb5\xbe\x81\x08\x4f\x37\x02\xe6\xfa\x4f\xbd\x7d\xe8\x6b\x62\x3f\xe8\xea\x33\xb2\x1b\x73\x6d\x01\x92\x6c\x3e\x8b\xa1\x26\xda\x78\x0d\x21\x69\xb4\xb7\xff\x64\x53\xa7\x29\x93\xe2\x47\xa6\x15\x76\x87\x64\x9c\x1b\x56\x68\xc8\xcb\x43\x32\xea\xf3\xcb\xa4\xf3\x9d\xf2\x6c\xc7\xc6\xdb\xdf\xde\x58\x91\x21\x44\x09\x77\xfb\x23\xe7\x3a\xfa\xbc\x64\x4f\x19\x61\xde\x1b\x88\x74\x3d\xf6\xab\x1f\x3b\xca\x9e\xc2\xfd\xd0\x7a\x06\xff\xf4\xfc\xb6\xf0\xf0\xf0\x7c\xa6\x34\x19\x43\x3c\xb9\xc8\xd9\xf7\xfe\x25\x69\xde\xc6\x3b\xbf\xc3\x2e\x55\x96\xa3\xf3\xfb\xfc\x72\x0d\xdb\x66\x2a\xc6\x1a\x89\xc7\xdb\x26\x65\xef\xa3\x26\x56\x27\xab\xb5\xdd\xe9\x44\xfb\x45\x50\x99\xe4\xec\x43\xd9\xec\x5c\x74\x15\x03\x4f\x83\xda\x2e\xd2\xa7\x5b\x73\x47\x77\x56\xa8\x6d\x27\x8a\xf1\xd8\x5c\x3e\x3e\x7c\x21\x27\x8e\xed\x96\xd8\xbf\xa7\x18\x7e\x0a\xd3\xf0\x3d\x41\x59\xf7\xef\x87\x28\x37\xdb\x18\x8b\xff\xa6\x2b\x76\xfe\x70\x11\x83\x67\x40\x14\x69\x44\x86\x88\x70\x65\xa8\x08\xd3\x24\x8c\x9c\x33\xf6\x3e\x04\xe7\xc4\xd6\x06\x9f\xdf\xf9\x30\x64\xcf\xd1\x58\x85\xaa\xe9\xa0\x6b\xab\xd1\x7c\x62\xf3\x13\x77\x28\x8e\xa4\x89\x05\x60\x66\x13\x6f\x64\x95\x32\x8c\xa9\x01\x5a\x00\xca\x79\xa0\x40\x05\xa8\xbe\xa0\x6f\x8a\x17\x89\xa2\x31\x94\x50\x44\x09\xa9\x08\x3f\xaa\x51\x9e\xe7\x04\x0a\x8e\xba\xd6\xd8\xb9\xe6\xe2\x8e\x43\x8e\x37\x14\xd1\xfb\x6f\x1d\xff\x50\xed\x4f\x1d\x1b\xcc\xc9\x24\x33\x59\x90\x45\x58\x9c\xa5\x54\x24\x38\xc8\x8e\xb3\xa7\xd9\x0b\xec\x93\xaa\x52\x7c\x95\xfd\x0e\xfb\x13\xf6\xe7\xec\xaf\xd9\x7f\x65\xff\xc0\x7e\xaa\x76\x15\x5e\xad\x5b\x8b\x28\xd7\xd1\x5f\xbc\xb9\x59\xd6\x9e\xd7\x5e\xd2\x3e\x56\x8b\x1f\xfe\x76\x9f\x6c\xd0\x7d\x01\x75\x53\xa8\xd9\xec\x1c\x2d\xa8\xd8\xfc\xb5\x51\xb7\x4b\xaf\x59\x76\xa5\xc6\x52\x23\x2c\xad\x28\xa2\xca\xa4\xa4\x06\x40\xf0\x27\xd2\x63\x5e\xb5\xfb\x67\x91\x5a\xd3\xab\x90\x3a\x9a\x3a\x15\x51\x1d\x62\x4d\x97\xa5\x4c\xb1\xbd\x6a\xb2\xd4\xcb\x5c\xba\xd7\x66\x27\xe8\x32\x51\x2b\x37\xbd\x63\x69\xbf\x8d\x08\x9d\x50\xce\xa5\x0a\xcd\x93\x4a\x44\x52\xd5\x4e\xb9\x2d\x3d\x9a\x4e\x84\x83\xc9\x1a\x47\xd6\xc3\x98\xde\x5e\xd7\x6d\xf9\x6d\x20\x8f\x5d\x4a\xda\xd1\x44\xdd\xeb\xe8\xb5\x50\xe4\x4f\x25\x1e\xb8\x96\x2a\x56\x4c\xda\x95\xb6\xb5\xb8\xba\xcb\x3e\x69\x4c\x26\x46\xed\x4d\x81\x6f\xb4\x5a\xc0\xfa\xed\x57\xda\x54\xca\xea\x47\xc2\x29\x57\xb5\x2f\xb6\xeb\x53\x85\x1d\xb7\x4d\x53\x23\x35\xd7\xa6\x6a\x08\x74\xaa\xb5\x4a\x0d\xaf\x59\xfd\x19\xa8\x2d\x4b\xe0\x17\x48\xae\xd5\x9f\x66\x7f\xf5\x31\x4a\x61\x6d\x8b\x97\xd5\x2b\xd2\x36\xb7\x46\xda\xcc\x1f\x1b\xb6\x5a\xeb\xbb\x3f\x38\xcf\x49\x85\x9d\xb2\xbe\x35\x09\x47\x52\x35\xa6\x6d\x38\xd2\xa7\xdb\xf3\x02\x85\x76\xa8\x29\x8f\xd5\x28\x21\xa2\x3f\xc0\xac\x2b\x16\x42\x38\xe8\xac\x4d\x09\x6c\xa7\xf1\xb4\x0d\xec\xac\x16\xaa\x72\x90\xd5\xcc\x57\xc6\x52\x11\x3b\x38\x4e\xd8\x70\x8a\xfe\xfa\x7b\xb7\xcf\x80\x6c\xea\x8e\x3f\x91\xae\x49\xa7\x1f\x5c\xe9\xa4\xeb\x82\x67\xfb\xa0\x34\x1c\xa9\x96\xae\xb6\xaf\x54\x4d\xac\xd0\x5e\x73\x7e\x69\xaf\xa1\x2a\xfc\x35\xec\x41\x18\x71\xb1\x7f\x8b\xf7\x65\x73\xd1\x68\x6b\x51\x50\xf1\x78\x34\x66\x6c\x9d\xca\x70\x58\xc9\xb9\x50\xe6\xf4\x50\x12\x34\x1d\x8d\x3f\x15\xae\xe4\xf2\x19\x00\xf7\xba\xfa\x5f\x68\x37\xa8\xb6\xc9\xc8\x25\xf3\xd6\xf0\xd9\x89\x8d\xcd\x0f\x2e\xdd\x01\x9e\xa1\x42\xfa\x51\x0b\xc0\xdc\x92\x08\x89\xa5\xbc\x98\x9e\x14\x1c\x4d\x4e\xa1\xfe\x78\x32\x36\xd2\xef\xe9\xc8\x45\x97\x1f\xf2\xf3\xb8\x10\x59\xb4\x0c\xf3\xce\x19\x59\x7f\xa2\x09\x4f\x6b\x51\xba\x34\x74\x4c\x64\x92\x47\x03\xf3\xf1\x89\xdd\x73\xda\x1d\x9a\x1a\xe2\x58\x00\x55\x96\xcc\x45\xb7\xcb\x14\x03\x41\x49\x5d\x29\x8b\x68\x8d\x16\x88\xba\x76\x87\x16\xd1\x77\xc0\x98\xed\xe7\x18\x9a\xe2\x1b\x3f\x13\x24\xa2\x3f\x5b\xa0\x89\xcd\xb2\xa9\x71\x89\x16\x78\xe3\x09\x5a\xf8\x17\x87\xe4\xa2\xc5\x65\xbe\x8d\x25\x60\x6b\x62\x3d\x44\xec\x8d\xae\x66\xe2\x96\xb9\x11\x17\x3e\x8f\xf6\xad\x32\x27\x2c\x6d\xfc\x54\x7a\xfa\x88\xc7\xde\xdf\x9a\xae\x16\xc4\x65\xd1\xb8\x3e\xc0\xe1\xe9\x47\x8c\xdd\x98\x27\xe4\x88\x28\x4e\xa0\x0c\x41\x1f\x02\xa2\x1c\x7a\xab\xc5\xa6\x71\x2a\x8c\x4a\x9b\x7b\xdd\x12\xbc\x6f\x0a\x79\xa2\xcc\xa4\xf6\x36\x96\x44\x69\xe3\x26\xbf\xe8\xa2\x5c\xe3\xc6\x50\xd7\x41\xa0\xc0\xc1\x1b\xf8\x8e\x04\x2d\xde\xff\x61\x2c\x30\xd6\xe3\x26\x91\xcd\x20\x34\x69\x12\x3a\x8e\xb1\x57\x84\x08\x4d\x43\x2c\xb0\x22\xca\x46\x34\xb7\xb1\x8c\x79\x01\xbd\x79\xd1\x2c\x8e\x77\xb1\xeb\x1d\x09\xa9\x37\xd2\x45\xf7\xfd\xd7\x69\x89\x23\x35\xdb\x10\xc7\x12\xa7\x96\xcb\x1b\x0b\xbd\x3b\xb8\x00\x11\x35\x0d\x44\x37\x62\xa1\x3c\xf1\x92\xd3\x03\xf6\x1a\xed\xec\x04\xe7\x3d\x6d\x2c\x34\xb2\x83\x42\xdd\x0f\xd3\xfd\x7b\xcb\xe0\x7d\x09\x93\x37\x98\x59\x52\x43\x54\xd9\xbf\x17\xf7\x5f\x3b\xaf\x0b\x8a\xe5\xd9\x8f\x88\xf2\x24\x4a\xeb\x3f\xd5\x0f\xc2\xe8\x38\x4c\x0d\xd3\xb3\x03\x28\xf2\xfb\x37\x31\x1c\xce\xb2\x9f\x7a\x76\x90\x9c\xe7\x85\x64\x06\xcd\xc7\x10\x8b\xb7\x76\x65\x41\x2e\x17\xcf\x6c\x7e\xb1\xd7\x37\xb2\xf1\x7f\x2e\x98\x3f\x91\x3c\x1b\xdf\xf8\x79\x6f\x6c\x75\x3a\xde\xd6\x7e\x37\x2b\xf9\xf2\x9e\xc0\xc2\x48\x77\x6e\x29\xbf\xe3\xc5\x5f\xdb\xf3\xbd\x2f\xac\x41\x16\x77\xee\xe1\x28\xdc\x8b\xfe\x8c\x87\x26\x73\x80\x99\x7f\x75\x9e\x89\x50\xf2\xab\x53\xf2\x7e\x81\xa2\xa1\x90\x80\x59\x2c\x5a\x19\x7e\x4b\x4d\x94\xf2\x9d\xcf\x65\x93\x06\x70\x7b\xe3\x07\xfc\xfd\x58\x7c\x8e\x59\x7d\xff\x72\xfb\x5d\xce\x73\x07\xbe\xb8\xb1\x08\x18\x65\x20\xb6\x88\x05\xa3\xf4\xa7\x3b\x58\xf6\x4f\x3c\xfc\xc9\x4b\x89\x8d\x91\xe2\xda\x7c\xa8\x6c\x98\x82\x5b\x64\xe6\xee\x58\x25\xe6\x3f\x12\x5d\xd5\x1b\xfd\xe3\x9f\xff\xb3\x57\xaf\xdf\x6b\xe0\x99\x99\x19\x02\xbf\x09\xac\xf0\xe1\x53\x79\xa3\xfb\x8a\x85\xe8\x44\x77\x86\xb7\x1e\x0b\x71\x94\x43\xab\x86\xef\x52\x92\xd6\x68\x6a\xc7\x34\x9d\xe8\x33\x0f\xa7\xb4\x4f\xf1\xd2\x6c\xda\x5c\x90\xb9\x78\x7c\x8b\x7b\x95\xa8\xeb\x0c\x15\x89\x56\xa6\x87\xbc\x22\x47\xd1\xf8\x62\x74\xcf\xb0\xc9\x65\x9e\xa2\xb9\x56\x6f\x87\x1e\x8d\xd2\xb4\xb0\x9e\x73\x49\xc3\x77\x29\x1e\x6f\x9c\x88\x67\x33\x03\x87\xdb\xb4\xd8\x0a\xa7\x64\xc6\xec\x19\xbd\xdb\xfa\x2c\x97\x0b\x94\x33\x0b\x44\x6c\xaf\xb4\x86\x7a\x33\xc3\xc7\x33\xcf\x36\xc3\xe0\xa1\x8a\x10\x7d\xb3\x30\xcb\x28\xe5\x68\x52\x16\x0a\x66\xeb\x25\x21\xe7\x5b\xda\x43\x77\x44\xcf\x65\xaf\xd7\xf7\xa2\xd9\xfe\x1c\x69\x3d\xa1\x13\x03\xb1\x15\x53\x56\x16\x47\x98\x41\x8f\xa5\xf9\x62\x84\xc5\x0f\x9d\x8a\xe6\xe6\x25\xc9\x9b\x31\x69\x2c\x92\x39\xba\x93\xcb\x3b\x32\x7a\x27\xdb\xfe\x14\x9e\xea\x24\xc4\x33\x30\xf8\x12\x8c\x57\x25\x4e\x1c\xb4\x64\xdf\xc3\x80\xb5\xc2\x31\x7e\x22\xc4\xa5\xf3\x58\x34\x34\x57\x84\xbc\xde\xaa\x9b\xc6\xad\x18\x62\x99\xa1\x27\xa2\x88\x9c\x31\xe9\x36\x47\x6a\x22\x16\x42\x85\x0c\xc5\x57\x38\x3a\x43\xf4\x59\x46\xbb\x0e\x92\xa1\xbd\x20\x6e\x88\xae\x47\xb1\xf5\x04\xd6\xf0\x82\x06\xd0\xae\x3e\xaa\xc4\xf4\xab\xe0\xab\xd6\x1a\x42\x65\xc2\x24\x82\x1d\x15\x70\xe1\x70\xd8\x7c\x21\xa7\xc3\xf9\x9e\x63\xd2\xf1\x8c\xe3\x65\xc7\x6d\xc7\x3d\xc7\xd7\x1d\xdf\x70\xfc\x87\x9a\xa3\x98\x9b\xb5\x32\x93\x85\xd9\x88\xa2\x0c\xed\x51\x55\xf6\x69\x56\x61\x4f\xa8\x69\xcc\x2d\xf6\x45\xf6\x15\xf6\x35\xf6\x0d\xf6\x87\xec\xbb\xec\xc7\xec\x1f\xd8\xfb\xec\x7f\x6b\x4c\xe3\xca\xd9\x7b\x48\x5d\xb6\xee\xd0\xf6\x3a\x1c\xea\x48\x5f\x4d\x58\xbc\xf6\xf8\xc4\xdf\xee\xb3\xf9\xdb\x7e\x5d\xea\x7e\x19\x8c\x28\xf9\x5d\x4d\xba\xe7\x52\x4e\x7f\xd5\xd4\x3a\xaa\x56\x30\xd5\xba\x3c\x99\xb6\x5f\xd9\xde\xcb\x74\xaf\x54\xbb\xe9\xb1\xd4\x98\xca\x51\x5e\x35\x13\xb0\x5f\xda\x50\xcd\xca\x0d\xf6\x04\xd5\xa5\xe0\x43\x4c\x41\xf1\x14\x32\xc7\x46\xd4\x25\x6d\x83\x8d\x09\xa6\x66\xb8\xba\x02\xb4\xa7\xd4\xf0\xd6\x37\xda\x5b\xfd\x60\xb2\x5f\xaf\x9d\x8c\xa8\x0d\x7d\x60\x84\xa5\x12\xb5\x91\x6f\x2a\xad\x72\x4a\x30\x10\xe9\xf3\x49\xbf\x54\xa6\x34\x7e\x3b\x3d\x29\xac\xb7\x5a\x59\x07\x9c\x35\x93\x40\x95\x83\xd3\x35\x9b\xc1\xf0\x08\x53\x4e\x81\xf5\x4f\xd7\xed\xf4\xa7\xe4\x05\xfe\x9a\x9d\xa7\x53\xd6\xc8\x0b\x4e\xd5\x4a\xd8\xac\x9c\x40\x1d\x27\xad\x26\x31\x41\x67\xdd\x33\x2d\xd2\x57\xed\x05\x14\xb7\x2e\xe2\xf7\xd5\x88\xda\xaa\x2b\xb0\x6f\x86\xfa\xd5\xbd\x50\x3a\x92\xae\x99\xc1\xa6\x6d\x5b\x44\x67\x4d\x7e\x57\xbb\xc3\x4d\xd8\x60\x6e\x7f\x3a\xd2\x5f\xcb\x97\xfd\xd5\x47\x45\xec\x51\xb7\x3d\x63\xb1\xad\x38\x14\x97\xbb\x4f\xf7\xd7\x40\xea\x2a\x6d\x55\x5f\xec\xf2\xf9\x95\x44\xbc\xfa\xf3\x4d\xa5\x23\x89\x51\xbf\xaf\xfa\x55\xec\x17\x04\x9d\x0f\xec\x12\x7d\xf6\x82\x29\x15\xee\xf7\xd7\x9a\x1f\x35\x38\x57\xd4\x6e\xd5\xdf\x44\x02\x3e\xdb\x90\xc8\x69\xd3\x93\xf4\xda\xc2\xdf\x59\x43\x35\xb9\x94\xbf\x68\x90\x2d\x74\x5e\x5c\x69\x19\xed\x1c\x03\x8a\x43\x87\x5b\x3d\x7c\x6b\x62\x85\x4a\xdb\xbb\x54\x0e\x7b\xbd\x74\x31\xbc\xbf\x33\x8e\xa6\x81\xa1\x88\xc9\xc7\x0f\xc4\xca\x6d\xed\xd9\x22\xf1\xd2\xec\xc6\xbf\x6d\x19\x2e\x18\xf1\x39\x7f\xb3\xe4\x94\x1a\x01\x0a\x45\x33\x36\xd5\x67\x76\x39\xf9\xf2\x7c\x36\x9a\xe9\xe9\x8c\x9a\x19\x11\xe8\xe4\x8b\x7c\xde\xbd\xe7\xe0\x84\xd5\x13\xae\x20\xcb\xdb\x7a\xf2\x1c\x58\xe5\x4b\x28\x87\xd6\x6f\x77\x06\xb6\xb8\xa9\xd8\xa7\x6d\xe7\xa0\xf8\x9e\x36\x2c\x58\xeb\xef\x78\xfa\x32\x59\xf6\x2e\xdc\x2f\xf0\x1b\x90\xd1\x9b\x68\xec\x2a\xf1\xcb\x2d\x54\x8c\x92\x6b\x74\x8e\x0b\xf8\xcf\x6f\x38\xca\x02\x58\x32\x16\xb1\xc0\x56\xba\x9e\x04\xf8\x91\xb4\xbe\xfe\x69\x7f\x63\xcf\x4e\x2a\x02\x45\xe3\xa2\x4b\x59\x70\xb5\x8c\x19\x3c\xaa\x0f\xbc\xb7\x4c\xcb\xac\xcc\xc1\x03\xc7\x89\x6b\xcf\x18\x82\xca\xfe\x66\x7e\x7c\x78\xe3\xbb\xc9\x28\x20\x72\xcc\x44\xff\x39\x5a\x03\xdd\x20\xd1\x78\x20\xb9\x71\x3f\x86\x5e\x5f\x73\x10\x96\xdc\xb8\x4b\xbe\xae\x24\x78\x85\x55\x5a\xdc\x20\xeb\x47\x82\xcb\x7c\x14\xb3\x29\x0b\x8b\x16\x30\xb8\x9e\x6e\xee\x8d\x13\x04\x24\x8a\xe0\x5c\xd0\x2c\x03\xb2\x5a\x3e\x66\x4e\x53\xfa\xc8\xfa\x2d\xea\x18\x69\x6b\xa1\xb2\xb6\xb0\x8a\xf8\x7a\x9c\xf4\xfe\x24\x41\x33\x92\x39\xe5\xc5\x65\xe4\xd7\x17\xca\x80\xfb\x10\x1a\x3d\x56\xc8\xa4\xae\xed\x5c\xbb\x8b\x0a\x55\x2b\xf8\xdc\x50\x13\x80\x95\xf5\xf9\x90\xe0\x38\xa2\x93\xe4\x1c\x8b\xdc\x35\x43\x39\xed\xd6\xb2\xa0\xae\x47\xb0\x5e\xf4\xed\xc5\x44\xbf\x49\x79\x83\xa8\x4f\xdb\x37\x2d\x33\x70\xbb\x16\x42\x68\x5c\xdf\x5e\x32\x17\xa1\xdd\x2d\x99\xb4\x46\xc5\xa4\x11\xcf\x84\xd6\x63\x15\x98\x7b\x46\xb3\x65\x13\xe1\x19\xed\x95\x63\x1d\x86\x58\x81\x11\x3f\xe4\xa6\xd9\x0e\xe7\x7b\xe5\xd2\x1b\x23\xff\x07\xd8\xf5\x2f\x8e\x88\xca\xe5\x1e\x73\xc7\x7f\xbd\xf7\x93\x15\x58\x4b\x19\xe3\xd5\xec\x63\x5d\x57\xbf\x79\xe7\xf6\xa5\xff\x76\x5e\x4f\xca\x5b\xe5\xed\x1f\xbf\xf7\x93\x77\x7e\xed\x37\x33\x3f\x8f\xe7\xca\xcd\x97\x58\xe6\xdc\x17\x73\x07\xbf\x09\xb1\xf1\xc3\xf2\xbd\x4e\x57\xd2\x3b\xd0\x74\x35\x7a\x74\xdb\x63\xec\x5f\xfd\xd1\x66\x39\xd4\x54\x0e\xad\x7d\xbb\xb8\xf1\x23\xba\x3b\xc5\xb6\x96\x6f\xf6\x6e\xfe\xd6\x33\xbf\xb1\x71\x3d\xfb\x87\x27\x31\x3f\xc9\xd2\x8f\xbb\xa4\xef\xcb\x74\x8b\xc6\xf6\x70\x53\xd2\x64\x28\x0b\x59\xd9\x34\x96\xcc\x96\x20\xda\x3e\x65\x4d\x1b\xb1\x38\x3a\x12\x64\x02\xf1\x1b\x9c\x5e\x45\x68\xf9\x15\x8a\xad\xf0\xcf\x36\x52\xdb\xe5\xb8\xa0\x7c\x21\x7e\x13\xc9\x2c\x07\x7a\x2e\x96\x3a\x2e\x21\x9e\xcf\xdf\x40\x43\x37\x9e\x1a\x8d\xef\xfe\x32\x1d\xd8\x47\xfc\x16\xb0\x26\xef\x19\xb8\xd0\x79\x76\xc6\xe2\x19\x8c\x6c\xc7\xe6\xd3\xe8\xb9\x6c\x4e\xa2\xf3\x85\xe9\xd6\x67\x79\x36\xb4\xda\xaf\x43\xca\xe7\xc2\xbc\x79\xa2\xc9\x27\xdb\xb7\xc5\xcd\xf1\x67\x41\x77\xe3\xaf\x54\x96\x32\x16\x9a\x7b\xe3\xd1\x90\xe4\xf1\x4c\x88\x26\xb3\x0d\xdd\x37\x72\x31\x2e\x39\xe7\x06\x5a\x4e\x25\xc5\xd9\x51\x0e\xb3\xe3\x09\x4f\x87\x89\xd9\xd6\xc9\x0c\x84\x05\x82\x58\x9b\x8f\x1d\x6e\x46\x51\x8a\x96\xe1\xf1\x09\x33\x3f\x6f\x86\xe2\x31\xd3\x68\x7d\xc2\xa2\x4d\x2f\xf0\xc9\xbc\x39\x3d\x69\xd2\x7c\x2a\x5d\xb4\xcc\x78\x31\xb9\x24\x3a\xce\x21\xd7\xb5\xdd\x34\x07\x77\x23\xba\x4a\x4b\xbc\xe5\xf8\x2e\x26\x43\x46\xe7\x27\x2c\x65\x46\x6f\x98\xd5\xb2\xa5\x52\xa6\x4a\x46\xdc\xe4\x3c\xf5\x84\x89\xd4\x2e\xe0\x58\x1f\xe7\x68\x3b\xd5\xda\x44\x94\x9a\x2a\x0c\x0c\x5a\x2f\xf4\xc4\x68\x85\xaf\x42\x2c\x58\xa0\x9b\xfc\xc5\x56\x39\x72\xc4\x0a\xad\xb9\x5d\xe7\xbb\x44\xdb\xe3\x00\x76\x8d\x8b\xe7\x1b\x81\x5b\x5a\x4b\xb1\xec\x70\xc4\xd4\xee\x60\xcd\x25\x1d\x61\xe5\xcf\xbd\xec\x78\xde\xf1\x92\xe3\xe3\x8e\x4f\x39\xbe\xe0\xf8\x96\xe3\xdf\x38\xfe\xd8\xf1\x17\x8e\xff\xc5\x98\xda\x53\x8e\xb0\x34\x9b\x61\x27\x58\x99\x5d\x62\x4f\xb0\x15\xf6\x61\xf6\xb2\xf2\xbc\xfc\x2d\xf6\x4d\xf6\x87\xec\x8f\xd8\x5b\xec\x2f\x55\x7e\xe2\x9a\xd4\x3a\x35\x4b\x8b\x6a\x23\x5a\x4a\xb1\x53\x6b\x2e\x22\xbe\x9a\xe5\xd3\x20\x0b\xd7\x3c\x43\xaa\xed\xd7\xa8\x6d\xe6\xc4\x84\x92\xf0\xda\x4e\xc9\x63\x2a\xf9\x44\xec\x04\x14\x0e\x46\xd4\x0b\xed\x0e\x4c\x67\xd5\x78\xa8\xcc\x18\x6c\x80\x8f\xae\xdc\x44\x6c\x2d\xb8\x7a\x49\xc4\xb6\x20\xf1\xd7\x34\x51\x2a\x39\xd4\x26\xfb\x4a\xe9\x64\xcf\xbd\x55\x82\xaa\xc1\x02\xd4\x16\xd2\x96\x60\xd9\x1b\xc2\x11\x16\x4c\xb9\x6a\x96\x6e\xf2\x81\x43\xa4\x5e\xe7\xad\x45\x82\x2e\xaf\x4f\x57\x46\xe1\x69\x75\xf7\x1a\x49\xa7\xd4\x59\x6b\xb5\xf1\x64\xbe\x3a\x72\xc7\xce\x44\x4a\xcb\x95\xb0\x6d\xa2\x02\x11\x5f\x2d\x36\x3b\x6b\x1e\x14\xb6\xa7\xd2\xa8\xbf\x46\x67\x18\x4d\xa7\x6c\x1b\x08\x25\xc8\xaa\x66\xf1\xba\x69\x9c\xdf\x57\x57\xbe\xd5\x49\x0e\x63\xe9\x60\xbf\xdd\x2f\xd5\x57\xb6\xea\xa9\x75\xf3\x89\xea\xdb\xb2\xf7\xac\xd5\x16\xec\x41\x97\xe4\xb3\x6d\x11\xfc\x0a\x6d\x67\x2b\xeb\xc6\x52\x35\xee\x50\x2a\x90\x0a\xa7\x9c\x4a\x49\x1d\x71\xd5\x7e\x7c\x01\xa7\xf4\x27\x9d\xae\x6e\xfb\x1c\x27\x22\x7b\x99\xd2\xaf\x05\x3f\x48\xc1\x75\x9b\x90\x6a\xdf\x39\x66\xbf\x70\x54\xb9\x4d\xd5\x6e\x72\x95\x8d\xa6\xca\xbf\xb6\x82\x2d\x1d\x49\xa9\xc4\x64\xc3\xe8\x46\x98\xdf\x76\xc2\x08\xaa\x15\xb2\x92\xd8\xf9\x13\x61\xed\xc6\x72\xd4\x77\xec\xc8\x54\xf3\x14\x37\x42\xf1\xdc\xed\xd7\x2a\xd6\x37\xda\xba\x3e\xb9\x33\x6c\x8a\xcc\xb6\x67\xf8\x64\x34\x53\xf1\xac\xff\xef\xc5\x3d\xc7\x0d\x33\x89\xdc\x02\x8b\xb8\x8f\x96\x4f\x06\x21\xf9\xe2\x81\x81\xd2\x63\xb3\x7f\xd0\x2a\x83\x03\xf1\x98\x25\x1b\xd6\x4c\x4e\x1c\xee\x8d\x67\x36\x1d\x9a\x0f\x45\xf5\xee\xe8\x87\x2f\x5c\xdd\x25\x55\x32\xe3\x26\x7a\x5a\x0e\xf4\xdf\x96\x22\xb2\x19\x22\xdd\x27\xe7\x38\x06\x3b\x2a\xe9\x21\x14\xd6\xfc\xcd\x1c\x82\x25\x43\x71\x8e\xf5\x3b\x6d\x5b\x88\x86\x87\xc5\x1c\x28\x2e\x85\x38\xd0\x77\xa0\x71\x34\x4c\x24\xde\xf3\xb6\x52\x1b\x6b\x09\xcd\xc1\xb5\x25\xb6\xbe\x7c\xb8\x9b\xcb\x22\x8e\x0d\xc8\x05\x48\x13\xa6\x98\x38\x38\x3e\x91\xea\x35\x81\x96\x00\x19\xfc\x4e\x21\xae\x95\x2a\x44\x3b\x5b\xb0\x48\x56\xa2\x7b\x7d\x4e\xa2\x65\xa7\x45\x2e\xb7\xff\x25\xf7\x45\x10\xfa\x8f\x69\x6f\x61\xe7\x30\xc1\x7f\x90\xac\xa4\xe0\xdc\x73\x90\xb0\x35\xdd\xe8\xb9\xff\x0a\xf5\x1f\x03\x96\x25\xe2\xa1\x18\x79\x1f\x01\xa7\x7d\xbd\x84\x12\xc7\x8e\x09\x32\x4a\xc0\x8e\x59\x83\xa4\x56\xa6\xc7\x74\x34\x36\x6c\x3a\x24\x51\xed\xe0\x56\xd6\x05\xae\x74\x8f\xef\xd5\x7e\xe0\x3b\x01\xbe\xe8\x5e\x0f\x94\x4c\xd9\xd0\x57\xd1\xde\x24\xdf\x31\xc1\x97\xd7\xe3\xd9\xe1\x00\xb7\x0c\x23\x17\xd5\x5e\x45\x64\xbc\x1a\x64\xd6\x0b\xa1\x18\xf8\xb4\xb6\xba\x3d\xc8\xf9\x22\x37\x5a\x8f\x11\xf5\xec\x71\xaf\xff\x5a\x8e\xfd\x8c\x6f\x19\x15\x9b\xaf\xcc\x1b\xb2\xcc\xaf\x1f\xee\xa3\x22\x61\x78\x94\x64\x09\x8a\xcb\x5d\x39\xb4\xad\x75\x17\x87\xb9\xb0\xec\x19\x88\x93\xb7\x63\x81\xf7\xed\x32\xc6\xc6\xe0\x3b\xc1\xce\x11\x2f\xb5\x6c\xfc\x78\x7f\x5b\xdf\x44\x72\x5e\xe6\xe4\x2b\x79\x53\xce\x0b\xb9\x4c\x53\x3b\xa0\x3f\x14\x2a\x89\x03\x2e\xc9\x7b\x2f\x6c\x2f\xfd\xcd\x96\x73\xdf\x39\xfd\xa5\xc5\xe0\x27\x3e\xe4\x6b\xc1\x67\x22\x1f\xbe\xf9\xf0\x37\xbe\xf4\x77\xff\x8e\xef\x68\x0e\x06\x1b\xef\x1f\xdb\xf8\xe3\xfd\x69\x00\xfb\x49\x78\xa6\x8e\x5b\xdf\xff\x1c\x90\xf8\xd0\xf1\x8f\xfc\xd9\x61\x8f\x6e\x1c\xda\xeb\xd9\x72\xfa\xe4\x6f\x67\x7f\x49\xfb\x35\xec\x22\x82\xa4\x89\xc5\x7f\xef\xff\xd5\x33\x7b\xa6\x7e\xfd\x54\xec\x49\xde\x3b\x05\x5c\x3c\xeb\x19\x9e\xbe\xd5\xda\x99\x85\x71\x26\xca\x67\x76\x3d\xa1\x9f\xf7\x75\x9d\x1c\xa0\x8f\x62\x86\x7a\x45\x13\x1a\x06\x5c\x13\x4d\x71\xef\xf8\x24\x81\xc2\xf9\x86\x06\xff\x31\x20\xbe\x89\x8b\x6b\xc6\xa4\x67\x3c\x2b\xe0\x72\xd3\x76\xe7\x74\xdf\x58\xf3\xce\x91\x44\x24\xfd\xa8\x41\xae\xa7\x1b\xf0\x82\x49\x9f\xe4\xeb\x7f\x33\x32\xf8\x32\xc7\xce\xcd\x27\xcf\x5e\x2b\xf5\x4f\xf9\x81\xcb\x40\xf2\xde\xa7\x76\xb3\x5b\x74\x19\x74\xd0\x05\xff\x15\xcc\xb7\x6c\xf1\xc9\xce\xd6\xa3\xa6\xb5\x13\xd1\x47\x8c\x9e\xd3\x5e\x18\xc7\xbc\xd0\x8f\x92\xec\x3c\x20\xf9\xc5\xc8\xd9\x91\x2f\x76\x9d\xf5\x6f\x9b\x83\x7c\x29\x01\x3d\x16\x6b\xea\x25\xf7\xd3\xe8\xe5\xbd\xa5\x76\xd0\x59\xa0\xe9\x82\x05\xba\xdc\x75\x26\x74\x68\x7f\x64\xe6\xb9\x44\xe8\x91\xe3\xde\x93\xc9\xe0\x87\x28\x42\x57\x07\x07\xe6\x8f\xf6\x17\xe0\xc5\xcb\xbd\xa2\xb5\x12\x6c\x98\xbd\x10\x09\x26\x0e\x8f\x3c\x63\x60\x68\x7c\x8c\x93\xe8\xa5\xe3\xc7\x23\x11\x39\xbd\x95\x43\xbe\x34\x48\x3d\xcd\xbd\x68\xca\x34\x05\x9f\x81\xc0\x47\xb5\x7c\x72\xa7\xd1\xf4\xb8\x68\x37\x5b\xb5\x96\x66\xec\x1b\x30\x11\x6b\xea\x29\x52\x53\xb3\xfb\x12\xae\x62\x45\xe3\xb8\x06\x9a\x4b\x79\x71\xc5\x83\xc7\x89\x5f\xdb\x92\x19\x9c\x31\x38\xbf\xb6\xbf\x71\xdb\x88\xf1\x90\x44\x7b\xc1\xed\x42\x38\x3f\xe5\x5e\xa4\x67\x40\x38\x34\xde\xcd\x71\x1c\xa7\x40\x8f\xa1\xe9\x14\x07\x5d\x68\x2b\x10\x9d\x3c\xe3\x70\x44\x54\x9e\x59\x70\xbe\xe7\x18\x72\x1c\x71\x9c\x72\x3c\xe5\xf8\xa4\xe3\x97\x1d\x5f\x56\xdd\xd0\xb7\x1c\x6f\x38\xfe\xd4\xf1\x17\x8e\xff\xe4\xf8\x3b\xc7\xff\x74\xfc\xb3\xe3\x5f\x58\xa3\x9a\x3a\xf6\xb3\x71\x36\xcd\xf6\xd4\x94\xd1\xf6\x3d\xd3\x47\xd9\xa7\xd9\x2b\xec\x5b\xec\xdf\xb2\x3f\x67\x6f\xb3\xbf\xb7\xc9\xdc\xb6\xcf\xb9\xdd\xd9\xb8\x82\x7a\x44\x4f\x05\x7c\xb5\x3e\x47\x9d\x1c\xb5\x29\x22\x6a\x35\x52\x3b\x7d\xb2\xce\xfb\xa9\xf6\x1e\x36\x07\xae\x16\xc5\x53\x76\x8b\xe4\xab\x06\xf1\x9a\x2f\x70\x24\xec\x6c\xf7\xd5\x8c\x8c\x22\x41\x3d\x9c\x1a\x53\xf3\x35\xff\x68\xda\xdf\xae\x40\x9c\xea\xe6\xd3\x5e\xd3\x56\x6b\x69\x3d\x92\x8a\x04\xab\xed\x41\xc4\x1e\x12\x26\xd5\xbf\xa5\x92\xe9\x0f\xf4\x2b\xd2\xd6\xd8\xa8\xd0\x3b\xc1\xd2\x91\xb0\xcd\x41\x53\x03\x44\x35\x8f\x4c\x45\x5c\x3e\x57\xa4\x4e\x8e\xab\x13\xcf\xea\x70\xe9\x7e\xdd\x56\xd0\xd8\x57\xf7\x89\xda\x6e\x57\x8d\xb6\x9c\xd5\xe4\xe9\x53\xbd\x88\xb3\x2e\x51\x73\xf9\x6a\x9a\xb3\x07\x4a\xe6\x84\xba\x31\x0a\x07\xf5\x9a\xb3\xcd\x07\x48\x20\x75\x90\x13\x49\x55\x7f\x1f\x4d\x2b\xeb\x3f\xbb\xaf\xa9\x41\x84\xaa\x99\xe5\x81\x49\x69\xcd\xec\xf8\xc1\x92\x46\xcd\x34\x47\x6b\xeb\xf8\xc0\x07\x1e\xa7\x36\x8b\x2f\x61\xdf\x09\x29\xb5\x77\xcd\x13\x3e\x5c\xa3\x1c\x55\xb3\x44\xdd\x79\x2b\xe1\x97\xfe\xfa\x4a\x64\x2c\x1d\x1e\x64\xf6\x9c\x52\x1d\x0b\xa5\xb4\x57\xaf\x8c\x07\x8e\x66\x8d\x11\x1f\xa4\xb5\xe9\x57\xb7\xb5\x8c\x7b\x73\xe5\x8c\x61\x4c\x26\x8b\xed\xc3\xfe\xf1\x42\xcb\xe8\xd9\x36\x13\xd7\x7d\x07\x2e\x6d\xfc\x5b\x8e\x90\x65\xf2\x50\x8c\xc7\x8c\x2b\x9b\x4d\xd9\x18\xf9\x71\xcf\x9f\xcd\x6c\x6b\x33\xbc\xe3\x9d\x17\x4d\x9a\x5e\xce\x7e\x49\xbb\xdc\xd5\x5d\xe4\xae\x6d\x63\x1b\x1f\xbe\xcd\x91\x39\x73\xda\x0c\xc1\x98\x53\x5e\x9c\xbc\xf7\x88\x15\x19\xe0\x9e\x83\x99\x3c\xcc\x3c\xc0\x73\x3c\x2f\x73\x26\x32\x26\x8c\xb7\x73\x31\x8e\xb2\xf9\xb3\xe9\x9f\x9d\xf0\x11\x0a\xe6\xfa\xb7\xb0\x06\xa0\xf9\xb4\xa9\x65\xb0\x2f\x08\x0a\xed\x5a\xff\x9d\xe6\xc3\x16\x21\xd8\xdf\xef\xbf\x39\x70\xae\xa7\x45\xde\x68\xfa\xe2\x22\x79\xfa\xa6\x35\x03\x89\xcd\x92\x96\xd6\xbf\x8b\x86\x47\x29\xcb\x7e\x4a\xc9\x0c\x27\x5f\x30\xbe\xfe\xa6\x7f\x2b\x10\x8f\x6a\x06\x9f\x6b\x6b\xe7\x13\x9b\xd7\x7f\xc0\x05\x57\x36\xba\x1a\x10\x98\x01\x2f\x5b\xbc\x04\x99\x09\x95\xdb\x03\x31\x88\x91\x01\x3e\xcf\xdb\xb4\x63\xad\x71\x0a\x95\x49\x9c\x75\x4f\x77\xcc\x72\x63\xce\x90\x66\x06\xf1\x6c\x89\xda\xdd\xe5\x50\x34\x6f\xa1\x4c\x94\xdc\x1e\x24\x2c\x59\x72\x3e\x2e\x32\x25\xba\x39\xc7\x89\xe6\x91\xcd\x99\xc1\x54\x12\xbc\x48\xbc\x60\x9a\x46\x92\x83\xe6\x05\x27\x63\x70\x2b\x20\x0a\x1c\x68\xed\x6d\xec\xe5\xc2\xca\xc4\xe4\xc0\x94\xee\x44\x19\x74\x44\xe7\x98\xed\x8f\x51\xef\x76\x70\xaa\x4c\x17\x24\x35\x9e\x00\xf2\x26\x8d\xa4\x90\x3b\xda\xd2\xa6\x1d\xf1\x40\x24\xe3\x21\x0b\xd8\x32\x4c\xce\xf7\x3c\xdd\x3d\xe1\xb8\x79\xe4\x5c\xe9\xa1\x03\xe5\x57\x62\x96\xc1\x81\xcc\xb3\xbf\x7e\x2d\x42\x7c\x69\x21\xba\xfb\x23\xec\xb7\xff\xf6\x07\x06\x6f\x1b\x75\xbb\xbb\x9e\xe6\xe9\x0e\x60\xe3\x07\x6f\x2c\x16\x3e\xf9\x44\x2e\xfe\x83\xf4\x63\x85\x9e\xb6\xb9\xb5\xcb\xfb\xa7\xcb\x73\xd3\x71\x83\x40\x5c\xc8\x38\xf5\x1c\xcd\x0f\x6e\x3f\xb6\x2b\x19\x9d\x1f\x3b\x7a\xae\x1b\xd5\x8f\x7e\xef\x23\xd2\xe0\x30\xe5\xde\x21\x5a\x6b\x6e\xc2\x0a\x2d\x72\xb8\x1e\x07\x11\x2a\x92\xa4\xb0\xe2\xb2\x90\x23\x18\x3d\xcf\xf0\x50\x1c\x5b\xdc\xd6\x22\x8f\x76\x6d\x35\x49\x06\x3e\x0f\x84\xd8\x2f\x99\x19\x71\x3b\x14\x3b\xda\xd2\xfd\x74\x26\x4a\x73\xfd\x23\x3f\x2b\x27\xb6\x73\x70\xd3\xd3\x44\xaf\x73\xcf\x8e\x22\x49\x0c\x1f\x22\xb1\xca\x01\xef\x17\xf1\x7c\xab\xcc\x4f\x9a\xd3\x59\xc9\xe3\x73\x38\xd1\x6f\x0a\x34\x9d\x37\x8d\xf1\x03\x25\xe2\xd5\x4a\x62\x3e\x24\x77\x6d\x87\x5c\x8b\x7a\x9a\x9f\x71\xcb\x89\xed\xc5\xa1\xde\xa4\xc0\xae\x21\xbe\x40\x84\xd5\x78\xb4\xed\x29\xb1\x16\x6d\xf8\x28\x99\xf3\x42\x88\xce\x2d\x39\xb2\xe4\x8a\xbc\xa1\xf7\x5d\x07\x6e\x48\xda\x91\xa0\x55\xd0\x0a\x88\xae\x9b\x97\x35\x5e\x21\x8e\x65\x4e\x53\x03\x5c\xea\x9f\x31\x07\x1f\x29\x4f\x17\x64\x72\x99\x4f\x56\xaa\x2d\x4b\xe6\xc2\x26\x34\x4e\xb1\x04\xcf\xcf\xaf\x65\x0f\xef\x93\x1d\x2f\xe2\x74\xbf\x75\xa5\xbf\x64\x75\x3f\x01\x41\x77\x8a\xb7\xc0\x69\x8d\x50\x16\x92\xf8\xb1\xf1\xb9\x5b\x44\xd5\x8f\xcc\xe5\x70\x3e\x01\x87\xc3\x31\xee\x70\xfc\xcb\x8f\xb1\xe2\xdc\x70\x64\x1c\x17\x1c\x97\x1d\x4b\x8e\x67\x1c\x5f\x70\xfc\xaa\xe3\x37\x1c\xaf\x39\xbe\xa1\xea\xfd\xef\x3b\xfe\xc2\xf1\xb6\xe3\x5d\xc6\x58\x13\xeb\x66\xc3\x4a\x25\x94\x67\x8f\xb0\x97\xd8\xcb\xec\x4b\xec\x15\xf6\x3b\xec\xf7\xd4\x34\xaa\x1a\x7f\xff\x96\xfd\x23\xfb\x27\x76\x5f\x73\x69\x5c\xdd\x93\x86\xb5\x21\x2d\xad\x6d\xd3\x66\xb5\x39\x2d\xaf\x1d\xd3\x4e\x6b\xe7\xb5\xcb\xda\x53\xda\x35\x6d\x4d\x6d\x7e\xfc\xd5\xb8\xd9\xde\x6a\x9f\xa6\xb4\xf7\x32\xa9\x07\xf4\x88\xaa\x66\x23\xd5\xae\x40\xd9\x09\xda\xbf\xd2\x8a\x0c\x53\xed\x0e\xd2\xa3\x53\x4c\x79\xb9\xd9\xe7\x9d\xca\xec\x35\xe1\x1f\xdd\xca\xc2\xc1\x64\x35\xba\x7b\x1f\x90\x63\x6a\xfd\x81\x8b\xd5\x82\x9e\xdf\xde\x05\xdb\xab\xd9\xd1\x56\xd9\xe0\x0a\xea\x81\x11\xe6\xb2\xed\x9d\xd5\xf9\x68\x2a\x92\xac\xa9\x8e\xd5\x06\x37\x19\xb1\x17\x2d\x11\x65\x0d\x90\x8e\xa4\xa5\x7d\x76\x58\x0b\x70\xb2\xb6\x83\xa9\xc6\x70\x35\xe7\x52\x6b\x8d\xb4\xcf\x9e\x1b\xd9\xc3\x17\xbb\xc0\xae\x36\x00\x83\xcc\x27\x13\xf6\xc4\xcb\x1e\x50\xa9\x43\xcb\xda\x1e\x27\xe8\x55\x46\x09\xa3\xde\x51\xc5\xdd\x0c\xaa\x3b\x9e\xf6\xfa\x8d\xa7\xad\x4d\xb4\x47\x3a\x2a\xca\xd7\xf2\x4b\xb8\xa6\x5f\xea\xd7\xeb\x63\x2c\xff\x83\x7d\x78\x2a\xad\x80\x73\xb5\x41\x97\xcf\x5f\xa7\x7e\x3e\x78\x64\x22\x15\x51\x00\x39\xa7\xee\x53\x0b\x2c\x35\x8e\xab\xfe\x69\x7d\x45\x5e\x4f\x36\x81\x0f\x28\xa4\xb6\x46\x29\x5d\x53\x40\xdb\xb9\x46\x99\xfb\xa9\x27\xe8\x01\x9f\xde\xf7\x60\xda\x65\x5f\xcf\xf8\x6c\xce\xb4\xd3\xbe\x89\xf5\xd8\xca\xed\x54\x3a\x15\xee\x65\x35\x73\x3d\x3d\x52\xe3\xc8\x3d\xc8\x84\x4a\x72\x19\x09\xdb\xa4\x9d\x54\x2d\xea\x2b\x46\xf6\xa8\x22\xd1\xf4\xfb\x6c\xb5\x92\xde\x9e\x08\xf7\xfb\xfc\xe9\xa0\xd3\xde\xe5\xb8\xec\xa6\x4e\x77\xfa\xd5\x18\xb0\xda\xa9\x28\xd4\xb5\xcf\x46\xea\xf4\xd9\x4d\x5e\xc4\x2f\xfd\xa3\x4a\x01\x60\xaf\x85\xd4\x57\xd7\x6e\x72\x7e\xfd\xa9\xe3\x2b\x66\xb7\xff\x40\xa3\x77\x07\x2f\x44\x49\x24\x67\xcf\x93\xe0\x77\xe5\x9c\x30\x44\x3e\x2f\xba\x06\x7a\xc7\x85\x00\x9a\xfd\xd3\x73\x33\x2f\x34\x4e\xb5\x6c\x29\xaf\xbf\x06\x90\x39\x9e\x7e\xec\x70\xe8\x11\xef\x81\xf1\x43\x3d\xf9\x79\x77\x38\x63\xed\xd8\x6b\x00\xa5\xe7\x8e\xca\xe2\x62\xa9\xf8\x95\x81\xe6\x86\x1d\x49\x88\xae\x81\x7c\x0c\x71\x4e\xda\xc6\x53\x3f\x99\x9f\x9e\xe6\x5b\x77\xc5\x0c\x23\x2a\x29\x17\x1b\x3c\x62\xf2\x18\xdc\x9d\xc1\x97\x96\xd9\xeb\x59\xc4\x37\xa6\xfb\x83\xa0\xe4\x1c\x28\x4f\x73\xb9\x0c\x4d\x86\xfa\xfc\xe8\xf5\xbd\x55\x82\x2c\xb1\xf7\x92\xd3\xb0\xe6\xd7\xdf\x15\x15\xd0\xeb\x3e\x1d\x3e\x7d\xe3\xdb\x15\x50\xd7\x3e\x2d\x3b\x17\x02\x3d\xd4\x04\xee\xe9\xcb\xad\x12\x3a\x0e\x93\xbb\xa5\x65\x78\xbd\xdc\x7e\x14\x7c\x01\x56\xd3\xc0\x64\x86\x1e\x3e\x42\x20\x93\x3f\x7f\x7e\x61\xce\xca\x8b\x3d\x3d\x9c\x1e\xf3\x58\x7d\x27\x92\xb2\x4c\x12\xf0\x9c\x07\xef\x9b\xe2\x08\x6b\xc7\xb1\x86\xfb\xaf\xd0\x75\xc0\xf9\xbc\xf6\x16\x96\x39\x2a\x40\x64\x3b\x07\x9a\xce\xf0\x8a\x3c\x38\xb2\x6e\xdc\x24\x9c\x18\xc0\xa9\x00\x0d\xed\x05\x6d\xb9\x0c\xe2\x99\xed\xba\xf6\x5d\xcc\x4b\xaa\xac\x4b\x31\x3d\xcd\xd3\xfb\x1e\xe9\x85\x39\xf8\xa4\xf6\x43\x84\x26\x41\x34\xbf\x2e\xee\x01\xe0\xf1\x9e\xfd\xda\x5b\xf3\x9c\x4a\x82\xe6\x04\xcd\xaf\x4f\x62\xd5\xbb\x55\xb2\x37\x0d\xcb\xa4\x3c\x08\xeb\xc5\xf8\x63\x0d\x32\x57\xd6\xae\xcf\x13\x9f\xd7\xd7\x9f\xd0\xf7\xf9\xbc\xa7\xb4\xa3\xd8\xd6\x49\xf3\x86\x94\x71\x49\x5d\x27\x20\x27\x05\x20\x39\x07\x9f\xce\x03\xe8\xf7\x9b\x1b\x6f\xe6\xad\xf8\xd0\x6c\xaa\x8b\xcf\xc9\x24\xdb\x2b\x28\xc7\x56\x29\xdd\x28\xc1\x9b\xd6\xff\x6b\x0e\xbe\x86\xfc\xc6\x7b\x18\xea\x0a\xb3\xff\x28\x08\x1b\x6f\xcc\xb8\xa2\x56\x9c\x8c\x5b\xfd\x41\x9e\x83\xb6\x14\x97\x9c\x26\x7c\xb4\xfe\x2d\x43\x73\x5b\xc8\x71\x50\x32\xca\x6e\x86\x7a\x02\xa2\x10\xcb\x99\x19\xb9\xda\xdb\x87\xbe\xde\x8d\xa5\x18\xc5\x9c\x1b\xc0\x94\xf5\xf8\xb3\x1b\xff\xf4\xd4\x81\x6d\x95\x5f\x79\x22\xb4\x73\xef\xa5\xde\x26\x60\x27\x30\x42\x40\x70\xa6\xbf\x73\xce\xfa\xc4\xe8\xef\x03\xd6\xdf\xe7\x7e\xff\xe8\x85\xc2\x88\xe9\xbf\xff\x16\xd0\xf5\x9b\xcf\x7c\x34\xb6\x57\x78\x43\xb3\x72\x6f\xef\x2e\xbd\xa3\x97\x8e\xb2\xfc\x9f\x9f\x0f\x8e\x58\xbb\x17\xaf\x78\x9a\x92\xc9\xe3\xbf\xf7\x57\x9f\xd1\x3e\x8f\x11\xde\xd4\xe7\x9d\x40\x53\x3f\x88\x38\x1a\x1b\x37\xee\x1f\xda\xf8\xee\x6f\xe8\x8f\x73\x32\x56\x07\x9a\xba\x3b\xda\x2e\x74\xde\xdc\x75\xfe\x0f\x9b\x0e\x97\x3e\x14\xf4\x60\x0a\x9d\x1d\x84\x7c\x2f\x3d\x0c\xe2\xc6\x71\x7a\x1c\xfe\xac\x6f\x27\x61\xcc\x87\x6d\xcd\xd4\x71\x95\x93\xff\x12\x3a\xbb\x77\x05\x1a\x9b\x77\x72\xef\xc7\x74\x7c\x18\x61\x86\x48\xf0\xa5\x46\xa2\xa1\x33\x82\x02\xdb\x7b\x5a\x71\x6e\x36\x3a\xb2\xd7\xea\x58\xa1\xd6\x87\x1e\x9f\x20\x31\x76\xac\x09\xa1\xcb\x1b\x7b\x3f\xf1\x30\xfb\x13\xc9\x67\x0f\x04\x3f\xf6\x65\xe6\xc6\x4c\x91\x8e\x67\xba\xf0\xd1\xc6\xb8\xa7\xe3\xea\x81\x04\xd1\x39\xd9\x04\xf3\x32\xba\xf7\x13\xf8\xd4\x48\x03\x8c\x8f\xc9\x8b\xbd\xf4\xb1\xae\xde\xa7\x45\xd7\x0b\x74\x71\xc4\x1a\xcd\x10\x70\x99\x2e\x0d\x76\x34\x95\x36\x25\xf8\x17\xa9\x12\xa0\x73\x09\x3e\xb9\x87\xfc\x9b\xaf\xe1\x44\x62\xd7\xae\x67\xe2\x4d\x87\x61\x78\x2e\x99\xfc\x78\xa6\x69\xb8\xc8\x3f\x6c\x84\xf4\xed\xe7\xa7\xc0\x33\x63\x5d\xfc\x30\x0d\x76\xbf\x02\xec\x18\xe8\x3e\x3f\x82\xa7\x7a\xcf\xc5\x82\x97\xac\xcb\x5e\xc8\xf6\x95\xde\x0c\xf8\x97\x26\x24\xe1\x02\xfc\x18\xf6\x3d\xec\x6d\x38\x7f\x72\xef\xe9\xc4\x89\x04\xfa\xb7\x78\x1b\x9e\x30\x64\xae\x9d\xbc\x27\x22\x71\x18\x1e\x48\x0f\x47\xe8\x53\x52\x1c\xe5\x88\x20\x0e\x0e\x2e\xf9\x31\x00\xfe\x98\x29\xe0\x3d\x27\xb1\x77\x8a\x9f\xa5\x23\xcd\xcc\x8b\xce\x2c\x9d\x45\xd7\x5e\x09\x39\x4b\x87\xf9\x09\x81\x03\x13\x06\x49\xc9\x8f\xf1\xcd\x61\xcd\xb5\xad\x1b\x27\x40\x07\x74\xfd\x50\x23\xfc\x1c\xbd\xc0\x71\xfd\xa0\xdb\xbd\x39\x4d\x17\xa8\x63\x37\x15\x5c\x7c\x3f\x46\x0d\x2f\x12\x7a\xbc\xda\xde\xa8\xdf\x70\xc7\xf9\xbe\x23\xeb\xb8\xe6\x58\x73\x7c\xde\xf1\x35\xc7\x9b\x8e\x3f\x75\xfc\xa5\xe3\x3d\xc7\xff\xed\xd8\x60\xad\xcc\xcf\xba\x95\xaa\x2a\xc1\xb6\xb0\xed\x6c\x17\x7b\x88\x9d\x65\x0b\xec\x09\x76\x95\xfd\x12\xfb\x0c\xfb\x02\xfb\xaa\xda\xf5\x7c\x5b\x51\xdb\xfe\x86\xfd\x37\xf6\x4f\xec\xff\xd5\x1a\xb4\x1e\x35\x49\x1b\xd7\x66\xb4\xa3\xda\x49\xed\x9c\x76\xc5\xbe\x0e\xa8\x8b\x70\x5d\xea\x5e\x45\xf9\xa7\x07\x46\x58\x2a\xd0\x60\xb3\x2e\x7d\x8a\x5a\xe3\xf2\x05\x46\x98\xba\xe9\x54\x1c\xcf\x07\xf0\x1a\x65\x16\x14\x84\x6a\x83\x84\x0d\xaf\xa9\x63\xb1\xdb\x7d\xed\x7e\x6f\xbb\x32\x1d\x4d\xda\x17\xa5\xd5\xf6\x29\xa1\xf2\xa4\x5a\x04\xa5\x7a\xd9\xa8\x5a\xf0\x7f\xd0\x1b\x55\x5b\x23\x35\x7d\x4b\x26\xfc\x0f\xec\x6a\x55\x10\x0e\xd6\x30\xa1\xb5\x23\x4a\x3b\xc4\x2b\x82\x4d\x40\x9d\xee\xa7\xc3\x75\x63\x88\x1a\xb9\xed\x17\x48\x38\x2a\x27\xd9\xb6\xb4\xc1\x6a\xb7\xa5\x8e\x6a\x22\xc9\x44\xd8\x19\x09\xe8\xc1\x88\xcf\xef\x93\x1e\xa6\xe6\x6f\xd5\x96\x47\xfa\x6d\x8b\x9e\x94\x32\xa0\x0d\x44\x02\x4e\x5b\x47\x6b\x2b\xfd\x55\xef\x65\xdb\x4a\xb4\x2b\x01\xad\x6e\xcb\x73\x7f\x41\x52\x36\x66\x3b\x05\xd5\xec\xd7\xeb\x57\x42\xaa\x43\x52\xf3\x30\x9f\x7f\xd4\x9f\xee\xf7\x8d\xd6\xb4\xbf\x8a\x80\xad\x0e\x2e\x82\x01\x3b\x5b\xda\x59\xde\xc3\x6c\x05\x46\xb8\xee\x9d\xaa\xdb\x6b\xa8\xda\x2d\x50\x4d\x27\x62\x1f\xc2\x56\x7f\x97\x83\x36\x1b\xc3\xe9\xb7\x1d\x51\x13\xc9\x1a\x00\x48\xe9\x2a\xda\xfd\x69\x75\xc2\xab\x9e\xa5\x86\x89\xf5\x5d\x91\x53\x3e\x70\x37\xb5\x09\x73\xa9\x74\xb5\xf1\x0c\x56\xbf\x73\x5d\x2d\x03\xd3\x29\x25\x99\x4b\x47\x6c\xfe\x5d\xba\x06\x6d\xb5\x57\x73\xce\x9a\xb9\x52\x50\x0f\xda\x76\xf8\xb5\xb1\xa1\x5d\x2d\x24\x6c\x8a\x6b\xcd\x34\x22\xa8\xbd\x1d\xbd\x32\x20\xb3\x03\x87\x63\x91\x83\x85\x9c\xc8\x14\xad\xc4\xee\xe9\x7c\x61\xe0\x9c\x04\x27\x1e\xb3\xa2\xd1\xbc\x78\xb6\x3f\x13\x2d\x77\xba\xe7\x01\x42\x96\x17\xac\xeb\x4f\x9f\x34\x37\xde\x90\xb2\x18\x47\x71\x51\xf6\x84\x93\xd3\xb9\x68\x47\xf0\x96\x21\x8a\x7d\xa7\xb3\x06\x90\x69\xee\x8d\xaf\x48\x18\x84\xd6\xc1\xe8\xb7\xc5\xdb\xe8\x9f\x8d\x67\x36\x96\x6e\xb4\xb9\xcb\x7b\xaf\x22\xc6\x33\x0a\x94\x10\xba\xd3\x7a\x58\xe6\x08\x0f\xe9\xa0\x60\x2a\x8b\x1b\x45\x08\xe7\x31\x42\xba\xaf\xb3\x05\x59\x2a\xa1\x34\xfb\x7d\xc4\x25\x5a\x59\x2b\x0e\x85\x01\xb3\x80\xf5\xbb\x4b\xb4\x6d\x94\x10\x9d\x04\xe1\x4c\x44\xcb\x93\x2c\x71\xe2\x20\xde\xf8\x30\x17\x97\x3a\x96\x0c\x7d\xe3\x45\xde\xe2\x86\x20\xc9\x8f\x0f\x67\xf9\x96\x8d\x7f\xc4\x32\x88\xfd\x84\x9d\x28\x64\x8b\x51\xd2\xaf\xba\xd7\xff\x6c\x66\x94\x96\x35\x03\xd1\x79\x39\xbc\x93\xaf\xff\x08\x59\xca\x6a\x8e\x0a\x89\x65\x5a\x7f\x1f\x31\x84\xd8\xfb\x1d\xe7\x08\x2b\x5c\x6c\x39\xd4\xd9\xb6\x4a\x73\xe2\x44\x37\xda\xdb\xae\x67\xb0\xc8\xf9\x63\x9e\x50\x2a\xc1\x2b\x9c\x92\x52\xd0\xfa\x7d\xd3\x4c\x52\x01\xd5\x5c\x37\x47\x12\xbd\x13\x59\xd0\x60\x47\x68\xb0\x95\xfb\x3b\x6e\x11\xa8\x69\x1f\x51\x70\x07\x7b\xa7\x8c\xae\xf5\x3f\x42\x99\xe0\xd9\x0d\x9d\x41\x66\xa9\x77\x40\x48\xe7\x2e\x32\x80\x8a\xba\xbb\xe0\x1c\x1e\x9f\x3b\x0c\x6d\x92\x13\x95\x31\x67\xc6\x38\xf1\xf5\x02\xe2\xa6\x25\xc0\x5b\x7b\x37\x6b\x4f\x2e\x22\xea\xde\xb2\x5e\xa1\x96\xb3\xa0\x3d\x01\x6d\x6d\x81\xa8\x63\x96\xb6\x0f\xc2\x58\xa0\x32\x11\x27\x2a\xf0\xf5\x32\x35\x37\x45\x43\x82\xce\x6e\x1a\x19\xe7\x15\x58\xd3\x3e\x3f\xa1\xed\x10\x87\x39\xdd\xe3\x42\x51\x7b\xbd\x42\xb4\x08\xa0\x65\xa7\xcf\xdb\xa3\xcd\x85\xd6\xf9\x50\x42\xa4\x46\x90\x19\x1f\x19\xec\xd3\x6e\x19\x7c\xb0\xa3\xab\xf9\xa0\x9f\x9c\xef\x8b\x50\xc1\xf7\x44\x7e\xfa\xaf\xaf\x3d\x14\x14\xee\x43\x6f\x5d\xf5\x5b\x37\x2b\x59\xc9\xf2\x96\x00\x8a\x77\x6f\x2c\x84\x98\x5e\x58\x0a\xf6\x8b\xdd\x5f\xde\x7d\x98\x9d\xf9\xa3\x8c\x01\x84\x0c\xf4\x79\xb8\xd9\xee\x96\xd2\x14\x9e\x6e\xd3\xd8\xf8\xe6\xc6\x27\x2f\x7d\x7d\xcb\x30\xcf\x14\xff\xf5\x6f\xcd\x89\xe8\x9c\xb1\xf1\x6e\x65\x09\xb2\xb4\xe2\x79\x64\xab\x67\xd3\x73\x96\x80\xe4\xf9\x87\xcf\xd3\x67\x26\xe8\xee\x64\x1e\xc7\x36\x87\x1a\x83\x8b\x95\xe2\x80\x17\x04\x88\x13\xbf\x5b\xed\x2f\x93\xd8\xbc\x17\xf3\x44\x65\x0a\x1c\x82\x41\x4b\x84\xd6\xc3\xa0\xd1\x4d\x02\x07\x7c\x15\xac\x02\xfb\x74\x14\x38\x8c\x8b\x6d\x90\x73\x93\x90\xc5\x35\xa2\x87\x53\xa0\xc8\x79\x48\x7e\xdd\x8a\x86\x96\x29\x2e\xf8\xe2\x64\x7c\x95\x5f\x27\x8f\x17\x26\x24\x87\xee\x5c\x69\x0b\xe7\x93\x92\xa4\xff\x2a\xdd\x84\xe7\x21\x94\x33\x1f\x6d\x30\xd6\x70\x13\x37\xa2\xfc\xc8\x61\x77\x4f\xf0\x0c\x71\xa3\x69\x2b\x8a\xd1\x35\x81\x3b\x66\x88\x83\x42\x82\x06\x4e\x13\xad\x19\xd8\xb7\xd7\xdb\x47\x77\xe6\x0d\x7a\xb6\xd5\xbc\x19\x07\xba\x9f\xe0\xb8\x3e\xb9\x7d\x04\x7c\x19\x31\xcc\x1b\x04\xc8\xc0\x29\xfe\x45\x0f\x6e\xd1\x0b\x6d\x1c\xa0\x35\x5a\xa2\x47\xf4\xca\x64\x08\x77\xe9\xd4\x71\x60\xcb\xf1\xc3\x7d\xe2\x75\xd1\xf8\x4b\x90\xc8\xd0\xe2\x9e\xe1\x68\xd6\x5c\xee\xf0\x47\x5f\xc1\xad\x3c\x64\xcb\xa8\x73\x0a\xd5\xff\xb0\xe3\xe8\x3c\x14\x1e\x36\x79\x35\xd7\x85\x80\xe2\xce\x4d\x31\xb4\xce\x16\x04\x7a\x4f\x0e\xbb\x3b\x46\x4c\xd9\xf8\x35\xe0\x57\x22\x73\xbd\x4f\x82\xfc\x27\x2f\x0d\xf8\x7d\xd4\xf9\x38\xd1\xd2\x24\x15\xb9\x88\xa5\xf7\x09\x4e\xaf\xc8\x47\x8f\x81\xbf\x19\x5d\x1a\x6b\xe1\xf7\x38\x04\x56\x32\x90\x77\x25\x9a\xae\x82\xd6\x10\xd8\x1f\xf5\x34\xf2\x47\x23\xe2\x4a\xea\x6a\x82\x70\x73\xf6\xa0\x09\x83\x02\x5b\x24\x9e\x6e\x76\xf4\xaa\xbc\xe7\x70\x19\x8e\xa3\x8e\x6f\x3a\xfe\x5c\x31\x4a\x7f\xce\x9c\xcc\x62\x61\x36\xcc\x52\x6c\x82\xed\x60\x07\xd8\x43\xec\x24\x3b\xcf\x16\xd8\x32\xfb\x9c\xf2\x71\xf8\x4d\xf6\x7b\xec\x7b\xec\x3f\xb1\xff\xa1\x54\x83\xd0\x9a\x1e\xcc\xf2\x74\xbf\xf4\x30\x75\x4a\x12\x1e\x51\x17\x64\xb6\xcd\x8f\x1a\xb6\xd9\x49\x4f\xe8\x2e\xe5\xc1\x13\x54\x0d\x63\xaa\x06\x16\xf2\xb7\xf7\x6a\x89\xda\x20\xaf\xda\xda\xa5\x23\xc9\x29\xa6\x30\x43\xba\xdf\xf7\x60\x01\x65\x23\x4b\xd3\xc9\x41\xe6\xf2\x29\xf1\x9e\xbd\x13\x4a\xf8\x13\x63\xd5\xbc\xa4\x3a\xce\x74\x32\xe1\xaf\xe5\xc9\x88\xea\x82\x92\x8a\x71\x9a\x1e\x4b\xab\xec\x58\x6d\x43\x53\xea\x8e\x4c\x09\x2a\xd2\xed\xca\x21\xa1\x7e\x3f\x17\xa9\xfb\x1e\x8c\x30\xdb\xe9\x41\x8d\xb4\x02\xea\x38\xad\x9a\x02\x53\xc9\x7e\x57\x1d\x5b\x90\xb6\x57\x25\xf5\xa3\xb7\x74\x52\xe5\x08\x3b\xac\x4b\xdd\x97\x4e\x3c\x10\x37\xdb\x47\x2c\xd5\x1c\xa0\x54\xc6\xea\xf6\xff\x03\x36\x4f\xb8\x06\x6a\x50\x13\x42\xf5\xbd\xda\x9d\x8e\xaf\xce\xc5\x4e\xd4\xba\x58\x5b\x41\x58\x0b\xff\x76\xe3\x96\x8e\x38\xd5\xfb\xf1\xe9\xea\xd6\x4e\xff\xff\xd9\xbf\x2b\x63\x0b\x9b\x1a\xa4\x36\x51\x36\x58\x4e\x81\x78\xfa\x75\xf5\x93\x50\x8e\xfa\xbf\xc0\x21\x6a\xf7\x8d\xda\x68\x02\xfb\xad\xbb\x74\xa9\x1c\x8d\x82\xca\x6a\x49\x91\xbb\x15\xa6\x28\x68\x27\xc7\x48\x4d\x42\xe8\xb2\xaf\x62\x47\x98\xdf\xbe\xc6\xd3\x16\x4f\xf7\xef\x1d\x7a\xb1\x15\x98\x0f\xf5\x1d\xde\xd4\x19\x13\x42\x08\x88\x3e\x0f\x97\x04\xc3\x9c\xef\xdc\xb9\xf9\xe1\xd5\x57\xc3\x7f\x69\x58\x12\x90\xd9\xe6\xa9\x9b\xb9\xa8\xe8\x98\xca\x87\x0e\x8c\x67\x43\x3c\x36\xcd\x07\x9e\x7d\x22\x55\x01\xe1\xb5\x62\xe7\x53\x1b\x2b\x20\x0c\x7e\xce\xe0\x3f\xf0\x6e\x4e\xce\x5b\x2b\x46\xb7\x07\x79\x91\x41\xd9\xbd\x69\xec\x29\x00\x12\x2b\x04\xb4\x7a\xbb\x1b\x36\xf5\x90\x30\x60\xec\xd1\x00\xdf\xc8\x97\x5e\xc8\x45\xb9\x8c\x19\xf3\x56\x31\xdc\x13\xde\x44\x79\x77\x4b\x47\xfa\xf0\x99\x4f\x7d\xfe\xe1\xbe\x1f\x8c\xf8\xa2\x3c\x0f\x34\xa7\x05\xf1\x39\x02\xcd\x01\x62\x0e\x98\xae\x4c\x86\x84\x05\x4e\x82\xe5\x89\x23\x6a\xae\xdf\x35\x76\xf4\x72\x32\xe6\xc8\x3d\xc3\x89\x2a\xd0\xa8\x63\x17\x21\x94\x15\x05\x42\xd3\x0e\x18\xe0\xf3\xc4\xb3\x18\xe9\xce\x94\xb0\xfe\x36\xe6\xc0\xae\x67\x4d\x9a\x34\xda\xc6\xba\xfa\xbb\x9c\x1b\xd4\xbb\x19\xa1\x10\x4c\x58\xdc\xcb\x3e\x0d\x8e\xc6\x03\xce\x03\x1b\xe5\x28\x0c\x74\x74\xc5\x03\x3d\x99\x78\x90\x21\xc4\x4c\xec\x88\x94\xd7\x6f\xe4\x0c\x21\x92\x59\x12\x5a\x45\xb4\xcd\x98\xa4\x3f\x04\x90\xb5\x23\x0d\xe1\x3f\xc9\xb7\x0f\x42\x00\xa1\xf5\xca\xa2\xd6\x86\x7c\x1c\x52\x86\x90\xbc\x47\x44\x2c\x07\x39\xed\x6d\x84\x5c\x9e\x5c\x02\xda\x67\x42\x90\xf3\x21\xff\x90\xfb\xb2\x99\x5b\x26\xcf\xa3\xd4\xa6\x2d\xa0\x73\x74\x0d\xe5\x81\x04\xf1\x79\x11\x5b\x5e\x10\x05\x9f\xbe\x71\x73\x91\x76\xba\xee\x2d\x72\x73\x21\x76\xe3\x5c\x1f\x2f\xc5\x72\xa5\x10\x22\xdb\x5d\x46\x93\x7f\xd3\xb9\xcf\x5d\xea\x6a\xdf\x9d\xe3\xfb\xac\xd8\x70\xcb\x16\x34\x35\xf9\x3d\xbd\x0d\xd4\x95\x18\x6a\xda\x34\xae\xbf\x78\xea\xfb\x1b\xff\xcf\x13\xe9\x6a\xa7\x80\x26\xde\xf9\xf1\x8e\xd8\xea\xa5\xf0\x97\xc5\xf8\x5c\x29\xd7\xe4\x5a\xd8\x14\xee\x19\xce\xac\xac\x4c\x65\x83\x4d\xb7\xbe\xba\xb9\xdd\xd8\x78\x11\x08\x74\x9d\x78\x7e\xce\xbb\xeb\xf9\xa7\x37\xcf\x61\x6b\x7f\x19\x2f\xa4\x76\x8b\xa1\x5f\xbe\x10\x08\xc2\x03\xaf\xec\x01\xfc\x81\x61\x2f\xba\x1a\xc8\xe5\xfc\x9d\x12\xf7\x3c\xbc\xf5\x99\x1e\x77\x3c\xdc\xb9\xfb\xe1\x70\xbf\x34\xfa\x23\x5f\x19\x37\xfb\xe5\xde\xaf\x6c\xdb\x7e\xa9\x7c\xf6\xc4\x8e\xd4\xb8\xe7\x9b\xf8\x68\xa0\x09\x5f\x23\xe7\x57\x00\xfe\x35\x34\xf9\x3e\xed\xd9\x37\xa4\x77\xf2\x51\x6c\xa5\x9d\xed\x18\x38\x12\x9d\x3d\x32\x4b\xde\x9e\xaf\xea\xec\x0b\x9e\xce\x3f\xc0\x68\xb8\xf7\x43\xdc\x3b\xda\x76\x6e\xce\xff\x49\xe8\xae\xe7\x5b\x24\xe1\x71\x22\xe7\x45\x2c\x74\x64\xcc\x7b\x5e\xef\xc8\x40\x6f\x17\x3e\x46\x4b\x7d\xe4\xc1\x66\x21\x2c\xdf\xfb\x98\x35\xcf\x6d\xc2\x56\x00\x5e\xf4\x47\x1a\x10\xd8\x54\xd0\xe7\x8e\x10\xc6\x9b\x00\xda\xd3\xe2\x3f\x76\x2c\x8c\xb8\x68\xea\xed\xec\x0a\xec\x35\x3d\x6d\x95\x01\xff\xd6\x27\xa2\x8d\xfa\x8e\x8f\xfa\xb9\x34\x7d\xfc\x44\x97\x4e\x57\x1a\x2e\x9e\x49\x0e\x37\xb1\x0f\x35\x1d\x0f\xcd\x03\xfe\x74\xab\xbe\x05\x1d\x5f\x27\xbd\xe1\xb3\x13\x78\x18\xbb\xe4\xe9\xd3\x5c\xd7\xc9\x1b\xdb\x15\xf6\xa2\xed\xc5\xed\x4f\xb7\x43\x1c\xeb\xf5\xb6\x9e\xea\x6f\x1c\x27\x7c\xa6\xf9\xc0\x67\xa0\xe3\x65\x22\xef\x35\x31\x7a\x7b\x6e\x26\x49\x97\xc8\xed\x7e\x39\x0c\xed\xb1\x9e\x30\xdc\xe5\x3d\x1d\xfc\x25\x40\x5e\x75\xb9\x70\xad\xe1\x19\xa0\x75\x11\x98\xdd\x56\x0d\xe5\x7d\x2a\x9e\x2f\xba\xfa\x1d\x7b\x1d\x2f\x39\xee\x3a\x5e\x71\xfc\xae\xf2\xe6\xf9\xbe\xe3\xaf\x1c\xef\x38\xfe\xc1\xf1\x4f\x6a\x47\xe3\x62\x1e\xd6\xc5\xa2\xb5\x4b\xc2\xdd\x6a\x4b\x73\x9a\x5d\x65\x2f\xb2\x8f\xab\x5e\xe6\xd7\xd9\x6b\xec\x1b\xf6\xcc\xaf\x1a\x20\xdb\x7b\xab\xfd\x89\x8a\x12\x35\xe5\x95\x4f\x5d\xfe\xf9\x5c\xba\xe6\xf3\x07\xaa\x71\x59\x39\xb8\xd9\x9c\x4d\x9b\xb4\x19\x74\x05\xed\x69\x60\xb5\x05\x19\x55\xd5\xad\xab\x1a\x26\xfc\xe9\x51\x7f\xb5\xbd\xb1\x5f\xde\x3e\xc1\x14\x75\x33\x35\xe6\x1d\x9b\x62\x6a\x6c\x58\x8d\x96\xb6\x2f\x69\x3a\x1c\x0c\x0f\x32\x9b\x20\x53\x43\xac\xf4\x32\xdf\x58\xea\x01\xf6\xc5\x8e\x65\x2a\x5a\x2a\x7e\x9d\x8a\xd6\x2e\xc5\x79\xae\x7e\xb4\xae\x21\xab\xd3\xdf\x94\x8e\x20\x19\x09\x6f\xad\x7d\x24\x1d\xf1\xb7\x2b\xde\xd8\x20\x7b\x60\x9e\xaa\x56\xf0\xaa\xfd\x49\xd4\x34\xd1\xf5\x0d\x8c\x1a\xea\xa9\x53\x3f\x75\xfc\xa8\xdb\x29\xc3\x16\xb5\xa9\x35\x8a\x6a\x54\x6a\x9b\x12\x3b\xd8\xa6\x6b\xab\x7d\x55\xca\x27\xd2\xb5\xcf\x4b\xd7\x34\x01\x29\x75\xd9\x5c\xfd\xd4\x9a\x8e\xa1\x3e\xc2\x53\x67\x98\xc1\x07\x02\xb8\xda\x04\xf3\x81\xce\xda\xce\x1d\xba\x6d\xc6\xa0\x1c\x0e\x22\x6a\x9d\x13\x49\xb9\x6c\xf6\x28\x7b\x2f\x2f\xde\x92\x07\xfa\x62\xcf\x6d\x42\xe7\xe3\xee\x16\x34\x5e\x9a\x17\x24\x00\x2e\x21\x88\xf3\x12\xb8\x95\xd8\x01\x44\x51\x2d\x5b\x2c\xdf\xd3\x09\x67\x2e\x0f\x98\x4b\x9b\x23\x6d\x3d\x7d\xde\xe5\x6c\xca\x8b\x7b\xfc\xfe\xcd\xe6\x91\x90\x7c\xa5\xaf\x57\x58\xd1\x38\x0c\xe1\xee\xa1\xf0\x8c\xe0\x21\xff\x78\x54\x00\x32\xd9\x32\xba\x36\xcf\xc9\x94\x9c\xcb\x1b\xbf\xf1\x14\xbc\xec\x7f\x99\x66\x19\xc0\xa2\xe0\xb8\x8e\xd8\x4d\xa2\xc7\xba\xf0\x5c\x5b\x7e\x1a\xbc\x67\x78\x63\x01\xbc\x24\xc9\x38\x18\x41\x74\xbe\xed\xa2\x44\xd7\x91\xf9\x43\x9b\x28\xbe\xbf\x33\x1a\x5a\xff\x51\x54\x20\x96\xf4\x6c\xa6\x10\x37\xd8\x8a\x7f\x1f\x50\xb9\xb3\x69\x8f\xbc\xd2\x48\xeb\xdf\x86\x65\xf2\xd7\x87\xdb\xc2\x6d\x31\x0e\x60\xc0\xcb\xde\x40\xc9\x00\xc6\x8e\xd3\xd4\x76\xf0\x91\x7d\xd5\xba\xa9\x22\x09\xab\xb0\x80\xee\xe0\x34\x78\x26\xdf\xa8\x23\x9a\x27\xde\x73\x0a\x82\xca\xa6\x5b\xf3\x1e\x31\xe4\xcc\x18\x5f\x91\x14\x39\x02\xe4\x72\x0f\x45\x08\x2b\x24\xb8\x5c\x02\x2d\x09\x03\x85\xcc\x9a\xb1\x46\xa1\x39\x49\x25\x93\xf4\xa1\x39\xda\x31\x45\xd1\xb6\x3d\x71\x1e\x6d\x70\x2e\x19\x40\x3c\x0f\x03\x0d\x2f\x41\xdc\x3e\x32\xc2\x79\x66\xb8\x87\x4c\xe7\xd4\xc4\x40\x4b\x4f\x67\x5b\x56\xc8\xf6\xfd\x3c\x3e\x8f\x4c\xcf\x27\x38\xc8\xd5\xcf\xd1\x0b\x8f\xb9\x73\xcf\x88\x78\xc5\xe3\x6a\x95\x06\x88\xfb\x25\xbc\xf0\x46\xfd\xe0\x5b\x36\xbe\x76\xb0\xeb\x3b\x7f\x5d\xad\x7c\xfd\x48\xdc\xb8\x16\x66\x01\xf6\xf5\x0b\x5d\x6d\xd3\x01\xd1\x32\xde\x54\xca\x48\x02\x7a\x37\x97\x66\xd0\xbb\x47\xfe\xdd\x99\x3f\x4f\xdc\x01\xd2\x8f\x3e\xfa\xe8\x48\xef\xc4\x36\xe6\x7e\xea\xb3\xc0\xe7\xce\x74\xb7\x84\xdc\xed\x1e\x10\x46\xc8\x23\xb6\x59\x2f\x6f\x9b\x38\xe5\xc1\xd9\x61\xa2\x7b\x68\x68\x89\xde\x01\xbd\xd8\xda\xf4\x35\xe7\x16\x1c\x6d\x92\xfd\xed\xd1\x86\x86\x55\x18\x38\xb6\xdb\xd9\xd4\x90\xb8\xd8\xd0\x00\xdf\xca\xf3\xfd\x74\x78\xd3\x26\x30\x1c\x68\xea\xed\x0e\x88\xf8\x18\x9f\x6a\x69\xe6\x00\x4f\x56\xbc\x9f\x11\x7b\x77\x03\x77\x08\x38\xee\x81\x2f\xa7\x1f\x6a\x38\xfa\x08\x8e\x37\xc1\x73\xcf\x30\xcf\xf5\x98\xf9\x87\xd1\x95\xf8\xe8\xc4\x96\x86\xdb\x1e\x2f\x79\x5f\xc5\x35\xec\x39\x0a\x2f\x8d\xbf\xb8\xab\x6b\xf8\xb9\x86\x6e\xf1\x69\x6c\x19\xf9\x70\x7b\x6f\xf3\x47\x8c\xfd\xe6\xa3\x89\xc8\x67\x26\xfc\x33\x17\xbc\xe2\x52\x72\xc5\x8a\xdc\x3b\x30\xbc\xf9\x89\x2d\x2f\x37\x1d\x91\x78\x2c\x11\xf9\xcc\xfe\x57\x40\x81\x73\x1e\xff\xb5\x08\x11\xdb\xb3\xdf\xd2\x4f\x2f\xfe\x11\x9d\x49\xe0\x5e\xef\xef\xb5\x77\x1d\x7f\x12\x5b\x80\x4d\x5f\xa7\xf4\x99\x2f\x64\x3c\xcd\x47\x13\x33\x83\xe8\xcb\xe9\x17\x4c\x7d\x7f\xc7\x68\x13\xb5\xba\x6f\x46\xf0\x50\xc3\x05\x38\xb7\x93\x40\x5b\x35\xdc\xf5\xab\x98\x77\xcb\xe5\x70\x1c\x70\x7c\xde\xf1\x65\xe5\x1c\xfd\xbb\x8e\x37\x1c\xff\xc5\xf1\xbe\xe3\xe7\xac\x85\xb5\x33\x8b\x45\xd9\x08\x2b\xb0\x4f\xb1\xcf\xb1\x5f\x61\xbf\xc1\xbe\xc7\xfe\x0b\xfb\x3b\xf6\x3e\xfb\x67\x4d\xd3\xdc\x5a\x9b\x72\x9a\x49\x6b\x93\xda\x4c\xfd\xea\xc5\xe1\xf0\x56\x6b\x55\x7f\xb0\x1a\xe6\x74\xbf\xc2\x91\xd8\xae\x9e\x63\xe9\xb1\x44\x52\xd5\xab\x4c\x45\x30\x97\xee\x0f\xe8\x0a\xb8\x55\x03\xa4\x04\x23\x7a\x38\x55\xa3\x3d\x54\x8b\xd8\x54\x30\x9d\x4a\x47\xc6\x6a\xa8\x61\x5d\x81\xf5\x55\x70\xb0\xf5\x52\xa3\xf6\x96\xa4\xfa\xf0\xb0\xed\x45\x2d\x75\xd9\xa0\xb6\xe1\x83\x8a\xb2\x1f\x18\x61\xe9\x48\x6a\x6c\x8a\x8d\xda\xd7\xbd\xba\x2b\x5d\xfd\x5b\xee\xf4\xa9\x78\xa7\x94\xb9\xd5\xbf\xf4\x69\xfb\x6e\x43\x7f\x10\x95\xea\xb7\x6f\xd5\x68\x1d\x54\x76\xca\x4a\x38\x9a\x4a\xdb\x2b\xdd\x60\x40\x5d\x7e\x24\x23\xca\xf3\x72\x2c\x15\xd6\xa5\x22\xa0\xa4\x6b\x65\xa9\xbd\x05\x51\x00\x88\x0f\xee\x34\xd4\x5e\xc3\x3f\x9a\x0e\x06\x22\xc9\x48\x5d\x62\xa4\xa2\x63\x32\xa2\xfb\x75\x55\x8e\x8f\x25\xc2\xb6\x47\x4d\x1d\x08\xa6\xa2\x97\xad\x30\x4a\xa7\x46\x98\x53\x57\xf1\xdf\xc6\x89\x7d\x00\x44\xae\x86\xdc\xa0\xfd\x4a\xdb\x3a\x20\x95\x6e\xff\x85\xd9\x93\x3d\x92\xa9\xf1\x91\xe5\x83\x7f\xd6\x68\x92\x4a\x72\x5b\x0b\x98\x36\x9d\x4b\x6d\x27\x34\xf5\xcd\x26\x23\xe1\x3e\x85\x28\x55\x8b\x25\xfb\xb1\x36\xd2\x7e\x82\xe9\xf5\xef\xcf\x1e\x38\xd5\x27\x34\xb5\x50\x5e\xbb\xff\xb6\x5f\xa8\x0c\x3c\xd5\xf1\x4a\xb2\x7e\x39\x58\xfd\xd1\xda\x19\xa6\x6e\x1f\xed\xd2\x15\x2a\xcc\xd7\xee\x0f\x07\xfd\x35\x89\x6e\x0d\xeb\x1c\xb4\xc7\x31\xa9\x84\xcf\x56\x17\xbc\xb7\xe5\x6c\x1e\xa0\x28\x2c\x10\x72\xb4\x63\x22\x1b\x82\x11\xc2\xf8\x48\x68\x76\x28\xb0\xdf\x02\xc2\x33\xbd\xad\xe4\xed\x20\x1e\x70\xfb\x22\xe9\x1d\x33\xa7\xe6\x60\x88\x39\xf9\xdc\xf1\x71\x7f\x16\x71\x0b\x00\xfa\x1a\x81\xac\x7d\x9f\x82\x68\xd6\x98\x83\x39\xf7\xd5\xa7\xa5\xb0\xa6\x09\xd1\x4d\x63\xe9\x54\x53\xca\xec\xef\xb2\xcc\x64\x61\x70\x60\x76\xbc\xa1\x11\xc2\x5c\xe9\x1d\x00\xc1\xc8\x44\x29\x2f\x3a\x46\xa2\xef\x70\x68\xf7\x44\x99\xe4\x9c\xb9\x9e\x0b\xef\xc4\x43\xad\x19\xd7\xb0\xb6\x46\x30\x73\x20\x3e\xba\xae\x9d\x69\x50\x2e\x9f\x58\xa4\x05\x32\x4a\x82\x6f\xd9\x42\x25\xa2\xbc\x00\xd7\x5e\x31\x17\x49\x8d\x36\x78\xa6\x42\x05\x0b\x5d\x47\xd6\x4b\x17\xda\x41\x0f\x37\x82\x77\xb6\xcf\x43\x5c\xf2\x69\xab\xe8\xdb\x4b\x14\xde\x2f\x69\xb9\xb1\x01\xed\xee\x95\x7d\x23\xe0\xc1\x23\x7c\xfd\x26\xf5\x9c\xe2\x74\x33\x04\x12\x8b\x6d\xee\x06\x67\xeb\xd3\x02\x68\x7b\x06\xab\x10\x27\x9a\xe9\xd0\x28\xa1\xe7\x38\xb0\x0a\xad\x24\xd0\xdb\x2d\xd0\x71\xda\xc0\x12\x51\x0c\x73\xe0\x65\x01\x2e\xe5\x9c\x00\x15\x8d\xc6\x86\x15\xea\x3b\x06\x92\x0b\x84\x1d\x23\x84\xed\x13\xeb\x95\x3b\x38\xb1\x95\xdf\xa6\xe6\x8f\xc8\x3b\x74\x60\x1f\x21\xde\x97\x16\x26\xa7\x0f\x45\x40\x7d\xc7\xe2\x82\x64\xa2\xe3\x16\xe8\x36\x72\xa7\xb5\x09\x43\x66\x92\x02\xc3\xfb\x69\x6b\x82\x73\xdf\xc3\x62\xb1\xc7\x8d\xb7\x3a\x37\x4d\x73\x84\x4f\xd1\xfa\xfd\xc0\x16\x1c\x6c\x62\xef\x93\xa7\xb9\x04\x11\xcf\xc1\x10\xcb\x9c\x2f\x27\x97\x04\x5c\x8f\x8b\xec\x12\xf1\xe1\x9d\x7c\xd3\x4e\xde\xdc\xb4\x8a\xf2\xaa\x20\xff\x0e\xab\x73\xf4\x78\x67\xf4\x19\xb7\x11\x5b\x14\xfb\x82\x1b\x3f\x9a\xcc\x4e\x4e\xbf\xbd\x20\xb8\x2c\xdc\x1b\x1a\xe4\x9b\x86\x11\x3d\xe2\x1d\x0f\x9a\x65\x89\x8a\xcb\xe1\x3e\x3e\x78\x35\x66\x0c\x7d\x13\x3f\x14\xc6\xdd\xf3\xe9\xa1\x7f\xf5\xe3\xdf\x97\xab\xd7\xd2\xaf\xb8\x5d\x73\xd1\xe4\x34\x07\x5e\xfc\xdc\x43\x7b\x8d\xbb\xa5\x2f\x34\x87\xda\x2e\x3e\x13\x48\x4a\xa0\xa9\x11\xc1\x47\xbd\xa9\x33\x5f\x29\xa5\xbf\xf7\x3a\x65\x6f\xc5\xe4\xdb\x3f\x79\x1d\xc0\xf3\x1b\x7f\xb3\x00\x5e\x30\x0d\xe0\xeb\x69\x92\xc0\x42\xf4\xfd\xe4\x77\xff\xf0\xc9\xd2\xb7\xca\x98\x94\x95\xc0\x7f\xae\x6c\xbc\xfb\x95\xcd\x0b\x92\x77\xf6\xbc\x1a\x8d\x02\x7f\xf7\x9f\xdf\x32\x93\x05\x91\x29\x14\x20\x40\x16\x0a\xd8\xb4\xc9\x14\x46\x89\x5f\xd4\x28\x4e\x9e\x3e\x23\x56\x41\x43\x37\xb2\x06\x9d\xeb\xc0\x99\x06\xb1\x24\x16\x2c\x2c\x8d\x4f\x6c\x9e\x02\x15\x64\x89\x87\xe6\xf8\x8a\xd1\x7c\x85\x63\xb1\xa1\xfb\xf0\x94\x14\xf3\xcd\x5e\x18\xc3\xfb\x93\xc6\xb1\x01\x60\x51\xeb\x09\xe5\x73\x4f\xb9\x49\xf6\x5d\x0a\x4d\x4e\x47\x39\xad\x4a\xa3\xa9\x79\xfb\xae\x58\x62\x1f\x19\xbe\x4b\x34\xbc\x6d\x05\xd3\x6b\x02\x46\xea\x9c\xee\x83\xf3\x79\x79\x4d\xc7\xc3\x8c\xae\x35\x11\x2d\xc3\xb8\x5e\x2d\x4d\x90\x7c\xb5\xb0\x2a\x6e\x82\x32\x28\x03\xd7\x33\x9e\xf3\x24\xb0\x24\xa2\xdd\xcf\x82\x7c\x97\xa2\x14\xbe\x08\x9a\xda\x6a\x5d\xf5\xfe\x88\xdf\xc6\x95\xf1\x8c\xd4\x3f\x29\xc2\x4f\x4d\xa2\xf3\x29\xa2\x87\x66\x33\x88\x9e\x6b\xf5\x6f\xd7\xc2\xf4\xb2\x07\xa0\xd6\x63\xdd\x11\x60\x9b\x76\x07\xa0\x5b\xe8\x9f\xca\x2f\x90\xc8\x6d\x71\xc7\xfa\x9f\x05\x1d\x1b\xcf\x34\x5d\xe3\x02\xb1\x25\xe4\xa6\xe5\x96\x8b\x56\x89\x8e\x34\x18\xa1\x86\xee\x45\xdd\x37\x70\x09\x99\x28\x3a\x9e\x8d\xde\xae\x3c\xdb\x2c\x8d\x65\xd7\x1e\xf8\x5f\x12\xb3\x3b\xa8\xe3\x61\x62\x5d\x62\x2d\x77\x13\x14\xde\x1f\x73\x87\x71\xc5\xc7\x6f\x34\x76\xad\xf1\x4b\x1d\x9c\xf6\x76\x2c\xa0\xfd\x71\x80\xf7\xaa\xce\x6d\x66\x18\xab\x74\xa4\x57\xc1\x57\x41\xcb\x75\xb6\xe4\xaa\xf3\x5d\xc7\x8c\xe3\xba\xe3\x86\xe3\x56\x6d\x8b\xff\xdb\x8e\xdf\x73\xbc\xe1\xf8\x13\xc7\x7f\x74\xfc\x95\xba\xe2\xdc\x60\x3a\x6b\x53\x5a\xaa\x21\x75\xc9\xbd\x8f\x1d\x66\x65\xf6\x28\x7b\x92\xad\xb0\x97\xd5\x7d\xc9\x57\xd9\x6f\xb2\x6f\xb0\x7f\xc3\xbe\xc3\xbe\xcf\xfe\x91\xdd\xd7\x50\xcd\x5b\xbd\x2c\xe8\x97\xfe\x6a\x39\xde\xee\xd7\xfd\x63\x69\x6f\xdd\x2e\x53\xea\x52\xd7\x14\xde\x43\x77\x05\x15\x90\xa8\xbe\x54\x50\xd3\x7f\x35\x2d\xd9\xca\x92\x69\x35\x08\xf0\xeb\x7e\x9f\x7a\x88\x57\xb9\x27\xb7\x27\xc6\x6c\xa9\xef\x94\x56\x4d\x54\x01\xdd\xd5\xe0\x6a\xd0\x83\xea\xf3\x95\x76\x37\x11\xb1\x9f\xa3\x26\x2b\x2e\x95\xa4\x52\xdd\xcc\x56\xd1\xf6\xf9\xea\x1e\x93\xe9\xda\xf4\x42\x59\xed\xeb\xb6\x2a\xd5\x5e\xcd\xd7\x39\xc5\xfd\xf6\xe1\x45\x2a\xdc\xaf\xc2\xa7\xed\xc5\x3c\x66\x03\xc4\xec\x99\xbb\x7d\x3e\x11\x51\x6e\x64\x7e\x9f\x5e\xa7\x73\x29\x22\x90\xb3\x3d\x61\x4b\xa2\xba\x15\x60\xa4\x76\xd1\xe2\x57\xea\xdd\xf0\x07\x98\xc4\x1a\x54\xa3\x86\x5a\x54\xcc\x8d\x0f\x32\x5f\xda\x3e\x94\xac\x71\x40\x12\xc9\x5a\x4e\xb0\x73\x4b\x2f\xab\xdd\x84\x28\x89\xae\x5f\xb7\xdf\x9b\xd3\xa7\xfe\xe1\x77\xa9\x2f\xab\xde\x53\xbb\xbd\xfc\x56\x6b\x8c\x5e\xa6\xbc\xcf\x22\x29\x0f\xf3\x8d\x4e\xb1\x70\xc4\x5f\x67\x3f\x56\xab\x7b\xd5\x61\xd4\x41\x68\xb6\xf1\x58\x24\xa0\xab\x6a\x3f\xe8\x52\xfb\x15\x9b\xfb\xe1\xb3\xef\xdc\x6b\x12\x03\x45\xde\xac\x91\x91\x22\x41\xf5\xf5\x83\xf5\x2c\xf4\xed\x3f\xea\x50\xfe\x4c\x04\x70\x22\x6e\xbe\x9d\xcf\x65\x46\x03\xd7\x17\xe7\xdf\x31\x62\x46\xc6\xd5\x9e\x3e\x18\xe2\xc3\x5b\x56\x1f\xdc\x3e\xca\xf8\xf4\x62\x71\x32\x5b\xfb\x37\x02\x32\xbe\x60\xa9\x10\x8d\x99\xb2\xb4\x70\xcf\xe0\x34\x79\xe0\xd1\xed\x9f\xcd\xcf\x57\xbb\x07\xdb\x1b\xb8\xe6\x0f\xe6\x1d\x88\xc6\x8f\x75\x7b\xff\x9e\x16\xb1\xa8\xbd\xbb\xab\xbf\x22\xd3\xdb\xb1\xb8\x3e\x59\xc4\x21\xb7\xf6\x0a\xb9\x2f\x88\x73\xcd\xa1\x05\xf0\xc5\xf5\xc5\x50\x8c\xe2\xda\x1c\xb9\xf7\x74\xba\x91\x59\x2f\x4c\x9a\x88\xc6\xb5\xb9\x8a\x94\xa5\x58\x19\xd5\xe7\x2e\xaf\xff\x20\x07\xe4\xd9\x4f\x3d\x47\x5a\x75\x5a\x12\xa2\x2c\x28\xb9\x3d\x8d\xf5\x9f\x69\xae\xd6\x04\x68\x3e\x2b\x60\xc5\xd8\x6b\x8b\xe4\x76\x79\x86\x3a\x22\x16\x95\x0d\x0a\xe5\x36\xe6\x31\x8f\x59\x76\xc9\x79\x5a\x8a\x65\xf0\x8d\xb5\x12\xb4\xe3\x6c\xf2\x44\x37\xd7\x2e\x93\x7e\x46\xd2\x72\xdb\xc6\x6f\xe4\x69\x9e\x85\x0c\xff\x11\x08\xf2\xa7\xa2\x54\x11\x58\xda\xf8\x41\x06\x7c\xf2\x7d\x5a\x94\xd6\xfc\xbf\x38\x42\xa2\x31\xf2\xae\x51\x16\xb4\xc8\xe9\xd9\xc6\x58\xf3\xc6\x57\x5b\x75\x32\xde\x2e\x70\x42\xe9\x1d\x6a\x6e\xe2\x4d\xcd\xaf\xd1\x32\xdc\xae\xf9\x98\x89\xc3\x9b\x71\x78\xc0\x58\x90\xd4\x37\x15\x0a\x9d\x0a\x80\x86\xf6\xba\xc3\xd7\xc1\xd7\x88\xcb\xfd\xa3\x00\xdc\x17\x25\x56\x00\xfe\x78\x1b\x3f\x38\x91\x29\x45\x0b\x68\xbc\x42\xe4\xde\xd3\xd4\x4d\xcb\x99\x6b\x4d\xc5\xf9\x38\x16\xc8\xf9\xee\x23\x27\x16\x8c\x2b\x3b\x00\x13\x83\xdd\x32\xda\x7c\x80\xbd\x3e\x9f\x99\xac\x24\xad\x99\x0f\x37\x5f\xda\x78\xe5\xc6\xf9\x63\x37\x63\x59\xa0\x75\xf6\x0b\x47\x92\x80\xe0\x92\x57\x60\x86\x9e\x1d\x12\xdf\xf8\xe5\x5f\x0e\xcb\xfd\x7b\x6e\x0f\x7e\xee\x8d\x05\xc0\x0c\x09\x20\x6b\x6e\xfc\x10\xf4\xd0\x94\x0c\xf6\x3f\xf5\xc2\xdd\xf8\xb1\x0f\x7d\xfb\xad\x81\x44\x7e\x65\x71\xe3\x8d\xd7\x37\x7e\x22\x75\x5f\xdc\x14\xd6\xb4\xc8\xc7\x4b\x30\xad\x39\x43\xf2\xef\x1c\x5c\x92\xc9\xb6\x1e\x10\x04\xcc\x12\x59\x05\x71\xb2\x0b\x5b\xf6\x64\xae\x74\x00\xe6\x62\x94\xbb\xf7\xf3\x82\x61\x95\x05\x9d\x0a\xc7\xdb\x9f\xe3\xb4\x4a\x62\x20\xc8\x33\x24\x8c\xbc\x05\xb1\xdb\x3f\x1a\x36\x81\xd1\xb6\x28\x05\x2e\x83\x0f\x9e\x8c\xf3\x15\x70\x79\x33\xca\xe7\x20\xe6\x4c\xaa\x38\x3d\xa0\x65\x84\x3c\xe7\x05\x9f\xe6\x27\x13\xa1\x98\x36\x4a\x8d\x07\x26\x49\xc6\x05\xb5\xb5\x35\xf5\x0b\xdc\xb0\x26\x3d\x9b\x43\xa6\xe7\x31\x32\x90\xa9\xd6\x17\xc6\x7c\x34\x37\x69\x96\xc9\xc0\x1a\x0c\xde\x7d\x18\xbc\xe5\xd4\x1c\x7f\xb1\x55\xb6\x3c\xc3\x97\xcc\xb5\xa6\x3e\x91\xf7\xef\x8e\x4e\xb7\x3e\x0d\xb3\x75\x6f\xac\xfa\x78\x88\x35\x89\xc8\x00\x24\x32\xd3\xa2\xef\x12\x78\xbc\x88\x50\x48\xf7\x19\x32\xde\xdf\x85\x8e\x13\x12\xb4\x08\x79\xe3\xf0\xd0\x02\x4c\x32\x44\x89\x88\x16\xc0\x2b\xc6\x3c\xef\x72\x16\xa3\x58\x8d\x9d\xe9\xcd\x9a\x58\x36\xce\xf6\x4c\x76\x3e\x6e\xe6\x42\x73\xcb\xe0\x62\xeb\x81\xc2\x75\xc8\xeb\x88\xd2\x99\x41\x81\x65\xc1\xab\x7f\x49\x96\x41\x27\x47\xa2\xd1\x72\xb4\xc4\x97\x40\xec\x84\x89\x55\xe2\x6b\x06\x2d\x82\x96\xaa\xa1\x7c\x57\xf5\x37\x17\xb9\x4c\x47\xd1\xf1\x43\x45\x87\xfb\x67\xe5\x67\xe2\x61\x7e\xe5\x66\x12\x67\x19\x36\xc5\x76\xb2\x7d\xec\x08\x3b\xc9\xce\xb0\x67\xd9\x1a\xfb\x38\xbb\xc9\x3e\xcb\x7e\x45\xed\x8c\xdf\x60\x7f\xce\x7e\xcc\xfe\x96\xfd\x03\xfb\x27\xf6\x33\x8d\x29\x3f\xe4\x1e\x2d\xac\xed\xd7\x2e\x68\x0b\xda\xe3\xda\x93\xda\xb3\xda\x87\xb4\x2f\x69\xf7\xb4\xaf\x6b\xbf\xa3\xfd\x81\xf6\xc7\xda\xf7\xb5\xbf\xd4\xfe\x46\xfb\xfb\x06\x47\x83\xbb\xa1\xab\xa1\xaf\x61\xa0\x21\xd1\x30\xd1\x30\xd3\x70\xaa\xe1\x7c\xc3\x95\x86\xab\x0d\x1f\x6a\xf8\x74\xc3\xed\x1a\x87\xce\x8e\xe2\xd5\x5f\xaa\x95\xa9\x29\x66\xed\x84\x50\xed\x33\x1a\x5c\x75\x23\x30\x45\xa7\x4b\xdb\xc7\x82\x6a\x88\x1f\x09\xa7\xbc\xe9\x88\x9a\x98\x54\x9b\x9e\xea\xc3\xaa\xaf\xf2\xfb\x12\x6d\xe9\x31\x16\xa8\x46\xfb\x44\xc4\x76\x74\x54\x53\xe8\xf6\xee\x6a\x4f\xa4\xbb\x7c\xf6\xd8\x38\x95\xf6\x8f\xa5\x93\xde\x31\xaf\x1a\x95\xd4\x3b\x9f\x5a\x62\xa9\xc6\xc7\x74\xfd\x8a\xbf\xa6\xe1\x1d\x64\xae\x6a\x82\xd2\x83\xea\xd1\x11\x3b\x37\xa5\x23\xf6\x3d\xbb\xee\xf2\x68\xb6\x40\xac\x97\xd9\x76\x9b\xd5\x1e\x21\x35\xea\x4f\x85\x6b\xc8\xa7\x74\x5f\xdd\x0a\xa5\x1a\x53\xfb\x95\xa7\x7f\xa4\x76\x12\x98\x0e\x7e\x40\xc2\xb7\x6f\xcf\xd5\x0d\x5f\x35\x62\x26\x13\xe1\xfa\xe5\x85\x0d\x66\x4a\xaa\x4d\x74\xc0\x7e\x4e\x0d\x03\x95\xaa\xdd\x1f\xaa\x9b\x74\x5f\x3a\x61\x1f\xa3\x3b\x6b\x80\xbc\x64\x7d\x24\xa5\xda\x16\x5f\xc2\xb6\x28\xfb\x40\xce\x9b\xb2\x7b\x17\x3b\xa5\x45\x9c\x32\x51\xff\x43\xb5\xae\xb6\x41\x00\x3e\xbf\xad\xb1\x4a\xf6\x3f\x48\x37\x4e\x57\x37\x1b\xb5\x91\xff\xb5\xb5\xba\x7d\x60\x62\x27\x3f\x95\x4b\xdb\x13\xa3\x8a\x28\xe5\xaf\xd9\x6e\x2a\x38\x8a\xd3\xdf\xee\x97\x4a\xd1\x55\xbf\xe0\xb4\xa5\x60\x49\x5b\x37\x66\x5f\xe4\xbb\xaa\x3f\x2d\x95\xbc\xf4\x0f\x6e\x5e\xd4\xd8\x5f\x5d\x34\x8e\xda\x3e\xd3\xca\x6b\x74\xac\x2e\x7a\x4e\x28\x53\x34\xf9\x81\x70\x2d\xa9\xba\x9d\x6a\xd3\x53\xb3\xdd\xf4\x25\x6a\x38\x15\x7d\x74\x8a\x25\x1f\x98\xaa\xda\x9d\x68\xc0\xee\x4e\xd3\x75\x7f\x6b\xdb\xea\x4c\x2a\x56\x82\x7d\x93\x12\xae\x0d\xcc\xd4\x37\x98\xa8\xa3\x19\x6a\x8b\x98\x3a\x88\x59\x97\xfe\x51\xdf\x98\xda\x96\xd4\x7e\x9e\x7e\x9f\x1e\xb1\xad\x0a\x14\x21\xa6\x4e\x98\x71\x2a\x3f\xec\x54\x20\x12\xd4\x5d\xb6\x51\x43\xc4\xd6\x0a\x04\x6c\xde\x82\x52\x03\x2a\xa4\xb2\x6a\x25\xeb\x5b\x74\x5b\x45\x67\x7f\xad\x76\x3b\xe9\x46\x6a\x79\x58\x2d\xec\x47\xeb\x60\x43\x05\xde\x52\x72\x73\x7b\x2b\x52\x7f\xc7\x41\xdd\xe7\x97\x13\xcc\xf6\x44\x68\x4f\x84\xeb\xd4\xec\xa0\x5e\xcd\xfc\x89\x94\xf6\x8e\xd9\xb6\x6d\xb5\x8e\x0e\x20\x22\x60\x77\x7a\x32\x33\xb5\x79\x73\x62\xf1\xcd\xc7\xd2\xa1\x64\xa8\x68\xed\x4d\xf5\x07\x21\x94\x81\x5a\xe3\xe0\xec\x91\xec\x5c\xf2\xba\xd5\x13\xb0\x0a\xc0\x5c\xd4\x8a\x67\x66\xfb\x6f\x92\xa4\xcf\x1f\x1d\xdd\xd8\xc9\xb9\xa8\x06\x72\xdf\x48\xac\x02\xc1\xc5\xa4\x01\xc4\xe2\x31\x2b\xd8\x0d\x92\xc7\x9c\x6f\x58\x25\x8b\xb8\x49\xf8\x85\xff\x79\x77\xc7\x00\xd9\x1c\xb1\xe2\x91\x33\x9d\x1f\xee\x88\x98\x96\x21\x8b\xf3\x2f\x1d\x0b\xf4\x70\x7f\x6b\x35\x27\x28\x63\x28\x60\xda\xe0\x19\x2b\x9b\x8d\x85\x52\x13\x41\xad\xab\x59\x47\xdb\x26\xb2\x50\x82\xbe\xbb\x63\x7d\x9f\x49\x1c\x5a\xa1\x84\x92\x16\xc3\x64\x1c\x0d\x3f\x1f\xc9\x22\x8b\x02\x37\x43\x31\x70\x8c\x8c\xff\x7c\xad\x7f\x0a\xbb\x3a\xb4\xfc\xd0\x20\x00\x7d\x5c\x6a\x80\x7b\x1b\x1f\x98\xcd\x86\x42\x93\x3f\xff\x96\xeb\x14\xa2\x9a\xdc\x1c\x31\xe3\xec\x2d\xda\xd3\x43\xc5\x0d\x23\x4f\xf9\xf5\xd7\x26\x0d\x9a\x6f\xf8\xe9\x96\x61\x8e\x0a\xee\xd1\xfd\x6f\x47\x5b\x3a\x2d\x4c\x83\xf4\x7e\x8a\x91\x24\x4f\xa3\xb6\x30\xd1\x27\x78\x05\x8d\x1b\x67\x90\x18\x42\x71\xfd\x8d\x3c\x1a\x16\x4a\x1c\x95\x8d\x8a\xc8\x83\x8a\x20\xb6\x98\x4a\x43\x6f\xf4\x8e\x47\xf5\xfb\x27\x80\x8e\x09\xf0\x86\x28\x75\x1d\x04\xf8\xc8\x56\xac\xdf\x95\x94\xe9\x71\x17\x41\x4d\xad\x71\x6c\x2c\x63\x28\xc1\xcb\x5a\x94\xe6\x28\xcf\x32\x05\x93\x16\xe9\xfe\xf5\x79\xb7\x2b\x94\xe4\x5a\x32\x4b\x56\x88\x59\xd9\xa6\x6e\xa2\x05\xf7\xfa\xef\x13\xbc\x9b\x03\x6d\x58\x62\x22\x09\x9a\x64\xb2\x73\x8b\x49\x5b\x36\x01\xfc\xfe\xb7\x26\x85\x6b\x86\x11\x2d\x12\x4e\xb5\x60\x89\xce\xb5\xa2\xd1\x2b\x73\xd1\xc6\x06\x74\x34\x15\xab\x75\x3f\xb5\x74\x4e\x87\x4c\x2d\xce\x77\xf4\x12\x15\xa9\x40\x94\x07\xa5\x07\x78\x72\x70\xfb\xc6\x7b\x88\x53\x60\xfd\x8f\x1b\x7b\x29\x4e\x9a\x69\x91\xb1\xfe\x26\xe9\x3e\xba\xd3\xf6\x38\xd1\x2a\xef\x3f\x47\x74\xb6\x13\x6e\x37\xf8\x32\xe7\x49\x91\x8f\xc1\xcd\x2e\x13\x27\xfd\x3b\xc5\x46\xbd\x04\x19\xd8\x86\xed\x23\x10\x79\xa0\xb4\xbe\xe6\xfe\x30\xa1\x71\x62\x73\xaf\x81\x85\x18\x8d\x9e\xd5\x96\xd0\xb1\x8b\x3a\x77\xae\x2f\xd1\x9a\xe0\x1d\x6c\x1d\x05\x81\xd2\x7a\xf9\x3a\xdd\xc0\x4d\xc2\xf4\xa4\x70\xbb\xa2\x15\x24\xdb\x2e\x1b\xda\x8a\x95\x05\x75\xee\x24\xce\x73\x92\x1f\x6e\xc4\xb6\xd1\x16\x57\xf3\x89\xf5\xec\x4d\xba\xa9\xad\x55\x0c\x2c\x63\xbd\x78\x1d\x34\xbb\x43\x5b\x2a\x87\x40\xde\x27\xd7\x8b\xf9\x49\xb1\x67\x8f\xb6\x70\xbc\x47\x10\xfa\x9e\xe0\xd9\x0c\x08\x37\xe8\x68\x98\xf2\xb2\xe9\x51\x93\x68\x7d\x69\x0d\x2b\xd0\x44\xe3\x13\x32\xb8\xbb\xa1\x7b\xfd\xcd\x15\xa2\xc6\xc8\x1c\x28\xb4\x48\x44\x6b\x73\xae\x99\x0e\xff\xac\x0f\x98\xea\xa6\xe3\x6e\x6e\xdc\x04\x77\x99\x6d\x3d\x47\x47\x05\xc0\x79\x56\x40\xce\xc5\xac\x38\xff\xc8\xb5\x27\x86\xb6\x68\x85\x7d\x69\x39\xbc\xf1\xe3\x7f\xfd\x5b\xe7\x36\xbe\xb2\x88\x72\xdb\xc5\xbe\xe0\xee\x3f\xad\x7e\x62\x7c\xf9\xd3\xff\xe9\x9a\x47\x4e\x5b\x95\x4d\x7b\xd8\xfd\xa8\xfc\x6e\x65\x6f\xca\x5a\x69\x6d\x12\xc9\x53\x87\x52\x97\xa6\xbd\x1d\x71\xf6\xd7\x67\xe2\xf7\xe7\x8c\xd7\x32\xd7\xdf\xfe\xc4\x4c\x32\x9a\x14\x7d\x5d\xe3\xc1\xd5\xc5\xc9\xea\x5f\x96\x9f\xfd\x30\xb3\x6b\x80\xcc\x6a\x41\xfb\x58\xa2\x97\x7d\x68\x98\x8d\x26\xef\x26\x0d\x69\x89\x90\x19\x32\x56\x60\xae\x65\x80\x1f\xc1\x04\xc5\xfb\xfe\xfb\xbf\xf9\xf1\xde\x5f\x17\xb9\x9d\xc3\xb1\x9e\x8f\x6d\xfc\xf4\xdd\x2f\x77\x14\xe2\xd6\x8a\x58\x00\xb2\xc0\x3c\x8c\x9f\xc4\x0d\x99\x5c\x7a\x73\xad\xf4\x91\x93\xc5\x86\x45\xd0\x24\x32\x16\xfc\x67\x00\xe4\xb0\x2d\x0c\xd3\x84\x90\x52\x96\x43\x15\x60\x85\xc7\x62\x45\xe2\xd1\x38\x59\xc8\x47\x43\xfe\x93\x26\x4d\x66\xe4\x11\x2f\xf8\x54\x9f\x9c\x13\x04\x8a\xcd\xf1\x79\xc1\x97\x79\xa8\x08\x1e\xca\xf7\x74\x36\x4e\x88\x6d\x9d\xd6\x5c\x48\x2e\x13\x56\x85\xd9\x3f\x62\xce\x8b\xee\x29\xce\x8d\xa2\x78\xa4\x0b\xfc\xba\xd2\xdb\x97\x8c\x39\x0b\xd4\x72\x0a\xd0\x66\x48\x4e\x83\xda\xdc\x05\xf3\x62\x0f\xc7\x0d\x21\xe7\x62\xc9\x79\xc1\x0b\x32\x6b\x2e\x12\x70\x2b\x27\x4a\x64\x2e\xc9\x4b\x7d\x46\x31\x06\x20\x84\x02\xc8\x9a\x94\x53\xbb\x21\x07\x4e\x43\xc4\x04\x95\x62\xdc\xf3\x12\x41\x1f\x98\x94\x8b\xa6\xcc\xf1\x45\x2e\x8a\x04\xff\xc1\xd0\x1a\xbf\x99\x45\xc9\x9a\x8c\x6a\x2e\xd1\x3e\xc3\x27\xfa\x42\xa5\x26\x27\x97\xd7\x79\xac\x18\x87\xb8\x17\x8b\x26\xa9\x2f\x61\x50\xce\x24\xa4\xb7\x03\xa6\x91\x21\xe1\xdd\x4e\xc6\x0d\xd0\x33\x6e\x04\x9e\x23\xba\xd4\x9f\x09\x9e\x8c\x9a\xa1\x92\x89\xdb\xb4\x39\x68\xa5\x76\x59\x66\xa8\xc0\x69\xde\xe8\x3e\x4c\xf3\x44\x47\xc3\xad\xcf\x6e\xdb\x62\x21\x14\xb5\xe2\xc4\xa5\x01\x22\x2e\x4d\x61\x51\x29\x4e\x5d\x91\xde\xab\x74\x83\x8b\x99\xe3\x74\x7c\xcc\xba\x4d\xab\x8b\x03\x4d\x42\x86\x8c\xb6\x16\x6e\x95\xad\x05\x3e\x49\x27\xba\x71\xaa\xcd\x0c\xe5\x4d\x2c\x72\x7a\x55\x22\x37\x6d\x84\xe4\x4a\x53\x3f\x3f\x74\x56\xf2\x81\x5d\x94\x9c\x96\xbc\xfb\xd3\x02\x72\xe8\x92\x89\x22\x87\xb1\x60\x58\x6b\x44\xb7\x40\xf2\x2e\x4d\x1d\xe4\xd6\xf6\x4b\x3b\x12\xd7\x8d\xe8\xd8\x18\x48\x16\xa3\xad\x9e\x79\x0e\x7e\x8c\x01\x47\x37\x39\x0f\x57\x26\xc3\x9f\xe2\xaf\x86\xfc\x8f\x11\xc4\x1a\x10\xf8\x18\x11\x76\x9d\x0f\x5d\xb7\x4c\xdc\x04\x5f\x8e\x8b\x3d\xc7\xad\x17\x99\xe4\xd4\xfe\xa9\x6a\xe1\x28\xe8\xee\xe2\x74\xf4\xa6\x21\xe8\x16\xee\x72\x24\xae\x12\xb6\x9e\x36\xc4\x1d\xa2\xc9\xed\x7e\x89\x9b\x9c\x6e\x13\x8d\x6d\x93\x7b\x07\xb0\xcf\x8f\x65\xe0\x3a\x08\xb5\x3d\xde\x4f\x9c\x6f\x3a\xb2\x8e\x8f\x39\xbe\xaa\xa6\x03\xdf\x74\x7c\xd7\xf1\x7d\xc7\x5f\x30\x8d\x35\xb2\x16\x66\xb0\x71\xb6\x95\x65\xd9\x5e\xb5\xbd\x3b\xcb\x2a\xec\x0a\xbb\x5e\xab\x2a\x7f\x9b\x7d\x87\x7d\x8f\xfd\x4f\xf6\xcf\x9a\x5b\x13\x36\xf3\xb3\x97\x49\xdd\xe5\xd3\xfd\xca\x5f\xdc\x76\x8b\x0d\xd4\xb1\x12\x1e\xfb\xa6\xd7\xae\xf2\xaa\xbf\xc6\xa6\x58\x2a\x19\x69\x88\xa4\xd4\xa4\xdb\xa7\x8a\x46\x66\xef\xf3\x06\xed\xb9\xa8\xb7\xfa\x88\x06\x97\x7d\x89\x34\xca\xea\xd6\x14\xca\x23\x2f\x59\xdb\xfb\xa5\xc7\x52\x91\x84\xbf\xe6\xe9\x94\xb4\xbd\xf8\xd8\x07\xcb\x3c\x7b\xa8\x10\x88\xd4\xd5\x78\x4e\x7f\x5a\xe9\xbd\x95\x3c\xdf\x5f\xed\xbc\x9d\xfe\xba\x32\x63\xcc\xf6\x79\x4d\x27\x94\x24\x5e\x25\xe7\x88\xd3\xef\x0b\x2a\x8d\x42\x4d\x0a\x27\x15\xe0\xad\x66\xd1\xaa\xb6\x85\x52\xbd\x52\x79\x63\xd8\x78\xb7\x88\xb2\xcf\xf3\xfb\xea\xd6\x0e\x8a\x24\x51\x2d\x51\x14\x10\xca\x36\x8e\xa8\x01\xa2\x6c\x27\x89\x07\x66\x50\xa9\xa4\xb3\x5e\x3c\xfa\x6d\x5d\x62\x3a\x19\x09\xeb\xbe\x60\xfd\x10\xea\x81\x07\x52\x3a\x51\xad\x90\x7c\x35\xe6\xb2\x7a\x8f\x6a\x5c\xa0\xd0\x9e\x7e\xe5\x8a\x55\xd3\x73\xd8\x45\x99\xd2\x0f\xda\x6f\x3a\x12\xd4\x95\x6f\x86\xe2\x25\xd5\x9d\x25\x22\x75\x62\x9e\x8d\x32\xb5\xa7\x0f\xf5\xc1\xbe\xbd\x77\xad\x15\x36\x89\xb1\x74\x22\x15\xa9\x19\x41\xd9\x5c\x67\x5f\x7b\x8d\xb5\xec\xf7\xe9\x75\xa6\x5e\x22\x15\x69\x78\x77\x2c\x90\x2d\xd3\xab\xef\x42\xa0\x6d\x26\xcf\xe7\xc2\x5b\xa6\xb3\x27\x9a\x0d\xb8\xc3\xdf\xd9\x1a\x3b\x15\xd8\x3a\x68\x86\x8c\x42\xb2\x68\x24\xb3\x99\x55\xdc\xb3\x0a\x2b\x06\xd2\x9f\x3c\xb2\xf1\x65\x32\x28\x16\x1a\x0d\x50\x31\x16\x5d\x88\x2d\xfe\xa0\x02\xdd\x99\x94\xd7\x98\x67\x40\xa7\xe6\x5e\xcf\xe6\xc8\xf8\x40\x5a\xe6\x63\x86\xab\xa5\x70\x8b\x38\x97\x80\xc8\x4d\xf7\x9d\x7b\x71\x28\xc9\xde\x24\x23\x6b\x10\x75\x8e\x59\x54\xf4\xf8\x4c\x4b\xce\x81\x16\x08\x67\xd6\xbf\x4a\xd2\xe0\x25\x8a\x65\x42\x16\xb1\xa5\xdc\x34\xc1\x75\x1c\xd4\xd5\xb8\x35\x81\x64\x0c\x15\x3e\x34\xb1\x31\xd9\x1f\xa4\x1c\x5b\x2a\xf3\x32\x88\x2a\x84\x05\x92\x45\x41\x0b\x82\xb7\x1f\x25\xff\x43\xa0\x05\x8e\xf0\x73\x90\x28\x8b\x8d\x5b\x0d\x7d\x08\x55\x43\xf9\x2b\x99\x39\x50\xd7\xd6\x50\xdc\x7f\x92\x00\xbe\x48\xa8\x96\x49\x22\x64\xc5\xa9\x40\xf3\xd4\x38\xb8\x56\xfd\xac\x38\x36\xde\x0c\x04\x40\x19\x16\xe3\xd8\x78\x9d\x3a\x0e\xf0\x50\x26\x06\x2b\x0b\xd0\x82\x39\x3e\x42\x15\xb3\xfd\x28\xb0\x18\xaa\xf0\xe0\x0e\x88\xe9\x38\x2d\xf2\x0a\x6d\xea\x5c\x04\x67\xef\x92\xa8\xd6\x4a\xa7\x3b\xb0\xb8\xfe\x46\x19\xc2\xe2\xc1\x3e\xc4\x92\xd3\xb4\xcc\xb9\xf7\x3c\x8f\xb5\x1f\x07\x69\xd9\xee\x74\x5b\x0b\xd1\x29\x37\xbc\x27\xc9\xec\x3e\x87\xbc\x01\xb9\x2e\x17\x09\xdb\xc6\x48\x94\x09\x15\x59\x20\xff\x11\x79\x7c\xff\xa4\x81\x45\xd2\x8a\x5d\x47\x40\x3b\x37\xb9\xdb\xab\xd1\xb8\x04\xb7\x96\x43\xcc\xe7\x2d\xf2\xf9\x3d\x2d\x79\xe7\x9b\x99\xce\x67\x42\x07\xbf\xf0\x7f\x7d\x92\x4f\x63\xff\xf1\x47\xd3\x3c\x9a\x89\x47\x2b\x47\x77\xe6\xf2\xff\xa3\x89\xfb\xc7\xb7\xfa\x43\x82\x96\x9a\x0e\xca\x58\xc7\x95\x58\x34\xcf\x83\xe7\x59\x39\x8a\x13\xdd\x85\xdd\x13\x85\x9d\x9f\x2f\x6d\x64\x9c\x2f\x9e\x7a\x6a\xce\x4c\xca\xfe\x73\x1b\xef\x64\xe3\x9d\x17\x36\x7e\x72\x22\x65\x46\x39\x5b\x2d\xac\x89\xb7\x56\xa7\x07\x7a\x3f\xfb\xc9\xcb\x47\x9d\xb3\x3c\xb4\x70\xbb\xfa\x7f\x34\x70\x78\x7c\xa2\x75\x65\x25\x57\x60\xf3\xd1\x2d\x47\x0d\x92\xf3\xa1\xe8\x12\xdf\xd4\x12\x3f\xe9\xc1\x6d\x79\x37\x66\x81\x64\x3c\x70\xd4\xb0\x1a\xd3\x40\xac\x73\x4b\x05\x65\xba\x01\x29\xb1\xfd\xf4\xe6\xd6\x55\x0a\x1f\x0f\xf1\x4d\x9d\x34\x67\xac\xf2\x65\xad\xcd\xf3\x24\x68\x45\xb6\x5d\xf4\x79\xae\x0b\x24\x2b\xa0\xe6\x17\x81\x8e\x8f\xd0\xce\x67\x38\xae\x3b\x27\x10\x03\x85\xa6\x39\x21\x87\xa3\x7b\x08\x5d\x67\xa2\x99\x91\xc7\xc0\x25\x6e\x80\x08\x46\x72\xa5\x53\x9b\x24\x51\x01\x15\x43\xd3\xf7\x8a\x20\xbc\x86\xd1\x4d\x46\xdb\x9e\x43\x01\x0c\xef\x01\x04\x71\x8b\xef\xdd\xc7\xa5\x3c\xdf\x41\xd9\x02\x38\x6e\x47\xf1\x70\x8a\xee\x5a\x98\x39\x85\xbb\x49\xb9\xc8\x03\x67\xc1\xcf\x0d\xf1\x35\xf4\x5e\xeb\x4b\xdc\x06\x65\xc8\x80\x32\xa0\xbc\xea\x91\xab\x12\x77\x84\x34\xc3\x63\xb0\x30\xbb\xbd\x5a\x74\xdd\xa0\xf8\x2d\x08\x74\x1f\xd0\x7d\xa0\x27\x1b\xc0\x67\x76\xfa\x22\x6b\x80\x29\xf9\x24\x3a\x1f\xa7\xf4\x3e\xb1\x08\x5a\x04\x95\x89\x82\x07\x41\xcb\xdc\xe2\x37\x11\x1d\xdb\x43\xd8\xb9\xcd\x02\x2e\xb8\xb1\x20\x8a\xc4\xe5\x91\xa0\x89\x12\x4a\x8e\x1a\xc3\x13\xa6\x8b\x1c\x19\xc7\x23\x8e\x45\x45\x6b\xb8\xe9\xf8\x82\xe3\x2b\x8e\x6f\x3a\xfe\xc0\xf1\xef\x1c\x7f\xed\xf8\x1b\xc7\x7f\x73\xfc\x77\xc7\x4f\x1d\x1b\x4c\xb0\x4e\x16\x64\xc3\x6c\x8c\x4d\x29\x27\xd4\xe3\xec\x1c\x7b\x92\x7d\x84\xbd\xec\x70\x78\xab\x21\x59\xa1\x8c\xc7\x12\xe9\xba\x90\x3c\xa0\x16\x91\x0d\xba\xdf\x67\x1f\x4a\x25\x47\x98\xcd\x60\xa8\x19\xc5\x84\x23\xc9\xb4\x5f\xda\x24\xcf\xda\x26\xb2\x3d\xf1\x60\xff\xe8\xad\xb7\xe0\xc9\x1a\x65\x28\x18\x88\x68\x41\x7b\xf0\x99\xae\xf6\x44\xaa\x3d\xb6\xc9\x0d\x76\xf0\xb3\x69\xc5\xff\x1f\x61\xef\x02\xde\xc6\x79\x9e\x0b\xce\x0f\x7e\xc0\x7c\x20\x7f\x10\x3f\x89\x1f\xc0\x90\x1c\x12\x43\x60\x88\x19\x92\x20\x09\x11\x83\x0b\x45\x50\x04\x25\x48\x84\x44\xc8\x82\x24\x48\x82\x64\x58\x82\x65\x58\x86\x6d\x5a\xa6\x63\xda\xa6\x6d\x26\x96\x1d\xda\x61\x6c\x25\x51\x62\x35\x47\x49\xdd\x44\x69\x9d\xd4\x6d\x9d\xc6\xe9\x71\xdb\xb4\x75\xdb\x74\xeb\xb4\xee\x1e\xb7\xeb\x76\x7b\xf1\xa6\xe9\x89\xdb\x4d\x77\xfd\xf4\x24\x6d\xb6\xf1\xb6\x6e\x4f\x84\xec\x33\xff\x80\x72\xf7\x79\xf6\xf2\xf8\x89\x18\x5e\x70\x21\xc0\xf9\xfe\xef\x7b\xbf\xf7\x22\xa6\x9d\x0e\xab\x41\x54\x72\xf9\x66\xd6\x5c\x47\x48\x65\xc4\xa2\x0e\x3b\x7b\x86\xb8\x83\x29\x81\x08\xef\x98\x1a\x07\x79\xcc\x70\x0a\xb5\xa7\xe3\x63\x9f\x49\x8f\x05\x53\x69\xe1\xfd\x10\x1f\x13\x02\xd7\xb0\xec\x9c\x12\x71\x67\xa6\xeb\xe8\x86\xc4\x94\x6a\xdf\x45\x46\x18\xe5\x38\x2c\x75\x91\x3f\x2e\x7c\x0d\x44\x51\x14\xa9\x14\xe9\x9d\xb5\xdd\x4d\x3f\x52\x11\xef\xe0\x38\x4e\xcb\xb1\x9b\x3b\xbe\x9b\x1e\x0c\x0e\xed\xc2\x12\x9f\x06\x3f\x98\x26\x1d\x5f\x3c\xf1\xfb\x78\x3a\xf1\x45\x3b\x01\x77\x97\x4e\xc4\xae\x73\x86\xdd\x4f\x3d\x3f\x6e\x9e\x1b\x00\x2b\xe7\xff\x05\xbc\xba\xa9\x01\x4b\x00\x18\xb7\x29\x96\xa9\xb4\x18\x22\x24\x68\x82\xe7\x5a\x23\xdd\x6b\x6a\xa2\xb8\x5d\x01\x68\x51\x9f\x81\xca\x40\xa4\xd7\xc3\xd4\x81\xd8\xa8\x7f\xcf\xe7\x43\xbf\x96\xac\x1e\xb9\xed\xe8\xf3\x11\x2f\xf6\x85\x2f\xee\x56\xbb\x18\x78\x57\x28\x6d\xdc\x58\x9f\xf1\x66\x07\x3c\x67\xec\x29\x71\xca\xef\x6a\x61\xf7\x49\x5a\xb7\xc2\x47\x81\x06\xf7\x21\xa2\x0e\x3d\xa7\x41\x09\x2e\xaa\x49\xd7\x45\x3c\xd9\x8f\x89\x06\x05\xcc\x2e\x00\xf6\xdc\x47\xb5\x35\x6c\xd7\x98\x49\x15\x85\x54\xb1\x49\x29\x9d\xca\x02\x28\xe1\x13\x80\xf2\xb0\xd9\x6e\xd1\xf7\x20\x1d\x81\x7c\xfb\x9b\x80\xe0\xf1\xbc\xab\x35\xbc\x3d\xda\x6d\xa7\x62\x47\x81\x56\x34\x60\xda\x91\x01\x0c\x9c\x40\x5c\xed\x99\x5a\x9e\x42\xb4\xe8\x1a\x62\xd5\xe7\xd7\xac\x02\x03\xba\xaa\x0a\x7b\x7b\xd6\xa0\xd0\xa0\x73\x33\x14\xc6\x96\xa1\xc2\x39\xc0\xde\xa8\x57\x06\x80\xa4\x85\x50\xa3\x18\xdd\xcb\x70\x6e\x12\x60\xb3\xcb\xed\xbe\x0b\xa1\xa5\xc2\xf4\x1e\x80\xd0\x1e\xc5\xd3\xbd\x27\x03\x01\xf7\x6a\xbe\x0e\x30\xb0\xa2\x1c\x0a\xa9\x11\xdf\x1a\xd4\x52\xa3\x50\xf2\x60\xe5\x4b\x11\x5a\x71\x7f\xed\x25\x2c\x84\xf7\xcf\x66\xee\xfe\xad\x97\x7f\xf1\x61\xf6\x13\x89\x02\x7c\x0f\xf2\x5a\xf7\xd9\xd2\xb1\x6e\x80\x8f\x1c\x7a\xe0\x41\xfa\xc2\xa6\xef\x6b\xd9\xa9\x33\xb7\xa8\x14\x52\x87\x27\xff\xf6\x9d\x06\x05\xb0\xda\x57\xab\x55\x34\xf5\x55\x62\x3d\x1b\x7a\xec\xd7\x16\x9e\x5f\x5e\x48\x6e\x1e\xfe\xee\x1e\xd7\x36\x69\x40\x53\x9b\xbe\x00\xda\x35\x6d\x13\x4a\x20\xce\x85\x45\xaf\xca\x16\x6f\x57\xae\x15\x4e\xac\x70\x76\xa9\xdf\xa5\xf3\x99\x47\x15\x68\x4c\xf7\x9b\xa3\xcf\xd3\xa7\xa6\x75\x30\x1e\xf5\xfb\x60\xdf\xdd\x34\xbf\xe9\x9a\xc0\x97\x11\x39\xe8\xa0\x2b\x34\xde\x8b\x14\x66\x9e\x16\x08\xfb\xd4\x39\x60\x2c\xf8\x1c\x24\x46\xfd\x2f\x53\xaa\xd1\x3b\x87\x1e\xe8\x52\x29\xb3\x12\x43\x8f\x72\xff\xc0\x7f\x5a\x5e\x39\x01\xfc\xee\x2c\x16\x9e\x18\x00\xf4\x7e\x0c\xa1\xf7\x17\xdd\x47\xca\x95\x6a\x02\x5e\x50\x7b\x9f\x0a\x7b\x8b\xec\xf6\x45\x0d\xe0\x4a\x05\xe0\x2a\x70\x6d\xd3\x35\x61\x37\xd2\xe7\x16\x2c\xfd\xc0\x5e\xc0\xe0\x5d\x7a\x31\xb1\x3f\x65\x02\xe4\x0b\x45\x60\xbd\xcf\x26\xe6\x96\xf3\xe6\xf9\xe9\x44\x49\x19\xfa\x30\xef\x7b\x2e\xc7\x0e\xaf\x20\xf4\xdc\xa9\x68\x17\x32\xb5\x2b\x6b\x81\x87\x10\xc2\x77\x23\x7d\xb8\x57\xc1\x6b\x85\xb2\x8a\x2d\x49\x92\x66\x44\xdd\xf9\x8e\xfb\x07\x52\x41\xba\x24\x3c\xe6\xbf\x2a\xfd\x67\xe9\x37\xa4\xdf\x17\x8e\xc1\xff\x4b\xc7\x31\xf4\x7d\xa9\x4d\x3c\x84\x11\x85\x44\xc8\x38\x69\x91\x8b\x64\x9d\x6c\x92\x8f\x91\x4f\x93\x6b\xe4\x8b\xe4\x45\xf2\x8b\xe4\x6b\xe4\x8f\xc8\x9f\x09\xa4\xf2\xbf\x91\x7f\x25\x6d\x57\xaf\x2b\x22\x54\xa3\x69\xd7\xbc\x6b\xc9\x55\xea\x68\x44\x9d\xe6\x52\x98\x64\x0a\x46\x6e\x38\x14\xe4\x6e\x41\xf7\x8d\xc9\xba\xd1\xf1\x16\x76\x50\xc8\x45\x62\xc4\x1c\xdd\xa8\x10\xb9\xa4\x2c\x37\x0f\x8f\xcd\x06\x77\xc2\x66\x1c\x20\xd1\xee\xa8\xc2\xba\x03\x0f\xba\x85\xa0\x45\xf4\xa7\xa2\xbb\xcc\xa6\xe3\x76\x83\x64\x77\x7f\x86\x5d\x03\xc7\x44\x00\xbe\x53\x1d\x3a\x3d\x92\x28\x94\x76\x43\x27\xd8\x62\xd9\xb4\x35\x16\x16\xbb\xa2\x49\x92\x12\xa9\x11\x3b\xed\x1b\x77\x44\xfb\x4e\x2c\xf2\x8e\xe5\x8c\x27\xfb\x1f\xbc\xe5\x67\xed\x06\xd1\x31\xf9\x4d\x0b\x71\x47\xca\x09\x79\x16\xe4\x81\x54\x36\x9e\x76\xd0\x3c\x27\xd8\x4b\xd0\xb8\x9c\xe0\xe3\x9d\xb8\xcc\x74\x67\xd3\x25\x80\xb0\xb0\xf3\x24\x3b\x35\x52\xbe\xd9\x2f\x06\x65\x47\xe4\xea\x7c\x39\x28\xf6\x5b\x82\x7e\x1b\xed\x44\xdd\x08\x6a\xb2\xfd\xa2\xcc\x10\x59\xd4\x3f\x87\x20\x96\x75\x10\xaa\x6c\xba\xd3\xa1\x87\x76\x6c\xef\xc3\xc1\x54\xa7\x42\x3b\xf6\x00\x82\xc1\x91\x4a\xbb\xb9\x50\xac\x74\x1e\xdf\xe3\xf4\x89\x1e\x07\x95\xb5\xfb\xd1\xd9\xf0\xac\xfd\x3a\xa6\xe5\x94\xb0\xce\x49\x3b\x59\xd3\x56\xe7\x85\x10\x9b\x36\xfb\x1e\x53\x11\x92\x8a\xc7\xc6\x44\xcd\x14\xcf\xcf\x9a\x21\x0e\xe7\xc2\x7e\x43\x1c\x3c\xee\xa6\x8d\x73\x4c\x40\xa8\x59\xbb\xc7\xe7\xf3\x24\x1e\x0e\x0a\xb6\x70\x2c\x2c\x40\xd7\x54\x68\x9e\x74\x58\x73\x71\xc3\x75\xd9\xac\xbf\x5f\xd9\xaa\xbc\xbc\xfe\xd2\x3a\x2a\x39\xba\xfb\x9e\xe6\xba\xda\xfe\xe1\x25\x80\xcb\x00\x4a\xfb\x07\xbb\x76\x1f\x53\xb4\xe2\xbd\xbe\x47\xe6\x94\xea\x27\xa7\x15\x48\x28\x2f\x25\x5a\x9a\x52\xbf\x52\x6b\xbf\x95\x23\x9b\x2d\xec\x3e\xb4\xf2\xd0\xca\xed\x8f\x9e\xba\x54\xaa\x5f\xfc\x02\x00\x27\xcb\xa3\xcd\xfe\x69\x68\xbf\xf6\xfe\xfa\x66\x22\x75\xa2\xf2\xea\x1a\x03\xc5\x64\x4d\x80\xb5\xbc\x92\xff\xb5\x5b\x92\x85\xae\x4a\x5f\x8a\x62\xf7\x5e\xc0\x12\x60\x64\x1c\x60\x22\x0a\x86\xaf\x08\x24\x9c\xb0\xe0\xc6\xdb\x09\x64\x13\x1e\x9a\x00\x0d\x15\x4e\x29\xb0\x97\xf3\xa0\x70\x00\x4d\x9e\x62\x5c\xdf\x56\x34\x9a\xe4\x49\x95\xa3\xa2\x6c\xfb\xc7\x11\x93\x0c\x73\xdd\x51\x48\xbc\x90\xf0\xf9\x41\x75\x5d\x1b\x33\x70\xaf\xa7\xfb\xc6\x33\xfe\x01\xd0\x5d\xa5\x91\x09\xe8\xee\x2e\x73\xb3\x84\x2a\xa7\x16\x24\x8b\x14\x97\xba\x20\x51\xa4\x58\x31\xcb\x80\xf1\x28\x74\xc7\x4b\xc8\xf2\x94\x95\x00\xb0\x08\xb4\x88\xfe\x39\xd4\xca\x68\x26\xe8\x3e\x2f\x50\x79\x09\x68\x1e\x75\x15\xd9\xc4\x08\xf6\xcd\x23\xea\x09\x7a\x69\xbd\x88\xd0\xfe\xce\x9e\x11\x9a\x53\x73\x75\x8a\x39\x3d\x41\xfd\xfb\xa9\x52\x2f\x29\x39\x15\xf3\x0a\xda\x5d\x71\x81\x2b\xa3\xcb\x7a\x9e\x97\x50\x81\xc0\x30\x4b\x9a\x8c\x2b\x1a\x20\xb8\x5a\xaa\x92\xc8\x01\x44\x33\x40\x2b\x80\xb5\x52\x41\xb9\x04\xf2\x14\xab\xc8\x73\x88\x03\x33\x26\x2e\xfb\xa8\x6e\x15\x2a\x14\xf3\x3c\x9f\x67\x76\x17\x0f\x37\x56\xe5\x71\x04\x4c\x5a\x90\x1a\x73\xf1\x12\xc3\x32\xad\xf1\x24\xb3\x00\xcb\xb4\xa8\x50\x6e\x26\x00\x83\x11\x50\xdd\xfb\x12\x3c\x3e\x82\xed\x17\x92\x9c\x96\xcc\x1c\xd2\xe9\xfe\xbc\x06\xb1\x71\x6a\xf9\x77\xf1\x52\x75\xba\x5f\xc9\x43\x49\xd7\x21\x49\xdd\x3f\x00\x30\x92\xb1\x07\x12\xb7\x95\x5e\xfe\xec\xaf\x7e\x1d\x01\x18\x3c\x96\x8d\x6c\xcc\x51\xa0\x00\x93\xe6\x68\x2b\x70\xae\x78\x78\xdf\x91\x0b\xc9\x3b\x5f\x35\x75\x00\x4e\x37\x5d\x83\x03\x7e\xeb\xd8\x8c\xe7\x4f\x54\xff\x8c\x1a\xce\x1d\x28\x5c\x39\xf5\x53\x9f\x53\xf6\xde\x9b\x5d\x8c\x04\xbc\x00\x33\x6c\x7c\x61\x3e\x4c\x87\xb4\x0f\x7f\x1a\xb5\xcc\x23\x27\xfb\x5e\xba\xb8\x2f\x06\x30\xd3\x13\x04\x3f\x60\x5f\xf4\x3c\xa8\x4f\x77\x0d\xa3\xfb\x67\x54\xf8\x05\x48\xdd\x03\x97\x12\xda\x2c\x3e\xd3\x03\x5e\xbf\x81\xe7\x80\x05\x43\x17\x41\x0e\x9e\xa5\x7b\xbb\x56\x60\x92\xcb\x0c\x61\xba\x88\xda\x2d\x00\xb0\xc7\x0a\x35\xfc\x47\x43\x70\xd1\xed\x86\x7a\x37\x8c\x94\x86\xd2\xe3\x3d\xe7\xe8\x64\x02\x0e\xf7\x53\x30\xc2\xde\x15\xbe\xb6\x8b\xc2\x75\xa2\x1c\x80\x6c\x4f\x64\xfa\xc1\xa1\xcf\xcb\x49\xf8\x82\x0a\xa9\xf3\x29\xf8\x1c\x7d\x2e\x64\xf8\x3e\x87\xf8\x33\x93\xda\xc7\xa9\xb2\x54\x9d\xf9\x3a\xba\xaf\x73\xf9\x45\x1f\x90\xeb\xf4\x4b\xe8\x7b\x7a\x68\xe0\xe1\x1e\x5c\x5c\x04\x7e\x36\x0b\xc9\xd3\x3d\xf0\x0c\xe2\xbe\x79\x76\x21\x82\x1f\x61\x0f\x58\x3f\x75\xb9\xfb\xd3\x4a\xfb\x97\x3f\xae\xf9\x2f\xec\x9b\xff\x6a\x57\xf0\xd2\xd4\x24\x07\xeb\x49\xed\xcb\xf3\xa0\x3d\xa4\x50\x78\xd2\xd2\x01\x23\xf7\x70\x88\x7c\x72\x32\x70\x07\x3c\xa3\x05\x66\xb4\xb3\x10\x8b\xa8\xf3\x5a\x17\x45\xb6\x32\xe2\xeb\xd1\x54\x38\x1e\x07\xf5\x58\xd7\xf0\xba\x17\x1e\x9e\xe8\x7e\x72\xd7\x7e\x7f\x7a\x56\x3e\x76\x96\x63\xe0\x56\xe0\x7b\x4d\x9c\x9b\x06\x80\x67\xf0\x82\x0a\xec\xb6\x29\x5a\xda\x03\x61\x2d\x80\xfb\x02\x67\xf1\x59\x1c\xba\x5f\xb1\x0e\x05\x4f\x06\xf0\x29\xa0\x8f\x01\x00\xfb\x10\x04\xee\x00\x00\xed\x74\x17\x26\x0f\x61\x7f\x81\x02\x9e\x81\xbe\xfd\xec\x02\xca\xe7\x10\x0e\x99\x10\x3f\xce\xee\x7e\xf4\x62\x0f\xc8\x47\x62\x3d\xab\x2e\x49\x1a\x90\xa4\xf6\x7f\xed\x4a\x7a\x8e\x49\xe3\xd2\x69\xa9\x21\x3d\x2e\x5d\x91\xae\x76\xce\xa4\xbf\x96\xfe\x4e\xfa\x07\xe9\xff\x90\xfe\x8d\x48\xa4\x9f\x0c\x91\x29\x32\x4b\x72\xa4\x45\x1e\x20\x8f\x92\x27\xc8\xa7\x77\x1c\xa8\x85\x03\xc0\x0e\x0b\x41\x34\x89\x82\x7e\x17\x35\xe2\xb1\x78\x3a\x20\x9a\xd9\x7e\xe2\xc0\x11\x22\xbe\x28\xea\x48\x27\x2d\xd1\x12\x3b\xb6\x01\x8b\x64\xd6\xf1\x75\x89\x76\x79\x7a\x88\xd8\x2c\xcd\x46\x48\x3a\xee\x76\xb4\x8f\x8e\x9b\xe5\x6c\xb6\xb3\x79\xb1\xcf\x86\x68\x78\x67\x43\xe2\xe0\x06\x99\x05\x47\x17\x98\x4a\xcb\x8e\x1b\x58\xcc\xe9\x7a\xa3\x86\xbc\x13\x95\x64\xdf\x22\x6d\x7c\x10\xf8\x21\xec\xbf\x82\x9d\x7d\xc5\x8e\x7c\xb1\xc3\xd8\x8b\x3a\x3f\xe0\xf8\x17\xcc\x66\xe3\xe9\x0e\x39\x40\x0e\x85\x67\x17\xc8\xcd\x9c\x10\xfb\x43\xe7\xf0\x70\x32\x36\x3b\x1a\x47\x11\x81\x26\x3b\x4b\x8a\xa0\x30\x23\x13\xb5\x37\x9c\xb5\x1c\xed\xa4\x03\x27\x38\x8f\x11\x8b\x77\xd4\x22\x9d\xe3\x27\x14\x21\xb2\x60\x20\x3a\x50\x8c\xdd\x25\x47\x1d\x56\x85\xf1\x01\x7f\x4d\xee\x48\xff\xc3\xd9\x50\x58\xb8\xc9\xf0\x58\xdc\xfe\xa5\xc9\x3b\xca\x83\xf7\x2d\x0c\x25\x60\xec\x14\xc4\x7c\xc6\x42\x32\x07\x88\xd7\x98\x5e\xe0\x6f\xf4\xec\x7f\xb8\x5b\xa9\x99\xaa\xa9\xeb\x4f\xb4\x3f\x8e\x93\x53\x07\xcf\x1d\xee\x82\x06\x4f\x00\x98\x26\x98\x5a\x0e\x7a\xa3\xc3\x86\x12\x9d\x50\xe8\x6a\xe2\xfc\x85\xf0\xe1\x1c\x53\x34\x57\x3d\xb2\x4b\xe9\x6e\xff\xd9\xd2\x10\xc2\x01\x0f\x76\x77\xe7\xc0\x2b\x97\x11\xbc\xfb\xcc\xd8\x2e\x75\xea\x57\xeb\x76\xd1\x41\x9e\xc3\xa4\xaa\x29\x96\x05\xaf\x56\x01\x7c\x8b\xb4\x44\xd1\x73\x0b\x56\x01\xf5\x91\x3d\x80\xef\x70\xda\x7e\x2f\xba\x1b\x56\x21\x9a\xc1\xfe\xbd\x50\xc5\x1a\x04\xf7\x21\x54\x80\xc9\x03\x79\x9a\xa4\x55\x8d\x17\xb0\xaa\x60\x32\x89\xd8\xe0\x58\xd0\x61\xec\xd6\x05\x83\x36\xe4\x3e\x1c\xdf\x07\xa7\xc6\xe8\xc0\x11\xea\x3b\x02\x18\x3a\xc6\x94\xbe\x19\x93\x99\x87\x53\x50\x32\x51\xf6\xc1\x06\x00\xac\xc3\xf8\x91\x90\xc7\x33\xd2\x60\x39\xb5\xc2\x90\x5f\xce\x15\x11\x37\xf8\x9e\x03\x80\xc6\x61\x06\xde\xae\x95\x34\x42\xa2\x86\x70\x6a\x0c\x20\x91\xa0\x6c\x53\x04\x60\x96\x8a\xde\x27\x9a\x2a\xab\xf4\x4e\x24\x7c\xf7\x63\x2e\x47\x4d\x05\x78\x05\xf9\xcc\x9c\xc6\x28\xa3\xe7\x7c\xde\x2e\xe6\x39\xf6\xd2\x9e\x8b\x33\x7d\xc9\xc2\x13\xed\x3f\xfc\x6c\xfb\xf3\x49\x55\x55\x37\x46\xfd\x1f\x5b\x18\x93\x2b\x9b\x93\x4b\xe4\xad\x37\xff\xe2\xe7\x3f\x7f\x96\x24\xfe\xed\xad\x6a\xbe\x78\xc7\x38\xa8\x75\x96\x63\x7b\x7f\x36\x74\x16\xe0\xf2\x35\xf5\x87\xea\x4b\xcb\x3e\xcc\x25\x1e\x1c\xc3\xf6\xfb\x83\xed\x6f\xb7\x5f\xbc\x78\xe6\xcf\xe1\x0d\x73\x95\xc3\x9e\x91\x17\xb4\xf3\x71\xc0\x64\x59\x5b\x07\x74\x5d\x64\xd4\x38\xc1\x90\x4d\xdd\x81\x68\xd6\x31\x51\x40\x4a\xa9\xca\xac\x6a\x11\x31\x7f\x1d\x60\x0b\x46\x1f\x04\x8e\x5b\xfa\x16\xbb\x7c\x45\x07\xd9\x0d\x74\x0b\x2b\xc5\xd8\x51\x76\x67\xd6\x9e\x76\xa7\x4e\x51\x5c\x05\x3a\xb9\x04\x58\xab\x5a\x95\x6f\x45\xd8\xe5\x37\x59\x15\xb0\x09\x45\xed\x6c\xc6\xfc\xa8\xb7\xa8\xc0\x15\x7e\x24\x76\xd7\x2e\x0b\x2e\x97\xd5\x23\xfb\x95\xe7\xe7\x73\x0b\xb7\x52\xf9\x21\x64\x74\x93\x6e\x95\x0b\x2f\x3d\x1c\xe7\xd0\xcc\x92\x1c\x53\xaf\x32\xd8\x66\xe7\x27\x18\x4f\x2a\x9b\x97\x73\x79\xe4\x10\xf2\x20\xaf\x9c\x3f\x04\xf8\xa2\x72\xee\x30\xc0\xd8\x5d\x94\xdf\x95\x06\x9c\xbc\x8f\x3e\x38\xca\x28\x2b\x7a\x0e\x3c\x13\x82\x2d\xa4\x83\x99\xdc\xab\x7c\xd3\xd5\xdf\x18\x1a\x57\xf4\x75\x5c\x3a\xc5\x40\x01\x85\x02\xc2\xc1\x14\x00\x32\xb6\xca\x3b\x19\x88\xaf\xb9\x67\x25\x5d\x9a\x97\x96\xa5\x15\xe9\x98\x74\x5a\x3a\x27\xdd\x29\xad\x0a\x0f\x95\xa7\xa4\x8f\x4b\x9f\x92\xae\x49\x5f\x94\x7e\x4e\xfa\x79\xe9\x97\xa5\xdf\x17\x1c\x2c\x7b\x12\x97\x02\xb3\x91\x2e\x39\xd8\x1f\x0e\x85\x63\x37\x31\xd3\xb4\x13\xd4\x16\xef\xf4\xb2\x3b\x53\x75\xe0\x26\xf8\xd9\x65\x5f\x94\x76\xf1\x09\xa7\xe3\x31\xfb\x07\x23\x24\xe5\x5c\x45\x51\xc7\x8c\x36\x2d\x72\xd5\xd3\xf1\x70\x30\x9c\xb6\x3a\xb1\xf0\x96\x2c\xcc\x69\x1d\x62\x7f\xda\xb2\x2f\xb6\xb0\x65\xd8\x1f\xb3\xf6\xa7\x76\x13\xec\xfc\x9b\x8a\xc7\x44\x60\x9a\x65\xc4\xe5\x70\xd6\xee\x5f\xd3\x1d\x87\x10\xf9\xff\x1d\x33\x94\xff\x7f\x21\xc1\x4b\x27\x62\xdb\x26\x87\x33\x7b\x35\x05\x2c\x81\x07\xb6\x74\xfb\xa5\x54\xcc\x5a\x8e\xda\x53\xeb\x46\x62\xdd\x81\xf7\xd8\x3a\x6a\x8b\x53\x1b\x86\x8f\xe9\xe1\x71\xe0\xe1\xe1\x22\x02\x2a\x8a\x06\xdd\xd3\x4a\x8e\x8e\x84\x0a\xd3\xae\xbc\x46\x93\x0c\xac\xa4\x32\x10\x08\x8c\x25\x91\x26\x74\x04\x96\xc8\x51\xc0\x7c\x9e\x01\x4d\x80\x1c\xb4\x94\xe1\xc9\x64\x77\x2f\xb0\xee\x41\xca\xf2\xe7\x06\x60\x8d\xff\x3f\x41\x65\x5b\xff\x5f\x78\xd8\x6c\xed\xf3\xb7\x0f\x01\xb4\xff\xec\x99\x27\x76\xdf\xbf\xb4\x27\x9d\x78\xf0\xfe\xfd\xb7\xf7\x03\xec\x09\x65\x1e\xf8\xf2\xd5\x3b\x0a\x77\x9c\x8c\xf8\x60\xae\x3a\xf3\xed\x72\x7b\xf8\x13\xcb\x53\xd1\xaf\x5c\x2f\x91\x89\x8b\x2f\x7f\xe6\x62\x0c\x76\xf5\xb9\x27\xd4\x15\xc4\x39\x8d\x82\x99\xf6\xd2\xb0\xd7\xab\x6a\xee\x50\x1f\x98\x69\xd0\xdd\x83\x11\x18\x08\xf4\x1b\x23\x60\xfa\xbc\x00\xd3\x59\x5f\xc8\x2b\x53\x1c\xf2\xfa\x65\x79\x02\xfa\xbd\x21\x50\xd4\x08\x8c\x8c\x0e\x9b\xee\x44\x7a\x64\xc1\x7d\x68\x24\x14\x4e\x9b\x5e\x75\xd4\xe7\x76\x87\x9e\xee\x0b\x7d\x62\x0e\xb4\x53\x18\x06\xef\x25\x70\xfb\x4a\xb7\x84\x13\x9f\x76\x43\x24\xe4\x6b\xe4\x8f\xa2\xfb\x70\x31\x06\xee\x07\xba\xdd\x8f\xf4\x5d\xc0\xde\xd0\x59\x23\xe2\xbe\x1b\xee\x91\xa4\x88\x24\xb5\x7f\xa6\x2b\xe1\xc9\x4b\xbb\xa4\x7b\xa4\x07\xa5\x27\xa4\x67\xa4\xcb\xd2\x67\xa4\x6b\xd2\xcf\x48\x3f\x27\x7d\x5d\xfa\x6d\xe9\xcf\xa4\xb7\xa5\xff\x4d\xfa\xbe\xf4\x43\x91\x06\xe6\x23\xa1\x0e\x2b\xf0\xf6\x8e\xe3\xf4\xe7\xc9\x2f\x91\x5f\xd9\xc9\xf7\x0a\x73\xb9\x6b\x27\x7d\x90\xdb\x93\x57\x74\x86\xc4\x05\x75\xd9\x41\xd3\x33\x81\xfe\x45\xc1\xf0\xb0\xb2\x99\xae\x70\x66\x9e\x84\x82\xf6\xc4\xd6\x61\xb4\x7b\x76\x22\x53\x52\xa1\x54\x56\x50\x34\x04\x8b\xc3\x10\x0e\x67\xb3\x8b\xc4\x3e\x1f\x3c\xb2\x67\x2c\x18\x0e\xda\x7f\x90\x96\x21\xe2\x02\x85\x73\x8b\x90\x1b\x0a\xd2\xb4\x3d\x26\x8d\xda\x23\x96\x91\xea\x04\xac\x08\xc5\x8b\x83\x20\x39\x1a\xfb\x74\x76\x27\x26\x59\x84\x50\x67\xa3\x69\xc1\x8c\x0f\xc6\x8c\xd8\x0e\x61\x40\x00\x35\xc1\x4e\x80\xe8\x6c\x38\x18\x0d\xee\x04\x84\x86\xc4\x2c\x13\x4e\x3b\x68\xbe\x65\xc8\x5c\x50\xff\xa2\x46\x5c\xf6\x04\xed\x26\x41\x1c\xe3\x1d\x8e\x61\x5a\x0e\xf2\x58\x84\xc8\x46\x30\x1c\xdb\xb1\xb2\x14\xd9\x82\xb3\x11\x92\xb5\xcf\xc2\x0e\x3a\xe4\x4c\x53\xb2\x38\xd6\x85\x69\xda\xce\x85\xd3\x31\x43\xeb\x0c\x5c\x22\x73\x5a\x18\xa3\x66\xe3\x9d\x4b\xc9\x09\x2e\x14\xc4\x71\x8f\x9f\x70\x07\xcd\xff\x20\xdf\x26\xd3\xc9\xb3\xf9\xc0\x21\x21\x6e\xc4\xc3\xc2\x73\xc0\xe3\xd2\x0e\xec\x3e\x39\xc2\x50\xab\x0c\x0d\x2b\x54\x1e\x4d\x16\x5f\x02\x60\xd5\x62\xce\xec\x76\x59\xc5\xa4\x02\x83\x83\x85\xa2\xc6\x51\x55\xad\xc4\xd6\xea\x77\xb4\x33\x51\xe4\xba\x3c\x00\x2a\x70\x95\x97\x07\x66\x46\xa6\xfb\x26\xb5\xbe\x54\x22\xaf\xf2\xc8\xd1\x64\x22\xc9\x12\x08\x4a\x4f\x10\xb8\x09\x35\xfd\x50\x66\x8d\x6c\x80\xdd\xd7\x37\x4b\x08\x1e\x0f\x62\xfb\x8a\x8e\x40\x4b\xfe\x34\xe4\x89\x86\x75\xa8\xaa\x0a\x74\xb7\x9f\x65\xa8\xe9\x34\x14\x22\x15\xee\x39\x04\x74\x34\x86\x05\x00\x57\xfb\xb3\x3a\x45\xf0\x76\xe9\xdf\x87\xd0\x2c\x30\x10\x4a\x11\xe8\x71\xd7\xfd\x7d\x15\x9e\x18\xf2\xe9\x05\xb9\x8f\x21\x85\xfd\x61\x06\xfd\xd3\x90\x67\xc0\xd1\xb7\x08\xb0\x46\xd9\xcc\x18\x50\x55\x1f\x09\x51\xe8\x9e\x1e\xf1\x00\x7a\xee\x01\xdf\x11\xf4\x1e\x67\x68\x99\x94\x2a\x18\x58\x02\x6f\xd7\xee\x09\xf4\xf5\x2c\xc5\xac\xd0\x6e\x0d\xeb\x08\xde\x1e\x38\x16\xc2\x26\x87\x83\x61\x1c\x98\x54\x01\x0b\x1a\x70\xb9\x0f\x70\x7c\x11\xa8\x77\xc8\x64\xd0\xe3\x3e\x32\xaa\x03\xa2\x27\x4a\x93\xd1\x41\xd9\x77\x60\x02\xbd\xc6\x2a\x42\x8b\xb1\x64\xa1\x48\x79\x55\x29\x42\x1d\x9b\xc8\x2b\x98\x34\xd9\x58\xf6\xd6\x01\x5e\x7f\x6f\x76\x82\x26\x01\x63\x53\x9c\x2d\x44\x52\x2b\xfd\xc7\x78\x59\x65\x9e\x7c\x2d\x1d\x0b\x2f\x9c\x7c\xb8\xdd\x7c\xb0\xfd\xdf\x0f\xfc\x4e\xcf\x5b\x1b\xfa\x68\x04\xe0\x72\x33\xb6\xd0\xa3\xd6\xca\x18\x78\xf2\x8b\xe4\x36\xa2\x17\x2b\x25\xab\x95\xf9\xbc\xd9\xfe\x31\xd5\xbd\x91\xf7\x5b\x0d\xb6\x0d\xf0\xd9\x5b\x1e\xfe\xbb\x6d\xf7\x7c\x5f\x17\x5a\xcf\x69\x00\xad\xdc\xaf\x1b\xc4\x9b\x24\x8a\x02\xeb\x47\x23\xc8\xdf\x04\x78\xc3\xc4\x9e\xf1\xa7\x0f\x73\x00\x68\x55\x29\x53\x6b\x1a\x00\x53\x52\x5e\xe4\x66\x9e\xf1\x3d\xd3\xfc\x50\xaf\x56\x63\x2d\xd0\x60\xa8\x8b\x32\x50\x94\x22\x4c\x06\x95\xf2\xa5\x82\x56\x00\xac\x2a\xfe\x5d\xf6\xbb\xc7\x78\x41\x2b\x72\x1c\x3c\x4f\xa9\x06\x5d\x77\x9a\x57\xb7\x2e\xe7\xa0\x08\x7b\x3c\x0d\xd8\x50\x29\x52\xf3\x91\x01\x4d\x89\x4e\xb7\x92\x0c\x91\xa2\x55\x56\xc2\x47\x2d\xfa\xd0\x50\xb1\x92\xaf\x18\x53\xb5\x64\x92\xe7\x95\xdc\x26\x2a\xa3\x1f\x83\x12\xaa\x1b\x1a\x00\x58\xbe\xc7\xd5\x0d\xab\xa5\xde\xb9\xf2\xce\x9a\xae\x5c\x67\x25\xfd\x63\x7d\x48\x83\xcf\x97\x92\xf4\xee\x00\x56\x55\xd0\x12\xf0\x22\x74\xf5\x77\x4f\xaa\x53\x8f\x83\x6b\x4f\x19\x86\x0e\x6f\xa9\xaf\x03\x22\xb0\xe6\x91\xa5\xa1\xd2\xf1\xf2\xe3\x2f\x02\xbe\xa0\xd7\x6a\x7b\x26\x5c\xb3\x4f\xf0\x7b\x69\xef\x53\x14\xaf\x72\xbe\x8a\x38\x73\x02\x8e\x1c\xee\x9f\xf0\x7f\x3a\x01\x2d\x1d\x23\xfb\x01\x06\x1e\xa4\x87\x8f\x73\x75\xf1\xb6\x97\x3c\x92\x24\x85\x24\x89\xfc\x6b\xd7\x65\xf7\xa7\xa4\x49\xe9\xa8\xf4\x80\xf4\x98\xa8\x6f\xdf\x90\x7e\x47\xfa\x1b\xe9\xef\xa4\x1f\x48\xff\xdc\xc1\xa0\x7c\xa4\x9f\x0c\x92\x38\x49\x10\x8b\xcc\xd9\x1d\x7f\x38\x1b\xea\x50\xd8\x84\x86\x3c\xc8\x65\x2e\x02\x66\xe2\x31\xde\xb1\x0f\x4e\x3b\xa6\xc3\x19\x12\x0c\xef\x84\x10\x8a\xa3\xd0\xbe\x7a\xc3\x99\xac\xe1\x72\x42\x55\x83\x02\x27\xf7\x38\xa0\xaf\x48\x5e\xd9\x89\x5a\xb1\x62\xe2\xc2\x8c\x90\x74\xd4\xb0\xc2\x3b\x68\x90\xdc\x2f\x4c\xc0\x66\x48\x76\x87\x6f\x66\x7f\xe8\x78\xdf\x5b\xe2\xde\x53\xce\x57\x33\x8e\x15\xbe\xa0\x2e\x3b\xd9\x2c\x96\x21\x50\x9d\xb4\xcc\x3b\x81\xef\xe9\x6c\x3a\xec\xa8\xd5\xb3\x69\xa1\xd0\xce\x76\x70\x94\xb4\xd1\x29\x33\x33\x24\x2b\x66\x05\x27\x32\xc6\xd8\x49\x21\x14\x1c\xe2\xb4\x13\x4d\x18\x13\x65\x74\xd4\xc1\x49\x62\xb2\x23\x9e\xb1\xef\xc2\xe3\xf8\x7f\x84\x3f\xe0\xb8\xa5\xd2\xe4\x5d\x8b\xd1\x6f\x50\x41\xf3\x4c\x78\xe5\x39\xff\xf5\xaa\x5a\xe7\x14\x2b\x49\x4d\x7b\x53\xad\xfc\xec\xc4\xea\xe4\x2e\xb5\xbd\xbe\xad\x5a\xa7\x8f\xf4\x77\x8b\xec\x76\xd4\x14\x45\x61\x27\xa3\xc5\x16\x82\xd9\xac\xca\x7d\xbb\xf7\x8e\x93\xaf\xeb\x08\xe0\xbd\x15\xc3\x77\x03\xde\xe1\x03\xf5\x84\x81\xd0\xd0\xa3\x67\x92\x45\xe0\x09\x30\x8b\xd4\x37\x49\x8b\x0c\xbb\x67\xa1\x86\x45\x50\x1a\xdf\x44\x06\x97\x3d\x17\x00\xa0\x89\x2d\x4c\x86\xa7\x92\x58\x1e\x90\xa1\x89\x90\xb3\x92\x4d\xda\xb8\x9a\x54\x4d\xd8\x1b\x75\x74\x2b\x6b\xd8\xa2\x07\x63\x94\xd7\x80\xbc\xd5\x33\xa0\x01\x16\x4c\xca\xeb\x1a\x40\x1b\x16\x87\xdb\x3f\x9c\xef\x83\x92\xeb\xd2\x2a\xae\xde\xa8\x67\x47\xa1\xe6\x6a\x25\x8a\x14\xd7\x68\x9b\x53\x20\xaf\xc2\xf0\xb2\x72\xaf\xb7\x6a\x81\x82\xc3\x2b\x2d\xb3\x5d\x63\x49\xe8\x9b\x29\xeb\x3a\x1a\x41\x72\xd5\x1f\x74\x7f\x0a\xa0\x59\x7a\x85\xe5\x94\x35\xf6\x42\x72\x66\x80\xf9\x07\x7c\x5d\x97\x3d\xd3\x9a\x7c\x34\x97\x2f\x3e\xee\xfb\xc4\xb9\x9f\x1b\x38\xff\x59\xe5\x46\x09\xb4\xfe\x03\x77\xfe\x7a\x6e\x6b\x66\x0a\xd8\xd3\x59\x80\xde\xde\x6b\xa4\x61\xb6\x14\x6e\xbe\x93\x3b\xfc\xe0\x1e\xd7\x44\xf1\xd4\x9d\xb0\x56\xba\x84\x70\xbf\x3b\x77\x6c\x37\xe0\x9a\x66\x6d\xb3\x24\xd0\x02\x64\xfb\xe0\x9d\x9f\x48\x79\x84\x26\xc3\x22\x6a\xab\x88\x55\x58\xf4\xae\x16\xb9\xa9\x8e\xfc\xc3\xe8\xfd\xd0\xf3\x71\xc0\xed\x29\xb9\x52\xa2\xab\x3a\xc0\xc8\x27\xb1\x0c\x99\xdd\x6b\x57\xe8\xd3\xfe\x57\x69\x61\x26\x08\xb8\x32\x27\xc8\x59\x14\x36\x11\xb7\xe8\x5d\xc3\x14\xf4\x55\x3e\xd8\x0f\x66\x52\x3d\xb8\x08\xd0\x34\x29\xa8\x20\x02\x5d\x2b\xb4\x01\x78\x09\x71\x03\x61\xd5\xfe\xca\xbe\x39\xdc\xb4\xdf\x35\x0a\x38\x7b\x0c\xb7\x59\x11\x34\xc4\x64\x01\xb7\x00\x86\x53\xa3\x33\x0c\x97\x22\x38\x36\x53\xa2\x2a\x48\x7e\x49\x6a\x7f\xb9\xeb\xfb\x3f\xf9\x53\x69\x56\x3a\x2a\xdd\x2e\xdd\x2d\x3d\x28\x3d\x2e\x6d\x49\xcf\x4a\x9f\x96\xae\x49\xd7\xa5\x57\xa4\xdf\x97\xfe\x8b\xf4\xa7\x92\x64\x5f\x30\x9d\xff\x66\x83\x59\xfb\xca\xb3\x0f\xe9\x50\x50\xd8\x75\x8b\x98\x50\x59\x24\xc5\x09\xc0\x55\x78\x37\x64\xec\x83\x72\x56\xc8\xd9\xb2\xe1\x59\xbb\xe5\x95\x0d\xa1\x82\x13\xff\x47\xac\xde\xc3\xd9\xce\xfa\xc8\x9a\x21\xe9\x8e\x01\x5c\xd4\xc1\xfd\xac\x49\x22\xa7\x76\xfc\x03\x1c\x0d\x56\x34\x2d\x48\x93\xd6\x58\x27\x57\xad\xa3\xf5\xe5\x8e\x99\x90\x3b\xd6\x19\x48\x45\xb0\x82\xe3\x45\xc0\xe7\x85\x41\x75\xb0\x33\xda\x76\xb4\x5c\x31\x27\xb0\x73\x43\x6f\x26\x14\xca\x18\x63\x3a\xcf\x29\x50\x59\x07\xd0\x36\xac\x1c\xaf\x9b\x7c\x31\xa8\xeb\x34\x59\x57\xa0\xa9\xac\xdf\x35\xba\xd1\x3b\x31\xb6\x7f\xe8\xb6\x27\x8f\x34\x21\x69\x96\xeb\xaf\xf6\xa5\x92\x9c\xe6\xa8\x02\x67\xbe\xa2\x2a\x6b\xba\xb6\xdd\x55\x8a\x4c\x69\x07\x5c\x80\x79\xc8\xe3\x8d\x97\xf5\x24\x9a\x5c\xc1\x42\x3c\x94\x48\xa8\x0a\xbc\x1d\x09\xb2\x04\xd5\x87\x0d\x65\xc6\xcb\x6f\x7c\xc3\xae\x99\xa4\x35\x39\x4e\x63\xc3\xaa\x7f\x4e\x1f\x1c\x7c\xaf\x00\xc0\x72\xca\x8d\x97\x10\x47\x87\xd4\x69\x17\xe0\x6c\x14\x17\x7a\xc8\x2b\x85\xa4\x3a\x1a\x41\x4c\x02\xaa\x3a\xbf\xf1\xc2\xae\x00\x4f\x05\x31\x19\x1e\x1f\x0b\xa4\xe0\xff\x46\x12\xb4\xff\xe7\x36\xaa\xd3\x13\x2c\xd2\x67\x7f\x07\x9d\x6f\xa8\xd7\x58\x6a\x40\x69\x30\x93\xd9\x5f\xa0\xf9\xbc\x73\x13\xc1\xd4\xc7\xf0\x43\x70\xb2\x9f\x62\x5e\x87\xf2\x60\x06\x21\x59\xc7\xa3\x7e\x38\x1c\xee\x59\x52\x01\x1a\x20\x82\x07\x67\xe3\x08\xd0\xef\xe2\xd0\x42\x3d\x9f\x4f\x40\x74\x2f\x0e\x1e\x10\x8b\xcd\x03\x21\xc8\xa9\x50\xc7\x06\xc0\xc8\x6e\x1c\xdb\x47\xcb\x00\xe1\xfd\x40\xeb\x78\xd8\x8f\x93\x53\xb0\xd2\xe7\x44\xa4\x48\x5d\xbf\x4b\x5e\x72\xdf\x2b\x71\x29\x2a\xa5\xa5\x92\x74\x44\x92\x02\xf6\x1f\x4d\x48\x24\x79\x79\x26\x49\xd4\x10\x81\x60\x61\x27\x47\xd0\xb0\x84\x2b\xbc\x28\xb3\x59\x6b\x86\x64\x9d\xf0\x91\xa8\x10\xe5\x09\x6f\xde\x98\xdd\x7b\x65\x1c\xa1\xb5\x43\x9d\xac\xe6\x94\xfa\x06\x40\x32\x36\x6a\x2e\xac\xc4\x16\xaa\x4a\x73\x60\xa5\xcf\x9f\xd4\xcc\x50\x46\x7f\x73\x03\xa1\xc6\x11\x0a\x90\xf7\x8c\x80\x39\x72\x80\xf6\x1f\xc3\x5b\x7a\x99\x4a\xf3\xf9\xc2\xf4\x04\x1e\xec\x71\xdf\x05\x9a\x79\x74\x91\xea\x4a\x25\x7f\x69\xfd\xc4\x50\x22\xd9\xf3\x50\xd9\x5a\x6d\x20\x03\x9f\x9f\xd7\x5b\x4a\x22\xaf\x62\x0e\x82\x86\x09\xaf\xf1\xc9\x25\x6c\x40\x13\x7b\x82\x30\x18\xcf\x17\x4e\xcb\x50\x97\xa4\x09\x91\xbf\x78\x0d\xae\x4b\xb3\xd2\x5d\xd2\x9a\xf4\xa4\xf4\xbc\xf4\x39\xe9\x65\x91\xd5\xfb\x7b\xd2\x1f\x49\x6f\x49\x7f\x25\xfd\x57\xe9\xef\xa5\x1f\x12\xd2\xd9\xdd\x4e\x92\x14\xc9\x8b\x5c\x98\xe3\xe4\x2c\xb9\x40\xee\x27\x0f\x93\x4f\x92\xcf\x92\x9f\x27\xaf\x90\xdf\x24\xdf\x24\x7f\x42\xfe\x92\xfc\x0d\xf9\x1e\xf9\x27\xf2\x2f\x0e\xaa\x35\x1b\x21\x22\xf3\x45\x84\xea\x73\x07\xa3\xf1\x88\xb5\x89\x60\xe2\xc6\x17\x88\xb5\x48\xd2\xce\x87\x4c\x2a\xd3\xc5\x53\x62\x85\x32\x2b\x98\x3d\xb2\x67\x58\x04\x86\x67\x1d\x82\xb7\x7d\x10\xcd\xa6\x05\xa0\xe3\x38\xea\x77\x2c\x36\x77\x68\xc9\x62\xbf\xe9\xe8\x2f\x9d\xcd\x86\x67\x4c\x76\xf2\x58\xd2\x1d\x01\x8d\x23\xb7\xec\x28\x53\x84\x0b\xbc\xa3\x75\x8f\xc7\xa2\x8e\x57\xc9\x4d\x3a\xae\x03\x6e\x09\x89\xec\x6c\x3a\x2e\x38\xd3\xf1\x98\xe3\xdc\x65\x7c\x30\x99\xa6\xd2\x46\xcc\xa1\x62\xa7\x3b\x4c\xe0\xb0\x18\xa8\x65\x27\x48\x20\x63\x37\xd3\x69\x23\x2b\x8c\x38\x77\x2c\x45\x3a\x19\x62\xdc\x39\x74\x3b\x07\x60\xb4\x63\x31\xe9\x91\x85\x31\xbd\xb1\x93\x30\x7e\x33\xb1\xb1\xd3\x66\xc7\xc7\x78\x58\xbe\x49\x21\x16\x22\x59\x31\x37\xcf\x3a\xfe\xf8\xc2\xcb\x6c\x94\x87\x6f\xc2\x61\x62\x30\xcf\x1a\x59\xfb\xcf\x50\x76\xf6\xd9\x62\x19\xd4\x69\xed\x1d\xab\x7e\xf7\xce\x06\x47\xe6\x31\xb1\x2c\x89\x8b\xb0\x33\xf1\x0d\xfb\x14\x8e\x39\x6b\xa7\x70\x27\x36\xce\xe1\x95\x3b\xb1\xbf\x31\x39\xc6\xc3\xc1\xce\x56\xba\x93\x93\xee\xd2\xcc\xe2\xaa\xd5\xa0\xdd\x19\xb4\x2f\x64\xa5\xa9\xa6\xc3\x49\xf8\xf8\xbe\x12\x80\xc2\x0b\x89\xc9\xa5\xe2\xf5\x7c\xab\x96\x5c\x88\x0d\xfe\xa3\xb5\x7b\x76\xe9\x08\x2b\xe9\x78\xc5\xf7\x87\xaf\x37\xcf\x67\x28\xc0\xdc\xbe\xe9\x11\xd0\x87\x63\x75\x0a\x09\x84\xde\xfe\x84\xda\x8a\x4e\xa8\x6f\x58\x2f\x93\x02\x59\x41\xac\x00\x54\x07\xf7\x22\xd6\x10\x96\x87\x01\x1b\x13\xe4\xb3\x1c\x68\x93\x2e\x18\x48\x0b\x08\xfa\xd8\x50\xfb\x5d\x15\x7a\xfa\xde\xaa\x21\x56\xf0\xd0\x20\xb0\x5d\x31\x46\xfd\x53\x65\x9c\x0b\x90\xb7\xf1\xe8\x10\x35\xf6\xb7\x25\xdd\x84\x92\x86\x16\xf0\xf4\xbc\x85\x90\x40\x97\x0e\x4a\x89\x36\x14\x56\x62\x0d\x7e\xa6\xbf\x01\xaa\x9e\x57\xe0\xc8\x00\xf4\xfc\x05\x84\x7d\x55\x7d\x55\x59\x93\x77\x15\x2c\xac\x87\x07\x50\x45\x0e\x48\x73\xc9\xb9\x00\xc0\x64\x10\x88\x72\x09\x5a\xbc\x7d\x6d\x7c\x92\x61\x85\x75\x4f\x8f\xcf\x00\xad\x31\xbd\xff\x10\xad\x41\x37\xf9\xca\x2d\x19\x80\xe1\x7b\xdb\x05\x5e\x81\x06\x79\x15\x2e\x33\xcf\x74\xf0\xc6\xdf\x34\x00\x55\x95\x2e\xfa\x54\x90\x0f\xb2\xda\x8b\x5d\xde\xe1\x14\x56\x5f\xf2\xf9\x51\x25\xdf\xcb\x45\xa6\x84\xe1\x16\xb4\xec\x3e\x1b\x86\x23\x95\x77\x4b\xa0\xe7\x34\xfc\xbe\x7b\x85\x41\x8d\xd2\x4c\x94\x46\xc6\x12\x85\xf6\xdb\x65\x44\x28\x42\x92\xee\x1f\x62\x93\x63\x44\xe3\x1a\xb8\x67\x6e\xbc\x51\x0c\xed\x4e\x02\x03\x8c\x67\x5e\x67\x05\x8a\x49\x9d\x5d\x0b\x78\x7b\x3d\xad\x0a\x96\x01\x4a\x25\x06\xa0\xd0\x32\xd9\xf4\x05\x00\xae\xaf\xbe\x56\xb0\xae\xe7\x34\xb5\x88\xc9\x99\x2f\x9f\x1a\xef\xee\x2f\x6e\x20\x40\x6e\x79\xe9\xe0\x73\xf0\x99\xa7\x34\x7a\x7e\x2f\x9e\x3f\xa0\x99\x81\xf6\x8d\xca\xe8\xa9\x3d\xbd\x50\x2d\x4f\xec\xe9\xce\xac\xbf\x0c\xcf\x2f\x99\x00\xf2\xae\xc1\x89\xb2\x6e\xf6\xec\xfa\xc4\xe4\x3a\xeb\xde\xfd\x85\x5f\x3e\xbd\x6f\xb8\x6b\x68\xe0\xec\xa0\xff\x49\x84\x6d\x50\x2a\x45\x8e\xd7\x00\x1f\x19\xa5\xd7\x7b\xe4\x0d\x58\x4d\x64\xf7\xa3\xfb\x14\xe5\x6c\xdf\x00\x87\xe4\x94\x6c\x4d\xde\x8d\x8f\x0f\xe0\xb3\x1e\x8f\x07\xe2\x87\xcc\x22\x5b\x83\xc3\x33\x8a\xfa\xe1\x2e\x2d\x7a\x86\xd2\xc5\xe1\xe1\xe3\x2a\x0d\x2e\xe2\xe1\x81\x22\x40\x11\x54\xb3\xdc\x35\xbc\x56\xb4\xdf\xec\xb5\x24\x5b\x67\x9b\x35\x6c\x2a\xc9\xaa\x09\x2a\x3d\xfa\xc5\x02\x06\x4f\xed\x9f\xcf\xb1\x6e\xcf\x52\x0f\xcd\x23\x65\x48\x83\x5d\xa8\xb0\x26\xe0\xd9\x7e\x4e\x07\x9e\x53\x95\x0d\xca\x2b\x3a\x6e\x6a\x70\xd8\x60\xeb\x9e\x78\xb2\x02\x1c\xd6\x51\xb9\x37\xcd\x93\xeb\xda\xec\x59\xba\xc5\x20\xf9\x35\x37\xa6\x67\xe8\x6a\xb2\xce\x00\xcd\x92\x66\x72\x5a\x85\xb5\x32\x2a\x0d\x40\x45\x4b\x42\xb4\x3b\x32\x37\x3f\x85\xd8\xf3\x00\xe0\xf0\xe3\x00\x4c\xa5\x9a\xd5\x7c\x71\x5d\x83\x06\xc5\xb1\x23\xa0\xd5\xb0\x96\x0b\xdf\x9e\xa4\x0d\x04\xe3\xa0\x8a\xb4\xe9\xf1\x98\x05\x18\x8d\xf4\xcd\xf0\xc0\x09\xbf\x0f\x72\xa0\xc1\x9e\x59\x1e\xdf\x8d\x45\x1d\x10\x54\x50\xd1\x3e\xae\x94\x22\x03\xe8\x72\xc7\x96\x10\x54\x0a\x3d\x52\x5c\xd4\xe5\xf7\xdc\x6f\x4a\x59\x81\x9b\x3c\x2e\x7d\x54\x7a\x56\xfa\x8c\xf4\x53\xd2\x4f\x4b\xd7\xa5\x9f\x97\x7e\x51\xfa\x03\xe9\xaf\xa4\x7f\x90\xde\x93\xfe\x9d\xb8\x88\x4a\x76\x91\x45\x72\x90\x1c\x23\xcf\x90\x4f\x92\xff\x44\x7e\x81\x7c\x8b\xfc\x8f\xe4\x2f\xc9\xbb\xe4\x47\x2e\xb7\xab\xb7\xe3\x83\x3c\xdd\x41\x51\x66\xed\xfa\x31\x1b\x76\x18\x33\x9d\x8d\xb4\xf0\xdc\xb3\x67\xfc\x58\x47\x2f\x23\x96\xd1\x46\x3a\x1b\x8f\x59\xd9\x4c\x4a\x0e\xf3\x2e\xbb\x12\xdb\x55\x26\xe5\xf0\x21\x67\xb3\x99\xec\xec\x22\x11\xd2\x48\xe1\x67\xe2\x77\xc5\x1c\x79\x8b\x7d\xa3\x68\x84\x04\xb3\xa1\x79\xe2\x44\x65\x65\xd3\x1d\xe8\x2e\x7d\xd3\xb9\xd8\xae\xab\xf6\x64\x20\x07\x53\x22\xe2\x49\x30\x23\xd3\x1d\x3f\x11\x39\x98\x75\x3b\xdb\x0f\xe7\x8c\x88\x05\x85\x06\x3f\xe3\x3c\x96\x88\xdd\xe2\xc2\x57\x3f\x2a\x42\xd8\xb3\xc3\x44\xa0\x22\x69\x87\x54\xe9\x50\x2a\x3b\x96\x8f\xf1\x98\x13\x6c\x1e\x4e\x39\x4b\x08\xb7\x88\x8a\xcc\x74\x26\x15\x71\x48\x8b\x72\x1f\xf3\x8c\xa5\xc4\xc3\xa5\x63\x1d\xb3\x2b\x41\x9d\x14\x23\xd5\x6c\xd6\xd1\x2c\x7a\x0c\xa7\xd0\xa7\x3a\x5b\x8a\x94\x03\xac\x08\xf3\x45\x27\xf1\x3d\x42\x82\x7e\xe2\x10\x17\x63\xa1\x54\x36\xe4\xec\xe4\x8d\xb8\x11\x5d\x20\x1d\xa5\x4b\xdc\x88\xbb\xc3\x29\x2b\x9b\x36\xa2\x4e\x82\x57\x36\x6a\x74\xb2\x54\x9c\x0d\x4c\x76\xc7\x6f\xa5\x13\xfe\x12\xdc\xf1\x54\x94\xc3\xb3\xd9\xb4\xfd\xeb\x0b\x27\x44\x39\x94\xb2\xcf\xcd\xa8\xb3\xc9\x10\x54\x49\x41\x48\x12\xc7\x6b\x47\xee\x91\x36\xfe\xe3\x36\x24\x18\x21\x3b\x89\x63\x4e\xa7\x2a\x07\x79\x4a\xbc\x36\x62\xd1\x12\xeb\xa8\xfd\xc5\xb6\x3a\x65\x3f\x06\xa9\x4c\xcf\x1e\x19\xe8\x71\x23\x6e\x9c\x9d\xa8\x6c\x02\x18\x63\x83\xa1\xc9\x3b\x8f\x2c\x00\xe4\x94\xdb\xfc\x8d\xbc\x55\x29\xe4\x00\x6a\xe5\x04\x03\xe8\xed\xd6\x87\xf6\xb7\xd8\xd5\x72\x79\x26\x0d\x49\x75\x21\xb2\xb2\x60\x7c\x62\xc1\x3f\x10\x16\xfd\x1d\x63\xa3\x8b\xea\xfe\x8f\x96\x01\xa8\x30\xb4\x07\xa6\xde\xf2\x14\xf0\x3e\x19\x12\xb9\x3c\x80\x7f\xac\xb4\x30\x83\xad\x84\x6f\x06\x66\x0e\x62\x83\x37\x80\x22\xed\x1f\x01\xaf\x61\xaa\x50\xf3\xf4\x32\x50\x11\x91\xbc\x82\x98\x6c\x00\x78\x53\x73\x32\x42\x30\x70\xbc\x4f\x01\x00\xff\x70\x93\xb7\xdf\x6d\x6a\x98\x3b\x75\x38\x3a\x5d\x4c\x50\x6a\x66\x3e\x94\x67\x40\xf3\x80\x3d\x5e\x53\x99\xee\xa6\xf9\xfa\xc8\x08\xe8\xe8\x1a\x31\x03\x03\xdd\x7f\x00\xac\x49\xd7\xdb\x6a\x68\x44\x51\x81\x56\x31\xa7\xf1\x22\x02\x1e\xec\xa1\x63\x06\x36\xc9\x0f\xb1\x6e\x3f\x47\x13\x21\x70\x14\x90\xe9\xed\x4d\x8e\xfb\x8f\xab\xc0\x66\x86\xd7\x36\x59\x49\x05\x68\x81\x46\x9b\x80\xeb\x0a\x53\x27\x06\xa1\xa4\x20\x74\x4f\x17\x81\x2a\xf8\x70\x2f\x22\x52\x2c\xd3\xe4\x40\xcf\xd2\x24\x43\xe8\x3d\xa4\x62\xc2\x1a\x20\x3f\x00\xe0\x0c\xd5\xbc\x4e\x91\x35\x4c\x80\x1a\xca\xa7\x01\x0f\x1a\x49\xb3\x02\x49\x9a\x8e\x21\x18\x63\x8c\xd5\x10\xe4\xa3\x94\xaf\x0e\xac\x70\x2d\xdf\xce\xf7\x46\xfb\x07\x49\x09\x0f\xc6\x18\xf4\x45\x46\x46\xf2\xb1\x34\x86\x0f\x33\x63\x61\x20\x32\x1d\x67\xc0\xda\xcd\xdd\x83\x88\x5a\x0e\x50\x0d\xed\x46\x98\x1b\xa2\xb4\xcc\x12\x65\x4a\xea\x35\x48\xec\x1b\x83\xe0\x4f\xb4\xf0\xe8\xae\xcf\x0d\xcc\x6b\x55\x18\x9c\xd8\x1b\x82\x32\x94\xa6\x02\x43\x7d\xae\x63\xee\x37\x13\xe1\x5d\xe5\x75\xb5\x19\x59\xba\xf7\x37\xb8\xf6\xa3\xf4\xa1\xde\xc7\xf6\x56\x81\xba\x03\xd5\xf2\xc4\x3d\xaa\x45\x15\x98\xfd\xcb\x1f\xbe\x7b\x05\x80\xbd\x14\x1a\xc9\x35\xde\xfa\x4a\x3b\xfa\x4a\x91\x56\x6a\xea\x2d\x23\xba\x79\x6d\xcf\xb1\xef\x5b\x9c\x97\xe0\xcf\xf3\xe5\x0a\x28\x0a\xd4\xe8\x75\x9d\x55\x34\x13\x40\xcd\xf4\x6a\x93\xa3\x00\xb3\xfd\x8a\xb2\x74\x8a\xb1\x6d\x0e\xc3\x59\x3d\xd2\xa3\x07\xee\x06\x7a\x19\x6a\xa8\x16\x82\x93\x14\x74\xd4\x18\x52\xbd\x80\x58\xb8\xce\x56\x76\x7d\x28\x04\xc5\x9c\xc6\x92\xc9\xd5\x53\xfb\xb9\x76\xfd\x51\x3f\xad\x27\x2e\xbf\xfa\x2a\xbf\x7c\xf9\xfc\xb1\x33\x67\x54\xb8\x4a\x3f\x1c\x80\x64\x05\x4e\xa5\x7d\xee\xdb\xc3\x58\x05\x64\x1c\x66\x86\xa1\x0c\x3d\x9f\x00\xbc\x06\xab\x95\xa1\x05\xe0\xd7\xf8\xdd\x86\xc2\xd6\x15\x78\xba\x4b\xc9\x9c\x3f\x27\x3f\xea\x07\x8a\x49\x44\xdf\x47\x81\x82\xd5\x7e\x03\xcf\x8d\x7e\xff\xf3\xd3\x30\xd6\xf3\x99\x2f\xd0\x6d\x15\x5f\xcb\xe1\xee\xc7\x80\xfa\xbf\x9a\x28\x35\x78\x36\xd8\x34\x01\xdd\x47\x2a\xc2\xdc\x13\xf0\xc9\x48\x11\x78\x0d\x64\xef\x3a\x2e\x1c\xa7\x88\xde\x07\x15\x3a\x7a\x47\xf2\x12\xf4\x10\xe0\x2a\x28\xe5\x82\xb5\xae\x72\x1a\xf9\x30\x45\xf2\xbc\xfa\x6c\xbc\x06\xc6\x93\xb0\xa1\xdf\x1d\x03\x1c\x3d\xce\x38\xf8\x3f\x01\xe8\xfa\xa4\x7e\xfd\x2a\x18\xf7\x71\x6b\x24\xb4\xc5\xaf\x7b\x3c\x40\xf3\x7a\x2e\x5f\x2a\x20\xf6\x3d\x4e\x0f\x9f\xea\x19\xc3\x3d\x87\x38\x2a\x2d\xfb\x0f\xa3\x6a\xce\xcd\x50\xcc\x59\x14\xd6\x80\x52\x7c\x48\x56\xfa\x9f\xa5\x47\x8f\xa8\xc0\xc6\x86\xb0\xcc\x0f\xec\x01\xb6\xd5\xdd\x8f\xe7\xfb\x71\x1d\x90\xd6\xd8\xe0\x19\xfb\x78\x18\x12\x67\xc4\x3a\xbc\x24\x65\xa4\xf3\xd2\x7d\xd2\xc7\xa5\xcf\x48\x2f\x48\x3f\x2b\xbd\x2c\x58\x97\x7f\x20\xbd\x29\xfd\xa9\xf4\x6d\x02\x64\x94\xc4\xc9\x14\x49\x93\x05\xb2\x9f\xdc\x42\x4e\x92\x7b\xc9\x1a\xd9\x20\x1f\xb9\x89\xa9\x07\x45\x25\x35\xd2\x46\xd4\x4f\x3c\x72\x50\x16\xc8\x78\x48\xf4\xed\x76\xd1\x8b\xd9\x3d\x7b\xc7\xbf\x30\xdb\x9f\xcd\xa4\x48\x27\x36\x3d\x93\x16\x82\x79\x7b\x0a\xb2\xbb\xf7\x40\x66\x9e\xcc\x46\x5c\x99\x74\x66\x81\xb0\x51\xfb\x54\x71\x05\x49\x90\xa7\x76\x02\xa7\x76\x14\x85\xa9\x8e\xcf\x6c\x28\x42\xec\x02\x1d\x33\xa2\xc2\xad\xd0\x31\x51\xe1\x3b\x99\xbe\x8e\x0c\xcf\x11\xc3\x67\x0d\x27\x72\x78\xa7\x0c\x66\xb2\x71\xb7\x28\xda\xd1\x70\x30\x9c\xb6\x0f\x98\xb8\x98\x89\x8d\x4e\x1e\x88\x68\x99\xed\xfe\xb6\x63\xa6\xd2\xf1\x01\xfc\x8f\xbe\xf3\xb3\xd9\x78\x5a\xd4\x60\xc2\x6f\xb6\xe4\x62\x35\xee\x78\xc9\xec\xa4\x43\x86\x52\x96\xe1\x4e\x45\x88\xdc\x51\xca\x65\x3b\x21\x57\xf1\x74\x54\x76\x5c\x5a\x6e\xde\x9d\xd3\xa6\xc7\xed\x69\x7f\xc7\xdf\xc5\x61\x7f\xde\xcc\x31\x89\x87\x3b\xa4\x4c\x81\x8f\x1b\xe4\xcf\x6f\x3b\x62\xea\xd7\x31\x1a\x1d\x1a\xbd\x70\x80\x1e\xdb\xa3\x30\x04\xce\xd6\xf4\xc4\xf0\xb2\x6e\xc2\x60\x7f\xe0\xf4\x43\xf3\xab\xb9\x35\xef\x62\x20\x58\xd4\xd6\xf2\x77\x3f\xdf\x2e\x6f\x15\xb4\x8f\x7e\xba\xe5\x0b\xcc\x1f\x2d\x34\x69\xda\xa0\xcd\xdd\xb7\xd0\xe5\xd3\xaa\x56\xa4\xed\x77\xb7\x12\x47\x8d\x4d\xd7\xeb\x6a\x1d\xf3\x3c\xd1\xae\x0d\xce\x2a\xac\x8c\xbd\x7b\x19\x2d\x00\x2a\x8c\x9b\x00\xda\x64\xfa\x1a\x26\x00\xa8\xa6\x12\x56\xeb\xee\x46\x38\x17\x7c\xbb\xcf\x8f\xed\xef\x05\x82\x73\x32\xd6\x39\x79\x03\x8d\x34\x60\xef\x2d\x80\x15\x9d\x17\xdb\x52\xf8\x04\xae\x04\xe9\x5b\xb8\x5e\xc0\x99\x60\xa5\x3f\x9a\x30\x67\xfb\x15\x3e\xb9\xd0\xae\xe7\x13\x08\xc9\xf1\x1e\x5c\x45\xe8\x09\x16\x01\xfd\x77\x63\x7a\x11\xb1\xac\xb3\xf0\x00\xa3\x2d\x1f\xf9\x44\xbe\xa8\x00\x0f\xec\x47\xcf\x1e\x45\x2f\x51\xcc\xa9\xb0\x0a\xed\xbc\x62\x15\xc9\xab\x98\xe7\x54\xb1\xea\x3e\x43\xe7\x55\xc8\x4d\x87\x06\x7a\x4a\xfe\xb9\x12\xce\xf6\x16\xf7\xf4\x43\xa8\x7b\x6a\xa6\xfd\xc6\x70\x16\x86\x23\xca\x37\xa2\x71\x86\x91\x20\x06\xa6\x00\x83\x5d\x39\x06\x6f\x95\x69\x36\x50\x04\x3a\xef\xd5\x8c\x61\xe6\x3a\x04\x2f\x25\xa3\xb3\xdb\xe5\xe2\x0b\xea\x6b\x0a\xb4\xac\x7c\xd9\x62\x85\xcb\x83\x2e\xb2\xaf\xae\x6c\xcf\x1d\x2f\xf6\xf6\x46\xc6\x5c\x17\xb0\xd0\x7c\xfb\x65\xc2\xeb\xf5\x1b\x2d\xfc\x97\x93\x4a\xfd\xb9\x07\xd4\xf5\x4a\x7d\x62\x82\xe6\x88\xd9\x5c\x2f\xa0\x6b\x37\x70\x46\x54\xa6\x4d\x7f\xa4\xfd\xa3\xbb\xc8\xcb\x90\xd8\x66\x23\x7b\xe2\xf1\xcd\x4b\x2a\x83\xd0\x53\xac\xfb\x19\xbe\x0d\x03\x33\x0a\xd4\x91\x42\x31\xb7\x38\x07\x00\x0d\x0e\x07\xce\x0f\xba\x54\xbc\xcc\x2d\x36\x26\x0f\xfb\x20\x7f\x07\x51\x5e\x06\x86\xea\xc1\x65\x04\xef\xe3\xf4\x25\x56\x6a\xf1\x03\x17\xf8\x76\x8e\x01\x82\xee\xbb\x77\x03\x16\x47\xb1\x86\x78\x19\x00\x7b\x3f\x92\x6c\xe5\x01\x8b\xcb\x6e\x0a\xc1\x2f\x02\x42\xb2\x89\xb9\xcb\x6c\xe9\xde\x1c\x3e\x64\xb0\xf1\xf0\xca\x61\x78\xb1\xfd\xe3\x95\x07\x60\x5b\x01\xbc\x44\x71\x9d\x67\x47\x97\x96\x01\x37\x81\x9d\xdc\x0d\xda\x6a\xf7\xf9\xc2\x9a\x42\xe9\xa5\x6d\xf0\xae\x24\xf8\x76\xf1\xce\x30\xd2\x0d\x96\x8c\x9d\x00\xdc\x54\xe9\x9d\x3d\x6c\xec\x08\xdf\x9b\x01\xb3\x88\x7c\xfa\x10\xc2\x4c\x1a\x90\xd5\x81\x7a\x97\x15\xca\x87\xcf\x6d\x22\x04\xef\xc0\x0f\xb9\xf0\xe4\xe0\xc8\x99\x8e\x6f\x07\x78\x98\xe8\x35\xbf\x24\x7d\x45\xfa\x15\xe9\xb7\xa5\x3f\x92\xbe\x23\xfd\xbd\xf4\x8f\xd2\x7b\xd2\x8f\x49\x17\xf1\x91\x20\x89\x10\x83\xcc\x08\xc5\xf7\x11\xc1\xdb\xbe\x48\x36\xc8\x53\xe4\x13\xc2\x79\xea\x15\xf2\x27\xe4\xbb\xe4\xfb\xe4\x3d\xf2\xef\x2e\xe2\xf2\xba\x98\x2b\xec\x1a\x75\x99\x1d\x5e\x8b\xdd\xae\x09\xfa\x63\x30\x2c\x07\xb8\x53\x32\x62\xce\x3a\x6e\x86\x74\x9c\xbf\xe7\x89\x53\x05\x8c\x4c\xca\x48\x67\xb2\x72\xd8\xe3\x18\xef\xc5\x63\xb2\x11\xed\x92\xc3\x32\x8b\x90\x6c\xd8\xf1\x3b\x4d\x85\x45\x14\x5f\x36\x6e\x64\x0d\x2b\x20\xb2\x2b\xa2\x32\xcf\x3a\x39\x74\xf6\xa5\xee\x38\x2b\x75\xfa\xc1\xd9\xac\x68\xce\xc2\x69\xe1\x09\x65\x37\xbd\xa9\x4c\xda\x32\x76\x50\x35\x51\x39\xfc\x22\xad\x36\xbb\xd3\x4e\x39\xbe\x1a\xb1\xa8\x63\x90\x25\xb0\x3b\x43\x74\x8e\x22\x2b\x50\xf4\xc8\x76\x5b\x2c\x64\xcc\x82\x81\x18\xec\x00\xdd\x8e\x59\xb6\xb1\x83\x56\x8b\x0b\x3d\xba\x23\x5c\x89\x09\x0a\x65\x46\x78\x84\x74\x8c\xbc\xc5\x8f\x58\x1d\xa7\x0e\xfb\x26\x24\x18\x4e\xd9\x6d\x75\x5a\x38\x88\xcb\x1e\xc3\xe9\x88\xdd\x72\x27\x6d\xc3\x09\x46\xcd\xda\x4d\x5e\xb6\x43\x45\xcf\xba\x83\xb2\xf0\x07\x11\x29\x82\xe2\xfb\xd1\x4e\x82\x85\x13\x09\xe2\x44\xe7\x46\x0d\xc7\xfd\x9b\x8b\x45\xa4\x93\xf9\x24\xd4\xd8\x3b\xa6\xab\x61\xd1\x87\x3b\x0a\x1d\x39\x66\xc4\x84\x08\x5c\x18\x71\xc8\xc2\x18\x4a\xdc\x2b\x97\x1d\x7a\x63\x3a\xe5\xe4\x6d\x44\xc8\x07\xb4\xd0\x9b\xf1\x7c\x42\x1c\xec\x64\x31\x39\x98\x8c\x83\xa0\x74\x36\x91\xe2\xd1\x44\x8c\xa0\x68\x56\x3b\x77\xd8\xa5\x42\x68\x62\xfc\x2e\x9e\xc7\xc1\xfe\x1a\xa0\x56\x98\x19\xd3\x47\x97\xf1\x85\x5b\x4e\xee\x1b\xfb\x98\x9b\x96\x1a\xa6\x59\xf6\x07\xd5\x6a\x32\xc7\x91\xda\x43\xd2\xe4\xe9\x4d\xd0\x91\x81\x62\x4e\x4c\xa8\xca\x5f\x7e\x24\x09\xf8\x82\x4e\x95\x5c\x8e\x5b\xf4\xa0\xac\xae\xf9\x7d\x48\xbd\x3d\x00\xd7\xa9\x0e\x07\xf7\xbd\x19\x3a\x89\x9e\x68\x0e\x2d\xca\x2b\x80\x0d\x00\x34\x13\xd0\xed\xca\x25\x11\x54\x1d\x3d\x7b\x15\xce\x51\x2d\xe4\x11\xbc\x43\x25\x13\x91\xae\x51\xff\x54\xb2\xc7\xed\x5d\xf6\xf4\x9b\x33\x0b\x3d\x6e\x4c\x44\x82\xd0\xd3\x87\x0d\xe0\xbe\x23\x08\xed\x6b\x79\x73\xc8\xdb\x17\xbb\x74\x64\x60\x5f\x5f\xa2\x7e\xfe\x80\x82\x43\x7d\xd4\xac\x5a\x3a\x60\x49\x69\x99\xf8\xaa\xeb\x24\xee\x0b\x92\xcb\xdd\x67\x80\x97\xb1\x5d\x38\xd9\x0b\x14\x6b\x48\xd5\x16\xd0\x7b\x3c\xe4\x4d\x68\x20\x74\xdd\xde\xa6\x99\xbd\xb0\x0a\x94\xbc\xd3\x02\xf7\x1d\xed\x6d\x80\x44\x43\x01\x0a\xfb\x8f\xf0\x2b\x7d\xf7\x03\x6e\x76\x93\x7f\x44\x08\x1f\x64\xd0\x7d\xe3\xb1\xe1\x53\x3a\xe2\x3a\x05\x5d\x2f\x27\x00\x96\x77\x01\x79\x1f\x5c\x83\x23\x07\x10\x61\xf3\xc6\x3b\xd3\xf7\x00\x06\xa6\x1a\x2e\x45\x5d\x03\xbd\x7e\xe3\xad\x62\x5e\xed\x75\xc5\xa7\x27\xe2\x2e\x2d\x51\xc3\x35\xb4\x7f\x37\x50\xf4\xca\x8d\xb7\xd5\xc1\x59\x1e\x39\xcd\x82\x11\x88\x04\x5d\xa8\xa8\x53\x3d\x00\x0d\xe0\x83\x83\x79\x60\x89\xa4\x57\x4e\x30\x53\x57\x19\xaf\xb6\xdf\xe5\x96\x46\x77\x0d\x51\xcf\x1e\x0e\x8d\x6f\x56\xec\xe6\x88\x16\x29\x28\x3f\x5e\xe8\xa1\xd8\x75\x10\xdf\x2c\xe8\xe3\x06\x2d\xdb\x43\xf2\x5b\xd4\x3b\x8f\xb4\x50\x0d\x2f\xf0\xd2\x75\x98\x1e\x81\x64\xb1\x40\x71\x72\x00\x20\x97\x57\x50\xcd\x79\x58\x02\x5b\x25\xfd\x9b\x48\x69\xfe\x9f\xe3\x50\x68\xbf\xb7\xdd\xb2\xac\x55\x33\xb2\xff\x9f\x6f\x79\xe9\x93\xff\xc3\xd7\x03\x73\x61\x0a\xee\x79\xbd\xc4\xae\x02\x7c\x72\xfa\x75\xf6\x53\xf3\x1a\x2d\x99\x00\xed\x57\x5f\xe5\x56\xfb\x0b\x67\x00\x50\x49\xf6\x1c\xae\xe1\xc4\xa1\xbe\xe3\x8c\xdf\x3d\xa9\xd4\xef\x73\xc9\x4d\x18\x1a\xbd\xa6\x6e\xe2\xec\x47\x10\x0b\x95\xd7\x8f\x9c\xd6\x3e\xee\x87\x72\x4e\xaf\xe7\x01\x55\xc8\x03\xae\x86\x7a\xc1\x3c\x7e\x70\x7f\x0c\x1b\x80\x5d\x73\xcd\x77\xfa\x5d\x48\xad\x64\x33\x6f\xc2\x3a\x99\x59\xbd\x75\x49\x2b\x8f\xcf\x94\xcc\xc1\x67\xc7\xc3\xae\xc7\x28\xf0\xc2\xe4\x6d\x3f\xd6\x26\x6f\x37\xfd\xc3\xe3\xbf\xfe\xa1\x2f\x6c\x72\x9a\x1c\x48\xad\x53\xc0\x0b\x13\x88\x5b\x40\xe9\xf0\xfc\xae\x19\x1a\x79\x94\xdf\x3e\xa3\x0c\x3e\x5c\xa8\x6b\x5f\x24\x14\xf4\x2d\x30\xe1\x1b\xc0\x5f\x06\xde\xf7\x1c\xc7\xd8\x43\xd6\xd9\x63\xe6\x75\x50\x19\xdf\x66\xa3\x8f\xb7\x5f\x54\x8a\xdb\x35\x80\xbd\x17\xb4\x6f\xce\xfe\x49\xfa\xa3\xe6\x2b\x66\x2e\x74\x91\x82\x3a\xed\xea\x79\x20\x6f\xe6\x5f\x54\x76\x77\x6f\x5a\x14\x8e\xdf\x0d\x8c\x2b\x4a\xf4\xa2\xce\xae\xe7\xf1\xd8\x47\xc0\xac\x34\x15\x75\x58\x7e\x61\x4f\x28\x7c\x1f\x9b\x5f\x38\x16\xd2\x2b\xe3\xfb\x72\x7c\x3c\xe5\x7d\x90\x5e\xcb\x15\x2a\xbc\xc4\x94\x62\x83\xe7\x59\x60\x01\xad\x46\x23\x37\xdd\x9d\x03\xc5\x9a\x1c\x83\xad\xbe\x48\xbe\x06\xd9\xd3\xfa\xae\x54\x52\xa9\xf1\x64\x73\xb3\x27\x88\x0d\x93\x1e\xdc\x07\x1b\x08\x70\x39\xb7\x06\x00\x48\x37\x28\xd3\x1f\x21\x18\x7e\x80\x37\x97\xc7\x18\xea\x08\x2a\xb0\x5d\xcb\xec\x7e\x63\x76\x2f\x62\xef\x3d\x1c\xce\xf4\xc3\x2a\xab\x52\x8a\x90\xda\x05\x00\xab\x80\x4b\x93\x52\x27\x37\xaf\x6b\x1b\x5e\x93\x26\xa5\x73\xd2\x63\x22\x99\xf5\x6b\x9d\x64\xd6\x3f\x96\xfe\x42\xfa\x5f\x09\x10\x4a\xfa\xc9\x18\x99\x16\x69\x79\x07\xc9\x51\x72\x92\x9c\x25\x1f\x22\x8f\x92\x27\xc9\x65\xf2\x82\xc8\x0f\x7f\x8d\x7c\x8b\xfc\x31\xf9\x73\xf2\x77\xe4\x5d\xf2\x3e\xf9\x89\x0b\x3b\xbe\x1e\x8e\xa3\x93\x27\xc6\xed\x39\x5c\x38\x0f\x1a\xb2\x30\x75\x72\x0c\xaf\x53\x86\x73\x5e\x90\xb0\x63\x42\x30\x2b\x12\xc3\x1d\xbb\x52\x87\xe2\x91\x8e\xa7\xb3\x86\x95\x75\xce\x88\x59\xc7\xb7\xc9\xa1\x7f\x90\xf0\x6c\x78\x76\x47\xb9\xe8\x54\x23\x61\x7e\x14\x4e\xc7\xdd\xe1\x6c\x28\x38\x1b\xf6\x4c\x92\x19\x57\x26\x9b\x49\xed\x00\xbc\x1d\x6d\x8d\x63\xc5\x2d\xb2\x8c\x1c\xda\x44\x3a\x16\x95\xb3\x41\x51\x60\xb3\x86\x83\x04\x84\x67\x05\xc4\x9f\x16\x9b\x4e\x71\x24\x08\xa6\x46\x58\x40\xac\x46\x5a\xa4\xb1\x46\xc3\x32\x77\xa8\x8c\xc2\x9e\xda\x69\x4f\x05\x41\xdd\xee\x3c\x33\x0b\xc4\x70\x07\x3b\x1d\x6c\x2a\x2c\xc7\xe2\xce\x01\x92\x4d\x85\x85\x2f\x86\x7d\x18\x1a\x02\x50\x16\x08\x47\x30\x2c\xa0\x69\x43\x76\x96\xab\x71\x23\x15\xdc\x69\x41\x83\x0e\xad\x5f\x30\x54\x0c\x71\x83\x98\xdf\x15\x0e\xca\x8e\x8e\x20\x18\xce\x8a\xbd\x45\x47\x31\x1a\x37\x9c\xa0\x55\x23\xcc\x85\xac\xd4\x88\x45\x83\x63\x8e\x2d\x84\xdc\x21\xa1\x58\x76\xd5\xce\x38\xd9\x49\xe2\x97\x16\x5a\xcd\xe8\x8e\x0e\x41\x04\xc6\x3a\xd1\x1a\x4e\x5e\xac\xfd\xd0\xa1\x9d\xee\x38\xe4\x50\xb4\x04\x50\x6e\x3f\xcd\x8e\x2d\x6c\x2c\x18\x4a\x65\x3b\x3f\x93\x72\x9e\xfd\xbc\xe0\xa3\x92\x57\x94\x2f\xcf\xd0\xf2\xd5\x5c\xe8\x8c\xb2\xd6\x73\xf8\xa7\x1f\x55\x39\xd3\xb9\x56\xc9\x69\xa5\x79\x37\x60\xad\x67\xfc\xb6\x3b\xda\x6f\x02\x78\xef\xc8\xde\x79\xfc\x4b\x89\x60\x8c\x79\x87\x4c\x3d\x3b\x56\x49\xae\x6a\x14\xd4\xc2\x77\x5e\x09\x86\x11\xb0\x70\xf1\xe2\x2b\x75\x2d\xa1\x24\x5c\xaf\xea\xe1\xfd\x14\x69\x13\x6a\x81\x01\x48\xc8\xc3\x45\x4c\xa6\xda\xdf\x55\x68\x15\xa1\x7b\x44\x7d\xbd\xcc\xe5\x85\x52\x11\x32\x83\x50\xdc\xaa\x6a\x50\x05\xc0\x2a\xb0\xfe\xbd\xb4\x8c\x2c\xa9\x00\x8e\xcf\x5f\xb7\xec\xb9\x10\xb8\x06\xea\x3b\xdd\x67\x69\xf7\x99\x76\x41\x5e\xca\xeb\x39\x44\xd4\xf4\x57\x83\x01\xb3\xb7\x1b\xc0\x2d\xc3\xdc\xbf\xc1\x9a\x58\xfd\xda\x1f\x5a\xb8\x4a\x57\xcd\xee\x93\x3c\x97\xd8\x6a\x2b\xa8\x82\x37\x4c\x5e\xa2\x4d\xa0\x8d\xf6\xf5\x91\x03\x4c\xcb\x23\xd4\x7c\x01\xda\xbd\xb7\x67\x09\x5e\xc7\x04\x1f\x93\x91\x5b\x25\x0e\x09\xa6\xd4\xdb\x97\x3d\xf7\xd0\x8a\x36\x3b\xa1\x8e\xcd\xf0\xd7\x72\x0c\x93\xca\x15\x8a\xef\xec\xf3\xd1\x74\x04\xde\x45\x80\xf0\x5c\x82\xa9\x40\x23\xe3\x3a\xe4\x46\x46\x00\xfa\x1e\x49\xea\x58\xbb\x4a\x57\xc6\xb8\x0e\x90\x27\x45\x56\xa2\x40\xeb\xe8\xbf\x0d\x78\x23\x89\x3d\x27\x78\x4b\x81\xa4\x86\x74\xa3\x8c\x20\x1f\x44\x5a\x54\x70\x92\xf4\x9e\xac\xd6\x19\xe0\xf2\x30\xd4\xf5\x62\xa0\x6f\x1d\x13\xbb\x7a\x76\xc9\xcd\x85\x1e\x85\xd2\xe9\x69\x04\x7c\x3f\xe1\x0d\x7f\xa3\x86\x7d\x8b\x1a\x1c\x0b\xe9\x78\x78\xe8\x4a\x55\x99\x9c\x32\x4f\xcb\x10\x18\xd3\xe1\xb5\x81\xd4\x60\x74\xfd\x25\xb8\xf0\x59\x1d\xa1\x09\xa7\x1e\x78\x45\x90\xdb\x87\x87\x56\x86\x03\x47\xab\x49\xbc\xdc\x7a\x1f\x5a\xff\x69\xe0\x46\xab\x01\x50\x59\xcd\xd5\x54\xac\x4d\x8e\x25\xfb\x7a\x12\xc7\xba\x0b\xc6\xd4\xde\x78\x9e\x2b\x0a\xf8\x47\x95\x8d\xea\x89\x7b\x8b\xba\xbe\xff\xfe\x03\xe7\x9f\x26\x5f\xbd\x52\x61\xb4\x4e\xc3\x47\x15\xca\xa1\x5e\xa5\x76\x15\xd7\xc0\xe2\x00\xc3\x2b\xad\xaa\x02\xac\x52\xa9\x71\x68\x71\xd8\xac\x5f\x46\x40\xba\x45\x61\x4b\x0e\xae\xd1\x75\x86\x7b\xf6\x02\x54\x2a\x50\x87\xf0\x1c\x03\x56\xa4\xd1\x10\x34\xb1\x01\x25\x30\x96\xa0\x81\x09\x2c\xe1\xc0\x7c\x8b\x16\x9d\x64\x73\xce\x57\x39\xac\x6b\x17\x7b\xa1\x85\xac\xfb\x22\x5d\x8b\x77\x8f\x9c\xa4\xa0\xb7\x92\xf4\x12\xd7\x00\x20\xd0\xf7\xca\x26\xac\xb1\xc5\xc3\x99\x03\xb8\xca\x19\xc5\x35\xc5\x3e\x83\x70\x99\x10\x02\xcd\x90\x87\x72\x5c\x05\x18\xbd\x0b\x12\x35\xdc\x7d\x0b\x4e\x1d\xa7\x08\x65\x5a\x06\x05\xd8\x7d\x32\x6b\x01\x4f\xda\x2f\x46\x6d\xc6\x87\x08\x50\xa8\x4d\x4c\x40\x19\xe6\x87\x55\xd0\x51\xd7\x75\x58\xab\x26\x8c\x29\xfb\x44\xe5\x91\xc3\x1c\x9a\x88\xd1\x63\x65\x25\x27\xaf\xa8\x6a\x95\xf1\x96\x05\x98\x57\x39\x2f\x41\xe0\x20\x96\xe9\xb9\xbe\x49\x6f\x33\x8f\xeb\xf4\xf6\xb0\x55\xca\x73\xd8\x84\x02\x14\x34\x28\x9b\x0c\x60\xfa\x10\x05\x46\x55\x08\xf4\xe1\x2a\xa0\xe7\xa4\x8a\x5b\x48\x2f\x31\x6c\x41\x49\xc7\x0d\x08\xec\xd7\x3b\x38\x81\xe2\x29\x4a\xfb\xa5\xc7\xa4\x27\x45\x8e\xf6\x7f\x96\x7e\x43\xfa\x5d\xe9\x0f\xa5\x37\xa5\xbf\x92\xfe\x91\x48\xa4\x97\x04\xc9\x18\xd9\x2b\x72\xf5\x1e\x14\x9c\xf4\x8f\x91\x2b\xe4\x1a\xf9\x02\xf9\xb2\xd0\x3f\xa5\x1c\xbb\x6c\x1e\x73\x7a\xf7\xe8\x30\xe9\x18\xef\x19\x1e\x3f\x11\xb2\xcb\x58\xd4\xb0\xec\x62\x6a\xf7\xef\x56\xd6\xc8\x2c\x12\x11\x81\x67\xd7\x2c\x51\xb1\x53\xc2\x42\x8e\xcb\x61\x8f\x1c\x96\x79\xca\xae\xda\xb3\x59\xa3\x3f\x9b\x49\xcd\x66\xd3\xf1\x58\x34\xed\xd0\x5b\x04\x46\x69\x19\x72\x54\x16\xe0\x03\x71\x22\xf0\xec\xc7\xd8\x19\xe2\x33\x69\x2b\xb6\x83\x26\x0b\x93\x3c\xee\x38\xbf\x3a\x32\xce\x05\x22\xcc\xf4\x3a\x96\xd1\x59\xb1\x9f\x13\xae\xac\x42\x0d\xe5\x30\x49\x44\xfe\x9d\x65\x58\xf2\x4e\x27\x9c\x49\x3b\x4e\x74\x02\x34\x88\x76\xb0\x5d\xc1\x8d\x13\x6d\x73\xda\x4f\xc2\x59\x41\x32\x74\x18\x79\x3b\x46\xad\x0e\xd8\xfc\x01\x79\x26\x98\xca\xda\x45\x5b\x78\xfe\x04\x77\x18\xab\x4e\x3d\xec\x9c\x27\x76\xa5\x13\x9f\x89\x3a\x2c\x1e\xd3\x39\x08\x62\x41\xc7\x7d\x48\x48\xea\xd3\x51\x23\x1a\x21\x59\x43\x8e\x39\x14\xf7\x0e\xd9\x4f\xe0\xb3\xc2\xa4\x67\xe7\x19\x0a\x54\xc1\x10\xeb\xc7\xb4\x41\xb6\x40\xc5\xf3\x67\x12\x15\x93\x6a\xc0\x95\xe0\x8a\x92\xab\x17\x72\x8a\x92\x30\xa1\xa1\x59\x23\x27\xcb\x08\xd0\xe5\x06\x05\x4c\xfb\x62\xd2\xa2\x51\x8f\x67\x43\x37\x57\x76\xb5\xdf\x6e\xd0\x3a\x0c\xf5\x01\x24\x4a\x14\xfd\x5e\x28\x26\x7b\xf7\x2c\x04\xfa\x8c\x3c\x2a\x99\x90\xc9\x34\xcb\x7c\xab\x30\xb6\x3c\x3f\xea\xcb\xea\xc2\x18\x07\x61\x15\xa7\x27\x18\x62\x43\x55\xd4\xfa\x2b\xa9\x31\x2c\xb2\x7a\x83\x83\x52\x01\x10\x22\xf4\x2a\xb2\xa6\xf5\x62\x82\x8e\x74\x9f\xec\xaf\xe1\xdb\x00\xbe\x2c\x96\x28\x47\xac\x76\x4f\x54\xf5\xaa\xb2\x41\x37\xe9\x1a\xe6\x20\x14\x4a\x40\x15\x61\x1d\x5b\x93\xc3\x2a\x94\x11\xd4\x66\xb0\xcb\x37\x54\xaf\xb2\x4d\x9c\xdd\x4b\x7b\x6e\x07\xd8\xd0\x36\x61\xf9\x20\xef\x3f\xcf\x61\x03\xd7\x68\x53\x55\x85\xe8\x9d\xb6\x10\x54\x33\x8f\x70\x7b\x18\x16\x96\x7d\x3d\x5b\xe8\x9d\x81\xfa\x43\x01\xd8\x52\xfc\xa7\x19\xc5\x2a\x03\xd8\x04\x58\xb3\x4b\x71\x0b\x56\x31\xd1\xfd\x18\xdd\x52\x11\x00\x5f\x69\x41\x4b\xc1\x16\xce\xa5\x28\x1b\x5f\xf6\x76\x71\x33\xaf\x8e\xae\x30\xd8\xd0\x9b\x4a\x7a\x9f\x8e\xba\x92\xf7\x14\x01\xb0\x5c\x98\x7e\xd8\xca\xd3\x7c\x0b\x6f\x5b\xe4\xb7\x06\xbd\x3d\x30\xf1\xed\x17\x01\x96\xdb\xff\xa4\xd7\x68\x45\x07\x85\x69\x5a\x63\x83\xfe\xe2\x33\x45\xe0\x88\x90\xd4\x4e\xa7\x86\x3e\xfd\xbd\x1b\xdf\x4b\xf5\x31\x6d\xfc\xbf\xb3\x03\xff\xa2\x94\xb5\xc8\x68\xe1\x12\x25\x97\x6b\xe5\x22\xad\x28\x67\x33\x96\x4e\x79\x92\x3f\x16\x67\x6f\xbc\xe1\x1f\x88\x91\xe3\x7c\x15\xa6\x8e\x24\xd9\x25\x6a\xe6\x29\x5e\x06\x6f\xa0\xd0\x52\xe1\xc8\x30\x84\x0f\x63\x3e\xf8\x08\xa5\xfc\x32\x83\x6d\xf6\x68\x0f\xac\xb3\x0d\x6f\x18\x0a\x30\xd5\xb3\x06\xeb\x79\xbd\x88\x50\xb7\x78\xbf\xab\x8c\xbb\xa3\x65\xce\x39\xd6\xf8\xfa\x36\x5e\x0a\xdf\xa9\x05\x0e\x6b\x26\xd4\x00\x37\x92\x30\x36\xc3\xa1\x8e\xca\x06\x35\xab\x5c\xcd\x6f\xe1\xa1\xbd\xb8\xc1\xe9\x66\x15\x86\x1e\xc2\x53\x7d\x85\x4d\x0a\x8f\x0d\xe2\x26\xe5\x4d\xad\xca\x29\x5c\xc2\x75\xca\x29\x09\x87\x4f\x03\x3e\xd6\xcb\x2b\xf9\x1a\x5c\x7d\x01\xfa\x26\xc1\x64\x97\x81\xe1\x76\x03\x1b\xc8\xa0\x4e\x19\x7f\x3c\x08\xeb\xac\xff\x29\x5c\x67\xa1\x0f\x7d\xe6\xc0\x96\xa2\x2a\x00\xef\xf4\x5f\xc4\x8d\xdc\xe0\x05\xca\x6e\x99\x86\x04\x2c\xac\xf0\x5c\x81\xd3\xf4\x71\x80\xab\xac\xf7\xa9\xf4\xad\x1c\x92\x0a\x96\xa5\x09\x49\x6a\x37\x21\x07\x2f\x49\x79\xe1\xfd\xf1\xeb\xd2\xef\x49\x6f\x48\xff\x4d\xa8\x62\x08\xf1\x91\xb0\x50\x84\xdf\x43\x1e\x21\x4f\x91\x67\xc8\x55\xf2\x39\xf2\x55\xf2\x6b\xe4\xb7\xc8\xff\x4c\xfe\x9a\xfc\x2d\xf9\x07\xb1\xc7\x9a\x71\x65\x5c\x79\xd7\x7e\x57\xd5\x75\xd6\x75\xb7\x6b\xd3\xf5\x29\xd7\xe7\x5c\xd7\x5d\xbf\xe0\xfa\xba\x24\x11\x87\x02\x1c\xce\x76\x00\x07\x57\xd0\xc9\x5f\x16\xc8\xa5\x53\x99\xb2\x0e\x7f\x36\xb3\x40\x64\xc3\x01\x1f\xd2\x96\x58\x64\x65\x04\x43\x43\x74\x6a\x56\x36\xec\xd9\xe9\x3c\xa3\x0e\x2d\x40\xc4\x85\x84\x3b\xad\x66\xca\x10\xed\x65\xc6\xe9\xe7\x64\x1e\x73\x34\x32\xd9\x78\xcc\x32\x1c\xc7\x6c\x8f\x4c\x3c\xb1\xb0\x30\xb7\xec\x6c\x5f\x44\xe7\xe3\x18\x88\xb8\x53\x22\x9f\xcc\xc1\x40\x44\x61\x0c\x3b\xa4\xe1\x58\xda\x23\xf6\x45\xa2\x64\xc8\x3b\x40\xe5\xce\xea\x66\x76\x87\x38\xec\xa0\xa1\x11\x32\x9b\xb6\x3a\x3d\xa2\xdd\x71\xda\xb3\xb8\xe1\x09\x84\xc2\x41\xfb\x49\x0a\x01\x91\x50\x73\x47\x67\x88\xc7\x1d\xe6\xb1\x8e\x67\x87\x78\x46\x76\xb1\xc8\xee\x14\x4c\xc7\xce\xce\x99\xdf\x85\x48\x26\x23\xa8\x08\x9d\xd8\x4d\x87\x61\xb0\x13\xc3\x22\xb0\xd8\x8e\x79\x7f\x28\x15\xb2\x7f\x23\xc1\x6d\x11\x5d\x3b\x17\x4f\x44\x20\x29\x1d\xcf\x4f\xc1\x19\x18\x13\x3a\x21\xc7\xc2\xa4\x23\x09\xb2\xfb\xd8\xe8\xcd\x04\x01\xc7\x2c\xc4\x51\x6c\x76\x44\x3f\x3b\xa4\xe3\xd4\x6c\x76\x4c\xd8\x9b\x44\x05\xbf\xda\xea\x04\x58\xc7\x1d\x48\x41\xb0\x24\xa2\x22\x57\x2e\xee\x04\x86\x05\xb9\xfd\x92\xc7\x63\xce\xfe\xcd\x69\xe1\x2d\xc3\x1d\xde\xf1\x76\x13\xf4\x9b\xb0\x78\x27\xa2\x82\x5e\x21\xca\x78\x58\xd0\xb8\xc6\x3e\xc8\x42\xb0\x9f\xb6\x21\xbc\x48\xa3\xff\x51\xe4\x29\x3b\xb1\x38\x4e\x8c\x4c\xc8\x39\x28\x1c\x80\x57\x18\x65\x87\x9c\x37\xdc\x7e\xa3\x45\xd6\x8c\x38\x04\xec\x03\xc3\x72\xee\x24\xed\x2c\x22\x6f\x22\xc4\xf6\x5d\x92\xf7\x57\xcb\x0c\x26\x17\xb8\x3a\xba\xef\xa2\x0b\xcb\x2d\x48\x4c\x5f\xd8\xf3\x97\xad\xd6\x5d\x7d\x25\xbb\x03\xf1\x2e\xc2\xc4\x3d\xf7\xf6\xb1\x2a\x14\xd5\x35\x7d\x7e\x0c\x1b\x9e\x91\xfd\xcb\x8b\xed\x6f\x81\x6f\x72\x77\x86\xfe\xd2\x9c\x86\x1a\xf8\xb2\xd5\x96\x3e\x91\xe1\x56\x82\x42\x2d\x37\x2a\x2b\xdf\xfe\xe4\xb6\xa7\x1b\x00\xa1\x91\x60\xdd\x13\x3c\x99\xb3\xbb\x24\x8f\x07\x82\xd9\xcd\xbd\x17\xba\x67\x73\x89\x49\xd2\xa5\x75\xb9\xb7\x11\xe4\xfd\x56\x77\x48\xab\xd9\xdd\x2a\x6e\x96\x2a\x7d\xb1\x76\x43\xd9\x50\xea\xfb\x53\x63\x01\xed\x6c\x28\xa7\x55\xe5\x29\x5a\xa2\xc8\x2d\x54\x72\x43\x63\x18\xd8\x55\xf5\xcf\x21\xd2\x02\xd0\x78\x1c\x21\xb0\x80\xd4\x7f\x58\x44\x85\x79\xbb\xc2\xa7\x2b\x65\xb6\x9d\x40\x93\x98\x76\xcd\x0d\xdc\x76\xe3\x2d\x85\xd6\x60\x9d\xb6\xba\xbc\x93\x47\xcb\x4a\xbe\x66\x6e\xac\x41\x8f\x3b\x68\xe4\xa9\x0b\xd7\xe9\x3a\xe8\xa7\x46\x95\x44\x8e\x42\xe8\x0c\x07\x66\x16\x10\x5b\xe0\xed\xd9\xc0\x75\xc4\xe1\x79\xdd\x7e\x4a\xbe\x9e\x0d\xe8\xf6\xdc\x78\x0f\x8e\x0d\x52\xc8\xec\xa1\xc0\xcb\x14\xe5\xb1\x3c\x28\x66\xbc\x17\xb0\x68\x02\x07\xaa\x96\x40\xe3\x6a\x89\x53\xf0\xcd\x87\xbd\x74\xe0\x08\x79\x97\x22\xc3\x75\xc0\x9e\x25\x80\x3c\xc2\x8d\x77\x72\x16\xf9\x66\x99\xe3\x52\x00\x00\x8b\x1a\xc2\xb0\xd1\x3d\x42\xc1\x7d\x07\x42\xe0\x74\xfb\xc7\x0c\xe8\xdb\x4d\x40\x79\xd8\x42\x08\x1f\x44\xbb\xfb\x9f\xca\x82\x27\xd4\xbe\x34\x20\xa3\x42\xb5\x24\xb5\x12\x2c\xc1\x70\xd8\xc0\x57\xc0\x73\x36\x96\xb6\xba\xfb\x01\x21\xb0\x1f\x01\x46\x32\xb4\x3b\x6a\xf6\xf9\xcb\x18\x59\xda\x80\x99\x20\xe4\x49\xbe\x81\x58\xb7\x7f\x89\xee\xf3\x70\x70\x88\xd2\x9c\xef\x56\xf0\xde\xf8\xfb\x24\x44\x22\x43\x3e\x9d\xd4\xa1\x77\x16\x60\x74\x48\xe5\xeb\x88\xa6\x3b\xab\x07\xee\x83\xe2\xd9\x09\x84\xe9\x63\x60\x4d\xad\x50\x50\x1e\xf7\xb1\xc4\x2a\x03\xdc\x0a\xca\xc6\x61\x80\x74\xac\xff\x82\xc2\x2b\xc9\x1c\xc0\xe0\x5e\x95\x63\x33\xa7\x8c\x2f\xb2\x8d\x7d\x7d\xc1\x2e\xa5\x45\xaf\x2b\x89\xf8\xa0\x15\x9e\x82\xf1\x2e\xa6\x0e\x67\x95\xa5\x21\x84\x97\x8a\xf9\x99\x01\x80\xc6\x1d\x7d\xfa\xd4\xd7\xda\xdf\xfd\x28\xfb\xde\xb7\x1e\x3c\x10\xa5\x7a\x23\x31\xf5\x31\x9d\x2b\xf4\x6c\xff\x66\x49\x67\x00\x70\xf7\xa9\x89\xdf\x2c\xb3\xbf\xfe\x56\xe1\xf4\x64\xf2\xc6\x06\xe8\x8f\xde\x51\x5d\xeb\xf6\xe0\x76\x0e\x60\x7e\xae\x04\xad\x56\x5d\x85\x0f\x1f\xd7\xf1\xb5\x4b\xaf\xae\x02\x5c\x85\x8f\xfc\xd9\x43\x47\xd0\x2a\x32\x50\x91\xf1\x8d\x1e\x5f\xad\x70\xe4\xc9\x5f\x39\x43\x7e\xa8\x5d\xc1\x72\xb2\xaa\x36\x01\xd7\x91\x5d\xff\xe9\x5d\xf1\x3d\xe1\x01\xe5\x1b\x5f\xfc\xe3\x95\x3e\xfe\xc6\x5d\x7f\xba\x77\x9a\xb1\xab\xa8\x6e\x42\xb7\xa7\x9a\xc4\xe3\x73\xca\xfc\x6d\xe8\x7d\x0e\xf0\xd4\x1c\x60\xf7\xb3\x14\x5f\x00\xcf\x67\xb8\xb5\xb9\x7a\x95\x7a\x42\x0d\x1a\x9d\x65\x6b\x28\xdf\x09\x35\x30\x37\xe9\xab\xd0\xde\x98\xf4\xf2\xe6\x6f\x7e\xf6\xa5\x27\x09\x79\xc5\x84\x72\xad\x6b\x74\x0b\x37\x6f\x0d\x9e\x48\xd1\x52\xb2\xb1\x8a\xa0\x40\x2e\x8f\xad\xfc\x35\xc0\x6d\x95\xd6\x4c\xc0\x2d\xcc\x5d\xd3\x55\x4e\x57\x73\xfc\xdc\xd1\x02\x68\x1b\x0c\xb1\x50\x4e\x16\x77\x7b\xf2\xeb\x49\x58\xe3\xad\xfd\x3d\xe0\xea\xce\x6f\xb0\x04\xd6\x7d\x7e\xf4\xdd\x0f\x1a\x05\xe4\x38\x74\x7b\xb2\x0c\x50\x46\x4b\x57\x20\xc7\x02\x4b\x3a\x3d\xee\xe6\x35\x35\xaf\x59\x7a\x43\x55\xeb\x9c\xbb\xee\xa9\x82\x5a\x52\xf8\x06\x87\x5c\x9e\xce\x1c\x06\xac\xf3\xb9\x99\xb5\x0a\x24\x51\xe1\x4a\x15\xfa\x96\x15\xff\x09\x8a\xa0\x97\x00\xa2\x67\x29\x74\x79\x81\xd1\x9e\xfb\x20\x97\x43\xcc\xe5\x98\xdd\xe1\x0f\xdf\x01\x50\xe6\x4a\x65\x75\x15\x1b\x2c\x74\x01\x5b\xf0\xc4\x00\x20\xbd\xf7\x70\x3d\x8f\x83\xb3\xb0\x2f\x02\x29\x62\x0f\x04\xde\x7d\x80\x05\x55\x53\x60\x03\x75\x0c\xcc\x4d\x0f\x5e\x82\x22\x3c\x3d\x04\x78\xe0\xbc\x95\x5c\xe5\x0a\x3c\x3b\xe2\x4e\x6d\xf6\x77\xc3\x65\x36\x7a\x2f\xe8\xe4\x39\xa5\x67\xe1\x58\x06\x9a\x2a\xc2\x96\x02\x0b\xcb\xa0\x61\x53\x1d\xbc\x08\x08\x13\x23\x50\x42\x9c\x8e\xc3\xfc\x30\x60\x3e\x09\xb7\x06\xed\x51\x40\x64\xa3\x75\x7d\xc3\xfd\x86\xb4\x24\x7d\x58\x7a\x5a\xfa\x84\xf4\x53\x42\x1f\xf6\xab\xd2\x6b\xd2\x7f\x11\x89\x3a\x7f\x2b\x12\x75\xfe\x4f\x32\x4e\xe6\xc8\x0a\x39\x46\x9a\xe4\x5e\xf2\x20\x79\x8e\xbc\x25\x32\x40\xdf\x77\xc9\xae\x5e\x57\x7f\x07\xdb\x1f\x26\x72\x38\x95\x49\xcd\x0a\x0a\xbb\x1c\xee\xb2\x0b\x2c\xf7\x93\xb8\x91\x76\xf0\x17\x43\x1c\x28\x1e\x3f\xb1\x4f\xbc\x19\x22\xa4\x39\x8b\x0e\x23\xcd\xca\xca\x61\x26\xf3\x2e\xd9\xe1\xaf\x75\xbc\x13\x66\x05\xa4\xdc\x15\x16\xf1\x9f\x99\x6c\x26\x60\x64\x8d\x45\x92\xb2\x8c\xf8\xa4\x60\xea\xc6\xd3\x4e\x10\xbf\x63\xdf\x9d\x8d\x3b\xe6\x28\x02\x82\x10\x67\x85\x9f\x84\x1d\xd9\x69\x36\x15\x21\xc2\x0e\xb5\x93\xf8\xec\x08\x3d\x45\x9a\xe6\x3c\x49\xbb\xc5\x6a\x52\x30\xdb\xe2\xe9\x94\xd0\xb2\xb9\x3b\x3c\x3e\x61\xa0\x7a\x13\xc0\x17\x15\xbf\x63\x87\x15\x0e\xa6\xd2\x22\xba\xcd\xb1\x38\x30\x64\xfb\xf4\x0f\x3a\x36\x98\x62\xd1\xe7\x58\x7e\x39\xfc\xc3\xac\x98\x0d\xb2\x0e\x37\x78\x27\xc0\x4c\x3c\x05\x8f\xdc\x41\xd6\xe5\x9d\x64\x9c\xa8\x1c\xee\xe8\xd8\x3a\xc1\x0d\xce\x1d\x44\x77\x52\xd8\xe2\x9d\xbc\x9c\xe8\x98\xe3\x8e\xd0\x09\xdf\x8e\x8a\x9f\xb3\x3a\x41\x16\x9d\x66\xe1\x83\xfb\xb6\xdf\x1c\xc1\xea\xb9\xd9\x49\x08\x4c\x3f\xc8\x85\x94\x6e\xe7\xa0\x15\x2f\xbd\x48\xb5\x73\xa7\x44\x8f\x20\x3b\x4c\x9d\xa8\x3d\x1f\x39\xbe\x9f\x4e\x47\xe2\x9c\x6d\x51\xa7\x33\x71\xf4\xb8\xf3\xc2\x37\xbc\x83\xe0\x04\xc3\x71\x52\x61\xc1\x95\x0d\x0a\x60\x0c\x2f\xdd\x1a\xbf\xc0\x50\x00\x27\x70\xa5\x74\xd7\x92\x49\xd1\xdd\x65\xcf\xde\x91\xd1\xa9\x48\x6e\xf4\x71\xbe\x98\xae\x51\xac\xe4\x75\x41\xe8\xdd\x68\x80\xba\x69\xc2\x40\xec\xb6\xc5\x3c\x06\x63\x5a\xa1\x90\xb4\xc7\x5b\xd3\x1e\x97\xf7\xf6\x4e\x8f\x38\xde\xdc\x89\x99\x05\x75\x2b\x91\x00\xce\xf4\xfe\x09\xbc\xf4\x96\x35\x13\x84\xd8\xd1\x4c\x06\x03\xa7\xd9\xb9\x20\x84\x4f\x70\xac\x01\xf3\x9f\x00\x5a\x65\x08\x4a\x91\x73\x98\x0a\xcc\x04\x13\x68\x02\x02\x70\x24\x1b\x6a\xdd\xbe\x27\x5a\x13\x87\x03\xb6\xaf\xf6\xcc\xa9\xa0\xeb\x9c\xe8\xb0\x01\x93\x07\xdb\xaf\xa4\xa6\xa0\xc8\x98\x1e\xd8\x0f\x48\x1b\x5b\xf0\x96\x80\x73\xb0\xee\x38\x88\xef\x19\x41\x48\x14\x38\xd4\x81\xee\x4f\x01\x1e\x8a\xc2\x06\xb6\xb0\xaa\xb7\x9b\x8b\x63\x00\x07\xfd\x58\xc5\x3a\x28\x4a\x70\x28\x89\x38\x36\x03\x2b\x03\xa8\x44\x46\x13\x5e\x63\x0d\x8d\xa5\x1e\x9f\x1a\xea\x2f\x51\x3c\xef\x01\x38\xdd\x83\x43\x07\x29\xf9\xce\x70\x16\x0f\xcf\x40\x9d\x21\xbf\xf1\x7a\x6e\x0b\xd9\xbe\x34\x62\x77\x3c\x87\x91\x83\x00\xa7\xfd\x74\x7f\x8a\xbc\x85\xb7\x4c\x53\xdc\x95\x02\x3a\x38\x9b\x44\x8c\x1c\xc6\xd4\xb8\x8a\x10\x5c\xe6\x34\x76\xc2\x9e\x6d\x90\xfa\x17\x4c\xca\x1a\x58\x17\x9f\x9d\xed\x2e\x8a\x10\x33\xc0\xe6\x8d\x1f\xd3\xd5\xe0\xb2\xaa\x97\x0b\x70\xc9\x33\xb2\x05\x3d\x53\x39\x05\xe8\xfc\x7e\xc4\xbd\xbb\xf1\xd2\xcc\x40\xe4\x3e\xa8\x05\x8f\x23\xd6\x30\xaf\x69\x7c\x93\x7c\x1f\x96\x86\x12\x65\x86\xee\x37\xcc\xe5\x83\xf4\x0a\xb0\xd6\xc6\x48\xc6\x5c\x6d\xbf\x07\x79\xa8\x7f\x6b\x9e\x66\x3f\x97\xfc\xdb\x99\xb1\xc7\x35\xce\xa0\xd0\xba\xf6\xde\xeb\xb5\x75\xff\x58\xe1\xf5\x8f\xfd\x76\x35\x61\xe5\xd6\xf3\x5f\x9e\x7f\x93\xb6\x1b\x89\xd3\xed\xbf\xb8\x04\x7a\xf1\xbd\xdf\x99\x1e\x7b\xe2\x64\x54\xa9\x15\x15\x9a\x6f\xbf\x0f\x9f\xb9\x05\x13\xe1\x81\x79\xb2\x40\x5f\x03\xb6\x95\x28\x17\xcc\x64\x8e\xb2\x2f\xfd\x4f\x95\x88\x1b\xb8\x9e\x84\xbd\xfd\xb8\x27\x8e\xbc\xa2\xab\x75\x8e\x35\xab\x54\xf3\x78\xa0\x01\x15\x30\xcb\xb4\x01\x90\xf2\xc2\xe2\x0c\x98\x98\x30\x81\x53\xcc\x61\xbe\x9a\x03\x8a\xb7\xf6\xd1\x1c\xa2\x06\x4d\x8d\x4f\xdc\x02\xa0\xc2\x86\x99\x9e\xe7\x47\xd2\xd8\xd4\x3d\x83\x56\x15\x28\x6e\x71\x44\xb4\x74\x00\x05\x3f\xd4\x8d\x0d\xfb\xef\xa7\x09\x65\x05\x98\x3c\x7a\xaa\x4f\xad\x37\xa2\xe7\x01\x5a\x14\xe0\xf1\x01\x5c\x47\x5a\x4e\x42\xfe\xd4\x18\xc0\x91\x5d\xb0\x8a\xdb\xc1\xbb\x12\x16\x46\x96\xf8\x9d\x81\x0a\xe4\xad\xed\x0d\x05\x8d\xd3\xf9\xa6\x56\x36\x8f\xc5\xe1\x2e\xa2\xb0\x26\x32\x48\xcf\xf0\x6a\x89\xd3\x87\xe4\x44\xed\x1b\x97\xe5\x13\x07\x0e\x60\xd7\x5c\x1e\xd5\x0d\xb8\xd7\xed\xf3\xcf\x2d\x27\x94\x0d\x06\x54\xaf\xe4\x2a\x09\xec\xbf\xa0\xc7\x8f\xf5\xc9\x14\x7b\x1f\x66\x9c\xcf\x1e\x03\x3c\x1b\x02\x5e\xd5\x01\xbb\x1e\xa2\xf6\x5f\xd8\x06\xbd\xb4\x39\x7c\x6b\x1d\x60\x6d\x6d\x8d\xd6\xd4\xd2\xb9\x31\x54\x2e\x95\xae\xb2\x7c\x9e\xd1\xc9\xa3\x58\x4a\x22\x5e\x6e\xe2\x7a\x83\x0e\xaf\x60\x09\x6a\xa0\xac\x23\xc0\x3a\x96\x34\x64\x8a\xa3\x41\x92\x24\x97\xe9\x49\x4a\xfd\xd2\xb0\x64\x48\x27\xa4\xdb\xa4\x47\xa5\x4f\x49\x5f\x12\x0e\x8b\xbf\x29\xfd\xbe\xf4\x6d\xe9\xef\xa4\x1f\x11\x97\x40\xe6\x63\x22\xef\x79\xee\x03\x27\xed\x70\xd0\x13\xe3\xb2\xc8\x38\x0b\x73\xa1\x8d\xb4\x04\x87\x4e\xec\x1a\xe3\x86\x25\xf0\x72\x67\x08\xe8\x14\x95\x8e\x8b\x4b\x4c\x84\x7d\xd9\x6d\xb8\x60\x66\x1b\x22\xa0\x59\x8e\x90\xa0\x5d\x77\xe5\x1d\x3c\xbf\xcb\xd5\x71\xde\x4e\x3b\x81\xcc\x43\x24\xd3\xd5\x09\x15\x48\xcd\x2e\x92\xfe\xb4\x7d\x2b\x7b\x74\x0a\xf0\x94\xc3\xd2\xe8\xf8\x4f\xcf\x90\x61\x12\x72\xbc\x8e\x85\x9c\xd8\x2e\x3e\x1d\x28\xdc\xb1\xb8\x4a\x3b\xd2\x20\xa7\x92\x89\x67\x12\x95\x85\xfd\x76\xe7\x58\x88\xa7\xfd\xc4\x7e\x36\x86\x27\x38\x2b\x0c\x92\xa3\x37\x0b\x9f\xe3\x96\x6d\xdc\xec\xf0\x3d\x42\x2b\x79\xd3\xd5\x59\x0e\xed\xfc\x7c\xc7\xeb\xa6\x93\xc1\xdc\x81\xab\x49\x05\x06\xcf\xd6\xec\xaa\xa2\xae\xed\x7a\xbc\xaf\x47\x29\x29\x4a\xcc\x57\x80\xe6\xb5\x88\xaf\x8e\xe0\xb9\x27\xd9\x3b\x81\xe1\x51\x1d\x2a\x4c\x70\x79\xf5\x2a\x42\x93\x55\x11\x9b\x34\xaf\x24\xd7\xec\x1b\xae\x2a\x15\x4a\x69\x9e\x5d\xd6\x82\xa9\xe1\x5b\xa9\x69\x95\x8c\xa9\x64\xfc\x4c\x41\xf4\xee\xb9\x5d\x5f\x05\xaa\x30\x36\x3e\xaf\xd7\x00\xcd\x9c\x1a\x1a\x79\x4d\xcd\x9b\x70\xbb\xdf\x77\x4a\xc1\x55\x75\x1d\x21\x7a\x12\x5a\xb4\x77\x77\xae\xef\x1c\x0e\xdc\x8a\xb0\x0e\xc6\x41\x18\xda\x6f\x97\x01\x58\x47\x6c\x7a\xbb\x00\xd7\x7c\xb2\xfb\x53\xa9\x83\xb0\x41\xb1\xaa\xd2\x26\x95\x1f\x45\x3a\x6c\x78\x67\xb4\x0d\xa0\xab\xe0\xbb\x1f\x18\x6c\x6a\xa9\x83\x00\x4b\x59\x8a\x48\x1e\xa7\x9b\x4a\x3e\x69\x37\xc6\x74\x71\xd7\x48\xef\x70\xca\x6b\xe4\x4e\x0f\xd1\xd8\x61\x48\x2c\x45\x80\xc3\x1a\xa8\x07\x42\x8b\x9e\xe4\xf0\xe4\xca\x52\xae\x05\x90\x44\xf6\x72\xee\xe0\x52\x01\xa0\xbc\x96\xbc\xe7\xcc\x0a\xa9\x02\x53\x6b\xbe\x13\x93\xa3\x83\x71\xcc\x69\xac\xe5\xf1\x00\x7a\xef\x30\x61\x15\x70\x03\xed\x0e\x71\x30\x93\xcc\x53\x55\x55\xfd\x77\x6e\xdb\xc5\x9f\xd7\xc3\xc1\xf1\xf9\x91\x0c\xb4\x7f\xd8\x8e\x5f\xcc\x44\xd9\xb5\x89\xa8\xc5\x18\x60\x99\xb4\x08\xbb\xfe\xe3\xef\xc1\xc1\x94\xce\x91\x35\xaf\xba\xe4\x71\xb0\xce\x0f\x5e\xc9\xbf\x4a\xea\xc9\xd9\xdd\xec\xa2\x4b\x6b\x52\x35\x39\xb0\xa2\xae\x29\x8f\xf4\xa9\xca\x6a\x1e\x47\x4e\x02\x56\x94\x75\x54\x56\x13\x1c\xc2\xf7\xa9\xd9\x83\x15\x98\x38\x04\xb8\xce\xb7\x00\xed\xee\x6f\xb5\x3f\xc4\x0f\xce\x03\xbf\xd8\x9f\xd4\xaa\xc2\xaf\xf1\xb2\xe7\x61\xab\xb0\xa5\x6d\x03\xac\xb3\xa9\xbb\x1a\xdb\x57\x70\x65\x89\x2b\xb3\xb7\x40\x5e\xed\x7f\x58\xb9\x9c\xa3\xa7\x53\xd8\xfb\x21\x76\x6b\x7a\x20\x55\x4a\x94\x2f\xb3\xe1\x7b\x75\x38\x91\x65\xdb\x1c\x2f\xe1\x5d\xf6\x25\xc7\x7f\xf2\x95\x76\xad\xab\xd7\xfd\x4f\x52\x9f\xa4\x49\x13\xd2\x8c\xb4\x4f\x3a\x24\x3d\x28\x3d\x2f\xfd\xb4\xf4\xa2\xf4\x7b\xd2\x1f\x48\xdf\x15\xb9\xb3\x94\x3c\x40\x3e\x42\x9e\x21\x57\x6e\x5e\x73\x41\xbe\x43\x9c\xca\x0a\xaf\xd1\x45\x12\x37\x1c\xbc\x41\x10\x56\xad\x19\x92\x35\x04\x50\x29\xef\x90\x1a\x82\xa1\x8e\x35\x47\xcc\xe3\x0c\xc0\x69\x63\x67\x5f\xd6\xe5\x91\x5d\x1f\x98\xdb\x47\x8d\x74\x26\x95\x0d\x75\x3c\xf1\x03\x99\x94\xd5\x25\x9a\x96\x2e\x4f\xac\x43\xfb\x74\xa0\x0e\xf1\x4d\x91\x7a\x92\x75\x38\x00\x62\xaf\x23\xae\x78\x71\x15\x44\x77\x78\xff\x02\x89\xe0\x62\x2a\x9e\x15\xcb\x1e\x87\x6b\xf5\x81\x5d\xa7\x68\x23\xb2\xe9\x68\xc7\xb8\x53\x0c\xe2\x02\x70\x70\xe2\x13\x0d\x91\x27\x12\x8b\x1a\x1f\x44\x01\xca\x9d\x64\x92\x9b\x6d\x48\xb0\xe3\xbe\x6e\x37\x92\xf6\x2d\x9c\x7f\xed\x51\xde\xd1\x1b\x3b\x06\x23\x42\x44\x73\x73\x87\x26\x38\xbd\xf1\x98\x43\x9e\xdd\x49\xe4\x95\x77\xcc\xd9\x1d\x1d\x49\x3a\x6a\x10\xfb\x1b\x33\xc2\x75\xc4\xf0\xec\x60\xa7\xa9\xa0\x30\x93\x4f\xc7\x0d\xf2\xef\xea\xe4\xd3\x45\x28\xc1\xd8\x17\x8b\x09\xc5\xa2\x96\x86\x48\x03\xc1\xde\xd0\xe0\xe0\x8b\xb7\x8e\xd6\x15\x00\x3d\x67\x15\x36\xd0\x3b\x53\x00\x36\x7a\xbf\x3a\x78\x8c\x03\x4d\x82\x7c\xb4\xb7\xff\x6d\x55\x8b\x5f\x50\x9b\xba\x39\x9f\x8e\x9e\x54\x97\x8c\xc4\x6a\xcd\xe3\xf2\x66\xd9\xc0\x71\x3e\x33\x90\x54\x55\x2d\x1d\xab\x00\x85\xf5\x99\xb9\xc8\x61\x1e\xf1\x55\x99\x9a\x2f\x27\x2e\x4e\xab\x09\x53\x53\x13\x15\xf5\xcd\x42\xd7\x00\xb6\x5a\x00\x93\x4b\xd8\x7d\x12\x03\x4b\xd0\x40\x5c\x0e\x82\x52\xa6\xaa\x37\xe2\xf3\xf3\x9a\xa2\x6b\xd4\x75\x16\x71\x38\x85\xd0\xc0\x1a\x42\x83\xaa\x08\xb4\x62\x36\x69\xf7\x21\xea\x3d\xc5\x2b\xd0\x40\x5a\xc6\xa6\x06\xdd\x27\xcd\x68\x06\x31\x3c\x6a\xb2\x3a\xe8\x45\xac\x0a\xcb\xa7\x1a\xb0\x22\x42\xef\x34\x65\x08\x15\xe4\x25\xc4\x0a\x56\xf1\x40\x3f\xd6\x51\x3e\x81\x2d\x2a\xdf\x0e\x50\xa7\x08\x4d\x8a\x10\xb8\x13\xef\xef\x53\xab\x78\x36\x44\x37\x11\x36\x10\x07\x2f\x20\x6e\xe2\x3d\x23\xa9\xe1\x82\x06\xa1\x03\xed\x1f\x6f\x20\x6c\xf2\x4b\x68\x6d\xb3\xab\xcb\xb7\x51\xfa\x4a\x82\x6e\x23\x7e\x38\xe0\xfe\xa7\xfe\x67\x73\x05\xa6\xaf\x5e\x49\xa5\x93\x33\x07\xb7\x4e\x0d\x57\xf4\x45\xb7\xa9\x54\xa9\xf5\x88\x4f\x0d\x1d\xd2\x39\x24\x72\x40\xcd\xfc\x15\xc0\x62\x91\xc1\xae\x3b\x7a\x27\xd4\x35\x06\x25\x1a\xda\x13\x94\x41\xed\xeb\x4a\x2f\x8f\xce\xf3\x5b\xda\x7b\x1e\x7f\xbf\xfd\x83\xa9\x7d\xc3\xa8\x7b\x9f\x98\x5a\x56\xe9\x47\xc1\xbd\x77\xee\x2b\x7f\xf0\x85\xa3\xa4\xeb\x87\xfd\xed\xaf\x00\x58\x00\x37\xbe\xf7\xaf\xae\xfd\xf3\xd6\x3a\xc7\xca\xef\xfc\xc6\x79\x12\xbd\xf6\xe3\x4b\xaf\xad\x0e\x18\xc1\x00\xcc\xba\xa8\x5a\x53\x60\x7e\x3c\xc7\x82\x2b\x58\x84\x26\xde\xe2\x01\x30\x93\x80\x14\xb8\xb2\x55\xbf\x02\x3a\xe8\x09\xd6\x7d\x06\x79\x8e\xd7\x11\x2b\xbc\x79\x85\x53\x28\x5f\x83\x0d\xac\x03\x86\x8e\xd1\x2a\xd0\x3a\x16\x71\xe8\xe8\xba\x5e\x7b\x45\xcd\x6b\x09\xd0\xf5\x3c\x8c\xa7\x00\x39\xd7\xa1\x86\x50\x44\xa8\x43\x81\xd3\x9c\x82\x25\xa5\x8c\x25\xad\x02\x58\x60\xa1\x13\x80\xa7\x38\xde\x81\x0d\xde\x7d\x8c\x61\x5d\x23\x77\x01\xb6\x98\x7d\xa7\x0d\x65\x03\x70\xcd\xd5\x3f\x76\x04\x5b\x08\x1b\xb3\xc7\xbe\xf7\x23\x80\xd2\x8d\x5f\x5d\x07\x5c\x07\xbc\xa4\x5e\xf2\x84\xb0\x9a\x00\xdc\x82\xc0\x9d\x1c\xe1\x09\xf7\xce\x7e\xfd\x8a\xfb\x3b\x52\x4e\xfa\x90\xb4\x21\x3d\x21\x7d\x4c\x68\x19\xbf\x22\x7d\x55\xfa\x2d\xe9\xbb\xd2\xff\x2e\xfd\xa3\xf4\xaf\x52\x9b\x74\x91\x10\x19\x22\x63\x64\x9c\xcc\x92\x3c\x39\x41\xea\xe4\x0e\x72\x2f\x79\x8e\x7c\x81\xbc\x48\x7e\x89\xbc\x42\x7e\x8d\xfc\x2d\xf9\x11\xb9\x21\x14\x00\xdc\x35\xb8\xe3\x31\x14\x4a\xc9\xa9\x8c\x08\xbd\x08\x73\x59\x98\x7c\x04\xec\x81\xcd\xb1\x4d\xf6\xc8\x4e\xce\xb5\x48\xaa\xce\x66\xb2\xfd\xe9\xd9\xac\xd1\xdf\x15\xe6\x7e\x97\x67\x27\xdf\xcf\x2e\x1c\x46\x26\x95\x49\x89\x3b\xcb\xa4\x5d\xf6\x4f\x2e\x10\xcb\x2e\x4b\xf6\xf5\x69\x05\x1c\x11\x80\x98\xd1\x42\xa9\xb4\xe5\x68\xad\x6e\x2a\x00\x1c\x4c\x91\x3b\xc4\x22\x71\x04\x87\xc2\xc1\x4e\x2d\x70\xdc\x83\xd3\x96\x61\xb9\x6f\x56\x0e\xfb\xd4\x75\x3b\xe6\x42\x42\x3f\x17\xec\x20\x6d\xb3\xa2\x2a\x08\xc8\x50\xcc\x7b\x6e\xa7\xa6\x38\x9d\x41\x36\xbd\x83\x1d\xc6\x76\xf2\x2e\x78\x38\xbe\xc3\xb4\x17\xb7\x0f\x09\x1a\x58\xdc\xed\x78\x27\xcf\x76\xf6\xd4\xa9\x60\x38\xeb\x68\xf3\x16\xec\x9a\x9b\xca\x0a\x4b\x12\x63\x98\x08\x46\xec\x0e\x19\xc0\xea\xc0\xa5\xe9\xb8\x3b\x74\x93\x06\xea\x64\x41\x09\x1d\x98\x3b\x14\xe6\xf6\x7f\x11\x62\x3f\xe9\x08\x99\xb5\xcb\xac\x91\x15\x37\xb4\x44\x8e\x84\xf3\x1a\x7c\x00\x31\x5a\x63\xc1\x70\x2a\x1e\xeb\xa8\x4a\xb3\x41\x91\xb2\x1a\x21\xa2\xd0\x8a\xd9\x2d\x1d\xe3\x62\x1e\x8b\x05\x77\xc2\x27\xec\x8a\xcc\x63\x71\x67\xe7\xee\x44\x5e\xa4\x6e\xd6\x6b\xb1\xb6\x17\xcc\x00\xa7\x4d\x1a\x73\x62\x05\x3f\xe0\xc8\xca\x3b\xf6\x15\xa9\xb4\x41\x4a\x74\xf0\x58\x43\x73\x79\x18\x1c\x1f\xdd\x13\xda\x86\xdc\xba\xf6\x22\x6d\x15\x14\x63\x61\xdf\x9c\x32\xe0\xaf\x95\x0f\x4d\x34\x15\x80\xe2\x98\xbf\xe4\xee\x82\x5d\xc3\x90\x37\x2b\xf6\xdc\xe6\x8d\x31\x6d\x97\x11\xf1\x81\x2b\x5a\xa5\xf9\x91\x03\xbe\x54\xe9\x49\xb9\xda\xd4\xb2\x1f\x7e\x89\x77\xbb\x4a\x1c\x00\xc7\x23\x78\xe0\x2b\xf7\x0c\x6e\x6f\x22\x14\x0a\x38\x78\x01\x36\x29\x84\xc7\x72\xf4\x84\xdf\xdb\xf5\x48\x10\x60\x93\xdd\xdb\x47\x3d\x8f\xf1\x1c\x58\xa4\xba\xb9\xda\xbe\x62\x17\xc1\x2a\x96\x40\x49\x6c\x92\xd6\x3a\xae\xc3\xd9\x10\x22\x0c\x2f\x33\x00\xde\xc2\xc0\xfe\xe1\x1e\x98\x3c\x6a\x61\xb5\x5d\x81\x12\x16\x19\x58\x40\x94\xaa\xce\x62\x27\xa0\xfd\x02\xf8\x7d\x54\x23\xa5\x9c\xe1\x53\x20\xaf\x0a\xa7\x78\x3c\xd1\x63\x16\x95\xf6\x2b\x00\xf0\x3e\x9a\x53\x7e\x4c\x24\x5f\xa0\xf8\xce\xfc\x2e\xbb\x21\x01\x9e\x63\x45\x64\x33\x3e\xff\x61\xad\xae\x01\xd4\x20\x57\x42\xa8\x00\x69\x7f\x4e\x43\xd9\x67\x1d\x1b\x6c\x24\x06\xcf\xd7\x19\x22\x69\xf9\x8c\x9c\x9e\x03\x7a\x09\xea\x39\xd9\xdb\x33\xc0\x56\xb1\x89\xa5\x0a\x53\xdb\x5b\x10\x18\x2d\x52\xf9\x28\xc3\x7d\x73\x80\xa4\xae\xa0\x57\x6e\x53\xbd\x0a\x7a\x01\x11\x5e\x81\x35\xb6\xc1\x56\x01\x0e\x8c\xd0\x75\xf0\xdd\x8b\x6b\xc0\x56\xe9\xae\x45\xca\xf1\x01\x99\x8e\x1d\x4f\xa7\x94\x64\x99\x7c\x03\x60\x13\x21\x76\x02\xf7\xec\x01\xbd\x54\xb8\x71\xa5\x7b\xba\xc0\x72\x96\x4b\x6f\xb1\xd5\xe4\x29\x1f\xa5\x4a\x95\x27\x31\xd9\xde\xa2\x40\xdd\xdf\x29\xc7\x0e\x9a\xdf\x5b\xf1\x79\xc3\xb7\xa7\xf8\xf1\x71\xba\x1e\xeb\xbb\xab\xfd\xbb\xb9\xf4\xb2\x52\x5f\x7a\x5c\xe9\x3d\x79\xf8\x56\xb3\xf0\x68\xa0\xa0\x24\x97\x3f\x7e\xe4\x51\xd2\xfb\x19\x45\x21\x5a\xfb\x75\xba\xfe\xfe\x6b\xaf\x0f\xa5\x41\x55\x2a\x14\x68\x71\xe5\x6e\x28\x15\x5f\x2d\x6d\x9a\xde\xe7\x49\xec\xbe\xee\x33\x1f\x3f\xae\x99\xa1\xcf\x7e\x03\x59\x94\x9c\x7f\x01\xb8\xa5\xe5\x31\xaf\x36\xe0\x50\x7f\xdf\x39\x65\x6c\xde\x42\xe3\x30\x2a\xf5\x22\xa7\xba\x85\x4b\x43\x7a\xbd\xd0\x6c\x7e\xa8\x1b\x29\xa7\x35\x85\x99\x60\x31\x56\x03\xa5\x88\x2a\x83\x1a\x16\x69\x68\x4f\xa1\xaa\x40\xdf\x39\xc4\x26\x36\x11\xb0\x4a\x79\x13\xb0\xc4\x59\x21\x91\xd9\xcd\x4a\x16\x47\xff\x38\x85\x62\x0e\x18\xb3\xdf\x55\x68\x70\xa8\x69\x3a\x65\xa0\x62\xac\x6f\x57\x97\x0a\xb0\xdc\x07\x58\x06\xac\x0f\xf7\x04\x63\x9a\xca\xe8\xff\xc5\xd5\xff\xc0\xb7\x75\xde\xf7\xbd\xf8\x79\xc0\x0f\x81\x2f\xc1\x87\xc4\x43\xf2\x01\x70\x48\x1e\x92\x87\xc4\x21\x70\x48\x1e\x8a\x10\xfe\x10\x90\x04\x49\x10\x05\x49\x90\x04\x49\x90\x44\x4b\x94\x04\x59\xb0\x0d\xc9\xb0\x45\xcb\xb0\x4d\xdb\x8c\xcd\xd8\x4c\x43\x27\x6a\xc2\xc6\x4a\xa2\xa4\x6a\xaa\xb6\x6e\xe7\x2d\x6e\xe6\xfe\xe6\xb6\xe9\xe6\xf6\xe7\x76\xee\xae\xd7\x65\x9d\xd3\xb9\x7d\x25\x9b\xdb\x79\xad\xef\xe6\xae\xd9\x6e\xd6\x78\x5b\x6e\xe7\x36\x16\x72\x5f\x78\x0e\xa8\xf4\x5e\x4b\x2f\x59\x24\x21\xfc\x23\xcf\xf7\xf9\xfe\xf9\x7c\xdf\x1f\xc4\xc9\xb6\x38\xd2\x31\x70\xb2\x77\x4d\xf2\x45\x42\xca\x40\xae\x7b\xbb\x20\x9b\x3e\xd3\x5f\x16\xe8\x39\x6a\xa3\x34\x3a\xd1\x3a\xe1\x30\x3c\x66\x12\xa5\x4c\xba\x1a\xa4\xd8\x45\x2b\x5e\xc4\x93\xdd\x66\x3c\x97\x35\xfc\xfd\xde\x69\x8e\x1a\xd5\x1d\x63\xb1\x4e\xe5\x91\x99\x12\xc1\x92\xe0\x4e\x91\x5a\x87\xe0\x91\x04\x19\xc3\x93\xd0\x0d\x42\xfa\x28\xa0\x88\x5f\x80\x6c\x00\x1b\xb6\xb8\x16\xc2\xe9\x41\x84\x1f\x12\x2b\x7c\x0d\x2b\xe0\xbb\x77\x11\x41\xac\xd1\xa1\xdd\xe5\xc8\xe0\xd4\xe9\xac\xbe\x4a\x43\x67\x08\x87\xe7\x4c\xff\xbc\x7f\xa1\x40\xe1\x29\x3d\x4e\xb1\x63\x92\x53\x95\x78\x43\xa7\x3a\x80\xb1\x63\x16\xf2\xc8\x4b\x70\x70\x6d\x50\xd5\x6c\x71\xaf\xa5\x0d\x6a\xdb\xb5\xac\xb6\x4f\x3b\xac\x9d\xd2\x6a\xda\xc3\xda\x8a\xf6\x6a\xbb\x6a\xfb\x43\xed\x4f\x94\x0e\xf7\xfb\x8c\x31\x3f\xeb\x67\x83\xcc\x64\x31\x36\xab\x69\xcc\x4d\xfc\x22\x61\xd9\xe1\x51\xc3\xaa\x56\xa9\xd2\x3f\x90\x19\x98\x67\xca\x80\x3a\x19\x4e\x0c\xf4\xab\x1d\x2e\x55\x5a\x79\x82\x1d\x6e\xdb\x4b\x59\x41\x6f\xad\x18\xa9\x75\x72\x77\xd2\xe2\xbb\x9b\xe5\xb9\x63\x12\xe5\x03\xe7\x8e\x9f\x5d\xc5\x66\xea\xef\xa9\xe9\x5b\xb1\xc3\x0d\x4a\xed\x34\x71\x42\xad\xf6\xba\x06\x31\xff\xef\x61\xf6\x40\x66\x62\x8e\x75\xf8\xda\xe2\xa1\x70\x42\x55\x6e\xae\xe0\x5e\x75\xe2\x5a\x01\xdb\xd5\xc2\xba\xb1\x59\xf9\xf3\xb8\xd4\x9a\x68\x2c\xea\x73\xd7\x4f\x5b\x51\x35\x13\xcb\x44\xd4\x58\x2d\x9a\xce\x28\xa6\xbd\x8b\x91\x4b\xb7\xb7\xa7\x92\xaa\xbf\x37\x9f\x6e\x45\xc6\xb1\xad\x97\x95\x6e\x97\x6d\x51\xb6\xca\xad\xeb\x84\xcd\xbc\xb0\x67\xfa\x8e\x3e\x36\x32\x90\x4b\x15\xaa\xdb\x9a\xff\x09\x44\xbd\x5e\x71\x7f\x22\x6f\x0d\x04\xe3\x80\xb3\xd0\x7f\xab\xc8\x56\xae\xf8\xd1\x38\x16\x83\x2c\x18\x84\xa3\x53\x30\xcb\xdc\x77\x19\x5d\x1d\xfa\x54\x46\x8c\x1d\xe3\x5d\x17\x10\x3b\x06\xbe\xa2\xaf\xd0\xaa\xc0\xbe\xbd\xc8\xcf\x76\xcb\x55\xc2\xc1\x28\x95\x2c\xd0\xde\xd9\xe9\x83\x14\x3a\x03\x5a\x16\x15\xa0\xc6\x2b\xa8\xb5\xc2\xd9\x32\x8a\x34\x78\x56\x14\x51\xe7\x75\x89\x3a\xa7\x25\x03\x0f\x74\x01\x97\xfa\x80\x92\x41\x6b\xcb\xc0\xb2\xc0\x89\x11\xbf\x07\x81\xc9\x22\xd8\xa3\xf0\x26\x46\x22\xb6\xbf\x3f\x6f\x54\x4d\x0e\x08\x2e\x0c\xa2\x0a\x0a\x79\xf8\x82\x78\x6c\x80\xcc\xb2\x8d\x47\x07\xf1\x4c\x74\x53\xc8\x35\x51\xb5\x9c\x72\xea\x93\x03\x7c\x93\x74\x7b\x91\xea\x5e\xab\x6b\x6f\x71\xd1\x32\x70\xf9\xce\x77\x9b\x3f\x37\xfe\xd8\x21\xe7\xe5\x0d\xf6\x0d\x16\xfa\x21\xb3\xcd\x1f\xad\x02\xfd\x57\x4a\x82\x81\xed\xfe\xbf\x76\x7c\xf9\x35\xe8\x4f\x0e\x54\x9b\xf3\x0f\x37\x73\xe0\xa8\xd3\xb6\xde\xd6\xa5\x3a\x9c\x36\xe2\xa2\xc2\xd9\xa5\x78\xf8\x72\x1c\x83\x19\x1b\xf1\x3c\xa8\x4a\xd9\x3c\xa4\x58\x2f\x8d\x3f\xc0\x57\x4d\xfd\xd4\x36\x3e\x90\xde\xdb\x99\xa5\xf0\x7d\xa0\x9d\xd3\x5c\x14\xe6\x7a\x70\xa1\xcb\xc8\xe7\xa8\xce\x47\x4e\x7b\xbd\x65\xc9\x6b\x54\x86\x5e\xa5\x25\x61\x2e\x32\xcb\xa9\xf1\xe6\x75\xb3\xda\x31\x52\xcd\x4a\xaa\xdb\x4b\x59\xa3\x0a\x59\xcf\x42\x54\x38\xa7\xac\xee\xbf\x57\xa2\x9e\x82\xb8\xb7\xd7\x76\x38\xef\x7d\x18\x46\x6f\x34\x1e\xd7\x45\x9f\x0f\xb9\xf2\xc9\x6e\x38\x5c\x72\x83\x4e\xfa\x10\x47\xae\x08\x6a\x98\x54\xd2\x41\xcb\x44\xab\x26\xad\xfb\x82\xcb\x16\xd5\x24\xed\xdc\xc3\x37\x08\x37\x74\x1c\x4d\x3f\xad\x69\x59\xb5\xc8\x7f\x13\xaf\x6b\x27\xb4\xaf\x6b\xaf\x6b\x7f\xa0\xfd\x91\xf6\xdd\x36\x8d\xf1\x7f\x6a\x3f\x62\x68\x2b\xdb\xe3\x6c\x81\x9d\x61\x55\xf6\x20\x7b\x9c\xfd\x34\xbb\xc5\x5e\x61\xaf\xb3\xdf\x65\xff\x91\xfd\x0f\x45\x04\xf6\x7a\xfa\x3c\x83\x9e\x09\xcf\xb4\x27\xe1\xd9\xe1\x59\xf0\x1c\xf5\x9c\xf2\x54\x3d\x75\xcf\x8a\xe7\x93\x9e\x4f\x79\x5e\xf0\x6c\x7a\xbe\xe4\xf9\x79\xcf\xaf\x78\x5e\xf1\xbc\xe6\xf9\xa7\x9e\x7f\xee\xf9\x57\x9e\x3f\x6a\x5d\xa1\x63\x2c\xa4\x66\xbd\x41\xf5\xa7\x42\x55\xcd\xa7\x95\xe3\x17\x53\x4b\x37\x33\x6c\x0b\x11\x9c\x8e\x4d\x74\x78\x7d\x5b\xc8\x97\x98\x72\x0d\x9b\x73\xdd\x27\x12\xca\xe6\x72\x3e\x39\xef\x8b\x44\x5b\xd5\x4d\x44\xd9\x29\x0f\xb4\xef\x34\x28\x77\xb1\x36\xe6\x3c\xa9\x3a\xbb\xbe\xb6\x9f\x6f\x26\x31\xcc\xda\xc0\x18\xd5\xae\x0e\x77\xa8\x7e\x79\x78\x3e\x9d\x99\x63\xf3\xc9\xf9\x4c\x4c\x6d\xb8\x4c\xf8\x26\x3a\x83\x3e\x77\x2c\xa9\x9a\xd6\xe9\xb6\x5e\x3c\x13\xcb\xb8\x55\x68\x5b\xaf\x1d\x1b\x57\x94\x61\xd7\xce\xaa\xf5\xc1\x96\xb1\x58\x5a\x0d\xa0\xd5\x25\x17\xe9\x54\x32\xc6\x58\xc4\xdb\x99\x70\x29\x30\x8a\x20\xdc\x76\x65\x76\x1b\xdb\x93\x6e\xd7\x7e\x8b\x96\xb5\x65\x7a\xaf\xb2\x17\xaf\xab\xa8\x49\x6e\xb1\xa4\x32\x93\x3e\x77\x2c\xec\xd6\x7e\xae\x3a\xbf\xb3\x1d\x79\xd2\x99\x76\xdb\x59\xdd\xa3\xbb\xd8\x3e\x19\x0c\xb7\xd2\xad\xb6\x17\x47\xcc\xe7\x8e\xb3\x5b\x4f\x33\xe8\x8b\xa5\xdd\x8e\x8f\xbb\x49\xaf\x1c\x27\x83\x6e\xd7\xbe\xb3\xdd\x13\x8f\x05\x95\x89\xbd\x57\x51\x70\x26\x55\x61\xea\x4e\x8c\x23\xb1\x09\x45\x02\x53\xf8\xb0\x88\x8b\xf2\x9d\x74\x95\xf4\x6e\x8d\x9c\x6c\x25\xbc\xad\xb7\xa1\xf5\xb7\x00\x53\xaf\xdd\x55\x4c\xaa\xf9\xb6\xeb\x16\xea\xf6\xc9\x95\x17\x68\x70\xab\xb7\x2f\xc7\x98\xeb\xe0\xb6\x65\x59\xd6\xce\xc9\xee\xce\xc6\xc7\xb6\x60\x01\xae\x91\xdb\x16\x60\x53\x71\xda\x5d\x2f\xaf\x74\xa4\xd3\xdd\xd7\x54\x6f\x4f\x3b\xa4\xb6\x9e\x5f\x38\xdd\x19\x4c\xba\xb0\xcd\x74\x74\x52\xd1\xcb\xee\x8e\xf5\x3b\xd5\xd2\x81\x2f\xe3\x42\xa1\xb7\x8c\x4b\x15\x18\x61\x0b\x32\x32\x31\xee\x4a\x96\xd2\x6d\x7b\x6a\x2c\x5e\x98\x5d\x3e\xe8\x2d\x48\x8e\xe2\xd8\xf6\x03\x73\x65\x69\xd2\x74\x6f\x2b\x34\x0d\x0f\x26\xf6\xd8\x0b\x89\x52\x2a\xaf\xcf\xce\x64\x9d\xa5\x7a\xbc\xb0\x04\x81\xc4\x74\xb9\x6b\x8c\x0c\xcb\x99\x3b\x2c\x1a\xa7\x07\x6f\x2f\x9e\x9e\xdd\xfd\xdb\x58\x6a\xa4\x72\x2f\xf1\xf4\x21\x73\xa8\x37\x0e\x94\xca\x66\x5c\x7f\xf1\x9e\x40\x4f\x7a\xef\xd8\x48\x3c\xce\xe3\x96\x65\x21\x3a\x6f\xe7\x8a\x23\xc9\xe1\x20\xcf\xe9\x00\x90\x83\x19\x18\xa9\x00\xd0\xa5\x21\x80\x4a\xce\x5c\x0e\xb2\x63\xb8\x4e\x03\x93\x25\xc2\x42\x62\xe3\x8e\x4c\xf5\xf7\x53\x9e\x87\x47\xb2\x96\x85\x85\x21\x3e\xb2\x97\xbd\x59\xa4\x54\x76\xf7\x18\x55\x58\xe9\x3a\x3d\xdb\xf3\xf1\x07\xbd\x47\x62\xb3\xec\xd6\xb2\x0c\xdf\x43\xcd\x54\x60\x9f\x10\x15\x88\x0e\xa7\xeb\x79\xea\xbf\x86\xae\xe6\x93\x67\x26\xa8\x7f\x9b\x43\xd4\x2c\x73\xd3\x32\x08\x03\x9e\xbf\xc8\x15\x08\x3b\x4e\x34\x97\x65\xe0\x1e\x5e\x25\x4c\x27\xc0\x7b\x2e\xb1\xb5\x70\x5f\xcf\x03\x26\x30\x7d\x9e\x30\x7d\x90\xeb\x1f\xe7\x51\x05\xfc\x7b\xfc\x1e\xaa\x53\x28\x34\x36\xd8\x91\xad\xe8\x40\xf0\x12\x9a\x55\x94\xcc\xf9\xe6\x44\x61\xc8\x0f\x0c\xce\xb0\x86\x2a\xe0\x43\x07\x01\xec\x1e\xa6\x3a\xf5\x74\x43\x2e\x36\x17\x17\xa9\x44\x53\xfb\x81\x7a\x87\x85\x75\xa0\x26\xd7\x89\xae\x7f\xfc\x7a\x38\x6d\x70\xae\x83\x57\x39\x07\x95\xc1\x2a\xa8\x53\x0d\xbb\x66\x89\x2f\x91\xb9\x04\xce\x8d\x58\x10\xd3\xc7\x65\x64\x37\xbb\x5e\xd5\xc9\x77\x91\x56\x5b\x6f\xd6\xda\xc7\x2f\xd7\x38\xad\x70\x5a\xa6\xe1\x63\x3a\xee\x09\xf3\x82\xdd\xb1\xbc\x2c\x60\x2e\x7d\xbc\x8a\xe0\x7e\x64\xd9\xad\x9a\x89\x81\x87\xd0\x74\x2a\x42\x48\x33\xcf\xde\x58\xe3\xb2\xce\xde\xc2\x3a\x96\x3f\x2e\xe8\x45\xa2\x1d\x73\xec\x8d\x55\x81\xcb\x61\x62\x6f\x5f\x1e\x9b\x3c\xfb\x71\xb9\x42\x35\xbe\x28\xcd\x2a\xd0\x71\x73\xe8\x8c\x58\x41\xd3\xc6\x45\x5f\x6f\x3f\x89\xec\xfc\x04\xf6\xee\xe0\xb3\xfb\xd9\xb7\xe8\xe3\x02\x59\x38\x16\x3e\xd6\xf1\xcb\x65\x50\xa9\x69\x62\x4f\x94\x68\x6e\xf7\x9d\xef\x2f\xc9\x0a\x61\x69\x22\x0a\xe7\xe5\x38\x06\x7d\x1d\xef\x14\x68\xfb\x40\xd3\xcc\xda\xdc\x8c\x43\xf7\x64\x07\x26\x45\xe1\xce\x2b\x71\x4c\xf9\xf0\xba\x9e\x5f\x3c\xbd\xe3\xec\xb7\x77\xfe\x0e\x5e\x8b\xa7\x04\xaf\xd6\x0e\x7c\xfe\xcf\xa7\x9d\xc5\xaf\x7e\x03\xc0\xeb\xa5\x81\x63\x97\xc7\x0c\xe7\x8d\x3f\xda\x43\xcd\x0f\xff\xf0\xca\xad\xea\xd9\x29\xcb\xe0\x8f\x65\x5e\xa9\xad\xac\xe4\x4a\x85\xb2\x5d\x5d\x34\x6e\xd4\x21\x1a\x45\x14\x9a\x3f\x04\xf8\xa9\x6f\x3c\x7b\x19\x45\x76\x73\xe4\xf4\xbb\xb6\x5e\x48\x65\x9f\xfb\xda\xf2\x6d\x6b\x47\xb8\xc8\x96\x99\x5c\x98\x10\x4b\x6a\xaa\x24\x9a\x75\xc9\x7f\xa9\x4f\xa7\x9e\x67\x75\xf1\xee\xfb\x89\x5f\x04\x44\x2e\x2e\xac\xb2\xee\x6c\xf2\xc0\xbe\x22\x28\x55\x44\xae\xb2\xc4\x6b\x73\x83\x74\x83\x72\x26\x1d\x19\x22\xce\xaf\xed\xc1\x52\x45\x29\xcc\x88\x3e\x3d\x69\xde\x10\x9b\xf2\x85\x0e\xc9\x93\x17\xe9\xd8\x7e\x70\xfe\x2a\x78\xff\x37\x52\x5d\xcf\x0a\xc8\x5b\xde\xd1\x75\x12\xa3\x0f\x5b\x37\xc5\x52\xc1\xb4\x97\x1c\x91\xbc\x08\x91\x2d\x43\x1c\xdb\x45\x8b\x0d\xbe\x0e\x2a\xc4\x21\xd9\x67\xf5\xf1\xab\x55\x83\x0e\x1d\x00\xc9\x0a\x8a\x37\xe4\x9a\x40\x4d\xc0\x6c\x64\x91\xcd\x49\xab\xe2\x0f\xa1\xe3\x49\xc0\x94\x7c\x45\x1c\x8f\xd2\xc0\x45\x0b\x92\x97\x80\x75\xaa\x43\xf4\x5c\x12\x38\x11\xa4\x1b\xf7\x0e\xc9\x2a\xf8\xc3\xbd\x54\x21\xec\xdf\x67\x63\x43\x4a\xf1\xe8\x08\x1a\x74\x5d\x64\x43\x4f\x95\xa8\x6a\x82\x00\xbd\xb0\xc2\x61\x1a\x15\xd4\x21\xd7\x40\x75\xb1\x68\x53\x9d\x0f\xf4\xac\x01\xd9\x74\x40\x1c\x38\xfa\xca\xc8\x05\x32\x26\x4f\x74\x77\x71\xaa\x5a\x6b\x29\x61\xd2\x75\x58\xb4\xa9\xaf\x99\xd6\x3a\xf1\xb9\xfb\x72\xf2\xf9\xbe\x40\xf0\x7c\xd4\xb4\xeb\x9c\x30\x3d\xc4\xcb\x02\xad\x24\xe1\x4c\x08\x9f\x1d\x84\xb9\x01\xa7\xef\x69\x1e\x0f\x9d\x21\x39\xf6\xd3\x1d\x23\x81\x9f\xe1\xa0\x4d\xe3\xc9\x20\xe9\x75\xc2\xe9\xed\x26\xdd\xe2\x12\x4f\x45\x09\x6b\x98\x3f\x2e\x56\x89\x56\x39\x3d\xd5\x6b\x63\x1d\x06\x72\x79\xfe\x44\x17\x80\x9b\x42\xd0\x62\x5e\x07\x9e\x9a\xe7\x98\x7a\x94\x2b\xef\xdf\x56\x46\xbe\x86\x06\x8d\x5c\xa2\x15\x80\x9e\x1d\xa7\x5d\x97\x69\xbd\x95\xa3\xa3\x60\x9e\x08\xc2\x3f\x8d\x14\x55\xce\xf6\x98\xeb\x98\xbd\x84\xb9\x11\x14\xa1\x53\x01\x87\x98\x36\xa1\xfa\x2a\xdf\xc1\xa6\xf6\xbc\xf6\x69\xed\xa7\xb5\x2f\x6b\xbf\xa0\xfd\x43\xed\x1f\x6b\xbf\xa1\xf6\x65\xdd\x9e\x0a\x94\x03\xd5\x38\x4b\xb1\x43\xec\x14\xab\x28\xbe\xcd\xa7\xd9\x26\xbb\xa9\xb6\x16\x7e\x8d\xbd\xce\xde\x64\xff\x8a\xbd\xc3\xbe\xdb\x66\xdb\xb8\xd8\x36\xaf\x4f\xf1\x80\x22\xee\x66\x58\xcc\x65\xd3\xb4\x2d\x47\xda\x94\xa0\x54\x66\x3e\x13\x13\xbb\x58\xbb\x69\x31\xc3\xbc\x41\xc5\x57\x0c\x47\x14\x68\xf5\xee\xfc\x3b\xe9\xb2\x85\xd4\xc2\x42\x58\x35\x4e\x5a\x39\x7c\x32\x96\x4e\xed\x65\xd1\x88\x5a\xb8\xf5\x45\x94\x01\xca\x18\x4b\xc6\x5c\x12\x94\xcf\x55\x66\xa5\xe6\x58\x67\x38\x93\x8a\xb5\xd2\xe3\x89\x4e\x17\xbf\xaa\xce\x1a\xd7\x66\x24\xda\xb6\x8b\x4c\x26\x94\xc5\x64\xeb\xd3\x9d\x6e\xbb\xf5\xef\x8d\x86\x7d\x31\x6f\xdb\x58\x74\x6b\x0d\x56\xe1\x2c\x13\x99\xe8\x64\x62\x8c\xa9\x81\x48\x72\x8b\x7d\x33\xc6\x5a\x39\xfb\x16\x72\xc1\xed\xea\x24\xb7\x40\x92\xf3\xee\x11\x98\x0c\xb5\xb9\xcb\x69\x97\x0f\xe7\x9e\xd9\x99\x09\x65\x71\x3a\xc6\xd2\xc9\x54\xcc\xe7\xf5\x25\xdb\xfb\x15\x93\x6e\x6e\x90\x72\x4d\x39\x33\xea\xe4\xef\xdc\x9a\xef\x07\xd8\xd6\xb1\xee\x26\x32\xca\xce\xd2\x3b\xc2\xc2\x5b\x04\x05\xe5\xae\xed\x6a\xc4\x62\x9d\x5e\x65\x1d\xdd\x19\x6a\x67\x0d\xbe\xce\x50\xf8\x2e\xae\xbf\x7d\x80\x76\x86\x43\x6d\xa3\xcb\x70\x7b\x63\x2e\x9c\x4c\x7b\x56\xf5\x43\xe9\xe8\x15\x5b\xda\x09\x0f\x40\xb1\xf1\xe4\xf6\xfd\xfb\x0a\x04\x08\x31\xd0\x45\xa1\x68\x5e\xe4\x9d\x58\x1a\xfb\x3e\x2f\xb0\x22\x39\x5d\x47\x32\xc8\xbb\xba\x7b\x86\xed\x5c\xa7\x0f\x9c\x03\x0d\x9b\x5b\xbb\x0e\xeb\x4e\x60\xfc\xd0\x4f\x97\x00\xf4\xf6\x83\xa0\x9b\xdc\xb1\x25\x07\x90\xb2\xfc\x21\xbd\x50\x5d\x8a\x67\x89\xb6\x3f\x9a\xfe\x2b\x02\xc9\xde\x85\xac\xd4\x0d\xdd\xca\xc2\xae\x37\x5f\x5e\xa1\x45\x12\x7c\x88\xed\x41\x5c\x87\xdd\x7c\xd7\xd7\xd7\xff\xcc\x83\x7d\xa2\xe7\x2a\x74\xb1\x7b\x8e\x28\xc5\x8a\xa8\x3a\x17\x9b\x69\x3e\xb0\xcf\xd7\x47\x88\xec\x83\xde\x7b\x4a\xf0\x7a\xa0\x2b\x30\x95\x25\xba\xb7\x97\x2a\x42\x5a\x25\x5a\xee\x1a\x98\x66\x0b\xa1\xe3\xd9\xae\x8e\xa9\x27\xa8\xde\x95\x41\x7e\x65\x93\xdf\x10\x84\xf0\x6c\x99\x06\x9f\x15\xe8\x3a\x91\x23\x9c\xde\x27\x71\x9d\xf8\xb5\xa8\xe0\x10\x47\x67\x41\x95\x38\x61\x9d\x6e\x34\xcb\xb2\x21\xa0\x2f\xa1\xeb\x90\x89\x15\xa3\x75\xdd\x61\x19\x82\x58\xd1\x39\x3c\x8c\x8a\xd3\xb4\xe8\x91\x6e\x8e\xd1\x83\x7e\x0f\x7b\x07\x2b\x3a\xc6\x8e\x39\x88\x9e\xe7\x10\x47\xe6\x91\x3b\xd4\x23\xc8\xf7\x33\x4d\x93\x37\x88\xf7\x5c\xb2\x68\x99\xb8\x8f\x3d\x48\xe6\xa2\x14\x9b\x4d\x12\xeb\x62\x99\xbd\xb9\xb0\x53\xef\x1f\xca\xda\xb8\xf3\x51\xcf\xde\xd0\x04\xd1\xb1\x0c\xd8\xbb\x97\xc3\x58\xc1\x9d\x0f\xcb\xd3\xbd\xab\xc4\xde\xdb\x3f\x82\xae\x88\xd3\xd4\x04\xb0\x99\x5f\x33\x96\xf8\xae\x7f\xfd\xf9\x4f\x00\xa8\xbd\x1c\x0f\x5c\xde\x37\x9c\x93\x38\xf7\xf5\x5d\x5f\x29\xfd\xc1\x33\x7f\x7e\x3e\xf5\x7a\xfc\x13\xff\x6b\xfe\xa9\x1a\x93\xcb\x44\x59\x27\x91\x88\x03\xf9\x1b\xb8\xff\xef\x9e\x9f\x4d\xad\xee\xfa\xfd\xd8\xaf\x7f\xb0\xe7\x94\xb0\x01\xfc\xfc\xe1\x02\xc7\x77\xa6\x86\xe5\xf0\x7d\xa9\x55\xf0\xd3\xbf\xfd\xad\x5a\x2a\xdf\xb5\x8b\x28\x3d\x63\x2f\x13\x09\x23\x8b\x83\x7e\xe9\xd8\xf3\xd1\xac\xa8\xe7\x6f\xd0\xc0\x93\x84\xd6\xb7\x96\xf7\x4f\xe8\xbb\xbb\xa9\xdf\x0f\x53\x7c\xc1\x3b\xfb\x84\xa1\xf3\x1d\x47\xf9\x52\x01\xe2\x6a\x1f\x1a\x52\xf2\xba\x01\x1a\xb9\x7a\x68\xb0\x2e\xf8\x8a\xf7\x61\x8a\x67\xe3\x17\x87\xd1\xaa\xfc\xc6\xee\x03\xad\x64\x4f\x4c\x2d\x39\xdd\x23\xab\x18\xd8\x2e\x53\x71\x79\x1d\x72\x33\x65\x65\x0b\xb4\x70\xde\x31\x78\x39\x65\x64\xce\x65\xa5\xd8\x0c\x04\xef\x9b\xc9\x96\x9d\x25\x93\x48\x2e\xa6\x40\x6b\xa4\xdf\xb2\x0a\x58\x83\xd5\x20\x60\x49\x50\xef\xb5\x6a\xe7\x7e\x2c\x0f\x85\x56\xe6\x87\x96\x80\xb1\xc3\xd9\xbc\xb5\xea\x54\x05\x07\x7f\xb6\x0b\x7a\x45\xca\xf4\x59\x81\x83\x0b\x00\x95\xce\x78\x4c\x5b\x6e\x20\xd0\x43\xab\xce\x72\x8a\xf3\x75\x4e\x03\xe7\xac\xb9\x93\x86\xa4\x97\x65\xbf\xff\xba\x2f\xf8\x99\x89\xab\x69\x4e\xce\x6c\x06\x62\x7c\x6f\xa4\x8f\xa8\xe6\x48\xda\x04\x70\x4b\xaf\x59\xd8\x04\xdd\x13\x46\x36\xab\x93\x80\xd6\x8e\x9f\x9b\x78\x59\x1b\xd3\x76\x68\x0b\xda\x05\xed\x3e\xed\x39\xed\x33\xda\x17\xb4\x2f\x6b\x5f\xd3\xfe\x81\xf6\x3b\xda\x9b\xda\x1f\x68\xff\x46\xfb\xae\xf6\x81\xf6\x3d\xed\xaf\xb5\xbf\x61\x1a\xf3\xb1\x41\x66\xb1\x59\xb6\x93\xed\x66\xfb\xd9\x83\x6a\x67\xf8\x45\xf6\x55\xf6\xf3\x77\xbb\xd1\x63\x4c\xf8\xb6\xc4\xb6\x69\xd7\x5e\x2f\xa3\x74\xb1\x4c\x2d\xa2\x2a\xd0\x8c\xdb\xc5\x50\x7a\x5b\x25\xaf\x75\x95\x95\xad\xcb\x3b\xa9\x00\xb6\xc1\xbb\x81\x36\xaa\x42\xef\xfc\xa4\x0c\xa7\xa3\x91\xce\xbb\xe4\x94\x60\x7b\xa1\x55\x5d\xf8\x99\x64\x78\x3e\xa3\xf6\xa8\xc2\x69\x37\xf7\x4e\xb7\xed\x3c\xd2\xee\xe8\x2d\x76\xb7\x7c\x19\x08\xfb\x94\x4c\xd8\xf5\xdc\x73\x39\xd8\x13\x3e\xaf\xdb\x90\x50\xa1\x35\xd5\x4a\xb4\xa3\x01\x96\x6c\xcf\xe6\x5c\x93\xe6\xf6\x36\xc2\x44\xac\x33\x98\x69\xb7\xb5\xdb\x5d\x8a\x2d\xab\xe2\x98\x0b\x69\x71\x93\x7a\xb7\x57\x32\xbf\x97\xb9\xf8\x7f\x45\x3d\x50\xa4\x98\xd6\x33\x09\x46\x5a\xd1\x32\xc0\xc2\x6d\xbc\xf5\x7c\x26\xd6\xd9\x7e\xa6\xb1\x4e\xe9\xe2\x66\x22\xd1\x19\xd6\xc6\xbf\xc4\x26\x14\x39\xd3\x25\x10\xb4\x2a\x15\x5f\x72\xcb\x48\xcf\xb5\x00\x8c\x6c\x4d\xeb\xdc\x5d\x09\xe5\xc1\x1c\x4e\x28\x90\x7e\xd2\x6d\x0b\xa7\x63\xec\x7d\xf9\x73\x81\x4b\xc7\xc6\x87\x69\xfd\xc5\xa9\x83\xcf\x65\x0b\xb9\xd7\xc2\x7d\x05\x5b\xa6\x4a\xeb\x5d\xcd\x17\x07\x93\x0b\x89\x7f\x3f\xe2\xbf\xf2\x58\x86\x03\xc5\x9d\x7b\x0a\xfb\x7f\xf7\x78\x74\x7a\x9b\xe7\x35\xdf\x08\xd7\x91\x6d\xbe\x34\x30\x08\x1c\x9c\xce\x77\x3d\x90\x3c\x2c\xa5\x28\x65\xfb\x02\xe1\xed\x3d\x67\x87\xd8\x73\xe5\x99\xf1\xe6\x37\x97\xc0\xe7\xa7\x49\xd4\xc0\x6b\x70\xae\xf4\x53\x8d\x50\x9f\x99\xac\x18\xa3\x7b\x24\x2f\x83\x69\x8d\xc0\x64\xea\x7d\x6f\xef\x3b\xd9\xdc\xf2\x9d\x8f\x02\x97\x05\xaf\x10\x95\x6d\x3e\xd7\x95\x4a\xe9\x28\x56\xa8\x52\xb3\x9d\x3d\xf7\x8e\x5e\xe3\x17\x06\x89\xdd\xdc\x33\x7f\xe7\x23\xd9\xf9\xb3\x40\x9d\x0f\x06\x0a\x1e\x41\xf7\x0d\xd0\xe4\x9c\x41\x58\xe2\x03\xe7\x9a\x1b\x84\x6f\x36\xd0\xe0\xb8\xda\x83\x15\x0f\xef\x3d\x2f\xa9\x41\xfc\xce\x07\xf7\x64\x60\x2c\xb3\x8f\x56\xc5\x32\x56\x82\x03\x00\xcc\x32\xfc\x77\xfe\x5b\x68\xe8\xe2\xc0\xb8\xaf\xef\x01\x8f\xd5\x75\x1a\x03\x87\x91\x13\x0d\xc2\x32\xba\xba\x57\xa2\xa1\xd5\xa6\x24\x0c\xce\x15\xd8\x8d\x3a\x4a\xd4\xfa\x2d\x16\x69\xfc\x50\x6c\x90\x13\x1d\x08\xcb\xed\x11\xaa\xe8\xf9\x78\x09\x79\x1a\x98\x5a\xc9\xf4\xc0\x5a\xc4\x4b\x80\x1d\x37\x29\x4e\x45\x33\x0b\x94\x8d\x82\xa1\x98\x36\xef\x3b\x3a\x5e\xce\x8e\x3e\x1e\xfd\x42\xb1\xf9\xde\xdb\x5f\xef\x49\x51\xe9\x2b\xc9\xf8\x7a\xe5\x81\x3f\x3e\xef\x1f\x49\x1e\xdf\xd6\x7b\xe7\x73\xf5\x5f\x3a\x90\xf0\xa7\x1a\x5f\xfe\xcb\x65\xc3\xbc\xf7\xab\x85\xe5\xa3\xfb\x8e\x7e\x97\xbd\x45\x71\x89\x62\x8e\xa3\x27\x52\x6a\x7c\xed\x77\x96\x74\x5e\x0a\x3f\xf6\x7e\xe9\xc8\xf9\xce\xee\xd0\x34\x72\x2a\xb5\xda\xb7\x9f\xf8\x4d\xdc\x9c\x08\x6d\x72\x8e\x5b\x74\x23\xd2\x77\x8b\xf6\x1c\x27\x9c\x99\xd7\xb1\x67\x1e\xdb\xc3\x8e\x0e\x41\xb0\x8c\xac\x15\xf7\x2e\x38\x1b\x12\xb4\xd9\x7c\xe5\x16\xf5\x85\x63\xc7\xa4\x1c\xdf\xbb\xf8\xd1\x5a\xb9\x3b\xb8\x39\xfd\xff\xd3\x3f\xe5\x03\xbf\xa1\x9f\x1b\x33\x27\x67\xa0\xa3\xaf\xcf\x5c\xef\x18\xe1\x76\x09\xe5\x65\xc3\x31\x0c\x2a\x88\x3a\x71\x82\x85\x1b\xb4\x69\x4a\xf1\x42\x87\x7e\xb3\x80\x45\xce\x45\xdd\x33\xf1\x48\x46\xca\x8d\xca\x0a\xaf\xc3\xac\x0d\x5e\xd2\x51\xd5\xa5\xd3\x40\x78\x10\xab\x7a\xa9\x95\xaf\x2e\x3a\x2b\x54\xb7\x56\xc7\xf7\xae\x81\x28\x4e\x8e\xe0\xd9\xfc\xd0\x15\x81\x1a\xa8\x2e\xef\x19\xf6\x1f\xc4\xf6\x8c\x20\xba\xda\x27\x71\x32\x46\xb4\x6a\x94\x9d\xeb\x25\x50\xcf\x5e\x87\xef\x1f\x57\x5d\x2a\x07\xad\x92\x2c\x2e\x69\x31\x70\x18\xa8\x50\x95\xa6\x43\x18\x9a\x00\x1c\x38\xad\x30\x35\xad\x69\xcd\x0b\xb0\xf0\x80\xb6\xa0\xe8\x59\x5f\xd0\x6e\x6a\xb7\xb5\x7f\xa2\xfd\x96\xf6\x7b\xca\x6d\xf4\x5d\xed\x2f\x59\xa7\xea\xfd\x8c\xb0\x49\x36\xc7\x32\x6c\x2f\x3b\xcb\x2e\xb0\xfb\xd8\x93\x6c\x8d\xdd\x64\x3f\xcf\xfe\x21\xfb\xb7\xec\x4f\xd9\x5f\xb1\x1f\xb0\x1f\x79\x3c\x9e\x6e\x4f\x9f\x47\xf7\x4c\x79\x12\x9e\xbc\x72\x84\x4a\x8c\x31\x25\xfb\x53\x5b\x50\xca\x6c\x33\xec\xf9\x49\xb2\x37\xe1\x0b\xbb\xcb\xa8\xbe\x2d\x6c\xca\x6e\xe6\x0e\xd4\x92\xa9\x4c\x22\x1c\xcc\xa8\x76\xce\x44\xcc\xdd\x21\x68\x5d\xda\xea\x1e\x64\x87\xd7\xe5\x43\x2a\x0b\xf9\x76\x4a\xa8\x10\x5c\xaa\x83\xa2\x40\xe0\xd1\xd8\x78\xb2\x8d\xbf\x92\xbe\x89\x98\xbb\xbf\x30\xc6\x42\xc9\x8c\xbb\xfe\xb9\xb5\x6b\xe4\xaa\x0d\x5b\x41\x2b\x1d\x55\x9b\x05\x6d\x87\x4d\x85\x13\xe8\x74\x63\x41\x34\xdd\x4e\x7e\x94\x7a\x30\xe9\x1a\x24\xa9\x59\x95\xeb\xa0\x3a\xa0\x9a\x2f\x2e\xe9\x3b\x29\x5d\x3d\x63\xb2\x15\x65\xe6\xf7\xb2\xb4\x02\xa5\xbb\x9d\x8d\x4e\x97\x60\xea\x12\x51\x53\xca\xe8\x43\xc9\x25\x27\x5b\xf7\x9d\x8c\x2a\x1b\x78\xb7\x85\xdc\xe9\xce\xa2\x14\xed\x20\x18\xd9\x02\x57\xb9\xa9\x67\x2b\x8d\xeb\x0c\xa7\xdb\x39\x6d\x67\x68\x0b\xa2\x12\xce\xcc\xa7\x27\x62\xa9\x56\xe0\x52\x8a\x82\x74\x2b\x85\x6c\x25\xd1\xd2\x6d\x46\x25\xc3\x6d\xc6\x96\x12\x0b\xc4\x32\x6a\xc0\xa5\x24\x3b\x9d\x5e\x5f\x5b\xa8\xef\x3a\xd0\xdf\x1d\xdd\x65\x92\x0a\x4d\x96\x76\x89\x5c\x29\x57\x64\xa9\x76\x88\x23\xbe\x70\xc6\x7d\x95\xc9\x4c\x32\xd6\x26\x62\xb9\x1a\x23\x77\x07\x21\xe2\xf5\xa9\xd0\x1c\x09\xb0\xb6\x92\x41\xf5\x66\xb6\xc8\x87\x5b\x7a\x07\xd5\x25\x4b\x67\xd2\xd1\x76\xc7\x65\x86\xb9\xbd\xf4\xb6\x40\xb4\x15\x80\x15\xfe\xd8\xf3\xe6\xc1\xcf\x00\x08\xa4\x8b\xa4\xdc\xc9\x87\x77\x94\x6b\x57\x47\x8c\xb9\x7d\xfd\x09\xaf\x17\xfd\xd1\x70\xdf\x50\x54\xbf\xe7\x74\xc7\xac\x69\xbd\x04\x20\x37\xbc\x5d\xee\x18\x28\x1f\xec\x2d\x7c\xaf\x55\x08\xf5\xc4\xb0\x67\x9e\xab\x7f\x88\x95\x72\xf7\xa4\x75\x62\x7b\x09\x64\x25\x77\xdf\xff\x0d\xdb\xae\x72\x53\x5f\xb1\xac\x47\xd9\x25\x4b\xc4\xa9\xe7\x42\xf3\x75\x3c\x3e\x2a\x0a\x67\x8e\x14\xcf\x8e\xe4\x0c\xf3\x78\xa8\x10\xf5\x63\xc9\x48\xe9\x44\xe5\x4d\x51\x05\xbf\xd4\x49\x65\x03\xbc\x66\xdd\x8e\xf4\x20\xc5\x60\x46\x7b\x81\xc5\xa6\x19\x38\x29\x79\x1d\xec\xed\xc8\x24\x15\x9b\x84\x78\x9e\x28\x72\x98\x3b\xfe\x9d\xf9\xae\x0e\x7f\xc2\x92\x40\xd7\x93\x1c\xdd\x4c\x16\x1c\x1a\x18\xb7\x51\x02\x62\xbb\xf7\xcc\x9f\xf1\x58\x7b\x8f\xe5\xd8\xcd\x02\x2f\xdd\x79\x6f\x85\xb7\x2a\x3d\xee\x71\x06\x23\xad\xfa\xb9\x6b\xce\x00\xee\x6c\xfa\x9f\x22\xb0\x48\x85\x3c\x9c\xb6\xcf\x61\xe9\xce\xfb\x1b\xd4\x10\xdc\x83\x25\x5e\x01\x96\xa8\xef\x04\xb8\x6f\x77\x8a\x4c\xb1\x74\xe7\x23\x4e\x06\xa5\x66\xbb\x59\xad\xe2\x20\x71\x84\xce\x8f\x72\xb3\xe7\xb4\x0e\x9e\xde\x35\x71\xa6\xfe\x74\x17\xf9\x9f\xe1\xd8\xb9\x13\x24\x29\xeb\xe4\x7b\x02\xb4\x4a\x4f\x79\x51\x79\x64\x18\x44\xc5\x02\x9a\xaf\x92\xd0\x01\xbd\xbb\x73\x70\x38\x0e\x9b\x03\x71\x2a\x72\xa0\x40\x54\xa2\xee\x3e\x87\x8a\xc4\x8c\xc4\x29\xbd\x94\x43\x69\x95\x1a\xa0\x87\xfb\x01\xac\x45\xbe\xa2\x5b\x34\xd6\x55\x18\x3e\x00\x38\x0d\xe8\x4e\x22\x34\x3e\x8c\xb7\x51\x05\x8d\x86\xe2\xcc\x82\x94\xcd\xb7\xed\x38\x35\xa8\x46\x54\x11\x75\x2e\x40\x67\x8e\x5f\xeb\x07\xae\xf9\x51\x58\x97\xeb\xc0\x75\xc2\xb3\x41\x63\x30\x02\x89\x45\x3c\xd0\x2a\x53\x3b\xcf\xee\x1d\x8f\x8f\x04\x80\xb8\x6e\xf0\xe6\x0f\x9e\xff\xf6\x5c\x2a\x9e\x12\xfa\xab\xd9\x72\x9e\x8b\xc6\xf0\x54\xfa\xc4\x1a\xfb\xda\x97\x64\x59\x3a\xdf\x49\x15\x7c\x6c\x29\xb5\x98\x33\xde\xb1\x74\x59\x5c\x8f\xa3\x50\xd3\xf3\x1c\xbf\xdc\xfc\x8f\xef\x17\xaa\xb0\xd6\xfe\xc5\x53\x58\xca\xbf\x99\xab\x7e\xe9\xf1\xc2\xfb\x91\xdd\xfc\xb5\xec\x48\x2c\x73\xb8\xb4\xf8\xd0\xbf\x7d\xc5\xef\x79\xd9\x78\xf2\x5f\xe5\xcb\xc6\xb2\xc3\x6f\xe2\x91\x01\xc2\x6a\x0e\xc9\xc7\x38\xff\xf4\x20\x56\x0c\xf1\xe9\x91\x80\xef\x50\x67\x56\xb7\x61\xd0\x6e\x9f\x5c\x72\xd0\xfd\x29\xc1\xe9\x85\x31\xd3\xce\x8c\x98\x15\x92\xf7\x2f\xe8\xe3\x4f\x53\xb1\x52\xb2\x50\x8c\x3b\x68\x6e\xa4\xb8\xc4\xfe\x03\x62\xa3\xab\x1b\x38\x1d\x44\x36\x87\xec\x17\xa6\xdf\x30\x42\xd7\x7e\xf6\x47\x62\x68\x0f\x05\x4e\xe6\x5f\x22\xe3\xd5\x8e\x29\x72\x4c\xe1\x4b\x13\x37\xd9\x21\x43\xf2\x62\xe4\x05\x0a\x4d\xac\xa7\xcc\xb3\x3d\x42\xd4\xac\xbe\x5f\xb2\xbf\xd2\x0d\x07\xe3\x97\x78\x83\x47\xef\x25\xea\x7c\x3a\xd0\xb3\x94\xba\x5e\xd3\x05\x91\x33\xbc\x1d\xfb\x3b\x5f\x7a\x05\xb4\xfd\x51\xd0\xba\x40\xd6\xa9\x77\x0d\x23\x7e\x74\x07\xdf\xc0\x75\xdc\x22\xba\x4d\xa0\x0b\xfb\x20\x0f\x86\x06\x1f\x18\xeb\xb2\x6e\x80\x3e\x39\x8c\x22\xbf\xc5\x69\xb1\xca\x8f\xcc\xc7\x7a\x60\xd8\x59\x9b\xf7\xc5\x74\xc4\x07\xee\x31\x50\xe9\x7e\x48\xc0\x4e\xa1\xf7\x61\xdb\xa2\xc5\x72\x97\x0f\x8b\x8b\xd9\xdb\xf4\x53\xfd\xf8\x6c\x0f\x5e\xe9\xef\xa7\xc9\x08\x26\x26\x80\xc4\x82\x04\xfa\x3f\xd3\xd1\x57\x44\x26\xb8\x2c\x6b\x24\xec\x2c\x11\x27\x6e\x51\x2e\x8e\xd0\x82\x8e\x65\xaa\x4b\x7a\x82\x59\x00\xa7\xc7\xce\x61\x85\xe4\x6a\x4e\xac\xb5\xbe\xb9\x1b\x72\xbd\x58\xe6\x58\xd2\xb4\x59\x4d\x6b\x3e\xd3\xf1\x1e\x9e\xd1\xb6\x6b\x8f\x69\x6b\xda\x0d\xed\x96\xf6\x2b\xda\xaf\x69\x6f\x68\x7f\xa6\xbd\xaf\x7d\xc4\x38\xeb\x53\xd9\xf0\x0c\xdb\xce\x16\xd8\x61\xc5\xcf\xbd\xcc\xae\x29\x2a\xc2\x17\xd9\x2d\xf6\x0f\xd8\x37\xd9\x1b\xec\x2d\xf6\x6f\xd8\x9f\xb0\x3f\x65\xef\xb3\xbf\x66\xff\x93\xfd\x2d\xfb\xb1\xa7\xcb\x23\x3d\x23\x1e\xdb\x13\xf7\xcc\x2b\x66\x97\x52\xdb\xab\x83\xc7\x13\x74\xd7\x69\x5d\x01\x67\x74\x8e\x29\xcd\x42\x44\xc9\xca\x32\x6e\x1b\x22\x39\xdf\xa1\xbc\xb1\x95\xde\x6b\x17\x4b\x04\xbd\xc1\x70\x80\xc9\xa4\x52\x71\xa4\x55\xdb\x3a\xa3\x7e\xcf\xef\x65\xf3\x6d\x87\x24\x6f\x2b\x69\x4e\xb9\x38\xb0\x56\xb6\xfd\x93\xaa\xbc\xf5\xc0\x49\xb9\x25\xe6\x54\x86\x87\x9d\xbe\xbb\x20\x1b\xb5\x1f\xa5\xe4\xe3\xad\x58\xda\xb6\x62\x6a\x7d\xd1\xc5\x26\x28\x10\x4e\x2b\x1e\xbb\xa2\xb2\xbb\x26\x81\x41\x97\xba\x35\xe1\x0b\x86\x5b\x27\x52\xbb\x01\xe1\x9a\x55\x2b\x42\xa3\x02\x6f\x0d\x28\xb4\x8e\x82\x52\x2a\xcf\x69\x5f\x7b\x3b\xd8\x15\x7a\x2a\x22\xa2\xdb\x8a\x48\xc5\x52\x93\xae\x75\x54\xa7\x4f\xfd\x19\x0a\x67\xdc\xe9\x86\x2b\x13\x99\xd8\x9a\x1b\xb4\x0d\x6a\x62\xd1\x76\x13\xa3\x95\xdc\xbb\xd5\xc0\xdd\x24\xdd\xdb\xe9\xbe\xf6\x88\x2f\xd5\xba\x37\x75\xe7\xae\xe5\x76\x2b\x6d\x76\x15\xf8\xed\xa6\xbd\x2f\x98\x08\x27\xc3\x7b\x99\xda\x37\x90\x2e\x6b\x38\xed\x96\x29\x4a\xd5\xe6\xda\xaf\xca\xf6\x5a\x41\x32\x9d\x71\x71\x39\xad\xc7\x08\xaa\x6c\x5f\x9d\x78\x31\xaf\x8b\x58\x50\x4b\xd0\x32\x12\x0d\x07\xc3\xc9\x4e\x77\x07\x5a\x01\xf3\x63\x5b\x8f\xbe\x25\xa7\x51\x36\xe0\xae\x53\x6c\xdb\xe6\xc3\x1d\x04\xdc\xd5\xab\xaa\xe3\x2a\xc2\x5e\xbd\xff\x0c\x52\xd9\xc4\xc2\xcd\x6a\x45\x82\x88\xa3\x75\xd8\x7c\x22\xb5\x66\x19\x94\x15\x85\xfa\x75\x40\xc0\xca\x5f\x9a\xc2\x07\x20\x69\x1c\x3e\x24\x0f\x3d\x32\xd0\xc9\xb9\x05\x4e\x71\xe1\xc4\xe7\x3a\x5b\x37\x00\x81\x9d\xb0\x6d\x2b\xaf\x4f\xc6\x88\xe0\x64\x73\x8b\xb7\x96\x1c\x39\x18\xe8\x30\x96\x62\x7d\xb8\x8e\xe6\x12\xed\x3d\xec\xeb\x5c\x3a\xf3\x30\x3f\x3c\x46\xd5\x45\x07\xec\x55\xba\x09\x3c\x31\xd2\xac\xfb\xcf\x13\x51\x5d\xa4\xb0\x6c\xc4\x76\x08\xe8\xc5\x54\x11\x4a\x30\x4f\x2b\x7e\xf6\x47\xa9\x45\x45\x3e\x45\x7a\xef\x0a\xe8\x9e\x61\xd0\x9a\x88\xb3\xcf\x77\x05\x2c\x1d\x77\x3e\x1e\x0b\x0e\x9e\x10\xbc\x41\xcb\xd4\x8a\xbc\xd3\x3b\x39\x5f\xc9\x43\xd0\x81\x19\x5b\xd1\xc0\x33\x93\xe9\x31\x8f\xc7\xc3\x81\xeb\xbb\x0f\x01\xa1\x6b\x77\xbe\xc7\x11\x98\x2c\x52\x9e\x7d\x0b\x81\x4f\x60\xfd\xce\x07\xb4\x41\xeb\xec\xc3\xc8\x7d\x34\x32\x93\x25\xac\xf2\x9e\x67\xfd\x77\xfe\x06\x8f\x8f\x46\xd8\x8b\x58\x11\x94\xda\x3f\x4e\x18\x4e\xc7\xc1\x37\x9a\xfc\xc6\xc5\x39\xf6\x9d\x40\x3a\x4f\xeb\xbc\x69\xaf\x70\x21\x20\x37\xd8\x3b\xb4\x41\xb5\xa6\x18\x9e\x45\x8a\xf2\x1c\x54\x61\xaf\xe3\x3a\x9e\x0d\xf6\x5c\x25\x00\x7a\x2e\xce\x69\x1d\xb4\x64\xa1\xff\x5e\xbe\x2a\x20\x6a\x44\x6b\xc0\x0a\x5d\x1a\xfc\xb1\xd6\xdd\x47\x30\xad\xbe\x08\x39\x82\x39\x8b\x03\x3d\x0f\x35\x7f\xa1\x24\x51\xd2\x4b\xb0\x96\xc8\x31\xe8\xd9\x18\x81\xd5\x1a\xd4\x68\xd6\xc7\x87\x29\xc7\xae\x5f\xed\xa2\x54\x4f\x52\x9e\x9e\x52\xe0\xf3\x65\x9d\xae\x83\xd6\x6d\xfe\xdc\x28\x1f\xd8\x9e\x97\xb9\xfb\xa3\x14\xf2\xdf\x2a\x3c\x38\x75\x6d\x08\xcf\xac\xe4\x8a\xc5\xbc\x63\xbf\xdf\xfc\xd0\xa8\x89\xe1\x4f\xbc\x26\xb8\x0d\xdc\xa4\x75\x6b\xec\x11\xc8\x57\x4f\xfd\x97\x82\x8e\x35\xf1\xb7\x7b\xd7\xc3\x77\x7e\xa6\xa0\xaf\x16\x6b\xb5\xac\xb8\x98\x91\xb4\xf8\x2a\x65\x0f\xce\xeb\xd9\xd6\x01\x25\xf5\xd6\xff\x0f\xff\x60\xfd\xdc\xf3\xc6\x4c\x1f\xf2\x03\xec\xf8\x10\x97\x4b\xb5\xe9\xfb\x2f\xfd\x3e\xfb\x90\x64\x29\x05\x9c\xda\x03\x73\xcd\xfc\x2f\xdf\xb8\x3c\x80\xc6\xdc\xc9\x5f\xfd\x07\x55\xce\x8d\x1b\x92\x3f\xd7\x4b\xdb\x2f\x70\xc2\x75\x18\xe1\x17\x7a\x7c\x34\x76\xd2\x2c\x9c\x3a\x48\xf4\x70\xef\x32\xe1\xb6\x79\x68\x1f\x91\x84\x89\xfd\x69\xfe\x62\x17\xae\x85\x88\x36\xf8\x95\xa1\xfe\x9f\xca\x91\x1c\xee\xa2\x78\x9e\x56\x44\x2b\xae\x6f\xca\xde\xa7\x24\x1d\xd8\x05\x79\xab\xf9\x92\x5d\x18\xeb\x1c\xbf\xb4\x01\x18\xab\x98\x98\xb0\xd6\xe2\x4c\x80\xf7\xf4\xd1\x89\xdd\x98\xb9\x6c\x5a\xd9\x02\x7a\x8f\xf0\xac\x9c\xbe\x1f\xf2\x7a\x3c\x7e\x9d\xac\xcd\xac\xbe\x42\xdb\x26\x72\xa0\x35\x48\x5a\x2f\x4a\x6c\x8a\xe4\x45\xd0\xf0\x7d\x5c\xc6\xcb\x71\xbb\x64\x43\xf6\x3c\x0d\x23\xf0\x29\x73\x31\x5b\x40\x21\xc7\xf9\x06\xc4\xd0\x15\xc9\x09\xbe\x4f\x4a\x63\x0d\x03\x17\xbb\x3a\xb1\x0c\x74\xcd\x81\xf2\x00\x2a\x02\xb4\xc1\x37\x52\xd4\x00\x44\xd1\xb6\x73\x83\x57\x49\x96\x4d\x5e\x93\x6b\x0d\x63\x99\x44\x23\x27\x02\xf7\xc9\x6b\x1e\x47\x87\xd3\x3f\x1a\x1e\x14\x8e\xd7\x6b\x16\x75\xb3\x6a\x14\x21\x0a\x7e\x3f\x90\xb7\xa8\xf5\x1f\x64\x0d\x20\x6e\xd6\xe4\xd0\x19\x07\xb6\x23\xcc\x65\xe2\xfd\xd3\x03\x53\x05\x3a\x3f\x2a\x0c\xa0\x62\x1b\x58\x21\xe1\x7b\x32\x2e\xb1\x26\x79\x2a\x1f\xa7\x9a\x21\xd7\xcd\x15\xac\x6a\x43\xaa\xdf\x52\xc1\x37\xb5\x29\xad\xac\xdd\xaf\x3d\xa4\x3d\xa6\x7d\x56\x6d\x6b\xdd\xd6\x7e\x45\xfb\x55\xed\x9f\xa8\x5a\xe6\x8f\xb5\x77\xd5\x2c\xfb\xef\x58\x07\x1b\x60\x43\x6c\x42\x11\xda\x77\x6e\xd1\x1d\x47\x98\x0c\x28\xcd\xf0\xdd\x01\xf3\x6e\xa6\x04\x7a\xad\x6a\x64\x97\x7b\x9a\xf8\x22\xb1\x4c\x6a\x86\xb9\x83\x69\x65\xa2\xed\x0d\xaa\x03\x43\xd1\x19\x94\x36\x39\x15\x9b\xf0\xb5\x79\xe4\x8a\xdc\x72\x17\x6e\xb0\xe5\x40\xdd\x76\x3e\xb8\xbb\xb8\xec\x1e\x02\xad\xac\x3d\x1c\xbc\x5b\x61\xcc\xb7\xb2\x7b\x85\x63\x6f\xf7\x9f\x5d\x74\x98\xdb\xa3\x56\x30\xf3\xd0\x2e\x96\x89\x45\x64\xa4\xcd\x36\x57\xcb\xb5\xed\xc5\x2e\x57\x33\x9c\xcc\xc4\x7c\xaa\xa7\xab\x5c\x4d\xda\xc3\xe5\xb0\x5a\x79\x6a\x15\x1e\xea\xb8\x89\xb4\x03\xba\x0a\x7e\x19\x17\xe4\xe0\x52\x81\x55\x43\xbd\xbd\x7c\x3c\xaf\xf8\x09\xa1\xb6\xeb\x92\xc2\xc7\x4f\xb4\xa1\xfc\x9e\x54\xde\xe9\x99\xd9\xc8\x67\x83\x0f\xea\x28\xd7\xb6\x6d\x8b\x4c\xce\x7e\x39\xb5\xcc\x09\x68\x18\x52\x26\xfa\xe9\xc8\xce\x5b\x20\x64\x79\x36\x6e\x28\x53\x82\x3a\xef\x99\xa3\xfd\x0f\x95\x0c\xb3\x36\x39\x47\x87\x06\x51\xfb\xd9\xdd\xac\x38\x74\x9e\x48\xe4\x80\xf1\x08\x61\xe0\xd8\xbb\xdb\xc3\x3c\x85\x78\x49\x88\xd9\x19\x4e\x6f\x07\xee\xe1\x88\x2e\x40\xb7\x52\x18\x1e\x34\xab\x7c\x93\x88\x37\x97\x79\xe0\x24\xf1\xda\xcd\x58\x8f\x40\x4a\x2c\x13\x11\x13\x39\x90\xbf\xf9\x7b\x7d\x01\xff\x33\x18\x09\x4f\xf4\x42\x80\x13\x2f\x09\xf8\x4f\x11\x8d\xa5\x85\x38\xd1\x87\xe1\x59\x29\x17\x89\x2a\xce\x12\x82\xbb\x5a\x3f\xc3\x5c\x1a\x59\xa0\xbb\xbb\x6b\x17\x88\xf2\x26\xca\x84\x83\xfd\x82\xa3\x6f\x17\x38\x2d\xa6\x2a\x9c\xaa\xa0\xd0\x1e\x1a\xcf\xc0\x90\xcb\x04\xdf\x65\x93\xa6\x8f\x80\xaf\x58\xa5\xfe\x51\x4c\x9c\x81\x75\x24\x81\x06\xfc\xdb\xc6\xa6\x10\x97\xf8\x66\x11\xa5\x2b\xf3\xfa\xfc\x71\x59\x46\x33\xfb\xaf\x1f\x74\x36\x43\xd1\x42\x3f\x3b\x5e\x5d\x92\xfc\x5b\xcb\xe6\x62\xed\x16\x19\x65\xbd\x66\xbc\xc2\xb9\x2c\x89\x73\xcd\xff\x73\xf2\x92\xf1\x7d\xb6\xe3\xeb\xcb\xf1\x92\x51\x28\x36\x16\x51\x5a\x2c\x78\x0e\x02\x79\x1b\xd4\xf3\xbc\x71\xc5\x8f\xd9\xfd\xe0\xeb\x9c\xcf\x9f\xd1\xb7\x5f\xe5\xd3\x8f\x13\x2f\x64\x79\xb8\xb3\xbb\x0b\xf2\x36\x29\xdb\x7b\x61\x24\x2f\xb7\x3e\xa8\x02\xf7\x75\x18\xe8\xf7\xa0\xdf\x8f\x9a\x8e\x2c\x2c\xc2\x90\x5f\xca\x82\xe3\x40\x78\x1f\xcf\x4a\xbd\x6e\xf4\x5c\x10\x05\x51\x83\x28\x8b\x14\x0d\x3c\xe4\x54\x5f\xaf\x42\xaf\x00\x65\x2c\x2d\xc1\x5e\x6a\x1d\x33\x0d\x51\x97\x54\x75\x9c\x2a\xac\xe5\xb5\x65\x4e\xab\xe8\x3b\xc1\xcd\xc5\x99\xf4\xd0\x15\x7d\xc5\x96\x85\x7c\xa0\x67\xcd\xe9\xba\x64\xf1\x91\x07\x61\x6e\x00\x9b\x56\x64\x04\x85\xf6\xae\xe4\x32\x3e\xd4\x4a\xda\x17\xb5\x97\xdb\xd3\xa2\xdf\xd7\xbe\xad\xfd\x3b\xed\x3f\x68\x7f\xad\x7d\xc4\x34\xe6\x6d\x1d\xf8\x6c\x90\xcd\xb2\xbd\x6c\x91\x5d\x61\x8f\xb3\x67\xd8\x0b\xec\xf3\xec\xcb\xec\x6b\x8a\x74\xf5\xeb\xec\x9f\xba\x7a\x2d\xe5\x69\xaf\x76\x23\xd5\x4f\xad\x6f\xc2\x75\xb6\x53\x0b\x38\x77\x1d\xcd\xd4\xd0\x23\x3a\xc7\x32\x6a\xe4\x93\x68\x67\x6e\x69\x25\x42\x6d\x25\x5d\xfd\x99\xf9\x4c\x47\xd0\xd7\xbe\x33\xf7\x92\x8e\x45\x23\xe9\xb6\x51\x82\xf2\x39\x99\x4f\x86\xe7\xd3\x89\xb4\xda\x29\x68\xb3\x0a\x15\x9b\x35\xe5\x56\xca\x6a\x88\x34\x19\x6c\xfb\x08\xa9\x72\x37\xb8\xb5\xed\x98\x71\x7d\x37\x93\xb1\xd6\xb5\x90\x48\xcf\xb1\x88\xda\x47\x48\xc6\x7c\xad\xec\x43\x51\x14\xb7\xf0\xd2\xad\xba\xbe\xf5\xa5\x49\xd7\xf4\x5e\xb5\x09\x54\xdd\xaf\x94\x5d\xae\x25\x58\xdb\xc3\x2f\x1a\xe9\x70\x05\x0c\xc1\xb0\xdb\xc4\x50\x36\xcb\x61\xb7\x70\x6e\x2b\xfe\x23\x2a\x49\x4a\xa7\xda\x6b\x02\xca\x6f\x34\x78\xd7\x8d\xff\x27\x28\x04\xe5\xdf\xa9\x96\xf3\x5d\x48\xb6\x4b\xa1\x6a\x2f\x09\xc9\x70\xb0\xcd\x3d\x68\xdb\x87\x2a\x5f\x85\x5d\xcc\xcd\x89\x5c\x29\x43\xf8\xae\xf9\xb5\x0a\x45\xc9\xad\x76\x49\xd8\x05\x06\x44\x33\x6d\x2e\x40\x38\x99\x66\x1f\xe4\x8b\x8e\xd1\x37\xb7\xba\x14\xdf\x79\x9e\x38\xe7\x13\xa3\x82\x3f\x3b\xd2\x7f\x70\x19\x00\xe9\xd5\xda\x1a\x90\x95\x5f\x38\x35\x30\x35\x3d\xc1\x81\x92\x7e\x7c\x74\x34\x6a\x16\x72\x84\xc5\xa5\xf8\xc0\x0e\x67\x32\x59\x6c\x7c\x84\xde\xd1\x1d\xcf\xaf\x94\x76\x4e\x1f\x1a\xec\x19\xeb\x8b\x95\x2b\xfb\x2f\x1b\x5c\x17\x71\x8f\x5f\x36\xf4\xc1\x61\x74\x9e\xdd\x8c\x17\xf3\xb3\x03\xdc\x4e\x15\x72\x96\x69\x67\x73\x6b\x8f\x3d\x6d\x1a\x9e\x22\xe1\xc0\x9c\x5a\xce\x2f\x51\xc9\x6a\x7e\x2b\xaf\x83\xef\x1b\x73\x82\x27\x80\x1a\x19\x3b\xb7\x51\x59\x02\x9b\x43\x43\x88\xbf\x75\xcc\x47\x45\x50\x2e\x47\x3a\xbb\xc1\xeb\xe0\x75\xd1\xd5\xfc\x84\xaf\x0f\xac\x5c\xe1\x81\x93\x7a\x2c\x6d\x73\xf1\xb0\xb7\x82\xca\x74\x88\x3e\xf0\xfb\xd1\xeb\x5d\x1d\xf1\x09\xc1\xaa\x24\x77\xc4\xe0\xbf\xd6\xfc\x56\x77\x0f\x48\xef\xf5\x73\x86\xf0\x54\x57\x52\x6d\xe3\x3f\x0a\x92\xbd\xf7\x22\x7c\x8e\x7a\xaf\x60\xcf\x02\x48\xe7\xfe\x6b\xa8\x11\xf6\x0d\x83\x2f\xea\x70\x74\xa3\xec\x50\x32\x4d\xbc\x4a\xb0\x0a\xe4\x8c\xdd\x53\xa8\x50\xc8\x6b\x14\x05\xe2\x91\x7d\xfa\x32\xfc\xd1\x0b\x5d\x9c\x82\x91\x38\x35\xdf\x36\x11\xf8\x01\xbb\xc4\x77\x46\xdf\xb5\x2c\x40\x4f\xd9\x47\x7a\x81\x91\x5d\xf6\xae\x11\xca\x0d\x0f\x57\x71\xb0\xbf\xcc\xf1\x21\x1c\xdb\x4e\x4e\x7d\xe5\x81\x1d\x49\x0a\x7f\xd2\xe2\xa9\x38\xe2\x85\x50\xe2\xea\x76\xae\xcb\x0b\xdb\xbf\x3e\x32\xd0\x03\xba\x51\x0e\x1f\x4e\x21\x8e\x93\x11\xdc\x4e\xa5\xba\x22\x81\xc9\x43\xc7\x4a\x99\x47\x58\x4f\x38\x6f\x34\xd7\x05\x1e\x9c\x3a\x30\x13\xaf\x9c\x1d\xd7\x53\xa2\x6e\x41\xcf\xd3\x97\x76\x66\x41\x24\x04\x92\xdb\xed\xdb\xd6\xf1\x2b\x7b\x46\x77\x67\xe2\x39\x3d\x5e\xd3\x85\x5d\xbc\x6d\xc5\xab\xc6\x1b\x2b\x70\x0c\xe3\xd1\x59\xe3\x2b\xdd\x38\xdf\x8b\x9f\x19\x36\xae\x0d\xf1\x0d\x99\x39\x87\x5b\xfa\xd3\xb3\x7c\xa5\x95\x66\xee\xea\x2b\xe7\x6a\x2b\x28\xa1\x3e\x9c\x9e\x7e\x9c\xd3\xa6\xb0\xd1\xef\x37\x88\x1a\xa0\xce\xa7\x31\x77\x11\x02\x37\xd4\x88\x6c\xa1\x5f\x65\xa5\x43\x1e\x18\x3f\xd6\x1c\x8c\x75\x11\x8c\x82\x39\x7b\x96\x0f\x77\x59\xd2\x86\x25\xf4\x42\x96\x1a\xe6\x1a\x39\x4e\xbd\x46\x53\x27\x88\x56\x80\xa5\x94\xa5\xcb\x90\x77\xe8\x0a\xd1\xc2\x34\xa7\xa1\x7b\x3b\x03\x71\xd3\xac\x54\xe4\xfe\x34\x68\x45\x1c\x48\x52\x16\xab\x25\xbd\xca\x05\xea\xc2\xde\xb7\x8b\xb7\xd2\x85\x35\x42\xb6\x00\x58\xb0\x04\xc6\xce\xa1\xa6\xf3\x3a\xb0\x63\x8e\x1e\xf7\x02\xe9\xfd\xa0\x8b\xc3\x83\xc9\x24\x33\xaa\x58\x05\x1a\xd4\x0a\x65\xa3\x4a\x73\x7a\xdd\x2b\xb4\x9c\xd6\xd0\x9e\x69\xbb\x31\xfe\xb2\xf6\x75\xed\x0d\xed\x2d\xed\x6f\xd5\xfc\x3b\xc8\x86\x59\x44\xb1\x5e\xd3\x2c\xc7\xf6\xb1\x93\xec\x1c\xab\xb2\x2b\x6c\x99\x3d\xce\xd6\xd8\xa7\xd9\xe7\x5c\x6d\x5b\xb0\x15\x18\x82\xde\xc8\x44\xd0\xeb\x0b\x26\xef\xa6\x1a\x3e\xaf\x2f\xe6\x73\x23\x58\x5a\xc1\x59\x5d\x13\x33\x55\x64\xba\xbe\x02\x1d\xee\xc8\x5c\x8e\x31\xb5\xfa\xed\xf5\x85\x92\xa1\xa4\x4b\xbf\xf3\xb5\xce\x75\x77\x84\xe3\xae\x53\xc7\xd2\xee\x66\x60\x26\x18\x09\xff\xfd\xed\x81\xad\x84\x40\xb5\x33\x55\x03\xae\x4d\xcc\x57\x72\xac\x79\xd7\xf9\x3e\x15\x0b\x87\x7e\x62\x0f\xdc\x0a\x6d\xd1\x74\x6a\x86\xf9\xda\xf1\x60\xcb\xa9\xd8\x1b\xf4\x06\x5d\x9a\xe9\x1c\x4b\xba\x56\x87\xe9\xa4\xba\x4d\xbb\xc6\x8b\xc6\x14\x37\x36\x99\x50\xa9\x83\x7a\x70\x9f\x52\xa9\x26\xd4\x82\xb9\x52\x5d\xb9\x92\xfa\xf0\x5e\xe6\xa2\xf0\xd4\x07\xc9\x74\xb0\xbd\xa5\xad\x9e\x68\xac\xed\x03\xa5\x1c\x6a\xb6\x0c\x1c\x95\xdb\x53\xda\xe5\x9d\xb8\xb0\x54\x55\x29\xb7\x79\x51\x6d\x8e\x6a\xc8\xd5\xed\xbb\x3b\xe8\x6d\x49\xeb\xd6\xbc\x86\x2d\x3e\x71\x99\xdb\x58\x19\xbd\x37\x9b\xe2\x86\x6d\x14\xb3\x71\x2e\xf6\x1d\xd5\x71\x32\x33\x7a\x46\x80\xaa\xfa\xa2\x7f\x7a\x51\xad\x04\xa3\x6e\xaf\x23\xbf\xbf\xb3\x44\x4b\x1c\x81\x9e\x9e\xe1\xe1\x93\xdf\x2c\xd2\x4a\x41\x4a\x6c\x8b\x8e\x3c\x38\xde\x91\x8f\xdb\xa0\x62\xf4\x54\xdf\x5f\x22\xdf\x13\x43\x83\x54\xef\x83\xba\x8e\x9a\xd4\x73\x01\xb4\x5e\x95\x0d\x8e\x85\x69\xe2\x8b\x54\x85\xde\x40\x2a\xbe\xe8\x9b\xdc\xd5\x45\xb4\x44\x33\xc7\x38\xc6\xa6\x1c\x82\xfd\xd8\x00\xb8\x59\x8f\xdf\x13\x21\xb1\xb6\xa4\x63\xe0\xb2\x8e\x75\xf0\x35\x2e\xeb\x9c\x1e\xeb\x06\xad\x50\x83\xa3\xef\x02\x05\x8e\xe9\xc6\x58\x9f\xff\x99\x97\xb0\xae\x54\x38\x83\x17\x2c\x6e\xe4\xf3\x04\x91\xcd\xeb\xb8\x49\xa1\xcf\xe1\x26\x70\x43\x5c\x9d\x44\x39\x4f\x04\xbb\xc4\x11\x7a\x98\x77\x1f\xa3\x0a\xe7\x26\xf9\xa6\xde\x00\xc1\x39\x36\x86\xb8\x43\x38\x38\x44\x75\xa4\xd8\x03\xa8\x00\xe6\xf9\x7e\xde\x20\x3d\x1e\xe7\x37\x8f\x87\x72\x06\x9c\x63\xc3\x95\x5c\x3a\x82\xd6\x33\x58\xee\x3f\x43\xe9\xb9\xf8\xce\x5e\x64\xfa\xbc\x62\xe6\x21\x4b\xff\x96\x65\xee\x38\xba\x56\xf8\x2f\x57\x30\x99\x39\x31\xc8\xed\x62\x5c\xe8\x04\x14\x7a\x1f\x4e\x01\xf6\x0d\xb6\x56\x33\xc6\x23\x99\xd9\x64\x9f\xd4\x85\x2e\x04\x50\x5b\x33\x9a\x1f\x1b\xa5\x44\x28\xeb\x4c\x0c\x71\xab\xf9\x52\x16\xd8\xff\x89\x35\x73\x24\xb2\xfb\x90\x4d\xc6\x4b\xe6\x92\xf8\x5f\x07\x84\x11\x0c\x27\x83\xd1\x9d\x6f\x01\x72\x57\x70\x63\xf9\x4d\xca\x0d\x8d\x62\xfc\xac\x6d\xa3\x28\x49\x2c\x1a\x59\xb5\xc8\x6b\xd4\x44\x23\x25\xf7\x84\x40\x05\x73\x71\x32\x5c\x5f\x25\x21\x7c\xe3\xa5\x99\xf1\xc9\x00\xa8\x48\x45\xc7\x29\xeb\x96\x68\xac\x71\x5a\xd1\x69\x49\x10\xad\xf8\xf6\xa5\xe2\xeb\x5c\xf2\xeb\x62\xad\x63\xa4\xf3\x69\xc1\xd7\x88\x6f\x40\x69\xbf\xcc\x0a\x55\x48\x97\xeb\x6f\xc9\x75\x2e\x81\x35\xc3\x2a\x65\xad\x7c\x21\x0e\x79\x83\x28\xb2\xdb\xdc\x80\x7e\x3d\x27\xd6\x70\x6e\x2e\x4e\xc4\xf7\x6e\x07\xa8\x6e\x91\xc8\x2d\xa6\xe2\x08\x8c\x2c\x71\xc2\xf2\xa3\x0c\xdc\xc9\xa2\xf5\x0e\xd7\xcb\x62\x11\x35\x98\x35\x50\x4d\xa7\xbc\x45\xa5\xc5\xa3\x7d\x1c\x4b\x58\x12\xc8\xc9\xd6\xfb\x40\xbc\xf3\xd0\xce\x51\x1c\xf4\x60\xb7\xaf\x15\x56\x6c\x95\x2b\xbd\x83\x57\xb4\xdd\xda\xd3\xda\xaf\x6a\xbf\xa3\xfd\x9e\xf6\x96\xf6\x87\xda\x1f\x6b\xff\x4e\xfb\x9e\xf6\x77\x8c\xb3\x20\x33\x58\x94\xc5\xd9\x3c\x5b\x60\x87\xd8\x31\x76\x92\x3d\xaa\xe6\x2d\x9f\x61\xbf\xa0\xfc\xa3\xde\x62\x7f\xc8\xfe\x98\xfd\x7b\xf6\xe7\xec\x03\xf6\xdf\xd9\x0f\xd9\xdf\xb2\xa6\x87\x79\x3a\xdb\xb3\xe2\xa0\x5b\x9e\x44\xdc\xf0\xe1\x8d\xb4\xf2\xf9\x09\x95\x00\xf9\x54\x46\x95\xda\xeb\x89\x6d\x79\x24\x06\x3b\x82\xed\xf5\xc7\x56\xbc\x51\xbb\x91\x91\x56\x38\x19\xc8\xa4\x62\x99\xf6\xd0\x25\xd8\xe1\x6b\x5b\x4b\x25\x32\xf3\x99\x64\x22\xa8\xdc\x90\xf6\xb2\x68\x7a\x5e\x31\xa5\x27\x7c\x99\xe0\xff\x17\xaa\xa0\xfe\x32\xbf\xe5\x27\x35\xbf\x9b\x29\x3d\xfa\x16\xec\x41\x89\x5a\xd5\x55\x9a\x8a\x29\xb7\xc4\x64\x74\xb2\xdd\xc0\x49\xb5\x0d\xa5\xda\xe2\x93\x2d\xb7\x93\xa0\x2f\x98\x08\x26\xd3\x2a\x3d\x49\x47\xbc\x9d\x7f\xcf\xed\xc3\x15\xd3\x74\xaa\xf5\xca\xb6\x16\x55\x6d\x5f\xba\x65\x98\x4a\x7f\x32\xe1\xad\xc9\x43\x2b\x22\xc5\x94\x9c\x47\x99\xba\xbb\x8f\x32\xa9\x42\x46\xac\x15\x33\xd4\x56\x55\x3b\xf3\x69\xfd\x2b\x77\x14\xe4\xca\x57\x5d\x4e\x84\x4b\x97\x6a\xbd\xb8\xb6\x12\x46\xb9\x4a\x65\xd2\xd1\x8c\x1b\x53\x33\xd1\x58\xb8\x95\x31\x25\x13\xe9\xb6\x6b\x4a\x28\xa9\xfc\xa8\x62\x49\x5f\xe8\xae\x1f\x55\x9b\xd0\xe4\xfb\xfb\x19\xa1\x4c\xce\x67\x26\xb6\x84\xc4\x31\x77\x46\x95\x74\xed\x9b\x83\x6a\x0e\xe3\xbb\x6b\xf3\xac\xaa\xb4\x64\xdb\xe9\xaa\xf5\x24\xc2\xaa\xc3\x17\x6e\xbd\x5f\x69\xcf\xc7\x7c\xfc\x89\xd4\xc0\x6e\x5b\x39\xc4\x59\x3b\x8f\xf4\xf6\x2f\xa1\x77\xb4\xfb\xf0\xb6\xa1\xbc\xc9\x13\x8f\x4f\x25\x49\x14\x20\xbb\xc6\xf6\x2c\xf0\xc9\xb1\x1b\x05\xd0\x92\x61\x72\xdb\x8e\x37\x30\x36\x19\x7a\xbc\x4c\x8b\x40\x41\xea\x08\xf4\xc8\x63\x49\x2e\xcb\x54\x48\x4e\x09\x87\xc7\x0b\xa3\x7b\xc0\x31\xbc\x5b\x1e\x99\x20\xe1\xb9\xc6\xad\x33\x0b\xdf\xd9\x97\x24\x9a\xda\x0b\xa7\x3f\x91\x25\x3a\x38\x0d\xf8\xee\x93\xfe\x50\xe0\x32\x9f\xca\x08\x0e\xd1\x50\x17\x45\x83\x88\x9a\x1a\xd7\xcd\x2c\x48\xaf\x10\x95\xa1\xb3\xef\x11\xee\x7c\x94\x45\xd6\xc3\x43\x7e\xdc\xd9\x9c\x39\x80\xc6\x32\xd1\x66\xeb\xa2\xe2\x64\xda\x16\x38\x7b\x1b\x2b\x84\x81\x8b\xa0\x35\x40\x8e\x1e\x6f\x4a\x6a\x50\xbd\x4e\x75\x5a\xe9\xed\xf5\x3d\xc2\xbe\x39\x7a\x2f\x28\x7c\xd8\x14\xc4\x1b\x7c\xad\xe9\xec\xdc\x03\x40\xd4\xd9\x5b\x18\x0b\x76\x25\xe5\xa9\xa6\x7f\xdb\x02\xb1\xa2\xed\xc4\x09\x80\x5c\x6e\x3a\xdc\xeb\xe7\x3a\xb2\x9c\x58\x29\xde\xb5\x9f\xfa\x4f\x41\x66\x4d\x6e\xa7\xd0\xdd\x29\xf3\x96\x04\xd6\x9b\x16\x88\x28\x3c\x85\xa1\x04\x38\x4c\x12\x2c\xb0\x28\xf7\x8f\x00\x8a\x6c\xd1\x7d\x8f\x37\xca\x9d\x6c\xa4\xeb\x7b\x38\x12\x15\xa3\xa3\x91\xa0\x8e\x94\x05\xbe\x67\xc2\x2a\x73\x59\x44\x62\x14\xdc\xc6\xc4\x4e\x7c\x44\xa2\xc4\x37\x47\x13\x24\x97\xde\x5a\xa2\xca\x0f\x27\x7d\x70\xac\xe9\x28\x95\xaf\xf7\xed\xa7\xb8\x41\x8b\x88\x9b\xa3\x0b\x1c\xeb\x44\xb4\xc6\xc1\x39\x5e\xb9\x99\x38\x7f\xe2\x53\x6f\x89\x78\x1e\xd9\x3d\xf7\x97\x74\x51\xf0\x44\x1d\xc9\x31\xf0\xc5\x9b\x85\xe1\x1d\xef\x95\x5f\x3d\xb9\xb7\x52\x3c\x7b\xae\x99\x97\xf1\x53\x3f\xf5\xf2\xf5\xcd\xf8\xee\xe6\x0f\x44\xb3\x79\x6f\xb1\x6a\x64\x37\x75\xce\x8a\x2f\xcf\x04\x05\xdf\xcc\xbe\x52\x6a\x7e\x3f\x7f\xe8\xb2\x05\x38\xe3\x4f\x08\x59\xdb\xb0\x1f\x3c\xf6\x2a\xa3\x12\xcd\x87\x6e\xd5\xb2\x57\xb6\x81\x62\x17\xd7\x4b\x71\x9a\x5f\x90\x6b\xa2\x63\x77\xd7\xf3\x34\x71\x0a\x12\x58\x91\x78\xc6\x6f\x38\x5f\xe8\xa7\x7e\x4f\xb6\x1c\xcf\x11\xf9\x3a\x03\xe7\xa8\xbc\xeb\x00\x11\xa1\x64\xdb\xad\xec\x49\x38\x38\xb4\x1b\x7c\xd5\x84\x90\xf6\xc2\xbc\x00\xb8\xee\xf0\xdc\x44\xaf\x67\x0f\x28\xfc\x29\x50\xef\x53\xc6\x75\x14\x3a\x9f\x25\x7b\x0d\x54\xc7\x1a\x51\x83\x5f\x5f\x5f\x2b\xca\xc4\xfd\x56\xcd\x4c\xe5\x68\x59\xdc\xd0\x69\x29\x2b\x75\x34\x6c\x43\x3a\xec\x04\xe2\xe7\xba\x70\x2e\x43\xbc\x6e\x0e\x1c\x8e\x1b\x00\xdf\xe0\xc4\x21\x0c\x1a\x1c\x80\xc1\x05\xa7\xcc\xf6\xfe\x3d\xa0\x9a\xe9\xbf\x57\x10\xf8\xe0\x25\xdb\x7b\x5e\x6e\x9f\x2b\xdc\x32\xc1\x89\x1c\x94\x80\x48\x1f\xc1\x16\xc1\xee\xeb\xf1\x75\x9d\xf3\x75\x01\xcf\x4f\x11\xa7\xc3\x63\xa3\x51\xb9\xa1\x8b\xf8\xbc\xdf\xc1\xa5\x11\x0e\x91\x38\x68\x0e\x9e\x25\xf2\x3f\x4c\xc7\x47\x41\x7d\xdd\xab\x00\xdf\x7e\x02\x4b\x7b\xf6\x80\xaf\xd1\x5a\xdf\x13\x26\xf2\xfe\x9d\xb2\x68\xa1\x21\x10\xdd\x89\x63\xc3\xa0\xa3\x41\xda\xed\x6b\x3d\x21\x88\x7e\x2f\xe7\x92\x38\x69\x93\x2a\x7e\xaf\xe3\x96\x36\xad\xdd\xab\x5d\xd1\x1e\xd5\x56\xb5\x4f\x6a\x9f\xd1\x5e\xd4\x7e\x56\xfb\x9a\xf2\x05\x78\x55\x71\x43\xdf\xd4\xbe\xa5\xbd\xad\xbd\xa7\x76\x28\x7e\xc4\x34\x46\x4c\xb0\x30\xb3\xd9\x2c\xcb\xb0\x3d\xec\x20\x3b\xca\x4e\xb2\xcb\x6c\xb9\x15\xd9\x35\x6d\xc0\x55\xf9\x04\x93\x77\x23\xb3\x1a\x1f\x78\x7c\xde\xc8\x1c\x53\x5a\xc9\x74\xaa\xbd\x04\xa1\x4a\xbb\xbe\x56\x55\xda\xaa\x62\x55\xe8\x4e\xbb\x8e\x8a\xea\x57\xa4\x3d\xd4\x50\x5a\xfb\x64\x2c\x1a\x4b\x45\x26\x7c\x93\x6e\x9e\x14\x71\xab\x48\x15\x65\x13\x6e\x4f\xe7\xae\xe1\x6c\xdb\xf4\xcf\x1d\x55\x47\x3b\xdd\x6a\x30\xd6\x19\x4e\x2b\x71\xa0\x52\x06\xba\xe9\xa2\x0b\xd7\xdf\x62\x87\xa6\x3a\xdd\x66\x91\x5a\x06\x4d\xa8\x8d\xcc\x74\xdb\xa1\x33\x9d\x54\x67\x40\xda\xeb\x7a\xe4\x6d\x81\x87\x5c\xe4\x68\x7b\xc4\x9b\x76\x97\x40\xdb\xd4\xa1\x4c\xdb\x16\x24\xea\xe2\x87\x5a\x11\xff\x6e\x6d\xdb\xc6\xf0\x05\x58\x78\x3e\x13\x76\x47\x13\x73\x1e\x95\x07\xb6\xf3\xc6\xb4\x0b\xdc\xcb\xc4\xee\x6e\xd1\x6e\xf1\x2b\x82\x6e\x64\x8d\xf8\x64\x38\x91\x71\x5b\xfe\xc1\x56\xf9\xdd\x6e\x63\x6d\x38\xbe\xf4\x85\xa0\x83\xee\xdd\xcf\x5e\xc4\x9e\xfe\xf5\xd5\xa1\xfe\x62\xdd\x39\xb9\xb7\x70\xd3\x01\x50\x32\xca\x13\xe7\x9d\x3c\xd0\xbf\x4d\xf0\xec\xd9\xd9\xc3\x4f\xdf\x8c\xeb\x47\x0e\xc6\xb3\x5d\x33\x87\x46\x5a\x89\x4e\xdb\xa4\xd3\xf2\x4f\x58\x73\x3b\x3c\xdf\x0b\x4d\x23\x8b\x3b\x1f\xf8\x27\xc8\xa0\x45\x0f\x0f\x46\x0c\x89\x23\xa3\x77\x7e\xb8\x7f\x90\xbd\xb4\x73\x1a\x71\x53\x36\xa9\x8a\xac\xce\xbe\x59\x36\x88\x96\x9b\x59\x62\xb7\xe7\xf7\xa0\x81\x66\x23\x36\x98\x33\xab\x27\xd9\x27\x68\x49\x17\xab\xe2\x55\x8e\x3b\x6f\xa2\xc6\xd1\xfd\x23\x1e\x2f\x10\x7f\x68\x90\x1a\x23\x17\x48\x2f\xd3\xa2\xde\xdd\xb5\x6a\x37\xdf\x1f\x4f\xc2\x73\x9c\xef\xea\xa3\xbe\xbd\x1f\x6e\x90\x53\x22\x34\x88\xd6\xc0\x9b\x1f\xfb\xb7\x45\x82\x16\x01\xf6\xbb\xad\xab\x70\xff\x3e\x7c\x00\x9d\x5e\x33\x68\x8d\xa8\xfb\x13\x44\x75\x49\xd8\xf8\x0e\xa1\xa7\x7b\x13\x4f\x0f\xca\x3a\xb8\xc0\x9a\xa4\xde\xe7\xe4\xc0\x63\xd4\xd0\x39\x7f\x74\x84\x5e\x6a\xe8\x98\x39\x67\xee\xdd\x41\xb4\x42\xd3\xa7\x68\xb0\xa3\xeb\xa8\x4d\xa9\x95\x60\xc7\x2a\xc5\x07\x2e\xca\x9a\xee\xf4\x1d\x12\x67\xfc\xb8\xb5\x38\xbd\xe7\xa5\xa5\x8e\x5f\xfb\x38\xf5\xa5\xc4\xa9\xdf\x58\xf0\xac\x37\xff\x6c\xa1\xae\xdf\xde\xf3\x47\x1c\x06\xfd\xfe\x3f\xdf\x7d\x08\xe9\xd3\xf2\x26\x3f\xf5\xf0\x0b\xcd\xdf\x02\xec\xeb\x42\x96\xde\xf9\xbd\xaf\xbe\x9a\xab\x23\xfc\x64\xe5\x36\xd5\x6f\x1a\xbe\x60\x49\x87\xb1\xea\x70\x20\xf7\x7a\x34\x2a\xeb\xa0\xde\x6d\x28\x02\x29\x63\x6a\xc6\x32\x0a\x96\xa8\x4a\xe2\x65\xf0\xb8\xb8\xd7\x0f\xdf\x54\xa6\x47\xd0\x5c\x9a\xfa\x66\xc6\x92\x58\x26\xac\x5a\x44\xfc\x64\x0c\x58\x01\xdf\xe6\x17\x36\x51\xf7\x3d\x72\xd1\x30\x2a\x64\xad\x7a\xbd\xe0\xf0\x0e\x61\xea\x90\x2c\x89\x03\xfb\xc5\xf3\x0c\x84\xc2\xdc\x39\x0a\x3e\xc8\x6b\xb2\xa3\xef\x53\x03\xa3\xfe\x6d\xa3\xbd\x7b\x4c\x99\xe3\x94\x5b\xc4\x1a\x65\x4b\xad\xdc\x1b\x9b\xe6\x68\x88\x1c\x8b\xb7\xde\x45\x53\x0f\x3e\xab\x9f\x9c\x33\x94\xbc\x51\x96\x10\x7a\xce\xc0\x06\x2d\xeb\x9b\x86\xc1\x3b\x87\x8b\x82\xd6\x69\xec\x11\x20\xa5\xaf\xe9\x6b\x71\x6e\x55\xf5\x9a\xb4\x8c\x55\x3d\xbf\xca\x47\xce\x5a\x38\x31\x09\xaa\x53\xbc\x88\x81\x60\xc5\xca\xcb\x46\x2b\x80\x46\x4f\x81\xf8\x8a\x3e\xbd\x13\xd5\xf6\xee\x55\x0e\xaf\x6b\x07\x94\xfa\xe6\x15\xed\x35\xed\x3f\x68\xef\x6b\x7f\xa9\x7d\x5f\x31\x3f\x35\xe6\x63\xbd\x4c\xb2\x11\x66\xb7\x49\xf1\xa7\xd9\x05\xf6\x00\x7b\x88\x3d\xc1\x9e\x61\xcf\xb1\x0d\xf6\x4b\xec\x1f\xb1\x5f\x63\xdf\x64\x7f\xc8\xfe\x2d\xfb\x2e\xfb\x0b\xf6\x37\xec\xc7\x9e\x01\xcf\xb0\x27\xe2\x99\xf1\xa4\x3d\x7b\x3c\x45\xcf\x29\xcf\x39\xcf\xfd\x9e\xab\x9e\x27\x3d\xcf\x7a\xd6\x3d\x2f\x7a\xbe\xe2\xb9\xed\xf9\xe5\xbb\xae\x23\x2a\xea\xb8\x12\x41\xb5\x2d\xe5\xe6\x8d\xaa\x07\x1e\x99\xf0\xdd\xc5\x70\x4e\xa4\x33\xe9\xf9\x56\x20\x52\x3c\x50\x37\x60\x85\x93\x03\xf3\x6c\x42\x81\x69\xa2\x91\x54\xc4\x85\xd5\x6c\xc1\x8b\xc3\x4a\x93\x98\x0c\x05\xdd\xd9\xab\xaf\xdf\x1d\xa7\xaa\x11\x6a\x74\x4b\xf7\xad\x04\x3e\xb1\x8c\x27\x92\x8a\xb9\xcd\x77\x35\x48\x0d\xab\xc1\x63\xb8\x4d\x9b\x4c\x6f\xf5\xa2\xb6\xaa\x57\x85\xba\x50\xe5\xaa\x52\xae\xa8\xa6\x5e\x32\xe3\x6a\xf4\xe6\x33\x89\x36\x30\xb3\x95\xda\x85\xd5\x52\x4f\x46\x85\xb4\x70\x52\xed\xa7\x27\xd3\xb1\x68\xdb\x09\xb5\x53\x46\x54\x0c\xdb\xf2\x21\x51\x0d\xae\xa0\x6c\x4f\x2c\x83\xca\x70\x3c\xe9\xba\x70\x27\x33\x6a\xe7\x47\xc9\x81\xbc\x41\x77\x37\xa9\xf5\x20\x6d\xa9\xb5\x62\x82\x2a\xdb\x39\xc5\x5e\x9e\x68\x4f\x20\x5d\xce\x5a\x46\x91\xcd\x12\x6d\x6b\x53\xf7\xb1\x64\xd8\x5d\x0f\x53\x7b\x64\x0a\x0a\xaf\x02\xa2\x9b\x33\xaa\x06\x64\xc4\x3b\xe9\xfb\x89\x07\x78\x66\x4b\xe2\xdd\xd9\x0e\x9f\x6e\x95\x9c\x6e\x2b\x28\xc3\xad\x5b\x76\xca\x56\x4d\xdf\xe9\xba\x00\xa6\xe7\x58\xa7\x77\x84\x25\x82\x5b\xc2\x75\x05\x8a\x53\xc1\x5d\x46\xdc\xb2\xba\xd3\x05\xb6\xa5\x54\x25\x1f\x4e\x06\x13\xee\x81\x90\x0c\x67\xb6\x2c\x58\xa3\x5b\x79\xb3\xeb\x89\xe2\x8a\xc6\xd5\xf3\x98\x88\x45\x3b\x13\x2e\x85\xd9\x95\x34\x05\xdb\xeb\x6a\x41\x77\x4a\xdb\xa6\x9b\xba\xef\x99\xd2\xff\x24\xda\x5d\x4f\xd7\xa8\xb5\xf5\xbe\xb4\xbe\x27\x4a\x1f\x26\xdb\x92\xf3\xbb\x2a\xa2\x64\x3a\x1a\xf6\x05\x93\x69\x4f\x4d\x4c\x0e\xaf\x18\x82\x0e\xcc\xd5\xca\xc0\xe0\x25\x53\xaf\x7e\x25\x16\x0f\x3d\x3e\x39\x76\xfc\x60\x15\xba\x65\xe8\xce\xc2\xb4\x9c\x78\x2e\x85\x81\x1e\x2c\x61\x91\x1f\x1e\xee\xba\x1a\x37\x51\x4f\x34\xff\x9b\xcd\x61\x0f\x6c\xd7\x8b\x45\x09\x12\x02\x64\x99\x4f\x9e\x3d\x99\xc9\xbb\x53\x5d\x22\xf8\x0f\x5a\xe9\xa4\x6e\xc5\x7e\x4b\xd5\xf9\xc7\xbf\x70\x69\x24\x18\x0e\xf5\xa2\xaf\x43\x10\x0c\xdd\xe2\xc5\xe2\xd8\x78\x99\xad\x9b\x96\x3d\xc7\xfe\x31\xd0\xb7\xcb\x41\x3c\x2e\x6d\x0b\x23\x33\x79\x3a\x30\x43\x54\xa7\x1a\x61\x99\x8b\xa2\x20\x5e\x77\x6a\x9c\xaa\x40\x3d\x3c\x28\x9c\xd9\x43\xcd\x7c\x89\xee\xbc\xbe\x38\xc7\x7e\x73\x05\x59\xfb\xce\x47\xd0\x75\xef\x73\xdc\x39\xcd\xfe\x6a\x3a\x41\x54\x6b\x2e\x4b\x0b\x6c\x35\xda\x8f\x6d\xfe\xa6\x75\xff\x10\x0e\x1d\xa8\xea\x24\xab\x1d\x02\xf0\x6f\x8b\xf5\x61\xb9\xf9\xd6\xb6\x10\x15\x99\x7c\xa0\x0b\x54\x83\x6c\x7e\x6f\x68\x14\xa9\xa6\x5e\x25\x4a\x87\x21\xf2\xe0\x42\xee\x0a\x7a\xde\xa3\x78\x81\x53\xbd\xf9\xe1\x78\x37\xc8\x7a\xa3\x75\x1e\xb1\xcd\x99\xc3\xf0\xfb\x57\xe8\x43\xc9\x7d\xc1\xa6\x55\xcc\x33\x48\x70\x56\xad\x4a\x5d\x61\xbb\x48\x41\x35\x80\xa3\x23\x9c\x53\x03\x7a\xb3\x4e\x36\x99\x3f\xd6\x86\x83\x40\x8a\xbd\x03\x4f\x3f\x9a\xdf\x59\x12\x05\xa2\x79\x3f\x06\xe7\x40\x71\xea\x8f\x7e\x8f\xd0\xb4\x05\xd7\x3d\x35\x3e\x30\xb9\x6b\x90\xd7\xcd\x66\x81\xeb\x35\xc2\x23\x1d\xe0\x55\x53\x9a\x39\x76\x9d\x46\x1f\xe6\xc6\x72\xd3\x31\xfd\xa3\x79\xa2\x9c\x49\x73\x53\xd4\xeb\xb5\x0b\xec\xd5\x86\x10\xfc\x06\xa7\x87\x87\x40\x13\x57\x9a\x52\x56\x81\x06\x7b\xa7\xec\x00\x2b\x4d\xf0\x9a\x14\xc1\x13\xc4\xde\xa2\x0a\xd7\xfb\xef\x85\x6c\xf2\xe9\x05\xd0\xbd\xfd\xec\x3d\x9c\x0b\x5f\xb8\xf3\x03\xf6\x20\x17\xfd\x07\x4d\xb0\x77\x4e\x8c\x43\x04\xa6\x72\x77\x3e\xf2\x1e\x31\x41\x0f\xf9\xd8\x3b\xb2\x80\xc5\x2c\xa0\xe3\xce\x0f\x01\x3a\x10\x23\x69\x96\x39\xfb\x58\x10\x91\x3e\xd6\x43\xb1\x43\x10\x78\x3d\x7b\x61\xc7\xa2\xf9\xe4\x5c\x1d\x7a\x36\x72\xf8\xd0\x7d\xff\xe8\x9f\x8e\x7e\xe9\xea\x93\x4e\xa3\x9e\x47\xb5\x27\x7c\x70\xa8\xf0\x52\xa5\x80\x13\x2f\x38\xb9\xa7\xff\x6f\x53\x3f\x16\x2e\x06\xce\x6d\x7f\x90\xe9\xd5\x3b\xe5\xc6\x75\x9e\x7f\xab\x42\x03\x69\x53\xbc\xd7\xc0\xcd\x9f\x3d\x80\x5c\x81\xde\xf9\xe2\xcf\x6f\x7a\x46\x05\x1c\xdc\x2e\xf1\xe6\x7b\xb4\xf4\xd5\x23\xff\xc7\x7f\x5f\x1d\x9b\xe5\xaf\xfd\xe2\xf9\xc8\xb9\xfd\xc1\xd5\x37\xca\x92\x89\xae\x8e\x1f\x6b\xfb\x1e\x7d\xc7\x93\xc2\x94\x6f\x2a\x4c\x65\x1d\x1c\x54\xb1\x91\x3c\xa0\x73\x1c\x18\xc3\xf1\x90\xd4\xef\x8d\x82\xd6\x78\xe8\x1a\x68\x55\x8f\x1d\xf3\xf8\x69\x75\xfb\x00\x64\x5d\x74\x7f\x92\xb0\xde\x3d\x5b\xa4\xd9\x07\x6c\x94\x09\x39\x94\xb0\xb7\x2b\x9f\xe7\x7d\x33\x59\x82\xd4\x6d\x4c\x9d\x80\xb5\x68\x26\x67\x89\x97\x40\x16\x82\x3d\x29\x42\x86\xf1\x3a\xf8\xae\x4e\xda\xb6\x93\x88\xd7\x5a\x69\x49\x31\x0e\xac\x83\x67\x29\x97\x5a\x21\x5a\xe5\xfd\xbd\x44\xd3\xbd\xad\x73\x94\x96\x28\xd3\x05\x58\x0e\xcb\x60\x3c\x02\x3d\x9f\x0b\xf4\xac\xea\xdc\x06\xb7\xc8\xe6\x36\x4f\x15\xf2\x36\xf9\x9e\x64\x73\x42\xa2\xbf\x17\xc3\x23\x59\xe8\x24\x6f\x50\xdd\x12\x27\x0e\x60\xcd\x58\x97\xb8\xd4\xd7\x31\x32\xf0\x98\x24\xc1\x6d\x92\x36\x97\x96\xb4\x5c\xa3\x72\x5a\x59\x36\xf7\x07\x89\x8a\x66\xf7\x81\xd6\x19\x1e\xe7\x92\x24\x51\x3c\xd0\x23\xcb\x4e\xae\xd8\x31\xb2\x62\xc8\x40\x0f\x64\x0d\xf4\xe0\x20\x24\xd6\x47\x02\x86\x38\x1d\x10\x73\x97\x21\xfc\x9f\x89\x17\xd9\x5c\x9e\x06\x76\x58\x7c\x2a\x03\x63\xe2\xbc\x8e\x75\x88\x1b\x48\xf1\x75\xd2\x97\x1d\x8a\x97\x25\xd6\x38\x19\xa5\xae\x00\x40\x6b\x86\xe0\x9f\xe8\xb0\x6a\x22\x55\x17\xa2\xee\xef\xa5\x9d\x7b\xd0\xba\x22\x65\xab\xfe\x68\xf0\xbe\xab\x62\xd1\xb4\x1a\x12\xf1\x14\x51\xc5\x20\x5a\x91\x56\x1e\x75\x80\x0b\x45\x53\x3c\x1b\x14\xa0\x81\x87\xa4\x8e\x7e\x8f\x85\xd9\x0e\xc4\xe3\xe0\xd0\x34\x2d\xe2\xfa\xca\xe2\xb6\x76\x48\x7b\x5a\xfb\xbc\xd2\xc5\xfe\x8a\xf6\x8f\xb5\x5f\xd7\xfe\xff\xda\x5b\xda\xb7\xb5\x77\xb5\xbf\xd0\xfe\xab\xf6\xd7\xda\xdf\x68\x1f\x33\x0f\xf3\x31\xc1\xd2\x6c\x1f\x3b\xc4\x4e\xb0\x2a\x7b\x88\x3d\xaa\x5c\x01\x7e\x81\xfd\x32\xfb\x47\xec\x9f\xb0\xdf\x62\xbf\xa7\x68\x56\x63\x6c\x4b\xaf\x9e\x4e\x25\xdb\x5a\xfc\x60\xd8\x17\x1c\x08\xcb\xb6\x7d\xeb\x56\x9f\x66\xcb\xed\x5b\x4d\x86\x55\x5f\x38\xa9\x4e\xc2\xf9\xcc\x3c\x9b\x70\x35\xa7\xaa\x2d\x1c\x60\xea\xe0\x73\xcd\xbe\xc6\x98\xcf\x75\xb7\x8e\xba\xbb\x01\x6e\x41\x30\xe9\x0b\xa7\x5d\x0a\x66\x70\x0b\xd7\x1c\x9d\x0c\x26\x55\x8b\x35\xd5\xce\xad\x15\x1c\x7a\x42\x9d\x6e\xf3\xed\xb1\x55\xa6\x15\xa5\x5d\xc7\xef\xb6\x5d\x55\xba\x3d\xb0\xbe\x0b\x96\x4e\xba\x6e\x00\x6d\x06\x81\xdb\xb5\xc8\xc4\xdc\xf3\x2e\xea\x6a\x86\x94\x65\xea\x56\x0b\x36\xe6\x0b\x2b\x80\x4c\xab\xfe\x48\xbb\x32\x21\x97\x00\xea\x5a\xc7\xa4\xdd\x06\xaf\x3b\x64\x6b\x1d\xe4\x61\xf7\xa4\x08\xb9\xd2\x7b\x75\x2a\x24\xa3\xe9\xce\xbb\x79\x40\x5b\xba\x9b\x50\xae\x58\xea\xa8\x54\x78\x7f\x77\x20\x95\x72\x51\x9c\xaa\xaf\xb2\xc5\xc9\x56\x27\x55\x67\x50\xa9\xff\x23\x5e\x9f\x7a\x3f\xd3\x31\x77\x27\x20\x18\xce\x74\x06\xc3\xea\xa4\x55\x1d\x97\x54\xb8\xbd\x84\x10\x4a\x66\x92\xa9\x39\xd6\xc1\x29\xd2\x87\xc0\xb9\xc1\xee\xc0\x93\xfc\x66\xdf\xa7\x47\x17\x4c\xa2\x65\x2c\x9b\xc3\x27\x4f\x07\xc9\x12\x5d\xe1\xf5\xbc\x5d\xef\x1b\x93\x6b\x95\xca\xa2\xe3\x9b\x1a\x8c\x94\x3d\x0f\x17\xf8\xfe\x1d\xb9\xe6\x47\x83\x73\xbb\x76\x70\xd8\xe6\x2a\x2f\xbf\xa3\xe7\xbf\x70\x7e\xc7\x00\x0f\xed\xe1\xd8\x39\x51\x32\xb3\x85\x37\x52\x3c\x6e\x16\x7a\xe6\x1e\x66\x47\xa4\x25\x01\x47\x64\x09\x85\xb1\x29\x4b\xbf\xf3\x2e\x19\xd2\xe0\x45\x14\xd4\xd9\x45\xc2\x66\x95\xab\x3d\xd0\xd7\x20\x9b\x6f\x10\x11\x09\x66\x3d\xd8\x27\x16\x0d\x12\xd6\xb6\x23\xe0\x85\x14\x9c\x99\x93\x14\x3d\x0e\x53\x9c\x9d\x85\xc0\xc0\x43\xb0\x21\xeb\xf2\x99\x69\x5c\x0d\x12\x20\x6b\x3a\x52\x18\x0a\x2d\x4a\x9c\x1e\xf6\xf6\xa2\x33\xa0\xb3\x08\xac\x38\x11\x04\x19\x81\x34\xaa\xcd\x8f\x6b\x0d\x82\x9d\x03\x6a\x54\xd4\xe9\xf4\x20\x55\x08\x8b\xbc\x4c\xb2\xdf\xcb\xcc\xa1\x6d\x5d\x61\x54\x40\x64\x48\x61\x34\x9d\xae\xa7\x31\x7b\x88\xe7\xd7\x04\x52\x45\xde\x73\x55\xd0\x33\x1e\x6e\xb1\x8f\xd0\x7d\xd8\x32\x32\x11\x13\xeb\xbe\x47\x88\x3f\xd4\xdd\x79\x9a\xab\xd9\xdc\xec\xd9\x9c\x51\xc1\x9d\x0f\xae\xf7\xf9\xd6\x44\xff\xf1\x9b\x80\x45\x9c\xe3\xa7\xbb\x61\x13\x3c\xba\x2e\xef\x7c\x18\xcf\x51\xb5\x26\x4c\xc4\xd9\xeb\x89\x21\xb4\x4a\xfb\xdb\x7d\x49\xa1\x37\x74\x31\x7b\x15\xf4\xcc\xa9\xed\x4f\x04\x2f\x45\xfb\x4d\x8e\xe6\x6b\x7a\xdd\x5e\xcb\xe7\x47\xe6\xe2\xb7\x6e\x76\xed\xf2\x87\xf4\x7b\xcf\x54\x9e\x99\x97\xc1\x13\x8f\x1d\xdd\xb5\x43\xc6\x79\x3e\xbf\x70\x24\xdf\x7c\x7f\xf9\x5a\x3f\xaf\xff\xfa\x69\x3b\xbf\xf2\x76\xa6\x4f\x37\x69\xdb\x17\xce\xf4\xf7\x7d\x96\xeb\x6b\x0d\xf3\xd5\x5f\x38\xba\xed\x17\xb3\xc5\x1d\x63\xbe\x63\xde\x83\x8d\x97\xf3\x06\xe2\xd8\xe3\xcf\x82\x72\x70\xcc\x48\x1f\x7b\x9a\xb8\x05\x41\x10\x26\x09\xe2\xa6\xb3\xd6\xdd\xb7\xc6\x8d\x7e\x0f\x09\xa3\x55\x53\x9c\x99\x26\xfb\xf4\x2c\xc7\xf1\x6d\x36\x76\x1e\x24\x1e\xba\x62\x88\xaa\x45\x62\x15\x16\x4f\xdc\x2b\xb1\x61\xf2\x4f\x04\x08\x58\xd3\x91\x4d\x4c\xf0\xf9\x9d\x52\xaf\x41\x50\x9f\xcf\xec\x8a\xc0\xce\x1a\x82\x5b\x28\xe4\x60\xd4\x0a\xb7\xd6\xe5\xe8\x19\xb4\xca\x98\xc0\x49\x53\xac\x70\x2c\x83\x2a\x34\x72\x89\x48\x92\x6d\xd5\xad\x40\xcf\xc8\x55\x42\xbf\x67\x9d\x8c\xd6\x77\xba\xca\xf7\xef\xe3\xd9\x0d\x20\x9f\xa3\x06\xc4\x23\x03\x43\x43\x92\x4a\x42\x8a\x45\x1d\x16\x06\xba\xc7\x2f\xd1\x32\xfa\xf6\x8b\x56\xc9\xb1\x7f\xf7\x78\xa6\x26\xe9\x86\xb7\x97\x36\xc9\x7c\x19\xad\x98\xc7\x6f\xb6\x7e\x94\x24\x99\xb0\x04\x76\xf6\xe6\x86\xce\xf7\x86\x0c\x03\x29\x8e\x32\xfa\x76\xb5\x42\x9f\x36\xfe\xe3\xff\xdc\xfc\x29\x9c\xc6\x35\x6d\xa7\xb6\xaa\xad\x6b\x2f\x68\x2f\x6a\xbf\xa0\x7d\x5d\xfb\x0d\xed\x5f\x6a\xdf\xd6\xfe\x54\xfb\x73\xed\x3f\x69\xff\x9b\x71\x16\x66\xb3\x2c\xa9\x3a\x19\x65\x56\x63\x9f\x65\x2f\xb2\x9f\x63\xbf\xc9\x7e\x97\x7d\x9b\x7d\x97\xfd\x47\xf6\x9f\xd9\x7f\x63\x1f\xb6\xe2\xde\xdd\x02\x23\x33\x9f\x69\x95\x0c\xad\xa8\xd5\xe1\x6b\x3b\x56\xb9\x5a\x4c\x15\xe0\x32\xae\x80\x66\xce\xe3\x36\x3b\x32\xbe\x60\x38\xd8\x1f\x4e\x84\xbd\x11\xe9\x8b\xf9\x62\x6a\x7c\xd6\x76\x34\x74\x81\x7c\x89\x74\x54\x89\x71\x7c\xb2\x63\xab\x88\x88\x65\x3a\xd2\xee\xd6\xa8\x9b\xd9\xba\xb4\xa8\x94\x2b\x53\x8c\xb4\x2e\xff\x50\x32\xd4\x96\x4c\xa6\x22\xed\xd4\x56\x69\xe2\xbd\xc1\x2d\x68\xbf\x6f\xcb\x63\xda\xeb\x53\xa6\xaa\xd1\x58\x74\x52\x8d\xaa\xdc\xdb\x2b\x67\x92\x56\x3a\xeb\xb6\x7e\x93\xe9\x2d\xe3\xee\xb4\xdb\xeb\x75\x0d\x0c\x3b\xb7\xd0\x2e\xe1\x64\x6a\x2f\x53\xf1\x55\xed\x3c\x85\x93\x19\xb7\x3b\x21\xc3\xc9\xa8\xbb\x50\xe4\xaa\xed\x55\x0c\x8b\x05\xc3\xaa\x7d\xec\x9a\x41\x29\xf6\x8c\xfb\x9c\xda\x38\xaf\xa8\xda\x19\x08\x87\x5a\x79\xba\x2b\xbe\x57\x3b\x08\x1d\x6d\x75\x82\x92\xf2\xb4\x45\xf9\xe9\x39\xa6\x7c\x5a\x93\x19\x05\x36\xbe\xab\xe4\xd9\xb2\x06\x70\x35\x15\x2e\x22\x4c\x51\xff\x15\x10\x50\x01\x6f\x5c\x05\x52\xb4\x8d\x52\xf4\xb5\x3f\xe3\x4e\xd4\xa4\x7a\xfb\xc6\x3c\x6d\xd4\xe7\x16\xae\x3f\xad\x8c\x65\x93\xa9\x18\x7b\x14\x37\x4c\x09\xb2\x4a\x83\xe1\x78\xb9\x64\xd7\x65\x35\xce\x6f\x2c\xa6\x4f\xac\xdc\x96\xc2\x58\xcc\x15\x0b\xde\xe8\xd4\x58\xd1\x06\xa6\x0f\x0a\xc7\x96\x04\x54\x4b\x94\x92\x3d\xe1\x6c\xca\x91\x76\x6a\xc9\xd7\x39\xbd\xb3\x7c\xfb\xb8\x77\xf2\xc1\x1d\xbf\x69\xd6\xf4\xde\x79\x2c\xda\xbd\x89\x97\x47\x7b\xa9\xbb\x47\xb5\x59\x0c\x21\x03\x7d\xbc\xe6\x79\x17\xc1\xa3\x9c\xee\x6c\xc4\x05\x7b\x35\xb8\x3f\x4e\x98\x38\x45\x4d\xea\xe8\xdc\x3e\x50\xa0\x38\xe9\x0e\x7b\x77\xe8\x0a\x68\xfa\xa0\xdf\x6f\xf2\x54\x78\x07\x44\xe2\x14\xf4\x7d\x73\x34\x7e\x1a\x81\xae\x9e\x64\x34\x6a\x25\x76\xf6\x34\x0f\xdb\x06\x74\x9b\xd5\xa4\x99\x19\x11\xd6\xa2\x6c\xde\x28\xa2\x90\xe2\x1f\x36\x04\x4f\x95\x40\x22\x1b\xe7\x58\xb4\xa8\xa7\xf9\xdb\x59\x08\x83\x2c\x6e\xab\xe5\x6a\x87\x33\x53\xcc\xed\x00\x97\x40\xc5\x2a\xaf\xd0\x32\xa8\x6a\xd6\x38\x68\x99\xc4\xc2\x02\xc6\xfe\x2b\x89\xce\xc0\x1b\x14\xd8\x31\x1b\x46\xe0\x98\x65\xe8\xeb\x5c\xe6\xf3\x38\x12\x22\x42\x74\x8f\x69\x51\xc5\xe4\xb4\x01\x5c\x8c\xa0\xcb\xd7\x9b\xd8\xf7\xf3\xeb\x3a\x56\x00\xb3\xcc\x69\x95\x50\x95\x9c\x96\x4c\xa2\x45\x0b\x84\xa9\x8c\x3d\x76\x0c\xc7\x32\xe0\xd7\xcd\x7c\x4a\xd2\xf4\x19\x74\x0d\x18\x45\x09\x88\x1a\xa7\x15\xc2\x4a\x4f\xc7\x3d\xb1\xdc\xd4\x21\x5e\xed\xbc\xc4\x8d\x6d\x7b\x40\x05\x2b\xcf\xa3\x0b\x12\xfd\xe7\x91\xad\xd1\xbb\xc6\xae\xf1\x6a\x71\xc9\xe0\x74\x64\xc8\xb0\x45\xa7\xcf\xe8\x09\xf4\x7b\x0d\xc1\x61\xe0\xda\x8d\xca\xbb\xc0\xfe\x5f\x1f\xde\x77\x20\x52\x3a\xf9\x40\x79\xb5\xc6\x9a\xdf\xfd\xd6\xa9\xaf\xbe\x0d\x40\x14\xab\xe5\x14\xe6\x26\xb9\x0e\xac\xe7\x0f\xfc\xfb\xef\x34\xc4\xa6\x10\x38\x92\xb8\x95\x77\x52\xcd\x1f\x7f\xf9\xad\x37\x86\xfc\x80\x8c\xb3\x61\xa7\xc8\xc7\xc7\x4e\xec\x3b\xff\x8b\x2f\xb2\x8b\xd3\xff\xc2\xc9\x19\x25\x7b\x31\xd2\xfc\x8b\xbd\x9d\x6b\x3c\x15\x17\x92\x41\xcf\x49\xbd\xc0\xe7\xef\x25\x7e\x70\x41\xc4\x75\xa0\x61\x19\x37\x8c\x42\x56\xe6\x40\xb6\x65\x71\x94\x2b\x86\x68\x0c\x76\x18\x81\x9e\xf2\xdc\xa4\xd8\xf6\x1c\x72\x78\x24\x09\x0a\x7e\xb6\x33\x52\x9a\x1b\xcc\x0e\x5e\x0a\x33\xca\xea\x76\x19\x32\x5f\x82\x4e\x6b\x42\xe6\x65\x8a\x13\x15\x26\x3f\xcd\x79\xf2\x32\xe0\x3f\x1e\x07\xaa\x45\x6f\xd4\xa2\x38\xa4\x34\x03\x69\x5d\x4f\x91\x6d\x1d\x3d\x00\x29\x57\x72\xb7\x87\xbf\xf8\x73\x01\xdc\x34\xd6\x74\xac\x5b\xb3\x8f\xce\xf6\x38\x64\x08\xaa\x0a\x8e\x5a\xde\xf0\x3f\x65\xdb\xb9\x57\x52\x0b\x0f\xc3\x59\x23\x41\x53\x0f\x90\xb1\x68\xae\xf9\x7b\xad\x1b\x06\x9e\x1b\x32\x7c\x27\x97\x9a\x1f\xbe\x24\x3e\x17\x42\xbc\x6a\xbc\x4c\xf4\xc5\x80\xa0\x86\x0d\x5a\x95\x3a\xaf\xc7\x63\x5f\x94\x8f\xcf\x43\xbe\x5c\xbc\x36\x0d\xce\x9d\x95\x3c\xed\xd8\xeb\x0f\x61\x9d\x44\xf7\xa7\x68\x1d\xfc\xd9\x91\x32\xcd\x5c\xa6\x75\x73\xa5\xcf\x97\x38\x0f\x1b\xc5\x2c\x1f\x78\x84\x78\xe6\x1e\xce\x37\x25\xc4\x32\xad\xf2\x75\xa2\x52\x0e\x24\x20\x1d\x84\xbb\x60\xc6\x2d\x0a\x07\xdb\x39\xe8\xf7\xf0\x92\xf6\x79\xed\x97\xb4\x3f\xd1\xfe\x4c\xfb\x2b\xed\xbf\x6b\x3f\xd4\x7e\xa4\x32\xce\xe1\xb6\x6f\xe0\x7e\x76\x9c\x9d\x65\x97\xd8\x15\xf6\x08\x7b\x41\x6d\xdf\xff\x2a\x7b\x8d\xfd\x36\x7b\x93\xfd\x81\x8a\xc4\xef\xb1\xbf\x64\x7f\xcd\x7e\xc8\x3e\xd6\x34\x16\x4e\xaa\x35\xa0\xcc\x96\xe2\xd1\x27\x03\x2c\x98\x4c\x84\x65\x38\x14\xf6\xaa\xec\xd3\x75\x10\x8c\xba\x49\xe7\x5e\x36\x9f\x09\x7b\x03\x6e\x3f\x26\x13\x0a\x5b\x4a\x29\xd5\x4a\xa6\x94\xd5\xe0\x6e\x36\xbf\x97\xa5\x32\xee\xc2\x7d\x2c\x12\x53\x1b\x44\x5e\x9f\x77\x84\x85\x76\xb1\x44\x2b\x9e\xa7\xc3\xc9\x70\x50\xc1\x13\x23\xb1\x74\x26\x95\xcc\xa4\xdd\xe4\x36\x9d\xca\xa8\x58\xa8\x70\xf5\x6d\x76\xea\x44\x7b\x74\xbf\xb5\x64\x1f\xda\xb2\x53\x51\x90\xae\xf6\xac\x2f\xe4\x7a\xaa\xba\x9d\xaa\xf9\xad\xe6\x44\x2c\xa5\x82\x50\x50\x46\x7c\x2a\x20\xfa\x94\x36\x3d\x29\xc3\xad\x44\xb2\x95\x0e\x66\x22\x4a\x5f\x95\x89\x46\xc6\x58\x32\xe6\x0b\xdf\xf5\x4e\x51\x39\xa0\xda\x98\x75\xc5\x0e\x6d\x8b\x92\x44\xd0\x95\x1a\xb8\x00\xc0\xa8\xab\xf1\x0a\xaa\x10\x1d\x60\xe1\xd0\x98\xa7\xed\xbc\x9d\x0c\xa7\x5d\x17\xab\x9f\x20\xb4\xd2\xae\x84\x22\xa6\x24\x5f\x6a\x2d\x2c\x9c\x50\x8d\x6c\xb7\x1b\x9e\x4e\x75\x8e\xb1\xb6\xc7\x6e\xb2\x3d\x01\x55\xf9\xf4\xa4\x9a\x47\x46\x3a\xdb\x7a\x4f\xb7\xe9\xa4\x5e\x6e\xba\x9d\x90\xc7\x22\xe3\xa1\x76\x4e\x9c\x4e\xc5\x22\xe3\x6d\x3e\xeb\x5d\x10\x62\x3b\x7a\x87\xa5\x62\x0c\xa5\x23\x49\x25\x2d\xf3\x85\x5c\xe4\x10\x7b\x73\xd9\x51\x94\x18\x9e\x7c\x21\xda\xdb\xa8\xe7\xdf\xc7\xba\x5e\x1b\xef\x88\xec\x0b\xf7\x1d\xfe\x4d\x43\xc8\xd7\x2f\xcf\x6c\x9b\xb0\x78\x6a\x7b\xa0\xee\xef\x87\xe7\xcf\x64\xe9\xc2\x38\xef\xf9\x32\x83\x6d\x63\x68\x27\xc0\x8b\xa6\xfc\xa6\xec\xf8\x6e\xea\x7d\x43\x17\x4b\x7d\x27\x9c\x6c\x0a\xf2\xcc\x4f\x75\xa4\x2d\x69\x9b\x97\xc6\x85\x24\xbb\x44\x95\xdc\xb3\x3d\x58\xe3\xc8\x26\x16\xba\x66\xac\x55\xcf\x22\x0e\x4e\x10\x80\x2c\x6c\x40\xc4\x89\x9b\xdb\xe7\x40\x34\xb5\x0b\xe2\x64\xb7\xa0\xe0\x58\x8e\xc6\xc6\xf7\xce\x82\x68\x7a\x81\x78\xf7\x7d\x86\xb5\xfd\x10\x10\x98\xd5\xe3\xc7\x7c\x33\x87\xef\xbc\x74\x7a\x50\x2c\x19\x8b\x8e\xce\x21\xb6\x79\x77\xcc\xe4\x4b\xe3\xb1\xa5\x12\x2f\xac\x70\x80\xaa\x93\x61\x58\x7a\xbc\x55\xe6\xde\xea\x7b\x80\xa8\x41\xb2\xe7\x68\x0a\xc1\x70\xa5\xa7\x9b\xaa\x75\x03\x62\xe7\x4e\x21\x2d\xaa\x49\xb1\x06\xbb\xe8\x40\xa4\x33\x7e\x3f\x39\x7b\x67\xa5\x38\x16\x23\xa9\xa3\x40\x16\x38\x1f\xbf\x64\x27\xc7\x45\x99\xdb\x3c\x2b\x0b\x64\x8e\x0c\x23\xab\xf7\x84\x41\x36\xb1\x57\xa6\x0f\x72\xea\xbe\xcf\x29\x92\xc9\x6b\x58\xd6\x65\xf3\xfb\x59\x83\x48\x2c\x11\x95\xa5\xe4\x66\x7a\x0c\x29\x34\x69\x5f\xb7\x9c\x8f\x7a\xca\x44\x74\xe7\xc6\x6c\x00\x39\xf6\x5e\x6c\x50\x50\x0e\x7a\xf3\xe5\xbd\x83\x74\x20\x00\xf6\x7d\x22\xaf\xb7\x99\x3d\x10\x5b\xe2\x0c\x91\x41\x1d\x8b\xcd\x97\x2d\x13\xa9\xc6\xc2\x04\x92\x41\xb1\x5c\x34\xa3\xdb\xb8\x95\x1f\x0b\xae\x75\x1f\x30\x0e\xfa\x25\x5e\x52\x67\x5d\xdc\x71\x1e\x9b\x93\xe5\x6a\x77\xfa\x5d\x9e\xeb\x3b\x11\xdb\x51\x25\xa1\x13\x48\x08\x6b\xee\xf2\x58\x7a\xef\xec\x36\xef\x5a\x9f\x0f\x63\xdf\x4d\xd1\x81\xb0\x09\x90\x18\x9e\xcc\x5b\x8e\x9a\x48\xe8\x03\x83\x74\xe8\x5f\xe7\xfc\x7f\xd6\x15\x76\x2a\xa2\xf5\x4d\x30\xbb\x86\x23\xe3\xc2\x50\x85\x2f\x51\xfa\xa8\x7f\x7e\x13\xb8\xce\x41\x2b\x6c\x7f\x70\xe0\xd4\xce\x0d\x79\xdd\x04\xdf\x3f\x8b\x32\x02\x17\x4d\x72\xf8\x4f\x8f\x81\x68\xec\x67\x88\x7f\xb9\x93\x73\xca\xd7\x83\xb1\xdb\x90\x34\xf2\x79\x9e\xf9\x14\xe2\x3b\x9f\x01\xa8\x3c\x33\xb5\x30\x3d\xfb\xbc\xa4\xa7\xfb\x56\x0c\xe0\x5c\x18\xc4\xa5\x5d\xc6\xc8\x7e\x3a\x1c\x18\x3e\x40\x7a\xb9\xf5\x09\x00\xbb\xba\x78\x0e\x5c\xe0\xa5\x9d\xd7\x88\x6e\xeb\xde\xa7\x1c\x6e\x76\xbd\x68\x2f\xbf\x2c\xb0\xe7\x5e\xde\x3d\xbb\xed\x61\xc1\xe9\xe5\xd4\x4b\xe0\x34\x73\xcf\x90\x27\x75\x39\xa6\xf3\xfb\x4e\x74\x8f\x88\x7a\x70\x00\x04\x3e\xfc\x29\x1b\x0d\xa2\x06\x77\xf8\x58\x1a\x75\x8b\x32\x7d\x54\xb4\x23\x5d\x14\xbf\x41\x27\xb6\xf3\x15\x67\x99\x43\x60\x43\xae\x63\x30\xbc\x77\xae\x62\x10\xc7\x32\x51\x5d\x70\x10\x76\x67\x24\xe4\x3d\x63\x68\x1d\xb0\xae\x3c\xb6\x0c\x94\x64\x51\xe7\xfc\x7c\xbf\xa7\xb7\x4a\x74\xa9\xab\xdf\x03\xc1\xeb\x40\xef\xfd\xbc\x60\x70\xac\x10\x1d\xed\x01\x4e\xfa\x50\x11\x40\x3a\xc6\x29\x78\x9a\x90\xb3\x05\xca\xd8\xdb\xc7\x87\x0f\x83\x57\x55\xae\x6c\x68\x5a\xf3\xcf\x3b\xe2\xde\xf3\xda\x6e\xed\x19\xed\x6b\xda\x3f\xd3\xfe\xb9\xda\xed\xff\x0f\xda\x07\xda\x87\xda\xff\x6e\xd3\x08\x87\xd8\x38\x9b\x62\xbb\xd9\x01\x76\x91\x3d\xc8\x1e\x65\x4f\xb1\x5f\x64\x5f\x67\xbf\xc6\x7e\x83\xbd\xee\x2a\x5e\x83\x89\xa0\xb7\x95\x81\x79\x14\x68\xb6\x15\x9e\x3b\x5a\xf5\xbc\x52\x70\xb8\xeb\xfa\xad\xa8\xd9\xaf\x44\xda\x31\x37\x61\xde\xcb\x94\xfe\x4b\xb9\x05\xba\x82\xf4\x56\xb8\x6a\xef\xde\x47\xdb\xdb\x4a\x03\x99\x94\x92\xc7\xb6\x6e\x19\x52\x8e\xda\xad\x10\x1d\xf4\x06\x98\x0a\xf7\x2c\x2c\x5b\xf1\x21\x91\xde\x22\x89\xb9\xa2\xae\x4c\x5b\x32\x15\x6d\xe7\xd0\x77\x73\x4a\xb7\x45\x1d\x54\x46\xe2\xde\xb6\xae\xc1\xa5\x13\xa6\x53\x31\x19\x4e\xc6\x7c\x6d\x74\x80\xbb\x31\x9a\x89\xb6\xd5\x5b\x2e\x88\x3b\x11\x74\x4d\xa0\x5c\xa0\xa2\x0b\xfe\x52\xfb\x4f\x6d\xe5\x69\x34\xed\xfa\x9e\xba\xde\xd7\xf3\xaa\xe4\x57\x99\xad\x12\x90\xa9\xa2\xdf\xcd\xb0\x63\xe9\xcc\xc4\x1c\x4b\x25\xc3\xc9\xad\x5e\x71\x2a\x12\xf3\xb9\x0f\x99\x56\x53\x8b\xa4\x9b\xa7\x47\xdd\x1d\xa3\xad\x75\xdf\x31\x65\x9b\x3a\xe2\x2e\x17\x8d\x31\x6f\x24\x2c\x7d\x63\x6e\xd4\x57\xaf\xde\xb5\x43\x89\x2a\xfb\x73\xb5\xc2\x34\xc7\x32\x31\xf7\x16\x31\xaf\x2b\x02\x56\x4a\x79\xd5\x7d\x88\xc6\x3c\x74\xcf\x13\x4b\x34\x73\x78\x69\xa2\x37\xba\xad\xce\x85\xd0\xb9\xc3\x4e\x58\xc0\x5a\xdc\x34\x8f\xa6\x7b\xc2\xc9\x41\x43\x97\x36\x90\x17\x89\xf3\x13\x0b\x16\x02\x93\xf1\xa5\x66\x29\x27\x1c\xd9\x8a\x5f\xd1\x51\x1b\xe6\x81\xa3\xb2\x38\xa5\xdc\x3e\x1c\x18\x6b\xb9\xc9\xee\x21\xff\xe0\x40\xb6\xfb\xb0\x4c\xcc\x97\x02\x5d\xe6\xa1\x03\x45\xea\xf2\x1c\x86\x31\x7a\x46\xd0\xc1\x04\x61\xec\x98\x6e\xbe\xd8\x07\x6e\x44\xce\xa1\x67\xd7\xdc\xbf\xec\xc9\x80\x0a\x04\xff\x3c\x28\xa5\x83\xe7\x89\x2f\xf1\xbe\xc3\x99\x71\x73\xe2\x20\x6a\x38\xdc\x5d\xb1\x60\x4a\x63\xf8\x30\x55\xb8\xb0\x75\xf0\x6d\x57\x0a\x0e\x2d\x0a\xe2\x82\xe2\x59\x01\x5f\x67\xdf\x69\x69\x60\xd1\xe2\xab\xa6\xec\x7f\x4a\x9a\x79\xd3\xc9\x65\x89\xaf\x99\x76\x47\x8f\xd0\x11\xda\xd9\xe7\xc3\x52\x36\x4e\x94\x73\x68\x32\x62\x85\x0f\x48\x29\xbb\x67\x77\xb4\x4a\xdb\xf1\x5d\x0e\x37\xd0\x17\x8e\xcf\x8e\x41\xdf\xe0\x90\x4e\x9e\x93\x69\xe5\x78\x4f\x78\xc7\x30\x8a\x59\x21\x50\xec\x9f\x06\x36\xa8\xce\x73\xa6\xb0\xf9\xf4\x15\xf8\x3a\x11\x6f\x18\xb0\x53\x82\x68\xfb\x98\xe4\x3c\x1c\x0c\xee\xa2\x81\xfb\x28\x9f\x82\x10\x8b\x15\x0b\x4b\xa6\xb0\xa2\x7b\x74\xbe\x12\x3f\x34\xd2\x2a\x0d\x4a\xd6\xd8\x01\xef\x79\xfd\x56\xa1\x60\xd4\xc4\xf8\xd5\xe6\x9f\x44\xb7\xed\x0c\x0e\x2c\x0d\x5f\x6c\x7e\x3c\x70\x5f\x16\x52\x3f\x7b\x4c\x2c\x76\xce\x0d\x1e\xbd\x16\x65\xce\xa2\x29\xf0\x6a\x3a\xa2\xa7\x87\x83\x5f\x7f\x09\xf7\x9f\xfa\xea\xb6\x8f\xbf\x39\xff\xb9\x5c\x6a\x29\xf1\x1c\xf8\xca\x9b\x3a\x56\xe7\xa3\xd1\x5e\xab\x15\x21\x6d\x5d\x30\xcd\x99\xd8\x86\xd8\x1f\xdf\x6c\xac\x64\x61\x86\x2f\x2f\xa3\xf4\x8d\x89\xa1\xfb\x37\xbe\x65\x0b\xcf\xdb\x56\x7a\xff\x91\xe3\xc4\x1b\x39\xd0\xe8\x33\x7a\x28\xb4\x5e\x04\x78\xea\xc8\x41\x1c\x9e\xc9\x7e\x40\x75\x15\x2d\xa8\xe3\x22\xa1\x94\xc2\x32\x80\xde\xe7\xbc\xfe\x35\x60\xe2\xca\x3a\xe8\x73\x1e\xde\x7f\x3c\x38\x93\xb7\xf7\xf7\x1d\x3a\x46\x62\x83\x77\x1e\x35\x8c\x0b\x67\x97\x53\x5c\x7f\x2c\x82\x94\x3e\xf9\x80\xd0\x3b\x3f\x2d\x6c\x79\x03\x2f\x39\xf6\xd4\x83\xfe\x10\xe4\x92\x9d\x17\x9b\x9c\xd6\xb8\x43\x71\xe2\x08\x76\x5b\xa6\x53\xe8\x0c\xc8\xba\x89\x3c\x25\xfc\x8b\xd9\x92\xc5\x33\x17\xf3\x95\xce\x43\x45\x01\x58\xb5\x14\xe9\x16\x65\x71\x74\x10\x96\xa8\xb0\x43\x45\x92\xd9\x7d\xc3\xe0\xf1\x12\xf4\x43\x27\x79\x43\x0e\x1e\x9d\x1d\x93\xf2\x76\xc9\x58\x01\xee\x1f\x15\x05\x18\x3a\x52\x65\x69\x60\xe7\x91\x75\x00\xd3\xa7\x04\x6d\xdf\x8f\x8e\x11\xd8\xe3\x73\x44\x2b\xbc\xf7\xc8\xc0\x38\xe7\xf1\xf7\x97\x25\xd0\x30\x20\xe4\x81\xbd\x7c\xc3\x5a\xc1\xaa\xa0\x7a\x36\xab\x0d\x6b\x5a\xf3\x9f\x75\x90\x77\x4e\xcb\x2b\x2f\xa4\x4d\xed\x67\xb5\x5f\xd4\x7e\x45\xfb\x86\xf6\x5b\xda\xef\x6a\x6f\x6b\xdf\xd1\xfe\x54\xfb\x1f\xda\xdf\x68\x77\x98\x60\x05\x76\x8c\x9d\x61\xf7\xb3\xab\xec\x49\xf6\x3c\xfb\x1c\xfb\x12\xfb\x39\xb5\x65\x23\x95\xaa\xdf\x13\xf6\xc9\xf6\x90\x51\x06\xdc\x14\x34\xe2\xc2\xf8\xe7\x77\xb1\x70\x1b\xef\x94\x56\x8a\x07\xf5\x6b\x62\x8e\xcd\x27\x13\x19\x95\x9f\x25\x82\xd2\x17\x96\x3e\x65\x0e\xed\xce\x0e\x63\x77\x91\x50\x6e\x90\x9b\xdf\xcd\x94\x85\xa1\x52\xc7\xaa\xe5\xcc\x56\xb8\x9b\xbc\x4b\xd4\x0e\xb9\xd2\x00\x9f\x2b\x4a\xdb\xa2\xf8\x45\xc2\xc1\x70\xba\xbd\x81\x9e\x56\xd3\xad\x44\xdb\xd5\xcf\x65\x13\xaa\x32\x5c\xed\xd8\xb7\xb5\xad\x52\x09\xe0\x5b\xe1\x29\xd5\xbe\xab\x54\x2c\xa2\xba\x06\xe9\x54\x32\xad\xd2\xe0\x8c\x82\xff\xff\xc4\x28\xc8\x8d\x9e\x21\x17\x01\xe0\x6b\xc3\x2d\x7d\xe1\xf6\xa7\xd4\x17\xd5\x6e\x65\xcc\xad\xec\x95\xe1\xa0\x1b\x91\xb7\x82\x69\xac\xc3\x5d\xec\x69\xdb\x21\x45\xd3\x8a\xed\x9a\x71\x25\xb9\xd1\xb4\x0b\xad\xca\xc4\xa2\x3f\x71\xea\x50\x76\x02\x6e\xbb\xb8\x95\x8d\xaa\xee\x70\xe4\x27\xbb\xfa\x2a\x7f\x64\x1f\x4f\x24\xd6\x53\x59\x07\x44\xcb\xc5\x7d\x11\x4b\xd8\xc6\x6a\xce\x39\xf6\xff\xb0\x77\xb5\xb1\x6d\x9c\xf7\xfd\x7f\xe4\x9f\xe4\x43\xea\x91\x74\x92\x1e\x8a\x27\xf9\x24\x9d\xc4\x13\x49\x49\x27\xea\x24\x1d\x5f\x64\xc9\x7a\xb1\x64\x99\xb2\x69\x99\x96\x18\x5b\x4e\x94\x58\xb4\x49\x4b\x6c\x28\x89\xa5\x28\x57\x2e\x94\x55\xdd\x3c\xc4\x68\xd2\x54\x49\xbc\xce\x58\x02\x2c\x58\x9d\xd6\x05\xb2\x2d\x2d\xbc\xb5\x7b\xc9\xd2\x62\x01\x96\x61\x01\x96\x0d\xfb\x92\xa2\x5b\x97\x7e\x18\x52\x20\x1f\xfa\x69\xc8\x87\x8e\x19\xee\x39\x4a\x53\x82\x04\xed\xbe\x0c\x18\x60\x1a\x38\xff\xf8\xbf\x47\xcf\x3d\xbc\x7b\x9e\xff\xcb\x3d\xff\x97\x63\xcf\xd6\x38\x7c\x11\xa2\x49\x2d\xfe\xa1\x27\x14\x66\x70\x37\x07\x11\x69\x4f\x8c\x46\xc3\x2c\xf1\x1a\xa1\x64\x46\x96\x4d\xca\x24\x6e\xfb\xa3\x5d\x94\x2d\xc5\x5b\xa6\xe3\xf1\x91\xd3\xf5\x5e\xd9\xd5\xa2\x4d\x6a\x0a\x57\x37\x89\x51\xdf\xa6\xf7\x5e\x4c\x8a\x42\xf6\x74\x03\xa6\x55\xbc\xde\x4c\x82\x8f\x88\xd8\xfa\x28\xd2\xab\xcd\x95\x5f\x7a\x9b\xb0\xb1\x4e\x21\x89\x8e\x5a\x24\x86\x40\x49\x77\xd0\xd3\x88\xd2\x62\xa7\x84\x73\xc7\xc4\xd9\x56\x89\xa4\x08\xa6\x48\x5f\x1b\x7a\x6c\xae\xcb\x26\x0c\x75\x77\x8f\x91\x82\xba\x82\x5a\x9c\x19\x24\x38\x48\x99\xd3\xe3\xae\x4f\x50\x1c\xa3\xe5\xe6\xe8\x58\x31\x7a\x12\xa5\x4c\x0d\x92\xda\x01\x9d\xa8\xbb\x34\x4e\x59\x7b\x17\x41\x93\xe1\x7a\x86\x54\xc4\xde\x28\x92\x94\x69\xdb\x2a\x88\x13\x3d\x2e\xc7\x1a\x91\x43\x2a\x5d\x23\x35\x83\x1a\xa5\x49\x23\x8d\x2b\x04\x0d\x4d\xad\x7f\x04\xd9\x1a\x7a\x5a\xa9\x69\x59\x32\x92\x95\xe9\xb2\x48\x48\xa2\x73\x78\x2a\x48\x69\xef\x49\xa6\x94\xe9\x89\x01\x44\x4f\x74\xc3\x89\xc8\xc4\x1d\x92\x0a\xcc\xe2\x70\x24\x31\x86\x62\xd2\x39\x10\x0f\x65\x4f\xf7\x9c\x79\xe1\x3e\x4a\x62\xe2\x9d\xf9\xe8\xc8\x68\xfd\x39\x2a\xbe\x1c\x58\x98\xff\xa6\xd4\xd8\xfb\x52\x4f\x36\x45\xde\x7a\xfb\x76\x28\x84\x05\xd1\xa0\xf2\x8c\xb8\x84\x89\xbb\xfa\x1d\xfd\x2d\x83\xca\xd3\xdb\x8c\x69\x6c\x6d\xfb\x34\x7b\xa1\x74\xf3\xef\xba\xea\x48\xdd\xc2\x5d\x4d\x7a\x67\xf8\xc7\x45\xc7\xd9\x68\xf8\xd4\x31\x29\xb9\x87\xe6\x7d\x95\x4b\xff\xb9\x10\xa0\xf2\x98\x14\x6f\x70\x63\xce\x85\xbd\x27\x51\xbf\xa3\x77\x95\x92\x44\x3a\xf1\x98\xad\x1d\x33\xc3\x52\x92\x24\x10\x09\x15\xe9\x69\x37\x19\x6f\x96\x55\x32\x78\x5a\xd6\x2f\x4c\x24\xf4\xcd\x16\x47\x47\x72\x2c\x51\x58\x13\xf7\x90\xf4\x8e\x2b\x7b\x77\x68\xff\xe6\x62\xa7\xf1\x0a\x2e\x29\x2b\xd3\x5f\xd4\x24\xe6\xbf\x90\x22\xa4\x7f\x11\x09\xca\xba\x10\x0c\x21\x45\xaa\xec\xd2\x44\xbc\xb0\x79\x4a\xc6\x67\xfa\x91\x2e\xcf\x28\xaf\x69\xf5\x6d\xca\xdb\x1a\x62\x5c\x46\x4c\xa9\x8c\x8c\x5f\xc7\x3d\x0c\x7a\xd7\x06\x6a\xf1\x5a\x0f\x7b\x40\x88\x9a\xd6\x6c\xed\x2f\x75\x62\x36\xae\x5c\x79\xbc\xf2\x2c\x23\xc7\xbe\x28\x4f\x9c\xcb\x4e\x64\xc6\x76\x58\x42\xa5\x58\x64\x84\x3d\x5d\x1b\xaf\xab\xfb\x6a\x8d\xb2\xa4\xa7\xf0\x4a\x27\xc3\xb9\x69\x4f\xb8\xee\xb7\x91\xf5\x5f\xc2\x10\xd9\xf2\x52\x86\xfb\x2a\x3e\xda\x4e\xe6\xfa\x42\x98\x46\x5c\x32\x75\x2e\x2f\x00\xee\xdb\xff\xdd\xb9\x0f\x01\x98\x81\x14\x2c\xc2\x65\xb8\x02\x4f\x42\x19\x76\xe1\x16\x3c\x03\xaf\xc2\x1f\xc3\x03\xee\xa7\xff\x0f\xf0\x4f\xf0\x1e\xfc\x1c\x7e\x61\x65\x22\xb1\x7c\x11\xaa\x3b\x2f\xf5\x82\x9f\x1b\xbb\xdc\x71\xca\x3f\x20\xf0\x5d\x16\xc3\x3e\x1c\xe5\xb6\x65\xcc\x17\x35\x8d\x5d\x1e\x67\xcc\xc3\xbc\x03\x7d\x42\x97\xbd\xdb\x72\x2e\x1f\x8a\xf1\x14\x72\x11\x6b\xa7\xc1\xc7\x9d\x33\xbb\xad\xa8\x6a\xee\x79\x50\x0d\xe1\x8b\x74\x55\x43\xbe\x9d\x0e\xcb\x54\xb4\xf6\x4f\xaa\xee\x9c\xb1\x03\x6e\xc0\xb5\xa5\x6a\x4a\xa2\xc3\x0c\x21\x96\x6e\xc5\xd3\x80\x0c\x08\xce\xee\x83\xd8\x71\xab\x58\xbc\xcf\x2a\xd0\xd1\x3c\xca\x95\x27\x9f\x15\x83\x68\x2d\xec\x48\xc0\x2f\x48\xbd\x37\x9e\xbd\xf0\xe2\x24\x91\x96\x3c\x81\xc1\x2b\xbd\x4f\xe0\xa4\x48\x9b\xa6\xe6\x67\x95\xf8\x64\xbf\xaf\x40\x24\xe3\xc2\xc4\xeb\x74\xea\xf7\x23\xab\x43\x25\x51\xdc\x6d\x88\x29\x64\x6c\xa5\x38\xe5\xc2\x58\xcf\x99\x30\xbe\x34\x67\xd7\x89\xa2\x53\xa4\x28\xcf\x54\x52\x04\x29\x61\x76\xb7\x2a\x68\x04\x99\x21\xa2\xc7\x39\xdc\xad\xb5\x1e\x47\x9a\xa2\x72\x92\x92\xd3\xb5\xf4\xbf\x3e\xd0\x34\xc9\x3f\x97\x08\x77\x49\x33\xf7\x17\x1b\x90\x24\x08\xb6\x74\x48\xe6\xff\x9e\xf9\x46\x5b\x48\x8d\xd9\x9e\x4e\x22\xa1\x29\x14\x2b\xe5\x8e\x6e\x6c\x0d\x54\xee\x65\x49\x9a\x88\xb6\xb7\x89\x21\x4a\x93\xa4\xf2\xce\x40\x7f\x48\xff\x40\xd6\x69\x5c\xb9\xa7\x31\x75\xa8\x99\x61\xa1\xa9\x96\x35\xb9\xe3\x98\xf4\xd7\xd6\xd4\x3a\xf7\x13\x09\xb6\x24\x35\xf4\x9d\xe9\x3a\x39\x5e\x0a\x4b\x22\xcf\x16\x97\xc2\x86\xa0\xbc\x27\x92\xb6\x17\x6f\xd7\x54\xfe\x35\xee\x3e\xdb\x56\x83\xd8\xd3\xb7\x9f\x46\x22\x8f\x85\x6c\x9e\xa6\xfe\x95\xca\x47\xff\x22\xa3\x77\x91\x68\x14\xd3\x32\x21\x0c\x29\xba\x05\x64\xae\x06\x6d\x85\x2a\x18\x3b\xb1\x24\xae\x21\xdb\xc3\xd4\x8e\x48\xbe\xe8\x42\x09\x8b\xdc\x44\x48\x86\x50\xcc\xc6\xb1\x4c\x0a\x84\x8d\x49\x04\x0b\xbc\xee\x14\x1a\x93\xa1\x15\xa4\x65\x67\xeb\x32\x92\x89\x16\xb9\x26\x8f\x45\x9e\x68\x9f\x91\x2b\x82\x82\x45\x2c\x4a\x69\xba\xe2\xa9\x2b\x1c\x1f\x32\xb9\xde\x32\x5d\x46\x3c\xe9\x24\x33\x00\xe0\x01\xb0\xbd\x23\xbc\xe5\x78\x19\x24\xd0\x61\x14\xa6\xe0\x0b\x50\x84\xdb\xf0\x0d\xf8\x3d\x78\x09\xa0\x69\xc8\xd7\xec\xf5\x1d\x66\xe6\x8a\x18\xb1\x68\x64\x40\x30\x62\x51\x1f\x7f\x97\xc2\x2c\x57\x40\xce\xca\x2d\xe5\xde\xe7\x1a\xae\xbe\xc5\x35\x7c\x5e\xe6\x8b\x19\xf5\x42\x33\x7f\x61\xed\xb2\xf6\xba\x0e\x93\x8e\xf3\x82\x30\x56\xe9\x99\x61\x3e\xbf\xec\xd5\xe9\xc7\xac\x74\x8c\xcc\x6f\x4d\x1a\x3e\xfb\x4c\x35\xbc\x9a\xd8\xaa\xd9\x37\x6c\xed\xa2\x05\x7f\xd8\xf9\xe4\x0e\xa9\x71\x0f\x2d\x2c\x76\xe2\xc0\xef\x8e\x25\xc6\xc8\x98\x4e\x84\xa0\xa1\xb1\x6c\x5d\xb3\xaa\x05\xce\xcc\xac\xec\x10\x6c\x08\x4e\x62\x5c\xd3\xe2\x78\x9b\x14\x89\x77\x91\xd2\x5d\x24\xb8\x4b\xc6\x66\x90\xd4\xaf\x13\x2c\xd3\x75\x3b\xc5\x5d\x1c\xee\x6e\xca\xed\xa4\x55\xba\x2b\x4f\xa2\x2c\x91\x35\x4a\x6b\x27\x6a\x6b\xe6\x6a\x96\x64\x25\x85\x75\xe3\x4b\x5d\xed\xa8\xeb\x2a\xaa\x8e\x97\xd7\x16\xba\x12\x0d\x97\xfe\x66\x3e\xfe\x40\xd7\xb5\xee\xe1\xf4\xa4\x91\x08\x49\x44\x9c\xee\x91\x86\x02\x52\xa8\x7f\xa0\x21\xc6\x98\xa7\x7d\xff\xd5\xe9\x58\xff\xca\x18\xce\x24\x51\x1d\xbd\x5c\xd7\x8b\xfe\x41\x8c\x13\xf9\xab\x4d\xa4\x61\x4b\xbb\x8b\x48\xee\x10\x92\x3e\x5f\x8b\x35\x5f\x67\x2d\xcf\xd0\x2f\x37\xb3\xfb\xd1\x6f\x33\x75\xb7\xf2\xab\x7d\x95\x2a\xfb\x0a\xd2\x25\x26\x13\x42\xe8\x6d\x8a\xda\x24\xaa\x2d\x4d\x78\x4b\x95\xe9\x0a\xf6\x4c\x68\x44\x97\x52\x69\x54\x51\x35\xf9\x4d\x2b\x80\xed\x3d\xdb\x47\x8e\xe7\x41\x87\x59\x78\x02\x36\xaa\xd1\xc5\x7f\x08\xdf\x81\xef\xc1\x0f\xe1\xc7\xf0\x8f\xf0\x13\x78\x1f\x3e\xe0\x99\xb2\xdd\x42\x03\xcf\x96\xa4\x0a\x7d\x42\x58\x18\xb6\x9e\xaf\x6f\xd8\xca\x68\x54\x0d\x6c\xf4\x9a\xfa\x8b\xdf\xc9\xcb\x73\x54\xb3\x61\x5a\x41\x3c\x96\x1f\xbe\x97\x6f\xc4\x72\xeb\xc3\x9c\x0c\xd6\x2e\x87\xc3\xc7\xdd\xee\x4d\x9b\x86\x97\x11\xb1\xb6\x77\xbd\x5d\x41\xd7\xd0\x41\xc6\x21\xaf\xb5\xaf\xca\x03\xff\x62\x07\x0a\x05\x77\xbd\x0f\x76\x71\x37\x75\x5f\xc4\xe8\xb6\xd2\x22\x74\x55\xab\x24\x05\x22\x55\x6f\x1c\xbf\xcb\xe1\x73\xf1\xcc\xce\x41\x67\xb7\x39\x21\xf8\xdb\x7e\x5e\x58\xc9\xef\x70\x35\xb7\x09\x43\xd6\x3e\xac\x11\x74\x54\xfd\xdd\x79\xa2\xe6\x21\x9e\x26\x89\x17\x9b\x0f\x3a\xac\xf4\x44\x43\xb1\xa0\xe5\x12\x1a\x09\x1c\x6e\xb0\x70\xad\x88\x5f\x29\x36\x20\x38\x4d\x33\x2f\x56\x0d\xff\x31\x59\x5c\xb5\xf4\xef\x70\x24\xd8\x21\x58\x4c\xf5\x83\x93\xe3\xb5\x4d\x78\x75\x9c\xb5\x06\x56\x28\x2d\xa8\x93\xc4\xdf\x23\x86\x5a\xbe\x22\x62\x4b\xc7\xc0\xc8\x23\xd3\xa8\x2a\x88\xcc\xf0\x5d\x90\x1f\xd4\x4c\x91\xe2\x24\x22\xae\x49\x9e\x56\xfa\xd8\xc8\x98\x10\x47\x94\x64\x76\xa1\x83\xc4\xb1\x2c\x11\x6a\xcc\xb7\x4b\x1d\x11\x56\x7f\x8a\x4c\x22\x8a\x24\x24\x18\x6a\x8a\xa1\x78\xd9\x8e\x44\x37\x4c\xc9\xd6\x36\x4a\x50\x57\x95\x8a\x36\xda\x86\x29\x77\x5f\x34\x4c\xd3\xa2\xa0\x4b\x09\xba\x4c\xb0\x72\x67\x8f\x48\x32\x25\xbb\x4c\x48\x48\x93\x8d\xb6\x25\x1a\xd2\x66\x56\xb0\xf2\x36\xce\x28\x0a\x4d\xb1\xa4\xb0\x24\xe6\x6b\x70\x3c\x2c\x55\x7e\x8a\xa4\x48\xc8\xae\x20\x79\xae\xd3\x72\xe5\x6d\xb1\xfe\x9c\x4a\xdc\xf6\x3d\x81\x61\x19\xc9\x48\xac\x72\x6f\xe8\xb8\x48\x5a\x2f\x8a\x04\x05\xda\xf5\x28\x21\x05\x22\x7d\x48\x1f\xe0\x2e\x21\x37\x2a\x3f\x59\xc6\x24\x89\xfb\x47\x30\xfd\x3a\x21\x22\x71\x3c\x9f\xa8\x3b\xbe\xeb\x72\x8c\x5d\x18\x76\x37\x45\xdb\x65\x26\x65\xa5\x7b\xd2\x0e\x5d\x56\x5a\xae\x34\x74\x18\xaa\x88\x78\x37\x3b\x30\xa7\x56\xd2\x62\x7a\xf0\x31\x2d\xce\x24\xda\x7f\xda\xdf\xa6\x8c\x5c\xfb\xc6\xe3\x4c\xd6\x8b\xc3\xa7\x42\xed\x8f\xb6\xb7\x4a\xa4\xde\x1d\x8f\x77\x77\xbc\x1e\x4f\x51\x72\xaa\x09\xdd\x35\xd8\x56\x1f\xd2\x5b\x1e\x23\x22\xfd\x72\x23\x4e\x26\x90\x21\xb6\x5e\xa7\x28\xe3\x99\x76\xec\x18\x5c\x42\x3c\x36\xa7\xe3\xf9\x1e\x5b\x3b\x2e\x51\xd2\x77\x81\xec\xa0\x71\x8b\x10\x0c\xcd\x3c\x5b\x63\xd7\x52\x2e\x77\x59\x93\x8e\x79\x13\x68\x64\x65\x79\x34\x22\x6a\xcd\x0b\x14\x5d\x73\x2b\x71\xb9\x88\x6a\x68\x89\x8a\x49\x69\x47\x29\xaa\xe1\xab\xc8\xa4\x15\x6c\xa8\x5f\x96\xd9\x2d\x89\x8a\xbb\x04\xc7\xe7\x35\xd3\x7a\x0d\x9c\x21\x04\x09\x8b\x2c\x12\xee\xe4\x6d\xfe\x23\xbb\x78\x4b\xac\xbf\x4c\x52\x22\xe2\x88\x1f\x97\x35\x42\x44\x64\xd4\x94\xf1\xb6\xbf\xb2\x7d\xe0\xf8\x16\x74\xc3\x09\x58\x84\xc7\x61\x0d\x36\xe0\x2b\x70\x1f\xfe\x14\x7e\x00\x6f\xc0\xdf\xc2\xdf\xc3\xfb\x55\xdf\xc8\x5a\xa1\x49\x68\x11\x3a\xcc\x95\xd6\xc1\xb7\x12\x3f\xc9\x50\xfd\xdc\xbb\xe2\xd7\xb3\x55\xc7\x01\xd9\x69\xea\xf7\x07\xd4\x7a\xee\xb8\x11\x09\x44\x02\x8e\x4f\xb3\x5d\x9e\x75\xdd\xaa\xfa\x69\xb1\x57\x87\xeb\x37\xe4\xc3\x56\x46\x72\x6e\x47\x0c\xc5\x86\x4d\xf3\xc2\xd4\xdf\x39\x73\x76\x58\xc7\xcf\x61\xd1\x9f\x4f\xf7\x1d\x84\x0d\x1f\xac\xba\x00\x7f\xc3\xfe\x3f\xb5\x82\x4c\x6e\xae\x2e\x1b\x21\x1d\xd9\x11\xa6\x1e\xb8\x8a\xb7\xc5\xcf\xe1\xec\x82\xaa\x6b\x06\xc5\xac\x62\x7d\x7d\x8d\x33\xfa\xb1\x90\xc0\x8e\x70\xfc\x4a\xba\xca\xf2\xbd\xe7\x31\x58\xdb\x94\x13\x94\x5f\x2b\x02\x2a\xf7\x23\x7e\x3a\xd4\x2b\x61\xc2\xe5\xc6\x94\x82\x2b\xa9\x90\x29\x14\x04\xd9\x3c\x56\x7e\xf4\x69\xd9\x20\x28\x9f\xa6\x54\xfe\xda\x14\x17\x82\x6c\x1e\x2b\xb7\x4c\xa9\x21\x28\xa6\x79\xab\x7d\xa4\xa2\x2a\x28\xa6\x04\xf9\xd6\x4a\xe8\x64\x17\x5d\x5b\xec\x4c\x34\x5c\x7a\xf3\x5c\x7c\xa7\x73\xc2\x94\x24\xaa\x91\x9e\x1c\x9e\x0b\x49\xee\xfa\x99\x90\x34\xdc\x2d\x85\xc2\xe1\xc6\xa8\xb7\xc9\xdd\xb1\xff\xea\x74\x34\x2c\x2b\x27\x03\xe2\xf1\xde\xd6\x40\xf7\xf0\x4c\x63\x33\x17\x2f\xd1\x70\x62\xcc\x31\x9d\xc4\x13\xa3\x69\x89\x03\x75\xf4\x72\x6d\x0f\xaa\x3a\xc6\xc5\xaa\x9c\x69\x78\x52\x62\xa2\xff\x29\xe9\x53\x62\x27\x45\xd1\xf3\x1c\x6b\xfd\x1a\xbd\xe9\x63\xf7\x23\xdf\x61\xfe\xa7\xb2\x64\x3e\x20\x9e\xed\xd1\x18\x5b\x96\xd7\x0c\xb6\x17\x5a\x16\xf5\xe7\xfd\xa6\x20\xe2\x47\x72\x54\x1c\xf5\x4f\x38\xfc\x5c\x1c\x49\x9f\x49\x45\x2e\xa4\x24\x7e\x64\xa6\xa8\x52\x69\xb0\x61\x46\x37\xe5\x95\x54\x15\x5a\x6e\x00\xdb\xbb\xc2\x3b\x8e\x7d\x90\x20\x02\x23\x70\x16\x16\x60\x1b\x5e\xe4\xf5\xb1\xac\x58\x03\x1e\x85\x6a\xad\x82\xe0\x41\x64\x81\xdd\xcb\x1d\xeb\xa3\x13\x26\xdb\x0f\x44\xa2\x31\x83\x6f\xda\x58\xdb\x3a\xdd\xde\x6a\x24\x56\x20\x68\xa5\x47\xe6\x1a\xab\xef\x20\x9d\x1b\xeb\xe0\xaf\xf5\xba\x82\xd6\xb6\x73\xc4\xaa\xf1\x5b\xcd\x25\x17\x8b\x04\x9d\x4d\x96\xc7\xae\x95\x46\x39\xe2\xb7\x8a\xe6\x5a\x52\x28\xe8\x77\xc6\xbc\xe6\x64\xe5\x4e\x43\x41\xff\x87\x4a\x4b\xd3\x9d\x22\xd5\xd8\xbd\x7b\x06\x9b\xb9\xf4\x3b\x88\xd2\xcc\x39\x1f\x6a\x92\x6b\x50\x65\x94\x9d\xf2\x0d\x74\x8e\x08\x0d\x28\x8d\xf4\x91\x89\x7e\x51\x4a\xa1\xce\xca\xd4\x13\x50\x13\x58\xb8\x1b\x17\x8b\x04\xe5\x65\xe2\x1e\x45\x1e\x12\x8e\xd2\x32\x21\x2b\x48\xb2\xba\x51\x26\x58\x26\xae\x75\x42\x0a\x28\x16\xb1\x65\x75\x22\xb2\x54\x46\xd1\x54\xe3\x3e\x2a\x8b\x58\xa4\x8e\x7d\xfd\x46\x2f\x1d\xf1\x85\xbc\xe7\x83\xde\xef\xb7\xee\x35\x1f\x37\x54\xe5\xe2\x0b\xfb\x95\xdb\x21\x11\x71\xb9\x6b\x5c\xa2\x53\x7d\xfe\x9e\x9e\x60\x9d\x4d\x11\x25\x39\xd4\x3d\xf1\xf4\xcf\x08\xd1\xce\xf6\x10\x32\x32\x8a\xd4\x48\x48\xa4\xa8\x91\xe9\x11\xec\x5e\xdc\xc7\x86\xf3\xc9\xb2\xba\x86\x64\x0c\xf1\xb7\x3c\x98\x3a\x51\xc3\x2b\xfc\xec\x35\x56\xfe\xad\x8c\xa4\x60\xae\x8f\x32\x11\x0b\xb4\x40\x2f\xf5\x18\x71\xba\xe3\xb4\xa1\xc8\x76\xe4\x94\x88\x7b\x50\xd5\x19\xdf\x15\xde\x72\xbc\xf2\x50\x67\xfc\xcd\x74\xc6\x57\x2c\x9d\xf1\xcd\x73\x9f\xd0\x19\xdd\xf5\xd3\x3d\x7c\xa5\x5b\x3a\x63\x75\xa5\xaf\x1c\xac\xe5\xcf\xd7\x19\x3d\xcf\x99\x3a\xa3\xb9\x78\xa3\xdf\x66\xfe\xa7\xfe\xd7\x3a\xe3\x43\x1b\xf5\xa1\x8d\xfa\xff\xc9\x46\x7d\x68\xe3\x3c\xb4\x71\x1e\xda\x38\xff\xb7\x36\x0e\x80\x00\x00\x0c\x04\x10\xc0\x69\x0a\x0d\x88\xc1\xc2\xc7\x7f\x02\x00\x21\xe1\x3f\xf8\x39\xf3\x63\x54\xdb\x99\x47\x37\x8c\x56\xb1\x0d\x5c\x60\x54\xb1\x1d\x9a\x0f\xe9\x78\xa4\x8d\x03\x06\xe0\x42\x15\x3b\x8f\xd0\x3d\x30\x09\x7b\x60\x07\x01\xed\x60\x03\x6a\xfb\x67\x8e\x1d\x60\x03\x11\x7e\xc4\xb1\xd3\xa4\xc3\xbb\x1c\xbb\x38\xfd\xa7\x1c\x13\x8e\x3f\xe4\xd8\x0d\x00\xcf\xc1\xaf\xaa\x58\x80\xc6\x43\x6c\x83\x3a\xe1\x6b\x55\x6c\x07\x4d\xb8\x5b\xc5\x78\xa4\x8d\x03\x9e\x10\xde\xaa\x62\xe7\x11\xba\x07\xf6\x6c\x5d\x1c\x7b\x8e\x8c\xad\xc6\xbc\xae\xed\x8f\x38\xa6\x47\xe8\x75\x1c\xff\x92\x63\xd1\xbc\xae\xed\xfb\x1c\x37\x81\x0d\x1a\x6d\xd6\x6f\x61\x47\xda\x7b\x79\x3f\x16\x6e\x3e\x42\x6f\xe1\x7f\xfb\x73\x8e\x8f\xf1\x36\x56\x9f\x6d\x47\xda\x74\x1c\xc1\xaa\xd9\xde\x0e\x1c\xf7\x73\x5c\x67\x62\x72\x64\xcc\xe4\x48\xff\xf4\x08\x9d\x56\xc7\x9f\xbe\x59\xcc\x5d\xcf\x5c\xcb\x29\xdf\x55\x42\x37\x37\xb7\x4b\xca\xb5\xcd\xf5\x62\x66\xe3\x66\x4f\x58\x19\xd2\xf5\x91\xb0\x32\x55\x28\x28\x0b\xf9\xd5\xb5\xf2\x96\xb2\x90\xdb\xca\x95\x6e\xe4\xb2\x0b\xb9\xd5\xed\x42\xa6\x34\x5b\xc8\xaf\xf7\xcf\x16\x32\xeb\xc7\x2f\xe6\x4a\x5b\xf9\xcd\x0d\x65\x30\xac\xeb\x47\xb1\x32\x9b\xbb\x5a\xda\xce\x94\x6e\x2a\x43\x31\x8d\xf7\xa7\x29\xf9\x8d\x7c\x39\x9f\x29\x28\xa5\x5c\x21\x97\xd9\xca\xa5\xd7\xf2\x5b\xca\xf5\xcd\x8d\xb2\xf2\xa5\xcc\x96\x72\xad\x94\xcb\x94\x73\x59\x65\x7b\x2b\xbf\xb1\xaa\xcc\x9a\xe4\x69\x93\xb4\x59\x52\x22\x61\x5d\xb9\x5e\xda\x5c\x57\x12\xf9\xd5\xb5\xfe\xe4\xe6\x6a\xfe\x5a\xf8\xda\xe6\x3a\x6c\xc2\x55\xb8\x29\xd4\x42\x0e\xbe\x00\x1b\xf0\x0b\xd8\x80\x4d\x28\xc1\x3a\x64\xa0\x00\x8b\x50\x86\x0c\x6c\x40\x16\x32\x50\x82\xac\xfd\x0f\xec\xdf\xb3\xbf\x61\x7f\xd3\xfe\x86\xfd\x2f\xec\x7f\x69\x7f\x0d\x66\xa1\x00\x79\x58\x87\x7e\x8e\x32\xb0\x0e\xdf\x05\x05\x42\x90\x86\x4d\x58\x07\x05\x92\x90\x83\x2c\xe4\x61\x03\x14\xe8\x07\x05\xd6\xa0\x0c\x65\x28\xc2\x71\x18\x80\x01\x28\xf3\x56\x85\xc3\x36\x61\xb8\xc6\x29\x3d\x10\x06\x05\x86\x40\x07\x1d\x46\x38\x9e\x82\x02\x14\x40\x81\x05\xc8\xc3\x2a\xef\x65\x8b\x7f\xcb\xc1\x16\xe4\xa0\x04\x37\x78\x1f\xe6\xf7\x55\xd8\xe6\x23\x29\x7d\xc6\xd8\x8e\xc3\x45\xde\x7a\x0b\xf2\xb0\xc9\xc7\x34\x08\x61\x7e\x95\xcf\xa3\x2b\x30\x0b\x39\xb8\x0a\x25\xd8\xe6\x7d\xde\xe4\xe3\x8a\x81\x76\x64\x7c\x26\x36\x47\x9f\x87\x32\xe4\xf9\x5d\x53\xa0\x04\x39\xfe\xbb\x32\x7c\x7c\x69\x58\x83\x3c\x1f\xf1\x75\xde\x7f\x19\x14\xf8\x12\x3f\xa7\xc0\x35\xde\x36\x03\x65\xfe\x0b\x14\xd8\xe6\xa3\xd8\x80\x55\x7e\xed\x83\xd6\xd3\x87\xad\xcc\x67\xa3\x40\x84\x8f\xcf\xec\xaf\x54\xbd\xd3\x89\xea\x9d\xe9\x87\x24\x6c\xc2\x2a\xe4\xe1\xda\xe1\xfd\x9c\x3f\x7c\xa2\x19\x7e\x4f\xe6\x8f\x3c\xe1\xdc\x27\x9e\x31\x7f\xca\x9f\x38\xbf\x01\x37\xb1\x1d\x07\xf1\x2c\x9e\xc6\x13\x78\x16\x47\x0e\xcf\xbe\xcf\xcf\xe6\x60\x1e\x32\x70\x03\x32\x90\xe5\x33\x67\x0a\x4a\xfc\x6e\x6d\xf0\x5e\x4d\xfe\xc6\x3f\x1f\x07\xe1\x9b\xf0\x59\x9f\x35\x00\xc1\x26\xd8\xc1\x0e\x08\x0e\x70\x82\x0b\x08\x98\xdc\xa3\x06\x28\xd4\x42\x1d\xd4\x83\x08\x0d\xd0\x08\x4d\xc0\xc0\x0b\xcd\xe0\x03\x09\x5a\xa0\x15\x8e\x81\x0c\x6d\xd0\x0e\x1d\xa0\x40\x27\x74\x81\x1f\x54\xe8\x86\x00\x04\x21\x04\x3d\xd0\x0b\x7d\xa0\x41\x3f\x84\x61\x00\x74\x18\x84\x21\x18\x06\x03\x22\x10\x85\x18\xc4\x61\x04\x8e\xc3\x28\x8c\xc1\x09\x18\x87\x09\x98\x84\x29\x38\x09\xd3\x30\x03\xa7\x60\x16\x4e\x43\x02\xe6\xe0\x0c\x9c\x85\x24\x9c\x83\x79\x38\x0f\x29\xb8\x00\x0b\xb0\x08\x69\x78\x04\x2e\xc2\x25\x58\x82\xcb\xf0\x28\x3c\x06\xcb\xf0\x38\x3c\x01\x2b\x90\x81\xaf\xc3\x03\xf8\x33\xf8\x73\xf8\x01\xbc\x07\x3f\x73\x84\x37\xb6\x0b\x05\x71\x63\x73\x63\x3d\x53\x7a\x32\xbf\xb1\x5a\xca\x95\xb7\x4b\x1b\xd6\xaf\x15\x3e\xfe\x18\x6c\xff\x1d\x00\x00\xff\xff\x44\xf6\x24\x5f\x20\x25\x02\x00") + +func fontsFlimFlamTtfBytes() ([]byte, error) { + return bindataRead( + _fontsFlimFlamTtf, + "fonts/Flim-Flam.ttf", + ) +} + +func fontsFlimFlamTtf() (*asset, error) { + bytes, err := fontsFlimFlamTtfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/Flim-Flam.ttf", size: 140576, mode: os.FileMode(438), modTime: time.Unix(1575019249, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xab, 0x69, 0x66, 0x54, 0x99, 0x5a, 0x95, 0x5d, 0x8c, 0x1e, 0xa3, 0x7b, 0xc2, 0x10, 0x6, 0xdd, 0xc9, 0x69, 0xdc, 0xe0, 0x89, 0x88, 0x13, 0x36, 0xa9, 0xde, 0xa0, 0xce, 0xc3, 0xd7, 0xac, 0x8e}} + return a, nil +} + +var _fontsRitasmithTtf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x7d\x09\x7c\x1b\xe5\x99\xf7\xff\x9d\x91\x46\x1a\x69\x74\x8c\xa4\xd1\x69\xc9\xb2\x64\x4b\x3e\x65\x5b\xb2\x2d\xc7\x67\x9c\xf8\x4a\x1c\xe7\x70\x9c\xc4\xb9\x20\x26\x71\x42\x20\x24\x21\x31\x09\x49\x29\x47\xa0\x65\xa1\x85\x5e\x50\x60\x3f\xda\x52\x02\x2c\x50\x0a\x85\x85\x92\xe5\x2c\x50\x60\x29\x50\x60\x81\x02\xa5\x1c\xe1\x68\xa0\x21\xcd\x42\xca\xb6\x65\xc1\xef\xf7\x9b\xc3\xb2\x64\xcb\x49\xcc\x12\x64\xbd\x73\x68\xde\xe7\x79\xde\xe7\x9e\xff\x48\x20\x00\x6c\xb8\x10\x2c\xb6\x77\x77\x0f\xf6\x9f\x3e\x70\xf4\x46\x60\xcf\x27\x00\x0a\x7a\x3a\xbb\xba\x51\x86\x47\x80\xed\xcf\x01\x08\xf5\x2c\x5e\xb4\xf4\xb7\x3f\x79\x6d\x10\x38\xbb\x00\x30\xbe\xd8\xb3\x74\xd9\x9c\x03\xf4\xc0\x18\xb0\x5d\x3e\xbf\x66\xd1\xd2\xea\xe4\xd0\x92\x7d\xdb\x00\x72\x2e\x80\x75\xeb\xcf\x1a\xde\xfe\xd4\xe5\xdb\xff\x1b\xd0\x1d\x00\xc8\x7f\x6d\x1a\xde\xb9\x9d\x52\xb0\xc0\xf6\xdf\x02\x30\x6e\xda\xb2\x67\x63\xf0\xf5\x1f\x5d\x0c\x18\x01\x9c\x66\x3c\x7d\x64\x78\x03\x37\xb7\x59\x3e\xf6\x25\x80\x86\xd3\x4f\x1f\x19\xe6\xfc\x2c\x0f\x90\x3a\x00\xc5\xa7\x9f\x35\x7a\x6e\xdd\x0a\x9b\x15\x20\xaf\x03\xcc\xbb\x5b\xb6\xad\x1f\x6e\xbd\xb3\xa4\x0d\xe0\xbe\x0b\x90\x1d\x67\x0d\x9f\xbb\x1d\x14\xab\x01\x32\x04\x20\xbc\x75\xf8\xac\x91\x77\xfe\xe7\xd0\x0d\xc0\x19\x46\x40\x5f\xb2\x7d\xdb\xce\xd1\xe2\xdd\xc5\x2f\x02\xdb\x6a\x00\xf2\x43\x85\x77\x02\xbc\xf2\xf4\x9c\x5d\xa7\xda\x5a\x3e\x87\x99\xfd\x08\x00\xfe\x6b\xee\x79\x0b\xc7\xdf\xe9\xb5\xb4\x97\xd5\x33\xff\x2b\xd3\x0b\x06\xea\x7f\x04\x60\xc3\xb4\x11\xab\x58\x1f\xbd\x96\x52\x56\xaf\x5c\x29\xfb\xbf\x03\xca\x9e\x03\x18\x82\x5e\xd9\x66\x94\x4f\xc9\xfb\x66\x6b\x67\x30\xe4\x5f\xc8\xdf\xe4\xa3\xcc\xe5\x8c\x4c\x6d\x1f\x73\x39\xf3\x20\x40\xde\x41\x2d\x61\xe4\x0f\x70\x6c\xe6\x6a\x6c\xf6\xa5\x17\x6f\xec\xda\x80\xd9\x08\x87\xef\xd0\x68\x38\x13\x07\x54\x9a\x00\xb2\x9f\xe9\x90\x39\x07\x43\x5e\x45\x44\xd9\xd3\x0f\x90\x4a\x00\x0f\xc2\x41\x08\x42\x8c\x05\x36\xf2\xff\x60\x26\x7f\x85\x83\x59\x0d\x37\xfe\x1d\x4e\xc2\xc0\x4c\x18\xb8\xf0\x5b\x38\xc9\xe5\xe0\xf0\x24\x5c\x64\x23\xc2\x78\x08\x1e\xa6\x10\x0c\xf9\x33\xbc\x44\x80\x8d\x3c\x04\x37\xf9\x7f\x70\x91\x9f\x43\x4f\x1e\x40\x90\x3c\x08\x0f\xb9\x04\x4e\xf2\x5b\xb8\xc9\x83\xf0\xe1\x37\xf0\xe1\xb7\x70\x90\x77\xc0\x90\xb7\x10\x21\xef\x22\x42\x56\x43\x64\x5e\x44\x33\x13\x81\x85\x7c\x81\x20\xf9\x1d\x24\x26\x8a\x20\xf9\x08\x05\xe4\x49\x14\x90\x2f\xe0\x61\x12\x08\x12\x16\x1e\xb2\x11\x66\xf2\x05\x0a\xc8\x6b\x28\x60\x6e\x40\x98\xf1\x21\xc0\xc4\xe1\x21\x47\x11\x64\x42\xb0\x33\x76\x04\xc9\x9d\x70\x93\x23\xb0\x33\x06\x48\x4c\x12\x66\xd6\x07\x07\xd3\x06\x1f\x23\xc1\x46\xfe\x0b\x01\xbc\x8f\x22\xd2\x04\x16\x1f\x40\x20\xff\x0b\x2b\x33\x0b\x11\x7c\x1f\x26\x72\x2f\x3c\xe4\x0d\x38\xc9\xb7\x21\x91\x7b\x61\x25\xdf\x87\x9b\xf4\xc1\x41\x8e\xc0\x41\x3e\x82\x1f\x5f\xc1\x89\x3f\xd2\x6b\xc9\x41\x65\xec\x60\x5e\x42\x84\x1c\x41\x80\xfc\x01\x1e\xf2\x47\xf8\xc8\x6f\x61\x25\xe7\xc1\x47\xce\x83\x9b\xf8\x61\x26\x47\xe0\x22\x07\x60\x63\x7e\x06\x17\x79\x0f\x45\xe4\x71\xf8\xc8\x4f\xe0\x27\x2c\x4c\xf8\x3e\x22\x84\x81\x9d\xf9\x27\xbc\x78\x08\x01\x32\x0c\x23\x79\x1b\x85\x8c\x1f\x22\xe9\x40\x88\x6c\x04\x8f\x7f\x81\x80\x03\xb0\x92\x8d\x08\x91\xd5\xb0\xca\xf2\xc9\xf7\x62\xad\xb0\x90\x87\x60\x57\xe4\x95\xfd\x92\xe5\x95\x79\xd1\x31\x26\x0a\x6e\x5c\x5e\x79\x5f\xb2\xbc\xb2\x5f\xb2\xbc\xde\x82\x87\xbc\xa6\xc8\xc3\x93\xef\xc5\x5c\x0e\x3f\xb9\x16\x01\x45\x56\x59\x2f\x45\x56\x99\x17\xfd\x42\x91\xd1\xb8\xac\x26\xbf\xae\x07\x47\x5e\x55\x8e\xbb\x72\x5e\xb2\xbc\xfe\x09\x87\xfc\xce\x5a\xe0\x67\xde\x82\x47\xa6\x09\x7f\x85\xc4\x44\xf0\x3a\x99\x83\x04\xee\x81\xa8\xe8\xe7\x12\x88\xf2\x0b\x2f\x83\xc7\x7f\xa1\x80\x31\x41\xd0\xac\x42\x7e\x15\x68\xd6\xf7\x1c\x58\x65\x54\x00\x1d\x7e\x05\xa0\x14\x61\xe8\x60\xc4\xf9\xd8\x8f\x9b\x71\x2b\x7e\x81\x7b\x71\x00\x0f\xe2\x0f\xa0\x64\x29\x39\x97\x79\x8a\xf9\x23\xf3\xa7\xb0\x2f\x1c\x0c\x37\x85\xef\xa0\x54\xb1\x9b\x9f\xe7\x9c\xf9\x28\x5e\x27\x03\x99\x33\xbd\xe1\x82\xf0\x2c\xf9\x4c\xfa\x3e\x7d\x8c\xfe\x86\x3e\x42\x1f\xa2\xf7\xd2\xbb\xe9\x5d\xf4\x0e\xfa\x0b\xba\x92\xd6\x7f\xf5\xd1\x57\xaf\x7e\xf5\xca\xbb\xd7\xbd\x7b\xcd\xbb\xe7\xbd\x6b\x9e\xe2\x13\x8e\xf3\x1f\xe1\x90\x39\x5d\xb6\xfe\x8c\xa7\x41\x96\xc7\xd1\xe9\x39\x83\x91\x37\x99\x05\x8b\xd5\x66\x17\x1d\x4e\x97\xe4\xf6\x78\x7d\xfe\x40\x41\x30\x54\x18\x2e\x8a\x44\x8b\x4b\x62\xf1\xd2\xb2\xf2\x8a\xca\xaa\x44\x75\x4d\x6d\x32\x55\x57\xdf\x90\x6e\x9c\xd5\xd4\xdc\xd2\xda\xd6\x3e\xbb\x63\xce\xdc\xce\xae\xee\x9e\xde\x79\xf3\xfb\x16\xf4\x2f\x5c\xb4\x78\xc9\xc0\xd2\xc1\x65\xcb\x57\x0c\xad\x5c\xb5\x7a\xcd\xda\x53\x4e\x5d\x37\x8c\xed\x67\xef\x3c\xe7\x9b\xfb\x2e\xfd\xee\x77\xae\xf8\xde\x95\xdf\xff\xe1\x55\x3f\xba\xfa\xc7\xd7\x5e\x73\xdd\xbf\x5e\xff\xd3\x9f\xfc\xec\xe7\x37\xdc\x7c\xd3\x2d\xff\x06\xac\xdf\x00\xe0\x72\x00\xa7\x6f\xc4\x8e\x8b\x65\xb2\x46\x32\x04\xfe\x60\xff\x99\xa7\x29\x83\x4d\x67\x00\x5b\xb6\x5d\xf4\x8b\x3b\x80\x7f\xbf\xf7\xee\x7b\x6e\xc4\xed\xbf\xc4\xfd\xf7\xfd\x5a\x3b\x6d\xeb\xae\xb3\x76\x8f\xee\xd9\xfb\x8d\x73\x2f\xb8\x10\xe7\x7f\xeb\xdb\x97\xe0\x4e\x79\xa5\xee\xda\x3c\x7e\x19\x97\xf6\xaf\x1b\x3b\xf0\x27\xd2\x46\xae\x65\x38\xa6\x98\x99\xcf\x6c\x67\x7e\xcd\xfc\x99\xe5\xd8\x02\x36\xc9\x0e\xb0\x17\xb2\xb7\xb3\x9f\xe8\x1a\x75\xbb\x74\x4f\xe9\x8d\xfa\x39\xfa\xf3\xf5\x8f\xe8\x3f\xe0\x1c\x5c\x31\xd7\xc8\x2d\xe0\x7e\xcc\x7d\x61\x58\x60\xf8\xa1\xe1\x71\xc3\x97\xc6\xc5\xc6\x9f\x1a\xdf\xe5\x9b\xf8\x33\xf8\x6b\xf9\xff\x31\x55\x9a\x2e\x37\xfd\xd1\x34\x66\x6e\x33\xef\x32\xff\xa7\xe0\x12\x06\x85\xab\x84\xb7\x2d\xb3\x2d\xb7\x5a\xfe\x66\x4d\x5a\x07\xad\xa7\x59\x2f\xb1\xfe\xd8\x7a\x93\xf5\x71\x1b\x6c\x0d\xb6\x33\x6c\xb7\xdb\xde\xb6\x97\xda\x2f\xb1\xbf\x22\xda\xc5\xc5\xe2\x9d\xe2\x9f\x1c\x0b\x1c\xd7\x3b\x7e\xeb\xb4\x3b\x07\x9d\x57\x39\x5f\x77\x09\xae\x01\xd7\xf7\x5d\x7f\x91\xe6\x4b\x57\x49\xbf\x77\x73\x6e\x97\x7b\x81\xfb\x3c\xf7\x9d\xee\xbf\x79\x56\x79\xfe\xd3\xf3\x89\xb7\xc1\x3b\xe8\x3d\xd7\xfb\xb8\xcf\xea\x3b\xd7\xf7\x9e\x7f\xd0\xff\x78\x20\x19\xf8\xd7\x02\x63\xc1\xf2\x82\xc7\x83\x89\xe0\x8d\x21\x57\x68\x4d\xe8\xa6\xd0\xdf\x0a\x67\x17\x5e\x5e\xf8\x65\xb8\x31\x3c\x1a\x3e\x10\xfe\x47\x51\x63\xd1\xbe\xa2\x3f\x45\xea\x22\x3f\x8e\xfc\x2d\x3a\x14\xbd\xa9\xd8\x58\x7c\x4a\xf1\xbd\x25\x8e\x92\x2d\x25\x4f\xc5\xfc\xb1\xbd\xb1\x47\xe2\xa6\xf8\xf2\xf8\xed\xf1\x2f\x4b\x67\x97\x5e\x52\xfa\x62\x99\xbf\xec\xf4\xb2\x57\xca\x5d\xe5\x83\xe5\xd7\x97\xbf\x5b\x11\xab\x18\xac\xb8\xbe\xe2\x8b\xca\xa1\xca\x47\xaa\x22\x55\x97\x54\xbd\x98\x68\x4c\xfc\x38\xf1\xe7\xea\x85\xd5\xbb\xaa\xaf\xaa\x3e\x50\xfd\x87\xea\xbf\xd5\x94\xd6\xac\xa9\xb9\xa4\xe6\x8e\x5a\x9d\xa2\x69\x11\x80\xdc\xc3\x48\x60\x61\x00\x52\x62\x91\x58\x52\x24\x16\x45\xc8\xf7\xc7\x6e\x24\x95\x63\xaf\x30\xd2\x57\x87\x93\xe4\x6e\x30\x70\xd0\x31\xfc\x8c\x19\x82\x0b\x61\x20\x1d\x8f\xd4\xd7\x35\xd4\xd7\xc5\xea\xeb\x1a\x52\x49\xb7\xe4\xb2\x12\x03\x67\x88\x64\x36\xb9\x75\x24\x44\x22\xdd\x76\xab\xc4\xda\x2d\x7c\x85\x14\x6a\x2c\x76\x05\x1b\x7e\x4e\xdc\x42\x44\x68\x7e\xd8\xe6\xe9\x75\xda\xfc\x17\x3d\xe7\x77\xed\xf7\x38\x8b\xca\x7d\xce\x70\x99\x1a\x25\x43\x64\x08\xef\x31\x83\xb0\xa2\x00\x70\xc6\xe5\xcb\x27\x25\x17\x27\x19\xb8\x68\x24\xad\x6c\xa6\x92\x41\x22\x6f\x25\x6c\x64\x0e\xb1\xb2\x36\xeb\x05\x56\x52\x14\xb6\xb1\x56\x1b\xd9\x7e\x13\x63\xd1\x55\x55\xe9\x2c\xcc\x4d\x5e\xaf\x3a\x76\xde\xe4\x55\xae\x6b\xc3\x6a\x32\xc6\xc4\xb1\x00\x8b\x81\x12\x03\x27\x5f\x21\x56\x5f\xd7\x4e\xa2\x06\x2b\x33\x3e\x8c\xd4\xd7\x35\x93\xb4\xf6\xd6\x90\x56\x19\xb1\x91\x54\xba\xae\x8d\x1b\x1f\x27\x25\x57\x05\x31\xc8\x6f\xd1\x78\xd4\x90\x22\x6b\x7d\x82\xc9\x68\xb1\x4b\x7a\x69\x8d\x4f\x6f\x70\x58\x44\xb7\x5e\x8a\x57\x94\xcf\x2e\x2a\xaf\x28\xeb\x94\x04\x81\x37\xdb\xdd\x7a\xfb\x1a\x49\xcf\xe8\x59\x03\x67\xd2\xdb\x24\x9d\x58\x52\x5e\xd6\x5e\x54\x5a\x59\x3e\xb4\x26\xb2\xf6\xe5\xf9\x45\x06\x4e\xb2\xe9\x6d\xb3\xe7\xd9\xec\x76\xb7\x5d\x6f\x6b\x8b\x44\xd7\x45\x23\x2d\x11\x83\xde\x6d\xe3\x6c\x35\xad\xc4\xca\x9a\x75\x06\x96\x91\x6c\x46\x21\xa9\x1c\xbb\x79\x9d\xe2\xf9\xcc\xf4\x0a\xf2\x5d\xe6\x72\x34\xa1\x1d\x5d\x00\x71\xc9\x52\x31\xc4\x63\x71\xc9\x13\x62\x24\x17\x67\x90\x5c\x5c\x24\xd6\x4a\x12\xa4\xbe\xae\x21\x19\x22\x9e\xfa\x78\x82\xa9\xaf\x6b\x48\xcb\x9b\xee\x20\x09\x11\x56\x6a\xa8\xaf\x8b\xd7\x5b\x89\xe4\x22\x5b\xbc\x76\xbd\x91\xe7\x0c\x3a\x23\xcb\x13\xab\x51\x57\x93\xac\x1b\x9a\x63\x75\x5b\xbb\xb7\x85\x4b\x4b\xaa\x02\xa1\xb2\xaa\xf2\xb5\x1d\x56\xb7\x35\xd9\xbb\xb7\x76\xbd\xab\x80\xfc\xaf\xe8\x21\x2c\xc3\xb1\x46\xc6\x44\xac\xfa\x9b\xd9\xb2\x9a\x65\xa5\xad\x83\xc2\x3c\x93\xcd\x66\xea\x62\x1a\xaa\x1d\x81\x68\xb9\xfe\x39\x7f\x71\x55\x77\x51\x63\x97\x21\x62\xb6\x5a\xcd\x11\x5d\xc5\xd8\x6d\xd7\x39\xaa\xe2\x5f\x5e\xcc\x16\xb8\xc2\x80\x1e\x0e\xfa\x67\xf2\x47\xe6\x4c\xd8\xe0\x43\x09\xaa\xd1\x0c\x10\x59\xd2\x06\xa2\x2e\x50\x9a\x34\x94\x44\x38\x97\x3b\x95\xac\xaf\x8b\xc5\x15\xc5\x52\xf6\x37\x90\xfc\x7b\xaf\xb6\x08\xba\xb1\xc7\x79\xc1\x22\xe8\x48\x1b\x3f\x46\xbd\xbe\x02\x5f\xdc\x2d\x55\xf4\x74\xd4\xd4\x76\x77\x11\x31\x77\x9b\x69\xb7\xf3\x46\xfd\x98\x4d\x90\xdf\xc8\xa7\x02\x93\x68\xa9\x5e\xee\x2f\x2b\x9f\x53\x95\xea\xeb\xac\x4d\x76\x8f\xb5\x4d\xda\xa1\xc8\xdd\x0d\x30\xfd\xcc\x20\x5a\xd0\x85\x45\x40\x49\x24\x16\xd7\xa6\x4f\x67\xd4\xdf\xe0\xf6\xc8\xa2\x95\xb7\x9b\x15\x86\xac\x9c\xac\x74\x86\x10\x93\x4a\x36\xc8\xda\xc3\x11\x4e\x92\x19\x48\xc7\xe2\xb2\x15\x45\x23\x9c\xe4\x22\x2f\x05\x6a\x23\x03\x83\x73\x37\x74\xb7\x27\x07\x1a\x13\x5d\x6b\xda\x67\x77\x78\x1c\x02\xbf\x8f\x17\x08\xa3\x63\x38\xc6\x40\x0a\xda\x1c\x01\x49\x0c\x59\xac\x31\xce\xbe\x64\xec\x99\xc6\xf6\x8a\xc2\x8a\x7e\x73\xd2\xef\x90\xbc\xac\x3f\xde\xb9\xa4\xbd\x69\x4d\x72\x59\xbc\x61\x7e\xaa\x7c\x61\xff\xaa\x79\x0b\xd2\x36\xa7\xdd\xc4\x0b\x02\xcf\xea\x74\x3a\x56\xc7\xe8\x88\x63\x34\x12\xf1\x3a\x5c\x3e\x6b\x61\x0b\x09\xd4\xa5\xca\x1a\x43\x1b\x1e\xae\x8e\x39\x0b\xa2\x1e\x39\xad\x86\x93\xac\xc1\xcf\x99\x41\x88\x80\x33\x4b\xae\xaa\x9d\x6f\x28\x28\x5a\x1a\xe3\x85\x46\x6f\x01\x33\x58\x5d\xd8\xbc\xcd\xca\x9b\x6b\x24\x57\x8b\x55\x0a\x29\x11\xca\x4c\x9f\xc2\x11\xe6\x37\xf0\x02\x4e\x97\x95\x95\x5c\xb2\x16\x46\x23\xb2\xce\xb5\x91\x54\xd2\x7d\xc4\x1b\x8d\x7a\xc3\xb1\xb0\xdf\xd9\xd6\x52\xd1\xb7\x3e\x62\x30\x33\x77\x32\xa5\x9d\xcb\x77\xb7\xce\xbf\xac\x7f\x96\xde\xd1\xb9\xf1\xb2\xd6\x81\x47\xf6\x9a\xe4\x6b\xb9\xe8\x53\xf8\x1f\xed\x5a\xb2\x48\x43\x44\x72\xc9\x86\x5a\x5f\xd7\xc6\xd4\xd7\x25\x58\x97\xc9\x18\x59\xdf\x57\xd1\xd2\xe6\xf4\x87\x63\x61\xf9\xc2\xcc\x9d\x46\xd3\xde\x47\x06\x5a\x2f\xdb\xd8\xe9\xd0\xcf\xea\xbf\x6c\x7e\xeb\xee\xe5\x9d\xa5\x2a\x4f\x49\xdc\x4d\x7e\x83\x5a\x8d\x27\xd9\x8a\xdd\x2e\xae\x82\x78\x54\x06\xab\xc9\x84\x37\x88\xc4\xe4\x05\x8b\xab\xeb\x58\x48\xd2\x0d\x17\x1a\xcd\x8c\xe0\x35\x0a\x82\xd1\x2b\x30\x66\xa3\xd9\x20\x08\x06\x73\x9e\x7d\xe4\x37\x82\xd1\xc0\x4a\x82\x5d\x90\x58\x83\x51\x30\x49\x92\x69\xca\x0e\x10\x70\xa8\x21\x97\x90\x3b\x11\x05\xd2\xb2\x6d\xca\xb3\x69\x3a\x12\x94\xc9\x0a\x12\x99\x30\x49\xfe\x23\x1f\x96\x38\x9e\xe7\xbe\xcb\x73\xe5\x1c\xff\xdd\x89\xe1\xb3\x93\x77\xa8\x43\x55\x6e\xd7\xe0\x2e\xec\x80\x13\xf0\x64\x39\xe3\xa8\xe6\xac\x7b\x64\x3f\x1c\x2a\xea\x2a\xf3\xb5\x59\x59\xd9\xf3\xd6\x45\x92\x4b\xcd\xc6\x84\x64\xe2\xd4\x2c\x23\x8c\x7f\x25\x5d\x78\x05\x66\xa0\x44\x13\x86\x2c\x2b\x52\x7a\x58\x10\x45\x41\xfe\xf3\xaf\xa2\x57\x14\xbd\x22\x08\x3c\xf4\x2b\xdc\x84\x1d\xf2\xb9\xd9\x73\xcd\xd7\x7c\x3d\x3b\xe1\xd9\x09\x18\xfa\x1e\x13\x64\x76\xc0\x36\xd5\xbe\x09\x15\x1c\x86\xb1\x22\xde\x2a\x38\x0c\xe4\x1d\x9e\xd9\x21\x5a\x8c\xe6\xaf\xee\x30\xcb\x6f\xcc\xa0\x59\x8d\x0b\x5e\x80\xfc\x9e\x59\x00\x1b\x02\x00\x22\x56\xc6\x15\x62\x92\x6d\x4c\x5d\x82\xc4\x93\x21\xe2\xb2\xaa\x2b\x47\xdc\xdd\x09\x97\xc1\xe0\x4a\xa8\x6f\x4b\xba\x36\xd6\xd4\x6c\xec\x1a\xd9\xb5\x8b\x31\x95\xf5\x75\x0e\x75\xf6\x95\xa9\x6f\x67\xae\xbc\xf8\xaa\x8b\x57\xde\xf3\xd1\x3d\x0a\xcf\x36\x00\x5f\x30\x8b\x94\x88\x53\x17\x8d\xa8\xc2\x4a\x25\x25\xd1\xa5\x28\x88\xbc\x12\xf5\x75\xe9\x86\xfa\xd3\xac\x5c\xdc\x64\x5d\x5d\x51\x1b\xf0\x09\xfc\x8d\xbc\xe0\x0b\x90\xa7\x23\x92\xdd\x33\xd8\x39\xd6\xe7\x14\x2d\x76\xd9\xce\xec\x16\xd1\x29\x5f\xd3\x0d\x90\x9b\x99\x25\x48\x64\x74\x8e\x93\x5c\xcd\x24\x39\x1e\x53\xb8\x68\x51\x44\x56\xb8\x8c\xed\x6b\x51\xa8\xe1\x93\xb6\xb5\xbd\xb7\x09\xfe\x6b\x9d\xf5\x36\xa3\x49\x1f\x16\x83\x63\x9f\x94\xba\x7e\x93\x2c\x09\x48\xc5\x8c\xd1\x69\x77\x06\xd6\x33\x4b\xfa\x9b\x96\x2c\xfa\xb5\xc5\x64\xab\xb5\xf0\xc4\x51\x5f\x14\x0b\x04\xbe\x9c\x5d\x57\x50\x1e\xb0\xd9\x5d\x3e\x21\xe8\x6a\xea\x51\xd7\xd2\x45\x3f\x27\xdf\x62\x06\xd1\x00\x38\x27\xd6\xc7\x20\x9b\x92\x66\xd6\xa9\xa4\xc7\x9d\x4a\x2a\x8e\x4a\x56\xf9\x36\x36\xad\xd2\x63\x25\x06\x2b\xb3\xd1\xe9\x1c\x6e\xad\xeb\x1b\x6c\xee\x38\x77\xf1\xdc\x8d\x05\x52\xa1\x60\x6f\x29\xad\x5b\x5d\xcd\xf3\x46\x87\x35\x64\xa8\x2b\x0e\x58\x5d\x9c\x5e\xcf\x39\xc8\x6f\xfc\xce\x9a\xf4\xfc\xfa\x25\x09\xe7\xa9\x1d\x7d\xeb\x67\xcf\x72\x15\xd4\xb6\xcd\x29\xdf\xee\x36\xf3\xbc\xd5\x28\xf0\x7a\x9e\x71\xb4\x86\x53\x76\x9b\xdd\x66\xb5\x81\x91\x6b\x5e\x72\x25\xb3\x08\xc5\xa8\x00\x4a\x54\x53\x94\x72\x65\xdd\x4a\x54\xed\x70\x2a\x34\x8b\xd1\x7a\x03\x27\xb9\x52\x64\xab\xd5\xe1\xb0\x56\xca\xe2\xbf\x5e\x16\xff\x7f\x58\xbd\xf6\xdf\xfb\x0b\x45\xe9\x94\xdd\x82\xeb\xef\x4e\xbf\x73\x38\x7b\x19\x86\xbd\x76\xa7\x97\x14\x15\x7b\x5d\x63\xaf\xbc\x74\x87\x9b\xb1\xc8\x32\x09\xd2\xaf\xc8\xf5\xcc\x00\x9a\x34\x3d\x94\x05\x11\x8d\xd8\x88\x2b\x95\xcc\x98\x8a\x2a\x99\x10\xf1\x28\xce\x5a\x5d\xa0\xa8\xba\x5a\xa9\xa4\x2c\x2f\xb2\x9b\x33\x0d\x94\x59\xcb\x2d\x5e\x9d\xcd\xa3\xaf\xb3\xf7\xac\xfc\xc6\xd0\x9c\x33\x42\x92\x45\xd2\xf3\x06\x4b\xc8\x5d\x5b\x57\x55\xe2\x9f\x6f\x0f\x33\x15\xc6\xb4\xb3\xc5\x15\xaa\x67\x06\xcc\x9c\xa7\x41\x67\xeb\x71\x59\x76\x2f\x5c\x79\x61\x6f\x83\x14\x74\x5a\x24\xd1\xed\x58\xd5\x52\xbb\x28\x19\xb6\x71\xcf\x46\xf5\xa2\xa2\xe7\x1e\xfa\x77\x72\x23\xd3\x87\xb0\x2c\x1b\x35\xa2\xb3\x71\x75\x45\x32\xf4\x29\xf1\x3c\x95\x74\x13\x77\x86\x3c\x72\x75\x81\xd3\x64\x17\x38\x13\xe3\x8c\x47\xea\x02\xec\xec\xb6\x9e\xb5\xa3\x4b\xe6\xac\x8d\x5f\x78\x76\xdd\xca\xb1\xc3\xe6\x35\x65\xa5\x55\xe5\xc1\x72\xf2\xb9\x2b\xa8\x17\x8c\x2e\xb6\xa8\x7d\x28\x59\x31\xba\x60\xf1\xf6\x35\xfb\xe6\xef\xbd\xa7\x76\xec\x93\x97\x16\xd6\x25\xfb\x3d\xaa\xde\xc8\x0a\xbc\x87\xe9\x40\x1c\x48\xd7\xb5\x91\x74\x1b\x23\xab\x45\x05\xb1\x2a\x19\x52\x7a\x3c\xa0\x11\x83\x95\x18\xd4\x25\x5b\xcf\x8a\x16\xa1\x34\x12\xb3\xf9\xb6\xba\xdb\xcd\x52\xb9\xd3\xff\x5f\xbe\xe2\x50\x67\xc8\x6d\x27\x02\xdf\xc5\x0b\x92\xa5\x7e\x53\x49\xd1\x82\x74\xb3\x64\x73\x90\x56\x9f\xbf\xc9\xef\x96\x9c\x75\xdb\x67\x57\x7f\x63\x1d\x2f\x08\x4a\x4c\xa5\x47\xc9\x9d\x4c\x0f\x8c\x08\xca\xf3\x3a\xe5\xe8\x9e\x6c\xd0\x82\xbb\xaa\xb2\x13\x11\xd6\x21\x1b\x8c\x5b\xe6\xfd\xbd\x40\x71\xb4\xb1\xb8\xb8\xa0\x63\x78\x69\x63\xd7\xde\x9b\xf6\x76\x37\x2e\x1d\x3e\x63\x30\x55\xbf\xb8\x9e\x11\xaa\x5a\x12\x89\x96\xaa\xe6\xbe\xe6\xc5\x31\x69\x55\x53\xff\xc6\x8d\xfd\x4d\xab\xa4\xd8\xe2\xe6\xbe\xb1\x17\xba\x13\xe5\xad\xad\xe5\x09\x30\xf0\xd1\xbf\x93\x9b\xc6\xe5\x9d\x56\xd6\x9d\x95\x6d\xa2\x8d\xa4\xb3\x34\x41\x55\x0b\xa2\x5a\xaa\x2c\xf5\x58\xae\xb8\x3b\x5a\xb3\xc4\x4d\xa4\x71\x71\xf7\xe7\x97\x36\x71\x8d\x4b\x9b\x81\x0f\xc0\x2d\xa4\x1c\x66\x78\x94\x88\x90\xf1\xa2\xd9\xa9\xf4\x02\xcd\xa3\x16\x6b\xef\xf7\x8d\x7b\xd6\xfb\xb2\x92\x67\x39\x3f\xbf\x06\xbf\x54\xae\x55\x38\xfd\xb5\xc6\x23\xc1\xf8\x35\x2b\xb2\x22\x42\xe6\x72\x07\x26\x85\x06\x02\x06\x35\xe4\x61\xc6\x0a\x0e\x28\x91\x4a\xea\x4b\x24\x3d\x79\x78\xac\x8b\x3c\x38\xf6\xbd\xbd\xf3\x7f\xd7\xfb\x5c\xdf\x2d\x4a\x1d\xf1\x1f\xe4\x71\xf2\x2d\xb5\x8e\x70\x16\x49\xca\xbf\x08\xb9\x61\x6c\x9d\xf2\xfa\xd6\x82\xba\x05\x8a\x7e\x45\x50\x43\xde\x56\xaf\x95\xae\x22\xf5\x7a\x49\x1f\x21\x3b\xc6\xae\x24\x0f\x8d\x75\xee\xdd\x7f\x4b\xdf\x73\xbd\xbf\x53\x7d\xbe\x48\xbf\x22\xfd\xcc\x4a\x98\x51\x97\x1b\x61\xe2\x56\xc5\x4d\xc4\xd4\x64\x40\x5e\x95\x4c\x42\xaf\xf9\x38\x2b\x6b\xe0\xbe\xa3\x71\xc8\x11\x9b\xdb\x6e\x8c\x57\xc7\xe3\x01\xbf\xc4\xf1\x02\x6f\x73\x07\x87\x9b\x3a\xd6\x75\xf2\x11\x87\x9d\xb1\x65\xc2\xd4\xa3\x66\xbb\xdd\xcc\x9e\x1a\x14\x8a\x0a\x1b\x0a\x03\x71\x9f\xa7\xc4\x68\x08\x49\x55\xed\x4b\x5a\x3b\x6a\x0d\x92\x59\x34\x76\x80\x41\x33\xec\xcc\xcf\x98\x51\xcc\x46\x9f\xec\xbb\xda\x94\x82\x40\x29\x47\x98\x2c\x11\xc7\xb5\x78\x94\x4a\x7a\xd4\x80\xa2\xd5\x2d\xae\x71\x83\xb5\x32\x92\xcb\x9d\xae\x97\x49\x57\xf4\x89\x7c\x2b\x35\x58\xa5\x73\x88\xab\x4e\x19\xb8\xa4\xbf\xf4\xa1\x6f\x7d\xe3\xd6\xa1\x05\xad\x56\xa1\xde\x5b\xdb\x33\x2f\xe5\x2b\x69\x31\xc7\xcc\x26\x71\xd3\xbe\x50\x49\xc3\xbe\x33\x2a\x56\xf4\x55\xff\xe4\x3c\x52\xe2\x8f\x16\x79\xed\xfe\x4e\xb7\xc7\x6d\x37\xd5\x36\xae\x5a\x5f\xf3\x9d\x7b\xaf\xd9\xb6\xf4\xfc\x0a\x67\x61\xef\x86\x4e\x53\x2b\x63\xe2\x8b\xb6\x5e\x2f\x6d\x6e\x5c\xb2\x2f\xd2\xbe\xb9\x63\xc3\x15\xf7\x77\x38\xa2\xc9\x62\xbf\x2a\x5b\x0b\xc0\xb8\x98\xb9\xd0\xa3\x11\x20\xb1\x88\x8d\xa4\x88\x9c\x5c\x19\xd2\x0d\x69\xa7\x92\xad\x79\x9c\x6e\x4f\x88\x95\xab\x1d\x55\x63\x12\x24\x1e\x95\xbd\xb0\x5b\x72\x45\x89\xc8\x98\x98\xe4\x99\x63\x1f\x79\x08\xcb\xea\x75\x06\xd6\xc8\xb8\xac\x17\x18\x62\x3e\x6f\xb1\xf1\x22\xc1\xc2\x5a\x0d\x9c\xf7\x7a\x5f\x09\x2f\xea\xae\x8c\x32\x05\x7e\xf2\x6b\xbd\xfe\xea\xb1\x77\xdc\x8c\x4e\xaf\xd3\xb3\x1c\xcb\x11\x5b\x05\xb9\xcc\x53\x59\xe4\x1e\x5b\x17\x13\x58\x81\x13\x38\xa7\x24\x04\x24\x5f\x45\x83\xf3\x7c\xa3\x51\x8c\x18\xdc\xb2\x4f\x08\x02\xe4\x03\xa6\x03\x3c\x5c\xa8\x01\xd2\x9a\xf4\xe2\xd1\xfa\x8c\xdf\x93\x58\x2d\x36\x8b\xd9\xb9\xb6\x16\xe2\x9e\x68\xad\x6a\xeb\x6d\x8a\xf9\x4a\xeb\x13\x85\xd6\xc0\x0f\xe4\x88\x21\x87\x8e\x3f\x74\x0c\xf7\x54\x0f\xec\xed\x3b\x3b\xdd\x59\x5d\xdf\x49\xba\xaa\x8b\x83\xa5\x4e\x7e\xcc\xab\x46\x0d\x72\xb5\x1a\x43\xba\x67\x75\x54\x5b\x57\x37\xce\xdf\xa4\xfa\x44\x89\x7e\x4a\xee\x66\x96\xca\x95\xaf\xe2\x95\x55\x9f\x2c\xb9\x42\x64\x4a\xe0\x70\x93\xbb\x0b\xa5\x2a\x41\x28\x2f\x6d\x0d\x16\xcc\x4b\x7b\x5a\x74\x16\x69\xb8\xfe\xac\xcb\xae\x1a\x6d\x5a\x45\x3e\x70\x05\xea\x52\x4b\x47\x9b\x9b\xd6\x75\x8b\x16\x73\x41\xec\xf6\xbd\x17\x3c\xda\x02\x46\xe6\x95\x31\x33\x1d\x30\x23\x26\xeb\xd5\x38\x7b\xa2\xcb\x99\x94\xb3\x68\x2b\x93\xc9\x42\x34\x4e\x53\x04\x3d\x7d\x43\x0b\xad\x81\xae\x8a\x15\x8b\x92\x89\xde\x25\x25\x47\xc6\x19\x6c\xfa\xfe\x9a\xe1\x6f\x3a\xf9\xb1\xcb\xd2\x8c\x21\x3c\x7b\x47\x6f\xe7\x68\x4f\x69\x2e\x73\x2a\x4f\x05\x00\x79\x9e\xe9\x40\x1b\x50\x32\xc1\x45\xd1\xa4\x79\x8a\xe4\xdd\x72\xd0\x89\xc7\x2a\x48\x84\x93\xb3\x54\xa5\x32\x0e\x6a\x72\x90\x63\x37\xe8\xdc\xc0\x80\x81\xb7\x36\x8a\x63\xbf\x1c\xa7\x82\xcc\x0a\xc7\xbd\x46\xc1\xc5\x06\xca\xdb\x6c\xfe\x75\xd9\x91\x79\x5d\x5b\xab\x99\xf7\x2e\xca\xa5\xa9\x39\x56\x69\x0a\xe9\x8a\x1d\xd6\x2b\xe5\x4f\x7f\x53\xbe\xcc\x2d\xa9\x0c\x9d\x0f\x30\x1d\x98\x05\xa4\xa2\x5f\x83\x3a\x25\xb3\x38\xf8\xab\x0c\x61\x73\x32\x84\xf5\x4c\x26\x2c\xe0\x13\x4e\x48\xd5\x63\xd9\x32\xf4\xd0\xcf\xc8\x87\xcc\x72\x59\x3f\x4b\xb2\x75\x40\x0d\xd4\x7a\x25\x60\xc8\x3a\x92\xce\x29\x06\x0d\x1c\x79\xe0\x94\xc6\x3d\x57\xfd\xf0\xec\xc6\x53\x0b\xdd\x56\xa7\x4d\x67\xe5\x3d\xf6\xfa\xae\x40\x77\xaa\x94\x29\xf4\x0a\xfc\x4d\xbc\xe0\x13\x7f\xbd\x37\x1a\xdf\xff\xbd\xbd\x07\x66\x95\x7b\x22\x06\x37\x1f\xb6\xdb\x6f\x5c\xd5\x3c\xd2\x57\xbe\xd4\x2e\x98\x45\x99\x64\x51\x30\x28\x39\x0d\xc0\x88\x4c\x07\xe6\x6a\xb9\xa6\x41\x16\xc3\xa4\xf9\x26\x27\xb3\xad\x24\x3a\x29\xe5\xca\x88\xf4\x4f\x32\x93\xf7\x06\x7c\x56\xfe\xd6\x71\x91\xdd\xae\xed\xd2\x46\xf2\x31\xa6\x43\x15\xd4\x15\x57\x64\x0b\x70\xec\xcc\xec\xad\x67\x9e\xc9\xde\xca\x52\x3e\x22\x47\x3b\x1c\x66\x3a\xe4\x48\xe5\xcc\x4f\x61\x86\x9e\x3f\xe4\x50\x91\x3d\x77\xee\x6c\x39\xd7\x37\xd3\xbf\x92\x41\xa6\x03\x21\x20\x2d\x4e\x11\xc5\xc4\x3a\xa5\x92\x13\x9c\x2e\xee\xaa\x58\x26\x9a\x99\xb4\xd8\x71\x3d\x59\x94\xc3\xd5\x3d\xcb\x57\x56\x79\x4c\x76\xf7\x84\xdd\xbc\x33\x49\xde\xe9\xcc\xe5\x6d\x44\xc9\x1c\x3d\x6e\x8d\x9b\x98\x5c\xae\xc6\xa7\x13\xf6\x9b\xf2\xc4\x97\x16\xfb\x3a\x79\x21\x58\x66\xbf\x6a\x4e\x97\xdf\x68\x34\xe8\x88\xdf\x27\xf0\x5b\x7d\x8c\xd5\x9f\x8e\xe5\xe5\xbc\xff\xa2\x88\xc0\xbb\x4c\x36\xcb\xf9\xae\xc6\xa4\x2d\x39\xcf\xed\xb2\xcb\xe4\xb2\x11\x47\x7c\x69\xdb\x2c\xee\xf5\x69\xe5\x22\xd3\xfe\x02\xd3\x81\x12\xc0\x29\xca\x05\x89\xe2\xeb\xf3\xd8\xfd\x38\x3b\x0f\xb7\xce\x75\xd5\x97\x1b\x79\xeb\x2c\xff\xd8\x7d\xe3\x2b\xf1\x0b\xa5\xf8\x39\x3c\x76\x75\x4b\x3c\x6e\xe6\x3d\x9b\x72\x27\x52\xb6\x94\x5a\x12\xcc\x85\x9a\x9c\x26\x2e\x5a\x28\x27\x94\xd3\xa9\x65\xbd\xa8\x06\xf2\x78\x2c\x3e\xf9\xc8\xa0\x3c\xf1\x5a\xcf\x6c\xe7\x8a\x45\x46\x77\x89\x6d\x77\x8e\x56\xac\xf6\x19\x83\xa2\x43\xdf\xdc\x27\xef\xb9\x58\xa5\x4e\x25\x66\x7e\xe9\xfd\x8f\x3b\xcb\x2a\xf2\x2a\xcc\x59\x0f\xde\x1b\xb1\x49\x9f\x9c\x36\x76\x4f\x6e\xf9\x06\x82\x00\xfd\x82\x01\xd3\x81\xb4\xb2\xc6\xf2\x7a\xe6\xd5\xa2\x38\x33\x85\xce\xf1\x95\xbd\xa2\xc0\x6f\x2f\x69\xec\x13\x32\x14\x39\x9c\x31\xe9\xc2\xa1\xcc\xa6\x3c\x60\x3a\x44\x77\x6a\xed\x77\x25\xc2\xe4\xa8\x5b\xbf\xaf\xa4\x8c\xf8\xf7\x8d\x5d\x33\xcd\x32\x2a\x75\xc2\x67\x8c\x8d\x19\x84\x59\xce\xd6\x11\xb1\x12\x57\x48\x5e\xcb\xba\x84\x52\xae\x47\x62\x75\xa4\x7b\x63\xbb\xcb\xd5\x2e\xff\x39\xf8\xf6\x15\x57\xbc\x7d\x05\xe3\x5a\xb4\xe1\xbc\x0d\x8b\xe4\x3f\xdf\x3b\xf0\xd9\x81\x03\x9f\x29\xd7\x91\x63\xec\xfb\x4c\x07\xc2\xa8\x9c\xa8\x88\xa6\xd5\x56\xe7\x44\xc5\x21\x11\xe3\x69\x7b\xb6\x2f\x2a\x4f\xcb\x7c\x64\x7c\xeb\x0f\x8a\x63\x95\x4d\x5d\x73\xac\x01\xa6\xe3\xac\xe5\xfd\x5b\x3c\xdf\xce\xc7\xc1\xd8\xe1\xa2\xae\x44\x73\x9f\x93\x07\x03\x3b\xdd\xcd\xb8\x99\x41\xb8\x11\x01\x1c\x6a\xb6\x1a\x1a\x6f\xcc\xc4\x63\x71\xb9\xd6\x29\x9e\x60\x2f\xf6\x93\xb7\xaf\x58\x32\xd7\xb6\xc2\x5e\x59\xe8\xea\x2d\x5c\xd4\xbf\x61\x0b\xa9\xce\xf0\xc9\x0c\x1e\xd8\xb3\xe2\x86\x22\xae\x9d\x73\x38\x45\x67\x78\x89\xd5\x79\xfb\xf6\x3d\xe7\x66\xb8\xce\xf0\xfb\x25\xd3\x81\x2a\xb9\x02\x74\x4e\xc3\x67\x33\x49\xca\x74\xb8\x3d\x72\x1e\xa1\x1e\x4c\x30\x71\x39\xba\x28\xe1\xbe\xbe\x2e\xf6\x90\xcc\xec\x6d\xe3\x5c\xbf\x70\x60\x56\xcd\x1a\x49\xdf\xe0\xd9\x6d\xb5\x0b\x85\xad\xac\x35\x60\xb3\xd9\xe3\xe9\x1a\xe2\x7c\x38\x1f\xff\x57\x55\x37\xfa\x2a\x0e\x58\x0a\x1c\xb6\xb0\xb3\xa2\xb3\xa3\xec\x4b\x27\x7f\x99\x85\xab\x8b\x55\xa4\x54\xff\xe2\xa6\x9f\x90\x6b\x98\x01\x59\xf7\x32\x3d\x5d\xb5\xf2\x50\xfb\xba\x99\xba\x44\x2d\x4f\x13\x24\x3e\x9e\x7c\x92\xdd\x1e\x71\xa2\x89\x1b\x2a\xf4\x46\x93\x75\x35\xc9\xba\x5d\x0b\x7b\x76\x85\x5d\x62\xc4\x57\x5d\x50\x98\xa8\x2a\xa9\x2e\xad\x2e\x3b\x7b\x5e\xe3\x10\xf9\xd2\xee\xcd\xb4\x70\x43\x41\x4f\x60\x56\x65\x59\xcd\xb2\xd2\x9e\x95\xe9\x1a\x47\xc0\x1f\xf6\xc7\x83\xbe\xd9\x91\xb2\x48\x75\x77\x51\x7b\x4f\x25\x08\xec\x94\x92\xb7\x14\xd9\xc1\x39\x1e\x77\x19\x99\x34\xc3\x14\x1b\x90\x77\x5a\x59\xa5\xd6\x58\x47\x12\xe1\x6a\x97\xc1\x6a\xb2\xeb\x03\xc1\x5a\x22\xcb\xeb\x16\xc5\x40\x6b\x83\x01\xbd\xdd\x64\x35\x48\x35\x4c\xc7\xdc\x80\x9f\x33\x5a\x75\x52\xe9\xd8\x05\x39\x12\xbb\xa8\x54\xd2\x59\x8d\x9c\x3f\x30\x57\xc9\xc1\x3e\x22\x9f\xaa\xf3\x97\xa8\x52\x98\x6a\x93\xb2\x82\x4e\x71\xf8\xe4\xe1\xe1\x91\xe5\x43\xb2\xff\xdc\x2f\xcf\xdc\x90\xac\x4d\x11\x79\xeb\x3c\x79\xeb\xae\x65\x3b\xf6\x2e\x21\x8d\x39\x06\xf8\x6c\xed\x92\xf9\x8d\xa4\x3e\xc7\x2b\xc8\x31\xe5\x2f\x4c\x09\xd3\x81\x14\x50\xd2\x90\xd6\xda\xbb\x9a\xae\xc8\xff\xac\x3a\x45\x65\xd9\x04\xc9\x4c\xce\xc9\x1a\x26\xd7\x93\x64\x6e\x63\x98\xf5\xdb\xfc\x17\xba\xcb\x38\xc9\xd0\x98\x64\xec\x46\x9b\x53\x88\xb8\x75\x96\x1f\x9b\xea\x94\xf8\x53\xc9\x25\x5b\xf5\xbc\xe9\xc7\x57\xff\xd4\x12\xb6\x8a\x66\xb3\x5b\xb2\xf8\x8d\x85\xa1\xf7\xbf\xc3\x55\xd9\x03\xa6\x4a\xbe\x90\x5c\x5b\x50\xa3\xf4\x72\x4d\x71\x63\xa1\x78\xe7\xf9\x66\x59\x57\x1c\xf4\x2f\xac\x9e\x99\x87\x4e\x80\x4c\xd0\x62\x65\x15\xe9\xc7\x59\xa5\xab\xa4\x99\x51\x16\x49\x21\xd6\xd3\x90\x56\xb3\x7c\x87\x47\x61\x25\xc6\x9c\xea\xdf\xe5\x8e\xe9\x9d\x06\xd6\x27\x04\x6c\x7a\x8b\xd1\x6d\x2f\x71\xaf\x70\xa4\xca\xbc\xee\xb0\xb8\xa2\x34\x43\x24\x17\x14\x0b\xc5\xf6\x10\x91\x9c\x36\x27\xd3\x96\xaa\xf4\xb3\x65\x4c\x85\x42\x6b\xa8\xd0\x7a\x69\xdb\xd6\x2a\xa1\xda\xed\x9c\x45\x8c\x95\xf7\x6d\xa8\x28\x3b\x74\x77\x36\xc9\xee\xd3\x9b\x97\x47\x9f\x7e\x40\x8a\xf8\x6d\x63\x47\x2f\xb8\xec\x57\x96\xb0\x45\x0e\x47\x72\x0d\xcc\x14\x33\x1d\x98\x2f\xf3\x90\xe9\x2e\xd8\x48\x26\x84\x2a\xfa\x5e\x57\x4d\x0c\x9c\x2b\x4b\xcd\xda\xd8\x76\x59\xf3\xb3\x96\x9a\x93\x5c\x85\x44\xe1\x86\xac\xb1\xf2\x97\xf1\x42\xb8\xca\xb4\xe1\x42\x47\x54\x8d\x12\xc5\xc6\xb5\x43\x7c\x44\xe0\xaf\xe0\x05\x1f\xe3\x34\x59\xd9\xcb\xcf\xd0\x8b\x3e\xc6\x67\xe5\x0f\xf0\x42\xdc\x52\x33\x57\x1f\x62\x2a\x65\x62\xad\x4e\xb7\xed\x86\x77\xc2\x92\xba\xf8\xe6\x42\x87\xe5\x27\xd7\x59\x5d\x61\xb3\xaa\x0a\xc4\x6c\x30\x73\x07\xef\xe5\x2d\x16\xa2\x9e\x20\x14\x08\x06\xef\xb2\xd3\x8c\x66\x63\x11\xc6\xfb\x89\x8c\x81\xe9\x40\x7d\x16\x3f\x9c\x6d\x6a\x8b\x8b\x8d\xe5\xd2\xee\x2e\x64\x54\xe2\x97\x59\xf9\x6f\xf3\x42\x1b\xbf\x4f\x36\x16\x39\x15\x0c\x5c\x2d\xd8\x7c\x56\xfe\x1a\x5e\x08\xea\x19\x66\x75\x9f\xa3\x48\xa5\xd4\x52\x6a\x3f\x7a\x63\xb6\x96\xfe\x04\xd4\xc5\x6b\x64\xf9\x0c\x9c\x5d\xaf\xbf\xe1\x3b\xc5\xbc\xb9\x50\x8d\x69\x00\xb9\x97\xe9\x40\x19\xe0\x8c\xd4\xcb\xeb\x5f\x94\x54\x3a\xb1\x92\xab\x99\xb4\x31\xca\x5d\x09\x4d\xd8\x69\x67\x83\x9c\x4f\x5b\xc9\x22\xc9\xc0\x16\xfb\x09\x9b\xe0\xc7\xc6\x2c\xe1\x9d\x81\xca\x90\xd9\x5d\x1f\xfb\x7b\xa8\xcc\x6c\x3b\xaa\x37\xf3\x1b\xa4\x92\x20\x79\xa8\x30\xe5\x29\x28\x64\x3c\x63\x9b\x1c\x46\x17\x09\x85\x44\xdf\xb2\xc2\x02\x77\xc0\x47\xb6\x18\x9c\xf1\x52\x55\x26\x45\xf4\x26\xbc\xc6\x5c\x08\x09\xf0\xb0\xe3\x5d\xe5\x0a\x22\x6a\x9d\xf8\x48\xac\x98\x15\x2d\xe7\x5a\x44\xd1\xd2\xd2\x26\xff\xdd\x6d\x11\xdb\x98\x1b\x2c\xa2\xe8\x17\xbf\xba\x5e\xf4\x8b\x72\x3e\xc1\x02\x24\xcd\xac\x95\xdf\x53\x6c\xca\x39\xf6\xbf\x4d\x5f\x30\x6b\xbf\xda\xaf\x5c\x5f\xa0\x37\xe1\x71\xed\xfa\xea\x05\xe5\x49\xc4\x4c\x0b\x5b\x7a\x54\xb9\xa6\x68\x69\x6b\x91\xff\x9e\x6b\x11\xdb\x94\x8b\x33\x1b\xe4\x8b\x5b\x94\x6b\x58\xf1\x31\x39\xc2\xdc\xa4\xf4\x25\xa2\xce\x94\x33\xca\x0e\xcd\xff\x5d\xef\xf3\x0b\x6e\xfe\x98\x3c\x38\xd6\x45\xb6\x28\xbd\x0b\x7a\x31\xe3\xa6\xf7\xc9\x34\x78\x94\xee\xc6\xdf\xc6\x84\xbe\xa4\xca\xa3\x89\xec\xc7\x3e\xa6\x44\xb9\x77\x12\xa9\x26\xda\xda\x16\x12\x25\x98\xad\x30\xea\x5b\x59\x9e\x0b\x1a\xf4\x6d\x0c\xcf\x91\xfd\x86\x0d\xac\x9e\xe3\x0d\x1b\x74\x3a\x8e\x57\xe2\xf9\x3f\xc9\x0d\x64\x3f\x0a\x95\x9e\x28\x97\xbf\x7b\x30\xae\x3f\xf1\xfa\x04\xc9\x74\x0e\x6c\x0d\x95\x6d\x43\x6b\x66\x17\xd4\xf6\xd9\x12\x56\x8b\x74\xd1\x7e\x59\x69\x46\xdc\x76\x12\x12\xc3\x95\x65\x21\x57\x51\x3c\xb1\xea\xbc\xe5\x96\x7e\xd6\x62\x2e\xbb\xfc\x09\x55\x59\x76\x2f\x31\x0b\x95\x6d\x55\x61\x35\x97\x70\xd2\xff\x26\xcf\x31\x83\xb0\xa0\x58\x89\x89\x4a\xfb\x4b\x8d\xf2\xac\x5c\x49\x65\xd5\xb7\x62\x9d\xe2\xd3\x1f\x2b\xf4\x15\x57\xd9\x13\x25\x05\xe5\x55\x4e\x7f\x5d\xbc\x6f\xe4\xe2\x53\x5b\x86\xa4\xc4\x4a\x22\x5d\x53\x50\xd5\xd8\x53\x51\xb3\xb0\x92\x44\x83\xce\x6b\xfc\xbb\x16\x9d\xf6\xfd\xbe\x46\xb2\xcd\xef\x10\xeb\xb5\x3a\xfa\x9f\x64\x17\xf9\x95\x72\xcf\x59\xed\x65\xc6\x13\x4c\xa6\xad\x36\xb9\x90\x5e\x5f\xec\x77\xb8\x39\x1d\xcb\xd9\x2d\xd1\xf8\xea\xf9\x42\x44\x30\x0a\xcb\x2a\xd7\x5c\x72\xce\xb2\xe4\x00\x59\xe9\x8b\x8a\x76\xd1\x62\x15\xda\xcb\x06\xce\xe3\x04\xa3\x3b\x7a\xf1\x9a\xa1\x0b\x6b\x54\x9e\xac\xf4\xef\xe4\xa7\x4a\x7e\x24\x47\x8b\xf1\x26\xbb\x3b\x95\xf4\x4c\xb4\xbe\xeb\xeb\x26\xba\xba\x59\x89\x28\x31\x05\x7d\x35\x89\xe2\x8a\x92\x40\x75\x4d\xc7\x8a\x75\x43\x45\x51\x29\xe1\x6c\xb1\xfa\x9c\x7e\x45\xb2\x8e\x1d\x37\x07\x92\x2b\x5b\x9a\x07\x8b\x4a\xd7\xcf\xdd\x7c\x83\x6b\xb9\xdf\x61\x37\x15\x1a\x82\xce\xb1\x64\x26\x41\x63\xe0\xa6\x9f\x91\x3d\xe4\x56\x78\x54\x4e\xad\xc4\x90\x87\x3f\xc3\xb8\x98\x25\x17\x39\xad\x73\x65\x43\xc9\x7a\x5b\xa5\xcd\x64\x5d\x9d\x58\xbf\x7b\xc7\xd2\x86\x25\x07\x6b\x97\x04\xa4\x92\x1a\xd2\x54\xd3\x5d\x64\x18\x71\x99\x78\x5f\xd5\xb7\x86\x97\x7d\xa3\xf5\x87\xfa\x44\xb9\xbb\xb0\xb9\xd4\x2b\xfb\x7f\x80\xb4\x6a\x3d\xfe\xac\xc2\x93\x19\xcf\x18\x82\xe3\xf7\xba\xa6\x84\x68\xcd\x34\x16\xcc\x4f\x56\xce\x0b\x48\x66\x9b\x99\xd5\x99\xfd\xa2\xe4\xad\x14\x44\x51\x50\x7a\xec\x37\xc8\x9e\x27\x28\x6f\x06\xc9\xe1\xea\xa6\xda\xa8\xa7\xc8\xe0\xe4\xad\xc5\x05\x0e\x5b\xc4\x18\x12\xbd\xe2\xd8\x3f\x72\x82\xb5\x51\xf4\x8a\x6a\x1f\x72\x29\x79\x85\xdc\x82\x46\x25\x2a\x69\xa9\x5c\x9e\x15\xae\xcf\x68\xb7\x76\xdf\xd4\x33\x71\x38\x1a\x31\x8c\x2b\x85\xec\x11\x77\xc7\x37\xf7\x35\xd6\x7a\x63\xde\xf0\xfa\xc2\xb2\xa6\x52\x9f\x81\xb7\x96\x46\xce\x88\xa4\x16\x76\x46\xce\xec\x6b\xa9\x2e\xae\x74\x16\xb8\xad\x46\xaf\xd1\x74\xab\x37\x52\x53\x1f\x28\x9c\x45\xd6\x25\xdb\xfb\xce\x8c\x78\x7d\x92\xcf\x9a\x2e\x2d\x4a\x9b\x0d\xfa\x80\xe0\x75\xa6\x13\x4d\x4b\x6a\x1b\xfb\xb6\x14\x17\xb9\xec\x56\x17\x6f\x28\xf2\x76\xaf\xaf\x0d\xd7\xad\x55\x74\xd3\x0f\x90\xb7\x98\x41\xed\xde\x40\x96\xbd\x69\xfe\x5a\x59\xaa\xc9\xbb\x15\x93\x88\x8d\xab\x51\x90\x34\x90\xca\xc6\x2e\x59\x7a\x4a\xaa\x51\xec\x0b\x54\x66\x36\xca\x78\x9b\x7b\x8e\xcb\xe2\x73\xb5\x93\xfd\xf3\x3a\x9e\xc8\x96\xdd\x03\xfe\x68\xad\xe7\xae\x1c\x69\x5e\x6b\xe7\x8d\x4e\x73\xa1\xd1\xe5\xbf\xab\x52\xb3\x53\x00\x47\x14\x9d\x2e\xcb\xbd\x3b\xeb\x99\x52\xdc\x67\xd3\x74\x89\x27\xda\xee\x0f\x14\xcd\x5a\x31\x95\x10\x66\x30\xe0\x2e\xa8\x28\x90\xfc\x55\x6f\x8d\xbd\x93\x3d\xfb\xc7\x76\xde\x28\xf1\x85\x46\x17\xc0\xd0\x6b\xe9\x12\x3c\xa2\xcc\x5b\x91\x3b\x2f\xab\xf1\xde\xd0\xce\x68\x36\x94\x5d\x58\x37\x8c\x4f\x6c\x2d\xe3\x6d\x66\x4e\xaf\xcc\xb8\x69\x69\x55\x93\x85\x17\x4a\x2d\x15\x4d\x13\x93\x7f\x75\x37\x69\xb2\xf3\x46\x83\x4d\xa7\x93\xf9\x1d\xbb\x75\xed\xd9\x1e\x91\x37\xeb\x07\x55\xbe\xe5\x75\x79\x5d\x59\x97\x2e\xa0\x24\x27\x29\xa8\xaf\x8b\xe7\xaf\x57\x72\xd7\x44\x6d\x0a\xc7\xb5\xda\xc5\x20\xb9\xc9\x0d\x82\xd3\x27\xf0\xd7\xf1\x82\x3f\x62\x37\x86\x3c\x53\x45\x53\xdd\x98\x9a\xd7\x72\x4e\xb8\x34\xec\x2b\x28\xf1\x2d\x12\x05\x55\x36\x5c\xa1\xd9\x5e\xc3\x58\x9a\xa6\x59\xa9\x9b\x23\x5d\xc9\x85\x49\x77\x2a\xea\x8f\x17\x8d\x88\x50\xed\x13\x9f\x30\x83\x72\xdd\xe1\x9c\x5a\x29\x66\x51\x79\x20\xcf\xea\xc4\xc6\x6a\xf2\x4f\x04\xad\x8f\x0e\xe6\x71\x72\x2b\x96\xc9\x79\x46\x3e\xdd\x9c\x46\x65\x5b\x49\x2c\x6b\xd9\x3c\xe3\x86\x37\x45\xb3\x99\xb2\x42\x6f\x41\x79\x86\xae\xb0\x37\x4b\x97\x49\xa9\xc9\x6a\xd6\x73\x1d\x82\x3b\x66\x6d\xac\x6a\xaa\x99\xd5\x59\xd9\x33\x71\x30\xe0\x8d\x97\x14\xe4\x28\xf8\x53\xfe\x68\xb9\x3b\x67\xcf\x61\xab\x89\x97\x57\xbc\x88\x8b\xc5\x1b\x52\xb3\x63\x1f\x4f\xad\xc1\x01\xf2\x36\xb9\x75\x66\xf6\x38\x99\x39\x52\x95\x65\x8e\x51\xff\x64\x16\x38\xbd\xca\x02\xb9\xb5\x7f\xce\x0c\x08\xd6\x6a\xf0\x2f\xc8\x23\xe4\x57\x10\xe0\xcd\xee\xd9\xba\x42\x24\xdb\x48\x08\xa9\x8c\xb7\x27\x2a\xd2\xce\xa6\xc2\x81\x6f\xec\x5e\xbe\x6e\xef\xbe\xa6\x15\xcd\x2d\x1b\x7b\xaa\x93\x8b\x5a\xc9\xae\x8b\x87\x56\xee\xbb\x70\xf5\xd0\xc5\xca\xbd\x20\x3a\x40\x9e\x23\xbf\x80\x45\xce\x1c\x4b\x32\x31\x38\x48\x5c\x6e\x76\xe2\xd6\xc2\x71\x75\x9d\x90\xe2\x2a\x7b\x79\x59\x61\x6d\x59\x59\x45\xcb\xbc\xb5\x5b\x96\x55\x14\x4d\xd6\x2b\x8f\xd4\xd8\xd8\x53\x91\x5c\x90\xf0\xdf\x24\xc5\x49\x6f\xc5\xde\x25\x6b\xbf\x1b\x38\x23\xaf\x9e\x89\xe3\xb1\x74\x80\xdc\x4e\xee\x84\xa0\x74\xe1\x93\xe3\x92\x97\xeb\xd1\x48\xae\xe3\x9e\xda\x65\xb4\x92\x17\x82\x25\x41\x5f\x6d\x6d\x99\x63\xe9\xd2\x1d\xab\x6a\xca\xa3\x7e\xb3\xdd\x9d\xa1\x49\x6c\x98\x5b\x55\x78\x6d\x61\xc9\xca\x96\xe6\xa1\xf9\x67\x2d\x39\xed\xea\xf2\x98\x60\xe2\xeb\xac\x63\xa7\x66\x13\x34\x6a\x71\x6b\x75\x02\xd9\x4a\xfe\x4d\xb9\xa7\x2e\xa7\xab\x99\x50\x91\x4f\xf1\xb3\x84\x22\x3d\xea\xf4\xd4\x78\x7d\xc5\x05\x92\x25\x66\xf6\xc5\xa7\x1a\x1a\x39\x55\x92\xfc\xc5\x7e\xa9\xd0\xd3\x5b\x74\x59\xce\x92\x67\x2c\x5b\xad\xcb\x8f\x91\x11\x72\x2f\x6a\x65\x29\x68\x37\xce\x13\x6c\x3c\xbb\xe3\x1b\x9b\xd0\x81\xec\x5a\x7d\x5e\x91\x89\x6f\xf3\x95\x08\x41\x77\xc2\x34\xb0\xa6\x29\xb9\xc4\x27\xda\xbc\x2e\xbb\x23\xe8\xf3\x07\x4a\x4a\x4a\xb7\xf6\x36\x0e\x17\x5c\x92\x2c\x2d\x70\x9b\x3d\x7e\x31\x6c\x6c\x6f\xaf\x6a\xac\x28\x71\x16\x88\x56\xd1\x63\xb7\xda\x8a\x5c\x4e\x7f\x61\x73\x61\x6b\x67\xaa\xc4\x17\x56\xea\xd0\xbf\x13\x0b\x53\x8c\xa8\x2c\x07\xa2\xb5\xbb\x53\xe3\xf7\xd1\x53\xc9\x06\x85\x18\x39\x5b\x53\x66\x0f\x06\x8b\xdd\xbc\xc3\x6c\x6d\x90\x23\x79\x43\xb1\xb1\xc0\x6e\xe9\x58\x5c\x17\x16\x44\xf2\x73\x4b\x75\xca\x65\x35\x9f\x2e\x7a\xc5\x7f\xa4\x18\x8b\xc1\x1f\xa8\xab\x20\x4e\x51\x70\x8d\xe3\x07\x8e\x91\xb7\xc9\x6d\x4a\xbd\x2b\x33\x92\x2b\x55\x59\x2d\x53\xc9\xc9\xa2\xce\x52\x00\xd2\x95\x9a\x53\xd7\x93\x11\x72\x69\xa1\xbf\x3c\xb3\x21\xaf\xc1\x06\x93\x23\x96\x5a\xd0\xf0\xfb\x8c\x8c\xdf\x8f\x56\x95\x79\x1e\xcc\x6c\x8e\xbd\xa9\x2e\x85\x4b\xab\xa9\xc8\xed\x64\x3f\xca\xb3\x6a\x2a\x83\x76\xdb\x4f\xce\x76\x26\x55\x52\x5a\xda\x60\x12\xf8\x5d\xbc\xe0\x93\xb8\x1a\x4f\x79\x75\x41\x6d\xa9\xdb\xc6\x59\x7d\x02\xff\x23\x5e\x28\x4b\x3b\xec\x0d\xa5\xe4\x4a\xa5\xde\xb3\x09\xde\x7b\x1a\x46\x5a\xce\x59\xde\xe9\x16\x5c\x16\x79\x97\xb1\xd4\x3c\xe7\xc6\x1b\x1a\xa5\x72\x55\x0e\xff\x64\xbe\x43\xf6\x2b\x7d\xcc\xac\xab\x4f\x9d\x2f\xab\xe7\x60\x60\x94\xbe\x8d\x95\x44\x23\x13\xfd\x80\x57\x4b\x93\x4e\x57\x65\x42\xe0\xaf\xe4\x85\xea\x0a\xaf\x98\x2a\x17\xf8\xdd\xbc\xe0\xf3\xe9\xbb\xd6\x1a\x6c\x16\xb3\xc0\x9b\x0d\x66\xd6\xd3\x59\xd0\xbb\x90\xa9\x14\xe4\x72\x8f\x5c\x69\x8c\xdb\x3a\x7f\x7e\x5d\xa7\xa3\xc2\x21\x93\x55\xe1\xe8\xb9\xe6\xa6\xb9\xb6\x88\x56\x8b\xda\x5d\x63\x77\x70\x16\x8b\x5b\x0c\xda\x0b\x0d\xb3\x86\xc9\x29\xc6\xa8\xc0\x0b\x82\x5c\x6f\x01\xe4\x31\xb2\x1f\xdd\x40\x89\x1c\x26\xe5\xe2\x59\xca\xae\x9e\x1b\xe4\xe2\x99\x4c\x2a\x9d\xeb\x26\x71\x61\x23\x4a\x0b\x4c\x5d\x4e\xe2\x36\xcc\x4a\x70\x05\x02\x3f\x2a\x8b\x94\x1f\x5a\xcc\xc4\x05\xfe\x72\x5e\x70\x19\x8b\xcb\xf4\x2e\x81\xdf\xc4\x0b\x3e\x8b\xab\x6f\x25\x37\x4b\xe0\x7f\xcc\x0b\x92\xc9\xc3\x13\xfb\xca\x45\x66\x83\x10\x34\xa9\xe4\x5a\xac\xd7\x7e\x93\x09\x09\x4a\x43\xc0\xa1\xb7\x0a\xb3\x9a\x89\xa0\xe3\xbd\x06\xf5\xa8\x31\xb8\xe5\x72\xbe\xc2\xa2\xd2\xef\xa3\xbd\xe4\x01\xb2\x1f\x75\x40\x2a\xc1\xc6\x13\x6c\xce\xf2\x7a\x72\xe8\x54\x91\x08\x56\x15\x32\xd2\xc6\x3c\x5f\xdf\x62\xb6\xd9\x59\x33\xa7\x17\xf8\x4b\x79\xa1\x28\x1d\x9e\x13\x15\xf8\xb3\x79\xc1\xe4\xe2\xf8\xa6\x48\xe3\xf6\x98\xe8\x8d\x24\xea\x97\x5e\xde\xdd\x64\x67\x4d\x1c\xaf\x57\xaa\xfc\x80\x50\x77\x43\xd9\xbe\x73\xad\x45\x9c\x12\xe7\xad\x92\x51\xf8\xa0\x73\xdb\x0e\x8f\x5d\x0a\x88\x55\xc8\xe4\x87\x17\x92\xfd\x5a\xfd\x3c\x3e\xbb\x8d\x58\x19\xc9\x9d\x81\xf6\x70\xca\xfd\x52\x05\xd8\x53\x41\x22\xdc\x1c\xb1\xde\xf5\xbc\x18\xb2\x1d\x60\x0c\x2c\x63\xdd\xe4\x4b\xea\x4d\x42\xbd\xf4\xe7\x06\xcb\x01\x4e\xac\xf7\xa7\x49\xbd\x23\xd0\xe1\xb2\x07\xc4\xbf\x30\x06\x4e\x67\xaf\xb0\x9b\x6d\x3d\xd5\x5e\xfb\x27\xbc\x51\xa8\x50\x6b\x4a\x7a\x13\x3e\x63\x2e\x54\xe6\x1c\xaf\x95\x39\xe5\xe6\x96\x6a\x81\xe3\x85\xb4\x62\x9d\xb1\xa8\x62\x8f\x0d\xfb\x16\xcb\x35\x6e\xc8\x22\xc6\x7c\xbe\x98\x68\x09\xcb\x5b\x8b\x7c\xd1\x98\xcf\x17\x8d\x32\x17\x2a\x05\xef\x53\xe1\x44\x22\xfc\x94\x52\x02\x47\x7d\x1f\xc8\x1b\x1f\xf8\xa2\x4a\x7d\x7b\x05\xce\x60\x4e\x53\xea\x5b\x31\x25\x46\x7a\x77\x32\xaf\x7e\x55\xa1\xf2\x6f\xa7\x37\xe1\x1f\x1a\x2d\x9a\xfd\xab\xb4\x8c\x97\xdb\xea\xec\x29\x95\x16\x75\x67\xea\x42\x5f\x34\xea\xf3\xc5\xa2\xbe\x45\x32\x15\xe1\x71\x9a\x42\xf2\x16\x73\xe1\xc4\xdc\x93\xa9\x02\x81\x17\xcf\x33\xef\x92\xeb\x65\x5d\x4e\xe7\xb6\x3c\x27\x0a\x1d\x36\x1a\x91\x5c\x5c\x9f\x14\x1a\x5d\x50\x7f\xf6\xe2\x35\x51\xa7\x3b\xec\x95\x82\xdb\xe7\xd6\x6e\x58\xd8\xd5\xee\xa9\x2e\xfa\x20\x28\xcd\xee\xae\x4e\x57\x27\x02\x9e\x60\x48\x6a\xed\x29\xac\xaa\x2a\xec\xf3\x14\x2a\x71\x2d\x40\x97\xe3\x56\xf2\x2b\x15\xcf\xec\xf4\x24\x55\xdd\x1a\x77\xda\xb2\x67\x4d\x67\xc5\xf1\x55\xf9\xf0\xcc\xc4\x72\x5c\x40\x33\x03\x23\x5d\x4d\x56\x32\xab\x50\x21\x47\x0d\x4f\x16\x1e\x77\x02\x84\xab\x32\xa2\xab\x8f\xc5\x45\xb7\xd6\x83\x89\x8b\x56\x22\xb9\xde\xb4\xb9\x6c\x3d\xab\x56\x77\xdb\x5c\xb6\xea\x05\x6e\xc9\xe2\x30\x19\x18\x56\xe7\x49\xb4\xb8\x7a\xca\x2d\x49\x7f\xe8\xbb\x26\x9b\xcd\x74\xc0\xb5\xbb\x6f\xc1\xb9\xf6\x33\xcd\x56\xab\x79\x13\x9b\x2a\x0a\x14\xeb\x39\x9b\x5e\x62\x0a\x0c\x63\xaf\x88\x0e\xc9\xbd\x85\x08\xe6\xce\xd8\x46\x79\xfd\x0a\xe9\x67\xe4\x11\x66\x03\x16\x2a\xf8\x1a\xc9\x15\x62\x3c\x9a\x4a\xa9\xf8\x54\x2d\x6d\xcf\x0e\xac\x9a\x24\xea\xeb\xe2\x5a\xb9\x98\x0b\x24\x49\x90\x2f\x8b\xca\x78\x93\x4b\xbf\x5a\x9e\xbe\x57\xaf\xd7\x59\x0d\x6e\x2e\xc0\x36\x46\x83\x73\xbc\x42\xd4\xcc\x9b\x3b\x8b\xbd\x73\xbd\xbe\x05\x3e\x47\xa0\xba\xc6\xad\x60\x83\x93\x81\x4d\x5d\x73\x37\x85\x3c\x95\x86\x28\x53\x5e\x11\x37\x07\x5d\xa5\xbc\xcd\x65\x73\x3b\x6d\x41\x77\xc8\x5a\x68\x8a\xea\x02\x71\xc1\xc6\x7b\x6b\x62\x5e\x87\xdd\x39\x6b\x7e\x59\x49\xca\xe6\xb2\xb5\x25\xda\x17\xce\x9f\xe5\x2b\x69\xb6\x07\x0b\x65\x5e\xe4\x42\x93\x67\x3a\xb0\x34\xb7\xc7\x36\x1e\x05\x53\xd3\xa3\xca\x14\xc4\x65\x06\xe7\x39\x4d\x07\x6e\x85\xd6\x81\xdb\xb8\x4a\xd6\xd3\x5d\xbb\x94\xbf\x99\x6e\xdc\x5e\x79\x73\xaf\xf2\x77\xe5\xe8\xb4\x9d\xb9\x07\x45\xbf\x58\x2b\xfa\xc5\xaa\xec\x8c\xa2\x4a\xdb\xf9\xd4\x74\x6d\x3a\x05\x03\xdf\x4e\x22\xe4\x2a\x98\x20\x29\x11\x47\x6b\x06\xb9\x3d\x13\xc3\x3d\x1e\x87\x2b\x14\x74\x3a\x7c\xb7\x8d\x0f\xc8\x16\x47\xc0\x5b\xec\x75\xdb\xd5\x37\xf9\x3a\x3c\x96\x93\x5e\xf2\x3d\xf8\xe4\x08\x9e\x8e\xc4\x55\x20\x6e\xba\x21\x9d\x52\x52\x13\x15\xca\x91\x9a\x66\xff\xf9\x82\xd1\xd2\x10\x0a\x35\x58\x8c\x1e\x0f\xc3\xeb\x97\xad\x72\xef\x98\xb2\x67\xb9\x41\xea\xad\xb6\x08\xe5\x73\x9c\x16\x42\x58\x56\x67\x3a\xcb\x2a\x9d\x6f\xb4\xe6\xdf\xab\xfa\x10\x81\xec\xc7\x37\xb5\x1e\xd9\x78\xde\x30\xee\x47\xb9\x5a\x37\xc7\x33\xad\x7a\x83\x87\xe3\xd9\x16\x3d\xd9\xcf\x73\x3a\xdd\x06\x03\xcf\xe9\xd9\x0d\x06\x10\x58\x69\x3f\x6e\x81\x5e\x41\x4a\x79\x0c\x13\xe9\x95\xaa\xb6\x72\x44\xe8\x4e\x18\x5d\x2e\x47\x43\xb1\x54\xe6\xe0\xbc\x46\xab\xa3\x42\xcf\x97\x1a\xcd\x6e\x5b\xa4\x4a\x12\x44\xde\x61\x15\x7c\x9c\x2c\x5f\x2c\x27\x6b\x33\x72\x89\x66\x9e\x63\x68\x23\xe9\x94\x7a\x8b\xc5\x4a\x0c\xdc\x38\xee\x65\xca\x81\x8f\x8a\xdc\xab\x96\xe9\x79\xc6\xe3\x19\x97\xc7\xcf\xa6\xec\x59\x6e\x35\x9e\x2f\x59\xcf\x32\xe9\x58\x96\x10\x8b\x73\x4e\xb9\x60\xa9\xee\x95\x0c\xf9\xf7\xaa\x39\xf6\x29\x64\x3e\x79\x40\xc5\x3a\xe5\xd4\xf6\x6d\x8a\x74\x64\x0b\x65\xd4\x44\x23\xf3\x64\x82\xd6\x3b\x69\x63\xd3\x0d\x2f\x9e\x1c\xd6\x89\x3c\x30\x03\xb0\x93\x82\x75\x57\x71\x42\xff\x0b\x11\x1e\xa5\x3f\x3f\xa5\xaf\x69\x98\x31\x76\xc8\x98\xd3\x09\x75\xce\x08\x49\xc4\xec\xc9\xee\x9b\x3e\xf1\x35\x60\x45\x79\x78\x9a\xa2\x87\x33\xe7\xc9\x97\xa3\xb9\xf6\x19\xf2\x94\xad\xe7\xff\x27\x9e\x8e\xc2\x8b\x10\x96\x00\xaa\xfe\x66\xd8\x52\xd7\xaa\x82\x44\xe2\x33\x67\xcd\x5b\xa5\x37\xca\xdc\xa5\xf5\x86\x59\x06\x7d\x9a\xe1\xb9\x02\xa3\x3e\x35\x33\x0e\x9f\x99\x67\x90\x79\x1c\x32\x18\x86\xe4\x75\x33\xfc\xee\x6b\xe1\xc1\x54\x1e\x7f\x03\x37\x0a\xb0\x28\x0b\xd3\x3c\xfe\x44\x85\x1a\xb2\x3c\x33\xe5\xf0\x3f\x4c\x62\xd2\xe3\x6a\x72\xf1\x05\x06\x5b\xb1\x5b\x6a\xb5\x9a\xc2\x4b\x66\xb8\x80\x02\x6f\x8e\x07\xed\x76\x47\x49\x48\xfc\x5a\xeb\xa7\xd3\x78\x7b\x5e\xf1\xf9\x01\x25\x42\xe7\xf5\xfb\xec\x4c\x99\xfb\x6c\x4a\xa0\xb8\x7c\x66\xbc\xdd\x9c\x13\x56\xc6\xe8\xd7\x61\x2f\xc3\xdf\x5f\x60\x80\x0d\x12\x7a\x01\xc8\x1c\xc9\x51\x3a\xd9\x50\x17\x8b\x70\xae\x19\x2f\x1b\x69\x68\x8c\xc5\x1b\xe2\x03\x61\xb7\x3b\xec\x0e\xce\x8c\xa9\x8d\xb1\xc6\x58\xac\xd1\xe4\x96\x3f\xfb\xde\xd7\xe0\x48\xc5\x4f\xfe\x37\xd3\x01\x46\xb5\xb6\xd4\xa4\xea\xaa\x8d\x28\x1c\x9c\x0c\x3a\x6d\xa2\x72\x18\x87\xe0\xb4\x92\x28\xd9\xb9\x68\xd1\x03\x42\x48\xe0\xaf\xe2\x05\x9f\xa9\xc8\xf0\x8c\xa5\xb6\x80\x38\xa6\x07\xd4\xb5\xe6\xe2\xef\xce\x26\x87\xaf\x7e\xcb\xcf\xdb\x2b\xf5\xea\x19\x5c\x89\x40\xbe\xef\x4f\xe4\x85\xd8\x65\x41\xf1\x1e\x1b\xcf\xf3\xfb\xc9\x1d\xcc\x52\x05\x19\x3a\x0d\xd6\xb1\x82\xe4\x8d\xbf\xe9\x0c\x34\xfd\x8e\x3c\x10\x48\x1b\x97\x15\x9c\x2d\xce\x0a\x7e\x70\x24\x2f\x26\x32\x38\x29\x64\x37\x7a\x7e\xba\xe9\x82\x47\x5b\x94\xdc\x48\xc5\x2c\xca\xbe\x7b\x71\xbe\xbb\x6c\xec\xff\x0d\xc7\xf8\xd7\x9c\xd0\x64\x9e\x19\xa8\x31\x37\x36\x7d\xf5\xe4\x0c\x30\x8e\x93\xf9\x9a\x12\x91\x9c\xff\x37\xbe\xde\xcb\x09\x4f\xd2\x4c\xf9\xca\x8e\x4f\x5f\x8b\x2f\x39\x2e\xad\x00\x9c\xd3\x45\xa5\xff\xe3\xb2\x1d\xce\x17\xa2\xbc\x33\xe4\x72\x72\x8c\xfa\xea\x91\x93\x67\x94\xd5\xf8\x54\xfd\xf7\xe0\xb4\xde\xfb\xff\xc6\xe6\x73\x53\x7c\xf9\xae\x19\xf2\x98\xeb\xcc\xbf\xba\x74\x06\x4b\x09\x46\xc3\x6c\xca\x3a\x5a\x9b\xcf\xf6\x3c\x27\xc0\x71\x5e\x90\x63\x5c\xcd\x53\x51\x9d\x39\xf6\xd3\x78\x02\x88\xe7\x14\x7a\xa6\xd8\xcc\x89\xe8\xd9\x9a\x63\x14\xeb\xf2\xd0\x93\xad\xf7\x27\x4d\x8f\xac\xeb\x8d\xc7\xd1\xf5\x13\x91\xf5\x8d\x7c\xca\x5c\x3d\x95\xba\xc9\xfa\xda\x7e\x02\x02\x59\x3a\x06\x10\x86\xf9\xbd\xa2\xa3\xf5\xd3\xe9\xa8\xe1\x04\xe4\xad\x9c\xa2\x84\x95\x53\x69\xbb\x25\x47\xcf\x76\x1f\x97\x32\x06\x9c\x86\x7d\x77\xa2\x41\xb9\xd3\x93\xe9\x63\x8f\xdf\xff\x98\x8c\x81\x9f\xa8\xe3\xc7\xb1\xf0\xac\x5c\x8b\xcf\x6e\xcd\x87\x88\xaf\x92\x0f\x55\x29\xa6\xd1\x2e\xfa\xc5\x1f\xa6\x55\x74\xfc\x6d\x84\xc9\xc5\xc6\xff\x52\xf4\x8b\x77\x64\x68\x52\xf1\x9f\x72\xae\x39\x38\x6d\xa6\x69\x98\x06\x18\x6a\x65\x14\x58\x83\x6e\x5a\x68\xe8\x3d\x5a\xc6\x69\x2a\xe0\xd4\x8c\xd3\x1c\xaa\x9a\x8c\x16\xd5\x1b\x05\xaf\xd3\x65\x34\x37\x14\xd6\x54\xfb\x72\x41\xa3\xd9\xe9\x66\x63\x7e\x00\xa9\x31\xea\xb4\xb8\x39\xcf\x68\xdb\x29\x8b\x4b\xa6\x81\x91\xb2\x1a\x86\x54\xb6\x9f\x20\x4a\xf2\xd5\x76\xee\x7c\xb8\xd2\xdc\xf2\x2d\x32\x19\x65\x9a\x63\xc4\x23\x53\x21\xa7\x79\xe6\x9d\x62\xb9\x79\xe7\x65\x73\xcc\xb5\x79\xca\xbc\xd9\xc6\x7a\xbc\x79\x65\xfb\x2c\x56\xd0\xae\xd3\x59\x68\xde\xe9\x9d\xf9\xcc\xd2\x30\x99\x8a\xc9\x46\xb9\x65\x2a\x21\xe3\x74\xfc\x46\xc1\xbc\x96\x4f\xab\x5d\xf9\xa8\x78\x7c\xaa\xe2\x9c\x37\x45\x10\x59\xda\x91\x4f\x0e\x3a\x6d\x7e\x35\x56\x15\x29\xdd\xdc\xbc\x9e\x80\xcb\x43\xc0\x47\x53\xac\xbf\x6f\xf2\xfc\xb9\x31\x66\xff\x14\x0a\x64\xfe\xdf\x63\x6c\xcc\x46\x18\x51\x8a\x1a\x59\xef\xe4\xe4\xd2\xe3\x8c\xa5\xd5\xe5\xd7\xee\x73\x66\x9e\xc9\xd6\x6e\x31\xa6\x1b\x0c\xac\x5b\xb9\x29\x4a\x9c\xa9\x76\x97\xe3\x77\x45\xdf\xb4\x88\xba\xf0\xe2\x2b\xb6\x75\xa5\xbd\x26\xbb\x45\xd4\x85\x06\xae\xd8\xd6\xd9\xe4\x37\x55\x3d\x53\xb4\xb1\xdd\xc5\xb8\x16\x6d\x68\x5b\xd4\x44\x16\x55\x0c\x88\x16\xa3\xa1\x7e\xf5\xb7\xf7\x1c\x88\xc5\x6d\xf2\xb8\x76\xf5\xbf\xec\x39\x50\x5a\x61\x7b\x78\xec\x9e\xb2\x45\x1b\xda\xfa\xc0\x68\xd8\x52\x59\x27\xdb\xf3\x59\x82\x73\x66\x78\xd3\x5c\x1b\xb9\xee\x38\xe8\xd3\x5c\x7b\x19\x4b\x0d\x6e\xcf\x07\x46\xed\x4d\x4f\x02\xa3\x2a\xf1\x26\x87\xe6\x3c\x39\xe3\x8c\x68\xfe\x7b\x8e\x79\x3d\x72\x5c\x92\xb3\x4d\xed\xa4\x49\x1e\xa7\x57\xb6\xbf\xee\xe3\x58\xdf\x0c\x45\x6d\xce\x67\x97\xdf\x3e\x1e\xf9\x93\x6d\x74\xac\xf2\xa4\x85\xce\x6a\x3c\xa8\xb6\x33\x77\x3a\xcb\x99\x19\x0b\xef\x4e\xb1\xa9\xba\xe3\x91\x3f\x29\x87\xfb\xfc\x64\x89\x67\x34\x5c\xaa\xac\x2f\x3d\xf9\xbc\xae\xe7\x6b\x61\x55\x73\xdd\xf2\xfc\x93\x40\xae\xe6\xa8\x4f\xff\x4c\x61\xac\x6a\x9e\x45\x9e\x52\x70\xac\xf5\xea\x5d\xb1\xfc\xc0\x08\x76\x92\x9c\xb3\x1f\x5e\xb8\x7f\xfe\xca\x2d\x23\x3d\xc5\xa9\xcc\xc3\x0b\x5c\xe6\x29\x20\x21\x52\x14\xaf\x6f\x6b\xb1\x78\xc9\xb3\xc3\x0b\xbb\x87\xa5\xba\x7c\xd1\x53\x13\xf4\xa1\x50\x5b\x79\xfd\x5c\xd1\x88\x0c\xb6\xf1\x49\xa6\x1f\xf3\xb5\x0e\xae\x5a\x33\x7b\x72\x20\x7f\x2a\x68\x40\x01\x2d\x4f\x80\xff\x14\xe4\xd4\x14\x64\x9e\x02\xea\x7f\xb9\x7e\x71\xa8\xd0\x5f\x27\xf6\x2d\x6a\x8d\xcf\xf6\x3a\x5d\x31\xa7\xcb\x17\x0e\x76\x1a\x2b\x22\xd1\x22\x9f\x27\x1a\x14\xf8\x2d\x59\x28\x3d\x1d\xbb\x8c\xe9\x4f\x56\x05\x92\x21\xc6\x10\x48\x38\xfa\x3b\x3a\x07\xcb\x82\x2e\x6f\x53\x91\xdb\x3f\x2b\xdc\x6e\xac\x08\x58\xc3\xe5\x01\x7f\xa9\x57\x72\x35\x1a\xc7\xf6\xe4\x00\xf7\x4c\x5e\xb7\xad\xb6\x55\x8b\x4f\xff\x24\x37\x30\x3b\x95\xbc\xba\x35\x5f\xa6\xef\x9c\x01\x3e\xf5\x91\x1c\x57\x58\x7f\x22\xb0\x2a\xf9\x34\xc7\x1f\x36\x1c\x1f\xbb\x3a\x95\xd6\xa9\x5e\x70\x06\xb4\x3e\x97\x9b\x62\x9c\x98\xd6\x1c\x47\x78\x92\xb4\x6e\x52\xea\x83\xce\xe3\x54\x08\x33\x21\xf9\xd5\x7c\xee\xcf\x7a\x22\xca\x99\x8e\xc9\x3e\xb0\xfa\xb8\xc4\x8f\xd3\xde\x08\x37\x1a\x30\x67\xda\x9c\x65\x26\x94\xef\x9b\x9a\xcb\x7c\xeb\xc4\x12\xcf\x4a\x6e\x4e\x20\x70\x9d\x46\x73\x97\x56\xef\x74\x4c\x5b\x95\xcf\x80\xe8\x5f\x4e\xf1\xd5\x3d\x27\x94\x75\x30\xd7\x61\xff\xe3\x38\x54\x8f\xd3\x7c\x9a\xd2\x27\x55\xbe\x0d\xc9\x31\xa9\x4f\x3a\x13\x11\xff\x23\xab\x43\xba\xf2\x84\xb2\x7d\x3b\xab\x29\x3a\xe6\x39\x81\x3e\xf8\xe9\x67\xcc\x36\x72\x2b\x2a\x35\x54\xa6\x86\xbe\x98\x44\x97\x27\xf3\xd5\x60\xd9\x37\x96\x95\xe7\x51\x32\x98\xef\x74\x16\x08\x7a\x8e\x6f\x71\x59\xfb\x0a\x85\x4a\x6b\xc2\x66\x91\x2e\x5a\x55\x9e\x9e\xdf\xb0\x24\x1b\x1a\xbd\x63\xc8\x4b\x14\x9a\x13\x11\x6f\xd5\x6a\x15\x21\x5d\x25\x15\xaf\x9d\xdd\xa6\x91\x5b\x95\x6c\xad\x9d\x00\x4c\xef\x6c\x2a\x33\x0b\x95\x85\xd1\xa4\x77\x5f\x06\x35\xad\x3e\xdf\xb7\x9b\x9c\x47\x7e\x85\xda\xe3\xe0\xd0\x2b\x88\x34\x7e\xa3\x3b\x95\xac\x93\x05\xab\x35\x37\x37\xe7\x85\xa5\x1b\xaa\xca\x82\x09\xa9\x32\xb2\x60\x64\x1a\x78\xba\xd3\x11\x2a\x88\x7a\xcd\x95\xb6\x32\xfb\xde\xc5\x0a\x52\x9d\x55\x71\xe2\x8a\xff\x2a\x53\xee\xfc\x4d\xed\xaa\x9c\x18\x3b\xfe\x64\x8e\x8b\xbd\x68\x7a\x20\x79\x8e\x6f\xbd\x7f\x5a\x54\x79\x3e\xba\xa6\x66\x0b\x27\xa6\xeb\xe1\x1c\x77\xfa\x93\xe3\xd0\x95\xed\x47\x4f\x86\x2e\xd9\x87\xd6\xc8\xd6\x31\x7d\x97\xe5\xc4\xe4\xfd\x21\x9f\xeb\x5c\x37\x2d\x95\x53\x7c\xe6\x23\xd3\x13\xaa\xd3\xe8\x54\x7d\x4f\x95\xd2\x0f\xca\xeb\x7b\x4e\x82\xcc\x1b\xa7\xb8\x1c\xcf\xf4\x34\xe6\xfa\x9a\xcf\x8f\x23\xca\x0c\x9e\x5c\x5e\xe3\xea\xbc\x9a\x77\x5c\x54\xf9\x68\x8e\xd2\x95\xe5\x01\x55\xe6\x68\xdb\xde\xe9\xf1\xe5\x93\xe8\x98\xaa\x69\xc7\xa5\x63\x63\x8e\x92\xf5\xe5\xa3\x23\x5b\xbb\x4e\x4c\x87\xac\x5b\x0d\xc7\xd3\xac\xe3\x92\xb3\x3b\x9f\x52\xb9\xf3\x60\xbb\x27\x6b\xd3\x45\xd3\x11\xc6\xd2\x2f\x00\x8c\x69\xba\x94\x9a\xb6\x6f\x77\x5c\xb2\x96\x4d\x51\xa2\xae\x3c\x34\xe5\x6a\xcf\x81\x69\x45\x35\x8e\x7d\x66\x2e\x45\xa9\x92\x83\xa7\x1b\xb2\x4b\x77\x2d\x0e\xc4\xe2\x06\x4e\xab\xe0\xc7\x31\xb2\xce\x6c\x90\xf4\xb1\xa5\x26\xbb\xc5\x3c\xff\x16\x05\x13\x3d\xe4\xf1\xf8\xe2\x2b\x8c\x82\x95\x5b\x5a\x5a\xaf\xb7\x18\xed\xfd\xc9\x71\xd8\x34\xd3\x93\xd0\x5b\x8d\x82\xbe\xe2\x9a\x87\x54\xac\x34\xd7\x50\x96\xd2\xd9\x4d\x06\xae\xa6\xc4\xc7\x9a\x0c\x42\xec\xab\x37\x32\x88\x6a\x05\xd7\x05\x90\xb7\x95\x5c\x65\xc9\xf4\x77\x89\xbf\x36\xa0\xfc\xa7\x53\xf3\x96\x4b\x4f\x0e\x62\x9e\x9d\xbc\xcc\x9b\x29\xdc\x5c\xc9\xc1\x64\x99\xcb\x76\x12\x52\xfb\x46\x53\xee\x7e\x4d\x87\x41\xff\x34\xc7\x58\x85\xc9\x80\xf4\x49\x49\xf7\xbc\xbc\xf8\xf4\xa9\xf3\x4f\xcd\xb5\xa7\x9b\xff\x93\x1c\x23\xb5\x4c\x9d\x3f\x27\x91\x3e\xfe\xfc\xb2\x7d\x96\x28\x1d\xff\x69\xef\x26\x4d\x47\xc6\x5f\xf3\x19\xa7\x6f\x32\x35\x53\x93\xe3\x39\xf9\x08\x1a\xa7\x47\xd6\xb3\xa8\xea\x41\xf3\xe7\xc4\xd3\x51\x73\xfd\x54\x45\x5a\x3b\x55\x32\xd9\x09\x6f\x5e\xc1\xe8\x34\x3a\x54\xff\x10\x51\xd0\xf1\xf9\xf3\xdc\xe9\x08\x79\x74\x8a\x73\xd8\x34\x45\x26\xb9\xae\x61\xcc\x9c\x77\x89\xc0\x82\xc3\x2c\xf2\x63\xf2\x9a\xf2\xbd\x04\x01\xad\x9b\x1f\x2d\x52\x28\x70\x6b\x99\x2c\xa3\xbd\x13\xe5\x71\xcf\xb1\x3b\xe4\xbf\x8f\xd7\x84\x42\xe3\xff\x93\x88\xe8\x17\x45\xbf\xf8\xb1\xb2\x49\x5c\xca\x9b\xd6\x37\x24\x8f\x90\xc7\x60\x40\x5c\x96\xb7\xf2\xc4\x45\xdc\xe0\x76\x9e\xa0\x6d\xc8\xa6\xb5\xec\x92\x54\xc6\x5d\x97\x05\xaf\xb7\x88\x7a\x47\xcf\xee\xe5\xe9\x1a\x8f\x6c\x67\x7a\xef\x9c\x7d\x43\x89\xb8\xc8\x3f\x77\xa9\xb7\xa0\x22\xdd\xb4\xa2\xb9\xba\xfc\xc5\x00\xb9\x54\xb4\xf0\x46\x7f\xe7\xa9\x2b\xf7\x79\xa3\x16\x79\x5c\x3c\x7b\xdd\xd0\xc5\x92\xcf\x32\xf6\xfc\xb3\x52\x4f\xb5\xe2\x67\x14\x7c\xbc\x62\x0f\x5d\xd3\x56\xc9\x33\xc4\xcc\x1f\xca\x31\xd4\x39\x27\x04\xd0\x4f\xb2\xdc\xfa\x93\xc4\xd3\x4f\xa6\x3d\x7f\xd5\x3c\x43\xda\xff\x98\x63\xe4\xeb\x4f\x82\xf6\x1c\xab\x9f\x29\xed\xb2\x1f\x58\x70\xa2\x2a\x7a\x86\x2c\xfc\x77\x3e\x07\x51\x76\x42\x4e\xa6\x7a\x8c\xc4\xc9\x31\xc3\x6a\xbc\xa8\xb6\x3b\xef\xb8\x15\xea\x0c\x59\x99\x7a\xb3\xb8\xe6\xc4\x7c\x4c\x2a\x55\xff\x7e\x92\x4b\xa2\x3c\xbb\xd4\x4b\x1e\x50\xf4\xa9\x3b\x9f\x3e\xb1\x33\xc4\xf0\xff\x25\x47\x97\x4a\x4e\x0e\xd1\x3f\x49\xa1\x6c\x33\x43\xf8\x13\x38\xe8\x00\x79\x9f\x19\x54\xbe\xf3\x25\xfb\xdb\xf2\x14\x97\xae\x25\xe4\x53\xbf\xea\x22\x67\x01\x0e\xd4\x24\x64\x8f\xd9\x27\x18\xb9\x0a\x7b\xb8\xdc\xd6\x9e\x68\x2c\xc8\x93\x92\x5e\xe7\x91\x9d\x66\x29\x6f\xe1\xea\x3a\x4a\x5a\x36\xce\x1a\xdb\x99\x1d\xf9\x99\xee\xac\xc7\x8e\xc0\x6a\xb2\x55\x75\x64\xfe\xb4\x3a\x32\x43\x09\xff\x7e\x8a\x7e\xdc\x7e\x72\x52\x9e\xac\x24\x2f\xcd\xf0\x41\x0a\x46\xe9\x1d\x7c\xce\x0c\xaa\x5d\xb0\xec\x6f\x1e\xcb\xb4\x36\x4e\x06\x0d\xc1\xaa\xb7\xa7\x52\xc9\xb4\x18\x63\xe2\x19\x20\xc4\x81\x92\xb2\x6d\x57\x5c\xb1\xad\xba\x82\x44\xa6\x07\x42\xbc\x92\x6a\x77\xb9\xda\x53\x4d\xa5\xa5\xea\x37\x91\x59\x0f\x7c\x76\xc0\x99\x17\xf9\x40\xfe\xa0\xdc\xc0\x2a\x27\x57\x96\x67\xee\xdd\x3d\x45\x6e\x85\x09\xe5\xb2\x9e\x94\x4c\xd4\x69\xe9\x29\x6d\x8e\x89\x54\x58\xe9\x1a\x64\x87\x5f\xf2\x7b\xb5\x60\xfb\x20\xbb\x94\xdb\xd6\xda\xba\x5e\x4e\x85\xd7\xb6\xb7\x9c\xda\xb0\x64\x6c\x60\x3c\x08\xbf\x31\x5e\xb6\xf5\x4d\xd4\x73\x03\x4b\xe5\x90\xbb\x78\x71\xcb\xd8\xd3\x59\xb9\x2f\xab\xf5\xf8\xd5\xfb\x13\x7d\xd3\xd6\x0a\x5f\xa7\xd3\x3f\xf5\xd6\x5f\xcb\x49\x34\xfb\x73\xef\x56\x7c\x67\x86\xdd\x7e\x02\x89\xdc\x85\xd7\x99\x12\xe5\x7b\xa0\xa7\xf3\xf4\xa3\xf9\xbc\x36\xa1\x93\x7c\xb2\x5a\xf3\xbe\xce\x6c\x24\x6b\x34\x1c\xe2\x14\x0c\x62\x0e\xa4\x30\x07\x24\xa8\xf4\x8c\x12\xe4\xdb\xc4\x45\xfe\x08\xf7\xb4\xb9\xde\xbc\xa9\x50\x52\xf2\xa3\xac\x0c\x4e\xbd\x4f\x20\x92\x35\xf8\x99\xf6\x1d\xdb\x91\x89\x07\x2a\x54\x00\xe1\xc2\xcc\x77\x6c\x93\x35\x79\xbe\x63\xfb\xeb\x7f\x3f\x37\x23\xcf\x4b\x5a\x94\xcf\x46\xf3\xcd\x9c\x3a\x0e\x2d\xff\x32\x2d\x55\x27\x9a\x87\x4c\xa1\x32\x3a\x65\x0f\x68\x9e\x89\x26\xb3\x30\x79\x22\x02\x1e\xcb\x71\x9f\x82\xe3\x9f\xf6\xe9\x86\xa9\x4f\x31\x4c\xf3\xcc\x82\xfa\xdd\x68\xcb\xf1\x9f\xda\xf5\xa6\x7b\x2a\x60\xe9\xc9\x42\xfd\x95\xef\x24\xf9\x94\xfc\x37\xb3\x14\xb3\x01\xe2\x19\x07\x52\x72\x06\xed\xd9\x14\x2e\xf3\xcc\x66\xee\x77\x48\x8e\x3f\x69\x53\x97\xd6\x06\x0a\x12\x96\x1c\x25\x2a\xa2\xb2\xa2\xcd\x76\x83\x9c\x31\xdf\xc6\xfc\x42\x7e\xbb\x45\x98\xdf\xa1\xc1\x2b\x4f\xdd\x67\x4f\xc8\xbb\xca\xd8\x0a\xf9\x2d\xed\xbf\x64\x75\xd3\x2a\xf2\x01\x71\x05\xea\x52\xab\xbb\x44\xbf\xe8\x17\x58\xd1\x2f\x76\xaf\x52\x40\x96\x17\x6f\x14\xfd\xa2\x24\x89\x7e\xf1\x94\x3d\x2d\xea\x6f\x6f\x14\x90\xe5\x99\x1f\x21\x69\xc2\x2e\x6d\x2c\xcb\xf9\x49\x6d\xcc\xc0\x80\x77\xb4\x31\x0b\x17\x11\xb5\xb1\x0e\x3c\x69\xd2\xc6\x7a\xc4\xc9\x55\xda\x98\x03\x4f\x5e\xd4\xc6\x06\x2c\x61\xce\xd7\xc6\x46\xd8\x99\xcf\xb4\xb1\x09\x76\xb6\x44\x1b\x0b\xf0\xb0\x1b\xb5\xb1\x1d\x3c\xfb\x43\x6d\x2c\x82\x63\x6f\xd7\xc6\x0e\xf0\xec\x93\x60\x41\x74\x3c\x80\x51\x85\x12\x79\x4c\xe0\xc0\xdd\xda\x98\x81\x15\x2f\x68\x63\x16\xa5\x38\xa4\x8d\x75\x70\x90\x98\x36\xd6\x63\x21\xe9\xd4\xc6\x1c\x1c\xe4\x21\x6d\x6c\xc0\x8d\xe4\x8f\xda\xd8\x88\x30\xf3\xa2\x36\x36\x21\xcc\xb2\xda\x58\x40\x82\x6d\xd0\xc6\x76\x38\xd8\xf3\xb5\xb1\x08\x81\xbd\x5e\x1b\x3b\xe0\x60\xef\xc6\x5c\x6c\xc3\x76\xec\xc1\x0e\x6c\xc6\x26\x9c\x8e\x51\x84\x51\x8a\xf5\x28\x43\x18\x73\xb1\x05\xc3\x38\x07\x1b\x30\x82\x30\x16\x63\x04\x5b\xb0\x05\x23\x18\xc5\x66\x8c\x60\x07\x2a\x11\x46\x12\x35\xa8\x45\x12\x09\x84\xd1\xa1\x1c\x0f\x67\x5d\x6b\xa7\xb2\x35\x82\x9d\xca\xf9\xbb\x30\x82\x0d\x72\xfd\x37\x77\xdb\xf6\x3d\x3b\x36\x6f\x3a\x7d\x34\x5c\xba\xbe\x2c\x3c\x77\xcb\xf0\x39\x1b\x46\xc2\x8b\x47\xb6\x6c\x19\x19\xdd\x3c\xb2\xa3\x32\x9c\xac\xa9\x4d\x26\xc2\x1d\x5b\xb6\x84\x95\xb3\x76\x86\x77\x8c\xec\x1c\xd9\xb1\x6b\x64\x43\x02\x18\xc0\x66\x8c\x62\x18\x4b\x71\x96\x32\x3a\x1d\x18\xd8\x3c\x3a\xbc\xf4\xac\xcd\xa3\xf2\x10\x23\xd8\x84\x73\x14\xc2\x77\x00\x03\x23\x9b\xce\xd9\x32\xbc\x03\xa8\x45\x02\x35\xca\xbf\x66\x2c\xc6\x46\x74\x61\x03\x9a\xf3\x5d\xab\x36\x51\x53\x53\xd3\xbc\x78\x63\xd7\x86\xe6\x9c\xcb\x1e\x6f\xd2\xe5\x0a\x77\x3b\xb1\x19\xdb\xb0\x15\xe1\x49\x93\x2d\x45\x58\x19\x67\xef\x3d\x1d\xdb\x30\x8a\xf5\xca\xf9\xbb\x32\x9f\x48\x20\x85\x46\x60\xf9\xc8\x8e\x9d\x9b\xb7\x6d\x0d\x6b\xa4\x2c\x0d\xd7\xd4\xa8\xc3\xd3\xb7\x8d\xae\xdf\xb6\x75\x97\x7c\x20\x91\x6a\x3c\x11\x55\x8b\x95\xb5\x1a\x56\x64\xaf\xae\xc2\x46\x85\xce\x30\x46\xb1\x4d\xf9\x7b\xba\x72\x24\x9f\x06\xc8\x9f\x59\xaf\xac\xb3\xca\xd1\x46\x6c\xd3\x3e\xa9\x7e\x66\xa3\xb2\x7f\x54\xd9\xb3\x03\xc3\x8a\x86\x9c\xa5\x88\xfc\x4c\x84\x31\x8c\x51\x65\xff\x66\x9c\x86\x73\xb2\xae\xb2\x55\xe1\x7a\x33\xd6\x2b\x1a\x91\x00\x16\x6f\x19\x19\xde\x39\x12\xde\x31\xb2\x71\x64\x47\x78\x74\x5b\x78\xf4\xf4\x91\xf0\x84\x6e\xec\x1c\x59\x3f\x2a\xcb\x61\xe3\xb6\x1d\xca\x91\x8d\xdb\xb6\x8e\x86\x47\x77\x0c\x6f\x18\x39\x6b\x78\xc7\x99\xe1\xe1\xd1\xd1\x1d\x9b\x4f\x3b\x47\x39\x65\xeb\xb6\xd1\xcd\xeb\x47\x76\xca\xaa\x75\x02\x9d\xc5\x64\x6d\x03\xfa\x95\x03\xeb\xb1\x19\xe1\x8c\x48\xc3\xe8\xc7\x30\xce\x50\xd8\x46\xff\xc8\x8e\xf5\x9b\xc3\xb2\x68\xc3\xfd\xc3\x67\x6c\xdb\x01\xac\xcf\x9a\x45\xd5\x6d\xf9\xea\xe7\xe0\x5c\xcc\xc6\x26\x45\x12\x9b\xb1\x05\x09\x65\x85\xcf\x02\xd6\x2b\x73\xee\x1c\xd9\xb1\x79\xe4\x9c\x73\x67\x6f\x3a\x6b\x78\xf3\x96\xc4\xfa\x6d\x67\x9d\x68\x05\xfb\x15\x7b\xd9\x8c\x73\xe4\x6b\xf4\x8f\x6c\xd8\x7c\xce\x09\x3f\x32\xf1\xcb\x4c\xf4\x62\x24\x91\xef\x3f\xf5\xb7\xd8\x18\xb0\xd0\x41\x0f\x0e\x06\x18\x21\x7b\x0f\x33\x04\x58\x60\x85\x0d\x76\x88\x70\xc0\x09\x17\x24\xb8\xe1\x81\x17\x3e\xf8\x11\x40\x01\x82\x08\xa1\x10\x61\x14\x21\x82\x28\x8a\x51\x82\x18\xe2\x28\x45\x19\xca\x51\x81\x4a\x54\x21\x81\x6a\xcd\x23\xa4\x50\x87\x7a\x34\x20\x8d\x46\xcc\x42\x13\x9a\xd1\x82\x56\xb4\xa1\x1d\xb3\xd1\x81\x39\x98\x8b\x4e\x74\xa1\x1b\x3d\xe8\xc5\x3c\xcc\x47\x1f\x16\xa0\x1f\x0b\xb1\x08\x8b\xb1\x04\x03\x58\x8a\x41\x2c\xc3\x72\xac\xc0\x10\x56\x62\x15\x56\x63\x0d\xd6\xe2\x14\x9c\x8a\x75\x18\xc6\x7e\x5c\x82\x6f\xe1\xc7\xb8\x12\xb7\xe1\x0a\xbc\x8d\xdb\x71\x23\x7e\x89\x67\xf0\x34\xee\xc4\x69\x58\x8f\xef\x63\x03\x9e\xc5\x08\xfe\x13\xbf\xc3\x0b\x78\x0e\xcf\xe3\xf7\xf8\x18\x1b\xf1\x32\x5e\xc4\x4b\xb8\x0b\x9b\xf0\x03\xfc\x01\xaf\xe0\x55\x9c\x8e\xc3\x38\x82\xcb\x70\x06\x36\xe3\x4c\x9c\x85\x2d\xd8\x8a\x1b\xb0\x0d\x67\x63\xbb\x62\xd5\xb2\x06\xef\xc2\x6e\xfc\x05\xe7\x62\x2f\xf6\xe0\x1b\xf8\x26\xce\xc3\x01\xfc\x1c\x17\xe0\x7c\x5c\x88\x8b\xf0\x09\xfe\x8a\x07\xf0\x2b\xdc\x8d\x07\xf1\x3a\xde\xc2\x1b\xf8\x35\xee\xc7\xbd\xb8\x0f\x8f\xe0\x51\x7c\xa4\x46\x29\x4a\xc1\x28\x11\x42\x00\xe4\x0c\x4d\xd9\x62\x71\x3f\x08\x74\x99\x55\x23\x4a\xbc\xa9\x44\x02\x4c\x67\xf7\x82\x41\x58\xb7\x0c\x8f\x6e\x85\x57\x39\x03\xca\x2f\x80\x4d\x8c\x26\xce\xaf\x41\x5b\xce\xf9\xfe\xcc\x59\x24\xeb\x13\xca\x6f\x09\x9e\x39\xb2\x63\xab\xf2\x63\x86\xea\x2f\x0b\xea\xb4\xdf\xfd\x33\x82\x18\x17\x28\x67\xce\xc6\xe5\xb8\x09\x8f\x93\x46\xd2\x46\x16\x90\x53\xc8\x76\x72\x25\xb9\x9e\xfc\x8e\x7c\xc0\x30\xcc\x1a\xe6\x4a\xe6\x7a\xe6\x77\x6c\x25\xbb\x9c\xbd\x84\xfd\x57\xf6\x21\xf6\xcf\xec\x27\xec\xff\xb0\x5f\xea\xdc\xba\x05\xba\x8d\xba\x4b\x74\x97\xeb\xae\xd2\xfd\x59\x5f\xac\x1f\xd0\x5f\xa2\xbf\x51\xff\x9c\xfe\xcf\x1c\xb8\x08\x57\xc3\xcd\xe7\x36\x70\x57\x72\x07\xb8\xa7\xb8\x17\xb9\xf7\x0c\x30\x98\x0c\x76\x43\xb9\xa1\xd7\xb0\xcb\x70\x89\xe1\x4a\xc3\x55\x86\x3b\x0d\x7f\x32\xbc\x67\xb8\xd2\xe8\x32\x46\xc0\xc1\x49\x5f\x82\x87\xfe\x00\x5e\x7a\x14\x3e\xfa\x06\xfc\xf4\x05\x04\xe8\x51\x18\xe0\xa4\x2f\xc3\x45\x0f\xc1\x43\x2f\x82\x97\x7e\x0e\x1f\x7d\x13\x7e\xfa\x3c\x02\xf4\x18\x82\x70\xd2\x67\x21\xd1\x57\xe1\xa6\xef\xc3\x4b\x1f\x85\x8f\x3e\x89\x02\xfa\x0e\x8a\xe9\x05\x88\xd1\xff\x40\x39\x7d\x18\x49\xfa\x30\xea\xe8\xf3\x68\xa6\xc7\xd0\x4a\x3f\x45\x27\xdd\x83\x1e\xfa\x0d\xf4\xd2\x6d\x98\x47\xdf\x41\x3f\xfd\x25\x16\xd3\xdb\xb0\x84\xfe\x08\x03\x74\x13\x06\xe9\x37\xb1\x8c\x5e\x8d\xe5\xf4\x32\xac\xa0\x4f\x63\x25\xfd\x25\x56\xd1\xfb\xb0\x9a\x3e\x89\xb5\xf4\x1a\x39\x5b\xa6\x72\xb4\x17\xe9\xe7\x70\xd2\x83\xf0\xd3\x63\xd0\xc1\x46\x8f\x40\xa2\xc7\xe0\xa7\x47\x50\x40\x8f\x28\xf7\xdb\x64\x9a\x5e\x83\x9f\xbe\xa5\xd0\x64\x80\x8d\xbe\x0c\x91\xbe\x00\x89\x7e\x08\x37\x3d\x06\x2f\x3d\xac\x1d\x7d\x4b\xae\x93\xe8\x87\x10\xe9\x41\x48\xf4\x28\xcc\xb0\xd1\xff\x07\x91\x5e\x03\x07\xdd\x0f\x27\x7d\x0b\x12\x3d\x08\x37\x3d\x0a\x0f\x7d\x19\x5e\xfa\x8c\x22\xa5\x00\x3d\x88\x02\xfa\x29\x38\xd8\xe8\x51\x88\xf4\x30\x1c\xf4\x7d\x8d\x8a\xc3\x28\x50\xe4\x67\xa3\xcf\x43\xa4\x4f\xc3\x41\x9f\xd0\xe6\x3d\x0c\x2f\x3d\xa4\x50\xed\x46\x84\xbe\x89\x18\x7d\x16\xe5\xf4\x59\x24\xe9\xd3\xa8\xa3\x2f\x21\x4d\xef\x46\x23\x7d\x14\xb3\xe8\x15\x68\xa2\x97\xa2\x85\xfe\x1c\x5d\xf4\x09\x74\xd3\xd7\xd0\x43\x8f\xa2\x97\xbe\x86\x01\xfa\x1a\x96\xd2\x4f\x31\x48\x0f\x63\x05\x7d\x07\x43\xf4\x79\xac\xa4\xb7\x61\x15\xbd\x1b\x6b\xe8\x61\x08\x19\x6e\x1c\xf4\xa0\x32\x4b\x31\x7d\x13\x69\xfa\x0e\x1a\xe9\x3b\x98\x45\x9f\x44\x13\x7d\x14\x2d\xf4\x49\x2c\xa3\x47\xb1\x86\x7e\x0c\x16\xcb\xe8\x21\x0c\xd1\x4f\xb1\x86\x1e\x54\xf8\x7f\x02\x22\x7d\x10\x0e\xfa\x20\x22\xca\x8a\x3e\x81\x59\xf4\x09\xe5\x73\xcd\xf4\x20\x5a\xe8\xb3\xe8\xa4\x9f\xa3\x8f\x1e\x82\x57\x59\x8b\x08\x3d\x86\x59\xf4\x28\x9a\xe8\xc7\x68\xa1\x47\xd0\x45\x8f\xa0\x9b\x7e\x8a\x5e\xfa\x29\xe6\xd1\xa3\x98\x4f\x8f\xa1\x8f\x7e\x88\x05\xf4\x08\xfa\xe9\xc3\x58\x48\x3f\xc4\x22\x7a\x04\x4b\xe8\xc7\x18\xa0\x47\xb1\x94\x1e\xc2\x32\x85\x9f\x63\x18\xa2\xc7\xb0\x92\x1e\xc6\x2a\x7a\x4c\xa1\xc7\x04\x1b\xdd\x0d\x91\xee\x84\x83\x5e\x8a\x62\x7a\x0d\x3a\xe9\x63\xe8\xa5\x6f\x61\x80\xbe\x85\x65\xf4\x4d\x0c\xd1\x43\x58\x43\x5f\x50\x28\x3f\x04\x91\xbe\x0f\x07\xfd\x18\x11\xfa\x3e\x3a\xe9\xa7\xe8\xa3\x1f\x63\x01\x3d\x8a\x25\xf4\x30\x96\xd1\x23\x18\xa2\xef\x28\x72\xd2\x2b\x54\x77\xd2\x23\xe8\xa5\x47\x30\x40\x8f\x60\x0d\xfd\x10\x46\x74\xd2\x63\xe8\xa6\x9f\xa3\x97\x1e\x43\x3f\x7d\x12\x03\xf4\x98\x22\xef\xe5\xf4\x73\xe5\x73\x26\xe8\xe8\xe7\xb0\xd1\x57\x21\xd2\x97\xe0\xa0\xaf\xa2\x98\xbe\x80\x4e\xfa\x3e\x7a\xe9\xfb\x18\xa0\xef\x63\x48\x91\xeb\x41\x10\x24\xe9\x87\x60\x30\x8b\xfe\x08\x2d\xf4\x2e\x10\xf4\xd3\x47\xc1\x41\xa4\xaf\xc1\x41\x0f\xa3\x98\x1e\x44\x27\x7d\x07\x0b\xe8\xa7\x8a\xf4\x2d\xb0\xd1\x67\x21\xd2\x27\x34\xc9\x1f\x44\x9a\x1e\x9a\x24\xf9\x67\xd0\x45\x5f\x53\x24\xdf\x4f\xef\xc3\x22\x7a\x54\xd1\xc0\x65\x70\xd0\x11\x14\xd3\xbb\x51\xa1\x51\xde\x47\x3f\x85\x41\x9b\xe9\x53\x34\xd2\x97\x30\x8b\xde\x8f\x26\x7a\x1f\x5a\xe8\xa3\xe8\xa4\x87\x41\xb0\x86\x7e\x0e\x06\xfd\xf4\x31\x2c\xa6\xc7\xe0\x82\x8d\xde\x06\x3b\xfd\x25\x44\x7a\x33\x82\xf4\x41\x84\xe8\xc3\xca\x35\x63\xf4\x20\xca\xe9\x21\x85\x9b\x3a\x7a\x04\xcd\xf4\x1d\x74\xd2\x7f\x47\xaf\xf2\xc9\x57\x31\x40\x1f\xc3\x32\xfa\x2a\x96\xd3\x47\x31\x44\x0f\x62\x15\x3d\x8c\x35\xf4\x35\xd8\x34\x7e\x54\x0b\x28\xa6\x8f\x29\xdc\x76\xd3\x83\xe8\xa1\x87\x30\x8f\xbe\x8f\xf9\xf4\x69\x2c\xa6\xaf\x61\x09\x7d\x13\x4b\xe9\x5b\x58\x4e\x5f\xc6\x4a\xfa\x21\xd6\xd0\x37\x60\x86\x9d\x5e\x03\x91\x7e\x13\x41\xfa\x6f\x88\xd1\x27\x50\x4e\x9f\x44\x92\x3e\x81\x3a\x45\xff\x6e\x46\x2f\xbd\x0b\x03\xf4\x97\x58\x46\x9f\x86\x00\x3b\xdd\x0f\x91\x5e\x86\x20\xbd\x1b\xc5\xf4\x7b\x88\xd1\xc7\x90\xa4\x8f\xa1\x8e\x3e\xa3\x9c\xdd\x43\xef\x47\x2f\xbd\x0f\xcb\xe8\x93\x18\xa2\x2f\xc1\x80\x08\xfd\x10\x31\xfa\x21\xca\xe9\x87\x48\xd2\xf7\x51\x47\x0f\xa3\x97\x7e\x88\x21\x65\x95\x6d\xf4\x3a\x38\xe8\x6d\x08\xd2\xbb\x50\x4e\x9f\x51\x6c\xb4\x93\xde\xa6\x5d\xe7\x7e\x0c\xd0\xfb\xb0\x82\x1e\x54\xe4\xff\x39\x8a\xe9\xe7\x88\x69\x1a\x3f\xa0\xac\xff\x61\x70\x88\xd0\x57\xb1\x54\xd1\xeb\x37\xb0\x92\x3e\x89\x55\xf4\x79\x4d\xcb\x26\x34\xf5\x0d\x44\xe8\x21\x74\xd1\x83\x58\x49\x0f\x61\x95\xa2\x87\x9f\x83\x45\x84\xbe\xac\xac\xe2\x42\xc5\xcb\xc8\xda\xdc\x4d\x3f\x44\x0f\x3d\xa2\x48\x48\x3d\xef\x7d\xe5\xc8\xcb\xe8\xa2\xcf\x62\x29\x3d\x8a\x95\xf4\x2d\xac\x52\xe4\xa7\xda\xcd\x33\x8a\xbf\x94\xe7\xe8\xa4\xcf\xa2\x97\xbe\x8c\x79\x8a\x35\xbc\x8e\x7e\x7a\x37\x06\xe8\xcb\x58\x47\x8f\x68\x1a\xad\x7a\x8c\xcf\x11\xa2\x87\x34\xdb\x39\x84\x5e\xfa\x31\xe6\xd3\x0f\xd1\x0f\x1f\x06\x14\x4f\x11\x51\xec\xee\x63\xac\xa1\x47\xc0\x20\xa2\x50\x73\x14\x3a\x45\x5b\x65\xd9\x0d\x28\xb3\x7f\xaa\x48\xf7\x08\x66\xd1\x4f\xd1\x44\x0f\xa3\x85\x1e\xc5\x00\xfd\x1c\x2b\x15\x1f\xf3\xb1\xf2\xc9\x37\x15\x3e\x89\x62\x8f\xb2\x0c\x3f\x86\x48\x3f\xd4\xe4\xf1\xa1\xa6\x43\xc7\x60\x80\x8e\x1e\x55\x3c\xbc\x48\x3f\x46\x90\x1e\x42\x88\x1e\x45\x84\x3e\x8b\x7e\xf4\x2a\x16\x7f\x17\xec\x8a\xc5\x3c\x8a\x10\x7d\x4d\x99\x55\xa6\xbc\x87\x1e\xc3\x7c\x7a\x50\x91\x9e\xbc\x1e\x83\xf4\x18\x58\x38\x94\xcf\xbe\xaa\xf8\x16\x46\xf1\x6d\x03\xf4\x90\xf2\x3d\x27\x6f\x29\x34\x5c\x07\x91\x5e\x8d\x10\x7d\x46\x59\x93\x4e\xfa\x26\x7a\xe9\x4b\xca\x2c\x37\x43\xa4\x3f\x87\x83\xfe\x1b\x42\xf4\x25\x44\xe8\x51\xc5\xe2\xbb\xe9\x9b\xe8\xa1\x6f\xa0\x97\xbe\xa1\xac\x95\xec\x9b\x89\x72\x5d\x01\x3a\xfa\x21\x6c\xf4\x47\x10\xe9\xf7\xe0\xa0\x3f\x40\x88\x3e\x8a\x08\x7d\x4d\x59\x89\x6e\xfa\x24\x7a\xe8\x13\xe8\xa5\x4f\x60\x80\x3e\x81\x41\x25\xaa\x79\xe8\x2f\xe0\xa7\xff\x81\x00\x7d\x16\x26\x38\xe9\xa5\x70\xd1\xeb\x20\xd1\x9d\x70\xd3\x0b\xe0\xa1\x3f\x82\x97\x7e\x03\x3e\x7a\x29\xfc\xf4\x67\x08\xd0\xcb\x50\x40\xf7\x28\xdf\xec\x60\x53\xfa\x57\x22\x9c\x20\x90\x94\x5f\x3c\x2d\x46\x2b\x04\x74\x62\x01\x62\x58\x88\x25\xa8\xc6\x52\xac\x45\x0a\xeb\xb1\x1e\x6d\x18\xc1\x08\xda\xc7\x7f\x25\xf8\xa5\xc4\x75\x5b\xe5\xf7\x67\x7f\xf0\x55\x4c\x79\xff\xe1\x4a\xcb\xff\x0f\x00\x00\xff\xff\x89\x11\x26\xb4\x08\x7a\x00\x00") + +func fontsRitasmithTtfBytes() ([]byte, error) { + return bindataRead( + _fontsRitasmithTtf, + "fonts/RitaSmith.ttf", + ) +} + +func fontsRitasmithTtf() (*asset, error) { + bytes, err := fontsRitasmithTtfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/RitaSmith.ttf", size: 31240, mode: os.FileMode(438), modTime: time.Unix(1575019249, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4a, 0x9, 0x17, 0xe5, 0x57, 0x9b, 0x25, 0xa4, 0x6c, 0xc6, 0x1, 0x99, 0x63, 0xd4, 0x9f, 0x45, 0x46, 0x1f, 0xdc, 0xc7, 0x29, 0x20, 0x87, 0xaf, 0x1e, 0x88, 0x85, 0xc4, 0x92, 0x33, 0x3, 0x40}} + return a, nil +} + +var _fontsActionjTtf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\xbc\x07\x7c\x24\xd9\x79\x1f\xf8\xbd\x57\x39\x57\x75\x57\x57\x75\xce\x01\xb1\x1b\x9d\x11\x1a\x40\x23\xa7\x89\x98\x9c\x07\x33\xc0\x0c\x30\x01\xc0\x60\x30\x61\xd3\xcc\x2e\x37\x71\x97\xdc\x34\x9b\xb8\xe4\x4a\x5c\x92\xa6\x48\xf1\x44\x8a\xb4\x82\xb9\x47\xcb\xf4\x59\xc1\x3e\x5b\x96\x6d\xc9\x3e\x4a\x32\x8f\xb6\x4e\x96\x4d\xf1\x28\x99\xb6\xd2\x29\x0c\xf6\x7e\x55\xd5\x0d\xf4\x6c\x30\x79\xf7\xf3\xf4\x00\x78\x95\x5e\xbd\xf7\xbe\xff\x97\xbf\xd7\x80\x00\x40\x85\x3a\x90\xf0\x8f\xf7\x1e\xc8\x15\x1e\x7b\xe2\xc6\xbf\x05\x78\x76\x13\x00\x0e\xef\x1b\xdb\x75\x70\xe1\x0f\x7f\xef\x6f\x01\x9e\xfd\x4d\x00\xa8\x9c\xbf\xba\xb0\xfe\xf6\x3f\x5c\xf9\x5f\x00\x1e\x5e\x04\xa0\xbe\x7f\xfe\xe6\x66\xf4\x5b\x85\x6f\x1b\x00\x4a\x12\x00\x0a\x17\xd6\x2f\x5e\x7d\xb2\xf8\x4f\xf6\x02\x28\x2a\x00\xe8\x17\xaf\x3c\x74\xa1\x27\xbd\xf4\xbb\x00\xca\xaf\x01\x5c\xa8\x2d\x2f\x5e\xbd\x4d\xff\xa3\xff\x7a\x00\xe0\xf1\x2b\x00\x0c\xbb\xbc\xb4\xb0\xf8\x1b\x93\x9f\x7e\x05\xe0\xe3\xa4\xd5\xff\xf2\xf2\xd2\x02\xfd\x38\xfe\x73\x80\x8f\xd7\x00\x20\xb9\x7c\x75\xf3\xf6\xf7\x7f\x85\xfb\x45\x80\x5b\x5f\x07\x40\x3f\x77\x79\x69\x63\xf5\xbd\x2d\x58\x02\x78\x7c\x17\x00\x84\xaf\xac\x9d\x5f\x00\x7f\xfe\x0d\x80\x9b\x00\x80\xbe\x7e\x75\xe1\xf6\x3a\x1a\x22\x3f\x0b\xf0\xf1\xb3\x00\x10\x5d\x5d\xb8\xba\xf4\xb3\x99\xbf\xb2\xae\x89\x00\x32\xb9\xbe\x76\x7d\x73\xe5\x3f\x5c\xf8\x01\xc0\x43\x27\x01\x10\xbd\xbe\xb1\xb4\xfe\x83\x7f\xf5\xbb\x5f\x06\x50\x8e\x02\xc0\x65\x00\x88\xa0\x87\xa1\xf1\x0f\x7d\x0f\xb6\x9b\x10\x84\xf9\x46\x1b\x83\xbc\x7d\x85\x80\x02\xfa\x61\xa3\x4d\xb6\xdc\x43\x41\x12\x87\x1b\x6d\x1a\xfc\x78\xb4\xd1\x66\xe0\x24\xcc\xdb\x2b\x6e\xfd\xfb\xaf\xf8\x64\xa3\x8d\x40\xc6\x4f\x37\xda\x18\x18\x62\xae\xd1\x26\xc0\x47\x34\xef\x27\x5b\xee\xa1\xc0\x45\x5c\x6e\xb4\x69\x90\x88\xc7\x1a\x6d\x06\xb2\xf8\x69\x20\x00\x91\x5c\x63\xfc\x4e\xdb\x19\xbf\xd3\x76\xc6\xef\xb4\x9d\xf1\x3b\x6d\xb2\xe5\x1e\x67\xfc\x4e\xdb\x19\xbf\xd3\x76\xc6\xef\xb4\x59\xe8\x22\x9e\x6f\xb4\x39\xf0\xf2\x9f\x6f\xb4\x79\xd4\x23\x18\x8d\xb6\x00\xbb\x78\x57\xa3\x2d\xc2\xb8\x38\xd9\x68\x4b\xcc\x59\xe2\x97\x1b\x6d\x19\xce\xf2\x2e\x58\x86\x4d\xd8\x84\x75\xe8\x87\x1c\xe4\xe0\x2a\x2c\xc1\x55\x38\x07\x4b\xb0\x01\xd7\x21\x0b\x0b\xb0\x06\x57\x20\x0b\xe7\x61\x0d\xae\x42\x0e\x6e\xc2\x06\xac\xd9\xed\x0b\xb0\x06\xab\xb0\x08\x4b\x90\xb3\x7b\xb8\x00\x39\x88\x42\x37\x44\x61\x04\xce\xc3\x26\xac\xd8\xd7\xa3\x30\x0b\x0b\x70\x1e\x2e\xc3\xf5\xc6\xf1\x18\xac\xc1\x3a\x3c\x04\x1b\xb0\x02\x17\xed\xb7\x47\xa1\x0d\xc6\xa0\x1d\xa2\x90\x87\x3e\xe8\x83\x5e\x88\xc2\x41\xfb\x1d\x51\xd8\x0d\x37\x60\x03\xd6\x61\x19\x1e\x82\x28\x54\x1b\x6f\x98\x84\x0d\x58\x82\x25\x88\x41\x14\x46\xe1\x86\xdd\xc7\x2a\xac\xd9\x7f\x37\x61\x0d\xa2\xf6\x0c\xa2\xf6\x5d\xd7\xed\x19\x2c\xda\x6f\x69\x8e\x60\x1c\xa2\xf6\xf8\x37\x20\x0a\x2b\xb0\x0a\xd7\x61\x13\x16\x60\x15\xce\xdb\x7d\xb6\x37\xde\x32\x03\x57\xb7\xc7\x68\xf5\x77\x10\x76\x43\xfd\x7d\x2b\xe2\xdc\x59\x84\x22\xf4\x41\x14\x0e\xd8\xf3\xbe\x02\x57\x20\x0a\xd3\xdb\xad\x79\x58\x84\x6c\xe3\xce\x69\x58\x80\xab\xf6\xaa\x39\x23\x39\x08\x51\xe8\x81\x0a\x94\x21\x0f\xbd\x90\xb5\x7f\x17\xa1\xa7\x71\xf7\x04\x5c\x81\x15\x7b\x14\xd6\xf8\x36\xed\xd9\x44\x61\x2f\x2c\xda\x63\xbf\x6e\xf7\xba\xa7\x31\xef\x91\xc6\xda\xde\xb4\x69\xd7\x0d\x87\x60\x1d\x62\x30\x0f\x4b\x70\x11\x6e\xc0\x15\x58\x80\x0d\x7b\xdd\xd6\xe0\x22\xf4\x43\xf4\xc7\xd2\x29\x0f\x59\xe8\x79\xdf\x13\xbd\x90\x83\x02\x14\x21\xd7\xa0\x92\x73\x4f\x6b\x3f\x0f\xf4\xb2\xbc\xb9\xb9\xde\x9f\xcb\x5d\x5d\xba\x7a\x6e\x69\xe3\x7a\x76\x61\xed\x4a\xf6\xfc\xda\xd5\xdc\xcd\x8d\xb5\xb5\xab\x17\xd6\x56\x17\x97\x72\x9b\x9b\x17\x72\xd1\xee\xe8\xc8\xf9\xcd\x95\xb5\xd5\xe8\xec\xc2\xf9\xcb\xd7\xd7\x56\xa3\x63\x6b\xeb\x0f\x6d\xac\x5c\x5c\xde\x8c\xb6\x8d\xb5\x47\xf3\x7d\x7d\xbd\xd1\x83\x6b\x57\xa3\xbb\x6f\x6c\xac\x2f\x3f\x14\xad\x46\xbb\xa3\x93\x1b\x4b\x4b\xb1\xe8\xe8\x8d\xcd\xe8\xea\xda\x66\x74\x73\x2d\x7a\x6e\x29\xba\xb1\x74\x7d\xed\xca\x62\xb4\xcd\xea\x60\x3c\x7a\x61\x6d\x23\xba\xb2\x7a\x7d\x73\x61\xf5\xfc\x52\xac\x3d\xda\x1d\x9d\xb9\x6a\xf5\x78\x6e\xe9\xe0\xee\x7a\x63\x20\xd1\xee\x68\xb1\xd8\x17\x3d\xb0\xb9\x72\xe5\x4a\x74\xda\xfa\x35\xbf\x98\x8d\x76\x47\xa7\x17\xae\x2e\x2e\xad\x46\xc7\x0e\x46\x7b\x2a\xe5\x7c\x6f\x36\xdf\x5b\xec\x89\x76\x47\x27\xae\xac\x5c\x5d\xd9\x5c\xd8\x5c\xba\x1e\xdd\xbb\xb8\xb6\x71\x3d\x1b\xdd\xb3\xb6\x19\x1d\x89\x8e\xad\xdd\x5c\xda\xe8\x3e\xb4\x1e\x9b\x5f\xba\x78\xe3\xca\xc2\xc6\xe4\xc6\xda\xc5\xfe\xe8\xfb\xe7\x94\xcf\xf6\x34\x2e\xf4\xe6\x0a\xc5\x5c\x5f\xaf\x75\xc6\xb9\xa7\x71\x0b\x9c\x80\x71\x58\x81\x9b\xb0\x62\xe3\xc3\x42\xb6\x85\xf9\xe3\x36\x3d\xd7\xe0\x94\x8d\x7b\x6b\x8d\x37\xe1\x3a\x4c\xdb\x67\x97\x6c\xfc\x5e\xb7\x51\xbf\x6c\x1f\x5d\x87\x1b\x70\x15\xae\xda\xd4\xb6\x9e\x5e\x83\x0b\x2d\x57\x2d\x34\x9d\xb7\xb1\x77\xdd\x3e\x6e\xf2\x80\x75\xdd\xe9\xe7\x42\xe3\x0d\x5d\x10\x85\x5b\xf6\xd9\xf3\xb0\x0c\x51\xbb\xc7\x87\xb6\xf9\xaa\x89\xb2\x0d\x7b\xac\x4d\x34\x9f\xb3\xef\x68\x83\xab\xb0\x66\x73\x94\xf3\xbe\xcb\xb0\x04\x57\xec\x2b\xce\x33\x0f\xd9\xa3\x74\x50\xed\xa0\xb2\xdd\xe6\xde\x25\xb8\xf5\x81\x11\x5a\x23\x5a\x68\x70\xb5\x33\x83\x43\x30\x0f\xbb\x1a\xe3\xb8\x02\x6b\x70\x0b\xb2\x20\x01\x6f\xff\xec\x81\xbd\xb6\xc4\xd8\x0b\x7b\x60\x02\x8e\xd9\xa3\xbe\xd1\x18\xc9\x52\xe3\xed\x56\xeb\xb6\x3d\x27\x8b\xdf\x2f\xda\x7d\x3a\xed\xc5\xed\xf9\x7f\xf8\x8a\x58\x2d\x6b\xc4\x4b\x8d\xb5\x59\xb1\xef\x59\x6b\x48\x9f\x09\x38\x0a\xfb\x60\x17\xcc\xc0\x18\xcc\xd8\x5c\x7d\x04\xe6\xed\xd6\x41\x98\x80\x3d\x10\x85\x7d\x30\x01\xf3\xb0\x1b\x66\xe0\x00\x1c\x80\x19\x7b\x94\x56\x9f\x1b\x0d\x39\xd2\x9c\xe1\xa2\x3d\x6f\x4b\xee\xac\xda\x23\xde\x99\xdf\xc1\xed\x31\x59\x52\x7a\xc1\x5e\xa3\x28\x3c\x64\x8f\xc1\x9a\xf7\x88\x3d\x67\x6b\x15\x0e\xda\xb2\x68\x02\x76\xd9\x6b\x75\x10\xa6\xed\xb7\x5a\xf8\xb1\xde\x7a\xd0\xa6\xe0\xaa\xbd\xb6\x3b\xf3\xeb\xb6\x25\xda\x15\x7b\x86\xad\x72\xc1\x92\x96\x5d\x0d\xf9\xba\xd1\xa0\xdd\x6a\x8b\x4c\x71\x68\xdb\xbc\xba\x6e\x9f\xdb\xdc\x46\x9e\x35\x4a\x07\x87\xce\xfc\x9c\xb5\x7d\x08\xd6\xed\xb9\xae\x37\xa4\xc5\x82\x4d\x89\x9d\x99\x1e\x6b\xcc\xa9\x89\xba\x45\x7b\xde\x9b\x36\xde\xce\xd9\x2b\xbe\xf4\x63\x68\xd4\xd4\x03\xce\xfb\xd7\xec\xb5\xdc\x59\xab\x5b\xf6\x79\x07\xe5\x0b\x76\x0f\x57\xec\x7b\x2e\x6e\x1f\x37\xef\x5c\xb4\x7b\x69\xea\x16\x0b\xd9\xd6\x58\x2e\xd8\xa3\x5a\xb1\xcf\x39\xd8\x79\xff\x9d\x0e\xc2\x36\x1a\x08\x6b\xae\xc2\xd5\xc6\x48\x9c\x15\x71\x56\xd3\x5a\x93\x9b\x0d\xd4\x5f\xff\x90\x35\x38\x6f\x3f\x1d\xb5\x91\xfc\x51\xb3\x5e\xb1\xef\x58\xb5\x8f\x1d\xbd\x74\xd5\xee\xf7\x3c\xac\xc0\x82\xad\x83\x16\x60\x1d\xd6\x1b\xdc\xb5\xb0\x4d\xdd\xeb\x2d\xe3\xbf\x05\x4b\x70\xce\xa6\x6e\x53\xcf\x5c\x68\x68\x59\x87\xc2\x3b\xf7\x3d\x88\xfc\x8f\xc2\x6d\xc6\xee\x63\xdd\x6e\x5f\xb5\x47\x7c\xbd\xf1\xd6\xff\x7f\x73\x74\xe8\x79\xde\x1e\xd3\x42\x03\x01\x1f\x3e\xd7\x75\x9b\xa7\x16\xe1\x86\x8d\xe3\xeb\xdb\x6b\xed\xcc\x30\xda\x32\xc7\x2e\x5b\x92\x38\xf3\xb8\x65\xcf\x63\x75\x7b\xad\x36\x6c\x3b\x65\xc3\xee\xd5\x79\xdb\x0c\x64\xec\x15\xb8\xd2\x90\x7f\x3b\xd2\xa2\x89\x16\x67\x8c\xd7\xed\x7e\x16\x1b\x7c\xea\x70\x99\x33\xd2\xf5\x86\x3e\x5f\xb2\xe7\xd4\x94\xd1\xe7\x1b\x16\xd1\xfb\xa5\xb5\x33\xca\xab\x2d\xfd\x37\xd7\x67\x65\x9b\xea\x3b\x6b\x39\xd9\x22\xb9\x9c\xb1\xdd\x68\xd8\x1f\xef\x97\xfa\x4d\x4a\xde\x80\x75\x58\xdc\xb6\x2b\xfa\xb7\x7b\xfa\x9f\x69\x11\x5e\xb1\xed\x8f\x05\xfb\x09\xab\xdf\xab\x70\x65\xfb\x3d\xbb\x61\xc1\xe6\xd6\x95\x6d\xce\xb3\x74\x89\x63\xb3\xb5\x8e\xe7\xa3\x6c\x41\xeb\xda\x8f\xb7\xbc\xac\xbb\x7e\x52\xab\xcb\xba\xf7\x10\x1c\x80\x11\xbb\x35\xd6\x82\xb5\xc5\x6d\xfd\xf6\x51\xa3\xf9\x30\x39\xbd\xb2\xcd\x61\xd6\x6a\xaf\x36\xb4\xd0\xaa\x8d\x91\xb5\x07\xe4\x64\xd1\xb6\x49\x17\x1e\x90\xbc\x4d\xec\x5b\x56\xde\x2e\x7b\x8d\x2f\x6f\xeb\xc3\x15\xfb\x7c\xf3\x8d\x3f\xde\x72\xb8\xb0\x6d\x39\xf4\xff\x4f\xa7\xf1\xff\xf7\xfe\x56\xde\x67\x59\x5b\xb8\xc8\xd5\x11\x74\xdd\x9c\x88\x7e\x9d\x48\x4d\x24\x16\x96\xbd\x89\xe5\xb3\xe3\xdd\x20\x10\x1c\xc4\xc0\x0b\x01\x48\x40\x10\x3e\x03\x83\x70\x1e\x75\xa3\x15\xa4\xa2\xdf\x85\x6f\xa2\xbf\x0f\xdf\x83\xbf\x46\xff\xee\xf8\x86\xf3\x01\x12\x68\x80\x7a\xc4\xe5\xd2\x34\x55\x55\x14\x59\x96\x24\x51\x14\x04\x9e\xe7\x38\x96\x65\x18\x9a\x46\x08\x00\xbd\xf0\x4d\xf4\xde\xd3\x13\xcb\xe3\x3f\xf9\xff\x5f\x20\xf0\x24\x74\xfe\x02\x45\x4e\x42\xe7\x37\x30\x9e\x58\x1e\xff\x06\x49\x4e\x2c\x8f\x5b\x3e\xe3\x30\x00\xfa\x65\x22\x0a\x04\x30\x70\xb8\x1e\x45\x2c\x5b\xe7\x30\x43\x62\x04\x34\x85\x09\x4c\x91\x14\x30\x34\x85\x30\x22\x2c\x6f\x73\xf2\x66\xae\xea\x85\xe1\x5a\xae\xa6\xde\xb7\xfe\xa3\x5c\xed\x7e\xcd\xfa\x81\x7c\x0f\x9a\x59\x7e\x17\x00\xd8\x99\xe5\x85\xaf\xd7\xe7\x8f\xf6\x6a\xd5\x77\x81\x7d\xef\x1f\xf7\x1e\x2b\x6a\x31\x2d\x55\xd4\x12\xc3\xe8\xd6\xd6\x3f\xfd\x9b\xbf\x21\xa2\x7f\xf7\x1f\x87\xf1\x17\x80\x86\x24\xa8\x70\x9f\xa0\xa1\x0d\xca\x30\x0d\x87\xe0\x34\xac\xc0\x2b\xf5\x71\x74\xe9\x52\xfd\x72\xfb\xa9\xe3\x83\xfd\x27\x0f\x73\x07\x08\xf3\xcc\x40\x3f\x0e\x40\x3b\xce\x2d\x11\xb9\x0a\x41\x4c\x8e\xd6\x87\x07\xa9\x09\x82\x24\x66\x67\x30\x23\x50\x33\x87\x66\x28\x69\x99\xea\xda\x4b\x26\x0a\xe4\x42\x17\x24\x10\x32\x1b\xe3\x1c\xce\xdd\x57\xef\xab\xf7\x73\xd6\x58\x51\xce\x1e\xa9\x59\xb3\x8e\xd5\xfb\xb5\xdc\xfd\x5a\x2d\x77\x3f\x9b\xcd\x42\x36\x9b\xcd\x36\x86\x6f\xc2\xa5\xd6\xe1\x5f\xb2\x86\xef\xd6\xe9\x10\xd2\x69\xc6\x60\x68\x86\x4e\xc4\x33\x69\xe7\x53\xd6\xab\x95\x72\xa9\x5a\xb1\x3e\xc5\x82\x69\x98\x86\x5b\xa7\x13\xf1\x74\xb9\x64\x1f\x12\xa5\x4c\x3a\xa3\x19\x45\x7d\x10\x95\xca\xa5\xf4\x20\x2a\x55\x08\xad\x64\x3d\x49\x33\xb4\x47\x77\x9b\x95\x4c\xba\x6c\x30\x66\x25\x53\x4a\xc4\xad\x33\x46\xb1\xf0\xb7\x0c\x85\x48\x44\x89\xa5\xa2\x84\xbd\x3c\x22\x28\x45\x44\x48\x62\xba\xe5\x74\x94\x20\x5d\x3e\x09\xe1\x8a\x3f\xdc\xdf\x13\x6f\xf3\x1a\x41\x4c\xa8\x1c\x8b\xe9\x4e\x12\x21\x22\x31\x4b\xa4\x9e\x47\x0c\x4f\x70\xbc\x18\x8d\x7b\xdd\x9e\xb4\xab\x03\x7f\x9e\x58\xc4\xcf\xa1\x0e\x7e\xe8\x02\xcd\x50\x48\xf1\x90\xe1\xb1\xd7\x9f\x42\x4c\x47\xa6\xdd\x4b\x13\x04\x22\x30\x2f\xb5\xe1\xfb\x6f\x84\xbb\xfb\xa2\xf1\x9e\x48\x00\x87\x7c\x8c\xec\xdf\x02\x8a\x4e\x8d\xbb\xda\xf5\x3a\x3a\x4d\x5c\xd8\xda\x8f\xfe\x3d\x11\x22\x11\x26\xc9\x48\xb5\xb6\xf5\xa9\x17\x3d\x0c\x8f\x0a\x22\xe3\xf2\xf7\xc9\x9a\xcf\x95\x84\xf7\xde\x03\x15\x7d\x05\x5f\x26\x0e\x41\x06\x94\xf7\xee\xe3\xbd\xc0\x80\x82\xea\x78\x17\xd0\x90\x85\x09\x1c\xc1\x5f\x82\x14\xfc\x11\xfc\x31\xfc\x57\xf8\x6b\x84\x51\x4f\xfd\x09\x74\xff\xbf\xfd\xe8\x07\x7f\xfc\x5f\xfe\xf3\x1f\xfe\xce\xbf\xfe\x17\xff\xfb\xaf\x7e\xfb\x9b\xbf\xf8\xf3\x3f\xf7\x95\x2f\x7f\xe6\xad\x47\x57\x2f\x9d\x3a\x71\x64\xdf\xee\xfe\xbe\x9e\x64\xc8\xab\xc9\xef\xfd\xcd\x8f\x7e\xf8\x83\xef\xff\xe7\x7f\xf7\x5b\xff\xe2\x37\x7e\xed\x57\xde\xfd\xc6\xcf\x7f\xf1\xd5\xe7\x9e\xf9\xd8\xe3\x37\x37\xaf\xad\x5f\x58\x3a\x53\xe8\x48\xc7\x03\x7e\x8e\x65\x20\x42\x50\x3a\x26\xa8\xbf\xc0\x2f\xf7\xe3\x97\x8f\xe1\x97\xcb\xb8\xfb\x00\x7e\xf9\xbb\xd4\x90\x40\x1d\xea\x68\x23\xff\xf4\xd0\x10\xf9\x97\x7f\x31\x45\x7e\x67\x76\x9c\xfc\xde\x77\x1e\xfe\xe9\x3b\xe8\x55\x07\x1a\xb9\x5c\xee\x5d\x04\x40\xde\xff\x26\x42\x36\x80\xd5\xfb\xb9\xda\x7d\xa7\x61\x63\xc5\x41\xce\x37\x11\x38\x57\x54\x0b\x29\x3f\xc9\x3f\xf8\xc9\x6e\xcb\xf7\xa0\x77\x11\x09\x69\x0b\x74\xaf\x22\xa2\x01\xba\x77\x11\x01\xf5\xde\x6f\x22\x42\xab\xbe\x8b\x08\x0b\x7c\x16\xf0\x2a\x1e\x9d\x31\x3d\x7a\x22\x9e\x4e\xc4\x1d\x84\xd9\x88\x63\x0c\xb3\x52\x2e\x59\x47\x46\x55\x4f\xc4\x33\x61\xe4\xb1\x00\x58\x2e\x55\xca\xa5\x2c\xca\x24\xf4\x26\x5a\x9d\xa7\xb6\x7f\x7b\x74\xb3\x52\x2c\x58\xfd\x95\xad\xb6\x61\x1a\x21\x64\x98\x86\xe9\xe0\xd8\x43\xc7\x19\xc3\xe3\x3c\x4b\x9b\x56\xef\x16\x66\x87\x50\xd9\xc6\x6e\xba\x9a\x45\x0d\xd0\x17\x8a\x05\x07\xf7\x8d\xf7\x66\xec\xee\x0d\xa7\x9d\xce\x30\x86\x69\x58\xef\xb0\x9b\xce\x49\xdd\x68\x4c\x82\x31\x8a\x05\xe7\x6d\x95\xea\x10\x2a\x16\x8c\x1c\x62\x22\x88\xb6\x4e\x67\x12\x34\x43\x9b\xc5\x4a\xb5\xe2\xce\xa2\x44\x9c\xf1\x14\x0b\xd8\xad\x22\xa4\x33\xb4\x39\x4c\x48\x55\x99\x14\xfa\xd2\x11\x8a\x72\x7b\xda\x15\x32\x48\x88\xe3\xbc\x80\x94\x12\x2f\x75\xba\x31\xdd\x65\xa8\x1d\x19\x1e\x91\x08\x51\x1a\x49\xa9\x24\xc9\x11\x38\x2d\x90\xbc\x97\x67\x15\x17\x81\x55\x42\xe2\x84\xf9\x72\xbb\xe4\x77\xb9\xd8\x0c\x9d\x74\x73\x5e\xb7\xa9\x08\x12\xe3\xa6\xfd\x73\xc3\x71\x22\xc8\x33\x6e\x22\x4f\xb1\x6a\x3a\xe1\x57\x78\xc2\xc7\x77\xf0\xdd\xc3\x53\x61\x4e\x11\x48\x4a\xa0\x59\x56\x53\x3c\x02\x89\xbd\x84\x9f\x67\x39\x49\x67\x3c\x92\x2c\x47\x05\x12\xb7\x53\x32\xad\x85\xc6\x82\xc7\x52\x84\x84\xb5\x60\x51\xd5\x33\xb4\x57\xcb\x06\x0e\x33\x24\xdb\x45\x77\xaa\x24\xf7\x29\x09\x1b\x2a\x52\xb1\xac\xef\xc2\x22\x49\x2a\x22\x8d\x32\x58\xc3\x44\x40\x57\x48\x16\xa7\x05\x9e\x92\x59\x0a\xb9\x05\xd3\x60\x48\x95\x92\x74\xfc\xa9\x1e\xc4\x24\x09\xbe\x5b\xe5\x42\x24\x11\xe7\xba\x53\x22\x17\x92\x4c\x44\x92\x92\x4f\x26\x25\x5e\x56\x14\x4c\xf1\x63\xfd\xbc\x47\xf6\x12\x84\x26\x2a\x04\x19\xd7\x14\x52\xd7\x90\xce\xb3\x2e\xb7\x5b\x74\xf3\x1c\xa7\x4a\x5a\x10\x6b\x8a\xc4\xe8\x8f\xfb\x32\xac\x2a\xf9\xab\x05\x8f\x84\x19\x59\xd1\xe9\xb4\x44\xf1\x82\x90\x92\x15\x52\x30\x09\x09\xb3\x9c\x44\x28\xa6\xaa\x62\x97\x40\xf1\x01\x42\x26\x3c\xa9\x31\x43\x46\xbc\x0f\xd1\xd8\x70\x9f\x53\x90\x7c\x9e\x2c\x51\x9d\x94\x26\x29\x82\x62\x6e\x7d\x19\x71\x8c\xcb\xe2\xfc\x26\x7f\xd3\x96\xd6\xfa\x09\x8e\xdd\xe8\x6d\xd4\x49\x8c\x5b\x12\x02\x00\x0f\x01\x06\xef\x7b\xdf\x45\x0a\x81\x21\x0e\x3d\x30\x5b\xf7\xa1\x7c\xbe\x5e\x80\xf6\x44\x7b\xc2\x0b\x61\x9c\xe9\xc6\xa2\x40\xe8\x08\x09\x0d\x61\x9e\xb3\x94\x8d\x2d\xb1\x2d\x26\x6b\x08\x6c\x01\xf2\xad\x02\x3b\x6f\xf1\x4c\x4a\xdf\x16\xd3\x83\x48\x77\x24\x74\xd5\x86\x23\x63\xcb\x5e\x33\x8c\x18\x4b\x80\x97\xaa\xce\xa1\x81\x94\x76\x91\x4c\xf5\x87\x75\x9f\xce\x88\xe1\xb6\x1a\xab\x4a\xa2\x5b\x76\x63\x2d\x87\x63\x27\xda\x55\xdf\x78\x35\x12\x30\xc3\x51\x7a\xc8\x97\xee\x4d\x1e\x1a\xcf\x9d\xa5\xfa\x8f\xcf\x9c\xf7\xd3\x2c\xc7\x49\x74\xa0\x77\x96\x3f\x7b\xec\x0b\xb7\xe9\x5e\xe2\xce\xe8\xca\xe9\xe7\xde\xce\xad\x1c\x3d\x7a\x63\xd7\x39\xc0\xe0\x7e\xef\xaf\xe1\xcf\x08\x0f\x78\x21\x0d\x33\x75\x1f\xca\x64\xea\x6d\x10\x0b\xc5\x42\x2e\xde\x87\x21\x42\x88\x3a\x62\x01\xf1\x4d\x65\x65\x4b\x9d\x07\xa7\xc7\x43\xa6\x75\x7a\x19\x47\x1f\x59\xd3\xb0\x19\xb4\x52\x2e\x65\x9c\x99\x58\x6c\xc8\x58\x07\xd6\x2c\xed\x19\xff\x19\xcb\x31\xed\x87\x93\xaa\x4a\xcd\xfa\xb1\x4b\x15\x28\xef\xe4\x85\x91\x50\xb4\x5c\xa9\xa9\xfe\xb8\xe9\x41\x5f\x0d\xee\x3f\xa4\xdf\x1d\x0b\xaa\xef\x3e\xf1\xb5\x37\xa5\xfe\x0a\x45\x53\xc8\x55\xf9\x67\x07\xf6\x1f\x5e\xe8\xfe\xdc\x9f\x3f\xf9\x39\x29\x58\xde\x5c\xb2\x74\x7e\x3b\xee\x81\x3f\xc0\xff\x09\x72\xb0\x50\x4f\xa3\x9e\x9e\x7a\x1e\x3a\xa3\x91\x50\x22\x6a\x92\x20\x67\x02\x72\x44\xc7\x74\x04\x77\x64\xba\x29\x4e\xa2\x52\x29\x0d\x05\x9a\x22\xd6\xd2\xb4\x0e\xd1\xd4\x86\x00\x6d\xd5\xb5\x01\xe8\x69\x9d\x5b\xcf\xf6\xdc\xb6\x65\x88\x3d\x49\x4b\xa1\x56\xed\x49\x16\x0b\x66\xb1\x64\xff\xf5\xe8\xb4\xc7\x12\x62\xc6\x1f\xb8\x24\x29\x2d\xf1\x9c\x5b\x12\x59\x56\x64\x59\x43\x27\xdc\x2e\x43\x53\x53\x34\xad\x46\x30\x19\x60\x29\x1f\xbe\xc7\x93\x18\xa5\x28\xc1\xd4\x65\x59\x51\x4c\x93\xe5\x75\x81\xc0\x94\x3b\xe2\x66\x63\xac\xcb\x4b\xba\x29\xda\x9d\x02\x0a\xbc\xf0\x5d\xac\x12\x22\xf4\x40\xaf\x6d\x89\x6c\xc0\x67\xea\xe3\xe8\xfa\xf5\xfa\x26\xac\x5f\x38\xbe\x7f\xdf\xcc\x54\xbd\x1c\x61\x56\x2f\x9d\x3b\x79\x62\x6e\x6a\x62\x7c\x68\xa0\x2f\xdf\xd9\xee\x35\x39\x06\x0e\x1d\xc4\xe5\x3d\xc4\xca\x99\x73\x0b\x54\xf0\x08\x25\xf6\xe6\x29\xf2\x12\x29\x1e\x24\xaf\x88\x2d\xb6\x48\x2e\xd7\xb4\x44\x72\x8e\xdd\x94\xbb\x5f\xfb\x71\x0a\x64\xdb\x2a\xb9\xde\xba\x52\xd7\x1d\xc5\xc0\x38\x02\x97\x91\x91\x83\xf6\x32\x9d\xc9\xa2\x41\x64\x2b\x07\xa3\x68\xcb\x57\x47\x38\x5b\xa2\xd8\x34\x2c\xc8\x67\xc2\xa8\x58\xb5\x16\xb4\x6c\x2f\x6e\xc6\xa4\x99\x8a\xb3\x9a\xba\x69\x89\x73\x6b\x6d\x8d\x62\xb5\x5c\xaa\x50\xe9\x4e\x4b\x29\x14\xab\x95\xb2\x69\x4b\x6c\xb3\x50\xc1\xaa\xa8\x48\xee\x19\x37\x42\x64\xe7\x50\x2f\x9f\xa2\x70\xa8\xc2\x74\x79\x39\x4d\x1d\xd5\x30\x43\x49\xfc\x73\x84\x98\x92\x32\x6d\x2a\x9b\x19\x21\xba\x12\x71\x6f\x2c\xcb\xbd\xac\xb5\xcf\x93\x2c\xfd\x09\x92\x40\x72\xdf\x18\x45\xba\xd4\x61\xd5\xe7\x99\xf7\x60\x7a\xeb\x3b\x91\x92\x69\x90\x62\x30\x8d\xbf\xee\x0b\x93\x07\x18\x59\xdf\x8f\xfe\x2f\x7f\xdf\x98\x7b\x8e\x0d\xb9\xe9\x92\x8f\xdd\x87\x59\x62\x88\xd9\xdf\x45\x21\xea\xc0\x49\xde\x4f\x70\x55\x31\x54\x63\x39\x52\x1e\xbf\x15\xe5\x68\x3a\xa5\xfe\x7c\xd0\xe5\x5b\xf0\xd2\xd2\xfc\x71\x9e\x24\xf9\xdd\xb8\xdb\x35\xee\x52\x39\x66\x31\xe2\x41\x1e\x65\x70\x37\x1b\x22\x58\x44\xcb\xef\xa6\x18\xc1\x20\x00\x08\x70\xbf\x77\x1a\x75\x22\x1a\x42\x50\x81\x49\xb8\x58\x6f\x47\x53\x53\xf5\x69\x7f\x35\x3f\x98\xcf\xa5\x12\x3c\xd9\xde\x86\x95\x30\xee\xad\x16\xf1\xc0\x18\xf6\x0f\x53\x90\x88\x53\x6e\x37\x20\x65\x07\xd0\xb5\x86\x71\xf0\x00\xfd\x76\xf8\x55\x81\xa9\x56\x4a\x4d\x59\x94\x32\xe3\x99\x9e\x8c\x23\x84\xd2\x19\x47\x7d\x16\x0b\x66\x18\x39\x02\xc9\x9d\xce\x58\x4b\xed\xb1\x8c\x4c\x9b\x4e\x16\xff\x5a\x6c\x5d\xf5\x58\xfa\xd2\xd2\x89\x55\xfb\xf8\x69\xcd\x0c\x23\x81\x65\x5d\xa2\x1e\x97\x12\x22\x1d\xba\x95\xa4\x46\x30\xdd\x9d\x27\x18\x8a\xbb\x10\xc1\x94\x6c\x04\xd8\x44\xf6\x12\x49\x46\xb8\x67\x5c\xb8\x3f\x93\xa0\xd1\xe7\x23\xdd\xac\xc4\x73\xbe\x10\xe2\xf9\x69\xed\xa6\xca\x9b\xc4\x26\x13\x2c\xcc\x0e\xd4\x51\x72\x56\x50\x48\x9a\x54\xc9\xa3\x34\x26\x31\x97\xcf\xd6\xdb\x4f\xc8\x46\x40\x65\xc4\x9c\x78\xbd\xec\xa9\x14\x6a\x49\x37\x06\x02\x6a\x88\xc3\x21\xf4\x07\x76\xf4\x7c\x2f\x3c\x5c\x2f\xa1\x7d\xfb\xea\xfb\x23\xd3\xe3\xc3\x43\x7b\xc6\xba\x7a\x63\x38\xd2\x8d\xd5\x42\x9e\x62\xb2\xdd\x94\x48\x52\x73\x29\xca\xdb\x5b\xa1\x06\xe6\x48\x26\x1e\xeb\x20\xbd\x7a\x40\x44\x6a\x73\xf9\x1a\x36\x77\xce\x31\xb2\x9a\x1e\x44\x63\x21\x5b\x45\x83\x0a\xfb\x5a\x97\x71\x9f\xb5\x8c\xd0\x34\x60\x98\xb8\x2d\x1d\xac\x75\x34\x0b\xa6\xd1\x30\x43\x3c\x7a\xa6\x71\x83\x75\x8b\x85\xe6\x01\x54\xb0\x16\x3d\x82\x2c\xa3\xa7\x13\xc5\x19\x3a\xe1\xd8\x38\xf6\x23\x69\x2c\x67\xa5\xb2\xa4\x8d\x6b\x9d\xc7\x28\x37\x65\xe4\x19\x21\xf6\x5a\xd7\xf8\x88\xc8\x84\x99\xa0\x2a\x8e\xcb\x6c\x98\x15\xd2\x5c\x77\xd7\x85\x19\xba\x83\x10\x89\x3b\x5a\x34\x25\xab\xb3\xa4\x96\xf0\x9e\x36\x3e\xc6\x88\x0a\xe9\x67\x5d\x3d\xf3\xda\x84\x4b\x1d\x54\x68\xe4\x22\x48\x8a\x9a\x99\x8f\x09\xa4\x84\x30\x22\xc3\x66\xe8\xe2\x9b\x2c\x8b\xf9\x79\x92\xa2\x11\x42\x09\x42\xc4\x38\x48\x10\x24\x49\x0a\x16\x12\x5d\x40\xc1\x7f\x87\x5f\x07\x17\xf8\x21\x03\xfb\xeb\x61\xd4\xd6\x56\x6f\x07\xd3\x63\x06\x30\xb8\x09\x88\x61\x3e\x45\x51\x61\x52\x92\xa8\x1d\x05\x91\x6b\x31\x4d\x1f\xd0\x11\x6d\xad\x8b\xd5\x66\x2d\x56\x55\xb7\xc5\x82\x2d\x36\x1b\xde\x09\x53\xca\x18\x96\x66\xc8\x94\x1a\x46\xa0\xb5\x0c\xff\x3d\x4c\xf6\xd3\xee\xdd\x82\x3b\x97\x48\x94\x65\x9f\xe2\x37\x44\x8f\x28\xb0\xd9\x74\xc0\x08\x69\xee\x88\x27\x78\xba\xe0\x27\xf8\x4e\xd9\x0c\x25\x7a\x22\x8c\xe1\x09\x45\xc5\x70\x86\x20\xc8\x94\xd9\x1e\x34\xfc\x1e\x5f\x1a\x08\xe8\x84\xfd\xe8\x14\xfe\xae\xed\xe3\x16\xe0\x68\x3d\x8c\x8a\xc5\x7a\x09\xba\x53\xf1\xce\x64\x34\xe8\x82\xf6\x4e\x5a\x77\xb9\xf4\x30\xe9\xf3\x29\xc8\xb5\xc3\x4a\xe8\xd9\xac\xfc\x6b\xf2\xdf\xc9\xbf\x86\x76\x04\x5f\x63\x4a\x2e\x28\xb6\x4e\xa9\xd8\x14\x78\x8d\x8f\x23\xf3\xd2\xe5\x92\xbb\x61\x3f\x66\xd2\x89\x82\xc5\x29\x4c\xa6\x71\x83\x69\xf3\x1b\x3a\x25\x8a\x28\x10\x08\xcb\xa2\x84\x28\xa2\x2c\xab\xe3\x87\xc2\x7d\x54\x87\xa8\x0e\x84\x74\x95\xf0\x25\x08\x3e\x1c\xf1\x87\x65\x6f\xa8\xa6\x44\xba\x82\x4c\x57\x04\xff\x2c\xf2\x06\x88\xe9\xe9\x43\x43\xc5\x75\x3d\xc3\x1b\x09\xd9\x83\x22\xcb\xaf\x88\xb1\x14\xe1\x96\x3c\xbc\xd2\x7f\x3a\x36\x76\xe1\x9f\x33\xca\xaf\x1e\x36\x6e\x1e\x06\xdb\xb2\x71\xe1\x1a\x41\x40\x00\x52\x30\x08\xbb\xe1\x24\x5c\x84\x87\xea\x65\xb4\xbc\x5c\x5f\x81\xc5\xd3\xc9\xf0\x85\xc5\x53\x89\xf0\x11\x3c\xbd\x77\x0f\x1e\x0a\x12\x50\xc2\x62\x1a\x47\xcf\xe1\xe9\x7e\x8a\x3d\x40\xed\xca\x92\xae\x63\xe4\xb8\xcb\xb2\x02\xc4\x56\x97\x35\xd7\x24\xb4\xf3\xa9\x35\xbc\x8f\x56\x16\x11\x61\xb9\x75\x89\x96\x5b\x97\xa8\xc9\x1e\x4d\xc7\xb4\x49\x7e\x47\x6d\x66\x4a\x8e\x6d\x64\xb9\x9d\x4c\xc3\x03\xb0\x84\x4c\x46\x6f\x7d\xb6\x58\x20\x2c\xa9\xe3\xf8\xa6\xd6\xe5\x1c\x72\xee\x4e\x97\x4b\xb8\x46\xb1\x48\xee\x1f\x3a\xf8\xce\x89\x03\x6d\xc5\xcb\x29\xfc\xd0\x84\xe4\xcb\x69\x6e\x46\xf0\xf7\xc5\x59\x2f\x33\x44\x31\x88\xa9\x0d\xef\xff\x6a\x08\x09\x9c\x2f\x9d\x28\xed\x7d\xb2\x98\x9c\x92\x34\xdd\xd7\xbb\x2f\x1d\x0c\x24\x46\xde\xe8\x70\xc9\x6c\x25\x19\x38\x98\xd2\xd5\x57\xd5\x30\x4b\x78\x31\xea\x50\x8c\x28\x75\xa8\x7f\x78\xf3\xd2\x17\xef\x1e\x5b\x0f\x71\x35\x25\x54\x89\x67\xc6\xce\xed\xfa\xa3\x3d\xcf\xad\xb8\xa6\xdc\xb8\xf3\x54\xa0\xbd\x57\x3c\x50\x1f\xff\x8e\x14\x0f\xb9\x6e\xf7\x1d\x4b\x57\x17\xa7\xfe\x41\xfe\xd0\x92\xdb\xb7\xba\xe7\xfc\xdc\xf0\xfc\xd6\x17\xbe\xa4\xcc\x08\x97\xe6\x27\x9f\xeb\x49\xfd\x08\x8b\x11\xa9\x38\x91\xf5\x1a\x67\x00\x48\x68\x07\x1a\x2b\x84\x68\xe7\x55\x9e\x87\x57\xe1\xd5\xfa\x28\x7a\xed\xb5\xfa\xeb\xf0\xe2\xb5\xab\x8b\xa7\x4f\x1e\xdb\x3f\x14\x8b\xbc\x72\xe7\xf2\xde\x3d\x53\x93\x35\x53\x49\xcb\x7e\xc0\xc7\x1f\x22\xfc\x37\x88\xd0\x1c\xd1\x7b\x9c\x78\xf1\xa5\xb3\xc4\xd1\x73\xc4\xc1\x3a\x45\xbe\xf2\x24\x25\xe4\x90\xb0\xad\x14\x86\x87\xed\x58\xc2\x8e\x52\xc8\xb5\x98\x3b\x1f\xa9\xd1\x15\x78\xad\x95\x7a\xaf\x39\x66\xab\xb5\xfa\x0e\x80\x77\x08\xe8\xb8\x78\x96\x06\xa0\x99\xa6\xfa\xa8\x3a\xb0\x77\xb4\x85\xad\x45\x2c\xf7\xcd\x39\x91\x29\xeb\xd6\xb3\xe9\x41\x54\xca\xd8\x7a\xdd\x88\xe0\xb4\xe5\x9b\x65\x70\x35\xdd\xec\xde\x71\xf6\x7a\x1a\x26\xb1\xa1\x58\xbe\x97\x59\xb0\x51\x60\x7f\x4a\xe9\x0c\xa3\x9b\xa5\x34\x56\x74\x3e\xc9\x86\xa9\x68\xbd\xf8\x24\x3b\xea\x13\xc8\x5a\xaf\x4c\x12\x1c\x41\x4a\xae\xa4\xd2\x9f\xea\xc2\xac\xcc\xde\x53\x64\xaf\x87\x64\x31\xc6\x08\xd1\x79\x4a\x63\x93\x1c\xf1\x26\xc6\x8c\x17\x53\x14\xa9\x9d\x22\xc9\xce\x41\x13\x8b\xc8\xc5\x69\xa7\x79\x8f\xc7\x67\xba\xd2\xaa\xe6\x15\x78\x91\xa4\x10\x26\xd8\xf3\x31\x46\x26\x24\x32\x56\x9c\xe3\xb2\xdd\x95\x3d\x2a\x46\x26\x39\x1b\x64\x49\x06\x61\x9a\xa1\x66\xc6\x22\xb2\x48\x30\x0c\xa1\x09\x9d\x84\x6f\xc9\xaf\x69\x2c\xcb\xba\xd9\x19\x99\x19\x98\x24\x34\x1d\x4b\xa9\xb8\x96\x39\xe5\x5b\xf3\xa9\xe9\xa8\x3b\xe8\xa3\xe8\x70\xd6\x7d\x56\xe2\x62\xc1\x63\xd1\x4f\x44\x8e\x11\x71\x79\x50\xd9\xbb\x79\xfa\x0c\xff\x70\x7c\x94\x29\xa3\xc0\x3f\x25\x45\x2a\x99\xea\xf4\x7b\xb3\xaa\xe6\xc5\xfc\xc7\xfc\x1d\x55\x29\x35\x49\x8b\x28\x3c\x80\x69\x0e\x61\x82\xac\xb1\x0a\x31\xa7\xea\xf2\x00\x50\x10\x83\x38\x9e\xc2\x7f\x09\x75\x98\x85\x67\xe1\x1e\x7c\x06\xbe\x56\x3f\x88\xde\x7e\xbb\xfe\x53\xf0\x99\x57\x3e\x79\x65\x26\xfa\xea\xad\x95\xb9\xc9\xca\xc7\xf1\xb5\xa3\x18\xfc\xf8\xda\x5b\x84\xf2\x22\x91\x1c\x21\xae\x9d\x25\x72\x4f\x63\x8a\x60\xc6\xa9\xd5\x20\xb5\xfa\x24\xc5\x3d\x7e\xe7\x51\xe2\x11\x4a\x1c\xa4\xe6\xe6\xc8\xfe\xde\x4a\x3f\xf9\xe6\xc1\xf9\x7d\xe4\x9e\xf3\x64\x57\x17\x87\x92\x2d\xd6\xb2\x59\xbb\x5f\xab\x39\x11\xab\x66\x9c\x0a\xe5\x6a\xb5\x6d\x41\xe0\x9c\x7a\x00\x55\x0d\x40\x25\xe1\xed\x56\x40\xbd\xdd\xf0\x83\x3c\xba\xc7\x76\xba\x93\x8d\xb0\x41\x03\x3b\x65\x3b\xe6\x64\xf9\x0b\xe5\xd2\x10\x72\x04\x85\x25\x1d\x6c\x70\x14\x8a\x4d\x9d\x4a\x58\xaa\x82\x29\x18\x4c\xc5\x6d\xa9\x56\x4b\xb3\x5a\x3f\xcd\x8e\xca\xa5\xa6\x0c\x31\x22\xc8\xe9\xc1\xee\xc0\x92\x28\xc5\x82\x59\xb0\x35\xed\x30\xaa\x20\x4b\xe0\xd0\x1e\xdd\x30\x2b\x6e\x3b\x00\x56\xee\x31\xf1\x14\x8b\xba\x27\xb7\x7e\x38\xc1\x15\x82\x4c\xb7\xbb\x3d\x51\xa3\xd4\x8e\x68\x69\xc0\x6c\x8b\xb2\xb4\x98\x39\x38\x3b\x7e\xec\x4a\x2e\xed\x4a\x64\x79\x2d\x12\x97\xd5\x51\x4d\xf2\x04\xfe\x93\x97\xa3\x35\xcd\x4f\xa8\xbf\xee\x39\xec\x11\x0c\x43\xe0\x5d\x2e\xde\xd7\x57\xa7\xdb\x83\xc6\xa9\x3d\xd5\x9a\x2f\xdf\xaf\xc4\x84\xbb\xed\xd1\xee\xa7\x02\xa9\x70\x98\x15\xb1\xe8\xc9\x64\x3c\xd1\xc7\xa3\xe9\x04\x85\xb6\xa6\x34\x95\xe1\xe3\x34\xef\x22\x28\x5a\xf0\xa4\xfe\x56\x2c\x08\x8c\x2c\x31\x17\xc9\x67\x5d\x91\x38\xdb\x61\x74\x98\x55\xba\x8d\xd5\x75\x83\x44\xd5\x6e\x0a\xc5\x63\x52\x57\xc0\xbb\x71\xbc\xfd\x5c\xd1\x0c\xa4\x78\xc4\xd2\xac\x05\x62\x57\x50\x35\xb6\xfe\x98\x42\x48\x61\x72\x65\x3a\x37\x5d\x55\xf6\x9e\x53\x68\x6f\x40\x0e\xf6\x92\xfd\xb9\xe8\xd0\x39\x3d\x15\x09\x07\xbb\x06\x44\x44\xa3\x49\x0f\x3a\x46\x47\x43\x5c\x94\x26\x2b\xac\xbe\x35\xc9\xb9\xd2\x73\x39\xb4\x0a\x24\xa8\x40\xa1\x3f\x21\xdc\x30\x0c\xd3\xf0\x08\x3c\x0d\x6f\xd5\x27\xd1\x33\xcf\xd4\x9f\xad\x3d\xfe\xe8\xda\x89\xe3\x63\xf5\xcc\x9d\x6b\x8b\x47\x8f\xec\x1e\xed\xef\x0e\x71\xfb\x71\xe5\x36\xae\xb9\xf1\xb9\x04\xbe\x74\x6e\x0a\x57\x9e\xc2\xb5\x0b\x17\xa9\xab\x12\x05\xd7\x29\x48\x51\xa7\x55\xea\xea\x21\x32\x97\x43\x00\xa8\x7b\x47\x26\x35\xc5\x50\xd3\xc4\xb2\x63\x58\x0f\xca\xa5\x1d\xc1\xd4\x00\x51\x37\x3c\xd3\x0a\xa2\x67\x6c\x4b\xc2\xf1\xa4\xb3\x28\xb3\x6d\x3b\x95\x4b\xdb\x31\xd0\x92\x83\x83\x44\x9c\x71\xce\xd8\x3e\x47\xd3\xd5\x76\xec\x5b\x9a\x31\xed\x7b\x1a\x2e\x77\xa5\xa1\x55\x3c\x25\x73\xdb\x72\x63\x0c\xb3\x5a\xb1\xbd\xbe\x42\xc6\x8e\x02\xd9\x10\xcd\xa4\x4d\xba\x69\xfe\x7e\x3d\xce\xba\x65\x5a\xe1\x34\xa4\xa9\x21\x49\xe8\x12\xdc\xb1\x92\xc1\x12\x02\xa2\x49\x77\x30\x98\xee\x08\xef\x11\xfc\x3e\x92\x52\x0e\xaf\x14\x6e\xc6\x0d\x97\xc7\x67\x26\x2e\x5d\x9e\x7f\x98\x3c\xe8\xf2\x85\x83\x4b\x9a\xea\x71\x9d\x1a\xab\x8e\x9d\x18\x95\x48\xb5\xae\x16\xe2\xd9\x9b\x14\xef\x8e\x96\x06\x52\xa8\xae\x84\xb2\xc1\xd3\xd5\xb6\x5d\xbe\xe0\x01\xba\x4a\xea\x9a\x24\x50\x88\x72\xb1\x1e\xd1\x27\x25\x92\xbd\xb2\xa6\x44\x88\xce\xa0\x34\x44\xb9\x65\x9e\xe1\x44\x41\x77\x79\xa3\x44\x2a\x2e\xb9\x8e\x75\x76\xc6\x3c\xe1\x84\xaf\xb3\xa7\x2b\x72\xe4\xc9\x1b\x95\x36\xfc\xd0\xd5\x19\x0a\x0d\x56\x23\xda\xb7\x11\x26\x15\xec\x3a\xba\xa7\x96\x08\xfa\x59\x3c\xae\x68\x9e\xdc\xbe\x64\x72\x06\xa1\x5c\x2c\xd9\x2f\x86\x06\x75\xaf\xb6\xde\xd9\xd1\x91\xfb\x7c\x62\x8f\xaf\x3d\x6e\xb8\x00\x28\x30\xc0\x8d\x3b\x08\x01\xea\x30\x03\x8f\xc0\xf3\xf0\x1a\xbc\x59\x1f\x43\xaf\xbf\x5e\x7f\x03\x5e\xfe\xc4\xd3\x8f\x3e\x7c\xed\xcc\x81\xfd\xd3\x23\xa5\x2c\x61\x1d\xad\x9d\x3f\x31\x3b\xd9\xdd\xe9\xf5\xc0\x11\x3c\xb8\x82\x83\x23\xb8\x6f\xf7\x2e\x62\x70\x1f\xd1\x27\x91\x4a\x07\x99\xbe\x49\x51\x69\xa4\x2a\x80\x82\xcd\x80\x7d\x23\x12\x8e\x72\x4d\x17\xf4\xfd\x01\x4d\xf8\x40\x7c\xd2\x42\x44\x10\x5e\x6f\x45\xc4\xeb\xcd\x90\x64\x83\xf1\xed\x4f\xc2\xf2\x3b\xab\x43\xa8\xba\x0d\x08\x27\x3e\x68\x1a\x11\xe4\x10\xbf\x5a\xc9\x17\xb6\x41\x61\x1a\x19\x9a\x91\x91\xc7\x30\x2b\x66\x3a\x63\x39\xf7\x76\xe4\xd0\x91\x2a\x96\x59\xe2\x28\xa8\xed\x78\x0d\x63\xf9\xb2\x8e\xba\x2b\x56\x90\x8c\x18\x3a\x6f\x9d\xb5\xbb\x75\x5b\x3d\x31\x96\x04\xc3\x1d\x3d\x22\xdf\x43\xd1\xb4\x88\x31\x19\x65\x54\xdd\xdb\x3b\xac\x23\xb2\x40\xf4\x56\x0f\xbb\x02\x98\xe3\x14\xc1\xcc\x69\x7e\x8f\x41\xa8\xe1\x3a\x63\x10\xb1\x30\xbf\x4c\xd0\xb2\x0b\x9b\x66\xfc\xdb\x82\x4a\xb9\x19\x5e\xfe\xa6\x37\x1f\x44\x27\x33\x2a\x3a\x5c\x70\x19\x24\xe5\xd5\x04\x29\xa0\x45\xa3\xfb\x67\xd2\xa2\xa4\x60\x2e\x7a\xdc\x47\x45\x08\x46\x95\x8d\x08\x29\x6c\xbd\xe4\x96\x08\x8a\x77\x49\x3a\x2b\x32\x89\xd8\xa7\xcd\x28\x97\x45\x72\x98\xf5\xa2\x5f\x0e\xae\x62\x32\xd7\x31\x1e\x0a\xf9\x0c\x46\x42\x1c\xef\x52\x52\xbf\xed\x11\x44\x8f\x2f\x59\xdc\xcd\xb6\x65\x06\x59\x2d\xce\xd2\xb4\x38\xf2\x31\xb1\xad\x4e\xcb\x92\x46\xd0\x7c\x24\x37\x24\x0b\xbc\xf6\xbf\x11\x22\xbb\x8b\xc7\x74\xe6\x49\xc1\x47\x85\xaf\xfa\xc4\xb7\xc3\x4a\x62\x74\xaf\x89\x28\xb2\xe7\x4c\xfe\x1c\x2f\x8b\x0a\x25\x32\x5d\x45\xba\x7e\x57\x2c\xff\x86\x9a\xa0\xd8\x20\x9a\x53\xbc\x7a\x34\x58\xed\xda\x45\xf2\xec\xa3\x37\xb6\x7e\x49\x30\xa4\xdf\x33\x29\x81\xbf\x66\x47\x34\x24\xbc\x9f\x00\x18\x80\x19\x78\x14\x3e\x0e\x9f\x82\x37\xeb\xe3\xe8\xad\xb7\xea\x9f\x86\x97\x3f\xf1\xec\x93\x4f\x3c\x72\x66\xef\x78\xad\x3d\x42\xbe\xfc\xdc\x13\x9b\x0b\x07\x66\x6b\x01\x16\xba\xf0\x91\xf1\x24\x3e\xb2\x82\xe5\xc7\x88\x23\xb7\x29\x9a\x26\xa7\x5e\x27\xf5\xa7\xc9\x74\x9c\x3c\xb1\x44\xbe\x58\x40\x3a\x34\xe3\x3b\x96\xa9\xba\xa3\x94\x1a\x7e\x49\xed\xc3\x05\x4c\xf6\x81\xb8\xcf\x5b\xad\x98\x7a\xcb\xc1\x94\x8c\x98\x74\x66\x9b\xf0\x74\x33\xaa\xd1\x30\x78\x2c\xb9\x63\x89\x99\x66\x3c\xa8\x52\x75\x1b\x2d\x96\xad\x23\x7c\xc2\x96\x2b\x60\xfb\xd8\x76\x8e\xa5\x81\xa0\x46\x24\xa9\x61\xe4\x5a\xd6\xd4\xb6\xf0\xb2\x7d\x87\x62\xc5\x4e\xd5\x38\x06\x54\xc5\x74\xe2\xe4\x19\xcb\x3d\xb7\xee\xc7\xfb\x23\xb2\x3a\xf6\x12\x43\xf8\xf2\xb5\x4c\x3c\xd3\x13\xbc\x14\xcf\x4c\xee\x31\x38\x43\xd3\x68\xe6\xb1\x44\xff\x59\x3e\xc9\x49\x05\x16\x11\xdc\xc1\xea\x15\xe3\xf3\x46\x98\xa4\xa8\x09\x8e\xe9\x0a\x87\xd2\xbb\x79\xc3\x50\x9e\x1e\xad\x94\x87\x16\xce\x53\x1d\xe9\xa5\xec\xa1\x64\x34\x15\xef\xce\xa4\x55\x61\x3f\x1b\x1c\x5b\x1c\x99\xd5\xfc\xc9\x60\xbf\xcf\xdf\x16\xa2\xb9\xce\x9f\xef\xe2\x7e\x7f\xb7\x7b\x09\x69\x35\xf2\x60\x90\x38\x4e\xd3\xc4\x72\xec\xd4\x1a\x65\xec\x9d\x0c\x27\x8a\x75\x3c\x2f\x2f\x4b\x64\x38\x6a\x06\x28\x51\x99\x1c\x1a\xab\xcd\x25\x3d\x09\xc5\xa5\xb3\xc3\x0a\xd3\xd3\x2d\x74\x85\x4a\xcc\x11\x85\xf4\x11\x66\x0e\x29\x98\x27\xda\x48\x89\xea\xca\xdc\xd6\x03\x0c\x43\x92\xa2\x57\x8b\xf4\xfd\xaa\xa2\xa8\x3c\x5b\x7d\x64\x6d\x12\x29\xfe\x5d\x71\x53\x17\x45\xd1\xdd\x93\x26\xd8\xee\xd2\x59\x25\xc3\x76\xba\x24\x1a\x63\x92\x63\x5f\xe2\x7b\xd3\x5b\x5f\xaf\xe8\x94\x40\x25\xf9\x59\xf6\x73\xae\xf6\x5c\xc8\xaf\xc8\x8a\x1b\x80\x01\x2f\x98\x58\x27\x64\x48\x43\x0f\xec\x81\x63\x76\xfe\xf3\x2e\x7c\xb5\xbe\x1f\x3d\xfe\x78\xfd\x89\xd4\xc3\x37\x36\xd7\x56\xaf\x1c\x3f\x58\x2f\x76\xdf\x59\x5b\x3d\x7a\xb0\x9c\xeb\xee\x0a\xbb\xf1\xe0\x1c\x4e\xdd\xc6\xa7\x26\x31\xbf\xb9\x32\x88\x97\xda\xf0\xd2\x06\x45\x2e\x50\x7b\xdb\x32\x94\x7a\x98\x24\xbd\x7e\x32\x97\x0f\x93\xd1\xbd\xe4\xf4\x34\x39\xaf\x22\xb2\x25\x22\xda\x08\x99\x35\x02\x06\xcd\xd4\x8c\xda\x88\x22\xe4\x7e\x9c\x95\xcd\xc3\xe3\xad\x48\x7b\xdc\x36\x8a\xb6\x93\x78\x4d\x0f\xc9\x42\x89\x8c\x12\x8e\x48\x73\x42\x33\x1e\x9d\xb0\x8e\x42\xa8\x52\x4d\x33\x71\x26\xbd\x63\xf1\xd8\x5e\x90\xe3\x12\xd9\x9a\x8c\xb0\xd1\x62\x41\x25\x9d\xd9\xce\xcc\xd8\xb8\xab\xda\xd6\x51\xde\xd6\x71\x4c\x7c\x5b\x93\xa1\x1f\x04\x2b\x7d\x5d\x47\x66\xc6\x13\x7a\x7b\xec\xe8\xc9\x15\x23\xc1\x12\x1c\xc3\xe3\x57\x62\x34\xb3\xb7\xbb\x3f\xd6\x59\x7f\x45\xf6\xa4\xdb\x87\x07\xe8\xea\xe1\x25\x8f\xea\x09\xee\xba\x8a\x49\xc6\xe3\xfa\xc6\x48\xec\x47\x13\x17\x7c\xc1\x69\x36\xc4\x4c\x94\x47\xc6\xc5\x8a\xbe\x96\x18\x1b\x2a\xf6\x75\x84\x63\xfd\xdd\x63\x71\xbd\xc7\xc3\x84\x98\x52\x70\xbe\xad\x8f\x32\x8d\xf6\xb6\xf2\x13\x99\x68\xa2\xbf\x72\x30\x7f\xa8\xfc\xb1\x8b\x93\x33\x05\xf3\xb8\xca\x10\xf8\x9a\x3b\x15\xe2\xc5\x93\xd9\xab\xe8\x37\x35\x97\x4a\x44\x90\xfc\x6f\x77\xe1\x84\x5e\xdd\x13\x3d\x26\xc7\xb0\xea\x25\x18\x22\xfc\xdb\x2b\xd9\xbf\xba\x32\xb9\x2f\x1c\xdb\xfa\x12\xa5\xb5\xbb\x84\x3d\x83\x89\x52\x2c\xe0\xf1\x76\x8c\x44\xbd\xcf\xb9\xcd\x00\x65\x92\x9d\x29\x43\x52\x43\x5d\x96\xde\x12\xc1\x85\xf3\xf8\x87\xd0\x05\x7d\x30\x0e\x97\x61\x03\x5e\xad\xd7\x9c\xa8\xe9\xda\x95\x0b\x27\x0e\x1f\x9a\x9b\x19\xe9\xaf\xe4\x7c\x9e\xb5\xab\x57\x16\x4f\x1f\x18\xea\xaf\xe4\x73\x11\x8f\x76\x61\x99\xa5\x49\x92\xbe\xb0\xcc\x32\x34\xcd\x4c\x60\xd8\x4d\xa6\x52\x02\xa0\xc8\x4e\xac\x03\xe5\xee\x37\x23\x04\xef\x8b\x14\xfc\x8f\x75\x56\xe4\x23\xa2\xa5\x0c\xad\xd8\xc4\xdb\xb1\x5c\xe2\xf6\x51\x16\x6f\xfb\xca\x61\x6c\x1a\x19\xa3\x5a\xb1\x3d\xa8\x8c\x25\x5b\xac\x07\x2c\xb9\x62\x39\x45\xd6\x73\x16\x78\x1a\x31\x08\xdb\x4c\xd9\xb1\x7a\x9b\x31\x87\x72\x29\xa3\x9b\x06\xce\x47\xfd\xfe\x52\xea\xa0\x14\xa4\xdc\xd4\x5c\x89\x26\xe7\xe7\x7c\xa9\xfe\xba\x2f\xca\x86\x28\x8e\xe6\xff\xe1\xd7\xb2\xbd\x32\x1d\x67\x09\x32\xc2\x63\x8c\x09\x51\xc4\x34\xfa\x9d\xfc\xee\x0d\x89\x8a\x52\xdc\x37\xe9\xdf\x64\x68\x5a\x32\x7c\x7c\xc2\x94\x5e\x5b\x18\x96\x10\x9b\xfb\x3a\x1d\x67\x18\x35\x12\xe4\xda\x97\x02\x83\xf5\xbb\x5e\x6f\x7a\xeb\x4f\x96\x51\x0a\x1f\x8e\x54\xdb\xda\x8f\x4e\x7c\x36\x58\x61\x19\x22\xe5\xe7\xda\x5c\xf2\x67\xef\x75\x88\x12\xf6\xd3\x7e\xe5\x8e\xc4\x53\xac\x22\xd1\x44\x4a\x6a\x4f\xd1\x3c\x49\x28\x1a\x69\xfa\x59\x35\xad\x8e\xf0\x8c\x80\x69\x5f\x84\x98\xf5\x84\xfd\x3e\x84\x30\x46\x1c\xcd\x4f\x67\x7d\x88\x97\x69\x66\xa8\x5f\x9d\xf8\x37\xee\xb6\x6b\x7f\xd4\xd5\x35\x71\xff\x5f\x73\x4a\x8d\xd5\x5c\xc0\x03\x01\x22\xd6\x09\x03\x7c\x10\x83\x2e\xd8\x07\x67\x61\x0d\x1e\x81\x8f\xc3\x6b\xf0\x05\x80\x54\x33\x74\xb0\x13\x72\xb2\x2c\x3b\x8f\x4e\x13\x8d\x98\x26\xe1\x04\xa3\x2d\xb6\xb1\x88\x60\x1b\x79\x8d\x00\x43\x4b\x72\xa6\xe1\x85\x96\x4b\x99\xed\x48\x84\x73\x95\x78\xe0\x98\x26\xe2\x4e\xd2\xdc\xbe\x55\x46\x1e\xdd\x74\x92\xa1\x69\x77\xe3\x82\x25\xeb\x33\xf1\x66\xcc\xc2\xf6\x6a\xd1\x3b\x13\xb3\xa9\xca\x2f\xe4\x53\x0f\xaf\xf0\x7b\x16\x3a\x8a\x03\x53\xd3\x6d\xe5\x50\x76\x32\xd0\x46\xea\x86\xdf\xc7\xf7\x62\x3e\xda\xf6\xfc\xf1\xdd\xf9\x6c\x92\xe1\x15\x14\xea\xaf\x5d\xee\xeb\xe9\xf5\xf8\x7e\xab\xd2\x99\x0d\x44\x2b\x03\xb1\x88\x19\x08\x4d\x76\xe6\x8d\x60\xf6\x56\x52\x1f\xcd\x46\xdb\xfd\x89\xb0\x5b\x79\x49\x36\x22\x54\x91\x9d\x4e\xe4\xe3\x99\x70\x21\xf4\x78\x40\x11\x52\x9c\xee\xf2\x7a\x3b\xc2\xae\xbe\x7f\xbe\x96\xef\x9c\x59\xb9\x1d\x4c\x74\x57\x17\xae\xa4\xa7\xce\xf5\x5c\xc2\x37\x66\x76\xb5\x8f\xa8\xfb\xae\x6d\xfd\xb7\xe0\xe9\x4c\x48\x42\xb9\xce\x42\x7f\x45\x1d\xe6\x68\xcf\x5c\xe6\xd8\x13\xb5\xde\xbd\x83\x1d\x1c\xc5\x71\x12\xce\x1c\xb9\x3c\x3a\x61\xf8\xb2\x85\x48\xd7\xdb\xa9\x74\xb9\x37\xd3\xdd\x9e\xaa\x65\xd3\xd9\xad\xdf\x88\x24\xc7\x0b\x9d\xa5\xe3\x3d\x91\xce\x71\xf4\xa7\x85\x78\x32\x9c\x08\x25\x0b\x5d\xd2\xa0\x11\x8b\x20\xda\xa0\x07\x32\x9e\xad\x2f\x57\x92\x99\x70\x31\xdc\x9e\x2a\x65\x42\x89\x9a\xcf\xeb\x0b\x44\x43\xaa\x64\x00\x0d\x22\x08\xe8\x4f\x08\x1e\x8a\x70\x04\x6e\xc2\x27\xe1\x0d\xf8\x7b\xf0\xcb\xf5\x43\xe8\x8b\x5f\xac\xff\x0c\xbc\xf3\xfa\xdd\xf5\xb5\xf1\xca\x17\xde\xf9\xe9\x37\x5f\x79\xe1\xe9\x5b\xd7\x37\x56\x8e\xce\x4e\xd7\x87\x6a\x51\x0c\x7e\x62\x2d\x4c\xac\x2d\x11\x99\x12\x41\x4e\x12\xd2\x6e\x82\x67\x0e\xce\xef\x23\xc8\x71\x42\x7a\x8b\xea\x7c\xf1\x05\xea\x13\x1b\x94\x12\x8b\x52\x17\x17\xc8\xce\x4e\xdb\xfe\xcc\x6c\xdb\x9f\x3b\xb9\x8f\xa6\x15\x5a\x6b\xb8\x24\xef\x17\xe4\x1f\xe4\xef\x06\x63\x67\xe0\x8b\xad\x8c\xfd\x45\x87\xb1\x3d\xb4\x47\xa7\x3d\x41\x64\x67\x31\x98\x96\xfa\x0c\xc7\x37\xd9\x91\xf5\x0d\xd7\xc4\x34\x98\x1e\xcb\x1b\xb5\xe0\x66\x1a\xb6\xb3\x5a\x29\x97\xaa\x25\x3b\xc8\xe2\x44\xde\x2b\xd5\x4a\x0e\x59\xa6\x68\x61\x27\x00\xd6\xe0\xf2\xa2\x61\x5a\x7d\x31\x3a\x43\x7b\x2c\x4d\xd2\xd3\xaa\x49\x98\x46\x60\xd5\xac\xd8\xcf\xd9\xa0\xb4\x30\x89\xfe\x04\x31\xb4\x3c\x28\x25\x32\x34\x2f\x08\x82\x48\x10\x88\x0f\x84\xca\x43\xd9\x2e\x6f\xe1\xb1\xd1\xb9\x4c\xbb\x4a\x0b\x41\x8f\xd7\x45\x90\x08\x11\x98\x61\x65\x1e\x23\x9a\xc1\x08\x21\x82\x28\xd0\x6c\xc0\x90\xa5\xba\xaf\xff\x6a\xb7\xf1\x5f\xe2\x04\x89\x08\x5a\x48\x4c\x72\xd2\x39\x8a\x46\x88\x10\x7b\xda\x3b\xf2\x9a\x9a\xd3\xc6\xba\x42\xdd\x5a\x3a\x96\x67\xd1\x5e\x49\x60\x58\xd2\x97\x24\xf0\x8d\x40\xb1\xe0\xd7\x0e\xa8\xe6\x9c\x29\xd5\xa4\x5b\x06\x49\x11\x94\x2a\x0a\x8a\x28\x1b\x7e\xee\xdb\xbc\xec\x1a\x1e\xe8\x0f\xf7\x6e\x08\x14\xab\x0b\x46\x45\x2a\xdd\xbd\xeb\x8e\xa6\xa5\xe0\xa9\xb9\x6e\x8a\x95\xe4\x91\x80\x12\x8f\xab\xfe\x63\x01\x79\x52\x16\x32\x61\x9d\xd1\xb5\x45\x0a\xd3\x14\x47\x2e\x16\xfc\x9f\xf4\xb9\x82\x29\x76\xee\x35\x8a\xfa\xcd\x83\x4f\xfe\x7a\xc6\x13\xed\xe6\x74\x3d\x24\xf3\xbc\x96\x32\x3b\x33\x1c\x39\x96\x73\x47\x49\x9a\x32\x97\xdc\x14\x31\xc2\xba\x55\x82\x23\xaa\xef\xbd\x07\x0a\x50\xf0\xdf\x71\x27\xa4\x41\xb3\x77\x9d\x68\xef\xdd\x47\x4b\xef\xbd\xe7\x64\x66\xf0\x41\x48\x83\xe2\x9c\x07\x06\xbd\xf4\xde\x7b\xdb\x19\x62\x1a\x04\x3b\x87\x5c\x83\x7f\x84\x43\xf8\x16\x64\x40\x05\x80\x37\x80\x06\x15\x7e\xc9\x7e\xde\xc9\xb4\x5a\xd8\xb6\x9e\x47\x40\xa1\xdf\x23\x74\x18\x80\x49\x98\x87\xd3\xf0\x24\xbc\x00\x6f\xc1\xcf\xd6\xf7\xa0\x4f\x7f\xba\xfe\x19\x78\xe3\xf9\xa7\x36\x57\x4e\x1c\xda\x3b\x23\xbe\xf8\xfc\x53\x8f\x3f\x7c\x73\xe3\xc0\xee\x99\x54\xdc\x60\xc9\x4b\x2b\x78\xee\xc4\x29\xbc\x7e\xfc\x18\xce\xd7\xf0\x68\x90\x58\x3f\x47\xe4\x47\x89\x57\xa7\x08\x08\x53\x57\xdb\xa9\xc5\x8b\x67\xc8\xca\x04\xf9\x4a\x1d\x2a\x08\xe5\x1f\x30\x53\x6a\xf7\x73\x3b\x31\xdb\x66\x76\xe3\x83\x39\x3e\xf8\x80\xbe\xca\xc3\xa7\x5b\x61\xfd\xe9\x6d\x7d\x65\x49\xc5\x9e\x07\x4a\x8e\x76\xdc\x6d\x9a\xd1\x77\xac\x5b\xe7\x52\x33\x24\x48\xd8\xa7\x6d\x21\xec\xb6\x83\xbe\x8e\x6a\x4a\xa5\x1d\x93\xc6\x16\x86\x71\xc7\x82\xb1\xd1\xdc\x30\x81\xac\x9b\x9c\x7c\x41\xc3\xfb\x76\x3b\x6f\xb5\x2d\xec\x74\x22\xde\x10\xb6\xe8\xf7\x0c\x5f\x52\xe5\xc9\xd1\xa0\xac\x9b\x14\x4b\xd3\x64\x38\x98\x70\x85\xe2\xdd\x01\x8f\x9b\xa0\xb8\xbe\x34\xed\x31\x10\x45\x6e\xfa\x6a\x6d\xbb\xfa\x0d\xa3\x1c\x56\x34\xdf\x95\x64\xe0\x02\x25\x13\x0b\xa2\x3b\xe8\x37\xb7\xfe\x82\x12\x24\x81\xe3\xd0\x99\x93\x37\xfc\xa4\x8b\xe4\xdd\x87\x73\x9d\x95\x15\x2a\xe3\x2f\x62\xaf\xe9\xe2\xbc\x7d\x1d\xd9\x29\x9a\x66\x44\x5a\xe6\x39\x0d\x9b\x72\xc6\xd0\x54\x81\xc7\x89\x42\xef\xa0\x8f\x1c\xe9\x08\x4a\x06\xc7\x0a\x52\xaa\x4b\x3c\xd6\x43\x18\x01\x33\x91\xec\x09\x78\x72\x7c\x9b\x10\x26\x31\xe6\x7b\x48\x99\x17\x5e\xa8\xcb\x6a\x56\x8b\x4e\xdf\xff\x0f\x7e\x8f\x77\x2e\x90\x40\xaf\x25\xe3\xaa\x7a\xe9\x10\x27\xa0\x99\xa1\x87\x08\xc3\x25\x4f\x31\x2c\x37\xfd\xb5\x3b\x27\x42\x98\xc4\x63\xd9\x91\x52\xe7\x81\x91\xde\xaf\x10\x1c\xbb\x7b\x1a\x73\x3c\xa9\x2c\x87\x4e\x16\x7b\xef\xff\xdf\xe1\x50\xc2\x20\x99\x64\xb2\xfa\xb2\xe8\xca\x68\x7e\xb7\xfa\xfe\xaa\x06\xfb\xc7\x83\xbf\x4c\x48\x30\x6c\x57\x1f\x3f\x0e\x9f\x84\x57\xe1\xb5\xfa\xb0\x13\x5d\xbe\xf7\xf2\x27\x9e\xbe\xb5\x74\xe6\xc4\xde\x3d\x23\xca\xbd\x17\x9e\x7d\xe2\x91\xcd\xd5\xf3\x07\xea\x30\x3b\xbd\x8b\xce\xa4\x52\x19\x37\x8e\x69\xf8\xc8\xe1\x5d\x38\x96\x23\x8b\xeb\x14\xff\x18\x15\x28\xa2\x00\xa0\x58\x6b\x18\xc7\x11\x97\x96\xa8\x6c\x5a\x41\x0f\xda\x41\xf0\x21\x26\x50\xec\x23\xc2\xcb\xcd\xf4\x80\x53\x86\xd6\xb4\x5c\x1e\xb0\x87\xdd\x95\x6d\x0f\x7e\x47\x62\xda\x81\x65\xc2\xf2\xbd\x99\x86\xf9\x6b\x3a\x26\x51\x3a\xdf\xd4\xc8\x16\xc4\xcc\x66\x58\x40\x46\x8e\xb9\x4b\xd9\x35\x3c\x0d\xdb\xd7\xdd\xc0\x65\xb5\x62\x1a\x8c\xe5\xa3\x79\x2a\xf8\xcb\xaa\xbf\x18\xac\xd0\x3e\x9d\x74\x4f\x22\xd6\xe7\x4d\xba\x19\x21\x89\xb9\x39\x43\xe8\x49\x63\x9f\x2e\x49\xc4\x9c\x64\x32\x92\x2f\x62\x98\x72\x3a\x4a\xf2\x15\x52\x09\x19\xe1\x84\x2b\x10\xcc\xac\xfe\x56\xf0\xa9\x90\x8b\x91\x78\x3a\x97\x21\x45\x63\xa8\xa0\x53\x83\x55\xd1\xe3\x96\x25\xb3\x5e\x3d\xec\xc3\x54\xac\x43\xf4\x75\xf2\x3a\x91\x11\xc8\xfa\xde\xad\xb7\x18\x9d\x24\x4b\x81\x5c\x07\x49\x77\xe5\xcf\xf2\x53\x92\xc7\x17\x0d\x2b\x51\x42\x25\x68\xee\x7b\x32\xcb\xea\xaa\x1f\x4b\xfc\xbc\x34\x71\x88\x92\x3e\xd6\x1b\x65\x24\x2f\xc5\xb6\xc5\x02\xd8\xe3\xce\x8c\xb4\xb5\x09\xa8\xb7\xdc\x45\x32\x12\x85\x09\x82\x63\x03\x54\x7a\xb8\x63\x7a\x3e\x55\xa9\xec\xae\xa3\x5f\x93\x3c\x4a\x35\x3d\x99\x09\xfc\xd2\x3d\x89\x21\x23\x7e\x59\xae\xad\xcb\x01\xdf\xde\xd1\x51\xde\xad\xe6\xe2\x8a\x8b\xa2\x04\x92\xe3\x32\x91\xcc\x39\x4a\xf7\x4b\x62\xc2\xf0\xa2\x6f\xb9\xc9\xb0\xaf\xb7\x4b\x43\xca\x04\xed\xa3\x63\x32\x01\xc0\x41\x18\x28\x9c\x27\x38\xe8\x86\xfd\x76\x15\xff\x93\x70\x0f\xde\x86\x2f\xc3\x37\x00\x50\x23\x72\xd2\x28\xa8\x6a\x0d\xb3\x54\x5a\x2b\x10\x1f\x74\x88\x13\x4d\x6a\xd9\xe5\x56\x0e\x53\x37\x9f\x25\x1c\xe6\xf6\xe8\x86\x93\xfe\xb1\x6b\x17\x2d\x67\x7b\xbb\x2f\xa2\x51\xcd\xe8\xc8\x95\x30\xb2\xed\x5f\x19\x31\x05\x27\x3e\x97\x29\x65\x68\xa6\x60\x51\x5d\x2b\xa5\x3b\x51\xc3\x72\xcb\x94\xec\x48\xaf\x59\xc1\xf9\x70\x2c\x6f\x52\xe8\x9f\x7c\x3d\x4f\x8b\x42\xc2\xa3\x63\x82\xd3\x90\xc4\x19\x96\x97\x89\x5d\x99\x45\x8f\x11\xf6\x33\x81\x08\x13\xad\xb8\x8d\xd8\xd8\x5d\xc9\x68\x0f\xf2\xbe\x00\x8b\xbf\x70\x42\x54\x88\xd4\x30\x29\xd5\x99\x74\xce\x9b\xf9\x67\x4a\x47\xd1\x37\xdc\x2d\x10\xbe\xd1\xd2\xa0\xf4\xc6\x58\x49\x3c\x2a\x77\xb0\x82\x92\xdf\xef\x62\xd1\xd9\x81\x80\x7e\xc2\x8b\x15\x86\xa2\xcb\x87\x6a\x41\x6f\x90\xf2\x52\x94\x87\xd0\x35\x2e\xb3\xa1\x49\x86\xc2\x93\xa2\x10\x71\x49\xaa\x5b\xe5\xe2\xfb\x79\xa4\x2b\x2a\xfa\x6e\xa5\x77\x48\x0a\xc7\xd9\x8e\x9f\xdb\xcf\x17\x72\x8c\xf8\xe2\x81\x79\xc9\x1b\x1d\x65\xbd\x9e\x76\x86\x16\x48\x14\xa4\x69\x5e\xa5\x92\x6d\xfa\x49\xb2\xa3\x34\xe4\x4a\x78\xd1\xd1\x17\x0a\xa7\x97\x52\x4c\x6c\x9d\x46\xc4\x5c\x07\xaf\x54\xc2\xa4\xc0\xb8\xbd\xfe\x8e\xad\x33\x8a\x20\xcb\xc9\x30\x4b\x25\xc9\xb4\x4b\x41\xef\x55\xaa\x86\x28\x48\x6f\x09\x6a\x45\x6c\xa7\xb6\x7e\x31\x52\xec\x55\xf8\xeb\x9c\x87\x22\x0f\xff\x17\xaf\xa6\x60\x75\x54\x25\x08\x1c\x98\x27\x3b\xbb\x17\x09\xad\x2b\xb5\xf5\x9c\x9c\xc8\x13\x1c\x4b\x5f\x22\x83\xe4\x94\x46\x49\xb3\x96\x3f\x65\xc2\x45\xdc\x8e\xff\x0a\x3a\xa1\x0c\x35\x7b\x0f\xdf\xe3\xf5\x2a\x5a\x5d\xad\xaf\xc1\xae\xc9\xe1\xfe\x4a\x31\x97\x39\x36\x3b\x39\x38\xd0\x5f\x81\x73\x98\xed\xc2\xee\x30\x9e\x1e\xc5\x07\x8e\xe0\xfc\x25\x0a\xc7\xa2\xd4\x9e\xe3\xc7\x28\x05\x6b\x0a\x42\xec\x76\xb1\xae\xda\x70\xa1\x5b\x52\x8a\x1f\x90\x1e\x0d\xc9\xc1\xc2\x6a\xab\xe4\x58\x75\x5c\xe6\x6d\xd4\x0d\x21\x0b\x1e\x45\xdb\x65\xc6\x36\xa3\x37\x45\x81\x23\x2c\x88\x92\x13\x6b\x29\x39\x91\x7e\x8f\x4e\x34\x93\xcd\x96\xda\x71\xdb\x89\xa8\x1d\xfc\x36\x83\x88\x4e\x0e\xb2\x11\x70\x69\x9f\x3a\xf6\xee\x33\xba\x26\x0b\xda\x13\x93\x0b\x75\x89\x9b\x26\x69\xd5\x33\xda\x15\x94\xfd\x11\xba\xbd\x93\xf1\xb8\x78\x61\x8a\xa0\xe7\x04\x0a\xd1\x02\x43\x65\x31\x81\x83\xaf\xf8\x03\x6d\x79\x8d\x8f\x89\xbf\x4f\x33\xe5\x5b\xc1\x59\x96\x39\x56\x5f\xc4\x4c\xfc\x42\xef\xfe\x0e\x4e\xf1\x2b\xaa\x9a\x99\x1d\x1d\x13\x3b\x33\xcf\x46\x5f\x32\x26\x87\x32\x7d\xb9\xa9\x3b\xac\xd0\xe9\x8a\x66\x87\x29\xda\x90\x4c\x21\xa7\x8d\x84\x28\x44\x91\xbb\xc5\x20\xfa\x6d\x5a\xa4\x93\x53\x34\xa7\x8d\x6c\xf9\x7c\x3e\x3d\xa0\x8e\xa2\x43\xf2\x70\x7b\x32\xa8\xc5\x03\x9d\x07\xb7\xfe\x20\x31\xe1\xda\x13\xf6\xfb\x0f\x65\xe3\x6c\x72\xca\xe5\x9b\x10\x8c\xfc\xd1\x58\x6d\x54\xcf\x06\xbc\x92\x08\xb6\xa5\x22\xe1\x11\xc2\x0d\x3e\x28\xc2\x18\x1c\xb7\xab\xc6\x1f\xad\x17\xd1\xfa\x7a\xfd\x1a\x5c\xbe\x78\xf6\xc4\xe1\xd9\x5a\xf4\xf2\xd9\x3d\xb5\x52\x1b\x9f\x4c\xd3\xaa\x2c\xab\x7e\x0c\x8b\x78\xfc\xe4\x09\x3c\x3e\x4a\xd2\x1d\x64\xaf\x0b\xd1\xef\x8b\x82\xa0\x86\xf5\xfc\x7e\x4f\xf8\xfd\xf4\xe3\x61\xbd\x95\x7e\xeb\xb6\x31\x61\x2f\x72\xab\xdc\x68\x4a\x0b\x27\x15\x9c\xd8\xce\xab\x6f\x27\x00\x9b\xf2\x21\x9d\xd1\x9b\xf2\xe1\xc1\xc4\x72\x83\xde\x4c\xd9\x89\x9d\x19\xa6\x4d\x78\x9a\xb1\xe4\x0c\x1e\xa2\x93\xd5\xec\xf0\xc3\x9f\x09\x96\x12\x1e\x43\xf3\x78\xbd\xfb\xf7\xff\x62\x8c\xe3\xb8\x42\xa1\xeb\xdc\xec\x1c\x21\x4a\x04\x6f\x1a\x7d\xe7\x2f\x64\x33\xf2\x70\xc5\x2b\xba\xc5\x7f\xa0\x69\x6a\x62\x32\x3a\xd4\xa1\x09\x52\x62\xee\xea\xc7\x39\x44\xf7\xde\x0b\x79\xe3\xb3\x8c\x2c\x22\x51\x11\xaf\x19\x66\x22\x2d\x8d\x4a\xda\x90\x94\x4d\xb8\x5c\x5e\xb7\xd1\x91\x18\x44\x0b\x67\x46\xcf\xc7\x72\x04\x2e\x9e\xa2\xb5\xbb\xfb\xf6\x8d\xdf\x7c\x22\xbe\xe7\x8d\xb6\xb6\x7c\xcf\xc5\xd1\x81\xee\x84\x27\xda\x26\xf5\xae\x2e\x7c\xa7\xaa\x50\xd1\x60\xc1\xbf\xbf\xba\xf5\x05\x5e\x60\x31\x49\x72\x26\x8e\xea\xac\x8e\x1e\x66\xdb\x25\xef\x1d\x46\xf0\xd0\xdf\x0d\xf6\x16\x51\x6a\x77\xa6\xa3\xec\x2a\xa7\xe4\xae\xc8\x60\xf4\x7a\x7a\x5c\x1b\x1e\x9e\x4f\x21\x4e\x1a\x01\xbb\x36\x9e\xc7\x29\x22\x00\x55\x58\x86\xc7\x60\xa3\x9e\x45\x77\xee\xd4\xef\xc2\x63\xd7\x96\x16\x67\x26\x27\x06\xfa\x8b\xf9\x74\x6a\xe5\xe8\xfc\x9e\xb1\xde\x5c\x22\x08\xc3\xb8\xed\x3a\xe1\x3a\x74\x90\xf4\x7a\x2d\x42\xba\x5a\x32\xc5\xa8\x95\xf9\x3e\x22\x40\xea\x82\x3b\xad\x34\xbc\xd3\xd0\xde\x32\x22\x77\x4c\x41\xc7\x50\xab\x24\x1b\xce\x70\x23\x02\x51\x35\x4c\x5b\xf9\xd2\x9e\x1e\xd3\x89\x64\x65\xd2\x65\xaa\x19\x44\x4d\x3b\x15\x32\x99\x92\x43\xc3\x74\x39\x11\x27\xed\x80\x6b\x83\xfd\x3c\xb6\xca\x6e\x46\x53\x1d\xaf\xdc\x51\x29\x38\x45\x33\xfc\xd6\x3d\xc6\xcb\x52\x5c\xc8\x23\xcb\x58\xe0\x42\xb2\x1f\x0d\x87\xdc\x02\xeb\x62\x62\xb3\x07\x42\x14\xf5\x19\x42\x66\x49\xae\x1a\xe8\xe0\x7e\x66\x54\x95\x48\xbd\x9d\x7d\x0f\x38\xe4\x1b\xed\xe8\x20\x69\xc6\xbd\x41\xf2\xd8\xcd\x92\x7f\x4a\xfb\xa8\xad\x3f\x0a\x60\x5a\x32\x74\x4c\x23\x85\x67\x32\xb7\x5f\xdc\xfa\x79\x51\xc5\x6e\xb7\x9f\x92\x58\xc1\x4d\x49\x1a\xa7\xfc\xaf\x52\x30\xc6\x9e\xe6\x64\x63\xf8\xcd\xf5\x6b\x42\x4f\xca\x70\x4f\x30\xd2\x5c\x21\x19\xe6\xb2\xa4\xae\xb8\xa4\xb8\xa6\x27\xa7\x52\xac\xcc\x91\x34\x37\xd9\xcd\x12\x0b\x6c\xb7\x5e\xa0\xe5\x7b\x48\x12\x19\xc6\xd3\xee\xa7\xd0\xf3\x04\x47\xe2\xd1\x54\x7a\x17\x1b\x28\xcf\x7d\x0a\x9f\xf6\xb4\xb1\xed\x11\x2d\xd9\xb5\x62\x76\x55\xc4\x2b\x97\x5f\x1e\x8d\x71\xae\xce\x7e\xf2\xf1\xc8\xa1\x99\xe4\x94\xc5\xb5\x01\x28\xe1\x25\x02\x43\x0e\xfa\x61\x1c\xe6\xe0\x2a\x3c\x02\x4f\xd7\xfb\xd0\xa3\x8f\xd6\x1f\x83\xdb\xeb\x8b\xe7\x4f\x9f\x98\x9d\x99\x1a\x1e\xe8\x2b\xdc\x58\x5d\x3e\xbf\x6b\x66\x62\xb4\xcc\x6f\xe0\x64\x0f\x01\xb5\x01\x42\xdd\x8f\x93\x47\xa8\x70\x27\xb9\x6f\x1f\xd5\x16\x6e\x43\xcd\xa4\xae\x53\xb2\xd3\x74\x78\x3f\x3a\x5e\xd9\x92\xc6\x7d\xb4\x95\xf4\x8f\xda\xec\x6b\x30\x74\x9e\xce\xc4\x19\x7d\x3b\x2d\x22\x63\x87\x67\xe3\xdb\x92\xd9\x65\xe7\xe6\xa2\xa6\x61\x32\x7a\x23\xef\x6f\x56\x08\x3b\x8a\x45\x7b\x74\xc3\xd6\xd6\xc5\x4a\xca\xe2\x76\x82\x36\x3c\xdb\x05\x82\x96\x13\x50\x29\x27\x2c\xe9\x50\xa9\x56\xa8\x0a\xea\x71\xb2\x33\xba\x6d\xd0\xe1\x45\xc4\xf0\xe5\x6f\xe2\x69\xdc\x96\x49\x29\x88\xe0\xc6\x86\x11\x27\x09\x0a\xab\x46\xb9\x9a\xa1\xb8\xb4\x32\xef\xa6\x03\x0c\x0a\x7c\x82\x0f\x07\x64\x8e\xa2\x91\xf0\xab\x1a\x42\xa4\xf4\x88\x4a\x52\x2e\x06\xb9\x57\x56\x9e\x9e\xcf\x23\x42\x1b\x55\x69\x9d\x50\xb9\x24\x27\xf7\xc9\x04\xa7\x97\x07\x18\x56\xce\x21\xcc\x6c\xfd\xbe\x49\x71\x48\x12\x10\xef\x61\xf1\x3d\x77\xb4\xc4\x61\x9a\x95\x29\x8a\xef\x21\xb5\x9a\x41\x91\x64\xf2\xc4\x7c\x97\x9f\x62\xa8\x4c\xd2\x95\xc6\xdd\x2e\x32\x4a\x0c\x70\x28\xa8\x0c\xf3\x24\xc5\xa2\x89\xad\xbf\xec\x25\x3d\x98\xf5\xd3\xb2\xfb\xb3\xa4\x11\xf1\xc7\x5e\x16\x78\xe9\xfe\xb7\x08\x99\xc0\x0b\xbf\x24\x93\x04\x93\x43\x1c\xc7\xae\x11\x22\xe7\xda\xfa\x5e\xb0\x77\x43\x1a\x54\x09\x3f\x31\x73\xaf\x6c\x51\x3c\x0c\x09\xfc\x35\xfc\x03\x18\x86\x7d\x70\x14\x5e\x84\x7b\xf0\x59\xf8\x52\x7d\x37\x7a\xe7\x9d\xfa\xe7\xe0\xa7\x3f\x7d\xef\xe5\x97\x8e\xec\xce\xa4\x3f\xfd\xea\xcb\x2f\x2d\x1d\xda\x3f\x57\xcf\x15\xf1\xca\xf1\x63\x78\x18\x3a\xf1\xea\x43\xb7\x71\xe2\x49\x6c\x5e\x54\xbb\x5f\x57\x2f\x1f\xa0\x06\xc6\xc9\xdb\x37\x7b\xc9\x85\x05\x72\x70\xa0\x9b\xbc\xfc\x18\x19\x79\x96\xfc\x54\x48\x69\x96\x7e\xe6\x72\x0d\xad\x5b\xbb\xaf\xee\xe4\x61\x9b\x98\xb0\x77\xd0\x7c\x28\x2e\xb6\xab\x3f\xdf\x69\xc5\xc4\x3b\x0d\xff\x50\x46\x3b\x39\xb8\x44\x3c\x93\x45\xdb\xc5\x21\xcd\xe0\x9b\xe2\xe4\x41\x74\x3b\x38\x6d\x17\x91\x38\x14\x2f\x1a\xe6\x76\xfd\x8f\xad\xc0\x2d\xb3\xdf\x29\xf2\xac\x0c\xa3\x52\xba\x4c\x37\x2e\x1a\xce\x36\x81\x56\xb5\x51\x6e\x44\x41\x9b\xa1\x3a\xa7\x7a\x80\x49\x18\x4e\x99\x5d\x22\x9e\xb1\xd5\x05\xfe\x1a\x41\x67\x38\xb7\xcc\xf1\x2c\x13\x1a\xec\xdc\xdf\x3b\xd2\xb1\x6a\x32\x4a\x2c\xbd\xff\xe4\x59\x7c\xac\x5f\x47\x8c\xc6\x7c\xbc\xff\xec\xe6\x80\x10\x40\x32\xd6\x1e\xe6\x62\x4c\x47\x3b\xd3\xf9\xae\xc2\x08\xde\x48\x7d\x9a\x45\x0a\xd7\x53\xf7\xfe\xad\xc8\x7a\xb2\xac\xcb\x50\x30\x6d\x26\xdb\x5c\xc6\x61\x8c\x38\x53\x5b\x99\x5a\x2f\xf5\x1e\xf1\x7a\xc3\x6e\x49\x20\xe5\x74\xb5\xeb\xca\xf4\x98\x77\xf2\x6b\xbd\x53\x83\x04\xa2\xe9\x47\xdc\x14\x3f\x23\xb3\x9e\x83\x66\x75\xaf\xbb\xaf\x27\x99\x45\x39\x6f\x17\x22\x55\xd1\xa7\xeb\xc3\x86\xe6\x55\xce\x66\xa4\x49\x6d\xe9\xc0\xb9\x99\x79\x6c\xa6\x70\x40\xdf\xcb\x62\x6f\xb4\xb2\xbe\xe9\x8d\x61\x8f\xae\xf4\xcb\x3e\x0a\x77\xfd\x86\x87\x62\x3c\xa6\x4e\x2a\x94\xc1\x65\x5d\xf4\xd6\xbf\x8c\x30\x82\x87\xeb\xcf\x31\x26\x85\x48\x4a\x34\x4b\xd8\xb7\xb8\x30\x79\x62\x6e\x9f\x4a\x53\x0c\x36\xf4\x76\x12\x63\x29\xb6\x79\xf5\xd6\xae\xb6\x6b\xde\xdd\x09\x6f\x84\xd3\x18\xe9\x1f\x30\xaa\xa1\x09\x3c\x50\x90\x81\x1a\xfe\x0a\xfe\x3f\x6d\xa4\x1d\x87\xa7\xe0\x65\x78\xa2\x5e\x41\xaf\xbc\x52\xbf\x07\x2f\x3d\xfb\xe8\xcd\x8d\xb3\xa7\x8e\x1d\x98\x1b\xeb\x2b\xb9\xd4\x4f\x3c\xfd\xf0\xed\xf5\xe5\x13\x05\xaf\x3c\x8e\x05\x01\x4f\xd5\x09\xc8\xe2\xfd\x47\xf0\xe2\x25\x2a\x93\xa1\x90\xb7\xa5\x7a\x6e\x27\xd4\xf0\x51\x32\x65\x1b\x41\x5e\x78\xa5\x15\x41\xaf\x38\x08\xc2\x3b\x8e\x9f\x53\x0f\xbc\x13\x0a\x77\x3e\xc3\x28\xbd\xbd\xc1\xa3\x11\xe0\xb6\x03\xde\x05\x27\x24\x90\x21\x8c\x86\x9c\xa9\xda\xe1\x85\x4c\x23\x0a\x6e\xb5\x14\xd4\xac\x13\xd9\x2e\x11\x49\x38\x00\xa2\x1b\x9b\x3f\xac\x0f\x55\xca\x34\xad\xbf\x0a\xfe\xca\x7e\x51\x77\xbb\xfa\x87\x99\xa0\x47\x1b\xf6\x16\xdc\x73\x7b\x38\x93\x66\x10\xa7\xfb\x18\x92\x62\x64\x8e\x2d\x1e\x32\xf8\x20\xa7\x72\x02\x4a\xb7\xd3\x02\x2f\xfb\x3c\xfb\xdb\x35\x55\x0d\xa8\xe4\x2c\x52\x28\x06\x19\x6e\x59\x11\xb7\xfe\x25\xa7\xf2\x9c\x84\x04\x53\x40\x91\x8e\x83\x9c\x8b\x3c\xda\x33\x21\xf3\x5c\xdd\x2b\xb8\x8c\x58\xe2\x3a\xcd\x6b\x1e\xf9\xb1\x5d\xb2\x39\x29\x45\x04\x86\x22\x09\x4f\x72\xeb\x9f\xc4\x38\xb7\xce\x31\x6c\x1f\xfa\xbe\x6f\xeb\x97\x03\x59\x96\xa3\xf7\xaa\xfa\x3e\x37\xcb\x8e\x3f\x87\x4d\xaf\x36\xcd\x8b\x1e\x3f\x3b\x70\xfa\x56\xcc\xef\x0f\xbb\x48\xc4\x91\xed\xa2\x47\x53\x23\x6d\x0c\xc1\x48\x73\xe3\x82\x20\x1d\xd8\x1d\x91\x8f\xb1\x5b\x2f\xf1\x49\x8a\x77\x99\x54\xf9\xc8\xd4\x74\xfb\xaf\xab\x86\x99\xaa\x30\x04\x15\x9d\xa2\x99\xea\x2a\xa9\xb8\xbc\xb5\xae\x4e\x8a\xaa\xbf\xf3\xa5\x72\x24\x5a\x5f\xd2\x67\x5e\xe3\xbd\xd9\x68\x54\xdd\xfd\xcc\x3f\xe3\x33\xae\xc1\xba\x2c\xbb\x15\xf5\xe7\x2c\x1f\x40\x02\x06\xcf\x12\x26\xf4\xc3\x15\xb8\x69\xc7\xae\xde\xae\x8f\xa0\x17\x5f\xac\xbf\x04\x9f\xfc\xf8\xc7\x1e\xb9\x79\xed\xf2\xd1\xc3\xfb\x46\xeb\x95\x82\xe1\x7a\xfe\xa9\x47\xaf\x5f\x5d\x59\x3e\xb8\x67\xb6\x2b\xed\x97\x79\x51\xa6\x97\x2f\x5c\x58\xde\x37\x4f\x47\xc3\xe1\x68\x6d\x80\x80\x5b\xf8\x5c\xdc\x32\x42\xfc\x0f\xec\x32\xa8\xfd\x98\xcc\xca\x07\xb7\x31\x35\xa0\xe4\x87\x17\x5b\xa1\xf4\x62\x4b\x64\xc1\x32\x1a\x1a\x39\xfc\x4c\x33\xa8\xd0\xe2\x9d\x3a\x49\x5d\x47\x85\x35\xca\xcf\xc2\xc8\xb1\x1f\x77\x42\x5c\xce\xf3\x0d\x20\xed\xf8\xb4\x8d\x40\x85\xa7\x64\xda\xc9\xda\x32\xcd\xe8\x86\x69\x7b\x18\xcd\xfe\xec\xea\x12\xc7\xf3\x9c\x8d\xce\x5c\x3f\xf0\x86\x2c\x09\x7c\xac\x32\xa4\x8a\x3c\x2f\x8e\x0c\x12\x0c\xcf\xb0\xbc\xc9\xa6\x96\xff\xe1\x18\x29\xa9\x92\x4e\x29\xc3\x0a\x29\xbb\x48\xd2\x45\x75\x45\x35\x99\xf5\x07\x39\x96\x3d\xe2\x76\x09\x34\xc5\xca\x62\xac\x9e\x69\xc3\xae\xda\x23\xcc\xdf\xa7\x84\xc9\x7e\x99\xe6\x59\x8a\x26\x02\x7a\xd0\x34\x3a\xfa\x23\x8f\xff\x37\x46\x20\x29\x19\x7d\x1f\xfb\x83\x94\x86\x59\x01\x93\x5e\x61\x15\xc9\x1e\x21\x4e\x7d\x91\x1f\xf6\x18\x9a\xcf\xd3\x1e\x8d\x6a\x53\x8a\x38\x7c\x74\xf7\x2e\x24\xf2\x65\xa3\xcb\x9d\xe0\x29\xad\x43\x29\xe7\xdc\xfc\x28\x41\x0b\x74\xbc\x3c\xe1\x4a\xce\x22\x9e\x25\xa5\x15\x8d\xf6\x84\xbd\x3e\xf7\x40\x3a\xed\x2b\x56\xd7\x14\x99\x65\xc6\x75\xc5\x8f\x42\x81\x8a\x8b\x57\x4b\xe9\x94\xeb\xc4\x44\xda\x64\x49\x82\x95\x58\xf2\x82\x0f\xfd\x07\xd9\x9b\x42\xb4\x48\x1e\xc1\x5b\xff\xb6\xff\xdc\x95\xac\x47\x8f\xb7\x4b\xc1\x2f\xe0\x77\xe5\x44\x1e\xc5\x08\x72\x0f\x05\x40\x82\x02\x21\x7c\x8b\xf0\x40\x0f\xf4\xc3\x34\x5c\x87\x2f\xd5\xe7\xd0\xe6\x66\xfd\x06\x9c\xdc\xbf\x77\xcf\xec\x48\x25\x9f\x88\x79\xcf\xee\x9a\x9b\x99\x1a\xa9\xb4\xb9\xe9\xd9\x99\xd9\x39\xba\xab\xbd\xbd\x6b\x66\x96\x9e\x9d\xab\x56\x2a\xd5\x75\x0c\x85\x3c\x01\x03\x04\xbb\x4c\x4c\x84\xf0\xa1\x73\x94\x1c\xa0\xa6\x8e\x76\x21\x19\x90\x7b\xdb\x33\xa9\xb5\x16\xaa\xd6\x9c\x10\x15\xbb\x0d\x2b\xb6\x15\x56\x1f\x92\x9f\x75\xc3\x66\x2b\x98\x36\x5b\x6a\x58\x1b\x24\x6f\x78\x8b\x43\xb8\xd8\x63\x57\x00\xd8\xd0\xca\x12\x19\xdb\xf2\xdd\xf6\x3f\xcc\x86\xe7\x99\x45\x99\x46\x01\x3d\x91\xa1\x2c\xc7\xb4\x09\xbc\xe6\x6e\x12\x66\x27\xb9\xb4\x1d\x50\xc5\xb7\x08\x39\x1d\x0a\x0e\x0e\x15\x2e\xcc\x76\xf7\x3d\x1c\x36\x87\xb4\x01\xfa\xf1\x60\x8f\x4b\x73\x69\x15\xa9\x4f\x89\x20\x4e\x46\x9f\x94\xd8\x5e\x92\x0b\x60\xb6\x9d\x26\x38\xde\x97\xe7\x19\x9d\x77\x07\x82\x7a\x87\x64\x6c\xdd\x4b\xd0\x67\xf8\x48\x32\x3c\x33\xd8\x9e\x4d\xa7\x59\x97\x28\xf5\xdf\x4b\xcd\x8c\xc7\x3a\xbd\xba\x8e\x44\xa1\x12\xc7\xd7\x58\x4e\x94\x38\xee\x9f\x9e\x3b\x53\xed\xf2\xbb\x07\x73\x09\x82\x9d\xe5\xbd\xab\x7b\x7a\x77\xd5\x47\x90\x8f\xe8\xf4\x5e\x57\x25\x7a\xae\x8f\x37\xc6\x8c\x36\xda\x95\xf1\xf9\xb2\xfc\xd6\xdd\xd0\xdf\xa9\x3c\x4f\x17\x9e\xfb\x64\x2e\xd8\x95\x47\xbf\xbd\xbc\x9b\x31\xe7\x63\x6f\x7f\xbc\xda\x3f\x10\x0b\x85\x08\xaf\xa6\x5e\x53\x65\x5f\xac\x36\xb0\xbc\x7f\x3f\xd3\x96\xc2\x92\xc8\x00\x09\x29\x70\xe3\x65\x7c\x1f\x3a\xe1\xac\xbd\xc7\xfa\x6e\xbd\x82\x6e\xdc\xa8\xdf\x84\x2b\x17\xcf\x9f\x39\xb9\x6f\x78\x20\x1c\xa4\xf1\xfa\xa5\xa5\x89\xde\x52\x3a\xe1\x62\xe9\xc3\x18\x8e\x61\xe8\xc2\xb0\x40\xc0\x06\x29\x8e\x91\x86\x81\xc4\x07\x3c\x96\x46\xc6\xfd\xa3\x2a\xc7\x1e\x70\x5b\x6e\xb4\x52\xf3\x46\x43\x34\xc4\x9d\x4d\x49\x8d\x72\x74\x6c\x57\x5d\xc4\x1d\xa6\x2d\x16\x1a\xc5\x1e\x3b\xce\x68\xd3\xc1\x74\x6a\x38\x98\x74\x66\xbb\x28\xc4\xde\x31\x61\x36\x0b\x0f\x9d\xb0\xb5\x59\x31\x4b\xf6\xf5\x21\xc4\x6c\x9b\x2c\x15\xbc\x7c\x24\x96\x0c\x06\xdc\xd2\xa7\x58\xa9\xc6\xd2\x77\x85\xa7\x65\xc2\xa3\x67\xb4\x70\x4d\x96\x6f\xd3\x7a\x9d\x43\x89\x1e\x2d\x51\x18\xa8\x4a\x48\x95\xdb\xb4\xa8\xb7\xe0\x0b\x86\x72\xba\x16\x8d\x60\xee\x16\x8a\xd3\x0a\xeb\xf6\x88\x14\xc3\x8f\x31\xdd\x7e\xa2\x8d\x23\xd9\x17\xb9\x83\x06\xd5\x15\xa2\x58\xaa\xf6\xcf\xfd\x04\x51\xee\x95\x04\x91\x5d\xfb\x96\x34\x97\x0c\x87\x4f\x05\x44\x26\xd5\x2d\xf3\x78\xaf\xc9\x89\x1d\x84\x18\xef\xdf\xff\xce\xa4\xd4\x66\x48\xef\x8a\x62\xac\xcb\xe8\xa2\x89\xe1\x7e\x59\x16\xb0\x7a\xba\xe3\x9c\x9a\xe0\xc7\xc7\x2e\xb3\xe1\x3b\x0f\x61\x1c\x13\x5e\xee\x38\x98\x9e\x98\xad\x87\xd3\x06\x8f\x39\x91\xa3\x82\x1b\x61\x52\xf8\x59\x34\xd3\x41\xc9\xde\x4e\x8a\x44\xe5\x25\x8f\xaa\x62\x23\x6c\x71\x73\x37\x84\xf1\x57\x09\x0c\x19\xe8\x81\x3a\x9c\x86\xb3\xf5\x24\x3a\x73\xa6\x7e\x16\x4e\xec\x9b\x1d\xee\xed\x6a\x8b\x1c\x98\x1f\xe9\xeb\xcd\x77\x77\xb5\xb9\x21\x46\x8d\x8f\x99\x88\x7f\x90\x4d\x3f\x34\x62\xbc\xcd\x86\x67\x5a\x09\x77\xe6\xc3\xa2\xc5\x16\xb3\xb4\x86\x19\x9b\x5b\x3f\x1b\x51\x44\xd3\x48\xd9\xf7\xe4\x50\xc3\x6b\xac\x50\x0d\x6f\xb3\x29\xdb\xe9\x44\x33\xca\x63\x3b\x16\x5f\x2d\xc5\xe3\xe7\x7f\x89\x8f\xfa\x15\x75\x8c\x50\xdd\xba\x48\xe2\x43\xd5\x68\x78\x54\x32\x08\x82\x94\x5f\xac\xb9\x23\x41\x9a\xf4\xc4\x08\x85\x91\x24\x6e\xeb\xf7\x25\x92\xc0\x92\x9a\xe1\x14\x5e\x17\x51\x8c\x95\x83\x1d\x5f\x6a\xa3\x5c\x94\xc0\x92\x12\xaf\x5f\xe8\x90\x34\xcc\xfa\x68\x26\x39\x75\xe3\x96\xca\x91\xa4\x6a\x62\x96\xe9\x53\x16\xbe\xfa\xed\xbd\xc1\x59\xa4\xf0\x7b\x46\x9f\x2c\x16\xa7\xcd\x4c\x28\xe0\xe6\x1f\x49\xc5\xfb\x69\x51\xec\x0a\xb1\x97\x13\xfd\xb9\x9e\x91\xa7\xd3\x4c\xac\xb2\x9f\x3a\xf4\x65\xe2\x74\x6a\xa6\x83\x18\x9d\x7c\x61\xe2\x13\x2e\x29\x36\xb5\x20\xac\x7e\xd7\x95\xa2\xe5\x30\xd0\xc0\x40\x80\x30\xf0\x5f\xc3\x88\x5d\x47\xf5\x0c\xdc\x83\x77\xe0\x95\xfa\x30\xfa\xdc\xe7\xea\x9f\x1f\xf8\xcc\xab\xaf\x3c\xf7\xe4\x63\xeb\x57\x2e\x9c\xdd\x33\x9d\x35\x35\x81\xf9\xcc\x0b\x4f\x3e\x76\xf3\xf4\xec\xe8\x40\x34\xcc\xd0\xe4\xb3\x78\x63\x12\xbf\x7a\x9b\x82\xb1\x51\x2a\xbf\x8b\xca\x1f\x24\xdb\xda\x10\x00\x0a\x3f\x18\xe3\x6f\x46\xe7\x7e\x8c\x16\x6e\x92\x2c\x0c\x9f\x6b\x25\xd9\xe7\x6c\x92\x39\x0a\xb7\x6c\xd3\x2c\x8b\x1a\x12\xaf\xe1\x1b\xa4\x9d\xb4\x66\x4b\xf0\xa7\x99\x2e\xda\xd6\xaf\x32\x22\x12\x8e\x3b\x40\x6d\xab\xe4\x1d\x17\xa3\xc9\x7b\x8d\x87\xec\xd6\xb6\x59\xe8\xaa\x36\x6e\xab\x54\x2b\xcd\x1d\xee\xb6\x03\x4a\xef\x9c\xaf\x56\xf0\x19\xee\xe0\x9c\x4f\x2f\x52\x3e\x0f\x2d\x9c\x70\x91\x18\x0b\x3e\xca\xf0\xb9\xe9\x62\xaf\x4f\xd3\x69\x8a\x12\x04\x59\x45\xe2\xd0\x95\x5f\x10\x69\x8a\x46\x4a\x34\xce\xcf\x1c\xa5\x75\x3d\x40\x13\x1d\x5d\x3e\xba\xef\xb8\xce\x87\x88\x18\xc2\xe3\xcf\xce\x79\x24\x45\x65\x17\x43\xde\x51\x89\xa5\x69\x42\x57\x90\x7e\x5c\xd7\xe3\x3c\x49\xcb\x5e\x45\x75\xa5\xe3\xb1\x5e\xce\xe5\xf7\x7a\x67\x2a\x02\x39\x10\xfe\x8e\xa0\x53\x3e\x93\xd1\xbd\xa1\x2f\x08\x06\xe2\x28\x96\xc3\xfc\xaf\x24\x45\x82\x51\x63\x98\x92\x43\x8c\xa4\x04\xda\x92\xf2\xe9\x47\x28\x22\x12\xf4\x49\xba\xaa\x0e\xdf\xd5\x7d\x01\xcd\x4d\xf1\x02\xcf\xa5\x17\x17\xaf\x1d\x76\xc7\x0f\x99\x82\x1e\xa4\x62\xbe\x50\x0c\xd3\x34\x27\x32\x9e\xe1\xdf\xfc\x37\x59\xbe\x07\xbf\xc3\x97\x44\x9a\x2b\xf7\x98\xa5\xa7\xa7\xf6\x09\x0a\x53\x98\x1c\x1c\xf4\x5d\xde\x5f\xa2\xa3\x4b\x4b\x3f\x23\x10\x27\xfb\xfb\x29\xa6\x52\x39\x16\x9d\xbd\x70\xf8\xb0\xa9\xfb\x0c\xc4\x7f\xfe\x4f\x29\x99\x9e\x9f\xf1\x8b\xfc\xd1\x93\xd9\x13\x28\xee\x51\x54\x7f\x9c\x63\xd0\xd5\x80\x87\xce\x1d\xfe\xc3\x48\x2f\xc5\x67\x76\x3f\x02\x14\xb0\x20\xe1\x3b\x04\x0b\x83\x30\x06\x8f\xc0\x93\xf0\x06\x7c\xb1\x3e\x85\xde\x7c\xb3\xfe\x29\x78\xfd\x13\x4f\xde\xd9\xb8\x70\xfc\xe0\x4c\x7d\xa8\x23\xfd\xc2\x53\x77\xef\x3c\x7a\xe9\xd4\xc9\xdd\xa3\x43\x31\x38\xb7\xc8\x45\x42\xa1\xc8\x2b\xaf\xd2\xd6\x9f\x75\x3c\xbf\x7f\x62\x1c\x0f\x88\x34\x75\xfb\x36\xc5\xa9\x94\x51\x46\xbe\x96\xfc\x52\xa3\x66\xaf\xf1\xd5\x08\xff\x63\x9b\xf0\x43\xe3\x15\x31\x78\xb3\x15\x87\x6f\xee\x88\x8e\xe6\x8e\xf3\x1d\x18\xb6\xe4\x2a\x2b\x3b\x39\x23\x07\x53\x4d\x58\xe9\x86\x13\x79\x72\x37\x54\xbd\x2d\xfb\x19\xcf\xb6\x10\x61\xec\xdd\xbb\x4e\x48\xb2\x62\xbb\xb5\x8d\x8d\xa1\x8d\xe8\x31\x53\xb2\x85\x91\x99\x29\x35\x82\x58\x4c\x33\x2b\x52\xc1\x77\x08\x2d\x6c\xf6\x88\x03\x2e\x2e\xc5\xea\x8a\x28\x60\x4a\x33\x95\x3e\x75\x58\xf1\x88\x14\xc5\x69\xfe\x1a\xb3\x3c\x2e\x06\x35\xcd\xc5\x28\xba\x54\xce\xf9\x49\x95\xd4\x0d\x45\xe4\x78\xfa\xdf\x07\x55\xdf\xdf\x06\xa8\xa8\xde\x19\x8f\x63\xbf\x89\x59\x5a\x0b\x69\xda\x74\xf7\x52\x99\xe1\x08\x37\x6f\x50\x94\xd4\x1b\xd0\x29\x1e\xfb\x35\x45\x9a\xea\x68\xe7\xa8\x58\xdf\xe0\x3f\xba\x18\x0b\x04\x7e\xa8\x20\x4e\x21\x75\xde\x4b\x88\x2a\xa6\x15\x4e\x34\xff\x1e\x27\x0e\x9b\x2e\x82\x8a\x98\x5e\x4e\xeb\x11\x58\x6e\xb8\xbd\x63\xea\xc5\x5f\x8d\xb3\x07\x70\xb0\x33\x18\xec\x96\xc2\x1e\x49\x14\xd8\xa7\x0e\xbe\x70\xed\x1a\xe9\xfe\x9d\x17\x5f\x0b\x7b\xaa\x5b\xb7\x99\x9e\x7f\x9f\xdb\xe2\x19\x8a\xee\x7d\xeb\x93\xe3\x12\x33\xd2\xd1\xf9\xb5\x43\x6e\x82\x91\x43\x49\xf9\x5f\xcd\xff\x3d\xcc\xb1\xe1\x01\x7a\x71\xa4\x5d\xff\xe4\xc1\x83\x58\x96\xbb\xb9\x6f\xb3\xf9\x5d\xb5\x01\x43\xaa\x8a\x23\x4f\x9e\xfb\x86\x27\x9e\x98\x5d\x10\x47\x9e\x48\xed\x0a\xda\x19\xf2\x1c\x76\x11\x12\x84\x21\x07\xbb\xe0\x04\x5c\x85\x5b\x70\xbd\x9e\x47\xb7\x6f\xd7\x1f\x82\x1b\xab\xbd\x1b\xab\xbd\x3d\x27\xf1\xee\x21\x42\x91\x23\x18\x32\xb8\x74\xfe\x1c\x3e\x34\xdb\x45\xb1\x67\xa9\x23\x09\xd2\x77\x91\xda\xcf\xfa\x10\x92\x1f\xdc\xd6\xda\x44\x51\x73\x17\x4c\xf6\xc1\x0d\x5d\x32\xdc\x6e\xc5\xc9\xed\xf7\xef\x56\x6a\xdd\xa9\xbd\xb3\x5f\xad\x59\x1c\xe4\x14\x60\x51\xcd\x00\xf6\x8e\x44\x32\x9a\x79\x83\x46\x72\xb1\x01\x06\x67\x2b\x74\x22\xce\x34\xcb\x89\xca\xa5\x8a\x99\x66\x68\x26\x6e\x14\x87\x10\x76\x25\xbb\xe7\x4c\xaf\x1e\x38\x3f\x9a\x8c\xc7\x14\xd2\xe5\xea\xcf\xbb\x26\x7d\x7b\x86\x7a\x22\xde\x48\x61\x6c\x75\xa5\x27\x72\x57\x1d\xd3\x0f\x94\xb2\x5b\xff\xc7\x44\x26\x49\x12\x6e\x56\xe4\x38\x0e\x21\x49\x10\x48\x81\xe7\x55\x9e\xf4\x90\xa9\xdf\xd5\x7d\xb9\xc9\xa0\x52\x8b\x8a\xe9\xe1\x51\x4f\x20\xa5\x72\x2e\xc3\xa3\xaa\x0a\xee\xe0\x75\x1f\x81\x34\x85\xd5\xd1\xcd\x99\xf9\x0b\x71\x49\xe2\x8b\x81\x93\x87\xcb\xa7\xc9\xbd\xa1\xe1\xce\x72\x17\xa9\x1f\x9d\x58\x3d\x3a\xb1\x78\xe7\x67\x1f\x9d\xbf\xf4\x95\x8b\x92\x7f\xdf\xc4\x27\x7b\x8e\xee\x3b\xdc\xef\x37\xea\x94\x99\x4c\xb4\x25\x0b\x03\x9d\x9d\x8a\xe1\x72\x47\x28\x82\x47\x66\x3e\xde\xb9\x3c\xb0\xeb\x29\x31\xf1\x6a\x21\x5c\x9e\x90\xf7\xba\x87\x66\xa3\x41\x0f\xe6\xdb\xb0\xc7\x8f\x48\x3a\x09\x0c\xb8\xc0\x8d\x0d\x82\x86\x24\xf4\xc0\x2e\x38\x64\x7f\x23\xcd\x1d\x78\xa1\x3e\x8c\xee\xde\xad\x3f\x0e\x8f\xdd\xbe\x7a\xe1\xf8\xde\x81\xee\xf4\xe5\xfd\xbb\xc7\xfb\x3a\x53\x81\xb3\xf8\x30\x8f\x87\x06\x19\x3c\xf2\x30\x3e\x75\xe2\xc2\x0d\xe2\x70\x1e\xc3\x01\xd2\x5d\x25\x63\x2b\xe4\xe2\x4d\xf2\x7a\x0c\xb9\xdf\x57\xe6\xdb\x12\xb1\xaa\x35\x43\x59\x1f\x94\x0c\xdb\x15\xbe\x77\x5b\xa9\x7d\xb7\x59\x35\x6e\xeb\x05\x5b\xd9\xa4\x77\x08\x4f\xb4\x6c\x55\x63\x32\x2d\xa5\x74\xa5\x86\x02\x52\xdd\x95\xaa\x6d\xf1\xa5\xb7\xf7\x3e\x11\x76\xb4\x2a\xef\x90\x9d\xc9\x94\x1a\xd7\x8a\x05\xc6\x4e\x38\x1b\x89\x46\x46\xca\xcc\xd0\xf6\xc6\x13\x4f\x05\x1b\xfb\x46\xe2\xa3\x88\x72\x4b\x05\x81\x8e\x7a\x25\xd1\xd4\x19\x51\x53\x29\x71\x7e\xa4\xed\xf5\x5d\x47\xaa\xa6\xd8\x59\x0a\xcf\x9a\x6c\x6f\x75\xa0\x50\x68\x1f\x2b\x48\x9f\x9d\xe9\x1a\x1d\xa7\xf9\x88\xc7\x93\x2b\xe4\x66\xff\xcc\x87\xe5\x1b\x31\xe9\xe0\x8b\xfd\xc5\x3e\x51\x4c\x32\xb9\x45\x3f\x9d\x71\xab\x6d\x09\x44\xb1\xb4\xae\x71\x82\xa8\xe9\xed\x04\xb9\x1b\xfd\xd9\xe4\x86\x2e\x1a\x04\x19\xdc\x08\xa6\x29\x12\x61\xc4\x31\x21\x9f\x1a\x44\xe2\x5f\x1c\xd0\x19\x45\x60\xfb\xc7\xb6\x30\x8e\xb9\x79\xd5\x54\x74\xb7\xf9\xc7\xc3\x5d\x69\x97\xe4\xdd\xfa\xf3\xad\x2f\x88\x34\x63\x1c\x35\xf8\x34\xa7\x52\x18\xb3\xba\xfb\xce\x56\x25\xad\x65\xdc\xe8\x7e\x39\x19\xc6\x02\x0a\x1b\xc7\x0c\x9d\x44\x35\xd5\xe0\x12\x14\xc2\x38\x25\x22\xcc\x2a\x7c\x8a\x0f\xdb\xd5\x2e\x06\x0e\x10\x04\xc4\x61\x18\xc6\x60\x0f\x5c\x85\x87\xe0\x15\xf8\x66\xfd\x30\xba\x77\xaf\xfe\x6a\xec\xe6\x81\xbd\xbb\x27\xc7\x46\x6a\xfd\xdc\x2b\x2f\x7c\xe2\xe1\xdb\x1b\x47\x77\x8f\x8d\x0c\xa5\x62\xa1\xb9\xdd\xdc\xc8\xc8\x68\xbd\x3e\x72\x48\x7e\x72\x13\x9f\xbb\x84\xcf\x69\xb8\x50\xc0\xee\x0e\x1c\x98\x7c\x12\x9f\x5b\xa7\x2e\xdc\xa1\x2e\xcc\x90\x52\x96\x34\x2b\xe4\xf8\x73\xe4\x49\x13\x11\x80\xb4\x07\x61\x91\x6b\x96\x28\xd4\x76\x76\x9c\x58\x7e\x20\xfb\x63\x0a\x36\x1b\x50\xd1\xe0\x5e\x2b\x54\xee\xd9\x0a\xa4\xb9\xa3\x3d\xf3\x81\xbd\x8c\xce\x66\x76\x8f\xde\x50\x22\x3b\x3b\x14\x1d\x3e\xb7\xbf\x51\x24\xad\xa0\x61\x44\xc5\x33\x8d\xb2\x4d\xda\xde\xc1\xd2\x04\x5e\x6b\x39\x58\xa3\xac\xd0\xc6\x92\x65\xf6\x94\x4b\x0d\xb1\x61\x5b\x41\x8e\x46\x71\xb6\x19\x63\x81\x9a\x91\x28\x43\x56\x58\xd2\x37\xd4\xd3\xed\x8f\xdc\x21\xa8\xfe\x89\x8b\xd7\x27\xfa\x54\x5a\xae\xae\x60\x05\x11\xc5\xa1\xc5\x74\xf2\x21\xb7\xff\x99\x9e\x23\x1a\x21\x0e\xba\x12\xa6\x4e\xb4\x93\x5b\xdf\x4f\x26\x39\x8f\xb9\xde\x86\xc8\x91\x51\xd6\xc3\xb9\x32\x03\xd9\x76\x4f\x50\x0b\xc8\x7c\x20\xb5\x6b\x2a\xe6\xa5\x98\x12\xa5\xe9\xd4\xa0\x44\x74\x99\xa1\xde\x30\x4b\xf2\xac\xa0\xf3\x9a\xce\x47\x62\x89\xc0\x15\x79\xda\x23\xcb\x0c\xf6\x88\x9c\x5c\xfd\x8f\x5d\x7d\x1b\x17\x1e\xf9\xd8\x95\x47\x57\x23\xb4\x98\xf7\xfb\x96\x39\x24\x74\xf2\x81\xca\xfa\xe2\xc3\xde\xf9\xef\x25\xaf\xbd\x9e\xe5\x0a\x66\xb7\xe7\x96\xbb\xc3\xcc\x0b\xba\x98\xe4\x5c\x1d\xbf\x13\x91\x15\x2f\x83\xa7\x09\x4d\xd7\x44\xf7\xbe\xfe\xea\xd1\xfa\x91\x83\xb5\x7d\xe9\xf4\x20\x0a\x11\x7c\xf2\x4b\x8a\x94\x0a\x7c\xee\x4b\x23\xb9\x5a\x2a\x32\xe4\xeb\xee\xdd\x2d\xd0\x74\x54\xf3\x77\xe7\x19\x0b\x53\xef\xfd\x15\xfa\x11\x61\x42\x11\x16\xe1\x92\x5d\x8d\xf0\x12\xbc\x0d\xbf\x50\x3f\x82\x7e\xea\xa7\xea\x3f\x0d\x9f\x7a\xf5\x85\x95\xa5\x23\x07\xe6\xf7\x69\x4f\x5d\xbb\x7c\xf1\xcc\xb1\x69\x3a\x89\xdd\x8f\xe1\xcd\x97\xf1\x26\x8b\xf7\x5d\x32\x3d\x84\x1b\xef\x2b\x61\x78\x03\x3f\xfc\xc9\xe7\xf1\xa7\x6f\x51\x4f\xec\xa6\x82\xcf\x50\x4f\x6c\x90\xd1\x1a\xd9\x35\x4b\x5e\x5b\xbf\x0c\x5d\xc8\x07\xd1\x70\x90\x90\x60\x3b\x5f\x62\xd6\x86\x1b\x51\x05\x75\x47\xe8\x34\x8a\xbd\x9b\x3b\xe2\x3e\x4c\xf0\xec\xe4\x4f\x7e\xaa\x15\x4e\x3f\xb5\xa3\x67\x3c\x4e\x99\x37\xd3\x48\x6d\x79\x1a\xdf\x45\x93\x66\x1a\x75\x0f\x6e\x57\x6b\x62\x94\x69\xf8\xa2\x2d\xdb\x5c\x68\x0b\x0f\x86\xf3\xd5\x0a\x45\xc7\x04\x6e\x29\xca\x22\xac\x23\x05\xa5\x33\x59\xd4\x89\xcc\x0a\x6a\x7e\x15\x54\xa3\xf0\x90\x49\x27\xe8\x04\xcd\xd0\x11\x34\x84\x2c\xdb\x44\x77\xbe\x85\xa7\x54\x41\x3f\x1a\x90\x63\xc1\x45\x4e\x3c\xe7\xf1\x46\x52\x12\x81\x42\x7c\x07\xc7\xca\x1a\xa5\x78\xba\xda\x3a\x04\xca\xef\x51\xdd\x89\x0e\xe1\x46\x7e\x30\xe2\x0e\xf7\xa1\xb5\x03\x8c\xe8\x61\x24\x55\x73\x31\x88\xa2\x10\x2d\x90\x41\x42\x49\x6a\x1a\xcb\xcb\x03\x93\x6c\xb0\x57\xf0\xe3\x8e\x44\x5b\x4f\xa0\xed\x35\x8a\xec\xac\x71\x09\x4c\xb1\x07\x44\xbf\x9e\x41\xfc\x62\xcd\xad\x0a\x49\xb6\x90\x2a\xc7\xbd\x8a\x8e\x05\x44\x10\xc8\x9b\x5d\x34\x11\x49\x88\x3c\x81\xf3\xeb\xe3\xaa\xe1\x46\x9f\x6b\x8b\x4b\x4a\x99\x0a\xf6\x4f\x79\xf8\x00\x6f\x98\xe2\x21\x1e\x21\x24\x4c\xf2\x5d\x28\x87\x2a\x3a\xcf\xd0\x2c\x87\xe5\xb6\xfc\xb8\x27\x5a\x74\x19\x2a\xd3\x7e\x60\x63\xe3\xc9\x05\x3e\x1a\x50\x08\x92\x7e\xf9\x15\xf9\xfa\xf3\x92\x9a\x08\x0f\x50\x63\xbd\x02\x6e\xcf\x67\xfa\xb7\x38\x82\x3c\x75\x8d\xfb\x21\xa7\x10\x42\x08\xe1\xc1\x81\x79\xc1\x1d\x58\x0d\xfa\x68\xd4\x93\x77\x21\x42\xf6\x16\x14\xb2\x3f\x48\x66\x08\xa5\xa6\xfa\xa3\x58\x9d\x00\x12\x34\x28\xa0\x1f\x10\xaa\x9d\x87\x5b\x83\xc7\xe0\x99\xfa\x80\x93\x6d\xbd\x79\x61\xff\xc8\x40\x56\xbd\xb9\xb2\x3c\x3f\x56\x1b\x90\x3b\xe5\xb3\x45\xbc\x7b\x02\xc3\xba\x81\xcf\x1e\xc7\xd1\x3c\xb5\xf7\x30\x95\x7a\x94\xa4\xdd\xe4\xe2\x65\x72\x63\x93\x4e\xb5\x5a\x29\xcd\x6f\x21\xc9\xed\x24\x5e\x3e\x04\x49\xdb\xe6\xca\x07\x33\xb0\x48\x6f\xfd\xfe\xaf\x72\xa9\xfa\xc1\xbd\x70\x3b\x9b\x72\x1d\xf3\xd7\x31\x56\xc3\xc8\xce\xc3\xd9\x62\xc6\xbd\x1d\x78\x2a\x16\xcc\x6a\x8b\xf4\xda\xde\xab\x42\x33\x1e\xa7\xc0\x86\x49\x67\x0c\x27\x9d\x62\x01\x0f\xfd\x80\x63\xd8\xb6\xdf\x0a\xf6\x4e\x30\x14\x1f\x1c\x14\x1f\x2e\x49\x51\x97\x2c\x0f\xf4\x17\xa3\x61\x45\xfd\x99\x6c\x57\xa9\xe6\x56\x3a\x5d\xe8\x6c\x48\xed\x49\x8c\x1b\x42\xe7\x0a\x46\x21\xc6\xf0\x65\xce\x26\xdd\xfd\x53\x7a\xd7\xe9\x6c\x31\xd8\x5f\xd2\x33\xa7\xf7\xce\x8c\x8f\xcf\x84\x7c\xf1\xfa\x92\x1c\x39\x70\x6a\x30\x5a\x1a\x7d\xc4\xaf\xe5\x4f\x1d\x3c\xaa\x8a\x46\xbe\xdb\xb7\x07\x49\x6e\xbf\xc7\x78\x92\x61\x39\xc9\x3b\x40\xa7\xd6\x77\x47\x24\x99\x21\xa9\x60\x28\x3a\x3e\x9c\x09\x27\xdb\x16\x74\x23\xe6\x1f\x73\x55\x93\xa2\x11\x76\xa7\x12\xda\x32\xd2\x19\x42\xc2\x8a\x82\xb6\x7e\x6b\x6f\xd6\x1b\x4a\x28\xf1\xee\x61\xa3\x4f\x72\xbb\xaa\xb9\x89\x3d\x5d\xd1\x48\xdb\x68\xcc\xad\x4d\xc6\xa7\xe9\x76\x86\x3f\xfe\x9a\x88\x70\x32\x6c\x22\x9a\x06\x20\x81\x01\x0e\xbf\x49\x00\xf4\xc3\xb2\x5d\x3b\xf7\x46\x7d\x18\x3d\xf1\x44\xfd\x63\xf0\xc8\x8d\xd5\x4b\x17\xcf\x1d\x11\xd9\x47\x6e\x6c\xae\x5e\x5a\x39\x7b\xea\xd0\xec\x4c\x24\x7c\xeb\x21\x3a\x12\x0e\x47\x1e\x7a\xc4\xfe\xb3\x0f\xa7\x6b\x03\x18\x26\xc6\xc9\xbc\x9f\xf4\xe6\x90\x17\x50\xba\xd5\xa7\x6e\xd8\xa3\x3f\xa9\x53\xd3\xa0\x7c\x1a\x9e\x68\xa5\xfc\x13\xdb\x94\x97\xf1\x8e\x2f\xd3\x6a\xb7\x56\xdd\x8e\x77\xfd\xbe\x7d\xd9\x0d\x31\xd2\xdc\x6b\xd4\x89\x68\x66\xe7\x0b\x3e\x68\xcf\xf6\x76\x81\x4c\x29\xdd\xc8\xca\x99\x95\x54\x79\xdb\x55\x36\xcb\xad\x7e\xf3\x9b\x1a\x2b\x10\x6c\x1b\x1b\x6b\xaf\x50\xb4\x42\xc9\xbc\x40\xeb\xb4\x3f\x2c\xba\x3b\x43\xa1\x04\x9e\x91\x32\xae\x58\xac\xc8\x72\x04\xa5\xe0\x12\x35\x94\x91\x76\x1d\x4b\x64\x17\xa2\xfd\x7c\x28\xda\x1b\x0a\x0d\xdc\x39\x96\x2f\x13\x3c\xdf\xbd\xac\x2a\x1e\x41\x2d\xb7\xed\xf2\x25\x69\x91\x40\x04\xd2\x70\x90\xca\x5e\xf6\xde\xff\x7d\x85\x64\x15\x5e\x60\x58\xe6\xcb\x64\x00\xf9\x95\x88\xe2\x72\xb9\x92\xf8\xd9\xf6\x69\xcd\x2b\xab\x41\x51\x43\x83\x1b\xb1\xf6\x58\x34\x50\xe6\x7d\x01\x5d\x96\x65\x0f\x7a\xcb\xad\xd0\x1c\xa7\x68\x84\xc7\x2f\x86\xfa\x68\x93\x40\x6e\x93\x61\x3d\x94\x42\xb4\x99\x84\xc8\x53\x7c\xd8\x90\xd3\x31\x42\xc3\x69\x82\xa4\x24\xdc\xce\x7c\xee\x0f\x65\xdf\xd4\x73\x89\xa7\xe2\x32\x72\x11\x12\xe7\xd9\xfd\x18\x4f\x51\x85\x0a\xc5\xbb\x12\x91\x5f\x61\xb1\x4c\x3f\x7f\xe6\xab\xbc\xab\xef\xf2\x6f\x03\x60\x70\xc3\x10\xfe\x16\xfe\x7f\xa0\x1b\x8e\xc2\xd1\x7a\x0c\x1d\x3b\x56\x3f\x0e\x13\xa3\xf5\x9e\xb6\xa1\x6c\x10\xe2\xb8\x77\x06\x6b\x49\xaa\xb2\x9f\xe2\x79\x0f\xda\x36\x48\x72\xdb\xcc\xbd\x43\xd9\x6d\x2b\xe3\x58\x2b\x55\x8f\x3d\xf8\x7d\x12\x8d\x08\x97\x4d\x41\x63\x27\xdf\x65\xd7\xcd\x35\x4e\x19\x3b\x6e\x6c\x83\xd0\x36\x77\xb6\xb0\xaf\xb9\x5d\x3c\x83\xbf\x95\x15\x45\xc5\x35\xbd\xd6\x95\x9b\xbf\xd7\x2d\xf2\x6c\x22\xd5\x5e\x29\xef\x11\xa9\x58\x30\x44\x70\x28\x1e\xaf\x84\xc3\xf5\xc7\x78\x9e\x9b\x6a\xdf\x6f\xb4\x19\x66\x6a\xf8\xb8\xaa\x8a\x92\xdb\x08\x47\x0f\x53\x2a\x65\x76\xc6\xfc\x82\x2f\x50\xea\xe9\x58\x9b\x9f\x33\x88\xb0\x07\xbd\x57\x78\x34\x16\x4d\xfa\x16\x93\xd2\xd4\xa8\x2b\xdf\x15\x3c\xf0\xdc\x6b\x15\x92\x64\x75\x66\x9a\x24\x8e\x9f\x95\xda\xc2\xd5\x9f\xb9\xb8\xcc\x05\x5c\xa5\x9e\x33\x94\x30\xf6\xec\x9e\x44\xff\xc3\xd1\x5d\xd3\x89\x48\x9d\x43\x88\xfd\xf2\xdd\xeb\x7a\xd9\x9b\xf6\x69\xca\xa1\xdd\xd7\xd4\xc5\x19\x00\x02\x44\x20\xf0\x73\x84\x02\x03\x70\x04\x2e\xc2\x23\xf5\x82\xf3\x7d\x15\x4b\xe7\x8e\xce\x4f\x0e\x55\x73\x67\x8e\x1d\xdd\x53\x6b\xf3\xc3\x9e\xbd\xb4\xe1\xf1\x18\x9d\x78\x7a\x0f\x15\xdc\xb7\x97\x3c\x73\x3a\x1e\x41\x41\x24\xb6\x24\x93\x86\x1b\xdf\x9d\x87\x3e\x58\x99\xf4\x81\x30\xa3\xff\x23\xbf\xb1\xc2\xb3\xc3\x4f\x36\x33\x11\x0d\x09\x69\x6c\x07\x06\xf2\x7a\x4b\xaa\xb1\x51\x7b\xb4\xc3\x8d\x4d\xa1\xcc\xb8\x8b\x95\xed\x5d\x38\xe9\x6a\xba\x13\x85\x51\xb1\x1f\x15\x0b\x06\x7e\x0e\xe3\x8e\x72\xc7\x89\x80\xbf\xd3\xf0\xd4\x27\x38\x32\x49\x11\x54\x81\x66\x58\x37\x9f\xe1\x85\xac\x18\xd7\x45\xd3\x45\xd2\x34\x55\xf5\x77\x85\x58\x0f\xc5\x4a\xaf\x92\x7c\x46\xdb\x90\x92\x91\x48\x34\x5a\x61\x45\xc4\xa8\xb4\x70\x57\x9f\x61\xab\x57\xfb\x2e\x79\x3a\xa3\xef\x01\x8f\x4e\x98\x59\xc1\x1b\xa6\x23\xb4\x98\xc2\x35\xcc\xf0\xa3\xf3\x68\xdf\xdb\xb9\xdc\x14\xc3\xd1\x78\xd8\xcd\x75\xfd\xbf\xec\x7d\x7b\x70\x5c\x57\x99\xe7\xef\xbc\xef\x3d\xe7\x3e\xfb\xad\x96\xd4\x6a\xa9\xa5\x6e\x59\x92\x25\x59\x52\xab\x65\x49\xb6\x64\xcb\x71\x6c\x27\x7e\xc6\xf1\x23\x96\x25\xbf\xe4\xc4\x89\x37\x21\xce\x03\xb2\x98\x6c\xc2\x02\xf6\xb2\x4b\x80\x2c\x2c\x61\x2b\x64\x97\x2d\x2a\xb0\xcb\x42\x65\x28\xc8\xcc\x64\x98\x61\x06\x02\xc5\xa4\x28\xfe\x1a\xa6\x80\x61\x60\x86\x61\x78\xcc\x64\xa8\xe1\x55\x61\xa0\x22\x4d\xdd\xdb\xdd\x96\x9c\x04\x4d\x15\xc5\x3f\x4c\x71\xda\xd7\x7d\xbf\xfb\xdd\xf3\x7d\xa7\xef\xd1\x39\xf7\x9c\xef\x49\xde\x37\x34\x3c\x51\xc9\x19\xea\xeb\x52\xbb\x6a\x55\x43\xbb\xa6\xa7\x6e\xe9\xbf\x71\x2a\xbb\x41\x6c\xb3\x32\x46\xf7\xf5\x4d\x0e\x0f\xd5\x6a\x27\xf4\xe9\xe7\x36\xde\x96\x20\x2f\xbf\x97\x24\x0e\x3e\xdd\x77\xa8\xb6\xac\x94\x2a\xd8\x7e\xa6\x8f\x83\x23\x8d\x43\xf4\xe7\xf4\x97\x98\xc1\x7d\xb1\xec\xf1\xca\xec\x04\xb9\x72\x65\xf6\x2a\x1e\xbc\xb8\x74\xfa\xe8\x81\x5d\xdb\xab\xfd\x8f\xbe\xe9\xa1\xfb\x4f\xdc\x36\x5b\xc0\x89\x93\xb2\xd0\xd6\x56\x78\x23\xd7\x6f\xe1\xa9\xbd\x7c\xe8\x08\xef\x7c\xd4\xe3\x0f\xbd\x41\x4f\x6e\x26\xd7\x04\x8e\xd3\x43\x75\x8b\x83\xc6\xc2\xfd\xd5\xf3\xe2\xab\x57\x55\x05\x5c\x59\xdb\x73\x57\x5e\x39\x7c\xea\x3d\xd1\xb5\xc6\x52\xbd\x12\xcd\x83\x1d\xa4\x2e\xaa\xc9\x5e\x27\x36\xac\xd5\xc3\x52\xad\x0e\xa8\x66\x84\xc2\xba\xfc\xb8\x2c\x2b\xe9\xcc\x75\xb5\xc6\xaf\x8d\x2c\x16\xd5\x29\x65\x46\x47\xae\xb9\x7b\x8e\xd3\x9f\x67\xc3\x90\x24\x7d\x63\x5f\xee\x4f\x90\x62\xe0\xa7\x2a\xfb\x53\xf9\x52\x51\xbb\x6e\x20\xb3\x83\xe6\x52\xc8\xba\xa5\x57\xb5\x1c\x37\x90\x4a\xc9\x5c\xb9\x5f\xbb\xbe\x70\x5b\x0a\x9a\x9b\x47\xb9\x6a\x9f\xeb\x9a\x4b\xa7\x3b\x92\x5a\x38\xbd\xa2\xbd\x95\x6d\x4d\x85\x49\xa3\xdb\x5a\x9d\xcc\xf6\x4c\x6a\xc0\x2b\xd7\x2e\x06\x41\x8b\x36\x59\xc7\x75\x36\xda\x33\x3a\x95\x0d\x02\x7b\x46\xe9\xe1\x03\xdc\x6f\xa5\x1f\x13\xb6\xfd\xb0\xd3\x92\xf3\xa6\xe8\x8e\x0d\xc7\xb7\x6d\x27\x97\x0e\xa7\xc3\x34\xd9\x92\xc9\xb4\xd1\x9e\xce\xf6\xf2\xde\xf9\xfc\xe9\xcf\xa9\x16\x4a\x58\xc9\x0d\x4f\xdf\x9d\x0a\x03\x3b\x21\xfc\x14\xdf\x76\xcf\xd5\xcc\xb4\x34\x27\x4f\x84\x9d\x67\xce\x3c\xd6\x9d\xba\x97\xea\x47\xcf\x6d\xdd\x7a\xdf\x46\x42\xd2\x44\x1d\xf9\xbd\x03\x4f\x49\xdd\xd5\x59\x9d\xea\xee\x26\xac\x65\xec\xcd\xa7\x4f\x57\x96\xb3\x26\xe7\x92\x36\xcf\x78\xdc\x09\xdb\x05\x20\xd0\x82\x80\x7e\x8d\xfe\x08\x1b\x71\x04\x8b\xb8\x1d\xf7\xe0\xea\xec\x64\xdd\xc6\xf0\xe2\x5d\x77\x2c\x9d\x5a\x38\xbe\x7f\x6a\x7c\xa4\xb7\xfb\xe2\x85\x3b\xce\x2f\x1d\x3d\xbc\x7d\x66\x30\xc7\x71\xfa\x14\xb5\x76\xd0\xcc\x41\x6a\xdd\x76\x9c\xb6\xdd\x24\xbc\x9d\x22\x2c\x1a\x90\xcc\xaa\x30\x67\x68\xcd\x5e\x6e\xfa\xdf\x16\x00\x66\x5e\xcb\xde\xf0\x9a\xb5\xf2\x6a\xdc\xc9\x4a\x23\x92\xe4\x35\xf5\xcf\x70\xf3\x6f\xa2\x32\x76\x2d\xd2\x5b\x53\x74\xdc\x74\x47\x68\xbc\x4c\x1b\xfa\x1e\x51\xae\xa4\x53\x51\xa7\xd7\x0d\x99\xd3\x19\x51\x2d\x6f\x2a\xa5\xb2\x19\xfa\xb5\xb9\xc1\xc1\x4a\x39\xff\xa6\xb4\xf3\x38\xf1\xfe\x54\xbb\xc7\x78\xe6\x72\x7b\xa1\xc3\x7b\x8f\x21\xee\xe1\xb1\x07\x4f\x79\xe1\xc6\x3e\xa5\x87\x8b\xed\x6e\xe2\xc2\x39\xa9\x53\xd5\xee\x2e\x7f\x64\xe2\xd1\x0f\x0c\x96\x86\x4f\xd1\x09\x2a\xf7\x0e\x0e\x1d\xb8\xfc\xe9\xe5\xcc\xc6\x61\x33\xcb\x25\xd9\x35\x51\x2e\xf7\x2f\x7f\xa5\x46\x02\x9b\x7c\x37\x53\xeb\x2a\x0d\x0d\x0d\xdc\x94\x9c\x7f\xe2\x75\xb7\x05\x3b\x4a\xe9\xa5\x72\x79\xb0\x6f\x32\xff\x20\x39\xb3\xb8\xb0\x77\x7c\x34\xd3\xe6\xe9\xde\x1e\xc7\x9c\x3c\x56\x38\x32\xd5\x6f\x06\x86\x38\xfd\x94\x63\x5d\x99\xe9\x69\x1d\x27\xe5\x1b\xfb\xfb\xf7\x08\xfe\x29\xae\x3f\xf2\x81\xc9\xb9\x64\x22\x79\x60\xf9\x23\x76\x66\xb2\xdc\xd3\x32\x54\x2e\xec\x2c\xe6\x7c\x30\x24\x21\xe9\x1b\x98\xc6\x08\x8e\x61\x09\xef\x9a\xdd\x4a\xce\x9f\x9f\xbd\x7d\xd3\x99\xa9\xda\x68\xdf\xb9\x53\xb7\x6e\xd9\xd4\x39\x5a\x95\x03\x7d\x7d\x03\x5b\x66\x64\x67\x47\x47\xe7\x5e\x6a\xe5\xd8\xce\x9d\x34\xbd\x9d\xb6\xee\xbe\x51\x9c\x5a\x9c\x67\xc7\x07\x49\x0f\x09\x5c\xbd\x2a\xd8\x9d\x9e\x9e\x99\x89\x83\x89\x90\xe6\x26\xfd\x57\x2c\x83\x70\xbd\x30\xf7\xfc\xda\xbe\x3c\xdf\xb0\x1d\x8d\x76\xc3\x6b\x05\xba\xb1\x95\x78\xc3\x55\xaa\xa1\xe2\x6f\xaa\xe6\xa2\xa1\x2d\x2b\x72\x8d\xd3\x75\x1c\x1c\x34\xad\xb2\x23\xd1\x18\x9e\x21\xcd\xf0\x23\x0d\xc7\xd9\x38\xc8\xdc\x78\xa5\x4c\x96\xd3\xe9\x56\x2f\xc5\x9c\x61\xdd\x2d\xcd\xa0\x69\xd5\xbc\xdd\x72\x02\xd7\x21\xf7\xd2\x1b\xb7\xa7\x66\xbb\x43\x2b\x91\xa9\xdd\xe0\x74\x3c\x44\x6e\xd8\x9f\xdf\xbe\xdf\x73\xec\xce\x9b\xf8\x3d\xc5\xb9\xb0\xe4\x58\xd2\xbe\x2b\x4f\x84\xb6\x38\x25\x2d\xa9\xa7\x4a\x1d\x4f\xea\x1e\xdb\x6a\x53\xa3\x2a\x78\xc2\x16\xe4\x85\x6c\xae\xd0\xbb\x23\xfc\x1b\x9e\xa6\xcc\x11\x07\x64\xeb\xdd\xad\xc9\xbd\xc9\x64\x3e\x9d\x22\xdf\xf1\x0b\xed\xa4\xab\x6f\x5b\xc7\x74\xf7\x91\x3b\x2f\x15\xff\xc3\xd7\xfb\xee\x78\x63\xf2\xe8\x47\xc9\xc6\xed\x6f\xc9\x4f\x14\x92\xbb\x82\x0f\x33\x66\x5f\x5d\x1c\x94\x24\xe1\x7f\x35\xb0\xf2\x99\x97\x1f\xa0\xd1\xb8\x27\x89\x38\x52\xb3\x4f\xe7\x59\x12\x23\x98\xc4\x1c\xee\xc5\xd5\xd9\x09\x72\xe9\xd2\xec\x7d\xb8\xf3\xc2\xfc\x91\x3d\x51\xef\xdd\x7e\xf6\xb6\xc3\x37\xef\x98\x9d\x89\xce\xcb\x69\xc7\x60\xb4\x2a\xcb\xa5\x52\xd9\x11\xa7\x03\x51\x1e\xe4\x33\x3b\x3b\x88\x00\x49\xaf\xd1\xd2\xc5\xc3\xef\x57\x99\x64\xbc\xc6\x6a\x35\x8d\x4b\x6b\x7b\xec\x52\x2c\x3d\x51\xab\x0a\xa0\x64\xfd\x74\x8d\x55\x4f\x43\x6d\x97\x6d\x2c\x2e\x63\x61\x29\x6b\xb8\xf9\x24\x9b\xba\xbc\xc6\xdc\xbc\xc6\xed\x79\xd5\x24\x63\x7c\xb4\x19\xc7\x61\xb4\x41\x92\xce\x93\xdd\x6f\x7e\x72\x83\xae\xe5\xd2\x09\xfe\xc5\x96\x99\xa9\xbc\x5d\xb5\x32\xc9\x20\x18\xfa\x23\xb1\x7b\xb4\x2d\x95\x6d\xb5\x48\x3b\xd1\x23\x1b\x0e\x3b\x3b\xb6\x4a\x6b\x4c\x26\x76\x39\xae\xca\x8a\x04\xdd\xcf\x8d\x95\xf3\xed\x0e\x11\x74\x2e\x1c\xea\x0f\xc7\x87\x83\xf2\x4e\x99\x2e\xfe\xff\x37\xed\x33\x4e\x87\xf0\x3f\xd1\x1b\x5e\xdc\xb7\x85\x54\x64\xef\xd8\x8e\xf4\x86\xa9\x93\xcf\xd9\xbd\xb5\xb9\xb6\x70\x76\xa2\x85\xec\xa1\xb9\xec\x54\xcb\x05\xe3\x4b\xce\xfc\x02\x09\x8c\x36\x3e\x79\x52\x25\x6f\x9e\x7b\x1b\xcb\xa6\x2b\xce\x31\xf2\xd8\xf6\x9d\xda\xa9\xee\xe5\xcb\x4b\xf9\xbe\xc0\xd7\x95\x16\x9f\xb5\x4f\x98\x7c\x26\xc9\x8d\x98\x3f\xd0\x3a\x76\xc1\x58\xce\xfd\xb2\x25\x91\x1a\xad\xaa\x2d\xca\xce\x7e\xf2\x3f\x2f\xf8\x77\xfa\x5e\x42\xb9\x6d\xfd\x78\xa5\xe7\x19\x18\x52\xd8\x4a\xe6\xe9\x8b\x28\xc4\x3d\xbe\x67\x36\x47\xa6\xa6\x66\xa7\x51\xdd\xd4\x5b\xa9\x8d\xf6\x75\xb8\xd8\xcc\x59\xc8\x88\xbb\xc6\x42\x6b\x4d\xa7\x35\xfa\xcb\xc5\xd4\xda\xfe\x9a\xba\x26\xed\xaa\xef\x21\xea\x6b\xd0\xd2\x9a\x0d\x44\xdc\x17\xf5\x4f\xa9\xa1\xcb\x48\xd6\x83\x14\xa8\x4c\x69\x84\xcc\xf3\x2d\x81\x57\xf1\x4b\xe9\x34\xab\x0e\xaa\xc3\x56\xd2\x13\x09\xa6\x5b\x5b\xdb\x8c\xdc\xd0\x3d\x99\xcf\x77\x3a\x7e\xd1\x2b\x29\x37\x4f\x45\x58\xe8\x3d\xc8\xdd\x3d\x01\x75\xfb\x5a\xb9\x7d\xca\x64\x93\xe9\x47\xf6\xed\xd7\x1f\x7a\x87\x23\x44\x2e\xad\x4a\x5e\xe1\xe6\x9b\x0e\x4c\x17\xce\x1c\xf5\x27\xcf\xfc\xc7\x52\xf7\x2d\xc3\x27\xa4\xe3\xb6\x6e\x3c\x7e\x65\xf9\x47\xcc\x4a\x07\xad\xf6\x2b\xbd\xec\x5e\x23\xc2\xeb\x24\x42\xda\x8a\x1f\x40\x21\x58\x79\x79\xc5\x02\x47\x95\x3c\x43\x36\xb1\x23\xe8\x8e\x75\x0d\x47\xf1\xfa\xd9\x51\x72\xec\xd8\xec\x71\x7d\x70\xae\xff\xd0\xc1\xbd\x73\x95\xf4\x4e\xba\x61\xb0\x87\xe5\x3c\x87\xe9\x4d\xc3\x6c\xc3\x66\x5a\xda\x7d\x93\xc8\x1f\xe1\xf9\x5a\x95\x53\x9e\xaf\x10\x52\xba\xf6\x72\x6a\xc6\x01\x68\xec\xe0\xb3\xd3\xab\xe1\x26\xd6\xe8\x1a\x4a\x38\xb6\xf6\x21\x1f\x8b\xe3\x8a\x46\x7b\xaa\x4c\x43\xe4\x97\xaa\x6f\xb5\x7d\x22\x33\xd5\xd4\xaa\x7a\x7b\x2c\x3b\x56\xc9\xa4\x47\xb2\x63\xe3\xd5\x94\xaa\x4b\x16\x47\xa3\x97\x51\x53\xd1\x10\xcf\x7b\xd9\xcc\xa6\x91\x6c\x73\x9c\x8c\x8e\xcc\x28\x63\xb9\x29\xba\xb7\x65\x3f\x21\x2c\xd4\x0e\xa1\x43\xbb\x72\xa7\xb9\x31\x19\x21\xff\xb6\x9d\x1b\xc3\xaa\x2a\xe8\xdb\x2d\x8d\x20\x82\x31\xe6\x76\xcc\x58\x5d\x8e\xf6\xac\xd9\xa2\xd4\x99\x54\xda\x51\xec\x26\x45\x29\x21\xd6\xee\xde\x54\x2a\x9d\xea\xe2\x19\x69\xe5\xce\x91\xf4\xb6\x5c\xa1\x30\xd3\xbb\x69\x60\xe2\x82\xdb\x75\xc3\x24\x97\x05\x61\x05\xe3\xa7\xb8\x4e\x7b\xa2\xab\xab\xc5\xf7\xbb\x7a\x8e\xb6\x9a\xff\x96\xd0\x82\xd2\xcf\xd7\xa6\xb9\x6b\xc2\xf1\xcd\x51\x0f\x34\xbd\xd1\x24\xba\xe3\x1e\x69\xfa\x14\x49\xf4\xc4\x70\xd3\xbb\x44\xa2\x1c\xc3\x06\x3e\x9d\x61\x49\x48\x54\x62\xb8\x69\xe7\x2e\xd1\x1b\xc3\xad\x18\xa3\xe7\xe2\x51\xb0\xa1\x41\xaf\x6e\x33\x2b\xd1\x17\xc3\x4d\xcb\x46\x89\xfe\x18\x6e\x5a\xae\x49\x0c\xc4\x70\xd3\x0a\x49\x62\x63\x0c\x37\xed\x53\x24\x06\x63\xb8\x69\xd7\x20\x31\x14\xc3\x4e\x43\xd3\x2e\x31\x1c\xc3\x4d\x1d\xa8\xc4\xa6\x06\xbe\xae\xbb\x92\x18\x89\xe1\xa6\xe6\x43\x62\x34\x86\x9b\x92\x70\x89\xb1\x3a\xdc\x90\x62\x4a\x54\x63\xb8\x29\x5b\x92\x18\x6f\xfc\xde\xba\x04\x42\xa2\x56\x8f\x51\xdc\xd8\x79\x4a\x4c\x34\xf8\xd5\x77\x4a\x12\x9b\x63\xb8\xb9\x1a\x97\x98\x8c\xe1\xe6\x2a\x4c\x62\xaa\x51\xbf\xfe\x36\x97\x98\x8e\xe1\xe6\x5b\x42\x62\x0b\x5e\x35\xab\xac\xac\x5c\x8b\x9d\x28\x91\xa8\xd7\x5f\x6f\x84\xa1\x1d\x89\x95\x9f\xb0\x5e\x66\x30\x8c\x23\xb8\x88\xcb\x78\x1c\xff\x07\xff\x17\x9f\xc0\x67\xf1\x25\xfc\x15\xfe\x0e\xdf\xc5\x3f\x91\x87\xc8\x5b\xc9\xfb\xc9\x47\xc9\x67\xc8\x57\xc8\xb7\xc8\xdf\x93\x1f\x90\x1f\x93\x65\xaa\x69\x92\x76\xd0\x72\xc3\x97\x6c\x55\x25\x2b\xbb\x62\xdf\x90\x57\x3a\x99\xc6\x66\x9e\xab\x8a\xb8\xba\x2a\x66\x35\x64\x60\x3d\x3c\xca\x78\xfc\x69\xac\xcd\x63\x2b\xab\xba\xe9\x4e\x75\xac\x16\x0d\xa4\xf1\xda\x88\x8a\x85\xac\xd3\xa4\x9a\x49\x67\x22\x9a\x75\x47\xfd\x91\xda\x68\x4a\xc9\x7e\xd2\xd0\xd7\x65\x56\xb7\xd5\x63\xb5\x91\x6c\xa6\x5a\xe9\x92\xa5\x72\x6d\x34\x9b\x2a\x75\x55\xaa\x23\xb5\x4c\x25\xa5\x64\xba\x4b\x96\xc6\x9a\x7b\x74\xa9\x86\xcb\xd5\xe1\xf1\xd1\x6c\xc3\x48\x68\x24\x5e\x79\x6c\x25\x15\x55\xaa\x96\xc7\xab\x23\xa4\x52\xeb\x91\xaa\x5c\xab\x8c\xd6\x1d\x69\x1b\x02\xdc\xb5\x61\xd0\x55\x6c\xca\x3a\x45\xe2\x58\x53\xb1\x6d\x4b\x6d\xbc\x96\x6a\x46\x54\x1f\x8f\x83\x94\x47\xcf\x68\x24\x0e\xb2\xdc\xd0\x25\xa4\x47\xc7\x6b\x52\xa5\x87\x33\xa3\xc3\x0d\x05\x55\x53\x46\x53\x6b\x3a\xd1\xf4\x93\xba\x38\xe7\x7a\x47\x1b\x55\x20\xa3\x99\x1e\x59\xea\xaa\xc5\x3e\x54\xa3\x99\xb8\x5d\xd7\x02\x99\xd6\x17\xba\x7e\xec\x73\xde\x95\x4e\x65\x65\xa5\x5a\x1e\x1f\x1d\x49\xab\xba\x14\x71\x24\x7b\x2d\xb1\x40\x26\x5d\x8f\x90\x95\x4d\x97\x4b\xaa\xab\x52\x8d\x2d\xa5\xaa\x99\x6c\xb2\x1a\xeb\x3b\xa3\xbd\xd1\x78\x45\xa5\x47\xb3\x15\x95\x8d\x56\xd6\xb1\x15\x1c\xa9\x36\xa4\x91\xe3\xb5\xf1\x9e\xb1\xba\x2e\x24\x7a\x64\xa4\x19\x8c\x3d\x3b\x56\xea\x8a\xc5\x1d\x63\xa3\x23\x95\x58\x85\x36\xc2\x7a\x53\x85\xee\x6c\x51\xf7\x8e\x86\xb4\xd7\x65\xc6\xf2\x59\x5f\xbf\xa7\x0b\x13\xfd\xed\xbd\xbd\xe3\x89\xf0\xf0\x89\x27\x0a\xfb\xb9\xa7\x86\x59\xea\xc0\x89\xa1\xde\x44\xd2\xaf\x4e\x6e\xa9\x59\x7c\x3b\x7f\xfd\xc1\x33\xdb\x86\xb3\xa5\x0f\x9e\x6d\xdb\xc6\x03\xcb\xb6\x86\x78\xdf\x0d\x23\x2d\x99\xca\xe3\x45\x29\x3c\x22\x1c\x9a\xe4\x49\x26\xa4\x63\xe6\x5a\x78\x56\xf8\xcc\x30\x2b\xfc\xaf\xaa\xdb\x12\xb6\x21\x42\x1b\xd7\x92\x03\xdc\x6c\xed\x55\x61\x52\x05\x4c\x10\x4b\xec\x21\x86\x28\xe9\x7d\xc1\xe1\x9e\x76\xd5\x67\x24\x21\x2e\x63\x8a\x5b\xd6\x7f\xb2\x12\x2c\xd0\xec\x7f\x09\x21\x8d\x1f\x12\xc1\xb9\xcd\x8c\xd9\xcc\x3d\xa2\x2c\x72\xc8\x88\xe5\xe7\x84\x4f\x38\x4b\x91\xcf\xaa\xb0\x20\x12\xdd\x85\x0e\x49\x7b\x0c\x6b\xe3\x7c\x37\xeb\xda\x97\xcc\xf4\xca\x03\xd2\x1a\x0f\x2a\xad\x45\x41\xe9\xf8\xd9\x16\x97\x71\x65\x1c\x87\xba\x61\x1b\x61\x96\x55\x2c\xf3\x9d\x1d\x09\xd1\xc6\xb5\xe2\x3c\x67\x72\x96\x22\xa2\x4d\x76\xf2\xf1\x79\x99\x98\x49\x65\xb5\xf6\xc4\x88\x18\xd8\x94\x67\x43\xbd\x72\x5b\x8a\x71\xca\xda\x75\x66\x74\x63\xd7\x8c\x3f\x34\x5c\xce\xbb\x39\xa9\x59\x9e\xe4\x96\x4b\x1b\xa4\x4f\xb3\x8e\x90\x86\x91\xab\x9a\x49\xea\x88\x84\xb1\x29\xef\xb4\x42\x25\x6e\x55\x54\x09\x91\x16\xae\x45\x5a\x45\x71\xbf\x2c\x31\x3d\xc4\xad\x20\x95\xcd\xb4\x49\xef\x50\x58\xea\xe4\x86\x97\x7c\x5b\x7a\x4e\x2f\xdb\xc8\xdb\x47\xfe\x41\x09\x6e\x59\x52\xbe\x93\xb9\xca\xbb\x18\xd2\xf0\x69\xed\x71\x57\x91\x6e\xe1\x71\xad\x88\xe3\x2e\x17\x4d\xc0\x08\xe5\x21\x19\x16\x19\xe6\x28\xcb\x24\x6e\xf7\xdd\x90\x87\x9c\x85\x1f\x64\x3e\xf3\x59\x2f\x79\xe4\xe6\xf1\xfd\x7d\xad\x6d\x76\x4b\x87\xcf\x38\x61\x8c\xe4\x93\xa9\xb6\xc1\xad\x37\xee\xa8\xfe\x97\x8b\x0f\xb4\x4a\xe9\x0e\x4c\x9f\x3a\x3c\xdf\xbf\x67\x62\xfb\xae\x96\x4c\xa2\x67\xe8\x9e\x43\x67\xb7\x6f\x39\x7d\xd5\x63\x8c\xf9\xc9\xe2\xd6\xe2\xc0\x7e\x72\xd0\xda\xa3\x28\xa7\x96\x33\xce\x38\x77\xda\xa4\xd3\x92\x6d\xe7\xee\x66\xcf\x0a\x89\x28\x68\x8b\xda\xc2\xb2\x2d\xa6\x03\x47\x95\x53\x63\xba\x35\xe3\x52\x4b\x73\x21\x12\x84\x33\xe9\x7c\xdb\x28\x23\xd5\x1f\x52\x65\xfa\x18\x33\x3c\x57\x24\xdc\xfa\x9c\x30\xbe\xcd\xd8\xb3\xc9\x64\xc6\x17\x63\x3c\x65\xb1\x1e\xea\xd9\x82\x92\xe5\x77\x88\x8e\x7f\xb1\xd5\x60\xab\x58\xfe\x5e\x4e\x07\xdd\x42\x67\x28\x21\x5c\x64\x7d\xa7\xd3\xa8\xe2\x26\x97\x32\xca\x19\x15\xd4\x67\xbd\xc2\xf5\x6d\x5e\xe2\xc6\x51\x2d\xcc\x26\x2a\x45\x43\xd7\x50\xd7\xd1\x76\x87\xb4\x2d\x2f\x64\x29\xee\x29\x3d\xdb\x27\x59\x3a\x74\x18\x15\x9a\x24\xd3\x3e\xed\x2a\x38\x4c\x26\x7b\xda\xbd\x96\x8e\x7c\x97\xdb\x69\x6b\x29\x53\x7f\xdc\x92\xcf\x66\xa9\x13\xe6\x97\xdb\xb2\x49\x2e\x54\x36\x91\xd2\xca\xc9\xe6\x7d\xae\x88\x6f\x06\x5a\x93\x8a\xef\x97\xad\xd9\x12\xb3\xbb\xb8\xe9\x0e\xdb\xd3\x19\x19\x86\x15\x9b\x6b\xc1\x94\x97\xea\x52\x4a\x69\x69\x93\x3f\x6f\x57\x2a\xaf\xca\x96\x54\xe6\xbd\x9a\xeb\x2b\x21\x61\x2d\x46\x59\xcb\xdf\x4f\xb1\x84\x49\x11\x66\x7e\xe6\x8b\xa4\xe1\x9a\xd0\xe5\xe7\xb8\xc7\x8f\x55\x72\x61\x99\x0d\x48\x2f\xb5\xb2\x82\x22\x99\xc0\x57\xc9\x8b\x50\x70\x57\x5e\x5a\xb1\x56\x56\x1a\x6b\xa9\xc3\x90\x98\xbb\x2e\x9e\xbe\x84\x6e\xbc\x3b\xe6\x49\x3f\x11\xd1\x3b\x1c\x78\xf9\xcf\x5e\xa3\x46\x95\x3c\x43\x17\xd8\x61\x94\x71\x2e\x8e\x92\x70\x8e\x6c\x6c\x50\xfa\xef\xf4\x2c\xdb\x81\x32\x96\xe2\xeb\x4b\xa4\xb6\xf2\x52\xfc\x76\xa5\xf4\xdb\xf8\x62\x23\x5a\x43\x05\x21\x7e\x19\xfb\xc2\x85\xe4\x9f\x57\x5e\x6e\xe4\x22\xbd\x7c\xfd\x41\x67\x01\x7a\x1b\x20\x27\x01\xb9\x07\x90\xd1\xf9\x9d\x80\xbc\x0c\xa8\x79\xc0\xea\x02\x6c\x0d\xe8\x17\x01\xa7\x08\xb8\x0f\x02\xde\x76\xc0\xdf\x0a\x04\xdf\x05\x92\x79\x20\xfd\x20\x90\xbd\x0a\xb4\x7c\x03\x68\x1b\x00\x0a\xb3\x40\x71\x00\xe8\xfc\x29\xd0\x7d\x37\xd0\xfd\x36\xa0\xfb\x29\xa0\xfb\xe3\x40\xf7\x17\x80\xee\xbf\x04\x2a\xc3\x40\x65\x16\xd8\xf0\x76\xa0\xff\x5d\xc0\xc6\x43\xc0\x50\x19\xd8\x64\x01\x23\xbf\x00\xaa\xe7\x80\xda\x7b\x80\xcd\x5f\x05\xa6\xbe\x0c\x6c\x79\x1a\x98\xe9\x06\xb6\xfd\x4f\x60\xee\xc7\xc0\x0d\xcf\x03\x37\x3e\x0f\xec\xc9\x01\x37\x3f\x0e\xec\xbb\x0c\x1c\x78\x0f\x70\xf0\xa7\xc0\x2d\xff\x1b\xb8\xf5\x0f\x80\xa3\x8f\x00\xc7\x27\x80\x13\x39\xe0\x44\x2f\x30\x3f\x00\xcc\x4f\x03\xf3\x37\x03\xf3\x0b\xc0\xc9\x2f\x03\x27\xbf\x09\x9c\xfc\x21\x70\x72\x19\x58\xf0\x80\x85\x02\xb0\x30\x08\x2c\x6c\x05\x16\xf6\x01\x0b\x0b\xc0\xc2\xdd\xc0\xc2\xc3\xc0\xc2\x63\xc0\xc2\x53\xc0\xc2\xc7\x81\x85\x3f\x01\x16\xbe\x0c\x2c\x7c\x13\x58\xf8\x21\xb0\xb0\x0c\x2c\x7a\xc0\x62\x01\x58\x1c\x04\x16\xb7\x02\x8b\xfb\x80\xc5\x05\x60\xf1\x6e\x60\xf1\x61\x60\xf1\x31\x60\xf1\x29\x60\xf1\xe3\xc0\xd2\x13\xc0\xd2\xff\x03\x96\x9e\x03\x96\x5e\x00\x96\xbe\x01\x2c\xbd\x08\x9c\xe7\xc0\xf9\x36\xe0\xfc\x34\xf9\x29\x66\xe2\xd4\xb0\x5b\xea\x07\x19\x42\x37\xbd\x8c\x80\xee\xc4\xe0\xda\x83\xec\x42\x92\xf4\x22\x47\xf2\x48\xe2\x25\x6c\xa0\x93\xc8\x45\xd7\xe8\x4e\x4c\x13\x83\x04\xb9\x8c\x7e\x7a\x10\x92\x0e\x60\x03\xbd\x1f\x9d\x54\xc6\x34\x32\xf4\x0e\xe4\xe8\x18\x72\x74\x17\x1c\x3a\x06\x46\x6d\x38\xc4\xc0\x6f\xd2\x8b\xeb\xe7\x91\x24\xbf\x04\x89\x79\x3d\x0b\xd0\x3d\x28\xd0\x9d\xc8\xd2\x7d\x30\xf4\x20\x14\x7d\x33\x5a\xe9\xb7\x50\xa0\xcf\xa3\x42\xcf\xc0\xa5\xef\x86\x4f\xdf\x8d\x1e\xfa\x02\x36\xb2\x61\x28\xfa\x3f\x60\xd1\x2d\x70\x68\x0d\x09\x3a\x08\x42\xed\xf8\x08\xe9\x33\x50\xf4\x3b\x48\xd2\x8f\xc1\x61\x3e\xd2\xf4\x27\x68\xa1\x6f\x45\x92\x5e\x86\x8c\x7f\xcb\x83\x48\x45\xbc\x1b\xbf\x71\x92\x1c\x47\xf5\xd7\xe0\xef\xfc\xda\xfc\x2f\xa3\xbf\xc9\x9f\xcd\x21\x81\x97\x50\x8c\xda\x10\x3f\x9b\xe8\x88\xda\x73\x39\x3e\x92\x8c\x44\xe3\xae\x3e\xb8\x56\xde\x88\x14\x5e\xab\xdc\x15\xe7\xfe\xa5\x60\xe0\x10\xb1\x85\xaa\x05\x1b\x1a\x06\x0e\x5c\x78\xf0\x11\x20\x8c\x56\xc7\x48\x21\x8d\x0c\xb2\xc8\xa1\x05\x79\xb4\xa2\x0d\xed\x28\xa0\x03\x45\x74\xa2\x0b\x25\x74\xa3\x07\x65\x54\xd0\x8b\x0d\xe8\x43\x3f\x06\xb0\x11\x83\x18\xc2\x30\x36\xc5\xb9\x52\xc7\x50\xc5\x38\x6a\x98\xc0\x66\x4c\x62\x0a\xd3\xd8\x82\xad\x98\xc1\x2c\xb6\x61\x7b\x9c\x5d\xf1\x06\xec\xc4\x8d\x71\x8e\xc6\x3d\xb8\x09\x37\x63\x6f\x9c\xc3\xf1\x00\x0e\xe2\x10\x6e\xc1\x61\xdc\x8a\x23\x38\x8a\x63\x38\x8e\xdb\x70\x02\xf3\x38\x89\x05\x2c\xe2\x14\x4e\xe3\x6d\xb8\x8a\x67\xf1\xfb\x78\x9e\x50\x7c\x12\x9f\xc2\x47\xdd\x7b\x1f\xb8\xe7\xfe\xa5\x4b\x4b\x0f\x2e\x5d\xba\x6f\xe9\x5c\x23\x93\x71\x3d\x89\xf1\x97\x1a\x99\x8a\xdb\xc0\xa2\x33\xfe\x25\x48\xfe\x4c\x9c\xf6\xf8\x96\x6b\x79\x91\x57\xb3\x2e\xb3\x6b\x39\x97\xd7\x2f\xcd\x6c\xc9\xbf\xcd\x4f\xf1\x37\x5d\xce\xac\x8b\x3d\xfb\x1b\xe7\xf7\xbb\xf2\xbb\xf2\xef\xa9\x9c\xc3\x12\xce\xc7\xd9\x01\x2f\xac\xb9\x7a\x27\x38\x69\x03\xe0\xc1\x42\xb4\xff\x7f\x18\x1f\xc6\xb3\xc5\xa0\xd8\x5e\x2c\xc7\x72\x9b\x62\x03\xce\x35\xe0\xd5\x42\xe0\xe1\x85\xc6\xe7\x2f\x56\x56\x7e\xcb\x67\xab\x33\x38\x8b\xe0\xba\x67\x74\x67\xe3\x57\x02\xf9\xf8\x9d\x26\x41\x62\xf9\x4e\xcf\xca\xd7\x30\x82\xe9\x95\xf7\xc7\xf8\x00\xc0\xeb\x6c\x4b\x40\x29\x26\x85\x10\x82\x31\x46\x05\x13\x94\x09\x21\xe3\x7f\x42\x50\xc6\x04\x6b\x9c\x4b\x25\x85\x94\xd1\xff\x0d\x48\x29\x29\x19\x63\x42\xb0\xf5\xf1\x16\x65\x8c\x31\x29\x15\x00\x6d\x09\x58\x16\x93\x51\x89\xf8\x49\x26\x19\x97\x32\xae\x29\x65\xd4\x04\xc9\xa2\xba\x51\x51\x11\x09\x65\x45\x80\x10\xd1\x99\x25\x25\xe3\x4c\x4a\xb6\x3e\xbe\xc9\xcf\x02\x60\x6c\x09\xdb\xae\x57\xe0\xd1\x55\x2e\x19\x57\x11\x83\xf8\x52\x74\x7b\x74\x67\x4c\xcd\xb2\x22\x22\x76\x9d\xb8\x65\x59\xb6\xa5\x54\xcc\x8f\xaf\x8f\xb7\x19\xe7\x9c\x2b\x15\xf1\x73\xb4\x84\xd6\x3c\xba\x53\x71\x1e\x6d\xaa\x15\x13\x4a\x59\x51\x4b\x95\x92\x8c\x73\xc5\xa4\x8a\xd1\x51\x7d\xcb\xb2\x75\x04\x48\x69\xd9\x96\x6d\x5b\x16\xe7\x4c\x29\xbe\x0e\x5e\x30\xa5\x63\x7e\x96\x65\x03\x70\x8d\x82\x31\xdc\x8a\x0a\x8f\x2a\x73\x8b\x09\x4b\x45\x35\x55\xdc\x3c\x6e\xf1\x88\x52\x54\x74\x44\xc2\x36\x76\xdc\x14\x5b\xdb\x5a\x47\xf4\xb8\x65\xf1\xf5\xf1\xa6\xc1\x4f\x47\x83\xcd\x51\x70\x9c\x7a\x05\xc1\x39\xb3\x84\xc5\x85\x65\xd9\x75\x1e\x2a\xba\x9d\x2b\x4b\x47\x68\x5b\x6b\xdb\xb6\xb5\x89\x11\x4a\x6b\x6d\x8c\x6d\xc7\xfc\xc4\xfa\x78\x87\x45\x7f\x40\xb6\x6d\x00\xf8\xae\x05\xc7\x11\xd1\x9d\xb6\xe0\x9c\xdb\xc2\xe6\xd2\xae\x3f\x8c\xf8\x71\x70\x9b\x5b\x76\x8c\x8e\xea\x6b\x6d\x9c\x38\xb7\xa7\xa5\x8d\x76\x8c\xd6\x5c\x72\xdb\x16\xeb\xe3\x5d\x1e\xf1\xd3\xda\x89\x06\x85\x6b\xc1\x75\x1b\xfc\x84\x68\xf0\xb3\x75\x9d\x87\xc5\x85\x88\xf6\xe1\x26\xa6\xe7\x18\x6d\x4c\x1c\x79\xcd\xb6\x2c\xe3\x18\xd7\xd1\x5a\x48\x61\xdb\x72\x7d\xbc\xcb\xa3\xe1\x55\xe7\x17\x7a\x36\x3c\x4f\x18\xad\xb5\x96\x42\x70\x2d\xb5\x90\xda\x8e\x5a\xaa\xb5\xb6\x85\x14\x5a\xd8\xda\x89\x00\xe3\x38\xda\x18\xc7\x8b\xb3\x97\xda\x8e\xeb\xb8\xae\x31\xd1\x0d\x5a\xae\x8f\xf7\xa2\x01\x26\x8d\x71\x01\x24\x7c\x1b\xbe\x7f\x3d\x3f\x65\xb4\xb1\xb5\xd1\x66\x95\x5f\xd4\xf2\xa8\xbe\xe3\xb8\x7e\x44\x3c\xa6\xe7\x79\x8e\x11\x2a\xe6\xb7\x2e\xde\x6f\xf0\xf3\x00\x24\x03\x8d\x20\x90\x8e\x31\xc6\x44\xc3\xd4\x48\x23\x94\x31\x8e\x36\xd1\x25\x2d\xa4\x34\x42\x1b\x37\x42\x3b\x9e\xeb\x38\x8e\x17\x44\x80\xd6\xae\xe7\xfa\x9e\xe3\x48\x25\x8c\x51\xeb\xe3\x03\x11\x0d\x67\xc7\xf1\x01\xa4\x42\x8d\x30\x94\xd1\x9d\x8e\x92\x52\x18\xe5\x08\xcb\x31\xae\x76\x1c\xe3\x18\x2d\x94\x74\xa4\x76\xbc\x08\x1d\xd5\x77\xdd\x26\x3d\xcf\xf7\x02\xdf\x75\xa5\x92\x8e\xa3\xd6\xc1\x5b\xd2\x09\xa3\xc9\x46\xb9\x6e\xc4\x2f\x9d\x30\xd7\xf1\x73\x94\x23\x2d\xc7\x71\x8d\x13\x5d\x32\x11\x39\x69\x1c\xbf\x4e\xcf\x77\x3d\xcf\x0f\x23\xe2\xc6\x78\x81\x17\x04\x5e\x4c\xcf\x51\xeb\xe3\x13\x0d\x7e\xd1\x84\x9d\x49\x18\x24\x12\xca\x73\x5d\xd7\x55\x4a\x0a\x57\xb9\xd2\x72\x1d\xcf\xb8\x9e\xe3\x46\xfc\x94\x2b\x8d\xeb\x47\x68\x2f\x08\x5c\xcf\x0b\x12\x7e\x9c\xf2\xd6\x0f\xfc\x30\xf4\x3c\x65\x49\xd7\xb5\xd6\xc7\x27\x84\xa5\x94\xe5\x79\x21\x80\x6c\xd2\x41\x32\xa9\xe2\x0a\xd1\x4c\xeb\x5a\xae\xb4\xbd\x88\x59\xd4\x04\x47\x5a\xca\x95\x8e\x1b\xb8\x71\xcb\x03\xcf\xf7\x83\x64\x74\xaf\xe3\x04\x61\x90\x08\x7d\x5f\xd9\x11\xbf\xf5\xf1\xc9\x68\x32\xb5\x7c\x3f\x01\x20\x97\x72\x90\x4a\x29\xdf\xf3\x3c\xcf\x52\x4a\x7a\x96\x17\xf1\xf3\x1d\x2f\xba\xe4\x4a\x4b\x79\xca\xf1\xc2\x08\xed\x27\x42\x3f\x08\xc2\x54\xe0\x45\x4d\x09\x13\x41\x32\x11\xd1\x53\x9e\x67\xad\x8f\x4f\xad\xe1\x07\x42\x9f\x24\xef\x82\x00\xe8\xa7\xe9\xdb\x01\xbc\xb3\xfe\x4d\x3e\x8f\x11\x12\xef\x79\xf8\xea\xba\x81\xad\x5d\x44\xec\xbc\x74\xcf\xed\x98\x45\xb1\x58\x66\xb7\xae\xcc\x03\xec\x56\x7c\xe8\xda\xfe\x27\xfe\x7e\x24\x96\x0d\xd0\x1f\x01\xa7\x40\xff\x9a\x3e\xb0\xed\xec\xfd\x17\xee\xb9\xbb\xb8\xe7\xf4\xd9\xbb\xee\x2b\x16\x8b\xc5\x95\x95\x95\x95\xda\xca\xca\xf2\xb6\xb9\xc3\x87\x86\x87\x57\xeb\x45\xc7\x2f\xbe\xf7\xf4\x3f\x2e\xfa\xd3\x3f\x03\xd8\xf7\xa3\xcb\x9f\x10\xee\xd7\xeb\xdf\xbb\xbb\x81\x95\x79\xd6\xcb\x8e\xc4\x2d\xa2\x0d\x8e\x04\x60\x47\x56\x26\x00\x36\x17\xbd\x16\x58\xef\xab\xf6\x70\x77\xc5\x57\xee\xa2\x15\xb4\x13\x06\x1b\x14\x16\x66\x11\x4d\xea\xef\x23\xc3\x60\x60\xff\x1a\x00\x00\xff\xff\x39\x79\x03\x72\x80\x88\x00\x00") + +func fontsActionjTtfBytes() ([]byte, error) { + return bindataRead( + _fontsActionjTtf, + "fonts/actionj.ttf", + ) +} + +func fontsActionjTtf() (*asset, error) { + bytes, err := fontsActionjTtfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/actionj.ttf", size: 34944, mode: os.FileMode(438), modTime: time.Unix(1575019249, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x54, 0x44, 0x8, 0xf6, 0x2f, 0xb7, 0xc2, 0x84, 0xc5, 0x92, 0xfb, 0x5a, 0x48, 0x6e, 0xd6, 0xd0, 0xd0, 0x6, 0x22, 0xdc, 0xd8, 0xf7, 0xbb, 0xd1, 0x2b, 0x40, 0xd6, 0x9c, 0xca, 0xd8, 0x8, 0xf7}} + return a, nil +} + +var _fontsChromohvTtf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\xbc\x07\x94\x64\x57\x79\x2e\xba\x73\x38\xfb\xe4\x58\x39\x87\xee\xea\x58\xb9\xbb\xa7\xa7\x27\xe7\xa0\x49\x92\x06\x25\x34\x68\x46\x1a\x21\x8d\x46\xd2\x0c\x49\x20\x10\x26\x0b\x81\x30\x06\x9b\x64\x10\xe0\x7b\x89\x06\x8c\xae\x00\x1b\x63\xc0\x81\x6c\x63\x63\xd2\x13\x0e\x58\x60\xfc\x8c\x31\x7e\x26\x5d\xf0\x45\xdd\x6f\x9d\x0a\xdd\x2d\x6c\xaf\xfb\xec\xe5\xf5\xd6\x55\x2d\x49\xa7\xab\x4e\x9d\xaa\xda\x7f\xfa\xbe\xef\xff\xf7\x01\x10\x00\x60\x80\x79\x80\xc1\x43\x57\x9c\x9c\x6b\xbd\xf8\xca\x4b\xc7\x00\xf8\xe0\x7d\x00\x80\xa3\x37\x5d\x38\x73\x27\xa8\xff\x60\x27\x00\xef\x3a\x0b\x00\x3a\x75\xd3\xd3\x2f\x17\xa6\x1f\xf9\x83\xad\x00\x90\x0e\x00\xe8\xa9\x37\xdf\x79\xcb\x85\x17\xb4\x7f\xff\x0a\x00\x48\x01\x00\xe0\xdf\x72\xfb\xb3\x6e\xbe\x6c\xbf\xeb\x0e\x00\xd8\x43\x00\xbc\xf9\xee\xf3\x67\x2f\x3c\xf3\xc2\xcc\xf4\x17\x00\x78\xcf\x47\x00\x60\x9f\x39\x7f\xee\xcc\xd9\x8f\xfe\xd8\x7b\x31\x00\x1f\xfc\x53\x00\x40\xef\xfc\xf9\x73\x67\xc4\x79\x34\x03\xc0\xc3\x02\x00\x50\x39\x7f\xe1\xf2\x33\xef\xaa\x1c\x58\x03\xe0\xbf\x7f\x02\x00\xf8\xce\xdb\x2f\xde\x74\x06\x14\xeb\xff\x1d\x80\xff\xe6\x03\x00\xdf\x7b\xe1\xcc\x33\xef\x04\x9f\x82\xf7\x01\xf0\xf0\x34\x00\xa0\x70\xc7\x99\x0b\xe7\x8e\x7d\x6a\xe5\x24\x00\xe0\x2f\x00\xc0\x3b\xef\xbc\x78\xe9\xf2\x09\x65\xbd\x0c\x80\x77\x9e\x07\x00\xfc\x0b\x00\x20\x80\x08\x8c\xff\xb9\x1f\xec\x19\x1d\x41\x90\x03\x7f\x35\x3a\x46\xc0\x84\x78\x74\x8c\xc1\x51\x78\x6e\x74\x4c\x40\x0e\x16\x46\xc7\x14\x6c\x87\x7f\x3e\x3a\x66\x20\x87\x4a\x83\x55\x8b\xff\xd9\x33\xb8\xda\xf0\x9a\x16\xf8\xe2\xe8\x18\x01\x0e\x7e\x3e\x3a\xc6\xa0\x0e\x57\x46\xc7\x04\x58\xd0\x19\x1d\x53\x50\x80\x0f\x8f\x8e\x19\xb0\x90\x07\x30\x80\x44\x8e\xbe\xe7\xf0\x78\xf8\x3d\x87\xc7\xc3\xef\x39\x3c\x1e\x7e\xcf\xe1\xf1\xf0\x7b\x0e\x8f\x87\xdf\x73\x78\x3c\xf8\x9e\xbb\xce\xdf\x7d\xf1\xc2\xc5\x4b\x17\x2f\x9c\x7b\x77\xe1\x29\xcf\x2a\x9c\x3a\x7f\xf7\xb9\x73\x85\x03\x97\x6e\x3f\x73\xc7\xd9\x4b\x85\x63\x77\x9f\xbb\x74\x69\xba\xd0\x6a\x76\x0b\xbb\xce\x9d\x3d\x73\x77\xe1\xe4\xe5\xd9\xe9\xc2\x89\x8b\x37\xdd\x16\xbf\x3e\x5d\x38\xb2\xa7\x30\xdf\x59\xe8\x34\xc1\x2e\x70\x1e\xdc\x0d\x2e\x82\x0b\xe0\x22\xb8\x34\xf8\xff\xb9\x62\x09\x14\xc0\x53\xc0\xb3\x40\x01\x9c\x1a\xbc\x7a\x0e\x9c\x03\x05\x70\x00\x5c\x02\xb7\x83\x33\xe0\x0e\x70\x16\x5c\x02\x05\x70\x6c\xf0\xca\x25\x70\x09\x4c\x83\x02\x68\x81\x26\xe8\x82\x02\xd8\x05\xce\x81\xb3\xe0\x0c\xb8\x1b\x14\xc0\x49\x70\x19\xcc\x0e\x5e\x3d\x01\x2e\x82\x9b\xc0\x6d\xeb\xef\x8f\x9f\x3b\x02\xf6\x80\x02\x98\x07\x1d\xb0\x00\x3a\xa0\xb9\xf1\x73\xf6\x9f\x3b\xf3\xf4\x67\xfd\x5b\x5f\x0c\xec\x07\xe7\xc0\x19\xf0\x74\xf0\xac\x13\xe7\x6e\x79\xda\xed\x67\xee\x06\x27\xc0\x39\x70\x0b\x78\xda\xe0\xba\x77\xff\x87\xae\xb0\xe3\xf6\xcb\x97\x9e\x75\xa9\xb0\xf7\xe2\x1d\x97\x2f\xde\x72\xf7\x99\x3b\xcf\x9f\xbb\xbb\xd0\x99\x6d\x16\x7e\xf1\x22\x3b\xc0\xed\xe0\x32\xb8\x04\x9e\x35\xf8\xcd\x7b\xc1\x45\x70\x07\xb8\x0c\x2e\x82\x5b\xc0\xdd\xe0\x0c\xb8\x13\x9c\x07\xe7\x06\xbf\xb5\x03\x66\x41\x73\xf0\xfb\xff\x13\x1f\xda\x9c\x9f\x6b\x35\xe7\x16\xbb\xff\xe1\x4f\x6b\x82\x79\x30\x37\x58\xfb\x39\xb0\x08\xba\xff\xa1\x15\x00\x60\x3b\x04\xd3\x4f\xdf\x53\xf8\x00\xae\xee\x29\x9f\x39\x9f\x28\x9f\xbf\x71\xf7\xcc\xea\xdb\xc8\x73\x41\x0a\x5c\x04\xf7\x82\xbb\xe0\xbd\xa8\x8f\x5e\x85\xae\x84\x1f\x80\xdf\x87\x3e\xfc\xe0\xc5\x4f\x3f\x14\xfc\xec\xe2\x67\xdf\xaf\xff\xcd\xdc\xab\xbe\x72\xac\xfb\x9d\x7d\x0f\x7e\xb6\x38\xf9\xcf\xda\x0d\x65\xfd\xaf\x3f\x7e\xc5\xf1\xf7\xbf\xf4\x9b\x0f\xbd\xee\xb9\x7b\x1b\xdf\x7f\xe8\xfe\xe2\xe5\x6f\xf2\x37\xbf\x6c\x7e\xe6\xe3\xaf\xbc\xf8\xbb\xdf\x6d\xbf\xe4\x35\x3b\x5f\xfd\xad\xcb\x0f\x3e\x7c\xc5\x7d\x7f\x77\xf9\x75\xbe\x7c\xed\xef\xf4\x8b\xdf\xfd\x87\xd7\xdd\x8f\xea\xdf\x7e\xf5\xbb\x1f\xde\x57\xfa\xc3\x3f\x6b\x2e\xb2\xe3\xff\xf2\x27\xbf\xfa\xbc\xb4\xfd\xa1\x97\x7f\xeb\xd2\x2f\x6b\x4f\xfb\x48\xae\xf5\xd1\xaf\x9d\xbd\x21\xd2\x3f\xf4\xb6\xeb\x0f\x7c\xec\xf1\x2f\xbe\x6e\x97\xf3\xe0\x8f\x1f\xff\xc3\x3e\xbb\x5c\xce\x7d\xee\x37\xa7\xd1\xe9\xfb\x1f\xf8\xc1\x9b\xdf\x74\xaf\xfc\xc7\xf7\xbe\xe0\xd0\x33\x1e\xfe\xdc\x4f\x7e\xf4\x99\x4f\x38\x99\x63\xd7\xbd\xfa\xba\xb7\x5f\xf8\xe1\xc7\x3f\xf7\xb2\xcc\x57\x9e\x79\xed\xb7\xcc\x17\x7f\xf7\xd6\xfd\xe9\xea\xef\x7c\x23\x7b\xf1\xde\x05\xff\xdd\x2f\xdf\xb1\xfc\xf9\x6f\xf5\xde\x7b\xf0\xca\x57\xfd\xf6\x07\xbe\x74\x70\xdf\x17\xdf\xb9\xf7\x1b\x9d\x7b\xde\x9d\xdc\xf1\xc9\x1f\x5f\x7a\x15\x9f\xfc\xf4\xff\xbd\xe3\xd7\x0b\xc1\x8b\x7f\xfc\xc8\xaf\xef\x6f\x7d\xf2\xed\xb7\x9e\xfa\xe6\x17\xbf\xba\x6b\xc7\xf2\xcf\x3e\xf4\xa8\x77\xaa\x93\x79\xfb\xef\x5d\x75\xcf\x47\x16\xff\xf4\x0b\x57\x5c\xff\xcd\xef\xff\xf2\x73\xc4\x97\x7f\x70\xf0\xe5\xef\xd9\xf6\x07\x7f\x7c\xd7\xa9\x27\xfd\xf5\x77\x1f\xbe\xbd\xaa\x7d\xee\x87\xcf\x79\x7e\x32\x7c\xf5\x8f\x2f\xf7\xf7\xa0\x17\xcd\x3d\xf4\xe5\x43\x37\xbf\xe7\x2b\x7f\xfd\xa3\xf6\x44\x72\xdf\xea\x0f\x6f\x7f\x0a\x02\x3f\xf9\xfb\x43\xef\xbd\x94\xdb\x77\xf3\xaf\xbc\xe3\x1b\x9f\xfe\xc6\x4f\xbe\xfb\xd9\x15\x5b\x9c\x38\xf5\xe1\x47\xbf\xfa\xe0\x73\x9e\x76\xc3\xe7\xbf\xf7\xb6\x3b\xaf\x39\xf1\xfd\x0f\xfe\xf6\xa3\x93\x77\xfe\xfe\x77\x0e\x7e\xfd\xc3\x57\xff\x91\xe5\xfd\x53\xff\x25\x7f\xb4\xf5\xf0\xaf\x7f\xfa\x7d\x1f\x9d\x9f\xf9\xea\xef\xf7\x2f\xef\x71\x1e\x7d\xf7\xd6\x5b\x9f\x9d\xfb\xc7\xd7\x7c\xe6\xf2\xc5\x4c\xf6\xe1\x07\x2b\xcb\x5f\x79\xdf\xe1\xec\x17\x9a\xbf\xf5\xae\x6b\x9e\xf7\xb3\x9f\x9c\x7d\x61\x60\x7c\xec\xfb\x89\x87\x8c\xfd\x1f\xf9\xd2\x93\x67\x3f\x6e\x7c\xed\x9b\xfb\x6f\xfd\x19\x7c\xea\x4b\x9d\x9f\xfe\xec\xcd\xf7\x3d\xaf\x16\xfd\x8f\x57\x5c\x7f\xe1\xcb\xb9\xfb\xef\x5b\xae\x3d\xfc\x92\x9b\x1e\xf9\xce\xc1\x37\x3e\xff\xd9\xff\x70\x70\xe5\x01\xfc\xae\x6f\x1e\x7b\xc3\x07\xe5\xa7\xee\xd3\x7e\x0e\x7e\xe5\xd3\xfc\xb6\x0f\x65\xaf\xfb\xe3\x8f\x6d\xff\xe9\x3d\xad\xa3\xda\x1b\xae\x7d\xec\x8d\x8f\x7d\xfd\xfe\xdf\xac\x2e\x7f\xf5\x0b\xfb\x9e\xfc\x83\xee\x5f\x4c\x9c\x7b\xe0\x93\xbf\xf1\xc6\x63\x2b\xbf\xf3\xb2\xcf\x9c\xbb\x22\xfd\x0f\xaf\xfa\x32\xbb\xf9\x0f\x7e\xf4\xcc\xaf\xde\xe0\xbf\xff\xc2\x3f\xfd\xc9\xfd\x8f\x74\xf7\xbd\xf6\x47\x6f\xfd\xca\x39\x59\xaf\xfd\xc6\x97\xf6\xee\xf9\xe9\x63\x13\x9f\xbb\xf7\x8a\xeb\x9f\xf7\xae\x7d\x7f\xfb\x32\xfa\xf7\xf4\xad\x67\x77\x84\x5f\xff\xc9\x1d\x2f\xfc\x3e\x7c\xd3\xdb\xee\x9d\x77\x5f\xf7\xda\x0f\x7b\xb7\x02\x02\xeb\x83\x5c\x7a\x17\x00\xd8\x27\x8f\x01\x0c\x38\x00\x6d\xa7\xe8\x54\x8b\x4e\xf1\x2e\xf4\xf6\xc7\xff\x18\xfe\xfe\xea\x0a\x79\xec\x7f\xe5\xee\x22\x00\x60\xb8\xb8\xf6\x0e\xb4\x07\xfd\x00\x34\xc0\xd3\xc0\xaf\x00\x00\x59\xe0\x87\x81\xcf\x02\x3f\x0a\x79\x18\xb1\x7a\x8d\x33\xce\xba\x9d\x5e\xdf\xaf\xd5\x6b\xdd\x4e\xfc\x6f\xaf\xdd\x8a\xc2\xc0\xf7\xc2\xf8\x25\xce\xea\xa5\x5a\xb9\x54\x2b\xf7\xfa\x61\xbb\xd5\x6b\xaf\xc0\x7e\x6f\xfc\xa8\xcf\xc2\x7a\xad\x3e\x78\x5f\xbb\xd5\xef\xc5\x47\xf1\x7f\xfb\x9d\x7e\xaf\xdd\x0a\x18\x67\x51\xc8\x59\x10\x46\xa3\x0b\xc5\x57\x29\x71\x36\x7c\x43\xbf\xd7\x6f\xf5\x5b\xfd\x5e\x94\x83\xf0\x1b\x39\xae\x21\xcb\xd1\x24\xb2\x92\xb6\xf2\x2d\x86\x25\xa6\x52\x6e\xf1\xd2\x61\xea\x7a\x82\x30\x4f\xf5\x26\xcb\xc8\xa0\xba\x40\x90\x2b\xdd\x9a\xa2\x86\x83\x74\x48\x89\x6e\x13\x84\xa9\xa3\x14\x56\xdc\x92\x46\x08\x19\xc4\x18\x09\x8c\x30\x64\x9c\x51\x48\x08\xa4\x06\x9a\xd5\xd0\x09\x0c\x91\x20\x84\xba\x94\xd2\x6c\xde\x75\x82\x8c\x23\xb9\x40\x69\xdd\xf0\x2b\xe8\x81\x66\x28\xcb\x9a\xb5\x3b\xb0\xac\x73\x5b\xa1\x46\x11\x86\x90\x60\x04\x09\xc6\x85\x52\xeb\xc0\xd9\x1b\xaf\x27\xc5\x20\x91\x0d\xcc\xc7\x3f\x46\x32\x79\xab\x93\xf2\x11\x71\x28\x22\x01\xf2\x21\x85\x44\x77\x52\xc2\xf3\x89\x39\xcf\x98\xd2\x74\x4c\x88\x7d\x55\x6d\x6e\x6e\x32\x10\xc9\xbc\x6e\x65\x2b\xcd\xc2\xae\xc5\xda\x7d\x27\xa5\xc8\x4d\x5b\x5c\x6b\x55\x31\xa4\xd8\x91\x2c\x48\x65\x4b\x79\x0f\x43\x8a\x30\x9b\x07\x14\x3c\x0a\x3f\x88\x5e\x85\x31\xa8\x80\x65\x70\x35\x78\x26\x78\x09\x00\xd0\xe7\x26\x2c\x97\x62\xe3\xf4\xba\x9d\xd8\x30\xf1\xb2\xd5\x6b\xf5\x4e\xbc\xc4\xad\x28\x8c\x1f\xdc\x0f\x87\x6b\x3b\x5a\xfb\x91\xf1\x18\x0f\x03\x3f\x7e\xb2\x5c\x1a\xd8\x77\x68\xb0\x66\x18\xf9\x3c\xac\xb3\x28\x0c\x46\xef\x19\x1a\xa3\x37\x34\x7c\x7c\x4a\x7c\x4d\x5c\x63\x65\x56\xaf\x75\x7b\xed\x30\x7e\x02\xbd\x6a\x3f\xe5\xb0\xb8\xc2\x3c\x46\x29\x85\x08\x26\x21\x66\x94\x49\x46\xb5\x83\x0c\x12\xdf\xf6\x6d\x7b\x86\x11\x4a\x33\x51\x26\x67\xbb\xea\x0d\x9c\x30\x0d\x63\x9a\xd2\x4c\x8e\x44\xc4\xa8\x84\x10\xb5\x35\x84\x91\x93\x74\x35\x23\xad\x31\x8a\x5c\xe6\x09\x96\x0c\x93\x09\x3f\x9a\xc0\x16\x16\x9e\x80\xac\xc6\x31\xc6\xe8\xf0\xb9\x34\xd2\x31\xce\xc8\x5c\x41\x15\x08\x31\xb1\x5b\xf3\x34\x21\x8d\x24\xa3\xd0\x82\xbe\x94\x99\x23\x46\x5d\x9b\xb3\x4d\x11\x9d\x5a\x99\x9f\x36\x94\xe9\x64\xed\x95\xcb\xba\x21\x0d\x92\x47\x08\x42\xc1\x35\xbd\x35\x83\x2d\xa5\x87\x6f\x5d\xa9\xb6\x60\xd6\x8a\x98\x6e\xc8\xd0\xd0\xdc\x3c\xa6\xcc\x2b\x86\x99\xd0\xd0\x20\x0c\x12\xab\x7f\x0f\x39\xc1\x94\x60\xca\x08\xc1\x00\x70\xb0\x73\xed\x47\xd8\x44\xdf\x06\x2e\xc8\x83\x3f\x05\xff\x0c\x7e\x0e\x13\x70\x02\x00\x18\x0e\x16\x6b\xb0\x42\xac\xdd\x6a\x8f\x16\xb9\x5e\x63\xe5\x52\xbf\x17\xf5\xfa\x26\xac\xcf\xc2\x72\x69\xe8\xe2\x2c\xf6\x7a\x3f\x8e\x88\xf8\xdf\x81\x91\x46\x6b\x5d\x2e\xc5\x71\x37\x7c\x66\x1c\x06\xdd\x0e\x67\x83\xb8\x88\xc2\x20\x64\x63\x33\x74\x3b\xf5\x12\xab\xd7\xfa\x2b\x30\xfe\xa8\x38\xf0\x5a\x61\xbb\x55\xef\xd4\x86\x2e\x30\x8a\xcc\xc1\x5f\x51\x0e\xc6\x9f\x13\x9b\x70\xf8\x44\xc8\x4d\x18\x7f\xce\xd0\x6b\x6a\xbd\x7e\x2f\xf0\xf9\x20\xe2\x07\xd7\x89\x3f\x7e\x1c\xdb\x83\xc7\xc8\x39\x06\x51\x1c\xbf\x2b\x7e\xd0\xf8\x1b\xcf\xc2\xf1\x97\x19\x7d\x3f\x7f\xfc\xc3\xe2\x4b\xf5\xe3\xe4\x31\x58\x85\xae\x3f\x7c\x53\x14\xa2\xb7\xa0\x9c\xed\x73\x22\x08\x26\x15\x44\x08\xd2\x3d\xde\xd0\xcb\x58\x83\x28\x08\x5f\x84\xe7\x72\x5e\x91\x20\x86\x68\x52\x1a\x11\xa3\x2c\xa0\xcc\x9a\xc1\x19\xdf\xf4\xfd\x10\x92\x7d\xa6\x93\xad\x17\x85\xc9\x34\x4c\x4d\x95\x2b\xa5\x3c\xcb\x67\x3e\xcd\xec\xc5\x1a\x82\xca\xc0\x73\x13\x15\x44\x05\xc7\xf8\x79\x41\x9b\xe3\x7c\xa8\x54\x60\x20\x85\x8d\x19\xae\x41\x1e\xbb\xa6\xd0\x0d\x3f\xb5\xc5\xab\x88\xfc\x36\xa7\xa1\x09\x69\x31\x0e\x49\xb3\x5e\xa7\xd0\x0b\xa6\x22\xce\x51\xa2\xbe\x05\x69\x56\xe8\x86\x0d\x21\x64\x14\xa6\x30\x23\x44\xe8\x6d\xd7\x15\xd2\x6c\x42\xc5\x14\x82\xb6\x85\x0a\x59\x2f\x6d\x38\x82\xad\xbe\x03\x99\x9c\x92\x50\x9b\xcb\x21\x17\x35\x73\x14\x7b\xcc\x26\x74\x36\xc1\x89\x80\x10\xa2\x1c\x49\xe8\x0c\x22\x28\x04\x44\x68\x3f\x55\x92\x5a\x61\x49\xd3\x4e\xc0\x2f\x43\x11\x51\x24\xbd\x88\xc2\x5b\x8b\x93\x18\x59\xd8\xb1\xa3\x42\xd5\xc8\x43\x42\x09\x13\xdc\xcc\xed\xc1\xd4\xd0\xf3\x86\x19\x72\x7d\xa2\x1a\x24\x31\x72\xc2\x8a\x17\x1e\x60\x02\x22\x47\xc8\x89\xe9\x70\x57\x86\x90\x6d\x4e\x54\xab\xe6\x08\x85\x35\xa2\x6d\x09\x27\xa8\x42\x7e\xc9\x2d\x4b\x3b\x13\x98\x3a\x11\x52\xc7\x4c\x05\x39\xc3\xec\x60\x18\x12\xee\xaa\x20\x49\x03\x67\x89\xe0\x46\x57\x2d\xe8\x3e\x22\x1a\x76\xd5\xbc\x58\x9a\x42\xe4\x80\xd2\x5b\x6e\x06\x53\x8f\x6a\x9a\xb3\xfa\x7e\xa8\x14\xd1\x13\x84\xb2\xc9\x6d\x02\x61\x5d\x05\xc9\xa8\x0b\x65\x1c\x3a\x4c\x28\x91\x4c\x08\xea\x62\x0c\xe9\x0f\x75\x99\xb0\xa4\x67\x1b\x99\x82\xae\x5c\x68\x30\xa8\x39\xf3\x2b\xbe\xae\x8a\x18\x12\x5e\x55\x65\x81\xb1\x9e\x88\x71\xfa\xdb\xd7\x6e\x47\x6f\xc5\xd3\x20\x00\x2f\x05\xef\x00\x1f\x02\x9f\x05\x8f\x02\x00\x4b\xc3\xd4\x12\x85\x71\x31\x18\x56\x9c\xc0\xaf\xc7\xb9\x29\x0e\x06\xce\x9a\xa5\x5a\xb7\xd3\x1d\xf8\x6d\xb9\xb4\xa9\x2c\x8d\x03\x64\x18\x2c\xb1\xcf\x95\x4b\xc3\x1c\x15\x7b\x7c\xec\x67\xed\x16\x67\xe1\xc0\xe7\xfd\xf8\x89\xf8\x0a\x1b\x55\x65\x58\xa0\xda\xad\xd1\xe5\x72\xd0\x1b\xb8\x3f\x67\x83\xa8\x18\x65\xd4\xf5\xf3\xfa\xbd\x6a\xfc\xd6\x4e\xbd\xd6\x6e\xe5\x60\x7c\xf6\xc0\xd7\x63\x6f\x6f\xb7\x46\xe5\xd0\x5b\x8f\xdc\xe1\xd3\x3d\xf4\x1a\x12\xd1\x5c\x28\xa8\x4f\x44\x1a\x27\xb2\xb8\xe2\x73\xe6\x59\xbe\xf0\xa0\x6e\xbb\x32\x11\xb1\x30\x9d\x6a\x65\x1b\x08\xef\x9f\x5e\xc8\xa8\x64\xd2\x0d\xd2\x93\x74\x3a\xd3\xec\x11\x94\x0c\x13\x45\x88\x4a\x1e\xa3\x8e\x44\x08\x1b\x72\xca\x0c\xa3\x4a\xb3\x38\x93\x47\x08\x19\xa5\xc8\xce\x1a\x90\xbd\x73\x82\x5b\x0e\x96\xf5\xa8\x6c\x73\x4c\xa9\x81\x31\x6e\x15\xc2\x40\x22\xb8\xfa\x4a\x54\x2d\x22\x8a\x09\x96\x4a\x5a\x85\xdd\x7a\xce\xe2\x5c\x23\x4e\x3e\xa9\x63\xef\x15\xd8\x77\x1d\x1f\x43\x48\x11\x12\x85\x1a\x3c\x5d\x27\x09\x43\xe9\x18\x1a\x82\xe5\x39\xc1\x09\xcb\xfc\x4b\xc3\x28\x76\x89\xae\xe9\x45\x97\x08\x41\x7c\x37\xf4\x34\x92\x32\x78\x5e\x6c\x35\x85\x70\x0a\xb3\x47\xee\x9c\xcf\xfa\x86\xd3\x50\xa1\x6b\xd4\xb3\xb2\x28\xda\x82\x34\xe6\x9b\x49\xd7\x4a\xe7\xb6\x10\xe5\xc1\x69\x91\x9f\xb4\xa6\x19\x61\x5c\xd5\xb7\x2f\xef\xd9\x32\x21\xf9\x6c\xd2\x32\x4a\x81\xa7\xe6\x34\x46\xbd\x43\x8f\xff\x10\x12\xea\x85\x22\x08\xf4\x19\x91\x56\xd4\x12\x81\x45\x2a\x59\x9e\x09\x02\x69\xca\x4f\x3a\xae\xe3\x31\x5d\x60\x87\xd0\x14\x2c\x19\x35\x43\xf7\xcc\x23\x39\x7d\x4a\x49\x33\xb7\xfa\xea\x99\x72\xa1\xc6\xd2\xa1\xca\x65\x0b\x6d\x20\xc0\x8d\x6b\x9f\xc7\x18\xfd\x18\x58\x60\x07\x38\x01\xce\x82\x17\x83\x37\x80\x77\x83\x8f\xc7\x19\x39\xf0\x47\xa6\xac\xc5\x89\x87\xb2\xa1\xd1\xe2\x47\x9c\x92\x86\x8f\x71\x46\x8e\xcf\xdc\x80\x2d\x03\x74\xe2\xd3\x51\x42\x1f\x26\xc4\xc0\x67\x70\xe4\x27\xf1\x45\x57\x50\x7f\x05\xe2\xd8\x65\x36\xf2\x64\xb9\x34\x76\xb1\xde\xb8\x50\xd2\xf8\x8c\x01\x0a\xea\x76\xe2\xcc\x19\x5f\x17\x8e\xb2\xfd\xf8\xda\x84\x8d\x72\xed\xba\xd7\xc5\x9f\xf5\x87\xcc\xc5\x4c\x52\xc4\x08\x26\x70\x3a\x3b\x83\x6b\x19\x84\x93\x13\xa9\x36\x13\x08\x29\xbf\x9d\xb0\x0c\x0b\x63\x4f\xa5\xf6\x31\xae\x53\x68\xba\x51\x6e\xdf\xf4\xfc\x0c\xd5\x39\x7d\xfc\x47\xc9\x70\x4f\x73\xab\xa7\xb4\x42\x61\xf6\x5a\xf8\xb7\xc2\x63\xbe\x26\x88\xa1\x14\x57\x68\x8e\x1f\xcc\xdc\xab\x8b\xd9\x7e\x7a\x0f\xaf\x09\x96\xf3\x26\x98\x9a\xa9\xdc\x7a\x9f\xd9\x6c\x2d\x4f\x96\x52\x85\xd5\x4b\x59\x85\x85\x94\x9c\x2a\xa3\x62\xd8\x8a\xc1\x97\xa2\x7e\x7b\xcb\x4c\xd8\x7b\x92\x9d\xef\x36\xda\xab\x5f\x8f\x70\xba\x66\x7a\xd9\x0c\xaf\x4e\x44\x2a\x59\xc2\xe8\x57\x31\x21\x09\xcf\xd3\xcd\x20\x8d\xed\x60\x47\xe3\x18\xdb\x32\x1d\xa6\x99\x96\x98\xcf\x71\x88\x95\xad\x87\x91\x72\x9c\xe5\xb4\x47\xa5\x31\xd9\xdb\x37\x7d\x68\x3f\xd1\x28\x7f\x8e\x31\xb5\xb7\x57\x9b\xe7\xa6\x95\x9c\xee\xdd\xb6\xfa\x1b\x34\x3b\x97\xe4\x05\x87\x69\x59\x5e\xc3\xb8\x8b\xd2\x93\xfd\xe0\x81\xc8\x5e\xdc\x35\x71\xb3\xbe\x5c\xcc\x44\x56\xd2\xa9\xcd\x96\x7f\xf5\xc3\xee\xfe\x7d\xc7\x29\x75\x83\x9f\x4c\x61\xe8\x63\x14\x62\xae\x34\x24\x4c\x9f\x91\xd5\xf7\x6c\x9d\x9d\xca\xec\x9d\xdd\xde\xd7\x32\xa5\x5a\xba\xed\x24\x83\x9c\x65\x3b\xcc\xd8\x92\x77\x57\xfc\x8c\x85\x83\x38\x17\xbd\x63\xed\x61\xf4\x61\xf4\x73\x10\x82\x23\xe0\x6a\x70\x1e\xdc\x03\x5e\x3a\xf4\x96\x61\xfc\xc7\x46\x2c\xd5\x47\x46\xf4\x4c\x18\xcc\x8f\x32\xcc\xba\xbb\x8c\xab\xf2\xc8\x80\xe1\x20\x71\x8c\x0b\xf7\xa0\x80\x62\x3f\x36\xe6\x0a\x6c\xf7\xf0\x00\xf3\xb2\xb8\x2a\xc6\xf9\x68\x05\x7a\x9d\x59\x54\x1f\x54\xf3\xc0\x1f\x9c\x5e\xf7\x47\x75\xb4\xdd\x0a\xa3\x10\x7d\x90\x06\x10\x4e\x9b\x22\x91\x12\xd0\x49\x45\x32\xb4\x0b\xa8\x33\x53\xcb\xf8\xa1\x29\x35\x43\xaa\xf2\xc2\x73\x77\x2c\x3f\x89\x97\x1f\x0c\xd3\x07\x5e\x8a\xf9\x15\xe6\xa4\x5d\x0a\x97\x5d\x91\xd3\xa7\x8c\xee\x9b\x27\x0d\x4f\xa7\xee\x7e\x1a\xb8\x85\x20\x30\x55\x60\x51\x92\x5e\xb4\x56\x68\x13\x49\x9b\xb0\x6d\xd3\xe9\xfa\xc4\xce\xcb\x1c\x73\xcd\xb3\x28\x27\x16\xaa\x43\xa9\xef\x63\xf2\x90\x5b\x2b\x22\xe5\x10\x9e\xd3\x0f\xf4\x56\x5f\x91\x9a\xa1\xfd\x54\x21\xe5\xa7\x5c\xc7\x2c\x3c\xe9\xc4\x0d\x77\xed\xa3\x9a\xba\xbe\x70\x66\x87\xf6\xf4\x9d\xf7\x24\x49\xce\x50\x7e\xb7\x97\x34\x56\xbf\x22\x08\xe2\x14\x9a\x10\x9d\x2e\x25\x7c\x8a\xcd\xc0\xce\xe6\x3b\xd8\xca\xaf\xbe\xc0\x68\x24\x76\xb9\x5b\x51\xe6\xe0\xf4\x49\x65\xdd\x97\xc1\xb4\xe1\x24\x22\x48\x00\x40\x70\x1f\xfc\x1c\xaa\x61\x06\xca\x60\xdb\x00\xc1\x8e\x02\xaa\x57\x1b\x2e\x79\xb7\x53\x1b\x2e\x6e\x6f\x1d\xc0\xb2\x68\x3d\x62\x46\xcb\xbe\x82\x86\xf8\x0a\xd5\x42\xcb\x26\x4c\x84\x10\xc5\x85\x13\x19\x08\x26\x20\xe6\x94\x6b\x5c\x18\xbb\x2c\x0c\x9d\xc8\xd1\xf4\x15\xcc\x09\x91\x5b\x0c\xc7\xab\xa2\xc3\x07\xb3\x4a\x27\x52\x95\x8a\x54\xce\x77\x7d\xce\xa4\x45\x09\xd6\x12\x74\x80\x1d\x35\x2d\x9b\x99\xd9\x97\x8c\x0a\x34\xd3\xe2\x29\xee\x6c\x55\x96\xb0\xf3\xa1\x99\x2e\x5a\x00\x83\x1f\xaf\x7d\x0c\x5d\x8b\xfe\x1e\xe4\xc1\x76\x70\x1d\x00\xeb\xe9\xa0\xc6\xc7\xb5\xab\x36\x64\x38\xc3\x07\x1e\x39\xcd\x30\x23\x0c\x4a\xdc\x30\xce\x87\x9e\x32\x2c\x17\xe5\x52\xb7\x37\xfe\xe1\xf5\x11\xc0\x8a\x9f\x47\x47\x8d\x40\xf8\x52\x56\xb3\x49\x8a\x38\x27\x42\x48\x6c\x1c\x2b\x79\x4a\x8a\xfd\xb2\xa4\xf4\x83\x4b\xfb\xac\xc2\x8d\xed\x2d\xed\xbc\x53\x0f\xfb\x91\xbc\x29\x8a\xdc\x03\x44\xcb\xec\x31\x20\x35\x0c\x4f\x4b\x55\x20\x77\x0b\x02\xc5\x30\xe4\x79\xd8\x0d\x5c\x1e\x4a\xb4\xd8\x9a\xbb\xdf\x66\x58\x72\x6e\x87\x41\x61\xe6\x5d\x69\xee\x28\xcf\x7a\xfc\x4d\x25\xec\x9e\x3a\xff\xba\xdd\x87\xdf\xb4\x5c\x98\x49\x76\xb0\xe6\xce\xde\xd1\x98\x78\xf9\xb5\x9e\xef\x06\x12\x16\xbd\x36\x41\x88\x52\x69\x94\xab\x93\x45\x88\xd8\x8c\x54\x42\x6a\x00\x41\x7d\xed\xa3\xe8\x32\x7a\x14\x54\xc1\xd1\x61\x04\xad\xa7\xc1\xd8\x44\x70\x80\x37\x87\xa9\x6f\x94\x43\xa3\xb0\x3f\x3a\x6b\x23\x4f\x76\x3b\xf5\xce\x00\xb2\xce\xc6\x79\x72\xc8\x50\x72\x08\xd5\x70\xb2\xbc\xa7\x8a\xdd\x62\xae\xdc\x6d\xf4\x7c\x29\xd5\x3e\x8e\x6a\x99\xe9\x62\x67\x52\x30\xbe\xcb\x0e\x1a\xb7\xec\xad\xcc\xe5\x6e\x68\xca\x95\x14\x14\x49\x86\x02\x08\x43\x04\x09\xe2\xcc\x52\x3a\x7c\xb1\x4a\x1e\x3b\x7e\x61\x36\x05\x65\x29\x31\xe3\x1a\xf7\x5f\xb9\x7f\x29\x93\x09\xab\x59\xde\x74\xa3\xf4\xf4\x35\xce\xee\xc3\x67\xa2\x17\xdd\xba\xe7\xa5\xdb\xa7\x99\x40\x84\xda\x1d\x75\xb6\x51\xa4\x52\x60\x5d\xcb\x3d\x98\xdf\x65\x38\x05\x4e\x0c\x01\xd1\x14\x5f\x01\x80\x82\xdf\x85\x16\x7a\x07\xfa\x11\x08\xc0\x2e\xf0\x36\xf0\x41\xf0\x07\x31\x4f\x2e\x97\x36\x81\xf1\x5a\xb3\x33\x46\xf2\x83\x47\x18\x6d\x62\xb5\x43\x9f\xe8\x76\xd6\xa9\xf0\x00\x9b\xf4\x7b\xf5\x90\x0d\xa0\x7d\xb0\x09\xd2\x0c\xd3\xcc\xa0\xae\xc4\x4b\x35\xfa\x80\xa0\x33\x66\x62\xfd\xf5\xb5\x2c\xc7\x68\x7f\x8c\x77\xa2\xf5\xe5\x1f\x03\xf4\x28\xac\x70\x56\x8f\xb3\x4d\x7c\x4e\x0c\x5c\xd6\xb9\x7c\x4c\xad\xa3\x1c\x44\x2d\x33\xa5\x19\x9c\x09\x4d\xd3\x09\x34\x5c\x79\x07\x23\x58\xa8\x39\xe9\x5a\x0e\xe5\x18\x61\x9e\xf6\x75\x43\x27\x58\x35\x5c\xe2\x68\xa6\x15\x20\x68\xca\xe6\xb4\xcd\xa9\x47\xa7\x67\x53\x2b\x58\xcb\x46\x38\x15\x62\x7d\xc2\x76\xa6\xd3\x26\xc1\x0c\x21\x47\x61\x55\x9d\xcd\xd7\x33\x91\x03\x0b\x85\x2d\x6e\x9a\x7b\x25\xdb\x70\xbd\xa4\xe9\x43\x02\x4d\x08\x19\xb6\xa2\x4c\xde\x16\xd2\x80\xc8\x14\x08\x8b\xd4\x14\x4d\x47\x7a\x6b\xf5\x4f\x21\x8c\x3f\x9f\xeb\x26\x62\x44\xe8\xce\x2d\x50\x19\xc8\xaa\x6b\x25\x5b\x49\x0a\x6d\xf4\xf6\x72\x14\xbb\xb3\xd0\x6d\xdf\xa0\x0a\x41\x33\x6f\xfd\x16\x54\x1a\xd6\x03\x2c\x8d\xb4\xc7\xb1\x65\xeb\x93\x04\x23\x84\x55\x59\x28\x7f\x8a\x09\xd3\x17\x88\xfb\x4c\xf1\x2d\xf9\x69\x04\x75\x19\xe5\x89\x6b\xe9\xad\x94\xb6\x90\x9d\xc8\x41\x6b\x1a\x9b\xa9\xbc\xa6\xa7\x33\x53\x8d\xbc\x21\x21\x84\x84\x48\xcd\xca\x9a\xe6\xa4\xe1\x52\xae\x19\x86\x57\xac\x34\x2c\xa6\x3b\x91\xa1\x2b\x3b\xc4\xc9\x69\x53\x4a\x6c\xd8\x31\x05\xd0\x34\x4a\x11\x64\x88\xd2\x40\xc3\x10\xb3\xca\xea\x17\x24\xc2\xd8\x13\x88\x4a\x45\x77\x97\x98\x01\x00\x01\x1f\x00\xcf\x44\x8f\xa0\xdb\x80\x03\x66\xc0\x2f\x81\x57\xc4\xf9\xae\xce\xea\xa3\x04\xd7\x69\x97\xa2\x1c\x8c\x36\x13\xad\x52\xd7\x1f\xf3\xac\x81\x7f\x6c\x62\x85\x21\x67\xb9\x18\x9e\x6e\xd6\x47\x9e\x40\x02\xc3\x68\x40\xba\xfe\x4d\x9f\x88\x39\x59\x6f\xc4\xed\xe8\x06\x4e\x41\x7b\x4a\x42\x33\x5c\x8a\x34\xa2\xd1\xe8\xa9\x8c\x10\xae\xcf\x56\x89\x2d\xec\x06\xce\x22\x28\x9d\x9b\x5d\x4b\x50\x42\x8e\x98\x56\xa6\x51\x91\xba\x03\x91\x0a\x6c\x98\x72\x0c\xdf\xf6\x21\x61\x84\xa0\xe7\x78\xf3\x1c\xa5\x3d\x99\x61\xce\x54\x96\x4a\x68\x3d\xc1\xc0\xc4\xe2\xb6\xb9\x62\x8b\xa6\xce\x68\x77\xf5\x21\x64\x30\xa1\x4b\x39\x05\xff\xce\xd3\xa0\x2c\x79\x94\x61\x85\xb5\xd9\x94\xfb\xdf\x86\x76\x54\x58\xd5\x0e\x72\x08\x17\xd2\x7e\x93\x98\x82\x6b\x7c\x7e\x17\xa6\x96\x11\xda\x13\x4c\xaf\x28\xcd\xd4\x22\x13\xa2\x30\x3d\xa5\x54\xbe\x94\xa2\x1c\x16\x89\xd6\xf5\x2b\x3a\x44\x52\x2f\x38\xd5\xea\xd0\x58\xba\x31\x34\x96\xa6\x39\x96\x87\xa2\x37\x06\x4a\xe3\x18\x43\x02\x20\xf8\x97\xb5\x0e\x3a\x0d\x3e\x04\x3a\x00\x54\x47\x75\x67\x04\xb9\xba\x9d\x01\x3f\xdf\x14\xb1\x2b\x70\xf0\xc2\x30\xda\xd8\x90\xd3\xa2\x53\xe5\xc5\x6b\xea\x6e\xe4\x27\x89\xca\x2e\xe9\xdc\xa0\x68\xba\x9f\xd6\x0d\x6e\x98\x89\x2c\xc5\x5d\x2e\x75\x16\x6c\xc9\xd8\x7e\x39\x24\xae\xe5\x52\x08\xd1\x96\xc5\x6b\x04\x4a\x27\x3c\x9c\x8c\x66\x02\x49\xb1\xca\xd7\xea\x76\xd1\x4d\x66\x32\xd1\x91\xea\x54\xa8\x4d\x69\xa6\x43\xef\x22\x50\xd3\x00\x01\x8f\x80\x9f\xa3\x0f\xc1\xef\x01\x1b\xe4\xc0\x51\x70\xe7\x30\xcb\xac\x1b\x9c\x0d\x20\xc2\x20\x7d\x76\xe2\x10\x6f\xf5\xea\xfe\x98\xe7\x0f\x75\x85\x0d\x60\x19\xcd\x0f\xe1\x66\x0c\x48\x06\x07\x83\x1f\xc2\x7b\x03\x0f\xaa\x71\x56\x8b\x1f\x83\x13\x07\x90\x25\xec\xaf\xc0\xa8\x15\xf6\x43\xb4\x80\xd3\x25\x69\x3a\x4a\x39\x09\xbe\xd0\xc8\x5f\xd4\x5d\x9a\xcc\xa3\x12\x22\x3a\x91\xba\xa5\x14\x0f\x02\x7b\xe2\xd7\x95\xcf\xa8\xb0\x27\xf8\x76\x8e\x1c\xc3\x2a\x84\x36\xa3\x42\x32\xea\xa4\x96\x77\x27\x82\x72\x4c\x96\x4f\x4a\x2b\xd1\x75\xd3\x6c\x9b\x9e\x34\x93\x5e\x92\x0b\x28\x19\x75\x27\x18\x53\xd0\xc9\x07\xf0\xeb\x14\x61\x82\x30\x94\x9c\x40\xe3\x35\xdc\x94\xb6\xe2\x50\x93\x16\xb2\xd2\xae\xe4\x4c\x60\x42\x95\x2e\x21\xae\x4b\x91\xb2\x0c\xc8\x28\x41\xa6\x89\x09\xb1\xa8\xfb\x0a\x48\x19\x91\x10\x23\x4e\x25\xe2\x84\xc6\x95\x5f\x42\x84\x04\xb4\x30\x01\x80\xc0\xe5\xb5\x5f\x41\xfb\xc1\x1f\x03\x01\x22\x70\x08\xdc\x0a\x40\x35\x8c\x6b\x52\xaf\xdf\xe3\x26\xaa\xd7\xfa\xad\x81\xcd\x37\x12\xf4\x48\xbf\xec\x6c\xe8\x97\xdd\x7f\x4b\xbf\xdc\x14\xac\xff\xae\x50\xf9\x5e\x68\x62\x02\xa9\x96\x11\x05\x8a\x31\xc6\x1c\x31\x62\x0a\xe3\xfd\x04\x21\x31\xd0\x28\x75\xa6\x8b\xa1\x44\xc9\x74\x07\x19\x94\xe8\x36\x45\x68\xa0\x50\x6a\xdc\x90\x06\x76\xc3\x3a\xf9\x05\x35\xd2\x71\x83\x8c\x23\x05\x1f\xaa\x91\x9f\xc6\x08\x22\x88\x2d\x4e\x44\x5c\x96\x31\x81\x1a\xc2\x2f\xf8\xdf\xe9\x8e\x5c\x62\x4a\xa4\x9a\xf7\xff\x7d\x89\x11\x20\x70\xd7\xda\xc7\xd0\xf7\xd0\x63\xa0\x02\xf6\xc5\xbe\xb7\x9e\x97\x86\x2c\x67\x00\x8e\x07\x62\xe3\x38\xbf\x44\x61\xc4\x36\x2b\x4d\xfd\x15\xd8\x19\x68\x5a\xe3\xd0\x89\x53\x16\xfa\x2a\xa4\xd4\x4d\x84\x95\xe3\xf5\xfd\x91\x1d\x96\x66\xae\x28\x07\xe5\x1b\x5e\xf4\x9a\x46\x3d\xf4\x52\xdc\x08\x83\x2c\x59\x39\x53\xce\x14\xcf\x5e\x5d\x47\x3b\xca\x47\xf2\xbb\x3c\xe9\xe4\xb3\x94\x76\x21\xb7\x34\x8a\x2d\xf4\xb6\x8a\x8a\xa9\x4e\xfe\xec\xdc\xf5\x39\x52\x5d\xe8\x3f\x39\x91\x2e\x07\x85\x3b\x1f\xfe\xd4\xde\xed\x81\x0b\x91\xe9\xfe\xe1\x55\x0f\x2e\x66\x9a\xcf\xb8\x8e\x42\x6c\x5f\xb5\xe5\x6c\xfe\x96\x54\x30\xdb\x48\xf8\x3d\x64\x9b\xc2\x66\x5a\x9c\x89\x6f\x59\xfb\x30\x96\xe8\x7f\x82\x06\xd8\x0a\x8e\x83\x57\x6f\xc6\x2b\x9b\xb1\x48\xb7\xf6\xaf\xb1\x08\x1b\xb3\xbe\x7a\xad\x8e\x8a\x83\x5f\x3d\x2a\xd2\xa5\xa1\xea\xd5\x6e\xc5\x60\xc7\xc4\x43\x87\x58\xbf\xdc\x50\x99\x1b\x3f\xd6\x2b\x3b\x1b\x13\x85\x7a\x6d\xa8\xaa\x0d\xb1\x21\xfa\xa9\x13\x66\xf7\xb6\x77\x36\xed\xb9\xfc\x93\x57\x8a\xdd\x01\xaa\x81\x21\x84\x01\x84\x18\x31\x6e\x2a\xbd\x3d\xb1\x78\xcf\x64\xfd\xd9\x57\x1d\xc4\x16\x3c\xfa\x6b\x57\x72\xc6\x5f\x93\xa8\xa7\x67\x84\x69\xf1\xa9\xc9\x45\xa6\xbd\xae\x72\xa2\xb7\xd5\x30\x0d\x39\x9d\x2a\xfb\x35\x0e\xd3\x9e\x47\x23\xa5\x4b\xcd\x55\xba\xd0\x14\x91\x18\x71\xc8\x78\x26\x91\xec\x27\x58\xe0\x7a\x86\x37\x8d\x61\x1e\x22\x8b\x61\x02\x11\x47\x20\x86\x44\x37\xee\x68\xa6\x3c\x34\x00\x45\xcb\x85\xab\xfe\x3d\x50\xf4\xf2\xc2\x2d\x57\xdf\x53\x37\x9e\x79\xfe\x4e\xf8\xa1\x0f\x3b\xbb\x0f\x1d\xdb\x9f\xf6\x61\xe7\xd0\x2b\xbf\x9d\xba\xff\xca\xfd\xcf\xd9\x2e\x27\xb0\x47\x79\x62\xee\xb2\xeb\x1c\xaf\x07\x81\x84\xd0\xd4\x38\x27\x5e\x82\x6a\x8d\x46\xaa\x52\x48\xdf\x9d\xcf\x2f\xb5\xa7\x14\xb3\x45\x83\x47\x35\x5e\x15\xb8\x9a\x07\x08\xee\x5d\xfb\x26\x5a\xc6\x10\xe4\xc1\xf2\xd8\xff\x06\x39\x7a\x98\xa1\xd1\x40\xbb\x8c\xc2\xee\x50\x06\xaa\x8f\xb8\x3c\x67\x9b\xd8\x01\xae\xf5\x7b\x31\x97\x43\x4b\x98\x8a\x84\x2d\x29\x31\x90\x20\xcc\xe6\x82\xe8\x92\xe0\xfb\x88\xc6\x3d\xe6\xe7\xb0\x17\x66\x3d\x47\xd3\xf0\x15\xa5\xa5\x45\x38\xf3\x96\xce\xae\x62\xc8\x18\xb5\x58\x33\xdc\x36\x03\xe1\xd6\xb7\x29\xd2\x08\xa6\xa9\xf0\x6a\x99\x63\x87\xe9\xaf\x6d\xad\x97\xa5\xd0\xa5\x89\xac\x42\xba\xe5\xbf\x70\xae\x0a\x77\x3c\x13\xc3\x56\xce\xf9\x1e\x00\x18\xfc\xda\xda\xb7\xd0\xb7\xd0\xcf\xc1\x24\xd8\x07\x5e\x1b\xf3\x82\xc8\x37\xd1\x30\x60\x06\x5f\x2f\x86\x5d\xe5\x52\x7f\xdd\x2b\x86\xc2\x52\xbd\x36\x90\xba\xf8\xc6\xaf\x1c\x06\x16\xeb\x76\x62\x6c\x17\x7a\x63\x65\x6b\x40\x3a\x37\x64\x85\x11\xb2\xde\x5c\xab\xd6\x63\x72\x24\x54\x6c\x2e\xfa\x61\x34\x88\x55\xf4\x57\x04\x32\x1d\xb9\x72\x79\x8e\x05\x8e\xb9\x12\xcd\x21\x06\x0d\x97\xbb\x45\xb7\x42\x9b\xa7\x6c\x69\x0a\x48\x7f\x0a\x4b\x76\x32\x59\x8e\x3c\x37\xa4\xd0\x12\x6e\x55\xa1\xe0\x30\xd1\xf5\xbf\xca\xcf\x9b\xd9\xf2\x97\x66\xcd\xbe\x79\x88\x1a\x46\xfa\xc8\xb6\xab\xb6\x20\x28\x83\xd2\x52\x73\x5e\x27\x4c\x04\xf3\x73\x21\x8f\xa0\x9c\xd8\xf6\xd4\x9b\xf6\x9f\x4e\x69\x87\x97\x76\x5f\xbd\x2f\x72\x27\xdd\x3d\x5a\x70\xc4\x98\x2a\x07\x45\xf8\x6d\x68\x98\x05\x23\x4a\x9b\xdb\x9b\x2e\x91\x58\x27\x04\xeb\xc2\x62\x44\x28\xea\x27\x68\x1d\x2f\x4d\x24\x34\xa6\x15\x0f\x20\x62\x4c\x53\xce\x8d\x6c\x22\x60\x18\x3a\x02\x93\x83\x6a\xc6\xc7\xca\x5f\x5d\x09\x67\x16\x0d\xe2\xd1\x8e\xe5\x2d\x2c\x1c\x39\xba\xbd\x59\x8a\xcc\x1c\x35\x93\x13\x05\x51\x9e\xb0\x2a\x5d\xd7\xb2\xab\xac\x5e\xdf\x4a\x69\x69\xea\x29\xb5\xf2\xbe\x27\xeb\xd6\xae\x7e\x39\x6d\xe7\x92\x14\x22\xce\x01\x07\xaf\x5e\xfb\x3d\xf4\x67\x38\x05\x02\x30\x05\x9e\x05\x1e\x05\xff\x0f\x54\x30\x31\xe4\xa0\xe5\x61\x96\xab\x8f\x9d\xad\xdd\xf2\x4a\x83\x16\x47\x3f\x76\xaa\xb1\xbe\x1e\xf8\xb4\xb3\x81\xd7\x86\xb8\x3e\x1a\x61\xf9\xcd\x8f\xa1\xd2\x1e\x23\xb1\x4e\x7f\xdd\xd8\xb5\x21\xe6\x6b\x8d\xf2\x01\x8b\xfc\x90\xaf\x67\xa0\x21\x48\x8f\xf3\x40\x14\x8e\x4e\x1f\xe9\x49\xa3\x34\x3a\x02\x84\xb5\xb1\xb2\xbf\x51\xe9\x47\x99\xa6\xdc\x8a\x36\xc5\x43\xd7\x1f\xfc\x51\x31\x71\x7c\x5a\xaf\x39\x64\xcd\x70\xd0\xe0\x89\x3d\x24\xbe\x4c\xcc\xce\x50\xb7\x33\x44\x0a\x83\x6a\xd8\x89\xc9\xec\x50\xc9\xe8\xc1\xb3\x66\x02\xf2\x94\x9d\xa2\x45\x82\x7d\xd6\x30\xe6\x2d\xeb\x1a\x16\x85\x39\x4d\x41\xdb\x4e\x73\xae\x63\xe1\x42\x8c\x20\x44\x2c\x53\x38\x70\x7f\xe8\xf7\xd2\x3e\x41\x7e\xb1\xb4\x7b\x32\xef\xe9\x86\xeb\x66\x63\xb4\x4c\x31\xa5\xba\xc1\x09\x9c\x87\xc2\x4a\x62\x22\x7c\x13\x19\xda\x56\xc4\x67\x59\x42\xb3\x09\xd2\xa0\xbf\x22\x5c\x68\x6f\x39\x7e\xcb\xb9\x9d\x33\x44\xec\x93\x62\xe6\x9a\xbd\xc7\x11\x2c\xfb\x91\x9f\x0a\x2d\xd6\x84\xa4\x17\x0a\x46\xa5\xae\x52\x51\x9a\x90\x5c\xb2\xba\xac\x60\x68\x63\x9c\x36\x52\x85\x44\xda\x31\x67\x27\x83\x42\x66\x7a\x3f\x77\xfd\xc5\x84\xe3\x04\x88\xe7\x33\x5d\x04\x6d\x73\xf5\xad\x11\x49\x20\x42\x20\xd4\x45\xa4\x29\x6e\xa2\xd7\xa2\x40\x27\x91\x23\xd2\x25\xc4\x5d\x53\x62\x16\x4e\xb0\xc9\xc4\x84\x66\x11\x4a\x74\x33\xa5\x61\x87\x21\xc2\x84\xd0\x60\x1e\x52\x87\xc0\x0a\xb5\x57\x7f\xc0\x20\x84\x14\x31\xee\x61\x2c\x3c\xae\x7d\x82\x34\xca\xe9\x6a\x70\xba\x71\xa3\x8e\x4c\x8d\x61\x44\x35\x61\x29\x65\x9a\xc9\xa2\xeb\x89\x7a\x68\x2a\xa2\x1a\xf3\x0c\x73\x33\xe0\x8c\xb0\xaa\x66\x59\xd5\xa6\x30\x55\x56\x3f\x6c\xe3\x59\x35\x95\x99\x3f\x50\x5a\x52\x6e\xf9\xf9\x69\xbb\x44\x1b\x8d\x25\xc6\x0f\x75\xeb\xbb\x0c\xb4\xbc\x07\xa1\x85\xde\x4c\xc9\x93\x3c\x72\x17\xdc\x23\x06\x23\x82\xb9\x61\x3d\x17\x79\x4c\xd8\x48\xf0\x30\x53\xb0\xf3\x25\xd7\xc8\xa6\xea\x15\xcd\x62\x32\xd1\x08\xc3\xdc\x94\x61\x2d\x4c\xd5\x31\x9a\xf0\x44\xa5\xf0\xa8\xe5\xe8\x09\xc7\x34\x20\x43\x4c\x60\x0f\x42\xf4\x4d\x2e\x82\x06\x84\x18\x72\x33\xad\xf9\x9a\x70\x39\xc7\xc4\x34\x10\x46\x09\x8a\x20\x12\x02\x61\x1d\x00\x06\x9e\xb3\xf6\x1d\xf4\x69\x6c\x81\x12\xb8\x0d\xbc\x04\xfc\x26\xf8\x12\xf8\x2b\x00\x60\xa9\x3e\x0b\xf9\x50\xf1\xea\xd5\x7b\xfd\x18\x12\x0f\x3d\x7e\x08\x9d\xc2\x81\x58\xbe\x0e\x86\xf8\x40\x02\x19\xb1\xff\x51\x47\x68\xe0\xc1\xa3\x0a\x3b\x0c\x84\xb1\x8b\x46\x3e\x1b\x78\xf5\x3a\x9b\x1d\x61\x8c\x38\x95\x8d\xf9\x51\xbf\x35\x48\x5d\x03\xe5\xb6\x56\x67\x23\xb1\xb6\xbe\xde\x86\x1a\xf1\xe8\xa8\x16\xc7\xcd\x88\x5f\xf7\x7b\xdd\x5a\x7d\x03\xb8\xc4\x49\x70\xbe\xdf\x1a\xa2\x95\x76\x2b\xce\xb8\xe5\x51\xd4\xa0\x8f\x99\x1c\xd7\x14\xb5\x31\x41\x30\x01\x09\xe2\x82\x4a\x44\x2d\xce\x91\x60\x18\x0b\xd1\x48\x21\xc5\x03\xdb\xe8\x08\x8c\x39\x14\xfa\x5c\x94\x6a\x18\xd2\x11\x7a\x48\xb1\xdb\x6f\xa7\x77\x85\xa6\x2e\xae\xcb\x1e\x9e\x28\x76\xfb\x7a\x05\x25\x20\x81\xd0\x64\x34\xa3\x33\x31\x45\x5d\x93\x14\x4d\xc1\x6b\x1e\x77\x21\x92\x14\x59\xca\xb5\x38\x73\x56\x7f\x9f\x32\x12\xa4\x67\x44\xc0\x91\xc2\x3c\x94\x8e\xc2\x58\x69\x16\x24\x8a\xe2\x44\xe0\xcb\x6e\x61\x27\x34\x20\xc2\x14\xb1\x34\xa1\x54\xf3\x6c\xcb\x3c\xe8\x18\x8e\x9e\x8a\x32\xe5\xc8\x13\x5a\x9f\x58\xba\xa4\x18\x41\x95\xd2\x2a\xd0\xb4\x34\x3d\x59\xd9\xb6\xcb\x11\xae\xdb\x27\xa8\xe9\xa4\xc4\x85\x27\xfb\x7e\xd2\xf5\x3b\x79\x45\xf3\x05\x2c\xc2\x84\x93\x70\x93\xdd\x7e\x2a\x91\x09\xbc\xb4\xe6\xc6\xc6\x67\x49\xa7\x90\xab\x24\xdf\x5c\x3f\x77\xed\x7e\xa9\x51\xbb\xae\xa9\x17\x5d\x8f\x6e\xcd\x4d\x1b\x0e\x36\xb0\xfe\x4b\x76\x46\x6f\xb0\x1a\x82\x94\xb8\xca\xce\x72\x85\x4d\x6c\xc2\x34\x46\x1d\xc7\x91\x90\x22\xa8\x21\x03\x22\x4f\x87\x04\x63\xce\x18\x82\x8a\x7e\x52\x70\x7d\xda\xf2\x74\xdb\xd9\xb7\xd7\xf3\x42\x22\x2a\xb9\x5c\xe2\xb0\x67\x9a\x84\x48\x53\xbd\x2f\xb2\x0a\x48\x08\x9d\xf9\x36\x00\x1c\xbc\x7e\xed\xdb\xe8\x3b\x58\x07\x79\x30\x05\xda\xe0\x97\xc1\xaf\x83\xdf\x03\x9f\x8f\xfd\x6d\x28\x56\x8c\x44\xd6\x41\x56\x5b\xef\xf8\x8c\xd4\xb2\x5a\xbd\xd7\xad\xb5\x5b\xdc\x1f\x56\xc4\xfa\x10\x9a\x8e\xd5\xfc\x81\xd0\x14\x0e\x10\xd9\x7a\x95\x1c\xeb\xf2\xbd\x51\xb3\x72\xe8\x3a\x03\x7f\x1b\x16\xd1\x61\x0f\x7c\x30\x88\xe0\x0f\x93\xf9\xd8\x25\xb1\x89\xca\xa5\x81\xd6\x58\x1f\x65\xdc\x7e\x6f\x5d\x01\x1e\x12\xa7\x7e\xaf\x3c\x6a\xf4\xd6\x5b\x71\xe2\x1c\xb8\x34\xfa\x33\x99\xe7\x73\x61\x76\x02\x33\x62\x60\x86\xf0\xae\x23\x0a\xcb\x02\xcd\x4c\x04\x16\x42\x88\xc6\x39\x53\xa0\x48\x62\x89\x53\x98\x1a\x57\x36\x16\x6f\xde\xb7\x73\x81\x21\xcb\x2c\xa6\xb3\x2d\x5a\xce\xcd\xe5\xd2\x93\x5b\x13\x85\xbb\xf3\xbe\x65\x38\xd9\xab\x20\xb4\x21\x64\xc6\x96\x39\x2e\x76\xfc\xf6\x74\xbe\x81\x70\x33\xfd\x02\x2e\x69\x14\x65\xdd\xa4\x17\x61\x44\x68\xcc\x92\x8b\x7a\xb1\xbb\xb2\xcb\x9d\xd7\x73\x10\x3b\x58\x4a\x02\x43\x4c\x8d\xaf\x69\xca\xc8\x28\x51\xc3\x88\x23\x13\x0b\x5a\x8e\x34\x42\x78\xc6\x9b\x26\x8e\x9f\x4e\x42\x1b\x57\x32\x66\x92\xc8\x34\x7c\x70\x3a\xdd\xd4\x45\x40\x89\x30\xb8\x64\x01\x4d\x4b\xce\x32\xdd\x06\x26\x8f\x69\xae\x47\x88\xcd\xfc\x53\x16\x09\x31\x7c\xcf\x89\xc4\x8e\x9d\xa5\x32\xc3\x73\x13\x39\x11\x7a\x8e\xdf\xed\xb6\x2d\x93\x69\xbb\xe6\xea\x53\x4b\x2a\x1d\x1e\xcd\x6a\x8b\x3b\x6b\x87\x59\x60\x6d\x83\xa6\x4b\x0c\x67\x66\xb6\x45\x93\x48\x5a\x61\x25\x59\xa8\x6a\xba\x8a\x22\x61\xbb\x89\x6d\x7e\x6b\xf5\x87\x8c\xfb\x1a\x97\xc1\xab\x05\xd7\x08\x4a\x9b\x84\xcd\xe8\x9a\x49\x50\x99\xc8\xec\x64\x3d\x28\x78\x28\xa1\xe3\x5c\x16\x00\x0a\x5e\xbf\xf6\x01\xf4\x37\x18\x01\x07\x64\xc1\xcd\xe0\xb5\xe0\x8b\x00\xc0\x21\x39\xeb\x76\x7a\xcd\x16\x1b\xb8\x48\xb5\x36\x48\x20\x83\x4a\xed\xad\xe3\xfb\x51\x86\xda\x84\xcc\x37\x69\x23\xe3\x11\x87\x75\xb7\x1b\xb1\x9d\x4d\x9e\xc0\x7e\xb1\xe4\xc7\x9e\xd9\x5b\xef\x00\x74\xc7\x2d\xf7\x61\xfd\xe6\x83\xe6\xfb\xd8\x69\xd7\xcb\xf4\x0a\xec\xf6\xc6\xe0\x7f\xe4\xd4\xe3\x9e\xfd\x18\x35\xa0\xdf\x55\x15\x86\x34\x39\xc1\xa8\xa3\x19\xab\x3f\xb2\x8a\x19\x5f\x99\xb5\xaf\x21\xcd\x80\x78\xae\xd3\x49\x65\x9d\x9e\x9e\x6f\xf7\xa3\x12\xd1\x52\x8d\xf3\xcd\x99\xf3\xfb\xe7\x8a\x5d\x8a\xa5\xb0\x15\xc6\x4e\x9a\x18\x26\x8b\x04\x71\x4d\x69\x18\xfe\x34\x49\x53\xe2\x09\xab\xbb\xe3\xc0\xa1\xeb\xaf\xa1\x18\x62\x23\xe9\xfb\x33\x47\x17\xfb\x13\xd9\x24\xa2\x27\xc3\x72\xfa\xca\xeb\x31\xf1\x15\xe2\x69\xc7\x31\x20\xb2\xbf\x8c\x8a\x29\x2f\x69\x4a\x2d\xf4\x33\xd9\x62\xc1\xb1\xd4\x16\x52\x4e\x14\xb7\x58\xe9\x64\x21\x95\x10\x21\xa2\x8a\x50\xce\x10\xf4\xa6\x78\x12\x3e\x17\xd6\x1c\x66\xe9\x4c\xd3\x52\x79\x3b\xa5\xf1\xf7\x10\x84\x5c\xcd\xcf\x9a\x7c\xf5\xbb\x9a\x4a\x96\x27\x59\x6a\xae\xed\x49\x3e\x35\xd7\x3f\x79\xcf\x74\xfb\x39\x5b\xae\x2b\xdb\xc7\xda\x8d\x09\x69\x39\x86\x21\x6d\x3f\x28\x11\x83\x21\x84\xb0\xee\xee\xc0\xee\x7c\xc5\x5e\xea\xec\xb8\xb6\x3b\x93\x13\xb9\x46\x3a\xdd\x2e\x25\x0d\xc5\x2d\x0c\x0d\xfc\x42\x8c\xb1\x44\x42\x10\x8b\x58\xd8\x60\xe9\x6e\x33\x89\x7a\x6a\x4b\xb3\x9c\x86\x28\x26\xcc\x32\x59\x4b\xeb\x5e\xd2\xb0\xb4\x46\x26\x0d\x3d\x27\xdf\x49\x67\xda\x84\x71\xcd\x4a\x47\xcc\xd3\x45\xda\x37\xd2\x22\x1d\xa3\xf4\x87\xd6\x1e\x45\x5f\x44\xff\x02\x92\x60\x3b\x78\x5e\x8c\xfa\x62\x6c\x34\x6a\x0e\x97\xe3\xca\xd1\x1a\x34\xa2\xab\xe1\x26\xd6\x3b\xc2\xdd\x9d\xee\x46\x37\x78\x04\x0f\xc7\xd5\xe5\x09\x6e\xb4\x49\xd3\xae\x0d\x55\x05\x36\x66\xcc\xb1\xa5\xd7\x51\x24\x67\xf0\x55\x49\xe4\x32\x4e\x39\xe4\x56\x02\x0a\x8c\x2d\x4d\x53\x19\x3d\x07\xb7\x90\xc6\xb2\xb1\x23\xa3\x14\xf7\x19\xa7\xcc\x14\x71\xf5\x4e\x45\xb2\x9a\x4a\x9b\xba\x4a\xda\x16\x41\xb7\xcd\xef\xd9\x2f\x91\xad\xb3\xa4\xa3\x69\xd2\xcc\xd0\x6c\x72\x6a\x39\x57\x76\xf8\xe9\x50\xcb\xa7\xf4\x39\xbd\x5a\xbf\xd6\x67\x4c\x06\xe4\xae\x23\xa5\x45\x99\x9f\x4b\x19\xa8\x8b\x72\xb6\x9f\x35\x99\xef\x27\x21\x46\x82\x43\x84\x2d\x5b\x1e\xba\x90\x7d\xd9\x5d\x73\xf3\x6e\x02\xa7\x95\x47\x50\x68\x59\x92\xa1\xb7\x37\xdc\x93\x4b\x45\xa7\x9a\x37\x43\xaf\x37\xfd\x8a\x57\x1f\x75\x9d\x7c\x37\x2e\x89\x8e\xa6\xf9\x13\xdc\x2a\x9e\x39\x7e\xf7\x9b\x72\x65\x53\x32\x54\x85\x3e\xcb\xd8\xf6\x7e\x8a\x34\x61\xf7\xf3\xe5\x92\x03\x28\x78\xc5\xda\xfb\xd0\xd7\xd0\xcf\xc1\x0c\x38\x09\x9e\x03\x5e\x03\xde\x39\xd4\xda\x36\x74\xf0\xe1\xdc\xc9\x26\x9c\x5c\x1b\x76\xec\x87\x33\x29\xc3\xf5\xac\xf5\x9f\xd0\x15\x19\xb3\x9b\x51\x68\xc6\x67\xe1\xd1\x90\xcb\xa6\xee\xdc\x06\xee\x18\x74\xdb\xda\xc3\xf0\xf2\xc6\x03\x04\xeb\xc3\x4e\xc3\xe0\xab\x6f\xe0\x97\x41\xb1\x89\x9f\x43\x5f\x51\xb9\xc9\x33\x4b\xdd\x05\x42\x7a\x66\x29\xaf\xa5\x97\xf7\x0b\x13\x09\xdf\xb6\x14\xa2\x05\x8e\x74\x41\xa0\xa0\xb5\x6b\xb6\x3e\x72\xf3\xeb\x28\xe6\x26\x62\xd3\x7a\x58\xb7\x2a\x99\xe6\x0d\x57\xef\xbf\x02\xc1\x39\x08\xa3\xac\x19\xbd\x99\x97\xb2\xae\x82\xd0\xd2\xdc\x92\xc5\x88\x67\x2c\x70\x87\xb1\xbd\xb5\x1a\xd5\x75\x26\x72\x62\x41\xcb\x14\x9c\x0c\x4b\x32\x53\x95\xc2\x44\x52\x65\x0a\x95\x7d\x07\xb8\x9e\x30\x9b\x04\xb1\x20\x9d\x87\xa8\xea\x24\xb4\xce\x47\x8f\xcc\x6e\x6f\xe7\x1d\x93\x40\x43\x87\xa8\x3a\xb3\x10\x48\x8b\xb8\x85\xde\x4c\x25\xb4\x54\xbe\x70\x55\xe1\x66\x7b\x4a\xea\xea\x9a\x3d\xfe\x2d\x17\x31\x7c\xd3\x53\x67\xec\x94\x08\x7d\xaa\xdb\x41\x79\x5f\x39\xb7\x2f\x39\xcd\xd9\x96\x9d\xb7\x2f\x36\x52\x3c\x53\x49\xcd\xcc\x2d\xc0\xbb\x6b\xc9\x80\x51\x2e\x64\x22\x69\x67\x15\x37\x65\x58\x33\x21\x11\xc8\x5a\xce\xf6\x21\x59\xfd\x5a\xd4\x5c\x48\x5b\x08\xcb\x50\xf9\xf5\xea\xe4\xf4\x4b\x13\xa6\xe7\x48\xc8\x90\xe3\x07\x99\x25\x4c\xe2\x3c\xfc\xba\xb5\x2f\xa0\xaf\xa2\xef\x83\x49\x70\x13\xb8\x13\xbc\x18\xbc\x77\xb3\x92\xb2\x11\x31\xbd\xe6\x38\x5e\x46\x72\xe4\x90\xf3\x0c\xb8\xe9\xc6\x54\xd9\x26\x19\x29\x1c\xb6\x2d\xba\xa3\xe1\x8a\x72\xa9\x5e\x19\x7b\xcb\x7a\x67\x64\xc8\x9f\x02\xdf\x5b\x77\x9c\x8d\x9a\xdd\xef\xd5\xfd\xc1\x25\x3b\xf1\x25\xd6\xc3\x6e\x38\xe9\x14\x0e\x87\x0f\xbb\x9d\x7e\x88\xbe\x02\x15\xe3\xf8\x70\xaa\x5e\x64\xd4\xc6\x7a\xba\xe2\xcd\x30\xcf\x36\x09\x76\x3d\x4c\x69\xcc\x33\x8c\xbd\xad\xf9\x7d\xb7\xcc\xd4\x52\x29\xd3\xda\x4a\x85\x10\xae\xd7\xd0\x2c\xc7\x4a\x4d\x2e\xcf\xd6\x15\x33\x99\x20\xd5\x6c\x86\xd1\xd5\x55\x04\xcf\xef\x3a\xbc\x6b\xeb\x0e\x45\x2c\xf5\x35\x4b\x30\x28\x53\xe1\x53\x68\x39\x40\xc6\xb6\x5b\x03\x92\x2d\x2e\x68\xea\x40\xa4\x0e\x95\x2c\x28\x84\x64\x72\x36\x1b\x2a\x85\x61\xc6\x97\x86\xae\x99\x9a\x59\x81\xaf\xaf\xe6\x4e\x57\x3c\x6f\xf7\xa9\x9c\xef\x18\x0e\x86\xc4\x4b\xe9\x47\x89\x71\x78\xf7\x81\x83\x37\x9e\xc3\x12\x63\x2f\xa2\xbc\xbf\x74\xa0\x75\xef\x3d\x8d\xed\xae\x91\x30\xcd\xe9\x92\xa6\x39\x8e\x61\x90\x74\xc1\x4c\x40\xd8\x6c\xf4\xb3\x4e\x8a\xa0\x46\x11\xf6\xbe\x71\xdf\x8e\x49\x8c\xf2\xa5\x56\x70\xeb\xf1\x7f\xb6\x04\x36\x89\x14\x14\x2a\x5d\x0f\xda\x45\x28\xa8\xb8\xda\xb4\xe6\x8a\x55\x28\x43\xed\xfc\x19\x0c\x25\x44\x18\x52\xb7\x58\xce\xcc\x62\xe8\x7a\xaa\x28\xa4\xed\x58\xbe\xe5\x7b\x94\x02\x0a\x17\x06\x53\xa1\x8b\x20\x07\xa6\xc1\x8e\xf1\x64\x68\x6c\x83\x71\x93\x76\x34\x13\xc8\xba\x9d\x76\x6f\xbd\xd4\x0d\x21\xd6\xe0\xaf\x70\xdd\xce\xfd\x5e\x0e\x0f\xe5\xf3\xff\x6a\xb9\x15\x4d\x65\x42\x0c\x7d\xae\x33\x18\xf1\x72\x31\x65\x90\x64\xb5\x73\x34\xb1\x33\xdf\x14\xe7\x12\xb9\x42\x99\x96\x03\x4b\xf1\xac\x85\x91\x94\x21\x2f\x72\xc1\x6c\xe3\xf2\x50\x8a\x9d\xa8\x8c\xa4\x58\x5d\xd9\x8d\xb1\x14\xeb\x90\x7f\x43\x8a\x45\x08\xca\x91\x14\x9b\x29\x38\x6e\x90\xb5\x47\x52\x6c\x50\x86\xcf\xd8\x42\xb8\xd4\xfd\x19\x29\x02\x13\x61\x83\xfa\xc9\x10\x71\x01\x7d\x3e\xbf\x3d\x2b\xe7\x33\xf3\xce\x31\x0a\xd3\xf9\xaa\xfb\x6c\xaa\x13\xac\x51\x4e\x20\x24\x1c\x2a\x42\x3e\xff\x5f\xa1\xd7\x52\x08\xd6\xae\x44\x2b\x68\xcb\xc0\x4a\xdb\xc1\xb5\xe0\x32\x00\x60\x93\x58\xb4\x61\x26\x3e\xb4\xd3\xbf\xb2\x92\x3f\xb2\x52\xbf\x97\x83\xbd\xf1\xf4\xdf\x26\x55\xea\x17\xfa\x20\xad\xe1\x94\xc4\x26\xd5\xb4\x35\x78\x11\xd5\xeb\x1a\x11\xfa\xd0\x10\x95\x82\x25\x9d\xd6\xbe\xe3\x89\x9d\x85\xf9\x81\x1d\xaa\x85\xd0\xb6\xe7\xe9\xc0\x08\x39\xa1\xb3\x14\x11\x7d\xd4\x4b\x75\x53\xca\xe0\x86\x9e\x48\x13\xd2\xe2\x31\x39\x58\x48\xdb\xe5\x3d\xd0\xa7\x76\x3a\xd9\x29\x06\x9a\x74\xcc\x12\x9f\x8c\xf2\x29\x0e\xaf\x2b\x11\x46\xd9\x13\x17\x1a\x42\xaa\xf0\x75\xfd\x0c\xd9\xb4\xce\xcf\x61\x06\x31\xcd\xc1\x2a\x63\x45\x3e\x82\xa9\xbf\xc7\xad\x56\xed\xbc\x13\xa5\xd3\xe1\xa1\xf2\x64\xa0\x4d\xca\xe0\x26\x48\x8b\x58\x6d\xb7\x72\xa5\x00\x42\x82\x6c\xa3\x99\xb0\x76\xb8\x14\x00\x04\xfe\x17\x78\x10\x1d\x47\xa7\x41\x38\xd6\xbf\x87\x15\x69\xbc\x46\x83\xdf\x3a\x6e\xeb\xd7\xc7\xf0\x73\x33\xa4\xdc\xc4\x3b\x07\xfe\x3b\x18\x52\x38\xa2\xcf\xa4\x8a\x73\xba\xed\xca\xd6\x34\x96\x4e\xb2\xe3\xe5\x53\x6e\x3e\x35\x97\x21\x26\x93\x7d\xc2\xaa\xf9\x7c\x7d\x47\x7a\x3e\x5f\xd2\xcd\x4a\xca\xce\x39\xba\xde\x98\x31\xc2\xdc\x56\x53\x16\xb3\xf0\xd3\x78\xbe\x8c\x48\xa9\x19\x88\x9a\x9f\xcb\x68\x58\x06\xd3\x98\xae\x3e\x56\xac\x04\xc4\x70\xc2\x1c\x57\xe5\xac\x69\x17\x6a\x75\x6b\x2e\x8f\x78\x35\x9a\xc4\xd4\x31\x8c\xbc\x8e\x85\x6e\x7b\xb5\x62\xe8\x3b\x86\x88\x19\xfe\x2b\xc1\x2b\xd1\x47\xd0\x04\x70\x40\x01\x2c\x83\x83\xe0\x19\xe0\xf5\x43\xe5\x2b\x1c\x34\x89\x47\x18\xa5\x3e\x6a\x37\x8d\x9b\x4d\xfe\xa0\xb3\x34\xd4\xa2\x86\xf9\x73\xbd\x95\xf4\xaf\x1a\x51\x43\x22\xf6\xc4\x3e\xd4\x2f\xb6\xa1\xfe\x3f\x77\xa1\x3e\x62\x4a\xc4\x25\xc2\x32\xbf\x1d\x11\xa4\xbd\x03\xa5\x4b\x92\x1f\xa6\x0d\xbe\x30\x59\xb8\xe1\x84\x37\xf1\x66\x5d\xf1\xf2\x24\xdb\x2e\xd0\x64\xa2\x9d\xf9\x63\xbf\x44\x95\xd3\x74\x74\x8f\xa4\x72\xa8\x84\xb0\x4e\x34\xc3\x52\x4e\x18\x58\x13\x6f\x56\x3e\x65\xc2\x8a\xcf\x85\x39\x2b\x1f\x3a\x8c\x08\xc9\xa9\x9d\x5e\xde\x35\x5b\xe6\x9a\xd1\x3c\x21\xed\xa8\xe7\x64\xe8\x76\x95\x32\x13\x6e\x8a\x49\x28\x38\x75\x27\x18\x55\xd0\xcd\x85\xf0\xb5\x55\x5d\x6c\xc1\xd8\x4b\x08\x89\x50\xc2\x9a\xbe\x99\x22\xc8\x21\x52\x1c\x1a\xcf\xf0\xaa\x4c\x61\x84\x71\x5d\x97\x45\x8d\x60\x2e\x99\xfb\xf8\x2f\xb6\xb2\xcc\xcd\x9d\xac\xcc\x7f\xa0\x91\x85\xa0\x09\x5e\x88\x3e\x81\x0e\x82\x2c\xb8\x1a\x00\x30\x0e\xc8\xcd\x0a\xe3\x48\x0a\x09\xfc\xfa\x46\x9f\x66\x24\xc0\x8c\xe3\x36\x2e\x87\x03\x57\xdd\xc0\x48\xed\xf9\x4d\x55\x17\x7d\x68\xeb\x21\xbd\x10\x49\x42\x0e\x54\xbb\x5a\x16\x12\x48\xf4\x04\x71\x12\xd9\xab\x89\xa5\x29\xef\x62\xa2\x44\xd3\x6e\x38\x95\x0a\xdd\x6a\xc6\xe4\xc9\x60\xce\xf1\x6d\xd4\xf1\x92\x7e\x0a\x59\x96\xcf\x99\x51\xb2\x92\x09\x7d\x77\x6a\xca\xf7\xab\xb0\x32\xd5\x36\x4a\x94\xf7\x33\x53\x2a\x5f\x16\x3c\x22\xa6\x70\x39\x4e\x17\xe7\xbc\x72\xc2\x56\x7a\xf2\x90\x5d\xc5\x76\x23\x4c\x46\x1e\xa2\x96\xc0\x19\xa6\xbb\xae\x85\x34\x2f\x09\x39\x33\x73\x6e\x22\xb0\x13\x66\xd3\x2c\xdb\x4e\x01\x00\x02\x3e\xba\xf6\xe7\xe8\x33\xd8\x04\x39\x30\x09\x1e\x00\x9f\x1d\x77\x04\xba\x9d\x21\xb6\x18\x67\xb7\x5a\x5c\xe6\xd9\x60\x11\x86\x10\x33\xf6\xdc\x18\x43\xf2\xda\x78\x52\x73\x38\x97\x1c\x46\xe3\xd9\xd2\xd1\x7c\xca\x2c\x5c\x9f\xd6\x09\xc7\xfb\x13\xd6\x7b\x34\xfe\x20\x59\xce\x8f\x84\xd8\x11\x58\x29\x8d\x01\xc9\xc6\xb4\xc5\x18\x90\xb2\x60\x43\xcb\xef\x6d\xb0\xba\xd1\x88\x68\xbf\x57\xef\xf5\x3b\x23\xee\x18\xf8\xe8\x53\xdc\xa1\x9e\x27\x03\x44\x15\x14\x38\x8f\x69\x83\x40\xf5\xd7\xbc\xe6\x26\x32\x06\x4d\x45\xbd\x3b\xc2\xc8\x9c\x12\x08\xdb\xae\x4f\x10\xa5\xc4\xa8\x72\x34\x5f\xc8\x45\xb9\x1c\x0e\x75\x13\x63\x84\x6a\xe9\xb9\x64\x12\x93\xbc\x83\x25\xe7\xfa\x7e\xc7\x9e\x8c\x74\x28\x35\xe1\x5b\x3e\x63\x7e\x95\xa8\x1b\xae\x9a\x41\x29\xe9\x45\x51\xb6\xde\xac\xd9\xbb\x2c\x8a\x31\xa5\x98\x72\x4b\x69\xc8\xa4\xa6\x4c\x24\x4d\x13\x12\xd3\x72\x99\x4b\xa9\xc6\x23\x53\x41\xcc\x08\xc9\xcb\x5c\x52\xe7\x1c\x4d\x96\x1a\x7e\x29\x70\xa8\x1f\x88\x64\x19\x51\x3e\x21\x88\xc0\x72\x2f\x61\x07\x75\x5e\x90\x0c\x96\xa5\x5a\x08\x33\xaf\x9c\x50\x9c\x13\x58\x28\xcf\x14\x72\x45\x28\x98\x2f\x70\xa2\x2c\x64\x71\xd2\x09\x53\x66\x0b\x0b\x8c\xb9\x96\x29\x5f\x71\x74\xa6\xe0\x70\x01\x8f\x98\xae\xa1\x17\x1c\x52\x74\x02\x22\x04\x71\x2d\xd7\x90\x3a\xee\x14\x4d\x7d\x62\x7e\x1a\x43\x49\x99\x9a\x5b\xda\xbb\xfc\xba\xa0\xc4\x8b\xa9\x30\x2d\x79\x2a\x17\x58\x1a\xb3\x50\xda\xe7\x86\x8a\x7f\x81\x66\x42\xee\xf1\x74\x64\xe6\x2c\xcd\x10\x19\xe6\x27\xc2\x09\xcf\xa7\x92\x87\x90\x53\xc0\xc0\xed\x6b\xdf\x43\xdf\x46\xf7\x02\x06\x4c\xb0\x04\xde\x02\xde\x0f\x3e\x16\xfb\x4d\x6c\xe7\x30\x62\x03\xc2\xb7\xc9\x7a\x1b\x8d\x97\x5a\x2f\x0a\xb7\xc1\x75\x14\x32\x0b\xfb\x83\xde\x1f\x5f\x67\x77\xeb\xb8\x74\x13\x6e\x1d\xf6\x57\x46\xd6\xf7\xc3\xcd\x0e\x34\xf4\x92\x76\x2b\x76\xd5\x91\xbf\xc4\xe0\x78\xb0\x21\x60\x58\x3a\x36\xc0\x2f\xac\x95\x87\x91\x3d\x68\x0e\xc4\xf8\x76\x30\x34\x18\xe4\x86\x9c\xe4\x56\xc2\x15\x61\xd6\x34\x44\x34\xc1\x58\xb4\x68\xfb\x99\x5d\xf3\x3b\xf2\x79\xa1\x67\x0a\x87\xba\x49\xca\xad\x20\x21\xd3\x18\x8b\x04\x45\x3e\x84\x01\xa2\x9c\x99\x4a\x2d\x9a\x7e\x23\x48\x2e\x56\x95\xa0\x86\xeb\x28\x35\x9b\xf6\x24\x4f\x17\xab\x41\x40\x09\x95\x38\xab\x63\x9d\x32\xdb\x0c\x39\xb6\xb2\x1d\xe7\xe0\x64\xbd\xcf\x30\x55\xa5\xf6\x94\x9d\x35\xb1\xc8\xa5\x52\x11\xa4\x27\x97\xf6\xec\x20\x0c\xd1\xc0\xac\x2f\x22\x5a\xdb\xf6\x88\x6b\xbe\xec\x0a\x29\xf8\xea\x9f\x38\x19\x84\x19\x84\x26\x27\x0e\xf1\xca\x90\x40\x4b\x05\xd0\x40\x50\x05\xe8\x0c\xd5\x6d\x88\x82\x45\x34\x81\x50\xe5\xb9\xee\x2d\x27\x7a\x07\x5b\xe5\x40\x08\xcc\x19\xd5\x0a\xc9\xae\x8e\xb0\x69\x94\x53\xa1\x8c\x2e\x26\x3a\x9a\x99\x60\x52\xc1\x22\x9b\xbf\x61\x7a\x62\xd1\x57\x15\xc5\x05\xc5\xbd\xfa\x4c\xbe\x18\xa6\x72\x0a\x2b\x12\xf1\xb6\x6b\xab\x1c\x55\x01\x44\xd7\x86\xe5\x7d\x36\x9d\x58\xba\xb8\xe0\x4d\x84\x25\xcd\x80\x98\x60\x22\xb2\x5c\x16\x9b\x55\x24\x93\x76\xe9\x69\xcd\x17\x1c\x7a\xb6\x82\x2f\xb7\x7b\xf3\xab\x77\x12\xc8\x98\x29\x21\x13\x04\x3e\x25\x24\x10\xc2\x88\x33\xac\x38\xa0\xe0\x8f\xd6\x3e\x83\x97\xd1\x1a\x08\xc1\x6e\x70\x0d\xb8\x1b\xdc\x0b\x40\xb5\x54\x1b\x2b\x41\x9b\x49\x09\x1f\x6e\x73\xd8\x10\x0a\x07\x94\x7f\xec\x04\x9d\xde\x58\x9b\x1c\x8d\x15\x87\x63\x31\x9c\x6d\x52\xbc\xeb\x9d\xd8\xe2\x23\xdc\x34\x12\x96\x7a\x03\x06\x1a\xd7\xde\xc1\xe8\x27\x9e\x13\x09\x82\xaa\x75\x2e\xf3\x11\x41\x44\x25\x5d\xd7\xa8\x57\xb8\xbf\x3b\xb5\xf7\x20\x25\x9a\xc1\xcc\x89\xa5\x5e\xca\xd0\x22\x73\xf6\x4a\x95\xdf\xb5\x77\x21\xd7\xf4\xe7\x8a\x85\x36\x9e\xc8\x7d\x1e\xea\x6a\xd6\x98\xd1\x93\x15\xdd\x63\x86\xb0\xb2\x93\x95\x06\xde\x0b\x51\xa8\x9b\x05\x8c\x6b\x25\x4c\x7c\xb7\x3e\xcd\xd4\xbc\x96\x39\x8a\x20\x62\xc2\xb3\xec\xd3\xdd\x5c\x78\xdb\xdd\x85\x89\x3b\x8e\xda\x62\x6f\xa7\x53\x7e\xf0\x45\xb9\x27\x1f\x9d\xdb\xbb\x5c\x25\xca\xe0\x69\x6d\xd2\x5a\x46\x64\x7f\x22\x77\xea\x2f\xbe\xdb\x5f\x86\x58\x38\xed\x7b\xee\xb8\xef\x9d\xbc\x55\x4f\x9b\x91\xa3\x65\x96\x09\x32\x7c\x45\x66\x94\x8b\x09\x65\x9f\x30\x9e\x3c\xb9\x72\x1d\x17\xcf\x6a\x57\x9a\xd3\x8c\x31\x0e\x9d\xa7\x7b\xca\x24\x38\x67\x04\x31\x63\xfc\xcb\xb5\xf7\xe3\xfd\xe8\x67\x60\x06\x9c\x06\xe7\xc1\x4b\x06\x8c\x71\x1d\x59\xf1\x4d\x7b\x8f\x36\xd1\xfd\x15\x58\x1f\xf1\xfe\x98\xe9\xaf\x37\x41\xeb\xb5\x7a\x0f\x3f\x61\x06\xee\x89\x03\x95\x8c\xfe\x62\x24\x0d\x98\xe0\xb8\x02\x6c\x6c\xba\x19\xee\x0d\xe8\x8c\xa5\x81\xf1\x08\xcd\xba\xa0\x33\x3e\x2f\x06\x2f\x78\x81\x33\x21\xb2\x0b\x17\xf6\x5f\x03\x49\x65\x66\xf2\x64\xa2\x2f\xf1\xa2\xee\x58\x59\x44\x09\xa1\xe1\x57\x9a\xb7\xa7\xae\x34\x54\x49\x04\x96\x87\x30\x86\xad\xed\x53\xb6\xa3\x9e\x7f\x2a\x7b\x25\x23\x5c\x86\x25\x99\x4a\x56\xaf\x5b\xfd\x99\x93\x1b\x05\x0c\x75\xa8\xf7\x32\xb3\x63\x64\xae\xd5\xf3\x06\x16\x1a\x81\x59\x7e\x3a\x6d\xeb\x25\x2f\x13\x7a\xba\xbe\xdd\x72\x35\x3f\xa1\xc2\xee\x82\x20\x48\x1a\x01\x9e\xb1\xd5\x64\xcb\xf2\x3a\x51\x00\xbf\x15\x84\x69\xd7\x77\xba\xd7\xde\xba\x74\x49\x48\x85\x20\xc3\x24\xdd\x4b\xf4\x8f\x25\x82\x1b\xdb\x4a\xd3\x2c\x7d\xd9\x23\xa5\x94\x69\x51\x7e\xb2\xa8\xaf\xe6\x02\xac\xb9\x61\xfd\xcf\x61\xc2\x75\x6e\xcf\xc6\x24\x02\x25\x76\x9f\xdf\x91\x2c\x68\x76\xa8\xc9\x20\xa8\x4f\xee\x78\xf0\x6e\x3a\x0a\x12\x49\xd0\x07\xb4\x69\xc2\xb7\x48\x2e\x83\x54\x9e\xb3\x5c\xc0\x54\xad\x5c\xeb\xaf\x5e\x6f\xb9\x93\x3d\x83\x09\x84\x5d\x0f\xc9\xc8\x5e\xb6\xd3\xcb\x82\xe7\x89\x07\x49\x22\x0b\x00\x06\xdf\x5b\xfb\x23\xbc\x1f\xad\x82\x79\x70\x0c\xdc\x38\xd6\x03\xc6\x39\x73\xb8\xcf\x68\x7d\x1c\xe2\x09\x72\x99\x3d\x5c\x63\x5e\xda\x34\x17\xb1\xa1\x0f\xac\x83\x6a\xaf\x37\x02\xd6\xa3\x3e\x37\x9e\x50\xc5\x4c\x25\xa7\x9f\x3f\x91\xf0\x2f\xa2\xf0\x81\xa3\x25\x5f\x23\xdd\xec\x92\x83\xce\x5d\xb5\xe2\xb8\x0f\x6d\x4b\x78\xe1\x63\xa9\xea\xa9\x63\xd7\x7c\x16\x3b\x2c\xed\xe5\x08\x35\x34\x84\x68\xe4\x58\x14\x23\xa2\x6b\x9d\x8a\x14\x85\xff\x49\x12\x46\xbe\x5f\xd5\x0a\x15\x3f\x44\xd7\xa7\xa3\x46\x32\x72\x1e\x34\x0e\xbd\x39\x4c\xfc\x54\x92\xc9\x44\xc7\x2f\xed\xd4\xd4\xee\x3d\x5b\x18\xba\x6b\xe6\xf0\x35\xa7\x61\xf6\xb8\xd6\x98\xfd\x25\x5c\xea\x5f\x99\xcb\x15\x9b\x55\x4e\xca\x85\x13\xcd\xf9\x68\x45\xeb\x60\x5d\xc8\xd5\x83\x90\x19\x2d\x59\x9c\xb2\x05\x71\x82\x44\x54\x02\x04\x7c\x6f\xed\xb7\xf0\x39\xf4\x33\x50\x01\xd7\x82\x7b\x47\x33\x27\x36\x7f\xe2\x54\xc3\x66\x28\x37\xea\xc2\x6e\x68\x8a\x9b\xe7\xcd\xc7\xff\x1d\x91\xb1\x8d\x9d\x5a\x23\x6c\x33\x94\x43\xc6\x09\x6a\x23\xbe\x86\xae\x3c\x58\xb6\xcd\x45\xcf\xe6\x43\x51\x12\x9f\x85\x2f\xd8\xbb\xa3\x50\xe0\xc2\x60\xf8\x45\x95\x03\x51\x9f\xc9\xa4\x9d\x0c\x30\xcb\x96\x12\xf9\xd3\xf4\xe4\x15\xd3\x9d\x96\x56\xd7\xec\x25\x7d\xb7\x2d\x39\xa5\x84\x31\x88\x34\xde\x62\x56\xda\xec\x19\xf6\x82\xb1\x30\xbf\x50\x9f\x24\x5a\xf8\x12\xd8\x9c\xee\x16\x8e\x22\x9d\x63\x07\xd1\x90\x27\x6d\x4b\xef\x2f\x4f\x9c\x7e\x9e\x93\x16\x10\x21\x8e\x90\x40\xd0\xd6\x95\xc8\xc1\x4f\xa5\x93\xab\xdf\x39\xdb\x0b\xa4\x46\x35\xc6\x51\xb1\x76\x78\xe2\xc9\x0f\xcc\x76\x0e\x2f\xd5\xca\x19\x8a\x11\x2b\x4d\x74\x77\x3f\x0f\x6f\x4b\xbe\x61\x65\x29\x4c\x60\xb2\x50\x0c\xd9\x54\x69\xb6\xd8\x59\x7a\xfa\xed\xa9\x56\xe4\x34\xb0\xa0\xa4\x34\x39\xdb\xca\x4b\xee\x25\xc2\x7d\xf6\xb5\xfd\x26\x23\x85\x94\x5a\x34\x2d\xd5\x3f\x93\x4b\x4d\x27\xe6\x27\x4d\x2d\x50\x02\x21\x6f\x12\x3e\x9f\x51\x31\x2d\x9e\x7b\x89\xc1\x19\x78\xe5\xa7\x9e\x6f\x19\x1e\x20\xe0\xc7\x6b\x7f\x83\x05\x86\xc0\x01\x37\x83\x7b\xc1\x83\xc3\x9c\x34\x36\xc2\x50\xc9\xf7\xc6\x8a\xe1\x70\x87\xe5\x48\x2a\xee\xad\xe7\x8f\xc1\xe8\x7f\xb9\x54\x5f\x77\xf4\x91\x10\xd5\x6e\x8d\xbc\x7f\x16\x8e\xac\xc1\x02\x7f\x5c\xed\xeb\xe3\x01\xe8\x41\xde\x5f\x9f\x1e\xa0\xad\xf8\xd3\x9b\xfe\x40\x30\x1b\x68\x1f\xe8\x9f\x52\xfb\x0f\x4f\x9f\xe5\xc1\x33\x56\xb6\x1a\x66\x51\xa3\x37\x44\xc9\xd7\xdf\xae\xca\x62\xbb\x80\x88\x62\x83\xa4\xad\x19\x53\x4d\x34\x6f\x7d\x8a\xa6\xa6\x57\x88\xf6\x24\xdb\x83\x4f\x3b\x52\xca\xf1\xa4\xee\x78\x53\x6d\xd5\xcb\xdc\x4b\xd9\x69\x27\x55\x60\x89\xbb\x9c\x50\x19\xc9\x0b\x6f\x34\xac\xa9\x5c\xb5\x43\xa2\x54\xbe\xdb\xf7\x0f\x21\xad\xb3\xc3\x69\xe5\x7d\x4b\x5f\xfd\x07\xee\x98\x4c\x93\x10\x72\x82\x30\x91\x21\x5a\xd1\x75\x1d\xc5\x80\x36\xb0\xa5\x43\x74\xfa\xf8\x63\x7b\x48\x86\xed\xf1\xae\xf0\x76\xfc\x52\xba\xf1\x96\x05\xbb\xa9\x65\x35\x03\x4d\x57\x8e\x61\xdf\x90\x85\x4b\x15\x4b\x6a\x90\x1f\x39\x88\x31\xcc\x46\x62\xc9\x77\xf7\xb9\x65\x82\x4d\xec\x25\xfe\x01\x52\x2b\x48\xc6\x3c\x3b\x22\x10\x61\xa2\x71\x43\x7b\x7b\x8c\x42\x71\x26\x55\xcc\x07\x98\xbe\x10\x00\x0c\xe1\xda\xa3\x38\x87\x7e\x0e\x7c\x70\x5b\x5c\x8b\xe1\x58\x96\x8d\x57\x7e\x28\x1d\x05\xac\x3f\x6a\xcf\xac\x17\xe1\xe1\x80\xcb\x40\xb4\xdf\xdc\x6c\xd9\xd8\x46\xb9\xbe\xa7\x8c\x3d\x61\xcb\xc6\xe6\xf0\x19\xee\xc6\xd9\x0c\x06\xdb\x2d\xf4\x25\x8d\xd6\x3a\x73\x33\xc9\xba\x25\x02\xb4\xa5\x53\xb9\x0c\x1b\x41\xc5\x9b\x99\xf4\x2f\x55\xb2\xc2\xa4\x89\x50\x9d\x48\x05\xb7\xfa\x59\x2d\x07\x5d\xe6\x6d\x09\x73\xc1\xbe\xad\x66\x21\xb4\x91\xc5\x4a\xf4\x48\xb8\x44\x0c\x8d\x18\x39\x37\xa1\x1d\xc8\x96\x5f\x51\xde\x15\x16\x57\x7f\xc0\x09\x11\x26\xe4\x10\x32\x21\xa4\xd9\x42\x55\x1d\x49\xc3\xf0\xb9\xcb\x29\x92\x1e\xde\xef\x70\x8e\xa4\x6b\x25\x65\x59\x66\x8f\x49\x3f\x01\xa1\xa1\xe5\x50\x98\xb0\xec\x79\x4e\x29\x15\x8e\x41\x68\xbb\x69\xcc\x1b\x3b\x27\x29\xf3\xa7\x11\xbd\x31\x4c\xdd\xf4\xf1\xf4\x6f\x97\xcb\x5a\xd9\x57\x42\x99\x61\xa3\xbe\xfa\x2c\xc8\x19\x42\x88\xe7\x9c\xdc\xe4\xe9\xc5\xb8\xf6\x7e\x75\xed\x93\xf8\x14\xfa\x09\x70\x41\x15\xdc\x02\xee\x03\xf7\x0f\xb0\x70\xec\x7a\xbd\x7e\x27\xf6\xd3\xc1\x80\x5e\x75\x20\x71\x8c\x9a\xa1\xc3\xea\x4a\x7f\x61\x4a\xff\x17\x97\x78\x58\x33\xd7\xb7\xbc\x8c\xcb\xe8\x88\x28\xad\xd7\xe6\xb1\x54\xb4\x79\x63\x15\x19\x7d\x48\x14\xe2\x45\x5b\xf7\xf5\x0c\x62\x06\xe6\x10\xa5\x56\x1f\xb5\x25\xc9\xea\x55\x25\x95\xe5\x24\x8b\x69\x68\x4c\x1f\xfb\xbd\x5f\xd9\x35\x47\xfd\x44\xef\xae\x46\x75\xc7\xe2\xe4\x44\xb5\xe8\x06\x8d\xb9\x49\x9a\xc8\xe5\xe6\x1a\x89\xd0\x0f\xeb\xf9\xd2\xf6\x73\x10\xdb\xca\xa9\x94\x2a\x93\xb7\xa8\xb9\x95\xda\x93\x96\xa8\xeb\x58\xc6\x9d\xb5\x52\x26\x09\x51\xbd\x57\xd9\x52\xae\x32\x48\x89\x64\xab\xdf\xc3\x58\x2a\x89\x08\xfc\x55\x14\x94\x0d\xc6\x0b\x26\x0b\x27\xa4\xaa\x53\xfa\x1a\x23\x32\x35\xd7\x0c\x3c\x3f\xf3\xd8\x53\xae\x7f\x07\x42\x6f\xb8\xed\x8d\x0b\xa9\x1b\x66\x6f\xca\x68\xe5\x6c\x2e\x39\xdf\x8f\xf4\x66\x83\xb8\x96\xb9\x7f\xe7\xe9\x93\x3b\xf6\x46\xee\x53\xb7\x0b\x99\xd0\x53\xfb\x52\x0b\x0e\x92\x0a\x8b\x07\xe5\x8e\x2d\x93\xc5\x33\xa6\x8e\x10\x63\x86\x93\x9c\xd8\x77\xc8\xa3\xf5\x5c\xcb\x0a\x0c\x08\x31\x06\x04\xfc\xcd\xda\xd7\xf1\xf5\xe8\xa7\xc0\x00\x21\xf8\x25\xf0\xd0\x50\x7d\x19\xec\x85\x1f\x00\x4e\x1a\x0e\xc8\x49\xbc\xf4\x1b\x8e\xbb\x99\x70\x6c\x92\xc6\x07\x6b\x3d\x98\x1e\x7a\x62\x9f\x71\xa3\x9c\x8c\x31\xd2\x90\x98\x8c\x63\x65\xe0\xf7\xeb\x51\x10\xf8\x0c\xfb\xe1\x40\x8f\xe5\x26\xe6\x8c\x8f\x89\xf1\xd0\xd8\xf8\x7a\x42\x29\x85\x04\x63\x08\xf5\xd5\x0b\x88\x33\x93\x52\x4e\xe0\x3c\x37\xac\xb2\x37\x5d\x2d\x87\x81\x10\x08\x3b\x54\x39\x6e\x94\x70\xfc\xcb\x49\x1d\x42\x1f\xc6\xe4\x42\x1a\x53\xb6\x39\x15\xf9\x98\x73\x85\xa0\x26\x26\xa6\x4d\xc7\x4a\xe7\x69\xa6\x90\xba\x2d\x5d\xd8\x4b\x6c\xae\xb9\x8b\xfb\x27\xdf\x45\x21\x12\xc4\x28\x4d\xfa\x5c\x70\x44\x08\x13\x45\x6d\xce\xb4\x8c\x34\x81\xf0\xe6\xd3\xb7\x5c\xa4\xf4\xec\x0d\x5b\x7e\xed\x6d\xb0\xe5\x87\x99\xcc\x11\x6d\x42\xf9\xcf\x9b\xdc\xbd\xf8\x12\xc3\x77\xa7\x27\x6b\x3a\xaa\x4c\x6c\x5d\xca\xef\x21\x9a\x66\xb2\x0a\x13\x5b\x6d\x34\x59\xf4\x43\x23\x08\x0a\xe1\x84\x41\x6b\xa5\xc9\x1d\xdb\x2f\xec\xca\x04\xfa\xa9\x95\xca\x29\xcf\x77\x8b\x69\x27\xe9\xf1\x8a\x16\x1e\x32\xc2\x54\x72\xca\xbe\x32\xda\x9d\x6e\x11\x76\x28\xb3\xb2\xfa\x26\xad\xcc\x38\x5c\x41\x24\x79\xf2\x24\x86\x70\xe5\x8a\xd4\x21\x08\x35\x22\x14\x06\x00\xc1\x87\xd6\xbe\x89\x7e\xf5\xbf\x66\x26\xf1\x35\x4f\x98\x49\x74\xd8\xc6\x4c\xa2\x4f\xff\x8b\x66\x12\x9b\xf9\xe1\x4c\xe2\xf7\xd6\x3e\x8c\xcb\x18\x83\x34\x38\x05\x9e\x11\x7f\xef\x28\xe4\x4f\x9c\x78\x1f\xb7\xac\xd7\x4b\xd2\x70\xc4\x82\xb3\xf5\x41\x8a\xcd\x9b\xc2\xc3\xd1\xb8\x43\xbf\xd7\x77\xc7\x65\x12\xfb\x63\xbc\x5c\x2e\x0d\x76\x2d\x6c\x82\xd6\xa3\xbf\x70\x41\x32\xc6\xd2\x1f\x6c\x59\x2c\xcc\xe7\xb7\x5f\x4d\x21\x62\x08\x41\xc8\xb9\xbf\x1f\x69\x3a\xb1\x30\xdf\x7f\xe8\xe0\xe1\x67\x67\x9c\x7c\xb2\xbc\x83\x7a\x6d\x5d\x57\x69\x84\xa1\x4e\x90\xae\x42\xa6\x23\xcd\x80\xfb\xdb\x81\xfc\xa8\x62\x65\x5b\x4b\x10\x98\xc0\x08\xc2\xc8\x90\xca\xc7\x2e\xc1\x04\xdd\x35\xfd\xea\x37\x2d\x7c\xab\x67\x61\xe4\x6a\x5a\xe6\xde\x66\xbf\xbf\xed\xfc\x0b\xcb\x73\xe9\xae\x64\x3c\x5b\x6c\x7d\xfd\xd9\x4d\x6f\x6a\x61\x11\xa1\xab\xf6\xcf\xcc\x4c\xf5\xaa\x09\x21\x2b\x85\x76\x9a\x99\x10\x1a\x01\x37\xf5\x70\x1b\xdc\x7b\x8d\xae\x9d\xa0\x34\xad\xaf\x7e\x4c\x6d\xf3\x54\x43\x2d\x6a\xc4\xa7\x53\x69\xcb\xe5\x4d\x23\xc8\xf1\xbc\x28\xe7\x38\x20\xe0\x87\x6b\x7f\x83\x8f\x60\x08\x92\x60\x16\xbc\x1c\xbc\x07\x80\xea\xa6\x8d\x18\xc3\x95\x0b\xfc\x70\x90\x50\xe1\x50\x67\x1a\x2e\xc1\x60\x71\x7b\xfd\x1e\xdc\x98\x35\xd8\xd8\x69\xb0\x11\xe6\x43\xd6\xb3\x31\xa3\xb2\x79\xeb\x46\xbf\xf7\xef\x68\xcc\xe1\x98\x78\x56\x6b\x4f\x9c\x08\x1d\xe3\xc5\x71\xde\xc6\x87\xb5\x86\x3a\x8f\x66\x4b\x49\x41\x29\x31\xe6\xf4\x92\x13\xb4\x57\xdf\x48\xeb\x42\xe8\x5c\x30\x82\x62\x84\x06\xaf\xcf\xf5\x22\x3f\xc9\xa5\x7c\x12\x86\x39\x8b\xd3\x3c\x4b\xf8\xf3\x32\x2c\x06\xe1\x31\x28\x1d\x08\xdd\x6a\xde\xf4\xa3\xb4\xd4\x20\xb3\x48\x68\x58\xc6\x62\x7f\x8a\xef\xad\xd6\x74\x73\xb6\x1a\x65\x0d\x0f\x86\x51\x51\xed\xec\x19\x72\xb2\xb2\xfa\x78\xca\x92\xb6\x2e\x35\x8c\x91\x25\x08\x8e\x89\x3a\x2a\x25\x34\x8d\xa2\x4c\xea\x65\xec\xce\xc2\xef\x12\x96\x9c\xab\xd8\x94\x10\x61\xec\xf6\xc3\xe4\xf6\x5c\xfd\x95\x3e\x85\x3f\x81\x98\x47\xca\xcc\x79\xba\x25\x63\xca\x0e\x1f\x7f\xeb\x4e\x3b\xc8\x37\xcc\x37\xf4\xd3\xdb\x45\x8b\x97\xb4\xc4\xde\x54\xe6\x40\xa2\x62\xca\xab\x35\xb5\xe7\x15\xc7\x2a\xef\x9b\xb8\x26\x11\x04\xc9\xa9\x44\x6d\x4a\x1e\x2e\x48\x95\xb3\xf4\x6b\xae\xae\xb2\xa3\x0d\xa2\xcf\xe7\xb7\x20\x1c\x95\xa1\x69\x86\x29\x15\x3e\xfd\xc6\x7a\x76\xaa\x16\x69\x27\xc8\x4a\x39\x95\x6d\xf7\x44\x4f\x57\xed\x8e\x6b\x98\x5b\xf3\x81\x4b\x76\x6d\x51\x04\x60\xe8\xac\xfd\x16\xae\xa2\x9f\x81\x29\x70\x1e\x3c\x30\xb4\x71\x7f\x34\x79\xb6\xae\xe5\x8d\x06\x39\x37\xc4\xbf\x8d\x1b\x3e\xf0\x21\xdf\xdc\xb4\x53\xb4\x57\x47\x41\x67\xbd\x83\x32\xb2\x2a\x8a\x46\x77\x80\x18\x6c\x72\x1c\x40\xc6\xd1\xa4\xf0\xa8\x8a\x8e\xe9\xee\xfa\x80\x69\x8c\x72\xd0\x29\x58\xed\x4b\x95\x25\x84\x21\x4b\xd3\x04\x0f\xb9\x49\x11\xf5\x28\x44\x10\x9b\x41\x9e\x09\x89\xc4\x1f\xa9\x7a\xa9\x14\x6c\xd5\xb3\xf7\x19\x96\xd5\x92\x75\xd7\x54\x50\x09\xaf\x64\x6a\x94\x39\x75\x6e\x51\x81\x08\xc2\x8c\xeb\x6c\x25\x01\xef\x3a\x5c\xb0\xcc\xfa\x51\xda\x90\xa9\x9c\x91\x34\x04\xa7\xae\x24\x1e\xb5\x7d\xa5\x94\x4a\x5e\xad\x74\x27\x19\xda\x65\xe1\x7f\x58\xc6\xa6\x30\x69\xbf\x37\x57\x4f\x78\x5e\xb0\xcb\xb3\xb7\xa9\xbc\x33\xf7\xcb\xe5\xa5\xfd\x61\xcf\xf0\xe1\xb9\x30\xa8\x59\xa6\x01\xb1\x01\x49\x26\x72\x79\x3f\x0d\xdf\xc2\x6f\x96\x51\x36\xb0\xcc\x7c\x42\x37\x52\x51\xed\xea\xd5\x55\xcb\xaf\x4c\x32\xc3\x82\x18\x29\xf6\x3f\x18\xa1\x1c\x22\x2c\xa8\x41\x28\xc1\x88\x19\x0a\x51\x82\x28\x20\xe0\xb5\x6b\x7f\x8d\x9f\x8a\x11\x50\x20\x04\xf7\xc4\x95\xb2\xea\xc7\x8c\xa5\xdf\x6b\x37\xc3\xa0\x3a\xa8\x53\x41\xaf\xdd\x0b\xab\x9b\x36\x74\x3f\x61\x1e\x36\xb6\xd0\x38\x1a\x36\x83\xc2\xc1\xf9\x59\xe8\x3f\x61\x4e\x71\xd3\x88\xc1\x86\xec\x33\xca\x75\x51\x88\x47\x93\x1e\x83\x11\xb1\x91\x58\x31\xb2\xff\xa0\x67\x3d\xcc\xa4\xf8\xa9\x1e\x37\x18\x26\xab\xe7\x10\xd2\x28\x22\x58\x68\xf0\xa8\xe0\x0a\x21\x88\x75\x6f\xbb\xa9\xd7\x03\x07\x33\x21\x34\x12\x1a\x9c\x5a\xb6\x45\x70\x31\xd7\xb8\xc1\x64\x56\x48\x35\x57\xf7\x10\x71\x79\x58\xcb\xe6\x97\x51\x20\x89\x9c\x8d\x22\x5b\x13\x86\x95\x2f\xe9\x3c\x9f\x16\xde\x04\xe5\x2b\x3b\x26\xcf\x7c\xc6\x0e\xa5\xee\xb6\x72\x27\xa8\x09\x51\x42\x0a\x81\x35\x2d\x0e\xdb\xfa\xf6\x56\xcd\xd5\x14\xfd\xbb\xdb\x9e\x04\x9f\x92\x37\x60\x28\x20\xcc\x18\x10\xa2\xea\xa1\xf9\xf9\x23\x37\xbf\xc1\x6e\xd6\x97\x8a\x3b\x2d\x9c\x4d\x56\x2d\x23\x7a\xc6\xa5\xbc\xe5\x64\x66\x78\x10\x16\x0e\x1c\x9f\x6d\xbc\xe7\xb0\x97\x35\x8b\x69\x67\x4f\xc9\xd8\xdf\x7c\xf2\x6c\x22\xdb\x6c\xa6\x18\x5b\x7e\x5a\xf2\x91\xc9\x29\x6f\x2e\xb9\xa3\xe4\x7a\x06\xd7\xae\xbf\xcd\xd7\xaf\x3e\xb4\xaf\xb5\xf3\xe2\x65\x6a\x3c\xfe\xd8\x52\x5a\x98\x04\x45\x6e\xfe\x00\x67\xb9\x5c\xc5\xb6\xdd\x26\xf3\x75\x4b\xcc\x20\x64\x26\x0c\x5f\x02\x02\xfe\x72\xed\x6f\xf1\x09\x4c\x41\x0a\x34\xc0\x5b\xc0\xa7\x06\x77\x48\xe1\x8c\x77\xe2\xcc\x34\x52\xc4\x3b\xdd\x01\x55\x0a\xfc\x6a\x69\xb3\xea\x16\xf8\xfd\x75\xcc\x12\x6e\x9a\xff\x63\xbc\xd9\xeb\xcf\xd7\x6b\x1b\x8f\x72\xa9\xcc\x86\xa7\x8d\xa7\xf7\xd6\xef\x05\x31\x2e\x6f\xa3\x01\xb1\x91\xce\x30\xf4\x96\x1c\x1a\xde\x19\xa2\x36\x04\xc2\x23\x1a\x50\xda\xc8\x9f\xf3\xc3\x1b\xea\xcc\xd7\x07\x7b\x86\xfa\xad\x51\x27\x6f\x90\x47\xaf\x40\x0c\x43\xac\x30\x86\x94\x08\x08\x75\x8e\xd1\xea\x77\x08\xc3\x09\x9f\x60\x2a\x2c\xc3\xd0\xbf\x90\xe3\x1a\x21\x3a\x0a\xf4\xdd\x25\x88\xc2\x9c\x97\x46\x78\xaa\xa3\xf6\xce\x26\x18\x84\x4c\xea\xcc\xd2\xb8\xf4\xbc\x30\x93\x6f\x4a\x2d\x8e\x45\x42\x21\xd2\x69\xde\xc9\xfb\x86\xdd\x15\xa8\xbc\x5b\xce\x52\x85\x7b\x1e\xc6\x31\x25\x73\x06\x37\x39\x5a\xfd\x67\x9c\x33\x22\x26\x08\x4b\xeb\xc8\xe2\x0c\x41\x48\x11\xc4\x98\x58\x4c\x78\x22\x6d\xc2\x73\xed\x4f\x45\xa6\x09\xed\xa5\xe3\xf9\xc4\xd6\x5e\xc2\x6c\xe9\x33\xb3\x07\x66\xd2\x27\x4f\x9e\x2f\x58\x95\xbc\x25\x53\x61\xe4\x79\xd9\xfb\xe7\x47\x37\x32\xd2\xa6\x94\xbd\xdb\x9d\x29\xf3\x76\xd6\xce\xce\x27\x20\x22\xd4\x0c\xa6\xfa\x0b\x7b\xf2\x5f\x98\x0a\x60\x5a\x6f\x2a\x3b\x54\xe5\xd3\xcb\x28\x55\x3b\xa2\x25\xa3\xcc\x96\x42\x38\xdb\x73\x26\xf7\x1d\x5f\xba\x31\x93\xcf\xe9\xca\x2e\xbb\x25\xad\xb0\x35\x6a\x3d\xc5\x3c\xa2\x45\xbb\x6f\x40\x92\xf2\x5b\x8f\xdd\xfc\x11\x56\x1a\xde\x07\xe9\x6d\xb3\x44\xe4\x97\x2c\x0e\x51\x42\xd9\x9d\x95\xa5\x52\x93\x40\x68\x7b\x5e\x90\x2a\x19\x8d\x40\x73\x00\x01\x9f\x5c\xfb\x30\xbe\xe9\xff\xe4\x1d\x39\xf8\xc4\xff\x66\x47\x8e\xae\xfe\xf3\x3b\x72\x74\x35\xdc\x91\x83\xc5\x7f\x6a\x47\x8e\x21\xff\x7f\xd9\x91\xc3\xc0\xcf\xd6\xfe\x12\x5f\x89\x31\xd0\x41\x15\xdc\x0c\x5e\x08\xde\x06\x1e\x89\x2d\xb5\x71\xa3\x15\xc6\x7b\x51\x68\x22\xce\x4a\x9b\x44\xef\x15\x5c\x1f\x19\x72\x5c\xd3\x36\xb1\xf1\x51\x23\xe4\x89\x23\x60\x23\xf0\x38\xde\x8a\xb0\x89\x97\x0f\xfa\xca\x1b\x59\x77\xc8\xdc\xbd\xde\x7a\xa9\xac\xd7\xb8\x1f\x98\x70\xb3\x64\x5b\x1f\x15\xd3\x8d\xce\x72\x0b\x9f\xc0\x08\x73\x0e\x21\x47\x08\xc1\x88\x22\xc8\x8c\xb2\xb1\x5d\xd5\x34\xcf\x54\x39\xe1\x17\x68\xc7\x54\x6e\xb8\x6b\x61\x36\x39\x5b\xd5\x78\x65\xd2\xf2\x10\xa2\x8c\x44\x78\x8a\x26\x95\x9b\x8f\xa4\x46\x4c\xc6\x31\x46\xb0\xdd\x50\xd8\xd3\xf6\x5c\x3f\xf3\xe4\x42\x61\x6a\xf5\x51\x96\x30\x10\x84\xd8\xa0\x98\xc4\x80\x85\x9a\xc4\x66\xdc\x43\xe8\xf5\xb8\x9a\xad\x87\x92\x49\xf7\x4a\xee\x43\x14\x4a\xb9\x5c\xf1\x49\xe4\x45\x37\x1e\xf1\x52\xd7\xfb\x4e\xbe\xcc\x85\x46\x5d\xa2\xc3\xdf\x11\x52\x11\x62\x3b\x04\xd9\x35\x28\x45\x20\xda\x62\x22\x80\x48\x50\x46\x21\xb1\x5c\xb4\x0b\x95\x0f\x1c\x5d\x98\x8b\xeb\x0a\xc5\xba\x69\xbb\xe9\x82\xaf\x66\xd5\xee\x88\x50\x3f\x44\xe9\x94\x9b\x32\x27\xe6\xca\xaf\xae\x37\x26\x5b\xa7\xaf\x10\x94\x4e\xa4\x43\x02\x99\xc1\xfa\xee\xdc\xd6\x6d\x89\xd5\x1f\xea\x04\x71\xd3\x28\x36\x45\x1d\x63\x5b\xcf\x94\x84\x9c\xd6\xd2\x8c\xc1\x99\xe9\x84\xcf\x71\x09\xc2\x60\x7a\xba\xbd\x57\xfa\x49\x0b\x63\x28\x1e\xc8\xb8\x3e\x75\x42\x2f\xca\x70\x41\x39\x01\x14\xfc\xd5\xda\x6f\xe2\x8b\xe8\xc7\x20\x05\x76\x82\x13\xe0\x1e\xf0\x86\x31\x0f\x1a\x24\xe8\xcd\x75\x77\x10\x36\xa5\xda\xc6\x60\xf5\x13\x2b\xeb\x06\xcf\x88\x0b\xf0\x06\xf0\x1d\xb4\x4b\x37\x8b\xf1\x1b\x73\x5d\x9b\xe9\x6c\xfc\x5c\xb7\x87\xc3\xc0\xaf\xb7\x36\x87\xee\xe6\x1b\x2f\xb4\x5b\xf8\x02\xc6\xd4\xd4\x09\xc5\x06\xf6\x14\xa1\x88\x50\xf9\x7a\xcb\x56\x52\x71\xad\x77\xc5\xe4\xe4\xd1\xa5\x83\x56\xe1\x29\x0b\x0b\x37\xb5\x9f\xd4\x9d\xb0\x74\x95\x11\xcb\xcb\x4f\x17\x8d\x7c\x22\x1d\x50\x56\x8f\xdc\x39\x3a\x5b\x39\xe9\x07\x13\x41\x2f\x92\x37\x15\x7a\xd3\x1a\x36\x3d\xcf\x6a\xba\x61\xa1\xa4\xc3\xe3\x9a\x0e\x29\x35\xfd\xd2\xe6\xfb\x32\xd0\x20\xdb\xda\x0b\x85\xeb\x26\xd3\x7e\x20\x42\x2c\x8b\x5c\x95\x4a\x5e\x32\x47\x55\x20\x56\x3f\x67\x15\xd2\x7c\xda\x48\x5d\x71\xf3\xaf\xed\x3c\xf8\xa6\x9d\xb5\xb0\x76\xf9\xea\x3b\xf6\xec\xea\xd8\x13\x9a\xe4\xed\x7c\x6a\x0a\x0b\x4f\x72\xa1\x28\x34\x34\xd8\xca\x96\x6f\x3d\x7f\x8c\x6a\xee\xcc\xe0\x0e\x0c\x59\x8f\x53\x29\x75\xa5\x4c\xa7\xe3\xa6\x3a\x18\xea\x55\x98\x8a\x94\x8e\x83\xa4\x15\x2c\xb4\x66\x37\xdf\xcd\x61\x67\xf7\x28\xa0\xe0\x87\x6b\xdf\xc4\x4b\x98\x80\x2c\xb8\x0d\xdc\x0f\xde\x37\xee\x9a\x0f\x68\x49\x9c\xf2\xfa\xbd\xc1\x52\x8d\xef\x35\xd3\x6e\xe1\x4d\x23\xd0\x1b\xf7\xc3\x19\xec\x37\xdf\x24\x9d\x8d\x43\x75\x93\x88\xb6\xb9\x0f\x3e\x9a\x76\x09\xfc\xea\xb0\xc5\x3a\xb2\x62\xad\xde\xdb\x20\x22\xf1\xe7\x7b\x63\x64\x56\xaf\x6d\x36\xf5\x48\x8c\x1b\x12\x9d\xda\xba\xea\x5a\x1b\xc2\xad\x76\x69\x98\x15\x02\x1f\xf7\xd9\x9c\x32\xa8\x89\x11\x95\x08\x2a\x86\x38\xb3\x3c\x9a\xf0\xb0\x94\xa9\xb9\x5c\x31\x1f\x12\x9a\x2f\x29\x4e\x2d\x47\xcb\x73\xab\x2b\x5c\x05\x49\x9a\x2e\x24\x8e\x13\xc9\x28\xc5\x82\x23\xc4\x90\xe7\xd5\x67\x8f\x1c\xbd\x6e\xe9\x42\xd8\xe8\xe4\x43\xab\xe5\x2f\xac\x7e\x03\x62\xaa\x10\x52\x0a\x4b\x9d\xc6\xd1\x1c\xd3\x21\x87\xb1\x94\xee\xfd\x32\xdc\x36\xa5\x69\x87\xea\x44\xe3\x8c\x72\x0d\x21\x62\x64\xe4\x81\x82\xeb\x65\x38\xcb\xa5\x95\x71\x9d\x64\xc2\x74\x94\x21\x70\x92\x7b\x42\xd7\x69\x4d\xe4\x13\x6e\x0a\xbe\x26\xb5\xc5\x6c\x98\x0e\x43\x8e\xe6\x9b\x0c\xa3\x7c\x8a\x0a\x33\x2b\x02\x27\xbb\x7a\x57\x77\xb6\x50\x9a\x5c\xdc\x5e\x49\x53\x5f\x4b\x57\x68\xbb\xf8\x40\x82\x8a\xa0\x43\xcc\x6d\x86\x39\xf9\xf4\xdb\x25\x35\xd4\x72\x2f\xe7\xfb\xe9\x5d\x4c\xe2\x64\x72\x92\x40\x88\x32\xed\xd7\xee\x2c\xac\x48\x9a\x89\x22\xe7\x9c\xb7\x58\xf3\x5f\x44\x2d\xa6\x79\x7e\xff\x28\xd1\x8d\x62\xd1\x2a\x54\x8c\x36\x43\xb9\x32\xe6\xf0\x0c\xe3\xa5\x29\xa4\x79\x48\x32\x2a\xa6\x7a\xf6\x54\xba\x51\xa4\xdc\x34\x4c\xd7\xe4\xca\x65\x90\x76\x22\xae\x73\x04\xa1\x66\x78\x36\x00\x0c\x3c\xb6\xf6\xf7\xb8\x33\xe8\x86\x96\x41\x17\xbc\x14\xbc\x11\x7c\x28\xf6\x9a\x4d\xe4\x76\xa3\xa1\x10\x0d\xdc\x25\x18\xee\x63\x83\xa3\xd0\x63\xb1\x3f\x0d\x1c\xc2\x5b\xc7\xdb\xeb\x60\x7a\xa8\xdf\xf6\x36\x7c\xec\xdf\xd1\x14\x67\x61\x7d\x53\xcb\xa8\xbd\x4e\x6d\x23\x13\x0e\x86\xce\x86\x03\x58\xb8\x3f\x5f\xdd\xd0\x57\xc6\xf3\x82\x71\x59\x58\x82\x83\x1b\xef\xf8\x89\x7a\xa8\x99\x8a\x52\xdf\x10\x6d\x1b\x42\xcc\x04\x46\x1a\x25\xab\x3f\x57\xbe\x95\x0e\xcc\x94\x9a\x30\x03\x3f\xfc\x73\x63\xff\x9e\x9b\xcf\x1f\xbf\x92\xc0\x4e\xa1\x60\x33\xee\xcc\x4e\x65\x1d\xcf\xe6\xde\x12\xc6\x51\xaa\x71\xc3\xec\xd9\xbc\x32\xa4\xc8\xbd\x39\x9b\xdc\x59\xf7\xd2\x47\x79\x7d\xde\x72\x0b\x1a\x91\x7e\x6a\x91\x8b\xa3\x0a\x5d\xba\x82\x95\xcd\x30\xac\x87\xf9\x45\x12\xa5\x20\x9a\xc6\xb2\x6e\x33\x11\x0a\x4d\xac\xfe\x84\xbb\xc8\xb3\x38\xc7\x6c\x92\x1b\x59\x1b\x71\x57\x4d\xe9\x3c\xc1\xe6\xe1\x53\xd1\x94\x9b\x95\x8c\x22\x43\x43\x08\x53\x53\x32\x26\x3a\x3e\xd9\x03\x33\x65\x81\x70\x22\x01\x45\xd2\xf0\x10\x64\x8c\xda\x48\xa6\x72\x84\x12\xbe\xfa\xca\x0b\x2b\x4b\x8b\x5b\x9f\x14\x65\xed\x74\xa6\x29\x39\xc6\x10\x1d\x2a\x4d\x64\xf2\x98\xbb\x13\xb7\xd7\x73\xf9\x94\xeb\xde\x6c\x22\x57\x26\xf6\x77\x2d\x7d\x0b\xd3\xb2\xc9\x26\x62\xe8\xb8\x14\xc7\x09\xc6\xca\xb2\xb3\xe5\xe6\x92\x71\xd2\x6f\x98\x09\xc4\x26\xb0\x2c\xe8\xa6\x97\x99\x96\xec\x84\xae\x27\x38\x34\x24\x13\x50\x84\x55\x9b\x28\x0e\x00\x01\x8f\xad\x3d\x8a\x57\xb0\x02\x3a\x98\x01\xb7\x81\x67\x02\x00\x47\xfd\x8c\x6e\x67\x05\x0d\xef\x43\xb8\x71\x8b\xb4\xd8\x24\x41\x67\x70\x6b\xab\xa1\x5e\x34\xbe\xcd\x21\x67\xc3\xd1\x5c\xe6\x6d\x9e\xb9\x19\xf4\x50\x9e\x70\x6b\xc2\xe1\x2e\xfc\xb1\x2b\xd0\xf5\x9b\x1e\xc6\x69\x7c\x06\x21\x95\x72\x3d\xcd\x90\xd9\xeb\x88\x43\x4c\xc8\x89\xe4\x9a\x61\x18\x0c\x11\x11\x2a\x07\x09\xef\x56\xdc\xce\xfb\xb3\x8c\x60\x56\x31\xd2\x10\x21\xc8\x59\x27\x9b\xf6\x55\x80\x30\xc6\x08\x6b\xa6\x11\x64\x6f\x35\x67\x12\xc5\x1d\xc5\xd4\x6d\x07\x8e\x9e\x20\x9c\xa4\xbc\x68\xf5\x90\x30\x62\x74\xe5\x27\xb0\x86\x4e\xa3\xc8\xe4\x98\x49\x3c\x07\x59\xf6\x45\x8f\xe4\x57\xca\x5b\xa6\x1b\x49\x95\x9e\x41\xf8\x54\x6a\x3b\x84\x32\x12\xfc\x81\x6a\x97\x20\x1b\x92\x2c\x11\x11\x13\x8f\xae\x3e\x2e\x72\x49\x2b\x3b\x5f\x72\x7d\x67\xc5\xfe\xd4\xbf\x4c\x06\x21\x95\x42\x61\xc5\xfc\xac\x63\x04\x53\x18\x33\x64\xda\x48\x44\xe9\x8f\xbe\x95\xc0\xed\x7b\x8d\xa2\xae\x0f\x66\xa7\xff\xaf\xb5\x4f\xe0\x05\xf4\x8f\xc0\x18\xdc\xb6\xf9\x56\xf0\xec\x71\x1d\x1d\xde\x11\x35\x0a\xab\xfe\x86\x4a\x37\xe2\x9f\x7d\xb6\xd1\xbd\xde\x44\x68\xc6\x5a\xc2\x46\x99\x5c\xcf\xb2\x70\xfd\x6e\x78\xe3\x9b\x3f\x46\x31\x41\xa2\xc3\x26\xea\xa6\x7b\xe0\xe1\x1e\x44\x98\x71\x84\x91\x60\xff\x2f\x77\x67\x02\x64\xd7\x59\x1d\xe8\xf3\xef\x77\xdf\xb7\xb7\xef\xef\xf5\xbe\xf7\xeb\x6e\x49\x6e\xa9\xb5\xb6\x2c\xc9\x96\x64\x4b\x48\x46\x92\x77\xd9\x58\xc6\x01\x43\xb0\x12\xcc\x92\xf8\x25\x76\xbc\x95\xa3\x31\x03\x98\x21\x10\x98\x1a\x26\xc3\x62\x83\x0d\xae\x72\x26\x53\x09\x09\x4c\x86\x01\x8a\xaa\x18\x0c\x9e\x60\x83\x49\xa8\x9a\x1a\x2a\xa9\x9a\x40\xc2\x18\xe8\x37\xf5\xee\xbb\xbd\xc9\x9b\x64\x4b\x6d\xd9\xbf\xeb\xfa\x6d\x57\xf7\xf6\xbf\xdc\xff\x3f\xff\x39\xe7\x3b\x87\xb1\x85\x7f\x43\x08\x61\xc9\x36\xe4\x10\x21\x99\x53\xf6\x55\x99\x10\x81\xa6\x76\xbc\xe7\xf7\x2e\x5e\x8f\x31\x67\x42\x3e\x60\x2a\x9a\x2d\x9c\x7d\xbd\xa5\xbd\x53\x6a\x6e\x54\x53\xf7\x2d\xfc\x33\xd2\x1b\x75\x41\x19\x61\x42\x41\x91\x67\xa0\x09\x31\xb3\x61\xda\xe5\x4e\x1a\xcd\xac\xb3\x0c\x74\xef\x64\x73\x27\x17\xb7\x5c\x5b\x9b\x99\xe3\x3b\xb7\x51\xb4\x7f\xb6\x3c\x22\xbb\xaa\x32\x68\xfc\xc5\xd7\xd8\x81\x5d\xbf\xb7\xfd\xee\x7b\xcb\x4c\x6c\xbf\xf4\x38\x63\x57\x5f\xb2\x7f\xee\x77\x3f\x58\x1d\xb0\x47\x36\x6a\x56\x39\x9a\xfe\xcc\xa1\xe7\x02\xf5\xa0\x7d\xd3\x93\x0f\xe9\xeb\x05\x3e\x6a\x2e\x8c\xd0\xc2\xfd\xde\x1e\x2f\xba\xc2\xcc\x53\x9c\xaa\x64\x3f\xfc\x40\xd1\xd1\x89\xc8\x0e\x5c\xd9\xdf\x43\x11\xa6\xb2\x8e\xaa\x7b\x46\x87\x3a\x2d\xfd\x54\xfb\x27\x64\x9a\x10\x90\xc1\x86\x49\xb8\x0e\x1e\x5e\xd2\xb6\xc7\x3c\x61\x67\x19\x8c\xb7\x9e\x06\xea\x0a\xa3\xdd\xad\x45\xf7\xe7\xee\xf6\xb0\xdb\xfa\xcc\x4b\x62\xb3\x19\xb4\xbb\x5f\x98\x1a\x4b\xdc\xea\xe2\x05\xb1\x39\x35\x8b\xbb\xfb\x56\x8f\x2f\x79\xe0\x75\x87\x7b\x77\x66\x9a\xc0\x4b\x21\x32\x57\x19\x6b\x97\xd5\x0c\xdd\x87\x68\xb5\x82\x8f\x4c\x0b\x86\x10\x22\x94\x2f\xfc\x0c\x0b\x99\x72\xc6\x33\x94\x7a\x18\x29\x5c\xc5\x28\x42\x48\xb6\x90\x44\x10\x93\x42\x5c\xd7\x18\xa1\x08\x71\x8a\x11\xb2\x6c\x9e\x29\x12\xea\xbb\x34\x22\x01\x42\x2a\xc5\xdc\xe3\xc2\x62\xd4\x94\x18\x53\x42\x8e\xb8\x6c\x5b\x94\x72\x4a\x10\xee\xc7\xf6\x26\x33\x95\x43\xe1\x86\xac\x2c\x15\x22\x4b\xf5\xcc\xab\x10\x1a\xa0\x66\xaa\xa4\xca\x32\x71\x25\x4e\xea\x08\xa5\xb3\x4c\xb6\x5d\xdb\x91\x25\x4a\x34\xdd\xb3\x0c\x45\xe1\x5c\xeb\x97\xd5\xdd\xf8\xb6\x90\x51\x5d\x55\x9d\x3e\x43\xb3\x76\xa5\x89\x6a\x04\x69\xab\xa8\x57\x8c\xc8\x08\x89\x57\xd7\xc7\x72\xf3\xa6\x8f\x4c\x97\x08\x69\x40\x29\xa7\xf6\x5f\x6b\xb8\x13\x83\x63\x3d\x5e\xa8\x3b\x52\x91\xec\xb1\x1b\x15\xa9\xe4\xfb\x8d\x09\x11\x66\xad\xd4\x98\x36\xc8\x15\x4d\xae\xef\xb7\xa7\x3f\xb1\x67\xdb\x31\xf9\x22\xcb\xdf\x40\xac\xa1\xdd\xd3\xa5\x54\x3f\x62\xf9\x70\x5e\x13\xdc\xca\xf4\xc9\xc4\xe0\xaa\x1c\x29\x6a\xea\x78\x3a\xbf\x61\xae\x67\x5b\x73\xd3\x40\xad\x98\x6d\xae\x2b\xe7\x76\x8e\x8f\x0d\x0e\xae\x23\xce\x64\x19\x80\xc0\x9d\xed\xa7\xc8\xad\xf8\x57\xe0\xc3\xfd\xf0\xe8\x52\x8c\xb1\x24\xee\x4e\xb7\xc1\xc3\x20\xee\x2f\x6f\xd1\x79\x6f\x79\x0d\xaa\xc7\x12\xc8\x8a\xb8\x7e\xa7\x85\xbf\x5d\xb2\xaa\x24\x1c\x6b\xb7\x17\x67\xf1\x0a\xed\x51\xd7\x6f\x6b\xaa\x99\xe8\xc4\x17\xff\x6d\xa2\x68\x58\xa1\x8f\x5a\x32\x8e\xcd\xb2\xa5\x40\x33\x01\xb9\xd5\xa6\x18\x11\x86\x99\x62\x52\x82\x08\xc6\x0c\x37\x2c\x8c\xb0\x2e\x63\xc4\x99\x36\x34\x6a\xdb\x35\x19\x93\xb1\x11\x8c\x0b\x0a\x46\x52\x4e\x9e\xd4\x84\x90\xb0\xd8\x71\x98\x47\xb9\x94\xe7\x15\x85\x22\x99\xa6\xc1\x25\x81\x19\x93\x14\x37\x72\x94\x34\x33\x76\xf4\xfa\x96\x6d\x58\xba\xc4\xf5\x48\x97\x0c\xce\x08\x76\x89\xc5\x8c\x6a\x18\xd6\x3c\x6b\xe1\x59\xcc\x29\x66\x69\xaa\x49\x82\x8b\xbe\x99\x92\x44\x29\xe3\x4a\x55\xcf\x44\x86\x88\x89\xa1\x54\x40\x43\x34\xbe\x6b\xce\x1a\xee\xc1\x73\x7f\x2a\x94\xb2\x34\xd4\xe0\x92\xa6\x62\xf4\xa5\xcc\xf6\x99\x19\xed\xdd\x97\xa7\xd8\x70\x3d\xa8\x9a\x53\xc2\x2a\xb2\xb7\x5c\x7b\x2c\x6d\xf6\x23\xed\xb8\x75\x38\x6f\x59\x5e\xf6\x28\x63\x97\x9a\x1b\xac\xbe\x8f\x3d\xb1\xcb\xcd\x7a\x5e\xd1\x08\x04\x9e\x1a\xdb\x32\xec\xa6\x53\xe3\x7d\x5a\x2a\xca\xed\x5e\x37\x3f\xe7\x6f\xf7\xac\xa1\xaa\xa6\x14\xfb\x2f\x37\xa4\x4c\xb0\x69\xa4\x24\xab\xde\x31\x66\x5a\x15\xb7\x9e\x75\x8b\x69\xd7\xff\xcd\xa7\x5d\x35\xca\xb2\xc0\x14\x9b\xf7\x95\x28\x11\x9c\xb0\x23\xca\xf5\xd6\x08\x45\x65\x3a\xd8\x1b\xf4\xc7\xcf\xfe\x0f\x48\x9d\x70\xd0\x20\x80\x2d\xf0\x08\x3c\x09\x80\xea\x8d\xf2\x22\xb8\xcc\x83\xee\x83\x1e\x77\x85\xe0\x8d\xe6\xe9\x62\xc9\x54\x73\x6a\x62\x6c\x09\x56\x10\x8b\x7e\xdc\x4b\xae\xf2\x4b\x41\xcd\x56\x8d\x92\x25\xad\xd3\xd2\xa6\x76\x88\x2c\x4d\xe2\x8b\xa3\x22\x19\x18\x8b\xf3\xc7\x2a\x75\xfe\xb2\x13\x19\x6f\xc4\x83\x75\x55\x3c\xa2\x55\x53\x44\xe7\x32\xe8\x2f\x45\x80\x19\x42\x9c\xd8\x1a\xc2\x2e\x22\x44\x12\xc4\x42\x5b\x11\x21\x08\x49\x5e\x18\x0c\x67\xb3\x48\x93\x15\xc7\x2d\xd9\x32\x0a\x31\xa5\x44\xcf\xb8\x39\x1f\x79\x56\x21\x67\x9b\x72\x79\xc8\xad\xb9\x8a\x2c\x84\x96\xf5\x55\x6c\x5b\x81\x29\xf2\xd4\x75\x72\x94\x04\xa9\x6c\x34\x64\x9b\xc3\xb5\xea\xa4\x23\x6b\xf5\x06\x1a\x35\xb7\x5a\xc2\xb6\x32\x8e\xed\x98\xcc\xcc\x2a\x01\x33\x10\x57\x85\xac\xc9\x82\x15\x7c\x57\xce\x6b\x56\x7a\x58\x23\xd6\xb0\xba\xbe\x5c\x35\x7a\x46\x46\x72\xc6\x8f\x30\xa5\x58\xa8\xd8\xe6\x42\x0a\x7b\x0b\x8e\xa2\x85\x05\xe6\xf1\x54\xc6\x53\x62\x78\x19\x7b\x8e\x8d\x3f\xa1\x59\xbe\xa4\x20\xc5\xe1\xb6\xd4\x47\x38\xd7\x39\x36\x04\xff\x4d\x5b\xa5\x94\xab\x96\x3c\x32\xb8\xa5\xa7\x07\x53\xd9\x36\xf4\x42\x61\x42\xe7\xbe\xa3\x62\x2c\x1a\x33\xf5\xfe\x9c\xee\x56\xa2\xe1\x99\x49\x45\x3c\x68\xea\x59\xd7\x8b\xa2\xde\xac\xbf\x0e\xdb\x65\x63\x5d\x94\x15\xd9\x5c\x5f\x8f\x97\xca\x0e\x47\x7e\x5e\x5b\x37\xd5\xdc\xa3\x0b\xcd\xd4\x1b\x63\x62\x8e\x1f\xb2\x25\x95\xd9\x4e\x8a\x92\x28\xf0\x37\x1b\xac\xc9\xf4\x06\x95\x2d\x75\x9d\xa8\x6f\x98\xe4\x81\x62\x8f\x39\x45\x44\xe6\xed\x5d\x03\x51\x5f\x56\x9d\xdb\x33\x92\xab\xd8\x3d\x53\x02\x71\x8f\x22\x55\x04\x13\x0d\x85\x45\x8a\x45\xc6\xa7\x4d\xc9\x35\x90\x3e\x92\x61\x9d\xd9\xe6\x99\xf6\x4f\xc9\x08\xe1\xa0\x43\x03\xae\xee\xfa\x9a\xc6\x91\xb1\xe3\xce\x65\x8b\x06\xa0\x65\x0f\x83\xc5\x08\x81\x9d\x85\xbd\xee\xf3\xd3\x94\xd7\x5d\x45\x47\x77\xd5\x58\x56\x57\x2d\xae\x48\xb1\x90\x85\xfe\xcd\xcd\x5a\x76\x84\x30\x9e\x1d\x46\x79\x4a\xa8\xaf\x0e\x8c\x6a\x0e\x45\xd8\x60\xa8\xb3\x70\xa0\xcb\x77\x95\xd8\x7b\x6f\x43\x9d\x75\xdc\xb4\xf3\x65\xd7\xa6\x06\xa6\xa4\x7e\xec\xea\xf4\xa0\x96\xd6\x3b\x53\xed\xe8\x74\x96\x73\x11\x8e\x6c\x29\x2a\x5a\xa1\x89\xdf\x8e\xeb\xa9\x74\x5e\xe2\x5b\xc6\x04\x37\xa9\x48\x7b\xca\xa5\x87\x9d\xd4\xcc\xc0\xc0\xdd\x48\xfa\xe0\xbb\x7a\x53\xef\xbe\xe1\x70\x78\xef\x5d\x86\xd2\x3a\x91\xf1\xa3\x5a\x3a\x97\x0e\x0a\x86\x5a\x29\x2b\x3b\x26\x0b\xfb\xdd\x5b\xdf\xe3\xea\x51\x55\x4b\xc9\x62\xdf\xf1\xcb\x7a\x9c\xf5\x47\x5b\x06\x9b\xca\xc6\x6d\xf3\xbd\xf6\xb3\x44\xc6\x6d\xc8\x41\x33\xd6\xf0\x2d\xb5\x44\xb0\xd2\x03\x2a\xb1\x8e\xb0\xf8\x69\x32\x90\xa8\x37\x26\x56\x90\x7f\xbe\x87\xbc\xc4\xe8\xbd\x22\x02\xc0\xf2\xa3\xb6\xd2\x62\xb2\x5a\xdf\x50\x5f\x8c\x56\x9d\x3c\x68\x64\xc9\xfd\x72\x39\x06\x30\x91\x4d\x8b\x28\xf3\x43\xb2\x8f\xed\x42\xc5\xd6\x23\x2a\x29\xa3\x97\x2b\x15\x26\x11\xb2\xf0\x75\xd9\x96\xe5\x80\x13\x93\x52\x93\xe8\x34\xa8\x5c\x84\x6a\xa3\x69\x55\xca\x5c\xe1\x1c\x1b\x73\x86\xb9\xef\x70\x6a\x45\xe1\xb6\xed\x3b\xfd\x81\x20\xef\xb1\xac\x7d\x5d\x4a\x1d\x54\xa3\xbc\xa1\x8c\xca\x81\x25\x73\xae\x6f\xdc\xf1\xa8\xd1\x9f\xb7\x53\xbe\xae\x0e\x7a\x72\xff\xb7\xc8\x5b\x0a\x84\x4a\x34\x95\x2f\x06\x07\x3c\xe6\x5a\x72\x79\x14\xef\x97\xc3\xb4\x5c\xbf\x75\xa7\xdd\xb3\x5e\x0f\xcc\xd0\xb5\xe5\xc0\xd9\x7a\x9f\x97\xd1\x9c\x01\xb7\x41\x75\x0b\x15\x09\x42\x28\xad\xce\x48\x2a\x73\x90\x44\x85\xc7\x7e\xf3\xf3\xdc\x30\xb5\x0c\x6c\xa6\x0c\xd5\xcf\xd4\x6a\x27\x7f\xe7\xfd\x7a\x3a\xe7\x47\x42\xe2\x19\x5d\xd2\x2a\x29\x66\x6b\x34\x36\xda\x20\xcc\xe9\x90\x9f\xaa\xf5\x2c\x3c\xc9\x6e\xeb\x77\x52\x92\xcc\x29\x22\x88\x91\x09\x20\xa8\xa7\xfd\x08\xde\x4d\x28\x14\xe1\x18\x9c\x00\xe8\x3a\x82\x4c\x25\x33\xce\xd2\x9a\x37\xd1\x5c\x34\x76\xb9\xcb\xde\xb0\x4b\x36\xac\x60\xd9\xb1\x6f\x25\x2a\xd2\x6c\xe0\x64\xfe\x5b\xec\x85\x80\x04\xe1\x32\x6f\x84\xad\x48\x4e\x53\x3d\x45\xb0\xa9\xa8\x32\x77\x18\xd2\x09\xc7\x5c\x60\x8c\xb6\xd1\x69\x59\xf1\xea\x54\xe2\x06\xa6\x18\x73\x89\xe7\xca\x65\xbd\x11\x69\x8d\x72\x68\xf8\xb6\x61\xe8\x73\xa1\xa9\x21\x55\x50\xc5\xeb\x95\xe4\xc0\xb2\x33\xda\xe0\xf8\x20\x43\xa3\x6a\xd7\x72\x95\xf9\x49\x4a\x66\x08\xa9\x78\xaa\x39\xd9\x1f\xb9\xae\x7b\x91\x15\xc9\x9e\x3d\x3d\xa3\xbd\xfb\x0a\xf4\xdf\x26\x11\xd6\x14\xff\x03\x0b\xbf\xb0\xbc\x5a\x1f\x57\x88\x65\x0c\x86\x61\xaf\x2c\x51\x8a\x51\xb5\x6b\xbb\xba\x3b\x33\x3f\xa2\x67\xf4\x34\xa3\x54\x20\x36\xf8\xeb\x7f\x46\x98\x19\x5d\x2b\x15\x10\x38\xd1\xfe\x1b\x02\xf8\x47\x50\x81\xad\xb0\xaf\x6b\x9d\xaa\x27\x81\x16\x57\x38\xf2\x2d\x1a\x0d\xe2\xc5\x23\x58\xb6\x43\x25\x46\x07\x6f\xf5\x29\x63\x4b\x91\xa7\x67\x11\x7e\x06\x8b\x32\x45\x93\xca\xdb\xae\x75\x33\xd5\x51\x12\x2a\x5a\xc1\x76\x1a\x97\x4b\xf2\x8c\x3c\x5c\xd4\xad\x7a\xb1\x86\xf2\x8e\xce\x33\x6e\xd0\xe8\x7b\xf0\x0f\x8e\x55\xfd\xf2\xa5\x83\xe5\xc0\x8a\xe6\xeb\x47\x06\x6d\x26\x4f\x5b\x9e\xa3\x31\x25\xa3\xbc\x8d\x16\x65\x32\x39\x70\xc7\x7b\xad\x60\x66\x0f\x2d\xd8\x1a\xc6\x25\xdf\xeb\xbd\x4d\x28\x6f\x35\x67\xfb\xcb\x7d\x03\xb5\xdd\xb9\x12\x46\xae\xb7\x69\xc7\xd7\x1f\x7d\x47\xc1\xaf\x8c\x5f\x39\x35\x5d\x23\x85\x23\x23\xef\xac\xeb\xb2\x69\xdb\x5e\xb5\x28\xc9\x8a\x7c\xa0\xf3\x2c\xff\xbc\xfd\x8f\xf8\x08\x21\xa0\xc0\x14\xdc\x9a\xd0\x80\xf5\xf1\x4e\x15\x78\x57\x10\x4a\xf4\x81\x3c\xe0\x5d\x55\xd3\xa2\x60\xbb\x6c\xda\xe9\x9c\xd1\xe0\x61\x82\x4d\x08\x3e\xba\xac\xf8\x5d\x8a\xa5\x3d\x39\x51\x9f\x48\xa2\xdc\x2c\xe3\xc2\xe3\x4d\xdf\x13\x01\x3e\x84\x90\x44\x30\xc5\x12\x26\x82\x12\xd4\xd9\x26\xab\x58\x43\x42\xa3\x84\x63\xc4\x30\x25\x04\x9b\x14\x53\x42\x11\xc1\x74\x83\xc7\x04\xa1\x84\xda\xde\xce\xa6\x5d\x4c\x67\x65\x4b\xe9\x95\x1a\xb2\xae\x2b\x44\x12\x4e\x5e\xdf\xc6\x88\x67\x05\x6a\xa5\x27\x32\x82\x63\x3a\xc6\xa7\x50\xde\x43\x9a\x69\x7d\xbe\x94\xb9\x78\x8b\xe3\xf7\x0c\x38\x72\x5e\xd2\xcb\x7e\xc4\x19\xf3\xb8\x3e\x39\xa6\xec\xb9\xb2\x70\xcf\x3b\xc6\xb4\x4c\x99\xcb\x9a\x4d\xa4\xa1\xcf\xee\xdd\x78\x28\xbf\xde\xcc\x55\x31\x46\xb6\x91\xef\xcd\xca\xea\xde\x4c\x54\x9e\x0d\xf7\x05\xd9\xb7\x15\x54\x46\x28\xc7\x62\x26\x1b\x7a\x82\x12\x4c\x64\xb2\x2b\xdb\x67\x01\x81\x67\xe1\xef\xf0\xe3\x78\x2b\x64\x60\x1e\x8e\x25\xb1\x87\x13\x33\x55\x32\x84\xc6\x47\x92\x71\xd1\x58\xed\x73\x15\xe3\xcf\xde\x0a\xbf\x83\xfa\xca\x91\x26\xbc\x38\xcc\x79\xe7\x42\xdd\x19\x35\x56\xcb\xe1\xaf\xa0\x4d\x82\xf4\x51\xe1\x73\x3d\x9a\x47\x08\x8f\x67\xea\xba\x4c\xe9\x2e\x91\x72\xa2\x81\xaa\x15\xd9\x32\x21\x8e\xc7\x52\xb8\xd7\x0c\x7c\x79\xb2\x37\xe5\xa9\x0d\x27\xa3\x38\x66\xc6\x71\x68\x31\xf3\xe9\x5e\x59\x8b\xe4\x1e\x8a\x89\x44\x11\x26\x2c\x44\xd3\x94\x06\x3b\x18\xc1\x7c\xc8\x29\xac\x57\x5c\xad\x5c\x22\x15\x2e\x07\x7a\xa5\xa1\xda\x5e\x35\xb0\x27\xa2\x89\x2a\x56\xc7\x88\x5d\x31\x33\x84\xa7\x54\x77\xb4\xb7\x34\xd8\x70\xa6\x28\x97\xed\xc3\x25\xdb\xa6\xa6\x7e\x42\x55\x71\x9a\x20\x8a\xfb\x5c\x2d\xc5\xb0\x62\xbb\x69\x07\x08\xc0\xc2\xb7\x48\xab\xfd\x10\x78\x50\x81\x2a\x80\x1f\x6b\xef\x6b\xe3\x7e\x12\x98\x81\x37\xca\x95\x49\x56\xe1\xac\xd3\x1a\x93\xcd\xb0\xca\x46\xc6\x27\xd7\xdd\xf9\x91\xd1\x09\x74\xf2\x92\x7c\xfa\x3f\x3d\x70\xf4\xe8\x63\xb7\x46\x38\x4b\x5a\xf9\xff\xb3\xf0\x8d\xe3\x9f\x8e\xaa\x5b\x8a\x48\x42\xbf\xca\xdf\x88\x09\x65\x87\x05\xc3\x1d\x21\xf7\x8a\xbf\x66\x14\x73\x54\x44\x98\x91\x3f\xed\xec\x16\x4f\xb4\xff\x16\x3f\x77\x21\xd1\x00\xf8\xbb\x67\x4b\x03\x8c\xb9\x6f\x10\x1a\xe0\x8e\xf6\xc3\xf8\x9f\xde\xc0\x34\x00\x7e\x46\x70\x49\xce\x4e\xdd\xb2\x4c\x03\x28\x78\x5a\x3f\x63\x1a\x40\x49\x9d\x35\x0d\xe0\xa6\xde\x50\x34\xc0\xa9\xf6\xd7\xf0\x3f\xad\x21\x0d\x80\xbf\x7d\xee\x69\x80\x74\xf4\x4a\x34\x40\x7e\xef\xd9\xd2\x00\xa7\xda\x5f\x24\xea\x85\x4e\x03\x28\xe7\x8a\x06\xf8\x43\xbc\x96\x34\x00\xab\xbc\x36\x1a\xe0\x63\xed\x1f\xe3\x2f\x5c\xd0\x34\xc0\x87\xd6\x9e\x06\xc0\xd2\xeb\x43\x03\xc0\x67\xda\x4f\xe3\xbf\xb9\x60\x68\x80\x93\x67\x46\x03\xe4\xe5\xd7\x4e\x03\xb8\xfc\xec\x68\x00\x6d\xcb\x59\xd1\x00\xb7\xb7\xff\x0a\x3f\x7f\xc1\xd2\x00\xf8\xd9\x97\xa7\x01\x8c\xc1\xbd\x7f\xf1\xe0\x59\xd3\x00\x57\xcc\xbc\x34\x0d\x80\xe9\xeb\x47\x03\xdc\xd9\xfe\x3e\x21\x6f\x24\x1a\x80\xbc\xa9\x68\x80\x62\xf6\x55\xd2\x00\xe7\x2d\x42\xf1\x79\xa5\x01\x4e\xb5\x1f\xc7\xff\xe3\xf5\xa7\x01\xf0\xd7\x25\x76\xe1\xd1\x00\x69\xb1\x9a\x06\x50\xf7\x31\x96\xd6\x5f\x81\x06\xf8\x68\xfb\xc7\xf8\x5f\xde\xa8\x34\x00\xfe\xbf\x6b\x46\x03\x6c\x99\x7c\x59\x1a\x80\xa3\xb5\xa1\x01\x2e\xed\xa5\xea\xe8\x59\xd3\x00\xf0\x78\xfb\x8b\xf8\x7f\x9e\x53\x1a\x60\xf2\x9c\xd1\x00\xe8\xf9\x57\x47\x03\x68\xe7\x1f\x06\xf0\x83\x73\x05\x03\x00\x85\xc3\xed\x67\xc9\xd0\x1b\x8b\x06\x18\x7a\x25\x1a\xc0\x73\x62\x1a\x80\x85\x67\x4a\x03\xc8\xda\x39\xa1\x01\x76\xdf\x70\x2e\x69\x80\x2d\xb7\x9c\x29\x0d\x70\x47\xfb\x1f\xf1\x2f\xdf\x7c\x34\x00\xfe\xc5\x2a\x1a\x00\x6b\xfc\x42\xa0\x01\xb2\xfa\x19\xd2\x00\xf7\x8c\x5e\x38\x34\xc0\x72\x7e\x8e\x59\xd8\x1f\x47\x1b\x3c\x63\x1a\x40\x04\x17\x46\x82\x0e\x4d\x9d\xa2\xe7\x9d\x07\x68\xdd\x74\x86\x3c\xc0\x7b\xcd\xd2\x0a\x20\xc0\xda\xf6\x2a\x80\x80\xfc\xfa\x17\x00\x01\xc0\xe1\x13\xed\x1f\xe2\x5f\xbd\x02\x11\x90\x44\x56\xbd\xb0\x91\x00\xfc\xcb\x55\x48\x80\xd0\xf8\x8b\x01\x01\x53\xc3\x67\x03\x04\x94\xfa\xce\x39\x10\x60\xf8\x82\xbe\x38\x10\x40\x3b\x62\x14\x7d\x49\x20\xe0\xdf\xd5\xcf\x1e\x08\x48\xb9\xaf\x0c\x04\x00\x83\x56\xfb\xf3\xc4\x7f\xe3\x10\x01\xee\xd9\x12\x01\x17\x5d\xf4\xe6\x21\x02\x3e\xda\xfe\x11\xfe\xd1\x9b\x95\x08\xc0\x3f\x7c\x01\x11\x60\x38\x09\x11\x30\x54\x48\x88\x00\x45\x3a\x27\x44\x00\xb2\x2e\x54\x22\xc0\x3a\x7e\x46\x44\x80\x87\xce\x94\x08\xb8\xab\xfd\xbf\xf1\xd3\x17\x18\x11\x10\xae\x26\x02\xfc\x33\x23\x02\xf0\x13\xaf\x13\x11\x80\x07\x89\xdc\x63\xbe\x10\x08\xe0\x46\x02\x04\xe8\x7c\x11\x08\xc8\x4b\xab\x81\x80\x71\xff\xbc\x01\x01\x18\x9d\x35\x11\x70\x57\xfb\x69\xfc\x0f\x17\x02\x11\x80\xff\xee\x8d\x42\x04\xf4\x79\x67\x48\x04\x7c\xa0\xfd\x97\xf8\x99\xf3\x4f\x04\x78\x67\x48\x04\xe0\xbf\xef\xec\x20\x39\x79\x4d\x44\x80\x71\xae\x81\x00\x67\xf8\x35\x02\x01\x0c\xde\xd7\xfe\x09\x7e\x66\x0d\x79\x00\xff\x9c\xf2\x00\xf8\x19\xc1\x10\xc2\xf8\x34\x1e\x00\xe1\x57\xe4\x01\xd2\xa5\x95\x3c\x00\x12\x2f\xce\x03\xd0\xb3\xc7\x01\xb0\xfa\xea\x71\x80\x52\x7a\x0d\x71\x00\x02\xbb\xda\x4f\x91\xe6\x6b\xa2\x01\xf8\xeb\x49\x03\x34\x57\xd0\x00\x14\xaf\x09\x0d\xe0\x9b\xe7\x85\x06\x18\x40\x6b\x8f\x03\xc4\xcf\xfe\x0f\xf0\x37\xdf\xfc\x3c\xc0\xf1\x35\xe1\x01\xd4\xc6\x85\xc9\x03\x94\x53\x2f\xcb\x03\xf8\xd1\x8b\xf1\x00\x87\xad\xf3\xc1\x03\xb4\xda\x3f\xc5\xdf\x5b\x53\x1e\xe0\xe3\x2b\x79\x00\x86\x5f\xc0\x03\xe0\xcb\xce\x0f\x0f\xa0\xcb\xab\x78\x80\x6a\xe9\x15\x79\x80\xdb\xdb\xcf\xe2\x87\x2f\x68\x1e\x00\x3f\x7c\x16\x3c\x40\x75\xc3\xcb\xf1\x00\x2e\x5f\xc5\x03\x84\xe6\xeb\xc6\x03\xe8\xe5\x33\xe3\x01\xe0\xc9\xf6\x67\xf1\xfd\xc4\x84\x39\x68\xc5\xf9\x21\x3a\x7d\x53\x5e\xed\x54\x19\x6f\xec\x17\x2d\x26\xf1\x64\x39\x5a\x6f\xcc\xa2\xa9\x58\xe8\x8f\xf3\x94\x76\x33\xef\x75\x6d\x22\x9d\x4d\xda\x78\xac\xeb\x13\x06\x1a\xed\x5e\x83\x8f\x2e\xe5\x56\xeb\x4c\x6e\xdd\x55\x76\xf5\x9c\xbb\xf8\x50\xc4\xfe\x7e\xde\x8a\x4c\x32\xdd\xfe\xab\x8c\xe1\xfb\x9d\x30\x3b\x9e\x93\xb0\xc4\x0c\xc9\x50\xb9\x90\xb9\x97\x91\x6c\x57\x47\xc8\x34\x04\x47\x45\xa4\x64\xb8\xa5\xd8\xa5\xcc\x80\x4a\xb8\xc4\xe8\x91\xaa\x3a\x8c\x72\x82\x20\x8c\xd0\x00\x72\x0d\x15\x93\x5e\x43\xa3\xa2\x64\xf3\xe6\xdb\xbd\x75\x54\x25\x18\x0b\x33\x8a\xa2\x48\x2a\x46\x12\x46\x98\xe4\xab\xeb\x8e\x86\xf9\xc6\x86\x86\x2c\x97\x6a\x98\x7b\x32\x4f\xef\x1b\x0a\x55\x19\x31\xfc\x95\xc9\x20\x8b\x78\xfa\x3e\x7b\x98\x71\x33\xca\xe8\x96\x56\x13\x86\xa0\x12\x16\x7a\xa8\xd0\xd1\x6c\xa1\x5c\x90\x1d\x1e\x54\xc9\x81\xf4\x46\x84\x74\x5d\x5d\x97\xf7\x4c\x46\xb8\x14\xad\xf7\x89\xde\x11\x68\x2b\xa5\x5e\x8c\xd2\x93\x83\xe9\x13\x0d\x41\x8a\xaa\x5e\xcb\xca\x38\x67\xd6\xae\x3b\x28\xe5\x34\xc7\x0e\xa3\x28\x2d\xcb\x22\xa3\x6c\xdf\xea\x15\x1a\x23\x4c\xf2\x33\x29\xe3\x37\xfb\xea\xd3\x98\x30\x44\x14\x8c\xa8\x5a\xb6\x8b\x99\xf3\xea\x8f\x70\x1e\x33\x26\x33\xf8\x6e\xfb\x11\x7c\x37\x31\xc0\x82\x5e\x78\x3b\xdc\xb6\x98\x5d\x68\x71\x33\x13\xaf\x69\x6e\xf2\x61\x71\x27\x19\x2f\x7b\x9d\x6a\x35\x56\x26\x5f\xe8\xcc\x11\x4b\xf2\xd4\xf8\xd8\xd4\x48\xa3\xab\x43\x1e\xa9\x37\x9a\x53\x13\x8d\x7a\x65\x4c\xf0\xae\x87\x53\x73\xd1\x43\xb8\x0b\x64\x74\x87\xf0\x54\xd3\x5d\x4c\x03\xb6\xec\x30\xb3\x34\xd1\xe2\x9a\xc9\x08\x42\x04\x0b\x0f\x4b\x76\x20\x6d\x44\xe9\xc0\xd5\x1c\x26\x61\x79\x7b\xad\x68\xc9\x84\x94\x24\x7d\x2e\x8c\xc2\xc8\x12\x98\x10\x95\xcd\x78\x6f\x6f\x32\xa7\x24\xa8\xa6\xf7\x61\xa4\xea\x1e\x1a\x40\x08\x59\xaa\x86\x86\xd5\xaa\x97\x32\xd2\x7b\xd7\x57\xf3\x04\x23\x44\x44\xaa\xf8\xe7\xaa\x2d\x64\x99\xc8\xff\x0b\xa5\xb2\x9b\x33\x29\x84\x6b\x43\x51\x03\x31\xd4\xd9\xa9\xaa\x1d\x81\xff\x9e\xbb\x2f\xda\x53\xac\x6a\x05\x81\xc3\x42\x6e\xe1\xef\x2b\xf9\x54\x67\x11\xa5\x88\x6d\x1e\x1e\xee\xad\xa8\x4a\xa8\x07\x97\xa6\xa3\x28\xb4\x1d\x2d\x27\x1d\xbc\xae\x66\xe6\xb0\x9c\xad\xe9\x6a\x91\x88\xc6\x89\xf4\xe0\x64\x1a\xe1\xde\xd2\xd8\xf8\x4e\x4f\xd7\x89\x9f\x31\xcc\xaa\x30\x04\x1b\x69\x14\xbc\xad\xdb\x95\x8c\x90\x9b\x42\x11\x56\xc8\x83\x85\xa7\xb8\xd4\x33\x32\x1e\x25\xbe\x4a\x8d\x2d\x9a\x3e\x1d\x85\x83\x43\x6e\xa3\x2f\x8e\x24\x09\x07\xf0\x3d\x38\x82\x3a\x4c\xc0\xce\xc4\x2e\xd3\xd9\x24\x2d\xcf\xb8\x89\x2f\x6a\x25\xee\xac\x44\xb6\x39\x3d\xcf\xd0\xe2\x23\xdc\xe9\x5a\xdc\x55\xbf\x7f\x40\xeb\x0f\xc6\x34\x81\x90\x6a\xeb\xbe\x27\x67\xb0\x18\xee\x8f\x2c\xcf\x55\xad\x91\x8a\x26\xe8\xf5\xbd\x37\x37\x2f\x53\xff\x4b\xef\x48\xf3\xea\xcd\x45\x57\xe9\x0b\x31\xb6\x2a\x3a\x1d\x95\x2d\x29\xcf\x15\x74\x3c\x63\x67\xb7\x57\xfa\x85\x42\xb9\x9d\x9d\xcb\xbb\x6e\x4a\x63\x52\x71\xb0\x17\xc9\x26\xc1\x9a\xed\x19\xa1\xb9\xfe\xf6\x4b\x46\x2e\x49\xdf\xc3\xd1\xd0\xf8\x45\xc5\x2f\x9a\x32\xb3\x64\x59\x18\x94\x59\x14\x40\xc0\xfe\xf6\x47\x49\x2f\x7c\x0b\x24\x08\x61\x1e\x0e\xc0\x6d\xf0\xd7\xf0\x5d\x80\x5a\xd7\xf3\x6a\xaa\x29\x0c\xdc\xd9\xdf\xc5\x8b\x43\x2c\x8b\x77\x33\x57\xf1\x7a\xa5\x79\x26\x99\xab\x6a\xc9\x87\x58\x1f\x1e\x67\xc9\xef\xa6\x5c\xee\x34\x5d\xb7\x61\x82\x70\x16\x2d\xa5\xb2\x12\x4b\x3b\xfa\xc6\x92\xb2\x7c\xc5\xaa\xb6\x9c\xec\x24\xd6\x80\xc6\xb9\x98\x82\x30\x98\xc5\x31\x38\xc4\x7d\x4f\x2c\xe6\x9b\xc0\xb5\xd8\x11\x61\xc9\xd4\x39\xd5\x0c\xf0\x7d\xd8\xec\xec\x0a\x99\x9c\x95\x8a\x8c\x10\x42\x04\xe6\xd4\x14\xfa\xc3\xd4\x90\x86\xae\xc1\x35\xae\x09\x8c\x44\x2e\xb4\xab\x54\xb3\x89\xf6\x12\x99\xb0\x16\x16\x64\x5f\xd6\x70\x8d\x93\xcf\x63\x8c\x65\x33\x9f\x2d\x56\x4d\x65\x32\x9d\x9a\x91\xaf\x71\x27\x54\x5e\x96\x25\x09\xa7\x35\xdd\xaf\xfc\x99\xf0\xc2\x6a\x43\xe0\xac\xe9\xe6\x34\x3b\x5f\x2d\xe5\x33\x45\x1f\x5b\x12\x93\xa4\x80\x6f\x31\x55\x9d\xaa\x46\x95\x7a\x8a\xa2\x6b\x29\x4a\xa4\x21\x44\x09\xdf\x6b\x1b\x72\x39\xca\x2f\x3c\x8d\x08\x96\xdd\xe9\x7d\x1c\x47\x9a\x36\xea\x4c\xfd\x77\x82\x11\x46\xc4\xec\x4c\xaf\x98\x75\x76\xb7\x0a\x26\x77\xd0\x75\xd6\x5b\x89\x8a\x6c\x8e\x6d\xf7\xe5\x92\x67\xcd\xe8\x16\xa6\xd4\xb4\x94\x59\x79\xa4\x4c\xb0\xb0\x65\x75\x30\xdd\xdf\x33\x6e\xef\xa6\xa8\x91\xf3\xea\x49\x2e\xad\x3b\x11\x57\x0d\x9b\xc7\xc1\x10\x74\xdf\x0b\x24\x24\xc9\x2e\x31\xb9\xee\xa1\x82\xef\xeb\x98\x6a\xcc\x1f\x42\x48\x48\x48\x52\xa5\x0c\x42\x16\x8a\x10\x61\x6a\x36\xb5\x13\x73\x6f\xa4\xc8\x15\x94\xb9\x57\xf4\x64\xdd\x3a\x26\xa3\x96\x96\xc9\x9b\x3e\xc1\x05\xa0\xf0\x65\xf8\x35\xfe\x0a\xfa\x19\x58\x90\x87\x4b\xe0\x1d\xdd\x59\x6e\x29\x91\x59\x9c\x62\xe9\xf4\x34\x4a\x7c\x11\x3f\x58\x99\x47\x69\xea\xf4\x44\x4a\xe3\x67\x9c\x49\x69\x9a\x64\xca\xb2\x61\xab\x9a\x15\x89\xe9\xbe\xc2\x6f\x69\x0e\x4b\x15\x70\x19\x13\x9d\xca\x9a\xa9\xaa\xc2\xf7\xad\x9e\x8f\xab\x1e\x67\x92\xd5\x23\x36\x09\x6c\xeb\x66\x31\xb0\x38\x93\x64\xce\xec\xf4\x86\xad\x91\x5f\x11\x8a\x31\x7a\x99\x6c\x85\x93\x4e\x86\x6f\xd4\x52\x46\xca\x4d\x09\x09\xc9\xbc\x9b\x26\x09\xdb\x05\x1f\x7d\x9f\x61\x42\x3b\xc3\x42\x50\xa4\x3f\x78\x7a\x12\x24\x2e\x51\xb2\x9c\x05\xc9\xd4\xcf\x22\x0d\x12\x30\xd8\x88\xd2\x64\x16\x6b\x60\x40\x16\xfa\xe1\x04\xfc\x59\xec\x3f\x50\x29\x87\x8b\xda\xe8\x64\x77\xd6\xb5\xd7\x8e\x35\x6b\x9d\xf7\x3c\x56\x38\x77\xd6\x0a\x96\x34\xea\x10\x3a\xa3\xa6\x5d\xf4\xa4\x7f\xf1\x46\x8e\x73\x0a\xad\x6e\xef\xd1\xa5\xf6\x0e\x83\xa9\x60\xb9\x07\x3a\x97\x9c\x0a\xf0\x23\xb4\xd0\x37\x2d\x22\x4b\x53\x6d\xa3\xfc\x9f\xbb\x29\xaa\x50\x25\xce\x51\xb5\x70\x8b\xaa\xda\x66\xb9\x4e\x8b\xbd\xd3\x22\x42\xbf\x6d\xaa\x2a\x0f\xfc\xdc\xe7\xb1\xf0\x7d\xb3\x77\xb1\x53\xf8\x26\x09\xdb\xc6\x62\xea\x2a\xce\xec\xcc\xfa\xad\x43\x65\x49\x36\x24\xd7\x1d\x9e\xb1\x82\x8a\x90\x8d\xd1\xfd\xb2\x15\x4d\xda\x59\x36\xa1\xa6\xb9\xe2\xc7\x6f\x97\x12\x5a\xc9\x82\xd9\xbd\x9c\xa9\x48\x11\x85\x70\x3c\xc9\x70\xa5\x95\x65\x89\x17\xec\x00\x63\xae\x61\x2a\x64\x8c\x31\x25\xe8\x53\x2b\x7b\xee\x8f\x30\x21\x04\x09\xa1\x21\x22\x49\xef\x88\xbb\x91\x50\x49\xc6\x12\x21\xf4\x25\x3a\x53\x92\x09\x63\xa7\xf5\x29\x22\x2f\xda\xb9\x92\x20\x14\x27\x9f\x04\xa6\x40\xe1\x0e\xf4\x29\x82\x63\x2f\xc5\x26\xec\x8a\xd9\x91\x95\x99\x58\x93\x6d\x52\x57\x02\xe8\xae\xfc\x46\xb2\xcc\x2c\x4d\x75\x5d\x31\x20\xe9\xf0\xae\x4e\x7a\x65\xc2\xd6\x55\xe7\x76\xce\x24\x80\x33\x59\xae\x70\x5b\x27\x07\x7c\x05\xe3\xb0\x94\x6e\xf8\x7c\x94\x2a\x58\x70\xed\xe2\xa5\xb4\x74\x79\x9d\xe3\x5a\xb0\x99\x92\x3a\xe6\x81\x97\x5a\xf8\x75\x4d\x92\xb9\x4f\x0b\x92\x5c\x92\x54\xee\xd6\x75\xb6\x99\xef\xeb\x9c\x67\x08\x5c\x8f\xca\x63\x35\x47\x37\x5d\xfc\x68\x29\xca\xa4\x47\xd4\x7c\x41\xaa\x30\x8a\x49\xaa\x7e\x28\x3b\xe2\x0d\x99\x8c\xa9\x6a\x37\x17\x5d\x9f\x9b\x33\x99\x14\x6d\xb3\x86\x42\xc7\x45\x8a\x11\xa6\x0e\x3a\x7d\xf9\x1c\xd3\x55\x16\x68\xd6\xd6\xf0\x06\x5a\xff\x4c\xaf\x53\x77\x98\xf0\x67\xcd\xa8\xd9\xa3\xdb\x9d\xf5\xf8\x24\xba\x9b\x08\xa2\xc0\x14\x5c\x06\x37\xaf\x92\xf9\x9a\x89\xd4\xb7\xd2\x94\x16\xef\x85\x96\xb7\x37\x31\x51\x13\x9b\x5f\x6a\x2f\x4c\xf3\xb7\x6c\x83\x79\x61\x9e\xbf\x24\x64\x0c\xc9\xcc\x15\x4b\xbd\xa1\x13\x7a\x29\xa2\xe5\xd6\x69\x42\xa2\x98\xc8\xaa\x3d\x5f\x0a\x34\xce\x9d\x14\xa5\x93\x42\x4e\xe5\x1b\xe1\x64\xd6\x43\x08\x87\x0e\xc3\x68\xe1\x77\x5e\x90\xec\x8f\xf3\x97\xc9\xf6\x87\x0f\xb9\x33\x3d\x8d\x71\x81\xb3\xa1\x47\x52\xc1\x90\x2f\x33\x42\xb8\x6e\x6b\x63\xf5\x14\xc5\xf9\x54\xb4\xa7\x36\x5c\xee\x2b\xd8\x76\xdf\x20\x43\x8a\x72\x23\xa5\xde\x36\x77\x65\x96\x3f\x4d\x3e\x3d\xcd\x1f\x26\xd8\xd2\x47\x51\x98\xe4\xf9\x43\x26\xfa\x14\x3e\x40\x6c\x48\x43\x33\x6e\xc1\x64\xa7\xf9\x32\x83\x6c\xb5\x46\xa8\xd3\x48\x78\x3f\x4e\xe7\x04\x51\xf3\xf4\xf2\x40\x26\x38\x2c\xa7\x1a\xbe\x18\xa1\x2a\xe6\x42\x9b\x23\xe3\x42\x52\xb9\x37\x93\x31\xab\x2e\xca\xa4\x33\x13\x71\xf5\xf5\x30\x1b\x8f\x8a\xb1\xac\x3a\xf3\x92\x83\x42\xf1\xeb\x94\x7a\xd5\x92\x5b\xad\x59\x45\x3b\xcc\x76\xfe\xde\x0a\x7a\x02\x5f\x49\x3c\xc8\xc0\x44\xc2\x8b\x9e\x6d\xcf\xe1\x7e\x3c\x99\x89\x3b\x41\xd3\x3b\x9d\x30\xce\xe3\x4e\x98\x49\x5b\x95\xed\xc8\xe3\xab\x3a\x21\x2a\xa4\x04\xfe\xce\x59\x37\x6b\x52\x7a\x56\x1f\xe8\x3b\x00\xe4\x20\x00\xbf\x17\x40\xfa\x29\x80\x1a\x01\x68\x1f\x01\xd0\xf7\x03\x18\xd7\x00\x98\xbb\x01\xec\x16\x80\xeb\x01\xb8\x8f\x01\x78\xcf\x03\x04\x13\x00\xa1\x01\x10\x3d\x06\x90\xba\x09\x20\xe3\x00\xe4\x07\x00\x8a\x0f\x01\x94\xbf\x0d\x50\xb3\x00\xea\x27\x01\x7a\x0e\x02\xf4\xcd\x02\xf4\xff\x03\xc0\xe0\x04\xc0\x90\x01\x30\xfc\x55\x80\x91\xaf\x02\x8c\xfd\x2b\xc0\x64\x16\xa0\x79\x17\xc0\xf4\x4d\x00\x33\xbf\x0f\xb0\x3e\x0f\xb0\xe1\x73\x00\xb3\x14\x60\xe3\x03\x00\x73\xf3\x00\x73\x0b\x00\x5b\xf6\x02\x6c\x6b\x02\x6c\x7f\x02\x60\xfe\xfd\x00\x17\x7f\x12\x60\xf7\x76\x80\x4b\x2e\x06\xb8\xf4\x5f\x01\xf6\xf7\x01\x5c\xde\x04\x38\x70\x0a\xe0\xe0\xaf\x01\x0e\x3d\x0f\x70\xc5\x2f\x01\x8e\xde\x08\x70\xac\x05\x70\x55\x15\xe0\xea\x2b\x00\xae\xd9\x0b\x70\xed\x43\x00\xd7\x3d\x06\x70\x7d\x1f\xc0\xf1\x7f\x0f\x70\xe3\x49\x80\xb7\x3d\x00\x70\x62\x00\xe0\xe6\x27\x00\x6e\x71\x00\x7e\xeb\x4f\x00\xde\x79\x10\xe0\x56\x0d\xe0\x5d\xc7\x00\x7e\x7b\x2b\xc0\x7b\xfe\x16\xe0\xe4\xbd\x00\xbf\xfb\x05\x80\xdb\x0f\x01\xbc\xff\x08\xc0\x07\x25\x80\xdf\xdf\x00\xd0\x9a\x07\xf8\x83\xff\x08\x70\xa7\x06\xf0\x47\x12\xc0\x3d\x12\xc0\x7d\x27\x01\xee\x7f\x10\xe0\x81\x09\x80\x3f\xfe\x29\xc0\xa9\xff\x00\xf0\xe0\x3c\xc0\x87\x8a\x00\x1f\x6e\x75\x8f\x8f\x7c\x03\xe0\xa1\x2f\x01\x7c\xec\xfb\x00\x1f\xcf\x02\x7c\xfc\x9b\x00\x7f\x72\x6b\xe7\x20\x2d\x78\x67\xa7\xb3\x48\x6b\xf1\x40\x33\xa4\x05\x4f\x93\x16\x6c\x26\x2d\xf8\x34\x69\xc1\x55\xa4\x05\x9f\x21\x2d\xb4\x83\xb4\xe0\x17\xa4\x85\x34\xd2\x82\xff\x4a\x5a\xf0\x08\x69\xc1\xf3\xa4\x05\x5f\x26\x2d\xb4\xa1\x73\x1d\xd2\x82\x1b\x48\x0b\x6d\x27\x2d\xf8\x30\x69\xc1\x29\xd2\x82\xdb\x49\x0b\x3e\x9a\x1c\x9f\x24\x2d\xb8\x8f\xb4\xe0\x23\xa4\x85\xa6\x49\x0b\x75\xee\xf7\x2b\xd2\x82\xfb\x49\x0b\x19\xa4\x05\x7f\x4e\x5a\x70\x33\x69\xc1\xd7\x48\x0b\x7e\x48\x5a\xf0\xb3\xe4\xe8\xdc\x13\x91\x16\x7c\x8f\xb4\xe0\xc7\xa4\x85\x3e\x99\x7c\xff\x2f\xa4\x85\x6c\xd2\x82\x0f\x25\xe7\xff\x15\x69\xc1\xff\x23\x2d\x78\xa6\xfb\x1b\x3c\x97\x1c\x3f\x20\x2d\x78\x8a\xb4\xe0\xce\xe4\xf5\x99\xee\xb5\x50\x0f\x69\xc1\x09\xd2\x82\x9f\x93\x16\x3c\x9b\xd4\xbf\xf3\xf9\x8e\xe4\x6f\xef\x1c\x1f\xeb\xd6\x3d\xae\xc7\x9d\x49\xdd\x4e\x25\xf5\x79\x9c\xb4\xe0\x70\x72\xfe\x0d\xa4\x05\x9f\x20\x2d\x68\x25\xbf\xdd\x95\x1c\x1f\x20\x2d\x78\x1f\x69\xc1\xae\xe4\xb5\x95\x5c\xeb\xc9\xe4\x5a\xdf\x4d\xea\xb2\x3f\xb9\xff\x97\x49\x0b\x36\x26\xd7\x3c\x49\x5a\xc8\x24\x2d\x54\xe9\xfc\x06\xb8\xfb\x50\xb5\xdf\x0b\x1e\x00\x20\x38\xbd\xdc\x14\x7f\x8b\x81\x00\x05\x06\x1c\x04\x48\x20\x83\x02\x2a\x68\xa0\x83\x01\x26\x58\x60\x83\x03\x2e\x78\xe0\x43\x00\x21\x44\x90\x82\x34\x64\x20\x0b\x39\xc8\x43\x01\x8a\x50\x82\x72\xcc\x5b\xd7\xa0\x0e\x0d\xe8\x81\x5e\xe8\x83\x7e\x18\x80\x41\x18\x82\x61\x18\x81\x51\x18\x83\x71\x98\x80\x49\x68\xc2\x14\x4c\xc3\x0c\xac\x83\xf5\xb0\x01\x2e\x82\x59\xd8\x08\x9b\x60\x0e\x36\xc3\x56\xd8\x06\xdb\x61\x07\xcc\xc3\x4e\xb8\x18\x76\xc1\x6e\xd8\x03\x97\xc0\xa5\xb0\x17\xf6\xc1\x7e\xb8\x0c\x2e\x87\x03\x70\x10\xde\x02\x87\xe0\x30\x5c\x01\x6f\x85\x23\x70\x14\x8e\xc1\x95\x70\x15\xdc\x09\x9f\x85\xcf\xc1\x97\xe0\x51\x78\x0c\xbe\x0c\x5f\x81\xc7\x11\x26\x5b\xb7\xed\x8e\x6b\x47\xba\x95\x44\xd5\xa4\xe6\x59\x20\x9d\x77\xa8\xda\x99\xb5\x97\x9b\x03\x91\xe5\x96\x5a\x2a\x08\x80\x50\xc6\x85\x24\x2b\xaa\xa6\x1b\xa6\x65\x3b\xae\xe7\x07\x61\x94\x4a\x67\xb2\xb9\x7c\xa1\x58\x2a\x57\xaa\xb5\x7a\xa3\xa7\xb7\xaf\x7f\x60\x70\x68\x78\x64\x74\x6c\x7c\x62\xb2\x39\x35\x3d\xb3\x6e\xfd\x86\x8b\x66\x37\x6e\x9a\xdb\x0c\x5b\xb6\x6e\xdb\xbe\x63\x7e\xe7\xc5\xbb\x76\xef\xb9\xe4\xd2\xbd\xfb\xf6\x5f\x76\xf9\x81\x83\x6f\x39\x74\xf8\x8a\xb7\x1e\x39\x7a\xec\xca\xe4\x3e\x57\xaf\xb8\xe7\x0d\x37\x5e\x7f\xfc\xaa\x6b\xaf\x5b\xfc\x78\xcd\x0b\xba\xeb\x9c\x17\x8a\x46\x00\xc0\x03\x2b\x1e\x01\x57\xc2\xfb\xe0\x93\x45\xab\xe8\x15\x53\xc5\x5c\xb1\x5c\xac\xb7\xdb\x00\x50\x84\xab\xe3\x6f\xdd\x62\x54\xcc\x2e\x7d\x7b\x7a\x41\xe0\xc1\x29\xf8\x46\xfc\xdf\x37\xe1\xdb\xf0\x1d\xf8\x4e\xbb\xfd\xba\x8f\xab\x2d\xaf\x7a\x64\x5d\x03\x16\x5c\x0b\xd7\xc1\x0d\x70\x23\x5c\x0f\xc7\xe1\xaa\xa4\xa7\x2c\x00\xb8\x59\x16\x02\xc4\x1a\x15\x45\x92\x40\x5a\xa3\xa2\xae\xe1\xbd\x34\x59\x06\x79\x8d\x8a\xae\x28\xa0\xac\x51\x31\x54\x15\xd4\x35\x2a\xe6\x1a\xde\xcb\xd2\x34\xd0\xd6\xa8\xd8\xba\x0e\xfa\x1a\x15\xc7\x30\xc0\x58\xa3\xe2\xae\xe1\xbd\x3c\xd3\x04\x73\x8d\x8a\x6f\x59\x60\xad\x51\x09\x6c\x1b\xec\x35\x2a\xe1\x1a\xde\x2b\x72\x1c\x70\xd6\xa8\xc4\x12\xfb\x03\xc0\x00\x91\x79\xa2\x01\xc0\xe7\xba\xaf\xb8\x08\x1b\xd0\x54\x2c\x18\xc8\x2f\x2e\x30\xcc\xdd\xfc\xee\x77\xc1\x26\x28\x16\xeb\xf4\xb9\x85\x59\x00\xfa\x1c\x1a\x4f\x24\x4b\x04\xf0\xc7\x7f\x78\xe4\xdb\x57\x9a\x1b\x7e\x01\x40\x1f\xe9\x9c\xfd\xb9\x2f\xdc\x10\x2e\xbf\x2e\x7c\x8b\xb4\xe8\x73\xb1\x5c\x86\x13\xe1\x0b\x75\xae\xd0\xb9\x4e\x2c\xad\x76\xfe\x7f\xba\x8c\x7a\x53\xfc\xcd\x4d\xa8\x17\xa4\xf8\x33\x06\x09\x36\x81\x02\x00\x9b\xc0\x03\x04\xe8\xff\x07\x00\x00\xff\xff\x10\xfa\xa3\xe1\x4c\xb3\x00\x00") + +func fontsChromohvTtfBytes() ([]byte, error) { + return bindataRead( + _fontsChromohvTtf, + "fonts/chromohv.ttf", + ) +} + +func fontsChromohvTtf() (*asset, error) { + bytes, err := fontsChromohvTtfBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/chromohv.ttf", size: 45900, mode: os.FileMode(438), modTime: time.Unix(1575019249, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x24, 0xf2, 0xd8, 0x6, 0x84, 0x5, 0x87, 0xdf, 0x73, 0xed, 0x28, 0x56, 0xb1, 0x64, 0x31, 0xde, 0x39, 0x8c, 0xfc, 0x63, 0x51, 0x4b, 0x36, 0xe1, 0x48, 0xc6, 0x5d, 0xc4, 0xb9, 0x56, 0xa7, 0x9a}} + return a, nil +} + +var _fontsReadmeMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\xcd\x31\x0e\xc2\x30\x0c\x40\xd1\xdd\xa7\xb0\xba\x27\x5e\x10\x03\x2b\x27\x71\x52\xe3\x04\xd4\x38\x92\x1d\x71\x7d\x16\x04\x5b\xc7\x37\x7c\x7d\x35\x54\x09\x4c\x0b\xb5\x47\x5b\x25\x57\x3b\xe8\x19\x22\xeb\x2d\x83\xd4\x52\xe9\x63\xe7\x60\xca\x39\x03\xfc\x8d\x0f\x1b\xe1\xe0\xb2\x63\xea\xb8\x39\x4d\xae\x2f\x56\xc1\x83\xfb\xf8\xa1\xb0\xcb\xf5\x72\xe7\x19\xb5\x31\xe9\x86\xdf\x3a\xab\x01\x40\x8b\x98\x7e\x23\x3a\x3f\x7f\x02\x00\x00\xff\xff\xd8\xc1\x8e\x9e\xa2\x00\x00\x00") + +func fontsReadmeMdBytes() ([]byte, error) { + return bindataRead( + _fontsReadmeMd, + "fonts/readme.md", + ) +} + +func fontsReadmeMd() (*asset, error) { + bytes, err := fontsReadmeMdBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/readme.md", size: 162, mode: os.FileMode(438), modTime: time.Unix(1575946497, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0x4b, 0xfe, 0x21, 0x87, 0xbe, 0x4a, 0x1f, 0x62, 0x35, 0x17, 0x96, 0xf8, 0xf5, 0xb7, 0x2f, 0xc, 0x19, 0x30, 0xf5, 0x14, 0x2c, 0xf, 0x2c, 0x83, 0xa3, 0xfb, 0xe4, 0x53, 0xac, 0xee, 0xd0}} + return a, nil +} + +var _fontsWqyMicroheiTtc = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfc\x79\x78\x14\x55\xda\x3f\x8c\x7f\x4e\x9d\xaa\x5e\xb2\x74\x57\x77\x3a\xe9\xec\xa9\xee\x4e\x67\xa1\x93\x74\xa7\x2b\x2b\x84\x74\x93\xb5\x09\x24\x24\x10\x20\x09\x74\xd2\x81\x10\x76\x42\x04\x05\x65\x80\x20\x56\x58\xdc\x40\x11\x77\xc5\x75\x5c\x50\x1a\x97\x88\x0c\xa3\x32\x8e\x3a\x8e\xe3\x36\x80\xe3\x8c\x8f\xc6\xe0\xe8\xcc\x3c\x0f\x3a\xcc\x38\xce\x88\x92\xee\xdf\x55\x55\x61\xd1\xf9\x3e\xbf\xe7\xb9\xde\xeb\x7d\xdf\xbf\xde\xbe\xfc\xa4\xbb\xce\xa9\xaa\x73\xce\xbd\x9d\xcf\x7d\x57\xc9\xfa\xf5\x8b\xfb\x41\x20\x7f\x18\x00\x16\x80\x84\x94\x63\x0b\x01\x58\xf8\x1b\x1a\xda\x9b\x67\xbc\xfa\x6c\x0e\x90\x72\x1a\x40\x7a\x63\x5d\x7d\x03\x72\x8e\x6f\x03\x6c\x46\x00\x99\x8d\xad\xb3\xe6\x98\x82\x0d\x02\xca\xd2\xbe\x04\x1e\xf9\xaa\x71\xce\xdc\x9a\x55\x7b\xd7\xdf\x8c\xb2\xe3\x1f\x01\x10\x66\xcd\x71\x7b\xb7\x6f\x89\x49\x47\xd5\x6f\x9b\x01\x84\x16\xaf\xee\x5d\x1b\x33\xda\xba\x05\x60\x0e\x02\x89\x93\x17\x5f\xb5\x5e\xa8\xdc\x52\x3d\x13\xb0\x7e\x01\x90\xf3\xfd\x6b\x97\xae\x5e\x77\xc2\x11\x06\x52\x22\x80\x96\x5b\xda\xbb\x6e\x2d\x58\x68\x01\x1b\x05\x10\xb7\x74\xd5\xd5\xfd\x5c\xdd\xb3\x1a\xc0\x56\x88\xd2\xef\x5e\x59\xb6\xa4\xb7\xaf\xfa\x5c\xe9\x36\x94\x1d\xff\x1e\x40\xd9\xb2\x65\x4b\x7a\xe3\xfa\x5e\x3a\x86\xb2\x5f\x14\x03\xc8\x5e\xb6\x7a\xfd\xc6\xb8\x2f\x1a\xaf\x42\xd9\x2f\xe6\x82\x89\xfc\xe7\xaa\x81\xc5\xbd\x47\x27\xbb\xff\x8c\xca\xe3\x3e\x50\xee\xec\xea\xde\x8d\x6b\x7f\x39\x9d\x2e\x44\xd5\x1b\x6e\x79\xbe\x6b\x7a\x57\x2f\xc9\xbe\xf9\xf3\x9f\xa0\xea\x8d\x59\x40\x4c\x64\xed\xc0\xba\xf5\x89\xbf\x5a\xf5\x4b\x54\xfd\xf6\x29\xe8\xfc\x5d\x6b\xaf\x58\xb2\xf6\xda\xff\xb0\x25\xa0\x3e\x41\x0b\x30\x67\xae\x5a\xb6\xa4\x37\xf6\x51\x63\x2a\xea\x13\xbf\x96\xc7\xbb\x6a\xf5\xfa\x8d\xff\xfa\x79\xb1\x07\xf5\x49\x56\x90\x6b\x23\xff\x4f\xcb\x72\x4e\xeb\x7d\x83\x68\xb8\x33\x11\xb0\xea\x64\x59\xd6\xdd\xdb\x7c\x05\x1a\xc2\x19\x00\xc3\xff\x5f\x91\xe5\xe6\x5f\xdf\x51\x8c\x86\x67\x0a\xff\xef\x92\x65\xf2\xe2\x5b\x96\xa3\xe1\x99\xc5\x40\x6c\xab\x2c\xcb\xa3\xa9\xcf\xa6\xa0\xe1\xe7\xcf\x42\xe7\xfb\x4e\x96\xe5\xb4\x9f\xff\xe1\x5a\xb4\x8c\x3f\x05\x30\x5b\xfe\x47\x59\x02\x1c\x00\x79\xee\x05\x90\x25\x0a\xdd\x11\xd5\x76\x13\x3c\xa0\xca\xaf\x02\x50\xc4\x28\xed\xac\xee\x06\x80\xec\x24\x80\x16\x3b\x01\x6c\x21\x5b\xc9\x2d\xe4\x01\x12\x26\xef\x90\xf7\xc8\x6f\xc9\x49\xf2\x01\xf9\x90\xfc\x81\xfc\x07\x39\x4b\xa2\x4c\x0a\x73\x8c\x79\x83\x79\x8b\x79\x9b\x79\x8f\xf9\x98\xf9\x9a\x12\x4a\xa9\x9e\x1a\xa9\x83\xee\xa6\x37\xd0\x07\xe8\x3b\xf4\xb7\xf4\x03\x76\x98\x4b\x30\xf8\x32\x49\xa6\x2f\x53\xca\x3c\x97\xd5\x2c\xf0\x42\xa6\x60\x17\x72\x85\x42\xc1\x23\x88\x42\xa9\x50\x25\x54\x0b\x75\xc2\x7a\x61\xab\x70\x9d\xf0\x98\xf0\xbc\x8d\xda\x38\x9b\xde\x66\xb2\x25\xd8\x92\x6c\xc9\xb6\x74\x9b\xdd\x96\x63\x73\xd9\x8a\x6c\xa2\xad\xd4\xd6\x6e\xeb\xb6\xad\xb4\x5d\x6d\x87\x9d\xda\xf5\xf6\x38\xbb\xd1\x6e\xb6\x27\xda\xad\xf6\x54\xbb\x60\x77\xd8\x9d\xf6\x02\x7b\x91\xbd\xdc\x3e\xd5\x5e\x6f\x0f\xd8\x67\xda\x67\xdb\x7b\xed\x4b\xed\x2b\xed\x03\xf6\x1d\xf6\xdb\xec\xb7\xdb\xef\xb4\x3f\x62\x7f\xd9\xfe\x9a\x23\xd6\x61\x76\x1c\xca\x7e\x3e\xfb\x2f\xce\x19\xce\xf5\xce\x9b\x9d\xb7\x39\x1f\x70\x3e\xe1\x7c\xd6\xf9\x82\xf3\xe7\xce\xe3\xce\x5f\x39\xdf\x72\xbe\xef\xfc\xc2\xf9\xd7\x1c\x4d\x8e\x31\x27\x3d\x27\x33\xc7\x9f\x53\x93\xb3\x22\x67\x75\xce\x40\x8e\x94\x9b\x94\x9b\x9c\x9b\xeb\xa1\x1e\xab\x27\xcb\x93\xef\xd9\xe7\xb9\xcf\xf3\x4f\x4f\xa4\x38\xbf\xf8\x26\x6f\xba\x37\xdf\xeb\xf5\x56\x7a\x37\x79\xb7\x7a\x1f\x13\xa9\x18\x2f\x5a\xc4\x64\xd1\x21\xe6\x8a\x2e\xb1\x4c\x9c\x22\x36\x89\xcd\x62\x9b\x38\x5f\xdc\x22\x5e\x27\xfe\x5a\x3c\x21\x7e\x20\x7e\x28\x7e\xdc\x8c\xe6\xe7\xef\x7f\xf5\x77\x0f\x7d\x57\xf8\x3d\x1b\x29\x8e\xd4\x45\x66\x47\xe6\x47\xfa\x23\x2b\x23\xd1\x68\x77\xf4\xfe\xe8\x17\xd1\xf1\x68\x54\x89\x33\x02\x0e\x90\x5b\xc8\x01\x72\xe8\xff\xa0\x89\xef\x98\x64\xe6\x18\xf3\x3a\xf3\xa6\xa2\x89\x0f\x99\xaf\x29\x2e\x6a\xe2\x3a\x7a\x03\xbd\x89\x3e\x44\xdf\xa7\x1f\xb0\x60\x77\x1a\x7c\x99\xc8\xac\xce\x1c\xca\x3c\x90\xd5\x2c\x40\x48\x10\x04\xc1\x29\x4c\x12\x3c\x82\x57\x28\x15\x2a\x2f\x6a\x62\x9b\x70\x40\x78\xf2\xdf\x34\x61\xbb\x4c\x13\x73\x6c\x0b\x6c\x21\xdb\x5a\xdb\x1e\x3b\x63\xe7\xec\xb1\x76\xa3\xdd\x34\xa1\x89\x0c\x45\x13\xb9\xf6\x22\x7b\x89\xbd\xea\xa2\x26\x42\xf6\x3e\xfb\x0a\xfb\x1a\xfb\xb5\x3f\xd0\x84\x4e\xd1\x44\x28\xfb\x3d\x27\x9c\xad\xce\x6d\xce\x5b\x9c\x07\x9c\x0f\x39\x9f\x71\x8e\x38\x8f\x39\x5f\x71\xbe\xee\xfc\xb5\xf3\x1d\xe7\x69\xe7\x5f\x73\xb8\x1c\xc3\x45\x4d\xb4\xe7\xac\xca\x19\xc8\x19\xca\x4d\x50\x34\x01\x0f\xe7\xc9\xf0\xd8\x3c\xd3\x3c\x77\x7a\x1e\xf0\x7c\x5f\xcc\x15\x17\x7b\xe1\x15\xbc\xc5\xde\x4a\x6f\xc8\xbb\xd5\xfb\xd0\x45\x4d\xd8\xc5\x9c\x09\x4d\x4c\x9f\xd0\xc4\x26\x71\x48\xdc\x29\xbe\x2d\x9e\x12\x3f\x14\x3f\x92\x35\xd1\x82\x83\x38\x87\xef\x49\xc4\x13\x11\x23\xd3\x23\xed\x91\xce\xc8\xb2\x48\x34\x4a\xa2\xbd\xd1\x4f\xa3\xe7\xa3\x51\x90\xe8\x67\xd1\x5f\x44\xc3\xd1\x87\xa2\xfb\xa3\x57\x47\x37\x46\x37\x44\xaf\x8a\x5e\x19\x5d\x1f\x5d\x17\xbd\x22\xda\x13\x9d\x17\xad\x8e\xdc\x13\xb9\x35\x72\x4b\x64\x6f\xe4\xe6\xc8\xce\xc8\xba\xc8\xd2\x48\x7f\xa4\x37\xb2\x30\x32\x7d\xfc\x2f\xe3\x7f\x1e\xff\xd3\xf8\x17\xe3\x7f\x1c\x1f\x1b\x3f\x32\xfe\xc2\x3f\x6e\xf8\xe3\x6f\xfe\xb8\xe7\x8f\xad\x7f\x2c\xfb\xec\xb3\xcf\x8a\x3f\x73\x7f\x56\xf4\x59\xc1\x67\x93\x3e\xcb\xfb\x2c\xf7\xb3\x9c\xcf\x1c\x9f\xd9\x3f\xcb\x38\xfd\xd5\xe9\x3f\x9e\xfe\xec\xf4\xaf\x4e\xbf\x7e\xfa\xea\xd3\x1b\x4f\x5f\x79\x7a\xcd\xe9\xd5\xa7\x57\x9e\x5e\x71\x7a\xe9\xe9\xc5\xa7\x43\xa7\x17\x9e\xee\x3a\x3d\xef\xf4\xdc\xd3\x15\xa7\xbd\xa7\x8b\x4f\x17\x9e\xb6\x9e\x4e\x3a\x9d\x78\xda\x72\xda\x7c\xda\x74\xda\x78\xda\x70\x3a\xee\x74\xcc\x69\xdd\x69\xed\x69\xcd\x69\xee\x34\xc6\xce\x8f\x7d\x33\xf6\xf5\xd8\xd9\xb1\xff\x1a\xfb\x64\xec\x3f\xc6\xfe\x30\xf6\xe1\xd8\xeb\x63\x2f\x8e\x1d\x19\x7b\x61\xec\xe0\xd8\xad\x63\x37\x8d\xcd\x1c\x6b\xf8\xf4\x89\xd1\xef\x46\x3f\x1d\xfd\xf5\xe8\xeb\xa3\x47\x47\x8f\x8c\x3e\x3d\xfa\xd4\xe8\xa3\xa3\x0f\x8f\x1e\x18\xbd\x6f\xf4\xae\xd1\x3b\x47\x6f\x1f\xdd\x31\xba\x75\x74\xc5\xe8\xe2\xd1\xf9\xa3\xf3\x46\x4b\x47\x4b\x46\x1d\xa3\xf6\x51\xdb\xa8\xe9\x93\xeb\x3e\xd9\xfe\xc9\x95\xa7\xee\x3d\x75\xcf\xa9\xdb\x4f\xed\x3f\xb5\xf5\xd4\xa6\x53\x57\x9f\xba\xf2\xd4\xc0\xa9\x65\x27\xff\x75\xf2\x1f\x27\xbf\x3c\xf9\xa7\x93\xc7\x4f\xbe\x74\xf2\xee\x93\xd3\x4e\x56\x9c\xf4\x9e\x74\x9f\xcc\x39\x99\x7d\xd2\x76\xd2\x7a\x32\xe1\xa4\xe6\x24\x7b\x92\x9c\x38\x7f\xe2\xf7\x27\x3e\x3c\x71\xea\xc4\x89\x13\xbf\x3d\xf1\xfe\x89\x77\x8f\x3e\xf5\xe2\xb9\x17\x0f\x3d\xb5\x0e\xb8\xbe\x62\x67\xfc\xce\xb8\x9d\xba\x9d\xda\x9d\x9a\x9d\xdc\x8e\x2b\x76\x0c\xee\x18\xd8\xe1\xde\x91\x3a\xb1\xf3\xfe\x7f\x9f\xff\x77\x3e\xe9\xff\x7d\x97\x64\x15\x1e\x92\x92\xa5\x14\x29\x55\x4a\x93\xd2\xa5\x0c\x29\x53\xca\x92\x04\xc9\x26\xd9\x25\x87\x94\x2d\x39\xa5\x1c\x29\x57\xca\x93\xf2\xa5\x49\x92\x4b\x2a\x90\x0a\xa5\x22\xc9\x2d\x79\xa4\x62\xc9\x2b\x89\x52\x89\x54\x2a\x95\x49\xe5\x52\x85\x54\x29\x4d\x96\xa6\x48\x55\xd2\x54\xa9\x5a\xf2\x49\x7e\x69\x9a\x54\x23\xd5\x4a\x75\x52\xbd\xd4\x20\x35\x4a\x01\x69\x7a\x65\x58\x6a\x92\x66\x48\x33\xa5\x66\xa9\x45\x9a\x25\xb5\x4a\x6d\xd2\x6c\x69\x8e\xd4\x2e\xcd\x95\xe6\x49\xf3\xa5\x0e\xa9\x53\xea\x92\x16\x48\x0b\xa5\xa0\xd4\x2d\xf5\x48\x21\xa9\x57\x5a\x24\x2d\x96\xfa\xa4\x25\x52\xbf\xb4\x54\x5a\x26\x2d\x97\x56\x48\x2b\xa5\x55\xd2\x6a\x69\x8d\x34\x20\xad\x95\x06\xa5\x2b\xb4\x7f\x96\xd6\x49\xeb\xa5\x2b\xa5\xab\xe2\x5e\x97\x36\x48\x1b\xa5\xab\xb5\xc7\xa4\x6b\xa4\x4d\xd2\x4f\xa4\xcd\xd2\x16\x69\xab\x34\x24\x6d\x93\xae\x95\xb6\x4b\xd7\x49\x92\x34\x2c\xed\x90\x76\x4a\xbb\xa4\xdd\xd2\xf5\xd2\x0d\xd2\x8d\xd2\x4d\xd2\xcd\x33\xb6\x48\x7b\xe2\xff\x96\x60\x97\xf6\x4a\xb7\x48\xb7\x4a\xfb\xa4\xdb\xa4\xfd\xd2\xed\xd2\x1d\x71\x4d\xd2\x9d\xd2\x5d\xd2\xdd\xc9\x0e\xe9\x1e\xe9\x5e\xe9\x3e\xe9\x7e\xe9\x80\xf4\x80\xf4\xa0\xf4\x90\xf4\xb0\xf4\x88\xf4\xa8\xf4\x53\xe9\x31\xe9\x71\xe9\x09\xe9\x49\xe9\xa0\xf4\x94\xf4\xb4\x74\x48\x0a\x4b\x87\xa5\x67\xa4\x67\xa5\xe7\xa4\xe7\xa5\x11\xe9\x05\xe9\x88\xf4\xa2\x74\x54\xfa\x99\x74\x4c\xfa\xb9\xf4\x92\xf4\xb2\xf4\x8a\x74\x5c\xfa\x85\xf4\xaa\xf4\x4b\xe9\x35\xe9\x75\x5d\xa9\xf4\x86\xf4\x2b\xe9\x4d\xe9\xd7\xd2\x5b\xd2\x6f\xa4\xb7\xa5\x77\xa4\x77\xa5\xf7\xa4\xf7\xa5\xdf\x4a\x27\xa4\x93\xd2\x29\xe9\x03\xe9\x77\xd2\x87\xd2\xef\xa5\x3f\x48\x1f\x49\xff\x21\x7d\x2c\x7d\x22\x8d\x4a\x9f\x4a\x63\xd2\x69\xe9\x33\xe9\x8f\xd2\xe7\xd2\x17\xd2\x9f\xa4\x3f\x4b\x7f\x89\x7f\x49\xfa\x4f\xe9\xbf\xa4\x33\xd2\x97\xd2\x57\xd2\x5f\xa5\xb3\xd2\xdf\xa4\xbf\x4b\x5f\x4b\xff\x90\xbe\x91\xfe\x29\xfd\x4b\xfa\x56\x3a\x27\x7d\x27\x7d\x2f\x9d\x97\xc6\xa5\x88\x14\x1d\xc6\x30\x19\x66\x86\xe9\x30\x3b\xcc\x0d\x6b\x86\xb5\xc3\xba\x61\xfd\x70\xcc\x70\xec\x70\xdc\x70\xfc\xb0\x61\xd8\x38\xcc\x0f\x9b\x86\xcd\xc3\x09\xc3\x96\xe1\xc4\xe1\xa4\x61\xeb\x70\xf2\x70\xca\x70\xea\x70\xda\x70\xfa\x70\xc6\x70\xe6\x70\xd6\xb0\x30\x6c\x1b\xb6\x0f\x3b\x86\xb3\x87\x9d\xc3\x39\xc3\xb9\xc3\x79\xc3\xf9\xc3\x93\x86\x5d\xc3\x05\xc3\x85\xc3\x45\xc3\xee\x61\xcf\x70\xf1\xb0\x77\x58\x1c\x2e\x19\x2e\x1d\x2e\x1b\x2e\x1f\xae\x40\x9c\x6c\x61\x31\x1b\x27\x4c\xed\x93\xcb\xcc\x8e\x28\xfb\x21\xb0\x65\x82\xd7\x1c\x00\xc8\x56\x00\x8b\x00\x72\xcb\x04\x6a\x00\x22\xb7\x3f\x00\x90\x5a\x80\x1c\x02\x48\x18\x20\xf5\x00\x79\x67\x02\x8d\x00\x79\x6f\x02\x01\x80\xfc\x76\x02\xd3\x01\x72\x72\x02\x4d\x00\xf9\x60\x02\x33\x00\xf2\xe1\x04\x66\x02\xe4\x0f\x13\x68\x06\xc8\x7f\x4c\xa0\x05\x20\x67\x27\x30\x0b\x20\xdf\x01\x24\x0a\x90\x56\x80\x49\x06\x98\x14\x80\xcc\x03\x98\x63\x2a\x48\x07\xc0\xbc\x0e\x30\x6f\x00\xa4\x13\x60\xde\x04\x98\xb7\x00\xb2\x00\x60\xde\x56\x41\xba\x01\xe6\x3d\x15\xa4\x07\x60\x3e\x04\x98\x8f\x95\x9c\x03\xcc\xd7\x2a\x48\xbf\x2a\x0a\x4a\x00\xb2\x14\xa0\x54\x05\x59\x0e\x50\xbd\x0a\xb2\x02\xa0\x46\x15\x64\x25\x40\x1d\x2a\xc8\x2a\x80\x5e\x07\xd0\xdd\x00\x59\x0d\xd0\x1b\x54\x90\xf5\x00\xbd\x09\xa0\xb2\x0c\xaf\x04\xe8\x43\x00\x95\xe5\xb6\x0b\xa0\xef\x03\x54\x96\xd5\xf3\x00\xfd\x40\x05\x79\x41\xa1\x97\x60\x87\x01\x72\x04\x60\x77\x02\x5c\x02\xc0\xf8\x00\xc3\x04\xe4\xb5\x65\xca\xb4\x9d\x00\xcc\x6f\x80\xcc\x6a\x20\x53\x6e\x7f\x07\xc8\x1c\x02\x32\x25\x75\x9d\x99\x07\x80\xcc\x73\x00\xf3\x01\x90\xd5\xac\x82\x7a\x54\xb5\x0b\x3c\x40\x8b\x01\x21\x01\x10\x32\x01\x5a\x03\x08\x02\x20\xd8\x01\xda\x02\x08\x4e\x40\xc8\x05\x68\x1b\x20\x4c\x02\x84\x42\x80\xb6\x03\x82\x47\x05\xed\x00\x04\x2f\x20\x88\x00\xed\x04\x84\x52\x15\x74\x01\x20\x54\x02\x42\x15\x40\x17\x02\x42\xb5\x0a\x1a\x02\x84\x3a\x15\xb4\x17\x10\xd6\xab\xa0\x8b\x00\x61\xab\x0a\xba\x18\x10\xb6\x01\x82\x2c\xc7\x3e\x40\x38\x00\x08\x8f\x01\x74\x19\x20\x3c\x09\x08\xb2\x9c\x06\xd5\x1c\x42\x06\xfd\x09\x60\xe3\x54\xd0\xcd\x80\x4d\xaf\x82\x6e\x01\x6c\x26\x15\x74\x2b\x60\x4b\x50\x41\x87\x00\x5b\x92\x0a\x2a\xe7\x3e\xc9\x2a\xe8\xb5\x80\x2d\x5d\x05\xdd\x0e\xd8\x6c\x80\xcd\xae\xea\xd3\x96\xa3\x82\x0e\x03\x36\x97\x0a\xba\x03\xb0\x15\xa9\xa0\x3b\x01\x9b\xa8\x82\xee\x02\x6c\xa5\x2a\x64\x3b\xb0\xcd\x01\x6c\xed\x00\xbd\x1e\xb0\x2d\x00\x6c\xdd\x00\xbd\x11\xb0\x85\x00\x9b\x6c\x3b\x7b\x01\xdb\x5a\xc0\x76\x35\x40\xef\x05\x6c\x7b\x00\xbb\x6c\x7f\x3f\x05\xec\x0c\x60\xa7\x00\x9b\x0c\xd8\x39\xc0\xae\x07\xd8\x54\xc0\x1e\x0b\xd8\xe3\x00\x36\x0b\xb0\x1b\x55\xb0\x36\xc0\x6e\x02\xec\x66\x80\xb5\x03\xf6\x44\x15\x6c\x36\x60\xb7\xaa\x60\x9d\x80\x3d\x55\x05\x9b\x03\xd8\x33\x00\xbb\x00\xb0\xb9\x80\xdd\xa1\x82\x75\x01\x76\xa7\x0a\xb6\x00\xb0\xcb\x7d\x05\x00\x5b\x08\xd8\x8b\x54\xb0\x22\x60\x2f\x01\xec\xe5\x00\x2b\x7f\x57\x01\xf6\xa9\x00\x5b\x01\xd8\xeb\x55\xb0\x93\x01\x7b\x40\x05\x3b\x05\xb0\xcf\x54\xc1\xca\xe7\xce\x56\xc1\x4e\x05\xec\x21\xc0\xde\x0b\xb0\xd5\x80\xbd\x0f\xb0\x2f\x05\x58\x3f\x60\x5f\x01\xd8\x57\x02\x6c\x1d\x60\x5f\x03\xd8\x07\x00\xb6\x01\xb0\x5f\x0b\xd8\x77\x00\xac\x7c\xef\xdb\x54\xb0\x2d\x80\xfd\x76\x15\xec\x2c\xc0\x7e\xa7\x0a\xb6\x15\xb0\x3f\xa2\x82\x6d\x03\xec\x2f\xab\x60\xe5\xf1\x5f\x53\xc1\xce\x01\x1c\x3a\xc0\x11\x0b\xb0\xed\x80\xc3\xac\x82\xed\x00\x1c\x87\x54\xb0\x9d\x40\x76\x08\xc8\x7e\x1e\x60\xbb\x80\xec\xf7\x80\xec\xbf\x00\x6c\x18\x70\x02\x70\xce\x00\xd8\x5f\x03\xce\x56\xc0\xb9\x1e\xe0\x92\x00\xe7\x36\xc0\x79\x33\xc0\x4d\x01\x9c\xb7\x00\xce\xdb\x00\xae\x09\x70\x1e\x00\x9c\x0f\x00\x5c\x0b\xe0\x7c\x08\x70\x3e\x01\x70\xf2\x75\xcf\x00\xce\x67\x01\xae\x03\x70\x8e\x00\xce\x17\x00\xae\x0b\x70\x1e\x03\x9c\x3f\x07\xb8\x85\x80\xf3\x15\xc0\x79\x1c\xe0\xba\x01\xe7\xeb\x80\xf3\x57\x00\x17\x02\x9c\xf2\xd8\x6f\x01\xdc\x62\xc0\xf9\x0e\xe0\x7c\x1f\xe0\x96\x00\xce\xd3\x80\xf3\x0b\x80\x5b\x0e\x38\xff\xaa\x82\x5b\x03\xe4\x70\x40\x8e\x06\xe0\x06\x80\x1c\x03\x90\x63\x04\xb8\x41\x20\x27\x5d\x05\xb7\x0e\xc8\xc9\x54\xc1\xad\x07\x72\xfc\x2a\xb8\x2b\x81\x9c\x1a\x15\xdc\x55\x40\x4e\x3b\x90\xb3\x02\xe0\x36\x00\x39\xab\x80\x9c\xd5\x00\x77\x13\x90\x33\xa0\x82\xdb\x03\xe4\x0c\x01\x39\x12\xc0\xed\x05\x72\x13\x80\xdc\x24\x80\xbb\x1d\xc8\x4d\x56\xc1\xdd\x0d\xe4\xe6\xaa\xe0\xee\x01\x3c\x00\x3c\x14\xe0\xee\x05\x3c\x1c\xe0\xb1\x02\xdc\x03\x80\x27\x03\xf0\x64\x01\xdc\x73\x80\xc7\x06\x78\xf2\x01\xee\x05\xc0\x33\x0d\xf0\xec\x03\xb8\x57\x00\xcf\x9d\x80\xe7\x3e\x40\x63\x01\x3c\xf2\x35\xff\x04\x34\xa9\x80\xe7\x7b\xc0\x13\x01\x34\x6b\x81\x62\x0e\x28\xce\x07\x34\xeb\x81\xe2\x62\xa0\xf8\x26\x40\x73\x27\xe0\x05\xe0\x4d\x07\x34\xff\x02\xbc\x02\xe0\xcd\x07\xb4\x16\xc0\x5b\x0c\x78\xbd\x80\x36\x13\xf0\x56\xaa\xd0\xca\xfd\x21\xc0\xbb\x09\xd0\xda\x00\xef\x56\x15\xda\xa9\x80\xf7\x21\xc0\xfb\x18\xa0\xad\x06\x44\xaa\x42\x5b\x07\x88\xf1\x2a\xb4\xf5\x80\x68\x51\xa1\x6d\x00\xc4\x64\x15\xda\x46\x40\xb4\x03\xa2\x03\xd0\x06\x00\x31\x07\x10\x73\x01\x6d\x13\x20\xba\x54\x68\x67\x02\x62\x99\x0a\x6d\x33\x20\x4e\x51\xa1\x6d\x01\xc4\xe9\x80\xd8\x04\x68\x67\x01\x62\xb3\x0a\x6d\x1b\x20\x4e\x40\x3b\x1b\x10\xe7\xab\xd0\xce\x01\xc4\x4d\x80\xb8\x05\xd0\xb6\x03\xe2\x10\x20\x5e\x07\x68\x3b\x00\x71\x27\x20\xfe\x1a\xd0\x06\x01\xf1\x6d\x40\x3c\x01\x68\x0f\x00\xe2\x29\x40\xfc\x00\xd0\xfe\x14\x10\x3f\x54\xa1\x7d\x1c\x10\x3f\x02\xc4\x8f\x01\xed\x13\x40\x33\x54\x68\x9f\x02\x9a\x9f\x57\xa1\x7d\x1a\x68\x01\x70\xff\xab\x80\xf6\x10\x70\x10\xc0\xef\x1e\x02\x3a\xd7\x01\xe7\xa0\x42\xb2\x02\xe7\x88\x0a\xe1\x21\xe0\x1c\x03\x9c\x13\x01\x29\x19\x38\x57\xa2\xa2\x32\x0c\x9c\x2b\x05\xce\x05\x01\xa9\x09\x38\xd7\xad\x42\xfb\x67\xe0\x5c\x0f\x70\x6e\x11\x20\xc9\xf7\x5c\xac\x22\xee\x75\xe0\x5c\x1f\x70\xae\x1f\x90\x36\x00\xe7\x96\xaa\xd0\x1e\x03\xce\x2d\x03\xce\x6d\x06\xa4\x6b\x80\x73\x5b\x54\xcc\x90\xbf\xb7\xaa\x90\xf6\x00\xe7\x86\x54\xc4\xff\x0d\x38\xb7\x4d\x45\x82\x1d\x38\x77\x2d\x70\x6e\x17\x20\xed\x05\xce\xed\x56\x11\x27\xcf\xe7\x7a\xe0\xdc\x8d\x80\x74\x27\x70\xee\x26\x15\xc9\x0e\xe0\xdc\xcd\xc0\xb9\x17\x01\xe9\x1e\xe0\xdc\x51\x15\x3a\x79\x1d\x3f\x03\xce\x7d\x0c\x48\x6f\x00\xe7\x3e\x51\x11\xff\x12\x70\x6e\x14\xf8\xae\x10\x90\xfe\x13\xf8\x9e\x00\xdf\xb3\xc0\x70\x25\x10\xf1\x00\x91\x62\x60\x78\x2a\x10\x11\x81\x48\x1d\x30\xec\x03\x22\xd3\x81\xc8\x6c\x60\xb8\x0d\x88\xb4\x03\x91\xf9\xc0\xf0\x02\x20\xd2\x09\x44\xfa\x81\xe1\x1e\x20\xb2\x0c\x88\xac\x04\x86\x57\x03\x91\xa8\x8a\xe1\x41\x20\x4a\x80\x68\x37\x30\x7c\x05\x10\xed\x05\xa2\xf7\x03\xc3\xef\x01\xd1\x4f\x81\xe8\x17\xc0\x0e\x23\x10\x3d\x0f\x44\xc7\x81\x1d\x49\x20\x2c\x14\x60\x47\x32\x08\x9b\xa7\x00\x3b\x52\x40\xd8\x66\x10\x39\xee\xca\x19\xe5\x89\x38\x05\xd8\x91\x01\x0d\x13\x33\x41\x32\x7f\x9c\x67\x12\xa5\xda\x8b\x89\xaa\xef\xff\xbf\x8f\x7a\x25\x05\x0b\x0e\x1a\x68\xa1\x83\x1e\x31\x88\x45\x1c\xe2\x61\x80\x11\x3c\x4c\x30\x23\x01\x16\x24\x22\x09\x56\x24\x23\x05\xa9\x48\x43\x3a\x32\x90\x89\x2c\x08\xb0\xc1\x0e\x07\xb2\xe1\x44\x0e\x72\x91\x87\x7c\x4c\x82\x0b\x05\x28\x44\x11\xdc\xf0\xa0\x18\x5e\x88\x28\x41\x29\xca\x50\x8e\x0a\x54\x62\x32\xa6\xa0\x0a\x53\x51\x0d\x1f\xfc\x98\x86\x1a\xd4\xa2\x0e\xf5\x68\x40\x23\x02\x98\x8e\x26\xcc\xc0\x4c\x34\xa3\x05\xb3\xd0\x8a\x36\xcc\xc6\x1c\xb4\x63\x2e\xe6\x61\x3e\x3a\xd0\x89\x2e\x2c\xc0\x42\x04\xd1\x8d\x1e\x84\xd0\x0b\x60\x18\x3b\xb0\x0b\xd7\xe3\x56\xdc\x81\xfb\xf0\x10\x1e\xc4\xc3\x78\x14\x8f\xe0\xa7\x78\x1c\x4f\xe2\x09\x1c\xc4\x53\x38\x84\xa7\x11\xc6\x61\x3c\x8b\xe7\xf1\x1c\x46\x70\x04\x2f\xe0\x18\x7e\x86\x9f\xe3\x25\xda\x82\x2b\xd0\x87\x25\x58\x4e\x5b\xb1\x11\x0f\x60\x2d\x56\x52\x09\x57\x61\x05\x5b\x8d\x9d\xb8\x8b\xcd\xc3\x3a\xd6\xcf\x4e\xc3\x52\x6c\x60\x93\x59\x3b\x6b\x23\x8f\xb2\xc5\x58\x85\x9f\x90\x9b\xf1\x18\x8e\x62\x1b\x16\x63\x0d\x9b\x43\x6a\xd8\x29\x6c\x1a\x56\x63\x33\x9d\x8d\x45\xb8\x16\x12\x6e\x27\x16\x92\x48\x6b\x68\x2d\x9d\x41\x67\xd2\x46\x1a\xc0\x8b\xdc\x62\x1c\x27\x93\x69\x2f\xbd\x82\x2e\xa4\xc1\xe1\xca\xe1\xc9\x74\x16\xae\xa6\xd3\x69\x33\xed\xc0\x75\xb8\x01\xdb\x71\x23\x76\xe3\x66\xec\xc1\x5e\xdc\x84\xdb\xb0\x1f\xc0\x3e\xdc\x83\x7b\x71\x37\xbe\x26\x9d\xa4\x0f\x83\x24\x44\x7a\xc9\x22\x5c\x43\x96\x90\xc5\xa4\x4b\x63\x41\x2c\x5a\xb8\x11\x58\x71\x25\x37\xc2\xbd\xfd\x43\x15\xb3\x4d\xb0\xe0\x66\x20\x7a\x46\x3e\xba\xf4\x37\x62\x89\xfc\x2f\x92\xea\xff\xfd\x47\xa7\x7e\x1d\xc4\x08\x8e\x01\x38\x35\xd1\x3c\x17\xdb\x71\x3b\xee\xc7\x66\x7c\x8e\xa7\xf1\x34\x06\x31\xa8\xb4\x1f\xc5\x6b\x38\xaa\xfc\x7a\x18\xf7\xe3\x06\xe5\xd7\x1b\x78\x03\x9b\xb1\xf9\x07\xb7\x0d\xe3\x45\xec\x56\x7e\xdd\x8d\x47\x71\x33\x36\x5c\xd6\xb7\xff\xb2\xdf\xcb\xb1\x06\x7b\xf0\x1c\x8e\x5f\x1c\x19\xe8\xc7\x00\x36\x62\x3f\x5e\xc1\x29\x39\x87\x52\x3e\x11\x32\x19\xaf\x61\x23\x22\x24\x89\xfc\xf3\xbf\x59\xca\x57\xca\xbd\x77\xe2\x69\xec\xc7\x2e\x12\x87\xfd\x44\x66\xb0\x19\xd8\xc7\x74\xe1\x5a\x2a\x8f\xfa\x98\x3a\x63\xe6\x6a\xfc\x1e\xcf\x91\x18\x80\x6c\xc7\x6a\x6c\x95\x33\x3c\x00\xab\x95\x9a\xf4\x0f\x3f\xb7\x2a\x7d\xd7\x62\xd7\xa5\x26\x6e\xe4\xfc\x3e\x98\xa2\x7f\xc5\x76\x59\x3f\xca\x75\x9b\x2e\xbb\xe2\x18\x79\x42\xce\x06\xe4\x5f\x18\x21\xbf\x23\xb7\xc9\xb3\x22\xc0\xd3\xdc\x48\xe4\x58\x64\x20\xb2\x1d\x03\xcc\x53\x17\x7c\xf8\x97\x1f\x5c\xf5\x67\xf9\xfb\xf8\x5d\xa2\x72\xc9\x6b\x73\xf4\x53\xfd\xf5\x9d\x1d\x73\xdb\xe7\xcc\x6e\x6b\x9d\xd5\xd2\x3c\x73\x46\xd3\xf4\x40\x63\x43\x7d\x5d\x6d\xcd\x34\xbf\xaf\x7a\x6a\xd5\x94\xc9\x95\x15\xe5\x65\xa5\xc5\x1e\x77\x51\x61\x41\x5e\x6e\x8e\x33\xdb\x61\xb7\x65\x25\x5b\x4c\xbc\xd1\x10\x1f\x1b\xa3\xd7\x69\x35\x1c\x4b\x19\x82\x82\x7a\x47\x43\x48\x08\xe7\x84\xc2\x6c\x8e\x23\x10\x28\x94\x8f\x1d\xbd\x42\x38\xa7\xf7\xb2\x86\x50\x58\xe8\x15\xc2\x0d\x3f\x3c\x27\x2c\x84\x94\xd3\x84\x1f\x9e\xe9\xef\x15\xc2\xfd\x3f\x3a\xd3\xaf\x9e\xe9\xbf\x78\x26\xe1\x85\x2a\x54\x15\x16\x08\xf5\x0e\x21\xfc\x76\x9d\x43\x38\x42\xba\xda\x3a\x1c\x42\xf8\xc6\x3a\x47\xa7\x10\xfe\x52\xf9\xdd\xac\xfc\x66\x73\x94\x83\xf8\x3a\x47\xa7\xcd\x56\x58\x20\x08\xf5\xc9\xcb\xea\x84\x30\x09\x09\xf5\xe1\x86\xab\x96\xed\xae\x0f\xd5\x15\x16\x90\xc3\xb1\x31\xb5\x8e\xda\x25\x31\x85\x05\x38\x1c\x13\x5b\xeb\xa8\x8d\x2d\x2c\x40\x38\xcf\xb1\xf6\x30\xc9\xab\x26\xca\x0f\x26\xaf\x7e\xf2\x61\x06\xba\x78\x79\xd8\x30\x75\xd6\xf7\xf6\x85\x5b\xdb\x3a\xea\xeb\xd2\x6c\xb6\xce\xc2\x82\xe9\x61\x83\xa3\x4e\xe9\x42\xad\x72\xcb\xb0\xa6\x36\xac\x55\x6e\x29\x2c\x97\xa7\x8e\xeb\x85\xc3\x05\xaf\xec\xbe\xe1\x08\x8f\x45\x21\x57\x5c\x9f\xa3\xaf\x77\x61\x47\x98\xf6\x76\x16\x16\xec\xa6\xf5\xbb\x77\xef\x08\x9b\x5c\xe1\x7c\x47\x5d\x38\xff\x9a\x3f\x26\x17\x16\xd4\x2f\x09\x17\x38\xea\xea\xc3\x2e\xf9\xae\x33\x66\x5f\x1c\x67\xc6\xa5\x21\x49\x98\x73\xf2\x0e\x61\xf7\x37\x08\x93\x90\xe3\xcb\x33\x3f\x6c\xe9\x9d\x68\xd1\x38\xf9\x6f\x20\xff\x6c\x70\x34\x84\x76\xef\x6e\x70\x08\x0d\xbb\x43\xbb\x7b\x8f\x44\x87\x16\x39\x04\xde\xb1\xfb\x70\x5c\xdc\xee\xb5\xf5\x21\x21\x8c\xd6\x8e\x30\xe9\x3d\x12\x3d\x7a\x7d\x5a\xb8\xe1\x86\xce\x30\x1f\x5a\x46\x26\x4f\x2c\xb6\x61\xf6\x8c\x70\x42\xdb\x82\x8e\x30\xe3\x6c\x10\x96\xf5\x86\xa9\x33\x4c\x9d\x3e\x87\xad\x22\xcd\x66\xea\xbc\x70\x4e\xeb\x7f\xd7\x8d\xb0\xb6\x36\xac\x91\x65\x6a\xb3\xc9\x0b\xbf\xfe\x88\x1f\x8b\x0a\x0b\x6c\xe1\xa1\xb6\x0e\xf5\x58\xc0\xa2\xb4\x67\xe0\x77\xbb\x3a\xc3\x4c\x48\xee\x79\xe5\x42\x4f\xe2\x5c\xb9\x67\xe8\x42\xcf\xc5\xcb\x43\x0e\x5b\x61\xc1\x8c\x39\x1d\xbb\xc3\xac\x73\x7a\x9f\xa3\x7e\x79\xd8\x7f\x7d\x6f\x78\x68\x51\x58\xe8\x5d\x21\xab\xc2\xc1\x87\x0d\xff\x4c\xb3\x39\x76\x9b\x4d\x42\xa5\xbb\x53\x39\x57\x08\x53\xe7\xf4\xbe\xe5\x42\x98\xcb\x09\x6b\xe4\xab\x2e\xbf\x20\xcc\xe6\xc8\x97\xec\xe6\x95\x03\xc3\x3f\xd5\xaf\x2f\xd3\x76\x87\xd9\x1c\x93\x59\xa8\x74\x08\x95\x6e\xf9\x3e\xf5\x8e\xfa\xd0\xc4\x7f\x57\x2d\x4b\x0e\x0f\x2d\x12\x0a\x0b\xc2\x01\x97\xaa\xfa\xf6\x8e\xb0\xbf\x4e\xa8\x0f\xfb\x7b\x27\x74\x54\x7f\xd8\xe3\xae\x77\xd4\xf7\x86\xc2\x24\xb4\xbc\x4e\x51\x5f\xd8\xed\x58\x1b\xb6\x38\x6a\x2e\xea\x53\x9e\x56\xfd\xf2\x39\x1d\xca\x25\x13\x97\x85\x2d\xb5\x61\x84\x16\x4f\x5c\x15\x76\xd7\xd7\xc9\x23\x0b\xf5\xbb\x43\x75\xea\x14\xe4\x7b\x39\xda\x3a\x5e\x84\x18\xfd\xf4\x70\x89\x90\xf6\xac\xbc\x8f\x76\xd6\xc9\x27\x27\xd5\x76\x84\x69\x4e\xfd\xee\x8e\xbe\xfe\x70\x56\x28\xad\x2f\x2c\x84\xfa\x85\x8e\x34\x5b\xd8\xdf\x19\x26\xbd\x9d\x8e\x8e\x25\x9d\xb2\xa1\x39\xf8\x70\xfe\xa7\x69\x36\xf9\xd3\x59\x58\x10\x66\x6a\xdb\x3b\x66\xcc\x71\xcc\x68\xeb\xea\xa8\x98\x98\x88\xda\x21\xdf\x8e\x75\xd6\xff\xe8\x36\x8e\x8e\x34\xf5\x36\x61\xce\x19\xd6\x39\x75\x42\x07\x93\x46\x3b\xc3\xac\x93\x0f\x73\x4e\xa1\x21\xcc\x3a\x1d\x35\x55\x61\xd6\x19\xd6\x3a\x75\x61\xad\x93\x0f\x6b\xd4\x56\xd9\x54\x6b\xaa\x84\x0e\x92\x86\x0b\x67\x87\xf3\x3f\x0d\xe7\x0b\xf5\x4b\xea\x26\xce\x93\x8f\x7f\x70\x53\x4e\x36\xa7\xda\xc0\x85\xbb\x69\xe4\xc3\x30\x09\xd5\x06\xd2\x6c\x9d\x36\xf5\x53\x58\xc0\x84\x59\xa7\x30\x31\x70\x98\x73\xea\x64\xa1\x06\x2e\x74\x51\xa7\x10\x66\x9d\xba\x30\xe3\xac\x0d\x28\x4d\xb2\x2c\x93\x65\x9b\x17\x3a\x1c\x4b\x1c\x9d\x8e\x65\x42\xd8\xdf\xda\x21\xaf\x4d\x16\x8f\x22\xe5\x09\x61\x28\x32\x9f\xd0\x55\xfb\x0f\x8e\x2e\x13\x56\x61\x41\x18\xb6\x19\xed\x17\x0f\x64\x61\x86\x1b\x5c\x69\x97\x0b\x37\xdc\xa8\x1c\x5f\x3c\x0c\xfc\xa8\x7b\xfa\x85\x6e\x61\xb7\xce\x31\x63\xce\x6e\xf9\xe6\x8e\x89\x1b\x22\xcc\x38\xa7\x87\x21\x9b\xb0\xbf\xc2\x94\xa6\x78\xbf\xec\xcf\x8e\x86\x5e\x87\xc0\x0b\x0d\xaa\x3f\xef\x3e\xec\xf7\xcb\xbe\xbc\x4c\x76\xdb\xdd\x8e\xe9\x7d\xbb\x1d\x73\x3a\xaa\x94\xb3\x67\xcc\xee\xd8\x9c\x76\x8d\x3c\x96\x19\x33\xc8\x8c\xf6\x9a\xc2\x82\xc3\x0c\x6a\x0e\x3b\xc8\xce\xb6\xc3\x7e\xb2\x73\x4e\x57\xc7\x8b\x3c\x20\xec\x6c\xef\x78\x86\x21\x4c\x6d\xa8\xa6\xf3\x70\x36\xd9\xd9\xd6\xf1\xa2\x00\xf8\x95\x56\x46\x6e\x95\x1b\xe5\x03\x41\x3e\x90\xef\x34\xbb\xe3\x19\x46\xa7\x9c\x9f\xf6\xa2\x1f\x18\x52\x7a\x59\xa5\x41\x39\x5e\x7c\x84\x40\x69\xd3\x5d\x68\x23\x58\x7c\x84\x51\xdb\xf8\x0b\x6d\x0c\x16\x1f\x61\xd5\x36\xbf\xd2\x26\x7f\x0a\x0b\xea\x93\x97\x39\x66\xc8\xf1\xbb\x5e\xe8\x93\xf5\xf3\x93\xce\x65\xbb\x43\x9d\xb2\x8d\x23\x29\xcc\x38\xc3\x8c\x93\x84\x89\xa3\x1a\x61\xc6\x51\x7d\x98\x30\x9a\xb8\x70\x8c\x63\x49\x4d\x38\xd6\x51\x23\xb7\xfb\xe4\x76\x9f\xda\xae\x91\xdb\xb5\x8e\x9a\x30\x49\x22\x85\x05\xd7\xec\xe6\xeb\x1d\xdf\x24\x17\x2a\x24\x98\x03\x13\x8d\x4e\x3c\x44\x8e\x03\x90\xa4\xb4\x12\xe0\xf8\x35\x20\x4a\x2d\x50\x26\xca\x0c\xd3\x01\x70\x8f\x71\x47\x40\xa1\x05\x88\xcd\x64\x2b\xb7\x99\x6c\x4c\x07\x6d\x3d\x1f\x5e\xc6\x6c\x1c\xdf\xc9\x1d\xf9\x2e\xb0\x8c\xfd\xb3\x72\xfe\xad\xd1\xcf\xc8\x5e\x6e\x04\x14\x56\x4c\x7e\x11\x24\x7a\xd6\x9f\x10\x63\x09\xf0\x29\x43\x29\x7b\x52\x0e\xa4\xb0\xd4\x70\x17\xcb\x30\xec\x91\xe8\x2b\xfe\x18\x6d\x4c\x80\x25\xfa\xbb\x13\x18\x0a\x9f\xfb\x9b\x77\x88\xdb\x25\xba\xf9\x31\x6f\xb0\xd8\xe3\x22\x0e\x2a\xd2\x92\x6a\x46\xf4\x66\x32\x89\x16\x03\xe3\xb0\x17\x31\xa4\xf5\x6a\x71\xf4\xac\xc5\x5e\x94\x96\xea\xb6\x5b\x2c\x76\x77\x6a\x5a\x91\xdd\x42\xee\x63\x93\xbf\x7b\x31\xa7\xd4\x66\x34\xda\x4a\x73\x9c\xa5\x76\x9e\xb7\x97\x2a\x2c\x04\x12\x7d\x94\x79\x46\x99\x8b\x16\xe5\x7e\x07\x7b\x87\x56\xab\x7f\x4f\xff\xa9\x9e\x71\xeb\x07\xf4\x5b\xf5\x14\x77\x80\xf2\xf4\x53\x7a\x96\xb2\x54\xc3\x30\x5a\x4a\xe1\x13\x45\xb7\x48\xdc\xc1\xb1\x60\xd0\x5c\xe9\x1e\x2b\xf6\x10\xea\xa0\x36\xea\xa0\xa4\x29\x7f\x5d\x3e\x53\x98\x7f\x45\x3e\x37\x32\x7e\x96\xe1\x65\xc8\x63\x88\x00\xfb\x2d\x37\x82\x34\x64\xe1\x4e\x7f\x07\xa5\xa9\xa9\xc9\x49\x99\x19\x5a\x56\x63\xb5\x6a\xe4\x2c\x85\xe5\x0e\x27\x27\xdb\x12\xb3\xd2\x75\xac\xde\x62\x31\x1b\x0d\xb1\x6c\xc2\xe1\x98\x56\x9e\xf0\x7c\x5c\x9c\xbe\x35\x86\xc4\xa4\x93\x40\x3c\x89\x7f\x3a\x4e\xc7\xc6\x65\x81\x7f\xda\x94\x92\x68\xf2\x99\x66\x99\x46\x4d\x34\xce\x14\x67\xe2\xac\x09\x9a\x18\x0e\x6e\xd1\x27\x9a\x2b\x2b\xdd\xee\xa0\x49\x14\xf9\x31\xaf\x57\xf9\x0a\x7a\xbd\xc4\x1d\x94\xe7\xec\x0e\xf2\x7f\xb4\x56\x7a\x4d\x66\x6b\xa5\x49\x74\xcb\x3f\xc5\x89\xdf\xa2\x5b\x5e\x85\x2d\xd1\x46\x1d\x09\x0a\x4a\x6d\x0a\x44\xaa\x20\x91\xd8\x12\x6c\xf4\x77\x3e\x92\x1c\x79\x7b\xf6\xad\xed\x91\x8f\x67\xef\x69\x89\x44\x48\xc6\xb4\xc8\x57\xc4\x35\xfb\xd6\xd9\xc4\xd9\xbe\xa7\x9d\x68\xce\xff\x17\x71\xf8\x23\x1f\xd3\xcd\x91\x23\xbb\x22\xed\xe4\xa0\x8c\x5d\x24\xb0\x8b\x84\x23\xad\x32\x76\x45\x8e\x90\x00\x28\x36\x45\x77\xd1\xdf\x6b\xcc\x28\x44\x19\x7c\x78\xce\x2f\x96\xb8\xf3\x49\xbe\xdb\x46\x6c\x9a\xb5\xee\x2a\x52\xe5\xce\x24\x99\x09\x82\x96\x68\xb5\xf1\x45\x6b\xb2\x8d\xc8\x02\x13\x55\x92\x35\x2d\xa6\xc5\xc7\x97\xaf\xf9\x34\x85\xa4\xc8\xc6\xe1\xd1\xc5\x06\x52\x44\x8b\x25\xbf\xaa\x2a\xa1\xa8\x5c\x37\x35\x6f\x9d\xcd\x69\xcb\xf2\x1b\x4c\x81\xac\xac\xcc\x56\x1b\x31\xda\xb2\x6c\x8c\xce\x56\x92\xb0\x4e\x67\xd0\x69\x34\x9c\xee\x48\xf4\x95\x67\x63\xe2\x03\x3a\xb8\x5d\xa2\xe8\x36\xc9\x32\x72\x77\x07\x65\xd9\xb8\x94\x03\x73\x65\xa5\xb9\xd2\x24\x8a\x26\x91\xb8\x5d\xc1\x31\xd1\xcd\x7f\xd0\x1d\x0c\x0e\x7a\xc7\x4c\x95\xb2\x04\x83\x62\x70\xcc\x1b\xf4\x06\xbd\xc5\x1e\x62\x31\x30\xda\x44\x47\xa9\xbd\x88\xc9\x2d\xcd\xa4\xa2\xa9\x88\x96\x96\x54\x33\xe5\xa5\x62\x62\x26\xb1\x6a\x8b\x48\xae\x29\x93\x6a\x4b\x8a\x98\x5c\x53\x35\x21\x96\x4c\xc6\x6a\x32\x10\xfa\x7b\x6f\x50\x6a\xdf\xed\xed\x0f\xb5\x0b\xb6\xf9\xa1\x25\xee\xce\xed\xf3\x26\x15\x2f\xd8\x36\x6b\x77\xdf\xe3\xb5\x35\x15\x37\x34\x75\xec\x58\x50\x14\xb6\xb8\x1a\xc4\xe0\x82\x88\xd9\x94\x57\x53\xdc\x39\x87\xbc\xd4\x70\x45\x7b\x79\xdc\x17\x1f\xeb\xcd\xa9\xa6\x83\xbc\x2d\xd5\x44\x9e\xc9\xac\x99\xbb\xa6\xa9\x76\x60\x4e\xa9\xfe\xb9\x30\x37\x29\x6b\x6f\x4a\xbe\x26\xd2\x95\x55\x33\x67\x65\xc0\x56\x5e\x98\x63\x8e\x5c\x6f\x58\xc4\x3c\x94\x5d\xe9\xce\x31\x91\x41\xbe\x53\xe1\xcb\xe8\x8f\x9e\xd1\x88\xdc\x5b\xd0\x23\x03\xb9\x98\x02\x1f\x82\xcf\x54\xf1\xd5\x47\xa2\x67\xfd\x62\x55\x75\x55\x75\x9e\x25\xf3\x39\xef\xf3\x8e\xe7\xf2\xa6\x19\xa7\x11\xee\xb9\x98\xe7\xf1\x1c\x6f\x11\x2c\x1e\x0b\xb5\xf8\x34\xd5\xc9\xce\x91\xf2\x17\x6c\x23\x85\x29\x74\xc4\xf8\x82\x76\x24\x45\x0b\xdf\xd8\x3f\xc6\x14\xf8\x64\x4f\xf8\xc7\x58\x90\xff\x64\xec\x1f\x63\x26\xc5\xfc\x2a\x2a\x8a\x3d\x09\x96\x24\xd1\x6b\xe2\x1d\x76\x0d\x37\xe1\x9a\xa5\x13\xae\x4a\xfe\xdb\x1e\x3d\x71\x90\xef\x1a\x5b\xef\xb9\xa7\xb5\x91\xbc\x91\xdd\xb4\x6e\xd6\xf4\xb5\x33\x73\x1c\xd3\x07\x5b\x66\x0c\x36\xe7\x92\x83\x13\x3d\xaf\x3b\x9a\xd6\xcd\x6a\x5a\x3b\x63\xa2\x67\x66\x6e\x14\xe7\x4f\xdd\x47\x0b\x58\xe6\x91\x47\x48\x13\x09\x3c\xf4\xc8\xaa\x83\x57\xf9\x7c\x57\x1d\x5c\xb5\xea\x89\x2b\xab\xab\xaf\x7c\x62\xbc\xe9\x91\x87\xc9\x74\xa5\xe3\x49\xb9\xe3\xc9\x0b\x1d\xf4\x96\xef\x9a\xb8\x11\x28\x69\xfc\xea\xe8\x19\x6e\x33\xf7\x36\x4c\xb0\x61\x0e\x86\xfc\xcd\xb9\xc9\xd6\x26\x76\x7a\xc1\xf4\x40\x4c\x63\xd9\xb4\xc6\x1a\xa1\x86\x94\xd5\x94\xd5\x64\x70\x53\xaa\x1a\xd9\x00\x1a\x51\xc0\x17\x30\xba\x82\x02\xbb\x10\x20\x81\xb9\x19\x01\xde\x2e\xd8\x19\xfb\xb4\x69\xc5\xe6\xb6\x59\x49\xca\xb5\xc6\xc6\xaa\x29\x1c\x5b\x3c\x3d\xd1\xd8\x5a\x0c\xf7\x98\xcf\x6c\xad\x34\x5b\x2b\x7d\xb2\x2d\xc9\x22\xe3\x5f\x0f\x9a\x2a\xdd\xdd\xc1\x31\x93\xb5\x52\x75\x5a\x7e\x8c\x1f\x33\x29\x1e\x29\xdb\x57\x26\x63\xad\xa6\xa5\x25\x45\x8c\xc3\xae\x49\xf0\x56\x33\xe5\xc4\x40\x13\x2d\x99\x8c\x53\x36\x33\xd5\xda\x2e\x04\x3e\x2d\xa9\xa6\xe5\xa2\x81\x6a\x89\x23\xd7\x40\x95\x30\xf8\x28\x6f\x2b\xc9\x9e\x32\xaf\x22\x3d\xc5\x5d\x33\x69\x5e\xdf\x8e\xc9\x8b\xda\x03\x42\x64\x73\x49\x6b\x79\xba\xa3\x26\x14\xd9\x9c\xd7\x3c\xd0\x98\x55\x55\x98\xee\xed\xde\xdd\x31\x67\xfb\x02\x8f\xb7\x7d\x75\x15\x09\xa5\xb9\xec\x69\x31\x47\x8c\xf9\xa5\xd3\x72\x49\xe2\xd8\x63\xc5\xa1\x55\x3f\x69\x59\xfe\xd3\x75\x53\xd9\x1b\xed\xd3\xa6\xd5\x3a\x1d\xd5\xfe\x86\xfc\xec\xa9\x05\x29\x9d\xdf\x1f\xb2\xe6\x95\x65\x91\xdb\x6d\xbe\xc0\xdc\x8a\xb2\x05\xd3\xb2\xcf\xb6\x5c\xd3\x37\x6f\x52\x76\xf3\xfc\xc5\x95\x33\x36\xcc\x71\xb9\xe6\x6c\x98\xe1\x5f\x1d\x9c\x95\x1d\xb9\x21\xa3\xaa\xae\xc5\x5d\x33\xb0\x68\x6e\x7e\xe4\xa3\x83\x85\x8d\xc5\x69\xa5\x4b\x6f\x03\x91\xe3\x2e\x69\x52\xe2\xee\x24\x7f\xfa\x2b\xdc\x7b\xdc\xa7\x1c\x75\x73\x03\x1c\x73\x79\xc0\x65\x18\x25\xdc\xba\xd5\x60\xab\x06\x5a\x25\xc8\xaa\xf1\x55\x4e\xe0\x66\x47\x8e\x31\x2e\x6e\x04\x09\x48\xf5\xc7\x6b\x0c\x7f\xd7\x9f\xf5\x81\xc0\x70\x8e\xfb\x16\xaa\x69\xfe\xd1\x5b\xec\x49\x90\x65\x26\x6a\x18\x59\x7e\x56\x47\x11\x9d\x9d\xdd\x34\xd8\x72\xf0\x86\xbd\xce\xc6\x15\xf5\x4f\xb4\x0c\x36\x65\x33\xc5\x9b\xbf\xfe\xfc\x44\xf0\x78\xc4\xfb\x8f\x0d\x67\x4e\x9f\xec\xee\x7a\x67\xec\x2c\x94\x04\x71\x6a\xe4\x18\x63\x55\xee\x9f\xee\x37\x68\x0c\x7f\x8f\x3d\x1b\x06\x41\xa2\xe1\x5b\xee\x9c\x3c\x00\xff\x89\x3a\x82\x12\x0f\x1c\xb2\xc2\x98\x5c\x31\x93\x32\xd6\xec\x19\x83\x2d\x4f\xd4\xaf\x08\x64\xef\xb9\xf1\x60\xcb\xe0\x8c\x6c\xa6\xf8\x27\x67\xc7\xde\xe9\xea\x3e\x79\xfa\xcc\x86\x7f\x90\x77\x8e\x07\x4f\x7c\xfe\xb5\x32\x7f\x66\x03\x6b\xd1\x58\x60\x40\xb6\x3f\x31\x8b\x27\xb8\x03\x86\x21\xc3\x1e\x03\xd5\x19\xb2\x34\x44\xa3\x01\xe0\xf3\xba\x83\xc4\xdd\x1d\xfc\x5c\x91\x80\xd3\xca\x25\x68\x63\x49\x6e\x82\xb3\x9c\xa3\xcc\x1d\x2e\x72\x63\x6a\x64\xf8\x9b\x67\xc2\xf7\x1d\xf9\x7b\x64\x57\x06\xd9\xe1\xd2\x58\x22\x1b\x06\x8e\xa7\x47\x8e\x86\x48\x7f\xe4\xae\x10\x69\x48\x3f\x3e\x40\x76\xc9\x63\xf5\x13\x0d\xcb\xb0\x0f\x22\x16\xf9\xfe\x64\x3e\x9e\x68\xf4\x4f\xd0\xbf\x82\x08\x08\xe1\x00\x28\xf4\x78\x4a\x43\x9f\x85\x4f\x1c\x93\x37\x8c\xa0\x57\xd9\x65\x89\xad\xd4\x66\x12\x4d\xb6\x44\x9b\xc9\x41\xfe\x12\xd9\x4c\xb6\xef\x27\xdb\x23\x9b\xf7\x33\x3b\xf6\x13\x29\xb2\x69\x7f\x64\xab\x2a\x27\x5f\xe4\x5b\x72\x35\xbe\x42\x1c\x2a\xfc\x96\x77\x0d\x84\x37\xec\x31\x1c\x30\xd0\xb4\x38\x57\x1c\x13\x47\x6e\xd7\x68\xe5\x80\x1d\xcf\x5b\x02\x3d\x5a\xc2\x6b\x89\x56\x73\x4f\x1c\xdc\x5f\xca\xe3\xb8\xc4\x2f\xbd\x41\x59\xbb\x4e\xab\x81\xca\x32\x2c\x27\x2b\x8c\x86\x5c\xb7\x98\xb2\xdb\x98\x91\x96\xa4\xfb\xca\x5a\x76\xcd\x4f\x36\x55\x4c\xbd\x6e\xfb\xe6\x52\x75\xac\xd9\xe4\x7d\xa6\x86\xb9\x1a\x14\x89\x7e\x3d\xc3\xc9\xa4\x09\x2f\x12\xb8\xc7\x88\x3b\xc8\xbf\x53\xec\x49\x28\xb5\x25\xce\x26\x67\xc9\xfb\x8f\x3d\xa6\x9c\xaf\xf0\x0d\x7c\x87\x04\x94\xfa\xd3\x86\x12\xf7\x24\x1e\x48\xa4\xa6\x44\x12\xb3\xff\x15\xbc\x07\xa6\x04\x75\xe8\xc3\x7a\xb0\x38\x12\x7d\x65\x44\x1b\x13\x00\x77\xb7\x51\x99\x9b\x2b\x18\xfc\x52\x9e\x58\xf9\x8f\x48\xc6\xad\x3f\xe6\x17\x03\x3f\xa6\x16\x04\x16\x80\xf9\x93\x62\xdf\x99\x87\x09\x23\x87\x59\x3d\x43\xc1\x83\x23\x90\x99\x8c\x89\x88\x15\x5e\x77\x85\x58\xec\x91\x83\x1e\xf3\xa7\xf1\x4f\x9f\x65\x6c\xdc\xc8\x85\x78\xc4\x60\x51\xf4\x0c\xab\xe3\xde\x46\x02\x72\x91\xe3\x4f\xcc\x1c\x40\x3e\x9f\x4f\x2c\x03\x42\x0c\x89\x71\xac\x33\x6a\x53\xd6\x71\x29\xf0\x8d\xf9\xc6\x14\xdf\xe0\x3f\x91\x69\x88\x85\x31\x10\x87\xbd\x88\x30\xa5\x25\xe6\x6a\x22\x7a\x33\x89\x99\xb3\x64\x32\xa2\xb7\x9a\x51\x03\x89\x81\x61\x75\xe2\xe0\x33\x5b\xaf\x3a\xb4\xae\x52\x1c\x38\xbc\x65\x43\x78\xfd\xe4\xf1\x84\xcc\x9a\x95\xcd\xcd\xab\xea\xb3\xb2\xea\x57\x35\x37\xaf\xac\xc9\x64\x3e\x3e\x1c\xf9\xf3\x2f\xfa\xfb\x7f\x41\x92\x0f\x1f\x26\xc9\xc7\xfb\x97\x1c\x8f\xfc\xf9\x99\xfd\x9f\xde\x36\xa3\x69\xdf\xd8\xed\xfb\x3f\xdd\xd7\xd4\xb4\xef\x53\x59\xae\xcf\x00\xcc\x1b\xdc\x08\x78\x94\xfa\x6d\x7e\x33\x31\x12\x83\x01\x6b\x5e\x26\x51\xc2\x6c\x21\x04\x84\x27\x02\xf1\x13\x56\x43\xe2\x8d\x1a\x24\xc3\xe7\x7b\x5b\x36\xe3\xa0\xbc\xb1\x9a\xc4\x60\xb1\xc7\xe6\x30\xc9\x8e\x69\xa0\x46\x92\x4b\x44\xe6\x8d\x30\xa1\x94\x98\x52\xd3\x32\x13\xf7\x85\xc8\xd6\xfd\x74\xaf\x6b\x51\x6f\xa7\xdd\x9c\x9a\x9c\x66\xbe\x7a\x13\x71\x29\xba\x0c\x01\xf4\x2c\xf7\x16\x1c\xa8\xf2\x0b\x0e\xdd\x40\x5a\x9a\x93\x77\x12\xfb\x00\xb1\x11\x93\x49\x20\x84\xe8\xec\x7c\xfc\xba\x24\x2d\x63\x5f\x4f\x92\xe1\x1b\xf3\xfa\xc6\x44\x73\xa5\x4c\x80\xe4\xfd\xfe\xcb\xa0\x49\x74\x8f\x89\xc5\x9e\x7c\x52\x4a\x2e\x86\x57\x6d\x6e\x35\xbd\x14\x4b\x13\x6d\xf4\xec\xf9\xb5\xa4\x7b\xc6\x55\x73\x0a\xec\xbe\x79\xa5\x3d\x77\xd6\xf7\xe7\x2d\x5c\x71\xd5\xb4\xd0\xdd\xab\xa6\x94\x06\xb7\xcd\x88\xfc\x89\x39\x7c\x0f\xd9\xdc\x36\x3c\xb4\x6d\xe6\x94\x2e\x9f\xd0\x5c\xb5\x21\xdb\x57\x94\x56\xb6\x64\xef\x82\xb9\x77\xdd\xb6\xbf\x2d\x72\x4a\x37\x61\xa7\xd1\x33\xf4\x2b\xee\x2d\x54\x22\xe8\x8f\xb5\x79\x6c\x1e\x73\xea\x80\x3e\x77\x40\xb6\x33\x7f\x9e\xc5\x1a\x00\xf4\x53\x84\x29\x64\x96\x99\x98\x35\xc2\xba\x27\x6d\xe4\x6a\x1b\x89\xb5\x11\x9d\xcd\x96\xe8\x2e\x58\x57\xaa\x4d\x5c\x67\x36\xa4\xc8\xfe\xa8\xac\x41\x15\x9d\xbc\x94\x20\xff\x8e\xd7\xed\x92\x77\x0b\x79\xdf\xb8\x40\x46\x32\x89\x6a\x9f\x39\xb9\xa5\x99\xe4\x82\xce\x5d\xa4\xf4\x92\xfa\x2f\x2e\x94\x1e\x2f\x9a\xb3\xbe\xf1\xf0\x91\x69\xd7\xfd\x7a\xf7\xea\xe3\x73\xe7\xbf\x15\x5c\x38\x3c\x3f\xbf\x74\xd1\x8d\x9d\x92\xd4\xb6\x65\x6e\x41\x76\xcd\xc2\x8a\x95\x0f\x35\x2d\xcc\x09\xae\xd9\xdc\xb0\xea\xa1\x35\x15\x6c\x68\xfa\xc6\x8e\xca\x38\x4d\xd2\xf3\x7b\x43\x07\xd6\xfb\xed\x85\x4f\x14\x79\xf3\x9a\x56\xd5\xd6\xf5\xfa\x32\x6f\xcf\x6b\xea\x9f\x5a\x32\xbb\x32\xb3\xb6\x6c\x73\x56\x59\x7e\x72\x59\xaf\x04\x06\x56\x80\xf5\x71\x2f\x21\x06\xc9\x68\xf1\x17\xe8\xe7\xc9\x4e\xca\xac\x31\xc5\xc5\x6a\x05\x4a\x28\x4d\xe5\x53\xc9\x86\xe4\x1d\xc9\x4c\x72\x0f\x47\x38\xbd\x26\x79\x3d\xe1\x38\xc6\xa4\xd5\x30\xb2\xa1\xc8\xcb\x15\xc7\x54\xe2\xaa\xb0\xec\xa0\x28\x8a\xe2\x98\xd7\xad\x70\x2f\x87\xc9\x61\xb2\x95\x12\xd1\x24\xda\x14\x03\x72\xc8\x5b\x1f\xeb\x3b\x15\x1e\x0f\x32\xb7\x1f\x3b\x15\xd9\x44\x59\x8e\xe8\xb5\x89\x29\xa9\xb1\x91\x25\x24\x20\xb3\xce\xfb\xe9\xef\xce\x7b\x48\x5f\xc5\xa6\x2b\xfb\xed\x96\xe2\xe2\x22\x7e\xfc\x80\xaa\xa3\xed\xd1\x33\xf4\x9f\xdc\x08\x26\xa1\xc5\x9f\x9c\x93\x3a\xc0\x15\xf0\x05\x24\x37\x3b\x3b\x6f\x99\x83\x74\x3a\x88\xc3\x71\xd6\x48\x8c\xb2\xc2\xcc\xba\xd8\x80\x31\x63\x1d\x90\x98\xbb\x3e\x5b\x93\xb8\x8e\x8f\x99\x50\x8d\x9c\x03\xc8\xb1\x42\x74\xcb\x4c\xd2\x24\xca\xce\x28\x16\x7b\xc8\x65\x01\x43\xa1\x88\x8a\x1a\x72\x64\x27\xd4\xe6\x26\xc8\x54\xbb\x9a\x30\xb6\xc5\x4f\x6e\x0d\xd4\x0d\xbf\x36\x24\x2e\x5e\x30\xdb\x66\xeb\x5c\xb4\x78\xd2\xac\x9f\xcc\x2b\x0a\x3f\x96\xe6\xf3\x55\x26\x76\x95\x33\xcf\x8c\x9f\xc9\x15\x96\xd3\x6d\xe5\xab\x0e\x2c\xbf\x62\x64\x4b\x6d\x4c\x42\xa6\xe5\xa0\x35\x3b\x39\xde\xd9\x72\x55\xdb\xcd\xb7\x73\x3a\x3d\x5b\xc9\x84\x1f\x8d\x04\x35\x06\x35\x6e\x0c\x46\xcf\xb0\x31\xdc\x5b\x70\xc1\x87\x72\xbf\x50\xbc\x26\xce\x3e\x8d\x9f\x46\xac\x53\x06\x00\x1e\x02\x28\xca\xae\xcc\xc8\xd0\x16\xac\xcb\x4d\xe1\xd7\x69\xb5\x4a\x08\x31\x29\x2b\x90\xb9\x2d\xff\x89\x77\x4c\xd9\x2e\x59\xd9\x4c\xac\x89\x45\xc4\x61\x37\xb0\x5a\xf1\x92\x7f\x28\xec\xe2\xb2\x80\x22\x6f\xa9\x83\x89\xa5\x0b\x6f\x7a\x5d\x4a\x28\x72\xbb\x4c\x8e\x0e\x57\xd7\xae\xbe\xda\x49\x16\x1a\x67\xa9\x9c\xd9\x33\xa5\xe7\xae\x55\x53\xaa\xd7\x3f\xdc\xdf\x77\x68\xa8\x89\x7c\x54\xb5\x38\x90\x6b\xab\x59\x5c\x53\x3b\xd0\xe2\x72\x4e\x5f\xc3\x0c\x2e\x7f\xef\xe5\x87\xaf\xae\x67\x38\x2d\x77\x77\x5c\x9c\xab\x65\xd5\xf6\x7d\xad\xd9\xbe\xc2\xd4\x29\x57\x3c\xb2\xe2\x8a\x91\xad\x75\x2d\x07\xfe\x1e\x79\x31\x7f\xce\xd6\xf9\x0d\x03\x2d\x93\xdc\x33\x42\x9e\x5a\x69\x45\xad\xa2\xb7\x2e\x80\xd5\x70\x23\xd0\xc0\x75\x58\x03\x39\xbe\x9a\x00\x86\x70\x3a\x5e\x47\x18\x8e\x59\x4f\xd5\x88\xa3\x6c\x65\xfc\x3b\x5e\x53\xa5\x12\x6c\x6d\xf2\x76\x96\x48\x48\x0a\x23\x8e\x1b\xe8\xc1\xf1\x53\x1c\xff\xe8\xde\xef\x3e\x02\xc5\x8a\xe8\x19\x16\xdc\xdb\xc8\xc5\x64\x34\x61\xc8\x3f\x27\xd3\xe1\x5d\x63\x8c\xc9\x0b\xac\x79\x95\x3b\xc1\x31\xcf\x73\x84\xe3\x8c\x33\xf9\x99\x24\x6f\x4d\x4a\xf5\x9a\x53\x0e\xf2\x1b\x07\x39\x2a\xdb\x07\x9f\x22\xa4\x30\x29\x31\x99\xcb\x2a\xee\xa8\x60\x3a\x2b\x48\x5e\x45\x45\x45\xa0\x82\x56\xdc\x5a\x4b\x72\x6a\xe7\xd5\x32\xb5\xb5\x28\x5c\x67\x49\x99\xb2\x0e\x17\x85\x1d\x0c\x1e\x0f\x06\x83\x95\x6a\x54\x92\x9d\x9a\x1f\x53\x5c\x3a\x18\x1c\x33\x57\xca\x5e\x7d\xc9\x7a\xb4\x99\x34\xf1\x32\x96\x3c\x41\xfc\xe8\x65\x51\xdd\x4d\x0c\x84\xd8\x35\x89\x17\x08\x63\x0e\x53\xda\x7e\xdb\x60\x4d\x5e\x43\xa8\x62\xf2\xc0\xfc\xd2\xda\xab\x1f\xef\x5f\xf3\xe4\x95\x53\x0b\x67\x2e\x9b\x5c\x3c\xcf\xe7\xac\xbd\xe2\xb6\x37\x84\xba\x65\x81\x86\x95\x81\xec\xdc\xe9\xfd\xbe\xcc\x2d\x43\x24\x69\xc5\x66\x47\xf5\x7c\xd1\x33\xd7\x97\xbd\x85\x7b\xbb\xa0\xe3\xba\x8e\xda\x55\xf3\xeb\xd3\xb3\x66\xf6\x5c\x35\x7d\xe1\x6d\xcb\x2a\xca\x96\xdc\xb2\x70\xc6\xc6\x50\x53\x7a\xd6\xf4\xae\xd5\x35\xf3\xb7\x77\x14\x7c\xff\x68\x69\xa7\xcf\xe1\x98\xb6\xb0\xa2\xa4\x3d\xe0\xcf\x32\x54\xdd\x4d\xdb\x57\x2c\xa9\x9c\xed\x17\x93\x93\x4a\x6a\xda\xcb\x96\xac\x90\x6d\x51\x96\x29\xcb\xbd\x85\x7c\x4c\x45\xa9\x3f\xb3\x32\x71\x00\x3e\xde\x47\xdc\x6b\xe2\x78\x41\x10\x18\xa1\xe4\xca\xb4\x34\xed\xa4\x75\x4e\x2d\x7f\xa5\x36\xf5\x72\x4b\x14\x95\x1d\x4d\xa5\x55\xec\x84\x03\x29\x21\x4d\x76\xf5\x1f\xe4\x12\x13\x16\x78\x41\x18\x2c\x7b\xc1\x14\x8b\x0a\x64\x53\xdc\xf1\x74\xbf\x8b\x8b\xb7\x54\xcc\x0c\x29\x86\xe8\x5b\xf7\x48\xff\x92\xa7\x87\x9a\x22\xce\x0b\x86\x58\xb7\x46\x31\x44\xda\xb0\xfc\xfd\x97\x1e\xd9\x58\xcf\x70\x1a\xee\x9e\xf8\xb8\xee\x07\x3e\xd8\x90\x5d\x5d\xa4\x9a\xe1\x0b\xb2\x19\x7e\x4d\x1a\xf3\xda\x2f\x37\xc3\x95\x35\xb8\x54\xcb\x60\xfb\x95\x7d\xba\xda\x9f\xce\xe7\x0f\xe5\xef\xc9\x3f\x90\xcf\x66\xc6\xec\xb7\xfc\x3b\xbd\xf0\xc7\xca\xfc\xc2\x71\x77\x0a\xaf\x72\x0c\x9f\xca\x32\xc4\xcf\xbd\xff\x07\x9a\x61\xfa\x9f\x68\xc7\xff\x44\x43\xe8\xde\xdc\x52\x9b\xc1\x60\x2b\xcd\x75\x96\xc8\x0d\x25\x60\x14\x9e\x26\xcf\x37\x0e\x02\x7a\xfd\x6e\xde\x3e\x64\xdf\x63\x3f\x60\x67\xad\xfb\x5f\x89\x7f\x2f\x9e\xe9\x8b\x5f\x1f\xcf\xb4\xc6\x93\xba\x78\x32\x25\x9e\x64\xc5\xbb\xe3\x99\xf8\xf8\x1f\x92\x38\xd3\x25\x12\x97\x7e\xb7\x99\x57\x89\x9c\xef\x12\x95\x53\x4c\x3a\x18\x54\xe8\xea\x45\x4a\xf7\x6f\x75\x9a\x1f\x50\x3c\xd3\x8f\x57\x72\x39\xe7\x63\xbe\xfc\xf1\x2a\x14\x2e\x8b\xaf\x58\x86\xfd\x18\x1a\xb4\xf8\x3d\xd0\xf9\x75\xc4\x4f\x08\x61\x08\xc7\x51\xcd\x00\xb6\x82\xf1\xc8\x1b\x0e\x2b\x50\xd2\x4a\xd7\xd2\x21\xfa\x1e\x3d\x4b\x39\x1f\x25\xa0\x44\x43\xa1\xec\xa5\x83\xa2\x3c\x55\xaf\xb9\x72\xaa\x5b\x14\x49\xb2\xb2\xaf\x16\x7b\x9c\xa4\x94\x24\xea\x09\xcb\x9c\xef\xa3\xf7\x8c\xdb\x98\xd1\xaf\xc8\x63\xfd\x64\xec\x40\x64\x5f\xe4\x25\x30\xe8\x27\x47\x59\x86\xfe\x45\xa9\x17\x2d\xf4\x4f\xd5\x32\x7a\xbf\x9e\xb0\xaf\x83\xfc\x0c\xe4\x71\x90\x61\x90\x4d\x20\xcb\x40\x6a\x40\x2a\x41\xc0\x3e\x95\xc5\xb9\x39\x66\x2b\x47\xc0\xf1\x1c\xa3\xe1\x38\x3c\x75\x96\x10\x23\x19\x20\x0c\x81\x5b\xe1\x42\xdd\xc1\xe0\xa0\x6c\xf5\x13\x1f\x51\x8e\x05\x2a\x89\x25\xa5\xb6\xc4\x7e\x7a\x8f\x3c\x13\xda\x7e\xdb\x6d\x91\xfe\xfd\xfb\xff\x6d\xed\x9c\xb2\x76\x0d\xd1\x70\x2c\x21\x14\x03\x9a\xad\x1a\xc6\x23\x67\x0e\xcc\xff\xbc\x76\xf1\x47\x6b\x4f\xd0\xcb\x8b\x27\xfd\xcc\xa7\xe3\x82\x3c\x2c\xb9\x99\xd4\x90\x55\x07\x22\x59\xfd\x91\x0e\x30\x70\x46\x3f\xa3\x4e\xee\x2d\xa5\x7e\x50\xed\xb7\x79\xef\xca\xcb\xcb\x6d\x00\x2c\xb1\x0d\xe9\x53\xdd\x53\x89\x25\xd6\x6a\x04\xd1\x00\x85\x77\x97\x27\xf0\x6d\x56\x16\xbe\x31\xd1\xfd\xb9\xd7\xdd\x1d\x54\x18\x18\xff\x89\xe2\xdf\xa2\x52\x32\x53\xa2\xd9\xe5\x0c\x8c\x5c\x64\x60\x06\x9a\x41\xfe\xcd\x5e\x52\x8c\xb9\x35\x5e\x4f\x9d\x2b\x31\xb3\x72\x6e\xc5\x9c\xfd\x0d\xbe\xb6\x63\xbd\xc1\xdb\x96\x55\xa4\x95\xb5\x96\x95\xd4\xe4\x18\x7e\xf6\xef\x35\x3f\x67\xe5\xc2\xd6\xe6\x49\xf9\xb5\xf5\xb3\x4a\x3d\xb3\x2a\xb3\x4a\xec\x7b\x27\x4d\x11\x43\xd7\xcf\xaf\x5d\xde\xd5\xee\x2e\xac\xf5\xd5\x14\x98\x23\xef\xff\x7b\x51\x90\xc1\xea\x68\x93\x66\x1b\x37\x82\xf9\x58\x86\x01\xbf\xaf\xc3\x1a\xca\xcd\xb2\x92\xad\xb9\xc4\x9a\xdb\xd0\x90\x6b\xa5\x2d\xc5\x02\x08\x56\xf8\x57\x90\x29\xfe\x16\xd2\x52\x10\xb7\xc0\xac\x35\xf7\xa5\x1b\xcd\x59\xe6\x97\xcd\x54\x83\x74\xa2\x35\xa7\x9b\xd3\xfd\x65\x73\xa8\xbf\x7e\x3a\xdc\xe2\x71\xdf\x71\x25\xc5\xef\x0e\x76\x07\xf9\xe3\x26\x91\x3f\xae\x50\x9b\xe3\x41\xfe\x93\xc1\xe3\x26\x6b\xa5\xdb\x2d\x2b\xe0\x38\x7f\xfc\xb2\x88\xf7\xa3\x48\x67\xa5\x06\x92\x4e\x12\x7f\x40\xe7\x59\xcd\xc5\xe0\x57\x9e\x28\x53\xff\xec\x1c\x99\xfa\x97\x65\x8b\x5e\x36\xc9\xac\xd4\x59\xaa\x19\x1f\x51\x36\x71\x46\xb3\x2d\xc1\x59\x39\xb3\x77\x72\xe1\xf4\x12\x9b\x86\x35\x97\x35\x76\x96\x36\x6f\x98\xed\x9a\x32\x70\xdf\xa2\xc2\xae\xd9\xf5\x56\x2b\x21\x89\x76\x97\xb5\xa8\xc1\x9d\x3c\xef\x8e\xf7\x37\x3d\x1e\x89\x1c\xea\x9a\x75\xe7\x67\xb7\x4e\xdd\x30\xd0\xe7\x9a\xf7\xe1\xb5\xcf\x46\xfe\xf4\x6a\xff\x55\x1f\x91\xf2\xe3\xf7\x10\xcd\xcb\x2b\xce\x27\x2e\x99\x5b\xde\xe2\x4d\x65\x0d\xe9\xcd\x93\x9a\x96\xf8\xd2\x99\x8f\xaa\x37\x0f\xf6\x06\xf2\x33\xbd\xd3\x1c\xce\x9a\xe2\xf4\x8a\x25\x37\xcd\x5b\xf2\xd8\x35\x75\x3a\x83\x49\x17\x09\x25\xa5\xf1\x3a\x5a\x5a\x97\x67\x9c\xba\xec\x86\x96\x9b\x3e\xbe\x63\xd6\xc0\x1b\x91\xbf\x3e\x78\xfb\x7f\x1e\x98\x6d\x48\xce\x32\xdd\x98\x53\xd0\xff\x2a\x49\x79\xf6\x18\xa9\xff\x6a\xe7\x92\x9f\x47\xfe\x16\x39\x25\x6d\x28\x9c\xb3\xae\x7e\x5c\x17\x3f\xb9\x7b\xe3\xc4\xcb\x18\xec\xc7\xdc\x31\x68\x61\xc1\x75\xfe\x6c\x0d\xd7\xc0\x90\x06\x0b\x61\x2c\x74\xba\x8e\x4c\x27\x44\x47\x60\x30\x50\x80\xd7\x92\x21\xed\x1e\xed\x7b\x5a\xaa\x04\xab\x64\x4d\x4c\x40\xcb\x6b\xb5\x49\xc6\xa4\xac\x24\x77\xd2\xcd\x49\xf7\x27\x8d\x26\x69\xb4\x94\x55\x18\x03\xcb\xf4\x18\x84\x18\x43\xc0\xc0\x59\x2c\x1c\x65\x61\x86\xcf\xeb\xab\x74\x9b\x2b\x5d\x63\xc4\x5d\x21\x76\xcb\xd9\x42\x85\x2b\x38\x28\x9a\x64\x47\x31\x57\x56\xca\x5c\xb4\x52\xa6\x79\xc5\x1e\x1b\xb5\x51\x07\x11\xf5\x84\x16\xd1\x5c\x03\xd5\x52\x36\xeb\xc0\xf8\xe8\x83\xc7\x98\x94\x27\x98\xd4\xc8\xd2\x7d\x1a\x93\xd9\xac\xd3\x9a\xcd\x26\xcd\x5e\xf2\x5a\x64\x0a\x77\xec\xbb\x3a\x66\x05\x79\xcc\x5c\x52\x35\x2d\x2b\xab\x66\xaa\x68\x8a\x74\x00\x14\x6f\x00\xec\x0e\xe5\x05\x04\x3b\xdc\x58\xe4\xaf\x8e\xcd\xec\xe2\x34\xe4\x73\xcd\x37\x1a\xe6\x03\xd9\x8d\xb3\x27\x2d\x58\x6b\x1a\x32\x31\xa6\xa5\xc5\x5b\x8b\x6f\x2e\x66\xf8\x62\x92\x9c\xdd\x65\xed\xf3\xc4\x3a\x42\x57\x27\x93\xd8\x64\xa2\x4b\x4e\x46\x76\xc8\x6a\xb6\x87\xe4\xd4\x52\xdd\x45\xbb\x95\x54\x81\xff\xe7\x98\x37\x18\xe4\xff\x29\xf3\x0a\xb7\x1c\x65\xe4\xb8\x62\xbb\xe0\x67\x89\x13\xdc\xc2\x96\x30\xc1\x4d\x5d\x24\x85\xd8\x2e\x58\xd7\x1b\xe4\xe6\xa1\x57\xb7\xd7\xe4\x36\xad\xae\xaf\xbf\xba\xab\x64\xda\xa6\xf0\x40\x24\xed\xe8\x3f\xda\xaf\x68\xc8\xba\xeb\xd1\x51\x12\xd3\xb1\x61\xba\x60\x9b\xf1\x93\x85\xdc\x48\xee\xfc\x1b\x97\x56\xaf\x9a\x5d\xae\x8f\x89\x2b\x9c\xb5\x71\x5e\xdf\xbd\xab\x27\xd3\xa6\xcc\x29\x9d\x53\x36\x2e\x1b\xbf\x7d\xfc\x6c\x5e\x60\xc9\xd4\x8a\xee\x5a\xa7\xca\xb7\x37\x47\xcf\xb0\x77\x28\xf9\xdb\x4c\xbf\xe5\x90\x81\x18\xfc\x89\xc9\x01\x83\x21\xf9\xa8\x40\x42\xc2\x5a\x81\x11\x2e\x68\x4d\x10\x9c\x87\x9c\x84\x5b\x90\xdc\x9f\x6d\x43\x4f\x06\x1b\x1f\xd3\x93\x90\x20\x47\x14\xdf\x98\x28\x2f\x4c\xd6\x8d\x4b\xc9\x0d\x5c\xc1\x62\xcf\x25\x22\x50\x56\x9e\xa8\x78\xce\xc5\x2c\x38\xc9\xaa\x2d\x22\x34\x65\xe5\xd3\x9b\x6a\xa7\x5c\x15\xbe\xaa\xf3\x40\x4b\x6e\xcb\xdc\xde\x29\x0f\x9f\xbd\x77\xe6\xfc\xc7\xbf\x7b\x70\xd5\x2f\x67\xb5\xf8\xf6\x71\xb9\x6d\x77\xfc\x61\xd7\x8d\x1f\xed\x6f\x71\x58\x1f\x34\x5a\x0d\xda\x55\xaf\x93\xa4\xc7\x1f\x25\x96\xd7\xd7\x14\x4c\xba\x47\x28\x52\xe2\x82\xac\xab\xf3\xdc\x08\xe2\x60\x95\x73\xf2\xf8\x05\x58\x9a\xc2\xa7\x10\x4b\x97\xa6\x2f\x39\x21\xa4\xa5\x96\x90\xc6\xac\xe6\xe4\xf2\xfc\xf8\x7f\xaa\x39\xb9\x86\x75\xd8\x4c\x36\x39\x19\xd7\x2a\x09\x99\x49\x14\xc0\x9e\x0f\x8d\x44\xfe\xf5\x58\xe4\x16\x72\xfb\x9d\xdf\x3e\xdd\xf3\x5a\xcd\x96\x23\x57\xbe\xf9\x20\xd1\x91\x38\xe6\x2f\x2f\x46\xfe\xf2\xb3\x6e\x6e\x64\xe1\xf3\x91\x7f\x8c\xdc\x72\x6a\x77\xed\xf7\xbb\x48\xb6\x2a\xbb\x37\x00\xfa\x12\x37\x82\x58\xd4\xf8\x73\x2c\x3a\xa2\xd3\x11\x16\x4b\xe3\x35\x31\x5d\xa4\x2f\x4e\xdf\x33\x4b\x43\x8c\x9a\x43\x1a\x46\xa7\xd1\xc4\x70\x3d\x0c\x8d\xe9\x21\xea\x74\x94\xdc\x71\x50\x99\x95\x97\xff\x42\xe6\xc2\x41\x39\x03\x56\x8a\x3a\x0a\xe8\x4b\xe3\x7a\xe6\x5f\xe3\xaf\x32\xd6\xf1\xbf\x30\x53\xb9\x91\x87\x23\x55\x0f\x8e\x7f\xfb\x83\x31\xf5\x58\xeb\x37\xe9\x74\xc4\x48\x49\x94\x92\x21\xba\x87\xbe\x47\x29\x95\x95\x55\xa1\x8d\x09\x50\x1a\x6b\x8c\x75\xc7\xde\x1c\x7b\x28\x96\xd5\x6a\xd0\x45\xfa\x62\xf4\x3d\x46\x79\x3e\x3e\xcd\x80\x26\xaa\x61\x75\x1a\x7f\x6a\x46\x40\xe3\xe7\x13\x03\x1a\x0d\xe4\xd9\xc9\xce\xa6\x4c\xcd\xe5\xba\x38\xb9\xee\x09\xa5\x0e\x9a\x2b\xdd\x4a\x79\x60\x62\x86\x64\xdb\xd1\x0b\xd3\xe3\x46\x1e\x1e\x3f\xff\xf0\x25\x5b\xfa\xbb\x92\xeb\x94\xfb\x33\x5d\xae\xb8\xfc\x2e\x0b\xb3\xb4\x90\x2f\x24\x59\x0b\xe2\xfa\x0b\x5c\x3d\x40\x76\x6a\x8f\x89\xcd\xee\xd1\x26\x5c\x90\xc3\x05\xd5\x28\x25\xfd\x62\x0f\xb1\x99\x2e\x19\x8b\x1c\x37\x65\x63\xa1\x8e\xcb\x58\x65\xb9\xc9\x46\x0d\xe4\x8f\xe5\x6b\xaf\xba\x76\xc6\xbd\x7f\x7f\x74\x5e\xcf\x08\x89\x7d\x72\xe0\x37\x1d\x81\xec\x39\x1d\xc1\xa2\x6b\x8e\x6d\xad\x29\xdf\xf8\xd2\x70\xc1\xf4\xea\xf2\xd4\xc8\x29\xca\x8e\x8b\xe6\xf4\x84\x98\xe5\xaf\x12\xeb\xd3\x07\x49\xd2\xab\xcb\x0b\x26\x3d\x68\xca\xb4\x1a\x64\xe3\xba\xf6\xc3\x7b\xe6\x71\xba\x58\x8e\x3c\x37\x21\x57\xf6\x94\xa2\xcb\xa9\x7e\x87\x9e\x74\x61\x49\xfc\x2b\xf1\xe4\xe5\x78\x22\xc4\x13\x1d\xdb\xc5\xf5\xc5\xd1\x1e\xa3\xac\x62\x5d\x8c\x86\x72\x6a\x64\x12\x95\x7a\xf1\x84\x57\xcb\xf6\xe5\x55\x85\x64\x72\x98\x44\x93\xcd\x24\xb2\xa7\x8e\x8e\xf7\x1f\x3d\xca\xdc\x75\x94\x79\x62\x7c\x1e\x37\x32\x7e\x07\xb3\x4c\xa9\x43\x00\x4c\x9f\x32\xd6\x7c\x7f\x4e\x6c\xbc\x2b\x9e\xd9\x14\x7f\x77\xfc\x93\xf1\xdf\xc7\xb3\xed\xf1\xc4\x15\x3f\x25\x7e\x46\x3c\xcd\x8a\x27\x8c\x2e\x36\xa6\x8b\x63\xde\xa4\x84\x1e\x89\x7e\xeb\xe7\xe3\xf9\x80\x42\x19\xf4\xac\x86\xd2\x18\x79\x0e\xc7\xbd\xbe\xe3\x5e\xe2\xee\x0e\xba\x82\xc7\xbd\x7f\x3b\xee\xed\x91\x09\xcb\xa0\x52\x4e\x29\x37\xe5\x96\xda\x12\xb5\x26\x2b\xd3\x37\xfe\xd5\xc1\x83\x8c\xf9\xe0\xc1\xfe\x7c\xf6\x8e\xfc\xfe\xfe\xfc\xef\x97\xe5\xcb\xfa\x8a\x06\x22\x9b\xc8\x3a\xa5\x96\xea\xf6\xa7\x8f\x26\x92\x50\xe2\xda\x44\xc6\x9d\x48\x8c\x5d\x71\x94\x22\x8e\x8f\x63\xb4\x71\xf1\x54\xdb\x03\xb8\xc7\x7c\xf2\x28\xa2\x9b\x1f\x53\x4a\x83\xf4\xb2\xaa\x86\x49\x34\x59\x0c\x4c\x86\x38\x33\xdd\xde\x52\xe8\x9c\x31\x35\xe7\x67\x53\x96\xdf\x1a\xd9\x14\x1f\x7b\x40\x1f\x9b\xe0\xed\xa8\xe3\x46\xbe\xeb\x5e\x7e\xd7\x92\xe2\x8b\x3e\xc3\x3e\xa8\xf8\x6c\x9f\xbf\x90\x89\xeb\x8f\x23\x71\x88\x89\xe5\x63\x63\x89\x9c\x0f\x33\x5a\xf0\x80\x21\x6c\x20\x6e\x03\xe1\x0d\xaa\xe4\xe3\x19\x3e\x96\x0f\xe8\xe4\x1d\x22\x2e\x96\x0f\x30\x3a\x2e\x46\x43\xc1\x99\xe1\x53\x9f\xaf\xb9\x5c\x17\x54\x20\x6f\x0f\xdd\x41\x51\x74\x57\x88\xa6\xca\xa0\x49\xde\x15\x1c\x44\xab\xa8\xa3\x9c\x88\x84\x7d\xf0\x44\x64\xea\xf5\x47\x8f\x5e\x4d\x7e\xf9\xfe\xf8\xb7\xcc\xd1\x2b\xc6\x8f\x70\x23\xe3\xce\xc7\x18\x71\x7c\xfb\xe5\xbe\xc5\xc1\xe1\x4f\x60\xb5\x87\x14\x52\x4d\xbb\xd0\xa7\x21\x94\xf6\x40\x71\x5e\xc5\x5e\x95\x5b\x8b\x4a\x19\xf6\x8d\xa3\xb2\x83\x7e\x77\xf6\x51\xf5\x7a\x8d\x9b\x1b\x41\x0a\xae\xf7\x27\x94\xa5\xc8\x84\xd3\x6a\xd0\xc5\x19\x03\x95\x06\x62\x30\x75\xa5\xc8\x4a\x4c\x8f\x33\x06\x52\x20\x37\x22\x3e\x3e\x4e\xcf\x2f\x49\x9b\x95\x46\x84\x34\x62\x4c\x23\xba\x58\xf9\x84\xd4\x38\x63\x20\x27\x96\xc4\x32\xba\x2e\x7d\x5f\x6a\x32\x21\xbc\xde\x1c\x20\x86\x58\x6a\x8a\x3b\x12\x3d\x3b\xa2\x37\x07\xe2\x74\x8a\xf9\x79\x5d\x5e\x9f\x28\xba\x4c\x4a\xf4\xf5\x7a\x83\xae\x6e\xc5\x08\x4d\x95\x95\x26\xd1\x25\xba\xc6\xbc\x41\x97\xb7\xd8\x13\x0c\xda\x88\x23\xc9\x9a\x49\x12\x4d\x0e\x93\x8d\x88\x44\xb6\xce\x92\xb2\xf2\xb2\x72\x07\xa1\x8e\x48\xbd\x4e\xc3\xb2\xdc\x41\x62\x21\xf7\x68\xc8\x7d\xc4\x72\x94\xa5\x2c\xd5\x45\xa6\x71\x68\x9a\xee\xbb\xbe\xf2\xfc\x7e\x6e\xe4\xfb\x0e\xf6\xb1\xef\x9a\xe8\x86\x92\xe1\xa9\x8d\xd3\xbf\x67\xd4\x75\x72\x06\x6e\x04\xc9\x80\xcd\x71\xe9\xee\x22\x11\x73\x72\x73\xdc\xa4\x88\x94\x9a\x44\xce\xf0\xbb\xf1\x62\xf5\xe6\xa7\x98\xdf\x68\x29\x4b\x08\x4b\xc8\xd3\xec\xd1\xe6\x99\xd3\x6e\xaa\x3c\xff\x27\x6e\xe4\xfb\x99\x33\x9b\x04\x7b\x8d\xbd\x3a\x95\x0a\x6a\xee\xb6\x39\x7a\x86\x1b\x9c\xa8\xb1\x96\xf8\x85\xcc\x05\x58\x9a\xff\x4a\x3e\x79\x39\x9f\xac\xcd\x27\xee\xfc\x9e\x7c\xc6\xb2\x20\xa6\x3f\xcf\xd1\x63\x64\x53\x7a\xb8\x84\x4b\xa1\x5d\xf5\xbe\xff\x5d\xc5\x95\x1b\x6c\x3b\xf0\xe5\xdd\x0f\xfd\xf5\xde\x99\x33\xef\x3b\xfb\xd0\xdd\xff\x75\xa0\xed\xfb\xf7\x4b\x56\x3e\x72\xc5\x15\x8f\xac\xf4\x7a\x57\x3c\x7c\xc5\x15\x8f\xae\x2a\x61\x3e\x7e\x3c\xf2\x9f\xaf\xaf\x5a\xf5\x3a\xb1\x3e\xf1\x04\x49\xfc\xe5\xca\x95\xaf\x45\xfe\xeb\xc9\x5d\x1f\xdd\xd9\xd6\x76\xe7\x47\xbb\x76\xff\xe1\xf6\xb6\xb6\xdb\xff\x80\x8b\x7b\x90\xc8\x8d\xc0\x80\x14\x34\xf8\x0b\x12\x17\xe4\xa1\x02\x01\x50\x2c\x4d\x7b\x37\x8d\xf8\x15\xc5\x6a\x8c\xda\x2e\x5d\x5f\xaa\x31\xe4\xd1\xf8\x35\x8c\x46\xa3\x4d\x09\xe9\xa9\x56\x89\xb7\x72\xec\xbf\x10\x6b\x55\x66\xa0\x96\x0f\x5d\x44\x56\x97\x9c\x51\x5f\xe4\x02\xac\x58\xbe\xe5\xdd\x3b\xf6\x1f\x25\x2b\x86\x7f\xb1\xa5\x6a\xbc\x65\x5b\xf0\xfa\x05\x45\x0f\x3f\x7d\x80\x8d\x59\xf0\xd8\xb6\xe6\xf1\x37\xb8\x91\xca\xd5\x07\x22\x4b\x85\xc6\xc1\xb6\x9b\x76\xa9\xf2\x8c\x2c\x52\xe4\x99\x81\x62\x54\xf8\xed\x79\x0b\xb0\x54\x7c\x45\x24\x2f\x8b\x64\xad\x48\xdc\x62\x8f\xc8\x64\x2e\xb0\xf4\x7b\x0b\x7b\x52\x58\x47\x0f\x67\x4c\xd0\xc3\xad\x54\xd0\x7e\x24\x53\x03\xa3\x9d\x78\x86\xfa\xbf\x10\x6e\x71\xcf\x4d\x41\xd7\xae\xae\xab\x97\x3e\x25\x9a\xf2\xcd\xff\x93\x98\xb7\x9f\x7e\xfe\xba\x9c\xee\x9b\xab\x6e\x9a\xfe\xfa\x56\x86\xf9\xdf\xca\xfb\x00\x37\x02\x23\xd2\x71\xad\x7f\x9e\xde\x98\x62\x64\xce\x19\x89\x51\x17\x6b\x0c\x18\xe3\xf4\x71\x44\x1b\x47\x92\x16\xe8\xb4\xc9\x5a\x46\xab\xd5\x1b\xc8\x5f\x0c\xe7\x0c\x8c\x41\xee\x35\xc4\xf3\xf1\x99\xbe\xcc\x9b\x33\xef\xcf\x7c\x39\x73\x34\x93\x13\x32\x09\x4f\xba\x98\xbe\x8c\x38\xca\x87\x00\xa2\x03\x48\x7a\x88\x52\x03\x51\x22\x8b\xca\xda\xc6\xcc\x17\x59\xdb\x3b\x15\x5e\x57\x70\xd0\xeb\x96\xdb\xe4\x8d\xd1\x25\x07\x5a\x45\x4d\x42\x92\x5a\xa9\x76\x90\xdc\x4b\x75\x5e\xb2\xed\x28\xe9\x23\x31\x91\xe2\xb6\x65\xe5\xe4\xa6\x8f\x22\x0f\x7c\xfe\x70\xd7\x96\x36\x67\xfe\x9c\xad\xf3\x0f\x30\x0b\xc7\x1f\xe6\x46\xde\x79\x7f\xfe\xb5\xc1\x6a\xcb\xf8\x20\xb3\xf0\x3e\x47\xfd\xd2\xfa\x40\x9f\x3f\x43\x89\x91\xcb\xa2\x67\xe8\x9b\xdc\x5b\x10\x51\xe3\xcf\xed\x74\x10\x87\xa9\x0b\x4b\x4b\x5f\x2e\x8d\x96\x32\xa1\x52\xe2\x2b\x25\x93\xba\xf4\x69\xfd\x25\xa6\x49\x5c\x6e\x4f\xb6\xc0\x1a\x42\x7a\xd9\x19\xc4\x31\x9f\x38\x66\xae\x94\xe7\xeb\x1d\x53\xb5\x27\x06\x55\xfd\xa9\x45\x68\x2a\x7a\xcb\xe4\xb9\xe5\x5e\x78\x5a\xa9\x30\x31\xc7\x44\xad\x2a\x93\xd2\x37\xeb\x87\x8e\xac\x1b\x38\x3e\xcd\x3e\x3f\xd4\xef\x3d\x70\x67\xc6\xf4\x6b\x82\x9d\xdb\xe7\xe6\xfb\xd7\x3f\xd0\xbb\xe1\xa5\xa6\xda\x69\x8f\x74\x5c\x33\x9c\xd9\xb0\xae\x7d\xc1\xae\x85\x6e\xb2\xa3\xf7\xce\x15\xe5\x0e\xfb\x33\x7c\x56\xb2\x71\xe3\xda\xb2\xd6\x5a\x9f\xd3\x31\x67\xd9\x75\xed\x1d\xbb\x7b\xbc\x85\x8e\x7b\x32\x5c\x83\xa1\xca\x39\xb5\x53\x6c\xd9\x33\x43\x5b\xd4\xe7\x2f\xac\x99\x1b\x81\x16\xdd\x7e\xaf\x51\x4f\xde\xd3\x93\x59\xfa\x77\xf5\x0c\xaf\x17\xf4\x1e\x3d\x3d\xa4\xf9\xab\x86\xb9\x4e\xe6\xd7\xda\x2e\xc6\x4f\x3f\xa5\x8c\x91\x12\x1d\xa5\xf3\x99\xa5\xcc\x06\x86\x32\x17\x6a\x35\x8c\x96\xf6\xb0\x13\x5c\xc5\xab\x56\x79\xbb\x83\x41\x7e\xcc\xab\xa6\xeb\x83\xea\x06\x5c\x6a\x4b\xb4\x31\x83\x3f\x8b\x74\xd3\x48\xa4\x87\x33\x3f\x3c\xc1\x4f\x8e\x44\xcf\xb0\x1f\x73\x47\x60\x95\xf7\xbb\xa4\x2e\xb2\x24\x25\x9c\x42\x06\x52\x0e\xa5\x30\x7c\x0a\x31\x74\xc5\xf6\x25\x9b\x7a\x34\x09\x71\x32\x6b\xf7\x5e\xf4\x02\xd5\x09\x4c\x17\x8a\x7e\xf2\x6e\x97\xa4\x12\x11\xf6\xe3\x1a\xe9\xcd\x9d\x43\xbf\x94\xea\x7e\xf6\xd4\xa1\xce\xa1\xd9\x79\x84\x3b\x72\x7e\xe6\x15\xbf\xdc\x33\xbb\xf9\xa6\x37\xae\xa1\x4f\x9f\x0f\x1c\x7a\xa5\x6c\xd1\xce\x36\x3a\xf1\x8f\x3f\xb0\xd7\x2b\xfb\xde\x2a\x3f\x4f\x19\xbd\x9e\x45\x88\xac\x25\x61\x72\x96\xb0\x44\x5e\x5d\x92\x26\x26\x40\x78\x42\x0c\x6e\xc3\x56\xc3\xcb\x06\x6a\xf0\x6b\xf4\x01\x4e\xce\x8b\x9e\x63\x39\x96\xea\x8f\x44\x3f\x7d\x36\xc6\x14\xd0\xcb\xdb\x60\x8c\x46\x1f\xd0\x33\xd4\x0c\x42\x95\x4d\x50\x74\xb9\x7c\xa2\x9c\x21\xb9\x26\x32\xa4\x89\x42\x42\xb1\x87\x88\xc4\x41\x44\x92\x49\xac\xd5\xa4\x9c\xbe\xf6\x7a\xc4\xfa\xb3\x48\xca\x6b\x24\x37\x63\x92\xc9\x58\x94\xa5\x3e\xe0\x3a\xdf\xbb\xe0\xf1\xa6\xa6\xc7\x7b\x15\x19\x59\x00\x4d\x44\xa9\xbf\x8f\x8e\xf0\xba\xc4\xe4\x00\x6f\x3c\x12\xfd\xf6\xf9\xc4\xe4\x80\x51\x4b\xe4\xfd\xc9\x9c\x98\x1c\x20\x90\x7b\x90\x94\x21\x7f\x65\xa4\xcb\xcd\xee\xc4\xe4\x40\xba\xd3\xa2\x25\xac\xb6\x4e\xfb\x9c\x96\x6a\x59\xa7\xc5\x99\xed\xac\x73\xb6\x3b\x39\x6d\x92\xd3\x99\xa4\xa5\x99\xf1\x30\x90\xb5\x86\x21\xc3\x2b\x06\x6a\x50\xd2\x0a\x6d\x4c\xc0\xc0\x1b\x0c\x05\x03\x05\x5b\x0b\x18\xa1\xc0\x53\xc0\x18\x0b\x88\x2e\x2b\x53\x5e\x63\x42\x66\x92\x10\x63\x0a\x24\xf1\x1a\x7d\x20\x29\x1e\x99\x54\xeb\x74\x4e\xc8\xc0\x29\x6f\x84\x1a\x7d\xc0\xc9\x67\xc8\xae\x2a\xba\x5c\x26\x59\x08\xa2\xcb\xa5\x66\x89\xc1\x8b\x79\xa2\xd9\x5a\x39\x55\x4e\xe6\xbb\x83\x83\xca\xa6\x78\xe9\x8f\x2c\x9a\x84\x4c\x6a\xad\xa6\xe5\x09\x22\x71\xd0\x22\x92\x9b\x93\xab\xd1\x1a\x88\x56\xce\x22\x27\x7a\x68\xfe\x6b\x9f\x1b\x33\x52\x12\x34\x6c\x1c\x9f\x10\xfb\xab\x37\x22\x7b\x8f\x45\x0c\xa9\xb1\x71\xb1\xb1\xb1\x31\x29\x86\xbf\x1f\x8b\x6c\x79\x6d\x34\xce\x62\x32\x70\x9c\xd1\x62\x8d\xe7\x46\xce\x3f\x56\xb1\x76\x79\x77\x4e\x4e\xd7\xe2\xa5\xc5\xf4\x8a\xef\x9a\xe8\x13\xe2\x2a\x77\x79\x89\x58\xee\x5e\x5b\x76\x7e\x21\x37\x72\x7e\x47\xd1\xe2\x45\x0b\x72\x9c\x8b\x56\x0d\x14\x4f\xd8\x44\x48\xe1\x81\xdb\xfc\x19\xfa\x18\x3e\x26\x06\xe5\xb1\x24\x56\x57\xc1\x11\x8e\x61\x08\x40\xd6\x62\x08\xaf\x80\x2a\xa5\x4a\x8b\x36\x26\x20\xb3\xa3\x78\x63\x7c\x56\xbc\x3b\x7e\x6b\x3c\xab\xd3\x6a\x8e\x44\xcf\x3e\xab\xd1\xa8\xe9\x33\xcf\xe6\x31\x24\x57\x47\x18\x1d\xab\xd7\x5c\xc8\x9e\x45\x25\x41\x26\xee\x0a\xaf\xf7\x07\x19\xb4\x6c\x1f\x41\x51\x0c\x9a\xc4\x64\xb5\x12\xef\xd0\x13\x87\x5e\xce\x9f\x45\xc2\x86\x4e\x44\xee\x8b\xec\x3d\x46\x5e\x8b\x74\xbd\x4e\x66\x92\x96\x97\x22\x0b\x98\x4d\xe3\x12\x73\x9e\x39\x3a\xfe\x3e\xe3\x1e\x9f\x89\x0b\x2f\x6b\xb3\xe5\xdc\x08\x74\x58\xe7\x4f\xf9\x6b\x0c\x89\xf1\xeb\xe3\x02\xba\x27\xb5\xe4\x0e\x2d\xf1\x6b\x49\x9a\x96\x18\xb5\x44\x2b\x4f\xcd\xad\xd5\x72\x64\x88\x21\xb3\x18\x92\xc6\x10\x86\x67\x18\xb0\x5d\x1b\xb8\x1d\xdc\xed\x1c\x9d\x35\x51\x8b\xd3\x72\x65\x20\x20\xac\x59\xab\x5a\xb5\xb9\x32\x38\xf1\x78\xb2\xd2\xeb\xae\x08\x06\x83\xa2\x3c\x77\xb5\x24\x27\xa7\x98\xf2\x4c\x4d\x0e\x13\x11\x99\x34\xd2\xfe\xab\x48\xcd\xcf\x22\x35\x6f\x31\x27\x98\xcf\xce\x6f\x1f\x7f\x83\x71\xd3\x1d\x13\xcf\xfc\x00\x1a\x51\xf2\xa5\x0a\xbf\xa0\xd7\x53\xed\xd2\x58\x63\xac\x2f\x76\x56\xec\xfd\xb1\xac\x4e\xc7\xb2\xa4\x3f\x46\xcb\xf6\x70\x94\xd1\xa9\xd9\x59\xa5\x4f\xce\xd3\xbf\xf0\xba\xbd\xdd\x41\xfe\x0b\xaf\xd7\xad\x3e\x9b\x54\x1e\x53\xd8\x68\xe4\x7c\x3b\xf3\xc6\x78\x33\xdd\x3e\x3e\x99\xf9\x68\x2f\xbb\xf5\xd1\xbd\xdf\x6f\x53\xc7\x79\x38\x72\x8c\xa9\x54\xe2\x5b\x8e\xdf\xca\xe2\x6b\xcd\xdf\x40\x78\x12\x26\xaf\x10\x96\x70\xdf\x30\xdf\x6a\xbe\x21\xe7\x2e\x3e\x1f\xfe\xd2\xab\xa4\x3a\xb6\x44\x87\x49\x64\x2a\x23\x2b\xc9\x6d\xa3\xa3\x91\x63\x9a\xef\x6e\xfb\xae\x58\xbe\x97\x15\x60\xfe\xa2\x3c\xab\xb6\xbd\xc0\x10\xc2\x13\x0e\x54\x8e\x03\x94\x51\x1f\x56\xbb\x65\x33\x37\x89\x15\x32\x0b\x4d\x20\x0e\xf2\x26\x23\x3c\x33\xfe\xe9\x85\xa7\xd5\x04\x62\xe4\x18\x79\x53\x99\x4b\xb6\xdf\x42\xf1\x35\xf9\x5b\x48\xb3\x56\xc3\x68\xf4\xf8\x46\x7b\x8e\x7e\xc3\x7e\x3b\xc1\x9c\x3e\x50\x67\x62\x15\x4d\x8e\x52\x9b\xc9\x26\x8e\x8e\x92\xfd\x91\x15\x4f\x73\xef\xde\x76\x4e\x23\xdf\x27\x9f\x71\xb2\x29\xdc\x71\x68\x60\x1e\xa1\x54\xde\x1f\x35\xf0\xbd\x4d\xdc\x26\xd1\x2d\x0f\x2c\xca\x06\x93\x4f\xde\xea\x27\x2f\x3f\x10\x39\x14\x79\x88\x71\xd2\x7b\xce\xf7\x31\xa3\xe3\x36\x90\xe8\xf9\xc8\x31\xda\x12\x95\x89\x90\x79\x04\xe0\x08\x39\xca\x28\x2f\x04\x28\xd7\xca\xe2\xa4\x2d\xe7\x9f\xa6\xb3\x23\xc7\x94\xff\xfb\x80\x90\x5d\xec\xef\xa9\x59\x63\x43\x3c\x92\xfc\x31\xd0\xe8\x86\x8c\xe8\x01\x03\xb8\x83\xa9\xbf\x21\xee\xb7\x8b\x3d\xc4\x51\x44\x73\x4b\xc5\x4c\x6a\xa5\xe6\x8d\x8e\xd9\xcd\x3e\xfe\x23\xde\x55\xe4\x49\x64\x7f\x9f\x3e\xa7\xa3\x2d\x2d\xd1\xde\xd6\x36\x33\x43\xe5\x08\xdd\xd1\x33\xf4\x1e\xb6\x1b\x0e\x78\xd1\xee\x37\xf1\x24\xbf\xd1\x31\xb7\xc4\x58\x32\x50\xc2\x68\x3c\x81\xb8\xd4\x23\xd1\xf7\xfc\x99\xf1\xa6\x40\x2a\xaf\x8f\x0b\xa4\xa6\xc6\xcd\x13\x53\x92\x5a\x33\x26\xcd\xe6\xf9\x0c\x3e\xbb\x95\xd1\x26\x21\x11\x3e\x79\x3f\xad\x74\x8f\xf1\x63\x5e\xc5\x1c\x5c\x2e\x7e\xac\x5b\xc9\xf1\xe4\x24\xef\x52\x35\xb0\xcc\x47\x7e\x5c\x33\x35\x39\xbd\xd5\xcc\x54\xa2\x35\xd0\x44\x4b\x12\x4d\x71\xea\x6c\x35\x2d\x21\x5f\xfd\xfa\xb9\x9e\x3f\x9d\x39\x92\x51\xde\x56\x32\xe7\xe6\x1a\x7f\xd3\x48\x5f\xff\x6d\xbd\x9e\x88\x7b\xea\xb2\x99\xae\x9b\xbb\xae\x99\x2e\xf4\xde\x51\x38\x6d\x92\x25\xb7\x6d\x53\xfb\xc3\x61\x9d\xb6\xbe\xb6\xab\x3c\xd9\x63\xdf\x95\x57\x91\xdf\xb9\x7b\xd1\x38\xbf\x35\xa7\xf9\xca\x59\x8b\xb5\xac\x50\xd9\x26\x2e\x9c\xa7\xae\xf3\xe9\xe8\x19\xd6\xa7\xb1\x20\x0b\x6e\x54\x3c\x5f\x18\xe0\xe6\x17\x17\x1f\x89\x1e\xf1\x5b\x63\xa6\x27\xf2\xce\x46\x73\xbb\x27\x01\xe6\xc4\x49\xad\xc6\x98\x24\xa1\x35\x0d\x3c\x7c\x5e\x99\x23\xf8\x7c\x6a\xc6\xe0\x52\xb7\xb6\xcb\x9f\x8b\x3a\xb4\x72\xae\x64\xd1\x68\x35\x5a\xb1\x9a\x5a\x2f\x15\x71\x4a\x4b\x72\x98\xfb\xba\xef\x5a\x5d\x55\xb5\xfa\xae\xee\x29\xa1\xe6\x29\xd6\x38\xa7\x34\xc2\x30\x0c\xa3\xb3\x4e\x6e\x0e\xa5\xb4\xae\x9c\x96\x96\x36\x6d\x55\xdb\x8e\xad\x5b\xd9\xee\xc0\xcd\x27\x6f\xb8\xf1\xd4\x9e\xe9\xa9\xae\xc9\xc2\xf5\x1a\x4b\x64\xa7\x63\x96\x3d\x2f\xc7\x51\x55\x90\x72\xbb\xb8\xec\x9e\xe5\x4b\xee\x5d\x59\xfe\x87\xdf\xbc\xf7\x8e\xe2\x37\x83\xd1\x33\x74\x80\xed\x46\x16\x26\xf9\x93\x33\xe2\x6d\x3d\xb6\xad\x36\x86\xb7\x91\xa4\x00\x37\x4f\x48\x68\x8b\xe1\x53\xda\x90\x74\x19\xd3\x57\x6a\xf1\xdc\xc5\x42\xec\x44\x7d\x40\x93\x28\x6f\xca\x65\xe5\x89\x06\xc2\xcc\x5e\x12\xbe\xb6\x69\xa6\xf4\x4c\x7f\xcb\x6d\xde\x32\x6b\x45\xd5\xe4\xd4\x7b\xf7\xec\xdd\xd7\xb6\xbd\xac\x6c\x93\xc5\xb7\xeb\xd4\xfe\x7b\x3f\xda\x55\x6d\x4f\xb9\x2b\x26\xc1\xa8\x7f\xf3\xe4\x89\x57\x9d\x29\x0f\x66\x64\x5e\x7a\x56\xcb\x28\xf2\xf4\xa0\xc4\x9f\x91\x83\xb4\xc6\xcc\xb9\x5e\xde\x4b\x8a\x02\xb1\xf3\x8a\xb3\x12\xd3\xe1\x6a\x4d\xe2\x79\xa1\x95\x68\x92\x26\xf8\x96\x2a\xcb\x0b\x76\xe1\xfc\x71\x91\x58\xcc\xc9\x55\xb2\x21\x93\x43\xb6\x89\xf2\x09\x4b\x91\xcd\xa2\x5d\x97\x34\xa5\x39\x54\x15\xbc\x6b\x4d\x55\xd5\x9a\xbb\x82\x53\x42\xcd\x55\x49\x71\x94\x32\xec\xc8\xad\x91\xd7\x67\x2e\x9f\x96\xc5\x4c\x88\xf3\x56\xfb\xd4\xa2\xd4\x8b\x12\x2d\x98\x2c\xd8\xb3\x52\xcb\x79\xf2\xdc\xb9\x33\xdb\x8b\xba\x6f\xec\xce\x57\xa5\xf9\xfe\xdb\xea\xfc\xe9\x18\xdb\x8d\x4c\xe4\xa2\xd6\x9f\xe7\x08\xa4\xf0\xf3\xf3\x3f\xcd\x27\x03\xf9\xc4\x6e\x0a\x70\xf3\xf2\x4c\xad\x69\x76\x97\x9d\x31\xda\x89\xc6\x6e\xb7\x64\xb5\xc6\xf0\x96\x0b\xd2\x55\xdf\x67\x18\xbb\x58\xa2\xf4\x8e\x5d\x2e\xe6\x4c\x26\x83\xd8\x26\x1e\xf9\x25\x1a\x28\xb5\x6b\xb4\xb6\x92\x22\x86\x09\xad\x19\xd9\x1e\xa8\xd9\xf8\xd3\x25\x8b\xef\x5b\x33\x65\x7c\x26\x77\xe7\xed\xe2\xfc\xb6\x99\xb9\x79\xcd\x6d\xf3\x43\x57\x48\xb1\xe4\x4c\x5a\x65\x87\xa5\xe9\xa6\xdf\xee\xd8\xf9\xc1\x6d\x2d\x8d\xdb\x9e\x5f\x33\x78\x7c\x24\x26\x21\xc3\xfc\x60\x42\xba\x59\x47\x3f\xba\xe7\xb6\xba\xc1\xd6\x02\xc5\x0e\x32\x00\xe6\xac\x26\x0b\x69\x58\xeb\x6f\x79\x37\x63\x34\x83\x09\x65\x0c\x65\xec\xc9\x38\x90\xc1\x66\x65\xf8\x32\x66\x65\xd0\xb4\xb4\xad\xfc\xcb\x3c\xc3\xf3\xa9\x4c\x23\xd5\x52\x23\x97\xc5\xb9\xb9\x43\x1c\xcb\x71\xa0\x3c\x15\xe8\x10\xdd\x43\x0f\x50\x8d\x86\x12\x6e\x96\x16\xa9\x44\x9b\x6a\xb4\xb4\xc6\x13\x46\xf6\xe5\x31\x5f\x77\x50\x79\x8d\xaa\x3b\x28\xba\x83\xca\xbb\xa5\x5e\x77\xb0\xd2\xad\x14\x33\x94\xf7\x17\x1c\xa5\xe5\x3f\x20\xc5\x06\x26\x83\x88\xcc\xf5\xdf\xbc\xf0\x8b\x5f\x14\xce\xfd\x49\xcb\x94\xc5\xb9\xee\xac\xe9\x79\x79\x93\x73\x12\xbe\xa1\xc7\xcf\xfb\xe8\xf1\x19\x75\xa1\x95\x37\xb6\x3b\xac\x86\x1b\x63\x4d\x09\x9e\x39\xd3\x96\xa9\xef\x2d\x3a\x23\x16\x7a\x9e\xed\x86\x0f\xb3\xd1\x8d\x9f\xfa\x53\xe2\xbd\xdc\x9c\xc6\x72\xb3\x3b\x54\xbe\xb6\x7c\xa8\x9c\x96\xbb\xcb\xdd\xb9\x81\x8c\xce\x46\x4e\xde\xd3\x9b\xb5\x31\x01\x8e\x23\x31\x19\x64\x3c\x83\x84\x33\xc8\xce\x0c\x22\x64\x78\x32\xfc\x19\x34\x23\x23\x94\x15\x22\x2f\x87\x46\x43\xcc\x81\x10\xf1\xe7\xfa\xe3\x8c\x81\x5c\x86\xf3\xc6\xb3\x55\xf3\x66\xc7\xc4\xd8\x17\xce\xaa\x2a\x68\x31\x5a\x89\xd6\x6a\xad\xe2\xeb\x67\xd9\xd3\x08\x8c\xf0\x1d\xf7\xc9\x41\xab\x3b\x78\x5c\x79\x6c\xed\x1e\x33\x5b\x2b\x89\xdb\x75\x3c\x28\xd3\x1f\x85\x21\x0f\x8a\x95\x6e\xd7\x18\x7f\xdc\xa4\xbe\xe1\x78\x9c\x97\x33\x86\x62\x0f\x49\xd4\x5e\x7a\x5d\x45\x7d\xaf\x71\xca\xe5\x81\x41\x7d\xd6\x4d\x4a\x4b\xca\xca\x2f\x25\x0f\xe4\x42\x68\x90\xd3\x1d\xbb\x81\x51\x5e\x31\x2d\x53\xde\xa9\xd0\xd0\xf3\xaf\xa5\xe7\xb8\x7b\x6e\x08\x26\x15\x18\x4c\xb6\x34\x53\x72\x7e\x45\x56\x38\x38\xd4\x96\x3d\x6d\xf8\xed\xeb\x57\x1e\x58\x51\x9a\x5b\x33\xdf\x3d\xa9\xcc\x5f\xef\x6a\x2c\x4e\xf3\x2e\xba\xa5\xd7\x39\x2b\x2d\xe2\x4f\x9d\xd2\x1b\x38\xfa\x62\x72\x79\xd7\xb4\xb0\x63\xa6\x2f\x7f\xe1\xaa\xc5\x7d\x4b\x97\xf7\x2d\x5e\xc1\x36\x0d\xa6\x39\x56\xd7\xcf\xdc\xd6\x5d\x4a\x68\x4c\x8a\x90\x97\x9c\x66\x33\x6b\xdc\xad\xab\xa7\x76\xdc\xd0\x5b\x32\xa9\x75\xb0\xb1\x6a\x41\xcd\xa4\xd8\x84\xd9\xa5\x53\x3b\x27\x99\x7d\x6d\x21\xb1\xf3\x86\x45\x25\xb1\xfa\xef\x19\xa7\xbf\x28\x6d\xdd\xaa\xa2\xc9\xb6\x38\xbe\xa0\x99\x86\xd6\xad\x1d\xd8\xb0\x69\xfd\x46\x10\x3c\x2d\xe7\x23\x1a\x0b\x52\xe0\xf5\x67\xa0\x31\x65\x6e\x1a\x9f\x16\x4a\x1b\x4a\xa3\x46\x43\x4c\x63\x6c\x7b\x2a\xcf\xb6\x26\xf2\x71\x88\x95\xb7\x02\xaf\x6f\xa2\xc6\xed\xf5\xaa\xe9\x80\xcd\xa4\xbe\x38\xa2\x54\x3d\x4c\xea\xeb\x18\x49\x89\x26\xba\x70\xf9\xda\xb6\x35\xb5\x19\x23\x23\xba\x98\x94\xfa\xd9\x0b\x3d\x2f\xbc\xc8\xbc\x7a\xed\xb5\x25\xfd\xfb\x42\xe3\x6f\x68\x2c\x11\xef\x1e\x97\x6f\x92\xe5\xe5\xdf\x8e\x8b\x6a\xbc\x39\x00\x90\x2b\xb9\xcf\x41\x61\x82\xd3\x6f\xe1\x13\x84\x04\x26\x0e\x8d\x2c\x69\x37\x6b\xe7\x18\x8d\x8c\x51\xdd\x87\xdc\x9f\x2b\x29\x9d\x57\x7d\x43\x4b\xa4\x25\x65\xea\x93\x38\x8d\xc3\x9e\x43\xfa\x46\x46\x7e\x39\xb5\x30\x29\x37\xc3\xe4\x2b\x28\x9c\xca\x36\x91\xfc\xaa\xb2\xf8\x74\x57\xe6\xe4\xca\x0a\x79\x8c\xe8\xb1\x88\x45\x19\x23\x01\x36\x14\xf9\x53\x78\x87\xe0\x60\xd2\x8d\x8d\x71\x16\x4a\xe3\xda\xed\xd6\x39\x59\x59\xf1\x46\x6d\x2b\xd2\xe4\x20\xa0\x8c\x24\x53\x1f\xf5\x85\xfe\x84\x7f\x2b\xf2\x25\x5c\x3e\x74\x8d\xc7\x67\x4d\x2d\x73\xa4\x15\x39\x12\x46\xec\x81\xd5\x09\x97\x66\x11\xb1\x18\x62\xf7\xc5\xc4\x1a\x73\xa7\x89\xec\x3f\xbe\x4f\x6e\xde\x34\xdf\xad\xed\xb9\x7c\x5a\xaa\xfc\xe9\x59\xe5\x3d\xcb\x6e\x7f\xac\x96\x65\x19\x4a\x35\x75\x1c\x51\xbc\xc2\x2a\x7b\x05\xcf\x71\xbc\x91\x77\xf3\x8c\x36\x5e\xdf\x18\xd3\x6e\x8c\x05\x94\x22\x68\x9c\x31\xa0\x55\xca\x67\x5a\xaa\x89\x49\xa4\x46\xf5\xed\xa4\x4a\x97\xcb\x77\xa9\x64\x2d\x67\x40\xa2\x49\xac\x94\x09\x12\x29\x97\x49\xed\x85\x32\x20\x25\xf3\x76\x10\xe7\x89\xc8\x00\x39\xf8\x7e\x24\xbc\xfa\xb9\xe7\x78\xa6\xfc\x09\xb2\x3c\xe2\x1c\xdf\x4b\xbe\x9d\x1d\xe9\xd2\x58\xc6\xcb\x22\x5f\xaa\xf3\x23\x7d\x1a\x0b\x28\x52\xfd\x06\x9e\x13\x38\x06\x8d\xa4\x9d\x65\xa0\xe8\x44\x09\xfa\xaa\x3a\x64\x0d\x68\x2c\x17\xd6\xa4\xd9\xc1\x76\xa3\x00\x4b\xfc\x3e\x47\x4c\xe3\x8b\xb1\x64\x7f\xec\xa3\xb1\xcc\xae\x58\xb2\x34\x76\x43\x2c\x13\x1b\x9b\x84\xc6\x82\xb9\x45\x67\x8b\xc8\xbb\x45\x44\x28\x6a\x2d\x62\x8c\x45\x44\x97\x92\xd8\x98\xd4\x5e\xe8\x48\x4d\x65\x8d\xad\x79\x59\xbc\xd5\x98\xa4\x5a\x9d\x57\xe6\x20\x5e\xef\x44\x81\xaf\x7b\xa2\x22\xa3\xbc\xaf\x12\x0c\x2a\xb5\xe6\xcb\xcc\xf0\x32\x83\xb4\xaa\xf6\x68\xbd\x60\x96\xdc\xfb\x7d\xcb\xa7\xf7\x4f\xcb\x7c\x61\xf1\xf2\xe6\x65\xbe\xb4\x91\x7d\xa9\x31\xc9\x35\xb3\x3a\x8b\x36\xde\x9f\xa3\x4b\x9d\x3e\x3f\xe4\x3d\x74\x58\x36\x53\xf7\x82\x1d\x1d\xe3\x0f\x5e\x32\x58\xb6\x69\x9f\x6c\xae\x1d\xdd\xee\xba\xc2\xa4\x09\xa3\x9d\xf0\x1b\xb6\x1b\xc9\xf0\xf8\xd3\xd1\x98\x3c\x37\x95\x4f\x0d\xa5\x0e\xa5\x52\xc5\x6d\x52\x8c\x6c\xab\x85\x8f\x33\xfe\xc8\x6d\xfe\x0f\x5e\x63\xfd\x37\xa7\xd9\x97\xfa\xef\x4e\x33\x31\x07\x65\x74\x75\x7f\x2e\x64\xbb\x91\x20\xef\xd0\xfe\x8c\xd4\x00\xe6\xdb\xfc\xb6\xf7\x6c\x9f\xda\xa8\xd1\x46\x34\x96\x40\xcc\x3c\x21\xa3\xd5\xc8\x5b\x5b\xb9\x4b\x94\xa1\xfb\xb2\x3a\xd6\xe5\x7b\x33\x77\x59\xb4\x62\x0b\x6b\x37\x3f\x33\xb0\xf4\xe9\xad\x8d\xb5\x3f\x79\x56\xf9\x1e\xc7\xae\xbb\xee\xda\x21\x83\xc9\xdd\x75\x6a\xef\xcc\x99\x7b\x4f\xed\xda\x79\x62\xef\x8c\x19\x7b\x4f\xec\x7c\xff\xc4\x89\xf7\xdf\x7f\xf7\xdd\x09\x0e\x16\xb1\xb0\x3e\x85\xbf\x78\x50\xe6\xcf\x2c\x0a\xa4\xcd\x97\x19\x43\x0e\xaf\x89\x6b\x8c\x6f\x2f\x16\x5a\x4d\x49\xbc\xc1\x18\x97\xe6\x6a\xe5\xe4\x9d\xd6\x3b\xe6\x93\xb5\xaa\x06\x93\x09\xb9\x70\x0a\xf3\xba\x58\x45\xb5\x5e\xf6\x76\x17\xb5\x1b\x18\xed\xe5\x14\x4c\xa5\x5e\x0a\x4f\xd8\x97\xaa\x50\xaf\xaa\x09\x56\xb6\xed\x72\xd2\x60\x91\xa9\x97\x42\x14\x22\x2e\x4d\xd9\x3e\xc7\xd4\xc2\xb4\x0b\x14\x82\x7e\x54\xd4\x7d\x43\x4f\xfe\x25\x12\xc6\x60\x30\x62\x61\x19\xb6\x1b\xbc\xba\x06\x97\xc0\x39\x1b\xb3\x15\xe2\x63\x08\x24\xcd\x2b\xce\x4e\xb3\x1b\x85\xd8\xd6\x34\xbe\x00\xad\xa6\xa4\x89\x47\x7e\x97\x13\x1f\x99\xf9\xfc\x90\xde\x58\x7f\x40\x82\xca\xc5\x8b\x35\x67\x03\x65\x4a\x2f\x9f\x68\xff\x25\x02\x34\xb3\xca\xaa\x4b\xbb\x75\x44\x8e\x04\x71\x32\x37\xfa\x21\xbd\xb9\xfd\xc2\xfc\xd3\x0a\xa7\x3a\xf6\x9d\xfb\x35\x39\x95\x30\x39\x4d\xb0\xcb\xe4\xe8\x62\x3c\xd1\xb1\xdd\x48\xc2\x34\x7f\xec\x33\xf4\x17\x94\x91\xd9\x00\xa3\x3c\x11\x4b\xd3\xc6\x06\x28\x4d\xf6\x24\xb7\x26\x0f\x25\x53\x53\x7c\xa3\xa1\xdd\x6a\x34\xc6\x27\x9a\xb5\x32\x27\x3e\x3e\xb1\x16\xef\xc4\xc3\x2e\x99\x12\x5f\x24\x01\x17\x35\xc2\xec\xca\x08\xa4\x26\xa7\x4f\x49\xf5\x2d\x9b\x91\x3f\xb2\x2f\x49\x97\x52\xd9\xd8\xc1\x76\x73\xdc\x63\x9c\x56\xec\x91\xda\xc6\xc3\x6c\xd3\x9b\xae\xd6\xa9\x4e\x10\x74\x45\xcf\x50\xd9\x26\x4a\x11\xf0\x17\x3a\x13\x1a\xf7\xe0\x00\x18\xcc\x2f\xf7\x95\xf7\x94\xdf\x5f\x4e\xf9\x72\x52\xd0\xa8\xbf\x3f\xe3\x50\x06\x93\x31\xaf\x2c\x27\xbf\x35\xa1\x80\xb3\xf3\x7a\x83\x6a\xb5\x5e\x9f\xb9\xb2\x52\x4e\x3a\xfe\x19\xf4\x8e\xa9\x25\x61\xf1\x47\x55\x3c\xb5\xc4\xf8\xdf\x96\xf1\x7c\x93\x57\xdf\x15\x5a\x7d\xcf\x94\xac\x99\xed\x9d\x05\xd3\x16\x54\xa6\x5a\x4a\x17\x06\x02\xeb\x5a\x5d\xe5\x7d\x37\xcc\xeb\x7d\x20\xe0\x9b\xb6\xab\xb1\x7f\x91\xb5\xa2\xbb\x21\x30\xd8\x3a\x89\x14\xb6\x6e\x6c\xcb\x73\xd8\x1f\xe5\xb3\x92\x8d\x49\xf9\x53\xb2\xb3\xbc\xc5\xde\xac\xac\xaa\xa6\xde\xda\x86\xd5\x4d\x39\x93\xec\xb7\x66\xb8\x6a\xab\x1d\x25\x45\xee\x8c\xcc\xaa\x19\x21\x59\xd6\xb6\xe8\x19\xe6\x66\xae\x01\x19\x68\x3d\x9c\xa2\x44\x6c\xb7\x2e\x36\xc0\x71\x59\xbe\xac\x59\x59\x8c\x35\xad\xd1\x92\x65\x76\x9b\x19\x33\x78\x9e\x17\xf8\x30\xff\x0a\xff\x1e\xaf\xd1\xf0\xa9\xe6\x59\x49\x16\xab\x11\xad\xb1\x8a\x77\x8a\x13\x84\xec\x75\x99\x99\x29\xb2\x17\x27\xec\x28\x71\x82\x45\x9b\x1c\xa5\x3e\x22\x26\xda\x12\x6d\x26\x4b\x12\xf9\xce\x5c\x38\xc9\xa1\x8f\xcf\xf3\x94\xa4\x54\xaf\x68\x2e\xb8\xfb\xee\x96\xe5\xc4\x12\x39\xe3\xdb\xc6\x6a\x74\x74\xb7\x26\x4e\xcf\x09\x2d\xd2\x12\x66\x73\x5b\xcb\x17\xe7\x77\x8d\x6f\xef\x5d\xa4\xe6\xe5\xd1\x33\xac\x8e\x6d\x42\xaa\x1c\xaf\x88\xb5\x31\x75\x6e\x3a\x9f\x1e\x4a\x1f\x4a\xa7\xc6\xc6\xb8\xf6\xb4\xe4\x78\xa3\xf9\xf2\x8c\x4f\xbc\x68\xd5\x97\x67\x79\x17\x8b\x7e\xf2\x2f\x7a\x65\x9a\x1a\xa8\x16\xec\x5e\xe8\x1e\x59\x31\xa0\x04\xaf\x5b\x5d\xbe\x7c\x4b\xd1\xa2\x3b\x96\x33\x6f\x8f\x4f\xbd\xf6\xda\x92\x25\xfb\x42\xcc\xe4\xef\x47\x2e\xd6\x49\xe8\x29\xb6\x09\x26\xac\x7e\x11\xa6\xe8\xb7\x7e\x63\x8c\x21\x60\x82\x2e\xc6\x10\x80\x5e\x4f\x8c\xfc\x91\xe8\x2b\xcf\x9a\x13\x03\xf2\xb7\x3f\x5d\x1b\x1b\xe0\x79\x9e\x4f\x78\x39\xe1\xdd\x84\xbf\x26\xd0\xd6\x04\x62\x4c\x70\x27\xcc\x4a\xa0\x5a\x86\x28\xc5\x3f\xd2\xa8\x27\xff\x3f\xe2\xde\x05\x3e\xaa\xea\xda\x1f\xdf\xeb\xbc\xe6\x3d\xe7\xcc\xfb\x95\xc9\xbc\x32\x33\x49\x26\x99\xd7\xc9\xe4\x9d\xcc\x09\x8f\x64\x08\x10\x26\x91\x67\xc2\x24\x01\xc3\x43\x04\x01\x29\x2a\xe5\x22\x50\x8a\x88\xe8\x05\xb5\xbe\xd0\x0a\x6d\xbd\xd6\xda\x56\x69\x9b\x52\x8a\x56\xb1\x5a\xd1\x5a\x05\xff\xf6\x71\xb9\xbd\xad\xe6\xb6\xf6\x69\xd5\xb6\xb6\xb5\x4a\x66\xfe\x9f\xb3\xcf\x99\xc9\x24\xa4\xf7\xf6\xfe\x3e\x9f\xdf\xe7\xf7\x41\x48\x26\xee\xac\xb3\xf6\x3e\x6b\xaf\xbd\xf6\x7a\x7c\x97\x8a\x05\xd9\x3a\x68\xc9\x41\xac\xf9\xb9\x92\xd3\x2b\xf2\x1c\x76\xfd\x61\x0f\x97\x4f\x72\x64\xf1\x92\x8f\x0b\x6e\xcc\x1f\x7e\xfa\xbc\xa6\xb2\xd2\x41\x29\x68\x7b\x65\xa5\xe6\xfc\xd3\xf9\xc3\x54\xef\xe4\x67\x7d\x1b\x37\x8f\x3a\x1c\xa3\x9b\x37\xfa\x88\xab\x3f\x3e\x2d\xf9\x00\xe9\x5f\x50\xbd\x28\x86\x9e\xff\x36\x8a\x15\x3e\x14\xb4\x6a\x7d\x26\x86\x94\x2a\x7d\x06\x85\xbd\xd8\x09\xa8\xd2\x67\xbc\x1e\xf1\x07\x1e\x15\x27\xce\x03\x7b\x09\x05\x95\x4a\x9f\x61\xed\x4b\xc3\x10\x3e\x53\x78\x4b\xb0\x28\xd4\x99\x21\x3b\xd8\xbd\x0a\x75\x26\xac\xb2\xdb\x55\x61\xd2\x50\x1f\x95\xe7\x2a\x7e\x15\x4c\x0a\x4d\x26\xca\x45\xa3\x09\x6f\x22\x9e\x20\xd8\x04\x28\x8c\x06\x71\x8a\x56\x43\xbd\x47\xa5\x02\x95\x81\x0d\x3b\x18\xc7\x7a\xc7\x0d\x0e\xd2\x81\x38\x0b\x4a\x63\x87\x55\x9a\xcf\xf1\xbc\xec\xe9\x93\xe6\x5c\xf4\xf3\x45\x72\x91\xdc\x15\x7e\x3e\x1f\x19\x25\xc3\xa1\x70\x60\x9a\x73\x4f\x5a\x93\xb2\xd5\x21\xdf\x7f\x8c\xd2\x6a\x75\x8c\x9e\x65\xf4\x3a\x8d\x43\xf3\x95\x37\xf2\xbf\x7e\xf6\x80\xda\x6c\xd4\x53\x0c\x6d\xb0\x58\xd5\xdf\x78\xe1\x2b\x2a\x9b\xd5\x48\x31\xa4\xce\x68\xd1\x1c\x3e\x9b\xff\x25\xb1\xd1\x58\x9f\x6c\x70\xb4\x76\xa6\x5b\x93\x9b\x82\x93\x0f\x51\xbd\x93\x67\xea\xaf\xd9\x30\xe4\x76\xae\x58\x33\xe2\x23\xae\x9d\xbc\xc7\xbf\x7a\x64\xa5\xdb\xb9\x62\xe3\x96\x18\x91\xc1\xc2\x00\x28\x80\x10\xf9\x53\xaa\x17\x69\xd0\xdb\xc2\xe7\x0e\xab\xe0\x16\x12\x18\x0a\xfe\x46\xc1\xdb\x14\x34\x52\x40\xd1\xbf\x61\x80\x21\x7f\x8d\x00\xa9\x54\x04\x7c\x48\xc0\xef\x08\x68\x21\x80\x80\x6b\xe9\xdd\x34\xb1\x82\x86\x56\xba\x97\x26\xc6\xe0\x13\x40\xac\x04\x48\xc1\x7c\x20\x68\x50\x81\x8a\x26\x35\x8c\x12\xfe\xa6\x84\xb7\x95\xd0\xa8\x04\xa5\x42\xb0\x3a\x32\x0a\x41\x6f\xc8\x5c\xab\xd8\xad\x20\x56\x28\xa0\x55\xd1\xab\x20\x14\x3a\x4e\x17\xd7\x11\xc7\x74\xa7\x74\x04\xab\x03\xe6\x92\x1a\x5e\x52\xc3\x59\x35\xa8\xd4\xa0\x6e\xd3\x2c\xd4\x10\xd5\x1a\xa0\x35\x16\x0d\xa1\x51\x58\x80\x95\x6a\x76\xa4\xfc\xd8\xdc\x70\x2e\xb7\x9d\xfb\x79\x2e\x97\x8b\x88\x37\x8a\xdc\x76\xbc\xe8\xf6\x98\x9c\x28\xc7\xe1\x9f\x19\xb0\x53\x51\xfa\x3e\x11\x47\xb9\x9c\x0a\x78\x17\x36\xc0\x44\x1b\xec\xfe\xfc\x89\x0b\x1f\x7d\x74\x21\xff\x59\xd8\x79\x21\xff\x41\xfe\x4f\x17\x08\x9e\xb0\xe5\xd7\xc3\xf1\xc9\xdf\x4e\xbe\x0a\xe3\x79\xd9\xaf\xa8\xce\x9b\xc9\x37\xa9\x5e\xe4\x47\x63\xa7\xfd\x9c\x52\x89\xf4\xac\x2c\x35\x38\xf3\xdb\xad\xd0\x64\x58\x8e\x65\xab\x9e\xad\xba\x50\xf5\x5e\x15\x99\xad\x02\xb6\x2a\x56\xb5\xa4\x8a\x54\xd8\x01\xa7\x1e\x6b\x91\x9f\x53\x06\x2a\xb2\x16\x97\x5e\xbc\x15\x25\xd3\x13\x06\x1e\x8b\xcc\x73\xfc\xcc\x8d\xc2\x27\xe2\xd3\xe4\x40\xdc\xf1\x25\xb3\x37\x0d\xea\xef\xfc\x44\xef\x76\x18\x29\x86\xb6\xba\xdc\xe2\x8e\xe9\xab\xe8\x5a\xfe\x89\x6c\xc3\x22\x97\x45\x08\xc4\xbb\x1b\x82\x6c\x0b\xd5\x3b\xf9\x60\xf5\xca\x95\x03\x01\xc7\xf2\x35\xc3\xe2\x16\x0a\xf7\xef\x1f\x4c\x68\x98\x3b\x69\x85\xad\x4e\xa8\x39\x39\xe5\x87\x4c\x51\xbd\x48\x85\x36\x0b\x1a\xd5\x7d\x24\x90\x4a\x95\x2e\x23\x25\x45\x19\x14\xea\x8c\x42\xa1\x49\x6b\x46\x34\x7b\x35\xe4\xfd\x4a\x50\x9e\x29\x7c\xf8\x4d\x95\x2e\xa3\xa4\x88\x33\x85\x73\xdf\x32\x5a\x32\x69\x02\x08\xec\x49\x35\x2a\xb4\x19\x05\xb5\x84\x66\x09\x4e\xa1\xcd\x10\xca\x25\x60\x11\x0f\x8d\x88\xf8\x17\x62\xb9\x08\xcf\x47\x72\x92\x32\x8d\xe4\xf8\x69\xbe\xcb\xd4\xa4\x9b\xb0\xe7\x55\xc4\xa9\xc9\x0f\x88\xca\x3d\xe4\xbc\xc3\x77\x5d\x7e\x7d\xaa\xa6\xea\xf3\xf4\x69\x14\x46\x82\x10\x74\xd2\xf4\xdf\xbc\xe1\x3f\x06\x4c\xec\x5f\x39\x2d\x68\x03\xec\x5f\x2e\x71\xc0\x72\x23\xe2\xcd\xbb\xc6\xf9\x17\xc7\x87\xf4\x5f\x98\xbf\x17\x5d\x06\x72\x01\xc4\xaf\x78\xfe\x8f\xc9\xff\x8a\x25\x13\x71\xda\x8c\xd3\xd4\xc9\x94\x68\xeb\xa5\x92\x8d\x29\x5c\x10\x60\xd1\x93\x16\x83\x99\xc1\x35\x11\xf0\x81\xbd\xbe\xab\x7a\xf1\x81\x91\xc6\x03\x7b\xf6\x1c\x68\x1c\x39\xb0\xb8\xba\xab\xde\x7e\xe3\x8e\x1d\x37\x72\xf1\x8e\x80\x0e\xee\x05\x5f\xcf\x75\x7d\xd0\xb7\x61\xf9\x83\xcb\x37\xc0\xe2\xbe\xeb\x7a\x7c\x70\x0f\xe8\x02\x1d\xf1\xfc\xf8\x35\xbb\xcd\x5a\xf3\x27\x37\x21\x04\xf0\xdb\xbc\x99\xd8\x8b\xed\xf3\x7a\xc1\x83\x68\x88\xd3\x02\xbd\x8d\xde\x47\x53\xc4\xe3\x88\xe4\x48\x81\xdc\x47\x9e\x23\x69\x05\x49\xb8\x10\xc2\x52\x3c\x9c\x9b\xc0\x01\x3b\xde\x10\x80\xdf\xde\x7b\x2f\x63\x96\xf2\x69\xf8\xfc\xd3\xc4\xfd\xf4\x69\x54\x23\xce\x5d\x57\x55\xf5\x37\x05\xfa\xa3\xf3\xaf\x66\xf2\x98\x1b\xdc\x94\xf3\x2f\xef\x39\x0a\x0e\xe2\x92\x03\x1c\x0e\x7d\xd5\x5f\x02\x7f\xd7\xfd\x45\xff\xe1\x54\xd6\x38\x9e\x3b\xcf\xff\x4a\x9e\xbb\xa9\xa1\xb1\x29\x15\x85\x94\xa1\x41\xaa\x30\xb0\x18\x44\xc3\xcd\xe2\x67\x2c\xe2\xdd\x49\x91\xea\x24\x53\x13\xe2\x3c\x8b\xf3\xf7\x75\x8d\x76\x4e\xad\x00\xb4\x6d\xfa\xa4\x59\x6b\xde\x7d\x0d\x2c\xc2\xeb\x70\x0f\x5e\x87\xfc\x37\x1a\x32\xf5\xe6\x07\x97\x6f\xc8\x7f\x1d\xaf\xc4\xbd\x78\x25\x10\xa0\xf5\x44\x2f\x45\x90\x83\xb8\xee\x46\xe7\x0e\x72\x41\xe0\xd4\xa0\xb6\x7d\x55\xed\xc1\xc1\x24\xce\x94\xf1\x78\xe8\xaf\x56\xb0\x3a\x8f\x2e\xad\x5b\xa2\xdb\xaa\x3b\xaa\x63\x74\x28\x96\xe3\xff\xf8\x52\x2c\x92\x9c\x00\x39\xc3\x14\xa4\xec\x1a\x45\x0a\x5f\xec\x6c\x92\x75\xd1\x64\x61\xc4\x63\x8f\x30\x06\x9b\xea\x6b\xac\x15\xed\x6d\xcd\x8e\xb1\xcf\xb8\x93\x4d\x73\x63\xc1\xa6\x58\x35\xfe\x81\xfd\xea\x7b\xc4\x1f\x10\x47\x38\xab\x8e\x36\xf9\xea\x1c\x9f\xdf\x4c\xeb\x1c\xe6\x69\x9f\xa4\x7c\xec\xfc\x11\xb8\x93\x1a\xc6\xb5\xe5\x5d\xdf\x46\x48\xae\x2d\x8f\x3b\x4e\x3a\x4e\x39\xce\x39\x28\x82\x3a\xae\x27\xa5\x70\x10\xab\x50\x67\xf4\x48\xf5\xa0\x09\x11\x1c\x41\x28\x08\x14\x1b\xce\xcd\x28\x31\x37\xf1\xa6\x80\x69\x86\x21\xff\xa3\x5d\xfc\x9b\xef\x99\x02\x51\x97\x33\x1a\x30\x9b\x03\x51\xa7\x78\x23\x25\x1e\xf9\xf8\xd7\x74\xa6\x94\x4c\x5a\x4c\x54\x06\xf4\x74\xe1\x1d\xf2\x2c\xfd\x0a\x0a\xa2\x41\x21\x68\x24\xbb\x59\x8a\x52\x07\x2d\x61\x21\x0c\x95\x19\xa4\x8e\xab\x05\xf5\x45\x35\xc5\xa8\x5d\x3b\x58\x23\xeb\xdb\x41\x13\x34\x56\x39\x5a\xd6\x98\x61\x69\x96\x26\x39\x05\xe9\x40\xe9\x34\xce\x1e\xc5\x35\xca\xe2\x5f\x49\xb8\xb8\x17\x93\x06\x5c\x25\x93\x88\x57\x31\x0a\x4b\x20\x35\xa3\x04\xb9\xdc\x4d\x49\xde\x70\xdd\xa2\xc3\x2b\x6e\x5b\xdb\x90\x5a\x73\x64\xf9\xe1\xcc\xad\xd1\x94\xad\xb9\xbd\xcd\x21\x3b\x2a\x7f\x58\x49\xbc\xf4\x9a\x6e\xe1\xc1\xf3\x87\xef\x78\xe5\xd6\x85\xba\xaf\x3c\x42\xfa\x6c\xd8\x5f\xf9\xfd\x1f\xfe\x7f\xcf\x07\xed\x9f\x13\xe7\x31\x0f\x21\x2a\x40\xbf\x8c\xaa\xd1\x4e\xc1\xa0\x33\x6c\x0d\xb0\xac\x87\x25\x14\x1e\xd6\xc3\x3a\x48\x1b\x2e\xac\xd6\x67\x6c\x67\x0a\x2f\x09\x71\x46\x95\xb1\xd9\x6a\xb9\x5a\xf0\x39\x04\x8d\x3e\xe3\x70\xd4\x70\xbe\x9d\xba\x98\x7f\xaf\xff\xa8\xff\x49\xff\xb3\xfe\x37\xfd\x05\xbf\xc2\xef\x47\xd6\x4f\x38\xec\x8a\xf2\xb2\x08\x7e\x22\x69\x00\x51\x95\x60\x85\x12\xe1\xe5\x9c\x59\x3c\xc5\x69\x36\xb2\xcf\xe2\xc3\x11\x70\x9f\xc5\x97\xea\x24\x3b\x20\x90\xe2\xc5\x7d\x4f\x1c\xdf\xf4\xc4\x9c\x39\xcd\x77\x2c\x8c\x0f\xb4\xfb\xe0\xa6\xfc\xad\xb6\x30\xef\x22\xde\xb9\xec\xab\x5b\x90\xaa\x7c\xf1\xc5\xb6\x6b\xee\xa2\x5f\xae\x0f\x1c\x73\x47\x5c\x6d\xc3\x73\xf2\x97\x0e\xbf\xd1\xb9\x4a\x88\x70\x8f\x1e\xd7\xd4\xcc\x5b\x33\xf7\x47\x87\x61\xde\x8a\xc3\x23\x49\x44\xa0\xdd\xe0\x26\xdf\xa1\x8e\xa0\x00\x6a\x42\xb7\x08\x01\xfd\x51\x2b\x58\xad\xd1\x2f\x5b\x58\xad\x9d\xa9\xf4\x91\x4a\xb4\xcd\x08\x46\x63\x0b\xd7\x02\x94\xb7\xea\xf1\x7d\x38\xd2\x7b\x4e\x48\x30\xea\x0c\x42\xcd\xb6\x7d\x1e\xf0\x68\x19\x7b\x25\xcb\x50\xaa\x9a\x27\x90\x0b\x5c\x3a\x9a\x7f\xe2\x82\xea\x3d\x15\x71\x4c\x75\x52\x75\x4a\x45\x7a\x54\x69\xd5\x56\x15\xa9\x42\xb8\xf8\xe3\x45\x1c\xe2\xb7\xb5\x18\xf8\x17\x73\xd2\xfc\xc5\x9f\x89\x4b\x90\x33\xda\x5a\xfe\x78\x0e\xd7\x3c\x89\x7b\x3d\xdc\x64\x93\xf2\x19\x9b\x6c\xd8\x7b\xc6\x28\x6c\x0a\x9c\x22\x11\x0a\x2b\xc2\x4d\x51\x68\x9a\x91\x1c\x71\x36\xe0\xd9\xbf\x76\x6f\x6c\x73\x7b\xfb\xb5\xd1\xfd\x57\x7f\xca\x13\x0c\xf8\xf6\x8e\xee\x8f\x5e\xdb\xde\x7e\x5d\xfd\xde\xd1\xbd\x9e\xc0\x6d\xc1\xae\x15\x49\x7e\xd5\x9c\x50\x68\xce\x2a\x3e\xb9\xa2\x2b\x48\xbc\xd1\x76\x6d\x6c\xff\xda\xfd\xde\xaa\x2a\xef\xfe\xd1\xfd\xd1\x2d\xa5\xa1\x55\xde\xbd\xa3\x7b\xeb\x37\xb7\x27\x57\x74\x85\x42\x53\xbf\x85\x8a\xbe\x54\x6a\x11\x7d\x1a\x59\xd1\x3d\xc2\x50\xdc\x0e\xac\x49\x6b\x7d\xdc\x02\x16\x8b\x96\x52\xc2\x97\x09\xf0\x10\x40\x10\xf7\x23\x40\x0a\x52\x33\xf8\x80\x19\xcc\x1c\xab\x85\xdb\xb4\x80\xb4\x9c\x56\xd0\x92\x0a\xad\x5a\x3f\xca\x2a\x58\xc6\x38\x6a\x22\x91\x69\x2f\x7b\x94\x25\xe2\x26\xb8\x28\x1a\xa2\x1e\x13\xc1\x9a\x58\x13\x68\x8c\x96\x62\x94\xae\x45\xb4\x00\xb6\xcb\x10\x07\xd8\xb5\x8a\xc3\x76\xdb\x79\x3e\x37\x91\x4c\xb6\xe4\x92\xb1\x5c\x8e\x6f\x69\x11\xd7\x0f\x07\x23\xa5\xc8\x1d\x36\xeb\x2d\x3e\x5c\x39\x26\xfe\xe1\x81\x27\x78\x18\x7c\x36\xbf\xf7\xbd\xfc\x1b\x50\x9f\x7f\xe3\xeb\xd2\x97\xdf\xe5\x0f\x9e\x23\xde\x20\x7e\x31\x89\x0e\x3f\x7c\x38\xff\x11\x30\x87\x1f\x3e\x4c\x62\x5c\x28\xa2\xec\x0c\x50\xa0\x16\x21\x88\x54\x10\x57\x09\xaa\x6d\xaa\x7d\x2a\x8a\x60\x1e\x27\x91\x82\x53\x08\x8a\x7d\x8a\x73\x0a\x5a\xa1\xa0\x48\x8a\x64\xa4\xb3\x40\xe4\x18\x24\x39\x2e\x9e\x08\x06\xf9\x54\x10\xcf\x85\xcb\x1f\xe4\x1d\x97\xff\x2c\xea\xae\x5d\x85\xbf\x92\xc3\x8c\x07\xcd\x47\x83\x68\x97\xb0\x90\x5e\xae\xec\xef\xf6\x85\x16\x75\xb7\x77\xd7\xd4\x70\x05\x1f\x9c\xf4\x9d\xf2\x11\xbe\xd5\xe7\x56\xc3\xb3\xab\xa1\xbb\x1b\xd9\xba\x95\x4a\x1c\xc0\xc3\x37\xe9\x73\xe8\x22\x7a\x1f\x31\x4a\x34\x14\x5a\x44\x2f\xb7\x2d\x5f\x54\x43\xe9\x9a\xb2\x51\x8b\x39\xab\x03\xe9\xfc\x14\x65\xcc\xc0\x03\xf7\xe2\x70\x6e\x7b\x32\x19\x9b\xe0\x70\x7c\x23\x97\x13\xbf\x37\xb6\x60\x17\x6e\x8b\x5c\x2c\x1d\x85\x59\xef\x7a\x52\x49\x52\x59\xa1\x61\xf9\xed\x50\x94\x3f\x8f\x5c\x55\x19\xd6\x93\x87\x9d\xf5\xad\x9e\x85\xcb\xf0\x25\xf0\xb3\x99\xe6\xae\xdb\x7b\xae\x5e\x6f\x6f\x19\xe9\xce\x6c\xef\xab\xb5\xd7\x34\x54\xcc\x5f\xd4\xb6\xf9\xc1\xd1\xcd\xd2\xbd\x31\x32\x3f\xd7\x64\x33\xf0\xc3\x8b\x16\xec\xc8\xd6\x1c\xaf\x48\xaf\xcb\x04\xcc\x35\x3e\x8b\xb3\x6b\xf3\x80\x23\x16\xb2\x91\x35\xfc\x55\x42\x3d\x1b\xba\x7e\x69\xc7\xda\x79\xc1\x6a\xef\x91\x8a\x70\x5b\x8b\x2b\x5a\x17\x73\x57\x74\xf5\xad\xe9\x6c\x58\x36\x2f\xc1\x85\xb6\xf4\xf5\x6c\x5d\x5c\xed\xf3\x3e\xcc\x56\xda\xf4\xf6\x30\xef\x72\xd7\xd7\x27\x3c\x9e\xce\xbe\xb1\x55\xc1\x74\x6b\x53\x25\xab\xab\x8a\x36\xfb\x43\x42\x5b\x4b\xa5\xd2\x53\xdf\x2a\xbd\x53\x9e\xd6\x92\x9b\xe8\x4b\x48\x83\x1c\x28\x25\xf8\xb4\xb7\x3c\x69\x06\xf3\x39\xe6\x16\x71\x4d\x05\x94\x45\x14\x83\x58\xf2\x4e\xdb\x09\xd5\x05\x15\x11\x57\x01\xde\xb3\xfc\xdb\x58\xe4\x26\x9c\xff\x89\xd3\xa7\x1a\x1a\xf9\xa4\x55\xf2\x51\x06\xa7\xf9\x4a\xf9\xe6\xea\x70\x6b\x6b\xb8\xba\x19\x6e\x6c\xae\x36\x05\x9c\x5c\x6b\xa8\xba\x99\xde\xd1\x18\x4f\xa4\x52\xc9\x64\xaa\x31\xae\x75\x84\x5c\xa9\x64\x12\x21\x12\x8d\x15\xde\x61\xe6\xe1\x73\xa2\x0b\x2d\x43\x9b\x84\xb9\xf4\xf7\x9c\x2c\xeb\x77\xfa\x9d\xfe\xd0\xa2\xe7\x51\x03\x9c\x6b\x80\x86\x15\x73\x9e\x0f\xa9\x5f\xb6\xa0\x97\x3d\xac\xc5\x63\x89\x59\xf6\x5a\x8e\x5a\x4e\x58\x18\x25\xf2\x70\x9e\x51\xcf\x36\xcf\x3e\x0f\x6d\xf1\x58\x3c\xf5\x3d\x2f\xb5\xf5\xbf\x54\x4f\xa1\xf4\x44\x4c\xaa\x11\xcd\x0d\x63\x74\x01\x88\x4d\x70\x3f\xcf\x6d\x97\x7e\x66\x10\x4f\xb9\xf2\xcc\xe9\xb2\x9b\xf0\xd4\xbb\x07\xa9\x16\x90\xb2\x48\x75\x09\xd4\x4c\x25\x43\xee\xee\x18\x16\x7c\xee\x8e\x91\xb9\xb6\xc6\x96\x66\x87\x3d\x91\x6a\x0f\xac\xbf\x7f\x1d\xdf\x78\xcd\x03\x63\xe9\x4f\xb7\x75\x36\xac\xb9\xfc\x4c\xe3\x9a\xdb\xbe\x78\x6e\xe3\xc6\x73\x5f\xbc\x6d\x4d\x63\xf9\xf7\x5b\xd6\x3d\xf9\xbb\x83\x07\x7f\xf7\xe4\xba\xe2\x57\xca\x5d\x77\xd5\x4d\x0b\xfb\x6e\x1a\x88\x28\xb4\x06\xd5\x01\x8d\x51\xaf\x98\xf3\xc9\xc7\x37\xac\xfb\xe2\x4d\x73\x7d\xee\xbd\xce\x8a\xfc\x33\x33\x88\x1c\x5e\x9b\x4a\xad\x3d\xfc\xc5\x73\x1b\xcb\xa9\xac\x7b\xf2\x77\x92\xaf\x6c\x1e\xc9\x11\x73\xe8\xf3\xa8\x12\xd5\xa3\x3e\x21\x56\x0f\xec\x5b\xc8\xcd\xb9\x09\x77\x8c\x8d\x79\x62\x4b\x62\x7b\x63\x4f\xc6\xe8\xaa\xb7\x34\x36\xdb\xa8\x06\x34\xd1\xfa\x5f\xb2\xac\x13\xc2\xbf\x44\xcc\x39\xd3\x2f\x9d\x3f\x47\xe9\x09\xe7\x7f\xbe\x30\xd1\x82\x6b\xd2\xb8\x17\x73\xc9\x18\x37\x91\xe3\x7e\x9c\xc3\x91\x37\x08\x4f\x0b\xc8\x86\x4a\xf1\x58\xab\xc5\x40\xe2\x40\x2c\x8f\x83\xb2\xf0\xeb\x0a\x63\x38\xd6\x1c\x88\x64\x1a\xdc\x77\x1c\xbd\xba\xa3\x39\x3e\x58\x1b\xe7\x77\xb6\xef\xb9\xf1\x65\x7e\x5e\x8d\x31\x59\xeb\x6f\x8d\x38\x48\xf7\x80\x35\xe0\xd0\x39\xf9\xc5\xfc\xfa\xcd\x34\xe5\xc9\xb4\xb8\xad\x63\xce\xaa\x4d\x9f\xcc\xb7\x42\x0b\x69\xac\x8c\xb8\xf9\x7a\x4b\x5d\x57\x5d\x02\x11\x68\x00\xed\x20\xef\x26\xcf\x23\x06\xe9\xd0\xa8\x60\x20\x28\xdd\xef\xd5\x59\x6a\x94\x22\x28\x35\xa5\x66\x34\x2a\xf1\x24\xf2\xa9\xb4\x19\x15\xcb\xb2\x27\xd8\x27\x59\x92\xf9\xfd\x09\x12\x48\x06\x91\x3a\x85\x5a\x4d\x93\x24\x68\x69\x25\xa0\x18\x1f\xe3\xa5\x9a\x06\x0c\x77\x82\x4b\x80\x44\x93\x22\x92\x94\x23\x35\x13\x52\xb0\xdf\x46\x9a\x14\x10\x94\xbe\x0c\x40\x6a\xe7\xbb\xef\xee\xcc\xbf\x02\xf7\x41\xe3\x27\xfe\xf0\x87\x4f\xe4\xbf\x4f\xd4\xc0\xc3\x7d\xf9\x47\xf2\x8f\xf4\xc1\x83\xae\xa9\x6f\x8b\x58\x03\xa4\x1b\xd1\xa8\x45\xa8\x22\x1e\x07\x05\xa7\x80\x7b\x29\x38\x42\xc1\x2e\x0a\x96\x53\xb0\x90\x82\x66\x0a\x8c\x14\xa8\x28\xa0\xa8\xaf\xd2\xdf\x40\xe9\xb2\x1a\x28\xb9\xa0\x1d\x6b\x6b\x8a\xb8\xe7\xf2\xdf\x49\xf7\xe4\x6f\x61\xff\xbd\x08\xa1\x42\xa1\x58\xff\x6f\x64\x10\x87\xdb\xdd\x14\xf7\x8e\x12\x55\xa2\x56\xd4\x87\xbe\x2b\xec\x79\xc4\x3a\x6e\x7d\xc1\x4a\x8e\xdb\x5e\xb0\x11\x36\x2b\x0c\x58\xf4\x36\xbd\xf5\x7b\x16\xbd\xd9\x62\xd1\xeb\x55\xc8\xf1\x3d\xa7\xea\x7b\x94\x85\x42\x4e\x40\xce\x73\xce\x8b\x4e\x52\x71\x94\x02\x27\xe5\xa4\x3c\xf3\x9f\x47\xf5\x70\xae\x1e\xea\xb3\x6d\xcf\x7b\xf4\xf6\x97\x11\xb2\xba\xac\x16\xa7\xf2\x65\x17\x72\x02\xeb\xf4\x38\x63\xce\xbd\xce\xa3\xce\x13\x4e\x46\x89\x70\x0c\x67\x9b\x6b\x9f\x8b\x76\xba\x9c\xae\x90\xf0\x52\x83\xa9\xf7\xa5\x10\x25\x1b\x34\xd2\xbe\xdb\x2e\x2e\x25\x6f\x30\xb6\xe0\x83\xaa\x6c\xff\xe1\x24\xa1\x16\x71\x5b\x26\x0d\x2d\x87\xb8\x08\x87\x9e\x3b\x44\x47\xb8\x17\x20\x97\x88\xe7\x40\x72\xc0\x46\x80\x16\x35\xae\xd5\x26\x6a\xd6\x00\x19\x10\x4f\x8e\xa4\xf5\x7f\xda\x93\xc4\xaf\x33\x43\x4b\xae\x5a\xd5\x0d\x77\xb9\xea\x5b\x3c\x73\x53\xb6\x5a\x9f\x5a\xfd\x8d\xd7\x46\x3e\xfb\xdb\xc7\x1e\xfe\xf8\xf7\xff\xf4\x6e\x24\x51\x66\x7e\x6f\xdb\xfe\xf8\xc2\x96\x6a\xdd\x75\x2b\x82\x3d\xcd\x06\x03\x8c\xe6\x4f\x92\x7b\x3e\x95\x7f\xfe\x7f\xb1\x0f\xa1\xf0\x11\x63\xa6\x18\xe6\xe4\x3f\xce\xcd\xa0\x98\x8f\x3f\xa0\xb4\x8c\x59\x42\x86\x44\xbb\xc9\xe5\xc4\x9f\xe8\x57\x70\x5e\xee\x5c\xa1\xae\xf2\xcb\xea\x9a\x13\x35\x60\x7e\x3c\x8e\x04\x44\x20\xc7\x13\x1c\xeb\x65\x89\xb7\xd8\xf7\x59\x62\x2b\x0b\x88\x15\x3f\x92\x0c\xcb\x06\x9e\xa0\xa5\x92\x33\x5c\xe0\x26\x03\x23\xfc\x58\xaa\x67\x9e\x56\x4c\x36\x73\xbd\x76\x27\x97\xed\xe8\xea\xda\xb1\x3c\x99\x5c\x2e\x7e\x5d\x96\xdc\x5d\xd9\xd0\x5d\x5d\xdd\x9d\xaa\xac\x4c\x89\x5f\x1b\x2a\xa9\xa3\xa5\xff\x7d\xfd\xb2\x44\x62\xd9\xf5\x5d\xe1\xf9\x0d\x95\x95\x0d\xf3\xc3\xd5\x3d\x29\x8f\x27\xd5\x83\xf9\x5e\x8f\x90\x8c\xaf\xc1\xa2\x56\xc1\xc7\x19\x80\x55\x2a\x19\xd5\xe3\x5a\x80\x72\x9c\x0d\xdd\x57\xb5\x65\x50\x1b\xb8\xe0\x15\x87\x8f\x70\xec\x65\x26\xe4\x86\x78\x97\x2e\x83\xdd\xc8\xef\x21\x1f\x9a\x82\xde\xc8\x7f\x74\xef\xbd\x08\x50\x9c\xc8\x10\xdb\xe8\x97\x90\x15\x21\xf0\xa5\x9a\x3a\x25\x85\xa4\x08\xcb\xe7\x12\x0b\x3e\x62\xdb\xe4\xb9\x8b\xfb\x9a\x9b\x85\xec\xc6\xec\xbe\x63\x37\xdd\x9a\xb9\xf5\x7e\x38\x46\x64\xb6\xfd\xe6\xd6\x8d\x82\x20\xac\x1c\xdd\xb6\x6f\x5b\xf6\xd8\xb1\x93\x08\x90\x97\x68\x26\x36\xd2\x2f\x21\x3f\x42\x20\x1d\x6a\xe1\x94\xb5\x28\x8c\xa9\x62\x04\xa3\x48\x1b\xce\x9c\x7a\xec\xb1\x63\x1b\x6f\xdd\x36\xba\x72\xe3\xe8\xe8\xe8\xca\x95\x82\xb0\x71\x63\x66\xdf\xfd\xb7\x1e\xa3\xec\xf1\x93\xb7\xde\xda\x7c\x6b\x26\x9b\xc9\x64\xb6\x65\x32\x42\x73\x66\x74\xf4\xa6\x8d\xf7\x5f\x91\x7b\xc3\x20\x7a\x1f\xab\x1d\xd1\x12\x5a\x14\xcb\x39\x5f\x95\x72\x6f\x3a\xc9\x26\xde\xa2\x27\x15\x01\x38\x6c\x8d\xc5\x6a\xb9\x9f\x72\xe9\xc5\xfd\x81\x5d\xd4\x07\xee\x45\xfd\xfd\x7e\x8b\xab\x7f\xe5\x55\x15\x72\x5c\x2f\x6f\xa6\x8c\x54\x2f\x72\xa3\x26\xc1\xaf\x53\xf5\xa8\x97\x79\x38\x8f\xb7\x78\x1a\x9a\xdd\x3d\x15\x4b\x2b\x9d\x2e\x32\x6b\xb0\x6a\x2c\x15\x2a\x56\x34\x21\xe5\xac\xfa\xa4\xec\x76\x85\x29\x57\x6b\x20\x1c\x90\xec\xe9\xa9\x14\xf3\xb1\x4d\x5b\x07\xae\x9b\x5b\x71\xfa\x6e\x97\x3a\x7e\x6c\x43\x66\x53\x00\x08\x02\x4e\x9f\x86\x43\x53\x4e\xd7\xbb\xaf\x5a\x1a\xad\x0d\x55\x07\x96\xd5\xe6\xcf\x31\x8d\x08\xd0\xf6\xfc\x65\x6a\x3d\x63\x46\x26\xd4\x24\xf8\xa8\x07\x10\x1d\xa7\x05\x3a\x4b\x53\x0c\x4d\xeb\xe0\x01\x64\xe1\x2c\x80\x74\x9c\x8e\xd0\x91\x46\x44\x23\x14\x4b\xa6\x9f\xc3\xf7\xe3\x1f\x4b\x59\x11\x13\xc5\x14\x01\x03\x53\x3a\x8c\x7d\xd4\xfa\x9b\x2e\xec\xea\x58\x36\xf2\xe0\x96\xf6\xae\x1b\x1f\x1d\x23\xf8\xfc\x65\x66\xd7\xdf\x0f\x91\xbc\x91\xbf\xe1\xdc\xed\x77\x7f\xef\xa6\xa4\xb4\x1e\x77\x13\x19\xb8\x93\x1c\x46\x26\xc4\x0b\x4e\xce\x22\xa1\x9d\x50\xff\x3d\xd4\xc9\xdb\x32\xd4\xc9\x95\x3b\xe5\x8a\x92\x63\xe2\x8d\x59\xee\xb8\x81\xbc\x19\xee\x47\x08\x39\x50\x8b\xe0\x31\x9b\x4c\x96\xbd\xc6\xa3\x46\xc2\x68\x64\x74\x9f\x46\x2e\xc6\x69\xbc\xdd\x22\xa8\xf4\x19\x8b\xc5\xa4\xbe\x83\x44\xb1\x89\x58\x4b\x2c\x22\x9e\xa8\xdc\x8f\x65\x5c\x2d\x1c\x36\xc5\x26\x93\xe4\x08\x93\xb2\x86\x9b\x78\x45\x25\x09\xf7\xdf\x71\xaf\xb5\x9e\x65\x13\x5c\x4f\xd6\x19\x4d\x07\x07\x77\xb5\x88\x27\x66\x7e\x62\xcd\x66\x86\xdc\x4c\x92\x91\x84\x3d\xe0\x34\xa9\x4e\xed\x50\x3a\x6b\x5a\x45\x5e\x04\x22\x03\x67\xe8\x33\x48\x8d\x10\x36\xb4\x1b\x9a\x18\x16\xc2\x10\xbf\xf5\x98\xb2\xda\x3b\x9a\xa1\xcf\x5c\x3e\x46\x28\xb7\x6d\x8b\x7b\x33\xa3\x78\xcf\xce\x21\x39\xe2\x08\x7d\x1e\xc7\xf8\xa2\x5f\x77\xbe\x25\xa5\x3e\xaa\xd8\x0c\xf2\xb1\x3e\x30\xbf\xa5\xf6\xda\x7e\x49\x9f\x73\xff\x92\x95\xec\x81\x09\xe0\x7e\x2c\x6a\x95\xc8\xff\x10\xe1\x23\x8e\xd4\x2c\xde\x32\x2f\xbd\xa9\x2f\x52\xb3\x68\xcb\xbc\xce\x6b\xfb\xea\xf2\xad\x0b\x97\x2f\x5b\xb8\x70\xd9\xf2\x85\xd4\x96\xab\x3e\xb5\x2a\x16\x5b\xf5\xa9\xab\xae\xda\xbf\x32\x1a\x5d\xb9\xff\xaa\x1b\x77\xed\xba\xf1\xa6\x1d\x3b\x44\x7e\x96\xa2\x1d\xe4\xbd\xf2\xf9\xbe\x5c\x88\xc9\x87\xb8\xe2\xf7\x14\xa1\x26\xd4\x04\xa9\x51\xe9\x91\x78\xa0\x73\xa4\x97\x14\x48\x52\x3c\xd4\x19\x44\xaa\x49\xf5\xb4\x73\xbd\xa5\x43\x34\xef\x8a\xe7\x7a\x6e\x02\xbb\x0a\xb0\xc9\x37\x81\xaf\x43\x61\x13\xd9\x04\xb4\xf4\x85\xbc\x37\xff\x7d\xf1\x30\x87\xc6\xfc\xc6\xfc\x2b\xe2\x01\x0f\x29\x42\x9f\x5f\xd7\x07\xab\x61\x75\x5f\x7e\xad\x6b\xea\x5b\xf1\xec\x15\x10\xa2\x8f\xd0\x67\xb8\x10\xda\x8d\x10\x17\x26\xd7\x10\xbd\x08\x19\x14\x87\x82\xc4\xe5\xc9\x6f\xa1\xb8\xe0\x26\x09\xab\x9d\x24\x9e\xb5\xc2\x51\x2b\xa4\xad\x60\x05\xc1\x00\xc8\x00\x06\x24\x20\x40\x86\x5c\xca\x90\xc3\x7f\x73\xa9\x14\x4a\xa7\x52\xf8\x3c\xaf\x47\x88\xfa\xac\x44\xf3\x0f\xc8\xa0\x20\xd7\x10\x29\x84\x50\xb5\x60\x27\xcc\x76\x02\x99\xc1\x0c\xa7\x0c\x22\x19\x03\xda\x86\x40\x22\x53\xa4\x23\x12\x11\x69\x40\x06\x21\xfa\x35\xfa\x34\xe6\xe8\x31\x89\x23\x32\x3d\xf9\x2d\xd4\x2e\x84\x49\xa2\xd9\x4e\x12\xdb\x9a\x21\xdb\x0c\xcd\x30\xce\xc3\x23\x3c\x7c\x9a\x87\x31\x1e\xb2\x3c\xc4\x79\xf0\xf2\xc0\xb3\x8b\x20\x67\x90\x6d\x0f\x4c\x5a\xe2\x8e\x40\xf3\xf2\x37\x92\xf3\xa8\x61\x5c\xf3\x3c\x4f\x30\x16\x6b\x9e\x35\xe6\x0e\xb6\x03\x94\x9a\xee\x0a\x51\x5e\x38\xd6\x95\xa9\xd0\xd8\xc2\xe1\xfa\x07\x9b\x38\x13\xd7\x6f\x43\xb1\x09\x3e\xfd\x76\x32\x66\x6c\x81\x58\x64\x62\x38\xc7\xbd\x36\x55\xf9\x2c\xd7\x38\x17\xab\x15\x6d\xb8\xc8\x81\x90\xeb\xa1\x3b\x60\xa6\xbb\x89\xc8\x72\xe1\xae\x62\xe5\x73\xd3\xd2\x7b\xe7\x0b\x03\x4f\xaf\xc9\xdd\xb3\xa1\xd9\x95\xea\xc7\x95\xcf\x67\xaf\xf4\x45\x05\x5b\x87\xfa\x17\x4d\x55\x3e\xf3\x81\xbb\x6a\x5b\xf9\xd1\xdb\x56\xce\xdb\x88\x2b\x9f\x3b\xe7\x46\x4c\x10\x9b\xb1\x91\xa5\x26\x74\xd4\xcf\x14\x3b\x8c\x21\x54\x25\xae\x20\x9a\x5b\xf8\x0e\x0c\x20\xcb\x38\x61\xa1\x43\xc4\x99\xc2\x43\xe3\x2e\x0b\xa5\x08\x42\x24\x85\x22\x29\x34\xcb\xf8\x1b\xd0\x1d\x30\x80\x4c\x82\x86\xf0\xd1\x21\x62\xb3\xc5\x35\x35\x1a\xcd\x32\x1e\x56\x21\x4f\x39\xfd\xc2\xb8\x7b\x36\xfa\xa9\xd2\xf8\x31\xc4\xc8\xf4\xdd\x74\x88\x80\xca\xba\x59\xe9\x47\x4a\xfc\x6c\x42\x3e\x18\x40\x36\x41\x47\x12\x95\x74\x88\x24\xc0\x52\x23\xfd\x86\xf8\x2b\xd3\x7e\x87\x92\x7f\x87\x81\xb5\x9e\x3d\x28\x21\x78\x49\xe2\x3d\x27\xbc\xe9\x84\xac\x13\x04\x27\x78\x9d\xc0\x89\x96\x22\x38\x49\x02\x79\x2c\x45\x22\x25\x81\x91\xb0\x24\x0b\x79\x84\x98\xe5\xb8\x56\xc4\x84\x3e\x2d\xd4\x32\x26\xb5\x7e\x10\x0c\xc0\x91\x94\xe9\x4b\x26\xa8\x32\x35\x98\x96\x9a\x48\x0e\xc0\xac\x05\x13\x68\xb5\x60\x22\x69\x25\xda\x60\xa1\xe8\x33\x85\xf7\x05\x2f\xad\x32\x8d\x30\xe4\x08\xa7\x1b\x51\x2f\x51\x03\xab\x7e\x52\x4d\x28\x39\x35\xa7\x66\x48\x4a\x3f\x42\xe3\x22\x91\x89\x58\x5a\x72\x89\x6d\x17\xcd\x46\x6c\x50\x36\xf3\xdc\xaf\x92\xc5\x12\xf2\x5c\x6e\xcf\xa1\x17\x5e\x30\x80\xe4\x19\x91\x6a\x3c\xc9\x00\x94\xea\x3c\xc1\x67\x08\x30\xcb\x27\x95\xf9\xe0\x2b\x67\x89\xa3\xe4\xcb\x93\xcf\x13\xd6\xc9\xdf\x11\x1d\x1f\xef\x84\xbb\x37\xe3\x2a\x65\xb9\xf4\x13\x5e\x14\x37\x91\xb8\x3e\x7b\xf2\x66\xea\x7e\xfa\x15\x63\x08\x85\xf0\x9a\x7e\x12\x2e\x23\x84\x34\xa7\x61\x49\x6d\x95\xdd\x8b\x97\x1f\x8f\xc3\xb5\x6c\xf8\xdd\x56\xcb\xb2\xf3\x2d\xfc\x6e\x41\x4b\x87\xe0\x4c\xe1\xbb\xe3\x46\x2d\xa0\xb2\x77\x3b\x73\xfc\x0d\x28\x2d\xbd\x5b\xb0\xd3\x21\xe8\xd5\x1a\xa7\x46\xcf\x46\x1f\x56\x15\xfe\x58\x4e\x7f\x72\xdc\x3c\x1b\xfd\x48\x89\xfe\xa6\xc2\x5f\x24\x59\x20\x40\x94\x36\x00\xad\x57\x1a\x5f\x26\x0b\x9d\x08\x11\x63\xf8\x19\x75\xd2\x1c\xf2\xdf\x2c\x7f\xc6\x63\x33\xe7\x30\x80\x10\x71\x5b\xd9\xf8\x1b\x0a\x37\x95\xcd\x61\xd3\x15\x73\x30\x20\x44\x7c\x69\x6a\x3c\xac\x2a\xb0\xf2\x78\xf1\x01\x44\xf9\x0c\x90\xac\x6b\x89\x1b\xf1\x1c\xea\xe4\x39\xe8\xa6\xcd\x01\xcd\x9c\x03\x22\x50\x4c\xae\x51\xe6\x90\x07\xe5\x84\x56\xa7\x53\x6f\x18\x52\x6e\xf0\x79\x7d\x60\xaf\x18\xd4\x73\x1c\xe8\xc7\xbc\x2e\x6e\xc4\xce\x22\x60\x51\x1a\x6d\x45\x4f\xa2\x37\x51\x01\x31\x4a\x24\x38\xdd\x19\x84\x88\x8a\x51\xbd\xd1\x36\x4a\x94\x2a\xc9\x23\xc3\xb9\xed\xbc\x94\x94\x9c\xc4\x6e\x71\x29\x27\x28\x11\x37\xf1\x52\x55\xb3\x45\x2e\x71\x0e\x04\xa5\xf2\x66\x51\xd2\x78\x2f\x8a\xdd\x2f\xd5\x36\xcb\x85\xce\xf7\x53\x4a\x5c\xe4\x0c\xd9\xfc\x29\x5c\xe8\x4c\x06\x89\x3b\x57\x7f\x33\xff\xc1\x29\x5c\xef\x4c\x1c\x18\xbd\xeb\x47\xb7\xcd\xcd\xeb\x3f\x9f\x77\x43\x95\xf4\xfe\x68\x3d\xde\xfb\x09\x79\xef\x1f\x91\xd7\xca\x4b\x87\x40\xed\x8b\xa9\xa7\xaf\x15\xae\xe5\xc3\x6b\x9b\x94\xde\x1d\x5a\x2a\xe9\x96\x6a\xac\x5b\xbe\x3c\x1e\xad\x56\x97\xbf\xbb\x99\xe3\x6f\x00\x42\xd6\x2d\x0d\x74\x88\x58\x59\x1d\xfd\xef\xe9\xc3\x2a\xf4\x84\x3c\x5e\x7c\x00\x1d\xaf\x9e\x75\x7c\xaa\x34\x7e\x0c\xed\x91\xf8\x89\x63\x7e\xde\x1f\x4f\xa4\x67\xe1\x27\x52\xe2\x67\x13\x7a\xbc\xa8\xbb\x12\x58\x77\x55\xb7\xab\xa7\xbf\x6b\x40\x77\x40\x3d\xf9\x33\x6a\x37\xd2\xa0\x43\xdf\x46\x4c\xe1\xfd\x6f\x98\x6d\x19\xe6\x4c\xe1\x2d\xc1\xce\x1a\x33\x88\x33\xdb\x32\xc8\xcb\x1a\x33\x2a\xf1\x3b\x95\xf8\x1d\x79\x46\x1a\x44\x8a\x83\xe2\xac\x31\x23\xe8\x40\x41\xd3\xa4\x06\x20\x4b\x02\xa9\x54\xab\x29\x82\xf0\x22\x40\xc8\x8b\xb2\x68\x1b\xda\x87\x4e\xca\x6e\x45\x15\x83\xbe\x81\x1c\xe9\xe1\xdc\xf6\xa4\x81\x4f\x1a\x78\x88\xe5\x78\x03\xfe\x93\x4b\xc4\x51\x24\x12\x89\x80\xf8\x8f\x0a\x9a\x54\x60\x53\x81\x42\x05\x61\x78\x25\xff\xdd\x6b\xa0\x03\xe6\x6c\xcc\x3f\x0b\xe9\xf5\xf9\x67\xf2\xcf\x6f\x20\xde\x80\xf4\x35\xf9\xef\x42\xe7\x86\xfc\xb3\xf9\x73\xeb\xa1\x23\xff\xbd\x0d\x52\x1e\xeb\x9e\xc2\x38\xbd\x9d\xbe\x8c\x9c\x48\x7c\xe3\xab\x85\xd6\x1a\x4f\x6d\x25\xe5\x0a\x0f\x81\x43\xa3\xa7\x0c\xd4\xcc\x4a\x42\xd7\x90\x61\x7d\xd2\x53\x53\x59\x4b\xd5\xfb\x47\x1c\xa0\xd7\x50\x2a\xa7\x95\xaa\x1f\xd1\xaa\xe4\xd2\x34\xa3\xad\x65\xc2\x60\x6b\x99\xaa\x2d\x34\x48\x3f\x48\xc4\x41\x61\x15\x85\x56\x3c\x77\xc3\x8a\x70\x53\x68\x0a\x28\xa0\x09\xcc\x56\x9b\x8c\x97\x41\x73\x61\x90\xa2\xb2\xb4\x79\xf5\xd0\x70\xff\xc9\x3f\x3c\xf8\x9d\x83\x7d\x87\x07\xd7\x0c\x2d\x7a\xf8\xfd\x2f\x0c\x7f\x6e\x4e\xf6\xf2\xb7\xa2\x71\x62\x6e\xfc\xfa\x9e\xeb\x1f\xdd\xdc\x40\x6e\x5a\x39\xf9\x4c\xec\xfa\xf9\xd7\xff\xdb\xb5\x49\xfa\x89\x7b\xae\xce\xff\xfc\x5b\xb8\xa6\xb3\x67\x6f\xdf\x9d\x63\x50\xfb\x0c\x2e\x33\xac\x0d\xed\xbd\x3c\x71\xe0\xf5\x3e\xf2\x6b\x6e\x6f\xff\x7d\xff\x71\x1b\xc0\x7d\x97\x97\x56\x54\xf6\x3f\xf0\x53\x2c\x33\xb8\x5e\x0c\xcb\x58\xb3\x2c\xc3\x1d\x92\xfe\xb1\x63\xfd\x73\x6e\xbc\xd2\xae\x29\x97\x99\x99\xe3\x6f\x40\xdf\x93\xf7\x48\x15\x1d\x82\x8c\xbd\x52\x33\x5d\x26\x67\x8c\x87\x55\x68\x57\x39\xfd\xc9\x71\xef\x6c\xf4\x23\x25\xfa\x9b\xb0\x0c\x63\xfd\xe3\xc3\x3a\xd4\x5e\xa7\x99\xa9\x43\x71\x8d\x0e\x7e\x46\xbb\xcc\x53\x42\xe6\xc9\x42\x87\xe0\x6a\x15\xab\x20\xa6\x78\x2a\xab\x67\xe5\x90\x0b\xb5\x0b\x3e\xdb\x10\xda\xe0\x3e\xe1\x06\xce\x0d\x06\x8d\x62\x50\x39\x56\x61\x18\x65\x5c\xa3\x1a\x46\xc3\x68\x14\x72\x11\x2b\x0e\x01\x60\x77\xa6\x94\x22\x3b\x95\x6f\x87\xab\x58\x79\x0b\x3f\x6b\x1d\xeb\xd9\x53\xd3\xeb\x58\x49\xfd\xd0\x63\xfb\x17\xe7\x9f\xa7\x4f\x5f\x2e\x15\xb2\x1e\xbd\x15\xdf\x29\x0b\xef\x50\x3b\x19\x0f\x5a\x88\xb6\x08\x19\x45\x77\x34\xd5\x83\x58\x87\xc7\x11\x73\x90\x0e\x41\x67\xca\x8c\x44\xb7\x46\x09\x16\x57\x41\x90\x4a\x47\x14\xa1\xa8\x83\xec\xaa\xea\x31\xac\x58\xcc\x2d\xf6\x2e\x3e\xb7\x98\x14\x7a\xba\x96\x2e\xaa\x52\xa4\x48\x6b\x6b\xb6\x07\xba\x2c\x9e\xac\xd3\x2a\x25\xf0\x63\x27\x7c\x31\xe5\xc7\x88\x4f\xed\xe1\x5c\x2e\x82\x9d\xb3\x12\xf6\x4b\x99\xa3\x7d\xd6\xfc\x2b\xaa\x04\xbc\x66\x08\x14\x01\xa2\xc8\x3f\x45\xd2\x0b\xd3\x11\x7d\xb8\xbb\xa5\x79\x65\x87\xaf\x79\xdd\x1d\xcb\xd6\x1c\x49\x39\xbb\x32\x8b\x82\xcd\xfd\x0d\x76\x43\x24\xd3\x9c\x5e\x96\xb2\xd6\x74\x66\x3a\x6b\x7c\xed\x57\xf1\x89\x95\x73\xc2\xa7\xd3\xdb\x1f\x5a\xbd\xfa\xfe\xcd\xed\xd4\x3b\x2d\xab\x16\xb4\x37\x35\x56\x5a\x7c\xe1\x44\x28\x98\x19\x18\xed\x5c\x71\x73\x7f\x58\x4e\xd0\x72\xd4\x0b\xd5\x55\x6d\xcd\xad\x81\xea\x79\x73\xbb\x6b\x1b\x97\xa4\x1b\x5b\xe7\xd6\xd5\x76\xd6\x98\x4c\xf1\xab\xba\x3e\xee\xa3\x4e\x6d\xbc\x63\x59\x30\xb4\xe8\x13\xf8\xdd\xe3\x3a\x18\xc6\x67\x0c\xa1\x79\xa2\x2d\x85\xe6\x7e\x06\x89\x1a\x8f\x37\x88\x1a\xef\xed\xf1\x16\x5e\xeb\x9f\x26\x8f\x33\xc7\xdf\x90\x42\x58\xa3\xa6\x0d\x21\xe2\x20\xdf\x32\x35\xfa\xca\xb1\xb0\xea\xbf\xa4\xb1\x22\x71\xbe\x8d\xbf\x72\x2c\xfd\x8b\xd2\xd8\xb1\xef\x48\x63\xdb\x0c\x21\xa2\xa6\xbd\x77\x96\xb1\x97\x4a\x3c\x6c\xfa\x39\x92\xb4\x6e\xbb\x21\x44\x12\x31\xbe\x47\x1a\x2d\x49\x78\x89\x8f\x43\x25\xda\x6b\x8b\xe3\x9b\xc5\xf1\xf1\x0e\xbe\x7c\x3c\x22\xc5\xf1\x8c\x78\x7f\x68\x46\x3d\x28\x8b\xfe\x45\x70\xc6\xcc\x0b\x2b\x33\xd4\x9c\x39\x68\x51\x26\xe4\x5e\x31\xb0\x64\x60\x64\xe0\xc4\x00\xd9\x92\x41\x38\x26\x1d\xd5\x19\x32\x7a\x3d\x5a\xde\x8f\xe6\x70\x73\x88\x39\x95\x59\x44\x71\x14\x41\xb1\x0b\x3d\x0b\x09\xc5\xc2\x85\x06\x5f\x7b\x36\x56\xd7\x60\xcd\xe8\xd4\x59\x9b\xd9\xc0\x21\x9c\xd5\x96\xc4\xff\xe2\xfa\x61\x8c\x50\x2d\x15\x10\x71\x25\x9c\x0b\x7e\x22\x29\x05\x76\x66\x16\x0f\x59\x6d\x52\x09\xd1\xb4\x62\x0b\x29\x25\x5f\xf2\x93\xc9\x5e\x6c\x85\x9e\x04\xb9\x04\x63\x78\x7a\x4d\xd1\x81\x47\x23\xfc\xa3\x1b\xd6\x1c\xdf\xdc\x32\x39\x4a\xdf\x7d\x77\x62\x59\x5f\x6f\x30\xbc\x70\xc9\xb2\xc4\x6d\xdf\xef\xf4\x2f\x1a\xf9\x44\x6f\xcf\xee\xc1\x86\xef\xac\x59\x52\xaa\x3a\x22\x0f\x5e\xb7\x57\x03\x3f\x71\x36\x2d\x05\x7e\x7a\xdd\xd1\xb2\xdc\xb2\xdc\xcc\x92\x8d\xeb\x77\x34\x2e\x6b\xf3\x84\xfb\x77\x0f\xac\x5e\x3e\x55\x90\x44\x5c\x2d\x17\x72\x14\x0a\x68\x7b\xde\x4c\x6e\xa5\x86\x8d\x21\xd4\x2d\xdb\xa7\x73\x24\xfb\x34\x16\xf2\xd2\xba\x29\xfb\x14\xd7\xaa\x60\xf9\xc9\x94\xcb\x66\x35\x96\xcd\x6f\x8f\x47\xab\x69\x76\x9a\x6c\xce\x1c\x7f\xc3\x80\x24\x43\x0d\x86\x10\x71\x43\x75\x74\x6a\xf4\x95\x63\x61\xd5\xcf\xa5\xb1\x22\x71\x32\x5e\x7d\xe5\x58\x2c\x6f\x12\xdd\x4d\xff\x21\xcb\x4f\x42\x94\x1f\x54\xdd\x2e\x8d\x2e\xca\x5b\xe1\xe7\x08\xc1\x06\x4c\xfb\xcf\xb2\x4d\xba\x0c\x89\x9c\x03\x65\x10\x75\xf6\xf1\x71\x35\x35\xcd\x26\x7d\x02\x21\x62\x4e\xd9\xf8\x1b\x0a\x71\x84\xb9\x01\xce\x10\x82\x4f\x50\xea\xe9\x36\x66\xe1\x3b\x08\x11\xcb\xa6\xc6\xc3\xaa\xfc\x53\xf2\x78\xf1\x01\x48\x4b\xcd\x18\xff\x2e\x42\x44\x10\xf3\x2f\xd1\xdf\x84\xc7\xe3\x33\x41\x67\x10\x6d\x52\xca\x7e\x85\x4d\xba\xb5\xf0\x0e\x55\xcf\x04\x50\x18\xb5\xa0\x4f\x08\xdd\xc6\xea\x0c\x0a\x78\xad\x0e\xaa\xc2\x6f\xaf\xf0\xfb\x2b\xec\xa4\x1a\xad\x68\x13\xda\x2e\xb6\xbd\xd5\x46\xb2\x6d\xc0\x24\x33\xea\xe5\xad\x5e\x47\xc0\x4a\xd9\x7c\x3e\x77\x7d\x96\x35\xb2\x4f\xb2\xcf\xb2\x44\x9c\x05\x1b\x6b\x63\xdd\xd0\x24\x27\x5c\x4b\xb1\x60\x29\x2d\xc2\x20\x6b\xd6\xe1\x5c\x8e\xfb\x95\x74\x21\x12\x7f\xc4\xc9\x30\x82\x44\x79\x5c\xab\x29\x0a\x61\x3a\x2c\xfe\xdb\x54\x09\x38\x9c\x8e\xb1\xda\xa7\x70\x5f\x1a\xa5\x0c\xed\x8d\x4f\xee\xed\x49\xdf\xf0\xd8\x35\xeb\x8f\x47\x94\x9e\x9b\x06\x0b\xa8\xf7\x52\xf5\xb2\x58\x77\xd7\x27\xdb\x7e\xd1\xfb\xfc\xdc\xad\x4b\xea\x9e\xf6\x77\x5f\xb7\x70\xf1\x96\x6e\x9f\xaf\x67\xcb\xa2\xe3\x87\x88\x8e\x7f\xfd\xcf\xfb\x97\xcc\xd9\xfb\xed\x1b\x6f\x3c\x73\x73\x57\x5b\x3b\x75\xc3\xb9\xfe\x07\xae\x3f\x50\xd1\xe4\xdc\xed\xcd\xd4\xdd\xb6\x7d\x67\xd7\x43\x4f\xfd\xec\x54\xf3\xb5\x03\xc9\xe8\xca\x03\xcb\x16\xed\x19\x4c\x9c\x97\xdf\x19\x65\xc4\xfa\xaa\x5f\xd2\x57\x7f\x97\xde\x80\xcf\x10\x02\xc2\x1f\xd7\xd8\xa6\xcb\x0f\x55\x8f\xdf\xd7\x80\x24\xc7\xff\x8e\xe5\xd8\x8b\xe5\xf8\x27\xe3\x21\xef\x0c\x3b\x74\xe6\xf8\x1b\xb2\x92\x6c\xd6\x19\x42\x44\x9f\x37\x34\xcd\x06\x9d\x31\x16\x56\x7d\x5c\x46\xfb\xa3\xf1\xea\x59\x69\x63\xbe\xa5\xf1\x63\xff\x55\xb6\xa7\x26\xc7\x6b\x9a\x66\x1d\x7f\xa9\xc4\xcb\xa6\xbf\x23\xe4\x38\x4d\x12\x35\xa2\xe8\x9f\x29\xfc\x7d\xdc\xdb\x30\xc3\xc6\x25\xd1\x7a\xf4\x21\x45\x50\x5f\xc1\xf9\x3c\x11\x34\x2a\x58\xe2\xf5\xe0\x7f\xdc\x6e\xd7\x3f\xbe\x9c\x5c\x4f\x12\xd5\x64\x33\x49\x90\x38\x09\xaf\x5a\xa5\xcb\x20\x2a\xfc\x55\xce\x0d\xac\x1b\xdc\x6e\x50\x7d\x15\x99\x38\x93\xd7\x34\x6a\x3a\x65\x3a\x67\xba\x68\x52\x28\x4c\x26\xf4\x55\xf8\x86\x1c\x23\x98\x30\xf0\x31\x1c\x26\xe0\x23\x3c\xc6\xe1\x9b\xc8\xc9\xa8\x7b\xff\x03\x0e\xe3\x7a\xf2\xa1\xc9\x67\x8d\x9e\x1a\xbb\xad\xd6\x6b\x34\x7a\x6b\x6d\xf6\x1a\x8f\x71\xe6\x67\xe2\xd0\xbd\xf7\xe6\xdf\x0d\xc4\x2a\x75\xba\xca\x58\xc0\x17\xf3\xe8\xf5\x9e\x18\xf1\xd3\x19\x3f\x90\xe6\xb8\xa3\x30\x4e\xc5\xa8\x3b\x91\x13\x55\xa1\x7a\xb4\x5a\x68\x0b\x7b\xaa\x2b\x29\x57\x30\x63\xb3\x5b\x2d\x0a\xa5\x5a\xa5\xd4\xa1\x15\x31\x21\x76\x31\xf6\x56\x8c\x64\x63\xc0\xb8\x32\xba\xe5\xd1\xea\xca\xb0\x87\x8a\xf8\xb3\x0a\xb5\xdd\x42\xd1\x56\x23\x17\xc9\x2a\xc5\x6d\xf1\xe2\x44\xfa\xc5\x32\xe3\x77\x78\xba\xed\x8b\xe7\x20\xe5\x8b\x94\x76\x83\x4d\x51\x09\x74\xd1\xf2\x65\xe8\x06\xc9\xf0\x6d\xa4\x62\xe2\x1e\xd8\xb3\x76\xde\x81\x6c\xba\x7b\xee\xbf\x7c\x63\x6b\x7a\x7b\x62\xde\x81\x6c\xe7\xfc\x49\x64\xb2\xc2\x1d\xee\x85\xf5\xc7\x0f\x11\xf3\xc2\xf9\xeb\x3d\x99\xfa\x62\xdd\x42\x6a\x4b\xef\x81\x8c\x54\xba\xe0\xae\xd8\xbc\x60\xff\x82\xd7\x6f\x59\x7a\x80\x27\x0e\x19\x8c\x17\x5e\x3f\x71\xf5\xe4\x6e\x03\xf7\x86\x24\x0b\x38\x4f\x1a\xcb\xda\x4a\x49\x8e\xbf\x80\xb5\x9a\x0b\x6b\xb5\x07\xc7\x7d\x2e\xad\x63\x9a\xec\xcc\x1c\x7f\xc3\xa8\xb4\x47\xc2\x86\x10\xac\x70\xf9\xa6\x46\x5f\x39\x16\x56\x29\xa5\xb1\x22\x71\x14\x70\x5d\x39\x16\xcb\xa4\x44\x77\x13\x21\xca\x24\x01\x55\xa2\x32\x3b\x53\xf8\x78\xdc\x15\x93\xc6\x97\xd9\xb8\x38\x5f\x14\xd3\x5f\x2d\xf1\xa2\x97\xe8\xc7\x0c\x21\xd8\x10\xa8\x41\x53\x27\x89\x5c\xaf\xc1\x98\x91\x17\x63\xa2\x78\x62\x19\xf5\x0a\x9e\xe3\x21\xec\xf5\x58\x5c\x3d\x15\x4b\x93\x6e\xe4\x72\xd5\x65\x2d\xac\xd5\x97\x45\x34\x37\xad\xca\x33\x59\xaa\xd8\x80\xe9\xf8\xbb\x65\xc5\x1b\x06\x45\x70\x7a\xc9\x06\x8c\x95\x17\x69\x0c\x97\xd5\x6f\x9c\x56\x82\xa7\xbc\x14\x82\x3c\x5d\x5e\xa6\x51\x56\xc0\xa1\x44\xf9\xc6\xcf\x18\x66\x54\x6d\x94\xe6\x8d\xd7\x4a\x9a\xf7\xa6\xaf\xc9\x9a\x5f\x54\x26\xa0\x09\x34\xa1\x69\x67\x97\xe4\x5b\x63\x9e\x2b\xf9\xef\x86\x10\x2f\xdd\x81\x6d\xb2\xbf\xcf\x62\x9d\xe6\xef\x93\x6c\xb1\xad\x25\xdb\x6a\xe8\x57\x92\xae\x4a\x19\x42\x44\x80\x6f\x98\x66\xb7\x49\x7e\x3b\xa1\x44\x7b\x14\xfb\xfa\xc4\xd1\x4e\x3a\x34\xe5\xa4\x9b\x6e\x6b\xd2\xef\x96\x68\x8f\xfe\x50\xa2\xdd\x6c\x08\x11\xc1\x8e\xe9\xf6\x23\xca\xcf\xa1\x7e\x46\x3f\x5d\xa2\x7d\x35\xb9\x16\x21\x64\x16\x74\xc4\xbe\x30\xc4\xc3\x80\x5b\xc2\x06\x21\x92\xcb\x49\xfe\xeb\xe1\xfc\x1c\xf2\x0c\xb6\x41\xe6\x49\xe3\x89\x41\x84\x90\x57\xb0\x12\xef\xcf\x87\x93\xf3\xe1\xd8\x7c\xd8\x37\x1f\xe2\xf3\x01\xcd\x9f\x2f\xff\x62\xae\xf8\xbb\x18\x0f\x0f\xdf\x97\x42\xb2\x1f\x42\x2d\xdf\x97\xe2\x74\x08\x5e\xad\xaa\x95\x9d\x6c\xe5\x76\xc9\x56\x2c\x7b\xdd\x92\xec\xf5\x8a\xef\x40\x2f\xbe\x02\xe0\xbc\xf0\x45\x6f\x08\x5b\x3d\xb9\x32\xbf\x42\x39\x7d\x58\x85\xc6\xcb\xee\x88\x37\xd6\x55\xcd\x42\xff\xe8\x14\x7d\x58\xf5\x17\x89\xbe\x57\xa4\x5f\x0d\x57\x55\x7b\x67\xa3\xdf\x54\xa2\xbf\x86\x40\x32\xfd\x18\x1d\x82\x7d\x55\x75\xb3\xf1\x4f\xbf\x5d\xb4\xd7\x60\x0d\xf0\x48\x7a\x42\x44\x9a\xc1\x62\x6f\x75\xd9\x13\x66\x5b\x23\x18\x44\x8f\xc9\xcf\xa8\xa1\x43\x70\x6d\x6c\xb6\x39\x9c\x2c\x9b\xc3\x20\x23\x3d\x21\x28\x3e\x21\x02\x63\x91\x19\x73\xc0\xb8\x7e\x98\x7e\x58\xa6\xdf\x2b\xc9\xa9\x1b\xcb\xe9\xb7\xc6\x03\x76\x66\xc6\x39\x49\x0f\x30\x66\x63\x08\xf5\xe0\x48\x83\x8f\xb8\x84\x6d\x4e\x62\xb8\xb3\xd3\xed\x9e\xb2\x39\x65\x5f\x9c\x91\x41\x77\x95\xea\xbd\x1f\x66\xcc\x28\x8c\x9a\xd1\x32\x21\xe1\x71\xa1\xfa\x9e\x90\xdb\xad\xf1\x87\x96\xb5\x72\xad\xd0\x98\xd1\x2c\x6f\x09\x5b\x82\xee\x25\xfe\xca\x4a\xce\x8b\xf8\xac\x55\xaa\x68\x21\x39\xae\x3a\x8b\xe4\x1a\xf0\x1c\x3f\x91\x96\xd0\xd1\xe5\x8a\x28\x0c\xe8\xc7\xc9\x65\x51\xb3\x16\x84\x77\x00\xce\x78\xb3\xf0\x96\xc0\xff\xa2\x30\x3c\x7f\x10\x76\x9f\x7e\xe8\xa1\xd9\xca\xc3\xbb\x6f\xfb\xc1\x2d\x87\x5e\x3b\xd2\xe3\xa8\x6b\xf5\xfa\x44\xa5\xf1\xf0\xe1\xd3\xa7\x0f\x7f\x1c\x39\x50\xb7\xea\xe0\x60\x78\xcd\x3d\xeb\x1b\x2e\x3c\xff\xe2\xf3\x53\x7e\x5b\xac\x03\xaa\x65\x1d\x50\x94\x6f\x3d\x1d\x02\x42\xab\x83\x2b\x6c\x04\x72\x02\xeb\x00\xc9\x96\x1e\x92\xac\x51\xa2\xd6\x10\x22\x0c\xd5\x35\xd3\x6c\x69\xc9\xc7\x2b\x94\x68\x8f\x16\x3e\x96\x69\x1b\xe8\x10\x30\xd6\x99\xfe\x54\x89\xf6\xbb\x25\xda\xa3\xbf\x93\x68\xd7\x1b\x42\x04\x9b\xac\x9e\x85\xb6\xb3\x44\x7b\x0d\xa4\x21\x85\x69\xdb\xe8\x10\x28\xb4\xe6\x59\x69\xbf\x2d\xd3\x16\xc7\x47\xd0\xd4\x0d\x55\x5b\x1d\x9f\x71\xbf\x38\x9f\x9f\x43\x3e\x43\x9f\x2e\xd1\xbf\x9a\xf0\x21\x84\xf4\xdf\x46\x50\x78\x6e\xdc\x68\xc4\x6a\x22\x85\xef\x37\x6b\xc8\x09\xac\x5b\x32\xf2\xb8\x36\xe4\x41\x61\xc1\x44\xbc\xdf\x06\x6f\xb5\xc1\xc9\x36\x38\xd6\x06\xd9\x36\x40\x6d\x70\xa6\xf0\xfd\xf1\xb6\x36\xa7\xb3\xa8\x61\x72\xff\xc0\x77\x3e\x58\xf8\x7b\xd9\x3a\x51\xb6\x59\xd7\xa9\xec\x3e\x33\xf8\xcb\xa9\x75\x52\xf1\xd3\xd7\x09\x63\x30\x62\xda\xb5\xb2\x7e\xf9\x89\x4c\xbb\x8e\x0e\xc1\x96\x86\x3a\x2d\x4c\xa3\x8d\xeb\xd5\x31\xed\x5e\x49\xbf\xbc\x88\x69\x93\x23\x86\x10\x49\x6e\x18\x09\xa3\x2b\x68\x0b\x25\xda\xa3\xe8\x65\x99\x76\x82\x0e\xc1\x48\xe3\xac\xb4\xf1\xfb\x95\x68\x8f\x7e\x4d\xb4\x29\xc8\x31\x43\x88\x3c\x53\x78\x6f\xfc\x9a\x32\xea\x68\x8a\x7e\x53\x89\xfe\x1a\x42\x2b\xd3\x6f\x12\xe9\xd7\x35\xcc\x4a\xff\x6d\x99\xbe\x02\xd6\xa0\x3f\xe1\xbb\x18\xb9\x09\x3f\xe1\x9d\xf1\x91\x0d\xd3\xf9\xcf\xb7\x51\x7f\xc2\xb1\x13\x4c\xff\x90\x1f\x6c\xd2\xdd\xb4\xbf\x2e\x29\x93\x9e\x6d\x4d\x0e\x05\xea\xa5\x35\x11\x19\xaf\x58\x37\x7d\x4d\x30\x6e\x24\x5e\xef\x88\xbc\xde\x7b\xcb\x63\x14\x85\x71\xb3\x96\x9e\x71\x1f\xa4\x8c\x8a\xc7\x8d\x21\xb4\x50\x1e\x1f\x81\xc3\xc8\x23\x98\xb7\xe9\x60\x9b\x16\x60\x9b\x13\x9c\x44\x08\x1c\x7e\xa7\xc6\x2e\xfd\x5a\x2e\x95\xcb\xa1\x62\x03\x64\xfa\x21\x8c\xd7\x68\x43\xcb\x85\x98\x99\xd2\x0e\x2a\x34\x18\xc4\xea\x49\x07\x70\x0e\xb0\x91\xec\x20\xe2\xc6\xec\xfa\x11\x9b\x55\x6d\x1c\x35\x29\x48\x93\xcd\x64\x33\x01\xa7\x31\xd2\x32\x52\x94\x51\x0a\x3b\x63\x00\x04\xec\xb0\x4b\x62\x8f\x5d\x4e\xfa\x46\xb4\xb7\x79\x4b\x49\x35\x61\x24\xcb\x40\x0a\x52\x18\xe6\xf0\xf8\xd9\xf3\xe7\xcf\x4e\xae\x3f\x7b\x9e\x72\x4d\xae\xa7\x9e\xff\xf3\x9f\xff\xfc\xe7\x7b\x3f\x7e\x83\x78\x7c\x72\x39\x55\x7f\x6f\xfe\xc8\x9b\x6f\x62\x1f\xb8\x51\xae\xab\xf7\xa1\x65\x42\x83\x49\x83\x7a\x7c\xcb\x02\x5c\x60\x34\xb0\x2f\x40\xda\xac\x46\x75\x0f\xab\x59\xea\xb7\xe8\x96\x18\x9f\xd5\x5f\xd0\x13\x7a\x3d\x67\xa3\xb2\xc8\xcd\xb9\xbd\x6e\xd2\xcd\x71\xa5\x72\xfb\x1c\x6e\xb0\x81\x21\x1b\x24\xce\xb0\xe1\x65\x6c\x99\x5e\x44\x1c\x48\xf1\x29\x29\x8f\xf8\xca\x12\xfc\x87\x1e\x3a\x0d\xbb\xf3\x07\xa7\x0a\xf1\x8f\xcb\x35\xc5\xef\x53\x3f\x12\x95\xe3\x99\x62\x2d\xfe\x6a\xe9\x1e\xfd\x17\x84\x88\x17\x70\x7c\x40\x8a\x05\x8d\xe5\xff\x2c\xcb\x9e\x99\x0e\x01\x58\x02\x33\xee\xdd\x5f\x40\x88\xb8\x1e\xdf\xb5\xfe\x2c\x8f\xff\x9c\x7c\x4f\xd7\x1a\x42\x00\x3a\xd7\x8c\x3d\xdc\x81\x10\xf1\x2f\x58\xef\x4a\xf4\x87\x0a\xfe\x32\xbd\x0b\x33\xf5\x6e\xe1\xf7\x08\x11\xb5\x58\xef\x4a\xf4\x87\xf2\x17\x65\xfa\x8c\x48\x9f\xa2\x67\xd0\x8f\xe3\xd8\x97\x50\xa2\x3f\x5a\x8a\x65\x89\x3a\x85\x98\xa9\x7b\x0b\x3f\x47\x88\x68\xc6\x7b\x53\xa2\x3f\x9a\xff\x8e\x4c\x5f\x25\xde\x72\xf5\x33\xfc\x0c\x68\x20\x3f\x87\x18\xc3\xfa\x51\xa2\x7f\x35\x7a\x48\xda\x3b\xc8\x51\x0c\xab\xe1\x71\xf3\xf2\x73\xe0\x00\xde\x93\x8b\xf0\x9e\xbf\x3a\x88\x10\x27\xa8\x89\xad\x41\x40\xc1\xa0\x64\x6d\xa5\xe4\x58\xdd\x18\xde\xeb\x75\xf2\xde\xcd\xca\xfc\x8a\xfa\x1c\x4d\xd7\xe7\xc5\x7a\x7c\xaa\xf7\x8a\x7a\x7c\x76\xb6\x7a\x7c\xaa\x57\xe6\x79\x37\x55\x43\x9f\xe6\x8a\xf1\xba\x7a\xe2\x34\x42\xa8\x59\xd0\x83\x7d\xaf\x1d\x96\xd8\xc1\x2e\x28\x14\x19\x3b\x86\x1c\x60\x98\xcc\xb3\x3e\x38\xe9\x83\xa3\x3e\xc0\xad\xea\xc0\x27\xfe\x4f\x49\x71\x47\x22\xb9\x9c\x41\xb2\x0f\x4f\xe6\xcd\xe4\x21\xfa\x6d\x4e\x9a\x9f\x02\x2d\x26\x8c\x08\xa1\xa8\xe0\x25\x89\xca\x0b\x95\xf0\x66\x0a\x4e\xa4\x60\x5f\x0a\x46\x52\x20\xa4\xc0\x9b\x02\x94\x82\x94\xc0\x30\x32\xa5\x9c\x48\x28\x55\x28\x14\x32\xf9\xdd\x72\x6c\xb3\x5e\xf6\xf3\x7c\xbf\x4c\xde\x50\x85\x59\xa7\x9f\xf6\xbe\x9e\xce\x9b\x89\x15\xa2\x4e\x3a\xe4\x95\xc7\x17\xdf\x97\xd9\x30\xcb\x78\x74\x3e\xdf\x46\x7d\x1e\xbf\xaf\x28\xd6\x61\xfe\x1d\xf2\x69\xf6\xb5\x71\x9d\x49\xd6\x48\x58\x1f\xe5\xdb\xc8\xf7\xb1\xed\xd4\x27\x8d\xf3\xc9\xe3\x5e\x18\x67\x2d\x6a\x5a\x7e\xb1\x32\x5e\x03\xae\x61\x5d\x20\xa8\x81\xe3\xf4\x2c\x3b\xcf\x00\x06\xa9\x62\x55\x9d\x31\x70\x06\x83\x89\x35\xc5\x4c\x84\x42\x41\xf6\x50\x4b\x8d\x5a\xd0\xd3\x2c\x25\x6d\x67\xbe\xa5\x65\x3a\x36\x83\x0c\xcd\xe0\x93\x41\x19\x30\xde\x10\x86\x69\x20\x03\xf9\xaf\x6c\x19\x1f\xa7\x49\x8a\x3a\x00\xfc\xab\xf9\xad\xf0\x15\xf8\x6d\x7f\x7e\x23\xd5\x9b\xff\x75\xfb\xfa\x50\x5d\xd5\x29\xd8\x9f\xb7\xe2\x5e\x31\xd3\xce\xd1\x98\xec\x5b\x5b\x27\xe9\x5e\x23\xd6\xbd\xdb\xc6\x19\x2d\xa2\xca\x74\xef\x97\x11\x22\x1a\x14\x5f\x31\x86\xd0\x12\x79\xbc\x1f\x8e\x60\xdd\x4b\xc2\x36\x02\x60\x1b\x07\x1c\x11\x82\xf5\x53\x4e\x39\x59\xf7\x4a\xeb\x29\xdb\x07\x31\x69\x9d\xea\xe5\x75\xfa\xd9\xd4\x53\xc4\x71\xeb\xf3\x6d\xb0\x19\xaf\xe7\x12\xe9\x8c\xc9\xff\xad\x68\x47\xbc\x35\x5e\x24\x5c\xe4\x9d\xfe\x56\x91\xf7\x43\x3e\x40\x85\x2f\x20\xab\xa0\x03\x0d\x09\x1c\x03\xa3\x8c\x96\xa0\x24\xa3\x38\x9d\x92\xfd\x88\xe3\x25\xba\xcc\x21\x5f\x1b\x42\x76\xc1\x00\x94\xa0\xe7\x32\x94\xc0\xa8\x32\xc3\x14\x45\x92\x41\x88\x44\xca\xe8\x17\xf9\x15\xed\x9f\x5f\x4c\xae\x13\xf7\xeb\x97\x19\x7d\x91\xdd\xa2\x7f\xf2\xf3\x8c\x99\x93\xf9\x85\x35\x50\x3f\xd9\x8c\x22\x82\xb5\x60\x82\xf7\x4c\x70\xc2\x04\x47\x4d\xb0\xd7\x04\x23\x26\xf0\x98\x00\xce\x40\x74\x9c\x92\x75\x89\x2c\xcf\xa5\x9a\x13\x8c\x9d\xab\x43\x6b\x84\xa4\x86\xa1\xb5\x34\x22\x29\x1d\x45\xd1\xb4\x5a\xa9\x64\x9f\x64\x81\x63\x41\xab\xd3\x31\xa4\x62\x50\x83\xd4\x63\x7a\x9a\xd2\x69\x29\x2d\xa5\x05\xc5\x88\xda\x28\x1e\x4e\xe9\x09\xf9\x6c\xc2\x78\x17\x49\x51\xe9\xf3\x31\x3e\x97\x33\xf0\x06\xd1\xbc\xe6\xf6\x1c\xa2\x5e\x78\x81\x3b\xf4\xc2\x0b\x89\xb8\xc9\xc0\x1b\x9a\x6c\x34\x8e\x6c\x2b\xc2\xe7\xcf\xfe\xa2\x2f\x7f\x81\xe8\x98\x54\xad\x59\x40\x3c\x42\x1a\x27\xaf\x3e\xba\xe7\x99\x7c\xcb\xa3\xf0\x61\xfb\x1e\x29\xdf\xf5\xaf\x08\x11\x6e\xdc\x5a\xfe\x1a\xa1\x4d\xd0\x65\x75\x84\x8a\xa1\xd5\x22\x83\x1a\xb5\x46\xa3\xa4\x7e\x46\xc3\x53\xf4\x2b\x34\x21\x41\x0a\x91\x0c\x4d\x33\xa4\xa2\x47\x85\x94\x4b\xb5\x1a\x35\x4d\xa9\x29\x35\x05\x0a\x0b\xa0\x62\xac\xab\x9c\x47\xdc\xb0\x12\x43\xd3\xf1\x25\x0e\x21\x57\xe4\x51\x94\x6f\x45\xf8\x89\xd3\xd7\xf6\x7d\xfb\xf4\xa6\x3e\xe2\xaf\x64\xe5\xe4\xaa\xf9\xbb\x6e\x9a\x4c\x13\xbd\xdd\xbb\x8a\x32\x4c\xeb\xb1\x0c\x27\xe4\xf8\xdc\x9f\xca\xee\x83\xcb\xec\x95\x33\x7c\x76\x12\x6e\x8d\xaf\xe8\x9b\x44\x37\x6c\x95\xb4\x80\x78\x97\x5a\xed\xf0\x4c\xf3\x4d\x9e\xcf\xb7\xd1\x7a\x2c\x03\x09\x49\x16\xd1\xa5\xa2\x2c\x4e\x8c\x17\x29\x4b\x3a\x80\x32\x62\x9b\xb6\x5f\x92\xed\x45\xf2\xa8\x9f\x8f\x97\x28\xce\xc2\x2b\x0c\xa2\x87\x64\x5e\xdd\xa2\xce\x0a\xd8\xff\x7b\x5e\x61\x50\x8b\x7d\x4a\x95\xd8\xa7\xf4\xd1\x78\x95\x63\x8a\x5b\x49\xb7\x22\x44\x7d\x8e\x79\x8b\x0b\xa3\x7e\x74\x54\xfc\x0d\x32\xf3\x1b\x84\x6a\x04\x37\xb2\x2f\x0b\xbf\x17\x86\x67\xc3\x70\x22\x0c\x23\x61\x88\x85\x21\x2c\x28\x95\x99\x30\x56\xac\x92\x66\xe5\xfe\x8a\x73\x1f\xcf\xe7\x77\x63\x6c\xe2\x20\xea\x15\x6a\xed\x5a\xcf\xa0\x97\xa2\x2c\xde\x75\xe1\x53\x61\x38\x1a\x06\x14\xe6\xc2\x84\xcd\xa4\x37\x0f\x5a\xc6\x42\x1e\x9d\x95\xb4\x18\xed\x5a\xa3\x8c\x70\xcd\xa7\xd3\x3c\x5f\x44\xe6\xc0\x5e\x6b\xe9\x1e\x97\x88\x43\x19\x12\xce\x0c\xbc\x63\x09\xde\xcb\xac\x27\xc8\x23\xfc\x62\x97\x8c\x80\x3d\xa9\x2c\x47\x3e\x26\xe9\x27\x9a\xc6\x8e\x96\x21\x62\x97\x83\x20\xef\xec\xea\x6a\xde\xd3\x40\x7a\xcb\x31\xb2\xa5\x1c\xda\x61\x54\x8d\x5a\x05\x3f\x49\xda\xb4\x3d\x55\xcb\x6a\xb9\xda\xd1\xda\x7d\xb5\xa4\xd3\xda\x63\x5b\x5a\xe3\xe4\xb2\x5e\xce\xce\xda\x2c\x45\xe8\x9e\x69\x50\x2b\x12\x94\x7a\x19\xcf\xa6\x59\x80\x57\x48\xb3\x9e\x20\xde\x9d\xc2\xf0\x21\xae\x84\x61\xf1\x67\xb6\x94\x41\xf9\x90\x5b\xae\x40\x65\xb9\x7c\xcf\xe2\xdd\x2b\x62\x53\xf9\x15\xd8\xbe\x49\xca\xf7\xca\xa7\x65\xff\x4f\x2d\x1d\x22\x50\x75\xcd\xac\xbe\xe7\xad\x25\x5f\xf5\x90\x59\xba\xd3\xf8\x0d\x21\x02\x79\x7d\xb3\xe4\x62\x08\x25\xda\xa3\x38\x17\x03\xdf\x80\xe8\x10\x01\xc9\x99\xb9\x1e\x12\xed\x77\x4b\xb4\x47\xf1\xad\x80\x08\x1a\x24\x2f\x57\xed\x4c\xbf\xf9\xcc\x5c\x92\x75\xe8\x9d\x62\xae\x47\x03\x1d\x22\x89\xb9\x33\x73\x3d\x66\xf1\xcd\xaf\xeb\x96\xe3\x46\x75\x86\x10\x49\xcc\x9f\xe1\x39\xc7\xd8\xd6\xcc\x23\xf4\xab\xc8\x81\x6a\xd1\x90\xd0\x68\xb6\x82\xd5\x8a\xcc\xf6\xc1\x70\x58\x65\x44\x1b\xea\x3c\x75\xe0\x19\x52\xad\x8f\xd8\x46\x96\x98\x81\x35\x3f\x69\x26\x94\x66\xb3\xc3\x38\x62\x20\x9d\x23\x7a\xaa\x6a\x84\x32\x39\x64\x00\xf2\x89\x19\x1d\x04\x64\x87\xc3\x44\xa9\x8d\xc0\x74\x90\x66\xdb\x54\xb2\x59\x59\x4b\x06\x43\x14\x98\x47\x26\xd5\x91\xa1\x78\x11\xa1\x79\xed\x52\xe2\x83\xc9\xef\xe2\x86\x03\x9d\x97\x97\x5f\xff\xe8\xe6\x86\x86\x6b\xff\xed\xfa\x86\xc1\x50\x68\x95\x4a\x33\x05\xcc\x6c\x93\xf2\xd1\xa8\x83\xfd\xf7\xfd\xc7\x6d\x87\x7f\xfa\x40\xbf\x91\xa5\x56\x72\x06\xc9\x6f\xbe\xbd\xf0\x0e\x33\x41\x0d\xa3\x5a\xdc\x47\x78\x4c\x68\x33\x91\x69\x77\xe6\x62\x02\x12\x09\x4d\x53\x26\x58\xb1\xa2\x8b\xed\x82\x42\x17\x08\x5d\x10\xc9\x68\x96\x0b\xee\xac\x2b\x1d\x49\x13\x6c\x1a\x98\x74\x3a\xda\xde\x90\xb5\x9a\x38\xce\x1b\xcd\x92\x92\x6f\x85\x9f\x90\x02\xa9\x65\xd0\x74\xb9\xdc\x76\x39\x86\x9a\x93\x62\xa8\xb4\x3f\x14\x9e\x4a\xd8\xfc\x07\x11\x54\x28\x4b\x04\xa6\xe5\x78\x2b\x3d\xfa\xa9\x1f\x74\xa5\x5f\xdc\x57\x04\xfd\xd9\xf5\x7c\xba\xfd\xdb\x3b\xaf\x84\xb1\xfb\xf8\xf8\xe1\xe3\xf7\x1e\xb9\xfd\xbe\xe3\x87\xa8\xf7\x5d\x2d\x2b\x3b\xaf\x3f\xa8\x31\x6f\xdb\xb2\x65\x5b\x11\x10\x68\xeb\xa6\x6b\xb6\xcd\x8c\x92\x12\x6d\xaf\xbf\xf1\xf2\xeb\xff\xf9\xda\x85\xb5\xf3\xb6\x67\xeb\x1e\xba\xa7\x78\x4f\x3c\x89\x65\x2c\x25\xeb\x79\x39\x1f\xaa\x06\xfb\xb4\xde\x1d\x77\x07\x08\xdd\xf4\x7b\x22\x29\xf9\xcc\x97\x49\x7a\xfe\x35\x49\xcf\x07\x0c\x21\x10\x6c\x6e\x3d\x39\x5d\xcf\x53\x27\xb1\x9e\x4f\x49\xfa\xfb\x46\xac\xbf\x89\xc2\xe9\x29\xaa\xe2\xb8\xd1\x7c\x1b\xa9\xc4\x7a\x7e\x99\x6c\x9b\xfc\xb1\x78\x1e\x28\xc7\x8b\x34\xaf\xe4\x15\x06\x91\x5e\xe2\xd5\x8f\x79\xfd\xd2\x78\xb5\x7b\x1a\xaf\xd7\x23\x44\xaa\x4b\xbc\x2a\x60\xb0\xb0\x4d\x8a\x89\x56\x60\x4d\xff\x8b\x71\xbf\x6d\x1a\xbf\x18\xdf\x1a\xd3\x6f\x94\xd7\xa2\x4d\x3e\x47\x04\x3a\x04\xdb\x1a\x5a\x95\xd3\xf7\x27\xc6\xd3\xc1\xf4\x97\x4b\x6b\xf1\x9f\xd2\x5a\xcc\x31\x84\x20\xd7\xd8\xae\x44\xff\x98\x36\xac\x2a\xfc\x41\xa6\xdd\x40\x87\xc0\xdf\xde\xf0\xdf\xd3\x86\x55\x0f\x4a\xb4\x1b\x0d\x21\xa8\xe8\x6c\x9c\x4e\x3b\x6f\x26\x5f\xc6\xfe\x83\x46\x39\xb6\x9d\x2a\xae\xdf\x47\xe3\xad\x32\x65\x91\x66\xde\x4c\xa6\xf1\x3a\x2f\x97\xc6\xa1\xf7\xa5\xbb\x12\xb4\x17\x09\xa2\xd9\x78\x1d\x2c\xfc\x4a\xe6\xb5\x85\x0e\x81\x2b\xfd\x3f\xf1\x3a\x78\x9f\xc4\x6b\x9b\x21\x04\xf6\xae\xe9\xbc\x9a\xc5\x33\x1d\xcb\x44\x93\x24\x13\x7f\x97\x39\xfd\xf7\x71\xa5\x9e\xa4\x4b\x32\xe1\xcb\xb7\x11\x47\xe9\x6e\x63\x08\xad\x90\x64\xa2\x90\x2b\xce\xe9\x6f\xe3\x95\x55\x46\x5a\x9e\x13\xc6\xef\xc6\xbc\x36\xc9\xbc\xbe\x24\xf3\xaa\xa3\x43\x40\x9a\x94\x32\xcd\x22\xaf\xbe\xc2\x3b\xc4\x6f\xb0\xbd\xba\x42\xb2\x57\xb7\xe2\x15\x58\x53\x55\x65\x97\xfc\x1a\x65\x98\xe0\x2c\xda\x21\x2c\xf2\x18\xe0\x2d\x03\x8c\x18\xde\x34\x10\x5e\x43\xdc\x20\x18\x48\xe5\xb3\x74\x81\x26\x68\x5a\xcd\x0c\x02\x0b\x59\xe2\x7d\x82\xc0\x95\xcb\xba\x1b\xe1\x10\xdc\x07\x64\xa2\xd8\xd3\x94\x54\x80\x5a\x37\xaa\x40\x88\xd4\x18\x19\x62\x84\x24\x65\x18\xa5\x98\x8c\x30\x84\x3b\x8a\xe7\x72\xb8\xe4\x2b\x19\xcb\xb5\x48\xe0\x24\x20\xe1\x84\x1b\x8a\x55\xc8\x70\x5a\xc2\x0b\x87\x70\xfe\xd2\x53\xf9\x9f\x90\x3c\xbc\xf9\xc8\x23\x79\xdf\x3d\x93\x6b\x89\x87\xef\x41\xe5\xb8\x47\x41\xb4\xe9\xb4\xd9\x03\xde\x8a\x0a\x0c\x7e\xd4\x84\xc1\x8f\xc2\xb1\x70\x3a\x4c\x78\x5c\x81\x1e\x13\x6b\xf5\x58\x09\xab\xdd\x8c\x38\x8e\x3b\x89\xf1\x8f\x68\x05\x67\xf0\x2f\x31\x7b\x3c\x1a\x4b\xe5\x12\xa7\xdd\x35\x0d\x04\x69\x8a\x51\x9e\x7f\x21\x87\x1d\x32\x18\xc0\xc3\xc0\xa3\xdc\x74\x44\x24\x5c\x59\x9f\x2a\xa1\x22\xe1\x3f\x57\x22\x23\x1d\x39\x52\xc4\x46\x02\x22\x9f\x9f\x81\x8f\xf4\xf1\x6d\x1f\x62\x80\xa4\x0f\x6f\xfb\x78\xcd\xda\x52\x4e\x59\xaa\x94\x83\x36\x86\x46\xa5\x3b\x94\x57\xf6\x5f\xf9\x62\xd3\x72\xd0\xa4\xf8\xdc\x2f\x4a\xb1\xbc\xb1\x3f\x4f\xe9\x25\xa6\x2a\x39\x2d\x96\x87\x69\x63\x9b\xa0\x59\xb6\x09\x8e\x4a\xb4\x9d\x32\x6d\xbb\x63\x16\xda\x5b\x4b\xb4\x87\x7c\x12\x6d\xb7\x21\x04\xb4\xab\xe2\x4a\xda\xd8\x26\x68\x96\x6d\x82\x3d\xe5\xb6\xa8\xdf\x3e\x23\xd7\x4e\xa2\xfd\x6e\x89\xf6\xa8\x56\xa2\xed\x35\x84\x80\x0a\xba\x66\xa1\x7d\xa9\x44\x7b\x2d\xda\x5d\xcc\xb3\xc3\x89\xee\x25\xea\x65\xf6\x80\x14\xe3\x3c\x54\xa2\xbf\x56\x2b\xc7\xe2\xbc\x86\x10\x01\x74\xf1\x09\xa5\x58\xdc\xcc\xdc\xbf\x75\xe8\xeb\xc5\x67\x54\x89\xcf\x68\x9c\x25\x97\x4f\x7c\x86\xbe\x2c\x8e\xba\x2e\x2b\x3f\x23\x2c\x3e\x23\x33\x3d\x32\x2a\x3e\x03\xc7\xcd\xce\x94\x9e\x71\x35\xe1\x90\xf4\x90\x2e\x58\x4c\x45\x94\xe8\xe6\xe7\x50\x56\xaa\x57\xa6\x2b\x8e\x3b\x23\x8d\xd3\xfb\x7c\xd8\x7b\x2d\x8f\xc3\xd8\xf0\x98\xe7\x56\x49\xb7\x42\x51\x6f\x47\xc4\x35\xe7\x23\x95\xd3\x7d\x10\x18\x47\x0a\xf3\x3b\x58\xcc\xd1\x95\x7d\x16\x71\x43\x08\x50\x73\xdc\x10\x0d\xce\xac\x17\x28\xcb\x55\x84\x55\x85\x8b\x32\x7d\x15\x1d\x02\xc2\xa0\x2a\xcf\x55\xbc\x32\xee\x0b\xab\xbe\x34\x25\x8b\x44\x24\x80\xd8\x19\xf1\xc9\x26\x9c\x3b\xd9\x2e\xe7\x6e\xbf\x56\x5c\x6f\x23\xce\x9d\x54\xb9\x25\xea\x65\xeb\x8d\xb1\xc3\x31\x3f\x1d\xf2\x39\xd5\x22\xf3\x63\xa5\x43\x30\xac\xe6\x66\xfa\xc8\x10\x22\x53\x98\x9f\x9c\x74\x4e\xfd\x58\xe2\xc7\x6a\x08\xc1\x68\xf9\xe8\x12\xed\xa6\x22\x6d\x58\x03\x35\x65\x79\x99\x1a\xf5\xcc\x5c\x75\x4c\x1b\xfb\xd5\x72\xb2\xbf\xec\x55\x79\x2d\x2d\x86\x10\x98\x67\x1d\x5f\xc6\x3b\x0c\x16\xde\x92\xe9\xb3\x74\x08\x18\x8b\xfa\xbf\xe7\x1d\x06\x6f\x91\xa8\xb3\x86\x10\x70\xd3\x46\x63\x5f\x10\xf1\x0c\xe3\x41\x26\x14\x14\x2c\x2a\x95\x05\x59\x38\x8b\xd7\x42\x9a\x7a\xd0\x52\xb3\x2e\xcb\x00\x76\xc9\x4d\x14\x9b\x82\x25\xe2\xbc\x61\x3a\xb2\xae\xc5\xf0\x84\x84\xa9\x1b\x8a\x79\x32\xd5\xd5\xad\x61\x13\x75\x6a\x1a\x96\xee\xc7\x7d\x58\xdf\xbe\x92\x37\x93\xbf\xc5\xfd\xa4\x7a\x85\xda\x78\x3d\xd4\x78\x3c\xd0\x63\xb4\x1a\xcd\x66\xa3\x5a\x8d\x8c\x9c\x31\x6e\x14\x8c\x94\xc2\x68\x42\xa3\xd6\x9a\x1a\x5d\x20\x5b\xa1\xd0\x65\x19\x57\x11\x9c\xa8\x04\xf8\x6b\xc0\xbd\xa6\x27\x92\x31\xdc\x40\xdd\x30\xa3\x2b\xf3\xec\xd0\xbf\x16\xe2\x68\xfd\xb2\xdd\x7d\xde\x8e\x0a\x67\x8b\xa7\xba\x2d\x64\x2a\xe2\x00\x97\x78\xfe\x2b\x39\xef\x72\x5a\x64\x5b\xc5\x3c\xa0\x54\x8b\x6c\x93\xcf\x2f\x9c\x77\x78\xda\x44\xee\x3c\x5c\xb4\xfd\x83\x38\xe7\xa0\x01\x2d\x14\xea\x5c\x8c\x49\xe5\x1d\x02\x88\x0c\xa9\x36\x34\x9e\x6b\x84\x67\x1b\x61\x5b\x23\xc4\x1a\x47\x1a\x09\xdf\x90\x69\x7d\x8a\x71\xe9\xe3\x23\x5e\x3b\x15\x1a\xd1\xe3\x1e\x37\xaf\xc9\x5d\x3d\x8a\x3d\x59\xf8\xd8\x84\x41\x42\xed\xb5\xe9\x49\x8c\xfe\x30\xa3\xeb\x8d\xd5\xd6\x49\xa6\x60\x46\x51\x2d\x63\xd3\x6b\xab\xd3\x83\xe9\x48\xfd\x54\xff\x9b\xf7\x1e\x79\xf8\x9d\xfe\x9a\x84\x43\xf9\xf1\x9f\x66\xf6\x66\x61\xcc\xd6\xf6\x6d\x6b\x16\xd9\x57\xfd\xfb\xde\xc7\xf3\xbf\x2f\xef\x85\xb3\x75\xbd\x36\xd5\x9b\x6b\xb8\xfc\xf2\xac\xfd\x59\xc4\x7b\xd1\x07\xd4\x9f\x90\x17\xd5\xa1\x5e\xa1\xce\xd6\xeb\x70\x54\x1a\xd5\xe1\x8c\xdc\xdd\x09\x45\xb9\xe8\xb1\xe8\xc9\xe8\xa9\x28\xe5\xcb\xa8\x97\xd7\x1b\x2b\xe9\xda\xac\x8d\xe5\xaa\xe4\x0c\xb2\x17\x4b\x73\x35\xf0\x52\xfb\x95\x16\xa9\x4a\x6b\x46\xc6\x58\x27\x99\xe2\xa5\xd9\xff\x63\x1c\xcf\xb1\x2f\xa5\xa3\x0d\x0e\xe6\x45\x96\xab\x4f\x2f\x6f\xf1\x56\xfd\x23\x4c\xcf\x9e\x79\xba\xa6\x85\x39\xde\xd6\x7b\xd3\xf0\x5c\x73\xd7\xc3\xc3\xaf\xbf\xf1\xc6\xeb\x17\x2f\x5e\x2c\xf5\x0c\x61\xfa\x18\x33\xaa\x42\xfd\x42\x92\x19\x52\x2a\x03\x83\x70\x42\x0f\xa7\xf4\xf0\xa4\x1e\xf4\xfa\xd0\xb6\xd0\xbe\xd0\xfb\x21\x72\x24\x04\x28\xc4\x85\x08\xd7\xa0\x7d\x2c\x08\x3a\x5d\x15\xe3\x20\x2b\xa5\x06\x79\xe9\xd7\x78\x3e\xc6\xcb\xef\x0f\xc3\x30\x6f\xe7\x8b\xa5\x67\xc5\x69\xcc\xde\x5e\xa4\xa1\xd3\xab\x7e\x91\x65\x93\xcb\xf6\x0d\x95\x3a\x8d\x7c\xe5\x94\xd4\x69\xe4\xf4\x0b\x4c\xb2\x6f\xac\xd9\xda\xf3\xa9\x6b\x7a\xd9\xc9\x3b\xcb\xbb\x8e\x9c\x7a\x16\x77\x1d\x39\x5d\xc4\x3f\xa4\x77\x51\x7f\x42\x61\xb4\x54\xe0\x3d\xbd\x3e\x1f\xd8\x7a\x9c\xe1\x70\x0d\x57\x03\xfb\x6a\x4e\xd6\xbc\x55\x43\x6e\xad\x01\x54\xe3\xad\x89\xd7\x90\x0a\xb6\x47\xbb\xb4\xda\x19\x0a\x79\xae\x80\x45\x7c\x51\x9e\xc2\xb0\x04\xf2\x26\xee\x2d\x3c\x85\xd9\x31\x12\xa7\xe6\x35\x2b\x58\x62\xd9\xbc\x66\xc5\x4d\xdc\xcd\x24\xfb\xd6\x35\xdb\x7a\x6e\xdd\x92\x51\x5c\x3e\x85\xf5\x13\x54\x33\x59\x72\x23\xf3\x1b\x4e\xf1\x9d\xbf\x21\x0e\x6e\x2a\xf9\xc4\x97\x15\x7d\xe2\x9c\x02\x06\x71\xee\x23\x25\xe7\xa2\x3c\x8e\xac\x28\x80\x12\xa8\x13\x40\x18\x3e\x5c\x03\x35\xcf\xd4\xd6\xc6\x13\x09\x77\xf3\x01\x56\xe7\xd1\x11\x9c\xce\xab\x23\x74\xba\xe5\x81\xf5\x01\x22\xa0\x50\xae\xb2\x5d\x63\x23\x18\x1b\xed\x4e\x1e\x60\x91\x07\x6d\x45\x24\x42\x3f\x56\x43\x93\xba\x47\xbd\x42\x7d\x5e\x4d\xa9\x2f\x91\xd0\x4c\x66\xc8\x95\xe4\x4b\x24\x45\xba\xdd\x2a\x9a\xa3\x60\x1f\x75\x8c\xba\x48\x91\x54\xb1\x47\x22\xc5\x51\x94\xc0\x0a\x1e\x21\x26\x1c\x15\x4e\x08\x6f\x0a\x8c\x42\x89\x1b\xb6\x24\x54\x8a\x91\x80\xdb\xab\xd6\x67\xdc\x6a\xb2\xdd\x91\x82\xd4\xed\x46\xae\x1d\x8e\x1a\xdf\x33\x12\xa3\x46\xe0\x12\xde\x04\x11\x68\x37\x26\x12\xc6\xf6\x00\x45\xd5\xa8\x28\x23\x4a\xf3\x31\x29\x21\x1d\xd7\x91\x71\xe2\x86\xe0\xf9\x08\x37\xa3\x11\x26\xc6\xb0\xcb\xe5\xc4\xff\xec\xb1\x1c\xd6\x0b\xb8\x25\x26\x4e\xa5\x13\xdf\x13\x1f\xfb\x03\x6e\x02\xc4\x28\x20\x80\x3b\x64\x16\xf3\xcc\x2a\x09\x0d\xc8\x9d\x32\x4d\xa5\xf2\x6e\xec\x28\xc2\x00\xae\x7c\xb2\x91\xcc\xb6\xf3\x70\xf9\x99\xe3\x93\x6f\x3c\xf4\x34\x7c\xc8\xb7\x7a\xdb\x06\x92\x89\xa5\x9d\x01\x6d\x79\x2f\xcd\x83\x96\xf8\x54\x3d\xf8\xd3\xe9\x64\x22\xcd\x27\xb4\xc9\x34\xfd\x50\xf7\xa8\xe3\xe3\x00\x1c\xca\xef\xa2\x7e\xea\x18\xed\xe6\x97\x34\xbb\xdd\x4d\x4b\x2e\x8f\xc0\x1e\x2e\xda\xd8\x56\x51\xd1\xde\x18\x65\xf3\x07\xa8\x23\xf6\x8e\x2e\xa1\x82\xb3\x76\xf5\xcc\xb1\xe6\xff\xda\xd0\xde\xde\xc0\xb7\x91\xed\x88\x96\xf2\x83\x14\x8f\x23\x1d\x4a\x20\x01\x2d\x45\xa3\xe8\x21\x21\xb0\xec\x00\xdb\xe5\xe9\x8a\x75\x91\x5d\x5d\x43\x07\x16\x32\xba\x85\xba\x85\x3a\x67\x25\xdb\xd4\x93\x58\xb6\x36\xbd\x16\x3a\x33\xce\xea\x33\x85\x8b\x42\xab\xce\x90\xa9\xe6\x54\xda\x4c\x75\xb5\x73\xf9\x9a\x95\xb7\x67\xb3\xba\x51\xdd\x36\x1d\xa9\xd3\x65\xb3\xf4\xf0\xed\x42\x77\xb6\x9b\xe8\xee\x0e\x57\x65\x23\xcd\x03\x95\x95\x11\x2e\x99\x65\x2d\x56\xbd\x85\xa5\x81\x46\xb1\x5c\x59\xe7\x07\x5e\x5c\xd2\x96\x18\x1f\xcb\x71\x13\xa5\x2e\x10\x12\xe6\x2d\xae\xdf\xe5\x5e\xe5\x26\xc4\x31\xd3\x2a\xe4\xff\xf9\xde\x10\x33\x0b\x96\x15\xc5\xd5\xe7\x93\x8d\x70\xbe\xb4\xb0\x03\x81\x9b\x60\xe0\x9f\xee\x22\x01\xb7\x04\x3a\x96\x26\x92\x03\x6d\x3e\x5f\xdb\x40\x32\xbe\xb4\x33\xb0\x33\x9d\x48\xa6\x5b\x9a\x13\x69\xe6\x4c\xd9\x6a\xff\x7d\xf5\xff\xa2\xdf\x04\xad\xe4\xfb\x9b\xdd\xee\xe6\x25\xbc\xfc\x22\x1b\x52\xed\xed\xa9\x54\x7b\x3b\xde\x87\xb8\xce\x12\xdb\x1a\xb7\x4a\x76\x12\x11\x94\xfc\x05\x5e\x3a\x44\x9c\x81\xcc\xb8\xd9\x39\x2d\x06\x8e\x73\xf0\xb1\xad\xf1\x98\x9c\x63\xb5\x53\xb2\x65\xc8\x9c\x21\x44\x6e\xef\x5f\x81\x2a\x66\xf8\xe7\xc6\x65\xff\xdc\xf1\xe9\xb5\x61\x64\x27\x1d\x22\x57\x26\x9b\x0d\xd4\xb4\xf1\x38\x7f\x13\xd3\x3f\x5b\x9e\x63\x4b\xb6\x1a\x42\xe4\xa2\x68\x83\x6e\xfa\x9d\xbe\xad\xec\x4e\xcf\x1c\xf2\x17\x6f\xbf\xff\x31\x5e\xf2\x43\xe0\xbb\x77\xbe\xad\xec\x4e\xcf\x1c\xf2\x3f\x55\xf2\xa4\x97\x3c\x10\xd8\xe6\xa6\xee\x87\x7f\x67\xde\x32\x32\x64\x06\xf7\x35\x21\xa8\x4b\xe4\x71\xc6\x87\xcc\x28\x28\x18\x58\x3d\x45\xa1\x73\x4a\x4a\xbf\x0f\xb1\xca\x11\x25\xa1\x44\xb1\x1c\xef\xfc\x41\x12\x62\xce\x1f\x14\x1b\x36\x05\x70\x9f\x35\x45\x20\x25\x4a\x54\x25\x69\x23\x8f\xef\xe2\x37\x37\x34\x6e\xe2\x77\x39\xe7\xcd\x6d\xe3\xce\x71\x6d\x73\xe7\x3b\xa8\x4b\xfe\x35\x4d\x4d\x6b\xfc\x2e\x8c\xbf\x20\xb5\x3e\x99\xf1\x2c\x86\xe6\x38\x74\x4e\x63\xd2\xed\xe3\x58\x66\x84\x21\x18\xfc\xac\x57\xa7\x3d\x4b\x94\x57\xa9\xab\x0a\xee\x0f\xc5\x93\xc7\x1d\xf3\xe5\x67\xcc\x73\xee\xe2\x37\x35\x36\x6c\xe6\x77\x31\x8c\x7b\x51\x7f\x36\x10\xc8\xf6\x2f\x72\xbb\xfc\x6b\x9a\x9b\xd7\xf8\x11\x80\x8b\xba\x44\x0e\xd2\xa2\x9a\xb4\x08\x6a\x40\xe8\x28\x4b\x8e\x90\x04\x89\x62\xb9\x09\x09\x32\xc2\x67\xf1\x81\x8b\x48\x4f\x3e\x47\x6f\xbd\xb7\x50\x00\x7b\xfe\x25\x72\x65\x61\xd4\x28\xea\x6f\xf4\xf7\xf7\xb1\xad\x90\x45\x08\xce\x50\x19\x44\x20\x1a\x21\xd0\x00\xf8\x4c\x70\xe6\xd4\x19\xd8\x98\xbf\xff\x0c\x95\xc9\xff\x06\xec\x1f\x9f\x01\xbb\xd4\x1f\xc6\x47\x5d\x22\x77\xd3\xef\x22\x0b\x8a\x09\x15\x96\x03\x05\x04\xe8\x9c\xe6\x80\x1a\xed\x55\x1f\x55\x9f\x50\x93\xea\x7d\xdc\x51\x96\x1e\xa1\x09\x71\x07\x4f\x38\x5f\xcd\x25\x21\x56\xc4\x83\x92\xb6\x63\x98\x97\xc1\x0d\xc9\xdd\x54\xdd\xe2\x2d\x3d\x0b\xb6\x2c\x08\x93\x9b\xa9\x8a\xf8\xdc\xba\xaa\x2e\xde\x4f\xd1\xef\x76\xac\xeb\xad\x09\x2f\x58\x9f\x8e\x24\x1d\x0a\x95\x2b\x51\x8d\xcf\xcf\x93\xb4\x84\xd1\xaf\x43\x15\x02\xa7\x3c\x84\xc8\x3b\x4f\x68\x2e\x68\xde\xd3\x90\x71\x0d\x68\x50\x2c\x97\x7b\x1b\x62\x18\xd2\xa4\x0c\x68\xea\xe4\x14\x14\x3e\xbd\x63\x1a\xee\x3d\x01\x5b\xa8\x4b\x64\x82\x39\x84\xf1\x0d\x04\xa1\xde\x7c\x80\x45\x69\xb4\x04\x8d\x20\x0a\x39\x0f\xc4\xd5\xa0\xb6\xdd\xce\xb2\x1e\x36\xcd\x2e\x61\x47\xd8\x27\xd9\x02\xab\x60\x58\xf7\xed\x53\x53\xfb\xe1\x70\x0e\x23\xa9\xfc\x30\x37\x0b\xe2\x41\xb9\x02\x21\x13\xb2\x1e\xf0\x7a\x67\xea\x01\xfa\xeb\xff\x68\x37\x03\xf2\xe4\xe7\xc0\x30\x42\xc8\x8c\xac\x82\x8a\xd9\x87\x3e\xad\x33\x92\xff\xaa\x46\xb1\x89\x98\xb8\xa0\x3f\x48\xc4\x6d\xa5\x4e\x2b\x01\x7f\x08\x57\xc9\xf3\xcc\x78\x83\xdf\x51\xaf\x77\x0a\xee\xb1\xb1\xca\x58\xb3\x73\xff\x91\x77\xeb\x23\x34\xb5\x5d\xa9\xdc\x38\x58\xbb\x50\x68\x30\x1d\x44\xa5\xbd\xf0\x3a\xfd\x0b\xe4\x42\xcd\x42\x80\xb5\xc5\x6c\x84\x0d\xa9\xbc\x2a\x42\xa1\xb2\xd2\x47\xf5\x02\x67\xca\xe8\x05\x85\x26\xa3\xd7\x9b\x8e\xaa\x58\x04\x08\xc5\x72\xc9\x09\x3e\x16\x89\x4c\xf0\xa2\x21\xff\x03\xdc\x57\x58\xd2\xa7\x01\x29\x03\x57\xe4\x84\xd7\x93\x44\xbe\x7a\xc9\xa2\x6e\x6f\x7d\x5c\xbf\x91\xf6\xa5\x7a\xa3\xb5\xfd\x8b\xe6\xbb\xeb\xa3\xec\x35\xe2\x27\xea\xa7\x81\x48\x20\xd5\xd9\xbe\x76\x7e\x30\x50\x1b\x68\xe8\x6c\x5f\x33\x3f\x24\xd9\xaa\x6f\x52\x97\xc8\x67\x30\xee\x89\x0b\xd5\x0b\x0e\xb3\x5e\xaf\x10\xb2\x08\xc4\xf7\x41\x20\x13\x7d\xd7\x3e\x57\x09\x08\x85\x77\xfe\x21\x09\xb1\x5c\xce\xf9\x6a\x8b\x28\xdd\x53\x27\x66\xb0\xf4\xdd\x9b\x18\x19\xe5\x3c\x3e\x09\xd7\xc1\xb5\x58\x7d\xbf\x88\x3f\x8d\x4d\xc3\x49\x71\xcd\xc0\x4c\x21\xd0\x8e\xc9\x1f\x11\x4d\x85\x03\x58\x26\x5a\x85\xea\x2b\x65\xc2\x7d\x3b\xa2\x39\x19\xb5\xe4\x24\xfd\x3e\xad\x60\x68\xdb\xed\x2c\x8a\xfd\xf3\xd2\x40\x34\xcd\x94\x86\x4f\x08\x92\x34\x08\xf9\x27\xfe\xa1\x6e\x47\x70\xf9\x28\x75\x29\xef\xf8\xe7\xfa\x32\xe5\x1d\xbb\x02\xfd\x8b\x05\xa9\x2f\x93\xb5\xd8\x97\x09\xeb\x0d\xfc\xfe\x27\x33\xd4\xa5\xfc\xeb\xff\x1c\xce\xcc\x64\xc6\x12\x8f\x46\xa4\xe3\xcf\x2f\xe1\xcc\x64\x03\x65\x38\x33\x97\xbb\xa9\x4b\x05\xf3\xff\x0d\x59\xca\xcf\xa9\x5e\xb2\xa8\xc7\x53\x92\xa5\x9a\xfe\xc5\x58\x96\xc4\x4f\x0b\x8a\xb2\xb4\x66\x7e\x68\x9a\x2c\xc1\x24\x45\x9d\xc9\xef\x62\x8e\x22\x17\x0a\x09\x46\x5a\xa9\xd4\x21\x0b\xad\x54\x1a\x59\x87\xc7\x41\x38\xf6\x31\x28\xe6\xfc\x41\x2e\xd9\x62\xe0\x21\xf6\x83\xa4\xd4\x97\xc2\xac\x27\x58\x08\x84\xa7\x7a\xee\xa7\xf0\xdd\x2d\xbf\xcb\x55\xdf\xee\x57\x6f\xd7\x07\xdb\x6b\x6d\x96\xaa\xa4\xbb\xa2\x81\xe3\x92\x35\x07\x0f\xd2\x6f\x84\x5b\x6b\x5c\x8a\xad\xa7\x18\xce\xee\xb3\xdb\xbd\x26\x05\x49\x6e\x26\xe9\x21\x2c\x43\x1f\xff\x94\xba\x94\x3f\xfb\x8f\x64\xd9\xa2\xb8\x6b\x1f\xcb\xc2\x08\x10\x70\xa5\x2c\x4f\xbd\x40\x7a\xea\x55\x9e\x1d\x0b\xf4\x2f\x4e\x73\x2f\x72\xb5\xb1\xb8\x25\x7f\xef\x18\x6e\xb8\x75\x1e\x7f\x9a\xf6\x62\x5d\xd3\x5f\x32\x4c\x26\xf2\xf7\xe7\x99\xc2\x1e\xa4\x43\xec\x37\x95\x87\x90\xe6\x4e\x12\xe3\xd9\x4c\x24\xe2\xb4\x8c\xcb\x87\x6f\xdf\x93\x89\xce\xfa\x48\xda\xe0\x0e\x5b\xea\x3b\xff\xda\xde\xd4\xd4\xee\x8e\x54\xe8\x9b\x10\xc0\x87\xd4\x25\x92\xc2\xf3\x08\x0b\x56\x9a\xd3\x1a\x32\x34\x23\x68\x45\x4d\x4c\xdf\x55\x26\x2f\x7f\x00\xe9\x34\x8b\x4c\x33\xbd\x3e\x54\x9b\x4d\x1c\x75\x9e\xf1\xd5\x37\xd8\x37\x53\x1f\x54\x2e\xee\xcf\xfa\x2c\xf6\xbe\x15\xcb\xbd\x08\x21\x12\xcc\xb4\x96\x3c\xcc\x8c\xe3\x35\xaa\x41\xeb\x05\x47\xc5\xa7\xd9\x2a\x4f\x15\x21\xfe\x73\xa1\x8a\xac\x12\x54\xda\x4c\x55\x95\xce\xfa\x69\x5c\xfa\x17\x56\xe9\x32\x7a\xbd\xcc\x82\x56\x47\xdf\xa5\xd5\x7a\x0c\x77\x86\x0b\x0e\x18\x75\x9c\x72\x5c\x74\x90\xf8\xdd\x32\x0e\x24\x79\x98\xdf\x4e\xb6\xc4\xfe\x00\x31\xfe\xd5\x64\x84\x8f\x45\x26\x70\x2f\x81\xed\xd3\x2c\xc3\x70\xf9\x19\x31\x1d\x99\x30\xaf\x71\xd8\xad\xca\x0b\xc6\x78\x73\x87\x77\xe0\x77\xcd\x35\x12\x38\x61\x4d\x33\x7c\xb3\x0c\xa8\xf0\x50\xe5\xc2\x25\xfd\x55\x66\xef\xe2\x6c\x7f\x90\x29\x81\x15\x96\xc3\x16\x16\x0a\x85\xdf\x4a\x7d\xf9\x4b\xb9\xf2\x5b\x26\xff\x58\xb8\x0f\xd9\x4f\x13\x4e\x92\x88\xfb\xe1\x4c\xe1\xb7\xe3\x7e\x3f\x55\xca\x2c\xf9\x7f\x83\x51\x54\x28\x14\x7e\x8d\x10\xb5\x98\x3e\xc3\x85\x51\x35\x8e\xf5\x8b\x9c\xbe\x57\xb8\x0f\x45\xc7\xc1\x40\x82\xf1\x4c\xe1\xdc\xd7\x95\x6c\xe6\x4c\xe1\xb3\x02\x6b\x34\x12\x44\x10\xa1\x0d\xae\x67\x71\x37\x5d\xc8\xe5\xb8\x7c\x03\x44\x22\x45\xac\x19\x91\x16\x9d\xc5\x78\x35\x91\xdd\x53\x94\x12\x65\x94\x0c\x99\x33\x85\xaf\x09\x46\xa3\x91\x61\x82\x08\xad\xdb\xea\x82\x98\x0b\x38\x17\xb8\x80\xcb\xe5\x72\xf9\x06\x99\x98\x44\x8b\x1c\xc5\x7c\xd5\xa1\xcb\x65\x7c\xad\x17\xac\x22\xb9\x73\x46\x38\x69\x84\xb8\x11\xbc\x46\xe0\x8c\x80\x8c\x70\xa6\xf0\x6f\x42\x4c\x22\xfc\x3e\x82\x8b\x08\xce\x21\x78\x12\xc1\x36\x04\xa3\x08\xb2\x18\x1f\x27\x8d\x00\x79\x5d\xe0\x12\x14\x8a\x8c\x4b\x50\xa8\x32\x10\x89\x94\xd0\x6d\x72\xb9\x54\x29\x3b\xb8\x38\x9f\xc2\x3b\xf4\xf3\xf4\xab\x5c\x08\x25\x07\xa6\x38\xe8\x11\xe2\x44\x3d\x49\x9c\x8c\xc2\xbe\x28\x6c\x8b\x42\x36\x0a\xde\x28\x70\x51\x40\x51\xa8\x8a\x46\xd5\xea\x20\xa0\x2c\x7e\x24\xda\xf0\x6c\x13\xb0\x4d\xd0\x24\xce\x2e\x9f\xcb\x35\x34\x14\x93\xcf\xe4\x57\x2e\xaf\xd9\x52\x3c\xcf\x76\x70\x97\xcd\x73\xe1\x38\xe8\x49\x60\xc5\x77\x6d\xb5\x65\x4e\xb2\xf8\xdb\xaf\xab\xc4\x05\xfc\xb1\x50\xc1\xb2\x0a\x45\x10\x9d\xa3\xe1\x14\x0d\x7b\x69\xf0\xd2\x40\xa7\xed\x10\xb3\x03\x6b\x17\xdf\x8b\x34\xa9\x54\x24\x92\x2b\x5f\x4f\x06\x89\x73\x81\xa3\x83\x53\x4f\x49\x09\x01\x48\x91\xe0\x6d\x04\xae\x11\x50\x23\x58\x1b\x1b\x4d\xa6\x20\xca\xba\x21\xeb\x06\xf7\x86\x67\xd3\xc0\xa6\x21\x5d\x64\x3f\x52\xe4\xbc\x50\x28\xfc\xb2\xf0\x0e\x71\x23\x33\x6e\x0c\xc1\x09\xcc\xf5\x75\x38\x2f\xd2\x2e\xb0\x24\x01\xe7\xaa\x40\xa8\x02\x6f\x55\xab\x45\xae\x06\x91\xf1\x8c\x90\xbc\x27\x18\x71\x4f\xc8\xf1\xcd\x43\xb8\x0e\x20\x88\xa6\xf7\xfd\x9e\x2b\xa8\x5f\x40\x1f\x20\xe2\x14\x02\x02\x23\x4f\x79\x94\xa6\x0c\x42\x0a\x56\x11\x53\x2c\x51\x6c\x55\x50\x0a\xc1\x60\xcf\x90\x83\xd4\x18\x43\x8c\xd0\x24\x69\x2c\x3a\x3a\x71\xe3\xd5\xc8\x08\xee\x1e\x82\xe3\x49\xe4\x33\x93\xcf\x9f\xa5\x4f\x3f\xfa\xd1\xfb\xf4\x69\xf1\x8c\x0f\x22\x44\x6d\xc4\xcf\xd0\xa3\x95\x82\x81\xa6\x18\x86\xd0\x0c\x4d\x6f\x01\x1b\x66\xd4\x19\x00\x2e\xc6\x8d\x70\x5b\xb9\xbd\xdc\x09\xee\x59\x8e\xe1\x04\x46\x95\x51\x0f\x11\x8c\x57\x6d\xc8\x30\x14\xa9\x1e\x21\x70\x1a\x00\x1f\x81\x98\xfc\xd4\xdc\x44\x11\xc9\x3e\x68\xf1\xa5\x80\xc7\x7d\x0e\x7c\x64\x14\xa8\x8d\x1f\x7f\x07\xbe\xfb\xd4\xb0\xa1\xd6\x9d\x27\x9e\xb8\xec\x89\xee\xd9\x73\x90\x4e\xbc\xda\xfb\xd8\xd0\xa4\x9a\x78\x7f\xcd\x63\xa8\x2c\x4f\x8c\x41\xd5\x53\x7e\x63\xfc\xb9\xa3\xb4\x56\x3f\xc2\x9f\x23\x32\x2e\x84\xd4\xa3\x5b\xaa\xff\xbb\x4a\x68\x40\x80\x40\xef\x1f\xa2\x36\xd4\x5f\xac\x87\x0b\xf5\xb0\xaf\x1e\xd2\xf5\x5b\xeb\x09\xfb\x90\x7e\x7d\x1d\x39\xca\xca\x80\x26\x94\x12\x21\x77\x78\xc4\x44\xb9\x47\x54\xa6\xa9\x8e\x73\xe5\xbd\xa6\x71\x6e\x95\x74\x73\x08\xfe\x13\x8d\xbc\xe1\x1d\xc2\x3a\xf9\x3b\xf2\xe0\xff\xdc\xce\x9b\x6c\xf9\xdc\xfc\x7f\xaa\xa1\x77\x31\x2f\x15\xcf\xb7\xae\x34\xff\xcf\xe3\xcf\xd1\x52\xcf\x53\xa9\x8f\xef\x88\x50\x11\xd3\xbf\xa7\x2f\xe8\x49\xbd\x60\xb4\x64\xf4\x82\x8e\xcb\xe0\xa6\xbd\x5a\x0d\x4d\xab\xd4\x67\x0a\xef\x0b\x7e\x35\xc4\xb0\x21\x77\x02\x3d\x89\x2e\xa0\xf7\x90\x82\x43\x80\x38\x44\x7b\xd5\xfa\x0c\xad\x91\x7a\xf8\x27\xf1\xbb\x6c\xce\xe5\x92\xb1\x66\xdc\x96\x95\x8f\x44\x22\x38\x99\x15\xa4\xab\x20\x04\x80\xa7\x8e\xbc\x98\xff\xa9\x27\xca\x8a\xaf\xf2\xd2\xf7\xe0\xd7\x4f\x91\xc7\xd7\x3c\xb6\x70\xe1\x63\x43\x97\x47\xe9\xd3\x32\x9f\x4c\x0c\xf3\x19\x9f\xca\xd5\xc2\x9f\x13\xf8\xbd\x89\xef\xf5\x5d\xdc\x53\x54\x81\x34\xe8\x6a\xa1\xd3\x8c\xc0\x05\x20\xbe\x3d\x0d\xc3\x20\x25\x9c\x53\x42\x5a\x09\x4a\x8c\x15\x4f\xc4\x75\xa0\x50\x6c\xd3\xec\xd3\x10\x4b\x34\xa0\x21\x47\xc4\xb7\x48\x28\x11\xa2\x34\x23\x6a\xa3\x62\x84\x2a\xa1\xd1\x48\xf6\x67\x8e\x8f\x49\xc8\xc5\xdb\x93\x31\x09\x4b\x53\x3c\x17\x7c\x16\x1f\x29\xde\x02\x2d\xbe\xd4\xab\xc4\xa3\x93\x83\x03\x64\xef\xe5\xd3\xe4\x8e\xcb\x63\x64\xdf\xe7\x49\xf5\x23\x1f\xdf\x85\xfb\x32\x17\xf3\x6f\xe8\x57\x8d\x0c\x4a\x16\xf7\x23\xf5\x1c\xee\x5f\x9a\x10\x2a\x61\x10\xad\x53\x9d\x52\xc1\x56\xd5\x09\xd5\x93\x2a\x92\x53\x01\x35\x48\x8f\x29\xc9\x11\x86\xa4\xa5\xe5\x9b\xd6\xa9\xd9\x27\x65\xad\xfb\xa8\xe7\x9e\x9a\xdc\x7d\x96\xfc\x88\x36\x7e\x24\x4e\xbb\xf4\x2e\x79\xbc\x26\x52\x2f\xab\x3e\x39\xfe\xac\x41\x83\x82\x4e\x39\xc4\x78\xcd\xb6\x0c\xc1\x10\x0c\xa8\xc5\xdd\x18\x62\x2c\x19\xb5\x5a\xc7\xea\x62\x18\x3d\x9f\x62\x14\xaa\x21\x32\x06\x69\x20\x40\x49\x10\x2a\x71\x15\x54\xc5\x9c\x1c\xbc\x01\xc1\x8e\x33\xd6\xb1\x73\x2e\x22\x21\xc4\x4f\x24\xe2\x7c\x4a\x05\x29\x9f\xc5\xa7\x02\x9f\xa5\x0f\x1e\xce\x5f\x47\xee\x99\x5c\x09\x07\xf3\x1b\x88\xbf\xdd\x4f\xac\x27\x82\x77\x3f\x32\xf9\xee\xe4\x23\x8f\xa0\x62\x8c\x1d\xf3\xd7\x34\x15\x0f\xc3\x9f\xdb\xf1\x3b\xdc\x58\x78\x87\x3e\x4b\xbf\x82\x7c\x28\x8a\xda\xd0\x7e\x21\xeb\x27\x36\x18\xc0\x30\xd8\xe6\x3b\x6e\x84\x43\x46\xf8\xa4\x11\x8c\x46\x57\xf5\x90\x72\x43\x47\xac\x03\x50\x07\x5c\xec\x80\x27\x3b\x9e\xed\x20\x8e\x75\xc0\x48\x07\xc4\x3b\x80\xed\xf0\x74\x10\x4c\x6a\xc8\xb5\xbe\xdd\xdf\x36\x6a\xe2\x4c\xd1\xd8\xa8\x8f\xf0\x99\x7c\x26\x9f\xc1\x84\x28\x19\x1c\xdb\x30\x85\xe4\x2d\xbb\x7c\x73\xb9\xdc\xf6\xed\xa5\xe6\x63\x3c\x3f\x91\xc3\x69\x71\x12\xb4\x87\xc5\xac\xa7\x22\x60\x09\xa4\x02\xfe\x28\x25\x5e\x3e\xda\xc0\x54\xea\x83\x4e\xca\x59\x47\x6d\x40\x8c\x3f\xb5\xe0\x96\xef\xde\xdc\x6e\x6f\x58\x7a\xd3\x89\x75\xb1\xa7\x62\xeb\x4e\xdc\xb4\x34\x65\xef\xb8\xf9\xbb\x07\x7b\x9f\x72\xe6\x8e\x0c\x45\x6b\xae\xda\xbb\xa2\xe5\xa9\x96\x15\x7b\x97\x56\x47\x87\x8e\xe4\x9c\xf4\x2b\xe3\xc3\x0f\xbc\xb0\xbe\x63\xff\xee\xeb\x06\xe2\x13\x13\xf1\x81\xeb\x76\xef\xef\x58\xff\xc2\x03\xc3\x97\xaf\x6a\xbb\xe6\x33\x2b\xfb\x8e\x6c\x6c\x6f\xdf\x78\xa4\x6f\xe5\x67\xae\x69\x2b\xad\xd7\x28\x5e\xaf\x36\xa9\x8f\x3a\x42\xf4\x59\x9c\x0b\xb8\x4d\xe8\xf1\x6c\x50\x81\x6a\xb0\xe2\xb8\x1a\x0e\xa9\xe1\x93\x6a\x50\xab\x4d\x81\x21\xb4\x21\x1c\x0b\x03\x0a\xc3\xc5\x30\x3c\x19\x7e\x36\x4c\x1c\xc3\xf9\x85\xf1\x30\xb0\x61\x4f\x98\x60\xac\x43\xa6\xf5\x21\x4f\xc5\xa8\x52\xa3\x51\x55\xb9\xcd\xa4\x4a\x54\xf8\x3c\x2f\x07\x97\x66\x5f\x9c\x89\x9c\x54\xe1\x4e\x61\xf4\x13\xbc\x26\x06\xde\x80\x97\xc0\xc0\x1b\xf8\x64\x63\xca\xc0\xd3\x67\x67\xac\xc2\x73\x78\xc2\x4f\x39\xcf\x7e\xeb\x1c\xf9\x93\x8e\xbd\x37\x6e\xea\x8b\xe6\xe7\xc0\x33\xf5\x7d\x1b\x6f\xbc\xb9\x03\x7e\x91\xf7\xad\xbc\x63\x6d\x03\x39\x78\xf9\xd1\x17\xbf\x06\xbf\x90\x65\x97\x7e\x94\x7e\x15\xc5\xd0\xbf\x08\xfd\xfa\x21\x8d\x7f\x28\xe8\xd5\xc4\x35\x04\xa5\x81\x58\x30\x1d\x7c\x33\xf8\x5e\x90\xd2\x04\x41\xa1\x09\x6a\x82\xa6\xc8\x10\x13\xb0\x06\x88\x80\x7b\x43\xe2\x62\x02\x2e\x24\x60\x5f\x02\xd2\x89\xad\x09\x42\xa5\x73\xe8\x08\xa5\x8e\x1e\x32\xad\x8f\xa3\x11\x3b\x15\xf2\xab\x75\x23\x41\x2d\xc6\x36\x4b\x26\xe5\xad\xc5\x0f\xcb\x09\x96\xc9\x9c\x84\x94\x2b\xb5\xa2\x9b\x28\x47\xab\xb6\x59\x7c\x29\x5f\xb1\x21\x95\x64\x0b\xca\xdd\x00\x44\x29\x20\x3e\xba\xfe\x91\x4d\xc9\x40\xff\x81\x91\xc9\x53\xb0\x56\xd8\x9a\x8d\xf6\x9f\x7c\xe7\xb8\xa8\xac\xa3\xd9\xeb\xba\x60\xed\xe4\xa9\x91\x03\xfd\x81\xe4\xa6\x47\xe8\x9a\x79\xfb\xcf\xee\x1c\x7b\xea\xcb\xf7\x75\xdd\xfd\x48\xfc\xd0\x63\xe7\xb7\xde\xfb\xc1\x57\x86\x87\xbf\xf2\xc1\xbd\x5b\xcf\x3f\x76\x28\xfe\xc8\xdd\x5d\xf7\x7d\xf9\xa9\xb1\x9d\x67\xf7\xcf\x43\xff\x27\x78\x5c\xff\x87\x71\xe0\xed\x85\x77\xa8\x3b\x19\x9f\x31\x04\xf7\xe1\xd8\xe8\x16\x87\x94\xab\xd8\x6b\x08\x11\xd6\xce\x79\xd6\x58\x99\x3f\x71\xb0\xf0\x0e\xb9\x1a\x8f\x7d\x50\x1a\xfb\x7d\x29\x8e\xda\x6d\x08\xc1\x96\x56\xc1\x5e\x5f\x9e\xe3\x95\x37\x4b\xf9\xb1\xf0\x59\x69\xec\xbc\xa9\x5c\xde\xb5\x33\x72\x79\x1f\xc1\x76\x8f\xaf\x64\xf7\x6c\xc9\xbf\x26\xe5\x58\xf9\x0d\x12\x56\x90\xd5\x6f\x99\x99\x4b\xd1\x81\xed\xa4\x2f\x63\xda\xd7\x71\x08\x19\xbf\x4e\x12\x70\xa6\xf0\xee\x78\xdd\x1c\xda\x85\xe7\x98\x2a\xc5\xec\xee\xc4\xfd\xdf\x3a\x50\xb3\x50\xd9\x5c\x49\xf7\xc4\xaa\xd3\x5c\x1a\xb7\x7f\xeb\xf4\xb3\x95\x9a\xac\x8b\x6d\x8e\xd5\xa1\x2c\x6f\xb0\x96\x44\x83\x97\xeb\x1d\x7f\x28\x55\x0e\xfd\xc3\x0e\x70\x56\x1b\xdf\x09\xe2\xcd\xda\x62\x28\x73\x1d\x45\x89\xf0\xec\xcd\xe0\x3a\xb6\x7f\x7e\x6c\xdb\xb1\x84\x56\xed\x73\x1c\xd5\x98\x74\xca\xa4\x5f\x1f\x54\xb2\x5d\xfe\x50\x3a\x59\xa5\x95\x1a\xc3\xc5\xd6\xde\xbf\x91\xbd\xa2\x31\xdc\x55\xcb\x02\x03\x1e\xdf\xc6\x5d\x37\x37\xe5\x73\xed\xbc\x82\x3c\xa8\x32\x70\x61\x21\x8e\x3b\xc4\x49\x75\xdf\x3b\x71\x7f\xd9\x0e\xb4\x4a\x68\x68\xc9\xd0\x4a\xda\xc3\xc7\x78\x82\xa7\x79\xda\x52\xd7\xa3\x5d\x91\xf6\xa6\xe3\x69\xc2\x6f\xe9\xb1\x2e\xed\xb4\xb8\x94\xc9\x2c\xcb\x83\x92\xe7\x91\x3f\x9c\x35\x58\x2b\x44\xb3\x5a\xd4\xf4\x12\xac\xcb\x44\xcb\x14\x64\xad\xd4\x01\xc1\xd8\xc2\x95\x9a\x29\x4b\x8d\x6e\xe4\x30\xb3\x04\x0b\x84\x5b\x29\x1b\xa6\xc0\x83\x30\x76\xaf\xf4\x2d\x71\xe3\xe8\x17\x6e\x98\x7b\xff\xd1\x53\xdf\x4e\xdf\xf4\xd5\x2d\xa3\x8f\xb4\x9f\x9e\xbf\xeb\xb1\xab\x9b\xc7\x16\xd6\x79\xfb\x06\x06\xaa\xb2\x5b\xbb\x3d\xa9\xd1\x4f\x2f\x59\xbf\x78\xe0\xc6\xbe\x60\x68\xde\x08\xe3\x49\xac\xfd\xcc\xda\x7b\xbe\x6a\x63\x2c\xdf\x3f\xbb\xf9\xf3\x5b\x9a\xbc\x9e\xc9\xdf\x32\x0d\xbb\xbf\xbe\xa3\xe9\x5e\xcf\xa2\xbd\xa3\x97\xef\x32\x56\x5a\x34\xd5\x8b\xb7\xf6\x64\x77\x2e\x0e\xde\x5f\xbd\x60\x7d\x47\x7a\xb8\xd3\x53\xd6\x57\xc9\x85\xae\x16\xac\x6e\xd1\x68\xc9\xba\x81\x75\xc7\xdc\x4b\xdc\xa4\xc2\x49\x03\x9d\x61\x44\xab\xc5\xc2\x30\x1a\x64\x32\x69\x9d\xc8\xe5\x75\x09\x2e\x52\xe9\xe2\x5c\x3a\x2d\x6e\x3d\xa6\x75\x6a\x59\x13\xd2\x58\x68\x17\xd6\x83\x69\xdc\x86\x2b\xd6\x3c\x9c\x93\x02\x51\x3c\x6f\x8f\x35\x4f\xe4\x86\x73\xb9\x48\x22\x1e\xd4\x93\x96\x40\x43\x27\xd1\x54\xde\x71\x8b\x18\xb5\xfa\xed\xda\x67\x58\x57\xd0\x92\x1f\xfd\xce\x25\x7d\xa5\xd3\x4c\x31\xb4\xd9\xe1\xd2\x9c\x7f\xda\xd8\x79\xeb\x2d\x37\x37\xd4\xee\x3a\x7c\x47\x9a\xea\x9c\x3c\x5b\x9d\x1b\xcc\xba\x9c\x03\xb9\x41\x1f\xb1\xa8\x1c\xb7\xc4\x83\x92\x68\x1e\xea\x17\xa2\xce\x6e\xd4\x4c\xd3\x51\x3e\xc3\x56\xad\xe8\x16\xba\x2f\x76\xbf\xd5\x4d\xb2\xdd\xc0\x74\x64\xa2\xcb\xe7\xa3\xaa\x39\x4e\x75\x73\xb3\x7a\x4e\xb6\xc6\x6a\xc9\x72\x6a\xc0\xc5\xba\xa2\x8e\x36\xb6\x18\x5b\xf8\x12\x12\x03\x4e\x26\x6d\x69\x99\xc0\xad\x70\x4a\x65\xba\x0a\xa9\x2d\xce\x34\xf0\x27\x49\x9e\x41\x6a\xa6\x20\x27\xd2\x12\xe6\xe6\xdc\xdc\x20\xbf\x7a\x4f\xef\xbc\xed\xa3\xfd\x81\x5e\xef\x82\xfe\x21\xbe\xb6\x3d\x6c\x74\xb5\xaf\xed\x59\x76\xcb\xea\xc4\xfc\xbd\x5f\xdf\x82\xe3\xd1\xd7\x3f\x00\xe3\x95\x2d\x03\xa9\xd6\x9b\x37\xce\x0b\x2d\xb8\x66\xee\xbf\x3e\x40\x3e\xee\x5d\xb8\x7c\x6d\x4b\xe6\x9a\x6e\xbf\xd9\x13\x36\xdd\x69\x0e\x55\x1a\x6d\xc1\xa4\x2b\xd8\xd9\xd1\x55\x93\xd8\x7c\xf3\xdd\x2b\xf7\x3e\x77\x60\x6e\xc7\xce\xc7\xaf\xdb\xf4\x85\x4f\x5e\x95\xef\x9f\xbf\x75\xd5\x02\x0f\xd7\xba\xf6\xce\x0d\x73\xb6\xf6\xd7\x8f\xcb\x7d\x06\x57\x53\xc3\xa8\x05\xad\x12\x9a\xdc\x01\x00\x3b\x57\xbf\xa2\xed\x64\xdb\xa9\xb6\x73\x6d\x64\xba\x6d\xa4\x8d\xe0\xda\xa0\xa1\x3b\x10\xa0\x7b\xec\xcb\x5b\x2b\x89\xec\xb3\x2d\xb0\xab\xe5\x70\x0b\xd1\xd2\xa2\x4e\x64\xab\x39\x75\xd6\x64\x9d\xd6\xc9\x49\x4a\x2e\xc0\xb9\xef\x49\xbc\x52\xe2\x6d\x46\xee\x36\x21\x27\xd3\x4e\x81\xa3\xa6\xa6\xad\x57\xb1\x29\x05\x4f\x3c\xb4\xff\xb6\x83\x35\xdd\xa3\x4d\xfc\xea\xfe\x1e\x4f\xdb\xc3\x5b\xb6\x3f\xba\x39\x15\x4a\x0f\xd4\x45\xba\xf9\x8a\xd6\x6b\x8e\x2d\x4f\x0d\x0e\x2c\xae\x4e\x2f\xdc\xdf\xb3\x79\x47\x38\x33\xd6\x41\x1c\x7a\x60\x68\x98\x9f\x5f\x6b\x64\xed\x1e\xee\xa4\xbf\x26\xb1\x7c\xe7\xdc\xce\x95\x9d\x35\xac\x46\x1f\xe9\xcc\x26\xbb\xb7\xf4\x86\x54\xa6\x0a\xf3\xdd\xfe\xd0\xe2\xc5\xf5\x42\xd8\x88\xf1\x9c\xb7\x92\x9b\x18\x33\xe2\x51\x8b\xe0\x89\x92\xa4\xa7\xdb\xe9\x35\x83\x39\xc5\xa5\xce\xa5\x08\x75\xa6\x06\xa1\x9a\xe5\x0d\x8e\x28\x89\xb2\x80\x50\x7a\x22\x99\x8c\xe1\xe0\x9d\xd4\x2e\x20\x39\xc1\xc7\x78\x09\x58\x44\x4f\x97\xb7\xd1\x08\xc8\x9d\x32\xc4\x69\x19\x3b\xa1\x89\x51\xe8\x21\xf0\x04\x71\x7a\xdf\x99\x9b\x17\x55\xeb\xea\x97\xde\xb4\xb0\x67\xa4\xd5\x61\xf1\x47\xac\x8f\xdb\x23\x7e\xb3\x3e\x3e\xb4\x78\xd5\xa1\xd5\xd1\xd5\xc7\x5f\xde\x1c\x89\x55\x8f\xc6\xe8\xdd\x0f\xdc\x71\xc3\xab\xdf\x38\x7e\x70\x6b\x7c\xd5\x66\x21\x60\x60\xa3\x6d\x99\xda\xfa\x95\x03\x0b\x3d\xde\x4c\x66\xae\xdb\x1c\xf4\x7b\x58\xc3\x9c\xcd\xf7\xaf\xff\x0c\xc0\x6f\x2e\x6d\x26\x49\x82\x2a\xcb\xf5\xb7\xa3\x84\xe0\xbe\xb2\x9f\xaa\x5e\xee\xa7\x6a\x41\xe2\x8e\x9b\xd1\x50\x15\xfe\xd9\x86\xaa\x79\x33\xf5\xe4\x15\xc9\xfb\x1f\xf7\xc8\x39\xdb\x94\x8d\x89\x20\x13\xee\x1a\x3e\x24\xb4\x06\x1d\x3d\x68\x45\x0d\x5b\x03\x17\x6b\x60\x6f\xcd\x89\x1a\x42\xa8\x01\xb6\x06\x98\x2a\x67\x8f\x7a\x79\xb5\x33\xfb\x4a\x15\x9c\xad\x82\xc3\x55\x0f\x54\x11\x6c\x15\x28\xab\xaa\xcc\x9e\x2c\x0b\xe6\x62\xcb\x55\x29\x59\xbb\xd8\x49\x1c\x7f\xbb\xbd\x88\xeb\x7d\xe5\x9d\x0e\x44\xa1\xf2\x55\x92\x26\xbf\x68\x2f\xa8\x81\xb2\x35\x6c\xfb\xc6\xcd\x37\x3c\xf9\x89\x66\x7e\xeb\xd7\x6e\xbe\xe1\xd4\xce\xd6\x7c\x64\xc1\xc6\xf9\x01\x72\xf2\x15\xc2\x37\x6f\x63\x6f\xcf\xfa\x79\x01\x9a\xe0\x55\x9f\x26\xb5\x4f\xe7\x7f\xf2\xda\x96\x2d\xaf\x41\xcd\xd3\x4f\x43\xcd\x6b\x9b\xaf\x7d\x35\xff\x93\xcb\xdf\xee\xfd\xcc\x9b\xf7\xdc\xfd\xe6\x3d\x0b\x69\x6e\xfe\xe1\x57\x0f\x83\x01\x4c\x72\x0e\x04\x71\x23\x95\x41\x16\x94\x12\x02\x71\x15\xa8\x54\x36\x64\xe3\x6c\x5e\xdb\xa8\x6d\x9b\xed\x98\xed\x9c\xed\xa2\x4d\xa9\x84\x1e\xf3\x52\x2b\x95\x65\xad\x88\x2d\x5e\xea\xb1\x25\x2f\xa5\x0c\x59\xa7\xb5\xe3\x30\xc0\x60\x3a\x63\xac\xaf\xad\x52\xe9\x6a\xe2\x0d\xf6\xce\x4d\x8b\xeb\xa8\xcc\xe5\xcb\x6b\xd6\x4e\x4b\xb5\x24\x29\x39\x8f\xfb\x7d\xaa\xd7\xc8\xa0\x8f\x70\x2d\xd2\x9f\xf0\x7a\x8b\x16\xfc\x46\xa1\xd6\x6f\xb1\x38\x8d\x46\xa8\x51\xd7\xa8\x6b\x50\xd6\x09\x0d\xce\x79\x4e\x02\x39\x39\xa7\xd7\x49\x3a\x9d\xf1\xd1\xf8\xb1\x38\xc1\xc6\x81\x89\x62\x40\x1d\x16\x45\x2d\x35\x00\x7a\x5b\xb6\xd2\xaa\xc8\xea\xa1\x78\x07\xe3\xd3\x53\xcd\x10\x73\xb9\x1c\x86\x9b\xb6\xc7\xa4\x26\x07\x06\x3e\x11\x0f\x40\x18\x37\x9f\x92\x1c\xcc\x95\x84\x4d\x82\x93\x29\x9d\xc3\x64\x94\x0c\x07\xf4\xa0\x20\xf5\x70\x26\xa5\xf3\x44\x3a\x22\xfe\xa4\xd9\x39\x27\xd0\x7b\xcd\x92\xb4\x07\x32\xc6\x68\x48\x1f\x52\xda\x9a\x82\xe1\xb6\x58\x90\x3d\xa4\x71\xbb\xac\x34\xa3\x4b\x79\xde\xa6\xf8\x93\x35\x73\x13\x2e\x05\x7d\xa7\x42\x5d\xbb\xea\x50\xee\x72\x63\x63\x8b\x82\x3c\xa8\xd5\x1b\xaa\x85\x28\x7c\xde\x37\xbc\x66\x85\x63\xf1\xe3\x4b\x26\x9f\x9b\x8e\x0b\x9f\x16\x42\x3a\xed\x15\xc0\xf0\xc8\xd9\xe3\x5a\x5a\xe9\x74\x99\x75\x33\xb0\xe1\x79\x3e\x3d\xd5\x7a\x3b\xf9\x7f\x05\x1f\x5e\xbc\x5c\x5d\xa0\x7a\x91\x19\xb5\x09\x56\xb3\x49\xa1\x40\xba\x1e\xfd\x0a\x2b\x67\x85\x53\x56\x60\xad\xc0\xe0\xae\x82\xa7\x91\xc2\x6c\xd1\x49\xfd\x04\xc5\x73\x2f\x39\x2c\x89\x76\xd1\xf9\x62\x90\x8f\x39\xc2\x98\xe2\xcd\x6a\x60\x14\x81\xa7\x5f\xd6\x7a\x2a\x1d\x34\x33\x78\xfd\x1c\xc7\xe9\xe0\xea\xe3\x3b\xcf\x51\xbd\x93\xa7\x7c\x57\x6f\x58\xed\x18\x7d\xf5\xd7\x40\xdf\xf7\x85\xfc\x5b\xf9\xbf\x4c\xee\x45\x65\x3a\xad\x1b\xdd\x2c\xf4\x25\xdb\xda\x0c\xb5\xd0\xd5\xdd\x5c\x5f\x5f\x55\x21\xe7\x38\x2b\x01\x2a\xba\xbd\x06\x30\x64\xd2\x99\x91\xcc\xde\xcc\x7b\x19\x8a\xcb\x80\x22\x53\xb5\xbc\xa7\x3d\xd9\x9c\x6d\xa9\x45\x0b\x2a\x56\x55\x5c\x53\x41\x36\x57\x80\xa2\xaa\x82\xb4\xc2\x12\x84\xac\x2d\xc8\xfa\x11\x2e\x5b\x8b\x4d\x18\x6c\x2d\xb9\x9c\x01\xe7\x40\x4b\x17\x66\xee\xc7\xb9\x3f\x9e\x8b\x0d\xe7\x70\x7d\xdd\x84\x28\x2b\xa2\x62\x14\x15\xfe\xb4\x93\x6f\x4a\x31\x82\xac\xf7\xa5\xaf\xa2\x7e\x8c\x88\x57\xdb\x12\x4c\x17\x19\xf8\x7c\xff\xde\x15\xf5\xb3\xaa\xca\xaf\x9f\x89\xf5\xad\x6f\x5a\x77\x7d\xfd\x92\x6b\x3b\xfd\x61\xdf\xb2\x68\x27\xb1\xbf\x69\xc1\x9d\x3b\x7a\xbc\xdd\xd7\xf7\x93\x37\x1e\x4e\x2c\xdb\xde\xd5\x37\xda\xe6\x9f\x55\x6d\xfa\xcf\x7f\x73\xf1\xde\xab\xe7\x1a\xb4\x15\xb7\xec\xcc\xac\x5f\x90\x30\x89\xca\xf3\x81\x3b\x42\x7d\x3b\xfb\x52\xfd\x4d\x15\xa5\x7a\x1c\x6a\xd8\xc8\xa0\x01\x7c\xf7\x73\x14\xde\xa1\x5e\xa6\x7a\x91\x1d\xad\x14\x9a\xd5\x3d\xb8\x65\x98\x9e\x34\x9b\x11\xc9\x91\x04\x49\x3a\x63\xce\x13\xce\xf7\x9c\x24\xa7\xeb\x29\x39\x71\x38\x4b\x46\xbf\xd4\x61\xd1\x72\x59\x23\xab\xb7\xa0\xac\x02\x6b\xb4\xb4\xb4\x5e\x91\xdc\x04\x6e\x83\x96\xe3\x63\xe2\x7a\xe5\x26\x44\x8b\xb7\x14\x06\x95\x2b\xe5\x9b\x7c\x96\x80\xc1\x6c\xa5\xb2\x15\x31\x96\xed\x8d\x6f\xdf\x9e\xdf\x72\xfa\x67\x87\xa9\xf0\x1b\xb1\xfd\x3a\xe5\x31\x95\xe1\xd3\x9f\x22\x9e\xb9\x9c\x25\x4f\xf5\x66\x8f\x4f\xf6\x75\x37\x89\x36\xcd\x23\x79\x33\xee\x69\xed\x44\x61\xd4\x22\xf8\x82\x19\xb4\xa2\xe6\x42\x0d\xc8\x4a\xd7\xa3\x62\x7b\xb8\xa5\xd5\xae\xac\x95\x63\x5d\x7e\x09\x4f\x0a\xc3\x56\x4a\x5b\x62\x38\x37\xad\xb9\x75\x68\x0a\x88\x48\x3e\x98\xc1\xcf\x28\x0c\x32\x84\x7f\x88\xaa\x4f\xef\xfc\xe2\xc6\x85\x47\x1b\x19\xbc\x27\xba\x6e\xfa\xd2\x35\x6b\xbe\x70\xe3\xdc\x7c\xdb\xe1\x4f\x91\x8d\x47\x17\xde\xbe\x7b\x8f\x94\x17\x57\x5f\x1f\x89\x86\xd7\x44\xf3\x3f\xa3\x4c\x72\xcb\x6b\xb0\xbf\xf0\x52\xfe\x2b\x7c\xe2\x8d\xd7\x5f\xbf\x20\xcb\xea\x56\x6a\x18\x25\x50\xbf\xd0\x18\x0e\x5b\xba\x39\xa4\xe6\xd4\x5e\x35\xa9\xe6\xd3\xfc\x08\xbf\x97\x7f\x8f\xa7\x38\x1e\x50\xc6\xb3\x3c\x59\x5d\xdf\xdf\xa4\x86\x6a\x4b\xb3\x25\x63\x21\x2d\x6a\x0f\xa2\xd8\x2a\x8e\xc5\x32\x29\xca\xe3\xc4\x94\x2c\x8a\x07\xb3\x38\x93\xd9\x4f\xe4\x62\x7e\x26\xb6\xcb\xa0\xbe\x62\xc1\xcd\x6b\xae\x90\xb1\xc5\x9f\x5e\xdb\xb4\xe0\xc0\x37\x36\xf5\xdd\x93\x6c\xb4\x35\xb7\xb7\x3a\xb3\xd7\x2f\xf0\x13\xcc\xe8\xae\xbe\x98\x75\x36\xb1\x62\xbb\x6e\x18\xff\xd4\xf1\xff\xba\x67\x81\xdf\x81\xdb\xeb\xb5\x6c\xfb\xff\x69\xfb\x17\xf8\xa8\xaa\x73\x6f\x1c\x5f\x97\x7d\x99\xfb\xde\x7b\xee\xb7\xcc\x25\x93\x4c\x2e\x93\x64\x92\x4c\x6e\x93\xeb\x06\x42\x66\x08\x97\x0c\x21\x24\x90\x30\x99\x80\x40\x90\x8b\x21\x0a\x22\x22\x06\x4a\x05\xf1\x06\x5e\x8a\x48\xb5\x72\x78\x29\xad\xd6\x57\x52\xa5\x11\xd1\x16\xac\xb7\x5a\x6b\xa1\x47\x3d\x9e\xd6\xd7\x03\x39\x3d\xf6\x1c\x4f\x39\x95\x63\x7d\xad\x47\xc8\xe4\xff\xd9\x6b\xef\xc9\x4d\xec\xe9\xfb\x7f\xdf\x9f\x6d\x08\x93\x84\xc9\x5e\x6b\x3d\xeb\x59\xcf\xb3\x9e\xef\xf3\xfd\x1e\x9f\xc8\x87\xee\xa2\x5a\x81\x15\x14\x80\x2a\xd1\x9f\xe3\x8f\x1b\x79\xd0\x15\xe2\x43\x07\x43\x47\x43\xc3\xa1\x4b\x21\xda\x16\xd7\x74\x16\x1a\x73\x13\x1c\xe7\xce\x1c\x7c\xe5\x0a\x8d\x68\x79\xf9\xd7\x18\xee\xfc\x16\xbf\x07\x4f\x5e\x5f\x06\xf3\xa4\x31\x50\xc5\x8d\xb7\x9f\xda\xba\xe1\xe4\xce\xe6\x85\x07\x7f\xbd\x0b\x7e\x92\xfe\x22\x77\x56\xa9\x7b\x0c\xf8\x63\x37\x2d\x5c\xb0\x29\xe6\x6f\x9b\x5f\x97\xba\xb7\x3b\x04\xbf\x1c\x38\x77\x7f\xa2\xe5\x9e\xb7\xef\x7a\xfc\x77\xf7\x34\x1e\x29\x48\x6e\xbc\xa3\x6a\xe9\xc1\x1b\xeb\xaa\x57\xed\x5d\x74\xf0\x83\xe5\x45\x37\xfc\x9d\x8c\x53\x34\x8e\x7f\x8c\xd7\x52\xad\xc0\x0d\x6a\xc5\x1c\x48\x10\x6e\x8c\xbe\xcb\xc3\x7b\x60\xc8\x59\xe7\x44\x4e\x1c\xe3\xed\x97\xec\xc8\x8e\x1c\x09\x37\xa7\xca\x04\x7e\xe5\x30\x9c\x1c\x7d\x43\x8a\xf7\x7a\xc9\xad\x85\xc5\x2f\xcc\x94\x9e\x12\xfc\x95\xd5\x78\x6d\xfa\x3e\x47\x71\x63\x8e\xb1\x30\x3f\x47\xaf\xcf\x2b\xa9\x74\x89\x5b\x97\x57\xa4\x3f\xd8\x4b\xb5\x1e\x19\x3b\x56\xd7\x1e\xb1\x61\x86\xa5\xf6\x31\x3a\x2d\x93\xb5\x70\xef\x3a\x74\x4b\x6b\x22\xa3\xbd\xdc\x40\x7c\x7e\x81\x68\xe7\x63\xae\x2e\x22\x8b\xb5\xcb\x8b\x55\x31\xba\xc3\x63\x61\x38\x7d\x02\xc8\x5d\x10\x19\x0a\x56\x59\x0c\x5d\xb9\x2f\xc9\x08\x4f\x44\x3c\xd8\xc2\x23\xb4\x62\xf7\xd3\xab\x0b\x46\x7c\xb3\xd7\xb6\x3c\x74\xbf\x9a\xb7\x71\x23\x9c\x9d\x57\x7d\x6e\x4e\xdc\xf7\xd3\x4d\x68\xd9\xd8\x73\x9d\xf7\xdd\x50\xf5\x6f\x7f\x89\xed\xdc\xba\xa5\xa1\xe1\xe6\x6d\xbb\xe7\xa7\x5f\x49\xbf\x2b\x6b\x9b\xd3\xb9\x54\x2f\xc8\x05\x95\xa0\x57\xac\x2f\xcb\x8d\x59\x0f\x81\x13\x00\x01\xc0\x04\xe3\xde\xae\x6a\x1f\xa9\x94\x5c\xaa\x86\x03\xd5\x43\xd5\x4f\x56\x63\x51\x7a\xed\xad\x46\x8c\x10\x63\x3a\xab\x42\x09\xad\x93\x2f\xb3\x26\x72\xa0\x95\x04\x60\xa4\x25\x6d\x74\xe2\xe2\x67\xe2\xda\x47\x96\x44\x14\x14\xc5\x47\x9b\x9c\x1f\xd8\x84\x4c\x8d\xcf\x80\x58\x01\x4e\xf0\xc4\x36\x62\xb4\x76\xd3\x0b\x7b\xe7\xfb\x6a\x16\x15\xdf\x9f\xdb\x54\xec\x88\x2c\xdb\x22\x7e\xff\xc1\xee\x87\xd6\x56\x77\x1e\xfc\xd9\x3a\xd8\xe6\xa9\x9a\x17\x72\x95\xe5\x5a\xe3\x3b\x96\x47\xd2\x66\xf8\x3b\x7a\xce\xfe\xf7\x1f\x5d\x72\xf8\x9e\x9d\xd5\x7d\x91\x75\x37\xef\x8c\x0d\x3c\xb6\xb2\x94\x45\xbd\x2f\xbf\x92\x38\xf8\xd6\xed\xdf\xf9\xed\xc1\x56\x3a\x1d\xa4\x72\x57\x3d\xb2\x26\x62\xab\xec\x9a\x35\x76\x94\xad\xdb\xf0\xa4\x14\x6b\x5c\x4e\x9b\xa9\x5c\x6a\x11\xc8\x07\x47\x45\xe7\x3a\xef\x6d\x5e\xe4\xed\x57\x6f\x53\xbf\xa9\xc6\x6a\xe6\x56\x37\xac\x76\x43\xb7\xdb\xc3\xaa\x4e\x8f\x9f\x13\x0d\x26\x6b\xbc\x42\x05\x55\xbc\x4a\x75\xce\x48\x8a\x66\xa2\x83\xd1\xc6\x8d\xc6\x42\xae\xb0\xa9\xb0\xad\xf0\x7c\x21\xc5\x0c\xe7\x9e\xcb\x45\xb9\xb9\x59\x1e\x29\x18\xf1\x7a\x3c\x05\x1e\x97\x8d\xc9\x63\x90\xdd\x9d\xef\x46\x6e\xb5\x97\xa1\x00\x97\xb0\xba\x58\x2e\x90\x90\x4e\x49\x85\x5d\x37\x99\x6c\x12\x60\x24\x5c\x13\x89\x84\x93\xf2\xd5\x68\x32\x12\xae\x49\x86\x48\xc6\x98\x4c\x46\x22\xc9\x48\xb2\xac\xd4\x24\xc5\x25\x26\x18\x81\x26\x29\x47\x9e\x12\x9b\xc0\x00\xc4\x52\x72\x21\x05\x2f\x2f\x17\xcf\xab\x2d\xb3\xec\x80\xde\xe7\xd2\xb7\x3c\x67\xc8\x0a\x56\xe4\x3a\x4b\x78\x6b\x34\x7f\x4e\x2a\x16\xb1\xed\x49\x8f\xfc\x1c\xbe\x71\xd4\x15\xab\xcc\x71\x5b\x1b\xa9\x45\xde\xc6\x15\x0d\xe9\x1f\xa2\xd6\x6b\x5f\xa6\x7d\xc1\xd9\x91\x2c\x1a\xdf\xcf\x68\x83\x2d\x6b\x67\xc1\xf5\x63\x7b\x70\x23\xfc\x59\xdb\x72\xcd\x01\x56\x43\xec\x34\x6d\xa6\x07\x19\x23\xc8\x03\x0b\xc4\x30\xb4\xc5\x82\x76\xbb\x87\x89\x09\x5d\x05\xa5\x05\x62\xc1\xc1\x82\xe1\x82\x73\x05\x34\x57\xe0\x2d\x40\x8c\x3f\xe6\xe9\xc8\xd7\x7a\x39\x18\x4c\x58\x1d\x56\x9b\xac\x27\x28\x5b\xc5\x44\x46\x39\x9a\x51\x01\x85\x82\xe2\xbf\x22\x8a\x3f\x13\x02\x92\x85\xc8\xc6\x6d\x13\x70\xe7\xa2\x3d\xa9\x0a\x15\x67\xe7\x47\x78\x3b\xaf\xea\x7a\xf8\xb5\x4d\xcf\x0d\xbc\xbc\x7f\xc1\x48\x55\xf7\x6d\xb3\x19\xe3\x57\xb7\xa8\xeb\x37\x3e\xde\x1f\xdb\x75\xe7\x9e\x79\xf1\x3d\x77\xde\xd9\xfc\xc4\xff\xba\x6f\x2e\x9b\x0e\xc2\xdf\x51\xb3\xee\xfe\x87\x23\xc8\x3b\xf6\xdb\x9b\x8f\xac\x2c\xa1\xe9\x03\x64\xff\x0f\x8e\x5f\xa6\x0f\x51\xad\xa0\x0e\x6c\x16\xe3\x35\xfd\x59\x30\x2b\xf6\xbe\x13\xbe\xe0\x84\x4f\x39\xe1\x11\x27\xc4\x4e\x27\x9d\x1b\x2f\xed\x6a\xa0\x1a\xcc\x0d\xe8\xb5\x86\xcf\x1b\xd0\x8e\x86\xef\x36\x20\xb1\x01\xa2\x89\x7b\x61\x3e\x4e\x77\xd6\xbb\x5c\x85\x1a\xce\x67\x49\x44\x2b\xa5\xbd\x29\x79\xb3\xa6\x48\x34\xac\x8c\x2e\xa5\x84\xf3\x42\x34\x9c\x22\x51\x7e\x32\xaa\x6c\x59\x02\x04\xca\xe4\xc5\x8d\x53\xe1\xc0\x53\x66\x80\x1c\x51\x06\x08\x3f\xe9\xbe\xaf\xaf\x9c\xf3\x86\x7d\x67\x7c\x61\x2f\x97\x55\x35\xbf\xb8\xa4\xb9\xc8\xfa\xdc\x0d\x8b\x8b\xe7\x57\x65\x49\x5f\x7f\x49\xfa\x7a\x79\xdf\xfd\xdd\x1b\xee\xf5\x6a\xbc\xf7\x9a\xdb\x1f\x7a\x7b\xfb\xe2\x03\xfb\xf6\xc5\xe7\xed\xdd\xf7\x40\xfb\xaa\x43\x6b\x2a\x0a\xe2\xab\xa2\xb0\x3c\xfd\xeb\xdd\xf7\x56\xac\x39\xb4\xaa\xfd\x81\x7d\x7b\xe7\xc5\xf7\xed\x3b\xb0\x78\xfb\xdb\x0f\xb5\x77\xf5\xf4\x74\x49\x31\x81\x45\x8a\xfb\xe9\xdf\x66\xee\xcc\xc0\xfa\xf4\x3f\x67\xb8\x51\xbd\x42\x10\xc1\x72\x6b\xa1\xf9\x7a\x3d\x36\x0d\xe4\xdf\xfc\x48\xe6\xd4\x03\x32\xff\x60\x9e\xcc\x3f\xf8\x4f\xa7\x3c\xe5\xca\xdd\xd9\x37\xf7\x02\x6f\x32\x4c\x72\x7a\x36\xcc\xe0\xf4\x94\xef\xe5\xfc\x13\xf7\x72\x9b\x78\xf9\xce\xaf\x50\x08\xc2\x2c\x4f\x8e\xfc\xde\x53\x78\xcd\x0e\x91\x9f\x3d\x29\xdf\xf9\x81\x57\x01\x00\x7e\x51\x0d\xe3\x42\x10\xf6\xd5\xc3\x7a\x69\x9f\xaa\xd5\xda\x78\x43\xfd\x6c\xba\x34\x17\x86\x32\x2c\x6d\x08\x68\xc6\x2f\x53\xcf\x31\x21\xa0\x03\x6d\x60\xab\x18\x5b\xa8\x9f\xc3\x37\x82\x3a\x55\x6c\xce\x1c\x67\x5d\xac\x0d\xf0\x90\xe7\x17\x1f\x5d\x0c\x9b\x16\xc3\x48\x2c\x93\x71\x64\x27\x0a\x1a\xdb\xda\x16\x81\x45\xa0\x80\x27\xb6\x9f\x28\xa0\x99\x82\x45\x05\x8b\x6a\xe8\x44\x1c\xd6\x24\x2c\x99\x14\x8f\xdc\x01\x93\x02\x01\x2f\xcb\x7a\xc9\x91\x91\x64\x16\xa3\x42\x34\xaa\x74\x27\x28\x8a\xb7\x1e\x44\x4f\xf6\x28\x10\x43\x99\xaa\xcf\x27\xbb\x47\xd9\x6c\x8c\x42\x45\x30\x6f\xca\xad\x42\xc4\x82\xd7\xeb\xa3\x0b\x7b\x4a\x17\x74\x96\xac\xff\x11\xac\x47\x48\xdc\xfd\xda\x9e\x81\x87\x3a\xb3\x35\x5a\x8d\xd7\x6b\xaf\xe2\x73\x73\x57\x57\x95\xcf\x2d\x32\x69\xb4\x1a\x4b\xe9\xa2\xda\xe3\xc7\x11\x7a\xf6\xb3\x43\x73\xf2\x16\x0f\x2d\x5f\xf7\x77\x5b\xe7\x1b\x0f\xe0\xdf\x6c\x7c\x7a\x4b\xc3\xb2\x78\xcd\x8d\xed\x91\x7b\xac\xb5\xde\x27\xd3\x7f\x7a\xeb\x96\xea\xd4\xce\xb9\xf9\xc9\xe5\xf3\xed\xc5\x7e\x4e\x33\x24\x38\xdd\xe5\xcd\xf9\x81\xce\xe4\xca\xe2\xc2\xd6\x2a\x2f\x2c\x87\xa5\xb6\x46\x33\x9a\x7f\xdb\x91\xc5\x73\x36\xb7\x97\x74\x3c\x7e\xf1\xde\xfd\x13\x3a\xfe\x54\x9c\x7e\x15\x64\x83\x03\xa2\xeb\x64\xce\xa7\x39\x88\x40\x46\xb2\x7f\xe4\x87\x87\xfd\x50\xf4\x43\x97\x4c\x1c\x23\xf9\xc7\x66\xbf\x1f\x78\x5d\x7a\xc8\xe9\xa1\xde\x67\xb4\xc6\x9f\xd4\x9f\xd4\xa3\x9d\x7a\xb8\x41\x0f\xbb\xf5\xb0\x4d\x0f\x43\xfa\x3a\x3d\xd2\xeb\x3d\xdd\xdb\xbc\xfb\xbc\x8f\x7a\x71\x9b\x17\x02\x2f\xef\x45\xac\x37\x0b\x78\xfd\xd8\x6b\x14\x34\x14\x68\x7a\x85\x50\x4e\xc8\x4d\x8c\xa3\xe5\x8a\x1e\x5f\x68\x70\x50\x88\x4a\x4e\x54\xfa\x2f\x12\x4a\xca\x20\x13\x92\xfe\xdb\x2c\x72\x07\x0b\x6b\xa0\x25\x77\x03\x23\x28\xcb\xd1\xd0\x54\x6f\xb7\x86\x2b\xc5\x82\x40\x48\xd0\xfb\xf4\x5a\xb7\x2f\x60\xd2\xe7\x97\x57\x55\x95\x9b\x5e\x4a\xcf\x7e\x1b\x7d\x38\xff\x87\x47\xf7\x17\xe5\x37\xe4\x99\xd5\xaa\x07\x31\xcd\xda\x0a\x03\xf6\xa5\x37\xed\xba\xeb\xae\xfa\xb1\xdf\xa3\x30\xde\x47\x62\x22\xe3\xf8\x65\xa6\x8f\xc4\x17\xf5\xe0\x80\x18\x73\xf4\x87\x61\x38\xf6\x7e\x11\x7c\xa1\x08\x3e\x55\x04\x8f\x14\x41\x5c\x54\x84\xab\xe3\x3f\x32\xbe\x64\x44\x46\x63\xa3\xb9\x11\x76\x34\xae\x6e\xfc\x76\xe3\xf1\xc6\x53\x8d\xb4\xd8\x08\x51\x69\x23\xe4\x1a\x61\x76\x5c\x0a\xc0\x4b\xb1\x88\x13\x98\x66\xb0\x64\xbf\x16\xa3\x25\x8e\x9d\xa0\xb8\x38\x2f\xcb\xa0\x4a\x68\xb9\xf2\xbc\x84\x95\xb8\x9e\xd1\x72\x29\xf6\x36\x46\x65\xd5\x9e\x5e\xc9\xcc\x52\x72\xf7\x41\x72\xa6\x03\x92\x81\x88\x7e\x12\x80\x4b\xae\x86\x51\x3c\x0d\x9e\xf4\x48\x0d\x30\x62\x99\xe2\x91\x50\xc1\xc8\xab\x46\x5f\xc8\x99\xfe\xe3\x5e\xfa\x17\x7f\xb6\x07\x5d\xdc\x6b\x3f\x59\x7f\xaf\x57\xeb\xbd\xf7\x8c\x35\xdf\x6b\xcc\xf8\xa4\xe7\x57\xb5\x13\x9f\xe4\xc8\xb1\x98\xff\xfd\xcf\xd1\x9d\x77\xee\xa8\x69\x4d\x1c\xa9\xd9\x71\xe7\xce\xe8\x9f\xff\x5d\xf2\x33\xf8\xb5\xaa\x5b\xb7\xdf\x5e\xbb\x6a\xcf\x22\xbf\xe4\x92\x86\x87\xbf\x75\x8f\x7f\xd1\x9e\x55\xb5\xb7\x6f\xbf\xb5\xea\x3a\x5c\x6f\x7f\xa3\x0e\xcb\xff\x81\x4e\x0a\x80\xc0\x3c\x7e\x99\x66\x48\x9d\xeb\x2e\xb1\x9b\xa2\x4c\xba\x6e\xce\x0f\x2f\xfa\xc7\xfd\xc8\xbf\x34\x8f\xcb\x1b\xc8\x1b\xca\xc3\x8c\xf3\x73\x3b\x3c\x6a\x1f\xb6\xa3\x2d\x76\x68\xb7\x1b\xbb\x4d\xc0\x52\x6a\x11\x2d\x09\xcb\x39\x0b\x6d\xb1\x0c\x9b\x60\xbf\x69\x9b\x09\xf5\x9a\x60\x93\xa9\xcd\x84\x80\x09\x9a\x84\x94\xd3\xc9\x3a\x2c\x29\x2b\x36\x19\xd9\x14\x30\x29\xd9\x90\x94\x4b\x2a\xca\x90\x04\x18\x4f\xac\xb2\xbc\x37\xc9\x7f\x91\x1c\x1c\x35\x46\xc3\x72\x53\xbe\xd2\x5d\xd5\x00\x2b\x82\x01\x45\xe5\xd7\xe2\x17\xfc\xa4\x35\xdf\x6c\x40\xf8\x7b\xe1\x16\x47\x56\x73\x9e\x4f\x8c\xf8\x6f\xdc\x91\x7e\xe9\xa5\xf4\x33\xf8\xc7\xe9\x5e\xd8\x9d\x7c\x68\x4d\x65\x65\xea\xdb\x66\xbd\xf6\xa8\x5a\x67\x8a\x74\xcd\xbd\xeb\x96\x2d\x63\x01\xda\x78\xfc\x78\x7a\xa0\xac\xf7\xde\xe5\xfb\x6f\x3c\xb2\xa6\x6c\xea\xbc\xc2\xdb\x95\xde\xbc\x88\xd2\xdf\x66\xa4\x83\xb0\x91\xd1\x51\xd3\xf9\xa3\x08\x67\x25\xfd\x36\x08\x82\x94\x68\x12\x44\x93\x3d\xce\x0a\xac\xe0\xfa\x65\x00\x6e\x0e\xec\x0a\xa0\x80\x64\x89\x39\xac\x26\x1e\x08\xe4\x9f\xcd\x87\xb4\xaa\xc7\xb5\x36\x4f\x95\xe2\xe8\x93\x34\x52\xd1\xb4\x3e\x07\xa4\x7c\x94\x3e\xc5\x5b\x65\x35\x0b\x42\x4f\xa6\xa0\x17\xe4\x6e\x5d\x72\xef\x12\x0e\x87\xe4\x92\x18\x4b\x42\x7e\x39\x90\xc1\xd3\x5b\xb3\xd8\x12\x88\x1d\xa9\xa3\xb7\x2d\xd4\xa3\x2d\x63\x7b\x69\xf1\xd6\x1f\x0d\x2e\x3f\xba\x28\x6f\xd1\xd2\x95\x75\xc7\xaf\x3c\xb1\xa0\xeb\xa9\xaf\x8e\x6d\x7c\xad\x6d\x51\xd3\x23\x74\xde\xac\xdb\x4f\x0e\x1c\xfb\xd6\x5b\xf7\xc4\x03\xb6\x63\x9c\xcd\xc0\x6e\x7c\x03\x5a\x9f\x3a\x01\xcd\x6f\xdc\x54\x54\xf8\xb8\xaf\x64\xb2\x87\x9c\x7e\xdb\xc8\x80\xaa\xeb\xe2\x17\xfe\xff\xa8\x91\x8d\xc7\xd3\x3b\xe0\x2d\xe4\x3d\x8a\x65\xde\xb9\xf1\x4f\x98\x8b\xf4\x08\x28\x04\x95\xe0\xfe\x9f\xe4\x86\xba\x19\xbd\xea\xf4\xf8\x97\xe2\x12\xb3\x2d\xae\xea\x0e\x3c\xe6\x81\x1e\xde\x13\x00\xcc\x41\x06\x31\x97\x02\xf0\x54\xe0\xb5\xc0\x7b\x01\x0c\x02\x89\xc0\xc1\xc0\xd1\x00\xc5\x32\x01\x26\x60\x09\xf7\x80\xfe\xea\xf3\xd5\xb0\x5a\x64\xd4\x71\x8b\xa5\xaa\x32\xc5\xe5\x9e\xcc\x45\xaa\xdc\xdc\x90\x2a\x15\xc0\x8e\x3e\xa3\x29\xd4\xc7\x64\x28\x2e\xe4\xe9\x95\xd5\xb7\x49\xbc\xa1\x94\x1d\xa5\x63\xa7\x26\xc9\x8f\x86\xca\x27\x89\xc4\xfd\x82\xdf\x80\x59\x99\x28\x5f\x31\xbb\xea\x46\xe8\x84\xd5\x7e\x41\x51\x9e\xa8\x92\x4b\x2e\xcc\xc5\xfa\x3b\x7f\xbe\x37\x7d\x36\xfd\x73\xce\xeb\xcf\xe6\xcd\x95\x6d\x37\x2d\x0a\xb4\xba\x6d\xb5\xbe\xd2\xc6\x42\xa7\x4e\xe7\xcb\x0b\x59\xd1\xc3\x9b\x0e\x9f\xbf\xb3\x7a\x6c\xdb\xb6\x67\x8f\x97\xf4\xdc\x9b\x5c\x06\x9f\x59\xf9\xbd\xcd\x0d\xb4\x71\xf0\xf3\xcb\xef\x2d\xee\x3f\x36\x50\x67\xd0\x1e\xd1\xf3\x4d\xab\xb6\x56\x45\x7f\x01\x19\x58\xfb\xf4\xd8\xe1\xd9\x83\x87\xd3\x4f\x7c\xfb\xee\x96\x95\xf5\xae\x8c\x86\x06\xab\x23\xfa\xdb\x7e\xb0\x44\x2c\x17\x6c\xdd\x06\x86\xd1\xb8\x7a\x40\x7f\x80\x0b\x40\x2e\xe0\x0d\x0c\x05\xc6\x03\x94\x5e\xdd\xad\x59\x9d\xed\x57\xa5\x04\x4e\x3a\x1c\x54\x7a\x3d\xa7\xc5\xb6\x3e\x0d\x63\x94\x69\x87\xa3\xb2\x46\xb5\x6c\x63\x83\x53\x03\x4b\x65\xd4\x84\x3c\xcb\x4f\x8a\xca\x53\x87\xc9\xea\xe4\x61\x8e\x9d\x3e\x73\x06\xc5\xcf\x5c\x77\x3c\xe8\xe9\xb1\x4e\x7a\x64\xec\x30\x5a\x37\xf3\xf1\xe5\xbe\x7c\xe2\x4f\x2c\xe0\x16\x71\xa1\xaa\x9b\x5d\x6a\xe3\x6c\x03\xb6\x21\x1b\x66\x3e\x37\xc3\xa3\xe6\x61\x33\xda\x62\x86\x66\x33\x30\x74\x73\x80\xb4\xea\x27\x84\x73\x02\x2d\x08\xc3\x1c\xec\xe7\xb6\x71\xa8\x97\x83\x4d\x5c\x1b\x87\x00\x07\x39\x8b\x90\x32\xea\x53\x00\xb0\x46\xcc\xb1\x46\x59\x31\x3c\x2c\x4b\x65\x4d\x71\x21\xc4\x87\xf4\x2a\x77\x19\x7e\xd2\x28\x13\x10\xa6\x7a\x0e\x14\x90\x5d\xc3\x99\x29\xce\x02\xef\x96\x1c\xc2\xd8\x67\xf0\x8b\x8c\x8b\xc8\xe0\x75\x88\x5f\xf8\x7b\xc5\x2f\xec\x9f\xc2\x2b\x97\xad\x15\xa8\xe9\x7d\xaf\x6f\x01\x40\xf3\xe4\xe7\x2f\x28\x1a\x2f\xb3\xa7\x6a\xb0\xfc\x8f\x53\x1e\x3b\xd0\x4d\xf1\xcf\x8e\xf1\xcb\xd4\xb3\xec\x8d\xc6\x20\xfc\x90\xf0\x25\x78\x41\x40\x79\xff\x3c\x3a\x08\xf5\x45\xd9\xa6\xe9\x7e\xe7\xcd\xf4\x10\xc1\xb2\x68\xc1\x0d\xe2\xac\x37\xd0\x3f\x20\x84\xba\x5f\xc7\xef\x63\xf4\x43\x0c\x0f\x61\x88\x79\x83\x10\x8f\x61\x58\x8b\x21\xc6\xb4\xba\x1b\xac\xd1\x0f\xeb\xe1\x80\x5e\x0a\x17\x30\xaf\x87\xaa\x6e\x7a\xb5\x4e\xc3\x60\x55\x8a\x46\x08\xd2\x20\x1c\x89\x84\xf9\x4c\xc2\x9c\xc9\x36\x92\xc9\x10\x39\x0a\x89\xc0\x58\x80\x58\x84\x5f\x88\x50\xaf\xa4\xbb\x7f\x9c\x4e\x9e\x41\x77\xbd\x94\x1e\x82\xbb\xe9\x91\xaf\xae\xd0\xfc\xd7\xf1\x70\x33\x34\x5f\xe6\x8b\x25\x29\x15\x54\xa9\x04\x4b\x0f\xe8\xcf\xe2\xb2\x52\x59\x43\x59\xe7\xb3\x28\x46\x2b\x74\x33\xab\xdd\xae\x14\xa7\x3d\xa9\x45\x2a\xad\x56\xd0\xa4\x58\x2c\x64\x36\xec\x14\x6f\xd8\x2b\xd7\x44\xc9\xbd\xb9\x62\xa7\x96\x99\x1b\x91\x8a\x10\x0b\x3d\x84\xcd\x63\x27\x0e\x11\xf3\x5c\x74\x54\x36\xcf\xdd\xca\x76\x1b\x39\x9e\xae\x9f\x6e\x97\x33\x71\x7b\x53\xb1\x6b\xd2\x19\x00\x10\x30\xa4\x87\x68\x0d\x3d\x02\x04\xe0\x02\xf7\x8a\x5a\xbb\x2b\xdf\x85\x5c\x6c\xb5\x19\x9a\x25\x6f\xa5\x35\xdb\xe2\xe6\x6e\x03\xc7\x42\x96\x95\x22\x34\xbe\xd4\x70\x4e\x0a\x94\x58\x03\x6d\xec\xe6\x61\x37\xc1\xfb\xe5\xf2\x96\x38\x00\xfc\x9a\x2c\x1f\x61\xad\x57\x51\xdd\x34\xed\x36\xa7\x0c\x58\xbd\x58\xe5\xe2\x99\x14\x06\x34\x8d\x49\x73\x1e\xa1\xd0\x0c\xff\x73\x13\x71\x52\x24\xf3\xfb\x97\xf2\x70\x68\x94\x57\xc4\x84\x6b\x7a\x25\x2f\x95\x94\x05\x64\x65\x4c\x52\xa4\x91\x96\x5c\x92\xe4\xae\x68\x96\xd6\x0c\x5f\x5b\x3d\x3c\x18\xee\x5c\x38\xab\x34\x8b\x42\x6b\x7e\x9e\xde\x93\xfe\x8a\xf2\x96\x34\xb4\x2c\xcc\x93\x96\x2b\x3d\x84\xf2\x96\xfe\xe2\xb7\x7f\xf8\xb7\xdf\xdf\xf8\xd5\x15\x6a\xfd\x82\x17\x7f\xf9\x9b\x5f\xbc\x30\x1f\x80\xaf\x61\xf6\x00\x04\x14\x00\xcc\x6e\x32\xee\xb7\xc5\x45\x6b\xd5\xb7\xaa\xf7\xaa\x71\xb5\x3a\xa6\xee\x92\x12\x7d\x26\xa6\xff\x8b\x1e\xe9\xbb\x6f\x04\xdb\xc1\x7e\x80\x6b\x40\x1c\x2c\x03\x18\x60\xfc\x43\xc3\x69\x03\x7a\xcc\x00\xf7\x1a\x60\x97\xa1\xdf\xb0\xcd\x80\x0d\x06\x41\xc3\xaa\x54\x5a\xa0\x81\x9b\x35\xbb\x34\xe7\x34\x58\x06\x42\xb1\x9a\xb8\x86\xd7\x68\x4c\x57\x4c\xf0\xac\xe9\xbc\xe9\xa2\x09\x1f\x25\xb4\x70\xa2\x09\x72\x26\xaf\x09\xa9\x10\x84\xbc\x40\x4a\x14\x82\x60\x64\x30\xa6\x04\x8d\xc1\xc8\x42\x0a\x03\x52\x24\x8e\x18\xa3\x42\x44\xb9\x04\x10\x14\x34\xc9\x44\x07\x63\x44\x26\x78\x4b\xca\x2c\x6a\x92\x19\x97\x4b\x9f\xca\x4a\xd5\x30\x02\xc9\x3f\x53\xc3\x80\x64\xd6\x30\x80\x72\xc7\xfe\xe3\x1d\xa4\x79\x1e\x69\xde\x19\xfb\x0f\xe4\x7f\x77\xec\x4f\xcf\x8f\xfd\xe9\x5d\xf4\x19\x7a\x6d\xac\x3e\xf3\x31\x66\x40\x1f\x8f\xb9\xa4\x0f\x79\xff\xc5\xc7\x2f\xe3\xcb\xf4\xdb\x20\x0a\xd6\x89\x4d\x79\x3d\x80\xf6\x83\x52\x3f\x00\xfe\x52\x6c\x72\xf7\x68\xfb\xeb\x9e\xac\x83\x9b\x4d\xbb\x4c\x48\x8a\x7a\x52\x26\x6c\x32\xd5\xd2\xbe\xbe\xa7\xfd\xf0\x36\x12\xca\xab\xfc\x7e\x47\xb8\xa8\xaf\x92\x72\xf4\x99\xf9\x69\x47\x7f\x32\x39\x1a\x95\x86\xa4\x40\x17\x15\x7d\x8b\xa8\x22\x1b\x84\x58\xcb\x0c\xcd\xa0\x09\xc1\xde\x0c\x80\x51\xca\x7f\x48\xdf\x01\xfe\x4d\xa4\x67\xe7\xfc\xae\x7b\x7a\xcb\xe7\xdc\xfd\xce\xfe\x9b\xce\x2d\x0d\xf5\xdd\x70\x43\xc9\x73\xc3\xe7\xcf\x9c\x1d\x5e\xf1\xc0\xca\xf2\xdc\xe6\x54\xed\x4d\x4f\xcd\x5f\x11\x5c\xb5\x65\x4f\x6c\xd3\x89\xc1\x28\xd5\x37\xef\xb6\x65\x51\x1d\xa3\x8d\x2e\xdf\x16\xef\x3b\xba\x45\xcc\x2e\x7e\xda\x96\x63\xd7\x3f\xb2\x6f\xdf\xee\x47\xf3\xe2\x6b\x1a\xaa\x96\xd4\x7a\xe6\x54\xed\xf4\x56\x15\xd8\xab\x56\xca\xbd\x37\xb2\x9f\xa3\x47\x80\x1d\x00\x53\x44\x30\x33\x1c\x64\x58\x86\x8d\xc8\x9a\xac\x55\xd5\x55\xd5\x01\x18\x78\xeb\x59\x08\x11\x44\x14\xc5\xa2\x5f\xbd\xff\x0c\x43\x51\xb4\x6a\xac\xec\x03\x7a\xe4\xda\x25\x67\x63\xf6\xec\x6c\x5f\xeb\x02\xea\xd4\x57\xad\xd8\x11\x7d\x60\xd6\x82\x85\x57\x5b\xa6\xf8\xcf\x1b\x33\xfe\x73\x9f\x97\xf8\x5b\xcb\x29\x42\xc3\x71\x7a\xfc\x8f\xa7\xb2\xa7\xf8\x4f\x05\xdb\x77\x8c\x1e\x01\x1a\xd0\x2b\xfa\x55\x6a\x35\xaf\x86\x4a\x6b\x38\x0f\x80\x6e\x58\x07\xc3\x3a\xc8\xeb\xe0\xa3\x1a\xd8\xa9\x81\x1a\x69\xdf\x9a\x55\xba\xb8\x86\x65\x71\x37\xb5\x5a\xcb\x22\x4a\x45\x63\x4a\x81\x4d\x2a\xad\xe2\xe5\x42\x24\x34\x61\x52\xbd\xc9\x48\xa4\x86\x90\x4b\x12\xa3\x91\xec\x07\x52\xc7\x3e\x1c\x3b\x73\xe6\x0c\xaa\x3c\x3f\xf6\xb6\x64\x19\xf4\x08\xb1\x95\xd9\x24\xa7\x1b\xff\x84\x7a\x98\x1e\x01\x5e\xb0\xea\xc7\x2a\x2c\xfd\xbe\x3a\xb3\x2d\x8e\xbb\xf7\x3b\xa0\x83\x77\x5c\xf2\xc0\x53\x9e\xd7\x3c\xef\x79\x30\xf0\x24\x3c\xbb\x3c\x98\xf5\x78\x24\x57\xb1\xc6\xcf\xf9\xbd\xfe\x21\x3f\x56\xf1\xbc\x0f\xa7\x3c\xd8\xdc\x27\xe8\x4d\xc0\x28\x77\x4b\x13\x97\xd0\xab\x38\x67\xd2\x1c\x50\x93\x1c\x0d\x95\xcb\xe0\xc4\x6f\x08\x55\xa8\x87\xcf\xa4\xef\xfa\x2b\x61\xc9\x85\xbf\x12\x81\x7c\x03\xfe\x73\x12\xb7\x3b\x13\x63\xa9\x7c\xff\x15\xe2\x3b\xf7\x7d\x1d\x1b\x99\xe1\x78\x27\x71\x65\x10\x7c\x0d\x9b\xa8\xd4\x57\x9e\xa5\x47\x80\x1f\x0c\x88\xbc\x11\xba\x5c\x26\x7f\x1f\xd8\x0c\x86\xc1\x15\xb9\x53\x40\xe4\x19\x4d\x5c\x5a\xd3\x00\x17\x18\x0a\x20\xb3\xda\x24\xf9\x07\x9d\xc9\x94\xfd\xaf\xce\xbf\x38\xd1\x3f\x38\xa1\xf3\xf4\xf8\x25\x91\xd7\x18\xe2\x46\xe8\xc4\x40\x9f\xd2\x30\x26\x13\xc0\x64\x61\x47\x05\x5b\x34\x94\x4c\x2a\x2e\x23\xc3\x1a\x4a\xb4\xf1\x25\xbf\x30\x7d\xfe\x60\x04\x2a\xf0\x12\x48\x3d\x9b\xee\x08\x2e\xd9\xfc\xf8\x40\xa4\x3b\x37\x77\x79\x45\x65\xfb\xec\x1a\xf7\xd8\x9f\x7e\x05\x87\x68\x8d\x5a\x4d\x21\xac\xd5\x6a\x31\xac\xa6\x47\xae\x7e\x95\x3c\xbe\x23\xce\x71\x2f\x9a\x1d\xb6\xca\xce\x26\xaa\xe9\xda\x07\x1a\xbb\xd3\xa6\x56\x7b\xfd\x59\x2c\xb6\x2b\x71\x35\x7d\x46\x1a\x3f\xbc\xef\xba\xd8\xc2\x37\xd3\x43\xf4\x20\x39\xd7\xeb\x44\x3f\xee\x46\x48\xdd\x0d\xa4\xa3\xfb\xa4\x1e\x4e\x39\xb6\x01\x39\xb7\x69\x72\x60\xf0\x99\x5b\x42\xc9\x65\xbc\x27\x33\x00\xe4\x46\xa6\x9e\xd7\xc3\xc3\xd7\x18\xe9\xb8\x3e\x31\xf6\xdb\xc9\xf3\x1a\x40\x70\x02\x00\x6a\x37\x89\xc7\xe2\x62\x96\x49\x32\x3f\xdb\x66\xdb\x51\x1b\x0a\xdb\x20\x6f\x83\xfa\xee\x3e\xcd\x66\xcd\x51\xcd\xb0\x86\x22\xee\xda\x20\xb9\x6b\x13\x9f\xa2\x69\xb3\x16\xcb\x26\x19\x0d\x8f\x46\x60\x38\x94\x54\x42\x06\xd9\x12\x95\xfb\x18\xe5\xa2\xae\xaa\x5a\x88\x50\xbb\xcf\xdc\xf2\xea\x2a\x25\xcc\xea\x7e\x71\xf3\x19\xd4\x59\x54\x52\x96\xba\x67\x39\x8a\x8d\xfd\xe6\x96\x2d\xf9\xf9\xe8\x8d\x0c\x3e\x97\x8d\x90\xb1\xf7\x89\xb3\x3b\x55\x50\xd5\x6d\xa3\xe1\x5e\xfa\x10\x7d\x82\xc6\xfd\xf4\x36\x1a\xd1\x34\x24\xa1\x0c\x51\xd5\xf6\xe9\x13\xfa\xcd\xfa\x5d\xfa\x73\xfa\x0b\xfa\x4b\x7a\x96\xd3\x43\x96\xea\x86\xd2\xf4\x20\xac\xa2\x52\xd0\x48\xd8\x9a\x22\x99\x0b\xd4\x09\x24\xe5\xa0\x12\xd0\x44\x32\x13\xc4\x46\xfe\xeb\x91\x33\xc8\x2b\xfd\x5f\x9e\x1c\x79\x82\xc8\x5a\xb0\xbf\x27\x3c\x52\x83\xe2\xfc\x4e\x1d\xd4\x75\xdb\xd4\x70\xaf\xfa\x90\xfa\x84\x1a\xf7\xab\xb7\xa9\x91\x5a\x4d\xeb\xbb\x81\xb4\x4a\x60\x8d\x00\x04\x5e\x40\x3e\x21\x21\x6c\x16\x76\x09\xe7\x84\x0b\xc2\x25\x81\xe5\x04\xc8\x4a\x6b\xc6\x1b\x34\x0c\xd6\xcd\x58\xb5\x69\x0f\xf7\x2f\xe5\x61\x72\xc6\x67\x1e\x70\xea\x0a\xca\x0f\x39\x3c\x3c\xf1\x98\x53\x16\x52\x7e\x56\x44\xf6\xd1\xfb\x4a\xac\xd5\x2e\x46\xb4\x42\xf7\x41\x06\x32\x8c\x4a\x09\xb7\x08\x1c\xab\x29\x2b\x95\x75\x32\x8b\x66\x54\xaa\xa9\x01\x97\x2a\xa5\x9e\x19\x70\xc9\x7e\x26\x33\x63\x53\x53\x83\xca\xaf\x85\x5c\xef\x93\x90\xeb\x3b\xe9\x67\x10\xf7\x9d\xc3\xe7\x87\x48\xc8\xf5\x3f\x8a\x57\xdc\x33\x11\x72\x19\x8f\x4f\x4f\x05\x30\xc1\x90\x9f\xa7\x47\x80\x01\x38\x40\x16\x98\x27\x86\x4c\x3d\xc4\x65\x32\xce\xee\xac\x35\x5e\xce\xfb\xa4\x17\x31\x6a\xae\x9b\x59\xed\x71\xa4\x38\xf5\x49\x35\x52\xa9\xd5\x2e\x16\x73\x7d\xce\xa9\x29\xcc\x94\xb0\x50\x90\x0b\xa7\xca\x43\xce\xcc\x5b\xa4\xa5\xce\x44\x86\x67\x66\x84\x85\xf8\xe1\x97\x32\x91\xe1\xb4\xa7\x94\xb2\x98\xaf\x5a\xa7\xc4\xb0\xd2\xb3\xc6\xc5\x12\x53\xcf\x41\x00\x41\xbf\x8b\x73\xa5\x5c\x88\x71\x89\x16\x7b\xdc\x25\xea\x4d\x71\xf2\xb8\xce\xc9\xc7\x95\x9e\x56\x9e\xd2\xc9\x47\x0d\x85\xc8\x65\xc6\x37\x3f\xe8\x37\x3d\xe4\x75\x9f\x10\x40\x50\x37\x7e\x99\x6a\xa6\xdf\x26\x1c\x22\xe1\x2c\x5f\x8f\xce\xea\xb1\x7a\x28\x5d\x7f\xf0\x6c\xf0\x7c\xf0\x62\x10\x53\x54\xae\x27\xf5\xb4\x17\xde\xe6\x85\x9c\x17\xaa\xbc\x5e\xd6\x99\xb2\x09\x26\x0c\x52\x2c\x05\x9a\x46\x23\x4d\x91\xcc\x41\x42\x56\x9c\x30\x93\x12\xc9\x45\x42\x4d\x9a\xb9\x48\x85\xc6\x89\x4b\x56\xd9\x37\x1a\x4d\x04\x93\x0b\xcf\xf4\x3e\xd2\xb4\xa8\xed\xb5\x8d\xc7\x3e\x3f\xd6\xde\xfe\xfd\xbf\x1c\xaf\x5d\xd9\xb9\x28\x6f\xd1\xd1\xe5\xff\xf1\x17\x66\xec\x5e\x34\xa8\x8e\xdd\xf2\x04\x9d\x57\xe2\x7b\xbc\xb0\x68\xd3\x2b\xe9\x2f\x9e\x78\x3e\x7d\xe9\x97\x9b\x58\x83\x8d\x3b\x66\x0b\x40\x1b\x64\x8e\x0d\x0c\xdf\x2e\xca\x79\xc2\xf8\x65\xf6\x7b\xf4\x3b\xc0\x09\x4a\x40\xaf\x58\xef\xea\xd1\x1c\x14\xa0\x20\xe8\x73\x7b\x40\x7f\x29\x57\x0a\x9b\x4a\x07\x4a\x87\x4a\x3f\x2d\x1d\x2f\xa5\x4b\x45\xc1\x1c\xe7\x75\xdd\xfa\xd5\xe1\xc2\x94\x95\xd2\xa6\x38\x1e\xaa\x78\x5e\x6f\xc0\x7a\xa3\x2f\x45\xcb\x77\x49\xb2\x11\x2b\xc5\xec\x50\x72\xb2\x98\x36\x15\x2c\x94\xa7\xa4\xb9\x24\x58\xfa\x7a\x17\x08\xfb\xbd\xb6\xef\x7e\x7c\xe8\xd1\xd1\xc3\x09\x26\xfd\xec\x99\x33\xb0\x53\xbb\xf4\xf0\x87\x0f\x7e\xe7\xe3\x23\x6d\x57\xbf\x2a\xeb\x7f\x62\xe3\xa6\x27\xd6\x96\x96\xae\x79\x62\xe3\xa6\xef\xf5\x97\xa1\x8f\x48\x17\xc8\xea\x17\x20\x3e\x2a\xa7\xbf\x0f\x5d\xfe\x41\xf7\xf5\x5b\x41\xa4\xf1\x3a\x00\xc0\x9f\x11\xbf\xe2\x06\xdf\x15\xd5\x0c\x80\x7f\x00\x5f\x00\x04\xa4\x28\x21\x47\xcb\xc5\xdd\x86\x6e\x0c\x80\x4a\xbf\xc6\xd3\xe4\x39\xe0\x79\xd2\x73\xd6\x73\xd1\x43\xfb\x3c\x90\x81\xf0\x0f\xf0\x0b\x88\xa0\xf4\x83\x7a\x2d\x17\x87\xf3\x11\x44\xa2\x4a\x1b\x47\xd2\x21\x18\x44\xc8\xda\x73\x51\xf5\xa9\x6a\x5c\x85\x55\x22\x67\x8a\xb3\x2a\x9b\x0a\xa9\x54\x6b\xb3\xdc\x7d\x98\xe3\xa0\xd0\xa7\xc5\x06\xa2\x2f\xad\xd0\x18\x41\xfe\x8b\xde\x64\x28\x39\x2a\x1f\x83\xa1\xe4\x20\x91\x90\x8a\x0a\x11\x32\x6b\xd2\x89\x18\x20\xe0\xc5\xaa\x88\x5f\x08\x38\x60\x60\x12\x72\x3f\x3b\xfd\xdc\x87\x70\x67\xf5\x0d\xf3\x8b\xc6\xae\xc2\xad\x2f\xbd\xdc\x7a\x4b\x5b\x41\xde\xa2\x6d\x8b\x4f\xa1\x15\x63\xc7\xd1\x01\x73\xe3\xca\xbb\x93\x6f\xbc\xf5\x55\x2b\x5a\x81\x5e\xca\x6a\x5c\xd9\x3c\xfb\xc6\xd6\xfc\x29\xfa\x3c\x04\x4f\xd1\x4c\xe6\x62\xeb\xf8\x65\xca\x4f\x34\xe3\xea\xc0\x3c\xb1\xa8\x38\xae\xf6\x74\x35\x5c\x68\x80\x43\x0d\x50\x6c\x80\x5c\x03\x64\x4c\xd5\x71\xd0\x59\x5f\x9e\x30\x39\x1c\xaa\xfc\x44\xc0\xaa\x56\x69\xf9\xb8\x7a\xb1\x0a\x82\xa6\xd1\x90\x0c\x54\x9a\x02\x0a\xe3\xbf\x28\x27\x6d\xf3\xc6\x46\x58\xdd\x08\xab\x6d\x24\x2c\x92\x69\xfc\x27\x5b\x09\xe1\xd4\x85\x36\x7b\xd0\xd6\xb2\x75\xc7\x06\x77\x7e\xb6\xd6\x5f\xbe\x63\xe7\xd6\xa2\xc6\xd5\xf1\x02\x4a\x6f\x6c\xec\xd8\x20\xde\x70\x68\x4d\xf9\xdc\x3b\x9e\x5d\xb7\xe1\x7f\xee\x98\x0d\x47\xeb\x57\xb5\x04\x9d\xb5\xdd\xb3\x1a\xd6\x2f\x89\xea\x1d\xb3\x6e\x46\x0f\xff\x04\x3a\xde\xbe\xd3\xe1\x2a\x33\x1f\x55\x59\xed\x76\x8d\x61\xf6\xe0\xf7\x07\xb3\xea\xcb\x7c\xf3\xf6\x9c\xda\xb8\xff\xd7\xf7\xcc\x5d\xfe\x3f\xc7\xd2\x8f\xe4\x2d\x3b\x70\x63\xc7\xde\x54\xa4\xb4\x79\x9e\x73\xf5\xcb\x0f\x2f\x27\x3d\x17\xcf\x02\x40\x39\xa8\x56\x60\x01\x3e\x10\x02\x2b\xc4\x5a\xec\xf2\xb7\x00\xc0\x59\x63\xea\xae\x62\x5f\x31\x14\x8b\x0f\x16\x0f\x17\x5f\x28\xbe\x52\x4c\x73\xc5\x90\x09\xba\x62\x5c\x47\x11\x76\x26\xce\x06\xe1\xf6\xe0\xfe\x20\x0a\x06\x5d\xb9\x09\x9e\x73\x25\x38\xcb\x4c\xa8\xe5\x24\x80\x28\x4c\xa4\x0d\x20\x01\x0e\xcb\x69\x83\x7c\x55\x8a\xc9\x15\x88\xbf\xbc\x51\xf9\x9b\x64\xf8\xf8\x8b\x1d\x1b\x6a\x56\xc6\x0a\xc2\x6b\x9e\x1c\x4c\x47\xe1\xeb\x4b\x1e\xe8\xaf\x3b\xf8\xad\x5d\xe3\x00\x52\x35\xc9\x39\x41\xcf\xa6\x8d\xe9\xff\x7d\xb9\x71\x45\x93\x17\x57\xae\xdb\x6a\x64\xd9\x9c\x86\x9e\xa6\x39\x5b\x3a\x4b\xa9\x56\xb7\xb8\x61\xec\xcd\x15\xf1\xf4\x0f\x8d\x85\x73\x91\x6e\xa1\x98\xfe\x80\xcb\xa9\xcf\x70\xbb\x6b\xa8\x56\x40\x83\xb0\xe8\x26\xd1\x38\x00\xec\x51\x16\xee\x66\x61\x82\x85\x28\x86\x3b\x18\x98\xa0\x38\x34\x49\xeb\x95\xcc\x20\xe3\xc8\x05\x0d\xd6\xa4\xbb\x47\xd0\x0a\x3c\x7c\x2d\x41\x49\xbe\xb8\x20\xbd\x87\xaa\xa6\x5a\x01\x07\x6c\x60\xbb\xc8\xdb\x58\x63\x8b\x2e\xcc\x36\xb1\x48\xcb\xba\x58\x44\x92\xef\xe8\x31\xdd\x73\x3a\x44\xe9\xcc\x3a\xc4\xea\x58\x1d\xcd\xc7\x0c\xb0\x05\x00\x9f\x01\x1a\x96\x3a\x4e\x3a\xce\x3b\x50\xa9\x03\x86\x1d\x90\x6a\xa1\x69\xbb\xb1\x4d\xc7\xd9\x0c\x4c\x02\x5b\x68\x70\x95\x74\xfc\x94\x97\x2b\x79\xb7\x64\x49\xff\x92\x54\xce\x64\xd2\x78\x54\x93\x4c\xf2\xa3\xa4\xc1\x3a\x93\x75\x23\xa3\x9c\x76\x07\x0c\x98\xa5\xaa\x9f\x1d\x5b\xf4\x6c\xe7\xac\x1b\xe6\x64\x43\x64\x7b\x34\xfd\xdc\x39\x36\xa7\x76\x71\x45\x7a\x0f\xdc\x99\xde\x83\x6c\xa9\x8b\x7f\x86\x60\xe8\x5a\x02\xe7\xf4\x7f\xf0\x9b\x9f\x2f\xc9\x68\xaf\x90\x7d\x10\xcf\xe4\xda\xf4\xcf\x08\x0f\xfe\xe3\xa2\x97\xc1\x58\xd3\xc2\x01\xf0\x0f\x5a\xf8\xa2\xf6\x2d\x2d\x3a\xa1\x85\x8f\x6a\xa1\x56\x6b\x60\x29\x9a\x56\xb1\xa7\xc7\xcf\x3d\x6f\xb4\xc4\x59\xf9\x6e\x59\x1b\xe7\x58\xc8\xb0\x3c\xcb\x9a\x80\x89\x37\xa1\x8b\x26\x58\x6a\xda\x6c\x3a\x68\xc2\x9c\x09\xb2\x82\xe4\x1c\x49\x0a\x6d\x30\x18\x31\x00\x50\xaf\xd2\x58\x04\x0a\x72\xdf\x94\x42\x0f\xca\xd9\x4e\x28\x34\x23\x83\x96\x95\xe6\x67\x64\xce\x6a\x18\x41\x07\x8e\xc3\xa3\xaf\xa7\x97\xc1\x5f\xff\x3a\x3d\xe7\x78\xba\xf9\x3c\x3c\x9f\x5e\xf6\x3a\xaa\x44\x96\xb1\x3f\x4a\x1f\x63\x6f\xa3\xe2\xb1\x77\xc9\x47\x25\xb2\x90\xb1\x36\x8f\x5f\xc6\xed\x04\x5f\x9c\x12\x6b\xe9\x16\xab\xcb\x1a\xb5\x46\xad\xba\x8a\x98\xbf\x8b\x60\x8c\x2f\xd4\xe1\x81\x3a\xe8\xab\x83\x05\xba\xce\x5a\x57\x4d\xe2\x7c\x14\xee\x8f\x3e\x16\x45\x5c\x14\xaa\xa2\x51\x21\x9c\x08\x5a\x55\x09\x81\x9f\xec\x15\x93\x2d\xff\x0f\xe5\x53\xfa\xfd\x32\xb8\xf9\x29\x55\xc1\x09\x17\xf0\xb5\x24\x5a\x51\x10\xae\x84\x83\x0d\xab\xe3\x79\xb7\x6c\x8c\xed\x9e\xdf\x94\xbf\xb0\xbd\xbb\xb2\xf3\xe0\x8d\xb5\xee\x48\x4b\xa8\xa8\xbd\x29\x58\xb9\xf1\xc4\xe0\xa6\x93\xb5\xde\x05\x5d\x2b\x23\xd5\x7d\x2d\x05\x77\xdd\xb3\x1b\xed\x33\xe6\x89\xc5\x0b\x17\x06\xb3\x1f\x36\xbb\x4d\xea\x60\xeb\xa6\x96\xf2\x85\x75\x05\x06\xad\xa1\x68\x76\x77\xe3\x9c\xad\x9d\x65\x8a\xbc\xae\xb1\x70\x6e\xa4\xb7\xe7\x31\x79\x4f\x50\x75\x54\x2b\xd0\x82\xc5\xa2\x0b\xf3\x6a\x7b\x1c\x33\x2d\xf4\x52\x12\xd2\xfa\xf4\x47\x49\x34\x7b\x45\xcf\xea\xa5\x35\x36\x08\x71\xc2\xf2\x24\xa8\xed\x71\x35\x68\xd1\x74\xe8\x54\x58\xcb\x31\x48\x63\x51\x16\x4f\x09\x2b\x48\xec\x1d\x92\x16\x87\x25\x79\xb7\x09\x06\x04\xd8\xad\x43\xd4\x27\xcf\x68\xc7\xd2\xff\x4e\xb5\x8e\xad\xbe\x86\x0f\x5f\x1d\x41\xfb\x20\x77\x6d\x3d\xd5\x9a\xe1\x50\xaf\x63\x6c\xc6\x20\xbc\x42\x78\x67\xbc\xb9\xa4\xeb\x43\x10\x64\x06\x4d\xab\x4e\x43\xcd\xd4\xc9\xc0\x1f\x53\xad\x40\x03\x66\x89\x01\x00\x21\x25\x03\xde\x78\x8c\x75\x9c\x0e\x6a\x10\x13\x63\x3b\xb4\x34\xd2\x68\x58\xa0\xe2\x28\xd6\xa2\xa8\xc2\x08\x19\xe6\x73\x92\x6c\x25\x25\x9b\x2a\x2b\x9d\x30\xa0\x88\x80\xbe\x7a\x2d\xbd\x12\xbe\xf1\xeb\xf4\xfc\x53\xa7\xa8\xd6\xb1\xff\x1c\x7b\x5d\xb2\x14\xaa\x75\xec\x8f\x00\x02\x7e\xfc\x33\x3c\x4c\xf0\x93\x0b\xc4\x32\xdc\x42\x99\xe0\xe7\x26\xb8\xcb\x74\x90\xa8\x3c\x52\x1d\x26\x68\x32\x69\x61\x0c\x2c\xb5\x72\xd6\xb0\x75\xdc\x8a\x19\xad\xd6\x82\x13\x26\xce\xd0\xa6\xb2\x42\xe2\x54\xa6\xa7\xcc\x92\x75\x2b\xad\x7c\x1a\x28\x03\x3c\x2b\xad\x91\xf2\x46\x68\xac\xf6\xe3\xe1\x91\x74\xda\x2c\xa6\xbe\xd5\xe9\x2e\xe3\x6d\xae\xea\xe5\x73\x23\x46\xd4\x81\x87\xd3\x63\xe9\x47\xfe\x70\x23\xc3\xec\x61\xb6\xfe\x27\x1c\xf8\x2a\x33\x17\x34\x4f\xb5\x02\x1f\xe8\x15\x9b\xbc\xb0\x05\x2c\xcd\x3e\x9f\x0d\xc5\xec\x44\x36\xe2\xb2\x21\x63\xe2\x5b\x84\x0e\x3f\xe2\xea\xb8\xf9\x5c\x0f\x87\xd5\x9c\x83\x2b\xe0\x30\xe7\x35\x72\x15\x8e\x66\x47\x87\x03\x33\x0e\xab\x23\xe8\xc0\x0e\x35\x14\xc8\x4a\x46\x92\xc9\xa6\x08\x91\x24\x98\x38\xc7\x26\xb3\x29\xcc\x92\x53\x38\x8f\xa0\x50\x3d\xd8\x26\xe5\xa3\x11\x9a\xff\x3b\x46\x30\x1b\xd9\xf4\x97\xfb\xd2\x7f\xa1\xa5\xbf\x1d\xfb\x08\x6a\xf5\x56\x13\x47\x31\x06\x93\x55\x0f\x0d\xbf\xc5\xbb\x2d\xd1\xba\x2a\xe3\x58\x02\x0d\xeb\xcb\xea\x1a\x9d\xd7\x86\xa8\xd6\xb1\x58\xf6\x9c\xfa\x72\x5e\x28\xab\x9b\xe5\x47\x3f\xcd\x8c\x45\xb1\xc7\x1e\xd1\x86\x98\x18\x31\x45\x9f\x1e\x95\xea\x45\x7d\x82\xd8\x22\x2d\xd9\xa2\x18\x30\x08\x71\xa8\x8e\x49\x36\x98\xf8\x23\x84\x4f\xc1\x17\x21\xe2\xa0\x17\x86\x21\x66\x20\xd4\xd0\x16\xac\x20\x58\x95\xfd\x38\x25\xf6\x22\x90\x15\x29\xda\x95\x1d\x27\x5c\x8d\xfc\x23\x23\x63\x17\x47\xa8\xd6\x74\x14\xbe\x79\x75\x04\x7e\x92\xb6\x51\xad\xd7\xc1\x5a\x12\x9e\x7f\xaa\x15\xb0\xa0\x58\x74\xd3\x31\x6a\xa9\x9a\x57\xfb\xd4\x7d\xea\xcd\xea\x5d\x6a\x1a\xc4\x60\x87\x8a\x4d\x20\x8e\x96\xc5\x40\x46\x27\xb1\x5e\x99\x5e\x4d\xb8\x7a\x04\xaf\x1e\x49\xab\xa8\xd6\xab\x23\x78\x58\xd1\x0e\x48\x9b\xa9\x26\xf2\x3b\x96\x4c\xea\xd4\x91\xd7\x2d\xe4\x77\x16\x00\x80\x7b\xc9\xef\x5c\x26\xd6\xfb\xd4\xf0\xa2\x1a\x4a\xbf\x0e\xa5\xd4\x90\x03\xf0\x57\x00\x72\xe0\x2c\x40\x0c\x00\x28\x86\xfb\xe8\xcd\xf4\x05\x1a\x7b\x69\x48\xd3\xd2\x76\x18\xc6\xe7\x30\x85\x21\x9d\x60\x94\x33\xad\x1c\x86\xe5\x16\xd6\x51\x22\xe7\x30\xa8\x10\x04\x2b\xd5\x07\xdc\x9b\x7e\xe5\x85\xf4\x2b\xb8\x52\x3a\xe0\xf0\xf0\x91\x49\xee\x51\x82\xeb\x5e\x21\x73\x9f\xa7\xcd\x74\x80\x31\x03\x07\xc8\x06\x05\x60\x8b\x38\x3f\x0f\x68\x5b\xb2\x6c\x3a\xbd\x69\xde\x8b\xba\xb7\x74\xe8\x51\xdd\x0f\x74\x48\xa7\x33\x06\xe2\x74\x57\xc8\x17\x82\x5c\x08\x3e\x19\xfa\x34\x84\x76\x85\xe0\x40\x08\x8a\xd2\x17\xbc\x21\xc4\x38\xe3\xc6\xce\x42\x3b\x08\x7a\x12\xc0\xc6\xe7\x65\x25\x34\x7a\xab\x76\x12\x78\x26\x4b\xcc\xf5\xce\x68\x39\x0c\x11\xcd\xe9\xb2\x52\x38\x0d\x66\x54\xd1\x88\xaa\x85\x08\x34\x5b\x6d\x82\x01\xd3\x15\xc1\x3c\xa1\x11\x62\xff\xe0\x4f\xef\x5e\x10\xdb\xfb\xb3\x6d\x4f\xdf\x7c\x76\xff\x82\xd8\x5d\xaf\x6c\x7f\x3a\xad\x7b\xfc\xd9\x65\x3b\x13\xb9\x38\xfa\xdd\xa7\x9f\x79\x8c\xea\xd6\x2d\x3d\xf0\xc6\xce\x9d\xbf\x78\xb0\x53\x9b\xce\x81\xff\x4b\xd3\x79\xf0\xad\x3b\x77\xbe\x79\x60\xa9\x16\x9e\xb9\x66\x7a\xe9\xef\x4d\xb8\x5e\xdd\xd0\xff\x60\xef\x99\x5f\x99\xaf\xbd\x61\xfe\x8d\xbc\x56\x01\x00\xf0\x87\x64\x2e\x7a\x14\xfd\x82\x3d\xd4\x73\xc4\x56\x9b\xc5\x10\x8c\x71\x00\x32\x00\xb0\xb1\x03\x1a\xa8\x21\xde\xb3\x4f\xb9\x0f\x60\x98\x18\xee\xd0\xa9\x28\x4e\x23\x9d\xed\xf0\x2a\x59\x8a\x0c\x18\xf0\xbd\xa4\xac\x0a\xab\x1c\xe4\x4a\xa1\x8b\x7a\x6e\xe4\xda\x73\x23\xf0\xcb\x91\xa3\xd2\x91\x4d\xb5\x4a\x0b\x72\x2d\x01\x20\x38\x02\x00\x4e\x13\xbc\x6f\x99\xe8\x56\xe9\x62\xda\x89\x46\x0a\x18\xb3\x75\x38\x54\x38\x61\x34\x6a\x2d\x6a\xd9\xf8\xc9\x7d\x88\x62\x86\xc4\xea\xcd\x32\xe5\xa2\x64\xfa\x13\x10\xff\xc4\xe9\xe2\xc4\x82\x85\x85\x23\x23\x45\x89\xa5\xbd\xb5\x8b\x6e\x6f\x0f\x51\xad\xe9\xb5\xcf\x72\xee\x22\x37\x7c\x5f\xda\x0d\x9e\x52\x9f\x10\xee\xb8\xa5\x19\x9e\x90\xf7\x00\xd3\x42\xc6\xbc\x56\x9c\x03\x62\x23\xea\x37\xd4\xe8\x29\x35\xc4\x5b\xd4\xdf\x56\x3f\xa2\xc6\xfd\x6a\xc8\xa8\xd5\x34\x8c\x51\x4b\xf5\x3e\x82\x0a\xd9\xa5\xbf\xa2\x47\x03\x7a\x28\x4a\xaf\xc2\x7a\xc4\xa8\x62\x74\x87\x0e\xa8\x12\xb4\x45\xc3\x20\xf9\xd8\x9f\xd2\x63\x3a\x38\x09\xbb\x4a\x25\x09\xfa\x78\xca\xa5\x03\x7e\x1f\x9e\x79\xe1\xab\x75\x23\xf0\xa5\x91\x23\x78\xf8\xea\x88\x3c\x2f\x99\xb5\x60\x3e\x26\xb1\xd8\x36\x71\x91\x26\x36\xc2\xbe\xc1\xa2\xa7\x58\x88\xb7\xb0\xdf\x66\x1f\x61\x71\xbf\x14\x92\xb0\x58\x1b\x33\xc0\x98\x41\xca\xed\xcf\x1a\xa0\x41\xf0\x09\x90\x13\xa0\x28\xec\x12\x2e\x09\x57\x04\x8a\x13\xc2\x02\x22\x8b\xc5\x4b\xab\x65\x98\xba\x5c\x53\x2f\x47\x06\xf9\xd7\x92\xe5\xe1\xa4\x7c\x3f\x32\xf1\xa0\x70\xda\xfd\x88\x10\x61\x3e\x1e\xf9\x6a\x48\x7a\x54\x78\xe6\x85\x27\xa7\xae\x22\x59\x49\x29\xd7\x28\x00\x80\xba\x46\xb5\x02\x03\x70\x81\x15\x62\x23\x17\xa3\xba\xb2\x12\x59\x7d\x59\x07\xb3\x2e\x65\x51\x4d\x59\x10\x58\x63\x1a\xa0\xe3\x75\x68\x58\x77\x45\xda\x54\x40\xc3\x6b\x12\x9a\x3e\xcd\x51\x0d\xad\xd2\x58\x12\x67\xa5\x71\x58\x75\x09\x3d\x67\x4d\x68\x26\xa3\xee\x51\x99\x0c\x36\x39\xc8\x8f\x96\x27\x27\x4a\x8d\x56\xcb\xc4\x8d\x09\x41\x68\xca\xe1\x36\x8a\x43\xf3\x7b\xbf\x92\x43\xec\xf4\x61\xe4\x45\xc8\x3f\xab\x4f\x94\x62\xec\xea\x64\x73\x10\xed\x7b\xfc\xbb\x0b\xef\x58\x16\xc6\xc3\x47\xae\x7d\x59\x36\x3b\x5f\x48\xff\x50\x28\x98\x0d\x32\xf9\x02\x2d\x45\xc1\x3a\xc0\x83\x2c\xb0\x52\x14\xed\x31\x40\xf1\x94\x8f\xda\x4c\x5d\xa0\x68\x86\xa2\x34\x86\x98\x7e\xa9\x97\xf3\xc2\xb3\xde\xf3\xde\x8b\xde\x71\x2f\x75\x54\x4a\xfb\x87\xbc\x88\x05\xc6\x98\xa6\xc3\x23\xc8\x03\xe0\xb4\x9c\x31\x61\x20\x21\x04\xb9\x48\x99\xd2\x51\x33\x98\xb9\x59\x96\x86\x10\x99\x18\x42\x04\x4a\x47\x8f\x30\x91\x1d\xc3\xd5\x97\x95\x31\xac\x1a\xc1\x97\x47\x46\xae\x99\x3f\x94\x32\x04\x69\x24\x99\x11\x48\x1e\x97\x6a\x1d\x3b\x4e\x06\x50\x2a\x0d\x85\x68\xe4\x2a\x39\x8f\x0e\x38\x80\x28\x16\x98\x63\x54\x97\x0b\xb8\x20\x70\xf9\x5c\x9b\x5d\x07\x5d\xc3\xae\x0b\x2e\x46\x05\x0c\x31\x4d\x87\x53\x2f\x3f\xac\x96\x33\x28\x53\x3d\xe5\x41\x07\x67\xce\x71\xc4\x01\xfd\x93\x0f\x07\x2d\x99\x19\x1e\x91\x53\x97\xe9\x0f\x36\xed\xa1\x20\xa8\x1e\xbf\x8c\x67\x53\xbd\x20\x08\x7a\xc5\x46\x83\x81\xd2\x71\xf1\xec\xae\xfc\x03\xf9\x27\xf3\x91\x98\x0f\xed\x1c\xe5\xa5\xc2\x14\xa6\x44\x9d\x10\xa7\x96\xe5\xe9\x13\x9f\x1a\xe0\x53\x86\x17\x0d\x88\x33\x78\x0d\x61\x03\x66\x0c\x06\xd6\xb8\x38\x8b\x67\x17\x83\x69\x7d\x4a\xa3\x90\xff\x43\x68\x50\xb6\x87\x72\x61\x06\x78\xa5\xda\x5f\xe9\x57\xe0\x54\x53\xa2\x52\x38\x7b\xf9\x1d\x55\x55\x7b\xda\xe7\x6d\x69\x2f\xa5\xd2\x01\xf8\xa1\xfe\xa1\xfb\x1c\x75\xf5\x35\xb6\x4a\xbb\x18\x5f\x14\x5c\xfb\xfc\xb7\x17\x2e\xbe\xef\x8c\xd9\x93\x75\xcc\x91\x9b\xdf\xf1\xed\x15\x47\x4e\x3c\xaa\xe6\x4c\x9a\x23\x3a\x2b\xaf\x6e\xdc\xff\xe1\x13\x0f\xbd\x77\xcf\x1c\xf9\x7e\xe1\xd9\xf1\xcb\x8c\x8a\x60\xff\x83\xe0\x66\x71\xbe\x2b\xae\xf1\x09\xb0\x8d\x5c\xa9\xf8\xe3\xa0\x2b\x9f\xcb\x0f\xe7\xa3\x4f\xf3\xc7\xf3\x51\x2c\x1f\x92\x17\xbc\x2e\xa6\xef\xc8\xcb\x49\x58\x79\x6d\xe2\x53\x1e\x3e\xc5\xbf\xc8\xa3\x22\x1e\x6a\x79\x17\x8f\x18\x29\x83\xe0\xf4\x16\x8f\x82\x48\x6f\x9a\x68\xc5\x52\x6e\x58\x26\x2d\x27\x39\x18\x99\xc2\x17\x36\xed\x86\x05\x4d\xe5\xd3\x65\x54\xe2\x6d\x3f\x5a\xbf\xea\xd8\xd6\x16\x36\xfd\xe9\xc8\x08\x34\x69\xe2\xb7\x1e\xbd\x61\xd5\x0f\xb6\x37\x8f\x15\xec\x7a\xe0\xc0\x9d\xbb\x0e\x3c\x70\xa7\xdc\x33\x30\x7b\xf7\xcf\xee\x90\xa2\x83\x74\x74\xcb\x8f\x6f\x6b\x9c\xff\xe0\xbb\x77\xff\xe6\xdd\x77\x7f\xf3\x9b\xf3\xe7\xa5\x71\x4a\xe7\xc3\x83\x24\x67\x72\x83\x25\xa2\x19\x09\x02\x6b\xe7\x62\x86\xa5\x1e\xce\x33\xe0\x39\xe0\xc1\x0c\x80\x52\xf8\xec\x80\xd0\xd8\xc2\x8a\x52\xc6\xd4\x99\x85\xf8\x84\xdd\x0e\x1c\x09\x3d\xc7\x29\x71\x83\x94\x26\x93\x4e\x8c\xd1\x08\x69\x77\x92\x57\x4c\x8a\x53\x23\x81\x4c\xef\x26\x69\xc3\xc0\x72\xaf\x7d\x20\x9b\xf9\xe4\x0d\x18\x28\xee\x98\x95\x5f\xb3\xfa\x9e\x25\xf0\xe5\x91\xcf\x3f\xca\x9d\xd5\x5d\xf5\x61\x7a\xc3\x3a\xf8\x8e\xae\x74\xc1\xc6\xd8\xa2\xed\x8b\x0b\xaf\x8e\xc0\x61\xd8\x51\xda\x52\x62\x85\x6b\x53\xd7\xd5\xdb\x04\x73\x1e\x99\xa2\xa3\xfe\xe2\xa9\x92\xfc\x19\xda\xa1\xb2\xd6\xe8\x6f\x27\x7e\x7e\xfd\xef\x14\x2d\x98\x32\x21\x88\x11\xc8\xaf\xa7\xa7\xe8\x30\x03\x08\x8c\xa4\xef\xdb\x0c\xca\xc0\x12\xb1\xdc\x6b\xd3\xc5\x8a\x97\x46\xf8\x48\x5f\x64\x57\x04\x07\xb2\x3d\xd6\x98\xcb\xd6\x51\xee\x77\xb4\x79\x9c\x4e\x77\x80\x4f\x80\x02\xbe\xc0\x57\x80\x0b\x38\x37\x98\xaa\xf7\x23\x4b\x24\x5e\x47\x21\x71\xaa\xf0\xcf\x5f\x17\x4b\x34\x1b\x10\xba\x32\xa9\x00\xf4\x0d\xca\x89\x33\x54\x80\x9a\xaf\xaf\xa3\x78\xed\x67\xb2\x14\x50\x46\xbb\x84\xe8\x81\xc0\x3f\xca\xfc\x9b\xb2\xb6\x33\x34\x0a\x41\x38\x97\xd1\xe1\xa9\x5c\xe2\x4a\x5c\x07\xb2\x41\x9b\x58\x66\xb3\x59\xbd\xfa\x9c\x03\x39\x27\x73\x90\x98\x03\xad\x8e\x38\xdd\x19\x70\x24\x3e\xb5\xc2\xa7\xac\x2f\x5a\x11\x67\xf5\x5a\xc3\x56\xcc\x58\xad\x6e\xd3\x62\x0d\xef\xfe\xfa\x56\x26\x46\xce\xff\x3a\xb3\x91\x27\x3b\xd0\x59\xb9\x01\xce\x6f\xf1\x4f\xb4\xbe\xa1\xf6\x35\xc3\xdf\x6a\x5d\x70\xd7\x73\x6b\x27\xda\x45\xee\x7d\xc8\x00\x3f\x4c\x07\xd4\x0f\xdd\xb3\x78\x4f\x55\xd5\x0e\x73\xd3\xfe\xf7\x0f\x3d\xf1\xe1\xfe\x46\xa5\x3d\xe4\xd1\x13\x47\x4e\x1f\xcf\x75\x1c\xcb\xf2\x64\xb4\x38\x48\x3c\xda\x99\xd1\xae\x82\x5b\xe9\x8f\x8d\x0c\x58\x40\x30\x54\x7f\x02\x00\xe5\x12\x9b\xf8\xb3\x82\x3d\x7e\x29\x83\x3d\xd6\x0b\x41\x04\x01\x65\xff\x1a\xee\xea\xe5\xb4\x59\x79\x8f\x85\xc4\x3f\xf0\xe3\x9f\x31\x72\xcf\x5c\x21\xd8\x20\xce\xd5\xb5\xb8\x41\x6e\x4c\xf3\x9e\x1b\x1e\x74\x1f\x75\xa3\x1c\x37\x04\x6e\xe8\xd6\xb8\x35\x66\x4f\x8c\xea\x2a\xe2\x8a\xc2\x45\x4d\x45\xa9\xa2\xa1\xa2\xb3\x45\x9f\x16\xb1\x66\x73\x28\x47\x76\xce\xb9\xba\x84\x9b\xb3\xb5\x09\xd6\xdc\xcc\x71\xa8\x1c\x88\xf2\x65\xf2\x17\x99\x9b\x13\x12\xff\xf2\xd3\xcf\x94\xc0\xd7\x12\x30\x48\xae\xc0\xe5\xab\xa8\x7d\x97\xdf\x7b\xbb\x84\x1c\x30\xbf\x9d\x99\x92\x85\xe0\x6f\x25\x7f\xfe\x01\x39\x72\x26\x0f\xcc\x19\x69\xda\xd4\xe3\x93\x9c\x3b\xcc\x56\x92\x47\xfa\xc1\x12\xb1\x94\x76\xc7\x10\xc7\x99\x2c\x31\x75\x57\xe0\xd3\x00\xdc\x15\x80\x4d\x01\xc8\x07\x20\x34\xc6\x4c\x1d\xd9\x2e\x21\x41\x9f\x85\x10\x42\xe0\x4e\x98\xb8\x89\xb4\x26\xd3\x8e\x91\xf1\x78\xd3\x01\xf9\xf2\x5d\xfe\xc4\x99\x2f\x65\x39\x93\xc3\x81\xab\xe1\xf9\x91\x89\x23\x33\x5d\x36\x42\x5b\xfc\xb3\x56\x36\xfd\xe3\xff\x92\xce\x7c\x39\x09\x4a\x37\xc8\x03\x91\x53\xa1\xe9\x87\xff\x54\xed\xd3\x25\x62\xf9\x3a\x33\x34\x7f\xb3\xfc\xe9\x74\xe5\x53\x6e\xa6\xf2\xe9\x8c\x6d\x2d\x44\x93\xff\x9f\x28\x9f\x2a\x7b\xf5\x63\xb2\x57\x3f\x93\xf7\xaa\xa2\xcd\x6f\x13\x82\x50\xa7\x15\x58\x3c\x43\xbb\xb6\x8e\xfc\xec\x15\xd9\x2f\xfe\x92\xdc\x45\xe8\x04\x19\x29\x65\x9c\x76\x17\x31\xa1\xcf\x60\xcb\xe8\x33\xec\xf3\xfe\x58\x7e\xef\x7c\x21\x08\x35\xc5\x53\xf4\x19\x94\x9c\xc1\x48\xe2\xe7\xe5\x62\xc3\x3f\x30\xf0\x05\xe6\x4d\x06\x31\xb1\x9f\xb0\xaf\xb3\xef\xb3\xf8\x56\x76\x2f\x8b\x5a\xd9\x6e\x16\xb1\xac\x9a\x04\xd1\x93\x79\x04\x0d\x62\xea\x0e\x1d\x0d\x12\x6a\x0b\x73\x55\x83\x32\x6d\xa3\x99\xf8\x5e\xbe\x4f\x18\x4d\x26\x27\x42\x66\x12\x8f\xc2\xd5\xf0\xcb\x91\xf4\xf3\x2f\xa4\x8f\xca\x21\xb3\x1c\x88\x4e\x60\x45\xd9\x5e\xfa\x2d\x30\x17\x0c\x8a\x71\x33\x15\xed\xce\x7d\xbd\x0a\x1e\xaa\x3a\x51\x85\xf6\x57\xc1\xaa\xaa\xac\x59\x3d\xba\xfe\x18\x88\xf1\x31\x04\x62\xbe\x58\x22\xb6\x39\x76\x21\x76\x29\xc6\xb0\x25\x3d\x59\x6b\x5b\xaa\xab\x23\xa0\x20\x85\x83\x41\x36\x9b\x32\xfb\xd4\x86\xb8\xb9\x3e\x92\x12\xec\x26\x99\x37\x23\xd4\x14\x21\x77\x74\xc6\x4c\x4b\xc5\x54\xe2\x98\xf2\xe8\x75\xeb\x39\x41\xb9\xcb\x75\x06\x88\x34\x30\x55\xce\x2b\x22\x28\x0e\xbf\xa2\x04\xd1\xeb\xea\x7b\x0b\x17\xd4\x1d\x58\xbc\xed\x85\x9d\x62\xd3\xee\x37\xee\x1e\x78\x7a\x1e\x9a\xff\xc3\x9b\xee\x7e\x63\x77\x93\xb8\xf3\x85\x6d\x8b\x0f\xd4\x2d\x28\x48\xd5\xcf\x1d\x4c\x84\x4a\x56\xdc\xb3\x22\x7a\x6b\xc9\x4b\x25\xb7\xd6\xad\xb8\x77\x45\x49\x51\x62\x90\xce\x25\x85\xa0\x1b\x4e\xa7\xbf\x3c\xf1\x74\xfa\xe2\xdf\x6f\x2b\x2f\x2d\x2d\xdf\xf6\xf7\xd0\xff\xf4\x09\xa8\x3a\x7d\x03\xc1\x9d\xb6\xdc\x73\xfe\xee\xfb\x3f\x3e\xbe\x3c\x27\x08\x7f\x9a\x9e\x13\xcc\x59\x7e\xfc\xe3\xfb\xef\x3e\x7f\x4f\x4b\x06\x23\x4f\x7f\x4e\xb5\x82\x22\xf0\xaf\xa2\x7a\x0d\x0f\xdf\xca\xfe\xaf\x6c\xe4\x3f\x3d\x7e\xe5\x79\x0d\x1f\x2f\x92\x3e\x1b\x5d\xe4\xb3\xe8\xd0\x70\x71\xc0\x6b\x5c\xf1\xa0\x3e\xdb\xe0\xcf\xb6\x14\x01\xa6\x93\x5b\xcb\x21\x8e\x5c\x83\xc6\xbd\x06\x38\x60\x18\x32\x3c\x69\xb8\x68\xa0\x96\x1b\x60\x9b\x01\x6e\xb1\xc0\x0d\x16\x98\x63\xa9\xb0\xa0\x1c\xa6\x82\x69\x66\xb6\x30\x8f\x30\xb4\x81\xb1\x58\x0c\x0c\x86\xae\x18\x70\xf3\x6e\xc4\xba\xdd\x25\x7c\x89\xaf\xa4\xb4\xe4\x42\xc9\xa5\x12\x1a\x91\xc8\xc2\x03\x83\xa2\x25\x2b\x1e\xf4\xe9\xcc\xf1\xa0\x9e\xc7\x2e\x03\xe4\x2c\x4c\x90\xa9\x62\x10\x93\x4d\x36\x5e\x79\x52\x88\x34\x45\x22\xb6\x68\x28\x04\xc3\x35\x91\x8c\xfa\x80\x2d\xda\x10\x0e\xdb\x15\xd8\x7d\x72\x90\x7c\x23\x22\x77\x56\x47\x43\x32\x4d\x57\xd2\x0f\x23\x26\x0f\x94\xf9\x2d\xf0\xd7\x7a\x80\x71\x09\xac\x34\x60\x16\xc3\x6d\xe9\xfd\x2f\x5f\x72\x07\xd5\x2c\x6b\x71\x66\x71\xdb\x8e\x91\xe6\x60\x3b\xcd\x76\xdf\x3c\xcb\xf1\x02\x69\x0e\xde\xa6\xd3\x43\x46\xad\xa1\x0e\x53\xad\x63\x9d\x5d\x4f\x44\xac\xb5\xb3\xe6\xfa\xa0\x0e\x9e\x57\x7a\x86\xfb\x2f\xfc\x33\x18\x3f\xfc\x3f\xd2\x17\xd3\xff\xfb\xda\x10\xec\xf0\x55\x62\x68\x72\x65\x69\xd2\x4f\x67\xea\xca\x2f\x33\x66\x82\x39\xfd\xae\xa8\x31\x01\x5b\xb7\xce\x62\x61\x78\xdd\xe9\xf1\x73\xa2\xde\x99\x17\xf7\xe9\x20\x3a\xa8\x3b\xaa\x43\xd2\x57\x9e\x37\xd9\xe3\xe4\x3b\xa2\xd6\x10\xd7\xe9\x0c\xae\x1e\xa6\x3f\x00\x02\xa5\x81\x04\xf1\x55\xf4\xa5\x00\x7c\x32\x00\x13\x01\x68\xf0\xa7\x80\x55\x9f\xe2\x4d\xfc\x30\x80\xfb\x01\x6c\x03\x90\xe3\x21\x0b\x78\xc0\x0b\xc0\xd6\xa7\x93\x4b\xa7\x19\x4e\xa0\xc9\x96\x90\x89\x50\x33\x14\x4a\xa6\x06\x43\x92\x4f\x53\xa4\x14\x27\xea\x3b\x4a\x95\x5a\x81\x07\x2a\xa5\x55\xa4\x21\x35\x55\xb9\xbe\x9a\x7e\x0d\xd6\x9f\x81\xdb\xd3\xfb\x26\xaa\xc0\x8b\x66\x0f\x1e\xee\x5a\xf9\xbd\xcd\x0d\x54\xdf\x71\xc8\xa7\xaf\x1c\xbf\x26\x4e\xc1\xdd\x4a\x73\xb0\x89\xce\x23\xe7\xc7\x6e\x51\x6d\x42\xd6\x18\x0f\x74\x90\x0c\x34\xa6\x77\xc6\x75\x40\x07\x0c\xee\x18\xd3\x15\x00\x01\x3e\x80\x36\x07\x0e\x06\xce\x05\x2e\x05\x28\x83\x25\x81\xa0\x3e\xc1\x9b\x78\x4e\x4a\xf5\x90\xa8\xf3\xc4\x39\x1e\x72\xbc\x97\x47\x2c\xe2\x11\x3f\x24\xc0\x52\x01\x0a\xd6\x84\x4e\x3a\x3f\xc3\xc9\xa4\x3c\xe2\xc1\xd0\x94\x11\x0f\x66\x6e\xb4\x43\x49\xe5\x3a\x46\x4a\x25\x27\xce\x51\xd9\x61\x43\x61\x22\x01\x42\xbf\x4f\xbf\x0f\x2d\xef\xbe\x23\xa7\x40\x7f\xfa\xd3\x08\x0c\xa5\xdf\x87\x54\x75\xaf\x9c\x08\xe1\xe1\xf4\x07\x13\x59\xe6\x47\x1f\x4d\x4f\xd1\x00\x04\x6f\x8e\x5f\x66\x2e\xd3\x6f\x83\x62\xb0\x4c\x0c\xab\xe8\x1e\x57\x36\x2b\x08\x6c\x36\xf6\x14\x16\x86\xfd\x59\xdd\x9e\xd5\x25\x21\x90\xca\xa3\x5c\x2a\x77\x2a\x9b\x96\x91\x6c\x5e\xec\x31\x4e\x42\xd8\x49\xc1\x9b\xdc\x1c\x65\x48\x25\x84\xc8\xce\xb0\xd1\x16\xb5\x87\xc3\xca\x71\x79\x5d\x20\xfb\xd4\x6c\x81\x38\x22\x7a\xd3\x14\x34\xfb\xd6\x67\x64\x34\x7b\xe7\xca\xda\xef\xfd\xf1\x89\x76\x3a\x3d\x7c\xe6\x0c\xec\x34\xdc\xf0\x83\x4f\xbe\x43\x50\xed\xdf\xf9\x3a\xaa\x7d\xf5\x69\x88\x9f\x94\xcb\xb1\x07\xfe\xf8\x83\x15\x0a\xb4\x9d\x9c\x09\xe3\x97\xe9\x41\xaa\x17\x14\x80\xd5\x62\xd4\x97\x15\xa7\xdb\x74\x50\xe7\xd5\x79\x55\x79\x66\x73\x48\xcb\xc6\x54\x1d\x85\xce\xc5\x16\x81\xf7\xd1\x4c\x22\x4b\xf7\x94\xf6\x45\x2d\xe2\xb4\x5e\x6d\x58\x8b\x19\xad\x56\xcd\xa9\x2c\x81\xc5\x41\xb9\x93\x44\x1e\xad\x32\x5c\xa5\x0c\x29\x0d\x37\x62\x8c\x4a\xe3\x95\xfb\x37\xe9\x19\xb9\xd0\x75\xc3\x46\xaa\x63\xe5\x53\xbb\xdb\xd8\xf4\x7f\x4a\xe9\x90\x6e\xe9\xee\xef\xf7\x2a\xe1\x63\x9d\xe3\xbe\x07\x33\xe1\x63\xfb\xb7\xaa\x2a\xef\x30\xd7\xee\x78\x65\x9f\x9c\x13\xed\xfa\xc9\xcd\x15\x5f\x0b\x22\x27\x35\xdd\xc3\x04\x4b\x63\x07\xcf\x8a\xf3\x54\x0c\xfc\x47\xe6\xdf\x18\xc4\xb2\xf0\x03\xf6\x5f\x59\x74\x82\x85\xdf\x85\x70\x1b\xf8\x01\x40\x7a\x8d\x5a\x87\x29\x96\x31\x99\x54\x3f\x00\x10\x40\x48\xab\x81\x0a\x02\x15\xaf\xf2\xa9\x36\xab\x76\xa9\xce\xa9\x18\x15\xaf\x52\x39\x0f\x3a\x8f\x3a\x91\x53\xb2\x79\xce\x62\x8f\x1f\x70\x42\xd1\x09\x39\x27\x54\x51\xb4\xe4\x0a\x4d\xb4\x16\xa7\x4c\xbc\xc6\x10\x37\xe9\x74\x0c\x05\xd4\x46\x06\x67\x38\xcd\xa2\xa1\xd1\x72\x85\x4a\x22\x19\x92\x0b\x01\x83\x24\x1a\x49\x0a\x84\xe3\xc0\x18\x8d\x1a\xa3\x51\xe2\x09\x93\x83\xe4\xfa\x36\x00\x03\x30\x02\x03\x30\x90\xe7\xcf\x93\xc5\x24\xd0\xe5\x13\x43\xe9\xf4\xeb\x28\xfa\x12\xaa\x7b\x33\x9d\xbe\xfd\xdf\x60\xa0\xd2\xe8\xb6\x0a\xac\x5a\xb0\x38\x04\x19\x76\xfe\x55\x2b\x7a\xfa\xf8\x81\xd2\x05\x73\x66\xe5\xe6\xce\x9a\x33\xaf\x98\xf4\xab\x01\x40\x75\x93\xf3\xdf\x06\xce\x8b\x35\x51\xb4\x1c\x6d\x47\xfb\x11\xe5\x42\x21\x84\x7e\x42\xc3\x43\xf4\x09\x1a\xed\xa3\xa1\x1a\x3b\x30\x62\x54\x56\x15\x52\x1b\x1d\x46\xc4\x08\x56\x01\xb1\x46\x8c\x04\x95\x7a\x84\xc8\xb5\x7c\x29\xba\x34\x5c\xfc\x45\x2d\xd4\xaa\xa4\x03\x46\x7b\x4a\x07\x75\x3a\x9a\x66\x18\x0d\xe4\xa5\xd3\x80\x94\xe4\x08\xdd\xa6\x9d\xd5\xc6\x21\x74\x9c\x73\x5c\x72\xa0\x93\x0e\x98\x70\x40\xc2\xe8\x2b\x53\x37\x72\x1a\x4a\x95\xd0\x69\x05\x01\x6a\x39\x0d\x03\xe5\x4a\x0e\xe9\x45\x92\xe7\x48\xc1\x1b\x86\x42\x91\x1a\x69\x86\x48\x33\x6b\x24\x12\x4a\x86\x92\xf2\x2c\x29\x28\x57\xe9\x80\x48\xaa\x61\x00\x07\x48\x66\x1a\x20\x92\x3d\x91\x12\x9c\x87\x4e\xc0\x53\x2f\xbf\xd4\x77\xac\xef\xcc\x4f\xe1\xa9\x41\xda\x15\xc8\xd5\x5f\x31\xe4\x06\x5c\x14\xd5\x2a\xdf\xb4\xcb\x21\xe6\x76\xc7\xd2\xbe\xde\xec\xec\x54\x5f\x87\x03\x4c\xf4\x16\x14\xd0\x23\xc0\x04\x7c\xe0\xac\xe8\x9a\x30\x0e\xc6\x40\x5b\x8c\x82\x19\xbb\x28\x8a\x06\x90\x33\xb8\xc8\x6a\x27\x77\x41\xf8\xb6\x0b\x7e\xdb\x05\x43\xae\x1d\x2e\x45\xe0\x78\x88\x3e\x4f\x5f\xa4\xc7\x69\x56\x45\x43\x97\x0b\xd2\x58\xe0\x79\xc0\xf3\xfc\x66\x7e\x98\xbf\xc2\xd3\x3c\x9f\x5d\x9a\x9d\xc8\x3e\x97\x7d\x21\xfb\x52\x36\xad\x53\x75\xab\x57\xfb\x4d\x0c\x4e\xe9\x5d\x3e\x35\x1f\x77\x99\xcd\x06\x35\x05\x05\xa3\xc6\x80\x49\xed\x48\xb1\x9c\x88\x42\x2b\x41\x0a\x48\xc9\x9a\x88\x8d\x90\x90\xc8\xc7\x42\xb2\x86\x9c\x9a\xa4\x4c\x19\x55\xfa\x03\x93\xc9\x09\x03\x52\xb6\x9c\x69\xba\x21\x51\xff\xfa\xfd\xdd\xe9\xb1\xd7\xa0\x2a\x3d\x74\xe6\x0c\x7c\xe5\x3f\x65\x7b\xda\xfe\x09\x0c\x54\x9a\xdc\x16\x41\xa5\xca\xd8\xd3\x64\x2b\xc3\xf5\xec\x4a\xca\x29\x54\x54\x2b\xe1\x56\xff\xa3\x58\xf6\x7d\x19\xa8\x86\xb6\xd1\x90\x51\x5b\xd5\xc8\x81\x0a\xd0\x3c\x74\x23\xda\x8e\x68\x2d\x82\x4e\x8c\x1c\x2a\xb3\xda\xa8\x35\x69\x04\x7d\xcc\xf0\x86\x62\x50\x36\x0d\x17\x7f\xcb\x04\x4d\xc4\xa0\x4c\xaf\x99\xa1\xd9\x4c\xd3\x8c\x6c\x27\xa6\xb0\xa6\x49\x73\x52\x83\x35\x8c\x86\x81\x86\x0e\x1f\x82\xfc\x34\x23\x2b\x22\x46\xe6\xbf\xe0\x87\x67\xfd\xb0\xcf\xbf\xd9\x7f\xd0\x8f\xdb\xfc\x10\xf8\xa1\x4a\x4b\xa9\x12\x46\xb3\xc9\xe1\x40\x9c\x89\x33\xa8\x19\x24\x17\x99\x9a\x22\xc4\xcc\xc8\x84\xf6\x26\x27\xec\xac\x26\xa2\xc0\x7e\x92\x35\x11\x61\xaa\xbd\xf1\xa3\xe5\x64\x5e\xe5\xb9\xcd\x58\xdd\x14\x9b\x33\x65\x26\x38\x63\x7b\x54\xc7\x84\xed\xbd\x9a\xfe\x64\x64\x04\x76\xfc\x64\xf3\x37\x58\xa0\x6c\x85\x52\xea\xb3\xdd\xd1\xd1\x97\xca\x58\x22\x39\x6b\xe9\xf5\xf4\x08\x08\x80\x20\x38\x27\x0a\x7b\xb3\xe1\x5e\x27\x5c\x6e\xdc\x6f\x44\xb9\xbc\x5a\x17\x0f\x4a\x73\x53\xa4\xd6\xc5\x73\x35\x5a\x26\x27\xc7\xd9\xed\x0a\xb2\x19\x92\x08\x17\xcb\xba\x34\x18\x18\x79\xc1\x27\xa0\x0b\x02\xdc\x25\x1c\x14\x10\x51\x92\xaf\x63\x35\x71\x41\xc8\xf7\xe6\xc3\x2b\xf9\xf0\x7c\xfe\xc5\x7c\x24\xe6\x27\xf2\x37\xe7\x63\x2e\xbf\x29\x1f\xb1\x01\xe0\x70\xaf\xcc\xd1\xb6\x31\x90\x63\x4e\x32\x48\xc5\x30\x40\xc3\x06\x53\x2a\xec\x32\x12\x44\x70\xa6\x5f\xb0\x37\x39\x18\x21\xe2\x5f\x32\xd6\x7c\x50\xee\xcf\x1a\x8c\xc8\x28\x6d\x72\x66\x13\x7f\x26\x44\x42\x21\xb2\x43\x23\xa6\x46\x5c\x0d\x2b\xfd\x16\xe8\xc1\x36\x53\x00\x97\x60\x85\xbb\xd1\x80\x58\xac\x86\x7e\xf3\x0e\x7b\x55\xc7\x1d\xa9\xf4\x41\x6a\x5e\xfa\xae\x95\xbb\x3a\xab\xed\xb7\xff\x6c\x87\x39\x58\xd5\xd6\x60\x7f\xc9\xde\xd0\x56\x15\x34\xef\x80\x7f\x84\xad\x63\x03\xf0\xf5\xa5\x77\xaf\xaa\x65\xe0\xbf\xde\x7b\x6f\xda\xc1\xd4\xac\xda\xdf\x99\xae\x83\xaf\xc4\x53\x51\xdb\x58\x1c\x9d\xb6\x45\x53\xf1\x74\x13\xee\x86\xa7\xe5\xbd\x2c\xf9\xbc\x8f\xa9\x56\x32\x87\x6f\x8a\xfa\x5b\x9d\x7b\x9d\x87\x9c\x38\x97\x67\x95\xf9\xb3\xb3\xba\xb8\xda\x08\x99\x00\x24\x73\xd8\xe2\xca\xd5\x04\xd9\x1f\xb8\x64\x7a\x52\xde\xea\x88\x4f\x4c\xa5\x4f\x96\xe2\x97\xac\x8e\x4c\x64\x13\xab\x95\x26\x92\x57\x66\xb1\x2f\xff\x60\x3e\xf2\xe6\xb7\xe5\xa3\x80\x34\x63\x09\x95\xc3\xdd\x6e\xcd\x09\xe6\x54\xe5\x9c\xc8\xa1\x72\xb4\x1c\xe3\x65\xda\x98\x14\x43\xb1\x0c\xa3\xe2\x5c\x46\x39\x22\x56\x02\x84\xa4\x14\xdf\x94\x4b\x93\x99\x99\xca\x50\x66\x26\xa5\x33\x62\x62\x32\x93\x49\x12\x0e\xff\xd5\xa9\x84\x26\xbf\x66\x87\xb5\x68\x76\xff\x92\xf4\xaf\xf1\xf9\xf4\x5b\x4b\xd6\xcd\x29\xb2\xed\x38\xb3\xc3\x9c\x53\xda\x5c\x49\x9d\xa0\x2a\x5b\x4a\x73\xcd\xb7\xc3\x53\xd7\xd2\x1a\xd8\xd1\xb0\x66\x61\x99\x1a\xae\xbe\xf1\xc6\xf4\xe3\xaa\xb2\x05\xfd\x0d\xe9\x67\x60\xa2\x2a\x1e\x12\xc6\xbe\x40\x1a\x21\x14\xaf\x4a\x0f\xa3\x3d\xb0\x38\xe3\x13\xf7\xd3\x23\x20\x1f\x84\xc0\x2f\x45\xcb\x5e\x2f\x5c\x6e\xdb\x6f\x43\xbc\xb6\xa0\xc0\xdb\xed\x2b\x94\xec\x31\x24\xcd\x67\x44\xad\x8b\x17\x72\x21\x1d\xe0\x78\xce\xc7\x61\x96\xd3\xf9\x7c\x3a\x0e\x5b\xf3\x87\xc1\x39\x80\x38\xe0\x25\xc0\x17\x1b\xb0\xf2\x56\xb4\xd9\xba\xcb\x7a\xce\x8a\xad\xd2\x6c\x56\xb0\x9a\xb8\xd5\x5a\x7c\xa9\x18\x3e\x59\x7c\xb6\x18\x89\xc5\x30\x5c\x0c\x35\x4c\x37\xbb\xba\x88\xd3\x85\x52\x7a\x0f\xed\x5f\x59\xc0\x73\x5a\xa8\xd2\x6a\x55\x7a\xcc\xda\x7c\x04\x77\x6b\x53\xaa\xac\x24\xea\xe0\x27\xfc\xa3\xb2\xa1\xe5\xa3\x35\x99\x54\xe6\xb2\x97\xcc\x65\x28\x34\x31\x9b\x65\xa5\x7e\x53\x23\xac\x56\xf6\xee\x5f\x31\x4e\x14\xd9\x61\x2a\x70\xa7\x77\x9c\x39\x83\x8e\xa7\xbf\x43\xb5\x4a\x16\xba\xb4\xda\xbe\x43\xb1\x50\xc7\x19\x47\xfd\x34\x0b\x6d\xbe\xa5\x44\x76\x98\xf0\xa3\xff\xd6\x4a\x65\xff\x79\x98\x6a\x25\x73\x7b\x5e\xd4\xdf\xea\xdd\xeb\x3d\xe4\xc5\x85\x92\x8d\x92\x39\x2d\x92\x6c\xd4\x06\xc9\x5c\xb7\xf8\xa4\xd9\xfd\x81\x0f\x72\x3e\x9d\xce\xc7\x61\xab\x17\x84\x01\x1a\x97\xb2\x42\xd6\xe6\xb3\x42\xab\x62\xa2\xd6\x8c\x89\x5a\xad\xc5\xe7\x8b\xe1\xb0\x34\xaf\xb0\xaf\x18\xb6\x15\x43\x50\x5c\x5a\x8c\x34\x4c\x8c\xed\x90\xa6\x36\x21\x4d\x6d\xfb\x89\x02\x28\xcd\xae\x57\x8b\x58\x69\x7e\x39\x32\xbf\x96\xa9\xf3\x9b\x9c\x39\xc1\x8a\xcf\x94\xa7\x78\x70\x62\xdf\x4f\x1a\xab\xcc\xb0\xfc\x37\x4c\x30\x34\xf9\xe1\xcb\x3b\xf8\x2c\x53\xfa\x3f\x46\x46\x90\x36\xfd\x3e\xfe\x35\xb1\xdb\x62\xdb\x8e\x97\x26\xed\x76\x6e\x59\x8e\x79\x87\x62\xb7\x85\xf3\x7d\x8a\xcf\xec\xfd\x6f\x6d\x17\x82\x68\xba\x05\x5f\x66\xde\x07\xb7\x82\x27\xc5\x3c\xbf\x5d\x6d\x88\x2f\x5f\xb5\x7c\xf1\xc2\x85\xb1\xc5\x75\x3d\xfd\x1b\x17\xf7\x37\x57\xf6\x9b\x17\x9b\xfb\x17\x57\x36\xd3\x39\x25\x3d\x37\xf7\xdf\x46\x77\xe7\x48\xd3\x57\x65\xb6\xc7\x73\x92\xed\x0b\x0f\x74\x3e\xd9\x79\xb2\x13\x77\x8a\xac\x36\xde\xd9\x19\xdb\x58\xd1\xd7\x56\x09\xb9\xca\x93\x95\x48\x55\x59\x59\x30\x67\xf1\x2a\x2c\xae\x8c\x61\x8b\x26\xe5\xbd\x5a\xd0\x27\xf7\xf0\x8e\x46\x9a\x46\x6d\x11\x45\x42\x3c\x2a\x33\x72\x8c\xc2\x70\x68\x54\x6e\x64\x21\xe7\xb6\xd2\xcc\x22\x44\x22\x61\xe9\xa3\xac\x14\x84\xe8\x89\x0b\x07\xa5\x3d\xdf\x22\x93\xf1\x4c\x4a\x8e\x7c\x8d\xda\x52\xe9\xf2\xaf\x9e\xd0\x18\x9a\xd6\xa2\xae\x94\xab\x15\x90\x0f\x1c\x8d\x75\x57\x98\x0d\x39\x0d\xe1\x59\x2b\x97\x2c\x2e\x0f\xcd\x2e\x0b\xe8\x54\xde\xaa\x85\x95\x65\xb1\xd6\x15\x2d\xeb\xee\x6e\xf3\x95\xad\x7d\x62\xe3\xf2\x5d\x8b\x83\xd1\xfe\x07\x97\x4d\x6f\x8d\xa9\x3b\xd1\x6f\xaf\xae\x2a\x37\x6f\x8f\xac\xac\x72\xd6\xcd\x99\x5f\xe8\x0d\x1b\xb4\xd9\x82\xb5\xb4\xb4\xc4\xdc\x7e\xe7\xd2\xd0\x44\x83\xcd\x9e\xd7\xcc\x46\x5f\x81\xdd\x9a\xe3\x34\x50\x14\xc5\x6a\x38\x76\x84\x35\xf2\x3a\x8c\x51\x41\xbc\xaf\xba\x7e\x55\x4b\x30\x18\xbf\xb1\x39\xb6\xa6\x29\xeb\xd1\xbc\xf8\xea\x46\xa5\x91\xa6\x74\xbe\xe0\x99\xd5\x54\x6b\x73\x65\xaf\xac\xc9\x69\xa9\x09\xa8\xe9\x6d\x34\x6b\x2b\xa8\xf1\xeb\x9b\x56\xdc\x3a\xb7\x75\xdb\xb4\x66\x1c\x00\x81\x2d\x7d\x0b\x6e\xa7\xdb\xc1\x66\xf0\x82\x38\x28\x4a\x6b\xba\x6e\xdd\xaa\x8d\x58\x87\x37\x2e\x6b\x11\xac\x1b\x85\x4b\x29\x98\x6a\x17\x22\x1b\x23\xc2\xc6\xf6\x14\x3d\x67\x61\xcc\xdd\x75\xf3\xb9\x9b\x2f\xdc\x7c\xe9\x66\x3c\x74\x33\x2c\xbd\x19\x72\x37\x43\x36\xd8\x32\x47\xd4\x09\xf1\x39\x56\xeb\xe2\xc4\xfe\xf6\xc7\xda\x11\xd7\x0e\x55\xed\xed\xab\xe2\xeb\xd8\x76\x20\xf2\xe6\x38\x10\x59\x5d\x1c\xf4\x6e\x04\xb8\x27\xa1\x5b\xc5\x57\x84\x12\x8d\x57\xe3\x09\xbf\x55\x59\xe2\xc8\xa8\x4d\x96\x3b\x11\x14\xfd\xf4\x68\x43\x18\xda\xc3\xa1\xd1\xde\xe4\x44\xcf\x92\xb2\xd4\xc9\xaf\xad\x35\xfc\xc6\x65\x0a\x4c\xb3\x02\xeb\xf5\x8d\x60\xb2\xd3\x29\xf8\x75\x13\x40\xe7\xa5\xd5\xf1\x0b\x96\x92\x92\x62\x53\xf5\xf2\xa6\xc0\x54\xe0\xd6\xfc\xe5\x61\xce\x90\x5d\x5b\x54\x7e\x43\x72\x89\x7f\x76\x4c\xaf\xce\xce\x2f\x32\xf9\x96\xae\x1e\x88\x2e\xdb\x2c\xda\xb3\x3b\x0f\xde\x54\xbd\x7a\x41\xd1\x5d\xf7\xec\x5e\x39\x89\x00\x8b\x6e\x98\x65\x2b\x2b\x2d\x32\x6e\x8f\xac\xaa\x72\xd6\xce\x99\x4f\xb7\x93\x05\xb2\x04\x23\x5e\x43\xd9\xdc\x65\x95\x13\x50\xaf\x9e\x86\xe6\x2d\x9d\x65\x06\x67\xd0\x66\x0d\xd8\xf5\x98\xc2\x56\xd3\xa3\x1a\x4e\xc3\x60\x8c\x4b\x62\x9d\x05\xe1\xe5\x2d\x85\xa6\x10\x01\x80\x4d\xc0\xc5\xdc\xd9\x2a\x77\x5d\x75\xb9\x25\xb3\xf4\x72\xcf\xb5\xcc\x2b\x6d\x64\xe0\x03\x8a\x7e\x2e\xe1\x8f\x31\x32\xf0\xd9\x69\x1c\xf9\x26\xe0\x01\x05\xa0\x4d\x2c\xcf\x75\xf4\x80\xfe\xd0\x85\x10\x3c\x1f\x82\xbb\x42\xb0\x29\x34\x10\x42\x39\xce\x1e\xcd\xda\x42\x67\x5f\x5b\x0e\xe4\x72\x4e\xe6\x5c\xcc\xc1\x84\x4b\x31\xc5\x51\x66\x05\x1f\x3d\x55\xe5\x3f\x73\x95\xfd\x37\xf1\x28\x96\x60\x7a\x70\xaa\xc8\xe7\x91\xcb\x47\x17\x8f\xed\x5b\xff\xbd\x0d\x51\xe6\xda\x11\xa6\x76\xc3\xf7\x36\xdd\xf8\xf8\xc6\x06\x15\x5e\xad\xaa\xbb\xf1\xbb\xe8\xa3\x19\xfa\x9e\x1b\x5e\x4f\xff\x71\x8c\x8d\xed\xfd\xf9\xed\xb7\xff\x7c\x6f\x8c\x3a\x32\x67\xd7\xe9\xad\x5b\x4f\xef\x9a\x33\xa1\xf1\x4f\xf8\xca\x4c\xc0\x09\xfc\xa0\x4d\x8c\x78\x6d\x71\xd0\x15\x10\x03\x17\x02\x97\x02\x98\x0b\x40\x8f\x3d\xae\xe9\xcc\xb6\x27\x3e\xf5\xc0\xa7\x3c\x2f\x7a\x10\xe7\xf1\x7a\xc2\x1e\xcc\x78\x3c\x66\x57\x82\xe3\x67\x12\x45\x4e\x54\x6d\xbe\xf8\x1a\x6d\x56\xb9\x07\xc1\xf2\xaa\x6a\xbf\x07\x9a\xa4\x24\xbc\x04\x4e\x97\xf7\x94\x3e\xa7\x03\xf7\xdf\xad\x19\xfb\x99\xfa\xbe\xfb\xf6\xdf\x6d\x40\x8d\xfa\x7b\xa6\x2b\x7b\xce\x7f\xf0\xdd\xb1\xf7\x9e\x7b\xee\xb9\xe7\x70\xf3\xb1\xe3\xc7\x8f\x65\xee\x27\x11\xfd\x2a\x70\x83\x6e\xb1\x80\x65\xb4\x7a\x78\x55\x0f\xf5\x7a\xd5\x41\xc7\x05\x07\x72\x38\x3c\xc0\x03\x87\x3d\x50\x7e\xe8\x36\x4f\xca\x33\xe4\x61\x58\xb5\x8a\xf4\x2e\xa9\x40\x9f\x95\x52\xab\xb0\x9e\x21\x8d\xcc\x91\xa6\x48\x93\xa2\xc6\x28\x93\x52\x90\x98\x7c\x90\x08\xab\x49\xcb\x40\x52\x63\x59\x58\xcd\x34\xe1\xf8\xa8\x43\x39\x95\x85\x39\xc6\xf4\x07\xef\xa4\x1d\xaf\xc3\xbc\xac\x12\xc1\x50\xe8\xbc\xdf\xdb\xb0\xa0\x7f\x7e\xa0\xd9\x69\xab\xa4\x8b\x73\xe3\xfd\xb3\xaf\x7e\x42\x8f\x5c\x5b\xd9\x73\xb2\x6d\xd1\xcb\x2b\x11\x18\x7c\x7c\x55\x48\xaf\x7a\x54\xad\xcf\x70\x90\x18\xa8\x76\xe0\x05\x9b\x5e\x04\x9e\xf1\x2f\x45\xab\xc6\x10\xf7\xaa\xa4\x3f\x3c\xac\x4f\x2f\xc4\x59\x16\x5c\x22\x47\xed\x25\xd1\x49\xe2\x16\xff\x59\xff\x79\xff\xa7\x7e\x9c\xf0\x43\xce\x1f\xf6\xb7\xf9\x31\x4b\xf8\x0c\x45\x1d\xf0\xb0\x5e\x8b\xb3\xcd\xc4\x41\xb9\x78\x32\xda\x14\x89\x64\xf2\x7f\x72\x2c\x48\x23\x0a\x45\x22\xa1\xd0\x24\xbb\x21\x9e\x32\x18\x69\x6f\xe3\xc0\xcb\x6f\x69\x7d\x5e\x27\xcd\x50\x66\xbb\x43\xdd\xe9\xa8\x9c\xb3\xac\xde\x99\x2d\x68\x83\xc6\x70\xad\xfd\xd2\x9f\xa9\xd6\xb1\x63\xfe\xf5\x37\xad\x74\x38\x52\x1b\xfb\xfd\x50\xec\xdd\x3a\xdb\x4e\xd3\xfb\x30\x9d\x58\x76\xed\xa2\xdc\x57\x45\x23\xf6\x16\x63\x10\x11\x7e\x02\xb8\x81\x3a\x0d\xdb\x09\xe3\x0e\x91\xda\x3e\x3d\xfe\xad\x53\x65\x59\xaa\xe9\xba\xd6\x64\x0e\x18\xbf\x31\x88\x8a\x95\x7f\x93\x50\x58\x7a\x7c\x32\x4b\xcf\x23\xa7\x2a\x7c\xc0\x3a\xa5\xba\x86\xc1\xce\xb4\x59\xdd\x4d\xf6\x64\x1e\x68\x05\x7f\x27\x6a\x40\x8f\xa7\xa6\x35\x1c\xae\x2e\xc8\x97\xe6\x22\x90\x9f\x2f\x02\x91\x17\xd1\x15\x11\x7a\xc5\xb0\xd8\x24\x62\xe0\x81\x1e\xd1\x23\x6a\xaa\xaa\xf9\x0b\xd5\x97\xaa\x51\xb5\x1c\x0a\x6a\xe3\xd5\xd5\x0b\xb8\x05\x90\x5b\xe0\x5d\x10\x5e\xd0\xb6\x60\x68\xc1\xd9\x05\x17\x17\x7c\xba\x40\xc5\x9a\x7b\x34\x6b\xe7\xd7\x84\x5b\x5b\xf3\x9b\x13\x0d\xae\xaa\x7c\x2e\x90\xe2\x28\x47\x66\x33\x4b\xd6\x22\x64\x70\x96\xbd\x4a\x52\x52\xf3\x8a\x51\xa9\xbd\x11\x38\xef\x2b\x32\x97\x24\x3f\x7a\xfd\x5d\x3e\xb3\xf7\x21\x77\x0a\xb1\xf2\xf4\xa6\xb8\x26\x48\x7b\x17\x1c\xfa\xe8\xc1\xc3\x97\x1e\x8e\xc5\x1e\x1e\x7d\xec\xe0\x47\xdf\x59\x70\x2d\x10\x5e\x79\xa8\xbf\xff\x50\x5f\x49\x49\xdf\x23\xfd\xeb\x1e\x5d\x19\xa6\xe6\xfc\xf4\x03\x7d\x96\xc3\x44\x31\x94\xcd\x95\xa5\x7d\xf3\xe5\xf4\xa2\x2c\xb1\x73\x4b\xa2\x62\x81\xcb\x22\x06\x4a\x5b\x2a\x72\xb9\xe8\x75\xdd\xc3\xcc\x76\x89\xdf\x8f\x7d\x37\x7f\xd9\xb2\x25\xd9\x8e\xce\x95\xbd\x7e\x74\xc3\xd5\xbc\xc5\xbb\xbb\xcb\xb4\xcc\x83\x34\x6b\x2b\x12\x0b\x8e\x92\x1a\x79\xda\xac\x5a\x44\xf5\xf2\x32\x47\x12\x0b\x56\x50\x03\x00\x00\xe1\xc7\x08\x9d\xa6\xcc\xa7\x7c\x61\x85\x24\xa9\x52\xd6\x4b\xde\x43\xbf\xca\x94\x01\x2f\x68\x02\xed\x62\xa4\xb4\x07\xf4\xcf\x3a\x35\xeb\xb5\x59\xe8\xe0\x2c\x88\x4a\x67\xed\x9a\x85\x7c\x3d\xfc\x5a\xd1\x61\x87\x5a\x3b\xa4\x54\x66\x15\x62\x6b\x2a\xeb\x52\x2e\xbb\x05\xe7\xe7\xa6\x54\xb4\x96\x6c\x4f\xd2\x54\xa6\x90\x24\x92\x62\x50\x6a\x0a\x59\x22\x2b\x17\x56\x14\x9c\x9c\x5c\x54\x91\x39\xfa\x6c\x13\x0a\xca\x84\xe9\x99\xfc\x98\x01\xd3\xaf\xce\xdb\xff\xfa\x1d\x86\xd6\xea\xba\xb8\x7e\xf7\x9b\xfb\xe6\xce\xdd\xf7\xe6\x6e\x7d\xbc\xae\xba\xd5\xb0\xe3\xf5\xfd\xad\x57\x87\x8a\xbb\x86\x96\x08\x73\x2a\xcb\xe6\x0a\xed\xbb\xba\x8a\x8b\xbb\x76\xb5\xf3\x2d\x65\x95\x73\x84\x25\x43\x5d\xc5\xe8\xa3\xef\x5c\x3b\xb7\xd3\xd6\x54\x55\xd5\x64\xdd\x79\x2e\x7d\xe8\xd0\xd5\xb3\x3b\x6c\x4d\x65\x91\x06\xdb\xce\xb3\x57\x0f\x6d\x39\xf7\xd0\x2a\x4b\x69\x30\xbf\xc4\xb2\xea\xa1\x73\x5b\x6e\x39\xfb\xd0\x2a\x6b\x79\x41\x41\xa9\x75\xe5\x83\x67\x65\x2e\xc2\x07\xa9\x1f\x52\x23\xc0\x0b\xaa\x41\xc7\x4f\x8a\xe2\xa0\x2b\x1a\x25\x98\x63\x73\x3c\x4a\x70\xe5\x6a\x5d\xdc\x17\xe7\x3b\x6b\xa6\xce\x46\x79\xb8\x32\xe1\x42\x16\xae\x20\x18\x48\xa8\x68\xad\x55\x9e\x8e\x19\xf3\x11\x0a\xfd\xb7\xb3\x61\xcd\x4c\x06\xac\xac\x08\x66\xe6\x02\x52\x3f\x8c\x6e\x78\x2c\xa5\xae\xaf\xa9\xad\x53\x25\x1f\xbb\xa9\x21\xba\xf1\xc8\x2a\x55\x5d\x6d\x75\x83\xba\xe7\xf0\xa6\xfa\x6b\x77\x0d\xec\xd0\x46\x2b\xca\xa3\xba\xed\x9b\x6e\xba\x4d\x17\x2d\xaf\x88\x6a\x77\x0c\xa0\xbc\x5b\xcf\x3e\xd0\x6d\x8c\x96\x14\xd7\x18\xbb\x1f\x38\xb7\x6d\xeb\xd9\xfb\xbb\x8d\xd1\x82\xc2\x5a\x63\xcf\xfd\x2f\x6f\x7d\xe6\x1d\x6f\x91\xcf\x57\xe8\xfd\xd5\x8f\x9e\xfa\x85\x2f\xe4\xf3\x15\x7b\x7f\xa1\x9c\xa3\x6c\xa5\xaa\x01\xcc\x05\x3d\x60\x13\xf8\x9d\xf8\x50\xb5\x39\x87\x32\x53\xe6\x1c\xec\x9e\xd5\xa3\xeb\x1f\x00\x03\xfc\x00\x02\x03\xbe\x81\xc4\xc0\xae\x81\x83\x03\x47\x07\x2e\x0c\x5c\x1a\x50\x15\xf7\xb8\xd7\xde\x74\xc3\xba\x58\x6c\xc5\xba\xc5\x62\x7b\xa2\xbd\xaf\x1d\xb7\xb7\xa7\xc0\x3a\x7e\x9d\x6f\xdd\xae\x75\x07\xd7\xd1\xec\xba\x4b\x0b\xe1\xc2\xb3\x9d\xe7\x3b\x51\x67\xfb\xa7\x2d\xb0\x25\x16\x6b\x6b\x87\xed\xed\x7d\x1b\xce\x6d\xb8\xb0\xe1\xd2\x06\x6a\xc3\x40\x6a\x28\x75\x32\xf5\x69\x8a\xe2\x53\x30\x55\x5e\x9f\x12\xcc\x43\xd5\x07\xaa\x51\xb5\xc8\x6a\xe2\xd5\xd5\x36\xc1\x94\x8b\x71\x3e\x48\xf9\x59\x8a\x54\xf5\x22\xa4\x76\x24\x85\xd1\x32\x1b\xce\xaf\x92\xe5\xe1\xc1\x08\xff\x4e\x92\xff\x28\xf9\x4e\x92\xc0\xce\x22\xe1\xe4\x3b\xfc\x3b\xe5\x61\x21\x2a\x59\xe2\xe0\x94\xf0\x8b\x00\xad\xaf\x57\xf4\xfb\xab\x35\xbf\x46\x54\x3d\x49\x26\x8f\x2d\x01\x59\xca\x2e\x0b\x06\x2a\x65\xce\xc1\x08\x6d\x26\x7c\xbf\xd2\xb7\xc9\x97\xac\x74\xd3\x8c\xb2\x60\xff\xb1\xb9\xb1\xa3\xfd\xdf\x50\x15\x2c\xec\x5c\x34\xdb\x66\x9b\xbd\xa8\xb3\x50\x29\x0c\x62\xbe\xf3\xe0\xed\xab\x0b\x4b\x6a\xef\xba\x63\x53\xed\xe6\x6d\x77\x2d\x4a\x7f\x7a\xdb\xf6\xfa\x1a\x6f\x8e\xb7\xbc\xa4\xae\xf9\x6b\x65\xc3\xc2\xa2\xa2\xc2\x6f\x28\x1b\x9a\x02\x61\xb7\x3b\x1c\x30\x65\xca\x86\xe8\xc4\xee\x9c\xc2\x9c\xe2\x4a\x3e\xb0\x61\x4d\x4e\x61\xce\x3f\x2f\xbc\xc5\xbb\xc0\x5a\xec\x30\x19\x79\xa7\x3b\x37\xd8\x22\xc7\x1c\xf4\x45\x56\x05\xe6\x80\xe5\x60\x23\x78\x4e\xdc\xd0\xd7\x3f\x77\x6e\x77\x7f\x9b\x98\x48\x24\x50\x22\x91\x1c\xe8\x7f\xb2\x1f\xf1\xfd\xb0\x3f\xc7\xa2\xad\x6c\xc2\x58\x5b\x14\x6f\xea\xba\xc9\x13\xd7\x76\x6e\x02\xf3\xe1\xfc\x8b\x1d\xb0\x23\xc1\x35\xc3\xe6\xb9\x73\x07\x12\x30\x91\x00\xeb\xe1\xa5\xf5\x57\xd6\xa3\xf5\x5c\x72\x28\x89\xd8\x64\xd8\xb5\xb8\xc2\x6a\xad\xe5\x79\x7f\xc1\x62\x80\x73\x44\xde\x12\xcf\x91\x62\xeb\x9c\x1c\x46\xa6\xc0\x0b\x87\x42\x11\xd2\xbd\x4b\x4a\xb7\x44\x3d\x70\x50\x5e\xe1\x41\x69\x85\x07\xa5\xdd\xa4\x10\x01\x13\x72\x79\x3b\xe1\x35\x9c\x58\x71\x19\x53\x36\x49\x7f\x36\xc9\x30\xaf\x88\x33\x56\x67\x08\x02\x66\x42\xcd\x4c\xdf\xb4\xb0\x55\x95\x15\x25\x94\xbc\xae\x14\xbf\x78\x53\x28\xb4\x3e\x91\x7a\x6a\xa8\xb5\x69\xd3\xc3\x1d\x5e\xb1\xbe\xc2\xdc\x24\x14\x84\x42\xc6\xcd\x37\xde\x7f\xf7\xbc\x5b\x0a\xac\x65\xd1\xd9\x05\x77\xdd\x77\xe3\x66\x63\x28\x54\x20\x88\xe6\xca\xfa\x26\x5f\xc7\xc3\x9b\x9a\x5a\xef\x7c\xaa\x36\xb3\xaa\x7b\xef\xb8\x29\xba\xf9\x36\x79\x55\xb7\x70\x16\xa7\x85\x93\x96\xd5\x1c\xf0\xf9\x02\x19\x14\x8c\x9a\xb7\xea\x48\x09\xe3\x97\xef\xbe\xfb\x6a\x85\x8f\xf7\xd8\x0d\xaf\xbe\xfb\xee\x2f\xa7\x61\xdb\x0e\xbd\xbf\xbf\x89\x79\xfa\x5b\x39\xa1\x9c\x92\x0a\x21\xb0\x71\x62\x3d\x0b\x22\x7a\x4e\xa7\xe1\x6c\xc6\x60\xb0\x45\xbe\xfb\x22\x35\x76\x96\x02\x7a\xb0\x04\x7c\x57\x5c\x15\x30\xc6\xba\x23\xaf\x37\xc3\x43\xcd\x27\x9a\xd1\xfe\x66\xd8\xdc\x1c\x6a\xeb\x71\x02\x3d\xd0\x87\x9c\xfd\x4b\xc1\x52\x7e\x29\x02\x4b\x7d\x4b\x13\x4b\x37\x2f\xbd\xb0\xf4\xd2\x52\x86\xad\xef\x09\xad\xed\x98\x3b\x77\x96\xa1\x3a\x55\x2a\x54\xa8\x29\x0a\xec\xd2\x30\x4d\x68\x08\x9d\x47\x17\xd1\xa7\x88\x46\x15\x96\x52\xaa\x35\xe0\x53\x1b\xe2\x81\x59\x29\x6f\x50\xae\xbf\x87\xa4\x45\x0c\x27\x23\x11\xe7\x3b\xd1\x30\xb9\x0e\x98\x5a\x89\xcf\xb4\x55\x4e\xab\xc7\x5b\xd8\x40\x5e\x40\xf9\xa8\xfc\x7f\x50\x9d\xbf\xb7\x3d\xbb\xfc\x74\x59\xa0\xec\x74\x79\x76\x02\xbb\xff\x2f\x4a\xf5\x2c\xe5\x7a\xa6\xbf\xbf\xbf\xff\x19\x57\xda\xff\x7f\x53\xb4\x97\x6b\x50\x9f\xd3\xc7\x81\x1e\xd4\xc2\x80\xa8\x97\x66\xbd\x90\x7b\xb1\x14\x7e\xab\x14\x86\x95\xca\x7d\xad\xf4\xd9\xe4\x22\x9f\x49\xe5\xfe\x29\x03\x34\xf0\x26\x57\xdc\xc0\x6b\xb8\x78\xa9\xcb\x5d\xb1\x36\x0b\x66\xb9\xa5\xef\x2e\xe1\xdc\x5e\x77\x93\x1b\xb7\xb9\x07\xdc\x43\xee\x27\xdd\x67\xdd\xb4\xdb\x5d\x51\x1a\x0e\x1c\x0c\xc0\x2d\x01\xb8\x21\x00\x73\x02\x15\x01\x54\x6b\x30\x1f\xac\x80\x39\xe6\x0a\x73\xb3\x79\x8b\xf9\x11\x33\x1d\xa8\x30\x9b\x2b\x02\x98\x2b\x88\x81\x42\xbe\x10\xb1\x85\x85\xf5\x7c\xbd\xaf\xbe\xb4\x1e\xf3\x9c\xf4\xbe\x95\x9c\xb2\xca\x1c\x1a\x42\x07\xd0\x93\x88\x42\xa2\xd9\x16\x47\x15\xa2\x25\x2b\x5e\xe1\xd3\x99\xe3\xae\x0a\x0f\x36\x14\xb8\x39\x2e\x60\x0e\x9a\xab\xcc\xc8\x5c\x6a\x20\x57\xea\x72\x6d\xdf\x68\x8b\x86\x42\x92\x93\x96\x17\xff\x6b\x65\xfe\xb0\x14\xf4\x2a\x75\x9d\x88\x20\x6d\xe2\xc1\x9a\x48\x72\xdf\xb9\x73\x30\x14\x4a\x86\x42\xa1\xa4\x94\x26\xcb\x0a\x65\xd3\x6c\x02\xff\x4d\xf5\x7f\xea\x4c\x66\xdd\xcb\x02\x09\xea\x6f\xc7\x02\xd0\xc7\x33\xab\xfc\xd5\x8a\xff\x73\x5c\x00\x94\xe2\x5e\xc2\x7b\x16\x00\x1d\xa2\x4d\xe8\xe6\x78\xc8\xf2\x22\x67\x8c\xf3\xbc\xfd\x8c\x0f\xf6\xf9\x36\xfb\x90\x4f\x8a\x23\x9c\x8c\x26\xee\xf3\xe5\x9e\xcc\x85\x74\x8f\x7d\x6d\x8e\x1f\xa4\xb2\x28\x4e\x93\x32\x99\x78\x17\x68\x22\x57\x46\x32\xa2\x26\xc3\x75\x46\x08\xf9\x26\xf5\x7f\x64\xfc\x3c\x91\x3b\x9a\xc9\x75\xb6\xe1\xd9\x1d\x73\xea\x6e\x1d\xbe\x35\xab\x38\x3f\xd7\xf2\x12\x3f\x93\xe4\x6c\xf1\xe1\xdf\xed\xbf\xff\xc3\x43\x8b\x28\xb5\x5e\x3d\xb6\x0a\xfe\xe3\xc6\x37\xa0\xe5\xe9\xa9\x24\x67\x50\x8a\x1d\x09\x46\xd0\x0b\x1a\xc5\xdc\xac\x98\x5b\x34\x08\x71\xb7\x9b\xd2\xf9\x53\xfe\x21\x3f\xe2\xfd\xd0\x12\xa7\x3a\x7d\x2e\xfb\x62\xaf\xd5\xed\x32\x2e\xd6\xab\x79\x85\x25\x5b\xa1\x5b\xe0\x7f\x2d\x44\x89\x16\x17\x35\x13\x11\xa8\xf8\x5f\xe9\xc1\xe1\x7f\x4c\x87\x03\xd6\x39\x9e\x38\xf8\xe0\x23\x8d\xeb\x02\x2f\x18\x67\x02\x01\x25\x07\xe8\x32\x8f\x75\xc3\x7f\x94\xeb\xd4\xeb\xc6\xbf\xa2\xb6\xd3\x1a\x60\x82\xb9\x62\xbf\x5e\xc8\x12\x90\x1e\x66\x41\x84\xb4\x46\x2d\x42\xac\x91\x45\x2c\x2f\xe8\x4c\x46\x2d\x80\x2a\x8c\x58\x8a\xa3\xf4\x82\x4e\x63\xd4\xaa\xa1\x8a\x41\x2c\x6d\xa0\xf5\xbc\xa0\x13\x34\x26\xa3\xd6\xa8\x06\x50\x05\x19\x8c\x58\x44\xd1\x3a\x2d\x82\x06\xae\x0d\x42\x51\x0b\x69\x2d\xe4\x38\xa8\xa5\x29\x63\x9f\xb0\x59\xb8\x22\x60\x72\xcb\xbf\x90\xd5\xc4\x05\x15\x2b\x58\x7c\x96\x52\x0b\xc2\x0c\x50\x53\x2c\x84\xc8\xa4\xe1\xf5\x94\x56\x10\x8c\x14\x0b\x59\x56\xa5\xd5\x42\xad\x56\x37\xac\x3b\xa7\x43\x9c\xd1\x6b\x44\x40\xc5\xab\x10\x32\xaa\x74\x3a\x95\x11\x51\x14\x67\x10\x59\x7d\xdc\x40\x53\x20\x1c\x09\x87\x94\xdb\xe8\xb0\x9c\x01\x0e\x2a\x1f\x46\x5b\x54\xfe\x13\x4a\x5f\x2d\x97\x36\x51\xe6\xc7\x04\xb9\xb0\x17\xe1\xf7\x9d\x3b\x37\xfd\x43\x75\x4e\xfe\xdf\xe4\xdf\xca\x4a\x01\xb9\x7c\x82\x34\x9b\x8b\xf3\x4c\xb9\xd5\x34\xf9\xb0\x61\x9a\xcd\x45\x0b\xa0\x3b\x96\xfe\xfd\xa9\xdd\xa7\xd2\x1f\xb7\x40\xef\x1b\xe9\x7f\x89\xc1\xac\x91\xa1\x11\xe8\x6d\x4d\x7f\x0c\x87\x4f\xec\x38\x9e\x7e\xb3\x15\xd6\x1d\xdf\x71\x1c\x76\x1f\xdf\x79\x1c\x46\xe7\xa5\x5f\x3b\xbe\xe3\xb8\xcc\x6d\x43\x1d\xc0\xc3\xf4\x69\x60\x01\xb3\x7f\xc2\xf9\x58\x4d\x1c\x4b\xd9\xaf\x87\xd5\xc4\x75\x46\xa3\x0d\x00\x86\x67\x7c\xcc\x41\xe6\x28\x43\xb3\x0c\x63\xe5\x38\x2d\xc0\x18\x80\x70\x79\x98\x9c\xcf\xa4\xf1\x2c\x22\x44\xc2\x11\x20\x25\xba\x70\x42\xd8\x3a\xe2\x6f\x94\x91\x90\x4c\x00\xde\xcb\x14\x95\xd6\xe4\xab\x6d\xb9\x59\xf0\x15\xba\xb8\xb4\xa6\x30\x14\xa5\xfe\x54\x14\x89\xd4\xb8\x73\xad\xea\xe2\xb2\xf2\xaa\x68\x81\x6c\x0b\x9f\x53\x1f\xe3\x8b\xf4\x6f\xa5\x67\x11\x85\x5d\xaa\x83\x2a\xa4\x52\xd9\x80\x99\x37\xfb\xcc\x98\x35\x4b\xab\x66\xd4\xf3\x71\xb3\xd9\x6a\x31\x9b\xd5\x06\xf1\x2c\x0d\xe9\x5d\x6a\x10\x76\x7e\x94\x74\xbe\x23\x44\xc2\xef\x10\xca\xbb\x09\xe1\x09\xf9\x92\x8d\x9c\xfe\x24\x38\x08\xc1\x4a\x88\x16\xdd\xb5\x6d\x73\xed\xa6\x3b\xee\xaa\x2d\x29\x5c\xb3\xfd\xc1\xa5\x3c\xbd\x36\x27\x94\xb3\x66\x63\x40\xa8\x28\xc9\x09\xe5\xec\x96\xb5\xb6\x47\xa9\x0f\xd0\xbb\x4c\x25\x10\x80\x4f\x34\x6a\x0d\x4d\x4c\x1b\x83\x18\xd0\x84\xdb\x70\x0a\x63\xcc\x81\xf0\xaf\x92\x30\xfc\x4e\x92\x1c\x71\x13\xc2\xbc\x16\x33\xc9\xeb\xe1\x68\x73\x5d\xb8\xdc\x9b\xeb\x8d\xd6\xdf\x7e\x1b\x3d\x12\x6d\x09\x06\x5d\x4e\x41\x30\x39\x4a\x2c\x0b\xbc\xb7\x4c\x7f\x7f\x93\xf4\xfe\xac\x2c\x33\x8c\x0d\x4d\x42\x9b\x90\x12\xb0\x80\xe5\xf7\x8f\xbc\x93\x54\xfa\x9a\xe5\x50\x54\x09\x59\xd0\xbb\xb7\xdd\x5e\x1f\x9d\x88\x32\xe8\x11\x29\x44\xb0\x94\x38\xa6\xc7\x08\x2a\x50\x90\x7e\x85\x7d\x85\x7e\x90\xe4\xec\x75\xa0\x0d\xdc\x00\xb6\x81\x7b\xc1\x93\x00\x40\xf9\xd2\x91\x0d\x28\x82\x16\x78\xc6\xeb\x99\xdf\xf7\xff\x3f\xfe\x3e\x35\x80\xed\x39\x25\x0e\x4f\xd8\x6f\xc6\xf3\xe9\xd5\xfd\x65\x0b\xab\x3c\xb8\xed\x3a\x5f\x83\x9f\x63\x5b\x4e\x89\xc3\x1b\xf6\x9b\xf0\x02\x7a\x8d\xfc\xc5\xab\xe1\xeb\x7c\x91\x2a\xfb\x9b\x7f\xf2\x0a\xb6\xe7\x14\x4b\x5f\x24\xbf\x68\x5d\xd9\x82\x2a\x2f\xfe\xaf\x9f\x5d\xef\x27\xcf\xbb\x03\x26\x86\x36\x06\x3c\xdd\xeb\xdc\x91\x78\xe8\xbf\x3e\xcb\xbc\x5e\x7e\x63\x56\x24\x16\x82\xd6\x89\xef\xdf\x98\x15\x89\x87\xa6\xbf\xc2\x1f\xfe\xb5\xef\xa6\x1d\x93\xef\x2d\xbd\xd7\xf4\x57\x99\xf5\x1b\x62\x77\xd2\xef\x92\x3e\x92\x20\x88\x00\x11\x2c\x04\xdd\xa0\x1f\x00\xda\x66\xc0\x6c\xa0\x11\x57\xe3\xbc\x46\x5c\x1d\x31\x60\x16\x56\x7b\xb0\xcd\x52\x82\xf3\x68\xb6\x04\xe7\x55\x7a\xb0\x0d\x56\x37\x62\x42\x0b\x00\x59\x03\x96\x82\xe2\x6a\x9c\x57\x82\xf3\xa4\x9f\x83\x36\x0f\x96\x1c\x78\x1e\x55\xad\xd5\xb8\x7d\x01\xe3\x4a\x8d\xc5\xc8\xd3\x75\x53\x5f\xa0\x80\x21\xb8\xb4\xab\x2b\xaf\x30\xd9\xd3\x95\x7b\x75\x9d\x21\x6f\x69\x57\xa7\xfc\x02\x9f\x40\xd9\x89\x8e\xce\xfc\xb9\xb9\x6d\x8b\xe6\x79\xae\xfd\x3b\x0a\xb4\x4d\xbc\x0a\x09\xe6\x82\xbc\x1c\x6e\x8e\x2d\x52\x51\x6e\xc3\xeb\x05\x73\x7e\x5e\x2e\x37\xc7\x56\x51\x51\x6e\x0d\x4c\x79\x0b\xea\xf0\x94\x37\x4f\x5b\xbf\xf1\x21\xe0\xd3\xbc\xb9\x20\x2f\x97\x6b\x96\xde\xcf\x7a\xed\x3b\x53\x5f\xa1\x7f\x92\x1e\x63\x69\x7e\x8b\xfc\x18\x9f\x48\x8f\x91\x79\x05\x10\x78\x2b\x3d\x44\xbf\xcb\xae\x03\x2e\x50\x06\x9e\x17\xe3\x6e\x77\x69\x10\x5e\x08\xc2\x93\xc1\xf3\x41\xe4\x0b\x96\x06\x77\x05\x71\x30\x68\xd3\x38\x9c\x4e\xbb\xcb\xc2\x82\x6e\xdb\x9a\xc8\x85\x08\x3c\x19\x81\xbe\x48\x69\x04\x99\x54\xba\x6e\xf5\xea\xf2\xe0\x93\x6e\xe8\x16\x19\x75\xdc\xed\x2e\x7a\xc0\x4f\x3b\xaf\x9a\x4e\x8f\xff\xdb\xf3\x66\x7b\xdc\x24\x39\xc8\xa0\xc6\x14\x67\x4c\x56\x53\xd0\x84\xd5\x26\x5b\x0a\x18\x19\xbb\xd9\x1e\x67\x7c\x1a\x53\x5c\xcd\x38\x98\x02\x06\xb3\x8c\x55\x43\x38\xdc\x7a\x93\xa1\x50\xd3\x28\xa9\x9b\x49\xc7\xaa\x74\x00\x28\xed\xc2\xc9\x24\xff\xf9\x68\x79\x79\x24\x22\xc5\xd3\x72\x17\xfa\x60\x24\x4c\xd0\xca\x0a\xab\x98\x10\x11\xcc\x06\xa4\x90\x8d\x45\x70\xc0\x84\xe5\x16\xbb\xbc\x88\x9c\xc1\x56\x53\xab\x69\x8a\x62\x54\x63\x65\x1f\x3c\x0b\x31\x86\x14\x66\xd1\xaf\xde\x7f\xf5\xc0\xef\x4e\x3c\xc1\x94\x25\xef\x5f\xdd\x7f\xdf\xb2\x42\xea\x69\xca\x5d\xbe\xa0\x32\x34\xaf\x3a\x9b\xc1\x8e\x9a\x03\x84\x7f\x4c\x26\x26\x9b\xd3\xec\x25\xbc\x64\x57\xc6\x7e\x0b\x77\xb3\xeb\x16\x6e\x4b\x14\xe4\xb5\x6d\x4b\x44\xe3\x05\xbc\xb1\x28\x46\xee\x93\x9e\x4d\xef\xa1\x3e\x63\x6c\x80\x03\xb9\xe0\x90\x58\xcb\xf3\x94\xb3\xc2\xf9\x6d\x27\x66\x9d\x4e\x2d\xad\x37\x18\x38\x9d\x9a\x57\xdb\xe3\x6a\x04\x5a\xb4\x4b\xf3\x8e\xe7\xbd\x96\xf7\x5e\xde\xe7\x79\xd4\xae\x3c\x88\x40\x1e\x9f\xe7\xcb\x4b\xe4\xf5\xe5\x6d\xce\x63\xb0\x14\x86\xe6\xaa\xed\x71\xac\x62\x5b\xa8\x8e\xa0\x73\x88\x87\x44\x9f\x97\xe7\x7d\x0f\x58\x04\xc3\x55\x35\xa2\x39\x6d\x9f\x8a\x92\x0b\xe8\xa3\x4d\x91\xc8\xf4\xd9\x0a\x91\x3b\x28\x69\xbe\x42\x13\x13\xd6\x9b\x94\xa7\xcb\x44\x66\x8a\xfd\x86\x39\xc2\x07\xb4\x63\xe9\x7f\x7f\x46\x87\xa8\x4f\x5e\xd8\x31\x72\x7b\xec\xba\x33\x93\xe9\x1b\x27\x6d\xe4\xd7\x12\x63\x9f\xc0\x9d\x8c\x6d\xd1\xad\x8b\x0b\xf2\x12\xdb\x12\xd1\x79\xd2\x84\xc4\x2b\x01\x02\x61\x85\x2b\xc7\x0a\xfc\xa0\x5d\x2c\x9a\xc4\x8a\x2a\x40\xd0\x49\xd0\xe7\xfe\x29\x70\x4f\x3c\x03\xee\x39\x01\x7d\x54\x10\xf6\xd7\x85\x78\x4e\x00\xd5\x27\x21\x9e\x70\xf7\x14\x88\xe7\xe1\xc3\x67\x60\x5d\xfa\xf5\xeb\x02\x3c\x9f\x7b\x6e\x2a\xbc\x13\x20\x82\xaf\x77\x30\x66\x82\xef\x5c\x29\xd6\x41\x68\x70\xc7\x54\x5d\x81\x81\xc0\xd9\xc0\xc5\xc0\x78\x80\xc2\xc0\x1a\x33\x0a\x86\x8e\x6c\x4b\x82\xc2\x5c\xc2\x08\x8c\x94\xc8\xe6\xc4\x39\x23\x24\x81\x0f\x4b\x19\x29\xa3\x09\x58\x13\x06\xcb\xe4\x30\x06\x43\x99\x71\xf0\x5f\xbc\x16\x19\xcd\xb4\xd1\x28\x3a\xc4\x33\x11\x9c\xd3\x1b\xd8\x6c\xe9\x4f\x26\x11\x9c\x8f\x3f\x3e\x32\x89\xde\xa4\xfd\xfb\xc7\x3e\x55\x3a\xd9\x0e\xef\xff\xf3\xd5\xdf\x4d\x41\x6f\x4e\x72\x15\x99\x40\x36\xb8\x5b\x6c\x73\xd1\x4e\xc6\x69\x57\x39\x58\x96\x71\x30\x0e\x46\xe7\xe9\xc9\x07\x35\x20\x0e\x30\xe8\xcf\x39\x4f\x24\xad\xb9\x1c\xc8\x98\x75\xdd\xfa\xd5\x01\x87\xdd\x75\xd2\x09\x9d\x4e\x73\x36\x33\x2c\x45\x77\x3a\x5a\x65\xee\x2b\xd5\x8a\x5a\xa4\xd5\xea\xb2\xfb\x0c\x58\x47\x24\xa9\x09\xd1\x52\x34\x2a\xed\x47\x79\x57\x46\xa3\x53\x7b\xd6\x93\x32\x52\x55\x06\x64\x95\x2b\x74\xed\xd2\x26\xb5\xb1\x79\x0c\x29\x7e\xfb\x15\xc2\xa3\xea\xbc\x6a\xf9\xf6\x2f\x04\xa9\x88\x35\x3c\xbf\xea\xa6\xf5\xbb\x93\x77\x1c\x3a\x03\xd7\xef\xfd\xf9\x9d\xf5\x63\x8b\x76\x07\x9b\xbd\x2b\x36\x6d\x8e\x54\x1c\x7f\xf6\x28\xa5\xa9\x1d\x58\xdd\xe9\xfb\xee\xa2\x11\xd7\xd8\x9b\xf4\x48\x74\xd3\xd1\x74\x3f\x4d\xdf\xb5\xe0\x68\xce\x2d\x5d\x0f\xec\x57\x34\x18\x9b\xa8\x5e\x10\x00\x51\x70\xb3\x28\x56\x54\x96\x47\x22\x85\x3e\x8f\xd7\x5b\x1d\xf7\x17\xba\xba\xea\x4a\xeb\x60\x21\xe9\x70\xab\x8d\x54\x96\x87\xb9\x0a\x6f\xc5\x40\xc5\xf9\x0a\x8a\xad\xa8\x08\xe7\x24\x78\x2b\x6f\xe0\xbc\x3e\x1f\xd0\xb9\xfc\x9e\x70\x42\xbe\x9a\x19\x8d\x46\x9b\x8c\xd1\x70\xa4\x29\x43\x91\x64\xcc\x0c\xb4\x9c\x50\xe4\x8c\x46\xc3\xd1\x08\x11\xf8\x8b\x28\xf8\xce\x09\x85\x1c\x45\x30\x4d\xd6\x6b\xb4\xb1\x79\x06\x88\xa5\x23\x3e\x93\xb4\xe7\x55\xdb\xaa\x2a\x2b\x82\xe8\x7b\x75\x7d\x0b\xeb\xad\x3a\x8c\x11\x35\xf2\x88\x53\x65\xad\x5b\xd8\x57\xdf\xfb\xd8\x4d\xf5\xdd\xed\x9b\xd6\x6f\xf5\xce\x6a\x99\xd0\xaf\x14\xfc\xdc\xfa\x4d\x37\x75\x0c\x99\x1d\x45\xb5\xbe\x6c\xaf\xb3\x9a\x4f\x87\x98\xaa\x47\xb2\x1b\x8b\x5d\xf1\x03\xef\xdd\x77\xf2\xb3\xe6\x23\x8b\x4e\xa8\xb5\xf8\xc3\x92\xde\xfb\x7b\x0b\xd6\x3c\xb1\xa1\x1a\xd3\x87\x17\x7c\x6f\xfd\x9f\x2e\xfc\x7a\x42\x83\x9c\xf9\x3d\x60\x41\xb3\x58\x04\xba\x2f\xe2\x4f\xf1\x38\xc6\x8a\x5a\x91\x7a\x58\x7d\x41\x8d\x08\x67\x15\xdd\xcd\xac\x56\x51\x29\xd6\x07\x21\x84\x2c\x66\x08\xbf\x5b\x38\xc9\x2b\xbc\x2c\x44\x02\x6c\x54\xe6\xff\x20\x32\xe4\x86\x61\xa2\x43\x0e\x8b\xd3\xc5\xb2\x14\x79\x86\xef\x85\xde\x0f\x58\x50\x2a\xba\xe9\x98\xc2\xf8\xa2\x46\x31\xdc\xa1\x92\x42\x65\xc4\x30\xb0\x2d\xc3\xf7\x12\x09\x93\xdb\x62\xc2\xba\x9e\xe9\x89\x17\x22\x84\xf2\x05\x9e\x18\xc1\xaf\x5c\x6b\xa2\x5a\x61\x13\x79\xdf\xb0\xa2\xa3\xae\x07\xfb\x45\x8b\x97\x0e\xd3\x88\xa6\x55\x04\x56\x73\x10\x1c\x05\x97\x00\x26\xc4\x80\x52\x5c\x0e\x00\xe7\xe5\x9a\xb8\x27\xb9\xb3\x1c\x85\xd9\x6e\x1d\xd0\x40\x46\xb3\x4b\x75\x4e\x85\x54\xb2\xf4\xb2\x26\xae\x62\xd4\x29\xcc\xe9\xc2\xba\x26\x5d\x9b\x8e\xe2\x74\x4d\xba\x93\xba\x8b\xba\x71\x1d\xad\xd2\xe9\x58\x94\xd2\x63\x96\x58\xba\x02\xf7\x1a\x2d\x87\xe1\x50\xf2\x0d\x42\x98\xac\xc0\x6b\x14\x0e\x5a\x8b\x4c\x40\x4b\x7a\x66\x88\x2a\x3b\x4c\xa4\x87\xcf\x1c\x3e\x4c\x8f\x9c\x48\x5b\x8e\x8d\xed\x44\x7b\x8e\xa1\x07\x41\xa6\x7f\x87\xf0\xe0\xe8\xc1\x4d\x62\x96\x56\x0b\x7c\x4c\xa9\x34\x17\xdc\x66\xee\x28\x77\x8e\xc3\x6a\x7d\x8c\xba\x88\x3e\x45\x88\x48\xc3\x3f\x6f\xb4\xc4\xc9\x78\xfc\x8c\x36\x0e\x74\xb0\x4d\xdd\x46\xa5\x28\x44\x89\x36\x77\x5c\x4b\xb9\x28\xc4\x52\x14\x50\x25\x68\xd2\xbe\xa8\x3c\x27\x81\x86\xc3\x70\x28\xf4\x46\xe6\x39\x93\xc4\xd5\x44\xc8\xc3\xf9\x95\x47\x7d\xf6\xf1\xc7\xd1\x8a\x74\x37\x71\x2f\xa3\xfb\xe1\xa5\x23\xe9\x33\xfb\xd3\x5e\xc2\x73\x07\xa8\xc3\xf4\x08\x08\x82\xb5\xe2\x2c\xb5\x05\xb2\x2c\x4b\x67\xf7\x18\xf3\xcf\xe5\xc3\xa1\xfc\x03\xf9\x88\xcf\x17\xf3\x91\xdb\xad\xa1\xba\xe9\xd5\x79\x59\xbe\x94\xcd\x0d\xfa\x38\x7d\x58\xdf\xa4\xc7\x9c\xbe\x49\x7f\x51\x3f\xae\xa7\x54\x7a\x3d\xad\x4e\x31\x98\x9e\x32\x7b\xa3\x72\xa6\xfc\x9f\xe5\xe7\x08\x9d\xe9\x3f\xc9\xfe\x0f\xf4\x26\x89\x7c\x54\x80\x3c\xd4\xa4\x56\xc3\x04\xc1\x98\x4f\xa8\x28\x41\xf0\x5a\x6e\xbd\xf3\x0c\xfa\xcb\xd8\xab\x59\xb1\xe2\x23\x57\xbe\xdf\xd5\xfe\xd0\x5b\xb7\x96\x2d\x6a\x6e\xf0\x36\x0d\xc5\xe1\xb6\x39\x3b\x9e\x45\x7b\x68\x7a\x6c\x9f\x34\xdd\x5a\x1a\xaf\xf8\xd1\x67\x8f\x3e\xfd\xe5\xb1\x36\x46\x67\xd2\x1d\xb3\xd9\xe1\xa7\xdb\x5f\xbc\x53\x94\xfb\x7f\x34\xf8\x75\x82\x85\x5b\x21\x46\xd5\xd9\x8e\xec\x82\x6c\x6c\x36\x1b\x35\x71\x6f\x2e\x97\xeb\xcd\x45\xa9\xdc\xa1\xdc\xf1\x5c\x8c\xb1\x4d\x88\x19\x3b\x72\x28\xa0\x5f\xac\x75\xba\x9c\x88\x75\x3a\x8d\xd6\x84\x89\x33\x5a\xd8\xc5\x4a\x6b\xa4\x3c\xaa\x4f\x14\x96\x8e\x68\x38\x39\x38\x31\xa4\xe4\x44\x73\xa4\xd2\xe1\xfa\xf5\xe1\xa1\x82\xf9\xeb\x4b\x42\xeb\x67\xdf\xba\xf5\xe0\x13\xce\x46\xef\x88\xb4\x14\x59\x75\xde\xb5\xcf\xdf\xb5\x40\x1c\x38\x94\xd6\x78\xb3\xfe\xce\x9e\xfb\xea\xdf\xbf\xf7\x4b\x8d\x2a\x5d\x49\xb5\x1e\x49\xbf\x4a\xd3\x8d\xf7\x7c\xf8\xc4\xa1\xf7\xef\x16\x01\x04\x54\x7a\x88\x79\x9b\x70\x35\xfe\xb3\xd8\x25\x88\x66\x7b\x5c\xf0\xa9\x4d\x71\x8d\xe0\x14\x10\x90\x5e\x02\xf2\x12\x38\x01\x62\x79\xbd\x1e\x75\xb3\x1a\xcd\x0f\xf1\x69\x8c\x1e\xc3\xf0\x7e\x0c\xbb\x70\x3f\xde\x86\xa5\xff\x8c\x0c\x30\x70\x3c\x27\xea\xec\x71\x4e\xe0\x2c\xdd\x94\x11\x6e\x31\x7e\xdb\xf8\x9a\x11\x13\x75\x9e\x3c\x56\x13\x37\x1a\xff\x7f\xb4\xfd\x0b\x7c\x5b\xd5\x95\x2f\x8e\xef\xb5\xcf\x4b\xef\x73\x8e\x1e\x96\x6c\x59\x96\x64\x59\x0f\x5b\xb1\x25\x5b\x91\x1f\x71\x12\x9f\x3c\xad\x98\x10\x2b\x69\x48\x8c\x8d\x23\x01\x49\x70\x02\x21\x0e\x34\x60\x48\x99\x98\x42\x1a\xa7\xb4\xc5\x65\x0a\x98\x94\x12\x4f\x87\xe6\x06\xca\x1f\x3c\xd4\x18\x13\x3a\x13\xd3\x07\xa4\x43\xb9\x31\x97\xd2\xc2\x70\x69\xe2\x3b\x6d\x27\x2d\xe9\x24\xff\x4e\x6e\x27\x43\xe2\xa3\xdf\xe7\xec\x73\x24\x3f\x12\x5a\xee\xfd\x7d\x7e\xf0\x71\x64\x4b\x47\x7b\xef\xb5\xf6\x5a\x7b\xef\xb5\xf7\xda\xdf\xaf\x93\x76\xc2\x05\x27\xfc\xc6\x09\xc3\x4e\xc0\x3e\x67\x5c\xa3\x34\x64\x78\x27\xe8\xf4\x3a\x46\x47\x08\x5d\x6d\x2c\x5b\x64\xbb\x6c\x36\x18\x10\xaf\x33\x52\x62\x86\xa1\xd4\x74\xc9\x29\x0d\x57\xa8\x65\x36\xb0\x50\xa6\x90\x31\xb9\x67\x2a\x91\x88\x45\x1b\x13\xca\x04\xa1\xb2\x2d\x68\xf0\x42\xca\x6a\xb0\x5b\x89\x95\xfd\x05\x74\xa1\x3c\xde\x50\x42\x0c\x88\xcc\x8b\x1a\x30\xaf\x7f\x16\x5c\x2f\x1c\xfb\xf1\x48\x1e\x99\x77\x1e\x62\xef\xa8\xb2\x72\x23\xd8\x4a\xf2\x43\x2c\x4d\xb7\x21\x07\x88\xd2\x1d\x61\xa1\x41\xc0\x95\x96\x26\x0b\x0e\xe9\xeb\xf5\x38\x6c\x68\x30\xe0\x30\xdd\x40\x6b\xff\x40\x03\xe0\xbf\xac\x5e\x45\xbb\xab\x39\x83\xe1\x1d\x0a\x5e\xa3\xe0\x39\x02\xb7\x7d\x90\x82\x59\xaa\x35\xa8\xaa\x5d\x6d\xd5\xdc\x99\x28\xd6\xc9\x19\x15\xc5\x0a\x4e\x40\x8a\x62\x2f\x3a\xf1\xa8\xf3\x27\x4e\xec\x54\x3e\xb3\x99\xc5\x54\x9c\x28\x1a\x78\x27\x70\xd7\x56\x30\x2f\x66\x19\x6a\x66\x05\x78\x0d\x05\x47\xbb\xbb\xf7\xa8\x99\x94\x57\x69\x38\xaf\xe2\xbc\x86\x51\x77\x37\x90\xf7\xaf\xad\x6a\xfa\xc2\x2c\x2c\x27\x38\xa2\x21\x3c\xb5\xff\xf4\xc5\xd9\x58\x4e\x2a\xbe\x93\xf2\x23\x6f\x53\xd6\x84\x24\x67\x25\x25\x2f\xa7\xce\x31\x6f\x5b\x43\x70\x8a\xe0\xf6\x2e\x84\x14\x39\x8f\x05\x02\x2b\x94\x5a\x6e\x33\x6a\xe7\xb1\xb9\x1c\x5a\x29\x2f\xa7\x36\xd0\x5b\xac\x21\x38\xaf\x3e\x8b\xfe\x54\x78\xf6\xd2\x68\x6a\x79\xa5\x3f\x7f\x76\xab\xe2\x9d\x9f\x23\xf8\x96\x47\xa5\x1b\x19\xa5\x47\xfe\x91\x79\x87\xf9\x98\xa1\x18\x9f\x5e\x48\x95\x30\x55\x8c\xda\x4f\xff\x88\xde\x41\x1f\x23\x0a\x91\x77\x51\x15\xc2\xac\x20\xe8\x2c\xbc\xb0\x9f\x3f\xc2\x63\xc4\xc7\x79\x89\xa7\x58\x9e\x67\xe8\x4e\x84\x40\x00\xcc\x01\x58\x47\xac\x40\xd2\xd1\x45\x42\x46\x5c\x64\x14\x52\xac\x60\x14\x52\x26\x56\xcf\x1b\x28\x94\x61\x18\xbd\x15\x5f\x26\xf3\xe1\x14\x01\x07\x8e\x46\x0b\x19\xe9\x64\x62\x50\x5e\xba\x1b\x49\x8f\x74\x47\xd5\xff\x35\x00\xcf\x00\x70\x24\x0d\xb0\x01\x12\x40\x27\x5f\xfd\x87\x3b\xe4\x25\x8f\x1c\x3f\x7e\x1f\xfc\xe4\xdd\xe9\x4b\x04\xc4\x13\x1f\xbf\x6b\x7a\x9c\x19\x9b\x0e\x1e\xc3\x89\xe9\x87\xb4\xfb\x8a\x51\x82\x51\xf1\x94\xb4\x53\x47\x24\xd2\xbd\xa3\xfb\x58\x47\xe9\x88\x44\xba\x2a\x1d\xa6\xc8\xbb\xd4\x3b\xd4\xc7\x14\x45\x91\x77\xa9\x2a\x0a\xeb\xb8\xd5\x08\xee\x81\xaf\x00\xde\x05\x70\x03\x40\x14\x9a\xe1\x3a\xa0\xec\x00\x46\x00\x96\x02\x44\x0b\x34\xa6\x69\xc1\x82\x0d\xad\xc6\x8d\xbc\x1e\x5b\x2c\xc8\x48\xa5\x75\x0e\xe6\xb2\x49\x4d\xd3\x20\x10\xd4\x05\xc0\x26\xc2\xbc\x33\x03\xaa\x3d\x55\x37\x23\x5a\xde\x4a\xe6\x60\x38\x5d\xf7\xc6\x8b\xdb\xf3\x28\x4e\x72\x46\xb1\x87\x02\x92\xd3\x6c\x7c\x66\x2b\x7a\xf2\x35\xc4\xe7\xce\x48\xdd\x56\x47\x2a\xcd\x67\x79\x5c\xce\xd7\xf1\xcb\x79\x0a\x4b\x7a\x73\xca\xc8\x75\xea\x16\x5a\x37\x5a\xb1\x95\xdf\x4c\x01\x65\xf2\xd0\x60\xa4\x41\x99\xf0\xb6\xda\x04\x51\x04\x24\x68\xa0\xce\xc8\x3e\x62\x87\x98\x1d\x04\x3b\x18\x19\xbd\xce\x47\xc7\x69\x89\xa6\x68\x33\x6d\x16\xf4\x94\x4e\xc3\x71\x26\x29\x10\xca\x2a\x14\xd4\x6d\xc7\x2d\xdd\xc4\x57\x84\xdf\x91\x83\x98\xc4\x1b\xdd\xca\x6a\x6e\xaa\xae\x36\x8e\xa2\xdd\xdd\x51\x7f\x00\x1c\x01\x51\xeb\x2f\x31\xe1\x20\x00\xcf\xef\xc9\x2f\x1e\xb8\xf7\xf8\xf1\x7b\x0f\xc0\xb2\x77\xa7\x2f\xc1\xc5\x77\x60\xeb\x2d\xd3\xbf\x62\xc6\xa6\xd9\x67\xe1\xd6\x1f\xc0\xd1\xe9\x6d\x1a\x4e\x51\x80\xdc\x05\x78\xfa\x15\x51\x32\x8a\x29\x83\xe2\xf8\x46\x31\x45\x6e\x1c\x6e\xd6\x99\x53\x16\x43\xc8\x0a\x56\xee\x90\xed\x29\xdb\x73\x36\xca\x6b\x8b\xd9\x5a\x6c\x94\xd1\x06\x36\x1b\xcf\x2a\xcb\x23\xbb\xd1\x64\x12\x78\xc1\xc7\xc7\x79\xcc\xf3\x0e\xe4\x10\x1c\x18\x39\x24\x47\xd6\xd1\xef\x18\x76\x4c\x38\xce\x38\x38\xce\x62\x66\x59\x9d\x4d\x67\xd3\x61\x23\xcd\x0b\x38\x8f\xb0\x45\xb0\xce\x94\x5e\x53\x73\x3f\x34\x11\xff\x4c\x0e\xa0\xba\x35\x29\x15\x87\x8f\x46\x21\x5c\x90\xcd\x96\x00\x07\x28\xf2\xc2\xa9\x5d\xa3\xa3\xbb\x1e\xf8\xe4\xa7\x72\x1a\x7e\x75\x4a\xbe\xf4\x00\xbc\xbc\x4f\xed\xb5\x7d\xb0\xfa\x35\x30\xcb\x45\x6b\xa6\x7f\x0f\xe1\x77\xf2\xeb\x30\xd2\x87\x76\x74\x40\x92\xb0\x7d\xbb\x1d\xec\x36\x5a\xb2\xa4\x2d\x8a\x2d\x09\x26\xba\x53\xcf\x31\x5b\x1d\x56\x9b\x60\xb3\xcd\xea\xa9\xa2\x91\x22\x88\x15\x81\x50\x04\x3c\x9b\x31\xe9\xf5\x08\x2b\xce\x25\x90\x4c\x21\xe5\x17\xcc\x58\x0d\x14\x33\x03\xbd\x1d\x8d\x6a\x17\x95\x67\x75\x5a\xac\x31\x21\xfc\xf9\xcd\x84\x9a\x86\xaf\x74\x69\xb7\x06\xc5\xcd\x15\x2e\x2d\x27\x1c\x01\xd5\xcd\xbe\xfb\x9e\xe2\x64\x43\x43\xc7\xdf\x7f\x5f\x75\x34\xe2\x63\x6a\xdc\x27\xef\xcb\xfb\x99\xb2\x26\xbb\x40\xee\x35\x3e\x2c\xf1\xa2\xc5\xc2\xd3\x3a\x3d\x65\x6b\xb5\x23\x16\x58\xa5\xf7\x04\x47\x4a\x79\x95\x92\x7a\x4b\x8a\x65\xf9\x22\xb0\x6f\x74\x9a\xcc\x82\x99\x17\x92\x3c\x68\x89\xde\x3a\x9e\x77\xf1\x2e\xd0\x8b\xd8\x6e\xe7\x39\x47\x3b\x0d\x80\x79\x87\x89\xc7\x84\xbd\x4d\x95\x42\x8d\x85\x40\x95\x24\xdf\x39\x75\x6f\x5a\x9b\x62\xd1\xe8\x1e\x61\xca\xa9\x41\x4d\xd8\xf2\xe1\x2c\x95\x68\x50\xe1\xd1\x88\x64\xd6\xa7\x47\x61\x9f\x7c\x40\xa0\x0f\x42\xf0\x3d\x79\x37\xbc\xf0\xae\x3c\xb2\x6b\xf4\x69\x66\xcb\xd8\xd8\x21\x79\xaf\xfc\xc7\xe7\x61\x87\x1c\x9c\xfe\x26\x5c\xda\x20\x77\xd2\xef\xe7\x39\x36\x56\x12\xbc\xda\xcd\x52\x02\x5b\x2c\x66\x03\xdd\xe9\x63\xe2\x8c\xc4\xf4\x33\x17\x18\x86\x61\x10\x67\x32\x9b\x67\x75\x8f\x20\x08\x80\x0d\x8c\x89\xcb\xe8\xf2\xbd\x30\x95\x98\x69\x32\x69\x71\x8c\x5c\xeb\xd7\x9a\xaa\x69\xdd\x9f\xf4\x13\x7d\x33\x2b\x15\x7d\xbf\x2e\xbf\x80\xf9\x59\xea\x66\xac\xcf\xce\x8c\x69\x95\x08\x11\xce\x54\x33\xba\x4d\x92\xb0\xd9\x6c\x64\x5b\x11\x07\x88\x13\x38\x1f\x97\xe5\x26\x38\x46\xc7\x71\x94\x1e\xc1\xfb\xf0\xbf\x01\x03\x4d\x09\x5a\x78\xc2\x4b\xfc\x19\xc5\x1f\x00\x9b\xcd\x9c\x3e\x8d\x0c\x3c\x47\xa9\x66\x4f\x58\x65\xa1\x5b\xbb\x13\x44\xce\xdb\xb4\x25\x67\x5d\xdd\x1c\x84\x39\x7f\xd2\xcf\x89\xd4\xc7\x3f\x95\xb3\xf0\xd6\x29\x79\xed\x2b\x04\x74\x67\x06\x68\x8e\x1a\x39\x8c\xa7\xff\xa8\xe8\xed\xb7\xf2\x7e\xe6\x59\x82\xc9\x7a\xab\xd4\x42\x77\xd2\x00\x5f\x84\x87\xe1\x5b\x40\x01\x88\x66\xa6\x13\x89\xbf\x11\x2f\x8a\x78\x42\x04\x2c\x88\x3e\x51\x12\xfb\x45\x9a\xcc\x19\x02\x97\xe1\x4d\xa0\x33\x99\x18\x8b\x81\xd2\xa3\x0c\xa3\x4e\x15\x53\xea\x75\x9b\x02\x95\x4f\xa6\xbb\x5b\xf8\x9f\x53\x64\x50\xdd\x93\xc7\xe7\x0e\xcc\x30\xad\xd0\x17\x47\x46\x5e\x9f\xbe\xed\xf5\xd7\xf1\x53\x2a\x4a\xf7\xcc\xe5\x23\x6d\x4e\xf8\x88\x60\x2d\xdd\x27\x6d\xd0\xa1\x56\xda\x08\x46\x23\xdf\xfa\x13\xd3\x2f\x4c\xd8\x64\x12\x69\xb1\x42\xc4\xbf\x50\x9a\x37\x22\x02\x56\x79\x53\xfa\xc5\x41\x71\x58\x64\x39\xaa\x95\xde\x28\x98\x2f\xe3\xf4\x27\x1c\x3c\xc7\xbd\xc6\x61\x9e\xf3\x72\x31\x8e\x62\x39\x0e\xe9\x19\xde\x98\x56\xf7\x94\xa6\x5a\x0a\xec\x03\x2d\x85\x06\xab\x8c\x58\x09\x15\x00\x7a\x0e\x2d\x8c\x12\x00\x1e\x98\x3e\x3d\x36\x86\xfd\x63\xc3\x63\x33\x77\x79\xd4\xbd\x21\x32\x56\xfc\x16\x21\x36\x45\x62\xb6\x6e\xa9\x59\x0f\x9d\x08\x31\x92\x11\xce\x18\xc1\xc8\xfb\x54\x07\x52\xa6\xe2\x2c\x3f\xcc\x8f\xf0\x67\x78\x1d\xab\x53\x82\x0b\x8b\x39\x63\x30\xb0\x54\x86\xd7\x81\x4e\xa7\x63\xf3\xf6\xa8\x62\x52\x27\x62\x33\x00\x40\x6f\x76\xef\x11\x9b\x62\x1a\x44\x5e\xbe\x61\x7e\x87\x9f\xbe\xa8\x69\x11\xf3\xf2\x0b\x33\x3a\x7c\xb6\x80\x61\xc8\x3c\x4b\xec\xb0\x47\xf2\xeb\xe8\x56\x46\x0f\xad\x08\x19\x99\x8d\x16\xa3\x91\x47\xbc\x8f\xc7\x83\xfc\x08\x3f\xc1\x4f\xf2\x17\x78\x86\x57\xbc\xdf\xcb\x99\x52\x54\xfa\x13\x1d\x3c\xa7\x7b\x4d\x87\x79\x9d\x57\x17\xd3\x51\xac\x4e\x87\xcc\x06\x36\x0f\x3c\x97\xf8\x49\x21\xe5\x34\x4a\x74\x46\xe6\x97\x29\x95\x48\x68\x5e\xf3\x9a\xc7\x54\xad\x61\xaf\xfc\xe4\x8c\xda\x0e\xab\x31\x18\xf7\x11\x33\x86\xc2\x28\x23\x2d\xd2\x1b\x81\xb3\x5a\x91\xaf\xd3\xef\x0f\xba\xba\x74\x95\xbb\x2b\xa1\xa2\x33\xb8\x35\xe2\xc9\xf2\x54\x8c\x6a\xa1\x28\x9e\x6a\xa1\x4e\x53\x39\x8a\xd6\x51\x54\x30\x90\x09\x51\xfe\xa0\xd5\x56\x94\x31\x97\xaa\xb0\xce\x73\x52\x7c\x95\xc0\x8b\x34\x28\x1f\x7c\x7d\x56\xc8\x15\x28\xe7\x34\x9b\xf4\xd3\x6f\x94\xad\xa9\x39\x7c\xe1\x7b\x9b\xd4\xa8\x6b\xc5\x12\x6f\xcb\xdf\xac\x81\x7b\x57\x7c\xe9\xc5\xdb\xaf\x4b\xbc\x3e\xbd\xef\x38\xf5\x29\xe5\xfe\x8c\xa8\xcb\x34\x7d\x88\xb1\x7e\xfa\xef\xf9\x3d\x01\xd9\x40\xb0\x37\x2a\xd0\xbd\xd2\x3a\x63\xc0\x1d\xc0\x14\x55\x2c\xb6\x62\x2b\xfc\xc8\x0a\x47\xad\x63\x56\x7c\xaf\xf5\xa0\x15\x5b\xad\x45\x86\x94\x2f\xc4\x87\xbc\x21\xdc\x1e\xca\x84\x5e\x0a\xe5\x42\xb4\x10\x02\x47\x6b\xd1\xc6\xa0\x79\xbd\xd1\xed\x76\x63\xce\xed\x2e\xb2\xa7\x9d\xbc\xb5\xc8\x41\x6b\x41\xd9\x8c\xac\xda\x3e\xc5\x1e\x55\x58\x82\xf4\x58\xf7\x17\x42\x33\xf2\x53\x60\x51\xa5\x3f\x9c\x89\xcd\x4a\x97\x7a\xc7\x64\xdd\x18\xb5\x75\x51\xcb\xb5\x63\x33\x15\x8e\x56\x0e\x9b\x0a\xd1\x99\x9a\x77\xf2\x02\xf3\x04\xf3\x0e\x5a\x8a\x36\xa0\xfb\xa5\x34\xb3\x4e\xa8\xa3\xd1\x9a\x2e\xe4\x13\x7c\x38\xe9\x4b\xfa\x5c\x2d\x5d\xe8\xb6\x8d\xfc\x46\xef\xc6\xf6\x8d\x99\x8d\xfb\x37\x1e\xd9\xf8\xd2\x46\x8e\x8b\x76\xb9\xb6\x7f\x61\x65\x76\x1d\x83\x16\x09\x8b\x7c\x8b\xb2\x8b\x7a\x17\xf5\x2f\x62\x17\x2d\xe2\x42\x19\xbf\x87\x16\xea\xe2\x19\x1b\x97\xb1\x58\x6c\x36\xa4\x2c\x3e\x85\xa9\xba\x26\x32\xf6\xc5\xba\x9b\x9a\x34\xb6\xd8\x02\xcc\xca\x94\xd5\x99\xdf\x6d\x2b\x2a\x30\x9d\x5e\x23\xd9\x8b\x9a\x49\x21\x69\x08\x15\xf2\x86\xb8\x3c\x8b\x2c\xc9\x54\xa4\x98\xdd\xe1\x65\x37\x54\xd7\xaf\x0f\xae\xf6\x7a\xda\x43\x47\x1f\xa9\xfb\xd2\xe2\x27\xce\x7e\x67\xfd\xf5\xcf\xfc\xe9\xe8\xf2\xbe\x60\xd2\x10\x89\x27\x1c\xf7\x3c\x77\x47\x62\x71\xef\xf0\xd6\x78\xa8\xbd\xab\x21\xfb\xd0\xda\xeb\x0e\xdc\xd2\xf4\xd3\xa2\xaa\x25\xe1\xca\x25\x95\x0e\x57\x65\xbd\xb7\x6a\x79\x8d\x0b\x1f\xdd\xf6\xd2\xe0\xee\x8a\x62\x8b\xf1\x79\xb3\xe9\x16\x51\xdc\x39\x01\x96\xef\xbd\x02\xde\xb7\x76\x14\xf1\x4f\x33\x06\x3d\xb3\xfe\xf0\xaf\xbf\xfe\xad\x7f\x19\x5c\xcd\xed\x80\xa2\x6f\x1f\x78\x63\x5f\x73\xe3\xbe\x37\x1f\xdf\x78\xe8\xd6\xfa\x86\x5b\x0e\xa6\x53\x07\xee\xd9\x16\xf6\xdf\x72\xef\x00\xd2\xf8\x93\x7f\x4a\x3f\x4b\x6f\x41\x66\x74\x3d\xba\x4f\x5a\xb3\x92\x11\xeb\xe8\x16\x94\xda\xe8\xdf\xea\xc7\x49\x7f\xd2\x5f\xac\x4b\xb5\xb4\xb5\xb5\x6c\x6e\xdf\xd7\xfe\x48\xfb\xeb\xed\x54\xa6\x7d\x77\x3b\x76\xb7\x03\xdf\x0e\x1c\xae\x4a\x15\x6f\x5a\x67\x5c\xc9\x2c\x5a\xd4\x1a\x4c\x97\x97\x09\x62\x5d\x2c\x6d\x6f\x4d\x5b\x2c\xf6\xa2\x59\xca\xfd\xbd\xb5\x29\xd6\xd4\xf4\x86\xa2\xdb\x8c\x7a\xa1\xe1\x77\x75\x31\x61\x9e\x8a\x49\x32\xa7\x6a\x4c\x30\x2f\x03\xeb\xaa\x24\x1d\x95\xd4\xbc\x80\x3c\x3b\x03\x13\xf4\xb1\xdd\x57\xe5\x68\x4a\x35\x2e\x59\xba\x0c\xd6\xae\x1a\x68\x8a\xdc\xd2\xba\xf7\x07\xf7\xb7\x2c\xee\x1b\xbd\x6f\xf9\x86\x92\x4a\x5b\x5b\xd5\xc6\xde\x15\xa5\x65\x2b\xee\x4c\x07\xeb\xa8\xa6\xb6\xda\x1b\xee\x5a\x26\xed\xde\x50\x53\xb6\x70\x55\xd8\xde\xe0\x29\x69\x2a\x2d\x5e\x0e\x17\x93\x37\x5d\xd7\x64\x8d\x3c\x71\xfb\x6d\xf7\xdf\x3f\xdd\x53\x15\x14\x9d\x9b\x9f\xfc\xf9\xde\x87\x7e\xf9\xe4\x17\x04\xf6\x09\x46\x58\xb4\x7b\xf8\xb6\x1b\xbf\x75\xfb\x62\x1d\x5e\x3e\x7a\xef\x96\x81\x1b\xa3\xe1\x4d\x5f\xbd\x75\x75\xdf\xad\xd7\xbb\x0d\x66\x56\xf7\xb7\x7a\x2e\x97\x43\x0f\xc8\xcb\x09\x1f\x47\x08\x85\xd4\x18\x0c\xc7\x10\x42\x96\x57\x01\xf6\xd6\x2d\x70\xf9\xd4\x00\x8c\xe4\xd9\x2e\x27\x38\x99\x21\xb4\x5a\x8b\xeb\xf6\x68\xcf\x6d\xa8\x89\x30\x66\x2d\x50\x03\x64\x97\xf7\xd3\x56\x72\xef\x7c\xb7\xd4\xe4\x35\xc3\x19\x33\x64\xcc\xa7\xcd\xd8\x67\x8e\x9b\x25\x33\x45\x77\xf2\xe0\x25\x51\xd7\x4b\x86\xf3\x06\x6c\x30\x18\x3b\x59\x89\x3b\xa3\xcc\x4b\xa0\xe3\xb8\xcd\xec\x6d\xec\xbd\x2c\x45\x56\x5e\x3c\x67\x48\xb1\x46\x65\x59\x32\x33\xab\xb6\xa8\xfb\x71\x64\x2d\x45\x72\x22\x89\xeb\xab\xb0\x9a\xf9\x39\x95\xd0\x7a\xed\x19\x19\x79\x5d\xde\x42\xc9\x72\x46\xe5\x4a\xb0\x3e\xab\xcd\x01\x95\xf2\x43\x04\xdf\x53\x69\xdf\xf5\x17\x08\xaf\x86\x64\x4e\x9b\x71\xcc\x0c\xc6\xd6\x97\x74\x27\x74\xa7\x74\x94\x4e\xe2\x0c\x29\x9d\xee\x34\x03\xdf\x61\xe0\x51\x06\x18\x86\x6b\x45\x59\xdc\x8b\x27\x31\xe5\xc5\x80\xb1\xb2\x76\x1a\x41\x13\x88\x46\xfa\xcb\x2c\x4e\x53\x3c\x97\x46\x2a\x02\x52\x5d\xcb\x2c\xc8\xcf\xee\xee\xee\x26\x8d\x1d\x83\xe0\xec\xa8\x5c\x85\x4a\x33\xa1\x47\x7e\x83\x4a\xca\x6f\x1c\x19\xa3\x46\x0e\x1f\xbe\xf2\x07\x6d\xda\xd4\x72\xd0\x1b\x08\x1f\xc8\x62\x15\xf7\x44\xb6\x53\xef\x93\xd8\xe2\x4b\x92\xcd\x60\x40\xad\x47\x01\x0e\xc2\x93\x80\x01\x28\xd1\x2a\xcc\xd9\x62\xf0\x91\x2d\x06\xc7\x05\x07\x9c\x76\x9c\x77\xe0\xb4\x63\xd0\x31\xec\xa0\xda\x1d\x10\x77\x00\xef\x00\x9a\x9c\x33\x09\x94\x48\xf1\x8c\xc1\x61\xc0\x9c\xcd\x80\x1d\x2a\xfd\x74\x62\x4b\x77\x4b\x22\x7f\xfd\xbc\x70\x31\x58\xc3\x14\x5f\x12\x23\x60\x8b\x30\x3b\x2b\x1c\xaf\x7e\x55\xde\xf3\xc3\xb7\x04\x9f\xdb\xce\x70\xb4\xc3\xed\x13\xde\xfa\xa1\xbc\x47\xb6\xc3\x59\x7a\xdd\xf4\xa9\x9a\xad\x5b\xda\x8b\x8b\xdb\xb7\x6c\xad\xc1\xb5\x97\x5f\x2e\x70\x9c\x36\x90\xf8\xfd\x88\x54\x7c\xde\x0a\x56\x49\x6f\x4a\x21\x44\xeb\x3a\xf5\x66\xfd\x13\x7a\xb8\x57\x7f\x50\x8f\x49\xbf\x9b\x1d\xae\x94\x51\xcf\xb2\x7a\x23\x85\xd5\x0c\xad\xc6\xef\xf3\x30\xc8\x83\x9d\x07\x1e\xb0\x20\x60\x38\x8f\x61\x12\xc3\x09\x0c\xfd\x18\xda\x71\x06\x63\x3b\x06\x84\x81\xc3\xd8\xca\x19\x32\x34\x32\x9b\x41\x67\xe5\x81\xd2\x68\xe1\x9a\x94\x75\x38\x49\xc7\x28\xe0\xad\x28\x7d\xd3\x58\xb8\x6e\xaa\x9e\x39\x35\x2d\x89\x45\x35\x7e\x28\x87\xba\xb5\xeb\x4f\xfa\x93\x90\xc0\x6e\xd8\x78\x52\x5e\x0e\x61\xf9\xc3\xd7\xe5\x7f\x81\x90\xbc\xfc\x6d\xfc\x1e\xfe\xd7\x2b\x0f\x2d\x79\x56\x3e\x06\x1d\xcf\x26\x08\x95\xe9\xac\xbe\x2a\x46\x07\x24\x87\xc5\xe2\x84\x56\xf6\x28\x86\x83\xf8\x49\x8c\x31\xe6\x1c\x45\xc2\x9c\x8b\x8a\x3e\x72\x51\xd1\x7d\xc1\x0d\xa7\xdd\xe7\xdd\x38\xed\x1e\x74\x0f\xbb\xa9\x76\x37\xc4\xdd\xc0\xbb\x41\x47\xf0\xcc\x6d\x9c\x83\xe3\x11\xd5\xce\x58\x1c\x16\xcc\x59\x9c\xac\x03\xf2\x1d\x46\x20\x4d\xaf\xd9\x65\x09\x22\x4b\x6d\x9c\x51\x45\x98\xd3\x71\x7e\x87\xd2\x75\x7f\x06\x9d\x7c\xf7\x55\xdd\x07\x86\x43\xf2\x77\xe0\xd6\x43\x74\xdb\xbc\x2e\x1c\x3b\xa4\xc9\xb7\x9f\x1e\x55\xd6\xc8\xc0\x4a\x03\xad\x3c\xa4\xf4\x40\xf1\xc8\xc8\x32\x06\xce\xc2\x99\x90\x51\xcf\x18\x74\x66\x9d\x89\x47\x46\xa4\x67\x19\x03\xa3\x37\xf1\x14\xcb\x5a\x74\x06\x06\x9e\x67\x8e\x33\xff\xcc\xfc\x81\xf9\x94\x61\x98\xb8\xd1\x92\x62\xe8\x4e\x30\x5b\x04\xa3\x05\xbe\x6f\x79\xdd\xf2\xb6\xe5\x13\xcb\x65\x0b\x63\x91\x8c\x96\x94\xc5\x80\xe0\x79\x74\x1c\xfd\x33\xfa\x03\xfa\x14\x31\x48\x79\xda\x82\x68\xb0\x93\x51\x43\xfc\x05\x59\x88\x53\xca\x42\x5c\x59\x86\xab\xf7\xbb\x8d\x82\x3d\xc5\x8b\x60\x34\x18\x38\x72\xa5\xc6\xae\x8b\xb0\x10\x36\x81\x89\x65\xcc\x06\x8a\x9b\xb7\x2a\x6f\xea\xee\x06\x75\xd7\xac\x9b\x1c\x9c\xaa\xdb\x38\x89\x68\xf7\x9e\x58\x54\xb1\x0d\x81\x00\x17\x8b\xd6\xa6\x25\x31\x67\x42\x38\x68\x99\xa0\x27\x84\x83\x13\x16\x2d\xe1\x48\xfd\x17\x32\xdd\x79\x92\x96\x80\x9e\x6c\x9f\x29\x66\x43\xc9\x63\x23\xf7\xca\xcf\xc8\xdf\xfc\x21\xfc\x54\xee\x7c\x13\xd6\xc2\xba\x7f\x92\xbb\xd4\x05\xfd\xbe\xe9\x03\xf8\x0a\x3e\x3e\xfd\x2e\x8e\x4d\xaf\x55\xed\x25\x20\x3f\x44\x7b\x95\x75\x3d\x34\x49\xc1\x1b\xcd\xb0\x89\x82\x51\x13\x98\x7c\x16\x31\xb5\xc4\x04\x95\x26\x30\x9a\xdc\x26\x6c\x32\xae\xd6\x21\x8a\xa5\xcc\x66\xa0\x15\xe1\xf6\x38\x5c\xa9\x57\x68\x78\x8a\x7e\x8e\xc6\x3b\xe9\xfb\xe9\xaf\xd2\xd4\x2a\xfa\x06\x1a\xb3\x34\xd0\xcc\x47\xf8\x13\x7c\x19\x53\x3f\xc3\xf0\x3a\x86\x27\xf0\x51\x8c\xb7\xe1\xbd\xf8\x00\xa6\xda\x70\x27\xc6\x18\x4e\x33\xe7\x99\x1c\x43\x31\x92\x45\x4c\x35\x33\xd7\x31\x38\xcc\x80\x81\x29\x61\xf0\x42\x58\x09\x38\x02\xc0\x80\x03\x30\x03\x0c\xf0\xcd\x1c\x70\x4a\x53\x54\x22\xf7\x35\x9c\x29\xa5\xd3\x89\x59\x12\x59\x8c\x10\x76\x9b\x0b\x22\xf7\x91\x05\x7e\x66\x81\xe3\x16\xd8\x66\xd9\x6b\x39\x60\xa1\xda\x2c\x9d\x16\xac\xb7\x80\xa5\x99\xbf\x8e\xc7\x11\x1e\x18\xde\xc1\x63\x9e\x32\x83\x85\x4b\x9b\x1c\xfa\xcb\x2a\xf0\x7c\x8b\x16\x62\x2a\x5e\xf8\xd3\xee\x19\x03\x4e\x44\xbb\xf3\xf7\x56\x08\x54\x88\xa0\x7d\xa8\xbd\x46\xb5\x2e\x21\xb7\xd6\x14\x57\x45\xdd\xdd\x7a\x48\xb8\x0b\xfb\x51\x4a\xd0\x37\x24\x1f\x39\xf5\xe9\xa7\xa7\xe4\xef\x00\xff\xfc\x8b\xdb\xe4\x8b\xf2\x9f\x4e\xe1\x04\x76\xca\xdb\xe1\xf0\xf4\xef\xe5\xdb\x94\x91\x16\x46\xe5\xb5\x48\x9d\xab\xd8\x2c\x89\xf9\xbe\x25\x99\xa1\x93\xa6\x75\x9d\x02\x03\x93\x0c\x30\x8a\xc4\x2b\x39\x6b\x8a\x61\xc4\xd3\x22\x0c\x8b\xc0\x8b\x31\xb1\x5d\x7c\x54\xa4\x39\xc1\xe2\xb3\x48\x96\xb4\x25\x6b\xe9\xb7\xb0\x16\x0b\xea\xd4\xab\xd8\x30\x19\xe3\x6e\xe3\x4b\x46\x56\x67\x34\xc6\xf5\x92\x3e\xad\xef\xd7\x0f\xea\x19\xbd\x52\x90\xc8\x19\x52\x7a\xde\x98\xc1\x26\x8a\x46\x19\xbd\x95\xcd\x03\x12\xcf\x4c\x66\x64\xb6\x28\x5c\x8f\xda\xa3\x91\x38\xe5\x63\x2d\x7f\x7e\x52\xc3\x07\x8e\x8f\x8c\x5c\x61\xb5\x89\x8d\x11\xd4\xe4\x04\x6d\x72\x23\x73\x1b\xb3\x8b\xc4\x89\xfd\x63\xc6\x56\x8b\x05\xb7\xf2\xe4\x4a\x87\x2b\x45\x82\x99\x04\x67\x4c\xf1\xbc\xc8\x8b\x5e\x22\xcc\x09\xf1\xb4\xc8\x72\x59\xdd\x19\xdd\x05\x1d\xa5\xd3\x19\x5a\x29\xaf\x66\x1c\x04\xcc\x3a\x4b\xf5\x52\x34\x21\x52\x16\xed\xae\x14\xa5\x67\xd2\x26\x96\xb7\x18\xd2\x94\x03\xcd\x6f\x7f\xbe\xf9\xda\xd6\x73\x2c\x0f\xce\xab\x71\xf3\x2a\x52\x30\xbb\x5e\xbd\xf2\xb2\x3a\xe7\xe5\x41\x96\xd5\x99\x4f\x05\xe7\x05\x74\x54\xde\xcf\xd4\x32\x63\xc8\x83\x6e\x95\xac\x46\xb3\xdb\x8c\x4b\xe8\xce\x41\xcf\xb0\x07\x7b\x3c\x94\xca\xa1\xb8\x80\x13\x52\x08\x79\x79\xaf\xd7\x1b\xf3\xb6\x7b\x33\xde\xfd\xde\x97\xbc\x27\xbc\x3a\xce\xda\xc9\x6f\x2d\x73\x64\x4a\x0c\x06\xda\x2d\x50\x9e\x0c\x6d\x55\x41\x84\x5b\x12\x79\x9a\x93\x29\xb5\x71\xf9\x60\xb6\x3b\x48\x96\x0a\x79\x48\xe6\x3c\xa5\x7c\x83\x98\x10\x99\xda\x91\xe3\x8b\x76\xdc\x7a\x73\xad\x46\x57\x55\xdd\xb9\x65\x7b\xa3\x4a\xb8\x84\x37\x15\x95\x17\x99\x6a\xb7\x3c\xa2\xf1\x56\x19\xec\x65\x76\xfc\xe6\xa7\x17\x88\xee\x0f\xcb\x0f\xd1\xcf\x10\x1e\xeb\x9b\x25\xa7\x51\xef\xd6\x47\xf5\x14\xe7\x40\xad\x2e\x57\x69\x2b\x2a\x16\x8a\x7d\xc5\x54\x31\x21\x82\xb4\x38\x52\xc5\xc5\x65\x3c\xb9\x02\x78\xa2\xec\x54\x19\x63\x69\x35\x6e\xf4\x94\x5c\x76\x08\x69\x96\x45\x45\x26\xde\xa5\xad\x25\x94\xc6\x4f\x25\x5a\x66\xb2\x63\x15\xcd\xd6\xd5\xc6\xb7\x74\xfb\x67\xb7\x3c\xdf\x70\x12\x94\xa7\x0a\x98\xd2\x63\x1a\xca\xf4\xf0\xab\xb3\x01\xa5\x09\xce\x74\xd4\x03\xef\x6b\x91\xfa\x0c\x07\x98\x07\xf5\x4a\x35\xe4\x7c\xb1\x94\xf7\xd0\x16\x72\x79\xc7\xc2\xda\x9c\x9d\x45\xdb\xbc\xbd\xde\x61\x2f\x8e\x79\x41\xf0\x82\xbe\x33\xcb\xf6\xb2\xc3\xec\x08\x4b\x93\xc9\xba\x48\x59\xa4\x59\x04\x8b\xc7\xe6\xf6\x50\xa6\x0c\x80\xd3\xce\x51\x4e\x72\x78\xac\x34\xdf\x99\x88\xd5\xd5\xc5\x66\x53\x84\x91\xd3\xf4\xc4\x1b\x4a\x27\xcc\xe2\x09\x6b\x06\x31\x21\x2e\x05\x0d\x29\x1b\x38\x31\x80\xd3\x7e\xad\x07\x4c\x07\x1a\xef\x59\x79\xfc\xf8\xf2\x7b\x9b\x0e\xc0\x95\x19\xed\x43\x87\x3c\xaa\x2f\x2f\xc6\x6f\x7e\xda\x86\x37\x95\x04\x8d\xf2\xcf\xd4\x7e\xd0\xf0\xba\x4b\xd1\xed\xd2\x72\xf5\xbc\xd4\x6d\x29\x4d\x9b\x81\x36\xdb\xcd\x15\x66\x4a\x67\x36\xb3\xd6\xa2\x4e\xc7\x0d\x65\x42\x59\xb6\xac\xbf\x8c\xd2\x77\xb2\x1b\x3d\xda\xea\xd4\xcc\x9b\x4b\xad\x25\xa5\x94\x31\x03\x50\x64\xe3\xf8\x22\xc7\x5c\x41\xba\x0b\xe0\xde\x2a\xed\x04\x91\x63\x0b\x61\xe2\xcc\x8b\x72\x0d\x49\x2c\x31\xb5\x43\xd8\x07\x62\x5d\x89\xb1\xb1\xba\x1b\xeb\x1e\x80\x9d\x85\xfe\x80\x6a\xf9\xb7\x96\x78\x40\x85\xfe\x0e\x24\x84\x1c\x9a\xb3\x5f\xee\x44\x69\xa9\x9e\xe6\xec\x1c\xe6\x4c\x9d\xc6\x6d\xc5\xb1\xe2\x4c\xf1\xee\xe2\x47\x8b\x8f\x10\x36\x93\xf3\xc5\xb9\x62\xbd\x50\x0c\xb8\xa8\xd3\xb9\xd5\xe5\x10\x32\x88\x11\x18\xcc\x30\x4e\xa3\x15\x51\x2a\x43\x5b\xb7\x86\xc2\xa5\x5d\x52\x43\x5b\xba\x6d\x89\xfc\xb1\xa4\x4a\x86\x5b\x4e\xb0\xdd\xdf\xca\x73\xb4\xbd\xde\xb3\xaf\xba\x33\xb3\xad\xf1\x38\x33\x36\xfd\x7c\x75\x75\xed\x96\xaf\xde\x38\x3d\x8e\x63\x77\xef\x55\xec\x7d\xba\x69\x16\x2e\xbf\x0b\xb5\xbc\x86\xec\xb9\x33\x52\x39\x67\x48\xa1\x56\xd7\x0d\x25\xe7\x4b\x40\x43\x47\x37\xeb\x5b\x0d\x79\x78\x74\xde\xa0\xee\x94\xe4\xe1\xd1\x0b\x6d\x89\xfa\xc5\x85\x5a\xf5\x8a\xd6\xd4\xb4\x09\x91\xba\xe9\x2a\x84\x74\x38\x4c\xf0\xd1\xe5\x28\xdd\x26\x17\x79\x63\x3e\x31\xf6\x85\xbb\x57\xca\x9d\x08\xa3\x25\xb9\x73\x2c\xcb\xbc\x83\xa2\xa8\x1e\x6d\x95\x96\xd6\x75\xd9\x8d\xb7\x35\xf2\x8d\xde\x46\x5c\xe9\x2b\x87\xf2\xf2\x5a\x53\x17\xea\xf5\xf6\x7b\x27\xbc\x94\xb7\xc1\x6b\xca\xd6\xb6\x47\x81\x8f\xbe\x14\xcd\x45\x29\x3e\x08\xba\x68\x30\x1a\x64\xc4\x8c\xbd\xc4\xb6\x20\xc3\xd0\xc4\xed\x0a\xa4\xd0\xe4\xf4\x5f\xf8\x65\x77\xdd\x54\x5d\x22\xd6\xfd\x86\x46\x2d\x04\x1a\x61\x94\x07\xe6\x00\x98\xe1\x70\x79\x28\xb9\xb0\xbe\x21\x61\x01\x87\x3d\xa1\x42\x9c\x2d\xac\xc1\xb0\xdd\xd0\xf5\xf4\xc7\x5f\x7f\xea\x97\x03\x4b\xaf\x04\xb9\x96\x2f\x3e\xd7\xdb\x7f\xaa\xab\xaa\x6b\xc7\x97\xd6\x0e\x7d\xf2\xec\x4d\xfa\x47\x0f\x5b\x8d\x4f\xb3\xfc\x6d\xf8\x50\xd7\xe3\x77\x2e\xe3\x28\x6b\x70\xd3\x23\x54\xd3\xe1\x8b\xdf\xef\x22\xd7\x21\x57\xdd\xff\xa3\xaf\xb4\x2e\xf0\x3d\xcf\x97\x58\x0d\x37\xff\x60\xfa\xdb\x7b\xef\xaf\x5a\xee\xe4\x97\x06\x6e\x86\x0b\xcb\xfe\xe6\xb5\x3e\xf5\xf6\x34\x46\x89\xdc\x39\x7a\x8c\xde\x82\x16\xa0\x24\x7a\x58\x8a\xd6\xa6\xc2\x65\x9b\x1b\x72\x0d\x30\xd8\x30\xd2\x80\xbd\x0d\xfb\x1b\x70\xdc\x9b\x62\xf8\xd3\x3a\xd0\xe9\x6c\x8a\x85\xf8\x18\x4a\x62\xd2\x0c\x26\xf3\x5c\x44\xb0\xa5\x98\x7a\xc6\x9b\x8e\xbb\xad\x51\x2b\xe6\xad\xe0\x36\x46\x8d\x98\x37\x02\x6b\x35\x5a\x8d\xe5\xd5\x69\x97\x50\xbe\x3e\xac\x01\x9e\xa9\x19\x3e\x64\x25\x4d\xd4\xf3\x66\xb4\x7b\x8f\xe2\x19\x6f\xa8\xb3\xb2\xaa\x23\x92\x11\xa3\x44\xbe\x9a\x3e\x8a\x9a\x55\xad\x61\x45\x69\x2a\x04\xb6\xc3\x42\x51\xe5\x2c\xd1\x11\x95\xbc\xfd\x07\x5f\xbe\x8e\x3e\xf0\x0d\xab\xfe\x71\xd6\x52\x5b\xeb\xb6\xac\xfd\xe2\x50\xe7\xad\xcf\xdc\xd9\x3c\xbd\x96\x79\xea\xc9\xc4\xe6\xf5\x6b\xc3\x91\xeb\xd7\x6f\xce\xde\x75\xc0\x08\xe7\xdc\x4d\x37\xda\x57\x0f\xbc\xf5\x20\xde\x7d\x57\xb8\xc5\x61\x59\x54\x1e\xab\xbd\xe3\xb9\xbd\x4b\x5b\x1f\x7c\xe5\xce\x3d\x6f\x8c\x19\x6c\x1e\xeb\x77\x6d\xa5\x56\x1d\xf5\xd1\xd3\x8f\xaf\xdc\x93\x5e\xa0\xe8\x67\x89\xbc\x9f\xd8\x48\x0d\xc9\x0f\x5a\xed\xee\x2c\x2d\x2d\x4f\x2a\x86\xd2\xcc\x37\x7b\x9b\xf1\x02\x5f\x10\x82\xc1\x85\x8a\xa1\x94\xf7\x97\x4f\x94\x53\xe5\x8b\xca\x4d\xd9\x85\xed\x35\xc0\xd7\xb4\xd4\xbc\x54\x43\xf1\x11\xd0\xd5\x44\x6a\x22\x4c\x89\x5d\xcc\x7a\xac\xee\xcb\x31\xcd\x56\x5a\xa6\x12\x09\xeb\x5f\xb0\x16\x65\xe4\xb8\xb6\xc5\xa8\x64\x0a\xff\x07\x36\x13\x5c\xd7\xb1\x75\xd1\x58\xff\x4f\xbe\x7a\xbd\xee\x73\x1a\x8d\xc5\x29\x1a\xb1\xfc\x4d\xb8\x5b\xd8\x35\xf2\xc9\x37\xae\x69\x3a\x8a\xed\xc8\x0f\x11\xdb\xa9\x46\xf5\xe8\x31\x29\x4e\xb7\x32\x8c\xb1\x2e\x55\x5d\xb1\xb9\x31\xd7\x08\x83\x8d\x23\x8d\xd8\xdb\xb8\xbf\x11\xd7\x06\x53\x46\xc7\x69\x0b\x58\x2c\xc5\xc8\x28\x18\x7d\x46\x4a\x32\xa6\x8d\xd8\xa8\x18\x50\x54\xb0\xa5\x8c\x0d\xc6\x60\xba\xd6\xed\x8a\xba\x30\xef\x02\xb7\x18\x15\x31\x2f\x02\xeb\x12\x5d\x62\xa4\x26\x5d\x26\x44\xd6\x57\x53\x6c\x11\x4d\x4e\x51\x13\x9f\xcb\x8a\x54\xdd\x05\xc9\x10\xaa\xa8\xea\x2f\x9b\x13\x68\xb6\x44\x1f\x58\xde\xbf\x76\x6c\xe3\xa1\x5b\x1b\xa9\xbf\x68\x4f\xf2\x43\x79\x63\x4a\xfa\x02\xb4\xfc\x38\xec\x15\x37\x3e\xfc\xf2\xee\xcf\x36\x2a\x7c\x41\xb3\xa7\x6b\x70\xe1\x13\x9e\x64\xc2\x55\xfb\xdf\x35\xae\xda\x8b\xb3\xb8\xc1\x51\xa9\x55\x34\xcc\xc1\xaf\x25\x5c\x4f\x84\x7b\xe7\xdf\xb5\xe7\xff\x16\xcd\xa0\xe3\xa2\x52\xab\x85\x9b\xc7\xf5\x8d\xe8\x29\x66\x0c\x05\xd1\x6d\x52\x8b\xdb\xcd\xf8\xbb\x44\xbd\x41\x30\x48\x26\x57\xca\x60\xa0\xc5\xb0\x10\x96\xc2\xd8\xa8\x23\x5b\xe8\x21\x6f\xa6\xb4\xa8\x54\x47\xa1\x6c\xcc\x94\x31\x9d\x37\xe5\x4c\xb4\x49\x12\x1c\x29\x93\x89\xd1\x6b\xd9\x39\xca\x84\xa6\xac\x26\x12\x33\x88\x85\xda\x55\x16\x25\xf6\x21\x18\xd7\x5a\x82\x0e\x61\xb9\xbd\xf6\x66\x31\x5e\xbd\xec\xa6\x88\xca\x7d\xfb\x2e\x3b\x77\xa7\x98\xe4\xe7\x7c\xe9\x45\xbc\x5b\xb4\x4c\x8f\x68\x9c\xb8\x1d\x37\xfc\xfd\xb9\x79\x5b\xc5\x3f\xb8\x67\x91\x96\x9f\xf3\x7b\x92\x9f\x73\x97\xd4\x6a\xd4\xb9\x75\xb8\x3c\x20\x78\x03\x10\x08\x78\x18\xb3\xb9\xcc\x9e\x62\x82\x7c\x10\x32\xc1\xdd\xc1\xfd\xc1\x23\xc1\x13\xc1\xd3\xc1\x5c\x90\x43\x7e\xbf\xa7\xb5\x6c\x63\x85\xbf\xb4\x78\xbd\x11\xb9\xc9\x39\x56\x59\xb9\x97\x2f\x73\x88\xeb\x2d\x06\xb7\x7a\x4b\x47\x3b\x7f\x49\xe4\x41\x28\xf3\x7b\xc3\xa2\xb5\x29\xb6\xa7\x31\x41\xb6\x86\x67\xf3\x40\xe5\x79\x18\x03\x33\xb2\xe3\xe8\x96\xbf\xef\x5b\xd5\xb2\xfb\x89\xcd\x6b\x77\xc4\x16\xec\x58\x71\xcf\xde\x40\xdb\x5d\xeb\x7c\x37\x54\x8e\x8e\xc2\xd0\x4f\xf0\x4e\x46\x7a\x78\xf2\x5b\x4f\xbc\x3f\x20\x69\x1b\xc4\x3b\x9f\xcc\x56\x0b\x66\x39\x4d\xb7\xc9\x06\xf8\x73\x3e\x66\x66\x36\x11\x3c\xb3\xbb\xff\x81\xc3\xe3\xb9\x4b\xd2\x6a\xbb\x33\x85\x3b\x0f\xb9\xc0\x25\xb8\xce\x78\x60\xd4\xf3\x13\xcf\x2f\x3c\x14\xf2\xa4\x3d\x98\xf3\x78\xbc\xbc\xbf\xbc\x1c\x75\x06\x7c\xde\xe0\x60\x70\x22\x78\x21\x48\xf1\x41\x6f\x70\x7f\x90\xd2\xf1\xfe\xcb\x38\xe3\xa1\x6c\x59\x93\xcd\x9b\x41\x56\x0d\x70\xbb\x05\xc8\x5e\xd8\x2f\xea\xea\xa6\x0a\x89\xbf\xb3\x88\x81\x3f\x93\x17\x58\xcd\x06\xfe\x50\x3e\xc0\xfb\xfc\xfe\xcf\xe2\x06\xfe\xf1\xa3\x1f\x7e\x8f\xb1\xee\xf9\xdf\x9f\x5c\x9b\x1f\x58\x0d\x3f\x54\x1b\x15\xe4\x87\xe8\xed\x64\x4d\xd0\x21\x35\xe2\xd5\xbf\xb0\xfe\xc6\x8a\xb3\xd6\x5e\xeb\xb0\x75\xc4\x4a\x2f\xb4\x82\xd5\x6a\x28\x72\x3a\x51\xab\xcb\x61\xbf\xa1\xc4\x57\x32\x52\x82\xf9\x12\xd0\x19\x8a\x2e\xe3\xb4\x95\x37\xb7\x73\x45\xf6\xfc\x16\x5a\x41\xa6\x8b\x9a\x4c\x2a\xd0\x32\x11\xe6\x2a\xd4\x70\x22\x06\xfe\x74\x86\xba\xa9\xa8\x54\xa3\x6e\x1a\xbb\xff\xd5\x7d\x57\xe3\x82\x6b\x07\x54\x80\x7e\x2b\x23\xfa\x22\x33\x46\x98\xe9\xa3\x0c\x23\xd8\x4d\x9d\xce\x6d\x9e\x09\x0f\x9c\xf0\x80\xcf\x03\x36\xbe\x53\xd8\x5a\x6a\xc9\xf0\x36\xd0\xd9\x6c\x82\x43\xa4\x04\xab\x3e\xc3\xa2\x52\x15\xf5\x73\xce\xd9\xde\x2c\x92\x07\x28\x90\x64\xd6\x27\x67\x1d\x98\xd9\x2d\x18\xbf\x9b\x4f\x5e\x7b\xfd\x4d\xed\xa0\x6f\xc3\x63\x3f\x93\x91\xe6\x0f\x17\xfe\x13\x7b\x0b\x70\x83\x1f\x2b\x8e\xa2\xfa\x06\xe1\x66\x72\xa3\x1d\x52\x09\x45\x09\x76\x53\xab\xf3\x06\x0f\xf2\xf8\x3c\x38\xee\x91\x3c\x69\xcf\xa4\xe7\x82\x87\xf1\x90\x49\xdc\x22\xa6\x6c\x7c\xab\xb0\xb1\xd4\x92\xfe\xc4\x06\xcf\xd9\x5e\xb3\x61\xde\xe6\xb5\xc5\x6c\x14\x4b\xda\xcf\x0b\x0e\x6e\x3d\x8d\xdc\xb3\xdb\x3f\x8f\xa6\x49\x93\x60\x16\xca\xff\x5c\x09\x86\x89\x13\x2c\x6f\xee\x5a\xe2\xd5\xce\xfe\x5a\x0a\x87\x23\xd5\x37\x3f\xb1\x03\x5e\xce\x1f\x68\x5d\xfe\x0f\xed\x5c\x44\x3d\x57\x1d\x23\x31\xf6\x06\xa9\x0e\x53\x94\x99\xe9\xa4\x01\x89\xf9\x43\xd4\x09\x75\x1f\xe1\xff\xe4\x28\x95\xd8\x7a\x5d\x53\x2c\x51\x1b\x0f\x2a\xbd\x3f\xe7\x18\xf5\x47\x8f\x7e\x78\xf4\xb3\x0e\x52\x0b\x1c\x42\x7f\x22\x31\xf2\x3d\x52\xbb\xd9\x62\xd1\xa1\x56\xde\xf4\x7d\xe3\xeb\x46\x6c\xfc\xff\xee\x20\x55\xf8\x45\x77\xa1\xcd\x73\x0e\x52\x15\x1f\xcc\x1f\xa4\xbe\xba\x6f\xec\xfe\x6b\x1c\xa5\xaa\xb1\xb1\x16\xa3\xdd\x28\xf9\x3d\x9d\x25\x25\x45\xa8\xb3\x78\x4e\x58\x66\xe9\xcc\x1a\x7b\x8d\xc3\xc6\x11\x23\x4d\xa6\x64\x3b\x67\x48\x19\x8b\xc4\x0c\xcb\x9a\x4a\xdc\x97\x3d\x99\x12\xab\xd3\x44\x76\x43\xa7\x5a\x44\xeb\x7c\xd6\xe6\x3a\x32\xd1\x5e\x33\x1a\x56\xa2\x64\xea\xad\xab\xe3\xe1\xe3\x23\x47\x61\xe4\x9a\xd1\x70\x9b\xbc\x1f\x87\xd5\x78\x58\x8b\xc3\x24\x29\xe8\x6e\x75\xb9\xec\xa5\xad\xce\x42\xd0\x65\x6e\x35\x6c\xf4\x14\x5f\xb6\xf3\x69\x86\x31\xba\xd3\x2e\x87\xc3\xc8\xe7\x79\x49\xf3\x31\x6f\xa1\x69\x70\x8d\x68\x57\x69\x58\xe2\x5a\xe1\xee\xd8\xf0\x35\xe3\xdd\xcb\x63\xf2\x43\xd8\xa9\xe6\x91\xb1\x7f\x22\xbc\xec\x87\xc7\xea\xbd\xd0\x84\xc0\xab\x0c\xca\x0b\x4c\x7c\xca\x8b\x74\x26\x3e\x85\xcc\x66\x93\xa0\xb7\xda\x6c\x16\xe5\xaf\x26\x0b\x58\x3c\x8e\x4e\xbb\x28\xf8\x7d\xfe\x09\x3f\xe6\xfd\xa0\x33\x2a\x5f\x10\x4c\x7c\x2a\x64\x04\x23\x56\x2c\xd7\x27\x64\xd4\xd4\x31\xbd\x35\x85\xf4\x26\xca\x61\xb5\x5e\x2e\x03\x10\xf4\xd6\x14\x58\xd4\x9b\x2e\x51\x31\xd1\xd2\xe2\x4c\x44\xa7\xb4\x2c\xf2\x68\x7e\xd4\x56\x7e\x57\x47\xee\x26\x31\x11\x4d\x44\x6b\xe3\xdd\xdd\x7e\x28\xa4\x93\xfb\x21\x01\xea\x28\x17\x10\x17\x2e\xc5\xe4\xea\x0b\x15\x90\x57\xe9\x18\x9a\x66\x5f\x00\x3b\x3c\xcd\xc2\x33\x60\xff\xf1\xe0\x87\x47\x8f\x03\xc6\x98\xa2\x75\xf2\x32\x06\xb5\xad\x69\x79\xa4\xe9\xca\x13\xcc\xd8\xe5\x0e\xfa\x98\x3a\x4e\x53\xf7\x16\x2f\x59\xb6\xbc\xac\x75\xcd\x65\xac\xfa\x01\xf3\x16\x39\x97\x3d\x28\x75\xea\x38\x97\x4b\xf0\x95\x07\x02\x65\x68\x75\x85\xff\x25\xdf\x09\x1f\xf6\x85\xce\x84\xe0\x54\x08\xe2\x21\x29\x94\x0e\x0d\x87\x68\x3e\x04\xac\x95\x5f\x2d\x6c\x0c\x96\x5f\x86\x66\xcb\x75\x96\x2e\x0b\x65\xb4\xb8\x2d\x51\x0b\x65\xb1\x94\x89\xbc\x2f\xbd\xd0\xb5\xd2\xb5\xd1\x45\x31\x2e\x87\x2b\xe8\xa2\x74\x82\x4b\x43\xd3\x53\x7c\x21\x91\x88\x75\x77\xab\x1d\xab\xf1\xb4\x16\x5c\x42\xd4\xf8\xd7\xfd\x9f\xc1\x75\x47\x84\xa7\x77\x5f\x9b\xef\xce\xc2\xe4\xf9\xee\x14\xf7\xf9\xeb\x9c\x77\xaa\x5b\x5d\x63\x0d\x87\x10\xa2\x3f\x56\xd6\x70\xa8\x42\x5b\x93\xf9\xd5\x35\x1c\x2e\x61\x42\x18\x79\x1d\x34\x37\x67\x0d\xb7\x25\x77\x8e\xfa\x3b\xc2\x41\xb0\x52\xe5\x20\x50\xb9\x48\x70\xa3\x18\xc2\xc1\x25\x09\x53\xf9\x2c\x7e\x03\xb5\xec\x68\xbe\x6c\xb4\x93\x94\x4d\x98\x5c\xca\x98\x10\x85\xc1\x51\xa9\x96\x3e\xc3\xd9\xa1\xf2\xe4\x12\x9e\x8f\x95\x2a\xf7\xcb\xaf\x35\xee\x97\xc5\x62\x88\xc2\xb1\x44\xab\x5a\x43\x1e\xbb\x28\x27\x23\xc4\x6e\x22\xf2\x0c\xe4\xbf\xcf\xae\x24\x3c\x22\xc7\xf2\x3c\xfc\xd4\x49\x22\x5f\x44\x95\x2f\x77\x59\x5b\xa3\x8a\x4c\x08\xd8\x22\x13\xa0\xab\xb9\x67\x88\x7c\x29\x55\xbe\x3f\xa8\xf2\x55\x8b\x21\xcc\xd7\xcd\x66\xaa\xc1\x04\x47\xc3\xca\xbc\x43\x50\xc9\xd6\x48\xb1\x8a\x92\x2e\xcb\x6d\x51\x3e\xfa\x68\xf4\xa5\xe8\x89\x28\x1d\x95\x8c\x7c\x2a\xd8\x45\x15\x6f\xaf\x0a\x66\x62\xc5\x99\xe2\xfd\xc5\x54\x71\xb1\xde\x9b\xb1\xd9\x28\x94\xd1\xab\x4c\xd4\xea\xcd\x12\xc2\x4d\x11\xcd\x63\x76\x95\xb3\x5c\x52\x0b\x9d\x1c\x05\xd4\xa2\x25\xe0\xaf\xa1\x28\x02\x4b\x66\x2f\xc3\xf8\x3e\x25\x9c\xee\xdc\xf1\xc0\xda\xe1\x8b\xdf\xdb\xb8\xfe\x3b\x67\x9f\x78\xea\x57\x07\x97\x52\x1f\x71\xd2\xdd\xcf\xad\xe8\x7a\x7c\xd7\x72\xee\xca\x1f\x43\x37\x7c\x8d\xa9\x24\x41\xb4\xcd\x70\xc7\x9b\xf2\xef\xbf\xff\xa2\xfc\xc9\x8f\x7a\x6e\xff\x09\x38\xbe\xbf\xfa\xfe\x37\xbe\xd2\x7a\x79\xbb\x1a\x10\xed\x5f\xa9\xc8\xb2\x3d\x77\x8e\xfa\x15\xbd\x05\x95\xa1\x30\x5a\x21\x55\x96\x8b\x29\x66\x73\xe5\x48\x25\xb4\x54\x42\x20\x55\x2c\x6c\x8a\x04\xd2\x47\x84\x97\x84\x53\xc2\x69\x81\x16\x04\xe4\x4d\x1b\x8a\x8a\xed\xeb\x91\x30\x5f\x8a\x02\xf2\xd8\xac\xd5\xb3\xd2\x76\x15\xfb\x2e\xb9\x94\xb2\xd5\xd5\x13\x11\xe0\xdf\xee\x1c\x7b\x68\xcd\xf2\xbe\xff\xb6\x5d\x89\x50\xf0\x2b\xcc\xe1\x27\x13\x9b\xd3\x6b\xc3\x91\xb5\xeb\x37\x67\xef\x3e\x60\x94\xed\xee\xa6\x0e\x7a\x4b\xdb\x37\xfe\xc7\xc1\x81\x5f\x3e\xbe\x8e\x84\x24\x13\x63\x06\x5b\xa9\xf5\xef\x6c\xa5\x56\xfd\x95\xe0\x4c\x5c\x42\xfa\x41\xb1\x33\xfc\xa8\x66\x67\xab\x09\xe6\x15\x85\x13\x8a\x99\x8d\xe7\xde\x1b\xad\x5a\xea\xb2\xcc\xc1\xbc\x22\xf2\x2a\x76\x86\x07\x55\x3b\xfb\x09\x22\xdf\x20\x14\x43\xe3\xb9\x8b\xa3\x91\xc5\x3c\x33\xcf\x36\xd5\x78\x27\x9a\x8f\x77\xd0\x4e\x12\xef\x10\x0e\x1a\x37\x13\xc2\x80\xac\x21\x35\xe2\x99\xfb\x1d\xe6\x9f\x94\x7a\xd4\x98\x07\xed\x44\xdf\xd4\xb0\xb5\xdc\x2a\xb6\x56\x6e\xd4\x1a\xb2\x70\x73\xda\x96\xca\x9d\xa3\xce\x91\x7a\x4e\xa9\xdf\xc9\x9d\xd0\x30\xbc\x56\xa8\x18\x5e\x17\x47\x17\xad\x53\x13\x8a\x0b\xdf\x21\xdc\xb2\xa4\x9e\xf3\xda\x77\x6e\xd0\xea\x59\xa1\xd6\xf3\xe1\xe8\xa2\x75\x6a\x62\x71\x81\x37\x89\xd4\xc3\x8c\x21\x1f\xba\x4b\xaa\x46\x5d\xee\xd2\x2e\x9f\x4f\x12\x5c\x29\x8f\xdb\xe7\x73\x7b\x28\x73\x51\x17\x73\x5b\xf9\x91\x72\xe8\x35\xf7\x9b\x71\x8b\xb9\xdd\x9c\x31\x53\x66\x9f\x27\x53\xe6\x56\xd1\x74\xcd\x29\x77\xf1\xf3\x08\xfa\x10\xf0\x08\x74\x08\x95\x51\xb6\xac\xc5\xa0\xc2\xe1\x6b\xeb\xf1\x44\x54\x20\x6c\x90\x79\x84\xc4\x58\x2c\x16\x15\xa6\x08\x20\xd7\x3c\x2e\xda\x7a\x8d\x8a\xd6\x9f\xf4\x3b\xe0\xe2\xdd\xc7\x1f\x6e\x5d\x31\xf0\xce\xa1\x3b\x27\x6e\x88\x66\x6f\xbd\xb5\xe6\xe5\x91\x53\xc7\xf7\xc1\xd1\xe9\xa3\xd4\x12\xaa\x99\x49\x6e\x7d\x72\x7b\x76\xf8\x8b\x52\x79\xf5\xf3\xce\x0a\x97\xf9\x5b\x07\x0f\x3e\xf8\x24\xbc\x7b\xf4\x9b\x08\x90\x5b\xb6\x53\x6a\xde\xcd\x56\x69\x29\x6a\xf3\xfa\xda\x2a\x2a\x24\x9b\x2b\xe5\xf7\x56\x54\x78\xfd\x94\xd9\xd5\xca\x6c\x0e\xed\x0e\x1d\x09\xe1\x78\x08\xf8\x10\x70\x66\xc9\x24\xa6\xcc\x15\xfe\x74\xb9\xd7\x83\x7c\xe4\x70\xb6\x9c\xb7\xa5\xf3\xe1\x54\x53\x2c\x9a\x48\x10\x19\xa2\x5b\x3e\x87\x14\x05\xc8\x4e\x55\x8e\x63\x99\x63\x0f\xac\x69\x7d\xf8\xf8\xdd\x77\xbf\xb2\xc8\xbb\xae\x6b\x7b\x7d\xeb\xbd\x9b\xe2\x0d\xb7\x3e\xb2\x71\x17\x3c\x36\xfd\x26\xc5\xc2\xfb\xdc\xb2\xbd\x47\xef\xb8\xf3\xd5\x87\xd7\x54\xa8\x8c\xb9\x35\x9b\x1f\x58\xb7\xe9\x81\x0d\xe1\x07\xe0\x8f\x87\x0f\xe4\x72\xe8\x67\x08\x31\x02\xfb\x86\x35\x04\x93\x04\x9b\xad\x0b\x8d\xc0\x06\xe4\x18\x85\x12\x26\x04\xe3\x39\x79\xd4\x55\x8c\x4c\xf3\x39\x65\x98\xdd\x79\x4e\x19\xe8\x6a\x22\x9c\x32\x16\x8d\xdf\xd6\x64\x9e\xc7\x29\x43\xca\x27\xb6\x36\xa9\xd9\xe7\xd3\x9a\xad\xf9\x55\x5b\x93\x47\x5d\x0b\xd4\x1a\x0a\xb6\xa6\xd6\xf1\x61\x81\xb7\x66\x67\x50\xb5\x34\x47\xde\xa2\x4d\x3e\xb5\x96\x59\x7e\x40\x30\x1c\xc9\x5c\x50\xa7\xd5\xf3\x7c\x7e\x2e\xa8\x25\x73\x41\x64\xb1\x61\x1e\x7f\x93\x8a\x8d\x48\xe6\x82\x0d\x6a\x3d\xff\xa5\xfa\x68\xa5\xea\xa3\xff\x35\xea\x5b\x78\xd5\x77\x34\xac\x48\x2b\x8b\xab\x66\xca\x50\xe6\x03\x1c\x9d\xdb\x0e\xe5\xf3\xd9\xed\xa0\xa9\x04\x13\xa2\x29\xa8\x5a\xfa\xd9\xed\x50\xca\x50\xda\xa1\x32\x4f\xd1\x54\x54\x0c\xd1\x14\x2a\xaf\x9f\xfd\x8d\x5c\x0e\x35\xe7\xce\xd1\x2b\x89\x4e\x7f\xab\xf9\xe2\x93\x9a\x4e\x6b\x54\x9d\x1e\x1d\x0d\x36\xd1\x73\x75\x4a\xf8\xf8\x48\x1d\x8c\xf6\x9d\x46\xcd\x7f\xe3\xaa\x56\xff\x79\x34\xdc\x4c\xcd\x99\xfb\x50\x71\xee\x1c\xfd\x22\xb1\x8d\x8f\x34\xdb\x08\xab\xb6\x51\xa1\xd9\x46\x79\xc0\x86\x66\xd9\x06\xe1\x0f\x52\x6c\x43\xe5\x0f\x82\xae\xd7\xd5\xdd\x97\xa0\x18\x02\x08\x54\xcc\xf0\x07\xe5\xcb\x26\x32\x7c\xa4\xe9\xc9\xaa\xc9\x10\x55\x65\x98\x1e\x2d\xaf\xb7\xcd\x95\x5b\x2d\xff\xc3\x7c\xf9\x68\xe7\x7f\xd3\x18\xba\x16\x28\x22\x40\xa0\x01\xf1\x57\xb7\x9f\xbb\xbb\xd0\xfe\x6d\x68\x7b\x7e\x3c\x25\x8a\x5a\x3f\xb7\x86\x59\x1c\x48\xfe\x82\x0c\xdb\xf2\x2c\x60\x31\xa5\x8e\xce\xab\xea\x20\xe7\x3c\x44\x8e\xd3\x9a\x1c\x1b\xf3\x75\x78\x95\x3a\xf8\xa2\xaa\xab\xfa\x9b\x9c\xa5\x10\xfb\xce\xa9\x72\xb0\x5a\x1d\xe5\x4a\x1d\xba\xe2\x6a\xa7\x61\xce\x38\xfa\x96\xbc\x9f\xdc\xd3\xd3\xa3\xad\x92\xd1\x8e\xe0\x37\x08\x26\x11\x90\x5b\x6d\x52\x52\x67\x4b\x21\x64\x8c\x19\xdb\x8d\xbb\x8d\x8f\x1a\x69\xa3\x24\xba\x52\x5c\xe7\x09\xfa\x14\x8d\x1f\xa6\x81\xa7\xbd\xe4\x66\x1b\xd5\xa9\xdb\x6a\xc0\x19\x3d\x45\x65\x38\xed\xa0\x54\x63\x19\x54\x83\x2a\x42\x1f\x11\xcd\xa8\x3c\xba\x5a\x32\x4d\x80\x5c\xbf\x1b\x19\x39\xce\x8c\x1d\xbd\xfc\x04\x39\x11\xcd\xe7\x1e\x3e\x44\xee\xdd\xe9\xd1\x3a\xa9\xce\x87\xe3\x18\x63\x6c\x9c\x30\xc2\xdf\x19\xa1\xd7\x08\xfa\xd6\x13\xec\x29\x16\x3f\xcc\x02\xcf\x7a\x59\xcc\xb1\x2c\xd3\x8a\x36\x1a\x98\xb4\xde\xa1\xbb\x4c\xa7\x81\x57\x77\x78\x67\x55\x5e\xa0\xa7\xd7\xc8\x65\xc4\x80\xf8\x22\xbe\x49\xee\x1c\x1e\xa3\xdb\x0a\x49\x3c\xea\x5a\x8b\x39\x45\x74\xfd\xaf\x9a\xae\xaf\xe4\x7d\x2b\xac\xf8\x16\x2a\xab\x63\x4b\xe7\xe9\x9a\xf0\x7b\x12\xbb\xa7\xb4\xef\x8c\xe4\xbd\x2b\x2c\xaa\xdf\x31\x98\xe7\x7d\x27\x26\xef\x52\xf4\x6d\x0d\xe1\x35\x64\x4d\x97\x54\x7a\x19\x19\x7e\x00\x5e\x2f\x07\xc2\x62\x31\x99\xcb\x21\xab\xbc\x4b\xd1\x81\x35\x84\xdb\xc8\x33\xf5\xe8\x50\xfe\x19\x73\xfe\x19\x24\xef\xa2\x0f\x33\x63\x42\x08\x35\xab\xe5\x50\x01\xa5\xee\x7f\x00\xcf\x78\x6e\xe2\x65\x9b\x23\x35\x9e\x7b\x66\xd4\xe3\x41\x8a\x7d\xe4\xc7\xcb\x80\xbc\x8b\x16\xe9\x36\x21\x84\xba\xd4\x72\xf1\x61\x84\x90\xf5\x07\x90\xf6\xc0\x78\xee\xf0\xa8\xc7\xc3\x29\x93\x79\x77\x52\xcb\xfd\xc9\x32\x63\x48\x44\x2f\x4b\xe1\xd5\xfc\x26\x1e\xaf\xd1\xdf\xa8\xc7\xf5\x08\x9a\x58\x60\xf5\x3c\xa2\x4d\x14\x05\x71\x11\x5a\x38\xe0\x44\x4e\x64\xc0\x68\x20\xf8\x50\x06\x95\x5b\xc4\xce\x98\x2d\x82\xc5\x82\x41\x40\x00\xbd\xd0\x0f\x13\x40\x41\xfe\xb2\x1a\x80\x4d\xdd\xe8\xd8\x6f\xa3\x75\x88\xcd\xf0\xfa\x08\x05\x61\x13\x50\x26\x83\x5e\x0f\x66\x03\xc5\x80\x55\xbb\x2a\x11\x23\x3c\x06\x62\x62\xaa\x0e\xb6\x68\x27\xed\xea\xdd\x82\x98\xfa\x22\x6a\xc9\x07\x84\x95\xc4\x99\x28\x10\x1e\xe8\x21\x00\x24\x8f\x46\x0f\x24\x81\xe6\xa7\xf0\xed\xf7\xd4\x2c\x8f\xc3\xf2\x69\xb0\xcb\x8f\x69\x99\x1e\xdf\x80\x52\x3c\x3a\xbd\x96\xa4\x7a\x8c\x3e\x8b\xb7\x90\x5c\x8f\xef\xaa\x67\xf3\x1a\x97\x31\x12\xc1\x29\x9d\x50\xf1\x5b\x90\x0e\x19\x79\x96\x81\xff\x64\xe0\xb7\x0c\xd4\x33\xc0\xb0\x9c\xc1\x40\x9b\x41\x10\xcc\x7a\x0a\x2e\x51\xf0\x07\x0a\x9a\x28\xa0\xf0\xed\xec\x3e\x16\x6f\x66\x61\x11\xdb\xc6\xe2\xad\xf8\x8b\x18\x77\x60\x48\xe2\x55\x18\xb3\xd8\x8c\xcd\x2c\xc5\xb3\x26\xf8\x4f\x13\xfc\xd6\x04\xf5\x26\x30\x19\xa5\xa2\xe2\x94\x51\xb2\x88\xa9\xdb\x8d\xfb\x8c\x78\xb3\x11\x16\x19\xdb\x8c\xd8\x68\xb4\x09\xb6\xb8\x0d\x0f\xda\x46\x6c\x98\xb7\x81\xde\x02\x97\x2c\xf0\x07\x0b\x28\x41\xee\xed\xfc\x3e\x1e\x77\xf0\x90\xe4\x57\xf1\x98\x37\x1b\x84\x76\x9a\x3b\x0f\x60\x04\x37\x44\xa1\x0b\x6e\x07\x86\x05\xc0\xbc\xd1\xc1\xa8\x4c\x68\xda\x36\x07\x41\x7e\x24\xeb\x9a\x37\x08\x7d\x4b\xf7\x1e\xe1\xbf\x2b\x7f\x45\xa3\xe4\xef\x3c\x18\xa1\x96\xc6\xf1\x86\x7a\x07\x50\x24\x54\x57\x09\xed\x4f\x55\xe9\xb5\x71\x9b\x9f\xa4\x72\x80\xdf\xe1\xd7\x54\xde\x03\x48\x3e\x45\x92\x39\xde\x01\x5a\xfe\x4f\x68\x3b\x45\xd2\x39\xa0\x4d\xbe\x8c\xf7\xc1\x29\x79\x3b\x1c\x96\x6b\x0f\xc9\x16\x18\x95\xd7\xc2\x9f\xd4\x1c\xd1\x43\x08\x51\x7f\x26\xf7\x1f\x08\xc7\x2c\x5b\xdc\xa9\xdf\xe6\x3e\xe2\x06\xc1\x0d\x8e\x2e\xb4\xbd\x84\xcf\xb4\xb0\xed\xec\x6e\xf6\x08\x7b\x82\x3d\xcd\xb2\x2c\xcb\x15\x67\xf4\x56\x8e\x2a\xdc\x6e\xd7\xa0\x9d\xc8\xe2\xdd\xb6\x70\x29\x26\x07\xba\xfe\xf2\x1a\xac\xa5\x75\x16\x35\xc3\xa1\x86\xfd\xa7\x86\x1e\x7f\x5d\x7e\xfc\x2b\x3f\xfa\x9b\xc5\xf8\xe5\x07\xbb\xbf\xda\x55\xf3\xf7\x2f\x1d\x81\x17\x36\x0f\xed\x59\x8e\x7b\x3e\x6d\x5b\xd2\xfb\x0c\x64\xdc\x8b\x6f\x5e\x3d\xf0\x70\x7e\xde\xc4\xac\xdd\xca\xa2\x56\xb5\x8d\xb9\x73\x6c\x33\xd9\x13\xae\x43\xb7\x4a\x2d\x2e\x7d\x5d\x67\x49\x89\x58\xde\x09\xdb\x16\xf2\x0b\x61\xf7\xc2\x23\x0b\xcf\x2f\xa4\xa4\x85\xe9\x85\x98\x5f\x08\x6c\x55\x97\xb8\x3d\x51\x91\x71\x06\x02\x2d\xce\x76\xe7\x6e\xe7\x09\xe7\x69\x27\xe3\x74\xba\x28\x4f\x75\x56\xcf\x5a\x6c\x1a\x26\x69\x53\xac\x3b\x11\x13\xa6\xf2\xc4\xce\x1a\x4d\xd6\x54\x93\xca\x43\xad\x2e\xcd\xc8\x46\x70\x32\x2f\x94\xba\xcd\x93\x14\x19\x4d\x30\xf2\x17\xdb\x5c\xdd\xf5\xb5\x2d\x77\x3d\x15\x75\xb5\x6c\xb8\xad\xe5\x57\xbf\x59\xf6\xd5\x5f\x3d\x71\xff\xeb\xb7\xdd\xbc\x20\x95\x28\x9d\x3e\xfe\x60\xf7\x23\x5d\xd5\x7f\xf3\x95\x15\x5d\x8d\x4e\x2a\x2d\xbb\xd6\x3f\xb2\x7d\xd1\xcd\xd7\x87\x5a\x6a\x8a\xff\xc7\x2f\x6f\xfb\xfb\xbb\x16\xe3\x9e\xcb\x2f\xf7\xee\x28\x6b\x4a\xd7\xc1\xd9\xa3\x65\x2b\x6e\xbf\xbe\xff\xcb\xc1\xa5\xd7\x57\x6a\x31\x22\xdb\xc9\xda\x51\x1d\x5a\x81\x6e\x92\x9a\x84\x05\x8d\xad\xe9\x1a\xa8\xa9\x71\x53\xad\xec\x0d\xab\x76\xaf\xda\xbf\xea\xc8\xaa\x53\xab\xce\xaf\x62\xa4\x55\xc0\xaf\x8a\xad\xc2\xec\xb2\x94\x7b\xd3\x4a\x9a\x4e\x2c\x4d\x07\x7d\xc2\x02\x84\x12\x69\xc1\x58\xa4\x41\x8e\xb6\xa8\x69\xd0\x79\x61\x35\xae\x3b\x02\xac\x17\xac\xab\x4f\xaa\x1b\x96\xe4\xc0\x22\xa0\x6d\x1e\xe5\xf1\x11\x13\xa1\x70\x0d\x28\x0f\x94\x51\x7e\x25\x8a\xd4\x76\xfc\x1d\xf6\x22\xfa\xbd\xdd\xb7\x8c\xc5\x6e\x7a\xa4\x6b\xd9\x6d\xeb\x97\x38\x59\xf7\xca\xae\xfb\xd6\x77\x1f\xbe\x73\xf1\xe2\x3b\x0f\x77\x37\x67\xaf\x6f\x76\xaa\x97\xf5\x81\x5f\xb0\x7e\xfa\x68\xe1\x7a\xfe\xc1\xfd\xfb\x1f\xfa\xf2\x97\x21\x29\xbf\xb1\x63\xe8\x96\x9a\xb2\xfa\xb6\x05\x95\x6d\x0d\xbe\xd4\xa3\xbf\xf8\xda\xd7\xdf\x1f\x5c\x53\xa2\xde\xd9\xaf\x17\x61\xf4\xf2\x63\x4b\x77\xae\xab\xae\xd9\xf2\xb5\x0c\xb9\xa4\xff\x2f\x3f\x7f\xf7\x1d\x65\x5c\x58\xa7\xc4\xe9\xcc\xdb\xa8\x05\x1d\x90\x36\x99\xbb\x7c\xa8\x2b\x1a\xf4\x71\xbe\x68\xd4\xc7\x51\x45\x89\xce\xfa\x6d\xcb\xf6\x2f\x7b\x74\xd9\x91\x65\xe7\x97\xe5\x96\x31\x68\x99\x6f\x59\x7c\x19\xd5\x5b\xd4\x5f\x84\x5b\x8a\xda\x8b\x70\x51\x91\x14\x64\xb3\x1c\x5a\x08\x0b\x17\x9e\xe6\xe0\x79\x0e\xfa\x38\x50\x53\x69\xdd\xf1\x4c\xb3\xcd\x61\xcd\xba\x67\x02\x6c\xf5\xbc\x2d\xd6\x2d\x4c\x35\x11\x8a\x4e\x4d\x73\x64\x1d\x6f\x6d\xd2\x16\xf2\xd7\x42\xda\x2f\x00\x47\xaa\x68\xed\x24\xb3\x79\x96\x92\xa9\xca\xe4\xb6\xc7\xba\xe7\x42\xe7\x87\x6e\xf9\xe2\x43\xad\xbb\x8e\xee\x69\xca\x63\xe4\xbb\xea\xda\x1b\x76\xdf\xf2\x6a\xe3\xf6\x6f\xde\xb8\xf9\x5b\x77\x2c\x86\x83\xd7\xef\x5a\xed\x9f\x8d\x86\xef\xad\xaf\x74\xd5\xdf\x7c\xa0\x7d\x16\xee\x7d\x5b\xcf\xb2\xb2\x7b\x1f\x84\x9f\xc9\xd5\x8a\x72\x63\x5b\x9f\x56\xf7\x43\xd3\xb9\x73\xcc\x77\xe9\x2d\xa8\x19\x3d\x28\x05\x1c\xad\xc8\xb7\xba\xb6\xbe\xb6\x18\xd5\x16\x17\xd7\x22\x2a\xac\x6b\x35\xde\xb0\x84\x5f\x02\x93\x4b\xe0\xc4\x12\x88\x2f\x81\xb0\x32\x55\x54\x5a\x1d\xa9\x4c\x18\xc2\xe1\xc5\xf5\xc5\xe9\x12\xbd\xfe\x74\x09\x3c\x55\xf2\x5c\x09\xce\x5f\xf6\x66\x42\x81\xf4\x02\x81\x49\x0b\x1a\xce\x7d\xfe\x20\x25\x96\x57\x56\x34\xef\x54\x44\x5d\x62\x41\x5f\x57\x69\xe3\x1a\x30\xf5\x73\xf4\x47\x6d\x70\xd4\xa6\x9b\x77\x64\xc7\x62\x99\x47\xb3\x37\x0d\x6e\x4d\xce\x45\x9d\x8f\x5c\xbf\xa1\x33\xb9\x69\x70\xc7\xa2\xd2\xc4\xea\x68\xdd\x17\x16\x97\xc3\xda\xf0\x9a\x46\xff\x8c\x8d\x45\x37\xee\x6b\x9f\x0d\x25\x6f\xf3\xd8\xf4\xa1\xb6\x5d\xab\x55\x38\x7a\x7d\xe5\xd2\x0d\xc4\xae\xe4\xfd\xf4\xd3\xcc\xdb\xa8\x16\x3d\x24\x6d\xe4\xbb\xc2\xfa\x72\x7d\xb9\xde\x05\x9d\xbd\x35\xfd\x35\xb8\xa6\x06\x75\xc6\x62\x09\x94\x80\x89\xc4\x64\x02\x1f\x49\x00\x4a\xf8\x12\xf1\x04\xd5\xeb\xea\x77\xe1\x16\x57\xbb\x0b\xbb\x5c\x75\xf1\xcb\x61\x5d\xf6\xb4\x1e\x9e\xd7\x43\x9f\x1e\x78\x3d\xe8\xf4\x7a\x70\xda\xb3\x1e\xba\x26\x03\xd6\x39\x6a\xea\x9e\x6a\x6a\xc9\x9b\x14\xb9\x03\x33\x55\x17\xd3\xc0\x40\xac\x4d\x53\xe4\x1a\xcc\x5f\xb5\x2b\x0f\x24\xc4\x00\x75\xee\xf5\xc6\xdb\x1e\xff\x6b\xb6\x34\x32\x02\xc3\x2b\xb6\x2e\xf3\xfd\x15\xf3\xf9\x74\xfa\x43\xd5\x5e\xe4\x87\xa8\x3f\x91\x33\xee\xaf\x4b\x25\xa6\xd5\x9e\x72\x0f\xeb\x61\x3d\x36\xd4\x5a\x59\x59\xdd\xea\xab\x8a\x57\x49\x55\xd9\x2a\xba\x4a\x31\x13\x0b\x6f\x4b\x55\x55\xc5\x26\x62\x93\xb1\x33\x31\xca\xa6\xbc\x55\xad\x58\x8e\x0d\x6c\xb6\x9a\xe8\xe5\x72\x26\x7d\x9a\x85\xa7\xd8\xe7\x58\xdc\xce\x66\x58\x6c\x64\xdd\x64\xe5\x88\xac\x7c\xda\x25\x54\xe6\x8f\xb0\x0a\x6a\xf9\xbd\xa6\x96\xa8\x96\xc1\x55\x17\xcb\x2b\x45\x98\x52\x99\x57\xff\xa2\xa9\x10\x95\x88\xf8\xe9\x07\x3f\xdb\x42\x16\x6c\x68\x09\x0d\xbf\x0a\xd1\x2d\xdb\x3e\xcb\x22\x08\x41\xc1\x37\xf3\xe7\x5e\x28\xf7\x7b\xf6\x1c\x33\x86\x6a\xd1\x63\xd2\xb6\x5f\xb1\xff\xc6\x62\x96\x03\xf8\x15\xfc\x27\x60\xe8\x2c\x75\x0a\x82\x2b\xf5\x88\x13\x9c\x02\x67\x49\x39\x4b\x6b\x3b\xcb\x46\xca\xe0\x4c\x29\x8c\x96\xfe\xa4\xf4\x17\xa5\x14\x2a\x4d\x97\x0e\x96\x0e\x97\xd2\x5c\x69\x59\x69\x99\xa5\xa2\x33\xbc\x2d\xd1\x9e\xd8\x9d\xd8\x9f\x38\x92\x78\x29\x71\x3a\xc1\xfa\x12\xc0\x27\xc0\x12\x0c\x5a\x21\x53\x4a\xf9\xad\xd9\x05\x46\x15\x20\x95\xec\xec\xe7\xf7\x3f\xc4\xc2\xe1\xbf\x30\x25\x26\xa2\xdd\x51\x61\xaa\x7b\x4f\x5d\x77\x6d\x1c\x3e\xf3\xb4\x52\x25\x0f\x9f\xe5\x64\x7f\xed\xe8\xf2\xd6\x3b\xf3\x83\xcd\x63\x3d\x8b\xfe\xc2\x19\xe6\xe5\x77\x1f\xbc\x77\x66\x88\x59\x90\x7d\xea\x0e\xed\x3c\x33\x77\x8e\x45\x84\x9f\xe6\x26\xa9\x09\x56\x8b\x91\x56\xdb\xb0\x0d\x3e\x12\xe1\x27\x22\x0c\x8a\xc3\x22\xae\x10\x41\x10\x41\xb4\x89\x36\xbd\xbb\xb5\xec\x86\xaa\xfd\x55\xa7\xaa\xce\x57\x51\xfa\xd2\x52\x13\xa4\x45\xde\x65\x6a\x0f\xb0\x45\x73\x64\x9f\xcd\x88\xac\x88\x4e\x86\x8f\x6b\x1c\x69\x5e\x3d\xa2\x5c\xf3\x80\x73\xf6\x28\xf2\xcd\xed\xf5\x57\x9d\x75\x4e\x2f\x59\x76\xcb\x32\xdf\xcc\xb8\x51\x73\xcb\x13\x3b\x50\x9e\xe3\x91\xab\x26\xe7\x49\x37\x49\x0d\x6e\x5b\xe7\xb0\x62\x17\x4e\xb6\x53\xbf\xcd\x3b\xe1\x85\x97\xbc\x27\xbc\xd8\xe7\x05\xde\x0b\x25\x45\x9d\x4e\x92\x59\xc9\x71\x7c\x09\xe8\x4a\x4a\x9c\xa5\x2e\xca\x69\xa5\x32\x16\x82\x3d\xaf\x2d\x02\xf3\xcb\x8e\x59\xb4\xc8\xdd\x2a\xe9\xc2\xfc\x4e\x9b\x75\x52\xf7\xfe\x2d\xbb\xef\xbc\x75\xac\x71\xfb\xe0\x8d\x1d\xdf\xec\x59\x34\xbd\xfd\xf8\x71\x7c\xf8\x38\x1c\x9c\xdf\x19\x50\x3d\xfb\x1e\x64\xee\x1c\xfb\x08\xdd\x86\xbc\xe8\x0e\xa9\x15\x97\xb4\x32\x4c\x99\xb9\x55\xb8\xc1\x8f\xfc\x3e\x3f\x96\xfc\x69\x7f\xbf\x7f\xd0\x3f\xe2\xbf\xe0\x67\x79\x3f\x80\xa7\xb5\x6c\xa3\xaf\x34\x0d\x16\xcb\x27\x00\xcf\xc1\x6b\x80\x79\xf0\x42\x0c\x28\x16\xa0\x8c\xf2\xf2\x65\x0e\x43\xda\x51\x34\x4b\x8e\xee\xd9\x92\xe4\xd7\x4f\x05\x7a\xe7\xab\x7a\x65\x09\xc1\xac\x81\xad\xd8\x3f\xa6\x74\xc5\xce\x0c\xe9\x8a\xae\xc7\xb6\xd7\x4f\x9f\x1e\x53\x0f\xf1\xae\xd5\x05\x77\xca\xce\x59\x7c\xc0\xcc\x06\xe6\x6d\x54\x85\x5a\xa5\xca\xaa\x2a\x53\x65\x17\xd8\x25\xbd\x25\x65\xb7\xc3\x6d\x0b\x4e\x2c\x80\xde\x05\xe0\xed\x32\x6d\x8f\x56\x65\x10\xaa\x28\xc9\x38\x44\xba\x22\xc3\xd9\xd4\x24\x35\x6b\x53\x2c\xbf\x54\xfd\x5d\x5d\x2c\x2a\x14\xb0\xa5\x66\xe3\xfb\xd7\x57\x5c\x75\xe7\x6b\x29\x4e\xfa\x29\x27\x6e\x5e\xfe\x8d\x5f\x3f\xfd\x9d\x3f\x1d\xdd\x94\x19\x03\xe3\xf7\x77\xff\xbc\x23\x55\xf1\x85\x8e\xee\x9a\xfb\x7f\xb8\x7f\x79\x7d\xef\xf7\xf7\xde\xf1\x78\x77\xa5\x3c\x80\xff\xbc\xe9\x98\x2c\xbf\xd4\xb5\xe3\xc7\xe0\x7c\xf1\x05\x28\xfa\xf1\x8e\x05\x55\xdf\x15\xcb\x9c\x96\xf5\x43\xff\x72\xe8\xcb\x1f\x3c\xbd\x69\xf9\xbd\x47\xb7\xaa\x5c\xeb\xf4\x3e\x7a\x0b\x8a\xa0\x07\xa5\xce\x48\xc4\x14\x6e\x05\xbb\x64\x12\x15\x39\x36\x57\xd9\xab\x2a\xaa\xf0\x6f\xaa\x2e\x56\xe1\xc9\x2a\xc0\x52\x55\xba\xaa\xbf\x6a\xb8\x6a\xa2\x8a\xf1\xa4\x4c\x9b\x2a\x23\x69\x24\x39\x8a\x53\x6f\xa3\x8f\xd0\x27\x88\x7a\x0e\xbd\x86\xf0\xa3\xe8\x08\xc2\x46\xe4\x46\x51\x44\xb1\x08\x95\xbb\xd2\x0e\x51\x28\x4f\x73\x45\x05\xc1\xc9\xd0\xa1\x9e\xa4\xa9\xc7\xab\xf3\x34\x30\x9b\xeb\xe3\x2a\x7c\xf3\xa4\x1f\xef\xc3\xa8\xa9\xef\xf8\x83\x07\xdf\x1e\x58\xb9\xf6\xf1\x8f\x1e\xdd\xfd\xff\xbb\x7e\xe9\xe2\x6f\x75\xdd\xfc\xf8\xb6\x85\x95\x9b\x0e\x6e\x59\xff\xc5\xb6\x80\x3c\x8e\xdb\x56\x7e\xf9\xe4\xa1\xd6\xf6\xbf\x7d\xef\xe1\x2f\xbf\xf7\xad\x74\x30\xfc\x75\x4f\xe5\xa2\x5d\xdf\xb9\xa5\xfb\xdb\xbd\x4b\xab\xd3\xbd\x2b\x49\xfe\x78\xee\x1c\xfd\x33\x66\x0c\x15\xa3\x6d\x52\x4c\x71\x1f\x77\xbb\x7b\xbf\xfb\x88\xfb\x25\x37\x8d\xdc\xf0\x92\xeb\xbc\x0b\x3f\xec\x02\x97\x0b\x75\xda\x24\x72\x03\x47\xe7\x70\x6c\xb6\xdd\x66\xbb\xd7\xa6\xce\x2c\x02\x67\x48\xd9\x8a\x1d\x99\x22\x8e\x2b\xa2\xf2\x4e\x45\xd0\xce\xe6\x5e\x72\xea\x2e\x10\x0c\x5c\xed\x50\x6a\x62\xf8\x2d\xbb\xef\x54\x46\x3b\xc5\x99\x76\x2c\x52\xd3\xc3\xaf\xf6\x25\xea\xf1\x7c\x9e\x78\xee\x1c\xbd\x9b\xe4\x15\xec\x92\xda\x14\x0f\xf2\xf0\x1e\x38\xe5\x39\xef\xc9\x79\xa8\xb8\x47\xf2\x64\x3d\x14\xef\xf1\x7a\x30\x4f\xc1\xcf\x29\xe0\xa9\x13\x14\x66\x29\x8a\x69\x2d\xc9\xa2\x5e\x34\x89\x28\x2f\x89\xe9\x4b\x84\x12\x5c\x62\xb1\x80\xe2\x45\x34\x52\xf7\x4b\xea\xc8\x3a\x73\xd6\x15\xa8\x2d\x24\x28\x24\xde\x54\x1b\xb7\x91\x7c\xf0\xab\x87\x37\xb1\x92\x4a\xca\x6f\x90\xf1\x2c\xf3\x2a\x19\xcf\x1e\x53\xc6\xb3\xc3\x87\xa7\x7f\x75\xb5\xff\xe0\x24\x91\x61\x77\xee\x1c\x6d\x62\xde\x46\x4d\xa8\x7b\xd4\xd6\xb5\xb0\x84\x6c\x32\xd5\x38\x4b\x52\xa8\x04\x95\xc4\x0c\x86\x70\xf3\x91\x66\xf0\x75\xc5\xb6\x2f\x5a\xe8\xce\x3e\xef\x82\x3e\x17\xf0\x2e\xd0\xb9\x5c\x4c\x20\x1b\xaa\xb2\x59\xb2\x46\x86\x80\xec\xe7\x01\xbe\x94\x25\x8c\x7a\xec\xfc\xdf\xeb\x62\x2a\xdf\x2e\x59\xb9\xd8\x66\x80\xd5\x0b\x66\xd4\x0c\x8e\x42\xc8\xa4\x5d\xb4\x54\xcd\xad\x21\x59\x43\x3d\xdd\x7c\xf7\x73\xbb\x52\xfb\x76\x74\x86\x6e\xba\xee\xbb\xb7\x35\x65\x56\x86\x16\x6c\xfe\xf2\xe6\x1f\x9f\xe8\x7e\x6c\x5b\xf2\xf9\x67\xef\xf8\xf9\x17\xbe\x30\xd1\xdf\xff\xe3\x87\x96\xd7\x66\x0e\x6d\x6e\xeb\xdb\x58\x4d\x67\xdb\x0f\xdc\x5c\xef\xaa\xac\xf7\x3e\x50\xbf\xa2\x6c\xd1\x17\xea\x97\x6e\x4d\x85\x9f\xf4\xaf\xd8\xb6\xe2\xd0\x37\x6a\xa3\xcf\x87\x82\x8b\x77\x3f\x9d\x4d\xed\xdb\xb2\xc4\xc8\x9a\x9a\x3a\xee\x55\x64\xbf\x29\x77\x8e\xda\x49\x6f\x41\x0d\x68\xd7\x68\xdd\xea\x32\x08\x28\xb2\x2f\x71\x96\xa4\x02\x10\x00\x57\x94\x6f\x9a\x6c\x3a\xd3\x74\xa1\x89\x7a\xb4\x09\xa4\x26\x60\x5a\x5d\x9b\x1a\x3d\x38\x7d\xbe\x01\x9e\x6b\x78\xad\x01\xf3\x0d\xde\x86\x58\x03\xc5\x36\x34\x18\x62\xe9\x05\x11\xc1\x90\xe6\x6d\x45\x9a\x2a\xac\x73\x54\xd1\xad\x28\x43\x9c\xd1\x85\x22\x36\x5b\x40\x65\x9e\x27\xf7\x1c\x77\x53\x9f\xc2\xcf\x3c\xf8\xd5\x03\x95\xab\xb3\x0d\x89\x9b\x37\x5f\x5f\xb6\xf8\xa5\xbb\xef\xfc\xee\xed\xc9\xc8\x8a\x1b\xe3\xd1\x35\xc9\xb2\x45\x3b\x06\x37\x75\x7e\x37\xdd\x72\xdd\x43\xad\xdb\x77\x85\x56\x66\x9a\xf0\xc1\xa7\xba\xb6\x24\x56\x55\x59\x2d\x45\x65\xc2\x77\x3d\x91\xf8\xa6\xbe\xd6\x25\x5d\x52\xa5\xd9\x68\xa9\x6c\xbe\xbe\x6e\xf5\xae\xb6\x50\x30\xfc\xb7\xe5\xa1\xeb\xaf\xaf\x96\xc2\x56\xa4\xee\x5b\x31\x31\x66\xcc\x1a\x82\xf7\xb4\x7d\xab\x71\x84\x90\x79\x14\xa0\xb6\x16\x91\xcd\x2d\x15\x67\x46\x90\x77\xd1\x6b\xe9\x36\x6b\x08\xfe\x43\xdb\xab\x7a\x5f\x7b\x2e\x14\x2a\x3c\x87\x18\x34\x98\x1b\xa0\x5d\xac\x80\xac\xa8\x08\xb9\x91\x17\x55\x20\x64\xf3\x27\x13\x0e\x5a\x14\x18\x07\x2d\xda\x59\xce\x11\x48\xfa\x6d\x09\x31\xc0\x88\xf5\xc9\x85\x90\xff\x65\x10\xb2\x03\xd0\x27\x7f\x00\xe9\x0f\x4e\x0e\xc8\xc3\x13\xc3\xc3\x10\x19\x97\x7d\xca\xcb\x07\xcc\x78\x47\x36\x22\x4f\xc8\x17\xe2\xba\x46\xf9\xcc\xf8\x19\xa1\xaf\x8f\x4a\xc1\xa4\x4e\x96\x7c\x27\x47\x2e\x8f\x63\x41\x27\x23\xdf\xd9\x49\xf5\x0c\x7a\xfa\x7d\xfa\x63\xe6\x87\xf9\x73\x62\xd8\x0e\x6e\xa5\x9d\xaf\x52\x18\xf2\xe7\xcf\x44\x9e\x2d\xd3\xef\x53\x4f\x93\xbb\x98\x2b\xd5\xe7\xd0\x0f\xb5\xe7\xec\xf9\x93\xe7\xa4\xb6\x0f\xc9\xc6\xb8\xbd\xd6\x10\x8a\x93\x3d\xc5\x7b\xe0\x3e\xd8\x48\x76\xba\xc3\x4c\x08\xae\x2b\xf1\xe9\xf9\x39\x67\x20\x2f\x22\xc4\x1e\x24\x7b\xca\x69\xed\xf9\xb7\xb4\xbc\xc4\x45\x62\x08\xee\xaf\x4e\x14\x45\xe7\x3c\x6f\x47\x88\x95\xb9\xbb\xad\x21\xb4\x88\x3c\xbf\x02\xfd\x9b\xba\xef\x1e\x25\xfb\xee\x2f\x8c\xd6\x46\xcb\x2c\xb3\xf6\xd2\xed\x08\x31\xff\x4a\xca\xef\x54\x79\xfe\xd7\x92\x33\x99\x38\x39\x93\x79\x66\xb4\x3e\x2e\xd6\xfc\xc5\xf2\xef\x81\x61\xed\xcc\xba\x81\x09\xc1\xd6\x68\xed\x4c\xe9\xe8\xea\xf2\x95\xe7\x9d\x5a\xfb\x17\x8b\x21\xd8\x11\xaf\xbf\x66\xf9\xd1\x42\xf9\x3b\xa1\x49\xdb\xdb\x5f\xc8\x68\x27\x38\xd1\x96\xb2\xb9\xe7\xa5\xa4\x0e\xb2\xb7\xdf\xa9\xed\xd3\xbe\xa0\x9d\x4f\x34\xe5\x4f\x7d\xe2\x2b\xd5\x7a\x66\x78\x85\xe4\xa1\x39\xfd\x7a\x07\xfd\x9e\xda\x2e\xec\xb2\x87\x31\x72\xb8\xe7\xe7\x16\xc8\x43\x73\xfa\xf7\x0e\xc2\x69\xa3\x3c\x5f\xef\x0c\x63\x73\xa2\x69\x26\xbb\x60\x56\xee\xc2\x54\xa1\xfc\x9d\xf4\xbb\x5a\xee\x82\x9b\x09\x61\x7f\xd5\xb5\x72\x17\x9e\x66\x1f\x2d\x94\xbf\x93\xde\xab\x95\xaf\xc8\x50\x9f\x4a\x5c\xb3\xfc\x77\x0b\xb9\x11\x0b\xe8\xb7\xb5\x73\x65\x87\x7a\xae\x9c\x1b\xf5\x38\xe8\xb9\x67\xb7\x5b\x72\xe7\xe8\x56\x76\x7f\xbe\x8e\x83\x0b\xe8\x43\x48\xcb\x60\x48\x88\x21\x0a\x27\x9a\x13\xb3\x33\x18\xae\x59\x4f\x75\xa1\x1e\x4f\xbe\x9e\xa0\x67\x5e\x3d\x56\x22\xcb\x4c\x3d\xd5\x33\xf5\x34\x93\x7a\x56\x34\x5f\xbb\x1e\x5d\x5b\xa1\x9e\x9a\xcf\x29\x0f\xcb\x5e\x2a\xd4\x53\xf3\x79\xe5\xd1\xdd\x52\xa8\x27\xf6\x39\xe4\x21\x7d\xc3\x09\x85\x7a\x62\xf3\xe4\x31\x5e\xab\x1e\xc5\xbe\x88\x9f\x54\x20\x24\x84\xe1\x46\xe4\x85\x0d\x05\x3b\x0b\x4a\x02\x55\x6d\x0f\x13\xd9\x50\x55\x9c\xe6\x82\x73\x24\x24\xfd\xac\xfa\x27\xb1\x3b\xe2\x3f\x2b\x11\x12\x42\x70\xe3\x2f\x66\xac\xaf\x5c\x2a\xa2\xae\x73\x86\x89\xb0\xe6\xd4\x3a\x53\x79\x10\x07\xf3\x4d\xc9\x17\x31\x23\xb3\xad\x20\x73\x9c\xc8\x4c\xda\x1f\x52\x84\x46\x95\xfe\x6b\xe7\xba\xb0\x6f\x14\x64\x8e\xd3\xfb\xf2\x32\xaf\x54\x64\x2e\x6b\x6d\xf9\x0c\xdd\xce\xd4\x53\xfb\x7f\x51\x4f\xed\xe7\xae\xa7\xa3\x50\x4f\xdd\x4c\x3d\x25\xa4\x9e\xb9\x96\x32\x53\x0f\xc7\x16\xea\xa9\x9b\xa9\xa7\x91\xd4\xf3\x39\x6c\x25\xf1\xb9\xeb\x99\xb1\x95\xc4\xfc\x7a\xd2\x5b\x3e\xc3\x56\xba\x0a\xb6\x92\x45\x7e\xd8\x55\xb0\x15\xa5\x97\x6b\xec\x61\x52\x25\x8a\xd6\x2a\xb6\x52\x48\x7d\xd2\x7a\x39\x6f\x27\xcc\xbf\x17\xec\x24\x3b\xcf\x4e\xd6\x3a\xc3\xa4\x01\xe6\x35\xed\x8a\x9d\x94\x2d\xb9\x86\x9d\xbc\x25\x0f\xa9\x67\x57\x6a\x3e\x12\xdc\x41\x3f\xaf\x8d\xd5\xbc\x3d\x0c\x94\xc9\x3a\x3f\x1f\x49\x1e\xa2\xa6\xc8\x98\x98\xd2\x9e\xff\x27\x6d\xcc\x8a\x3a\xc3\x38\x1e\xa9\x61\xe6\xce\x65\x04\xf7\x94\x8c\x89\x11\x6d\x8c\xfb\xa6\x36\x77\x58\x99\x10\x98\xfd\xd7\xce\x77\x7a\xb4\x50\xfe\x4e\x7a\x48\x2b\xbf\x46\x0c\xe1\xea\x25\x91\x6b\x96\x9f\x2c\x94\xbf\x35\xf7\x0b\x75\xee\xb3\x93\xb9\xef\xf2\xa8\x23\x00\xb3\xcf\x9c\x49\xf9\xcc\xbf\xe6\xf3\xa9\x60\xeb\xaf\xd5\xd2\xe3\x62\x08\x97\xd5\xb6\x30\xb3\xcf\x9c\xdf\x42\x88\xbe\x89\x8c\x83\x11\x6d\xec\x7c\x46\x9b\x97\x4c\xf9\x33\x67\xbb\xd6\xfe\xc2\xb8\xb1\xa7\x30\xde\xa6\xe6\x8f\xb7\x11\xc5\x16\xa8\xb8\x26\xc1\x2c\x5b\x08\x13\x19\x66\xea\xa9\x2e\xd4\x63\xcf\xd7\x53\x6a\x9f\x57\x8f\x95\xe8\x69\xa6\x9e\x59\xe3\x6d\x9c\xd4\xd3\x18\xbf\xaa\x1e\x45\x1e\x37\x19\x6f\x23\xda\xd8\xf9\xf9\xe4\x51\xc7\xdb\xd4\xfc\xf1\xf6\x33\xe5\x21\x7d\x42\x7c\x28\xa2\x8d\x9d\x7f\x5d\x1e\xd2\x2f\xc4\x87\x52\xf3\xc7\xdb\xcf\x96\x47\xb1\x5d\x32\xde\x46\xd4\xf1\x36\xf7\xff\xd7\xc6\xdb\xe7\xd5\xf1\x16\x57\xd8\xc3\x44\x36\xca\x1f\x56\xea\x9b\x2d\xe1\xac\xf1\x96\xd8\x34\x19\x6f\x53\xea\x78\xfb\xeb\x19\x4f\x50\xfc\x48\x72\x86\x89\xb0\xa5\x4b\x56\x30\x7c\x70\x46\xe4\xd9\x7e\x44\xf2\x18\x89\x9d\xab\x3c\x87\x3b\xa9\x91\x59\x76\x6e\xbb\xca\xce\x6f\x41\x08\x7e\x45\xec\xfc\x3f\xb4\xe7\xb7\x68\x7e\x67\x10\x43\x60\x2b\xa6\xe7\x3d\xbf\x41\x1e\x22\x79\x92\xf9\xf2\xef\xa0\x14\xbf\x73\x8c\x12\x37\x25\x39\x2e\xd6\x39\x76\xfe\x8c\x3c\x04\x7b\x99\xdf\x5a\x43\x68\xad\xf6\xfc\x2e\xf2\x3c\x76\x38\xc3\x78\x3c\x27\x8f\x5a\x5d\xf4\xec\x3c\x9d\x07\xe4\x21\x92\xa7\xa2\xe5\xc3\xc0\x1d\xcc\x4d\x79\xbf\x56\xd6\x46\x91\x1a\xc3\x55\xe3\x00\xc9\x63\xd1\xf8\xfe\xe0\x0e\xfa\x65\xb5\xfc\x00\x29\x3f\x37\xea\x0b\x19\x66\xb7\x47\xcd\x73\x99\x2a\x94\xbf\x93\x59\xa7\xad\x8d\x6a\x98\x10\x76\x2c\x89\xcc\x2f\x3f\x77\x8e\xae\x26\xfa\xd9\xa0\x8d\x03\xcf\x6a\xed\x09\x89\x21\x6c\x4b\xfa\xe6\x3d\xaf\x96\xff\x6e\xbe\xfc\x83\x0b\x98\x8e\xfc\xb8\x1d\x51\xc6\x6d\x26\x1e\xb9\x66\x1e\x4d\x0f\xf1\xa1\x0d\x9a\xaf\x3e\x8f\xd4\x8c\x1e\x9f\x9a\xd1\xf3\xe9\x68\xc4\x37\x2f\x97\x66\x7e\x3d\xd5\x33\xf5\xc4\x49\x3d\x8d\xf1\xab\xea\x49\x10\x59\x66\xea\xa9\x2e\xd4\x13\xc9\xd7\x33\xb7\x75\xf9\x7a\x88\xaf\xaa\xf5\xd4\x7c\x4e\x79\xaa\x89\xaf\x6e\xd0\x7c\xf5\x73\xca\x43\x7c\x55\xad\x27\xf6\x39\xe4\x21\xf5\x10\x5f\xdd\xa0\xf9\xea\xe7\x90\x47\xb1\x2f\xe2\xab\x75\xda\xda\xe8\x45\xd5\x57\x89\x9d\x11\x2f\xb3\x87\x89\x68\x68\xc9\x0a\x03\x0a\xce\x08\x38\x33\xdf\x11\x9b\x23\x7e\xba\x41\xf5\xd3\xcb\x33\x96\x17\x91\xf4\x54\xa3\x33\x4c\x24\x1d\xcf\xe5\x5e\x49\x36\x2b\x85\xcc\x16\x79\xa6\x9c\x07\x72\xe7\xd8\x20\xc9\xf3\x59\xa1\xc5\x27\xac\x66\x8b\xcb\x98\x10\xc6\xc9\x66\x1b\x5c\x65\x8b\x17\x95\x7a\x41\xcd\x01\xbe\x27\x4d\x2c\x7d\x91\x18\xc2\xe3\xb9\x4f\x46\xab\x13\x86\xe2\xf9\xb6\x38\xa7\xfc\x15\x24\xc7\xc7\x31\x8a\x93\x8c\xf2\x8d\xf5\xa3\xcd\xc9\x99\x1a\xfe\xaf\xcb\x9f\xca\x97\xaf\xf9\x92\x63\x14\x2f\x26\xe5\xff\x70\xb4\xed\x5a\xe5\x3f\xaa\x95\x9f\xf7\x25\xc7\x28\x5e\x48\x6a\x18\x19\x5d\x5e\x3d\x53\x43\xa1\xfc\x64\xa1\xfc\xad\xe8\x01\xb5\xfc\x25\xa4\xfc\x27\x46\x97\xae\xbd\xaa\xfc\x6a\x32\xa7\x6e\x50\xe7\xd4\xff\x45\x4a\x8f\x90\xd2\xa7\x47\x2b\x1b\xe6\xfb\xaa\x3c\xc4\x06\x59\x7b\xa1\x7c\xd5\x06\x1c\xa3\xb8\xd1\xae\x8c\x1d\xff\x6d\x74\x76\x0f\x68\xfd\x7e\x91\xfe\x53\xa1\xfd\x85\xb1\x26\x4e\xc6\x9a\x6f\xcf\xd1\x50\x2e\x87\xc6\x49\x9c\x37\x6e\x0d\xa1\x46\xad\xfc\x98\x36\xb6\xba\xed\x61\x40\xae\x32\xe3\xdc\xf6\x3c\x2b\x0f\xd1\x3a\x5a\xf1\xb5\x0e\xad\xfc\x71\x75\x6c\x2d\x73\x86\x49\xde\x9a\xdb\x6f\x9a\x53\x7e\xee\x9c\x16\xe7\x35\x6a\xfa\xf7\x68\x63\x7d\x19\x13\x02\xb1\xda\x35\xbf\xfc\xdc\x39\x5a\x47\xc6\xb2\x0e\x4d\xff\x47\xb5\xf6\xf8\xc5\x10\x58\xe2\x6e\xd3\xdc\xfe\x1d\xcf\x9d\x63\xd7\x11\xfb\x59\xa5\xda\x27\xfa\xa9\xba\xa6\xa9\x25\x6b\x9a\xc1\xd1\x60\xd4\xa5\x9b\xd5\x9e\x67\x73\xe7\x98\xfb\x88\xfd\xac\x56\xed\x27\x9b\x47\xef\x3d\x32\x1a\xa9\x31\x15\xd0\x7b\xaf\x55\xf6\x0a\xb4\x44\x2d\x3b\x48\xca\xd6\x8d\x46\x83\x7f\xb1\xec\x15\x7f\xaf\x95\x2d\xff\xaf\xd1\x9a\xc8\xb5\xca\x9e\xca\x97\xad\xe9\x45\x6d\xc9\x8d\xa3\x8b\xf2\x05\xcf\x2a\xf7\x51\xad\xdc\xbc\x4e\xd4\x67\x37\x8d\x2e\x99\x29\xb9\x50\x6e\xb2\x50\xee\x56\x94\x55\xdb\x5c\x4d\xda\xdc\x3a\x5a\xb3\xf8\xea\x36\x2b\xf6\xa8\xb6\x19\xb6\xfe\x47\xbe\xe4\x75\xa3\xb5\x2d\xf3\xda\x2c\x0f\xb1\xeb\x88\x2d\xae\x9a\x65\x2b\x8e\x51\x88\x90\x79\x35\x75\x95\xae\xe5\x21\xe6\x3e\x62\x8b\xab\xe7\xda\x4a\x94\xd8\xca\xaa\x19\x85\xcf\xdc\x39\x68\x20\xe3\xde\x62\x55\xdf\xb9\xbb\xd4\xb6\xeb\x49\xdb\x9f\x1d\xe5\xf5\x1c\x9e\x9f\x13\x59\xc8\x27\x54\x9e\xbf\x4e\x2d\x3f\x20\xaa\xcf\x57\x06\xe6\xe4\x45\x2a\x71\x44\x03\x59\x17\x2c\xd6\xda\xb3\x5f\x7d\xde\xa4\xad\x0b\xf4\xfc\xd5\xe5\x13\x5b\xbf\x49\x93\xf7\x91\xbc\xde\xa1\x6e\x34\x50\xa9\x15\x3e\xab\xed\x53\x85\xb2\x77\xd2\x7b\x34\x3b\xe7\x99\x10\xd8\xcb\x66\xb5\x7c\x56\x2e\xe4\xa3\x85\xb2\x77\x92\x03\x16\xe5\xf9\x4a\x31\x04\xf6\xc6\x59\x2d\x9f\xc1\xd8\x22\x6b\xf7\xc5\xda\xda\xfd\x07\xb3\xee\x42\x80\xd5\x77\xad\xf2\xc9\x38\xa3\xe6\x5a\x6e\xfd\x9a\x5a\x7a\x54\x0c\x01\x2c\x58\x34\x5b\x2f\xf2\x7b\xb9\x73\xcc\x8f\x99\x77\x84\x10\xaa\xdb\xa0\xcc\x51\x51\x59\x42\x08\xb5\x8c\x51\xb8\x9a\xa2\x70\x72\x3c\x37\xf1\xb2\x9e\x4f\x8d\xe7\xfc\x52\x49\x32\x69\x30\x04\x01\x8d\x20\xe8\x47\xb0\x1f\x41\x1a\x81\x84\xc0\x8b\x00\x89\xea\x11\x61\x32\x19\x55\x66\xb1\x96\xa4\x76\x0f\x38\x0d\x93\x58\xc2\x7d\x88\x42\xc8\x96\xf4\x3b\xd2\x70\x01\x26\x8f\x1d\x53\x3f\xdb\x00\xef\x52\x2f\xe2\xfb\x10\x85\x3c\xaf\x21\x9c\x9b\x90\x8c\xac\x29\x85\x31\x83\xd0\x6b\xf0\x8f\xa8\x65\x0a\x62\x62\x22\x16\x55\xf7\xe0\x37\x50\x37\xc1\xbb\xe4\x8b\xe4\x7b\xdc\xe7\xfe\x1e\xf7\xff\xf6\x7b\x18\x74\xb2\x8b\x12\x58\x17\xa2\x10\x87\x10\x24\xc4\x80\xf2\x83\xfb\x86\x86\xe4\xc1\xa1\x21\xd6\x75\x09\xe9\xd0\x25\x84\x70\xee\x8a\x5c\x4b\xad\xcb\xbd\x47\x9e\xab\x92\x5c\x34\x42\x7a\x06\x98\xe3\xe7\xd9\x1c\x8b\x59\x7c\x1c\x81\x00\x3e\xa0\x00\xc5\xba\xa7\x62\xdd\x53\x10\x23\x44\x6b\xb5\x71\xf0\x27\xc9\xff\xd4\xba\x2b\x2f\x52\x1b\x94\x1f\xb9\xf6\x91\xaf\x3d\x42\x74\xc4\x46\xe8\x21\x2e\xcd\x9e\x41\x2c\xa2\x50\xbc\x16\x6c\x09\x2a\x21\xfa\xd9\xc8\x44\xcf\xf0\x90\x7c\x86\x19\x82\x94\x3c\x9e\x53\x64\x1b\xa7\x87\xe0\x83\x99\xe7\xd4\x3b\x86\xf0\xc1\x48\x4f\xff\x00\xf8\x98\x63\xf2\x05\x10\xa0\x11\x01\xea\x93\xcf\xc0\x10\x44\xb4\xe7\x18\xed\xb9\xa1\x63\xbd\xca\x73\x82\xf6\x18\x02\x34\x31\xb7\xbc\x80\x2d\x40\x29\xe5\x0d\xf5\xf6\xf6\x83\xab\x50\x1e\xa6\x07\x0b\xed\x33\xcf\x6e\x61\xbe\xa1\x8d\xc7\xb2\x7d\x03\xf2\x59\xb9\x43\x7d\x65\x46\x20\x2e\x4f\xca\x67\xc1\xa5\xbe\xaa\xf9\x6f\x23\xf4\x10\xd5\x3b\xbb\x0c\xad\x55\xda\xcb\xc9\xf1\x6c\x5f\x1f\xb8\xe0\x98\xfa\xca\x4c\xca\x27\x21\x0e\x2e\xf9\x82\xfa\xaa\x96\x31\x2c\x9f\xa1\xb2\x44\x2e\xb5\x8c\xe0\xdc\x32\xc6\x0b\x65\x74\xf4\xf6\x82\xe0\x9a\x57\x04\xa0\x7d\x08\x51\x3d\xac\x1d\x19\xd1\x97\xa4\x0d\x83\xe6\x61\xf3\x19\xf3\x05\x33\xbd\xdb\x0c\x82\x0a\xb3\xc2\xb1\x13\xb4\x4e\x47\xfd\xc6\x78\xd1\x88\x7f\x69\x84\x7b\x8d\xb0\xd3\x08\x1b\x8d\xb0\xca\x08\x21\x23\x18\x27\xf4\x06\xd0\xeb\xeb\x31\xe0\x7f\x42\x94\x40\x0d\x53\x14\x45\x03\x62\x4e\x18\x0d\x1c\xfb\x23\x1d\xa2\x50\xac\xe5\xcf\x75\xe4\xe6\x5c\x1d\xc4\xba\xa7\xba\xeb\xc4\x44\x42\xf8\xdd\x0c\x8c\x54\xe2\x77\x09\x92\xb9\x09\x41\x5b\xc0\xc6\x24\x19\x2a\x41\x05\xa9\x1e\xf9\x95\x86\x0f\x1b\xe4\x9f\x41\x43\xc3\x87\x0d\x70\x1d\xf5\xb1\xf7\x0a\x4d\x5d\xf1\x8e\x96\xc1\xdf\xc9\x99\x32\xd5\x87\x94\x76\x3f\xc0\xda\x91\x03\x8d\x48\x7b\x90\x13\x86\x9d\x23\xce\x0b\x4e\x6a\xbf\x13\x7c\x4e\xc9\x99\x76\x52\x3a\xf3\x84\xc5\xc8\xf3\x0c\xd0\x56\xb8\x68\x85\xdf\x59\xe1\xa0\x15\xee\xb7\xc2\x56\x2b\xdc\x60\x85\x7a\xeb\x6a\x2b\xb6\x4e\x08\x76\x51\x10\x1c\x14\xa2\xff\x89\x31\x18\xf4\x2c\x62\x40\x85\xdc\x48\x33\xc3\xcc\x08\xc3\xea\x18\xbb\xcd\x68\x3a\x61\x15\x2d\xe6\x1f\xf1\x48\x0f\x48\x77\x82\xa5\x30\xf7\x23\x06\xc5\xf2\x52\xcd\x12\x6f\x4b\xf7\x9e\x44\x22\x41\x08\x90\xea\xe6\xc8\xb9\xa7\x4e\x91\x34\xf1\xbb\x3a\x15\xfc\x10\x82\x8e\xbc\xb4\x79\x91\x1d\x41\x1b\xae\x85\xb5\xf2\x68\xc3\x87\x8d\xf2\x28\xac\x8d\xc5\x94\x7f\x1b\x3f\x6c\x50\xde\x8b\xc1\x85\xb2\x51\xaf\x7c\x10\xee\x53\x54\x50\x0e\x36\xe5\xa5\x4f\x1e\x50\xde\x24\x78\xc8\x4f\xc0\x6f\xf1\x2e\xea\x4f\xc8\x86\x56\x4b\x15\x31\x47\xc6\xb1\xdb\xb1\xdf\x71\xca\x71\xde\x91\x73\x70\x82\x03\x32\x86\xdd\x86\x23\x86\x97\x0c\xa7\x0d\xe7\x0d\xac\x61\x52\x71\x9a\xdc\x84\x64\xe2\x0c\x29\xe4\xe5\x81\x17\x18\x60\x50\xac\xfb\xa7\xdd\x10\x8b\x12\x84\xaf\x99\x83\xb4\xfc\xf1\xec\x13\x15\x2d\x9b\xea\x6a\x37\x49\xc1\xa0\xb4\xa9\xb6\x6e\x53\x4b\x05\x3e\xd7\xba\xb5\xa5\xb4\xb4\x65\x6b\xeb\xea\xad\x2d\x65\x65\x2d\x5b\xc9\x78\xd1\x83\x53\x6c\x3f\xd5\x41\xc6\x01\x62\xcf\xa2\x9f\xfc\x0f\x3d\x20\xe0\x4b\x20\xe0\x14\x10\x4f\x93\x2f\x28\x7d\x48\xa1\x33\x38\xc5\xe9\xb4\xe7\x8d\xe4\x1b\x36\xed\x1b\xca\xff\x67\x40\x80\x3e\x10\xa0\x7f\xf6\x17\xb5\x2f\x03\x1a\xc4\x29\x18\xa4\xb2\xc8\x88\x10\xd8\x59\x92\x2a\x59\x9f\xa8\x2b\x82\x41\x49\xfb\x0f\x4f\x4a\xa9\x94\x94\x4a\xa5\x94\xba\x38\xb4\x3d\x77\x4e\x77\x91\x79\x1b\xe9\x91\x87\x30\x09\xb6\xa0\x35\xa8\x1b\x1d\x92\x6e\x92\x46\x37\xbe\xd2\x56\x36\x5a\xf7\x4a\x60\x34\x32\xbc\x14\xe2\x8b\xa5\xc5\x23\x8b\xa9\x78\x44\x8a\xe0\xa5\x8b\x23\x91\xc5\x4b\x29\xfb\xaa\xd1\xb6\x4c\x4b\xa6\x3d\x93\x21\x94\xe0\x0c\x33\x6a\x78\x05\x8d\x0a\x76\x9f\x3d\x6e\xa7\xec\xad\x63\x37\xbe\xba\x62\xac\xbd\xb8\x85\x5d\xea\x0a\x8e\x35\xbc\xea\x1f\xab\x2e\xa6\xc6\xf8\x57\xb9\xb1\x62\x0e\xb5\x4c\x5d\x9c\x22\x3f\x2d\xca\xbf\x8a\x07\x5c\x24\x18\xbf\xea\x7d\x1c\x92\x59\x72\x71\x4a\xb8\x38\x55\x1b\xb7\xd9\x8b\x12\x75\xa2\x10\x28\x67\x99\x39\x67\xe2\x65\x18\x3e\xf3\x13\x92\xee\xfc\x99\x9f\x7e\xda\x9a\x7e\xfa\xe9\x74\x2b\xbc\x55\xd1\x76\x77\xfb\x9a\xde\xb5\xa1\xc0\x9a\x3d\xeb\xae\xdb\x73\x7d\x18\x5e\xd0\x3e\x79\x33\xd0\x76\x77\x7b\x5b\xef\x75\xda\x27\x6b\xc3\x39\x74\xe5\xfd\x67\xa8\x05\xf8\xc9\xd6\xf5\xdf\xfe\xf6\xfa\x56\x78\x6b\xf6\x03\x6d\x77\xad\x0d\xd3\xf8\x7b\xdf\x83\x36\x48\xfd\xfd\xf7\xee\x78\xe1\x9e\x96\x96\x7b\x5e\xb8\xe3\x8e\xe7\xf7\x2e\x5d\xba\xf7\xf9\xe9\xb6\xef\x3d\x0b\x6b\xc8\x07\xdf\x57\x3e\xf8\x7e\xfe\x03\xea\xb1\x4f\xdb\x98\xb1\x2b\xf8\x33\x3e\x26\x73\xf6\x01\xea\x28\xb4\x91\xfb\x90\x86\xfc\xdf\xf8\x65\xf2\x37\x43\xfa\x3a\x4e\x0d\x43\x1f\x73\x52\x99\x4b\xdd\xc0\x51\x67\x07\x7b\xce\x30\x27\x65\x14\x81\xb3\xda\x7c\x8a\xee\x86\x2b\xd4\x5b\x88\x45\x8b\xff\x81\xc6\x04\x0b\x5a\x6f\x4a\x61\x5d\x8b\xee\x88\xee\x25\xdd\x69\xdd\x79\x5d\x4e\xc7\xb2\x9f\x1c\xa1\x80\x62\x11\x45\x01\x03\x28\x16\xb3\x36\x2d\x89\x25\x12\xe0\x52\x46\x25\xe1\xcd\x68\x5d\x6d\xdc\x06\x4e\xca\xc6\xc1\x06\x48\xee\xfd\xf7\x7f\xdf\x2b\xbf\x8d\x2b\xe1\x99\x75\xf2\xb3\xf2\xb3\xeb\xe0\xdb\xf3\xea\x69\x91\x22\xe8\x13\x8d\x9f\x49\xa0\x7c\x14\xa6\xe6\xd4\x45\xb7\x60\xc0\xd7\xaa\x2a\xd1\xad\x52\x33\xe9\x21\x6c\xa3\x1a\x00\xae\xc8\x6f\xef\xfd\xe3\x1f\xf7\x42\x12\x5b\xe4\x6d\xeb\xe0\x26\xb8\x69\x9d\x7c\x0b\x42\x88\x41\x3d\x48\x62\xe2\x4c\x3f\x32\x22\x27\x0a\xa0\x18\x6a\x46\x28\xc8\xe9\x21\xac\x87\x06\x3d\x38\x21\x9c\x37\x78\x87\x9d\x85\x59\xbf\xfb\x3f\xe3\x7d\x26\x1e\x9f\x9e\x9c\x3e\x19\xc7\xf1\xe9\xc9\x38\x6e\xc4\xca\x9f\xf1\xb8\x24\xc5\x23\x92\x04\xe4\x97\xb8\x24\x4d\xbb\xb4\x5f\x20\xff\x51\x6f\x1c\xf7\x4c\x0f\xc5\x71\x2f\xee\x69\x9c\x1e\xc4\xbd\x8d\xd3\x43\x67\x25\xed\x71\xf9\x98\x14\x8f\xa4\x52\x11\xf5\x2f\xe5\x55\x1e\xce\x7f\xa6\xae\xc5\xfe\x36\xf7\xaf\xd4\x2d\xcc\x98\x10\x46\x34\xbc\x4b\x22\x03\x1a\x21\xa4\x7f\x25\x56\x0b\x42\x2d\x74\x77\x23\x04\xf2\x30\x42\xb8\x87\x19\x53\xd6\x26\xff\x00\x78\x3c\x77\x41\xd2\x63\x0a\x09\x08\x54\x50\x2c\x88\x35\xd6\xc5\x1a\x13\x24\xb5\x1f\x70\xcf\x95\xf7\xbf\x43\x45\x99\x31\xc5\xa4\x10\x46\x02\x4e\xe1\x41\x66\x02\x19\x90\x88\x10\x04\x1c\x01\x02\x01\x2a\x26\xfc\xc9\x85\x0d\x2c\x0f\x78\xb0\x7f\x50\x1e\x84\xbe\x81\x7e\xf9\x82\xce\x17\x1f\xa2\x74\x13\x13\xbd\x38\x35\x7d\xf2\x64\x47\x56\x4a\x5f\x50\x6d\x67\x27\xe5\xc1\x7f\xcb\xbc\x85\xec\x68\x99\xe4\x44\x67\x90\x1d\xec\x45\xd9\xa2\x89\xa2\x33\x45\x17\x8a\x68\xbe\x08\x2c\x86\x33\xe4\x96\xbe\xc5\xc0\xa7\x8c\x06\x34\x61\xa1\x7f\x23\xfe\xda\xf4\x3f\x09\xd6\x41\xc9\xcf\xeb\x20\x16\x25\x10\x59\xbf\x54\x09\xb7\x54\x84\x2e\x8d\x5a\xac\x3e\x51\xe7\x10\xb1\xbd\xa5\xa5\x7a\x59\x95\x63\xff\x0e\x41\x2f\x7d\xf9\xb7\x94\x07\x8e\xae\x5f\xe9\x58\xb8\x79\x99\x7c\x14\x7f\xa7\x63\xdb\xa7\x72\x5a\xd5\x95\x24\xa7\x61\x1c\x26\xac\x9c\x32\xb3\x5d\xd1\x91\xf7\xe2\x72\x1a\xf7\xc2\xa4\x95\x43\x5f\x2c\xbc\xe7\x93\x25\xdc\x43\xde\xdb\xab\xbe\xa7\xe8\x41\x4e\xe1\x41\xd0\xf4\xc0\xfc\x55\x3d\x5c\x9a\xab\x06\x50\x22\x54\x3a\xc2\x4c\x20\x2f\x42\x90\xf4\x3b\xc8\xff\x2a\x61\x96\x66\x41\x4e\x2e\xa4\x11\x25\xe3\x08\x46\xf2\x10\xa4\xe5\x11\xe8\x91\x51\xc7\xe4\xc9\x33\x27\xfb\xfb\xa5\x9e\x8e\xbe\xc1\xfe\x01\x3c\x31\x3e\x70\x66\x20\x87\x06\x70\xe3\x99\xb3\x93\x17\x1a\xfb\xe3\xc3\x43\xc3\xc3\x88\x42\xfd\xb9\x11\xba\x91\x75\x21\x1f\x0a\xa1\x28\x42\xc0\x39\xb9\x30\x34\x43\x5d\x83\x83\x8d\x02\x17\x68\x08\x85\x95\x7f\x44\x01\xb5\x40\x82\xab\x73\x36\x40\x91\x13\x42\x01\xb0\xd1\xa2\x9d\x46\xbe\x8e\x8e\x48\x0e\xb9\x22\x03\x83\xfd\x23\x69\x61\xc0\x25\xf9\x7c\x03\x8d\x13\x20\x9c\x15\x06\x84\xc6\xb8\x20\x67\xe3\x71\xd0\xc5\x1b\xe5\xe1\x0f\xe4\xb3\xac\xab\x3f\x32\xe4\xba\x3c\xdc\x38\xdc\x28\x65\x5d\xc2\xc0\x99\x49\xe8\x85\x34\x0c\xf8\xd2\x69\x5d\xc7\xa7\x67\x22\x2e\x3a\x2b\x5c\xc9\x52\x03\xbd\x72\x7c\x04\x01\xea\xcf\x5d\xa0\x1b\x99\x93\xa8\x42\x69\x53\x88\x50\xec\x27\x94\x46\x05\x7c\x48\x14\x90\x5f\x15\x1b\x8b\x82\x53\xeb\x4d\x6a\x52\x88\xfb\x52\x7d\xd2\xe0\x60\xff\x88\x7c\x41\x1e\x81\x14\xe8\x26\x87\x3a\x06\xfa\xc7\xcf\x4e\x0c\xeb\x74\xa9\x81\x46\x2a\x7e\x4c\x37\xdc\x7f\xa6\x71\xb8\x11\xfa\x21\x0b\xbd\x30\xd0\x31\x94\x96\x27\xe5\x0f\xe4\xe1\x41\x2c\x0d\x8f\xab\x36\x97\x45\x88\x46\xe4\x8e\xcd\x3d\x52\x0a\x0b\x58\x60\x34\x9c\x26\xa3\xd1\x16\xb7\x81\x05\xd1\x9d\x8c\x9e\x39\xcd\x01\xc7\x29\xcb\x91\x09\x86\xe2\x18\x8a\xcb\xea\x90\x4e\xcc\x58\x78\x4b\x8b\x65\xb7\x85\xd2\x59\x24\xc1\x91\xd2\x59\x74\x16\xda\x9c\x31\x50\xb4\x46\xe5\xd5\x14\x8b\x45\xb7\x90\x54\x4d\x92\x99\xb4\xa5\x3b\x11\x53\x01\x73\xf3\x4c\x63\x2a\x79\xf9\x0c\x1b\x9a\xd6\xd5\xf0\x63\xa8\x90\xff\xe7\x0f\x46\x46\xf0\x85\xe9\x1f\xe3\xa2\xe9\x3f\xc0\xa3\x87\xe4\x4f\x81\x3d\x44\x87\x9f\x9d\xbe\xa2\xe1\x31\xaf\x44\x88\x0e\x30\x3f\x43\x71\x74\x50\x12\x44\xb3\x63\x77\x34\x1c\xe0\x6d\x01\x5b\xc0\x56\x46\xb9\x15\x27\x59\xaa\xb7\xa4\xdc\xee\x3a\xa1\x0e\x2a\x83\x65\x92\xd1\x92\x2a\xb3\x07\xf7\x86\xc4\x90\x50\xb9\xb7\xca\x5c\xb5\x3b\x04\x93\x55\xc0\x57\x79\xab\x5a\xaa\xda\xab\x5e\xaa\x3a\x51\xc5\x86\xaa\x42\x55\xa8\xac\xe4\x8b\x1e\x17\x77\x37\xe2\x54\x54\xe6\x7c\xde\x25\x69\xb6\x26\x47\x54\xe5\x8d\x88\x26\xf2\x9c\x85\xe4\x2e\x4b\x6d\x1c\x66\x72\xc6\x3c\xa0\x59\x2e\x49\xc8\xf5\x3b\xfc\xc9\xa5\xd4\x12\x08\x24\x13\x49\xe5\x67\xe1\x52\x8c\x0f\xef\x7c\x71\xf9\xf2\xc6\xaf\x5f\x17\xdf\xb0\xd8\xaf\xac\x9f\x94\x1f\x67\x38\xe1\xc6\xe7\xae\xf8\x17\xac\x49\x96\xbd\xf9\xe6\x9b\x6f\x36\xef\x78\x8c\xf9\x59\x75\x60\xd0\x13\x75\x37\x6f\x59\x3e\x71\xe8\x99\x43\xb6\xa5\x37\x4a\x51\xe1\xe8\x61\x63\xe5\xca\x9b\x57\x38\x0e\x3d\x73\xe8\xe3\xcd\x87\x32\x75\x44\x1f\x52\x4e\xa0\xe3\x4c\x1f\x8a\x20\x04\x14\x19\x68\x35\x90\x3e\x8e\x12\x03\x49\x2a\xa0\xe1\x8e\x17\x43\x7e\x38\x28\x72\xda\xa8\xc1\xac\x20\xf4\xf6\x1e\x8b\x37\x0a\xae\xde\xe1\xe1\x01\x88\x48\x8d\xa9\xd4\x70\xbf\x4b\x97\x1a\x48\xa5\x7d\xc7\x98\x3e\xf9\x8c\x6e\xf8\xc2\x74\x1c\x4f\x1c\xcb\xea\xe4\xc9\xe9\xde\x49\x59\xa2\xe2\xfd\xc3\x3d\x03\xf2\xa5\xe9\x93\x74\x6a\xf0\x58\xaa\x07\x4e\x92\x39\xc2\x87\x10\x9d\x66\xc6\x49\xfe\x4b\x00\x85\x89\x6f\x25\x1c\x01\x42\xaf\x12\xa0\xb4\x1e\x56\xc4\x17\x13\x36\xbf\x98\x00\x67\x22\x0c\x01\x67\xc2\x9f\x08\x07\x20\x1c\x70\x52\x67\x7a\x7b\x7b\x7b\x3f\xf8\x20\x87\x8e\xf5\xf4\xf4\xf4\x7c\x30\x09\x68\x64\x5a\x12\x52\x69\xac\x3b\x99\xea\x97\xd1\x49\x69\x00\x0b\xba\x74\x9a\x1a\x1f\x18\x1e\x98\xbe\x84\x75\xca\xcf\xc0\xf0\x00\x46\x32\xc2\x48\x3e\x79\xf2\xa4\x3c\x32\x3c\x2c\x0b\x27\x95\x99\xf9\x89\xdc\x39\x82\x1d\xe3\x46\x55\x28\x89\xee\x93\x5c\xb5\xbb\x4b\xad\x02\x7f\xa7\xcb\xe1\x2a\x75\x95\xba\x2a\x72\x0c\x30\x92\xd5\x91\x22\x30\x76\x0b\xf4\x96\x14\xc3\x34\xf0\x0d\xd0\x20\x19\x85\x54\x34\x70\x67\xc5\x97\xea\x79\xd7\x5e\x87\xd5\x11\xbd\xbb\xdc\x51\xee\x28\xaf\x48\xde\x1d\x64\x2b\x5c\x68\xaf\xbe\x38\xcf\xe7\xd6\x14\x8b\xe5\xed\x5a\x05\xc2\x21\x10\xa6\xdd\x9a\x45\x28\x26\x2e\x4c\xd5\xc6\x83\xb3\xd3\x9d\xc4\x40\xb2\x05\x54\xba\x19\x7b\x11\xd8\x2d\x98\xf0\x5a\x26\x54\x5e\xcb\xa5\x6a\xf6\x3f\xd3\xcc\x57\x04\xca\x38\x67\xba\x25\xd9\x21\x55\x3c\xfd\xf4\xb2\xdb\xdf\x7d\x77\xa1\xfc\xb5\x85\x5f\xfa\xf9\x50\xec\xe5\xcb\x5f\x39\xb1\x6f\xd1\xf4\x3f\x96\x74\x3f\xd2\x55\xf3\xec\x8b\x4d\x0f\xd2\xac\x8e\xfa\xaa\xc9\x5e\xbe\x7a\x67\x0a\x4e\x6c\xb8\xfe\x1f\xdf\x3b\x24\x6f\x5a\xbb\x8e\x3a\xd4\x75\xec\xc1\xeb\x0b\x7c\x97\xbe\xd6\x3d\xeb\xbf\x71\x08\x51\xa8\x27\x77\x89\xe9\x61\xc6\x91\x09\x39\x50\x02\x21\x95\x53\xb3\xc8\x21\x70\x10\xa0\xc2\xf9\xdb\xe3\x90\x24\x89\x82\x0b\xc3\xa1\xf0\xac\xc1\xd6\x61\xa7\x1d\xca\xb2\x16\x7c\xe3\x20\x9c\x3d\x7b\x09\x74\x93\x67\x06\x3a\x06\xfa\x07\x07\x25\x9c\xee\xcf\x4a\x52\x76\xc8\x27\x0d\xf4\xf5\xf5\x35\xf6\xa6\x7a\xa0\x63\x70\x60\x00\x67\xa7\x87\x99\xf1\xc9\x49\xf9\x6c\xef\x74\x2f\xce\x0e\x0d\x0e\xf4\x0f\x5c\x16\x06\xa5\x88\x2f\x12\x97\x5c\xf1\x8e\x74\x6f\x63\x5f\xbc\x31\x3e\xd8\xd7\xd3\xa3\xee\x97\xfe\x90\x7e\x86\xb5\x5b\x43\x88\xe4\x63\xa1\xe5\x68\x14\x21\x64\x79\x0d\xe1\xdc\xff\x18\x5d\xd4\x64\x0c\x90\x7d\x12\x40\x2d\xb9\x73\x74\x1b\xc9\xdd\xfb\xca\xa8\x95\x8b\xd4\x13\x60\xd4\xeb\xf4\xe6\x54\x71\x71\xb3\xd0\x0c\x0b\x02\x01\x1b\x63\xde\x5d\x53\x7e\x6b\x04\x22\x91\x45\xb6\x40\xb6\x42\xa8\xd0\x2d\xc8\x56\x33\xd5\x99\x8a\xfd\x15\x8f\x56\x9c\xaf\xc8\x55\x30\x7c\xb5\xb7\x3a\x56\x9d\xa9\x3e\x52\x7d\xaa\x9a\xad\xa8\xae\xa8\x2e\x6a\x40\x5f\x4c\x70\x45\x99\x62\x4f\x31\xc9\x66\x9b\x4a\xe4\xaf\xf3\x15\x9c\x9e\xe4\xe2\x13\x37\x4f\x88\x33\xce\x5f\x1b\x57\xa1\xf7\x1c\x7e\x3b\xc7\xda\x1d\xa5\xe0\xf4\x3b\xfc\x05\xa0\x7e\xf5\x16\x51\x32\x11\x5a\x98\x5c\x58\xaf\x18\xfe\x52\x4a\x4b\x73\xa3\x74\xab\xee\xd9\xb2\xc2\x0a\x23\xf2\x32\x00\x0c\x0f\xca\x8f\x95\xbf\xf6\xf8\x75\x07\x9b\x9b\x0f\x74\xdd\x3d\x76\xb0\xc3\xf1\xec\xb7\x30\xfe\xd6\xb0\xb5\xe3\xe0\xf8\x5d\x37\x0f\xb7\xa7\x13\xf7\x32\xe1\x85\xb7\x3e\xda\x75\x88\xb7\x98\x4a\xf4\xb6\xca\xa2\x43\x2f\x8d\xfb\x4a\xbe\x5b\xea\x5d\x73\xf0\x8d\xfb\x0e\x39\xcb\x3c\x45\x35\xba\x43\x0f\xfc\xf3\xe0\xba\x68\xed\x63\x5e\xc5\xed\x0a\xbe\x68\x47\x48\xbd\x15\x07\x01\x8d\xef\x48\x19\xad\x20\x81\x7b\xe1\x8c\xdc\x0b\x83\x27\xe5\x3e\x5d\xdf\xf8\xb1\x63\xe3\x71\x38\x79\x92\x8a\x0c\x4c\x67\xf1\x70\xc7\xf4\x38\x1e\x1e\xc0\x83\xd3\xbd\x78\x10\x69\xf3\x71\x9c\x19\x47\x4e\x84\x20\xe8\x60\x1c\x41\x07\x23\x06\x44\x26\x19\x4c\x32\xc9\xa0\x96\x46\x3a\x08\x8d\xf2\x49\xe5\x67\x5c\x9e\x84\x38\xf9\xc9\x52\x97\xe4\x2c\x75\xa6\x7f\xa0\x7f\xb8\x7f\xa0\x7f\x7a\x12\xce\xf4\x0d\xf4\x0f\xf5\x0d\xf4\x41\xff\xb1\x63\x08\xd1\xb9\xb3\xf2\x30\xdb\xc1\xba\x90\x15\xb9\x51\x25\xa1\x6a\xe3\x68\x65\xa2\x2b\x0f\x37\x14\x39\x6d\x2c\x17\xae\x6f\x01\x27\x24\xea\x90\x32\x88\x81\xcd\xaa\xad\x1d\x03\xe5\x61\xca\x56\x34\xc3\xc9\x81\x25\x17\x5c\x92\x53\xf2\xe4\xc4\xa0\x4f\x90\x2e\x65\xd3\xe9\xa1\x01\xd7\x80\x7c\x29\x3e\x09\x1d\xe3\x83\x30\xd4\x1b\x19\x1e\xc8\x0e\x0c\x1f\x4b\x37\x4a\xd9\x88\xd4\xd1\x11\x8f\x4b\x69\x1f\xeb\xca\x0a\xd3\xe3\x72\x8f\x8c\x7c\xfd\x3a\x1d\x7d\xcc\x27\xf5\xf7\xf8\xb2\x67\x2e\x47\x60\x04\xd2\x67\x2f\xfc\x57\x1f\xee\x05\x74\x6c\xa8\xef\x83\x49\x9f\xdc\x8f\x85\xf8\xd0\x90\x94\xea\x1b\x47\xda\xfa\x66\x98\x8e\x33\x93\xc8\x8d\x82\x08\x81\xb3\x01\x8b\x82\x35\x51\x67\x15\x05\xce\x59\xe4\xb0\x73\xe1\xfa\xe4\xc2\x18\x40\x98\x0b\x43\x3d\x19\x7e\x59\x87\x00\xbd\xa9\xe1\xb3\xe3\x43\x83\xe3\x13\xf1\xf1\x4b\xf1\x9e\xbe\xb8\x3c\x92\x9a\xc8\xe2\x89\xbe\x54\xaa\xb1\x03\x86\xcf\x0e\x81\x0b\xb2\xa0\x03\x94\x43\xf2\x25\xb9\xf7\x83\xf8\xb1\x63\x97\x52\x23\xae\x9e\x9e\xfe\x88\x3c\x79\xe1\x58\x3f\x74\x0c\x42\xcf\xf8\xc8\xb1\x09\x79\x5c\x8d\x55\xf3\xfd\xcb\x23\x3b\x2a\x46\x08\xb0\x3f\x90\x9f\x41\x7d\xb6\x84\x23\xe8\x0f\xf9\x03\x36\x5f\x83\xdf\x41\x9d\x6c\x94\x7d\xf1\xf1\x63\xc7\x00\xc1\x07\x91\x81\xe9\x38\x0c\x44\xe4\x0f\x1a\x7d\x90\xf2\xc9\x7d\xd4\x84\xdc\x37\x7d\x92\x9a\x18\x80\x5e\x79\x70\x60\x60\x72\x7a\xe2\xac\xb6\x17\xd4\x9f\x1b\xa0\x23\xac\x80\x5c\xc8\x83\x10\x38\xc8\x30\x10\x05\xb1\xae\x41\x4c\x88\x24\x97\xb1\x42\x14\x82\xc9\x62\xa0\x45\x01\x4f\xe8\x26\x86\x52\x03\x03\xba\x8e\x8e\xf1\xe1\x93\x03\x72\x0a\xc6\x73\x88\x15\x52\x1d\x43\xe9\xcb\x3d\x3e\xdc\x31\x1d\x97\x74\x3d\xbd\x69\x3c\x84\x7b\x7b\x3a\x3e\x1d\xa4\x7b\x7a\xe4\x46\xd9\x87\x28\xe4\xd2\x64\x70\xa2\x12\x54\x86\x90\x2d\x99\x68\x20\x39\x92\x36\xbf\x23\xe0\x4c\x38\x02\xb6\x00\xe5\xa7\x02\x36\xa0\x12\x94\x3f\x1c\xf0\x4d\xc4\x2f\x80\x6b\x78\x7c\x18\x7c\x97\xe2\x27\x87\x87\x4f\x0e\xca\x7d\x83\x27\x87\xa1\x4f\x1a\x38\x03\x8d\xf1\x0f\x0a\x73\xc1\xac\xd9\x01\x4f\xca\x67\xe4\x0f\x86\x15\x7f\xc8\x5d\xa0\xd3\xcc\x49\x54\x83\x90\x2d\x90\x4c\xd4\x37\xf8\x93\x7e\xd5\x80\xb8\xb0\x6a\x57\x5c\xc2\x11\x60\x79\xc5\x59\xc8\xca\x92\x2c\xbc\x94\xf5\xe6\x70\xff\x07\xa9\x09\xd9\x87\x4f\x36\xf6\xf7\x0e\x0d\x4b\xc7\x26\x27\xce\xfa\x86\x2e\xa5\x07\x25\xec\x9a\x76\x45\x06\x87\x4e\x8e\x0f\x5e\x3a\xa3\xcc\x44\xe9\xf4\x80\x94\xed\xe8\x4b\x0d\xa5\x27\x87\xb3\xd2\x40\xaa\xd1\x37\xd0\x98\xee\xeb\x4b\x1f\x4b\x9d\x19\x4f\xe5\x75\xda\xc8\x0a\xa8\x08\x95\x22\x14\x64\x95\x85\x71\x48\x59\xd9\x35\x24\x13\x0e\x32\xcc\x8a\x75\x0d\x8c\x48\x8b\x76\x2b\x2d\xf4\x1d\x1b\xfc\x40\xbe\x04\xba\x0f\x06\xc7\x07\xd3\x03\xbd\x83\x83\x72\x5a\xfe\xe0\x58\xa4\xb1\xa7\x37\x02\x7d\xd0\x08\x12\x0c\x44\xd2\xaa\x8a\x1b\x7d\x74\x6f\x8f\xec\x3b\x23\x9f\x41\x34\xfa\x7a\xee\x12\xf3\x11\xf3\x06\xa2\x90\x13\x45\x51\x0a\x7d\x45\x32\x00\x6e\x5a\xed\x1a\xb5\x50\x88\x84\x33\x6d\xbd\xab\x07\x57\x0f\xaf\x9e\x5c\x4d\x9f\xb6\x00\x12\xf0\x6a\x0b\x42\x96\xd5\x98\xae\x2d\x1f\xe5\x69\x38\x4f\xe7\x68\x4c\xb7\x49\xa3\xa8\x16\x50\xad\x50\xeb\xab\x3d\x53\x7b\xa1\x96\xd1\xd5\x2e\xbf\xb2\x60\x7a\xc9\x95\x7a\x2e\x7c\xc5\x36\xed\xb9\xa2\x2f\xa6\x58\x70\x21\x75\x1b\x41\xdd\x4a\xd8\xd2\xbd\x67\x4a\xf8\x75\xf7\x1e\xed\x92\x5b\xac\xb1\xbb\xbb\x51\x19\x38\x95\xe1\x46\xbb\x09\x3d\x6f\x43\x80\xc9\x67\xd5\x6b\xfc\x31\x30\x3f\xf1\x9e\x75\xd8\xb5\x81\x94\x31\x90\x48\x0b\xee\xac\x4e\xf7\xae\x6c\xb9\x73\x7d\x6c\x41\x7a\xcf\xca\xa5\x77\x6e\x88\xc9\x09\x31\xb4\x38\x5a\xb5\x38\x28\x8a\xc1\xc5\x55\xd1\xc5\x21\x71\xfa\xed\x55\xf7\x75\x2e\x4c\xde\xf4\x40\x2a\xb1\xd5\xe7\xf7\xde\x50\x7e\x5b\xe6\x47\x89\xce\x40\xe0\x56\x35\x4c\xbb\x3c\xf4\x85\xfd\x9b\xab\xab\x37\xef\xff\x42\xfe\x35\xb1\x69\x69\x20\xb0\x74\x53\x62\xe1\x0d\x4b\xfc\xfe\x25\x37\xc0\x63\xa1\x0d\xfd\x9d\x99\x87\x37\x84\x8a\xf8\xdb\xcd\xf6\x2f\xde\xf3\x5b\x51\xb8\xdd\x6a\x23\x71\x7f\xee\x2c\xd5\xa1\xc6\x25\xb6\xfa\x86\xfa\x06\x5f\x83\x93\x75\xd8\xad\x0e\x3b\xe6\x42\xca\x90\x55\x9f\x5c\x88\x93\x0b\x1b\x14\x9b\x1a\x90\x3a\xe2\x13\x20\xc4\x75\xc7\x7a\x27\x06\x8f\x5d\xea\x9d\x18\xce\xf6\x0c\x64\x7b\x27\xd2\xf4\xf8\xa0\xe4\xd3\x09\xc2\xd0\x48\x8f\xec\xeb\xeb\x93\x2f\x49\x59\x69\xa4\x71\x20\x3b\x98\x85\x89\x8e\x63\x7d\xba\x0e\x84\xd1\xbd\xb9\x73\xd4\x3e\xe6\x6d\x54\x8d\x16\xa1\x1b\xa4\xba\x9a\xde\x80\x24\xd8\x53\x81\x80\xc8\xb0\x8b\x93\x91\x3b\x8b\xed\x82\xe8\x13\xe3\x04\x5e\x8e\x11\x5d\x8e\xfa\x7b\xec\x62\x24\x82\xe2\xf7\x94\x71\x68\xaf\x91\x65\x8d\xca\x1c\x16\x13\x08\x52\x6a\x2c\x7f\xc9\xfa\xa7\x89\xa9\x3a\xe1\x97\x6f\x58\x9b\x62\xd1\xfc\xaa\x24\xa1\x5e\x6f\x5d\x02\x16\xe0\x92\x4b\xa1\x41\x9c\x4d\x36\x23\xda\xcb\xb0\x6d\xa1\x1a\x3d\x2e\xa5\xf0\x6e\x5f\x53\x4d\x19\xb5\x95\x0e\xad\xde\xb1\x7a\xd1\xce\xf5\xf1\x9a\x9b\x6b\x17\x66\xaa\x4b\xa5\x9e\xeb\xea\x37\x2f\xf1\x27\x6f\xfa\x52\xab\x58\xd1\x70\xeb\x76\x5f\xa5\x53\x5f\xbf\x2e\xe1\xba\xb7\xa8\x6e\x43\xf3\x17\x1e\xea\x8c\x07\x37\x0e\xdc\xfa\x6f\x62\xa9\xe9\x3e\xcb\xff\x43\xdc\xbf\x00\x4b\x8e\x9d\xf7\x61\xf8\xf9\xf0\xe8\xc6\xdd\xe5\xee\xa0\xe7\x4e\xcf\xc5\x72\x39\xbb\xe8\xe9\xbd\xd3\x98\x7d\x5d\xec\xf4\xf4\x5e\xec\x2e\x97\x03\x72\x77\x4d\x90\x14\xb9\x58\x51\x7f\x12\x14\xbd\x24\x24\x4a\x34\xcc\x87\x16\x14\xff\xb6\xa0\xd0\x0e\x61\x29\x5a\x42\x66\x6c\x22\xa6\x4c\x23\x91\x6c\xa3\x54\x2a\x56\x27\x31\x69\x24\x56\x31\x30\xad\xb2\x3b\x09\x6d\x75\x2a\x7e\xc0\xe5\x54\xa5\x53\x29\xc7\xbd\x49\x98\x74\x62\x97\xd4\x95\xb2\x94\xde\xb9\xdd\xe7\xa6\xce\x01\xfa\x8d\x7b\xfb\x0e\x99\xaa\xdc\x5d\xdc\xdb\xd3\x00\xbe\xf3\x3b\xdf\xf7\x9d\xef\x85\x83\x73\x1e\xb9\x04\x7f\xf0\xc2\x17\x3e\xfa\xcc\xe3\xaf\xbe\xf1\xca\x67\xbe\xfd\xa6\x73\x03\xff\x0b\xf5\xb5\x17\x1a\x5c\xe3\xf7\x1e\xbe\xf5\xca\xe3\xf8\x73\x8d\x8f\xfc\xec\x2f\x23\x0e\xfd\x3e\x42\xd5\x5f\xa7\x6b\x57\x3f\x81\x8e\xd1\x0b\xe8\xfb\xfa\x2f\x3e\x08\xf5\x9f\x46\xcf\x3d\xf7\xe4\x5b\xd7\x45\x04\x09\x82\xbf\x89\x40\x45\x3a\x62\xd0\x75\x74\xfd\xbe\x5b\x6f\x49\x97\x9e\x7f\xf4\xf9\xa3\xe7\xd9\xe7\x9f\xff\x43\x09\xa4\x3f\xf5\xe2\x1b\x2f\xfe\x83\x17\xff\xd9\x8b\xac\xfe\x22\xbc\x43\x60\xf7\x7e\xfa\xbe\x9f\x7b\xf7\xd1\x0f\xaf\x75\x7e\xd8\xfa\x67\xd7\xfe\xd5\xb5\x3f\xbc\xc6\x5e\xd3\x2b\xf7\x1b\x97\x5a\x8f\xb6\x3e\xdd\x7a\xa3\xf5\xd5\xd6\x1f\xb6\x2a\x95\x6b\xad\x6b\xad\xab\xac\x58\x91\x0c\xf6\x7e\xf6\xb9\x1f\x6a\x0f\xa6\xa7\xe3\xef\x55\x24\xe3\x41\xb8\xef\x32\x5d\x7f\xad\x3d\xbc\xd3\x7e\xa2\x9d\xbf\x79\xf6\x04\x7d\xfb\x2a\x5f\x89\x8d\x64\xda\xff\xdb\xeb\xb7\x8e\xbe\x24\x2e\xde\xce\xfa\x92\xf8\x56\xbb\xd8\x73\xbe\xd1\x5c\x2e\xc5\xd6\x86\xf6\x8d\xd6\xd3\x6c\xa7\xd6\xde\x1e\x05\x4b\x57\xc6\x76\x1a\x75\xae\xfb\x4f\x66\x5f\x13\x2a\x1c\xc7\x7f\xfb\x9f\x31\x7f\xb6\xc2\x72\xc0\x32\xf0\x3b\xcc\x5b\x37\x3f\xfc\xc5\x97\xef\x7c\xfe\xc3\x4f\x92\xbf\xef\xf9\xfc\x47\x9e\xc4\xef\x33\x5e\x7b\xed\xfd\xef\x7f\xed\x35\xe3\x33\x30\xe6\xbe\xff\xe1\x9f\x78\xef\x5f\x7e\x6e\xfa\xbf\xf3\xdf\x3b\xf9\x89\x9f\xf8\xa0\xfc\xd2\x4b\xef\x79\x27\x2b\x4f\xff\xee\x47\x7f\xe5\x13\x47\x47\x9f\xf8\x95\x8f\x7e\xf4\x2f\x58\x4f\x3f\x6d\xfd\x85\x8f\x7e\xe9\xcb\x5f\xfe\xd2\x2f\x7e\xf1\x8b\xb3\x47\xbf\xf9\x4d\xc4\x20\x0b\x4b\x9c\xcb\x8e\xd1\x21\x3a\x42\x08\x6e\x74\x6e\x1f\x12\x7d\x3e\xb8\x7c\x9c\x1b\x44\x86\x7a\xb2\x1b\xcd\xeb\xec\xfe\xd5\xfa\x15\x44\x8d\x21\xe4\x63\xb2\x73\xbb\x05\xa6\x07\xae\x98\x99\xbd\xc4\x54\x35\x77\x90\x88\x7d\x55\xb1\x46\xa1\x8c\xe3\x50\xd5\x41\xf1\x4d\x35\x14\x41\x1a\xbb\x41\x4f\xec\x69\x46\x08\x52\x62\xf4\x83\x14\x8f\x15\xd1\xef\x79\x3e\x0e\xf1\x40\xd3\x3c\x1c\x3b\xd6\x00\xc4\x41\xe2\x06\xaa\x2c\x93\x31\x66\x9d\x8e\x2a\x3a\x3f\x40\xb7\x11\x22\x69\xf7\x23\x70\x99\x98\xe2\x03\x62\x8a\xd9\x1b\xad\x1b\x4d\xb8\xd1\xaa\x5e\xad\x8b\x40\xbe\xad\x5e\x6f\xa1\x9a\xd8\x22\x98\xab\x74\x31\xe4\xab\x07\xc0\x89\x6a\x84\xc7\x96\xe3\x9a\x9a\x69\x8b\x51\x62\x59\xa6\xae\xea\x16\x08\x86\x9e\x4a\x78\x62\x85\x9a\xdc\xeb\x77\x41\x49\x0d\x2d\xd6\xfd\x49\xa8\x81\xcb\x0f\x86\x7d\x3c\x10\x5d\x1c\x58\xba\x34\xb6\x01\xf5\x35\x1d\x54\x27\x49\x2c\x17\x47\x78\xa4\x0a\x99\x0b\x12\x78\x60\xf6\x2d\x12\x5b\x38\x8e\x97\xf4\xa2\x04\x2c\xea\x87\xbb\xcc\xa8\x6a\xf1\x29\xba\x1f\xed\x53\x3f\x3c\x4f\xfa\x1a\xb5\x06\x10\x7f\xdc\xa8\x37\x69\x76\xdb\xe6\x45\xdc\x07\x01\x4f\x40\xc7\x3a\xa4\x33\xc1\x1f\x33\xf6\x98\x43\xe4\x9f\x3e\x6f\x74\xdd\xa1\xc3\x64\x33\x95\xb1\x5d\x17\x0b\x0e\x93\x11\x7f\x71\xc8\xfc\x90\x37\xf9\xef\xa1\x2a\x6a\x20\xb4\xa0\xc6\x36\x1f\x61\xa9\x4a\x3d\x4c\xdf\xf0\xbc\xfd\x6c\xe7\xf8\xf6\x71\x93\x05\xe7\xab\x3f\x60\xee\xfb\x7d\x46\xff\x7e\x15\x18\x80\xaf\x7c\xff\x77\xff\xc1\x7f\xfe\x55\x60\xa0\xf2\x5f\x33\x3f\x64\x7e\xfe\x0b\x5f\x98\xfd\x26\x73\x28\x5e\x7f\x44\xaa\xe0\x0f\x30\xff\x7c\xf6\x3f\x30\xad\xd9\x11\xfc\xad\xbd\x47\x2e\x5f\xbf\xfc\x8e\xd9\xff\x98\xd7\x7c\x3e\x82\x10\xff\x6d\xfe\x9f\x5c\xae\xc0\x37\x50\xbe\x9e\xd9\xbf\xe4\xbe\xce\x19\xe8\x3a\x3a\x42\x2f\xe8\x8d\xe6\x07\x1f\xa9\x3d\x73\xb4\xff\x41\x91\x07\xfe\xda\x35\xe9\xf2\x47\x9e\x38\x7a\xe1\x88\x39\x3a\x92\x6e\x7e\xe4\x1d\x97\xa4\x8f\xa0\xfc\xed\x67\xba\xdd\x63\xfe\x22\xcf\x5b\xb7\xc4\xff\x69\xbe\xa4\x77\xe7\xf6\x7b\x38\x6a\x5c\x1a\xb5\x7c\x8d\xa7\xe3\x83\x07\xd9\xfd\x5a\xfe\x7a\x59\xb5\xc6\xfc\xf2\xaf\xfc\xa3\x37\x5f\x79\xf2\x27\x3e\xfb\x67\xfd\x3b\x5f\xfa\xaf\xfe\xf2\x6b\xd3\x7f\x78\x55\xff\xb0\xf5\xf4\x07\xff\xff\x9f\xfa\xf0\x75\xe3\xb1\x8f\xfe\xc2\x37\xfe\xf1\xfe\x0b\x1f\x7e\xbd\xd3\xfe\xf8\x07\xde\x2d\x35\x3f\xf5\xd7\xff\xf1\x2f\x7c\x26\xfe\x77\xff\xe4\xbb\xaf\xbd\xfa\xcd\x7f\xfe\xab\xf8\xb7\xa4\x27\xaf\xd7\xe5\x77\x7f\xfc\xf8\xe6\x73\x3f\xff\xe1\x27\x99\xaf\x43\xfd\xca\xe3\xcd\xab\xfb\x8d\xc7\x0f\xf0\xff\x41\xf3\x62\xe9\x74\x2c\x64\x7c\x86\x5e\x46\x68\x9f\xfa\x76\xf9\x61\xa0\xe5\x15\x66\x5e\x91\x7c\x18\x80\xea\xfc\xf5\x0a\x43\x5f\x17\x3d\x3e\xa0\x2f\x56\x76\xc4\x7d\x60\xd8\x26\xc3\x32\xad\x2a\x83\xe6\xb5\xcc\xbe\x60\x9a\x10\x75\x4d\xc5\x35\x4c\xd3\x08\xbc\x41\x26\xa9\x8c\x69\xfb\xba\x6e\xfa\x9e\xaa\x18\xae\xee\x84\xb6\x69\xba\x78\xd4\x8d\x2c\x59\x12\x64\xcd\xc5\xf1\x29\x0a\x42\x4b\x13\xc1\x51\x14\xc3\x60\x26\xe0\x79\x8e\x2d\x88\x9a\x6e\x7a\x23\x3c\x9e\x69\x9c\x98\x68\x6a\x38\x1b\xe0\x51\x10\xc6\x6a\x6c\x07\x63\x10\xa1\x87\x05\x3c\xc0\x03\x50\x21\x03\xe4\x4d\x30\xc2\xbe\xeb\xea\x76\xfe\xbc\xe1\x74\xcc\x8d\xb9\x31\x89\x24\xa0\xd6\x84\x6a\xa5\xca\x36\xf7\x9f\xbd\x03\x50\x6b\x03\x8d\x3f\xdb\x24\x16\xad\x54\xb9\xb1\x30\xd3\x54\x4d\x94\x27\x8a\xe8\x47\x78\x28\x30\x51\x20\x99\x13\x55\xb6\xfb\x80\xf0\x98\x89\x64\x25\xc2\x16\xf8\xb1\x41\xc2\x4f\x79\x16\x98\x81\x69\x8e\x02\xcf\x34\x7d\x8f\xe8\xb7\x7e\x3a\xe6\x43\x3e\x45\x2c\x7a\x10\x3d\x83\x10\x5d\x5b\x83\xaa\xdd\x71\xe5\x12\xb4\xa0\x88\xc7\x8b\x9c\x31\x7f\x23\x79\x3d\xac\xe2\x82\xe9\x20\x66\xd5\x99\x1e\x84\x82\x22\xdb\x06\x17\x27\xdd\x6e\x64\xfb\x9e\x65\x3b\x8e\x6d\x5b\x96\xae\xdb\xae\xee\x47\x7e\xc8\xa7\x77\x0d\x3e\x9d\x86\x8c\xe0\xba\xaa\x6c\xd8\xd3\x81\x1a\x07\x81\x16\x18\x86\x69\x18\xae\x61\x68\xba\x69\x3b\xbe\x1d\xd1\x71\xa7\x9c\x8e\xf9\x1e\xdf\x47\x57\xd1\x3b\xd1\x8b\x64\xdc\x75\x8e\x8b\x7d\xd5\xe6\x0d\x93\x58\x8e\xc0\xdd\xdf\x8d\x91\xb1\x67\xfd\xcc\xd7\x74\xcd\x72\x4c\x3f\xf4\x42\x33\x08\x21\x60\x82\x69\x16\xb1\x4a\x9f\xc0\x75\x02\xd7\x5e\x83\x1b\x06\x21\x63\xb8\xa3\xc0\xd1\x75\xdd\xb2\x5d\xdf\x35\xc3\x30\x66\xc6\xb4\x03\xd2\x99\xb0\x4f\x4f\xd1\x4f\x9d\xfe\x1b\xfe\x5f\xf0\xa9\x78\x03\x7d\xe5\x0a\x12\x5b\xec\xcf\x30\x9f\xa2\xf3\xd1\x6e\xb2\x3f\x3b\xfb\x3b\x48\xd5\x1f\xe5\x58\xa6\xf5\x10\xfc\xdb\x1a\xfc\xaf\x35\xc8\x6a\x90\xd0\x2d\x64\xd4\x1a\xd4\x8e\x3e\x01\x97\x3e\x01\xaf\xbf\x3e\x7f\xc0\x8f\xee\x74\x3a\x74\x1e\x27\x3c\x41\x69\x7e\x8f\x52\xfb\xfa\x0a\xb5\x77\xeb\x0a\xc7\x32\x1f\x78\x08\xc6\x6d\xc8\xda\xf0\x83\x36\xfc\x6e\x1b\xe2\x36\xfc\x46\x1b\xec\x36\xa8\x6d\x78\xac\x0d\xed\xa3\xaf\xc0\xa5\xaf\x2c\xc9\x2e\x28\x9f\x9e\xa2\x57\x0b\xba\x37\xbe\x76\xa3\xc0\xba\x4d\xfd\xc5\x87\x60\xdc\x82\xac\x05\x3f\x68\xc1\xef\xb6\x20\x6e\xc1\x6f\xb4\xc0\x6e\x81\xda\x82\xc7\x5a\xd0\x3a\x7a\x03\x2e\xbd\x51\x42\x7d\x3e\x47\xad\xa0\xaf\xbc\x2f\xa7\xff\xdc\x0a\xfd\xdb\xfa\x75\x8e\x65\x1e\x7d\x08\xfe\xed\x1e\xfc\xeb\x3d\xf8\x6f\xf7\xe0\x77\xf7\xe0\x37\xf7\xe0\xab\x7b\xf0\xc4\x1e\xec\x1d\xbd\x06\x97\x5e\x5b\xa1\x3c\xa7\x8b\x80\x71\x10\xa2\x3a\x7b\x3f\x42\x37\xa1\x73\x58\x3b\xec\x34\xea\x7c\x8d\xe7\xc3\xe9\x00\x74\xdc\x63\x15\x92\x9e\x3a\x0a\x17\x29\x8e\xa3\x9c\x38\x0a\x42\x0c\xd8\x08\x55\xba\xf4\x9e\x4b\xeb\x77\x1d\xd6\x1a\xb5\x4a\xf7\x6e\x0a\x12\x1e\xf1\x06\x1e\x81\x84\x55\x6c\xad\xdc\xad\x70\xd1\x89\x43\x75\xd2\x40\xa8\x9a\x16\x34\xf6\xb7\xa9\x34\x6b\x8d\x5a\x35\x9d\x84\xc4\x0b\x54\x5d\x12\xdc\x63\x05\x7b\x29\x76\x36\x89\xe5\x04\x19\x94\x20\x54\x8d\x28\xbd\xab\x94\xda\x71\xad\xd5\x69\xd4\xab\xb5\x03\x68\x43\x13\xda\x70\xf5\xe0\xd9\x63\xa6\x37\x1b\x77\xbb\x8c\x98\x24\x9c\xd8\xc7\x52\x8a\xa5\x1e\x28\x8a\x2a\xeb\x2b\x44\x79\x93\xea\xa5\x1d\xf4\xc3\x3e\xa1\xeb\x20\x54\xf8\xac\xab\x08\x1d\x2e\xa8\xd6\x1b\x94\x62\x4e\x9c\x37\x72\xaa\xb3\xf1\x4c\xd4\x25\x55\x01\x85\x52\x17\xfb\x2b\x74\x1d\x46\xce\x82\xcc\x67\x63\x42\x1e\x31\x48\x43\xa8\x1a\xf3\x29\x7d\x07\x0e\x35\xa0\xbd\x7f\xf5\x00\x0a\xca\x04\x3b\x10\x26\x40\x8a\xfd\x34\x53\x65\x50\x38\xa7\xd7\x9b\x4a\x69\x84\x23\x36\x3d\x45\x7c\x3a\x4d\xb2\x94\x1b\xe4\x84\x69\x23\x77\x93\xb0\x60\x6d\x9e\x2b\x56\x87\x7c\x8a\x44\x74\x85\x7c\xa6\x0b\x2a\xad\xd3\x6e\xd6\xe8\x2e\xf4\x2e\xee\xa6\x80\x00\xf1\xa2\xeb\x9e\x04\x8e\x8d\x53\x56\x4a\xc1\x4b\xf9\xf4\x44\x29\x23\x9f\x1f\x68\xce\xef\x80\xf2\xe5\x60\x9d\xdf\xfc\xca\x3e\x5d\x2b\x0c\xef\x67\x38\xc6\x61\x0f\xfa\xd8\xea\x83\x09\x46\x6f\x4d\x2f\x1c\xc6\x9b\x05\x24\xe9\x9a\x65\x8c\x3a\x33\x10\x83\xbc\x05\xdf\x0f\xd6\xf9\x9e\x93\xce\x57\x8b\xe2\xf5\x24\x61\xa4\x24\x99\x8d\x66\x08\x5b\x3d\x42\xb7\x8f\x2d\xe8\xf7\x70\x88\xe3\x6c\x95\xfe\x92\xf6\x0c\x91\xb6\x28\x9f\xcc\x42\x67\x1e\x44\xfb\xb4\x5e\x33\x6f\x80\xc0\x7f\x98\x39\xae\xb5\xf6\x80\xa8\x61\xd4\xeb\x9d\x04\x78\x72\x8a\xfa\xe0\xe0\x34\x1b\x8c\xd2\x64\x80\x47\x6c\x97\x08\xa2\x40\x6f\xce\x12\xda\xc2\x84\x11\xee\x26\xa4\xd9\x59\x32\x9b\x0b\x84\x61\x0c\x84\xf8\xb4\x22\xa2\xfb\x51\x7d\xfd\x89\x37\x7b\xd8\x69\xd4\xf8\x7a\xa3\x73\xc8\x39\x9a\xaa\x69\x9a\xa6\x6a\x7d\x3c\x81\x1e\xd8\xd3\x10\x2c\x3e\xd6\x35\x4d\xd7\x34\x6d\x36\x94\xbc\xa9\x21\x79\x9e\x44\x70\x03\x42\xa8\x6a\x50\x7a\x07\xa8\xb5\x4e\x91\x5f\x7d\x9e\xbe\xa0\x4e\x46\x56\xad\xc1\x4f\x08\x7d\xf2\xff\x4c\xd1\x54\x4d\x55\x35\x55\x63\x44\x3c\x86\x3e\xd8\x6f\xa7\x60\x91\x86\x19\x79\xd1\xa8\xb6\xd5\x38\xab\x90\x4f\x74\x5a\x17\x8a\x11\xaa\xfa\x05\x86\x26\x7a\xee\x6c\x14\x6b\x88\x3a\x87\x44\x90\xb5\xc6\xca\x6f\xbe\xce\x79\xf3\xbe\xcf\x26\xf3\x4f\x9c\x38\xff\x74\x57\x06\x21\x05\x17\xcc\xc5\x2f\x71\x0b\xe2\xfc\xef\x5d\x65\x0e\x72\xf5\xb7\xe4\x21\x96\xea\xab\x57\xc8\xa0\xb1\x21\x05\x02\x83\x8e\x0d\x9e\x1a\x8a\x36\x1d\xd7\x8c\x35\xe7\x56\x3f\x04\x63\x38\x0b\x86\xac\x86\xb5\x1e\x48\x96\x20\x08\x36\x48\x29\xd6\x4a\xe4\x13\x72\xc6\xcc\x1c\x18\xca\x84\x49\x4e\x52\x84\x00\x7a\x08\x55\x34\xce\x40\xf7\xd1\x71\x38\x37\x1a\x6c\x90\x93\x12\x0b\x4a\xeb\x77\x11\xdd\x0c\xc8\xf8\xba\x20\xde\xdb\x84\x64\x25\x21\x68\xc9\xd1\x8b\xc0\x18\xcd\x82\xe1\xd4\xc6\x5a\x3a\x6f\xa4\x77\x11\xb8\x88\x43\x0a\x42\xd5\x6c\x21\xd7\xf6\xd9\x72\xdd\x23\x36\xab\xde\x7e\x96\x6e\x76\x98\x0f\xff\x42\xa2\x07\x75\xde\x9a\x63\x81\x6c\xce\xc5\xbb\x0e\x8e\xba\x43\x53\x10\xf5\x61\x17\x47\xe0\x24\x1e\xa8\x20\xf9\xa0\xa5\x5b\xe2\xbc\xab\x10\x58\x63\xd5\xee\x11\x58\xeb\x22\x95\x3c\xb4\xc0\x39\x58\xe0\x7c\xe9\x62\xfa\x47\x31\x13\xf9\xee\x37\x6a\x6d\x8a\xb5\x5d\x5b\x30\xb3\xd6\x82\x6a\x38\xc7\x8d\x17\x3a\x89\xdd\xf9\x77\xd3\x31\xee\x75\x53\x4d\x12\x44\x3d\x05\x7f\x60\x82\x30\xb0\x40\xb0\x4e\x3c\xc7\xc0\xc3\x73\x74\x92\x33\x66\x5e\x2f\xb0\xc6\x4c\xb0\xa9\x97\xa4\x6b\xe2\x54\x23\xf2\xce\x10\xaa\xea\xbb\xe4\x4d\xf0\xcf\x6d\x1f\xb3\x40\x48\xf4\x73\x34\xf3\x87\xac\x81\xe3\x6c\x02\xa8\x8f\x63\xf0\x32\x3c\xc6\x93\xac\x44\xe4\x10\x33\x12\x76\x20\x9a\x8d\x66\x19\xa4\xd8\x40\x00\x19\x42\x15\x95\x33\x48\x0c\xb0\x6a\x5d\xd9\x08\x9b\x19\x18\x60\xf6\xb1\x09\xd4\x7e\xc7\x19\xa3\x32\x12\xb6\x21\xa6\x77\xf7\xe8\x9c\x4b\x00\x13\x59\x95\x84\xed\x11\x4f\x46\xf2\x37\x12\x44\x36\xaf\xb7\x48\x92\x7c\x4c\x52\x85\xfa\x95\x2a\x13\x72\xf2\xc9\x30\x90\x65\x49\xc1\x5d\x55\x05\x4b\x91\x64\x99\xd1\x1d\x3c\xd6\x24\x59\x06\x4d\x55\x15\x15\x34\x59\x96\xe8\x3c\x3e\x03\x4b\x6c\x5a\x91\x28\xbd\x5a\xb3\xc6\x57\x9a\xd7\x0b\x52\x07\x90\xd3\x66\x54\x1b\x8f\x75\x49\x56\x40\x53\x54\x95\xfc\x96\x25\x8d\xcb\xde\x36\x2a\x69\x20\xcb\xb2\x0c\x96\xa6\xe1\x2e\x69\x64\x0b\x5f\xa7\xc1\xde\xe8\xdc\x2e\x48\x55\x21\xa7\xcd\xbb\x27\x43\x4e\xa6\xf8\xc0\x52\xd5\xfc\x56\x18\x38\x20\x12\x7c\xb8\xaf\x2a\xaa\x8a\xfb\x25\xf8\xf8\x5a\xbb\x76\x98\xf7\x91\x90\xa2\x9d\x26\xb4\x33\x1b\x24\x4d\x92\x15\xdc\x27\xf8\x70\x5f\x91\x25\xbd\x5b\xe9\xbd\xad\x6f\xf0\x80\xe6\x27\x13\x64\x55\x05\xb6\x87\x6e\x12\x7c\x25\xdc\x63\x4b\x21\xf7\xa7\x6e\x28\x91\x26\x72\x62\xb2\x24\x85\x6c\x48\xbf\x29\xba\x20\x4b\x12\x0c\xb6\x39\x8c\xc7\x65\xbd\x5a\xed\xd7\x4d\xd2\xaf\x12\xae\x1f\x96\x77\x75\x5b\x12\x24\xf2\xdb\xea\x3d\xef\x6d\x88\x26\xb8\x1b\x6c\x72\x03\x20\x3b\x1d\x54\x54\x4e\x27\x31\xe1\x1e\x54\x81\x25\x2d\xdd\xa8\xdd\x7e\xb6\x2d\xd3\xe7\x05\xcc\x98\xd5\xf5\x69\x6a\x4b\xb2\x2c\x48\x9a\x0e\xd2\x40\xb3\x58\x7b\x9a\xea\xac\x8e\x87\x96\xda\x03\x55\xd7\x65\xa1\x90\xfb\x1a\xad\x16\x1c\x12\x96\x3e\x9b\x3f\xc5\x23\x64\x79\xab\xb8\xcf\xd6\x06\x20\xe9\x9a\x24\x48\x8a\xc4\x4a\xd3\x9e\xce\x1a\xb6\x4c\x92\x51\x5d\xc7\xc3\x4c\xb5\x36\x68\x1d\xc2\x31\xec\x13\xb6\x5c\x26\xc9\x92\xdc\x22\x64\x79\x31\xbf\x4d\x52\x64\x92\xa9\xe2\xe1\x40\xb5\x53\xd6\xd0\xa7\x3d\x90\x2d\x13\x67\xf1\x02\xd6\x0a\xad\xcb\x04\xd7\x01\xf0\xa4\x63\x74\xf6\x0f\xa5\xca\x74\xf3\xfb\x14\x4b\x1d\xe0\xa1\xae\x89\x82\x22\x4b\x80\xf2\x7e\x17\xb0\x20\x88\x2c\xb4\x36\xf6\x1e\xa1\xba\xd3\x66\x1b\xf5\x06\xdb\xdc\x2f\x1f\x83\x8c\x1c\x3a\x21\x44\x58\x0f\x9d\x10\x0b\x5b\xa3\x11\x7c\xec\x3b\xd8\x07\xbf\x6c\x54\x6e\xb5\x45\x5a\xe9\xd0\x16\x4b\xc7\x13\x46\xa1\x1b\x61\x03\x06\xa4\xc9\xe1\xd6\xc8\x22\xcd\x38\xa4\xc1\x33\x74\x71\xd1\xd6\x75\x12\x97\xdd\x68\x5e\xe7\x9a\xd7\x5b\x65\x43\xe3\x6a\xfb\xd6\x63\xed\x5b\x95\x24\xf0\x6d\xdc\x75\x22\x27\x5c\xef\x95\x6f\x45\x16\xd8\x76\xcc\x88\x7e\x10\x5a\x78\xb4\xd9\xb1\x53\x64\x87\x5b\xed\x95\x74\x68\xbf\xd2\xbc\xfe\x58\xf3\x7a\xb5\xf3\x6c\xfb\x16\xd7\xbe\xc5\x3b\xfe\x7a\x8f\x02\x27\xb2\x71\xd7\xf6\x03\x37\xb6\xc1\x36\x63\xc6\x04\xb4\xd9\x31\x90\xac\x30\xf0\xdd\xf5\xf6\x9e\x44\x08\x48\xc0\x31\x1f\xe9\xab\xe6\xb3\x59\x2a\x45\x45\x90\x8a\xe1\xce\xf4\x67\x5a\x61\x02\x64\x65\x4b\x9c\xa2\x34\x1f\xef\x0b\x33\x2b\x0b\x25\xa2\x5d\x8e\x7b\x82\xa5\x7e\x75\x39\xda\x57\x4c\xef\x71\xa7\xd4\x0a\x4b\xe2\x7c\xc0\x2f\xec\xb1\x24\x96\x59\x66\x59\x94\xe6\x83\x3e\xe6\xed\x42\x1d\x64\x41\xde\xb2\xd6\x9b\xbc\x69\x2e\x45\xb0\x6a\xba\x0f\xda\xa5\x5a\xa7\xc8\xb9\xdd\x0b\x67\x1a\xd3\x2f\x6c\xa1\x24\x28\x5b\xea\x27\xc8\x85\x48\xc4\x85\x89\x97\xc4\x12\x55\x5c\xe3\x0d\xdf\xb9\x31\x37\x7a\x6b\x66\xbf\x5a\x2f\x35\x8b\x92\x98\x1b\x3e\x10\x17\xbe\x40\x94\x4a\xec\xe2\x52\x9e\xbc\x73\x37\x2a\xe4\x39\x07\xbd\x6a\x1b\xa9\x9f\x40\x6c\x0f\x3d\x8c\xd0\x21\x5b\xee\x28\xf6\xdb\xec\x7e\x25\xec\x4d\x9d\x2d\xd7\x10\xf5\xdc\xe1\x30\x00\xb3\xd4\x21\x98\xd8\xc7\x1e\xe5\x3d\x2a\x7c\x11\x69\x63\x9f\x6d\xef\x97\x8d\xee\xfd\x06\x0b\x68\x38\x74\x7b\x6c\xb4\xe1\x6f\xc2\xa9\xd3\x0b\x20\x00\x1f\x27\xdb\xdc\x04\x11\x27\xb4\x0d\x01\x59\x95\x8c\xed\xa1\x77\x12\x3b\x92\xef\xbc\x5b\xa6\xe9\x06\x27\x3b\x4e\x49\xd4\x00\xfe\x34\x3a\xc3\x48\x2d\xe5\x45\x68\xd7\x1a\xf5\x06\xc9\x30\xca\x34\x17\x82\x69\x08\x41\x69\x10\xd1\xb5\xed\x8a\xb5\xad\x98\x00\x6a\xc1\xff\x1c\x37\x5d\x61\xad\x4c\x0b\xd3\x93\xa1\xe3\x2c\xa2\x89\x39\x05\x62\xf3\x58\xe7\x0c\x83\xb7\x86\x9b\x2f\x36\xf4\x2d\x77\xb6\x1e\xeb\x62\xaf\x2c\xb8\xb0\x1c\xe7\xed\xee\x76\x78\x81\x98\x15\xbf\xfe\x14\xe1\x4a\x09\xdd\x52\x77\x0f\x9d\x46\x9d\x51\xb7\x9b\x82\x92\x11\x3e\x43\xac\xcb\x65\x27\xe6\x46\xfb\x01\x97\x6c\x30\xf2\xed\xcc\xb6\x09\x2f\x45\x64\x55\x65\x4e\xa0\xf3\xf7\x3a\xc5\x5c\x85\x72\x95\xce\xeb\x8f\x7c\xd7\xf6\xe2\xd8\x9b\x1a\x5b\x8a\x9d\x9a\x8e\x63\xb2\x5d\x3b\xf6\xbc\xb8\x4c\xb9\x6d\xd3\x2c\xf6\xa4\x1a\x22\xab\x32\x2e\xda\xcc\xa7\x44\x96\x6b\x37\x0d\xbc\x5f\x80\x3a\x4c\x28\xe9\x74\x4b\xc9\x0d\x02\xc5\x66\xbb\x8e\x69\xda\x65\x7a\x4e\xa0\xd8\x94\xf7\x74\x3c\x69\x9c\x80\x9a\xe8\x69\x1a\x7d\xce\x27\xf5\xd2\xd9\x4c\x65\x1d\x86\xc5\x13\xae\x3a\xa3\x33\xfd\xc8\xf7\xe2\xae\x97\xd8\x33\x6d\x73\x1c\xc4\x89\xe9\x90\xbe\x31\x7a\x1c\xc4\x91\xeb\x77\x71\x52\x3e\xba\x1d\xcb\xb0\x5d\x0b\x31\xa8\x4f\xc6\xf6\x02\x4b\x59\xcf\x6b\xcd\xc5\xbc\xd1\xab\xd7\xa0\x71\x78\xbb\x98\x3b\xfa\x02\xf0\xda\xba\x3a\x07\x33\xcd\x4e\xbc\x6e\xec\xf9\x11\xd3\x9f\x0e\x08\x27\x1c\x33\x61\xcd\xb2\x41\x0f\x66\xd7\x77\xa3\x38\x88\x63\xcb\xb5\x0d\xcb\xa1\xef\x58\x21\xab\x4a\x6c\xfc\x1d\xe2\x6f\xe9\x34\x95\x32\x6f\xc7\x36\x0e\x68\x4c\xb4\x7f\x5c\x2a\xa9\x26\xbd\x93\x43\x99\x20\x0a\x42\x3c\xd8\x54\x3e\x90\x5c\x72\x46\xcc\x5c\x90\x36\x5c\x40\x30\x88\xc9\x3d\x8c\x8b\x15\x51\x04\xbd\x8c\x6d\x63\x18\x4a\x12\x96\x4b\xa2\x65\x10\x71\x4f\x14\x73\x9d\x0a\x91\x55\x75\xd9\x1e\x7a\x66\x1e\x13\x9d\x65\x96\xcb\x3a\x50\x51\x66\x13\x12\x8b\x49\x9b\x4a\xcd\x88\xab\x61\xd3\xaa\x09\x29\x33\x7c\x78\x7c\x56\x24\x05\xc8\xc5\x12\xdb\xa7\xf3\x77\x11\xbf\xcf\x5f\xef\xec\xb7\xd9\xc3\xf6\xad\x6b\xc0\xae\x5a\x81\x39\xb4\x2c\xc1\x8e\xdc\xb5\x23\x88\x05\xa9\x0f\x8a\x26\x2a\x2a\x0e\x55\x59\x57\x46\x92\x24\x6b\x31\xeb\xea\x32\xeb\x4c\x47\x86\x2c\x4c\x55\x53\x94\x65\x19\x8f\x64\x1d\x42\x45\x92\x15\x6a\xd7\xb1\xc4\x47\x7c\x86\xa4\xc2\x3e\x96\x5a\x75\x93\x35\xec\x19\x15\x87\x3a\xef\xb0\x2c\x73\xc6\xdb\x19\x5f\x92\x48\xa0\xbc\x46\x8d\xa5\xca\x64\x95\x6e\xa9\xd5\x9d\x89\x36\x6b\x6e\x0c\x55\x76\x74\x57\xad\x94\x98\xb0\x3c\xce\x58\xc1\x7b\x93\xae\x3e\x5e\x8a\x97\x19\xd9\x53\x9a\x55\x2a\x4b\xbc\x7c\xf6\x76\x46\x83\xc9\x55\xb4\xfa\x06\x56\xbe\x71\xa6\x87\x98\x26\x36\x33\xde\xc0\x6a\x57\xd4\xbb\x2a\x88\x9a\xbc\x06\x55\xa3\xcf\xaf\xd2\x6a\xc8\x19\x84\x26\x9d\x42\x56\x6a\xc1\xbb\x77\x47\xfc\xa6\x5f\x50\x44\x7d\xc2\x8c\xed\x69\xb2\x1d\x4b\x78\xa7\x2a\xb5\x05\x52\xe1\x83\x4b\x4d\x51\xca\x8d\xed\xbb\xc9\x86\x72\x82\xc4\x8c\xa7\x49\xd1\x7b\x55\xcd\x7b\xaf\xcc\xe3\x76\x19\x84\xaa\xca\xf6\xe8\x4c\x28\x5a\xc2\xa8\x11\x74\xfb\xcf\x3e\xd6\x96\x51\xad\x79\x1b\x35\xaf\x73\x55\x9a\xf0\xc0\x40\x13\x34\x5d\x51\x24\xd7\x02\xab\x0f\x32\xc4\x0e\x8e\x27\x29\x1e\x18\x20\xdb\x26\x48\x82\xa6\x43\x66\x59\x78\x98\x66\xd8\xc1\xc3\x09\xd8\xfd\xd8\x94\x65\x59\xc8\xc7\x5d\x06\x42\x65\x58\xb4\x43\x20\x1f\xde\x78\xac\x79\x1d\xd5\x9b\x22\x6a\xdc\xe2\xa8\xd1\xa8\xd7\xe8\xa3\x2c\x2e\x30\x6d\x90\x0d\x3c\x48\x27\x38\x76\x20\x06\xb9\x0f\x96\xe5\xca\xb2\xa2\x6b\xa2\x0a\xba\x20\xcb\xb2\xd9\xed\xe1\x78\x02\x32\x44\x59\x0a\xb2\x65\x61\x55\xd7\x84\xdc\x7e\xfb\x08\x55\x7c\xde\x45\x2c\xad\x1e\x74\x1a\xf5\x45\x56\xca\x12\x33\xc9\x53\x3e\xf9\x3c\x9a\xba\xf3\xc4\x54\x21\x09\x20\x81\xce\x8b\xb6\x8d\xbd\x69\xcf\x60\x0d\x3c\xb0\x4c\x88\x6c\x45\x95\x14\x59\xa2\xf5\xab\xf4\x34\xa8\x1a\x7c\x8f\x3e\x93\x7b\x86\xce\xe7\x2b\xb7\x1c\xd0\xae\x35\xeb\xe5\x6e\x0a\x9a\xb5\x76\xd5\x38\xf1\x36\x8d\x07\x17\xbc\xed\xda\x36\x17\x6c\xba\xad\x13\xaf\x12\xda\x36\x5b\x5e\x12\xf0\xa7\xd1\x68\x53\xf9\x64\x62\xe9\x3c\xd6\x25\x72\xd5\x4f\x27\x95\x5e\x05\xd1\x7a\x73\xa5\x7e\x05\xb5\x6f\xa1\xce\x6d\xa6\xc5\xce\xcd\xc7\xb3\xed\x06\x01\xcc\x5f\xbd\x5c\x17\x51\x43\x46\x35\xf1\x98\x31\xbb\x60\x4f\x26\xe0\xf4\xbb\x26\x61\x8b\x22\xe8\x3a\x64\x26\x11\xe9\x00\xdb\x78\x88\x87\xd8\xce\x38\x2b\x99\x4c\x70\x0c\xf6\x24\x05\xc5\xc0\x43\xdb\x84\xc0\x24\x8a\x21\xcb\xae\x85\xbb\x7d\x3c\xc4\x0e\x44\x20\x83\x9c\xa1\x4d\x1c\x57\x6b\x79\x53\xb7\x2f\x1f\x93\xdc\xbe\xdd\xa0\x53\xd3\x72\x48\x15\x66\x0e\xb2\xc5\x4f\xfa\xf3\xe6\x06\x29\x1e\x5a\x16\xf4\x75\x5d\x50\x04\x59\x91\xcc\x6e\x2f\x87\x98\x70\x71\x46\x2f\xa1\x8d\x65\x60\x16\x1a\x22\xc8\xd8\x58\xd1\x1f\x72\x71\x1e\xc3\x9a\x30\xa0\x39\xca\x83\x24\x96\x58\x15\x58\x1d\x42\x7d\x11\xfd\xc8\x30\xd0\x56\x1c\xf1\x3c\xb7\x61\x74\x7a\xdf\x5a\xa9\xac\x5d\x49\x96\xb1\xae\xbe\x5a\x1b\x53\x34\x04\x90\x15\x31\x1c\xb9\xef\xf6\x6a\x49\xa6\x09\x99\xa6\x2c\xea\x2e\x36\x9f\x19\x73\x0f\xfd\xb6\x91\xc7\x95\x8c\x5a\xdc\xb7\x56\x4a\xab\xaf\xd6\xd0\x14\x0d\x4b\xcb\xd2\x99\xb1\xd1\xbf\xb5\x92\x59\x13\xcc\x65\xa5\x4c\x5f\xab\x91\x69\x1b\xfd\xbb\xb5\xaa\xad\x9d\x8a\xab\xcf\x9d\xef\xc9\x90\xd1\x35\x65\xe1\x4d\x9d\x8d\xfe\xad\x95\xd4\x3a\xab\xb5\x34\x45\xab\x48\xcb\x1a\x9a\xbe\xd1\xbf\x2b\xab\x01\x6d\x9b\x51\x35\x59\x5d\xa4\x60\xd8\x5a\x48\xa5\xd2\x43\x0c\x98\xa7\x66\x25\xe1\x23\x74\x95\xc6\xc4\xe5\x55\xcb\x33\x8a\x85\xe5\xc5\x4c\xab\xa4\x82\xc8\x49\x2b\x52\x54\x0b\x3d\x38\xe9\xce\xfb\x93\xa9\x74\xa0\x15\x39\x00\x83\x86\x58\xac\xca\xb4\xae\xf8\xd4\x99\x95\x4f\x28\x2f\x38\x32\x7d\x9b\xb4\xa4\xe4\xfe\x48\x05\x95\xa8\x03\x58\xf6\x7c\x48\xab\xca\xdc\x9f\x2c\xaa\xa4\xab\x91\xc5\x89\x58\x49\xdf\x36\x8a\x2e\x69\xda\x22\x79\xd8\xe2\x53\x29\x43\xce\x60\x5f\x69\x51\x75\xd6\x2d\x61\x1e\x9b\x2c\xb5\x48\x9d\xeb\x05\x0e\xed\x35\xe6\xa9\x45\x40\xc0\x80\x89\x47\x95\x84\x1f\x9f\x2b\x3b\xf6\x1e\x0a\xd1\x41\xc9\x77\x9c\x63\x6f\xbb\xb8\x13\xab\x44\x9e\xc5\x1c\x60\x2c\x55\xfd\x1d\xb2\x3b\x2c\xff\xba\x82\x36\x9a\xa2\x5a\x52\xd6\x54\x69\x85\x3b\x28\xad\x7a\x97\xf0\xa9\x54\x76\xfb\xf7\x50\x10\x0f\xca\x54\x5c\xa0\x19\x90\xa2\x14\x81\x67\x46\xb3\x41\xaf\x44\x9e\x25\x7c\x3a\xa3\x7a\x7e\xc6\xd7\x0c\x2a\xa1\xca\x25\xeb\x19\x18\x6d\xbf\xac\xd2\x1e\x94\x55\xdf\x89\x7e\x8f\x2b\x09\x6f\xa0\x07\x69\x24\xb1\x6e\xc9\xd9\x75\x03\xb6\x66\xd8\xf5\x15\x63\xc6\xda\xab\x16\x18\x7b\x9a\x52\x8c\x35\x90\x6c\xb4\xd5\xc6\xba\x35\xdd\x5f\x77\x02\x6b\xc6\x55\x5f\x71\x08\xac\xbd\x6a\x05\xb1\x67\xe3\x91\x2a\x17\xb6\x9b\xb6\xb1\xa8\x5f\x12\xcf\x58\x6d\xd4\x1b\xf4\x68\x1e\x37\x0e\xb6\x46\xc1\x25\x68\x1c\x43\xe3\xb8\x51\xe5\xbb\x16\xd8\xd8\x33\x20\xc3\xa2\xed\x58\xd8\xb5\xd6\xf9\x63\x31\xb2\x3d\x33\x61\x64\xcc\x32\x8d\xed\x8d\x9d\xd4\x9e\x4c\x02\x45\x59\x0d\x1e\x14\xc5\x1f\xcf\xc6\xa9\x85\x10\xbb\x92\x0b\x3d\x4b\xdf\x79\x2d\x6d\xb8\x5d\x6d\xb4\xb6\xf4\xed\x0e\x50\xa8\x87\xc7\x8d\xea\xc1\x4d\x38\x6e\x35\x18\x7b\x3d\xa8\xb1\x18\xc1\x76\x2c\xf0\xac\x75\xbb\x65\xcd\x26\x04\x77\x00\xb1\x31\x1b\x6a\x1a\xa3\x33\x92\xae\x63\xb5\xbf\x8e\x51\x56\xfd\xf1\xd8\x57\xe5\xd5\xec\x48\x56\x83\xc9\xc4\x4e\x2d\xdb\xb6\x50\x19\xff\xce\xc4\xd8\x69\xd0\x03\x5a\x8d\x6a\x83\xd3\x6c\xb0\xcd\xf5\x01\x61\x62\x89\xb2\x12\x52\x03\x23\x46\xb6\x61\xa0\x61\xc3\x60\x10\xdb\x1b\xfb\x04\xd6\x12\x82\xa2\x50\x08\xce\x18\x9b\x56\xba\x5a\xf7\x7c\x38\xb7\x6a\xa5\x82\xab\x37\xa8\x0d\x9b\x8a\x9b\xa2\x62\xc7\x27\x43\x0d\x12\x3b\xd8\xea\xbb\x63\xad\xd4\x97\x1e\xce\xad\x53\x75\xcb\x0c\x1d\x91\xaf\x5b\x10\xdb\xbe\xaa\xac\xa6\x35\xb2\x1a\xd8\x36\x35\x3c\x81\xb5\x6e\x64\xac\xb7\xbd\x4a\xaa\x6f\xe0\x6e\x35\x3a\xe5\xbc\xeb\x34\xf8\xae\x76\x32\x64\x47\x9b\xfc\x9a\x4a\x9c\xcc\x88\x96\xb3\xc1\x1d\xd2\xee\x3a\x6e\xfe\xb8\xd6\xae\x1d\x6f\xd9\x85\x47\x89\x4b\x64\x90\x4d\x7b\xbe\x16\xbd\xfa\xf6\x50\xab\xf4\xde\xde\xd2\xea\x4a\xf8\xb6\xbe\x2a\xf3\x9b\xe8\xe8\x0c\x6d\x2d\xed\xc9\xe1\x71\xab\x51\x3d\x60\xa5\xcd\xb1\xe2\x6d\xf6\x6c\x16\x30\x89\xa6\xcd\x64\x4d\xdb\x56\xc8\x92\xde\xda\x96\x65\x6f\xd4\xeb\x8e\x10\xda\x2f\x93\x54\x29\x17\xf6\x0f\x8e\x6b\xad\x6a\x6f\x5d\x7c\x8a\x12\x6c\xf0\x45\x51\x7d\x9b\xfc\x70\xc6\x86\x38\xef\x8e\x36\x19\xc5\x4b\x77\x53\x4d\xe3\x3d\x3d\x7f\xce\x9b\x9e\xba\x95\x1e\xe7\xa1\x83\xfc\xd9\x1c\xd5\x21\xf6\xf6\xb3\x2f\xd0\x27\x58\x97\x80\x7c\xc5\x78\xac\x6f\x4c\xbb\xb2\x44\xdc\xa5\x26\x92\x70\x3f\x62\x2d\x7d\xea\x39\xac\x36\xf5\x0d\xd6\x8a\x2c\x13\x32\x43\x93\x04\x59\x15\xe5\x69\xd7\x60\x7d\x89\xd2\xd6\x4e\xdd\x8a\xc1\x79\x34\x1f\x6d\x91\xff\x68\x52\x47\xcb\x50\x24\xa0\x3f\x02\x68\x01\xef\xba\x84\x86\x1d\xd9\x16\x64\xa2\x36\x27\x12\xeb\xac\xcf\xc6\x12\x25\x2f\x4b\x8a\x2c\x90\x96\xb1\x6a\x5a\x11\xa5\x8f\x36\xe9\x1f\xc2\x31\x1c\xd3\xaa\x12\xad\xc3\x91\xd4\xe1\x0e\x90\xef\xf8\x60\xea\xeb\xac\x2d\x8b\xea\x9c\x86\x65\x47\xd3\xd8\x60\x7d\x37\x65\x7d\x7d\xda\x8d\x2c\x13\xab\x8b\x86\x59\xcb\x98\xfa\x12\x02\xe8\x9d\xba\x95\x7e\x41\xfb\x00\x0e\x80\x3e\xa9\xe4\x9b\xd7\x6f\xbc\x48\x9f\x13\x3e\x0a\x70\x00\x4c\xe8\x12\xce\xc4\x31\xc9\x2e\x45\x4d\x15\x05\x45\x11\x65\xd6\x36\xa6\x9e\x21\xe5\x3c\x9b\x37\xbb\x60\x9a\x8f\x00\x8d\x4e\xfb\x95\x3e\x67\xa2\x47\xce\xd0\xd0\xdc\xce\x1f\x34\xea\x0d\x56\x92\x15\x49\xc6\xba\xaa\x42\x8f\xb0\xc1\xe4\xd0\x49\xcf\xe3\xd2\x13\xc3\xe3\xf4\x29\xa2\xba\x00\x3d\x4d\x51\x54\xe8\xcb\x8a\xa4\xfa\x4e\xea\xa4\x76\xce\x9b\x7e\x55\x2a\xda\x28\xec\x5b\xf9\x30\x3e\xe6\xb5\x29\xe2\x74\xef\xc4\xe0\x52\xef\xa4\xc7\x21\x93\x34\x09\x3d\x55\xc5\x3a\x69\xb2\x67\xa7\x4e\xea\xf8\x8a\xac\xc8\x58\xd3\x64\x45\xc3\x24\xc1\x57\x49\xbe\x3e\x40\x56\xd5\x67\x7b\xe8\x56\x51\xef\x3b\x82\xf3\xea\x7d\x0f\x03\xe5\x5b\xbb\xde\xa0\x19\x66\x87\x33\x13\x41\x14\x44\x77\xb4\x99\xeb\x82\x4c\xcf\x08\xd9\x40\x10\x44\xc1\x1b\xe0\x91\x99\x09\xa2\xc8\xb8\xd8\x93\xa4\x71\x59\xa6\x1b\x43\x28\x49\x58\x86\xa1\x24\x8d\x9d\x18\xcb\xb4\x90\x07\x68\x8c\xac\x6a\x94\xe3\x3b\xa4\x09\x64\xb5\xd1\x69\x1f\x2f\xb0\x9c\x59\x81\xa4\x4f\x92\x59\xd6\x12\x05\x51\xc8\x4c\x3c\x1a\x78\xb4\xe2\x98\x11\x38\x89\x09\x5b\x21\xd4\xd0\x13\x44\x51\x48\x22\x51\x84\x61\xec\x8c\xe7\x50\xb0\x1b\x97\xd5\x19\xc7\x92\x04\xc1\xda\xf3\x81\x1b\x79\x24\x57\x1e\x5e\xce\xa7\xd3\x37\x6b\x8d\x4e\x03\x32\xec\x95\x3d\xe1\xc0\x23\x08\xe8\x19\xcf\x26\x7f\xc0\x72\x58\x71\x33\xa4\x9c\x8e\x9d\xa1\x83\x05\x98\x38\x65\x6d\xb7\x17\x0d\x95\x06\x6f\x8b\xb6\xed\x79\x43\xa5\xcf\x10\x3c\x08\xd8\xc4\x85\x09\x16\xdc\x81\x3b\x1d\x6f\x86\x6b\xac\xe8\x22\xc4\xa1\x0c\x59\x55\x8d\xcd\xeb\x24\x8f\xd0\xa7\xb3\xed\x7a\x99\xe6\x90\xaf\x0f\x8b\x83\x11\xe3\x78\x43\x51\xd8\x61\x9a\xce\x50\x92\x80\x9f\xa6\xa5\xf3\x4e\xf0\xd8\x21\x3f\xf4\xdd\x6c\x03\xab\xc5\xfc\x8e\xbc\x4d\xd2\xef\x7a\xb3\xec\x09\x28\x5f\x6f\x76\xf6\x57\x8e\xd2\x79\x29\x78\x64\xe7\x3f\x5c\x16\xc7\x1b\x9c\x1e\xa6\x29\xf6\x8b\xc3\x4b\x92\x7c\x6e\x53\x1f\x59\xb4\x86\xb6\xec\x73\xb3\x53\xf6\xbc\x93\x7c\xcd\xcf\x8f\x71\xd1\xe7\x65\xc1\x67\x2a\xa7\x29\x8b\x92\x04\xfb\x49\x52\x3a\x97\x05\xc4\xd5\x3e\x4b\x6c\xca\x4f\x8a\xf5\x7c\x2e\xd1\x3e\x77\xda\x75\x76\xe3\x28\x9f\xeb\x32\xff\xd9\x96\x33\x6f\xe4\xed\xd3\xc3\x4b\x53\x1c\x51\x16\x6c\x3f\xa3\x1a\x16\xb1\xe3\xd5\xfc\xe9\xda\x99\xb5\xb0\xaa\x7b\xe2\x07\xeb\xb2\x0d\x38\xff\x6d\xd7\x71\xce\x98\xeb\xe2\x4f\x23\x42\x9f\xc4\xa6\xf2\x9c\xfe\x19\x4f\x35\xa1\x59\x6b\x87\x67\xd5\xcd\x18\xbd\xf4\x41\x80\xcf\x3a\x05\x7e\xb1\xd2\xe7\x6c\xf4\x20\x9d\xe3\x59\x6b\x50\xf8\x7b\x04\xfa\x35\xe0\x1b\x9d\x3d\xe8\x34\x2a\xfd\xa9\x27\x4b\xe2\x6c\xc4\x48\xa2\x24\xb3\xca\x94\xae\x63\xc0\x06\xac\x8a\x85\x89\x2a\x32\x12\x23\x4a\xda\xc4\x1e\xe0\x10\x07\x03\x12\x9f\x0c\xb0\x54\x51\x68\x6d\xa3\x9e\x57\xbe\x09\xcc\x3d\x82\xf9\x09\x60\x6b\xed\x3d\x68\xd7\x78\x84\xd1\x44\x95\x18\x91\x11\x25\x95\xdc\x1b\xe0\x60\x88\x25\x3e\x52\x44\x89\x91\x66\x23\x49\x54\xee\xf6\xf9\x08\x3c\x1c\xdc\x75\x08\x4d\x0d\x89\x55\x79\x81\x93\x32\x61\x8f\x30\xe0\x45\x68\xd4\xf6\x1b\xf5\x3d\xa8\x37\xb8\x9e\x2c\x49\x8c\x38\x1b\x4b\x92\x3c\xf5\x6c\x96\x2e\xb6\x30\xf5\x58\x75\xa2\x49\xb3\xf1\x6c\x24\xaa\x13\x98\x60\x67\x00\x1e\xb8\xdb\x38\x0f\xa9\xb0\xf6\x88\xe4\x5e\x80\x5a\x83\xaf\x35\xf7\xa0\x59\xe3\x09\xca\xd9\x78\x36\x96\xd4\x09\x83\xb0\x33\x04\x0f\xbc\x81\x27\x4b\xd2\x6c\xcc\x88\x92\x24\xf3\xb1\x73\xd7\x21\xfc\xe0\x23\x32\x06\xd6\x68\x3e\x44\xf2\xa6\xc3\xb5\xee\xd7\x5a\x79\xff\xa1\x46\x60\x77\x1a\xec\x36\x17\x20\xc2\xc8\x01\x0d\xf7\x75\xd6\x5d\x72\x63\x1a\x3a\xac\x43\x3b\x14\xe1\x09\xb5\x4e\x83\xfe\x6a\x1f\x2e\xd3\x1c\xad\x51\x5b\xe7\x76\xad\xc1\x12\xbb\x47\x5a\x6c\xd4\x2b\xd2\x49\x06\xd2\xb2\x3d\x90\x6c\x3c\x2a\x38\x3f\xc4\x12\x04\x9c\xb8\x6c\xef\x64\x8c\x07\x7d\x2e\x23\x2d\x9e\xa8\x7d\x3a\xb7\x13\x12\x2c\x55\x4c\xda\x56\x3e\xd7\x8f\xae\x99\xb5\x68\xad\xd9\xa8\x35\xa0\x75\x89\x69\x14\x8f\xaf\x1b\xad\xbc\x41\x3c\x54\x25\x46\x63\x34\x49\xc5\x43\x90\x70\xd2\xef\x5b\x3e\x08\x78\xc8\xba\x78\x04\x24\xaf\x86\x80\x1d\x91\x86\xf5\x59\x8f\x74\x54\xe2\x65\x72\xc9\x89\xd5\xef\x73\x5d\x9f\xb4\x1b\x63\xa9\xe2\xd0\x76\x1f\x42\x72\x69\x2f\x73\xf3\x9e\x77\xb3\x51\xab\x58\x27\x26\xc8\x44\x35\x4d\xc6\x94\xb4\x09\xc8\xb3\x01\xf4\xf1\x70\x80\x7d\x2c\x0f\xf0\x08\x7a\xb4\xd1\x4c\x91\x44\xc6\x9a\x75\x45\x49\x99\xaa\xa4\xb7\x11\xf8\xd8\x3f\x71\xfa\x95\x61\xde\xdf\x39\x6f\xdf\x89\x64\x9a\x5d\x15\xad\xc2\x6a\xdb\xc5\xef\x03\x3a\x6f\x7c\x4d\xb7\x41\x18\xcf\x59\x3d\x06\x41\x52\x27\xa7\xa8\x9b\x11\x6e\x0f\x40\x9f\xeb\x3b\xa7\xcb\x92\x08\x2b\x6c\xc7\x63\x51\x92\x19\xbb\x9b\x2b\x3e\xa7\x53\xfe\xf7\x56\xb0\x3c\x82\x1e\xa3\x6f\xf2\x15\x0b\x96\x95\x03\x6a\x16\x78\xe6\x1c\xe9\x34\x78\x04\x73\xe9\x6f\xe2\xc2\xc2\x26\x2c\x2a\x1a\xc6\x9a\x19\x44\xcf\x98\xf4\x1c\x88\x98\xfe\x9e\x06\x7d\xfa\xce\xc1\x04\x89\xd5\x84\xb3\x73\x5d\x3c\x26\xf8\xd6\xc7\xe9\x21\x01\x43\x46\x6a\xad\x39\x81\x80\xe9\x2f\x69\xce\x34\x3c\xe8\xcf\x07\x6c\x5f\xe6\x54\x3c\x5c\x0e\x5a\x3c\xb2\x41\xca\x47\x2d\xc8\x44\xe7\xf5\xd3\xb8\x2a\xf2\x2e\xe2\xe7\x6f\xe3\x91\xb1\xba\xf2\x74\x23\x0f\xec\xab\xa0\xf3\xd9\xdd\xd0\x66\xf4\xb5\x27\x1c\x22\xf4\x2c\x8b\x77\xed\xbb\x21\xdb\x9b\xcf\xbf\x33\xe7\x61\x39\xb1\xea\x0c\x1a\x9f\xc6\x95\x1e\xa5\x4f\x9f\x86\xe5\xaa\x55\xcc\x9d\x23\xb1\x77\xf3\x90\x3e\x04\xed\xdd\x55\x79\xd7\x9e\xf5\x96\x33\xe8\x68\x12\x6f\x5a\xb6\xcd\xbb\x53\x7d\x39\x8b\x8e\x86\xde\x0a\xa5\xbd\x90\xe3\x43\xa8\xb9\x69\x73\xd6\xa4\x48\xad\x0f\x91\xdf\xaa\x05\x5a\x8e\xdd\xb9\x25\xca\x25\xb6\x62\x8f\x58\x6d\xc5\x66\x50\xc3\xc4\x4e\x08\x5b\x89\x3e\x8b\xc8\xaa\x4a\x6c\x0f\x3d\x86\x6e\xe6\x4f\xf5\xf3\x9d\x05\x1b\x9d\xc6\x7b\xa0\x7d\xeb\xea\x41\x79\x8d\xf4\x46\xf3\x3a\x34\xae\xb6\x6f\xf1\x03\x3c\x90\x12\xd7\x4b\x44\x9c\x81\x2a\x26\x9e\x9b\x48\xb0\x39\x45\x69\x66\x42\x57\x4e\x52\x08\xb0\xa5\x10\xef\xed\x46\x91\xeb\x90\x5f\x25\x4e\xc8\xeb\xe2\x71\xfc\x63\xd6\x8f\xf9\xc8\xde\x7e\x9e\x79\xd2\xdb\xa8\x54\x93\xa4\xae\xb4\x06\xb9\xa8\x1f\xcb\xf2\x5a\xfd\x98\x05\x0d\xcb\x95\x6e\x25\xa5\x98\x5e\xce\xe3\xc7\x22\xaf\xa0\xba\xc5\x2f\xab\x90\x17\xff\x9a\x77\x4f\xfa\x9c\x66\x4b\x84\x63\xb2\xaa\xe2\xa1\x22\xc9\x92\x5d\x7c\x27\xaa\xdb\xdf\xad\x5e\xc7\xcb\x4e\xaa\x49\x8a\x32\x54\x54\x4d\x19\x12\x06\xce\x32\xf2\x8d\x2c\x0f\x15\x4d\x55\x86\xa4\xe3\xb3\xcc\xee\x91\x6f\x46\x84\x17\xc3\xa2\xee\xbc\x31\xff\x31\x8f\x82\xcf\x7a\xca\x1d\x32\xaa\x43\x22\x5f\x67\x96\xfd\x98\xf3\x2c\xf3\x60\xfe\xac\x27\xc9\xee\x2c\x73\x09\x29\x97\x51\xef\x79\x8e\xe5\xfa\xdc\x85\x33\x7a\xc2\x9e\xd5\x74\x45\xc1\xa2\x8b\x85\xad\x84\x6c\xe2\xc2\xf8\xc7\x9f\xb7\x00\x32\xb2\x2a\x03\xb6\x47\xe3\xd0\xf3\xa0\xb5\x17\x72\xe0\x5c\x07\xdb\x1b\x2a\x18\x40\xec\x0c\x1d\x90\xf1\xd0\xd9\x01\x62\x2e\x93\xb2\xb6\x3b\x8b\x86\x4a\xc3\xc6\x5a\xb3\xc6\x24\x0e\x1e\x80\xe2\x0c\x5c\x88\x37\x33\x3e\x6c\xbb\xab\xb2\x28\xed\x31\x09\x24\x69\xdb\xc8\x29\xf2\xd0\xe7\xce\x98\x87\x4a\xa7\xe8\xec\x62\x48\xc5\xda\x8c\x61\xb1\x4f\x12\xba\x60\x8b\x3d\x9e\x33\x74\xce\x8a\x6c\x0b\xb8\xe7\x70\x8c\xce\x29\x12\x2b\x43\x1a\x4f\xd6\xe8\x13\xcd\xda\x22\xee\xad\xd7\xd8\x3d\xa8\x0c\xa7\xa6\x22\x4a\x79\xcc\xab\x38\x38\x04\x97\x71\x6c\xac\xcd\xc3\x5d\xac\x83\x4e\xe2\x5d\x5a\x83\x95\x91\x58\xd5\x16\xb4\x6a\x0b\x9f\xd7\xa9\x35\x3a\x7b\x0c\x47\xe3\x8c\xc2\x22\x9b\x9c\x44\xac\x31\xe3\x40\x6f\xee\xdf\xa0\x6f\x63\x8b\x78\x37\xfa\xfe\x0c\x89\x73\x49\x3c\xfe\x10\x7a\x17\x5d\x1b\x6f\x95\xd8\x2a\xc6\xc6\xfe\x1e\x34\xf6\x80\xb7\x97\xc4\x67\x7a\x81\x58\x12\x15\xa6\xe7\x80\x8b\xc3\xa9\x4b\x90\x73\xca\xb2\xad\xd5\x2e\xe4\xcd\x16\xdd\x40\x0c\x38\xa7\x93\x4a\xc4\xa7\xa8\x8a\x1e\xcc\xdf\x02\x6e\xef\x37\xf6\x61\xff\xea\xc1\xb3\xc7\xfb\x95\x68\xd6\x4b\x66\xbd\x7e\x97\x31\x92\x99\x11\x6b\xa2\xa4\x74\xf9\xf4\xae\xce\xf7\xb0\x06\xfd\x59\x84\xb5\xc8\xf0\x6d\xa0\x71\xc0\xcf\x9e\xfe\x1b\xee\x05\xfe\x1f\xa2\x27\xd0\x4b\xe8\x05\xbd\xd1\x7e\xe8\xfd\xe8\xe3\xaf\xd0\x7d\xdb\xa1\x72\xc7\x68\xbc\xe3\x63\x2f\x6b\xaf\xee\xef\x3f\xd9\x78\x97\xd9\xe2\x9e\x2c\x36\xee\xa4\x7b\x22\xbf\x05\xe2\x1f\xdf\x7a\xeb\x53\xf3\xed\xf5\xe1\xca\x83\x5c\x73\xf1\x5e\xf9\xd5\x83\x67\x6f\x77\xf2\xc5\x0e\xab\x9d\x7c\x1f\x64\xb8\xf5\x1e\xee\x98\xbe\x5e\xce\xd5\xaf\x3c\xc2\x70\x2f\xc8\xef\xfd\xf9\xbf\xf8\x9f\x7d\xf1\x73\xff\xfe\x47\xaf\x1f\xdc\x7a\xed\xcb\xff\xe1\xcf\x7e\xf2\x9b\x4f\x31\x5f\xff\xf5\x47\x5f\x7e\xe9\xbd\x0f\x4b\x2f\x7d\xe8\xd5\xc3\x3f\xff\xed\xcf\x3c\x3e\xfb\x1b\x9d\x4f\xbd\xf6\x52\xe7\xf0\xbe\xfb\x6e\xbe\xf0\x81\xc7\xdf\xf3\xd9\x57\x9f\x3f\xbc\x5c\x7f\xea\x4f\xb0\xdf\xfe\xdc\x5b\xff\xdd\xef\xfd\xa5\x9f\x7c\xdf\x2f\x7c\xe3\x27\xde\xfd\x97\xfe\xd2\xaf\xfe\xfc\x8b\xaf\xbe\xb2\xff\xf8\xfd\x7f\xff\xbf\x79\xc7\xd5\x47\xf7\xbf\xfb\x8e\x83\xda\x7d\x9f\xf8\xd6\x0f\xa6\x5f\x7e\xf2\xc3\xce\xbf\xf3\x6b\x2f\x29\xaf\xb4\x1f\x51\x5f\x73\xde\xf8\x85\xa3\x5b\x1f\xd3\x1f\x43\x08\x18\x15\x21\x3e\xcb\xdf\x47\x3d\x6c\xd0\xa1\x47\x0f\x46\x65\x46\x33\x9d\xe9\xcd\x24\x36\x9e\xda\x5d\x46\x88\xa1\xd7\xbd\x6b\xe4\xf1\xa5\x78\x3a\xae\x8c\xf9\x0c\xed\xa3\x87\x49\x34\x00\xc7\x07\xd5\x7c\x6a\x40\xab\xda\xa2\x6b\x13\x36\xe4\x3d\xb8\xd1\xbc\x8e\x6a\x57\xf6\xe0\x2a\x9d\x14\xc0\x0f\x43\x27\xec\x62\x03\xf7\xf1\x38\x23\x1f\x21\x05\x0d\x84\x99\xcc\x9a\x49\x7f\x82\x63\x4e\x9d\x26\xdd\x6c\x02\x36\x2f\x47\x4e\x94\xe1\x31\xce\xb0\xd1\x25\x1f\x41\x00\x0d\x7a\x27\x11\x6b\x06\x38\x3a\x45\x19\x63\x4c\x93\x00\x9c\x49\x96\xe7\xb1\x37\x11\xe2\x7e\x96\xff\x1e\xe2\xd1\x83\xc8\xd2\x6b\x0c\xec\xed\xf1\x0f\x7e\xd2\xe6\x5c\x2e\xe1\xc6\x1c\xc7\xa5\xa7\x3d\xbd\x55\xb9\xcf\xe0\x38\xf1\x48\xfc\xb4\xf8\x86\xf8\x55\xf1\x6f\x8a\xff\x40\xac\x88\x7a\x65\xcf\x78\xe0\x93\xfc\x03\x9f\xe6\x2f\xef\xc9\xf7\xd5\x8c\x3d\x60\xd1\x9d\xf6\x13\x77\xde\x82\xa3\xb7\xe6\xdb\x5a\xe7\x8b\x91\x3e\xa3\x1e\x43\x1b\xea\x0d\x78\x1a\x5a\x0f\x42\x95\x6d\xdc\x84\xbf\xff\xf7\xa0\x77\xf2\xfb\xcc\x2f\xc9\x4f\x5d\xaa\x3d\x7e\xed\x2e\xf3\xed\x2f\xf1\xaf\xdc\xfd\xbb\x6f\xb0\xff\xd1\xcf\x74\x3f\xf4\xa1\xee\x27\x67\x1c\xd5\xcb\x21\x42\x15\x99\x4f\x11\x8f\xde\x41\xe3\x3d\x68\x02\xdf\xa0\x6a\x09\x43\x4e\xc7\x7a\x0f\xeb\xac\x3b\xb3\x27\x8a\x2a\x6b\x7c\xea\xde\x4d\x79\x43\x9b\x09\xde\xa0\x58\xfb\x10\x02\xe4\x55\x3c\x5e\x45\x97\xe9\x48\x97\xd9\x46\xbd\x71\xf9\x26\xf9\x44\x97\x5c\xac\x78\xb3\x21\x16\x34\xce\x3c\x49\x0c\x18\x31\xf2\x6c\x8c\x23\x1c\x80\x0f\x36\xaf\x46\x38\x88\xb0\x1f\x82\x01\x22\x88\x60\x22\x16\x02\x84\x2a\x1e\x3f\x41\xef\xa4\xeb\xdf\x21\x38\x6e\x57\xdb\xf5\x06\x7d\x7d\xe1\x6a\xbb\x51\x6f\x5c\x6f\x55\x9b\xc7\x8f\x11\xba\x55\x99\x6d\xec\xc3\xd5\x83\x7d\x5e\x76\x63\x37\xc5\x93\x01\x0c\x67\x59\xdf\xf2\x49\x13\x89\x6f\x45\x2e\xce\x48\x2b\x22\x16\x34\x18\x64\x33\x4b\x49\xba\xbc\xda\xef\xd3\x36\x23\x29\x54\xe2\x2c\x02\x87\x34\x4b\xe0\x78\xb3\xf1\xc0\x06\x6d\xb3\x3f\x87\x9d\x86\x4c\xa2\x0d\xe6\x26\x74\x8a\xfe\x40\xc0\xc8\x30\x32\x4e\x12\xce\xd4\xb0\x38\x1b\x30\x12\x58\xe0\xe3\x00\x47\x5e\x08\x7e\x04\x5e\x84\x13\x3c\xc6\x63\x9c\x12\x1d\x0c\x4e\x7b\x15\x8f\x4f\x69\xc5\x86\x44\xa4\xd5\x26\x5d\x9f\xa9\xd1\x69\xec\xdf\x68\x36\x3a\x8d\x5b\x07\xc7\xed\x7c\xc5\x2e\xb8\xd1\x62\xab\x6c\x5b\xde\x67\x32\x3b\xb6\xbb\x80\x32\xac\x32\x72\xdf\xb6\x49\x13\x51\x60\x47\x1e\x68\xa4\x15\x46\x97\x7b\x89\x39\x08\x60\x64\x78\x69\x4a\x9b\x74\xc4\x48\x49\x86\x31\x8e\x48\xab\x4c\x77\x60\xe3\x7e\x44\x1d\x07\xa0\xdf\xc7\x57\xf8\x16\x5d\xff\xe2\x58\xaf\xa1\x9f\xae\xfe\xfc\x1e\xda\x53\xf7\xf4\x3d\x77\xcf\xdf\xe3\xf7\x88\xd6\x5d\xba\x22\x19\xec\x4f\x73\x3f\x27\x30\x9f\xe6\x59\x0e\x3d\x8c\xee\xdc\xba\x43\xd7\x66\x79\xa2\xd8\xf5\xb6\x78\xed\x9a\xfb\xe2\xec\xca\xf7\x39\x1b\x5f\xa9\x4c\xdf\xe6\xaa\xbf\x3d\xf9\x14\x8d\x15\x3e\x88\xaf\x70\xff\x0b\xff\x3d\x74\x3f\xfa\x93\xfa\xfd\xc2\x27\xdd\x0a\x30\x15\xa6\x82\xee\x4b\x4f\x7b\xff\xc5\xde\x83\xc6\x7d\xf7\x3d\x50\xdd\x4b\x4f\x87\xfa\xde\x25\xc9\xd8\x63\x11\x7a\xc7\x03\xb4\xcd\x7d\xc9\x10\x18\x66\xaf\xfa\x69\x8e\xdd\xfb\x34\x69\x93\xae\x7a\xf1\xe2\x51\x1b\x9e\xa8\xb5\xa5\xa3\x76\xfb\x89\x5b\x44\xb5\xf3\x15\xe4\xe8\xd6\xb5\x7b\x74\x19\xd3\x3d\x68\xd4\x3f\xc8\xb8\xb3\x98\x33\xa6\xbf\xc7\x3c\x3f\x4b\xd8\xdf\xc4\x57\xbe\xcc\xfe\x15\xf6\x89\x5f\xfc\x9d\xd9\xde\xf4\xaf\xff\x0e\xc1\xf4\x59\xe6\x6b\x1c\xc3\x5e\x43\x2c\xba\xa5\x3f\xca\xf0\xdf\x42\xf0\x75\x04\xbf\x8c\xe0\x63\x08\x3e\x84\x40\x43\x70\x05\xc1\x1e\x02\x84\xbe\x03\x7f\x87\x2e\x95\x3f\x7f\xaf\x5e\xfc\xa7\xf9\x82\xf9\x9f\x65\x7f\x8b\xf9\xda\xb7\xbe\x45\xec\x0e\xc9\x50\x86\x74\xed\x06\x6a\xb1\xf9\x21\x5d\x89\x21\x5f\x66\x81\xe8\x4a\x82\xe2\x8a\xc9\x23\x3a\xcf\xe4\xf0\x80\x87\x2a\x7d\xa3\xe8\x98\x67\xdb\x9c\x01\x99\x86\x65\x50\x03\x3c\xc2\xa3\x00\x14\xac\x68\x90\x09\x5d\x56\x8a\x63\xe2\x77\x21\xc2\x8e\x03\x41\xd0\xed\xce\xd7\x3c\x3e\x3c\xfd\xbf\xb8\x7f\x58\x89\x91\x80\x9e\xd4\xf7\x01\x55\x78\xc2\xca\xaa\x20\x0a\x2c\xfb\x5d\x8e\xab\x22\x74\x74\x44\x6c\xf8\xd1\x91\xd6\x7e\xee\xb9\x87\x8e\xa4\xa3\x76\x8d\x8c\x7a\xbe\x09\x44\xa5\xa0\xcd\x7c\xf9\xd7\xf0\xbf\xfe\x5d\xb8\xf9\x43\x06\xfd\x95\x07\xd9\xfb\xbe\x31\xfb\xd3\xfc\xdf\x42\x88\x61\x44\x08\xf9\x09\x27\xa2\x77\xd2\x19\xce\x24\xba\x5f\xbc\x44\x78\x30\x5f\x9c\xb0\x7a\xf5\x05\x38\x9c\xaf\x08\x7b\x8b\x1f\x4b\x5a\xcf\x0b\xba\x41\xdc\xf5\x53\xcf\x4f\x55\x45\x13\x65\xcf\x71\x3c\x15\xdb\xb6\x6f\x38\xb6\xe9\x43\x2c\x0e\x07\x49\x10\xa4\xc3\x81\xe0\x0b\x69\x9a\xa6\x4e\x3e\xa1\x9a\x45\xbf\x04\xff\x01\xff\x0c\xf7\x20\x7d\x4f\xf4\x25\xf4\x67\xf5\x57\x3f\x70\x00\xc6\x03\x30\x7e\x05\x8e\x5e\xf9\xf4\x2b\xcc\xf3\xad\x0f\xb6\x3e\xd7\x62\x1f\x3f\x86\xe3\x77\x0a\x2d\xee\xce\x2f\x1d\xfd\xb5\x23\xe6\xe8\x3f\x91\x2f\xab\x97\x99\xcb\xde\x1d\xb8\xf3\x9f\xa2\xdb\x8f\x7f\xf7\xe0\xf9\xc7\xbe\x2b\x1c\xb7\xde\xc9\x1d\xf0\xe8\x01\xf1\x01\xa6\xfa\xc0\x03\x8f\xfe\xcd\x03\x90\x0f\xe0\x00\x1d\xbd\xfe\x7a\xbb\x7d\xf4\xa9\xd7\xdb\x97\x0f\x9e\x7b\xeb\x16\x5d\x4d\xf4\xad\xd7\x8f\x5e\x7f\xeb\xf5\xcb\x07\xcf\xbd\x4e\x57\x3b\x7f\xfd\xf5\x7c\x8d\xa0\x1b\xad\x7c\x81\xa6\xf9\x9a\x58\xb9\x5f\xe3\x6f\x3d\x7b\xbc\xdc\x4e\x18\xae\x57\xaa\x8f\xc0\x7c\x15\x2d\xfe\x99\x27\x3e\xfc\xc5\xf7\xbd\xfe\x9b\xef\xbd\xf6\x27\x3e\xf2\xd1\x27\xde\xfb\x0b\xaf\x3e\xf5\xc4\x47\xde\x78\xe9\xff\xf7\x37\xde\x73\xed\xe5\x57\x3f\xae\xbe\xef\x8b\x1f\x7e\x62\xfa\x95\x3b\x5f\xb8\xfd\xcc\xe7\x5f\x51\xf4\x27\xa5\xfa\x93\xef\x65\xfe\xdc\x9d\xcf\x1f\xb7\xbf\xf0\x72\x4b\x7f\x4a\x7a\xe8\x69\x9d\xf9\x27\x77\x7e\xf1\xe3\xb7\xff\xf4\x97\xd5\x57\xb5\x47\x9e\xfc\xc9\x3f\x63\xbc\xf7\xcb\x1f\x7b\xe6\xf3\xae\xfa\x11\xed\xd1\xa7\x7e\xf2\xcf\xbc\xfd\xf1\x9f\xf9\xd4\x4f\x5f\x6b\xbf\x7c\xe3\xb1\xf7\xdd\x7a\x04\x3e\xf7\xf1\x9f\x79\xfd\x4f\x5e\x6b\xbf\xdc\xba\xf1\xd2\x33\xef\x42\x40\x22\x94\x4a\x48\xed\x30\xca\xd3\x08\x70\x43\x2e\xe4\xd3\xbb\xc3\x88\xda\x25\xa7\x38\x5f\x41\xa8\xd1\x82\x36\xb1\xd4\xae\xc0\x5a\xf1\xb4\xcf\x39\x1e\xaf\xe7\x97\x21\x80\x14\x4b\x8c\x41\xf7\x78\xc8\x77\x78\x48\xc3\xb0\x22\x4d\x8a\x79\xe7\x58\x62\x85\xad\xfd\x1f\xdc\x28\xc2\x61\x7e\x15\xdd\xff\x01\x18\x01\x24\x7e\xc2\xd1\xb6\xf6\xa0\x4d\xd2\x65\x46\x80\xae\x03\xd4\xca\xa4\x40\xdd\x2d\x33\x9c\xc9\x9b\xd7\x32\x6d\x68\x02\xd3\x05\x03\x9c\x18\xcb\x0e\xb6\xb8\x74\x26\x33\xc3\xa9\xcd\xc6\x14\x5b\x8c\xec\x8a\xcd\x5b\x24\x92\x3b\x6c\xd6\x44\xa6\x79\x9d\x79\x08\x9a\xc5\x84\xbd\x8a\x1d\x4d\xb2\xc1\x38\x02\x0b\x04\x62\x98\x6d\x46\x06\x99\x44\xe9\x78\x38\x1b\x32\x0a\x98\xd4\xce\xc6\x1b\x74\xa0\x9d\xaf\x1d\xf8\x10\xf9\x40\xe9\x40\x1c\x8d\x07\xd9\x24\x37\xc4\x13\xdc\xe5\xad\xd9\x00\x0f\xe9\x56\x0d\x32\xa3\xcc\x06\xb8\x4b\x2c\x3e\x58\x08\x90\x88\xaf\xb0\x95\xca\x15\xd4\x44\xc7\x7a\x53\x3c\xcc\x0e\x99\x2b\x1c\x54\x38\xe0\x1e\xf8\x5b\x0f\xd7\x61\xaf\x0e\x75\xf1\x11\xf9\x11\xe6\x91\x87\xbe\x7b\xf9\x5d\xd5\xef\x22\x44\x2d\x15\x1c\xbd\xde\x7e\xfd\x75\xba\xe1\x7e\xbe\x5e\x6d\xbd\xd0\xa6\x5a\xa1\x74\x9d\x42\x9f\x6a\xb7\xdf\xc3\x30\xbf\x7a\xfd\x43\x57\x2f\xbf\xf8\x58\xfb\x7d\x2d\xf1\xd6\x27\xfe\xdc\x07\x1f\xfb\xd0\xc1\x95\xf7\x34\xdb\xaf\x3c\x7e\xf9\xe8\xe3\xbf\x5c\xb9\xb2\xb7\xf7\xcd\xbd\x5a\xeb\xbd\x3f\xf5\xd4\xdd\xff\xfe\x53\x6f\x7e\xec\xe6\xfd\xc2\x37\x05\xf1\x50\xff\x29\x95\x6f\x7d\xea\xcd\x8f\x29\x54\x66\x1e\x96\x2a\x41\x45\x42\x07\xb4\x32\x55\xa7\xa3\xb4\xb6\xb2\x1e\x4b\x8d\x8c\x64\xfe\x8c\xef\x39\x57\xd7\x4c\xab\xdb\x35\x35\x4d\xb7\xac\x6e\x6c\x31\x86\xa6\x59\x56\xb7\x6b\xe8\xba\x66\xd9\x71\xd7\xaa\xa0\x50\x72\xbd\xbb\x83\x24\x11\x43\xc9\x73\x79\x25\x49\xa5\xad\x6f\xc8\xb8\xf6\xb1\xc4\xfa\x15\x09\x1d\xa2\xc7\xf3\x1a\x19\xb5\x20\x45\xbb\x8f\x40\xfd\x4a\xa5\xba\xd6\xfc\xd3\xd0\xb9\xfd\x6c\xbe\x55\x73\xad\x52\xbf\x02\xdd\x6e\xd7\x54\x49\xe3\x7e\xb7\xeb\x13\x44\x3a\xf9\x1c\xc7\xa0\x86\xb8\x17\xb2\x11\x48\x45\xcb\x78\x22\x67\x7e\xd0\x97\x71\xaf\x40\x00\xaa\x9c\xf9\x7e\xe6\x61\x53\x27\x9a\x0a\x89\x1e\x45\x79\x8c\x37\x3a\x1d\x56\x24\x4e\x2a\xde\xf7\x5e\xdf\x37\xe0\x8c\xb7\xbd\x39\x7f\xbe\x9f\x00\xb6\x75\x8d\xfc\xd5\x74\x56\x9b\x7f\xc7\x06\x86\xae\x1b\x86\x61\x4c\x63\xf2\xbb\xf8\x07\xf9\xbb\xab\x3d\xfe\x8c\xb6\x99\xe1\x76\x2b\xd8\xd9\x6a\xcf\xd8\x6c\x97\xc8\x9e\xf5\x4f\x87\x9c\x5f\xb4\xb7\xd6\x5a\xad\xb4\x47\x67\xf7\x02\x71\x1b\xd8\x8f\x2e\x86\x9e\xdf\xd1\x93\x69\xff\x1c\x1e\x6e\xf5\x69\x85\x97\x00\x31\x84\x15\x9b\x13\xf3\x15\x40\x0b\xcf\x73\x07\x68\xad\xac\x7e\xa5\xd2\x6c\xcd\x5f\x78\xb9\x04\x05\x04\x26\x13\x4c\xdb\xd6\x3d\x5f\xb7\x7c\xdb\xef\x26\x9e\x68\x38\x8e\xa1\x59\xa6\x1e\xc5\x41\x37\xe1\xc4\x80\xf8\xa0\x9e\xed\x9b\xc4\x31\xd1\x7f\xe8\x9e\x4d\xbd\x14\xd1\x5f\x07\x8d\x39\xc4\x4d\xe8\xca\x32\x07\x08\xed\x17\x2f\x6d\xd2\x45\x2a\x1f\x6b\x5e\x67\x3b\x8d\x3a\x09\x32\x1c\x3b\xb2\x41\x32\x5c\xd7\x8e\x6c\x3c\x32\x1c\x8f\x8d\xa6\x0e\x1b\xb1\xc3\xae\xe3\xf9\x5d\xc7\xc3\x4a\x14\x61\x27\x0c\xf3\xf5\xbd\xe0\x2b\x1c\xc3\x1d\xa2\x26\x7a\x3f\xfa\x90\xfe\xf4\x7b\xaf\x7d\x40\xfc\x00\x3c\x2d\xde\x27\xdf\xc7\xdc\xa7\xdf\xfc\xce\x33\x7f\xfb\xa5\x83\xef\xdc\xf7\xe8\xdf\x7e\x17\xff\x9d\x7f\xf5\xc0\x1f\x3e\x70\xfa\x00\xfb\x80\x7e\xe9\xb2\xf1\xc0\x03\x2f\x7c\xe7\xe9\x97\xfe\x0e\xba\xd3\x7e\x8b\x06\xf0\xed\x3f\xba\xf5\x96\xf8\x47\x6f\xb5\xa9\x61\x11\xff\x29\xc9\xcd\x8a\x55\xbd\x08\xc6\x47\x98\x83\x62\xbd\x2f\x82\xf4\x69\x86\x3d\xe7\x1c\x73\xf9\xf0\xf8\xa9\x9b\x57\xdf\xf5\xee\x17\xb4\x87\x7e\xee\x37\xae\xdd\x3a\x7e\xe9\xe8\xf0\xf8\x48\xa1\x5f\x48\x9f\xf9\xab\xc5\x17\x67\x5e\xf1\x33\x7f\x8d\x7c\x01\xbf\x27\x5e\x7d\x80\xdf\x6f\x3c\xf9\xd0\x6f\x7f\x81\x7f\xe0\xa1\x2b\x6b\xff\x82\xef\x8a\xf5\x07\xf8\x7d\xf9\xc9\x77\xfe\xf6\x17\xf9\x07\x1f\xba\x92\xff\xeb\xa9\xfc\x24\x1d\x23\x31\x8a\x2b\x36\xdf\x43\x87\xc5\x9b\x65\x17\x92\xed\x9c\xfb\x4b\x19\x9b\xa1\xb5\x2d\x63\x99\x38\x1e\x36\xe6\x7b\xbe\x63\x5a\x76\xea\x78\x56\x12\x06\x89\x5f\x88\x3a\xeb\x86\x41\x32\x25\xf2\x49\xa9\x81\xe0\x8a\xbc\xb1\x5b\xac\x27\xf4\xe8\x86\x85\x28\xda\x5c\x1d\x4b\xac\x3a\xd7\xe2\x53\x94\xb7\x35\xff\x37\x2f\x15\x0a\x3c\x9b\x84\x21\xb6\xa3\x08\x2f\xb6\x23\x01\xf4\x59\xf4\x3b\x1c\xc3\x73\x68\x1f\x7d\x5b\xaf\xdd\xf7\xc0\x83\xb5\xcb\x7b\x97\x2f\x23\x96\xab\x0a\xfb\xc2\xde\x7e\x7a\x3a\xd6\x5f\xdd\x13\xf7\xf7\xf6\xf7\x2a\xe2\xfd\x75\xbd\x0e\xf0\x8f\x2a\xf0\xf7\x2a\xf0\x1f\x57\xe0\xcd\x0a\x7c\xa5\x02\x4e\x05\xde\x57\x81\xe7\x2a\x50\xd9\x13\x84\x07\xb8\xef\x54\xf7\x2f\x5f\xae\xa1\xef\x3c\xf8\x28\x7b\xc4\x32\x5f\x65\x01\xb1\x22\xcb\x54\x58\xf6\xbe\x71\x15\x2e\x55\xdf\xa8\x32\xd5\x45\x14\xf4\xfa\x97\xda\x6f\xdd\xca\x17\x58\x6e\xd7\xda\xcb\x68\x96\x6a\x12\x5d\x53\x51\xd3\x6a\xed\x3f\xff\xb5\x1f\xfc\xe0\x07\x3f\x80\xb6\x48\xff\x3e\xa3\xc2\x3c\x0d\x39\x58\x24\x58\x2d\xf8\xd4\x04\xde\xf3\xcb\xf8\x03\x30\xfd\xb5\xbf\xf8\xa7\xef\xe2\xff\xf2\x2b\xf0\x7d\x8c\xfe\xc2\xaf\xc3\xf7\xbf\x05\xdc\x5f\x85\x87\x5f\x18\xfe\x55\x3c\xfd\x16\xfe\x3f\x9f\x43\x2c\xa3\xa2\x31\x9f\x71\x69\xf1\x5c\x18\xcd\x39\x99\xbf\x1b\x98\xf3\x8d\x1c\x9c\x4c\xc6\xca\xea\x78\x21\x42\xe1\xfe\x25\xaa\xa0\xfb\xd0\x4f\xea\xb7\xf6\xd0\x3b\xf4\x77\x80\xa0\x03\x00\x03\x3c\xcf\x56\xde\x40\x5f\x45\x8c\x4a\x82\x73\x4e\x66\xc1\x64\x5d\xd6\x67\x33\x76\xcc\xf2\x77\x08\x0f\xa0\xc2\x22\xd2\xe3\xd7\xbf\xd4\x6e\x1f\xbd\xfe\xfa\xad\xd5\x5d\x38\xe8\xb0\x39\x84\x0e\xd4\xf7\x98\x4e\xa3\xce\x31\xd3\x9f\x63\x7f\x6b\xd6\x60\xfe\x15\xf9\xfb\x07\xd0\xfd\x2c\xbc\x15\xe3\xdf\xc0\x7f\x1f\x7f\x89\x44\xf6\x65\x58\xf8\x1c\x4b\x05\x2a\x3c\x07\xc0\xa2\x37\x2a\x5f\xad\x30\x6a\x05\x2a\x15\x66\x37\x96\xf6\x16\x96\xfd\x3d\x02\x06\xea\x24\xa1\x60\xfe\xe7\xd9\x23\xec\x6f\x11\x24\xf0\x0d\x78\x1f\x7c\xee\xb7\xf1\xa3\x9f\xc5\xd6\x1f\x10\x24\x6c\xae\xa3\x15\x83\xe2\xa0\x95\xa1\x79\x1f\x08\x37\xf9\x8c\xf0\x71\x1e\x43\x91\x83\x91\x61\x48\x03\xb1\x00\x87\x38\x58\xe8\xfa\x36\x1d\x66\xde\x7c\x2e\x15\x12\xae\x2d\x25\xc3\xf4\xc0\x05\x8f\xc6\x68\xf2\x60\x4e\x84\x01\x11\xa5\x95\x31\x97\xef\x5f\x85\x72\x6e\x02\x9f\xff\xe1\xba\xc4\x0c\x12\x24\x8c\x31\xff\x94\x2e\xa1\xc4\xcb\x8f\x05\x9d\xc9\x9c\x4e\x8e\xe4\x30\xe7\x07\x6b\xcd\x81\xcc\x52\xfa\x29\x9a\x3a\x60\x2d\xc1\xc4\xcb\x8f\x88\x61\x54\xa4\xf3\x19\x6f\xa2\x4b\xb4\xba\x50\x3d\xae\xf3\x2c\x5f\x07\xb6\xb9\x7f\xd8\x81\x7d\x38\xae\xf2\xba\x3d\xc6\xbd\x10\x32\x8c\xe2\x20\xc5\x19\x83\x02\x3c\x30\xc7\xbc\x39\xf6\xe3\x18\xc7\xa3\x18\x04\xec\x43\x1a\x3b\x20\x80\x31\x53\x32\x7f\x8b\x66\x4e\xef\xb8\xda\x39\xa4\x34\xd9\xea\x21\xaf\x27\xa0\xcf\x46\x41\x60\x0f\x40\x89\xb0\x0e\xe3\xc8\xb2\x41\xe4\x4d\x6c\xc6\x0e\x1e\xe1\xde\xd0\x89\x43\xf0\x86\x31\x9e\x80\x37\xcb\x86\xc1\x4a\xcd\x20\xaf\x76\xca\x5c\xfd\x0a\xb7\x51\x02\x19\xe2\x21\x09\x66\x19\x79\x36\x9c\xc7\x9f\xbc\x1a\xae\xc6\xbb\xc6\x3a\x9d\xc3\x4e\x43\x7e\xac\x73\xfb\xb1\x8d\xd2\xc3\x32\x20\x96\xc1\xa2\x0f\x09\x13\x8f\x86\xbb\x21\x4e\xf3\x70\x97\xc8\x71\x5e\x47\xb9\x4a\x9f\x5b\xe7\x55\x14\xd8\xa8\xa0\xec\x41\x53\xe6\xea\x22\xaf\x38\xb1\x93\xe0\x09\x16\x6d\x8f\xa0\xeb\x7a\x79\xed\xc4\x03\x0b\x77\x21\xf3\x48\x6b\xbc\xda\xef\x87\x53\x5f\x8c\x94\x38\x8b\x69\xd5\xc4\x98\xca\xac\x39\x99\xef\x7b\xb6\xa8\x73\xe4\xed\xe5\x15\x8d\x66\x5e\xec\x80\x79\xa1\x83\x85\xb6\xfc\x58\x47\xe4\xd3\xbc\x92\x91\x0c\xf3\x3a\x07\x8c\x6d\x97\xf4\x26\xf6\x6c\x05\xab\x3e\xe9\x20\x9f\x0e\x48\x9e\x31\xc1\xdd\x34\x8d\x58\x4f\x0a\xe5\x2e\xee\x4e\x93\xf1\x00\xa4\x45\xdf\x12\x54\xa3\x73\x15\xd6\xb8\xdd\x21\x5c\xea\x34\xea\x5b\x1c\x8f\x71\x08\x0e\x38\x33\x95\x1b\xf3\x49\xd4\xcf\xfa\xfd\x08\xb4\x31\x20\x50\xef\x9a\x79\x2c\xb9\x49\x77\x9d\xfb\x57\x72\xba\x5b\x12\x70\xc0\xc1\x21\xee\xce\x06\xdc\x18\xac\xa8\xdf\xcf\xfa\x11\xce\x4e\xd1\x18\xf7\x71\x37\xa7\xcb\xa3\xc1\x69\xaf\xaa\x54\x04\x74\x3f\x12\x51\x9d\x56\xb6\x10\x14\x2f\x43\x91\xdf\xec\x0d\xd4\xaa\xb1\x15\x54\x6d\xec\x3f\x8b\x8e\x6f\xc2\x55\x74\x50\xab\x2a\x58\xc6\x29\x4e\xb1\x0c\x03\x30\xc1\x84\x41\x2c\xe1\xde\x28\x1c\xe1\x54\x64\xf4\x70\x08\xba\x3c\xeb\xcd\x54\x19\xf4\x21\x33\xc4\x29\x56\x60\x00\x06\xb9\x0c\x2b\x78\x3c\x02\x43\x9a\xa5\x8c\x21\xe1\x64\x38\xd3\x24\xd0\x86\x43\xdc\x97\xa8\x79\x58\xc1\x52\x43\x07\xe8\x1a\x8d\x61\xe7\x40\x6a\x22\x82\x1b\xcd\xeb\xd5\x3d\xa8\xd4\xaf\x1c\xec\xc1\xb3\x9d\xdb\x2d\x5a\x18\x3d\x06\x0e\x51\xe2\x0b\x4c\xcc\x38\x1d\x8d\x12\x88\x67\x93\x20\x84\x88\xb1\xc3\x00\xbb\x18\x75\x87\xc3\x14\xbb\x15\x01\x2b\x38\x59\x03\x95\x45\x21\xb6\x41\x4b\x46\xa3\x14\x22\xec\xa6\xc3\x61\x97\x5c\xef\x07\x10\x22\x76\x05\x53\x1e\x53\xaf\xf2\x66\xe5\xf3\xaa\xe7\xde\xe6\x4f\x84\x3d\x3c\xc9\xa7\x6e\x80\x00\x02\x04\xb3\xf1\x62\xdb\xb0\x4d\x0e\x25\x20\x82\x8f\x7d\x3a\x5a\x7c\xf0\x41\x28\x1c\x3b\x02\x34\x42\xa8\x2a\xd1\x1a\x3d\x6a\x17\x53\xda\x46\x4c\x16\x32\x59\xc4\xcb\x79\x82\xcd\x2c\xf2\x70\x8e\xe6\xd0\xb5\x46\x6b\x0f\x1a\xb5\x4a\x78\x77\x28\x70\xd1\x54\x61\x33\x3e\xbd\x6b\x04\xbc\x7a\x77\xc8\x99\xf4\x3d\x55\xc4\xd8\x4c\xc6\x1a\x9b\xfb\x9a\x31\xd9\x62\xb5\xb5\xac\x58\x18\x2a\xcf\xdf\x0d\x2c\x71\x52\x5e\x07\xc8\x9f\xbf\x71\xd2\xac\x17\x32\x19\x2f\x4f\x26\xd5\x38\xaf\x15\xa5\x58\x62\x83\xfc\x1a\xfa\xec\xa7\x91\x32\x59\x38\xeb\xf1\xe9\xc4\xae\x0a\x5b\x34\xda\x94\x86\x1a\x32\x3a\x96\xaa\xf1\x64\x5c\x46\xa3\x4d\x68\xe8\xe1\x4c\xc5\xdd\xaa\x38\xb1\x11\xa0\x01\x68\x55\x85\xb3\x89\x05\x2f\x64\xd2\x2c\xf2\xf4\x70\xce\xec\x68\xce\x7e\xd0\xe6\x3c\x9d\xf3\x98\xb6\x71\x3a\x80\x01\x37\x61\x74\xc4\x22\x44\x22\x3c\x85\x97\x61\xe0\x14\xeb\x11\xae\xca\xfd\xfa\xd9\x72\xe7\xe7\x2b\xa5\x1e\xb7\xb7\xc5\x6e\x62\x13\x0f\xf0\x00\x9b\x90\x80\x02\x0a\x24\x33\xd7\x15\x24\xd5\xd2\x86\x76\x89\xd8\x15\x48\x8a\xeb\x2d\xe8\x86\x8c\x6c\xf9\x92\x62\x18\xc9\x06\x96\xa3\x73\xb0\x94\xae\x91\x5a\x6f\x5c\x00\x18\xd6\x66\xc3\xcc\xd7\x0d\xc3\x72\x34\x37\x74\x03\xd3\xef\x42\xb4\x13\xa3\x35\x0a\x3c\xc3\x30\x4c\xc3\xf1\x1d\x33\x0a\x13\x61\x03\xeb\xf3\xe7\x8c\x97\xdd\x8b\xb6\x5e\x84\x9f\xf6\xb0\x1b\x87\x96\xeb\x39\xae\xe7\x9a\xa6\x63\x1b\x86\x6b\x6b\x6e\xe4\x05\xbb\xb0\x83\x26\x27\x7e\xa0\x3a\x9a\x69\x99\xa6\x65\x5a\xba\x6e\x98\x96\x67\x27\x74\x2e\xe3\xba\xec\x1f\x3f\xbb\x17\x87\xcb\xbd\xaf\x9a\x9d\xdb\xc7\xcd\x4a\x95\xbd\x08\xb3\x15\xdf\xc1\x0e\x84\xae\x3f\x12\x04\x41\x99\xec\xc2\xaa\xf6\x7a\x36\x63\xce\xd2\x2c\x72\x55\x1d\x47\xdb\xfa\xd9\x3e\x47\x27\x3a\x8b\xd5\xc7\x2f\x41\x6b\x9f\x44\xd2\x8b\x5d\x36\x2e\x00\x75\x2a\x5b\xbe\xed\x38\x8e\xaa\xc9\x9a\x0c\x31\xee\x49\xa6\xea\x47\x71\xb4\x93\xbf\xae\xa3\x59\xb6\x65\x09\x82\x02\x91\x7d\x8a\xc4\xd0\x8d\xc2\x2d\xde\x3e\x45\x9f\x18\x9f\xa5\x21\xf5\x1b\x4d\x99\x6d\x2f\xd0\xde\xe8\x88\x97\xdb\xb7\xd8\x22\x5d\x23\x5d\xba\x88\x82\x0c\x15\x1d\x4f\x04\x41\xf3\xdd\x20\xf4\xfc\xb8\xd7\xd3\x22\xd3\x71\x4c\xd3\x34\x77\xf5\x80\x19\x58\x22\x8e\x9c\xc0\x0f\xe2\x7e\x0f\x10\x20\x6c\x39\x9a\xe3\xd9\x8e\x65\x6f\xf2\xff\x91\x73\xf8\x0f\x0d\xe2\x99\x2f\xc2\x6a\x1f\x4c\xac\x33\x2a\x4e\x77\x8e\x3b\x56\xb0\xad\xe9\x78\xd3\x7f\x1f\xa0\x27\x50\x07\xe9\x3b\xc7\xdc\x8d\xce\xed\xe3\xc5\x46\x7d\xd5\xf9\xba\x1d\x57\x0e\x16\x8c\x6d\x5d\x84\xb1\x7e\x1a\xfa\x41\xd0\x0d\x03\xd7\x0d\x26\x01\xc9\x35\xbd\x88\x0c\xa4\xee\xce\x91\xa7\xdb\xa1\x13\x78\xe4\xea\xc0\xf2\x3c\x2b\x94\x75\x5a\x6f\x72\x22\x83\x18\x13\x83\xbe\xdb\xb4\xae\x27\x4f\x9f\x67\x49\x0a\x0d\x6f\x2e\x7d\x57\x5d\x64\x9a\xd7\xf7\x17\x2b\x92\x5c\x29\x71\xc8\xdb\xdc\x37\x14\x3d\x08\x72\x3d\xf1\xbd\xb9\x9e\x18\xa6\x69\xec\xea\x4f\x64\x8b\x49\x62\xe7\x6a\x72\x8a\x4e\x11\x74\x6d\x7d\xae\x26\x1b\xf2\x69\xa2\xa3\x73\x6d\xe2\xed\xa5\xb2\x2f\x56\x31\x69\xdf\x7a\x16\xee\xc9\xc7\x4c\x07\x41\x18\x06\xe4\x80\x9e\x69\x11\xeb\x66\x99\xb3\xae\x23\x88\xba\xa5\x8d\xac\x9d\xd2\x51\x86\xc3\xe1\x70\x34\x1c\x8e\x92\x34\x4d\xd2\x24\x39\x45\xc4\x13\x89\x2a\xf1\x44\xf7\x64\x1b\x57\x3c\x23\x34\x6b\x9d\xea\x05\xd1\x7b\x0b\xa4\x82\x13\x5f\x00\x70\xc8\xc8\xb6\x47\xe1\x4d\x23\x46\x1e\x04\x46\x31\x1f\x7d\xdd\x67\x9e\xa7\x3f\x67\x78\xcd\x7b\xf3\xec\x78\x3c\x1b\x0c\x3c\x5d\x37\x6c\x5b\xf7\x02\xcf\x37\x82\x2e\xc4\x33\xf3\xa2\x6c\xdf\x76\xa5\xf6\x2a\xdb\x37\xfa\xf3\x3c\x7a\xe5\xc7\xf2\xac\xf7\xa6\x50\x58\x1a\xc4\x71\x68\x39\xbe\xe3\xb8\x2e\x5d\x32\xc7\x70\x1c\xcd\x0b\xfd\x60\xe6\x5c\x58\xad\x34\x39\xf1\xc2\x6d\x77\x8b\xc5\x65\x37\xf9\x2d\xdd\xea\x9c\xdd\xcb\xd6\x96\xe7\xbd\xff\xde\x7a\x35\x5e\xf1\xc1\xa2\x3c\xe9\x5d\xb4\x27\x1b\xce\x18\x0f\xce\x91\xd3\x75\xf4\x9e\x0b\x8d\x8f\xfd\x1f\xd3\x49\xeb\x73\xf0\xa1\xe5\x3b\xc4\x5b\xeb\x52\xe1\xad\x0d\xcd\x8f\xe2\xd8\xbf\x50\xb4\x99\x0f\xa2\xb4\xd4\x71\xf3\x5b\x7e\xfb\xe5\x1f\xc7\x73\xdf\xa3\x02\x26\x25\x4e\xdc\xb6\x89\x13\xc7\xc2\x45\xe5\xb6\x70\xe7\x61\xb4\xe9\xce\xb1\x7a\xae\x0c\x6f\x5e\x4c\x86\x17\x77\xf4\x0b\x71\x4d\xc0\xc2\xda\x85\x3c\xfe\x52\x3e\xd1\xc2\xf9\x57\x4a\x7c\xbf\xf1\xff\x82\xf7\xbf\x07\x6b\x8d\xb5\x34\xf2\xc2\xa0\x1b\xf8\x1e\x89\x02\x0c\x43\x37\xfc\x88\x78\x9c\x2e\xb6\x2e\x64\xbd\x77\x07\x03\xd8\x99\x5b\x75\x7e\x2b\x26\x38\xc7\x0a\x5e\x20\x2a\xb8\x37\x25\x9c\x09\x45\x80\xe0\xf9\x73\x1d\x34\x5c\xc7\xb0\x4c\x13\x5f\xd8\x76\xe4\xa1\x82\x1f\x6c\x87\x0a\xa4\x97\xe5\x76\x90\xc4\x0c\xef\xff\x11\x62\x86\x1f\x3d\x17\x9c\x29\xdb\x01\x04\x16\xb1\x90\x7a\x9a\xa6\x9b\x96\xee\xf8\xae\x67\x78\x21\xb8\x3f\x42\x2c\x61\x0d\x43\x92\x65\xe6\x6e\x2e\x8c\x12\x81\xe6\x32\xe1\x69\xaf\xea\x56\x10\xda\x43\xfb\x34\x96\x6e\xa3\x9a\x08\xcd\xc5\x2f\xf2\xcf\xc3\x95\x68\xa2\x67\xe1\x21\xc8\x16\xce\xf8\xd4\x02\x09\x0f\x6d\x50\xa6\x83\x79\x62\x5d\x41\x38\xc6\x1a\x36\x70\x0c\x1a\x0c\x61\x74\x82\xc0\x86\x14\xfa\x60\xe3\x1e\x96\xb0\xac\x2e\x13\xeb\xad\xb6\x9f\x38\xa3\xed\x33\x78\x59\x06\x64\x16\x97\x24\xd2\x3b\x31\x6d\x27\xd2\x5b\xd8\x9e\x2d\xc7\x76\x11\x6f\x5f\xc6\xaf\xfe\x59\x89\xf3\x2e\xac\x30\x39\x2b\x71\xe6\x36\xe4\x78\xe3\x2c\x49\x6e\xe5\xcc\xa5\x8c\x4c\xd6\x1d\xf4\x2e\x5c\xe3\xad\x24\x79\x9d\x7f\x47\x67\xa0\x39\xc7\xf5\x96\xc1\x3a\x09\xce\x48\x88\x77\xe1\x33\x4b\xfd\xea\x3a\xcf\xf2\x3d\x32\xcb\xa4\x9c\xcf\x63\x38\xcf\xa3\x96\xb1\xd0\x56\xb4\x20\xd0\x3d\x2f\x88\x3c\x3f\x4a\x7b\x5a\x98\xa7\x34\xe6\x2e\xac\x6c\x64\x89\x69\x72\x46\xea\xbb\xc1\xd7\x77\x9e\xc1\xd7\xdc\x1d\x96\xb2\x70\x34\x4f\x74\x77\x8e\x8b\x85\xaf\xe3\xd7\xda\x6c\xa1\x67\xd0\xbb\xcf\x1d\x0f\x17\xf0\x72\x65\xa3\x62\x74\x56\x52\xbb\x0b\x29\x83\x76\x27\xb5\xeb\xb2\x7e\xfc\xac\x11\x9d\x6b\xe4\xf1\xb9\x9e\xab\x8c\xab\x3d\x99\xf8\x27\x41\xf7\xe6\x0e\x4a\x8f\x8d\x8b\x89\x5b\x39\x3b\x83\x5d\xe7\xfb\xa3\xe8\x89\x33\xed\xd0\xee\xdc\xb5\x94\xe3\xfa\x79\xc9\xea\x4e\x5b\x34\x3a\x2f\x59\xbd\xb0\x3d\xda\xca\x53\x4b\xf9\x3b\xdc\x48\x4c\x2f\xe0\x68\xb6\x13\x53\x6e\xc3\xdf\x9c\xa5\x03\xbb\x73\xd2\x32\x8c\xd8\x3a\x37\x09\xbd\x77\x37\x64\xaf\xe7\xfe\xeb\xfe\xe8\xbd\x3f\xba\x47\x3a\xbf\x1b\x33\x7f\x77\xc2\x79\x11\x37\xb5\x2b\xe1\xdc\xb2\x2b\x44\x47\x9e\xb9\xa8\xd7\xba\x7f\x47\x2f\xb0\x77\x46\x86\x79\x8f\x9e\x6c\x2d\xc3\xdc\xd4\xe9\xe7\x77\xea\xf4\x79\xb9\x65\xa9\x9e\x77\x77\x25\x93\x17\x8a\xb0\xce\x49\x26\xf9\x2d\x9f\xa7\x9f\xed\xf5\x2e\x9c\x47\x96\x8a\x40\xba\x40\xe2\x78\x11\x67\x78\xa1\xc4\x71\x53\x36\x87\xbb\x65\x73\x8e\x93\xec\x6e\x25\x89\xf7\xc0\xf7\x45\x92\x58\x29\xf1\x9b\x2f\xff\xb8\x9e\xf3\x1c\x2b\x39\x8b\x77\x24\x84\x3f\xbe\x23\x5d\x24\x84\xfc\x96\x3f\x3d\xc3\x22\x1d\xde\x53\x2e\x58\xea\xa6\xdc\xdd\xc9\xdf\xc5\xbc\xec\xae\xe4\x6f\xcb\x26\x3d\x4a\xdf\xa4\xba\x37\x9f\x7b\x0f\xf9\xca\x34\x2c\x4f\xf6\x7a\xee\x4a\xb2\xe7\x46\xe0\xfe\x08\xbe\xd8\x1a\x85\xee\x7a\x56\x73\x7a\x0a\x3d\x84\x38\x99\x4f\x2f\xb7\xde\xfc\x95\x53\x05\x21\xb1\xfa\xe6\x57\xe9\x6a\x31\xe4\x5c\x88\x10\x2f\xf3\xfd\xcb\xad\x37\x7f\xf5\xd4\xca\xcf\x31\x5a\x71\x2e\x38\x1d\xf3\x0a\x3d\xf7\xef\x6d\x9d\xd3\x10\xe2\x6d\xbe\x77\xb9\xf5\xe6\xaf\x6d\x9d\x8b\x4f\xc7\xbc\x48\xdb\x7b\xf3\x1c\x9a\x5f\xdb\x3a\x47\xb0\xe8\xf4\xbe\xe0\xd4\x29\x70\x46\xf3\x73\xa7\x63\x5e\xe6\xb3\xcb\xad\x37\x7f\xfd\x1c\x9a\x7f\x71\xfd\x1c\xe2\x90\x7f\x3a\xac\x7a\x7c\x56\xd4\x95\x9e\x26\x59\x7d\xbe\xaf\x3c\xd3\xbc\xce\x80\x48\x24\x58\x13\xd7\xa2\xa6\xc3\xf6\xda\x43\xf9\xf1\x20\x1b\x0c\x06\x83\x6c\xc0\x44\xbe\xeb\xfa\xe4\x98\xf6\x13\x41\x35\x0d\x1b\xb4\x88\x57\x96\x93\x0a\xc0\xa3\xb3\x6f\xe8\x7f\xe4\x33\x58\x93\x09\xee\xe2\x78\x32\xc1\x3e\x1b\xf6\xba\x9a\xa6\x7b\x93\xbb\x69\x31\xe3\xf5\xf4\x14\x59\x08\xf1\x46\x2e\x97\x59\x0f\x21\xb1\xf5\xe6\x57\x99\x2e\xc5\xff\x2b\x88\xf6\x1b\xb1\x05\xfe\xfe\x1c\xfd\x4d\xe8\xc0\x86\x9e\x31\xd5\xd5\x28\x65\x1d\x7d\x45\x9a\xa6\xa0\xf7\x6c\xd7\x0e\x03\x27\x19\x24\x99\xd7\x3b\x45\x8c\x33\xd5\x4a\x3a\x10\x83\x37\xee\x79\xae\x1f\x78\xdd\x2c\xf1\x4f\xd1\x18\x0f\x84\xee\x36\x6e\xc4\xa2\xe0\x74\x58\x75\xf8\x3e\xba\x5e\x3c\x4d\xe4\x6a\x3b\xa2\x0f\xf1\x0c\xe6\x72\x43\x30\xc7\xc3\x89\x1f\x0f\x82\x30\x8e\x5d\x27\x08\x5d\x27\x0a\xad\xee\x30\x1d\x4c\xcd\x25\x44\x71\x31\xa3\x18\xa9\x38\xcb\x86\x46\x62\x87\xa1\xef\x47\x91\x6f\x93\xc8\xbb\xd7\xc5\xd9\x34\x2b\x41\x4a\xe4\xef\x52\xfe\xf5\xd0\x7d\x74\x95\x84\x9b\xf9\x9e\xbf\xb5\x3c\xaa\x68\xd4\x6e\xef\x37\x2b\xd5\xbd\x33\xd0\x55\x9c\x24\x99\x25\x8c\x91\x26\x38\x16\x05\x55\xc1\x09\x1e\xa6\xa2\x66\x98\x36\xe8\x11\xbf\x98\x16\x0a\x06\x4e\xc1\x88\xd8\xe1\x54\x05\x3b\x06\xe4\x1b\xb3\x3e\x16\xd9\x30\x8b\xb6\xe0\x14\xbc\xf3\xf8\x14\xdd\x87\x0e\x49\xdc\xd3\x58\x36\xbd\x12\x35\x54\x57\x83\x06\xae\x79\xfd\x70\x55\x21\xad\x05\x63\x7a\x5e\x2f\x0a\xc3\xd0\xf4\x6c\x85\x09\xb0\x24\xd9\x56\x3a\x3a\x45\xc3\x8c\x5d\xcc\x74\x59\x32\xc5\x4f\xec\x38\x8a\x42\x49\x63\x92\x2e\xb6\xc5\x51\x6f\x3c\xf1\xb7\xf9\xd4\x47\x57\x17\x52\x25\xf9\x2f\x53\x2b\x42\x01\xa6\x79\x9d\x56\xbf\xca\x43\x81\x75\xbe\xf1\x99\x6e\xf5\x33\xc1\xea\x25\xd9\x28\xed\x9d\x22\x50\x40\xb1\xc7\x4e\x1c\xb9\x9e\xe7\xcd\xd4\x12\x16\xf2\x69\x24\xe1\x01\x1e\x74\x87\x83\xd1\x29\x02\x1d\x74\x48\xa0\x3b\xd3\x63\xb7\xdb\xef\x76\xa3\x68\x3a\x29\x61\x27\x8b\xbc\xd3\x61\xd5\xa6\xbc\xac\xa1\x6b\x2b\xbc\xa4\xfb\x58\x12\x2f\xbf\xc6\xb7\x30\x11\x54\x23\xb2\xc1\x8f\xc0\x62\x84\x99\xcd\xda\xb3\x09\x93\x12\xbd\xd2\x0a\x4e\x29\x86\xe7\x81\x7a\xd7\xe0\xc5\x6e\x78\x77\xe0\xae\xc8\x8d\x2f\xf8\x93\xa1\x7d\xaa\x45\xb7\x69\xfc\xc4\xcd\x43\xa4\xc3\x85\xf7\xe6\x17\xfe\x6d\x7f\xc9\xa7\xd6\x59\x8c\x12\x40\x1d\xf5\x07\x43\x90\x46\x59\x9a\x0c\xb0\x97\x39\xae\xe3\xf4\xc6\xbe\x1f\xf8\x76\x3c\xeb\x95\x70\x8a\x15\xe2\x51\x3a\xc8\x52\x40\x41\x38\x8c\xfa\xfd\x68\xa4\x39\x09\x09\x19\x93\x53\xe4\x65\x9e\xe7\x7b\x96\x6f\xcd\xac\x32\xed\x5b\xca\xb8\x8e\x1a\xe8\x49\xa4\x21\xd4\xe8\x5c\x6d\xcb\xfb\x85\x93\xce\xcd\x22\x6a\x5c\x87\x32\x27\xbd\x8e\x9c\x35\x75\x1b\x22\x51\xb0\xfa\xdd\x6c\xd8\xeb\x4d\x70\x86\x07\x0e\x20\x37\x8e\x1d\xcf\x73\x71\x99\x8c\x23\x89\x31\x93\xd1\x60\x04\x08\xf7\x70\x0f\x9b\xd8\x62\x7a\x73\xf9\xce\xcc\x12\xc0\x1c\xd2\x4e\x87\xd5\xb8\xb0\xdd\x47\xe8\x85\x73\x6c\x77\xa3\xc4\x2a\xb2\xf5\xc6\xea\xbb\x0a\xac\xdf\xef\x67\xf4\x7f\xc6\xf5\x1c\xdb\xf3\x6c\xc7\x9b\x79\xd3\x0c\xd4\xbe\xe5\xda\x81\xef\x74\xb3\xa4\xef\xf6\x26\x8c\xc5\x69\x17\xb3\xe9\xc4\x60\xf6\xdd\xc2\x60\x06\xa7\x68\x84\x07\x82\xb6\x3a\xa6\x2e\x96\x77\xb6\x0a\xfe\x1f\xb6\x57\x3b\x50\x63\x9b\x0f\x42\xa1\x41\xa5\x51\x9f\x21\x0a\x66\xe4\xba\x60\xf8\xa6\xe9\x38\x8a\xef\xfb\xbe\xe3\xba\x9e\x6e\x38\xce\xee\xa4\xd3\xb1\x9d\xbe\xa0\x18\x86\x6a\xea\xae\x8b\x75\xd0\x05\x32\x0c\x6c\x1b\x6d\xe1\x3e\x3c\x3b\x3b\xab\x36\x6b\xed\x7a\x75\x99\x2b\x1c\xef\x28\x97\x4c\x91\x20\x99\xae\x20\x18\x41\x10\x45\x41\xe0\xd9\xb6\x4d\x42\xb1\x5d\x68\x7d\x93\x8d\x87\x81\x93\x74\xbb\x89\xe5\xfb\x24\xc8\x0d\xdd\xed\x5a\xed\xcd\x33\xe2\xb5\xea\x22\x46\xa3\x2f\x44\xe4\xca\x50\x1e\x46\x4b\x8e\xee\xba\x8e\xeb\x58\x86\x1f\x75\xbb\xdd\x9d\x6c\x64\xba\x96\xec\x7b\xbe\xa7\xd8\x4a\x12\xcf\xd7\x64\x5b\xc5\x74\x83\xae\x62\x58\xca\xbb\xe5\x0b\x97\xed\x1b\x9d\x5a\xbb\xd6\x64\x3b\xcb\x68\xb2\x14\x9e\x2a\x18\xa1\x1f\xc7\x7e\x60\x88\x82\x6b\xca\x0e\x5d\x48\xad\xbf\x0b\x23\xe1\x5b\x9c\xda\x9a\x02\x68\x6a\x83\x2a\x79\xbe\xef\xf9\xfe\x96\x8c\xcf\xa8\xc2\xd3\x75\x68\x56\xf8\x76\xb5\x7e\xd8\x20\x30\x4b\x01\xa6\x58\x12\x06\x9e\xeb\xf8\x51\x9a\x04\x7e\x8c\x65\x70\x2d\x2b\xd9\x19\xc3\xda\x43\xd5\x56\xd3\x28\xee\x75\x7d\xd1\xb6\x2e\x2c\x57\xba\xba\x45\xe7\x38\xe7\x21\x15\xf2\x35\x28\x4f\x8f\xbc\x91\xdb\xeb\x79\xae\xa5\x4b\x9a\x6e\x68\xa3\x9d\x52\x75\x67\x3d\x46\xd7\x25\xcd\x71\x45\x4b\xd4\x0c\x7d\x3b\x3f\xd0\xd0\xcb\xe8\xb5\xb3\xf2\xe7\x6a\x51\x8b\xa9\xd4\xaf\xbc\x00\xb7\xd6\x12\xbc\x22\xc9\x7b\x14\x56\x12\x07\xb6\xb9\xab\xa2\x3c\xf4\x94\xc0\x53\x24\xcd\xf6\x3c\x37\x4d\xc3\xb0\xab\x99\x81\x1f\xa8\xaa\x6e\x16\x3f\x96\x6f\x9a\x96\xed\x07\xda\xce\xae\xf5\x74\x51\x33\x6c\x4f\x50\x14\xcd\xb2\x5c\xd7\xb2\x7d\x59\x32\x74\x55\xf3\x5d\x4f\xcc\x0a\xcb\x85\x43\x4d\x57\x35\xdd\x50\x95\x2d\x59\xb4\xce\xe8\x73\xbb\x88\x12\x6a\xcd\x5a\xde\xb3\x5a\xb3\x34\xbf\x76\x1d\xc1\x08\x7c\xdf\x31\x0d\xcf\xde\x39\xba\xd8\x0c\x47\x8e\xe7\x63\x0b\xba\x86\xe9\x04\xb8\x64\x7c\x3d\x7c\x56\xbe\x0f\x57\x9a\xd7\x3b\xb7\xdb\xb7\x96\x3b\xa2\x96\xda\xa3\x8c\xd8\x78\x2f\x06\x31\x9b\x8d\xb3\x9d\x78\x02\x5d\x37\x70\x24\x1a\xb3\x9e\x60\x18\xc2\x36\x96\xb3\xc6\x50\x81\x05\x8a\x97\x20\x0f\x3b\x8d\xda\x59\x85\xa0\x99\x40\xdf\x05\x34\x2d\xcb\x30\x4f\x11\x38\xbe\xbf\x9b\x4d\x04\xd6\x89\x61\x4b\xba\xce\x04\xa2\x31\x53\x5c\x77\x4b\x6e\x8d\x72\x64\xf9\x06\xae\x50\xad\x37\x6b\xed\x5a\xb5\x94\x43\x32\x68\x01\x1e\x80\xe6\x9f\x22\xc3\x75\xc5\x9d\x83\xd9\x03\x03\x0f\x71\x08\xaa\x36\x61\x63\x6c\x95\x3c\xef\xbb\x76\x06\x97\xce\x97\x94\x45\x85\x34\xd9\x69\xee\x58\x5f\x30\xa6\x49\x2e\x9f\xf5\x76\xcf\x78\xca\x73\xb8\xd0\xd8\xe5\x87\xf6\x41\x9b\x1a\xe6\x5c\xa7\x4b\xe5\x34\xd2\x75\xd3\x74\x75\xcd\x34\x5d\x4b\x14\x34\x2f\x52\x04\x3d\xb8\x80\xe3\xa5\xba\xec\xe2\x88\xfc\xf5\x3c\x9c\x30\xa1\x45\x9c\xb6\x8f\xad\x0b\x8e\xb5\xc3\x4d\x98\x67\x21\x34\xe8\x20\xb3\x44\x3a\xe2\x2e\x86\x2b\xc8\xf1\xe4\x68\x36\xf5\xfb\xd1\x33\xf5\xfb\xac\x8a\x48\x99\x05\xb0\xba\x61\x90\x74\xc3\xb0\xcb\x20\xc7\x26\xff\xed\xb6\x03\xe0\xc5\x69\x1a\x93\xc3\xf7\x88\xf7\xf2\xee\xc9\xcf\x5e\xbd\x06\x4b\x4e\x11\x8c\xfb\x3b\xcc\xed\xc9\x44\x10\x5c\x53\x12\xcc\x80\x38\xdb\xd0\x27\x10\x6d\x7b\x77\x90\x62\xcb\x13\x36\x35\x6d\x12\xa5\x30\xa6\xef\x85\x8e\xe7\x7b\x9b\x7e\xf6\x4c\x9c\xd0\x3e\x6e\x13\x0d\x5c\x79\x02\xb5\xbf\x2b\x1e\x50\x04\xd1\x22\xc1\x54\x1e\x14\x98\x17\x8c\x07\x18\xc7\x9a\x1a\x20\x89\x16\x8d\x0b\x70\x98\x07\x04\xde\xf6\x38\x6d\x9e\x1b\x4f\x2d\xd4\xef\x8c\x48\xca\xd0\x1d\xc7\xb1\x04\xc1\x0c\x8d\x9d\x88\x12\x5b\x72\x5c\x1c\x33\xa1\x17\x6c\x60\x68\xef\x78\x7e\xfc\xd8\x8d\x15\xf7\x5f\xbf\x72\x95\x3b\xa7\xc4\x1e\x7b\x8e\x69\xaa\xa7\xc8\xf0\x7d\xd7\x91\x1d\xcb\x30\x14\x10\x8d\x20\x08\x77\x3e\x44\xb6\x35\x55\x55\x14\xc7\xd4\x0d\x47\xb5\x14\x45\x91\x65\xd7\xd4\x6d\xfb\x62\x71\xca\x61\x1e\x3c\xd5\x9a\x9d\x3b\xd0\xa6\x4b\x21\x9f\x29\x50\x9f\x98\x86\x38\x56\x75\x10\xf0\x44\xd3\x76\x32\x2e\x30\x25\xc7\x01\x5f\x93\x92\xc4\xc4\xbe\xa6\x6f\xcb\xf0\x8c\xa7\x6f\x50\xcb\x07\x00\x09\x3b\xf3\x95\x3f\x4a\x4d\xc8\xc9\xa0\x30\x21\x46\xb8\xdb\x82\x30\x3d\x6c\x99\x86\xe3\x83\x35\x73\x2d\xc7\xf3\x20\xb9\xe0\x1c\x13\xba\xd3\x3a\xdd\x1c\xbe\xd4\xf0\x1b\x78\xec\x76\x35\x41\xd0\xba\x2e\x1e\xef\xae\xc6\x87\x74\x65\xb7\x00\xe2\x99\x7b\x41\xf9\xdc\x0f\x4d\x76\xbe\xd9\x7b\x7b\xff\xa0\x7d\xfb\x78\xbf\x5d\x3e\x39\x42\x0e\x23\xbf\xeb\x19\xb2\x20\x48\x92\xe3\xba\x8a\xa0\x98\xee\xce\xf0\x56\x65\x94\xd9\x80\x09\x71\xec\xdb\x91\x06\x2e\x0e\x33\x3d\x06\x7b\xb6\xed\xa3\x1f\x3d\xd3\x47\x3f\x4c\xdd\xf4\xfd\x50\x1a\x53\x4d\xcd\x53\xe4\xf5\xfb\x3e\x9e\x80\xe8\x67\xd9\x4e\x39\x81\x0b\xc6\x29\x02\x84\x53\x9c\x80\x88\xc7\x5b\x38\x94\xb3\x2c\xd4\x5c\x4c\x0f\x42\x51\xea\xbb\x53\xfe\x10\x45\x75\x13\x45\x12\xc4\xc4\xc5\x23\xd5\xb5\x75\x4d\x36\x5c\x55\xde\xa9\x3e\x29\xb6\x4d\x53\x56\x60\x32\x13\x3d\x4b\xb4\x44\xcf\xbc\x58\xdc\x70\xd8\xe8\xe4\xa5\x9e\xf2\x99\x41\x21\x46\x40\x32\xf7\x11\xf6\x60\xe7\x48\x57\x0d\x98\x98\x16\x96\x4a\xe6\xc2\x9f\xf3\xce\x04\x5f\x2c\x9e\x73\x78\x7c\x56\xfa\x7e\x91\xf9\x5f\x99\xb4\x99\xcc\xbb\x0e\x49\xe6\x6d\x67\xd7\x8c\x2f\xdd\x72\x1c\xbb\x2f\x08\x8a\x6e\xa8\x96\xb6\x91\xcd\xaf\xf7\x23\x9f\xff\x70\xe6\xbc\x4a\x9a\xcf\x5f\x39\x23\xa1\xbf\xd0\xdb\x14\x45\x7e\x9f\xbb\x24\xcf\xb6\x2c\xe2\x3b\x77\x75\x40\xb1\xd8\xee\x50\xb1\xed\xa4\x1b\x93\x04\xdf\xf3\xdd\xd0\xf3\xb7\xde\xb7\x79\xea\x9c\xf9\x78\xa5\x39\xfe\x45\xb8\x3e\x92\x6d\x92\xf2\x3b\xae\x65\x7a\x34\xe5\xdf\x39\xa3\x55\x23\x29\xbf\xe7\x93\x94\xbf\xdb\x4d\xee\x8d\xbf\xe7\xe6\xfc\x17\x81\x9b\xe4\xa5\x13\x3f\x30\x49\x8c\x22\xdb\x8e\x65\xdb\x56\x7f\x27\x7f\xed\x24\xee\x26\xb6\x2e\x83\x30\xb5\x40\x95\x88\x72\x11\x06\xaf\x63\xbf\x79\xde\x5b\x6e\x87\x67\xd4\x01\x2e\xf4\xe2\xd5\x46\x59\x40\x02\xd7\xb4\x92\x5d\xa0\x27\x23\xd5\x56\xd3\x38\xea\x75\x7d\xc9\xb2\xee\x41\x17\x4a\xeb\x02\x17\xd2\x85\x45\x99\x40\x35\x0c\x6d\xb4\x73\xa2\x65\x54\x94\x09\x5c\x57\xb2\x44\xcd\xd0\x36\xe6\x90\xbe\x80\xde\x8f\x7e\xea\xbc\xf9\xda\xd5\x7c\x77\xdf\x1f\xa5\x4c\x70\x11\xb6\xdb\x9e\x12\xf8\xda\x6a\xd1\x20\x0c\x02\x4d\xd9\x2e\x1a\xec\x54\xf9\x89\x21\xaa\xa6\xe5\xc9\xaa\x9a\xd7\x0c\x3c\x45\xd2\x0d\x55\x0d\x5c\x57\x18\xd0\x92\x81\x61\xe0\x50\xd7\x34\x75\x51\x33\x58\xe5\xc3\x93\xe7\xf0\xa0\x5d\xab\x6e\x15\x0e\x2e\x62\x67\x50\x6e\x64\x7c\xd7\x34\x3c\x6b\xe7\x94\x58\x56\xc1\x23\x12\x92\x60\x13\xba\x26\xc9\x72\xba\x9b\xba\xff\xe8\x79\xf3\xcd\xb7\x6b\x09\x17\xd1\x26\x67\xb5\xb4\xb0\x93\xc5\xfd\x8d\xd2\xc2\x16\xbe\x73\xc6\xe6\x59\xf5\x85\x8b\xa0\x8c\xf3\x72\x83\x6d\xce\xcb\x0d\x3b\x8d\x35\x6b\x1a\x86\x7e\x12\xd0\x72\x83\x21\x1a\x33\xc7\x75\xb7\xdf\x8d\x3c\x3c\xc7\x92\x14\x35\x07\xba\x2b\x7a\xf5\x22\xc2\x0e\xd7\x4b\x10\xbb\x00\x66\xb4\x02\x11\x80\xaa\x9e\x22\xb6\x8b\xcd\xee\x06\xb6\xc6\x39\x9c\xbc\x17\x09\x4f\xc7\x31\x08\x83\x8b\x08\xb7\xb7\x2c\x49\x6c\x60\xd1\xce\xf1\x16\xa5\x75\x89\x95\xb2\xc4\x45\x6c\x80\xab\xe9\xa6\xe5\xe8\x9a\x65\xba\xb6\xa8\xf9\xa1\x2a\x68\x81\xbb\xd3\xc7\xa9\x64\x98\xb8\x0e\x0e\xc9\x5f\xcf\xc3\x5d\x26\xb2\x6c\x87\x0e\xa0\x0d\xfc\x4f\x5c\x08\x7f\xfb\x1e\x20\xcf\xfa\x86\xe9\x59\xae\x25\xd2\xf1\x7d\x21\xa4\x64\x40\x13\x84\x14\x1f\xb7\x35\x8f\xff\x9e\x67\xf1\x5f\x00\xe5\xc9\x70\xbb\x8c\xb1\xd3\x5f\xc8\x71\x92\x46\xdd\x24\x8d\xf3\x12\xbc\xbf\xe5\x7f\xcf\x79\xf3\xea\xb0\x79\x50\x3f\xbb\x8c\x71\x11\x6d\x75\x16\x55\x8d\x28\x9a\x57\x35\xac\x9d\x2f\x4f\x74\x83\x95\xa2\x86\x1b\x84\x0e\xc1\xbe\xfd\xbe\xce\x13\xe8\xf8\x3c\x2b\x5f\xd4\x36\x3a\xe5\xc5\x8d\x8b\x68\x45\x77\x51\xeb\x88\xa2\x20\x30\x2e\x18\xf8\x30\x01\xad\x75\xc8\xb2\x42\x1f\x1e\xe1\x50\x0a\xdc\xa2\x03\xeb\x7a\x7c\x63\x67\x6c\x39\x1f\x7d\x17\x0a\x78\x64\xdd\x70\x6c\xd7\x12\xad\xb0\x6c\xa5\x89\x75\x88\x86\xb3\x2c\x7e\x6c\xe1\x3a\x87\xab\xf3\x1a\xc8\xd3\x4c\x69\x09\xe4\x42\xaf\x99\x7b\x8e\x69\x69\x13\xc3\xf7\x3c\x47\xb1\x6d\x43\x57\x80\xc4\x97\xe1\x2e\xcc\x82\xad\xaa\xaa\xac\xda\x96\x66\xda\x45\x41\xc4\xb1\x34\xc7\xde\xc6\x7f\x4e\x9c\x56\x5e\x17\xb9\x88\x2e\x8c\x4d\x63\xad\x4c\xb2\x0b\xae\x54\x94\x49\xe4\x2e\x2d\x93\x68\x1b\x18\xcf\x79\x9b\xb6\xa4\x4e\x72\x11\xbe\x5a\x45\xd9\xc4\x0c\x76\x5b\x30\xc6\xc2\x96\x61\x3a\x01\x98\xb4\x6c\xe2\x43\xf7\x5e\xd6\xc1\x58\x26\xe5\x17\xc1\x35\x5c\x2d\xa5\xec\x02\xa6\xad\x95\x52\xee\xc1\xee\xe7\xf5\x14\x5a\x4c\xb9\x5a\x54\x53\x2e\x34\xc2\x69\x71\xc5\x93\x45\xc7\x73\x24\x51\x50\x4c\x77\xe7\x4b\xed\x5a\x5e\x5a\x99\xf5\x43\x5a\x58\x31\x3d\x35\x01\x8b\xd6\x7d\x2e\xb8\x7e\xcc\x1e\xb4\x0f\x8e\x8b\xda\xca\x85\x5e\xf2\x5e\x96\x5a\xbc\x41\xb6\x53\xb6\x20\x81\x3e\x99\xe0\xde\xbc\xd0\x72\xf1\x1c\x66\xc1\xba\xd5\x62\xcb\x85\xfc\x92\x9b\xc8\x92\xa0\x86\x2e\x1e\x29\xae\xa3\xab\x92\xe9\xa8\xf2\xee\xb7\x34\xb1\x6d\x9a\x62\x08\x71\x51\x7b\xf1\x37\xfd\xfc\x39\x31\x13\xbf\xa8\xbf\x5c\x2c\x17\x5c\x29\xc7\xec\xf4\xee\xe6\xa2\x1c\x83\xe0\x74\xc4\xa4\xdc\x90\x75\xe8\x1a\xb6\x8d\x4e\x83\x1b\x9e\x08\xdc\x84\x49\x93\xfc\x9c\xcb\x0d\xd9\x7e\x7e\xae\x36\x3f\xe7\x82\x85\x80\x11\xb1\xce\xf4\xaa\x13\x7a\xae\x59\x6b\x33\xbd\x24\xc1\xfa\x5e\x5a\xac\x8b\xab\xb3\x52\x71\xae\x51\x6b\xb0\x12\x8e\xc1\xa6\x67\xd9\xd3\x11\xd3\xe7\x86\xac\xbb\x58\xcf\xae\xd1\x69\xf0\xc5\xc1\x0d\x71\x1f\x34\xac\xe0\x1e\xe8\x58\x26\xbf\x99\x7e\x97\xfc\x20\x7a\xdf\x1c\x4b\x71\x5f\xad\x31\x3f\x4a\xee\x73\xe9\x92\x5a\xf4\x40\xec\x0a\xd6\xfc\x5e\x12\x23\x17\x07\xc1\x4d\x7e\x78\x85\xc9\xde\xee\x31\xfd\xb7\x7b\x4c\x46\xd7\x56\x5c\xf6\x61\xd1\xde\xfc\xbf\xa2\x3f\xc5\xb1\x76\x27\xb7\xd1\xbf\x4b\xf9\xde\x71\xfc\xca\xc1\x0d\x7b\x3d\x1c\xf7\xfb\x38\xca\x8f\xa2\x8f\xa4\x97\x88\xde\xbf\xda\xcf\x4b\x39\xda\xd5\x63\xeb\xfe\x95\xbe\xd2\xfe\x72\x1b\xfd\xbd\xb4\xde\xe3\xd5\x5e\x27\x49\x45\x80\xf1\x89\xb7\x3c\xe8\xde\x5f\xeb\x7d\xbf\xb4\xde\xfb\x6d\x0e\x90\xa3\x84\x0e\xd5\x11\xca\x8b\xe5\xfa\x4a\xc3\xd9\x30\x61\x32\xa6\x7f\xe2\xf1\x2a\x5a\xb9\xa6\xbf\x7d\x8d\x7b\x92\xf1\xc1\x7c\x9d\xe5\x55\x3a\xb9\xc4\x35\x1c\xb3\xca\x82\xd0\xfc\x9a\x7e\xc9\x35\x73\x42\x70\x3a\x22\x7c\x29\xe8\xd0\x6d\x45\x98\x5e\x32\x1b\x30\x03\xac\x73\x41\x77\x71\xbe\x3f\x3f\x5f\x5b\x39\xaf\x82\x85\xe6\x34\x58\x69\x89\xa5\x43\x79\x81\x55\x56\xcd\x89\xac\x5c\xb3\x82\x65\xe5\x9a\x9c\x10\x30\x22\xd1\x93\xea\x64\x65\xdd\xa8\xe1\x4c\x4d\x18\x99\xe9\xf3\xea\x89\x57\xf0\x86\xe8\x42\xd9\x35\x2e\x1f\x9c\x64\x05\x6f\xd6\xe8\xd0\x7e\x4f\x07\x60\x43\x7f\x41\x88\x5c\xe3\x9e\x71\xcd\x9c\x10\x19\xeb\x7d\xaa\x33\xfc\x7c\x8f\x49\xa6\x37\x53\x18\x25\x61\xfa\x5d\x2e\xc8\x6d\xc1\xf2\x7c\x6d\xe5\xbc\x0b\x16\xa7\xce\x6d\x49\x9f\xea\xcd\x9c\x46\x83\x95\xa6\x19\x64\x60\xe7\x44\x8a\x6b\xdc\xe5\x35\xb5\xd5\x6b\xe6\x84\x0a\x9d\xa8\x4e\xe8\xaa\x5f\x0d\xaa\xb3\xb9\x56\x50\xf6\x9c\x78\x7b\x69\xde\xaf\x73\xaf\x73\x4f\xb2\xbd\x34\xef\x5b\xae\x1b\xd5\x09\xda\x2b\xae\x6b\xe6\x3c\x98\x0d\x13\x2b\xe7\xd4\x89\xc7\x05\x94\x5b\x9b\xd7\xe6\x1b\xba\x14\xba\x64\x15\xed\xf3\x2a\x17\xac\x5d\x5b\x5d\x8e\x90\xfc\xca\x39\x55\x8a\x74\x77\xfb\xee\x49\xc6\xa9\x54\x12\xbb\xdb\xa7\xda\xcc\xa9\x6b\xd7\x96\xb7\x3f\xe7\x40\xa1\xd7\xc5\x75\xc5\x76\x3a\xb9\x66\x2b\x09\xd5\xda\x85\x6c\xd6\xaf\xab\xad\x5f\xa7\xce\xe5\x93\xeb\x77\x81\xb1\x59\x6c\xd0\xd3\x60\x25\x2b\x99\x0d\x72\x69\x13\x7e\x52\xaa\xeb\xd7\x36\xe6\x5b\xf9\xe4\xe3\x81\x51\x12\xab\x68\x9f\x08\x74\x79\x6d\x75\x71\x6d\x31\x72\x08\xd5\x05\xd2\x92\xf6\x6b\xeb\xed\x53\x7e\x52\xb4\x5b\xed\xd7\xb6\xdb\xa7\x57\xce\xf9\xb4\xda\x7e\x6d\xb3\xfd\x15\x9a\xd4\x1e\x55\x97\xfb\x43\x51\x69\xce\x06\xdc\xa4\xe8\xfc\x9c\x4f\xd4\x26\xcd\xe5\x4e\x77\x14\x2c\xae\x64\x06\xb9\x32\x11\xa2\x56\xd9\xb5\x9d\x25\x55\x46\xc9\xed\x21\x17\x74\xad\x55\xba\xd5\x25\xdd\x65\xfb\x45\xe7\xd1\x16\xce\x46\x8e\x93\xe8\x07\x56\x57\x80\x6e\xb6\xdd\x98\xe3\xcc\xaf\x64\xd5\x62\x84\x50\xa0\x25\xfd\x6a\xcc\xb1\xe6\xd7\x43\x96\xdb\x5c\x0a\x76\x13\xeb\x8a\x8e\x52\x0c\x73\xb0\x90\xfb\xcd\x39\xef\x3b\x85\xb5\x3b\x11\x88\x85\x91\xa9\xf9\xc8\xc7\x7c\xee\x1f\xe7\xf2\xac\xe7\xf2\xa4\xbd\xcf\xad\x91\xcc\xf4\x2d\x2a\x4f\x6f\xf3\xda\xce\x82\xea\x4c\xa5\x2a\x4d\x06\x93\x45\x08\x67\xab\x74\xab\x8b\x71\xb7\xd2\xbe\x5b\xa8\x48\x09\xce\x22\x2e\x22\x1a\x42\xf8\xb4\xd4\xe5\x2d\x9c\x45\xcf\x73\x6b\x47\xae\x9d\x03\xdd\xee\x57\x67\x41\x79\x3a\xc8\xb5\x8f\x8c\xe7\x02\xec\x36\xd6\x75\x0c\xee\xaa\x3e\xd3\xeb\xee\x5f\xdf\xc7\x6c\xa1\x55\x85\x3d\x5b\x8c\x40\x54\x76\x4f\xad\xfc\x1e\x75\x01\xfe\x62\xed\xe4\x1a\xc1\xcd\xfd\xd6\x85\xda\x59\x8c\xe3\xb9\x8f\x2a\x69\x67\xa9\xfb\x73\xb6\xae\x76\x68\xf3\x9e\xc6\x12\x5b\xae\x83\x25\x4c\x28\xbf\x67\x45\x6f\x4b\x1a\x5a\xde\xf3\x00\x95\xf7\xc2\x2a\xe5\x77\x59\x2b\xf0\xac\x45\xa7\xb6\xef\xa3\xcf\x58\x56\x7b\x65\x2d\xa5\x4f\x6e\x9b\xab\xeb\xd6\x7d\x0b\xcb\x56\x5f\xed\x99\xb5\x1c\xb9\x84\x87\x56\xe9\x7d\x9d\x46\xa7\xbd\xca\x11\xc8\xac\xa5\xbc\xce\xe1\x7d\xad\x84\xf7\x6b\x02\x2b\xe1\x63\xad\x84\xf7\x17\xb8\xa7\x9c\xf7\xea\x72\x9c\x5f\x48\x5e\xab\x1a\x78\xd1\x76\x56\xc1\x31\xa7\x23\x46\xe2\x86\x9c\x5c\xec\xe9\x51\xec\x8d\x95\x67\x45\xe4\x60\xdd\x64\x36\x49\x10\x43\x7c\x05\xeb\x16\xf1\xf3\x22\x7e\x67\xdd\x24\xc1\x71\x9e\x25\xfd\xb1\xb1\x97\xce\xe3\x17\x4e\x5e\xda\xfc\xfa\xdc\x3f\x30\xd9\x6c\xc8\xc8\x8c\x34\x55\xf8\x61\x42\x6c\x34\xf5\x3f\xc4\x96\x2f\x63\x08\x1a\x2b\xe3\x30\x49\x12\xd6\xcf\x95\x31\x0f\x86\x99\xfc\x5a\x4e\x46\xfc\x9a\xb4\x9a\x45\xfc\xc8\xfa\x38\x4c\x18\x99\x75\xef\x66\xfc\x70\x36\x99\x2a\x79\x7c\x47\x7c\x7f\x81\xa5\xf0\x3e\xf3\xf8\x58\xc9\x63\x60\x76\x90\x74\x93\x85\xff\x77\x0b\x2c\x05\x92\x4e\x83\xf4\x2f\xc1\x01\x1b\x10\x47\x3d\xf7\x81\x4c\x7e\xed\x02\x4b\xbe\x31\xfa\xfc\xfa\x99\xc2\x06\x38\x4e\x70\xc0\x28\x58\xe7\xd5\xe4\xae\xcc\x0e\x12\x1a\xf7\x4a\x2b\x31\x50\x7b\xc1\x17\x12\xfb\xe6\x7c\xe1\x87\x53\xa5\xe0\x4b\x61\x8f\xe7\xd7\x16\xba\x3c\xf5\x93\x24\x01\x37\x0f\x82\xf3\x31\xca\x80\x5d\xd0\x9d\xf3\xa5\xbd\x66\x75\xc0\x9d\xfa\x09\x93\xb1\x2e\x17\x4c\x95\xd9\x84\x1f\xde\xcd\x6d\xad\x44\x63\xa2\x85\x5d\x5e\xc6\xc6\xb9\x99\x92\x92\x6e\xc2\x0e\x16\xf1\xaf\xbb\xbc\x36\x47\xc3\xba\x53\x0f\xbc\x24\x49\x0a\xe7\x40\x83\x2d\xaa\x4b\xf4\x5a\x7e\x9e\x05\xd7\xda\x45\xdc\x2d\xce\x06\xe0\x25\x60\x4f\x3d\x66\x90\xb0\x6e\xc2\x0e\xee\xca\x09\xaf\xae\xc4\xbb\xf7\x2f\xe3\xdd\x85\xc6\x2c\x58\x33\x55\xf6\x52\xca\x9c\x42\x0f\xa8\x9f\x58\xb9\x23\xcf\x21\x89\xde\x80\x3b\x53\x09\xac\x3c\x4e\xbd\x9b\x91\xfc\x7c\x71\x0f\x8f\xf6\x8a\xcc\xaf\xb8\x67\x25\x3b\x2b\x6e\xcc\x0a\x3d\x22\xfc\xba\x2b\xef\xa5\x77\xe5\x55\x5d\x2a\x70\x2e\x74\x69\x11\x4b\x16\xf1\x24\x55\x27\xc2\xb8\x42\x47\xe8\x78\xb9\x7f\x31\x5e\xe8\x1d\xc5\x98\xc1\x01\x78\xc5\xb8\x29\x62\x40\x76\x71\xcf\x02\x27\xe5\xe0\xe2\xde\x05\x17\x0b\x02\x8c\x42\x39\x49\x06\xde\x1f\x1b\x44\xcb\x8a\x76\x8b\xf1\x7c\xff\xc2\x9b\x37\x97\x63\xba\x88\xa8\xe8\xb0\x9e\x2a\xf4\xa6\x65\x4c\x75\xff\xea\x38\xec\xcc\x47\x22\x0e\xe6\x81\x55\x3e\x02\xd8\x95\x36\x96\x38\x69\x2b\xb0\xd2\x12\x65\xe4\x4c\x9d\xe3\xcc\x07\xe5\x89\xb7\xc0\x59\xe8\x6d\x75\xa9\x2b\xb5\x85\xed\xa1\x56\xb4\x30\x3f\xec\x80\x68\x6e\xb2\x1a\xa7\xdc\xbf\xaa\x8b\x45\x9c\xe0\x15\x63\xa3\xd0\xc7\x13\x8f\xd6\x57\x96\x63\x63\x21\x77\x7e\xa1\x97\x0b\xb9\x53\xb6\x32\x59\xde\x20\x91\x7c\x92\x2b\xe8\xaa\x4d\xdd\x5f\x8d\x61\x3b\x8d\x35\x3d\x5d\x68\xc0\x52\x5f\x0b\x4d\xc8\x47\x74\x19\x9d\xe6\xfa\x26\xa0\x0b\x5e\x2f\x3a\xb2\x60\xf8\xa2\x43\x79\x2d\x65\xa1\xcb\xf9\x2a\xdc\x1b\xbd\x5a\x95\xc2\x7a\xef\xd6\xe5\xb1\xec\xe5\xaa\x58\xc8\x78\x44\x31\x37\x2a\xe2\xeb\xeb\xa8\xde\x14\x51\x83\x1b\x8d\x70\x2f\x81\x2e\xa8\x4c\x1f\xa7\x43\x50\x60\xde\x27\x14\xd3\xda\x43\x15\xa1\xc3\xe6\x6d\xd4\xec\xc8\x88\xe9\x25\xb8\x37\x02\x15\xba\xf1\x10\x8c\x2e\xb6\x16\x79\x38\x1f\x51\x9a\x22\x6a\x74\x6e\xa1\x0e\xd3\xc3\x26\x1e\x8c\x40\xe7\x23\x3c\xc0\x56\x17\x8c\x21\x5a\xd4\x10\x46\xc5\xb5\x32\xaa\xb5\xaf\xa0\x36\x37\xc2\x19\xb6\x12\xd0\x47\x4c\x9f\xae\x5a\x85\xf3\xbd\x03\x11\x42\x29\x97\xf1\x7e\xbe\xbf\x5a\x0b\xb8\xec\x24\xf1\x39\x93\x17\x4e\x12\x8f\x33\xd7\xcf\x43\x15\x8e\xb9\xcc\x3f\x49\x7c\x50\x3d\xce\xf4\xd6\xee\x27\xfa\x54\xdd\x83\xd6\x1e\x1c\xef\xc1\x01\x70\x99\x8f\x25\x2c\xf9\x30\xc6\xa2\x0f\x23\x18\xf9\x58\x04\xd5\x83\x11\x96\x3c\x18\xc1\xd8\xc3\x12\x8c\x3c\x2c\x2e\x6a\x0c\x22\xad\x8d\x51\x9d\x24\x63\x94\x51\x98\xfe\x32\x07\x39\xf5\xe8\xfa\xd5\xb5\x46\x4d\xe2\x26\x58\x07\x0d\xf7\x17\xe7\x50\xb2\x76\x8e\x71\x67\xe1\xe2\x1c\x8c\xd6\xce\xb1\xdd\xe9\x4a\xfe\x23\xad\x9d\xe3\x06\x27\xca\xe2\x1c\x67\xae\x9d\xab\x88\x6f\x8f\x17\xe7\xf8\x60\xed\x5c\xd5\x98\xa4\x8b\x73\x95\xde\xda\x39\xc1\xff\xbf\xfd\x55\xbd\x5d\x3d\x47\xec\xcd\xfc\x9c\xba\x7a\xce\x58\x3b\xc7\x46\x2b\xe7\xd8\x64\xfd\x1c\x5a\x3d\x27\xad\x9d\x63\x9c\x95\x73\x8c\xbf\x76\x0e\xb2\x95\x73\x30\x5a\x3f\xb7\x8a\x05\xd6\xb1\xa0\x05\x96\x76\x4d\x5a\x40\x41\x2d\x84\x66\x43\x2e\x13\xac\x45\x5d\x70\x1f\x1d\xa0\x87\xe9\xfe\x91\x2d\xf4\x04\x3a\x42\x6d\x74\x8c\x5e\x40\x77\xd0\x4b\xe8\xfd\xe8\x43\xe8\x55\xf4\x51\xf4\x71\xf4\x49\xf4\x69\xf4\x19\xf4\xa7\xd0\xe7\xd1\x1b\xe8\xcb\xe8\x97\xd0\x57\xd0\x57\xd1\xaf\xa2\xaf\xa1\xaf\xa3\x6f\xa0\x6f\xa2\xbf\x86\x7e\x13\xa1\xfd\x76\xbd\x79\x58\x1c\x8d\x95\xcf\x87\x67\x7c\x7f\xd6\x35\xf7\x7a\xfd\x45\xae\xc9\xfa\x7d\x88\xb2\x8c\x1c\x53\x94\xff\x85\xb8\xdf\x9f\x45\xff\xdf\x7f\x2f\x58\xd9\xe2\x47\xc8\xd6\x7f\x84\x01\xf9\xd9\xfa\xb6\xf4\x2a\x62\x1f\xde\x81\xd0\x6c\x44\x65\x7b\x96\x2c\x11\xd4\x1a\x9d\x66\xbd\xd1\x69\x77\x9a\xa5\x47\xa3\xde\xee\x40\xa7\x59\xaf\x76\x9a\x75\xfe\x02\x7f\xb9\x6c\x16\xf5\xb1\xdd\x5f\xf9\x81\xb8\x0f\x51\x3f\xeb\x33\x76\xe9\x2f\xc1\xfa\xa3\x30\xcb\xfa\x19\x39\xfa\x83\x3e\xfd\x94\x61\x3b\xff\x8a\xfe\x1e\x0c\x06\x8b\xcf\x8b\x9f\xc2\xfe\x56\x7a\x1b\x63\xb3\xd2\x2b\xec\x0b\xa7\x2e\xc7\x2d\xd4\xda\x35\x4e\x5d\x8e\x3f\x94\x80\xc1\xc9\x74\xff\x1d\xc2\x81\x1a\x27\x4f\x43\x2e\x9d\x86\xac\x8b\x98\x95\x73\xf9\xfe\x04\x35\x9e\x64\x10\xf2\x34\x64\xe5\x99\xc2\x0c\xf2\xeb\x8c\x99\x8c\x10\xbb\x76\xed\xfd\xcb\xab\xd9\x82\x66\x7e\x47\x82\xc3\xc5\x4d\x8c\x82\x23\x70\xe8\x3b\x72\xeb\xf7\x5e\x2a\xfc\x62\xa3\xda\x69\xd4\xf9\x95\x83\xd2\x71\x4d\x42\x68\x79\x80\xc1\xba\x7d\xdf\x27\xff\x7b\x5e\xe6\xfb\x67\xd1\xab\x35\x6a\x07\xcd\x5a\x7b\x7f\xe5\x20\xf4\x8a\x5b\xe9\xdd\x4b\x68\xc3\xe5\x81\x50\xad\x84\xde\x59\x76\xa1\xc0\xdd\xac\x37\x57\x0e\xfe\x1e\xff\x5d\xf4\xd3\x33\x7d\xc3\x37\x7c\x66\x70\xe6\x87\xa2\xef\xf9\xcf\xf2\x83\x57\xfc\x64\xf3\x6f\x10\xaa\xae\xf4\x21\xdf\xd5\xe7\x32\xba\x8a\x1e\x5a\xe0\xdd\xef\xb4\x9a\xd0\x81\xe6\x1e\xd4\xa1\x09\xf5\x83\x66\x6b\x8e\xc2\x71\xb2\x04\x7c\x2c\x26\x8c\x3b\xb3\x60\xe2\x62\x6f\xe0\xb8\xa4\xe1\xd4\xc5\x5e\x32\x98\x59\x09\x4c\x66\x32\xd3\x4d\xb0\x00\x41\x32\x70\xdd\xf3\xdb\xe2\x9b\xf5\xc3\x66\x95\x36\x02\x1d\x68\x1f\x76\xe0\x05\xe8\x54\xf3\xb6\x66\x86\x4b\x48\x50\x5a\xcc\x60\x66\x27\x30\xc6\x7e\x92\x39\xa4\x35\xc3\x75\x07\x09\x04\x58\x48\xa0\x97\xcc\xac\x41\x82\x3d\xd7\x45\xe8\xa1\xb5\xb6\xee\x47\x0f\xfe\x3f\xa4\xfd\x4d\xac\xa5\x4a\xb6\x20\x06\xc7\x82\x0d\xc4\x7d\xb7\xeb\xdd\xd8\x79\x7e\x36\xa5\x7a\x55\xc5\xce\x93\x3b\x37\x4f\xf5\xba\x2e\x7d\x76\x9e\xb3\xa9\x7e\xf5\x43\xab\xfb\x7d\x1f\x6d\xf7\xb3\x69\x5b\xee\xe6\xc9\x5d\x32\x4f\xb2\x25\x6c\xd9\x12\x6a\x79\xc0\xc0\x03\x06\x1e\x30\x64\xc8\x90\x21\xb2\xdc\x12\x43\x86\xc8\x9e\x30\x6b\x86\x8c\x6c\x5a\xf2\x80\x21\x43\x6e\xe6\x61\x6d\x8b\x60\x9f\x93\x27\xff\x6e\xdd\xdb\x3e\x99\xfc\x6c\x88\x58\xb1\xd6\x8a\x60\xfd\x44\xac\x88\x20\x17\xbc\xac\xbf\x20\x5b\xbe\xbb\xe0\xaf\xc9\x2d\xb9\x23\x26\xf9\x2d\xf9\x27\xe4\xff\x47\xfe\x53\xe2\x90\xff\x92\xfc\x2b\xf2\x77\xe4\xdf\x90\xff\xe6\x4c\xfb\xcd\x46\xd9\xdf\x28\x9b\xfd\xfb\xab\x74\xa7\x6c\xf7\x57\xd2\xdd\x5e\xd9\x7c\x0b\xfc\xb8\xda\x48\xe7\x1f\xbb\xe5\xdd\x7e\xbe\x9b\x4f\xfb\xf3\xbb\xc3\xfc\xf2\xf0\xf4\x76\xcb\xff\x2f\x54\x45\xa6\x6a\x38\xcc\x71\x43\x43\x35\xe7\x6b\x60\x6a\x42\xa4\x4e\x9e\x26\xb4\x8e\xeb\x56\x2e\x3f\x1c\x81\xba\xae\x5b\xbb\xae\x0b\xe3\xfc\x0e\xf8\xad\xef\xb8\x2e\x6a\xae\xc3\xdf\x3a\xac\x99\x4f\x30\xf0\xbc\xb9\xa6\x22\xd1\x54\x70\x54\x95\xb3\x47\x33\x1c\xc7\xcd\xcf\x67\xc7\x54\x55\x33\x64\x8e\x7b\xfe\x73\x98\x63\x9e\x6f\x2d\x43\x55\x8d\xd0\xf3\xe6\x67\xe7\x57\x86\xeb\x39\x8e\xe7\xba\xe6\x9c\xcb\xd4\xf8\xdf\x32\xf6\x62\x41\x2b\x26\x2b\xfd\x51\x36\x88\xc9\x54\xac\xf4\xa9\x10\x66\x7b\xaa\x84\x62\xa5\xae\x3a\x22\xcc\x7c\x84\x95\xfa\x90\x41\x01\x85\x38\xfb\xe7\xcf\xde\xf1\x51\x90\xaf\xc4\xf3\x6b\x03\x1b\xac\xe7\x44\x93\x26\x58\x53\xc5\xcb\x50\xc1\x59\xd9\xab\x62\x86\xf3\x15\xac\x57\xf6\x43\x23\x12\x74\x44\x6f\xf6\x67\xdf\xbf\x93\xf8\xdb\x73\x02\x21\x99\xca\x25\x11\x3a\x60\x4c\xd9\xb2\x07\x09\x68\x2b\x75\xe5\x70\x38\xc2\x4a\x45\x07\x9d\x95\xf3\xd0\x88\x06\xc7\xe7\xf1\xdd\x0c\x47\x90\x66\x7c\xe7\x04\x42\x37\xa5\x60\x2e\xc9\xec\x89\x8f\xed\x92\x08\x1c\xb1\x3c\xe3\x23\x88\xe5\x43\x2d\x9a\xe0\xcc\xa4\x11\xe1\xd9\x3b\x0e\x47\x5c\xc3\x92\xc0\x99\xaa\x25\xcd\xa4\x09\x1e\xf2\xfe\x24\x92\x80\xbe\xb2\x56\x2d\xb7\x47\xc5\x95\x85\x3a\xea\xd0\x8a\x84\x0f\x5c\xb7\x44\x78\xf6\x5e\x21\xe4\x2b\xe5\x31\x05\xf8\x98\x62\x02\xc1\x63\x4a\xd4\xf9\xc6\xef\xc9\x32\xdf\xe2\x59\x9e\xaf\xe7\x5c\x17\xca\xfe\xf8\x71\xce\xb2\x2c\xcb\x8f\x73\x43\x50\x14\xe5\xb2\x57\xd9\xff\x44\xc8\xea\x0f\xd2\xff\xc9\xfd\xca\x3f\x5a\xf7\x02\x7c\x25\xad\x94\xaf\x14\x51\xfe\xdf\xc9\xd7\xa7\xaf\xc1\xfa\xda\xf9\x3a\xfa\xba\xf8\xba\xfa\x5a\xfa\xe6\xeb\x6f\xbf\x16\xe8\xff\xc6\x44\x10\x45\x4a\x64\x2a\x53\x59\x50\xfe\xdd\x4a\xf9\xea\xdf\x09\xe4\x5b\xbe\xcd\xf2\x6f\x7e\xf7\xed\xb7\xb3\xcb\x02\xea\xb7\x7f\xfc\x0f\x7f\xfc\xe3\x1f\xd9\xff\x35\x3f\x5c\x1f\x96\xed\x84\xbf\x9a\xc5\xc9\xe1\x2b\x71\xf5\x07\xfc\xed\xbf\xc0\xdf\xc3\xff\xf1\x2f\xe0\x1f\xe0\xbf\xc7\x7f\x0f\xff\x48\xf8\x0f\xd3\x2f\x85\xff\x5b\xf8\x7f\xa6\x5f\x08\x04\xc9\x84\xe4\x99\xae\x59\xf6\xa7\xbc\x25\x57\x97\xe4\xe6\x25\xb9\x7b\x43\x9e\x2f\xfd\x24\xf8\x25\x90\x13\x29\xcb\xd3\x5c\xe3\x49\xdb\xa4\x69\xdb\xae\xca\xa7\x27\x25\x90\x87\xb6\x9d\x1f\xa6\x69\xbb\xc4\x9b\x3d\x87\xbb\xc4\xf5\x71\xa8\x07\x5e\xc2\xf3\x45\x49\xc4\xa7\x18\xf5\x4b\xf9\xf9\x73\xc1\x7f\x82\x7d\x22\xe5\x0c\x7a\x2e\xd7\x8d\x63\xd7\x8d\x22\xd7\x72\x1c\xcb\x74\x5d\xb0\x9f\x52\x94\x27\x22\xea\x8f\x38\x4c\x65\xc4\x93\xb9\x11\xf8\xae\x69\xce\x1f\xd9\x32\xc6\xf0\x0c\x2f\x72\xf1\x88\xce\xcd\x4b\x52\x7c\x00\x87\x3c\x23\xf7\x03\x1e\xbd\xf8\x30\x97\xb4\xf0\xe8\x83\xcc\xc0\xf9\xf3\x01\x88\x92\xb3\xe5\x23\x38\xcf\xf9\xb1\x5f\x3f\xb2\xf9\x43\x92\x3f\x24\xcf\x16\xba\x47\xfe\xbe\xa7\x43\xe0\x32\xe2\xd1\x7c\xf8\xe4\xdd\x05\x6c\x0b\x31\x78\x7a\xf9\xc1\xbb\xf9\xb3\x7e\x6f\x76\x7c\x0c\x13\x9e\xbf\x13\x40\x87\x5a\xcc\x56\xe6\xa7\xfb\x98\x2a\xcf\xa3\xde\xb3\x32\x8a\xaa\x2a\x8a\xca\x30\x70\x9c\x60\x3e\x44\x12\x95\x65\x34\x1f\xcb\xef\xd9\xbe\xd1\x49\xb5\xca\x25\x6b\x81\xb5\xfb\xa0\x5d\xcc\x67\xbe\x91\x3f\x11\xfc\x01\x0b\x70\x86\x01\x1c\x2c\x86\x06\x3b\xd0\x9a\x1a\x74\x6c\xab\xa7\x87\x03\x16\x2b\x03\xbb\x66\x79\xd9\x80\x36\xd3\x70\x2a\x15\x87\xcf\x41\x22\x5f\xc1\x05\x6c\x7f\x06\x5b\xb8\x58\x91\xa9\x6b\x90\x08\x51\xd3\x08\x11\xd2\x1a\x0c\x8c\x85\x00\x42\xc1\x9b\x32\x8c\xa7\x64\xae\x9b\xa7\x7c\x17\xcf\x73\x7e\x05\xe2\x57\x20\xc2\xf6\x6b\xf8\x18\xc6\xbb\x14\xbc\x14\x22\xbe\x7d\x3b\xda\x69\xfa\x31\x4c\x31\xc5\x11\x6d\x60\x38\x40\x09\x14\x4a\x9c\x7d\x9d\x3f\x27\xb3\x51\x10\x49\xe5\xf7\x7a\x37\xe4\xe2\xe5\xdd\x9b\x57\xdb\x83\xb6\xba\xba\xbc\xd9\xee\x7f\x0d\xbf\x82\xab\x03\x5c\x6d\xef\xe0\x70\xc7\xb7\xdc\xdc\xcd\x36\xf1\xe1\x78\xb3\xbd\xd9\x1c\x6e\xf6\x37\xdf\xc0\x61\x7f\xa3\x9c\x7f\x4b\x87\xfd\x8d\xf4\x99\xfb\xd6\x05\x0f\x06\x0f\x46\x70\x5d\xac\x35\xd5\x4e\x69\x0c\xda\x3b\x06\x5a\x4c\x33\x4b\xd5\x20\x2d\x31\x8d\x68\x08\x43\x48\xe3\x86\x06\x94\x65\x34\x1e\x52\x1a\x0b\x46\xcc\x12\x0c\x2a\x9a\xe3\x98\xb3\x4c\x08\x53\x96\xa3\xd9\xd1\x1a\xdb\x9a\x95\x42\x53\xb2\x7a\x45\xcc\xa2\x69\x0a\xd3\x77\x54\xff\xc1\xcc\x32\xb1\xf6\x35\xdb\x6f\x7c\x1f\xb3\xd9\x20\xaa\xe2\x38\x8e\xbb\x3c\xcf\xf3\xfe\x1c\x90\xc2\x9e\xf1\x61\xa6\xff\x77\xe4\x9f\x90\xbf\x21\xff\x9c\xfc\x2d\xf9\x97\xe4\xbf\x22\x7f\x47\xfe\x48\xfe\x9e\xfc\x77\xe4\xbf\x9f\xa5\x26\x7c\x86\xfe\xed\x33\xfe\xec\x8e\xf7\x87\xed\xed\x2f\xe1\x70\x3b\x3f\xbb\x99\x9f\x1d\x66\xfe\x48\x3c\x83\x74\x50\x6e\xb6\x37\xfb\x83\x74\x3c\x6c\x94\xc3\xe6\x66\xff\xf8\xfb\x4b\xf7\x83\xc6\xec\xec\x89\x33\x91\x65\x30\x0d\xeb\x67\xac\x7b\x5b\x68\x5a\x2a\x64\x99\xaa\x35\x36\xd6\xa8\x39\xa8\x61\x6d\x09\x79\x89\xc1\x89\xac\xbc\x13\x99\xda\x90\x46\x82\x1a\xd3\x10\x6b\x1a\xd0\x28\xa6\x59\x1d\xd3\x54\xf0\x12\x16\x63\x9a\xd3\xaa\xcb\x58\x2e\x14\x39\x4b\xd1\xaf\x69\x37\x96\xac\x16\x59\xcd\xca\x15\xf1\x0d\xdd\x7d\xd0\x93\x44\x6c\x5d\xcd\xf4\x17\x8e\xea\x5e\x10\x78\x5a\x9a\x65\xa9\x96\xba\x6e\xfa\xe0\x3b\x8e\x98\x5a\xdc\xcc\x34\x67\xae\x56\xef\xb9\xaa\x10\x1f\x54\x85\xae\x32\xf2\x73\xf2\x86\x98\xe4\xf7\xc4\x26\xff\x05\xf9\x23\x21\xf0\xad\x20\xff\x8a\x6f\x1b\x2f\xde\x1d\xf9\x77\x7b\xd8\xde\x1f\xb4\xcd\x1f\x84\xc3\x1a\x8e\xd7\x9b\x2b\xf9\xea\x72\x73\x78\xb6\xa1\xeb\xd5\x25\x28\xeb\x0d\x5c\x5e\xff\x35\x1c\x61\x3f\x67\xdc\x5c\x1f\x6e\x37\xcf\xef\x7e\x05\xcb\xad\x6c\xd3\x8c\x3a\x8d\xe5\x7a\xae\x56\x19\x45\x1b\x9b\x42\x6c\xd7\x40\x3c\x9a\xd1\xea\x81\x55\x51\xd3\xe9\x6a\x9c\x54\xb9\xef\x19\x81\x2a\xc6\xbe\xff\xd6\xf7\xea\xd6\x01\x55\xf7\x7d\xc7\x36\x0c\x2b\x48\x34\xdf\xd7\x4d\x5d\x35\xfc\xf9\x4e\xa5\xaa\xa6\x6a\x3e\xa8\xb6\xea\x27\x06\x83\xc2\xb4\x5c\xcf\xf0\x4a\x57\xb3\x1e\x42\x18\xab\xc2\xd0\x8d\xd8\x30\xb3\xb4\xac\x0d\x33\xd1\x98\x0e\x94\x4d\x15\x13\x6c\xc3\xf0\xb0\xb4\x4d\xd5\x63\xb6\x6d\x31\x97\x5a\x96\x45\x2d\x4a\x66\x1b\x3c\x04\x55\x51\x3f\xe2\xcb\x7f\x4d\xc8\xc5\xfa\xf0\x4b\xe1\x7e\x7b\xbb\xd9\xde\xf2\xa9\x3d\x9b\x2b\x71\xa6\xf0\xe6\xe5\xfe\x1b\x01\xee\x8f\x9b\xdb\xbb\x37\xdf\xc2\xaf\x61\x91\x6e\x7f\xcd\x77\xd3\x83\xe3\x7a\x3f\x0b\xfd\xed\x46\x52\x78\x94\x9f\x7c\xf3\xf2\x1b\xf8\xe8\x4e\x91\xc3\x8a\x66\xd4\x03\x52\xdb\x42\x6c\xc6\x6d\x61\x54\x9a\xeb\xb9\x56\xe3\xd0\x8c\x82\xd6\x44\x95\xa7\x06\x86\xe7\xe7\x55\x12\xab\x7a\x87\xbd\xef\xaf\x82\xda\x9b\x0a\x07\x2b\x3d\x0a\x2c\xc3\xb0\x1d\x3f\xd2\x42\xdf\x50\x75\x53\xf7\x23\xcd\xf7\x35\x55\xd3\x02\x50\xc5\xd8\xd2\xdc\xd2\x33\x3c\xd7\x32\xd1\x61\x46\xe2\xab\x36\xb4\x46\x51\xe9\x4c\x4b\x4c\xa3\x2e\xd3\xcc\x34\x62\x03\x07\x26\x58\x2c\x34\x0c\x2f\xb3\x6d\xe6\xa9\xae\x6d\x53\x97\x39\x9c\x23\x7c\xdd\x74\x41\x70\x08\x91\x0a\xa9\xe1\x6b\x4b\x2d\x23\x10\x7c\xb7\x6f\xbe\xfa\x9b\xc4\x03\x7c\x6f\x3e\x98\xcf\x54\xe2\x08\x34\xaf\xfa\xba\x1a\x30\x9b\x35\x52\x0a\x6e\x12\x45\x49\x1c\x47\x09\x90\xa4\x55\xbb\xb2\x1e\x86\x1a\x13\xab\x4d\x4e\x64\xa5\xc6\x69\x1a\x27\x49\xba\x94\x75\x1a\xa4\x42\x2a\x1f\x67\xcd\x82\xb2\x5f\x76\x1b\x5f\xd6\xe2\x5a\x2b\xfb\x0f\x4a\xea\x2c\x70\x9d\x36\xab\x86\xaa\xee\xc1\xef\x1c\x21\x4e\xa2\xb9\xa9\x47\x89\x54\x62\xe1\x26\x58\xa8\x7d\x51\xf7\x7d\x0d\xa1\x09\x4e\xe2\x4e\x66\x9c\x26\xc9\x52\x96\x42\x3a\x42\x14\x4d\x26\x64\x47\xfe\x39\xf9\x97\xe4\xef\xc8\xdf\x93\xff\x81\xfc\xdb\x59\x63\xfd\x12\xae\x96\x12\x2e\x6e\xaf\x37\x82\xb8\x51\xb6\xfb\xa3\x00\xbf\x87\xc3\x8b\x65\xc9\xce\xbb\xe3\xfd\x1d\x1c\x5e\x5c\xbc\xde\x0b\xcb\xcc\xae\xfb\xe3\xdd\xfe\xf5\x5e\xbc\xba\xde\x2c\x31\xda\xa2\xac\xbc\xb8\x38\xfc\xec\x69\xfe\xce\xf9\x2a\xbd\x39\xdc\x5e\x5d\xde\xbc\x84\xe3\x7e\x76\x3f\x94\xcd\xee\xfc\x62\xa5\x5b\x75\x6a\x18\x89\x19\xd4\xfa\xc8\x3c\xfb\x5d\x66\x7b\xf4\x44\xf4\x3a\x30\x52\xc3\x48\x6b\x0b\xd8\xc0\x7a\x3b\x35\x2b\xdb\xd5\x98\x5f\x6a\xea\xe0\x33\xcd\xb5\x2b\x33\xb5\x7b\x36\xf4\x7c\xda\x17\x36\xf3\x19\x2a\x7e\xd6\x75\x6b\xd1\x76\x96\x2e\xb8\x0e\x5f\xb5\xda\xb4\x3a\x33\xf5\x2d\x13\x1c\xcf\xc2\x01\x63\xbb\x6d\x6d\x08\x81\x59\x1e\x16\xa6\xe5\xa7\x66\x67\x1b\xef\x74\x88\x80\x38\x2a\xe6\xbe\x63\x59\x2c\x62\x8d\xa6\x63\xcf\x22\x66\x59\x8e\x0f\xae\xea\x9c\x08\x46\x40\x04\xdf\x71\x9c\xc9\x3c\xcf\x37\xc3\x30\x32\xda\xd6\x88\x12\xc7\x71\x08\xf9\x33\x52\x12\xa2\xd8\x92\x4d\xb6\xe4\x1f\x91\xdf\x90\x7f\xc2\xb9\xfb\x6f\xc8\x7f\x4b\xfe\x47\xf2\x3f\x13\xb2\x7d\xb3\x3f\xbe\xde\xed\x5f\x1c\xaf\x37\xcf\x16\x46\xbd\xdc\xdc\x1f\xaf\x2f\xae\x56\xca\x46\xbe\x82\xfb\xe3\xfe\xee\xfe\xee\xcd\xcd\xcb\xab\xcb\xcd\x95\x72\x2d\x1e\x85\x9d\xac\xac\x36\x17\x8f\xdc\xbc\xdf\xbd\xde\xaf\xc4\xcd\xc5\x99\x9b\x92\xb2\x55\xae\x37\xdb\x37\xc7\xfd\x56\xe1\x0f\xee\xde\x6c\x3f\xba\x0a\xaa\xeb\x18\xd8\xd1\x78\x74\xfd\x5c\xb5\x4c\xd3\x52\x73\xdf\x1d\x63\x6c\x75\xc7\x45\xe6\xc4\xa5\x6a\x9a\x6a\x19\x07\x49\x84\x7d\x1e\x01\xd3\x13\xdb\xb6\x6d\xa1\xd7\x81\xc5\x39\xf6\x51\xe2\xcf\xbf\xb1\xcd\xb1\x37\x4c\x2a\xfa\x96\x89\x7d\x6e\xdb\x36\xcc\xcf\x91\xda\xb6\x5d\x05\x76\xef\x52\x20\x2e\xb3\x6b\x5d\x33\x2d\xcb\xd4\x74\x5a\xd9\xcc\x3d\x11\xea\xf6\x76\x50\x09\x5e\x13\xb4\xd4\xd0\x4c\x53\x33\x68\x1b\xa0\x9b\x41\x60\x99\xb5\xdf\x83\x3e\xc3\x48\x7a\xbf\x36\x2d\x4c\x32\xfe\xd3\x2f\x74\x37\x49\x5c\xdd\x7e\xfe\x47\xc8\x0a\xc6\x53\x21\x53\x29\x21\x3f\xe5\x3b\x6e\xf3\xf5\xbb\xae\xae\x37\x57\xdb\xbb\xfb\xe3\x1d\x8f\xab\xbc\x3a\xf0\x6e\xb0\xc3\xfa\x06\xb6\x77\x37\xeb\xed\xfa\xe6\x6a\x7b\x77\x23\xae\xb7\x6b\x90\x95\xab\xed\xdd\xeb\xbd\x64\xe8\x2c\x7b\x37\xa4\xaa\x5e\x76\x11\xb0\xb8\x2d\x31\x3e\x11\x4f\x74\xbc\x13\x49\x72\xe8\xa6\x41\x8b\xc5\x24\xd6\x20\xd0\x53\x36\x0c\x2c\xd5\x05\x07\x78\x47\x05\x1a\xc0\x62\xcc\xc1\x8d\x63\xf4\x67\x27\x73\x0a\x32\x3d\x0c\x75\xbe\x4f\xa5\x0c\xe1\xc9\x94\x63\x59\xe5\x7a\xfa\x9f\x92\xff\x84\x38\xe4\x5f\x11\xb2\x13\x94\xdd\xfd\xf1\x66\x7f\x14\xef\xe1\x7d\x7d\x93\x8d\xb8\x51\x6e\xae\x37\xd2\x6b\x51\x26\xca\xc5\xfd\xe1\x76\x73\xf1\x9a\xec\xcf\xb5\x2e\x9e\x93\xdd\xbc\xbe\x79\xf9\xe7\x30\x7f\x2f\xaf\x6f\x5e\x2a\xbf\x04\x59\xd9\xdc\x1f\x0f\x73\xc3\xd9\xaf\x48\x32\xe0\x38\x7a\xb9\xa6\x86\x26\x54\x4b\x9d\x42\x6d\x84\xaa\x96\x7b\x23\x8e\x43\x91\x63\xc5\xc2\xb6\xae\xdb\x90\x61\x95\xab\xa6\x39\x96\x61\x58\xaa\x49\xec\x84\x36\x55\x85\x96\x35\x7d\xdf\xb0\xda\xeb\xb2\xd6\x8f\xfc\x36\xeb\xbc\x0e\xc7\x2c\xcb\x82\x4e\x03\xbb\x04\x5f\xd7\xe7\x4a\xd4\x75\x4c\x4b\x2c\xb5\x2e\x4c\xb3\x4c\x0a\x22\xcc\x2d\xac\x55\x15\x4c\x0b\xdc\x48\x33\x4d\xd3\x44\x93\xcb\x5c\x4f\x37\xa7\x34\x55\xd5\xd4\x0c\x53\x37\x6d\xea\xcc\x4d\x43\x22\x91\xe6\xe4\xca\xa1\xac\x92\xbf\x24\xff\x9c\xfc\x5b\xf2\xbf\x90\xff\x95\x10\x69\x7b\x77\xff\x07\x38\xdc\x1f\xe5\x9b\x99\xb8\xd7\xdf\x72\xbe\x5c\x1c\xef\x8f\xf7\xdc\xb4\x15\xae\x2e\xaf\xaf\x2e\xbf\x81\xeb\xcd\xfe\xf7\x70\xb7\x7f\x7d\xf7\xe6\xc5\xdd\x1b\x72\xf3\x52\x39\xde\xf3\xc5\x6b\xae\x2e\x95\xeb\x25\x15\xfc\x1e\xee\x66\xce\xc8\xdf\x80\x20\x5f\x5d\xfe\x12\x7e\x01\x87\xdb\xe3\xfd\xf1\xf6\x78\x90\x15\x59\xd9\x2e\x59\xf7\xf2\x37\xf0\xf2\xe7\xb3\x0c\xda\xdf\x1f\xe0\xf5\x7e\x3b\xb7\x03\xd9\x79\x17\x26\x2a\xd5\x7d\x66\xd8\xc1\x4c\xa9\x66\x69\x69\x6b\x38\xb1\xdb\x37\xa0\x25\xbe\x19\x6a\x49\xa7\x46\xa6\x9e\x9c\x48\x91\xbb\xba\xaa\xda\xbe\xa9\xa9\x45\x60\x63\xe1\xb8\x54\x67\x5d\xea\x1a\x7d\xa8\x9a\xaa\xa1\xab\x54\x8f\x5a\x43\x67\x1e\xf3\x04\xdb\xf5\x13\xcb\xeb\x6c\x43\x67\x8e\x27\x74\xb1\x36\xd9\x7a\xbc\x62\xf9\xc0\x32\x2d\x6d\x99\x6b\xea\x86\xa3\x19\x7a\x0c\xaa\xe9\xeb\x39\xb6\x7d\x82\xbd\x6a\x05\xaa\xae\xd9\x29\x6b\x54\x8b\xd9\x86\xa3\x03\x4d\x1a\x60\x01\xa5\x1a\xd5\x4d\xc3\xe9\x1d\x2c\x0d\x33\x13\x13\xe6\x19\x54\xd7\x7c\x0b\x5b\x9f\xa9\x9a\xad\xa9\xd4\x70\xca\xc8\xea\xf3\xc4\xb3\xc1\x72\x4a\xd7\x62\xbe\xa6\x1a\xae\xf1\xae\xd4\xb3\x4c\x8f\x88\x28\x04\x84\x48\x89\x54\x93\x3d\xf9\x67\xe4\x3f\xe3\x6b\xac\xde\xff\x0e\x66\x91\x30\x9b\x30\x1f\xac\xcd\xcc\xc5\xd0\xf5\xd5\xe5\xaf\xe0\xea\x72\x23\xde\xde\xbd\x5e\xd2\x3c\xb6\xc9\x0d\x9f\xf3\x3f\xa7\x39\xc0\xeb\xf5\xdd\xcd\x15\x53\xae\xb6\x52\xf2\xd0\xf5\x9a\x1b\xb8\x19\x9b\x1b\x20\xcb\xdc\xc0\x55\xbb\x46\x0b\x5c\xcf\x99\x3f\x74\xc7\x73\x03\x5d\x60\x7d\xd7\x0b\x45\x93\x0c\xae\xa9\xd9\x2a\x8d\xed\xdc\xd4\x78\xd3\xd1\x34\x33\xb7\x52\xd5\xd6\x4c\x77\x48\x04\xc6\x1c\x9d\x45\x96\x1d\x50\xc3\x30\x4d\xc3\xa0\x81\x6d\x45\x4c\x77\xd8\xd4\x64\x40\x5c\xf7\x44\xb2\x80\xef\x53\xf4\xa8\xb7\x5e\x91\xbf\x22\x6f\xc8\x6f\xc9\xdf\x90\xbf\xfd\x44\x6b\xc9\xe2\xac\x61\x84\xfd\x87\x4a\xeb\x82\x93\x72\xb8\xbd\xb8\x9c\x4d\xe0\x9b\x97\xd2\xf9\x37\x1c\xb7\xc7\xcd\x76\xa3\x6c\x77\xe7\x07\xcf\x15\x52\xaf\x61\xd3\xf7\xd8\x68\xfd\x7b\x7d\x14\xce\x72\xbf\xe0\xc2\x9f\xf0\x73\xec\x81\xdd\x34\x60\xcf\xba\x4b\x88\x3e\x55\x38\x03\xe6\xe3\x08\xee\xf0\x5c\xd9\x60\xf2\x94\x7f\xbe\xe9\xed\xae\xb3\xdb\x59\x89\x91\xaf\x48\x45\x88\x62\x4a\x36\x59\x93\x9f\x92\x2d\x97\x74\xbf\x25\xff\x8c\xfc\x0b\x3e\xef\xfa\xf5\xfe\xfe\x79\xbd\x6d\xe4\xdd\xf5\x46\x56\xb6\xfb\x17\x8f\x64\xf1\x14\xab\x0b\x45\x3c\x53\x23\x6d\x37\xf2\xd5\xac\x78\xb6\xc7\x35\x7f\x70\xf7\xe6\x70\xbe\x6e\xcf\xd7\x15\xf1\x92\x98\x2e\x62\x84\xc6\x29\x04\x43\xd4\xdb\x58\x26\x11\x5f\x26\xfb\xa1\x75\x86\x78\x00\xf5\xac\x07\xa0\x01\xc7\x71\x1f\x74\xd7\x01\x7b\xd6\x02\xad\x6d\xdb\xd3\x9c\x50\x88\xfa\x20\x55\x1f\xc5\xbf\x9a\x86\x99\x3b\x5a\x55\x06\x01\x0e\xb3\x8c\x2f\x2b\x6b\x74\xb9\x8c\x27\xb6\x6d\x0f\x76\x50\x55\x81\x5d\x60\xf7\x81\x90\x17\x9f\x64\xfc\xd7\xe4\x1b\xde\x27\xfb\x5e\xa6\x6f\x37\xdb\xf5\x56\xd9\x3e\x4a\x7c\x41\xad\x32\x60\x59\xf5\x60\x94\xb3\x2b\xa9\x0b\x85\x9a\xce\x82\x5d\x4a\x16\x69\x6d\xa2\x6a\x6a\x8b\x0c\x27\x44\x7a\x92\xcf\x17\xe4\x86\xfc\x15\xb9\xe5\x73\x54\x5f\xdd\xbc\x94\x3e\x92\xcc\x8f\x33\x26\x67\x61\x33\x0b\x14\x38\xbe\x3a\xdc\x4a\x1b\x65\x3b\xcb\x8e\xeb\xcd\xf6\xfe\xb8\x15\x14\x69\x38\x91\x61\x38\x11\xff\xb9\xf0\xc5\xf6\xb9\x88\x7d\x68\x55\xa0\x6d\x03\x4c\xd5\x1e\x1c\xd1\xad\x53\xb0\xfd\xf2\xed\x50\x04\x60\x67\x95\xa0\xa9\x2a\xb0\x0f\xc5\x6c\xf0\x28\x48\xd1\xd6\x18\xd3\x7a\x74\xa2\xd1\x0b\x03\xff\x44\x42\xde\x4f\xd4\x9c\x2c\x39\x94\x19\xd1\xc8\xdf\x92\x7f\x4d\xfe\x7e\x6e\x09\x8b\x80\x9b\x9b\xf7\x2c\x07\x5f\x2a\xf7\x87\xdb\x17\x57\x97\xb2\x22\x2f\xdf\x2a\xdc\xc8\x37\xb2\x22\x3f\x09\xd9\x3f\xc0\xef\xe5\xc3\xed\xe6\x92\x2b\x92\x45\x88\xce\xf4\xdc\x8b\x2f\x67\x13\xfd\x77\xf0\xe6\x20\x3e\x31\x57\x4a\x2c\xbf\xd0\x28\x33\x7d\x27\xb5\xd2\xae\x1a\x4d\x43\x75\x8d\x29\xd7\xb5\xce\x35\xd8\x59\x62\x96\x86\x66\x7b\x7e\x6e\x5a\x9a\x4e\x5d\x87\x7a\x56\xe2\x9b\x53\x60\xb1\x2c\xf2\x1c\xa6\x1b\x76\x29\xce\xba\x36\x4c\x54\xb0\x7c\xc7\x01\xc3\x19\x5c\xc3\x64\x8c\xea\x2c\x3f\x91\xda\xa9\x03\x43\xd3\x63\xa6\xa9\x90\x15\xb6\xa1\xea\xba\xa3\xeb\x46\xdc\x5b\x9a\xa9\xab\x8c\x31\x6a\x78\x4c\x67\x96\x57\x3b\x58\xdb\xae\x1f\x24\x26\xf4\x86\x6b\xa8\xda\x43\xad\xa5\xea\x30\xa8\x8b\xcd\xfc\x28\xe3\x7e\xce\x57\x16\xfb\x3e\xd9\x76\x73\xb1\x9d\xe5\xdf\x76\x96\x70\xe6\x87\x62\xab\x7e\xe8\x7a\x70\x3b\x21\xff\xa2\x8c\x9a\xdc\x26\x19\x54\x75\x48\x08\x01\x88\x08\x91\x23\xa9\x27\x2a\x21\x70\x4d\xce\xeb\x22\x2e\x33\xac\xd7\xe7\x0e\x1f\xb2\x22\x1e\x34\x4e\x9e\x44\x7e\x31\x75\x85\x1f\x25\xb9\x03\xb5\xd4\x47\x68\x67\x6e\x9a\xbb\xd8\xe9\x71\xac\x83\xe6\xe6\xa9\x9b\xc1\xb9\xef\x73\x3c\x55\x0a\x93\x5a\xb2\x26\x37\x84\x48\xaf\xc9\x79\x0e\xe4\x79\xe1\x57\xa2\xdc\x93\x17\xcb\x5a\x2c\x4b\x1b\x7d\x41\x56\x24\x98\xc6\xa4\xad\xba\x24\xe9\xaa\x2e\x43\x1a\x5a\xd0\x25\x45\x5a\x67\x59\x9d\x16\x31\x0c\x56\x26\x50\x60\x65\xdd\x55\x55\x57\x97\x38\x4c\x23\x73\xa1\x07\x9a\xa6\xe5\x30\x94\x69\x7a\x22\xb8\xf8\x39\x10\x9d\x2a\x39\x92\xf5\x73\x7f\xaf\x78\xf8\x4a\x58\x11\x21\x9a\xa2\x29\x0a\x04\x26\xb0\x69\x90\xf5\x87\xe6\xa1\x16\xcd\xc9\x15\x72\x81\xc7\x57\x9f\xf9\x50\xf3\x35\x90\xce\x6b\x65\x3f\xe7\xc2\xf3\xe5\x83\x4d\xb0\xb3\x2c\xe4\xbc\x08\x82\x2c\x03\x5b\x2d\xb2\xac\x58\x11\x0d\xbb\x3c\x7b\xcf\x8d\x2c\x07\x4d\xb3\x9c\x24\xcf\x13\x67\xc1\xcb\x23\x44\xce\x65\x42\x54\x6e\xef\x3d\x71\xfb\x8a\x97\x73\xf7\xc8\x6d\xb8\xdb\xaf\xcf\xfd\xa1\x64\x2f\x93\xf3\xa2\x29\x6b\xe5\x6a\x45\x7c\xa8\xc3\x2a\xf3\xbc\x62\x4a\x0a\xcf\xcb\x4a\x1f\x1a\x70\x8b\x38\x8a\x52\x17\x2d\xdb\x46\xcb\x4d\xa3\x28\x2e\x64\x92\x62\x54\x05\x79\x69\xe6\x46\x59\x1a\xb9\x59\xe6\x7e\x05\xc9\xdb\xd6\x32\xc0\x0b\x93\xd8\xc9\x20\x73\x1c\xf4\x32\x27\x4e\x42\xcc\x0c\x8b\xc0\xb3\xfa\xfa\x4c\x6d\x7d\x52\x37\x9f\xd6\xc5\xcc\xc3\xf8\x54\xcb\xa1\xac\x9d\xfb\xe1\x89\x10\x4e\xf1\x14\xcb\xda\x43\xbb\x8c\x0d\x2c\xf4\x4b\x03\xf9\x05\xf9\xdd\x7b\x2e\x3f\xa7\xfe\x19\x97\xc5\x47\x2e\xb0\xdd\xfb\xcd\x16\x56\xeb\x47\x5e\x48\x1e\xd8\x65\xee\xbb\x33\x27\x5c\x3f\x2f\xc0\x62\x55\x51\x54\x51\x11\x47\x71\x82\x85\x96\x25\x49\xa6\x63\x9e\xc4\x51\x5c\xac\x54\x13\xbb\xbc\x34\x8b\x99\x19\x85\x59\xe6\x30\xcb\xf5\xb4\xaa\x52\xeb\x5d\x6f\x73\x96\x24\xc0\x54\xd7\x0d\xd3\x34\x74\x5d\x15\x87\x84\xb3\xc5\xe6\xfd\xc0\xa7\x41\x71\xa4\x86\xfc\x63\xf2\xaf\x09\x81\xb9\xa5\x5e\x5d\x2a\xf7\x87\xfb\xbb\x37\xc2\xdd\x9b\xe3\xe6\xfc\xe0\x7a\xf3\xd1\x83\xd5\xd5\xe5\x6a\xab\xbd\xba\x7b\xb3\x3b\xbf\x00\x59\xb9\xb9\x3f\xbe\xbe\xe1\x97\x97\x0a\xbf\x3c\x25\x12\x89\xed\xab\x61\x48\xfd\xcc\x0a\x7d\xb5\xd1\xa8\xef\x5b\xb6\xaf\x42\x85\x11\x1a\x68\x60\x24\x10\xea\x05\x42\xa9\x69\x8e\xc1\xac\x5c\x35\x1d\x93\xa5\xae\x6a\x38\x26\xc5\x00\x5c\x48\x20\x01\x57\xf2\xa3\xd0\xc5\xd4\xb3\x6c\xaa\x5a\x2e\x78\x7e\x32\xaa\x65\xe2\x62\xe6\x5b\x16\xa5\x9a\xed\x82\xef\x05\xa5\x1a\xf9\x1e\x66\x9e\xed\xe8\x85\x97\x24\x5e\xa9\xeb\x16\x7f\x51\x3d\x10\xd7\xb0\x6d\x6a\xb9\x8e\x4d\x6d\xdb\x33\x74\xdf\x0e\x02\xdb\x23\x04\x44\x7a\x1a\x56\x23\x5f\xc3\x9b\x8f\x69\x9f\x9d\xf8\x55\xea\xa5\xa1\x1f\x42\x27\xb6\xef\xfc\x24\x0b\x5c\x60\x04\x04\xfd\x34\x48\xa5\x54\x92\x2b\x9e\xf6\x9a\x5c\x5d\x2a\x7b\x6e\x7e\x3d\x66\x13\x2b\x4f\x85\xa8\xd3\x82\x5e\x4f\x03\x3f\x9a\xb3\xfb\x58\x66\x75\xa8\xdb\x41\xd0\x05\x0f\xee\x19\x14\x11\x60\x86\x55\x73\x58\x3f\x7d\xea\x7f\x66\xbb\xf5\x76\xfd\xfe\x96\xcf\xf9\xab\x39\xa0\x74\xca\xb3\xc0\x0f\x21\x11\xd9\xe4\x08\xee\x94\x83\xb6\x80\x52\x05\x32\x59\xe7\x5b\xb1\xc5\xb2\x98\x65\x6d\x79\xea\xa4\x48\x56\xc9\x9f\x91\x4b\x42\x60\x69\x73\x44\x5a\x1f\xd6\xf7\x2f\xce\xcd\x4d\x54\xbd\x3e\xca\x30\xc2\xd2\x2b\x7b\xd7\xf5\x63\xa1\xa8\xf3\xb4\xc5\x4c\x93\xcd\xb7\xda\xac\xf4\xfc\xa0\x28\x96\xbe\x8e\x91\xf7\x75\xfc\x8c\xf7\x75\x28\x77\xc7\xf5\x7c\x1c\xae\x76\xeb\xc3\xfa\x78\xa5\xf0\xe3\x66\x2d\xad\x6f\x2e\x76\x6b\x49\xd4\xdb\x76\x76\xd8\x35\x9b\x5f\x67\xa3\x01\x34\xec\x40\xf5\x2b\x1f\x1c\xbf\x0c\x40\x1d\x13\xd0\x4e\x24\xa8\x02\x2c\x83\xda\xc7\x1c\x8c\x04\x2b\x81\xc6\xe0\xf0\xb1\x29\x50\x09\x91\x7b\x69\x99\xd7\x77\x1e\xbf\x3f\x6e\xd7\xdb\xe7\x3d\xf4\xa0\x4a\xcd\x5b\xc3\x93\xd8\xdb\x41\x54\xf9\xb0\x89\x69\xba\x52\xfd\xd6\xf4\x24\x36\x85\xe7\x91\x94\xd9\x0f\xfd\x10\xd6\x2f\xbf\x00\xed\xf3\x90\x57\xda\x02\xd9\x72\xa6\x61\x3e\xcf\xbf\xce\x65\x60\x64\xba\x8e\x65\x39\xee\x54\x98\x8e\x33\xbf\x23\xd2\x27\x65\xfd\xea\x07\x94\xf6\x85\x92\xbd\x19\xf8\x7c\x60\xf9\x48\xdd\xfb\xbb\x47\x1c\xaa\x33\x9d\x18\x7d\x7c\xb3\xf8\xb9\x9f\xe2\x73\xfc\x3c\x46\xcf\xd7\x28\x5f\x7f\xe1\xf9\x67\xb1\x9b\x82\xc7\x91\xa8\x47\xdc\x84\x64\xe1\x94\xe5\x7c\x8c\xe5\x99\x81\xee\x64\x7e\xf4\x80\x10\xa2\x7c\x16\xd7\x7f\xfa\xa7\xb1\xfd\x12\x2f\xbf\x84\x79\xf8\x58\xea\x64\x39\xcb\x9d\x03\xde\x13\x87\xb3\xc7\x67\x42\xf5\x71\x7d\x37\xcf\x10\x9e\xaf\xe8\x3f\xf2\xdc\xff\xe8\xcd\xcc\x7b\xfa\x05\x7a\xfe\xf3\xf7\x14\x49\x3f\x80\xa2\x1f\x5b\x2f\xf6\x8c\xfb\x4c\xc3\x94\x3d\xa2\x24\x78\x9f\x3e\xfb\xf4\xdd\x99\xca\xe1\xb1\x1e\x1f\x69\x33\x3e\xaa\xaa\xf3\x03\xe7\x91\x4f\x0e\xb7\x2d\x86\x53\x28\x17\xb2\xcd\xe5\x27\x81\x1b\x41\x3c\xbe\xb8\x78\x01\x72\x81\x2e\x8e\x41\x3e\xe6\x65\xd0\x81\x23\x6b\x0f\xc3\x83\x0f\x05\x24\x2e\xe6\x58\x89\x96\xc0\xed\xb3\xf0\x14\x2a\x86\xec\x9e\xf3\x6e\x05\xd8\xcd\x79\x15\x03\x75\x1c\xb1\x4d\xb0\x03\x23\xf7\x1a\xb0\x65\xed\x61\x7c\xf0\x20\x86\x2c\xc5\x0a\x5b\x91\x08\xf1\x32\x36\x4e\x86\x95\xbb\x8c\x7d\x2e\x61\x96\x5f\xf1\x90\x4b\x81\x62\xec\x43\x08\x91\x8f\x11\x3f\x61\xec\x0b\xcd\x7c\x17\x43\xb8\xfc\x84\x10\x63\x9f\xc3\x70\x48\xb1\xca\x56\xe3\xc7\x30\xa0\xc0\xac\x04\x1f\xfc\x1a\x13\xf0\x2b\x4c\x31\x2d\x85\x86\xdf\x81\x5f\x62\x82\x69\x09\x3e\xa6\xe7\xd8\x83\x53\x2e\x77\xb2\xc6\x47\x12\xef\x8f\xd7\x17\xe4\x78\xbd\x21\xf0\xe2\x42\x56\x5e\x8b\x44\x7c\xbd\xbf\x07\x41\x70\xc3\x9a\x39\xa0\xf5\x7e\x88\x0d\x16\x51\x1b\xab\x6d\x86\x7d\x11\x38\x19\xb8\xa1\x54\xd8\x7a\x8f\x3d\x98\xa5\xee\xe3\x88\x11\xb6\xd8\x25\xfa\x00\x1a\x16\x38\xe4\x41\x07\x31\x68\x44\x00\xde\x21\x2c\x53\xf2\x0d\x2f\xe9\x15\xb9\x38\xbc\x20\xd2\xd5\x8a\x88\x37\x02\xd9\x1d\x57\x17\x2f\x76\xaf\x44\x01\x08\xa8\x10\x99\x9e\x09\x11\xa8\xd8\xe3\x7c\x8b\x11\xf6\x19\x34\x49\x02\x2d\xea\x49\x22\x9a\x06\x44\xb3\x60\xc6\xc8\xf0\x0d\x0c\xb1\x07\x15\x62\xc3\xc8\xd0\x82\x2a\xcb\xa1\x42\x8b\xf3\xc6\x38\x31\xc1\x06\x83\x48\x84\x48\x8a\xb0\x3b\xae\x04\x3b\xcc\x4e\x24\x04\x2d\xf6\x81\x54\x5e\x4f\x04\x62\x9c\x54\xc1\x85\xf3\x38\xea\xf1\xd9\x9a\x36\xc7\xcb\xa7\xed\x44\x64\x23\x0b\x83\x2c\x0b\xc2\x2c\x72\x97\x16\xe5\xea\xf3\xef\xf9\xb0\x5c\xd7\x5a\x3e\x1c\x41\xf0\xc1\x92\xf2\x55\x7c\xb6\x6d\x61\x7f\xa1\xc0\xfe\x42\xca\xb1\x4f\xfb\x06\x87\xb4\x5b\x79\x0f\x9d\x26\xea\xfa\x43\xa7\x8b\x1a\xb7\xeb\x52\xd9\x3f\xf3\x5d\x56\xf6\xe4\x62\xf6\xb0\x67\x55\x77\xbd\x51\x5e\xed\xe6\x4a\xb8\x10\xf2\x28\x4b\xc0\xae\x12\xcb\x16\x3d\xac\x71\xc8\xf3\x00\x53\x0c\xec\x34\x81\x22\x59\xd1\xaa\xf2\x21\x86\xdc\x4b\xe2\xd8\x99\xc6\xc6\xf3\xd3\x31\x4f\x4c\x1b\xcc\x65\x83\x22\x01\x18\x31\xe5\x41\x8a\x97\xb8\xe8\xaf\xe0\x7a\xa3\xbc\xde\x13\xd8\xdf\x1f\x5f\xcc\x46\xe4\x57\x30\x93\x27\xca\x03\x52\xdb\x8a\x1d\x0b\x63\x4c\xc3\xc0\xca\x2a\x2f\x8e\x60\x9c\x62\xdb\xd2\x9d\x5c\x22\xe8\x78\x7e\x10\x38\x58\x61\x16\xc7\x39\xc4\x6d\x02\xf5\xd4\xda\x3e\x66\xdc\x9f\x88\x4e\x89\x12\xc9\x67\x1e\x4a\x8f\x4b\x1b\xac\x19\x8f\x56\x7e\xbc\x5f\x11\x8c\xa7\x51\xa0\x10\x42\x28\xd0\x69\xc4\x18\x6b\x74\x20\x07\x0b\x4c\x28\xd0\x09\x60\x04\x0f\x5c\x18\x91\x62\x8e\x19\x52\x59\x43\x17\x3b\xec\xd0\x83\x0c\x34\xd0\x20\x9f\x0d\x53\x72\xf2\x65\x4d\xf6\x96\x3a\xfd\x0a\x36\x20\x6b\x21\xba\x90\x87\x18\x78\xa6\x18\x8a\x91\xf9\x50\xce\x6d\xba\x3b\xf9\x2b\xb2\xa4\x5b\xa2\x98\x57\x04\xdd\x10\x12\x0c\x42\xa1\x7b\x88\x4d\xd1\x12\x6d\x93\x08\x33\x3c\x65\x81\xf7\xf5\x23\xc4\x0b\x7e\x56\xb4\x00\x1d\x28\x02\x0c\x92\xc7\x02\x5c\xeb\x5c\xc0\x43\x6d\x3d\x15\x45\x04\xd2\x3e\x95\xf5\xf5\x63\x69\x17\x1f\x95\x99\xa3\x13\x42\x8a\x3e\x2f\xdc\x12\x4d\xd1\x36\x1f\xa2\xc7\x3b\x4e\x97\xd0\x3d\xd2\xb5\x44\xac\xcb\xda\xfc\xc9\x6a\x52\x3d\xa9\x62\xb4\xc4\x21\x71\x9a\x84\x8e\xd3\xce\x63\xdb\x57\x64\xea\xc0\x2f\xd3\x44\xe8\xc9\x4c\x8b\xd0\xc9\xf9\x23\x1e\xe7\x59\xd7\x3c\x9c\x5e\xce\xb1\xc7\x40\xc8\x23\x74\xd3\x55\x8d\xaa\x18\x61\x9f\x4e\x11\xf4\x4b\x1b\x71\x9f\xe0\xce\x3c\x58\xf2\xf1\x69\x4a\x2b\x32\xb9\xc0\x20\x8d\x52\x1c\x52\x48\xa1\x9b\xa8\x10\xa2\x96\x9e\xeb\x21\x92\x3d\x42\x97\x1c\x57\x64\xcd\x40\x8e\xa6\x48\x88\x30\x80\x24\x95\x47\x1b\x73\xd4\xd0\xe0\xdb\xda\xce\x3e\xdc\x99\x47\x3c\xfd\xdd\x9c\xfa\x6e\xbb\x22\x53\x34\x73\x47\x88\x52\x0b\x66\x7f\xa9\x03\xd7\x26\x02\x58\x84\xc8\x95\x54\x7e\x3a\x5f\x43\xae\xde\x46\x52\x34\xa5\xc5\x94\x4a\x91\xc4\xf2\xa9\x78\x48\x45\x3f\x9f\x69\x48\x49\x2c\x7b\x92\xf5\x38\x67\x6b\x99\xe5\x25\x7b\xef\xcc\x55\x3d\x1f\x62\x0e\xe9\x3b\x9b\xef\x86\x35\xe3\xee\x49\x83\xec\xcd\x29\x25\x65\xb7\xde\x6d\xa4\xb5\x34\xd8\x7c\xa5\x7c\xac\xd5\xb8\x93\xac\x2e\xce\xde\x39\x4b\xec\xfd\xc9\xe3\x78\x2b\x84\xec\xa4\xfd\x6e\xbd\x3b\x4a\x73\xad\xda\x60\x62\x6d\x43\x3e\xa7\x5c\x15\x59\xdc\x91\xa5\x2d\x71\xfe\x53\xee\xa9\x3d\x72\x65\xff\x5a\xb8\x7b\xf3\xe2\xb8\x5d\xcb\xf9\xec\xd3\xe2\x08\xb4\x70\xc3\xd0\xc5\x38\x95\x47\x07\x73\xd4\xd1\xc0\x5c\x8b\xa1\x2e\x2b\xa8\xe2\xef\x86\xf7\x75\xf2\x1e\xd6\x99\x63\xe2\x7a\x7b\xfd\xe2\xea\x52\x50\x78\xcd\x50\x1c\xe7\x3a\x8d\x9d\x28\x72\x52\x07\x5c\x68\xa0\x05\xd7\xf9\x2e\x94\x59\x8c\x56\x55\xa2\xc9\xe7\x20\x49\xfa\xaa\x51\x7a\xb9\x26\x32\x9f\x0d\x78\x23\xec\x8f\x87\xeb\xf3\x45\xe9\xe3\xc8\xa0\xb5\x86\x75\x12\x9a\xac\xd6\x56\x0d\xa8\xb5\xda\x60\xcb\x2f\x44\x20\xea\xaa\x11\x9a\xa7\xbc\xb2\x78\xf3\xe2\x78\x90\x96\x8b\xd0\x18\x51\x6c\x6b\x35\xc6\xcb\x55\x2e\x6a\xec\x41\x6f\xd4\xe5\xb2\xf4\x35\xa8\x38\x0a\x0d\x19\x96\xfc\x3b\x41\xb9\xd9\xdf\x5f\xdc\x2c\x17\xa1\xb1\xb4\x9a\x99\xe1\x68\xab\x35\x33\xa2\x01\x87\x5e\xad\x41\xc5\xba\x9a\x2f\x04\xc4\xe2\xe4\xac\x1c\xd9\xe5\x71\x77\x87\xf5\x8d\x58\x64\x99\xec\x8e\x23\x97\xb5\xe1\xc9\x93\x22\xd9\x3d\xd7\xf7\x61\x7d\x33\x1f\xab\x2e\xcb\xa6\x74\x4e\xf5\x1d\x95\xd5\x77\x2a\x11\x21\x3b\xd9\xbc\x9d\x3e\xc6\xe3\x9e\x53\xce\x87\xd4\x65\xd9\xbb\x2a\xcb\x04\x35\xcb\x64\x6f\xec\xe5\xf0\x6d\x20\xd1\x77\x01\xd7\x1d\xf9\x29\x90\x47\x99\x71\x1b\xfe\x20\x88\x8b\xdc\x94\xf6\xaf\xe0\xd5\xee\xb8\x92\x5e\x48\x59\xe9\xd7\x43\xe7\xf7\x1d\x66\x53\xea\x0a\x11\x30\x2c\x31\xb7\xc1\x07\xa7\x90\xd9\x94\x61\x5e\x94\x49\x99\xa3\x9d\xa6\x39\x84\x5d\x99\x54\x2d\xa8\x44\x80\xf6\xd4\xcb\xda\x79\x3f\x32\x02\x82\xb4\x5a\x9f\x03\xbc\x66\xf7\x9a\xbb\xa8\x9b\x57\x17\xb0\x7a\x0a\xbb\x92\x35\x1f\x1b\xd0\xb1\x6d\x1a\x1c\x20\xec\x6a\x3f\xac\xc1\x74\x31\xc0\x2c\x8b\xd3\x3c\x90\x12\xac\x9a\x02\x87\x0a\x7b\x20\x65\x3f\x04\x59\x14\x84\xb6\x61\x05\x35\xe8\x93\x5b\xd5\x61\x9a\xa7\x41\xba\xd4\x85\x2f\x54\x4a\x2a\x59\x3c\xe6\x8d\x2c\xaa\x00\xb6\x57\x5b\xb1\x0d\xcc\xca\xf0\x27\x4b\x31\xc6\x46\xb2\xb2\xca\xaa\x33\x74\xd2\x65\x3d\x2a\x1f\x6c\x25\x95\x09\xcf\xf3\x93\xe7\xb9\xf8\x0e\x5b\x4d\x68\xe6\x66\xb8\xe4\x4c\xa5\xf6\xad\x2e\x93\xac\x36\xeb\x99\x6c\xf4\x52\x42\x56\x24\x24\xa1\x12\xcb\xd6\x39\xff\xfa\x13\x08\xf3\xd1\xf9\x66\x6e\xf8\x93\xa9\xb0\x71\x28\xa4\xf0\x6d\x1c\xc9\xd9\x77\x9e\x6c\xc5\xb9\x59\xc4\xc8\x85\x0f\x56\x8b\x1c\x21\xdd\xa9\x52\x6c\x59\xe7\xeb\x19\xcf\xea\x52\x80\x95\xa4\xbc\x02\x79\xa5\xec\x5f\x1d\x5f\xef\xb9\xd2\xdc\xca\xca\xfe\x85\x30\x66\xa6\x29\x0c\x16\xfa\xa0\x43\x67\x20\xc5\x54\xc3\x7c\xf4\x21\x6e\xb2\x20\x0e\x53\xb0\x9d\x29\x74\xa2\x68\x90\x75\x33\xf2\xa7\x1e\xa3\x5e\xcb\x55\xd0\xb5\xca\x4d\xc3\xb4\x6c\xdd\x2e\x05\x1d\xfc\x34\xf2\x81\x12\x11\xc2\x93\x2f\xc7\xab\x86\xfc\x43\x72\x20\xbf\x23\x44\x7a\xbd\x7f\xb5\x7e\xb3\x13\xc8\xe2\xec\xbe\x39\x6e\xef\xae\xff\x1a\xde\x1c\x37\xca\xab\xe3\x46\xde\x5e\x2a\xbc\x8b\xe6\xb8\xb9\x54\x56\xeb\xcb\x15\x28\x57\x97\xca\xbd\xf2\xfa\x5b\x58\x7a\x8c\x56\x2a\x35\x05\x72\x22\x11\x16\x71\x90\x42\x44\xb1\x0a\x03\x8f\xe5\x0c\xca\x9c\x66\xa8\x53\xc7\x56\x55\x4a\x73\x0a\x21\x0e\x58\xa6\xd4\xad\x19\x65\xad\x69\x58\xa9\x16\x6b\x40\x4b\x1b\x4b\xac\xb3\x00\xcc\xc2\x73\x33\xa6\x56\x6a\xc5\x58\xaa\x5a\x36\xa3\xaa\x6e\x30\xd5\xc7\xaa\xec\x84\x8a\x45\x91\x11\x76\x4e\x1c\x25\x99\x61\xf3\x35\x89\x22\x45\x97\x4d\xde\x2f\xfd\xdb\x33\x0d\xec\x43\x1a\x0e\xb7\xc7\x99\x88\xdd\x46\xe2\x5b\x77\x3f\x91\x40\xe0\xa5\x72\x25\xde\xc3\xeb\xf5\xdd\xd2\xd1\xb3\x32\x54\x5d\x08\x31\x4f\xd1\x29\xa3\x12\x46\x8a\x8e\x97\x3b\xbe\x5a\xa8\xc2\x40\x1f\x46\x1a\x78\xcc\xa4\xb4\x50\xa1\xc7\x02\x93\x20\x52\x33\xec\x55\x2c\x7c\xd3\x8d\x5c\x57\x07\x1f\x98\x8b\x36\x7a\x75\x0a\x59\x9d\x44\x05\xa3\x66\x41\x5b\x96\xab\x76\xa2\x52\xcd\xd2\x99\x15\xa2\xdf\x61\x2f\x46\x5a\x83\x63\x85\x4d\x0c\x24\xce\x71\xb4\x43\x22\x40\x7c\xca\xe5\x60\xe5\x9c\xed\x48\xe1\xe6\xa5\xb0\x7e\x73\xb1\x91\x39\x5e\x17\xa0\xdc\x31\xf1\xf8\x62\x2d\xe6\x59\xe6\xc6\x5a\xa1\x1a\x4c\xf7\x45\xaf\xcc\x8a\x1c\x4c\x0c\xc0\x04\xaf\x06\x5b\x1b\x71\x68\x5b\x50\x31\xa6\x3e\xf4\x90\x9b\x68\x4c\xc3\xfc\x8d\x34\xa7\x4a\x31\xa4\x96\x30\xbe\x4b\x38\x87\xcd\x2e\x36\xc2\x9a\xbd\x38\xdc\xde\x1f\x67\xe0\xc2\xfe\x78\xfd\x62\x2d\xba\x69\x1b\x27\x5a\xa5\xdb\xba\xea\x1b\xab\xb8\x0a\x9d\xc2\x8d\x60\x98\x1a\xc8\xf9\x3f\xcd\xc0\x6a\x76\x16\xb0\x1c\x2a\x54\xa9\x03\xb6\xd0\xf4\xc6\x30\x51\x2c\x67\xf9\x3e\x9e\x7c\x99\xae\x6a\x22\x71\x1a\x66\x73\x6f\x05\xfb\x57\x8b\xbd\x29\xed\x5f\x6d\x6f\xaf\xaf\x18\x91\x22\x1d\x7b\x0c\x19\x44\x38\x98\x10\x74\x5e\x5c\x61\x64\x80\x0f\xb4\x69\xb0\x5a\x39\x99\xad\xe7\xea\xdb\x32\x37\xaa\x36\xf2\xc2\x3c\xac\x2b\x1c\x79\xdc\xad\x40\xc6\x93\xae\x50\xd9\xfe\x08\x3e\x99\xe1\x6b\x33\x7c\x8d\xcc\xf0\x63\x1d\x9b\xa9\x51\x05\x17\x6d\x57\xf0\x20\xce\x73\xf4\xa6\xd6\x14\x0c\xa8\x80\x82\x8a\xaa\x54\xe6\xb6\x55\x98\xdf\xa9\x85\x03\x7a\x5f\xe4\x55\x51\xe1\x38\x62\x83\x01\xd7\x51\x81\x9c\xaf\x7a\x22\xf1\x7d\x21\x95\xd7\x73\x19\xdc\xb9\x3b\xbe\xb9\x79\x29\xc3\x6c\x67\xca\x8a\xb4\xd7\x76\xc7\xeb\xab\x4b\x45\x86\xa5\xcf\x52\xe1\xfd\x84\xab\x41\x6b\xd0\x51\x41\x13\xb5\x34\x2d\x12\xea\xd8\x25\xf6\x11\x38\x10\xd3\xbc\xc0\x8e\x02\x81\xd1\xf0\x4d\x1d\x5b\x1a\x18\xb6\x4d\x0d\x3b\x2a\x57\x71\x61\xe9\x39\x7d\x5b\xaa\x51\x1c\x7b\x19\x66\x01\x64\x10\x32\x8d\xb1\x42\xd5\x42\x6a\xa8\x1a\x8e\xd4\x0a\x83\xc4\xd0\xd4\x99\x07\xd5\x29\x56\x4c\xd9\x24\x12\x8f\x77\x7d\xc2\xef\xd7\xf0\x3b\x1e\xe0\xa2\x9c\x51\xfc\x09\xec\x6f\x77\x73\x3b\x5f\x10\xfc\x39\x70\x04\x25\x5d\xeb\xa7\x81\x42\x25\x7a\x79\x96\x67\x96\x61\xfa\x4e\x8d\x75\x0c\xa9\x40\x69\x77\x22\x58\xd1\x4a\x68\x8d\xd8\x42\x8f\xc6\x96\xe5\x5b\x7e\xd2\x4a\x75\x6e\x19\x39\xfb\x2e\x51\xed\xb0\x71\x2d\xdb\x2e\x31\x0c\x61\x10\x34\xaa\x33\xb5\xd2\xb5\xc0\x52\xd1\xa3\x4e\x9a\x94\xae\xa6\x3e\xda\x5e\xa1\x9c\xaf\x6a\x62\xf0\x91\x22\xe5\xf5\xfe\x4a\x56\x66\x34\x56\x57\x4c\xda\x3f\xee\xc9\xf6\xd4\xa9\x76\xf7\x2b\xbe\x4c\xed\x71\x7d\x58\xdf\x1f\x6f\x8e\xab\xb3\xa2\xb8\x93\xf3\xc8\xab\xe2\x96\xda\xd6\x08\x14\x35\xa7\x4f\xf2\xdc\xb4\x3d\x37\x1f\x21\xcf\x1a\x3f\x36\xad\x22\x8b\x68\x00\xec\xa1\xc2\x31\xf6\x74\x91\x45\x51\x16\x32\x9a\xd1\x36\xc3\xda\xcb\xcc\xc0\xf1\x7d\x8a\x45\x14\x35\x21\xb0\xb0\x2a\x18\x05\x7a\x22\x94\x45\x0d\x6a\x4e\x6a\x78\x1e\x8f\x67\x3f\xa5\x8a\x29\xdb\x4f\xb8\xee\x36\xb2\xb4\xb9\x3f\x68\x64\xf6\x59\x66\x79\xf8\x84\xeb\x2b\xde\x01\x78\xc3\x71\x15\x67\x5c\xf7\x47\xf2\x88\xab\x62\x86\x29\x0e\x34\xc3\x91\xba\x2e\x98\xe0\x62\x8d\xb5\x05\xe3\x30\x38\xae\x1f\xb4\xd8\x0b\x0c\xbb\x32\xf6\x83\x90\x96\x63\x4a\x03\xb0\x1f\x18\x66\x79\x6c\xae\x58\x5c\xb5\x19\x63\x23\xc3\xa1\xad\x70\xd0\x0b\x03\xd4\x2c\x65\x68\x96\xd1\x58\x80\x93\x80\x5a\x50\x0a\x16\xd6\x54\xa5\xd1\x89\x4c\xad\x5f\xfb\x49\xb8\xe8\xbe\xea\x14\x28\xa5\x6c\x93\x97\x44\x27\x44\x7a\xb3\x9f\x31\xbb\x9f\x31\x56\x04\x71\x3f\xbb\xba\xfb\xfb\xdd\xfd\x71\x23\x3e\xee\xb4\x0b\x8a\x00\xc7\x17\x42\x4d\x4b\xdf\x52\x6d\x27\xcc\xba\x26\x6f\xea\xa2\xd4\x02\xb0\x2d\xb3\xf0\xc3\xb2\xca\xd2\x78\x65\xe5\xe9\x89\xa4\xa3\x13\xb8\xa6\xdb\x43\x19\xba\x74\x52\x67\xeb\xb0\x10\x22\xa6\x16\x4c\x6b\x1b\x03\xd3\xb2\x98\x4a\x8c\x84\xcc\x11\x08\x84\x1e\xf2\xb5\xc3\x67\x7c\x46\xb9\x20\x12\xd1\xc9\xaf\xc9\x9b\xa5\xee\x8f\xd7\xf0\x43\x30\x9b\x13\x5e\x28\x82\x78\x24\xca\xe8\xbb\x81\x17\xbd\xd3\xbe\x1f\x4d\xb1\xf5\xdd\xd0\x8f\xbc\x22\x1d\x13\x20\x52\x6c\x97\x81\x1d\x7e\x17\xfe\x00\xa4\xa5\x64\x4e\x1b\x3d\xf8\xef\x71\x07\x92\x9c\x62\x85\xca\x2e\x31\x08\x01\xee\xab\x6e\x97\x60\x31\xed\x78\x25\xf3\x3e\xf3\x57\xdb\x5b\x1e\x3f\xb2\xbd\xd3\x76\xe7\xf3\xf1\x7a\xb3\xdb\x48\x9b\x9d\x42\x51\xcd\x62\x0f\x07\xac\xdb\xa6\x1b\x20\x4f\x06\x6c\xb0\xe0\x8b\xd7\x99\x75\x41\x53\x7d\x4a\x31\x85\x0c\x9a\x10\xfd\xd9\xa6\x01\x27\xcc\x58\x2c\x18\x2a\xaa\x81\x60\x89\x91\x3e\xc6\x61\x1a\x04\x5e\x64\x54\x5a\x5d\x15\x9d\x47\x2b\xd3\x2c\xf4\x4a\xcb\xd5\xc6\xd6\x3b\x23\xd7\x2b\x93\xef\x7d\x10\x2b\x95\xdc\x72\x9f\xe6\xb7\x8f\xdc\x15\x17\xd6\xfd\x68\x9c\x2b\xdf\x8b\xbc\xd8\xe5\x67\xef\xff\x13\xfe\x52\x69\x17\xbe\x13\x9e\x88\x53\xf8\x4e\x30\x85\x3f\x88\x9a\xc5\xf7\xb3\xa4\x51\x0e\xc9\x8b\xd9\x67\x79\xcd\x07\x5a\x77\xe4\xb8\x91\x67\x8b\x62\x43\xa4\x31\x4b\xa7\x24\xb0\x81\x41\x19\x84\xfa\x54\x56\xb6\x60\x9a\x71\x27\x58\x81\xad\x7b\x3d\x44\x41\x6c\x20\xcb\x54\x6a\x4d\x23\xb7\xeb\x66\x78\xe7\xf6\xa7\xf2\x71\xb5\xa5\xf5\x7d\x0a\x79\x79\xa1\x8c\xc1\xdc\xce\xd0\xfd\x4c\x31\x82\xca\x1b\xd7\x63\xab\x4a\x3e\x5f\xea\xca\xb5\x8b\xd0\x0e\xcf\xba\xc9\x55\x5c\xd9\x20\x5f\x11\x6d\xd6\xb1\x6b\xb6\x51\x84\x3b\x76\x01\x2f\xa5\x0b\x06\xfb\x57\x6b\x71\x75\xb3\x5f\x44\xc7\xf1\xe2\xfe\x08\x83\xc5\x4a\x66\xc9\x9a\x85\x03\x45\x3b\x86\x98\x62\x5d\xd4\x63\x16\x64\xb4\xa2\x59\x2e\xab\x18\x4c\x1d\x6a\x35\x83\x21\x11\x3c\xc8\xa6\x96\xa1\x85\xda\x89\xc4\x0d\xc4\x50\x30\x5a\x52\x0a\x09\xc5\x90\xb2\x65\x2e\xc4\x5c\xfe\x42\xfb\xd7\xe4\x8a\xaf\xb0\xfe\xac\x75\xec\xfe\x14\x3e\xca\x18\x38\x91\x1f\x5b\xfc\xfc\xb6\xfd\x7e\xe4\xa4\xcc\x49\x43\x27\xc2\xc1\x9e\x2f\xde\x8f\xc1\x54\x00\xe3\xd4\xc9\x8d\xe4\x13\xca\x47\x80\x25\x6d\x77\x77\xbd\xd5\x76\x17\xab\x9b\xb9\xbd\x72\x5f\x61\xb5\xbd\xdd\xc9\xde\x64\x63\x87\x63\x01\x0d\xb8\x40\x03\x0c\x1a\x64\x58\x14\x49\x02\x04\x92\x02\xf2\x55\xa1\xaa\x25\x63\x6f\x73\xa3\x2e\x93\x31\x28\x7c\xcf\xe7\xfb\x6b\xce\xf0\x95\x4a\x5e\xfc\xfe\x4b\xf2\xea\x43\x3e\x88\x5f\x2a\x4f\xa9\x3c\x2f\xf6\x62\xd3\x9b\xbf\x86\x78\xf2\x1e\xcb\xb6\x80\xc6\x9f\x94\x2d\xd5\x4e\x1e\x38\x21\xf6\x73\x7b\x0f\xb1\xfa\x0c\x26\x40\xfa\x53\xa9\xa8\xb2\xc7\x47\xd6\xa5\x17\x1b\xe5\xf5\xf2\x6d\xce\x65\xad\x3e\xf8\x36\x6f\xb6\xfb\x2d\xaf\x85\x9d\xa2\x4e\x5d\x97\x87\x0d\x26\x5d\x3b\x82\xda\x41\xa0\x62\x7e\x22\xfc\x43\xb4\x40\x2f\x1b\x9a\x87\xd8\xa5\x18\x32\x81\x78\x69\x9a\x97\x82\xbf\x8a\x0d\x0c\x8a\xa0\x88\x22\x2f\xd1\x4a\xb5\x2f\x8b\xd1\xa7\x75\xc7\x0a\x0a\xba\x8d\x99\xb9\xf8\x3b\x33\x2e\xf1\x59\x6e\x3c\x49\xe5\x6f\x60\x91\x1b\x5f\xc0\xed\xfa\x63\xe4\xe2\x59\x2a\x07\xfe\x7c\x0e\x8b\xef\x45\xd4\x1e\xed\x4f\x31\x95\x6a\x3b\xf7\x9c\xa0\x9d\xcf\x3e\x3a\x9f\xa0\x6d\xe9\x1f\xe3\x0d\x30\x9e\x0a\xc5\x92\x4d\xc2\xe6\x2f\x8a\x70\xcc\x2e\x0e\xe2\xac\x70\xc9\x85\x62\xf9\x18\x63\x85\x03\xf6\x5a\x65\x54\xe5\x00\xa6\x23\xe4\xe8\x62\x31\x8e\xb5\xd8\xbc\xf3\xd3\x59\x7a\x79\x5c\x2e\x2c\x70\x3c\x22\x91\x6b\xf2\x17\x8f\xf4\x5f\x7c\x0c\x71\x69\x22\x0a\xf3\xfc\xd8\x4d\xd2\x4f\xa1\xdb\xf3\x8b\x54\x72\x9c\xdc\x73\x83\x87\xf2\x93\xa2\x04\xe2\xe6\xbe\x13\xf0\xbe\x43\x57\x99\xfd\x73\x8d\x7f\x87\xd2\x9a\x9b\xbd\xfb\x57\x17\xfb\xf7\xa3\x04\x9b\x3b\xe9\x6e\xf7\x66\x7f\xb8\xbe\xda\xc1\xb3\x4e\x59\x25\x9a\x02\x1b\x07\xcc\x5c\x68\x2d\x1a\xc5\x69\xd7\xe6\x46\xc8\x1e\x6c\xb1\xa0\x05\x13\xd2\x77\x46\xe8\x7a\x51\xe0\x7b\xe1\xaa\xa0\xd8\x78\x19\x36\x98\xc6\x45\x04\x16\x8d\xdb\x34\xed\x74\xb5\x60\x05\xcb\x7d\x2f\xa7\x93\xe7\x44\xa1\xe7\x79\xe1\xe3\x9e\xe7\xae\x92\x9d\xdb\xc0\x5f\x3d\xda\x65\x8f\xad\xe0\xc7\xe1\x98\xf9\x5e\xe0\x86\xa1\xe7\x07\x6e\x04\xda\x0f\x45\x58\x6a\x9d\xdc\x75\xbc\x8a\x9f\xd1\xfd\xe1\xd8\x03\x09\x4e\x85\x12\xcb\x06\xdf\x91\x41\x12\xf9\xfa\xb7\xc7\xcd\xed\xfd\x71\x2d\x89\x97\xbf\x80\xed\xed\x6e\x56\x77\xaf\xd7\x17\xd2\xdd\xee\xe2\x20\xee\x7e\x07\x87\xb5\xb2\x53\x62\x0c\x28\x8d\x62\xb5\xa3\x9d\xa5\xd3\x29\x64\x46\x01\xa4\x06\xa7\xc5\x12\xdd\x8e\x62\x00\x29\x2d\xa9\x10\x97\x14\x12\xb1\x61\x58\x65\xb1\x5a\x6a\xa6\x0f\x8c\x21\xa9\x6d\x53\x2f\xb5\x1a\x74\x81\xb0\x92\x41\x86\x3e\xeb\xdb\x13\x29\xf9\x1e\x82\x33\x3e\xe3\x99\x97\xf7\x1f\xeb\xe1\x33\x7e\x33\xbf\xfe\x04\x82\xa3\xe7\x26\x5e\x62\x7a\x5e\xec\xa6\xe1\x13\xb2\x2d\xfd\x93\xd8\x4a\xad\x93\xf8\x6e\x80\xc3\x7c\x09\xa7\xe1\x87\xe3\x3e\xdb\x39\xb9\x12\xc8\x2a\x97\x4b\x37\xda\xb2\x1f\xd1\x51\xe1\xd2\xf0\xfe\xc8\xfd\x86\xfb\x1d\xec\xa5\xfd\xe2\xdf\xc0\xd5\xab\x7f\x08\x4a\xd0\x60\xd2\xd7\xc3\xd0\x32\x07\x6d\x2c\x32\x9f\x46\x18\x62\xaf\x05\xe0\x0a\x21\x9d\x18\x13\x13\x33\xb2\xa6\x18\x2c\x60\x50\x89\xcc\x1c\x83\x24\xa6\x65\xdf\x7a\x83\x41\xa9\xa1\xe7\x4c\x83\x81\x5a\xa5\xae\xc6\x54\xd5\xd1\xa4\xc6\xac\x0b\x44\x8e\x4b\x7f\x96\xd5\x87\x8f\xf8\xf8\x43\x71\xeb\xbd\x20\x70\x22\xd3\x0b\x42\x2f\xcc\x7e\x14\x9e\xbc\x41\xba\x1e\x76\x6e\xe1\xb8\xde\xf4\x03\xb1\x9e\xf1\x2e\x4f\x89\x62\xcb\x36\x79\x41\xfe\x82\x7f\xe1\xb2\xc4\xad\x5a\xe9\xcd\xfe\xf6\x38\x5b\xb5\xf7\x47\x58\x3c\xde\xc3\xed\xe6\x42\x79\xa6\x6a\xae\x0f\xb7\xab\x28\xc2\x2a\x4f\x8b\x2c\xc5\x8a\x55\x85\xce\x4a\x73\x28\x84\x34\xcd\x02\xd4\x29\xc4\x6d\x9c\x19\x14\x13\x1f\x3b\x6c\xd3\xd8\xcf\xc6\x61\x15\xa9\xec\x61\x44\xcb\x82\x52\xa8\xa9\x11\xb1\x22\x51\xb1\x63\x0c\x55\x66\xe4\x26\x7b\x88\x6b\x35\x2f\x92\xc2\x8b\x2d\x77\x96\x70\x33\x6e\xb1\x1c\x9e\x6d\x20\xfd\xfd\x97\xfe\x19\x2c\xa5\x85\xd5\x5f\xc4\x55\x89\xb9\x2c\x9c\xbc\xcf\xa1\x6c\xf2\x77\xf5\x97\x11\x97\x02\x37\xf7\x5c\x1f\x83\xcf\xe3\xaf\xb9\x99\xef\xfa\x53\xfa\x19\x2a\x08\xd7\x9f\xb9\xa2\xca\x3e\x6f\xa7\xb2\x24\x28\x9b\x57\xdc\x27\x5b\x6d\x5f\xee\xf6\xd7\x5c\x70\xbf\xbe\xd1\x60\x7f\x7f\xb1\xbd\xbb\xdd\x5d\x6c\x64\xe5\xd5\x4e\x51\xfb\xc9\xb4\x7c\x06\x7a\x03\x14\x34\x4c\x31\x1b\x70\xa0\x3d\x30\x20\x40\x8b\x1c\x4b\xec\x92\xc8\x43\x73\x00\x62\x96\x4c\x17\x1c\x30\x56\xb9\xa6\x9d\x48\x4f\xeb\x13\xa9\xfb\x5e\x6d\xcd\x38\x89\x52\xec\x83\x06\xf2\x82\x82\xa3\x86\xa5\xaa\x73\xfb\x6e\xc6\x67\xe0\x6d\xf5\xee\xa9\xa5\xfe\x40\xbc\x78\x0f\x9e\x72\x7b\x54\x06\xce\xb2\xe0\xc7\x61\x09\x05\x38\x41\xe0\x26\xbe\xa9\x6b\x52\xcb\x99\x86\xc6\x9f\x42\x9a\x69\xa9\xe3\xf9\x99\x49\xb9\x1e\xf5\x4f\xb5\x9c\xae\x74\xf2\x0d\x79\x72\x69\x1f\xbb\x63\x84\xca\x14\x9d\xb4\xc8\xa6\xd2\x12\x2c\xa0\xc3\x68\x96\x2a\x14\x79\x92\x14\x71\xdf\x4f\xcb\x5a\x41\xa4\x39\x8d\x8a\x21\x05\xbc\xd7\x7e\xff\x8a\xac\xdf\xbc\xde\x9e\xfb\x5b\xd6\x8c\x08\xa1\x21\xc4\x90\x75\x38\x60\x3e\xf5\x96\xe0\x83\x06\x09\xd8\x48\x68\xa1\x83\x0e\x5a\x57\x67\x55\x82\x1d\x36\x98\xa0\xbf\x7c\x3f\x33\xbc\x41\x6e\xf8\x77\xff\xf3\x0f\xbf\x7b\xf8\x04\xbe\x32\xb8\x51\xea\xa4\xe6\x7c\xce\xde\xd5\x5f\x28\x4c\x1a\xfc\xd4\xf1\x1c\x1c\xbc\xc4\xf1\x9c\xef\xc6\x2f\x94\x0d\xdc\xdf\xb7\xa5\x9c\xcf\x8e\x55\x34\x45\xe6\x75\xa7\xbc\x5a\xbf\x79\x71\xdc\x4b\x7b\xc5\xa6\xe8\xb8\x11\x96\xe0\x40\xa9\x3f\xf8\x43\x45\x1f\x7c\x26\xe5\xa5\x66\xa2\xd7\xb7\x5d\xa5\x0a\x6e\x0d\x49\xc8\xdc\x92\xcb\x81\x54\x09\x38\xac\xb3\xbf\xf1\x09\xbc\xe7\xa4\x7d\x1e\xb6\x5c\x06\x4e\xe8\x47\xc1\xe2\x6f\x7c\xae\x20\xf4\xb8\x13\x82\x3d\xf7\x5a\xe7\xfa\x74\x4e\x85\x42\x64\x8b\xcf\x6c\x5d\x3e\x59\xb6\x13\xd6\x47\x76\x71\xbf\xdb\xac\x38\x02\xb7\x0a\xa1\x68\x14\x68\x60\x0e\xb5\x51\x1a\xb1\xe0\x9a\x0f\x15\xba\x40\x20\xcc\x93\x4a\xeb\x5a\xb0\x1b\x28\x80\x52\x6c\xb0\x34\xd2\xa2\xc6\x3e\x8d\x62\x22\x72\xd8\x81\x9c\x12\x89\xfc\x9c\xaf\x93\x7f\x26\xe0\xf3\xa5\x9c\x1d\xa9\x80\x3b\x91\xec\xcb\x25\x42\xea\x7b\x91\x1f\x49\x11\xf7\x10\xdf\xfa\x5f\x44\x60\x55\xf0\x14\x64\x45\x8a\x53\xa8\x44\x5c\xc6\xaa\xe4\xaf\x78\x9c\xcc\x59\x7e\xc9\x37\x77\xb7\xc7\xf9\xc3\xe2\xf2\x6b\x77\x5c\xcd\x48\xf0\xf9\x10\x4b\x0c\xe1\x6b\xf1\x78\x71\x2d\xbd\x9f\xeb\xb5\x0a\x62\xec\xcb\x3a\x2b\x8a\x2c\xae\x32\xbb\x54\x8d\x26\x13\x46\xbf\xc5\xc2\x05\x0a\xb6\x57\xe4\x6a\xd9\x36\x5d\x51\x64\x05\x55\x4b\xb5\x47\xbf\x4c\x5d\x37\x8a\x12\x7f\x15\x33\x36\xa5\x98\xb8\x60\x0b\x06\x2d\x28\x98\xba\x9f\x51\x36\xa6\x65\x96\x86\xef\x82\xcc\xb7\x92\x38\x8f\xa2\x54\xef\xc0\xa1\x53\xe2\x98\xa6\x69\x98\xa6\xbd\xf8\xa2\xc6\x29\x52\x6c\x3e\xd7\xf7\x1b\x1e\xe5\x24\xac\xd9\x85\x32\x9f\x40\x93\xee\x5e\x6d\x3f\x14\xb5\xdb\x5b\x41\x33\x59\xc9\x4c\x29\x9e\x66\x9e\xa5\x82\xe3\x32\x1c\x73\x0c\xb0\x09\x33\xaf\x02\x23\x95\x06\xb4\xa6\xd9\x2d\xcf\x18\x98\x30\xb7\xfc\x0c\x23\xad\xd0\xde\x25\x95\x5a\xe5\x79\xe9\xe4\xae\xe7\x91\x15\xa9\x4f\xa9\x52\xc9\x06\xef\x0f\xff\x6b\xf2\x37\x73\x0b\xd9\xcb\xdb\x47\xe6\xdc\xdf\x31\xe1\x57\xf0\xd8\x3b\xce\x05\xd3\x3d\x57\x06\xda\xe6\x7a\x7d\xa9\x5c\x83\xac\xbc\xb8\xba\x17\x5f\x8b\x0b\xf3\x76\xef\x77\x64\xa9\xbc\x2c\x3e\x91\xa2\xcc\x92\xac\x51\xc7\xce\x8c\x31\x8a\xc2\x02\x98\xa1\x16\x4c\xcb\x1b\x55\x2d\x0c\xb0\xd2\x5a\x77\x1e\xfc\x3c\x0e\xbc\xc2\x0a\x63\x47\xb7\xc4\xbe\xf0\x6d\xcb\x75\x53\x3f\xf1\xf3\xc4\x0f\x63\xcf\x8b\x40\x05\x75\xca\xa7\x7a\x6c\x21\x1c\xfa\x52\xcb\x0a\x4f\x4b\x2b\x15\xeb\xa2\xc1\xa2\x8c\x0c\x31\xd2\x3c\x34\x58\x81\xb5\x01\x65\x39\xc4\x99\xe5\x1a\x86\xae\x11\x81\xc4\xa7\x44\xa9\x64\x8d\x7c\x4b\x7e\xb3\xd0\x75\xf3\x8c\xae\x59\xec\x8a\x37\x17\xe2\xfe\xfe\x67\x20\xed\xb7\x17\x87\x4b\xf1\xb8\x91\xbf\x01\xb2\xbd\x7d\x31\x93\x26\x3d\xa3\x25\xc8\x82\xb1\xae\xb3\x34\xa9\x69\x9a\x9c\x08\x86\xb4\xa4\x4d\x12\x8c\x14\x4b\x0a\x0e\x2d\x99\x66\xab\x0e\x85\x10\xb4\x6e\xd0\x02\x2c\x8b\xc0\xb6\xfc\x20\x89\x92\xb0\x4a\xa3\x30\x71\xbd\x12\xd4\x0e\xf5\x87\x5e\x30\xb0\x0d\x53\xb0\xc0\x52\x2b\x70\xcc\x13\xa1\xa1\x6a\x05\x10\x62\x83\x41\x1b\xda\xcc\x33\x0c\xd3\xe0\xfa\x23\x3b\xe5\x8a\x27\xe5\x44\x25\xaf\x1f\x47\x5a\xc8\xf6\xfa\xea\x92\x9b\x8b\xe4\xee\x1c\x51\x00\x97\xbc\x4b\xfe\xc5\xdd\x9b\x9b\x97\x2b\x61\x15\x68\x86\x10\x61\x86\x83\x1a\x59\x45\x90\x63\x27\x10\x88\xc0\x87\xf6\xbb\xb1\x70\xcc\xc0\x0c\x35\x13\xdb\xd6\xf5\x1d\x47\x30\x3a\xb0\x34\xa3\x41\x3a\x8e\x10\x8c\xe0\xc2\x80\x1e\xb6\x93\x27\x68\xe5\x89\xf4\x1d\x34\x91\x11\x63\xbd\xb4\x4d\x76\x4a\x95\x42\x36\xb9\x7d\x70\x98\x39\xf9\x7a\x2f\x3c\x35\x11\x51\xda\x6f\x6e\x77\x7c\xbf\x8e\xeb\x2b\xe9\xc5\xd5\x7b\xc6\x69\x20\xac\x2f\x2f\x78\x37\xc2\xb5\x52\xf8\x49\x62\x61\x50\x75\x75\x51\x14\xea\xe4\xd2\xbe\x04\x4a\x4b\x5a\xa4\x14\x4b\xb5\xc2\xb0\x4a\x3d\x37\x08\x81\x3e\xa4\x06\x2d\x98\x11\xc5\x99\xef\x9c\x48\x11\x85\xa9\x21\x04\xb4\xa4\x0c\x3c\xcc\x29\xf3\x1d\x75\xca\x3c\x4f\x73\x4c\xc3\xb0\xa5\x1a\xa3\x49\x2f\x30\x61\x10\x57\x82\x0f\xdd\xac\xbf\x24\x8e\xef\x70\xb6\xb7\x7f\x4d\x7e\x43\xfe\xd9\x47\xb6\xe2\x87\x02\xe0\x8d\x38\xab\xb7\xcd\xed\xf1\x4c\x83\xac\x7c\x20\x0f\x9e\x13\x31\xf8\x5e\xe8\xc6\x86\xeb\x45\x6e\x9c\xfb\x69\xae\x96\xdd\x4c\x50\x9a\xb2\xa0\xc0\x8c\xf6\x65\xc7\x2a\x5a\x26\x34\x2d\x58\x87\x7e\x11\xcf\x14\xa5\xfe\x43\xb6\x50\x24\xf5\x4e\x32\x1b\x90\xbd\x13\x7b\x8e\xff\x36\xcf\x02\x37\x89\x66\x02\xf5\x0c\xea\xe7\x14\x32\x3a\x39\x9e\x66\xcd\x14\xda\x52\xf4\x19\x12\x9f\x68\x6c\x78\xbc\xc9\x3f\x26\x7f\x43\x1c\xf2\xc1\x6e\x54\xcf\x23\x77\xfe\xa3\xe9\x95\xed\x70\x59\xb1\x22\x0c\x4c\x5d\x37\xe7\x63\xfc\xd1\x54\xcb\xc4\x0d\x23\x67\x06\xa3\x5b\xd6\x0c\xe5\xad\xf7\x1f\x4f\x38\x90\xec\x14\x2a\xb9\x34\x70\x3b\x4f\xd9\xbf\xde\x2b\xb3\x23\x3a\x7f\x0b\xb3\x02\x95\xbf\x81\xb3\xb1\x4f\xf8\x40\x18\x59\xbf\x11\x8f\x2f\x94\x3c\x0d\x03\x9d\x1a\x18\x63\x8b\x23\xd6\x79\x4c\x93\x34\xd6\x60\x34\x63\x0b\xbb\xba\x1e\x81\xc4\x45\x20\xd8\x51\x53\x05\xb4\x0b\x30\x43\x1f\x2c\x50\x13\xa8\x6b\x66\x32\xb5\x32\x34\x4f\x35\xd4\xa9\xc7\xb1\x69\x20\x82\x68\x80\xc4\x42\x9f\x88\x1c\x97\xc7\x76\xf6\xb1\x3f\xf2\x43\x71\x1b\x96\x5e\x69\xde\x85\x5d\xfe\x10\x3c\xa5\xc2\x2e\x42\x3b\xc2\x96\x6b\xf9\x07\xff\x47\x62\x4d\xce\x78\x77\x72\xc1\xdb\xce\x1f\xbe\xdc\x6e\x7e\x28\x7f\x65\x33\x72\x9d\x68\x6e\x2a\x81\x69\xe8\xa6\x61\x18\x26\x90\x1f\x44\x4a\xe7\x86\xa1\x3b\x1f\x73\xe3\x32\x0c\xf3\xc1\xfa\x91\xd4\xac\x88\x77\x4a\x95\x4c\xa6\x44\x22\x1a\x79\xcd\x77\xc4\x59\xc6\xf9\x8e\x8f\x53\x14\xe6\x56\xbf\xc4\x14\x9c\xe7\x77\xef\x14\x41\x3c\x5e\xef\x2e\x05\x65\xf6\x6e\x2a\x15\x4d\xd4\xa8\xe0\x20\x31\x3b\xd3\x0b\xdd\x13\x31\xdd\x32\xe9\xbc\x2a\xec\x2a\x7b\x65\x15\x59\x98\x46\x6f\x87\xc4\xce\x33\x43\x0a\x8b\x40\xcf\xf5\xb7\xb4\x70\x02\xc7\x4c\x80\x79\xba\x19\xe4\x61\xa1\x31\xbf\x2e\xc3\xac\xee\x6c\xc1\x04\x6a\xf7\x49\x38\x35\x89\x03\x16\xf0\xf8\x0f\x99\xe3\xd8\x9e\xed\xd7\x35\xd7\xb4\xbf\xf9\xb0\xb5\x48\x3f\x0a\x67\xa5\xf5\x7c\xde\xf9\xe8\x47\x5e\x8c\xfd\x8f\x21\xa0\x74\x72\xdf\x0d\xb0\x71\x0b\xcf\x0d\xdc\x1f\x4f\x8d\x7c\xe6\xf7\xb2\x86\xce\xcf\xf9\xca\x05\x7f\xf3\xe5\x16\xf4\x0d\xfc\xa8\xba\xe8\xe7\x76\x14\x39\x5e\x18\xcc\x8d\x68\x6e\x47\xe9\x8f\x21\xae\xe7\xad\x69\x16\x34\xe6\x92\xf9\xc7\xd3\x07\x24\x20\x86\x92\x48\x8c\xb0\x59\xcf\x91\xd9\x2f\x57\x60\x7f\x4f\x66\xc1\x49\x94\x24\xc0\x6a\xea\x63\x55\xb5\xd1\x4c\x3c\xa8\x3c\xc3\x8d\x44\xad\x4e\x81\x08\x51\xe6\x4e\x6d\xec\x09\xaa\x15\x3f\x64\x44\x3c\xc3\x19\x78\x9d\xff\xc5\x47\x3e\xcb\xc7\x70\xe5\xd6\xf3\x13\x2f\x71\xbd\x20\x76\x53\xe8\x3e\x5b\xc8\xaa\x9f\xbd\x63\x0f\x87\xf9\x12\xbc\x2b\xbe\x58\xa6\x6c\xf0\xba\xd1\xbf\xef\xbb\xfe\xa8\xfc\x55\xf9\x4c\xce\x1b\xa6\xa5\x1b\x86\xe0\x7f\x16\x0b\xc9\x9b\x2b\x68\x4e\x6b\x98\xa6\xa1\x59\xc6\x3b\xf3\x53\x44\xb8\xcd\x40\x4e\x91\x12\xca\x1a\xa1\xe4\xd7\xbc\x4f\x61\x36\x65\x6f\x44\x76\x31\x33\xe2\xbd\x7d\x29\xae\xb6\x7b\x6d\xb7\x96\x6f\xb6\x77\x5b\x6d\x37\xab\xa2\xdd\x95\x7c\x73\x71\xfd\xde\x90\x84\xd1\xa2\x25\xb5\x65\xc3\x2f\x3c\x17\xf3\xa6\x2d\xf3\xbc\xa4\x58\x62\xc1\xc0\x02\xaf\x4f\xf8\xf8\x92\x2b\xa8\xd6\x40\xc1\x88\x73\x5a\x61\x94\xe7\xae\x13\xf8\xbd\xcc\x30\x9d\x72\x2c\x30\x12\x72\xc1\x82\xf2\xad\x9a\x44\x56\x9b\x85\x61\x6a\x43\x35\xdb\xe7\x1a\x2d\xf4\x82\x32\xec\x58\xc1\xa6\xde\xa3\xb6\x61\xea\x16\x59\x71\xdc\x17\xb9\x6e\x90\x7f\xcc\xa3\xd8\x9f\x6a\xef\x0b\xa8\x1f\xb9\xcb\xbe\xbf\xfa\x0c\xfe\x8f\x84\xcf\xc6\x43\xe4\xc5\xea\xe7\xe9\x18\x62\x4e\x47\xd9\xbb\x5e\xe2\xf9\x4e\x46\xc1\x4c\x72\x56\x3e\xd1\xf2\xd0\x72\x36\x48\x15\x1f\x43\xf8\xae\xfd\x94\x12\xe6\x3a\x41\xee\x84\x3e\xc5\xfe\x39\x39\x52\xf3\x8c\x09\x26\x54\xe4\x4c\x5f\x27\xd7\xe4\x1f\x91\xdf\x91\xff\x3f\xb7\x1c\x9e\x10\xdf\x7c\x0f\x8d\xef\xd7\xc4\xba\x79\xb9\x7f\xde\x9e\x3e\x25\x56\x4e\xe2\x33\x05\xd9\xf7\xd6\x5b\x32\xd0\x45\x01\xd8\xaa\xa9\x2f\xf6\x01\xe6\x1f\x91\x6c\x5b\x4f\x24\xc5\x9f\x21\x5b\x53\xdd\x28\xf4\xdc\xb0\xd1\x2c\xde\x78\xdf\x16\x5f\xa0\x5b\x20\xfd\x29\x51\x54\x59\x27\x3b\x62\xcc\x5f\xf7\xab\xdd\x7b\x2b\x76\x7d\x23\xdd\x6d\x6f\x8f\x77\xdb\x3b\xe9\xb0\x3e\x6c\x76\x57\xd2\xd5\xee\x4a\xba\x58\x6d\x9f\x6d\xea\xa9\x06\x58\x9e\x88\x8a\x4e\xdd\x8f\x4d\x10\xfb\x53\x05\x71\x90\x4f\x1e\xe4\x43\x49\x85\x60\x4a\xe6\x83\x42\x34\xd5\x51\x98\xc4\x71\x9c\xfa\x76\xda\xf8\x98\xe7\x51\x58\xa9\xa0\xce\x3e\x43\x49\x81\x8c\xac\xa4\xad\x5a\xa8\x58\x44\x9a\x6d\x5b\x96\x4f\x96\x79\x5c\xb6\x52\x49\x05\x79\xc9\x67\x9d\x28\xaf\xf7\x7f\x06\xca\xfe\xfe\xc5\xf1\xd1\xd4\x26\xdb\x8b\xbd\xa4\xec\x77\x82\x78\xbd\xb9\x38\x88\xd7\xbb\xc7\xad\xe1\x95\xca\x49\x32\x35\xad\xa3\x2c\x61\x63\x9f\x63\x1b\xe5\xe0\x80\x66\x53\x6c\x3b\x2a\xb4\x9a\x39\xb4\xac\x52\xeb\x77\x5d\xd5\xd8\xba\x99\x09\x6a\xe1\xd8\x27\x82\x7d\x96\xfa\x40\x07\x4f\x9d\xec\x2a\xeb\xc0\x80\x84\xa9\xb4\x60\x58\xe1\xa8\xd9\x50\x4f\xa3\xe3\xd0\x3a\x75\xdc\x91\x88\xa4\x3a\x65\x8a\x2f\x5b\xe4\x1f\x92\xdf\xcc\xf6\xc2\x8e\xaf\xca\xf2\x07\xd8\xde\x5d\x1f\xd6\x1b\x65\x77\x25\x5d\xce\x56\x82\x72\x1e\x4b\xbe\xbf\x9b\x8d\x82\xab\x4b\x45\xde\x6a\xaf\xef\xde\x88\x1f\x48\x1e\x61\x7f\x24\x50\x7b\x69\x9d\x52\x8c\xdb\xbc\xa4\xe0\x63\x42\x83\x9a\x15\x05\xb8\x89\x6f\x16\x66\x54\x62\x8c\x61\x67\xd9\xba\x15\x98\x9a\x13\x4a\x7d\xdc\x8e\x01\x98\x23\xad\xc2\x66\xa4\xf1\xcc\x42\x3a\xb2\x82\x3a\xa1\x57\x9e\x48\x62\x9b\x86\x69\x19\x79\x0e\xba\x86\x79\xd1\x3b\x7e\x14\x1b\xe0\x59\x6e\x16\x3a\x6e\x06\x6e\x04\x6a\x1d\xe1\xc8\xed\x9e\xfa\x94\x28\xa6\xec\x90\x5f\x90\x1d\xf9\xf6\xdc\xb7\x45\xf6\xb3\x77\x2b\x7c\xe0\xdd\xca\xca\x8a\x87\xf2\x2a\xd7\x3f\x83\x7b\x71\xff\xe8\xdd\xae\xa8\x23\x54\x27\xd2\x45\xe8\xc7\x41\x05\x86\xa1\x16\xaa\x96\xd7\x9a\x5a\xaa\x1a\xe8\xe0\x3c\xe4\x59\xa4\x5b\xa1\x3e\xa8\x96\x5b\x7a\x9a\x19\xe4\x2e\xb4\x15\x30\x3a\xf5\x53\x0b\x6a\x09\x71\xd7\xd4\x2c\x2b\x1c\x96\x55\x7a\x96\xa9\x98\xe3\x30\xe5\x2b\x43\xb5\x32\x6c\xc1\x09\xa6\x42\xf3\xc1\xcf\xc6\xa8\x20\x40\xaa\x53\xc2\xc7\xb2\xe6\xd6\xf0\x52\xba\xdb\xbd\x39\x6e\x8f\xbb\x8b\x8d\x78\xbf\xbb\x92\x25\xf1\xd5\x7c\x16\x1e\x03\x24\xf7\xb3\x49\xb6\xe2\xdc\x16\x92\x0c\x1b\xe8\x19\x32\x0a\xa3\x56\xa8\x23\x14\x0d\xaa\x2a\xe8\x90\x37\xd3\xa0\xa6\x43\xdf\xb9\x79\x80\x25\x56\x58\x8d\xc2\xec\xc7\xba\x45\x4e\xc1\x51\xb1\xa6\x6a\xc1\x18\x8e\x54\x2f\x99\x8a\xbd\x1d\xfa\x91\xeb\xc5\x76\x96\xe6\x6d\x5d\xf3\xb9\x04\xa0\x9f\x02\xb9\x5d\x75\x5c\xb7\x1c\x9f\x6a\x55\xd9\x28\x7b\x59\xb9\x50\x44\x69\x7f\xbf\x8c\x0e\xef\x8f\x9b\x27\x41\xb1\x52\xb5\x30\xf1\xa3\x38\xd4\x75\x33\xb3\x0b\xa7\xcb\x3b\xec\x4c\xaf\x76\x72\xc7\x68\xec\xdc\x76\xcc\xba\x6f\xcb\x18\xac\x5c\x0f\x1c\x2f\xa4\x95\xd9\x6a\xda\x43\x61\x88\x8e\x57\xa8\x16\x18\x06\x36\x4c\xef\xf5\x81\x75\x59\x56\x13\x20\xd1\xc9\x53\x22\xd9\x58\x70\xb8\x5d\x3d\x43\x42\x3c\x23\xb1\xe3\x38\xcc\x27\xbe\xca\xc5\xea\xe6\xe5\x4a\x53\x19\x68\x46\x9c\x16\x99\x6e\x3a\x85\xdb\x66\x63\x31\x62\x6a\x41\xe4\x15\x5e\x51\x79\xb9\xef\xd8\x23\x68\x38\x76\x15\xa4\x85\x9e\x04\x61\x46\x07\x13\x98\xae\xbf\xab\xf4\x95\xe5\x15\x1e\x24\x06\xfa\xba\x06\x86\x85\x05\xc5\xb1\x2a\xc7\x65\x1e\xaf\x25\x47\xab\x9e\xec\x67\x79\xb2\x52\xf6\xf7\xc7\xd7\xfb\xfb\x23\x9f\x6b\x29\xca\xe4\xea\x72\x19\x42\xdf\xc8\xe2\xe1\xc5\x6e\x7f\xdc\x5c\xbf\xb8\xba\x24\x37\x3f\x83\x4b\x85\xc7\x34\xad\xac\xd1\x2b\xcc\x2c\x33\xac\xdc\xa3\x34\xc7\x5a\x2d\x98\x5e\x18\x8c\x66\x60\xd1\x82\xb6\x23\xf6\x9d\x4e\x69\x94\xa6\x46\x92\xf8\xae\x91\x99\x66\xa4\x19\x6e\x0a\xba\x8e\x41\xe8\x64\x0c\xf4\x12\x3c\x60\x5a\x8f\x1d\xf8\x4e\x49\x4b\x15\xc7\xba\xc1\x51\x54\xd1\x70\x6d\x96\x87\x51\xb1\xc4\xfd\x74\x27\x47\xd1\x64\x93\xfc\x25\xb9\x25\x64\x27\x4b\x1c\xd1\x47\x3c\x15\xe1\x6a\xc1\xf3\xfa\xaf\x41\xb8\x5a\x30\x5d\x91\xf5\x25\xd9\x5e\xcc\x1f\xf1\xab\xf5\x9b\xd7\xab\xcc\xc6\x2a\x1a\x9c\xb6\x0e\x9b\x94\xb1\xa1\x68\x69\xae\x99\xb6\xa5\x5b\xb4\x85\x9c\x96\x14\x54\xb0\x30\xc7\x5e\x65\x0c\xd2\xb6\x2a\xaa\x24\x0a\xad\x2a\xcc\x75\xdb\xad\xa0\x30\x3b\x6c\xcb\x91\x81\x33\x42\x0a\x3e\x43\x6d\x80\xd1\x19\xe8\xc0\xb0\x3a\x91\x11\x2b\xb1\x43\xab\xf2\x6d\x0d\xfc\xb2\xe3\xf1\x60\xf1\x29\x91\xc3\x55\xb9\xc4\x07\xef\x3e\xf4\x5e\x85\xf5\x61\xcd\x25\xf3\x33\x97\x55\x0e\x9d\x66\xa4\x59\x93\x97\x65\xe9\xfa\x5a\x01\x1d\xea\x0c\x0c\xd4\xf9\x0e\xc5\x5e\x62\x79\x49\xe0\x25\x51\x1c\xf8\x09\x83\x01\x5c\xec\xf5\x52\x45\xdb\x55\x55\xc3\xd0\x75\xf3\xdc\x5f\x9f\x29\xaa\xcc\xc8\x4f\xc9\xab\x45\x37\xfc\x39\x3c\x29\x07\xe1\xee\x78\x39\xeb\xc7\x0f\x4b\x55\x54\x17\x3b\xac\x78\xaf\x7a\xd7\xb6\x41\x66\x94\x4c\xf0\x6b\xf4\x55\x88\xa7\x2a\x89\xa2\x30\x0c\x4b\x2f\xcd\x73\xbf\x4e\xf3\x30\x29\x34\x31\xce\xa8\x7f\x22\x5a\x49\xd5\xa9\x0e\x98\x66\xdb\xa6\xe5\x2c\xf1\x6f\xb9\x9c\xcb\x2a\x91\xf8\xba\x57\xe7\x38\xc5\xeb\xc3\x32\x38\xf0\x72\x6e\x58\x17\x1b\x41\xe1\xf1\x8a\x97\x64\xfb\x52\x72\x2d\x0c\x30\xd1\xa0\x42\x55\xaf\x3a\x30\xc1\x6c\xab\x02\x43\x2b\x71\xec\xdc\x32\x40\x07\x0d\x28\x18\x18\xa1\xd7\x48\x6e\x91\xe9\xb9\xf9\x5d\x5b\x69\x49\x1a\x66\xb5\x6f\x8d\x82\xce\xd0\xc9\xdb\x13\xa9\x9a\xd3\x12\x7f\x97\x9c\x42\x39\x90\x19\xb9\x24\xbf\xe0\x52\x71\x09\xbd\x7a\x29\x2b\xfb\xfb\xc3\xed\x8b\x35\x53\x84\xf7\x9d\x02\xa2\xeb\x41\x9e\x44\x96\xa5\x86\x46\x98\x65\x69\x16\x57\x93\x6b\xd0\x92\x99\x71\x61\xd7\x39\x8c\x55\xe5\xdb\x51\x8f\x2d\x36\x48\x1a\xec\xa4\x11\x73\x6c\x32\xec\x54\x30\x52\x08\xc1\x24\x02\x68\xa7\x4c\xee\xa4\x81\xfc\x25\xef\x4d\x3a\x3c\x92\xf9\x7a\x0f\xfb\x9f\xc0\x7e\x77\x7f\x1e\xae\x5b\xbe\x5f\xf2\x58\x0d\x2b\xe5\xf5\xcd\xcb\x65\xb2\xb9\x44\x28\xa8\x7d\x55\xa1\x9f\xe8\xb6\x18\x53\x0c\xb1\xa2\xa2\xc9\x8c\x90\x4d\x51\x1f\x8f\x60\x63\x88\xe9\x38\xa6\x51\x0c\x6a\x90\x25\x41\x91\x58\x5a\xe0\xf5\x61\x91\x27\xa6\x2b\x12\x3a\x1b\x0e\x94\x45\x4c\x65\x48\xa8\x87\x43\x35\x60\x53\x44\x7e\x5c\x67\xa5\x65\xba\x94\xcb\x99\x58\xa9\x65\x97\x47\x75\x2e\xcd\xef\x82\x8f\xd4\x08\xeb\x9b\x37\x3c\x1e\x0d\x2e\x5e\x2a\xfb\xdd\x7a\x23\x1e\xaf\x37\xbc\xd7\xf0\xfa\x8a\xab\xba\x0b\xa5\xb6\xb3\x20\x8e\x6c\xcb\xc6\x11\x63\x5a\x51\x27\x89\x03\x20\x34\xaa\x19\x78\x15\xd3\x55\x23\xa0\x10\x02\xcd\x33\x5b\x37\x1c\x07\x82\x21\x4b\x53\xa1\x0a\x6c\x74\xd0\xc0\xa8\x85\xc4\x6b\xa3\x14\x2c\xd0\x59\x49\x21\x60\x58\x51\xcd\x75\x7d\xf0\xb2\x72\x32\x2c\x13\x96\x58\x28\xe3\x54\xc8\x8d\xd4\xcd\xad\x55\xda\xaf\x0e\x4f\x03\x49\x64\xe1\xe1\xb3\x68\xd3\x85\x87\x30\x30\xd0\x3a\xd0\x40\x6d\x8b\x99\x39\x01\xe4\x50\x52\xb4\x70\xa0\xa2\x6f\x24\xb6\x31\x15\x74\xcc\x7b\x98\x5d\xf6\x34\xb1\x6a\xbd\x4a\xfd\x14\xc7\x04\x2c\x48\xa8\x4a\x4b\xa6\x85\xcc\x60\x26\xaa\x34\x38\x91\xb2\xc3\x9e\x00\x58\xa7\x48\xae\x56\x0d\x5f\x41\xe1\x31\x6e\x17\x84\xab\x1b\xce\x9f\x3f\x80\xb4\xdf\x5d\x1c\xc4\xe3\x46\xb9\x7a\x75\xb8\x7d\x71\xc5\x56\xba\x09\xc6\x10\xc5\x15\xd6\xb4\xa0\xb6\x1b\x65\x31\xc5\x91\x02\xa3\x05\x35\x74\x0f\x8c\xba\x1c\xa3\x5c\x6d\xeb\x34\xc5\x1e\x83\x1e\x6a\x27\x0c\x8b\x68\x64\x29\x05\x0d\x07\xea\xdb\xce\x70\x22\xed\xd4\x2d\xfd\x40\xa9\xe2\xc9\xc6\x42\x3f\x1f\x03\xba\xd1\x60\x7d\x73\x3f\x97\xfd\xe2\x78\xb1\x94\x7d\xd8\xc8\xca\x15\xd9\xde\x92\x35\x5b\x59\x36\xc4\x60\xd4\x05\xf6\x18\x57\x94\x7a\x61\x54\x27\x8f\xfd\xb7\xd4\xb0\x54\x0f\x02\xd0\x07\xd0\xdd\x42\x03\x15\x48\xdd\x62\xf8\x30\x54\x10\x05\x69\x08\x24\x05\x93\x15\x0c\x7c\x2c\x02\xcd\x09\xc0\xc2\x06\x87\xc9\x5b\xf6\xe3\x4d\x14\x5d\xea\xc8\x6b\xde\xd3\x48\x76\xf7\x7c\xc5\xc7\x3f\xe3\x2d\x86\x91\xdd\xfd\x1f\xf8\x00\xb4\x78\x58\x66\x81\x3d\x4d\xfa\x5c\x02\xc8\x5f\xbc\x37\x9d\x8f\xb2\x61\xe3\x80\x83\x1f\x8f\x61\x94\x81\x07\x06\xa3\x3a\x43\x9d\x09\xb5\x67\x81\x07\xc1\x6c\x99\x15\x55\x1e\xc5\xe3\xa4\xa3\x65\xeb\x66\x25\xb4\x71\x66\x99\x9e\x97\x38\xad\x9b\x35\xf5\x54\x61\x5c\x97\x40\x21\xb6\x0c\xb3\xa6\x7a\xc5\xd0\x9c\x33\x9d\x08\x56\xa9\xef\x27\x91\x60\xc5\x18\x78\x01\x78\x58\x06\x86\xae\x9a\x3a\xe1\x7d\xe4\xbe\x12\x4a\xe3\xb2\x6a\x91\xa4\x08\xf3\x67\x7f\x23\xdc\xbc\x84\xfd\xfd\xfb\xc5\x0e\x94\x73\x10\xee\x4a\xda\xbf\x82\x3b\xe9\xee\xdc\xbc\xa4\xab\xe5\xf5\x6a\x7b\xc3\xe3\x75\x37\x87\xdf\xc3\x41\x7b\x5c\x38\x6f\x73\xaf\x84\x59\x91\xf9\xa5\x96\xa8\x4d\x89\x43\x34\x82\xd6\x94\x51\x9a\x59\x5d\x5b\x14\x25\x16\x38\xba\x50\x40\x3d\x59\x62\x68\x86\x96\x83\x66\xe6\x0f\x23\x16\x58\x06\x0d\x75\xcd\xd4\xa6\x46\x13\x00\x9d\xa8\x6d\xdb\x4e\xed\x99\x1e\xf8\x79\x02\x2a\xd6\x51\xdf\x5b\xa9\x13\x07\xae\x69\xd1\xc4\xf3\x3d\x3f\x4d\x67\x2b\xcb\xcc\x19\x8b\xa8\xc6\x68\x47\x8d\x3c\xcf\xbb\x94\x9a\x75\x10\x83\xa5\x69\xba\x6e\xab\x36\x01\xd2\x9e\x52\x45\x97\xed\x59\x0b\x82\xb4\xbe\x59\xaf\xf8\x1a\x8a\xb7\x4f\x63\x62\x7c\x5d\x45\x71\xff\xe2\x62\x75\x73\xb7\xbb\xe0\xd3\x18\x56\x92\x38\x13\x75\x7b\xbd\xd9\x29\xfa\x34\x14\x68\xd6\xb5\xdd\x83\xaf\xa2\x1f\xa0\x8f\xbd\xe0\xd3\xc0\x49\xdb\x26\x1a\x6a\x1c\x72\x41\x0b\x4b\x0f\x86\x9a\xe2\x30\xf5\x25\xd5\x73\x23\xae\x54\x18\x85\x32\xc0\x0c\x8c\x38\x73\x1d\xad\x62\x79\x01\x5a\x65\xba\x19\x8e\x01\x30\x70\x69\xc1\x80\x98\x35\x53\x0b\x95\x9d\x88\x6e\xa7\x81\xbf\x8c\xa1\xa6\x8a\x21\x1b\x5c\x23\x2c\xe3\x2f\x17\x4b\xbc\xb6\xb8\x27\xb0\x91\xbf\x3e\x07\x92\xcf\x22\x47\xbb\x50\x0c\x03\xc7\x26\x4d\x55\xcb\x8e\x62\x2f\xcf\xc1\x02\x35\x37\xc2\x82\x66\x71\x94\xaa\xb6\x0d\xaa\x21\x34\xa8\x61\x51\x14\x60\xbb\x4e\x91\x4c\xbd\xb5\x22\x82\x6b\x87\x27\x82\x01\xad\xf3\x0c\x0b\xcf\x13\x4a\x1e\x17\xa8\x2b\x05\x1f\xcf\xfb\x7a\x59\x1b\x05\x9e\xf5\x50\x49\x4f\x63\xae\x1f\xc6\xd0\x2b\x85\xe7\x45\x6e\x8c\xe6\x63\x28\xbd\x50\x7a\x6e\xec\x26\xef\xfa\x2f\x44\xd4\xe7\x4e\xe2\xba\x7e\xc8\xe3\xea\x07\x77\xbe\xff\x2e\xfe\x34\xba\x9e\x10\x41\x4a\x57\xbd\x92\x9f\xfb\xce\x3e\xe8\x45\x51\xf2\xd0\x4e\xfc\x34\x0c\xec\xc4\xcf\xa4\xd4\xce\x13\x3b\xc1\xd1\xc9\x13\x27\x23\x44\x90\xa9\x64\x28\x85\xdc\x9e\xd7\x06\xfe\x42\x4f\x88\x4c\x9f\x75\x7c\x98\xc6\xec\x7e\xca\xf4\x7d\x0f\x87\x61\x6a\x96\x49\x04\xc2\x56\xbd\xa0\x7d\x0e\x07\x41\x0b\x9c\x24\x48\x82\xc0\x4e\x83\xf4\x13\x1c\x88\x26\x19\x50\x3f\xe2\x70\xf1\x05\x1c\xb4\x4f\xfa\xd8\x1f\x51\x08\xbd\xa5\x93\x85\x77\x9f\x68\xc4\x93\x3a\xc9\x22\xff\x60\xc6\x80\x8f\xc7\xef\x8e\xaf\xc4\xe3\x0b\xa9\xd3\x0c\x6b\x52\x6d\x30\xc0\xa3\x18\x76\xd9\x20\x90\x62\x48\x7d\x8f\x95\x42\x6c\x4c\x36\x21\xe2\x9c\x57\x8e\xa4\x98\x48\x7c\x74\xf4\x89\x82\x67\x50\x96\x47\x72\xe4\xf8\x91\x13\x5b\x1f\x43\x84\xc1\xf1\x23\x3b\x59\x25\x4e\xe6\xd9\xde\x43\xfb\x1c\x3e\x84\xf3\x43\xff\xbc\xae\x4d\x20\x97\xab\x94\xfc\x39\x2f\x45\x98\x2d\x89\xfd\x4f\x60\x91\x16\xd2\xfa\xcf\x80\x07\xf3\xaf\xe5\x38\xc7\x21\x02\xea\xd3\xa9\x99\xc6\x55\xaa\x87\x53\x44\x1b\x6c\xdc\xb1\x10\x1b\xec\xdb\xb8\x8b\x29\xa3\x05\x53\x03\x55\x8f\xb1\xc2\x1e\xbb\x30\x77\xfa\x0e\x8c\x65\x9e\x69\xa4\xb8\x52\x47\x7e\xb2\xcc\x7b\x81\xfd\xab\x8b\xc7\x08\x1f\x49\x14\x66\x5d\xf0\xe2\xa7\xa0\xe8\x0d\x66\x11\x90\x96\xbe\x4d\xa9\xd4\x18\xd1\x43\x47\x29\x8e\x98\x78\x60\xf6\x12\x45\x17\xdb\xb4\x07\x87\x6a\x35\x53\x43\x55\xeb\x30\xc2\x1c\xd3\x24\xf7\xc1\x00\x0d\x82\x59\xbf\x9a\xa7\x58\xa6\xab\x81\xcf\x6b\x97\x95\x59\x58\x48\x7b\x02\x32\xcd\x87\xea\x44\x4e\x24\x14\x72\x48\x57\x61\x59\x3e\x44\xc2\x98\x47\x09\x38\xb0\xac\x19\x5f\x9f\x12\xb9\x90\xad\x25\x9f\xf4\x94\xaf\xa8\xb1\xaa\xb1\xc2\xc4\x17\x7d\xe8\xa5\xaa\xed\xdf\x25\x62\xdf\x96\x19\x14\x02\xe5\xfb\xf6\x9e\x7c\xd9\x5e\x75\x3c\x76\x91\x47\xd6\x91\x8b\x65\xc2\xe7\xe1\x6a\x2b\xdb\x98\xa1\xc1\xa7\x00\xb3\x87\xbe\x84\xae\x82\x41\x8c\x91\xa2\x13\x96\x36\x58\x90\x62\x20\xd8\x7d\xff\xde\x47\x93\x6d\x3e\xcb\xec\x0c\xe7\x6e\xd9\x15\xef\xb0\xde\xca\x2d\xba\xd3\x2c\xa1\x20\x62\xef\xba\x4a\x08\x2a\x21\x5a\x65\x53\x34\xb5\x71\xe5\xcc\x06\x41\x84\x44\xa8\x40\x47\xbe\xc7\x1b\x78\xa7\x5e\xce\x56\x6c\x99\x11\xbb\xec\x00\x78\xb5\x5d\x6f\xe5\xec\x6d\x25\x58\x48\x57\x19\x32\xc1\x56\x4b\xa1\x2a\x8a\xc9\x9a\x75\x32\xd1\x14\x4f\x72\xe6\xf4\xbb\x67\xe9\x15\xef\x3b\x4b\x24\x53\x2c\x15\x53\x2c\x12\xad\x14\xcb\xaa\x7a\xb0\x09\x9c\xe7\x7d\x34\x7c\xf5\x14\xe9\x62\xfe\x32\xbe\x85\xeb\xc3\xed\xdd\x9a\x4f\x32\xdc\xde\xed\xd6\x87\x8b\xad\x9c\x63\x42\x7d\xd7\xcc\xb5\xda\xa0\xb3\x5d\x10\x41\x05\xea\xe4\x0a\xc3\x6c\x1d\x89\x1a\x9d\x4c\x3f\x60\x95\xaa\x09\x0c\xab\x21\x1d\xc1\x2d\x28\x90\xd3\x12\xbb\x91\x28\xb6\x6c\x2e\xfb\x4d\x3c\x83\x2f\x92\xd9\x4e\xe2\x6a\x79\xbd\x53\x6c\x34\x59\xe4\x5b\xb5\xd6\x5a\x26\xc3\x72\xaa\x22\xc1\x03\xef\x21\xa2\x62\x43\x6b\xa8\x57\xe6\x83\x1b\x45\x6a\xad\x1a\x42\x8f\x21\x66\x29\xb8\x50\xcd\x3e\x8f\x8d\x25\x25\xe7\x3a\xcf\xe4\x46\xb6\x79\x6c\x8a\x38\xab\x7e\x5e\xcc\xfd\xcf\x60\x27\x9c\x6b\xf2\x4e\xba\xbf\x3b\x5c\x2a\x72\xa3\xd2\x32\x8f\x0a\xad\x75\x02\x97\xd1\xa9\xd1\xb1\xc1\x26\x06\x06\xaa\x36\x8d\x82\x4a\x2b\xba\x6a\x27\x13\xb3\x13\x51\x1b\x3d\x01\x2a\x30\x8a\xee\x34\xd4\x69\x0e\x35\x84\x15\xcd\x9a\x66\xe9\x5f\x9d\xcb\x54\x42\xb9\xe4\x32\xe9\x2f\x3f\x8a\xd1\xfd\x5e\x1c\x94\xd0\xf7\x73\xb7\x74\x7d\x3f\xf7\xf2\xf8\x4f\xe2\x23\x95\xb3\xf3\x14\x8e\x5e\x1a\x78\xe1\x89\xfc\x00\xe4\x80\x54\xa7\x50\x31\x65\x8b\xcf\x1b\x95\xce\x3e\xf9\xe2\x97\xef\x36\xd2\xc5\x4e\x31\x27\xdb\xae\xec\x89\x31\xa1\xd7\xa6\x80\x0a\x91\x56\x6a\x42\x42\xa7\x48\x17\x6a\xc1\xd6\x27\x9f\x09\xa9\x5e\xe9\xe0\xeb\xa5\x0e\x36\xc5\x4a\x2b\x75\x4c\x0d\x4e\x77\xc5\xc7\xdc\x16\x59\xfc\xcb\x8f\x63\x93\x3f\x53\xd6\x10\xb8\x99\x97\x47\xbe\x9b\x79\x85\x3b\xf9\x9f\x96\xeb\xb3\x29\xd3\x85\x5c\x2a\xdc\x3c\x74\xe3\xc6\xcd\x22\x37\x7e\x30\xbf\x07\x09\x20\xdd\xc9\x97\x0b\xd9\x25\xd7\x5c\x37\x73\xee\xee\x25\x41\x5c\x16\x2f\xe0\xa2\x48\x4e\x12\xb4\xd0\x09\x21\x82\x2a\x62\x93\x91\x8e\x31\x38\x75\x69\x18\x42\x66\x24\xab\x64\x6a\xa7\xba\xce\x73\x81\x42\xc9\x18\xf6\x27\x12\x81\x25\x98\x56\xe4\x53\x3d\x52\xd5\x33\x9d\xbe\x32\xf0\xfa\xfd\x0b\x3e\x4b\x76\xd1\xbc\x9f\x2f\xed\xb8\x28\xc4\xc1\x0b\x32\x37\xc7\x21\x46\xf3\x59\xd1\xc9\x98\xbc\x2f\xba\xf0\xfd\xcc\xad\xa4\xc2\x4d\x02\x2f\x40\x7b\xea\xa6\x6a\xc6\x83\x40\xf5\x19\x3c\xe2\xb9\xce\x63\x3e\x0f\x38\x56\x5c\xd9\xe5\x2b\x11\x6d\x95\x33\x0e\x47\xe9\x71\xb9\x86\x9d\xe2\x4e\x23\xa5\x98\xa2\xc7\x8d\x68\x4a\xa7\x31\xae\x62\x70\xd2\xca\xb0\x57\xd1\x8a\x95\x98\xa0\x99\x16\x11\x04\x60\x94\x74\x28\x63\x70\x05\xd5\xce\x33\x4a\x44\x0e\x3b\x93\x73\x5e\x9f\xda\x47\xf5\xf9\xd9\xb2\x32\xdf\xcb\xfc\x3c\xe0\xd5\xda\x7d\x5f\xb9\x52\xcc\xeb\xb2\x73\xd3\xc8\x8b\xd1\xfc\x32\x12\xcb\xfe\x26\xa7\x42\xae\x24\x9b\x7c\x45\x88\x74\xde\x97\xf6\x6e\x2b\x57\xd5\x3b\x6b\x55\xbd\x73\x25\xdf\x89\x4b\x91\x2f\x15\x42\x44\xd0\x78\x3c\x6f\x77\x9e\x3b\xf1\xe1\x8c\x81\xa7\xbc\xca\x18\x78\x91\x17\xeb\xbe\x93\xf9\x59\x58\xbf\xb3\x57\xe5\x3b\x4f\xf2\xa5\xc6\x4d\x43\x37\xc0\xd6\x4d\x23\x37\xfa\xae\x59\xc0\x02\x49\x4f\x89\xe2\xcb\x26\xd7\x9c\xdb\x2b\xc6\x7d\x9a\xbb\x67\x1b\x0c\x8b\x87\xf5\x56\xf1\x31\x7d\xe8\x22\xc8\xc0\x9a\xe2\x0a\x13\x08\x2a\x21\xa4\x35\xf8\x62\x33\x4c\x71\x5b\xb8\xe0\x82\x99\x4f\xad\xa0\x57\x90\x60\x00\x7c\x9b\x3d\x22\xce\xb0\x29\x39\x8f\x53\x7f\x34\xc3\xe1\xe2\x4b\x65\x51\x12\x38\x99\x97\x9b\x41\x18\x78\x89\xf7\x85\x72\xa5\xda\x4d\x22\x37\xc4\xd6\x2d\x5d\x2f\x98\x86\x2f\x62\xf1\x38\xef\x96\x12\x89\xfc\x84\xcb\x85\x25\x14\xeb\x5c\xbf\xcb\xaf\x15\x09\x3a\x2c\x1d\x70\x57\xea\x38\x05\x53\xe7\x0a\x4c\x70\xc7\x87\xc6\x6a\x30\x31\xc0\x90\x48\x1e\x87\x45\x84\x31\x6a\xd3\x90\x95\x09\xf4\xd0\x62\x5a\xfa\x41\x61\x11\x89\xc3\x2f\xce\xed\x68\x4d\x7e\xfa\xb1\x6c\x90\x3e\x53\x9e\x52\xcc\x52\x21\x8f\xe7\xa6\x54\x4c\xf1\xf7\x17\xce\x1b\x53\x34\xcc\x8d\x29\xa9\xbf\x8c\xc8\xe3\xbc\x79\xc5\x95\xca\xb9\x2e\x25\x85\xec\xb8\xb6\xd9\xcf\x1a\x94\x8b\x06\x65\xfe\x47\x14\x37\x9b\x25\x29\xb6\xd3\x18\x89\x3e\xa8\x6c\xca\xb1\x16\x3b\x3d\x33\x29\x0d\x1c\x0f\x6c\x16\x41\xde\x62\x8a\x63\x06\x99\xa8\x51\x56\x69\x81\xaa\x9a\x9a\xd1\xe5\x31\x2e\xf3\x97\x78\x39\xe3\x59\x16\x7e\x5c\xaf\x5f\x2c\x77\x0c\xbc\xd4\xcb\xdd\xf9\x2b\x2a\xfc\x3f\x81\x83\x54\xba\x59\xe8\xc6\x38\xcc\xc4\x27\x6f\xf5\xef\x45\x09\x48\x71\xca\x14\x47\xb6\x96\x19\x4d\xb0\x9f\xe5\x94\x78\xb9\x59\xe6\x89\xdc\x68\xaf\xef\x66\xaf\x7c\xbd\x11\x17\xef\x91\xd5\x58\xc4\xa0\x16\xf4\xa1\xa3\xba\x03\xc1\x08\x9e\x8a\xf6\x80\x61\x49\x31\x54\x21\xab\xa9\x18\x1a\xa9\x38\x60\x86\x75\x02\x14\x18\xb5\x27\x2b\x62\x4c\x6b\x58\xda\x0a\xd9\xff\xcb\xd9\xdb\x03\xd9\x8a\x24\xe9\x82\xe1\xc1\x6f\x77\xcf\x4c\x73\x6e\x56\x56\xd2\x53\x3d\xd3\x9c\xca\xca\x9b\xf4\x4c\xff\xf0\x2a\x2b\x6f\xf2\xe6\x4d\xcf\x60\x6f\x15\xcc\xf6\xed\x1a\xfb\x6c\x6d\x17\x5b\x09\x11\x11\x11\x11\x11\x11\x31\xc4\x10\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\xa9\x9b\x07\xcf\x35\x82\x93\xbf\xf7\x27\xb3\x5e\x5e\x3b\xe7\xe6\xcf\x21\xfc\x0b\x0f\x77\x0f\x77\x8f\x1f\xb7\x5b\x0b\x3a\x1d\x7d\xcf\xcc\x4d\x9b\x48\x82\xf6\x78\xe4\xc5\x9f\x5e\xd8\x91\x57\xb1\x8c\x71\xc4\xa2\x2a\x5d\xdf\x4b\xff\x4d\xb8\x36\xce\x14\x53\xc0\xb2\x20\x47\xe3\x4d\x20\x8f\x79\xc6\x5c\x33\x55\x42\x54\xe1\xc9\xaf\xfe\xeb\x2a\x8e\x54\xba\x79\xa7\x99\xe5\x6d\x96\x50\x87\x7a\xc1\xa1\x6f\xca\xb6\x9c\x94\xe6\x63\x87\x73\x95\xd1\x92\xf2\x85\xc4\x6b\xf4\x14\xa3\xb0\x41\x32\xe8\x77\xf9\x71\x7f\xf1\x2a\xef\xff\xf8\x72\x85\x99\x5e\xde\xbc\x5b\x67\xfe\xf7\x6b\xfb\xda\x14\xa7\x79\x58\x06\x51\xcc\x42\x7e\x70\xdb\x3a\xe3\x83\xec\x06\x4b\xb5\xb4\x66\x40\x3d\x18\x03\x65\x88\x78\x14\x25\x77\x64\x9d\xec\xe3\x85\x44\xd0\xb6\x31\x96\xed\x92\x2d\x71\xe2\x25\x31\xb5\xe9\xb1\x8e\xcb\x74\x97\x68\x86\x1a\x09\x5f\x67\x6b\x7f\xe5\xb1\x7c\xf6\xe1\xe4\x72\xaf\xc2\xf1\xfe\x1e\x21\x6f\x53\xb1\x4c\xe8\x58\xc1\x0a\x7b\x9e\x22\x08\x79\x98\x19\x4b\x92\x63\x9a\x41\x5f\xd6\x96\x43\x13\xb7\x90\x9b\x65\x5c\x8a\xd6\x8b\x1b\x70\xab\x94\xd7\x71\x06\xb1\xd1\x23\xcb\xa1\x86\x2a\x08\x43\x2b\x31\xec\xad\xde\x91\x90\xf5\xe1\xb9\xbf\x73\xb4\xb9\x5f\xc5\xa1\xcd\x49\xc0\xe3\x32\x8a\x43\x16\x95\x71\xb1\xcc\x68\x5b\x01\xb4\x40\xa6\x39\x82\x88\xa7\x91\xb1\xc4\x29\x26\x39\x0c\x65\x6d\xdb\x2b\x26\xa5\x5b\xad\x5a\x76\x47\xc2\x22\x8d\x72\xec\x05\x42\x3f\xba\x47\xd8\x82\xf5\x88\x30\x0a\x04\xc2\xd5\xd7\xcc\x35\x5f\xe4\x8f\x85\xfd\xde\x38\xbf\x13\x93\x81\xbc\x86\x59\x67\xaa\xb2\xdb\x6b\xfe\xb2\x1d\x66\x0f\xc0\x03\xb2\xe8\x74\xc6\x19\x6b\x47\x0a\x80\xc7\x2d\x56\xb4\xa7\xbd\x8e\x15\xb2\xc2\x2e\x02\xb0\xc1\xd4\x6b\xf0\x2c\xab\x76\x0b\xee\x7b\x28\x6a\x4c\x0b\x3a\x1b\x1f\xde\x3f\xe5\x82\x68\xfe\xf4\x9e\xf0\xbb\x27\x84\x4f\xc5\xc9\xc5\xa0\x88\xcb\x28\xf5\x8a\xa8\xc6\x9a\x0e\x8b\x85\x13\x26\x46\x00\xfe\xfc\x08\xc2\x05\x1e\x73\xa5\xf1\x8b\x3c\x28\x70\x08\x8a\x2c\xf7\x5d\x2c\xeb\x47\x40\x0e\x18\x47\x40\x4e\xa1\x07\xf9\x36\x17\x46\x77\xa9\xca\x65\x4e\x14\xf2\xdb\x87\xb9\xf0\xdd\xc5\xaf\x81\x28\x97\x7f\x82\x77\x27\x42\x12\xbf\x95\xb3\x32\x2a\x78\x45\x63\xa7\xc4\x02\xb3\x10\x5c\x88\x0a\x67\xb1\xab\xa8\xe0\x19\x6d\xc3\x69\x88\x70\xec\x51\xc7\x1c\xa7\xb8\xf6\x26\x70\x60\x5a\x9a\x10\x48\x17\x70\xe1\x0b\x25\x9a\xab\x74\x8f\x34\x56\x75\x39\x4a\xf7\xc9\xbb\xa3\xfa\xc8\x45\xc9\x18\x2f\x25\x37\x42\x6b\x61\x46\x40\xdd\xa1\x8b\x0e\x76\x99\xd5\xbc\x97\x58\x04\x2e\x90\x08\xa7\x7c\x71\x97\xb2\x76\xf2\x02\x4c\xd0\x69\xb1\xe4\x31\xe8\xe0\x44\x58\x11\xa2\x08\x3a\xf7\xfb\xb9\x76\xe4\xec\xd1\x1f\x79\xd0\x2a\x11\x2a\x8b\xf7\x27\xba\x15\xf1\xb0\xb6\xa3\xa8\x0c\xeb\x25\x15\x18\x90\xf3\xac\x29\x3b\xb9\x0d\x97\x76\x19\x8d\x00\x46\x6a\xf8\xca\x10\xe5\xab\xd3\x35\xc4\x45\x1c\xa7\x4b\x77\x8f\x08\x9d\x18\x08\xb8\x11\x96\x60\x2f\x6c\x49\x72\x27\x8f\x69\x40\x5d\x42\x49\x7b\x97\x69\xae\xd2\x10\xe9\xbe\x9a\xf2\xc9\xde\x58\xa3\xea\x77\xc2\x37\x89\x6e\x0d\x79\xea\x17\x7f\x5e\x15\x2a\x69\x16\x53\x4d\x14\xbd\x5e\x22\x8c\x31\x2f\xca\x14\x2c\x88\x36\x5b\xb1\xb6\xa3\x93\xa3\xee\xfc\x96\x7c\xf7\x22\x8f\xf2\xa2\x5d\x9d\xa4\x7e\x11\xf3\x30\xf1\x59\xcc\xdb\x5b\x4b\x1e\xc6\xe7\x34\x9a\x80\x65\x61\x81\x73\xc0\xf2\xa0\xe8\x3e\x25\x08\xb4\xba\xcb\x35\xa2\xba\xe2\x86\x15\xed\x87\x0b\x51\x8b\x5b\xd6\x88\x8f\x11\x86\x4d\x43\x0d\x3a\x96\x2c\x3c\x84\x6a\xb5\xd4\x31\x21\x12\x2d\xc5\x59\x6a\x57\xec\x7d\x3e\x7d\xfa\xcc\x33\x9c\x24\xc0\x08\xa3\xb6\xa5\x06\xe4\xf1\x0a\x2e\x16\x10\x9f\x36\x06\x61\x50\x14\x41\x71\x47\x82\x22\x0f\xb6\xfb\xe5\xaa\xbb\x42\x0b\x54\x47\xec\xdf\x7f\x54\x8f\xcb\xfd\xf5\x5e\xba\x3a\xd9\x6b\xc1\x62\x61\x8f\x91\x67\x43\x36\xeb\x0b\xa1\xb3\xde\xe8\x74\x94\xba\x0c\x5d\xcc\xb3\x38\x08\xc1\x01\xbf\xae\x8f\xae\x14\xa1\xa4\x21\x81\xe6\x3d\xde\xb1\xb4\xf2\xee\x7a\xaf\x96\x1f\xb9\x12\xb1\x9f\x33\x35\x93\xf3\xfa\xd6\xd8\xea\x10\x03\xb9\x4b\x35\x4f\x19\x56\x5b\x79\xa1\xbd\xbf\xd8\xac\xd4\x76\x77\xce\xc9\x43\x62\x44\xa3\x92\xac\x79\xf9\x88\x33\xb6\xcb\x64\x87\x30\x83\x83\x33\x8e\x11\x10\x70\xaa\x48\x5f\x26\xd4\x65\xc7\x65\x4e\x56\x81\xdb\x15\x43\x83\xd9\xe8\xc5\x35\xa4\x55\xc6\xd3\x06\x4c\x20\xba\xa1\x37\xba\x9d\x9b\xb6\x89\x19\xce\xfd\x86\x93\xdd\x95\x5a\xae\xfa\xc7\x93\x06\xf7\x99\x88\x1f\xc8\xcd\xe5\x76\x6d\xd6\x4e\x10\xdf\x16\x9b\x54\xbb\xc5\xb9\xc5\x0e\xeb\x0c\x72\x5a\x66\xfa\x32\xa0\x49\x83\x16\x22\x2f\x03\x33\x41\x8e\x73\x0c\xbe\x1c\xf7\xcd\xa1\xa7\xbc\xc9\x39\x87\xb2\xd0\x4d\x51\xc4\x4f\xb7\x32\xd3\x59\x0c\x3e\x65\x8c\x6d\x67\xb4\x53\xd5\x54\x75\xc1\x9d\xa3\xb7\xa5\x9a\x31\xfa\x18\x67\x90\x41\x9e\x28\xfd\xe2\x2c\x5e\xc7\x2a\x9a\xd2\x4e\x9c\x7d\xcc\x45\xfe\x59\xe4\xd6\x2e\x34\x22\x74\x0b\x2e\xc9\x4e\x4b\x19\xba\x7e\xe3\x2e\xae\x8e\x16\x83\xd6\x2a\xa8\x2b\x9b\xe6\x21\x96\xf2\x83\xb9\xe4\x19\xf5\x25\x2e\xce\x29\xe6\x0f\xf1\xe0\x56\xf7\xfa\xb9\x17\xf4\xd8\xde\x94\x04\x45\xc2\x52\x91\xab\x2b\x9e\xb5\xdd\x28\x4c\xe4\xec\xee\xc8\xfa\x5f\xf1\xd1\x7f\x49\xca\x93\x4a\x72\xa4\xc5\xd5\xec\xb8\xf7\xed\xfc\xab\x3b\xac\x1e\xe8\x2a\xf3\x43\x82\xcf\x71\xb6\x04\x1f\x18\xcf\xbb\xa6\x54\xdb\xb6\xb7\x34\x72\x1d\x91\xf0\x7b\x86\xc0\x5a\xb2\x23\x82\x95\xbf\x8d\x38\x27\x6c\xac\xb1\xd8\xbd\x27\x73\x25\xfd\x70\x71\x26\x2b\xbb\xd5\xbd\xb1\x34\x53\x47\x7d\xc2\xa0\x5e\x05\x39\x83\x20\xc5\x78\x09\x5c\x17\x6c\xf0\xca\xce\xe2\xb3\xdc\x2c\xac\xee\xcb\xa1\xc3\x94\x6f\xb5\x1d\x25\xd1\xe6\x78\xb4\x7b\x2f\x6c\xde\xc9\xe9\x91\xc6\xee\x48\xe3\x9f\xe1\xca\x5a\xfd\x25\x1e\xd5\xb1\xf0\x97\xdc\x23\xb9\x9a\xa6\x10\x0a\x6a\x76\x36\x81\xa7\x34\xf7\xae\x63\x99\x86\xd9\xc7\xf6\x05\xed\xcc\x37\x1f\x69\xf7\xc7\xfd\x84\x7f\xfa\xca\x1e\xe6\xcf\xe1\x50\xdd\x6d\xf3\xd0\xc3\xbe\x35\xdb\x8d\xbf\x80\x66\xd8\x86\x20\x15\x7b\x03\x6d\xd7\xfd\xc8\x3f\x0b\x08\xc0\xbd\x4b\xd5\x51\xe1\xc2\xe2\xde\xdb\xf8\xe3\x82\x87\x5a\xc7\x6b\xe0\x6e\x7b\xd4\x81\x2e\xba\x0d\xe4\xd6\xa9\xe5\x66\x29\x17\x5e\x44\x41\x01\x33\x35\x8c\x76\x55\x07\x7b\xed\x97\x7b\x97\x3e\x9c\xf9\xfc\xee\xb9\x3f\x2a\xbd\x68\x57\x9b\xe3\x30\x8f\x98\x1b\x07\x45\xc4\x93\x4f\x69\x28\x63\x98\xc7\x61\x3c\x47\x79\x1c\x25\xd8\x7e\x8e\x20\x15\xf4\x6a\xb5\x27\xdf\x89\x9d\xd1\xc2\xae\x3c\xa1\xf2\x64\xeb\xd6\xd3\x9d\x5b\x6a\x67\xb9\xd1\xd2\x2f\x8d\xed\x52\x1b\xfa\xf0\x36\x90\x3b\xcb\xdc\xe4\x35\xba\xdf\x90\xa5\x38\x96\x6e\x5b\x2f\xa8\x9a\x8e\xbb\x71\xb4\xdb\x44\xda\x15\xf5\x32\x89\xab\x65\x8a\xbe\x69\x32\x7c\xaf\xc1\x25\x7c\xb8\xfa\xf1\x4c\xcb\xb2\x83\x6b\xb8\xe8\x70\xea\x3a\x5e\x50\xf4\x5c\xd6\xfd\xa5\x2d\x68\xe6\x32\xe1\xdb\x89\xe7\xc4\xfd\x5a\xbf\x79\xa9\xc1\xf0\xa4\x1d\x75\x58\x1d\xd8\x3a\x5a\x85\xaf\x82\xf2\x79\xa3\xf2\x78\x2f\x6f\x2c\x0b\xf3\xdb\xe1\xf3\x34\xf4\x63\xed\xc7\xaf\x68\xee\x23\xbd\x6d\x5b\x64\x1a\x6d\xa9\x79\xcf\xb3\x2d\x8f\x86\xcf\xa9\x2a\xce\xa3\x5c\x09\x36\xdc\x66\xcf\x08\x4b\x24\x5f\xed\x9b\xea\x90\x6f\xc8\x3f\x0a\xdd\xda\x2e\x87\x3e\xe6\x39\xf7\xd7\xca\x1a\x6f\x3f\x9a\xa9\x77\x27\x9a\xb7\x98\x49\xee\x65\x66\x65\x7b\x8b\x45\xfb\x86\x8e\x2e\xc7\x81\x55\xc5\x21\x48\x71\x2e\xa7\x5c\x76\x0f\x7e\x9e\x98\xad\x15\x48\xbc\xd1\xc1\xc3\xe6\x96\x27\x50\x43\xeb\x61\x08\xe1\x32\x63\x11\x83\x4f\x57\x6e\x6e\xb4\xbb\xa3\x5e\xbf\xff\x24\x2e\x7a\x15\x4b\x22\xe2\xa2\x44\x30\x7c\x7c\x0d\xd7\x31\x58\x1c\x43\xe1\x1e\x04\x6f\x03\x49\xee\x71\xe6\xc7\xfd\xe8\xf7\xf5\x22\xbe\x64\x07\x5e\xc3\xac\x0c\xdb\x78\x84\x59\x7a\xbf\x9e\xf2\x3a\xf2\xfe\xc5\x28\xe2\x1b\x59\x2c\x72\xbf\xab\x6f\x5a\x8b\xdc\x18\x85\x6f\xcf\x34\x02\x37\xdf\x2a\x6b\xb8\xb9\x85\xdd\x1a\xa9\xd1\x1e\x1b\x8e\x2e\x1a\x71\x03\x04\xe2\x4e\xff\x58\x29\xa5\x5b\xc8\x1d\x36\x68\x0e\x7d\x46\x2d\x08\x78\x3a\x40\x02\x9e\xae\x37\x56\x6e\x38\x44\x02\xf3\x2e\x53\x07\x91\x2f\xf9\x8d\xc8\xe5\x6f\xbb\x42\x9e\xbc\xab\xa5\xb3\xa4\x4b\x62\xd2\x09\x26\x07\xed\x25\x34\x69\x44\x1b\x0f\xf5\x43\x62\x48\xb1\xe2\x35\xcc\x6e\xfd\xc5\x6b\x98\xdf\x78\x07\xde\x34\x51\x1b\xde\x9f\x9f\x88\x54\x5b\x9c\xcd\xd4\x2e\x65\xe5\xfd\xe5\x0d\xb9\x39\x83\x1f\x2e\xd6\x88\x51\x8b\xaa\x08\xdd\x83\x6b\x18\x3d\x34\x76\x8b\x16\x75\x20\xeb\xd2\xb2\x74\x83\xce\x75\xdd\x42\x97\x07\xee\x7f\xec\x2c\x07\x58\x1d\xdf\x3d\xc9\xf5\x6e\x77\x04\x6a\x3f\x5c\x12\xb8\x77\x71\xc4\x9e\x15\x59\x73\xf3\x3b\x32\xe3\xb0\xf0\x94\x7a\x60\xe0\x88\xed\x1a\x48\xd8\x69\xd4\xa4\x29\x38\x90\x16\x43\x85\x16\x0e\xe5\x04\x6d\x95\x56\x69\x39\x43\xee\x61\x30\x37\xe4\xfe\x4e\x0c\xa5\x5e\x63\xaa\xfb\xb9\x6e\x7f\x23\x1c\xae\xe3\xa5\x79\xdf\x88\x09\xcf\xc4\xa6\x44\xd6\xe9\x48\x74\x4a\x74\x74\x95\x6c\xd1\x75\x29\x3c\x94\xba\x0f\x04\x52\xd6\x19\x79\x09\x43\x0d\x59\x5d\x63\x56\xa3\x13\xda\x62\xff\x44\xa2\x76\xf2\x28\xfc\x4d\x0a\x97\x1f\x6e\x2e\x95\x87\xdd\x63\x9b\xb5\x67\x25\x76\xd9\xc4\xf5\xa5\x2a\xeb\x0a\x0b\x13\x22\xa7\x76\x69\x63\x33\xc9\xc3\xfe\x8e\xe4\xcd\xa0\x7b\x87\xdc\x92\x72\xab\xb6\xc0\xb0\xb1\x77\xad\xcc\xb4\xb6\x33\xf3\x99\x96\xa8\x9e\xc8\xe5\xa9\x44\x13\xb7\x24\xfc\x3d\x3c\x6f\x5e\xb3\x43\xe4\x2c\x03\x63\xd4\x5d\x4c\x91\x0d\xcd\x80\xbe\x09\xa5\xdf\xf8\x12\x77\x4a\xd9\x2f\x31\x8e\xf3\x1e\x02\xdd\xb0\xad\xdb\xca\x91\x63\xbb\xb5\x21\xb6\x31\x0b\xac\xd4\x76\xc4\x5c\xe5\x13\xa2\xd6\xb2\xbd\xfa\xd9\x7f\x84\xcd\x13\x95\x14\xb5\xfe\x58\x48\xb9\xbd\x18\x52\xed\x80\x5d\xd3\xa6\x3a\x14\xc7\x75\x0a\x4e\x6c\xb1\x3e\xf3\x2b\x42\xfe\xbc\x7d\x5e\x91\xc4\xea\x8c\x5c\x58\x07\x53\xae\x1d\x48\x6c\xbd\x96\xca\x46\xbf\xe5\x6b\xfb\xfd\x5d\xa1\x5a\x72\x4c\xfe\xfe\x69\x4e\x54\xc4\x1e\x56\x75\x88\x25\x76\xa8\xa4\xe0\x90\xc9\x4e\xe2\xd7\x10\xd4\x60\xd6\x2b\xa6\xbb\x42\xad\x15\xf6\x99\x67\xea\xe6\x36\x90\xab\xdb\x4c\xce\x6e\x23\x25\x4a\xd2\x1a\xfa\x06\xb2\x86\x50\xd0\xef\x0a\x75\x56\x7a\x22\x09\x29\xba\xb8\x56\x4e\xee\xf3\xdc\x17\xd7\x8a\x18\x8b\x70\x8d\x43\xe2\x1c\xc9\xd2\xc5\x54\x87\x31\xd2\x6f\x2d\xc5\x70\x2a\x45\x37\x1a\x63\x29\xd0\xc7\x30\xae\x7d\x88\xc1\x37\xf4\xc6\xb0\xf3\xd5\xb3\xa1\xd0\xde\x65\xea\x2a\x9b\x7f\x27\x56\xd5\x24\xe1\xfc\xff\x09\x6e\x3e\xfc\x0e\xe0\x7c\x77\xa5\xba\x3a\x72\xf4\x4d\x6f\x0d\x6c\x5d\x67\xb1\xdb\x56\x35\x0e\x05\x36\x98\x45\x5e\xe6\xf2\x2c\x06\x87\x0e\xb7\xb5\xbc\xb6\x45\x92\xbb\x58\x6b\x55\x42\x7e\x2b\x72\x2d\x2a\xd1\xd4\xf3\xef\x2f\x6f\x76\x57\xd2\xd9\x0f\xf0\xed\x85\x41\xb5\x4b\xf2\x3b\xf8\xe9\xf2\x4a\x6b\x33\xf4\xb9\x69\x19\xcc\x6c\x75\x1d\x1c\xb0\x9c\x5b\xb7\x9d\x32\x48\xf4\x8e\x56\x1d\xba\x91\x97\x3b\x4a\xf7\xb1\xd4\x47\xa8\xbd\x10\x33\xf4\x6b\x0e\x06\x4c\xd0\x27\x39\x01\xe8\xee\x12\x2d\x51\x0d\xa1\xf3\x2a\x91\xb5\xed\x76\x88\x93\xab\xdf\xc0\xd9\x0f\xa0\x25\x25\xe6\x18\x0f\xae\x6b\x98\x89\xad\x37\xba\xae\xd3\x14\x6a\x3a\x77\x58\x8f\xbe\xe1\xd4\x96\xd2\x1e\x0c\x0c\xf5\x8e\x86\x62\x5f\x59\xa5\x96\x4a\xbe\xdd\xfa\xb9\x8e\xc6\xe9\xf9\x56\x85\x5f\x2d\x9b\x83\xd3\x28\x41\x73\x70\x82\x38\x56\xfa\xdb\x40\x9a\x0f\xfa\xd1\xbf\x4c\x54\x6f\x1b\x73\x30\xa8\xbc\x45\xf1\xfb\xdd\xf9\x4e\xf5\x72\x6c\xc5\x0a\x2a\x98\xa9\xbe\x90\x46\x8e\x91\x60\x3c\xc7\x95\xd7\x80\x0d\x31\x7a\x34\x15\xeb\x8f\xb9\xda\x29\xad\xc8\x6e\x19\xdb\x30\x8a\x9b\x6b\xd5\xae\xc6\x14\xbd\x98\xda\x10\xdf\xce\xad\xd2\x2e\x7c\xe9\xb1\x49\xeb\x18\x26\x9a\x2e\xa5\x64\x90\xe3\xb9\xc7\x4c\x8b\x54\x57\xd4\xd5\x3f\xde\x02\x7c\x94\xa1\xab\xdd\xfe\x74\xbf\xfb\x23\xec\xf6\x3b\x6d\x0d\x24\x6f\x4b\x28\xb1\x92\x49\x03\x31\x32\x28\x17\x86\x06\x38\x18\x40\x55\xd3\xa8\x59\x43\x93\x66\xe1\x34\x12\x25\xc1\x09\x25\x15\xb1\xb5\x40\xe1\xe4\xef\x1f\x34\xfe\xe4\xf2\x98\x19\x3d\xb9\xd8\x5a\x57\xa7\x0e\xa7\x62\xae\xf4\x5b\x47\x21\x6e\x69\xfd\x1c\xd1\xa1\xa5\xb3\x5c\x61\x76\x47\x8a\x1e\x2c\xbd\xb1\xb8\x69\xdd\x46\x7a\x2d\x79\x87\x63\x8c\x67\xad\x76\x5a\xa9\x8f\x77\xce\x6c\x1e\xd7\x1a\x15\xae\x61\x96\x3a\x18\xe8\x2c\xad\xe5\x03\x87\x2c\xb8\xcd\x65\x66\xe9\x18\x1c\x5a\xa5\x3e\x4c\x4b\x5c\xf8\x71\x0c\x21\x58\x0d\x38\xba\x5e\x6f\x6b\xdb\x4c\xec\x25\x52\x04\xf7\xb7\x1d\x17\x47\x4d\x90\x78\x8a\x13\x36\x31\x84\x72\x31\x2c\xe9\x12\x3b\x34\xa4\x61\x27\x47\x65\x57\xf3\x9a\x2f\xd5\x32\x64\x6d\x04\x23\xb5\xc5\x59\xe2\xe4\xc1\xf7\xfc\xa7\xe7\x73\xfe\xee\xb8\x26\x7c\xf3\xb0\x26\xac\xcd\x71\x92\x86\x45\x14\x25\x59\x54\x60\xb0\x34\x31\xcc\x90\x1a\xfa\xed\xd4\xd0\xb0\xa5\x99\x32\x46\x3c\x88\xc2\x49\xbc\x63\xba\x2d\x16\x87\xc0\x9f\x2d\x16\x03\xb0\xbb\x54\x8d\xe5\x5e\x9c\x75\x91\xe8\xfd\x14\xfd\xe1\x66\xb7\xff\x35\x28\x97\x1f\xde\x9d\xec\xaf\x2f\x3e\x5c\x5f\xed\xd4\xd8\xd0\x59\x11\x65\x76\xe5\xf9\xbe\x8e\xa9\x39\xdd\x91\x6c\x6e\x4d\x8c\xa0\xd4\x2b\xa9\x5e\x1a\x1c\x5a\xb3\xb1\x93\x1a\x18\x36\x18\x57\x39\x07\x1f\xcc\x52\xe7\x39\xf6\xe2\x2c\x7b\xaa\x56\xf2\xb4\xad\x45\x6d\x77\xd0\xbc\xfb\x1b\xec\x1f\xae\x0e\x57\x2b\x8c\x70\xc4\x32\x02\x7b\xc4\x2c\x2d\x52\x30\x93\xca\x76\xa5\x5c\xd2\x0b\x9c\x90\xe5\x65\x04\xe6\x94\x75\x59\x06\x26\x70\x2f\x4f\x08\x48\x1e\xb5\xe5\x46\xe2\x62\x77\xc7\x13\xbf\x43\xf2\xee\x0b\x46\xd3\x61\xfd\xdf\x4f\x92\x6d\xcc\x4d\x9a\xa8\x83\xb4\xdd\xc9\xbb\x5a\xb6\xe1\xa3\xab\xb4\x34\x19\x57\x11\x70\xc0\x51\x2a\xb9\x17\x77\x58\xaf\xbe\x00\x51\xaa\xb5\x1f\xe1\x1a\xfd\x56\x19\x54\x90\xe4\xd8\x11\x69\xfd\x9c\x9a\x2b\xf5\xe3\xfc\xfe\x2c\x6a\x85\x1b\xa2\xe6\x61\x9c\x05\x45\x10\x8a\x2d\x19\xf7\x6d\xc8\x8d\xcf\x43\x3f\xc2\x5e\xec\xba\x38\x4c\x0f\x2d\x6e\xf9\x86\x52\xdc\x2d\xbf\x5a\x51\x2a\x0c\xd4\xf5\x3a\x06\x27\xfb\x4b\xb1\xa9\x5d\x23\xba\x13\xcc\xd9\x34\xc4\x59\xac\x7f\x9c\xdc\xae\xe6\xfe\x20\x87\x87\xb9\x9a\xdd\x2e\x18\x69\xc4\x86\x31\x0a\x67\xf2\x70\x1f\xfe\xa8\xba\xab\xb5\xbb\xd0\x60\x65\xf3\xc5\x71\x5a\x3f\xb6\xb6\x3f\xa3\xf0\xad\x3a\x16\x18\x20\x47\xc3\x83\x55\x12\x1a\xec\x43\x88\xc1\x6b\xd2\xdb\x2a\xa8\x18\x0b\x4b\xd9\x89\x53\x9c\x07\x27\x87\x04\xa7\xa0\xf2\x86\x3a\xe7\xbc\xeb\xc1\xae\x9b\x36\x4e\xea\x1c\x4b\x6c\xc5\x5c\xe3\x10\x5b\xed\x14\xbe\xf2\xe2\xe2\x7c\xf7\xd3\xf9\xfe\xfb\xd3\xdd\xf9\xee\xa7\x0f\x57\xfb\x1f\xbf\x3d\x55\xbb\xc6\x3f\xc4\x5e\x13\xba\x72\xe4\xc7\x8e\x9c\xfa\xfe\x6d\x26\x4f\x6e\x10\xac\xae\x22\x18\xc4\x54\xa7\xed\xbe\x89\x8b\xfd\xf7\xef\xaf\xc5\x63\xa7\x6b\x0b\xdf\x5c\xed\xd5\xe9\x63\xed\x85\x81\xa7\x78\xb7\x5e\x10\xc8\x9d\xe9\x3b\x72\xec\xf8\x95\x7f\x60\xbe\xc8\x67\x97\x9a\xa1\x1a\x62\xae\x36\xe8\x3d\xcb\x76\x7b\xb1\x66\xb0\xbf\x7c\x27\x18\x67\x54\x1d\x1b\x87\x24\x66\x4b\x37\x22\x09\xa1\xee\x96\xc6\x9b\x19\x4f\x2a\x39\x3a\xb4\x98\x79\x4d\xd0\x52\xb6\xb8\xd8\x16\x60\x53\xbf\x00\xd2\x46\x6c\xdb\x0f\xd2\xdf\xf5\x9a\xad\x4c\x9b\x0f\xf3\xfe\x52\xb9\x14\xe6\x61\xe5\xe0\xea\xc1\x50\xb8\x78\xbf\xfa\x5d\x76\xe9\xb8\xb7\x51\x0c\xfe\xb0\x70\x5a\x05\x4e\x6d\x46\xb4\x3b\x0c\x25\x56\x52\xeb\x07\x45\xe7\x84\x69\xdc\x37\x10\x41\x5b\xf6\xa5\x1d\xde\x91\x75\x1e\x88\x78\x1a\x47\xd8\xdf\xaf\x5f\xb6\x6a\x73\x1c\xfb\xc7\xe5\xff\x93\xfd\xe5\x4a\xee\x4c\x52\x1b\x7b\x9c\xa2\x59\xef\xe3\xac\xb6\x96\xd9\x6f\x0f\x9d\x54\x86\xb5\xac\x2f\x0e\x16\x7e\x17\xb5\xd4\x48\x21\xaf\x18\x32\x71\x27\x7f\xad\xe9\xea\x96\x39\x7a\xe4\xc9\xc9\x9e\x2a\x97\x3f\x3c\x0c\xff\x26\x52\x7a\x39\x94\xed\xb8\x0a\x14\xba\xd3\xd2\x85\x30\xf6\x4b\x1e\xf5\x75\x11\xb6\x54\xf7\xcd\xca\xb1\xe5\xe0\xd0\x22\x77\x5a\x7f\xa4\xe1\x62\x4e\xc5\x40\x63\xde\xcf\x49\x32\xce\xa5\x35\xb2\xe3\xfd\x9f\xb5\x5a\xaa\xfa\x56\xe7\xfc\x42\xa3\xd2\xbb\x93\x33\x2a\xbd\x83\xf5\x1b\xf1\x93\x54\x36\x7c\x6a\xab\xaa\x68\x27\xa9\x28\xc7\xa6\xaa\xcb\x61\xaa\xf4\x00\x32\x48\x21\x85\x21\xc0\x14\x0b\x4c\xe5\x00\x2b\x4c\xb1\x43\x16\x40\x02\x29\x14\xc0\x8f\xf7\x25\xf7\xc2\x8f\x14\x6b\xab\xaa\xb4\x37\xe8\x83\x6e\xfc\x27\xac\xfd\xd9\x5f\xef\x35\xf3\x90\x79\x85\x54\x84\x7d\x99\x0e\x43\x92\x30\xdd\x38\x54\x49\x96\xa0\xa9\xba\x8a\x9e\xdd\x11\x74\xb1\x29\xdd\xc6\xad\xf8\x5c\xd4\x43\xb5\x8d\x6d\xa9\xd9\x4a\x2b\xf2\x9c\xfb\x5f\x83\x74\xf9\xe1\xdd\x6e\xaf\xd9\xb7\x99\x9e\x97\x8c\x65\x8a\xab\x18\x6b\x30\x8f\x73\x3a\xd2\x80\x8a\x3b\xb5\xa1\xbe\xab\x54\x5f\xd5\xd7\xf9\x42\x39\xdf\xc9\xe7\xab\xb8\x5e\xed\xbe\xb9\xfa\xf1\x62\x77\xa5\xfa\xcd\x61\xb4\x7d\xbf\x0e\x4c\x5a\x35\x01\x8d\x1a\xd7\x95\xf5\x43\xe9\x73\xc9\x13\x7b\xc0\xee\x98\x32\xa8\xd6\x4a\xef\x42\x23\x40\xe0\x8c\x00\x51\x06\x86\x3d\x12\xa8\xc0\xe6\xab\x81\x03\x6e\xa4\x10\x01\x87\x1e\xaa\x04\x73\x4c\xb0\xdc\x78\x50\x6b\x96\xd2\x1d\x6f\x86\x17\xb3\xaa\x66\x2d\x6e\xbd\x78\xaa\xa7\x98\x1f\xb9\x12\x1d\xe5\x95\x10\xcd\x52\xa6\x75\xde\x58\x7d\xca\xdd\xfe\x1e\xa0\x98\x2c\x7e\xbc\xde\xea\x2b\xed\x77\x7b\xcd\xfa\xb9\xa6\x1d\xda\x5e\xd8\x78\x90\xd4\x10\x04\x75\xe8\xa3\x4f\x9b\x12\x78\xe8\xd3\x74\x19\x7c\x3a\x2f\xba\x4f\xad\x25\xf7\x43\x8c\x08\x3d\xea\x9a\x49\x14\x31\x5b\xae\x36\xe5\x57\x40\x1e\xf6\x48\x29\x3e\x3a\x18\x46\xd0\x02\xa3\x1e\x4e\x58\x55\xd8\x63\x9e\x48\x36\xcd\x94\x02\xf3\x82\x73\x58\xc7\x79\x12\x17\xf0\x57\x9c\xc1\x93\x35\xa9\x46\x33\x94\x59\xcc\xec\x2b\xb8\x4d\x77\x7f\xbc\x5e\xcd\xc8\xf5\x6a\x3f\x34\x23\xf6\x0e\xa1\x8d\x7d\x06\x86\x29\x4d\x41\x70\x5b\xca\x8d\x17\x49\xdc\x8b\x96\x01\x87\x02\x4c\xea\xfb\x60\xf8\x65\xe8\x11\x22\x81\x7f\x37\xa9\xb5\xd2\x8b\x5c\xf9\x9e\x90\x8b\xb5\xcd\x7b\xb3\xf2\xe3\xb7\xa7\xd2\xd1\x3c\x7d\x73\xb5\xff\x51\x12\x35\x35\xd4\x3a\xf4\x6f\x6b\xcf\x0f\x3d\x39\x70\x83\x2a\x38\xe4\xbe\x2f\xa5\x41\x97\x4d\x38\x47\x60\x66\x5e\x10\x7a\x72\xe3\x86\x91\x77\x5b\x49\xb3\xef\x1f\x74\x1f\x9a\x02\x48\x5d\x34\x9b\xdd\xae\x34\xa2\x0c\xdb\x9e\xad\x87\xa9\xf3\x78\xe1\xbf\x46\x38\x0b\x6a\x8b\x07\x89\xbf\xd8\x35\xfa\xca\x70\x18\x47\xbb\x71\x07\x68\x3f\xa6\x4a\x5e\x8a\xb1\xe5\x9a\x29\x72\x0c\x04\xf6\xd2\xfe\xec\xa8\xa7\x47\x43\x23\xad\xb2\x1d\xd6\x52\x90\xe5\xe8\x44\x90\x64\x07\xdf\xeb\xd1\xa3\x66\xe4\x96\x99\x14\xc9\x0e\x36\xc5\x32\xf0\x2a\x80\x32\x81\xb4\x6c\x98\x87\xe3\xf1\x9e\x71\x21\x0b\x03\xf9\xad\xb8\x3d\x43\x0c\xd2\x19\x85\x0f\x17\xd2\xcd\x3b\xcd\x2a\x93\x85\x2f\x45\x08\x35\x18\x55\x8f\x71\x29\x99\x05\xeb\xc2\x70\x08\x52\x46\x0b\xca\xfd\x65\x5c\x12\x2b\x05\x12\x62\xbd\x8d\x51\xa5\x19\xca\x24\xfc\x42\x02\xbb\xf3\xdd\x3a\xc7\x01\x01\xcd\x58\x75\xb6\x46\x8e\x5d\x0e\x0e\x04\xe0\x42\xa4\x44\xd8\x60\x7d\xe8\x25\x1b\x38\x90\x54\x48\xb5\x09\xc1\x13\x7b\xda\x6c\xeb\x6c\x3b\xed\xf2\x78\xd5\xc4\xc9\x19\xdd\x5b\xe4\xfa\x27\xb2\xed\xbd\xb0\x97\x28\x65\xac\x99\x7a\x28\x19\x6f\x97\x19\x1b\x2c\xc1\x05\x77\xd1\xd5\x40\x31\xd0\x4d\xf5\x32\xcd\x2a\x98\xa2\xa5\x01\xbd\x1d\x40\x87\xec\xe1\xee\xa2\x52\xec\xbb\xfd\xfd\xd6\xfe\xfd\x61\x8f\x9b\xad\x7d\xe3\xe2\xde\x15\xd5\x9c\x25\x62\xe3\x30\xf6\xfd\x18\x94\x25\x12\x6c\xb1\xa2\xe1\x42\x24\xd2\x50\x2e\xfb\xd8\x66\x79\x91\xf2\x7a\x0a\x97\x19\xf4\x16\xb8\x0d\x7a\x09\x1e\x36\x9b\x2e\xb6\xa2\xae\xea\x3f\xde\xeb\xe2\x2a\x4a\xa7\x42\xc4\x8e\xad\x0b\x0a\x16\x16\xcd\x32\xfb\x52\x71\x3b\xbb\x21\xd6\xe0\x37\x54\x6f\x20\x91\x32\x74\xa0\x5b\x3c\xbf\x0a\x5c\xc9\x29\xa1\x47\x7b\x7d\x89\x73\x3e\xab\x8e\xcf\x22\x3b\xbd\x5a\xba\x75\x8e\x96\x2e\xdf\x3d\x18\xee\x77\xab\xa1\x53\xf6\x54\xdb\x7f\xd0\x2c\x24\x96\x0f\x59\x6a\xe7\x55\xe2\x61\x36\x2d\x53\x0c\x7d\x8f\x66\x1a\xd9\x38\xa9\xde\x12\xa0\x1b\x38\xd0\x7b\x4a\xd0\xcc\x31\x7a\xe8\x7b\x10\x02\x5f\xf2\x8a\x17\x30\xe7\x60\x57\x65\x89\x03\x6b\x8f\x63\x32\x88\xbd\x1d\xda\x96\xc1\x57\x2e\x2f\xde\x69\x76\x85\x4e\xbf\xb8\x8e\x94\xf5\x61\x4a\x3d\x49\x2f\xab\xfe\x90\xde\xeb\xeb\x20\xec\xc0\x77\xdb\x9c\x28\x04\x4b\xd6\x84\x74\x49\x3f\x5c\x7c\xb8\x39\x23\x70\xb1\xce\x8a\x46\x6d\xb9\x4b\xb4\x8c\x21\xe4\x90\xa3\x33\x44\xe0\x01\x61\xfd\x08\x16\x44\x6d\xc2\x30\x5a\x5a\xc9\x89\x4b\xe6\x05\x7e\x91\xa4\x15\x10\x28\x3d\x9b\x81\x0f\x71\x82\xd3\x1d\xb1\xad\x99\x27\x4b\x8b\x7a\xd1\x85\x38\x0a\xba\x93\x66\x28\x1d\xf9\xf6\x7e\x3d\xe6\x31\x57\xb1\x4e\x92\x54\x93\x35\xa3\xe8\xb1\x45\x8e\xa6\x0b\x2d\xd8\x38\x62\x1e\x42\x00\x51\x59\xde\xd6\x72\x91\x37\x2d\x38\x05\x9f\x27\x64\xc1\xea\x46\x56\x9c\x17\x7d\x07\x79\x55\xa0\x35\x8f\xf7\x67\xad\x98\xd0\x19\x63\x8b\x33\x8e\x8c\x17\xed\xab\xd2\x7e\x55\xcf\x0f\x9a\x95\xa0\x5b\x40\x6d\xdf\x72\x2f\x09\x31\x93\x87\xd8\x2d\xc0\xc2\x7e\x69\x2b\x6a\x07\xb4\x5b\xea\x89\x37\xc0\x72\xb0\x80\x94\x2c\xc7\x0c\x66\xd4\x8f\xf2\x39\xdf\x71\x4d\x57\x26\x11\x21\x6c\x83\x7b\xb9\xce\x96\xda\x5e\xd3\xb3\xa6\x69\xa3\x5b\x2b\x2c\xb3\x3a\x49\xe4\x5c\xb2\x97\x16\xab\x00\x2c\x98\x62\xb0\x21\xb2\xb1\xee\xef\xeb\x07\xd4\x42\xfe\x36\x1d\x7a\x90\xbd\xcd\x6c\x6e\xce\x89\xb6\xce\x0e\x45\x00\xc3\x52\xba\xc1\x84\x51\x01\x5d\xb5\x14\x94\xd9\x46\x63\x58\xb4\x93\xfa\x85\x08\xf9\x23\x4b\x8c\x63\x01\x16\x4d\xaa\xba\x31\x8a\x6d\xdf\x28\x21\x86\x46\x94\x9a\xe8\xab\x3f\x76\x29\xa6\xa9\xbd\x46\x3e\x7a\x1e\x35\xc1\x28\xb1\xc7\x58\x9e\x8c\x82\x66\x94\x79\x4b\xb2\xf4\xc7\x7d\x11\x95\x66\x2a\x23\xf9\xf5\xea\x03\x28\x8f\xb3\x0e\xac\xa1\xf5\x87\x93\x0f\x3b\xcd\x5c\x5a\x37\xa8\x03\xa8\x6f\xbb\x7c\x60\x9d\xef\x38\x51\xa0\xc4\x1f\x47\x5f\x89\x0e\x35\xea\x73\xdc\x83\xde\x6d\x35\x85\x68\xaa\xe9\x92\x7b\xef\x9f\x6b\xfa\xcf\x93\x6a\xd0\xf4\x68\x6b\x47\x61\x6b\xbf\xb9\x9f\x43\x2f\xd7\xb7\x9b\x6f\x57\x90\x67\x14\x88\x46\x56\x9f\x74\xc6\x1a\xab\x0c\x3c\x88\xb0\xc2\x3e\x9b\xc0\x0e\xc1\x06\x23\x9b\xb1\x01\x37\x5e\xbd\x0e\x13\x2b\x6c\xd6\x11\x8a\x21\x00\x33\x1b\x57\xcf\xd7\x05\x27\xc3\x11\x2b\x3c\xc6\x86\x0e\x31\xd5\x56\x61\xc2\x2f\xbd\x9f\x43\x44\xa7\xd6\x69\x54\x6d\xe3\xe0\xb6\xf1\xc3\xc6\x97\x0a\xbf\x2e\xbd\x20\xf0\xe4\xe9\x36\xf5\x7d\x39\x5f\x9f\x0d\x49\x2f\xe2\xa9\x87\x5a\x38\x10\x2a\x06\xbf\x2d\xe4\xfe\x40\xa4\x78\x3b\xb7\xa5\x93\x5e\x6d\xe5\xee\xa1\xd6\xcd\xf9\x6e\x7f\xb1\x7d\x56\xa7\x0d\x5f\x06\xc9\xa1\x05\x47\x43\xee\x0e\xba\x14\xb1\xf5\xed\xe1\x39\x2d\x92\x57\x5b\xfc\xee\x5e\x46\xaf\xaf\x4e\x0d\x45\xfb\x61\x6b\x44\xa9\x43\xec\x63\x48\x1c\x0e\x41\x84\xf3\xad\xb1\xb5\x66\x22\xef\xb3\x81\xea\x65\xb5\xcc\x6d\x5a\x4b\xd6\xd6\x22\x40\x41\x46\x35\x17\xf7\xf8\x13\x10\x51\x3a\x14\x5c\x0e\x6f\x75\xb9\x3d\xd4\x4c\xd4\x5f\x1a\x35\x5b\xee\xc8\xe6\x65\x9f\xee\x05\x29\x69\xa3\x2b\x0e\x5c\xff\x78\x73\x26\x2b\x6a\x8f\x1d\x64\x11\x0e\x7e\x88\x43\xb4\xca\x6b\xb3\x78\x7c\x1c\x4c\x1c\x91\xc9\x1d\x0b\xd0\xa9\xd3\x12\x02\xec\x9a\xb4\x81\x26\x60\xfa\xa1\x49\xf3\xd4\xd8\x72\xc8\x33\x61\x5a\xa8\x18\xa2\x5e\xce\x6f\xc9\x3f\x93\x7f\x11\x94\x1e\x1a\x5f\xbf\x87\xeb\xab\xd3\xe3\xbd\x13\xef\xaf\x7f\xfa\x70\x76\x6f\xdb\xaf\x7f\x7a\xaf\x06\x68\x1d\x72\x3e\xcf\x26\x76\x98\xab\xd1\xc1\x84\x92\x15\xbc\xab\xea\xae\x1c\xd2\x34\x4d\x93\x2c\x53\x8c\x3c\xf7\x0f\x8d\x9b\xf9\xba\x64\x16\x05\x8e\x71\x6c\x94\x49\x56\x55\x59\x5a\xa6\x61\xe0\x47\xb1\xe7\x47\xdb\xfd\x79\x64\x54\x43\xb9\x17\xbe\xd6\xe9\x5e\xa4\x2d\x54\xe7\xb6\x97\x83\x5b\x43\xee\xd9\xe2\x31\x69\xab\x6f\x63\x93\x51\x33\xc5\xe7\x76\x8f\x9f\x54\xd6\x37\xeb\xe6\x4c\xde\xab\xd3\x32\x50\x7f\x31\x16\x42\x19\xea\xe0\xcc\x16\x72\x4c\xef\x5b\xd0\xd9\x12\xf8\xcc\xbf\xe7\x7f\x26\x77\x8f\x15\x8f\x4e\xc5\x2c\x08\x4c\xee\x6e\x5b\x41\xd5\xbd\xed\xe4\x6e\x19\xb0\x63\x34\x9a\x8e\x35\xb1\x7a\xb5\x16\xb2\x73\xf2\x44\x76\xf6\xc7\xe5\xb5\xfd\xf5\x5e\x76\x69\xc6\xd1\x3a\x0c\xb4\x5d\xba\x75\x56\x36\x31\x46\x9f\xba\x4b\x77\x94\xa7\x65\xc4\x56\x77\x0b\xd7\xa0\xf1\x78\xbc\x27\x8a\xf4\x6a\x2f\x77\x22\xc7\xf2\xbb\x23\x96\x87\xf6\x2e\x76\x5b\x02\xea\x64\xbf\xdb\x83\x49\x0b\xd4\x41\x07\xdb\xc2\x42\x98\x37\x43\x69\x4a\x5c\x5d\xbc\x04\x0b\xb9\x7b\xda\x34\x3b\xe8\x9e\x27\xcd\x87\x81\xe6\x1b\x8d\xe1\x48\xe3\x77\xdb\x2c\xf7\x94\x86\xb2\xbb\x3a\x52\xb9\xda\xc1\x6e\xbf\x03\x93\xa6\x68\x01\x01\xcb\x44\x8e\x39\x0c\x68\x2b\x16\xe7\x98\x73\x0e\x29\xe6\x72\x87\x04\xab\x8d\x50\xd6\x71\x70\x0f\x86\x6d\x4b\x13\xb6\xa8\x43\x8c\x5b\x6c\x62\x91\xe1\xa8\x2b\xff\xf8\xa9\xae\xec\x77\x1f\x1e\x48\xbf\xd0\x19\x87\x32\x24\x03\x10\x73\x75\x3d\x28\x41\xfd\x53\xf5\x41\x1d\x4b\xdd\x29\x5c\x9d\xe6\xad\xa0\x65\x92\x51\x9d\x8e\x7d\x7b\xd9\xb3\xa3\x74\xec\x4f\xf7\xa7\x60\x09\xee\x19\xe0\x98\x6b\xd4\x23\xb8\x57\xa2\x41\xcd\xc5\xa7\xc5\xaa\xee\xcb\x84\xcd\xd6\x70\x32\xcc\x0c\x7b\x26\x8d\x6c\x16\xbc\x1b\x35\x22\x77\x44\x22\x3b\xc1\xbb\xd3\xfd\xb5\x48\xa7\x3d\x74\x62\xfd\xcd\x95\x74\x75\x72\x75\x72\x25\xa9\xfd\x62\x2d\xd6\xca\xbf\x09\x74\x13\x6b\x64\x82\x7d\xe3\xa1\xaf\xad\xc2\x2e\xdc\xc2\x91\x3b\xc6\x96\x19\x6b\xdd\xc9\x3d\x9d\xa6\xfd\x12\x30\x46\x45\xf9\xab\x25\xdb\xee\xa8\x22\xa5\x16\x08\x9d\xdc\x91\x53\x72\x2e\x2a\x50\xac\x3a\xb9\xf6\xec\xc7\x27\x3d\x13\x9a\x29\x7f\x5e\x31\x3d\xf4\x0f\x05\x8d\xd1\x99\x80\x58\x58\x21\x87\x16\x3d\xd5\x3d\xf8\x50\x14\x60\x34\x65\xd9\x94\x4d\x94\x24\x51\x94\x24\xab\x82\x7a\x2b\x20\x3b\x77\x56\x3c\x4e\x9e\xdf\x91\x20\x70\xe7\xbc\x14\x1b\x36\x23\xdf\x8f\x63\x5f\xe8\x28\x85\x9c\x4c\x6a\x24\x74\x6f\xd5\x9a\x27\xb2\xa9\x46\xfc\x10\x73\x2e\xb1\x43\x2c\xf7\x07\xd3\x71\xa4\x71\x93\x3d\x0a\x4c\x3c\xd3\x0a\x0b\x23\x2c\xdd\xbd\xb8\x89\x0a\x97\x8c\x4b\x39\xe7\x87\x94\x73\x29\x3f\xa4\x72\x8b\x1d\x38\x07\xdb\x71\x5a\xf0\x89\x0c\x0e\x19\xd4\xe1\xf8\xec\x56\x87\xf5\xe5\xf3\x2f\x7f\x76\x38\xe4\x9c\x63\xca\x39\xe4\x98\xd2\x80\x43\xc6\x39\x66\x9c\x43\x86\xd9\xb1\x79\xd3\xb6\x45\x56\xe0\xc9\x0f\x44\x02\x87\x74\x5a\x22\x64\xd6\x14\x7e\xac\x90\xda\xdd\xd5\x4e\x48\xed\x0b\x32\x4a\x13\xe0\x14\x41\x60\x73\x08\xe3\x55\x6e\x9f\x53\xad\xb1\x6f\xb2\x16\x3a\xd0\x71\x46\xbb\xca\x4a\xc9\x7b\x4a\x0b\xc0\x20\x9d\xda\xca\x13\xf9\x87\x23\x1d\x22\xd4\x83\x28\xda\x0f\xb2\xc3\x97\x3e\x04\x1f\x52\x83\x83\x0d\x56\x88\x9e\xe4\x61\x32\x14\x11\x54\x60\x24\x09\xce\x18\x45\x45\x4b\x28\xa9\x49\xa7\xc5\x02\xef\xef\x1e\x75\x6c\x43\xfb\x44\xe1\xde\x2b\x59\x88\x75\x04\xb9\xcd\x81\x45\xd8\x1e\x2a\x1f\xc7\x18\x42\xab\x04\x3d\x6e\xe9\x84\x4d\x97\xb6\xd0\xcf\x77\x04\xad\x26\xab\x21\xc5\xba\xcf\x3a\x18\xbb\x0e\x33\x96\xe5\x84\x42\x4d\x1a\x35\x50\x42\xf2\x0f\x42\x97\xaf\xaf\x4e\xbf\x15\x67\x63\x45\xdc\xa0\x3c\x11\x3a\xa9\x66\x33\xe8\xd8\xe1\x88\x03\x76\xa0\x83\x28\x85\xdb\xf5\xbd\xdc\x67\x99\x89\xd3\x38\xe1\x08\xe6\x34\x82\x91\x36\x4d\x53\xd7\x4d\x73\xac\x21\x49\x7a\x75\x92\x7b\xc1\x8b\xd3\xfd\xbb\x87\x49\x6e\x7f\xad\xb6\x4b\x61\xd1\x34\x42\xa3\x60\xcb\x1c\xd2\xcc\x5e\xf2\xd5\x90\x0f\x75\xd1\x42\x81\xf9\x50\x34\xd4\x64\xab\x1f\x54\x92\x56\x5b\xe7\x8e\x9d\xd8\xd1\x7b\xba\x3f\xfd\xe6\xdd\xd9\x93\xc9\xf2\xfc\xf8\x9b\xf7\xeb\x6f\x3e\xbc\xbb\xb9\xde\x5f\x6b\x16\xd6\x5d\x15\xe2\x10\xfa\x38\x86\x10\x9a\x38\x05\xd8\x96\x79\x38\x78\x01\x4e\x21\x6b\x75\x1c\xe4\x9e\x25\x03\x56\x7e\xb1\xce\x9f\x4d\x5d\x70\xe8\x13\xc6\xc2\x1a\x07\xbf\xc8\xc1\xc4\xa6\xca\x7d\x08\x86\x90\x1d\xed\x50\xaf\x4e\x4a\x70\x5c\x8f\x59\xf5\xf3\x49\x6f\xc8\xcd\xfe\x5a\x09\x97\x58\xd6\x17\x66\xd1\x24\x42\x3d\x2f\x96\x49\x6c\xe9\x33\x96\x5c\x09\x18\xc3\x8e\x61\x52\x14\x1c\x1c\x1c\xaa\xc2\x03\xa7\x3a\xd6\xbf\x8b\xc9\x24\x7c\x9a\x5f\x1d\x67\x1c\xe5\xf2\xe2\x7a\x0f\xb1\x42\xf8\x6d\x65\xc8\xd1\x2d\x5f\x15\x0e\x46\xce\xb2\x49\x7c\x3e\x7f\x32\xaf\x9d\xae\x96\xef\x38\x97\x26\xb7\xb5\x6c\xdf\xf6\xc2\xc5\xe8\xd8\x5c\x60\xc7\xa4\x51\xd4\xcc\x1b\xd5\x5a\xee\x8f\xfb\xe5\x36\xdc\xdb\x3e\xaf\xd5\x9e\x65\xb7\x44\x71\x3f\xe6\x90\x45\x3c\x02\x3f\xe6\x89\xdc\x33\x76\x28\x19\xa3\xe9\x92\xaf\x2f\xb1\xaf\xd6\x27\x91\xda\x2a\xbe\xd8\xdf\xf5\x8d\x58\xb1\x3f\xb6\x23\x6c\xd4\xee\x1b\x71\xa9\x89\xf1\x54\x5a\x14\xb2\x0c\xd2\xf8\x31\xa3\x09\x83\x72\xc6\xf9\x8e\xcc\x30\x57\x55\x55\xd5\x55\xa5\xf8\x8c\xe1\xb8\xb2\x24\x8a\x2c\xec\x58\x5d\x33\x70\xa2\xf8\xf8\x45\x08\x48\xc1\x5d\xae\x74\xaa\x77\xac\xe0\xb6\x76\xef\x5c\x0a\x38\x0c\x68\x71\xd5\x5b\x5c\x76\xd8\xf6\xfd\xd0\xfe\x2e\x57\x22\xd5\x3b\xd6\x6f\x13\x2a\xbc\xdb\xef\xce\x69\xcf\xc1\xe7\x1c\x6b\xae\x5a\x8b\x25\x91\x9f\x7d\xc9\x5a\x7c\x02\x92\x7f\x97\x2b\xed\xe3\xe7\x8f\xac\x3b\x97\x7c\xd1\xf6\xb1\x7d\x34\x39\xd6\x6c\xa9\x08\xa5\xdd\x43\xfb\xbf\x7d\x4e\x61\xb5\x89\xb4\xe3\x10\x70\x8e\x95\xc8\xc1\x54\xaa\x85\x21\xb4\x3f\xfb\x34\x44\x83\xe6\xb0\xf6\x83\xba\x77\xb9\xe2\x3e\xf4\x43\xe4\x97\x64\xc6\xf9\xc2\x69\xa4\x7a\x3f\xfb\x52\xbe\xd5\x5f\x83\xfa\x88\x4b\x7a\xa8\x44\xb7\x11\xba\x56\x6c\xce\x31\xe6\x1c\x6d\xf1\xf9\x9e\x36\x3f\xb7\x74\x60\x22\xa7\x7e\x6c\xfb\x37\x8f\x6d\x3f\xb4\xcf\x68\xbc\xbe\xd6\x67\xa8\xcd\x20\x64\xe2\x3e\x83\x7b\x1a\xbf\x7d\xac\x76\x77\xff\xd4\x03\x1d\x42\xc9\xfa\x5a\x9f\x54\xd9\xcf\x2d\x74\x0c\x44\xc1\x37\x20\x15\x38\x5a\x28\xd7\x47\xff\x4d\x44\xe4\x5a\xf8\x73\x28\x11\x0e\x2d\x63\x74\x5a\x8c\x2d\x8e\x2a\xee\x72\xb1\xdf\xfd\xb7\x8f\x63\xb7\xca\xf4\xee\x6a\x77\xa1\x98\x1c\x18\xc6\xfc\xb6\x30\xa1\xe7\xd4\x50\xbd\xc3\xcc\x0e\x23\x4c\x21\xb3\x24\xeb\x30\xd9\xc7\xe7\xd5\xfa\x78\x4e\xea\x6a\xb7\x3e\x77\x25\x98\x71\xbe\xb5\x43\x0d\x0e\x3d\x9f\x38\x9f\xf8\xc1\x32\x21\x93\xd9\x52\xd8\x52\xbb\x98\x92\xf1\xb3\x2f\x19\x4b\x08\x6d\xc8\x2c\xb1\x06\x9f\xab\xe1\x13\xfe\xdc\x63\xa8\x39\xbf\xb5\x4c\x4a\x38\x0d\x05\x7f\xac\x82\xb9\x74\x5a\x6c\x8f\x00\x61\xe0\x69\xf1\x83\x6e\x3d\x68\x89\x16\xff\xec\xc0\xe4\x70\x07\xb8\xcf\x7d\xe8\x19\xa3\xf5\x22\x12\x79\x62\xef\x40\xae\x85\x72\x71\xef\xd7\x8a\xec\x54\x78\x98\xd8\x61\x92\x8b\xe2\x36\x97\xd3\x82\xdc\xef\x51\x56\x13\x21\x0b\xbf\x7d\x1c\xb1\x0b\xe5\xf2\xe2\x54\xd9\x9d\x2b\x1d\xe7\x18\x42\x79\xe8\xd0\x31\xe5\x04\x4d\x2e\xb0\x4d\x6c\x32\x99\xc7\xac\x43\x71\x7f\x67\xfa\xc6\x9b\x55\x4e\x4e\x9e\x8f\xe2\x7d\x4b\xaa\xc9\x39\xb2\x55\x2c\x21\x58\x18\xe6\xa6\x94\x61\xc5\x8f\xe3\xd9\x51\xc6\xb8\x59\xf8\xcc\x3c\xf4\x44\x9c\xaf\xc9\xd5\xe8\x29\x8f\x36\x3e\x29\x0d\xe7\xcb\xc4\x17\x6e\x2a\x42\xee\x64\xdd\x3a\x4c\x92\x6e\xb3\x40\x9c\xe3\x48\xb5\x50\xce\x8f\x3c\xda\xd4\x41\xf4\x19\x6d\x8e\x2e\x47\x47\xce\xd9\xda\xed\x5b\x2e\x47\x6c\xe5\x0f\x0c\x5a\x4c\x53\x11\x77\x9e\xee\xaf\xb5\xf8\x67\x97\xa6\x6c\x93\xa9\x95\xfe\x53\xfd\x58\x69\x33\xce\x6f\x4d\x53\x11\x22\x48\x79\xca\x52\x51\xef\x31\x97\x03\xd1\xef\xc7\x7a\x8f\xde\xcf\xfe\x43\xbc\xe0\x88\x38\xeb\xef\x1f\x22\xad\xab\x9d\x75\x71\x26\xef\x65\x87\xd3\x68\x21\x87\xb9\x04\x03\x0c\x03\x1b\x8c\x45\xf4\x25\x0d\x87\xda\xcd\xfc\xfb\xb8\x6f\xf3\xff\xb4\xa3\x7d\xdc\xe2\x8d\xab\x63\xb4\x31\x2c\x03\xf5\x16\xfb\x30\x70\xd0\x67\x13\x5b\xcc\xe4\x8e\x2d\x3e\x93\x46\xfd\xb1\x0d\xd2\x93\xee\xe8\x0f\x7f\xf3\xd2\x1f\x3e\x42\x51\x9a\x08\xdb\x18\x72\x87\x83\x1f\xe1\xfc\x71\xe0\x60\xac\x1e\x64\x83\x89\x64\x20\x1f\x56\x1f\xb8\xae\x97\xb9\xcd\x6a\xc9\x3e\xb6\x2c\x91\x81\x4c\x9a\xa3\xd8\x84\x6e\xbd\xfb\x15\xec\x41\x7a\xe8\x9d\x12\x43\x7b\x88\xa0\x9f\xa0\xff\x58\x70\x20\x40\x0c\xec\x30\x53\xec\xdb\x9e\xf6\x4b\x25\x79\xf7\x00\x25\x32\x91\x5e\x73\xe5\x89\x18\xe4\x9f\xc5\x4d\x2e\x97\x1f\x84\xe7\x73\xa6\xbd\xa7\xd7\x9a\xaa\xa9\x9b\xd7\x7e\x73\x1f\x94\x6c\xf1\xae\x15\xf5\x26\x1f\xe3\x20\x33\x4c\xc7\xbd\xcd\x60\xc4\xba\xed\x2d\xec\xb1\x05\x1f\x6b\xaa\x43\xc3\x71\x18\xb2\x0a\x2a\x70\xb0\xc5\xb0\xca\x7c\x30\x03\x27\x8d\x22\xa9\x7c\xea\xc5\x3f\xc6\xd8\x64\x24\xa3\xe6\x0a\x5e\x9f\x3e\xf2\x5a\x78\xdb\x0f\x3e\xbd\x66\x2e\x23\x75\x17\xe7\x90\x51\x86\xc6\xa3\x3f\x3f\xa1\x7e\xcf\xf9\xcd\xbd\x5e\x1b\x4f\xfb\x6d\x2f\xf7\x48\x06\x2d\x3d\xf6\xef\x5f\xc8\x5f\xbe\xd4\xc3\x1f\x6f\xce\x54\xed\x31\x24\x3a\x17\x21\xd1\xc9\x2a\x77\x71\xdc\x59\xc7\xbe\xba\xee\xad\x07\x2d\xf6\x05\xb3\xc6\x19\x2c\xec\xa5\x84\xb1\x96\xb1\xb6\x7d\xec\x6b\x50\x66\x3e\x18\xa1\x17\xc7\x91\x54\xad\xe1\x92\x70\xae\x3f\x17\x2d\x49\xa2\xcf\xc9\x71\x0c\x4f\x1e\xc6\xf0\x79\x1c\x53\xde\x8f\x64\xf7\x31\xa2\x1c\x75\x20\x60\x5a\x22\x38\x9b\x91\x3c\x0c\xa8\x2f\x22\x40\xd1\x71\x11\x5c\xae\xfd\x6e\x85\xbd\xfa\x7b\xb2\xdb\xea\xa4\x9c\x3c\x8f\x2e\xbf\x1e\xdf\x8f\x82\x94\x01\xb6\x89\x4c\x44\x4c\x44\xcd\x0e\x31\xe4\x2c\xe3\x1d\x2b\x5b\xde\xad\x21\x44\x98\xa6\xc7\xd0\xf3\x48\x98\x31\x86\x43\x1c\x9b\x6d\x51\x76\x5d\x59\xb4\x49\x16\x27\x69\x16\xc7\x19\x91\xc1\x3c\xc6\xa1\xbf\x11\x15\x18\xbf\x5b\x63\x88\xe7\xb1\xa7\xf4\x34\xa6\x70\x1f\x83\xce\x99\xdf\xc7\xb9\x12\x7b\xc9\x43\xc9\x39\x58\xae\x2b\x0d\x87\x49\x58\x91\x55\xd7\x02\x79\x7a\x88\xa7\x9f\xf8\xf1\xef\xe9\xd3\x98\x45\x49\x7c\x9c\x62\xf0\x84\x67\x5c\xf4\x68\x3c\xc4\x09\xb4\xc4\xb1\xc9\x1a\x68\xc1\xc4\x01\xbd\x75\x30\x09\xe5\x4f\xa8\x10\xd1\x97\x49\x0b\x1e\x74\x6f\xf7\x30\x72\x4f\x29\x30\xa8\x0f\x39\x34\x03\xd4\x4b\xf8\xd0\x83\xc7\xf1\x7a\xd2\xa2\x4c\x8d\xbb\x4a\x25\xca\x2c\x62\xab\x7f\x14\xe7\x54\x9e\xc6\xfe\xc7\x51\x92\xcf\xbf\xff\xe1\xfa\xa7\x0f\x4f\x3d\x29\x95\xf0\x25\xe0\x9c\x56\x4b\x00\x84\xd5\xfd\x1d\xe9\x87\x3b\xd2\x83\xce\xca\x92\x15\x65\xa9\xcc\x4b\x68\xdb\xb4\x44\x13\x82\x25\xc8\x73\xa3\x67\x65\xdf\x97\xac\xcf\xf2\x38\xce\xd7\xd7\xb1\x5e\x80\xf0\xc3\x3b\xa2\x88\xb8\xf3\x98\xdd\x78\x99\x1b\x90\x7d\x5a\xf2\x65\xc6\x81\x73\xf4\x39\x87\x1a\xfd\x2d\xb1\xc1\xc1\x39\x18\xae\x2b\x4d\xd8\xa1\x01\x91\xa8\xef\xbd\x8e\x45\x7f\xd4\xe7\x6d\x67\xca\x51\xa3\x5f\x8e\xba\x66\x2c\x3d\x0d\x16\xf3\x79\xb3\x9b\x32\x63\xfb\x49\xcb\x32\x69\x48\xaf\x05\xe2\xdc\xff\xef\xc5\x1e\x4d\xa1\xcf\xd7\xcf\xf4\xf9\x85\x06\x6f\xdd\x91\xa2\xb8\x37\xf9\x14\x07\xf9\x6a\xb3\x90\x33\x36\x72\x3e\x8e\x52\x4f\x4d\x8e\xf9\xb0\x0e\xf9\x1a\x09\xb9\x75\xe6\x83\x13\xb9\x49\x1a\xd3\xf8\x33\xe2\x76\xb4\x57\x2b\x8e\x41\x8b\x1f\x70\xd8\x6f\xc1\x71\x64\xc1\x17\x90\x28\x1d\x4e\xe0\xa3\xf9\x56\x28\x1b\x8f\xb6\x73\x8d\xa4\xd7\x12\x91\x2f\xfc\xfd\xd1\x03\x7f\x9e\x31\xfc\x84\xe9\x26\xb6\x50\xc4\xd8\x07\x3e\x76\x11\x44\xab\xdd\x9a\x9e\xf1\x3f\x41\xbf\x4a\x39\xb8\x38\x35\x69\x0d\x55\xcc\x3e\x33\x16\xab\xfd\xea\x35\x47\xde\xee\xd4\xfe\xee\x71\x8c\xd7\xc8\xe3\xe2\x25\x49\x1d\x75\x6a\x89\x84\x8b\x8e\xce\x23\x2d\xc9\xbb\xcf\xb7\x84\x9f\x11\x23\x22\x53\x73\xd5\x0d\xd5\x7c\x92\xa5\xbc\x7e\x68\xf9\x14\xae\xf7\xa7\x27\x5f\xd6\x0f\x25\xe2\x7c\x09\x39\xa7\xe5\x12\xce\xac\xe9\xef\xc8\x30\xae\xfa\x61\xf0\xb2\xe4\xac\x2c\x95\xb8\x5a\x6c\xdb\xa6\x7d\x85\xac\xeb\xb0\xfa\xbc\x86\xa8\xe0\xde\x55\x6a\x7f\xc4\xf0\x1d\xf9\x03\xf9\x0b\xf9\xb7\x4f\x71\x7c\xe6\xe7\x2f\xea\xed\x6a\xde\x1a\xce\xc1\xc3\x06\xad\xc7\xef\xa1\xff\x02\x48\xc7\xb6\x69\x57\x21\x6f\x5b\x88\x9e\xfe\x84\x65\x96\x7d\x56\xa9\x29\x19\x48\xaf\x91\xcf\xe6\xac\xb7\x7b\x32\x68\x1f\xae\x5e\x47\x6a\x97\xc0\x63\x6c\x46\x3a\xf3\xa5\xa4\x33\x36\x5d\xd6\xc3\xd8\x76\x68\x36\x69\x75\x9f\xb2\x26\x94\xe4\xc2\x97\xea\x3e\x97\x03\x17\x8e\x15\x0d\x02\x9c\x13\x91\x17\x49\x63\x1c\x81\x09\xff\x8a\x56\x38\x56\x59\x03\xf5\x34\xa3\x5f\x65\x6c\xf5\x3c\xd8\x8b\xf6\x3e\xf1\x8b\x8e\x62\xf4\xa2\x45\x39\x59\x3a\x1a\x2e\xfa\x27\x4d\xfa\x47\x4d\x90\x48\x7e\x9c\x63\x9e\xe5\x71\xee\x5b\x7d\x21\x90\x4f\x5a\x8f\x23\x9c\x24\xfe\x38\xe3\x3c\xa5\xe0\x95\x19\xa7\xfa\x27\x73\x37\x25\x31\x19\xb5\x52\xd0\xfa\xa7\x97\x39\x98\x97\xea\x47\x2d\x1f\xe7\x18\x5c\x87\x43\x12\xe1\x20\xcf\xd8\x42\x1e\x61\xe7\x07\x22\x03\x6a\x63\x4b\x4b\x9c\xaa\xac\x86\x7a\xd5\x7b\xbf\xcc\xb8\xe4\xb1\x08\xdd\x2a\xad\xc0\xc3\xbe\x49\x1b\xa8\xc3\x63\x3c\x18\x90\x51\xcd\x15\x4b\xcc\x3d\xeb\xbc\xf3\x2b\xd8\xcb\x3a\xcd\x3e\xb6\xb4\xc6\x40\x72\x14\xeb\xb6\x95\xac\x25\xdd\xce\xb1\x11\xa6\x05\x4a\x20\xf2\x37\x7f\x14\x75\x75\xae\xaf\x4e\xbf\x7d\x27\x2a\x82\xd2\xdd\x4f\xef\x9e\xce\xf8\x17\x5f\xfe\x13\x35\x59\x5e\x8d\x65\x39\x36\x5d\x54\x14\x51\x54\xe4\xb4\x61\x59\x3d\x96\xd5\xd0\x74\xab\xc8\x45\x45\x21\xf7\x69\x66\xe1\x38\xdc\x11\x1c\xc0\x02\x32\x81\x99\x76\x4d\xd3\xb6\x4d\xd3\x15\x69\x66\xe2\xf0\xf0\xa7\x11\xac\xb4\x6d\xb7\x3f\x89\x3e\x51\x83\x4c\xca\xa4\x18\x8f\x79\xa6\x55\x6f\xc8\xa7\x7a\x23\x55\xac\x19\x71\x1a\x46\x9c\x07\x30\x78\x55\x71\x56\xd7\x72\xc2\xb9\x31\x57\xed\x1d\x99\xbb\x6a\xce\xca\x2c\x2f\xcb\x3c\x2b\x45\x4c\x44\x3a\xcd\x39\xb6\x7b\xf9\xd0\xfb\x6f\xd6\x2e\x5e\x3f\xef\xa2\xf2\x4c\x54\x66\x96\x57\x43\x55\xf6\x75\x1b\x65\x59\x14\xe7\x39\x1d\x03\xa1\x2c\x22\x59\x7d\x47\xe4\x32\x8e\xad\x3b\xd2\x8e\x38\x83\x3e\x76\xa0\x67\x55\xc9\xeb\x9a\xf3\x7a\xc6\x6a\x5c\xfd\x75\x5e\x2e\x73\x97\xd6\x44\x16\x18\xdc\xa3\xaf\x20\xf2\x23\x47\x5f\xe1\x2b\x58\x12\x68\x0f\x31\x74\x13\xf4\xb7\xfc\x25\x92\x07\x0f\xc2\xfa\x12\x04\x22\x43\x74\xc7\xd5\x42\x99\x45\x3c\xff\xb0\xb2\xf3\x34\x6a\xfd\x9a\x6d\x0a\x6e\x03\x79\xfa\xd8\x41\xe0\x71\x17\xa2\x80\xf9\x18\x3f\xb7\x4a\x15\x2b\xaa\x52\x99\x19\x5b\x26\xc6\xc0\xc5\x76\x7d\x61\x93\x65\x66\xc7\xca\xa1\xaf\x58\x97\xe6\x71\x5c\x14\xab\x25\xd2\x49\x4e\x72\xad\x50\xcc\x63\x2d\xfd\x0d\xcf\x7f\x15\x77\xa0\x9f\x8a\x7d\xe9\xd7\xca\xf1\xff\xaf\x78\xa3\x17\x5f\xfe\x13\x9d\x31\x54\x02\x0c\x70\x3e\x70\x4d\x3f\xb0\xa5\x29\x0a\xde\x55\x55\x57\x75\x71\x9a\xc6\x71\x9a\xd2\x99\xe5\x65\x57\xd5\x6d\xd9\xaf\xbf\x89\xb2\x54\x31\x19\x63\x6c\x5e\xdf\x70\x0e\x02\xb3\xca\x8a\xba\x2e\xf2\x2a\x4d\x82\x20\x8e\x83\x30\xce\x3f\xf7\x4b\x22\x89\xfd\xe0\xb1\xc8\xcf\xbf\x13\x7b\xbd\xbe\x8e\x7a\x0d\x67\x25\x93\x55\xed\xdc\x75\x73\x37\xe7\x9c\xe7\x39\xe7\x8a\xc1\x39\x06\x69\x6a\x0e\x65\x35\x8e\x55\x39\x64\x45\x9a\x14\x45\x92\x16\x8f\x39\x92\x78\xab\x3d\xf4\x34\x0f\x75\x9f\xa3\x10\x79\x8a\x88\xaf\xf3\xe3\x6a\x88\xf8\x6d\x60\x81\xc7\xc1\xe2\xe0\xa8\xde\xd2\x32\x6c\xd8\x32\x51\x3d\x62\x26\x9d\x17\xc3\xa2\xdd\xe2\x9a\xc2\xde\x16\x77\x4c\x8d\x55\xff\x38\x53\x5f\xed\x6e\x76\xdb\xeb\x69\x06\xe5\xcf\x22\x6b\x50\xf2\x96\xf7\x5c\x7c\x1d\x6c\x0b\x4c\x29\xe3\x5c\xae\x96\xd8\xa0\xf9\x92\x1b\x52\x87\x3e\x8c\x3f\x07\x34\x5d\x06\x68\x82\xc2\xe2\x60\x6e\xfb\x40\x72\xf5\x31\xb7\xf3\x1c\x6f\xc5\xf9\xad\x63\x80\xcb\xc1\xe6\xe0\x89\xe8\xfd\x1e\xa1\x49\xfb\x15\x21\x25\xe5\x43\xbe\xe1\xec\x31\x07\x72\xfd\x24\x7b\xb1\xd3\x76\xe7\x4a\xc3\x39\x4e\x60\xac\xaf\x83\x8f\xb5\x29\x73\x1c\xca\x7e\xcb\x88\x98\xac\x65\x91\xc1\x3c\x66\x1c\x52\x29\x33\x0e\xfc\x78\x97\x47\xae\xf2\x63\x6e\xeb\xbb\x27\x79\x91\xf3\xeb\xab\xeb\xf3\xeb\x2b\xd1\xba\xb6\xb5\xae\x92\x6d\x2a\x1e\xc7\x71\x3c\xcc\x38\x9b\x52\xdd\x30\xfe\x90\x20\x81\x92\x95\xcc\x33\x98\xc3\xf4\x43\x2b\x39\xfa\xe1\x78\xaf\xe2\x86\xfb\xb7\x4f\xf3\x24\x8f\xb9\x12\x2c\x39\x0e\x1c\x2b\x53\xb1\x44\xba\xc4\x34\x0f\xa3\x64\x98\x8b\x49\x07\x93\x85\x04\x24\x97\x9a\x72\x2b\x55\x22\x67\xf2\xfd\xe3\xb1\x33\x99\x84\x49\x12\x86\x49\x42\xcd\x64\x3b\x9f\x93\x6c\xb6\xd2\x3f\xf2\xf9\x31\x57\xf7\xe4\xa9\x95\xd3\x4b\x2c\x62\xb3\x24\x39\x66\x49\xd6\x46\xc2\x28\x59\x79\x61\x88\x3b\x72\x22\xb1\x6f\xf0\x77\x84\x28\xe7\xef\x76\x86\x74\xf5\x6e\x67\x6c\xf7\x90\x8b\xea\x49\xc2\x39\xd0\xf4\xb4\x1f\xb2\xf1\xe7\xac\xef\xd3\x71\x04\x22\x0d\xe5\xa1\x65\x90\xc1\x44\x09\xe4\xc8\x96\x61\x19\x15\x8e\x29\x12\x34\x30\x83\x90\x9a\xd4\x82\x18\x83\x83\x2d\x79\x6f\xa4\x23\x64\xfb\x05\x1d\x9f\x4b\xc9\xed\xf4\x3a\x9d\xf8\xd0\xb3\x97\xfd\xf9\xee\x0b\x74\x8e\x0a\xf4\x9c\x92\xa2\x1f\x26\xc9\x3b\x58\xaf\x93\x4a\xd9\x12\x31\xa9\xdb\xe2\xa4\xa7\xf4\xfe\xf0\x45\xfe\x3d\xac\x27\xbf\xe8\x9d\x2b\x15\x8b\x25\x59\x07\x8f\x0e\x8b\xf1\x3a\xe5\x64\x19\xb1\x61\x62\x97\xf4\x3a\x97\x3f\xef\xeb\x97\xa8\x3f\x89\x1b\x9f\x53\x97\x6b\xbe\x4c\x9c\x53\x63\x79\x03\x7f\xd3\xcd\xdb\x39\x74\x94\x7d\x42\xfb\x0f\xe2\xf6\xd2\xcf\xd2\x7e\xe9\xf1\x3f\xa3\xef\x71\xbe\x94\x8c\xd1\x70\x29\x5f\x05\xb0\xf8\x60\x1d\x6c\xdb\x96\x7a\x1c\xd0\x80\x50\x5c\xe5\xf0\x82\xff\xdf\x7f\x01\x05\x55\x2e\x3f\x88\x35\xb5\x6f\xc8\x99\xf6\xc3\x73\x10\x92\x95\x60\x1e\xf6\xa0\x1b\x1c\xc8\x14\x62\xf6\x2a\x92\xc3\x88\xe9\x50\x04\x50\x80\x9e\xe7\x33\x26\x51\xd1\xbd\xe0\xc7\xf7\xe4\x2f\x5f\x40\x72\x9c\xe1\xc9\xf9\xf7\xe4\xfa\xa7\x77\x4f\xe7\xd8\xe7\xa8\x68\xc3\xaa\x01\xe7\xbe\xc3\x69\x00\x92\xd7\x75\x5e\xd4\xf5\xeb\x83\x94\xa7\xa9\x89\x43\x3f\xaf\x4e\xd5\x3c\xac\xee\x56\x55\x75\xeb\xeb\xed\xbc\x7a\xbe\xe6\xf6\x42\x45\x0c\xf4\x0c\x98\x62\xcc\xe2\x08\x8b\x08\x58\x80\xfe\x1b\x84\x96\xad\x7e\x4f\xbb\x7e\x62\x4e\x07\xaa\x7f\x2a\x3f\x67\xab\x27\xf6\x39\x34\xca\xc3\xba\xd9\x7b\x72\xf9\x59\x48\xb2\xb5\xd4\x92\x8f\x8e\x09\x63\x5c\xe1\x64\xc5\xc8\x22\xc8\x03\x0c\x5e\xc5\x35\x33\x86\x2d\xc3\xa0\x4a\x03\x70\x0a\x6c\xfa\x35\xa8\x65\x9f\xf0\xe9\x9f\xbe\x62\x13\xc5\xda\xdb\x0b\x8d\x76\xa4\x91\x1f\x0a\x53\xca\x0f\x6f\x18\xaf\xe0\x90\x43\xc9\x59\x5e\xbf\xdd\x96\x3c\x59\xc3\x7b\xc1\x89\xf9\x30\xd0\x69\x31\xde\x66\x2e\x13\x36\x33\xec\xc4\x26\x9a\x97\x63\xf1\x25\x5d\x7e\xe1\x2f\xbe\x10\x0d\x72\x3b\xcb\xde\x6d\x0e\xc4\x67\x3e\x38\x29\x4b\xdf\x82\xe1\xe5\xd2\x21\x51\x5f\x60\xf9\x8e\xd8\xe4\xa7\xaf\xe3\xb9\x5f\x53\x14\x97\x05\x7f\x59\xa3\x64\xb2\x8c\x52\x76\x1b\x52\xc2\x20\x9f\x86\x69\x84\x9e\x33\xc6\x57\x87\xef\x55\xa0\x1d\x63\x77\x84\x31\x1c\x82\xc0\xc2\x61\xf5\x01\xc1\x8a\xa3\x30\x0a\xc3\x28\x8c\x3e\xb1\xc3\x5f\xe0\x9f\x72\xb5\xbb\x3a\x3d\xdf\x9d\x5f\x08\x29\xde\xd3\x17\xf0\x5c\x3e\xcf\xfc\xd0\x84\x30\xba\xa8\x53\x6e\xbe\x8a\x8a\x2d\x31\x5b\x92\x21\x1b\xa8\xc5\x16\xfb\x33\xf3\xc1\x2b\x38\xee\xd7\x05\x3e\x8b\x23\xe4\x10\x41\x6c\x62\x82\xaf\xcf\x4a\x1b\x10\xb9\x5f\xcc\x30\x8b\x3f\x83\xe3\xe2\x15\x1c\x62\xaf\xd6\x17\x91\x44\xb4\x5b\x3a\x60\xa0\x5b\x18\xa3\xfb\x46\x30\x8a\xc1\x96\xcc\x65\xee\x27\x58\xfe\xf8\x1a\x96\xdd\x86\x45\xf9\x74\xae\x3e\xe2\x49\x68\x81\x04\x1c\x08\x57\xe6\x04\x94\xbc\x99\x41\x8a\xbd\x0c\xc8\x45\xe6\xbf\x98\xb6\xfd\x76\x2f\xe7\xef\xd7\x46\x6c\xbf\xdb\x5f\x7c\x3a\x8b\xde\xf3\xa9\x5c\x42\x6a\x60\xf1\x56\x38\xfa\x21\x62\x34\x59\x8a\x4f\x70\x9c\x7f\xd1\x1a\x3f\xe2\x10\x6b\xdb\x9f\x99\xd1\x05\x96\x85\x40\xca\x17\x5f\xe4\x4d\xde\x88\x46\x1a\xc0\x3e\x04\x52\x75\x18\xb7\x99\xfd\xe5\xb8\xfd\xcb\x2b\x88\xc4\x46\x8e\x93\xdd\xd5\x4e\xec\xeb\xf8\x2c\xa8\x31\xc0\x31\x2c\x3a\x83\x57\x2c\x9c\xdf\x0a\xcb\xc0\xaa\x2d\x7c\xc8\xc0\x00\x1d\xe7\x19\x8b\xa0\xe0\x9f\x1b\xbb\x7f\x21\x1f\x5e\x41\xf8\xe5\x54\xca\x67\xd1\xa6\x45\x5e\x8d\x9c\x0f\x75\x1b\xe6\x79\x18\xe5\x6f\x65\xa4\x12\x45\xb1\x85\xfd\x84\x13\xb6\xe0\x80\x39\x83\x93\x0e\x5d\x37\xac\xaf\xcf\xe8\xe6\x9f\xbe\x8e\x5a\x7a\x99\xb6\xfa\x1c\xd6\x0a\x07\x48\x23\x1c\xbc\x08\xfb\x18\x52\x07\x5f\x8f\x0a\xee\x4d\x06\xf3\xd6\xf9\xb7\x00\x0b\xa7\x2a\x6d\xa0\x16\xf7\x4c\x7c\xaa\x17\x7f\x7d\x15\xe5\xf5\x31\xc1\xf6\xfe\x52\xfd\xac\x97\x20\x80\x4e\x4b\x4f\x2b\x6c\xc1\x8b\x27\xd7\xc7\x21\x86\xd0\xc6\xea\xad\x7c\x8d\x85\xbb\xa0\x63\x91\xa7\xf9\x3c\xb1\x94\x43\xcc\x3e\xe5\xa7\xfd\x8a\x14\x88\x63\x52\xe2\xc2\x65\xe5\xf2\x73\x10\x31\x33\xf5\x65\xa2\x8d\xb9\x34\x21\x38\x19\xea\x6f\x9d\x07\xa4\x32\x4e\xd9\x61\x46\x9e\x73\xf0\xc4\x16\x8c\x5f\x6e\xfb\x8e\xae\x85\x58\xc9\xfe\xac\x8d\x89\x69\xbb\xf4\x94\x20\x81\x78\xb0\xb0\x7a\x83\xf3\x77\x1c\xe8\x51\x78\x1b\xae\xb8\x7e\xf6\x33\xe3\xfb\xaf\xaf\x8f\xef\xc9\xd5\xc9\xcd\xc9\x95\x74\x73\xaa\x5c\xde\x7c\x0e\x1b\x3b\x0c\x09\xb3\x5b\x87\xd9\xed\x81\x9b\xaf\x87\x13\x47\x60\x2d\xe7\x38\xa1\x6e\xc0\x88\x96\x48\x13\x10\x42\xb4\xcf\xd8\x65\x87\xfc\xfb\x2b\xdc\xfb\x85\xde\xc8\x36\xda\x1d\xda\x94\x1f\x56\x51\x02\xab\x29\xab\x06\x92\x38\x8e\xe3\x28\x8e\x7f\x89\x54\x8e\x45\x81\xb3\xe7\xdb\x38\xb2\xaa\x62\x60\xc5\xab\x63\xb2\xba\x26\x9f\xc8\xc0\xf7\x5f\xb4\xa3\x9b\xd7\x2f\x94\xe7\x46\x74\x64\xdb\xa4\xf1\xdc\xc5\xb3\xd1\x31\xa8\x1f\xa1\x93\x26\xe8\xc7\x30\x05\xe8\xc9\xed\xc2\xd8\xf2\xba\x0b\xc5\xd9\x1d\x89\xd3\xb8\x6f\xb2\x34\x99\xd9\x62\xb0\x25\xa1\x85\x88\xd7\xad\xbb\x48\x1b\x1e\xfc\x3d\xa2\x5c\xae\xe8\x6e\xee\xd1\x9d\xad\x6f\xd2\xfe\x74\xaf\xd9\x59\x55\x65\xf5\xcf\x7a\xdb\x26\x55\x65\x29\xd1\x47\xce\x2d\x68\x80\x03\x83\xc6\x46\x1b\x43\xf4\xd1\x85\x1c\x66\x98\x21\xb7\xb1\x40\x13\x2d\xcc\x64\xbd\x24\xf2\x0b\x1a\xdf\x7d\x96\xca\x77\x70\xbc\x10\xe3\x39\xa5\x50\x4e\x6f\xf3\x5c\x61\x1f\xe3\xb7\x90\x53\x6a\x7e\x48\xb7\x1c\xd3\x3d\xcd\xdf\x91\x7f\x12\xe7\xdf\xf6\xa7\xf7\x24\xa5\xcb\x9b\xfd\x99\xf6\x8c\xee\xc9\xfe\x74\x0f\x86\xd2\x27\x55\x56\xd7\x99\xf3\xd1\xf3\x92\x95\x7a\x1c\x2b\xe6\xc7\xd1\x97\xf3\xdb\xb4\x4a\x21\x02\xff\x19\x75\x8b\x31\xeb\x39\x82\x02\x5b\xc5\x63\xe8\x31\xa2\x3e\xeb\xf3\x6a\x97\xfe\x42\xae\x3e\xcf\xdd\xa7\xf9\x81\xef\xdf\x5f\xef\xce\x77\x86\x76\x09\xbb\x6f\xfe\x1b\xec\xe0\xc3\xef\xe0\xfc\x39\x3f\x14\xa7\x38\x10\xce\x65\x82\x73\xe0\x4f\x73\x4a\x67\x7b\x38\x90\xbe\x7f\x0b\x77\x54\xf7\xa3\x9d\xe7\x4a\x7f\xeb\x82\xe1\xfb\x94\xe3\x88\xd9\x14\x49\xf6\x52\x38\x94\x1f\x86\x7e\x9d\xaf\x44\x5e\xf2\x1e\xbb\x2d\x6e\xdb\x11\xe3\xb2\xbb\x7a\xc6\xbf\x6f\x1f\x19\x78\xb2\x5d\xda\x71\x22\x36\x49\x40\x26\x8f\x4b\x15\x52\x67\xc8\x05\x2b\xad\x8f\xb1\x61\x0a\x5e\x66\x10\x66\x58\x41\x1c\xa2\x01\x25\xb5\x31\x54\x78\x81\xe1\x42\x52\xc8\x21\x7e\xce\xd7\xd0\xb1\x5f\x30\x36\xc6\x32\xa5\x49\x01\xe5\x6d\x28\x8e\xa0\xbe\xe0\xef\xef\xc4\x4d\x66\x7f\xfc\x02\x7f\x45\x3d\xc0\xb5\x17\x8a\x38\x49\x06\xe2\x3c\xee\x73\xae\x52\x1e\x39\xa5\x13\x2e\x93\x92\x7c\x2c\x20\x29\xda\x2e\x9b\x24\xbd\x67\x65\xd1\xbd\x89\xb1\x45\x51\xbb\x35\xc3\x8c\x97\x01\x5a\x38\x25\x10\x40\x86\x25\xc6\x3e\x94\xe2\xc8\xdf\x0b\x3d\x7b\xff\x05\xa4\x67\xca\xe3\x41\xa6\x2d\x57\xfb\x62\xf0\x5d\x63\x31\x1d\x1a\x2d\x49\x10\xa0\x65\xc2\xfc\x36\x1d\xac\xb9\xbf\x94\x36\xf3\x03\x1a\x3b\xdc\xa5\x06\x92\x17\x3a\x29\x6e\x75\xfa\x2c\xa2\x77\xe4\x4c\x23\xd2\xfe\x8c\xc2\x25\x79\x8e\x45\x2a\x2c\x30\x9a\x08\xbd\x04\x33\x66\xaf\xf6\x28\x7f\x13\xab\x08\xc6\x4b\x58\x95\xc0\xa5\xce\x38\x44\xe8\xe4\x50\x7e\xc2\x9f\xcf\x6b\xca\x77\xb0\x17\x97\xbf\xef\x77\xdf\x5c\xfd\x28\x6e\xe6\x11\x56\x7e\xb7\xa7\x44\x13\x97\x33\x3c\x07\xe8\x42\xac\x73\x1d\x9a\xc8\x77\x74\x6e\xb8\x4e\x5d\x86\x38\xda\x38\xf4\xe1\xd0\x5b\xf8\x26\xce\x29\x16\x6f\x1a\x7e\x3b\xfb\x21\x10\x07\xc7\x30\x08\x62\x89\xa1\x85\x5e\x91\x73\x28\x21\x7a\x89\xfb\x0f\x5f\xb2\x9f\xbb\xfb\x9d\x95\x2f\x30\x7a\x34\xab\x68\xbe\xa4\xd5\x92\xbd\x69\x24\x6d\x9a\x2d\x59\x79\x48\x25\xb1\xcf\x97\xe8\x4f\xe6\x96\x3f\x8a\xda\x37\x9f\xce\x2d\xdf\x81\x58\x4f\x38\x3d\x3f\xfd\xf6\x4c\xbb\xdc\x9d\xef\x54\xed\xf2\xdd\xc9\x39\x9c\xa9\xda\xd5\xee\x61\x31\x43\xec\xc6\xde\x9d\xef\xc4\x39\xb5\xf3\xeb\xfd\xee\x5c\xd5\x2e\x3f\x68\x26\x1f\x27\x3e\xfc\x5c\x8c\x23\xef\x7b\x6f\xe0\x75\x1d\x07\x71\xc0\xfd\x34\xe9\x82\x8e\x8e\xcc\xb0\x22\xbe\x3a\xe6\x10\xe2\x90\xb7\x11\x2b\x78\x36\xc4\x63\x36\x41\x50\xb8\x6e\x92\xac\xd3\x92\xe8\xc1\x93\x69\x49\x47\xfd\x49\x64\x5f\x81\x8f\x35\x2b\x92\xb8\x60\x87\x40\x0a\x87\x32\x01\x1b\x4a\xc8\xad\x28\x00\x1b\x7b\x86\x35\xc3\xae\x2a\x4b\xb0\x97\x98\x36\x58\xf7\xd9\x08\x3e\x03\x3f\x0b\xd3\x66\xf3\x65\x9e\xf2\xe0\x03\xf9\x37\xf2\x1f\x9f\x9f\x61\xcf\x8e\x27\x02\x4f\xf7\xaa\xf6\xe4\xfa\xad\xbf\x89\x3c\x92\xb8\x78\x63\x0f\xf7\x97\x9e\x3f\xeb\x75\x09\xcc\xb1\x98\x69\xd1\x66\x21\xa1\x25\x19\x71\x1c\x26\x36\x0b\xdc\x25\xe5\x51\x9c\x82\xc9\xb1\x82\x74\x1d\xc3\xf5\xf5\x6a\x87\x87\x28\xb1\xc2\x90\xd5\xf6\xc1\x8d\x62\x83\x1b\x41\x81\x89\xc4\xd2\x28\x01\x03\xbc\xa5\xaf\xd0\x2c\x45\x9f\x82\x27\xf9\xaf\x9f\xc8\xbf\x7d\xc1\x6b\x38\x13\x45\x3d\xb4\x4b\xa2\x9c\x29\xef\x4e\xbe\xbd\xfa\xf1\xe6\x8c\x9e\x7f\x2f\x0e\xaf\x52\xe9\xea\xdd\xd9\x56\x0a\xf5\x79\x7f\x20\xe5\x7e\xc4\x8b\x00\x0c\x79\x30\x96\xd9\x49\x03\xdb\xb1\x0a\x97\xc5\xd8\x7b\x58\x9a\x10\x9a\x3a\xd7\xcd\x3e\xf5\x72\xef\xf5\xf1\x73\x9d\xa1\xbb\xd5\xa5\xae\xe5\x90\x7b\xcc\xc5\x0c\xa7\x6a\x72\x30\xa6\x36\x0c\x36\xb3\x80\x80\x83\xfd\x04\x7d\x56\x04\x45\xb6\xd9\x41\x1d\x47\x71\xaf\xcb\x76\xff\x24\x39\xd9\x0a\x73\x8b\xf7\xa7\xdf\x6f\x9b\x1a\x75\x1a\x40\x09\x9c\x86\x4b\x89\x11\x86\x4b\x15\x51\x0b\x52\x48\xa9\xb9\x8c\x98\x63\xb6\x8c\x50\xc8\x84\x1f\x38\x1d\xa0\xa4\xc1\x52\x61\xb8\x7e\x8a\x86\xc0\x31\x5f\x06\xf1\xe1\x6c\xfd\xb0\x75\x28\x69\xf3\x8b\xe8\x0b\xd5\x78\x03\xfd\x5a\xac\x8f\xbc\x46\xdf\x5b\x44\x68\xf5\x82\xfe\x1f\xbe\x42\xff\x98\x63\x7c\x1d\x81\x92\x1f\x7a\x29\xbe\x9d\x5f\x83\x10\xb0\xa5\x61\x52\xf2\x12\xc3\xf9\x57\xc7\xe0\x61\xdd\xe4\x0d\x9c\x68\xa4\xfe\xd0\xae\xcc\x90\xdc\x43\xfb\x2a\x1a\xd4\x71\x66\xd4\x6d\x85\x1d\x7b\xc6\x93\xaf\x21\x7a\xe2\x2b\xbd\x85\x33\x7c\x89\x38\xa7\x7c\x89\x5e\x83\x13\x1e\x12\xdb\x96\x8a\xc5\xa1\xee\x0b\x3c\x22\x1b\xf3\x25\x3c\xca\xd3\xfd\x45\xbb\xb7\x8c\x96\x3c\x72\xbe\xc4\x9c\x53\xb6\xc4\xaf\x81\x4a\xeb\x43\x6e\x59\x52\x5a\x2f\x33\x24\x58\x7c\x2a\x3f\xef\xbf\x8c\x6c\x5b\x73\xb9\xb9\x5f\x73\x79\x1d\x98\x54\xbd\x58\x87\x79\x0d\x1d\x66\x38\x94\x85\x0f\x7e\xcf\x79\x87\xb5\xcf\x38\x79\x39\x96\xef\xc9\x8f\x5f\x19\xcb\x2f\xaf\xc5\xbc\x01\x6d\xc4\xea\x11\xa7\x61\xc0\x79\x00\xbd\xa8\xeb\x82\xd5\xf5\x6b\x88\xa3\x20\x30\x71\x6e\x3a\x9c\x40\xef\x5b\x20\x59\x5d\xac\x4f\x16\xf5\x4b\xbe\xda\x5f\xd5\xcb\xe7\x19\x99\x37\x88\x61\x85\x1e\x25\x11\xa6\x71\x82\x2c\x86\xc6\x45\xff\x75\x5d\x75\x31\x2a\x53\x06\x26\xce\x3c\xad\xa0\x70\xd9\x4b\xde\x8a\x9c\xdc\x57\x50\x5e\x1f\x63\x4a\xe9\x98\x90\x79\x83\x68\xf2\x65\x92\x2c\xf4\x0c\x98\x63\x4c\xe3\x68\x05\xcb\x02\xf4\x5e\x03\x5b\x14\xc5\xc8\xb0\x2c\xd2\x1c\xc8\xc4\x53\x71\x7e\xe5\x39\x3f\xf7\xaf\xd8\x79\xb1\x8e\xf3\x06\x0b\xd3\x4a\xc3\x71\x6d\xa7\x79\x95\x83\x8f\x2b\x3b\x6f\xb7\x77\xa7\xfb\xfb\x7f\x6f\xb1\xbb\xc5\xa1\x93\xc8\x42\xa4\xe0\x60\xbc\x3e\x9e\x2d\x1b\x56\xe3\xfb\x72\x0c\xbf\x62\x5b\x2e\x5e\xac\xf7\xbc\x45\xd0\x6e\x47\x39\xbc\x8d\xc1\xf4\x59\x00\x46\xc4\x5f\xb5\x30\x01\x63\x8b\xc3\xd8\xc3\xf5\x1b\x44\x7d\x81\xef\x0f\xa2\x5e\xf6\x6b\x72\xf6\x7c\xc7\x8d\xf1\xcb\x54\x59\x66\x48\x24\xf7\xb6\x80\x99\x95\xcd\xd0\xf5\x3d\x54\xf9\xf6\xf5\x1a\x7a\xce\x58\xcf\xd8\xea\x97\x1b\xdb\x0e\x33\x30\xe2\x20\x0c\x82\x20\x08\x83\x4f\x6c\xd1\x1f\xbe\xca\xeb\x17\x6b\x43\x6f\x51\x16\xde\x75\x7c\xb1\x42\x28\x1d\x0c\x69\x68\xbd\x06\xb6\x5d\x46\xb6\x4c\x79\xde\xc1\xc4\x96\x80\xfc\xaf\xe1\xbb\x5f\x33\x7a\x2b\xbe\xc3\xc8\xc1\x02\xd3\xc4\x0a\x5f\x9d\x02\x5b\x24\x6c\xe9\x65\x6f\x29\x9c\xcc\xfb\x1c\xbe\x3f\xbe\x01\xdf\x43\xfe\xf2\xcd\x08\x7b\x9a\xa1\x05\xfe\x28\x0e\xd1\xbf\x11\x63\xc8\x96\x3e\x64\xe1\x67\x30\xfe\xf9\x2d\x18\x9f\x9e\xb9\xf8\x45\x38\x4d\x30\xc0\xb1\x30\xc7\x14\x46\x7c\x7d\xc4\x37\xb0\x11\x5a\x77\x44\x77\x72\xd7\xa0\x4e\x75\x8c\x59\x5e\xf8\x3b\x6f\x19\xf9\xe3\xda\xd3\x2f\xc0\x1b\x2f\x0c\x5a\xec\x5f\x87\x69\xb0\xa5\x95\x83\xc3\xc8\x60\x44\xf3\x53\x7c\x97\xe4\x5f\xdf\x82\xef\xfa\x61\x4d\xea\xcd\xda\x93\x82\xc1\x97\x8a\x83\x81\xaf\x3a\xd0\x1b\x4a\x29\x99\x0e\xb5\xe4\x2f\xc1\xb1\xbc\xdf\xff\xd2\xf8\xdf\x6f\x2b\x15\x4b\x55\x6f\xc5\x8a\x4e\x80\x53\x08\xa1\xc1\x79\x1e\x0e\x6f\x1b\x7a\x9a\xe1\xc4\x72\x0e\x55\xdf\xb7\x38\x78\x45\xfe\x92\xb7\xab\x7f\xf4\x6f\x5f\xf7\x90\xbe\xb4\xfb\xf2\xd8\x99\xd7\xe1\xd3\x98\xa5\xac\x2b\x58\xcb\x9b\x30\x8e\x43\x3f\x4d\xa1\x5c\x3b\xf4\x5a\x17\x92\x38\xb6\xa6\x66\x98\xe7\xa1\x9d\x52\xce\x39\x2f\x19\x2b\x47\xd1\xaf\xcf\xf0\xdd\x79\x9d\xef\xd2\xe9\xb9\x58\x21\xfa\x05\x9e\xd3\xc6\xfa\x62\x00\x37\x1e\x5d\x1f\x7b\x71\xa1\xca\xab\x81\xce\x51\xef\x12\xe6\x62\xcc\x57\xa7\xe4\x8e\xf0\xb4\x06\xb6\xfa\x50\x9f\xea\xde\x4f\x6f\x41\x2e\x66\xb9\x27\xeb\x5b\xbf\x00\xfd\x88\x11\xb5\x70\x06\x27\x1e\x1c\x1f\xe7\x08\xdc\xb7\x77\x21\xcf\xf3\xa1\xb0\x70\x8c\xb3\xa4\xae\xd3\x34\x05\xcb\x2c\x3e\xe5\xfd\x9f\xde\x20\xf3\x1f\xae\x1f\xd7\xbd\xde\x2c\xf2\x95\x81\x3e\x8d\x4d\x24\x21\x58\x31\xfa\xaf\x7a\x39\x1b\x6a\x29\x74\x3d\xb6\x04\xd8\xe6\x0c\x9c\xe4\x13\xbf\xf5\x8d\x36\xfa\xe8\x88\xfd\xb2\xb9\x64\xa4\x09\x3a\xc0\x30\x06\x7b\xb6\x30\xc5\xf2\xcd\xa2\x52\x16\x83\xc3\xed\xcf\xc9\xc7\x5f\xdf\x26\x1f\x67\x4f\xd6\xc7\xde\x8a\x37\x5e\xdc\x90\x5b\xcc\xe6\x36\x3b\x0c\xe6\xab\x21\xf3\xfd\x7c\xc2\xf9\x84\x8e\x0e\x2d\xfa\xba\x58\x31\xd3\x3e\x33\x9f\xfc\x44\xbc\x37\x70\xf9\x89\xf7\xf6\xed\xbd\x99\xf9\x85\xce\x9b\xe8\xc8\x1d\xc1\x80\xfa\x8b\x01\x36\x5f\x9d\x32\x0e\x6e\xb0\x7d\xbd\xb1\x4b\x2c\xcf\xdb\xa2\xb8\x23\xbe\x6f\xcd\x19\x63\xd9\x1c\x05\xbe\xf8\x3a\xe6\xce\xf9\x5d\xa1\x85\xaa\x77\x3c\x33\x41\x60\xbf\x76\xe3\xe4\xfc\x3d\x39\xb7\x88\xb4\x87\xd3\x8b\xab\x5f\xc1\xb9\xa4\x9d\x9e\xef\xb6\x3f\x49\x57\xdf\xca\x57\x16\x39\xd9\x53\x1f\x43\xe8\x21\xa5\xc1\xc8\x3d\x14\xd7\xa2\xa5\x06\x98\xe0\x02\xe9\x70\x00\xbd\x6a\x7c\x4e\x03\x6a\xa3\x85\xe5\xc2\x46\x9e\x80\x3f\x83\x0e\x99\x89\x09\x2d\xa1\x82\x71\x69\x2b\x20\x58\x60\x0f\xe6\x34\xe2\x8c\x09\x38\xde\x24\x56\x4e\x22\x34\xa8\x33\xb4\x10\xc3\x56\xdb\x8b\x3c\x19\x83\x7f\x25\x04\xee\x99\xbd\x33\x9e\x7f\xbf\x7f\x3c\x90\x75\xbd\xed\xf4\xde\xcb\x04\xc3\xa5\xa4\xe1\x13\x5e\x17\xcb\x4c\x75\x48\x20\xa6\xfa\x32\x1f\x12\x39\x40\x1f\x38\x46\x30\xdd\x3a\x0d\x9b\x90\xe0\x78\xfc\xf8\xca\xdc\x75\x68\x4a\x2d\xc1\x15\xe8\xfd\x83\x09\x25\x58\x15\xd8\xe6\x18\x17\x05\x2d\x96\x44\x0a\xc9\x27\x38\xcf\xbf\x8c\x53\x79\x48\x0d\x5f\xbf\x8a\x6f\x99\x39\x75\x96\x8e\xa6\x1f\x27\x98\xdf\x82\xac\xc1\x9c\x2d\x3d\x13\xf6\xf8\x29\x9e\xd5\xd3\xf8\xeb\x57\x78\xb7\x3b\xdf\x2a\x3c\x9e\x6e\xd7\x3e\xc3\xf1\x30\xf2\x6b\xf8\xc0\x60\x18\x16\x18\x32\xea\x15\x4b\x0b\x25\x86\xd4\x85\xf2\x4d\x2c\x34\x96\xd0\x5b\x7a\x6a\x07\xb4\x06\x1f\x6b\xb4\xd7\x77\xf0\x5f\xf0\xf1\xe2\xeb\xe3\x7d\x2a\x9f\x69\xef\x2f\x57\xe0\xaf\x8e\x34\x51\xcc\x85\x83\xd1\xc6\x75\xcd\x97\xf1\x4d\x10\x53\x36\x70\x56\xb0\x74\x49\x65\xeb\x05\xae\x9f\xbe\x86\xeb\xc3\xcd\x99\x48\x87\xff\x16\x1e\x06\x7a\xb7\x5d\x41\xfd\x06\x98\x50\x98\x06\xb7\x68\xbd\x98\x96\xe5\x48\xfa\xea\x10\xdf\xae\x7a\xd4\x44\x69\x02\x7a\x84\x6f\xe3\x6e\x9c\xa4\x76\xc3\x42\x2f\x61\x58\x72\x0e\x61\x91\xc6\x60\x8b\x35\x48\xf9\x59\x3f\xfe\x8b\x38\x27\xf5\xb5\x9e\x3c\x64\xf6\xb7\x6c\x9c\xaa\xad\x81\xdc\xea\x33\xbf\xda\x15\x13\x1a\xd3\x60\xba\x45\xd9\xe2\x7a\xa1\x44\xd8\x52\xb0\x28\x8b\x20\xcc\x30\x85\x9c\x26\x4b\xf1\xb6\x51\x88\x62\x33\x0c\x59\x99\x2e\x76\x10\x50\x3b\x0a\xb2\x11\xcc\xc3\x08\xf1\x2a\xe3\xd6\x9d\xae\x71\x35\x17\x35\xc5\x7f\x4f\xfe\x44\x6e\x44\x3d\xee\xcb\x0f\x4f\x2a\x8b\x9f\xfe\x03\x68\x97\xff\x01\x7f\x03\xd8\x5f\xef\x8f\x17\x5f\xdf\xec\xae\x76\xda\xd9\x87\x9b\x6f\x2f\xbe\x59\x3f\xfd\x37\xf8\xe9\xf2\x4a\xe2\x69\x15\xe4\x91\x8e\x3d\xc6\x92\x6e\xf9\x18\xe9\x45\xeb\x55\xa9\x4a\x0e\xbd\x64\x1f\xc2\xba\x35\x4c\x3d\x34\x52\x5d\xcf\x4a\x6b\xe1\x49\x16\xb4\x7a\xa6\xea\x63\x11\xa6\xcc\x30\xf4\x4c\x37\x02\xdd\x88\xfb\xba\x09\x12\x97\x15\x1d\x4e\xc9\x6d\x85\x73\x6e\x87\xa6\x64\xa0\xd9\xe9\xf1\x64\x5b\xed\x18\xc7\xc5\x3c\x79\x01\x21\x2a\x89\xee\x0c\x51\xdb\xd6\x24\x16\xf9\x81\xfc\x95\x5c\x09\xf4\x12\xbd\xbf\xe1\xf5\xfa\xfe\x66\xce\x6b\xe5\xfa\xea\x14\x9e\x5c\xd0\x0f\x3b\x43\x79\x7f\xf9\x1f\x70\xf3\x61\x07\xe7\xbb\xab\xb5\x63\x12\x37\xf4\xc6\x8b\xcc\xcc\x76\x1c\x1d\x27\x0b\xdb\x10\x4c\x0b\x27\x30\x53\x25\x48\xd0\x4a\x68\x93\xa0\x85\x26\x06\x86\xdd\xe6\x86\x8e\x3c\xcb\xd4\x60\xed\x99\x32\x62\x86\xb5\x91\x99\x5e\x0e\x26\x26\x6d\x58\x42\x98\xea\x4d\xb3\xc4\x8e\x23\xe9\x0b\x87\x09\x0d\xac\xd6\x57\x68\x07\x4e\x14\x39\x94\x2c\x35\x75\xd0\x48\x89\x44\xfc\xbb\x50\x8b\xd5\xea\x7e\x97\xfe\x7d\x3d\xe7\xcb\xf5\x75\x73\x76\x71\xa6\x9c\x5d\x3c\x05\x2e\xd5\xc8\xac\xd4\xc2\x54\x87\xcc\xc0\x52\x87\xc0\x48\x0d\x08\x74\xac\x0d\x48\xa4\xfa\x01\xa7\x9c\x9b\xeb\x5f\x43\x33\x35\x4b\x33\x35\x2a\xbd\x32\x53\x93\x9b\x1f\x43\xd7\xbd\x87\xb4\xad\x55\x3b\x77\xa6\xc6\x45\x0d\x9b\xef\xc8\x9e\x5c\x90\x0f\xc4\xbf\xbf\x2d\x5d\xfb\x35\x88\xda\x1a\x9a\x58\x70\x3b\x39\xdb\xea\x3d\x6e\xc5\x90\x95\x8b\x6b\xe5\x44\x95\x95\xf7\x97\x3f\x7c\xb8\xb9\xdc\x6f\x65\x24\x40\x5b\x5d\xd0\x1f\x6f\xde\xdd\x9c\x49\x3f\xdc\xac\x1f\x93\x03\xcf\x71\x5d\xa7\xf0\xe7\xd1\x87\x2c\x35\xfa\x2c\xc8\xc3\x2a\x49\x6c\xf0\xcd\x30\x76\xd7\x2f\xa9\x58\x22\xca\x1d\x1f\x27\xec\x0d\x07\xcc\xc9\xd5\x97\x8c\x96\x66\x7c\x70\x12\x77\x42\xc3\x74\xfc\xd1\x4c\x67\xd0\xdb\xd8\x8b\x22\xd5\xb7\x03\xd7\xb6\x47\x1c\xb1\x4b\x62\x0e\xdc\x30\x8a\x22\xa8\xc0\xb1\x13\x33\x30\x0c\xcf\x59\xff\x1a\xe9\xa9\x8e\xc5\x30\xb8\x66\xe4\x94\x5c\x4f\x75\x33\x30\xcc\x8f\xb6\x93\x58\x56\xa6\xd3\x34\x76\x96\x50\x37\xbb\xc8\xcb\x89\x4c\xdc\x3b\x4b\x6b\x54\x2e\xce\x86\xff\x85\xfc\x6f\x0f\xd2\xaf\x68\xd2\xea\x6a\xdc\xac\xd2\xfe\x17\xf8\x1b\x68\x97\x37\xd7\x67\xa7\x17\xdf\x9e\x7e\x73\xb1\x31\x80\x8a\x0a\x8c\x27\xb0\x5f\x15\xe0\x07\x71\xfa\x48\xb9\xfc\x61\x55\xf7\xd3\xbd\xc4\xe3\x3a\x4c\x33\x1d\xc7\x44\x77\x9a\xbc\x31\xa6\xb4\x4c\xac\xd6\x18\x52\xe8\x43\x6a\xfb\xac\xf4\x6a\x1a\xa7\x58\x22\xb7\xc0\x05\x37\x39\x24\x98\xb3\xde\x05\x07\x13\x28\xb0\xb3\xa0\x19\xbc\xa4\x84\x54\x89\xea\x2a\x4c\xb8\x6e\xe9\xc8\x5c\xc3\xcc\x75\x3b\x1c\x2b\x23\x35\x27\x7d\x70\x42\xdd\xf2\xe2\x34\x8a\xa2\x10\x1b\x1c\xbc\xd4\x9d\xc1\xfe\x38\x96\x4d\x90\x7a\x40\xd2\xc2\x4a\xcd\x20\xb6\x2d\x2e\xfa\x68\x3e\xe9\xa3\xfb\xcb\xfb\xb8\x4d\x11\x57\x3b\xf9\x97\x77\x2c\x75\xfa\x3e\x4d\xc1\xfc\xc5\x3d\x99\xe3\xc0\x41\x53\x2a\xb0\x73\x09\x51\x20\xb9\xd3\xb5\x51\x2d\x8f\x35\x0c\x2f\xd6\xa8\xee\x11\xd6\xcd\x93\x0a\x0c\x5f\x33\x50\xed\x11\x0c\x5f\xa5\xd2\x35\x85\x6c\xca\x7d\xd5\x19\x86\xb1\xda\x25\x83\xe5\xc2\x2e\xf9\x8d\x9e\xc9\xe3\x23\xfd\xd6\x09\x1d\xc7\xe6\xe2\xfd\x23\x7f\x6a\x92\xb2\xde\xb6\xda\x29\xba\x37\x49\x44\x82\xe4\xce\xd5\x9a\x23\xce\xb3\xa7\x18\xe1\x91\xa5\x3f\x90\x93\x07\x28\x74\xfc\x94\x69\x4f\x69\x1f\xb2\x38\x89\x37\xce\x8c\x7e\xea\x00\x11\x3e\xdd\xaf\x88\x75\x67\x8a\x7a\x64\xbf\x11\x7b\x4c\x56\xcf\xfa\xcf\xe4\x7f\x90\xff\x49\xfe\xbf\x97\xb5\x9d\xae\x7e\xbc\xfe\xe9\xfc\xfb\x93\x63\x55\x4d\xb8\x7c\xb7\x13\x55\x15\xef\x71\x7d\x7b\xb1\xc9\xc2\x13\x51\x78\x7f\xbd\x5b\x25\xe1\xea\xa9\x24\xfc\x5a\x4c\x01\x27\x92\xe5\x3a\x8e\xe7\x39\x2b\xe3\x5c\xd7\xc9\xa3\xd9\x4e\x2d\x2c\xf4\x3b\x12\x4d\x6a\xb1\x1a\x43\xd3\x8d\x58\x9a\x36\xb7\x69\x10\x45\xb1\xa3\x0f\xba\x1b\xfa\x4c\x2f\xc3\x2c\x2a\x74\x96\x81\x19\x41\xea\x27\xa9\x97\x43\xe9\xcf\x93\x3d\xb4\xbe\x9a\xd8\x9e\x67\xaf\x8d\xba\xae\x73\xe8\x43\x70\xa9\x6d\xa0\x09\xc3\x32\x21\x0f\xc0\x85\x11\xad\xe4\xb6\x8f\xbc\x95\x23\x0c\x5b\xcf\xe9\x53\x2f\xcf\x74\x0b\x99\x6d\x19\x99\x1e\xa6\xe0\x1b\x99\x31\x0d\x76\xa8\x9b\x6e\x98\x44\x61\xec\x63\x83\x93\x9f\xb8\x13\x38\xc7\xfd\x38\xba\xd6\xa8\x0d\xf9\x96\x7c\x4f\xfe\x93\xfc\x1f\xe4\xff\x11\x5c\x7a\x61\xdd\x8e\xe5\x6c\x45\x81\x32\x69\x2b\x50\x76\x42\x95\xf7\x97\x1f\x84\x21\x3b\x5b\x59\x24\x38\x75\xa6\x6a\x57\xe2\x83\x8f\x72\x76\xf6\xe1\x46\x31\xb4\xcb\x0f\xbb\xbf\xc1\x95\xb4\xbf\xde\x6b\x99\x3f\xad\xf6\x2e\xd1\xef\xed\x9d\x69\x82\x6f\x85\x07\x3f\x40\x5d\x37\xe7\x08\x2c\xdb\x76\xfc\x32\xc2\xc2\xf0\x9a\xc8\x0f\x3c\xcf\xb7\x5c\xbd\xf1\x8b\xa8\xf5\x13\xdd\xac\xac\x50\x21\x21\xd7\x4d\xdd\x37\x12\xdd\x0b\x90\x73\x3f\x4d\xa6\xa5\xa3\x8e\xd2\xe0\x88\x6d\xbc\x5a\x3e\x5d\x3f\x5a\x3e\xcf\x59\x4d\x1f\xea\x31\xb5\x2c\xec\x42\xf0\x9d\xe0\x60\xa0\xde\x59\x7e\xcc\x7c\x37\xb4\x7d\xa7\xd6\xf5\x82\x87\xd3\xe8\xd8\xae\xe9\xeb\x26\x4e\x38\x66\x66\x62\xd0\x69\x09\xf5\x70\x34\x90\xf3\x28\x05\x63\xce\xd1\x4b\xef\x65\x8b\xab\x91\x90\xad\x3f\x88\xdd\x4b\x7f\x25\xd7\xe4\xdf\xc9\x7f\xff\xbc\x6c\x3d\x65\x99\x70\x11\xb4\x63\x45\xf0\x87\xf7\xb3\xed\x62\xbb\xed\x07\x5a\x6e\xc3\x6d\x7b\x42\x86\x80\x3c\x63\x8a\xc2\x84\xb3\xc0\x84\x86\xa2\xe9\x65\x95\xd3\x50\xdf\x5d\x1f\x30\xa7\x65\x72\xc1\x02\x37\xc3\xd8\x4e\x7a\xbb\x52\xe6\x27\xa2\xb3\x54\x4f\xfa\x8f\x63\xb2\x38\x42\x5f\x8b\xd8\xf7\x12\x2f\x12\xdf\xf7\x68\xb1\x2c\x04\x32\x36\xb1\xe3\x25\x96\xc8\x77\x26\x77\x86\x66\xab\xc5\x43\x9d\xe7\x7f\x7e\xac\x05\xf6\xfe\xb1\x22\xd8\xce\x50\x2e\xff\x03\xae\x85\xb3\x20\xc5\x26\xd6\x58\x18\x50\x80\x6e\x4d\x58\xe8\x20\x76\x0b\x4f\x68\xe9\xd0\xca\x23\x06\xce\x1c\x0b\xe7\xc0\xc9\x42\x63\xd5\x8e\x34\xb0\x53\x07\xfd\x34\x76\x53\x1b\xb9\xf0\x03\x52\xb7\xa8\x81\xaf\x5e\x00\x21\x7f\x47\x9c\x3b\xe3\xc1\x66\x6c\xda\x7c\x41\xae\xc8\x7f\x25\xff\x49\x7c\xf2\x7f\x92\xff\x49\x08\xec\x56\x23\xb6\x02\x50\x36\x3c\xab\xcf\xf2\x04\xdf\x89\xf6\xc2\xf2\x9d\x7d\xb8\xb9\x38\xd6\x3a\x11\xb5\x7c\xef\xa5\x53\x31\xa4\xa3\x01\xd0\xec\x66\x72\xe6\xf8\xd0\xdc\x77\x46\x32\xb2\x6c\x99\x3f\xe9\xd0\x24\x06\x42\x6e\x9f\x88\xe3\x6d\x2c\x86\xc3\x8a\x56\xcf\x42\x1a\x57\xd9\xbc\xb5\x79\x5c\xc8\xd1\x2a\xa1\x6a\x89\x46\xd9\xb9\x99\x9b\x37\xc0\x53\xc1\x82\x65\xa4\x2e\x26\xcf\xd8\xe0\x8a\x01\x41\xe7\x99\x20\x0e\xe2\x97\x0b\xf1\xc1\xa3\xa6\x8e\x46\xfe\x20\x98\xfa\x32\x60\x1b\x80\x09\xb3\x10\x51\xa2\x10\xef\x38\x1f\x9c\x88\x35\xbc\xff\x42\xfe\x7d\xb3\xb5\x62\x97\xea\x51\x61\xcf\x54\xed\x5b\xe5\x28\x8f\x9b\x0d\x56\xbe\x32\x37\x34\x61\x9e\x15\x58\xfb\xe0\xe4\x05\x77\xca\xc2\x75\x53\xcf\x65\x72\x2c\xc4\xd1\x3e\x5a\x6b\x79\xfc\xfc\x64\xe1\x86\x69\x30\xb1\x38\x1b\x42\x2f\xf1\xc2\xac\xb3\xc7\x2c\x32\x92\xdb\xee\xd1\x8e\xa7\x5f\x9b\x36\x88\x4e\x3a\xd1\x9f\x8a\xfc\x9a\xfc\x03\xf9\x46\xec\x19\xfc\x33\xf9\x9b\xf0\xc5\x5e\xb8\xaa\x62\x58\x2f\x7e\x0d\xc2\xf5\x3a\x81\x63\x15\xc7\xb7\xf4\xd0\x59\x5d\xd7\x2e\xdb\x5c\x57\x79\x8a\x3d\x3f\x0a\x20\x74\x5a\x9c\x74\x17\x48\x69\x63\x11\xb9\x61\xe4\x60\xfd\xf5\xce\xaa\x15\xea\x8f\xae\xac\xbe\x54\xd4\xc5\xd4\x2b\x12\x2f\x77\xb1\xc1\xd9\x37\x43\xb7\x07\x0b\x67\x2f\x29\xbc\xe0\x36\x79\x13\x0b\x14\x92\xdd\x99\x5a\xa8\xa6\x47\x2d\xb4\xc4\x2d\x04\xf7\x45\x93\x77\xe7\xbb\x57\xba\x2d\x65\x1d\x96\x1e\x98\xdd\x32\xa7\x4a\xf3\x6a\xcf\xd4\x14\x43\xe4\x41\x6a\x03\x01\x1f\xd7\xb0\x9b\xbd\xa5\x03\xab\xdc\xc5\x77\xae\x56\xaa\x29\x51\xc8\x7f\x23\xff\x3b\xf9\xbf\xc8\xff\x4b\xc8\xb6\x8b\x53\x39\xdd\xbf\x3b\xf9\x20\x0a\xab\xac\xa1\xc7\x19\x3d\xff\xfe\x52\x4c\x18\x54\xda\xef\xf6\x0f\x65\x27\x6e\x3e\xec\xce\x4f\x57\x2d\xfc\x9d\x38\x2a\x73\xf1\x78\x62\x5f\x04\xb9\x67\xdf\x9e\x69\xf4\xf2\xe2\x8c\x6a\x97\x1f\xd4\xce\xf7\x62\xcf\x07\x82\xbd\x61\x3a\x56\xe1\xc7\x8e\x63\x9a\x99\xc9\x32\xcf\x4f\x62\x16\x7a\x3a\xb6\x40\xfc\xd8\x32\x2d\xdb\xb1\x74\x3d\x63\x05\x83\x26\xfb\x98\xd0\x11\x5b\x08\xb1\x64\x58\x42\x88\x63\xe2\x9b\xb9\xe5\xd3\x22\xf7\xfd\x3c\x52\x53\x3f\x09\xe2\x68\x2e\x30\xc3\xb9\x01\xc3\x42\xf3\x8e\xdc\x91\x2c\xb5\x30\x1f\xb2\x34\xae\x5a\xe8\xa0\xc5\x7e\x61\xad\x91\xe9\x6e\x02\x69\x86\x1e\x16\x01\x24\x50\xd1\x0c\x5c\x6c\x1b\xb1\x47\x3b\xa6\x8c\xd1\x29\x1f\x27\x1b\xc8\x60\x59\xd8\x37\xf6\xb4\xce\x1d\xe9\x9d\xaf\xe5\x6a\x40\x7e\x4f\x1c\xe2\x92\x7f\x27\x1e\xf1\xc9\xff\x20\xff\x37\x09\x09\x81\x33\x55\xfb\x74\xb7\xdf\xf5\xd5\xfa\xcd\x87\x8b\x47\x16\x7d\x38\x39\xdf\xf6\xfa\x5d\x1e\xef\x43\x3a\xb9\x12\xa3\x7c\x0e\x4f\x7e\x7e\xfa\xbd\x92\x45\x5e\x90\x65\xa1\x17\xf8\x85\xe3\x46\x99\x5b\x70\xc7\x71\x9b\xc5\x87\x2e\x48\x2d\xc7\x74\x2d\xdb\xd2\x63\xb3\x08\x13\x23\x72\x8a\x24\xcf\x93\x24\x49\xd4\x3c\xcf\xb3\x2c\xcf\x97\x38\x67\x79\xce\x98\x1a\xc4\x8e\x85\x75\x91\x67\x49\xb2\xce\x41\x46\x99\x27\xa0\x83\x55\x80\xa9\x1b\xa9\xe3\x2c\xac\x37\x33\x33\x87\x6a\x99\xdb\xa4\x82\x2a\xfd\x68\x15\x93\xea\x2d\x1c\xfa\xdb\x06\x06\x9a\xfd\x3c\x96\xbd\xea\xdf\x9a\x72\xb4\x44\x87\x36\xcd\x24\x6f\x69\xa0\x21\x84\x12\xff\xce\xd7\x98\x9a\x90\x77\x62\x57\xcc\x71\xc7\xa5\x28\x74\xbe\x95\x04\xf8\x5c\xe2\xad\x00\x93\x83\x87\xed\xea\xcb\x97\x71\x7c\x47\x42\xf0\x4d\x1c\xa5\x44\x8a\xb1\x5e\x07\x17\xd2\x83\x95\xb2\x06\x53\x39\x85\x19\x75\xb6\x88\x13\x55\x06\xb4\x18\xe0\x58\x00\xa7\x21\xf5\xd8\x32\xb2\x25\x60\x4c\xea\x0f\xb6\x12\x91\x75\xae\x49\xef\x02\x8d\xab\x29\x31\xc8\xb7\xe2\x7e\xbb\x9f\xc4\xbe\xc4\xff\x2e\x66\x9a\xcd\x2f\x3a\xa3\xda\xe6\xf3\x9c\x68\x42\x80\x85\x78\xff\x15\x9e\xd6\x05\x3d\xa7\x42\x80\x57\xde\x4b\x57\xbb\xf3\xd3\x6f\x24\x91\xf8\x82\xdd\xf9\xee\x74\x77\xb5\xdb\x14\xe2\x64\xdb\xd2\xfc\x64\x9c\x54\xc2\xe3\x28\xcb\x2d\x27\x89\xbc\xd4\x6a\x3a\x3b\xc6\x2e\x4b\xa2\x24\xb5\x83\xc0\xf2\x4c\xd7\x76\x4a\x93\xc7\x65\xce\x98\xce\xd9\x78\x47\x72\x20\x69\x2a\x91\x38\x8c\xc2\xb8\xc8\xac\x24\x4b\xe8\x58\x4c\x45\x31\x4d\x6a\xea\xa0\xcb\x4c\x2f\x4d\xbc\x19\x07\xbf\x0a\xcc\x62\x00\x16\xe7\x29\x8f\x83\x9f\xbb\x28\x34\x32\x23\x84\x0e\x63\x1c\x12\x70\x68\x49\x2b\xb4\x20\x3c\x34\x90\xe4\x91\x64\x7c\xac\x46\xd5\x5d\x18\x0c\x68\x65\x68\xc1\x00\x5e\x90\x26\x59\x88\xdc\x42\x1f\x0b\x0f\x72\x48\x0e\x75\x9a\x4a\xfe\x52\xaf\xe3\x27\x93\x10\x4d\xad\x54\x1a\xa2\x91\xbf\x23\xff\x4c\xfe\x95\x90\xfd\xb9\xb4\x97\xce\xe1\xea\x44\xfa\x46\x93\xe0\xfc\x6c\x15\xcf\xb3\xab\x0f\x57\x3f\xbe\xdb\x19\xf4\xfc\x7b\xe9\xf4\x49\x45\x55\xad\xac\x53\x4c\xb3\x1a\x58\xe3\x71\x27\xbe\x9d\x74\xbd\x2a\x4c\x3d\xe6\x65\xd7\x95\x3c\x4e\xd3\x78\x95\xc6\x14\x5a\x74\x95\xe6\x50\xd2\xd4\x58\x71\xdb\x25\x3a\xaa\x53\x94\x38\x88\x4b\x92\x47\x1a\xd9\x9d\xf8\xaa\x89\x44\x22\x42\x34\x7e\xc4\xb3\x7f\x8a\xe6\xfd\xa5\x04\xe7\x3b\x41\xf6\x74\xc3\xf4\x1f\xb0\xba\x6b\x1a\xaf\x53\x4c\xd2\x15\x83\x9b\x58\x3a\xc3\xa8\x8a\xc2\x34\xad\x99\xa9\xdb\x2c\xe0\xe5\x3d\x71\x68\x52\x6f\xc9\x17\x46\xdb\x2c\x6b\xdb\xa5\x95\xfd\xc2\x8f\xda\x56\x9c\x3f\x46\x53\x9b\x8e\x34\xff\xfc\x92\x03\xeb\x94\x73\xbe\xba\x84\x97\xd2\xf9\xc9\x95\x74\x5f\xd3\x65\xfb\x76\x8d\x2a\xa6\x47\xfa\xcc\x89\x91\xfb\x79\x6c\xe9\x21\x73\x22\x3d\xac\xe6\x3a\xd1\x7d\x27\x88\xac\xb8\x4a\x75\xc7\xb2\x1e\x39\x61\x35\x18\x63\xd0\x72\xee\x5a\x4b\xa7\x3a\x8b\xe7\xb8\x7e\x90\x96\x94\x1f\x26\xdb\xf1\xc3\x6d\x6f\x36\x21\xda\x70\xc4\xf5\x97\xa7\xb8\x54\xed\x19\x2f\x9e\x32\x65\x75\x54\xaf\x84\x1f\xab\x0d\x4d\x8a\x69\xda\x00\x6b\x5d\x6e\x58\x31\xc6\xb5\x6d\xbb\x4e\xe5\x38\xb6\x53\x33\x43\x77\xa3\xdc\xd4\xbd\x3c\x4e\x1e\x41\x65\x11\xc6\x2b\x87\xca\x30\xcb\x16\xf7\xfe\x7f\xd9\xcf\x58\x5d\xaf\xac\x22\x12\x09\x08\xd1\x2a\xd5\x14\x77\x55\x7d\xb7\x62\x02\x4d\x18\x30\x09\xc4\x62\xc0\xc3\x60\xa9\x9a\x24\x25\x1d\x36\x51\x55\xe9\x90\xf7\x98\x29\x7d\x9d\x09\x38\xbc\x71\x63\xcb\x30\xcc\x14\xe6\x00\x43\xd5\x5c\x1c\x9c\xa9\x8e\xf6\x52\x3c\x0c\x15\xcb\xd6\xa8\xd0\x5b\xe5\x33\xba\x9b\x34\xae\x9a\x44\x22\xbf\x27\xef\x57\x4f\x68\xbf\x3a\x0a\xe7\xdb\x90\x5c\xff\xf4\xe1\x3f\x41\x88\xa2\x76\x29\xfa\x2c\x5d\xff\x03\x6c\x03\x04\x9a\x60\x8a\x08\xfc\x4e\xd5\xf3\xef\xe9\xce\x20\x57\x3f\x6a\xbc\xae\xb1\xcb\x2d\x3d\xf9\xff\x79\xfb\x17\x30\xdb\xb1\xab\x30\x10\xde\x6b\xeb\x1c\x49\x6d\xfc\x50\x55\xf5\xbd\x25\xc7\x6e\x5b\xa7\xef\xad\x5b\x6a\xdc\x6d\xcb\x5d\xae\x2a\x19\x1b\xb7\xfc\xc0\x28\x36\x18\xd9\x26\x1f\x02\xf3\x10\xe6\x61\x61\xcc\x8f\x0c\x06\x0b\x02\x44\x18\xfe\xb1\x1c\x20\xc8\x8f\xfe\xbc\x6d\x7f\xf6\x6c\x3b\x80\x05\x83\x07\x05\x77\xb0\x20\x3c\x44\xe2\x10\x7d\x83\x01\x05\xc8\x87\x66\x60\xe0\x0c\x30\x13\x0d\xe4\x23\x1a\x98\x21\xba\x55\x47\xfb\xcc\xa7\xad\x73\xaa\x4e\xdd\x5b\xb7\x6f\x37\x21\x53\x55\xe7\x51\xe7\x54\x1d\xad\xbd\xf6\x7a\xaf\xb5\xd7\x2a\x22\x5a\x57\xd4\xf3\xc2\xc4\xa4\x34\x2f\xf2\x96\xd8\x8e\x1f\xf7\xbe\x11\xb8\x21\x89\xa3\x30\xf4\x92\xaa\x05\x54\x26\xa2\x7a\xb3\x21\x69\x4a\x48\x21\xcb\x76\x10\x3a\xb1\x97\xe7\xac\xf4\xe4\x20\x70\x5d\x2a\xc8\xd4\xac\xaa\xb2\x34\xe9\x60\xbc\xf3\x3e\x9c\x68\x8a\xd4\x65\x2b\x35\x1c\xe6\x6d\xf4\x00\x3a\x40\xff\x70\x0d\xf5\x1a\x57\x07\xc7\x3b\x03\xb6\xf6\xc7\xba\x9d\xbd\xe3\x27\xbc\x84\xed\x83\x87\xa5\x26\x4d\x4f\xe6\x05\xeb\xac\x34\x55\x14\xbb\x29\x58\x31\x4d\x62\xcd\x22\x5e\x04\x76\x60\x3a\x6e\x68\xc6\x11\x21\x29\x09\x4d\xd3\x71\x98\x6d\xb8\x96\xef\x05\x8e\xeb\x39\x01\xa9\x2a\x1a\x0c\xeb\x81\xd6\x62\x8e\xa8\xf6\xf6\x12\x11\x70\x98\xd9\x47\x24\x4d\x29\x58\xaa\x6c\xc7\x9e\x13\xf9\xe3\x0a\xfd\x70\x58\x21\x22\x66\x55\x55\xc5\xb0\x42\x95\x7f\x8f\x79\x97\x94\xa9\x92\x3b\xcd\xd1\x3d\xe3\xe9\x3f\x38\xd3\xf4\x77\x13\x19\x6e\x5f\x60\xb5\x6f\x72\xdc\x9d\xc8\xb2\x3c\xb0\xa9\x97\xae\xc4\x45\xc0\xa5\x45\x30\x55\x18\x4a\x7b\x32\xcd\x4f\xea\xb5\xa4\x18\xe4\xc4\x45\x49\x31\xf6\x3b\x47\x2b\x18\xee\xbb\x08\xc1\xad\x1c\x71\xf5\x8a\xe4\xf6\x25\x56\xfa\xb6\xc0\xdd\xc2\xcb\xdd\x95\x80\xf0\xd2\x34\x3d\xbf\x9a\xbd\x21\x1a\x52\x4e\xee\x08\x23\x8f\xa9\x12\xe5\xd7\xf8\xfc\x0b\xd7\xb8\xab\x58\xa0\xe7\x17\xcc\xb8\x48\x70\xe8\x99\x48\xb0\xcc\x41\x24\xe4\xd1\x20\x12\xce\xae\x7f\x8a\x6e\x91\x06\x41\x76\x26\x0d\x26\xc8\x61\xaa\x94\x4d\x3c\xb4\x87\x5e\x88\x5e\x36\x48\x49\x90\x46\x57\x75\x7f\xb8\xf4\x4b\x60\x70\x5c\x27\xb3\x81\x25\x8e\x57\xb7\x41\x12\xcc\x60\x73\x3e\xf9\xb5\xcd\x4a\x86\xf3\x05\x88\x12\x5f\xc2\x6d\x2b\xc8\x72\xab\xc8\x55\xcd\xb5\x6d\x4a\x32\xd6\x2d\x51\x59\xce\xbd\x28\x2b\x32\xc7\x04\xb7\xf7\xc6\x46\x00\x9e\x0b\x6a\xe6\x79\x61\x90\xa5\x6e\x3f\xc8\x3e\x5d\xb6\x87\x85\xca\xaa\x99\x75\x79\x38\x0a\xbf\x3c\x92\x75\x5d\x13\x6a\xd5\x89\x69\x21\x9b\xb6\xa1\xd3\xb8\xc8\x09\xa9\x4d\x3d\x08\x1c\xb7\xce\x4b\x95\xd1\x61\xef\xc3\x30\x5a\x64\x9e\xe7\xba\x41\xe0\x58\x29\xc7\x87\x15\xb2\x78\xc0\x88\x6f\xb9\xa3\x78\x34\x74\x2e\x1e\xd7\xba\xeb\xef\x11\x27\xd3\xbb\xcb\xd4\xb4\xb0\x8a\x4c\x53\x5d\xdb\x4a\x49\xba\x44\xac\x2b\xcb\xb9\x1b\xe5\x79\xc1\x71\x32\xa0\x83\xff\x80\x9a\x7a\x5e\x10\x64\x99\xdb\x3b\xb9\x6e\x18\x83\xd4\x35\xf4\x51\xea\x46\x9a\x6c\x26\x7e\x70\x67\x6c\x14\xc5\x65\xd8\x50\x1e\x47\x2c\xa3\x09\x8a\x99\x2a\x85\x5c\x2e\x3f\x8c\x5e\x86\x5e\x7b\xab\x64\xfe\xaf\x43\x8c\x90\x56\xac\xf4\xf2\x5c\x81\xa4\x62\xf1\xd4\x5b\x21\xc1\xb2\x2f\x20\x81\x13\x86\xb7\x42\x82\xe7\x72\x24\xf8\x9c\x30\x6e\x91\xf4\xe0\x3f\x39\x42\x18\xf8\x30\x44\x48\x8a\xa7\x39\xfa\x3c\x74\x85\x4b\xd3\x19\x5f\xdb\x8c\xe7\x37\x06\x9f\xff\x0a\xcc\x26\x4a\xde\xd7\x79\x8e\xf5\x5c\x08\x7b\x0d\x2b\x4c\xc1\x59\xdf\x62\x0d\x67\xbd\x33\xcd\x7b\x82\xfd\x13\x3b\x12\xac\x38\x59\xac\xfa\xc2\x0c\xfa\xb5\x16\x55\x3e\x33\xe5\xda\x06\xc6\xa4\x03\xae\xcc\x2e\xbb\x06\xae\x07\xc9\x9b\x65\x8a\x0c\x66\xc1\x8a\x89\x9a\xb3\x2a\xcb\xc0\xc8\xb1\xc5\x10\x58\xac\x82\x39\x2b\xc0\x81\xd6\x64\xf6\x20\x60\x5b\xa8\x99\xd1\xc7\x97\x81\x20\x20\x95\xeb\xf7\x9c\x4f\xda\xdd\xbf\x65\x55\xd7\x9e\x05\xd7\x84\x6b\xc2\xb5\x9d\xe1\x95\x9d\x83\x9d\x0d\x18\xa6\xc5\xfa\xa2\xbd\x99\xca\xb2\x9c\x44\x89\x2c\xd3\x2c\x97\x8b\x6c\xd2\xb0\xc1\xeb\x1b\xa1\xb0\x37\xaf\x0a\x05\x70\x77\x9f\x11\x66\x4d\xf3\xd3\x6e\x22\x6f\x22\x43\x40\xfa\xb2\x95\xe6\xd3\x0a\x3d\x13\xed\xf1\x5c\xf0\xa0\x7b\x46\x85\x73\xcc\xd3\xbf\x67\xfa\xe7\x0e\x78\xa9\x2c\xdf\xf3\xe2\x20\xd0\x8d\x08\x8c\x88\xd2\x79\x97\x11\xc1\x3a\xc3\x8e\x79\x06\x57\x09\xd6\x34\x24\x36\x6b\x59\xc9\x6a\x56\x6b\x90\xa5\xbd\x39\xb8\x60\xd1\x70\x3b\x31\x2e\xdd\xad\xb5\x2d\x94\xf3\xb8\xdd\x7d\x17\x71\x35\x5d\x79\x98\x1b\x18\xa2\x19\xab\xf2\x1c\x8c\xac\x37\x96\x28\x5b\x22\x9c\x0d\x62\x16\x2c\x56\x03\x6f\xcc\x7d\x7e\x91\xf4\xa4\x9d\x2a\xe9\x45\x5c\x58\x4c\x95\x8a\x69\x85\x54\x74\x3f\x7a\x25\x42\x7b\xeb\x13\x3e\xfb\xa2\x74\x78\x74\x7c\xa8\xec\x6c\x0f\xb2\x40\x41\x7b\x47\xdb\xa3\xe6\xc6\x77\x55\x07\xd3\x58\x73\x06\xff\xa0\x4d\x2d\xdb\xb1\xcc\x8a\x54\x9e\xcf\x6a\x36\x2f\x6a\x4d\x73\x3d\xc2\x32\x6b\x90\x9c\x0e\x31\x7c\xd9\xc9\xb9\xd5\x68\x3a\x9e\xea\xe7\xa1\xac\x6b\x7a\xe7\x65\x36\x6b\x4a\x55\xce\x65\xc5\x80\x12\x02\x90\x29\x65\x35\x53\xf5\x00\xa2\xd6\x75\x6b\x96\xf6\xd9\x05\xe5\x61\xb9\xa3\xf2\x30\x35\x7b\x55\x7f\x60\x2c\x1b\xa9\x9a\x56\x3c\xa2\x74\x78\xc9\x9a\xd0\x6d\x4b\xba\xb6\xf5\xa2\x1d\x4e\x82\xdb\x83\x18\x9c\xed\x1c\xec\xcc\xa6\x64\x5c\x45\x97\x9a\xc3\x2a\xc0\xea\x9c\x90\x55\xac\xc9\xe7\xc3\x2a\x12\x16\xa6\x8a\xdc\xa5\x9d\xac\x64\x20\x37\xf2\x1c\xe4\x4d\xc8\x6d\xf0\x70\xb9\x82\xdb\x87\x98\xc3\x9d\x2d\x5a\x41\x55\xc1\x3b\x0d\x26\x09\xcb\xf4\x45\x33\xcd\x4f\xb3\x89\x33\xc8\xf6\x65\x23\x45\xa2\x8a\xb6\xd1\x73\x91\x89\x5e\x31\xec\x38\x47\xf0\x48\x84\xbb\x07\x37\x0e\xb7\x0e\x84\x51\x54\x8d\xb8\x9e\xde\x7d\x97\x04\xae\xf3\xf3\x6c\x3e\xcf\x32\x5f\x51\xf2\x3c\x8a\x06\x41\x13\x46\xd8\x51\x37\xd7\x35\xee\x4e\xc5\x9a\x71\x77\x92\x84\x57\xf3\x82\x02\x3a\x8d\x55\xc8\x4f\x9b\xc1\x0a\xa9\xcb\x2a\xb7\x2f\x6c\x4c\x05\x01\xa0\x5b\x17\xc8\x6d\xa5\x65\x23\xb9\x5c\x36\x73\xde\xba\x28\x99\x9f\x00\xd8\xe5\x86\xf4\x8d\x70\xab\xdb\x81\x1b\x45\xdd\x26\x25\xad\x61\x75\xc9\x2d\xa2\x96\xc5\xb7\x80\xe8\x9f\xd1\xce\x06\x88\x6b\xf9\x2a\x6a\xe8\x0a\xcf\x33\x73\xcb\xf3\x3e\xe0\xe5\x4a\x5b\xd7\x0e\x8f\xb9\x82\xb8\xbb\xcb\x21\x38\x86\x63\x3b\x76\xd7\x65\x65\x49\x53\x77\x92\xe6\xa6\xe9\x58\xb9\x69\xd8\xf6\x80\x7a\x2b\x24\x86\x6c\xa5\x61\x24\xa2\x44\x75\xc3\x20\x5e\x58\x42\xe1\x58\x5e\x9e\xdf\x9c\xe3\x3a\xf1\xfc\xa4\x37\x70\x15\x46\x71\xd2\x3b\x13\x3b\xa6\x59\x56\x14\x67\xb0\x4d\xbc\x91\x72\x67\x77\x85\xe2\x52\xfb\x2f\xce\x75\xdd\x30\x46\x5d\x9c\xa8\xb2\x31\xa8\x61\x2b\x0e\xfc\x05\x3a\x73\x17\x07\x6b\xf0\x4e\x4a\xb6\x37\x6e\x33\x0e\x31\x32\x98\x2a\x55\x1c\xae\x57\x3c\x21\xb8\xee\x6a\x33\x56\x99\x71\x11\xc8\xc1\x43\x4b\x7c\x7f\xe1\xd8\x51\x70\xc1\x82\x3c\xb3\xab\x0c\x4d\xbb\x23\xcc\xcd\x86\x4c\x30\x8d\xb5\xfd\xb4\x72\x2f\x11\x46\x36\x42\x52\xce\xe1\x7f\xe5\x93\xc5\xeb\x1d\xcc\xa3\xfc\x56\x17\x93\x63\xd9\x0f\x16\xda\x25\x56\xd0\xf0\xc6\xe3\xe1\xfb\x0e\xe6\x0e\x1e\x7d\x42\x0e\xf7\xf1\x13\x82\xfb\x4e\xae\xa0\x69\xda\x76\x6e\x98\x2b\xe2\x8c\x88\xce\x89\xf3\x34\x36\x02\x2f\x8e\xe3\x38\x08\xbd\xb8\xea\x06\x1f\x10\xd7\xc4\x8d\xc2\xdb\x89\x13\xec\xdb\xdd\x3f\x84\x51\x84\x10\x97\x5d\x4f\xbb\xc8\xed\x2b\xab\xe2\x6e\x3c\x44\x47\xaf\x59\x59\xb9\xcd\xe1\x88\x52\xdd\x1c\x50\xba\xa6\x89\x38\xf0\x6f\xf3\x9e\x1f\xcf\x3e\x14\xf8\x5e\x57\x92\x89\x76\xd0\x21\x8f\xeb\xce\x0e\x8f\x8f\x0e\x5f\x74\xe6\x75\xde\x2b\x4a\x33\xe1\xef\x83\x02\x2a\xe6\x93\xd0\xb6\x6c\xd3\xf5\x1d\xdf\xa5\xa0\xa8\x4f\x96\x24\x26\x85\x4b\x63\xdb\xb5\x2c\xd7\x73\xac\x30\x3b\x99\xff\x1d\x68\x44\xe0\x34\xb2\x5e\xef\x6b\xff\xce\xeb\xbd\x9c\x72\x6e\x5b\xa3\xf1\xc4\x49\xe9\xf6\xd5\x3d\x29\xda\x02\x65\x63\x1f\xff\x8e\xab\xba\x1d\xfe\x79\xee\xfb\x71\x9c\x0d\x77\x03\xfc\x7e\xd5\xda\xb2\x3f\xcf\xf2\x4b\xb6\x22\x8a\xb2\xbc\xa7\xfc\x71\x3e\x0a\xc3\x73\x1a\x8b\xce\x60\xe3\x12\xe5\x32\xe8\xe0\x49\x72\xc3\xed\xb0\x9e\x56\x4f\x8c\x3f\x6e\x83\xfd\xc9\x30\xcc\x39\xbf\x0c\x2b\xf9\x26\x84\xe0\x70\xe5\x0a\x3d\x0f\x0e\xf9\x93\xf3\x55\xad\x5c\xab\xbb\xaf\xe5\xee\x7f\x21\x1a\x9e\x63\x59\xb6\x65\xdb\x83\xde\x74\x4c\xcf\x77\x7d\x37\x08\x43\x0f\xcc\x27\xcd\x45\x73\xdf\x34\x0d\xc3\x70\x0d\xdd\x35\x2d\xc7\xb3\x7c\x5d\xf7\x3d\xef\xd4\xfe\x3b\x70\x13\xda\xe0\xa7\x01\x1f\x5f\xf9\xf7\x84\x8f\x4b\xb9\xeb\xce\x38\xd0\x9e\x04\x97\xdd\x71\xf5\x4f\x86\xdb\x36\xf9\x6d\xa4\xe8\xbb\xae\x7a\xe7\xef\xbe\xc7\xc1\x9d\x98\xf0\xce\x3b\x79\x47\x66\x3c\xe7\xc5\x19\x7a\x01\x7a\xfd\x13\xdb\xaf\x27\xc7\x99\x77\x5c\x47\xaf\x3d\x41\x06\xbd\xd3\xba\x9e\x04\xa3\x0a\x28\x5f\x36\x92\x2d\x6a\x48\x40\x7b\xe8\x8b\x11\xba\x07\xae\x3d\x01\xd8\xd7\xd8\x78\xbe\x30\x46\x3e\x56\x84\xf8\x1c\x81\x63\x42\x0c\x16\x89\x2b\xf8\x7d\x18\xeb\x9a\xae\x27\x9a\xae\x6b\x49\xa0\x28\xba\xed\xab\xb2\x11\xb8\x0e\x04\x71\xe4\x7a\x7a\x54\xd8\x84\xc4\x91\x11\xbb\x8e\x63\x44\x85\x9d\xd2\x54\xd4\x6e\x56\xa2\xb1\x30\xb0\xe9\xfb\xbe\xdf\x97\xd8\x8c\xed\xe1\x51\x08\xfc\x90\x10\x9a\x9e\x92\xd8\xb6\x2c\xc3\xb0\xbc\xc0\xf2\x23\x33\x34\x0d\x53\x1f\x7c\x35\x2b\xe4\xe7\x4b\x06\x1f\xbc\x15\x29\xcf\xfb\x9b\x9c\xcb\x6e\x97\xa0\xc3\xd6\x80\xb0\xde\xcd\xeb\x37\x2e\x2c\xe0\xea\xee\xea\xdc\xd2\xde\xe3\xa0\x60\x94\xab\x19\xa3\x91\x6f\x19\x96\xe9\x3a\xae\x63\xc7\x73\x66\x32\xdb\x83\x5c\x8f\x89\xe7\xb9\xac\xf1\x32\x4a\x12\x2b\xf6\x6c\xd7\x71\xf2\x30\xcf\x8b\xbe\x1b\x6d\x53\x7e\xc7\xb7\x31\xd2\xf9\x2e\x06\x76\x12\x5a\xb6\x69\x39\x8e\x63\xfa\x04\xdc\x01\x03\x27\x72\xea\x38\x8e\xed\xc6\x89\x17\x53\x3b\x19\xde\xf6\x34\x27\x8e\x48\xfa\x38\x51\xac\x09\xaa\x97\xad\xa4\x4f\x73\x3e\xc7\xfb\x41\x74\xc4\x67\xff\x6c\xcd\x78\xb0\xea\x9a\xb0\xb5\x0a\x4d\x3d\x91\xd8\x7f\x92\x83\xdb\xb5\xac\xeb\x62\x3f\xcb\x28\x9d\x2a\x91\x7e\x79\xc4\x3f\x88\xb0\xd9\x97\xd3\xbc\xae\xe6\x1d\x9e\xf7\x05\x49\x92\xf8\xa4\x21\x69\x46\x48\x7e\x49\xb8\x7f\x15\xdb\x9f\x73\xdb\x4e\x45\x33\xf4\xe2\xd1\xf2\xdf\x88\x1b\xc1\x74\x0d\xb3\x78\x01\xe6\x3b\x80\xbc\xf2\x01\xc6\xb0\x52\x9e\xaf\xc2\x4a\x58\xcb\xc1\x28\xca\x79\xee\x3b\x61\x18\x04\xc2\x3c\xd6\xcd\xd8\x8b\x8a\xd8\xb1\x2c\xd7\xb5\x82\x24\x21\xf9\xdc\x30\xf5\x5b\xe2\x4c\xd6\xb8\x94\xa6\x3d\x5f\x4a\x94\x90\x98\xd6\xb2\xec\xfb\x9e\x15\xb9\x59\xce\xbc\x42\x6d\x6d\x7b\xac\x33\xe1\x79\x8a\x15\xbe\xf7\xd0\xcb\x06\xfe\x81\x4b\xa1\xdf\xda\x39\x8b\x03\x8c\xb1\xa8\x3b\xef\xc1\x6a\x41\x42\x95\x83\x52\x16\x75\xee\x18\x61\x14\x04\xac\xa6\x32\x89\x12\x59\xa1\x59\x2e\xe7\xd9\xa4\x8b\x74\x79\x58\x51\x19\xb9\xf6\x7a\x45\x59\x63\x1a\x86\xb3\xde\x8f\xcd\x45\x9c\xc5\xae\x1a\x67\x23\x78\x75\xa7\x95\x4d\x91\x76\x16\xcb\x9a\x21\x1d\x1d\xac\xea\x67\xee\x18\xcf\xba\x90\xb4\xba\x6c\xfb\x70\x69\x7b\x9e\x17\x07\xbe\xa1\x47\x60\xc6\x94\xd6\x5d\x96\x4c\xe3\xcc\x61\x9d\x93\x81\x91\xc9\x96\xa2\x28\xaa\xd5\xa7\x9b\x6b\x0e\x1f\x37\xca\x75\x96\xea\xf2\xdc\x38\xf2\x18\x35\x6e\x5d\xf5\xb0\x3f\xe6\xb2\x95\xca\xb3\x18\xc8\xcb\x07\x39\x3e\xbb\xb6\x7f\xed\xe9\x70\x1e\x06\xd9\xbf\x25\x0a\xf2\x38\x3b\x33\xb9\x90\x55\x3a\x93\x07\x52\x99\x68\xb2\x12\xd8\xbc\xd9\xb6\x29\xcb\x79\xee\x38\xae\xeb\xba\x96\xd7\x17\xb1\x2e\x9b\x99\x9f\x94\x34\xb4\xed\xc0\x37\xa3\x84\xa6\x39\x9b\x9b\xa6\xed\x33\x53\x31\x75\x3f\x1e\x4c\x8e\x20\xb1\x62\xcb\x05\x95\xeb\x4d\x3d\xa6\x40\x4f\xcb\x20\x2f\xaa\xba\xac\x52\x56\x91\x94\x26\xa4\xe2\xbc\x64\xc7\x2e\xe7\x25\xa5\x71\x1c\x2a\x98\xa9\x5c\xa4\x7d\x36\xb1\xcb\x39\x42\x12\xdf\xb3\x86\xcb\xf1\x2b\xe8\x7e\x64\xa1\xaf\x44\x6f\x46\x6f\x5f\xcb\xf3\x0b\x91\x9f\xdb\x96\xbc\x16\xe6\xf8\x82\x2c\x9c\xac\x04\xe1\xdd\x28\x75\x13\x1f\x47\x07\x0f\x8b\x29\x4b\x3d\x70\x19\xf5\x55\x59\x71\x7c\x3f\x72\x6c\x55\x96\xe3\x58\xd7\x0c\x5d\x37\x34\x1d\x2a\xdf\x35\x0d\x3d\xb7\x23\xdf\x77\x75\xc7\x32\x0c\xd0\xe3\x20\x58\xc4\xae\x26\xab\x9e\xed\x13\xcf\xd0\x75\xcb\x32\x9c\xc0\xf3\x22\xa2\x69\x86\xce\x3a\x45\x57\x0d\x27\x09\x15\xd3\xd7\x46\x0d\x71\x73\x1e\xc6\x1c\x61\x3a\x28\x61\x0a\xf1\x06\xc2\xba\xd4\x71\x1d\xc7\x26\x89\x93\x10\x2b\x31\x6d\x2b\x9c\xe7\x94\x2a\x61\x9c\x10\x52\x29\xb2\xef\xf9\x66\x78\x0b\x1a\x53\xd2\xc7\x13\x3b\x2d\x78\xad\xd5\x88\xc7\x51\x87\x3c\x80\x8e\xd0\x97\xa3\x6f\x43\xdf\x8d\xfe\xff\x77\xd4\x25\xff\xdf\x62\x57\x6a\x58\x16\xfa\x96\x6e\xf1\x93\x6a\x76\x54\xb3\xe2\xbf\x29\xba\x07\xed\x14\x99\x2b\xed\x14\x24\xa3\x76\xfa\x6f\x84\x7d\x01\xd5\x4c\x95\xf4\x89\x87\x9e\x8b\x1e\x46\x8f\x20\xb4\x77\x27\x2d\x3d\xb9\xba\xc2\xde\xd5\x2b\x8f\x97\x2a\x9d\xc4\x24\xf1\x7c\x8f\xcd\xbd\x9c\x92\xc4\x4c\x3c\xd7\xb1\xc1\xf4\x8a\x3c\x5f\x10\x45\xd9\xcc\x9c\x06\x61\x10\x44\x5e\x18\x18\xa9\xeb\x38\x96\x4b\x62\x2f\xa6\x4e\x62\x5b\x96\x6d\x93\xc4\x23\x29\x8d\xf4\x4b\x13\xa9\x75\x99\xf3\xb9\x9c\x83\xde\xe5\x70\xbf\xe8\x89\x40\x7d\x49\x11\xc6\x24\x21\xb1\xef\x79\x6c\xee\xe6\x34\x21\x56\xec\x3b\x8e\x35\x82\xca\xda\xdc\xf5\xc2\x30\x23\x8a\xa2\x13\x3b\x4d\xef\x04\xa2\x72\x5b\x5d\x06\x46\x09\x53\xa5\x80\xc3\x65\xdd\x1d\xae\xfd\xbb\x45\xd7\x26\xf5\x00\xa3\xc3\x2a\xaf\x20\x84\x58\x89\xe7\xb8\x2b\x74\x16\xe7\xd1\xb5\x31\xf8\x6e\x59\xf6\x59\x74\x8d\x03\xec\x58\x34\xf6\xa2\x74\x13\xe0\xf2\xce\xd9\xda\x01\x76\xb2\x6c\x25\x9f\xc3\xfe\xf2\x27\x87\xd3\xcb\x2d\xd6\x49\x95\x24\x97\x03\xcf\x9a\xb3\xa0\xa1\x9e\x27\xaa\x6c\xf8\x63\x82\xd1\xe7\x80\xdb\x0e\xb9\x15\xf0\xc7\x4b\x24\x0a\x28\x64\x2a\xcf\xb3\x3d\x05\xdd\x87\x3e\x9f\xcb\x5f\x38\x80\xab\xbb\x47\xc7\xf7\xc0\x5d\xc8\x55\x8a\x99\x5f\x32\xbf\x04\xa4\x2b\x8a\x06\xe8\x24\xb8\x9d\x48\x79\x7a\x3f\x3f\xb1\xa7\xf9\x42\x8e\x5d\x37\x16\xba\x93\x3a\x51\x37\x68\xb3\x61\xf3\xcd\x24\x3f\x46\xf1\x2a\xef\xf7\x14\xf4\xdc\x5b\xa0\xb9\xac\x16\xe8\x16\x10\x16\xf3\xfc\xac\x16\x88\xda\x69\x7a\xcb\xa5\xed\x4b\x68\xce\xe4\xb9\x9f\xe1\x7a\x0f\x5d\xbc\xde\xc5\x7c\x39\x5c\x16\xbe\x2d\x98\x3f\xfc\x80\xac\xaa\x8a\x0e\xa8\x37\xec\x55\x52\x87\xa7\xc3\x73\x40\x67\xa9\xff\x2c\x94\x75\x5d\x5b\x83\xe3\xc6\x4e\x22\x74\xab\xfc\xff\x3a\xdf\x7d\x5b\x3d\x10\x1e\x6b\x6f\x38\x6c\xcf\xbb\x23\x2e\x5e\x74\x41\xde\xae\xa3\x28\xd9\x19\x5e\xe4\x01\xb2\x45\x97\xeb\xba\x61\xae\xc2\x09\xea\x59\xd0\xe0\x1c\x3f\x03\x40\x27\x77\x8c\x15\xac\xf6\x25\xe0\x39\x8d\xdd\x5b\x32\x1a\x78\x0d\x17\x08\x59\xbd\x99\x36\x76\x39\x7a\x4a\x40\x23\x7a\x6e\x71\xf3\x04\x7b\x13\x19\x7c\xbd\x83\xef\xdd\xf2\xf5\x3e\xe7\xb6\xf5\xde\x9a\x9a\x92\xda\x35\xf2\xb5\x61\xeb\xe5\x45\x91\xa9\x4a\x9b\x75\xb2\x92\x82\x3c\x97\xe7\xa0\xdc\xba\xf9\xe7\x89\x27\xaa\x9e\x25\x9e\x38\x0f\x04\x4c\x95\x92\x69\x8e\xae\x20\x9d\x47\xd9\x84\x6b\x9f\x87\xaf\x09\x07\x3b\xc3\xc5\x77\x56\x0f\x77\xe5\x86\xa4\x22\x44\x0b\x93\x3a\xb7\x55\x45\x51\xdd\xcc\xd5\x14\x59\xb5\x4f\x1c\x45\xc9\x13\x4d\xf6\x68\x5a\xd7\x29\xf5\x82\xd0\x0f\x02\x7f\x64\x8a\x89\xc2\x8a\xde\x98\xe6\x7d\x52\x66\x75\x81\x9d\x3e\x2b\xab\xac\xc4\xc1\x06\x8b\x0c\x0c\x72\x0b\x8b\x20\x8c\x02\x84\x38\xbc\xdb\x7c\xb2\x9b\x70\x4d\x18\x44\xa0\x70\xb0\xb3\x82\x76\xe7\x72\x5e\x49\x2a\x12\x28\x0a\x21\x75\x1e\x28\x9a\x9b\xb9\xaa\x12\x2c\xe8\x28\xac\x07\x31\x42\x56\xfc\x82\x2b\x6f\x7e\xda\x4e\xf3\x85\x3a\xc2\x54\xd4\x42\x73\x09\xe7\x0c\x70\xe8\x4c\x95\xea\x69\x8e\x54\xf4\xe2\x35\x1c\xf7\x7e\x1e\xdc\x86\xb9\xbb\xa6\x41\xea\x8a\x04\xaa\xa2\x05\xa4\xce\x6d\x4d\x3e\x43\x9e\xb3\x68\x07\x41\xad\xd8\x97\xa7\x41\x46\x60\xa3\xc2\x5a\xa2\x11\x8b\x5d\x54\x56\x03\xc4\x55\x99\x17\x38\xb8\xa5\xbc\xe6\x62\x36\x04\x23\x13\x21\xa9\x9c\xe6\x68\xf7\x1c\xf6\x8b\xa0\xef\xf0\x4d\xbf\x6b\xbc\xb2\x1c\xb0\xaa\x5e\xd8\x78\x55\x1d\x60\x4f\xef\x20\xa6\x47\xb0\xdd\x66\xbd\xf7\x59\x39\x42\x4d\x96\x68\x00\xfb\x71\x98\x70\x23\x6f\x37\xf8\xa3\x37\x6e\xcb\x35\xf0\x55\x0c\xd2\xea\x96\x1d\x10\xc8\xc5\x08\x4d\x5c\x27\x81\xaa\xc8\x5a\x40\xaa\xcc\x51\xe5\x15\x35\x28\xea\xad\x91\x98\x81\x45\x07\x0c\xfb\xf5\x08\x6a\x5e\x6c\x22\x78\x84\x47\x46\x48\xea\xa6\x39\xaf\xc0\x45\x17\x20\xd8\xe4\x9d\x4b\xf8\xb7\xab\x07\x72\x1c\x81\x08\xce\x41\x58\xa4\xb7\xe6\x94\xd7\xfb\x3c\x42\xb1\x50\x37\x61\xd8\xe4\xea\x8d\x74\x32\xc2\x63\x5d\x29\x97\x57\xfa\xad\x19\xd8\xd9\xe1\xd1\xd6\x38\xa0\x40\xd9\xbd\x32\x3b\x3c\xb8\xc1\xe3\x90\x68\x4b\x91\x0e\x84\xe8\x42\xe1\x4b\xc6\xec\x26\x21\x84\x34\xcc\x69\x5b\xd0\xea\x1a\xd4\xb6\xbb\x2d\x5c\x95\x54\x50\x02\x02\xb4\x44\x4b\xc4\xcc\x2a\x49\x6b\xa0\x60\x83\xcf\x08\xcb\x99\x57\xa3\x0d\xd9\x56\xa1\x67\xa1\x17\x20\xf4\x00\xdc\x19\x84\xe9\xe5\xc2\xce\x69\x48\xb2\x06\x44\xad\x6b\xd0\xda\x76\x81\x6e\x15\x79\x77\x81\x24\xbd\x14\x59\x53\xa4\x2c\xe7\x52\xcb\xf3\x6b\x5f\x80\x5e\x89\xbe\x0c\xbd\xe9\x89\x65\x07\xef\xe6\x79\x4e\x37\xce\x57\xed\x6d\x3c\x97\x50\xae\xe9\xba\x9e\x6b\xba\xa1\x73\xd1\xe3\x84\x9a\x6c\x46\xbe\x7f\x4a\x23\x5d\xb6\xd2\x20\xde\x70\x40\x69\x36\x3a\xa0\x53\xdd\x34\x4c\xd3\x34\x0d\xf3\x94\xf2\x27\xa6\xc9\x53\xb4\x0e\xed\x75\x5c\xa7\x76\x18\xf6\xfa\x79\x68\xfb\x4e\x5e\x68\x31\xfc\x9f\x65\x59\xd6\xea\x71\xec\x13\xc5\x6b\xa9\xa6\x39\x7a\x1a\xba\x8a\x9e\xcb\x6b\xcb\xd0\x01\x0f\x0a\x28\xd3\xb1\xc9\xfd\x59\x64\x60\x33\x46\x72\xbc\xe9\x46\x1d\x5f\xf4\xa2\x62\xf0\x9b\x66\x89\x40\x9f\x57\x5d\x19\x45\x71\x9c\xcf\xa3\x38\x89\xa7\x7e\x2e\xcb\x6e\x36\xd8\x47\x99\x2b\xab\x24\x0f\xc2\xc0\xf7\xb9\x8d\x34\x18\x76\xba\x6c\xb2\x79\x39\x9f\xaa\xcc\x08\xc3\x20\xe8\x79\x23\xb3\x28\x3a\xf5\xa1\x4a\x29\xf7\x60\x54\xd0\xd2\xa4\xcf\xd7\xf5\x08\x08\xa3\x7c\xd9\x4a\xf6\xc4\x43\x57\x78\x37\x8c\x5b\x22\xec\x88\x93\xd5\xf4\xd2\x57\x25\xdb\x0c\x7d\x92\x24\x49\x1c\xf9\x74\xbe\x44\x80\x1a\xba\x68\xd6\xaf\xc5\x01\x7f\x4d\x9e\xd3\x89\x7e\x1e\x29\x57\x39\x10\x9a\x79\xdb\x2b\xeb\xfe\x21\xad\xe4\x89\x2a\xda\x42\xcf\x19\x3c\x8b\xd9\x5d\x3c\xcd\xcb\xc1\xf2\x06\x13\xb2\xc8\xe6\xf3\x2c\xf7\x65\x79\x55\xb3\x11\x46\xd1\xa2\x33\x43\x3f\x21\x17\x60\x5b\x15\x6a\xa8\xa0\x51\xba\x59\xa7\x81\x9b\x4b\x20\x14\x91\x36\xe8\x2b\x1e\x73\x50\xd0\x0d\xf4\x25\xc8\x45\xdf\xb4\x8e\x38\x08\xab\x88\xde\xce\x81\xb0\x19\x3a\x3a\x2f\xc3\x85\x8d\xc2\xb9\x83\x2b\x1b\xe5\x75\x63\x75\xdd\x8a\x13\x76\x36\x2c\x82\x9d\xcd\x8a\xba\x89\xca\x32\x0f\x1c\x6c\x92\x44\x4d\x12\x99\x92\xa2\xf7\x4d\xdb\x73\x22\xdf\x77\x7c\x27\xcc\x8b\x79\x1a\x4d\x74\xdb\xf1\x23\xd7\xd0\x72\x47\x0b\x3d\x55\xd1\x7d\xc3\x8e\xe2\x24\x0a\x1d\x7f\xe0\x17\x5d\xd7\x35\x4f\x37\x0c\xd3\xb4\x2d\x73\x1d\x57\x80\xd2\x62\xa1\xa8\xf6\x76\x06\x84\x19\xb8\x4b\x6c\xd6\xb0\x8a\xd5\xac\x1e\xd6\x1e\x42\x08\x11\x04\x27\xa1\x19\xf8\xae\xdb\x14\x99\x1a\x28\x6e\x98\xe7\xb2\x69\xbb\x69\x54\x53\x42\x9c\x04\x97\xdc\x4a\x0f\xc3\x45\xea\x8d\x05\x9e\x2e\x42\x13\x64\x2c\xe7\xbc\x7e\xe8\x0a\x9a\x8d\xbd\x09\x6f\x41\xcb\xd8\x19\xe2\xe1\x9d\xe1\xf7\xd1\x1c\xc2\x9b\x8b\xdf\x3c\x5b\x29\xcc\xad\x24\xce\xe6\x65\x19\x66\x71\xce\x3a\x56\x82\x03\x72\x19\x36\x45\xd1\xb6\x45\xde\x16\x41\xc8\xbf\x02\x1c\xac\x19\x7b\x1a\x52\x87\x55\xac\x59\xaf\x23\x80\x08\x7c\x88\x17\x3c\xea\xc4\x8d\xa2\x96\xd5\x83\x3b\x3f\x5a\x45\x55\xef\x5f\xe0\xe7\x75\x0d\xf9\x40\x87\x0f\xa2\xc3\x81\x9f\xef\x46\x8b\x77\x61\x77\xa1\x48\x36\xa9\x32\xcb\xa2\x28\xe4\x3f\x60\x40\x30\x6f\x58\x07\xc6\xbc\xea\xf2\x38\x4a\xe2\xb4\x4c\xe2\x24\xb9\x13\x65\xb2\x82\xb3\x7a\x6b\x5c\xce\xea\xa3\xae\x18\xcf\x68\x54\xe8\x99\x83\xae\xd8\x5b\xb1\xc6\x6c\xf4\x22\x37\x62\x9a\xf7\xc0\xd3\xe1\xda\xfd\xfb\x83\xaf\xf9\x08\xc0\xa0\x6b\x0f\x06\x65\x3f\xcf\xcb\x86\xcd\xc1\x04\x94\x25\x76\x14\x93\x32\xcb\x1c\xaf\x05\x2a\x94\x2c\xb4\x49\xe0\x5a\x86\x1d\x9a\x16\x4b\x8a\xd4\x96\x65\x5d\x4f\x4d\x9b\xd3\x49\x00\x91\x4b\x6c\x36\x1f\x70\x3e\x06\x30\xc1\x3a\xd5\xab\x58\x49\xe4\xb4\x98\x18\xfd\xbc\xf5\xaa\x08\x6b\x63\x0e\xa6\x95\x6c\x51\x45\xf7\xa2\x87\x6e\xad\xc8\x38\xd8\x92\xee\xaa\x1e\xd6\x61\x7b\xa1\xca\x3c\x2f\x0a\xb3\x4c\x96\xbd\x22\xa5\x42\x18\xe9\xb2\x5f\x46\xa4\xaa\x52\xcf\x0f\x12\x8b\xd2\x22\xcf\x5a\xea\xd8\x41\x3c\x48\xfa\xb4\xe9\x4b\x51\x65\x46\x92\x8e\x12\x3e\xa5\x97\xc7\xec\x27\x48\x5d\xce\x79\x9c\xfb\xa9\x48\x45\xd7\x91\x31\x56\xe3\x6f\x1d\xf3\x34\x17\x48\xc0\xa7\x34\xae\x9e\xdf\x41\x45\x4d\xca\x3c\x77\x41\x2e\x59\x02\x51\xc5\x2a\x73\x21\xe7\x39\xb8\x15\x4b\x20\xac\x58\x6d\x8a\x83\xfe\x18\x38\xd1\x5c\xc8\xe3\xe9\x71\xd3\x9c\xe6\x7d\x54\x40\xd1\x67\x0b\x82\x0b\xb3\x0f\xa7\x39\x1f\xf7\xb6\xfa\xb5\xbe\x5d\xf1\xe0\xc1\x32\xe1\xf6\x33\xef\x68\x3f\xbb\x44\xef\x6f\x82\x2a\xd5\xd9\xca\x30\xe2\xda\xbe\x01\xf9\xa6\x9c\xe7\x58\xad\x98\x82\x51\xc5\xdc\xe8\x32\xe5\x3e\x78\x40\xbd\x81\xab\x3e\x5a\x94\x38\x0f\x10\x06\x75\xd9\x8a\x0d\xb7\x1f\xaf\xdd\x66\x3f\x8e\xe7\xe5\xaf\x1d\x3e\xb2\x9a\xbe\xcb\x45\xf3\xc4\xbc\x60\x3c\x4e\x6c\x2b\x48\x12\x4a\x1d\x1f\x14\xd6\x5a\xb6\x67\xdc\x6a\x0f\x51\x2d\xcd\x70\xe8\x38\xcd\x12\xc5\x7d\xec\xf9\xe3\xac\x0b\x8a\x10\xd7\x0d\x02\xba\xbe\x3e\x1d\x71\x97\x94\x15\xb8\x79\x2e\xca\x83\x83\x12\x9c\x15\xf0\x3b\xc5\xdc\xf2\xaa\x34\x15\xd5\x9b\xcd\x66\x3a\x74\x5d\xa8\x75\x66\x27\x83\x8b\x90\x98\xf2\xeb\xed\xde\x7e\xbd\x75\x95\x18\x56\xf2\x7c\x42\x72\x3f\x48\x92\x2c\x51\x15\xaf\xce\xf3\xb3\x4f\x9e\x6f\x9e\x0b\x10\x79\x9c\xa0\xe5\x9f\xf7\x00\x3a\x44\xaf\x40\xaf\x43\x5f\x85\xd0\x01\x3f\xc4\xfa\x5f\x55\x6a\x0d\x77\x10\xa0\x6d\x9e\x4b\xe8\xf2\xe2\xf3\x22\x1f\x0b\xf2\xd7\xf3\x6f\x40\x59\x17\x9f\x9f\xb8\x4d\x5e\x34\x6d\x9e\xb5\x79\xc8\xa5\x6a\x30\xe8\x86\xe2\xc9\x55\x5f\x63\xf5\x0e\x52\x76\x35\x83\x1d\x89\x19\xc7\xc3\x33\xd6\x78\xe5\x1a\xf4\x00\x76\x0e\x00\xcb\x79\x3e\x49\x2b\xd6\xb1\xb6\x82\x90\xd1\x12\x50\x57\x31\xc2\x8f\xa0\xe4\xcc\xc6\x26\x56\x98\x0f\xa4\x6f\xc7\x1a\xf6\x1a\x21\x49\x5f\x7d\x96\x31\x5a\x0c\x5b\x07\x9b\x56\xe3\xe3\xd5\xb6\xac\x4b\x2c\x0e\x24\x3d\xcb\x06\xfe\x1a\xd9\x90\xde\x5a\x52\x37\xa6\x2d\xc1\x1f\xb6\x96\x72\xee\x33\xcd\x93\xf2\xce\x55\x11\x13\x1b\xad\x73\xb3\xd5\x0a\xb6\x67\xa1\x2f\x5c\xad\xf5\x0e\x9b\xf5\x44\x6a\x70\xb2\x6c\xa1\x56\x29\x8f\x02\xd4\xb9\xe7\x79\xbe\xe7\x7b\x5e\x33\x56\x29\xae\xe2\x32\xe7\x55\x8a\xa2\xba\x50\x06\x05\xb2\x8e\x91\x6d\xea\x3a\xf9\x71\x1c\xc4\xe9\x78\xb6\x8d\xdb\xf2\x07\xc8\xe2\x36\xce\x13\xb2\xe5\x1f\xf7\x0c\xcf\x9d\xa4\xa4\x84\xf2\xc1\x2a\xc9\x86\x3b\x1e\x73\x73\x57\x86\xfc\xcd\x4a\x91\x73\xa2\x2a\x4e\x1c\xe7\x79\x1c\x73\x42\xf5\x6d\xd7\x13\x6d\x73\xf5\x75\x4a\xd7\x12\xf4\x8e\x46\x7c\xb1\x3e\x0c\xd4\xb2\x7a\x8c\x61\xdb\x45\xc1\x63\xd8\xbd\x73\xab\x34\xc5\xa0\x2f\x5b\xb1\x9e\x78\xe8\xe9\xe8\xf9\x67\x76\xf0\x3a\x2a\x06\x77\x09\xc7\x8a\xb5\x6a\xeb\x11\xcd\x89\x1a\xa7\xf6\x09\x8f\xc2\xaf\x22\xaf\x89\x99\xf8\xf6\x3a\xf2\x3a\x71\xcf\x53\x58\xa7\x15\x0f\x13\xdb\xeb\x68\xab\x6d\xda\x36\x89\x7d\x92\x72\x59\x37\xd8\xc1\xd3\x8a\x5b\x4e\xe8\x78\x75\xf1\xfd\x1b\xfb\xcf\x87\x4b\x2f\xcf\x23\x5d\x83\xf6\x7e\xd1\xb3\x80\xd2\x34\x8a\x4d\xbd\x4e\xc2\x3a\x2b\x88\x99\x24\x81\xef\x83\x17\xb5\x55\x25\xda\x2c\x6b\x59\x96\x67\xba\xa1\xb8\x99\x91\x39\x61\xe0\x5b\x7a\x60\x97\x49\x5a\x39\xd4\x1e\xdc\x88\x34\x8f\xf3\xf9\xc4\x3d\xcd\x27\x76\x4f\xa3\x56\x07\x1b\xf3\xd9\x29\xd6\xb2\x95\x0a\x6e\x0f\xdd\x87\x0e\x10\xda\xbb\x26\x9d\x29\xea\xd5\x6e\x6f\x6e\xf6\x65\xd1\xaf\xa9\xa5\x68\x71\x2e\x9f\xc7\x76\x57\x5f\x4b\x74\x21\xea\xe5\xa5\x63\xd4\x2b\x49\x44\x95\xc5\xcd\x79\xfa\xc1\x6c\xb3\x81\x76\x33\x4c\x37\xc3\x5e\x69\xb5\x19\xf6\x42\x08\x2d\x97\xc8\x5f\x5a\x52\x22\xc6\xdb\x37\x7e\x7e\x82\x90\x22\x7e\xe8\xcf\xd1\xf8\xba\xb5\xb4\xa5\x5c\x8c\xb6\x6f\x7c\xe8\xcf\x86\xd7\x3f\xc0\xdd\x6a\x04\x28\xc5\x8d\xe4\x08\x11\x12\x10\xda\x99\x5d\x99\xa5\x62\x7a\xd3\x15\x22\xc2\xdf\x8b\x96\xae\x14\x8a\x1a\xda\x1a\xdf\x3b\x3f\xf5\x7b\x74\xb8\x35\x8b\xc4\xae\x97\x3d\x12\x06\x5a\x18\x5a\xc6\x82\x8a\x1a\x39\xa1\x81\xa7\x50\x55\x37\xa7\x26\x97\x01\xf9\xf2\x0d\x92\x37\xfd\x6b\xf4\x54\xb4\x8d\xae\xa2\x7f\xc0\x67\x8e\x9f\x9f\x1c\x86\xf1\x4c\xf0\xec\x0a\x3f\xf3\x3c\x7d\xd3\x4f\xbd\xe9\x63\xdf\xfa\xa6\x67\xbe\xed\x3b\xdf\xd8\x7f\x2e\xd1\x13\x42\xfa\x5f\x1c\x60\x81\x4f\x0b\x74\xe1\x09\x5a\x8f\xbe\xfd\xeb\xd4\x8f\xed\x7e\xd9\xf4\x6b\x75\x46\x59\xed\x80\x01\x3f\x4c\x18\x90\x01\x4e\x7f\x19\x4b\x44\xb4\xd1\x33\x11\xe2\xb3\x89\xae\xce\xb4\xe3\xa3\xe3\x5d\x2c\xce\xb4\xfd\xf3\x11\x45\xb1\x72\x5a\x3b\x60\x81\x6d\x19\x6a\xaa\x25\xcc\x64\xbe\x11\xf4\xb9\x8a\xbd\x74\x12\x90\xb0\x57\x0d\x4d\xd7\x3a\x83\x55\x91\xa2\x13\xdc\x59\xc4\xc2\x5e\x9f\x0f\xb8\xfb\x95\xe5\x3b\xa4\x6f\x12\xbf\x72\x7b\x5f\xfa\x39\x74\x65\xf1\xa3\xdb\xaf\x96\xfe\x00\xcd\x2c\xf4\xb2\x5f\x58\x2e\xd1\x1f\x2d\x5f\x22\xfd\xf0\xf4\xbf\xf0\xf7\x5e\x84\xdf\xa9\xbc\x5a\xfa\x83\xdf\xfa\xb3\x57\x5d\x7b\xe9\x9f\x20\x40\x01\xf2\x25\x7f\xda\xa2\xed\x71\x3a\x15\x96\xb0\xc4\x7b\x52\x1c\x1d\x6f\x1f\xcf\x0e\x27\x6f\xc5\xac\x17\x0e\x9c\xef\x8b\x6b\xf6\xfb\x01\xd8\x9f\xfd\xe0\x0b\xdf\x24\xf4\xcf\x99\xb6\x84\xd1\xc7\xd8\xe7\xfc\xc7\x7e\x34\x89\x7f\xf9\x53\x1f\x84\x67\xfe\x1a\x41\xc0\xcf\xd2\x87\xa2\xcc\xb1\x38\x3b\x9c\x5d\x99\xdd\x2b\xcd\x94\xb3\xee\x66\x3b\xb3\xa7\xc0\x74\xff\x08\xe1\xb8\xef\xc4\xee\x34\x53\x84\x38\xcc\xbc\x44\x4d\x3c\xdb\x56\x7a\x45\xeb\x58\x1b\xcc\xc1\x98\x06\x84\xd4\xe9\x22\x67\x85\x46\xb4\x02\x13\x96\x30\xbd\x8c\x12\xac\x8c\xb4\xe0\x2f\x1d\x8e\xc7\xe7\x9c\x9f\x4c\xbf\x57\x52\x84\xc9\x54\xba\x0e\x68\xba\x7f\x7d\xef\xba\x70\xbc\xbd\x7b\xb4\x75\x38\xcb\x84\x82\x62\xab\xcf\xe5\x0a\x22\x68\x6c\x26\xb3\x80\xcd\x99\xea\x42\x0d\x88\x75\x79\x9c\x75\xf9\xc2\x9e\xb4\xe0\xb2\x34\x71\x86\x37\x9b\x36\x4e\x22\x50\x58\x97\x24\xc9\xbc\x06\xdb\x62\xf3\xb2\x83\x48\x5b\xf9\xbd\xb5\xe4\x4d\xe7\x48\x40\x12\x9f\x65\xbf\x9a\x74\x26\x0c\xa4\x81\x44\x74\x82\xdc\xa9\x73\x92\xe5\x62\x71\xd3\x9a\xce\xf9\x39\xf6\x9a\x8c\xf3\xf3\xa9\x14\x88\x2e\xff\x9f\x8d\x3e\x90\x82\x9b\x0a\xca\xa2\x15\x82\x9b\x06\xce\x45\xb7\xaf\xe8\x22\xa7\x14\x01\x4a\x56\x38\x7c\xda\x1a\x87\x5b\xc3\xd2\xf6\xb6\xae\x09\x41\xaf\x89\xcd\x82\x40\x0c\x4a\xc0\x3a\x36\xa7\x03\xa6\x98\xd5\xcc\x49\x9b\x2f\x9c\xe1\x5a\xc1\xd2\x91\x02\x51\x1e\xf7\x52\x91\xf8\x2c\xa7\x7f\x00\x5b\xe3\xc7\x5c\x9b\xb4\xcc\x52\x0d\xd6\x74\x7e\xd5\xb9\x7d\x27\x36\x4c\xa3\xd3\xa0\xa7\x84\x35\x2c\x88\xa2\x00\x4c\x88\x71\x40\xc8\xcd\x39\xf7\x4f\x96\xb6\x34\xd8\x56\x4f\x47\xf7\x8e\x9c\xc5\xe7\xe3\x20\xd8\x47\x30\x03\x04\x12\x02\x22\x96\xbd\x6b\x3a\x19\xab\x58\x14\x62\x15\x92\x05\x99\x44\xe0\x80\x15\xb1\x86\xc5\xa2\x4a\xfd\xf0\x24\x9b\xf8\x2c\x62\x6d\x08\x01\x0e\xd8\x20\xe5\xe3\x08\x5c\x70\xb9\xfc\x74\x25\x47\x0c\xd1\xbd\x48\x45\x08\xb6\x66\x4f\x81\x81\x4e\x26\x07\x0f\x1f\x1f\xad\xf6\x95\x93\xa3\x35\xc9\xd5\x24\x0f\x5a\x0d\x64\xdf\xd7\x74\xed\xd4\xa6\x53\xe5\xa6\x33\xa9\x4e\x8d\x49\xce\xe2\xde\x64\x73\x8d\x68\x6e\x0c\xb5\x50\xb1\x9a\x2c\x1a\xc2\x3f\xdb\x91\x3c\xd1\x44\x2a\x9f\x4a\xc3\x71\xce\xdb\x8c\xac\xe9\x90\x1f\x31\x9a\xc1\xec\xe8\x70\x46\xc5\x62\x51\xe1\x5a\x76\xad\x26\x4c\x95\x2c\xf4\x5c\xfd\xa4\xa5\x90\xf6\x8a\x90\x60\x43\xe9\x0b\xd1\x24\xac\x5a\x98\x39\xd5\xa8\x46\xc1\x11\xe4\x3e\x11\xf4\x45\x9d\xe6\x7c\x6f\x5d\x7e\x9d\x67\xf1\x15\x60\x71\xb5\x82\xb3\x2b\x1c\x8e\xdb\x3d\x31\x04\x45\x09\x49\xd0\x69\xa0\xf8\x96\xa9\x9e\x24\x14\x8a\x5e\xe1\x57\x4e\x84\x92\x15\x7d\xde\x18\xc4\x08\x21\xc6\x59\xdf\x08\x2a\x21\xac\xe0\xf3\x04\xe3\x65\xc0\x65\xdb\xd3\xd0\x16\xba\x32\xec\xa9\xc0\x69\x67\x3d\x22\x6e\x67\x26\x0c\x8f\xde\xd4\x09\xc1\xba\xa9\x40\xea\xb0\x12\x6c\x87\x45\x50\xe1\xd4\xe8\xc3\x0c\x97\x46\xef\x8a\xda\xcd\x86\x10\x1c\xac\x66\x53\x9f\x44\x98\xcf\xad\xf1\x97\xdf\x20\x11\xf1\x45\x48\x40\xf7\xa0\x19\x42\xbb\x03\x1d\x73\x4a\x13\x66\x0a\xde\x68\xfe\x31\x5b\x35\x00\x9b\xf9\x92\xd1\x55\xe0\x40\x07\xae\xc7\x32\xa6\xbe\x53\x7c\xcd\x8b\x7f\xe4\x67\xde\xf5\xbd\x0f\xbc\xff\x7d\xef\x52\x5f\xd8\xff\x77\x2a\xfb\x34\x7b\xd7\xf7\xc2\x77\xc1\x7d\x5a\xff\x03\x53\x32\xf9\xab\x24\x4f\xf2\x04\x7f\x47\x7f\xc8\x5e\xf3\xe3\xd7\x7f\xf9\xfa\x9b\x3f\x8d\x1f\x65\xaf\xe9\xff\xaf\xcf\xfe\xf8\xbf\x82\x5f\x80\xf7\x20\x4e\xeb\xc3\x3e\x85\x7c\x8e\xc4\xec\x78\x76\x38\x1b\xdb\x68\xae\x6e\xa2\x74\x75\x97\x77\x0b\xda\x3d\x3a\x9e\xed\x1f\x1d\xcf\x12\xec\x99\x0c\x61\x5d\xcb\x74\x5c\xf5\x8a\x29\x14\x0b\xd5\x16\x9c\xac\x89\x02\x9f\x91\xbe\xb3\x41\x6d\x0a\xda\x23\xcb\xd4\xfb\x72\xa2\xce\x49\xa3\xd4\x64\x4e\xe6\xb4\x49\x6d\x3b\x69\xf2\xc4\xf5\xe3\x82\x78\x11\x97\xfb\xc1\x32\x92\x88\x68\x70\x6e\x7e\x06\xda\xe1\x3b\xc8\xfb\x76\xee\xf0\x49\x3d\xe3\xb7\xe8\x81\xd9\xd5\x60\x53\xc1\x5f\x90\xf5\x4d\x34\x06\x84\x8a\x6a\xdf\x81\xbf\x48\x20\x58\xc4\x10\xa0\x55\x3d\x6d\x2a\x45\xa2\xc9\x79\x46\x5d\xf3\xef\x39\xdf\x0c\x5c\x73\x0f\x1f\x01\x58\x2d\x2a\xb1\xe8\x0d\x4d\xa7\xac\x60\x61\x04\x1d\x2e\xc0\x04\x23\x62\x1d\xa3\x0b\x24\x56\x37\x8d\x29\x25\xc4\xb2\x4e\xa9\x10\xb3\x90\x35\x11\xd8\xa0\xb1\x96\x91\x18\x5c\x70\x16\x7c\xec\x3c\xc2\x28\x5c\x16\x52\x2c\x46\x7c\x66\xdf\x4a\x1a\xae\x6f\x57\x56\x2b\x18\x1e\x61\x6b\xb6\x15\x82\x4c\xc0\x4c\x20\x26\x10\xb3\xb0\x77\x58\x39\x75\x4f\x14\xd6\x4d\x5a\x16\x4e\x12\x48\x58\x00\x2d\x53\x86\x1b\xe9\x1d\x9c\x2d\x3c\x32\x31\xfb\x06\xab\x7d\xc3\x69\xc5\x97\x88\xe8\xae\xa6\x58\x70\x39\xb6\xba\x0e\x3f\x4c\xc4\xbb\x3d\x5e\x3b\x3c\xd8\xe1\x4c\xb5\x35\x03\x97\x42\x96\x42\x46\xbb\x8e\x9e\x76\xb4\x6d\x29\x64\xcc\xc1\xee\x70\x3f\x6d\x98\x8e\xed\x3e\x87\x86\xa9\xe4\xb4\xf5\xfd\x89\x42\x16\x2e\x17\x85\x0a\x5f\x93\xbf\x0c\xa4\x44\xf4\x56\x7b\xc2\x27\x0b\x9c\x35\x1a\xb9\x3e\x7c\xba\x18\x25\xbd\xdd\xe7\x53\x93\xf9\x30\xef\xea\x0e\xd7\x7d\x2d\xa0\x1e\x89\x5e\xe2\xa9\x8c\x90\x45\x46\xc8\xb4\xd6\x4e\x64\x81\xcb\xc4\x70\x69\xf1\x5c\xca\xfe\xd8\x95\xea\xac\x25\xc8\x4c\x94\x78\x8b\xbb\xb1\xe1\xe6\xe0\x8c\xf3\xbe\xde\x83\x36\x91\x14\xdf\xf3\x62\x3d\x73\x8d\xbe\x52\x64\x90\x01\x45\x45\x17\xb2\x34\x80\xdc\xe8\x1b\x8a\x0b\x65\x51\x48\xca\xa2\x92\x27\xd1\x29\xf1\x7c\x8d\x6a\x8e\x90\xba\x4e\xc3\xea\xb0\xeb\xd8\xbc\x8e\x3a\x28\x4e\xdd\xa9\x15\x24\x84\x24\x01\x12\x50\xb8\xcc\x79\x8f\x99\xcf\x43\x5b\x83\xa7\x7a\xbc\xb1\x4b\xb0\x31\x47\x31\xc4\x3e\x05\x44\xb1\xdf\xb5\xa2\x4e\xc3\x82\x64\xa7\x1e\x75\x72\x9b\x38\x83\x7e\x19\x6e\x64\x6a\x9a\xcc\x60\xb1\x03\x01\xa4\x8c\x30\xdb\x82\x82\x13\xdf\x40\x7b\x89\x14\x8b\x21\x7a\x1a\x7a\x36\xd2\xf8\x1e\x5d\xd9\x9e\x4a\x48\xc0\xd3\x7d\xb4\x35\xd8\x34\x12\x6f\x72\x82\x61\xf8\x75\xb0\x65\x10\x8d\xc1\x0b\x59\x15\xc6\x2c\x74\x31\xea\x65\xaa\xce\x69\x10\x65\x21\xeb\x12\x48\x59\x20\x29\x5d\x2b\x86\x7d\xab\xf5\xf3\x79\x06\x08\x22\x16\x75\x14\x6c\x98\xf3\x6e\xc8\x71\x9c\x51\x1a\x31\x77\x89\x02\xa0\xd8\x3f\x55\x08\x97\x57\x63\xaf\x96\xfb\xf9\x8c\xce\xb5\xbe\xdb\x44\xfa\xfe\xd1\x20\xbc\x56\xed\x72\xb1\x34\x83\xc9\xce\xd8\x3e\x68\xba\x7f\x5d\xe8\xf8\x78\x29\x27\xf0\x3d\xcd\xf7\xcd\xde\xd4\x2b\xc2\x74\xac\x5b\x46\xea\x09\xcd\x69\x95\xe4\x58\x81\x0a\x50\x1d\xd4\xdd\xa2\x8b\x29\xcb\x7c\xb0\x26\x2e\x4b\x48\x5f\x85\xae\x42\x14\x17\x2b\xa4\x02\x8d\x44\xb1\xd6\x10\x36\xaf\x96\xa8\x60\x5d\x0c\x6a\xe5\x39\xac\x99\x47\xe3\x39\x50\xb2\xcc\xa5\x40\x0c\xd0\x55\xf4\x10\x7a\xe1\x40\x61\x08\xae\x1f\xef\x4e\xa6\xfb\x47\x3b\xbc\x61\xef\x2e\x9e\x1e\x1d\x1f\xed\xdd\xfe\xb2\x74\x74\x7c\x34\x20\x4e\x24\xc9\x12\x0d\xde\x5a\xab\xb3\x94\x39\x7a\x55\x54\x73\x0d\xd4\x3c\x21\x83\xa1\x6c\xf7\xea\xf0\x76\x0d\xea\x5c\x67\x39\xf3\xf4\xaa\x28\x2b\x0d\xe4\x2c\x49\xba\x32\x71\xfa\x50\xac\x6f\xea\x93\xda\x64\x1a\x6b\x4d\x2b\x0c\xcc\xa8\x00\x45\x57\x29\xc8\x90\x19\x2c\xec\x14\x35\x88\x4d\xa6\xb2\x66\x78\xd3\x1a\xde\x54\x15\x0a\x08\x52\x83\x45\x9d\xac\x86\xa7\xdd\x6a\xf6\x99\xbb\x8c\x25\x4f\xb4\xd1\x8c\x77\xc5\x19\xec\x91\x41\x5e\xf2\x26\x62\x7c\xdf\x45\x69\x13\xf1\x47\xc7\x83\xee\x18\xbb\xf7\x70\x93\xc5\x9f\xb4\x69\x69\x58\x65\x1a\x94\x35\x05\x2d\x60\x4e\xa5\xa8\x81\x1f\x85\xaa\x17\x07\x5d\xb1\x40\x05\xa6\x05\xd3\x5d\xc8\x09\x43\xf2\x60\xd5\x88\x76\x16\xfa\x24\x0c\xb2\xb0\x08\x58\x53\x25\xe0\xe2\x40\x91\x17\xa9\xed\xe8\x44\xd7\x84\x38\x8e\x58\x41\x98\xcc\xea\x08\x14\x48\x16\x36\x19\xed\xb5\x81\xff\x22\x51\x45\xd7\xc7\x4e\x0b\x87\x1b\xad\x83\xb0\x74\x7d\xef\xc6\xfe\xf1\xf6\x8e\xb4\x3f\x19\xdb\xde\x0e\xc2\xc3\xc6\x7e\x6f\x89\x7a\x6f\xe1\x80\xab\x5a\x2d\xcf\xa0\x80\xc6\xf1\x48\x95\xa4\x4e\x9f\xf7\x81\x01\x28\xef\x89\x60\xf6\x64\x12\x80\x42\x08\x6b\xf9\x4f\x92\x28\x56\x1c\xd9\x4b\xc4\x0a\x27\x73\xd4\x24\x07\x8f\x80\x32\xf8\xcb\x6f\x5a\xbe\x5f\xfa\x56\xf1\x75\x5c\xd7\x3d\x0d\x5d\xe7\xbd\x2d\x0e\xb6\xae\xed\x0c\xfb\x7b\x9d\x1b\xf7\x07\x5b\x03\xe6\xa6\x63\x34\xec\xe8\x70\xf7\xe9\x30\xbb\xff\xc6\x21\xb7\x40\x7e\x96\xd2\x6f\x57\x59\xc9\x22\x0d\x28\xfb\x2e\xfc\xbb\xfd\xf3\x27\x2f\xfe\xe4\xcd\x5f\x78\xdb\x9c\xfd\xdb\x07\x5e\xf1\x73\xcf\x7c\xe0\x63\xf2\xf7\xb3\xbf\xfd\xa9\xb7\x2d\x1e\x10\xff\xe9\xcd\xef\x16\x5f\x77\xd2\xc0\xa3\x89\x63\x50\x03\xbf\xe1\xa3\xf8\x1e\xf6\xb6\xd7\x7d\xdf\xf7\xfd\xe8\xd7\xf4\x7f\xfa\x5c\xf5\xb9\xfb\xbf\xf4\xfc\x9b\x6f\x7b\xf5\x3f\x62\xdf\xf9\xa9\x4d\xb9\x74\x7d\xb4\x50\x6e\xe1\x93\xb1\xa7\xd2\xea\x9e\x1f\x84\x0e\x25\x65\x51\xe2\xd6\xf7\x83\x44\x2f\x3c\xb3\xcf\x3a\xba\x30\x68\xd7\x67\x14\xb7\x8b\x52\x54\x49\x7b\x1a\x8d\x63\x10\x85\xa2\x8f\x20\xed\x0b\x6c\x31\x17\x47\xa7\xf6\xd4\x69\xcf\xf6\xc1\xe3\x72\x70\x43\xaa\x5e\xba\x07\x87\xb3\xad\xc9\x6c\x5f\x13\x33\x87\x95\x2c\x1e\xec\x06\xc1\x58\x68\x79\x0e\x25\xb4\x8e\x7f\xc9\x3e\x60\x9f\x55\x2c\x33\x70\x2d\x7a\x89\xae\x0d\x9b\xd1\x10\x96\x10\xc5\x4a\x6e\xdd\x0f\x95\x80\xac\xc6\x48\x42\xe1\xf2\xf9\x52\x2a\xce\x90\xb0\xd2\xbf\x2b\xdd\x32\xe0\x62\xef\x60\x4b\x19\xc5\xd4\xd6\xec\x78\xb6\x35\xdb\x5b\x3d\x0a\x07\x5b\xd7\xc2\xc1\x0a\xc1\xaf\xfd\xe7\x8c\xbc\x0b\xbe\x98\x09\xf8\xe3\xfd\xd7\x7d\x14\xde\xc2\x3e\x24\xbc\x6e\x7c\xea\x33\x42\x29\x15\x67\xe4\x55\x8b\xbc\xff\x7f\xd8\x63\x1e\x1c\xc1\xaf\x63\xb9\x7f\xd7\xfb\xe0\xab\x3e\xd8\x7f\xff\xfb\xe1\x6b\xe0\x5f\xdd\x8c\xb8\xee\x1c\xf1\xff\xf0\x58\x93\x7e\x51\x33\x70\x51\xc9\xdb\x6c\x5e\xfc\x65\xd8\x8a\x15\x0d\x0b\xb3\xad\x99\xa4\x04\xbe\xe3\xeb\xc9\xe0\x29\x28\x1a\x0d\x7d\xdf\x37\x69\x50\xab\xac\x92\xd5\xd8\xf3\x1d\xd7\x1a\x2c\x57\x56\x50\x68\x7a\x22\x29\x7d\x49\x59\x05\xc6\xc4\x39\xcd\x3c\x4f\x26\xb2\x23\x24\x05\x09\xc3\x24\x0e\xe6\x34\x68\xb0\x1c\x07\x9e\x9b\xf8\x6e\x4b\x83\x1a\xca\xd3\x78\xaa\x80\x41\xc8\xf0\x1f\xac\x1a\x63\x69\xce\xd2\x96\x7c\xd1\xe4\xd6\xe0\xb3\x06\xab\x6d\xdd\x88\xeb\x8a\x02\x63\x83\x36\xae\x7f\xa7\x1c\xe2\xbd\x5d\xde\x0c\x4b\x11\x4d\xa6\x60\xe5\x24\x64\x5d\xdc\x42\xdd\x77\x38\x05\xb4\x44\xcc\xf1\x2d\x62\xfa\x93\x39\xb1\x5d\xe2\x8b\xe6\xe0\xae\x14\x2c\x62\xa9\x0f\xea\x60\xa1\x63\xbd\xaf\xb1\xee\x45\xd4\x25\xb1\x6d\xe4\xa1\x93\xa0\x29\x0a\x97\x89\x14\xf1\x5e\x72\xbb\xfc\xfa\xfb\xeb\x5e\x72\x7b\x63\xd3\xf0\x75\xe7\xf3\xc3\xd9\x11\x87\x83\x6b\xb5\x3d\xae\xe1\x70\xe4\x9a\xc4\x74\x84\x24\x75\x7d\xa8\xfb\x0a\x07\x5d\x87\xed\xbe\x9e\xa8\x21\x33\x41\x61\x2d\x93\xa9\x4f\x5d\x32\x8d\xd2\x30\x21\xa9\x18\x86\x89\x4d\x42\xd3\x48\x23\x72\x9a\x12\x32\x71\x49\x7a\xe2\x4f\xdc\x9a\x35\x2c\x75\xc0\x01\xc3\x32\x59\xc8\x3a\x07\x2c\xae\x5f\x6d\xde\xe3\xee\x06\x7a\x10\x3d\x3c\x62\xe5\xac\x9f\xa2\x74\x1d\x09\xb3\x91\xbb\xf7\xb7\x56\xd0\x1d\x1e\x0c\x0c\xb7\x89\xa6\x89\x25\x58\x8b\xc6\xf5\x9b\xc4\x27\xf5\x1c\x0c\x9b\x45\xcc\xf5\x59\x52\x67\x6a\xc5\xe6\x36\xcb\x84\x41\x20\x15\x14\x97\xbd\xd9\xe7\x89\x9b\x38\xc9\x84\xc4\x71\x12\xa6\x82\x4a\xe6\x7e\x14\x85\x51\x90\xda\x24\x80\x08\xec\x3e\x1a\x50\xea\xda\xb8\x25\x58\x21\x79\x4e\x2c\x9a\x3b\x59\xea\x38\x55\x18\xc4\x83\x4c\x14\xb2\xa5\x33\x71\x44\x17\x09\xa3\x1c\x12\x32\x4a\x45\xb7\xe3\xf5\x51\xf8\x35\xcb\xd7\x4e\x9f\x21\xbe\x11\xc9\xe8\xa9\xfc\xdd\x11\xf2\xe1\xcf\xf0\x6b\x3e\xf9\xbb\x9f\xbc\xff\x7f\x61\x7f\xf6\x5a\xbc\x47\xe9\xb4\x5a\xf8\xde\xb7\x7f\xf2\xdd\xef\x74\x26\x1f\xe7\xff\xca\xcf\xd0\xda\x52\x26\x86\xe8\xa9\x48\x19\xb8\x5c\x42\xdc\x29\x86\xc1\x7c\x1f\x2e\xd3\xa6\x3a\xa8\x58\xf7\xfa\x86\xd5\xac\x60\x28\x00\x1f\x22\x9f\x52\x31\xd4\x6d\xa6\x14\x59\x03\x73\x66\xb2\x79\x54\x43\xc4\x82\xd3\x70\xfc\xcc\x66\x69\x4b\x86\xe8\x21\x89\x7b\xa4\xbb\x68\xca\xad\xd9\x41\x6d\xef\x89\x84\x30\xc2\xe2\x14\xf2\x85\x02\xe6\x3c\x6a\x58\x29\x7a\x01\x4b\xea\x53\x3a\x49\x41\x06\xaf\x1d\xd4\xaf\xde\xf2\x98\x72\xb6\xb4\x26\xb5\x18\xf0\x9e\xa1\x7c\xd5\x5b\x83\xbc\xd9\x1b\xe9\x67\x62\x52\xba\x44\xac\x74\x20\x04\x85\x19\x65\x1a\x64\x85\x18\x74\x15\xee\x0a\x92\xa5\x19\x4e\x69\x1d\xb7\xe3\x2c\xf2\xf9\xd2\x94\x74\x31\x5a\xc9\x8c\x3b\xce\x31\x90\x74\xda\x17\xb4\xaf\x29\x2e\x69\x6f\x72\x6a\x2e\xb1\x35\xb5\x17\x7a\xd4\xdb\x38\x4f\x84\x06\x4c\x56\xf6\xd6\x48\xe7\x3c\xae\x60\x4b\x89\x68\x8e\xbe\x88\xb2\x7d\xf0\xf0\xce\xee\xe0\x06\xed\xe3\xad\x33\x7d\xb5\xee\x79\x38\xdc\xa2\x69\x65\x98\xa6\x92\xa8\xbe\x1b\x99\x2e\x9f\x0e\x65\x62\xb3\x2f\x69\x5f\x62\x73\x30\xa4\xfb\xb9\x68\x2e\x9a\x45\x03\xae\xce\xea\xbc\x00\x7f\xa2\xb1\x9c\xb0\x3a\x19\xe8\x28\x01\x9d\x80\xbd\x8a\x3f\x39\xd2\xeb\x44\x77\xd5\xcf\xf5\xca\x28\x9d\xf7\xb5\xcd\xfb\x41\xee\x89\x95\xd3\x47\x0b\xdf\xc0\x9d\xf0\x8c\xb3\x67\xcf\xfa\xf2\xfe\xeb\x17\x2f\x3d\x10\xee\x1b\xe8\xe1\x83\x89\xa7\x12\x16\xf0\xfb\xef\x7a\xff\x9b\xd5\x8f\x4c\x9f\x3f\xd2\xc5\xe0\x67\x19\x52\x28\xc6\x83\x9f\xba\x33\x3b\x1f\x54\x7c\xeb\x9a\x9a\x81\xc0\xeb\x9e\x0f\x46\x16\x8c\x45\x45\x17\x8d\xa0\xf2\x04\x97\x35\x75\x06\x74\x71\x35\x3b\x27\x03\xc6\x08\x68\x83\x72\xc5\xa8\x5c\xda\x92\xca\xed\xf5\x67\xf1\x7d\x1d\x24\xf7\x60\x32\x6d\x0d\xa4\xbb\xf2\x14\xf8\x16\x0d\x1b\x91\xbb\x30\xd7\xf2\xc6\x26\x39\x81\x94\x82\x4f\x29\x23\x54\xf4\x16\x2a\x53\x58\x91\x00\x82\xd0\xb2\x6c\x81\x2c\x2a\xc3\x14\xc2\x85\x29\xc8\x0b\xd9\xed\x6d\x1e\xf3\x1e\xe8\x50\x13\xc3\x95\x9e\xe0\x73\xbe\x80\x33\xf2\xb8\x8a\x73\x22\x38\x1c\x74\x05\xa7\x81\x35\x2d\x80\x89\xc3\x94\x7b\xbf\x25\xed\xeb\x94\x13\x45\x1f\x53\xa8\x99\x8e\x23\xa8\x4f\x47\x61\x57\x61\x7d\x5a\xa5\x69\x5f\x67\xbd\x13\xb2\x18\x42\x82\xab\x2c\x19\x64\x25\xa0\x85\xc6\x27\x33\xcb\xbc\xef\xa9\x25\x69\x62\xc0\x7b\xcf\x3f\xc0\x6d\xc8\x23\xf4\x12\xf4\xc8\x1a\x9a\x5b\x21\x1a\x0c\xdb\xe3\x6b\x6b\xb8\x0e\x1f\x80\xf1\x4f\x78\x53\x13\x1e\x80\x98\xce\x0e\x67\xf7\xf2\xae\xaf\x2a\x10\x02\x0e\x19\x67\x93\x10\x96\x12\x16\x44\x6c\x1e\x81\xe2\x77\x04\xe6\xcc\x27\x1c\x16\xfe\x27\x72\xaf\x80\xc3\x32\xa6\x81\xae\xb1\x41\x2d\xfb\x2c\x83\x06\x5c\x96\x4e\x69\x55\x55\x15\xd3\x49\x9f\x7b\x4c\x86\x8e\x15\xa5\x57\x34\x1e\xb6\x49\x92\x0f\x5f\x4c\x23\x4c\xf1\xbd\xb2\xf4\xbd\x92\xc7\x5c\xb3\xa5\x25\x05\x62\xb8\x7d\xe3\xe7\x8e\x78\xcc\xf5\x77\xd0\x98\x0b\xfb\xd0\xf2\x4b\xa5\x5f\x13\xbf\x81\xd3\xe5\x2e\xef\xef\x7a\x30\x76\xc4\xdc\x3f\xda\x1b\x05\xe7\x68\x9e\x8c\x5e\xcc\xa6\xc6\x59\x8f\x7d\xe4\x6b\x3e\x9c\x4d\x7f\xe2\xc3\x5f\xff\x83\xef\x79\x4f\xff\xc0\xdb\xf5\x0f\xe9\xdf\xc3\xfe\x25\x7e\xd7\xc7\xdb\x8f\xe3\xb7\x77\x7f\x08\xb3\xf7\x7a\xef\x75\x93\xe9\x37\x26\xc1\x4f\xfb\xc9\xc9\x9f\x88\xf7\xf6\xaf\x10\xf6\x16\x7f\x98\x2e\xfe\x50\xd8\xeb\xdf\x30\xb9\xfa\xbc\xee\x93\x2f\xfb\x8d\xdf\xf8\xdd\xdf\x7b\xce\x1f\xff\xc6\x23\xf8\xc1\xfe\xf7\x87\xdb\x0f\xe0\x7f\x96\xfd\xdb\x57\xff\x6a\xf6\xc8\xab\x3f\xf3\xd3\x6f\xfa\x44\xff\xf9\x8f\xfe\xe6\xa3\xec\x3d\xf0\xce\x47\x7f\x13\x21\xc0\x11\xc8\xd3\x70\x42\xd1\x74\x20\xfa\x1d\x09\x83\xa0\x42\xd8\xa4\x35\x8b\x27\x94\x45\xcc\xf6\x20\x83\x18\x61\xf4\x93\x58\x92\x9e\x3e\xf9\x1c\x5f\xdb\x28\xcb\x1e\x02\x3e\x96\x1d\x1e\x5a\xc9\xb1\xe9\x67\x7f\xf2\x33\xec\x2f\x7f\x04\x26\x93\x77\xaf\x84\xd8\xa7\xbe\x82\xfd\x0a\xfb\xdf\xde\x35\xf8\x0b\x28\x5e\xe9\x9b\x87\xd6\xfc\x84\xb7\x78\x5a\x90\xc7\x73\x9f\x07\xf7\xdf\x38\x54\x76\x66\xf8\xdc\xe1\xda\x19\x1b\xfc\xee\xcc\x3a\xac\xa7\xd8\xb1\x0d\xdb\x31\x0c\x39\x95\xc3\xd8\xce\x43\x8b\xb9\xaa\x91\x13\x3f\x26\x09\x33\x3d\xc8\xc2\xbc\xb2\x8b\x4c\x53\xfb\xf9\x94\x8f\x66\xeb\x75\x26\x3b\xa6\x5f\x99\x4b\x44\x83\x14\x32\x4c\x58\x56\xc7\x94\x24\x11\x8b\x58\x43\x40\x01\x2f\x0e\x12\x3f\xc8\x61\xac\x73\xe5\xb1\x75\x85\x77\x86\xbe\xbe\x8a\x6a\x5c\xb0\x6e\x46\x27\x60\x15\xe8\x18\x75\xa0\xe8\x0e\xdc\xed\x38\x7e\xae\x57\xb6\xb1\x48\x4c\xd6\x11\x90\x75\x56\x83\xc9\x23\x1f\x50\xd8\x3a\xd1\x6d\x51\x59\x94\xa4\xaf\x3c\x5f\xcd\x54\x13\x2b\xcc\x62\x85\x0b\x3e\x58\x84\x0f\x29\xa6\x41\x5e\x9b\x0d\xef\x8d\x92\xad\x78\x75\x6d\x23\xcc\x8e\xb6\x0e\x14\x69\x23\xae\x74\xb4\xbd\x86\x63\x1c\xab\x3d\xd2\x0f\x28\xd8\x52\x52\x59\xd0\x4c\x92\xf9\xbe\x1e\x85\xbe\xa3\xf7\x81\xd5\xbb\x2e\x76\xec\xbe\xec\x22\x27\xb5\x43\x41\x8f\x9c\xcc\x0e\x26\x2e\x17\xe0\x4d\x6f\x32\x37\x51\xa9\xea\x40\x09\xd9\xa2\x65\x84\x80\x81\x33\x1c\x90\xcc\xca\x92\x1e\x65\xa5\x53\xa5\x2b\x3f\x64\xf0\x8f\x03\x1e\x7f\xbf\xba\xbb\xd9\xc0\x74\xb6\x96\x80\x37\xf6\x85\xda\x31\x70\xb7\xe8\x06\x3f\x54\xb0\xba\x56\x30\x7a\x1f\x93\x5e\xc6\xad\x61\x89\x01\xc9\x08\x73\x48\x3f\x27\x04\x6b\x04\x32\x92\x44\x48\x40\x11\x8f\xd7\xfa\xe8\xbe\x71\xad\x3b\x17\x22\x30\x23\x17\xf0\x59\x61\xa3\x73\xb3\x35\xdb\x1a\x57\x5c\x40\x48\xb1\x4d\x07\xaf\x1a\x72\x66\xd3\x3e\xb5\x99\xe7\x82\x63\x33\x0f\x72\x16\x4f\xbc\x3e\x2f\xd3\x38\x48\xe8\xd4\x18\xd6\x39\xd8\x80\xa4\xaf\x48\x1f\xe2\x98\x85\x4b\x94\x54\xa0\x13\x3e\x28\xc8\xe8\x2b\x28\xbd\x24\xa6\xfe\x58\x17\x13\x2d\x4d\x29\x14\x15\x24\xa0\x1d\x74\x1d\x7d\x3e\x9f\x26\x37\x18\x3b\x2b\x1a\xd8\xe5\xde\xc5\xa0\x2b\x2f\xb8\x1b\xd7\xb6\xc6\x10\xc4\xde\x70\xbf\x1f\x89\xdd\x4d\x59\xd0\x7d\xdf\xb4\x75\x6a\xb2\x88\x8a\x66\xe0\x5b\x8e\x1e\x9a\x16\x73\x28\xb3\x74\x25\x56\x0c\x61\x6e\x2a\xb1\x6a\x8a\x0a\x49\x4f\x6d\xcf\x97\xa9\xec\x08\xdd\x29\x9a\x92\x8b\xbf\xb1\x98\x75\xac\xd5\x41\x03\xa4\x8e\xcf\xf4\x6e\xd0\x7b\xfe\xd2\x92\xa8\x18\xad\xe6\x78\x1c\xae\x2d\x49\x18\x25\xe6\x18\x24\xe0\x46\xe5\xf6\x60\xc4\xac\xde\x1b\x0d\xb7\x4d\xe9\x22\x94\x9e\x96\xab\x2e\x24\x2c\xad\x98\xe1\x40\x9c\x32\x75\x12\x04\x4e\xe9\x07\x10\x33\x79\x0e\x9e\xcb\xfc\x85\x16\xbb\xc4\x89\x07\xcb\x96\x42\xc0\x12\x5c\xf5\x06\x1d\xf4\x30\x4b\xc5\x28\x4d\xcd\x82\xf6\x19\x8b\x33\x9a\x74\x64\xde\x9a\x4d\x46\x58\x17\xa5\x85\x90\xc7\xa9\x4b\x93\x45\x59\x55\xa4\x26\x5c\x23\xf0\x84\x14\x40\xb4\xb4\x27\xbe\xa8\xa1\xa7\x0c\x1a\x4f\x91\x30\x9a\xee\x1f\xa1\x6d\xa1\xa4\x9a\xce\x6a\xd6\x05\x73\x50\x5c\x51\xeb\x79\x68\xdc\x4e\x92\x00\x5c\x48\xf9\xb9\xf3\xe5\x4b\xa4\x7d\x11\x90\xc8\x6d\xbb\x6d\x18\x6c\x53\x1e\x64\xb8\x3e\x79\xfb\x7b\xf0\x43\xef\x64\x7f\xc5\xbe\xda\xba\xba\x76\x36\x45\x38\x2d\xd8\xf1\xaf\xfc\xaf\xc2\xbb\xb0\x25\x73\x97\x72\xb0\xc7\x7e\x67\xe9\x48\xdf\x24\xee\x21\x91\x5f\x7d\xfc\x8c\xbd\xd9\x95\xd9\xe4\x33\xef\xc6\xfb\xdf\xcd\xfe\x9a\x7d\xfd\x23\x8b\xcf\x09\xf3\x85\x26\xee\x9d\x7e\x86\x3d\xfc\xab\x7f\x2c\xfc\x08\x7e\xd5\x8c\xac\x72\x27\xb6\x14\x8b\x0a\x8f\x4d\x6e\xc3\xd1\xf1\xd1\xf6\xce\xee\x53\xe0\x19\x80\xd6\xc9\x13\x40\x02\x74\x05\x04\xa1\xe6\x45\x6a\xaa\xd3\x30\x04\x07\x12\x87\x59\x2c\x67\x59\xdf\x78\x58\x06\x93\x85\xa5\x28\xf7\x32\x2b\x12\x93\x42\x01\xaa\xc1\x4a\xa6\xe4\x74\x89\x82\x94\x02\x62\xf3\x88\x84\x20\x83\x2f\xc8\x6b\xff\xdf\x96\x02\x2e\x8f\x78\xe8\x61\x0c\xf3\x5f\x1d\xc3\xfc\x63\x46\xe8\xfa\xf6\xce\xac\x9b\xaa\x1e\x14\x5a\x5e\x85\x99\x5e\x87\xa1\x66\xa9\x4c\xf3\xfb\xb9\x36\x67\xf3\x18\xe4\x5a\x63\x91\xa8\xf4\xd9\xa2\x66\x99\x51\x58\x3e\xc5\x3a\x76\x7a\xad\xa7\x6d\x58\x63\x03\x67\x03\xdd\x7f\x0f\x7a\xb3\xf4\x5b\xd3\x9f\xe3\x78\x51\xd0\x55\xf4\xec\xd1\x5a\xdd\xbf\x8e\xf6\x0e\xb6\xae\x71\xf1\xbe\xbd\x22\x23\xae\x1a\xc4\x37\x04\x7d\xbb\xd0\x5d\x6c\x62\x72\xba\x9f\x24\xe2\x2f\x93\x74\x89\xa2\x96\x7d\xe6\x1d\xd7\x3f\xfd\xd0\x3b\x58\xb8\xd6\x1c\x6f\x8a\xfa\x28\x27\x31\xf8\x4a\xef\x4f\x9f\xea\x0c\x1b\x1c\x02\xea\x7f\xf1\xcf\xff\xf2\x05\xa7\x7f\x28\x3c\x74\xae\x57\x46\x1f\x3b\x15\x63\x6e\x97\x72\xe2\xbd\x17\x4b\x6b\xdc\x22\x3e\xdb\x07\x09\x88\xea\x16\x26\xc4\x05\x0d\x52\x97\xd9\xac\x61\x59\x9f\xd8\x42\xd1\xf4\x45\xbe\x44\x11\x10\x31\xd6\x92\x98\xaa\xcc\x4f\x98\x55\x64\x35\x94\x4c\x2f\x33\x50\x84\x8c\xe5\x55\x04\xde\x18\xfb\x19\xf4\x8f\x83\xa6\x2b\x1b\x78\x8c\x21\x1e\x6c\xdd\x8b\x40\x42\xbc\x47\xf3\xd6\x74\xd0\xca\x1f\xe3\x39\x4a\xfc\xf9\x29\x04\xd0\xba\x3d\x99\xe7\xbd\xe7\x0a\x76\x6f\x0a\x74\xe1\x4d\xff\xe3\x59\x92\xf2\x43\xcc\x2e\x7b\x6d\x89\x52\xb0\x70\x3c\xb0\x02\x81\x16\x97\x27\x67\x79\xcb\x44\xd4\xb9\xb7\xb9\x3b\x99\xae\xa6\xbd\xde\x7b\xf5\x40\x1b\xb4\x9d\x24\xce\xb4\x55\xf6\x72\x20\x63\x31\x72\x59\xc6\x7c\x28\x20\x57\x99\xc5\x8c\xb0\x06\x2d\x54\xa9\x16\xd8\x2c\x66\x29\xe9\x1d\x13\x37\x4b\xc4\x1a\x4b\x30\x44\x9d\x18\x3a\xd3\x15\x35\xd1\xd4\x3e\xd5\x74\xa7\x31\x58\x6d\x1b\x8e\x87\x23\x35\x55\xa0\x56\x95\x54\xe3\x67\x85\x96\x8e\xe4\x8a\x3e\xf7\x39\x79\xb4\x6e\x1f\xf1\xe0\xdc\x2a\x6a\x71\x63\x7f\x32\x60\xd5\xa7\xac\x61\x06\x81\x39\x0e\x28\x73\x99\x07\x05\x56\xbd\x20\x69\x69\xa6\x1b\x3d\xe9\x89\x8d\x1d\xd1\x37\xfb\x88\x59\x2e\xd4\xad\xb5\xa0\xac\x50\xc2\x9c\xda\xac\x60\x91\x1d\xf8\x91\x42\xa0\x19\xfd\x1d\xca\xe3\x24\x03\x6e\x47\x4d\x21\xe1\xfd\xe9\x36\xa0\x9d\x5d\x0c\xe7\x39\x46\x24\x08\x9d\xaf\x51\xdd\x67\xd9\xb0\xd8\xc8\x27\x1e\xf3\x40\x83\x7c\xd8\xd1\x9c\xe5\x4c\x71\xa0\x06\x83\x59\xb1\xe8\x34\xad\x01\x68\x4e\x99\xc9\x74\xf0\x70\xa0\xf7\x21\x0b\x9a\x8c\xa6\xa0\xb1\x36\x27\x79\x0b\x05\xd6\x90\x80\x4a\xec\x49\xca\xb4\x5b\xf9\x01\x2b\x2f\x60\x3a\xec\xec\xd1\xde\xd5\x1d\xe9\x86\x20\x16\x6b\xbb\x1f\x3f\x3b\x0d\x9b\xe4\x73\x8b\x9f\xc8\x7f\x38\x79\xf5\x5f\x4d\xbb\xc1\xe4\xff\x59\x93\x75\xac\x76\x7e\xbf\xf9\x2c\x5b\xb8\x1f\x80\x97\xa2\x31\x1f\x68\xf1\x78\xec\x73\x56\x3a\x0f\xc1\xd5\xc9\x03\x20\x69\x0f\xc2\xb5\xfb\xf9\x7c\x86\x97\x00\x4f\x52\xdc\xd8\x17\x72\xdf\xc4\x29\x53\xfb\x3c\x06\x0f\x02\x08\x8d\xbe\xea\x3b\xd6\x68\xaa\x9d\x45\x55\x64\x6a\x38\x06\xef\x64\x8e\x0b\xd3\x15\xc3\xac\x4a\xfa\x8e\xf9\xae\x93\x3b\xb9\xdd\x44\x9d\x0f\x25\x04\x34\x4f\x38\xfe\x06\x7f\x46\x13\x23\x6e\x1f\x8f\x5c\x70\xde\x27\xfd\x78\xb3\xb1\xfc\xd1\x60\x7f\x70\x6b\x51\xb0\x32\xd5\xc0\xb9\x4f\xfc\x44\x4d\x02\x53\x53\x16\xf1\x64\x1e\x10\x2f\xd2\x62\xcf\xd2\x95\x53\x1d\x5c\xbd\x27\x53\x74\x8a\xc4\xc8\xb4\x5d\x66\x65\x4a\xa2\x78\x4d\x4f\xfa\xa4\x51\xa8\x12\x42\x2a\x10\xef\xd4\x20\x67\xf2\x86\x88\x21\x97\x71\xe7\x51\x89\x95\x2a\xbe\xc6\x47\xa2\x6c\xe3\x24\x35\xcc\x49\xb9\xb0\x79\xde\xc1\x58\x54\xa4\x32\x93\x32\x28\x1b\x31\xd4\xa3\x80\xb0\x8a\x0c\xbe\x8e\x3a\x8d\x9c\x8a\x46\x39\x58\x23\xcf\x39\x52\x2a\x7a\xe8\xd9\x3c\xba\x7d\x1e\x43\xbb\x50\x6f\x70\x38\xdb\x5a\x6d\xdb\x99\x99\x2c\xce\x1d\x96\xb3\x40\x70\x16\x99\x1b\x92\x58\x4b\x88\xae\x2e\x52\xc1\x65\x05\x23\x86\x80\xb0\x95\x86\x24\x49\x4f\x3b\x12\x50\x8f\x88\x5e\x62\x68\xbd\x4d\xfa\x36\xf0\x54\xaa\x69\x16\x34\x04\x67\xaa\x4c\x72\x93\xd5\xa5\xd3\x16\x65\xe3\x34\x63\x1c\xdb\xe7\xb2\x66\xf4\x1b\xaf\xad\xe8\xe5\xfa\xee\x4a\x4f\x0e\x3b\x7d\xcb\x46\x5f\x87\x99\x58\xf9\xbd\xb1\x20\xae\xa0\x18\x91\x9b\x38\x51\x5f\x4d\x4b\xe6\xf7\x51\x8b\x3d\x08\xf5\xbe\xe8\x3b\x36\xd7\x54\x27\x0b\xab\xd8\x30\xb0\x03\xc9\xa9\x21\xba\x71\xe2\x52\xbb\x08\x22\x37\x0a\x59\x93\x0c\xb6\x47\x94\xda\xc4\x2a\xc3\xda\xad\x61\x75\xb6\x8a\x2c\x1d\xc9\x17\x43\xee\x25\x3c\x70\x79\xdc\x7f\x7b\x87\x0b\x0e\x2c\xcd\xd6\xa2\x78\x30\x37\x84\x9a\xe2\xb8\x0f\xdd\x30\xf0\xb5\x20\xb0\xfb\xc4\x31\x15\xdc\x61\x64\xf5\xf3\x3e\x52\x35\xac\x32\x67\x94\xca\x13\xa7\x2c\x09\xad\xa7\x88\x79\x49\xef\x84\xae\x4a\x54\x17\x27\xfe\x60\x7d\x6a\x61\xe2\xeb\xac\x6d\xd8\x7c\x2d\x9b\x01\xd5\xac\x0e\x40\x01\x19\x89\xe8\x3b\x97\x5f\xc6\xe3\xfd\xd3\x55\xf6\xe5\xbe\xb5\x24\x1b\xbc\x6b\x6e\x83\xf2\xfb\xbd\xed\x41\x74\xee\x8d\xb0\x0d\xfe\xf6\x19\xb7\xb1\xdf\x8c\x4a\x16\xbb\xe0\xff\x87\xd5\x23\xfe\x3f\x7e\x09\xaa\x2f\x67\xe2\xef\x61\x79\x04\xae\xbf\x49\xa9\xc8\x1d\xef\xc5\x57\x3a\x8c\x2c\x51\x08\x8a\xf0\xb9\xf5\xb3\x5f\xe9\x9f\xc5\x7e\xfd\x93\xf0\x88\xf0\x25\x7f\x7a\x06\x60\x77\xf3\xa5\x6b\x5b\x9d\xac\x72\x5d\xcf\x1c\xa1\xba\x72\x6e\x95\xf2\x6c\xd7\x18\xa3\x16\x35\xd2\x97\x7d\x3d\xc9\x58\x84\x95\xae\x06\x1b\x27\x4c\xc1\x49\x1f\x94\xf1\x12\x31\x12\x82\x23\x7a\x24\xd0\x2a\xc2\x2c\x42\x84\xcc\x58\x68\x50\xf4\xbe\xdf\x52\x1a\x8d\xd7\xb1\xef\x76\x1d\x98\xec\x4a\x37\xf6\xee\x78\x1d\x1c\x83\xd6\x46\x0d\x6b\x2f\xb9\x8e\x47\xca\xb8\x22\x23\x4d\xda\x52\xc2\xed\xfe\xe7\x8e\x71\xe6\xe9\x99\x05\x27\xac\x27\xdb\xcd\x8e\x8e\xf9\x44\xc1\x41\x29\x1f\x28\x03\x9f\x6c\x8b\xbe\xdd\xdb\xaa\x2e\x10\xa6\xa6\x10\x39\xcc\xc8\x59\x99\xf7\xad\x03\x79\xda\x37\xd8\xd3\xd5\xae\xb3\x70\x5b\x53\xda\xc7\x94\x76\x61\x4d\xc4\x30\x71\xe2\x90\xb0\x2e\x24\x04\x22\x16\x87\xb1\x0f\x88\x04\xb1\xaa\x10\x7d\xe1\x2f\x0a\xc1\x62\x31\xcb\xe3\xd8\xe3\xf3\x0f\x81\xcf\x33\xf0\xc4\x90\x5b\x99\xab\xb5\x5f\xb9\x24\xe6\x7e\x6d\xeb\xcc\xac\xe4\xdf\x93\xe9\xd6\x38\xf8\xe2\xba\x84\x3c\x56\xb2\x04\xdb\x7d\x8e\xa3\x3e\xc2\xa1\xef\x5b\x8e\x16\x98\x26\xd3\x29\x0b\x28\x36\xfa\x12\x9b\x7d\x8b\x15\x56\xb2\xac\x0a\x53\x21\x12\xc3\xd8\xd4\x32\x42\x09\xe9\x5b\xd7\x55\x12\xc5\x06\xa7\xf7\x30\xed\xe7\x38\x27\x84\x12\xaa\xca\x7d\xce\x14\xe6\x04\x10\x43\x8a\x6b\x85\xf7\xf7\x59\xd9\xc4\xdb\x48\xe3\x1d\x1b\xd7\xfb\x34\x02\xc5\x49\x76\x76\x78\xb0\x75\xed\x70\xc0\xe0\xf1\xd6\xc5\xb4\xc5\xd1\xf1\xee\xd3\xf1\xb5\xfb\x6f\x1c\x8a\x89\xc3\xe6\x8c\x0a\xea\xa2\xa1\x8b\x4a\x30\x58\xc3\x0a\x03\x67\x8b\x0c\x2a\x42\x8a\xd6\x04\xa5\x66\xc6\x24\x22\x15\xf5\x4b\xd6\xea\x0e\xb1\x64\x22\x9b\x7e\x95\xfa\x62\x14\x1b\x6a\x46\x4e\xea\xa9\x4e\x52\x55\x26\xbd\x5a\x2c\xd4\xd6\x36\xa9\x69\x81\x0c\x2e\x9b\xbb\x71\x44\x03\x56\x6b\x9a\x35\x37\xaa\xd8\x58\xf7\x21\xf5\x56\x32\xf7\x45\x7c\x82\xc6\x06\x8e\xcf\xed\xf5\xab\x63\x11\xcb\x16\x57\x9f\x6b\x04\x1f\x5c\x59\x23\x7a\x5f\x83\xc3\xd9\x95\xbd\x2b\xb3\x43\x31\xe4\xd0\xe3\xa6\x57\xc1\xa4\xe0\x31\x0a\x7a\x1f\x76\x30\x0f\x99\xc5\x1a\xca\x5a\x66\xf8\x40\x41\xeb\x13\x50\x58\x01\x16\x05\xbb\xd7\x71\xcd\x1a\x56\x1a\x38\x85\x8c\x95\x4c\x05\x5b\x0c\x63\x5d\x25\x71\x43\x48\xd2\x24\x45\x9a\x94\x6d\xdf\x60\x95\xb5\x79\x9c\xb4\x49\x93\x10\xd2\xc4\xb1\x22\x27\x0b\xb5\x19\xbe\x36\xd7\xf0\x1c\xf4\x20\x9f\x1b\xb5\xc6\x3d\xb7\xdf\x56\x80\xc3\xa5\xfb\x70\x38\xdb\x3b\xb8\xc2\xbd\x95\x2b\xeb\x7d\xe0\xd9\x23\x31\xb5\x59\xcd\x12\x41\x5b\xcc\xc1\x85\xc6\x61\x26\xab\x29\xcb\x98\xe3\x62\x04\x2e\xdf\x99\xf9\xb0\x33\xc5\xa2\x86\x82\xd2\xb2\x31\x41\x9e\x33\x6b\x62\xd2\x22\xf5\xaa\x4e\xb7\x89\xa5\x10\xd5\x5f\xa2\xdc\xe5\xcb\x49\x93\xbe\x64\x49\x42\x53\x18\xc8\xd0\x64\x39\x89\x33\xf0\xb1\x99\x10\x45\x4e\xfa\xcc\xeb\x4b\xdb\x36\x89\x69\x05\x6d\x61\xbb\x91\x6f\x9b\x9a\x66\xf8\x46\xea\x58\xde\xc0\x03\x25\x8f\xdd\x2b\x03\xff\xef\xcc\xae\xc8\x70\xe5\xde\xab\xb3\xd1\x86\x13\x67\xd7\xb4\xeb\x87\x2f\x3a\x46\x30\xab\xa7\xd5\xc2\x63\x51\x0d\x45\x00\x09\x51\x72\xbd\x66\x41\xd5\x97\xdc\x08\x17\x8c\x53\x47\x54\xe2\x5e\x63\xbe\x6b\x5b\x51\x6d\xb1\x2e\x4b\x48\x44\x40\xc3\xf1\x72\x89\xbf\x77\xf9\xaa\xe9\x8f\x8a\x5f\xae\x7c\xf1\x63\x3f\xd0\x7f\xe3\xf2\x8f\xbe\x08\x59\xa3\x3d\xf5\x2b\xf8\x77\x24\x7f\x7a\x0d\x4d\xd1\x3d\xe3\xac\x8e\x31\x42\x24\x96\xd4\x0b\x93\xf8\xe4\x50\x4c\x6f\xba\x93\x3f\x30\x58\x53\x38\x73\xb8\x3e\xea\x70\x77\x49\x56\xf1\x7c\x04\x9b\x83\x68\x06\x42\x7f\x00\x1e\x3e\x7c\x19\xac\xc0\x3e\x2b\x9c\x13\xd3\xb0\xf0\x42\x2d\x0e\x1c\x55\x5b\x54\x83\xd7\xa2\x78\xa9\xa9\xe4\x66\xd5\xb7\x31\xab\x73\xe6\x9b\x50\xd1\xa9\xd1\x87\x8d\x46\x75\x27\x00\xb7\xee\x65\x53\x97\x65\x2f\x75\x58\xe3\xba\x81\xa0\xf8\x49\x88\xfd\xbe\x58\xfb\x49\x29\xcf\x63\xa3\x9d\xd9\xd1\xe1\xc1\xbd\xd2\x6c\xcd\x62\x78\x35\x70\x6e\x86\x25\x2e\xd0\x8e\x76\x66\x35\xcc\x15\xaa\xe0\x44\xb7\x7c\x4b\x4e\x15\xdb\xaa\x52\x87\xc9\x7a\x4c\x59\xe1\x82\x9a\x44\x1a\xd3\x27\x4d\x5e\xd7\xf9\x69\x68\x68\x5e\x6b\xb2\xd6\x75\x9c\x60\xa2\xf5\x6d\xc7\xea\x3a\xc9\x41\x6d\x21\x5f\xc5\xef\x3d\xc9\x16\x63\x74\xcf\xa8\xd1\xc7\x39\xac\xfb\x97\xed\xd7\x8d\xc3\x17\x1d\x1f\xc1\x0c\x5b\xc4\x9d\x84\xa7\x46\x4a\x23\xb0\xb4\x89\xd3\x1b\xac\xaa\x20\x0e\xc0\x8a\x14\xaa\x15\xac\x28\xfa\xb6\xf3\x0b\xec\x2f\x2a\x31\x36\x32\xd2\x11\x0f\x0c\xd6\xc6\x4c\x65\x9d\x65\x18\x49\x67\xb2\x3a\x0b\x03\xd7\xcf\x20\xe3\xb6\x53\xc0\xe5\xf7\x83\x5c\x87\x0f\x78\xdd\xbb\x88\xfe\x6b\x5b\xb7\x57\x2e\x4a\xfb\x7b\x10\x53\xa0\x14\x87\x41\x6e\xbb\xaa\xe7\xda\x8a\xc6\x4c\xca\xbc\x00\x0a\xa8\x7d\x4b\x23\x7a\xd9\xe7\xfd\xdc\xf6\x2b\x0b\x94\x69\xc6\xcc\x10\xab\x4c\x49\x7b\xad\x95\xa9\xea\x44\x40\xa3\xde\xc2\x24\xec\x15\x43\xd1\xd5\xce\x66\x4d\xa8\x69\x21\x6e\x4d\x62\x23\x01\xd0\xd2\x12\x5b\x11\xf1\x29\x8a\xcf\xe2\x75\x6d\x17\xaa\x93\xa6\xbc\x66\x69\xb4\x7e\x00\x4d\x5b\x23\x09\x83\x50\x8f\x63\x57\xd1\x4f\x72\x70\x40\x05\xc5\x65\x0d\x6b\x04\x4b\x63\x66\x5f\x5a\xd8\x11\xd1\xc2\xee\x09\x55\x33\x35\xea\x26\xa8\x70\xb2\x24\x77\x59\x9c\x74\x79\x96\x0d\x7b\xdf\x2d\x6d\xd1\x5b\xd9\xcc\xdc\xcf\x18\x96\xca\x99\x9f\xe7\x47\xf9\xdd\x2e\x9e\x5e\x3f\x3e\x9a\x6a\x94\x51\xe6\x42\x04\x86\xa9\xa6\x4e\x9f\xf5\xa1\x25\xa8\x80\x98\xcf\x74\x03\x94\x8e\x35\xac\xd6\xc0\x6f\x68\xc1\x2a\xd0\x4a\x32\x8d\x2c\x86\x58\x69\x3a\x31\xd5\x99\xd1\x77\x41\x1a\x42\xe8\x9a\x71\x06\x48\x57\x48\x07\xc4\x60\x49\xa3\xa8\x74\xac\x85\x4d\x79\xcd\x4d\xb8\x7d\xe3\xb1\x08\x21\x45\xfc\x17\xdf\xb4\xaa\x91\xfd\xb1\xa5\x21\xe9\xa2\xb5\x7d\xe3\xb1\x1f\x20\xe5\xb6\xf8\xe9\x1f\x9a\xfe\x18\x7f\xbd\x58\xba\x52\x20\xea\xdb\x37\x3e\xa5\x22\xb4\x2d\x7e\xf4\xa7\xd1\x98\x33\x2c\x97\x2f\x97\xae\xf3\xb8\xd7\x73\xd1\x1e\x3f\x3f\x38\xbb\x82\x26\x97\x52\xd3\x99\xcf\x71\x66\xbc\xc2\xfb\x26\x6e\xff\x3c\xf6\xdb\xff\x1e\x7e\xe4\xed\xf0\x8a\x1f\x54\x3e\xae\xfd\x6b\xf6\xab\xbf\xde\xff\xa7\x93\x6f\xf9\x75\xfc\x6d\x8b\xff\x69\xfa\xfc\xb5\x91\x04\x9f\xfc\xf8\xd7\x87\xef\x7d\x4f\xff\xe0\xdb\x9d\x0f\x59\xbe\xf0\xb1\x1f\x64\x2f\xba\xf9\xd2\x87\x9e\x1f\xff\xc5\x21\xfb\x3f\x7f\xea\xed\x6f\x7d\xe3\x9b\x7f\x0a\x3e\x28\xbc\x79\x30\x91\xde\xfc\x02\xf6\x7f\xff\xe2\x97\xfe\xc1\x3f\x7e\x5f\xfe\x45\xd9\x27\x90\xc0\xeb\x1d\x2d\x8e\xef\x73\xdb\xf1\x5e\x2c\x5d\xf4\x13\xce\x92\x14\x30\xf8\x10\xa3\x1b\x2f\x18\x14\x1b\xa6\x06\x71\x18\x85\xb1\x96\x44\x86\xaa\xf6\x36\x1d\x74\x2c\x53\xa0\x85\xca\xd4\x59\x00\x6d\x95\x05\x59\x29\x86\x8c\xc4\x0a\xab\x82\xbe\xe9\x78\xac\x30\xee\x65\xdc\x11\xa0\xa4\x2f\xd3\x8e\x79\x42\x1c\xd2\x28\x0b\x39\x1e\xf3\xa5\x2b\x45\xa2\xbf\xbd\xff\xb3\xff\x05\x21\xc1\xdc\x16\x3f\x9a\xf2\xd7\xbf\x76\xf9\x46\xe9\x31\xf1\x9b\xb7\x6f\x3c\xfa\xf3\x7f\xfb\xb7\xdb\xe2\x63\xff\xe4\xfa\x5f\xae\xe2\xe7\x83\xde\x88\xb6\x6f\xfc\x0f\xff\x66\xd8\xa7\xc7\xa2\x55\xfc\x3c\x5e\x26\xbc\x7e\x52\x3a\xcb\x6f\xbf\x74\x95\xad\x5a\x0f\x84\xda\xb8\x4d\x77\x0e\x07\x1d\x29\xe0\x67\xc0\xd5\xdd\xab\x57\x8c\xdd\xab\x07\x0f\xc0\xc3\x8f\xc0\xce\xbe\x28\x89\xb3\xc3\xd9\xfd\x37\xf6\x6f\x6c\x8b\x69\xca\x10\xa1\x79\x0e\x4e\x96\xb1\x6c\x78\xcc\xf3\xc5\xef\x2f\x7a\x0f\xda\x2b\xff\xe1\x7d\xcf\x91\x95\x7b\x5f\x15\x98\x0d\xa4\xd0\x78\x9e\x61\xa4\x8a\xea\xb0\xb2\x0f\xde\xf9\x5e\x59\xf9\x72\x51\x3d\x21\x8e\x37\x0d\xfb\x1c\x32\xe6\x40\xb6\x90\x21\x1f\x1e\x63\x9c\x26\xc9\xd3\xfb\xbf\x65\x1f\xf9\xc8\x3b\x02\xd5\x7a\xaa\xad\x3b\x1e\xa8\x5a\xa7\x3a\x72\xe8\x28\x60\xae\xeb\xb5\x07\xda\x8a\xb6\x6f\x0c\x54\xa5\x88\x8f\x7e\xdd\x48\x8b\x80\x96\xaf\x93\xbe\x4b\x74\xb6\xdf\xf2\x23\xcf\x41\x08\x7d\xd8\x42\x2f\xfe\x53\xe5\xd5\x1f\xfd\xe9\xe5\x5f\x5b\x07\x2f\x7b\xdb\x72\x89\x42\xfe\x7f\xc6\xf6\x8d\x47\xbf\x76\xf8\xbf\x91\x26\x97\x4b\xc0\x4b\x53\xfa\x6e\xf1\x9f\x2a\x6f\xf9\x67\xff\x06\xbd\x19\x77\x2f\xf9\xf9\xe3\x7f\x37\xfc\xdf\xcd\x7f\x6f\xbd\xe5\x0b\xae\x2e\x97\xe8\x3b\x96\xae\xf4\x09\xf1\x91\xed\xfd\x7f\xf1\xdb\xe8\x29\xc2\xfe\xb8\x07\x68\x8a\x28\xcf\x7f\xab\x48\x46\x4f\xe7\xb3\x61\x1f\xe4\xba\x8c\x0f\x2d\x5b\x45\xb2\x61\x76\x74\xbc\x75\xb0\x75\x2f\x2f\x2f\xe2\x06\xe7\x2a\xc0\xcc\xc5\x44\x21\x46\x76\x18\xbb\xc6\x89\x05\xb4\xa4\x41\x5a\xb0\x4c\xf0\x4d\x99\x1a\x38\xeb\xd5\xa2\x0f\x23\x6c\x15\x8b\xa6\x2d\x68\x90\xe6\x42\x05\x16\x28\xd1\x12\xb1\x52\x54\x93\x3c\x77\xe2\xc4\x0f\x69\x9c\x87\x7d\x92\xe4\x10\xb0\x90\x10\xc2\xc2\x2a\x4e\x41\xc7\xc1\xf8\x06\x21\x55\x5c\x13\xbe\x6e\x7b\x93\x77\x7f\xfa\xdd\x2b\xde\xf5\x96\xae\xf4\x31\xf1\x7b\x94\x6f\x4e\x1b\xf4\x49\xeb\xa1\x57\x7e\xc7\xf6\x19\x4e\x56\xff\x13\x6f\xdf\xa0\xf7\x9e\xd3\xd1\x0a\x87\xf1\xf0\x59\x8f\xfe\x10\xe7\xeb\x74\xf5\xfa\x0f\x2e\xbf\x54\x4a\xc4\xef\x1f\xe4\x00\x42\x8a\xf4\xe8\x67\x16\xff\x33\x9a\x72\xb9\x31\xe0\x3c\xd9\xbe\x31\xfc\xa5\x22\x7e\xe0\xb7\x57\x7f\x1f\x2c\xdd\x11\xa6\xf1\xf5\x47\xef\x5f\xd1\xe9\x57\x2f\x03\x6e\xf7\x3c\x8b\xcb\x87\x07\xd0\x0b\xd0\x37\x0e\x5c\x78\xb4\x33\x53\xa4\x83\x2b\xd7\xc4\xe1\x6e\x5d\xc2\x7d\x3c\x3b\xda\xb9\xb6\xb7\x33\x13\x56\x48\x3d\x7f\xb6\x2d\x89\x92\xf8\x02\xb8\x7a\x7c\x74\x7c\x74\x28\x6d\x5d\xdb\x92\xb6\xee\xdd\xbd\x7a\x7c\xb4\x7b\x75\xef\xfa\x2a\x4e\x74\xff\xfe\x8d\x51\x5d\x0c\x1b\x34\xdc\x84\x26\x7c\xea\x53\x31\x91\x13\x22\x5c\x89\x92\x7b\x1f\x73\x42\x35\x76\x9f\x77\xa5\xaf\xaf\x3d\x2d\xc0\xb1\xcc\x42\xa5\x36\xb4\x48\x33\x41\x57\x99\xaf\x35\xa6\x1a\x69\x06\x9b\x4f\x1e\xbc\xf2\xca\x2f\x79\x95\xf2\x25\x0f\xee\xdc\x33\xc9\x12\xaa\x5f\xfd\xaa\xdd\xd7\xff\x06\xfc\x0c\xe4\x86\x42\x34\xd3\x3e\xa5\x9f\x9a\xbe\xe1\x55\x4e\xf8\xe0\x4f\x10\x9a\x4c\xb4\x39\x68\x6c\x3e\x8f\xd3\x2a\x62\x85\x96\x68\xd9\x1c\xd4\x18\x02\x96\x80\xed\x06\x46\xe8\x2e\xe6\x10\xb2\x18\x6c\xd7\x33\xfc\x41\x2a\xfc\x68\xf2\x9a\xa7\x6f\x3d\x2d\x52\xd4\x7b\xfe\xdd\x57\xff\x27\xbd\x97\x71\xad\xf5\xd7\x5f\xfb\xfa\x1b\xa2\x20\x4c\x9e\xfa\xd4\x57\xd5\x16\x6b\x74\x0b\xc3\x8b\x5f\x1a\x08\x9a\xfa\x81\x67\xc3\x9c\x59\x1a\xd6\xd9\xc8\x23\xaf\x96\x3e\xcc\xf7\xbc\x45\x48\x79\xf5\xcf\x7f\x65\xd3\xbc\xfc\x93\xd6\x2f\xa1\x31\xd6\x3d\xec\xa1\x8f\xb6\xf9\x8c\xc4\x57\x5c\xb4\xec\x07\xf2\x3d\xdc\xba\xbe\x73\xe5\xa9\x5c\xc7\x6b\xc7\x47\x8f\xc0\xae\x38\xe0\x73\x36\x08\xe6\xbd\xd9\x21\xec\x8a\xd3\x2b\xe3\x40\xf9\xa3\xc1\x1b\x81\xd9\xe1\xec\xde\xc1\x25\xa9\x58\x88\xe7\xac\x23\xac\x50\xc3\x30\x80\xdc\xec\x2b\x66\xc7\x50\x42\xe6\x9a\xaa\x42\x4d\x4d\x0f\x22\xe6\xf7\x34\xc7\xf5\x62\x8e\xbf\xe5\xb5\x37\xd9\x2f\xc3\xcd\xbe\x93\xa3\xe8\xa5\xaf\x82\x64\x89\xe0\xad\xec\xa3\xa2\xff\x63\x5f\xf1\x8c\x3f\xfa\x31\xf6\x72\xf8\xb5\x3f\xfa\xdc\x37\xff\xcb\xcf\xc2\xaf\xc9\x8b\xe7\x93\xb0\x32\x55\x45\x51\x3c\xd7\xaa\x55\x5d\x56\xed\xa8\x28\x93\x89\xf2\x06\xe3\xbe\x98\xbd\x7b\xf1\xdf\xbf\xf2\x75\x80\xe0\x1f\xc2\x33\xd4\xfe\x6f\x7f\xfd\xad\x68\x8a\x3e\xb0\x74\xa5\x6f\x15\x7f\x80\xcf\x1a\x7b\x21\x3a\x46\xaf\x1f\xf8\x92\xe7\xbc\x78\x25\xef\x66\x00\x88\x47\x23\x8e\xaf\x0d\x2b\x3c\xab\xab\x19\xa3\x16\xbb\xab\xa9\x84\x2b\x34\xdc\x86\x85\x9f\x85\xaf\x78\xe6\x03\xef\x7f\xf1\x33\xe1\x3e\xe6\x28\xf0\xe3\xaf\xff\xa1\x97\xbf\x41\x7b\xf3\xcb\x5f\xac\x6c\xb1\xbf\xd0\x3e\xf7\x1d\xdf\xf1\x56\xf5\x8f\x26\xbf\xf9\xe1\xad\x7f\xf0\x89\x4f\xff\xa3\x4f\xbf\xf7\x6b\x3f\xf1\x35\x9f\xfd\x9a\x4f\xbc\xe7\x6b\xdf\xfb\xa1\x67\xfe\xd6\xcf\x7c\xf3\xa7\x3f\x0b\x8f\xac\x31\x53\x86\x8a\x4a\x4d\xcd\x70\x63\xe6\xf5\x24\xc3\xdd\xa2\x98\xbe\xeb\x15\x5f\xf0\xf0\x1b\xdf\xf4\x8e\x1f\x66\x7f\xfc\x8e\x7b\xbe\x4f\x7e\xe1\xdb\x9a\x47\xbf\xe1\xb5\x7f\xd2\x42\xa0\xeb\x3a\x75\x23\x9f\x92\xd0\x4b\x0b\xdb\xf3\x7d\x3b\xf5\xc2\x20\xf2\x7e\x95\x26\xad\xad\xab\x86\xef\x5b\x9d\x6a\xc8\xaa\x93\xcc\x5b\x82\x78\xac\xe1\x8d\xd2\x27\xc4\x7f\x72\x36\x13\xf5\x79\xe8\x8b\xc6\x6a\x94\xf5\xf7\xda\xb5\x5c\xe5\x4b\xf9\xfd\x88\x87\xe9\xae\x38\xd8\x18\x77\x5c\xbd\xf0\x55\x93\x5d\xf6\x32\xf8\x10\x7b\x0b\xfc\xcd\xe9\x77\xc3\x82\x7d\x3b\xbc\x97\xbd\x1a\xfe\xc2\x31\x43\xc3\x5d\xfc\x41\x1a\x05\x31\x75\xd3\xd8\x4f\x28\xf6\xb4\x96\xcd\x2d\x30\x27\x2f\x78\xbc\x45\xbf\x29\x7a\xf7\x3b\xdf\x1d\x0d\x77\xf0\x13\x5e\x60\xfb\xde\xb1\x17\xc5\xc4\x4f\xdd\x30\x8a\xdd\x86\x44\x1e\xf5\xd8\x7f\xfc\x60\xfc\x67\xaf\xba\xb1\xfb\xfc\x37\xbf\xf9\xa5\x7f\xb1\xfb\x90\xbc\xfb\x25\xf1\xef\xfd\x59\xb2\x5c\xf2\x33\x37\xc9\x40\xeb\x3f\xd9\x5e\x90\x49\xa3\xdd\x1c\xad\x78\x40\x7c\xec\x3f\x9f\xbd\xee\x8c\x3a\x72\x94\x87\x1f\xf8\x2d\x2e\x7b\xee\xe1\xf5\x4c\x95\x98\xa0\xe7\xad\x66\xe1\xbf\x04\x3d\x82\x5e\x89\xbe\x98\xf7\xf6\xde\xe5\x15\xe0\xeb\xe0\xdd\x2a\xde\x3c\x22\xe4\x0b\x61\x95\xb2\x1b\xe9\xe9\xfa\xce\x2a\xaf\x0e\x77\x78\xc4\x26\xb1\x71\x66\x58\x50\xf6\x09\x9e\xf7\x5a\xd2\x81\x1a\xa8\xb1\xea\x58\x2c\x62\x49\xc6\xdd\xf2\x14\x57\x96\xd1\x07\x49\xe6\x80\xab\x41\xc1\x2c\xec\x42\x7d\x5a\x9d\x3d\x8b\xb1\xdc\x77\x98\x62\xfb\x54\x5d\x3f\x13\x13\xc3\x0e\x6d\xb3\x2f\x9c\xbe\xb0\x35\xd5\x2c\xf4\xca\xb6\x2c\x37\xc0\x96\x83\x2d\xd3\xf2\xec\x24\x62\x96\xeb\xba\xac\x72\x5d\xb7\x6f\xd7\xcf\x2e\xe0\xe9\x3f\x0f\xf8\x7b\xac\x5d\xe1\x69\x95\x57\xde\xbe\xf1\xe9\x37\x0c\x78\xfa\xc8\xb7\xae\x5e\x77\x39\xfe\xce\xf4\xc9\x47\xde\x8a\xce\xf5\x32\x7f\xfd\x23\xdf\xb2\x61\x7b\x00\x8e\x96\xee\x64\x3c\x37\x70\xe1\x34\xd3\xd1\xa1\x50\x53\x2f\xe1\xa7\xa1\x4c\x43\xd4\x4e\xe4\xd5\x51\xa8\xc1\xee\xad\x97\x96\xa4\x8a\x0a\xda\xe1\x3a\x75\x32\xdd\x0c\x8d\x5c\xdf\x9b\xd5\xa2\xc5\x2a\x16\x07\x7e\x92\xa8\x21\xf1\xc0\x05\xf9\x24\x15\x95\xb4\xab\x16\x96\xe3\x68\x54\xd3\x84\xb6\x2c\x78\xbc\xde\x92\x4c\x5e\x9f\x73\xdf\x00\x0a\xaf\x9d\x15\xa5\x95\x96\x9e\x5e\x80\x06\xeb\x34\x48\xc0\x88\xa9\x61\x4e\x0a\x9f\x44\x81\xdd\x87\x34\xc8\x93\x50\x8b\x63\xcf\x9a\x64\xac\x09\x02\x70\x80\x18\x71\x94\x64\x89\x1b\x04\xc9\x69\x1b\x78\x0a\x51\x06\x88\x07\x98\xc9\xd2\xe2\xf5\x70\x37\x46\xab\x56\x1a\xe4\xcd\x68\x0d\xdc\x1a\x96\x5d\x4d\xd8\x9d\x81\x3f\xd5\xd8\xbc\xb5\x6d\xec\x85\x69\x92\xb8\x7d\xe3\x46\xae\xab\xb9\xbe\xae\x2f\x52\xc1\xaa\xe7\x7e\x4a\xda\xfa\xb4\x16\xcd\x84\xb5\x89\xa1\x27\x55\xe5\xd0\x74\xd1\x05\x9e\x4a\x54\xdd\xc4\x73\x12\xb8\x81\x65\x47\x39\x5a\xc7\xbb\x52\x31\xe6\x55\x20\x87\xe3\x94\xfa\xeb\x3b\x6b\xc2\x5d\x95\xc6\x9f\x43\xf2\x85\x70\x1e\x5a\x9a\x1d\x1d\x0b\x03\x85\x0e\xd4\x19\xe4\xad\x07\x51\x1e\x5b\xb8\xb1\x6d\x48\xea\x9a\x32\xd5\x4d\x42\x5f\x8b\x22\xbb\x4f\x70\xc0\xe3\x59\x32\x2e\x5d\x83\x57\xcd\x43\x33\xf5\xca\x28\x6a\x40\x76\x9c\x28\x70\x59\x42\x98\xe9\xb2\x26\x70\x15\xaa\x3a\x1d\xa9\x49\x4d\x3c\x8f\xa5\x75\xcd\x92\xba\x5e\xf7\x4a\x18\x63\x1b\x23\x9f\xbd\x18\x3d\x32\xec\xf1\x18\x9b\xd9\x3a\x03\xf4\xca\x39\xca\x2e\x40\xba\x35\x83\x75\xbd\xca\x46\x95\x47\x85\x1b\x8a\xdb\x5e\xc1\x61\x59\x52\xa6\xbb\x61\x14\x68\x61\xa4\x6b\xbd\x8b\xd3\x45\x2a\xb8\xc3\x63\xaf\x0a\x31\xd4\x4c\x1f\x6e\x7d\xe7\x9a\x89\xe9\x08\x4d\x62\xb9\xb1\x37\x9d\x0f\xd6\x53\xce\x72\xc2\x3c\x3b\x0d\x3d\x25\x55\x35\x2b\x22\x05\xc9\x08\xd8\x4c\xcb\xb2\xbe\x2b\x04\xd9\x0b\xac\xc0\x33\xcd\xd0\x75\xdc\x71\x1d\x3e\x8f\x97\x86\x1b\xb2\xe2\x6c\x1d\xab\x10\xff\x5d\xd6\xb2\x72\x22\xd6\xf2\x61\x75\x8b\x04\x95\x0a\xc6\xa2\xe2\x81\xce\x34\xcf\x69\xdf\x79\x21\x8d\x35\x42\x0c\xad\xd7\x71\xbd\xa8\x04\x63\x78\xec\x43\x1c\x2f\x1a\x30\x86\x5d\xc0\x31\xb4\x4c\xe1\xa2\x40\x16\x55\xcf\x23\x2e\xf3\xbd\x41\x15\x67\x56\xb0\xa2\x51\x9b\x84\x24\x20\x1e\x10\x97\xa5\xbe\xef\x33\x39\x08\x58\x17\x86\xab\xde\x5e\xf1\x34\xe1\x67\xc9\xb8\x7e\xe0\x25\xd9\xbc\xd9\x55\x26\xa9\x5d\x33\x4d\xc8\x29\x5d\x9d\xf1\x88\x79\x7d\x8e\xc2\x7b\xa8\xa2\xf1\x20\xe2\xe1\x2d\x79\x07\x30\xa7\xf4\xc4\xc3\xf1\xa2\x14\x9b\x45\xeb\x84\xa1\xaf\x05\xa1\xa6\x89\x0a\xe9\x3b\x42\x16\x34\x74\x35\xaa\x6b\x16\x5a\x9d\x97\xb4\xa5\x48\x44\x3c\x0e\xbc\xc6\xda\xad\x39\x8c\x19\xc8\xd3\xa6\x0f\x05\x75\xd1\xb8\x49\x1c\x69\x71\x6c\x18\x8b\x5c\xb0\x7b\x4b\x44\xc3\x67\xf6\x0e\xe7\x07\xcd\xc2\x31\xc1\xf2\x08\x67\xb4\x74\xa4\x50\x34\xc6\x09\x58\xe3\xe9\xb8\x43\xbe\xb2\xcd\x08\xc2\x0c\x92\x29\x3a\x45\x15\xd3\xc4\xee\x94\xf8\x42\x13\x57\x61\x64\xd0\x30\xd4\xcc\xd3\x5a\x34\x08\xd3\x92\x84\x65\x7d\xd5\x28\x44\xb1\x02\x30\x57\xe7\x3b\x23\x51\xe5\xf9\xdc\x15\xa6\x84\x99\x82\x67\xeb\xc3\x62\x5b\xeb\xe3\x50\x68\xda\x2d\x02\x67\xe2\x9f\x06\xf6\x44\x49\x97\xa8\x6c\x0c\x90\xcb\x5c\x37\x4f\x8b\x90\x19\xd0\xd9\xcc\x12\x55\x5e\x98\xdc\xf4\x29\xeb\x74\x6a\x78\x01\x78\x90\x11\x50\xc7\xb3\x34\xb6\x14\x4d\xdb\x73\xf8\x85\xdb\xaa\xa3\xd1\xce\x0c\xf4\x69\x7a\xe2\x66\x92\xbc\xf0\xdb\x06\x32\x2c\xbb\x3e\x29\xe3\xd4\xea\xb3\x3e\xb3\xc1\xc9\x7b\x67\xda\x12\x16\x90\x7e\x3e\x57\xbc\x32\xb3\x58\xc1\x42\xbb\x08\x65\x0a\x36\x14\xab\x18\x0f\x91\xa8\x28\x8f\xb5\x7e\xab\x13\x84\xeb\x63\x5d\xfb\x3b\xb3\xc1\xa6\xce\xc4\xf4\xb4\x72\x84\xaa\x85\xa6\x2b\x26\xa9\xbf\xf0\xac\x96\x19\x93\x26\x5c\xd0\x40\x94\x87\x25\x2c\x02\x42\xc0\x8f\x04\x77\x51\x40\xc2\x82\x11\xff\x96\x44\x38\xfc\xf7\xae\xe9\x64\x4b\x99\xee\x1f\x0d\x18\x1a\xcf\xff\x81\x31\x90\x89\xd0\xf6\x1d\x0b\xfc\xca\x35\x19\x92\x54\xa6\xd3\x01\x60\x95\xd5\x7d\x51\x46\x41\x49\x60\x4e\xc8\xe9\x9c\x7f\x1e\x95\xa2\x8b\x70\x6e\x5d\x38\x7d\xb6\x35\xab\x44\x6f\x51\x04\x02\x02\x74\x13\x41\x4a\x98\x0b\x65\xd0\x47\xd0\x09\x6a\x1f\x0d\x70\x6a\x8b\x94\x10\x5c\x10\x98\x9f\x94\x78\xd4\x0d\xa6\x14\xf2\x3c\xd1\xec\x89\x54\xca\xe4\x40\x28\xd6\x29\x3f\x9c\x54\x30\x8b\xf6\x95\xc1\x1c\x17\x7c\x83\x59\x50\x32\x7f\xe2\xf5\xf5\x54\xe6\xd6\x7c\x30\x48\x41\x99\x0f\x79\x66\x03\x17\xd6\x60\x12\xe8\x78\xfd\x9b\x8c\x26\xe8\xfd\xcb\xdf\x90\x9c\xe9\x4f\xae\xce\x6e\x3e\xe3\xe2\xe9\xcd\xe1\x71\x6c\x24\xf8\x79\xc3\x5d\x2c\xa6\x37\xdd\x2b\xc3\x1d\xde\x22\x93\x07\xc9\xe9\xeb\xc9\x64\x7b\x75\xe6\xe2\x9f\x2f\x89\xf4\x5a\x31\xe4\xfd\x02\x76\x56\x58\xde\x38\x73\xc5\x7f\x3f\xe4\xad\xcc\xfe\x31\xc5\x1a\xbd\x39\xa7\x58\x5b\xfc\x0d\xff\xac\x4f\x90\xc9\xff\x8f\xc9\x10\xf2\x24\x41\x7c\x9a\x91\xd1\x9f\x4d\x24\x4f\xd4\xcf\xe0\x1a\x75\xef\x6c\x77\x36\x12\xf5\x28\xab\xae\xcc\x6a\xd1\xb9\x99\xe5\x93\xf6\x54\xa1\x42\xb6\x70\x86\x1b\x0b\xf8\x91\x0c\x9d\xcc\x17\x2e\xd6\xda\x3e\xea\x7a\x42\xd0\x78\x66\x30\x91\x02\xd1\x44\xf7\xf2\xa9\xe4\xab\x93\x9b\x67\x07\x07\xb1\xb0\xbf\xbd\xb3\x12\xe4\xa3\xc1\x5d\x88\xe1\x69\xad\xa8\x42\x58\x40\x75\x53\x9d\xf8\x79\xaf\x39\x31\xad\x1c\xe6\xe0\xa4\x29\xc3\xbc\x96\xbb\x2a\x28\x1b\xd1\xa4\x24\x39\xcd\x09\x11\x32\xe6\xb1\xc4\xc2\x32\x8e\xfb\x3a\x48\x22\xea\xd7\x11\x0d\xd3\x70\x9c\xeb\x1a\x4b\x89\xa8\xf1\xb5\x5c\x19\xab\x4d\xcf\x6b\xac\x78\x25\xe6\xc6\x69\xa7\x4c\x8c\xfa\x39\x8e\xba\x0a\x07\xfd\x5c\x28\x96\x08\xcf\xa9\x37\x5c\xa4\x08\x75\xaa\x87\xa2\x46\x4e\x08\x21\x53\xff\x84\xdf\x26\x8e\xc9\x9c\xb1\xf4\x3b\x61\x94\x25\x06\xc4\xe0\x8c\x36\x50\x2c\xd1\xc1\x06\xfa\x30\x8f\xbf\x7c\xf8\x5f\xaf\xfc\xda\xf1\xbc\xb5\x79\x76\xb2\x60\x5d\x31\xba\x71\x32\xee\x90\x3f\x1e\xac\x4f\xad\xad\x6e\xc3\x37\x2e\xfa\x4a\xac\xfb\x12\x2a\x66\x60\xbf\xab\xb0\xcb\x4c\x28\x09\x0c\xfc\x6c\x82\xc1\x2a\x81\x82\xc9\x4a\xa6\x0f\xaf\x0c\xb7\x29\x1d\xf4\x59\xaf\xb0\x9c\x10\xb0\x71\x0b\xf6\xc2\x1b\x68\x76\xbc\x2d\x3c\xb0\xd7\xb0\x12\x31\xd8\xbe\x31\x40\xb9\x2d\xbe\xff\xaf\x11\x5a\x9d\x79\x8b\x56\xb0\x3e\x77\x8d\xb3\x4d\x08\xcf\xe1\x1a\xbe\xa9\x58\xf6\x35\xaf\x5d\x75\xbb\x0a\x5b\x03\x2f\xf4\x2d\x4e\xc1\x1d\x5e\x63\x19\x33\x81\x9f\x59\x4d\x7b\x8b\x25\x84\x40\x80\x73\xf0\x4e\x42\x2c\x43\x02\x2d\x93\x59\xc8\xf5\xe8\xe0\xf3\xab\xdc\x4f\xb9\x8f\x67\x6d\x06\x5a\xbe\xc5\xe6\x3b\x1e\x76\xec\xca\x35\x5e\x26\xb8\xb7\xae\x66\xe4\xd6\x15\x37\xa6\x5e\x06\xc7\x23\xc1\x6b\xd3\x90\xb5\x2c\x73\x3d\xcf\x53\x1d\xcf\x06\xa5\x3e\x25\x50\x33\x8f\x10\x90\x59\x27\x10\x6c\xab\x71\xe8\x07\x9e\x4f\x0b\xaf\x0e\xa2\xc4\x8b\x23\x4b\x55\x98\x7f\xca\x8f\x72\x88\x6a\x4a\xe2\x45\x6e\x3b\x32\x91\x35\x21\x0c\x02\xd6\xf4\x51\x26\x18\x4c\x01\x2f\x66\x79\xeb\x87\xa1\xef\xe7\x7e\xe2\x91\xc0\x8b\x3c\x9f\x38\xee\xc2\x1c\xeb\x52\x70\x21\x91\xc9\x9c\x67\x15\xb8\x9f\xc9\xcb\x18\x5a\xc7\x10\xf4\xae\x12\x1c\xc3\x99\xcc\xb3\x9a\x90\x7c\x3c\x97\x1e\xf3\xb3\x71\xcf\xd8\xf4\x4b\x47\xb9\x13\x0a\xa1\xe5\x10\xcf\xc2\xed\x49\x3a\x95\x4f\x5c\xd6\x4c\x65\x1a\xdb\x59\x41\x4e\x33\x32\x69\xce\xfd\x97\x64\xb0\xd7\x3f\xfd\x65\x03\x8d\x7d\xda\x59\xed\xdb\xa3\xdc\x2e\xff\x46\x34\x45\x57\xcf\xeb\xd7\x6e\x91\xba\xc2\xdf\xf0\xb2\x45\xf8\x5c\xcf\xd8\x77\xbd\xe5\xb7\xbe\xc2\x64\xa2\x24\xb0\x87\x3e\x26\x7e\xe3\x58\xa2\xc8\xd8\xa7\xfa\x6f\xfb\xf3\xf7\x45\xff\xfb\xff\x88\xf7\x3e\xf5\xa9\x53\x7b\xe4\x23\x73\xf0\x0f\x78\xad\xfc\x15\xf4\xc0\x26\xd4\x53\x7e\x54\x6e\x6f\x32\x0e\x2c\x17\x25\x1e\xd7\xe2\x95\xf4\xa3\x89\x9b\x08\x8a\x6e\xa5\xb6\x21\x28\x37\x75\xe8\xa2\x8a\xe5\x1e\xa8\x42\x09\x72\x1d\xce\x3b\x97\x44\x15\x84\x90\x78\x0c\xb1\x8a\x45\x4c\x75\xa0\x05\xa3\xc9\xe2\xb4\x2d\xa7\x41\xe8\x99\x51\x42\x4c\x7f\x89\x28\x89\xe6\xb4\x4a\x9a\x94\x35\x56\x97\xd7\x6e\x4a\xaa\x2e\xa4\x7e\x95\xd5\xfe\x3c\x4d\xc7\xb5\x8f\x35\xe5\x11\x7a\x36\xef\x09\xc9\x61\x13\xa5\xeb\xc7\xeb\x68\xf9\x31\x3f\x3a\xc7\x37\x65\xf0\x64\x79\x76\x99\x57\x63\x4d\x54\x5b\xc7\xed\x42\x4f\x6a\xb0\xe7\xa1\x17\xcd\xfb\x8e\x59\x0e\x96\x1b\xd6\xb2\x4a\x6b\xd3\x3e\x15\x2c\xdd\xc4\x65\x9c\xe5\xa0\xcd\xe3\x39\x9b\xb3\xa8\xcf\x1c\xac\x63\x5f\x8c\x82\x98\x74\xa9\x62\x84\x71\xc0\x4a\x16\x27\x24\x2d\x0d\x95\xa6\x20\x13\xdf\x5d\xcc\x83\x9a\xe6\x55\xdc\x94\x03\xfc\x14\xa2\x55\xde\x3b\xe1\xb5\x28\xfb\xe8\xa1\xb3\xba\xcf\xcd\x9c\xaf\x22\x89\x68\xba\x3e\x24\x7f\x63\x1f\x36\x4e\xac\x08\x8d\x6b\x08\x5a\x5f\x39\xa1\x63\xfd\xbf\x8c\xfd\x0b\xbc\xdc\x64\x9d\x3f\x8e\xe7\x49\x66\x32\xa3\x28\xe4\x4c\x6d\x1b\x10\x6c\x0e\xa7\x3d\x27\x0a\x68\xe4\x78\xda\x28\xd0\x06\x2f\x25\x2a\xd2\x78\xc3\x78\x41\x22\xac\x25\xe0\x85\x28\x88\xf1\x86\xd1\x45\x0c\xa2\x10\xb4\xa5\x0f\x50\x7a\xd2\xd2\x42\xa0\xa5\x0c\x3d\xad\x3b\xbb\xae\xee\x2c\xa2\xce\xee\xb2\x6e\xd6\x1b\xe3\x7a\xcb\xba\xea\x7f\xbe\xfa\x57\x67\x77\xd5\x9d\xf6\x4c\x3e\xe7\xf7\xca\x93\xcc\x4c\xe6\x52\x77\x29\xe7\xf6\x9c\x9c\x27\xcf\xe5\x73\x79\x7f\x3e\xcf\xe7\xf9\x7c\x04\x5d\x17\xa1\xce\x4b\xd0\x59\xa1\xcc\xb0\xad\xc7\x1e\xa3\x8a\x1a\xc3\xd7\x9c\xc0\xaa\x75\x29\x72\x57\x93\x75\xfc\x1a\x5e\xc6\x96\x51\x0e\x38\xad\xa0\x02\xe5\xb6\xc1\xb7\x5c\x03\x95\x91\x46\x97\xb1\xef\xc4\x36\x34\xc1\xd7\x90\x8e\x64\x49\x06\x1f\x5a\x3a\x2a\xf7\xee\xf2\xc9\x25\x83\x35\xa9\x67\x10\xbf\x41\x8e\x9e\x7b\x11\x2c\x5c\x89\x5c\xef\xc9\xbc\xf2\x85\xb2\xcc\xd3\x9d\xe3\x1e\x5d\xe7\x45\xd4\xae\xc9\x26\xea\x9c\xb0\x5b\x38\x62\x6c\x23\x0e\x75\xd1\x97\x34\xd6\x34\x4d\x8c\x75\x0d\xb0\xec\x62\x0c\x0e\x34\x3a\x3a\xa2\x90\x84\xea\x5e\xdd\xf2\x64\xcf\x4e\xcf\x06\x1c\x82\x2d\x1d\x72\x2b\x6e\x8a\xc4\xeb\x0c\xde\x4c\xee\x5c\x11\xfd\x53\x28\xae\x1e\xbe\x49\x58\xe0\x64\x81\x29\x1f\xe7\x18\x49\x10\xe3\x76\x51\x3c\xd1\x0c\x98\xa8\x2b\x40\x54\x6c\x43\x07\xea\xa6\x69\x59\xbc\x6e\xeb\x9d\x70\x59\x62\x1d\xc3\xf2\x3c\x5d\x01\x13\x24\x37\xd1\xe1\x9e\x1d\x69\x1a\x8f\x39\x1e\x09\x86\x91\xfa\x25\x95\x94\xb7\xee\xfb\x31\xe1\xad\xd7\x53\x29\xd6\xb7\x56\x3e\x42\xce\xa2\x18\xea\x19\xe4\x36\xe9\x4b\xb2\xbb\x61\x24\x98\x00\xf5\x4c\xba\xd1\xfd\x7c\x26\x2a\xcd\x6d\x46\x1b\x72\x86\xca\x8e\x62\xfd\x84\x52\xdc\xaf\x20\xde\x86\x50\x8d\xa5\xb8\xc9\x70\x82\xe8\xcb\x02\x43\xc5\xa1\x66\x98\xba\x60\x98\x22\x84\xe5\xa0\xa3\x87\x1e\xa3\xd4\xaa\x0e\x0e\xbb\xa2\xe3\x35\xcc\x90\x7e\x37\xde\x01\x7a\xcd\x6d\xa2\x16\xfd\x33\xac\xa9\x92\x61\x62\x30\x6c\x9d\xf7\x05\x03\xd9\xd0\x80\xc8\x72\x8d\x56\xad\xda\x31\xa3\xa6\xa6\x75\x3c\xc7\xcf\xcf\x67\xe9\x32\xe2\xeb\x78\x2a\xe7\x1b\x49\xdb\x5f\x4f\xda\xff\x29\x9b\xa7\x4b\xe2\x23\xbd\x6c\x0f\x4e\x4f\xb8\x29\xc7\xed\xbd\x5d\xc8\x2e\x37\xa0\xd1\xf9\xba\x8c\xc4\x09\x81\x24\xd0\xed\xe3\x3c\x2a\x17\xa2\x65\xc1\x27\xb1\x7d\x8a\x7f\xc2\xf4\x11\x55\x68\x01\xa5\x7b\xd8\x15\x7c\x5f\x8d\x6b\xc5\x48\x95\x25\xcd\x70\x4d\xb0\x1d\x17\x30\xd8\x88\x6a\x23\x7b\x85\xf2\x00\x5b\x89\x89\xa0\x92\x78\x1e\x32\x07\x75\x68\x0e\xff\x98\xe9\xd4\x5b\x56\x6e\x2e\xdd\xce\x7e\x8a\xe0\x95\x04\x17\x9e\xde\xab\xd1\xbd\x29\xb5\x0e\x73\xb4\xd3\xc7\x2f\x8f\x16\xaa\xcb\x9a\xc7\x38\x5d\x07\xfd\x7c\x8b\xc0\x3c\xbb\x73\x9c\x59\xe0\xe7\xe2\x1f\x16\xb5\x13\xd5\xa0\x40\x75\x29\xf2\x81\x41\x76\x6b\xb4\x75\xc5\xfb\xbe\xf4\xa5\xcb\x37\x2f\xff\x22\xd6\x90\xef\x82\xe9\x4e\x58\xb7\x7f\xc8\xd6\x73\xdb\xca\xa5\x25\xbf\xdf\xbe\xfd\xc8\x1d\x6c\x74\x01\x9a\x7f\x59\x85\x3d\x18\xa6\xb5\x93\x49\x5c\x76\x42\xdb\x09\xed\xbc\x6c\x02\x57\x8d\x05\x80\xa4\x16\x62\xba\xf6\x1b\x11\x71\xc8\x11\x41\xbb\xa1\x20\x28\x3c\x5d\x3d\x5e\xa3\x23\x5e\xa2\xb9\x9a\xaa\xa1\x7a\xb7\x4d\x37\x63\x51\xf3\x74\x9d\x37\x0d\x85\x58\x89\x4d\x54\x97\x34\x6c\xc8\xa8\x6d\xc4\x9a\xd1\x81\x50\x43\x65\xa6\x81\xc4\x8e\xdd\x86\x88\x75\xac\x94\x23\xab\x8a\x67\xe0\x36\x06\xdd\xd4\x79\x8f\x53\x90\x87\xdb\xd8\x31\x25\x07\xbb\xb1\xe0\x86\x0e\x36\x43\x5c\x77\x1a\x6e\xb6\x0f\x66\x36\xf7\x4b\x09\x6f\xbc\xae\x8f\x6d\x64\x72\x3e\xdd\xa3\x99\xe7\x53\xaf\xc9\xcf\xaf\x47\x35\xc5\xd5\xe9\x69\x53\x31\x17\x87\x41\x6e\x64\xcc\x0f\xce\xb3\x4f\x45\x33\x67\xcf\x5e\x84\xa6\xd9\x5e\xd6\x97\xe9\x85\xe9\x8d\x4c\x47\xe0\x19\xf9\xb8\x44\xb7\x39\x1e\xf8\xc4\x62\xc3\x4c\xd8\x95\x8a\x3a\x3e\xa1\x61\x24\xa1\x08\xa3\x08\x04\x5a\x5e\xe6\x69\x1e\x04\x64\x62\x9e\x56\x05\xc9\x51\x39\x5c\x76\xdb\x58\x01\xe9\xdc\xea\xe7\xa1\x6e\xa1\x77\xbc\xf7\xe6\x17\x80\x40\x73\x3c\x6b\xcb\xaa\x6d\x8b\x62\x22\x3e\xe5\xa8\x63\x3b\x88\xea\x98\xa6\x6d\xd8\xb6\x11\x59\x10\x0a\xbc\x64\x89\xd8\x50\xf4\xf0\xf3\x37\xbe\xe3\x42\xf3\xe2\x2d\x9a\xe1\x28\xe4\xbc\x24\x4f\x87\xb3\xf7\x3f\x40\x28\xa0\x91\xf1\x93\x95\xfa\x14\x33\x1a\xfd\x56\xe6\x53\x54\x48\x5c\xdc\x67\x08\xa2\x5e\x4d\xbd\x86\xba\x8c\x7a\x03\x75\x39\xf5\x36\xea\x9d\x14\x85\xd6\x26\xe2\x61\x63\x85\x9c\xbe\xf5\x57\xab\x94\xec\xf6\xa6\x3e\x49\xcc\xaf\x9e\x49\xa3\x55\xe6\xa6\x48\x9d\xd4\x29\x12\xe3\x31\xe4\x43\x58\x98\x9e\x43\x0b\x33\x67\xd1\xf3\x0b\xf3\xab\xe7\x17\x8a\xab\xd3\xaf\xc8\xb8\xad\xe4\x2d\xde\xb0\xeb\x63\x25\xcf\xa3\x7f\xbb\x65\x1d\x83\x8e\x17\x98\x2d\xfc\xdc\x07\x4c\x1d\xf1\xaa\x14\x48\x32\xf2\x80\x43\x56\xbd\x0e\xed\x3a\x12\x34\x68\x36\x70\x88\x6b\x1d\x03\x89\x01\xb4\x90\x0e\x26\xc2\x04\x4c\x3a\x48\xb5\x68\x2e\x0c\x71\x14\xd7\x42\x1c\xd1\xc7\xd6\xc1\x61\xb8\xfb\x33\x9f\xb8\x19\x9d\xc3\xbc\x2e\x0e\x99\xdf\xaa\x9a\xeb\xca\xd2\x6f\x55\x43\xd3\x25\x55\x72\xed\x8e\xdb\x69\x18\xbe\x1b\x81\x4e\x97\xe3\x0e\x72\x9b\xb6\xe3\x36\x5c\xcb\xb5\x5c\xdb\xd5\x21\xb0\x6d\xd7\xb2\x2c\xab\x93\x7c\x4a\x79\xe7\xad\x2b\x52\xc9\x67\x6f\xaf\xcc\xde\xff\xae\x7f\x5f\xae\xb0\x07\xae\xec\x9f\x11\xd9\x25\xcc\x7a\x95\xd9\x83\x44\x16\x1f\xb9\x20\xcb\xbf\xd4\x8b\x37\xce\xfc\x89\x83\x28\x63\xc6\x1f\x09\x2d\x66\xb5\x89\xa1\xc4\x14\xa2\xb9\x15\xb5\x28\xb0\x0e\x89\x5a\x5f\x4b\x72\x62\xb0\xa5\x39\xaa\xe0\x62\xdd\xf5\x71\x55\x45\x35\xd6\x91\xa2\xe8\x44\xad\xa0\x87\x3e\x46\xe9\x1e\xeb\x14\x55\x0a\x12\xbc\x7c\xcf\xcf\xc9\x1e\x7f\x33\xc3\x5d\xfa\xca\x0f\x93\x76\xaa\x48\x32\xdd\x64\x11\x00\xec\x20\xd4\x9a\xb6\xfb\x59\x4a\x50\x03\x0b\x02\x32\x50\x47\x8b\xdb\x50\x83\x28\x0e\x75\xda\x43\x8f\x93\xdc\x24\xc5\x6d\xb2\xa6\xc4\x9d\x10\xb7\x51\x1b\xf8\x8e\x8b\xa4\x95\x15\xea\x57\x2b\x77\x94\x6e\x67\x59\x6e\xfb\x5d\xf7\x7f\xfb\xac\x97\x4f\x6d\x41\x95\xd9\x1d\xdf\x7c\xc5\x1d\x95\xd2\x8e\x6f\xac\x2c\x53\xbf\x22\xe3\xd2\x7a\xe7\x7b\xc7\x08\x45\x2e\xfd\x21\x5b\x3f\x6d\x45\xce\xfc\xb4\x57\x26\xed\xc9\x6f\x27\x3e\xff\xdf\xfd\x76\xa5\xa4\xe7\xda\xff\xeb\x24\xcf\xaf\xeb\xfb\x81\xf5\x92\xc7\xca\x95\xd9\xfb\x4c\xb2\x1e\xdf\x18\x7d\xde\x3f\x95\xbc\xd7\xcf\xb5\x4b\x09\x8f\xa4\xfd\xdc\xf3\xbb\x5c\x3b\xb1\x99\x8e\xed\x4b\xda\x1f\xd5\x72\xe3\xa9\x92\x76\x3f\x69\x3f\x94\x1f\x3f\xf1\x4b\x1f\xfd\xc5\xa0\x7f\x8a\x21\x71\x75\x55\xd6\x21\xb9\xb3\x9e\x9b\x10\x4a\x71\x8e\xea\x6d\xc4\x86\x7e\x28\x2a\x39\x86\x2d\x50\xe0\x03\x67\xd2\x16\x52\x3c\x8e\x47\x1e\xaa\x1b\xa0\x80\xad\x89\x58\xd4\xe2\x7a\x51\x87\x2a\xb4\x1c\xc4\xb5\x97\xbd\xa2\x0d\x4e\xdb\x45\x1a\xf2\x75\x81\x07\xa7\xee\x87\xae\x57\x95\x6b\x1e\x68\x1e\x48\x91\xdd\x44\x7a\x16\x73\x46\xc6\x4a\x6c\xcd\xb5\xb9\xdb\xae\xc9\x10\xd2\x53\x75\xae\x38\xb7\x7e\x8a\x89\x7c\x11\xe1\xe4\x6d\x06\x68\xe0\x81\xa8\xd3\x16\x2d\xfb\x7e\xac\xfa\x20\xeb\xc8\x61\x6d\x49\x06\x2b\xf4\x9b\xa8\x06\x66\xc7\x43\x3a\xd4\x96\x71\xc1\x00\x01\xac\x8e\xd7\x40\x52\xb6\xee\x62\xe9\x51\xd6\xab\xcc\xdd\xf3\x73\xaa\xd8\x6d\x57\xd8\x7b\x7e\x4e\x09\xd9\xba\xb8\x83\xf5\x7a\x5c\xea\xef\x93\x9c\xfa\xf7\x1f\xfb\x0c\xd9\xa7\x27\x47\xd7\x7d\x69\x71\x88\x3e\xf4\xfe\x79\xc0\x5d\xc4\x2e\xfc\x6a\xbf\xdd\xc8\xda\xef\x20\xfe\xfd\xbb\xa8\x1e\x5e\x54\x33\xfa\x3f\x85\x78\xab\x08\x07\x14\xc7\xf9\x80\x11\x90\x87\x78\x13\x3a\xe0\x40\x9b\xae\xa2\xa6\x09\x72\x6c\xd0\xf6\x04\x96\xa0\x2d\xdd\xc1\x8e\xd1\xb6\x7c\xec\xdb\x2c\x37\xca\x18\xa3\xe3\xb9\x73\x30\x9e\xfc\xbc\x8e\x7e\x61\x8c\xfe\xd2\xf6\xbb\xc7\xf8\xc1\x1b\xd0\xdf\x51\x2f\x47\x7f\x78\xb0\x9e\x47\x77\x0e\x3d\xdf\xa7\xe3\xa3\x5f\xca\xb5\x6b\x83\xe7\x1f\x7b\xc3\xa4\xf5\xe4\xd8\xc7\x5e\x4f\x0d\x70\x8d\x95\xf2\x95\x40\x55\xd8\x43\x77\x37\x47\xf9\x21\xa5\xfb\x27\xfb\xfd\xd8\xf9\x7e\x1e\xff\x55\xee\xbd\x7a\x6e\x9c\x5f\x1c\xe3\x5b\xd2\xbe\xf4\xda\x5c\xfb\x9b\x7b\xfc\x5c\x61\x8f\x7e\xee\xab\x79\xbe\x72\x7b\xcf\xfb\xcf\xce\xf6\xf7\xdd\x24\x5e\xd5\x21\x3e\x94\xd9\xf4\x2c\x8c\x63\xd8\x99\x81\xcb\x93\x2d\xcd\x55\xb2\x93\xf7\x9c\x2c\x2d\xfb\x0a\xdd\x51\xe5\x86\x1b\x0a\xa8\x6c\xe9\xbc\x14\x5b\xb2\x6f\x87\x3f\xf5\x0c\xac\x61\x78\x8b\xaf\xdb\xbe\x61\x6a\x48\x67\x1d\xa1\xbd\x1c\xac\x50\x0d\xde\xe7\xad\x26\xe3\xd7\x43\x0b\x09\xf0\xf5\x7a\xa4\x47\x75\x66\x41\x6a\x45\x27\x1a\x05\xd9\xb1\x7c\xe4\x0d\xad\x0d\x59\x7b\xff\x59\x7d\xde\x97\x09\xef\x9f\x42\x4d\x91\x7c\x33\x29\xef\x8f\xb0\x7e\x89\x24\x70\x22\x27\x2f\x05\x0a\x30\xf0\xa9\x00\x10\x91\x83\xc2\x84\x1f\x0d\x9d\xf0\x7f\x58\xd4\xa1\x13\x85\x26\x34\x40\xd4\xda\x61\xb3\xbe\xec\x15\x1d\xf0\xda\x1e\x52\x90\xa7\xcb\xe0\x37\xfc\x86\xef\xf8\x72\xe0\x80\xe3\x41\xad\xea\xe2\x4e\xcd\x33\xcc\xa0\x4d\x31\xa8\x9c\x9d\x6d\x9c\x46\xf1\x24\x66\x6b\x9e\xa3\x4b\xe4\x12\x1b\x4d\xd2\x56\xa1\xf9\xa9\x34\x8f\x4b\x6a\xda\x15\x7d\x5f\x90\xda\x35\xd7\x6f\xd4\x41\x35\x91\x85\xca\xc6\xb2\xe9\xa3\x72\x5b\x85\x16\xf8\x26\x6a\x87\x0e\xb6\x1b\xac\x1d\x3b\x50\xf7\xa1\x0d\x4d\x17\x09\x1d\xc0\x75\xd7\x47\x55\x9a\x47\xed\x65\xce\xc6\x6e\x35\xb0\x0a\x11\x74\x20\xd2\x91\x80\xca\x24\x2f\xc3\x25\xe4\x9e\x45\xc2\x8f\x6b\xc8\xad\xcb\x9c\x9f\x2b\xb7\x43\x23\x87\x71\x3b\xee\xf9\xf4\xbf\x7c\xf1\x69\xe6\x31\x47\xf3\x55\x6b\xb9\xdd\xdf\x1f\xe6\x05\x0f\xbf\x1b\xdf\x7c\xd3\xf4\xcd\x37\x5f\x70\x7e\xe1\xba\x97\xc1\xf3\xe0\xd8\xd5\xe8\x4d\xf4\x2c\xc8\x71\x4b\xa5\x25\x54\x43\xcd\xfc\x26\xa1\x5b\x8e\xff\xdb\x0d\x57\x73\x07\xf8\xe7\xbf\x94\x2a\x50\x57\xac\xbc\xb5\xf4\x28\x7b\x55\xe6\x53\xe4\xd3\xbb\xf6\x1b\xb2\x04\x86\xab\x86\xa4\xc3\xb7\x3d\xaf\xfb\x04\x1b\x1d\x17\x18\x85\x11\xba\xd1\x79\x13\xc4\x02\x7b\x55\x6c\xbe\x68\x1f\xfd\x66\x0c\xdb\x36\x5e\x7a\x11\x9c\xfa\xad\xbb\x7e\x89\x7e\x04\xe7\xfd\xf6\xd3\x68\x66\x88\xde\x09\x1f\xdf\xb7\x30\xc6\xdf\x84\x66\x1e\x3d\x33\xc7\xdf\x44\x8f\xec\xfa\xd3\x98\x9c\xc8\x3d\xbf\xe3\xeb\xb9\x76\x33\xe1\xbf\x43\x5f\x19\x7b\xbe\x31\xe0\x33\xff\x94\xd1\xfe\x8f\x91\x18\x9a\x64\x54\x23\xed\x84\xff\xee\x2f\x8f\xf2\xf1\xd2\xd9\x09\xbe\x3c\xb6\x97\xbc\xfd\x89\xfe\xdf\xd4\x07\x32\xc7\x7f\xe6\x49\x78\xff\x99\xa3\x3a\x32\x93\x21\xef\xcd\xb5\xcb\xb9\xb1\x3e\x63\x6c\xce\x69\x7b\x71\xb2\x6e\x5e\xec\x8e\xe9\x66\x32\x9e\x87\xde\x9f\x93\x69\xa9\x4e\xf9\x74\x87\xaa\xb0\x89\x64\xeb\xf7\xe3\x90\x78\x1f\x3a\x99\x73\x6e\xed\x94\x01\x3f\x57\xd8\xfb\x0b\xb9\xf7\xe6\x74\xd9\x23\x7b\x27\xcf\x6b\xf1\x97\x63\xe3\x4c\x65\xef\x5b\x47\x9f\xdf\xf3\x57\xe4\xbd\x7b\x4f\x32\xdf\xdf\x4d\x96\x99\x8b\x52\x86\xf1\xb4\x15\xaf\x54\x63\x5d\xea\x14\x82\x2c\x72\xda\xbd\x98\xcb\xa2\x38\x35\x3f\x35\xcd\xb4\xab\x72\x8a\x27\x54\x30\xc0\x03\x5e\xa7\x5d\x92\x45\x2b\xc6\x0c\x75\x9c\x43\xb2\x8f\x6c\xd6\x95\x54\xc0\x75\x3f\x44\x2e\x38\x89\x96\xf7\x41\xc2\x20\x60\x9c\xd0\xfd\x00\xbb\xe5\xc6\x77\x24\xaf\x7b\x9c\x41\xfb\x7d\xd7\xe4\xda\x89\x2e\x59\xfc\xc5\x18\x6d\xd6\x73\xf3\xf9\x8f\x7e\xfb\xd6\xd2\x5b\x58\x9b\xbb\xe6\x91\x9b\x56\xf8\x95\x5f\x6d\xbd\x42\x21\xbb\xf5\xbf\xee\x09\xa1\xc1\xc5\x9f\xff\x39\x7e\x79\x1c\x4f\xa6\x9d\xc3\xcc\x64\xbd\x7a\x28\xce\xb5\xf7\xe7\x5c\x61\x77\x3e\x39\xda\xff\xd2\x3c\x99\xc3\xcf\xc6\xf8\x28\xa5\xfd\x56\xee\xf9\x1c\x6e\x7c\xe4\xb6\xc9\x38\xf6\x91\x1d\xb9\xf6\x5a\x8e\xc6\x7f\x3a\x99\x16\x8e\x7c\x71\x94\xa6\x96\xfe\x73\x6c\x1d\xdc\x41\x3f\xbb\xfe\xe7\x24\x34\xfb\x93\x4c\x67\xa5\x7b\xec\x50\x02\x35\x97\xe6\x89\xe9\xd9\x7d\x6c\x69\x9a\x46\xc4\xe8\x2b\x24\x56\xf0\xec\x1c\x89\x5b\x98\x46\x24\xa5\xd6\xaa\x9c\x04\xa7\x2d\xa4\xf2\xe5\xa0\xcc\x33\x5c\x37\xe2\x05\xda\xe7\xa1\xd5\x40\x8a\x0d\xcd\xd6\x0a\x05\x91\x86\x74\x1c\xe8\x4e\xcd\x44\x86\x01\x0d\xe4\x70\x65\xad\xd5\x10\x97\x23\x5f\x35\x7c\x55\xd3\x10\x57\xe4\x83\x3a\x57\xf3\xb1\x67\x83\x06\x2d\x47\xf7\x0c\x5c\xd5\xb1\x61\x63\x0c\x9d\xd0\x43\x2e\x6d\x82\x21\x0a\x61\xad\x81\xca\x0c\x96\xa2\xe6\x89\x5a\x81\xb7\x0c\x1f\x79\xc3\xb8\x32\xc5\x23\x3b\xfe\x7e\x94\xa7\x0f\x3f\x7b\x04\x67\x65\xfb\xb5\xf8\xe3\x41\x7b\x16\xb7\xe0\xb3\x2e\xc9\x13\x33\x4b\x51\xc3\x98\xb1\x7f\x74\x9b\x1d\x7e\xae\xc9\x2e\x59\x6e\x2c\x50\x81\x20\x22\x0f\x55\x13\x2c\x6d\x80\x0f\xbc\x46\x3b\x2e\xa3\x76\x6b\x5e\xdc\x60\xbd\xae\x55\xad\x22\x0f\x05\xba\xee\x46\x4d\x47\xd5\xe3\x66\x8c\xa5\x0e\xeb\xca\x92\x98\xb0\x5e\x1d\xf9\x44\xa3\x6b\xd0\xc2\xe0\x62\x0c\x0d\x97\xd7\x74\xc3\x68\x40\xcb\x31\x0d\x4b\xf0\x82\x91\x3d\x5d\xf4\xc7\x30\x63\x7e\x4f\x17\x73\x36\x57\xae\xfd\xf1\x7b\x73\x31\x33\xf9\xb5\xaa\x8f\xda\x5c\x8b\x7b\x26\x60\xd2\xbe\xbc\x5f\xbc\xbf\x2f\x5f\x95\x92\x99\x3c\xff\xe0\x75\xad\x51\xf9\xea\x0e\x68\x7b\xa7\xde\xef\x47\x1a\x8c\xa7\xc2\xee\xfe\xd0\x98\xdc\x25\xe3\xdc\xf1\x77\x93\x79\xea\x9e\xd7\x8c\xcd\x97\xf4\x7f\xb8\x3c\xc6\x23\x29\xef\xec\xce\xb5\x1b\x64\xfc\xe4\xbd\xf7\xfe\xf7\x68\x3f\x07\x1f\x1d\xd1\x03\x99\x1e\x5b\xbc\x6f\x6c\x1d\x72\xf3\xda\xf1\xb5\xc9\xb6\xe1\xe2\xbd\x27\x91\xdf\xf7\x8c\xc9\x84\x7d\x14\x55\x99\xfd\xa2\x45\x90\xef\x7c\x4e\x27\xba\xfd\xb5\xc6\x93\x75\xc4\xd2\xab\x33\x1f\x69\x2a\x2f\x12\x7a\x4d\xe3\xea\xa4\x94\x66\xc9\x7d\x5c\xba\x38\x47\xad\x1a\x4a\xd9\x9c\xf3\xe1\xe7\xd1\x71\x1b\xf3\x3c\x2a\x13\xb7\xc0\x0a\xd5\x81\x86\x86\xaa\x7b\xaa\xfa\xce\x77\x6d\x9b\xb9\xf6\xba\x8b\xd0\x3f\x5e\x3b\x53\x3d\xe3\xba\xd8\xdb\x73\xee\x9e\x87\x1e\x82\x5b\xfa\x0c\xcb\xba\x92\x20\xb6\x03\xaf\x86\xca\xd0\xae\xba\x88\x82\xfb\xba\x9c\x65\xf0\x81\xa0\xd1\x0d\xa8\x41\x55\x42\x26\x92\xc5\xde\x55\xea\xc2\x81\x21\xa6\x1d\xd7\x2b\x8b\xbb\x46\xd7\xed\xc8\x8e\x11\x99\xa6\xe4\xf7\x77\xe9\x1f\x27\xe1\x8e\x0a\xbb\x23\x9e\x4c\x3f\xf7\x6d\xcf\x3d\xaf\xe6\x74\x0a\x33\x66\x33\xa5\xb6\xd7\xc5\x93\xd7\xfe\xe0\x8f\x26\x3f\x7f\xac\x34\x36\xfe\x3b\x4f\xa2\x9b\x52\x99\x5c\xce\x8d\xd3\x20\xcf\x27\xb6\xec\xec\xe2\xf9\x44\x23\x4c\x4f\x7a\xf7\x3d\xaf\x9e\xcc\x03\x8b\x77\x67\xfe\xcf\xa4\xfd\x23\xac\x4d\x10\x6e\x7a\xbe\x3b\x4b\x51\x45\x92\x01\x6a\xe6\x22\x72\xce\xdc\x8b\xb3\x9f\x9e\x9a\x9e\x23\xd7\xff\x07\x74\x70\x3a\x66\x3a\x38\x96\xe9\xff\xc2\xb1\x8f\x31\x6d\xc4\xfe\xdd\xbe\x0f\x5f\xe9\xa3\xef\xe7\x91\x24\xaf\xd8\x23\xd9\x4a\xff\xa6\xdb\x72\x5d\x86\x87\x32\x32\xb6\x1d\x77\x4a\xab\xf3\xb8\x7b\x54\x6e\x90\xb1\x3f\xb4\x67\x4c\x17\xa7\x36\x5f\x1e\x1b\x2b\x39\xfe\xdd\x39\x89\x8f\x2a\xec\x91\x9f\xe7\xda\xf7\x0c\xda\x8f\x5d\xf0\xab\x89\x3a\xf4\xe8\x9a\x31\x39\x96\xf2\xd0\xd6\x51\x5d\xbf\xb8\x63\x04\x1b\x67\x6b\x7f\xdf\xbb\xc7\xe8\x30\x37\xfe\x23\xff\x3e\x46\x0f\xe9\xbc\xb6\x8d\x61\x86\xf6\x58\xff\x78\x20\x57\x1f\xdf\x35\x59\x1e\x56\x6f\x1d\x5b\x87\xa7\xc6\xe8\x2a\xcf\x17\xbf\x3f\x89\xcd\xfd\xbb\x9c\x5e\x20\xf2\xe7\xc8\x97\xc6\xe6\x95\xe3\x97\xea\x2d\x93\xb1\xca\x91\xbb\xc6\xe8\x79\xd5\x9f\x1b\xcf\xe2\x97\x26\xe3\xc5\xa5\x4b\x32\x19\xd6\xcb\x77\x72\x0a\x75\x5a\xef\xee\x42\x1e\xd5\x32\xe4\xb4\x67\xe4\x40\x22\x7f\x15\x27\x73\x64\x55\x89\xd9\x0c\x3e\x88\x1a\x6d\xda\x8c\xd5\xf5\x00\xb3\x62\xac\x6a\xae\xa1\x09\xa6\x29\xc5\x32\xd2\xdd\x6a\xcd\x69\x32\xcd\xc8\x77\xfc\x26\xeb\x48\x32\x04\x81\x5f\x47\x26\x78\x6d\x8c\x54\xe8\x78\x11\x8e\xdb\xa6\xce\x63\x41\x45\x1d\x53\x83\x66\xd5\x0a\xa3\x5a\xc3\x69\xd5\xd2\x58\x75\x35\x1b\x67\x96\x3d\x66\xc8\xb3\x36\x9d\xe6\xc8\x1d\x3b\x3a\xe9\xe5\xd2\xa3\x8b\x73\x1b\xc9\x48\x1d\xd4\x48\x00\xb9\x99\x8d\x14\x04\x3a\x04\xcc\x58\x80\xe9\x5a\x7f\xb0\x72\x2c\x15\x1a\x8d\xd0\x0d\x5a\x31\x65\xd7\xa0\x63\xb6\xc9\x68\x6b\x35\xbf\x8e\x2c\x70\x93\xd1\xc6\x6e\x13\xe3\x26\x06\x8a\x84\x37\xaa\xa8\xe5\x04\x4d\xa7\x19\xea\xc6\x0a\x15\x78\x6e\x6f\x3f\x89\xbe\xba\xff\x64\x72\x28\xc5\x05\x7f\x37\x99\x5e\x8e\x7d\x7d\xb2\x5d\xb7\xa4\xe6\xe8\x25\xd5\x87\xa9\x75\xf8\xd5\x21\x3a\xea\xf3\xd9\xe2\x17\x73\xed\x4e\x4e\x66\xdd\x35\x24\xcb\x7a\xcf\xcf\x3e\xa6\x11\xab\x69\xd7\xf0\x98\x8e\xfe\x74\x6c\x0e\x4a\x4e\x77\x78\x93\xf1\xf6\xc3\x6e\x9f\xc6\x3c\x12\x37\x90\xe0\xba\x33\x08\x95\x8d\x63\x3b\x34\x5d\x59\xb5\x96\x66\xb2\xa4\x5d\xf4\x5c\x91\x7c\x66\xc2\x80\xe7\x90\x8d\x22\x03\x14\x42\x5e\x92\x46\x1b\xf5\x42\x79\xb9\x03\x0d\x26\xaa\x9b\x81\xe3\xa1\xc6\x71\xcc\x94\x6d\xd1\x17\x2d\xa8\xfa\xb2\x2f\x63\xd6\x91\x79\x1e\x6a\xb5\x20\xd9\x2e\xaf\x85\x91\x02\x0d\xdc\x6d\x22\x03\xe9\x32\x78\xd0\xc6\x8c\xda\xe9\x48\x88\x6b\x8b\xe9\x97\x71\xdb\xa5\xc2\x2e\x75\x27\xe3\x8e\xc7\xee\x1c\x92\xa3\x4e\x86\x23\xd8\xa5\x3c\xbe\x08\xfb\xfa\x84\x7d\xf8\x73\xa3\xf2\xe9\xc8\x3f\x8f\xad\x65\x6e\xbf\x1e\xbe\xed\x24\x7a\xef\xfa\x49\x72\xab\xc2\x06\xb7\x0e\x8d\xc7\xad\xcc\x3e\xd2\x9d\x2c\x47\x33\x3d\xfc\x17\x27\x91\x5b\xaf\xec\xe3\xd3\x37\x96\x02\xf6\x53\x95\xed\x8f\xfe\xe0\x99\x4d\x85\xda\x3c\x57\xd9\x7e\xf4\x2e\xea\xbd\x0a\x75\xc1\x8f\x2b\xa5\xdb\x0a\xd4\x33\xa9\xce\x30\x0d\x1c\x3c\x93\xca\x2c\xc6\x11\xdd\x98\xea\xe5\xd3\x46\xc7\x71\xef\xd1\x31\x5c\x97\xa3\xfb\x87\x9f\x3d\xb9\x7d\xe7\x19\xa3\x34\x76\x64\x5c\x0e\xa7\xef\x7d\x7a\x02\x3e\xef\xfb\x32\x1f\xbe\x72\xa8\x1f\xb7\x32\x1b\x2c\x8e\x3d\x5f\xcb\xf1\xdb\xab\x26\xcb\xe7\x40\x1f\xed\xff\xf1\xd7\x13\x5f\x0d\x99\x75\xd0\x9e\x64\x1b\x3c\x32\xae\x7b\xc8\xd3\x07\xb7\x8d\xda\x00\x84\xa7\x67\x0f\xbe\x84\x68\xd0\x6f\x0c\xaf\xc7\xe3\x6b\xfe\xdc\xfe\xee\xf8\xdb\xb1\xf6\x54\x3e\x7c\x65\xf2\xba\x06\xdf\x1b\xa3\xe7\xb4\xdd\xc8\xd9\x64\x01\xc9\x6f\xb8\x9e\x7a\x71\x2e\x3e\x7b\xe4\xfe\x79\x31\x7f\x71\x26\x7f\x8b\x66\x7d\x44\x37\x7d\xba\x1e\x2b\x48\xa5\xcb\x1a\x08\x10\xf9\x50\x07\xcd\xa0\x29\xa4\xc5\x22\xe2\x3d\x4e\x74\x2c\xcb\x30\x35\xdb\xee\x14\x14\x3c\xf8\x09\x51\xc5\x20\x0c\x31\x28\x71\x3b\xf2\x5b\xa8\xda\x6d\xd3\x11\x98\x0d\x1c\xa1\x90\xa6\x44\xd1\x36\x4d\xd7\xb6\x4d\xd7\xb2\x22\x24\xe7\x7e\x6a\x65\xeb\x98\xc3\x20\xc1\x93\xa3\x58\x2f\x6d\x7f\xe4\xe9\x93\xec\xad\x34\xaa\xab\xb3\xf6\xd3\x73\xed\x46\xdf\x0f\x31\x7b\x70\x3d\xd9\xa7\x03\x99\x5d\xf6\x9a\xd2\xa7\xd8\xdb\xb8\xed\x77\xd7\xd1\x45\x5b\x6e\xbc\xe8\x30\xb7\xf5\xae\x7b\xe8\x78\xcb\xe6\x0b\xae\x99\xb4\xf7\x8b\x9f\x1a\xc3\x65\x04\x4f\x3d\xf2\xe9\x51\x7a\x4f\x7d\x1e\x0f\xbf\x7e\xd2\xf3\x1c\x7b\x70\xf5\x49\x6c\x95\x57\x4c\xc6\x35\x3b\x5f\x3c\xd4\x7f\xdf\x3e\x3b\xca\x0c\xe1\xb2\xbe\x2d\x14\x9c\x9b\x7b\xde\xce\xad\xe1\x59\x19\xf6\x4d\xf5\x73\x9a\xe3\xf5\xf9\xfd\x9b\x07\x79\x29\x5f\xca\xa5\x7b\x4b\x03\xe0\x7b\x99\x2d\xa6\x12\x44\x3c\xc8\x41\xc9\x74\x30\x2f\x24\x98\x42\x07\x0d\x34\xa8\x01\xa7\xd2\x36\x41\xbf\x85\xc0\xb1\x45\x51\x54\x35\x19\xa2\x34\x64\xda\xf7\x11\x0f\x2d\x54\x45\x3c\x46\x02\x6b\x4b\x82\x00\x2d\x0f\xfb\x48\x81\x56\xdd\x43\x54\x0b\xbb\xdd\x9a\x61\x94\x3d\x41\xea\x80\x8d\x5c\xf2\xc1\x17\x38\xb0\x3a\xc9\x7f\xd9\x7c\xac\x1c\xbe\x7a\x62\xb2\xdd\xfd\x48\x9c\x6b\xbf\xad\x3f\xff\xad\x47\xd5\x45\xea\xe5\xb3\x4a\xde\xd6\x75\x7b\x6b\xf3\xf0\xa5\xb9\xb5\x24\x6b\x76\xf4\x47\x23\xbc\x9b\xf9\x4d\xb2\x77\x1c\x19\xdd\xdb\x47\x84\x31\x5e\x1f\xd0\x1d\xbb\x73\xec\x3c\x2b\xd5\x45\x07\x6f\xc8\xd9\xfc\xd5\x9c\x8c\xff\xe0\x49\xf6\x70\x86\xec\x61\x89\xb4\xdf\x41\x62\x9b\x4e\xcd\xdd\x7d\x22\xf1\xc4\x73\x03\x4b\x65\x03\xb9\xcd\x30\x92\xa1\x64\x66\x61\x7e\x2a\xd9\x3d\x34\xc8\x71\x4a\xa2\x43\xe9\xa5\x42\x7d\x59\xf9\xee\xc0\xd1\xf4\xe0\x67\x3f\x6b\x5f\xaf\x5e\x23\x7c\x52\xd5\xe2\x97\x2f\x3e\xf4\x10\x7a\xd0\x87\xb7\xa2\x12\x1c\x47\x0f\xa1\xb5\xf1\xcb\x7b\xdf\xc1\xff\x63\xdf\xea\xff\x5d\xde\x68\xfd\x48\x77\xe7\x1d\xf0\xb5\xb7\xbd\xed\xb4\x3b\x4f\x7b\x0d\x3a\x0b\x9e\x89\xfe\x74\x07\xf3\x9e\x27\x9e\x80\x4b\xd0\x39\xf0\x7d\x74\x4e\x3c\x83\x66\xe0\x27\x68\xa6\xb7\xde\x62\x4e\xee\x9e\x9d\x9b\xf7\x95\x03\x1e\x0b\x7e\xfe\xad\x5e\xbb\x98\xea\xce\x6c\xdf\x7e\x92\xdb\x37\x33\xe7\x27\xdc\x3c\x8a\xc9\x12\xd9\xcc\x65\x9a\x7e\xf1\x93\x23\xfe\x88\x94\xbf\x6f\x1e\xb3\x9f\x53\x7e\x3a\x90\xa3\x01\x9c\xc3\x6b\xce\xd0\xf3\x3d\xbd\x35\x7b\xe8\x1e\xe2\x21\xbd\x77\x92\x5c\x3a\x48\xe7\xfa\xca\xe9\xae\xc5\x4f\x8c\x61\x8c\x54\x27\xff\x64\xb2\x4d\xbf\xf8\xf1\xc9\xb2\xe8\xf0\xe5\x93\x6c\xe8\x0a\xbb\x33\xc8\xf5\x93\x7f\xef\xc7\x4e\x62\x73\x5f\x9c\xd1\x99\x45\xe6\xec\x11\x59\xf1\x3c\xea\x6c\x52\x7f\x4f\x9e\x24\x2d\x86\xce\xa5\xc8\xf1\xf9\x34\x43\x92\xd9\xae\x9a\x49\x3e\xa6\x99\xe9\x55\xa4\xdc\x4c\xdd\xe7\x05\xe4\xa3\xd0\x00\x09\x74\xf0\xc1\xd0\x68\xcd\x62\xd4\x6e\x8d\x89\xb0\xe6\xaa\xb2\xa0\xa8\x92\x08\x1e\xc6\x5d\x91\x51\xae\xfe\xfe\xf2\x8f\xbf\x7d\xd1\x37\x7f\xb2\xf0\x4b\x74\xd3\x02\x52\x67\x61\x33\xba\xf2\x85\x50\x65\xbd\x44\x78\xb4\x3d\x3f\x40\x12\xd4\x6b\x2e\xe2\x5b\x9e\xd1\x75\x2c\xa3\xec\x73\x82\xc2\x08\xb1\x48\xc7\x5d\xf5\x23\x1f\x41\x1f\xfe\x08\xda\x06\x8f\xa3\x6d\xdd\xbf\x47\x1f\x9e\x6c\x73\x7d\x34\x37\x7f\x33\x27\x8b\xdf\x97\x5b\x2f\x2b\xe7\xc7\xfe\xc8\x24\xd9\x5d\x61\x1f\x3a\x63\x12\x7f\x73\xec\xce\x0f\x8c\x62\x9e\xbb\x17\xc7\xe4\x04\x79\xfe\xc1\xbf\x1d\xc3\x48\xb9\x7d\x7d\xb4\xe7\x93\xb1\x57\xd4\xd2\xba\xb4\x7f\x91\xe2\x2e\xd9\xf5\x8b\x95\x37\x52\xd4\x2b\xfe\xff\x4a\xef\x77\xa9\xac\xf0\x45\xaa\xc2\xee\x79\x53\x73\x64\xcf\xd3\x39\xec\xbb\x75\xcc\x2e\x21\x63\x7d\xe8\x93\x39\x59\x94\x9e\xb1\x75\xc6\xc6\xea\xe4\xd6\xce\x1e\xb3\x25\xd2\xf6\x0f\xe7\xda\xd3\x73\x8c\xef\x93\x7e\xf6\x4e\xb6\x93\x17\x6f\x9a\x44\xfb\x15\xb6\x7a\xe1\x44\x0c\x36\x7b\x98\x78\x07\x0e\xff\xe7\x24\x9f\xc7\xe2\x75\xa3\xfb\xb3\xf8\xa1\x09\x3e\x89\xbe\xfc\x38\x7a\xc5\x64\x1d\xbd\xf8\xe2\xa1\x39\xbb\xbd\xfe\xef\xbb\x29\xd7\x4f\x35\xe7\x7f\xbc\x31\x6b\x37\x56\xcc\x52\xc0\x1a\x95\xd9\x25\x85\xd0\xd1\x97\x73\xfd\xc8\xe4\x1c\xe6\x86\xb1\x7d\x4e\x7d\xae\x04\x47\x3e\xfa\x9e\x1c\x3e\x19\xd8\x93\xe9\xba\x7e\x70\x48\x17\xf5\xc7\xf4\xa0\x37\x3a\xe7\x23\xff\xf4\xe7\xec\xd8\xa5\x8b\x27\xe2\x89\xd9\xc3\xfb\x93\xde\xbc\xbf\x1d\x5e\xd7\xc5\x0f\x8c\xf5\x95\xc3\x6b\x0f\x3e\x39\x19\x27\x2f\x5a\x43\x36\xd9\x40\x66\x5e\x7f\x12\x9f\xcb\xe6\xc9\xfd\x2c\x6d\x99\x6c\x7b\x2d\xbe\x7f\xb2\x1d\xbb\xf8\xbe\x89\x72\x2b\xc5\x38\x2f\xfd\xdf\xe5\xd6\xd4\x73\xd8\x73\xd0\x5c\x0f\xf1\xf4\x23\x50\xe7\xa7\x66\xfe\x6f\x82\x2b\xae\xdb\x96\x22\x98\x2a\xd8\x18\x67\x10\xc6\xa6\xdb\x18\xff\x2f\x12\x4b\xee\x7a\x86\xee\x09\xa2\x0f\x6e\x41\x84\xc8\x03\xc3\x43\x6e\x2c\x66\xfa\x2e\xe7\x0b\xda\x75\x7c\x88\x06\xec\xca\xec\xfe\xf7\x9e\xc4\xa7\x94\xae\xc7\x7b\xc7\x6c\x06\x62\x8b\x1e\xb6\x27\x3f\x5f\x55\xc7\x70\x47\xda\xcf\x7b\x46\x9f\x5f\x7c\xc1\x9f\xa3\xb1\x07\x7f\x33\x89\xd7\x2b\xec\xe1\xd9\x31\x1f\x47\xfa\xfc\x2f\x47\xdf\xfb\x18\x8c\xf5\x9f\x93\x55\x8b\xcf\x1f\xdb\xff\xd4\x97\xf8\xd8\x28\x26\x3c\xb4\x27\xe1\xab\x54\xf2\x25\xdc\x35\x64\xeb\xa5\xe7\x22\x3d\x99\x6e\xf6\xec\xf2\x64\x75\x38\xf6\xf0\x7f\x8c\xd1\x24\xb1\xcf\x0e\xcc\x8c\xf2\x6e\xd2\x7b\x85\xf0\x6e\x65\xeb\x23\xd3\xd4\x1a\x85\xda\xf2\xac\x6c\x8f\x72\x6b\x78\xdf\xd5\xd9\xdf\x6d\x5b\x51\x4b\x7f\xc9\x7e\x84\xdb\xbe\x34\x4f\x17\x37\x97\xb6\xfc\x2b\x77\xcd\xc3\x1f\x47\x47\xa9\xb3\x17\x82\x2d\x5b\xb9\xad\xc7\x76\x5f\x48\x6d\x7e\x93\x32\xfa\xee\xd4\x07\xb5\x7b\x48\x8e\x79\xfd\xf6\xfb\x26\xef\xe7\xbd\xad\x31\x9b\x9b\xcc\x61\xd7\x67\x27\xdb\x2c\x3b\xfe\x66\xf2\xf3\xf7\x5d\x35\xb6\xcf\x64\xbd\xf7\x3d\x63\xb4\x9f\xfb\xde\x35\xa2\x33\x36\x97\xae\x19\xc8\xe7\x3d\x97\x3e\xfd\xa7\xe1\xfd\xd9\x73\xe9\xd0\x99\x92\x31\xf0\x49\x70\x54\x65\xf6\xae\x95\xe4\xb7\x0f\x7c\x28\x87\x81\x06\xd8\xe8\xfc\x21\xfb\xa7\x4f\x1b\x87\xbd\x51\x3b\xea\xf0\x47\x27\x60\xf3\x9e\x9e\x99\xbd\xeb\x75\xad\xc4\x8a\x9b\x9e\x84\xf1\xee\xf9\x70\x66\x33\x25\x7f\x73\x37\xfb\x29\x72\x5e\xb0\x86\x7a\x31\xf5\x52\xea\x15\xb9\x5c\x3c\x09\x82\xce\xc5\xe8\xf4\x12\xf7\xae\x99\x9e\x2f\xcd\x08\xbd\x1b\x4f\x59\x9e\x8a\x8d\x9b\x66\x4a\x6c\x71\x6a\x66\x6a\x7e\x75\x62\x78\xb3\x77\xe3\xb8\x85\x31\xcd\xc7\x2d\xa8\xf8\x8a\x46\x4e\x10\x44\x5a\xf8\x02\xbf\x0e\x5d\x72\xcb\xe5\x5f\x41\x07\x7e\xf4\xa2\x43\xb0\xe1\xd7\xbb\xff\x6d\xcb\x57\xbe\x70\xd9\xa6\x8d\x2f\x7a\xdf\x7f\x6e\xda\x7c\xd9\x87\x36\xfd\x9c\x5f\x4b\xff\xf3\x8e\x1d\x5f\xf9\xc2\x3b\x3f\x44\x17\x63\xcd\xb6\xe9\x2a\xe8\x88\x2f\x32\x52\xad\x76\xc2\x2a\x18\xd8\xf1\x91\x87\xea\xc2\x25\xea\x9d\x3c\xfc\xf0\x2d\xd6\xe2\xe2\x2e\xcb\xbd\xc6\xde\xa6\x4b\x92\xf9\x33\xeb\x7a\xd5\xfb\x2b\x49\xe4\xe0\x11\xfa\x7b\xff\xf2\xc9\x4f\x3a\xf6\xb0\x6e\xdc\xf9\xd7\x63\xe7\x7c\x39\x3a\x5e\x7a\xd9\x18\x7e\x20\x34\xb2\x28\x9e\x04\x0f\xcc\x8d\xd1\x26\xd1\xef\x8b\x77\x66\x6b\xab\x67\x39\x8f\x9f\x95\x65\x90\xc9\xaa\x6a\x65\xa7\x73\x54\x71\x6e\x3d\x43\x93\x24\x8a\x59\x60\xfd\x14\xf1\x74\xaf\x7e\x4e\x69\x7a\x61\x55\x7f\x07\x16\xa6\x99\x30\x10\x04\x54\x43\x35\x1d\x64\x90\xc1\x07\x4d\xa7\xcd\x50\x0e\x9c\x90\xd6\x44\xd9\xd1\x15\x5a\xf6\xd3\xbb\x02\xe5\x42\x39\xc4\x5d\x1b\x63\xc6\xed\xda\xac\x2b\x0b\x7c\xc7\xc2\x2e\xe2\xa0\x13\x78\xed\x2e\xb9\x58\x63\x20\x05\x61\x54\x53\x15\xdd\x70\x62\x17\xb5\x4c\x47\xe1\x79\x0b\xbc\xb8\xa3\xaa\x74\x19\x42\x3f\x9b\xcf\x47\xfb\xeb\x72\xcd\xe1\xb9\x15\x7b\x25\x7e\xf9\x13\x4a\x97\xbb\xe4\x0b\xb7\xac\x7c\x98\xaa\xbc\xfc\x0f\x5b\xaa\x43\x36\xc8\xdf\x8c\xe0\xa0\x44\x06\x3a\x95\xd9\x03\x4f\x4e\x90\xa5\x7d\x3a\xbf\xcf\x18\xb2\x3f\xec\xca\xec\x01\x77\x88\x9e\xcd\x9e\x5f\x2b\x91\x58\xdc\xec\xa3\xe7\x12\x59\x77\x5e\xc6\x4f\xaf\x2d\x05\xec\xc7\x2a\xb3\x8f\x9e\x45\x2d\x73\xd7\x78\xcf\x46\x67\xaf\xbc\xfb\xe5\x9f\x54\x12\x4c\x79\xee\x64\x5b\xf5\xc1\x85\x51\xdb\x29\xf8\xee\xc0\x76\xea\xfb\xb8\x32\x7b\xe4\xc0\x5b\xc6\xc6\x9e\xb3\x57\xef\xff\xd8\xa8\xfe\x59\x9c\x1d\xe3\xc5\x9c\x9c\x39\x70\xc3\x28\xee\x4e\xdb\xab\x6f\x1e\x1d\xd3\xe2\xfa\xa1\xf7\x9a\xbd\xdc\x47\x64\x0d\xd8\xc3\xbf\x98\x2c\x0f\xf7\x44\x63\xb4\x9b\xea\xb7\x99\xd1\xfe\x33\xda\x3d\xbb\xdf\xbf\x5c\x7a\x80\xe8\xa5\xdb\x29\x8a\xdb\xfa\xd8\x67\x5e\x4f\x5d\x74\xae\x32\x82\x1d\x97\xae\x19\xf3\x4f\xe6\xe4\xd2\xe2\xf4\x28\xd6\x3c\x50\x1d\x5b\x3b\x35\xe7\x03\x78\xe9\xe4\xb1\xde\x73\xd3\x18\x66\x25\xd8\x71\xe9\x21\x22\xc1\xff\x7a\x92\x3e\xde\xf5\xc7\x93\xe0\xab\x0b\xc6\xf0\xd5\x93\x63\xfb\x43\xd6\xf5\xc0\x0f\xff\x9c\x3e\x5e\xba\xe8\x24\xb8\x4e\x9e\x2c\x13\x96\x2e\x1c\xb3\x11\xd2\x76\xe3\x24\x98\x75\xd3\x98\x9f\x84\xd0\xc5\xd2\x1b\xc7\xe8\x28\xb5\x65\xbe\x3f\xda\x9e\xfa\xff\x16\x5f\x44\xd6\xa8\x36\xc9\xa6\x5e\x32\xc7\xfa\x4a\x69\x43\xc8\xed\x43\x40\x74\x2e\x91\x5f\x0f\x9e\x39\xa6\x7f\x52\x9d\xfb\x8b\x49\xb6\x60\x85\xdd\x3f\x16\x4f\xb1\xb8\x6e\x64\x4d\xe5\xbc\x7d\xf5\xe0\xd9\xa3\xfd\xec\xff\xc3\xc8\xde\x5c\x52\xba\x99\xb5\xb9\xed\xf7\x7e\xea\xc9\x95\x8b\x9f\xb7\xe5\x5f\x2b\xa3\xf6\x63\x62\x23\x7c\x63\xe4\x6f\xc4\xec\xae\xf3\xf7\xa8\xd1\x38\x1f\xb2\x9f\xbb\x88\x6c\x49\x78\x7d\xd2\x3e\x1c\x7d\xf5\xd0\x5a\xb8\x7d\x5c\x37\x33\xba\xff\xfb\x13\x3b\x77\xb6\x4a\x22\x43\x96\xd2\x98\x8d\x77\xaf\xc8\xa5\x8f\xb1\x26\x37\x7b\xcc\x5f\xdd\xae\xb0\xf7\xbc\xe7\x37\xed\x61\x3d\xfd\xc0\xc7\xc6\x68\x8f\xd8\x27\xfb\xbe\x32\xd6\x9e\x93\x8f\x7b\xbf\x33\x46\x93\x64\xac\x7b\xab\x93\xf5\xce\x03\xeb\x26\xdb\x7c\x0f\xfc\xc7\x68\xfb\x03\xcf\x98\x30\x9e\x01\xed\x6d\xcc\xb5\x5b\x39\x7a\x79\xde\x50\x7b\x1f\x37\x1e\xfb\x2e\x35\xea\x6b\x48\x7d\x2d\x7f\x18\x5d\xeb\xc7\x3f\x77\x12\x6c\x9d\xca\x91\xb3\x26\xcf\xf7\x81\xfc\x1d\x8c\x1c\x0f\xee\x93\x86\x64\x6a\x7f\xdd\x76\xce\x8f\xe2\xa4\xac\x9f\x1b\x27\xcb\xe6\xbd\xbf\xce\xb5\xbf\xbd\x8f\x9f\x2f\xd9\x7f\xc6\x8a\x48\xad\x79\xe5\x67\xb7\xfc\xeb\x38\xef\xec\x1d\xf7\x67\xa4\xb1\x00\x5f\x9d\xc4\x23\x1c\x7b\x68\xcc\xce\xc8\xec\x83\xc2\xa4\xbd\xe4\xd8\x7d\xbf\xcd\xc9\xff\xec\xec\x8f\x4f\xb0\xc5\xb7\x86\xf6\xc0\xed\x9f\xfd\x3d\x6b\xe2\x7b\x67\x1f\x7f\x16\xd9\xd1\x87\x26\xf1\xf3\x03\xd7\x0c\xe9\x36\xb7\xb7\x1e\x0f\x3c\x30\xda\xd7\xe2\x99\x63\xbe\x86\x7c\x9c\x40\x38\xb4\xae\xfd\x73\xae\x23\xff\x30\xaa\xdf\x17\x9f\x3b\xb6\xff\x39\x5b\x69\xdf\x0c\x95\xf7\x41\x24\xcf\x37\x7b\x5c\x36\x2c\xb3\xb3\xf1\xdf\x3d\x79\xed\x16\xcf\x18\x6d\xdf\x69\x8f\xf1\xbe\x3b\xc0\xee\x7b\x09\x8e\x23\xb1\xea\xaf\x22\xe7\x07\xcf\xa1\x5e\x40\x29\x24\xd3\x56\xaf\x1c\xeb\x9a\x62\x69\x3d\x33\x93\x96\x5f\x59\x55\x9a\x5b\x9f\xc6\x46\xa6\x3f\x9f\x4d\xce\x99\x56\x91\xbb\x70\x6b\xb3\xd6\x5e\x6d\xc4\x7c\x78\x64\x15\x79\xb2\x88\x15\x5a\x07\xdf\x43\x82\x05\x8d\x1a\x6e\x00\x56\x51\xb9\x0a\x8d\x7f\xc7\x0a\x12\x9a\x86\x20\x22\x3f\x8c\x15\x85\xd6\xeb\xe0\x70\x9c\xc8\x3b\xbc\x6d\xd8\x2a\xaa\xb6\x75\x19\x29\xad\x6e\x4d\xa1\xdb\x21\x54\x65\x31\xf9\x4d\xbc\xd8\x47\xd5\xc5\xc0\xb0\x24\xdf\xab\x57\xdd\x16\xe2\xa0\x56\xf3\xbc\x28\xfe\xaa\x6a\x5b\x4d\x55\x14\x1d\x68\x98\x58\x0e\x39\x49\xd2\x64\x10\x44\xd1\xf6\x9a\xa6\xe4\x82\xeb\x60\x0d\x71\x02\x69\x2e\xfe\x47\x1e\x5b\x4f\x94\x8f\x3b\xfe\x6a\xb2\x7d\xbb\xef\x77\x93\x79\xff\x81\xb7\x8e\xea\xe5\x7d\xdf\x1d\x9c\x4d\xee\xaf\x4c\xd2\x47\xfb\x9e\x9e\x8c\xcb\x1f\x78\x6e\xbf\x5d\xc8\xfb\x44\xf6\xfd\x61\x54\x6e\x56\x6b\x63\xf4\x95\xe3\xc1\xbd\x3f\x18\x95\x23\x47\xdf\x41\xec\x81\x7d\x93\xe9\xe8\x01\x79\xb2\xdc\x79\x2c\x18\xc5\x97\x29\x4e\x39\x7a\x80\xfc\xd5\x77\x87\x69\x2c\xc5\x9e\xfb\xff\x75\x6c\x9d\x08\xaf\xed\xff\xa7\x89\xfa\x9c\xdd\xdb\x1e\xe3\xa9\x74\x0e\x24\xb6\x87\x7a\x46\x3f\xbf\xd6\x5a\xea\xac\x7e\xb5\xb5\x05\x4a\xa1\x5e\xd9\xab\xed\x90\x96\x08\x9f\x63\x8b\xc3\x36\xda\xf4\x20\xcf\xea\xc2\xcc\xf4\xea\xf9\x05\x34\xbf\x30\x53\x9c\x5f\xc8\xc7\x81\x6d\x9a\x9f\x9a\x29\x78\x3e\x2f\xd0\x82\x5d\x6d\xb4\x55\x68\x47\x75\x08\xe5\x4e\xd5\xd4\x15\xd5\x68\x9a\xa6\x83\x75\xd0\x68\xfb\xfe\xf8\xe9\x1d\x3b\xbe\xfd\x6d\x74\xf5\x37\xe3\xa7\xc9\x97\x6f\x76\x4f\xf1\x64\x0d\x2b\xaa\x86\xa8\x0e\xc6\xac\x23\x6a\xaa\xd7\xf1\x6d\x15\x6b\xd8\xd3\x3d\xd5\x36\x5d\x4d\xb1\x22\x15\x5b\x38\x88\x4f\x8f\x9f\x75\xe9\xa5\xf4\x1f\xe0\x3f\x6e\xbd\xf5\x56\x78\xdf\x9d\x77\xde\x59\xfc\x37\x31\x0a\x4f\xe0\x82\x60\x1b\x18\xf9\xc1\x32\x37\x90\x59\x4e\x65\x76\xe9\xfc\x01\xfd\xec\xf8\xf2\x24\x39\xb4\xf7\xeb\x63\xfb\x45\x64\xe3\x3d\xf2\x10\x9d\xb8\xbd\xb8\x88\xbd\xde\x64\xec\xf8\xc0\x7b\xc6\xf6\x2a\xe5\x81\x63\x43\xf2\xa3\x2f\x87\xf6\x7e\x76\x54\xdf\x10\xbf\x09\xeb\x7f\x3a\xd7\x4e\x7c\x8b\xfe\xa3\x13\x30\x68\x82\x4d\xba\x03\xba\xa5\xca\x3d\x7d\xdc\xcf\x7c\x93\xde\xf1\xdf\x92\xb7\xcb\x07\x95\xb9\x26\xca\xa8\x62\xae\x18\x1d\x33\xd8\x58\xf6\x51\xbf\x67\x93\xf7\x3e\xe0\x1b\x7f\x46\x2c\x15\xde\xef\x9a\xb6\x65\x2f\xb7\x4d\xc5\x55\x0c\xad\x2f\x6f\x98\x60\xd9\xb7\xed\x82\x01\x4d\x1f\x54\x0c\x2a\x2e\x34\xc6\x04\x10\xaf\xfa\x9a\x61\x58\x96\x23\x3b\x26\xaa\x0f\x0b\x98\x09\xb8\x39\x6f\x9b\x2d\x25\xd8\xef\xe1\x0d\xdb\x98\x8b\x5e\x75\xd1\xf5\x95\x49\xfe\xf5\xd4\x76\xfa\x5a\x0e\x3b\xe7\x30\xf2\xde\x8f\x4e\xd6\xcd\x7b\xc6\xe3\x28\x52\xdf\xda\xf4\xd0\xfe\x0d\x7c\x24\xcf\x19\xe3\xf3\x54\xee\xec\x9c\xac\x37\x97\x76\xe5\xf4\x5d\xea\xa3\x5f\x3d\x41\x1e\xf5\xfd\xdb\x4b\x27\x26\xe1\xbe\x0a\xeb\xdf\x32\x59\x7e\xed\x5a\x1e\x1b\x27\x69\x3f\xf2\x85\xb1\xf5\x21\xf3\xda\xfb\x3f\xa3\xcf\x2f\x3e\x67\xb2\xfe\xf5\x7f\x34\xa6\xdf\xab\x03\x1f\xdc\xde\x77\x4c\xc2\xcc\x15\x76\x57\x1a\x33\xcf\xf6\x6b\x5b\x9c\x42\x22\x34\x24\x6a\x73\x96\xa5\xb2\xef\xe6\x40\xbd\x5c\x56\x33\xa9\x3f\xa9\x1f\xa5\xb1\x61\xed\xe0\xfb\x75\x28\xfb\x45\x29\xfd\x4d\xee\x31\xa6\x53\x95\x91\x8b\xb0\x0e\x06\x98\x80\x41\xd0\x48\xe1\x65\xd5\x67\x94\x6e\xdd\xef\xd6\x50\xe8\x09\x22\x76\x74\xc7\x73\x5d\xbd\xcd\xd4\x3d\xa9\xea\xe9\x1e\x36\x0d\xbd\x6a\x7b\x82\xe8\x3b\x86\xe3\x96\x75\x5b\x6f\x74\x5b\x1e\x2f\x78\xb6\x61\x3b\x5a\xa0\x47\xac\x2d\x8b\x1d\xcb\x73\x11\x0f\x1d\xdf\x8d\x96\x31\x53\xeb\xaa\x1e\xd4\x91\x52\x28\x0b\xb2\xac\x19\x96\xa5\x79\xaa\xe9\x35\x04\x53\x35\x2d\x53\x73\x55\x13\x07\x82\xaa\xe8\x86\x6d\xe9\x65\x4b\x33\x71\x98\x3c\x66\xda\x96\x6e\x99\x26\x1e\x96\x25\x7b\x67\xfe\x8c\x2e\xea\xd9\xb4\x47\x73\xbc\x30\xb8\xeb\xd8\x19\x5d\xef\xc5\xf1\xf8\xca\x5c\x3c\xde\xde\x17\x4d\xc6\xcd\xfb\xf2\x36\xe7\x1d\xec\xa7\x7b\xf1\x02\xf7\xbd\xfd\xcb\xcf\xbc\xf8\xce\x11\x3f\xec\xdc\x8e\xfd\xd4\xa7\x28\xaa\x32\x7b\x37\x4b\x70\xec\x1d\xc3\xf6\x33\x37\xb7\xf7\x2e\xf4\xab\x95\xdf\x54\x66\x1f\x38\x31\x76\x77\x29\x87\xc9\xf6\x5d\x39\x26\x53\xd3\xf6\x77\xf6\x31\x56\x1a\xeb\x99\x48\xb4\xcd\x94\xd1\xab\x0d\x9a\xfc\x63\xe6\xd7\x90\x72\x18\xab\x36\xae\x5a\x4b\x33\xe4\xdc\x82\xe4\x60\x48\xfd\x8c\x34\x43\x02\x2c\x07\xf9\x4b\xa6\x66\xa6\x4a\x73\x15\x94\xfe\x71\xd6\x50\x9c\xdb\xb0\x30\x3d\xb7\x71\xd3\xcc\xc2\xfc\xa6\xac\x46\xc0\x3c\xad\x22\xc5\x27\xc9\xa8\x9c\xb2\x57\x46\x3a\x54\xcb\xa2\x2e\x78\x52\x20\x88\x5c\xd9\xe7\x0c\x55\xd7\x54\xcd\xb4\x75\x45\xe8\xea\xc8\x81\x7a\xc1\x57\x24\x4f\x94\x97\x79\x5f\x52\xb1\xa5\x85\xf4\xdf\xdf\x86\x4e\x81\x3f\xa2\x33\x56\x7b\x8b\xb7\xc1\xb6\xb3\xd0\xb7\x61\xf1\xac\x77\xaa\xc7\xe2\x97\x7d\xf4\x1c\xb4\x0f\xce\xba\x78\x5b\x93\x2d\x5b\x96\x6d\x23\xb3\x1e\xd8\x0d\xe0\x3a\x48\x10\x40\x07\x1c\xd9\x96\xd0\x76\x5b\xb6\x65\x04\x01\x92\x69\xdb\xb6\x5b\x96\xa3\xb8\x96\x2c\xd5\xeb\x27\x9c\x02\xd7\xf0\x91\x07\x53\x47\x3f\x7d\xfb\x8b\xff\x72\x9a\x87\x9f\xa3\xe2\xc5\x5f\x7a\xe9\xfe\x4f\xbf\xe7\xa3\xb7\xef\x3e\xfd\x2f\x6f\xff\xcb\xab\x26\xe2\xb0\xbd\xaf\xcc\xad\xef\xb5\x7d\x7a\xda\xba\xef\x92\x9d\x85\x57\x9c\xba\xc5\xcf\x61\x34\xa7\x87\x25\xee\x1e\xbf\x83\x4b\x68\xf0\xd1\xc7\x88\x05\xc2\x4c\xfa\xdd\x43\xe4\x34\xef\xc0\x63\x7d\x79\x46\x30\xc8\xfd\x30\x86\x97\x72\x67\xb9\xbb\x1f\x1f\xa5\xdb\x54\xcf\xee\x3a\x31\x64\x8b\xe3\xbe\x4f\xfe\xe9\xc9\xf8\x6a\xb1\x32\x64\x97\xba\x95\xd9\xc5\xa9\x31\xbd\x99\xc3\x9a\x78\x71\xd4\xae\x4e\xcf\x3f\x8e\xbd\x7a\x74\x9c\x0f\xfd\x61\xc0\x7b\xc9\xd8\xc6\x31\xdf\xee\x63\x27\xb1\x29\x9e\x35\xa4\x3b\xfa\xb6\xef\xd1\x61\x9f\x98\xd7\x9f\xdb\xd2\x28\x7f\x1c\x7d\x33\x35\x7a\xef\x32\x27\xc3\x17\x9f\x39\x24\x7b\xfb\x3a\xe2\x9e\x2b\xc7\x6c\x74\xf2\xfc\xbd\xff\xbf\x9c\xae\xc9\x9f\x1f\xf6\xce\x2d\xe6\x56\x94\xd2\x2d\xec\x0d\xdc\xec\xb1\xbd\x4f\x2f\x57\xd8\xdd\x4b\x4f\xb5\x27\xf1\xeb\xe2\x29\x63\xb2\x9d\x60\x59\xe2\xe5\x60\xf7\xfb\x93\xec\xf4\x1d\x47\xc6\xec\xab\xd6\x98\x5f\x9d\xe8\xd7\x07\x7f\x4e\xd6\xbb\xd2\x93\x5e\xfd\xf1\xf6\x71\xee\xbd\xe4\x5c\x8b\xc4\xfd\xbc\xaa\xf4\x17\xac\x4d\xad\xa1\xe6\xb2\xb8\x9f\x4b\xa8\x37\xf4\xaa\xa4\x95\xf2\x79\x32\x13\x69\x50\x1c\x4a\x1d\x9b\x30\xfe\xc2\xf4\x59\xf4\x74\x1a\x9f\x31\x4f\x12\x95\x10\xa4\xb4\x30\xb3\x30\x9f\x88\x97\x0d\x03\x0c\xc4\x5c\xba\xfb\xf4\xe7\x33\xb7\xbe\xe1\xe5\xdf\x7f\xcf\x7d\xd3\xdf\x7f\xc3\x0d\xd3\x2f\xee\xfe\xf8\x6d\xd7\xdd\x70\x94\xfe\x93\xa1\xcb\xaa\x60\xca\x22\x78\x1e\x4d\x91\xcc\x89\xc7\x3d\x0f\xed\xf6\x3a\x1d\x0f\xf4\xe4\x33\x0a\xba\x85\x7e\x14\x51\xe1\xa9\x75\x97\x5d\xd6\xfd\xdc\x13\x3b\x36\xef\xde\xfc\xf1\x27\xe8\xf7\x7f\xfe\x8a\x8f\xef\xbf\x25\xf6\x34\xbd\xec\x96\x55\x65\x85\x62\xca\x91\x61\x98\x9a\x86\xce\x88\xcd\xe2\x09\xec\x65\xff\xed\xce\xc7\x13\x4d\xa0\xb3\xe2\xe8\xda\x1e\xfd\xce\x18\xed\x13\x5a\x3e\xb4\x34\xc0\xc3\x87\x06\x7a\x24\x17\x0f\xb1\x38\xee\x5b\x48\x7d\x8e\x5f\xcc\x70\xa6\x41\xee\x81\xe1\x7e\x15\x86\xe7\x52\xeb\xa8\x73\xd3\xd3\xe4\x81\xee\x2e\x91\x3c\xe5\x69\xd6\x9c\x0d\xbd\x7c\x46\xf9\xe0\xca\xa1\x1f\x0a\x65\x8b\x43\x0e\xaa\xa7\xa1\xf8\x18\x44\x9d\xe6\x4c\xa6\xd3\x2d\x47\xb4\x13\x3b\x18\xa9\x50\xa3\x6d\xda\x8d\x6d\x8c\x74\x08\x62\xdd\x17\xa4\xba\x6f\xe1\x9a\x1d\x98\x88\x63\x5a\x58\x90\xea\x81\xe5\x57\x1d\xdf\x44\x1c\x8b\x75\x2e\x72\x7c\x0f\xf1\xd0\xc2\x5e\x10\x62\x1b\x64\xcf\xc7\xc9\x27\xf0\x45\x4d\x35\x6d\xdb\x31\xb0\x69\xd5\x51\x39\xff\xd3\x08\xbf\x2c\xa2\x11\x1f\x82\x3c\xc4\x77\x54\xae\xfd\xf6\xbe\xcc\x9a\xf5\x3e\xf6\xa7\x76\x85\x5d\x7a\xe8\x37\x7f\xca\xdb\xa3\x87\x1e\x26\x6b\x9e\xde\x0a\xdb\x3b\xc9\xc7\x74\xf4\x45\x43\xfb\xd4\xe7\xcb\x3d\x2b\xe4\x45\xc5\x1e\xd6\xa3\x9e\x45\x3d\x87\xe2\x29\x99\x9c\xb6\xad\x59\x3b\x9d\x6a\xab\x85\xe9\xb9\x3c\xc4\x67\xd2\x73\xa1\xf9\x5c\x0a\x9e\xe1\x54\xe9\xb9\xab\x3b\x9a\xc0\x23\x5d\xc2\x22\xe2\x96\x15\x54\x16\x18\x0b\xc7\x0a\xc6\x74\x3d\x56\x7e\x86\x44\x41\xc1\x8a\xd0\x52\x44\x2c\x4a\x88\x03\x1e\x79\x60\xd1\xe5\x65\x07\x45\x24\xb1\x8e\x00\xbf\xef\x53\x35\xed\x2b\x8a\x2d\x6a\xae\xab\x41\x1d\x78\x5d\x47\x2d\xe8\xb8\x85\xa6\x69\x0a\xb6\xed\xd8\xb2\xa9\xbb\xae\xeb\x91\xff\x91\x3d\x76\x07\x73\x40\xb3\xff\x36\xa0\xd9\xcc\x9e\xf9\x32\x6b\x53\x02\xb5\x9e\x58\xaa\x17\x50\x17\x67\xdc\x9d\xe5\x14\x62\x4b\xd3\xd9\xb4\x89\x17\x65\x66\x61\x9e\x24\x5b\xda\x34\x33\x5d\x9a\x5e\x28\xb2\xa5\x2c\xc7\x72\xf6\x4c\xba\x2a\xc5\x5c\x12\x2a\xb4\x96\xee\xb3\xf7\x07\x98\x8f\x1f\x3d\x1a\x5f\x3f\x35\xcb\x9c\x76\x6b\x7c\xef\x47\x2f\x7b\xea\xbd\x68\xfd\x5b\x6e\xfe\x9b\x35\x53\xf0\x10\xba\xf1\x94\x1f\xa1\xab\x4f\x41\xf7\xc0\xab\x4f\xe1\xd0\x77\xe2\x5f\xd1\xdb\xe3\x7b\x99\xf7\xdf\xb0\x7c\xec\x06\xfa\x72\xfe\x79\x9f\x7c\x01\x0f\xdd\xb7\x7f\x0f\x9a\x2a\xe2\xe8\xf3\xd1\x9a\x5f\x5e\xf6\x5f\xf0\xa7\xee\x8d\x58\x57\xdd\x4b\xff\x42\x43\x1c\xd3\x6e\x39\x1d\x49\x01\x51\x55\x91\xa9\x7e\xfc\xe3\x1f\x3f\xe4\xc8\x8a\x63\x9a\x66\x4b\x91\xed\xd8\x75\x8b\x0a\x34\xfd\x00\x49\xb2\x24\x6b\x5a\xcd\xc0\xa6\xab\xb9\x86\x6b\x7b\x26\xaa\x8b\xd0\x0a\x4e\xd4\x0a\xaa\x63\x63\xf4\xf1\x1c\x1d\x0e\xe8\x86\x1e\xe2\x55\xaf\x1f\x7f\x53\x3b\x89\x3e\x62\xc6\xfc\x06\x2f\x19\xa1\xf3\x2c\xde\x73\xcf\x68\xbc\x41\xa6\xbf\x52\x3a\x3f\x76\x23\x91\xe8\x8f\x0f\xdb\x2d\xa9\x1d\xb2\xfb\xe0\x98\x9e\x4f\xed\x9c\x6b\x47\x75\x52\x7a\x06\xf1\x38\x91\x54\x3b\xaa\xc3\xbf\x3b\xf4\xc1\x31\xbc\x68\xe5\x74\xc9\x63\x63\xd8\x35\xf5\xc9\xde\x39\xc9\xa7\x58\x61\x8f\xfe\xfb\xe4\xf5\xd8\x13\x4f\xc2\x9d\x15\xf6\xe0\x9f\xc6\xfc\x56\x64\x6e\xbb\x3e\x31\xd9\xc6\xda\xd3\x1d\xd5\x87\x7b\x96\xc7\xd6\xd5\x1f\xc8\xd8\x3d\x27\x46\x6d\xfc\x54\x7f\x1e\x26\x11\xf2\x3b\x0e\xe7\xec\xc7\xbe\xce\x3d\x2a\x0e\xe9\x7a\xa7\x32\xbb\xe7\xf8\x98\x8c\x27\xf8\x7e\x4f\x87\xe4\xf6\xba\xbe\xf7\xdb\x6c\x8f\xc8\x1d\x8e\xc5\xa5\x31\x9b\x20\xe7\xf3\xd8\x71\xde\xe8\x1e\x2d\x1e\x19\xc3\x1f\x78\x30\x8f\x9d\xcf\x99\xec\x0b\x39\x34\x3f\x09\xeb\x71\xec\xbd\xbd\x78\x1d\xb3\x67\x4b\x3f\x46\xb0\xde\x8e\x47\xc7\xf0\x44\xba\xae\xff\x93\x93\x05\x7e\x96\x9b\x28\xd5\x39\xe7\x53\xaf\xa6\xde\xd4\xab\x05\x31\x45\x7c\x1a\xc5\x85\x99\xd5\x28\xf3\x4f\x91\xfc\x61\x6b\x4b\xf3\x53\x69\x55\xbc\xf9\xd5\x33\x69\x26\xf3\xa9\xe9\x34\x59\x1d\x49\xa9\xb9\x6a\x66\x24\xf4\xbf\xe7\x74\x6d\x17\x6e\x86\x3d\xe8\x35\xcb\x4b\xe8\xa5\x70\x98\xbe\x3d\x80\x6f\xef\xdd\x8b\xce\x0f\xee\x7a\x1c\x1e\x70\x9d\x26\x84\x48\xc2\xb5\x5a\xa3\x81\x21\x90\xc0\x77\xcb\x1c\x2a\xf3\x2b\x14\xb4\x35\x54\x93\x02\x41\x90\x25\x5d\x92\x44\xd1\xa8\x42\xbb\xef\xfb\x60\xd5\x5b\x6f\x82\x2b\xd0\x03\x37\xdd\x74\xd3\x4d\xf0\xa3\x20\xf9\x2f\x3e\x5d\x0e\x91\xe2\xda\xb6\x0b\x75\x17\xda\x88\xb3\x69\x8d\x17\x45\xc0\x60\x3b\x56\x1d\xd5\x15\x49\x94\x2c\x49\x94\x44\xa3\x56\x30\xf2\x9e\x90\xfc\x3e\xec\xf9\xd3\x18\x0d\x10\x9f\xc3\x83\x0b\xb9\xfc\x1b\x87\x46\x78\xfe\x45\x63\x7f\x53\xcf\xd1\xe6\x1f\x47\x69\xe0\xee\x53\xc6\x70\x5a\x8e\x87\xee\xfe\x23\x35\xe2\xaf\xcf\xfa\x79\xa4\xdf\xfe\xf2\xd2\x5d\x7d\x1a\xd8\xba\x7b\xdf\xcc\xf2\xe6\xa6\xf2\xa2\x09\xf8\x91\xdd\x55\x1c\xa3\x27\xe2\x93\xb8\x4f\x1d\x95\x5b\x99\x1c\x38\x38\xca\x5f\x19\xdd\xfc\x6c\xb2\x1f\x74\xd7\x6f\x46\x71\xf4\xd1\x88\x1a\x8d\xc5\x74\xfa\xcf\xcf\x1e\x38\x48\xde\xf2\xc8\x88\xec\x4d\xdf\xf1\xd3\x31\xd9\x9b\xc6\x50\x72\x63\x7e\x1b\x32\xb7\x3d\xe7\x8e\xfa\x4f\x52\x59\xbd\x47\x1c\xb3\x11\x6e\x1c\xc4\x68\xed\x78\x78\xd2\xbc\xf7\xfc\x64\x68\x7e\x7d\x9f\xcb\x9e\x1f\xe7\xda\x6b\x83\x79\x2f\xbd\x70\xcc\x87\x95\xae\x5f\x30\xc4\xd7\xfd\xe7\xf7\xfc\x68\x6c\x5d\x53\x5f\xf5\xdf\xe7\xbc\x10\x0f\xe5\xde\x75\x53\x7f\x7f\x2f\xb9\xed\x8d\x2b\xb3\xd4\x33\xb6\xbe\x65\xcb\x8d\x19\xdf\xde\xcd\xda\xd4\x79\xd4\x3c\xb5\x8d\x7a\x23\xf5\x16\xea\xed\xd4\x95\xd4\xb5\xc3\xf6\xfb\xaa\xe9\xd5\xd3\x95\xbc\xf9\x4e\xb3\x3d\xf3\x7d\x36\x6f\xbe\xa3\xa1\xca\x04\xab\x13\xa0\xde\xaf\x40\x90\xf7\x4b\x93\xaf\x7d\x53\x9f\xfe\x10\x12\x77\xa3\x97\xc2\xb7\xd0\xbb\x9f\xb1\xfb\x19\xc9\x37\x53\x33\x97\x9d\xb1\xe3\x25\xbb\xcf\x38\xbb\xf2\x8c\x03\x95\x2b\xb7\x5d\xf6\xaa\x8b\x2e\xfa\x80\xb9\xf5\x25\xe7\x76\xef\x43\xef\x80\x66\xe1\xba\xad\x2f\xd9\x71\xce\xd6\xe5\x9f\xa3\xeb\x3e\x4b\x62\x16\x2f\x85\xa3\xe8\x53\xf0\xc9\xcf\x92\xf0\xc5\x47\xd1\x1b\xe1\xee\x3d\x4f\x3d\x85\xde\xf8\x64\xfc\xff\xc8\x97\xee\x31\x2c\xeb\xd8\xd2\x5a\xc5\xe3\xd7\x5c\x73\xab\x89\xde\x0c\x07\x6f\x85\xab\xe1\xd7\xbf\x43\xa7\x0a\xf0\x4a\xf8\xca\x97\x6f\xbd\x53\x80\xe5\x5d\x5f\xbb\xe6\x2d\xd7\xdc\xb9\xeb\x8f\xf4\xd2\xad\xe6\x4f\xaf\xff\xa4\xf2\xd9\xeb\xe3\xaf\x5e\x7b\xed\x6d\xd7\xc6\x4f\xbe\xeb\xb6\x0f\x7c\xe0\xb6\x77\xd1\x17\x5e\x0b\xc7\xae\xbd\xf6\x5a\xf8\xb2\x69\x9a\x85\xdf\xa7\x20\x89\xaa\xe5\x31\x52\xea\x8b\x3b\x3c\x62\x4b\xcb\x29\x8d\x65\x3c\xf7\x6f\xb9\x7d\x4b\xf5\xd0\x49\xe2\x14\x52\x1b\x7b\x4f\x73\x54\x4e\xef\x38\x49\x6c\x72\xda\xff\xd2\x79\xa3\x7c\x95\xb6\xfb\x33\xa3\x3e\xc9\xdd\x3b\xa9\xd1\xb3\xb3\x81\x0f\x76\xb6\xfa\x45\xe2\x89\xbd\x6b\x92\x2e\x5d\x7a\x79\xff\x6f\x84\x92\xcf\x6a\xa4\xbd\x59\x99\xfd\xdc\xed\x54\xb3\x92\xd8\x2c\xcd\x6c\xde\x4e\xce\x1e\xcc\xe7\x11\xbb\x65\xa0\xc7\x3f\x37\xfd\xe3\xfc\xbc\xfb\xb8\x7a\x37\x9e\xac\xff\x76\x6d\x1f\xb3\x9b\xd3\xbb\xfe\xe1\x90\x2f\xa2\xff\x5e\xff\x55\xb9\x7d\xa8\xe5\xf8\xf0\xe9\x51\x7d\x96\xad\xdf\xb9\x63\x38\x3f\xe5\xb7\x1f\x0c\xf1\x9b\xd7\x7b\xaf\xcf\x0f\xf1\x73\x5f\x66\x2c\x35\xc7\xec\x92\xf4\xbd\xdf\xa7\x46\xe6\x8b\x0f\x4d\xd0\xdf\xfd\x58\xbf\x23\x47\x88\xd7\x2e\xb5\x03\xdf\xbf\xa2\x94\x6e\x67\x6f\xe0\xb6\xfb\x2f\x7b\x82\xba\xf8\xa7\x0a\xc5\x6d\x3d\xb6\xef\x79\xcb\xca\x2e\x25\xef\xb7\xee\xdb\x3a\x0f\x89\x49\xcf\x0f\x3d\x7f\x58\x36\xa6\x74\xb5\xdb\xeb\xfb\x13\x32\x5f\xf7\xbd\x8d\x54\x87\x3c\x9d\xb6\x5f\x9d\xe5\x82\x9a\x3b\xf2\xe9\xf8\x37\xc9\x48\xbc\x0b\x57\x53\x15\xf6\x9e\x7c\x6e\x8f\x81\x4e\x9a\xbd\x87\x44\xad\xef\x78\x70\x78\x2d\xd2\x77\x1d\x1c\xf3\xbd\xb8\x1f\x1c\xbb\xd7\xe9\x0c\xd6\x68\xc7\x81\x51\xbf\xcf\x91\x87\x27\x63\xa2\x74\x9e\x07\x4e\x90\xbf\xda\x9f\xe3\xab\x81\x9c\xfc\xde\xd0\x7a\x0f\xf8\x70\x10\xdb\x20\xe5\xfd\x3e\x3b\x1e\x18\xc3\xb3\x84\x4e\xbd\xff\x99\xcc\x6f\x7b\xbe\x33\xb9\x7d\x47\x9e\xff\xbd\x3e\x2e\x67\xf7\xfc\xeb\xa8\x7e\xcb\xe6\x40\x4e\x90\x0e\x1c\xee\x8f\x09\x0f\xc6\xfa\xe8\xfa\x51\xdd\x9a\xf6\xb5\x63\xef\xd0\x3b\x12\xd9\xf0\x83\x41\xdc\x9b\xff\xa2\x09\xfc\xb0\x75\xc7\xf7\x76\x52\xaf\x3c\x33\xab\x53\xeb\x91\x5a\x4a\x12\x75\x1a\x75\x46\x9a\xe5\x34\xab\xf7\xca\xce\x08\xb3\x0b\x68\x9e\x2b\x91\xdc\xb1\x67\xa0\x82\xe7\x2b\x35\x5b\xe3\xb0\xe8\x34\xa0\xe3\xc5\x91\xcf\x8b\x9d\xa6\x55\x8b\x54\x56\x3a\xc1\x09\xbc\xd1\x54\xa0\xed\xe8\x06\x4b\xc5\x0a\xb9\x81\xe9\xb8\x26\xd2\x51\x2d\xcd\xa3\xaa\x95\x7c\x96\xeb\xd5\x65\x20\xef\xd8\x8c\x56\xad\xa5\x49\x16\x5e\x92\x8e\x3c\x41\x7a\x1b\xa9\xca\xd4\xb4\xc7\x46\x71\x4b\x32\x7d\x45\x28\x07\x65\xc5\x69\x35\x2c\xc0\x82\x04\x4d\x68\x99\x2d\xc4\x19\x71\xc4\x72\xf8\x44\x28\x08\xa2\x8b\x28\x09\x9a\x35\x55\x33\x8a\x66\x5c\x0d\xa0\x05\xa6\xe3\x58\x48\x41\x2e\x6d\x51\x28\xab\xfd\x9d\xd6\x74\x5d\x3b\x48\xe9\x33\x97\x16\x8d\xde\xd4\x2b\xce\x37\xbb\x30\xc5\x96\x68\x92\x04\xb8\x42\x8e\xf9\x19\xc9\x8f\x5a\x28\x44\x1d\xcb\x71\x3b\x6d\xc7\x83\x96\x6c\x35\x04\xb1\x5c\xe5\x54\x05\xc2\xa6\x83\xfd\xb2\x69\x43\xe0\x21\xb9\x55\xae\xd7\x25\xa4\xb3\xb6\x04\x6a\x83\x57\x5d\x57\x6f\x41\xdd\xad\x8b\xdd\x96\x28\x88\x72\x5b\x86\x50\x55\x35\x83\x51\xf9\x32\x68\x8d\x28\x70\x5c\x64\x22\x87\x2b\xe3\x36\xb9\xf7\x7a\xe3\xca\xb6\x92\xc7\x5e\x4b\xea\x03\xbf\x30\xf5\x85\xcd\x6d\xec\xe5\xac\x4b\xb3\x9f\x3f\x67\xcd\x3c\xa9\x38\x9b\x96\x55\x9e\x9a\x21\x55\xdb\x49\x0d\xa5\x69\x74\x95\x67\x5a\x8e\x4d\x7f\xc2\xf7\xe3\x77\xb3\x67\xc6\x67\x97\x05\x66\x7b\x7c\xd5\x26\x87\x5a\x11\xa5\x72\xc0\x79\x70\xcf\xd3\x8e\xfa\xd9\xf8\x53\xd7\xd3\x5b\x9d\xf8\x6d\xf4\xb7\xd7\x71\xf1\x55\x05\x4f\x8b\x6c\xcb\xa5\x6f\x8b\xdb\x7f\xba\xf5\x87\x8f\x7d\x26\x7e\xdf\xea\x33\xcf\x9c\x09\x5e\xf0\x1d\x6b\xcb\xeb\xe8\xaf\xc6\xbf\x80\xaa\x85\x5e\x82\x1a\x9f\x79\xec\x87\xa4\x5e\x8b\x5a\xf2\x8b\x1d\x8a\xa1\xce\x1e\xd4\x85\xc9\x76\x6e\xd3\xda\x53\xe9\xe9\x6c\xe3\xc8\xca\x4d\x4d\x23\xa1\x58\x3f\xa1\x38\x6c\x3d\x6e\x0a\x52\xa4\x27\x63\x50\x7d\x88\x3c\x03\x7c\x07\x03\xd6\x91\xd2\x81\x72\xb1\x83\xc1\xc1\xdd\x8e\xc8\x0b\x66\x28\x75\xb0\xac\x1a\x8c\x02\x4a\xd8\x72\xb1\x85\x6c\xe4\xa4\x35\x21\x92\x7d\x13\xb2\x7a\xf5\x69\xed\x87\xde\x5b\x7b\x3b\x96\xda\x05\x15\x66\x7a\x6a\x9a\x76\xa1\x5a\xb4\xc0\x94\xed\x40\x17\x93\x97\xaa\xd0\x08\x5d\x68\x70\xd0\x81\xd0\x41\x42\x0b\x17\xc4\xe5\x26\xdd\x64\xd4\x6e\x2d\xb6\x04\x81\x37\x1a\x12\x34\x55\x45\x35\xe8\x06\x04\x60\x60\xd7\x45\x3a\xaa\xd3\x3c\x35\x94\xff\x3b\xcd\xb9\xdd\xcb\xf7\x9a\xe6\xb0\xb0\xa9\xe7\x92\x3a\x91\x54\xaf\xfc\xf8\x6a\x52\x8d\x60\x6a\xa8\xf8\x35\x9a\x9f\xe2\xd0\x1c\x35\xb5\x40\x1c\x18\x69\x6d\x84\x82\x1d\xb4\x5c\xa7\x0e\x21\xd2\x3a\x66\xbb\x2d\x5b\x91\x56\xf6\x39\x17\xea\xa1\x03\xaa\x1f\x3b\x3a\x2d\x77\x20\x52\x90\x8a\x38\x50\xea\x0d\xa7\x1a\xb1\x76\xdc\xf6\x6b\x46\xa7\xea\x61\xd7\xf3\xac\xb8\x29\x08\x6a\x55\x6e\x5b\x9a\xce\xea\x5d\x21\xee\x40\xcd\x43\x02\xf2\xcb\x81\x5b\x73\x30\x6d\x04\x4d\x27\x0c\xb3\x5a\x3e\x98\x55\xa9\x55\xd4\x3c\xf1\x3c\x11\xdf\x52\x3a\x84\x34\x9a\x7b\x50\x7b\xa6\xcf\x05\xbd\x9d\xa4\x8b\x73\xeb\x69\xb7\x51\xab\x5a\x9e\x59\x0d\x6b\x4e\x2d\x84\xa8\x61\x36\x9b\xd5\xba\x0f\xba\x5f\x08\x7c\xe0\x15\xa7\x29\x8a\x65\xbf\xac\x3a\x2b\x54\xe4\x42\x5b\x88\xab\x26\xcd\xb3\x65\xd3\x74\x5d\xcd\xf3\x1c\xcf\xc1\x5e\xa8\xbb\xa6\x6f\x99\xdd\x3a\x53\xed\xb6\x18\xae\xab\xc7\x35\x41\x10\xa5\xb6\xd4\xf2\x64\x55\xa7\x9d\xd8\xc2\xd8\x49\x64\x82\x47\x6a\x4b\xd8\xa4\x3e\xc1\x5a\x52\x37\xac\x5f\x10\xa7\xbf\xdd\xec\x60\x68\xe9\xa9\x38\x9b\x20\x45\xde\x17\x65\x64\xfa\xb4\x17\x5b\x0c\x17\xd7\x64\x2b\x50\x85\x72\xc0\x39\x10\x36\x5c\x68\x08\x71\x68\xa2\x96\x18\x77\x18\x11\x34\xcd\xf0\x5a\xac\x21\xb9\x0e\xd2\xa0\x8a\x21\xc0\x71\x20\x08\x09\xed\x41\xc3\x53\x4c\xda\x8b\x35\x1f\xbb\xb4\x84\x91\x1e\xd8\x16\x12\x7b\xf7\xd1\x5d\x52\xab\x67\x50\x97\x37\x9f\x35\x5c\x20\x23\xca\xea\xf5\xa0\x7c\xa2\x92\x20\x60\xca\x71\x4d\xab\xb9\x72\x39\xe0\xcc\x0e\xb4\x7d\xe8\xe8\x71\x68\xd1\x94\x16\xb7\x19\x8a\x0e\x30\x0e\xac\xea\x72\xe4\x79\x9e\x13\xb0\x76\xcc\xe3\x58\x11\x04\xb9\x2e\xb7\x4d\x55\xa7\x3b\xb1\x0e\x1d\xb7\x45\x2b\x98\xd6\xf5\x15\x0a\x9b\xb5\xba\x1f\x59\x8d\x3a\x45\xea\xe3\xc9\xa9\x2e\x38\xf8\x3b\x62\xb7\xa7\xbe\x37\xba\x7f\x77\xfe\x05\x89\x04\xc9\x57\x04\x9b\x7a\xce\x9a\x0b\xd0\xc6\x4d\x59\xe5\xc0\x3e\xcb\x9c\x8b\x36\x65\x61\x05\x53\xd3\x2e\x23\xa4\xc5\xbf\x0c\xd0\x24\xbb\xea\x71\x1c\x87\x79\x49\x04\xb3\xad\xaf\x50\x32\x34\xa0\xae\x20\x11\x51\x22\xb8\xb4\xd9\x8d\x90\x9e\xb0\x51\xb1\x5e\xab\xe1\x28\x0e\xc0\x90\xf8\x32\x27\xf8\x5a\x43\x16\x14\x0b\x85\xd0\x80\x86\xec\x29\xed\x16\xad\x47\xb1\x81\xa4\xb4\xc6\xc2\x20\x57\xaf\x48\xa4\x30\xb9\xc2\xb4\x61\x6d\xc2\xba\x6b\x7b\x5c\x9d\x27\x40\xc2\xd3\x9b\xa6\x93\x21\x16\x05\xc4\x23\x59\x87\x06\x44\x71\x88\x57\x28\xa8\x19\x48\xe4\x0b\x1e\xd4\x14\x2f\x54\xcb\xd5\x94\x04\xbd\x15\x8a\x87\x0e\xd4\x1c\x24\xb7\x84\x15\xca\x67\xb4\x6e\x95\xb5\xa0\xed\x62\x1f\x89\x86\x06\x8d\x9a\xe7\x37\x62\x1b\x24\x41\x50\x43\xb9\xe1\x4a\xaa\x41\x97\x93\xce\x6c\xd7\x44\x54\x88\x91\x9e\xd5\xca\x08\x58\x87\x3a\x87\x92\xd2\x1b\xe5\xbd\xfa\x8b\xb9\xca\xe7\xa9\xf8\x4d\x53\xc5\xaf\xca\xd7\x5f\x4c\x24\x71\x42\x96\xb4\x17\xe8\x74\xa8\x6a\x28\x04\x4a\xf5\x5a\x5a\x2a\x88\x6a\x2d\x4f\x52\xa3\x1a\x34\x4d\xd4\xae\x83\x48\x87\x86\x12\x5b\x0d\xec\x21\x4b\x41\xb6\xc8\x81\x46\x8b\x34\x05\x62\x99\x75\x64\xdb\x75\xcc\xd8\x01\x4d\x10\xd4\x86\xb4\x42\x29\xb2\xaa\xa3\x56\xd4\x08\x54\xec\x20\x87\x76\x4c\xbb\x6e\x98\x51\xcc\x79\x75\xa8\x22\xad\x96\xd6\x89\x48\x70\x91\x4e\x15\x49\xbd\xcd\x17\x53\x9b\xd2\xea\xaa\x69\x89\xfe\xd5\x93\xa4\xe6\x4c\xca\x47\x9b\xa6\x37\x6e\x5a\x78\x3e\x5a\xfd\x9c\xd2\xf4\x14\x93\xfa\x55\x02\x2d\xc6\x5d\x57\xa2\xa3\x58\xa7\x4d\x9f\xf6\x41\x50\x70\x43\x4b\xc4\xa9\x46\x66\xa1\x79\xb1\xeb\xd0\x9a\x1b\x37\x7d\x54\xe5\xca\x20\xd3\x26\x47\x73\x0e\x76\x4c\xd7\x63\x75\xd7\xe6\x31\x54\x31\x8e\x03\xe0\x04\x41\x30\xaa\x12\xb4\x88\x80\x15\xa1\xdc\x76\x42\x84\xb1\x69\x69\xa6\x6e\x22\x31\x6e\xeb\xb6\xeb\x9a\xe4\x4c\xe8\xe2\x95\x8d\x25\x87\xbd\x89\x2a\x92\x5c\xfe\xab\xa9\xb3\x7a\x37\x28\x92\x39\x6c\x20\x52\xb4\x32\x95\xe8\x43\x52\xa7\x2a\xcb\x60\x3f\xc0\x27\x29\x72\x20\x15\xf5\x7f\xf7\xba\xf8\x58\xf7\xc0\x0b\xe9\x6f\xc5\xc5\xdd\xf0\xfb\x4f\xfc\x17\xfd\xb3\x03\x07\x3c\x12\xfe\xb2\x13\x97\xfd\xaa\x13\xb8\xe8\x69\x5f\xd4\x55\x91\xc3\x82\x81\x6b\x66\xf7\x89\x44\x55\xb1\x37\x7d\xf1\xcd\xa7\x7d\x71\xaa\xfb\x5c\x98\x87\x1f\x5e\x8d\xca\xe8\x36\xe6\x9b\xdd\x1f\xa0\xaf\x7a\xb0\x28\x40\x00\x9e\xeb\x38\x48\x42\xa7\xc6\x55\x81\x57\x6b\x4a\xdb\xd4\x4c\x86\xc1\x14\x4b\xea\x0c\x7b\xac\xd6\xaf\x5d\x25\x50\x62\xaa\xa7\xf2\xf7\xee\x8a\xf3\x23\xd4\x83\xe6\xb9\x64\xf5\x37\x32\x06\xe3\x76\x6d\x9f\x56\xe3\x5a\xf2\x11\xab\xbe\xcf\xf0\xbe\xea\x36\x34\x0e\xf3\xaa\x0c\xcd\x8e\x0d\xbc\xdf\x84\xa6\x85\xb8\x3a\xab\x75\x35\x5a\xe8\xc4\x4e\x87\xe6\xbb\x86\x09\x9c\x28\x68\x09\x75\xa8\xb2\x6a\xd2\x3c\xd4\xa1\x6e\xb8\x46\x87\xd4\xbe\x22\x3e\x1d\x52\xed\xe9\xf9\x3d\x79\x3a\x3d\xac\x98\x7a\x62\x74\x6a\x7a\x23\x19\x6d\x5a\x7d\x55\xaf\x5a\x36\x52\xa1\x2e\xea\xa1\xc5\x63\xd1\x87\x66\xcd\x84\x48\x8f\x5b\x16\x6a\x6b\x10\xd2\x4d\x37\x56\x18\xaf\x6b\xd9\xb6\xea\xa9\x36\x6b\x4b\x55\x27\xe6\x80\x13\x79\xcd\x4d\xd0\xa0\x49\x73\x71\xab\xe9\x55\x51\x95\x6e\x07\x31\x85\xea\xa8\x63\xb9\xba\x63\x53\x88\xe0\x87\x6a\x4f\xbe\x17\x4a\xc3\x87\x1b\x13\x06\x47\xb8\x7f\xd5\xf4\xd4\x7a\x46\x77\xa0\xd3\x41\x21\x48\x05\x05\x34\x54\x05\x91\xb6\xc1\x95\xec\xaa\xc1\xfb\x22\x86\x4e\xd3\x86\x7a\x19\x5a\xe0\xdb\x48\xef\x94\xc1\x41\x2a\x6b\x3b\xa6\xd0\xc4\xad\xb6\xd7\xc6\x5d\x23\xae\x0b\xbc\xea\x2b\x4d\x53\x33\x68\x03\xaa\xe0\x5a\xd8\x44\x22\xe2\x18\x83\xc8\xf7\xd7\x92\xbb\xed\x02\x75\x3a\x75\x36\xf5\x9a\x14\x8f\xd2\xa5\xe9\xd5\x33\xab\x33\x78\x45\xaa\x0b\xcd\x6f\x5c\x35\x9d\x69\xf9\xd2\x1c\xca\x1e\x99\x2e\x8d\x50\xdf\x14\xcd\x64\x7f\xc1\x24\x7f\xd0\x64\x36\xc2\x4f\x4f\x5d\x83\xb6\xfc\xc8\xb9\x0e\x6e\xb8\x0e\x6d\xb9\x15\x7e\x7a\x8e\x73\xeb\x8b\x5f\xfa\xfd\x33\x4f\x85\x8f\xa2\xab\xb0\x6d\x08\x5e\x4d\xa5\x4f\x65\x24\x68\x95\x79\xa4\x81\xcf\x99\x9c\x20\x4b\x65\x97\xd7\x5d\x5b\xb5\xdb\x36\x92\x54\xa8\xc9\x9e\x6b\xb5\xf9\x32\x38\xac\x80\x21\x0c\x71\x39\x6e\x81\x99\xa0\x94\xd0\x43\x55\xa1\x5e\x6f\x20\x19\xf4\xae\xa1\xe9\x55\xdb\xd4\x59\xc3\x85\x28\xc2\x46\x8c\x45\x4e\xab\x4a\x6d\x53\x31\x50\x13\x2c\xe8\x38\xc9\x1f\x38\xa8\x2e\x82\x13\x21\x72\x19\xa0\x40\x6a\x2a\x56\x59\x97\x3a\x97\x7a\x31\xb5\x91\xd4\x65\x4f\x24\x58\x89\xed\x07\xbd\x0e\xe8\xa6\x27\x38\x12\x75\xc7\x52\x7d\xc1\xf1\x7c\xc4\xf6\xc5\x06\x52\xe8\x8e\xa9\xc5\x86\xa3\xda\x0e\x32\x7c\x5f\x94\xe8\xb6\x6e\xa0\x6a\x1c\xa9\xd5\xa6\x91\x20\x40\x4d\x03\xbc\x42\x61\x0d\x0c\x88\x4c\x5a\xa8\xc6\x2d\x1f\x55\x45\x0e\x78\xda\x2d\x0b\x28\xaa\x62\xc7\x72\xbc\x82\x63\x5a\x96\xa4\xea\xcd\x96\xa4\x48\xae\x63\xc4\x0e\x28\x09\x4e\xab\x65\x62\x04\xd5\x23\xf0\x55\xec\x22\x1f\x7b\xf5\x1a\x46\x5a\xdc\x24\x15\x7b\xb3\x1a\x91\x3e\xab\x0e\x78\x70\x2a\x2f\xb7\x33\xc5\xc7\x91\xb2\x4c\x1b\xd3\x42\x6c\xc9\x3f\xc4\xd1\x06\xe2\x69\x03\x14\xd9\x09\xd5\xb2\x9f\x20\x87\xa6\x03\x8d\x15\x0a\x3c\x1d\xc9\xae\x05\x7a\x81\x8f\x03\x88\x0a\x98\x55\x49\x19\x33\x31\x8e\x12\x15\x22\x41\xc7\xd1\x74\x5a\x07\x1f\x02\x1b\x6b\x81\x8b\xf8\x04\xbe\xa2\x7a\xac\xd3\x41\x8a\x1f\x33\x3b\xef\xe0\x6f\x89\x07\x2e\x45\x91\x8b\x54\x0f\x5b\x06\x03\x6c\xf9\x20\xc9\x97\x47\x3d\x83\xba\x7a\x45\x2e\x7d\x9d\xbd\x84\xc8\x93\xd3\xc8\x29\x9a\x48\xbd\x94\xba\x88\xba\xb8\x5f\x25\x71\x7a\xd5\x3c\x47\x0f\xa4\x5f\xcf\x24\x20\xe6\x59\x56\x4a\x7f\x2d\x5d\xca\xca\x93\x91\x82\x8d\x1b\x19\x72\x96\x3b\x35\x1d\xd1\xb5\x58\xbd\x81\xd9\xd7\x7d\xe7\x0f\x7c\x33\xb0\x6c\x13\xc9\xbe\x16\xd1\xa6\x2c\x08\x58\xc4\xb1\x0a\x81\x0d\x4f\x1e\x38\x80\xb6\xde\x7b\x2f\xfd\xe9\xc5\x2f\xdc\xf1\xd4\xf7\x16\x2e\xf9\xb8\xff\xae\xcf\x2c\xc0\x77\xe1\xaf\xcf\xfb\x9b\x77\xd1\x7b\xe3\x2b\xef\x46\xef\x81\x9d\xc5\x96\x07\xc7\x31\xfc\x0b\x38\x50\xf7\x1c\x1d\x09\x48\x8f\xab\xa2\xc0\x73\x9e\x1e\xa8\xaa\x59\x78\x55\x7c\x05\xbd\x27\xbe\xa2\x70\xef\xf9\x70\xc3\x01\xee\x15\x57\xbf\xfd\x0d\x4f\xff\xfe\xb5\x9f\x79\xed\xe9\x1f\xff\x17\x78\x69\xfc\xed\x5b\xd0\xd9\x64\x0d\xd4\x9e\xbf\x66\xff\x16\xe2\x59\x3a\x23\x3b\x37\x1d\xc4\x98\x4d\x51\x6b\x49\x56\x10\x82\xbb\x7a\xe9\x5b\x50\x2e\xe0\x71\xd5\x74\x0e\xbb\xf6\x08\x34\xd5\x6c\x33\xc9\x8c\x99\xc0\xa7\xdb\xfe\x89\x9a\x4f\x77\x68\x09\x5b\x8e\xed\x74\x1d\x5b\xf1\x14\x4b\x2d\xe8\xd0\xd4\xbc\x50\x10\x12\x49\x9b\x18\x94\x1d\x3b\x83\x67\x7a\xc7\x67\xf8\x6e\x8b\xb5\xc1\x01\x1d\x71\xd0\x46\x01\x32\x34\x5f\xb3\x74\xcb\xb2\x75\xdb\x8a\xeb\x71\x08\x55\x41\x90\x94\x9a\x04\x1d\x55\x56\x0d\x64\x83\x19\x60\x07\x89\x18\x4d\x98\xd7\x91\x8f\x66\x71\x0f\x4e\xea\xdf\xa3\x9e\x49\x9d\x4a\x55\xa8\x75\xd4\x1c\xf5\x22\x4a\x21\xf2\xf9\x34\x42\xad\xf3\x1b\x99\x9e\xd2\x58\xcb\x96\x32\x71\x33\xb5\x71\x43\xd2\x34\x9f\xcc\x9b\x48\x45\x6a\x43\x5f\xee\x64\x85\xb1\x19\xbf\xca\xf1\x65\x24\xc6\x46\x43\xd0\x7a\x85\x20\xa1\xa5\xb9\x9e\xe5\x48\x5e\x53\xab\x15\xca\x28\x00\xab\x0d\x9d\x58\xf5\x45\x68\x42\x23\x91\x80\x65\x54\xf7\x35\xaf\xaa\x71\x1e\xa7\x4a\xd0\x82\x8e\xcd\xda\xa2\x22\x73\x5d\x9b\x71\x35\x90\x5a\x71\xd0\xa2\xb1\xab\x0a\x31\x27\x2a\xae\xae\xe8\x4c\x83\x2f\x77\x39\x4c\xd7\xbb\xae\x00\x11\x84\x8a\x2b\x23\xaa\x4d\x30\x4a\x5d\xea\xa8\x92\x6a\x4c\x98\xfb\xfe\xde\x9d\xf8\x7e\xfb\xc3\x0c\x69\xdf\x32\xea\xdb\x0e\xce\x4e\xda\x83\xe9\x8c\x0f\xce\x5f\x51\x4a\x4f\x91\xdc\x30\x25\xea\xd9\xd4\xfa\x2c\x3b\xcc\x16\x4a\x4b\x33\xb9\x23\x52\x03\x8e\x84\x24\x64\x72\x39\x5d\x93\x55\x6b\x4f\xa5\x09\x12\x18\x5f\x53\xe6\x64\xcb\x87\xaa\xb7\xdf\x0e\xfb\xd1\xaf\x61\x0d\xfa\x1a\xdf\x68\x2b\xa8\x5c\x78\xcd\x2d\x5f\x7f\xe8\x6d\xe1\x1f\x5e\xfc\xc6\x9b\xa5\x53\x6f\x39\x55\x7a\xd3\xe1\xa3\x6f\x82\x33\x27\x2c\xb2\xf5\x67\x97\x73\x6e\xf9\x07\xcc\x9b\x6f\x7f\xdc\xc3\x56\x60\xd2\xc7\x60\xff\x7b\x3f\xff\xf9\xfb\xdf\x0b\x9f\x3f\x7b\xfa\x8d\x08\xbd\xa0\xb3\xf3\xfc\xd7\x5e\xcd\x3c\x35\xb2\xe2\x20\xfd\xdf\xd7\xf6\x31\x7d\xf4\x5c\x6e\xe9\x1c\xe2\x67\x7c\xc1\xe8\x9a\xef\xbf\x70\x68\xcd\xcd\x15\x2d\xcd\xa7\x1d\xf0\xc4\x2b\x94\xf2\x1d\x22\x7c\x97\xe8\xe8\x55\x14\x85\x66\xe7\x36\x55\xca\x68\x6d\xe9\x85\x88\x9e\x63\xd2\x85\x63\x6a\xba\x89\x9b\x48\x44\x4a\xe4\x38\xcd\xba\x16\x04\x90\x80\x03\x24\x21\xa7\x10\x05\x9e\x01\xcd\x6e\x0d\x54\xdb\x55\x22\x24\x84\x28\x00\x31\x8e\x1a\x7e\x44\xa7\xb5\x43\x7e\xb5\xf2\x91\xd2\x1d\xac\xc3\x5d\x53\x7a\x3a\xfe\x08\x75\xce\x05\x3f\xde\xfc\xd9\xca\x5c\xe9\x31\x6a\x73\xf7\xae\x0a\x7b\xe8\xd0\x91\xe4\xfd\xed\x15\xb5\xc4\xb3\x36\xa9\x1c\x30\x94\xf0\xe7\x0c\xb4\xb6\xb4\x9e\x21\x5c\xfd\x92\x39\x22\x03\x52\xe1\xc6\x5b\xb6\x1d\x88\x4d\x53\x05\xde\xac\x79\xf6\x0a\x85\x9b\xd0\xb1\x90\xd0\x29\xc7\x81\x4f\xd7\x14\xcd\x33\xd4\x62\x79\x59\xb4\x4c\x21\x10\xf4\x42\x19\xaa\xd0\x34\x9c\x00\x45\xa0\xb5\x9c\x36\x8a\xb8\xf2\x89\x56\xb1\x8e\x5d\x0d\x37\xd3\x7a\x3a\x98\xe8\xc3\xe7\x51\x33\x14\x85\x7a\xa5\x11\x57\x0f\x02\xb0\xd3\x8b\xd1\x25\xaa\x58\x9a\x45\x74\x71\x7a\x3d\x6b\xc6\x6d\x5a\x8e\x1b\x74\xf3\x38\xa6\x5b\x71\x83\x96\xe3\xa6\x69\x6b\xb4\x8d\xb8\x40\x24\xc9\xd8\xed\x58\x6c\x41\x54\xe0\xa0\xc9\x60\x0d\xea\x18\xea\x18\x23\x05\x23\x45\x55\x14\x1f\xe9\xc8\x91\x64\xb0\x9a\x81\x42\xeb\x2b\x54\xa3\x49\xb0\x9b\x52\x72\x58\x99\x3a\x93\x7a\x3e\xb5\x31\x95\xf9\x23\x39\x26\x7b\x62\x70\x61\x1a\x55\x56\x0d\x6a\x51\x6e\xc8\xff\xe0\xb2\x9d\x6e\x93\x6e\x58\x96\xe9\x88\x55\x5d\x8d\x9b\x7e\xdc\xf4\xe9\x46\x37\x2c\xf8\x35\xdb\x13\x25\x45\x37\x2c\x45\x56\xe3\x5a\xcd\xf1\x24\x49\xd5\x0c\x5b\x96\x55\x56\xc6\x9d\x65\xd3\x30\x38\xcc\x69\x4c\x73\xd9\x2b\x58\xcb\x52\xd1\xec\x00\x05\x4d\xf0\x15\xd7\xc6\x96\xe5\x56\x1d\x4b\xce\x7e\x0c\x0c\xf2\x23\x55\xa2\x64\xe2\xf7\xf5\xb2\x7c\x8b\x69\x44\xd7\x45\x93\xf2\x54\xac\x25\xe5\x33\xe9\xb9\x0a\x33\x1a\xd3\xb5\x2a\x27\xf8\xc8\x23\x1b\x0b\x54\xc0\xf3\xc8\xce\x0a\x64\x80\x0f\x94\x4d\xdb\x06\x63\x75\x3d\x86\xc7\xa6\xe3\x1a\xbe\xe1\xfb\x2d\x5d\xd7\x5d\xc1\xd5\x65\x50\x30\xee\x15\x1a\x2d\x52\xd8\xb0\x3d\xd3\xb7\x02\x92\xb2\x82\x83\x28\xf0\xab\x48\x83\x7a\xcd\x4e\xcc\x3c\x55\x86\x28\x8c\x3a\x3a\x92\x3a\x88\x42\xe5\x6e\xcd\x30\xcb\x5e\xd9\xd4\xc1\x2b\x48\xd0\x72\xc1\x70\x91\x27\x77\x6a\xcd\x96\x8e\x84\x76\x94\xd6\x2a\x4e\xf8\x4b\xa0\x58\x52\xf9\xa9\x82\x4a\xb3\x14\x33\xbd\x96\xa6\xd0\x1c\x55\x54\x6d\xd4\x32\xdb\xe0\xc9\x71\x87\xc8\x82\x96\x4d\x97\x59\x61\xb9\x0a\x52\x3d\x62\x3c\x5a\xe5\x62\xb7\xdb\x86\xc8\xa7\x33\xdf\x91\x47\xce\x10\x44\x62\x07\x9f\x99\xf6\x46\xa1\x0d\x6b\x13\xb0\x89\xa8\x5e\x7d\xe5\xb5\x14\x71\x50\x16\xed\x26\xd2\xcc\x04\x33\xc5\xa1\xdf\x84\x9a\x87\x4c\x46\x47\x65\x1f\x6b\x71\x3d\x6e\xa8\xc8\x0e\xfd\x04\x1a\x63\xd4\xb6\x5c\x56\x04\x1e\x5a\x35\x64\xd0\xa2\x24\xc7\x75\xa8\x59\xc8\x06\x0a\xea\xe0\xe9\x35\x83\x0b\x90\x4b\x2b\x4a\x6c\x75\x38\xb5\x5e\xa5\xd2\xfc\xa6\x76\xc9\x23\xf6\x62\x5a\x5d\xb3\x5f\xb7\x33\xd9\x26\x2a\x1b\x0d\x8d\x98\x8e\xa9\xf8\xb2\x15\x2b\x6c\xf3\xb8\x48\xcb\x1e\x34\xa0\xee\x20\x87\x31\x90\xde\x76\x3a\x50\x65\x75\x3f\x94\x42\x1f\x14\x5c\xd5\xe2\x08\x1a\x16\x72\x50\x0d\xdc\x04\xa0\xd6\x91\x4d\xfc\x27\x5a\xbf\x26\xc8\xba\x81\xd5\x9f\xcc\x97\x21\xd1\x66\xfd\xba\xd8\x1b\xa7\xa6\x57\xcd\x14\x22\x24\x23\xd7\x00\x0c\x3e\x78\x6e\x07\x24\x03\xd5\xed\x42\xb5\xdb\x50\x19\x13\x47\xd5\x9a\xd4\xac\xba\x7a\xd7\xb2\x42\xd6\x06\xbb\xe9\x37\x51\xcd\x50\xc1\x84\xb6\x8d\x44\xa8\xe3\x76\xdc\x6a\xf1\x3e\xef\x25\x7d\x50\x0c\xd5\x5e\x51\xd8\x90\x7d\x15\x79\xf7\xf3\x52\xbf\x6f\x0f\x37\xa0\xe9\x85\xe9\x67\xa2\x7e\xa4\xe1\xaa\xe9\xa9\x19\x96\x0f\x6c\xec\x05\xcb\x1d\x6c\xf9\x06\x46\x61\xdc\x2e\x46\x65\xcb\xb3\x3d\xde\x75\x95\x32\xcf\xc7\x76\xc0\xbe\x4a\x86\x66\x43\x6b\xd7\x1b\x2d\xad\x15\xc6\xaf\xc5\x71\x0d\x1a\x82\x2f\xa8\x26\xc2\x5d\x21\xab\x25\x59\x2f\x39\xa4\x26\x5d\x1a\xf3\x90\xdd\xd0\x99\x5e\xe8\x55\xad\x64\x32\x14\x57\x74\xea\x96\x83\xda\xc7\xab\x4c\xe0\xc6\x1a\x36\x3c\x1d\xbb\x45\xed\x44\x35\x2a\x51\xc7\x29\xd6\x96\x5b\x01\xc6\xcd\x08\x57\xf5\xaa\xdf\xb5\x31\x18\x98\xea\xd7\xf3\xb3\x58\x8b\xf4\x7d\x56\x22\xa7\x46\xeb\x47\x2f\x64\x99\xd0\x18\xe2\x59\xd9\x50\x28\x96\x66\x37\x34\x91\xe9\xd3\x92\x4f\xb4\x56\xfd\x38\x8f\x6a\x80\xe9\x32\x2d\xc5\xa1\x84\x57\x28\x68\x7b\x48\x61\x4c\x54\x46\x94\xdf\x84\xa8\xd0\x41\x36\xb8\xc9\x07\x29\x9b\x9e\x96\x76\x8f\x79\x1d\xc2\xc0\x69\xb4\x6a\x1d\x27\xe1\x89\x64\x5f\xcd\x92\xcf\xf2\x93\xf6\x15\x4d\x08\x5f\x9b\xb4\xaf\x10\xb2\x42\x2c\x93\xe8\x7e\xf1\x38\xc7\x88\xb1\x47\x5b\xb1\x4a\x9b\xa3\x1b\x5b\xe4\x70\xe0\xd7\x30\xae\xf9\x59\xcd\x55\x3b\x8b\x2b\x5f\x47\x6a\x75\xf6\xdc\x81\x0b\xa4\xd6\x6c\x2f\x7e\x8e\x4b\x3e\x55\x92\x41\xa5\x0e\x4f\xce\x8e\x75\x9b\x0e\xf4\x58\xa5\xc3\x72\xec\x32\x8e\xa3\x54\x55\x0b\xf9\xb1\x52\x66\xb8\x58\x09\x69\xcd\x8c\xc3\xd8\xb2\x14\x57\x31\x51\x04\x52\x88\xeb\xa8\x8a\x65\x0e\x89\xb8\x11\x2a\x35\x1f\x03\x2e\x63\xd0\x70\xbd\xc6\xda\xae\xa7\x79\x2e\x55\xa4\x1c\x72\x9e\xa9\x51\xc5\xac\xce\xf3\x74\xc2\xcf\xa4\xd6\xcd\x34\x95\x25\x97\x5d\x45\xca\x06\x20\xb2\x17\xa8\x80\x4a\xd4\x06\xa6\xea\x2a\x81\x62\xc7\x66\xc1\x44\x65\xa7\xea\xb5\x50\xf3\x38\xd5\xa9\x59\xd8\xac\xa1\xba\x07\x1d\x68\xb9\x48\x65\x44\xa4\xa1\xb2\x0d\x2d\x68\xb0\x5a\x62\xdc\xca\xc8\x40\x42\xb7\x81\x6c\xe4\xc9\x60\x41\x1d\x33\x5a\x73\x85\xd2\x3b\x51\xd7\xd6\xc1\x0f\xed\x0e\xe2\x42\x88\x3c\x24\x87\x54\x81\xf8\x7d\x3d\x56\x25\x14\x98\x56\x52\x5d\x5b\x28\xae\x1e\xd0\xc7\x7a\x62\xf1\xe7\x62\xea\x58\xc9\x8b\x5d\xe0\x0b\x01\x38\x74\xb9\xd3\x42\x32\xed\x81\x40\xbb\xb1\x2d\xba\x11\xd4\x6d\x24\x32\x35\x24\x74\x9c\x16\xb4\x58\xd5\xb3\xf8\x16\x4e\xc4\x2d\xd3\x10\xbb\x1c\xaa\xc7\x96\xd9\xc4\xbe\x55\x77\xeb\x6e\x83\x24\x93\x63\x09\x1e\xf1\x32\x1a\x4d\xb3\x61\x9c\xd3\xf3\x47\x66\xd9\x3c\x33\x3a\x2d\xe6\xee\x36\xf5\xc6\x53\x2c\xad\xdf\x10\xa1\xb2\xcf\x70\x3e\xa2\x56\x28\xa4\x77\x9a\xc8\x81\x0e\x0a\x18\xae\xdb\xee\x7d\x68\x56\x13\x0c\x15\x99\x8c\x94\xac\x93\x05\x2d\xa8\x17\xbd\x28\x8a\x22\xbf\x1b\x78\x1e\xa3\xd7\xeb\x71\x2b\x8c\xdb\x35\x70\x6c\xdf\xf6\x35\xdf\xc2\x6e\x60\x11\x0c\x6e\x10\xdf\x88\xd2\xbf\x6f\x95\x71\x11\xca\x86\x94\xbf\x6d\x35\x3a\x2a\xd6\x42\x62\xa7\x81\x24\x52\x5a\x34\xff\x51\x35\xc3\x64\x34\x06\xdd\x42\x0a\x52\x0c\xa8\x43\x8d\x55\x96\x05\x8c\x0b\x11\xd4\xaa\x20\x04\x20\x90\xcf\x55\x1b\x5b\x58\xf3\x54\xd7\xf7\xb5\x04\xe3\xaa\x99\xfd\x7d\xda\x50\x75\xee\xf3\x88\xb7\x7e\x8a\x2c\xd6\x54\x6f\xd1\x7a\x79\x0e\xe7\x73\xb9\x0e\x51\x9a\xb1\x65\x30\xbe\x56\xa3\x83\x1b\xa8\xee\x23\xde\xef\xba\x48\x80\x08\xd5\x11\xef\x23\x61\xd9\xec\xfd\x00\x2d\x54\x4b\xbe\x8f\x6b\x4e\x1b\xaa\x36\x92\x19\x0e\xc9\x48\x50\x21\x84\xb0\xe8\x2f\x77\x30\x2e\x94\x5b\xad\x56\x2b\x6e\xf7\x84\x00\xb2\xbb\x5e\x0f\xed\x22\x2b\x0e\x8d\x9a\xed\xeb\x8e\xee\x04\x58\xcf\xf4\x59\x5a\x3b\xf7\x34\xea\x3c\x72\x13\x28\x57\x45\x92\xd4\x18\x4d\xb9\xaf\x38\xb7\x71\x55\x02\x4d\x56\x11\xcb\x74\xe3\xa6\xb5\x14\x22\x98\xe5\xcf\xfe\x96\xc6\xba\x8c\x5c\x5d\x0e\x14\x05\x75\x8e\x4b\xa8\x2d\x69\x85\xa6\x25\x7a\x1c\x0f\x2d\xa8\x8a\x61\xbd\x11\x0a\x1d\x8c\xdd\xa8\xe6\x1a\x9a\x07\x6d\x68\x44\x35\x5e\x8c\xf9\xf1\x47\xbc\x66\xcd\x35\x74\xb7\xf7\x08\xeb\x78\x81\x17\xc8\x9e\x85\xb1\x67\x9f\x68\x46\x91\xa8\x6b\xba\x68\x37\x90\x28\x70\x6e\x0b\x59\x22\x04\x61\x99\xc7\x81\x14\x37\x21\x14\x65\x4d\x15\x87\x1f\x89\x90\x2d\x82\xdf\x18\x7a\x24\xc5\xd5\x6f\x2e\x1d\x64\x6d\x6e\xfb\x63\xef\x40\xea\x96\x07\x2e\x9a\xe7\xb6\xee\x78\xe3\x1f\xff\x53\x91\x36\x3f\xab\x9f\xdb\xd6\x63\x5d\xea\x85\xd4\xc6\x5e\x25\xd6\x5c\xe5\x95\xec\x13\xb9\xda\x37\x9d\x5e\xed\x23\x67\x7b\x0b\x24\x0c\x7b\x76\x2e\x35\xfb\x37\xa3\xc4\xfc\xa1\x1b\x9a\x8a\x2c\x5d\xa9\x2a\x1a\xc2\xb1\x5c\xe6\x69\x37\xd6\x79\x91\x71\x81\x0f\x91\xaa\x83\xde\x86\x28\x02\x4e\x45\x66\x18\x77\x68\x4f\x14\xe2\x88\xd6\x84\x58\x46\x55\x49\x56\x7d\xbb\x66\x79\x16\x6d\xf9\x3e\xeb\x5a\xae\xed\x48\x96\xee\xa9\x8a\xab\x2a\x9e\xaf\xfa\x36\xe2\x20\x32\xb1\x1a\x78\x8a\xea\xba\x9e\xa6\x2e\xd7\xa1\x09\x6d\xd3\xd6\x9a\x88\x8a\xcd\xfe\x1d\x30\xcc\xba\x24\x8b\xe2\x85\xe4\x1e\xaa\x3a\x3c\x9b\xd5\xd3\x24\x6e\x8f\xc8\x5f\x26\xc3\xab\x7d\x31\x3d\x5c\x3f\x94\x84\xf2\x27\x34\xde\xcb\xc6\x4a\x7b\xa6\x89\x64\x4b\xa9\xca\x26\xcd\xc5\x3e\x6a\xd6\x6a\xe0\xb4\x90\xa6\x41\xb5\x8d\xa1\x85\xeb\x10\x9a\x48\x0e\xc1\x45\x8d\x38\xa0\x75\x50\x51\x2d\x0e\xe9\xb2\x43\xeb\xd0\x42\x3c\x46\x6a\x5c\x26\x5f\x58\xd7\x74\x6d\x5b\xd6\x0d\x37\x80\xa6\x4b\xec\x7b\x1f\x23\x01\x04\x5a\x8d\x6b\xa8\x09\x9d\xc0\xf3\x10\xe5\xfa\xae\xef\x06\xae\x0f\x52\x10\xb8\xbe\xef\xfb\xd0\x4c\x3e\xa7\xf1\x8b\x3d\x3f\x44\x9e\x3f\xcf\x21\x27\x7e\xd9\x5c\x53\x13\x73\x7a\x8e\xc9\xb2\xc9\xa2\xfe\xd7\xd5\xd3\x28\xab\xc3\x40\x4f\xaf\xa6\x43\x43\x46\xa2\x26\xd4\x78\x89\x47\xc6\x09\x07\x59\x86\x4d\x2a\xc7\xda\xa8\xb9\x5c\xed\x7d\x77\x42\x2d\x89\x9d\x26\xaa\xe2\x22\x85\xbb\x12\x6b\x9b\xb6\x6d\xc8\xb2\x22\xc6\x0a\x5d\x77\x41\xf7\x3c\x0f\x8c\xe4\x93\xed\xc5\xa1\x49\xcb\x71\x68\x78\xa4\x08\xf9\x29\xd4\x17\x56\x2e\x29\x7d\x84\x7d\x6b\xa6\x8b\x67\xfa\xb7\x2a\x36\x51\x17\x65\x31\xe7\xfd\x32\xd0\xc5\xe9\xa9\x99\x11\xdd\x3c\xb3\x6a\x74\xf4\x0b\xd3\x67\x21\x62\x30\x0f\x64\x0b\xcd\xdd\xfa\xa6\x5d\x97\xde\x5a\x78\xd9\xae\x4b\x3f\x71\xe7\xfb\x96\xa1\x78\xee\x0a\x7a\x0b\x3c\x8c\x7e\x75\x7c\x0d\xfa\x01\x3c\x8e\xb6\xad\x78\xe8\xcb\xf0\x1a\xfa\x72\xf4\x57\xcb\xff\xdd\xfb\x6e\x85\x02\x1a\x01\xd0\xa2\xdd\x86\x87\xaf\x44\x9b\x98\x05\xb4\x16\x6d\xda\x06\x7f\x0d\x3f\x64\xdf\x7a\xe7\xa1\x6d\x87\x76\x5d\x72\xfe\x13\xf7\x2b\xbb\x5a\xf1\x93\xd7\x3b\xd7\xdf\x75\xd7\xf5\xce\xf5\xe8\xf2\xed\xdb\xb7\xc3\x93\xd7\x5c\x73\x0d\x3c\x72\xfd\xf5\xbf\xbf\x1e\x7e\x7a\xcd\xf6\xd7\xdd\x35\xff\xba\xb3\xb7\xdf\xf5\xe1\xf9\x84\xf6\xac\x95\x85\x92\xc7\xde\x48\xad\x23\x33\xbc\x98\x52\xa9\x0f\x64\xba\x65\x7e\xf5\xcc\xea\x4d\x6b\x4b\x83\x22\xdd\x1b\x2f\x42\xc4\x1c\x4a\x6b\x32\xe7\xa5\x52\x8a\x3c\x57\x4f\xf7\xfc\x63\x9b\xa6\x8b\xb3\x73\xd3\x6c\x69\xfd\xaa\xf9\xd5\xd3\xec\x6a\xe2\x4f\xca\x9c\xba\x2f\xd9\x94\x86\x9b\xa6\x96\x15\xa9\x2d\xbf\x69\x66\x61\x7e\x3f\xba\x64\xf7\x13\x4f\x7c\x65\xed\x77\x2e\x7b\xf7\xd6\xcd\xc2\xd6\x4b\xd6\x9d\x76\xdf\xa1\x17\xfe\xe3\x41\xf8\x6b\xf4\xd4\x95\x0a\xfa\x89\x2e\x3c\x24\x2a\xe8\x1b\xc7\x9f\x8b\xfe\x59\xda\xf2\xf7\xc5\xc6\x09\xb9\x5a\x12\xc0\x75\x0d\xac\xc6\xb5\xd8\x16\x3d\x0b\xd4\xa2\xaa\xa8\x71\x43\x72\x51\xf0\x8d\xcf\x23\x65\xed\xba\x75\x9b\xd6\x7d\x68\xed\x3b\x2f\x7f\xf7\xf6\xf2\xfe\xf2\x0b\xb7\x6e\xbe\xe2\xfd\x97\xef\x7f\xdf\xee\xcb\x3f\x7f\xd9\xd6\xcd\x5c\xf9\xd7\xff\x55\xf8\xe2\xcd\x37\xdf\x7c\xf3\x79\x1f\x3e\xef\x26\xf3\x35\xa7\xde\x7a\xda\x9a\x0b\xcf\x3d\x6b\xed\xcd\x6b\x37\xec\xa0\x8d\xf7\xdc\xe0\x6e\x3b\xff\xf2\x6d\xae\xab\x2a\xcb\xdf\x72\x54\xd7\xf1\x34\x53\xe1\x6d\xcd\x75\x14\x45\x71\xb9\x62\xe5\xba\xaf\x7d\xea\xaa\xab\xbf\xb6\xee\xf0\x07\x6f\xfb\xea\x9b\xae\xfb\xd4\xd5\x0b\x0b\x57\xbd\xfd\x3d\x17\x5e\x75\xd1\xd5\x6f\xbf\x6a\xf6\xbc\x0b\xdf\x44\x12\x42\x9f\xd2\xab\xd7\x4d\xad\xa6\x66\x48\x16\xde\x2d\xd4\x2b\xa8\x4b\xa8\xd7\x52\xdb\xa8\x37\x53\x6f\xa7\x28\x34\xbf\x9a\xd4\x0f\x5c\x3d\x74\xf2\x99\x88\xa2\xf4\x64\x7b\x21\x3b\x46\x1c\xc5\x7d\x27\xa3\x2d\x52\xab\xf3\xbc\x54\x7b\x15\x74\x8c\xb8\x4e\x02\x73\xea\x4a\x03\x6b\xbc\x23\xd8\xad\xc4\x10\x73\x31\x6e\x43\x53\x42\x0a\x2a\xc7\x21\x2d\x81\x5d\xd4\xa0\x83\x1c\x70\x50\xbb\x13\xa1\x36\x58\xc8\x83\x0e\x46\x0d\x90\x69\x03\xd5\x97\xa3\xde\x77\xd0\x06\x8a\xa6\x80\xa2\x05\xc4\x23\x5e\x83\x08\x22\x10\xad\x88\x1c\x1a\xb2\x8e\x2b\xa9\x96\x26\x8b\x02\x27\x69\x92\xab\x6b\x3a\x52\x80\xd3\x15\xc9\x95\x64\xd5\x01\x39\x0e\x75\xd7\x70\x5d\xc3\xd5\x91\xa1\x69\x1a\x84\xa6\x69\x42\x5d\xd7\x5b\x06\x74\x44\xdd\x35\x64\xcb\x30\x15\x57\xea\xf9\x51\xb2\xbc\xb8\x07\xae\x22\x3e\xdc\x6e\xe6\x47\xa9\x93\x3c\x99\x32\xc5\x8d\xfa\x31\xa6\x66\xa6\x4a\xb2\x65\xea\x96\xe8\xab\xea\x89\x1a\x66\xe5\xe3\xa1\x61\xf0\x1e\xa7\x15\xed\xe3\x3e\xdb\xa6\x18\xea\xfb\x2b\x2f\x2c\xbd\x8e\x7d\x1e\xf1\x7b\xf1\x83\x48\x8b\xb1\x7e\xd0\xb1\x42\x7d\x59\x39\x23\xf9\x54\x3c\x92\xeb\xb2\xb0\xe0\xc3\x01\xbf\x70\xcb\x48\xc7\xc4\x76\x08\x56\xae\x2c\x69\xac\x46\xbc\x8f\x6b\x48\x7c\xcf\xb0\x67\x61\x2e\x73\xac\x25\xdb\x48\x7f\x94\x69\x1a\xba\xa2\x8b\x86\x22\x77\x1b\x5f\xf4\x7d\xa8\xb3\xc1\x71\x9d\x7c\x6c\x3b\xde\xb6\xac\x72\xc0\x59\x45\xed\xae\xe3\x5c\x71\x15\x86\x9b\xf1\xc0\x7f\xe3\x10\x1c\x4c\x62\x0a\x72\x7d\xb3\xa5\x42\x56\x8d\x32\xb1\x58\x66\x52\xcf\x6c\x68\x5b\xc4\x7f\xa3\xc5\x8d\x32\x8f\xc4\x8e\x15\x75\x3c\xa8\x69\xa8\x2a\xc6\x2d\x9f\xae\xb1\x0e\xe0\x65\x3e\x73\xde\x88\xa6\xd1\x86\x86\x8b\xe4\x08\x82\x36\x46\x0a\x0a\x4f\x34\x8a\x61\xa2\x57\x11\xbf\xa2\x96\xca\x2c\x47\x71\xe4\x9e\xcd\xf8\x9a\xaf\xca\xc0\x53\xa9\xec\x38\x5e\x5d\x68\xdb\xe6\xb2\xe6\xfb\x84\x44\x7c\x9a\x63\xb9\x13\x65\xc3\x10\xb1\xa8\xd1\x66\xd7\x67\x1b\xb1\x48\x2b\x71\x9d\x56\x28\xaa\x17\xab\x64\xb1\x2e\x75\x76\x22\x65\x72\xda\x7a\xf4\x1d\x2c\xa9\x94\x86\x69\x45\x91\xb0\x20\x31\xd1\x72\xd3\x30\x0a\xb2\x61\xd8\x35\xa1\x6e\x29\x5d\xd7\xf7\x02\x1b\x19\x21\x70\x45\xdf\xb2\x05\xd3\xc0\x81\xdd\x55\x4c\xab\x8c\xcb\x16\xdd\xe9\x96\x99\xb6\xef\x58\x88\x47\x7a\x42\x57\x19\xfd\x54\x66\x4f\x79\x31\x39\x31\xd8\x93\xf9\xc5\x8d\x15\xad\x84\x59\x87\x3a\x33\x3b\x17\x38\x37\xc5\x89\xff\xe7\xe4\xd8\x6c\x23\x0c\x6d\xcb\xf4\xc4\x9a\xa1\x2d\xd7\xfc\x28\xa2\x4d\x3f\x4e\x19\xc8\x44\xd1\x72\xad\xf7\x1d\x08\xc5\xa0\xab\x63\xa8\x1a\x86\x80\x05\x0d\x89\x71\x8b\xe6\x31\x13\x34\x9b\x20\x92\xcb\xb5\x4a\xb7\x8d\x64\x68\x20\x39\xa5\x2b\x9d\xf8\x0d\x0d\x92\x5b\x79\x96\x7a\xc1\x60\x54\x24\x0d\x69\xce\x65\x95\x8d\x6d\x55\x0e\xc0\xb2\x9d\x5a\xcd\xb6\x7c\xa1\xaa\x43\x88\xa1\x89\xa1\xe9\x57\xab\x3e\x12\xa1\x89\xea\xd9\x67\x09\x42\xd6\x88\x29\x1c\x6b\x86\x81\x79\x99\x76\xbb\x1d\xa6\x1c\x53\x0c\xd5\x75\x18\x07\x33\x54\x4c\xd1\x66\x8c\xd3\x0f\x82\xb3\x7a\xfc\x57\xca\x7c\x2c\xf9\x0c\x87\xa3\x6b\x55\x7c\xa2\x9f\xba\xb0\x30\x9b\xe7\xa3\x17\xc6\xe7\xde\x7c\x33\xfd\x3d\x78\x39\x9a\xa5\xf7\x8d\x72\x13\x43\xe4\x25\x66\x8d\x7e\xce\xf2\xd4\x08\x1f\xd9\x8b\xd5\x1c\x33\x57\x99\x5a\x48\x1a\x4f\x43\x73\x43\x4d\xb9\x65\x60\xfc\x2a\xed\xd6\xeb\x86\xa1\x18\x82\xa1\xca\x50\xf7\x02\xaf\xaa\xc8\x1d\xa1\xaa\x40\x58\xc5\xd5\x46\x03\x27\x6b\xc0\x90\xb5\x67\x8d\xb8\x4c\x77\xe2\x32\x8e\x75\xcb\x2a\xfb\x65\x8b\xb6\x5d\xe0\x21\x52\x10\x8f\xda\x6a\x6c\xea\x16\x57\xf6\x2d\xda\xb4\x81\x83\x96\x82\x38\xd4\x56\x70\xf2\x3c\xad\x27\x68\xa9\x47\x47\x6a\xc9\x67\x85\x3e\x15\x49\x7d\x3f\xe3\x49\x89\x69\x7a\x00\x6d\x16\x88\xd9\x16\xb0\xd5\x6e\x87\x76\xc2\xd0\xb1\x2d\x4f\xac\x1b\xc6\x32\xf6\x1b\x0d\xda\x89\x29\x24\x10\x44\xe3\xa2\x68\x19\xf7\xbe\x03\x81\x15\x70\x23\xe6\x30\x84\x19\x4d\x95\x81\x43\x6d\x4c\xb7\x1b\x71\x2d\xb1\x37\x82\x28\x8a\xc8\xde\xb5\x49\xfe\x38\x99\xd8\xd3\xeb\xd2\x75\xcd\xe5\xb6\x25\x23\x9a\x9f\x4a\x35\x4d\x32\x14\x56\x6f\x7b\x9e\x6a\x88\xae\xa2\x2a\x27\x22\x5c\xa5\x9b\x48\xe9\xba\xb4\x1c\x37\x90\x0f\x06\x2b\xc7\x7a\xd7\x35\x4c\x01\xf3\xa2\x48\x37\xba\x4a\x41\xa5\x83\x58\xa7\xb9\x2a\xf8\xcd\x74\x2d\x3a\x2b\x6a\x49\x60\x65\x72\xd2\x74\x16\x35\x4d\x3c\x0a\x63\x6f\xec\x97\xf5\x29\x0d\xce\xd2\x4a\x82\xe7\x9a\xae\x58\xd3\x15\x65\x99\xc3\x05\xaa\x6e\xbb\x56\x1d\x5c\xdf\xa9\xb9\xa1\x94\xd8\xa8\x64\xf2\xac\x7c\x3c\x32\x0c\x3e\x79\x7f\xd1\x38\x1e\xb0\xed\x66\x23\xd2\xa2\x86\x22\x41\xe8\x9b\x75\x08\x63\xd7\x43\x7a\x82\x6b\xda\x2b\x4a\x49\x62\xd5\x7e\x14\xc1\x7a\x72\x86\x99\x31\x4d\xcf\xa3\xb2\x8a\xfc\x9c\x73\x9d\x4e\x91\x24\x92\xd3\x0b\x25\xc9\x5f\xa6\x7c\x24\x30\x89\x28\xe9\x74\xcb\x65\x5c\x94\x0c\x5d\xb7\x45\x47\x53\xd2\x16\xa6\xc3\xaa\xb1\x41\xbc\x39\x3e\xb4\x1d\xdb\xed\xb6\xc0\x2f\x50\xdd\xa6\x69\x70\x1e\x67\x18\x74\xd9\x71\x6d\x3b\xc5\xbd\x4d\x92\xcf\xde\xcb\xd9\xc8\x7d\x2a\x49\x63\x49\x46\xb5\xfa\xaa\x31\xed\x94\x0d\xb8\x49\x37\x7d\xba\x79\xbc\x8a\x89\x48\x8d\x68\xe5\x44\xd4\xfb\x4e\xd1\x75\xcd\x11\x1c\x4d\x5e\xae\x62\x54\x26\x7e\x5d\xab\xeb\xb1\x65\xd7\x8d\x35\xe4\x3b\x8e\x03\x56\xf2\x09\xc7\x94\x61\x94\x3d\xce\xa0\xd5\x6e\xc8\xd4\xa1\xed\x38\x6e\x62\xc7\x27\x74\xc2\xf5\xed\xf8\x1e\x3a\xef\xaf\xd8\xaa\x6c\x00\xc5\x09\x59\x54\x4a\x1c\x5e\x2e\x7b\xed\x82\xb2\x5c\x27\x1f\x0d\xbc\xdc\xc6\xb8\xc0\x2d\xb7\x7b\x1f\xac\x12\x9b\x64\xa9\xf0\x0a\xe5\xda\x8e\xdd\xa5\x54\xb5\x40\x41\xdb\x01\xdb\x01\x8b\xbc\xdf\xce\xe2\xc2\x06\x16\xd0\xa5\x94\x36\xec\xe5\x18\xfc\x4b\xf8\x6a\xf5\x88\xc7\x3b\xe3\xab\xde\xbf\x62\x0f\x18\x8d\xf2\x19\x6a\xf8\xa8\xe9\xa3\x10\xa4\xc4\x1c\xa7\xa9\x6e\x48\x9b\x8d\x86\x6d\xe9\xb6\x80\x35\x6d\xb9\x49\xc4\x78\xb7\x86\x3a\xc4\x46\x97\x0b\x0a\x88\xa8\x09\x22\xb4\x32\x38\xd4\x58\x6e\xf6\xbe\x03\x99\xa5\x6c\xdb\xb6\x5d\xcb\xb1\x3c\x0b\x38\x0f\xeb\x3a\xef\xf2\xaa\x0d\x55\xa4\x79\xa8\x6d\x79\x96\x63\x59\x96\xd5\xb6\x62\x6c\xdb\x36\x78\x8e\xe3\x24\xfa\xa8\x4a\x74\xa0\x5a\x99\x3d\x14\x91\xda\x00\x3f\x23\x51\x67\xff\x9e\xcb\x07\xd2\xa3\xdb\x0b\x28\x85\x7a\xd5\x60\x17\x8a\xd9\xfc\xd7\xa1\x7e\x34\x41\x02\x20\x05\x92\xec\x61\x5a\x98\xbd\x08\x65\x39\x6c\x12\x5b\x29\x17\x45\x45\xc2\x0a\x16\x58\x1f\x2f\xe3\x84\x36\xdc\xae\x9d\x7c\x98\x3e\x2f\xd2\xb6\xac\x20\x1f\x44\xad\x8e\x28\x15\x97\x5d\xa8\x42\xcb\x93\xc3\xb8\xa6\xa1\x30\x84\x08\xd3\x35\x55\x8a\x7d\xbf\x6a\x22\x8b\x43\xae\xc8\x81\x42\x9b\xbc\x80\x1a\xac\x1a\x07\x64\x19\xf4\xc8\x51\x6d\x41\xe2\x05\x5b\x95\x41\x0e\x04\x5e\x75\xa5\xd0\xd4\xb4\x26\x84\x26\x56\xea\x22\x6a\xcb\x8a\xae\xd8\x4e\xdc\xd6\x74\x5d\x0b\x08\x06\xa8\xd2\x9d\x92\x56\xe4\xa8\xd2\x60\x66\x25\xcd\x3f\xe1\xfb\x45\x2e\x6e\x25\x80\x94\xe6\x09\x1e\xf4\x56\xb4\x52\x95\x95\x2a\xb3\x4b\xcf\x27\x7a\xfb\xfe\x2c\x2e\xcf\xcd\xfc\x95\x3c\x89\xc6\x49\x7a\xa0\x19\x3a\x31\x3b\x36\x56\x52\x2c\xb4\x71\x61\xfe\x39\xa5\x55\xe9\x71\xfe\x20\x48\xa8\xc4\xfb\xb1\x23\xfa\x0d\xb0\xf5\x46\xe8\x79\x3c\x08\x3e\xed\x96\xfd\xb2\xe9\xab\x0a\xa2\x4c\x0e\x0b\x9a\x02\x7e\xc3\x28\x4a\x71\x07\x59\x71\x7d\x85\x82\x46\x84\xcd\xa6\x87\xaa\x48\x01\x4c\x53\x89\x26\x05\xa7\xeb\x0a\xa2\x11\x89\x24\xca\xd5\xa4\xd2\xf8\x41\xbd\x64\xe6\xc6\xd9\xcb\xc7\xbc\x6f\x45\x2d\x7d\xb0\xf8\xb5\xa4\xfd\x99\x77\x54\x06\xf5\xe2\xf1\x8a\x5c\xb2\x72\xcf\xdf\xd7\x3f\x2f\x4c\x6b\x9f\xf7\x24\x55\xa9\x92\x86\x98\x56\x8a\x25\x0a\x0d\x0e\xb0\xc9\xa9\x19\x99\xe7\xaa\xb5\xa5\x92\xe4\xc7\x75\xc9\xc2\x35\xd3\x75\xc3\x26\x32\x9c\xb8\x0a\x91\xa1\x57\xb1\xd8\x6e\xea\xf5\x48\xa3\x25\x44\xc5\x1d\x9f\x6e\x69\xbe\x52\x74\x40\x45\x82\x0d\x61\xe4\xf9\x66\xd5\x85\x76\xd3\x47\x3e\x5d\xab\x1a\xb1\xa9\x69\x2e\x36\x74\xda\x0e\x2c\x1f\x51\xb4\x0e\x21\x6a\x20\x4a\xa9\xf7\x70\xb9\x53\x0a\x92\xf1\x1e\x24\x77\x93\x97\x7a\x79\xb6\x75\x42\xab\xfd\x79\x3c\xf2\x97\xfd\xf9\x4d\x97\x4c\x56\xa9\xcc\x3e\xc6\x51\x14\xb7\xfd\xf0\xd2\x5f\x7c\xfa\x82\xee\x85\x97\x72\x97\x1c\xfe\x15\x75\xdb\xca\x63\x2f\x9d\x91\x71\xff\x9c\xd5\xeb\x3f\x37\xbb\xff\xed\xe4\x54\x35\xf5\x83\xed\x5c\xb9\xa2\x74\x80\x55\xa8\x79\x62\x3b\x11\x7d\xba\xa6\xbf\x1a\xeb\x19\xb6\xb4\x66\xc8\x30\x2d\x14\xe7\xd6\x23\xe2\xfa\x5a\xbf\x61\x76\x8e\x25\x4c\xd0\xc3\x29\x89\xf0\x3c\xc0\xd6\xbb\x35\x4b\x69\xd5\x0d\xc7\x71\x90\x66\x03\x76\x45\x81\x73\x1c\xc5\x12\x6d\x43\x12\xc1\x86\xb2\x4a\x97\x91\xcf\x73\x50\x03\x45\x45\x3e\x32\x04\x21\x04\x5d\x41\x46\x14\x63\xf6\xeb\xfe\x09\xcb\x47\xd7\x31\xbf\xee\xae\x61\x1c\x6f\x3b\x7e\xc5\xf5\x1f\x7e\xe5\x3c\xfc\xe7\xfb\x3d\x0f\xbd\x66\xaa\x7c\xc5\xf6\xbd\x0f\x9f\xbe\xf7\xec\x2b\xde\x7c\x05\x78\xae\x87\x4e\xbb\xf4\xec\xdf\xba\x9f\xfc\xf0\x2f\x4f\x3f\xdb\x7d\xbf\xf7\xba\x2b\x18\x0d\x9c\x76\x1b\x39\x70\xb7\x47\xd6\x26\x91\x73\x83\xbd\xef\xd5\x3b\xbd\x6c\xe5\xb4\xd2\xcd\xc9\x5a\xec\xb8\xa7\xcd\x55\xd8\xcf\x3f\xfe\xab\x6f\x91\xf6\xf4\xac\x2c\x79\x9e\xdc\x34\xd9\x71\x4f\x7f\x8d\x95\x21\x9a\xc3\xb9\xb3\xeb\xb1\x35\xdd\xb1\x2b\xeb\x2b\xc1\x95\x42\xf2\x37\x5c\xbb\xc2\x7e\xfe\xf6\x7e\x5f\x6a\xbe\xaf\x07\x7a\xe7\xe0\xee\x8a\x31\xf4\x8e\x5e\x9d\x4c\x9b\xc4\xda\xe8\x54\xa9\x2f\xa7\xdf\x36\x40\x85\x6b\x87\x24\xf6\x54\xdf\x09\x37\x3b\x37\x2a\xb1\x33\x98\xbf\x31\xf3\xcb\x4d\xcd\xa7\x12\x9a\x19\xa8\x96\xf9\xd5\xd3\xc4\x8f\x60\xe3\x13\x2a\x0e\x11\x8f\x51\x84\x89\xeb\x95\x8a\x29\x5e\x28\x88\x60\x04\x48\x74\x2c\xc3\xd0\x55\x53\x70\x15\x11\x1c\x0c\xbe\x6f\x58\x46\xe4\x42\x0d\x75\x44\x01\x82\x0e\xa9\x2e\x14\x81\xd0\x61\x9a\x5d\x31\xf9\x40\x1e\x46\x8e\xa5\xc5\x0d\x95\xd5\x01\x37\x9b\xc8\xec\x68\x9a\xa6\xb9\x4a\xdc\x11\x45\xcf\x34\x5c\x49\x76\x0c\x3d\x0d\x3b\xa8\x22\x6d\x85\x42\x8a\x22\xd9\xa6\xe9\x89\x22\x5d\x56\x14\x05\x3a\x2a\x74\xd4\xb8\x61\x18\xaa\xaa\x26\xf2\x88\xd6\x57\xf4\x82\x9d\x9d\x41\xf6\xce\xfd\x48\x9d\x58\xba\x13\xf9\xae\x1f\x21\xd5\xb5\xc2\x20\x62\xc5\x7a\xe8\xb6\xeb\xb1\xae\x83\x0c\x86\x83\xdc\x04\xeb\xa7\xd8\xd1\xa3\xd6\x52\xcf\x23\x95\x11\xb3\xf3\x2d\x9a\x24\x91\xd8\xd0\xa3\xe7\xd2\x1c\x95\x66\xa0\x63\x57\x91\xf6\x62\xea\x44\x6a\x63\x49\x66\xd4\xa0\x85\x64\xe4\x69\x60\x82\x05\x1e\x94\x0d\x14\x21\xb9\x1a\xd8\xae\x8b\x7c\xb5\xd6\x8e\xdc\x58\x10\x31\xf2\x10\x6f\x42\x07\x1c\x68\xd3\x55\xd4\x34\x41\x8e\x0d\xd6\x93\x74\xdd\x5d\xa1\x02\x4f\xf7\xcd\x7a\x5d\xc3\xaa\x67\x79\x96\x61\x22\x41\xf5\x1c\xb7\x26\xc5\x8e\xee\x60\xc7\x68\x5b\x3e\xf6\xed\x84\x27\x3f\xb8\x72\x55\xe9\x11\xf6\x1d\x64\x9e\x89\x4d\x9a\x1b\x0a\xd3\xb7\xe5\x2a\xfd\x54\x6a\xab\xa6\x99\x53\xd0\xad\x68\xea\xdd\x00\xf0\x39\xf8\x1f\x7a\x11\x3d\xb5\x1d\x5e\x19\x7f\xe0\x29\x1a\x2b\x92\x2f\x8a\x8c\x1d\x87\x4d\xe4\xea\xa0\x74\xda\x1d\x10\x0c\xe4\xb4\xe2\x90\x7e\xf8\xed\x9f\xd9\xf3\x99\xab\x8f\xdf\xf8\xe0\x9e\x07\x3f\x51\x58\x31\x2d\x59\x57\x31\xd4\x5d\xbf\x8e\x02\x70\x9a\x5e\x15\xf1\x19\x9d\x5b\x25\x3f\xa1\xf3\xa5\x59\x8a\xaa\xb0\x87\x9e\xcc\xd1\xbf\xda\x6b\xe7\xd8\x47\x2f\xec\xb7\xf7\xee\xdb\x93\xf6\xa5\xb9\x7e\xbb\x55\x0a\x06\xcf\xef\xf9\xab\xdc\xf3\xfa\xe0\xf9\x7e\x3d\xfe\x91\x7e\xf6\xf4\x6a\x79\x58\x84\xaf\xc5\xca\xec\xe3\x97\x93\xf6\x63\x43\xcf\xf7\xfb\x3f\xf8\x0f\xb9\xf6\xf4\x2e\x04\x69\x7f\xe8\xfe\xb1\xd8\x13\xd2\xde\xaf\xbb\x6b\xf6\xef\x9c\x93\xf9\xf6\xeb\xf7\x9a\xbd\x98\xb8\x6c\x3c\x47\x73\xfd\x07\x83\xf5\x39\xe2\xe5\xda\x71\x6e\xfc\x4b\x93\xdb\x1f\xff\xff\x68\x7b\xf7\x38\xb9\x89\x2b\x5f\xbc\x4a\xea\x56\x77\x12\x20\x9a\x1e\x0f\x16\x8f\x04\x35\x63\xcf\x08\x48\xb0\x60\x18\x5b\x18\x8c\x85\x01\x23\x60\x01\x01\x21\x88\x57\x10\x10\xb0\x80\x00\x32\x10\x10\x38\x80\x78\x8b\x25\x80\x00\x03\x65\x63\x4c\xf1\x96\x31\xf6\x88\xd8\x24\x9d\xd7\xa6\xb3\xbb\x49\x3a\xdc\x3c\x9a\xec\x26\xe9\x6c\xb2\x9b\xde\xec\x6e\xd2\xd9\x6c\x36\xbd\xc9\x4d\xd2\x9e\x6e\x55\xff\x3e\x2a\xa9\x7b\xba\xc7\x43\x7e\x7f\xdc\x7b\x31\x3d\x1e\x9f\x96\xea\x71\xea\xd4\xa9\x53\x55\xe7\x7c\x4f\x2f\xef\xab\xd3\xcb\x95\xf6\xf6\xdd\x7b\xe5\x4a\xeb\xe7\x46\x48\xde\x79\xa3\x33\xd4\x67\xb7\x57\x77\x3f\x27\x99\xd3\xc7\xcf\xb9\x9b\x3e\xff\xa5\x81\xbe\xe1\xb9\xbe\xed\xbc\x60\xa0\x9c\x4f\xcd\x95\xf3\xfc\x43\xdf\x19\xec\x5b\x9f\xde\xcf\x09\xe3\xf4\xe3\x83\xef\xa2\xb1\x6c\x77\x0f\xd0\x8d\x98\x17\x49\xbd\xaf\x0d\xca\x04\x9e\xe3\x5d\x78\xdf\xc0\xba\x96\xe4\xe5\xf9\x15\x2d\xe7\xce\xa1\xe7\xfb\xfd\xdd\xb5\xb4\x4f\x37\xe6\xda\xcf\x73\xbb\xd6\xed\xc5\x53\x85\xd2\x27\x06\xc6\xcc\x98\x93\x89\x17\xa6\xfa\xed\xec\x61\x39\xd1\x76\xf6\xb1\xa7\x2d\x8a\x8f\x10\xd7\xdb\x9e\x57\x8e\x3d\x38\x66\xaf\x3e\x33\xc4\x07\xb7\x57\xce\x2b\xc7\x0e\xc9\xba\x56\x98\x78\x65\xfb\x50\x39\x46\x3f\xf6\xf4\xce\x98\xbe\xe9\x96\x7e\x39\x76\x1a\xa3\x7d\x37\xc5\xb4\xf8\x7a\x9f\x2e\x27\xb2\x95\xd0\xfb\x98\x81\x4e\x3f\xde\x9a\xd6\xfb\xe2\xa5\xfd\xb9\x11\xf7\x8b\xf6\x37\x0f\x0a\xdc\xdb\x3d\x9c\x03\xb7\x17\x67\xfe\xea\x1b\x73\x71\xe6\xaf\xbe\x39\xc0\x0b\xbb\x30\xf1\x6a\x40\xbf\xdb\xd6\x1b\xd1\xf4\xbb\x24\x87\xc3\x27\x69\x7c\x3f\xad\x6d\xe3\xd3\xfd\x36\x78\x73\x6d\xdb\xf2\xe2\xc0\xfc\x4c\x79\x15\xb7\xa1\x1f\xaf\xef\xf4\x63\x4d\x69\x29\x5b\x3f\x37\x24\xc3\x5e\x61\x62\xeb\x5b\x43\xbc\x4a\x64\xd8\xee\xcd\x87\xa1\x18\x5e\x83\x96\xa5\xf6\xf8\xb8\xf3\x07\x03\xe3\xed\xcd\xc9\xeb\x96\xc7\xfb\xf6\x9e\x9e\x43\x1c\x4f\x4f\x0e\x07\x1c\xda\x93\x98\xbd\x91\xc4\x29\xf5\x00\x98\x45\xb2\xe9\x68\xf9\x80\xd7\xd4\x46\xc5\x88\x50\xb5\x61\x97\x2b\x1c\x3f\xab\x48\xa2\xd5\x92\x49\xdd\xd4\x35\x27\x6b\x44\x65\x82\x89\x5c\xf2\x7c\x58\x82\x16\xe3\xa5\x76\x32\x5d\xef\x81\x40\xbd\x35\x06\x42\x0f\xe7\x2a\x00\x07\x40\xb8\xff\x68\x8e\x61\xb3\x15\xd9\x31\x68\x64\x4d\xbd\x6a\x45\x46\xa9\x62\x43\x1d\x7a\x4d\x1f\x79\x4d\x4e\x9c\xd5\x64\x51\xab\x88\x5d\xe0\x69\x76\x56\x8f\x4a\xc4\x8f\xab\x82\x12\xe3\x33\x88\x80\x16\xa9\x1b\x50\x80\x89\x6d\xfe\x60\xf7\xb8\xdc\x6b\xdc\x95\x20\x9b\xdc\x93\x33\x09\xe0\x54\xe2\x4a\x38\x50\x73\x96\x76\x8d\xfd\x89\xe7\x7a\x2e\x66\xa6\x25\xc7\x52\xf8\x80\x77\xea\x15\x2b\xaa\xd5\x49\xcb\x69\xd4\xb8\x2b\x0d\x52\x0d\xed\xea\x57\xdb\x6f\x1c\x73\xe8\x27\xe0\xa2\x71\xf2\xc5\x37\xcf\x72\xd8\x5f\x92\x13\xc9\x1f\xc9\x63\x4f\x3e\xe9\xc0\xcb\xe1\x07\x60\x27\x89\xb1\x8c\xf7\x09\x57\x00\x16\x7c\x28\xf1\x66\x5c\xba\x57\x8d\x8b\x68\x8d\xd3\x23\xec\xd3\xbe\xcf\x8c\x2f\x54\xdd\x15\x91\xf5\x4c\xbb\x25\x8b\x06\x04\x22\xa9\x62\xcd\x66\x31\x31\x5b\x24\xf0\x3c\x1b\x6a\x2d\x58\xeb\xc7\xdc\xca\x85\x89\x19\x8a\x93\x3e\x33\x17\x7f\x7c\x42\xae\x14\xcf\xab\xdd\xb7\x01\xc0\x9f\x3a\x73\x07\xd8\xd3\xfd\xb3\xf2\x43\xf5\x82\x6e\x17\xa8\x3d\x5d\xb2\x9b\xe6\x44\xd8\xfd\xf1\xa1\x58\xe6\xb8\x2c\x8a\xd3\x3c\x43\x63\xa5\x29\xc6\x1f\xa5\xd3\xf3\xea\x03\x68\xc4\x46\x7a\xb7\x92\x5d\xcc\xe5\x96\x2f\x4d\xfc\xf4\x92\x3b\x5e\xc8\x17\xe6\x80\x02\x98\x98\xad\x2c\xe5\x2a\xf3\x20\xf3\xc3\xe8\x88\xaf\x67\x2e\x6b\xbf\x08\x3f\xb6\xf9\x92\x5b\x08\xcc\x2d\x3f\xe1\xbe\x37\x6e\x79\xea\x90\x23\xc9\x83\xc4\x58\xf6\xc5\x0c\x2b\xcb\x79\x01\x09\x86\x66\xcb\x46\x3b\xa8\xfa\xb6\x91\x79\xca\xaf\xf8\xa2\x5c\x76\x78\xc5\x30\xf4\x5a\xd3\xd0\x75\x5d\xf0\xdc\xcc\xab\x9d\x46\xa7\x89\x90\x48\x1a\x41\x00\xcd\x8c\x1a\xd9\x51\x8d\x98\x46\x0b\x7a\x50\x64\x9a\x0b\xf4\xe3\x47\xef\xd1\xbf\x1f\x0e\xcc\x2b\x2f\x9e\x6f\x88\xfa\xa7\xce\xdc\xb3\xf0\xf3\x1b\x37\xa6\x74\x93\xfa\x84\xb8\x85\x89\x37\x9e\x8f\xe7\xdb\x1b\x49\xf4\xf2\x53\x94\x57\xe7\x77\xcf\xcc\x7d\x95\x9b\x4e\xcf\x54\x96\xf5\x78\x95\x1a\xa2\x53\x2b\xd2\x98\x91\x91\xe2\x7b\x72\xea\x7a\x36\x4f\x4a\x32\xd4\x7c\x62\xfa\x0d\x99\x54\x03\x88\x89\x19\x7f\x58\x7f\x2f\x16\x65\xf7\xf3\xc2\x76\xcb\xb6\x33\xf9\x30\xaa\xb5\x22\x0b\x0a\x99\xcb\xfe\x22\x77\x52\x1b\x5a\x4f\x31\x5e\xee\xa4\xf9\x99\x5d\xda\xeb\xbb\x17\xea\xf3\x0b\x1f\x19\xe0\x11\xcd\x41\x3c\xf3\x19\xfa\x0e\x45\xc0\x9f\xb9\x2b\x7d\xe7\xd4\x81\x77\x4e\x45\xff\x05\x2f\xee\x36\x56\x7f\x78\xc5\xdf\xa6\xe7\x90\x49\xac\xd5\xb1\xf4\xa6\xf2\x62\xba\x6f\xe2\x72\x89\x77\x67\x1a\xad\xd8\x0b\x5a\x5c\x32\x39\x56\x9c\xa6\x08\xc7\xf1\x97\x47\x27\xa1\x56\xe3\xfd\x2b\xbd\xf1\x15\xf4\xb6\x69\xf9\x8a\xe2\xfe\x70\x28\x2c\x63\x15\x2c\xee\x07\x73\x93\x27\xc0\x15\x35\xa6\xae\x5a\x0c\xef\x5b\x9e\x2c\x3b\xb6\x65\xfb\x92\x14\xb8\x8e\x1b\xa0\x86\x43\x6a\xd5\x08\xd5\x49\xc5\xa8\xf8\x15\xdb\xb6\xf2\x9e\x12\xd5\x60\x3e\xa3\xfa\x82\xcc\x48\x7b\x14\x86\x97\x24\x0f\xb1\x7c\xa7\xd9\x80\x8a\x2c\x10\x45\x62\x74\x59\xb7\x94\x3c\xca\x3b\x95\x92\x1e\xd5\xf9\xa0\x65\xb5\xfc\x3c\xa7\x7b\xa6\xe1\x97\x24\x4d\x91\x35\x43\x57\x24\x51\x35\x0d\x53\x33\x75\xcf\x2b\x59\x7a\x60\x39\xaa\xe6\xe9\xaa\x66\xa9\xb1\xe9\xab\x18\xbe\xaf\xab\x9e\x4b\x2c\x5d\xd5\x48\xb5\x0b\x24\x51\xf5\xa4\x92\xa3\x59\xc8\xf3\x54\x47\xf6\x83\x94\xb7\x2b\x72\x1b\x38\xb5\xb0\xee\xa5\x27\x01\x00\x8f\xab\x60\xe5\x49\xfc\xd5\x2f\x3d\x55\xbc\x6d\xf5\x37\x8e\x3b\x96\x5f\xfb\x06\x06\xbf\x5d\xfd\xfd\x63\xff\x4c\xf5\x73\xb5\x5b\xce\x49\xd9\x0a\xb5\xea\xa7\x7a\x52\x35\x52\xe4\x3c\x8c\x67\x1b\x18\x67\x85\x6c\x65\x16\x68\x3a\x97\x9f\xad\x53\xdd\x57\xed\x6a\x39\x89\x53\xc1\x28\xd5\x43\x60\x94\x66\xc4\xa6\xd3\x95\x9a\xc3\x00\x66\x69\x29\x71\x19\x8c\x0a\x85\x56\xe8\x60\xbf\x52\x09\x5d\x5c\xaa\x93\xba\x03\xd5\x2a\x69\x91\x5a\xa6\x8c\xf1\xac\x16\x17\xde\x24\x4d\xd2\x80\x3c\xb4\x44\x62\x90\x4a\xb3\xe5\xb6\x1a\xa4\x52\xb1\x9b\x50\x84\x2a\x14\xb4\x59\xa0\x67\x4b\xb3\x75\xba\x7f\xd3\x73\x16\x77\x69\x61\x62\xc7\x0d\x54\xff\x64\xbb\xbb\xe0\x57\x8f\x7b\x4e\x8d\xdb\x54\xa7\x6d\x92\xc1\x07\xc0\x28\x00\x59\x7a\x30\x44\xff\x8c\xf7\xe2\x39\x38\x6f\xb6\x85\xa1\xc7\x2a\xd0\xc3\xc4\x21\x80\xb8\xd9\x3c\x71\x24\x3f\x63\x30\x7e\x64\xb7\x03\x4e\x8b\x9c\xc8\x62\x10\x2d\xcb\xcd\x49\x9c\x94\x94\x95\x84\x7b\xcc\xdd\x04\xc4\x7f\x58\x13\xea\x8c\x83\x67\x5b\x18\x67\xf3\xa4\x12\xd9\xa4\xcc\x49\x91\xc6\x94\xf6\x18\xae\xcb\x05\xb3\x76\xa6\x15\xff\x2b\x66\x4e\x2d\xf5\x4d\x3e\x08\x80\xd1\x29\xfa\xf6\x54\xff\x33\x3e\x5d\xec\xfd\x5d\xc3\x8c\x1c\xb9\x18\xd6\x31\xac\x61\x4c\x24\x46\xc6\x78\xd6\x64\x50\x84\x59\x81\xf1\x08\x1f\xb7\x11\x36\x23\x55\xe9\x34\x18\xb3\x13\x1a\x74\xdc\xdc\xae\x4e\x7d\x06\x3f\x44\xbd\xf9\x8a\xd3\x83\xc1\xaf\xbd\xf2\x69\x9d\x2e\xab\x44\x36\xe3\x63\x26\x8c\x74\x56\xea\xd4\x60\x03\xe3\x36\x8f\x61\xa5\x53\x61\x1d\xa8\x22\x28\x91\x1a\x22\x65\x14\x39\xb0\x15\x01\x9b\xf1\x49\x9e\x2e\xad\x7d\x9e\x8b\x85\x89\x1d\xd7\xd3\x7d\xc6\x0d\x60\x90\x2e\xa5\x63\xc1\x6d\x7c\x72\x88\xae\xf4\xe9\x4f\x0c\xd8\x25\xd4\x96\xd9\x41\x73\xb6\x6d\xf4\x53\xdb\x20\xa4\xe3\x26\x24\x77\x96\x3c\x33\x84\xe2\xc8\x00\x38\xb9\x04\x8c\x16\xa1\x92\x6d\xca\x9a\x62\x79\xae\x84\x90\xc6\x4b\x11\xc8\x93\x2a\xa9\xd8\x50\x82\x40\x20\x1a\x27\x74\xd4\xc8\xd3\x15\x1e\x09\x6e\x2b\x23\x46\x5e\xa4\x76\x81\xd3\x62\x2c\xc6\x4c\xd6\xea\x4a\x57\xcf\x29\x9c\x90\xf8\xab\x8e\x16\x79\xa6\x5f\x49\x61\xa4\x08\xa9\xd7\x6a\x85\xb3\x55\x14\xe8\xba\x64\x99\xbe\xa0\xce\x4a\x19\x5e\x8e\x85\x44\x63\x44\x4e\xe8\x68\x11\x0e\xf3\x38\xef\x41\x9e\x6d\x75\x01\x22\x22\xf1\x02\x8a\x81\x0f\x18\xc6\xe9\xaa\x59\x93\xb3\x69\xf4\x21\xc5\x3d\x18\x4e\x04\x9a\x29\x63\xd3\xb7\x4d\xd1\xb2\x15\x39\x2a\x61\xcc\xd9\x7b\x02\xc7\x14\x02\x51\x52\xb2\xde\x6c\xa3\xd7\x3e\x25\x27\x70\x3c\xbd\xbb\xa0\x5c\x48\x8b\x28\x8c\x26\xf1\x6c\x60\xb4\x38\x4a\xf7\xd9\x50\xc9\xd6\x51\xc9\xab\x08\x15\xcf\xd2\x84\xa8\x99\x27\x0e\x31\x6d\x58\x82\x6a\x3e\xb2\x43\x5f\x2a\x79\x01\xc7\xcf\x36\x89\x29\x22\x11\x8a\x19\xb3\x53\x8b\xca\x35\xb7\xc2\xe8\x4c\x40\x2a\x22\x41\xa4\xa9\xc3\x7c\x2f\xe6\x37\xc1\x52\x38\x84\x66\xb9\xdf\x7f\xf1\xf2\x78\x0d\xe1\xd9\x6c\x6e\x92\x29\x26\xb5\x8f\x2e\x59\x4a\x43\xd9\x26\x27\x58\xc8\xb0\x99\x6c\x61\x14\x3a\xa8\x2e\xe6\xa3\x52\xb6\x21\x40\xa0\x57\x04\xd2\xf4\xca\x62\xc5\xf7\x78\xe2\x91\xa6\x15\xd5\x6d\x26\x6f\xf2\x8d\x1a\x53\xca\xcb\x50\x80\x26\xcf\x67\xca\xd5\xb0\x01\x75\x14\xf1\xc4\x56\x02\x99\xb8\x71\xbb\x04\x3b\x24\x26\x29\x3b\x50\x80\x61\x3e\x80\x3c\x94\x88\x45\x5a\x25\x13\xaa\x8c\x93\xf8\x3a\xdf\xd1\x3d\x27\xf7\x16\x77\x10\xc8\xa6\xbe\x91\xd4\xb1\xfb\x2f\xf1\x25\x77\xe8\xf5\x87\x06\x87\x5f\x3f\xbb\x3e\x7b\xeb\xa3\xdb\xef\xfe\xd2\xfe\x5f\xba\xeb\xf2\x93\xf6\x27\xfb\xe7\xc9\x46\x72\xa7\x05\x37\xc1\xc3\xf2\xd1\xd6\x57\x1e\x9c\xd8\x7e\xd7\x96\xcc\xc1\x7f\x22\x53\x90\xff\x2d\x23\xcd\x76\xc8\x95\xe2\xb3\x22\xfc\x70\xe6\xe3\x9d\x9f\x47\xdf\xf8\xd1\xdd\xdf\x64\xce\x60\x5e\x22\xef\x1c\x42\x9e\x23\xbf\xd7\x61\x36\x8d\xe9\xc5\x69\xec\x71\x31\xf1\x55\x05\x70\x29\x95\x17\x76\xae\x35\xcb\xe7\x5a\x93\x95\xa0\x04\x75\x8b\x84\xa4\x42\x64\x87\xb4\x88\x6f\x43\x43\xc8\x60\x3b\x34\x5d\xd1\x33\x55\x85\x27\xbc\x40\xea\x24\x70\xa1\x0a\x81\x44\x02\xce\x26\x72\x33\x84\x00\x36\x1d\x93\x48\xa4\x8c\x60\x9e\x54\x23\x81\xd4\xf9\x80\xc7\x8c\x44\x42\x62\x63\xcf\x87\x3a\x14\xe6\xf6\x53\x4e\x61\xe2\x05\x1a\xaf\x31\x73\xcd\xc0\x3a\x2a\xd3\x75\xf4\x32\x6a\x7b\xfd\x77\xdf\xa6\x88\xf7\x83\x6e\x61\x62\xf7\x24\x7d\xfe\x13\xf3\x9f\xdf\xfd\xf0\xd0\xf3\x5e\x57\x49\xe9\x34\x3e\x7c\xe3\xe3\x03\x7b\x81\xa4\xfc\x4b\xe7\x9e\x07\x10\x04\x5d\x8d\x6b\x26\xfa\x07\xf6\xe3\xfe\xc6\xa7\x07\xae\x4c\x96\xaf\x28\x72\xd9\xc9\x25\x2c\x1f\xc8\x0a\x9b\x77\x5d\x88\xf0\x6c\x29\xab\xb5\xc5\x4c\x7d\xb6\xc4\x7a\xd8\x88\xd4\x90\xb4\x2c\x88\x38\x47\xd2\x34\xbf\x85\xdb\xa1\x85\x60\x1e\x41\x01\xc5\x0b\x86\x53\xed\xeb\x0e\xda\x8f\xad\x34\x67\xd4\xee\xde\x99\xc6\xb5\x5d\x31\x57\xe1\xae\x2e\x4c\x3e\xbf\x0f\x39\xb0\xfb\xcb\x02\xb7\x7b\xd2\xae\xa5\xf1\x2b\x46\xbc\x77\x49\xfa\xbd\xe3\x57\x03\xfb\x33\xda\x8f\xed\x53\x43\xfd\x76\x7b\xcf\xef\x88\x86\xca\x4f\xf8\x6d\x17\x26\x5e\xb9\x60\x88\x6e\xf7\xb1\xf7\x66\xe6\xe8\x80\x05\x3a\xbd\xef\xe0\xc1\x28\x38\x3c\x89\xbb\xeb\x2b\x9a\x58\x46\xe8\x49\x11\x1c\xd0\x3e\xcb\x0b\x34\x98\x76\x79\x61\x74\x7c\xe9\xa0\x52\x5a\xde\x27\xb7\x38\x3e\xef\x63\x23\x14\xcb\x96\xa6\xf2\x91\x6b\x46\x9e\xc1\x48\x56\x14\xb2\x32\xab\xc9\xb6\xaf\x69\x92\x69\xe8\x92\x48\xea\x3c\x29\xd9\xbe\xcf\xb7\x3a\x66\xfa\x85\x68\x18\x26\x2f\xcd\x7d\xc1\xf1\x44\x6b\xc8\x58\x76\x20\x20\xb2\x8d\x0c\xa8\x47\x36\x11\x48\xc5\x14\x90\xa0\x42\x1e\xf2\x51\xad\xe9\xd8\x50\x84\xbc\x47\x78\x52\xb5\x04\x24\x28\x0e\x2c\x45\xd5\x98\x2a\x41\x7e\x4e\x9e\xec\xc2\xc4\xd6\x9d\x43\xfc\xe8\xcb\xc7\xf6\xc3\xf6\xe2\xeb\x80\x3c\x6d\xdd\xd1\x97\x4b\x75\x88\xfe\x66\x4a\x0f\xfb\xe5\x6f\x1f\x2a\x5f\xeb\x8f\xff\xeb\xf3\xc6\x41\x4d\x73\xcb\xd1\x71\x7e\x5a\xea\x3f\xaf\xe6\xd4\xb8\x9c\x99\x35\x74\x4f\xfb\xa1\x81\xfd\x3f\x2d\x7f\xfb\x4f\x86\xca\x31\x7a\xed\x7c\xdd\xa7\xe7\x38\x73\xed\x4f\xf3\xf0\x27\x59\x3b\xde\xec\xe5\xb6\xc2\xc3\xf2\xb5\xf5\xb5\x94\x7e\x52\x77\x55\xce\xe0\x6e\xe6\xd7\xed\xba\x94\xbc\x0f\x64\x8e\x3b\x77\xf5\x2b\x05\x5a\x4b\xb7\x0b\xee\x4d\xe6\x16\x3f\xb9\x71\x4f\xe7\x9d\x6e\x33\xa9\x85\xde\xfd\xa4\x7d\xd8\xfa\xea\x50\x9b\xf4\x5e\x9b\x76\x2a\x43\x3c\x35\x7a\xb2\xb7\xf9\xa7\xb4\xad\x93\x03\x73\x9a\xb6\x75\xe6\x5a\xda\xa6\x57\x86\x9e\xf7\x0a\x13\xdb\xee\x1f\x2a\xdf\xa4\xe5\xc7\x3c\x7d\x79\xa8\xfc\xbe\x6c\xbf\xf9\x1f\x20\xcd\x78\x97\xea\x06\x35\xe9\xf3\xce\x15\x43\xe5\x5c\xd7\x55\x73\x17\xc6\xfd\x7a\xeb\xaf\xa2\x33\x12\xee\x1d\x36\x77\xae\xd8\xe7\xd1\xb6\x07\xfa\xe5\x0c\xd3\x69\x3e\x66\x90\xeb\xe9\x24\xc0\x82\xf7\x51\x1f\xa3\xc4\x27\x04\x24\x51\xfb\xf4\xd6\x63\x60\x6d\x4d\x22\x56\x47\x8a\x23\xf1\x67\x6c\xa4\x38\x62\xb1\xf5\x8e\xc8\xfe\x44\x24\x46\xd4\x52\x18\x81\xed\x62\xd3\x77\x6d\xd1\xf3\x74\xa2\x63\x4c\xfe\x23\x92\x18\x95\x18\x30\xe0\x46\x51\x7b\x2b\x42\x0e\x72\xb2\x7f\xde\x83\x1d\x43\x0a\x64\x3d\x6b\xb5\x1d\xf6\xdd\x8e\xc6\x96\x88\x0d\x41\xbc\xbe\xb7\xe2\x45\xb2\xcf\x23\xa7\x30\xf1\x74\x22\x5f\x83\xe7\x48\x14\x93\x6a\xe7\x9f\x29\xfd\xda\xa1\xb3\xd4\xbe\xbe\xdd\xfa\xd2\xc0\xb9\x16\xa5\x07\x53\x43\xbc\xbb\xbc\x7b\x04\xe5\xc5\x64\xf0\xd3\xce\xaf\xbb\xbf\xe1\x27\x83\x9f\x45\x2c\xc8\xf6\x65\x66\x1e\x0f\xb7\xbf\x30\xff\xcc\xf6\xe5\xe1\xf9\xa0\xf4\x9e\x7f\xf9\xb5\x79\x7a\x2c\x3d\x27\xdb\x06\xe8\xbd\xc7\xb6\x94\xee\xf7\xc6\xf4\x8d\xe3\xf6\x92\x8d\xa4\xfc\x60\xaf\x79\x48\x65\x26\x99\xb7\xc1\x65\x03\xe5\x53\x7c\xab\xad\x34\x8b\xf2\xab\xfb\x0d\x95\xe3\x15\x26\x82\x97\x17\x90\x3d\xa7\x30\xb1\xed\x57\x43\xf3\xad\xdf\xaf\xa4\xbf\xcf\xf4\x70\x59\x83\x61\x3d\xf2\x2c\x3b\x24\xab\xb1\xbe\x78\x70\x5e\x7f\x53\x7e\xbf\xf6\x8d\x85\xf5\x48\x3a\x3e\x2f\x0e\xd5\x6b\x17\x26\x5e\xdb\xb0\x17\xdf\x92\x39\xf8\xcc\x50\x3b\xeb\xc3\xed\x79\x7d\xcf\x7c\x3d\xf8\xf2\x0f\x86\xe6\xd4\x4b\xdd\x93\xe2\xf2\xf9\xc9\xe7\xef\x8d\xae\xed\xb6\xfb\xe3\xab\x0f\xf7\x77\x2b\x1e\xd2\x2f\x73\xed\x7c\x61\xe8\xfc\xd8\x2b\x4c\x6c\xdd\x4a\xe9\xcf\xef\x25\x0f\xff\x38\xb0\x1e\xe5\xe8\x5c\x73\x39\x9f\xc6\x99\x1c\x3c\x90\x07\xba\xef\xd7\x9b\xc4\x17\x0d\xcf\xac\xf7\x8c\xb0\x9b\x1a\x19\x67\x90\xa1\x20\x45\x67\xad\x92\x61\x30\xf9\x3d\xf9\x8c\x6c\x41\x03\x69\xb6\x63\x8b\x8e\xa3\x44\xa6\x69\x69\x86\xe8\xa8\x2a\x51\x7d\xbf\x17\x55\xc7\x1a\x08\x71\xbe\xe5\xaa\x8e\x25\x2b\x9e\xe5\xfb\x3e\x71\xdb\x15\xc7\x10\xb0\x68\xb2\xd5\x76\x2b\x89\x1b\x2c\x11\x3d\x53\x23\x61\x39\x6a\x95\x61\xd8\xc1\xf3\xf9\xff\xfc\x10\x3f\xf5\x7e\x5e\x33\x6a\xbf\x6c\x59\x3a\x5f\x2f\xef\xdc\xb4\x80\x3c\xf7\xf9\xb9\x73\xcb\x7c\x5d\xba\xf3\xb9\x79\xeb\xca\xfe\x09\x3d\x3c\x00\x80\xc2\xc4\xe3\xb1\x94\xae\xdd\xf4\x67\xb0\x5d\x05\xd3\xbf\x1c\x5c\x47\xd2\xf2\x36\x0f\x9d\xbf\xbb\x85\x89\x57\x9a\x0b\xac\x8f\x6e\x61\xe2\xe9\xe4\x1c\x5c\xeb\xef\x95\xa6\x72\x06\xf7\x48\x61\x72\xd7\x67\xa2\xfc\x80\x5c\x58\x7d\x3b\x85\x0c\xc9\x5d\x1f\xe7\x33\xee\x71\x61\x4e\xef\xcc\x5b\x07\x37\xff\xc7\x00\x3f\x92\xf5\xeb\xb5\xde\x6d\x46\xff\xac\x29\x99\x37\x5b\x86\xda\xe9\xce\x93\xc7\xe7\xf6\xb2\x77\x36\xcf\x5b\xa3\xd2\xf5\xf1\xed\xb7\x87\xca\xbf\xb4\x7b\x02\x6d\xff\xe4\xab\xdf\xee\xbc\xdd\xfd\x53\x81\x6a\xce\x14\xd7\x80\x96\xf3\xea\xc7\x17\x58\xc7\xe3\xf6\xdc\xbf\x40\x7b\xdc\xc2\xc4\xab\x1f\x5c\x78\x3c\x37\xdd\xbc\x80\x5d\x16\x97\xf3\xc0\x10\xfd\x82\x44\x8e\xf8\xab\x37\x5f\x33\x0b\x4e\x1e\x57\x07\x79\x6a\x0e\x8f\xe5\xab\xbd\xfc\xfd\xd7\xa7\x3c\x9a\xf4\x3e\xdd\x89\xe8\x7a\x3d\xd9\xaf\x83\xf6\x19\x97\x86\xfa\xec\xf4\x30\x18\xb7\xde\x47\x79\x77\xef\xc0\x9c\xa5\xcf\xbf\xc8\x0d\x3d\x6f\x0d\xdb\x16\x33\xdb\x06\x64\x72\x80\xfe\xe2\x0b\x7d\x59\x19\xa2\x6f\xbd\x67\x61\x5b\xe4\xe5\x0b\xe6\xeb\x84\xf0\xde\xbd\x6c\x1d\x9a\x07\xf1\xe9\x7d\xe9\xda\xb5\x4f\x7f\x2d\x48\x75\x75\x52\xce\xa6\x9b\xe6\x8f\xfd\x4b\x47\xbe\x87\x0d\xec\x2e\x3c\x36\x6f\xdf\xb1\x90\x3d\xc3\x5f\xfd\x92\x1b\x81\x35\xb7\xc4\x63\xd0\x5f\x4f\xe5\xe1\xbe\x3d\xbd\x74\xfe\x3a\x94\xca\x75\x2f\x47\xe5\x7d\x69\x9f\x27\x3f\x67\x44\xc7\xf5\xac\x20\xda\xb7\x34\x7f\x75\xf0\x47\xba\x7f\x19\xc4\x23\x4d\xca\xa1\xeb\xc1\xb3\x73\xb9\x48\x95\x04\x73\x3b\xe5\xe9\x5d\x43\xeb\xc4\x9c\x7d\x77\xf7\x80\xed\x42\xe7\xe5\x5b\xd7\x0d\xcd\x4b\x63\x9e\xbe\xbe\x73\xbe\x4d\x96\x94\xbf\xf9\x17\xf3\xed\xd0\xad\x9f\x19\xe2\x91\xda\xb7\x05\x37\x0c\xd9\x5e\xfd\xb1\xdc\xde\x59\x78\x9d\xa6\xf5\x4e\xbc\xf1\xb7\xb4\xd7\x8f\xd2\xef\x6e\x4d\xea\xe0\xd7\x6d\x2b\x47\xbf\x07\xfc\x71\x5d\x75\x8e\x4f\x52\xf7\xc4\x9c\xcf\x3d\x5c\x98\x7c\x56\x89\x2c\x00\xe3\x9e\x98\x43\xfb\xac\xdd\xdf\x1c\xaa\xdf\xe8\xe5\x44\xdb\x45\x6f\x45\x9f\x2d\xcf\x9f\x6f\x49\xbf\x37\x7e\x76\xa8\xdf\x7e\x9f\xaf\x77\xec\xd5\x6f\x67\x2f\xbb\x85\xf2\x69\xeb\xed\x7b\xcd\x29\x2a\x93\x5b\x7f\x35\x8f\x4f\x5a\xee\x61\x9a\xab\x9b\x62\x55\xcf\x5c\x7b\xd8\x5c\x7b\x92\x5c\x23\x13\x16\x28\xe4\xb6\x4a\x51\xd0\xe7\xd3\xa0\x7c\xe5\xfa\xed\x19\x1a\x7f\xbc\x64\xa0\x7c\xba\xbe\x3c\x4d\x33\x63\x3e\xfd\x81\xa1\xfd\xa0\x5b\x98\xd8\xb1\x6a\xaf\xf6\x50\xbd\xbc\xf5\x97\xf3\x9e\x4f\xc6\x67\x12\x1f\x1b\x99\x80\xef\xf3\xdf\xa4\xe3\xec\xf5\xe4\x71\xeb\x6d\x43\x7a\xd9\xed\xd3\x6f\x1d\x2a\xc7\xef\xd1\x37\x3e\x32\x7f\xbd\x49\xe9\x7f\x9d\xd2\xa7\xba\x1f\xce\x5d\xca\xdd\x5c\x98\x7c\x3a\x1f\xb5\xbb\xff\x5a\x58\xbb\xfb\x1b\xd9\x7f\x52\xc1\x89\x6b\xe8\x99\xa1\x9a\xcb\x73\x36\x3d\x8f\xa4\xa7\x83\xc3\xfb\xd1\xb1\x04\x75\xb0\xd8\x60\x64\xcc\xea\x8a\x17\xb8\xae\x84\x7c\x5d\x93\x22\x23\x12\x0d\x06\x45\xd5\x2c\x0f\x4d\x82\x3b\x0d\x22\x04\x3c\xe6\x0d\x06\x30\x82\xd8\xa9\x93\xbc\x0f\xab\x4c\x49\xec\xcf\x1f\x3a\x0e\x6f\x26\xf6\xa3\xdb\xef\x87\x91\x53\xe9\xfd\xe0\x95\x74\x3f\xf5\x7a\xba\x6f\x4e\xef\x8f\xe9\x69\xcf\x64\x12\x03\x30\xdc\x2a\x8a\xbd\x03\x7a\xd0\x05\x0c\xbb\x94\x9e\xfa\xb0\x79\xcc\x68\x1a\x4a\x9a\x68\xea\x32\x31\x49\x89\x84\x36\x54\xa1\x14\xd5\x18\x89\xc5\xbe\x89\x0d\xaf\x6d\x20\x33\x40\x98\x73\x48\xd8\x69\x46\x75\x5f\x08\x05\x9d\xc9\x33\x62\x54\x89\x50\xe0\x63\x46\x84\x2d\x44\x42\xd2\x20\x25\x0d\x1a\x30\x2f\xcb\x24\x24\x2d\x1d\xf6\xf8\x4e\x73\x08\xbd\x49\xd7\xcf\x99\xeb\xfa\xfa\x41\x4e\xf0\xf5\xdf\xa4\x72\xf3\xdc\xf9\x03\xeb\x18\xc5\xbf\xdd\x41\xf7\xc1\x3b\x8e\x98\x6f\x1f\x6f\x5a\x1f\xd3\xdf\xde\xda\x1f\x3f\x3d\xe7\xc4\xf3\x61\x93\x4d\xf9\x31\x88\x53\x9c\xd4\xfb\x4a\x4c\x7f\xab\x97\xe7\xf9\xa1\x5e\xee\xd9\x57\xee\x58\xb6\xa4\xc0\xbd\xbd\xf5\x37\x09\xff\x8c\x24\x8f\x03\x38\x18\xac\x00\xe7\xd0\x78\x83\xe9\xa9\x45\xb9\x81\xd3\x87\x15\x45\x0a\x3a\xf7\x11\xb8\xa2\xc8\xa6\x5f\xf2\x03\xc7\x0d\xa9\x17\xcb\xd2\xe2\x8a\xa1\xd7\x56\xf4\x4e\x2d\xc6\x5b\x8c\x9a\xc7\x79\x56\xc9\xfb\xd8\x28\x89\x15\x4b\x55\xf3\x91\x29\xbb\x25\x82\x4d\xa8\x43\x20\x47\x75\x0b\xaa\x79\x94\x87\xb6\x85\x2c\x53\xb4\x1d\x95\x17\x1a\x06\xa9\xd8\x90\xd7\x49\x8d\x0d\x20\xe0\xfd\x3c\x0c\x78\xab\x64\xd8\x82\x6b\x68\x82\x9c\x27\xbd\xef\x1b\xd9\xa6\xaa\x69\x2a\x31\xeb\x22\x16\xad\x7a\xc5\xf2\x4c\xdf\x08\xdd\x48\x8b\xff\x8b\x70\x4d\x40\x82\x62\x41\x9b\x08\x75\x14\x42\x17\xb9\xaa\x1a\x39\x75\x11\x89\x9a\x0f\x4d\xc2\xd7\x62\x62\xcc\x9b\x65\xdd\x45\xb9\x2f\x70\x7f\x55\x98\x7c\x61\x69\xe7\xfb\xdd\xef\x14\xb8\x37\x5f\xbf\xed\xab\x43\x63\x48\x79\xb9\xf5\xd3\x03\xba\x88\xd2\x43\x7a\x46\xf0\xe6\x2b\xfd\x31\xd4\x13\x5f\x89\x78\x34\x78\xee\xe9\x2b\x16\xda\xe3\x0c\x8c\xa1\xd6\xa3\xbf\x75\xf6\x10\xdd\xe8\xd1\xdf\x6c\x0d\xd1\xcd\xae\x9c\x62\x01\x53\x1b\xfe\x79\x7f\xc8\xa6\x8d\xcb\xbf\x65\xe8\x79\x2f\xc1\xb7\x2c\x4c\xec\xa6\xb6\xe0\xa3\x77\x0c\xd4\x4b\xf1\x99\x37\x53\xaf\xda\xb7\xb7\x0c\xac\x09\x03\xfd\x9d\x79\xbe\x2f\x6b\x6a\x62\x9f\xcc\x7c\x91\xfa\x19\x50\x64\x97\xcd\xff\x32\x60\x43\x58\x85\x89\x5d\xd4\x2e\xdb\x75\xfe\x80\x7e\xa1\x77\x7a\x2f\xd3\xb2\x5e\x7e\x75\xa0\x0e\x5a\xf7\x1b\xdf\xa6\xd8\xcb\x5b\x06\x6c\x1a\x4a\x47\x67\x53\xfa\xe0\xfe\x84\xd2\x5f\x38\x77\x88\xde\xe7\x5d\xc2\x8b\xe0\xe2\x94\x7e\x54\x77\x22\xa6\xf3\xeb\x82\x23\xa2\xdd\xdd\x5f\x2e\x5f\xb1\xfa\x07\x05\xca\x91\x74\x2f\x98\xe4\x7d\xa5\x7b\x82\xd7\xbb\x7b\xcd\xb1\xea\x10\xff\xe2\xf1\x94\xe3\xbe\x6d\x97\x62\x5b\x7e\xfb\x24\xf5\xa2\x42\x03\xf5\xbb\xfd\xfa\x3f\xd1\xb7\x3b\xd3\xfc\x53\xcf\xd3\xbc\x00\x5b\xa9\x95\xb9\xf1\xe1\x7e\x1f\x07\xf8\xbb\xeb\x88\x81\xb5\x90\xd6\xff\xda\x1d\x0b\xcb\xc1\x73\xdb\xe6\xcd\xfd\xb4\x1f\xaf\xd1\x35\xaf\xcf\x93\x04\x77\x3b\xd6\x91\xc1\x10\xaf\xd4\x5e\x39\xaf\x3c\x39\x54\x4e\xa5\x47\x7f\xfd\x4f\xf4\xf9\xad\x03\xf6\xa2\xcc\x69\x85\x89\xcf\x25\xb9\x5d\x7a\x7b\x94\x97\x07\xf9\x57\xc8\x7d\xee\x7d\x9d\xed\x80\x4f\x75\x33\x3d\xd3\xd8\x4a\x75\xd4\xd6\x9b\x16\xda\x73\x16\x86\xe9\xb4\xde\x1d\x95\xb9\xf6\x80\x0c\x38\x8f\xb6\xe7\x0e\x7a\x66\xbe\x84\xfa\x4b\x0e\xa0\x6e\xc1\x29\xba\xe2\xe4\x06\x8e\x45\xe3\xf5\x66\x74\x3c\x05\xbb\xc8\x15\xc7\xc6\xe9\x83\xe3\x5c\x6e\x3c\x3b\xc2\xe5\x96\xc1\xc5\xb1\x1e\x3a\x66\xb2\xc8\x2e\x1d\xcb\x4e\xd2\x68\xef\x15\xe3\x69\x78\xf3\x72\xf6\x9e\xcf\x1e\x3d\xf5\xd9\xb3\xa3\xd6\xc9\x47\xdd\xbf\xe8\x42\x76\x7d\x05\xc3\x50\x95\x90\xe5\x8b\xc8\x52\x64\x9e\x34\x89\xeb\x40\x3d\x5f\x89\xfe\xeb\xa9\xd1\x83\xe1\xcb\xe4\xac\x13\x98\x0f\xff\xdd\x55\x8f\x5e\xb5\xeb\xfe\x6e\xe1\x1c\x1e\xfe\xe6\x40\x1b\xe7\x3f\x0d\x47\xf7\x61\x59\xf2\x3b\x06\x36\xa3\xf2\xe9\xf0\x84\x13\xae\xff\xfc\xb9\xdf\x86\x1f\x3c\xe4\x48\xf2\x0b\x38\x7d\x04\x77\xb1\xfc\xc8\xa7\xb4\x4f\x6e\xd0\xf1\xea\xcb\x7c\x12\xc5\x2b\x5f\xbb\x56\x0f\x45\x24\x56\xd9\x52\x47\x21\xbe\x03\x75\xd6\x86\xb3\x8b\xc3\x67\x1f\x9f\xf1\x5e\x7c\xfe\xa1\x7f\xff\xd7\x33\x6e\xce\x90\xef\x3c\xc0\xe7\x5e\xe0\xa4\x03\x57\x1c\x4c\x8e\x7b\xfa\xb9\xbf\xfb\x04\xa3\x6a\x2b\x6e\x7b\xfd\x75\x6f\xdf\xcd\x8f\x7f\xa5\x3f\x1f\xe2\x75\xe2\x5b\x43\x63\xdf\x97\xa1\xad\xdc\xd0\x58\x5e\xde\x3d\x29\xe7\x70\x1b\x0a\x93\x6f\xae\xec\x3c\x11\xef\x13\xe3\x37\x06\xe7\xe1\x56\x7b\xa8\x1c\xa3\x3f\xdf\x4e\xde\x6b\x1e\x26\xf3\xed\x85\x21\x19\x9a\x37\xa7\xde\xbc\xb6\xbf\x07\xd2\x72\xaf\xd0\xf9\x3f\x96\x1d\x8b\xdb\x73\xcc\xbc\xf9\x9f\x3c\xff\xf2\xbf\x0f\xc8\xdc\x00\xfd\x95\x2f\x0f\xf5\x4b\x2d\x4c\xec\xa6\xf3\x69\x3b\xf5\x02\xd8\xfe\xe3\xe1\xb2\x76\xfc\x61\xa8\x0f\x5a\x12\xb3\x56\x98\xd8\xfc\xcf\x74\xf6\x79\x43\xba\xc4\x2d\x4c\x6c\x7c\x70\xa8\x6f\xfd\x3e\xbf\x78\xed\x50\x39\x77\x76\xd7\xc4\x74\x7e\x1d\x3a\x2e\xfa\x6c\x77\xf6\xf8\x9f\x51\x5d\xb2\xa5\x3f\xd7\x12\x1f\xc7\x24\x5f\xc8\xef\xfb\x7b\xa1\x9e\x6c\x1f\x41\x75\xe5\x59\xf1\xb7\xe1\x58\xdf\x66\xa4\xeb\x03\xbe\x9a\xb6\xeb\xa1\xf9\xfa\x3b\xd1\x25\xdb\x2e\x1f\xb0\xe9\x68\xbb\xde\x7a\x68\xa8\xbd\x6e\xef\x0c\xf1\xf9\x47\x69\xae\x0d\x7a\xca\xfb\xf6\xa6\xb4\x8e\x54\x8f\x6e\xfe\xd9\x50\x5f\xfa\xbc\x7a\xf1\x17\x43\x74\x97\xfa\xd9\xdb\x85\x89\xc7\x7f\x41\xe7\xe8\xcd\x43\x3c\x89\x75\xc9\xf8\xd0\xf3\x72\x8f\xfe\x36\xdd\xff\x6f\xbd\xb1\xcf\x2b\x2d\xe1\xd5\x6b\x7f\x88\x7e\x00\xf6\x3d\xfe\x9b\xab\x0f\xec\xf3\xaa\xcf\xf7\x64\x6c\x37\x3e\xd8\x97\x91\x35\xb9\x27\xe3\x77\xb6\xfc\x2a\x3a\xbc\x3b\xbb\xea\x9f\x56\xbf\x1b\xf7\xf2\x40\x30\x98\x43\x20\xad\xa7\x77\x77\x7c\x55\xda\xbf\xc9\x47\x7f\x12\x5d\xd5\x5b\x41\xfa\xfd\x73\x0b\x13\xe8\x7f\x0f\xad\x2b\xd7\x25\xcf\xf3\xeb\x9e\xd9\x10\xcd\x00\xb0\xea\xe9\x78\x2f\xf3\xf6\x73\x03\xed\x8a\xf5\xd3\xf5\x43\xeb\xa0\x42\xfd\x51\xec\xc2\xc4\xb6\x2c\x95\xd1\xa9\x3e\xaf\x7a\x39\xaf\x3e\x35\xf4\xbc\xd5\xcf\x79\xd5\xa1\xb8\xf7\xd4\x03\x71\xf7\x19\xe9\xd8\xa6\xef\x7c\x2e\x1a\x7a\x47\x1b\xee\x5f\xf8\xfe\x01\x5d\x9d\x8c\xf9\xbb\xf4\xf9\xe7\xfa\x3a\x5f\xc9\x7d\x87\x7b\x9a\x5f\xb7\xed\x27\x60\x7f\xe6\xe7\xc7\x18\x47\x6d\xe3\xd7\x6d\x79\x07\xfc\x9e\xf9\xf2\x92\xc3\x97\x1e\xca\xaf\x7b\xe2\x74\xe6\xe0\xee\x6b\xf2\x59\x27\x69\xc9\x28\xa6\x7b\x85\x24\x7f\x70\xc2\xc3\xeb\x86\xd6\x89\x7e\xdd\xcf\x51\x88\x9b\x14\x2f\x55\xa1\xf1\xd8\x69\x5e\x44\x66\xe0\xae\x9b\xc9\x4d\x02\x46\xc4\xbc\x98\x09\xfc\xb2\x53\x92\x9a\x96\x29\x28\xed\x52\x50\xb3\xa1\xc8\xb9\x92\xa6\xb5\x15\xa2\x09\x58\x44\x90\x67\x03\x52\xaa\x38\x50\x4a\xfc\xeb\x8c\x9c\xc4\x39\xe9\xfd\xf4\x5c\xa9\x99\xf4\xb2\x2a\x37\x09\xb2\x49\x94\xae\x83\x25\x39\x63\xb9\x25\xd4\x90\xa0\xe4\xea\x82\xd4\x6e\x05\x55\x07\xaa\x30\x0f\xf3\x35\xb7\xd6\xe2\x1c\xd9\x32\xdb\x0e\x31\x95\x40\x71\x5b\xac\x4d\xea\x25\x17\xca\xad\x52\x17\x20\x28\x94\x7b\x32\xa0\xc4\xe3\xb0\x0f\xdd\x3b\xcc\x7c\x7f\x40\xf6\x07\xe9\xd5\x05\xe9\xa7\xce\x7c\xb6\xfb\x89\xee\x2f\x4f\xdc\xac\x2e\xf4\xce\xf7\x16\x2e\x6b\xe3\x03\xef\x51\xc7\x77\x07\xe8\x95\x81\xe7\xef\x9f\xff\xfc\xcc\x77\x62\xfa\x3e\x41\xba\x06\xf6\xc6\x80\x05\x39\xb0\x88\xfa\xba\x4f\x8d\x8c\xaf\xa0\x37\x19\x5c\x2e\x01\xce\xc9\x26\x39\x11\xf7\x1e\x1e\xa8\xf9\x3e\xcc\x64\xda\x1d\x06\x21\x41\x86\x72\xdd\x6a\x74\x81\x4b\x6a\x06\x2c\x93\x1b\x17\x1e\x39\xb6\x18\x59\x1e\xca\xec\xcf\x23\x1b\x55\xdc\xba\x57\xf5\x9d\x2a\xbb\xe9\x3d\x46\xb3\x87\xf7\xad\x50\x7c\x8a\xa5\x00\xc0\xf1\xe9\xc4\x6f\x2a\xf5\x1c\x19\xdd\xab\x59\x34\xa3\xc0\x73\x1e\xac\x8b\x12\x52\x44\xe8\x45\x3c\x53\xe9\xe0\x8f\x62\x41\xca\xf2\x7e\xc5\xc2\x52\xcd\x30\x05\xb9\xad\x59\x9e\xd3\x60\x4d\x64\x9b\x92\xed\xa1\xc8\x42\x9c\x26\xea\x7a\x5b\x23\x9a\x18\x88\x3e\x04\x2c\x0e\x6c\xbb\x9a\xec\xf7\x6c\x8a\x03\xb2\x88\x22\x4e\xcc\x93\xd3\x24\x7b\x27\x18\x1d\x59\xb4\x7f\x51\x9c\x03\x5b\x1c\x29\x8e\x50\x9c\x7e\x11\x09\x72\xc6\xb6\x91\xa8\x48\xa6\x28\xcb\xed\x86\x5f\xb2\xa1\x14\x98\xd0\x61\x34\x9f\xc7\xb2\x6d\x44\x36\x11\x11\x6b\xe1\x78\x0f\xc8\x79\xa2\x65\x74\x02\x52\xc9\x07\xf9\x3a\x63\x37\xb1\x05\xf9\x4e\x85\xb8\x12\xaf\x07\x4a\x5d\x93\x55\x9b\x6d\x46\x21\x2c\x11\x8a\xd7\xa6\x51\x5b\xd1\x06\xc7\xd0\xc8\x5c\xda\x2a\x76\xe8\x56\xb6\xef\xe4\x74\x02\x5c\x0d\x13\x67\xa7\xd4\xe5\x2c\xde\x60\xc5\xa3\x47\x1d\x29\x38\x26\x8f\x45\x29\x53\xd5\xd5\x9a\x1d\x4a\x0d\xd3\x14\x95\x2e\x90\x6c\xcf\xb6\x2c\xbb\x42\x02\xcb\xa9\xa8\x4e\x0b\x13\xdf\x82\x6a\x60\xda\x9a\x6d\x29\x02\x69\x7a\xbc\x61\x39\x50\x82\x4d\xcf\x36\x45\xd2\x14\x39\x5b\xb4\xcd\x76\x48\x5a\x35\x21\x10\xec\x2a\x1b\x12\x87\x34\x4c\x0b\x99\x26\xc1\x2d\x5f\xaf\x98\x25\x4c\x6a\x75\xaf\x04\x05\x45\xf1\x65\xc5\x2f\xd7\x45\xdb\xb4\xa1\x44\x90\xa6\x37\xa0\xde\x58\x40\xce\xef\x1b\xd8\x6f\x2b\x74\x3e\x1f\x96\x60\x65\x2f\x34\xe2\xd9\xc1\xe4\xda\x09\x28\xec\xf2\x6c\xea\xbb\x04\x2b\x0b\x0f\x7e\xde\xb5\x3d\xcf\xb6\x6d\xd7\xc3\x36\xf6\x7d\x6c\x23\xcf\x8d\x00\x66\x11\x6e\x4b\x9c\xb3\x80\x34\x94\xb4\x20\xf0\x7d\xdb\xf7\xe9\x0f\xe4\x19\x9e\xeb\x6b\x91\xcd\xe0\x4e\x25\xd5\xaf\x56\x6c\xbb\xcf\xfc\x03\x9d\x8f\xef\x0e\xd8\x00\x0a\xbd\xeb\xa4\xf7\x2c\x33\xff\xeb\x3d\xe8\x34\x76\x20\xc5\x85\x8d\xfb\xbb\x0f\xe0\x81\x00\x0e\x06\x47\x27\x7d\xde\x3f\x9b\x5b\x42\x51\xc0\x72\x43\x01\x9f\x23\x45\x76\x41\x86\xb0\xfb\x22\x41\x68\x41\xd9\x24\xf5\x2e\x68\x92\x86\x0e\xd1\xd1\xb0\x41\x04\x66\x67\x3f\x12\xfc\xf2\x05\xd9\x92\xdd\x47\x11\xc4\x86\x8b\x10\x04\xa4\x85\xfc\xc6\x6e\xff\x82\x48\x77\x1c\x26\x24\x06\x14\x32\xcf\x2e\xc0\x96\xbd\xfb\xbe\xf1\xde\x81\x35\x27\xa1\x9f\x4e\xfb\xf8\x0f\xfd\xb5\x3e\xb5\x97\x66\xe8\x5d\xde\x0c\xf5\xfd\xa7\xf9\x5b\xe9\xd9\x57\x7a\xa3\x7a\x38\x38\x12\x1c\x9d\xa2\x08\xc5\x9d\x1c\x80\xb2\x1b\xe9\x61\x09\x4d\x2e\x1f\x4d\x53\xb8\xb2\x09\x14\x4d\x3f\x5c\x77\x84\xa6\xcb\x2d\x8e\xc1\x00\xf1\x42\x56\xcb\x3b\xbe\xaa\x09\x86\x2a\xf3\x72\x5b\xca\xcb\x19\xd0\x0e\x14\xd5\xa9\x89\x6c\xad\x23\xf9\x4c\x29\xd2\x4c\x9c\x29\xe1\x0e\x85\x83\x62\xf2\xd0\x26\xbe\x4f\x3c\xce\x11\x15\x65\xb6\x46\x3c\xc1\xe7\xad\x66\x46\xca\x9b\xae\xa6\x3a\x15\x52\x27\xbe\xe3\x76\x64\x2d\x7e\x4f\x83\x4e\x2f\x8c\xd4\x05\x0b\xf0\xe2\x9e\xbd\x78\x91\xd0\xe9\x39\x13\x8d\x2d\x3d\x33\xf7\x3d\xce\xa1\x78\xf0\x07\x80\x23\xc0\x1a\x60\xa4\xb8\xce\x3d\x74\x63\x2a\xd5\xa3\x53\xd3\xe3\x23\x53\xd3\xe3\x70\x6c\xd1\x71\x70\x2c\x71\xf9\xe4\xa8\xc7\x27\x4b\xa7\xf4\x74\x71\x6c\x78\x0a\x2c\x3c\x51\xa0\xcd\x00\xe2\xdb\xa6\x20\x3a\x86\xea\xf1\x42\x80\x34\xbf\xd1\x68\x34\x32\xcc\x47\x3f\xfb\xc6\x9a\x93\x48\x94\x7b\xf9\x9c\x73\x8e\xcf\xe5\x5e\x7a\x74\xcd\x47\x88\xc8\xdc\x77\xdc\xe9\x77\xad\xbb\xf0\xce\xbb\x5e\xfa\xfe\xe9\x2f\xdd\x76\xe3\x8d\x51\x77\xe7\x81\x47\x64\xef\xde\xf2\x4f\xeb\x77\x7c\xe4\x37\x97\x5d\x73\xe0\x31\xb3\xf5\xf5\x1b\xef\xed\x64\xae\x8d\x64\x82\x24\x59\xd3\x94\x72\x43\xd1\x35\x43\xd1\x59\x07\x13\x35\x80\x4f\x7d\xee\xc2\x67\xaf\xb8\xf0\xc2\xc6\x09\x57\x7c\xf4\x33\xdb\x22\x6f\xfa\x84\x53\x4f\x7d\xec\x81\x3b\x2f\x3c\xe1\x84\x3b\xf5\xd5\xd7\x4d\x3f\xb0\xe4\x84\x8f\x2c\xc9\x0a\xa2\x7e\x76\xfb\x0c\x72\x9a\x18\x88\x8f\x43\xc0\x3e\x1f\xdc\x78\x63\x95\xe2\x86\x51\x7e\xf5\x11\xc3\x4e\x00\x6b\xc0\x5a\x70\x3a\x38\xab\x87\xf5\x3e\x70\xf5\x97\x84\x16\x4e\x4f\x0d\x00\xe1\x52\x30\x5c\x26\x37\xb9\x64\x74\x2f\xd5\x98\x8d\x25\x66\x6a\x7a\xbc\x17\xe4\xce\xdc\x8e\x05\x11\xe6\x4d\x4b\x33\x05\x57\x55\xcb\xc4\x55\xa1\x52\x26\x9a\xe7\xcb\x0a\x94\x49\xb5\xf7\x19\x09\x2a\x16\xe4\x11\xe6\x85\x2c\xd0\x95\xb2\xa4\x88\x86\x64\x88\x72\xb4\x19\x56\x89\xec\x55\x2a\x41\x3c\xab\x3c\x08\xba\x20\x9b\x15\x15\xb9\x5d\xd7\x75\xc1\xe5\xd5\x66\x3d\x74\x9d\x92\xcd\x38\x1a\xa9\x5b\xa4\x62\x93\xb2\xcd\xfc\x94\x34\xb0\xd3\x80\xb6\x24\xc9\x6d\x8d\x34\x6b\xbc\x9f\x77\x9a\x99\xfc\x6e\xa2\xda\x75\x22\x10\xd1\x86\xb1\x7d\x04\xad\xae\x9f\x13\x39\x93\x22\x2c\x4e\x8d\x2c\x59\xba\x18\x64\xe9\x4a\x93\xe6\x11\xa2\xb8\xbe\x16\x66\x0c\xd8\xb2\xa2\x5a\x64\x7b\x50\x86\x6e\xc9\x14\x42\xd9\xad\x11\x89\x98\x25\xce\x8c\xb4\xb0\xe5\x77\x41\x29\x72\x24\x49\x41\x50\x90\x49\xa9\xaa\xea\xd6\x50\x7e\x31\x7a\xdf\xbd\x83\x9e\xdf\x02\x06\xd8\x5d\x33\x87\x39\x0b\xec\x4b\xd7\xdb\xa9\x91\xf1\x11\x8a\x7d\x93\xde\xaa\x52\x7c\x9c\x39\xb0\xf4\x04\x3e\x88\xc1\x18\xd7\x49\x53\x85\x32\x04\x51\x83\x11\x60\x0d\x43\xbe\x69\x91\x06\x09\x35\x84\x92\xa4\x46\x4e\xa3\xe5\x71\x56\xab\x05\x4b\xd8\x09\x3d\xcc\x88\x18\x56\xa3\xc0\x0b\xfd\x8a\xdf\x69\x89\xa2\x64\xd7\xe5\x2e\xc0\xaa\x46\xb1\x41\x1a\xbd\x5c\x70\xe1\xa5\x34\xf6\xa8\x3b\x70\x07\x42\xf7\x40\x33\x1f\x88\xdb\xbc\xf3\x9b\xa9\x1d\x59\xed\xfa\x39\x9b\x62\x61\xf4\x11\x6d\x73\xe2\xac\xce\x81\x3d\x26\xa7\xa0\x59\x0f\x71\xc9\xd9\x7a\xfa\x5c\x61\x62\x9f\x6f\xc7\xf6\xd7\xe3\x2f\x76\x2f\x05\x7f\x58\xfd\xf5\x95\x93\x7b\x7d\xc7\xed\x70\xd2\x3a\xe7\xd3\x6f\x9b\x47\x9f\x9c\x81\xdd\xab\x20\x5b\xe0\xe2\xef\x17\x78\xfe\xd3\x0b\x97\xb3\xf1\xee\x85\xe9\x6f\x2d\x79\x0f\xfa\xe1\xef\x41\x9f\x98\x4f\x7f\x6b\x29\xb5\xef\xbe\x3d\x4c\xe7\xd7\x3d\x2c\x81\x33\xa1\xa1\xfe\x6c\xcd\xaf\x87\xda\xea\x0d\xb4\xe9\xae\x74\x0d\xaa\x76\x9f\xce\xd9\xdc\x2a\x30\x06\x0e\xa5\x08\x54\xc7\xcd\x65\x45\xfc\x10\x4c\x42\x7d\xb3\x93\x4b\x46\xa6\x8b\x43\xeb\xee\xd2\xc1\x7f\x50\xa7\x97\x74\x2c\xe0\xef\x18\x80\x18\x2d\x2a\x55\x60\x5d\x23\x4a\x0d\x13\xdd\x60\x74\x02\xd8\x1a\xe2\x63\x3b\x40\x37\x15\xc5\x72\x23\xc1\x17\x44\x4d\xb5\x65\x45\x33\xac\x12\x7c\xde\xf7\xd9\x8f\x24\x63\x98\xf9\x84\x69\xfa\xbe\x4a\xaa\xae\xef\x40\xa1\x19\x78\x55\x28\xfb\x82\xa8\x28\xba\xe5\x58\xba\xa6\x98\x4e\x20\x6a\xaa\xa2\x3a\xaa\x64\x69\x16\x66\x9c\xa8\xca\x1e\xd2\x1b\xf6\xa4\x3f\x89\x7c\xf4\x10\xce\xe8\xb9\xfd\xd8\xd4\x48\x2c\xdd\xe3\x4c\xbc\x88\x8c\x27\xd8\x4e\x29\x0e\xd1\x40\xdb\x19\xfe\x99\xea\x33\xcf\xbc\x36\xf2\x3f\x9f\xac\xf0\x8f\xc2\xaf\x93\xcd\xcc\x79\x8c\x1f\xd9\x27\xb2\x62\xa7\x0e\x8f\x79\xed\x35\xf8\x4e\xda\xc6\x9f\x7f\x17\xde\x3c\xfb\x0d\xe6\x00\x62\x79\xee\x95\x70\xd5\x3d\x3b\xa3\xef\xf9\x2c\x8f\x18\xa5\xfd\xb1\xec\x27\xfb\x8d\x61\x41\xa5\xeb\xe6\x6c\x4e\x07\xa3\x14\x67\x2d\xc1\x10\xea\x63\x9b\x26\x98\x52\xec\x00\xb6\x02\x6d\x57\xaf\x2d\x67\x22\x28\xc5\xff\x13\x95\x51\x67\x9b\x8c\x42\x54\x1e\x56\x11\xac\x11\x89\xd1\x67\xab\x8c\x46\xe4\xcc\x4f\x67\x0d\x0e\xec\x31\xb2\x2f\x92\x06\xd4\x49\x08\xf3\xc4\x0e\x7c\x3f\x20\x87\x85\xa1\x1f\xfa\x7e\x98\xf9\xbc\x37\xab\x7a\x5c\x75\x41\x99\xbc\x33\x1d\xff\x1b\xba\xa7\xe7\xf6\xcb\xfe\x3e\xcd\xf7\x31\x0a\x8e\x99\x97\xed\x23\x6d\x4f\x96\xaa\xd6\xb9\xf3\xb1\x14\x92\x9e\x46\xfd\x8f\x53\x21\x78\x33\xe3\xb4\x3d\xc4\x6a\x9d\x52\xfc\xc9\xdc\x91\xf0\x8a\x39\xee\x69\x61\x19\x7b\xc8\x55\x4f\x9f\x7a\xf5\x21\x37\x9c\xb5\x62\x19\x7f\xf6\x6e\xb2\xfe\x06\x68\x7e\xe5\x2b\x1b\xc9\x8f\xae\xfe\xc3\x03\xaf\x7c\xe2\x86\x1b\xfe\x8d\x51\xa2\x3a\xd4\x74\xd2\xd4\xb2\xef\x4f\xd8\x77\xe5\x81\x6b\xd6\x44\xcd\xf2\xa2\xbb\x16\x5d\x03\x6f\x22\x8f\xfd\xea\xe3\xdf\x85\xcb\x49\xf7\x85\x8f\x3f\xf2\xb5\x4b\xd6\x9c\x7f\x7f\x72\xbe\x48\x79\x5b\x98\xd8\x71\x53\x3c\xbf\x1f\x69\x74\xff\x08\xfe\x7d\xe5\x69\x2b\xb7\xa4\x7d\xc5\x74\x7e\xd0\xfb\xc7\x74\xf6\x48\xf3\xe6\xce\x61\x0b\xcd\x9d\x3e\x7f\x3e\xf3\x1e\xf4\x0d\xfd\xf3\xcd\x5e\xfd\xf4\x14\x76\xc7\x4d\xa9\x5d\xd3\x93\xbf\x78\x85\x4f\xf0\x57\x0e\x03\x1f\xa5\x99\x77\xfa\x11\xba\xb1\x7d\x37\x39\x9e\x2c\x64\x3d\x93\x06\xce\xcf\x52\xdf\x93\x83\x43\xe1\xc6\xa3\x0e\x7b\x42\x10\x99\xb5\xe4\xfe\x7b\xe1\xd4\x39\xe4\xfe\x7b\x6f\x7f\x83\x6c\x39\x0d\x1e\x74\x2f\xf9\xca\x83\xac\xdb\x71\xe9\x74\x23\x88\x31\xa2\x00\x43\x81\x34\x18\x29\x26\x20\x0a\x8e\xd9\x48\x46\x21\xfb\xbe\xe3\x4e\x3e\xf4\xa8\x8f\x5c\x60\xcb\x97\x9e\xb6\xfb\x8b\x17\x5c\x70\xf2\xa7\xc9\x9f\xc8\xf3\xeb\xef\x21\xbb\xc8\x63\xeb\xfd\xf5\xf1\x8f\xcc\xd7\x52\xc1\x5d\x40\xaf\xdd\xf2\x1e\xbc\x48\xf2\x00\xec\xd3\x97\xf3\x61\xdc\xcf\x23\xc0\x32\x30\x0d\x8e\xa3\x88\x7d\xf3\xa4\x7c\x71\xba\x2c\xf7\x72\x24\x67\x53\x89\x1b\x4b\x3f\x87\xc0\x81\xb3\xd9\x9e\x66\xf9\xdf\x8c\x40\x8d\x59\x58\x6f\x87\xb0\x16\x35\x96\x64\xbc\xb6\xb3\xf9\xef\xff\x1e\x9e\xff\x15\xef\x2b\x9d\x0b\xd9\x56\x27\x4f\x73\xc6\xf7\x3e\x81\x56\xaa\x29\x65\x46\xae\x84\x72\xb9\xcc\xa8\xe9\x64\xd9\x74\xd2\x49\x57\x9f\xfc\xa9\x4f\x9d\x5c\x23\x35\x73\x5d\xfc\xdf\xff\x44\x21\x0c\xd4\x9a\x52\x53\xcb\xa6\x22\x5a\x82\x2c\x48\xb6\x2c\x72\x1f\xec\xcd\x1d\x90\xeb\x8f\x69\x6f\x3c\x57\x83\xf3\x28\x86\x1c\x35\xbf\x16\xf7\xe2\x7b\x8a\xc3\x18\x29\x70\xba\x38\x96\x4d\x3f\x39\xfa\xd8\xfc\x1c\x31\xec\x54\x1a\xa9\x3f\x35\x36\x4e\xed\xd7\xf1\xe9\x39\x5d\x74\xf7\x51\xc7\x9e\xfb\xe6\x69\xf7\xf1\x23\x70\xd9\x01\xc2\x23\x87\x09\xd0\x21\x0e\xbc\x8c\xbc\x48\x3f\xdb\x3a\x0c\x7c\x87\x7c\x1d\xae\x4e\x3e\x2f\xff\x10\x5d\xfc\xf0\xe7\xe1\x01\xe4\x57\xcc\x2b\xa4\x96\xa0\x4c\x75\x8e\x3b\xf7\x9d\x27\xe0\x67\x9e\xf8\xcf\xff\x7c\x82\xdc\xff\xc4\x3b\xd9\x0f\x24\x92\xc0\x6e\x5c\x35\x7d\x7b\xf0\xf9\x89\x89\x0f\x7f\x78\x62\x62\x7a\xfa\xba\x55\x17\xaf\xba\xf8\xe4\x2b\xe1\xe6\x55\xab\xd0\xaa\x55\x2f\x9c\x7c\x72\xb9\x38\xfd\xf1\xe9\xd1\xd3\x2e\xb9\xe4\xec\x2b\xf4\x4b\xc8\xda\xec\x31\x97\x5e\x7a\xe9\xa5\x37\x9d\x76\x9a\xae\xc3\x8f\x24\x02\xb2\x80\x1c\xdc\x9e\xae\xcd\x4e\x37\xcc\x79\xd9\x32\x78\x5f\xb2\x7b\x4f\xba\x02\xed\x56\x8e\x9f\xf5\xb2\xe2\xac\x9a\x95\x10\x6a\x8b\x68\x41\x59\x72\x52\x9b\x64\x6e\x7d\x3f\x68\x6e\x85\x87\xfd\xe5\x06\x4e\x2e\x87\x13\x4b\x57\x64\x16\x2f\xcf\xc9\xb3\x2a\xd5\xc6\x35\x84\xca\xb5\xb2\x5b\xaa\x62\xe2\x99\x4d\xc8\x37\x48\xcb\x85\xa0\x16\xf6\xcc\x01\xd2\xd2\x5b\xcd\x5a\xc3\x6d\xd4\x2a\xa4\xe1\x63\x28\x35\x6a\x66\xb5\x5a\x5d\xa0\x0d\x83\xeb\xbd\x3b\x40\xbf\xf5\x3d\xe4\xff\xd3\x7b\xe9\x82\x9b\xe8\x7c\x59\xff\x1e\xf6\x84\xfd\x1e\xe5\xdc\xd2\xe7\x5f\x82\xc1\xf3\x81\xde\x1d\xf8\x18\x85\x69\x70\x58\x19\xb3\x6a\xa7\x8c\x3b\xd5\x4c\x9e\xb1\x23\x1f\xb5\x6b\x19\x89\x62\xeb\x1b\x39\xc4\x09\x80\x4d\x70\xe2\x92\x7c\x2a\x85\xd1\x3e\xda\xe3\x24\xc3\x16\xb3\x53\x23\xe3\xbb\x32\xe5\xb6\x7a\x44\xb6\x9c\x97\x45\x49\xce\x23\xd1\xd4\x1d\xd5\xc8\xcf\xd6\x98\xd3\x31\x66\xd7\x63\xf6\xd4\x76\x99\xb4\x2a\x2d\xb9\x8e\x6a\x50\xce\x48\xf2\xac\x98\xb4\x27\xc1\xee\xd7\x41\x81\xda\xe1\xd9\x5e\x7b\xa6\x8b\x23\x99\xec\xe4\x12\xce\xf1\x4a\x24\xcf\xca\x9d\x2a\xee\xd4\x58\x89\xb4\x08\xb6\xd8\x32\xa7\xfb\xb2\x42\x78\xd4\xb1\x59\x1f\xc1\x9a\x20\x60\x2d\xed\x9b\x9e\xf3\x38\x13\x8c\xce\x43\xf8\x4e\x91\xd4\x1c\x58\xc2\x8c\x89\x61\x89\x68\x38\xc2\x98\x68\x2c\xee\xcd\x63\xd4\xd1\xd8\x52\xfc\x49\xf1\xeb\x12\x9c\xb2\x43\xe6\xaf\xa7\xbd\x92\x7a\x9e\x02\xd3\x45\xe8\x06\xd0\xc7\xd0\xa3\x5a\x11\x13\x07\x13\x9b\x94\x3c\x28\x91\x06\x14\x38\x3d\xb2\x63\x56\x32\x38\x32\x51\x47\x64\xeb\x1d\x93\xc5\x66\x54\x23\xd8\x86\x2a\xac\x99\x08\xf4\xfd\x53\x9d\xc2\xc4\xae\x2f\xd1\x15\x64\x3c\x1d\xa7\x24\x6e\xda\x49\x30\xd8\xb9\xdc\x60\x0b\xe6\x6a\x1f\xe1\x72\x93\x4b\x32\xaa\x56\xaa\x32\x3a\x86\x3e\xb1\x71\x14\x92\xbc\x05\x4b\x44\x82\xb5\xb0\xac\xc0\x26\x67\xf8\xaa\x4c\x44\x16\x44\x00\x75\x2c\x16\x49\x51\x83\x84\xb1\x61\x1f\x4a\x08\x96\x24\x11\x69\x69\x0e\x0b\x44\xcf\x44\x92\xdc\x6d\xc5\x81\x51\x48\xce\x4d\xf9\x40\xcd\x78\x91\x13\x5b\x29\xb8\xe3\xb3\x36\x31\x5c\xcf\x83\x79\xce\x51\x42\x3f\x6a\xa2\x4e\x33\x36\x4d\x78\xd2\x40\x16\x54\xe7\xce\xd9\x5c\x2a\x67\xc5\x61\x49\x63\xe7\xf1\x33\xb9\x7f\xaf\x31\x55\xcc\xd4\x22\x09\x47\xb2\x01\x4d\xcc\x0a\x18\x6a\xa4\x84\x3b\x75\x81\xd8\x16\xd4\x45\x12\x64\x6d\x98\x27\x2d\x44\x74\x18\x46\x89\x2d\xa2\x93\x10\x45\x32\x53\x8d\x9a\x55\xb7\x04\x83\xe4\x7c\x27\xbd\xeb\xed\xa1\x78\x8f\x0e\xc6\x85\xa5\x3d\x1a\xbc\x95\xab\x31\xb5\x80\xa9\x46\x72\x2c\x62\x41\xa7\xc2\x2a\x91\x94\xb5\x7c\x17\x39\xa8\x03\xb0\x89\x0c\x94\xe1\xe9\x6c\x88\xab\x0a\x19\x1d\x41\x9d\x09\xb5\x96\x67\xa3\x12\x2e\x1b\xe5\xb4\x4e\xbb\x7b\x76\x9a\xb3\xff\x90\x39\x74\xf9\x85\x7a\x4b\x4f\x59\xe8\x3a\x3c\xd0\x5f\x0b\x7a\x98\xa9\x63\xe8\x11\x07\x47\x22\x26\x0e\x23\x31\xf5\x48\x1c\xec\x6f\x8b\xa2\x7a\x83\x2e\xb8\xac\xf3\xf3\xcf\x7e\x96\x2d\x46\xef\x30\xcb\x07\xc6\x6d\x7c\x48\x4e\xd3\xec\xff\x3d\xec\xc0\x14\x36\x6b\x6a\x64\x2a\xae\x04\x60\x98\xc7\xd5\x2a\x26\x2d\xdc\x05\xb8\x85\xeb\x75\xdc\xe2\xf4\xc8\x62\x50\x64\x31\xa5\x48\x43\x14\x3f\xc5\x64\x71\xc7\x60\x83\xf8\x77\xba\xdc\x51\x7c\x4e\x3f\xa7\x73\x62\x3a\xb7\xd2\xd8\x3a\x1a\x6b\x47\xa3\x0d\xcb\xac\xcf\xf0\x38\xd2\x59\xd0\x31\xa3\x4a\xdc\x35\x9e\x13\x22\x91\x69\x74\xdc\x28\x40\x4c\xb3\xd3\x64\x03\x46\xa3\xfa\x84\xde\x3b\x83\xf7\x83\x23\x68\x8e\x22\x7a\xde\x49\x53\x98\xc3\xa9\x91\x15\x49\x4e\xd0\x45\x53\x49\x72\xa2\x24\x49\x13\x3d\x9c\x88\x57\xc1\xde\x0a\x4f\xf3\x19\x95\x6d\xc3\x82\x46\xe8\xeb\x0e\x66\x8c\x20\xb4\x3c\xb7\x41\x2a\x22\xaf\xb8\x8e\xcd\x0b\x7c\x20\xba\xc4\x50\x5c\xa3\xac\xbb\x7e\xc7\x66\x05\xcc\x4a\x9d\x1a\xee\x34\x32\x9a\xad\x78\x90\x87\x9a\x8e\x70\x64\x65\x04\xe2\x58\xaa\x63\x55\x71\x49\xe7\xf3\x79\x51\xc6\x5a\xd3\xd2\xed\x40\xf3\x24\x2d\x12\xaa\x55\x44\x64\x58\xed\xe3\xed\x38\x85\x89\x6d\xd4\xd7\xe8\xe9\xeb\xd2\xb3\x96\x17\xba\x67\xe6\x2e\xe1\x2e\xe9\xe7\xb1\x1b\x4d\x77\xd6\xe3\xbd\x6c\x3b\xf1\x67\x34\xdd\x01\x70\x5f\xc0\x78\x16\x60\xcc\x3e\x10\xcf\xa2\xce\x95\xf1\xcf\x51\x2e\xd8\x63\x30\x04\x63\xf6\xe8\x8e\xc5\xbd\xda\xb1\xd8\xb7\xd1\x6c\x11\xb1\x4d\xc4\xee\x6a\xb5\xfa\xb8\xf0\xb1\x6c\x25\x71\x01\xe3\x40\x9a\xcb\xf6\x59\x1c\xeb\x0b\xf5\x92\x15\x49\x52\xba\x1e\x0e\x5a\x0f\x0e\x8c\xfe\x60\x9d\x50\x92\x59\x89\x28\xb1\x24\xe3\x76\x0d\xe6\x21\x40\x44\x80\x2d\x85\x58\xb0\x45\xf2\x0c\x62\xf2\x6d\x13\x86\x92\x40\x78\xc6\xe7\x63\xd3\xce\x36\x42\x58\xe5\x1c\xd9\xd0\x3a\x61\x0b\x11\x07\x7a\xc8\x44\xac\x6e\x11\xb9\x56\xab\x45\x55\xc3\xb6\xcc\x0a\x09\x7c\xab\x45\xcf\xfc\x93\x39\xe7\xd1\xe8\x85\x71\xb0\x2c\x96\x90\x9e\xb5\x32\xb8\xa3\x5b\x02\x87\x76\x74\x03\xa3\xd9\x60\x2a\xa2\x8c\x34\x99\x29\xed\x29\x43\x3f\x10\x15\xe4\xd9\x8e\xeb\x21\x1b\x02\x36\x40\x92\x52\xc2\xb6\x1f\x98\x8e\x55\x6f\x1b\xac\x96\x8e\x65\x29\x5b\xd6\x35\xd9\xb0\x91\x24\x59\xa6\xe5\xb9\x9e\x59\x75\x9d\x06\xb4\x44\xd7\x76\x90\x83\x6c\x64\x3b\x35\xa2\x20\x84\xa2\x06\x23\x80\xd4\x57\x28\xc1\xa6\x5e\x9c\xe2\x24\x0e\xe5\xd8\x4f\x18\x99\x64\x82\x48\xcf\x7b\x2c\x14\x2f\x89\x4c\x10\x21\x56\xef\x84\x38\xde\x75\x44\x25\x86\x27\x28\x93\x6f\xb7\xe2\x0f\xe7\xb8\x08\x45\x79\x84\x48\x00\x0d\x84\x98\x16\xa9\x60\xa2\xa0\xde\x9d\x9a\x37\x27\x33\xdb\xbe\x99\xca\x8c\x47\xef\x2b\x3d\x1a\xdf\xd7\xb3\x61\x07\xbd\xd2\xe7\x37\x66\x60\x50\x93\xbf\x99\xc0\x50\x7d\xc5\x60\xb5\x40\x31\xa0\x1c\xe1\x58\x8e\x82\x4e\x9d\x15\x23\xcc\xba\x56\xa7\x04\xcb\x44\x65\x2c\x58\x6e\xd7\x7a\xbf\x71\x9e\x61\xab\xb6\xa1\x4a\xbe\xd3\x41\x25\x9f\xf8\xd0\xf6\x4b\xac\x85\x08\xa8\x56\xab\x51\xa5\x5a\xad\x82\x2c\xf0\xbb\x4a\xce\xe2\x6c\xb0\x88\x66\xa3\xa1\xb9\x30\x53\xe4\xf1\x9e\x55\x9d\xc0\x38\x65\xd3\x54\x20\xcb\x47\xa7\x68\x42\xbf\x34\xb1\x5d\x8a\x88\x44\x33\x67\x04\x6c\x3e\x32\x19\x8c\x99\x20\x32\x58\x41\x33\x3d\x55\x9e\x05\xb0\x1c\xf8\x96\x8f\x89\xc7\x3a\x7a\x1e\xf3\x2a\x83\x22\xc9\x22\x12\xa9\x1a\x8c\x52\xed\xd4\xa1\x10\xb8\xa6\x8f\xd8\x10\xca\x30\xef\xb4\x48\x35\x63\x96\x50\xb9\x8c\x4a\x3e\x42\xba\x65\xe7\x35\xcb\x75\x74\x62\x96\x62\x25\x58\x42\x65\xd2\xe2\x7d\x09\x8a\xb0\xa1\x59\x8e\xad\x13\xc5\xc1\x5e\xe0\x80\xb9\xdc\xc7\x0e\x38\x18\x28\x43\xf9\x5c\xe7\x67\x03\xa2\x00\xd7\x53\xd4\x66\xee\x3d\x32\xde\xc3\x16\x9c\x98\xb4\x62\x31\xd3\x3a\x25\xa6\x6a\xdb\xa6\x27\x85\x86\x3e\x5b\x47\x4c\xbd\x53\x62\x90\xa5\x96\x55\x19\xcb\x4a\x8b\xa8\xb0\x49\x78\x44\xf2\x30\xfe\x95\x57\xb4\x6c\xa9\x5c\x46\xe5\x76\xc9\xb4\x78\xcc\xeb\xac\xdf\x76\xb2\x42\x99\x78\xb6\xe3\x38\x92\x6d\xf8\xa1\x4f\x21\x03\x43\x5f\xd7\xd2\x98\x1f\x34\x4f\x0e\x8e\x9a\xcb\x28\x93\x34\x6c\x58\x18\xf6\xc2\x85\x4e\x72\xa3\x94\x6d\x0d\x6b\x26\xc9\xb3\x35\xac\x87\xba\xd7\x88\xa8\xd4\x06\x54\x5a\x3d\x4c\x77\xf3\x2e\xac\xb4\x4b\x73\xbf\x59\x1a\x56\x4d\xce\xf3\xb0\x16\xb8\x04\x57\x6a\x6a\x18\x46\x42\x80\x62\xc1\x40\x01\x2c\x05\x41\x40\xa4\x30\x0c\x59\xc5\x43\x2a\x72\xe7\xee\xfb\xbe\x45\xfd\x4b\x3f\x44\xb1\x89\x9c\x65\x73\x77\xc7\xe1\x9c\x9c\xef\x9a\x1e\xf0\xf1\x41\x9c\x5f\x98\x78\xf5\xcd\xf8\xf9\x67\x1b\x89\x5d\xc3\x4a\x5d\x9d\x4b\x72\xbd\xc4\x9a\x12\xc0\x1c\x58\x3a\x32\xce\x4a\x18\x22\x28\xda\xa4\x41\xaa\x98\x73\x22\x4c\x5a\x5d\x80\xa1\x50\x6b\x37\x93\x3a\xae\xca\x7d\x97\xbb\x89\x5f\xf7\xf0\xf1\xe4\x05\xf8\xdc\x31\xda\x9a\xbf\x2a\x4c\xe6\x7e\xdc\xdd\x17\x1c\x18\xff\x0d\x8f\x02\x63\xfc\xa9\x0f\x1f\xcf\x0a\x70\xc7\x31\xaf\xa5\xf6\x47\x40\x7d\xcc\x5d\x90\xa5\x71\xec\xfd\x3c\x3d\x23\x54\x42\xe9\xca\x5c\xf6\x74\x5f\xf7\x22\x87\x2b\x75\xaa\xd0\x82\xc0\x69\x76\x01\x8e\x04\xce\x75\x91\x81\x5c\xe2\x23\x52\x2e\x85\x41\xd9\x8f\xc4\x4c\x3d\xe9\x53\xb9\x17\xcb\xf0\x1c\xf5\x03\xd8\x94\xc4\x82\x32\x50\xa6\x71\xdc\x09\xe6\x7d\x2f\xdb\xf1\xd0\x6a\xcf\x1a\x49\x9e\xe0\x0a\x6e\x87\x98\x91\x88\x93\xd1\xdb\x21\xe7\x10\x8c\x88\xd7\x51\x3d\x8f\x2d\x47\x26\x93\xa7\xed\x4e\xfd\x48\xc0\x07\xa8\x35\x96\x6c\xe6\xa8\xf9\x00\xa7\xc6\x28\x0a\xd7\xc8\x78\x46\x62\xf5\x3d\x22\xd3\xc4\x8c\xd3\x69\x60\xe8\x40\xde\x22\x2d\xd2\xc0\x99\x6a\x0b\x63\x06\x93\x26\x22\x7c\x35\x40\x28\xf0\xa2\x7a\x7a\x06\x2b\xe7\x0c\xce\xa1\x08\xd6\x74\xbf\x33\x3e\x5d\x64\xd8\xc9\xc2\x01\xb0\x38\x12\x0b\x7f\xdc\xc4\x8c\xc2\x04\xb8\xed\x49\x81\x57\x66\x2c\xcc\x8a\xa4\xd1\xf6\x33\x76\x56\xae\x77\x1a\x98\xf8\xa4\x62\x41\x15\x22\x58\x67\xa4\x10\x11\x8f\x94\xa8\x3e\x6d\x25\xb1\x1a\x29\x96\x68\xaf\x64\x7a\x71\x42\x8b\x4d\x0d\xaf\x91\xb1\xe2\x34\xdb\x60\xca\xb8\xed\x63\x46\xc7\xac\x46\x6a\x6d\x9f\xb5\x3a\x88\xa9\x64\x95\xfa\x6c\xc3\xb1\xb3\x3c\x23\x06\xa8\x2d\xb0\x76\x99\xf0\x65\x46\x4a\x71\x6d\x6b\x89\x0f\x31\xe5\xab\xb4\x60\xf9\x23\x43\x19\xba\x73\xe9\x5d\x05\x5b\x61\x01\x6e\xeb\xb4\x32\x9f\x54\xdb\x3a\xe4\x2b\x01\xb2\x6d\xdb\x0f\x7c\xc7\xc7\x7c\xab\xaa\x97\x9a\x41\x25\x2b\x56\x66\x9b\xae\x1b\x57\x5e\x46\x6d\x95\x35\x3b\x98\x55\x3c\xdf\xf3\x4d\xdf\x47\xd8\x09\x10\x5f\xb1\x3c\xb3\x82\xbc\xf9\x6d\x99\x7a\x8f\xb6\x2c\xe6\x72\x03\xad\x49\x70\x37\x06\x6e\x10\xf7\x6a\x16\x73\xe7\x43\x27\x5f\xf4\xcc\xfa\x8b\x1e\xbb\xfc\xf1\xf5\xd7\xac\xbf\xfc\x9a\xaf\x90\xd9\x93\x9b\xaf\x3e\xf6\xcc\xff\x3a\x7e\xb7\x73\xf9\x35\xf6\x15\x17\x9d\xb1\x50\x13\x3f\x7d\xf8\x96\xf5\x0f\x3e\xf8\xcd\xc3\x7f\xb1\xe5\x8a\x6b\xaf\xbd\xf2\x8a\x6d\xeb\xd7\xaf\x7f\xc9\x79\xf0\x92\xf5\xe7\x3b\xe7\x9f\x79\xd6\xea\x53\x2f\xe9\xcd\x4b\x3d\x8d\x97\x3e\x97\xde\x89\xad\xea\xef\x23\x53\xfa\x0c\xf5\xe3\x7e\xfd\xf4\xf4\x8c\xae\x92\xf8\xdf\x83\x83\x53\x3c\xea\x23\x07\xd6\xc7\xa9\xf9\xda\x73\x2a\x11\xeb\x91\xf4\x6a\x24\xbd\x31\xb3\xe8\xc9\x1c\xe3\xd6\x6c\x5b\xb7\x25\xa4\xe9\xb3\x18\x35\x61\x48\x9a\x8c\x0e\xb5\x4e\xbc\x2b\xd1\xe2\x51\x47\x8c\x12\x55\x38\xc7\xf4\xbd\xa8\x1a\x69\xa6\x25\x20\x5e\x67\x40\x04\x58\x9f\x91\x49\x8b\xd4\x60\x40\x0c\x44\x74\x62\x78\x08\x40\x46\xec\xaa\xd9\x3a\x27\x50\x5c\xf8\x62\x1f\xca\x77\xe9\x64\x66\xea\xe8\xe9\xac\x1e\xd9\x98\x2d\x6b\x1a\xee\x02\x09\xca\xb6\x94\x75\xf7\x94\xb9\x5a\xdb\xb1\x2c\xb9\x24\x2b\x14\xa3\xa0\xf7\x7e\x96\xca\x7e\x66\x71\x6e\xc9\xd2\xbd\xca\x61\x8f\x82\xcc\xec\x39\x84\x90\x2e\x73\xdb\xbc\x12\x33\x47\x9d\xf3\xb9\x27\xbf\x74\x21\x7c\x77\xb8\xe0\x78\xaf\x19\xe4\x6c\x2e\x4f\x4b\x2d\x4e\x0f\xdc\x8c\x2d\x1f\x49\x53\xf5\xb0\x52\xd4\xc8\x56\xed\x30\x45\x6e\x10\x23\x9f\x0d\xf6\xe4\x99\x30\x6b\xa3\x8e\x4d\x6a\x62\x20\xaa\x3e\x13\xcc\x56\x11\xb5\x17\x9a\x5d\x2d\xa7\x53\xcc\x29\x1a\x6b\xb2\xf1\xe6\x81\x7b\x5d\x9d\x03\x85\x89\x19\x1a\x77\x11\x7f\x0b\x92\xfc\x6a\x06\xdd\xc7\x7f\x30\xcd\x0e\x9c\xe4\x2a\xe2\x61\x3c\xab\x97\xc0\xe2\x5e\x1e\x04\x03\x3e\xcf\x5c\xc9\x88\x2a\x11\xc8\x86\xb3\x7a\x17\x38\x35\x56\x82\x61\x24\x18\xd0\x80\xc8\xe2\xb1\x64\xa8\x84\x27\xaa\x9f\x91\x3c\x64\xd9\x82\x6d\x6b\x82\xc0\x39\xbe\x25\x60\x44\xaa\x24\x4f\x74\x1b\x7a\x30\x64\x41\xbe\x53\x8b\x4c\x51\xd0\x91\x52\x55\x15\xcd\x66\x75\xa2\xd5\x44\x24\xca\x1a\x60\x40\xd8\x55\x72\x12\xdd\x83\x2d\xa1\xfa\x90\x87\x93\x4b\x46\xb9\xdc\x64\x7a\xdd\x13\x5b\xf2\xc3\xa0\xcc\xd3\x4c\x05\x47\xd8\x80\xc8\xac\x84\x3a\x44\x2d\x97\x84\xa4\x1e\x22\xb6\x42\x2c\xcc\x54\x35\xdd\xf0\x44\xa4\x4a\x59\x39\x52\x08\x4f\xca\x7e\x15\x8a\xaa\x64\x64\x24\xc5\x71\x5d\xb1\x83\x25\x99\xe5\xf7\x54\xb9\x4a\x1b\x18\x86\x80\x04\xb9\xef\x1b\xaa\x53\x9f\xad\x84\x9f\x37\xa5\xf7\xff\x49\x2e\x23\x8f\xee\x0f\x97\xcf\xe5\x2a\xef\xf3\x2e\x37\x09\x72\x34\x74\x7f\x01\x1e\xce\x39\x95\x33\x38\xd0\x99\x86\x61\x32\xfa\xac\x47\x5a\xa8\xe9\xeb\xd0\x33\x98\xb2\xad\x45\x96\x9d\x01\x91\x11\x73\xd3\x36\xf3\x81\xa8\xab\x44\x26\x8a\xcf\x36\xf3\x86\x65\x39\x82\x63\x0b\x3c\xe7\xc9\x8e\xe3\x5a\x88\x28\xc4\x23\xbe\x0d\x05\x68\x32\xa2\xe9\x43\xd0\xb4\x2c\x37\xaa\x45\xbe\x28\x18\xa1\xd2\xd0\x62\xae\x8a\xc4\x28\xf3\x88\xd7\x06\x63\x48\xc4\xc2\xc4\x2e\x8a\xab\xf4\xba\xdf\x3f\xeb\x49\x65\x64\x33\xc5\x6e\x4d\x64\x64\x7e\xbc\x34\xcf\xc5\x6f\x51\x7b\xbd\x96\xf0\x86\x8e\xcf\xe1\x40\x4e\xe4\x67\x64\xf9\x8a\x91\x64\xa8\x56\xd0\xa1\xca\xce\x1f\x23\x8a\x21\x36\xb9\x94\xfe\x64\x1d\x87\x34\x08\xae\x85\x38\xc2\x16\x74\xed\x72\x43\x83\x5e\x46\x23\x06\x66\x9a\xba\x61\x22\x29\x54\xe5\x36\x36\x24\x24\xe9\x19\xc1\x92\x91\x6c\x72\xae\xe7\x2a\x1d\x57\x56\x98\x52\xe4\x10\x89\x54\xfc\xb0\xa9\x28\x7a\xc6\x54\xd1\x9e\x06\x17\xb6\x65\xd3\x14\x02\x41\x66\x9d\x1a\x69\xc9\x30\x5f\xe3\xeb\xa4\x21\x43\xa1\x11\xf7\x63\x6d\x2f\x36\x28\xee\x41\x21\xf7\xc6\x0f\xa2\xb5\xa9\x8d\x61\xa6\x3e\xda\x34\x16\x61\xe3\x7a\x30\x18\x1b\xe4\x16\x26\x5e\xff\xfd\x5c\xbf\xfb\xb1\x50\x6e\x61\x62\xfb\xa2\x21\xba\xd5\x35\x72\x2e\x67\x14\x26\x76\xdc\x43\xcf\xd0\xdc\x21\xfe\x19\x85\x89\x5d\xc5\xbd\xca\xa1\xf5\xee\xfc\x32\xad\xb7\x77\xe6\x56\xef\xc5\xec\x24\xe3\xb3\xf1\x46\x30\x17\x1b\x61\x70\x4a\x61\xe2\xa5\x67\xa9\xed\xd4\x2b\xc7\xeb\xf9\x5a\x6e\xba\x31\x7e\xfe\x99\xb9\x71\x53\x73\x2e\x77\x03\xbf\xce\x7f\x90\xdc\xd9\xed\x1e\xbb\x69\xf5\xcb\x05\x6e\xf7\x4e\x7a\xf6\x6f\x74\x17\xe7\x5e\xe6\x2e\x02\x87\xa6\x59\xaf\x4e\x01\xe7\x80\x0b\xc0\xa5\x54\x92\xf7\x5f\x9c\x9b\x1c\x1b\xdf\xcb\xdc\x9d\x2e\x4e\x8f\x4f\xc7\xfb\xaf\xc5\xc5\x89\x49\x8e\x1d\xf4\x49\x1e\x8a\x93\x48\xf2\x04\xe7\x46\xc6\x47\xb2\x93\x4b\x47\xa6\x46\x12\xab\x69\x2c\xf1\xfb\x39\xe2\x91\xc9\x5f\x6e\xbb\xe4\x63\x15\xb8\x86\xfc\xcd\x5f\xdd\x32\x3d\xb9\x78\xf9\xaa\x23\x09\x82\xd6\xd7\x4e\x39\xff\x4a\xb8\x72\x31\x7c\xf6\xe6\xfb\x96\x7f\xff\xe6\xeb\xae\xfb\xd4\x7d\xcc\x59\x37\x9f\x72\xf3\xaa\x9b\xc9\xb7\x32\x3f\xcf\xdf\xf5\xe0\xea\xbb\x0f\x79\xec\xec\xc9\x65\x7c\xb4\x6d\x2b\xf9\x4a\xb6\xc9\xff\xf8\x89\xe8\xcf\xfb\x33\x87\x3c\x41\x72\x9b\x36\x5c\x72\xef\x93\x7f\xbd\xe1\x92\x7b\xff\x9a\xbb\xa8\xb8\xf2\xfa\x8d\x17\xad\x5d\xfb\xd8\x0d\xa4\x74\xaa\x7a\xe0\xba\x45\xc7\xc0\x23\x6f\x78\xec\xa3\xc7\x7c\xf4\x63\xbb\xaf\x37\x4f\x3c\x31\x8a\x56\x7e\xf9\xfa\x33\x1f\x7a\xec\x0e\xef\xd8\x87\x6e\x21\xdf\x23\x77\x7e\x7f\xd1\x63\x8b\x2e\x6f\x44\x5b\x98\x4f\x32\x37\xdc\x56\x24\x0e\xbc\x45\x77\xce\x66\xee\x8c\xb6\x32\x17\x9f\xfd\xc9\x2b\x6d\xfd\x7b\x67\x7f\xf2\xd2\xeb\xce\xa6\xe7\x68\x3a\xe5\xb1\x42\xed\xcd\x31\x0a\x0a\x16\x4f\x72\x7b\x56\x08\x7c\xc4\x29\x28\xb2\xa2\x06\xd1\x0d\x18\xc0\x16\x9b\xea\x55\x25\xe7\xa4\xfa\xe1\x2f\x68\x87\xbf\xa4\x00\xfe\xe2\x04\x4f\xec\x31\x25\xe7\x71\x32\x78\x1f\xc5\x9f\xe9\xb7\x0a\x0e\x5e\x7e\x15\x7b\xc0\xd6\xa9\xf6\xc9\x99\xb3\x76\x19\x97\xa0\xc7\xd6\x2d\xcf\x46\x22\xb6\x65\x29\x1f\x59\x5e\x13\xba\x9e\x88\x24\x43\x27\x3c\xf1\x03\x4e\xc6\x09\x3e\x99\x09\x43\xd8\x64\x5a\xc4\x8a\x82\x3a\x1f\xf0\x36\xf4\x3a\xa6\x24\xe9\x15\xa9\xa5\x6b\xe9\x7d\xbd\x9a\x9c\x0f\xcf\x50\xac\x83\x7d\x8f\xea\xcb\x76\x4a\xdf\x37\xc9\xa3\x71\x43\xba\xde\xc4\xf4\xcf\x73\x0a\x38\x24\xc9\x8e\x9f\xc9\x8e\x2c\x5d\x9c\x4d\x73\x69\x4f\xf7\xb3\x48\xc7\x82\x93\x9d\x5c\x32\xd7\x27\xee\xfe\x53\xc8\xbf\x90\x12\x7b\x2a\xdf\xd9\xf6\xb1\xaf\x41\xf5\xc8\xe9\x17\xf9\x8b\x3f\x46\x36\x90\xdf\xa2\xc8\x5c\xcc\x7c\x81\x9c\x32\xcd\x78\xec\x08\x1d\x8e\xcc\xe7\x1e\x5d\xb3\x92\xbc\x7d\xf1\xf3\x97\x90\xeb\x8a\xc5\xa3\x56\xd6\x8f\x26\xdf\x5b\x73\xd2\x19\x17\xc3\xaf\x9d\xf7\xfc\x79\xf0\xa4\x35\xaf\x9e\xc4\x30\xf3\x06\x2c\x43\xdb\xf5\x2c\xa7\xa4\x67\x30\x63\x09\x3e\xdc\x68\x71\xac\xb8\x34\xbd\x75\x4d\x79\xfb\xf3\x6c\x69\x56\xbb\x2a\x53\x6e\xab\xcc\x07\x30\x66\x8b\xb4\x46\xe6\x38\xc4\xb4\xd1\xa5\xb3\x0d\xee\xb7\xf3\x25\x21\xe1\x85\x9c\x9c\xd1\xa7\xbc\xb8\x7e\x3e\x8f\x66\x7e\xfb\x17\x79\xf7\xa9\xf9\xf4\xed\x77\xff\xa5\xe7\xb7\xe3\x01\xba\x4f\x9f\x3f\x76\xe8\x79\x8d\x3e\xaf\x17\x26\xb6\xaf\xa4\x36\xdd\x6f\x52\xfa\xd9\xdd\x8f\xe5\x36\x72\x0a\x7f\xf5\xbe\x47\x91\xc2\x89\xa7\xac\x5e\xc3\xaf\x7d\xf2\xdb\x7f\xf8\x88\x7a\xf3\x9a\xc7\xa8\x6d\x17\xbf\xb7\x81\xd3\xe9\x19\xd2\x92\x24\x2b\x41\x9a\x01\x3a\x9b\xe6\x01\x9f\x4e\x53\xbd\x8f\x0e\x33\x6d\x64\x7c\x7a\x7c\x6c\x7c\x24\xa6\x66\xfe\x01\x37\x43\xab\x46\xaa\x92\x1a\x08\x12\xca\x3b\x5d\x80\xad\x0c\xc6\xcc\xa6\xd9\x7c\xe0\x61\x16\xe0\x10\xe3\x30\xcc\x84\xc4\xd4\x5d\xd7\x37\xa3\xaa\x28\x88\x52\x59\xee\x02\x5b\x33\xb2\x37\x77\xbc\xcc\x29\x7e\x64\x46\x15\x62\xe8\x30\x64\xf2\x6c\x9e\xfc\x43\x9b\x77\x2b\x59\xa5\x23\xb1\xea\x60\x9f\x67\xfe\x7b\x2f\x1e\x0d\x8e\xc1\x75\x03\x74\x34\x40\xbf\xf6\x3d\xc6\xe0\x9a\xf9\xe5\xec\x12\xff\xd2\x18\xcc\xfc\xfb\x00\xaf\x51\xcc\xeb\x98\xcb\x3c\xb7\xd1\x9a\x3f\x36\xc9\xf3\xaf\xac\x1c\xa0\xe3\x81\x7a\xd7\xa5\x6b\x6d\x4c\x7f\x83\x53\xc0\x22\xf0\xe1\x34\xcf\xcb\x62\x2e\xb6\xd5\xe8\xb9\xec\xfb\x61\x02\xff\xb9\x64\x61\x9e\xe7\x8e\xd6\x1b\xa4\xca\xa8\x65\xd4\xc8\x2b\xaa\xab\x48\xd0\x81\x47\x52\xc1\x65\xc7\x12\x76\x67\x65\x5f\x97\xea\x3e\x3d\x92\x77\x49\xd9\xb3\x6c\xa8\xc2\x12\xb4\x25\x68\x0e\x0b\x34\x79\x69\x8e\xdb\xc3\xfd\x98\xf9\xb7\xbd\xf8\x31\xc0\xd7\x99\x5f\xcc\xa7\xcf\xfc\xeb\x5e\xcf\x7b\x03\xfd\xbe\xfa\x3d\xc6\xe1\xaa\xf4\xfc\x2b\x95\x61\xf0\x3e\x8a\x1a\x76\x04\x38\x06\x9c\xd0\x3f\xcf\x1c\x29\xf6\xfd\xad\xb2\x53\x63\x83\x30\x86\x83\x66\x48\x71\x2c\xc9\x7f\x30\xc7\xb3\xcc\x21\x58\x10\x98\x7c\xbb\x0e\x6d\xa9\xc5\xd4\x23\x31\xfe\xc0\xf1\xe7\x0e\x3b\xf6\xbe\x73\x37\x5c\xb4\xf1\xbb\xdf\x39\x8d\x84\x7f\x7f\xee\x15\x17\x9d\x5b\xbc\xe8\xa2\xa3\xa3\x0e\xfc\xe9\x2b\xe4\xee\xa3\xe0\xe4\x7d\xe4\xdd\xec\x4a\x2a\xbd\xd9\xbf\x91\x4c\x29\x7e\x4d\x27\x2e\x26\x0a\xfe\xf2\xf7\x14\xc5\xbe\xdb\x7c\x68\xdd\xeb\xda\xe3\x8f\xff\x8a\xec\xb9\x4c\x97\x1f\x5a\x71\x36\xfc\xbc\x47\xfe\xf6\xc6\xbb\xf5\x7f\xc9\x8e\x0e\x8b\xf2\xb0\x4e\xf8\x97\xbd\xf8\xe3\xf4\xf9\x30\x31\x43\x23\xd6\x66\xea\x7d\x19\x2b\xcd\xc9\xd8\xcc\x3f\x0f\xf8\x25\x0d\xca\xf6\x27\x07\x64\x12\x0f\xc8\xe4\x95\x03\x7a\x2a\x19\x9b\xff\xda\xab\xee\x01\x59\xdd\x78\xc5\x40\xf9\xc1\xc0\x18\xff\x6c\xa1\x31\x2b\x70\xf8\xf1\x01\xfa\xdd\x7d\x7a\xee\xe1\x2d\xdd\x1f\x93\x5f\x2f\x50\xfe\xe5\x03\xcf\xcf\x95\x3f\xb1\x7b\x0f\x8d\x27\x68\x2d\x24\x2f\x33\x3f\x4d\xe5\xc2\xec\xaa\xb9\xa7\x38\x05\xec\x4f\xad\x9a\x63\xc1\x99\xe0\x82\x81\x3b\x7d\x6a\x83\xf4\xa1\xe4\x97\xf6\x2e\xb4\x87\xc9\x89\x87\x72\x62\xa0\xa6\x09\xeb\x57\xa4\x70\xbb\x45\x9a\xdf\x7e\x6e\x92\x55\xa0\x80\x20\x88\x55\x98\x61\x18\x48\x47\x66\xc5\xea\x02\x36\x0f\x45\xd4\x6a\x21\x3b\xa6\xd9\xbe\x59\xb3\xba\xe0\xbb\x8e\x8e\x74\x9b\x95\x90\x19\x18\x7e\x47\xc2\xb2\x87\x90\xa3\xf0\x58\xd6\x6d\x62\x6a\x81\x95\x3d\x3f\x59\xba\x70\xb9\xec\x8b\x96\xe5\x5a\x06\x41\xd0\x40\x9e\x1b\x94\xfc\x41\x92\x19\x3a\x6e\x50\x8a\xfe\xc7\x0f\xd5\xd0\xe3\x6b\x5d\xa0\xc1\x7c\x55\x25\xae\x2c\xe5\x0d\xa4\x75\x81\x28\x19\x26\xb7\x6c\xfe\x22\x94\x8e\x79\x30\x30\xe6\xe6\x00\x8f\x9f\xe8\xf3\xf1\xd4\x1d\xb7\x80\x91\x2e\x7b\xe2\x85\x6b\x67\x07\xd7\x89\xf4\x9d\xcb\x06\x78\x1c\x72\x3e\xf5\x81\x3d\x01\x9c\x04\x2e\x02\x66\x7a\xff\x9d\x78\x7c\x2e\xca\xc5\x7a\x69\xc5\xe2\xdc\xd8\xf8\x34\x4d\xf1\x37\x32\x3e\x96\x30\x6c\x2a\x39\xcf\xa7\x3f\x93\x43\xd3\xde\x21\xf9\x08\xcd\x15\x18\xdb\x49\xe3\xcc\x90\xc3\x68\x6e\xb2\xb0\xb8\xb0\x78\xf9\xe8\x78\x0e\xef\xa9\xc2\x92\xc8\x13\x9b\x51\x14\x08\x2c\x47\xf0\x69\xe2\x51\x41\xd3\x7c\xd7\x77\x9a\xaa\xee\x3b\x3a\xb4\x55\xcd\xb7\xb5\xa6\xab\xfb\xaa\xda\x01\x49\xc6\x2c\x52\x0e\x10\x29\x33\x75\x5f\x81\x15\x53\x71\x9c\x92\x13\x58\x7e\xa8\x87\xae\xa9\x49\x4e\xa0\x69\xa6\x21\x36\xb3\x9e\x4f\x90\xa2\xba\xb6\x60\xbb\x51\x28\xb8\x62\xa3\xa2\x48\x3e\x9f\x67\x42\x33\xb6\x88\x0c\xe8\xc0\x0a\x83\x0d\xcd\xb0\x3d\xc3\x30\x1c\xdf\xf5\x0c\x53\xef\xb4\x7c\x62\xf9\xc4\x12\x44\x83\xad\xc9\x15\x8f\x28\x35\xdf\x76\x1c\x37\x54\x3d\x0d\xe3\x9a\x61\x40\x15\x77\x81\x5f\x85\xda\x82\x6b\x01\x8d\x95\x04\x1f\x04\x57\x74\x17\xe5\xde\xe1\xae\x05\xef\xa7\xda\x3d\xf1\x27\x3d\x0f\xdc\x0a\xee\x00\x77\x81\x87\x40\x00\xde\x04\x21\xf8\x62\x6a\xe1\xe5\x26\x4f\x80\xd3\x23\x70\x8c\x26\xb3\x5a\x7e\x00\x5c\xda\xff\x8d\x4d\x94\x1f\xc5\x67\xed\xc3\xb6\x0e\x01\xd1\x14\x97\x67\x53\xa7\x95\x6c\x71\x2c\x93\x2a\xbf\xa1\x23\x99\x64\x4c\x8a\x23\xe3\x63\x73\x07\x50\x30\x7d\x27\x97\x1e\xdd\x8f\x67\xe7\xbd\x33\xfc\xca\x42\x6f\xe4\xae\x99\x3d\xf9\x8b\x4f\x7e\xf2\x4c\xe6\xa7\xd1\xd5\x1b\x6e\xf9\x24\xb7\x33\xba\xec\xce\x5b\xaf\x3e\xec\x9e\xfd\xc6\x98\x33\xa2\xce\xcd\xbb\x72\xf7\x1c\x71\xd5\xd9\x27\xfa\x6f\xae\x24\x67\xb4\x4f\xfd\xc4\xa9\x27\x8e\xa9\xda\xb1\xd1\xbb\xb0\xfe\x21\x72\x2b\xfb\xad\xce\xb1\xf1\x87\xfc\x99\xb9\x88\xfc\x8e\xcc\x1c\x0b\x85\xef\x93\x8b\x32\x7f\x3a\xf2\xf4\xe9\x65\x07\x2d\x3f\x7e\x5f\xf2\xc7\xef\x17\xf7\x73\x16\x1d\x04\xa7\xfe\x7c\xd2\x05\x17\x1c\x7f\xba\xae\xdf\xb4\x6c\x37\xb9\x06\x96\x88\x16\x7f\x9e\x82\x4b\x9d\xa7\xa6\xef\xd6\x77\x93\xb3\x95\xb5\xab\x8f\x1a\x53\x94\x31\xd2\xf8\xc9\x51\xb7\x8d\x8d\xc1\x95\xed\xc3\xff\x6a\xed\x5a\x65\xed\x03\x6b\xaf\x20\xd7\xc1\xef\x92\xa9\xf8\xf3\x22\x3c\xe6\xae\xa7\x94\xbb\x2e\xfe\x7b\xee\xda\x9b\xc9\x37\xc9\x9e\xef\x9e\x79\xfb\xd7\x1f\x84\xb7\x74\xae\x5c\xff\x33\x52\x26\xff\xa8\xff\x1a\x4e\xc1\x33\xb3\xeb\xff\x89\xfc\x2d\xf9\xd1\xd9\x0d\x78\x14\x3c\x83\x95\x0e\x2a\x2e\x22\xdb\x4f\x3f\xe9\x24\xe9\xb4\xe3\x17\x2d\x3b\xe8\xba\x0b\xf0\xfa\xd3\x8f\xdf\xf7\xaa\xfd\x96\xff\x08\x9e\x2f\xed\x5c\xf6\xfa\x91\xbb\x3f\xf1\xfa\xf1\x17\x2c\xbb\xb4\xb3\xea\x0a\x6d\xe5\xbe\x97\xef\x7b\x0c\x2c\xc0\x53\x3e\x2a\x1d\x24\x1e\x48\xbe\x7c\xdc\x89\x93\xc7\x9d\x75\xa4\x78\xa2\x74\xf1\x89\xb0\xf3\xd1\x2d\x47\x86\x67\x7d\xfe\xc4\xb3\x8e\xf9\xf4\xc5\xe7\x9e\x71\xc2\x7e\xeb\xf6\x5b\x01\x3f\x0c\x3f\x6e\x1c\x74\xe8\x41\xe4\x8d\xab\x0f\x3a\x74\xf9\xb9\x87\x1d\x74\xf5\x85\x17\xc2\xdf\xcb\xaf\xc8\xa5\x73\xcb\x27\x9f\xbb\x62\x03\xcd\xfb\xa7\xe7\x54\xce\xa1\xe7\x5a\xbd\x1c\xf6\x70\x31\x80\x4b\x96\x32\x6c\xd6\x86\x42\x29\xd0\x23\x27\x72\x34\x18\x42\x10\x90\x12\xc1\x0c\x60\x2c\x37\x60\x55\xa2\x93\xbc\x56\xc7\x3c\x62\x3c\xb6\xa6\xb6\x43\xa2\xe4\x11\x54\x60\xbe\xdb\x05\x8f\x74\x8f\xce\x6d\xe7\x4e\xe5\xd7\xee\xbc\xa1\xf8\xa1\x13\x77\x9c\x73\x03\xc5\x09\x5c\x9d\x9b\xe1\xee\xe3\xd7\xed\xfa\x6d\x94\x07\x70\xe5\xd7\xd4\x8b\xf9\xb5\xbb\x7e\x7b\xd9\xe8\xaa\xcb\x56\x6b\x83\xfe\x07\x6f\x1d\x3a\xe7\x7f\x30\x88\x9b\x1f\xd3\x0b\xdc\xa6\xdf\xa4\x7e\x09\x16\x8d\x01\x74\x86\x6e\xf5\x8b\x63\x45\x86\x26\xdf\x5f\x51\x18\x4d\x70\xab\x97\x24\xbe\x7d\x0d\xa6\x9c\xe0\xae\x1a\x1d\xab\xd9\x80\x08\xd6\x74\xcb\x6b\x06\x81\xac\x44\x61\x14\x6a\xd0\xac\x45\x22\xab\x46\x6a\xd6\x84\x02\x69\x20\x62\x61\x62\x55\x04\xdb\xf7\x54\x52\x23\x58\x77\x6c\x9f\x0f\x5a\xd0\xc6\x30\xf1\xe7\xd9\xd1\xbd\x20\x77\x27\xe7\x16\xae\x7e\xeb\xc8\xb1\x83\x55\x70\xf2\x65\xfc\xda\x37\x9f\x6f\x3f\x70\xe2\x07\x4e\xfe\x3c\x3d\xdb\xb9\xb4\x7b\x4c\x6e\x37\x77\x0e\xe0\x41\x91\xc6\x39\xf4\xf8\x3a\xba\x18\xd0\xe6\x41\x9a\x2b\x39\x56\x62\xc9\x17\xcb\xfb\x84\x42\x4a\xc8\xbe\x04\xc5\x10\x99\x91\x16\x69\x1a\xc4\x4d\x4c\x1a\x4d\x58\x67\x34\xdb\xeb\xbc\xf2\xe4\xe6\x27\x7e\x1b\xad\x3a\x65\xc3\xa6\xeb\xfe\x7a\x15\xf9\x3c\xf1\x8f\xfc\x7e\x66\xe5\x3c\xda\x13\x47\x7e\x2f\x7b\x4d\x17\x90\xba\x81\x6c\x1e\xc1\x3c\x0c\x54\xa2\x06\xbc\xe1\x39\xd1\x53\xcb\x88\xf6\xea\x07\x57\x3c\x78\xeb\xea\x0e\xf9\xd1\xea\x57\x4f\x15\x1e\xfb\x19\xfc\xb9\x1c\x7f\xab\x78\x8e\xda\x05\xa4\xaa\x06\x9a\xe0\xd7\x41\x2f\xe6\x0c\xd1\x33\xcf\xa3\x63\x2e\xcf\xf3\xb6\x19\xed\x3b\x77\xf6\xd9\xbe\xff\x68\x2f\x25\x34\xbd\x28\xf2\xf6\x76\xc3\xb9\x1b\x56\x30\x6c\x12\x9e\x91\x22\x1b\x79\x50\x80\x92\xa6\xa3\xb2\x8b\x45\x89\x58\x44\x95\x2b\x3e\x31\x18\x89\x28\x9c\x30\xec\xa6\x43\xfe\x06\xf2\xa4\x89\x5a\x88\x84\x9e\xa0\x5a\xa6\x56\x27\x2d\x4d\xd3\x74\x11\x05\x50\x45\x2d\x90\xa1\x7b\x59\x9f\x53\xfb\x9e\x88\x49\x56\xf0\x5e\xbb\x16\x0f\xb4\x6b\x28\x9f\x18\xa7\x41\xad\x5d\x0d\x4b\x4c\x1e\x22\xdd\x70\xab\x55\x47\xd5\xa2\x6a\x64\xc8\xb5\x52\x54\x83\x3a\xee\xf9\x78\xc6\x1f\x4e\x6d\xd7\x51\x17\x78\x92\xa2\xeb\x46\xa9\xe1\x1a\xba\x2e\x7b\x18\x02\x94\x11\x09\xaa\x46\xd5\x6a\x54\xab\xd2\xf5\xed\xab\x5d\x25\x77\x15\x77\x0f\xf5\x55\x3a\xb8\x9f\x0f\x2e\x36\xa4\x17\xa7\x0d\xca\x24\xc9\x6b\x97\xc0\x79\x29\xce\xa8\xab\xee\x8f\x10\xba\xf5\xb5\xaf\x55\xe1\xad\x10\x3d\xf0\xd8\x9d\xf0\xe4\x5f\x3f\xf0\x4c\xf4\xb3\xc8\x3f\x1c\x1e\x9f\xb9\x0a\xb5\x43\xdf\xcf\xe8\xed\x30\xfe\x90\xaf\xd3\x94\x9e\xf7\xb4\xff\x6e\xd5\x51\xe4\xdd\xa7\xf2\x47\xdf\x74\xed\x45\xff\xfc\xdb\x7b\x5f\x3e\x5d\x78\xe4\xcd\x8c\x10\x89\xba\xce\xd4\x49\xcb\x23\xb6\xc7\x7c\x01\x81\x0c\xb0\xba\x5e\x0e\x73\x5e\x3f\xc7\x70\x7a\x1f\xc5\xe5\x16\x48\x5e\xbd\x82\x1b\x9f\x5c\x32\x9a\xb6\xb7\x87\x0b\x4f\x83\x74\xe4\x72\xc9\x51\xd4\x46\x4b\x90\xd8\x46\xd4\x28\x43\x47\x25\x6a\x9d\x38\x35\xa2\x6b\xd0\x08\x09\xcf\x58\x6a\xb9\x22\x41\x50\xf2\xb1\x0f\x35\x68\xaa\x5a\x14\xb0\x6a\xa7\x6c\x67\xc4\x76\xbd\x96\xad\xcd\x4a\x1c\xef\x57\x1c\x55\x15\x79\x5d\x45\x65\x0d\x19\x50\x23\x55\xdf\xb3\x2b\xc8\xe5\x1d\x1f\xf2\x52\x17\x58\xbc\xac\xaa\x9d\x00\xb9\xc8\x47\x20\xcd\x7b\x48\x63\x43\xc1\x08\x98\x00\x1f\x01\x47\x03\x25\xb1\xd6\x87\x86\x77\x09\x2c\xa6\x6e\xa7\x99\x6c\x6e\x09\x4c\xfb\x92\xa5\xd0\x85\xc9\xcf\xa5\x34\x99\x3f\xab\xf9\x38\x80\x36\xf4\x34\xdd\xad\x94\x1d\x45\x8d\x2a\x91\x27\x41\x85\xe4\x19\x5f\x47\xbc\xc0\x56\xa3\x16\xe4\x21\x6f\x92\x52\xac\xf1\xea\x44\xd6\xa0\x1d\x44\xad\x8c\x6a\x91\x32\x01\x3a\xc3\xc3\xa6\x45\xcc\xc8\x32\x98\x80\xb1\x4d\xc2\x77\x2c\x83\x2d\x73\xae\x54\xb5\xe3\x76\x1b\x7e\xd9\x55\x55\x4d\xf0\x5c\xe2\x39\x8a\x28\xa2\xb2\x85\x11\x94\x49\xd3\xf1\x0d\xac\x3b\x15\xcb\x75\x64\xa7\xe5\x7a\x3e\x6f\x13\x64\x79\x2e\xf5\xbb\x34\xa8\x2d\x8c\xc0\x08\x18\x07\xd3\x60\x0d\xd0\xc0\x59\xe0\x63\x0b\xf4\x91\xc6\x84\xcd\x85\xd0\xc4\x94\xa5\x7b\x51\xe2\x67\xfa\x39\x7d\xb2\x49\x2a\x68\xda\xf3\xb4\xff\x12\x76\x6d\x28\x42\x59\xd3\x9c\x86\xef\x49\x12\x91\xa2\x86\xd4\x64\xb0\xa7\x6b\x9e\x27\x89\xae\x67\xfa\xa2\x14\x2b\x10\x09\x45\x82\xa7\x1b\xa5\x8a\x24\x7b\x96\xe2\xe5\x79\x52\x25\x81\x14\x30\xae\x2f\xf0\xd0\x85\x75\x83\x68\x44\x22\x01\xd1\x0c\xc6\x81\x8a\x51\x23\xb6\x0e\x43\x58\xd1\x89\x1f\x59\x3a\x53\x8e\x99\x23\x77\x7c\x8d\xf5\x38\x24\x23\x9d\x17\x65\x45\xf3\xb1\x2e\x4b\xb2\xe0\x9a\x35\xc9\xd3\x78\x41\x96\x15\x5c\x52\x75\x55\xe6\x6d\xc3\x97\x7c\x43\xd4\x55\x55\xf2\xb0\x24\x08\xb6\xe8\x58\x9e\xcc\xe7\x91\xe1\x9b\x95\xd0\xf1\x7d\xd5\xac\x28\x8e\x26\x98\xa4\xa6\x3b\x96\x6e\x93\xc0\x72\x9d\x94\x77\xd3\x94\x77\xc9\xd9\xcb\x87\xc0\x32\x70\x22\x8d\xa7\x19\x90\xda\xff\x0b\x7c\x64\x8c\x61\x29\x66\x84\xff\x27\x5c\xfc\xef\x27\x36\x3c\xf1\xd7\x4f\xe6\xae\xfc\x3f\xe7\x57\x7a\x4e\xab\x51\xde\xec\x03\x0a\x34\x37\x87\x0c\xd6\x80\x8f\x81\xcb\x87\x71\xb2\xa7\x59\x9a\x3c\x63\x69\xba\x71\x49\x92\x4a\xfd\x1f\x33\x8c\xbd\x18\x6b\xce\x8d\xa6\x60\xdf\x26\xfe\xce\xc5\xaf\x3b\xdf\x62\x5e\xf3\x2e\x7b\x56\xf3\xe0\xb7\x1e\x37\x9f\xd5\xbd\xe8\x5b\xff\x2f\xf8\xc7\xbc\x8f\xf0\x77\x5c\x30\xfe\xea\x11\x67\xc1\xf3\xce\x22\xff\xf9\xda\x1d\x5f\xf8\xc2\x17\x7e\x71\xf6\x3f\x55\xc6\x77\xbe\x7b\x56\xf5\x0b\xd9\xe7\xff\xaf\xb0\x95\x9e\xed\xaf\xc9\x7d\x95\x73\xf8\xab\xdf\x66\xb3\xed\xe3\x2b\xea\x4a\x7e\xed\x33\x35\xbb\xbd\xea\x1e\xf5\x48\xfa\xfd\xc5\xdd\x6b\x72\x77\xd0\x5c\x2f\x6c\xfb\xc7\xfc\x3a\xef\x95\xae\x0c\xb2\xa7\x68\xaa\xc5\x9f\xba\x7d\x6d\x77\x25\x90\x4e\x46\xab\x9f\x4f\xf3\x0b\x3a\x34\xff\xf1\xe2\xc4\x93\x98\xa1\xa9\xae\x60\x3c\x4f\x61\x6c\x3a\xc4\xcb\x2e\xf4\x9d\xac\xa7\x13\x03\xf2\xb0\x6c\x12\x9d\x94\x49\x89\x08\x36\x23\x40\x9e\x18\x8c\x08\x0d\xa3\x63\xea\x58\xcd\x3a\x28\xb2\x88\xd4\x2a\x07\x25\x28\x93\x6a\x88\xca\x30\x0f\x5b\xc4\x85\x0e\xac\x93\x56\x37\xde\x64\xb1\xa9\x3f\x50\xbc\xa6\x8f\x25\xf8\x53\x0c\x04\x73\xf5\xb1\xe3\xc5\x02\x04\xa3\x89\x73\x4d\x23\xdb\xd4\x89\x0a\x55\xe8\xea\xc4\x24\x01\xc1\x51\xcb\x66\x64\x28\x11\xd4\x72\xa0\xd4\x80\x1a\x74\xf5\x28\x0c\x2d\xdf\x0c\x39\x21\xb2\x88\x48\x9a\x41\x10\x40\x85\xd4\xcb\xb8\x04\x01\xb4\x19\x27\xaa\x91\x32\xf4\x60\xdd\x0e\x4a\x7a\x18\x24\x76\x9b\x9a\xc3\x9c\x9c\xd8\x6d\x63\x6c\x91\x81\xfb\xf7\xe4\x65\xc5\x04\xbb\x22\xde\xa9\x15\x27\xe3\x56\x4d\x82\xd1\x62\x2b\x53\xf6\x61\xcb\x21\x95\x3a\xd4\x1d\x52\xe9\x02\xd2\x22\xb6\x01\xbd\x46\x23\x70\x83\x46\xd3\x24\xa6\xe4\x47\x2d\x95\xf0\x16\x2c\x29\x04\x73\xb2\x47\x6c\x02\x48\x0d\xb9\xc8\x2b\x97\x3d\xcf\x0d\x2a\xb1\x16\x6f\x94\x9a\x50\xf1\xa0\xdf\xb6\x89\xea\x41\x3f\xa3\x00\x26\xc5\x77\x70\xe9\xfd\x05\xc5\x30\xef\x25\x87\x1e\x5b\xc4\xe4\xf6\x9f\xcb\x87\xc6\x8e\x27\x4d\x81\x71\xcb\x3c\x46\x95\x11\x2f\x64\xf2\xed\x9a\x28\xb1\x76\xd5\x69\x42\xd3\x20\x01\x69\x90\x1a\xb1\x35\xe8\x42\x50\x37\xa5\x80\x20\x13\x56\xdd\xa8\xce\x02\xab\x1c\x9a\x59\x0b\x0a\xbc\xe7\x62\xcf\x43\x22\x71\x1c\xec\x60\xbb\x56\xb7\x03\xa3\xdc\x80\x0a\x51\x49\xc9\x85\x35\xc6\x20\x06\x69\x85\x01\xe4\x07\x71\x10\xf8\xc2\xc4\x6e\x1a\xf3\xb4\x7b\x02\xcc\xf9\xb2\x3a\x9c\x03\x44\x6a\xdf\x2c\xce\x64\x47\x8a\x0c\x5c\xbc\x7f\x36\x37\xb1\x0c\xd2\xd8\xe7\x25\x2b\x00\x3b\x3e\xd6\xbb\x7c\x2d\x64\xc1\x28\xe7\x9a\x51\x3d\x92\x33\x25\x85\xf8\x72\x1d\x5a\x7a\xbd\xd6\x0a\xd5\xa0\x6c\x40\xb5\x41\x4a\x5e\xbc\x28\x35\x58\x40\x6c\x0f\x4a\x50\x56\x38\xc7\x77\x04\x52\x22\x32\x09\x04\xd7\x46\x9a\xe5\xb9\xa2\xae\x22\x13\x41\x00\x51\x99\x88\xc4\xb6\xa1\x0d\x7d\x56\xce\x47\x1e\xc1\x35\x08\xa0\x92\xdc\xfb\xa5\x79\xc4\x76\x53\x6c\xcd\x9d\xad\x74\x9f\x8f\xba\x5a\xee\x7e\xce\x48\xf3\xcb\xa4\x68\xc2\x30\x3d\x13\xcf\xc6\x9b\xbb\xc1\xc4\x73\xe3\x34\xe9\x62\xdf\x65\x71\x77\xa6\xdc\x56\x33\x47\x22\xd4\xde\x9a\xc1\x7e\x05\xf2\x10\x19\x54\xf4\x31\x91\x4d\x58\x81\x62\xc3\xf7\xa0\xe6\xd6\xca\x36\x71\xb7\x6e\x8d\xf6\x89\x4d\xa1\x6c\x19\x3d\x1b\x7d\xe3\xef\xfd\x86\xef\x68\x81\x11\x94\x74\x5f\xf7\x51\x2d\x70\x5c\x9c\x91\xdb\x3f\x83\xbf\x42\xc9\xdd\xeb\x8d\x09\xbe\x14\xc8\xf6\xbc\x18\x33\xd9\x49\xb1\x6f\x3b\xfc\x05\x19\x88\x1b\xc8\x05\x7a\x84\x3b\x9e\xcc\xd4\x3b\x55\xe6\x94\xa3\x36\xf1\x42\x66\xa4\xfd\x3d\x51\x62\x6f\x7b\xf7\xf6\xdf\xc3\x2b\x2f\x24\xaf\x92\x5f\x92\x1f\x92\x4f\x69\xf0\x3e\xc8\xfc\xc2\x3c\x6c\x1b\x79\xfa\x72\xf8\x8f\xf7\x44\x3f\x65\x73\xd7\xfc\xed\x5b\x97\x73\x2e\x32\x78\x44\x5e\xfa\xd3\x7e\xb7\xad\x7f\xf4\x36\xe7\xc1\x83\x49\x70\xed\xa3\xd7\x3c\x7a\xe5\xdf\x7c\xe3\xca\x8d\x67\x6e\xfb\x0e\x2c\x90\xdb\xc8\xcf\xd7\xc3\x17\x98\x0f\x92\x47\x1a\x9b\x9f\xfa\x5d\x82\x69\xae\xe5\x4c\xce\x06\x4b\xc0\x61\x34\xf3\x4c\x92\xb4\x6f\xa0\x81\x69\x6a\xf6\xc9\xd1\xc5\x6c\x71\x79\x22\xca\x90\x66\x53\x49\x3c\xb3\x5c\x49\x62\x7d\x54\x6f\x42\x49\xa3\x28\x6b\x35\xe2\xe8\xd0\x86\xa0\xe2\x53\xac\xb6\x26\x22\xaa\x1c\x20\x0f\x5a\xaa\x8c\x64\x99\x75\x22\xaf\xea\x44\x86\x0f\x43\xdf\xb3\xdd\x80\x6d\x3a\x96\x43\xaa\xa1\x6b\x20\x33\x2c\x19\x58\xf3\x70\x9d\x94\x5b\x36\x44\xb0\xe1\x41\x57\x24\xa5\x2a\xe4\xa5\x56\x19\x47\x92\x5f\xad\x66\xb0\x8d\x6c\xaa\x24\xb3\xf4\x0e\x0b\x73\x22\x18\xa1\xa7\x69\xab\xc1\xc9\x69\xac\xc4\x50\x44\x6f\x36\x6e\xe8\xd2\x85\x83\x7d\x47\x8b\x63\x4c\x36\x33\x38\x10\xc5\xfd\x17\x2f\x59\x91\x51\x55\x56\xb2\x7c\x5c\x55\x9a\xe5\xb0\xae\x57\x7d\x1f\xf2\x8e\x4a\x6c\xa3\x93\x47\x9e\xa1\x44\x65\xa6\xa9\x3b\xa6\x61\x99\x66\xb9\xa5\x37\x91\xeb\xd9\x59\x39\x24\x75\x28\xc2\x50\x25\x22\x09\x48\x48\x34\x0b\x06\x50\xae\xe1\x00\x1a\xa8\x0a\x05\x1f\x96\x5c\xab\xe1\x19\x0a\x52\x5d\x47\xf1\x65\xc3\x93\x2c\xdf\x37\x34\xd3\x74\x3c\xab\xe2\x6a\xba\x63\x68\x48\xf5\x15\xdb\xd0\xb2\x79\x44\x1a\x25\x57\x0b\xd4\x6a\xa8\xfb\x9a\x1f\x42\xa1\xe1\x87\x95\xd8\x0e\x09\xe8\xd9\xfe\x7a\xc0\x82\xfd\xc1\x41\x03\x56\x76\x2c\xed\x71\xbf\x07\xfa\xb2\x1a\x2e\xc9\x2e\x59\x51\xdc\x7f\x94\xe6\x64\x1e\x1b\xef\xf9\x7b\x66\x7b\x9b\x80\x10\xe3\xa8\x69\x65\x6d\x44\x6a\x50\x80\xae\x42\x64\x12\x12\x9f\x08\x12\x14\xaa\x75\xd2\x84\x65\x28\xfb\x1d\xbb\xea\x23\xc6\x89\x3c\x14\x79\x8c\x43\x92\xdc\xdd\xb1\xb2\x17\x3b\x0e\xe7\xee\x71\xb9\xf5\x9d\x83\x36\x22\x8f\x34\xb1\x2e\x23\xd9\x47\x92\x2f\xc8\x2a\xd2\xfd\x4a\x33\x73\x83\x43\xf2\xba\x0e\x5b\x04\xd5\x6a\x35\xf8\x06\xea\xfb\xea\x50\xbc\x96\x4d\x34\x6f\xc8\xd6\x4b\xd3\xbb\x83\x1b\xbb\xd3\xb9\x30\xfb\x6b\x30\x06\x8e\x00\x27\x02\x03\x80\xd1\xa1\xe1\x5a\x4a\x3d\x8c\xa8\xe1\xb0\x00\x15\xce\x51\x07\x46\xf6\x3d\x06\xfc\xd7\xf5\x6f\x6f\xd0\xa2\x8f\xb1\x17\xea\x0f\x3f\xe1\x1d\x4b\xd0\xbb\xe4\x8f\x1f\xff\xe5\x6b\xaf\xbd\xca\xde\xf3\x6f\xdf\xfd\xcc\x69\xd1\x69\xec\xba\x73\x1e\x79\xea\x91\xe3\xc8\x93\xff\x48\x7e\x6f\xfc\x67\x10\x04\xd1\x63\xf7\xde\x7e\xcd\xb1\xd1\x0f\x98\xfa\x39\xf7\xbc\x73\xcd\x4d\xeb\x3f\xf7\x87\x0b\x7f\xf3\xe4\x4d\xeb\xd9\xcd\x57\xdc\xfe\xf0\x85\xd1\x4b\xec\x01\x77\x3c\xb1\xe9\x0f\xeb\xff\xed\x4b\x6f\xbc\x73\xf9\x97\x1e\xbe\xfd\xc2\xac\x70\xf2\xf9\x9f\xb8\xf5\x09\x77\xdb\xdd\x27\x9f\xe9\x7f\xd9\x3f\xde\x9f\x3a\xf3\xa4\xe3\x1f\x3e\xe9\xbc\x8b\x3f\xfd\xe8\x9d\xaf\x7d\xe6\xa4\xd3\x1f\xfb\xc2\xa3\x2b\x1f\x3d\xfa\xf4\x93\x56\x76\x9a\x6b\xce\xbd\xf2\xda\x8d\x1b\x9f\xfa\xec\x96\x47\xae\x38\x77\xe3\xb5\x8f\x5c\x79\xf3\xe9\x27\xde\xbc\xe1\xa2\xeb\x9e\xda\xb8\xf1\x9f\x37\x9c\x77\xda\x67\xcf\xbd\x79\xc3\x45\x8f\x9c\x7b\xf1\x45\x1b\xfa\x67\x17\x4a\x61\xe2\xe9\xb3\x06\xf8\x96\xe8\x3f\x9b\x73\xa8\xef\xdf\x01\xe0\x10\x70\x54\xe2\xe9\x11\x6b\x9b\xec\x62\xae\x9f\x3c\xaa\x38\x64\x78\x8d\x2e\xac\x17\xb9\xb2\x1e\xf9\x1d\x47\x66\x1a\x8c\x55\x32\x1d\xa8\xe1\x59\x17\x67\x4a\x3e\xc9\x9b\x12\x96\x0c\x82\xe8\x5f\xd2\xff\x8f\xaa\xe4\x1c\x5f\xe7\x7d\x47\x2d\xf9\xc4\xaf\xd5\xa0\x5d\xf1\x6d\x5f\xf1\x1d\xd1\xf6\x14\xdf\x8e\xfc\x05\x14\x27\xa0\xd8\x74\x6a\x92\x9b\x6f\x13\xc5\xf7\x79\xe3\x3f\x87\xce\xd7\xdd\xc2\xc4\xd6\x4b\xe6\xd6\xa9\x6e\x17\x1e\xde\x35\x72\x63\x9c\xcc\x9f\xba\x6b\x39\x59\x0e\xf8\xd3\x7e\xa4\xce\xf9\x43\x50\xff\xf5\x1d\x2f\x52\xff\x86\x1e\x36\xfb\x85\xdd\x91\x9c\xcb\xdd\xce\x5f\xbd\xfb\x53\xec\x91\x27\x6c\x5f\xf5\x52\x61\x72\xdb\xdb\xdd\x7f\x25\x4f\x14\xb8\xb7\x7e\x0c\xde\xed\xbf\x4b\x73\xd7\x6c\xa5\x59\x66\x77\xbd\x98\xc6\x20\xea\xdd\xa9\x5c\xc8\x29\xd4\x9e\x49\xfc\x57\x15\x70\x02\xd5\x34\x3d\xa8\x10\x8a\xa6\xc0\xb0\xe3\x53\x85\xd1\xc2\x28\x4c\x4f\xde\x8b\x23\x6c\xea\x17\x9f\x9b\xef\xa6\x90\xed\x3b\x41\x4f\x2e\xcf\x54\x99\x40\x2c\x5b\xa1\x8d\x2d\xaf\x6a\x96\xb1\xa7\x6a\x35\xd9\x72\x85\x59\xdf\xf3\x5d\x16\xa3\xc8\x67\xec\xa8\xc9\xa0\xc8\x92\x98\x26\xa9\x6a\x8e\x2a\x8b\x9a\x26\x91\x1a\xe3\xdb\xaa\xaf\x5a\x44\xf2\x44\xcb\x35\xb3\xed\x08\x10\xb3\x52\xf3\xca\xe5\xba\xef\x21\x98\x87\x16\x83\x09\x20\x15\xa8\x30\x80\xfc\x90\x54\x68\x2a\x2f\x18\xc0\x16\xd3\x22\x3c\x34\xca\xa4\xee\x7b\x7e\xd4\xb2\x0d\x1e\xf1\x1a\x6c\x1a\xe5\x86\xda\x28\xab\x52\xbd\xa2\x95\xa9\x1d\x40\x73\x37\x82\x65\x49\x04\xeb\x74\x71\x64\xc9\x5c\xcc\xdd\xc8\x40\x6a\x72\x7a\x3c\xc3\x65\xe7\x4b\xd3\x92\x15\x50\x65\xec\x48\x83\x42\xd5\xae\xb4\x60\x48\x74\x46\x0c\x98\x3c\xb1\xa1\x4f\x6c\x46\x8e\x0c\xc6\x0a\x48\x05\x0a\x10\xab\x44\x20\x98\x20\x22\x59\x30\x84\x4a\x0d\x23\xa8\xe1\x3a\x14\x30\xa3\x21\xa6\x26\xeb\x8e\x2e\xf9\x7e\xc8\x82\x08\x84\x7e\x19\x75\xaa\xc8\xab\xfa\x86\x84\x65\xe4\xa9\x48\x36\xdd\x0a\xb6\x6c\x44\xe5\xc7\xca\x99\x9c\x59\x98\xd8\xfe\x23\x7a\xbf\xfc\xc3\x01\xff\x18\xea\xb3\x1b\x52\x7f\x97\xdd\x14\x1f\x0a\xe4\x68\xcc\x91\xc7\x39\xf4\x6e\xe0\x54\x70\x06\xd0\xc1\x15\x60\x5d\x12\xdb\x3c\x3d\x35\x36\xd5\x8b\x2d\xcd\x0d\x66\x69\x3f\x9a\x72\x80\xde\x17\xac\x48\xf2\x9f\x24\x7f\x26\x8b\x29\xb4\xce\xd4\xe2\x62\xbc\x22\x0e\x5d\x17\xcc\x57\x3f\xe3\x53\xf1\x54\x63\x5a\x7e\x0d\xfb\x8a\x84\x65\x19\xea\x44\x54\x60\x18\xc9\x8c\x15\x21\x56\xe9\xe8\xb2\x24\x28\x0a\x22\x35\x82\x05\x0f\xb3\x52\xe4\x32\x6e\x24\xc6\x7c\x32\xa0\x22\xab\x8e\xa9\x22\x1e\x96\xe5\xa8\x26\x92\x0a\x74\x89\x1b\x7f\xaa\x21\x71\x19\x97\x05\xba\x67\xc7\x46\xb0\x5f\x32\x03\x07\xa9\x5a\x5d\x73\x2c\x95\x73\xea\xf5\xba\x65\xc9\x86\xe6\x5b\x9e\xe1\x69\x1e\xc9\xe7\x1d\x3e\x8f\x3d\x49\xf2\x79\x46\xf3\x34\xcf\xf0\x2c\x5f\x53\x35\xd3\x6e\x59\x72\x24\x59\xa4\x64\x91\x80\x17\x74\x68\x3b\x65\x5f\x55\x7c\xc5\xb2\x14\x5f\x56\x51\x88\x74\xd3\x03\x80\x81\x5a\xd7\xe4\xca\xd9\x3a\xdd\x09\x03\x38\x00\xa8\xc2\x95\x71\xbb\x8c\x50\x46\x6d\x97\xb3\xf5\x3d\x6e\x18\x72\xee\x6c\x25\x83\x7b\xb9\x1b\x63\x3d\x45\xe3\x46\xe6\x4e\x53\xfb\x8e\xa5\xd4\xc9\xd2\x63\xc5\x80\x15\x3b\x75\x46\xc7\x1d\x1e\x33\x4a\xa7\x0e\x3d\xb6\xd9\xe1\x33\x8d\x58\x6a\x7c\x62\x77\x5c\xcf\x63\x5d\xe8\x77\x78\x58\x49\xec\x2c\x97\xe6\x7c\x72\xd3\x53\xb0\x79\x18\x37\x85\x51\x8a\x31\x34\xd8\x44\xc6\x40\x8a\x9e\xa9\x7a\x25\x37\x14\x4b\xae\xa1\xf1\x6d\xdb\x0b\x74\xa8\xb1\x02\x8e\xaa\x18\x33\x72\x54\xe5\x5c\xd9\x71\xda\x0e\x71\x04\x2c\x40\x89\x0d\x4b\x1e\x82\x22\xb1\x22\x60\x63\x56\x26\x79\x68\xc5\xf5\x86\x5d\x35\x27\x72\x12\xb5\x3b\xc5\x24\xc6\x7b\x45\x1a\x6f\x35\x87\xb6\xd2\x4f\x07\x33\x5d\x84\xa5\x4c\xa5\xad\x60\xd6\xeb\x38\x50\xc6\x79\x9e\xe5\xf9\xa0\x6c\x94\x84\x8a\x69\xea\x7c\xe4\xfa\x51\xa0\x33\xbc\x1b\x95\x19\x8b\x93\x22\x0f\x41\x2d\xaa\x0b\x96\x1e\x55\x48\x4d\x46\x52\x09\xda\x51\x0d\x23\x0f\x06\x28\xae\x3b\xe8\x9e\xc9\xb5\x38\x29\x8d\x89\x06\xc3\xbe\x34\xfd\x8c\x49\xbd\x16\x81\x6c\xcb\x46\xa6\x27\xfa\x96\x2c\xf3\x51\x5d\x21\x2e\x71\x75\x68\x40\x43\x8a\xdc\xb9\x46\xb1\x23\xd1\xf9\xed\xc5\xfe\x87\x7d\x26\x4b\x9e\x22\xf7\x9f\xe7\x9f\x02\xd7\xc2\x22\xfb\x02\x6d\x4b\x9a\xb3\x45\xe5\x84\xc2\xc4\xae\x0f\x51\x1c\xb2\x5e\x1e\xb0\xa0\xe7\x8f\x97\xf8\x1e\x3e\xb7\x25\x5d\xcf\x13\xdc\xcb\x3c\xe5\xcf\xbe\xd4\x57\xbc\xd7\x9e\x0c\xcc\x31\x1f\x85\xf4\x90\x08\xda\x59\x71\xb6\x8e\x69\x52\x0f\x1e\x1a\x10\x78\x2d\x12\x10\xc9\xeb\x02\x82\x6c\xe8\x72\xf9\x8e\x82\x18\xd4\x31\x1a\xa4\xe5\x41\xa9\x69\x9a\x24\xa8\xb8\x8d\x9e\x7f\x3a\xd7\xa4\xfb\x01\x9a\xe3\xe5\xb9\xe7\x53\x9f\x47\xab\xab\x71\x2d\x4e\x00\xa3\x49\xdc\xcb\xe8\x30\x6f\x92\xf8\x8d\x01\x71\xa8\x71\xa2\x53\xa2\xd9\xad\x74\x85\x8f\x4c\x23\xb2\x0c\x46\xb5\xa2\x4a\xb6\x85\xdb\x35\x8c\x33\x52\xbb\xc6\x09\x51\xb9\x2e\x20\xc1\x85\x4e\x84\x7d\x6c\xc3\x7a\x94\xef\x94\x5c\x97\xd5\xa2\x0a\xec\xaf\x5d\x21\x8d\x57\xe5\x69\x5b\x7a\x38\x70\x65\x8a\xd5\x23\x16\x26\x76\x7d\x78\x7e\x1b\x73\x98\xcb\x83\x91\xc4\x97\x7c\x74\x68\x75\x58\x3e\x3d\x52\x84\x23\xbd\xf6\x59\x39\x85\x54\xed\xc0\xd0\x44\x43\x37\x94\x59\xc4\xd6\x23\x8c\x31\x2c\x13\x95\xcb\xa3\xd9\xc0\x36\x79\xc4\x4b\x4a\x56\x26\x95\x48\xb5\x59\x39\xaa\x25\xf9\xca\x58\x3a\x2e\x06\xe7\xa6\x48\x48\x0b\xdc\x0f\x0c\x30\x21\xeb\xbd\xc7\x4d\x00\xc4\xb8\x5d\xc7\x38\x23\xb6\xeb\x59\xb4\xf0\x61\xbf\xde\x29\x79\x1e\xab\x45\x55\x88\x01\x48\xf5\x30\xbd\x3f\xdc\x71\x2b\xed\xf3\x63\x7d\x5f\x54\xba\xb6\xa6\x11\x20\xd4\xdf\x7a\xa4\x98\x66\x05\xa7\xa1\xfb\x89\xdf\xf8\x68\xaa\x09\x68\x24\x41\x18\x30\x41\xa4\x0b\x3e\x74\x19\x47\x8e\x1c\xa2\xd5\x89\xae\x42\xbb\x52\xf3\x5d\x54\x75\x85\x48\x67\xc2\xa8\xc9\xf0\x51\x93\x29\x31\x80\x00\xce\x69\x46\x12\xa9\x94\x4a\x42\x20\xd4\x43\x0d\x2b\xae\x1f\x1a\x25\xdb\x87\x3c\x53\x8b\xca\x30\x20\x06\x0d\x9c\x8c\xf7\xe5\x06\xdd\xe3\x1e\x90\x64\xd4\x5b\x3e\xb7\x29\x4b\x99\x42\x03\xf5\x12\x8d\xc4\x38\x8a\x18\x08\x0a\x5b\xe9\x00\x13\x67\x2c\xdc\xb1\x31\x2a\x59\xb0\x82\xa3\x0a\x23\xb1\x7e\xc7\xce\x4a\xa8\x24\x60\x84\x9a\xa5\x8e\xed\xfb\xac\xe4\x3b\x3e\x94\xa0\xd9\x6e\xc2\x6a\x62\xef\x7e\x26\xbd\x73\x3a\x18\x80\x02\xb7\x7d\x67\xf3\x98\x05\x63\x96\x2f\x05\x73\x71\x17\x89\xfd\xf2\xc1\xbd\x64\x06\xa5\x79\x54\x0f\xea\xcd\xa6\x1e\xee\x46\xe2\xd9\x98\xa1\x9e\x8d\xa3\x45\xa8\x67\xe5\xd9\x2a\x8e\x15\x27\x71\x72\xf2\x6c\x53\xcd\x58\x82\xeb\x95\x1b\x22\x04\x25\x45\xe1\xdb\xb6\x4d\x3c\x4e\x8e\x6a\xa8\x15\xd5\xe3\x61\x55\x6b\x3c\xe6\xad\x16\x44\x20\x03\xf3\x5d\x2d\x27\x72\x32\xd8\x8f\x9e\xe5\x1d\x4c\x6b\x1a\xb4\x5c\xc6\x28\x86\x56\x4f\x72\x60\x9e\x13\x4c\xc3\xf2\x25\x6c\x2a\xb3\x5e\xc6\x6d\xbb\x19\xbe\xd3\x40\x88\x71\x23\x97\x93\xf7\xb4\x6c\x9b\x0f\x04\x3b\xab\xd4\x51\x35\x42\x2e\xd3\x20\x12\xd4\x7a\xfd\x54\x72\x01\x97\x2f\x4c\xcc\x98\x73\xfd\xa4\x7a\x46\x4d\xf0\x32\x77\xec\x37\xa4\x67\xca\xc3\x18\xdd\xfd\xe7\x63\xba\x16\xeb\xa5\x99\xcb\x87\xe8\x98\xee\x33\xf8\xc2\xc4\xee\x7f\x1f\x92\xc3\x6e\x57\xe3\x7e\xc7\x2d\xed\xe9\x07\x58\x1c\xcb\x0c\xdd\x15\x2f\x5f\x31\xa4\x1f\x40\x37\xdb\x24\x2d\x52\xb6\x2c\xdb\x16\x0c\xc7\x68\x55\xdb\x72\xf6\x8b\xb8\x5d\xc1\x38\xa3\xb4\x2b\xdc\xd2\x57\x36\x6e\xf8\xe5\xb9\xe7\x1e\xb0\x65\xe4\x00\x38\x79\xe5\x15\xd1\x07\x3b\x81\xe3\xb0\x46\x54\x82\x61\xaf\x7d\x5e\x0e\xc5\xfd\x8c\x5b\x56\xe0\xde\xfc\xc6\x80\xde\xa4\xf3\xe4\xb9\x4d\xd4\x4f\xf6\xf4\x81\xfe\xb8\xb1\x3e\xdd\xb1\xef\x50\x7f\xd2\x18\xe9\xc2\xc4\xe6\xfd\xe2\xe7\x37\xff\xb8\xdf\x4f\x3b\xb1\x8f\x77\xec\x33\xa4\x7b\xec\x3e\xf6\x2c\xc5\xe5\xd8\xbe\x33\xa5\xef\xea\xda\xb9\x73\xb3\xf5\xc2\xe4\xf3\xbf\xeb\x9c\x47\xb3\x90\xff\xee\xfd\xbd\x7a\x93\x98\xfb\x0f\xcc\xe3\x63\x3c\x6f\xe5\xc2\xc4\x8e\xf7\xcf\x95\x9f\xe6\xf5\x0d\x38\xbf\x8f\xb5\x46\x57\xde\xde\x29\x1f\x3d\x80\x19\x42\x5a\x6b\x06\x82\x08\x7d\x58\x32\x89\x41\x4c\xe2\x11\xd1\x60\x3c\x52\xc9\x94\xda\x5a\x16\xe0\x76\x13\xe3\x0c\xdf\x6e\x72\xbe\x2c\x8a\xa4\x1c\xe2\x12\xb4\x09\xae\xf9\x50\x26\x18\xd7\x3a\x75\xd7\x65\xc5\xa8\x05\xed\xb9\x79\x60\xf6\xe2\x70\x06\xef\x65\xe9\xfe\x76\xa0\xd2\x7e\x60\x5b\x79\x4f\x95\xa9\x76\x4a\xff\x1f\x63\x6f\x02\xe7\x36\x75\x27\x8e\xbf\x27\xd9\xb2\x39\x1a\x34\x0e\x21\xe6\xf6\x10\xe2\x71\xa0\x80\x61\x98\x44\x09\x49\x46\x04\x92\x88\x5b\x0d\x04\xc4\x55\x04\x85\x44\x9c\x55\x2f\x10\x10\x40\x0d\x05\xc4\x2d\xc8\x4c\xa2\x4c\xc8\x44\xe4\x74\x6e\x67\x92\x50\xd3\xed\x61\x5a\x76\xeb\x6e\x2f\xf7\xa0\x6b\x60\x77\x19\xda\x7f\xbb\x66\x69\xb7\x6e\xb7\x87\x33\xb6\x9e\xff\x1f\x3d\xc9\xb2\x24\x0f\xfd\x2d\x61\x1c\xe7\x49\x23\xbd\xe3\x7b\x9f\x14\xe7\xd1\xf4\xa8\x88\x3b\x40\xb5\x80\x69\x42\x60\x19\xcd\xaa\xaa\x92\x49\x04\x6c\xd6\x0e\x08\x5c\x43\x29\x43\x65\x5d\x89\xc2\xc9\xfd\x0d\xe7\xd4\x39\x89\x6a\x98\xa1\xa9\x51\x60\x55\x70\xf6\x9c\x9a\xc9\xf3\x9c\x55\xb6\x25\x09\xa2\x6c\x95\x4c\xb2\xd8\x64\xa9\xac\xa5\x56\xac\x8a\x28\x25\xcd\x24\x0f\x25\x2b\x4e\xd4\xad\x1c\x51\xab\x18\x90\x6f\xf3\x08\x8c\xef\x63\x25\x1f\xbe\x47\x70\xaf\x48\x06\xeb\x1c\xc7\xbb\xfb\x1b\x9e\x82\xbd\xc7\xd3\x5d\xa6\x1a\x63\xec\xb7\xa7\x72\x02\x3b\x51\x36\x61\x36\x92\x6c\x54\x25\x7b\xe9\x26\x11\xb7\xea\x14\x73\xa4\xe2\xe4\xe9\x45\xa5\x23\x46\x0c\x20\xcd\x18\xb7\x74\x03\xb2\x4e\x0c\xb0\xd3\xb7\xd4\xa1\xca\x98\x10\x82\xa8\x8f\x0e\x9e\x09\x7b\x3d\xf1\x15\x67\x43\x93\x99\x5c\x26\x4b\xea\xa8\x62\x09\xe4\xb8\xd9\x64\x4c\x23\x27\x47\x38\xa8\x37\x8b\x8a\xa6\xca\xaa\x21\xca\x3a\x2c\xb3\x64\xa9\xc9\x50\x0a\xc3\x30\x1a\xca\xd6\x9a\x45\x45\x21\xaa\x99\x54\xde\x20\xe2\xb2\x28\x2b\xaa\xc8\xb1\x32\x8c\x37\xe2\xd0\x00\x6d\xdb\x93\x44\x49\x1d\x48\x72\x32\x3c\xda\x0d\xc3\xcf\x0c\x88\x98\x39\xde\xaa\x58\x74\x54\x9b\x50\x64\x5d\x57\x25\x52\xb0\x85\xc5\x71\x13\xe7\x86\x52\x92\xce\x67\xea\x86\x55\x43\x6c\x5e\xd1\x61\x8e\x48\xc1\x52\xb6\x69\x36\x0d\x4d\x27\x65\x17\x27\x71\x0e\xbb\x10\xd3\x29\x19\x6b\x72\x9f\x0e\x64\x4e\xf6\x52\x5d\x1c\x69\x8e\xeb\x34\xed\x99\x05\x4f\x85\xbd\x3d\x06\x99\x34\xc9\x64\xb3\x4a\x98\x16\x9f\x91\xa1\x46\x88\x59\x4b\x45\x5c\x05\x89\x2c\x14\x0b\x86\xac\x29\xba\x94\xb2\x14\xc2\x6c\x56\x61\xd2\xe6\x4a\x84\x49\x80\x68\x29\x97\x33\xf2\x56\x6e\x5c\xcb\xd3\x39\xba\x92\x63\xcd\xac\x2c\x29\x82\x2c\xc8\x79\x42\xc8\x5b\x3a\xcc\x8c\x73\x30\xe3\xe2\x9b\xe9\xe8\x2b\x7b\x8f\xf2\xe1\x1b\x89\xe3\xed\x53\x94\xea\xe6\x46\x87\xeb\xb8\xb9\x40\x39\xbb\x5d\x97\x8d\xcc\x16\xb3\x02\x59\x90\x25\x49\x4b\xe5\x05\xa6\x41\xe7\x60\x89\xd7\xec\x79\x1b\xb0\x86\x68\x4a\x65\x24\x75\xa2\xe0\xc0\x64\x44\x9b\x50\xa9\xa4\x62\x55\x2d\x5e\x87\xba\x33\x07\xd1\xc6\xb1\x44\x7a\x6f\x3c\x40\x53\x4c\x8c\x7b\xb6\x0c\x08\x43\xe3\xb2\xa3\x37\xdb\x23\x09\xea\xd0\xa7\x1c\x18\x86\xa0\x25\x63\x39\xd5\xe6\x59\xc7\xf9\x65\x40\xb7\xe0\xe0\x02\x9c\x49\xa6\x44\x41\x03\x60\x54\x51\x4c\x5b\xec\xe2\xa8\x8c\x25\x1b\x50\x9c\x30\xf2\xa4\xd4\xd4\x0b\x06\xd4\x90\xe2\xd1\x74\x8d\x92\x12\xe9\xbd\xb1\x90\x9c\xc5\xc6\x14\x4c\xa3\x2e\xea\xa2\x5d\x0e\x2f\x3d\x18\x9a\x2f\xeb\xd4\x6f\xdb\xf4\x7e\x60\x7c\x5b\x6b\x56\xec\xa3\xe8\x47\xf6\x3a\xa2\x1f\xd2\x4b\xf7\x91\xf0\x53\xad\x0f\xe7\x3e\xc7\x76\xe8\x5d\x16\xf4\x82\x34\xb6\xb9\x61\x5c\x70\x20\xc6\x8f\x2d\x53\x7b\xdb\x45\xcb\xfd\x59\xe9\xf6\xba\xeb\x51\x13\xd2\xa8\xd6\x14\x93\x52\x44\x30\x9b\xac\xa9\x9a\x22\xcc\x16\x50\x1e\xe6\xb2\x29\x4b\x23\x4c\x3a\x6e\x55\x88\x52\x9c\x26\x78\x4b\x4b\x66\x88\x42\x53\x71\xc8\x07\x32\x0d\x64\x30\x9a\xc5\x48\x12\x91\x92\x79\x5b\xb5\x37\x44\xd9\x10\x25\x49\x2c\x21\x53\x16\xcb\x4d\x1a\x66\xbd\x73\xc0\xf2\xe6\xd8\xf7\x3b\x3c\xcf\xab\x7f\xad\x26\xd2\xbb\xf7\x07\x78\x81\xe3\xb7\x4b\x26\xd2\x7b\x22\x81\x71\x47\x9e\xd5\x12\xe9\x43\x3f\xed\x3a\xff\x7c\xfb\x9c\x69\x6a\x8f\xea\xf1\x32\x31\x96\xb3\xcf\x65\x0f\xae\xb5\x6c\x73\x34\x3c\x7e\x7f\x8b\x8b\x0d\x53\x72\xa2\x6f\xef\x49\x20\x4a\x16\x6c\xae\x75\x52\x87\x67\xc9\x89\xf4\x9e\xbb\x03\xf3\x34\xdb\xf9\xb5\x3b\xee\x9b\x1c\xee\xc6\x7e\x13\x18\x17\xf1\x38\x93\x48\x0f\x63\xdb\x90\xc7\x13\x9d\xf9\xd8\x72\xf7\xbb\x81\xf9\xe4\xbc\x1c\x9a\xff\x0c\x8d\xbb\x76\x9f\xfd\x37\x85\xc6\x79\x27\xaf\xfd\x80\x05\x00\x9d\xde\x8b\xda\x57\x5d\xfe\x8a\xf7\x74\x04\xbf\x63\xa4\xe2\x9b\x2b\x86\xd1\xb1\x56\x68\x6d\x36\x2c\xaa\x89\xf4\xf6\x07\x02\xe3\x39\xa7\xe6\x41\x22\xbd\xfb\xf7\x81\x77\x0b\x38\xdf\x54\x4d\xa4\x87\xb1\x2d\x6a\xe8\x16\xdf\x1e\x39\x36\xaa\x9b\xba\x70\x00\xaf\x6d\xcf\xa3\x21\x1c\x60\x9d\x5e\x2c\x07\x4a\xb8\xc7\xc1\x8d\xde\x6f\x45\xdc\x1a\xe7\xbc\xab\xc3\xce\xec\xe0\xe7\xcc\x7e\x27\xd5\x13\xd7\xab\x6b\x6b\xb0\x03\xb3\x07\x66\xc1\xe3\x63\xbd\x03\x04\x17\xe1\x1a\x05\x93\x8c\x37\xeb\x88\x36\xa3\xa9\x8a\x95\x2a\x13\x29\xd6\x32\xea\x92\x95\x91\x08\x4d\xb6\x58\x62\x3c\x6e\xa9\x64\x2a\x4e\xc4\x29\x1e\xd7\xce\x8a\x5b\x25\x24\x1b\xa8\xc2\xe7\x04\x58\x42\x6a\x4e\xd5\x60\xca\xc8\xc4\x4b\x95\x54\xbd\x2d\xdf\xda\xeb\xe2\xba\xf4\x69\x1c\xa6\x77\xbc\x2d\x9e\x7b\x93\xc1\xe8\x05\x65\x4f\xc8\x85\x39\x4b\x8b\x6a\x96\x96\x24\x33\x16\x57\x26\x32\xac\x65\xd6\x55\x8b\x97\x09\x59\xb5\x38\xa2\x96\xa2\x38\xab\xa4\xc3\xa4\x95\xd5\x75\x45\xd2\x51\xd1\x9e\x43\x05\x99\x45\xdd\xac\xeb\x52\x60\x4f\x37\xbe\x10\xd8\xd3\x5c\xbb\x6f\xc4\xa8\xd0\x05\x2f\x18\x4e\x0f\x5f\x19\x18\x77\xe0\x34\x9b\x48\x1f\x76\x64\xa8\x57\x7c\xe3\x39\x1b\x9f\x0e\x2c\x0f\x3d\xdf\x8d\xa3\xdf\x80\xfb\x0e\x6e\x8c\xf8\xe0\x14\xcb\x7a\x87\xa7\x75\xc1\x2f\x96\x19\x47\x6f\xc0\x67\x89\xbb\x78\xd8\xbf\xeb\xbd\xdb\xa6\x69\x13\x81\x77\x38\xba\x26\x93\x48\x8f\xfc\xaa\x03\xa7\x38\x4e\xc7\xbe\xff\x61\x40\x82\x93\x5c\x9f\x59\x7f\x8f\xd3\x9e\x21\x28\x50\xe1\xf2\x15\x7e\x49\xee\x1b\xa6\x89\x16\x9a\xd9\x2c\x54\x4d\xa2\x60\x71\x24\x5b\x2f\x93\x3c\xca\x30\xbc\x56\x8a\x66\x3a\x4a\xf3\xc3\x0d\x25\xf2\x04\xa3\x8a\x30\x85\xc6\x0d\x34\x6e\x18\x30\x25\x8a\x52\xcd\x02\xcd\x9a\xa2\x90\xb4\x23\x6b\x79\x34\x3d\x93\x48\x0f\x0b\x21\x7c\xe1\x63\x22\xce\x3f\x7f\x09\xcf\xfb\x7f\x1d\x3e\x08\xe3\x2d\x96\xaa\x53\x59\xb7\xe6\x2b\x86\x13\xbf\x95\x7b\x8e\xc3\x5f\x6c\xc8\x11\xa2\xbc\x25\x25\x53\x64\x0a\xe7\x21\x67\x52\x49\xab\x86\xa5\x4c\x3e\x92\x6f\xf0\x54\xd6\xe2\x64\xa9\x99\x53\x54\x52\x94\x64\x03\x6a\x13\x45\x98\x6f\xc3\x82\x6e\x9f\xe1\xf0\xdb\x9d\x33\x04\x51\x70\x4f\x8b\x8b\x3d\x42\x2d\x02\xa4\x5b\x05\xf1\x6c\x77\xc7\x70\xcd\x41\x7f\x66\x19\xf6\x2b\x9f\x19\x14\x80\x07\x7a\xc9\xb7\x74\x1d\xbd\x89\xb4\x68\x52\x80\x85\x8c\x39\xce\x70\x19\x89\x95\xc5\x14\xca\x08\x56\x45\x42\x59\x05\xe6\xd1\xc3\xd4\xf7\x8f\xcc\xa5\x16\x18\x8d\x82\x61\xd8\x18\x46\x1e\xb6\xca\x91\x59\x43\xe8\x03\xf4\xcc\x5b\xf1\x2d\xd3\xa5\x31\x78\x22\x1a\x40\x1f\x3c\xd4\x40\xcf\xbc\xb4\xcd\x2a\x0a\x02\xc1\xa2\x5c\xc9\x83\x2f\x29\x91\xde\xbd\xd7\xa7\xeb\x10\x40\x6a\x65\xed\xb5\xb4\xad\x44\x8e\xf2\x86\x65\xf4\x9e\x19\x3d\xd8\xfe\x82\xcd\x97\x18\xcf\xc4\x68\xd6\x2a\x92\xac\xc5\xc3\x24\x34\x44\xc4\xa0\xaa\x89\x6a\x88\x91\x61\x0e\xc6\x2d\x81\x64\xad\x3c\xc6\x35\x2a\x6b\xc9\x15\x03\xe5\xcd\xfc\x38\x34\xac\x0c\x51\x46\x4a\x55\x2f\x41\xce\xa8\x18\x50\x6c\xf3\x9a\x22\xa6\x4f\x98\xb6\x8f\x2e\x77\xe5\x17\xbd\xa5\xc5\x54\x8a\x0d\xea\xaf\x3d\x58\x7f\x9d\xe6\x03\x37\x5c\x67\x4a\x8c\x32\x13\x25\x93\xac\x37\xe3\xa8\x42\xf1\x56\x8a\xd0\x2c\x85\x64\x8e\xd0\x64\x12\xdb\x42\xb3\x14\x8b\xc5\x57\x4b\x35\x2a\x46\x0b\x18\x06\x04\x46\xc5\x3e\x23\x0d\xd3\x58\x47\x47\x76\x6b\x22\xf9\xe9\x48\xbb\x8e\x8f\x1b\xa6\x85\xab\x23\x10\xf9\x08\x68\x02\x93\x28\x59\x8c\xc5\x46\xf9\x86\x64\x46\x0c\x48\x1f\x01\x04\xa7\xb6\x00\x32\x24\xc8\x91\x2a\x4c\x42\x5a\xa9\xa1\x02\x95\xb5\xca\x3a\xa4\x9b\xd9\x1a\x29\x5b\x19\xa4\x18\x19\xb1\xa2\x6b\x72\x51\x2d\x28\xb9\xbc\xbf\xbf\xd5\x09\xd8\x0f\x0d\xfe\x0f\xd8\x04\xeb\xff\x6f\x4c\x92\xff\x31\x16\xf9\xf9\xf2\xc1\x6d\x5d\x3c\x27\xd7\x91\xcb\xf6\xfc\xcd\x1b\x67\x1c\xfe\xb8\x05\xf7\x16\xf6\xd1\x29\x9b\xff\xda\x7c\xf3\x94\x2e\xfe\xab\x61\x79\xb0\xd0\xc5\xaf\xb1\x4e\xbe\xf7\xcd\x80\xac\xca\xe0\x3a\xfa\x3c\xee\xf2\x75\xb6\x63\x61\x89\x44\xfb\x52\x33\xa7\x47\xa2\xed\x28\xc0\x74\x9f\xbb\x0b\x31\xa7\x5b\x76\xba\xaf\x97\xb2\xb1\x56\x26\x0a\x6c\x12\x55\x51\x29\x4b\x94\x88\x12\x8f\x4a\x48\x4b\x32\x64\xde\xaa\x15\xa1\x26\x4b\x82\xd9\xcc\x98\x15\x19\x16\x4a\x56\x01\xe6\x22\xa9\xaa\x8e\x4a\xda\x38\x59\x69\x66\x22\x8a\xac\x24\xe3\x86\xa2\x33\x29\x55\x36\xea\xba\x96\xcd\x5a\x49\x49\x22\x4a\xb2\x5a\x84\x00\xe9\x46\xa5\x64\x65\xa1\xde\xa1\xdf\x3a\xd6\xc9\x71\x9f\xcb\x75\x3f\xf2\xd6\x23\x76\xf6\x8b\xa6\x86\x6e\x0e\xef\xe3\xde\x6f\x84\x78\xb7\x5b\x03\x76\x93\x19\xa2\xd3\xac\x43\xd3\xf6\xfc\x18\x8f\x8f\xf8\xf6\x4b\xa5\xe8\x44\x7a\xd3\x6a\xdf\x7e\x45\x81\xda\xca\xc6\x24\x97\xf7\x1d\x07\x4e\xea\xf0\xbf\x01\x5b\x9f\xc5\xa2\x7d\xb4\xbf\xe7\x78\x6c\xd8\x1d\x98\xed\xb8\x5a\xa0\x61\x2b\xcf\x26\xa9\x34\xb5\x88\x6a\x36\x70\xb5\x37\xa4\xa3\xac\x0c\x8b\x90\x8b\x43\x19\x32\x30\xab\xa2\x3a\x32\x28\x0e\xd1\x46\x11\xa5\xac\x38\x21\x5a\x06\x09\xea\xa8\x5c\x46\x45\x51\x17\x20\x28\xc6\x8b\x66\x45\x2d\x97\xec\x33\xab\xe2\xda\xe9\x0e\xee\x9c\xe3\xc3\x9b\xa0\x61\xd2\x69\x6b\x80\x8b\x4f\xd8\x02\x30\xa6\xb8\xd3\xa9\x18\xd4\x3d\x19\x3e\x1a\x37\x74\x4e\xc8\xa8\x2c\xc7\x59\xb9\x24\x0d\xe3\xe3\x72\xa5\x2a\x49\x9a\x02\x33\x92\x55\x37\x89\xf1\x24\x6d\xc4\x6d\x32\x82\x31\x58\xb6\xe2\xa2\x94\x32\x53\x99\x0c\xc1\x30\x59\x2d\xaf\x15\x34\x43\x53\x14\x08\x60\xbc\x59\x21\x8b\x3c\x9f\xe2\x98\x90\x7c\xe3\xd8\x51\x0e\x3f\xe4\xed\xb5\xe0\xf0\xbd\x51\xa9\xcd\x0d\x3d\xdb\x2b\xee\x05\xb8\xe1\xad\xc9\x75\x82\xb5\xb8\x77\x55\x00\xc6\x79\x9b\xee\x6f\xbc\x12\x8f\xbf\x14\xe0\xe9\x36\x6e\x9d\x1c\xc0\x09\xa3\x3d\x9f\x3c\xee\x65\xba\xe1\xe5\xc0\xfd\x99\x44\x7a\xe3\x8f\x43\xbc\x9e\x77\x72\xf2\xf6\xfc\x6b\x00\x26\x1c\x19\x80\x4e\xa4\x77\x7f\x10\x82\x21\xb7\x37\xd5\x8e\xbd\x21\x19\xc3\xad\xcf\xb5\xe9\xc9\x10\x2c\xf2\x4e\x9f\x90\x8d\xcf\xdb\xb2\x81\xbd\x0f\x34\xb5\x81\xf5\xf6\x0e\xaf\x61\xc7\x19\x01\x1b\x83\x80\x75\x4a\x16\x4c\x73\xab\xaa\x86\x6d\x0c\x34\x89\xf5\xef\x70\xb5\xd1\x76\x8d\xd5\x58\x4a\x10\x95\x5c\xa6\x20\x33\x0d\xb6\x6c\xc8\x02\xcc\x42\xc5\xc4\x1e\xa9\x42\x93\x86\x06\xd2\x78\x5b\x44\xc4\x35\x76\x29\x16\x9b\x20\x74\x5a\x8a\x8a\x96\x64\x8d\x23\x41\xac\x43\x0d\xa6\x88\x3a\x52\x0d\x03\x57\xd7\x45\x1c\x4a\x6a\x15\x9f\x8c\x4b\x3b\xbc\x3f\x41\xbd\xb6\x30\x80\x87\xc9\x44\xfa\xf0\xcd\x21\xd9\xd7\xc5\xcf\xdd\x3b\x02\x67\x9d\xc3\xf5\x3f\x18\xc7\xc6\x46\x53\x43\x4d\xef\x39\x05\xd7\xf6\x86\x9f\x3f\xf2\x26\x08\xd3\x05\x6c\x93\x1b\xfd\x73\x60\x3c\x9b\x48\x6f\x78\x31\x70\x16\x32\x96\xad\xc4\x44\x7a\xe3\x73\x5d\xfa\x13\xb6\x61\x1e\xfa\x7a\x08\x06\xa4\x98\x8e\x7d\x94\x6b\x02\xb0\x6a\xb6\x7b\x04\x1d\xbe\x28\x24\x37\xf2\x6e\x8f\xd5\x39\x5d\x74\x1d\xdb\x14\x77\xdc\xd0\x25\xaf\x3a\xfa\xd9\x5a\x9c\x8b\x86\xbb\x90\x0f\xdd\xe4\xcd\x49\xc4\xb4\xea\x99\x10\x6d\xcf\xb9\x6b\xc3\x72\xd6\xb0\x1a\x58\xb3\xd2\xde\x8b\x8d\x2f\x85\xe1\x7b\xd3\xd3\x5d\x67\x80\x7b\xfa\xec\x59\xda\x75\x06\xd8\x96\xb0\xe9\xa9\xce\xde\x79\xb1\xd6\x3a\xae\x25\x97\x02\x19\xf0\x69\x9c\x81\xee\x19\x10\x49\x2c\x3f\x85\x2d\x5e\x3e\xb3\x01\x59\xcf\x31\x50\x87\x79\x11\xf1\x48\x44\x3a\xca\xf0\x84\x5a\xb5\xc5\xbb\x68\x4a\x96\x59\xd1\x26\x40\x48\x35\x2d\x46\x27\x64\x03\x15\x28\x3d\xcb\xa0\x71\xdd\xcc\x41\x16\x95\x8b\x3a\x8c\xa3\x8a\x9e\xb7\x6a\x92\x14\xcf\xc5\x05\xc8\xd9\xb4\xc6\xe2\x4c\x52\x68\xd6\x79\x03\xea\x48\xee\xec\x0d\xe6\x87\x7b\x7e\xd4\xb5\x56\x8c\x4f\x5b\x8e\x0d\xd9\xa2\xf5\x58\xce\xde\xcb\x83\x6f\x74\xd1\x1c\xc3\xd6\x77\xc7\x7e\x1d\x3a\x2f\xdd\xc9\x29\xdc\xf4\xb5\x10\x8e\xf3\x36\x3c\xd3\x7d\x7b\x51\xcb\xd6\x18\x56\x6c\x7e\xee\x9a\xe8\x82\x7b\x06\xcb\x09\x6a\xc3\xb0\xef\x99\x1c\xc6\x69\x21\xf0\x4c\x5b\x4e\xbd\x8f\xba\x9f\x5e\xb9\xfe\xcc\xd6\xef\xc9\xc7\x06\xbf\x34\xff\x7b\x09\x0c\x99\x2e\xfc\xe1\x3c\x97\x83\xeb\x03\xf0\x97\xc3\x7c\x5f\x4e\xb4\xa9\x46\x7f\x17\x0c\xe0\xf1\xe1\x05\xbe\xf9\x39\xf4\xe4\x96\x6a\x90\x86\xf2\x6e\xac\xc6\xca\x49\xf4\x77\x1b\x8e\xe7\x06\xc6\xb9\x76\xdd\x92\x3d\x4e\x6f\xa3\xe5\xe1\xfb\x5d\x3e\xdc\x96\x5b\x94\x76\x7f\x7b\x7b\x3d\x34\x35\x74\xa3\x6f\x9e\x78\x7c\x43\x98\x0f\xdb\xf3\x97\x13\xe9\x3d\x95\x2e\xbd\x1e\xcf\x7f\x3f\xd6\x89\xf7\xff\xc0\xa7\xd7\x8b\x6d\x1d\x6e\x3f\xee\xd7\xb7\xff\x11\xdf\xef\xe4\x6d\xda\xe3\xe0\xc3\x4e\xcd\xf7\x0e\xac\xef\xef\x7f\xb9\x8b\x4e\xab\xf6\xbb\x37\x3e\x1b\xda\x0b\xde\xe9\x29\xba\xbe\x61\xbf\x7b\xa3\x86\xaf\x0e\xbb\xcf\xfa\x42\xec\x20\xb5\xdc\xdd\xef\xa5\x07\xff\x08\x9e\x6b\x7d\x38\x7f\xd9\x60\xd9\x3d\x23\x7c\x16\xa3\x2b\x42\xef\x91\x5c\x7b\xc0\x5d\x93\xe8\x9c\x36\xdf\x3a\xd0\xe5\x93\xc4\xcf\xd9\xb3\x24\x04\xa3\xb2\xdb\xcb\xf5\x87\x21\x18\xcd\xc7\xb4\x0e\x6c\x0c\x09\x01\x9b\x49\xa6\xbd\x1f\x63\xef\xfb\xd6\xad\x61\x7e\xf6\x78\x87\x8f\x02\x0a\xfb\x8f\x05\x57\xfe\x4f\x62\xcb\xfa\xcc\x80\x17\x6b\x46\xcf\xcc\x69\x51\x2f\xb6\x22\xda\x0e\xa1\x38\x73\xe6\x40\x2f\x54\x23\xb5\x06\x6d\xd8\xd2\x05\xca\x51\x62\x09\x9b\xee\x9b\x35\x94\x4c\x56\x4a\x50\x24\x4d\x5c\xc2\x53\x84\x2a\x91\x6a\x8a\x14\x8b\xb2\x36\x2f\xd1\xad\x2c\x6d\xd0\x85\x5c\x36\x6e\xc4\x49\x5a\xd7\x11\xaf\xa3\x24\xed\xd6\x4a\x2e\xb6\xed\x46\x07\x7c\x7b\x00\x28\xa0\xe0\xda\x28\x9c\xaf\xc6\x65\xa6\x33\xc7\x76\x25\x71\xd2\x8b\xf8\xf7\x6b\x7d\x7d\x73\x7a\x23\x02\x51\xb4\x58\x5c\xdb\xb4\x51\xc1\x85\x76\xa1\x81\xa4\x54\x54\x9e\xd0\xcb\xb1\x78\x83\x15\x22\x42\x5c\xd1\x34\x33\x65\x1a\xd9\x0c\xdd\x28\xb1\x12\x52\x28\x0e\xa5\xf4\xa2\x6e\x7f\xa0\xac\xae\x1b\x06\x52\x8b\x49\x33\xc5\x95\xd5\x9c\xbb\xc7\x98\x2f\x8c\xfd\x73\x08\x7e\x05\xc7\x96\xb4\xab\x15\x82\x05\xd5\xf5\x37\x9f\xd4\x65\xef\x74\xf8\xd1\x33\x5d\xb6\x27\xa7\xdf\xf4\x0c\xcc\x2f\xfe\xd9\x67\x4f\x10\xdb\x38\x38\xf6\x3d\xfb\xda\x01\xb6\xcd\xe1\x5c\xd8\xc2\xf6\x89\x9d\x73\xba\xf0\x1c\xc3\xe2\xae\xd5\x01\x58\x94\xb1\xfc\xc1\x26\xd2\xa3\xb8\x1f\xf0\xe8\x5f\x7c\xf3\xc2\x7a\x6b\xee\x86\xae\xe7\xe8\x1d\x39\x7c\x38\x19\xb6\x3f\xee\x5c\x3e\x09\xac\xab\x89\xf4\x81\xd1\x2e\x99\x48\xa2\xb4\x44\x7a\xe7\x35\x5d\x76\x1a\x0e\xd3\xa9\x3b\xbb\xf6\x09\xd3\xc1\x9d\x27\x85\x9e\xe3\xee\xc5\xa1\x46\x17\x7d\xc1\x38\xb3\xfb\xc9\xae\x71\x87\x1e\x61\xdc\x38\x74\x38\x2c\x4b\xee\xfc\x52\x17\xdf\x2e\xd8\x3c\x72\xe7\xf6\x00\x8f\x94\xf0\xb9\xa9\x38\x22\xb7\x1f\xcc\xc1\xbd\x24\xa6\xf5\x26\xa6\xce\x9e\x3a\x9d\x20\x13\xfd\x17\x4c\x9d\x6e\x83\x20\x89\x83\xb2\x09\xd2\x93\xd7\x7a\xd3\x03\xfd\xc7\x4f\xef\xd4\x01\xf4\x9c\x44\x9a\x35\x9e\xe4\x65\xde\x54\x72\x2a\x9f\x49\x1a\x29\x89\x37\x0d\xa3\x2a\x40\xa0\x6b\xa9\x66\x2d\xaf\x0b\x1c\x99\x8b\xe7\xe3\x30\xc5\xa4\x8c\x14\xd3\x8c\x13\x39\x4b\xc8\x10\xbc\x95\x37\x6c\xfd\x33\xaa\x18\x48\x40\xb5\x0a\x64\x18\xfb\x6f\x54\x80\x7c\x16\x55\xf2\x50\x2a\x9b\x6a\x69\x1c\x9a\xb0\x62\x15\x51\x0a\xe9\x42\x05\x0a\x10\x10\xa6\xaa\x69\x2a\x8c\xf3\x12\x23\xf3\x56\xc5\x28\x58\x79\x1d\x66\x3b\x70\x67\x74\x64\x8b\xe1\xac\xb7\x3f\x36\xff\xcc\x24\xd2\xbb\x8e\xed\xda\x1f\x07\xae\x5e\xec\xf0\x2d\x10\xc5\x75\xc4\x38\xdc\x1b\xa0\x5d\x57\x12\x40\x7f\x01\xb7\xd9\xed\x0a\x6e\x8e\xed\x03\xfa\x64\x57\x4a\xa8\xe9\x3a\x27\x66\x34\x96\x63\x27\xc6\x8d\x3c\x51\x81\x6c\x53\x23\x18\xab\x04\x4d\x24\x8a\x44\xd5\x4a\xea\xb0\x84\x18\x8a\xb1\x84\xa6\x26\x4a\x29\x23\x99\xc9\x10\xa5\x26\x1b\xe1\xec\x5d\x21\xe8\x3c\x32\x2b\x56\x0d\xd1\x6a\xb5\x33\x47\x81\xe2\x12\xe9\xc3\xef\x4f\x82\xab\x72\x22\x7d\x68\xea\x24\xb6\x42\x25\x91\xde\x17\xc1\x7d\x08\x57\xb7\xf9\x80\x67\x47\x50\xc1\x51\x8e\x54\xde\xa9\x30\x0b\x1d\x87\x5c\x0f\x4e\xa1\x76\x92\x9f\x6d\x81\x89\x8a\x39\x05\x4e\xfa\xc8\xde\x81\x5e\x83\xa4\x93\x99\x5c\x36\x45\xd4\x8f\xb0\x50\x2d\xe8\x12\x2c\x40\x06\x81\x68\xd6\xaa\x89\x4a\xc1\x94\xcc\x5c\x19\x02\xde\xca\xb5\x80\x6e\x96\xcd\x54\x19\x55\xf9\x24\x39\xde\x4c\x45\x4b\x1c\xc3\x08\xa2\xde\x28\x8b\x59\x4d\x87\x71\x22\x69\x55\x73\x8a\xa0\xa9\x2a\x6f\x0a\xb9\x71\x82\xd6\x45\x64\xb2\x9c\x21\xf2\x3c\xa9\xd7\x3d\x9a\xce\xf9\xfc\x3b\x27\x07\x2c\x2e\x3e\x33\xc7\x4c\xbf\xc9\x43\x88\xf2\x13\x79\x33\x92\x6c\x54\x61\xde\x40\x8c\x61\xe0\x7d\x06\x06\x62\x0d\x03\x07\xb6\x64\x2c\xce\x80\x9a\xc5\x36\x15\x45\x21\x35\x4b\x85\x35\xbd\xf3\xb5\x83\x77\x4c\x22\x7d\xf0\xc4\x2e\xbc\xc3\xfd\x47\xc7\xbe\xdb\xa5\x8f\x2b\x36\x9d\xd9\x59\x98\xe4\x7e\x25\x91\xce\x3d\xdb\xc5\xbb\xb1\x5d\x63\xd7\xaf\x42\xf4\x41\x71\xfb\xfe\xf4\x4c\x42\xf7\xb4\x44\xfa\xb0\xef\x7e\xcf\xc6\xaa\xe0\x2a\x0f\x17\x81\x41\xbf\xa7\x91\xe8\xe9\xa7\xa7\xf6\x4e\x73\x8e\x91\x88\x9d\x80\x91\xd9\x87\xcb\x03\x4e\xd1\xd6\x58\x30\x50\x27\x0f\x15\x03\xca\x48\x27\xe8\x64\x2e\x49\xc4\x11\x48\xb2\xaa\xa8\xeb\xa6\xc8\x30\x49\x23\x53\x94\x8d\x52\x9d\x87\xa9\xbc\x98\x69\x68\xb0\x88\xb4\xa8\x69\x88\x9a\x60\xa0\xac\x69\x33\x17\x58\x46\xd9\xa8\x5e\xad\xea\x55\x48\x43\x1e\x99\x2d\xa0\x8f\xd7\x73\xe3\x1c\x2a\x95\x6a\x30\x99\x41\x02\x64\x0a\x8a\xae\x17\xec\xab\x7a\x15\xa6\x8c\x3c\x9f\x37\xac\x94\xc5\xf2\x25\x92\x41\x49\x28\x04\x69\xf3\xee\xa0\x9e\xfc\x7c\x6b\x45\xec\x30\xf5\x00\xbd\x62\xc3\xf0\x1f\x8f\x59\x28\x0f\x16\xe9\x95\x87\xa6\xc0\xef\xb4\xbe\xb5\x70\x19\x0b\xe8\x25\xdb\xf4\xc5\x7f\x5b\x28\xb1\x7e\x7b\x92\x9a\x48\xe7\xa6\x84\xe8\xb8\xbd\xef\x7a\x22\x7d\xe0\xb2\x49\xe4\x47\xa5\xad\xa3\xac\xfb\x53\x40\x26\xe3\x12\xe9\xb1\x1f\x85\xce\x55\x71\xf8\xcd\x0e\x14\x1a\xd7\x62\x9a\xcd\x1f\x77\x91\x5d\x38\x6a\xd8\xcf\x71\xf4\xa6\x03\x18\x53\x87\x6e\xf0\xae\x61\xda\xb3\xf3\xc3\x49\x64\x4b\x5b\xee\xba\xa3\x4b\x76\x97\x3a\xbc\x6b\xed\xdf\x03\x32\xa7\x91\x48\xef\xee\x86\x59\xcc\x2b\x76\x3d\x15\x92\xc9\x5d\x9d\xe1\xe0\x74\x7b\x4e\x07\x4f\xf0\xf1\x66\x8f\x7e\xe6\xb6\x4e\xf2\x2c\x26\x91\x1e\xbd\xdd\xc7\x47\x28\x70\x7f\x6b\x69\x6c\x17\x75\x32\x96\x6a\x66\x60\x6e\x72\x71\x30\x6e\x73\x66\xff\x34\x5c\xae\x70\xda\xf1\x58\x9a\x71\x6a\x91\xa7\xd2\x03\x51\x27\x4a\xcf\xd6\xca\x8e\x82\xbd\x04\x75\x36\xec\xbb\x60\x21\x9c\xe3\x26\xbd\x92\x5b\x4c\x24\x98\x26\xcc\x21\x81\xf8\xc0\x80\xa9\x8a\xd4\x02\xc8\xe4\x72\x15\x21\x4e\xc7\x0d\x5a\x43\xf9\x16\xd0\xd0\x6e\x19\xd5\x91\x26\x41\x81\xe4\x61\x0a\x4a\x02\x32\x51\xc9\x62\x23\x4c\x5c\xd5\x95\x54\x21\x93\x89\xa3\x94\x88\x32\x02\xd4\x44\x54\x8b\x7e\x6c\x9d\xf4\xd5\x47\x88\x0f\xd0\x0c\xb8\xbc\x50\x64\x45\x55\xe6\xca\xa9\x64\x32\x43\xcb\xd9\x92\xc0\x0a\x0f\x2d\x47\x1f\xbd\xf9\xfc\x1a\x18\x43\x47\x9e\x5f\xb3\x01\x9e\x8a\xbe\x89\x1e\xff\xc1\xf3\xa7\xdf\xb9\x0b\x0d\x2f\x7f\x7e\xe1\xdf\x7d\xf2\xa7\xcd\xf3\x63\x21\x1e\xc2\xb8\x7e\x36\xd8\x45\x1b\xb0\x2c\x95\x3b\xbb\x0b\x26\x9c\xbe\xdd\xb6\x2e\x93\xde\xf1\x60\xc0\xd7\x62\x9f\xa5\x94\x48\x8f\xed\xf1\xe1\x7b\x1c\xc7\x34\x89\x01\xf9\x71\x3a\x38\x15\xc7\x55\x78\xb2\x63\xa7\x13\x10\x8e\x2a\x70\xd2\x66\xb1\x25\x1a\x9a\x91\x52\x83\xd1\x6d\x51\xb6\x1e\xd5\x26\x14\x33\xc2\x35\x0a\xed\x1f\x98\x52\xeb\x28\x27\x41\x96\x18\x87\x0a\x8c\x8b\x8e\x5d\x4f\xd4\x74\xa4\x35\x59\x22\xa7\x21\x59\x43\x92\x86\xca\xa2\x2a\xe8\x8c\xc4\x8a\x9a\xc8\xe1\x79\x66\x1d\x5d\x26\xff\x99\xd0\x5e\xa8\x8e\xec\xbe\xe3\x64\x8c\xc3\x7e\xba\xe7\xd8\xd2\x44\x9f\xef\x83\x72\xe9\x98\xe0\xae\x2a\xe5\xd4\x76\x9a\xea\xd4\x75\x72\xa5\x0b\x27\x12\x2d\x18\xe3\xde\xd3\x76\x7e\x14\x28\xa3\x62\x4e\x8c\xe3\x0c\x6d\x93\x00\x08\x20\x29\x96\x45\x55\x5e\x13\xf8\x94\x84\x03\xc7\x78\x2b\x63\x18\x04\x6b\x15\x29\xc1\xb0\x54\x42\xd5\x90\xa0\xe6\x10\x6f\x58\xa6\x2c\xd0\x66\x92\x23\x38\x05\x71\x0a\x91\x45\xe5\x80\x5c\x3c\x7a\xdb\x27\xe0\xe4\x67\xbb\x78\x2d\xd6\x33\x0f\x5d\x17\x92\xeb\x34\x47\x5e\xce\x33\x5d\xf4\x1f\xdb\x6f\x37\xcd\xb7\xcf\x7e\x13\xeb\xd3\xd1\x1c\x19\x34\x9b\x48\x6f\x7a\x28\x40\xbb\x72\xad\xab\x62\x6b\x28\x85\x4e\xef\x45\x1f\x02\x7a\xc5\x86\x6f\x98\xd1\x45\x16\xeb\xee\xae\xdb\x9f\xde\xa7\x57\x8e\x5e\x1b\x96\x6d\x46\xaf\xeb\x9a\xb3\x86\xed\x32\xd8\x76\xbf\xe3\xb4\xc0\xb8\x92\x48\xeb\xdf\xc0\x67\x37\xec\xa3\x2f\xf8\x39\x7b\x83\xfa\xa1\xd2\xbe\x7f\xf8\xc9\x80\x8d\xca\x93\x5d\x5d\xdd\xfe\xe1\x80\x2d\x40\x6b\xfb\x24\x37\xb5\x7b\x15\x65\xb1\xfd\x08\xd3\x60\x1d\x24\xd2\xfb\x66\x63\xc9\x76\x1b\x00\xe0\x28\x60\xb6\xae\x8c\xed\xa7\xee\x0b\xc0\xfd\xc9\xae\x3c\xd6\xee\x09\xd6\x8f\xbb\x79\x04\xfb\x84\xf9\xca\x7f\x11\x13\xf0\x03\xd4\x0b\xaf\xd0\x75\xf8\xec\xf3\xcf\xc3\x77\xd0\xd9\xd6\x6b\xe4\xce\xe6\x0d\x8f\xe2\x2a\x76\x3d\x1b\x36\x58\x45\xb3\x6a\x18\xd5\x6a\xf4\x41\x1d\x3e\x6d\xbd\x46\xdc\x64\x6d\x87\x0f\xe8\x68\xbb\x81\x7e\x6b\x10\xd7\x34\xbe\x49\xad\xf2\x15\xfd\xf2\x6c\x88\x52\x22\xbd\x31\x6c\x27\x65\x1d\x7d\x7d\xc7\xe3\x81\x7d\x2a\x7a\x36\x07\x6c\x5f\x1e\x5b\xe4\xdb\x27\xd5\xe6\x49\xf6\x46\x77\xc5\x0c\xd8\xb2\xc6\x5b\x93\xcb\x75\xf9\x6c\x08\xe7\xb2\xb1\x82\x7d\x9e\xa3\x7c\xd7\xfd\x66\x9b\xb7\x25\xa8\xed\x6f\x7a\xe7\xc6\x3a\xbe\xe7\x5d\x09\x7c\xff\x26\xef\xfe\x6c\xcc\xc4\xfa\x38\x86\x0b\xe3\x26\x1f\xdf\xd1\x3b\x3c\x72\xf8\xd6\x80\xce\x24\xd0\x2b\x36\x6c\x38\x0a\xcc\x7f\xd1\x86\xc8\xed\x6f\xf9\x9e\x85\xdf\xb1\xfd\xbd\x2e\x3e\x8c\x63\xfe\x76\xa4\xbb\xf8\x70\x01\xc3\x06\x7e\xc7\xfa\x63\xbd\x71\xc6\xf1\x6f\x3b\x3c\x6f\xac\x5d\x57\x2e\x5c\xb7\xee\x7a\xef\x7e\xc1\xb1\x39\x8e\x5e\x33\xb9\x9c\x3f\x36\x3e\xb9\x2d\x7c\xeb\xfd\x93\xf3\xce\xfc\xfc\x2e\xde\x89\xeb\x48\xe5\xde\x0d\xd9\x59\x05\xd7\x87\xf0\x0a\xde\xeb\x17\x7c\xf7\x63\x5f\xf3\x9e\x3f\x61\x3d\x78\x9b\xcf\x1e\x94\x6b\xc7\x6d\x6c\xf8\x56\xe0\xdd\xbc\xa7\x13\x62\xb8\x18\x5a\xee\xa3\xad\x9e\x6e\x43\x53\xeb\x16\x05\xf0\xcd\xd6\x81\xaf\x0e\x3c\x47\xed\xf8\xe8\xc6\x41\x82\xda\xf8\x55\xda\x7f\x7f\x26\x91\xde\x73\x24\xc0\xcb\x73\xad\x4b\x62\xaf\xe2\xfe\x13\x9f\x02\x3d\xd8\xb3\x3b\x6b\xb2\x9a\x72\x7e\xdc\x82\xbe\x1e\x2d\x91\x9f\x4e\x52\x3e\x0e\xfd\xcc\xa9\xb0\x07\x57\x13\x71\x93\x48\x59\xe3\xa6\x55\xa7\xb4\x60\x99\x38\x98\xeb\xe0\x57\x73\x8b\xe3\x8f\x8c\xc3\xba\x8f\x8e\x32\x89\xf4\x86\xd1\x2e\xbb\xb6\xa3\xe3\x7c\xd9\xc7\x27\x29\x70\x63\x8b\x8b\xbd\x41\xcd\xc1\x74\x22\x83\xbb\xb9\xcd\x75\xa2\xe0\x03\xb1\x54\xb3\xe7\x60\xef\x7a\x20\xc7\xca\xcb\x9f\x99\xea\x93\x5e\x36\x92\xc3\x08\x9c\x96\x26\x4e\x7b\x05\xdd\xb2\x7e\xc1\x55\x37\xff\xea\x5e\x0b\xce\x83\x5b\xd1\x2d\xc4\x33\x24\xc8\x94\xb5\x92\x52\xd0\xcd\x32\x5f\xd2\x0a\x0c\x53\x66\x75\x35\x73\x56\x27\x7e\x37\xb3\xe6\x33\xcb\xac\x7d\x77\xdc\x03\x3f\x7b\xd9\xdc\x47\x0e\xfe\xc5\xfa\xe3\xff\x07\x7f\x8a\x0c\x54\x97\x05\x5d\xd0\x74\x41\xe7\x95\x5a\xbd\x98\xcb\x15\x9b\xb7\x5b\xac\x28\x12\x45\xc4\xb8\xb1\x56\xb9\x76\xac\x12\xa6\x93\xe9\x7d\x7f\x04\xf5\x04\xb5\xe9\x5d\x1f\xce\x31\x89\xf4\xf6\xe7\xba\xec\x0b\x0e\x8d\x79\x05\xc3\xcc\x75\x9e\x7d\x44\x74\xec\x0e\x23\xef\xe0\xf1\x6b\x5d\x79\x22\xd7\x5a\x14\xbb\xc5\xd5\xaf\x8e\xc1\xfa\x55\xaf\xeb\xa7\xf1\x51\xd1\x68\xdb\x43\x38\x1d\x67\x7e\xcc\x9e\xee\x69\x0d\xed\xf3\x27\xe3\xb6\x7e\x77\x1f\xa6\xa4\xa7\xea\x3a\x31\xcd\xb0\x14\x03\xea\x46\x06\x55\x51\x85\x85\x74\xb5\x56\x2f\xcb\xa5\x9a\x75\xb9\x6e\xea\xba\x69\x52\x19\x03\xbd\x63\x33\xe3\xf2\x7f\x5a\xdf\x80\x6f\xa1\x53\x09\xe9\xa3\x1e\xf4\x4d\xf4\xf6\xbc\xe1\x4b\x8e\xcc\x7a\x6a\xff\x63\xfb\x9f\x8a\x5e\xde\x48\x6a\xe5\x68\xb6\x99\x21\xf9\x6e\xbf\xc3\xd0\xe5\x57\x37\x12\xd4\x98\x63\x2b\x7a\xa6\x75\x67\xec\x75\x4a\xa5\x57\x0c\x5d\x4b\x34\x06\x3f\x3f\x3f\x49\x2f\x79\xb9\x07\x3c\x3c\x58\xbe\xe8\x7a\x6f\x4f\xe4\x4e\x9c\xc7\xfa\xfb\x7c\xb0\x23\x63\x5f\x0c\xc6\xd5\xe1\xef\xf8\xc6\x55\xfb\xfe\x7d\x1f\x81\xa0\x4f\x44\x70\xf8\xdc\xbe\x57\xed\x39\xec\x5b\xd3\xbe\xea\xb7\xdf\x38\x38\xb9\xc1\xf0\x70\xf2\x9e\xd8\x5d\xd4\x23\xee\x19\xf6\x1d\x7e\x82\x88\xb4\x2c\x3a\xb6\x63\x1b\x79\x18\x10\x9e\x7e\x61\x3f\xf3\x3d\xfc\xcc\xf7\x43\x74\xc1\x99\x1f\xe6\x9f\x4e\x3d\x63\x10\xc7\xeb\xd9\x86\x6b\xb4\x1e\x83\xfb\xae\x9f\x03\xce\x77\xe0\x7b\xa6\x7d\x5e\x7e\xac\x9c\x46\x26\x7c\x81\xe7\x17\x92\x53\x9d\x56\x46\xb8\x85\x1d\x86\xeb\xf6\x9f\xc8\x14\x72\x5d\xf3\x6e\x34\x4f\xd7\x74\x5d\xd3\xc8\x0b\x0c\x43\x14\xd8\x0c\xcd\x32\x19\xc3\x2c\xe9\x91\x51\xbe\x59\x11\x8c\x76\x97\x28\xfb\x67\x86\x41\x0d\x74\x0e\x08\x02\xd5\x2a\xa1\x6a\x4d\x53\xe3\x7a\x5c\x2d\x43\x86\xc8\x1c\xd1\xa9\xfa\x91\xaa\xae\x53\x49\xab\x06\xd5\xa6\x0a\xe5\xa6\x06\x15\x9f\x4d\x4e\x6b\xef\xfb\xd8\x7d\x3e\xbe\x59\xb4\x61\x74\x34\x16\xc0\x71\xb5\x25\xc7\x4a\xf6\x1e\x6d\x5b\x9b\xc5\xf2\xc8\x78\x07\xd6\x31\x3f\xda\xf7\x62\x48\x4e\x6a\xfb\x1a\xf0\x59\x1c\x6a\xd7\xdc\x14\xf1\x7e\x6a\x89\xf4\x36\xec\xc3\xdb\xb6\x3d\xc0\x13\x6c\x1a\xff\x68\xe0\xbd\x06\xd6\xe9\x6d\x98\x7b\xd9\x3e\x9b\xdd\x98\xdb\x0e\x2d\xf3\x60\x44\xa2\x92\x89\xf4\xb6\xaf\x86\xf8\x9a\xdb\x03\x77\xeb\x7b\x21\x99\xc0\xe5\x2f\x07\x1d\xbd\x7e\xc4\x37\xee\xac\x41\x0a\xf1\x1d\xd1\x85\x77\xbc\x86\xd1\xab\xc2\xf4\x6e\x53\xd8\x86\xde\xe6\x21\xce\xfd\x57\xfa\x9e\x83\xf7\xfa\xe0\x54\xac\xe3\x25\x02\xf0\x85\x6d\x7f\x9e\xdd\xfd\x33\x61\x3d\x66\xdb\x33\x21\xd9\xbd\xfd\xee\x97\x3d\x4b\x52\x5b\x2e\xd4\x3b\x73\x5d\xdf\xae\x29\xbb\xc6\xb9\x9f\x4e\xbf\xf2\xf2\xdf\x40\x22\x3d\xba\x0c\x3f\x6d\xed\xc7\x6d\xfd\x19\xff\xce\xa1\x54\x97\xaf\x41\x6f\xf3\x4f\x3a\xbd\x0f\x47\x20\x0e\xf1\xde\x79\x60\xff\xf6\x7a\xc7\xc7\xe3\xf7\x87\x63\x1f\xec\xc6\xff\x08\xec\xf9\xb3\xad\x5b\x63\x06\x75\x37\x9d\xde\xb0\xf6\x43\x40\xaf\xdc\xc7\xa2\xcf\x83\xa9\x17\xfd\x62\x70\x49\x82\x1a\xbd\x3e\x6c\x77\x75\xe7\x7e\x8f\x6f\x4d\x45\x9b\x37\x1e\x68\x74\xf1\x7d\x3c\xbf\xad\xbf\x09\xf0\x4c\xc3\xcd\x85\x4a\xb9\x75\x9d\x70\x5f\xf4\x8e\x55\x6d\xb2\x48\xea\x74\x5f\x2f\xec\x9d\x3d\xa7\xf7\x04\x7f\x09\xf1\xa8\xab\xea\x18\x24\x48\x65\x72\x4c\x8a\x8c\x23\x9d\xe7\xa1\x21\xcb\x0c\x9f\x92\x18\xae\x21\x9b\x50\x63\x79\xa4\x13\x39\xc8\xf3\xac\x65\x72\x71\x45\x2d\x8a\x05\x22\x5b\xd0\x45\x23\x8f\x38\xdc\x1d\x0f\xca\x48\x8f\x96\x59\x86\xe1\x45\x43\x97\x1b\x65\x51\xa4\x0d\x9a\x27\x95\x86\x19\xa9\x69\x4a\x0b\xa8\xaa\x82\x8a\x7c\x41\x96\x15\x5d\xd4\x14\x5d\xaa\xa1\xb8\x5a\xef\x5a\x47\xbb\xc3\xfb\xff\x79\x1d\xee\xdc\xa7\xba\xb5\x2f\xfe\xef\x6b\x10\xbd\x59\xdf\xa1\xeb\xe8\x69\x5b\x41\xfd\x7f\x4c\xdf\x92\xec\x29\x13\x37\x5b\x65\x78\xb7\xe1\x3f\x97\x6d\x5f\x0c\xc0\x93\xe1\xf1\x0d\x0c\xb3\x6b\x6b\x01\x58\x06\x89\xb4\x0d\xc5\x74\x7a\xb7\x63\x0d\xfa\x86\x4f\xff\x91\xdb\xfc\x62\xe3\x23\x3e\x5d\x0e\xbf\x63\xe4\x2d\xd0\xed\xeb\xd3\x12\xe9\xcd\x56\x60\x5c\x6c\xe3\xcb\xde\x31\x4c\x87\x76\x07\x64\x41\x3e\x91\xbe\xe6\x3c\x0c\xdd\xd7\x84\xf5\xa5\xb1\xef\x74\xe9\x8a\x3e\xdb\xd4\xc8\x19\x01\xfe\x95\x6a\xf3\xfa\x0d\xba\xc7\xeb\xdb\xb1\x0a\x8e\x0f\xf3\x6a\x17\x46\xed\xf9\x3c\x4c\xe9\x20\x0a\xfa\x30\x7c\x2e\x02\x4b\xda\xb5\xd3\xa2\xd3\xa3\xae\xb5\xf7\x34\xd8\x7f\xc1\x9c\xe9\xd4\x8c\x33\x3a\x85\x47\xe7\xa4\xfb\xe6\x4c\x77\x6a\x28\xb9\xf1\x65\x03\x58\xe7\x0e\xe4\x4c\x9c\xc8\x64\xd4\x14\x03\x4d\x1a\x49\x49\x46\x16\x44\x49\x49\x8a\x34\x1d\xd7\x52\xaa\x68\xe8\x65\xbe\x64\x66\xd9\x3a\x5d\x49\x25\x75\xa6\x39\x94\xcc\xbc\x72\x7e\x0a\x4e\xb5\x9e\x4d\xdd\xb8\xfa\x91\x57\xe0\x4f\xd0\x05\xd1\x69\x66\x93\x35\x9d\x64\x16\x9d\xe1\x78\x8e\x55\x74\x8e\x97\x25\x49\x52\x45\x86\x97\x33\xd5\xb2\x24\xaa\x82\x24\xe4\xb2\x7a\x46\x92\xb2\xe3\xcb\x16\xcd\x3b\xeb\x8a\x9b\xd1\xa2\x6f\x6f\xbc\xf9\x70\x15\xf6\xa2\x9f\xec\x6b\x4e\x34\xeb\xb2\x4c\xc6\xdd\x78\xb5\x5c\x5b\x97\x1c\xbd\xa2\x6b\x2f\x31\x6d\x3b\x78\x7c\x17\xfd\x14\x30\xef\xb9\x3c\x70\xff\x68\x6b\x51\xec\x05\x4c\x1f\x46\xfe\xf6\x2d\x7a\xc9\x96\x13\x87\x1b\x8b\xae\x64\xcf\xc1\xd7\xee\x69\x1d\x1d\x1b\xa1\x1e\x4d\xf4\xbd\x78\x1c\x20\x88\x7b\x13\xb1\xfd\x0f\x03\xba\xf1\x45\xcc\xa3\x9f\x6f\xb1\xb1\x7b\xa9\x79\x9e\x5c\x35\xdd\xcb\x4a\xf4\xd9\x32\xfc\xc1\x06\x53\x7d\xc8\x43\x9c\x4a\x1e\x69\xc6\xbe\x4e\x6c\xb4\x3e\x67\x7d\x9d\x1a\x3f\x92\x82\xcb\xcd\xa8\x66\x36\x0a\x45\xa2\x64\x31\x2a\x2c\x22\xf6\xdb\xba\x4e\xcd\x43\x29\xad\x6c\x1d\xd1\x9a\x77\xb1\x64\xb6\x59\xe2\x34\x58\x45\x49\xa8\xa3\x92\xa8\x90\x9f\xb7\x24\x0f\x46\x30\x2c\x6c\x5f\x1c\x88\x45\xca\x61\x1e\x9c\x4d\xa4\x0f\xbf\x19\xe2\x79\xae\x9e\xe2\xf0\xbc\x5d\xb8\x53\xc3\xd0\x55\xee\xef\x18\x31\xdd\xa6\x89\x9b\x8f\x0a\xc1\xb9\x1b\xa7\x74\x10\xfb\x96\x86\xae\x74\x6d\xd3\x77\xb5\xb8\xd8\xab\x14\x0b\xa6\x82\x3e\xb7\x82\x88\xaf\x56\x37\x11\xeb\x5b\x08\x7b\x06\xce\x9c\x39\xc9\x98\x5f\xf2\x26\xbf\xc5\xd7\x51\x81\x10\xcb\x66\x8d\x1e\x57\x64\x09\x6a\x91\x5b\xc3\x23\xdb\x3b\xc2\x36\xab\xb1\x49\x53\x43\x59\x58\x46\xa6\x2e\x72\x55\x98\xac\xa5\x26\x1b\x6b\xc6\x7d\xc2\xb6\x9f\x0f\x6c\xfd\xe3\x24\x76\x1a\x5b\x8f\xbc\x2c\xc0\xf3\x4c\xa7\x86\x51\x9b\x7e\x1c\xc4\x96\xd5\xa1\x2b\x7c\x30\xa6\x26\xd2\x87\xcf\xef\x92\xcd\x31\x2f\xde\x37\x23\xf4\x2c\xde\xe5\x41\xf8\x59\x3b\xb0\xc5\x75\xe8\x72\x4f\xa7\xd7\x3a\xbc\x75\xe4\x17\x61\x5a\xb1\xd1\xf1\x81\xb7\xcf\x6f\xb3\x63\xb7\xa2\x57\x6e\x58\xdb\xfa\x13\x18\xba\xe4\xc0\xdc\xb7\x13\xe9\x9d\x7f\xb2\xef\xd9\x7f\x99\xcf\xee\x28\x7b\x7c\x3f\xbd\x1e\x47\xd1\x0e\x5d\x16\xe4\xf1\xdb\x1a\x01\x78\x91\xda\xf4\x75\x3d\x8e\x37\x1a\xe2\x7c\x6b\x52\x3b\xfb\x30\xf2\x73\xfb\xea\x56\x34\x19\x6f\x1d\x5a\xea\x9b\xbb\xd4\x8e\x99\x4a\x50\xdb\xf9\x80\x0d\x8d\x49\xa4\x5f\xb9\xba\xf3\x6e\x10\xc5\x72\xf7\xeb\xd4\x0a\x8c\x45\x33\x3a\xda\x49\x38\x2b\x06\x3a\xd8\xe3\x75\x08\x75\x33\x9c\x6d\x7c\x7a\x3f\xf2\x2f\x16\xd9\x37\x9b\xfc\xd4\x06\xeb\xa5\x0d\xf7\xbd\x70\x27\x3c\x6d\x0d\x7a\x0f\xde\x47\x7c\xd1\x7a\xe9\x80\x01\x93\x46\x93\x36\x20\x6d\x99\xc8\x34\x8c\x52\x89\x84\x2f\xdd\x72\x9d\x35\x7c\xdf\x7d\x70\xf3\xe3\xd7\x3e\x5d\x84\x11\x6b\xfc\xd7\xd1\xf3\x11\x03\x15\xab\x4e\x00\xa4\xc3\xb3\x1a\xba\xad\xa5\xa6\x48\xbe\xa3\x17\x3c\x49\x7d\x95\x5e\xb9\xfe\x6e\x34\x13\x44\xe7\x9e\x3f\xf8\x33\x7a\xc5\x8e\x07\xaf\x01\x0b\x0e\xb2\x20\x10\x4f\x23\x3a\xb6\x84\x4d\x7f\x0e\xec\xed\xf3\x58\xfe\xc4\xf6\x96\x8f\xbf\x9b\xa0\xb6\xdd\xee\xc3\x45\x4c\xab\x76\x3c\x6b\xef\xed\xce\xc1\xb6\xd4\xe3\xc9\xac\x5a\x22\x3d\x16\xf6\x37\xb9\xb6\x69\xd7\xe6\x76\x7d\x40\xce\xec\x9c\xc5\x92\x80\xad\x2f\xd3\xb6\xf5\x6c\xfb\x4a\xc0\xde\xc2\xb5\x65\xf4\xc3\xed\x3e\x74\x3a\xa6\x0f\x5a\x22\xbd\xc5\xe8\x92\xa1\xb1\x6c\x7d\xf0\xd8\x90\xbc\xe4\xf2\xae\x2d\x72\x17\x5e\x39\xf1\xc4\x53\xb0\xfd\xf3\x5d\xe0\x8f\x51\x51\x1c\xbf\xc4\xae\x78\x17\x9f\xc5\x78\xb5\x39\xec\x7b\xb3\xe1\x99\x4b\xa4\xb7\xfe\x6b\xd7\x5e\x60\x7b\xe8\xe6\x0b\xba\x6c\x3a\x3e\xfb\xc9\xe6\x43\x18\xce\x3a\x3e\x51\xd7\x93\x06\x4f\x98\xee\xe5\x6d\x7b\x7f\xbc\xaa\x1d\xed\x72\x1c\x9d\x12\x1d\xf6\x88\xbf\x10\x2a\x61\xb0\x19\x58\x64\x52\x39\x9a\x81\x05\x27\xc2\x9c\xa8\x59\x74\x25\x9b\xc9\x65\x32\xb0\x58\x2f\xc3\x62\x2a\x63\x30\xa9\x71\x9c\xaf\xa9\x10\x9a\x95\x82\x5a\x2a\x13\xc9\x77\xa8\x99\x2a\x88\xbc\xc4\x64\x79\x4d\xd1\x54\xad\x22\x8a\x59\x9e\xd5\x75\x9e\xc9\xf2\x52\x45\x53\x35\x45\x63\xb3\x8d\xac\x35\x2e\x08\x44\x0a\x15\x0b\x9e\x8c\x82\xed\x6a\x7a\xbc\x23\xbb\x7b\xf6\x75\x05\x1c\xe7\x66\x16\xf4\xe3\x6e\xb1\xa1\xd0\xf1\x99\xff\x20\xd3\xd5\xef\x5f\x8d\x24\xa1\x64\x42\x05\x69\x90\x6f\x16\x21\x8f\x8c\x26\x1f\x1a\xa0\x6a\x26\x62\x9d\x22\x02\x28\xef\x7d\x6d\xf7\xe0\xad\x1a\x36\xd2\xf9\xbe\x5b\x5a\xb3\xaa\x69\x64\x12\xc5\xa1\x68\x74\xbe\xba\x38\x80\xe3\x47\xb6\xbc\xe3\x8b\x1f\xe9\xe0\x00\xa6\x8d\xaf\xe7\xba\xec\x9d\x4e\x4c\xcb\x6a\xec\xf7\xfe\x6a\x00\xb6\xdc\x9c\xaa\x83\xf4\x24\x70\x2a\x27\xd2\xf9\x9f\x05\xc6\xf9\x16\x13\xcb\xda\xb0\xb5\x1b\xc7\xb5\x0c\x2d\x0e\xd8\xff\x6c\x19\x0b\xdb\x02\x76\xbf\x02\xfc\xbe\x33\xce\xc9\xbb\xdf\x9a\xee\x92\x45\xf1\x7c\x47\xb9\x90\xfe\x62\xe3\xec\xe5\xf4\x4a\x6d\xa5\xb5\x17\xd5\xd9\xf7\xb8\x15\x0e\x3d\x4d\x50\x9b\xd8\x80\xbc\xaa\x25\xd2\x87\x67\x83\x70\xdc\x08\xa6\x11\x79\xb1\xcb\x9e\x89\xe3\xfe\x46\x4f\xee\xda\x9b\x1c\xb6\x29\xff\xbc\x4b\xfe\x51\x6c\x3a\xb0\xe5\xe4\xce\xfa\xb1\x3e\xb0\x30\x76\x80\x7a\xc0\xb5\x35\xa4\x71\xa5\x7b\x10\xb6\xac\x47\xfb\x9d\x3e\xc9\xfe\x06\x02\x89\xa9\x33\x3c\x70\xea\xef\x94\x60\xc1\xb2\x62\x75\x78\xb8\x21\x3b\x96\x20\xa8\x54\x8c\x72\x59\x15\x25\x86\x35\x58\x49\x2e\xb1\x25\x22\x02\x2f\x5f\x0f\xcf\x42\xbf\x3a\xb2\x1e\x8d\xae\x87\x04\x7a\xe3\x43\x78\x07\x1a\x85\xcf\x58\xef\x50\x77\x76\x4c\x0e\xf3\x6c\x6d\xc1\x90\x0a\x39\xc3\x50\x9a\x19\x92\xab\x14\x65\x28\xc0\xfc\x73\xf0\x01\xf4\xea\x1a\xf4\x5c\xf3\xbf\x97\xbd\x4d\x6a\xf0\xc1\xa6\x00\x37\x01\xbf\x3f\x7f\xeb\x39\x01\x9d\xd6\xa3\x4f\x07\x3f\xd5\x65\x57\xc4\xe7\xbb\xf9\x89\x90\x6d\xc1\x1d\x3f\xf4\x87\x2e\xf8\xc1\x71\xb7\x2e\x4f\x7b\xa2\x0b\xef\x6c\xee\x95\xc6\x1a\x95\xcf\x47\x1f\x8c\x76\x9e\xea\x50\x9c\x36\x79\xf1\x13\x13\x95\xcc\x98\x24\xd3\x2c\x11\xa5\x23\xe3\x44\xa1\x59\x29\x45\x85\x89\x9c\x1e\xc9\x34\x2a\x45\x26\x45\xd0\xd9\x54\x9e\x83\xe3\xf5\x32\x1c\x4f\x65\x22\x05\xa3\x91\x33\x8c\x88\xd0\xc8\x51\xb4\x2d\x40\x6b\x9a\x88\x0a\x48\xd1\x14\x54\x65\x79\x8e\xcb\x8a\x9a\x96\xcd\xa2\x02\x4a\xf2\x3c\xac\xa2\x9a\x06\xfc\x71\x0d\x9b\x4e\xeb\xd2\x77\x95\x8e\xdd\xcd\x95\x73\x2e\xf5\xd6\x2c\xda\xb8\x71\xf0\xb8\x10\x8c\xf9\x73\x75\xdd\xcf\x2d\x7f\xb0\xf7\xc5\xfe\x0c\xda\x2b\x36\x7f\x65\x12\x9a\x2d\x27\xd2\x5b\x82\x3e\x26\x19\xdb\x18\xd4\x44\x7a\x3b\xf6\xc3\x0f\x5d\x12\xe0\xa9\x9e\xbf\x60\xf3\xd7\xc3\x72\xfe\xeb\xd1\xce\xf9\xe1\xda\x76\xd8\x56\x10\xf0\x23\x05\xa2\x04\x83\x91\x78\x4e\x96\xa2\x7d\x0e\x58\xa2\xc8\x45\x8a\x0d\x56\x27\x8d\xa6\x84\x64\x5b\x65\xd5\x6d\x20\x24\x55\xfb\xab\x09\x25\x64\x20\xd1\x20\x52\x86\x31\xa1\xeb\x44\x86\x62\x50\x52\x2f\xa1\x14\x4a\x6a\x15\xcd\xfe\x10\x9a\x39\x98\xb5\x2a\x12\x2c\xa2\xb2\xbb\x56\xd9\x91\xa9\x36\xff\x60\x72\xfe\xb4\x65\xc3\x24\xbe\x08\x9b\xc7\x1e\x03\xfc\x31\x4a\x2a\xf6\x75\x28\x6e\x84\xfd\xf9\x60\xa0\x03\x61\x3d\xed\xf8\x0f\x37\x8c\xc7\x29\xb1\x15\xed\x73\xbc\xc3\xd8\xaf\xda\x3f\x30\x63\xa6\xfb\x77\x81\x04\x86\xcd\xa2\xc8\x6c\xb3\x20\xa9\x45\x5d\x97\x2b\x45\x98\x64\x2d\x0e\xd5\x90\x01\xe3\xe5\x64\x1d\xe5\xb9\x16\x20\x19\x0b\x70\x44\xd2\xaa\xea\xf5\x3a\x29\x10\xb4\x55\xd3\x6b\xb5\x68\xc5\x34\x75\x4b\x34\x72\xb2\xa0\xc9\x92\x24\x66\xf3\x32\xc1\x21\xc0\x0b\x86\x2c\x70\x84\x6c\x10\xa6\x8a\x04\x25\xaf\x22\x51\xc9\xf9\xe9\xd6\xd6\xbe\x80\x1d\x85\x77\x68\x37\xf6\x69\xf7\x01\x06\xcc\x07\xac\x93\xad\xef\xcb\xea\x71\xfa\xf4\x3b\x19\xd0\xd1\xbe\x14\x4c\xf7\xf5\x52\x31\x47\x21\x0d\xd9\x26\xda\xd6\x14\x4a\xe1\x51\x0e\xf1\xc9\x4c\x24\x8e\xa4\x02\xa4\x85\x72\xb1\x29\xe4\x6b\x0c\x64\x0b\x88\x21\xb8\x4c\x12\xb1\x59\x22\x0f\x2b\x2c\x63\xd5\x18\x2e\x43\x28\x96\x16\x91\x24\xd9\x49\x32\x99\xa8\xe9\x50\x26\xb9\x66\x41\x27\x32\x56\x85\x52\x34\x26\x99\xcd\xea\x45\xd1\x14\xf2\x28\x0f\x33\x9a\xa0\x69\x79\x3d\x9b\xa1\x75\x44\xb3\x1c\xc7\xb6\x80\x8a\x0a\x56\x4e\x14\x93\x46\x92\x87\x39\x4b\x21\xe9\x71\xa4\xab\x72\xc8\x66\xb9\xe5\x4b\x3e\xb8\x3c\xca\xa5\x13\x1d\xbf\x7e\xbb\x87\xf1\x79\x93\x45\x87\xfe\xe3\x3e\xc6\x11\x81\xc8\x5b\xbc\x01\x55\xa4\x36\x01\x51\xb0\x38\x1d\x6a\x48\x11\xa2\x05\x0b\xaf\xc2\xe9\xbb\xad\xe0\x24\x7d\x42\x27\x40\x43\x6e\x7f\xa3\x38\x24\x69\xba\x6a\x7f\x20\xd5\xe2\x55\x1d\x15\x21\xab\xab\xd0\xd0\x75\x1d\x89\x86\x61\xf8\xf9\xa7\x43\xe7\xb6\xfe\x39\xa0\x4f\x1a\x89\xf4\xe8\x49\x5d\xfe\x30\x9c\x1b\xba\x75\x41\xc8\x4e\x2a\x38\xb1\xfc\x3b\x1e\xf2\xc5\x3e\xb4\x79\xb4\xee\xc0\xc6\xe6\x66\xe8\x59\xac\xe3\x1b\x1c\xde\x10\xc8\x29\x0b\xe4\x11\xd0\xd4\xf0\x15\x01\xbb\xa0\x96\x48\x8f\x60\x9e\xbe\xee\xe8\xb0\xcd\x6f\xcb\x3d\x01\xfc\x2a\xb5\x96\xc7\x0e\x50\x1b\x13\x7d\x7b\x7f\x0c\x00\x5c\x4e\x2f\x19\xba\xf6\xd8\xda\xe0\xa6\x05\x0e\xbc\x4a\x6e\xbc\xa5\x63\x8b\x7f\xa7\x4b\x96\xc4\x3e\x1a\xa3\x04\x40\x22\x76\xb0\x9f\x38\xdd\x77\x1d\xcb\xb9\x07\xfe\x03\x04\x7d\xc1\x92\x93\xc3\xb8\xf6\x42\xbc\x96\x8d\xbe\x7d\x74\xe8\xd6\x77\xbb\xf8\x36\x5e\xcb\x3a\x5c\x23\x65\x68\x91\x4f\xf7\xc6\x71\x45\x87\xb0\xef\x70\xe8\x62\x8f\x5e\xba\x35\x0d\xc7\x70\x6f\xe5\x21\x36\x30\x5f\x8f\x4f\x99\xff\x1d\xb6\xed\x6e\x0c\xdb\xad\x5d\x3a\x6d\x76\xe7\x0f\x18\x6d\xfd\x80\xa6\xd6\xd5\xc2\xfb\xf1\xfa\xf4\x2e\x79\xdf\xf1\xa3\x3e\x12\xa0\xc7\x6e\xec\x00\x38\x0e\x57\x1a\xf5\x62\x50\xfd\xf4\xcb\xa6\x54\xd1\xe9\x9d\x02\x77\x33\x7d\xdf\xfd\x12\x6a\x3b\x4a\xa4\x4c\x54\x74\x12\x58\x80\xe4\xeb\x35\x32\x6b\x65\x20\x6f\xb0\xaa\x2c\xca\xaa\x28\x8b\x65\xb2\x66\xb2\x86\x22\xaa\xba\xa8\x88\x25\x98\xd3\x1b\xb2\x61\x44\xec\x4f\x52\x6c\x9a\x1a\xc1\x59\x05\x0a\x28\x8a\xee\x04\xb3\x25\x33\x12\xc7\x2b\x22\x27\xb2\x92\x9a\xef\x7c\x57\x50\xbc\x69\xf2\x3c\x29\x5a\x0a\x11\x17\x51\x41\x96\x3a\xb6\x76\xb3\x03\x87\x6b\x7f\x15\xd0\x5b\xbc\xf1\x8d\xef\x06\x64\x37\xd6\xd3\xc9\x7e\x17\xe0\xb9\x9e\x0e\xb7\xee\x8f\xde\xb8\xe2\x7f\xce\x86\x75\x3e\x5d\x4d\xa2\x84\x44\xda\xdc\xd4\x65\xa3\xc0\xb9\x83\xdb\xbf\xda\x75\xa6\x4e\xfc\x40\xd8\xce\xc8\xc7\xd4\x0e\x2f\x1d\x7b\xc0\xc7\xcf\xb1\xcc\xf3\x5a\x38\xb7\xbc\xed\x57\x76\xf4\xa8\x73\x02\xcf\x17\x12\xe9\xd1\x25\x5d\x32\x29\xc6\xbb\x83\x47\x75\xc1\x36\xd6\x59\x46\x17\x4f\xe2\xc7\x51\x12\x69\xb3\x3b\xf6\x19\xd7\xe2\x70\x60\x78\xf3\xd2\x00\xee\x78\xb4\x69\xfb\x9f\xc3\xba\xa9\x19\xb6\xed\x30\x8e\x3c\xbe\x79\x39\x08\xc7\x6f\xe4\x7c\xbe\x94\x4b\xbb\x60\x7b\x61\xd7\x7c\xd4\xf6\x7c\x68\xea\xf5\xaf\x04\xec\xb6\xaa\x57\xb3\xa4\xb3\x9f\x92\xbb\x0f\x47\x07\xd6\x2b\xb6\xb8\xd8\x6e\x4a\xa5\x57\xec\x5c\x31\x0b\x0c\x42\x16\xd0\x4b\x36\x5d\x1d\x03\x17\xad\x66\xc3\xfb\xed\xe4\xd0\x74\x72\x47\xdd\x58\xab\xed\xc1\xfc\x76\x0d\xef\x13\x97\x48\xaf\xc5\x5e\xc5\xa1\xc1\xb0\xcc\xeb\xfa\x7d\x16\xfa\xf6\x23\xdf\xf1\x1d\xaf\x7d\x2f\x60\x53\xf0\xce\x79\x68\x81\xcf\x26\x84\xd7\xb1\x16\x6b\xef\xa3\x97\x04\x64\x67\xb5\x6d\xb7\xd8\xf1\x5c\x80\xb6\xf3\x8e\xbd\xe8\xf5\xa3\xba\xe4\x3e\xb3\x33\xa7\xd7\x4f\x0b\xd0\x1f\xd6\xa3\xbb\x66\x40\xde\xee\xf8\xae\xe6\xbb\xe3\x65\xec\x37\xd3\x13\xe9\xe1\x8f\xed\x3d\x1f\xba\xd6\x9b\xd3\xb2\xd8\x08\xb5\x90\x5e\xb1\x61\xf8\x68\x30\x3f\xc9\x02\x7a\xe5\xd8\x2e\xf8\x01\x38\x6b\xde\xa3\x83\x2f\xd0\x4b\x77\xed\x06\xe3\xe0\xe8\xb9\x77\xba\x79\x30\xa2\x13\x47\xf1\xfa\xc5\x21\x78\xb9\x2a\xf6\x35\xea\x51\xfb\x19\xc7\x82\x8b\x78\xfb\x19\xbb\x36\xb4\x6e\x02\x91\xc1\xbe\xc1\xad\xf4\x92\xa1\x0f\xae\x8f\x2e\xbc\x6a\xf0\xa7\xdd\x36\x86\x04\xf5\x2c\x1b\x80\xe9\xce\xbc\x2f\x9a\x8c\x8f\xd0\xd4\xda\x76\x0d\x05\x1b\x86\xde\xa6\x54\xb7\x16\xd5\x72\x27\x0e\x63\xf6\x1c\xdc\xab\xa0\x8b\x02\xce\xec\xf7\x75\x14\x6b\xd7\xb4\x70\xfa\xad\x3a\x51\x97\xb8\xe9\x4d\x7a\xa0\xc7\x2d\x04\xde\xae\x23\x33\xd0\x4b\x0d\xa9\x6c\x86\xe1\x52\x12\x93\x54\xe2\x8a\x96\x62\x9b\xab\x0c\x54\x33\x0c\x48\xa3\x1a\x91\xa9\x67\x19\x55\x60\x15\x36\x9b\x67\x18\x08\x90\x12\x87\x32\x52\xe3\x34\x2c\xa2\x5a\x92\xe5\x70\x5f\x1c\xc3\x10\xb3\x32\x12\x15\xa8\x48\x28\x0f\xe5\x24\x8d\x0c\xa8\xc4\x11\x4f\x5c\x94\x2a\x70\x74\x4a\x48\x29\x7a\x8a\xcd\xd0\x92\x14\x59\xde\x09\xf2\x60\x65\x81\x53\x75\x55\x63\x64\x51\x93\x44\x4d\x16\x74\xab\x9e\xa1\x59\x9d\x2d\x0b\x9c\x44\x64\x10\x8b\x8a\x2a\x4c\x41\x51\x17\x64\x4d\x94\x3c\xdc\x71\xec\x52\xd8\xde\xb8\x07\x7b\x56\x86\xe6\xf9\xe8\x29\xe7\xd1\xdf\xcd\x61\xde\xe3\xfc\xce\x61\x1c\x29\x32\x34\xd7\xb3\x67\xe1\x38\xe1\xe7\x4f\xc7\x79\x9a\x15\x1f\x8e\xe6\x3a\x76\x4d\xf7\x3d\x4c\x48\xde\xc0\x67\x65\x6c\xec\x3a\x5b\x27\x9f\xf1\x4b\x61\xd8\x36\xef\x9a\x44\x17\xf7\xde\xb1\x05\x6b\x42\x43\x73\x82\xd7\x0e\xc6\xb1\xde\x15\xc3\x9f\x14\x08\xfa\x5d\x19\x87\xde\x8d\x2e\xea\xd2\x5d\x31\xbd\x3b\x74\x4c\x80\x1e\x18\x4e\x3d\xb5\x44\xfa\xc0\x93\x01\xfb\x83\xd6\xb6\xb1\x8c\x5e\x8c\x6b\x7e\xe0\x58\xc4\xa1\xd9\xee\x3b\x16\xc7\x5e\xa4\x36\xba\x6b\x5d\x32\xf4\x6f\xf3\xa3\x0b\xcf\x66\x41\xd0\x06\xe9\xd2\x85\x81\xc0\xba\x98\xb6\x0d\xe3\xd0\x5f\x7d\x7c\x10\xfb\x9b\x0f\x1d\x1f\x98\xef\x13\xed\xd8\xae\x8d\x4e\x2c\xf5\xda\x7f\x0b\xe1\xc4\xa1\x33\x02\xf7\x3b\x3d\xc7\xed\xf9\x62\x8b\xe8\xd0\x85\x18\x57\xe2\x20\xd7\x9a\x1d\x1b\xa1\x14\x57\x7e\x3e\x0f\xc7\x44\x5c\x0c\x16\xbb\x95\x20\xfb\x7b\x7a\x07\xfa\x6d\x29\x61\x5a\x6f\x58\xff\x26\x43\xff\xee\xc3\x6d\x44\x70\x5c\x8b\x3f\xc6\x25\x6b\xc0\x8c\x01\x53\x46\xa3\x76\x54\xe4\xc4\xc6\x7f\xbd\x01\x6f\x5f\x03\x6f\x44\x3b\xe0\x58\x33\x09\xb7\xa0\x4d\x51\x78\xd7\x30\xbc\x15\x6d\x81\x6f\x34\x3f\x05\x73\x68\xc3\x9b\x1b\xe2\x3f\xfb\xca\x41\x38\x3c\x3c\xe2\x84\x3e\x51\x74\x15\xf2\x28\x5f\x45\xda\xed\x2f\x59\xb7\xbd\xf6\x9a\xfa\x9a\xaa\xbe\x46\xbc\x30\x3c\xfc\xc8\xf0\x23\x8f\x0c\x1f\x9b\xb2\x72\x75\xb5\x42\xee\xb1\x72\xe4\xef\x82\x71\x86\x6b\x5b\x6c\xac\x44\xa9\x74\x7a\xc3\xf0\xdf\x00\xbd\xe2\xf0\x97\x1f\x05\x0b\x08\x16\xd0\x4b\xd7\x9f\x0b\x1b\x00\xcc\xf9\x68\xf0\x67\xbe\xfd\xe2\x12\xe9\xd1\x85\x21\x1d\x9e\xf1\xd3\x96\x91\x7c\x00\x2e\x45\x8f\x16\xf5\xfb\xe8\xba\x23\xb3\x62\xf8\xd9\x7a\xd8\x47\xa3\x0a\x94\x94\x48\x8f\x2e\xe8\x7a\xbe\xda\x86\x83\x04\x95\xf3\xe7\x46\xf9\xe4\xf2\xb5\xcf\x07\xe0\x93\x49\xa4\x0f\xbc\x1c\x92\x57\x74\xc7\x46\xb3\xe9\xd8\x10\x9c\x07\xf8\xeb\xd0\x05\x61\x3e\x3d\x3a\x7f\x12\xf8\xb7\xe1\xec\x5a\x6c\x33\x5c\x66\x5f\x3d\xf4\x99\xa0\x9c\x3b\x1a\xcc\x83\x5e\xd8\x9a\x17\xbb\x95\xba\xc1\xde\xe3\xd1\x0f\xe9\x95\xf9\x93\xe1\x87\x00\x9c\x7b\xd7\xc5\xbb\xe9\x95\x6b\x4c\x38\x0c\x6e\x3a\x9f\x9e\xf7\x06\xbd\xf4\xd0\xa7\xe1\xfa\x56\xed\xdc\x9b\x06\x8f\x72\xe7\xf5\x66\x3b\x6f\x31\x91\xde\xf7\xcb\xbd\x80\x5e\x3a\x26\x81\x5f\xb6\x5a\xf3\x04\x97\x0f\x18\xb8\x56\x89\x96\x48\x8f\xce\x0b\xe0\x9c\x27\x2b\x8e\xce\xed\x92\x93\xb1\x2f\x60\xfb\xbb\x98\xee\xfc\xd5\xc7\x3b\x3d\x9f\xd3\xe1\x0d\xf6\xb5\xad\xc7\x05\xae\xb9\x3c\x7a\x3b\xd1\x15\x4f\x1c\x38\xe7\x44\xe7\x9c\x3b\x71\x84\x78\xfc\x80\xe8\xe2\x91\xcd\x2b\x1f\xa4\x2e\x00\xb3\xc0\xa0\x5b\xb9\xfa\x1a\x70\x03\xb8\x19\x7b\x5d\x70\xa1\xe9\xfe\x69\xc7\xc7\x9c\xe8\xb9\x1e\xfb\x8b\xad\x71\x4f\x3f\x61\xc0\x66\x44\xed\x7a\x76\xe4\xf4\x48\xb4\x6f\xe6\xc0\x8c\x81\xde\x01\xec\xe2\xc4\xed\x45\x67\xc3\xfe\x9e\x19\xfd\x3d\xfd\x3d\xde\xdf\x7e\x1b\xe2\x25\xf0\x7f\x16\xde\x70\x4a\xfc\xd3\xbf\x3e\xed\xcc\xd4\x93\x0b\xa6\xca\xa7\x66\xe6\x5c\x76\xd3\xd4\x93\x6e\x3e\xe7\x5f\x60\xaf\x78\xd7\xd5\x83\x03\x0b\xfb\xd0\x36\x86\x46\xdf\x40\x2f\x9f\x00\xcf\xa8\x43\xf0\x57\x62\x45\xed\xe3\x8f\xb7\x20\x71\xd5\x2a\xeb\x21\xf4\x82\xfd\x69\x55\x9c\x00\x26\xea\x9c\xb5\xdf\xde\xde\x9f\xba\xe4\xe9\x9e\xdb\xbf\x20\x9e\x37\x76\x93\xd5\xfb\xe5\xf4\xbc\xa3\x53\xdb\xcf\xa0\x88\xbb\x89\xc2\x4b\xfb\x9e\x59\xb1\xf4\x9a\x87\x1e\x6f\x9c\xba\xe6\x8e\x9b\xb7\x5c\xf1\xce\x9a\xb7\xc9\x43\xcd\x2b\xdf\x5e\xf3\xcd\x99\x91\xa3\x20\x85\x26\x20\x65\x7d\x11\x46\x51\x03\x46\xe1\xae\x8e\xc1\xb1\x03\x8b\x42\x07\x97\xd6\xfd\x8f\x77\x6e\x59\xa7\x2f\x2d\xa6\xe5\xd4\xfa\x7c\x97\x8c\xec\xc2\x08\x8e\xa8\xb5\x15\x86\x63\xc0\xf3\xad\x29\xb1\xaf\x51\x2c\x88\xba\x1e\xe2\x19\x5e\xaf\x85\xab\x9c\x9e\x59\xed\x1a\x32\x67\xce\x6c\x73\xf9\xe9\xae\xe7\x18\xd7\xb5\xee\x1d\xe8\x8d\x0e\xf4\x4e\x8b\xba\x7a\x7f\x3f\xb6\x01\x74\x2a\xcd\x7a\xd5\xd2\xcf\xec\x73\x2a\xc5\xd9\x27\x43\x5e\x29\xa0\x2a\x92\x38\x58\x24\x78\x28\x41\x91\x45\x06\xd2\x89\x6d\xaf\x37\x5e\x30\xcd\xc8\x97\x1b\x2f\xa0\x37\xa8\x6f\x5a\xbf\x83\x3f\x3f\xf2\x0b\xf8\x0b\xeb\x77\x91\x08\xda\x83\xce\x85\xf3\xd1\xdb\xf0\xe7\xf0\xba\x51\x78\xe1\x44\x84\x98\x3e\xbb\x6f\xcd\xe9\x7d\x91\xd9\x68\xc9\xc2\x17\x08\xfa\x2b\xe8\x5f\xd1\x11\xf4\x33\xeb\x7b\x0b\xe1\x5b\x10\xa0\x8f\x3e\xbc\x6b\x39\xba\x9e\xb8\x65\xf6\xec\x77\x6b\x5b\x96\x44\x4f\x94\x64\x46\x66\x85\xac\x28\x8b\x0c\x5c\x87\xb6\xcf\x9f\x0f\x6f\x7a\xe3\x6a\x74\xc1\x83\x12\xda\x08\x3f\x27\x49\x92\xf4\x87\x87\xec\xff\xd0\xd7\x07\x17\x9e\x32\xe7\xac\xc7\x9f\xbf\xfd\xa1\x07\x6f\x1a\x7c\xf0\xac\x07\x67\x0c\x2e\x3e\xeb\xaa\x2b\x17\x9e\x3f\xe3\xfc\x25\x8f\x05\x6d\x5f\xae\x7c\xd8\xce\xd7\xbe\xaf\x75\x14\x96\x03\xfb\x36\xbc\xd4\xfa\x51\xeb\xf3\xf4\x92\xa1\x25\xe0\x57\x2c\xb8\x78\xbd\x9f\x7f\x1c\x3e\x7a\x12\x7a\xe8\xc9\x94\xeb\xfe\xd0\x25\xf7\x63\x7c\x38\xf8\xeb\xc0\x19\x7a\xf7\xaf\x27\x7c\x74\xa6\xd8\xe1\xdf\x6b\xff\x1d\x53\xa7\xf3\x3d\x7c\x54\x70\x3c\x01\xea\xd2\xc9\x9c\xda\x1a\xdf\xee\xa2\x71\x78\x7d\x87\x3e\xec\xb2\x79\x68\xf8\xdd\x4e\x3c\x67\xd6\x37\x2e\x61\x1d\x22\x6a\xbf\x3b\x7f\x43\x00\xdf\xdd\xf8\xad\xd1\x70\xce\x41\x3b\x16\x06\xc3\xe8\xd0\x79\x01\x3e\x20\x27\xd2\x63\x87\xbb\xde\x6d\x76\xe4\xa6\x7d\x38\x93\x75\xe8\x5c\x0c\xbb\xb9\xd6\x4d\xb1\xdb\x71\xfe\xe0\xa7\x70\x9d\x2c\x5b\x7b\x77\x3a\x0d\x3b\x1c\xd7\x85\x43\x27\x17\x65\x9a\xfb\x03\x71\xa0\x53\xdb\xeb\x34\x6d\x06\xb6\x78\xe3\xe8\x13\x2a\xd6\x77\xe6\xcc\xee\xa8\x52\x0e\x0a\x74\xdc\xa4\x69\x58\x6c\xf2\xb8\xe0\xaf\xf7\xf3\x96\xa6\x6a\xb2\xde\xe4\x08\x56\x27\xe2\x56\x5d\xb7\x8a\x79\x5d\xe7\x0c\x1d\x6a\x99\x52\x9d\x81\x34\x91\xaa\x9a\x82\x3e\xde\xfc\x37\x37\xe0\xf4\x98\x8b\xe6\x9d\x35\xeb\x0c\x6b\x05\x7c\xff\x8a\x89\x45\x47\xae\x40\x7f\xe2\x35\x5e\x12\x50\x8a\x60\xad\xa2\x5e\xab\x11\xe5\xac\xa8\x48\x59\x5d\x11\x38\x8d\xcb\x32\xbc\xca\xb3\x91\xd9\x61\xdc\x37\x3d\xdf\x51\xa4\xeb\xec\xf0\x7e\x6f\x3a\xdc\xa5\xd3\x60\xdc\x1f\x9d\xd3\x65\x53\x77\x72\x48\x66\xfb\x6c\x9f\xc7\x82\x2f\xb6\xe6\xc6\x36\x53\x2b\x43\x39\x0e\x8e\x25\x10\xc7\x4f\x4c\xc5\xd9\x0d\xdd\xd6\xc0\xb0\x05\x70\xaa\xcf\x71\xf0\xc5\x58\xb6\x5e\x26\x7f\x45\x54\xad\xa4\x01\x0b\x88\x6b\xd4\x89\x8a\x95\x31\x60\x0e\x09\x6c\x34\x3f\xc1\x6f\x82\xbf\x43\x27\x11\x4f\xc1\x3f\x34\x5e\x6a\x7f\x7b\xd9\x2b\x0f\x46\x64\xb4\xc8\xf7\xd1\xba\x27\xef\x7d\xd4\xfe\x40\xdf\xb7\x7e\x0c\x97\xdf\x78\xe3\x8d\xa8\x22\x08\x82\xf5\xff\x59\xf5\x6b\xae\x21\xe2\xe8\x07\x87\x3d\xb8\x66\x13\xe9\xb1\x4a\x97\x8d\xc0\x91\x49\x06\xba\xf6\xc6\x89\xab\xb8\x70\x12\x3d\x50\x48\xa4\x47\xfb\x43\x7b\x26\xb9\xf6\x26\x47\x06\x08\xda\x1a\xf4\x44\x7a\x53\xa1\xcb\x96\xa1\x77\xe2\xf0\x0f\x76\xe2\x26\xae\x74\xe3\x15\x30\x3d\xde\x51\x5d\x68\x7f\xfe\xd7\xac\xa3\xe9\x25\x3b\x7e\x77\x7f\x64\xfe\x07\x83\xf9\x20\x9e\xbe\xfe\x52\x97\x4d\xc2\xec\xd0\x82\xe1\x69\xee\xf8\x26\x47\xa7\xa7\x57\x6c\xd8\x10\x01\x0b\x97\xb0\xb6\xfc\x3f\x11\xb0\x5b\x8a\x1e\x1e\xe1\x3c\xbb\xa1\x4f\xff\x03\xdd\xe4\x6c\x0f\x8f\x9d\x7a\x2a\x87\x02\x6b\xeb\x73\xe2\x55\xe9\xbe\x0d\x6b\x5b\x4f\xb4\xbe\x9b\x48\x6f\xac\xe3\x35\xee\xf0\xc9\x5d\x38\x27\x7d\x34\xec\xf7\xe6\x1d\x78\xdc\xf4\x46\x68\x6f\x65\x47\xae\xd8\xff\xf7\x10\xfe\x2f\x8e\xfd\x13\xf5\x0a\xbd\x42\xff\xd2\xfc\xe8\xc2\xdb\x07\x7f\xee\x8b\x65\x90\xb0\xfd\x8f\x4f\xa4\x47\x71\x4f\xf2\x51\x27\x36\xf6\x2c\x9f\x6e\xee\xc9\x83\xaf\xf4\x07\xec\x3c\x72\x22\x3d\xd2\xe8\xaa\x8b\x84\xe9\xf4\x81\x7a\x68\xaf\xe5\x58\xde\x86\x85\x3d\x5f\x0c\xcc\xeb\x91\xd6\xd2\xd8\x03\xd4\x83\xf4\xca\x35\x2c\x38\x06\x36\x06\xcb\x8c\x91\x58\xb2\x6d\x7b\xe3\x2f\x2c\xb8\x68\x02\xfb\x78\x16\xc6\x04\x8a\xc3\x71\x47\x17\x82\x79\xe0\x12\x2c\xc1\xd8\xd2\x8b\x23\x87\xe0\xf0\xe7\x81\x19\x03\xd8\xf3\xd1\x3d\x06\xa7\x77\xba\x69\x9c\xe9\x84\xba\xc7\x7a\xa7\xe1\x36\x40\x81\xe8\xea\x28\x43\xd0\xc5\x7c\xbe\x6c\x95\x2a\xf9\x7c\xd1\x32\xdb\xff\x2a\xe7\x72\x05\x22\xb6\xee\xa8\x13\xdf\xff\xf8\xba\x8f\x7f\xf3\x66\xf3\x56\x78\xfb\x9b\x97\x9c\xf4\xf2\x19\x17\xfc\x85\xf8\xcb\xcf\xd1\x7b\x57\xfe\x22\x67\xbd\x83\x7e\xed\xd2\x25\x4e\x2b\x6a\x25\x4d\x2b\x69\x45\xcd\xfb\x66\xdd\xd2\x97\x3c\x6e\xeb\xf5\xab\xee\xfa\xa7\xdd\x0f\x7c\xe5\xb5\x5b\x97\x5c\xdd\x77\xf5\xc2\xad\x5f\xf9\xef\x2d\xab\x1e\xd8\x10\xb1\xfc\x44\xc9\x3d\x53\x6c\x83\xd9\x44\x4c\x62\x6f\xe5\x13\xe9\xb1\x19\x60\x52\xff\xa5\x9b\x3b\xf2\x48\xd8\x2e\xbc\xe9\x40\x08\x36\xdc\xd8\x46\x97\x57\xc2\x2e\x5b\x9b\xc3\x13\xf7\x7b\xef\x15\x62\x7b\x3c\x78\xee\x33\x6e\x83\x7f\x03\xa7\x27\x62\xcf\x1e\x21\x56\xf9\x74\x08\x1b\x36\x7f\x0b\x82\x7e\x76\xd7\xbf\xbd\xe3\x03\x1b\x36\x5e\x9d\xe1\xc3\xe3\x8e\x8e\x4c\xad\xfd\x8f\xb0\x5d\x7a\x98\xeb\xf2\xe7\xe2\xdc\xb2\xd1\xf3\xba\x68\x2e\xe6\xa3\x3b\x8b\x5d\xb6\x3b\x9f\x2e\xbf\xf6\x2f\x3e\x5b\x98\xc3\x43\xcf\x0d\xec\x9f\xd1\x8e\xd7\x1f\x3d\x07\x80\x50\x0c\xb2\xde\xc9\xb1\xda\x84\xf7\x03\x1c\x85\xeb\x5f\x19\x6e\x4d\x12\x9b\xa6\x7f\x1a\x5c\x08\x18\xc0\x3a\x9d\x7d\xc2\x94\x7c\xf6\x9c\xe9\xc7\xc7\xbc\x58\x5b\xdc\xc8\x76\x06\xe5\x36\x28\xff\xa4\x50\x0c\x89\x30\x2c\xc9\x80\x22\x32\x9b\x80\xd0\x2c\x45\x87\x12\x32\x0a\x84\x91\x8a\x1b\x49\x28\x27\x53\x0a\xc7\xc2\xb8\x65\x16\xe1\x38\x63\x95\xaa\x12\x87\x64\x54\x94\x60\xa5\x64\x8d\x13\x65\x13\x15\x0c\x03\x72\xa8\x10\x65\x4c\x64\x9a\xa6\xfd\x14\x8a\x45\xb4\x5e\xd6\xed\x0f\xab\xce\xf1\x34\xc7\xa6\x92\x02\xcb\xeb\x66\x56\x67\x60\x46\x2a\x65\x74\x46\x47\x86\x65\x70\x1c\x21\x21\x19\x02\xbd\xf3\xd5\xf1\x63\x29\x31\x93\xca\x04\x78\x57\xbb\x7f\x18\x96\x02\x7a\x02\x95\x18\xc3\x7b\xd0\xb5\x27\xf9\x66\x95\x2a\x37\xab\x24\xdf\xcc\x93\xd9\x23\x80\xcc\x62\xef\x95\x44\xa4\xac\x71\x1d\x82\x16\x20\x33\xde\xd7\x46\xae\x33\xca\x7b\x5f\xa3\x86\xae\x5b\xba\x6e\xc9\xba\x4e\xe8\x3a\x11\x47\x82\x66\x68\xf6\x87\xa5\x79\x5f\x3d\xb8\xb4\xf1\x65\x22\x04\x37\xa2\x9b\xab\xf8\xc3\xd0\xb8\xe2\xcb\x47\xa1\x86\x66\xfd\x43\x5b\x53\xc6\x87\x7b\x42\x22\x7d\xe8\xf7\x93\xc8\x59\x36\x4c\x9d\xdd\x25\x2b\x76\xe2\x02\xa9\xb5\xbf\x0c\xdf\xef\xc8\x84\xc6\xbb\x01\xdc\x36\x13\xe9\xd1\xb3\x40\x38\xa6\x53\xed\xc4\x40\x0f\xf5\x85\xed\x55\xa3\xb3\x7c\x72\x48\x1c\x28\xad\x7e\x1b\x17\x31\xc4\x9e\xe1\xc6\x81\x5f\x08\x96\xfa\xf3\xb9\x71\xe5\x80\x76\xac\x82\x93\x17\x36\x07\xc7\x2c\x04\x52\x8f\x9d\xb6\x7d\xbd\x3d\x27\x44\x66\xc1\x58\x6f\xea\x4c\x27\xa4\xb8\x67\x06\x65\x7a\xd1\xbe\x90\x95\x39\xc8\x89\xac\x26\x40\xda\x32\x33\x44\xb2\x51\x82\x6a\xca\xaa\x41\x86\x61\x79\xec\xc5\x71\x7f\xac\x9c\x2e\x8b\xaa\x4a\x43\x49\x80\x49\x58\x21\x04\xd6\x92\x91\x81\x2a\xaa\xa4\x88\x8a\x54\x82\xfd\x08\x08\x02\x01\x50\x39\x1f\x7d\x47\x10\x05\x91\x97\x54\xc1\x12\x88\x9c\xa0\x32\x8c\x55\x15\x50\xdd\xfe\x9f\xcc\xf2\xb2\xa2\x08\xa8\x62\xe5\x39\x46\x65\x79\x51\x34\x58\x16\x96\x3d\x1b\x83\x77\x9e\xeb\x97\x05\x6c\x59\x5a\xc2\xb1\xce\xa5\xb7\x0c\xfb\xe4\x6c\xcd\xf3\x85\xae\xc1\x39\xfd\x2a\xde\xdd\xb4\xcf\x66\x61\x9f\x69\xe6\xff\x20\x53\xcf\x74\xaf\x29\xae\x8e\x83\xdf\xb2\xee\x63\xdf\xf9\xe9\x9d\xf3\x5b\x17\xf1\xf9\x0b\x30\x6d\x5c\x2f\xe0\x9e\xf2\xc3\x61\xda\xe8\xc4\x6c\x6c\x19\xc2\xef\x38\xd3\x3b\x73\xa7\x2e\x9d\x43\xef\xfe\x37\x20\xc3\xea\x89\xf4\x98\x39\x09\xdd\xb4\xf9\x7c\x5f\x97\x3c\x86\xd7\x31\xf6\x7a\x68\x7d\x92\xab\x2b\xf9\xed\xa6\x33\x82\x72\xf2\x68\xba\xcb\x5e\xa3\xe3\x77\xcc\x0c\xc1\x7f\x3b\x56\x9b\x08\x8c\x6b\xed\xfe\x7e\xce\xbe\xaf\xfd\x05\x7e\xc7\x19\xee\x3b\x06\x63\x6b\xa9\xfe\xb6\xbd\x72\xad\xc1\xb7\x16\x1c\x33\x58\xf6\xf1\x38\x35\x91\x7e\x76\x99\x2d\xfb\xad\x8d\x81\x4e\xee\xb4\x97\x03\xe4\xf0\xc5\xbd\x83\x5d\x76\x79\x2c\xcb\x6c\xda\xe9\xd3\x21\x8b\x78\xbf\xce\xe8\x92\xa5\x9c\x35\x9e\xd9\xb5\x46\xa5\x73\xb6\x23\x25\xdf\xf3\x7d\x74\x64\xed\x37\x02\x7c\xd7\xe3\xaf\x1b\x86\xba\xe8\x0b\xf6\x29\x6d\x5f\x15\x90\xed\xd4\x44\x7a\xcd\x4b\x21\x7e\x18\xf0\x19\xad\x7b\x38\xe0\x3f\xe9\xd0\xaf\xde\xc0\x7c\x74\xef\xbd\xdf\x77\xc7\xf5\xce\x3e\x54\xad\x04\xf5\xdc\xba\x6a\x67\x5d\x05\xfb\xbc\x0f\x56\x42\x67\xc7\xc4\x72\x9e\xcc\x4b\x0d\xdf\xd8\xa5\xfb\xcc\x08\xec\x8f\x53\xe7\x85\x4f\xa4\x77\x2c\xc6\x3e\x23\x1c\x6d\xbd\x83\xf3\xc1\xac\xa7\x97\x8f\x3c\xe6\xdb\x6b\x0d\xfb\x3d\x2f\x99\x04\xc7\xf4\x44\xda\x3c\xb1\xc3\xbb\xc1\x71\x40\x6f\x5d\x1d\x7b\x8a\x7a\x7c\x52\xfd\xca\x89\x88\x1c\x04\x97\x38\x5a\x56\xd4\xcd\x23\x9f\xe9\x7e\x9f\xe9\xcb\x31\xc7\x19\x91\x9d\xda\xa9\x9e\x5d\x66\xa6\xef\xbb\x8e\xa3\xf6\x8f\x8e\xfc\x73\xe3\x22\xf4\x77\xf2\xfa\xe6\x2e\x72\x0d\x79\x7b\x73\x53\xf3\x1d\x42\xb7\x64\xf2\x59\x62\xd8\xba\xd7\xba\xeb\x95\x57\xc8\x2d\x6b\xd7\xa2\x93\xd6\xae\x45\x44\xc4\x6c\x88\x26\x29\x36\x4d\x28\xe8\x48\xd4\x75\x68\x22\x31\xfa\x3d\xef\x2b\x95\xfc\xd2\x17\x1e\xb7\xde\x7d\xfc\xf1\xc7\x1f\x78\xf4\xc1\x47\x89\x93\xac\x1a\x71\x8c\x55\x8b\x5e\x8f\x98\x95\xa8\x2a\x71\xcd\x26\x92\x33\x19\xa8\x57\xe5\x2f\xb5\xbf\xb8\x67\xb3\xc5\xa3\x35\x4b\x4c\xe6\x59\x70\xe9\x62\x16\xf8\xec\x13\x9e\xed\xc2\xcd\x6d\x4b\xb9\xd7\x6e\x8f\x6d\xa7\x5e\xa4\x57\xbe\xf6\x3d\x60\x82\xa3\xe7\xfd\x61\xb0\x4c\xaf\xd8\x30\x4c\x81\x05\x39\x16\xd0\x4b\x0f\x7f\x0d\x36\xc0\x89\xf3\xef\x1b\xfc\x19\x88\xe3\xb8\x2c\x91\x52\xdd\x7d\x9c\x05\xce\x03\x12\xb8\x0f\xc8\x1d\x5e\xe1\x95\x5c\xee\x34\xc0\x98\x36\xd0\xee\x10\x8a\x6d\x5b\x7d\xb8\x42\x45\xd4\x31\x60\xf5\xfb\x62\x6d\xbd\xc8\xa5\xe9\x58\x10\x8a\x4d\xc3\xff\xea\x1b\x68\x47\xff\x38\x7f\xa2\x03\xbd\xa7\xda\xa2\x45\x4c\x34\x26\x64\x9d\x04\x96\x49\x88\x56\x92\xa8\x9a\x44\xcd\xa2\x09\xc9\x32\x60\x19\x65\x2d\x5c\x9a\x86\x30\x60\x06\xa6\x70\x4e\x6a\x5d\xac\xa2\x22\x07\x53\x48\x85\x9a\x01\x9d\x0a\x23\xb6\xe4\x44\x24\x9b\x35\x5d\x13\x58\x85\x65\x8d\x32\x63\x69\x75\x9a\x17\x74\x25\x53\xca\x73\xb5\xbc\x08\x95\xba\x55\x82\x25\x54\x82\x0c\x52\xc8\x22\x12\xed\xa3\x89\x64\x50\xa5\x50\x80\x19\x06\x66\x19\x85\x65\x15\x06\x95\x99\x1c\xcf\xf3\x48\x4d\xb2\x12\x9b\x12\x38\x26\x2b\x25\x73\x0c\xc3\x71\x32\x27\x71\x8a\x9a\x61\x39\x8e\xc9\xa6\x92\x1a\x0b\x79\x36\xab\x67\x32\x0a\x9b\xe1\x74\x39\xa3\x08\xaa\xc2\x49\x1c\xc7\x71\x79\xae\x63\x87\xc7\xba\xf0\xae\x2b\x71\x2e\x06\xce\x64\xd9\x75\xb9\x1b\x13\x8f\x7d\xac\x60\x26\xb8\x08\xdb\x68\xef\x71\xe2\x95\xa7\xf5\xf6\xcc\x9e\x63\x6b\x31\xfd\xb6\x56\x73\xc2\xf4\x58\x5f\xcf\x0c\x7b\xbf\xa6\xb9\xed\x22\xb1\x7d\xc5\xcd\x7c\xf6\xdd\x95\x0e\x64\x8d\x7a\x3d\x18\xa7\xf5\x76\xb2\x47\x17\xc0\xf6\x8e\x47\xfb\x52\xd1\x2c\x93\x82\xf5\x46\x45\xe0\x55\x43\xd3\x64\x2e\xcb\xf2\x1a\xc3\x33\x86\xa6\x13\x74\x32\x43\x00\x95\x53\x04\x9d\x53\x0a\x6a\x51\xe5\x34\x41\x6e\x48\x8e\x59\x36\xfa\x73\xf6\xf5\x1f\xc0\x45\xe8\xdb\xf0\x8b\xe8\x25\xee\xf6\x87\xc5\x94\xfc\x85\x0c\x7a\x1c\xae\x46\xfb\xe0\x32\xf4\x2f\x19\xf8\x2a\xa5\xf2\xa2\x86\x68\xd1\x50\x24\x49\xe1\x58\x51\x41\x95\xaa\x2c\xb1\x59\x04\x90\xcc\x43\x03\x56\x88\x12\xc7\x58\x26\x2a\xc2\xac\xa1\x8a\x6a\x4e\x11\x45\x45\x53\x65\x8d\x10\x3b\x7a\x91\x75\xe0\xd1\xe9\xc7\x7d\xe9\xd1\xcf\xad\xbe\xf3\xde\xeb\xd2\xaf\x9e\x7b\xdd\xe2\xd5\x9f\x7b\xf4\x73\xc7\xad\xf6\xcb\xf5\x9e\x4c\x35\x52\xf6\x78\x2c\xeb\xd0\xb1\xb1\x4d\x5d\x72\x3d\xb6\xdf\x1f\xfc\x25\x00\xa1\x7a\x70\x98\xf7\x8f\xed\x0c\xd1\xbd\xcb\x63\x7b\xa9\xd5\xee\xf3\x57\x6e\x5e\x08\xbe\xd6\x6a\xcc\xbf\x8e\x3d\x97\x5e\xba\xfb\x56\xb8\x11\x1c\x3d\x7f\x35\x0b\xbc\x78\x1e\xbe\x8d\x7f\xa3\x58\xf3\x1d\x3a\xdd\xc3\x4d\x9f\x5d\x71\xbd\xe3\x17\x3c\xcd\xbb\xd6\xb1\xe1\xb5\x65\x8e\x53\x3d\x79\x00\xd3\xe8\xf5\x38\x6b\x72\x7d\xbb\x8e\xa2\xda\xce\x7f\xde\x9d\xc4\x3c\xe0\xbf\x03\x36\x98\x8e\x5d\xf3\x44\x4c\x27\x29\x90\x6b\x9d\x1b\x1b\xa5\x46\x40\x1a\xcc\x07\x3c\xb8\x0e\xdc\x02\xc4\xc9\xa0\xcb\x1f\xed\x4b\xb4\xc1\x6b\xaa\x0f\xa8\xfa\x7a\x3a\x49\xf6\x5d\x89\xf7\x38\x5d\x23\xa0\x4e\xdf\x7f\x5e\x0a\xfe\xbc\x79\xe6\x6d\xe7\x3d\x38\xfa\xf4\x13\x4f\xac\xbc\xe6\x86\xf3\xb2\x4f\x0f\xde\x90\xa1\x57\x3c\xf3\x10\xfc\x73\x32\xf5\xed\xb5\x4f\xbf\xb1\xf6\x9a\x87\xae\xe1\xae\x79\x7a\xce\xd2\x1b\x1e\x64\x1f\x42\xa7\x90\xff\x64\x7d\x9c\xca\x10\x03\xeb\xd0\xe5\x9b\xd8\x6b\xc4\x0f\x3e\x8f\x26\xe0\x12\xf8\x06\xba\xdc\xba\xc7\x55\xaf\x47\xae\xbb\xe5\x59\xeb\xb5\xd5\xeb\x57\xbf\xf2\xca\xea\xd3\xaf\x5c\xfc\xc5\x81\x73\xd1\x7f\xc2\x93\x5e\xf9\xdc\xb9\xe8\x5e\xf4\x9d\x2b\xe1\x83\xf0\x87\x44\x6e\xf1\x02\x74\xee\x2b\xaf\xac\xfe\xed\x9d\x8f\x2c\x7e\x05\xfd\x15\x4e\x7d\xee\x96\x3b\xcd\xef\xa3\x4b\x56\x5f\x76\x99\xf5\x3f\xc2\x6d\x90\xb9\xb8\xff\x7e\xf3\x3d\x94\xf9\x61\xe4\x2f\x21\xdd\xdb\x6c\x5d\x1b\x5b\x4f\x7d\x89\x5e\xf1\xea\xc7\x23\x8d\x45\x5c\x20\xd7\x43\xc5\x7c\x4e\x4b\xa4\x47\x70\x7f\x93\x91\x9f\xf8\xf8\x28\xf6\xcd\x8e\x61\x9b\xe0\xd0\x29\xee\xb8\xd3\x27\x45\x4c\xa4\xd7\x63\x3b\xd6\xd0\xc9\x3e\x5e\x86\x9f\xb3\x6b\x6b\xc0\xae\xe6\x8c\x0b\x9e\xbf\xe1\xe6\x80\xbc\xa6\x25\xd2\x9b\x76\x04\x78\xa2\xd6\x5a\x1c\xdb\x45\x3d\xe9\xca\x4c\x2b\xb7\x91\xf0\x8d\xd6\x5f\xe6\x3d\x30\x28\xd3\x4b\x77\x6e\x88\x7c\x1e\x1c\x37\x2f\x36\xf8\x33\x3c\x6f\x26\xf6\x16\x35\x42\xaf\xcc\xbd\x04\x9f\x05\x60\xe0\x68\x16\xd0\x2b\x73\x2f\xc2\x7b\xc0\x49\x0b\x4e\xc7\x2b\x5c\x53\xb7\xf5\x3c\x5b\xfe\xdb\x4b\xdd\x89\x33\x25\x1c\x1f\xd1\xb5\xe0\x06\x70\x2b\xa6\xfc\xfe\x28\x84\x7e\xfb\xe0\x5d\x3a\x1e\x8d\xf5\x75\xe8\xc9\xec\x05\x10\xc3\x41\x3b\xcd\xd0\x01\x0a\xd2\x8d\x44\xed\x75\x5a\xa4\x0e\x44\x7d\x00\x32\xb3\xad\x4e\x9c\x06\x6d\x75\xe2\x0c\xfb\x77\xd2\x7d\x73\x7a\x66\x44\x3e\xb3\xb3\xff\xd2\x27\x96\x5f\xb2\xe2\xa2\xb3\xcd\x0b\xfa\x5f\x47\xff\x72\xd6\x59\x57\x9e\x75\xeb\x55\xb7\x2e\x7f\x02\x4e\xbf\x4b\x5f\x71\x57\xff\xf2\xde\x5b\xaf\x3c\xf1\x24\x1d\x5d\x84\x0e\xf4\x98\xff\x74\xc9\x0f\xf5\x9e\x93\x1e\x5c\x7e\xdd\x77\x1f\x42\x1f\x0d\x91\xb5\x26\xfd\xd4\xc8\x08\xa4\x77\x3e\x76\xa0\x31\xe8\xc6\xa4\x57\x54\x51\x16\xd5\x24\x4c\xb1\x35\x28\x42\x99\x43\x5c\xbd\x26\xc8\x4a\x96\xa9\xa9\xa4\x75\xed\xa2\x9b\xef\x7d\xea\xbe\x7b\x67\x7d\xee\x8a\x55\x17\xcc\x5a\x74\xed\xbc\x6b\xef\xbc\x77\x5e\xfd\xb1\xed\xb3\x9e\xfa\xda\x89\x5f\xeb\x5d\x74\xc5\xa2\x2f\x5f\x7b\xdf\xb5\xc3\x8b\x56\xcd\xbb\x77\xd1\x97\x4f\x3c\xf1\x8a\xde\xfb\x2e\xbf\x8f\xf8\x0d\x7a\xe1\x81\xf5\xf6\x7f\x73\x3a\x10\x34\x2e\xab\xb2\xae\x58\x75\x0b\x88\xbc\x29\x2b\xb2\xcc\xf3\x3a\xa1\x01\x00\xa6\x80\xed\x2d\x3e\xf6\x65\x8a\xf3\xa4\x94\xb6\x8c\xe2\xc4\xc6\x0d\x82\xc5\xe0\x0a\x87\xbf\xfa\xaa\x6f\xf4\xce\x09\xc5\xe4\xb7\xc7\x6c\xc9\x25\x86\xa3\x98\xe7\xcc\xf0\x2b\x67\x53\x7d\x49\xc7\xb1\x2f\x6b\x79\x5d\xcf\xe7\x27\xee\x81\x3b\xd0\x8d\xcf\xad\x59\x03\x97\x38\x03\x91\xaf\xc0\xfd\xe8\x33\xaf\xae\x5e\xdd\x7c\x81\xd0\x5b\x20\x59\xb7\x72\xc5\x64\xcd\x84\x1c\x2a\xb4\x7f\x92\x8a\xa8\x89\x1a\xe4\x54\x8d\xd7\x34\xa2\xd0\x34\x14\x85\x94\x2c\x1d\x56\xc9\x23\xd6\xca\x67\xe0\xf3\xd6\x09\x9d\xa1\x08\x6d\x7d\xf1\x59\xf8\xe8\xab\x7a\xae\x51\x8c\xb0\x39\x94\x2c\x22\x50\x40\xf1\x22\xd2\x79\x43\x94\x45\x99\x55\x55\x9d\xf3\xeb\x04\xb2\xa7\x0b\x7d\xd4\xa5\xfb\x3a\x3e\x8c\x93\xc2\x36\xc4\xb1\xcd\x1d\x7a\x8c\xe1\x74\x01\xee\xc3\x38\x15\x64\xb1\xe5\x65\x3e\x60\xc1\xf5\xe0\xb3\xe0\x0e\x27\x2a\xc0\x95\x37\x30\x5d\xb2\x99\x5b\x6c\x7a\xc7\xfe\xe2\xff\x83\x69\x56\x74\xa0\x77\x5a\xac\x7f\x80\x9a\x3e\xad\x77\x20\x3a\xad\x77\x00\xce\xee\xb4\x2b\xee\xb4\x2a\xf6\x87\x0c\x44\x80\x09\x93\x26\x4c\xa1\x71\x13\x55\x4d\x34\x0e\x53\xb2\x9e\x82\xf1\x64\xca\xc8\x26\x61\x11\x09\x38\x65\x46\x46\x3a\x34\x1b\xa5\x54\x4a\xcc\xc1\x3a\x32\xf8\x78\x9c\xb7\x25\x11\x28\xa1\x63\xc6\x4d\x51\x2f\xc2\x0c\xaa\x10\x8e\xd0\x51\x82\x95\x66\xfc\x17\x2e\x6d\x53\x44\x51\xd4\x14\x45\x92\xb4\x6a\x8a\xcf\x66\xb2\x2c\xa7\x48\xb2\xa0\x48\x0a\xcc\x65\x52\x92\xc9\x49\x52\x86\x8e\xf3\x82\x50\x96\x24\xb4\x31\xc3\x4a\x6c\x52\x90\x65\x51\x11\x65\xab\x4a\x3d\x19\xf6\x6d\x68\x9e\x7c\x8f\x75\xaa\x3c\xe6\x2b\x07\x5e\xf7\xed\xad\x98\x48\x8f\x9e\x11\xe0\x75\x0a\xae\x87\x21\x24\xd2\x79\x5c\xdb\x75\x2b\x8e\x34\xdd\x3a\x1a\x7c\xde\xb6\x6d\xf6\xb5\xd7\x1c\xcb\xc6\x1a\x7c\x4d\x6e\x5d\x12\xdb\x47\x6d\xb6\xdf\x55\x05\xf4\xca\xf5\x23\x70\x17\x38\x76\xe0\x1a\x56\xa3\x97\xbe\x76\x36\x78\xbe\xd5\x98\x7f\x3a\x0b\xbc\x38\x04\x36\x91\x36\x71\xfd\x3b\xf3\x3b\x20\x1c\x57\xe0\xe8\x2e\x27\xfa\xc6\x47\x29\x31\xd1\xb7\xf6\x54\xe2\x7a\x9f\x6e\xe7\xd5\x64\x70\x61\x26\x19\x80\x19\xce\xb3\xaf\xb4\xe3\x05\x65\x6c\x77\xb7\x79\xfe\x07\x38\xea\x06\x57\x0a\x3a\xf8\xa1\xa7\xf7\xf9\xe2\x80\xf7\x9c\xf9\x09\xbe\xb5\xe9\x3e\x1d\x1d\xc3\xeb\xfa\x1b\x03\x3c\x59\xc3\xb5\xf4\xb5\xf6\x7e\xef\xc0\xda\xf5\xd0\x09\xf8\xda\xf5\x2d\x2e\xb6\x8d\x52\xe8\xf4\xc1\x3b\xff\x66\xeb\xf5\x37\x46\x3b\xfc\x1a\xe7\x35\x3d\xf7\x8a\xad\xbf\x8e\xa4\xda\x99\x9f\x9e\x8d\x47\x6c\xdb\x08\x86\xe3\x61\x1b\x92\xf1\x73\x00\x12\x61\x3f\xa4\x27\x07\x0d\x4d\x03\x21\xbd\x60\xe8\x97\x21\x1f\x57\xd6\xaf\x83\xad\x7b\xcd\xbb\xff\xc6\xd8\x06\xea\x79\x7a\xe5\xb3\x2a\x60\xd0\x8f\x07\xbf\xba\xf0\x1e\x7a\xe5\xae\x22\xe8\x05\x3b\x07\x2f\x9e\xfb\x5b\xf7\x8d\x04\x28\xb8\x75\x54\xbb\xfa\x39\xc7\x38\x73\x22\x6f\x9a\x51\x7e\x22\x4f\x31\x47\x68\x59\xa6\x6a\x13\xc9\x28\x0f\x00\x09\xca\x2d\x2e\x96\xa5\xe2\x80\x6e\xd7\x5d\x0d\xd7\x6a\xef\x39\xfe\x84\xfe\x14\x46\x42\xaa\x37\x95\xb6\x07\x6d\xfe\x11\xcb\xca\xb2\xa0\x64\x4c\x9e\x9b\x18\x37\x89\x24\x53\x85\x49\x2e\x6e\x26\x39\x06\xe9\x28\x2f\x93\x82\x69\x55\x89\x24\x15\x9f\x48\x8a\x62\xdc\x88\xf3\xd1\xcc\x91\x0a\x55\x6c\x0a\xa8\x92\xa1\x39\x93\x29\xb1\x0c\x2b\x93\x9a\x55\x80\x79\x64\xeb\xb8\x20\xe2\xcd\xdd\xeb\x31\x37\x75\x92\xfa\xa3\xdf\x8e\x3c\xdc\x78\xe6\x65\xf2\xe6\xe6\xb6\x68\xc3\x5b\x51\xe4\x1c\xdc\x66\x8e\xd8\xd2\x59\x58\xab\xd5\x7e\x5e\x22\x4d\xe3\xfa\xf6\x43\xc7\xbb\x7b\x19\x1e\x9f\x8a\x69\x18\xe9\xbd\xbf\xc7\xed\xb2\x93\x98\x1a\x4b\xf7\x45\xa2\x7d\x89\xa9\xd3\x09\x72\x76\xa8\xd1\x6e\xe4\xc7\xba\x68\xd0\x49\x54\x41\x65\xb6\xa2\x99\x85\x7c\x05\x02\x96\x27\x49\x6f\x4e\xe4\x2a\x54\x42\x06\xc7\x73\x4a\xdc\x80\x39\xc2\x60\x2d\x1a\xd5\x92\x52\x39\x47\x34\xfd\xdb\x3f\xc9\x7c\x12\xc0\xd9\x8f\x71\xdc\xbb\x32\xee\xf1\xa7\xc0\x79\x46\xdb\x95\x80\x33\xe6\x44\xdd\x34\xa3\xf1\x89\x3a\x8c\xdb\xaa\x98\x09\xf3\x88\xa7\xe2\x47\x58\x5d\xa7\x8a\x13\x52\x14\xd4\x9b\x35\x03\x8e\x03\x12\xd7\xd8\x05\x94\x86\x3d\xc9\x33\xdb\x95\xa6\xda\xdd\x96\x70\xff\xbe\xe9\xc1\xfe\xe6\x73\x4e\x98\x3e\x9b\xcc\xe4\xb3\x0c\xa9\x9b\x8d\xac\x09\xcb\x2c\x29\x36\xb2\x64\x45\xd5\x0a\x05\x53\x31\x0a\xc5\x9a\x5a\x2f\x8d\xd7\x95\x7a\x39\x4f\x69\x59\x45\x3c\x52\x32\x0c\x8a\x51\x27\x94\x88\xdc\xd0\x23\x19\xa1\x5c\xca\xe7\xe5\x7c\xae\x58\x10\x8b\xa5\x62\x41\xcc\x17\x8a\x93\xad\xf7\x00\xf5\x09\xe7\xd2\x13\x1e\xdf\x8b\xe3\xf2\xec\xab\x93\xde\x4f\x7f\xc2\xf8\x71\xee\x78\x11\xf7\xbd\x66\x12\xe9\x03\xd8\xcf\x35\x34\x25\x38\x4e\xaf\xd8\x7b\x7f\xef\x37\x16\xbe\x79\xd1\xe2\x04\x65\xdf\x31\xe9\xb3\x3e\xe5\x8e\xff\x5b\xab\x3f\xb6\x92\x9a\x41\xa7\xe9\xa7\x4f\xff\x98\x5e\xfa\xec\x6f\x5b\x37\xb7\x6e\x5d\xb0\x60\xde\x79\x20\xda\x7e\x1e\x20\x31\x1c\xcd\xc4\x55\xbd\xdc\x4a\xe3\x04\x6e\xd8\x3c\xe7\x04\x17\xb2\x66\x4f\xed\x9d\xea\xd6\x12\xf2\x9a\x9a\x7f\x83\x30\x2c\xa9\x1e\xd1\x2d\xbd\xa0\xc1\x2c\x94\x79\x41\x2b\x69\x46\x2a\x83\xb2\x28\xcb\xd6\x74\xa4\x5f\x6b\xcb\x52\xd1\xb3\x8d\x89\xbc\x61\xd8\x80\x16\x3d\x6d\xe8\xbd\x17\xd0\xc8\x53\xf4\x92\xfb\xef\x5f\xf8\x6b\xf4\xf7\x25\x4b\x96\x5e\x4f\x0f\xfd\x02\xa6\xa0\x65\xc0\xfd\x47\x68\x8e\xa3\x6a\x47\xaa\x51\x0d\xc3\x78\xbd\xc5\xc5\x68\x4a\xc5\x30\x70\x3e\x00\xd1\x69\xed\xbe\x2f\x5e\x0f\xc7\xe9\x54\xcc\x2d\x64\x8b\x21\x21\xda\x77\xe6\x1c\x3f\x3c\x40\xc3\x84\x22\x9f\xca\x67\xd8\x08\x30\x1b\x19\x42\xd7\x39\xd1\x54\x44\x43\x32\x14\x59\x91\xe4\x12\xaa\x72\x10\xe4\x0d\xb3\xc2\x16\x55\x49\x56\x24\x91\xa7\x73\x14\xab\x2a\x19\x59\x3c\x52\xcc\x19\x11\xa9\x61\x44\xd8\x6c\x5e\x35\x8c\xf1\x6c\x0b\xe4\x65\x45\x91\xe5\xa2\xaa\xaa\x05\xcd\x90\x54\x51\x13\x05\x81\xe3\xa5\x49\xf7\x7e\xdf\x4f\x5d\xbd\xc9\x4f\x27\x8e\x69\x77\x8f\xf5\xac\x46\xae\xdf\x23\xb0\xa7\xc6\xae\x5d\xc4\x39\xbb\x76\x59\x7f\x23\x74\x4b\xb6\x7f\x22\x2f\x7a\x78\x1a\xdd\x36\xb1\x25\x7a\xc7\x84\x19\x39\xca\x44\x3f\x34\x23\x37\xf9\x90\xd3\x3f\x87\x7d\x3f\xf9\x87\xb0\x77\x6c\x70\x9c\x5e\x71\xe0\xcc\x5d\xa7\xcf\x7f\xc8\x96\xe4\x3f\xe9\x77\xf6\xfd\xd8\xa5\x3b\xf5\x16\xe3\x9d\x49\xf6\x93\xce\xa4\x77\xda\xf1\xfe\x23\x69\x07\x80\xe1\x40\x8f\xe0\x91\xc0\xaa\x96\x4a\xc1\x71\x8d\x97\x25\x59\x94\xcb\xa8\xca\x40\x90\x93\x15\xfb\x0f\x8b\x04\xcd\x90\xea\x74\x81\xe2\x9d\x13\xc9\x17\x9c\x13\x61\x38\x36\xab\x25\x51\x8d\x17\x04\x59\x14\x4c\x4e\x67\x14\x81\xe7\x39\x5e\xc9\x97\x54\xa1\x3e\xc9\xdc\x7f\xf4\x09\xfb\x70\x4c\x78\x7c\xdf\x3f\xff\xc3\x7d\xc3\xb9\x42\x20\x06\x0a\x2d\x21\xc6\x79\x79\x59\xbe\x6a\xab\xae\x3d\x30\x74\xa2\x51\xbc\x13\x33\x9d\x38\x97\x5f\xda\x4b\x20\xa2\xa6\x89\x76\x90\xa9\xe6\x78\xa4\xd4\xa1\xc1\x86\x69\x4a\x7a\x11\xe5\xb4\x7c\x51\xa9\xc0\x9d\x26\xf9\x4c\x53\x23\x96\x1a\xe4\x57\x3b\xa7\xcc\xa9\xa6\x6c\x9a\x9c\x50\x56\x25\x23\x3c\xf7\xb7\x27\x9b\x3b\xbd\xf2\xe5\x67\x5a\xcb\xe1\xfc\xf9\x33\xe7\x3e\xe2\x9c\xee\x24\xeb\x3a\xea\x13\xce\xfc\x7b\x78\xbd\x51\x0f\x86\x4f\x02\xa7\x81\x19\x9d\xfc\x33\x5b\x1e\x76\x2a\xc3\x10\x33\xce\x38\xb3\xaf\x77\x9a\x53\x0c\x1c\x3b\x82\xd2\x7d\xbd\xd3\x02\x0d\xc7\xbe\x1b\xb9\x10\x3d\x70\x1a\xfc\x0e\x7a\x71\xc1\xba\xd3\x4f\x3b\x4e\x4b\xab\x37\xa3\xbf\x5f\x89\xe6\xfe\xfb\xbe\xe9\xbf\x44\xff\x75\xc5\x3a\x32\xda\x6c\xc0\x57\xa7\xc7\xd1\x8b\x91\x3f\x76\xc0\x3d\x86\x2e\x57\xd7\x2c\x7b\xe8\x35\xb6\x05\x7e\xb0\x75\xef\x1c\xf6\xb5\x65\xec\x65\x44\xf1\x55\x74\x0b\xcb\xaa\xe4\x4a\x3f\x6b\xea\x9e\xff\xd2\x1d\xaf\xb5\x14\x78\xe2\x9c\xe5\x67\xfd\x47\xf7\xda\x0e\x6d\xed\x3a\xfb\xef\x06\xf6\x2f\x4c\x7f\xe3\x93\x8e\xa7\xf7\x61\xcf\xf1\xbe\xb7\x82\xd7\xf6\xe1\x1c\x1a\x8f\x2e\x87\x9f\x15\xfb\x84\x71\xea\x13\xc6\xa3\x1e\x8f\xbd\x2a\x36\x97\x5a\x01\xa6\xe0\x6e\xbc\xb3\xb1\xfd\x05\x07\xeb\x4f\xa3\x62\xd3\x63\x67\xce\x8c\x06\x81\xce\x53\xb6\xfd\x89\x81\x03\xbd\xe9\x3e\x92\x54\x35\x5d\x6c\x96\x22\xb4\x92\x2f\x2a\xa8\x8e\x8c\xc8\x1b\xdb\x26\xfe\xbc\x7d\x7b\x74\xca\xc4\x9f\xe1\x4b\x77\x5f\xfc\xbd\x8b\xb3\x9b\xb3\x73\x1b\x68\x1e\xfc\x3b\x3a\x6a\x04\x11\x10\xa1\x79\xf0\xf8\xb9\x97\x45\x57\xf5\xcd\xbe\xf5\xb3\x2f\x7c\xed\xc5\x55\x57\x3f\x36\xf4\xd4\xba\x89\x6f\x5d\x73\x4d\xf4\x92\xc6\x08\xf9\x6e\xe2\x9e\x2f\x7c\xe1\x0b\x33\xef\xb9\xf6\xd9\xed\x1a\xfa\x2e\x5c\xa8\x6d\x7f\xf6\x8a\x4b\x43\x6b\xd9\xfb\xc3\x7f\xb8\x27\x91\x4f\x18\x27\x3f\x61\x9c\x98\x7c\x3c\xff\x84\x8b\xa3\x6d\xbe\x66\x63\x68\x8f\x5b\x7b\x8b\x0d\x49\x25\x6e\x71\x2d\x47\xdf\x4b\x78\x15\xd1\x9d\x8c\x08\x87\x8f\x10\x64\xa7\xd0\x30\x0e\xbd\x8c\xb1\x1e\x2f\x8b\xd0\x3c\x27\x70\x7c\x53\x27\x0c\x03\xea\x48\xa1\x19\x81\xd5\x45\x8d\xcd\xa4\x68\x35\xc5\x71\x92\x20\xea\xbc\x29\x4a\x49\x4b\xc8\x12\xb4\x55\xd3\x20\x68\x01\x98\x8f\xa3\x3a\x2a\xa6\xa0\x68\x0b\xb6\x92\x44\xd5\x26\xe2\x51\x29\x95\xc9\x8a\x4c\x46\x2d\x16\x55\x54\x2b\x19\x15\x06\x95\x8b\xba\x9e\x31\xc5\x82\x24\xc8\xb2\x02\x53\x90\x53\x90\xa8\xe4\x91\xa9\x0a\x9c\xce\x86\xd6\xfd\x85\x7f\xb8\xaf\xd0\xd5\x79\x3b\x7c\xde\xe1\x43\xd3\xc0\xc9\xbe\x8a\x0f\x5e\x44\x9e\x0d\x24\xa7\xc3\x8e\x15\xc0\x71\xd7\xe2\x70\x83\xe9\x54\x6c\x66\x40\xaa\x84\x7f\x8b\xc4\x1b\x75\xbd\x5d\xcd\xd3\xfe\x29\x0a\xa5\x2a\x57\x26\xe2\xd5\x0a\x53\x1e\x87\x47\xa9\x82\x9c\x4a\x21\x16\xd1\x29\x98\x29\xab\xb2\x02\xab\x0c\x71\x99\xb7\x7f\xe4\x5f\x2c\x0e\x56\xb9\x3a\xd7\x02\x5c\x45\x66\x52\x6a\x32\x93\xcc\xaa\x6c\x32\xb2\x5e\x52\xd9\x4c\x96\xa5\x25\x4e\xcf\x88\x6c\x96\x81\x67\xfb\x04\x83\x49\xd6\x08\x42\x67\xee\xe7\xb5\xf3\xdd\x98\x0a\x9f\xfd\xc8\xbf\x86\x4e\x15\xb3\xe3\x63\xbd\xb4\xaf\xb1\x0a\x15\xed\x5b\x48\x0c\xf4\x12\x3d\x11\xd8\x68\x8d\x3e\xfd\x34\x3c\xe5\xa9\xb5\x4f\xc1\x77\xbc\xc9\xdf\x41\xa4\xb2\x8c\xc6\xb3\xb0\x6c\x31\x71\x42\x51\x0a\xbc\x92\x54\x04\x81\xa5\x11\x9d\x45\x05\x59\x2e\xb2\xa8\x10\x7d\x04\x5d\xf7\xd8\x01\xfb\x3f\x38\xbf\xb3\x02\xeb\xa5\x0b\xcf\xbd\xf6\xda\x3b\xb4\x4b\xe7\xa3\xad\x6b\x8f\x53\x8f\xbb\x74\xef\xfb\x6b\xef\x4e\xbf\xfc\xb6\x3e\x19\x0d\x7b\xfd\xd8\xd6\x6a\x38\x6d\xde\xa3\x73\x7b\xba\xd7\xbd\xa6\x35\xf9\x99\xaf\x41\x9f\x30\x6e\xb9\xbe\xfc\x7f\x6e\x71\xb1\xc5\x14\xe3\x8b\xc3\x70\xbd\x5c\x6e\xc7\xb5\xfe\x69\x33\x3a\x56\x8e\x81\xe0\x9f\x59\x70\x5a\xff\x40\xcc\xde\x45\x1f\xd4\x04\xe4\x97\x9b\xa1\xf4\x2a\xbc\xfd\x91\x47\xd0\x26\x38\x8a\xee\x80\xef\x37\xbe\x0f\x7f\x84\xbe\x0a\x9f\xc0\xd6\x8b\x4b\xe0\xb7\x90\x01\x27\x7e\xfa\xd3\x9f\x36\x7f\x15\x39\xb9\xf1\xdb\x17\x48\xb2\x69\xd9\x3f\x91\xef\x74\x64\xc4\xdb\x97\x2c\xd9\x7b\xf7\xf6\x25\xd2\xa0\x24\x0d\x4a\x4b\xa4\x85\x77\x2f\x5e\xbc\x78\xdf\xc2\x85\xd6\xdb\xa8\x1f\x9e\x70\xe9\x7f\x2d\x88\x2e\xf9\x87\xf0\xb0\x06\xf7\x5b\x03\x47\x7b\xf0\x40\x83\xe3\x71\xe7\x1f\x87\x0a\x2c\x74\x6b\x9c\x75\x72\xa6\x1c\xf1\x76\xba\x6b\x2c\xf3\xc0\x1b\x2f\x2e\xa0\x76\xf4\xf7\xcc\xe8\xc5\x65\x32\xfb\x7b\xa2\xee\xf6\x90\xb7\x3c\x77\xcb\x9d\x1f\xfc\xcf\x9d\xf7\xe5\xef\x7b\xf4\xf4\x73\xd1\x3a\x74\x77\xdf\x9b\x7b\x55\x95\x1c\xf3\x96\x43\xcc\x46\x67\x44\xf6\x58\xdf\x3c\xe1\x54\xe2\xa1\xe7\x9a\x9f\x7f\x05\xee\x39\x15\x95\x4c\x13\x9e\x0c\xaf\x7b\x72\x13\xfa\x4f\xb4\x07\x5e\x67\xff\x44\xdf\x9c\xa1\x5d\x3d\xe5\xd4\x5b\xe6\x3e\xb3\x71\xe9\xdc\x0b\xce\x9e\x72\xef\x2d\x6f\xa2\xdf\x13\x7f\xf7\xc1\xcd\xf7\xee\xbf\xff\xe2\x79\xd6\x5d\x9f\xfe\x34\xb1\x61\x9e\xf5\x36\x1c\xe6\x38\x74\x2f\x1c\xde\x7e\xd9\x67\xb9\x49\xf6\xa0\x11\xd2\x17\x56\xee\x7b\xab\x75\x04\xd2\xec\xe5\x03\x3f\xa7\x57\xee\xaf\xb6\x7e\x00\x67\xce\xfb\x1c\x7b\x97\xa3\x3d\x4c\xf2\xfb\x13\x9f\x00\x43\x47\x3e\x61\xbc\xee\xfa\x53\xdb\x7b\x7e\x14\x98\x01\x16\xe0\xb8\xdf\xcb\xc0\x55\xe0\x5a\x70\x23\xb8\x0d\xdc\x05\xee\x05\x5f\x00\x0f\x83\xc7\x30\xe7\xc2\x96\xb6\x74\x1f\x1c\x0c\x67\xaf\xcd\xc1\x1f\xd3\xa9\xe8\x1c\x4c\x91\x27\xb9\xd2\xb6\xc4\x79\xb5\x0a\x1c\x09\xcb\x27\x67\xcd\xf4\x59\x32\x67\x76\xf5\xb3\x88\x9c\x3a\xeb\xe4\x07\xd0\xc3\xcf\x1e\x7f\x0a\xfc\xf6\xb2\xc5\xa2\xf8\xe4\xe2\x39\x53\x96\xcd\x38\x7e\xd9\x94\xd5\xa3\x27\x2f\x5b\x76\xe9\xe2\xe3\x6f\x9c\x23\xce\x6a\xae\xbf\xf1\x8c\x53\x56\xdc\xff\x95\xaf\x4c\x59\x36\xe3\xe4\x1b\xed\x4b\x37\x2e\xbb\xf4\xca\xe3\x6f\x9c\xb3\x22\x5b\x83\x97\xa3\x37\xec\x9f\x18\x9c\x8f\xde\x16\x57\xad\x22\x6e\x59\x30\x65\xd9\xb4\xac\x35\x6b\xce\x94\x65\xd3\x66\x11\xec\xb2\xe3\x4f\xb9\xf1\x8c\xe6\xef\xf1\x5f\x24\x3a\x63\x9a\x38\xe5\x0c\x2b\x3b\x6b\xca\x8d\x53\x66\x45\x8f\xee\xc0\xb9\x24\xde\xbd\x6a\xd5\x55\x57\xa2\x9f\x4c\x5d\x9f\x3d\x72\xf8\x94\x53\xe7\x66\x57\x6d\xc9\x5e\x3f\x37\xbd\xea\xee\x91\x53\xa7\xae\xd2\xff\x3d\x5d\xbc\x7b\xea\x55\x57\x66\xd1\x5f\x36\xcf\xed\xbe\xb4\x65\xd5\xf5\x8f\xdd\x86\x46\x6f\x1b\xb9\xf2\xe9\x97\xfb\xd6\x3f\x7d\x2a\xfe\x3c\x3a\xfd\x8b\xf5\x97\xec\xd9\x82\x3f\xd7\x3f\xbd\x27\xfb\xc6\xd3\x69\xfc\x19\x79\x24\xa0\x5a\x4d\x72\x7e\xb8\x5f\x04\x80\x40\x6e\xe5\x63\x3a\x25\x83\xe3\xb0\x45\x23\x50\xf9\xa7\x4c\x54\x4c\xa2\x6a\x25\x49\xae\x3e\x4e\x32\x56\x26\xc2\x12\x59\xab\x6c\x34\x4d\xc3\x20\x45\xc7\xf6\xe7\xd6\xe9\x3c\x84\xeb\xa3\xec\x29\x7b\xb6\xb3\xbc\x63\xb7\xa5\x7f\x02\x40\x22\xf6\x72\x09\x9c\x0e\x9e\xc6\xf7\xbb\x3d\xfa\xec\x3b\x69\xea\xe0\x69\xde\xfd\x5a\x4c\xa7\x52\x89\xf4\x3e\x1c\x07\xbc\xa6\xd3\x87\x8d\x77\xf2\x2c\xec\xfb\x13\xd4\x7e\x9c\x73\x0a\x08\xf0\xd9\xd6\xad\xb1\x97\xa8\x41\x70\x0c\x48\xfb\x66\x3d\xa3\x07\xd7\x2a\x6e\x67\x39\x12\x54\xef\x19\xe9\x81\x9e\x5e\x5c\xad\x78\x6a\x6f\x95\x38\x30\x42\xbc\x69\x2d\x1d\xb1\xae\x59\x44\xa9\x56\x8d\x51\xca\x5c\x3c\x47\xab\xa8\x54\xd6\x50\x39\x8b\x4a\xa8\xcc\xc1\x1a\x8b\x92\xd1\xb9\x90\x42\x13\xeb\xd0\x32\xb8\x0f\x5d\x6b\x20\x90\x4a\x71\x65\xa6\x05\x54\x4e\x24\x18\x94\x47\x06\x67\x2a\xb0\xda\x9e\xb7\x6b\x8b\x3b\x88\x6b\x73\xef\x6d\xeb\xec\x12\xce\xeb\xc9\x24\xd2\xa3\xd8\xd7\x36\x7a\xa2\x3b\x6f\x16\xe7\xbd\xaa\x20\x09\x32\x4e\xb7\x5a\x27\x4b\x83\x88\xb5\x7d\x64\x03\xfd\xd8\x27\x16\x3c\x06\x95\x60\x98\xac\x99\xc9\x44\xe8\x46\x4e\xd7\x4d\x41\x94\x4d\x4d\xe2\x04\x44\x13\x0c\x1c\x37\x71\xdd\x06\x66\xa2\x4a\xb0\x28\x15\x55\x55\x35\xa5\x48\x06\x2a\x17\x9a\x3c\x51\x15\x05\xd5\xcc\x69\x72\x0e\x25\xa1\x86\x14\xc3\x2a\x1b\x06\x91\x05\x6e\x6d\x48\x6c\x27\x74\xe7\xfd\x29\xcf\xff\x24\x3b\x76\xcd\x43\x38\xab\x68\xef\xb1\xde\xb8\xe8\x9c\xdb\x5e\x5c\x4f\xea\xd0\x71\xde\xb9\xf1\xfe\xe7\x6c\x7b\xd5\x5d\xa7\xd6\x52\xb0\xbd\xfd\x38\xb7\x4f\x4f\x60\x39\x64\xb8\xbe\x54\x8a\xd0\x72\xb8\xf3\x72\xfc\x08\x4f\x02\x4b\xa1\x09\x23\x47\x18\x96\x44\x66\x8e\xd0\x64\xca\x92\xa2\x12\xa4\x51\xcd\xcd\x44\x6d\xd6\x9c\x92\xe0\xb8\x62\x94\x33\x07\xd9\x89\xab\x76\xe6\xb0\xef\x3c\x6f\x6e\xa2\xe3\x4b\x73\xc6\xc7\x56\xf8\xd6\x88\x6d\xb1\xce\x1a\x0f\xb5\xd7\xce\xb7\x98\x58\x19\xdb\x3c\x5f\x2e\x81\x04\x75\x78\x7a\xa6\xe3\x93\x2b\xe0\x78\xbd\xe3\x70\x7c\xf5\x15\xa9\xce\xd9\xe3\xdc\x8b\x7d\xab\x30\x2c\x03\x9f\x0f\x0f\xd7\x9c\xdc\x88\x7b\x76\xf8\xf6\x2a\xe7\xd4\x06\xda\x7b\x0a\x7e\x0e\xf0\x60\x45\x73\x7c\xd1\xeb\x71\xae\xf2\x1e\xc1\xbb\xdf\xb5\xb7\x3b\xf3\x3f\x08\x7d\xcf\xe7\x3b\xf3\xdf\xf3\x53\xdf\x59\x38\xf9\xe4\xf8\xfe\x3d\x3f\xf1\xdd\x2f\xb4\xe7\x4f\x53\xe6\x67\x7d\xe3\xb8\x3f\x81\x33\x3e\xd6\xf2\xcd\x07\xd7\x8c\x3a\xbc\x38\x30\x1f\xa1\xdd\x2b\xde\xd9\x87\xc3\xd3\x7c\xcf\x31\x3a\xcf\x3f\x7c\x8c\x37\xee\xfa\xa8\x9d\xfb\x77\xdc\xef\xcd\x53\xf5\xaf\x6b\x2c\xe9\xbb\xdf\xec\x3c\x67\xcf\x23\xde\x38\xef\xd4\x02\x72\x61\xd2\xf4\xed\x4f\xbe\xfd\x9c\x04\x35\x76\xe2\x64\xcf\xf1\xf5\xba\x17\xda\x31\xc1\xee\xb9\xff\xd4\x37\xee\xc1\xbc\xf7\x5b\x77\x7a\xef\x16\x3b\xf8\x30\xf2\xbf\xbe\x39\x61\x9f\xc7\x18\x8e\x53\x5e\xf7\x77\xdf\x1e\x15\x7d\x67\xf3\x65\xd0\x81\x15\xbd\x43\x27\x86\x17\xf9\xf6\x0e\xc3\xe2\xfe\x9b\x02\xb0\x22\xb5\x73\xf2\xf6\x63\xbb\xfc\xfe\x5b\x7c\x73\x55\xed\xf7\xee\xfd\x5d\x08\xb6\xda\x35\x81\xf0\xf3\x0f\x2c\x9f\xfc\x6c\xc6\x7e\xe3\xda\x74\x78\x9c\x63\xa9\x82\xe3\xc0\x29\x60\x56\x37\xdd\xf7\x2c\xad\x44\xac\x0f\xf8\xcd\xae\xa0\x4e\xe4\x4d\xa2\x68\xb1\x2e\x47\xe0\x23\x25\x93\xce\x14\x0a\xaa\x9a\x93\x73\x0a\xcc\x36\x53\xed\x7f\x4a\x79\x05\x66\x88\x64\x44\x6a\x18\x06\xca\x19\x06\x14\x22\x5a\x46\x53\x4b\x75\xb5\x5c\x6a\x81\x82\x02\x05\x58\x6c\xff\xbb\x56\x52\xdc\x9e\x4f\x42\x3b\x2e\xec\x10\xee\xd7\x74\xc0\x70\xe7\xeb\xf0\x07\x05\x4c\x03\xbd\xe0\x7c\x27\x27\x6e\x5a\x27\x97\x3d\x95\x1e\xe8\xe9\xef\x39\x73\xa6\xb3\x86\x99\xb6\xd6\x16\xce\xe5\xa5\x6a\x12\xaa\xa0\x9c\x50\xd5\x58\xda\x48\xc9\xe3\xa8\x68\x9a\x30\xd5\x88\x1b\x44\xc6\xaa\xc0\x4a\x16\x15\x51\x95\xcb\x86\xd8\x1d\x95\xd4\x0b\x4a\x2d\x95\x62\x35\xa6\x28\x0b\x12\x99\x45\x9a\x52\x47\x25\x13\xe9\x9a\x2e\x72\x22\x2a\x57\xab\x46\xcd\x30\x6a\x8e\xcd\xe4\xfe\xd6\x67\x63\x26\x75\x97\xe7\x1f\x98\xd1\xb1\xab\xc2\xfe\x1e\x3a\xda\x77\x26\xce\x78\x9c\xd9\x1f\x8a\x7d\x3e\x39\x5a\x99\xc8\xec\x8b\x65\xeb\x65\x62\xb1\x89\x18\x01\xaa\xc4\x33\xdb\xb6\xa1\x17\x4c\x62\xcc\xba\x9a\x9c\x57\xff\x05\x79\xad\xb5\x84\xf8\x46\xf4\x3b\xfa\x6f\x0d\x62\x37\xba\x00\x3d\xfe\xc7\xe7\xdf\x82\x33\xe1\xaf\x1a\xef\x14\xd0\xf7\x5f\x44\xdf\x1f\x1a\x82\x73\x5f\xec\xf0\xd1\x11\x6a\x79\xa2\x6f\xc7\x47\xe0\x68\xf2\xaa\x04\x65\xf3\x53\x0c\x4f\x72\xec\x3b\xd4\xb2\x44\xdf\x8b\x6f\x80\xd3\x89\x3b\x12\x54\x7e\x8e\xeb\x7f\x52\x63\x26\x35\x27\xd1\xb7\xf5\x46\x40\x13\x2b\x13\xd4\x9a\x63\xbd\x73\xc0\xb8\x7b\xf8\xca\x00\x9c\x65\xdb\xf0\x7a\xe8\xb7\xd8\x8f\xf4\x91\x0f\x5e\x71\x9f\x0d\x07\x5e\xd7\xfc\x35\xc0\xd7\x15\x8f\xaf\xff\xc5\xe7\x5b\xf3\xd1\xe6\x2d\xef\xfb\xe0\x5b\xf3\xd1\x80\x1f\x87\xe1\xde\x19\xdf\xb4\xda\x47\xf3\xc4\x0e\x5e\x6d\x78\x0b\xf8\xe3\x28\x3c\xbc\x1d\x9d\x3e\x29\x5e\xa5\xf7\xe3\x98\xd8\xfd\x6b\x7d\x74\xc3\xc3\xdd\xb1\x0f\x03\xef\x56\x13\xe9\xd1\x13\x3a\x7b\x81\x6b\xba\xc9\x36\x5d\xc2\xd6\x86\x4e\x5d\xdf\x7e\xa7\x1a\xb6\xfd\x03\x7d\x12\x29\xe9\xeb\xa3\x40\xe6\x4c\xa2\x66\x4e\x14\x4c\xa2\x4e\x64\x0d\x59\x55\xd4\xa6\xaa\xb0\x3a\x2b\x5f\x1e\xcd\x4d\x08\x3f\xc1\x99\x5a\x8c\x69\x52\x32\xfa\x0a\xba\x02\x26\x51\x15\x1e\x86\xf7\x2c\xdb\xb6\xec\x4b\x37\x7d\xf9\xcb\x8f\xde\xbc\xea\x4b\x4d\xce\x40\x77\xea\x91\x4b\x1a\xc5\x20\xbf\x71\xe6\xbd\xe5\x3d\x6f\x6f\x74\xff\x1e\x1f\x7c\xc3\x5b\x4f\xce\xc9\xa7\x71\xf7\xf8\x47\xbe\x3d\xd3\x7d\x7c\xae\xe9\xe3\x97\x86\x8f\xa6\xfd\x30\x40\x5b\x3c\xba\x3c\xf6\xeb\x2e\x9a\x83\x71\x78\xec\xe5\xc0\x99\x78\xcf\xd9\xbd\x03\xf8\xf9\xab\xc7\x27\x36\x3c\xe6\xa3\xb1\xf8\xcc\x9d\x3e\xe6\x1e\x0c\x0a\x6d\x9f\xe5\x8e\xd7\x42\xe3\xb9\xce\xfc\x69\x6a\xfd\x65\xbe\xfb\x71\x5d\x9c\x4d\xbf\x08\xdd\xef\xe6\x70\x0c\x0f\x4e\xf2\x7c\x7b\x7c\x41\xd7\x38\xae\x55\x35\x86\xfd\xc1\x87\xf1\xdb\xd7\xfc\xaf\xdb\x7f\xcf\xc6\x23\xd9\xb3\xb2\x80\x70\x27\x73\x6c\x55\x39\xc7\x31\x28\x91\xa1\xaa\x46\x30\x4b\x68\x26\x91\xb7\x78\x32\x75\x24\x43\x26\x2d\x25\xc2\xd5\xab\x4a\x19\xd5\x2c\x4d\x6d\x01\x54\x57\x20\xa3\x11\x8a\x89\x25\x24\xbe\x5e\x22\x39\x4b\x8b\x9a\xe5\xb2\x51\x35\x8c\x2a\x12\x95\x9c\x62\x9a\x1c\x57\x96\x25\x0d\xd5\xaa\x55\xa3\x05\x0c\x03\xb6\xcf\x0d\xcb\x1b\x2e\x0e\x4c\x9b\x9c\xcf\xee\xfe\x60\x72\x5e\xb1\xe3\x06\xdf\x3e\x09\x1e\x7f\xa4\x0e\xcf\x09\xc8\x27\x4a\x9b\xff\x8e\x1a\xde\xfd\x6e\x8d\x59\xe7\xfe\x91\xe1\xc0\x7b\x3d\xda\x9e\x7f\xda\x77\x3f\x86\xa3\xd1\xe3\x43\xfb\xed\xf6\x4a\x70\xee\x3f\x78\xab\x6f\x3e\x7a\x07\x5e\xf6\x2c\x09\x9c\x9b\xd7\x83\x39\x70\xce\x46\x67\x1f\x36\x3d\xe5\xe3\xc9\xf9\xce\xfc\x47\xbe\xee\xda\xbe\xd5\x96\x6e\xcb\xb4\xfe\x3a\x7a\x98\xdf\xf8\xb2\x56\x3a\x56\x12\x2f\xb0\x35\xda\x97\x82\x0e\xda\x9f\x08\x7b\x7b\x66\xd9\xdf\xa9\x3c\x8f\x4a\x48\x25\x69\x54\xc1\xfd\x32\x92\x16\x20\x6a\x47\x4c\xa2\x6c\x25\x21\x8d\xfb\x67\x8c\x13\x75\x4b\xcb\x12\x15\x58\x42\x39\x13\x15\x21\x8b\x8a\x70\x1c\x0a\x94\xa8\x27\x93\x05\x1d\x55\x0d\x34\xae\x57\x74\xbd\xa2\xc3\x94\x01\x93\x7a\x9e\xd6\xad\x0c\x26\x08\x49\x54\x45\x9c\x2d\x07\xc3\x94\xbb\x46\xc3\xed\x11\xe4\xf0\xcd\x75\x61\x7a\xb7\x1e\xd7\xa9\xdc\xdf\x39\x0b\xc9\x8f\xd3\xa3\x89\xc9\xf6\x96\xa6\x5e\xfb\xb3\x37\xfe\x44\x6c\x1b\x75\x0e\xbd\xf2\x98\x1c\xf1\x10\x00\xe7\x5e\xc9\x9e\x8f\xb5\x80\xbd\x38\xb6\x41\x73\x62\xd3\x30\x8d\x4f\xef\x7a\x15\x3f\x71\xaa\xf7\x1e\x2c\xdb\xee\xc7\xb5\x28\x0e\x4d\xf1\xc1\x8e\xd9\x91\xdd\x36\xfe\x38\xee\xe7\x23\x42\x9b\x3e\xef\xc6\x99\x8b\xbb\xcf\xf7\xce\x57\xc6\x32\xd7\x77\xbb\xf0\xd2\xeb\xb1\x9b\x08\x8e\x77\xe4\x3a\xea\xc0\x68\x58\xe6\xda\xf9\x7e\x60\x4e\x62\xeb\xb6\x98\x4e\x3d\x9c\x58\x91\xfb\x08\xac\x66\xc1\xa5\x1f\x26\x96\xec\xbb\x10\xfc\x86\x05\x8b\x6b\x1e\xfc\x7a\xbd\x3a\x13\x61\x59\x4d\xf6\x78\xdf\x9f\x03\xf8\xe4\x9d\xc9\xa1\xb6\x7d\x46\x6d\xa9\x31\x8d\xe2\x12\xe9\x11\x5c\xc3\x72\xe4\xc7\x9e\xfe\xa1\x3a\x7b\xbf\xeb\x7b\x9d\xb3\x02\x31\xb0\xb2\xc5\xc4\x2e\xa5\x1e\xf1\xe4\x8a\x13\xfd\xf5\x00\x83\xd1\x07\x4e\x34\x17\x74\xeb\xb0\xf6\xcc\xb1\xc9\xcd\xec\x39\x8e\xe7\x91\x7c\x9a\xd4\x9a\x8a\x41\x08\x56\x8e\x4c\xbf\x6e\x7d\xcd\x34\x89\x55\xd6\xd7\x86\xd5\xa4\xa4\x8a\x8d\xdf\xfe\x69\xf4\x4f\x7f\x2a\x9f\x88\x7e\x8b\x76\xf7\xbe\xf8\xd8\x9f\x48\xca\x34\xa3\x6f\x5a\x9f\x79\x1e\xae\xb7\xfa\x9b\xff\xb6\x6a\x15\x39\xcb\xfa\x2d\x7c\x36\xb2\x3b\x95\x53\x78\x09\xbd\x02\xdf\x43\xe9\xad\xd6\xf5\xd7\x6f\x78\xfe\xb6\xbd\x33\xce\x26\xfe\x13\x8e\x1f\x51\x7d\xb4\x5c\x6c\xaf\x79\xe7\xf6\x00\x6e\x6a\xee\x78\x7a\x17\xee\x45\xbe\xeb\xb9\x20\xfd\x77\x7a\x4f\x7b\xfb\xca\xb7\x7b\x68\x8d\x60\x3f\xc2\x9a\x3f\x05\xce\xd5\xa3\x53\xa3\xb7\x7b\xe3\x17\xc5\xbe\xe9\x8d\xaf\xcc\xfd\x7b\x2b\x0e\xc0\x65\x9b\x58\x40\x2f\xcd\xbd\xdf\x5a\xd9\x6a\x5e\xba\x8b\xfd\x8c\x0b\xe3\xb9\x8e\x1e\xb0\xb3\xa3\x0f\x09\x1d\xba\x45\x53\xbb\x5a\xbe\xf7\xf9\x7a\x50\x87\xf8\x47\x47\xb6\xfe\x91\x07\x47\xaa\x93\xc3\xb8\x6b\x4d\x07\x1f\xf6\x0f\x4f\x46\x63\x77\x7d\xdf\x7b\x96\xee\x5f\xd3\xa1\x5d\xde\xb8\xea\xbf\xff\xe0\x49\x01\x18\xf6\xd6\x70\xf8\x57\x01\x58\x14\x12\xe9\x5c\x21\x84\xef\x6e\xbf\x53\xe7\xfe\x03\x97\xf9\xd6\xe0\xc3\x91\x97\xdf\x0f\xc8\x6d\xd9\x44\x7a\x17\xce\x71\xdf\x77\x61\x40\x57\xf2\xe8\xc3\x4e\x3f\x0e\xe4\x3a\xfa\xca\x9a\x9a\xef\x7e\xa5\xa3\x63\xee\x2c\x78\xe3\x9a\x2b\xe7\x61\x38\xd9\x45\x4e\x2e\xb7\x79\xfd\xac\x85\x76\x1f\x7d\x47\xdf\x7a\x35\x1a\xc6\x65\x77\x3f\xb3\x01\x9e\xef\xf1\x88\x9d\x71\x1f\xdd\x33\x3b\x32\xcb\xfa\xc5\x5d\xb2\x0c\x86\x4f\xdc\x09\x95\x3a\x78\x82\xef\x9a\xf7\x8e\x35\x7f\xf4\xad\xcd\x37\x3e\x9c\x0d\xcc\xa9\x23\x7b\xb6\xe3\x44\xee\x68\xf7\x59\x3c\x74\xdc\xd1\x3f\xf2\xf5\x59\x14\xda\x75\x8f\x9c\xfb\xb7\xeb\x01\x59\x58\x4d\xa4\x37\x0d\x76\x6a\xb9\xd8\xf3\xf3\xe8\xb4\x96\x48\x8f\xd2\x01\x1a\xd6\xe1\xed\x53\xb0\xce\x9d\xf6\xce\x47\x76\x7b\x1b\x61\x18\x5e\xf3\x3f\x01\xb9\xdd\x96\xcf\xb7\x63\x79\xd8\x39\xbd\x3f\xf8\xd6\xe1\xc9\x83\x63\x6f\x05\xe4\xb2\xce\x7e\xfc\xde\xd5\xd1\x14\x9c\x87\x23\x82\xd3\xc0\x85\x60\x91\x13\x1d\x35\xd0\x3b\x10\x89\xf6\xa5\x66\xfa\xd8\xa7\x27\x10\xf5\x3b\x79\x1c\x1d\x35\xae\xf7\x8c\xf4\x80\x2d\x36\x39\xa9\x0a\xb3\xe7\x0c\xf4\xd6\x89\x62\xb3\x4c\x66\x51\x15\x15\xb2\x44\x81\x28\x72\xa8\x82\x0c\x32\xd5\x1c\x27\x0a\x16\x47\x66\xeb\x35\x92\xb5\xd8\x08\xd0\x0b\x9a\x94\xaf\x67\xd8\x1c\x13\xd7\x69\x11\xd5\x4d\xa1\x51\x82\x79\xc3\x28\x56\xb2\xf5\x32\xe2\x21\x43\x26\x75\x33\x19\xd7\x65\x2d\x9b\xca\xe9\xcd\xaa\x9e\xd3\xf5\x1c\x29\x16\x39\x59\x51\x85\x6c\x2a\x99\x91\xb2\x26\xcf\x0a\x90\x93\xac\xbc\x98\x4d\x69\x99\x8c\x12\x90\x57\xd7\x6e\x0a\xed\x71\xb6\x63\x0f\xa2\xa9\x51\x3e\x0c\x8b\x4e\x4f\x41\x8f\x4e\x3c\xec\xc1\xe8\x94\xde\x67\x12\x94\x79\xaf\x4f\xa7\x5d\x4f\xdd\x06\x4e\x03\x03\xb8\x56\x06\xf6\x49\xc5\x7a\x09\x9f\x4b\x8a\x88\xf6\xcd\x4e\x4c\xc5\x1e\xdc\x99\xd3\xc8\x13\x7c\x61\xd3\x03\x17\xf6\x4d\xb5\xa5\x8d\xb0\x9e\x1b\x5d\x9f\x4d\xc2\x82\xa5\xd3\x04\x17\x57\x34\x5e\x4f\x9a\x7c\x36\x1b\x47\x1c\x83\x6a\xb2\x69\xd0\xa8\x0a\x4b\xc9\x0c\x5a\x60\xe8\x4e\x17\x1e\x36\x93\xca\x99\xa8\x6e\xa4\x89\x71\x93\x18\xb7\x52\x24\x5b\x1f\x27\x59\x2b\x45\xdd\xc6\x89\x7a\x0e\xc9\x95\x94\x91\x52\xca\x68\xbc\xa8\xca\x30\x05\x81\xce\xb2\x94\x86\xaa\xba\xa6\xa9\x49\x3d\xc9\xb0\xaa\x02\x99\x66\x36\x22\x34\xee\x6d\x6b\xc2\xee\xfe\xc8\x1d\xbe\xb7\xfd\xbd\x00\x0d\xea\xec\xdb\x71\x61\x5a\x36\x3a\x65\x72\xf9\x6f\xeb\xfd\x5d\xfc\x56\xa7\xee\x4c\xac\xdc\x71\x77\xab\x01\xbe\xcd\x82\x39\xef\xd2\x2b\x5f\x2b\xb5\x9a\xad\x13\x06\x37\xcf\x79\x3c\xd1\xa1\xb5\x9a\x9f\x76\xe6\x19\x1f\xfc\x3a\xb9\x79\x9f\x0a\xbc\xef\x8e\x16\x47\xfd\x15\xd7\x50\x9d\x72\xf4\xfa\x04\x35\xf6\xde\xde\xce\x3c\x8a\x1d\x39\x34\x57\x0c\xf3\x21\xac\x0f\x50\xb9\x77\x81\xdf\xae\xd6\x59\xe7\xb1\xde\xbc\xdd\x5e\x57\xc3\x4f\x02\x90\x58\xb2\x47\x00\x1f\xb3\x60\xc1\x25\xbe\x67\x75\x64\xf5\xcf\x04\xe4\x31\xa3\x3d\xbe\xef\x67\x01\x9e\xe4\xd1\x73\x47\x54\x70\xd7\xec\xd3\x81\x86\x77\xfa\xee\xcf\xfb\xe4\xbd\x63\x26\xd3\xe1\x12\xd4\x21\x2a\x30\x6e\xd3\xf3\x2c\xae\x9d\x8f\x57\xb8\xe6\xe3\x20\x5d\xd8\xf7\x41\xe8\xbc\xd8\x98\xe8\x5b\xf7\xd1\x61\xfd\xcb\x79\x87\x79\xbd\x8f\xb7\xe5\x7d\x3c\xe3\xbf\x7d\x36\xb4\xbc\x27\x2b\x50\xdb\x4e\x0b\xcc\x49\x6b\x3f\x67\xdb\x4a\x10\xb6\x33\x3a\xf7\x7f\xec\x1b\xf7\xf1\xf3\x6d\x07\xbc\x71\xc3\xbf\x47\x9b\x8f\xf2\xbd\x37\xe7\xe9\x77\xd4\xe1\xb7\xc3\x7b\xe1\xf2\xf9\xef\x84\xf1\x7d\xf4\xa8\x2e\x79\xd4\x2f\x5b\xc7\x27\x3b\x83\x04\xb5\xe5\x24\x1f\x9c\xfb\x6c\x1b\xdb\x7b\xbb\x9e\x83\x69\xf9\xb6\x69\x93\xed\x03\x4d\xed\x7a\xd3\x1b\x7f\x2a\xf6\x04\xf5\x55\x7a\xc5\xc1\x8b\x2e\x8e\x2e\x20\x06\xcb\x89\x0e\xcd\xca\xe2\x9a\x7b\x18\x5e\x2a\xf6\xb3\x36\x8a\xb4\x8f\x9f\xeb\x1e\xae\x9e\x12\x9e\xab\xb3\x17\xdb\xc6\xbb\x74\x38\x47\x1e\x39\xde\xc7\x57\x9d\x9e\x58\xff\x1a\xa2\x95\x6e\x0f\xad\x8d\x8f\x74\xed\x91\xef\xf9\xeb\x9e\xf6\x3d\xdf\xd7\xfb\x2f\xf0\x1c\xc1\xe3\xcf\xd4\xe8\xe5\x3e\xb9\x49\xef\xf0\xf3\x43\x1d\xb9\x26\xd0\x57\x2e\xa0\x77\x60\x5c\x1e\xc5\xb1\x9a\x7b\x86\x3c\xdc\x74\xc7\xf7\x60\x8b\xd0\xb6\x2f\xf8\xde\xeb\x83\xe9\xed\xc7\x86\x6d\x10\xae\x4e\xf9\x13\x57\x77\xe4\x1d\x98\xf6\xb2\x49\xbd\x1a\xc6\xbe\x3a\xec\xd1\xd8\x99\xa4\xdb\xd7\x1c\xd7\x34\xf6\x69\x91\x61\x6a\x9e\x83\x9c\x4e\xd4\x9d\x8e\x8b\x06\xca\x14\x60\x46\x40\xfa\xb8\x55\x2f\x23\x45\x80\x82\x8e\xb2\x50\x43\x05\x58\x21\xea\xb8\x77\x08\xfe\x11\xa0\x6a\x42\x15\xa9\x44\x71\x02\x10\x26\x52\xa3\x35\x4d\xd3\x34\xdd\x12\xf5\x9c\x90\xd3\x61\xb2\x05\x72\x9a\xae\xeb\x84\xa9\x28\xff\x3f\x67\x6f\x02\x2f\x37\x55\x2f\x8e\x9f\x93\xcc\x64\xc6\xa2\x90\x3b\xdd\x06\x17\xc8\xed\x6d\xef\x0d\xca\x12\xb9\xdc\xde\x40\x81\x86\xc5\x36\xb2\x46\x40\x88\x22\x10\x51\xdb\xf0\x54\xc8\x8f\xf7\x84\x28\x5b\xd8\xc3\xda\xe0\xa5\x6d\x5a\xb8\x6d\xba\xa7\x1b\xa4\x1b\x8c\xdb\x63\xf4\x3d\x75\xfc\x89\x3a\x20\xea\xa0\x80\xa3\x4f\x1f\xa3\xf8\x74\xdc\x87\xde\xc9\x99\xff\x27\x27\x99\x4c\x66\x11\xdf\xef\x5f\x3e\x73\x69\xcf\xcd\x9c\x9c\xf3\x3d\xdf\xfd\x7c\x17\xa4\x9b\x48\xb1\xfc\x86\xe7\x61\x89\xd8\xd1\xb3\xe2\x1e\x66\x07\x8f\xea\x93\x6d\x7f\x1c\x80\xeb\x1d\xbd\x75\x61\x17\x8f\xe6\x73\xa3\x53\x9b\xf0\xbd\xdd\xea\x6e\x7d\x83\x5e\xf9\xd8\xce\xd6\x17\x88\x15\x67\xff\xea\xb4\x73\x73\x63\x7b\x7e\x0a\x66\x11\x4f\xe4\x92\x3a\xb2\xde\xd1\x0d\xa7\x6f\xe9\xd2\x55\x3b\xfe\x89\x97\x22\x39\x6a\xb5\x8c\x8c\x46\xe9\x60\x7e\x64\x17\xcd\x9b\x8f\xed\x9f\x76\x88\x62\xbb\x3b\xdd\xec\x58\xfd\xe8\x44\x38\x04\x27\x40\xd0\xba\x54\x72\x8a\xaa\xe8\x49\x32\x74\x9d\xc3\xba\x03\x4d\x41\xe6\x53\x1a\xca\x13\x8e\xaf\x90\xec\x9b\x0c\x99\xf7\x65\xc2\x45\x79\x87\xe4\x9a\x65\x4a\x31\x9d\xc0\x50\x37\x2d\xce\x50\x91\x0a\xb3\xa8\x01\x6d\x4d\xf5\xeb\x08\x78\x96\x6b\xdb\xae\xe5\x99\xf5\x10\xd7\x36\x67\x2c\xea\x5a\x7a\xa5\x0b\xc9\x9f\xb4\x1e\x3a\x7b\xf5\x39\x17\x07\x7f\x07\xc7\xb7\xae\x3b\xeb\xbc\x73\xff\x05\xfb\x66\xdf\x19\xd1\x7f\xa2\x57\x64\x8f\x9c\xe3\xdb\xfc\x71\xf5\x31\x7d\xfa\x65\xe8\x47\xc1\xf0\x01\x29\x6c\x57\x1a\x94\xd1\xa9\x9e\x1d\xa7\x6a\x76\x65\xd4\x0e\x75\x65\xb4\x24\x23\x3d\xe0\xc4\xf0\xdc\x76\xed\x28\xc8\x10\x16\xd2\x91\x0c\x5d\x9b\xd0\x71\x99\x28\x14\x56\xdc\xaa\xf8\x2c\x06\x0b\xf7\x66\x96\x64\x71\xb4\x2a\x43\x54\x7d\x2d\x95\xf7\x4d\xd4\x80\x0d\x94\x25\x6c\x58\x4b\x01\xb5\x61\x99\x01\x9e\x35\x54\xa4\x69\x96\x6a\xa9\x16\xfe\xa1\x11\xa6\xaa\xa2\xac\xa6\x69\x3d\xb2\x61\x43\x7a\xb0\x8f\x2f\xe2\xa1\x17\xf4\xc2\x64\x73\x76\x80\x7d\xd3\x96\xc5\xa3\xde\xe5\x18\x32\x57\x74\xfb\x0d\x22\x1e\xb7\x24\xc1\xef\xb1\x2d\xb0\xee\x8a\x01\x3a\xb4\x9e\x1b\x9d\x4e\xe8\x71\x80\x04\x62\xcb\xc8\xec\xa6\x34\x30\x0f\x8c\x82\xe5\x89\xee\x1d\xed\x1c\x47\x5c\x2c\x34\xd0\x6b\xbb\x40\x4b\xfe\x93\x70\xa3\xdb\xe1\x15\x0f\xc2\x05\xe8\xb5\xe7\xee\xfa\xd8\xa7\xbf\xf0\xe0\x17\xbc\x4f\x7c\xfb\x01\xf4\xdf\xe4\xc9\x2e\xf6\x07\xf2\x8d\x0a\x29\xfa\x12\xe1\x7d\x14\xfa\x27\x9c\x72\xc7\xf9\xa7\xc3\x03\xfe\xa7\xb2\x84\xa4\xed\x3d\x5f\x9b\xa7\x5d\x72\xe9\xe9\x47\xa1\x93\x4e\x40\xdf\xbb\xee\xba\x83\xa7\xa3\xef\xa5\xf5\x46\xc3\x62\x6c\xd3\xb2\x35\xbf\x46\xe4\x5b\xc0\x31\x0b\x90\xf5\xb9\x82\x55\xb0\xed\x82\x95\x5a\x74\xfa\xf8\x35\xd7\xdc\xf0\xc4\x85\x1f\x40\x37\xed\x19\xfa\xe2\xd0\x85\xdf\x7a\x73\x8f\xfe\xbe\x2d\x3f\xdf\xd2\x81\x45\x0c\xa3\x0d\xa9\xd8\x57\xa1\x86\xe7\xb0\xed\x52\xcc\x17\x61\xc2\x56\x76\x3b\xf7\x5f\x1b\x99\x41\x3e\x8f\x1c\xb5\xba\xde\x75\x9e\xf1\xfc\x6b\x1f\xe9\xb2\x4b\xcc\xdc\xe8\xee\x8b\xf0\xb9\x61\xeb\x64\xf7\x85\xb1\x5c\x0c\x6d\x47\x3c\x97\x77\x25\xa8\x27\xe6\x8a\x6d\x41\x6f\x77\x82\xe7\xbb\x1d\xf9\x3a\xf5\xab\x84\x9e\x91\xd8\xdb\xfe\xd7\x06\xf1\xae\x1c\xb5\xf5\xf8\x5e\x7d\xe5\x80\xd3\x87\x93\x78\xfe\xfd\xcf\xf6\xc9\x26\xad\xc3\x97\xb6\x8e\x76\xd9\xca\xb1\xcc\xf2\xca\xbd\xf3\x84\xef\xdd\x7c\x5b\x62\xbc\x10\xeb\x31\x51\xbf\xa2\xfd\x77\x25\xe0\xa4\xe7\x46\x37\x0d\xe3\x3c\x61\x12\xcf\x38\x99\x90\x99\x9d\xf9\x1c\xba\x77\x5d\xf8\xfd\x5b\xbf\x33\x58\x3f\xdd\x22\x25\x74\x47\xcc\x57\x22\x3f\x1e\x96\xc0\x9b\xdf\x1e\xcb\x4d\x8c\x07\x7b\x3e\x06\x00\xbd\xec\x00\xa0\x8e\x38\xdd\x5d\xba\x2a\x7e\x7f\xa1\xf3\x9e\x2d\xc7\xf4\xc2\x25\xec\x25\xd3\x05\x2f\x27\x96\xfd\xa3\xbb\xb0\xf6\xb4\xe7\x8e\xf8\x0c\x13\x77\x0a\xbb\xba\x75\xa7\xf8\xac\x36\xed\xee\xd3\xa9\x42\xbf\xe7\xab\x5d\xba\x9c\x99\x1b\xdd\xff\x9d\x9e\x77\x4b\x49\xdf\xf7\xfe\xaf\x45\xbc\x53\x09\xeb\xa6\x82\xa3\xf0\xfd\xe2\x05\xfd\xfe\xfb\x58\x32\x2f\x9a\x8b\x7d\x6a\x13\xc3\x8b\x7a\x3d\xfc\x89\xc8\x13\x2a\xd3\x0e\x3d\x09\xab\x36\xb1\x84\xe9\xe0\x80\x06\xfa\x4d\x85\xa8\xfb\xba\x02\xf3\x36\x76\xf6\xca\xc8\x46\xaa\xe0\x39\xa8\x46\x9a\x90\xb3\x71\x6e\x9f\xda\xb4\xa0\x86\xca\x4d\x3e\x03\x7c\x5b\x14\x6a\x32\x6d\xe5\x25\x1e\x15\x8b\x0a\x2a\x48\x7e\x55\x83\x55\xc9\x6f\x50\xb4\xaa\x5a\x9a\x65\x69\x48\xd6\x34\xcb\x64\x75\x91\xb3\xb3\xf9\xc0\xac\xb3\x82\x3f\xc8\xb0\x5a\x80\x61\x05\x8b\xad\xf0\x9c\xa8\x42\x0e\xd9\x96\xad\x36\x62\x18\x27\x7c\x2f\x9b\xbc\x84\x6e\x14\xf6\xfb\xc5\x3d\xda\x0e\x6c\xea\xe2\xb9\x62\xac\xa7\xff\xa6\x4b\x27\xeb\xe0\xbd\xd8\x65\xb7\xc9\xb9\xd1\x43\x13\xff\x40\x2f\x0e\xfd\xf9\x7e\x17\x3e\x76\x7c\xce\xa7\x0f\xd6\x73\x0f\x2d\xee\xd3\x03\xc2\x33\xff\x5a\x3c\xae\x25\xef\x17\xb6\xfc\xbe\xd7\x4e\x8b\xe8\xe0\xf9\x3e\x9f\x08\xf6\xd3\xed\xfc\x69\x82\xa6\x6e\x6c\x7d\x30\xb3\x9e\xba\x8d\x5e\xf9\xb0\x0a\xc6\x88\x8f\x9f\xf9\x2c\x7f\x14\xbd\x6c\x8f\x3c\x6b\xa7\x00\x4e\xfe\x6d\xac\x77\xca\xb9\xd1\x1d\x5f\xc5\xb5\x85\xf1\xcc\x53\xb5\x04\x4e\xc6\x36\xd5\x96\x59\x5d\xb8\x1a\xdb\x17\x07\xe8\xc1\xbc\x71\xdf\x83\x5d\xeb\x13\x72\xa3\x3b\x57\x76\x78\xe3\xd4\xeb\x31\x7e\x6f\x88\x61\xb6\x7c\x4b\x05\x6c\x04\xe0\xb4\x3f\x0a\xdd\xf6\xd0\xce\x1e\x7f\x78\x14\xb3\xd0\xb5\xe6\xff\xc6\xbf\x5b\xd9\xfe\xce\xe6\x0b\x00\xc8\x8d\x6e\xbe\x30\xa0\xf2\x83\x47\xbd\xf3\x0d\xfe\xcc\x68\xce\xb3\x33\xf7\xc5\x3a\xc7\x72\xeb\x49\xb0\xba\x35\x73\xda\x57\x84\x13\x22\xb8\x07\xfc\x78\x2c\x78\x53\x4b\xcf\x51\x9b\xbf\x93\x58\xbf\x14\xfb\x9c\x7e\xdd\x05\x07\x2b\x37\xba\x66\xed\x00\x5b\x21\x3e\xef\x4d\xf7\x75\xc9\xa0\x00\x2f\x3f\x1c\xac\x7b\xdb\x65\x58\x12\x5d\x1a\xef\x29\xc1\x7b\x37\x35\xa2\xef\x48\x71\xdd\x74\x9c\x07\x9c\x90\x05\x6d\xbb\x63\x4b\x0f\x6e\x46\x3d\x98\xf6\x6f\x03\xdd\x3e\xe8\xa8\xd6\xf5\xc1\xa3\x1a\x20\x47\xad\xfd\x11\xdd\x48\xd0\x84\xd9\xbe\xa7\x70\x71\x87\x00\x57\xe8\x96\x81\x9b\x66\xe1\x3b\x8c\x9b\x31\xa7\xf9\x79\xcc\x2b\xb1\xcc\x39\xb4\x77\xb0\x6c\x89\x6c\xd2\x13\xfa\xc6\xf1\x69\xc5\xbd\x1e\xe4\xd6\xca\xcc\x0b\xd4\xda\x08\xc7\x32\x4e\x81\xb8\x13\x1c\x9b\xc4\xe9\xa7\x3f\x90\xc0\x99\xff\x4a\xf0\xdd\xd8\xae\x3e\x70\xb8\x4f\xd7\xc2\xe3\xce\x3d\x5d\x7c\x3a\xc6\xcb\xa9\x5f\x0e\xa6\xa7\x4d\x9f\x8f\x78\xa8\xdc\xba\x2a\xb3\x83\x92\x71\x24\xf6\x59\xe0\x52\x1c\x79\x8f\x95\xef\xd9\xc3\x73\x87\x67\x87\x89\xfd\x61\x7c\x6d\xa7\xa0\xcb\x28\x99\xe9\xf1\x6a\xe1\x52\xc5\xed\x2c\xa2\xfe\x9b\x8c\xcc\xa3\x9b\x9a\x75\xe7\x57\xc4\x9d\xfe\x1d\xfb\xae\xff\xd9\x55\x5f\x76\xd1\xd3\xa9\x6b\xfd\xef\x0e\xbd\xed\xfa\x93\xad\xcf\xae\xb8\xea\xb2\xcb\xf6\x5d\xef\x5e\x75\xf4\xd1\x9f\xfa\xd4\xb9\x37\x2d\xb8\x69\x05\xfd\xce\xb7\xa1\x19\xf4\xd4\x39\xf0\x16\x78\xe4\xd1\xd9\x1f\xa2\xdf\x9c\x0f\xe7\xfd\x6c\xc1\xcc\x6d\x35\xbb\x56\x2b\xe5\x51\x1d\x15\x18\x53\xaf\x51\xc3\xe8\x4a\xf8\x76\xf4\x17\xb8\x0d\xbd\x61\x21\xfd\x8a\xcb\x2d\xee\x9a\xf5\xeb\xdf\x36\xeb\x3a\xeb\x8a\xfb\x6e\xbb\xfc\x9c\x57\x8a\xab\x5e\x81\xc4\xec\x5b\xd7\x6d\xd9\xf3\xee\xbd\x63\x57\x5c\x7e\x2a\xf7\xc3\xeb\xd6\xfd\xcb\x2b\x97\xcf\xde\x72\xdd\xba\xcb\xd7\x71\xf0\x87\xb0\x80\x44\xdb\x37\x25\xcb\x90\x1d\x86\x25\xdc\x58\xf6\xc5\xbd\x46\x62\x1c\x37\x30\xef\x0d\xce\xe0\x33\x18\xa6\xbf\xe8\xa2\x75\x3d\x37\x7a\x68\x41\x40\x7f\xbb\xaf\xc0\x9a\x4d\xc8\x8b\x74\xac\x9b\x61\x5d\x98\x29\xe6\xa8\xd5\xb7\x0c\xe6\x8f\x1b\x88\x04\xff\x4d\xf0\xd3\xcd\x1f\xee\x7d\x07\xc6\x8a\x90\xeb\x51\x53\xd5\x84\xae\x12\x9c\xe9\x70\x1f\x5e\x26\x7c\x13\x61\x4f\x13\x90\x8d\xe6\xba\x1a\xe7\x10\x4e\x80\x53\xa3\xb8\xdf\x0f\x87\x11\x2f\x43\x5d\xae\xca\xb6\xa7\x32\x9d\x2c\xfd\x13\x65\xdb\xb7\x6f\x50\x67\x47\xb1\xfa\xb0\xfd\xff\x5e\xe9\x4b\xa4\xec\x19\xb5\xe8\x28\xaa\x24\xd0\xb2\xc8\x17\xca\xa8\x6a\x13\x2e\xf4\x1c\x58\x42\x3c\x34\x91\x0e\x6d\xa4\x3a\x88\x85\x15\x64\x42\x1d\x49\xe5\x6a\x15\x1a\x75\xdf\xc2\xff\x3b\xbc\x82\xf0\x42\x7d\x5a\xc4\xb7\xe7\x12\xf1\x9c\x99\x82\x26\x72\x8b\x8e\xa6\xe6\x2d\x46\x36\x4b\x50\x99\x29\xa5\x8a\xa7\x5e\x7d\xf5\xbd\x17\xfb\xbf\xbc\xfc\xbe\x57\x5e\xb9\xef\x72\xe2\x98\x8b\xd1\xab\x97\x5f\x7e\x39\x7a\xed\xf2\xcb\x2f\xf7\x97\xdb\xb6\xe9\x58\x96\x13\xc9\x4f\xa7\xe3\x97\x89\xfb\xef\xf4\xc4\x2e\x4d\xfd\xbc\x4b\xff\x8c\xe9\x6b\xea\xb5\x84\x7e\x88\x75\x1d\xe7\x4f\x3d\x7c\x3a\xea\x8f\x13\xf9\x58\xde\xd6\x4b\x8f\x3b\xc7\x7a\xf8\x66\x97\x7e\xbb\xfd\xd2\x5e\xfc\xc0\x7a\xf2\xa8\xb3\x25\x78\xcb\x1a\xaa\x47\xe6\x86\x34\x7f\x53\x02\x47\xb0\xde\x14\xca\xc4\x1d\x66\x42\x26\x86\x3c\xcf\x68\xf3\xbc\x1d\xb8\x56\xcd\x8e\xbf\xf7\xbf\x8b\xa6\x0e\x7e\x38\x61\x27\x38\x1d\xdd\x74\xcd\x6b\x5d\x3a\x76\xec\xff\xb1\x37\x46\xe3\x0a\xf6\x85\x59\xb9\xd1\xa7\x71\xb5\x9b\xa9\x57\xbb\xf4\xb6\x78\xfe\x0d\x6d\x3b\xe4\xda\x96\x90\xf9\x3c\xa5\xd3\x2b\x9e\xd8\x66\x82\x73\x3e\x2f\x60\x38\xce\xea\xf8\xf9\x12\xf7\x17\x9b\xfe\x3a\x90\x0e\xa8\xa9\x57\x12\xbc\x3e\xe4\x83\x38\x5e\x66\xea\x67\x83\xfc\x76\x34\x75\x60\xd5\x60\x7d\x66\xfd\x77\xba\xec\xc7\xf8\xbc\xf1\xb5\x73\xd7\x7b\xa7\x5b\x6d\xa8\xc6\xe7\x9d\xb8\x2f\x7a\xfc\xc5\xae\x79\x62\xff\xf2\x5a\xa1\x8f\x2f\x87\xbe\xa7\x6c\x9f\x3d\x13\xbe\xf7\x4c\x90\xf4\x8f\xc6\x7c\x7f\xdd\x35\xd1\xb8\xd8\x62\x43\xfb\x64\xdf\xdd\xa0\x1a\xc0\xad\xee\x25\xd6\x29\xe6\x46\xbd\xc5\x98\x4f\x4c\x74\xd9\x1a\xed\x5a\x83\x97\x0d\xd0\xe9\x83\x77\x5c\xd0\x37\x9e\xe8\x55\x10\xee\x64\xf3\x82\x78\x5d\x26\x65\xb7\xf7\xf7\xf8\x4f\x12\x70\xf2\x3a\x77\x55\xab\x5f\xeb\xd2\x2b\x63\x1c\x98\x46\x5d\xfb\x0b\xf4\xaa\x45\x5d\x74\xf4\x99\xd6\xb2\xcc\x36\xea\x08\x7a\xe5\x63\x66\xeb\x10\x6a\x9c\xfd\xfd\xe5\x1f\xcb\x2d\xf3\x26\xd3\xaf\x0b\x60\xf9\xb9\xf1\xfb\x8d\x5c\x78\xb3\x16\xcd\xba\xf1\xcc\x04\xae\x5b\x6d\x9d\x77\xbf\xd1\xeb\x57\x74\xac\x3e\x3e\xa9\x25\xd6\xe6\xf7\xe2\xc8\x3e\x0d\x74\xc7\x1a\x44\x3c\x64\x5f\xa8\x53\xff\xb4\x8f\x87\xe0\xb3\x8d\x7b\xca\xc4\x36\xdb\xda\x5f\x76\xf6\x08\x66\x01\xb9\xf5\xe1\xcc\xed\xd4\x6d\xe0\xed\x38\xe3\x25\x0f\x18\xb0\x10\xb0\xe0\x78\xc0\xe1\xdc\x9e\xa8\xdd\xe3\xa2\x40\x98\xb6\x2b\x74\xf6\x94\xab\x6b\x17\x0c\x0f\x0b\xb1\xb5\xc5\x6d\x98\xd6\x19\xc8\xdb\x34\x75\x03\x4d\xff\x15\x9e\x72\x31\x7a\x09\xfd\xf9\x55\xf4\xca\xc5\xf0\xca\x2c\x91\xf3\x7f\x7f\x88\x7c\xb2\xf9\xc9\x35\x84\xea\xdb\xe4\x2a\xab\x69\x59\x16\xd4\x91\x49\x64\xb1\xf1\x12\xfd\x0d\xd9\x87\xff\xee\xd9\x85\x82\x24\xe6\xab\xa8\xc1\xa8\xb2\x47\xdd\x76\xc9\xfc\xa3\xf6\x7e\xfc\x7e\xed\xbb\xdf\xbd\xe3\x8e\x55\xab\xf4\x8f\xa2\x1b\xf5\x0d\xe8\x06\x5f\x65\x05\xc2\xab\xab\xaa\x8a\x1c\x4d\xd3\x52\xb3\x43\x81\x6a\x31\x2c\x96\xa8\x0c\xe1\x75\xf3\x8c\xe8\xee\xf6\xea\x2e\x7d\x24\xae\x81\x1f\x9e\xc0\xba\xab\x12\x70\x33\x72\xa3\xd3\xcd\xb6\x16\x96\xb0\xb5\x63\x7f\xd1\x01\x6c\x4f\x4f\xbd\x1c\xfd\xee\x92\x8c\x42\x99\xf4\xca\x7d\xf7\xc2\x3f\x82\x59\x27\x3e\x23\x00\x7a\xe5\xbe\x7b\x88\x61\x30\xe7\xf8\xf7\x2f\x7d\x81\x5e\x76\xf0\xc8\x59\x7f\xe5\xbf\x22\x68\x49\x9a\xde\xf2\x14\xae\xb1\xf9\x74\x8f\x5d\x9e\xa8\xa7\x9f\x78\x77\x54\x97\x3b\xa2\xd3\x93\x07\xf3\x93\x0d\x4b\x7a\xed\x83\xfd\xbd\x71\x4d\x91\x9e\x39\x3d\x03\xba\x7d\xdc\x71\xbc\x74\x1e\xe4\xa8\x7d\x6f\xd6\xe9\xf8\xbd\x89\x1a\xd1\x09\x1a\xe5\x93\xf2\x6c\x43\xe7\x9e\x4c\x4d\xc6\xaf\x4c\x1f\x1e\xac\x93\x4e\xbf\x39\xd8\xaf\xb1\xf1\x4b\x5d\x7c\x4f\xce\x8d\xae\xfb\x58\x17\xdf\x53\xda\x7e\xcc\xe9\x06\x3e\x03\x5c\xa9\x6a\xf7\x74\xe2\x3b\xff\x16\xf1\x80\xe5\x8f\xbd\xde\xaa\xb7\x04\x01\x7c\xe0\x37\xf1\xbe\xe3\xbb\xaf\x8d\x85\xae\xf7\x58\xb9\xd1\xcd\xb7\xe3\xb3\x78\xaa\xeb\x2c\x3e\x9b\x79\x92\xfa\x97\xe8\xbc\x57\x1e\x3c\x85\x38\x11\xbc\xfb\x84\x77\x9f\xf1\x1c\xbd\xfc\xd0\x1a\xf8\x87\x56\xf3\xa4\x1f\x2c\xbd\x11\xaf\x49\x89\xfc\xdf\x3f\xc3\x75\x4b\x71\x77\xce\xa9\x4a\xb4\xde\x41\xbf\xfb\x09\xfe\xdd\xc2\xd6\x25\x99\x7f\xa3\xae\x0a\xd6\xf4\x7c\x3a\x47\x6d\x98\x78\x65\x56\x6c\x57\x78\x1d\x9e\xbc\xe7\xc6\x5e\x5b\x30\xec\x21\x90\xc0\x0d\x21\x29\x6b\xa6\xff\x9e\x38\x23\xab\x73\x46\x1b\xbf\x1a\x8d\x5f\xd1\x12\x32\xd3\x94\x4c\xaf\x38\x78\x24\x71\xc4\x99\x97\x2c\x5d\x45\x2f\x7b\xfa\x4f\x0a\x38\xe3\x4e\xa1\x73\x86\xf8\x4c\xf6\xec\xc7\xb1\xed\xf8\xdb\x8f\xbd\xd6\x8d\x6f\x87\x66\x0d\x88\x9b\xea\xe8\x31\x3f\x4e\x8c\x2b\x1d\x9a\xd9\x8e\xe5\xc2\xd4\x8f\x06\xc9\x98\xe9\xbf\xf5\xfa\x7a\xa6\xff\xda\x85\x73\x6a\x3b\xcf\xc4\xdb\x92\xb0\x53\x5e\x4a\xe8\xa2\x9d\x38\x4b\x5c\x3b\x79\xea\x87\xf1\xf7\x70\xef\x28\xf7\xd9\xc4\xf7\x5e\x1c\x64\xaf\x4c\xff\xa5\x97\xa7\x46\xb1\xfa\x54\x42\x6f\xea\xd8\x70\xd4\xda\xe7\x62\xb9\x18\xe0\x91\x1a\xeb\x07\x2f\x24\x78\xbf\xd1\x89\xad\x98\x9e\x4c\x3c\x8f\xcf\xec\x8b\x0b\xda\x5a\x7b\xb7\x7f\xe1\x40\xc2\xb7\x39\x55\x8e\x68\x34\x19\x33\x47\xed\xff\x49\xe2\x1d\x21\x6e\xf7\xc6\x75\x88\x51\xcf\xac\x70\x6f\x7f\x06\x3d\xbe\xea\x70\xdc\x7e\x39\xc1\x63\xf0\x9e\xd7\x2e\x1d\x60\x63\x77\x68\x9d\xcd\x76\x9e\x2f\x76\x7c\x13\xeb\x7e\x17\x3d\x7f\x0d\x8e\xeb\x31\xe8\x15\xe6\x89\xad\x3b\x85\x07\xce\x7d\x2d\xd7\xed\x73\x4f\xc4\xea\xc4\x35\x68\xe5\xee\x9a\xc0\x89\x77\x6b\x61\xcc\xdf\xaa\x83\x5d\x70\x92\x7b\xf4\xb1\x1f\x74\xf1\x9f\xce\x1d\xe1\x27\x63\xbe\xa1\x84\x35\xed\x23\x0a\xfc\xfe\xa0\x73\xa6\xa9\xd5\xef\xed\xd2\x41\x62\xdc\x8c\x6b\xee\x76\x6c\x1b\x3c\xbe\x71\x77\xef\x7a\x22\x5d\x73\x61\x2f\x1f\x73\x4e\xec\xd1\xdf\xba\xea\xcc\x76\xc1\x3a\x51\x33\xb2\xeb\x7e\x41\x4f\xd0\x11\xae\x50\x3f\xf5\xbd\xc4\x5a\xd5\xf6\xbb\xa7\x9e\xef\xd5\xa3\xf7\x1c\x4c\xdc\xc7\x7f\x37\x9e\x2f\x61\xbf\xaf\xd5\x13\x70\xc2\x3c\x26\x84\xd3\xda\x33\x7b\xe5\x46\x48\x0f\xeb\xff\x3d\xe6\x25\x62\xe6\x40\xa0\x4b\x7b\x77\xce\x02\xe3\xbe\x00\xe8\x65\x3b\xb2\xe7\x83\x33\xf7\x0a\x9d\x75\x77\x64\x26\xb5\x7f\x63\x97\x5e\xa6\xe7\x46\x77\x3f\x89\xfd\x1d\x1b\xf0\xda\xfe\x6f\x02\xdf\x62\xd8\x6f\xdc\x91\xc0\x4f\xbb\x33\xd7\xd4\x77\x7a\x65\xe0\xfe\xcd\x38\xe6\xa8\x2f\x36\x39\xc2\x85\x2f\x76\x9d\x89\x98\x1b\xdd\xf0\x7b\xec\x17\xff\x43\x8f\xae\xea\x24\x60\x59\x8a\xf7\xc9\x65\x36\x07\x38\x7d\xf0\xc8\x2c\x38\xf5\x65\x01\xd0\xcb\xad\x63\xc0\x0e\x00\x4e\x9b\x27\x00\x00\x81\xd3\xf2\x02\x3d\x63\x50\x3e\xa4\x43\x66\x5d\x32\xdf\xac\x11\xe5\x37\x8b\x44\xa9\xd9\x48\x89\x04\xe7\x97\xad\xa6\x65\xdb\xa4\x16\x7c\x57\xc5\x79\x35\x22\x98\x17\xc6\x0c\x77\x67\x7a\x0c\xa5\xd2\x63\x0c\x55\x94\x51\x01\xe9\xa4\xd4\xf4\x88\xfa\x9b\x16\x51\x6d\x16\x49\x01\x15\x91\xcd\x11\x0d\x4a\xb4\x05\x06\x01\xdb\xd7\x6c\x9b\xb0\x6c\x58\xcf\x67\xed\xb6\xdf\x20\xca\x41\x58\xff\x2d\x1c\xf3\xbc\x8b\x6d\xdb\x2c\x11\xfd\xef\x79\x08\xcb\x97\x87\x7b\xed\xab\xf5\xdf\xc6\xb4\xf9\xbd\x18\x5e\x7c\x67\x1e\x9a\x9a\x6a\xc7\x1f\x3a\x2d\x39\xcc\xb3\x9c\xfe\x13\x1e\xff\x56\xec\xaf\x88\xf8\x48\x34\xfe\x4d\xac\x77\x92\x91\x8e\xa1\xe3\x8c\xfb\x93\xfa\x3b\xd9\xb7\x3d\x3f\x70\xa8\x2b\xba\x6b\x68\xf8\x48\x98\x1e\x5b\xb8\x78\xc8\x26\xea\x61\x5d\x5e\xeb\xb0\x44\x18\x3e\x4d\x19\xce\xe1\x8a\x93\x32\x78\xb5\xa0\xd0\x0e\xed\xa0\x4a\x59\x41\x66\xbe\x8a\x8a\x1a\x14\x4a\xe9\xaa\x1d\xfe\x41\x3c\x52\x60\x16\xd5\xa0\x87\x0a\x28\xcf\x32\xb2\xcb\x55\x2c\x49\x85\x7a\xa3\xa1\x18\x52\x0d\x72\xd8\x0f\x15\xe6\x97\xb5\x7b\xed\x8f\xfd\xd3\x3e\xfb\x54\xbb\xd1\xbe\x45\xb2\x36\xc9\x36\x2b\x84\x7d\x98\x25\xdc\x66\xc5\x4e\x9b\x87\x75\xdc\x40\xdf\xb0\x14\x58\xd0\x05\x47\x90\x60\xad\x51\x81\x75\x51\xc3\x7d\xce\x1d\xcb\x72\x90\xe4\xd7\xac\x06\x12\x2d\xcf\xb5\x65\x53\xb1\x2c\x5d\x05\x29\x70\x75\x6b\x6d\x66\x1f\xa5\xe2\xfc\xc7\xf7\x25\x21\xd4\xc6\x86\x45\xbd\x39\x00\xed\x7f\x8f\x0c\xe1\x9a\x4b\x57\xc3\xfb\x1f\x80\xf7\xa1\x2f\xc0\x2b\x9b\x3f\x86\xcb\xd0\xe7\xc9\x02\x34\x1f\x84\x0f\xa0\x9b\xe1\x55\xcd\x17\xe1\x72\xa4\x37\x9f\x27\xca\x0e\x51\xf1\x59\xc7\xe7\xae\x4a\x17\x0e\x8b\xb0\xf1\xf7\xbf\xaf\x42\x5f\xbe\xff\x7e\xb8\xec\x8b\x6f\xbe\xf9\x18\x7a\xe6\x81\x07\xe0\x79\x29\x72\x66\xc6\x42\x9f\x82\x4f\xa0\x19\x1b\x44\xb1\xc7\xc9\xf3\xc7\x31\x2e\x20\x03\xac\x38\x5f\xb3\x53\x1f\x60\xc9\x80\x73\x8d\xee\xd3\x27\x62\x2f\x4e\xe8\xc1\x59\x34\x32\x77\x1c\x8e\x4f\x8c\xa4\xa3\x4f\xf0\x77\x8b\x64\x1c\x1c\xab\x67\x1d\xe6\x08\xa7\x59\x25\x14\xc4\xdb\x54\xc5\x46\x02\x0e\x4f\x50\xdf\xcc\x13\x0a\xd2\xa1\x09\xcd\x7a\xdd\x37\xeb\x75\x18\x7d\x90\x5e\xaf\xe3\xe6\xcb\xba\x65\xe9\x7e\x0d\x35\xa0\x8d\xf4\x46\x01\xb1\x45\xcb\x2a\xc2\x4a\xa1\x80\x0a\xf8\x8f\xdf\xc0\x81\x58\x14\x30\x5a\x9f\xcb\x6c\xa3\x0c\x40\x82\x23\xa2\xba\x3c\xe3\x51\x65\x1e\xdc\xb0\x7f\x64\x08\xe7\x9b\x8e\x87\x94\x0c\x93\x95\x79\x7a\x77\xb7\x33\x55\x9c\x11\xd2\xdf\xb6\x0f\x6b\xf6\xfb\x08\xc3\xa9\x3b\x84\xd6\xa8\x42\xc6\x52\x2c\xd9\x4a\x2b\x96\xe6\xaa\xd6\xe1\x4f\x90\xbc\x83\x91\xc4\x3d\x4c\x13\x6e\xb3\x44\x7c\xc7\x86\x6b\xd0\xcd\x33\x08\x41\xab\x39\x49\xc8\xbe\x1b\x7c\x4c\xe2\xeb\xff\xfe\xd2\x05\xdf\xfb\xf7\x73\x2f\xf8\xe6\x33\xd7\x3e\x9d\xd2\xd7\xac\x59\xb3\x7d\xcd\x9a\xed\x78\xbd\x1a\x8e\x93\xd4\xa3\x6a\x15\xc7\xe1\x7e\x59\x83\x28\x28\x32\xd1\xb0\xd9\x36\x12\x23\xe9\x48\xd8\x1f\x63\xf1\xe4\xf0\xbc\x18\xc2\x01\xbe\x3a\xcd\x2a\x55\xb1\x0f\xab\x76\x23\x55\x99\x61\xf3\x69\xda\x61\x39\x58\x6f\xd4\x08\x96\x13\x5c\x87\x2c\x37\x39\xc8\x41\x87\x65\x7c\x4f\xa0\x68\x55\x35\x55\xd3\x54\x91\x8b\x9c\x6a\x03\xea\x35\x5d\x45\x9a\xa1\x98\xa6\xae\x1a\x36\xca\xaa\xba\x06\x70\x8d\x5a\x3d\xb4\xdd\xd7\xe3\xb8\xec\xa9\xff\xe8\xb5\x45\x23\xff\x2f\x1b\x8d\x07\xcf\x6b\x98\x17\x9d\x8b\x9f\xff\x46\xcc\x73\x22\x79\xb3\x1e\xd7\x2b\x9a\xfa\x7a\x42\xa6\x61\x5e\xbf\x15\x57\xb4\xde\x7a\x41\x17\xaf\x8f\x63\x92\x42\xfd\x1e\xcc\x8a\xe6\xd1\x71\x1c\x3c\x0d\x8e\xc3\x99\x19\xed\xba\xb3\x71\x17\x15\xdc\x9b\x70\x6c\xf1\x64\x27\xcc\xa1\xb7\x74\x75\x3a\xd1\xbd\x22\xac\x07\xd3\x55\xc5\x49\x48\xa7\x0f\xcf\xdc\x4f\xd6\x9a\x79\xb4\x29\x03\x38\x51\xe7\x98\x37\x9d\x0c\x87\x2a\x10\xb4\x80\xa0\x49\x42\x5e\x92\xf3\x7e\x85\x60\x0f\x5b\x24\xb0\x51\xd1\xb2\xa0\x80\x8a\x44\x45\xe6\x0d\x4e\xf6\xb9\x80\x12\x09\x73\xf3\xe6\x66\x8d\xfa\xc5\x9b\xc7\x92\x65\xf4\xcc\xbf\x7e\x0a\x9e\xac\xe9\xba\x28\x49\x88\x35\x15\xb3\xa2\x88\x59\x93\x16\x8a\xa6\x22\xf9\x55\x49\x24\xf2\xa8\x50\x14\x24\x45\x54\xa4\x74\xf6\x76\xb8\x66\xe6\x6b\xe4\xcc\xdd\x00\xf7\x01\x53\x5b\x67\x65\x1e\x8d\xf9\x58\xbb\xfa\xeb\x64\x67\xcf\xbd\x38\x13\x95\xad\xe9\x74\x01\x8c\x6b\x8e\x45\xcf\xe1\xfa\xaf\x13\xb8\x86\x07\x8c\x2a\xdb\x07\xbc\x46\x25\xcf\xd9\x48\x9e\xdb\xfc\x2a\xf1\xca\x9b\xfb\x88\x97\x9a\x5f\x5b\x49\x2d\x7f\xf3\x4b\x16\xbc\x1a\x6d\x86\xbf\x86\x57\xdf\x0f\xaf\x3e\x7c\x9e\xe3\xa4\x9f\x77\x9c\x99\xd7\x20\x67\x41\x0e\x95\x1b\xbe\xd1\x40\xe5\x42\x40\xc8\xe8\x7b\x64\xb5\xc9\xa0\x1f\x50\xff\xe7\xcd\x55\x90\xfa\xf4\x9b\xab\xa9\x13\xce\x3f\x5f\x3b\xef\xba\xeb\xce\xf3\xd1\xa6\x8f\x4f\x07\x7f\xd0\xb6\xa6\x4a\xde\xdd\x54\x89\x3f\x2b\x8a\xae\x20\x03\x1a\x0a\xb2\x4d\xf8\x51\x13\x5e\x7e\xbb\x3f\x72\x3b\x00\x04\x70\x5b\x95\x8c\x4c\xf1\x20\x8f\xf3\xc5\xc3\x7a\x62\x20\x83\xeb\xc2\x83\xe8\x42\x20\x33\x06\xe6\xe7\xd2\x8b\x67\x0f\x53\x84\xe7\x70\x1c\xc9\xb5\x80\x03\x19\x58\xd0\x91\x8c\x4a\xa8\x80\x04\x09\x7a\x90\xad\xe9\x92\x62\x42\x4e\x53\x20\xdd\xd0\x7d\x31\x4f\xf1\xbc\xa9\xd9\x1c\xca\x3b\x45\xcb\xb2\xab\xa8\xa1\x79\x72\xa5\x58\x33\x74\x15\x9a\x02\xaa\x94\x2b\x50\xe7\x00\xc4\xb8\xa8\x51\x1c\xe6\x1c\x04\x8c\x82\x6e\xc9\x61\x22\xd3\x46\x9e\x49\x5c\x0b\x8f\x48\xd4\x39\x23\x12\x75\xce\x08\x5d\x46\xae\x56\x29\xd1\xa8\x90\xf6\x34\xa8\x31\xb2\x58\xd5\x8b\x6c\x4d\xd7\x59\x9e\x41\xaa\xd1\x6c\x64\xf3\x84\xa6\xf2\x86\xae\x69\x5a\x05\xd5\x24\x98\x77\x0d\x4b\x35\x0c\x91\x25\x39\xdf\x45\xb6\xd1\x20\x24\x42\xb1\xfd\x42\xb3\x51\xf1\xf2\x2e\xab\xdb\x84\x44\x88\xa8\x51\xd6\x68\x54\x51\x35\xdd\xd4\x55\x54\xd3\x1c\xb5\xa6\x29\xaa\xa4\x98\x76\x5b\x06\xbb\x94\x01\xde\x09\x86\x71\xc6\x59\x5c\x85\x2d\x95\xce\x1c\x0f\xf1\xfa\x66\x8f\x92\x54\x66\x2c\x37\x99\x9b\x1f\xc0\x0d\x8e\x0f\xa5\xc2\x58\x15\x58\xb7\x19\x0e\xd6\x6c\xd9\x85\x75\x58\x11\x11\x8b\xe8\x62\x19\x55\x45\xc8\x14\x34\x59\xd6\xb4\xba\x2d\x1b\x3a\x8f\xcc\x2c\x49\x3b\x90\x2d\x2b\x5e\xcd\xa1\x0c\xce\xb1\x1d\xde\xaf\x3b\xa5\x62\xd6\xcd\x96\x2a\xa8\x62\x3a\x3a\xa4\x0b\x50\x28\xb8\x3a\xb4\x39\xe4\x55\x6b\x50\xa3\x09\xda\x2f\x9a\x45\xcb\x35\x7c\x06\xaf\x71\x61\x46\xa7\xee\x06\xf3\xc0\x89\x61\x1e\x55\x26\x8c\x0a\x8f\x65\x5f\x20\x4f\xc6\xf0\xe5\xd0\x6c\xbc\xfe\xc8\x63\x15\xde\x02\x91\xe1\x55\x11\xf1\x6e\x4b\x87\x25\xdf\x21\x14\x07\x57\xc4\xb5\x91\xea\xf8\x2e\xff\xa4\x20\xa9\x0d\xdd\x61\x58\xd2\xb0\xeb\x55\x58\x12\x11\x40\x15\x64\xa3\xbc\x08\x5d\xc8\x15\xb2\x59\xda\x6d\x34\x4c\xf8\x3b\xd1\x83\x79\xdb\x34\x6d\x54\xb3\x50\x11\x0a\x06\xf9\xad\x65\x67\xfe\xdb\xff\x85\xc7\x8e\x5d\xb8\xec\xe1\x97\xef\xb9\x70\xd9\xe3\x17\xdd\x3a\xb5\x6c\xcb\x89\x9f\xba\x0a\x82\xa3\xb2\x0f\xff\xdb\x67\x77\xe1\xfc\x68\xdc\x9f\x0a\xcb\x93\x53\xdb\xb0\xa5\xd2\xa9\xce\xda\xda\x6d\xc1\xc2\x12\xe6\x5d\xfd\x0a\xda\x37\x1b\xc1\x7f\x44\x35\x58\xa0\x62\xb7\x00\x14\xa0\x2e\xa2\x3c\x32\x90\x8b\xb2\x2a\x74\x20\x67\xeb\xb2\xa2\x43\x59\x72\xab\x75\xc7\xa7\x91\x46\x58\x2e\x2e\x00\xa8\xfa\x76\xa0\x1c\xb9\x3e\x4d\xd4\x7d\x9b\x50\x7d\x8d\x32\x19\x81\xb7\x3c\x5d\xe2\x6c\x41\xd7\x65\x5b\x90\x25\x85\xe7\x34\x47\xd4\x24\xc9\xf4\x2d\xdb\xb6\x35\xdb\xb4\x6b\x35\xdb\xb4\xb5\xc8\xbe\x14\x42\x9b\x67\x2f\xee\x01\xb4\xf7\xb8\x84\xfe\x87\xed\xce\x60\x24\x47\x79\x4e\x14\x53\xa3\xb5\xf5\xbc\x5d\xb8\xef\xe4\x2e\x7c\xc7\x0f\x88\xa8\x7e\xb9\x06\x8e\xc1\x15\x39\x31\x36\xb5\x2b\x2d\x86\xe7\x45\xe0\xe6\x0d\x10\x57\xd8\xa0\x32\xb9\xf9\x60\x36\x69\x94\x0a\x86\x61\xd8\xa6\xc8\x19\x2c\xef\xea\x36\x27\x91\x72\x11\xb9\x50\x80\x65\x11\xd1\xc8\x45\x45\x24\x88\xd0\xb5\x14\xb6\x58\x81\xa2\x0d\xd5\x02\xa4\x4d\x4d\x33\x1c\x45\x35\x14\xa5\x0e\x39\x36\x50\xf5\x00\xaa\xd5\x8c\x30\x60\xb1\x60\x7b\x64\xdd\xe6\x50\xb5\x04\xf3\xd0\xc6\x71\x96\x3a\x5e\x97\x85\x33\x6f\xdf\x03\x26\xc0\x69\xe1\x19\xe1\xea\x95\xa9\x76\xfd\x2a\xbc\xb4\x13\x20\xee\x2b\x71\x2c\x7c\x8b\x13\x24\x05\xab\xe0\x41\x0b\xba\xb2\x62\xc1\x7c\xd1\x15\x44\xdf\xf5\x15\x16\xca\x44\x09\x0a\x90\xd6\x5b\x00\x15\x11\xad\xd6\x91\x23\x43\xa3\xec\x30\x3c\x29\x17\x5b\x00\xb2\xd0\xe3\xfc\x06\x72\x90\x83\x38\x09\xba\x30\xd8\xac\x6b\x40\xab\x60\x16\x6b\x0e\x65\x71\x75\x2d\xcf\x49\xa2\x58\x6a\x48\xb2\x24\xd2\x86\x85\x6a\x86\x6b\x78\xba\xa6\x97\x14\x53\x97\x58\x51\xb4\x2b\x8e\x41\xbb\x74\xc9\x15\x6d\xde\x30\x6c\x5d\xd6\xcb\x79\x4f\x33\x70\x81\x83\x34\xb0\x42\xdd\x3e\xca\x29\x1d\x07\xfc\x80\xac\xd2\x54\x1a\x67\x95\x06\x3b\x5c\x14\xd1\xcf\xc0\x1d\x42\x9e\xd0\x1d\xc2\xf5\x65\x92\xc3\x25\x35\x4c\xb2\x01\x05\x08\xf4\x06\x2a\xfb\x9e\x5a\x44\x45\x19\x0a\x50\x33\x79\x89\xe4\x0b\x0d\x98\x85\x65\x0e\x65\x91\x85\xdc\x60\x63\x36\xe4\x5c\xdd\xd6\x14\x68\x6b\x7a\xb1\x6a\xa7\xcb\xae\x6b\xbb\xb6\xed\x22\x4f\x77\x4c\x57\xd7\x75\x4f\xb5\x54\x5a\x92\x24\xbb\x68\x69\x79\x97\x2e\x3a\x82\xc3\x6b\xba\xa5\xf1\x46\x55\x37\x35\xcd\x8c\xfa\xd7\xcb\x94\x11\x75\x91\x1a\x0f\x39\x41\xe8\x90\x1e\xbc\xea\x49\x5c\x6b\x7b\x61\xbb\x54\xf9\x6c\xcc\x07\x38\x9b\x4b\xc9\x33\x8a\x9c\xd2\x7c\xc0\xf2\xa4\x64\xd6\x21\x80\xba\x80\x38\x54\x44\x65\x14\x18\x02\x30\x6f\x69\x86\xa9\x43\xc1\x45\x0d\x51\xd6\x20\xed\x90\x46\xd3\x08\x3e\xb6\xe1\x56\x4c\xca\x60\x34\xcb\xf0\x1d\x41\xb0\x5c\x4d\x64\x5d\xce\xd2\x24\x9b\x97\x15\x53\x11\x2d\xb3\x48\x64\x65\x51\xaf\x21\x57\x45\x05\x05\x01\x5d\x92\xf4\x98\x96\xb0\x0d\xbb\x17\xf7\x70\xda\x8b\xfb\x66\x45\x38\x68\x52\x42\x9c\x27\xba\x38\xec\x19\x43\xbd\xe5\xa6\x86\xa3\x96\x07\x71\x73\xac\x40\x91\x73\xa8\x42\xb3\x4c\x33\x84\xd7\x2c\xb2\x1c\x29\x58\x15\x28\x43\x91\xf5\xeb\x81\x7e\x86\x58\x11\x5a\x90\x71\x34\xcf\x50\x21\x5f\x46\x45\x58\x67\x68\x9f\x87\x7c\x8a\x9f\x29\xb5\x3f\x04\x57\x37\x7c\xd1\xa2\x04\x8b\xe3\x9a\x25\x8e\x35\x6d\x55\xcc\xda\x59\x4b\xe5\x1d\x96\x97\x55\x8d\x35\xb4\x02\xc9\x73\x1c\xf2\x34\xe4\xa9\xc8\xd3\x7c\x5d\xd4\x34\x90\x89\xf8\x81\x0d\x18\x30\x8a\x6b\x64\x9d\x07\x2e\xc2\x37\xf7\x11\x2e\x61\x55\x1f\x37\x5e\x19\xc9\x84\x1b\x98\x8b\x93\x73\x16\x66\x82\x7d\x50\xb3\x71\xc7\xaf\xc1\x7b\x25\x13\xe5\xe5\xc2\xd3\x2b\x6b\xf9\x3c\x51\x13\x05\x58\x74\xfc\x12\x5d\x2f\x73\x48\xd6\x14\xa9\xc4\x41\x5a\x41\xb4\xc3\x73\x2c\x54\x65\x92\x17\x79\x9f\x55\x1c\xe4\xa4\xed\xa6\xce\xb0\xa4\xae\x54\x21\x80\x32\x8b\xb2\xc8\x44\x06\xe2\xf2\x90\x85\x8c\xa5\xca\xa2\x0a\x69\x5c\x5c\xa2\xfd\x71\xbd\x5a\xd5\xa2\x6c\x89\xce\x6b\x3c\x8b\x2a\x1e\x9d\x67\x34\x85\xcb\xb3\x3a\xc3\xb9\x75\x3a\x6b\xc8\x16\xcb\x73\x33\xf5\x80\xc1\xb2\x8c\xae\x8a\x4c\xd6\xca\xca\x72\xde\xcc\xb2\x3c\xcf\xe5\x4d\x89\x90\xc3\xb2\x74\xc8\x94\x38\x4e\x0a\xfd\x27\x8b\x43\xbd\x75\xd5\xdf\x01\xa0\x97\xed\xfa\xc5\xdf\xbe\xb9\xb4\x3c\xfe\x2b\xdc\xf7\x56\x8b\xfa\xf9\xb5\xef\x5d\x58\x5c\x65\xec\x5c\x70\x1e\xb8\x16\x5c\x17\xe2\x41\x58\x6d\x3f\x38\xee\x89\xe1\xb9\xe9\x89\xe1\xf7\x10\x81\x46\x86\x2b\xad\x4d\xce\x4f\x8f\x4d\x0e\x8d\x0f\x4d\x06\x5a\xeb\xdc\x39\xed\x90\xb1\x91\x05\xa3\x13\xb3\xc3\xce\x93\xb8\xe3\x73\x98\x31\xfe\x16\x54\x3d\x4c\x59\x54\xad\x59\x65\x2b\x7e\xdd\xa5\xe9\x66\x99\xac\xa3\x06\x8e\x47\xce\xfa\xac\xe1\x38\x0e\xed\x7b\x79\xd9\x50\x48\x0f\x56\x91\xa3\x9b\x5c\xd6\xcc\x73\x6c\xc5\x13\x8d\x4a\xa5\x59\xd2\xab\xa8\xa4\x40\x91\x94\xa1\x5a\x97\xea\xc8\x43\x9c\xc1\x72\x44\xb5\x50\x83\x3c\x74\x58\xbf\x81\x4c\x54\x40\xb2\x08\x15\x48\x1b\x8a\x24\x2b\x50\x66\x4d\xb7\xea\xf8\x6a\x96\x12\x2c\x1c\x94\xca\xb0\xa8\x2e\x49\x05\x49\x52\x25\x89\x00\x05\xbd\xc6\x98\xba\x49\x13\x00\xe5\x69\x22\x8f\x54\x85\x67\x15\xd6\x66\x19\x5e\x82\x59\xd7\xaf\x8a\x05\x4d\xd7\x14\x59\xd7\x75\x85\x91\x38\xc6\xb4\x54\x29\x6b\x65\x2d\x95\xb3\x18\x41\x94\x38\x46\x73\x74\x95\x97\x94\x2c\xd6\xf5\xed\x30\x2f\x05\xbc\x03\x1c\x1d\x5b\xa4\xa7\x82\xa5\xe0\x0a\x70\x35\x00\x70\x6e\xd8\x82\x64\x3e\x95\x99\x3b\x3e\x77\xd1\x78\x9c\x83\x1d\x68\xf0\x23\x54\x1b\xf0\x5d\x7d\x0e\x32\xff\x7b\x98\x42\x03\xe6\x91\x5c\xb4\x34\xd3\xad\x91\x7c\x1d\xbb\x1b\x64\x48\xd7\xfd\xb3\x88\xab\xfe\x27\x7b\xe4\x0b\x28\xbb\x36\x73\x54\x75\x2f\x24\x91\xdf\xfe\xfc\xfe\xff\x3f\x30\x53\x97\xfc\xf5\x76\x72\x78\xec\x83\x9f\x38\x7b\xf8\x17\x37\xdf\x06\x89\xdb\x9b\xd6\xed\x33\xb0\x75\xd9\xe4\xfb\x7d\x91\x28\xbc\x7f\x12\x7d\xef\x66\xf4\xe5\x5b\xd1\x97\x6f\xfa\xf5\xff\x1e\x80\x47\x00\xb5\x95\xcd\x58\x94\x11\xdb\x0d\xe3\xe0\x5c\x20\x82\x8b\xc0\x65\xb8\x1e\x5b\x9b\xfb\xb6\x31\x34\x6a\xd8\x3e\xbc\x98\x9c\x18\x99\x3b\x7f\x62\xe4\x3d\xc4\xf8\x5b\xa1\xea\x91\x30\xc0\xd4\xc9\x3e\x4c\xed\x56\xdf\x26\x93\x40\x4d\xd3\xae\x48\x64\x9b\x05\xba\x82\xb2\x26\x9d\x6d\x56\x61\x25\xcf\xda\x02\x0b\x6d\x41\x6f\x34\x1a\x0d\x5f\xb0\x6c\xdb\xa4\x7d\x27\xaf\x9b\x12\x69\xc2\x02\x2a\xe9\x0e\x4b\x1b\xb4\x52\x73\x25\xa3\x50\x68\x7a\x7a\x09\xd5\x14\xc8\x92\x2a\x14\xab\x72\x19\x95\x90\xae\x29\x04\x23\x9b\x35\x68\x71\x48\x40\x1e\x2a\x21\x49\x84\x6a\x43\x95\x34\x5d\x81\xba\xa8\xd9\x96\x84\x58\xca\xe0\x0d\x4b\xf4\x15\xc2\x61\x19\x4b\xe4\x39\x49\x51\x10\x90\x24\x4f\x14\x55\x51\x24\x40\xc5\xf0\x18\x53\x33\x69\x58\x40\x0a\x4d\x64\x91\x24\x73\xac\xc8\x98\x22\x2f\x37\x0a\x7e\x59\x2c\xaa\x9a\xae\xcb\xba\x61\xc8\xb2\xa8\x18\xba\x2c\x64\x9d\xac\x6e\xf0\x2e\x23\xf2\x82\x28\x68\x45\x49\xe2\x05\x19\xd7\x50\x2b\xb5\x44\xaa\x48\xe9\xe0\x68\x00\x60\xa2\x5a\xce\xec\x00\x26\x73\x48\x22\x0d\xd2\x63\x00\x92\xa2\x28\x17\x8b\x86\x5b\xd6\x74\x09\xda\xae\x27\x91\xac\x59\x44\x55\x64\x23\x56\x4a\x09\x10\xa4\xaa\x86\xe2\x55\xcc\x72\x49\x11\x6d\x08\x08\xc0\x97\x6c\x01\x55\x91\x52\x43\x15\xb3\x00\x69\xb2\x1c\xea\x70\x71\x4d\xb4\x83\xf8\x4e\x33\xac\x89\x16\xc5\x09\x85\xf7\x7e\x78\x7c\xfa\x8f\xf1\x78\x3b\x77\x06\x8f\x1f\x58\x10\xe9\x76\x3a\xd6\x71\x39\x30\x17\x9c\x0c\x00\x1c\xa2\x73\xe3\x27\xcf\x9e\x4f\x8c\x2c\x20\xc8\xa1\xe1\xa1\xb0\x51\x54\x24\xcf\xe6\xce\xc9\x50\x61\x0d\xb5\x4e\xfd\xf5\xd9\xc3\x94\xcb\xb1\x34\x6d\xe7\x1d\xcd\xc8\xce\xb8\x25\xcd\xae\x91\x25\x94\x65\x18\x02\x58\x1a\x52\x51\x43\x20\x6c\x17\xc9\x82\xa1\xaa\xaa\x26\x88\x72\x43\x45\x65\x8a\xf3\xb3\x48\x45\x0a\x14\x59\xc4\x42\x85\xb0\x08\xc5\xf7\x7c\x05\x39\x26\x64\x08\x87\x70\x90\x6b\x1b\x8a\x2d\x36\x4a\xa8\x2a\xd9\x0e\x21\xa8\x92\xaa\xab\x92\xc4\x1b\x25\xac\xf7\x05\xfa\xa8\x40\x35\x28\x13\x1c\x0d\xb8\xb6\x94\x0a\x16\x06\x3b\x0b\x5b\xb8\x14\x8e\x47\xba\x69\xf8\x9b\x44\x17\xdf\x54\xd6\x11\x24\xc2\x46\xa5\x19\x47\x48\x65\x61\xde\x97\x03\x6b\x47\xd1\x55\x55\x85\x9a\x9d\xcd\x9a\x05\x8b\xe3\x09\x15\x39\x33\xac\x90\xb2\x20\xe7\x5b\xa6\xa4\x2a\xba\x6a\x68\x9a\x02\x2b\x94\xc9\x48\x82\x85\xf2\x8e\xa3\x42\x43\x10\x44\x4d\x96\x39\x46\x33\xb4\xac\xec\x73\x22\xcb\x5a\x7e\xb1\xe0\x98\xb0\xac\x30\xa2\xa4\x2b\x0a\xcf\x9a\x4e\xdb\x0f\x2f\x64\x0c\x4a\xcc\x8d\xae\xfb\x2d\xf6\x7f\x14\x13\xf7\x9f\xd8\x6f\x7f\xe0\x43\x78\xbc\x7d\xff\x74\x4b\x14\x17\x34\xf6\xd8\xa7\xfd\x37\x5a\xf5\x1c\xb5\xf1\x4d\xec\x37\x52\x5a\x4a\xa6\x40\x7d\x04\xc7\x5c\x1d\x0b\x16\xe3\xaa\x96\x61\x5d\xf1\x50\x13\xc7\x07\x44\x65\xda\x9b\x0d\xeb\xce\xcc\x8e\x2a\x25\x31\x89\xa8\xe4\xf1\xa1\x85\xc9\xde\xb1\xe9\x59\x8e\xe3\xdf\xb3\xea\x7d\xa7\xc2\xd7\x5e\x6d\xbe\x7e\x16\xf1\x62\x09\x71\xef\x5b\xb8\xe6\x93\x17\x7d\xf2\xac\xe5\x57\xc1\xcf\xa4\x9e\xb1\x2c\x4b\x77\x8a\x2a\x2a\x21\x4b\x30\x20\xaf\xe7\x6d\x46\x11\x91\x5a\x57\x6d\xc8\xfb\xba\x8d\x8a\x36\x0e\x66\xa6\x3e\xd2\x54\x49\x9b\x59\x2e\xae\x42\xef\x5c\xbb\x51\x85\x37\x31\xcc\xfd\x9a\x24\xb1\xcc\x0d\xcf\xce\xd6\x5d\xcd\xb1\xfc\x5b\x4c\x5b\x2d\xb3\x8c\x54\xe4\xea\x22\x2f\x2a\x84\x8b\xea\xaa\xee\x73\x92\x46\xd4\x11\x0d\x65\x7c\x97\x16\xf5\x9d\xd8\x77\x31\xb6\x43\x7e\x94\xb8\x33\xc1\x35\x6e\x76\xe1\x1a\x2e\xbb\x5e\xea\x8a\xa1\x0a\xc6\x5f\x0a\xec\x99\xdd\xb8\x16\x00\xf6\xb1\xe1\x7a\x5b\x09\xcf\xc9\xd9\xdd\x99\x58\x73\xb1\xea\x12\x85\x3d\x24\x7d\x26\x01\x60\xda\xc8\xb3\x28\x89\x3c\x81\xee\x33\xa4\x11\xc0\x86\x75\xdc\x6b\x1e\xca\x87\x59\xa8\x22\x40\xd8\xb0\x8e\x68\x84\xdb\xbb\xc0\x02\xe4\x6c\xc8\xc2\xbc\xdd\xac\x71\x3c\xd1\x40\xb5\x26\x27\x92\x22\xcc\xfa\x22\x9d\x95\x05\x55\x52\x64\x49\x81\x74\x11\x49\x36\x05\x74\x5d\xd7\x2d\x0d\x49\xd0\xd3\x34\x0d\x45\x71\xdb\x3a\x2a\x7a\x3c\x6f\x21\xa7\x60\x5b\x8d\x2c\xcd\x8b\xaa\x24\x0a\x8c\x61\x79\x05\x28\xe2\x3e\x7b\xa7\x60\xbe\x3e\x37\x51\x9d\xe4\x0c\xb0\x1c\x80\x45\xf8\xc8\xe7\xf7\x2c\xbc\xaf\x96\x6f\xaf\x87\x28\x42\x83\x30\xf7\x38\x10\x03\xc4\xbd\x92\x2c\x43\x07\x8a\xa6\x4e\xd0\xc8\x69\x1a\x2a\x99\x85\x92\x5f\xcb\xca\x0c\x63\x32\xc4\xd3\xe6\x55\x37\x2f\x18\x46\x8b\xfc\xbf\x2c\x80\xa7\xbe\x62\xde\x7c\x07\x91\x5a\xd2\x9c\x43\x91\x6f\xfa\x16\x5c\x8e\xbe\x04\xbf\x0f\x97\x9a\x70\x29\x3c\x7a\xed\xe1\x73\xd7\x92\xb7\x08\x0c\x49\x37\xaa\xa4\x94\x67\x1f\x66\xf2\xa6\x52\x14\x45\x03\x15\x34\x47\x2c\x67\x19\x96\x91\xb8\x74\xfe\x7a\xf3\xdc\xf7\x8e\x9f\x3b\x74\xc3\x05\xeb\xde\xbb\xe2\xdc\xf1\x25\xe8\x0f\x68\xed\x0d\x0f\x07\x7f\xd0\x37\xd0\x4b\x5f\xfd\x0f\x38\x9e\x7a\x87\x28\x99\x26\xcf\x01\x90\x05\x4e\x8b\x0b\xf8\x1e\x58\x00\x4e\x8c\xeb\xba\x06\x1a\x57\xc4\x07\x52\xe9\x79\xf3\xe3\xc2\xad\x61\x18\xe9\x70\x7c\x78\xa1\xeb\x2f\x3c\xf6\xde\x36\xf9\xe9\x8e\x10\x5b\x44\x72\x81\xb9\xce\xa0\x32\xb2\xd8\x3c\x49\x87\xad\x04\x39\x54\x47\x9e\x48\x66\xa1\xed\x3b\x4c\xde\x64\x38\xd3\x56\xa1\xd5\x02\x04\xef\xd7\x52\x25\xbf\x4e\xb0\x33\xc0\x86\x0e\x52\x08\x01\x5a\x4d\xae\xfd\x37\x9f\x15\xea\xc8\xe1\xa0\x48\x54\xa1\x54\x93\x2b\xa8\x40\xe9\x0c\xcb\x98\x9e\x24\x88\xa8\xe8\x79\x50\x50\x39\xc6\xe2\x3c\x96\x95\x04\x5e\xe0\x34\xbd\x69\x8b\xba\x2e\xfa\x55\x28\xca\xb2\x8c\x2a\x8a\xa2\xd4\x0c\x99\x33\x19\x99\x97\x0c\x49\x88\xef\x7b\x30\x7d\x78\x4f\x76\xd1\x87\xd2\x1e\xdf\xfb\xe7\x80\x0e\xc2\x71\xec\xd7\xc2\xb1\xe8\x20\xd7\xb9\xcb\xca\xc1\x0c\xf6\x71\x81\xd9\xc3\x1e\x51\xf3\x48\xda\xa7\x2b\x84\x26\xfb\x25\xd4\xf0\x7c\x51\x26\xb3\x9c\xcf\xa4\x1c\x58\x46\x9c\xe3\x67\x51\xdd\x83\x59\xa2\xe0\x17\x90\x69\xc3\x02\xa1\x02\x90\x02\x9f\x68\x5d\x92\x99\xa2\x4e\xc5\x7e\xd8\x77\x80\x05\xa1\xaf\x7d\x11\xe6\x43\x04\xf6\xaa\xb7\xef\x54\x72\xe9\xcc\x42\x32\x64\x4b\x70\x31\xf6\x99\xeb\xbb\x77\xa3\x51\x93\xd1\x4d\x1d\x3d\x47\xd2\x79\xda\xcd\xe6\x49\xc9\xcf\x56\x08\x4e\xf1\x8b\x0d\xcf\x57\x44\x42\xb6\x7d\x26\xb5\x7c\xea\x31\xbf\x9e\x4a\x31\xa8\xda\x10\x1b\xfe\x15\x97\x7e\x22\x7f\xe9\xf9\x1b\xd0\x93\xf7\x3e\xb7\x1d\xbe\x80\x8e\x5d\xf3\xd4\xe7\xe0\xbd\x20\xaa\x5d\x1a\xd0\x7f\x1e\xcb\xdd\xe1\xb9\xc3\x74\xf4\x5a\x80\x5f\x1b\x10\xfc\xf0\xe2\xa1\x61\x98\x4d\x57\x7d\x39\x4b\x32\xcd\x7a\x95\xd0\x34\xbf\x50\xb1\x7c\x59\x81\x26\xd4\x18\x9f\x26\x41\xd6\x57\xa9\xbc\x8d\x14\xce\xf6\x4b\x0d\x17\xe6\x61\x05\x65\x1b\x8e\x19\x58\x5d\xb6\x0a\x55\x2c\x77\xa2\x9c\x3b\x30\x07\xbc\x33\x82\xe4\x9c\xe0\x55\xa0\x03\xcb\x90\xd4\x1c\x92\x76\xb3\x64\xb6\x59\x87\x0a\x6c\xc8\x08\xa0\x62\xc9\xd7\x64\xa2\xa4\xfb\x59\x92\xb1\x0d\xcd\xb0\x53\x65\xe8\xa1\x22\xcf\xdb\xcd\x06\x2a\x79\x50\x26\x0a\xbe\x89\x54\x0b\x96\x09\xab\x59\x53\x0c\xd3\x52\x83\x7d\x29\x61\x4c\x0e\xee\x1c\xd1\xbe\x83\x0c\xb0\x17\xa4\x33\x0b\xa3\x17\xe2\x5b\x23\x40\xd8\x0e\x51\xf6\x39\x92\xf5\x19\x08\x08\x46\xf0\x0b\xa8\xee\xf9\x8a\x4c\xd8\x86\xcf\x90\xc0\x57\xd3\x1c\x14\x51\xc1\x46\x05\xc6\xf1\xeb\xae\xe3\x12\x32\xe2\x50\xd9\x82\x2c\x74\x9c\x60\x73\x44\xec\x57\x7f\x17\x18\x6e\xbf\x6d\x68\x3c\x3a\xbd\x91\xf6\xbb\x16\x4f\x0c\x1d\x07\x83\x4d\x0f\x41\x86\x90\x1c\xc2\xac\xfa\x4c\x89\xe0\x65\xdf\xae\xe5\x3d\xdf\x96\x09\xd6\xf6\x15\xa2\x42\xfb\x1e\x51\xa7\x61\x23\x7c\xab\x5f\xb0\x91\xe8\x78\x65\x82\x47\x2c\x2a\xdb\x90\x86\x8a\x2d\x49\x90\x0e\xcc\x06\xe8\x85\xf7\xa5\xf8\x5e\x17\xf7\xb3\x99\x9f\x4a\x87\x50\x0d\x30\x94\x8c\x5f\x7c\x06\xc4\xd7\xa6\x96\x82\x4a\xc8\xcc\x92\x52\xb3\x61\x13\x86\xe9\x7b\xc5\xa2\x6f\xa9\x84\x66\xfb\x59\x32\x4f\xa3\x32\x72\x39\xa2\x4c\xc9\xb6\xc4\xa2\xba\x20\x38\x28\x8b\xca\x2e\x14\x09\xd6\xaf\x22\xcf\x81\x32\xac\x38\x82\xd0\xc8\xd3\x4e\x78\x7f\xd9\x86\x6f\xbb\x8f\x43\xbc\xe1\x40\xcf\xc1\x82\x22\x00\xc2\x10\x4c\xec\x9b\x72\x1a\x3e\x5d\x22\x38\xd9\xf7\xea\x42\xa0\x71\xca\xc1\xcb\x41\x8d\x10\x1d\xbf\x00\x9d\x2c\x92\x09\x31\x0b\xcb\x69\xc1\xb7\x6c\x24\x39\x5e\x91\x60\x8b\x48\x33\x4d\x98\x85\x8a\x4d\x68\x90\x47\x25\xdf\x62\x19\x68\x21\x8d\x61\x61\xa5\x73\x37\x12\xd7\xfe\xa4\xa9\xa9\x7f\x8f\xfd\x74\x17\x27\xc6\x97\xdd\xff\xad\xa1\xf7\x0b\xff\xf7\xfc\xa5\x20\x84\x19\xce\x17\xed\xf4\xc8\x09\xd1\x63\x4e\x07\xf7\x3b\x67\x36\x4c\x65\xc6\x72\x04\xb0\x19\x16\x1a\x0e\x61\xf8\x06\x4d\x02\x3f\xdf\x20\x04\xd5\xb7\xca\x15\xdf\x92\x09\xd5\xf3\x05\x12\xd0\x88\x57\x0c\xbd\x46\xf1\x8c\xa9\x43\x05\x39\x76\x0b\x48\x92\x8d\xe4\x82\x03\x01\x4e\xfe\xac\x07\xa7\xa7\x06\xa7\x07\x2a\x96\x06\xe9\x01\x6b\xff\x5a\x74\x37\x6c\xb6\x3e\x99\x31\x70\xad\x46\xdc\xa7\x68\x76\xd4\xcf\x3e\xc6\xa8\x90\x21\x44\xf7\x0f\x75\xc2\xca\x67\xed\x3c\x49\xfb\x5e\x05\x96\x04\xbf\xde\x10\x3c\xdf\x51\x88\xbc\xe7\x3b\xf0\x36\x52\x68\x16\x51\x21\x5d\x39\xcc\xa6\x55\xdd\xa6\x4d\xdd\x46\x86\xee\xd8\x04\xf0\x1b\xa6\xa5\x43\xd3\xff\x8c\x8d\x64\x1b\xdf\xf9\xe2\xb8\x16\x90\x03\x79\xdc\xb1\x22\x78\x6b\x6e\x68\x9c\xce\xe0\x17\x47\xaf\x0c\x9b\xdc\x85\x57\x3e\xa9\xf9\x19\xa8\x91\x1e\xc7\x38\x59\x9e\x28\xf8\x74\xc5\x97\x65\x42\x29\x34\x6d\x58\xae\x15\xf5\x42\x45\xc5\x3f\x53\x22\x64\x6a\x5a\x20\xe3\x0d\xc8\x11\x9c\x5f\xa4\xab\x9e\x8d\xd8\xaa\x55\x81\x52\x2a\x6f\xb8\x46\x41\xaf\x19\xae\x59\xd0\x7d\xae\x5c\x30\xa1\xd5\x7f\xa6\x39\xea\x60\x3b\xbf\xee\x43\xad\x8b\x33\x87\xa8\x69\x7a\xe5\xde\x93\x9a\x08\xe4\x96\x9c\x23\x3c\x4b\x2f\xdf\x7b\x12\xd8\x05\xe6\x9d\xb6\x49\x78\x20\xba\x57\x0f\x7d\x7e\xb1\x3f\xa9\xa3\xad\xf4\xa4\x8f\x26\x98\xeb\xec\x76\xfe\x2e\x6e\x46\x37\x31\x9c\x31\xda\x77\x94\x96\xaf\xd1\x64\x56\x73\x79\x91\x91\x78\x89\xcb\xfa\x25\x97\x30\x65\xdf\x2c\x7b\xbe\x22\x10\x8e\xe6\x1b\x3c\x61\x04\x76\x66\xb3\x44\x56\x60\xdd\x57\x68\x44\xd3\xe9\x1a\xd6\x44\x38\x59\x44\x25\x93\x76\x68\x56\x41\x45\xc7\xf1\xa0\x8c\x54\xd5\x51\xa0\x0e\xcb\x8e\x6d\xa1\x8a\xe3\x20\x56\x94\x23\x7a\x0a\x6b\x35\x19\x98\x9e\xde\x9f\xac\x6c\x3c\x2f\x9d\x19\x1d\x9b\x3b\x1c\x35\xeb\x85\xc3\xa3\x63\xc3\x14\xec\xab\x73\x32\x7b\xd8\x25\x74\x81\x77\x58\x96\x54\x50\xb6\x0a\x75\xb9\xec\x35\xd5\x42\x4d\x84\x5a\x0d\x01\x58\x26\xf3\x86\x86\x2a\x9a\x5f\xa1\x84\x99\x1a\x47\x16\x58\xc7\x33\x1d\xa6\x60\x28\x52\xbe\xc9\x29\xc8\x48\x17\x65\x95\x93\x04\xbb\xa6\xbb\xb2\xa9\x2a\xba\x62\xda\xb5\x16\xd0\x2c\x1b\xa9\x96\x83\xd4\x4a\xd6\xc9\xaa\x65\xc8\xb7\x63\x17\xb8\x8c\x8b\x73\xf4\x17\x85\x95\xfa\x42\x02\xea\xc8\x8e\x08\x45\x03\x02\x5a\x3c\x31\x9c\x4e\x54\x71\x84\x79\xc2\xc1\x6e\x54\x9e\x14\x7c\xd9\x21\x24\xdd\x37\xdc\x7c\xc1\xb7\x15\x82\x71\x7d\x9d\x28\xf1\x59\x5f\x49\x03\x4b\xd7\x0d\xb3\xc9\xeb\x92\x2d\xea\x69\x1d\x82\x16\xb0\x91\x5e\xb4\x91\x53\xb2\x61\x16\x16\x10\x53\xb7\xab\x50\xb6\x4b\x0d\x5a\x57\xa4\xaa\xa1\xd9\x96\xe5\xc9\xae\x3d\x80\xa6\xbe\x1a\xf3\x83\x8f\x25\xf9\xc1\xee\xa7\xd0\x09\xc2\xd9\xe2\xfd\xb1\x4f\x3f\xf9\x9d\xaf\xc4\xdf\x61\x12\x78\x98\x99\x62\x5b\x8b\x5b\x75\x40\xe2\x77\x04\xba\xf1\x3c\x30\x12\x58\x51\x71\x64\xc2\x9c\x4c\xcc\x3d\x8e\x86\x78\xdb\x6d\xf5\x29\x97\x2c\x01\x9b\x2b\x10\x0d\x87\x04\x3e\xc8\xd7\x02\x61\xea\x94\xaa\xbe\x2b\x93\xa2\x9f\x85\xac\xcd\x72\x86\xa6\xaa\xaa\x62\x6a\xb5\x94\x65\x33\x9c\x6b\x69\x86\x29\x69\x5a\x29\x6d\x34\x1a\x36\x6a\xa8\xaa\x5f\xae\xbb\x90\x81\x65\xc4\xa3\x8a\x03\x6d\x42\x81\x59\x99\x35\x75\xcd\x34\x4d\xa5\x68\x6b\x90\x85\x3a\xab\x6b\xa6\x6b\x38\xba\x6d\x68\x30\x8b\x6b\x2b\x4e\xe2\xf3\x9a\x03\xf2\xe0\xdd\xb8\xfa\xeb\xd0\xf0\xdc\x39\xf3\x86\x99\xc9\x85\x93\x61\x68\x09\x33\x3a\x31\x94\x1e\x1e\x1a\x1e\xc7\x81\x14\x8b\x27\xe7\x77\xb8\x4d\x68\xb6\x52\x5f\x9c\xb9\xf3\x21\x68\xc3\xc5\x34\x3c\x92\x39\x2e\xff\xe4\x71\x53\xfe\xa7\xfd\xbf\x7e\x85\x58\x82\x54\x68\x3f\x11\x30\xb8\xe6\x47\x09\x57\xe0\x6c\x91\x54\xfd\x4a\x19\x5a\x0a\x12\x1a\xb5\x16\x40\x8c\x02\xed\x8a\x5f\x22\x47\xfd\x6f\xbe\xf0\xde\x05\xd9\xb7\x0d\x0d\x7f\xe9\xaa\x9f\x7e\xec\x82\xcf\x92\x8b\x57\xa1\xff\x82\xef\x21\x8f\x56\x54\xde\xb2\x51\x5d\x77\x3d\x68\x20\xab\x64\xba\x30\xdb\xe6\x01\xb8\x9e\xf9\xde\x1f\x05\x67\x72\xe8\x9c\x44\x7c\x1f\x8e\x99\xdb\x1e\xe6\x18\x7c\x19\xb4\xe5\x11\x8e\xef\x03\x0b\x70\xef\xec\x84\xff\x75\xbc\x4b\x8d\x0a\xc4\x52\xd8\x55\x69\x21\x89\xb1\xf3\x38\x48\x67\xe6\x0e\x0f\x11\x55\x87\x13\x88\x82\x24\x43\xab\xe4\x8b\x15\x82\x51\xfc\x62\xdd\xf2\x19\x99\xb0\x4c\x3f\x5f\x22\xb3\x8a\xe0\x1b\x4e\x51\x85\x2a\x03\xbd\x6c\x16\x09\x84\x92\x85\x05\xca\x60\x24\xd1\xb0\x35\xbf\x66\xa3\xb2\xea\x05\x2a\xac\xee\x59\x0e\xcc\xdb\x44\x5e\x37\x0c\x59\x77\x9b\xae\x20\xd0\x75\x54\xc9\x4a\xd0\x88\x70\xea\xb4\x00\xa7\xe8\x95\xde\xbd\xad\x73\x5a\xbf\x5c\xfa\xdc\xe9\xa5\x1c\xb5\x93\x8b\x7e\x27\x87\xf8\xb6\x13\x77\x11\x9f\xea\xc4\xff\x0a\x5d\xe3\x85\xc4\xfd\x7f\x07\x16\xcb\x1e\x61\xf9\x1f\x9f\x7a\xd1\x12\x2a\xaa\xa7\x19\xea\x24\x73\xa3\x1b\x83\x80\xa3\x84\x68\x1a\xb9\xed\x70\x7e\x58\x54\xed\x3d\xd1\x0e\xb0\xdd\x90\xbd\x4a\x94\xb2\xb8\xd0\x62\x36\x0b\x1d\x28\x6b\xc8\x41\x46\x11\xd1\x32\x21\xaa\xbe\xaa\x67\x38\x54\x96\x4c\x43\x65\x0c\x93\x3f\xec\x40\x9a\x64\x9a\x55\x6c\xc5\xa5\x0b\xd9\x42\xd1\xce\xd3\xaa\x69\xda\xaa\x2b\x59\x8a\x8b\x04\xdb\x17\x35\x99\x76\xf2\x22\xe1\x98\x88\xb7\x3c\xec\xfb\x57\xe2\xf5\x1d\x0d\xde\x0b\xb8\x90\x57\x27\x78\x5e\x84\x79\x93\x58\xc6\xa5\xfb\x56\x89\x15\xe5\x90\xa5\x78\x84\x2d\x08\x0e\xcb\x91\x3c\x02\x65\x68\x18\x48\xad\xd7\x51\x03\xe5\x25\xa8\x36\xfc\x3a\x2c\x06\x6b\x43\x4e\xba\xee\xcb\x8a\xa7\xca\x8c\xa6\x69\xbe\x0c\xf3\x66\xb1\xa4\xd7\x52\x6c\xb1\xa8\xbb\x95\xb4\x27\x6b\x9c\x24\xda\x05\xd7\xae\x41\x1a\x15\x0a\x96\x55\x45\x25\xbb\x64\x23\x56\x93\xf3\x0e\x23\xc2\xa2\x24\xa1\x86\xad\x15\x8a\x76\xd9\x28\x17\x43\xbd\x19\xd7\x8b\xc6\x77\x9b\xc3\x93\xd1\x5d\x4c\xf8\x09\xeb\x93\x50\x99\x64\xc9\x88\x76\x27\xa1\x76\x12\x5f\xf8\x81\x59\x42\x67\x1c\x86\xa8\x35\x1b\x3c\x99\x6f\xba\x42\x8a\x45\x9e\x09\x81\x81\xea\x8e\xaf\x28\x06\x2c\x38\xb0\x80\x44\x42\xf7\x4d\xc7\x37\x08\x03\x71\x86\xa5\xd4\x5c\x64\xc3\xba\x84\x24\xd8\xe0\x7d\x2f\x5d\x73\x68\xcb\x32\x2d\xdd\xf6\x1c\xab\x02\xb3\x86\x56\x28\x58\xb6\x8d\x4a\x90\xb7\x6d\x43\x95\x0d\xdb\xb5\x75\xcb\x8c\x68\x84\x8b\xee\xc3\xd8\x41\x77\x61\x8b\xc6\xc3\xab\x08\xbc\x01\xd8\xae\xaf\xd2\x73\x3d\x8b\xaf\x64\x05\xd8\xb0\x09\xc6\xaf\x12\xf6\x61\x89\x30\x50\x16\xe9\x0e\xa9\xd2\x3c\x49\xfb\x6c\x95\xa0\x65\xbf\xd0\x02\x35\xdf\x96\x88\x6c\xd9\xe7\x49\x89\xa1\x9b\x25\xa8\x11\x79\x5c\x29\x9a\xf0\x0e\xb3\x84\xe5\xd7\x28\x46\x96\x4d\xc5\x34\x15\xa7\x29\x98\x9a\x5d\x12\xdd\x40\xc1\xab\x5b\xb6\xea\xd9\x3c\x47\x28\xa2\x88\x03\x6c\x62\xfc\xc7\xf1\x91\x1b\x70\x0d\xce\x75\xed\xfc\x69\x09\xe3\xd0\xfa\xdc\xe8\x9e\x07\x01\xa0\x97\x7f\x71\x36\xfa\x13\x39\xef\x9c\xcf\x2e\xdd\x17\x7f\x27\xa0\x19\x5c\x1f\xf3\xfe\x6f\xc5\xb4\xa4\x77\xd1\xd2\xb3\x91\x2f\x4f\x0d\x63\x30\xc1\x18\x38\x2b\xc2\xc4\xf6\x71\x52\x89\x33\x4d\x87\xa7\xb7\x38\x06\x4c\xfb\x91\x04\x49\x05\x52\x6f\xb8\x42\x54\xe8\xac\x45\x13\x65\x1f\x70\x44\xa3\x59\x64\xd8\x14\x8d\x74\x0f\xe6\x25\xe4\x55\x7c\xaf\x8c\x3c\xb9\xee\x21\x8d\x60\x04\x06\xe5\x09\x9e\xc9\xfb\x32\xd4\x49\x05\x39\x34\xe1\xf9\x1c\x1d\xd0\x1c\xa7\xa1\x02\xb2\x3c\xc4\x8a\x44\xd6\xf2\x6d\xc2\xa6\x91\x9d\x6e\x08\x02\xad\x59\x86\x29\x08\x96\xa7\xd8\x26\x64\xea\x9e\x61\xda\x96\xc8\x9b\x82\xe0\xf3\xa6\x69\x31\x79\xdd\x36\x0a\xaa\xa7\x9a\x6a\xd9\x12\xc4\x04\xad\xd9\xd1\x5d\xef\x48\x78\x1f\xdf\xbe\x9e\xc2\x61\x86\x99\xb1\x85\x69\xcc\x16\xbb\xfa\xae\xc5\x7a\x27\xbe\xa1\x8e\x1c\x98\x84\x6c\x73\x44\x41\x10\x60\xc5\x99\x29\x38\x9a\x0e\x25\xc2\x12\x78\xbf\xc0\xca\x44\xcd\x51\x4c\xd9\x41\x15\x4b\x2b\xaa\x9e\x5f\x22\xea\xf9\xac\x43\x93\xac\x2f\x42\x06\x96\x64\x44\x23\x4f\x40\x0a\xf2\x54\x22\x5f\xf2\x65\xca\x66\x14\x53\x16\x7d\x9e\xe0\xfc\x12\xc1\x4b\x5a\x45\x11\x65\x41\xa9\x58\x8e\xe4\x58\x12\x5b\x37\x55\x13\xe9\x92\x4a\x2b\xa2\x5d\xd3\x5c\x07\x8a\x36\xaa\xf3\xb6\x04\xe9\xe4\xd9\xeb\xb9\xd1\x1d\x7f\xc4\xb9\x74\x75\x1c\xbd\xf9\x60\x74\xc6\x51\x7d\xb2\x75\x6f\x80\x06\xbd\xdc\x5d\xd1\xaa\x35\x99\xb3\x2e\x3c\xf7\xd9\xa4\xac\x7f\x02\xc7\x75\xef\xe4\x22\xf9\x11\xe5\x40\x81\x39\x80\x89\x79\x51\x4c\x0b\xc3\x6d\x56\xd4\x69\x73\x0c\x93\x45\x89\x46\xda\x75\x0a\x0a\x84\x22\xf0\x8e\x44\xaa\x88\xad\x41\x59\x46\x0a\xaa\xa3\x72\x0b\x20\x4e\x82\x72\x1d\xe5\xa1\x0e\x2d\x07\x9a\x48\x77\x90\x86\x54\xe8\xe0\x80\x0c\x1c\x8c\x61\x0b\xc8\x90\x21\xcf\x23\x2d\x5d\x90\x35\xde\xb2\x1b\xba\xe3\x41\x05\x79\x45\xd3\xae\x23\xa3\xd1\xb0\x1a\x0d\x54\xa8\x56\x6b\x35\x1b\xe5\x61\x0d\x95\x8b\x96\x5d\xea\x82\xc3\xae\x5a\x1b\x02\xa0\x23\x3f\xf5\xdc\x68\x20\x39\x69\x6a\xea\x99\x7f\x20\x4b\x0e\xf5\x3e\xbf\x0f\xe7\x53\x4c\x1d\x8c\xc6\x97\xb7\x2e\xcc\x3c\x45\x3d\x40\xaf\x5c\xb5\x1d\x00\x28\x2f\xdd\x71\xf2\xcb\xb9\x65\x53\x5f\x02\x3f\x13\xc0\xc4\xb7\x63\x78\x9a\xb9\xd1\x75\xf8\xfd\x53\x07\x7a\x63\xdb\x23\x39\xbd\xbf\x8b\x66\x8d\xdc\xe8\xd6\xdf\xf7\xac\xb7\x7b\x5d\xfb\xe2\xf1\x4b\x3a\xe3\x39\xca\x7c\xf9\x81\x30\x2f\xe4\x13\x2d\x31\xf3\x04\xb5\x38\x18\x9f\x79\x86\x5e\x3e\x45\x00\xbb\xf5\x06\xbf\x68\xf1\xc5\xb8\xfe\x30\xae\x33\x8d\xef\xc9\xcf\x06\x22\xae\x46\x91\x88\x54\x9d\x3b\x9c\xe4\x73\x23\x09\x46\x37\x14\x90\xee\xc4\xf0\xe8\x18\x9c\x18\x99\x93\x81\xc3\x13\xc3\x0b\x46\xcf\x80\x23\x98\x69\x1f\x07\xe7\xce\x19\x0f\x33\xbd\x88\xb2\xc8\x41\x85\xe7\x5c\x9e\x87\x0d\xdf\x83\x65\xdf\xce\xe6\x49\xc1\x57\xaa\xb0\x28\xf8\x55\xd4\x60\x8a\xbe\x2b\xc1\x72\xd9\x97\x49\x3a\x4f\xfb\x06\xac\x64\x7d\x17\x56\x59\x9e\x60\x8b\x59\xc4\xa7\x44\x54\x16\x85\x1a\xdf\x90\x0b\x3c\xaa\x93\x79\x16\x66\x67\x0a\x29\x71\xa6\x40\x19\x8a\xa6\x68\xbc\x2c\x98\x6a\xb3\xce\x73\xa6\xcb\xdb\x32\x64\x50\x4d\xb1\x04\xd7\xe4\x78\x92\xe6\x78\x53\x92\x90\xa6\xf2\x1c\xe2\x25\x41\xd0\x0b\xaa\x26\xaa\x32\xa3\xfb\x75\x39\xf6\xd9\x0a\x60\x41\x24\xf3\x4f\x0e\xb8\xfc\xec\x44\x94\x00\xde\xf1\x18\x66\x63\x4b\x61\x7b\xcb\x3d\xd7\xe9\x38\xe4\x2d\x80\x49\x91\x32\x9a\x15\x86\xf0\x7c\x33\xcf\x90\x3a\xe2\x3d\xc8\xcb\x48\xad\xa2\x42\x03\x49\x4a\xd9\xb6\x51\x9e\xb0\xb9\x40\x08\x00\xc6\x97\x20\x9b\x62\x67\x2a\xed\x0f\xc9\xd9\xb6\xaf\xd8\x0c\xf2\x64\x98\xa7\x04\x53\xf4\x19\x96\x35\x35\xde\x56\x2b\x15\xc3\xe4\x45\xc9\x64\x59\xa2\x2a\xa2\xaa\x84\xea\x12\xaa\x8b\xbe\x8d\x54\x68\x21\x47\xb2\x38\x90\xcc\x47\x0b\x71\x67\x3b\xec\xc2\x29\x3e\x37\xba\x07\x57\x56\x99\xf2\x62\x1c\xb9\x01\xe7\x45\x8c\x6d\x99\x07\xd2\xfe\x7c\xac\x4f\x55\x63\xdc\xb4\x62\xdc\x7c\x3a\x7e\xfe\x84\x8c\x4d\xdd\x91\x5b\xf9\xf0\x42\x00\x88\x7d\x02\x78\xff\x79\xb9\x65\x87\xce\x01\x2f\x0a\xe0\xd4\x77\x0e\xf8\xde\x53\x7d\x34\x82\x6b\x2d\xed\x4b\xc5\xe3\x4a\x17\xee\xee\x4d\xc4\xe8\xe3\xfc\x81\x6d\x5b\xf1\xf8\x1e\xd0\x93\x6f\x19\x8d\xef\xee\x9a\xdf\xc8\x8d\x3e\x55\xee\xcc\x8f\xe3\x73\x71\x3e\x7a\x94\x99\x18\xf6\x5e\x4f\x5a\x1d\xf3\xe6\x0f\x8d\x87\x95\x01\x32\xe3\x43\x58\xdb\x85\x91\x0d\xd2\x3e\x59\x38\xa0\x79\xbd\x41\xb2\x0e\x29\x34\x8b\x59\x4e\xf7\x18\xd4\x20\x1c\xd4\x60\x1a\x7e\xb5\x0a\x1d\xd9\xaf\xb6\x80\xeb\x17\x64\xa2\xd6\xac\xa4\x1a\xed\x7a\xd9\x33\x1c\xe1\xa0\x1a\xd3\xf0\x4b\x1e\xd3\x28\xb4\x47\xb1\xb1\x8b\xb2\x1c\xe3\x39\x04\xaf\x1b\x86\xee\xbb\xa8\x62\x3b\x15\x02\x20\x11\x55\x2c\xa8\x13\x0c\x6c\xf8\x05\x15\xb9\x1a\xa1\x04\xbf\x25\x64\x1d\x39\xc1\x3f\x13\xb9\x52\x01\xff\x78\x1d\xc3\x62\x57\x02\x76\xc1\xf8\x8a\x75\xaf\x83\xcb\x05\x70\xba\x97\xa3\x1e\xfa\x7a\x17\x9c\xc4\xdc\xe8\xfe\x89\x80\xf7\x47\x1c\x6b\x67\xc2\x96\x8b\xcf\x6e\x6d\xad\x37\xb7\xe5\x71\x0c\xdb\x6d\xad\x58\xee\xe3\xfb\x0f\x1c\x03\x98\xec\x27\x44\xa6\xd2\x99\xd1\x30\x74\x72\xe1\xa2\xdc\xec\xe3\x20\x91\x99\x37\x3f\x37\x5b\x25\x14\x49\x70\x05\x21\x95\x47\x96\x5a\x85\x22\x64\xb4\x1a\xd2\x90\x87\xf2\x32\xac\x42\x1a\x35\x50\xc9\xd2\xfd\x2a\x51\xd5\xf4\x46\xb5\x2e\xa5\xea\xa5\x22\x5d\x76\x6d\xbf\x8e\x1a\x6e\xc1\x29\x94\x51\x55\x75\xd4\xb2\x61\xc1\x3c\xcc\xa3\x6a\x49\xd5\x20\x80\xc5\x2e\x1d\xe7\x20\xce\x43\x38\xd8\xae\x81\xc4\xb4\x96\x64\x36\x53\x9f\xce\x8d\x1e\x38\x76\xd6\xdf\x72\xd4\x74\xbd\x30\x13\xf3\xcb\xb0\x67\x01\xce\x30\xdf\x77\x42\x82\x8f\x86\x35\xe5\xcf\xc3\xf3\x3c\xdc\x3b\x7e\xf0\x41\x3c\xfe\x50\x17\xdf\x0d\xc6\xc3\x5a\x9e\x66\x62\xdc\x6d\xcf\x9f\xa3\xd6\xbf\xbd\xef\xf9\x87\x31\xff\x5e\xdb\x37\x7f\x38\xbe\xa6\xef\x79\x9c\x9b\xb4\x77\x56\x62\x5c\xea\xac\x3f\xee\xc1\xa3\xb6\xf3\xf7\xf6\x84\x79\xbd\x6e\x1c\x1b\x1d\xcd\x73\xe8\xa6\xbe\xf7\x2a\x9d\xf7\x1e\xb8\x3f\x31\x2e\xe2\xba\x89\x58\x33\x98\xfe\x43\x62\xbc\xd0\x81\x73\xdc\xeb\x48\x6e\xf7\x97\x71\x71\x06\xcc\xfa\x77\xf4\xed\x2b\x5c\xe7\x37\x41\x27\x6f\x04\xcb\xb1\x28\x6f\xe4\x81\xc4\xf3\xf8\x6e\x79\xed\xeb\x7d\x70\xd6\x3b\xeb\xdc\xbb\xa4\x17\x3e\x7b\x3e\x87\x7d\x5d\x49\xf8\x9b\x1d\xb8\xed\xfb\x48\x2f\x7c\x9e\xba\xad\xeb\x79\x05\xaf\xc7\x0c\x9e\x6f\xd0\x39\x6a\xcf\x95\x7d\xf0\xc7\xeb\xdf\xff\xb3\xde\x79\xc2\xf1\x1d\x9f\xe9\x3b\x77\xfc\xde\x03\x8f\x24\xc6\xad\xce\xf8\xc6\x36\xbe\x69\x9d\x73\xcf\x82\x1c\xb5\xef\xcf\xf5\xde\x73\xc1\xcf\x3f\x89\xfa\xe6\xc7\x70\xd8\x5d\xe8\x82\xb3\x11\x3e\x9f\xa3\xb6\x5f\x9f\xed\x8c\x6b\x1d\x3c\xdc\x5b\xec\x9d\xe7\xc0\x5d\x7d\x78\x1e\xe6\x51\xe2\xf7\xee\x50\x12\x71\x9b\x6e\x67\xbf\x5b\x7e\x36\x18\x3e\xd3\x7d\xf4\xb2\xff\xbf\x30\x9c\xef\xeb\xc2\x13\xb5\x8d\x27\x53\xed\x7c\xac\x4b\x5b\x4b\x22\x78\x4e\xbe\x31\x93\xa3\x0e\x5d\x00\x7a\xf2\x0b\xf7\xac\xed\xc9\x23\xea\xc2\xab\xfd\xdf\xee\x9a\x3f\xee\x1d\xe5\x26\xf1\x16\xc3\xe1\xc0\x6b\xff\x80\xae\xf1\x7e\xb7\xbc\x3a\x98\xee\x9e\xbe\x72\xf0\xf9\xee\x7f\xb5\x0f\xdf\xc2\xf5\x7c\x29\x01\xb7\x30\x26\xe2\x58\xfc\xde\x63\xfa\xe6\xc7\xf8\xbf\xfd\xd5\x5e\xbc\xda\x7f\x74\x1f\x3f\x09\xcf\x17\x9f\xfb\xbe\x5b\x07\xe3\x61\xdc\x83\xaa\x67\xfd\x07\x4f\xed\xa5\xaf\xe8\xbc\x7e\x37\x18\x3f\xe3\xde\x2b\x6a\xdc\x4b\x63\xb2\xab\x97\x46\xe7\xf9\x70\x9e\xdf\xf7\xcd\x8f\xe7\x79\xa2\x18\x9f\xaf\x90\xf9\x6a\x38\xcf\x1b\x20\x47\x1d\x3a\x75\x61\x2f\x1f\x0b\xd7\x79\xf1\xe0\x7d\xed\x7e\xa9\xf7\x1c\x0f\xe2\x9e\xca\x07\xba\xe1\x63\xe6\x46\xd7\xe2\xbe\x54\x5b\xff\x67\xf0\xf9\x4e\xf7\x8f\xe3\xf9\x0f\xbc\xab\x6f\x5f\x0f\xe3\x1c\xdb\x47\x07\xcd\x93\xeb\xf4\x26\xe9\xe2\xf3\x34\x35\xfd\x46\xef\xfa\xa7\x7f\xdb\x39\x47\x5c\xe7\x2d\xbc\xf7\x39\x05\xeb\x21\x67\x75\xe5\x50\xe0\x1e\xa8\xb1\x3d\x3c\x8a\x83\x98\x4e\x80\x1d\x8b\x39\x51\x28\x73\xee\xf0\x04\xfe\x64\xd2\x8b\x27\x0b\x44\x15\x37\x8d\x22\x8c\x62\xb1\x59\x09\xb4\x63\x4e\x32\x20\x03\x81\x52\x45\x16\xaa\xfa\x96\x04\xcb\x90\x09\x14\x5e\x94\x27\x44\x26\x8f\x78\xc2\x68\x56\x49\xc6\x37\x08\xc3\x67\x48\x03\x56\x11\x03\xab\xcd\xaa\x0a\x3d\x4b\xa6\xb2\x9a\x66\xeb\x0d\xab\xa1\xd9\x8e\x2a\x8a\x96\xac\xd8\x9c\x9d\x55\x55\x55\xb1\x79\xde\xd4\x2c\xcd\xd4\x5b\x40\xd3\x82\x0f\x02\x86\x22\x9b\x49\x99\x70\x00\xd7\xfc\x8f\x69\x3d\xe4\xd9\x31\xce\xee\x59\xde\x2b\x2b\xa6\x7f\x13\x8c\xbb\x7f\xe8\x1a\x37\x72\xa3\xab\xaf\xe9\xa3\xdd\x98\xb7\xd1\xd4\x74\xad\x0b\xd7\x8c\x36\x2e\x1c\x9a\x1c\x84\xfb\x39\x6a\xfd\x33\xbd\xe3\x5b\x7e\x39\x80\xb6\x82\xf5\x7c\x0f\xf3\xaa\xc9\x3e\x5d\xe0\x1b\x7d\x3c\x23\x41\x5b\xfb\x5f\xe9\xc5\xc1\xad\xd8\xcf\x32\xb5\xbd\x97\x77\xee\xc7\x31\x25\x5d\xf3\x63\x99\xb6\x7f\xcd\xe0\xf1\x68\xbf\xaf\x77\xe1\x66\x0c\xcf\xc7\xff\xde\x8b\xb3\x1b\xef\xee\x83\xbf\xd7\xa1\x95\x3d\xff\xdd\x3b\xbe\xe3\x63\x03\x78\xbf\x9e\x1b\xf5\x8e\xec\x5b\x4f\x02\xc7\x0f\x3c\x33\x98\xb6\xf6\xbd\xa3\x8f\x86\xf0\x7b\xd7\x66\xfa\x9e\x5f\xdc\x37\x7f\xa8\x0b\xbc\xd4\x45\xbb\x61\xcd\x9d\x4f\xe6\x56\xee\x36\x01\x20\xbf\x2d\x80\x0f\x9e\x9e\x0b\x7e\x4b\xf7\xd3\xef\xc1\xd7\xfa\xd6\x8a\xdf\xbd\x9f\x1d\xbc\xd6\x9d\x47\xf4\xda\xcd\xf8\xf9\xd1\x5d\x4f\xe0\xa8\x86\x27\x7b\x74\x1d\xfc\x8e\x9d\x5b\x7a\x75\xa6\x03\x77\x0e\xde\xc7\xe6\x3b\xfb\x78\x50\x82\x97\xed\xbc\x7c\xf0\x9a\x56\xcf\xef\x5d\x93\xbb\xb2\x0f\x1f\xc3\x1e\x1a\x78\x6f\x71\x0f\x8d\xde\xbd\xdd\x9d\x18\xbf\x95\xba\x25\xa2\x83\xb1\x03\xaf\x92\xc7\xb7\x66\xe8\xcc\x81\x57\xc8\xe3\x7b\xf6\x1e\xea\xc0\x3b\x07\xf3\xc6\x5d\xff\x39\x58\x46\xec\xbe\xbe\x77\xbd\x4f\xe0\x6e\x39\x53\xdb\x30\xaf\x4b\x63\x1f\x83\x89\x7b\x8d\x1e\x03\x16\x83\x33\xc0\x85\x91\xdf\x6c\x4e\xfb\x2e\x27\x8d\x73\x39\x16\x4f\x8e\x4c\x0c\xcf\xc6\xee\x33\x38\x8e\xbd\x46\x23\x54\x26\xdd\xf5\xfb\xd0\xb9\x36\x0f\x26\x72\x76\x02\x23\x8c\x00\x8e\x00\x2d\x53\xd2\x34\x45\x75\xcb\xa8\xc6\x56\x4d\xc3\x96\xc5\x06\x94\x0a\x26\x8f\x2a\xbc\x80\x5e\x9e\x39\xe5\x9e\x13\x89\xf9\x7b\xd8\x4f\xc0\x73\x2f\xbe\xe7\xa7\xdb\xd0\x6b\x67\x57\x1f\xbc\xe9\xb1\x25\x27\x3e\x07\x5f\xd2\x86\xd1\xaf\x87\x4f\xd4\x88\x87\x89\x3a\xaa\x40\x19\xb9\x36\x72\xa0\x82\xca\x94\x41\xeb\x26\x5d\x17\x79\xce\x14\x44\x93\x31\xf3\x12\x27\x68\xba\x8d\x34\xcd\x54\x44\x7f\xf3\x1a\xfa\xbe\xb5\xde\x7d\x3b\xd6\x7e\xea\x33\x8f\x2e\x59\x75\xf2\x65\xa7\x2d\xf9\xdc\x67\x67\x1e\xfd\xec\xc7\xce\x79\x6f\xfa\x18\xcb\x2f\xd8\x4d\x87\x54\x6c\x42\xec\xc6\x9f\xfb\x07\xf0\x1b\xbb\x7d\x8e\xbb\x8f\xee\xd2\x15\x8c\xdc\xe8\x81\x77\x62\xd9\x79\xe6\x60\x99\xba\x63\xf9\xe0\x73\xdf\xb1\xac\x6b\x9e\x40\x87\xc3\xf5\x5a\x76\xfe\xe7\x60\x3a\xde\xf5\xf6\x3e\x9d\xfe\x3e\x9c\xf3\xfe\xcd\x2e\x7c\x33\x73\xa3\x3b\x2f\xea\xd3\xad\xc3\xba\x0b\x87\xfa\xf8\x4d\x02\x6f\xe2\x7e\x24\x3d\xb6\xca\xee\xf7\x74\x3d\xaf\xe6\x46\x77\xb3\x38\x6f\x7f\xac\x4d\x35\xd1\x1e\xca\xd8\x27\xf0\x50\x1f\x2c\xc2\x3a\x4f\x21\xcf\xff\xf1\x3f\xc0\xcd\x0b\x06\xaf\x69\x67\xb3\x8f\x97\x86\xb0\x68\xf5\x3d\x8f\xe7\x77\x99\x3e\x3b\x09\xcf\x7f\xe8\x84\x3e\x7d\x04\x8f\xef\x7a\xb1\x0b\x46\x66\xcc\x33\xb7\xf4\xc9\x8e\x70\xfe\xe9\xc1\xf6\x93\xfb\x9b\xc4\x59\x62\x5f\xc7\xce\x37\xba\xe0\x10\xd7\x48\x59\xfb\x6b\x4c\x73\x5b\xfb\x64\x07\xd6\xf7\x77\x3e\x3b\x18\x0e\x87\x72\x11\x8d\x46\xeb\xc1\x19\x3e\xc3\xe0\x74\x5c\xb5\x69\xbc\x5d\x25\x1e\x0e\x8d\x0c\x81\xc8\xbd\xd7\xdd\x4b\xb0\x6d\xe7\x27\x63\xd8\x17\x8e\x2d\x9e\xc4\xe9\x24\x54\x66\x1e\xe9\xb9\x44\xcd\xf7\x1a\x50\x95\x90\x86\x6a\x2e\xaa\x21\x5d\x85\x72\xdd\xaf\x10\x35\x42\x37\x35\x47\x73\x9a\x8c\x21\xd9\xa2\xd1\x20\x4c\x81\x77\x39\x8e\xac\x23\x57\x29\xc2\x3c\x14\x74\x64\xa3\x32\x72\xfd\xb2\x04\xab\x30\x8b\x6a\x35\x4b\xf3\x6b\x64\xbd\x22\xfb\x45\x49\x2a\x53\x3a\x32\xed\x8a\xe2\x58\x90\xc1\xe5\x6b\xab\x8e\xa5\x56\x6c\xa8\xcb\xb6\xac\x2b\x9a\x66\xc8\x86\xd6\xcc\xcb\x32\x23\x09\x66\xd1\x14\x15\x43\x97\x2c\xde\xe4\x24\x91\xd3\x75\x54\xd3\x5c\x55\x62\x07\xe9\xeb\xbb\x88\xc1\xf2\x63\xdf\xf9\x83\x79\xf8\x2e\xd8\x7b\x6e\xbb\xba\x75\x99\x5e\xda\x7c\x65\xb0\x9d\xb0\xf3\xc9\x2e\x1a\x89\xf5\xec\x1d\x6f\x1b\x7c\x6e\xde\x29\xb1\x3e\x1d\xd1\xc7\x13\x67\x06\xfa\xf4\xce\x87\xba\x68\x5f\xcf\x8d\x06\x54\x9f\xa3\x56\xdf\x9d\x18\x0f\x79\x34\xee\x83\xb6\x9a\x1e\x6c\x37\xee\x3f\xbb\xf7\xbd\xa1\x2e\xb3\x7a\xa4\x97\xf6\x77\x3c\x88\x79\xc2\xc3\xbd\xbc\xcb\x3b\xbf\x8f\x5e\x63\xbf\x4c\x8e\x3a\xf0\xde\xc1\x76\xe3\xd6\xa9\x7f\x60\x57\xfc\x77\xaf\x1d\xe2\x5c\x36\x60\xfe\x80\x67\x3e\xd6\x23\x8b\xa3\xe7\xb7\xdf\xfc\x56\xbc\x74\xed\xaf\x06\xaf\x67\xdd\xa7\x12\xf3\x24\x6a\xb4\x6d\x3c\xa3\x3d\x5b\x12\x46\xeb\x68\x0c\x8b\x87\x06\x9f\xf1\x8e\xdb\x12\xe3\x62\x42\x6f\xfc\xe9\x20\xfe\x4b\x53\xd3\xbf\x1e\x74\xf6\x39\xea\xa9\xd1\xae\xe7\xcd\xf6\x99\xad\x59\xd7\x77\x96\xf8\xbd\xdb\x1f\x8b\xc6\xdb\xbd\x7f\x57\x4c\x1d\x04\x27\x09\xe0\xcc\xe3\x73\x94\xf7\xae\xc1\x3a\xe2\x74\x1b\x1e\x2b\x5b\x1f\xc8\xd8\xd4\xe7\xe9\x15\x07\x27\xd3\xe9\xd3\x7f\xba\xf4\xc5\x1c\xb5\xf1\xf9\x5e\x58\x6d\xff\x52\x9f\x7e\xe2\x74\xd6\xbb\xff\xeb\x89\xf1\x62\x87\x67\xef\xfd\x44\x34\x7e\x75\x6b\x79\xc4\x23\x27\xff\x46\xe7\x96\xed\x79\x93\x26\x05\x70\x16\x13\xc3\x7d\x27\x65\xd0\x2b\xdc\x97\xcf\x06\x67\xbc\x22\x80\x5c\xe7\x0c\xef\x0f\x63\x54\xe8\x15\x07\xef\x5b\x30\xfb\xcc\x9b\x97\x8a\x39\xea\xc0\xae\x46\xcf\x1a\xa2\x1e\x48\xe6\x60\xf9\x30\xfd\x5f\x83\x75\xf9\xa9\x24\x9f\xde\x4b\x19\xf4\xca\x35\xf3\xe0\x3c\x00\x26\x69\x01\x6b\x87\xcf\x27\x7d\x19\x6a\x5c\x13\x2b\xf4\x6d\x51\x7d\xb2\x02\xef\x77\xc3\xac\xc4\xf3\xd8\x5e\xd9\x83\xef\xdc\x0e\x7e\xb3\x07\x97\xd4\xf8\x3b\xa3\x7b\xbe\x86\x57\xb3\x39\x61\x3f\xc4\xb4\xbb\x76\x7b\xd7\xb9\xf2\xb9\xd1\xe0\x34\x69\x6a\x6a\x53\x9f\xcd\xce\xf4\xe1\xbe\x97\x80\xc1\x2f\x7b\x69\x77\xed\x7f\x61\x1d\x58\xe9\x59\x97\xd9\xd1\x0d\x0e\x3d\x5b\x19\xa0\x4b\xe4\xa8\xed\x73\x06\xcb\xc3\x6d\xc6\x3f\xd0\x31\xae\xeb\xe5\x4b\xd3\xbf\xe8\xac\x15\xf7\xb6\xe5\x71\x5c\x26\x0d\xe6\x81\x77\x82\xf7\x83\xf3\xc1\x25\x38\xc2\x76\xa4\x3b\x8e\x61\x08\xe7\x10\x8c\x4f\x8c\xc0\x7f\xd4\x9d\xaa\x23\xa9\xba\x04\xd5\x71\x30\x4c\xed\x26\xcf\x4f\x89\xb6\xa4\x19\x1a\x63\xe8\x7c\xb3\x4e\xa8\xc8\xb0\xac\x7a\x1d\x7d\xaf\xb7\x41\x95\x44\xb0\x3c\x6b\x33\x6c\x4a\x46\xbc\x60\x11\x8c\x8e\x8a\xa8\x8e\x4a\xbe\x27\xc0\x32\xcc\xa2\x6a\x4d\x95\x91\x48\x68\x3c\x5f\x6d\xb8\x22\xf5\x3e\xcb\xb7\x55\x29\x6f\xe6\x65\x42\xd0\x91\x22\xc3\x06\xaa\xd9\xf0\xd0\xbd\xe8\xf7\x8f\xdc\x7b\xef\xed\xf9\x47\xf2\x93\x4b\x6f\xfb\x1c\x3c\xb9\xf9\x81\x94\x30\x63\x8b\x22\x23\x70\x96\xa3\x99\xa6\x2a\x9a\x9c\xc9\x8a\x12\x27\xcb\x22\xcf\xf2\x92\xd5\x7d\x3e\x5b\x96\x04\xe7\xf3\xc4\x97\x63\x48\x65\x81\x1e\xd6\x90\x8c\xe3\xd1\xc3\x1c\x4a\x09\xfb\x15\x86\x27\x46\x26\xc6\xa3\x5c\x77\xec\x5b\x88\x6f\xee\xfa\xc4\x76\x3b\x4e\x21\x8e\x4b\x27\xe6\x76\xfe\x89\x45\x7a\x99\xa8\xf9\xba\xeb\x12\xa6\x43\x98\xae\xeb\xeb\x44\xa1\x69\xb3\x5c\x8a\x43\xae\xe4\xc1\x3c\xe4\x75\x64\xa2\x22\x72\xfd\x92\x00\x1d\xc8\xa0\x4a\x5d\x53\x90\x0d\x1b\x3c\xe7\xd7\x20\x80\x35\x94\x27\x4c\x58\x9b\xb1\x82\xbf\xa5\x34\x94\x87\xb5\x19\x96\x90\x7c\x8f\xa8\x13\x8c\x5f\x2d\xc8\xbe\xca\x72\xa4\xa5\x95\xb5\x8a\xaa\x56\xb4\xb2\x86\x0c\x9e\x33\x35\x85\x97\x0c\x55\x50\x45\x83\x13\x78\x56\x14\x4d\x8e\x27\x39\x59\x96\x51\x4d\x92\x10\x6d\x18\x86\xaf\x89\x32\xcb\x74\xfb\x1a\x42\xbc\x3b\xd0\xa7\x87\x61\x5a\xdc\xf6\xb3\x3e\x1d\x16\x3f\xbf\xe9\xa5\x41\x7c\x22\x47\x6d\x7b\x3f\x9d\xa4\xb5\xe0\xf9\xe3\x71\x2d\xb5\x90\xe2\x9c\x7e\x1a\xa1\xa9\xe9\x2f\x0c\xd6\xf5\xa6\xab\xbd\x3a\xdd\x96\x5e\x3d\x9f\x0f\x6b\xac\x85\x74\xbe\x7e\x7b\x62\x9e\x0a\x75\x57\x7b\x4d\x4f\x3d\x22\xce\xea\x9e\x27\xe2\x0b\x77\x0d\xd6\x3d\x36\xfc\x22\xe6\xe9\x42\x58\x4b\xed\xe0\x24\x04\x4b\x8f\x0e\x78\xea\x36\x27\xf1\x9d\x4d\xf1\x77\x96\xaf\xbb\x02\x7c\xbb\xf5\xa7\x53\x6f\x11\x1e\xee\xb7\x83\x1f\x7f\xa3\x17\xb6\xfb\x3f\xd3\xc7\x6b\x13\xb2\xf4\xc0\x9c\x5e\xf9\x74\xe0\x2b\x7d\xf6\xf1\xdd\x01\xaf\xdd\xfa\x07\x70\x2f\x00\xa7\xfd\x8f\x10\x59\x1b\xfd\xfa\xcf\xba\x6f\x0c\x96\x5b\xdb\xde\x3b\x58\x4f\xdb\xfa\xf2\x60\xbd\x6e\xfa\xe7\x5d\x72\xce\x0c\x60\x92\x4d\x2f\x79\x47\x20\xe7\x76\xf5\xc5\x8d\x45\xfc\xf2\xb5\xc1\xe7\xba\xed\x85\xae\xfd\x09\xb1\xce\xc4\x74\xf1\xb8\x00\x4e\x85\x3e\x7e\x9c\xf0\x93\x6c\xbb\xb1\x8f\x87\xe2\xf1\xed\xa7\x75\xe9\x15\x1d\x1c\xff\x8f\x3e\xde\x8a\xf1\x63\xed\xf9\x7d\x78\x80\xfd\x45\x87\x3e\xd5\x65\xd7\xc5\xbc\x7b\xed\x82\x5e\xf9\x34\xfd\xea\x3f\x58\x27\x7e\xef\xd6\x3e\xb9\x71\x70\x61\xdf\xf3\x49\xfc\xeb\xf8\x15\x3e\x90\x29\x86\x3a\x05\x95\x3e\x7d\x45\x00\xeb\x6d\xf9\xde\xb9\x56\xd7\x7b\xec\x9c\xe8\xdc\xb0\x5d\x34\xba\x17\x77\x40\xdf\x3b\xb7\x5f\x76\xe7\xa8\xe9\x8b\x06\xaf\x77\xdd\x27\x07\xeb\x96\x9b\x3b\x3a\xf6\x31\x99\x7b\x62\x5f\xfc\xf2\x6d\x9f\x83\xef\x6b\xbd\x3c\xf1\x5b\xa1\x18\xeb\xf7\x1f\xa7\x57\xde\xff\xcb\xd6\xdf\xd0\x55\x4b\xbf\x27\xfd\x9f\xd0\x33\x99\x94\xcb\xdb\x1e\x48\xc8\xae\x14\x1e\xdf\x46\x7d\x11\xcc\x05\x4b\xc0\x87\xc1\xc7\xc2\x4e\x94\x73\xbb\xe2\x8d\x87\x86\x27\x86\x17\xc5\x8d\x79\xa8\xcc\xe2\xc9\xc5\x93\xf3\x41\x66\xe1\xa2\x60\x24\x33\x86\x6b\xcd\x87\xb1\x6e\xf0\x9f\x49\x30\x87\x50\x90\x02\xdd\xbc\x6e\x6b\x36\xe3\x68\x92\x44\x23\x15\xda\x88\x25\xae\x26\x8e\x9c\x9f\x7f\xe2\xc4\x3c\x7c\xdd\xdf\x76\xd5\xa7\x3e\x7b\xcb\x45\x1f\x78\x08\xbd\xd9\x02\x2d\x38\xff\xc2\xbb\x6f\xfd\xf0\x43\x67\xa2\x8b\xd1\xd0\xb1\xd5\xaf\x3f\xf4\xd0\xd8\x96\x7f\x43\x2b\xfc\x7f\xf9\x7f\x12\x70\x2a\xb2\x55\x54\x76\xf3\x46\x5e\x36\xa0\xaa\x12\x02\xc7\x4b\xb2\x69\xc9\x74\x5e\x90\x38\x54\x36\x19\x41\x97\xdd\x92\xa4\xcb\x79\x4d\x36\xf3\x59\x4d\x71\x9a\x8f\xfe\x73\x39\x17\xd5\x24\x3d\xf8\x30\xc8\xe6\xa8\xfd\xb8\x4e\x34\xae\xf5\x7e\x26\xae\x43\xf4\x36\xf0\x0e\x30\x04\xc6\xa2\xac\xb3\x53\xc3\xdc\xc3\x09\x1c\x3d\xdd\xae\x9e\xb4\x68\x3e\x39\x4c\x90\xed\x14\xd1\xc9\xd1\xb1\xdc\xec\x91\x89\xf1\xd9\xb9\xd9\x23\x44\x06\xe2\xd4\xab\xa1\xb0\x64\xc0\x6f\xd7\xac\x99\xf9\xfd\x1a\xf2\x56\xff\xf0\xd4\x94\xff\x46\xea\xb9\x99\xb3\xd0\x47\x4c\x0e\x82\xbc\x69\x98\x0c\x2b\xab\xb2\x2e\x2a\x9a\xc0\xa9\x86\x25\xe7\x0d\x8e\x23\xea\xc4\x35\xfe\xa6\x29\xdc\x1e\x85\x47\xa5\xd4\x6f\x0e\x7f\xf8\x82\xf4\xf5\x33\x0b\x52\xcf\x37\xaf\x4a\xbd\x30\xf5\x77\x06\x39\xbe\x88\xbc\x9a\x2a\x49\x96\xa6\xeb\x9e\x6b\x07\x32\xd1\x6c\x3a\x30\x0b\xcb\xa8\xdc\x20\xdc\x19\x44\x88\xf0\x04\xff\x68\x78\x7c\x42\x9e\xc8\xb1\xee\xb6\xf1\x1f\xf0\x96\x8f\x0f\xa6\xfd\xa9\x0d\x89\x71\xa3\x23\xdf\xd6\x5c\x9d\xa0\xa7\x04\xbf\x3b\x34\x11\x8f\x9f\x81\xfb\x9f\xad\xd8\xf9\x93\x2f\xa6\xcf\xd9\x88\x7b\xf4\x99\xbd\xb6\x2c\x5e\x53\xbb\xff\xce\xd0\x20\xbf\xc8\xe6\x83\x7d\xb6\x4e\xc8\x23\x5f\xe9\x95\x71\x5b\x0f\xf5\xf1\x86\x17\xa9\xbb\xa3\x79\x96\x1d\x38\x62\x65\xea\x0c\xb4\x74\xeb\x20\x39\xba\x69\x6c\x90\x3d\x95\xa3\xb6\xfe\x67\xbe\xd7\xde\xc1\x77\x35\x5b\xbe\xd3\xe5\x03\x31\xdb\xba\xe6\x96\xb5\x83\xfd\x5f\x9b\xc7\x06\xcb\xab\x2d\xcf\xf5\xf1\x49\xcc\x5f\xb6\xbe\xab\xcf\x8e\x0b\xe7\x1f\x2e\xcc\xea\xe7\x2f\x39\x6a\xcb\xba\x41\x7c\x38\x47\x6d\x1d\xa6\x41\xbf\x5e\x9f\xa3\xf6\xbf\xd8\xab\xbf\x6f\x7a\xe1\xad\xf4\xf7\x2d\xa9\xde\x7d\x4d\xff\x6c\x80\x3f\x3a\x5e\xff\x86\xa9\xc1\x3e\xae\xb8\x0f\x4e\x8f\xac\x7d\x7a\x47\x97\x9d\x21\xe6\x46\x77\x9c\x8b\x63\x05\x71\x44\x5c\x80\x23\xd8\x16\xc3\x31\xb1\xf4\x8a\x83\xe6\x31\x7f\x10\x6a\x4b\x6f\xca\x51\x5b\xfe\xa7\x57\x2e\x6d\x01\x7d\xfa\x81\xdb\xb9\x63\xde\xb5\x6b\x30\xdf\xde\xf2\xee\xc1\x34\xb1\xe5\x86\xc1\x72\x6f\xcb\x17\x06\xcb\xd5\xcd\xdf\xe9\x1a\x37\xda\xe7\xb3\xe7\x63\xbd\xf6\xf4\x1a\xba\xc7\xcf\xc9\x87\x3a\xe5\xd6\xe5\x7d\x7a\x1a\x9e\x67\xf3\xd7\xdf\x4a\xee\x6d\xfd\x61\x17\x5d\x19\x6d\xdf\xde\xe6\x8d\x83\xe1\xbd\xe5\xe2\xc1\x78\xea\x7d\x26\xf1\xde\x47\x62\x7d\x6f\xd9\x93\xa7\xcf\x05\x4b\x6f\x16\x7a\xbe\xb3\xfd\xbc\x3e\x5f\x2d\xb6\x45\xb7\x7e\xb9\x83\x1b\xb8\xee\x8a\x90\xf9\x26\xf5\x28\x78\x0f\x18\x07\x1f\x04\x17\x83\x0f\x83\x2b\xc1\xc7\x03\x8e\xba\x78\x62\x7c\x4e\x26\xea\x23\x35\x11\x55\x5a\x18\x0a\x13\x52\x70\xe8\x53\x78\x5b\x89\x53\x02\x86\x46\x86\x82\x71\xf8\x56\x3c\x37\x91\xf2\x14\xe6\xb1\xa4\x46\x5f\xcd\x3c\x9c\x85\x97\x1e\x79\xca\x51\x47\xde\x9b\x3d\xfb\xfa\xdb\xce\xfe\xf6\x3c\x74\xe8\x83\x10\xbe\xe7\x47\x23\x68\x2e\x71\xd6\xe3\x84\x8c\xa8\x17\xe1\xf2\x8b\xd0\xd7\x7f\xfb\xf8\x77\x51\xf5\x53\x70\xd2\xdf\xfc\x56\x9c\x79\x81\xf9\xaf\x57\x7d\xe1\xce\xb9\xe6\xa7\xaf\xfa\xd7\x3b\xe1\xad\x9f\x3c\xf0\x93\xab\x5e\x4b\x1f\xb8\xe6\xa6\x9b\xae\xf1\x5f\x5e\x34\x6f\x7c\xe7\xbc\x57\x94\x25\x1f\x82\x45\xb4\xfc\xb9\x7b\xd7\xc3\x8f\x34\x1f\x79\xf4\x99\x67\x1e\x45\x6f\xdc\xb1\x61\x0d\x9c\x40\x69\xf8\x06\x7a\x63\xc3\x7d\xdb\xd3\xdf\xf8\x67\xfc\x3b\xf5\x81\xe5\xd7\xdc\x71\xc3\xf2\xfb\x96\x5f\x71\xc7\x0d\xcb\xd7\xac\x7c\xe6\x86\x95\xf7\xf7\xe2\xe0\x1b\x3d\x38\x1e\xe1\x4e\xe4\x6f\x3b\x65\xb0\xff\x69\xcb\xe2\xc1\x3a\xdf\xd6\x8e\xaf\x27\x9f\xf0\x4f\x2c\xdf\x78\x34\x78\xbc\xf5\xe2\x92\x61\xe1\xca\xe8\x1d\x2a\xf6\xb9\x5d\x81\xeb\x8d\x4f\x76\xd9\xed\x91\x5d\xbd\x5d\xee\xb1\xab\xb9\xcc\x36\xea\x1e\x40\x82\xf7\xe0\xaa\x26\xcb\xf0\xad\xcc\xf0\xdc\x61\x32\x8c\x86\x9b\xb7\x04\x66\x46\x98\x85\x63\x19\x2a\x33\x96\x9b\x3d\x3e\x27\x33\x6f\x7e\xdc\xc5\x11\x27\x37\x87\xf9\xfe\xc1\x89\xcf\x6e\x17\x62\x88\x4e\x7c\x71\x78\xe4\xf3\xd2\x93\x84\xe8\x17\xce\x98\x86\x2e\x92\xef\xfb\xea\xf3\x93\xab\xd1\x33\xc8\xba\x29\x3b\x79\xfd\xea\x5f\x65\xa6\xe7\x5f\x7f\x10\x3d\x4e\x72\xcd\x1a\x99\x6f\x56\xc9\x82\xdd\x2c\xc3\x4f\x5a\x56\xf3\x7a\x8b\x83\xf9\xbc\x55\xb4\x78\xc1\x70\x65\xcb\xd4\x0c\x81\x77\x8a\x8c\xae\xd0\x26\xcf\x8b\xd4\x3b\x1f\xf4\x8f\xfb\xed\x83\xe8\xb9\x79\xce\x63\xeb\x8f\x79\xfa\x56\x19\xb4\x60\xfd\x99\x75\x4f\x7f\x90\xf8\xfe\xd4\xed\x0f\xdf\xeb\x1f\xb3\x24\x75\x04\x1a\x81\x2f\x30\xa8\xe0\x5b\xc8\x6e\x01\x55\x55\xca\xa6\xa1\x41\x60\x99\x90\x86\x8c\xed\x35\x69\x98\x85\x0e\xaa\xd5\xa4\x7e\xdb\x61\xf3\xb6\x58\xcf\x08\xe8\x51\x01\x69\x70\x04\x18\x02\xc3\x58\xd3\x08\xe1\x83\x13\xb4\xd3\xd1\x4f\x5c\xd9\x2b\xaa\x8a\x19\xf6\xf6\x9c\x1c\x0e\x43\x3e\xa3\x1c\xad\x28\x9f\x81\xca\xe0\x8c\xee\xa8\x14\x49\x47\x61\x23\x24\xa3\x82\x2a\x32\xa4\x61\xde\xa8\xa3\x82\x0c\x59\x98\x35\x51\x03\xb9\x32\xe4\xe1\x8b\xe4\xd7\xd1\x79\xef\x85\x8f\xaf\xf5\x7f\x67\xc3\xf9\x27\xa3\x7b\xe1\x3d\xf6\x10\x3a\xf6\x02\x38\x0d\xd9\xb5\xd6\xf5\xb7\xef\x3b\xbc\x89\xe0\x78\x97\x4d\x89\x48\x97\x2d\x98\xad\xa9\x55\x64\xa2\x82\x5f\x97\xa1\xd6\x70\x8a\x12\x8f\x38\xc2\x64\xd9\x4a\xb1\x2c\x51\x8a\x58\x32\x0c\xd5\x15\xcb\xf8\x67\xdd\x34\x34\xf2\xfc\x3b\x3e\x87\x96\xc0\x53\xd0\x7f\xc0\xef\x7f\x0e\x6d\x44\xf3\x4f\x34\x67\xdf\xff\xd1\x3b\x6e\xba\xe3\x26\xf4\xb8\x4a\xcb\xa6\x21\x73\x9c\x2d\x4a\x1a\x6b\xd3\x1c\xc3\x28\xb2\xc0\x32\xac\xa8\x0e\xb0\xb7\xf6\xbd\xda\xc7\x53\x43\x99\xfd\x48\x17\x3e\xc7\xf7\x1f\x1b\x7f\x3f\x98\xe7\x4d\xff\x74\x30\xef\x5c\xf7\x89\x2e\x3d\xc6\xcc\x8d\x3a\xcd\xb7\xb2\x49\x9c\x76\x7e\x82\xd4\xee\x25\x10\xf5\xdd\x9a\xee\x92\x9d\xf1\x3a\xbd\xaf\x0d\x96\xfd\xbb\x5e\x1d\xec\xdb\x9b\x7a\xb2\x4f\x17\xc1\xf3\x38\x9f\xeb\xb5\x5f\xbc\xf7\x61\x1f\x0d\xa6\xfa\xa9\x27\x12\x6b\x35\xdb\x7a\x95\x2b\xe2\x37\x1d\xec\xd6\x01\xf6\xbf\xdc\xb7\xbf\x84\x0f\x79\xf3\xe3\xbd\xfe\xb2\x4d\x17\xf7\x3d\xef\x74\xe0\x7d\xa8\x4f\x37\x88\xce\x67\x5e\x9f\x0c\x0e\xe3\x86\xae\x1e\x0c\xd7\xd5\x1f\xec\xdd\xdf\xc6\x53\x7a\x7c\xdd\x91\xcf\x62\x67\xbf\x0d\x98\x88\x1b\xda\xb5\x73\xb0\xdd\xbe\x7f\x4b\xef\xf9\x47\x7d\xc9\xfa\xee\x14\xbd\xd9\xd8\xef\x32\x17\x74\xdf\x11\x86\xb0\x00\x03\x60\xd1\xb1\xf5\x5f\xee\xd2\x0b\xe3\xf1\x83\xf7\xf6\xfa\x82\x76\xbc\xbd\x4f\x4f\x49\xe0\xa4\xf3\xfd\x3e\x9d\x1b\xef\xcd\xa9\x77\x9d\x59\xac\x77\xae\xbe\xbc\x17\x76\xeb\xbe\x94\xc0\x8d\xf5\x00\x80\xb7\x01\xb5\x75\x5e\xc6\xa6\x68\x70\x44\x5c\x65\x95\x05\x27\x82\xe5\xe0\xa2\x30\xf2\x3c\xae\x12\x32\x31\x3c\x37\x9d\xac\x9b\x11\xde\x82\x63\xde\x32\x1c\xd6\x14\xfc\x67\x6c\xe7\x6b\x94\xe7\x97\x60\xe1\xb0\x00\x8b\x7e\x99\xac\xa1\x0a\x12\x21\x8b\x2a\xb0\x00\x59\x0b\xb2\x87\xcf\xa7\x3c\x3f\xef\xa0\x06\xca\x0a\xb0\x5e\xf5\xc5\x94\x07\x79\x08\x94\x16\x40\xe5\x19\xf5\x7f\xcb\x72\x52\x47\x98\x12\xb2\xa0\x26\x49\x92\xd4\x30\x82\x3f\xe4\x87\xef\x46\xe7\xc3\xcf\xfc\xe2\xfa\xbb\x57\x3c\xfd\xc1\x15\x0f\xae\x78\x70\x45\x73\xd3\xb5\x47\x5d\x6a\xe8\x97\x9e\x70\xe2\xaa\x73\xcf\xbf\x6e\x74\xd5\x51\x27\x1e\x73\xcc\x47\x2f\x3d\x7d\xf4\x98\xd1\x73\xaf\xed\x81\xd7\x9a\x9f\x0c\xd6\xaf\x02\xee\xd0\x73\xef\x90\xe0\x41\x6b\x1e\xeb\xa5\x95\x08\xe2\xfd\xfa\x78\x18\xf7\x70\x4b\x2f\xde\x6c\xfa\x6b\x1f\x0e\x26\xf1\xa9\xd2\x8b\x37\xab\xa7\x31\x56\x3e\x3e\x98\xa7\x6c\x2c\x26\xf4\x68\x5c\x43\xde\x9d\x4a\xf8\x10\xed\x6e\x1f\x51\xd8\xbf\xa8\x4b\xd7\xc4\xf1\x98\xbb\x3e\xde\x37\xee\x24\x62\x41\xae\x1d\xac\xdb\x3b\x8f\x27\xf8\x22\x86\xa9\xfb\x97\xe0\xdd\x9b\xd7\xe3\x77\xaf\xed\xe1\xd5\x21\x5d\xb4\x63\x63\x94\xf6\x3e\xa2\x95\xae\x19\xcc\x9b\xd6\xfe\x72\xd0\xbb\x73\xd4\xe6\xd9\x83\xd7\xb4\xfe\x3b\x83\x79\xe9\xbe\x93\xc1\x40\xbb\x68\xfa\x50\x2f\xaf\x39\x38\x67\x30\xbd\x07\x27\x40\x8f\x6e\x7d\x04\x5b\x35\x3b\xfa\x6d\x04\x9a\xda\x2f\x0f\xf6\x13\xc6\x3d\xb5\x62\xbb\x75\xff\xa2\x3e\x78\x1b\x1d\x7e\xe9\xf6\xc7\x05\x86\xfc\xf5\x2f\x5d\x34\xaf\xe5\x46\x1f\x3a\x16\xd4\x73\xc9\x18\x8c\xb6\x5d\xfc\x38\x00\xb9\xd1\x4d\xb8\xf3\xda\xa6\x3f\xf6\xf3\x0f\x9a\x9a\xfe\x49\xe2\x3b\xdf\xa4\x0c\x7a\xc5\x86\xd3\x56\xfc\xed\xf4\xd7\xba\xee\xc2\xb4\xee\x33\x3a\x30\x0d\x7a\x6d\xe3\x90\x26\x8c\xde\xf7\xaf\x7d\xa6\x6f\x7f\x18\xe6\x1b\xfb\xc7\x71\x2c\xc9\xba\x2f\x63\x1d\x73\x09\xe8\xbd\xff\x34\x72\xa3\xd3\x3f\xee\xa1\x17\x3e\x69\x7f\x6d\xfc\x6a\x9f\xee\x8b\xef\xb8\xd6\xe1\x48\xcd\xa9\xd5\x03\xf4\xdf\xd1\xed\xb8\x2b\xc9\xd4\xe3\xf8\x77\x4c\x07\x4f\x0a\x81\x1d\x7b\x4a\x2f\x7d\x4f\xff\xe8\x1f\xf0\xff\x30\x06\xe2\xfb\xbd\x76\xdb\xee\x99\x3e\x1f\xe3\x5e\xea\xf3\xc1\xfc\x75\x40\x2f\xdf\xb4\x0a\xdc\x03\xd2\xa7\xbf\xb0\xf4\x85\x7e\x3c\xd9\xff\xc3\x5e\x38\x1e\xfc\x6c\xdf\xbb\x5d\x4a\xcd\x8d\xae\xc7\x7d\x3c\xa7\xda\x36\xf7\xa5\xad\xf3\x32\x3a\x75\x57\x6e\xf4\xe9\xbf\x86\xbc\xeb\x8d\x59\x03\x79\x4b\xd8\x53\x7e\x56\x34\xfe\x18\x38\x32\x92\x0a\x27\x83\x53\xc1\x45\xe0\x13\xe0\x3a\x70\x03\x8e\xa2\x4a\x25\xca\x1a\xa4\x47\xc7\xa8\xa3\xe2\xfa\xe3\x6f\xa9\x9b\x2f\x4a\xe4\x01\x9f\x01\xb1\xbd\x36\x34\x3c\x70\x30\xca\x64\x0c\x2d\xb7\x63\xcd\x13\x60\x16\x1e\x73\xfe\xb5\x57\xfa\xc7\x5f\x7b\xdd\xa5\xf0\x6b\xf0\x87\xe6\x2a\xdd\x5c\x4b\x5e\xd6\xdc\xb3\x96\x18\xf5\x7f\xea\x9f\xf5\x96\x0a\x3c\xf9\x0d\xf8\x63\x61\xb9\xb4\x2a\xbf\x56\x60\x8c\x1d\xe2\x4f\x6c\xb4\xcf\x7f\x03\xfe\x58\x14\xae\x30\x8f\xdd\xc8\x8f\xdd\xbf\x51\xfc\xc1\x46\xb4\x9f\xb8\x6d\xa5\xa8\x2e\x57\xd0\x79\xaa\xa8\x5e\xac\x50\x8f\x9d\x70\xfc\xd6\x0f\xdd\xfe\x9e\x13\xce\x39\xe7\x94\x45\x37\xef\x7a\xf2\x1c\xf5\x23\x97\xfc\x00\xdd\x7b\xf3\x23\xc4\xdd\xff\x1b\x3d\x7f\xb5\xff\xee\xf3\xce\x3b\xea\xf6\xa3\x8e\xdf\xaf\x8e\xdf\x76\xce\x4d\x90\xbc\xbd\x77\xe0\xf8\xf3\x2e\x59\xb9\xf2\x23\xe7\xe0\x9f\x09\x7c\xea\x9c\xc5\x0f\x7b\xf1\xcc\x59\x39\xe0\xac\x63\xdc\xd8\x7e\x4f\x17\xed\x7d\x9e\x5e\xb9\xca\x07\x63\xf0\x6d\x67\xae\x9a\xf8\x56\x8e\x0a\xf0\x21\xa9\x5f\x45\xbd\xb4\xee\x1b\xac\xa7\xc5\xbd\xab\x2e\x6a\xf1\x99\x4d\x01\xed\x1f\xd8\x71\xfd\xcc\xe9\x2b\x84\x13\xe9\x95\x5f\xbc\x15\x3c\x0c\xc0\x92\x0b\x42\x3e\xf0\xdf\x6d\xbb\x0e\xe3\x29\x78\x1f\xe0\xc0\x04\xb8\x10\x5c\x06\xfe\xb5\x93\xc5\x3f\x3e\x34\x12\xf5\xc1\xe8\x94\x2b\x18\x21\x60\x60\xd2\x0f\x0d\x2f\x9e\xc4\x09\x7a\xb3\xc7\x17\x4f\x8e\x0c\x07\xcf\xc2\xf9\xe4\x38\x41\xce\x9b\x9f\xc1\x18\xb4\x14\xf6\xa0\x50\x30\x69\xbb\x4d\x5b\xf8\x19\x9e\x18\x1f\x1a\x09\x3e\xc1\xf3\xa4\x6e\xe5\x59\xc8\x0a\x7c\xc5\x91\x0a\x35\x25\x4b\x67\xad\xac\x89\x6c\xd4\xb0\xb2\x0a\xb2\x55\x28\x89\x15\xc8\x88\x42\x49\x90\x15\x9b\x56\xf2\x59\x03\xd2\x59\xda\x6a\x1a\x26\x5f\xcf\x1b\x02\x6f\x08\x8a\x21\x8b\xbc\xac\x68\x82\x60\xd8\x8c\x2c\xe5\x35\x4e\x10\x52\x9a\x4e\xe7\x45\xcb\x71\x5c\xb7\xe8\xd7\x4a\x9e\xa7\x33\xac\x2c\x53\x3a\xa3\x48\xa6\xa9\xf8\x45\xc4\xe6\x99\x3c\x4b\x6b\x6c\x51\x15\x25\x22\x8b\x64\xd4\xd0\xea\x50\x22\x04\xd5\x30\x64\xb5\xe0\xd3\x96\xe7\x59\x50\x20\x8a\x79\xe4\xf8\x32\x2a\xc8\xb2\xac\x7a\x86\x2e\xc9\x9e\x65\x04\x86\xbe\x55\x98\x69\x40\x00\x8b\xa8\xdc\x10\xc9\x7a\x5e\x91\xa1\x8c\x5c\x13\x39\x26\x72\x4d\x13\xca\x26\x54\x24\x5e\x75\xfa\x7c\x7c\x34\x75\xe0\x87\x5d\xf2\x24\xe6\xdd\x1b\xda\x71\x14\xb7\xb5\xc6\x33\x0e\x75\x77\x20\xcb\xe6\xce\xe4\xa8\x27\x9e\xaf\x77\xf2\x8f\x9e\xa3\x1e\xc9\x8d\x3e\x71\xde\x51\x7e\x4f\x4c\x41\xbf\x1d\xf1\xc5\x6e\x99\xb5\xee\x2b\xc1\xef\x9c\x65\xf8\x77\x8f\xc5\xdf\xbb\x33\xe1\x4b\x3c\xf6\x17\xb3\x12\xbe\xa7\xb6\xed\x41\xad\xfd\xf7\x2e\x7c\xb3\x63\xdc\xed\xe4\x77\x9f\x94\xd9\x4b\xe9\xf4\xe8\x9e\xfd\xe9\x6f\xe7\x46\xcd\xd7\x8e\x7d\x23\x87\x35\x9b\x2e\x3f\xe3\x0b\x7d\xfc\x3e\x94\x11\xd7\xf6\xd1\x47\x31\x41\x4f\x2f\x46\xbc\x2d\xf4\x27\x5a\xb8\x7e\x57\xa0\xf7\x8e\x80\xe3\x00\x0f\x3e\x00\xae\x06\x2b\xc2\x3e\x0a\xb3\x13\x69\x77\xb8\x32\xdc\x08\x95\xc1\x68\x36\x3a\x36\x32\x31\x3c\x3a\x86\x71\x75\x5e\x94\x83\x3d\x16\xd6\xa3\x58\x7c\x2c\xc4\xb5\x3f\xdb\xe5\xd6\x16\xc7\xda\x70\x32\x94\x3e\x50\x86\xd3\x93\x67\xc2\x49\x98\x26\x8a\xbe\x70\x17\x3c\x84\xce\x0f\x3e\xe8\x4f\x64\xa9\xc9\xc3\x9f\xb3\x34\x14\x55\x86\x29\x34\xcb\xb5\x3c\x6b\x43\x8e\x66\x14\x93\xcd\x36\x58\xe2\xef\x0f\xbf\x1f\xbe\x7a\xdc\x25\xb7\x9e\x3c\x8c\x6e\x3b\xed\xbc\x7b\xf6\x3e\xfe\x78\x96\x7e\x18\xb4\x2e\xf9\xd6\xb6\xf3\x5e\xfb\x04\x64\x66\x04\x42\x66\x19\x97\x4f\xd1\x48\x93\x6d\x98\x87\x40\xad\x21\x13\x55\xfc\x92\x08\x4d\x98\x45\xb2\x26\xa3\x2c\xe1\x8a\x12\x74\x55\x5e\x61\x53\x9a\x5f\x85\x92\x8c\xca\x0a\xfc\x8b\x0e\x7f\xc7\x0b\x9a\xc4\xeb\xba\x28\x68\x2c\x8b\x0a\x0a\x2b\x42\xfa\xb8\xbb\xee\xfa\xfc\x17\x3e\xf8\xa1\x0f\x5d\xf7\xc1\x8f\x1c\x38\x40\x5f\xf2\xc1\x9f\xdd\xb8\xfe\xc6\x37\xbe\xfb\xc5\xbb\x76\xa3\x4f\xf3\x7c\x5e\x36\x3d\x95\xe7\x2d\x51\x36\x58\x8b\x16\x64\x4d\x57\x04\x89\x67\x65\x3e\x29\xff\xe2\xf8\xd2\x29\xab\x57\xfe\x45\x58\xb5\x6a\x90\x6d\x9c\xa3\x36\xbe\xde\x7b\x7e\xdb\x6f\xeb\xb3\x8b\x12\x7c\x72\xe3\x9e\x3e\x9b\x32\x8c\xfb\xee\xbe\x47\xb5\x72\xa3\xfb\x9d\x3e\xbc\x49\xc4\xb5\x4c\x3d\x3a\xd8\x06\x75\x73\x7d\x36\xe8\xce\x01\xba\x70\x30\xbe\x6b\x80\xee\xd2\x99\xff\x91\xc1\xfa\xe5\xba\x0b\x7b\xf1\x38\x92\xf5\x97\x0d\xe2\xf3\x39\x6a\xdd\x45\x5d\x76\x60\x07\x0e\xbb\x7b\x75\x83\xe9\x72\xd7\x7a\x44\x1c\x4b\x26\xe5\x46\x9f\x0e\xeb\xe4\x3c\x3c\x58\x0f\x9e\xfe\x34\xe8\xf1\xbb\xef\x3b\xb5\xed\x71\x8f\xf4\xf2\x50\xb7\x5c\x61\x9e\x08\x9e\x14\xc0\x39\xa7\x25\xf4\x4b\xb9\x25\x87\xfd\x75\xd6\xfe\x22\xe0\x11\x6b\x71\x14\xd4\xd4\x43\xfd\x32\x26\x47\x6d\xb9\x2b\x5e\x17\x9b\xf1\x70\x1f\xd4\x0b\xf1\xd3\x0f\x0e\x82\x5f\x8e\x7a\x14\x0d\xb6\xb7\xf6\xf6\xe9\x90\x11\xbc\x1f\xe8\xb5\x93\x22\x7c\x6c\xe3\xd1\x49\xad\x6b\x32\x3f\xa6\x6e\xa4\x57\x1c\x9c\xac\xbc\x6b\xc2\x3d\xf3\x31\x7a\xf9\x92\x67\xe1\x1e\x30\x32\xfe\xa7\xa5\x9b\x63\x1d\x48\x07\xb3\x71\x05\xe6\x71\x70\x6a\xe4\xa9\xfe\x0c\x96\x6d\xe3\x51\x01\x81\xf1\xb9\x23\x73\x71\xd1\xc5\x89\x91\xcc\x70\x74\x55\x8a\x9b\x3c\x60\xd6\x30\x02\xc3\x74\x19\x1c\x36\x8e\xbd\xd1\x27\xc1\xf1\x4e\x53\xa8\x91\x05\xa3\x13\x5d\x1d\x79\xde\x52\x7b\x22\xa5\xdf\xdd\x04\xaf\xbd\xe9\xcf\x7f\xbe\x09\x6d\xb8\xe9\x77\x73\xe0\x0d\x97\x7f\xf8\x1d\x19\xe2\x4a\xff\x9c\x8b\x89\xe9\x66\xf5\x63\x57\x0e\x3f\x70\xdd\xef\xa0\x48\x9c\xe2\x3f\x4f\xbc\xd4\x54\x49\x7b\xa6\x4c\x70\xba\xac\x2a\x7a\xd5\xe6\x75\x8b\xcf\x5a\x59\xb5\x5e\xd6\x89\x8a\x2e\x9a\xa2\xee\x03\x93\xd1\x4c\x1d\x31\x6f\xa9\x39\xa5\x3f\x2b\x8a\xa2\xa8\x2b\x8a\xa2\x98\xaa\x48\xd3\xba\x84\xbc\x9a\xc0\x99\xa2\x8c\xca\x1a\x39\xdb\x6a\x96\xac\x94\x3c\x63\x2a\x8a\xa6\x2b\x3c\xd2\xf3\x0c\x67\x72\x05\x45\x94\xa0\x63\xb9\x92\x63\xf1\x4c\xa5\x28\x16\xd2\x85\xff\x8d\xc6\x84\xcf\xe4\xff\xb4\xf8\xcc\x97\x70\xac\x89\xf9\xb6\x59\x39\xea\xa9\xd3\x8e\xee\xf1\x9d\x84\x36\xd6\xee\x30\x53\xfb\xfe\x41\xba\xcb\xd4\x7d\x5d\x74\xd0\xb1\xcb\x70\x46\x6a\x60\x9d\x25\x69\x76\xfd\x8e\x01\x76\x56\x07\x87\xb0\x8f\x06\xbc\x23\xa2\x05\x2d\x96\x19\x81\x56\xdc\xe9\x13\x75\x59\xfb\x96\x7d\x72\x7c\x62\x64\x51\xcf\xff\x61\x54\x42\x06\xb7\x62\xc2\xc5\x39\x27\x70\xd7\x99\x45\x51\x49\x96\xe0\xff\xe4\x3f\x93\x17\x45\x58\x45\x8c\x5e\xab\xc1\x0a\x2c\x23\x4e\xaf\x54\x60\x35\x1a\x99\xa1\x29\xc6\xe7\x49\xde\xf5\x35\xcb\xd7\x5c\x92\xf7\x79\x03\x36\x50\x96\x64\x08\x80\x40\xf0\x69\x56\x82\x7f\x37\xfe\x9f\x24\x04\x69\xa2\xa2\xaa\xa9\xf1\x0f\x52\x32\x05\x54\x71\x90\x0b\x65\x1b\x32\x42\x0b\x68\x9a\x26\xa8\xaa\x86\x98\xb7\x12\x07\x47\x44\x34\x64\xc4\x50\x5b\x08\x26\xc0\x05\x40\xc2\x75\xb8\x6f\x8c\xea\x0e\x4e\x8c\x0f\xcd\x6e\x77\xea\x89\xab\xf9\x8e\x60\xaa\xc0\x2a\x1d\xae\xea\x1a\xfd\x7b\x4e\x30\x90\x1e\x1a\xee\x74\xd0\x5f\x48\x8e\x0c\x61\xe2\x19\x9a\x3f\x3c\x31\xfc\x1e\x38\x3c\xf1\xd6\x44\x94\xe1\xd5\x99\xac\x66\x3b\x0e\x64\xc3\x8f\xef\x98\x74\x1e\xd2\x0e\xc3\x98\x2c\x9f\x57\x45\xc5\x25\x34\x83\x81\x6a\x81\x63\x4d\x5e\xe4\x79\x41\xb3\x20\x87\x1e\xfd\xc0\x35\xba\x7a\xc3\x0d\x9a\x76\xa7\x86\x1e\xfd\xc1\x1e\x78\xf1\x3b\xbf\x76\xf8\xc2\x27\x88\x93\xfc\x17\x88\x93\x66\xce\x79\x4b\x1a\x82\x2a\xba\xef\xbe\xfb\xe0\x17\xd0\x7d\x9d\x92\xe9\xe9\x55\x0c\xc3\x68\x0c\x2b\x8a\xa2\xca\xa9\xaa\xcd\x0a\x2a\xc3\x4a\x92\x98\x95\x79\xd9\xdc\xea\xff\xf9\xc2\x0b\xf9\x0b\xaf\x5d\xf6\xde\x65\xcb\xb4\x97\xe1\x2c\xf4\xcd\x0b\x6f\x7e\xff\xfb\x97\x92\xab\x5f\xbc\xf6\x3f\xaf\xbb\x8e\x90\xff\x1f\xee\x19\xac\x44\x2e\x6d\x32\x57\x41\xed\xf0\xe1\x3d\xf3\x7b\xe5\x0c\xa6\x17\x6a\xfd\x96\x3e\x79\x18\xc6\xeb\xbc\xab\x57\x0e\x63\x7d\x90\x9a\xba\x67\xb0\x5c\x9a\xba\x7b\x90\x3f\x33\x47\x3d\xf9\xfb\x84\xfd\x8b\x7b\x6f\x3e\xf6\xcd\x3c\x08\xb4\xbd\x7a\x2f\xff\xbf\xba\x8b\x46\x43\xf9\x63\x87\x31\xe6\x34\xb5\x67\xb4\x97\xff\xdb\xeb\xfa\xf4\x40\xa3\xb3\xce\xd5\xd9\x5e\xf9\xf2\xe0\x1c\x10\xfb\x34\x00\x8c\xfa\x5a\x70\x61\xed\xd1\xb9\xa9\xf4\xdc\xde\xf2\x55\x13\xc3\x13\x0b\x17\x0d\x43\x21\x6d\xa3\x2a\x72\x48\xae\x59\xd6\x34\xcb\xcc\x6b\xb6\xd2\x2c\x91\x3c\x14\x61\x76\x46\xa0\x38\xaf\x5e\x36\x6d\x5f\x10\x25\xc6\x66\x18\xc2\xb1\x2b\xa5\x02\x00\xed\xda\x53\x3a\xc5\x81\x77\x07\x16\x52\x3a\x39\x73\x7a\x6c\xd1\xd0\xc2\x45\xc3\x13\xf8\xad\x0b\x33\x2a\xdd\xac\xc6\x33\x57\x19\x52\x08\xa7\x0e\x5f\x0b\x5d\x52\xb7\x35\x5f\x8b\xe6\x57\x14\x47\x81\x74\xa9\xe0\x78\xf5\xb2\xc7\x01\x00\x08\xc8\xb4\xc4\xcc\x2d\x14\x83\xeb\xc6\x05\x3b\x01\x5d\xef\x1a\x8f\x0a\x20\x41\x26\xed\x20\x0f\xd5\x25\xcd\xb1\x19\xc7\xe1\x8d\x4a\x71\x46\x24\x7e\x46\x1a\x4d\x83\x62\x4c\x54\x72\x9b\x8a\x2e\xe7\x1d\x46\x49\xe5\x4d\xcf\xaf\xd8\xe1\x1e\x6c\xdc\xef\x9b\xc3\xdd\xaa\x52\xe9\x78\xd1\x43\xef\x80\x99\x85\x8b\x92\xaf\x59\xb8\x08\xd2\x10\x40\xa7\x6b\xe9\x59\x82\x96\x90\x8a\x62\xb0\xa1\x3c\x2a\xa7\x40\xc5\x82\x7a\xb8\x01\xe4\x8a\xa2\xc3\xc9\x88\x09\x37\x07\xeb\x4e\x03\x9f\x57\xd4\xa3\xe7\x60\x98\xf7\x76\x3b\x3e\x2f\x5c\x13\x3d\x63\x52\x22\xc8\x83\x53\x82\x7d\x26\xbb\x56\x85\x4d\xab\xc2\xfa\xb4\x81\xb2\x3e\xe8\x28\x03\x38\x70\xa9\xba\x0a\x5d\x5a\x60\x2d\x5e\x64\x55\x81\x61\xb3\x48\x54\xfd\x9a\x8a\x38\x1d\x16\x64\x64\x41\x99\x04\x06\xee\x35\x67\x18\x9a\x9a\x97\x35\xb3\x59\x20\x45\x53\xf3\x4b\x94\x88\x5c\xc4\x99\x5a\xb6\x40\x6b\x90\x86\xb2\x5f\x47\x45\x03\x32\xd0\x43\xb4\x63\x9b\xac\x8d\x2c\x51\xa4\x2d\x3a\x0f\x65\x5b\xd7\xb4\x08\xef\xc4\x8c\x43\x71\xb9\xd1\x83\x38\x1e\x2f\xae\xa9\x60\xc6\x71\x23\x38\x9e\x71\xea\xae\x68\x7f\x51\xbf\x52\x30\x3f\xec\x93\x17\x49\x0a\x22\x33\x34\x32\x84\x75\x8c\x89\xe0\x28\xd3\x6f\xb1\x3d\x93\xe0\x39\xd6\x16\x52\xd9\x19\xcf\x34\x1d\x59\x51\x5d\x5d\xd1\x58\x94\x27\xca\xa4\x6a\xba\x44\xd6\x6f\xa8\xaa\x28\xe6\x79\x51\xf5\x5d\x42\x36\x75\x5f\x4e\x7b\xaa\xca\x39\x36\xaa\x79\x33\x0d\x52\x54\x64\xd5\x75\x8d\x82\x54\xf6\x2c\x53\xb6\x51\xc0\xa6\xec\x6c\x1e\xda\xb6\xab\x69\xd1\x7e\x42\xba\xc6\xfb\xd9\xf3\xd1\x58\x7f\x14\xa3\x9c\xe8\xb0\xff\xe8\x9d\x31\xdd\xb5\x9f\xbf\x15\x8f\x1b\x7d\x7a\x2e\x9e\xe7\xd0\xcd\x11\x3d\x46\xf7\x1d\x60\x49\x70\xba\x8b\xda\xb7\xc1\x51\xd6\x72\x27\x3a\x6d\x78\x2e\x35\x90\x54\x17\x4f\x0e\xa7\xd2\x63\x8b\x46\xa0\x0a\x1d\x98\x6d\x6a\x84\x13\x88\x45\x5c\xe0\x19\x32\x8d\xb2\x6a\xd9\xd0\xf2\x3d\xcd\x20\xb4\x1a\xaa\x11\x15\x9f\xd5\x75\x5d\xcf\x2b\x86\xe6\x33\x44\xb5\x5a\xf0\x3d\x54\x42\xb6\x00\x4d\x93\x54\x6c\xab\x64\xb9\xae\x55\x2a\x94\x35\xdb\xb0\x24\xd1\x36\x54\xce\x42\x05\x51\xca\xdb\x79\x06\xb2\x96\x21\x4b\x8e\x65\x39\x51\x4f\x64\x97\x9a\x9d\x1b\xdd\xb7\x11\x80\x5c\x26\xd8\x29\xf1\x67\xbc\x47\x2d\x63\x53\x7c\x6e\xf4\xe0\x2d\x78\x8f\x76\x17\x4c\x6e\xa3\x57\x3e\xba\xb6\xf5\x3a\x39\xba\xf4\xf9\x89\x6b\x73\xd4\xfe\x1f\xe3\xdf\xdd\xd8\x3a\x2b\xb3\x8d\xba\x93\x5e\x71\xb0\x70\xc4\xdf\x97\xde\x73\x76\x3e\x47\xed\x78\x72\x2e\x8c\xbe\x27\x45\x31\xa2\x18\x66\x4f\x9f\xd9\x0b\xe3\xfd\x38\x2f\xe8\x60\x32\x5f\xbf\xd0\x81\xf1\xc1\x67\xbb\x9e\x0f\xe6\xc1\xb6\xd6\xea\x8f\x77\x8d\x07\x67\x38\x0b\x9f\xd5\x1d\xf1\xb8\x94\xb1\xa9\xcf\xe4\x56\x3e\xfa\x6d\x70\x2c\xf1\x73\x01\x2c\x79\x34\xb7\x6c\xff\x8f\x01\x14\xc0\x19\x37\x03\x12\x9c\xd2\x3a\x3f\xf3\x2c\x75\x3a\x78\x17\x98\xc4\xfd\x74\xf0\x31\x4c\x0c\xc4\xd1\xc9\xf9\xe9\x64\x8f\xc2\xf4\xd8\xa2\xce\xb3\x64\xfb\x50\x7b\xbb\x18\x2e\x9e\x1c\x26\x1f\x81\x5f\xb9\xe1\x1a\x34\x41\xdc\xb5\xf2\x7e\xf8\x5d\x34\x71\xb1\x7c\xcd\x35\xf3\x2f\x5e\x79\x12\xfa\xc0\x15\x79\xe4\x28\x6a\x40\xa7\xba\x8c\x84\x3c\xac\xa8\x32\xca\x13\x05\xcd\x7a\x35\xe5\x96\x5b\x20\x20\x63\x55\xd3\x34\x5a\xd6\x94\xa6\x45\x6a\x05\xbb\xa9\xc3\xbb\x6e\xbc\xf2\xa3\x77\x5a\xc6\x8d\xa3\x26\xfa\xff\x48\xfb\x13\x78\xb7\xa9\x2b\x71\x1c\xbf\x57\xb2\x65\x97\x2d\x7a\x0e\x8f\x67\x08\x8b\x1e\x49\xde\x13\x14\x82\x20\xe4\x45\x10\x92\x88\x25\x89\xd8\x8a\xd8\x55\x56\x51\x20\x11\x5b\x51\xd9\x2a\x28\x8b\x68\x69\x11\x4d\x00\x35\xaf\x01\x85\x34\x44\x21\x9b\xb2\x3b\x0b\xc5\x74\x99\xba\x0b\x53\xb7\x74\x3a\x86\x69\x3b\x6e\x87\x4e\xcd\xb4\xa5\xe6\x4b\xa7\x75\x77\xe7\x3d\xeb\xfa\xff\xd1\x95\x2c\x5f\xbf\x3c\xe6\x3b\xff\xef\x0f\x3e\x09\xe6\x4a\xba\xcb\xb9\x67\xbf\xe7\x9e\xf3\xf3\x0b\x2e\x98\x62\x4f\x39\x1e\x7e\xe4\xa5\x67\x2e\x7c\xfb\xc2\x2b\x72\x5f\x99\x7a\xec\x9a\x0b\xd7\x48\x1b\xa5\x0b\x9f\x59\xf3\xc9\xdb\x66\xa5\xea\x8e\xa6\xb2\x76\x49\x92\xf3\x76\x3e\xef\xdb\x9a\x28\x01\x82\xae\x93\xbd\xd8\xff\xc8\xe4\xf8\xbe\xb3\x4a\xc0\xd0\xee\xee\xc5\xce\x8e\xbf\xdd\xc4\x72\x92\xcd\x0d\xed\xfc\x09\x8e\x39\xc5\x27\xb3\x3b\x7f\x41\xc8\xdc\x98\x77\xe4\x98\x2d\x43\xc4\x18\x91\xed\x8b\xfb\x22\xe2\xcc\xe5\x08\xdf\x56\x7f\x03\x9f\x09\x1e\x4f\x8c\x51\x0a\x6d\xe2\xb5\xf8\x5c\x67\xc7\x97\x13\x5b\x2c\x1c\x5b\xc9\x0d\x15\xde\xc4\xfb\xfd\x38\x31\x57\x87\xe1\x3b\xfd\xbf\x92\x99\x88\x1f\x7b\xb1\x0f\x7e\x14\xdf\x35\x02\x0c\x58\xd1\x56\x32\x9f\x65\x6e\x8f\xf5\xe5\x21\x70\x6e\xa8\x21\x93\xbe\x15\x1a\xe7\xaf\x9b\x74\x63\x13\x4e\x3d\xf1\xd9\xdc\x50\x57\xce\xf4\xcf\x9c\x14\x61\xa0\x92\x56\xc6\x0a\x5e\x8a\x1d\x6f\x84\x7f\x86\x52\xe2\xae\x4d\xd4\xe6\xe0\x98\x79\xd7\xcb\x17\xe6\x46\x2e\x9c\xdb\x1a\xa3\x99\x27\x9e\x68\xd5\xa8\x5b\xa8\x3f\xbe\xa2\xc1\x3b\xd1\x0b\xd7\x3c\x34\xed\xfa\x69\xb7\x67\x6f\x43\x97\xc2\x7d\xc5\xe0\x77\xad\xad\x94\xdf\x80\x47\xe4\x50\xed\xea\x7b\x8e\xb9\x22\xf7\xd1\xd3\x3e\x81\xd6\x4d\x83\x8f\x2e\x5c\x8a\x86\xa1\x88\xf2\x90\x53\x51\x43\x65\xae\xfe\xdc\xc2\x91\xbb\x1f\x1b\x19\x99\x72\x0f\x9b\xbf\xfd\xee\x05\x27\x0c\xa3\x81\x47\xaf\x12\x86\xef\xde\xb0\x60\x61\xfe\x81\x81\x81\x2f\xdf\x7d\xe3\x8d\xf7\x3c\xfa\xe8\x09\x27\x3c\x38\xbc\x77\x64\x6e\xfe\xee\x81\x81\xa7\x86\x9f\x1a\x7e\xf0\x84\x21\x12\x0f\x76\x49\x21\xac\x76\x9d\x3b\x11\x86\x05\x0e\x80\xdc\xb0\x9d\x01\x69\x14\x44\xd4\x1f\xef\x89\x10\x9f\x9d\xe1\x73\xc1\xd1\x47\x0f\x82\x3d\x3e\xa7\xdc\x4b\xd6\xa9\x8f\xfc\x61\x78\xcf\x5f\xfc\x26\xf1\xbe\x15\xee\x6d\xb4\x87\x84\xbf\xa0\x93\x6f\x0f\xe3\xc2\xba\x6d\x44\x3f\x51\xfe\xdc\x6f\xe0\x71\x3f\x33\x71\x5c\xdc\x8e\x67\xcd\x32\xa3\x8f\xe0\x67\xcb\xa2\xb8\xd2\x90\x57\x31\x47\x9c\x33\xb4\xf0\x9e\x1c\xe3\x7e\x23\x39\x03\x8c\xeb\x9a\x46\xb8\xb2\x5a\x8b\xf9\xbb\x07\x1b\x19\x2d\xcd\x81\xc3\x43\x7b\x20\x0e\x69\xc1\xa1\xc9\x19\xcd\x1b\xb3\x3c\x1a\xf0\x52\x41\xe6\xe9\x66\xd0\x84\x06\x72\xa8\xac\x65\x88\x76\xc8\x63\x5d\x5c\xe3\xd9\xce\x0d\xed\xfe\x08\x9e\xc1\xc3\xf1\x38\x4e\x7b\x00\xfb\x42\x97\x7e\x79\x2d\xf8\x86\x04\xe6\xf9\x39\x66\x77\x27\xd6\xda\x6d\xdb\xe4\x37\xbb\xbb\xb2\xb7\x43\x3f\x58\xf6\xee\x19\x8c\x65\xaf\xd1\xd6\xc2\xf7\xc1\xe1\xe0\xd4\x28\x0b\x5d\xa7\xc0\xc2\xd0\x30\xce\xd7\x3e\x33\x54\xe0\x8e\x9a\xcd\xcd\x1d\x99\x33\x40\x65\x98\x28\x13\xef\xf0\xcc\xbe\xf4\xf0\x8c\x14\x2b\xf2\x54\xd3\x1b\x33\x3c\x3a\xcf\xf1\x54\x49\x46\x15\xe4\xd3\x06\xdb\xb2\xd4\x32\x54\x04\xd1\x67\x35\x15\xe9\xa8\xe6\x05\x52\x9e\xaa\x22\x41\xa4\x7c\xc6\x56\x75\xe4\x56\xab\x50\x97\x25\x24\xdb\x92\x88\x4a\xaa\xab\x22\x93\xe3\x04\xb1\x2a\xa0\xaa\x24\xc9\x2a\x2c\x28\xae\x02\x45\xc9\x93\x00\x09\x83\x70\xde\x39\xe6\xd9\x8f\x27\x30\x20\xda\x59\x66\xcf\x09\x71\xbb\xd5\xa9\x47\x1e\xc3\xcc\x4c\xda\x7b\x74\x0f\xbf\x73\x0f\xf3\xb5\xf6\x45\x99\xcb\x98\xe7\xd8\xa5\xfb\xef\x9e\xd1\x3f\xff\xfd\x85\x3a\xbb\x6c\xe7\x9d\xed\xc3\xdb\xe3\xe7\x6f\x90\xce\xce\x65\x9e\xff\x65\xfb\x29\xf4\x68\xc2\xfb\xba\xba\x4b\x24\xbb\x69\xac\x4b\xfb\x8c\x83\x23\xa7\x4f\xc1\xfb\xdb\x01\xdf\xdc\xa3\x06\x3a\xf9\x37\x3b\xfe\x10\x2a\x2a\xcf\x32\x48\xc5\xb5\x76\x44\x7f\xac\xea\x53\x8d\x3c\xe7\x8b\xf9\x40\x4e\xd9\xe3\x66\x93\xb1\x82\x86\x68\x56\xe4\xac\xcf\x5a\xa8\x5c\xb1\x51\x45\x40\x65\x54\x91\x61\x43\x42\xf9\x74\x19\xb9\xe5\x32\xd4\x15\x59\x50\x0d\x64\xbb\x55\x17\x01\x8e\x93\x2b\x62\x1b\x58\xb2\x46\x89\xa8\x80\x5c\xd9\x33\x61\xbd\x03\x23\x35\x5a\x73\x0c\x8b\x87\x08\xbd\xc5\x21\xd6\xf2\x20\x81\xf7\x18\xa6\xbb\x3e\x89\xf9\xfb\xdd\xf1\x1a\xdd\xb6\x8a\x71\x84\x05\x47\x81\x19\xb8\xfe\x11\xce\xcb\x3b\x07\xd7\x4b\x1d\xce\x4d\x8b\x1c\x3c\xbd\xc8\x43\xab\x47\x1e\x4b\xe7\x6b\xb0\x76\xc0\xa1\xab\xa5\xc0\xb9\x61\x85\xf7\xfb\x1b\x0a\x05\xc7\x74\x0a\x30\xaf\x0a\x54\xd5\x1f\xb3\x7c\x5a\x12\x94\x94\xf3\xe8\x6d\x2d\xc9\x75\xe9\x3c\xfa\x6b\x43\x80\x2e\xfc\x46\xb0\x42\x37\x75\x5b\x4d\xfd\xc4\x74\x90\x5d\xab\x41\xd3\xd0\xa2\xf9\x3d\xdf\xbe\x38\x73\x7f\x32\xef\xc5\xcf\xfd\x2b\x18\x58\x58\xb9\xf0\x83\x98\xdf\x6b\xd1\x9a\x76\xdd\xd3\x9d\x3b\xc6\x1f\x35\x3a\x57\xde\x85\xd7\x9a\xd0\x89\x89\x6b\x34\xc7\xb0\xc9\x2d\x7e\xf6\x55\x90\x91\xc0\xf9\x87\x25\x74\x6c\x74\xe1\xb3\xeb\xae\xa4\x2f\xa5\x07\x6e\x0f\x10\x7a\x2d\x81\x8b\xa3\xf7\x27\xef\xf7\xe0\xe8\xe8\x7d\x1f\xd2\xfe\xa9\x84\x16\x43\x3e\x15\xd2\xe2\xc9\x93\x61\x12\x76\xb1\x1d\x75\x12\xcc\x0c\x72\x33\xe2\xe2\x53\x4c\x26\x37\xd0\x37\x98\x51\xfd\x31\x17\x13\xa1\x27\x71\x01\x48\xb3\x41\x15\x5f\xfa\x82\x00\xda\x22\x2a\x04\x75\x64\xdb\x5a\xd1\x84\x8a\xe8\xe5\x25\xaf\x1a\x94\xd2\x55\xe4\x55\xca\x50\xc5\xf5\xb2\x90\xee\x20\xd7\x41\x16\xeb\xbb\x95\x5a\xd1\x84\x06\xac\xf2\x45\x1f\x35\x05\x5a\x8b\x7d\xa4\x16\x31\x57\x23\xc1\x15\x8b\xe4\x27\xdb\x7f\x31\x39\xff\x19\xbd\x97\xe0\x3f\x36\xd1\xcf\x27\x93\x7d\x90\x7b\xfa\xbf\x27\xe9\x5f\xeb\xb1\x15\xee\x26\xf6\x80\x84\xdd\x5d\x89\xcd\xdc\xc9\x2f\x86\xdb\xb7\xde\x95\xf0\x09\x87\xdc\xcb\x6d\x87\x26\x34\x60\x92\x7b\xb9\xbf\xdb\x4f\xcf\xde\x6c\xbf\x38\x19\xd7\x25\xdb\xb7\x9c\x97\xb4\x1b\x51\xfb\x96\x73\x7b\xf0\x2e\x89\x79\xde\x7f\x27\x41\x4b\x69\xe0\xb4\x2f\x0b\xc7\xc5\x31\x90\x53\x70\x74\x30\x20\x6f\xfe\xcf\x9c\xdd\x37\x7d\x6a\x2f\x17\x8e\x2d\x01\x40\xe4\x0b\x98\x3a\x98\xfe\x87\x25\x19\x96\xd9\x32\x34\xd9\x11\x35\x38\xe6\x79\xcb\x44\x8e\x06\x98\x19\x73\x3c\x1f\xd8\x54\xd1\xa3\x2a\x41\x19\x66\xa1\xaf\x22\x01\xd5\x3c\xd4\x44\xaa\x0e\xed\x66\x50\x4b\x55\xae\xfa\xda\xe7\x6e\x7c\x61\xd5\xe7\xfc\x8b\xf6\x7c\xf6\xae\xc0\x4d\x01\x55\x47\x4e\xad\x06\x0d\x45\x6a\x6d\xfa\xe0\x03\x07\xad\xd8\xbd\xee\x37\xf0\x5b\x01\x45\xd5\xd0\x27\x3f\x78\xf2\x47\xf0\x9e\x0e\x2c\x7b\x60\xef\x9f\x90\xc0\xa0\x17\xff\xef\x24\xfc\x1e\x24\xcf\xfd\x16\xc1\xa3\x89\x3d\x19\xbd\x63\x72\xba\xd8\xd2\xb9\xcf\xf7\x68\x5b\xca\x6c\x23\xe8\xfe\x9b\x47\x66\xa5\x59\xe7\xad\x4d\xfa\x22\xf6\x7d\x54\x27\xfa\x32\x12\xfa\x1e\xda\xf9\x08\x07\x72\xcc\x8a\x5f\x10\x39\xa2\x6c\xac\xbb\xf5\xc7\x15\x02\xa2\xb3\xfd\xff\x2b\xe4\xe1\x20\x54\xd3\xfc\x58\xd5\xa7\x6b\x2d\x8e\xca\x0a\x1c\x9d\x75\xc7\x74\x87\xce\xe6\xb9\x20\x4f\xf3\x1e\xcd\x05\x12\xe4\x61\x59\x45\x22\xaa\x78\xa8\x81\x78\x1d\x96\x20\x1b\xa8\xa9\x02\x12\xec\x12\xa5\x49\x72\x24\xff\x04\x7e\xfc\xc0\x6b\xaf\x3d\x83\xfe\xf3\x4b\xde\x6e\x78\x73\xf0\x2a\x75\x25\xfa\xd6\x3f\x7f\xd6\x87\xc7\xc4\xb2\x8d\xc4\xfd\x65\x07\x9d\x9f\x84\xed\xb1\x77\x68\x74\xe9\xa4\x3c\xe5\x76\x42\xee\x91\xf4\x75\x1b\xc1\xeb\xed\xae\x5c\x1d\xbd\x79\x72\xb9\x3a\x7a\xeb\x44\x9d\x28\x6a\xdf\x8c\xef\xc6\xe1\x38\x77\x39\xd4\x45\xe2\x9a\xed\x1c\x98\x81\x6f\xca\x26\x10\xa5\x67\xb3\x19\x26\x3d\xbc\x00\x1e\x74\x28\x30\x09\xa2\xf7\x0f\x42\x27\xd5\x18\x67\x5d\xba\xd4\x92\x14\x4f\xd1\x51\x53\xa9\x78\xb4\xeb\xf2\xb2\x2e\x66\x9d\xbc\x56\xf2\x35\x24\xbb\xae\xda\x83\xea\x83\x8c\x7f\x40\x4d\xfd\x08\x5d\xf0\x45\x3f\xf8\x27\x54\xb4\x1c\xcd\x95\x6a\x10\x20\x89\x63\x65\x4f\xac\x18\xb2\x06\x2b\x81\x93\x21\x91\xfc\x6c\x17\xeb\xf0\x31\x2f\x49\xf2\x4e\x9f\x0e\x16\x62\x3f\x12\x45\xd4\x38\x9c\x31\x3c\x7d\xf0\xa8\xd4\xec\x91\xb9\x3d\x99\xa7\x7b\x26\x3e\x75\x76\x5f\x74\x42\x8f\x93\xf9\xc3\xf5\xa9\xbd\xab\x7e\xf6\x2b\xb8\xf8\x46\xf4\x32\xfa\x33\xfa\x15\x5a\xb5\x0c\xde\xfa\x67\x34\xbe\x6a\x19\xcc\x2f\x85\x47\x1c\xf2\xb3\x87\xc7\x7f\x60\x1b\x86\x69\xa5\x6b\x8e\x69\xda\x4e\xb0\x95\x5c\x8d\xe2\xc2\xba\xeb\x8e\x35\x3d\x58\x4f\xfd\xce\x6a\x03\x4f\x13\x3d\xc5\x76\x64\x5b\x34\xfd\x86\x53\xb4\x4b\xcf\x2a\xba\x6d\xaa\xee\xa5\xaf\x19\x77\x3c\x41\x1f\xd3\x5d\xd3\x38\x8f\xca\x0d\x94\xd7\xa0\xdd\xc0\x7c\xe6\xae\xf6\xbc\xcc\x1a\xe6\x19\x40\xe3\x75\x5d\x0c\x2e\x8f\xa2\xd0\x33\xf8\x86\xf7\x51\x83\xdc\x5c\x1c\xab\xc0\xc4\x1a\xdd\xf4\x43\x60\x66\x78\x24\xd7\x37\x7d\xe2\xca\x62\xef\xc3\x74\x2a\xc9\x28\x34\x63\xee\xcc\x28\x90\x61\x60\x64\x2a\xbc\x98\x52\x03\xdf\xa5\x79\x57\x83\x3c\x04\xd9\x06\xcb\xb1\x2e\x27\x0b\x41\x19\xe9\x8e\x9b\x35\x0b\x86\x63\x95\xe9\x1b\xc9\x05\x2e\x6a\x9d\x74\xfc\x9d\xc7\xcf\x80\xb5\xc7\xe7\x3f\xbe\xf2\x99\xf3\xee\xdd\xb3\x1d\xfd\x56\x84\x87\xbd\x88\xfe\x76\xae\xf8\x9f\xf0\x52\xf1\x9c\x9f\x3f\x3c\x2b\x75\xc9\xf2\xd7\x97\x07\x3b\x87\x4e\xc8\x64\x07\x4e\xf8\xc1\xd5\xb5\x91\x59\x8b\x6e\xa7\x1e\x46\xab\xd0\xfe\xe5\x9f\xb9\x11\x9e\x0a\xe7\xa7\x0e\xbd\x66\x29\x7a\xe1\x9d\x77\xe0\x9d\x1f\x5b\x18\x2c\x7b\xea\xa9\x43\x9f\x79\xe0\x36\xb4\x6b\xeb\xcd\x77\xde\x71\xc7\x23\xaf\x2f\xba\x73\xd1\x73\x2f\xbf\xbe\xff\x9f\x9e\x7a\x62\x2b\xcc\x27\xe7\x7c\x84\xac\x1a\xed\xc6\xf2\x09\x3d\xf2\xfc\x96\x49\x65\xc0\xd0\x3e\x7c\xbb\x73\x54\x3b\x98\x6e\xd8\x2e\xdd\x18\xbd\xf2\x67\xf4\xa6\x1e\x1b\xa3\xdb\x7e\x23\xc1\x9f\xc8\xf6\x1b\x00\x69\x63\x77\xdb\xaf\x4f\xe4\xa7\xd8\x43\x97\x5d\x1f\x94\x42\xcc\x67\x68\x37\x8e\x5a\x1e\xfd\x78\x32\x27\xb2\x2f\x35\xa1\x71\x29\x63\x30\xcf\xe4\x96\xed\x7c\xab\x3d\x0e\xd6\x4a\xe0\x2c\x94\x63\x56\xec\x4f\x6c\x25\x3c\xce\xce\xc7\x26\xe8\x51\x3d\xe3\xef\xec\xd8\xcd\x12\xae\x09\x11\xbe\xff\x16\xb6\xe5\x9f\xc0\x23\x5d\x3b\x19\x4f\xda\xd0\x8d\xd7\x35\x22\x58\xbd\xfa\x02\xce\xd3\x10\xf5\x68\x27\xeb\xd7\x92\xfe\x98\xd1\x6b\x62\x7b\x5b\x6f\x67\x31\xcf\xee\xd2\xea\x92\xff\x65\x96\xf8\x09\x4c\xa6\xb7\x86\x43\x94\x5c\x9b\xba\xf5\x7f\x97\x33\x1e\x9e\xda\xc3\x79\x00\xcd\xe5\x59\x2f\x9b\xa7\xb5\x40\xa8\x50\xac\x1a\xf8\xcd\xac\x1f\x58\x32\x05\xfc\x40\x4a\x1f\x72\xcc\x65\xf7\xca\xf3\x82\xd7\xe1\x9b\xe8\x34\xf8\xd6\x79\x37\x14\x3e\x36\x4f\x9e\xf3\xb1\x3d\x0f\x7d\xee\xdc\xcf\x3d\x74\xee\xe0\xf7\xee\xbd\xfa\xde\x14\x41\xbf\x63\x0d\x49\xe1\x44\xd1\x2d\x28\xbe\x09\x05\x54\xd6\x5d\xb9\xd4\xe1\xdf\xe4\x1e\x5e\x3d\xb9\x9e\x32\x7a\x15\x21\x73\x49\x3c\xbc\x72\x72\xd9\xba\xb1\x4c\xe8\x65\x04\x0d\x6c\xc0\x67\xef\xe0\x23\x58\xa6\x3f\x80\x75\xfe\x23\xc1\x31\x38\xaf\xb3\x10\xe7\x54\xc4\x7c\xa4\xc7\x73\x81\x0f\xfb\x30\xb0\x27\x72\xf4\x09\xc5\x08\x43\x0e\xef\xa7\x8a\x88\x95\x4c\x55\xc9\x6b\x1a\x17\x54\x76\xd1\x77\xb4\x5e\x84\x1f\xb7\xf2\xba\xa5\x3d\xd9\x03\xdd\x7f\x4f\x57\xc6\x04\x17\x0a\xa8\x02\x4b\x90\x77\xa0\x30\x76\x69\xc8\xe9\xa1\x6c\x55\x35\x85\x73\x78\xa9\x44\xb7\x46\x55\xce\x37\x15\x9d\x7a\xba\x0b\xc8\xe0\x6a\xc4\x5b\xd5\xf0\x1f\x74\xb2\xdb\xd5\x31\x49\x58\x5d\x41\xd0\xac\x45\xe0\xda\xe5\x71\xbb\x87\xe3\x08\xba\xed\x4a\x62\xdf\xc7\x79\x56\xe2\xf6\xcb\x62\xfb\x68\x45\x5b\xce\xac\x60\x6c\x30\x15\x0c\x46\x19\x27\xfb\x07\xc9\x72\x14\x51\x42\xc9\xe8\x08\x3d\xd6\xe6\x07\x32\xdd\x37\xb0\xe4\xc0\xf0\xc1\xff\x86\x60\xfc\x05\x73\x43\x70\x0a\xf5\x44\xf0\x24\x7d\xf2\x01\x40\x9f\x11\x3c\x49\x3d\x11\x1c\xcb\x3c\xe7\x8e\xe9\x2e\xcd\xe6\x39\x57\xe4\x02\xd9\xe2\x52\x6e\x50\xa0\xf3\xad\x3a\xac\xb8\xee\x38\xe7\xc2\x4a\xab\x4e\xe7\x11\xcf\x0b\xa6\x99\x3e\xe2\xf9\xdb\x9d\x1b\x1c\xe7\x06\xe7\x76\xf8\x4c\x4d\x53\xab\x02\x27\x88\x72\xcb\xe7\x15\xcb\xb5\x5d\x15\x35\x84\x9a\xea\xda\xae\x2c\xe2\xfc\x92\x46\x27\x06\x3a\x5e\x57\x84\x03\x87\x80\x7b\xda\x17\x67\xd6\xc6\x76\xdf\xb1\xe0\x14\x70\x06\x90\x70\xb6\x7a\x05\x5c\x85\x3d\x9e\xbd\x8e\xce\xa9\x44\x40\xe3\xcc\x09\xd2\x9e\x9e\x8c\x14\x3b\x47\xa3\x71\x91\xce\xf0\x0f\xbd\x2f\xb8\x3d\xfd\x5e\x70\xc9\x65\x9f\xd6\x2e\xcb\xdf\xac\x9f\x76\x8b\x26\x59\xa2\x46\xf1\xa6\x65\x1a\x4e\x60\xb8\x92\xeb\xc8\x79\x97\xb3\xea\x0d\xab\xea\xc8\xaa\xad\x53\xb7\x91\x38\x43\x3f\x58\x6a\x56\x4a\x1e\x4e\xfd\x5d\x80\x2c\x6a\x40\x1f\xff\xce\x3c\xf9\x24\xaa\xdf\xb8\xe4\x88\x27\x8f\x38\x2b\x7d\xd6\xad\x9f\xba\xe4\xbe\x3b\x67\x5a\xbb\x3e\xb5\x73\xdd\x2c\x54\x3f\x7e\x60\xce\xf5\x73\xec\xeb\x2f\xbe\x1e\x72\xb3\x7e\xf2\xfc\x05\x9b\xa9\x0b\x08\x3d\xe1\xf3\xe8\xab\xcf\x3f\x0f\x2f\x42\x5f\xfd\x6e\xf8\x4f\x8c\x03\x22\xc1\x9f\x86\x76\x44\xb7\x57\x2e\x4d\xf0\xc9\x21\xe0\xd8\xcd\xb1\xab\xf4\xb4\x5f\x9c\xe0\x1f\xdf\xd3\x7e\x11\x21\x03\xc8\xf6\x0b\x09\x7c\x25\x65\x8f\x0c\xc8\xf3\xce\x6e\x3b\x99\x07\x94\x6c\x5f\x9c\xf0\x0e\xa1\x87\x47\x2c\x9a\x68\x8b\xc5\xe3\x5e\x40\xb4\x93\x72\xf2\x7c\xc2\xdf\xe5\x13\xef\x9f\x97\xb4\x2b\x3d\x3c\xeb\xdc\x64\xfe\x5c\xcf\x7c\xa4\xa4\x5d\xed\x69\x5f\x38\xf1\x7c\x25\x6e\x5f\x90\xe8\xb4\xb1\x8c\x5a\xfe\x2e\xd6\xed\x67\x62\x2f\xe0\x2f\x13\xd8\x15\x88\x6f\xe6\x13\x7d\x91\x72\xe5\x1c\x02\xa6\x1e\xd1\x3e\xef\x43\xf6\xe0\xec\x04\x16\x62\xcf\x9c\xce\x22\xda\xf1\x9c\x5e\xc4\xf9\x8f\x47\x45\xc2\x2e\xc5\xf3\x09\xe7\x97\x63\x96\xdf\x97\xf0\x18\xa5\xdb\xce\x32\xa3\x73\x93\x76\x21\xee\x27\x6a\x1f\x49\xfa\xb9\x0c\xcf\x73\xe9\xf2\x4b\x40\x4b\x02\x0b\x76\x44\x2b\x8e\xcf\x07\x43\x5b\x27\xca\x31\x97\x54\x01\xed\x23\x92\xf5\xf4\x0d\xa6\x73\x53\x33\x14\x6d\xa5\x1c\x0f\x96\x90\xa4\x98\xf8\x28\x94\xe3\xc6\x0d\x58\xac\xda\xae\x55\x4d\xb3\x50\x47\xae\x3b\x5e\xb4\x35\xce\xe7\x78\x29\xc5\xb9\x6d\x80\xaa\x2a\xe4\x60\x96\xf0\x8f\x9b\xb9\xa1\x7d\xb7\x62\x5f\x6c\x39\xe6\x7d\xf1\x99\x37\x98\x02\x66\x80\x93\x7b\xb2\xed\x62\x6e\x46\x27\x55\x00\xc8\xac\x42\x98\x47\xd4\xa9\x92\x4f\x95\x02\x89\x96\x9b\x15\x5a\x0a\x24\x29\xe5\xe1\x62\x23\x8a\xe9\xd9\x9c\xe7\xf3\xe3\x1a\xf4\x1d\xd5\x55\x9c\xb4\xdd\x68\x78\x0d\xd7\x6d\x04\x56\xa1\xe0\x22\xc9\xd0\xf2\x3e\xa7\x40\x4f\xf2\x0a\x6a\xc1\x4b\x6c\x3d\x31\x37\xb4\x3a\xca\xea\x34\xa7\xc7\x06\x0c\xdb\xff\x09\xb7\x9f\xd9\xd3\x1e\xe7\x8c\xce\x31\xab\xbf\x49\xd0\x69\x94\xa7\xf6\x5f\xb1\xee\xf3\xe5\x78\x8d\x51\x7d\x1a\x1b\x47\xfe\xce\x0b\xd7\x38\xa1\xf8\xce\x41\x0b\x64\x3a\xe5\xe5\xe2\x32\x4a\x21\x57\x1f\xc0\x8b\x2e\x51\x2e\xeb\xb2\xb4\xd8\x2a\x72\x74\xbe\x55\xce\x73\x29\x01\x61\x19\xa7\x3a\x96\x9e\xb7\x2c\xb9\xd5\x28\xb4\x81\x0e\x85\x7a\x50\xa3\x34\x2e\x8f\x38\x2a\xcb\x05\x56\xaa\x12\x78\x79\x51\xd3\x75\x47\x35\xd2\x35\x9f\x75\x1d\xdf\x51\x15\xc7\x77\x90\x1e\x57\x80\xb2\x9a\x65\xbb\x06\x1d\x47\x51\x1d\xbf\x55\xf7\x25\xbd\x6c\xb8\x86\x13\xe5\x7d\xd8\x1b\xad\x8b\x5d\xb6\x7a\x7d\x70\x62\xbb\x71\xce\x2f\x70\xfe\x97\x2f\x13\xe7\x5c\x66\x6e\xe8\xd5\x23\x88\x35\x33\x31\x2f\xe8\xd4\x74\x08\x65\xff\xd9\x3d\xd5\x0a\xa7\x4f\x76\x12\x19\x07\x95\xf6\x56\xdf\x8d\xbc\x83\x16\xcd\x3b\xb4\xdc\x2a\x52\x56\x1d\x16\x90\xa2\xd8\xae\xcd\x79\x9e\x38\x2e\xa7\x8a\xe3\x0d\xca\x6e\x55\xa1\x08\x1b\x88\xa5\x2c\x58\x1f\x77\x3b\xbf\x5a\xb2\x85\x2b\xec\x35\x2d\xcb\xb6\x02\xd9\xb2\x51\x55\x57\xf3\x2e\x27\x43\xd6\xb6\xa8\xa2\x85\x74\xc7\x71\x90\xea\x38\x4e\x50\x32\x6d\xd5\x36\x23\x9b\xd4\xc6\x73\xb7\xc0\xb1\xd8\x1e\x0d\xe7\x7f\x6e\xa8\x2d\x46\xb3\x0f\xe5\xef\xec\x4e\xc0\x52\x7f\x2c\x8d\x26\x99\x75\x67\xa9\xa4\xa2\x13\x21\xae\x4f\x67\x3d\xe8\xc8\xba\x22\x55\x5a\x0d\xca\x73\x83\xa6\x87\x80\x47\x79\xad\x26\xcc\xe2\x90\x24\x8f\xca\x8e\xab\x9d\x5f\x63\x42\x1a\xb8\x50\x43\x9e\x62\x7b\x76\xde\xf3\xa4\x71\x00\x6b\x38\x8f\x62\xba\x6e\xdb\xb2\x22\x2b\x8e\xd1\x6a\x78\x8e\xe3\xd3\x79\x03\xb9\xa6\x69\x22\x27\xfc\x8b\xd3\x75\xb7\xa1\xab\x9c\xcb\xcb\x55\x5e\xb3\x34\xd3\x88\xcf\x4a\xe2\x73\xcc\xbd\x83\xdd\xfd\x8a\xdb\xa3\x58\x30\x5c\x37\x68\x74\xf6\xc4\x33\x89\x1d\x38\x47\xea\xaa\x29\x84\x5d\xe2\x87\xed\x9b\xff\x05\x9f\x55\x44\x7a\x76\x36\xa6\x0d\x33\xae\xa9\x3d\x0c\x3e\x0a\x4e\x07\x8b\xc1\x25\xbd\x7b\xdf\x29\x3a\xcd\xcd\x9c\x7c\xcb\xe9\xa1\xe1\xc1\xfe\x91\x81\x83\x01\x38\x27\x06\x61\x91\x6a\x78\x34\xdb\x6a\x50\xba\x68\x69\x36\x2f\x06\x85\x56\x8d\x83\x16\x94\x03\x8f\xd2\x02\x16\xd7\x0f\x14\x28\x03\x56\xc6\x4b\x9d\x5f\xac\x20\x22\xbf\xce\x79\xd0\x42\x96\xea\xaa\x0a\xa7\x6b\x4a\x88\x3d\xad\x9a\x6f\xeb\xae\xcb\xe4\x35\xcd\x56\x83\xa2\x69\x29\x92\x24\x67\x1d\xd6\xa4\x64\x15\x15\x0d\xc3\x40\x45\x5d\xd7\x51\x49\xe0\x8d\x6c\x51\x77\x2a\xba\xca\x3a\x59\xa9\xe8\x94\x44\xc5\x52\x25\x02\x46\x66\x6e\x68\xcf\xe7\xf1\x59\xc2\x53\x13\xe5\xe1\x8b\xef\x60\x98\x9e\x11\xfb\xf0\x22\x9f\x8a\x06\x0e\x05\x79\x9c\x29\x65\x5e\xe4\xef\xe8\xe8\x7a\x74\xb8\xea\x99\x03\xa9\xf4\xf0\xcc\x39\x83\x33\x63\x52\x99\x78\xd4\xd7\xf1\x37\x65\x86\x86\xa1\x98\x56\xc6\x0a\xa9\xd2\xb8\x91\x72\xc6\x25\x87\xaa\xa3\x1a\x14\xf3\xc8\x43\x8a\x00\x55\x54\xa1\x55\x9a\x6f\x40\x19\x15\x55\xc7\xb1\x38\xd7\x55\xc6\x6a\x69\x0e\x69\x5e\x48\x24\x81\xe9\x3b\x9a\xeb\x31\x5a\x50\xb0\x55\x47\x0d\xea\xb6\xcf\x9b\x92\xe0\x70\x45\x0b\x29\x8e\x53\x33\x54\xce\xe3\xe5\xb2\xe3\xd8\x5e\xe0\x2a\x86\x69\xa9\xdd\xf3\xb3\x70\xbd\x4f\x85\xeb\xda\xb7\xab\x47\xde\x26\xed\xa3\xa7\x4f\x94\x79\xfb\xee\xc5\xef\x7f\x32\xe6\x8b\x56\x5c\x23\xef\x30\x5c\x95\x15\xc0\xd9\x04\x3f\x80\x03\x14\x3d\x9c\x83\x58\xec\xd0\x65\x4f\xb1\x0b\x2e\x57\x2c\x88\x48\x70\x9d\x9a\xd7\x4c\xb9\x75\xaf\xe0\xd4\x18\xf3\x80\x1b\x4d\x31\x55\x16\x03\x1f\xa9\x3a\x2c\x50\x1c\x12\x83\xba\x42\x09\x51\xdd\x11\xb7\x13\x17\xb9\xe3\xe3\x78\x4e\x51\x3d\xac\x54\x7c\x56\x61\x00\x1a\x7c\x04\x4c\x01\x47\xc5\x75\xf2\x8f\x9a\x9a\xa1\x86\x67\x46\x43\x0f\x80\xf4\xf0\x0c\x40\x7b\x9e\x47\x69\x55\xc7\xb3\x2b\x2d\xc3\xb3\xab\x6e\x2d\x55\x31\x82\x46\x8b\x57\x29\x91\x72\x19\x63\x5c\x4c\x81\x26\xaa\xca\x50\x6c\x88\x22\x12\x50\x49\x83\x72\x1b\x58\x81\x55\x74\x6d\x5c\x1a\x9a\xac\xf7\xb3\x3f\xca\x81\xa9\x24\x73\xc0\xf7\xb3\xc0\x21\x38\x03\xf3\x8c\xce\x7d\x90\x50\x85\x07\xe9\xd9\xa4\x00\x8e\xe0\x30\x73\x80\x82\xc3\x80\x32\x3c\x51\x4a\x95\xc6\xea\x9e\x67\x43\x9d\xca\x7a\x46\xd1\x31\x39\xdb\xd6\x24\x8a\x6b\x78\xbe\x5b\x6f\x15\xfd\x72\x1b\x78\x90\x67\x2c\xc1\xb6\xdc\xa6\xa3\x43\xad\x32\xde\x30\x34\xd6\x65\x79\x91\x6a\xa2\x22\xb2\x64\xe8\x40\x51\x12\x91\x8a\x6a\x2a\x54\x89\xb9\x4c\xc1\xd6\xf1\x49\x00\x40\x2a\x3e\x21\x88\x63\xf8\xff\x87\x09\xf1\x9e\xe1\x40\xc1\xf6\x04\x31\x55\xd2\x5d\xcb\x90\x03\xf3\xc3\x27\x95\x2a\xa0\xba\x61\x40\x05\xba\x82\x6d\x39\x05\x47\x35\x0c\xe7\x7f\x9e\x5c\x62\xaf\x62\x59\xbc\xe7\x34\x4c\x63\xb3\x7a\xfc\x8a\x7a\x6e\x68\xff\xe9\x18\xb6\x67\x10\x3a\x2d\xc6\xc5\x9d\xd3\x00\x60\x17\xef\xb8\x66\x3f\xb8\xe0\x37\x49\x1c\x82\x1d\xd5\xb8\xd8\x81\x73\x2f\xec\x3f\x3d\x96\x59\x9d\x9a\x8d\x11\x4e\x44\xbc\x3f\xc2\x0b\x8c\x0b\x33\x71\xe4\x29\xec\x11\x5a\x7d\xd3\xfb\x22\x2b\xb5\x6f\x90\xf6\x3d\x0f\x95\x9c\x36\x40\x75\x0b\x4a\x74\x03\x66\x21\xb0\x6a\xa8\x02\xcb\xba\xa1\xe8\xbc\x23\xcb\xe3\x8e\x0b\x1d\xca\x0e\x4c\x17\xaa\xc8\x67\xcc\xc0\xa3\x58\x05\xd5\x7c\xb3\x54\x29\xd4\xad\x5a\x15\xf1\x2d\x41\x0b\x01\xa1\xd0\x6c\x0b\xa4\x5c\xe4\x07\x75\x3b\xd4\x9f\x40\x1a\x34\xda\x72\x86\xc3\x35\x4e\x8f\x21\x66\x36\x38\x71\x32\x3d\x69\x80\x89\x99\x51\x55\x43\xd7\x6c\xbe\xa0\x4a\xe3\xac\x47\x15\x29\xdb\x75\x5c\xd3\x6b\xe5\x0d\xc3\xd1\x2c\x28\x84\xbc\x14\x07\xfc\x30\x66\xd0\x18\xf7\x35\x2d\xef\xe6\x15\xda\x1d\x37\xd3\x1c\xac\xa9\x15\xcb\x70\x5c\xb3\x60\x78\x6e\xc0\x05\x96\x0b\x15\xf0\x11\x70\x4d\xfb\xe2\x4c\x81\xd1\xc1\xe1\x60\x2a\x38\x1a\x67\x62\x98\x0d\xe6\x82\xf9\x71\x7e\x62\x02\x53\xe8\xa8\xe6\x7b\x62\xd6\x4d\xfe\x04\x76\xab\xc3\x63\xcc\x82\x7f\xf0\x34\x4b\x95\x79\x55\x15\xf8\xa2\x6d\x58\xa6\x4d\xa9\xae\xea\x28\x36\xf5\xb5\x0f\x79\x10\x68\xbe\x8f\x54\xc7\x2b\x5a\xe5\x94\x59\xb6\x5c\xa3\x4c\x7d\x37\xd0\xad\x50\x1d\xe5\x64\x2a\x2f\xa3\x72\x41\x2f\x43\x50\x69\x28\xf5\xea\xab\x1f\xf6\x20\x25\x04\x02\xa5\xca\xc8\x29\x1b\x0d\xc8\xb5\x41\x88\x80\x1c\x04\x49\x4d\xab\x90\x8f\xe0\x5c\x1e\x3b\xae\xc1\x51\x21\x57\x63\x3a\xf6\xdb\x4a\x46\x65\x4c\xec\x5b\x9a\x06\x04\x0c\x81\xd8\xf3\xd9\x39\xae\x8f\x56\x39\x35\xae\xf5\x49\x65\x66\xcc\x1c\xea\x66\x12\x9b\x3a\x48\x17\xbc\x92\xa5\x16\x34\x03\x3a\xde\x98\xe3\xd1\x59\x64\x19\x8a\xad\x58\x5a\x2a\x3b\xde\x44\x55\x46\x6e\x59\xbe\x07\x5d\x58\x52\x34\xab\xe1\xb8\x4a\x50\x09\x2c\xbe\x51\x0c\x1a\x8c\x89\x74\xbf\x24\x14\x6c\x24\x42\x01\x95\x60\x15\x6a\xa6\x23\x3b\x56\xe0\xba\x45\x17\xd5\x2c\x56\xd4\x54\xa5\x52\x57\x6d\x25\xef\xb8\x30\xdf\xf1\x85\xe1\x3c\x5e\xb8\x7e\xda\x39\x40\xea\xc8\xe7\xc4\xb3\x95\x84\x0e\x0f\x0d\x4f\xc4\xb0\x38\x83\xcc\xdc\xf0\x1d\x5c\xac\x79\x3a\x43\xc7\x7a\xdb\x54\x9c\x7e\x23\xc2\x3c\x9f\xb2\x45\xc1\xe5\x78\x5a\x0f\xca\xb2\xa7\x49\xae\xaa\x9a\x05\xd5\xb5\x91\xa0\x7b\x8a\xcc\xa9\x9a\x1e\x34\x4d\x57\x76\x2d\x55\x53\x4d\xdd\x56\x82\x0a\x6c\x52\xbe\x23\xd6\xf5\x2a\xad\xb4\x0a\xe1\x1f\xce\xa8\xa0\x9a\x0e\xd9\x54\xbe\x5a\xb1\x0b\x8d\x74\x51\xd3\x05\x45\x76\x4c\x4b\x51\x14\x4d\x92\x05\x57\x94\x91\x80\x5c\x53\xc5\xca\xbc\x0c\xab\xaa\x6c\xcb\xaa\x2c\x9a\x92\x62\xea\xa8\xe6\x38\x2e\x32\x4d\x64\x5b\xa8\xa8\x56\x6c\xdb\x28\x38\x65\xbd\x58\x00\x89\x0d\x8e\xf7\x72\x03\xbe\x4f\xb1\xeb\x9f\x13\x1b\x29\xae\xbd\xbb\x01\xdf\xf1\x5e\x75\x1c\xe1\xb7\xc1\xf1\x1f\xfe\xd4\x6e\x1e\x3b\x00\x81\xdd\x56\x71\x6e\xcf\x13\xe3\xea\xb3\x47\x26\x67\xf5\x0b\xe0\x5c\x1c\xed\x10\xe5\xe6\x89\x2a\xc6\x17\x28\x2b\xeb\x65\x69\x33\x70\x25\xbb\xa0\xf2\x59\x9f\x95\x65\x54\xaa\x5b\x66\x28\xaa\x1d\x95\xb2\xf3\x81\x9d\xce\xfa\x95\x8a\xef\x8e\x57\xf2\x1c\xa7\x95\x04\x54\x93\x25\x45\x49\x69\x41\x33\x28\x94\x5c\xa8\xd0\x51\x1d\xdd\x67\xdb\xb3\x32\xbb\x98\xcf\xe6\x96\xee\x78\x25\x7d\x81\x04\xe6\xcf\x64\x17\x1f\xf2\x87\x43\xbe\x23\xdd\x24\xb2\xb1\x4d\x15\xd5\x6f\x66\xc1\x51\x60\x18\xcf\xad\x6f\x36\x2e\x5e\x1d\xcf\x24\x42\x46\x3a\xf1\xb1\xc4\x71\x19\x2e\x55\x60\xbd\x2c\x6d\xb4\x2c\x0e\x85\x4a\x12\xe5\x89\x81\x9a\xf2\x7d\xdb\x70\x3c\xc7\x53\xec\xaa\xc2\x7a\x79\x45\x44\xe5\x36\x30\x53\x5e\x05\x66\x51\xb3\xe2\x22\x31\x28\x97\x5c\x28\x51\x75\x4a\xd5\x2c\xc7\xd5\x03\xa3\x55\xe3\x39\xad\x21\xa0\xaa\x22\x45\xb9\x49\xb4\x8e\xed\xb7\xfa\x5b\xf8\xec\x67\x69\xac\x2b\x86\xfc\xb6\xcc\x98\xf8\x2c\x73\x2a\x98\x01\xe6\x81\x73\xc1\x22\x70\x61\x28\x07\xbb\xe5\x6f\xe1\x6c\x36\xfc\x9f\x5c\x74\x00\xc4\x75\x6f\x48\x42\x9c\x01\x27\x44\x59\x36\x09\x67\x9d\x3b\xd2\x47\xf0\x93\xf0\x8f\x65\x6a\x25\xb3\x02\xcb\x05\xcb\xb0\x0a\xa8\xe4\xe9\xbe\x61\xea\x50\xf4\x94\x1a\xa5\x8b\x1c\xe7\xf2\x6e\x20\x23\xdf\xa4\x34\xd5\xb4\xea\xba\xcb\x0b\x54\x56\x12\x0a\xb2\xc6\xd9\x92\xcc\xf2\x48\xb7\x54\x47\xb1\x5a\xef\x7a\x1e\x9c\xe7\x79\x8c\x21\xa1\x7a\x49\xa9\xd6\xfd\xa2\x59\x2d\xb4\x2c\x64\xa1\x92\x63\x85\x2c\x42\x0d\x0a\x3c\x97\x67\x1d\xd5\x97\x65\x3d\xe5\x94\x5d\x1d\x8a\xd0\x16\x6c\xb3\x55\x2a\x7b\x79\x37\xaf\x17\x28\x0d\x55\x1d\x5f\xf5\x5d\x78\x49\xd0\xa2\xe8\xe0\xcf\x91\xed\xed\xc6\xb1\x9b\x33\xc0\xb9\x38\xda\xb9\x43\x7c\x89\xf3\x6b\x38\x83\xc9\x6a\x68\x38\x3d\x3c\xb3\x7b\x94\x7f\x24\x5e\x2c\x06\x05\x8e\x08\x39\x04\xa6\x87\x67\x8c\xcc\x1d\x64\x8a\x6c\xab\xa1\x6a\xf5\x82\x59\xaa\x16\x1c\x5e\xc8\xbb\x9c\xa5\xd7\x1b\x8d\x32\x2a\xca\xb0\x08\xf3\x86\x1a\x14\xf3\x54\x96\xe7\x1c\x41\x0c\x44\xa6\x16\xb8\xa2\x51\xc9\xf3\x59\x2f\xeb\xa0\x5a\xd9\x42\x0d\xb6\x86\x1c\x03\x4a\x35\x36\xa8\x32\xa2\x6b\x3a\x9a\x6e\xeb\x8e\xee\xc8\x96\x50\xb0\xea\xb2\x24\x3a\xb2\x66\xba\xaa\xab\xc8\xb2\x6a\x68\xad\x92\x8b\x54\x8e\xe3\xf8\x82\xd0\xd4\x65\x15\xd6\x50\x1d\x35\x4c\x4b\xa9\xd7\xf1\xda\x04\xbc\xef\x16\x10\xc1\x82\x10\x0b\xa7\xce\xc6\xd5\x98\x67\xcc\x1d\x60\xd2\xfd\x33\xe6\x0e\xa4\xd2\xfd\x33\x66\x0e\x80\x74\x7f\xb8\xaf\x1d\x8a\xe1\x86\xa2\x7b\x41\x9d\x23\xa5\x0e\xb6\x5a\xd0\x64\x3d\x36\x55\x6b\x29\x30\x5b\xb4\xea\xc8\x87\x46\xd3\x44\x15\xa4\xc0\x3a\x54\x4c\xa4\x07\x75\xbd\x01\x59\x4b\xcc\x7a\xac\xa6\x22\x15\xf9\x9e\x6d\x29\x5e\xd1\xe5\x6b\x55\xab\x5c\xe1\x91\x93\xb2\x6d\x43\x37\xed\x34\x1f\x55\x92\x68\x2a\x86\xee\x6a\x65\xab\xa0\xd5\xad\x42\xb1\xaa\xa1\x5a\x31\x1b\x12\x5d\x39\x22\x3a\x59\xe0\x6c\x5e\xa2\x9b\x41\x35\x28\x55\x8d\x32\x95\x87\x0d\xd8\x90\x75\xcb\x50\x40\x26\xc6\x5b\x23\xc1\xdb\xb8\x62\xe1\xff\x0e\x6b\x3b\x81\x18\xd8\xc1\x11\x95\xc9\x48\xff\xff\x89\xac\xf0\x31\xfa\x1a\xb4\x03\xce\x47\xdf\x85\x2b\x5a\x17\xc1\x15\xe8\xeb\x70\x11\xfa\x4a\x70\x89\xe7\xc1\x91\x4d\x9b\xfe\x97\x48\x9a\xfe\xee\x57\x50\x65\x14\x55\x46\x47\xa1\x30\x0a\x85\x5f\xa3\x69\xf0\xb7\xc1\x0f\xc0\x24\xf4\x3a\x7a\x5a\x6c\xb7\x44\xfe\x3a\x90\xdc\xf1\x39\x25\xf2\xe5\xcf\x9c\xdd\x37\x7d\xe6\x60\x3f\x76\xe3\x43\xe2\x7c\x30\xb9\xc9\xdc\xc7\xd2\xc3\xb9\xa3\xe1\x74\xfa\x5f\xe8\x52\x4b\x82\x8f\x78\x1e\xfa\x14\x5d\x6b\x71\x67\xd1\x76\xcb\x6c\x3d\x41\xf3\x05\x13\xea\xb0\x26\x72\x79\x87\xb3\x82\x12\x12\x7c\xb7\x61\x56\x8b\xe9\x03\xee\x92\x71\xe7\x6a\x97\xfa\x67\x97\xfa\xa5\x3b\x56\xe2\xb9\x7c\xde\x50\x3c\x49\xd6\xd3\x3a\xb2\x03\x0e\x89\x1a\x2c\x53\x16\x34\x3b\x73\x76\xbb\x73\xde\x72\x57\xe2\x5f\x92\xf1\x1d\xb5\x43\xc1\x09\x91\xef\xa5\x5b\xe2\x96\x26\x4a\xdc\x76\xdc\xeb\x53\x89\x68\xab\x0e\x6d\x85\x5c\x73\x01\x9c\x3b\x58\xa3\xca\x1e\x55\x0a\x24\x2f\x10\x0d\xa8\x7a\x74\xde\x83\x26\xb2\xbd\x56\xdd\x43\x3e\xc7\x54\x82\xba\x68\x96\xa4\xac\x97\xb5\x50\xad\x62\x21\x5b\x40\x55\x54\x95\x9b\x4d\x1e\xb1\xe9\xaa\xe7\xb9\xb5\x1a\xaa\x55\x2a\xe5\xb2\x5b\xad\x86\x3f\x5d\xa4\xe7\x39\xa9\x20\xd4\x0d\x49\x83\x65\x54\x47\x55\xd9\x15\xeb\x95\x8e\xae\x6b\x33\x46\x6e\x68\xc3\x6f\x01\x60\x97\xfa\xef\xbc\x67\xce\xbf\x77\xde\x32\x76\x89\xff\x1f\xed\x95\xa0\xb4\x50\x13\x6f\x00\xc4\x7b\xec\xb2\xad\x37\x81\xc7\x41\xf5\x2c\x61\xe4\xaa\x1c\x13\x7e\xd3\xd3\x07\xce\xe2\xb0\xe1\xb7\x3d\x76\xbb\x99\x1b\xda\x95\xc3\xb2\xaf\x2f\xb1\xdd\x42\x1b\x4d\x0b\xc7\x64\x1b\xec\x92\x2d\x87\x81\xa5\xe0\x7b\x73\xef\x9f\xdb\x7f\xd0\x7c\x98\x57\x64\xe2\x0c\x09\xe7\xbc\x8c\xda\xd7\x77\xce\x39\x6e\x8e\xc6\x60\x97\x6e\xf8\x2d\x02\xe7\x1e\x2f\x01\x76\xc9\x33\xcf\x83\xe5\x00\x9c\x73\xb2\xd4\xf5\xfb\xde\x91\x1b\xda\xbe\x17\x00\x76\xc9\xe8\x2c\xf0\x0a\xe8\x3b\x6b\xcb\xc2\x6b\xe2\x3e\xdd\xee\x58\xa3\xb3\x62\x1f\xa5\xd4\x96\x32\x80\xe1\xc0\x61\x80\xc5\x58\xc7\xc2\xe1\x91\xdc\xd1\x30\x52\xb0\x06\x19\x6d\xdc\x41\x0d\xcf\x31\xd3\x45\x6f\xdc\x49\x19\xb4\xa6\x07\x0d\xa4\x6a\x4d\xe8\x40\x96\xaa\xb7\xca\x94\x87\x8c\xc4\xe6\x74\x18\x1e\x6b\x6a\x83\xd1\x9d\x34\x7c\xee\x3e\xbd\x6f\x10\x5f\xb8\x1f\x9c\x33\x38\x32\x1f\x0e\xce\xec\x1b\xec\xa3\x43\x22\x3d\xd2\xa2\x8a\x08\xa4\xf5\x46\x23\x00\x0e\x12\x55\x68\x3a\x48\x82\x0d\x36\x90\xd3\x56\x50\x65\x29\x31\xa8\xa6\x54\x28\xba\x48\x70\x91\x80\x34\xd4\x74\xab\x50\x74\x55\xc5\x71\xa1\x88\xca\x48\x80\xa2\xa3\x86\xf3\xd7\x30\x1e\xe6\x41\x0e\xdb\x9a\xc4\xf4\xe7\x0c\xe6\x60\x06\xd0\xa1\xae\x4e\xb1\xa8\xee\xba\x66\xda\xf4\x90\xe2\x50\xa6\x19\x18\x1e\xa5\x8c\x97\x53\x22\x2d\x2b\x41\x1d\xe9\x5a\x03\x5a\x30\x4f\xd5\x5b\x25\x23\xa8\xa1\x92\x0b\x4d\xca\xa2\x44\xa4\x75\x74\x14\x5c\x3b\x76\xf5\x18\x86\xdb\xa9\x3d\xba\x4b\xb7\xfd\x94\xd8\xf6\x8c\x62\x58\xa4\xf8\x7c\x8e\xc3\x73\xa2\x87\x47\x72\xa1\x92\x37\x98\x4b\xc7\x33\x82\x38\x73\x11\x1d\xe5\x2f\x6a\x34\x5d\x5b\x4f\x5b\xa8\xae\x42\x47\x45\xa2\x0e\xf3\xe3\xa5\x94\xd4\x32\x61\x11\x0a\x3a\xaa\x21\x35\x0f\xeb\xb0\x10\x6a\x65\x22\x5d\x33\x10\x8f\x1c\xad\x0a\xd5\x26\xe5\x04\x1e\xca\xd7\x3c\x98\xa5\x42\x44\xaf\x20\xcf\x2e\xb8\x45\x1b\x95\xdc\xaa\xd7\x74\xba\x73\x97\x73\x43\xfb\x71\x2d\x88\xd1\x8f\x12\x73\x2f\x10\xed\x27\x13\xed\x1a\xd1\x7e\x12\xd1\xee\x74\xdb\xf7\xfe\x34\x69\x17\x32\x26\xf1\x7e\xa7\xe6\xd4\xe9\xed\xa1\xcc\x59\xcc\x2c\x76\xd9\xcb\xcf\xc1\xa3\x01\x3b\xc7\xc7\x7e\xcd\x4f\xbf\xfb\x5e\xdc\x97\x4a\x7c\x33\x0c\xba\xba\xa3\x41\xb4\x0f\x11\x63\x93\xef\xcf\x9c\xbc\xfd\xe5\xdf\x7f\xc8\xfb\x33\x7a\xf6\x2b\x6c\x7f\x18\xb7\x4f\xff\x90\xf7\x4f\x24\xda\xcd\xee\xfb\x6b\xe6\x1f\xf4\x3e\x6e\xdf\x31\xfd\x20\x18\xe1\xf6\xfd\xe6\x41\xb0\xc6\xf5\x47\xf7\x7f\x9a\x68\xb7\x89\xf7\x1f\x24\xda\xfd\xa4\x7d\x68\xff\xfd\xf8\xe9\x03\x93\x8d\xbd\xff\x3e\x02\x76\x4f\x27\x6b\x58\xf2\xa5\x2f\xc1\x59\x80\x9e\x73\x9e\xf4\xab\x9e\x6f\x3e\x85\xbf\x31\x12\x1e\x23\x46\xf9\x5a\xd6\x63\x1f\xda\xfa\x5f\x26\xb2\x28\x5c\xb7\x84\x2b\x41\x13\xe7\xca\xbd\xd7\x1e\xf1\xef\xe1\xbe\xe9\x14\x96\x3f\x58\xe6\x46\x62\x2a\xdd\x77\x64\x26\xf2\xb6\xa5\xe7\x0c\xf6\xe3\x04\x5e\x65\xe8\x07\xaa\x62\x3a\xba\x61\x1a\x6e\x45\x09\x6a\xb5\xa6\x63\x4b\x85\xaa\xd1\x14\x6d\xbb\x94\xae\xa3\x4a\x48\xd0\xce\xb8\x9a\xf2\xc7\xd5\x2c\x34\x51\x19\x8a\x14\x8b\xec\x50\x06\x50\x92\x6d\xeb\x92\x6e\xaa\x82\x2a\x3a\x1e\x2c\x23\x49\x94\x2c\x55\xd5\x29\x16\x79\x6d\xa0\x43\x0d\x16\x69\x1d\x71\x65\x87\x2a\x54\x6c\x64\xca\x4a\xd9\x29\x97\xcb\x65\xe4\x97\x27\x83\xd7\xe8\x60\xb2\xc6\x1b\xb1\xec\x0a\x29\x34\xb4\xf8\xaf\x8c\x2c\xcb\x09\x35\x16\x3a\x6e\xc0\x99\xb1\x98\x0d\x19\x57\xff\xe0\x09\x90\xc9\xf4\xcf\x1d\x48\x47\x97\x01\x8e\x1a\x3c\x83\x0c\xd8\x89\xee\x04\x64\x86\xe7\xe2\xf4\x34\x0c\xeb\x35\x1a\x8a\xae\x6b\x9c\xae\x0b\x48\x81\x85\x36\x50\x05\x47\xd0\x5a\x75\xcb\x31\x69\xcb\x0b\x8a\x94\x2c\x4b\xa6\xd5\x64\x51\x13\x4a\x2c\x2a\xe8\x50\xae\xb3\x55\x36\xcf\xba\x9c\x24\x04\x0d\xa4\x78\xa8\x9e\x87\x42\x35\xdf\x50\x35\x11\x4a\x8c\x89\x4c\xb7\x55\x31\x55\xce\xe3\x35\x3a\xeb\xa2\x5a\xb9\x21\x34\x4b\xff\x8d\xfc\xa0\x82\x54\x15\xfa\x14\xa0\x01\x12\xa0\x5c\x2a\x9a\x22\x5f\x10\x6c\xc1\x13\x6d\xb1\x28\x70\xd9\x6c\x5e\xf0\xd4\xaa\xc8\xcb\x46\x39\x6c\xe5\x6d\xc1\xcd\xb3\x96\x04\x12\xb9\x20\xe7\x86\x56\x97\x30\x8c\x38\x02\x0f\x75\x0c\x3b\x03\xb7\x77\x62\x0a\x3f\xd9\xbe\x34\xf3\x38\x73\x12\xbb\xc4\x79\x0a\xad\x02\xe9\x8b\xf7\x2e\xfc\xd7\xc9\xf0\x7f\xf4\xf8\x49\xf1\x99\x19\x25\x6d\x3f\x2b\x6c\xdf\xf8\x7b\x8c\x97\x0f\x4f\xa4\xaf\xc2\x8f\xf1\xfb\xc7\xc6\x71\x0f\x32\x6e\x57\x7a\xee\x41\x0f\x82\x99\x91\x8f\x37\xd1\x91\x06\x69\xf2\x3e\x6f\xb2\x71\xc3\xf8\x69\xa4\x91\xe0\x52\xe6\x7d\xd3\xfb\x98\xa8\x34\xff\x4f\xd2\xca\x58\xc1\x4f\xdd\x34\xfe\x0a\x5c\x43\xcd\x08\xde\x49\x39\x0e\xfc\xf2\xaa\x55\xad\x9f\xac\x5a\x85\xfe\xe6\x3a\x0e\x63\x79\x63\xc5\xb4\x3c\xae\x52\xc7\xf8\xd4\x1c\x74\xcc\xd7\xe0\x67\x9e\x42\x6f\xbe\xe9\xbf\x8e\xbe\xf3\x19\x78\x4b\x01\x2d\x49\x7d\xe1\x71\xf4\xa3\xc7\xe1\x35\x8f\xc2\x37\xd1\x19\xf0\x27\xe8\x0c\xf8\xdd\xc0\xa6\xee\x44\x52\x50\x46\x8a\x0a\x0b\x14\xa0\xb3\xc8\xad\xeb\x2d\xc7\xb2\x9e\x78\x7d\x9b\xb5\xe7\xa7\xe8\x14\xf8\x93\x77\xb6\xdd\xb9\xfd\xc7\xbd\x3c\x17\xc3\x79\x13\x9a\xc8\x4f\x22\x38\xac\xff\x76\x72\x9e\x20\x45\xb9\x14\xe2\x7b\x32\xd3\x08\x5e\x8c\xf7\xb1\xf0\x2f\x98\x6f\x44\xbb\x76\xcc\xa4\x30\x3d\x9a\xe8\xcb\x4f\xfa\x1a\x2a\xfc\x10\x3f\xcd\x4f\xe0\xed\xf7\x13\xfd\x0d\x24\xfd\x11\x63\x15\x7e\x14\x3e\x0b\xfb\x26\x73\x3d\xe0\xde\x86\x0a\x3f\xc0\xcf\xde\x4c\xc6\xf3\x88\x67\xd1\x0a\x8e\x9a\x74\x5d\xfd\xf1\x1c\x67\xb5\x67\x64\xfe\x95\xb9\x21\x37\xf4\xea\xc2\xf7\xde\xc9\x31\x1b\x67\x9d\xf6\x5e\xf2\xbe\xc6\xa8\xb9\xa1\xd5\x07\xf0\xfb\x47\x26\x6b\x12\x32\x16\xd1\x3e\x35\xf2\x29\xc0\x6c\x5b\xcc\xb0\x8c\x06\xa6\xc4\xfe\xbd\xd9\x91\xff\x28\xfc\x2f\x5d\xf4\xa8\xbc\x17\xc8\x5e\xa0\x78\x14\xcb\x68\xad\x2c\x55\x6b\xd9\x81\x4e\xb9\xb4\x1e\x08\x00\x02\xab\xad\x87\x7a\x17\x18\x0a\xbf\x8d\x73\x13\x46\x71\x85\xa1\x0d\xd2\x35\xf4\xe3\x6e\x07\xe7\x0c\xd2\x36\xbe\x9d\x0b\xeb\xae\x8b\xf2\x5a\x09\x0a\x66\xde\xe3\x0c\x05\x59\xa8\x6c\x07\xae\x0b\x2b\xad\x26\x9d\x65\xcc\x86\x1b\x18\x14\xdb\xaa\x1b\xc8\xe2\x39\xb5\x1a\x9a\x48\x82\xa2\xc1\x02\xe5\xa0\x2c\xe5\xb8\xa1\x3e\xd1\x68\xcf\xce\xcc\x63\x6c\xec\x39\x1d\x00\x27\x26\xbe\xec\x39\x83\x9d\x9a\x64\xf1\x6a\xe0\x6c\x36\xc3\x62\xd7\x7a\x2e\xfd\x68\xc9\xb0\xe0\x1f\x0f\xbc\x4a\x6f\xb2\x83\x2b\x5e\xd4\x9c\x6b\xdd\xb3\x37\xd0\xdb\x36\x8c\xb3\x94\xe4\x66\xd1\x57\xd0\x63\xb7\x42\x1e\xf2\x77\x32\xf6\x19\xff\xba\xea\xe9\xa7\x4b\xdf\x7f\xfa\x2b\x97\xad\x7d\x2e\x58\x17\xbc\x45\xcd\x0f\xce\xa3\xb7\x20\x89\x45\x9b\xd0\xe0\xf2\xa7\x6e\x83\x47\xc1\x4b\x22\x9f\x4c\xa3\x2d\x32\x4d\xc6\x00\x87\x03\x30\xb5\x03\x3f\x0c\x83\x46\x08\x3c\x8a\xf5\xbc\x31\x37\x55\x1a\xf7\x18\xf6\x40\x23\x65\x8c\xe9\x0e\xa0\xc0\xbf\xb4\x2f\xce\xf4\xa7\x11\x48\x83\xa9\xe1\xbc\x53\xe9\x61\xae\x9b\xb9\x3e\xfc\xc3\xbc\xa1\x04\x56\x4b\x17\xa8\x26\x75\xbf\xe7\x8d\x35\x3d\x58\xf3\x61\x2d\x8d\x1c\x2d\xef\x06\x0f\xb4\x2e\xba\x85\xbe\x3a\xb8\x2a\xc5\x8c\x8f\x91\x31\x78\x56\x6e\x68\x35\xbe\x8f\xb4\xfb\x72\x22\x56\x4a\xc4\x36\xca\xdf\xf1\x99\x59\x33\xd6\x6d\x4d\x1c\x8f\x60\x82\x43\x22\xdd\x70\xb0\x2f\xd6\xc4\x60\x14\x18\x8a\xc3\x42\x33\xfa\x98\xec\xb9\xaa\x44\xb9\x3e\xc5\x79\x07\x6a\x1e\x95\x4f\xf1\x2e\x92\x91\x8d\x1a\x9a\x0f\xb3\x65\x0a\x50\x0a\x2a\xd5\x91\x05\xad\x7a\x1c\xe7\xce\xe3\xb1\xfe\xd1\x1d\x2b\x89\xcf\x55\xd9\xa5\x7b\x4e\x9d\x05\x16\xec\x0b\x35\x9e\x3d\xcb\x92\x67\x76\x94\xff\x70\x0f\xae\x6b\x99\xd4\x02\x77\xb0\x3d\x68\x44\xed\x2c\xb3\xeb\xd4\xa4\xdd\xc8\x14\xc3\xf7\x77\x45\x3e\xf9\x65\xc4\xfb\x5a\xa7\x1f\x96\xd9\x62\x10\x63\xfb\x61\xfb\xe6\xbb\x26\xbc\x2f\x93\xe3\xee\xff\x62\x12\xcb\x20\x47\xf9\xe8\xb6\xe1\x7b\x81\x6b\x7f\x4c\xbc\x8f\xef\xab\x47\xfd\xbf\x18\xdf\xe5\x83\x53\xda\x57\x65\x8e\x63\xae\x60\x97\xae\xf9\xf5\x61\x33\xa5\x5f\x2e\x7a\x28\x97\x59\xf3\x6b\x70\x02\xfd\x9d\x76\x1b\xd4\x31\x5d\x99\xb9\xa1\x2d\x77\x60\x7a\xeb\xe4\xac\xa9\xb7\xb5\xa8\xaf\xb8\xbd\x63\x0f\x7d\xbf\xbd\x2c\x33\xc0\x98\xb9\xe1\x5d\x37\x80\x13\x82\xe1\x1c\x86\x60\x32\x27\x3c\x57\x16\xe4\x18\x2f\x9b\xcc\xe9\xe2\xcc\x18\x73\x57\x67\x0d\x3b\xbd\x4f\x8c\xf7\xae\x39\x9a\xeb\xbe\xcf\xc6\x76\xe9\x1f\xdb\x97\x67\x8e\x61\x3e\x05\x58\x70\x1c\x3e\x6d\x99\xe8\xc8\x1f\x1e\x48\xa5\xfb\x46\xf0\x29\x60\xdf\x8c\x1e\x44\x98\x72\xcf\x6d\x37\x3c\x78\xf2\xba\xab\xce\x40\x9f\xde\x52\xb8\x1c\xfd\x06\xbd\xf3\x17\x78\xe4\x59\xe8\xf7\x68\xf9\xc7\xe1\x55\xf0\x96\xad\xd4\x8c\xf5\x07\x7e\xb6\x9e\x9a\x96\xca\x06\xd3\x6e\xb8\x7e\xca\x97\xa6\x5c\x42\xcd\x1a\xff\x45\xea\xb5\xa3\x57\x7f\xfc\x54\x34\x73\xce\xad\xee\x83\x97\xdf\x4d\xfd\x6c\x1a\xb5\x17\x6d\x6c\xa1\x9b\xe1\xfa\x56\x32\x4f\xbb\x3b\xcf\xcd\x1b\x92\x75\x69\x24\xac\xb7\x75\xee\x00\x35\x71\x8c\x39\x9f\x1b\xda\x85\xeb\x60\xbf\xf0\xc3\xc9\xf6\x92\x65\x76\xb4\x88\x38\x19\x6c\x77\x16\xf6\xe2\xf6\x71\xe2\x7d\xaf\xfb\x7e\x52\xbf\x5d\x6a\xcb\x99\xb7\xa2\x71\x0b\x80\x5d\xb2\xfb\xe3\xe0\x0d\x00\xe6\x0d\x4a\x9d\x6f\x0a\xe1\x37\x51\x0d\x6e\x02\x8f\xe2\x31\xa2\xbe\x92\xda\xeb\x5a\xe7\x5c\x32\xda\xe3\x6d\x5f\x27\xde\xc7\x31\x34\x31\x9e\x6a\x04\xfe\xe2\x35\x6c\xf8\x65\x4f\xff\xdd\xfb\x89\x78\xdc\xdd\xd7\x12\x31\x3a\xd8\x3f\xbc\x05\xdf\xd5\xd8\x72\x47\xd2\x8f\x43\xae\x2d\xa9\xf1\x5d\x8b\xce\x72\x3a\xb0\x18\x65\x89\xf9\xe0\xf7\x37\x2f\xec\x19\x37\xaa\xb1\xae\xe5\x86\x5e\xfc\x05\xa6\x83\x17\xc1\x04\x3f\x76\xd4\xcf\x9a\xf7\x62\xdc\x6a\x46\xb4\x0f\x38\x30\x84\x6f\xfc\x0f\x64\x06\x59\xe2\xc2\x7f\x1f\x51\xe9\x24\xfc\xbf\x91\xa9\x24\x83\x8e\xd9\x1e\x2d\x15\x24\xca\xd6\x5c\x59\xe3\x74\x45\xe4\xb3\x2d\x2f\xd5\x60\x0d\x87\x53\x39\x9d\x17\x79\x76\x3c\x0f\x35\x5e\xb6\x15\x5b\xb1\x78\x0f\x8a\x9e\xd7\xd2\x3c\xc8\x33\xa6\x68\x22\xb6\x94\x75\xb3\x1a\xe4\x03\x37\x30\x9b\x79\x37\x6f\xc3\x32\xed\xa8\xa8\xe4\x78\x8a\xe7\x04\x1a\x32\xa0\x18\xd4\x34\x58\x42\xe5\x88\xfe\x8c\xe8\x8e\xef\xde\x4f\xf4\xc0\xce\xc3\xf8\x65\xe6\x86\xd6\xfc\x0e\x4b\xe6\xbd\xc4\x19\x33\xe6\xad\x7b\x96\xd5\x70\x9d\xf2\x6c\x77\xcf\x0a\xdd\xbd\xdf\x72\xc3\xe4\x7b\xb0\xb3\x93\x5f\xad\x84\x79\xb1\x98\x1b\x3a\x14\x9f\x1b\x8e\x4e\x99\x78\x86\x1d\xc3\xf4\x37\x3d\x3c\xcd\xea\xf4\xe3\x9e\x4c\xe0\xaf\x93\xb4\x0f\xed\x58\x8f\xb1\xdb\x8b\xf9\x7d\x7c\x06\xb9\x67\x29\x1e\xbb\x13\x8b\x6d\xb5\xad\x88\xa6\xd6\xfc\xb6\x67\x6d\x21\x7e\x45\x3c\x6a\x45\x4f\x7b\xb8\x06\x92\x87\x7c\x95\xc0\x3b\x9c\x93\xf3\xc5\x9f\xf7\xc0\xae\xd0\xc9\x5f\xb2\x65\x25\xee\xe7\x59\x62\xae\x6a\x17\x46\x49\xed\x77\x07\xd7\xcb\x50\x73\x43\xdb\x76\xe0\x73\x8f\x63\x93\x76\x91\xa4\xa7\xbd\x97\x25\xed\x16\xc9\x13\x36\xef\x4b\xda\xfd\xa8\x66\x4a\x0c\x23\x81\x90\x7b\x66\x02\x87\xa1\x8d\x54\xf8\xf4\xd5\x35\xc9\x1a\xa2\x9c\x67\x51\x6d\x3b\x9c\xa9\xd7\x03\x07\xf3\xce\x1c\xb3\xfd\x8d\x89\x7b\xb4\x06\xd7\x09\xdf\x75\x74\x32\xce\xe7\x33\xcf\x30\x0f\xc6\xe3\x2c\x79\x75\x5b\x7b\x3e\xe8\x5f\xf4\xbe\xd4\xe5\x4b\xe1\x1c\x0e\x3f\x48\xf6\x48\x38\x37\x19\xfa\x70\x99\xc4\x32\x6b\xff\x05\x74\x63\x3a\x74\x82\x76\x8f\xe8\x91\x49\xc9\x5c\xb7\x3c\x9b\xd0\xae\x40\xd2\xe8\x96\x1d\x04\xcc\x5d\x02\x5f\x4f\x9c\x7c\xdc\x7d\xaf\x82\x6e\xcc\x62\xb4\xd7\xd5\x09\xb8\x21\x93\xfd\x6c\xf7\xe3\xf6\x46\x9b\xcf\xe4\x89\x79\x1e\x9e\xc8\x3b\x25\xc2\xb1\x35\xef\xf6\xe0\x4c\xb9\x2d\x64\x84\xee\xfb\x7b\xfe\x0f\xd1\x7f\xb5\xd3\x7f\x8e\xd9\xb7\x47\x20\x65\x73\x9c\xf7\x20\xd7\xd5\x71\x7a\xe0\xc0\x32\x2f\xfd\x7d\x52\x3a\x61\x56\x7f\x9b\xc0\x0d\x7c\xcf\x2d\xa2\x91\x6d\x63\x93\xcb\x8b\x6d\x07\x7a\x74\x88\xa4\x9f\xad\x77\x4e\xf4\x6b\x16\x70\x76\xe1\xad\xf1\xba\xa0\xd0\x96\x98\x5a\xd8\xff\xd6\x8b\x70\xfb\xc5\xc9\xb8\x71\x0c\x68\x34\xee\xd6\x8f\x11\xb8\x4d\xc0\xdf\x7f\x7b\x32\x38\xe7\x98\xad\x6f\x27\x70\x96\xe3\xb3\xc1\xaf\x4e\xa0\x35\x85\xa4\x85\x6d\xc7\xf6\xc8\xbb\x64\xfe\x7e\x07\xdf\x2e\x6d\x6b\x99\x57\x99\x87\xd9\x65\xab\x9b\x6d\x04\x1c\xe9\xee\xb3\xef\x67\x17\xef\xbd\xe5\xaf\xbf\x3f\x97\x9d\xff\x9b\xf8\x3b\xac\x53\x45\x35\xcd\x7b\x64\x5e\xb1\xbb\xff\xfe\x77\x93\x76\x35\xf2\xe1\x6f\xbf\xa7\xe7\xfd\x47\xda\x1f\xcd\xbc\xc4\xdc\x1f\xc2\x89\x1d\xcf\x0d\xef\xbb\x1c\x1c\x82\xd2\xec\xe2\x3d\xd3\xa6\xbf\xbb\x70\xd1\xc2\xb3\x27\xc3\xcd\x55\xa7\x11\x30\xc3\xf1\xba\xfb\x36\xe0\x3e\x97\x4e\xe4\x4f\xdb\xd2\x93\xd0\x90\x95\x1b\x0a\x39\x0a\xcb\x6c\x7f\x28\xd9\x2b\x8b\xa0\x89\xa1\x6d\xa7\x60\x0c\x3d\x2c\xe6\x81\x5c\x84\x9f\xd1\xb3\xed\x43\xf8\xcb\x99\xf1\xb3\x0b\x32\xaf\x30\x37\x85\xcf\x0e\x79\x2f\x37\x5c\x98\x0f\x00\x4a\xe7\x32\x6b\x76\x80\x43\xc6\x7f\x84\xf7\x42\x8a\xe5\xea\xb3\x38\xa7\xfd\x1c\xc2\x87\xe4\x11\xb8\x71\x23\xa1\x17\xe0\xda\x2b\xdb\x2f\x3e\x88\x4f\xda\x84\xce\xd3\x5d\x7f\x4c\xcb\x31\xae\x9e\x9a\xd0\x66\x1c\x63\xb4\xfd\x64\x09\xe4\x70\xee\xb5\x1c\xb3\xf6\x9b\xf8\xd9\xdd\x18\x8f\xb1\xee\xfc\x4e\xa8\x6b\x77\xf1\x2f\x8e\x27\xd8\x06\x27\xc0\x32\x8e\x59\x8e\xc7\xee\xe8\x30\xc9\xfd\x8b\x7d\x37\xf4\xf0\xbc\x70\xaf\x76\x31\x7a\xfc\xfe\x62\xff\xda\xb9\x60\x81\x26\x75\xfb\x22\x70\x63\xdf\x13\x89\x6c\xed\x81\xc7\xe8\xa1\x3d\x7c\x5a\xeb\xac\x6f\x73\xa7\x96\xdf\x6d\xd8\xe6\xbd\x22\x37\xb4\xf6\x9b\xbf\xa1\x72\x43\xbe\x98\x05\x39\x66\x9d\x94\xe0\x04\x8e\x0f\x8c\xbe\x59\x05\x89\x75\x28\x5d\x3c\xdf\x6c\xf7\xf0\x81\xae\x6d\x40\x11\x7e\x81\x08\x27\xb0\xec\x5b\xfb\xa3\x1e\x7a\x49\xd6\xf0\xea\xbd\x04\xbd\xe3\xb3\x87\xbd\x38\xe6\x6e\xb4\x5b\xc3\x55\x8a\xf8\xde\x8a\x77\x40\xb8\x17\xa7\x86\x92\xa0\xb0\xa2\xdd\x46\x7f\x90\x46\x2e\x5a\x15\x7f\xbb\x18\xf7\xb9\x6c\xd7\x15\x00\x04\x0f\x4b\xe0\xbc\xef\xb0\xcb\x76\x5d\x0e\x32\xc1\x02\xe9\xa2\xf3\xa7\xe7\x30\x57\x24\xf5\xb1\x78\x2f\xee\x22\xe0\x84\x79\xd9\x0b\x3f\xe8\xee\x1d\x48\x61\x9d\x58\x65\x9c\x38\xf6\xf1\xf4\xd8\x06\xee\x8b\x23\x7c\x27\x28\x5d\xe9\xfe\xc1\x39\xe1\x1f\x18\xdd\x62\x18\x8c\x32\xf5\x52\x55\x3f\xcf\xd1\xfc\xb8\x92\xb6\xc7\xcc\xb4\x9b\xd7\x6d\xc9\xe6\x5c\x49\xe0\xd9\x31\x13\x9a\x7c\x1b\x44\xe9\x3b\x02\xd9\x83\xb6\x3b\x5e\xf2\x3c\x68\x31\x0e\x2f\x89\x81\xad\x5b\x7a\xd0\xac\xe6\xbd\xbc\x0e\x95\x94\xa2\x54\x2c\xab\x69\x59\xad\x66\xb5\x8c\x8a\x36\x2c\x97\x40\x7c\xd7\xcb\x21\xf6\xfd\x23\xc9\x7a\xc4\x28\x8f\x68\xb4\x87\xfe\xd7\x13\x58\xc6\x7b\xbb\xfb\x4a\xac\xef\x76\x79\xa4\x10\xe9\xdf\xf1\x1e\xbe\x41\xf4\xe3\x77\x79\xea\xde\xdf\xf4\xe8\xd3\x7a\x6e\x68\xef\x0e\x40\xda\x9b\x76\xa2\x5f\xe0\xf7\x37\xde\x45\xc8\x58\x2c\xeb\x76\x6d\x0e\xf7\x70\xf4\xbf\x71\x55\xcd\xa3\x27\x93\x8f\xfb\xb7\x13\x7c\x98\xe0\xff\xa3\x59\x02\x1f\x3c\x42\x0e\x66\x08\xbc\x32\x09\x79\xb4\x8e\x68\x27\xf4\xc8\xcd\x63\xc9\x5c\x9d\x8c\xd3\xa1\x8d\x1c\xb3\xa6\xd7\x9e\x4e\xe4\xc2\xe6\x6a\x8f\x2d\x9d\xf4\xbf\x89\xbc\xa3\xac\x75\xe7\xb9\xa9\x73\xef\xfd\x95\xf6\x6d\x99\x3b\x99\x55\xb9\x65\x9b\x7e\x01\x0e\x81\x48\x02\xf3\xef\xcc\x2d\x29\x3c\xdb\x1e\x1f\x9b\x26\x81\x0b\xfe\x71\xf0\xdc\x72\xcc\xaa\x3f\x27\x73\x3b\x8f\xd8\xbf\xc5\x2f\xd4\xe7\x8e\x2f\x78\x4d\x9a\x15\xaf\x9f\xef\xa1\x75\x66\x72\x39\xbd\xe9\x21\x02\xb7\x09\x9d\x75\xed\x9b\x3d\x7c\x29\xf1\x01\x24\x35\x4b\x27\xd0\xe7\xda\x1f\x12\xf2\x07\xd3\x4e\xc8\xfb\x89\xda\x8f\x8d\xa4\x86\x1d\x9e\xcf\xea\xab\x89\x71\x6d\x02\x2e\xdf\x24\xda\x0d\x3c\x4f\x0c\x77\xa2\xd6\x66\xec\x03\x88\xf6\x75\xd3\x86\xc9\xed\xc9\xd5\xdf\x3b\xe8\xfd\x68\xdc\x8e\x9c\xac\x92\x32\x83\x65\x46\xd3\xc4\xb8\x04\x4d\x10\x75\x30\x65\x12\x9e\x9b\x06\x7a\x6c\x49\x33\x37\xb4\xf6\x07\x3d\x32\xb0\x67\xfe\x2c\xb3\xba\x4b\x2b\x66\x66\x53\x77\xcf\xf6\x73\x0b\xc0\x82\xf5\xd2\xa4\x3a\x5d\x52\x9f\x33\xe2\xb5\x09\x7d\x79\x5d\xdd\xc7\x24\x6d\x96\x4d\x2f\x12\x63\x7b\xdd\x35\x6c\x9e\x36\xd1\xbe\x8d\xf0\xc8\x7d\x20\x4f\xc2\x2e\x91\x3d\x7b\x7f\x92\xd0\xa3\x10\xf7\x1f\xdd\x64\x4d\x11\x6b\x76\x42\xfe\xf0\x42\x79\x12\xb9\x9f\xe0\x4a\x52\xd7\xd4\x6e\x6b\xa4\xfc\x5c\x5b\x26\x78\xb9\x49\xd0\x28\x4d\xc8\x48\x02\x17\x7b\x6a\xcb\xf2\xc4\xfb\x14\xf1\xbe\xd3\x79\x3f\xc7\xbc\x78\x1d\x61\x27\x27\xf6\x76\x8e\x79\xee\x75\x42\xfe\x27\x32\x27\xc7\x6c\xce\x27\xeb\xed\x91\x8f\x1b\x83\x44\x77\x96\x63\x9d\x1a\xb7\x6f\x3e\x2b\xd1\x55\x1f\xcc\xac\x61\x4c\x76\xe9\xa6\x55\xcb\xfe\x7e\xce\xe9\xd2\xcd\x21\x8f\xab\x91\x74\x96\xf0\x81\xf5\x3f\x25\x6c\x2b\x12\xef\xba\x72\x53\x8b\x79\x68\x24\x73\xb6\x11\x7b\x49\xc0\x6e\x2b\x4f\xd8\x17\x24\xdf\x03\x3d\xb6\x5b\x42\x07\x1b\x8f\x21\x6c\xa7\x88\xfe\xf6\xfc\x4f\x76\xc4\xba\x3c\xb1\xc7\x44\x3f\xbb\x5f\xeb\xd1\x91\x92\x79\x16\x1a\x84\x4d\x4a\xd0\xd9\x2b\xdd\x1a\x85\x97\x66\x5e\x65\x9e\x64\x97\xbd\xf2\x6f\x60\x07\x00\x67\xeb\x12\x60\x97\x6d\xcc\x01\x07\xa4\xcf\x39\x73\xe1\xdb\xec\xe2\xb5\xdf\xfc\x23\x90\xd6\x48\x93\xf0\xf8\xad\x8d\xa4\x0f\x52\x7e\x0d\x6d\x98\x83\x35\xa1\x6f\x24\xeb\x25\xf4\x8a\xad\xff\x4e\xe0\x3a\x31\xff\xad\xbd\x39\xa0\x12\x1c\x5a\xd9\x4e\xde\x37\x49\xdc\xdd\xfa\x53\x82\xee\x09\xbe\xb5\xea\x1e\x02\xe7\x8a\xc4\xbe\x54\x89\x76\x0f\xf7\x83\x71\x71\x03\x59\x63\x03\xc3\x67\xa3\xd8\xd5\x39\x41\x3a\xb6\x69\x2d\x70\x2c\x38\x19\x08\x60\x21\xb8\x2c\xd2\x1e\xb0\xea\x10\x45\x62\xc6\xc9\x0c\xf1\xa1\xe5\xf0\x0c\xd8\xe3\xdc\x8e\x4e\x00\xd3\x83\x23\x58\x93\x18\xa4\xa2\x1c\x1f\xb3\xfb\x8e\xec\x44\x89\xe1\x4b\x94\x8e\xe4\xb8\x90\x47\x55\xdf\x52\x75\xdd\x33\x4b\x5a\xdd\x45\x05\xa8\xa3\x86\x08\x6d\x54\xf0\x28\x36\xf2\x8f\x7b\x69\x57\x11\x4d\x41\x09\x64\x68\x64\x5d\x8a\x0d\x6a\x1c\xb2\x64\xc8\x09\xc8\xa5\x78\x47\x35\xb3\x6c\xd6\xce\x2a\x65\x47\x65\x0c\x4b\xe0\x4a\xb6\x68\x1a\x96\xa9\xa2\x12\x34\x8a\x8e\xe9\x56\x6d\x4f\xb0\x85\x71\x1f\xf9\xb0\x88\x64\xa8\x05\x8e\xc9\x94\x14\x55\x56\x95\xaa\xe9\xa1\xba\x83\xb4\x8a\xe5\x43\x59\x45\x05\x91\x13\x6c\xbe\xaa\xcb\x0a\x48\xee\x1d\x5b\xb9\xa1\x5d\x6c\xb8\xb7\xbb\xa6\x60\x8d\xf5\x35\x0c\xb3\x39\xd8\x9f\x81\x65\xef\x4e\x90\x63\x5e\xfd\x7a\xa9\xcb\x0f\x23\x9b\x12\xc3\x7e\xc3\x2b\x84\x9e\xee\x85\xfa\x86\xf7\xda\x04\xdd\x5a\x8c\x6c\xa8\x8d\x8b\xc1\x44\xff\x9a\xdb\xc5\xab\x8d\xf8\x4e\xe6\x4a\x44\xe8\x99\xa1\x9e\x9e\x09\x75\x91\x2f\x5d\xd4\xa3\x8b\xa8\xa4\x0c\xdd\xf8\x7d\xbc\x97\x19\xb0\xaa\xad\x66\xce\xc7\xf7\x3b\x8e\x07\x43\xf8\xde\x2b\xae\xf8\x4e\x7a\x71\xd3\x03\x4c\x86\xa8\xc8\x38\xf7\xa8\x81\x91\x99\xf1\x8e\xce\x24\xe2\x68\xc3\xd7\xd2\xfd\x4c\x37\x9f\xc4\xcc\x28\x7d\xfe\x00\x8e\xbf\xa5\x7d\x0f\x9f\x05\xb8\x14\x0f\x1f\xfc\xc2\xbd\x0f\xfc\xfa\x0b\x8f\x7e\xe6\x6b\x5f\xbb\xfd\xc7\x4b\xbf\xe4\xdc\x50\x5a\x57\x68\xd9\x2f\xa5\x06\x5f\x19\xdb\x00\xd3\x5f\xbe\x0b\xbd\xba\x1e\x0e\xd2\xdf\x6f\xfe\xf8\xfe\x37\xfe\x3b\x78\xfb\x1b\xc3\x0b\xe8\xc3\xbe\xf4\xdf\x4d\x78\xff\x17\xd0\x9d\xe8\x1f\xe8\xab\x68\xda\x15\x70\x0f\x1c\x34\x9d\x65\xf7\x7d\x11\x8e\x3c\x53\x59\x8e\x3e\x11\xdc\xc2\x68\x6d\x50\x42\x05\xa8\x94\xb6\x9f\xff\xb1\x05\x37\x5d\x79\xee\x9c\x25\xa7\x5d\x3f\x7d\xf6\x9c\x93\xae\x9d\xbe\x70\xde\x34\xb4\x19\x5e\x87\x4e\xcc\x5c\x72\xe7\xd2\x2b\xaf\xb8\xf7\x52\xf5\xae\x9b\x96\x1c\xcd\xce\x1b\x4e\xaf\xfc\xec\x95\x8b\xe7\x7c\x66\xc9\x4d\x37\x2d\x79\x70\xde\x25\x82\x3a\xef\xa4\xeb\x3e\x7b\x8a\xb6\x70\x89\x06\xe2\xfc\x23\x95\x2e\x0d\xed\xec\x9b\xa8\x8b\xec\xbd\xb5\x67\x5f\x0a\x38\xae\x5a\xcc\x0d\xed\xc6\xd1\xd6\xbb\x2f\x4b\xda\xbd\xc8\x8f\x15\xd1\xee\xee\xab\x13\x3b\xec\x6c\xbc\x57\x4b\x5f\x99\x0d\xfe\x24\x81\x73\xbe\x9b\xeb\xda\x74\x76\xc7\x67\x1c\xe1\xca\xfa\x1d\x84\xed\xea\x75\x75\xaa\x57\xc6\x13\x9c\x88\x75\x53\xe7\x83\xb0\x3d\xe1\x93\x13\xf4\xa3\xf5\x6b\x08\xfe\x80\xdb\x77\x7c\x80\xfd\x80\xbf\xef\x50\x37\x3e\xeb\xbb\xa2\xeb\xcb\xc8\x2d\x5d\xf7\x45\xf0\xba\x04\x4e\x7b\x3e\xb7\x78\xcf\xe5\xe0\xdf\x25\x30\xeb\xe4\x24\xfe\x2a\x81\xcd\xfa\x3f\x10\x32\xdf\xe8\xb6\xbf\x54\x9a\xa8\x6f\xac\xff\x1e\xe8\xf5\x51\x2b\x51\xee\xdf\xdd\x57\xe1\x7c\x0e\x38\xc2\x79\xf7\x25\xf8\xd9\xbc\x48\xce\xb2\x4b\x0f\x3f\xfd\x83\x3f\x48\xcb\x4f\x7f\xba\x23\xf9\xec\x9f\x13\xf6\x8e\x95\xe8\xb2\x7f\x26\xf4\x71\x4c\x03\x2b\x44\x0c\x8b\x15\x3d\x36\x6c\x62\xfb\xad\xbf\xbe\x47\x0e\x27\x74\xb9\xfe\x76\x62\xce\xd1\x5a\xfa\x43\x5a\xda\x34\x0f\xd4\x72\xcc\x9a\x5f\x13\x36\x55\x02\xd7\x17\xbb\xfc\xdb\x88\x7d\x8d\x4b\x43\xab\xf3\xc5\x13\x1a\x93\xea\xef\xde\x03\x84\x4d\x61\x77\xfb\x79\xe5\xaa\x04\x37\x3a\xfa\x25\xd6\x61\xbc\x8e\x3d\xfa\xc9\xf6\x94\xcc\x36\xe6\xca\xf0\xfd\xf7\xc6\x73\x8c\xf7\xd4\x31\xdf\x27\x74\x8f\x64\x0d\xdb\xee\xe8\x91\x87\xdd\x7d\xfa\x3c\x81\x17\x16\xa1\x9b\x35\x08\x9e\xe3\x76\x61\xba\xee\xcc\xa4\x5d\x27\xfd\x61\x49\xfd\xbd\x45\xd8\x97\x80\xc7\xfd\x26\xc8\x31\x2f\x3f\x53\xe9\xf6\x8f\x6b\x6b\x79\x7f\xef\xe1\x69\x76\x5b\x25\x6d\xae\x17\xbe\x9f\xc8\x4a\x93\x5c\xef\xca\xa0\x87\x0e\x42\x9d\xed\x8d\x9e\x7e\x4a\xa4\x5e\x9b\x1b\xda\xfa\x50\x38\xdb\x15\x57\x24\xb0\xc0\xf4\xb9\x6d\xe9\x84\xb1\x95\xa8\x8e\x42\x34\xf6\x9a\x57\x12\x1d\xe0\x53\x5d\xff\x4e\x2e\xe3\x00\x00\x82\xd5\xb1\x5f\x9a\x90\xa1\x2b\x5b\x80\xf4\x53\xe8\x89\xde\xd9\xc9\x33\x72\x7f\xfb\xe8\x4c\x89\xb9\x23\x37\xb4\xed\x16\xf6\xdd\x1c\xb3\x67\x69\x5c\x93\x29\xd2\x53\x43\xbc\xd3\x0f\xd2\xb5\x09\xda\x5c\x55\x27\xf8\x7b\xa4\x9b\x7f\x1f\x53\xe5\x8a\x04\x27\xe2\xbd\xdc\xfd\xcf\x98\x56\xbe\x4f\xd0\xac\x9d\xf8\x29\x22\xb8\xaa\x93\xdb\xac\xab\xae\xe8\xd1\xb5\x13\x5a\x58\xdb\xbd\x53\x70\x51\xa8\x53\xb3\x4b\x9d\xcf\xdc\xce\x2e\xfc\x88\x04\xd8\xa5\xbb\x6e\xbb\xf2\x90\xf9\x8b\x24\xec\x23\xaa\xf5\xd0\x57\x0c\x97\x0e\x0f\x7a\xbe\x3d\x2d\x73\x3d\xf3\x0c\xbb\xf4\xf9\xf6\xd0\xb2\x73\xe6\x9f\x93\x63\x17\xaf\xf9\xf5\x54\x6f\xfe\x4f\x4f\xc9\x27\xb8\x48\xe8\x6c\xdb\x3e\x41\xd8\xaa\x58\x7f\x7a\x25\xd7\xb3\x5f\x56\xc7\x06\x5a\xfb\x46\x8f\xbf\xab\xdc\x63\x4b\x0d\x6d\xc2\x95\x39\x57\x8e\x25\xb4\x4f\x3e\xc3\xe7\x1b\xe1\x1b\x89\x2f\xc7\xcc\x0d\xed\xfb\xf1\x84\x7d\xe8\xec\x33\xc6\xbd\xcd\xaf\x4e\x6e\x0b\xad\xfb\x2e\xa1\x8b\x39\x5d\xdc\x8b\xfe\x5e\x41\x61\x0c\xa4\x12\xba\x98\x96\x79\x9c\xb9\x83\x5d\x56\x78\x16\x1c\x02\xbe\x20\x8d\x9c\x3d\x27\xe4\x63\xff\x78\x7d\xc1\xfb\x67\x3e\xc1\x2e\x59\x71\x0a\xf8\x4b\xfb\xfd\xb9\xa3\x67\x6d\x69\xb7\x81\x9f\xe8\xf5\x58\x9e\x6f\x3d\x1e\xaf\xe7\x40\xc2\xa7\x63\x9c\xad\x85\x3c\xee\x2f\x6c\x57\x4f\x34\xba\xfa\xec\xcb\x5f\x02\xa4\x8e\x11\xae\xf1\xdf\x7a\x60\xa9\x4f\xaa\x33\x34\x7b\x75\xf5\xb5\xdf\xeb\xf9\x66\x55\xfb\xfc\xcc\x2d\xcc\xad\xe1\x18\xe9\x74\x2e\xe3\xfc\x91\x7a\xbf\xfd\x41\x92\xd7\xda\x48\x70\xe7\xbb\x84\xae\x8e\xed\x8a\x3d\x6b\xae\xfb\xfb\x39\xbf\x3a\xf5\xc8\x78\xb4\xc5\x2b\xb6\xe4\xc1\x19\xd7\x49\x5d\xbc\x4b\xbe\x7d\x69\x9c\x90\x47\x3e\x41\xff\xff\x48\x68\x2a\xb1\x09\x3f\x08\x31\xf0\xa7\x04\x8f\x8f\xce\x68\x8a\x38\xe6\x25\xfa\xea\xef\xf1\x7a\x8c\xf8\xbc\xb5\x17\x06\x3e\x86\x99\x93\x1b\xda\xfd\x31\xac\x8f\xef\xc2\xdf\xfc\x8d\xb0\x27\x9c\xc4\x2f\xbd\xea\x43\xfc\x0b\xdf\x49\xd6\x2a\x91\x36\xd7\xca\xbf\x12\xfc\xd6\xeb\xea\xe3\x6b\x3b\xe7\x06\xd7\x25\x7c\x38\x9c\xe9\xd2\xe5\xef\xb7\xce\x59\xb8\xe8\xec\x4f\xe4\x98\xfd\x17\xc7\xeb\x89\x71\x70\xf9\x7f\x85\x78\xf4\xd2\x60\xb2\xce\x8e\x3d\xb3\xb4\x01\x72\xcc\x96\x23\xe3\xfd\xbf\xac\x3d\x3b\xb3\x09\x9f\xdf\x2f\xfd\xfe\x5b\x39\x66\x95\xdc\xff\x01\xc1\x6b\xba\xe7\xd3\x27\xf4\xf8\x7d\xec\xce\x59\xf0\xea\xcb\x7b\xec\xae\x70\xef\x4b\x3d\x34\xd1\xa5\x23\x0c\xd9\xd5\x4a\x42\x93\xe7\x65\xd6\x85\x7b\xec\xfe\xe2\xda\xf1\xf9\xd7\x49\xb3\x22\xcf\x31\x61\x43\x58\xb9\xa1\xb5\xdf\xea\x81\x7b\xb5\xd7\x16\x59\xf9\x17\x40\xca\x88\x44\x16\xbc\xfc\x6b\x02\x17\x4a\x04\x2e\xfc\x99\xe0\x07\x51\x1d\x1c\x9c\xf7\x60\xed\x3f\xf5\xc8\xb2\x04\xa7\x56\x5f\x49\xd8\x76\x3a\xd1\xcf\x9f\xe2\xf6\xcb\xd0\x03\x99\x97\x19\x33\xb7\x0c\x73\x94\xed\x12\x38\xeb\x16\x76\xd9\xe8\x9f\x00\x40\x7f\x5e\xb8\xe9\x34\x9f\x5d\x32\x7a\x5b\x7b\x1c\x5a\x12\x38\x8d\xc5\x7e\xd2\x28\x1f\xbd\x05\x0e\x07\x23\xe0\x12\x70\x5d\xc7\x4f\x1a\x5f\x95\x1b\x99\xda\x3f\x7d\x4e\x6c\xea\xcc\xc6\xaa\xf1\xec\x39\xcc\xf4\x61\x6e\x66\x68\x0e\x45\xd7\xea\x66\xf7\x0f\x86\xea\x71\xba\x27\x19\xd3\xf0\xf4\x28\x54\x6e\xea\xec\x7e\xac\x47\x47\x89\x71\x68\xcb\xe7\x38\xaa\xe9\x8c\x6b\x2e\x95\x17\x6a\x8e\x53\x55\xab\x36\xf2\xca\x79\xce\x10\x79\xcd\x2f\xf2\xb0\x04\x8b\x52\xa9\xa6\x89\x79\x87\xe3\xca\xc8\xa8\x14\xc5\xf2\xb8\x43\x35\xf3\x59\x37\xcb\xd2\x52\x60\xd4\x60\x45\x09\xaa\x75\xb9\x10\x38\x12\xac\xfb\x81\xe5\xba\xb0\xe9\xc1\x86\xe3\x8c\xd5\x18\x4b\xe0\xf2\xad\x0a\xe5\x07\x2a\x2d\x08\x81\xa4\xdb\xa6\x62\x8a\xaa\xc1\xe5\x65\x49\x72\xb2\xba\x68\xe4\xb3\xae\x2c\xf1\x22\x6f\x88\x92\xad\xb9\x3c\x9f\xe7\xf2\x8e\x29\xb8\x6a\xbd\xa1\xb8\xbc\x85\x0a\x25\x28\xa2\x72\x09\x19\xf2\xc1\x32\xe7\xc5\x8e\xad\x2a\xb6\xb9\x8c\xc3\xbc\x18\xc2\xbd\x71\x42\x8e\x59\xfe\xdd\x7a\x83\xc0\xe5\xee\x7e\x34\x08\x9e\x45\xc8\xa8\xa4\x1e\xd2\x44\xf9\x78\x52\xd2\x7f\x0f\x2f\xdb\xb2\x3d\x7c\xba\x65\x1b\xb6\x65\x6e\x69\x4f\xcb\x7c\x85\x59\x9b\xdc\xe6\x9f\x0b\x6e\x03\x77\x46\x3b\x16\x6d\x0e\x91\xac\x28\xba\x48\x81\xcd\x54\x5c\x0f\x37\xaa\x36\x32\xd8\xf1\x70\xe3\xec\x76\x49\x16\x00\x7a\xf6\xd4\xc1\xfe\xc1\xdc\xc0\xc8\xd4\x01\x2a\x73\xd4\xec\x33\xe2\xdb\x4e\x78\xe3\x29\x1a\x07\xe7\xc6\x57\x69\x9e\xd4\x59\xb6\xc1\xe6\x6d\x2e\x0f\x55\xe4\x42\x19\x15\xa1\x82\x0a\xd0\x6a\x55\x1d\x41\x90\x7d\xe8\xa3\x3a\xce\xd2\x93\x47\x75\x6a\x20\xb1\x88\x82\xc3\xe1\xcb\xeb\xe0\x5a\x74\x2b\x0c\xd8\x75\x2c\x0c\xd0\xa1\xdc\x5c\xe3\x32\xc7\x5c\xa7\x2c\x91\xd8\xa7\xf3\xcb\xd4\x17\x97\x19\xeb\xae\x7d\xed\xde\x9b\xf9\xf1\x87\xe0\x7b\xe8\x13\xe9\xf2\xbd\xb2\xbb\x50\xa7\x8f\x51\xb9\xbc\xc0\x0b\x92\x6c\xaa\x86\xa2\x2b\xa6\x00\xeb\x22\x67\x3a\xa6\xaa\x96\x14\xa5\xa8\x30\x87\x54\x5f\x41\xbf\x81\xc7\xbe\x82\xfe\x7c\xdf\x7d\xf7\x3d\x0c\x6f\x44\x1b\x4c\xb4\xf6\x07\x5f\x87\x87\xf1\xe8\x33\x3f\xf8\x4e\xe5\xc8\xca\x13\x3f\x7b\xf8\xb6\xdb\x1e\x7e\x16\xa6\x61\xd9\x7c\xb8\x72\xfb\x5d\xe7\x98\x37\x25\xf9\x93\x8d\xdc\xd0\xea\x4b\x27\xc8\x11\xb1\x87\x96\xff\x18\xb7\xcf\x6f\x9f\x9e\x79\x83\x79\x98\x5d\xba\xea\xa5\xeb\x7e\x32\xff\x9b\xe7\xf6\xe7\x16\xef\x59\xb6\xf3\x56\x09\xcc\x5b\x94\xc8\x06\x7c\x5f\x63\xcf\xb2\x5a\x36\xc7\xac\xdb\x9e\x9f\xa0\xeb\xc4\xfd\x75\xec\x08\xbe\xcb\xc7\x5c\x90\x63\x56\x1f\xc3\x76\xf9\x12\xb6\xa5\xd6\x60\xc9\xbe\xf2\xbf\x13\x7e\xac\xf6\x9c\xc7\x74\xfc\x17\x1c\x3e\x0f\xb6\x72\x43\x7b\xb7\xf2\xd8\x97\xef\x74\xe5\x61\x57\xe6\x0f\xbd\xf0\x5d\xdc\xdb\xef\x09\x7e\x92\xe0\xdd\x0b\xdf\x4b\xf8\x8f\x1a\xf9\x4e\x22\xfe\xb3\xf2\x83\x04\x26\x97\x62\x1f\xf9\xd2\x8d\x1f\x01\xb4\x04\x16\x1e\x93\x5b\xba\xf1\x10\xd0\x90\xc0\xc2\x7f\x8e\xac\x8f\x44\xc7\xe8\x9e\x1b\x6f\x8c\xbf\xbd\xa4\x7d\x76\x66\x1b\xf3\x25\x76\xd9\x9e\x65\xed\x6f\x83\x27\xe7\xff\xf5\xec\x0b\xd9\xc5\xab\xaf\xd7\xe0\xfc\x1d\xe7\x9d\x16\xeb\x1a\x06\x41\x33\xff\x87\xd0\x11\x09\xf9\x53\x78\x8e\x90\xc1\x04\x8d\x15\x96\x27\xfb\xb3\x28\xb3\x9d\xf9\x38\xbb\xf4\xf9\x1f\x9e\x94\x5e\x08\x16\xbe\xc5\x2e\xde\xb3\xec\x6b\xf9\xb3\x6f\x59\x70\x76\xb2\x66\xc2\x0e\x59\xfb\xf5\x64\xcd\xb1\x7d\xe2\x3d\x4d\xc8\xd9\xf7\x09\xdd\x32\xd1\xa7\xd7\x7e\xad\xc7\xa6\xb3\x63\x39\xcb\xac\xbe\x24\x99\x9b\x48\xcc\x6d\x68\xe3\x1a\xec\x85\xf8\x4a\x82\x57\xf8\x19\xde\x89\x78\x9c\xf8\x99\x8d\x71\x2e\x81\xdd\xca\xfa\x44\x9b\xf7\x25\x9c\x1b\x64\xe5\xef\x12\xbe\x71\x69\x66\x03\x73\x23\xbb\xd4\x5d\x7d\x52\x7a\xc1\x23\x12\x60\x17\xef\x59\xca\x80\xf9\x8a\xd4\x95\x23\x78\x1f\x5f\xe2\xc2\xb1\xe2\xdd\x7c\x2f\x59\x2f\xce\xa3\xff\xc5\xfe\xce\xa9\x28\xce\x0d\x76\x41\x7b\x76\xe6\xbe\x38\xe7\xd0\x19\xe0\x62\x70\x19\xb8\x12\x5c\x0b\x74\xf0\x28\xb0\x01\x80\xb3\xe3\xdb\xb4\xd3\xf1\x65\x70\x0a\xdf\xf4\x9c\xde\xb9\x43\x1e\x33\x9a\x48\x44\x74\x62\xa7\xd3\x38\xcc\x9d\xb8\x14\x39\x1f\x66\x86\xe7\xce\x99\xdd\x0f\x07\xfb\x07\x43\x26\x35\x77\x70\xce\x60\x9a\xac\xa3\x1a\x0a\x9b\x81\x58\xc0\xc4\x52\x65\x7a\xff\xf4\x39\xd3\x61\x7c\x29\x2c\x64\x59\xa9\xdf\xfd\x2a\xbb\x22\x0b\xda\xbf\x5b\xf0\xc3\xbb\xb6\x48\x67\xea\xd7\xdf\xff\xc7\xfc\xcf\xa8\x8f\x48\xe7\x3c\x78\xf2\x45\xe3\xab\xbe\x00\xff\x82\x0e\xa7\x3e\x35\x7d\x91\x3e\xf7\xb0\xd6\x6b\x9f\x7e\xdc\x80\xb7\xc1\xdf\x4c\x41\x8f\x5d\x71\xc5\x1f\x32\x99\xec\xa7\xb3\x3a\xfa\xdb\xd7\xf4\x8d\x53\xf6\x3d\x8e\xfe\x93\xbe\xb6\xb5\xf5\x7c\xea\x87\xc1\xc8\x17\xe0\x1b\x68\x1e\xf5\xdc\x45\x57\x9c\x79\xfe\xf1\xb7\x9c\x3a\x33\xd8\xf9\x85\x1f\x5c\x71\xfc\xf1\xfa\xa9\xc7\x9f\x79\xca\xf1\xf7\x1e\x75\xfc\xf9\xdb\x3f\xbd\x01\x7d\xdb\xa1\x04\x8f\x12\xdd\x03\x15\xfa\x9e\x1f\x36\x9b\x3f\x7c\x24\x78\x17\xbd\x7d\x3f\x3c\x0b\x5e\x80\x5a\xed\x47\x6e\x86\x27\x51\x22\xfc\x9b\x6a\x8f\xdc\x7f\xf7\xb3\x73\x96\x9d\xb2\xec\xb2\x39\xa7\xce\x38\x13\xcd\x40\xd7\xa3\xd7\xcf\x83\x32\x7c\x8c\x1a\x7e\x70\xe9\x69\x99\x23\x0f\x3f\x26\x73\xce\xe0\x4d\xe7\xf0\x23\xc7\x1c\xb9\xec\xc8\x73\x4f\x45\x7f\xd3\x86\xfe\x70\xc5\xf9\xdf\x46\x3b\xcf\x3f\xff\xf0\xbb\x98\x39\x6f\xa3\x47\xe0\x7b\x3f\xe6\x4f\xe4\x47\xce\x39\x67\x64\xf0\x24\xfe\xda\xad\x5b\x99\x85\x76\xb1\xe8\xa0\x26\x00\x34\xa8\xb6\xad\x8c\xc2\x70\xe0\x23\x60\x2a\x38\x0e\xdf\x6d\xa4\xf1\x5e\xe4\x26\xfb\x45\x89\xae\x53\xac\x3a\xbe\x53\x2b\x53\x05\xd7\xf6\xcb\xb6\x6f\x57\x8a\x54\xc9\xb5\xbd\x4a\xd8\x5a\x62\x38\x11\xc9\xa8\x84\x6c\xa4\x6b\xb0\x0a\x1d\x68\xc1\x82\x88\x14\x54\x42\x0e\xd2\x54\x58\x81\x0e\x34\x61\x31\x7a\xc7\x41\x7a\xd8\x62\x41\x0b\x00\x0a\xde\xd6\xb6\x98\xbf\x31\x33\xf1\x3c\x26\x9d\x05\xf5\xbd\x64\xec\x54\x5f\xf2\x93\x99\x79\xd0\x80\xfb\x26\xb6\xe0\x58\x39\xa3\xad\x30\x35\x1c\xaf\x7f\x68\x1c\x73\x3d\x1d\xce\xee\x63\xe1\x70\xae\x2f\xfc\xcd\x48\x9e\x37\xce\x7b\xa8\x61\x37\x29\xcd\xf3\x18\xe5\x00\xcb\x94\x03\x31\xb0\x90\xa1\x43\x8b\xe2\x29\x77\x4c\xc4\x77\xea\xd5\xb6\x90\x61\x19\x33\x8e\xfa\xef\x8f\x6e\x97\x45\x3d\x81\xbe\x24\xd2\xbf\x93\x35\x23\x49\x6d\x02\x8b\x5e\xb8\x5c\x25\x55\xf4\xbc\xc0\xf6\x3c\x68\x9a\x8a\x27\x1b\x2d\xe0\x4a\xaa\xad\x51\xba\x26\x79\xa2\xca\x98\x2d\x3d\x28\x21\xc7\x85\x12\xac\xd2\x6e\xb3\x92\xc9\x1e\xe0\xd2\x0a\xaa\x22\x5f\x86\x3a\xe4\x04\x01\x69\x6d\xa0\xc3\x3c\x54\x50\x0d\x15\x64\xa8\xc1\x3c\x88\xef\x44\x46\xf4\x8c\x73\x33\xad\xfc\x6d\xec\x6b\xd6\xdb\x46\xc6\x63\x04\x40\x83\xc3\xf1\xed\x84\x53\xa3\x9c\x83\xe9\xce\xa5\xff\x91\x99\x93\xfc\x82\xc4\xa5\xd5\x06\x23\x1c\xa8\x40\xc1\x35\x5d\xcf\xf4\xac\x4a\x89\xf2\x5d\xc3\x76\x0d\xcf\x2a\x85\x9b\x6e\xb9\x05\xd3\xb3\x6b\x95\x71\xc0\x28\x41\x9e\x56\x9a\x65\x5a\x0e\x44\x46\x70\x25\xb1\x60\xdb\xae\x5a\xf6\x0b\xe5\x49\x7e\x05\xbe\x8b\x74\xd7\x85\x6e\xac\x6b\xaa\xf1\x3d\xa8\xeb\xc2\xb9\x5f\x78\x3b\xa1\xbf\xe3\x73\x87\xb5\xaf\xe3\x35\xfd\x26\xf6\xb9\x46\xe7\x72\x4e\xa2\xa7\x9c\xd6\xc9\xab\x13\x91\x76\x74\x08\x9f\x22\x32\x31\x47\x75\x72\xa6\x4e\x9a\x6c\x2a\x56\x3c\x78\xba\xe1\xe9\xae\xae\x55\x03\x8b\x16\x03\x0d\x72\xd0\x53\x91\x80\x2a\x1e\xaa\x23\x49\x87\x36\xe4\x03\x9d\xe6\x03\xcb\x85\x75\x94\xa7\x6c\x58\x1f\x77\x3a\xbf\x02\xd3\x52\x6c\xd9\x46\x5e\xf8\x1f\x2b\xcd\x15\x4a\xaa\x67\x06\xbc\xe6\x56\x34\xdf\x81\x3c\xca\xc3\x2a\x6a\xb8\x8e\x51\x75\x35\x58\x70\x5d\x17\xc9\xae\xeb\xd2\x79\xdd\x52\x4c\x43\xc2\x7f\x83\x23\x21\x88\xf2\xce\xe2\x3b\x83\xc7\x00\x0e\x9c\x0a\x46\xc0\x42\xb0\x08\x67\xe3\xbd\x16\xdc\x06\xee\x01\x0f\x81\x47\xc1\x67\x81\x0d\x56\x82\xaf\x80\xcd\x91\x56\x36\xd1\xab\x1c\xe7\x00\x89\xb3\x2b\xce\xce\x75\x6f\x96\xc3\xd9\xf8\x82\x54\x7a\xb8\xfb\x23\x72\x3a\x93\x30\xf8\x7f\xfc\xec\x7f\x44\xa5\xb4\x6c\xa8\x76\x4d\x75\xfd\x86\xaf\x58\x8e\x69\x29\xa5\x62\xa9\x25\xe1\x74\x9d\x29\x6f\x5c\x73\x6c\x43\x35\xad\x54\xd6\xc9\xca\xf9\x7c\x3e\x6b\xb3\x9a\x52\x1b\x6b\x3a\xb5\x42\xbe\x8a\x6a\x12\xe5\x39\xcd\x62\xbe\x86\xca\x12\x14\x2c\x5d\x35\xcc\xc0\xc1\xff\xa1\x9a\xa6\xae\xea\x66\xd0\xf8\xff\xf4\x75\xd5\x94\x55\x5d\x31\x6c\xbf\x40\x99\xa6\xac\x6a\x8a\x61\x7b\x05\xca\x08\x7f\xaa\x61\x6b\x8a\x93\x04\x51\xd1\x44\x51\xe1\x8c\x3c\xcf\xe5\x75\x41\x14\xab\x81\x6e\x41\x37\xa8\x4a\x8a\xa1\x4b\x2a\xaa\x34\x35\x9d\x2b\xdb\x54\x39\x28\x0b\x82\x25\x89\x12\xe5\x04\x25\x51\x34\x65\x49\xa2\x1c\xfc\x8e\x81\xff\x96\x44\xc5\xd0\x24\x28\xfd\x3f\x7d\x96\x2e\x68\xb2\x24\x4a\xa6\x65\x58\x7a\xf2\x4b\xd3\x64\x11\xff\xc2\x97\xfa\x20\x30\xdb\x76\xc6\x66\xb2\xe0\xd0\x88\xbe\x3b\xd4\x5b\x66\x8c\x80\xa5\xa5\x66\x83\x16\x02\x8e\xc9\xba\x63\x05\xd7\x4d\x2b\xb8\x8e\x94\x9d\x31\x19\x13\x1c\x4b\x66\x03\xa1\x32\xc4\xa7\xb8\x6a\xc0\x60\x01\x36\x79\xd6\x65\xf3\x74\x73\xbc\xa6\x18\x29\x3b\x28\x50\xd5\x03\x36\x0d\x50\xde\x2e\x98\xd0\x76\x90\x90\x56\x1c\x97\xb3\x2d\x17\x35\x4b\x6e\x50\x76\x5d\x4a\xac\x15\x4d\xe8\xc3\x6a\xa2\xcf\xd8\x0c\xc8\x0d\xed\x8e\x6a\x2a\x44\x77\xb5\x29\xc8\xe3\xf9\x0a\x31\x27\xc6\xd7\x57\xa2\xbb\xf2\x53\x07\xfb\x06\x33\xda\x98\x9e\x06\xe3\x20\x5d\x3a\xe0\x79\x29\x6d\xdc\x63\x04\x17\xb9\x81\x86\x1c\x97\xf1\xc7\x9b\xd0\xe8\xea\xa1\x1e\x93\xcd\x0d\xed\xc4\x51\xa6\x3b\xf1\xb9\x2a\x48\x81\x7f\x6e\x5f\x99\xb9\x82\xb9\x13\xd0\xf1\x9d\x2c\xcc\xe9\xa7\xf6\xc7\x6b\xc3\x63\x44\x99\xb7\x98\xe7\x56\xad\xfa\xca\xd8\xa7\x52\xcd\xf1\x6c\xfa\xb5\x03\xdb\xd6\xa5\x3e\x3e\xbe\xe5\x27\xcc\xd5\x07\xb6\xc3\xd1\xa0\x94\x19\xf8\xec\xb7\xd0\xa2\xe2\x67\x53\x23\xc1\xe7\xbf\xd5\x7a\x1f\x17\xf3\xa7\x81\xd5\x2e\xe0\x3b\xc5\x87\x82\x3c\x98\xd9\x0b\x6b\x48\xc5\x49\x2a\x8e\x9a\x9a\x19\x9a\x49\xfe\x4f\x85\xb1\x03\x40\x8b\xcd\x26\x2d\x04\xf9\x74\x56\x33\xad\xaa\xee\x71\x62\xa9\x68\x59\xe3\x8a\x66\x44\xff\x57\x2c\x9a\x36\xc3\xbb\x63\x45\xd7\x4d\xcb\x01\x87\x6a\x25\x13\x5a\x94\xcc\x57\x4a\x35\x54\x33\xeb\xf5\x89\x0d\x20\xbe\xf3\x3e\x8c\x6b\x8d\x87\xb3\x59\x84\xef\x16\x60\xe2\x65\x32\xcc\x74\x7c\xa1\xbd\x1f\x17\x89\x3c\x1a\xa6\xc3\x89\xce\xc5\x89\xc6\x70\xdd\x21\xac\x59\x1d\x99\xc1\x69\x4c\x72\xe9\xcc\x0c\x3a\xca\x6e\x1c\xdd\x88\x66\x0c\x49\xe4\xb2\x5e\x56\x14\x3c\x4b\x46\x96\xe5\x18\x8d\x56\x99\x2a\xa1\x5a\x33\x8f\x2a\xc8\x11\xa1\x88\x1a\x3e\x65\x78\x94\x1d\x18\xd9\x2c\xcd\x05\x52\x99\xe2\xd5\xa0\x58\x73\x03\x53\xa5\x24\x27\x50\xa9\x2a\x17\x38\x8c\x19\x7c\xed\xcc\x59\x2b\xa7\x6f\x38\xfb\xb4\x39\x97\xc3\xbf\xfe\xe1\xc5\xd2\x25\xd7\x3e\x02\xf3\x70\x80\xb9\x03\x3d\x38\xeb\xd6\xcb\xcf\x7e\xe0\x34\xe8\xb7\xfe\xe1\x79\x8f\x5d\x92\x59\xb4\xf8\x51\xd4\xbc\x65\xf9\x63\xf0\x0e\xb4\x63\xdd\xe7\x96\xff\xe5\xd1\xeb\x6f\x39\x31\xdc\xcb\xcf\xb4\xcf\xcf\x3c\xcf\x7c\x1a\x0c\xe0\xec\x69\xe7\xe3\x5c\xb2\xb3\xfb\x7b\x62\xdc\x29\x9c\x56\xa7\x53\x3f\x25\xca\xd5\xcc\xa4\x3a\xcb\x99\x3b\x88\xa5\x71\x68\xac\x8e\x74\xd6\x4f\xff\x0c\x0e\xaf\x81\xfb\x6e\x5d\x7e\xd6\x45\x83\xd7\x9d\x7d\x56\xfe\x23\xe8\x4f\x1c\xaa\xdc\x87\x06\xd1\xbb\x81\x9b\x7e\x20\xb8\xe7\x04\x7a\x49\xf0\xe0\xf7\xe0\xaf\x2e\x0b\x7e\xfd\xce\xe2\x25\xe8\x72\xf4\xe3\x9b\xa8\xe3\x76\x06\xb7\x53\xef\xe7\x33\xc1\x37\xa8\x45\x8e\x13\xcc\xa2\x5e\x3b\xb0\xd9\x1e\x40\x3b\x90\x7a\x3c\x1c\x41\xef\xa6\x37\xbf\xf5\x56\xf0\xe7\xb7\xa6\xbd\x34\xed\x21\x38\x07\x5d\xb2\xe1\xa1\x97\xe0\x92\xe0\xfc\xcf\x3d\xba\xfc\x95\x45\x6b\xee\x86\x47\xad\xfc\xf9\x94\xd1\x81\xca\xf2\x05\x0b\xe0\x39\x41\x29\xfd\xd1\x87\xd0\xf1\xc7\x4e\x7f\xec\xaa\x85\xa3\xd3\x61\x10\xd7\x75\xb3\x33\x06\xe3\x80\x39\x51\x65\x1d\xb2\x92\x5b\x37\x79\x24\x41\x9a\xdd\x9c\x91\xf8\xaf\xa1\x61\xca\x53\x25\x68\xab\x42\x51\x94\x61\x21\xe0\xd9\x3c\x55\x0a\x58\x99\x2e\x8e\x37\x25\x39\xc5\x05\x1e\x55\x3e\x50\xa1\xca\x48\x29\x55\x54\xa8\xd4\x83\x26\xa5\xf3\x7c\x50\xa0\xac\x3c\x1b\xf0\xd0\x13\x44\xc6\xd1\x4d\x53\x17\x35\xd9\x55\x55\xa7\xe0\x1a\xaa\x8b\x1a\xae\x0b\x59\x5f\x71\x6c\x28\xb9\xb2\xee\xa8\xaa\xab\xc8\x80\xac\x51\xbd\x05\xe7\x2f\xdd\xf2\x4b\xc2\x67\x14\xb5\xe3\xfb\x72\x9b\x31\x6b\x02\x10\xb2\xf8\x5c\x87\x8b\x6a\x48\xc6\x77\xd4\x06\xb9\xb9\x33\xe6\x62\x7f\x40\xe7\x9a\xda\x20\x64\xd3\xb6\x37\x5e\xf1\x60\x1d\xf2\x2c\x04\x1c\x97\xf7\x78\x45\x0c\xac\xa0\x58\x4b\x55\xc6\xf3\x0c\xd7\xb2\x8d\x40\x12\xb8\x2c\x9b\x17\x61\x56\x45\x15\x59\x94\x0d\xda\x0e\x19\x0d\x04\xa5\xb6\x95\x31\x99\x2c\x38\x1e\xdf\xf3\x8f\xc7\x38\x63\x64\x4e\x94\x9e\x87\x19\x9c\x1e\x0e\x82\x6f\xc2\x95\xd2\x25\x6f\xbc\xee\x42\xa7\x56\xf3\x14\x21\xeb\x89\xb5\xc0\xf1\x90\x5b\xf2\x52\xf9\xb1\x1a\x93\x6d\x19\x56\x60\x8b\x7c\x36\x2b\xfa\x8e\x84\x5c\x53\xd5\x53\x2a\x6a\xc2\x1a\xae\x21\xe9\x60\x1e\xdb\x0f\x8e\xc6\x94\x76\xd4\x60\x72\xd1\x6e\x18\x2f\x61\x7a\xb4\x8e\x92\x01\x2b\x94\xec\xb0\x9e\x60\xa9\x81\x15\xd4\x54\x3d\x6d\x78\xe3\x95\x94\x40\xd5\x03\x57\xc8\x6b\x65\x11\xd5\x65\x91\x13\xcc\x74\xa1\x65\xea\x94\x8d\xd8\x88\x96\xeb\xb8\xce\x48\x16\xe7\x2b\x38\x61\xe2\x3a\x46\x92\x65\xc0\xc1\xbe\x93\x60\xdf\x60\x5f\x3d\xdd\xf4\xc6\x65\x0f\x96\xeb\xf5\xa2\x96\xf7\xc4\x4a\xa0\xfb\xc8\xaa\x51\x7e\xd0\xa4\xb2\x54\x21\x68\x84\x8b\x51\x03\x57\xe0\xb3\x59\xab\x2e\xa3\xa2\xa5\x6a\x69\x29\x7c\x18\x34\x31\x9f\x54\xdb\x7a\xc6\x63\x14\x30\x05\x9c\x88\xef\x56\xe3\xfb\x70\xd8\xde\x8a\x0c\xad\x19\xc9\x1a\x99\x64\x97\xe8\x78\x70\xa6\xaa\x05\x7e\xab\x9a\xf6\xc7\xd4\xba\x59\xa2\x15\x64\x69\xd0\x80\x65\x83\xf5\x78\x4d\x0e\xea\x88\x73\x52\x05\x0f\xb9\x50\x47\x00\x39\x8c\xe2\xc8\x59\xd7\x6d\x06\x75\x24\x1a\xd0\x87\x65\xaa\x98\x1d\x97\x51\x93\xcb\x4b\x96\x58\x14\x05\xd9\xa0\x95\xa0\x02\x3d\xd4\x80\x2c\x6a\x10\xe7\x04\x1c\xbb\x74\x8b\x43\x83\xf9\x7f\x94\x40\x6e\xf1\x1a\x0b\x1c\x21\x81\xf3\x86\xe3\x9c\x06\x1a\xbe\x2f\x7d\x06\x18\x89\x32\xb2\x4c\x25\x33\x7c\x44\x7c\x60\x68\x38\xe4\x7f\x47\x0d\x9e\x31\x37\x4e\xf1\x81\x91\x20\x24\x1e\x1c\x59\x11\x65\x91\x1e\x1c\x1a\x1e\x64\x32\xfd\x83\x73\x2a\xd0\xf5\x60\x1d\xa7\x95\xa5\x58\x04\xaa\x90\xd7\x5c\xbb\xa5\x58\x50\xf5\x7d\x4b\x61\x3d\xde\x47\xc0\x41\x95\xa2\x6b\xe8\x50\x2c\x23\x40\x65\x91\x4e\x89\xa1\x12\x68\xd3\xac\xaa\x20\x51\xd1\x68\x36\x5d\x2a\x16\x8b\x45\xb7\xea\xd6\x6d\x5f\x35\x91\x53\xe2\xf9\xac\xe4\x4a\x55\x55\x51\x29\xd9\x10\x1d\xa7\xe1\x56\xab\xd5\xa0\xac\xe9\x46\xbd\x52\xc1\x36\xb3\x96\x71\xd2\xd5\xdc\xd0\xde\xa5\x75\x90\x63\xb6\x49\x35\x3f\x96\x6d\x5a\xe4\xf3\xf1\x7d\x1c\x6b\xf2\xf5\x58\xf7\xdd\xd4\xbe\x28\xe3\x30\x1f\x8f\xf3\xd6\x0d\x82\x99\xb8\xe6\x72\xa4\xd3\x87\x2a\xef\xa9\xf8\x4e\xe3\x0c\xd8\xdf\x4d\x6c\xd2\xd9\xb8\xfe\xc1\xf4\xa4\xad\x9b\x98\x5f\x1e\x98\x9e\x32\xa0\x00\x59\x19\xd5\x50\x0d\x01\xad\x0d\x50\x59\x81\x79\xfa\x50\xa1\xd4\x94\xb2\x2e\x67\xa0\x22\xaa\x6a\x54\xc5\x45\x1a\xf4\xc6\x1a\x7c\x6f\xab\x13\xb6\x52\xe7\x3d\xf7\x35\xc3\x73\x4b\xba\x65\x96\x4c\x57\x4d\x9d\xfe\xe0\xc9\x7d\x27\xdf\x76\xf6\xba\xab\xce\x7f\x90\x7a\x0a\x4d\x85\xcb\xde\xfd\xc2\x41\x2d\x78\x9d\x7a\xe4\x07\xd9\x0a\xb0\x8e\x8f\xfd\xd8\x80\x01\xbf\x6b\x5f\x94\x31\x99\xeb\x12\x7d\x78\x06\xd6\xf0\xa3\xfd\x24\x13\xce\x84\x72\x6d\x76\xb8\x8f\x38\xaa\x36\x54\x1e\x66\xce\xee\x8b\x12\x0e\x25\xc9\xb9\x70\x6e\x2e\xe6\xcd\xb1\x6f\x6c\x85\xef\x53\x57\x08\x1c\xb7\x9a\x5f\x1d\x2c\x0d\x36\x57\xa9\x57\x02\x44\x51\x1e\x45\x05\xe8\xd9\x00\x6d\xdf\x0e\xaf\x45\x5b\xa9\xcf\xfb\xf0\xf8\xd6\xed\xe8\x17\x68\xcb\x89\x17\x07\xf7\x9c\x9c\xf5\xd9\x3d\xe8\x31\xff\x1e\xe6\x3a\x74\xe8\xfa\x8f\x9e\x78\x4c\xdf\xd3\x37\xae\xbf\xf4\xea\xa5\xd4\xb7\x9d\x9f\xfe\xb4\xf5\xcd\x60\x9e\x49\xcf\x0f\xbe\x07\xb7\xaf\x42\x63\x97\x7d\xea\xcb\x8f\x5c\xbb\xe2\x94\x63\x8e\xb9\x63\xed\x99\xe8\x4f\x9f\x5b\x7c\x47\xf7\xec\x48\xcd\x0d\xbd\x74\x02\x5e\xdf\x7f\x45\x3c\x11\xc7\x0f\xb3\x8c\x8d\x73\x61\x1e\x94\xd8\x2f\xbe\x05\x9c\x61\x0d\x5d\x77\xf8\xa2\x26\x05\x75\x3f\xa8\x7b\x54\xd1\x4f\xab\xe3\xbe\xa6\xe7\xbd\xbc\x42\xbb\x63\x76\xda\x1c\xb7\xd2\x79\x28\xa0\x4a\x2c\x43\x64\x5c\x97\x9b\xeb\xdc\x09\xee\x3f\x38\x67\x60\xdf\xf4\x28\xf9\x28\x5d\xf6\x68\xbe\x55\xa5\x8a\x96\x25\x2a\xbc\x21\xea\x41\xdd\xc3\x43\xb4\x3c\x5a\x63\x8c\x86\xd7\x68\xd5\x34\x9d\xf5\x58\x85\xd2\xc6\x1b\x29\xb6\x55\xa4\x6b\x0d\x2f\xe2\x53\xf7\xb4\x2f\xcb\xac\x65\x0e\xc3\xf9\x44\x26\x9b\x3f\x1d\x27\x0a\xca\x4c\xf9\xe4\x83\xca\x27\x8f\x5b\x7e\xa1\x3a\x7e\xdc\xca\x35\x19\xa1\x59\xa1\x3f\xe6\xba\xa9\xfb\x83\xd3\x6f\xbc\x9a\x5d\x3e\x65\x11\x75\x6a\x40\xd1\x4f\xc2\xd5\xee\xd4\x03\xe5\x70\xfe\xc5\xb6\x94\x11\x19\x09\xd7\xd1\x9d\x1c\x26\x38\x8f\xec\x40\x2a\xdd\xc7\x54\x0d\x43\x31\x78\x57\x96\x11\xe7\x23\xce\xa3\x2c\x54\x44\xb6\x48\xb3\x74\x5e\x45\x05\x64\xa4\xc4\x56\x21\x9e\xbe\x33\xee\xa5\xb4\x96\x4f\x37\x60\x3e\x9f\xf5\x0c\x4f\xc8\xa3\x1a\x20\x6a\x1b\xdb\x60\x7a\x94\xa1\xbe\xe3\xe2\xee\x9b\x90\x0f\xbb\x33\x3a\x5d\x68\x95\x69\x81\x17\x7d\x99\xa3\x85\x56\x99\x32\x6c\x4b\xd6\x79\x5b\x16\x45\x24\x78\x48\xf0\x28\x23\x55\x75\x4d\x93\x77\x6c\x17\x35\x02\x0e\x0f\xcf\xf3\x14\xd7\xca\xd3\xf5\x56\x9d\x2e\xe0\x31\xd5\x28\x76\x00\x9c\x44\x54\xaf\x65\x32\x51\x78\xd7\x24\x4b\x8e\x94\x70\x9b\x92\x65\xd1\xd3\xe8\xc6\x78\x59\xb1\xa0\xe7\x51\x92\xa1\xab\x06\xef\x2a\x12\xd2\x3c\xa4\x7b\x96\xa7\x43\xa9\x8e\xb2\x69\xc3\x76\x84\xba\xeb\x95\x43\x94\x08\x8c\x28\xb5\x23\xac\xb4\x0c\xda\x09\xf2\x54\xd1\xb3\x75\xa8\x40\x8f\x38\xb3\x33\x73\x43\xfb\xf0\x89\xe9\xee\x37\x88\xf3\x26\x39\xa4\xc7\x9d\xb8\xfe\xe1\xee\x39\x3d\xf1\x1f\x66\x6e\x68\x2f\xbe\xc3\xbe\x53\x8b\x75\xed\xcf\xb7\xe5\xcc\x4e\x66\x65\x2c\xb3\xc4\x8e\x7e\x16\x65\xd9\xe9\x20\xdb\x9c\x8e\xc5\xdd\x3f\x38\x67\xea\xe4\x28\x39\xbb\x1f\xde\x48\xa9\x1e\xa5\x37\x1a\x81\xeb\x05\x1e\xa5\xb5\x2a\xb4\x10\xf8\x54\x13\x96\x91\x08\xcb\xff\x61\x18\x82\xc4\x6b\x82\x8c\x80\x8f\x33\x28\xfb\xcc\x21\xb6\x8d\x4a\x2e\x2a\xb6\x4c\xda\x76\x0b\xae\xef\xfb\xa8\x54\x28\xa0\x23\x90\xa4\xe9\xac\x9b\x55\x20\x08\xbb\x41\x2c\x65\xc7\xb9\xad\xab\x1d\xdf\xf4\xce\x4f\xf4\xac\xcd\x89\x72\xd3\xe5\x86\x42\x28\xe4\x98\xad\xa7\xf1\xdd\x33\x94\xe8\x6c\xe5\xaf\xf8\x3c\xb0\x73\x2f\xa9\x86\xe3\xba\x43\x18\xdd\x88\x61\x71\x33\x71\xf6\x16\xd5\x4f\xc2\xf7\x18\xf7\xbf\x17\xb7\x3f\xd8\xbe\x2e\x73\x37\x73\x2f\xbb\x74\xfb\x37\xa7\x0d\x9c\x77\xdc\x82\x6f\xb1\x4b\x5e\x3a\x1e\x4e\x03\x83\x67\x2f\x3c\xe7\xe9\xe4\xec\x2f\x81\xed\x0e\x32\x3e\x5b\x21\x60\x7e\x13\xb1\x17\x78\x5e\x3b\x6f\xe8\x99\x57\x72\x5f\x32\x9a\xd7\xaa\x4e\x8c\xc0\x03\xed\x13\x33\x2b\x18\x33\xb7\x74\xff\xb4\xd6\x19\x12\x98\xff\x60\x6e\xf1\x4b\xc7\x0b\xff\x2e\x81\x73\xe6\xf7\xae\x33\xec\x29\xc7\x6c\xbb\x8f\x18\x27\xca\xab\x7a\x7d\xcf\x38\xc9\x7d\x8f\x1d\x97\xf4\xe0\x4e\x12\x23\xb0\x1b\xc7\x1c\xec\xb8\x98\x88\xa3\xc0\xf1\x2f\xf1\xfa\x3a\x35\x0a\x5c\x1c\x23\xe4\xe4\x86\x5e\xc2\x38\xb8\xe3\x97\xc4\xba\x9d\xee\xba\xd7\x3e\x17\xd9\x8c\xf8\x7c\x58\x67\x54\x70\x68\x94\x8d\xac\x9b\x45\x39\xaa\x7f\x37\x38\xd1\xe3\x1b\xe3\x5f\xff\xf4\x3e\x28\xa7\xe5\xb1\x62\xca\x1f\xf7\x53\xea\xb8\xca\x70\x5e\xe0\x50\xb2\x61\xc8\x3a\x67\xc9\x32\x52\x3d\xa4\x79\x94\x14\x98\x1e\xa3\x06\x9a\x6b\xd8\x66\xe0\x20\xaf\x5c\x40\x66\x94\xa1\xb5\x12\x94\x29\x11\xa9\x94\x58\xa8\x41\xb3\xdd\x86\x6c\x5b\x66\x9a\x38\x7e\x71\x1f\xde\x97\x1b\x89\x75\x12\xfb\xb8\xee\x2d\x10\xf1\x4b\x2f\xaa\x27\x80\xab\xd1\x8c\x44\xfa\x7d\x44\xf4\x49\x7d\x0b\xcc\x7d\xe0\x60\xa8\xf8\x4f\xce\xf9\xe6\xcc\xee\xa7\x1b\x02\x47\xb3\xa8\x2c\x2b\xb0\xe6\x8d\x59\x1e\xac\x4a\x2a\xaa\x50\x35\x8e\xa7\xd8\x40\x56\x24\xe8\xc9\xd0\xd3\x75\xcd\xe4\x3c\x45\x44\x92\x87\x64\x8f\x52\x3d\xc6\x56\x75\xc7\xb5\x42\xca\x80\x92\x6b\x39\xb2\x84\xea\x96\x6b\x07\x35\xc4\x45\x8b\x83\x5c\xa0\x52\x7e\x50\xa7\x0a\xe5\x72\xbb\x0d\x6e\x88\x68\x81\x5d\xba\xfb\x8d\x0a\x58\xb0\x58\x02\xec\xe2\xed\x9b\xc4\x29\x0b\xf7\x4b\x7f\x4d\x70\x0c\x9f\x0b\x6f\xfb\x1d\xb9\xf6\x18\x26\x66\x07\xf7\x56\xbe\x3b\xf1\x1c\x72\xeb\x61\x3d\x38\x64\x77\xe2\xcf\x23\x58\x6d\x6b\xf6\xc4\x32\x58\xb9\xa1\x97\xf0\x3d\xb2\xad\x90\xc0\x6d\x85\xc0\x6d\x2d\x89\x4b\x90\x33\x2a\xd6\x1f\x2e\xc4\xef\x2f\x89\x61\xee\xe0\x1a\x0b\x16\x98\x06\xa6\xe3\x7c\x41\x89\xa3\x9f\xcc\x00\x17\xfe\xe9\x60\xcf\xf4\xbe\x0f\x85\x3c\xac\x78\x50\xf2\xa0\xe8\x41\x09\x95\x3c\x54\xf6\xf0\xdf\x50\x4c\xbb\xde\x98\xee\xa5\x1b\x9a\xae\x9a\xbc\xa7\x48\x21\x22\xa9\x1e\x25\x7b\x8c\x59\x2a\x97\xcb\x65\xb7\xd9\x6c\x34\x9a\x4d\x17\x09\xc8\xa9\xd5\xa1\x89\x0c\x24\xc5\x40\xcf\x06\x06\x4e\xa8\x61\x97\x92\xf8\x56\x3e\xe2\x4d\x31\x3c\xe6\xf7\xc0\x29\x69\xdf\xfc\x7a\x0f\x6f\x48\x68\x2a\xb9\x73\x95\xc4\x28\x47\xb4\xfc\xf2\x0a\x02\x4e\x98\x06\xd7\xe2\x7a\xb7\x5b\x65\x22\x2e\x0a\x9f\x43\x3f\xbb\x26\x0f\x72\xcc\xce\x1b\xd5\x66\x92\x4b\xcf\xc2\x39\xa2\xa3\x7c\x4b\xfd\xc9\xe9\x0b\x16\x93\xe9\x04\x96\x7d\x1f\x4e\x78\x38\xd7\x52\x68\xbf\x9a\x63\x82\xef\x7a\x74\x3e\xcf\xf9\x22\x87\x24\x0f\xd6\x3c\x9c\x31\xad\x4c\xf1\x9a\x2e\x69\x9c\x29\x09\xc8\xf4\x91\xe9\x51\x3c\x2a\xe1\x64\x4b\x16\xe2\x60\x2d\x5d\x75\x02\x37\x68\x22\x43\x83\x36\xac\x51\x65\x51\x14\x15\xb5\x54\x28\x14\x6c\x14\x6a\xa2\x11\x28\xeb\x41\x89\x92\x10\x47\x19\x2e\x14\x6c\xdb\xeb\x9e\x73\x1a\x09\x2e\xd6\x62\x59\xe5\x44\x75\xfe\xb0\x4f\x68\x1a\x89\x15\x91\xfb\xa9\x5b\x47\x7d\xe6\x60\xff\xff\x9d\xa7\xd0\xbe\x03\x2d\x5c\x3f\x66\x5c\x6c\xe3\xca\xbd\x26\xb2\xa1\x49\xb1\xc8\x82\x16\x2c\x78\x81\x45\x89\x86\x21\xa9\xbc\x29\xa9\x21\x66\x18\x2e\xc5\x07\xb6\xc7\xd8\x95\x62\xd1\x45\x25\x28\xb9\xc5\xa2\x5b\x28\x14\x50\x13\xb9\x95\x02\x32\x34\x2d\xeb\x66\x95\x6a\x50\xa4\x64\x24\x50\x5a\xa1\x0a\x0d\xf2\x7e\xe2\xee\x33\x31\xaf\x9d\xfd\x21\x78\xd1\x39\xdb\xbc\xb7\x2d\x65\xd6\x86\xf4\xbb\xf7\xc0\x1f\xc1\x39\xeb\x43\xfa\xdd\x3a\xe5\x3e\x30\xef\x7d\x69\x82\xec\x88\x79\xeb\x6b\x04\xef\xc2\xb1\x82\x51\xfb\xbe\x47\x13\xfc\x98\x1f\xc5\x0a\xed\x7b\x1b\x00\x76\xc9\x86\x63\xc0\x53\xed\xbf\x9f\xf5\x8e\x34\x2b\x86\x33\x9e\xc3\x4b\xc7\x61\x38\xff\x8a\x88\x35\xc1\x34\x8c\xbf\x61\x36\x79\x31\x4d\xba\x38\x3f\x8e\x09\x06\x70\x16\xaf\x9e\xcc\xc9\x44\xf9\xd2\xd9\xf0\x7f\xc2\x29\x5c\x28\xd0\xf3\x9a\x8a\xe8\x4b\x12\x34\xbd\x31\xd3\x83\x86\x20\xd9\x9a\x58\x47\x62\x4a\x42\x22\x65\x63\xbe\x6e\x4b\x32\xca\x7b\x28\xef\x51\x36\xe2\x5d\x9a\x6d\x35\x18\x13\xd5\x4c\x4b\x30\x54\x54\x28\x97\xa1\xa2\x6b\x92\xe9\xa0\x3a\x12\x1d\x64\xab\x1a\xeb\xb0\x72\x25\xa8\x51\x1c\x52\x29\xc1\xb1\xa2\x5c\x5d\xb7\xb6\x95\xcc\x7e\xe6\xf1\x10\x96\xb5\x43\x16\x4c\x5d\xf8\x16\xbb\x78\xf5\x5d\x37\x81\x05\x47\x4a\xdd\x38\xa6\x58\x27\x0a\x6d\xb7\xb5\xff\x35\x51\x6e\xae\xfd\xea\x41\x3c\xcf\x20\xf6\x4c\x22\xe0\xa5\x25\x30\x66\x36\x7e\x6d\x22\xef\x8c\xde\xdf\xf4\x27\xe2\x5c\x24\x8a\x33\x75\xf0\x9d\x5a\x7c\x16\xbc\xeb\xdd\xc9\xbe\xd9\xf8\x6f\x60\x42\x2c\x6b\x24\x9b\xf7\xab\x89\xcf\x26\x7c\x5f\xca\x0d\xed\xc6\xb1\xf8\x2f\x4d\xc3\x3b\xf9\x9f\x44\x5f\x09\x8f\xd9\xf0\x83\x9e\xfd\x4d\xe6\xbb\xf7\xed\xc9\xd7\xb7\xe1\xea\x64\xbe\xe7\x67\x9e\xc3\x7a\x54\x38\xdf\xc5\x1b\x8e\x5b\x34\x3e\xff\x37\x44\x9d\x78\xcc\x97\xf6\xbd\x8c\xcf\xdc\x0b\xf1\x37\xb7\xb6\xcf\xcb\x7c\x81\x79\x8c\x1d\xda\xe3\x7c\x90\x66\x17\xef\xf9\x62\x6e\x7c\xe1\x61\xd2\x69\xb1\x6f\x60\x5e\xe6\x99\x70\x5f\xf6\x38\xff\x05\x17\x1a\xd2\x2c\x76\x71\xe1\xad\x99\xe3\xa1\xb4\x4a\xe6\xe7\x74\xe7\xf7\xe5\xdf\x02\x72\x2c\x3b\x37\xe4\xcb\xf8\xec\xfa\x3c\x8c\xe9\x2f\x13\xf1\x51\xc9\x37\xeb\x67\x13\x6b\x75\xbb\xed\xde\x8f\x27\xee\xf1\xab\x3b\x7a\xf6\xd8\xea\xd4\x39\x8a\x61\x73\x53\x6c\xb7\xdf\xd7\xbe\x35\xf3\x33\xe6\x41\x70\x14\x38\x19\xcc\x02\x67\x80\x2b\x80\x0a\x6e\x02\x00\x62\x65\xf9\x48\xe6\xa3\x70\x38\xb4\x35\xa6\xc7\xff\xd2\xa4\x28\x8a\x53\xda\x4d\x9d\xdd\x37\xbd\x0f\xbb\x32\x7b\x9c\x83\xf8\x98\x65\x90\x49\x0f\x77\x9c\x81\x64\x56\xf8\x74\xde\x85\x96\x22\x5b\x9c\x2e\xd6\xdd\xba\xfb\xfe\x25\x57\xcc\x3a\x7f\xe8\xe2\x59\x67\xbe\x3d\x70\xb1\xf5\x89\xa7\xdf\x7c\xf3\xcd\x37\xe1\x1f\xe0\xd7\xa7\x4f\x79\xf8\x88\xa3\xe0\xaf\x82\x3f\xf6\x1f\x47\xb9\xe8\x9d\xa7\xf7\xc9\x63\x1b\xd1\xaf\x37\xa2\xff\x38\xeb\xdb\x4f\xa3\x77\xe0\x0b\x33\x8e\x43\x8f\xd3\x9f\xbc\xef\x63\xb7\xdd\x76\x5b\x30\x7a\xe3\x59\xf7\x9d\x71\x0d\xb5\xbd\x54\x42\x82\xa2\x3a\x2c\x07\x85\x40\xa2\x4a\x28\x4b\x59\xf4\x0f\x0f\xd4\x74\x2d\xeb\x64\x35\x58\x41\x0a\xaa\x28\xb0\x40\x65\x69\x80\x44\x28\xb6\x9a\x50\x84\x37\x7d\xea\x99\xfc\xc3\x77\x7c\x51\x3c\xeb\x99\x47\xc4\x97\xee\xf8\xf5\xaf\x9f\x79\xf2\x96\x2f\x3e\x73\x96\x08\x9f\x92\xee\x13\x6f\x39\x57\x96\x2f\xbf\xfc\xf2\xcb\x71\xae\x68\x35\xc9\xe3\x3a\x05\xe7\x35\x39\x05\xcc\x05\x0a\xb8\x36\xe2\x18\xf1\xbf\xd8\x29\x9a\xc6\x90\xeb\x8f\x60\x36\x7b\xce\xec\xe3\x60\x5f\x08\xb0\x28\x39\xef\xd4\x01\x26\x13\x59\x50\x33\x60\xa7\x30\x25\x7d\x54\xf7\xc8\x8c\xce\x0c\xe7\x06\x72\x03\x23\x53\xa7\x1f\x49\x19\x8e\xe1\xe8\x4e\x60\xa6\x28\x33\xb0\xa9\x7b\x6f\xbe\xe6\x94\xd1\x8f\x7d\xe5\xff\x8c\x9e\x99\x0b\x4c\xdb\xa9\x6b\x35\xdb\x16\x55\x57\x12\x35\x08\x52\xb2\x93\xe7\xa0\xa7\xe6\x79\x55\x73\x0d\x53\xd3\x5d\xdd\xd7\x15\x59\x30\x3d\x4d\x54\xe4\x7c\x95\x61\x51\x09\xfa\x48\x85\x12\x92\x2c\xe7\xbe\xe0\xdb\x97\x5d\xb6\x8e\x1a\x0f\xbe\x42\xfd\x76\xd3\xa6\x27\xd1\xcc\x73\xe1\x4b\xa9\x8f\xca\xa8\x54\xb6\x2a\xa8\x2e\x9b\x56\x8b\xa7\x79\x99\xb7\x6a\x34\x2b\x84\x66\x63\xbd\x86\x4a\x15\xdf\x71\xca\x15\xdb\x76\x9a\x15\xc8\x9a\x2a\x74\x0c\x54\xa9\x35\xa1\x9e\x25\x70\x3b\xc6\xaf\x1c\xb3\xe6\x2f\x44\xac\x09\xc6\xbb\x6d\xb7\x63\xac\x7e\x9b\x88\x45\xf4\x12\xda\x63\xd6\x95\x08\xba\x8f\xee\x3c\xae\x22\xe8\xfe\x97\x07\xf3\x90\x1c\xb3\xfe\x2a\xa2\x2f\xa3\xdb\xd7\x9e\x2f\xf5\xd8\x23\x09\x9f\x58\xfb\x6a\x4f\xcc\x61\x97\x76\x6e\x4d\xfa\x99\x9a\x51\x99\x75\xb9\xa5\x85\xdd\x7f\xf9\xa1\x04\x16\xde\x9c\x5b\xbc\xb2\x06\x96\x49\x60\xfe\x8f\x93\xef\x70\x7c\x75\xf4\x5d\x12\x5f\x3d\x81\x16\xd7\xee\x27\xe6\xe5\x74\xe7\xb5\xb7\xda\xf3\x7e\x22\x87\xd6\xbc\x4a\xbc\x5f\xe8\xbe\xbf\xff\x9e\x9e\xf6\x0e\x5f\x65\x5e\xfc\x2a\x98\x94\x9f\xec\xfb\xb7\xc9\xe7\xb3\xb7\x53\xbb\xac\xd8\x81\xf9\xbe\xb5\x1d\x0e\x43\xb4\x27\xbc\x6e\x6f\x27\x4e\xf7\x8c\xb6\x14\xd9\x9f\xfb\xde\xde\x1b\xca\x91\x4f\xf2\x64\xac\xb4\x9d\x1b\x7a\xb1\xd4\xd3\x8f\xd5\xd9\xbb\x68\xdc\xcd\x8f\x11\xf3\x8f\xe2\x70\x23\x38\x9c\x41\xe8\x78\x85\x2e\x1c\x5e\x5e\x4d\xf4\x63\x13\xf0\xdc\x07\xc8\x98\x50\x2b\x37\x54\xd8\x8d\xf7\xf9\x8d\x9e\xfe\x13\xb8\x25\x31\x85\x3d\xf6\x23\xcb\x6c\xcf\x4e\x8e\x7b\x2b\xdf\x99\x1c\x2f\x56\xfe\x07\x31\x4f\x8c\x47\x2f\x7c\xe7\x20\x1c\xd6\x3b\xfd\xe4\x98\x1d\x03\xb1\x0f\x0d\xe7\x49\x48\x37\xf0\x09\x62\x47\x13\x8d\x15\x4f\x08\x18\x10\x28\x74\xbe\x55\xf7\x5a\x75\x3a\x1f\x28\xe9\x86\x1b\xd4\xdc\x96\x4f\xab\x2e\xc5\xe1\x73\x3c\x25\x63\x31\x7c\x1c\xbf\x91\x9c\xe3\x75\xbe\x4f\x87\x2c\x24\x37\x13\xd7\x88\xa9\x31\x62\x20\xd1\x7c\xab\xea\xb5\xca\xb4\x18\xf0\x69\xc1\xd7\x6d\xcf\x6d\x65\x5d\xdd\xd7\x1c\x86\x77\x5b\x35\x37\x30\x29\xdb\xa5\x39\x4d\x44\xc5\xba\x0a\xd9\x7a\x1d\xd5\x64\xc8\xd5\x41\x92\xf3\xcd\x62\x5c\x70\x1c\x8e\x13\x19\x48\x8e\x72\x92\x01\xf1\xb9\xc4\x11\x30\x33\x0c\x60\xdf\x60\x1f\x05\x5c\x8e\x4b\x95\x03\x8f\x12\x83\x32\x4e\x42\xdd\x32\xea\x94\x1f\x34\x54\x5d\x33\x21\xa0\xfc\xa0\xc9\xb8\xbc\xa6\xb8\xa8\xe8\x22\xdb\x45\x79\x58\x77\x29\x16\xca\x9e\xad\x59\x90\x6d\x61\x3d\x34\xd1\x4f\x5c\x86\xcb\x0d\x6d\x8c\xa2\xe2\x7f\x11\xeb\x61\x46\x9b\xc7\x35\xca\xd2\xd8\x7f\x0c\x60\x52\x01\x95\x98\x53\x27\x41\x72\x08\x8e\x11\x3a\x9c\x95\x6a\xe8\x96\x66\xd1\x5e\x41\xd3\x60\x15\x99\xb0\x8e\xf2\x5e\xd0\xc8\xa3\xac\x0a\x0b\x79\xc4\xc2\x06\xb2\xe9\x92\x91\x0d\x1a\x8c\xad\x3b\xba\x65\xa9\x42\xc9\x76\x91\xe8\x06\x22\x55\x46\x22\xaa\x39\x0d\xa8\xbb\xb0\xec\x16\x5a\x0d\x58\x46\x22\x86\x8b\x88\xeb\x47\x0d\x44\x51\x29\x1d\xb1\x86\x6f\x35\xc2\x61\x10\x0d\x0f\x7b\xe7\x15\xcf\xc8\x87\xbc\x29\xb9\xb2\x0a\xf9\x50\xf5\x6e\x03\x1e\x59\x36\xd4\xf9\x50\xf5\x46\x5e\x1a\xb8\xa2\x04\x1d\x64\x43\x07\x19\x1e\xaa\x41\x0e\xd5\x20\x50\xd3\xbc\xef\x0b\xbe\xe9\x22\xd9\x45\x3c\xaa\xe8\x90\x85\x8e\x0b\x8b\xb0\x26\x78\xb8\x31\xc8\x52\x4d\x17\x16\x5d\x3f\xdc\xb3\xf8\x8e\x17\x98\x19\xd5\xfc\xee\x9e\x2b\x74\xab\xb8\x25\xce\x2d\x6c\xbf\xcf\x19\x0c\x05\xf3\xe0\x51\x90\xa5\x7c\x8f\x2a\x04\x0a\x2d\x21\x93\x97\xa1\x18\xe8\xb4\xd8\x2a\x47\xb8\xa3\x41\x43\x51\x91\x47\x2b\x81\x4a\xb1\xb0\x22\x0b\x01\xa7\xa6\x8b\xa5\x92\x5b\x72\x4d\xcb\xad\xb8\xc8\x84\xb6\x5b\x71\x6d\xc3\x2d\x05\x05\xd3\x32\xbb\xe7\xdc\x38\xd6\x7b\xf7\x72\xbc\x8f\x3f\x8f\xcf\xd5\x54\x7c\x47\x59\x05\xc7\x02\x00\x73\x53\xa3\x32\x5b\x00\xe2\xbf\x06\x28\x38\x63\xee\xd4\x01\x00\x71\x35\x81\x72\xcd\x28\xf2\x42\xd0\x08\x1c\x01\x6a\x50\x46\x35\x54\x12\xa0\x08\xb3\x7e\x0d\xd5\xa0\xd0\x2c\x79\x48\x41\x3c\xac\x43\x5b\xd6\x28\x19\x95\x90\x25\x39\xb6\x29\x3b\x30\x0f\x0b\x22\xef\x42\x8e\xca\x4a\x48\x41\x35\x41\x84\xbc\x18\xf0\xc8\x96\x15\xcf\x89\x7d\xf7\x22\xce\x7d\xb8\x04\xcf\xab\x4a\xf0\x03\x4c\xaf\xfb\x3e\x87\xfd\x3a\x1b\x63\xbc\x8b\x6c\x75\x13\x1c\x0e\x78\xb0\x68\x62\xce\x46\x38\x40\xd1\x73\xe3\x42\x29\xb8\x3c\x6c\x54\xf2\x81\xca\x8c\xcc\x9d\x39\x40\xd1\x23\x1f\xf2\x6c\xc4\x77\x28\xd3\xa3\x0c\xd7\x3d\x50\xa7\x14\xcb\x2d\x97\xb3\x79\x4b\xcc\xdb\x6c\xa1\xc2\xd9\x96\x6e\x70\x8e\xea\xa8\xb6\x2a\xd1\xa6\xed\x97\x0c\x2d\x9b\xb7\x24\x36\x7c\xc8\x3b\xc4\x43\x21\xed\x8c\x95\x19\xee\x40\x2d\x2d\x1e\x28\x5a\x69\x20\x84\xf8\xa1\xc8\x32\x57\xa9\xf0\xae\xc2\x9b\x65\xc8\xf3\xac\x03\x01\xf4\x78\x64\x54\xb3\x6c\x53\x40\x79\x54\xe3\x79\x59\xe6\xca\xd5\x83\xde\xb0\xea\x59\xd6\x8c\xe8\x2c\x8a\xe9\x39\x0b\x5c\x03\x1e\x08\x31\xfc\xcc\xff\x1f\x65\x6f\x02\xe7\x36\x75\x2d\x0e\xdf\x2b\x8f\x65\xb7\x65\x51\x1c\x92\x98\x5d\x93\xc5\x23\x28\x34\x82\xe9\x24\x26\x21\x41\x90\x90\x88\x25\x41\x61\x15\x3c\x08\xa2\xa5\x89\xa0\x2c\x2a\xab\x58\x02\x02\x4a\xaa\xb0\x8a\x21\x09\x4a\x42\x12\x25\x10\xa2\x34\x0b\xca\x64\xa6\x75\x29\x6d\xfd\x68\x4b\xdd\x02\xc5\xd0\xcd\xa5\xf4\x3d\xb7\xef\xb5\xb8\x85\xb6\xa6\xa5\xfd\x9b\x19\xeb\xfa\xfb\xf9\x4a\x96\x25\x8f\xd3\xc7\x97\x5f\x26\xcb\xb5\x7c\x75\xef\xb9\x67\x3f\xe7\x9e\x33\xbb\xff\x88\x44\x2f\x11\xeb\x4f\x4d\xf4\x6d\x9d\x76\x15\xe3\xfe\x53\x67\x4f\x21\xa6\x4d\xf5\xda\x66\x67\xfa\x7a\xbd\xfc\x19\xef\x76\x2f\xc4\xf5\x7c\x9b\xdb\xc5\x30\xc0\xbd\xb5\x67\xcd\xc6\x6a\xcc\x14\x12\xb6\x3a\xac\x79\x23\x4d\xb5\x27\x78\x3c\xd3\x67\x42\x25\x69\x26\xa1\x22\x25\xad\xa4\x04\x39\x9a\xd5\x79\xb6\xe2\x4a\x9c\x64\xa9\x86\x61\xa9\x02\x93\xb6\x38\x4b\x2f\x56\x51\x9e\x87\x7c\x41\xe3\x91\x40\xe5\x2c\x45\x35\x15\x54\x95\x21\xcf\x21\xab\xa7\xa0\x48\x5c\xd6\x28\x56\x4c\x3d\x6b\x88\xac\x9e\x4e\x57\x51\x85\xb1\x2c\xc3\x4c\x3b\xb2\x21\xba\xbc\xcc\x1a\x54\x1a\x55\x51\x81\xc9\x39\xa6\x45\xe7\x55\x43\x36\x74\x89\x63\x8d\x72\xd5\x31\xd3\x34\xc1\x65\x39\x2e\x0b\xb9\x58\xb2\x5e\x45\x05\x81\xe3\x44\x55\xd7\x55\x49\xe3\x4d\x59\xce\x71\xa8\x92\x53\x79\x9d\x97\x4c\x87\x93\x14\x55\x16\x9a\x26\x9a\x06\xe5\x98\x48\xa5\x45\x89\x45\x76\x3e\x4d\xcb\x8c\x55\x60\x05\x8e\x63\x34\x2d\xcf\xa4\x35\xa3\xca\x14\x50\xc1\x2e\xb1\x02\x2f\xb2\x9a\x51\x62\xd3\xba\x09\x01\x53\xd6\x28\x5a\x10\x58\x64\x15\x68\x96\xcb\x7a\xf2\x81\xc7\xfe\x42\x0d\x57\x91\x6f\x57\xda\xf4\x20\x9f\x90\x47\x85\x92\xa9\x48\x44\x8d\xce\x5a\x3c\x1d\x37\x4c\xd7\x41\x49\x64\x88\x15\x28\xd7\x08\x47\x12\xb3\x8a\x06\xfc\x9a\xae\x58\x16\xa6\x3f\x87\xed\xef\x96\x6c\xf3\xe7\x0e\xc6\x5b\xb5\x46\x84\x96\xce\x31\x8c\x6b\xfd\xbc\x68\x84\xc6\x8d\xd0\x38\x79\x90\x79\xe2\xc1\xf3\xf3\x13\xb7\x90\x1a\xb5\x72\xed\xf7\x1b\xd7\x37\xbe\xb1\xa0\x7a\xea\xc5\x29\x72\xb8\x3d\x17\xbe\x37\xb8\x17\xd7\x20\x1c\x86\xa1\x77\xe0\xb5\xee\x91\x3b\xc6\x39\xaf\x7e\xce\x5e\x5c\x13\x11\xab\x4d\xad\xe7\xf1\xbb\x87\x71\xec\x6d\xaf\x1c\x1a\x57\xda\x6b\x1d\xfc\x55\x68\x1e\x39\x34\xfe\xcb\xd0\x78\xf8\xf9\x5f\x1c\x64\x9e\x9f\x47\xec\xdd\xaf\x50\x2b\x86\x61\xff\x84\x79\x68\xfe\xf7\x52\xe4\xce\x95\x76\xe7\x9a\xbc\xef\xfc\x2c\x98\x8b\x0d\x8f\xef\x7e\xa5\x3b\x5c\x07\xdf\x8e\xc2\x95\x5a\xb1\xf6\x86\x33\x27\xcc\x9b\x38\xe7\x07\x29\x32\xfd\xb9\x83\xac\xeb\xad\xd0\x77\xcc\xf6\x59\x0c\x16\x3b\xe1\xea\x3d\xef\x3c\x1c\x1a\xd7\xdb\xf0\x1b\x7c\x33\x18\xcf\x46\xf6\xf0\xd3\x60\x7c\xa1\x17\x1f\xd8\xf9\xdf\x4d\x3b\x58\xff\xf8\xc5\x9d\xe7\xfe\x6b\xf1\x6f\xba\xe1\xc1\xe0\x1b\x21\xd8\x86\xf0\x69\xf0\xf5\xd0\xbb\xad\xd0\xf8\x6b\xa1\xe7\xd5\xd0\x9a\x5a\x35\x5a\xb2\x0d\x2a\xb1\x8f\xb4\xa8\x15\x43\x77\xbe\xf7\x5b\x4e\x9d\xff\x01\xb5\x28\xfd\xb9\xbf\x7e\x78\xd6\x23\x67\x16\xfc\xf7\x67\x3d\x98\xf8\xef\xff\x71\x77\xf8\xae\xbf\x01\x74\xe0\xa0\x37\xbe\x6b\x96\xef\xa3\x6f\xee\x71\x0d\xa6\xb9\x6c\xcb\xd3\xed\x11\x1e\xf6\x1c\xc6\x5a\x99\x2b\xad\x58\x5b\x8b\xfb\xc5\x13\xd3\x89\xd8\x34\x32\x81\x73\x74\x12\x7d\x3d\x02\x4b\x13\x85\x51\xa1\x68\x2a\x22\x51\x4a\x33\x0f\x5d\x52\x50\xe1\x8e\x6f\xa2\x14\x71\x47\xdf\x99\xf6\xb9\x27\x13\xf3\xdd\x3f\xf7\x9e\xb1\x53\xbb\xf3\x99\xe2\xd5\x30\xab\xa1\x0f\x1b\x67\x50\x82\x51\x7c\x91\x41\x1f\xff\x4d\x20\x35\x5e\x32\x5c\x03\x01\xa4\x48\x15\xa8\xc2\x24\x51\xe0\xb2\x63\xb7\x2e\xff\xca\x0d\x7f\x81\x5f\x36\xef\x5e\x3c\xf3\xee\x3b\xcc\xba\x2d\x3e\x71\xd7\x13\x2b\xfe\xf8\x0b\xad\x04\xdf\x84\xdf\xdb\xb5\xcb\xb5\x16\x2c\x7c\xf4\xd6\xf3\x16\x46\xf6\x6c\xbf\x35\x8e\x8e\x42\x30\xdf\xb5\xa3\x3b\x5d\xec\xbe\xf7\x20\x78\x56\xe8\x3e\xcf\xe0\x8f\xba\xf3\x8e\xc1\x57\x43\xcf\x87\xf0\x6f\xf0\x87\xc1\xf8\xe2\xc4\x1d\xc1\xf8\xe2\x35\xdf\x6d\x0c\xa1\xdf\x9e\x79\xd2\xbc\x84\x8f\x83\x61\xba\xf8\xc1\xb8\xf3\xf4\xf0\xe3\xfb\x07\x79\xf7\x2b\xe3\xd6\xea\x3d\xff\x9f\xe3\x78\x87\xf7\x7c\x3e\xa0\xa1\x74\x08\x8f\x17\xef\x3b\xae\xf1\x28\x5a\x7b\xe6\x25\xf3\x57\x45\x70\xd3\x83\x1f\x15\x9a\xcb\x0e\xcd\xf5\xbd\x83\xd0\xd7\x77\x0f\xc2\x87\xbe\xd3\x1d\x27\x07\x5f\x0e\x8d\x3b\xa1\x79\xbe\x1d\x9a\x27\x0c\x8b\x97\x22\xb4\xd5\xa2\x53\x72\x07\xf6\x6b\x82\xa4\xcf\x07\x0c\x30\x00\xe6\xf9\xdd\xab\x96\x80\x65\xe0\x92\xa0\x9f\x46\xcb\x39\xee\x29\x88\xfd\x93\x3a\xfa\xde\x46\xfc\x98\x03\x38\x0f\xb9\xa9\xcc\xe2\xc8\x68\xdc\xcb\x4b\xc6\x29\x29\xc1\xdf\x39\x8c\xfe\x15\x8a\xb6\xd8\x34\xe1\xb8\x0a\xc1\x68\x9a\x5b\x22\x38\x51\x12\x64\x5a\xe7\x99\xc0\xab\x5c\x25\x28\xfc\xa3\x11\x9a\x5b\x25\x1c\xa8\x37\xf5\xc8\x3a\xdf\x54\x7f\x09\x16\xda\x48\x74\x8b\xed\x7f\xc7\x0a\xc5\x50\x83\x91\x32\x43\x67\xb3\xbc\x21\x97\xd4\x92\xec\x2a\xa2\x40\x69\x49\x8e\xf3\xf2\x70\x62\x9c\xac\x4a\x50\x90\x51\x5e\x92\xa4\x92\x24\xb9\x25\x45\x51\x90\xa3\x28\x4a\xe4\x6c\x3c\x58\xe3\xb8\x04\x88\xe3\x5a\xe7\x32\x69\xe1\x7e\x49\x47\x83\x53\xc0\x59\xd8\xe2\x89\xf7\x4d\x9f\x81\xb3\x0c\x13\x58\x3b\x09\xb7\xc3\x1b\x08\xd5\xc0\x8f\xf9\x35\xf0\xc7\x49\xeb\xd8\x53\x6b\x9f\x45\x6f\x5d\x0d\x0f\x21\xf6\x2c\x85\xe7\x5c\x86\xee\x91\x4a\xcf\x3e\xb8\xb7\xf4\x8d\xa5\x8f\x3e\x72\xf5\xd3\x67\xa3\xb7\xd0\xe6\xcf\x17\x97\x20\x82\xb8\x6c\x03\x71\xb3\xfb\x8f\x77\xe0\xc5\xcb\xd0\xf0\x3f\x36\xfc\x0c\xfd\xe2\x3a\xb8\xb0\xe7\xca\x88\xa4\xef\xf9\xe7\x99\x8d\xef\xdc\xbe\xef\x1d\xf4\xc1\xbd\x0f\x9a\xf0\xd2\x77\x4e\xb2\x1e\x9a\x7c\xac\xd0\xff\xc8\xce\x39\xf7\x7c\xf6\xd8\xdb\xee\x41\xc7\xa9\x1b\x37\xaa\x7f\xfe\xf2\xea\xfb\x61\x1c\x5d\x0c\xb7\xfe\x79\xf5\x2d\x8f\xc5\x2f\xd8\xe4\xbe\x80\x00\x7a\xe4\xf2\x0f\xe0\x4d\x75\xe2\xe5\x6b\xae\x38\xed\x96\x07\x41\x1c\xdc\xd6\x38\x3d\xf1\x24\x8e\x91\x4c\xc4\x19\xdb\xf3\x5a\x96\x42\x3b\xa6\xd0\xb4\xe7\x12\xad\x64\xe8\xa6\xd6\x0a\x23\xff\xe9\x88\xaa\xc0\x77\xe0\xdc\x75\xf0\xcd\xf5\xf0\x72\xb4\xd3\x25\xd1\x0f\x63\x5b\xd1\x29\x23\x16\xc3\x3a\x86\xa2\x19\x9a\x29\xd7\x62\x83\xe1\xff\x11\xf1\x51\xda\x32\xad\x18\x48\x33\x16\x4b\xf7\x5c\x5a\xa9\x54\x2a\xf7\xa1\xeb\xe1\x7a\xef\x82\xdc\x63\x8c\x22\x1b\x8e\xe6\xe8\x65\x43\x81\x49\x68\x44\xfe\x1b\x3f\xa2\xc5\x22\xa1\x01\x4b\x4d\x0e\xc9\xf2\x12\x3e\xd7\x45\x1e\x4d\x0c\x7e\x00\x00\xb5\x72\xf0\xfe\xc6\x54\xf4\x3f\x1c\x98\x37\x27\x15\xd5\x1b\x34\x52\xa7\x56\x3e\xff\xfd\xc6\xb9\xe0\x88\x05\x3f\x5f\xf0\x40\x8a\x6c\xd2\x8a\xcf\x77\xc2\x34\x98\xf3\xfd\x9f\xad\x78\x52\xbb\x53\xc2\x67\x71\x04\xc6\x77\xfd\x87\x72\xf3\x5b\x34\x30\x2e\x5a\x37\x4e\x9a\x90\xef\x8f\xd4\x47\xf6\xec\x69\x42\x0b\xd6\xe1\x05\xf5\x91\xd6\xbf\xd0\x7e\xf7\x6c\x38\x65\x13\xdc\xbe\x09\x4a\xc8\xda\x84\x96\x6f\x42\x7f\x22\x4e\x8f\x8a\x94\xd8\xc9\x75\xfa\xb6\xdb\x62\x65\xa4\xff\xea\x57\xbf\x72\xdf\xf8\xe9\x4f\x7f\x1a\xbb\x50\x6f\xfe\xd2\x34\x4d\x23\x9e\xec\x22\x42\xf0\x3e\xfc\xbd\x83\x43\xf1\xad\x8f\x3e\x70\x1a\x98\x0f\x96\x7a\x92\xae\x1d\xc5\x98\xd8\x7f\x44\x02\xf7\xd1\x69\x22\x33\x4e\x86\xef\xf3\xff\x84\xbd\x93\xbc\x8e\x25\x2d\x3d\x7f\x1a\x16\x81\xed\xad\x79\x3b\xeb\x59\xcf\xd3\x44\xd6\xaa\xb3\x06\x91\x66\xb2\x17\x6f\x60\xe0\xb9\x70\xda\x99\xe8\x55\xf4\xc6\x03\x68\xd5\x57\xe0\x97\xdf\x41\xdf\x59\x23\xdc\xf5\x95\xbb\x62\x2b\x9f\x5a\xf6\xc0\x5d\x5f\xa9\xe7\x63\x1f\x89\xff\xf9\xad\x0f\x39\xf4\xea\x87\x1f\xa3\xad\x0c\xec\xfd\xd6\x2e\x75\x19\x84\x77\xed\x72\xae\x41\x17\x64\xe9\x18\x18\xa5\x1c\xc3\x26\x8a\x69\x3a\xae\x5d\xb6\x02\xed\xff\xd9\xeb\x90\x17\xce\x42\x4f\xaf\xba\x5a\x5c\xf5\xe8\xa0\xf4\x98\xf8\xd5\xb3\x72\x1b\x67\x6c\x14\x97\x2d\xbb\xe9\xa4\x9b\xc4\x39\xcb\x10\x7f\xc3\x8e\x1b\x3e\x7b\xec\x93\xd3\x96\x7f\xe9\x98\x07\x26\x9f\xf6\xa5\x1d\x77\x5f\x70\xe9\xad\xf1\x4b\xb3\x9c\xe1\x6a\x6e\x19\xc9\x22\xb4\x61\x99\xa8\x30\x74\x37\x3d\x72\xf0\x9b\xdd\xf5\x4b\x67\x67\xa7\x0c\xda\x76\xf6\x38\x7d\x34\xcc\xa7\xbf\xd1\x7d\x1e\xeb\xd6\xd0\x78\xae\x3d\xbe\xed\xab\xdd\x9f\x1f\x1c\x39\x88\xec\x1b\x0e\xc9\x01\xbb\xcd\xef\x07\x0f\x8c\x93\x27\xde\xf3\x43\x07\x91\x1b\xfb\x0f\x32\x7f\x2b\x96\x71\x31\xae\x0b\xb1\x9a\x5a\x31\x0c\x88\x4f\x9f\xf9\xf6\x19\x6f\x53\x8b\x1f\x9b\x08\xbf\xd4\x40\x03\xd2\x99\xc7\xf8\x34\x63\x07\xdf\xcb\x3c\xff\x2c\x8e\xdc\x6c\xec\x2a\x7f\x5f\x1c\x27\xaf\xbd\xf1\x7d\x51\xda\x6c\xed\xc5\x7a\x32\xa4\x93\x86\xe7\xd9\x1b\xd1\x2d\xda\x7b\xdf\xd3\x69\x33\xf8\xcf\xef\x1e\xa7\x77\x7a\xe3\x5f\x0f\x3d\x1f\x3e\xbb\x5d\x07\x59\xa7\x3d\x4e\xa7\xf6\xc6\x77\x8e\xd3\x9d\xbd\xf1\x17\x0e\x32\xcf\x8e\x08\xcc\xdb\xeb\x7f\xbe\x13\x0e\x3b\xea\xb8\x96\x85\xdb\xfc\x34\xe0\x51\x7c\x08\xde\xe4\xe0\x73\x07\x39\xd7\xed\x07\xc1\xa7\x6d\x07\xc1\x57\x2b\xb4\x87\xf0\xfc\x5b\x0f\x82\x67\x5b\x0e\x72\x06\xf8\xaa\x01\xf8\x14\x58\xd4\x58\x90\x78\x95\xbc\x07\xf7\x97\x39\x16\x9c\x1c\xe8\x1b\x97\x7b\xd9\x2f\xb3\x7b\x07\x70\x01\xa9\x49\xd1\x1e\x76\xfd\x93\xa6\x4f\xec\x8c\xd6\xb7\xfb\xb1\xf7\xb6\x38\x6a\xab\x05\xff\x94\xce\x5b\x51\xf7\x12\x4f\xb8\xb7\x3c\x0a\xaf\x43\xcf\xc4\x17\xf3\x55\x94\xe3\x75\x87\xa7\x8c\xb4\x82\xaa\x35\xc5\x84\xe9\x4a\x58\xe6\xb8\x8f\xc0\xbf\x3f\x4d\xa4\xdc\xbf\xc2\xb7\xd0\x4c\x62\xae\xfb\xc3\xa7\xdd\x61\xe2\x7c\x34\x13\xbe\x85\x0e\xdb\x0d\x17\xa3\x6f\xc1\x77\xe0\xa2\x7a\xb9\xf5\x2f\x78\x0a\x5a\xf8\x88\xed\xa8\x3c\xc3\xd3\x34\xa3\xb2\xb6\xc0\x89\xd0\x34\xe9\x9e\x97\xbb\x08\xa3\x5f\x9f\x7b\xee\x1d\x0b\xd0\xbc\x73\xef\xd8\xbe\xfd\x8e\x73\xe1\xf7\x17\x7c\xb4\x6c\xd9\x32\xe4\x5e\x78\xe1\x85\x5d\xf1\xe1\xd9\x83\xe8\x8c\x9b\x0e\x32\xbe\xf1\x20\x78\xb8\x21\xa2\xf7\xb6\xcf\xc4\x0c\xc6\x99\x08\xbe\xe1\xfa\x8b\xe0\x90\x16\x5d\xf8\xfd\xcd\x8f\xc3\x79\xc9\x73\xc0\x22\x70\x21\xb8\x0c\x5c\x05\x6e\xf4\xfc\xbe\xb8\x74\x41\xd3\x04\x3a\x1e\x36\xd9\x7f\xdc\x53\x8c\xbc\x84\xdd\xa0\x71\x55\x28\xf2\x37\x30\xed\x58\x38\xa1\x7f\xc2\x0c\x7c\x56\x5e\xa1\x84\xf0\xbf\x61\xe8\x12\x56\xe7\x89\xaf\x5d\x9e\x3c\xfc\x00\x4c\x2d\x45\x7f\x3c\x30\xfc\xfe\x52\x78\xca\xff\x5c\xb5\x07\xfd\xbf\x0b\xe0\xa7\xe1\x69\xcb\xff\x07\x39\x4b\xe1\x4a\xa8\x2c\x47\x7f\x75\x3f\x5a\x4a\x1c\x5d\x7f\xcf\xa0\x44\x45\x80\x26\xc7\xb1\x3c\x2d\xd0\x8c\x61\xc0\x0a\xca\xc3\x82\xae\xa8\xa2\x43\x18\x28\x0f\x8b\x86\x28\x89\xa6\x6b\xd9\x82\x20\x12\x82\x24\x08\x82\x08\x9d\x30\x22\x10\xd6\xc0\x67\xc8\xe5\x33\x6f\x9e\xf3\xc0\xcd\x8b\xaf\x15\xcf\x3f\xff\x81\xc5\xe2\xe2\xd4\xf9\xcf\x8b\x57\x2d\x3f\xe1\xc2\xfa\x85\xd7\x8a\x70\x1d\xfa\x26\xaa\x2d\x86\x53\x21\x4f\x34\x46\xff\x97\x5b\x7c\xe8\x6d\x87\xf6\xc5\x36\x8c\x8d\xdd\x84\xfe\x0e\x0f\xdb\xf6\x8d\xd5\xae\xf9\xc4\x05\xb3\x2f\xbb\xfa\xa6\xe6\xbf\x56\x2f\x9e\x79\xf5\xa5\x30\x7e\xf5\xf2\x99\x7d\x2b\x67\xb2\xcb\x67\xf6\xc1\x3f\x74\xc1\x8f\x30\x5f\x08\xce\xc3\xb9\xcf\xa7\x9d\xe6\xf8\xad\xa4\x06\x8e\x05\x03\xe0\x34\x5f\x5f\x3f\x0f\x2c\x03\xd7\xf8\xb5\xf6\x9a\xda\x79\xab\xd6\x1e\x8e\x16\x36\x49\xa2\x79\x34\xf1\x90\xaf\x77\x12\xbe\x6f\x31\xe0\xdf\x1e\xc4\xf7\x66\xf0\x48\xf3\xe7\x78\x18\x6a\xbe\xdd\x01\xfd\xd8\x8b\xf3\xaf\x91\x5f\x79\xe5\xab\xf2\x15\x8b\xce\x5f\x75\xfe\xa3\xf2\xf0\xa2\x97\x21\xbc\xe8\xa2\x13\x21\x84\x17\xc3\xc5\x5f\x83\x57\xa2\xe7\xe1\x29\xe8\x4d\xa8\xd6\x37\xc3\x6b\xd1\xbb\x70\x3a\xfa\xd6\x34\xe2\xcf\xee\xe4\xaf\xc1\x77\xd1\xf4\xd6\xcf\x69\xda\x13\xcf\x7e\x79\x37\x7c\xe3\x96\x2b\x2f\xf9\xe2\x97\xe1\x79\x61\x68\xc7\xe9\xbb\x32\xc7\xbf\xff\x40\xe6\xee\x5b\xf4\xeb\xff\xc3\x9d\x49\xfc\x1a\xfd\xed\xbb\xd7\xbf\x0f\x17\x3f\xf0\xc3\x29\x87\xaf\x39\xf9\x53\x17\x5d\x74\x23\xb7\x92\xbb\xb1\xf9\x07\xba\xc1\x1d\x84\x2f\x2d\xf9\xc7\xa2\xbf\x2c\x7a\x75\xce\xdd\xdc\x15\x8b\x2e\xe6\x96\xac\xbc\x62\x51\xfc\xfd\xae\x00\x8d\xe8\x6f\x1e\x3d\xac\x3f\x88\x6c\x5b\x17\xa2\x93\x52\x88\x1e\xd6\x46\x78\x60\x7b\xfc\xe9\xd0\xb8\x1e\x1a\x1f\x1c\x67\x03\x7a\xf3\x3f\xe5\xc7\x78\xbc\x7e\x1b\x14\x38\x0e\xeb\x58\xb3\x26\xf6\xf6\x35\x55\xc4\x49\x64\xa2\x97\x88\x4d\x3e\x01\x26\x7a\xe9\xd6\x0d\x48\x28\x66\x79\x39\x8b\x54\x0a\xca\x88\x27\x54\xc7\x82\x32\x9d\x33\x09\x95\xe0\x39\xb7\xe6\xca\x25\xcd\x96\x2c\x55\xc9\x12\xaa\xa3\xd8\x90\x33\xa0\x6d\x9a\x95\x1c\x62\x51\xde\x72\x0a\x86\x62\xc8\xba\x59\x09\x62\x80\xe9\x54\xc6\xba\x10\xd7\x6a\xbd\x82\xad\xce\x5f\xc1\xb5\x62\xa6\x7e\x7d\x9a\x34\xae\x89\x3e\xd8\xf2\xed\x05\xe3\xd6\xb2\xe6\x78\xfa\x39\xd0\x11\x67\x1c\xc2\x7e\x04\xeb\xc2\xc8\xf3\x92\x37\x4f\x8a\x5c\xf3\x4b\xb1\x1c\x7d\x1e\xbf\x9b\x1c\xfa\x69\x64\x1e\x36\x18\x7f\xf3\x20\xe3\x45\x5f\xd7\xf6\xc7\x23\x7d\xc9\x66\x79\x32\xa3\x95\x44\xe0\x25\x12\x78\xd7\x45\xc7\xc3\x35\xde\xdb\x86\x6b\xac\x67\x35\xdc\x8f\x2e\x78\x74\x13\xfe\x85\x2e\x88\xd5\xea\x49\x8b\xc8\xb9\xbc\xcb\x66\x05\x81\x45\x79\x0a\xd2\x48\x25\x38\x43\x83\x74\xda\x34\x09\x8b\x10\xb3\x6e\xd9\x15\xca\xb2\x21\xea\x92\xca\x91\x99\xd1\x3f\xc5\x1e\x81\x3d\xae\x06\x63\xae\x0a\x3f\x13\x7b\x7c\xb4\x64\xf4\x24\xeb\xb5\xbc\xe6\x40\x4e\x87\x96\xd5\x3c\x06\x0a\x55\x72\x49\xab\x64\x28\x9a\xa2\x5b\xd0\x3f\x7b\xef\xfe\xaf\xe4\xdf\xe0\xc3\xb1\x02\x2f\xec\x32\x09\xdf\xb4\x6e\x52\x25\xc1\x5b\x84\x60\x41\x07\x09\x96\xeb\x20\x4e\x84\x2a\x62\x61\x91\x94\x5c\x89\xb0\x5c\xc9\xac\x33\xb1\x52\xd6\xcd\x23\xc3\x80\x3c\x2c\x65\x4d\xcf\x47\xd5\x8a\xed\xe0\xbb\x81\x13\x83\xce\x4f\x93\x02\x0d\xbe\x09\x19\x19\xea\x16\x51\xb6\x9a\xb6\xb4\xe5\xd2\x16\x52\x09\x86\x28\xbb\x74\x4f\x19\x9a\x48\x6e\xfe\x98\x63\xa0\x5c\x8e\x83\xba\x1a\xd3\xfd\x58\x96\x41\xd2\x38\xc7\x33\x12\x8d\x6c\x45\xb2\x66\x0d\x4c\x38\x01\x4e\x38\x22\xd1\x3b\x01\xa6\x49\x80\x0a\xde\x9a\xf3\x02\x12\x54\x68\xf0\x28\x0d\x6b\x49\x64\x11\x20\x49\xb0\x24\x6d\xba\x45\xb3\xae\xc7\x54\xd7\x40\x15\x15\x02\x82\x32\x45\x09\xaa\x48\x15\x05\x82\x0d\x6a\x44\x68\xa9\xcc\xc6\xa3\x30\x1e\xb6\x74\x3c\x19\xd7\x9f\xe3\x52\x99\x9d\xde\x7d\xe9\x27\x22\xe3\x4a\x30\xfe\x78\x64\x3c\x1d\x8c\x3f\x16\x19\x57\x53\x19\x07\x57\xeb\x7f\xf1\xca\xc8\xf8\xc6\x54\xe6\xc9\x09\xe0\xa8\x14\xe9\x9c\xe4\xdb\xfc\xde\xb8\x0e\x0e\xf3\x33\xeb\xfa\x71\x1f\x9a\x9e\x78\x22\xd3\x37\xc9\x63\xaa\x89\xa6\xb5\xd6\xd2\x59\xa0\xdf\x3f\xdd\xb7\x92\x9b\x30\xc2\x97\xf5\x7a\x80\xc9\x41\x0d\xe6\xc5\x52\xc5\x05\x85\x92\x4c\xa8\x34\x21\x3b\x26\xe3\x96\x7a\x4a\x63\x8c\x15\x33\xeb\x32\x62\x88\x74\xd2\x4a\xc2\xb2\x05\x6b\x28\x69\xa1\xa4\x80\x44\x0e\xf2\x1c\xa2\x48\x9d\xe5\x6a\xba\xc1\xab\xb2\xa4\x8a\x46\xcd\x90\x14\x1a\x49\x48\x30\x0c\xb7\x2a\x48\xa2\x98\xcb\x99\xb8\x7d\xa3\xcd\x9a\x4c\x21\xb2\xc7\xaf\x57\xb0\xdc\x38\xa9\xfb\xde\x07\x1f\x0d\x8d\x87\x62\xfa\xfe\xde\x09\xbf\x4e\xb7\xe2\x45\x91\xe1\x94\x78\x0a\xf4\x9f\x3a\x71\x0a\x31\x6d\x2a\x88\xc5\xfb\x66\x64\x26\xf4\x53\x53\xbc\x00\x4d\x82\xa1\xea\x79\x11\x16\x0d\x9e\x31\xd8\x62\xc1\x2d\xc9\xae\x48\x13\x0e\x6d\xd1\x90\x2e\x3a\x72\xae\xd0\x63\x1a\x1c\xe2\xdd\x12\x14\x19\xc4\x12\x12\x41\xb1\x26\x5b\x85\x2c\x2a\x96\x61\x4d\x31\x54\x53\xf1\x63\x6b\x7e\x0d\x99\x8d\xb8\x16\xd5\x60\xab\x7f\x56\xe7\xf8\x1a\x7f\xfc\x82\xc6\x92\xc4\x65\xe4\xe3\xcd\xf1\x1f\x4d\x4a\x25\xd6\xc4\xd0\x4b\x8d\xa9\x38\x3f\xd6\xeb\x1b\xdf\xd4\x55\x70\xf4\x35\x33\xd0\x7f\x44\xd3\x08\x4d\x4d\x9c\x8c\x77\x40\x4e\x9b\x1a\x23\x62\x7e\xb5\x59\x8c\xd0\xde\xf5\xc9\x59\xb3\x27\xf4\x1a\xb1\x0a\xe5\x24\x09\xd1\x75\x18\x53\xe6\x78\xc6\x60\x54\x49\xd7\x0b\xd9\x3a\x15\xd7\x75\x59\x56\xb4\x31\x3a\x26\x20\xb3\x9c\x4b\x23\xd1\xad\xd2\xc5\x1c\xca\xc5\x69\xdb\xc9\x59\xa6\x5b\x45\x7a\x0d\xaa\x59\x54\x28\xc0\x34\xb4\x09\x0d\x77\xda\x56\x05\x97\x35\x11\xa0\x9b\xb3\xd9\x69\x9a\x48\xb7\xf0\x4a\x0c\x7a\x62\x1e\x07\xa6\x02\xa6\xb9\xce\x58\x3f\x85\x97\xd9\x86\x73\x50\x11\x77\x12\xbe\xd4\x1b\xc7\xfa\x94\xdc\xc3\x78\x4b\xcc\x51\x30\xc9\xb3\xb4\xcd\xe5\x54\x64\xd0\x63\x85\x78\xde\x94\x4d\xd1\x1a\x13\x89\xaa\x4b\xa5\x63\x4c\xbd\x14\xd3\xd2\x48\x70\xab\x34\xc1\xf5\x88\x04\x8d\xf2\x65\x13\xb1\x88\x86\x02\x87\xb2\x44\x96\x60\x09\xc3\xce\x8b\x79\x3b\x6d\xba\x82\x59\xb3\x64\xc1\xc1\x77\x20\x83\x1a\x32\x3b\x13\xd8\xe7\xdb\xca\xc1\xe0\x5a\xf6\x91\x37\xbe\xcf\xf4\x79\x59\x19\xf7\x2a\x60\xc0\x11\x5e\x1f\xe2\x58\xef\xa7\x61\x53\xcd\xa3\xe7\xc3\x89\x58\xb5\xa8\xc5\xed\x31\x96\x8d\xab\x69\xc3\x70\x8a\x69\x68\x65\x59\x7a\x54\x51\x7a\x9c\xd1\x1a\xc9\xb8\x36\xca\xb9\x05\x54\x4d\x9a\x69\x15\x6a\x84\x0a\x71\x41\x68\x2f\x9e\xaa\x90\x0c\x38\xd2\xcf\x2c\xc0\x1a\x7d\xb8\xe3\xd3\x6c\x4c\x5d\x13\x7b\xfb\x7b\x3d\x9e\x16\xb3\x5d\x81\x4c\xba\x42\x8c\x4e\xeb\xa6\xac\x32\xba\x24\x64\xd3\xae\x69\xbb\x40\x25\x74\x9b\x48\xba\x35\x97\x25\x18\x94\x8c\x1b\xa6\x9b\x6b\x00\x24\x96\x68\x33\x2d\xd6\xea\xb5\x58\x92\x60\x60\xda\x15\x20\xde\x63\xbe\xc1\x93\x38\xff\x64\xa8\xd6\xdc\xe3\xc8\x53\x01\x2d\x58\x09\x95\x64\xfd\xfb\x91\xbd\x13\x7a\x13\x91\xb5\xb4\x6e\x5d\xc3\x64\xdc\x1c\xe3\x99\xb8\x98\xd6\xcd\x7c\x85\xae\x39\x62\x96\x1e\x35\xe5\x1e\x63\x2c\xa9\x92\x95\x8f\xd3\x24\xeb\xd6\x2a\x48\x2a\x52\x16\x25\x96\x89\x74\x69\xd4\x32\x3d\x7c\xd0\xfd\xfe\xf9\xa1\x9a\x0f\xed\x5b\x7f\xdd\x76\xee\x45\x4f\x5b\xbe\xa5\xe6\x83\xf8\x06\x59\x62\xda\xac\x79\xb0\x37\x56\x84\x15\x0b\xf2\x16\x2c\x22\x96\xe0\x28\x45\x15\x65\x5a\x11\xb2\x0c\x85\x64\x0b\x59\x82\x5b\x11\x60\x41\x40\xd9\x2c\xb4\x71\x99\x07\xde\x82\x2c\x62\x51\x2e\x69\x25\x51\x89\x8a\xdb\xe5\x72\xb9\xec\x96\x50\x15\x49\xc5\xb4\x95\x16\x2a\xae\x42\x18\x6e\x59\xb5\x24\x68\x12\x5c\xad\xf9\xcb\x95\x20\xa5\x88\xbc\x20\x28\xfe\x9d\x46\xbb\x85\x33\x07\xfe\x82\xe1\x66\x80\x70\xbe\x0d\x9b\xca\x8c\x0c\xe2\x7e\x72\xb8\x7f\x0f\xe8\xc1\x75\x3a\x25\x52\xf3\xeb\x5c\x84\x72\x24\x26\x44\x5a\x4c\xb4\x4e\xd9\xb7\xdf\x06\x7a\x13\x5e\x01\x88\x6a\x4c\x95\x79\x5b\x10\x61\xd9\xcd\xc6\x58\xca\xb4\x64\x8d\xd6\x25\x91\x4b\xbb\xba\xe5\xb2\x1a\x21\xb8\x52\x8c\x23\x18\x37\x8b\xb2\xd9\xaa\xc6\xe3\xda\x15\x76\x2e\x6b\x6b\x6e\xad\x8c\x94\x62\xf3\xe8\x8b\xae\x4d\x88\x04\x55\x2a\x95\x5c\xa7\x5c\xee\xc9\xca\x9a\xa0\xca\xfe\x9a\x05\x6f\x2f\xc3\xb8\xc7\xd2\x48\x4b\x8f\x63\x71\x1d\x12\x36\xd5\x37\xf2\x54\x4c\x02\x20\x95\x18\x79\xaa\xd1\xee\x09\x28\x78\x7d\xab\x87\xf1\x5d\x80\x91\x27\x43\xfb\xbf\xad\xa9\x13\x7a\xfb\xdf\xbf\xec\x75\x10\xe4\xa0\x8b\xa4\xe6\x67\x4c\x86\xee\x45\x77\xd9\x3f\x68\x1d\xb5\x77\x95\xc2\x07\x04\x91\x93\x04\x48\xc9\x42\x4e\x90\xa0\xe3\xca\xb1\x64\x5a\x51\x35\x83\xb1\x15\x96\xa5\x5c\x1b\xd7\xf6\x50\x60\xb9\xe6\xda\x02\xa1\xba\x69\x58\xce\x72\x04\x0d\x6b\xae\x8c\xa8\x34\xa9\x29\xba\xaa\x65\x65\xd1\xad\x56\x90\x50\x4a\x5b\x69\xb1\xe6\x0a\x84\x80\x9c\x82\x5e\x84\x34\x91\x2e\x9b\x02\x8f\x8a\xe5\xb2\x6b\x55\x2a\xad\x7d\x70\x5e\xff\xe2\x11\xdc\x8b\x6b\x6d\x23\xd8\x5f\x53\x5e\xb3\xa9\xcc\xf0\x7f\x45\x60\x15\xf4\xf3\x69\x42\x82\x22\x07\xf5\x10\x3c\x70\x0f\x46\x6f\x9e\x3d\xa5\xd0\xf3\x66\xfb\xf9\xa0\x8f\x94\xde\xaa\xb5\x7b\x40\x8f\xcc\x1f\xe4\xf1\x79\xf3\x1c\x38\x3a\xf4\x3c\x7e\xef\xf0\x37\x3b\xd6\xc3\x27\x04\xbc\xce\x0b\x22\xe7\xa3\xb4\x62\x90\x23\x5e\x3d\x74\x39\x72\x9e\x6c\x6b\x3d\xd6\x8d\x9d\xfb\xf5\xce\x73\xe7\x22\x7f\xfc\xa1\xc6\x25\x89\xdb\xc8\x81\xe6\xf8\x58\x3c\xb5\x68\xe7\xa2\x77\x2b\x1c\xe0\x3e\x0e\xde\x6d\x36\x71\xc3\x9b\x6b\xff\x22\xd0\xce\x7d\xb1\xdb\xef\xde\xdf\xf2\x5b\x69\xad\x98\xf3\x10\xae\x91\x3b\xf2\x58\x64\x0f\x5a\x6b\x9e\xe1\x8b\x7d\x5a\xf2\x72\x17\x05\x70\x34\x98\x0d\xe6\xe1\x3a\x02\x3e\x47\x1a\xc0\x7c\xca\xe3\xc6\x4d\xc9\x87\x2b\x6f\xff\x9b\xcf\xc2\x55\x63\x48\x9b\x4a\xba\x3a\x47\xa4\xdd\x02\x51\x72\xcb\x69\x42\x66\x75\x55\x91\xd2\x26\xc7\xd3\xa8\x8c\x1c\x1a\xea\xae\x4e\x25\x5d\x8d\x8f\x3e\x22\xcb\x69\x93\xe7\xfc\x47\x8c\x18\x25\x49\x9a\xa0\xd4\xab\xf8\x2f\x68\x69\x0e\x41\x95\x4c\xb7\x56\x76\x69\x94\xa7\x4c\x0a\x52\xba\x68\x4b\x7a\x7b\x98\x41\x39\x3c\xac\x49\xb6\x04\x75\x49\x93\x54\x45\xc4\x7f\x06\xf7\x42\xf8\x16\xec\x37\x3f\x18\xd8\x0a\x42\xc2\x68\x9e\x89\x83\xfb\xbb\xbc\x70\x67\xe4\xac\xf4\x16\x8e\x6c\x77\x41\x18\x97\xf9\x54\x66\xe3\xf7\x3a\x70\xca\xa7\x7b\xef\xf9\x1d\x6f\x05\xe3\xac\xe7\x2f\xf1\xc6\x07\xbf\x16\xb2\x51\x70\xcf\x66\xe7\x62\xac\x37\x5d\x14\xc2\x4d\xab\x8d\xe3\x3b\xae\x09\xbd\x17\xeb\xb0\xde\xf8\x86\xf3\xfc\xf3\xf3\xee\xa9\x64\xf1\x3d\xf5\x33\x70\xcc\x6d\xdc\xfd\xd6\x69\x47\x78\x91\x95\xc3\x60\xa2\x6f\x16\x4e\x09\xc6\x66\xfb\x24\x4f\xf4\xf9\xc7\x38\xe5\xd4\x59\x9e\xc0\x85\x5e\x2e\x59\xac\x97\x22\xda\xa5\x24\x26\xc2\xbf\xc5\xbe\x81\x56\xc1\xec\xb2\x0b\x17\xac\x38\xfa\x81\x79\x33\xbf\x7b\xe8\x0d\xe7\x9d\xb7\x70\xe1\xac\x99\xb3\xce\x5b\xb7\xeb\x6e\x38\x0d\x2d\xfe\x07\x4e\x11\xde\x07\xcb\xa8\xc4\x40\x85\x35\x74\x81\x4f\x5b\x59\x91\x46\xba\x00\xd3\x28\x57\xa7\x51\x09\xe6\x51\x95\x82\x9c\xa0\x71\x12\x2d\xf3\x74\x3a\x89\x72\x6c\xfc\xc7\x4f\xfd\xa4\x7e\xe1\xe5\xd7\x50\x4f\x51\xe7\xc4\xe2\xd7\x49\xdb\xb6\x3d\xb0\x6b\xcd\xfe\xcb\xcf\x59\xf3\x0e\x3c\xb7\x7e\x64\x8f\xf2\x93\xb1\x5b\xb6\x92\x27\xbb\x36\xaa\xb8\x16\x2a\x25\x8d\x64\x09\x9a\x04\x83\x0b\x20\xb2\x86\xeb\xa0\x7c\x53\x20\xa7\xcd\xb4\x06\x2d\x42\x0a\xee\xed\x64\x53\x99\xaf\xdf\x04\x00\x95\x19\x79\x02\x6b\x21\x2f\x84\xce\x4e\x69\xe1\x80\x73\x43\x84\x1f\x04\x67\xe4\xec\xf3\xf5\x77\xae\x71\x48\xc2\x22\x77\x82\x49\x60\x9a\x5f\x9d\xcd\x97\xde\x87\xc1\xa8\xf4\x86\xad\x50\x4c\xc8\xab\xe8\x7b\x4b\xfc\x68\xe7\xe4\x29\x89\xe9\x33\x7a\x49\xbf\xf8\xc6\xc0\xb4\x81\x7e\x2f\x9e\x83\x5b\x97\xdf\xd6\x93\xab\x33\x74\x8f\x48\x6b\x9a\x95\xa7\x4a\x26\xcb\xa4\xc7\x0c\x35\x96\x1b\x2b\xc5\x3f\x32\x47\x65\x33\x46\xa5\x69\x33\x4b\xbb\x00\x32\x16\x34\x9a\xf2\xb6\x58\xad\x12\x34\x32\x8a\x79\x11\xd5\x50\xcd\xe5\x6d\x54\x94\x21\x50\x51\x9e\x48\x57\xab\xa8\x04\x0b\xd0\x40\x0a\x0e\x6d\xf6\xa1\xe2\x8d\x7f\x7f\xec\xf0\x55\xc9\xbe\x15\x70\xf1\xa5\x3d\x37\x96\x25\xb1\xc4\xd2\x6c\x96\xff\xa7\x20\x08\xc2\xbd\xb7\xdf\x7b\xd3\xbd\x8f\x9e\xf3\xc8\x8d\x1f\xfe\xfc\x91\x7b\x6f\x6c\xfe\xe7\xf6\xdb\x6f\x47\xdb\x6e\x6a\xf3\x18\x8c\xbb\xbb\x70\x8f\xc6\xc1\xd5\x11\x3e\x2c\xa4\x32\xdb\x56\xb5\x69\x00\x24\xc0\x03\x0d\x3e\xb1\x83\xbc\x1a\xeb\x39\xc7\xe2\x28\xd0\xc9\x60\x89\xa7\xd7\x1d\x44\xe3\x69\xd5\x04\x0b\xa5\xe6\x43\x3f\x7d\x2b\x81\xeb\xb0\xb4\xaa\xb0\x90\x41\xd9\x12\x9b\xd8\xeb\xbe\x97\x26\xc4\x29\xb7\x3f\x76\xe3\xaa\xe3\x1f\x5b\xbe\x74\x16\xe5\xda\x4b\xe1\xa8\xfb\xdf\x31\xb2\xfc\x31\x4d\xdc\x6a\x59\x50\xb1\x2c\x02\x1a\xb2\xa2\xa9\x63\xa6\xcc\x5b\x9c\x18\x3b\x9d\x13\x14\x83\x33\xa9\x34\x21\x36\x2d\xf3\x1c\x92\x75\xc8\x0a\xa8\x68\x4a\x48\x13\xa1\xc2\x23\x03\x1a\x54\x32\xb6\x09\x5d\xa7\xa3\xb5\xdf\x9e\xba\x61\xea\xf9\xdf\x86\xcf\xe8\x70\xab\x4e\x7c\xde\x8f\x22\x1f\x2a\x94\x55\x45\x5f\xa7\x5b\xbc\xad\xd7\x7f\x25\x0b\xb2\x59\x61\xb2\x9c\xa1\x2b\x46\x03\x28\xa6\x0a\xe9\x8a\xa3\x5b\x65\x43\xd1\xdb\xf4\x8d\x6b\x77\x79\x7c\x65\xfd\xf6\x10\xbf\xb1\xda\xfc\x66\xdb\x3f\x43\xe3\x18\x07\xbd\xf1\xc1\x56\x2e\x4d\xae\x15\x73\x1f\xc1\x39\x8e\x43\xff\x8c\xf8\x9d\x9a\xf6\xd8\x45\x25\x90\x22\xb7\x7e\x27\xc4\x57\x8c\x26\x9f\xf0\xe6\x09\x72\xbe\xd5\xa0\xc6\x26\x1e\xdf\xfa\x72\x48\x56\x59\x98\xaf\x60\xb9\xf0\xc2\x7d\x81\x1c\xf1\xfb\x4e\x0e\xe3\x2a\xfe\x23\x4f\x84\xc6\x73\xcd\x7d\x0d\x7d\x14\x19\x0f\xea\xf4\x7a\xb4\xb5\x69\x4a\x24\x5e\x62\xa4\x32\x1b\x24\xfc\xfc\x23\xa1\x79\x70\x7d\x5d\x9f\x42\x3f\xf4\xec\x01\x48\x35\x0c\xb2\x14\x2f\x82\x43\x5b\x35\x51\x3c\x1a\x99\xd0\x0b\xd9\xb8\x6d\x8d\x96\xe2\xcc\x18\xdf\x93\x1b\xad\xc5\x8b\x1f\xe7\x55\x93\xa0\x4c\x58\xc5\x3a\xb6\xd9\x30\xf0\x1d\xd8\x43\xc1\x84\xa6\xbd\x19\xeb\xc5\x45\x0f\x9b\x7c\xae\x6f\xc6\xc4\xde\x18\x51\x34\xa5\x98\xd5\x00\x30\xff\x31\xdb\x23\xa9\x75\x96\xeb\x61\xb5\x7a\x3e\x47\x8a\x74\x03\x98\x63\xba\x69\xc2\xb2\x4e\x11\x00\x01\xff\x3e\x34\xbe\x5f\xfc\x22\xee\xae\xb2\x01\xcb\x5c\xdc\x53\x16\xdf\x6f\x05\x13\x7c\x6f\x06\xee\x4b\xde\x5e\x61\xab\x05\xc9\x0c\x7c\xcd\x22\xe6\x58\x84\x81\xfb\xd1\x8f\xd6\xe2\xc9\xd1\x02\x61\xbb\x65\x4b\x36\x25\x2b\x2e\xe0\x34\x69\x52\x73\x95\x31\x51\x31\x61\xb6\xf9\x9b\xe0\xf2\x25\xb1\x94\x17\xb2\xa8\xe6\x88\xc5\x20\xd7\xbf\x69\xb7\x4e\xc2\xf8\xf0\xd5\x90\x7c\xc7\xfd\xdc\x37\x1e\x81\xc7\x1f\xf2\x6d\x0c\xef\x79\x1d\xcc\xf7\x33\x0b\x12\xbd\x93\x9a\x14\x96\x98\x3c\x65\x7a\x93\x98\xbc\x24\x83\xc9\x93\x42\x17\xf8\x3f\xdf\xd7\xd4\x0d\x21\x4e\x91\x9c\x3e\xa3\xaf\x45\x61\xb3\x7b\xfb\x66\xcc\xee\x4d\x10\xaa\x49\x51\x31\x35\x07\x8b\x75\x83\xb5\xb3\x10\x14\x14\xdd\xd6\xa0\xa8\x22\xcb\x10\x93\xba\x96\x55\x18\x45\x62\xb8\x24\xd2\x10\x25\x10\x1c\x94\x93\x69\x94\x43\x9c\x00\x1d\x28\x0a\x65\xa4\x70\xd0\x2e\xba\x62\x8f\xc6\xd5\x0d\x36\x56\xe6\xeb\x25\x9e\xd4\x69\x86\x36\x90\x6a\xd0\x7a\x5e\x2b\x2a\x86\x82\x6c\x5d\xb7\xa0\xca\x66\xb9\x52\x29\x6d\xd1\x9a\xca\x30\x0d\xa0\x99\x06\x04\x6c\xb6\xa8\xe9\x4a\x51\x30\x04\x93\x57\x0d\x4d\xa5\x34\xad\x09\x7f\x15\xd7\xcc\x52\xb1\xae\x72\x76\xcb\xc6\x09\x97\xdd\x1d\x08\xbc\xd2\x33\xfe\xcd\x67\x30\xf8\x57\xf3\xf4\x0c\x28\x7a\xf5\x74\x19\x54\x6a\xfe\x6d\x22\x03\x2a\xa8\x04\x19\x64\xc7\xf2\x50\xc4\x77\x5b\x71\xa2\x34\xbe\xe3\x6a\x42\xd9\xfb\xac\xae\xc6\xad\x51\x33\x2e\x8f\x6a\x24\x6d\x8d\x4a\xf1\x8a\x61\xe8\xba\xae\x1b\x46\xeb\xef\xd0\xff\x46\x0b\xa6\x6e\x9a\xf5\x12\x17\xe8\x1b\xcd\x73\x9d\x8c\xcf\xef\xc1\x40\x9f\xf3\xef\x28\x6c\x4c\xe3\xfa\xc3\xb8\xca\xf8\xe0\x03\xa1\xcf\xf8\x54\xa6\xf9\xff\x14\xfe\x2c\x45\x6e\x9c\xe8\xeb\xa0\xd9\x84\x8e\xf1\x61\x0a\xbe\xaf\x92\xc2\x7f\x4e\x68\x7e\x7b\xe3\xc4\x40\x4f\xcd\x7a\x34\xe8\xcd\x1d\x7a\x92\xdc\x38\x21\xf4\x8c\xd6\xfd\x99\x41\x2d\x78\x66\x5a\x62\x35\xc9\x53\x2b\x9b\xb8\x07\x5f\xe5\x66\x9e\xfc\x41\x2a\x33\xa8\x81\x57\x52\xcd\x27\xdf\x4a\x91\x1b\xa7\x80\xf7\x1b\x0d\xf0\xa5\xc6\xc2\xc4\x01\xf2\x36\x6a\xc5\x73\x0f\xcd\xa9\xcf\xff\x0a\x07\xa8\xc5\xfb\x5f\xa8\x1f\x68\x8c\x9d\x3e\x11\xd7\x6b\xbf\xb0\xc1\x27\x76\x91\x2a\xb5\xf2\xd9\x3f\xd5\xdf\x06\xe0\xf4\xf3\x9b\x4f\x3c\xf7\x10\xd8\x0e\xc0\x9c\x6f\x70\x1e\xad\x95\x1b\x7a\x02\x90\x12\x88\x83\x43\xbc\xaa\x97\x18\x59\x9b\x7f\x9e\x04\xbd\xff\x80\xb8\x2c\x23\xc3\x15\x45\xa2\x00\x0d\x19\x69\x2e\x25\xc2\x3c\x2c\x43\x53\x71\x6b\x75\x4e\x24\x38\x42\x25\x25\x0d\xe5\x25\x43\x45\x55\x15\x69\xb2\x2e\x94\x50\x4e\x45\x59\x55\x97\x3c\x7b\xdd\xeb\x97\x2a\xa7\x32\xc3\xb8\x77\xd7\x81\xbd\x81\xdf\xee\xf3\x09\x9d\x94\x71\xae\xce\x04\x70\x2a\x38\xad\x95\xab\xe3\x85\xa7\x26\xe2\x7f\xe3\xd4\x84\x69\x44\x6c\xf2\x94\xc9\x53\x70\xfc\x2a\xd3\xe7\xa5\x25\xcf\x26\x62\x58\x13\x98\x78\xca\xac\x89\xbd\x93\x53\x64\xf9\xca\xe7\x91\x7a\x31\x54\x3f\x10\x0a\xa8\xe7\x62\xe2\x90\xe2\xc5\x25\x04\x78\xf8\x72\xfd\x06\x89\x85\xb2\x36\xf0\x93\xef\x9e\x33\x5c\xac\xc2\x9e\x93\xd0\xac\xd5\xff\xb8\x46\x57\xfe\x80\xfe\x29\x43\x26\xff\xc6\x45\x3a\xcc\xb3\x42\x71\xf5\xa9\x48\x60\x14\xf2\x62\x65\x78\x58\x33\xdf\x55\x3e\x2a\xaa\x25\xf4\xee\x0d\x1f\x14\x35\xa7\xc7\x31\x6c\x1d\xd1\x68\x53\xb1\xef\x4a\x9a\x39\x42\x9b\x3e\x7d\xc1\x99\xa2\xd6\x00\x86\xa1\x97\x21\x4f\xd0\xba\xa1\x8e\x99\x15\x58\xad\xa2\x42\xcb\xbf\xee\xef\x77\xef\x1f\x42\xfb\xed\xc1\x39\x96\x3a\x8e\x09\xb5\x2a\x46\xfa\x37\xf1\x5b\x19\xd4\xd3\x71\x92\x79\x7c\x0a\xbe\x4a\xd7\x34\x22\xb1\x2b\x69\x06\x0e\xee\xcc\x87\x03\x13\xbc\xda\x3a\x71\x7c\x2c\x3d\x1c\x9b\x26\x6a\xc8\xce\xea\xb6\xc3\x55\x2b\xa8\x86\x18\x0e\xb2\x85\x7c\x8e\xc9\x41\x83\x31\xf8\x31\x95\x28\xb1\xb1\x2a\x52\x38\xa4\xba\x45\x81\xa0\x61\xb6\x9e\x2e\x18\xb2\x10\x17\x65\x24\xb9\x8a\x40\x38\x04\x25\x21\xbe\x9e\x17\x62\x12\xa9\x65\x39\x5d\x13\xd9\xac\x26\x70\x12\xad\xa7\x69\x96\x56\x69\x21\x99\x95\x75\xc1\xe5\x75\xbe\x20\xe9\x92\x8e\x14\x94\x47\x35\xd1\xaa\xda\xb0\x88\x6c\xa5\xa2\xea\x1a\xa3\xa0\xbc\xa4\x2b\xcd\xb3\xf4\x63\xc8\xb8\x56\x8e\xd7\x87\xa8\x5d\x67\x20\x92\x4d\x85\xed\xe3\x98\x77\x55\xc1\xdf\x4e\x68\x53\x34\x4b\x13\x55\x54\xc9\xf2\x50\x1f\x15\xf3\xa6\x2c\x40\x3b\x2b\xa2\x22\x91\x4f\xd3\x69\x98\xe3\x59\x57\x10\x88\xaa\x8c\x14\xd7\x92\x08\x0d\x16\x14\xc4\xb9\xa2\x44\x94\x89\xa4\x82\xe8\xba\x2a\xc6\x6c\x52\x17\x24\xc3\xd4\x0c\x94\x45\x06\x2a\x89\x39\x48\xe5\x09\xca\xd4\x0c\x8e\x73\x4b\x86\xae\x21\x5d\xd5\x78\x83\x37\xb4\x82\x62\x6a\xb2\x86\x8a\xa2\xa1\xf8\xb8\xe8\xc5\x4f\xe7\x00\x0e\x2c\x04\x3c\x58\x1a\xf6\x49\xfa\x59\xa2\xe1\x3f\x27\xfb\xee\xbf\x98\x9f\x47\x83\xb5\xa9\x56\x28\x28\xf0\x5a\xfa\x01\x0e\xcf\x23\x18\xab\x25\xad\x24\x21\xbb\x56\x92\xca\x29\x5a\xbe\xc8\xd4\x04\x2d\x57\xe6\x4c\xd9\x34\x72\x0a\xc7\x52\x06\x63\xeb\x76\x0e\x55\x24\xc8\x3a\x0c\x6d\xc8\x92\x61\x32\xb2\x20\xa9\x5a\x9a\xaa\x83\x78\x5e\xe4\xac\xac\x38\xc6\x11\xba\xab\x9a\x50\x44\x36\x91\x4d\x23\x0b\x09\x34\x2c\xc5\x05\xc3\xb2\x75\xd3\x54\x15\x85\x2f\xca\x46\x5e\xe2\xcb\x86\xad\x3b\xd9\xaa\x69\x43\x9a\x41\x3c\x4c\x6a\x92\x2e\xab\x82\x24\xb2\x1a\x27\x99\x59\x5a\x63\x79\xb3\x00\xf3\xa2\xc2\x2b\x92\x9b\x77\x1d\x03\xb2\x6e\xd1\xd4\x45\x5b\x0c\xf4\x4e\x8c\xbf\x2f\x4e\xc1\x7d\x98\xf7\x82\x30\x5e\x2b\xa9\x4c\x73\x84\x22\x37\x0f\x85\x7c\x8e\xde\x3d\x34\x7c\x5f\xeb\x80\x13\xd2\x49\x72\x4d\xfd\xf5\x00\xae\xf2\x7e\x60\x4f\xf0\xbc\x6f\xff\x1f\xc0\x77\x57\xd7\xb7\xea\x90\x8b\xad\x1a\xb2\x07\xf6\xb5\xe9\xa6\xd1\x00\x67\x35\xae\x4a\xfc\x9c\x5c\x97\xca\x7c\x3d\xfd\xf9\x49\x54\xc2\xfa\x97\x3b\x15\x4c\x0a\xe6\x11\x5a\xf3\x6c\xde\x1f\xb2\xd9\x71\x5e\xce\xfe\x3b\x22\xef\x95\x5b\xfb\xf2\xd7\xef\x84\x74\xbc\x3c\x29\xa5\x32\xeb\x8f\x6d\xee\x77\xfd\xbb\x9e\xac\x87\x66\x83\x8f\x1b\xf8\x9e\x12\xd5\xe2\x8c\xf1\xe0\x52\x27\xe8\x51\xcc\x06\x40\x94\x02\x4b\x50\x33\xf4\x8a\x55\x36\x15\x22\x4b\xea\x22\xca\x55\x8c\x72\x49\x70\x72\x75\x39\xc6\x18\xbc\xd1\xaa\x8f\xcb\x79\xb5\xcf\x47\x70\x6d\xba\xcd\x2f\x86\x62\x71\x6f\x92\xab\xfc\xf1\x45\xc3\xc6\xec\x5f\x71\xf3\xce\xba\x2e\xf8\xcc\x6c\x7f\x67\xcf\x68\xe8\x3b\x5a\x7b\x7c\x77\x39\x34\x1e\x7a\x7e\xeb\xe7\x22\xf1\xbe\xf6\xbb\x7b\xc6\x8d\x1f\xd9\xdc\xf7\xc8\x6b\xa0\x23\xdf\x64\x23\xbe\x93\x3d\xf4\x13\x2c\x9d\xee\x8f\xe6\x03\x79\xa3\x43\xbf\xeb\xfe\x0e\x67\x35\xe8\xc8\x45\x39\x80\x6b\x21\x0c\xfd\xa4\x53\xaf\xde\x8f\xed\xfb\xe1\x21\x10\x8e\xa7\xab\xa9\xcc\x30\xee\xb7\x35\xf2\x7a\xf7\xf9\x87\x07\x42\xe3\x46\x08\x16\xbf\xe9\xfe\xbc\x75\x41\x68\xdc\x0e\x8d\xdf\x18\x81\x9d\x16\xcc\x73\x4f\x77\x98\x1e\x38\x32\x58\xa7\xdf\xd3\xdb\x83\xc3\xae\xf0\xfc\x4e\xfb\xf9\xa1\xd7\xbb\x9f\xd9\xae\x81\xd0\x7e\x85\x10\x3c\xdf\x08\x68\xa1\x95\xdb\x83\x6b\xbc\x0c\xc7\x40\x47\x9e\x93\xf7\xfc\xce\xf3\x40\x38\x7e\xdd\x9c\xff\xf0\xe6\x59\x06\xf0\x0c\xe0\xb3\x6e\xd7\xb8\x33\x56\x5b\x70\x4e\x91\x9b\x6e\x05\x1d\x71\x70\x6f\x7e\xe7\xf4\xd0\x7e\x8d\xd0\x3a\x5f\xeb\x0e\x9f\x7d\xb7\x45\xe0\xdc\x84\x27\x7e\xde\x7b\x2f\xae\x9b\xc7\x25\x9e\x25\x55\x9c\xa1\x92\xf5\xea\x69\xfa\x39\xcb\x20\x3e\xb9\xb7\x3f\x41\x4f\xcf\x4c\x9b\x4a\x26\xfa\xe6\xc3\xfe\x53\xa7\x4c\x87\xbd\xb1\x2e\x89\x98\xb1\x29\x84\xa7\x24\xb4\x48\x31\x06\x88\x4f\x1d\x37\xf7\xf1\x05\x33\xe0\x36\xf4\x07\x24\x3e\x0e\x1f\xfd\xe7\x0c\xf4\x34\x1a\x7a\x65\xf2\xe4\x81\x67\xef\x7c\x49\x39\xe9\xf0\xc3\xe1\x23\x30\x5e\x7f\xe8\x72\x78\xc8\xf3\xf0\xf1\xe7\xe1\x11\xe8\x83\xe7\xd1\xad\xcf\xa3\x8f\xb6\xea\x26\x2a\x49\x30\x5d\xd0\x05\xdd\x94\x78\x09\x72\xb1\xab\xef\xfc\xe2\x89\xea\x63\xf7\xa3\xfb\xdc\x8b\xd7\x9e\xa2\x9e\xb2\x4b\x71\x96\x24\xde\x81\xcb\x88\xed\x2f\xbd\xf4\xd2\x4b\x4f\xbd\xfd\xf6\xdb\x6f\xc3\x27\x78\x54\x2a\x69\xa5\x12\x6f\xd9\x75\x3a\xc6\x49\x59\x0d\x76\x39\xfb\xe1\x17\x23\xb0\xd0\x03\x9c\xf8\x47\x77\xd8\x0d\xfd\x1d\x74\xe6\x9a\x79\xfd\xf1\x37\x77\xc7\xdd\xfd\x56\xe7\xf8\xd0\x37\x23\x67\x1c\xd0\xc0\xd0\x87\xed\x33\xf0\xc7\x71\xfd\xa8\x61\x67\xdc\x78\x40\x4b\x29\x72\xf8\x1c\x00\xa2\x34\xef\xad\x67\x78\x38\xf4\x7c\x88\xa7\x6d\x7d\xe2\x20\x7c\xe8\xc9\x00\xa7\x7d\x1a\xc0\x38\x9d\x19\xc6\x5c\x78\x78\x5f\xf4\x3b\x1b\xb2\xe3\xf0\xf4\xda\x16\xde\xa5\xc8\xad\xaf\xbd\xde\xa6\x0f\xb3\x35\x57\x8a\x5c\xa7\x86\xde\xad\xb7\xdf\xfd\x9c\x10\xa1\xa7\xd6\xbb\xc9\x03\xb3\x42\x7b\xd3\xda\xf3\xaf\xeb\xa7\xda\xf8\x6e\xb7\xe9\x7b\xe8\xc7\xdd\x61\xf1\xdc\x9b\xa1\xf1\x10\xdf\x1a\xbe\x32\xf4\x5e\xec\x27\x1e\xc1\x96\xc6\x70\x38\xb7\x53\x69\xcf\x6f\xfd\x2d\xc2\x17\x03\x3a\xdb\x3a\x31\x34\x8f\xd5\x86\xdd\x81\x9d\x98\x27\xdf\xd7\xc1\x93\x1f\x6f\xf3\x52\x9f\xd6\x1e\x27\x4d\x30\x11\x7b\x88\xb2\x2d\x9f\xa5\x5f\xc7\xb5\xdf\x2b\x47\x1a\xeb\x32\x06\xc7\x11\xd8\x8c\x9e\x39\x88\x85\x4f\xa2\xaf\xc0\x8f\xc7\xa6\xed\xde\x08\x0f\x45\xcc\xa7\x7a\x78\x74\x22\x5c\x8b\x6e\x80\x8d\xb1\x89\x7b\x37\x43\x0a\x4d\x45\x7f\x58\xbd\x0e\xfd\xf6\x6a\x78\xc4\x0f\x56\x5f\xf0\xf0\xfa\xe5\x8b\xaf\x86\x73\xc9\xb3\xef\xcf\xaf\x46\x1f\xdf\x7f\x3f\xcc\x21\x9e\x58\x52\xaf\x3e\xfc\xe3\xc7\xd1\x07\x0f\x3f\x0c\xdf\x40\xfd\xc4\xf5\x3d\x2b\xcf\x41\x3f\x7b\xf7\xc1\x77\xdf\x3d\xe7\xb9\xdd\x75\x2a\xb6\xf4\x0b\xa7\x3d\x08\xe3\x01\x1c\x42\xe7\xb2\x65\x7e\xa5\x03\xfe\xeb\xf7\x76\xc8\x13\xc1\x93\xf9\x1e\xdc\x9e\x79\x2d\x84\x73\x1e\x1f\xba\x0d\xe3\x1c\x3e\xfd\xc1\x55\xff\x06\xa6\xf7\x06\x3a\x84\x17\x87\x3f\x11\xf3\xc1\x13\x3a\xe5\xd6\x33\x3f\xe9\x90\x5b\x82\xdf\x23\x1e\xaf\x77\xf3\x68\xb5\xe3\xfd\xde\x3b\xf0\x2a\xc8\xc1\x7b\x42\x7b\x09\x78\xf0\x96\xd1\x08\x0f\x36\x5a\xb8\xb4\xe5\xdd\x7f\x8b\x03\x77\xff\x9b\xf7\xdc\xf5\x6f\x3e\x53\x43\x74\x14\xc8\x99\x8d\xdf\x0d\xad\x41\x6f\xe3\xe7\xd6\x70\x7e\x6c\xbe\x8d\xe7\x83\x77\x76\xe7\x1d\x9b\x4f\xf1\x71\x50\x69\x68\x09\x07\xdb\x97\x53\xc0\xb1\xb8\xd2\x61\xcf\x94\x04\x31\x23\xd6\x3f\x21\x28\x8f\xe9\x55\xd2\x0c\xf7\x2b\x88\xb1\x90\xae\x68\x55\x54\xe3\x6c\x21\x57\x56\xd9\xa4\x4d\x09\x16\x2a\xa0\xaa\xd5\xc3\x58\xb2\x23\x99\x63\xac\x25\x2a\x96\x4e\x4a\x76\xd5\x84\x49\x07\xd9\x63\x45\x9a\x66\xd4\x1a\x8b\x2a\x0e\xc7\x4b\x3d\x14\x32\x91\x20\xc0\x3c\x94\x98\xac\x5b\x41\x86\x08\x73\x80\x20\xa8\x06\x1f\x2f\x90\x2a\xae\x5c\x0a\x60\xff\x04\x3f\xff\x2e\xe6\xf9\x91\x6c\xab\x6c\xa9\x9a\x6e\x55\x4c\xc6\x30\x74\x52\x45\x6a\xce\xb1\x73\xc6\x18\x1d\xcf\x31\xc8\xa9\x09\x55\xbc\x1f\x2f\x27\xa0\xb9\x9f\x69\xe0\x04\x30\xb3\x75\x7b\x3d\xd6\x3f\xa1\xa9\x21\x42\xbf\xe8\xe7\x44\x7f\x57\xf3\x20\xae\xf6\x0a\x43\x5d\x18\x62\x72\x51\x33\xd5\x82\x60\x41\x13\x72\x26\x76\xeb\xe4\x2b\xb2\xbf\xc5\x22\xaa\x5a\x85\x0a\x0f\xd3\x65\x64\x59\x8c\x65\x59\x71\xc3\x54\x2c\xd9\x24\xa5\x62\x4d\xac\x96\x90\xe5\x26\xa1\x44\xd4\xf8\xba\x89\x54\x95\xa1\x59\x15\x52\x59\x54\xca\xf1\xbc\xcc\x19\x8a\x6e\x3a\x31\x81\x41\x59\xa4\x89\x50\x87\x22\xb2\x90\xcc\x43\x1b\x0a\x51\xbd\x6a\x64\x06\xe6\x7f\x1f\x85\xe8\xc3\x1b\x5f\x8a\x75\xfd\xbf\x63\xbf\x00\x09\xe4\xc6\xb2\x84\x11\xff\xc8\xaf\xf3\x3a\x09\xcc\x00\x27\x78\xfc\xa3\x15\x7f\xf2\x4f\x2b\xd1\x97\x9a\xe1\x9d\x65\x50\x13\x15\x3f\xf5\x54\x4f\x7e\x8c\x23\xee\xd4\x45\x53\xd0\x88\x8a\xa3\xda\xb2\x3d\x26\x3a\x92\x6a\xe9\x50\x75\xf8\x7c\x4d\x4c\xda\x94\x8e\x4c\x54\xb1\x90\x48\x6a\x1f\x6b\xf1\x8f\x2c\xf7\xde\x91\x1f\x5e\xfd\xea\xf0\xa7\x3e\x44\x7f\xb9\x14\x7e\x06\x12\x47\x2e\x44\x76\x65\x39\x9c\x58\x41\xcc\xb4\xa9\x67\x0f\x9f\xfe\xa1\xba\x64\x65\xec\x4d\xb3\x8d\x9f\x1c\x5e\x37\xee\x71\x74\xe0\xd8\x90\x5f\x56\xf5\xc6\x99\xe6\x7e\x8e\x2b\x77\xe8\x95\xcd\xe7\x53\xe4\xbe\x99\xfe\x38\xdf\x50\x12\x36\xc9\xa4\x32\xfb\x4e\xc0\x32\xb5\x95\x2b\xed\x8d\x67\x53\x99\x7d\x57\x76\x8c\x2f\x4b\xd8\xe4\xd6\xd4\xca\x3d\x6f\x03\x40\x7c\x93\x03\xf3\x3e\x93\x6a\x7e\xfa\xbb\xb0\x4c\x3a\x70\x1e\x96\xab\x4b\x03\xbb\xc3\xef\x99\xbe\x17\xe7\x4b\xed\x3d\x3a\x34\x6e\x34\xdf\xed\x8f\xa7\x03\xdf\x63\x34\x97\xe6\x8e\x4e\xdd\xd8\xdb\xc3\x9e\xdf\x77\xf2\xa4\x7d\x27\xe3\xf7\x2e\x09\x8d\x63\x3b\x6b\xcf\x7d\xe3\xc6\x3d\x5a\xbd\x0c\xdb\x15\xab\x22\xeb\x69\xbe\x17\x77\x44\xde\x7b\x54\xe7\xb8\xb7\xce\x8d\x87\x75\x5b\x0f\x45\x3a\xab\x3a\xe7\x1f\x1e\xc5\x7a\x84\x11\xc2\x35\xa7\x8d\x6b\x7b\xa5\xd0\xf3\x4e\xe8\xce\xce\xed\xbe\x7f\x48\xc4\x3d\x3f\x39\x70\xa4\xef\x51\xf0\x25\x58\xab\x0b\x1b\x88\x4d\x23\x22\x55\xd6\xdb\xb1\x38\x8f\xd4\xfa\x52\x01\x92\xce\x82\x74\x3c\xe7\x8a\x69\x36\xa6\xbb\x85\x3c\xcc\x69\x88\xaf\x56\xcb\x08\x48\xb0\xe8\xb8\x0e\xe1\xb0\xb4\x6b\x12\x59\x4b\x50\x74\x95\x36\x0c\x9a\xc8\xe7\x39\x93\xcf\xd9\x8a\x60\xf1\xb2\xeb\xe8\x96\xa3\x15\x48\xce\x50\x65\xb3\x56\x34\x21\x05\x05\xa4\x97\xb5\x72\xcd\x94\x55\x57\xaf\x57\x14\x89\xb1\x59\x81\x60\x51\x01\x15\x58\x28\x42\x9a\x42\x35\x54\xe0\x21\x0f\x01\x2b\x20\xa7\xa0\x06\xb2\x4b\xf5\xf6\xe9\xc1\x71\xf7\x8b\xe3\x74\xf7\xcb\x9a\x70\xd9\xbd\x37\x02\xf7\xa6\x4c\x79\x1f\xdb\x6d\xe1\x3b\x16\x62\xe8\xfc\xee\xec\xc4\xd9\x8d\xbf\xc4\x79\x0c\x5b\x3b\x75\x93\x3d\xf8\x16\x42\xf3\x5b\x01\xef\x37\x5a\xe7\x41\x91\x7b\x0f\x04\xfe\x47\x5f\xfe\x0c\x99\xf8\x3c\x5a\x3a\xfd\x82\xf6\xf9\xbd\x3f\x96\x22\x77\xde\xd4\x79\xde\x43\xab\x23\xf3\x0b\x41\xfe\x29\xc6\xe3\x26\xe7\x09\xad\x73\x61\x2a\xd3\x5c\x61\x2a\xf1\xf5\xb3\x41\x3c\x76\x52\x98\x7e\xb6\x7e\x2e\x42\x3f\xc1\x3c\x23\xe7\x8f\xc3\x63\xbd\xc5\xd3\x52\xe4\xd0\xb7\x42\xe3\x58\xbf\xdd\x73\x6f\xc7\x7a\x5a\xfa\x33\xe6\x81\x7b\xee\x89\xe8\x74\x4d\xf8\xdc\xdd\x7d\xfd\x18\xbf\x33\x7b\xee\xc2\xdf\x52\xa3\xb2\xd8\x83\xdd\x9e\xdb\xfd\xef\xac\x69\xc4\x13\xab\xc9\x39\xcd\xb3\x39\xed\x3b\x29\x72\xef\x0f\xff\xf8\x4a\xc8\xc7\xd0\x3e\xb3\xdb\x22\x34\xa1\xa7\x32\xc3\x6f\x46\xf6\xec\xc1\x48\x4f\x65\x0e\xfc\x6f\x84\xff\x04\x7d\xb3\x3c\x1a\x7a\xee\x37\xa1\xb3\xc4\x35\xdc\xf6\x28\xe3\x60\x17\xe2\xfb\x43\x3f\xea\xd4\x25\xbc\x79\x46\x8e\x8c\xe0\xa2\x9e\xca\xec\xbf\x24\x72\x66\x11\x58\x53\xe4\x50\x23\x82\x43\x5a\x6b\x9e\x17\x6e\x8a\xac\xdf\xf4\xce\x98\x22\x07\x6f\x0d\x3d\xef\xd5\xd7\x7c\xb9\x39\xbe\x16\x05\xf3\x2b\x7e\x7d\x38\x0c\x9f\xe1\x63\x3a\x69\xe3\xc0\x87\x91\xb3\xe1\x5b\xcf\xfb\xf3\xdf\x12\x19\x57\x82\xf1\xaf\x74\xc7\xf5\x67\x5e\xef\x06\x07\x8a\x1c\x3e\xad\x3b\xae\xac\x0d\xef\xd7\x83\x27\x86\xcf\x16\xb9\xdb\x78\x8a\x1c\xfe\xaf\xd0\xf8\xda\x60\xfe\xc5\x43\x6b\xc1\x93\x8d\x0f\xe7\xf6\x72\x85\xc8\x5d\xa6\x51\x2c\xc3\x36\x44\x7c\x02\xc1\xbb\x87\x2f\x88\xc0\x2e\x78\xf7\x90\xd1\x7d\x6f\x1b\xce\x89\xac\xa9\x79\x36\xa7\x75\xc1\x2d\x35\x95\x79\xee\xeb\x11\xdc\x12\x70\x0d\x46\xb5\xb5\x9e\xa1\xa7\x43\xf3\x88\xad\x33\xa6\xc8\x91\xd9\xdd\x74\x07\x8a\xdc\xb8\x3d\x32\xbf\x96\xca\xac\xfb\x62\xc7\xfc\x2d\x1b\xac\x1f\xeb\xe2\xf8\x2d\x83\x4a\x87\x6e\x3b\x30\x0e\x7f\x39\xfc\x6e\x0c\x8b\xad\x28\xf4\xee\xd0\x9e\x37\x6e\xeb\xc4\xf7\xdd\x7b\x22\xf8\x2b\x63\xff\xc5\x73\xa9\x95\x8f\xcf\x00\x80\x98\xc6\x81\x79\xbf\x48\x91\xfb\x5e\x8e\xc2\x6f\xa3\x15\x79\x77\x07\x5c\x77\xff\xa6\xd3\x96\xf4\x69\xff\xf5\x71\xb4\x89\xcf\xe7\xc0\x55\x11\x78\xd0\xa9\xcc\x96\xf7\x3b\x68\xb9\xc5\xc7\x3d\xdc\xfb\x54\x27\x3f\xf2\xe4\x67\xc8\x97\xe6\x9f\xdb\xf0\xb1\x11\x1a\x89\xd0\x20\x45\xee\x7c\x36\x62\xfb\xb4\x61\xd4\x7e\xaf\x98\xb0\xc9\xcd\xa9\xbe\x27\x46\x01\x20\x6e\x4c\x91\x23\x87\x44\xcf\x0d\xd3\x4e\xe6\xeb\x5e\x26\xcd\xcd\xa1\xef\x34\xdf\x81\x73\xe7\x06\x6f\x1a\x87\xf7\xf8\x1d\x43\x4f\x8e\xa3\xab\x4b\x22\xfe\xb7\x80\xaf\x6d\xe0\xc7\xc1\x42\x0b\xc1\xf4\x27\x9d\x3a\xcc\xc8\x45\x91\xf3\x6c\x9f\x0d\x9e\x7f\xdd\xbc\x71\x30\xc5\xe3\x6b\xdd\xd0\x78\x2e\x04\x8b\xcd\xa1\x71\x35\x78\x3e\x33\x82\xef\x3e\x6e\x7e\xb4\xdb\xf9\x6f\xfa\x52\xb7\x3d\xa7\xda\x79\x6d\x01\xfc\x86\x5e\x1d\x87\xf7\x18\x16\x5b\xdf\x1e\x27\x7f\x43\xe7\x33\xf2\x1f\x11\x3c\x6a\xf2\xc8\x2d\xe3\x68\xc1\x6e\xd3\xa7\x73\x7b\xe8\x9c\x43\xbc\x3c\xf0\xc9\x0a\x2d\x58\x0f\xe3\x5a\xc6\x83\xd8\xd7\x89\xfb\xc7\xed\x4e\xd8\xe4\x0e\x10\x0f\xee\x10\x9f\xd1\xb2\x63\x5a\xb7\x8f\x40\xa8\x7b\xd9\xc4\xde\x70\xce\x99\xa7\xed\xd3\xb3\xda\x3d\x10\x3c\xfb\x29\xbe\x55\xe2\xf4\xac\x34\xf6\x95\x18\x6d\xc7\xd2\xae\x0e\x29\xaf\x83\x59\xc9\x46\x15\xc4\xc8\x30\x57\x73\xf5\x18\x67\xa8\x8a\xaa\xc7\x92\x96\x69\xa8\x4e\x3d\x6b\x89\x45\x48\x29\x14\x95\xb4\x28\x13\x49\xa8\x64\x95\x0d\x55\xd7\x4c\x72\x87\xac\x08\x8a\xf4\xdb\x52\xc9\x44\x79\xc3\xce\x43\xdb\x35\x09\x09\x29\x65\xbd\x00\xb3\xee\x67\x05\x45\xd7\x44\xde\x2a\xca\xb9\xbc\x88\x1c\x9a\xa6\x69\x4a\xcd\xe6\x14\x5e\x84\x8a\x80\xaa\xba\x62\xb5\xf7\xae\x05\x7b\xbf\x21\x02\xc3\x80\xe7\x8e\xbc\x13\x81\x55\xfb\xf9\x2f\x1f\x44\x9e\x5c\x1f\xc5\x4b\x6a\xc5\xc8\x65\x04\x98\xbf\x85\x6b\xca\xd0\xb9\xdd\x70\x33\x45\x6e\xf9\x7b\x77\x1c\xdf\xf8\x6c\x88\xde\x71\xfe\xe4\xd7\xdf\xee\xa2\x27\x69\xc1\xbb\xaf\x8b\xf8\x94\xf4\x16\x8e\x6f\xfc\x4e\x84\xf7\x05\xbc\x72\xf7\x5d\xdd\x65\xd6\xba\xa3\x3a\xd7\x39\x3c\x71\x1c\x9e\x19\x6d\xf9\xb3\xfb\xf4\xee\xf3\xec\x74\x43\xeb\xf7\xf8\x0f\xb6\x4b\xec\xcf\x76\xdf\xaf\xfd\xc7\xd0\xb8\xde\x9e\x67\xd7\xab\xe3\x74\x9e\x2b\xc7\xf1\x06\x4c\xbb\xbb\x5e\x18\xc7\x9f\x43\x34\x3d\xf4\xc3\xd0\xfa\xaf\x68\x8e\xdb\x6f\xbc\xd2\x3c\x97\xcb\x22\x7c\xef\xce\x54\xdf\xde\x77\x00\x20\x7e\x94\xea\xdb\xfb\x6b\x00\x88\xff\x8d\xf0\x3f\x87\xe4\x02\x78\xcb\x11\x3a\xd5\x5b\xe7\xb9\x6b\xf9\x38\x7a\xfc\x7a\x44\x2f\xed\xe0\x89\xa1\x98\x81\xef\xbb\xda\xbf\xab\xcb\x39\xb7\x75\x19\xdc\xc7\x1b\x24\xc0\x75\x0d\x31\xf1\x9f\xe4\x2a\x9c\x6b\x33\x03\x7c\x16\x9c\x82\xef\x10\xb6\x3a\x58\x7b\x57\x85\x66\xc5\x7a\x27\xf4\x4e\x69\x95\xb1\x09\x35\xe4\x9b\x18\xca\x91\xf1\x2d\xf4\xd9\xf3\xa1\xd7\x4a\x67\xda\xd4\x8c\xdf\x7d\x30\xf6\x94\x99\xa6\x09\xc5\xaa\x57\x2c\xc8\x31\x85\x58\xba\x5e\xb1\x35\x55\x16\x34\x41\x56\x64\x59\x51\x75\x4b\xd4\x55\x45\xad\x39\x86\x62\x5a\x6e\x45\x57\x35\xdd\x84\xa2\x95\xd5\x4c\x53\x67\x28\x8b\x15\x14\x24\xf1\xb6\xdc\x23\xd8\x8a\x25\xd9\xe4\x2a\x96\x63\xeb\x69\x9e\x8f\x55\x84\xba\x45\xe8\x02\x27\x88\x12\x2f\xc9\xbc\xa8\xc9\xa2\x22\x6a\x9c\xc4\x73\xee\x67\x25\x5d\x37\x15\x56\x40\x65\x4b\xcd\x17\x51\x2e\x4b\x27\x93\xbc\xca\x95\x69\x5a\x10\xa1\x9e\xaf\x08\xe5\x62\x58\xff\xf2\x64\xe0\x86\xb9\xdd\xcf\x7c\x64\xe5\x38\x5a\x39\xab\x03\x77\x44\x9f\xc7\x7a\x79\xe2\x87\x74\xea\x58\x43\x6f\x60\x59\x3a\x3a\xee\x4c\x79\xac\x17\x2f\x19\x27\x7b\x8f\xc1\x79\x23\x7f\xc3\x14\xf0\xd7\x80\xff\x86\xd6\x34\xfc\xb5\xd0\x5c\x4a\x9b\x5f\xdb\x6b\x3a\xe9\x6e\xf7\x57\xda\xf8\x8c\xed\x5d\x3e\x71\x19\xee\x55\x7e\x3c\xe8\xf7\xb3\x84\x7b\xbd\x16\x1d\xd8\x98\x9d\x16\xf7\x8b\xaa\xcd\x9e\xec\x57\xdb\x4b\xc1\xf0\xc9\xe3\xdb\x31\x99\x3e\x88\xaf\xd7\x35\x47\x7c\x6f\x5a\x2f\x3c\x94\x7d\x86\x21\xee\x76\x57\xdc\xff\xcb\x3b\xbf\x77\xe7\xbf\x88\xb9\x4f\xac\x7e\xe6\x1b\xbf\x9c\xcd\x7d\xed\xc9\xab\x9f\x9c\x42\xa3\xdf\xa3\xdf\x9c\xf1\x4b\xf4\xc3\xff\x7d\xff\xfb\x83\x0f\x3e\x78\x60\xe3\xa6\x2b\xbe\xff\x0a\xfa\x00\xfd\xfc\x84\x7f\xbc\xf6\xca\xb7\xd1\xf7\x4c\xd3\x90\x25\x1e\xf1\x3a\x95\xd5\xb3\xb1\xdb\x6b\x93\x7f\xaf\xb9\xef\xa0\xd7\xaf\x83\x87\xc3\xdf\x5f\x31\x80\xf4\x3f\x4f\x39\xef\xba\xeb\xcf\xfb\x13\xaa\x9d\x77\xde\xf9\x5f\x38\xfc\x49\x98\x88\xff\xc7\x39\xb7\x5c\x7f\xcb\xb2\xbb\xbf\x70\xf9\xf5\x83\x8f\xdc\xf2\xe8\xb2\xa7\xcf\x59\xf6\x85\xd3\xd0\x2b\xa3\x56\x82\x45\x15\x4d\xd5\x15\x93\x46\x85\x06\xe0\x20\x15\xf1\x09\x60\x5e\xb0\xfb\xc1\x4e\x9a\x18\xc2\x3d\x85\x87\x7e\xd0\x3a\xd5\xf1\xba\xc5\xee\x89\x11\xfd\x52\x49\x65\x46\x2e\xc5\x70\x15\x43\xf2\x51\x6e\xda\xb3\xde\xf9\xec\x3f\xa7\x53\x2f\xf3\xe9\x6e\x45\xa7\x7e\x37\xf4\x7a\x07\x5f\x54\xfc\x7c\x73\xa6\x8b\x8d\xa2\xb5\x6c\xbb\xfd\x5b\x22\x7c\xba\xad\xaf\xbf\xd2\x5d\x8e\x8f\xfc\x2a\x90\xcb\x02\xbe\x17\x78\x3c\x98\x06\x58\xdc\x57\xea\xac\x68\x5f\xa9\x09\xad\x3a\x35\xbd\x2d\xc7\x87\x77\xaf\x66\x62\xc4\xf7\x81\x8b\x86\xfa\x84\x8f\xf1\xa2\x00\x0d\x93\xa0\x0c\x68\x21\x09\xd6\x50\xba\x00\x59\x11\x19\x15\x94\x2d\x23\x5d\x81\x5c\x11\x51\xb0\x8c\x14\x82\x21\x28\xb7\x2a\x19\xbc\x22\x8b\x69\x59\x61\x88\x7c\x5e\xb3\x54\xa7\x6e\x61\xe7\x47\x8c\xd6\x45\x4b\x50\xe3\x4e\xa1\x50\x28\x18\xa8\x6c\xe4\x65\xcb\x84\x2c\x2a\xe4\x0c\xbd\x64\xe0\xbc\x2d\xda\xcd\xbb\x59\x45\x4c\x9b\x69\x1e\xd6\xca\xa8\xca\xc3\x74\x39\x2d\xa0\xb2\xad\x14\x4a\x85\x2a\x5f\x2b\x84\x60\xdb\xd4\x49\x3c\x1b\xff\x92\x08\x6c\x8d\x54\x66\x77\x62\x9c\x6e\xeb\xe5\x65\x7a\xf4\xfe\x4b\x9f\x37\x36\x6d\x95\xbd\xa4\x8a\x73\x87\x8e\x01\x27\x81\xcf\x83\xf9\x60\x21\x00\x30\x35\x25\x91\xf1\x5d\x3e\x6d\x6a\xf1\x8b\xfd\xc0\x90\xa3\x12\xb3\xc0\x7e\x8a\x88\xf7\xcd\x4a\xb5\x09\xc6\x73\xd4\x92\xe9\x7c\x4e\x2d\xe4\x90\xae\x8b\x35\xa5\x08\x81\xa1\x9b\x95\x5a\x96\xd3\x4c\xc9\x64\x51\x0e\x19\x4c\x01\xce\x33\x19\x51\x64\x29\x93\x96\x1c\x47\x46\x9a\x51\x40\x55\xb9\xe6\xa0\xb9\xa6\x69\x2a\x32\x8f\x38\x3d\x2d\x68\x02\x29\x23\xd5\x96\x0a\x50\xe3\x68\x64\xd4\x94\x12\xcb\x20\xc7\x48\xb3\x92\xc4\xe5\xab\xbc\xca\x51\x6a\x0e\xd9\x6e\x15\x37\x21\xcb\x8b\xbc\x44\xb0\xc8\x46\x05\xc5\x10\x61\x32\x46\x8d\x51\x09\x16\xa9\x96\xa5\x9b\x90\xc1\xe4\xc2\xc3\x64\xc4\x2e\xdd\x75\x78\x87\xaf\x42\xf1\xf3\x48\xb1\xfe\x62\xe7\x40\xcb\x97\xe3\xc7\x6d\x0f\x34\x75\xc3\xbe\xfd\x47\x03\x40\x88\x9e\xe5\xd3\x85\xaf\x91\x83\x5f\x8a\xd0\x06\xdb\xa2\x0d\x5c\x66\x03\xe0\x9c\x8b\xa8\x9e\x74\x6d\x08\xa7\xd5\x00\xa7\x7d\x3d\x7a\xf0\x8b\xe3\xf5\x53\x8a\x1c\xfc\x42\x77\xdb\x7b\xc3\xd9\xa1\xb9\xc4\xf6\x5c\xc3\xb8\x62\xfc\xe0\x35\xdd\x74\xf2\x41\xa9\x53\xe6\xee\x5a\xd8\x81\x57\x11\x9f\xe9\xba\x9f\x46\xe0\xc2\xa5\x32\xfb\xb0\x1f\x62\xc3\xc2\x08\xaf\x68\xdb\xf7\x87\x77\xb7\xc9\x83\x7b\x0d\xed\xf9\xb1\xef\x6e\xdf\xa9\xdd\x69\x7f\xe7\x29\xa1\x71\x1c\xef\x1f\xbe\x78\x9c\xce\x65\x85\x78\xc8\x3f\x23\xf2\xcb\x08\xec\xae\xab\x3b\x79\x8e\x73\x7a\x44\x7e\x05\x30\x7d\x66\x57\x04\x0e\x9e\x6e\x23\xa7\x32\x1b\x16\x80\xf1\x7e\xee\x40\xf7\x58\xf7\x20\xe8\xf0\xd3\x78\xeb\x7f\xa6\xd8\xf5\x9c\xc9\xad\x5f\xee\xb4\x71\xbc\xf5\x0f\xfd\x67\xe7\xb9\x0c\xed\x19\xa7\xbb\xd9\x6d\x1d\x79\x68\xca\x41\x74\xde\xe5\x11\x5d\xd2\x68\x3d\xbf\x0e\x8c\xd3\x55\xf1\x7b\xb7\xb4\xec\xcc\xf3\xb1\x8e\x79\x39\xb5\x62\x78\xb4\xf1\xe9\xf9\x8b\xe6\x5f\x93\x22\x77\x1e\xdf\xdd\x06\xd8\xf9\xb5\xee\x76\xf4\xa6\xef\x74\xee\xcd\x7b\x7e\xef\x8a\x08\xac\x03\x5f\xd6\xe6\xaf\xf9\x7c\xfc\xaa\xc6\xa7\x13\x7b\x49\x01\x24\x7c\xad\x6d\x01\x38\xc7\xef\x31\x3b\xa9\x77\x42\x7c\x4a\x22\xdc\x29\x34\x48\xb8\x1f\xe8\xc5\x25\x35\x3e\x81\xa5\x95\xa0\x47\x85\x78\xf1\x63\x13\xd6\x74\x3a\xc6\x21\x86\x22\x78\x94\x96\x9b\xd6\x96\x60\x88\x88\x56\xa0\x2d\xa2\x34\x41\xa7\x51\x29\xcb\xa9\x36\x9c\xf7\xc9\x6c\x2e\x41\xaf\xb3\x7a\x4f\x79\x1f\xc3\xe9\x9a\x6e\x49\xa6\x0a\x41\x45\xd7\x65\x4b\xcf\xf2\x1c\x2b\xa9\x75\xfe\xff\x36\xbb\x9a\x30\x29\x36\xe8\x84\x44\x0a\xa9\xbe\xe1\x51\xa0\x35\x4a\x29\xd2\x61\x0b\x25\x1f\x86\x85\x10\x7e\xe4\xc7\xf1\x77\x8f\xde\x0e\xeb\xd4\x91\xd6\xed\x1a\x47\x27\x66\x7b\x1e\x27\xdb\xe9\x33\xd9\xf0\xa5\x88\xde\xd6\xa1\x8b\xef\xf9\xb8\x53\x2f\xdc\x77\x61\x93\xc7\xec\x5b\xd6\xd2\x0e\x3b\x69\x22\xb5\xe2\xa9\xcb\xc1\x1e\x0e\x2c\xe0\x53\x8b\xed\x25\x00\x34\x2e\xe5\xc0\x22\xa3\x1b\xce\x6f\x39\xb4\x73\xee\xfd\x6b\x22\x3a\x67\xe0\x43\xd9\xf7\x52\x97\xf1\xb3\x53\x2b\x77\x64\x01\x20\x36\x71\xe0\xcc\x37\x03\x9b\x44\x0c\x72\x47\xf0\xfa\x5f\xf8\x76\x08\x0e\x5e\x0e\xc7\x8e\x90\x2f\xed\xaa\xa8\x2c\xf5\x79\xf4\x95\x9d\xfa\xe8\xbe\xeb\xdb\xb2\x03\x7c\x1a\xd7\x51\x36\x48\xce\xbf\x3d\xdf\xba\xed\xd9\x94\xa7\xe7\x7a\x95\xc9\x5b\x75\x7b\x5a\x39\xf8\xf1\x81\xde\x49\x30\x7c\xab\xb5\x77\x20\x68\xfa\xed\x59\x1a\xed\x60\x60\x50\xdc\xbb\x6f\x56\x81\x54\xdd\x32\xb4\x91\x48\x08\x1f\x33\x04\x8f\x04\xe8\xb8\x95\x58\x1e\x55\x91\x00\xd3\xa8\x02\x1d\x48\x99\x90\x72\x79\x48\xa1\x2a\x67\x1b\x8a\x61\xa1\xaa\x25\x55\x6a\x0c\x93\xb4\x93\x26\xb2\x51\xce\xea\x11\x4c\xd9\x16\x8d\x31\xde\x92\x55\xcb\x24\x39\xc3\x46\x8c\x63\x18\x0e\x2c\xd9\xb6\x6d\xa3\x1c\xfe\x85\x92\x0e\xb2\x04\x55\xd7\xa5\x34\xca\xa5\x69\x9a\x71\xb2\x95\x26\x9e\xaa\x4e\x49\x28\xe6\xb9\x6c\xcd\x11\xfd\x3b\xf8\x92\x77\x7e\xfb\xa6\x63\x78\xf4\x81\x96\xaf\x50\xf2\xee\x6a\xec\x5d\x19\x19\xef\xf0\xd7\x6c\x7a\xac\xbb\x3f\xc8\xe1\x43\xe3\x38\x8f\x6e\xcf\xcb\x58\x26\x62\x0c\xdf\xf3\xed\xa8\x4d\x39\xf4\x8f\x2e\xf2\x2a\xe0\x4d\x41\xee\x4f\x07\x5f\x7c\xfe\xaf\x11\x39\x66\xa4\x32\xcf\xfc\xb8\x39\xbe\xef\xe5\x6e\x72\x8f\x22\x87\xbe\x17\xa2\x93\x90\x5f\x7b\xa8\x15\xef\xb7\x31\x3e\x09\xa9\xcc\x05\x33\x31\xce\x44\x7d\x51\x6a\x2a\x73\x60\x42\x64\x9d\x81\x6f\x71\x07\x1d\x19\x0f\xd6\xe3\xc9\xd5\x1d\xe1\x3a\x9e\x5a\x5b\xbe\xed\xf8\xcf\x6e\xbe\x12\x8a\xdc\x71\x4b\xf7\xf1\xe7\x7f\xd7\x4d\x6e\x50\xe4\x0b\x8b\xc6\xf9\x3e\xbc\xf9\xaf\x1f\x67\x2f\x7a\xf3\x87\xf3\x38\xf2\x6d\x9e\xbe\x63\x72\x44\x1f\x52\x02\xda\xb9\x02\x74\xf1\x2b\xa6\xc8\x2d\xe7\x8e\x93\x7b\x18\xce\x9b\xa3\xb6\x82\x14\xcc\x73\x79\xe7\xb9\xf8\x3e\xff\x6c\xb7\xf9\x43\xb9\x54\x62\x70\x67\x0e\xe3\xdc\x76\xb7\x13\x0e\x3b\x7f\xde\xc5\x46\xd1\x52\x99\x17\xcf\xc6\x7c\xc1\x7b\xbb\xd8\x4d\xdf\xda\x51\x8c\xf8\x63\x9a\x72\xec\xdb\xd8\x9f\x14\xd5\x0d\x5b\xfe\xc3\xcc\x5e\x5c\x45\x66\xf0\xb2\xa8\x0d\xb3\x63\x5d\x5b\xff\xc0\xbd\x53\xa4\x84\x4d\xca\x3e\x17\x69\xf9\x2c\x96\x75\xb7\x63\xfa\x82\x9b\x7a\x13\x82\x5b\x7a\xed\xfb\x3d\xf1\x80\x97\xf8\x1d\x80\xa7\x46\xd9\x89\x05\x59\x33\x46\x7b\x97\x4a\x14\xc4\x17\x60\x52\x44\x66\xc9\x2d\x17\x91\x21\x42\xce\x40\x02\x14\x51\x11\x16\x62\x74\xbd\xdc\xfa\x81\xba\x21\xea\x82\x81\xaa\x16\x2d\x16\x28\x3b\x9d\xa6\xcc\x34\xc7\x20\xa6\xc8\xc7\xaa\x86\xa1\xa9\xf6\x58\x4e\xd7\x34\xd5\x88\x57\x55\x55\x55\x0d\xd7\x34\x4c\xde\xd2\x6b\x55\x53\xd7\x34\x83\x90\x55\x15\x19\x0a\x32\x15\xe4\xe8\x86\x60\xe8\x1c\xb2\xd9\x74\x32\x49\xd1\x96\x98\x63\x19\x4e\x86\x8c\x51\x90\x73\x8e\x20\x54\x34\xc5\x8c\xe4\x84\x61\x3d\x76\x3d\x8e\x60\x0d\x5e\x1a\xd0\x0f\xb6\x31\x77\xbc\x8f\xe5\xd5\x25\x21\x59\x80\xf1\x75\xc7\x9f\xdb\x32\x02\x24\x7c\xfa\x97\x71\x4d\x9d\xe9\xe0\x44\xc0\x7a\xdc\xb9\x9d\x62\x4e\x26\x70\x1e\x57\xab\xa6\x14\xf6\x02\x35\x19\x76\xe8\xca\x30\xb6\x0b\x7d\xa0\x9e\xea\x77\x8e\x6e\xda\x41\x9e\x5a\xd1\x73\x21\xa1\xbb\xaa\x01\x25\x64\xa1\x7d\x9c\x61\x42\x06\x95\x6c\x4d\x94\x65\x4b\xcd\x4b\x15\x13\x39\x50\x46\xd5\x2c\xd4\x61\x51\x15\x4c\x41\x89\x31\xa6\x64\x8b\x46\x9d\xb1\x58\xdd\x34\xd5\x6c\xdb\x19\x54\xd3\x35\x5d\xb3\xe2\xbf\xac\x57\x0d\x58\x83\x47\x69\x2c\x9d\xd7\xb3\xaa\xa2\xa9\x22\xca\x43\x25\x67\xa8\x66\x49\xb7\x58\x9d\xad\xd3\x86\xc3\x39\x3a\x55\xc2\xc6\x4d\x91\x43\x1a\xcb\x24\x45\x93\x6f\x00\x9a\x11\xa5\xa6\x3e\x53\x74\x94\x62\xc4\xbe\xf6\x62\x40\x7f\x07\x5d\xfc\xde\x14\x79\xe0\x88\x10\x8d\xc9\x21\x1e\x97\x8d\xe0\xf3\x00\xb5\xf2\x85\x4f\x01\x48\x6c\x3b\x63\x33\xbf\x26\x85\x2d\xcd\x70\xdc\x73\xc4\x6a\x9e\xc7\x8e\x63\xbb\xdb\x03\x1b\xce\xea\xe4\x7f\x23\xfb\x3b\xf8\x22\xef\xc5\x3d\xbd\x78\xc2\x01\xef\x66\xcf\x25\xdd\x74\x91\x4d\x8f\x76\xd7\x51\xb6\xbe\x16\x1a\x97\xda\x3a\xf8\xb0\xd3\xe9\x9f\x18\x11\x9a\xef\xd8\xef\x75\x31\xb9\x38\xaa\x93\x7a\xdf\x71\xee\x89\xf0\x65\xb5\xc5\x97\x07\x2f\x8a\xc0\x24\xdb\xe2\x53\xdb\xc9\x60\xdc\x97\x8d\x1b\x71\x77\xaf\xc1\x0b\x0f\xc2\x1f\x97\x75\xca\x15\x0f\xd7\x37\x9c\x89\x3f\x15\x7c\x79\x7a\x4c\xc2\x22\x37\xa7\x56\x3e\xa6\x00\x00\xdf\xe5\xc0\xfc\x6b\xb1\x05\xfa\x7a\xa0\xd7\x07\x3a\xf7\x8e\x19\x21\xb9\xa3\x86\x60\xf5\xc5\xd0\x7b\xf2\x6d\xf9\xb8\x23\x01\x3a\x7c\xc7\xbe\xdd\x80\xed\x00\xf0\x29\x70\x75\x63\x4a\x62\x2d\xb9\x2d\xa4\xdb\x9c\x00\x66\xfa\x1a\x79\xbf\xa7\x89\xb7\xba\xda\xe3\xda\x40\x03\xbd\xc7\xc2\x10\x27\x8a\x7f\x32\x2f\xea\x2f\xb7\x1c\x4e\x7c\xcb\x9d\x49\x11\x9f\x85\x93\x6b\x0d\xf8\x39\xf8\x0f\xca\x9d\x12\x83\xc4\x67\xea\x4a\xcc\x68\xff\xc0\x87\xf7\x3e\x7e\xd3\xba\xcd\xee\x3f\x1e\xbe\x63\xd5\xea\xf5\x70\xd9\xe6\xd9\xab\xd6\xad\x5b\xdd\x47\x6d\x9e\x79\xc1\x4d\x48\x5e\xb4\x63\x45\xcf\xdc\xe7\x6f\xda\xbc\x7c\x07\xb9\xed\xfe\xfb\xaf\xaf\xbf\x78\xff\xfd\xb1\x65\xd7\xdf\x8f\x06\xbe\xf8\xc5\x9f\x5f\x8f\x0a\x5f\x44\xc5\x2f\xfe\xf6\xca\x07\x1f\x1a\xfc\xf2\xe7\xce\x47\x1f\x6c\xbc\x35\x57\x40\x3f\x1c\x38\x3e\x99\x38\xfb\xd6\x79\xbf\x3a\xee\xf8\x25\x17\x43\x35\xf7\xdf\xe7\xff\xb2\x80\x73\xf1\x9a\x67\xd7\xc4\xc1\xbe\xe6\x59\xac\xbb\x02\x43\x64\x69\x80\x1f\xed\x78\x17\x39\xb8\xa4\x53\x7f\xf6\xce\x6f\xdf\xb5\x58\xea\xa2\xae\x72\xe3\x9a\xd0\x19\x85\xfc\xf8\xeb\x9f\x06\x9d\xfe\x7d\x4f\x66\xbd\xd3\x69\x3b\xfa\xba\xfb\x7f\x74\xc7\xff\xe7\x4f\x3e\x88\x6f\xe2\xfc\x10\xed\x85\xe2\x10\x07\x0e\xed\x1c\x77\xde\xea\x42\x93\x81\x8d\x11\xe4\xf2\x7a\x70\xd2\x7c\x38\x91\x83\xe7\x45\x6c\x12\x23\x80\xd1\xb9\x9d\x7a\xfd\xc8\x54\xac\xcf\x79\x16\xf9\x39\xdd\xf6\xe0\xfc\xba\xd3\x97\xf1\xdc\x5b\x6d\x3d\x7d\xf8\x87\x01\xcc\x95\x36\x2e\xaf\xeb\x0f\xde\x33\x2f\xf1\xa5\x60\x7f\x8b\x9c\x3f\xde\xf2\xaf\x39\x6b\x82\xde\x73\x11\xfd\x67\xdb\xde\xee\x30\x0f\xe5\x3d\xfb\x72\x66\xeb\xaf\xf1\x9a\x05\x0c\xb1\xc3\xa2\xba\x82\x07\xdf\xb5\x7f\x0b\xf4\xdf\x23\x13\x06\x69\xa5\x56\xec\x7b\x19\xbc\xcc\x81\xb9\xfd\xa9\xc4\x63\xcb\x01\x80\x85\xf1\x7a\xd9\xf6\x1f\x77\x3f\x93\xed\xec\xb8\x75\x79\x7a\xdc\x61\x9d\x7a\x8a\x7f\xb6\x7c\xc4\x46\xd1\x5a\x7e\xff\x91\x9f\x05\x67\x25\x78\xb9\x53\xdb\xfe\x32\x4e\xcf\x0d\xe5\x2c\x6c\xfb\xa0\x53\x06\x1c\xf0\x62\xfa\x33\x42\xeb\x0c\xad\xff\x85\xfb\xfd\x71\xba\x9d\x83\x55\x04\x29\x72\xf8\x2f\xe3\xce\xdc\x3b\xed\xc5\x21\x7a\x71\x5a\x31\x2f\x8a\x7c\xee\xa7\x11\xdb\xa1\x89\x3b\xfd\xe3\x6c\x87\x10\xdd\x3d\x77\x74\xc4\x1f\x14\x8c\x3b\xe1\x5a\xfc\x7a\x9b\x56\x9e\x3b\x36\x18\x6f\xe5\x18\x0c\x80\xf1\xf1\xf0\x40\x4f\xdc\xf8\x52\xa7\x3f\xc8\xc7\xfd\xef\x74\xa7\xb9\xaf\x27\xbb\x9d\x4b\x2a\xb3\xfd\x10\xdc\x91\x39\xd1\x4d\xb6\x6c\x6f\xd5\xee\xbf\xa2\x41\x27\xf6\x92\xdb\xa8\x95\xc3\x37\x00\x02\x82\x33\x0e\x9d\x3d\x15\xcb\x99\x22\xb5\x78\x97\xdc\x18\x85\xaf\x73\x57\xcc\x5f\x10\xc8\xa0\x6c\x2a\xf3\xfc\xab\x91\x33\x54\x03\xf9\xbe\x18\xe3\x68\x06\xef\x8c\x8f\xf2\x0c\xe7\x9b\xa0\x33\x4e\xa3\x87\xce\xdd\x19\x27\x97\xbd\xfc\x28\x3a\x72\x8e\x7a\x70\x8e\x8b\xba\xc3\xe7\x85\x8b\xba\xe3\xd5\xf6\x5f\x8e\x83\x1b\xb6\x03\x9e\xcb\x46\xfc\x53\x4d\x7d\xdc\xb3\xf5\x3c\xef\xe4\xd9\xa1\xef\x68\xa9\xcc\x73\xd7\x87\xf9\x52\xe3\x77\x8d\xf9\xad\x77\xaf\xf9\x57\x8a\x7c\xee\x9e\xce\xb9\x7c\x5c\x59\x1e\xa1\xa5\x80\x8f\x6d\x5b\xdd\xe9\x57\xf0\xf7\xb6\x70\xdc\xde\xf0\x6a\xd6\xbe\x37\x0e\x46\x78\x0f\xdb\xae\x8b\xf8\xc5\x82\x3d\x3f\xf3\x8b\x4e\xd9\x6a\x9f\x89\xf5\x0d\x2c\x61\x6d\x2e\xf8\xce\x10\x8e\x83\x2f\xe9\x01\xa7\xbf\xcf\x01\x6a\xd1\xb6\xf9\x97\x83\x79\xef\x71\xdd\xfd\x73\x8b\x23\xf6\x97\x91\xca\x6c\xe0\xc0\xbf\xc9\x49\xdc\xd6\xf2\xa7\x5e\xd6\x38\x2b\x71\x21\x79\x17\xb5\x62\x64\xe9\x61\x63\x03\x3f\xe2\x3e\x47\x2d\xde\x06\x1a\x37\x81\xf8\x59\xd9\x33\xde\x1a\x4f\x5f\xdb\xbd\x3e\xcc\x87\x00\xa1\x71\x66\xc2\x26\xe7\x07\x95\x28\xdb\xfe\x8d\x7e\xb0\x18\x2c\x89\x54\x80\x6f\xdb\x1f\x5d\xc6\x62\x9f\x4c\x13\x78\xd7\x74\x6b\x86\x41\x24\xdd\x5a\xeb\x87\x3c\x64\xdc\x50\xf9\x13\x86\x53\x4f\x1b\xb3\x14\xb5\x47\x46\x25\x0b\x71\xcd\xdf\xc4\x1b\x1d\x03\x68\xee\xff\x1d\x4c\x0d\xf3\x2b\x23\xa0\x97\x2b\x03\xb8\x62\x3e\xd9\x84\x6b\x02\xcc\xd9\xd1\x3c\xbf\x67\xf3\x57\xa5\x4e\x7f\xe7\x8c\x54\x88\xfe\xf4\x00\x27\xfe\xd6\xdd\x3e\x1f\xda\xe1\xdb\x7f\x4d\x1a\xdf\x4a\xde\x03\xa6\x80\xe9\xe0\x14\xb0\x04\x5c\x04\x2e\x07\xd7\x81\x9b\xdb\x55\x04\x26\x84\x2d\x94\x89\x13\x70\x1d\xdb\x20\x6e\x3d\x23\x1c\xc4\x86\xfd\x5e\xbf\xaa\x50\x81\x9c\x69\x9f\x86\x89\xbe\x59\xa9\x89\xd3\x62\x5d\xfc\xa4\x03\x81\x97\xb4\xf9\x6d\x07\xea\x26\xd4\x90\x56\xb0\x24\x4d\x37\x8d\x02\x5f\x75\x90\xaa\x68\x49\x8a\xe7\x04\x36\xcb\xf2\x92\x41\x28\x5a\x32\x2d\x0b\x22\xc7\x33\xac\xac\xc2\x27\x5e\x4b\x0e\x26\xe1\xc2\xcb\x07\xcf\xbc\x9c\xbe\xe6\x1c\xe6\x94\xe4\x4b\xbd\x1b\xb7\x3f\xf0\xd4\xc6\xde\x6f\xff\x55\x13\x75\x41\x8b\x25\x4d\xc9\x14\xcd\x3a\x6b\x89\x45\xc8\xc9\x16\x65\x23\x05\x15\xcd\xb2\xae\xaa\x9a\x11\xaf\x69\x9a\x81\x24\xd5\x52\x75\x09\x39\x50\x2c\x6a\xba\x0e\x93\x50\x65\xd3\x3c\xc7\x89\x32\x9f\x55\x44\xd1\x29\xa7\x05\x4e\x90\x14\x91\x17\x38\xc9\x82\xdc\xf2\xab\xae\x5a\xee\x5e\x8b\x46\x8f\xdc\x76\xe4\xd7\xe0\xef\xd1\xf7\xd0\xde\x27\xef\xb8\x09\x9e\x06\xc9\xba\xa0\xea\x82\xae\xb2\x96\x23\x3a\x16\x8f\x8a\x69\x5a\x30\xd8\x92\x2c\xf0\x50\x14\xaa\x86\x62\x47\xf8\x93\x17\x77\x18\x7a\x2e\x74\x2e\xf7\x91\x2a\xb5\xd2\x79\x19\xbd\x03\x00\xff\x16\xe7\x5b\x97\x5d\x64\xd9\x82\xee\x3e\x86\x2d\xc4\x38\x3b\xc3\xe3\x37\x13\x0e\x22\x73\xdb\xf9\x4f\x7e\x8d\x93\x5d\x98\x83\x0f\x9e\x15\xb1\xd3\x02\xb9\xb1\xe9\x91\x88\x4d\xc2\xa5\x32\xfb\xbe\x83\x75\xce\xef\xb6\xa4\x42\xb0\x56\x29\x58\xeb\x99\x11\x9e\xa6\xb5\x78\x97\x39\xb7\xbb\x5f\x68\xdb\x5d\xdd\x79\xe0\xf6\xdf\x85\xe4\x77\xc8\x8f\x6c\xfd\x3d\x90\xdf\x82\x27\x47\x7d\x3b\x89\xeb\xea\x0b\x21\x07\xcf\xe8\xae\xdf\x98\x7f\x8a\xf0\xd8\x60\xcf\x5b\x16\x76\xfa\xc7\xd6\xb9\x11\x19\x18\xe8\x69\xc3\xbb\xba\xe8\xae\xed\x1c\x97\x5f\x87\x74\x6f\xb3\x6d\x37\x1d\xf8\xd4\xb8\x7d\x61\xbd\x64\xc4\xab\x3d\xf0\x19\x20\x37\x98\x84\x45\x0e\x06\x35\x79\x27\x81\xa3\x7d\x2e\x78\x1a\xe6\x82\xe3\xab\x4b\xc7\xfb\x66\xcd\xc0\x4d\x24\xbc\x3a\x1e\xde\x2d\xb1\x48\x7c\xc2\xab\x26\xd4\x3f\x29\xea\xa5\xa1\x33\x03\xd0\xe9\x31\xc7\x64\x23\xa6\xd6\xf5\xd6\x4f\x41\xa8\xa0\x0a\x57\x23\xf2\x30\x0d\xa9\x2c\xaa\xa1\xea\x58\x3e\xc6\xbb\x02\x6e\x93\xc9\xd7\x8a\xa4\xa4\x89\x96\xa0\xba\x95\x2c\x6d\xd0\x9c\x5b\xd4\x54\x4d\x35\x20\x6b\xf1\xc5\x7c\xd2\xa1\xd2\x94\x95\xe6\x18\xc4\xa2\x9c\xd2\xb3\xd5\x95\x61\x89\xaf\xf1\x35\xbe\x24\x73\xac\x46\xb3\x34\xab\x65\xe9\xd8\x3f\x2c\xc3\xb0\x8c\xfa\xe7\xec\x22\x5f\xb2\x39\x49\x66\x15\x91\xe6\x2b\xba\x62\x9a\x05\x96\x4e\x26\x93\xb4\x2e\x3a\x2c\xcd\x2b\xe3\x65\xcc\x7a\xab\x9b\x6c\xa7\xc8\xe1\xa9\xdd\xc7\xb7\xcc\xef\x4e\x1f\xd6\xb5\xe3\xc6\xb1\x6f\x74\x70\x7e\x44\xb7\x0d\xe8\x66\x7f\xbb\x37\x82\x9c\xf8\x05\xf9\x34\xc6\xad\x1a\xb5\x72\xf7\xfc\x46\x95\xb8\x73\xc1\x55\x03\x13\xa9\xc5\xbb\xe7\x81\x89\xc4\xe5\x67\x4e\x9e\x7d\x4b\xe0\x8b\x0d\xe4\xff\x66\x74\x10\x1d\x75\xde\x38\xff\x88\xd0\xb6\xe9\x06\x4f\xef\x26\x67\x9f\xf9\x79\x80\xff\x74\xc2\xc4\x77\xea\xbf\x0b\x8a\x29\x72\xef\x51\xc0\x0e\xe9\xb5\x42\x2a\x63\xad\x8b\xe8\xb5\x42\x2b\x7e\xe3\xed\x69\xd3\x9a\x71\xfa\x2e\x7e\xf7\x08\xf6\x22\x3c\xf7\x5e\xc8\x57\xd0\xd2\xf1\x33\x6b\x4f\xc3\x9a\xfe\x6d\x21\x3b\x34\xb0\x89\x70\x2a\x45\x97\x33\x38\x30\x38\x6e\x8f\x9e\x7f\x26\xd6\x09\x13\x67\x3b\x88\xc6\x5a\x7c\x5d\x73\xcf\x50\x48\x4f\x9b\xdb\xd5\xde\x9c\x13\xd1\xe9\xd5\xc0\x4e\x3c\x6d\x9c\xbe\xf4\x11\xe8\x8c\xc1\x06\xb0\x4d\x65\xf6\x4f\xc4\x55\xb6\xaf\xec\xc6\x8f\xb6\x85\xe3\xbc\x4e\xe8\x0c\xb3\xdd\xf5\x21\xcb\xf0\xfd\x1a\xbe\x9e\x0e\xe2\xe0\x28\x90\xf5\x63\x35\x02\xb8\x16\x5c\xdf\xce\xe4\xf4\xaa\x1c\xe3\xc2\x5e\x99\x98\xd7\x4f\x15\x86\x1d\xb0\x1d\x9e\x42\x9c\x46\x16\x90\xf5\x27\x4b\x1f\x23\x73\x3c\xa3\x30\x3c\x02\x30\x9b\x34\x92\x50\x41\x8e\x00\x69\x61\xec\x46\x0e\xd5\x14\xc8\xd0\xa8\x58\xd7\x60\xd6\x84\x2c\x2a\x42\x09\x95\x86\xbe\x91\xfd\xd5\x53\xa6\x51\xe0\x7e\xbb\x09\xd9\x50\x45\x05\xad\xf9\x6d\x8e\x90\x14\x8e\x97\xf8\xdc\x27\x54\x8a\x14\x41\xe2\x25\xa1\xac\x59\xa6\x6e\x20\xa5\xaa\x15\xa1\x8c\xca\xa8\xa6\x54\xa0\x09\x59\xd3\xd4\x50\x45\xab\xde\xf6\xd5\xb5\xef\x22\x05\x6a\x3f\xf8\xaa\xae\x94\x34\x98\xa6\x44\x39\x2b\x49\x2c\xab\xf2\xbc\x50\xaf\x7c\x52\x9d\xc9\xab\x47\xa1\xa5\x32\x36\xee\x67\x38\x38\x1b\x84\x7d\xf8\x7a\x4b\x76\x6c\xbe\x2d\x24\x3b\xac\x90\x8f\x6d\x56\x77\x5b\x6b\xe3\x8f\xbb\x9f\xed\x88\xd3\x5d\x0f\xdf\xfa\x83\xd0\xf3\x21\x5f\xe4\xc8\xc5\x21\x9e\xaf\x93\x66\x40\x83\xba\xcf\xf3\x3d\x5b\xd7\x00\xc7\x00\x1a\x4c\x07\x0c\x38\x29\xc8\x2a\xba\x0e\xdc\x84\x23\xd2\x7e\x60\xcf\x43\x81\x49\xa1\x16\x02\xc7\x43\xef\xaa\xfd\xb1\x91\x30\x5f\x98\xed\xfb\xaa\x57\xa8\xf9\xc7\x34\x32\x81\xbb\x0b\x35\x65\x46\x4f\xa8\x2a\x4a\x66\x00\xce\x9a\xdd\x3b\x39\x61\xb8\x25\x58\x1e\xcd\xc6\xab\x8c\xa0\xb2\xf4\xa8\x63\xe9\x26\x51\x4c\xd3\x56\x96\x16\x90\x6d\x22\x0b\x4a\xc8\x82\x35\x28\x9a\x90\x73\x15\x49\x10\x04\x09\x29\xaa\x28\x49\x52\x4f\x52\x12\x65\x41\x72\x79\x43\x10\x6c\x21\xa9\x53\x32\xaa\xea\x69\x3a\xc6\x28\x79\x1b\x9a\x1c\xca\xa2\x0a\x2a\x20\x49\x82\x4a\xcd\x90\x05\x59\xaa\x69\x34\x34\x1c\xc5\x35\x1c\x32\x6d\x88\xc8\x11\x54\x59\xe1\x79\x8e\x72\xab\x48\x12\xa1\x05\x2b\x44\x85\xa1\xd9\x2c\x57\x11\x45\x51\x2c\x49\xcd\x5f\x48\x60\x79\x49\x60\x59\xde\x10\x45\x59\x11\x54\x41\x96\xb3\x3a\x95\x4e\x4b\x8c\xc6\x31\xb4\xa2\x48\x0c\x63\xb2\x92\xc4\xea\x74\x96\xe3\xf9\xac\x6c\xe4\xd3\x2c\xca\x72\xbc\x08\x82\x7b\x13\x6d\x1e\xf8\xb5\x10\xdf\x70\xc8\xfb\x53\x2b\x1f\x8b\x03\x00\xdf\xe7\xc0\x9c\xc1\x14\xe6\x9c\x01\xbd\x07\x36\xdb\xba\xff\x8a\xc8\xf5\x36\xae\x38\x3e\xbd\x5f\xd6\x38\x3d\x31\x42\xde\x15\xc8\xef\xcf\x81\xcf\x83\x39\xed\x18\x40\xc4\x52\x09\x3a\x19\xfb\xfd\xf9\xa7\xc7\x0e\xd6\x9f\x7f\x5c\xaa\xe0\x79\x31\xb3\x2e\x9b\x84\xe4\x5a\xad\x9f\xbf\xc0\xe1\x69\x13\x9e\x9a\x70\x14\xfc\xd8\xfd\xed\xe7\x89\xa7\xd1\x5f\x57\xbe\xb7\x04\xfd\xf6\x66\xf4\xfd\x8d\xe8\xff\x2d\xdc\xad\xa2\x3f\xc0\x07\xa6\x1d\x89\xee\x8f\x3d\xb8\x66\xc9\xf2\x9b\x2f\x71\xf5\x25\x27\xae\x39\x71\x09\x7a\xe1\xd1\x47\x1f\xbc\xfa\xb2\xb3\x90\x72\xef\xe1\xa7\xde\xdb\x4f\xfc\xa0\xae\x12\xaa\x86\xf4\xe6\xef\x9e\xea\x9a\xed\x53\xd7\x68\x6b\x34\x7d\xcd\xe9\x1b\x96\x43\xf0\x5f\x4f\xe9\xcb\xd7\xe8\xa7\x2f\x84\xbb\x17\xae\x59\xb8\x7c\xc9\xf2\x4b\x97\x9f\x7f\xd5\xa5\x68\xc7\xa8\x99\x98\x83\xde\x7b\xe0\x2e\x5d\xd9\x40\xa3\x57\x51\x83\x83\xa9\x2e\xb6\xee\xfe\x07\x23\x34\x13\xd8\x37\xfb\x1f\x3a\x88\x9f\x69\x20\xa2\xe7\x71\xa9\xcc\xf6\x41\xec\xe7\x78\x1a\x67\xef\xbc\x1c\xcc\x95\x6b\xd3\xdf\x96\x79\x11\xb9\x1e\xc8\xdf\xad\xaf\xfa\x67\x63\xe0\xd8\xa6\x18\xf8\x98\x67\x80\xcf\xfa\x7d\x57\x70\xf4\x3c\xe1\x77\x18\x9e\xd4\x84\x75\xef\x6c\x5c\x17\xad\xa5\x67\xc5\x23\x76\x4c\xb8\x93\x4e\x1f\x26\xa6\x9e\x16\x31\xcd\xc0\xc4\x34\xbd\x45\x4c\xde\x21\x1a\x64\xb9\xae\xa7\x09\xbb\x6c\x8e\x8a\x66\x11\x56\xd2\x2e\x0b\x95\x58\xad\x9e\x6c\xfd\xc0\x9c\x2a\x09\xb2\x42\x94\x54\x41\xe3\xd5\xba\x69\x29\x4a\x95\xa7\xf4\xb4\x86\x0a\x05\x26\x1b\x33\xf4\x2a\xa4\xa0\xc5\xb8\x25\x64\xa1\x3c\x12\x45\x28\xc2\xa4\x21\x0b\x92\x04\x81\x4e\x41\xbd\x62\xb8\xb4\x89\x0c\x45\xd4\x24\x8d\x14\x75\xc1\xad\xa0\x92\xe3\x40\x86\x48\x0b\xa8\x86\x55\xb0\x22\xc3\x49\x3c\x9b\xd5\x0c\x5e\xd7\xb3\x2a\x9d\xce\x4a\x8c\x29\x24\x79\x59\x95\xd8\xa4\x41\xc9\x22\xa3\xa7\x59\x8e\xe7\x58\x59\x2f\xa4\x69\xc4\x66\x45\x91\x60\x04\x53\x94\xa5\x16\x7d\x78\xfa\x0c\x96\xab\xfb\x17\xf8\x7c\x6b\x61\x43\x4c\xec\x27\x9f\x07\x47\x80\xb4\xcf\xbb\x4e\x04\x2c\x38\x0b\x57\x65\x12\xdb\x39\xb1\x64\x13\xb0\xb8\x68\x41\x13\xa8\x03\xbd\xc7\x12\x5e\x26\x42\x93\x75\x4d\xf9\x04\x79\x34\x13\x31\x0c\xfd\x2a\x07\x89\xbe\xe9\xc4\x5d\xc4\xe7\x0f\xdf\x9e\x20\x0e\x75\x7f\x93\xa0\xe0\x7b\xdb\x47\xaf\xfd\x16\xcc\x1f\xee\xbe\x1b\xfb\xc8\x8d\x11\x6e\xfb\x47\xfe\x44\x09\x35\xdb\x36\x6c\x68\x5c\xf2\x57\x7d\xc3\x92\x9b\x36\xac\xb8\x04\x26\xc8\xcf\xde\xd4\xb7\xf8\xab\xb3\x67\xd6\x3f\x5a\xb5\x2a\x76\xc8\x0a\xf4\xe6\xd2\xa5\x37\x2e\x5d\x8a\xfe\xb6\x14\xfd\xed\x92\x4b\x1e\xfe\x3f\x73\x6b\xc8\x89\xd3\x3f\xde\x76\xef\x46\x7b\xc6\x43\xb7\xbb\xf7\xc2\x0f\xcf\x59\xf5\x8d\x46\x03\xdc\xdc\xc8\x24\x2c\xd2\xa0\x56\xec\x7b\xb9\x51\xe0\x1e\x9d\xb3\x31\x95\x19\xaa\x03\x2a\x45\x0e\x8d\x01\x6a\xbc\xaf\x6a\xbf\x14\xd1\x8d\x94\x54\x66\xd7\x83\x21\x3f\xf6\xe7\x43\xb2\x2d\xc8\xbb\xde\x32\x37\x44\x5f\x6d\x9a\xc8\xec\xc5\xb7\x12\x07\xfb\x43\xb4\xa4\xa6\x32\xdb\x7a\x9b\x9f\x6d\x9b\x3a\xce\x8e\x0b\xf4\x1a\x87\xe9\xaa\xb3\x66\x76\x69\x78\xbe\x53\xc7\xfb\xa7\x28\x72\xcb\xec\x88\xfc\x6b\xe7\x0a\x9d\x1a\xac\xed\x84\xc4\x37\x9a\x36\xef\xc6\xf7\xc0\x0f\x1a\xbf\x3b\xed\xb5\xa6\xcd\xdb\x5c\xe7\x78\xff\xde\xc6\xd1\x6e\xf4\x4f\x61\xfa\x0f\xad\xd9\xef\xb5\xb0\x25\x0b\xc2\xf1\xf0\xc0\x8f\xb7\xdb\xab\xf9\xbc\x34\xc2\x17\xb4\x54\xc6\xb9\x17\xe7\x2a\xbf\xdc\xfa\x56\xa7\x8d\x90\x22\xf7\xdc\x02\xba\xc7\x36\x4e\xf1\x79\xc9\x0d\x0d\x21\xb1\x8d\xd4\x40\xda\xe7\x23\x73\xc1\x99\xe0\x72\xb0\x02\xdc\xda\xaa\x36\x39\x8d\x88\xa4\xf9\x93\x89\xbe\x14\x4e\xff\x9f\x46\x76\xcb\x1d\x8b\xfa\x44\x62\x5d\x7c\x30\xd3\x67\xff\x3b\x1f\x4c\xfc\xd1\x6d\x13\x7a\xe1\xba\x8b\x8e\x79\xf0\xf1\x3b\x6e\xfe\xc2\x43\x37\x3e\x7e\x93\xb3\x42\x5a\x74\x14\x7b\xcf\x6b\x17\x9f\xfe\xc5\x73\x26\xfd\xec\x30\x74\xf6\xff\xed\x1c\x39\x0b\xde\x6e\xc0\x07\xd1\x7d\x95\xea\x55\xdf\xfd\x8e\xf1\xd0\xd8\x5c\x08\x73\xe8\xd1\x1b\x6f\x4d\x1c\x2d\x2e\x5c\x36\x6f\xde\xec\xf3\xae\x7e\x8e\xb8\xed\xee\xc3\x8e\xb8\x7a\xd9\xb2\x85\x0b\xa7\x9e\xf0\xa5\x1b\x48\x6d\xf2\xcd\x5f\xb8\x0b\xed\x78\x7b\xdf\x8d\x5f\x56\xcd\xcd\xf7\xdc\xf3\xf0\x7a\x63\xe8\xe4\xf3\x2e\x85\x47\xdd\xee\x6c\x74\x46\xe7\xd6\x9f\xfe\xf7\x0e\x92\xf8\xd5\xeb\xd7\x3f\x88\xd6\x7e\xfc\xe8\xea\xc7\x86\xd1\x32\xf8\xfc\xae\xdd\x1b\xb6\xbf\x01\x1f\x9f\x3e\x79\xe9\x59\x0b\x96\x5e\xbe\x20\x7b\xed\x52\x7e\xcf\x6b\x93\x2f\xe7\x17\x2c\xb9\xfc\xac\x2c\x3f\xef\x22\xa3\xab\x3e\xb6\x65\x56\xc8\x66\xf7\xee\xef\xe3\x78\xf2\x33\x3f\xeb\xae\xbf\x05\x35\x60\x3b\xed\xc5\x96\xcc\x39\xb5\x71\x41\xe2\x0d\xf2\xc9\xe6\xf8\x3b\x47\x50\x99\x17\x8e\x3a\xf9\x33\x29\x72\x03\x98\x91\x08\x6c\x8c\x76\x2c\x8a\x0d\xe9\x76\x98\x47\x6e\xfd\x66\x53\x4e\x35\xad\xa4\x00\xb7\xa3\xf9\x05\xe4\x96\x7f\xf9\xdf\xb9\xbe\x21\x24\x9e\x22\x57\x50\x2b\x07\x3f\x6a\x8c\x11\xb1\x33\x9e\x3b\x83\x8b\xc8\xb6\x90\xbd\x36\x38\x33\xf4\x9e\x50\x8e\xe3\xd0\x48\x68\xfc\x2e\xf2\x2e\x6a\xc5\xf0\x68\x3d\xbe\xe0\x96\x33\xde\xa2\x16\x1f\xf8\x59\xe3\xfa\xc6\xdf\x17\x9e\xc8\x3d\x12\x8e\x83\xf8\x6b\xc0\xf9\x35\xe0\xd3\x40\x68\x9c\xd8\xe4\x31\x7e\xd5\x8f\xd9\x60\x1e\xb8\x00\x5c\x03\x56\x82\x1b\xc1\xed\xad\x2e\xa5\xe1\x4a\xc5\x5e\x3e\x7b\x44\xc1\x3c\xa8\xd1\x01\xfb\xc9\x44\xe4\xba\xcb\xf4\x70\x53\xd3\xe9\x13\x9b\x1f\x47\x7a\x5e\xfa\xc2\x17\xde\x0d\x1d\x8b\x28\x27\x75\x5b\xcc\xa5\xf3\x32\xc7\x51\x6e\x9e\x71\x6d\x0e\xd6\x18\x24\x12\x4b\x3f\x99\xf9\x51\x67\x8c\x24\xad\xab\x82\x69\xea\xaa\x64\x98\xa2\x25\x42\x26\x9e\x14\x2c\xcb\x36\x24\x27\x2f\xd9\x12\xe4\x68\x33\x49\x9b\xa3\x9a\xc9\x66\x4d\x2e\xa6\x7a\x7f\xf1\xd6\xa8\x68\xc5\x26\x49\x12\x7a\xfe\x5b\xc7\x3d\x7e\xdc\xe5\xfb\xd1\x8e\x05\xf7\x7d\xfe\x03\xf4\xf8\xd2\x9b\x6e\xba\xe7\x8a\xbe\x33\xff\xf4\xc0\x35\x9b\x76\xa1\x7f\x9d\x7c\x14\x99\x98\x73\x4d\xff\x37\x8e\x3a\xea\xcc\xc5\x70\xfe\xb3\xdf\x3e\x73\xc4\x8e\x7f\x5b\x16\x39\x49\x55\xb2\x1c\xaf\xca\x82\xca\x2b\x3a\xa4\x54\x89\xcd\x7a\xff\x53\x35\xc8\x2b\x12\x27\x32\xa6\xcc\xaa\x1a\x63\xc8\x8c\x86\x24\x94\xcf\xe5\x21\xdf\xc5\x3e\x4e\x91\x5b\x10\x13\xb6\x61\x82\x73\xdb\xdc\x8e\xab\x44\x6d\x98\xcf\x75\x8d\x9f\x78\x92\x83\x1c\x3c\xb9\x8b\x5f\x23\xb3\xee\x6b\xf8\xb3\x93\x02\x5a\x68\xe7\x41\xb7\x3e\xfb\x6c\x37\xbb\x68\xd3\xea\xee\x31\x99\xcd\xbf\x88\xf8\x1d\xb5\x54\xe6\x40\x4f\x87\xbd\x1d\xf1\x73\x1c\x38\x05\xff\xc9\x62\x3f\xc1\xa9\x21\xbd\x5a\x0a\xe5\x57\x85\x7b\x6f\xe2\xba\x41\xfb\x26\x87\xf2\x28\x4f\x0c\xd9\xfd\x46\x40\x93\x27\x74\xd2\xf7\xa6\xaf\x82\xce\xdc\xbd\x50\x4e\xd9\xa6\x87\xbb\xfb\x0e\x9f\xf9\x5e\x64\x3f\x6d\xbb\xe1\xb5\xee\xbe\xcc\x67\xde\xee\x7c\xde\x8f\xa5\xfc\x2f\x68\xc7\x04\xe5\xb6\xcc\x36\x1f\x29\x84\xf9\x93\x96\xca\xac\xe3\x23\xeb\x94\xb0\x1c\xc5\xf6\x22\x05\x52\xe4\x0b\xaf\xe6\x5b\xfe\xdb\xa8\x1f\x89\x09\xad\x07\xcb\xfe\xed\xbf\x48\x83\x54\xc6\xb8\x30\x1d\xf6\x29\x47\xf2\x77\xd7\xe7\x22\x7c\x4b\x0b\xee\x03\x78\x35\x87\xfa\x42\xfb\x33\x52\x99\x2d\xef\x62\xcf\x8f\xd0\xdd\xd7\x39\x1c\x8e\xe5\x1a\x6d\xb8\x0e\x66\x22\x7e\x19\x2d\x95\xb1\x9e\xc0\xef\xf0\x4e\x69\x06\xfe\x6c\x76\x83\x6d\x9e\x05\xb5\x72\xeb\xa9\xb1\x8b\x1b\xd5\xb9\x0c\x07\x9a\x3c\xec\x2f\x60\xee\x28\x07\xa8\xc5\xdb\x7e\x0f\xbf\xd7\xf8\xfb\x69\xb3\xb9\x2e\x3e\x24\xf3\xd7\x9d\xfb\xf6\x63\x1c\xa3\x21\x5a\xc8\x05\x36\x48\xc6\xc6\x91\xc9\xc1\xe9\x51\x5d\x60\xc4\xeb\x61\x21\x74\xfa\x0c\xfc\xbe\x73\xd3\x22\x7e\xdf\xb6\x4e\x33\x33\x14\x73\x73\x42\xfa\xc1\x54\xd0\x35\xee\xf9\xec\xb6\x4e\x3c\xf6\xc6\x37\x6e\xec\x46\x4b\x29\x72\x73\xb8\xae\xf9\x46\xf2\x09\x6a\xe5\x8e\xdd\x60\x2b\x38\x66\xee\x09\x67\x4c\xa3\x56\xae\xfd\x3a\xd8\x0e\xd2\x73\xef\x98\x77\x0d\xb5\x68\xe4\xb2\x38\x38\xfd\x42\x2e\xe2\x33\x7b\xe6\xcd\x0e\xdf\x74\xcb\xc7\xd6\xd4\x9e\x32\xce\x5a\xd0\xce\xa1\x16\x02\xff\x34\xce\xaf\x7e\xfe\x99\xe6\x67\xcf\xaf\xc7\x9f\x9d\xd8\xe0\x12\xaf\x7a\x7b\x78\x07\x50\x8b\xb6\xfc\xf7\x59\xe0\x8c\x43\xb9\x8e\x58\xc1\xe6\xfe\x0e\x9c\x15\x12\x36\x29\xa4\x32\x4f\xff\xb4\x65\xa9\x1d\x5c\x8f\xdc\xe5\xd5\x73\xee\x6d\x2c\x49\x0c\x91\xab\xa8\xcc\xc8\x85\x6f\xc5\x53\x99\xb5\x53\x71\x75\xcf\x9f\x7d\xba\xed\xab\xd1\x5a\x6b\xf7\xb9\x5d\x6f\x14\x0f\x37\x2c\xe9\xc8\xcd\x0b\xd9\x7f\x29\x72\xdd\xc6\x6e\xf2\x3e\x45\x6e\x6e\xf1\x1c\xba\x91\x4d\x14\x9b\xe3\x1b\xff\x28\xe0\x79\x0a\x6d\xd8\x7f\x35\x38\xc3\x15\xce\x53\x17\x7d\xea\xf4\x75\x67\x6c\xa5\x16\x39\x83\x97\xc5\xe7\xad\x39\xa3\x38\x3e\xae\x30\xb4\x3b\x12\x3f\x68\xf3\x67\x3a\xc4\xdf\xf2\xed\x9c\x95\xa1\xa9\x9d\x74\xf8\xf4\x9a\x96\xe6\x10\xf0\x00\xdf\xcf\xda\xe4\x01\x43\xdb\x22\x7a\xb1\xda\x01\x97\xe3\xbb\xd1\xe1\xba\x13\xbb\xc7\x83\xd6\xbf\xd4\x9d\x6e\x37\x3d\x14\xc1\xc9\xf6\x5a\xad\x4e\x3e\xbe\xde\x8c\xd0\x4e\x90\x03\xbf\x79\xce\x38\x7d\x3c\x44\x9f\x07\x4a\xa1\xe7\xf1\x7b\xad\x39\x61\x1c\x6a\xb8\xe8\xf1\xc4\x9b\xe4\xd3\xd4\xca\x27\x8e\x01\x9b\x61\x7c\xce\x2d\x73\xb8\x54\xdf\x48\x1f\x98\xd9\x98\x4b\x2d\xde\xf9\xdf\x8d\x3d\x8d\xcb\xcf\x3c\x6b\xd1\xab\xa1\xb5\x04\x6b\xb4\x8e\x0c\xc1\x39\xc4\x9b\xd7\xe1\xbc\x5e\x70\x08\x50\x1a\xe7\x25\x0c\x72\x2d\xee\xc7\x30\x03\x9c\x00\x4e\x06\xe7\x83\x2f\x81\x1b\xc0\x2d\x40\x05\x3a\x78\xc2\x8f\x7f\xf6\xe3\xdb\x68\x7e\xdf\xb9\x81\x69\x93\xf0\x8f\x97\x51\x3f\x6d\x52\xdf\xb4\x49\xfd\xcd\xbf\x67\x4c\xea\x1f\x98\xd2\xaa\x9d\x1c\x6e\x81\x41\xfa\x7d\x42\x33\x7d\x2d\x53\x20\xd6\x61\x0a\xcc\xc2\xa6\x40\xef\x27\x30\x05\xee\x84\xd7\x3c\x64\x4f\x39\xee\xda\x81\xbe\xb3\x91\x0e\xcf\x7a\x30\xff\x50\xee\x21\x38\x17\x6d\x25\x9e\xcf\x3f\x94\xcb\xc1\x05\x79\xf4\xc3\x9c\xcc\xa4\x61\x16\x71\x49\x0a\x9a\x49\x49\xcd\xaa\x69\x9d\x63\xe8\x24\x2a\x65\x1d\xa9\x44\xe7\x20\x4b\xd3\xb1\x73\xd6\x1e\x9e\x86\x1f\x2d\x3d\xfe\xfb\x5f\x7d\xfd\xa6\xe1\xc7\x56\xfd\xe6\x8e\xe1\xe1\xe5\x8b\x8e\xa7\x6f\x7f\x76\xc5\xd2\xe5\xcf\xd2\xe8\xcd\x24\xfa\xf5\xff\x6d\x1f\x90\x47\x5f\x72\xc9\xf4\x63\x4e\x3b\x8d\xfb\xf2\x62\x74\xcc\xa5\x57\x5d\x75\x15\x7c\x7f\xf1\xdf\x2f\xb8\xe0\x82\x0b\xd6\x2d\x6e\xfe\x7a\xe2\x94\x33\xe4\x33\x4e\xf9\xcb\x57\x27\xdd\x3c\xe9\x94\xeb\xec\x6b\x6e\x56\x20\x21\x9f\x78\x0c\x31\x78\xdc\xe5\x17\xde\x87\x5e\x42\xff\x5c\x77\xe7\xc3\x77\x3c\xff\xec\xea\xfb\xe4\x97\xee\x7b\x76\xee\xc9\x72\x7d\xd9\x7f\x3e\xfe\x97\x3f\x1e\x5b\xbf\xf6\xe6\xfb\xce\xbd\xef\xe6\x93\xd6\x3e\xb7\xec\xb9\xb5\x67\xa1\xf7\x26\x1f\x77\xee\xea\x93\x0b\xd2\xb9\x0b\xe0\xfc\x73\xff\xeb\xe1\x95\xcf\xfa\x67\x1c\x8a\x51\xec\xc6\x1a\xc3\xe0\x71\xdd\x64\xd1\xc6\x76\x6d\x96\xa8\x9f\xfe\xd8\x6e\xb1\xa0\x14\xf9\xc8\x33\x9d\xbe\xdc\x21\x9c\x5b\x3d\xf4\x52\xa7\x2d\xb9\xe7\x7f\x3a\x74\x08\xbf\xf6\xc3\x88\x77\x23\xe5\xc2\x10\x1d\x6b\x6d\xfe\xfe\x4c\x34\xdf\x48\x0e\x74\x94\xf0\xbd\xc9\x50\xae\x48\x50\xbf\xaf\x2d\x0f\x70\x26\xd8\xc6\xe7\xbb\xea\x50\xe4\x86\x33\x0e\x42\xc3\xe3\xee\xbd\xf9\xf6\xc2\xf6\x83\xd8\x3e\x53\x83\x75\x8a\xde\xf8\x8b\xff\xc2\x32\xf3\xaf\xcd\x4f\xed\xbf\x84\x78\x78\x70\xc7\x6d\xc3\xfc\x4e\x5e\xb7\x77\x1a\x08\xc7\x4a\x67\x36\xce\x4a\x14\x48\x83\x5a\x61\x4c\xbd\x66\x6c\x5e\x89\x3b\xb9\xc9\x5b\x7f\xd5\x7a\x3f\xeb\xfb\xe6\xf1\x3e\xf6\x4e\x0f\xad\x17\xe7\xd4\xec\xfe\xb0\xad\x3b\x02\xca\xcf\x01\x34\xc0\x44\x70\x24\xa6\xda\x53\xfc\x5e\xbd\xe7\xf8\xb9\x0b\x57\x83\x2f\x81\x2f\x83\xfb\xfd\x6a\xe6\xd3\xc8\x04\xf6\x38\x65\xfa\xbc\xd2\xf3\xfd\xb3\x66\x4f\x9b\x1c\xef\xe8\x6a\xdd\x8a\xa3\xc2\x5e\xaf\x27\xcd\x40\xef\xc0\xb4\x44\x87\x8f\x36\xdc\xbd\x77\xca\x27\x8a\xa9\x12\x0c\x43\x41\x5e\xa6\xe9\x5c\xbd\x58\x49\x33\x26\x64\x29\x5a\xd2\x99\x64\x8d\x41\x15\xc2\x6a\x00\x28\x20\xc7\xc0\x3d\x26\xab\x7a\xab\x45\x68\xec\x16\x02\xe4\xa1\x59\xe7\xa1\x99\xdb\x12\x63\xeb\xc5\x48\x16\x8a\x26\xe8\x36\x6f\x40\xc7\x34\x05\xd3\xfa\xf9\x27\x0c\xbf\x92\x46\x96\x53\x84\xac\xaa\xf2\x9c\xc2\x30\x28\x27\x31\x7c\x15\xf1\xbc\x9a\xcb\xa9\x3c\x4c\x67\x2b\x1c\x31\x2a\x31\x92\xc4\xfc\xc8\xe5\x60\x55\x44\x55\x01\xd5\x84\x8a\x2c\x71\x1a\x2b\xb2\xb2\xa6\x66\xbf\xfd\x09\xe2\xb3\x5a\x43\x48\xa8\x4d\x7c\xf0\xec\xed\xbd\x99\x40\x66\xf9\xfa\xf8\xda\x9f\xb5\x63\x90\x80\xc0\x77\x57\x6c\x52\xc5\xb9\xbd\xb8\x07\xe6\x94\x59\x13\xa7\x10\xf1\xc9\x3d\x7e\x8d\xf6\xe9\x5e\xeb\x0d\xa2\xb3\x23\x66\x9a\xaa\x3b\x59\xad\x96\xb7\x2a\xa8\xaa\x40\xc0\xf3\x69\x8b\x2d\x2a\xc8\xd6\x91\x85\x58\x01\x56\x61\xd6\x66\x5d\x33\x4d\xc8\x69\x27\x0d\xb3\x86\x26\xeb\x46\x4f\xc5\x92\x50\xad\x5a\x80\x49\x01\xe5\x4b\x56\x0e\xf2\x0c\x62\x2a\xf9\xa2\x61\x9a\x79\x98\x85\x34\x6f\xf1\x15\x98\x46\xd5\x32\x2c\x8b\xaa\xaa\x4a\x78\x7d\x55\x5c\xcf\x4f\x07\x71\xc0\x06\xd1\xb9\x49\xbd\xa9\x89\xcd\x55\x26\x8e\x83\xfe\x2a\x33\x5e\x6b\x10\x22\x86\x3b\x5d\x92\xf1\xbe\x09\x5e\xfd\xf9\xb8\xaa\x2b\xaa\xac\x12\x69\x97\x67\x14\x53\x35\xad\x9c\x90\x63\x79\xda\x60\x0b\x42\x55\xae\xa0\x22\x0f\xf9\x82\x4d\xbb\xf9\x9c\xc3\x97\x50\x45\x26\xca\x49\x2b\x49\xea\x82\xa4\x29\x7c\xd9\x44\x32\xaa\x94\x21\xcd\x23\xa3\x66\xda\x10\x30\x48\xcd\x3b\x15\xd3\x70\xca\x50\x82\xe5\x7a\x5a\xd6\x75\xc7\x54\x7a\xaa\x86\x6d\x1b\x1e\x2c\x7d\x3f\x00\xf6\xb8\x02\x88\x57\x39\xdb\x5f\xe5\x6c\x6f\x95\x89\x9e\xd6\x32\x83\x78\x51\xff\xe4\x29\x5e\xbc\x30\x21\xbb\x12\x2b\x19\x8a\x69\x3a\xbc\x4d\x67\x69\x83\xb5\xf8\xb2\x9a\x44\x35\x64\xf1\xd0\x28\xa9\x9c\x6b\xd7\xf4\x32\x51\xa1\x92\x56\x92\xaa\x38\x86\xa2\xdb\x3d\x55\x0b\x15\x1b\xc0\x29\xf3\xa8\x54\x30\xf3\x95\x2c\xd2\xf3\x95\x64\xd9\x30\x9c\x12\x4c\x43\xd3\x2d\x23\x15\x99\x32\x64\xa0\x44\xe4\x73\xc5\x62\x0e\xea\xa2\xa6\xea\xa2\xd7\xef\x91\x4b\xc8\x18\xae\xa7\xb6\xe0\x3a\xa3\x7f\xf2\x94\x19\x53\xe2\xfe\x1f\xad\x4a\xfd\xb3\x43\x58\x90\xe9\x6b\x62\x01\xfe\x23\xce\x6a\x82\xc1\x6b\x48\xb0\x92\x54\x0c\x50\x2e\x48\xd3\x31\x91\xaa\xe7\x39\xb1\xe8\x28\xf9\x62\x5e\x13\x69\x93\x2d\x8b\xa8\xaa\x22\x13\x31\x3c\x2c\x42\x49\xe6\xdc\x2c\x4d\xe4\xe9\xb4\x5b\x4b\x13\x14\x45\xea\x8a\x2e\xea\x2a\x5f\x2d\x08\xa6\x60\xa8\xaa\xa9\xd8\x9a\x62\xa8\xa6\x56\xad\x31\x48\xcb\x99\x8e\x61\x6a\x8e\x93\x93\x4c\x49\x35\xb2\x66\xb6\xd8\xc2\x63\xce\xbf\xeb\x8e\xfd\x8b\x83\x47\x83\xee\xe3\xb8\x4e\x0b\xee\xc7\x82\xe3\x4b\xd8\x0f\x9e\x8d\xf4\x4a\x9d\x12\x46\x21\x32\x8c\x43\x41\x07\x02\xdc\x58\xd8\x8b\xfe\x9a\xb1\x5c\xd2\x4e\x12\x8a\x6b\x52\xbc\xa5\xea\x56\x9e\xcb\x65\x99\xb4\xcd\xca\x82\x58\x15\x4b\xa8\xc2\x43\x36\x27\xd3\x75\x3e\xae\x28\xbc\xce\xa9\x63\x34\x54\x2c\xc8\xa3\x5c\x1a\x65\x45\xa8\xa5\x91\x11\x67\xad\x5c\xce\x32\x11\x5d\x28\x43\x86\x43\x6a\xd5\xc8\x43\x59\x40\x25\xbb\x98\x2b\x1a\xba\x5d\x84\x49\x82\x85\x55\x59\x11\x14\xb9\xae\x40\x0d\x69\x16\x12\x51\xd5\x28\x43\xde\x97\x01\xbe\xec\x39\x80\xeb\x82\x0d\x3f\x08\x5a\x38\xe7\xf5\x43\x8e\x83\xd3\xc7\xd1\x47\x2c\x85\x23\x22\xb8\xd3\x42\x53\xcd\x69\xe2\x5d\xbb\x23\xde\xac\x89\x38\x6a\x89\x5b\x4b\xc4\xfa\x8f\x98\x42\x52\x22\x67\x64\x45\x68\xbb\xe5\xb4\xac\x08\x96\xe4\x68\x7c\x3a\x4b\x19\xbc\x6d\x5a\x66\x4e\xc8\x1b\x06\xed\xb2\x04\x9d\x94\x34\x41\x4a\x4b\x22\x43\xa5\x91\x9e\x37\x64\x21\x26\x51\x76\x92\x54\x45\x85\x93\xa5\xaa\x81\x38\x54\xac\x40\x81\x43\x22\x2a\xa3\x9a\xaa\x70\xc8\x81\x74\x4e\xb6\x94\x1c\x54\x88\x2c\x72\xdc\x02\x2a\x51\x16\x25\xc2\xb2\x80\xb2\xc8\x14\x4b\x90\xaf\x12\x1a\x64\x2d\x9f\x86\xbc\x3e\x03\x5a\xbb\x5a\xcb\x84\x5e\xcc\x76\xbc\x13\x6b\x92\x53\x64\x53\x6d\x9a\x4f\x84\xdb\xc9\xe1\xed\x62\x79\xd1\x44\x5b\x2f\xbb\xd0\xe1\x0d\x1b\xd6\xd2\x0e\x45\x64\xdd\x22\xcd\x29\x92\xa9\x5b\x0a\x97\xe6\x28\x9d\x77\x0c\xa3\x50\x13\x20\x6d\x4b\xb4\x5b\x73\x0c\xda\xce\x09\xaa\xa1\x31\x86\x91\xcd\x17\xe9\x4a\x01\x09\xd0\x41\x25\x0e\x5a\xb1\x8a\x25\x19\xa2\x4d\xf2\x06\x4d\xa3\x72\x0d\xb2\xa8\x50\xb5\x1a\xa0\x6a\x15\x05\x54\xca\xa3\x9a\x28\x64\x51\x19\x66\x1d\xd5\x30\x1c\x98\x86\x2a\xca\x33\xac\x95\x65\x91\xac\x4b\xb4\xc3\xc8\x90\x67\x19\x87\x61\x9a\x98\x91\x64\x2d\x46\xb2\x72\x82\x63\xfa\x67\xeb\xd5\xb6\x1c\xc3\x3c\xbb\xed\x67\xe7\x12\x45\x3c\x5e\xc7\x38\x8d\xf5\x68\xd0\x83\xfb\x61\x99\x38\x7f\xe1\x04\x30\x13\x5c\x18\x9c\x7b\x98\x6c\xfd\x42\x0d\x33\xc2\x74\x3b\xbb\xc5\x6a\x3a\x9f\x24\xfc\x07\x67\xb7\x1f\xec\x51\x4d\x55\xd4\x0c\xa2\x46\xd5\xab\xbc\x6c\x19\x92\xaa\x3b\x32\xcd\xa6\x8d\xb4\x2a\xe7\x50\x0d\x19\x28\x29\x12\x49\xc8\x0a\x8a\x2b\xa7\x09\x81\x63\x75\x8e\x2f\x6a\xb2\xa8\x68\x4d\x36\xe0\x08\x92\xdd\xa4\xdb\x3c\xfe\x0a\x5b\xc8\xa1\x0a\x52\x50\x52\x20\xf8\x9a\x2c\xb8\x4c\x9a\xd0\x9b\x5f\x10\x48\x8d\xc9\xca\x1c\x23\x99\x82\xc8\x67\xa5\xa6\x58\xe4\x4d\x26\x67\xe4\x75\x56\xe7\x24\x5e\xe3\xcd\xac\xac\x30\x9a\xe2\x3a\x59\x4e\xe6\xb3\xaa\x21\x88\x02\x27\x2a\x02\x27\x0b\x06\x8b\xf2\x39\x8d\xd5\x39\x51\x96\x38\x83\x93\x54\x46\x97\x03\x5d\xcc\xf3\x37\xe3\xfe\xb6\x2f\xe0\x9e\x00\x20\x8e\xf3\xa4\x8b\xa4\x86\x3b\x11\x7b\xb1\x7c\xdc\x3d\xdc\x6f\x9b\x3c\x4e\x9a\x24\x3a\x38\x41\xa8\x17\x89\xda\x03\xbc\x56\x24\xb4\xa8\x4a\x86\x66\x72\x26\xcb\x52\x26\xe3\x70\x25\x31\x57\x11\x20\xb0\x0c\x66\xac\x46\x02\x91\xb3\x58\x61\x8c\x22\x1c\x57\xb0\xa0\x82\x0c\x42\x4e\x23\x05\xa5\x69\x22\x1d\x17\x9a\xe8\x8e\xc5\x4b\x09\x52\x3c\xd2\xab\xa6\x03\x59\x06\xf1\x79\xbb\x64\x98\x76\x09\x2a\xb0\x02\x0b\x92\xca\x6b\x92\x5b\x70\x6d\x13\x32\x6e\xce\xd4\x04\x5b\x68\xeb\x94\x4d\x5d\xf6\xfb\x18\x57\x5a\x7e\x6b\x3d\xd8\xf7\xff\xc3\xe3\x35\x7f\xdc\x0a\x6a\x1d\xbc\x83\xc7\xff\xd9\xe9\x2f\x7a\xc6\xeb\x9b\x97\xf6\xe1\xa4\xe3\xbb\x02\x7c\xd0\x7b\xfe\x8c\x20\x0e\xdb\xdb\x8a\xbf\x06\x99\xbe\xbd\x4d\xe1\xd5\x6a\x41\xd0\x1b\x16\x19\x61\xd4\xeb\xd5\xc9\x4a\xdd\xa6\x89\xc2\xa8\x42\xd0\xb4\x9b\x86\x5c\x8f\x34\x66\xb5\x7e\x50\x9e\x48\xd3\x16\x95\x26\x58\x9a\x36\x58\x1a\x8a\x75\x4e\x32\x6b\x45\xc9\x72\x1c\x55\xa4\x8d\xb4\xaa\x56\x51\xa9\x09\x38\x1e\x16\x20\x67\x88\xae\x49\xf2\xba\x54\x2f\xc5\x18\x09\x39\x32\xca\xc9\xa8\x20\x21\x43\x62\x59\x9c\x95\xa0\xcb\x02\x27\xc9\x42\x96\x73\x58\x53\x35\x44\x46\x63\x38\x49\xc3\xfb\x5a\xd5\x58\x9a\xf8\x05\xf9\x08\x3e\xff\xd3\x71\x9f\x9a\xff\x1f\xe7\x3f\x25\xde\x37\xa3\xd5\x8f\xcb\xef\xd5\xd5\x6a\x88\xbe\xea\xff\x07\x36\xb8\xef\x53\xf5\x97\xd3\x50\x42\xef\xc1\x23\x51\x2e\x76\x12\xca\xc1\x23\xd1\x7b\x48\x22\x0a\x6e\xd6\x80\x36\x12\xe3\x57\x7c\x62\xcc\x18\x3d\xe4\xc9\xbb\x9e\x1c\xd8\xf2\xc0\xfa\x07\x1e\x58\xff\xc0\x93\x3d\x22\x4a\xea\x15\x10\xf4\x5e\x6b\xe2\xc1\x47\x6d\x3c\x00\x71\xdc\x7b\xcd\x20\x85\x20\xce\xce\x1f\x3c\xbe\x1e\x9c\x6f\x54\x0d\x18\xc7\x4e\x9a\xea\x02\x3e\x7c\x83\x2c\xd7\x73\x0c\x61\x54\x8d\x51\xc6\xac\xc1\x0a\xe3\x26\xa1\x16\xab\xd6\xa9\xd6\x4f\x8f\x43\xb9\x40\x50\x8a\x39\xc9\xb0\x4a\x7a\x96\xb2\xd2\x8a\x54\x43\x05\x64\x20\x20\xc0\x12\xe4\x15\xc1\x75\xd2\x04\x45\xa7\xad\x34\x03\x65\x9a\x55\x85\x2c\x29\x68\xa2\x6b\xa1\xa2\x6d\x43\x96\x90\x44\x54\xe2\x51\x15\xff\xb6\x0c\x56\xe4\x79\x59\x11\x39\x29\xcf\x3a\x5a\x4e\x65\xf5\xac\x20\xa8\x8c\xc1\x08\x92\xc4\xa7\x19\x86\xe7\x04\x9f\xa7\x86\xe8\x64\x18\xe7\x01\x01\x12\xfb\x6e\x0c\x52\xc5\x15\x91\xe7\x83\x45\xe0\x5c\xb0\x14\x00\xd8\x4f\x35\x81\x31\xd9\xd3\xd7\xda\x3d\xd4\x5b\x52\xb3\x69\xaf\xb4\x3a\x67\x62\x43\xa6\x97\x80\xfd\x38\x95\xa0\x95\x09\x12\x49\x79\xef\xa9\xd9\x69\x58\x42\x2c\x95\x15\xb2\xba\xa4\x70\x2c\x4b\xeb\xb4\x2c\x28\x8a\x6a\xf1\x4d\xac\x1e\xcb\x42\x96\xc9\x1a\xb0\x40\x33\x16\x4b\x43\x53\x67\x38\x28\xd1\x2e\x57\xe2\x18\x24\x65\x7b\x34\x85\x37\x39\x19\xf1\x96\x5b\xb4\x2c\x82\x75\x8b\xcd\x1f\xb2\xa9\x47\x55\x4d\xb3\x01\xcc\x1c\x87\x8a\xb9\x32\xa4\x59\x54\xb6\x20\xad\x4b\x86\x6a\xc2\x2c\xa4\x4c\x53\x37\x05\x8e\x15\x65\xd3\xc0\x45\x85\x0c\x43\x87\x9a\x99\xe7\x1c\xcb\xa5\xea\x8a\xac\xc4\x4c\x94\x73\x10\xc8\xb7\x7d\x58\x18\x3e\x7b\xf1\x1d\xfa\x61\x7c\x1f\x05\x24\x7c\xb8\xa9\x60\x26\xe8\x07\xb3\xc1\x5c\x70\x86\x7f\xdf\x2f\x35\xb1\x2d\x81\x31\x80\x9a\xe8\xe0\x01\x28\x13\xeb\x9d\x30\x7b\x52\x62\xc2\xb4\x81\x9e\x78\xdf\xec\x26\x2c\x88\x58\x80\x47\x33\x06\x7a\x63\x3e\xa9\x78\x72\x38\x2e\x52\x69\x82\x42\x20\x9d\x55\x44\x5d\x35\x65\x5a\x48\x1a\x69\x49\xd4\x34\x23\xc7\x17\x34\x3e\x8b\x2a\xa6\x69\x20\x0b\xd9\x8c\x65\xff\x7f\x9c\xbd\x09\x7c\x1b\xc5\xf5\x38\x3e\xb3\xb2\x56\xe2\xcc\x5a\xc1\xb1\xc2\x29\x63\x47\x16\x47\x82\xc0\x38\xde\xdc\x0b\x81\x64\x09\x90\x2c\x47\x40\x10\x8e\xe5\x88\xbd\xdc\x0b\xe5\x10\x10\xca\x42\x20\x2c\xf7\x1a\x48\xbc\x4e\xe2\x64\x93\x38\x89\x12\xe7\x50\x7c\x14\xd1\x03\x5c\xda\x6f\x31\x7c\x5b\x2a\xf8\xb6\x45\xb4\x40\x4d\x69\x8b\x5b\x0a\x55\x2f\x30\xb1\x76\xf4\xff\xec\xec\xa1\x5d\x49\xd0\xff\xe7\x07\x1f\x05\x32\x5a\xcd\xce\xbc\x79\xf7\x7b\xf3\x5e\x4d\x32\x1c\x2e\x8c\x1b\x94\x61\x7f\x52\x44\x5e\xa7\x14\x38\x82\xe8\x9a\xd1\x44\x5c\x8b\x27\xc8\x24\xd2\x8a\x40\x41\xf9\x7c\x26\xcf\xa0\x54\x36\x0b\x41\x7c\x4c\x81\x40\x15\x95\xa4\x36\x0c\x73\x3a\x47\x29\x54\x11\x8c\xc5\x22\x2a\x45\x8c\x2b\x90\x82\x5c\x21\xa9\x22\x4e\x45\xb1\xb8\x5c\x93\x47\xb4\x9c\x11\x94\x0c\x9d\x51\x9d\xda\xcd\x06\x4c\xfe\x89\xe3\xed\xbf\x75\xf9\xf5\xb0\xbf\x21\xfd\x3b\x3c\xfe\x2b\xc7\xcf\x6c\xf3\xd6\xdf\x78\x9e\x77\x62\x07\x83\xf1\x12\x6c\xdd\xbe\x60\x8b\x17\xff\xc3\x1a\x5f\x51\x3c\x37\xf0\x1e\xf9\x10\x15\xdd\xb2\x6a\x02\x50\x8b\xf6\x8e\xb7\xfb\xe7\xf7\x33\xa5\x73\x72\xff\x26\xef\xf1\x45\x18\xe3\xd8\x9e\x4b\xdb\x71\x0e\xc6\xce\x85\xde\x8b\xef\x40\xef\xfd\x8b\xb3\x07\xfb\xbc\xff\xee\x59\x93\x54\x36\xff\x17\xe5\x3e\x96\xf4\xaf\x3d\x7b\x66\x1c\x18\x7d\xee\xd9\xb3\x73\x0f\x69\xef\xdf\x3c\xe3\x0e\x8c\x36\x3c\xe2\x19\x2f\xcd\xf3\x59\xf5\xe7\xf7\x8e\x95\x9d\x81\xb5\xaf\x2e\x5c\x73\xee\x85\xfa\x72\x98\xf6\x1c\x8b\xeb\x47\xfc\xd6\xd2\x8b\x0d\x3d\x20\x46\x8a\xe0\x48\xdc\x99\x8f\xc0\xd6\x56\xd3\xb4\xfa\x1a\x7f\x5d\x43\x2d\xac\x35\xfe\xc8\xc6\xb3\xc9\x51\x5f\x84\x60\x0d\x29\x4b\xf9\xb9\x83\xe9\x9a\x34\x11\x41\x49\x94\x12\xa1\x0c\xd3\xbe\x30\xc5\x2b\x3c\x35\xaa\x2b\x30\x87\xf2\x71\xc8\x94\xf4\x53\x8a\x4c\x82\x5a\x50\x67\x66\x8f\xd5\xe1\x7b\x15\x60\x72\x2d\x66\x0f\xc6\x48\x4d\x9a\xe0\x27\x82\xc1\xa0\xa4\xca\x10\x50\x84\x1c\x63\x34\x4e\x57\x6a\x12\x13\x29\x3f\xad\x27\x22\x68\x14\x69\xa9\x24\xa4\x60\x9a\xc8\x28\x49\x5a\xd5\x59\x98\x34\x6d\x15\xa6\x48\x07\x68\x32\x02\x7c\xe0\x48\x10\x32\xf9\x33\xac\xa3\xa0\xa9\xa2\xd7\x1a\x64\x34\x46\x72\x5f\xa7\x21\x30\x18\x81\xe8\x4f\x69\x13\x6a\x8d\x40\x46\xd4\x42\x9e\x41\x1c\x4a\x27\xb2\x90\xc9\x11\xbc\xae\xc1\x11\x94\xb5\x75\xa1\x27\xb0\xdf\xe6\x47\x00\x50\x8b\x7b\x76\x82\x4e\x00\xe6\x6e\x63\x3c\xf4\xbf\x01\x7b\xfd\x37\x16\x5d\xbe\x6d\x5c\xcf\xa0\xef\xc7\x18\xce\xb8\xb6\x03\x08\x82\x9f\x14\x97\x05\x56\xfa\xff\x08\x7c\x8e\x66\x60\xde\x06\xc2\xab\x9c\xd6\x52\x4b\xc1\x66\x50\x0b\x1b\xea\x1a\xfc\x96\xb2\x34\xcd\xfa\xaf\xaf\xa5\xb6\xf1\x27\xb8\xef\x72\x48\x43\x9a\x04\x19\x22\x6c\xfc\x6d\xe2\x2f\xc4\x06\x7d\xe5\x06\xb8\x12\x6d\xf0\xcd\x24\x86\xf4\xf3\xb7\xc0\xef\xa0\x67\xd7\xf7\xf4\xf8\x3f\x56\x3a\x0b\xaf\xeb\x13\xe8\x95\x6b\xe0\x19\xf0\x87\xbe\x79\xca\xe7\xfa\x13\x9d\xf0\xf2\x67\xf4\xce\xe7\xe0\xc5\xc4\x51\x5f\xdf\x62\xe1\x03\x6d\xae\xbf\x6f\xd8\x58\x67\xdf\x6b\x0e\x9e\x58\xb1\x13\x6b\xfc\x55\x97\x8f\x4e\x75\x60\x41\xf6\xfd\xd0\x43\x17\x7c\x28\xba\x16\xdf\xa5\x7a\xa1\xce\xf5\x3c\x5d\x7a\xfe\x85\xa3\x5c\xe3\xac\x6b\xbc\xd4\x63\x26\x6e\xde\x55\xb5\xc6\x43\x96\xbc\x31\xc6\x4f\xc7\xf6\x59\x1d\x98\xea\x74\xc3\xb7\xd3\x84\x0d\xfc\x71\x3c\x01\x06\xf4\x26\xbb\xad\x98\x86\xda\xc6\x5a\x5b\xcf\xa8\xa9\x95\x44\x51\x94\x1e\x66\x62\x84\x70\x30\x95\x17\x87\x89\x5c\x24\x4e\x64\x27\xd8\x9a\xcc\xf0\xdd\xf7\xcc\x5c\xda\x7c\xdb\xfc\xcb\x0a\x93\x5e\x82\x97\x11\x8b\xf4\xef\x3f\x0d\x4f\x43\xef\xf8\x3e\x60\x15\x96\xe7\x89\x42\x82\x47\xd4\x88\x9e\x44\xc3\x32\xa4\x08\x91\x48\xb2\x0c\x1a\xcb\xa2\xd1\x42\x9a\xe7\x29\x95\xe2\x08\xb5\xa0\xd4\x00\x94\x45\x94\x3c\x0a\xac\x3e\x1d\x74\x20\x48\x4a\xa0\x0e\x9c\x82\x75\x25\x00\x0d\x75\x08\xbb\xcd\xcd\x5c\x83\x13\x71\xc6\xc0\x64\xac\x25\xd5\x5b\xa3\x93\xad\x5e\x8c\xb0\x16\x63\xec\x54\xbb\x37\x55\x6d\x73\x43\x5d\x83\xaf\xbd\x67\x21\x3c\x65\xf4\x86\x86\x93\xe0\xfe\x9c\xde\xbc\x90\xb8\xfd\x0d\x74\x57\x2d\x75\xd2\xd4\xc7\xa6\xae\xba\xe1\xa1\x25\xf0\xb5\xaf\x57\xcc\x86\x17\xfc\xa3\xb0\xfe\x6c\xdf\x61\xef\xa1\xde\xd9\x27\x9d\x34\xf5\xf1\xa9\xfa\x4f\x8a\x40\x91\x05\x42\x8b\xc4\x15\x26\x42\x88\x69\x43\x63\x24\xf6\x2d\xba\xe7\xb6\x77\x17\x35\x37\xaf\x42\xef\xb4\xbf\xd4\xf6\x16\x35\xe3\xb4\xa5\x6d\x68\x7a\x73\xf3\x3d\xcf\xbc\xbb\xf2\xb4\xc7\xd0\x0b\xab\x5e\x5a\x0a\x83\x27\xe0\x61\xdf\x5f\x0c\xa3\x03\x09\xdc\x18\x14\x21\x45\x0c\x73\x6c\x2c\x21\xa0\xd4\xa8\xe0\x8e\x73\x58\xe7\x55\xeb\x3a\x5f\xc6\x35\x4e\x95\xf3\xcf\x3e\x5c\x7f\xa8\xef\x07\xae\xe7\x93\xa5\xe7\x7b\x3f\x2b\xf7\x09\x6f\xbf\x18\x3f\x8f\xef\x8e\x02\x68\xcb\x12\xd0\x64\x60\x41\x8d\xbf\xd6\x4a\x23\xae\x75\x35\xbd\xb5\xf5\xaf\xda\x1a\x7f\x73\x84\x1c\xe6\x50\x16\xc9\x44\x4a\x4f\xf8\xe2\x85\x6c\x42\x96\x93\x11\x49\x8e\xc7\x0a\x9a\x8f\xd7\x63\x44\x0e\xa5\x91\x44\xfb\x00\x29\x29\x6c\x1c\x65\x34\x34\xaa\xa1\x44\x92\x0f\xa7\x22\x31\x1a\x4a\x1a\x8c\x68\x30\x1e\xa1\x52\xf8\xdd\x44\xa2\xc8\xf8\xb3\xa4\x08\x8e\xc7\x9c\x0b\x3b\x37\x2a\x4d\x67\x7f\xf3\xb4\xda\x06\x42\x82\x09\x0d\x26\x50\x4a\x53\xc2\x6a\x9a\x13\x44\x3e\x22\x88\x71\x94\xa1\xa1\x84\x52\x35\x79\x28\x21\x49\x45\x7c\x9c\x56\x58\x1a\x81\x64\x82\x52\x29\x1e\xa6\xf8\x14\x0f\xb3\xc6\x1e\x35\x33\xd7\x1a\x1c\x6d\xea\xd8\x15\xfb\x03\xb0\x19\xc0\x06\xad\x46\xd1\xa0\x8a\x04\x5e\x56\xe5\x88\xa2\xd2\x31\x14\xd7\x47\x04\x42\x84\xa3\x13\x8a\x9f\x82\x02\x52\xd5\x09\x4d\x34\x50\x34\x46\xfb\x78\x7d\x0c\xe5\x0c\xe6\x91\x70\xdf\xf1\xdc\x8f\x6b\xb3\xf7\x5f\xe1\x92\x05\x38\x66\xd8\xb5\x15\xf7\xc8\xe0\xe2\x41\x67\x1c\xd7\x41\xdf\x83\xbb\xfe\xec\x9f\xe5\x7a\x1e\xd3\xec\xfe\x79\x9e\x71\xce\xb9\x4f\xb4\xda\x18\xdf\xb3\xad\xdc\x6f\x3f\x70\x3c\x96\xa1\xee\x98\x9c\x99\x1f\x81\x7b\x26\x1c\x98\x5e\x1e\x2f\x30\xd7\x39\xe0\xae\xc9\xbb\x99\xbc\x9f\x6a\xdf\x7b\xe4\x85\xc7\xce\xed\x9b\xff\xb7\x90\x77\x4d\x29\x7b\xae\x10\x39\x54\x5f\x11\x33\x30\xd7\xb4\xce\x35\xae\x95\xc6\x7b\xf6\xba\xc6\x79\xd7\xf8\x9e\xf2\x79\xf6\xfc\x4f\xc5\x1e\x30\x4c\xf7\x9a\xb5\x5e\x57\xb9\xf0\x1e\xf7\xc0\x1e\xf8\x29\x8e\xcf\x4e\xae\xbe\x9e\xc1\xa7\x5c\xf3\xf4\x91\x49\xaa\x7d\xdd\x3d\xd7\x80\xb9\x6f\x30\x20\x44\x76\x6d\xf5\xc4\x53\x9d\xdf\xec\xbc\xcb\x13\x4f\x35\xc6\x71\xcc\x71\xf0\x88\xf2\xf8\x89\xd9\x9b\xc5\xb3\x56\xba\x04\xd7\x0d\x0f\x97\xc7\x8b\xcc\xf9\x77\xdc\x5a\x11\x87\x31\x61\xd1\x5b\x7d\x0f\x03\x4b\x3c\xfa\x9b\x73\x9e\x3d\x5b\xaa\x9f\x73\xcf\x46\xcf\x3c\x06\x7e\xbd\x5d\xb6\x4e\xab\xfe\xc9\x9e\x1f\x79\x60\xea\xd4\x43\xec\x5e\xe4\x79\x9e\x77\x6a\x37\x62\x38\x68\xd7\xb8\xc6\xcd\x3a\x80\x6f\xe0\xe7\x67\x57\x87\xdb\xfe\x2b\xab\xef\xab\x3f\x5c\x1e\x5f\xda\x57\x5f\xb1\x1e\x13\x27\x0e\x56\xac\xdf\xdd\x5f\x63\x55\x45\x9c\x0a\xc3\x61\xaf\xe6\x79\xde\x19\xdf\x79\x9b\x07\x47\x25\x73\x3d\xa1\xe8\xfe\xfb\x0c\x4c\xea\xdc\xef\xec\x21\x5d\xda\xc3\xc0\xf6\x6f\x38\x83\x75\x2e\x3f\xaf\x6c\x3f\x1f\x22\x7b\x48\x8f\x3e\x69\x8c\x7f\x88\xf7\xfc\xa1\x4b\x1f\xd6\x4a\xe3\x7b\x1e\xf0\xd0\x99\xec\xd0\xac\xbb\x36\x97\xeb\xbd\x6b\x7f\x5a\x7d\x3d\x7b\xb7\x57\xd0\xdf\xa3\x25\xd8\x01\x9f\xd5\x7f\x87\x06\xa7\xd8\x9d\x1a\xeb\x6a\xfc\x75\x2d\x66\x50\xab\xce\xc3\x10\x31\xbf\xc7\xff\x36\xb6\xb6\xb4\x36\x99\x97\x0c\x42\xf5\x01\xe0\x6b\x9b\x52\x3f\x73\x5a\x03\xbe\xb6\xdb\x36\x73\x72\x03\x64\xfd\x22\x1a\x43\xa9\x5c\x0e\x52\x28\x0f\x79\xa4\x25\x38\x4d\x0d\x4b\xa9\x38\x1a\x81\x74\x11\x40\x90\xcb\xc1\xd8\xd8\x84\xe2\x1f\x15\x53\x19\x39\x9f\x44\x32\xaf\x06\xc3\xea\xd7\x63\x70\x3c\x38\x3a\x26\x0c\x27\x44\x0a\xa5\x48\x5a\x55\x65\x4e\xce\xc8\x19\x19\x0d\x73\x6c\x58\x0d\x87\x61\x0c\xff\x55\x13\x45\x94\x97\x32\x22\xa2\xc6\x64\x98\xf4\x25\x62\xb2\x24\x0a\x88\xd2\xf3\x19\x59\x19\x1e\x85\xa2\x2b\x9f\xc0\x81\xc3\x9e\x07\x01\xa8\x36\xde\xf7\x59\x45\xcc\xd4\xec\x27\x33\xd5\x85\xbb\x66\x0d\x3e\x7c\xee\x7b\x56\x55\xc4\x52\xcd\x73\x7f\xc6\x43\x1b\x92\x7d\xee\x7d\x7f\x2c\xa7\xf9\x81\x67\x3d\xb8\xeb\xd4\xb0\xd8\x7f\x56\x05\xef\xc0\xfa\xdb\x86\xef\x56\xe0\xb4\xab\x4f\x8e\xc3\xb3\x78\x07\xaf\x4c\xfc\xb4\xf3\x9b\x96\x15\x2f\x0e\xfc\xd0\xe0\x73\x83\xab\xfd\x87\xcc\xd9\xbe\x60\x1b\xb5\x68\xf3\x1f\xce\xff\x72\xde\x6d\x4c\xd5\x7d\x3b\x3d\x6e\xca\xf0\x77\xef\x10\x18\x2f\xcb\x8d\xc0\xcf\x6f\xab\xe8\x97\x61\xf5\x01\x5a\xe5\x9a\x47\x70\xcd\xf3\x8a\x6b\x5c\x72\xd6\x1b\x1d\xc4\xdd\x80\x5f\x98\xe4\xd2\xed\x9d\xbd\x38\x3d\x7f\x4a\xb9\x20\xf8\xdd\x1b\x1e\xaa\x26\x8b\x28\x72\xe0\x1f\xe5\xba\xb4\xf5\xfc\xaa\xea\xfc\x77\xcf\x97\x2e\xda\x34\xed\x61\x4c\x83\x3b\xdc\xbd\x8f\x64\x17\x9f\x2a\x96\xf3\xd3\xcd\xb8\x37\x91\x87\x3f\x2a\xa5\xf5\x77\xfd\x1c\x94\xd9\xc8\x03\x6f\xe2\x1a\x0b\x58\x3a\x1f\x38\xce\xf5\x6e\x87\xfe\xf7\x7d\xed\xfa\xcd\x5a\x52\xa2\x3a\x5e\xc8\xc1\xc9\x00\xcc\x4a\x33\x20\x14\xed\x79\xfa\xbd\xf7\x42\xe4\xc0\x9b\xd5\xf5\x80\xf5\x5d\xd5\x71\x7a\xbd\x5a\x7d\x7c\x70\x56\xf5\xf1\x7d\x81\x72\xbe\x6e\xee\xc7\xe9\x87\x53\xaa\x4f\xb9\x1a\x77\xd1\xff\x97\x6b\x3c\x51\x5a\xcf\xc6\x09\x67\x9c\x76\xeb\x00\x2f\x1c\x59\xfd\xbd\x9b\xdf\xad\x26\x0f\x5d\x3d\x16\xca\xe5\xe1\x50\xf9\x3a\x87\x1e\x34\xc6\xd7\x0d\x96\xf3\xca\xf5\x5b\x3c\x34\x53\x46\xc3\xfd\x1f\x97\xfb\x45\x2c\xf9\xb0\xb1\xfa\x3a\x5f\x38\xc2\x23\x4f\x0c\x38\xd4\x94\xe1\xbe\xcd\x8b\xf1\x7a\x9c\xde\x32\x8c\x23\x4b\xf0\x59\x6b\xb7\x7b\xe4\xa4\x81\x1f\xdd\x78\x9e\x07\xab\xed\x37\x44\xee\xbc\xbc\x5c\x17\xb2\x68\xf7\xad\xea\x72\x6f\xfd\x2b\x2e\x3c\x71\xc1\x6d\xe7\x89\xd5\x79\xe2\xfa\x4c\xf9\xfa\xd5\x38\xc6\xef\xd9\xd5\x75\xb9\xf5\xdf\xab\x4e\x57\xbb\xef\xaa\xae\x2b\xf6\xb8\x79\x6e\xb2\x04\xe7\x3d\x8b\x5d\xeb\x71\xe9\x2f\x9b\x9f\x28\xd7\x83\x2d\xbc\x3d\xa4\xfa\x7e\xb7\x1d\x5e\x7d\x7c\xa3\xdd\x9f\x0a\x14\xd9\xc0\x2f\xc8\x24\xd5\xd1\xf7\x26\xf8\x0b\x00\xb3\xae\xc2\x77\x49\x56\xa7\x4b\xfc\xde\xe1\x57\xfd\x27\x55\x3f\x4b\x4f\x2f\x9a\xcb\x6d\x5d\x9e\x5a\x34\xf4\x93\x6b\xc0\xec\x1f\x31\x55\xf1\xb4\xe7\x73\x17\x9c\x5c\xf4\xda\xf7\x2b\x17\x7d\xb8\x9e\xdf\x74\x94\x8b\x57\xba\xf4\xa7\xbe\xdf\x57\xdf\x5f\xdf\x1e\xcf\xb8\x03\xd7\xf5\xeb\xca\x75\x83\x3d\xb9\x0a\x3a\xc0\xf8\xbb\x0e\xf7\x0e\x3d\x70\x9c\xfd\x6d\x25\xce\x0c\xb8\xeb\xdb\x33\x36\xed\xbb\x7a\x36\xf1\xb6\x7c\xb0\xe4\x90\xdd\x1f\x49\xb4\xd7\xb4\x16\xdf\xb3\xdd\xe7\xee\x77\x2a\x94\xf6\xd0\x1d\xaa\x4e\xcb\xfd\x7f\xa8\xbe\x67\xa7\x07\x57\x99\xee\x3c\x50\x70\x9e\xa7\xdd\xb4\xbc\x7e\xad\x6b\x7e\xa9\x74\xce\x03\x8b\x3d\xef\x95\x1c\x1e\xd2\xef\x1a\x4f\x96\x78\xb7\x55\xfb\xfc\x70\xaf\xcc\x37\x7f\x33\xd4\x56\x2e\xc3\x2d\x3e\x92\x28\x9f\xab\x7b\x9e\x87\xce\x4b\x75\xa2\xcc\xbd\xd9\x75\xae\x25\xbc\x26\x31\x14\xed\xc6\x75\xc0\xd7\xbf\xe4\xa1\x9f\x12\xdd\xbe\xf8\x0d\x7c\xb3\xae\x3a\x0e\x77\x05\xaa\xca\x25\xf2\x85\xc3\xca\x75\x0a\xf3\xf9\xc1\x7f\x55\x3f\x9b\x4d\xee\x33\xc3\x78\xbd\xee\x80\x67\x5f\x97\x15\xe7\x07\x64\xf2\x76\x03\xd6\x5f\x7e\x19\x22\xf7\x3f\xef\x7a\x9e\x2e\xcd\xb3\xfe\x05\x17\x7f\x94\x4b\xfc\xf1\x85\x43\xab\xeb\xb6\x7b\x16\x79\xf8\xa6\xec\x9c\xd9\x6d\xd5\xce\xd8\xd3\x8b\xc7\xc3\x4f\x07\xa6\x56\xe8\x68\xed\x15\xf6\x8e\x0b\xa7\xcd\x5e\x0e\x55\xe0\xc3\x56\x97\xff\x6b\xc3\x15\xba\x1b\x5e\x7f\x6a\xa7\xe7\x79\x29\x14\xed\xc7\x77\xf5\x76\xe3\xda\x4b\xc6\x59\x58\xb4\x9f\x2c\xbd\x63\x97\xcd\x9b\x05\x3b\xe7\x77\xdd\x7e\x0c\xa3\x43\xca\xc7\x0f\xe0\xde\xc9\xeb\xf6\x7b\xde\x5d\xea\xc9\xb0\xaa\x5c\xa6\xf5\xdd\x53\xa1\x4f\xba\x70\x65\x77\x5b\x75\xfa\x4b\xfd\xc1\xc5\x43\xdc\xfd\x8d\xdc\xf3\xe3\xb3\xdc\xf5\x93\x32\x9e\x63\xc1\xae\x8f\xa9\xd0\x17\xd3\x2e\x9c\x18\x72\xd9\x47\x2e\xbb\x69\xd7\x24\x17\xbf\xd1\x4a\xb4\xd7\xb7\xbe\x3a\x4e\x0c\xd9\xb5\xbd\x92\xf6\xf8\x6e\xec\xcf\xdf\xfb\xa2\xeb\xf9\x4c\xe9\xbd\xa9\x23\xca\x75\x3c\x8b\x57\xdf\x5f\x5d\x27\x1a\xaa\x75\xe1\xae\xe9\x7b\xc1\xfd\x3f\x07\x3f\xf4\xcc\x6f\xd1\x58\xa8\xd4\xc7\xc8\xcb\xdb\x3b\x52\x1f\x14\x6f\x29\x7e\x79\xee\x77\x98\xeb\xa9\xc5\xa9\xdf\x15\x97\x03\x70\x6e\xb7\x93\x9f\xff\xbc\x23\x67\x16\xf7\x3d\x8e\x7e\x0b\xfc\xec\x8f\xcf\xea\x73\xe7\x3d\x9a\x6b\x4c\xfd\xc9\xb5\x57\x3c\x6e\x70\x5b\x2a\xba\x13\x47\x42\x76\xfe\xcd\x81\xa7\x5a\x82\xe7\xda\xb8\x07\x6e\x0e\x5f\xdc\x1d\x2f\xd7\x35\x76\x96\x9f\x97\x5d\x67\x1f\xc3\xc1\xd5\x17\xc5\xdb\x07\x69\x55\xb9\xae\xd1\x3d\xa7\x02\xdf\x30\xfe\xf4\xbf\x0e\xdc\xbe\x03\xd1\xae\x1d\xba\x76\xa5\x47\x6e\x94\x9d\xd7\xae\x1d\xd6\xf8\x1c\xb3\x5f\x3d\xd5\x3e\x38\xfb\x23\x30\xff\x36\x43\x5b\xee\x6b\xc4\xda\xcb\xff\x54\xd3\xf1\x77\x17\xcb\xf7\x6d\x9d\xff\x25\xd5\x79\xce\xfa\x41\xd7\xf3\x72\xe9\xf9\x17\x82\xae\xfd\x65\x48\xc7\xb7\xe7\xf4\x09\xe2\x8b\xd3\x03\xdf\x27\x57\x53\x1d\xcf\xbc\x0f\x0e\x27\x5e\x65\x66\x9c\xf9\x3e\xd5\xf1\xe2\xab\x70\x4b\xf1\xed\x59\x17\xb4\xbd\x42\x2d\x1a\x9c\xed\x07\x73\x5f\x67\x80\xfb\x9e\x9e\x45\xdb\x01\xd7\x79\x62\xd8\xed\xc5\x79\xfb\x7b\xf1\x7d\x8b\xbd\xeb\x2c\x38\x59\xfd\xb9\xfa\xf1\xbd\xd5\xbd\x6b\xab\xd9\x2e\x21\x72\x37\x51\x4e\xf7\x18\x9f\xc8\x17\xc8\x72\xfa\xb6\xc6\xfd\xce\xfa\xe3\x6e\xba\x1c\xa8\xf0\x89\xed\xfa\xd8\x73\x6e\x8e\x5d\x6b\xe2\xe4\xae\x43\x3c\xba\xb8\xe4\xcc\x5f\xe3\x79\xaf\x41\x97\xaf\x94\xe1\x05\x63\xe6\x38\x9b\xf8\xb5\xab\xc2\x26\xb1\xce\xff\x1c\xd7\xf3\x66\x5e\xc1\xbe\xa0\x5b\x67\xe5\x1d\x59\x69\xf2\xea\xc7\xca\xe1\xd0\x3f\x5a\x81\xd7\x2e\xbe\xe2\xea\xd5\x61\xd9\xc5\x9b\x0d\x59\x1c\xdd\xcc\xb8\x74\xa5\x32\xd8\x75\x9d\x5d\x1d\xb7\x9c\xde\x12\x06\x4c\x33\x25\x1e\xb2\x51\xf7\xec\x41\x0a\x45\x77\x74\x7a\xf4\x6e\x07\xb7\x36\x3f\xe8\x81\xd1\xe5\xc5\x0b\x03\x0a\xae\x9b\xb7\xca\xe7\x9f\xb7\x79\xc1\x3b\x21\x72\xed\xae\x72\x99\x8c\xe9\x39\xba\xef\xb7\xf8\x66\xcd\xef\x5c\x3a\x99\xcd\x1f\xc8\xb5\x4d\xd5\x79\x7f\xff\xff\x96\xd3\xba\x39\xbe\xb3\x74\x97\x2f\x5e\x92\x09\x21\x32\x7d\x51\x39\xac\x2c\x3d\xfe\x97\x2e\x9e\x2d\x3b\xbc\x30\xda\x79\xad\xf1\xab\xcd\x4c\xb5\x77\x0f\x9c\x55\x7d\x4d\x9b\x96\x95\x9f\x9f\xb6\xbc\xba\x7c\x49\x79\x75\x5d\xc6\xf1\x6b\x60\xfa\xdf\xf9\x50\xf5\xf3\xee\x79\xa2\x5c\x9f\x35\xc7\x7b\x6f\x2b\xe7\xdb\x16\xfd\xfb\xaa\x9f\xb5\x76\x4b\xb9\x5c\x30\x7b\xa4\x78\xe4\x82\xe9\xd3\xfc\xda\x43\x3f\xce\xbe\xf6\x5d\x56\xc1\x27\x5d\x78\xdf\xb3\xc6\xb5\x1e\xc1\x05\x9f\x49\xe5\x7c\xd5\x3a\xb3\xd3\xab\xeb\x28\x9b\xae\xf1\xc0\xcd\xe9\x39\xd3\x55\x99\xf3\x6f\xfa\xbb\x1e\xff\x86\xf1\xc7\x5c\x70\x76\xf9\x33\x7b\x56\xbb\xd6\xc9\x97\xf4\xe8\x7d\x33\xf1\xae\xb7\x7b\xf7\x6c\xd9\xe3\x3f\xf6\xe8\xc5\xa5\x7e\x3a\xab\xca\xcf\xd8\x7c\xbe\x6b\xa4\xba\x1e\xed\xf4\xf1\xe1\xed\xde\xb7\xd6\x99\x11\x2e\x58\xe0\xbe\x25\xfd\xc3\x38\x96\xf1\x60\x39\xfe\x62\x5e\x1e\x7d\xfe\xa7\x2e\x3c\x75\xec\x96\x1d\xb9\x0a\xbe\x61\xf6\xb0\x31\xed\x44\xe0\xc1\x23\x47\x1f\xd9\xa1\x7c\x83\x3d\x43\x96\xeb\x2f\x9b\x8e\xac\xc0\x0b\x37\xbc\x1f\xa9\x3e\x9e\x6e\x71\xed\x21\x56\x92\x47\xbb\x4f\xf4\xe8\x83\x8e\x5d\xf4\x02\xf4\xc8\x67\xd9\xa6\xe5\x1d\x3f\xf0\xe8\x77\x86\xcd\x32\xbb\x8c\x9e\x58\xf7\x39\xef\xab\xb0\x4d\x37\xff\x1c\xc3\x74\x55\x75\x9d\x79\x7d\x67\x75\xde\xb2\xaf\xd3\x91\x23\x86\xfe\xab\x3a\x3e\x23\xe0\x5a\x8f\x9b\xe7\x9c\x5f\xce\xef\xb6\x1d\x0d\xca\x63\x10\xce\x7b\xed\x3f\xb7\xaf\xc5\x75\xe0\xd7\xba\xe6\xc4\x77\x7b\x37\x05\x40\xb9\x7d\x8c\x61\xb2\xaf\xb1\x8c\x16\x3d\xbc\x61\xc0\x5d\x3b\xb1\x14\x47\x20\x7b\xdc\x7d\xa2\xc5\x92\x7c\x58\xfb\x84\x07\x56\x92\x7d\x46\xdb\x4f\x2c\x97\x03\x16\xad\x3f\x5c\x5d\xf7\xd8\x7e\x8f\x6b\x1e\xec\x1f\x49\x65\x4b\x3d\xb5\x2c\xd9\x54\x06\xf7\x9d\xbf\x72\xbd\x43\x2a\x8d\x77\xcf\x72\x9d\x6b\xaa\xa4\x27\xb9\xea\xf1\xfb\x02\x1d\x0e\x9e\x75\x6c\xf8\x03\xf1\x42\x71\x28\x76\x80\x01\xd4\xe2\x7d\x53\x89\x9b\x8a\x3f\x98\xce\x58\xfa\xea\xb9\xe6\xfd\xcf\xce\xcb\xa6\xfc\x29\xe4\xa6\x59\xcb\xc7\xb1\x5d\xae\xe0\x2f\x26\x3f\x8a\x54\xc8\x7f\x97\x9e\xdd\xed\xae\x99\xe6\xf2\x05\x6f\xff\xc8\xa5\x2f\xe2\xe7\x7b\xff\x61\xca\x4e\xaa\xaa\x0d\xd7\xfb\x95\x07\x2f\x1c\xba\xf4\xf4\x04\x70\xc5\x5d\xfa\x6f\xad\xe0\xe3\xaf\x95\xf1\x71\xfb\xee\x16\xd6\x9b\x9d\xde\x27\x65\xef\xdd\xb1\xa8\x1c\xdf\x4d\x3e\xb8\x0d\x5b\x5f\x9d\x45\xaf\x8e\xdc\xff\x6a\x05\xad\x49\xa5\x33\x71\xea\xe8\x97\xc9\x84\xc1\xa6\xea\x3c\x61\x7b\xdd\x37\xc8\x90\xef\xba\xf0\xd6\x80\x69\xf3\xe0\x0e\x22\x67\x7b\xb4\x3d\xfe\xc1\x03\x15\x67\x66\xf2\xc7\x37\x2a\xd6\xe9\xf2\x65\xf7\x7e\xe2\x91\x39\x0e\x3e\x6f\xc6\xf7\xdb\x80\x1f\x9c\x5e\x3c\x3b\xf0\x7d\x9c\x27\x5e\x07\x5a\xc1\x1c\x70\x25\x00\x56\xe9\xaa\x3a\xd7\x05\x94\xb6\x29\xf5\xb0\x69\x5a\x3d\x59\xd3\x88\xd3\x78\x8f\x87\x76\x4a\xb8\x93\x59\xdf\x0c\xa3\xcd\x64\xa0\x16\xb6\xd4\xb6\xd4\xb6\xd4\x35\xd6\xb6\xd5\x57\x49\xb6\x6f\xf4\x5f\x71\xc9\x74\x79\xfa\x05\xc4\x79\x05\x7a\x5c\x1e\x85\xf9\x48\x4c\xa3\x63\xe8\x4c\x62\x26\x3c\xe6\xce\x1b\xd0\xc1\xba\x40\x1d\x14\xd1\x8e\x93\x1f\x3e\xe5\x48\x7a\xd2\x9a\xa5\xcf\x2e\xff\xd5\x2c\xb4\x79\x83\xd4\xf8\x8b\x0c\x03\xff\xaf\xee\xc8\x27\xb6\x16\x8e\xff\x5d\x97\xaa\xde\x3b\xf5\xf9\x85\xf7\x9e\x3f\x67\xea\xf9\x97\x9e\x78\xe9\xa5\x73\xee\xbd\xed\x77\xd9\xa7\x52\x51\xed\xa9\x9a\x4f\x54\x14\x47\x41\x14\x17\xa0\x04\x47\x09\x41\xe0\xe3\xa2\x8c\x36\x4c\xba\xe2\xde\x69\xd3\x5f\x59\xfb\xf8\x17\xff\x59\x73\xc7\x99\x68\x23\x5c\x0e\x4f\x47\xc7\x9d\x39\xf7\x3e\x7e\xe1\x12\x62\x64\xed\xee\x49\x01\xf4\x1e\x31\x04\xaf\x40\x3b\xbb\xd1\x1b\x67\x3d\x29\xe8\x4b\xf9\x8b\x6a\x65\x8a\x21\xce\x8e\x9f\xb4\x25\x4e\x43\xcc\x0c\x6b\x40\xd2\xc4\x31\x2b\xa7\x69\x21\xce\xa7\xc7\x7b\x35\x6b\x81\xd9\xed\x62\xa3\xcd\x76\x26\x23\xc4\x79\x64\xd6\xbf\x0e\x24\xe6\x41\x3b\x90\x57\xd3\xd0\x1c\x21\x38\x2e\x9e\xd3\x46\xd9\x78\x9a\x66\xa0\xa2\x1d\x14\x34\xa8\xc4\xe9\x58\x4d\x6e\x22\xa6\xf9\xd4\x82\x50\x93\x60\xd1\x28\xd2\x88\xb4\xce\xf9\xe2\x85\x2c\x27\x49\x42\x58\x92\xe2\x85\x11\x1f\xad\x73\x44\x1a\x8d\xa1\x91\x38\x91\x22\x05\x41\x86\x41\x34\x2e\x26\xe3\x02\x87\x86\x87\x47\x20\x9b\xe0\x90\x84\x52\x49\x01\x65\xa5\x30\x25\x26\x05\x49\xe1\xb9\x88\x12\x63\x92\x92\x90\x14\x82\x72\xa5\xec\x70\xfa\xea\x94\xd9\xd6\x3d\x0f\xb9\x68\x12\xfb\x66\x7b\x56\x55\xe0\x21\x96\xc5\x9b\xdf\xf4\xc8\x62\x27\xc7\xd0\x9c\x7f\xf0\x0f\xe5\xfc\xb6\xf7\xef\x9e\x79\x96\x17\x5b\x02\x6f\x61\x3e\xbc\xe6\xe8\xcf\xa8\x45\x03\x6f\xfe\x0b\x9c\x35\x6e\xf9\x72\x25\xbc\x56\xc6\xb2\xbd\xc8\xb5\x91\x6a\x7a\x60\x88\xec\x19\x2d\xd7\x4d\xb6\xff\xac\x42\x7f\x73\xe9\xb1\x5b\x0f\x29\xb7\x4f\xac\x3d\x3f\xe8\xe1\x8b\x4a\x28\xba\xfd\xd9\x2a\x76\x51\x92\x6a\x1f\x7a\xd0\x0f\xe6\xfe\x89\x01\x21\x72\xd3\x79\x1e\xdb\xd8\xe1\x2d\xfb\xcd\xa8\xfb\x79\x5e\x98\xf4\xbe\x5f\xc1\xbf\x5c\xba\xd1\xf6\xcf\xca\xf7\x37\x70\x14\x70\xfb\xf4\xca\xfc\x2b\xfd\x99\xea\xfa\xc0\xf6\x77\xca\x65\x96\xb5\xbf\x07\xca\xf9\x7e\x97\x77\x7f\xa2\x3d\xff\xde\x4e\x6c\xeb\x2a\xc0\xf2\xd6\x38\xb5\x2d\x92\xa1\x68\xfa\xd2\x0a\x19\xef\xd2\x69\xbb\x6f\x71\x8d\xbb\x7c\xfa\x3b\x0e\xaf\x7e\x16\xeb\x7f\x5c\xdd\x16\x48\x3f\xe8\xd1\x99\x0c\xfd\xe0\xc2\x6f\xd3\xc9\x3d\xbd\x5d\x4c\x7b\xb0\xb7\xba\xaf\x63\xf0\xf7\xc0\xeb\xff\xb5\xfb\x05\x35\x57\x3c\x2f\x94\xd6\xd3\xdd\xe6\x79\x6f\x69\xfc\x66\x0f\x4c\xc5\x50\x74\xf7\x57\xd8\x9f\x68\x7a\x04\x9e\xf7\xae\x75\xef\xb3\x18\xae\xcf\xe1\xef\x9e\xf1\xea\x0f\xa6\xbc\xd8\x71\x91\x4b\xcf\x91\x4a\x67\x9d\x4a\x7a\xd6\xe5\xec\x7b\x07\xe7\xc2\x19\xb3\x4e\x1f\x3e\x87\x75\xfb\x2c\x3e\x7f\x65\x71\x66\xa0\x8f\x94\xc1\x11\xe0\x38\x70\x0a\x38\xcd\xca\x68\x0f\x98\xb5\x4b\xfd\xcd\x4d\xa1\x0a\x7e\x6f\x33\x2a\xcc\xdb\x7c\x0d\x75\x0d\xff\x8d\xb7\x9f\xb4\xee\xf8\x24\x6c\xba\xa9\x78\xdd\x4d\x68\xdf\x4d\xf0\xc8\xff\x25\xb8\xc2\xd1\xc5\x67\xfe\x4c\x80\x86\x93\xb7\xcf\x3e\x09\x1d\xeb\x03\xfa\x14\xe2\xaf\xfa\x24\x9f\xf4\xbc\x0e\x3e\xa8\x19\x9e\x60\xf4\x64\x55\x76\x5e\xb3\x05\x65\x3e\x41\xb3\xdf\x4a\x7f\x02\x59\x34\xf2\xaf\x35\x29\x38\xe6\x3b\xbb\x1b\xcd\x40\x7e\x34\xfd\x26\xf8\x28\xfc\x84\xb8\xe5\x26\xfe\xf4\x3b\x9f\x2c\xf4\xbe\xb8\xea\x99\xd5\x7a\xd3\x6c\xb8\x49\x23\x6e\x85\x09\x94\x52\xd1\x08\x23\x0b\x3a\xc7\x73\x94\xc1\xc2\x99\x78\x4c\x8b\xd3\x50\x71\x68\x56\x0a\x45\x77\x4d\xc5\xd5\x6b\x30\xb7\x72\xec\x5e\xda\xac\x49\xbd\x9d\x07\xde\xd8\xdf\x49\x81\xfd\xe4\x15\x58\x97\xfc\x38\x44\xf6\x8e\x9f\x90\x71\xe9\xaa\x52\x28\xba\xfd\xd0\x0a\x5c\x71\xc5\x8a\x3a\x91\x4b\xef\xc2\xf4\xb7\xee\xc5\x8a\xe7\x5d\xba\x64\xf7\xcc\x72\xfe\xb5\xf5\xe1\xea\x32\xdf\x8a\xe5\x7d\x50\xfe\x7c\xff\xcb\x55\xf4\x37\xc9\xe6\x8f\xbd\xef\x7a\xec\x5b\x29\x14\xdd\x3c\xb5\x0a\x7f\x94\x42\xd1\x2d\xef\x80\xf2\xd8\x08\xa6\x8d\x2d\x7f\xab\x58\x8f\x46\xf2\x36\x5f\xee\xac\xe8\x9d\xb6\xf5\xb3\xea\x76\xec\xd6\xc1\xea\x32\x64\xdd\xa2\x2a\xf3\x1b\xcf\x47\x2b\xd6\xe9\xca\x81\xda\x76\x69\xb9\x5d\xb2\x35\x5e\xf1\xbc\x2b\x7f\x68\xdb\x99\xe5\xfb\xea\x6e\xad\x2e\x27\xcc\xe7\xb7\xbe\x59\x9d\x67\xad\x3d\xbf\x3a\x7f\x35\x7b\xc3\x00\x1f\xb6\x9f\xb6\x92\x4f\x83\xa9\x60\x1a\xee\x9d\x6c\xf5\x10\xab\x6d\xa8\x75\x51\x56\x5d\x63\xed\x4c\x9f\x95\xe1\x89\xfb\x4d\x97\xa8\xcc\x9d\x74\x39\xb3\xb5\x36\xd0\x3c\xad\xb6\xb1\x66\xeb\xc3\x6f\xbc\x07\x2f\x47\xbb\x7c\x57\xa1\xad\xf0\x1a\xf4\x14\x71\xa4\x5a\xe8\xed\xfa\x6a\xa4\xa6\x0e\x9d\x4d\xc4\x27\x02\xc4\x51\xe8\x1a\xfd\xdc\x71\x4d\xd3\x32\x11\x41\xe4\x92\x3c\x17\x49\xf0\x91\xc8\x08\x03\x83\xe3\xe4\xd3\xdf\xbd\xac\xf9\xe7\xcf\x21\x1d\xfa\x9e\xfb\xf9\xda\xc2\x29\x97\x5d\xe6\xdb\xd7\x3c\x91\xed\x44\xb7\x75\x76\xc2\x17\x7d\xaf\x41\x0e\xa5\x55\x94\x4c\x28\x0c\xad\x67\x25\x3e\xa2\x45\x62\x34\x1c\xe1\x52\x3c\x1c\xf1\xc0\x77\x5b\x7b\x15\xf8\x1a\x32\x2f\x68\xd0\x96\x8a\x25\xbb\x13\x43\xb1\x70\xca\xf4\x37\xbd\xc4\x61\x1f\xd8\x95\xd5\x78\xb7\xd3\x23\x85\x2f\x46\xdc\xe7\xb5\xf5\xdf\xe5\xe7\x3b\x78\x55\xc5\xfb\x5d\x76\x84\xab\xff\x10\x63\xc6\xfa\xac\x58\xd0\x99\xe5\xb6\xa3\x15\x3f\x68\xad\x6e\x1f\xbb\x7a\xd4\xd8\xfb\x16\xab\xe3\x67\x9a\xaf\x22\x93\x1c\xbf\xe9\xd0\xcc\xea\x78\xb2\x25\x56\x4e\xd7\x5b\xd2\x15\xf3\xe3\xf5\x6c\xd1\x80\xd7\xe7\x78\x76\x60\x3b\x29\x61\x9f\xe3\xc4\xbc\xcd\xcc\x8c\x10\xb9\xf5\x75\x7f\xd9\x5a\x07\x8e\xa8\x98\x0b\xcb\xbd\x75\x33\xaa\x8c\xcb\xa1\xe8\xc0\xe1\x15\x3a\x80\x99\x4b\xf5\x3f\xc6\xb9\x6d\xfb\x35\x8e\xd6\xbd\x49\x95\xf4\x31\x29\x64\x6a\x06\x36\xf5\x17\x9c\x3d\xba\xe4\xd5\xba\x6b\xca\x61\xb5\xe7\x96\x0a\x1e\x95\x2e\xe9\x4b\x03\xd8\xe3\xb2\xf9\x7d\x97\x1e\x22\xd9\xfc\x65\xeb\xe6\x72\x3e\x65\xc6\x73\xd2\x7d\xd5\xf9\xa9\xd3\xd3\xc7\xc1\xb3\xde\xe9\x15\x7a\x94\x5a\x7a\xf7\x1e\xcc\x6d\xfb\xe6\x78\x79\xb9\x35\x97\x7d\xe7\x45\xb2\xc7\x3d\x7b\x9f\xf0\xda\xcb\x96\xee\xf2\x4e\x75\xb9\xd0\xdb\xec\xda\xbb\x8b\xcf\x38\xbd\x92\xca\xe2\x03\x6b\xef\x70\xe1\xa1\xe9\xff\x66\x8c\x77\xf7\x24\x3d\x3e\x06\x8f\xad\xbe\x6d\x65\xf5\x77\x6f\x9d\xa8\xae\xe7\x6f\xf9\xd9\x37\xe8\xff\xa5\x98\xdb\x9c\xc0\xf3\xe4\xea\x50\x74\xed\x86\xf7\x26\xec\xfc\x27\xe0\x07\x89\x62\xcc\xb0\x5b\x41\x08\x4c\x01\xad\x60\x19\xb8\x1c\xe7\x31\x36\x38\x16\x11\xae\x18\x88\xaf\x0c\x4e\x6b\xb0\x18\x5b\x45\x3a\xb9\xc1\xd8\x0c\xbe\x57\x5f\xaa\x3a\xe8\x66\x7c\xb0\xc1\xbc\x3b\xe0\x63\x6b\x38\x5d\x4b\x10\xf1\x14\xe2\xd5\x78\xaf\x04\xcf\xba\x05\x0d\x43\x19\xa6\x50\x62\x22\x0d\x83\xda\xe8\xa8\x20\x84\xc5\x24\xc7\xe3\x4c\xf4\xd8\x38\x0d\xe3\x68\xbc\x26\xa5\xc9\x72\x42\x16\x93\xa2\x98\x18\x19\xe1\xc4\x04\x1b\x49\x70\x91\xb0\x3e\x0e\xb3\x31\x24\x27\x20\xc5\xa0\x1c\xc9\xc9\xaa\x3e\xc2\x25\x60\x82\x11\xc5\x14\x0c\xa3\x60\x4e\x32\x59\xa1\x18\x8b\x63\x5e\x88\xb3\xe5\x79\x38\xcc\xa7\x04\x98\x43\x49\x94\x65\x25\x85\xd3\x44\x2e\xa1\x64\x92\x28\x23\x26\xc2\x6a\x24\x42\x13\x09\x14\x4b\xcb\x02\xa4\xaa\xe8\x87\x6b\xed\xbc\xa1\x33\x8b\x2d\x81\x77\xc8\x1b\xa8\xe8\xd0\xaa\x0f\x3e\xa3\x16\xbd\xf4\xbb\x87\x7e\x31\x6f\x78\xe1\x31\x5e\x3e\xda\x73\x5f\xa9\xef\xa0\x8b\x8f\x9a\x77\xad\x76\x55\xc8\x66\xb3\x07\xee\x0f\x8c\xdf\x98\x18\xd3\x79\xd0\xc1\x17\x7c\xf6\x5b\x5e\xf7\xd0\x9c\x27\x57\xc8\xfe\xf3\xd9\x47\x31\x67\x6e\x76\xf1\x18\xcd\xb0\x71\xba\xb6\x06\x27\x66\x9f\xca\xcc\x08\x61\xfa\x08\x2d\xda\x7d\x08\xf8\x88\x01\x67\x5d\x5b\xc9\xbf\x3b\xbf\xf6\xd8\x2d\x25\xdd\xf8\x28\x0b\x57\xf8\x62\x53\xe0\xe7\xa4\x02\x0e\x03\xb5\xe0\x68\xc0\x00\xde\x90\x89\xb8\x9e\x39\x2e\xab\x50\x6f\xd5\xd5\xb7\xca\xa5\xfb\x3d\x37\x86\xeb\x03\x4d\x3e\x32\x50\x67\xfa\x1a\x5a\xf1\xad\x12\x7c\xe5\x72\x5a\xd5\x5b\xfd\x8d\xad\xb6\x14\xf5\x9f\x2d\xc7\xf2\x30\x96\x40\xd9\x7c\x16\x8d\xf1\x50\x4e\xf3\x2c\xcf\x25\x50\xda\x97\x52\x93\x49\x21\xa1\x47\xe0\xbb\x31\x8a\xa0\x10\x15\x4f\x70\x71\x99\x4d\x24\x33\x49\x94\x50\x04\x21\x25\x87\xd3\x79\x56\x4c\xf0\x90\x1a\x41\x09\x82\xa6\xc2\xfa\xbf\xc3\xbc\xc8\xf2\x89\x84\x21\x50\x79\x9e\x91\x93\xa3\xa3\x5a\x2e\x47\x2a\x5c\x7c\x58\x96\x95\x6c\x56\x91\xb2\x32\x93\x48\xf2\x6c\x4e\x1e\x15\xc4\x84\xb4\x87\x65\x14\x81\x67\x13\x9c\xc0\x26\x18\x39\x05\x93\x3c\x37\x1a\x8f\xcb\x0c\xcd\x8c\xd2\x91\x24\x9f\x51\xe2\xf1\x1f\x2a\x74\x5c\xcf\x5b\xe8\xa5\x45\x62\xa9\x58\x1c\xe6\x55\x13\xf9\x58\x8f\xee\x62\xea\x70\x9e\x3e\x34\xd8\x77\xa8\xfd\xb6\x8a\x7d\x23\x87\xa2\xeb\x07\x2a\xec\x1b\xec\xb3\xd3\xf6\x54\x91\x9d\xa5\x7c\xf2\x57\x3d\x76\x44\x29\xdf\xbe\xa1\xc2\xae\x32\x31\x6d\xbc\x5c\xc7\x32\xcf\x7c\x4b\x6d\x85\x8d\xb9\xad\xba\xce\x90\xfe\x51\x99\xdf\xdf\x5a\xbf\xf6\xf7\x2a\x32\xd5\xc1\xa9\x81\x43\x2b\x74\xc4\x8f\x2b\xfc\x60\xae\x9c\x85\x8d\x15\xb9\xdb\xfd\xdf\xab\x02\x37\x47\x57\xd8\x92\x29\xdf\xef\x96\xf9\x15\x34\x84\xdf\xbb\xfb\x43\x4f\xfe\x69\xc2\xee\xe7\xd4\xf5\x77\x50\xe9\xc7\x96\x42\xd1\x4d\xe7\x54\x8c\x63\xb8\x69\xab\xab\xdb\xb5\x5b\xea\x3d\xf0\x71\x64\x9f\x75\x5e\x8f\x55\x97\x65\xdd\x75\x98\xf2\xce\x74\xf4\x1d\xa1\x94\x63\xa4\x6d\xf6\xf8\x2a\x9c\x3c\xe0\x01\x1f\xde\xb9\xee\x92\xe3\xa5\xf3\x2c\x94\xfb\x6f\xb6\x7c\x5d\xdd\xf6\x31\x9f\xdf\xd0\xe5\xd1\xb1\xe5\x50\x74\x0b\xc2\x32\x76\x5f\x99\xcc\x72\xf9\x5d\x06\x1f\xaf\x6e\xd3\x6f\xf9\xaa\x5c\x87\xd9\x32\x5e\xa6\x0f\xb1\x81\x5f\x61\x7f\xcc\x2a\x08\x16\x1c\x8e\xef\x93\x60\x65\xcf\xc1\x0f\x43\xbf\x39\xe8\xf9\x8d\x80\x79\x94\xb1\x2e\x5c\x4f\x63\xcb\x41\x8f\x6e\x58\xd2\x47\x46\xf0\x9f\xd8\x8f\x34\xf0\x46\x75\x9a\xd9\x3a\xbd\xfa\xf8\x96\xfb\x3d\x76\x58\x89\xc6\xfe\xe9\xc2\x51\x57\x1e\x48\x7f\xaf\xc3\x27\xd9\xc0\x1c\x52\x02\x87\x80\x23\x70\x07\xa1\x8b\x01\x80\xb6\x6d\x8e\xaf\xca\xf9\xed\x2b\xe6\xd6\x3d\x81\x46\xdb\xa0\x70\xd5\xcd\x6a\x98\xf2\x5f\xec\x75\x1f\xab\x29\x4a\x8d\xac\x14\x52\xbe\x04\xda\xd5\x16\x81\xb7\xde\x77\x1a\x0d\x8f\x40\x2b\xe1\xa5\x68\x4f\x17\xda\x03\x2f\x45\xb7\x41\x7f\x6c\xc1\xc3\x70\x79\x38\xd6\xf1\x7c\x5b\x0c\xf5\xd1\x13\x6b\xb2\x8a\xa2\x88\x61\x99\x11\x59\x3a\xcc\x72\x11\x8e\xa3\x45\x21\x5b\x93\x41\xbc\x3e\x8a\x12\x09\x98\x82\xe3\xc4\x38\x4a\x8e\x0b\xaf\x5c\x7a\xe3\xa3\xdd\x0f\x3c\xf5\xf2\xa3\xe8\x37\xf0\xe4\x47\x5f\x7e\xaa\xf3\xd1\x47\xcf\x9d\xa7\xff\xe5\xd1\xce\x47\x89\xe5\xdf\x62\xa9\x63\xb8\xb0\x76\xad\x4d\xa5\x8b\xc2\x77\x83\xf2\xa0\x9a\x6e\xd9\x7f\x7b\xb9\x3f\xcc\xec\xa0\xdd\xf9\x55\x75\x1e\xe0\xf4\x76\xe2\x9d\xde\x51\xa6\x9e\xf6\x80\xcb\x4e\x77\xe5\x6e\x3a\x3d\x9f\x44\x9b\x67\x74\x6d\x0d\x83\x10\xb9\x65\xca\x58\x19\x0f\xde\x52\x9e\xbf\x65\xe5\x59\x0c\xbe\xe1\xe1\xc1\x77\x98\xe7\x4d\xb5\xef\xfe\x6c\xc5\xc2\xd9\xd7\xce\x7d\x87\x6a\xdf\xfb\xec\x51\xfe\x79\xa1\x79\xeb\x42\xd8\x0f\x84\xf5\x29\x3a\x90\x26\xd7\x80\x13\xc1\x59\xb8\x7f\xde\x6d\xb8\xe2\xd6\xb7\x39\x92\xc9\xc6\xe6\x08\xac\x68\x49\xd1\xfc\x8d\x2d\x29\xaa\xdb\x97\x0e\x5a\x90\x59\x16\x09\x50\x42\x12\xcc\xa1\x18\x2b\x26\xd8\x70\x82\x8f\xa1\x30\x1c\x43\x3c\xd4\xd2\xd9\x18\x1c\xd6\xbf\x86\xfb\x1b\x6a\x95\xda\xa9\xf0\x9f\xfa\x27\x67\x10\x4f\xa1\x7f\xae\xfc\xe3\x05\xe8\xe3\xdb\xd1\x88\x8a\x0e\x9e\xb3\xeb\x5e\xf4\x57\xb8\xea\xc4\xa9\xe8\x31\xdf\x7d\x4f\x5c\x70\xf5\xed\xcb\xf5\xe7\x2f\x38\xf9\x89\x53\x2e\xd0\xcf\x1c\x56\x87\x87\xd5\x48\x82\x67\x12\x1c\x1b\x4b\x70\x61\x2e\x41\x27\x85\x61\x62\x4c\x8a\x08\x92\x28\x27\x05\x8e\x52\x28\x86\x97\x45\x89\x0f\xca\xc4\xce\xd5\x1b\x1b\x56\x3f\xf8\xd8\x83\xab\x57\xcf\x7e\x69\xc5\x97\xbf\x79\x7a\xf5\x8a\xd5\xab\x67\x9f\x05\x37\x9c\xbd\xfa\xec\x2b\x97\x5c\x79\xf1\x95\x4b\xae\xbc\x04\x15\x2c\x25\x0d\xdb\xab\x23\xd6\x15\xc3\xe1\x78\x2c\x15\xa7\x61\xce\xcd\xbb\xd3\xaf\x55\xf7\x01\x6a\xff\x06\xe5\xf1\x5d\xec\x07\x72\xfb\xee\x3a\xbf\xb4\x70\x89\x76\xe7\x2e\x6c\x5d\xfe\x0d\xbc\xea\x2c\x8f\x0e\x54\xf2\x05\xfd\xa7\x3a\x9f\x7c\xe9\xcf\xe5\x72\x72\x9d\x56\xdd\xb6\x35\x79\x74\xea\x7e\x3c\xdb\xbf\xad\xdf\xc4\x4d\xfe\x69\xc9\xe2\x7f\x95\xcf\xb5\x69\xf1\x37\xe0\xa5\xe9\x1b\xc4\xa1\x0d\x40\x82\xeb\x8a\x2b\x02\xdf\x23\x1f\x02\x75\xe0\x4c\xb0\x10\x5c\x64\x76\xd6\x80\xa5\x4b\xbb\x47\xb9\x2a\x81\x7f\x3b\x4f\x81\x18\xf5\xc8\x80\xf1\xd7\xa6\xb6\x29\xbe\x29\xf5\xae\xc8\x88\xab\xfa\x78\x53\xcd\xc3\xd2\x42\x98\xff\x4c\x5f\xb5\x90\x60\xb3\xe8\x8a\x85\xd7\x2c\xbc\xbf\xf5\xa2\x8b\xae\xbe\x06\xce\x28\x3c\xf4\xcb\xe7\x31\x8b\x59\x20\x2e\xa6\xc3\xec\xb2\xc8\x32\x8e\x16\x3b\x7e\x49\xd6\x6c\xd8\x47\xa3\xdb\x7f\x73\xe0\x92\x17\xbe\xb7\xf4\x20\x3c\xe3\xf6\xc5\xe7\x9c\x3a\x95\xb8\xe4\xa1\x89\x4d\xdf\x25\xbe\x33\xf9\x04\x38\xe7\xe0\x0f\x12\x7b\x0a\x28\x73\xf1\x1f\xff\x3c\x1f\x06\x7c\xb7\x9c\x28\x5f\xab\xef\x3e\xf0\xc8\xf3\xf0\x83\xc0\x15\xdf\x79\xe0\xfc\xdb\x6e\xbd\xe8\x9c\xf6\x4f\x89\xbf\x18\xbc\x6d\x1d\xfa\xf9\x82\x35\x1d\xfa\x15\xd7\x2e\xa3\xd6\x50\x0b\x88\x59\xa7\xc5\x36\xc5\xdb\xe0\xd3\xe8\xd3\x8e\x73\x1f\x1d\xfc\xa0\x6b\x3a\x77\xe1\xe3\xcb\xdf\x59\x79\x0e\x71\xc6\x85\x97\xa0\xbf\xa9\x2a\x3c\x8a\x61\xd0\x6f\xee\x7a\xf8\x5e\xa5\x23\x79\xb3\x76\xe1\xbd\xd7\x79\xf5\x82\x8d\xa7\x1a\xe7\xb2\xf1\x14\xe0\xce\x45\xb2\xf4\xdf\x5d\xaf\xb9\x74\xf2\x7f\xba\xf4\x06\xc5\x8e\x4f\x1f\x10\xca\x7d\x72\x5d\x5b\x2a\xce\xdf\x95\xa7\xd4\x73\xaf\x8b\x57\xad\x28\x9d\xfd\xba\x35\xdb\xf2\x2e\x79\x6b\xf0\xb0\xf3\xaa\xdb\xff\x07\x9e\xaf\x18\xc7\xb8\x72\xe0\xa9\x2a\xf2\xdc\xd1\x19\xd6\x7d\x04\xca\xe4\x69\x97\x17\x4f\xcf\x2f\x2e\x0c\x8c\x90\x0f\x52\xed\xea\x9f\x13\x13\xf3\xa3\x0c\xf6\x16\x7c\x36\x61\xfd\xa6\xc9\x94\xcf\xeb\x3f\x9d\xf5\xc1\x82\x65\x9e\xfb\x9e\x4c\x91\x09\xe4\xcc\xf7\x8c\x82\x50\xb4\xf7\x79\x3a\x18\x22\x0f\xbc\x1b\xf3\xe8\xb2\x96\x7e\x50\x91\x1b\x6d\xd1\x96\x7d\xe7\x88\x2d\x5e\x18\xf8\x11\x79\x3f\xd5\x7e\x80\xf7\x8d\x9d\x75\x2c\xf3\x39\xb5\x68\x68\xd5\xbf\x71\x56\x56\x35\xf9\xd1\x73\x8f\x4b\x07\xc3\x34\xd9\xed\xab\xe2\xdf\x91\x43\xd1\x4d\xb0\xba\xae\x63\x9d\x49\xce\xa5\x3b\xb8\x78\xc1\xfa\xb4\x47\xd7\x75\xde\xbb\xf9\x67\xae\xe7\xc5\x12\x8c\x3b\x4b\x75\x3b\xce\x0e\xbc\x42\xbe\xe0\xdc\x51\xde\x35\xeb\x50\x07\x56\x26\x8e\x00\xac\x73\x7e\x58\x6e\x6f\x6d\x02\x15\xba\x34\xf6\x43\xf5\xdc\x0d\x2a\x73\x27\x1c\x1d\x27\x75\x86\xf1\x6d\xea\xf4\x32\x7d\xfd\x57\x15\xbc\xc3\xb5\xe7\x75\x7b\x3d\xb6\xa4\x53\x77\xbb\xd3\xee\x5f\x7a\x73\x71\xbe\x29\x4b\xfb\x8f\x35\xd7\x74\xe8\x97\xae\xb3\x73\xde\xbd\x01\xdf\x86\xed\xfc\xc2\xa5\x0b\xcb\xa1\x68\xf7\xb5\xd5\x7d\x44\x16\xbc\xbf\xe3\xf2\x51\x95\xfc\x43\xd1\xad\x53\x30\xd4\xfb\x2d\xfd\xce\xae\x97\x66\xc6\x0c\x3f\x74\xf9\x6f\xcc\xda\x27\xa6\xe7\xe6\xf3\x6a\x67\x1a\x22\x37\x07\xcb\x61\x6b\xe5\x4c\xe1\x1e\x7f\x9d\x7f\xab\xc6\xcb\xb7\xfc\xa7\x9c\xa6\xba\x5b\xaa\xf8\xf3\x94\x50\xf4\xc0\x37\xe8\xfa\x16\xde\xbc\x59\x95\xf7\x93\x5b\xfe\x55\xdd\xd6\x72\xfa\x22\x3a\xfa\xce\x50\x13\x5e\xe5\x67\xae\xe7\x5d\xb1\xa2\xa1\x4b\x5d\x3c\xc4\xac\xfb\x8c\xaa\xc8\x1c\x29\x14\xdd\xfc\x53\xd3\xeb\x57\xdd\x37\xe4\xf4\x69\x74\x6c\xc5\x27\xe7\x01\x10\x8a\x76\x6f\xb4\x33\x27\xdd\x3e\xf6\xfd\x2f\x56\xd1\xbf\x0d\xfe\xf9\x03\xdc\x23\xd9\xeb\x97\x52\x42\xd1\xae\x73\xcb\xec\x1e\x4f\xbe\x4f\xe7\x5f\x5d\xba\x19\xa6\xd1\x14\xc6\x01\x53\x9b\xef\xfc\x8b\x57\x3e\x76\x97\xfb\x55\xed\x1c\x0f\x6f\x4e\x91\xe4\xc4\x5b\x7b\xaa\xac\xc9\xc1\x81\x34\xe6\xf5\x9d\x63\xce\x5c\xf8\x1d\x3d\x77\x55\x99\x4b\x0d\x45\x7b\xee\xc4\x4f\x7f\xea\x9a\x2b\x51\x9a\x6b\x13\xb6\x64\x7a\xee\xf0\xf2\x68\xcc\xd3\xad\x5e\x0e\x9d\x7f\x76\xce\xca\x7d\xe7\x55\xac\x86\x9f\x21\x72\xad\x9d\x67\x72\xad\x1d\xd3\xde\xff\x15\xbe\x1b\xf5\xa0\x0f\xcc\xfb\x82\xa9\x8a\x6f\x9b\x0f\x94\xeb\x45\x16\x8d\xbf\x52\x4e\xfb\x3d\xb7\x03\xaf\xff\x94\x71\xd3\xb2\xd9\x83\xa0\xf3\x4f\x5e\x9e\xda\x3f\x54\x1d\xd7\x4d\x3a\xdb\x78\xfb\xb7\xd2\xd9\x1f\xbd\xb6\x33\x7e\x83\x2d\x4f\x3f\x71\xe0\x82\x69\x6d\xf3\x0f\x2b\x68\x0d\xf3\x92\x75\x97\x54\x79\xbf\x13\x1f\xdd\x9c\x29\xb7\xcf\x07\xfe\x50\x9d\xd7\x6b\x42\x05\x6f\xc5\x78\xbd\xe7\xae\x8a\xe7\x5d\x3e\xdd\x2d\xcf\x54\xf7\x5f\xf4\x1c\x2c\xc7\xc5\x4d\x6d\xdf\x20\x7f\xfd\xd8\x9e\x3f\xc3\xf6\x05\x82\x20\x7e\xf7\x36\x52\x06\x14\x88\x80\xf9\xe0\x7c\x4b\x63\x7b\xc8\x8c\x30\xcd\x6c\x6b\x6e\xc3\x8a\x56\x8d\xbf\x79\xa6\xbf\x34\x60\xf7\x1e\x9a\x04\x67\xb6\x99\x1d\x08\xad\xee\x67\xb8\xa2\xa9\xd5\x10\xda\xa5\xd2\xc1\xd0\xe4\x00\xd1\x3c\x6d\x0a\xfe\x13\xf7\xf3\xfa\x6f\x96\x43\xcd\xed\xcf\x5f\x2b\x7c\xfa\x55\xc7\x1d\x99\x3b\x1e\x8e\xc4\xd1\x93\xe8\xca\xd8\x6b\x04\x29\xd1\x1c\xcf\xc7\xc5\x6b\x19\xa9\x79\xe4\xf7\x31\x49\x7f\xfd\xe1\xe6\x08\x23\x74\x84\x63\x12\x1b\x7f\x98\xa2\x60\x3d\xbc\x9c\x47\xbb\xd0\x5f\x47\xd0\x03\x0c\xec\xd8\x4f\xbd\xf1\xcb\xd8\x1d\x50\xed\xbe\x28\xc9\x9d\x17\xb9\x2e\x11\x87\xd7\x0b\x11\xb5\x81\x87\x77\x25\x39\xf5\x3c\x51\xbf\xba\xf3\x26\xa9\xb3\x5b\x3f\xba\xba\x2d\x41\xca\xd1\xe7\x2f\xa5\x8e\xbf\x7e\x9e\xb2\xe3\x82\xb9\xad\xd3\x27\xdd\x79\xc3\xff\x44\xef\x5c\x31\xa9\xfe\xfc\x19\x8f\x6c\x6a\xbd\x69\xfa\xa4\x3b\x57\x3c\x12\x5d\x31\x7d\x45\xf0\xf8\x73\xe6\x46\xef\x94\xa3\xf5\x93\xee\xbf\xfe\x91\xbb\xba\x36\xaf\xb8\xff\x82\xfb\xe7\x1a\x4f\xa3\x41\xbd\x79\x25\x17\x54\x8e\x3c\x8b\x00\xe8\x3f\xe8\x3f\xa7\xc0\x58\x21\xf0\x7b\xf4\x9f\xb3\xe0\xd4\xf7\xcf\x38\x05\xfd\xfe\x2d\xf6\xd3\x9a\xfa\x6f\x33\x3a\xaa\xf3\xc9\xd6\xea\xb8\xd1\x9f\xfb\x56\x3a\xfa\x83\x17\x3f\x7a\x6e\xab\x22\x13\x0d\xde\x76\xba\xc7\x86\x69\x2b\xce\x0f\xfc\x92\x7c\x8a\xea\x48\x7d\x17\x3e\x0a\xa8\xd6\xbb\xce\xff\x27\xd5\x91\x92\xe0\xed\xc5\xdf\xb4\x86\x17\xbc\x63\xe0\xd0\x7b\x87\x96\xeb\x50\x21\x72\xf3\xf7\xaa\xeb\x7d\x3d\x38\xf7\x0e\x04\x81\x50\xbc\x30\xb0\x85\xfc\x2e\x88\x82\xb3\xad\x8a\x78\x17\x83\xcb\xc0\xbd\x66\x5d\x51\xac\xf1\xdb\x2d\x4f\x1b\x6d\xc3\xb3\x0d\xe3\x05\xc6\xc0\x68\xb3\xdd\x19\xb5\xae\xac\x98\x77\x6d\x43\x6b\x43\x7d\x4b\x6b\x63\x43\x5d\x4b\xab\xdf\xfe\xaf\x37\xd9\xa0\xba\x99\x7a\xa2\x7a\xc7\xf3\xec\xc3\x72\xe4\x34\xe2\x6a\xf4\xb1\xf6\x46\xe2\xd3\xf7\x3e\xdd\x89\x5e\x61\xdf\x53\xd0\xc7\x70\x0d\xd7\xa5\xc5\x46\xbb\xba\x1e\x96\x72\x9f\xc6\xe2\xfa\x56\x28\x2b\x50\x44\x0a\x4c\xa0\x14\x94\x51\x52\xc1\xc5\x5a\x35\xc8\xa3\x64\x3a\x97\x83\x42\x56\x1f\xc1\xff\x29\x74\xd5\x24\x27\x64\xfd\xa7\xd5\x91\xcb\xff\x9f\x47\xb7\x9c\x79\xfb\xe4\x23\x96\x32\xb7\xdf\xbd\xf4\xee\x8e\x5f\xbe\xde\x71\xf7\x59\x77\xdf\xfe\xc0\xe1\x81\x0e\x61\x24\xb2\xff\xc2\x23\x22\xd3\xa7\xeb\xdf\x8d\xc7\x45\x06\xc5\x99\xe4\xf0\x70\x92\x81\x59\x26\xcf\xb2\xec\x38\xc7\x71\x07\x57\xfb\xa3\x70\x19\x3a\xd0\x85\xee\xc4\x78\xf3\x56\xf2\xf2\x49\x06\xde\xbc\x16\x8f\xed\x8c\xd3\xf0\xbd\x32\x9f\xa8\x09\xfb\x81\x9a\xaa\xbc\x91\x5c\xb7\xc7\xa3\x4f\x18\xb8\xf1\x75\x15\x3d\xc3\xb1\x0d\xba\xed\x5c\x6b\xba\x48\x07\x9e\x37\x64\xd2\xc0\x9b\x39\x40\x2d\x8e\xff\x1d\x3e\x56\xfc\x77\xcb\xc1\xb3\x8e\x70\xf3\x78\x2b\xf6\x79\x5a\xb9\x0e\x62\xf9\x15\x81\xf1\xed\x8e\xa3\xab\xf1\xb4\xcd\x44\xb9\xfe\x80\x33\x2b\x6d\xed\xf6\x63\xd7\x5e\xe4\x50\xb4\xf3\x71\x43\x57\x18\xd8\x69\x6b\x18\x8e\xde\x24\x85\xa2\xda\x75\x15\xfb\x71\xe5\x1b\x77\xe7\xab\xcb\xe5\xdd\xb8\x23\x4c\xe7\xa8\xd7\x06\xeb\xde\x5f\xdd\xde\xe9\xda\x5c\xa1\x13\x60\x5d\xd9\x92\x2e\xbf\x2f\xdf\x8b\x15\x23\xec\xc7\xdf\x7e\xe4\xb5\x0f\xd6\x65\xaa\xfb\x7a\x3d\xf2\xea\x43\xe7\x37\x19\x97\xcd\xee\xce\xe1\xc8\x60\x5b\xe3\x4f\x15\x74\xee\xba\x1f\xda\xf9\xbb\xaa\x7b\x27\xd7\xfd\x0a\xb8\x7d\x64\xce\xf8\xda\x36\x97\xfe\xe4\xd2\xdf\xd5\xa7\x3c\xf0\x30\xe0\x14\xaf\x02\x73\x43\x4e\x52\xdf\x8c\x5b\x21\xf2\xc5\xdf\x78\x6c\x25\x03\x17\xff\xed\x79\x9e\x2d\xb2\x81\x1f\x1a\xe3\xea\x6f\x9b\xdc\xbe\xbc\xd2\xdd\xc4\xe1\x2a\x7a\x93\x50\xa6\xcf\xfd\xd6\xf9\x0d\xf6\xb7\x6d\x8a\x79\x7e\x73\x78\xf1\xc8\xc0\x5c\xf2\x26\xaa\x7d\xe0\xcd\x3d\x6f\x32\x29\xe6\x65\xaa\xe3\xc0\x5c\xf8\x23\xf4\xa3\x53\x1a\xce\x3f\x99\x5a\xdc\x7b\x0b\xba\xb6\x38\xb2\x84\x9a\x71\xb2\x1b\xfe\xfd\x07\xab\xd8\x7a\x8e\xbd\xd0\x7d\xda\xb7\xea\x7e\xef\x57\xb3\x43\x9d\x7e\x4a\xc6\xf8\x01\x52\xa2\xda\x95\x4b\xcf\x01\xf3\x2f\x60\xdc\x3a\xb4\x03\xbf\x75\xae\x5c\x1d\x70\x08\xb8\xaf\x98\x08\xf4\x92\x1c\x08\x80\x23\x70\xaf\x84\x59\x56\x9f\x84\x95\xb8\x4a\x3c\x2e\x8f\xe5\x77\x75\x33\x38\x01\x97\x2b\x34\xe4\xbd\xdd\xf2\xa4\xb1\xae\xf4\xb1\x02\xaf\x33\xfd\xad\x8d\x75\x93\x5b\x1b\xeb\x6a\x5b\x5a\x1b\xff\x1b\x43\x0d\x28\x13\xa9\x1a\x7e\x82\x82\x17\x5e\x7f\xc1\x8a\x4b\x56\xdc\x7c\xe5\x05\x2b\xce\x5f\x71\xf3\x9d\xe7\xc8\xf7\xcb\xf0\x07\x8f\xd7\x47\x36\x36\x37\xdf\xb3\xa8\xed\xf1\x1f\xf6\xf6\xf6\xf6\xfe\x2f\x3a\xe2\xb1\x48\xf3\xd5\x7d\x70\xea\x46\xe3\x9f\x83\x9f\xec\x5a\xb3\x6b\xd7\x9a\x63\x2f\x5c\x4e\x2f\x5d\xc4\x34\x5e\xb8\xb8\x6e\xd1\xd2\xd3\x6f\xba\x6a\x17\x49\xab\x07\x65\x95\x4c\xed\x6e\x5b\x7a\xfb\x65\x6d\x1f\xcc\xbf\xfc\xf6\x6b\xe7\x7f\xb2\x0c\x7d\x0f\xbd\xdd\x0e\x1b\x7d\xdf\x8f\x71\x5c\x9c\xe6\x38\x41\x4e\x49\x99\x64\x5a\xe6\x7c\xe1\x78\x8c\x1f\x1d\x49\xa5\xd0\x48\x26\x83\x72\x69\x5f\x1b\x5c\x84\xbe\xff\x22\x5a\x75\xd9\x33\xf3\x67\xea\xef\xdf\xbd\x7c\xd2\x8b\x93\xae\x86\xfd\x33\x9a\xb7\xcd\x98\x09\xdf\x72\xe3\xae\x15\x27\x5f\xec\xb2\x9f\xd7\x3a\xb4\xdc\xbe\xbd\x6f\x1e\x98\xbf\x94\x01\xd4\xa2\x97\x76\x5f\x58\x98\xdf\xc0\xac\x71\xc7\x37\xba\x2f\x06\x95\x79\x8c\x0e\xfd\x74\x91\xd5\xf1\xa3\xcb\x7d\x37\x03\xeb\x99\x9b\x4e\xab\xe0\x01\x98\x1e\xd4\xf7\xab\xe8\xa5\xc6\xf9\x7b\x73\xc7\xb8\x52\xde\x68\x1e\x84\xa2\xeb\x61\x04\x50\x8b\x9e\x7a\xe6\x34\xff\xec\xc2\x82\x2c\x38\xcc\x5e\x97\xd5\x9d\xd8\xae\xac\x78\x36\xb8\x0c\x5c\x09\xae\x05\xa0\xbc\xbc\x2c\xb4\x3a\xb7\x4e\x6e\xa9\x35\x4e\xde\xfe\x7c\xab\xef\xae\xd6\xed\x5c\x36\x06\xa7\xc2\x7a\x6b\xba\xba\x9a\xec\x53\x68\xe2\xa9\xa7\xa0\x1f\x4d\x18\x1f\xdf\x6b\xca\x41\x4d\x55\x53\x29\x48\x6b\x1a\x8c\x6b\xda\x41\xad\x6a\x60\x80\x2c\xb0\x6c\x8c\x89\xb0\x91\x08\x1a\xa7\x78\x91\x97\x21\x28\x02\xe3\x43\xb6\x15\x52\xec\x7d\xbe\x27\xd0\x0f\x5e\x43\x35\x2f\xeb\x7f\xd4\xd3\x8a\x42\x70\x7a\x1a\x0e\x23\xc6\xfc\xf8\x84\x6f\x09\x13\xc0\x41\x1d\x70\x5c\x58\x0e\xc7\xe5\x61\x55\x54\x61\x02\x26\xc6\x93\x48\x4d\xd2\xdf\xa2\x4f\xe5\x9c\xf3\x95\x4b\xf1\xd4\x9e\x6c\xae\x64\x0b\xe3\xfe\x4e\xfd\x27\x56\x9c\x17\x7e\xbe\xa7\x3c\x6f\xc5\x63\x43\x0d\xa0\x72\xf9\xb2\xf6\x64\x50\x99\x97\xef\xdc\x1f\xd8\x3b\xdf\xe5\x8f\x30\x63\x17\xa6\x3f\xe2\x3d\x8f\xdf\xaf\x84\x87\x9b\x5c\x78\x82\x75\x84\xae\x1e\xfc\xfc\x6f\xca\x75\x04\xad\xcf\xd8\xb3\xb6\x1b\x78\x73\x07\x5c\x77\xf1\x37\xe3\x7c\x19\x70\x28\x60\x8b\xa7\x06\x76\x91\x1c\xee\x71\x7f\x3c\x38\x11\x44\xad\x6a\xbe\xd7\x83\x5b\x9d\x7a\xf1\x2d\x4e\x97\xfb\xfa\x40\xd4\x67\x76\x48\xb2\xeb\x4d\xe2\x06\xcb\x1e\xac\xa9\x6b\xac\xf5\xb7\x36\xd4\xe1\x4f\x3d\xf9\xad\x61\x0b\x7f\x73\xa4\x94\x72\x4a\xe6\x98\x98\x18\x61\x10\x3f\x1a\x94\x83\x30\x8e\xf2\xdc\xa8\x90\x12\x62\x39\x71\x2c\x92\xd3\x23\x44\x52\x97\x65\xdc\xbd\x9c\x47\x1a\x11\x61\x59\x86\x0f\x0b\xb1\x18\x62\x15\x82\x45\x2c\xcc\x20\xb6\xe6\xf1\x25\xff\x41\xef\x12\x2d\xfa\x2f\x88\xbd\xfa\x25\x17\xbf\xf8\xe0\xf5\xe1\x07\x1e\xbc\x58\x3f\x8b\x78\x4d\xff\x39\x71\xa6\xfe\x41\x8c\xb8\x8a\xf8\xea\x60\x30\x25\x6b\x7e\x6d\xfe\x85\xf3\xce\x3d\x77\xcb\x55\x0f\x7e\xe7\xc6\xd5\xe8\xa7\x4f\xdd\xfd\x20\x24\xb3\x07\x6e\xdd\x0a\x4f\x85\x57\xa2\xa1\x6c\xf3\xd6\x19\xbb\xd0\x7d\xf3\xe6\x4f\xba\x75\xd2\x09\xf5\xaf\x10\xc7\xac\x8e\x46\x9f\x3e\xed\xb4\xf1\x1b\x8f\x39\xe2\xb2\x9b\xb9\x1b\x6f\xe0\xce\x3e\xea\xbe\xa3\x5b\x97\xdd\xc8\xdd\xcc\x1d\x79\x63\xcd\x2d\x8a\xce\xeb\x23\x28\xc1\xc1\x34\x11\xf4\x05\xab\xea\x6a\xea\x37\xc8\x91\x4e\x7c\x7a\xbf\xae\xf4\x3d\x51\xe4\x26\xdc\x8f\x05\x04\xec\xdf\x80\xd3\x40\x2b\x58\x0e\xae\x00\x57\x83\xeb\x80\x04\x00\x6c\x69\x6d\x31\xcb\x84\x39\x7d\x2a\xcc\xe2\xe4\x38\x5b\x06\x17\x5d\x6e\x2e\x55\xa5\x6e\x6d\xb4\xe2\x3e\xff\x6f\xb2\xa2\x6a\xe4\x90\x1a\x55\x72\x39\x48\x05\x95\x20\xe4\x51\x8a\x8a\x31\x31\x99\x13\xe9\x78\x90\x92\xc3\x1c\x2d\x26\x12\x22\x23\x25\xd8\x88\xce\xc0\xf0\xa8\x2f\xcd\x33\x52\x9c\x2f\x64\x9f\x0a\x37\x6c\x8b\x9d\xf4\xc0\x79\xb3\x9f\xfa\xe9\x9e\x3d\x7b\xf6\xfc\x4a\xff\xea\xe9\x86\xd8\xf5\x03\x30\xba\xcd\xf8\x47\xaf\xaf\xca\x3f\xfc\xa3\xaa\x2a\x4b\xc3\xa3\x63\x19\x19\x0d\xa3\x6c\x16\x46\x68\x14\xc3\x79\x3e\x63\x72\x5e\x4e\x24\x85\x34\x64\x88\x98\x2c\x8d\x89\x12\x2b\x89\x48\x9a\x76\xfe\x92\xe9\x67\x2e\x59\x72\xdd\x77\x7b\xee\xeb\xbb\xa3\xf7\xe1\x25\xc4\xc7\xd3\xa7\x5d\x91\xfd\x7e\x4f\x0f\xfa\xa8\xaf\x0f\x7d\xde\x5b\x33\xe5\xbf\xc5\x1e\x4d\x3f\x8b\x1c\x8a\xf6\xdc\x5c\x45\x3f\x30\xf8\x43\x79\x7c\x86\x71\xd7\x26\xd9\x81\xa5\x40\xe7\xaf\xaa\xd9\x52\x9d\xff\x57\x2e\x03\x2c\x1d\xf0\x5d\x8f\xcc\x50\x42\x51\xcd\x95\x97\x0b\x6a\xec\x7b\xa1\x60\x1a\x98\x03\xae\x75\x7a\x25\x35\xd4\xce\x6c\x6b\x6c\xb5\x70\xc1\x30\xc2\x6a\x1b\x5b\xc9\x40\xb3\xab\x56\xac\xd9\x80\xd8\xfb\x54\xd4\xb0\xfb\xbf\x8d\x2e\x4f\x0c\x34\x47\xfe\x9b\xae\xe0\x8f\xd3\x11\x38\x3e\x91\x4b\x70\x92\x2a\xcb\x22\x1b\x67\x38\x99\xe6\x68\x55\x56\x08\x2a\x1c\x23\x80\xc4\x26\x13\x0a\x9b\xcc\x48\xc3\x12\x2b\x27\xc4\xd0\x59\xfb\xde\x85\xeb\xd0\xcd\xf0\x73\x34\xf9\xac\xf6\x6b\xb8\x29\xd7\xae\x6c\x42\x27\xc2\x8f\xd0\x5d\xf0\xb9\x1d\x3f\x6a\x82\xbd\x13\xa7\x7c\x83\x3d\x2f\x71\xbc\x8c\x28\x5e\x4d\x0a\x42\x92\x65\xf8\x24\xca\x8d\x89\x02\x13\x47\x00\x89\x1c\x54\x61\x8e\x18\x61\x69\x5d\x43\xc3\x30\xae\x4a\xbc\x94\x4a\xf2\x7c\x52\x96\x44\xf9\xc9\x07\xa8\xe0\xcd\x0f\xdc\xfc\xc0\xea\x2b\x2e\x0a\x3f\x15\x9e\x65\xfc\xef\x75\xc1\x47\x89\xbb\xfe\x7f\xc4\x0b\x15\x97\x0d\xf0\x8e\x4b\x77\x96\x4b\x67\xdc\x8b\xbb\xe7\x75\x66\x1d\x7c\xc9\x18\x67\xd6\x73\x53\x15\x7f\xb9\xf3\x9b\xed\x7b\x3b\xf2\x21\xd2\xe0\xca\x55\x78\xc4\x82\xaa\x7e\x79\xb2\xf3\x97\x1e\x7c\x51\x42\xd1\x0d\x6f\x54\xbc\xc3\xf4\xb1\x1f\x70\xbc\x43\x25\xbf\x6e\x29\x7f\xf0\x8a\xea\xb6\x9c\x65\xcb\xbc\xed\xd4\xbc\x37\x78\x4d\x08\x9c\x04\x16\x80\x8b\x81\x00\x9e\x31\xfd\x49\x66\xdf\xa1\x66\xd3\x69\x54\x3f\xd3\x6f\x33\x1f\x3c\x5e\x67\x63\xd8\x34\x17\x86\x35\x3b\x78\xe7\xaf\xf7\xf4\x11\x36\xfd\x00\x76\xa4\x1a\xe7\x7d\x35\x60\xef\x53\x83\xbf\xfe\xdb\x91\x92\x6c\x6c\x8e\xd4\x48\x22\xcd\x32\x34\xc7\xb2\x39\x96\xe3\x58\x8e\x13\x12\x6c\x81\xcb\x2b\xa9\x54\x92\xe3\x68\x46\xe1\x92\xbc\xc6\x65\x6a\x92\xa3\x72\x6e\x44\x15\xf9\x04\x2f\xb3\x82\xa0\x72\x69\xc4\xaa\x0c\x2d\xd2\x2c\xcb\x70\x2c\x27\x88\x6c\x22\x41\xb3\xba\x48\x28\x74\x5c\xa6\x28\x5f\x1a\xc5\xb3\x90\x62\x91\x32\x8a\x12\xa3\x88\x66\x61\x42\x43\xe1\x1a\x95\x49\x4a\x04\xa5\xe7\x7d\xe1\xc2\x18\x27\x25\xb8\x88\xc0\xc7\x0b\x79\x1f\x85\x00\x01\x38\x3e\x06\xc3\xa4\x44\xd3\x74\x24\x26\xd0\x31\x51\x8c\xc4\xe2\x11\x2e\x16\x8f\x2b\xc3\xc3\x52\x84\x63\x93\x1c\x3d\x0e\x63\xb2\x28\x24\x15\x39\x93\x91\x44\x51\x4a\xf2\x68\x14\x46\x24\x41\x48\x2a\x31\x3e\x4e\x33\x34\x4d\xd3\x3c\x4b\x33\xb4\x18\x61\x62\x31\x24\xc7\x69\x26\x4c\xc9\x12\xa3\x88\xa3\xb9\xa4\xc4\x8b\x71\x31\x4c\xb1\x52\x42\x4a\x88\x5c\x58\x8d\xb0\x8c\x94\x90\xe8\x60\xd2\x6d\x5b\x3a\xbd\x1a\x1d\x5c\xd8\x84\xe3\x2d\xf7\x86\xa2\xda\xc9\x26\x2e\xcc\xff\xd2\xab\xb7\x5a\x38\xfd\x8b\x72\xbb\x6f\xc3\x48\x15\x3b\xd8\xc0\xa9\x7e\xdc\x6b\xdd\xc9\xd4\xf7\x7c\x87\x6b\x55\xa5\xef\x2f\xfb\x0e\xcf\xb7\xf1\x19\x17\xef\x3a\x14\x24\x8a\x27\x04\x7e\x44\xca\x38\x3f\xd4\xd6\x32\x5a\xc0\x79\xe0\x46\xf0\x18\xb6\x6c\xea\x5c\xe5\xad\xb1\x57\xd2\xec\xda\x78\x1c\xb4\x7c\x41\x2d\x75\x2d\xad\xd0\x4a\xfb\x33\x74\xda\xba\xb6\x16\xf3\x6f\xb8\x83\x9b\xd5\xc1\x26\xda\x3a\xd9\xc0\x39\xbf\x99\x14\xd8\xea\x6f\x6e\x9a\x66\xe6\x4c\x4c\xa9\x0f\x34\xfd\x57\xc3\x47\x42\x32\x64\x0b\xd4\x58\x32\x0b\xf3\x71\x89\x8e\x05\x87\x95\x91\x91\x11\x98\x18\x56\x32\xba\x20\x09\x91\xb4\xca\x48\x10\xd0\x8a\x9a\x4c\xa4\x33\xb1\x84\x18\xa3\x92\x14\x37\x9c\x49\xcc\xe9\xdc\x87\x3e\xbd\x01\x12\xaf\xa2\x76\xa2\x06\x3d\x3b\x0f\xfe\x12\xbe\x71\x29\xba\x9c\xa8\x41\xd7\xfc\xec\xe0\x25\xe8\xcb\x83\xe1\x6f\x70\x24\xe5\x65\x01\x8d\x70\x7a\x0e\x05\x79\x98\x26\x28\x22\xc9\x24\x58\x2e\x2f\x08\x82\x90\xe5\x8d\x7f\x90\x20\x45\x22\x42\x3c\xc2\x40\x9e\x11\x52\x89\x08\xcd\x73\xe1\x70\x84\x0a\x0b\x11\x99\xa5\x19\xfd\x43\xb4\x1b\x5e\xdd\x2f\x3e\xbc\x64\xcd\x9a\x2b\xa6\xdc\x37\xe9\x78\xe1\xf8\xeb\xd6\x7c\xb7\xf5\x25\xde\xdf\xfe\x5f\xf9\x9b\x95\x3f\xdc\x5d\x79\xef\xe3\x25\xc3\x5e\xed\x1b\x5a\x7e\xc8\xdc\xa3\x16\x6c\xf1\xd4\x37\xa4\xdd\x76\xc9\xc6\x27\x29\x40\x05\x7a\xd7\xc0\x8f\x5d\xf8\xe2\xce\x41\xf8\x79\x79\xcc\xce\xe2\x65\xee\x7b\x59\xc3\x98\x07\xfd\xaa\x8a\x5d\x64\xe0\xd6\xae\x0a\x7c\x4c\xbb\xf0\xf7\xad\x6a\xfa\x71\x88\x54\x0a\x1e\x3f\x47\xc9\xff\xf1\x0e\x28\x8b\xc1\x5a\xeb\x71\xdb\xe3\xe6\x7d\xb6\xfb\x2a\x60\xe2\xd2\xbf\x77\xed\x75\xad\xc7\x8c\xed\xad\xa8\xa2\x1f\x94\x64\xc7\x88\xc7\x7e\x90\x43\xd1\xcd\x3b\x2b\x78\xb7\xe2\x8a\x45\xdb\x79\x00\x37\x15\x17\x1b\xf3\x53\xed\x83\xab\x8f\x2f\xce\x7d\x6c\xc1\x3b\x21\x72\xdd\x4f\xa9\xd2\xde\xdc\x30\x7d\xc3\xf5\x0e\xd7\xdd\xf6\xce\x9f\x95\xfb\xcd\x7a\x3a\x2a\x6c\x4d\x15\xf7\x9c\x5f\x7d\x84\xbf\x75\xc2\x78\x47\x17\xee\xbf\x09\x0e\x03\x89\x62\x63\x60\x27\xf9\xb4\xab\x7a\x7f\x33\x58\x84\xbd\xbd\x02\xb8\xbd\x82\x62\xcd\x40\x82\x61\x79\x3a\x24\x8b\xdb\xb0\xb6\x4e\x6b\xf9\xb6\x64\xef\x46\xbf\x63\xae\xd6\x36\xf8\xeb\x03\x56\x12\x9b\xa5\xac\x34\xb4\x06\x9a\x9b\xac\x7e\x77\x3b\xd1\xa3\x70\xc9\xc4\xe7\xb7\xae\x58\x41\xc0\xc3\x42\xb7\x1d\x7b\xf8\xf2\x22\xe8\x98\x98\x98\x80\xd7\x43\xd0\xf1\xc7\xaf\xc5\x2f\x3a\xdf\x7a\xeb\x9a\x6b\xea\x56\xde\x7a\xde\x65\xed\x97\x1d\x77\xcd\xca\xa6\xd1\x16\x38\xf9\x0b\x72\x94\xd7\x43\x3c\x4f\x7c\xa1\x87\x88\x1b\xa2\x7f\x86\x53\xd0\x5f\x2f\x5f\xf1\xc4\xec\x67\x2e\xfb\x03\x3c\xf6\xff\x8e\x83\xc7\xec\xbd\x30\x7e\xd1\xa9\x17\x92\xa1\x27\xaf\x40\x7b\x5f\xd1\x3f\x41\xc7\x5e\x07\x37\x10\x7e\xe2\x8b\x58\xe4\xf4\x59\xcc\x1f\xae\xb8\xe2\x8a\x2b\x7e\x7b\x9d\xf1\x8f\x08\x2f\x42\xfb\xbb\xd1\x1d\x66\x16\xf8\xdb\xc9\xeb\xa6\xa6\x22\x3c\xfc\x31\xbf\x4b\x80\xef\x4f\x4c\xfc\x7e\xfe\xfc\x9a\x86\xc2\x33\x3e\xff\xe9\x57\x4f\xbb\xf7\x06\xb4\x07\x52\x2f\x5d\x7d\x03\xf7\xe8\x0d\xe2\xd4\x1b\x42\x48\xbb\xfc\xa6\xf9\x37\x5d\xee\xf6\xf9\x94\x70\xf8\x7f\xaa\xfa\x1a\xa2\x5d\xb8\x6a\x58\xe7\x4f\x5d\x32\x5c\x0a\x45\xf7\x34\x55\xd1\x2b\xd4\x50\x74\x0f\xbe\x13\xe5\x89\x51\x56\xce\xf5\x13\xaf\x2f\xd4\x7a\xff\xeb\xd5\x7d\x88\x9b\xde\x75\xc6\xe7\x05\x5e\x25\x9f\xa5\xda\xfb\xae\x49\xf8\xe7\x5d\xba\x20\x6b\x3d\xb1\x78\x7d\x1c\x3d\x02\x9a\xe9\xfe\x05\x2c\xf6\x59\x25\x8a\xad\xf8\x4e\xe1\x31\xa0\x01\xcc\x00\x67\x82\xd9\xe0\x4a\x70\x1f\x50\xc1\x26\x00\xe0\x89\x81\xba\xa3\x02\xcd\x33\xe7\x41\xdc\x14\xa0\xd6\xd4\x1e\x4c\x35\xc0\xb4\x2c\x7d\x38\x87\xd1\xcc\x0d\x6a\x86\x35\xee\xe6\x9c\xdf\xce\xaf\x71\xc3\x37\x27\xca\x65\x88\x85\x40\xdd\x51\x64\xa0\x79\x3e\x9c\x07\x9b\xa6\xd5\x07\x42\xf5\x01\xc2\xe7\x3c\x51\xfe\x80\xe9\x44\xab\x79\xf3\xe4\x33\x7a\x97\x4b\x70\xf9\x3f\x97\xae\x7d\xe5\xfe\xe3\x1a\xef\xbc\xba\x31\x19\x3c\xf2\xaa\x1b\x97\xc2\xa6\x3b\x97\xdd\xb2\xf8\xfe\xe5\xf1\x08\xfc\xa2\xab\xf0\x74\x17\x41\x32\xf0\x34\x50\x7c\x4f\x78\xef\x2b\xf4\x8e\xf8\xf2\x57\xfc\xa7\x3a\xac\xce\xd5\x6b\x1a\x66\xb5\xaf\xa2\xa7\x4f\x5f\x36\xab\x79\xd9\x61\xe4\xf2\x95\x33\x2e\x6d\x59\xb6\x8c\x9e\x0f\x29\xe2\xef\xb3\x66\xc5\x7a\x97\x0c\xce\x58\x38\xfd\xc4\x19\x1c\x7d\xe2\xf2\xc3\x96\x5c\x3a\x63\xe5\x89\x2d\xcb\x4e\x3c\x16\x46\xd0\xdc\xe5\xf4\xa5\xb3\x96\xd5\x9c\x56\x73\xfb\xeb\xdb\xce\x5c\xb7\xe1\x95\x9a\xe9\xe7\x4f\x39\x12\xbd\xd0\x7a\x6a\x2c\xd4\x7e\xf3\x94\xc6\x13\x4e\x6d\x3c\x15\x3e\x79\xf3\x77\x1a\x6f\x6f\x27\x9e\x65\x97\xe9\x8f\x3e\x09\x6b\x6e\x45\x85\xcb\x1e\x5c\xf9\xe8\x35\xec\xb2\x47\xb9\xdb\x98\x8b\xbe\x8d\xe9\xeb\x1f\x2c\x89\xd4\xeb\xbf\x9e\x52\xbf\xf4\xd8\xcb\x57\x1e\x5b\x5f\x3f\xa3\xa9\x89\xb8\xf2\xd0\xae\xbf\xfe\xec\xe2\xb6\xb6\x1f\xfe\xf5\xad\x63\xcf\x58\x7a\x08\xba\xe1\xaf\x4b\xe1\xa1\x70\xf0\x48\xfd\x8d\xc9\x53\x56\x1e\xcb\x27\x23\x2d\x27\x37\x35\x11\x77\x9a\x4f\x31\xfb\xbf\x78\xab\xfe\xc5\xe7\xb6\x47\xf6\x3d\x55\xd2\x2d\x4d\x7e\xb6\xa3\x4a\xbc\x52\x71\xfc\x15\x6a\x75\x7f\x74\xdf\x3f\x9c\xf1\xb8\x1b\xf7\xba\x36\x96\xeb\x25\x16\xae\xfe\xb8\xaa\x9d\x45\xbe\x84\xfd\xdd\x80\xc0\x3d\xcd\x64\x32\x09\x8e\x03\x27\xba\x3a\x09\x34\xd4\x11\x7e\x1c\xdc\xc4\xbd\xa8\x9a\x7c\x8d\xf8\x66\x5d\xc8\xdf\x34\x59\xf1\x85\x35\x5f\xac\x90\x23\x44\x0d\x65\x60\x04\xaa\x0c\x8a\xa3\x14\x92\x51\x30\x06\x73\x30\x8e\x46\x87\x25\x22\x59\x18\x83\x23\x59\x18\x84\xb4\xea\x17\x61\x10\x8d\xab\x68\x44\x46\xd2\xa8\xc4\xa6\xd9\x91\x11\x46\x89\xa7\xb2\x50\x56\x21\x8d\xe2\x48\x55\x47\x20\x6d\xac\xef\x92\xe2\xa4\xc0\xd3\xe4\x82\x50\xb4\x7f\xc9\xc4\x1b\xd4\xe2\xa1\x9e\xe2\x85\xe0\xa9\x05\xb3\xe9\x3a\xa7\x2e\x60\x32\x14\x1d\xb8\x17\xd7\xa5\xb6\x63\xce\xa2\x13\xdb\xc3\xf7\xe9\x7a\x56\x96\xf3\xed\xfe\x25\x18\x06\xc3\xd6\x5e\x33\xc5\x78\x80\x23\x25\x30\x15\x77\x67\xa8\xb6\xd3\xa8\xb1\xd3\x40\xa8\xbe\x69\xb2\x4f\xd4\x88\x51\x3d\x42\xc8\x23\x28\x07\x29\x63\x9b\x0c\x1a\x46\x69\xc4\x25\x60\x0a\x46\xf2\x69\x89\xa0\xc6\x52\x63\x30\xac\x92\x12\x1a\x53\xd1\x68\x12\x89\x39\x95\x4d\xb3\xb9\x2c\x9f\x4a\x68\x39\x28\xaa\x2a\x1a\x49\x8f\xc0\x08\x20\x20\x28\x32\xe4\x28\x99\x04\x61\x70\x82\x69\x13\x34\xd4\x35\x12\x70\x8a\x13\x3c\xc6\x7e\x21\x50\x1f\xf2\xcf\x0c\xb5\x35\x10\xaa\x16\x8b\xfb\xc6\x72\x2c\xca\xe5\xa1\x98\x44\x69\x34\x3e\x8e\x64\x11\x8a\xf9\x7c\x9a\xa6\x25\x18\x8e\x67\x20\x50\xd4\x98\x9e\x20\x93\x71\x45\x51\xf5\x3c\x4a\x65\x54\x55\xcb\x8d\x29\xb2\x9c\xcd\xc1\x08\xcf\xf2\x50\x4d\xa1\xf4\x68\x06\xf2\x66\x8e\x45\xd6\xa9\x81\x81\x65\xf4\x3e\xfb\xce\x81\x93\x43\xb2\x7f\x92\x31\x3e\x74\xbf\x27\x66\x62\xc0\x0f\xe7\x7d\x18\xbf\xc2\xe3\x8a\x33\xcf\xbd\xa5\x71\x50\x03\x54\x73\x1c\xf8\x40\x08\x9c\x02\x4e\x07\x60\x72\x4b\x6d\xa3\xaf\xa1\xb6\xa1\xb6\xc9\x6a\x14\x5b\xdb\x50\xd6\x11\xdc\xd9\x76\xa8\x3e\x54\x1f\x9a\xdc\x30\x90\x4e\x1f\x43\xa4\x50\x04\x82\x91\x70\x1e\x65\x38\x38\x8a\x80\x2f\xaf\x85\x63\x44\x4a\xa2\x47\x52\xf9\x64\x2e\x95\x46\xe3\x22\xa4\x52\x4a\x32\x16\x93\x86\xf9\xa4\xa6\xc6\x51\xc2\x2f\x4d\x40\xff\x13\x85\xbc\x4e\x27\x12\x6a\x92\xe7\x7c\x59\x38\x0a\x83\x18\x2c\x63\x28\x33\xac\xaa\x6a\x36\xa7\xc8\xca\xe8\x08\xa4\x12\x2c\x0f\x65\x11\x65\x46\x61\x04\xa6\x4b\xfb\xc7\x32\x62\x3f\xf6\x4d\xf6\xd8\x79\x40\xeb\xcc\xfd\x50\xed\x83\x4f\xd2\x85\xd9\xe7\x32\x9d\x21\x72\x60\x07\x70\xff\xc6\xd0\x5f\x4e\xc5\x7a\x8d\x5a\x9e\x87\xb0\x0b\x57\xb6\x73\x9e\x77\x60\xd9\x73\x83\x67\x3c\x65\xc3\x5e\x5b\x81\xf3\x22\x6c\xd8\xcb\xb6\x6f\xa3\x0f\x7b\x20\x77\xd9\x35\x21\x5b\x8a\xb3\x03\x3f\x21\x6f\xa4\xda\x0f\x2c\xfb\xfc\xdf\xf3\x37\x2c\xb8\x9b\x5a\x3c\x74\x1f\x78\xbd\xf8\xf5\xec\x35\x0b\xee\x75\xcf\x37\x88\xeb\xae\xec\xb2\xfb\x81\x2f\x29\x2e\x08\x7c\x8f\xfc\x0e\xd5\xbe\xf1\x82\xfc\xd7\xec\xa2\xb3\x22\xd4\xa2\xa1\xfb\x3f\x29\x9e\xd5\xbb\xe0\x5d\x2f\x0e\x0c\x61\x6b\x64\xfd\xfc\x72\x7d\xaf\xaf\xcf\x18\xdf\x6d\xdf\x21\x9d\x53\xa4\x71\x1f\xad\xf6\x6d\xa9\x4f\xfe\x39\x87\x60\xae\xa2\x16\x0d\xec\xb8\xcd\x3f\xef\x9f\x8c\x1d\xaf\xf2\xcc\xb7\xab\xb2\xe6\x3c\x1e\xdf\x13\xf6\xc8\x50\x31\x14\x5d\x8f\xab\x24\x74\xd9\xf7\x1e\x6e\x28\x9e\x12\x78\x8f\x6c\xa7\x3a\x06\xae\xd4\x89\xe2\xdf\xe7\xbd\xbb\xa0\xd7\x78\x53\xe2\xb3\xf9\x5b\x18\xcf\xba\x77\x3d\xe4\xc1\x5d\x47\x0f\x1e\xc4\x3a\x5b\x5f\x5f\x39\xaf\x18\xc0\x7c\xb7\xf3\x35\x47\x97\xb3\x7d\x09\x29\x1c\xc7\xb0\xef\xef\xac\x2c\x32\x81\x2d\xe4\x6a\xaa\x63\xf0\x55\xf0\x28\x20\xe7\xbc\xc6\x4c\xa7\x16\x6f\x7a\x46\xff\x6e\xb1\x38\xe7\xe1\x05\x9a\x37\x4e\x39\x78\x9d\xe7\x6c\x39\xc7\x7f\xde\x02\x40\xa8\xb9\xfb\x80\xae\xe1\x33\xbe\x1b\x94\x60\x84\xd7\xb2\xe3\xfb\x15\xb8\xe2\x3a\xc3\x9e\xeb\xcb\x9f\x37\xd7\xde\xdb\x59\x8e\x5b\x43\xf7\x78\xe6\x29\x9d\x69\xd2\x03\x1b\xce\x3b\x4f\xf7\x86\xf2\xf5\x76\xcf\xf0\xcc\x73\x65\xf1\x98\xc0\xbb\xe4\x55\x54\xc7\x8e\x97\x0b\x5f\x15\xdf\x5b\x90\x66\xa6\x1b\x67\xf0\xd0\x07\xf3\x16\x32\xd3\xdd\x71\x82\x6e\x7c\x2f\xd4\xa0\x08\x17\x0e\xc8\xa1\xe8\xf6\x63\x3d\x30\x75\x70\x74\x1f\xc6\xed\x41\xfb\x0c\x54\x67\xdf\x07\x3c\xe3\x17\x17\xe7\x19\xf3\x53\x1d\xdb\x65\x74\x2a\x20\xe6\x5e\x31\xff\x0b\x13\x8a\xc5\x22\x38\xa3\x78\x55\xa0\x97\xbc\x96\x6a\xdf\xce\x5d\xd7\x38\x77\xcf\xbc\x5d\xd4\xe2\xa1\x97\xf5\x5d\xe0\xa8\x59\x93\x16\x64\x8b\x45\xf0\x1d\xe7\xbe\xdf\x67\x00\x84\x02\x3b\x0e\xd3\x7d\xe0\x50\x37\xcc\x2c\x3c\x78\xb5\x9c\xae\xbb\xd6\x95\x9d\xa5\x4d\x8f\x98\x0e\xd2\x1b\x1d\x7c\xb2\x7c\x44\xdb\x71\x1f\xfc\xed\x76\xfd\x88\xa4\x5d\x3f\xa2\xc7\x8b\x13\xa2\x7b\x3d\x2e\x59\xe5\xf0\x20\x73\x3d\x3d\x3c\xe6\xa9\x24\x90\x8b\xe7\x06\x86\xc8\x87\x80\x1f\x1c\x06\xa6\x82\x36\xb0\x14\x5c\x6a\xc5\x14\x4e\xf3\x36\x44\x34\xfd\x41\x93\x2b\x3b\x0c\xb5\xe2\x24\x92\x3a\x32\x50\x37\x13\xd6\xfb\x5c\xbc\xd7\xec\x27\xe8\xb0\x5e\xe2\x99\x39\x75\x4f\x1d\xd7\xf2\xd3\x6b\xe6\xac\x9a\x7d\xad\xef\x97\x4f\xeb\x87\x3f\x45\x48\x97\xcf\xd6\x58\xee\x40\x78\xd8\x30\xa8\x13\x14\xcb\x33\x48\x8c\xc0\x74\x32\x81\xe2\x84\x2c\x48\x59\xf8\xfe\x33\xf3\xe1\x07\x97\x35\xbf\x74\xcf\xb6\x7b\x1e\xbb\xe7\x9e\xc1\x95\x3f\xb9\x67\xe5\x65\xa7\x3d\x34\xb8\x74\xe9\xca\x95\x11\xf4\x29\x29\xc8\xbb\xe3\xbb\x9e\xa4\x1e\xe9\x66\x3b\x1f\x41\x6f\xa3\x67\xff\xfa\x4f\xf8\xe0\x2b\x6f\xd2\xaf\x74\xea\x27\xc8\xb1\x30\x1a\x61\xd9\xb0\x12\x8e\x40\x10\x57\xe3\x32\xcf\xcb\xaa\x9c\x8c\x85\x6b\x32\x71\x34\xaa\xea\x39\x34\x32\xac\x29\xca\xf0\x88\x2c\x2b\xa3\x59\x18\x16\x04\x28\x2b\x28\x33\x66\x08\x61\x77\x7d\xd1\xa1\x41\x0f\x6e\x09\x8e\xef\xcf\x3c\xd7\x1f\x55\xa7\xa9\xce\x1f\x7a\xe8\xde\x19\xdf\x66\xd7\xb6\xba\xb9\xc8\x04\xfa\x49\x29\xd4\xbc\xed\x7a\x3d\x84\x6f\x47\x7f\x76\xb4\x31\x9e\x76\xce\xcf\xec\xbd\xf7\x99\xe7\xbc\x4b\xf8\xf4\x03\x67\x3d\xf3\x03\x57\x62\xd9\xba\x0a\xf7\x63\x79\xd0\x9c\xeb\xf5\x2f\x2d\x5e\x84\xe7\xd2\x1e\xf7\xcc\x25\x3a\x6b\xc2\xf7\x2d\x7a\xae\x75\xe6\x12\xcc\xe7\x37\x60\x79\xdc\xf9\x7d\xd7\xbb\x31\x9d\x59\xcf\x5f\xe3\x91\xd3\x52\x28\xda\xff\xf7\x52\xfc\xae\x3f\x6f\xc5\xcb\xec\xdf\x98\xf0\x78\xc5\x63\xf7\x27\x43\xd1\x8d\xe3\x1e\x1a\x14\xcb\xe0\x97\x71\xc9\x29\x17\x3e\x1f\xb8\xc5\x89\xb9\xd0\x01\x85\x54\xc1\x71\xa0\x11\xf7\xb5\x5c\x8c\xf3\xeb\xcc\xdb\x10\x56\x9d\xa7\xa3\x1a\xb1\xe6\x83\xaf\xa0\xd6\x35\x1a\xc6\x6a\xa0\x61\x66\x5b\x03\x69\x68\x0c\x01\x7c\x2f\x6b\x4a\x49\x21\x33\xdb\xc4\x36\x4c\x76\xf7\x4c\x9d\x0f\xdb\x1a\xa6\x10\x59\x91\xf1\x01\x96\x81\x69\x55\x1f\x09\xc2\x4c\x1c\x8d\x17\x81\x9a\x8f\x43\x90\xd4\xf3\x2a\x1f\x83\x92\xe0\xa3\x59\x5a\x8f\xf1\xc3\x7e\xb5\x40\x73\x35\xc2\xa8\xa0\x8d\x43\x3e\x86\x58\x24\xa3\x61\x3d\xcb\x42\x19\x86\x33\xb2\x92\x4c\xc0\xe0\x30\xca\xab\x35\xc2\x84\xf3\x21\x04\x4d\x64\xf4\xe0\x08\xa9\xb2\x71\x81\x89\xa1\x5c\x3a\xc8\x89\x6c\x9c\x8b\x25\x23\xf1\x54\x3e\x22\xf1\x4a\x9c\xa6\x91\xac\x0b\x4c\x32\xc9\x46\x82\x72\x90\x63\x23\x72\x30\xc6\x26\x12\xb1\x24\xab\xc1\x1c\x6b\x20\x18\x60\x11\x88\xc7\xe3\xbc\x4b\x27\x2d\xd1\xff\x0c\x0b\x8e\x37\x16\x2f\x0c\xe4\xc8\x3b\xa9\x8e\x9e\xd7\xf5\xfb\x81\x6f\xfe\xb2\x05\x8b\xa9\x45\xe9\xcf\x44\xdf\xfc\x1b\x17\xb0\x8e\xdc\x74\xce\xb8\xfb\xe4\x72\x1e\xdf\x7d\x8a\xe7\xbc\x12\x5e\x79\xba\xfe\xfc\x8a\xe7\x4f\xf2\x3c\xcf\x78\xe7\x5f\x7b\x88\x8b\xbf\xe1\xf1\xfe\xff\x60\x1c\x6d\x76\xe8\x86\x33\xed\x94\xfd\x18\x4f\x3a\x5f\x2e\xe7\x63\xe9\x31\xec\xdb\xfc\x14\xff\xea\x2f\x95\xdf\x85\xf0\x77\x21\xfc\x1d\xee\xad\x6e\xd8\x43\xa2\xa9\x93\x4f\x76\x1a\x1d\x13\x00\x27\x57\x42\x8c\x04\xc0\x77\x12\x0c\x41\x30\x59\xf2\xd1\x2c\x27\x27\x13\xbe\x20\x1a\x61\xd0\x18\x0f\x23\x30\xc7\x23\x06\xa9\x28\x8d\x28\x11\x8e\x42\x16\x65\x64\x94\x83\x39\x19\xc6\x60\x4c\xf0\xc7\x92\x22\xaf\x64\x54\x94\x45\x0c\x9d\x4b\xa5\x55\x18\x19\xcf\xa8\xa9\x31\xc8\xc0\x31\xc4\xa1\x71\x08\x60\xc6\xc5\xe3\x0d\x39\x8e\x73\x83\x77\x9f\xe0\xe2\x11\x78\xdc\x18\xa1\xc8\xce\xef\xb9\x60\xe0\x8c\x87\xc8\x6d\x9b\x41\x59\x6c\x79\xf7\xf1\x9e\x79\x4a\x75\x49\xb1\x3c\x1e\xd8\xed\x79\xfe\x91\x50\x7b\xff\x4c\x70\x08\x03\x16\x86\x42\x8b\x76\x9f\x00\x6e\x67\xc0\x9c\x9f\x55\x7d\xbf\x5d\x4f\xfc\xae\x62\x53\x60\x88\xbc\xd5\x98\xef\xe8\xcf\xa8\x45\x9b\xef\x5e\xf2\xc7\x79\xaf\x31\xc0\xeb\xab\x18\xf8\x01\xa6\xfa\x2f\x9c\xf3\xe1\xac\xdc\x6c\x7c\xa7\x66\x00\x67\x0d\xed\x5b\xe2\xf2\x41\x3a\xeb\x73\xea\x7c\x30\xf8\xde\xab\x1c\x8a\xee\xc1\xf5\x28\xf7\x4c\x75\xf1\x5a\xbc\xae\xbe\x97\x71\x4e\x1b\xae\xf8\xd4\x39\x68\xfd\x86\x0d\x08\xa4\xe0\xfc\xa6\xde\xe1\x2f\xbc\xe9\x77\xdf\x83\x6f\x19\x74\x0e\x60\x7e\xe1\x03\xc3\x66\x9e\x35\xbe\xd3\x5e\x8f\xad\xb2\x69\xf5\xfe\xda\x46\x43\x80\x61\xa7\xc6\x34\x1f\xfe\xd3\x0f\x34\x38\x42\xa1\x98\x36\x91\x0b\xd7\x30\x3a\x0d\xa9\xac\x30\x56\x04\x34\x8c\xe4\xc5\x71\x34\x46\x26\x27\x46\x68\x95\xd6\x35\x82\x4b\xaa\x49\x5f\x26\x99\x92\xd3\x12\x4a\xcb\x69\x69\x58\x32\xdf\x3f\xbf\x78\x46\xe0\x7b\xe4\xed\x54\xfb\x60\xe1\x4d\x62\xfe\x17\x0b\xb2\xd4\xa2\x3d\x5f\xb6\x7c\x36\xff\x67\xcc\x0c\x07\x06\xb8\x7e\xe6\x60\xbb\x47\x3f\x35\xf8\x5c\x17\xf9\x14\xd5\x31\xf0\xa1\xef\x59\x70\xe8\x9c\x3f\x31\x20\xd4\x3c\x70\x12\x00\xfa\x48\x28\xba\x07\xe7\x86\x0f\x7c\x78\x18\x98\xfd\x11\x53\xe6\xb7\xed\xc7\x79\x73\xfd\xfb\x3c\x7e\x5b\x47\x2f\x1d\x6c\x77\x78\xb8\x61\xdf\xb3\xd6\x5c\xd1\x3d\x0b\x31\x95\x47\x1d\xde\x6b\xce\x85\x6f\xfd\x76\xc7\x3c\xba\x79\xd2\x1e\xdf\xfb\x2f\x50\x16\x17\xdd\xb2\xd4\xf3\x6e\xc1\x9e\x67\x17\xee\xe5\xb6\xff\x69\x67\x9c\x75\xef\x79\xbd\x9d\x67\xdb\x6a\x8d\x37\x6f\x99\x59\xb8\x0d\xdf\x45\x68\xc7\x7d\x15\x45\xec\x8b\x15\xc0\x51\xae\xbe\x8a\x8d\xb5\x0d\x76\xfb\xd4\x26\x32\x27\xe8\x59\x3d\xe2\x4f\xa0\x88\xa6\xc7\x50\x26\xa9\x49\x3e\x8a\x14\x54\x21\x8c\x32\xea\x44\xae\x26\x16\xd7\xc7\x11\x23\x8e\x41\x79\x8c\x48\xe3\x0b\x22\x10\xf3\x19\x9e\x14\x41\xc4\x35\x67\x8d\x15\x04\x8b\x4e\x6b\x9b\x52\x5f\xdb\x50\xeb\xcc\x3f\x9c\xd0\xb3\x7a\xd8\xcf\xeb\xc3\x30\x9e\x17\x46\xf2\xda\x18\xca\xb3\xa3\x59\x5d\x42\x63\x49\x59\xf0\x85\x49\x51\xe6\x29\xec\xcd\x91\x54\x59\x12\xf4\x3c\x91\x10\x12\x32\xcb\x41\x0e\x65\x90\x80\x54\x31\x03\x23\x19\xdf\x70\xd0\xf1\xe1\x0a\xa1\xe8\x81\x4b\xf0\x0e\x17\xb8\xf4\x34\xd3\xbe\x33\xf1\xb4\xdf\xe3\x57\x31\x74\x76\xdc\x1b\x77\x2d\x63\xf9\x14\x24\xf3\xce\x12\x98\x06\x66\x1b\xfc\xcb\x0e\xce\x91\x81\x16\xd3\x95\x62\x06\x5b\x30\x42\xcf\x6c\xab\x6d\x68\x9e\xd9\xd6\x68\xed\xb3\xd1\x80\x1d\x6e\x3c\x16\x9a\x0a\x9b\x14\x18\x8e\xc5\x95\x58\x04\x2a\x88\xe6\x85\x51\x0d\x82\x22\x90\x84\x70\x52\xd6\x50\x32\x32\x36\x8c\xa4\x88\xc4\xe7\x48\x81\x43\x79\xa4\x12\x23\x63\x1a\x1a\x0e\xf2\x49\x49\xe0\x61\xc6\xcf\xcb\x4a\x44\x4a\xaa\xf9\xb4\xf1\x1b\x25\x4f\x85\x95\x48\x18\xd1\x50\x63\xd2\xe1\x08\xa4\xd4\xf4\x18\x4c\xcb\x5c\x1c\xa9\xf8\x08\x10\x85\xf8\x94\xa0\xc0\x0c\x11\x87\xb9\xb8\xad\xaf\x73\xa6\xcc\x38\x80\x33\x40\x1d\x58\x98\xe3\x5c\x28\xba\x1f\xdb\xfb\xdb\x3e\x74\xe1\x8d\x99\xbb\xf3\x63\xcf\xf3\x29\xfc\xbc\xa1\x43\x7c\xed\x19\xe7\x9d\xf1\x83\x9e\x71\xc1\xb9\xd7\xbd\x00\xdb\x6a\xc8\x23\xc3\x0c\x99\xc4\x78\x9e\xbf\xac\xb8\x30\xa0\x92\xdf\x09\x35\xef\xf0\x15\xd6\x14\x27\xcc\x53\x73\x7a\x47\x27\xec\x79\x3a\x0f\xb8\x78\x1e\xde\x97\x39\xae\x3d\xeb\xec\xab\x25\xf0\xac\x31\xae\x19\x1a\x5e\xa0\xf7\xc1\x1a\x7f\xf1\x33\xe0\xb7\x64\x9e\x08\x6a\x41\x33\x98\x03\x16\x83\xab\x4c\x6f\x4d\xad\xdb\x57\x3a\x73\x5a\x43\xed\x51\x01\x32\x40\x5a\x8a\x76\x23\x61\xa5\xf4\xd4\x35\xd4\xb5\xd4\x36\xd6\x4d\xab\xf7\xb7\x4e\x6b\x6d\xac\x6d\x69\x6d\x80\x6d\xad\x2d\xad\xc6\x29\x37\xd6\xb5\xc0\x7a\xd2\x3e\xf3\x46\xe7\xcc\x61\xf1\x82\x9d\xda\xab\x2b\xee\xba\x65\xee\xcd\x93\x26\x75\xbc\x73\xce\x2f\xe0\x09\xf0\x1f\xd3\xea\x2f\x3c\xea\xd6\x08\x7f\xd4\x99\xc9\xa9\x9b\xb9\xbb\x8f\x4a\xa2\x98\x2f\x83\xc6\xc6\xc6\x60\xfc\xf0\x42\x0d\x8c\xe5\x72\x68\x1c\xca\xea\xd8\x98\x9a\xcd\xfa\x63\xdc\xb3\x68\x25\x41\x0f\x2b\x63\x41\x8e\x93\x38\x16\xbe\x47\x8a\x12\xd7\x8c\x46\x44\x79\x71\x57\x8a\x69\x6a\x62\x3a\x3a\xe0\xa7\xe1\x08\x3a\x7d\x79\x98\x3a\xca\x7f\x9c\x14\x8e\xc3\x38\xca\xa9\x09\x1e\x06\xf5\x9c\xac\x20\xfe\xd6\xd8\x63\xb2\x12\x51\x61\x4a\xd1\xe9\xf0\x78\x1a\x06\xd1\x78\xc6\x1f\x96\x13\x31\xa4\x28\x13\xf9\x1a\x0a\x01\xa4\x6a\x82\x0c\x53\x44\x04\x8e\xc4\x9d\x7e\x0d\x42\x28\xda\x6b\xd6\x80\xa4\x1d\x3e\x69\xc8\x9d\x44\xc8\xbe\x79\x92\xf6\xe8\x1d\xbc\x3d\xbe\x0e\xcb\x50\x00\x71\xde\x56\x92\x94\x30\xdd\x63\x89\x7f\x54\xa0\x81\x22\xec\x9a\x35\x93\x1b\x08\xd8\xdc\x34\x79\x66\x2d\xbe\x93\xef\xcb\x09\xb4\x0f\x4c\x64\x82\x3e\x59\x1a\x16\xd4\xb0\x2a\xf0\x2c\xa5\x07\x63\x08\x24\x60\x50\x12\xf5\xbc\x8f\x8e\x73\xa4\xa4\xa5\xd5\xb4\xa2\x53\x68\x94\xd2\xa8\x0c\x11\xd1\x55\x94\x57\x64\x48\x8d\x13\x71\x55\x95\x80\xbb\xd7\xd8\xc0\xcd\xb8\x17\x55\xbb\x4b\x0e\xe3\x9c\xd6\x81\x5b\x71\xcd\xc9\x27\x31\x97\x4c\x3a\xdf\x99\xf2\xd4\xfc\x0e\x7b\xd0\xac\xbe\x8a\x8e\x6d\x38\x80\x73\x5d\xd4\xbc\x4b\x6f\x30\x6b\x42\xe1\xf7\x1c\x60\x5d\xef\xd1\xca\xdf\xd3\xb9\x0f\xdf\x5b\x37\xbe\x7b\x8d\xbc\x17\xd4\x82\xd3\xc1\x7c\x70\x0e\x58\x62\xc0\x65\xb2\x75\x0d\x65\x72\x3d\x11\x30\x74\xe1\x69\x18\x52\xbe\x06\x2a\xe0\x54\xf7\x99\xdc\x48\xf8\x9a\x67\x86\x26\xe3\xba\x05\xde\x0b\x28\xf5\x38\xc5\x35\x34\x39\x40\xf8\x48\xb5\xff\x9e\x0d\x91\x28\x5a\x89\xda\x9a\xdf\xdf\xb0\x61\xc3\x63\xf0\x04\x38\x73\xfe\xa2\x89\x5f\x31\x71\x18\x44\x7c\x10\x4a\x6c\x5c\xa5\x99\x08\xcb\x30\xb1\xd8\x78\x78\x44\x12\xf8\xa0\x0a\x63\x31\xda\xf7\x6b\x2d\xa1\xb0\x4c\x24\xc1\xb1\x28\xab\x30\x82\x22\xf8\xe2\x3c\xa3\xd1\x1c\xe9\xff\x2d\x42\x17\x5d\x74\xd1\x79\xe1\x47\xb6\xc0\x39\xa7\xa3\x8f\xee\xa4\x66\xdd\xc4\xef\x91\x35\x15\x8d\xeb\xe1\x9c\x16\xd6\xc2\x32\xa1\xe9\x12\xca\x88\x69\x98\x23\x44\x55\x16\xf5\x1f\x14\xea\x57\x5e\x5d\xbf\xa1\x7e\x11\xf1\xd6\x0c\x74\x37\x1a\x5b\x0e\xc3\xf0\x32\x34\x8a\xb6\x2d\x82\x2b\x61\xc4\xd4\x07\x0c\x5e\xc1\x90\x0a\x08\x82\x63\xc0\x1c\x1b\x37\x5a\x1b\x9a\x8d\xff\xf1\x96\x8a\x6d\x86\xb8\xee\xa2\x59\xc6\xc6\xd4\x1a\xc9\x40\x03\xe1\x40\xa6\xad\x26\x18\x8f\x10\xa3\x5f\xcb\xc4\x18\x83\xf2\x1c\x4d\xc4\x38\x3a\x45\x33\x50\xd2\x0e\x66\x34\x98\x14\x20\x25\xa2\xa4\x04\x23\xa3\x61\x14\x23\xc6\xc3\x71\x8d\x8e\x11\xa3\x13\x63\x41\xca\x37\x1c\x56\xd2\x72\x2a\x92\x91\xb8\x44\x90\x54\xb8\x84\xaa\x8a\x28\x27\x8a\x82\x48\x27\x58\x94\x97\x65\x48\xc9\x05\x06\x8d\xa5\xa5\x24\x0c\x8f\x2b\x0c\x1d\x67\x79\x45\xe0\x90\x9c\xa3\x54\x2a\x99\x29\xe1\x80\xd9\xaf\x0a\xd7\xaa\x34\x31\xa4\x73\x6f\x99\x1f\xe6\x66\x2c\xf3\x71\xf5\xd0\xce\x3d\x0e\x8e\xa8\x15\xdf\xf5\x39\xdf\x95\x7e\x47\x0e\xdc\xe2\xc2\x37\xd3\xb7\x6f\xbe\xa5\xa4\x5f\xb6\x04\x1e\xb0\xf1\x90\xea\xe8\xbf\xa3\x78\x43\xf1\xfd\x85\x1b\x67\xad\x09\x91\x5d\x2f\xb9\x7e\xdb\x47\xde\x4f\xb5\x0f\xdc\x4c\xfa\xe7\x3c\xbb\xe0\x1d\x6a\xd1\xce\x91\x04\x9a\x77\xef\x02\xb3\xe6\xea\x7d\xc5\xc5\x81\xa7\xc9\x4e\xaa\xfd\xa5\xb7\xe1\x03\x0b\x7a\xe6\x5c\x43\x2d\xd2\x3e\x01\x07\x17\xbc\x33\xef\x2b\x67\x4d\x8a\x43\x53\x78\xbd\xa1\x45\xbd\xbd\x1f\xff\x93\x01\x73\xff\xe1\xa1\xb9\x5b\xb1\xdc\x7c\xa8\x3a\x2d\x98\xfb\xec\xff\xdc\x4b\x57\x3b\x77\x95\xbe\x33\xe6\x77\xf7\xb4\x31\xe1\xb3\xd3\x8c\xe4\xee\xfa\x16\xb8\xa6\xac\xef\xac\xbb\xc5\xbb\x7a\x2b\xe6\x5c\x84\xe1\x7a\x77\xa8\x7d\xe0\xe6\x2f\x0f\x61\xc0\x82\x7b\x42\xe4\xa6\x8f\x29\xe0\x82\xb9\x14\x8a\xee\x7c\x0b\x9f\x23\xde\xc5\xce\x37\x2b\xf7\xee\xbc\x6f\x27\xfe\x6e\x61\x91\x0d\xfc\x9c\x7c\x28\xd4\x3c\x10\x44\x97\x00\x7f\x88\x5c\x7b\xdf\x99\x86\x7d\x7c\x4b\xf1\x96\xc0\x33\xe4\x9d\xc0\x07\x02\xe0\x38\x70\x12\x38\x0f\x2c\x03\xcb\x71\xe4\xc5\xec\xe8\xde\x52\xd7\xd4\x56\x5f\xe3\x77\x65\x67\x44\xa2\xad\xb0\xbe\x54\x41\xc0\xe4\x01\x75\x25\x44\x6f\x9b\xd9\x8a\x85\x50\x6d\xab\xc9\x03\xcc\xc4\x22\xfc\xe7\xef\x88\xb4\xce\x69\x50\x44\x0a\xf1\xbf\x1a\xa4\xf2\x09\x34\x86\x86\xd9\x61\x99\xa3\xd4\x88\x9c\x43\xe3\x1a\x3c\x74\x73\xec\x0d\xc4\x7f\xf9\xea\xf3\x5f\x76\xc0\x19\xfa\xe3\xf4\x09\x70\x0a\x6a\x82\x6b\x83\xfc\x3e\xe6\x5a\x4a\x58\xb0\x98\x8a\x23\xea\xed\x27\x7e\xf3\x2a\xbc\x3a\x12\xf1\x3d\xb9\xe3\xf9\x8e\xe7\x37\xe9\xbf\xec\xf8\xfd\x17\x44\xad\x2e\xa8\x50\x58\x9f\x61\x38\x89\x67\xb4\x48\x98\xd3\xe8\x9c\xc0\xf2\xe4\xd5\xcd\x67\xf6\xaf\xbe\x77\x75\xe6\x40\xe7\x55\x99\x7f\x2d\x5b\x7e\xef\x63\xe8\xe8\xde\x23\xee\x25\xcf\x5e\xfd\xbf\xe8\xb5\x77\x97\xbe\x0b\x5b\x5f\xbb\xf7\xac\x56\x74\x07\x7b\xd5\x4d\x22\xfb\xfe\xf5\x0f\x89\x9d\xd7\x97\xd1\x8b\x09\xcb\xfd\xf8\x86\x6f\xe7\x0e\xe7\xec\x52\x15\xdf\x6d\xb7\xbe\x3b\xc3\xbc\x1b\x3f\x70\x73\xe0\xf3\xd9\xbb\x98\x4c\x88\x1c\xbc\xad\x29\x5f\xe5\x7c\xc8\x81\xff\xf3\xf0\x7b\x9b\x2e\xa2\x06\x2d\x50\x64\x67\xaf\xeb\xbc\xcb\xbf\xdb\x86\x63\xfb\x5c\x71\x41\x60\x0b\x79\x0b\x38\x04\x9c\x04\x5a\xac\x5c\x5f\xd3\xc3\xb1\x0c\x5c\x62\xf9\x38\x70\xe2\xf7\xb4\x06\x2b\x51\xb4\xc1\xd0\xf0\x9c\x73\xaa\x35\x79\x75\x6d\xe3\x34\x8b\xab\x45\x9b\xa1\x75\xee\xc6\xdf\xdb\x5a\x5a\x3d\xa9\xc1\xc6\x6c\xbe\x8f\x3a\x4f\xf7\xb1\x85\xe4\x79\x37\xdd\xff\x7d\xdd\x07\xc3\x91\xb8\x4a\xc7\x86\x51\x06\xc6\x83\x82\x12\x67\xc2\x5c\x3c\x4e\xc5\x35\x2a\x2f\x8a\xa2\x56\xf3\xfa\xa9\x53\x88\xc3\x27\xee\x82\x1f\x4f\x39\x0e\xbd\xe4\xfb\xa2\x10\x7a\x81\x78\x4b\x9f\x79\x1b\xcc\x23\x6a\xf5\x3f\xfe\x81\xde\xf0\xdd\x50\xe8\x59\x4d\x5c\xad\x6f\x33\x3e\xff\xa8\xb9\x79\x62\x1d\x79\xcb\xf4\xe7\xe5\x4d\x77\x5e\xf9\xbb\x63\x44\x3e\x9e\x94\x55\x94\x2b\x8c\xa0\xf1\xb0\x1a\x66\x87\x09\x4a\x97\x91\x26\x69\x30\x4f\x48\xa7\x2d\xba\x74\xd5\xaa\x79\xa7\xa1\x4f\xd0\x61\x37\xc2\x53\x67\x64\x2f\x9c\x89\xf6\x22\x01\xcd\x1c\x99\x99\x7d\xd0\xa1\x3b\x39\x14\xdd\xb6\xd7\x05\xb3\xad\x5e\x1b\x76\x9b\x19\x51\xdf\xe2\xe2\x3b\x58\x37\xb3\xc6\x35\x60\xdb\x03\x06\x1e\x84\x41\x93\x41\x13\x98\xa3\xd7\x35\xd4\x1e\x35\xa5\x25\xd2\x86\xa9\xa1\xe1\xc4\xa8\xa1\x73\xc1\x66\x30\xd9\x2c\xcd\x92\x27\x23\x7a\x24\x18\xf1\x09\x3a\x4f\x4b\x10\xc4\xe2\xc1\x14\xa5\x20\x35\x27\xb1\xb2\x2e\x89\x04\x2b\xe9\x09\x22\x1b\xa1\x74\x9e\x0c\xab\xe3\x23\xaa\x4e\x85\x23\x91\xd8\x70\x3c\x2f\xb1\x09\x9f\xa1\x22\x48\x12\xe4\x89\xa0\x3a\x32\x0e\x20\xb6\xc5\x54\x92\x02\xcd\xe6\xbb\x09\xfb\xdd\x67\x18\xef\x26\x48\xf7\xbb\x9b\x27\xd7\xfb\x1a\x66\x4e\x6e\x18\x23\xc3\x7a\x92\x8a\xfb\xe2\xba\xc2\x24\xf3\x91\x78\x50\xa3\x64\x94\xce\x49\xac\xaa\x4b\x12\x91\x50\xf4\x91\xb8\xa6\xc9\x70\x94\xa6\x74\x8a\xa4\x54\x34\x3a\xa6\xea\x7c\x38\x12\x8b\x65\xe3\x68\x5c\x62\x13\x44\x56\x1f\x45\x8a\x0c\x39\x98\x91\xa1\x16\x43\xea\x98\x21\x08\xb1\xbf\xd1\xb0\xb1\x23\xa1\xe8\x3e\x7c\x9f\xa9\xd3\xf6\x31\xa4\x6d\xdf\x43\x97\x99\xef\x6e\xe7\xb5\x2f\x2a\x5e\x17\xf8\x25\x79\x2d\xd5\xb1\xf5\x0f\x85\x2d\xe0\xb4\xf9\x0b\x18\x40\x2d\xea\xdc\x7c\xff\x49\xf3\xa8\x05\x59\xe0\x83\x7c\x91\x25\x55\x32\x62\xdd\x7f\x70\xdd\x77\xa8\xc5\xff\x92\xaa\x56\x08\x6a\x9a\x6f\xbc\x10\x34\x3e\x64\xe4\xeb\x98\xaa\x92\x39\x9d\x26\xe2\x07\xf3\x04\x6b\xc6\xf9\x84\x62\x2a\x60\xcc\xe1\x73\x66\x69\xa8\x6d\xb0\x67\x30\x34\x60\x28\xf9\xa9\x83\x79\xcd\x97\x2d\xc4\x8d\x0f\x62\x03\xf1\xf1\x2c\x19\x99\x88\x10\x19\xa8\x14\x38\x28\x17\x46\xd5\x62\x11\x52\xb8\xff\x62\x38\x14\xed\xc1\x71\xc7\xce\x1e\x33\x8e\x08\x69\x5c\xab\x39\x09\xea\xad\xbc\x19\x00\x5b\xea\x9a\xa6\x99\xdc\xb0\xc1\x46\x80\x48\x73\xb4\xb5\xe2\xb6\x06\xad\x11\x49\x82\x12\xf4\x61\x9d\x93\x60\x1e\x0e\x8b\x6c\x44\x8b\x0f\xeb\x19\x3d\xcd\x89\x7e\x49\x9b\x18\xd7\xb4\x9a\xe0\xc4\xb8\xf1\x21\x93\xa3\xac\x28\x27\x39\x39\x4e\x45\xc2\x39\x66\x5c\x8c\x44\x44\x94\x2d\x84\x93\x49\xdf\x18\x52\x72\xfa\x70\x16\xeb\x21\x49\x6c\xeb\xd2\x60\x12\xce\xe4\xc1\x3b\x75\x97\x8a\x72\xde\xcc\xf8\x93\xba\xe2\x63\x0a\xc3\x5a\x21\xeb\x8b\xeb\xaa\x56\x43\x4f\x8c\x18\x1f\x92\x2e\x28\x63\x2a\x02\x04\x50\xc7\x08\x90\xd3\x87\x73\x56\xac\xc3\xee\xb7\x9e\xc2\xb5\x29\x26\x39\x31\x10\x3a\x90\x30\x60\xb2\xff\x26\x5c\x47\x30\xe5\xb2\xb5\xcc\x3e\xec\xb8\x9a\x61\xe7\x46\x8f\x4f\xc9\xb0\xc1\xcc\x3a\xdc\x8b\x5c\xcf\xe3\xf1\x03\xc7\x60\xbf\xec\xb1\x1e\xff\x1c\x1d\x8a\x0e\x9d\x8b\xc7\x8f\xf6\xf8\x71\x23\xa1\xe8\x10\x8d\xfd\x1e\x7f\x70\x8d\x4b\xa5\xe7\x87\xce\x76\xcd\xaf\x90\xf1\x50\x74\x08\x7b\x2a\x86\xce\x71\xd6\xcf\x1a\x76\x7c\x28\x3a\x80\x6f\xdd\x3b\xeb\x57\xf0\x3c\xc0\xe9\x79\x6f\xdd\x13\xc2\x31\xf1\x71\x63\x9e\x0d\x9f\x94\xcd\xc3\x59\xf5\xe5\x46\x3c\xf3\xa8\xd8\x96\x73\xfa\xbf\xaf\x5d\xe8\x9a\x3f\x81\xd7\x39\xd7\x80\x9b\xd9\xcf\x1d\xd4\x80\x54\x71\x65\x80\x27\x05\x0b\x57\x4f\x30\x30\xbe\xa1\x16\xb6\x36\x1c\x47\x34\xb4\x42\x83\x31\xb7\xd4\x36\xb4\x9a\x16\x3a\x3e\x50\xf2\x9e\x89\x60\x4d\xa2\xc0\xfa\x32\x13\x2d\x1a\x01\x34\x98\xd7\x74\xd1\x17\xfe\x9a\xf5\x01\x9d\x27\x7a\x0a\x23\x3e\x1a\xa5\x87\x87\xe5\x6c\xd6\xbf\x70\x14\x32\x68\x78\x14\xc9\x19\x55\xcd\x98\xb0\x52\x03\x1a\x49\x85\xa2\x43\x66\xff\x68\xda\x13\xf3\x34\x60\x75\x8e\xc7\x17\xa7\xe0\x33\x12\x42\xd1\x21\xb3\xcf\xe8\xb3\x0e\xcc\x79\xd3\x1f\x63\x9d\x85\x1d\x2f\x7c\xba\xc8\x06\xae\x27\x6f\xa5\x3a\x9e\x7b\xbb\xf8\x11\xf1\xbd\x05\xb5\xb3\x8e\x0e\x91\xfb\xfa\x9c\xb9\x30\xbc\xf6\x0e\xb8\xe1\x0b\xe4\x22\x67\xf6\x2a\x5a\xff\x2f\xcf\x9a\x64\x3b\xdf\xb0\xef\x23\x1c\x93\xb4\xc7\x87\x8b\x74\x80\x2e\x9d\x77\xe7\x06\x97\xac\xc4\x78\xb0\xf7\x77\xb8\xd6\x09\xbe\x9d\xb8\xf7\x03\xeb\x4c\xec\x1a\x87\xc5\xb2\x33\x31\x78\x7b\xdc\x3c\x13\x8a\xdc\x63\xd5\xb5\x86\x5c\x31\x11\x48\x96\xde\xb1\xc7\x8e\x81\x49\x45\xce\x1c\xdf\x8b\x6b\x0a\xee\x7d\xd9\x75\xe6\xb8\x4e\xf5\x5a\x8c\x6b\x4e\x2f\x66\xd5\xd6\x15\xcc\xf1\xb5\x67\xbb\xfc\x92\x9a\xb3\x56\x72\x8f\xdf\x43\x2b\xe1\x50\x74\x0f\xee\x71\x6c\x50\x06\x1e\xcf\x17\xd9\x40\xb0\xb4\x9e\x8d\x05\x17\x2e\x0b\xc6\x79\x9a\x7d\xcd\x1d\x1c\xcc\x60\x5c\x63\x43\x51\x0d\xf7\xd8\xd1\xec\x1a\x27\xa3\x76\x5f\xa8\xbd\xb8\xee\x8a\x46\xba\xce\x59\x33\x68\xc2\x3c\xe7\xfd\x2b\x5c\xf0\x71\xf7\xfc\x9f\xed\x3a\x7f\xb3\x66\x60\x5d\xe9\xcc\xb0\x4d\x14\x0f\xb0\x24\x07\xa6\x81\x93\xc0\x74\x93\x17\x91\x01\xb7\x11\x68\x4b\x25\x80\xcb\x4d\xe1\x88\x49\xa3\xc3\xa1\x04\x3f\x5b\xe0\x69\xb6\x26\x43\xc7\x35\x51\x8b\xe5\xf8\x78\x7c\x5c\xd1\x65\x89\x48\xc8\x68\x1c\x8d\xa3\xa0\x00\x33\xe3\x28\x9d\x54\x25\xc8\xa6\xf3\x25\x3e\xc9\xe9\x61\x8e\xd3\x35\x4d\x0a\xa6\x82\x29\xa8\xa1\x08\xca\xc9\x10\x40\x09\xa9\x59\x29\x03\x01\x9f\x90\xb4\x11\x98\xd1\x10\xad\xd9\x7e\x4c\xb9\xc4\x77\x3a\xd7\xbb\x60\x20\x1b\xb8\xde\x8f\x71\xc4\xc0\x08\x17\xde\xb2\x26\x6c\x42\xe4\xe6\xe9\x56\xdc\x73\x6d\xf1\x94\xc0\x6d\xe4\xb9\xe0\x10\x30\x09\xd4\x81\xa9\xe0\x38\xd0\xe0\x8e\x0b\xf8\xeb\x0d\xa3\x6f\x1a\xf6\x10\x9a\xd2\xc7\xdc\xe5\x5a\x1f\x15\x63\x52\x6c\xdc\x47\x7d\x1d\x83\xe3\x52\x16\x65\x78\x18\xf6\x8d\xc0\x60\x2e\x39\x3a\x5e\xb8\xc4\x3f\xe7\xe0\xff\xf4\xd4\xc0\x89\xa2\xf1\x21\x0e\x4b\xf2\xb4\xa4\xa8\xb4\x50\x04\x9a\x2a\x8d\x6a\x59\x65\x2c\xe5\x7f\xb2\xf0\x29\x7c\xfb\x15\x74\xb8\x65\xbf\xf5\x17\x1b\x03\x4b\xc8\xe5\xa1\xe8\xe0\x56\x7f\x1d\xb5\xb8\xef\x87\xc5\x96\xe2\xdf\xce\x99\x7e\x6e\x8f\x85\x7f\xa2\x8b\x56\xba\xad\xb5\x0b\x38\xf6\xf5\x30\x8e\xd9\x9a\xf9\x9f\x71\xfb\x1e\x98\x99\x9a\x37\xb9\x5c\x6e\x35\xcc\x6c\x6b\xc1\x2a\x4e\xc8\x1f\x68\xf2\x99\xd5\xc2\x88\xa0\xc0\xa8\xb4\x50\x33\xaa\xb2\x09\x55\x50\x3d\xc2\x0b\x09\xbe\x60\x38\xa8\x05\x29\x1f\xaf\x07\x47\x08\x3a\xa1\xa7\xf2\x19\x5d\xe1\x89\x48\x5a\x67\xfc\x8c\xa4\x25\x54\x99\x8d\x67\x92\x9c\x82\x44\xb7\x48\xab\x79\x8f\x65\x59\x56\x45\xa3\xa2\xa6\x40\x15\x71\x92\x26\xc0\xb8\x75\x0e\x72\x89\x56\x43\xa5\x9e\xc4\x12\x8e\xcb\x38\x34\xd9\xa9\xba\xfc\xa3\xa6\xfc\xc2\xf1\xf0\xce\x2e\x0f\xae\x53\x36\xae\x9b\x7d\xd0\x81\x0f\x08\xc5\x64\x40\x24\x59\xd0\x80\xb1\xd7\x91\xa3\xf6\xbf\x76\x8f\x04\xb3\xd4\x41\xc0\x2d\x59\x59\x7f\x52\x4f\x11\xc3\x3a\x43\x48\xba\xe4\x0b\x7e\x1d\x31\x94\x2c\x42\xd4\xf3\x9c\xa0\x64\x79\x35\x0e\x87\x75\xb9\x24\x6d\x59\x3d\x32\xac\x64\x94\x61\x55\x1d\x56\x32\x12\x2f\x0e\xe7\xe9\xe4\x30\x4c\x6b\x88\xd1\xac\xf5\x71\x56\xcd\x1f\xcc\x93\xd6\x2e\xf0\xc8\x3f\x87\xe7\x0e\x1c\xe3\xda\x8f\xd9\xff\x18\xef\xc7\xe9\x7f\x2c\xdb\xbd\x0b\x06\x6b\x28\x37\xff\x54\x6d\x1b\xa5\x1f\xeb\xb3\x3b\xf7\x5a\x72\xc8\x8c\xfb\xcb\x38\xbf\x93\x06\x73\xdd\x3e\xe2\x80\xad\xdf\x4e\xf1\x63\x7f\xb7\x5d\xef\xd9\xae\x3a\x68\x96\x1e\x24\x03\xd8\x4c\x30\x81\x92\x25\x94\x70\x50\x0d\x52\x3e\xb6\xa0\xc6\x7d\x89\x82\x18\x89\xd7\xf0\x48\x54\x61\x50\x92\x04\xad\x30\xa2\x09\x49\x61\x34\x85\x92\x70\x9c\x8e\xa1\x38\x41\x45\xc2\xba\x42\x00\x9a\xf1\x25\xe8\xb8\x4e\xf9\x68\x43\x8c\x15\x46\xfc\x79\x96\x0b\x33\x8c\xac\x48\x2c\x2b\xa7\x54\x95\x17\xf4\xb0\x20\x10\xd9\x04\x2b\xab\x29\x99\xe1\x24\x96\xd5\x73\x1c\xc3\x70\x88\x4e\xa3\x70\xda\x91\xfb\x98\xb7\xf6\xfe\x10\xd7\xed\x36\xb1\x62\x9d\x03\xab\x4c\x09\xb6\x43\x73\x5c\x30\x34\xeb\x1b\xcc\xf2\xf0\x39\x63\xbc\xd3\x79\x7e\xd1\xc6\xf7\x2f\x05\x73\xbf\x6f\xc5\x4f\xd6\x14\x5b\x02\xed\x06\x5f\xd8\xb5\x10\x80\xd0\xa2\xe7\x9e\xfb\xf2\x63\x06\xcc\xbd\xc9\x91\x69\x66\xaf\x6a\x7c\x56\x4e\xaf\xea\x5f\x14\xd9\x40\x0b\x29\x52\x1d\x07\xfe\x50\xdc\x4d\xbc\xca\xbc\xd3\xca\x7a\xe4\x23\x87\xf5\x1b\xf3\x8e\xf9\x32\x57\x0c\x85\xc7\xfb\xf9\x91\x6b\x3f\x6b\xf1\x99\x99\xbe\x09\xce\xd2\x1d\x62\xb6\x9e\x6b\xd3\xac\x85\xbb\x53\x4e\x82\x81\xc6\x48\x93\x61\x94\x83\xc9\xf8\x96\x4e\x6d\x03\x94\x6b\xf2\x13\x94\xea\x1b\x2e\x30\xc6\x07\x09\x64\xbe\x30\x4a\x64\x74\x36\x07\x79\x48\xd1\x39\x44\xe9\xe3\x8a\x94\x91\x60\x82\xd1\xa8\x98\x92\x2b\x64\x49\x4e\x8f\xc1\xb4\x8a\x58\x0d\xf1\x4a\x56\x19\x8f\x69\xc3\xa9\x51\x55\x82\x14\x14\x23\xa2\x90\x61\x89\x98\x2d\xdb\x92\x01\x15\xd3\xe3\x6f\xb0\x8c\xfc\x9d\x43\xa7\x52\x40\x29\xf1\xa2\xee\x26\x97\x0c\x53\x4a\xf8\xe8\xf4\x7c\x2f\xe5\xf0\x99\xfd\xb8\x6d\xbb\x62\xa4\x48\x07\x62\x25\x7a\xef\x6e\x74\x9e\xe7\x2c\x3d\xd0\x94\xe5\xee\x3e\xfd\xd8\x86\x1e\xc2\x32\x72\x88\x71\x64\xb0\x18\x50\xc9\x59\xa1\x0e\x63\x3d\xc5\x3b\x18\x70\x6e\x2e\x44\x0e\xbd\xe8\xd2\x7b\x92\x36\xaf\x19\x38\xe0\x5a\xab\xd9\x0f\x1a\xd7\x3a\xda\xa0\x39\x7b\x63\x02\x12\xc9\x84\xa2\xdd\xf8\x4e\xf1\xa0\xbb\xfe\x1a\xe7\xac\x35\xda\x8b\x33\x13\x8c\x73\xc4\xbe\x7d\x31\x90\x26\x63\xa1\x68\xdf\xff\xe1\x7d\x3f\xe2\xec\xe3\xae\xc0\x6b\xe4\xa3\xb6\xbc\xd9\xb4\xf2\x84\x43\x2d\x7e\x96\xb2\xf4\x59\xac\xa3\x75\xbe\xe4\xda\xb7\x0b\x4e\x4e\xff\x70\x15\xef\x9b\x37\xe1\x1a\x22\x77\x6d\x73\xd6\x6a\xd1\xc7\x01\x1c\x1f\x32\x76\x5f\x46\x03\x66\xff\xfb\xfb\x5d\x7a\x15\xe6\xaf\xa9\x7a\xcf\x79\x96\xd1\x92\xd3\x6b\x59\x29\x2a\x81\x94\xb1\x2f\x73\x9e\xdd\x87\x3b\xfc\x28\x59\xe2\x5f\xa1\x52\x2f\x67\xc5\xe9\x49\x68\xe2\xfd\x90\xe7\xfc\x4d\xdd\xf3\xbd\x10\x99\xba\xdc\x13\x8b\xa1\x43\x51\x43\x7b\xa1\xc8\xce\x17\x9d\xe7\x25\xcb\x3e\x30\x75\xd5\xa3\x5d\xfb\xc5\x78\x61\xc9\xfb\x17\x5c\xfc\x51\xc0\x35\xda\xce\xf3\xe8\x9d\x2a\xbe\x63\xc1\x84\xa2\xfd\xbb\x71\x1d\xee\xd7\x1d\x79\xc2\x04\x9e\x25\x05\xaa\x7d\x68\xf6\x27\xfe\xf9\x7f\x61\x0c\x98\x66\xea\x4a\x73\xe1\xdf\x0c\xe2\x5c\xe6\xbe\x29\x2e\x9e\xad\xd9\x7c\x20\x44\x0e\xda\xf5\x67\xc7\x8a\x4c\x20\x5c\xc2\xe1\xbe\x7a\x0f\x8f\xa7\x1d\x1e\x3f\xd5\xd9\x5b\xc2\xca\x25\xc2\xb0\xde\xf5\x71\xf9\xfc\xbb\xd7\x54\xec\x41\xc0\xbc\xe9\x6c\xfc\xfc\x42\xcf\x19\x73\x36\x8c\x76\x9d\xe5\x9a\xc7\xa4\x11\xfc\xde\x6e\xfb\xcc\x68\xa7\x9f\xca\x27\x79\x03\x16\x3f\xa6\xec\x79\xec\x3e\x9b\xe6\xd9\xff\xd1\x85\x8b\xf8\xce\xcf\xde\x1b\x2a\x74\x28\x19\xe3\xae\x29\xa3\x8e\x77\xc9\x68\xd6\xe6\xa1\x14\xd9\x8d\x6b\x8f\x83\x00\x48\x16\x45\x9c\xeb\x6d\xd8\xd6\xa7\x80\xd3\x2c\x1f\x16\xb0\x4a\x0b\xe1\x1b\xd1\xe5\x72\xd9\xfa\xf7\x24\x58\xd7\xd0\xea\xaf\x6b\x68\x2d\xe7\x84\x30\x4e\xf0\x2a\x91\x1c\x1b\xd3\x65\x62\x4c\x0f\xfb\xb8\xaf\x29\x5f\x50\x4f\x10\x29\x43\x54\x17\xc6\x7c\x61\x5d\x23\xc6\x61\x0e\xc5\x60\x6e\x82\xf3\x27\x0e\xa6\xd4\x9a\xd8\x44\xce\xf8\x20\x25\x10\x1c\x1f\x27\x63\x1c\x37\x92\x1c\xe1\x92\x5c\x32\xc9\x99\xff\x72\xdc\x08\xc7\xe9\x09\x04\x20\x9d\x40\x63\x09\x34\x2a\x95\xf8\x99\x64\xf3\xb3\x0d\x3f\x72\xe8\x88\x0e\xa4\x4b\x67\x9e\xb2\xf3\xc1\xda\x8b\x74\xe0\x67\x64\x92\x6a\x4f\x0d\x9f\x0b\xe6\xfd\x83\x01\xd4\xa2\xa1\xd9\xa3\x53\xe6\x6c\x9f\xfb\x91\xcb\xbe\x55\x42\xd1\xb5\xc0\x73\xc6\x8e\x1e\xbb\xf6\x31\x8f\xad\x70\x63\xf1\xdc\xc0\x7b\xe4\x77\xa8\xf6\x21\xfa\x4f\x13\x73\x3e\x98\xff\x31\xd5\xa1\xbc\x0a\x7a\x8a\x5f\xce\x3b\x99\x99\x41\x2d\x1a\x5c\xd0\x01\xe6\xef\x64\xdc\xf8\x16\x73\xec\xb8\xaf\x41\xd5\xf3\x75\xfa\xa8\x96\x68\x15\x8f\x3b\xbd\x89\x15\x6c\xf3\x0a\x76\xdf\x5d\x47\x7e\xb2\xd8\xce\x71\xe8\xa2\xb3\xd3\xc3\xb3\x9c\x79\xba\xeb\x5d\xba\x09\xc6\xf3\xed\xd8\x36\xef\xdf\xeb\xc2\x4f\xa5\xa4\xfb\xf4\x8e\x56\xd7\x89\xfa\x5f\x73\x8d\x27\x6c\x3a\x0a\x91\x3d\x1f\x5a\x78\x65\xfa\x04\x92\x58\xe3\x6d\x00\xcd\x16\x66\x81\x52\xc8\xa6\xd4\x9d\xc7\x8a\x52\x35\xfa\xdd\x15\x95\xcb\xb4\x62\x42\x16\x18\xc8\x33\x74\x8a\xa6\xe1\xb8\x3e\x42\x28\xe3\x39\x42\xd2\x47\x61\x8a\x66\xa0\x92\xcb\x11\x8a\x9c\xe0\x45\xbe\x10\x4c\xd0\x0a\xcd\xf9\x63\x5a\x21\xae\x39\x2e\x27\x32\x29\x26\x71\x1f\x3f\x19\x09\x8a\x02\x55\x99\x65\x75\x0e\xaa\x31\x36\xc5\xf3\xa2\x94\x94\x19\x45\xd4\x47\x0a\xa3\x89\x84\x2f\x82\x72\x2a\xe2\x54\xe0\xc4\xb3\x1d\x7a\xe9\x54\x5c\xf4\x6e\xde\x23\xd8\x8d\x6b\x0d\xe2\x4a\x27\x9d\xcf\x3b\x7c\xd4\xdd\x5b\x6e\xb6\xeb\x8c\x5d\x7a\x66\xef\x6f\x5d\xfa\x46\x12\xc7\xd8\x31\xbf\xdc\xd7\x5e\x1d\xd6\x4e\x3f\x4b\x27\x0f\xe1\xa5\xa5\xd8\x1f\x64\xe7\x31\xa7\x9c\x33\x30\x6d\x8f\xe7\x5c\xf3\x6b\xae\x3d\x3c\xeb\xe2\xeb\x8a\x4b\x8f\x7f\xc6\x85\x73\x7c\x49\xae\x3b\x7d\xe5\x4c\x7f\x93\xea\xf0\xf5\xa7\x1d\x58\xf0\x56\xce\x09\xa6\xbf\x4d\x17\xba\xe6\x71\xed\x77\xdb\xd1\x2e\xd8\xa5\x6d\xd8\x85\xc8\x75\xf9\xea\x3c\x77\x7b\xd6\x05\x07\xc1\xb0\xd1\x4d\xdc\xda\xfe\x48\xc5\x19\x60\xdf\xf2\x3e\x7c\xeb\xb1\x3b\xe2\xf2\x33\x88\xf6\x5c\x9b\x47\x3c\x7c\x51\x0a\x45\x7b\x0b\x18\xd6\x7d\xd5\x61\xd1\xfb\x57\xe7\xdd\xa2\x9b\x0e\x9c\x7e\x55\xb2\x1d\xa3\xea\x3e\x16\xc7\xb6\x1e\xc6\x5d\x88\x0f\x71\xbe\xc3\x7e\xd8\xee\x13\x70\x5c\x28\x68\xfc\x52\xfd\xbb\x6b\xef\x11\x0b\x6f\xc8\xde\x41\xe0\xf6\x9d\x25\x42\xd1\x81\x31\xbc\x8b\xe3\xab\xcb\xa7\xde\x53\x3d\xb2\x9a\x71\xfc\x07\x2f\xbb\xfc\x10\x6e\x1b\xec\x29\x8f\x1e\x25\xd8\x7a\xd4\xd6\xcf\x80\xdb\x97\xc7\x38\xf4\x7c\x83\x6b\x7e\xac\x6b\x6c\x7b\xa0\x42\xae\xa8\xb6\xed\x13\x22\xb7\x4f\x78\xf8\x85\xa3\x7f\x6f\xc5\xf5\x7f\x81\xdf\xa2\x9f\x04\x38\x15\xc4\xc1\x99\xb8\xf2\x92\xcb\xce\x6b\x9a\x66\x67\xc4\xd8\x91\x5b\x7f\xf3\xcc\xb6\xd6\x96\x33\xa6\x39\xe2\xc5\x26\x7c\xe3\xbf\x01\xcb\xf6\xe3\xf5\x08\x41\xe9\x79\xc8\xc0\x38\x04\xbc\x9a\x86\xb4\x9e\x4e\xca\x84\xa2\x15\x58\x0d\xe5\x98\xe1\x54\x3a\x0c\x23\x85\x0c\x31\xac\xe7\x09\x0a\x85\xd5\x9a\xc8\xc4\xa8\xf1\x51\x7c\x99\x42\x5a\xf0\x65\x0a\x2c\x99\xd0\x73\xa2\x24\xc8\x29\x51\x48\xc8\x74\x5c\xe7\x39\x0e\xe6\x38\x39\x1e\x8f\x0b\xb2\x20\x89\x90\xe5\x51\x8e\x9f\x18\x17\x22\x68\x44\x74\xeb\x52\xac\x8d\x83\x3b\x96\xba\x74\x5d\x0c\xef\xdd\x01\x03\x0f\xb6\xd6\xda\x14\x59\x49\xbf\x5b\x07\x3c\x3c\xbd\xa4\xc7\xbd\xec\x82\xb9\x62\xe8\x8f\x16\xdd\x3d\xec\xc1\x01\x47\x57\x70\x7a\x5e\xc9\x58\x66\x18\x6b\x6a\x2d\xf3\xe3\x19\x38\x26\xda\xcf\x6f\x3b\xb4\x9c\xa7\x6f\x5a\x0c\xbc\xf6\xa9\x95\x43\x3c\x70\x28\xa6\x47\xac\x0f\x82\x20\xc6\x99\xcb\xc9\xc7\xc1\x21\xe0\x18\x30\x0d\x57\x4a\x31\xeb\x66\xb9\x7c\x2e\xb0\xbe\xc6\xdf\x6c\x95\x2f\x68\xc3\x0c\x1d\xba\xfc\x31\x64\xa0\xc5\x60\xed\xdf\xc0\xcb\x35\x78\xfe\xd4\x86\x9e\x93\xa6\xc2\x93\x0b\x7f\xf6\x1d\x32\x15\x6d\x47\x4b\xa6\xbe\xda\x70\xf6\x63\x4b\xa6\x9e\x3d\x7b\xc5\x49\x6b\x4f\xbf\x04\xce\x86\x4d\x53\x4f\xde\x3c\xfb\x44\x48\xe8\x27\x12\x53\x76\xce\x99\xfd\xd7\xc2\x4b\xf0\xff\xce\x47\x3f\xb9\xe4\xe4\x75\x27\x9f\x4f\xdc\xac\x4d\xe4\x35\xad\x86\x9a\xc8\x1b\x1f\xff\xeb\xb3\x4f\x3d\xf5\x6c\xee\x0e\x74\xf7\xbd\x89\xb3\x9f\x39\xee\x83\xb7\xa7\xfc\xfa\x83\xc0\xa4\x5f\xbc\x3d\xe5\xed\x2d\x44\x13\xb7\xa0\xed\xda\x8e\xe7\x4e\x8b\xbf\xba\xee\xb9\xe7\x5e\xdd\x74\xc7\x9a\xf8\x13\xf7\xea\x5f\x14\x52\x3c\xef\x4b\xa0\x91\x14\x8a\xa5\x6c\x9d\xd2\xa4\xb5\xbd\x65\xf0\x4c\x94\xe0\x1f\x22\xd7\xbd\x91\xb7\xe1\x66\xf1\x86\xfe\xed\x1e\xd9\x69\xda\xf5\x89\x50\x54\xc3\x3a\xa2\x41\xd1\x2e\x1a\x74\xf8\xe4\x06\xdb\xe7\xa7\xd9\xfe\x81\x6d\x98\x6f\xf7\x56\xf0\x49\xe3\x44\x42\xe4\x96\x63\x1c\x3d\xc4\xca\xb1\x1c\x9a\x3b\x16\x0e\x91\xeb\x7e\xeb\x3a\xdf\x5b\x49\x9a\x6a\xd7\x5e\xec\x02\x67\x2f\x66\xdc\x67\xcc\xd9\xfc\xed\x08\x5c\xd3\xb2\xf3\xc9\x72\x1e\x6a\xf2\x85\x75\x39\x17\xdf\xc3\x7b\xe8\x3e\x0e\x3f\x2f\x57\xe3\xdd\x14\xb9\x7e\x5f\xb9\x4d\x39\x94\xf6\xc0\x42\xb0\xf9\x82\xc9\x8f\x5e\xb2\xeb\x38\xaf\xc0\x75\x56\x6f\x37\xc7\x43\x81\xe7\xff\x55\x9c\x80\xcf\x59\x67\xa0\x94\x60\xdd\x59\xea\xf7\x6e\xdb\x5c\xd8\xde\xeb\x7c\xc2\x65\x53\x98\x77\xa5\x56\x96\x9d\x99\x15\x0b\xeb\xc6\xf7\x4c\x86\xce\x03\xa5\x33\xc3\xfa\xb8\xb9\x7e\x6d\x9d\x87\x9f\x3b\x34\x36\x78\x81\xf3\x3c\xe7\xb6\x95\xd7\x61\x99\x07\x48\x2b\x0f\x8d\xb3\xa2\x51\x86\xc6\x7c\xa9\xd7\x83\xe5\x2e\xc1\x51\xce\xcc\x60\x6b\xc3\x71\xd0\xf8\x7b\x4b\x5d\xa9\x8a\xc7\x34\x77\x71\x8e\x1a\xbf\x5d\x15\xa4\x0d\x72\x7e\x01\x65\x71\xd7\x88\x51\x24\xa5\x60\x90\x43\xe9\xac\xae\xa4\x51\x46\x80\x41\x15\x69\x70\x0c\x49\x50\x42\x59\xa5\x86\x99\x18\x36\x3e\x3e\xca\x50\xa9\x51\x4c\xd3\x12\x6c\x5c\x66\xe8\x6c\x9a\x1f\x47\xe3\x76\xa9\x8d\x22\x40\xc3\x4c\x36\x43\x73\x52\x82\x11\x48\x4e\xcf\x08\xb2\xa0\x28\x9c\x2a\x8d\xe7\x15\x49\x54\x14\x41\x16\x20\xcf\xa3\x11\x1e\xa5\x05\x21\x2f\xa0\xdc\x48\x84\x4b\x70\x09\x26\x21\x24\x55\x51\x11\x39\x4a\x0d\xb3\x49\x59\x54\x58\x96\x63\x39\x2e\x11\xb7\x60\x84\xef\xf3\x0f\x62\x7d\xa7\x7f\xb7\xc7\xee\x95\x0c\xbd\x98\x6c\x9d\xf5\xf0\xbc\x9f\x50\x8b\xd6\x3e\x1d\x07\xf3\x1b\x99\x6a\xf2\xbb\x54\x9b\x5b\xb5\x65\xab\x39\xde\xf3\x6b\x47\x8f\x49\x98\xf9\x62\xe7\xe1\xb3\xee\x5c\xe3\xc1\x3d\xc6\x7e\xde\xa9\xfd\xaa\xda\xba\x9b\x39\xee\xd4\x43\xce\xd8\xf3\x9b\x38\x39\xd0\xe3\x79\xaf\x68\x3f\xaf\x09\xce\xb8\x95\x07\x6f\xea\x7a\x03\xb8\xda\x40\xe7\xe3\x0e\xde\xa4\x4a\x3c\x7e\xc7\x63\x2e\x3c\x4b\x96\xe8\x64\xff\x57\x1e\xba\x52\x1d\xba\x7a\xcc\xa5\x1b\x2a\x25\xff\xc7\x66\xfb\x2e\xca\x77\x8b\x4b\x03\x9d\xa4\x42\x75\xc8\xbd\xa8\x17\xf8\xcf\xdb\xc7\x18\x3a\xff\xee\x3f\x7f\x46\x2d\x3a\x30\xf9\xc0\x97\x67\x6f\xaa\x80\x25\x7e\xdf\x90\xcd\xf3\x57\x15\x8f\x0b\x74\x92\xcb\xa9\xf6\x17\xc9\xfa\x5f\xcc\x7f\xed\xcc\xc9\xa1\x8e\xa1\x08\x00\xe8\x05\x06\xcc\xf9\x92\x5a\xdc\xb7\xb2\xf8\x77\x3f\xc7\xcc\x3b\xf7\x5e\x27\x57\xa8\xc4\x23\x56\x3b\xfc\x2c\xee\xd6\x4d\x06\xfe\x52\x2e\x37\xac\x73\x3a\xe8\x81\x97\x68\xaf\xa5\x7f\xc8\x33\x2e\xd9\xe3\xdd\xc7\x54\x3f\x27\xa7\xa6\x6f\xa6\x98\x0c\x70\xc6\x79\x6f\x17\xf0\x7a\x1e\x75\x9e\x9f\x14\xf8\x98\xdc\x60\xcd\xd3\xf1\xfc\x54\xc2\x5f\x7c\xeb\xf4\xab\xcf\x22\xa8\xc5\x7d\x24\xfc\x1c\x1c\xd5\x32\x7d\xc1\x36\x6b\xde\x4e\x92\xa1\xda\xfb\x4f\xf8\x29\x38\xeb\x3e\xc6\x91\x6d\xd6\xfd\x18\xd9\x65\x27\x61\x9d\x12\x1c\x0a\xee\x2b\x5e\x12\x78\x8b\x3c\x0f\xc7\x16\xcc\x98\xca\xe9\xa0\xd5\xaa\x18\x89\xb3\x38\xec\x52\xbb\x95\x3e\x6a\xaf\xfd\x5b\xfd\xff\x89\x19\xea\x1c\x78\xe5\x2e\x62\x99\x7e\x80\x98\xac\x7f\x4e\xbc\xf0\xf5\xaf\x89\xbc\xae\x13\x3e\x74\xde\x9c\x39\xca\x01\xb4\xc9\x37\xa3\xf0\x6e\x17\x71\x88\xfe\x95\xf1\xf1\xc9\xbe\x96\xc2\x2f\xba\x88\x23\xf4\x7f\x19\x9f\xc2\x85\xfe\xf8\xc1\xac\x6a\x07\xe2\x89\x2b\x67\x5c\x72\xc3\x0d\x8f\x3c\xf0\xc8\x23\x4f\x3e\xf9\xc8\x23\x0f\x9c\xdb\x7a\xee\x66\xa2\x1d\x1d\x03\x9b\x2f\x45\x5f\x5c\x05\x23\x68\x0a\x3c\x79\x39\xfa\xdb\x55\xbe\x85\xe8\x50\x18\xbf\x14\x7d\x79\x01\x00\x47\x00\xb1\x38\xc7\xd0\x19\xac\x9c\xfa\x6f\xda\xa5\x73\xeb\xd9\x5f\x8f\x6f\x59\x58\x7f\x02\x7f\x73\xd3\x7f\xdb\xa5\x01\x13\xdf\x98\x1a\x86\x49\x38\xc2\x21\x06\xd1\x28\x83\x68\x8e\x10\xa1\x98\x40\x79\x44\xb1\x04\x80\x63\x09\xa4\xea\x09\x96\xc8\x10\x74\x02\xc5\x0b\x1a\xeb\x4b\x4e\x7c\xea\x8b\x15\x72\x6b\x09\x52\x3f\x68\x7c\x7c\x17\xf9\x1a\x0b\x1f\xbe\x44\xf8\x0c\xd0\xe8\x7a\xe1\x61\xff\x94\x83\x7f\x5d\xeb\xfb\x63\xe1\x58\xe3\x43\x0c\xc4\x29\x81\x91\x58\x55\x15\xe4\x24\xc3\xa7\x62\x22\x4d\xf1\x39\x46\xe0\x58\x1e\xe5\x39\x91\xaf\xb9\xc8\x81\xc2\x34\x07\x0a\x87\xa2\x85\xf0\xc8\x25\x7f\x5b\xe8\xc4\x26\x6d\x3c\xb4\x6b\x18\x4a\xd8\x5e\x4d\x14\x2f\x0c\x7c\x9f\x3c\xcf\xc9\x63\x68\x06\xf3\xc0\x25\x00\x4c\xc3\xb9\x95\xae\xdd\x62\xc5\xa6\x15\x17\x82\xac\xfb\xff\x28\xfb\x13\x38\xb7\xa9\x73\x6f\x1c\x3f\x47\x1e\xcb\x66\x69\xd0\x38\x99\x8c\x59\x63\x33\xc4\xe3\xb0\x0a\x26\x93\x31\x64\x13\x29\x24\x82\xb2\x88\xb5\x62\x17\x85\x26\x62\x57\xcb\x12\x11\x36\xb1\x8b\x5d\x43\x98\x44\xd9\x95\x84\x4c\x9c\xdd\x49\x26\xad\xfb\xb6\xf4\x75\xef\xed\xe2\xd2\x72\x6b\xe8\x72\x4d\x4b\x7b\x0d\xf4\xb6\xa6\xb7\xbd\x75\x69\x4b\x9d\x8c\x75\xe6\xff\xf1\x91\x2c\x1f\xd9\x0e\xef\xff\x47\x3e\x4e\x86\x63\xcd\x91\x74\xce\x73\x9e\xe7\xfb\x7c\xcf\x73\x9e\xc7\x95\x89\xfa\xdf\x21\x5f\x0a\x26\x18\xef\xc2\xfa\xbf\x21\x35\xf8\xec\x52\x77\x5f\x37\x1e\xcd\x38\x75\x6a\xe0\x97\xb5\xd3\xfe\x8f\x6f\x4e\x51\xd1\xa4\x58\xbb\x6c\x42\xcd\x80\xaa\x65\x97\x29\xce\x3c\x58\x38\x93\x32\x53\xac\x11\x8d\x05\x14\x94\x2a\xc0\x94\x88\xf4\x09\x80\xac\x09\x80\x62\x3c\x94\x4a\x88\x89\x04\x18\x8b\xaa\xda\x99\x2a\xcc\x0a\x28\x89\x0a\x16\x2a\x22\x56\x82\x0a\x4c\xd9\xd6\x49\x2f\xd0\xfb\x11\x03\xcf\xb8\x0a\x55\xbf\x84\x2e\x10\x95\xbc\xa4\xaa\x72\x41\x11\x73\x8b\x52\x3c\x9b\x4c\x1a\xa6\x60\x69\x30\x5c\x35\x74\xd9\xfc\x77\xc3\x50\xe5\x94\x29\x67\x50\x09\x46\xd3\x92\x9a\xd2\x26\x26\x40\xdc\x19\x2b\x26\xb1\x6f\xfb\x0b\x95\x48\xe2\x8d\x6d\x8d\xd3\xaa\x24\xe6\x1f\xe1\x71\xeb\x9c\x2a\xb9\xce\x3d\x5d\xb4\xfe\xb4\x4e\x3e\x73\x84\x36\x7f\x4d\xb4\x6b\xd8\x26\xe3\xf5\xbf\x61\x07\xa1\x13\xad\xa6\x1f\xba\xfd\x26\xe2\x7a\xbd\xd9\xff\xbe\x1d\x04\x16\x48\x37\x7d\x90\xd1\x47\x7d\xf7\xf5\x6c\xbe\x97\x4f\xd2\xc1\x63\x9c\x87\x05\x06\x09\x7c\x8e\xf7\x1f\x57\x1d\xd7\xf4\x7d\xc0\x51\xe0\x1e\xfc\x5e\x3c\x88\x81\x53\x40\xd2\xf5\x68\x52\x60\x0e\xe0\xc0\x05\x80\x77\xf3\xb7\xb8\x55\x15\x43\xb8\x4c\x54\xa3\xa4\x62\x5f\x5d\x3d\x0c\x76\xe3\xdc\xdb\xff\x7f\x28\x89\x90\x72\x28\x19\xac\xd8\x86\x60\x88\x9c\x2a\x97\x78\x04\x8a\x28\x9b\xd1\x99\x74\x99\xaf\x32\x9a\x6e\xc0\x68\x57\x69\x3c\x86\x2e\x0d\xa4\x6a\x79\xb3\xee\x09\xe1\x74\x5a\x77\xfb\x54\x47\x4d\xf6\xc9\x15\x2c\xcb\x59\x29\x15\x8b\x25\x39\x36\xa6\x0b\x45\x33\x96\x54\x52\xc9\x54\x39\xa3\x0a\x66\x16\x86\x4d\x31\x70\x34\xb1\x64\xdc\x9f\x02\xb7\xd4\x7d\x2c\x11\x95\x05\x6f\x4e\x8d\x48\xc2\x8a\x62\x1c\xe4\xf8\x08\x93\x80\x34\x71\x43\xc8\xa2\x67\xbb\xab\x85\xcc\x6c\x73\x1a\x18\x70\xa3\xe0\x00\x74\x29\x9e\x5e\x57\x3f\xf4\x7c\xce\xcb\x43\x27\x71\x89\x17\xc7\xd3\xf8\x1d\x5a\x80\x42\x35\x07\x79\x2d\x60\xd6\xe4\xc6\x07\x3d\xee\x1f\x83\xa0\xef\x7f\xa9\x6d\xe6\x21\xc9\xa4\x27\xe9\xe3\x96\xa6\x75\x49\xe3\x56\xfd\x03\x97\x23\x56\x96\x61\x21\xcd\x15\x53\xf9\x54\x97\x84\x12\x30\x7e\x25\xfa\xc7\xf5\xf0\xd8\xc6\x4f\x68\xe2\x57\xb7\xdf\xfe\xab\xc0\x21\x24\x26\x93\x30\x6d\xa6\xf2\x5c\x2b\x26\x89\x34\x31\x89\xd9\xc8\x89\xe4\xe2\xe1\xad\x84\xad\xd3\x9b\xb2\xb5\xea\x58\x42\xe6\x30\x5f\xeb\xf4\xb3\xff\x17\xa0\xe3\x9a\xd9\x90\x76\x65\x6e\xc7\xc4\xac\x90\x46\x5f\xe9\xea\xa3\x13\x00\x0b\x78\x70\x09\x10\xc0\xd5\x40\x04\x37\x3a\xb1\x68\xbd\x6e\x5c\x60\x90\x3c\xe4\x1b\xef\xee\xeb\x9e\xec\xe6\xa4\xc4\x52\x38\xd0\x83\x93\x7f\x39\x84\x6e\x77\xbc\xc7\xcd\x1a\xd3\xdf\x15\xec\x3f\x67\x68\x10\x07\x18\xc6\x7b\x06\x7c\x24\xee\x8e\xc0\x25\xb5\x31\x8e\xfa\xa5\x7d\xda\x72\xb8\x07\x5d\x41\x3d\x7c\xe3\x0d\x67\x0e\x4d\xbf\xf1\xcc\x53\xec\xf7\x5f\xff\xf1\xf9\x93\x8f\x5f\x3a\xfd\xf8\xe9\x67\x9e\xb0\x34\x72\x02\xb7\x76\xf9\x72\xaa\x00\x85\xe5\x90\x47\xd9\x47\x98\xee\x47\xae\x9f\xf1\x52\x1c\x7d\x88\x9e\x8f\x7e\x7f\x17\xca\xbc\xf4\x83\x1f\x40\xf1\xad\x43\xaf\x06\x1f\x3f\xf4\xd4\x96\xae\x99\xe3\x3f\xad\x7f\x02\xf7\xdf\xca\xa1\x09\xf1\x8a\x4f\xd1\xcd\x82\xc0\x68\xe1\xf3\xe1\xb1\x68\x12\x75\x25\x9a\x60\x67\xb0\xdc\x45\x17\x71\xb1\x73\x59\xf9\x5b\xdf\xa2\xbe\xb9\x6e\x1d\x9a\x93\x3f\xf9\xf4\xbe\xd3\xde\xd8\x3d\xf3\xa9\xaf\x85\xd7\x1e\xf7\xf1\x4b\xbb\x77\xef\xee\xa2\xed\x3b\xe0\x2b\x4f\xa2\x07\x5e\x68\xfa\x24\x5e\x7e\x2b\x07\x7f\x82\x30\x8e\x8d\xc8\xd2\xa2\x2b\x99\x57\xe2\x7c\xbe\x37\x83\xaf\x38\x38\xdd\x8d\x1d\x6f\xda\xac\x78\x4f\x5f\x4f\x7c\xb0\x2e\x74\xbe\x3f\x44\x91\x54\x48\x87\x7a\xa6\xf7\x76\xb9\x35\x52\xa7\xfb\x68\x70\x3c\x01\x75\x48\xef\x42\x7b\xc8\x05\x2d\x5b\x8e\x05\x62\xd5\x6a\x80\x67\xed\xb4\xd1\xa5\x8d\x6b\xf5\x4f\x89\x2a\x98\x30\x63\x51\x65\x24\xc0\x32\x8a\xc2\x34\x12\xa9\x58\xad\x2a\xa5\x75\x5e\xe5\xc5\x74\x91\xb7\x8d\x09\x90\x4e\xc3\x74\x0c\x95\x2b\x5c\x21\x2d\xc2\x34\xe4\xed\x24\x15\x45\x22\x4c\x3b\xb5\xe2\x34\x98\x47\xa9\x80\x00\x4b\x28\x16\xc5\xe9\xf6\x05\x5a\x44\x02\x27\xcb\x1c\x04\x7c\x89\x43\x4a\x95\xe3\xaa\x55\x4e\xae\xff\x11\x38\x8e\x13\x52\x49\x36\xaa\xcb\x30\xcc\xb1\xa6\x22\x0b\x2c\x97\x61\xa3\x6a\x52\xc4\xdf\x73\x22\xcf\xf3\x48\xe5\xb8\x34\xe7\xea\xd0\x2b\x43\x3b\x30\x16\xdb\x5e\x01\xcc\xc2\x15\x9f\xb2\x47\xcc\x3f\x6a\xfe\x46\x8f\xff\xc6\x79\xcb\xf7\x3a\x39\xd9\xcb\x84\x8f\x64\xe2\x7d\x2f\x2c\xbb\x6b\x6e\x26\xd6\x86\xee\xe1\x66\x7a\xc3\xa8\x8f\xcf\x10\x23\x89\x95\xaf\xe3\xb5\x31\xcd\xc7\x2d\x49\x0d\x0c\x3c\x32\x81\xe7\x91\x82\xcc\x44\x9a\xae\x04\xb3\x20\xd4\x1e\x9d\xd8\x13\xa7\x2b\xd6\xb8\x64\x59\x5d\xd6\xb8\xd4\x15\x1e\xaf\x06\xb3\x07\x2b\xa6\x41\x87\xc7\x63\x5d\x3c\x62\x4d\x1c\x3b\xf8\xd0\x84\x40\x7f\x4c\xdf\x46\xc4\x26\x0e\x74\xf7\x91\xf1\x89\x81\x8f\xb6\x6c\xb1\xdf\x08\xde\x73\x68\xf9\x8e\xae\xa9\xe3\x7f\xc2\x9f\xc1\xf1\xe3\x43\x93\xc7\xef\xa0\x5e\x83\x0f\xd7\x9e\x87\x5f\xab\x63\x83\xf2\x04\x17\x62\x68\xb5\x45\xcf\x79\x4f\x84\xe3\xc6\xba\x07\xba\x61\xbc\x7b\x06\x74\xff\x0f\xe2\xe8\x47\xe7\x13\x62\xac\xf1\xa8\x05\x8b\x16\x4c\x59\x35\x01\xa6\x50\x1e\x16\x61\xca\x82\xa9\xf1\x68\xe3\x7f\x1a\x7f\x07\x93\x87\xa2\xaa\x1a\x2c\x43\x01\x65\xea\x1f\xdb\x70\xf6\x49\xf0\x5e\x49\x0e\x16\x10\xeb\x7c\x1c\x8e\xcd\xe1\x83\x75\x9c\xff\xef\x54\x70\x16\x98\x89\x35\x6e\x43\x70\x07\xce\x99\xdc\x4b\xd1\x7d\xb1\x80\x7b\x68\xda\x39\x20\x31\xd0\x0b\xe3\xfd\x33\x60\x6f\x7c\x10\xc6\x13\xfd\x33\xe0\xd4\xde\xf8\x20\x5d\xb4\xf5\x24\x5f\xca\xcb\xf9\xb2\x5e\x92\xa2\x66\x52\x93\x51\xa1\x80\x62\x88\x11\x29\x09\xca\x42\xcc\x2e\x59\x94\x14\x4e\x87\x6d\x13\x16\x19\x94\xa2\x14\x86\x62\xc6\x15\x0a\x84\x19\x14\xa5\xf4\x30\x03\x2b\xc1\x5c\x4d\x31\x75\x49\x57\x4d\xc9\x84\x52\x12\x15\xb3\x10\x58\x29\x53\x54\xd3\x19\xa5\x0b\xe4\xf3\x48\x2b\x97\xcb\xb6\x25\x6b\xba\x54\x76\xf9\x41\x1c\x4b\x42\xf8\xd1\x58\xa7\xf5\xe0\x38\xa6\x66\x0d\x15\x97\x61\x72\xad\x85\xb3\xe7\xd4\xf8\x37\x4d\x67\x6a\x15\x4a\xb7\x95\xa8\x08\x65\x4a\x60\x6d\x13\xc9\x25\xc4\x72\xd0\xcc\x59\x8a\xa6\x1a\x42\xd4\xd6\x29\xcd\x06\x30\x56\x5f\x31\x94\x06\xcb\xe3\x66\xe3\x27\x3a\x65\xa6\x6d\x50\xd0\xd2\xd1\x34\x53\xcc\x70\x26\xab\xc9\xba\xa0\x8a\xb2\x15\x00\x69\x14\xcd\x64\x32\x28\x96\xc9\x64\x70\xfc\x0e\xf6\x65\x41\xd0\xb5\xfc\x75\xb4\xdc\xc8\xe3\x1c\x0f\x0c\x4c\xa9\x2b\xe1\xa9\xbd\x38\xa7\xcd\xd4\xf8\x39\x93\x71\x70\x7e\x20\xd4\x18\xf2\xc9\xbe\xb1\xee\x8d\x0f\x06\x15\x89\x33\x52\x52\x2d\x46\xc9\x8c\x15\xa6\x0a\xb6\x1a\xe5\x20\x28\x4a\x45\x54\x35\x21\x90\x62\x7a\x4c\x93\x51\xa6\x98\x44\xa6\x5d\x96\x28\x01\xca\x5c\xcc\xe6\x2d\x58\x0c\x23\x96\x92\xc3\x54\xac\x3e\xea\x4c\x18\x45\x29\x8d\xa1\x00\xad\x49\x32\x27\x49\x25\x18\x35\xb5\x5a\x49\x35\x44\x55\x31\xc4\x1c\x04\xc9\x92\x09\xd9\xb0\xca\x9a\xbc\x64\x9a\xb0\x58\x7f\x1b\x46\x10\xd3\x69\x87\x73\xe2\x43\xb1\xba\xce\x74\xb9\xfc\x27\xbc\xfd\x23\xde\xdd\x3f\xc7\x71\x72\xc3\x8f\xbb\x7c\x87\xe2\xe6\x48\x6f\x58\xf6\xff\xcf\xbb\x83\x93\x09\x7b\x8e\x67\x31\x46\xa9\x16\xa5\x17\x0a\xb6\x4a\xe5\x6c\x2e\x20\x56\x4b\x81\x24\xde\x1d\xd4\x28\xad\x56\x0c\x24\x6d\x3d\x10\x85\x15\xc4\xc0\x8a\x65\x8d\x9b\x96\xd5\x38\x7f\x4f\xc7\x24\xa9\xa4\x16\x25\x55\x52\x55\x09\xff\x91\x65\xb9\x24\x49\x76\xd4\x96\x79\x9e\x32\x2b\x0a\x4a\x2b\x00\x90\x67\x11\x5d\x2e\xfc\x31\x42\xff\xa8\x4d\x4e\x6a\xf8\x51\x82\xab\x32\x9b\xef\xbe\x75\x96\xb7\xaf\xc2\x39\xe7\x70\xf1\xfe\x49\x62\xef\x7f\xe2\xdf\x7a\x04\x7f\x57\x9d\xe0\x43\x80\x88\x6d\x6b\xec\x37\x57\x27\xb8\x10\xc0\x78\xc9\xd9\x33\x7f\x18\x00\x42\x87\x36\xaf\x57\x7d\xf7\xf6\xfc\xd1\xb1\x8d\xad\xcf\xe4\x3e\xeb\x52\xd7\xb6\xd5\xdb\x57\xd1\x1c\x38\x8e\xd8\xad\x75\xb0\x56\xdc\xc9\x2a\xce\x34\x8f\x81\xc5\x69\xca\xad\x14\xdf\x13\xef\x1e\xea\x0d\xf5\xf4\x0d\x76\x05\xfb\x87\xba\xfb\x82\x8d\xcc\x09\xd3\x07\x7d\xde\x4d\xd7\xb5\x70\x52\x78\x79\x18\x6e\xba\x67\xf9\xa5\x77\x4f\x7b\xe0\xd2\xcb\x12\x0c\xfa\xe4\x98\x4d\xfb\xee\x86\xd3\xa3\xe8\x60\x2d\x12\x62\x6b\x29\x39\xaa\x99\x28\x87\xf4\xa8\x65\x41\x0e\x1a\x48\x69\x7c\x84\xa0\x70\x28\x63\x75\x45\xc7\xcb\xf5\x0f\xb5\x68\xe1\x35\xd7\x2c\xb4\x3f\x7b\x6f\xda\xcb\xbd\xcf\x40\xf6\x23\x54\x79\xf0\x9e\xfd\x70\x11\x7c\x47\xb3\x33\x8c\xc1\x14\x73\x6c\xcc\x64\x28\x4b\xc7\xa5\x63\x24\x56\x09\xa6\xec\x0c\x94\x65\x94\x95\x81\x9b\xe3\xb4\x6e\xdb\x4d\x30\xc9\xd5\xb9\x75\x7f\xb5\x29\x7f\xd8\x53\x4d\xf4\xf7\xc4\xb1\x45\xee\x8d\x27\xfa\x69\xef\xd4\x84\x13\x5b\xd7\x1d\xef\x76\xf6\x13\x61\x8b\xfc\x05\xca\x19\x16\x9a\x30\x23\x96\x8a\xb5\x62\xb1\x2a\x50\x2a\x4b\x45\x2d\x5d\xb1\xd3\xc1\xec\x21\xde\xa4\x00\x02\x55\x81\x55\x58\x9e\x02\x14\x40\x15\x2d\xc5\x29\x1c\x54\x8c\x5a\xcc\x34\x03\xa5\x5a\xac\xfe\xa1\x4d\x96\xcd\x4a\x26\x27\x0a\x9c\x22\x98\x05\x89\xe3\x79\x54\xb0\x2b\x1a\x0c\x47\x39\x81\xe3\x79\x11\x55\x61\x38\xc6\x4a\x1c\xc7\x23\xc5\x96\x78\x9e\xb2\x2a\x0a\xca\x28\x8d\xf5\x97\x69\x72\xbe\xa3\x8b\x08\xee\x18\xe7\x74\x5b\x15\xf5\xed\xc7\xd4\xdb\xf3\xf5\xeb\x33\x4b\x2a\x80\x59\xb4\xfd\x21\xf0\x34\x00\xf3\x42\x6e\xbe\xa3\x4b\x43\xab\x68\x23\xd2\xbf\x7a\x49\xe0\x43\x10\x64\x16\xae\x5f\x76\xd4\x11\xe7\x3e\x35\x7f\x0b\x8e\xb1\xe3\x68\x93\xe6\xc1\x14\x10\xc5\x99\xcd\x7c\x18\x91\x0a\xf4\x1f\x07\x8f\x85\x75\x33\x58\x9f\xfe\x9e\x29\xb4\x29\x49\x6a\x36\x99\x53\xb9\x5a\x8c\x2f\x98\x69\xdd\x0a\xe4\x6a\x5c\x38\x90\xaf\x71\x34\x7f\xb0\xa4\x28\x51\x2b\xaa\x40\x19\x59\xa8\x24\x42\x00\x2d\xc8\x04\x00\x0a\x43\xa9\x96\x86\x92\x25\x39\xb1\xf1\x5c\x48\xa1\x35\xd7\x16\xf9\x4e\x3d\xc7\x7d\xe9\xec\x9d\x9c\x94\xa0\x2e\x95\xce\x84\x98\x94\x94\x62\xcd\x58\x32\x90\x1b\xaf\x70\x62\x57\x58\x51\xd4\x74\xb2\x28\xf3\x35\xcd\xd2\x4d\x15\x4a\x05\xbb\x42\x45\x03\x5a\x4d\xab\x7f\x82\x96\xa2\xc4\x24\xc9\x54\xd5\x1a\x90\x64\xc6\x62\x84\x34\x12\x03\x65\x43\x55\x60\x0c\x8a\x76\x36\x67\x57\x9b\xf9\x1b\xf0\xde\x67\x06\xe7\x21\x7a\xf3\x46\x8f\xbf\x4d\x85\x04\x9a\xc7\x52\x75\x02\x66\x3f\xce\xeb\x30\x3a\x11\x67\x70\x30\xd2\x38\xec\xd0\xe1\x6f\x43\x82\x24\x0b\x6a\x4c\x15\x38\xa4\x26\x0d\x33\x6b\x61\xc2\x56\x43\x1a\xb2\x24\x49\x50\x93\x9a\x90\x42\x7a\xcc\x34\x65\xe7\xcc\x55\xfd\x43\xf3\x07\xab\x8a\xc2\x58\x0c\x5e\x36\x28\x2f\xe2\x54\xf7\x00\x25\x61\xaa\x56\x81\x5c\x3e\x90\x22\xbe\x57\x51\xae\x3e\xe2\x3a\x64\x89\x2b\xbc\xf7\x53\x9c\xf7\x8b\x34\xe3\x88\xc5\xc6\x7b\xef\x7f\x13\xfb\xbc\x4d\x7d\xe2\xee\x35\xec\xfd\x04\x78\xb1\x88\x6e\x3f\x38\x9e\xda\x19\xa7\xad\xd7\x11\xed\x38\x7e\x79\x3f\xd6\x4b\x6f\xfc\x2f\xd1\x8e\x7d\xea\x9d\xd8\xf7\xcf\x9c\x41\xec\x33\x48\x8d\xe7\x61\xe8\x9d\x67\x10\xd7\xe3\xd8\x28\xa7\x1f\x27\x36\x0a\xdb\x7f\x2e\x24\xd2\x1a\xce\x09\x53\x5f\xd3\xe7\x3b\xe7\xaa\x9d\x28\xfc\x81\xee\xbe\xc1\x3e\x27\xf2\x15\xff\x5f\x73\x2f\x29\xde\x3a\x19\x80\x14\xe3\x40\xd2\xe2\xf8\x2a\x12\xb3\x86\x91\x4d\x22\x4d\x84\x5c\x12\x15\x4c\x0b\xc9\x54\x4a\x40\xb2\x98\xd2\x53\x02\xad\x89\xa2\xa8\xc5\x74\x21\x85\x04\xb6\xac\x40\x60\x42\x0b\x49\x61\x98\x46\x12\xad\x25\xb3\xba\x61\xe7\xa1\x69\x0b\x1a\x52\x2b\x46\x0e\x26\xa9\x24\x52\xa8\x94\x91\xc9\x28\x3a\xa7\xa9\x07\x4b\x92\x1c\x36\xc2\x32\x4c\x23\x15\x95\x34\xc8\x52\x16\x65\xa1\x18\x14\x6a\x05\x28\xaa\x22\xf0\xce\x29\x7a\xe3\xb0\x2d\x4a\x8c\x8f\x93\xef\x03\xb7\xef\x6f\xc4\x67\xe4\x27\xb8\x90\x80\xfd\x3f\x9c\x6b\x6c\xeb\x67\xde\xf5\x6e\x5c\x88\x33\x6e\x4e\xdc\x0f\x38\x12\xbc\x31\x71\x69\xe8\x01\x7a\x2e\x8e\x27\xae\xe3\x51\x07\x8d\x3a\x56\xa0\x91\x0b\x0a\x57\x96\x0b\x34\x2a\x94\x10\xb8\xb9\x8e\xb0\x3e\x4f\xd6\x03\xe7\xdd\x72\xe2\xeb\xd3\x6f\xd9\xfe\x72\xff\xbe\x67\x36\x9f\x66\x18\xf0\x42\xc3\x80\x77\xbe\x64\xdf\xfc\xd2\x4b\xd4\x26\xfb\xe6\x27\xe1\xcf\xd1\x19\xc1\x5f\x48\x12\xaf\x26\x35\x9e\x43\x46\xd2\x32\x72\xe9\x46\x11\x89\xe0\x57\x3e\xfc\xe4\xcc\xea\xfb\xb3\x4e\x44\xdf\x3c\x78\xd1\xa7\x28\x6a\x17\xa8\x41\xbb\x10\xfc\xf3\xc1\xeb\x6e\xbb\x8d\xde\x7a\x68\x61\x90\xad\xfd\x87\xd1\x75\x1b\x96\xed\x74\x54\x81\x1a\x32\x50\x51\x86\x02\x34\x03\x16\x8a\xe2\x31\x14\x9c\x77\x7f\x6c\x42\x08\xbd\x42\xdf\x14\x59\xf2\xf2\x8f\x41\x10\x7e\x83\x03\xb3\xcb\xcc\xa2\xd7\x8e\x06\x7d\xf6\x75\xdc\x1d\x73\x1b\xf6\x54\x75\xea\xce\x9a\x38\x3f\xd8\x70\xa3\x86\xef\x9d\x13\x42\x68\x5d\xbd\x3d\x73\xc6\x71\x4c\x84\x5e\xfd\x6a\xb0\xb9\xcf\x8f\xc7\x79\xac\x82\xc7\xd3\xf1\xb3\x43\x8d\x33\x33\xe0\x4c\x70\x0e\x98\x05\xce\xf3\x38\x1d\x27\xc5\x90\xa3\xa1\x9a\x54\x5f\xb7\x17\x99\xeb\x57\x69\xbe\x54\x44\x89\xfe\x38\x1d\x6a\x84\xb6\xc0\xbc\x62\x28\x30\xa9\x23\x05\x8a\xa8\x00\x59\x33\x10\x33\xeb\xde\x32\x54\x50\x1d\xaa\x09\x86\x26\x8a\x8a\x15\x4b\xcb\xa9\x5a\xc6\xb4\x02\xb1\x5a\xc9\xfb\x70\x7c\xca\xce\xa4\xb8\x80\x50\xcb\xd4\x3f\x14\xcf\x73\xaa\xa6\x19\xb0\x60\x08\x82\x20\x18\x88\x35\x4c\xce\x4c\xf1\x76\x5e\x92\x19\x83\x91\x59\x54\xa4\xc3\x3c\xaa\x72\xa8\xca\xa3\x4c\x8a\xe3\x52\x15\x19\x65\x64\xf2\xdd\x77\xe0\x78\x7b\x2f\xa7\x82\x97\xdf\x6c\x33\xce\xbf\xb7\xf7\x13\x62\xcd\x66\x30\xef\x8f\x65\x6f\xe3\x4e\x6f\x5f\x47\x75\xf8\x3a\x3c\xe6\x89\x5d\xce\x99\xbe\x07\xbd\xbe\xcc\xa6\x7e\x31\x1b\x31\x22\xdb\x26\xe6\x86\x1e\xa0\xef\x62\x96\x6c\xfd\x57\xed\xcf\x70\x2e\x07\x06\xab\xf5\x9f\xc1\xfd\xf6\xc6\xb9\x17\xcc\x5c\x82\xdb\x3f\xb2\xd7\xce\x53\x06\xd3\xcc\xa2\xad\xff\x02\xcf\xc3\xf8\xdc\xf4\xd0\x0b\x5e\x9f\x4e\x7c\xcc\x27\x98\x7b\xf9\x77\xe2\xb9\xf5\xe6\xbd\xd6\x35\xf6\xd7\x39\x2f\x37\x0a\xe6\x03\x32\x38\x3e\x1b\x40\x17\x4b\x49\xa0\xa7\x99\xcd\x14\xc0\x50\xdd\x7f\xeb\x06\xb0\x1f\xc0\xb8\x19\x60\xac\x40\xd4\x8e\x41\x16\x96\x25\x94\x42\x45\x0b\x55\x10\xa7\xc0\x2a\x0c\xdb\x6c\x57\x1e\x9a\x48\xb6\xec\x0c\x2a\x67\x21\x4b\xf1\xe3\xf9\xae\x94\x5d\x44\x19\x03\x2a\x54\x0c\xc7\x06\xdf\x33\xc1\x87\xd6\xd1\x2a\x38\x1a\x30\x60\x2a\x38\x01\xfb\x99\xc4\x99\xfb\x78\x4f\x3c\x08\x26\x87\x28\x88\x4b\x3e\x82\x40\xde\x12\xf4\x8c\x19\xcb\x66\x52\xb5\x77\xe8\xd2\xc1\x58\x30\x0a\x63\x05\xbd\x80\xca\x76\xd8\x28\x55\x74\x18\xa5\xd5\x83\xa6\x22\xc6\xac\x24\xdf\xf5\x77\xfd\x67\xa8\x84\x72\x1a\x14\x61\x4c\x12\x91\x58\x55\x61\x12\xbf\x93\x9b\xcf\x14\x9c\x88\x59\x8d\x46\xde\xd2\x38\x08\x86\x4e\x69\xbe\x17\xce\xd0\x1a\xa3\x74\x8b\x32\x6d\x99\x2a\xdb\x1a\x4c\xc2\x9c\x88\x92\xa8\x64\xa1\x12\x4a\xc9\xb0\x04\x81\xad\x51\x15\x5b\x0d\xf2\x90\x45\x05\x13\x15\x4d\xc4\xe7\x32\x55\x98\xaf\xe5\x02\x1c\xe2\x26\x80\x01\x01\x34\xcd\xfa\x4d\xa1\xb7\x56\x4e\xf4\x65\x85\x25\xef\x79\x8a\x73\x4f\x3d\x10\x73\x12\xc2\x16\x6d\xbd\xee\x7d\x89\x0e\x3b\x5d\x46\xac\x0c\x0b\x90\xb1\x2d\xaa\x50\x2b\x05\xb9\xba\xc7\x6b\xd4\xef\xaa\xe4\x32\x65\x98\xc1\xe7\xa9\x04\x54\x35\xaa\xf5\x3b\xb2\xc0\x7b\xcf\xba\xff\x75\x52\xeb\xdc\x79\x07\xef\xea\xf7\x9d\x05\x86\xe2\xe9\x00\xb0\x02\xc0\x56\x61\xcc\x79\xc7\x22\xcc\xa3\x94\x85\x4b\x1f\xd5\x6f\x9c\x83\x69\xc5\x56\x83\x51\x28\x23\xd3\xb4\x73\xa8\x9a\x86\x29\x4a\xb4\x79\x13\xa9\x50\x37\xa9\xb4\x5d\x40\x19\x43\x83\x95\x4a\xd3\x1f\xc2\xfb\x72\x7b\x9c\x7d\x61\xec\x27\x81\xae\x46\xdd\x1f\xbc\x8f\x72\x1c\x48\x12\x23\xd1\xd7\x1d\x77\xb3\xf0\x0d\x30\xb8\x58\x7b\x04\xf6\xd0\x7d\x27\x27\x06\xbb\x07\xf0\x81\x51\xad\x2e\x64\xa9\x5a\xde\xaa\x55\xba\xf2\x69\x43\xd1\xad\x5a\xd5\x92\x94\xaa\x58\xc8\x04\x2d\x59\xae\xa8\x16\xa7\xcb\x5d\xa5\xba\xb0\x99\xe3\x20\x08\xa8\xa4\xa8\xa9\xba\x68\xe7\xed\x6a\xae\xa4\x9a\x32\x94\x90\x66\x30\xbc\x1c\x60\x6b\x95\x58\xac\x91\xa7\x57\xa6\x15\xd0\x03\x8e\x3f\x9c\x64\x3b\x4f\x84\x13\xf4\xe2\xda\x31\x30\x2d\x22\x1e\x55\xea\xf2\x2d\xca\x30\x07\x81\xcd\x77\xe5\x33\x86\xa2\xa5\xbb\x4c\x58\x44\x49\xd3\xce\x4f\x80\x34\x4c\x52\xec\x78\xbe\x8b\xb5\x2b\xa8\xa0\x43\x8e\x0a\x53\x82\xa4\xaa\xba\x88\xf1\x85\x18\x7a\xa3\x3e\x2e\xeb\xea\x6b\x6c\xe1\xee\xd3\xe0\x57\xe7\x5f\x3c\xa7\x17\x90\xf2\x71\x8a\x9b\xd1\xb6\x83\x88\x04\x1b\x22\x82\xa1\x79\xc9\x8a\xa5\xa0\x23\x9d\x01\xde\x8e\xc2\x24\x2c\x88\x88\xad\x8b\x4a\x09\xa5\x14\x58\x86\x31\x3b\x1c\xe0\x51\x52\x10\xb5\x3c\x2d\xc6\x0c\xcd\xc9\xcb\x9c\x36\x91\x96\xc9\x14\xa1\x69\x47\xa9\x02\xd2\x4b\x46\x19\xca\x26\x14\x75\x59\x2d\xb9\x73\xe7\x62\x9d\x31\x5c\x35\x79\xcf\xb3\xae\x7e\x60\x1b\x79\x07\xc6\xf0\xf9\xd9\x5d\x0c\xe1\xfb\x8a\xcd\xb9\xde\x33\xd7\xe1\x9f\x30\x2f\xa5\xd0\x1c\x98\xec\x9c\x52\x99\x04\x9d\x7c\xd7\xf1\xee\x29\x03\xf1\x9e\xf8\xc9\x89\xc1\x46\x01\x4e\xf2\xf5\x26\xc7\xbb\x2a\x08\x30\x66\x41\xcd\x1b\x81\x14\x07\x59\x94\x96\xc4\xf1\x22\x55\xb1\xa8\xaa\x6d\xc2\x30\xd4\x04\x24\xd6\x17\x60\x05\x09\x32\x34\x2b\x76\x26\x98\xae\x56\x35\x45\x29\x65\x4c\x24\x48\x86\x24\x22\xa9\x5c\x36\x51\xda\xb2\xf2\xd0\xb2\x45\x2a\x8b\xe4\x92\x9e\x87\x7c\x63\x2f\x9c\x73\xe2\x3c\xd3\xb8\xe6\xd5\xd8\xdb\xde\xbb\xf1\x21\x0e\xc7\x1e\xe2\xfd\xe5\xfa\x1b\x7a\xef\x86\x73\xf1\xef\xc4\x78\x70\x6c\x2d\xd1\xee\xe4\xf0\xc3\x67\x2d\x77\x5d\x4e\xf4\x93\x6e\x8e\xd1\xd8\xef\x9b\xd7\xd3\xd5\xc6\x98\x32\xf4\xce\x1e\xa2\x1f\x27\x37\x85\xe1\xeb\x9f\xf5\xea\x1e\xe3\x7e\xf6\x4c\x22\xda\x9d\xeb\x4f\x6a\x3e\xa7\x9b\x47\xca\xa2\x55\x70\x5a\x13\x8d\x63\x80\xd2\x43\x8c\x2d\x80\x83\xde\x61\x5b\x77\x3b\x96\xae\x28\x4a\x92\x8b\x69\x3c\x0a\x43\x11\x56\x78\x47\x7a\xf2\x88\x17\xa9\x30\xe4\x10\x63\x51\x46\xdd\x9a\x5a\x01\xa6\x56\xe9\x52\x10\x27\x8a\x61\x9d\x87\x20\x8f\x62\x59\x33\x07\x55\x9b\xa5\xca\x48\xcc\xd7\x95\x5c\x29\x8d\xa2\x94\x96\x35\xb3\x59\x33\xeb\xc6\xcd\xe2\x7c\x2d\x7b\xff\x85\x9f\xf3\xc7\xde\xfb\xba\xf1\x71\xee\xb8\x4d\xf2\x6c\x92\x1b\xa7\xb2\x17\xc7\x9d\xec\x3d\xd6\x7b\xdf\x14\x39\x9e\x7b\x24\x9f\x7f\x8f\xfb\x89\x81\x08\xbd\xff\x62\x62\x7c\xb4\xe6\xf5\xa3\xb7\xb4\x8e\x9b\x3b\x2f\x2f\x76\xbe\x7e\xcb\xeb\x84\xac\x13\xf7\xdd\xfa\x75\x62\xbe\xd2\xcd\x79\xdc\xc3\x11\xef\x25\xe3\x58\x0e\xbc\x66\x76\x3f\x4a\xb4\x67\x88\xf7\x05\x9d\xe5\x64\xf4\x6e\x02\x3b\x38\x72\xb5\x0a\x5f\x7f\xa4\xef\x7d\xeb\xfd\xcf\xc3\xcf\xff\x28\xe1\xaf\xe0\x7e\x76\xe3\x9c\x85\x3b\x76\x83\x16\xfd\xeb\x3c\xe7\xd8\x9a\xb6\x76\xfc\x3c\xfb\xf2\xc4\xf3\x48\x38\x3f\x88\x82\xe3\xff\xff\xbb\xb5\xdd\x79\xce\xfd\xcf\x77\x1a\xcf\x08\xbd\x73\x05\xd1\x3f\x31\xbf\x3b\x1f\xef\xbc\x5e\xd6\x35\xfc\xa7\x66\x2e\x51\x8c\xeb\x57\x7f\xc1\x1b\x87\x9e\xd0\x43\x34\xcf\x2c\x7e\xfd\x3f\x27\xef\x99\xff\xd2\x79\x2b\x23\xf4\xd8\xd2\xd6\x7b\xef\x3e\xbd\x6d\xad\x3a\x31\x9c\xb8\xaf\xfa\x9d\xbc\xeb\xaf\xf7\xde\x21\x74\x60\x38\x10\x01\x3d\xed\x73\x70\xa0\x97\xb8\x9e\xd0\x73\xbb\xcf\x24\xda\xb3\x44\x3b\xae\xc7\x09\x02\x8d\x3c\xd5\x6e\x54\x00\x98\x4c\x94\x15\xf6\x2b\x6e\x77\xcf\x0e\xb3\xdc\x46\x7d\x55\xc5\x6a\x25\x4a\xb7\x4b\x30\x09\xf3\xd8\xe4\x62\x1b\xaf\x60\x1b\x5f\xa1\xf4\x5a\x09\xa6\x60\x19\x45\x29\x1d\x96\x83\xb9\x6c\xd6\xc8\xd9\x26\xca\x1b\x99\x1c\x94\x6d\x9d\xd2\x90\x55\xc0\x2e\x96\x9c\xb3\x15\x4c\x81\xa7\xda\xe5\x7c\xe7\x0f\x3c\xec\x29\x38\xb1\x78\xbb\x4e\xf6\xad\x2f\x71\x42\x27\xe5\x67\xf7\xa9\x3e\x3e\xb3\xae\xf7\x7e\xd6\x32\x96\x1c\xd9\xff\xea\xa3\xdc\x31\x10\x3c\x6c\xd3\x57\xd7\xf6\x93\x09\xc0\xdf\x8e\x6f\xc8\x48\xf5\x3c\x55\xb6\xf0\x31\x07\xde\xe6\x21\x03\xb3\xde\x38\x24\xeb\xe3\x10\xb6\xb9\xba\x65\x0b\x8a\x86\xae\x6b\x56\x2d\xa6\x8b\xa6\xa0\x07\xb3\xb9\x9c\x89\x80\x89\xf4\x4c\xa6\x0c\xf3\xb5\x72\x20\x8c\xc4\x09\x80\xcd\x18\x05\x58\xb1\xa0\x2a\xba\x65\x65\xc4\x8c\xd5\xb2\xd6\x56\x1f\xdd\x26\x2f\x66\x43\x26\x23\x74\xe6\x31\x62\x9e\xe5\xe6\x3b\x5a\x22\xf1\xee\x38\x36\x69\xd7\xec\x96\x7e\x38\x9f\x6c\x37\xe2\xc1\x53\x8d\xfe\x47\x66\xe3\xf3\x39\xd1\x56\xf9\xda\x77\x6c\x07\xf9\xd5\x1a\xfd\x8c\xde\xeb\xf5\xe3\xde\xd7\xe9\x67\xc7\xef\x3a\x3d\x3f\x43\xef\xfb\xd8\x9b\x53\x37\x2f\xe5\x6a\x5c\xcf\x73\xf4\xa7\x2e\x67\xe0\xd6\xf4\x23\xa2\x57\xfe\x9f\xb2\xea\xdf\x31\x90\x03\x9c\x19\x10\x6b\x69\xca\x40\x00\x46\x61\x56\xaa\xcf\x95\x89\xca\x88\x57\x61\x16\xcb\xac\x51\xcb\x41\x01\x56\x10\x43\xe9\xb0\x32\xae\x37\x7e\x0a\x96\x0d\xc3\x30\x6d\x80\xaa\x7a\x36\x0b\x25\x3b\x4b\xb1\x28\x9b\x35\xd3\x30\x1c\x00\x26\x62\xd3\xe9\x34\x8a\xa5\xd3\x69\x4f\x1f\x78\x67\xc7\xc6\xde\x6e\xd5\x73\x6b\xfe\x04\xc8\x33\x24\x6c\x23\xb7\x8c\x33\x57\x7b\xaf\x21\xf4\xa8\x41\xe8\xd1\xfd\x9d\xf5\xdf\xae\x2d\x6d\x7a\x1d\xb7\xef\x7f\x9f\x68\xc7\xf6\x61\xf5\x2e\xdf\x3a\xe0\x1b\xb1\x14\xf8\xfa\xc4\x5e\x1b\xef\xee\x77\xfb\xfb\xda\x79\x47\x9b\x1e\x22\xd6\xce\x1b\x7f\xe9\xd8\x17\xbd\xef\x5b\xbe\xeb\xb5\x48\x62\xc3\xf4\xce\x7a\xce\xb9\x7e\xc3\x19\x9d\xe5\x61\x57\xe3\xcc\xdf\xeb\x13\x62\x68\x13\x7d\x55\xa4\x7f\xfb\x85\x60\x5a\x60\x76\x24\x34\x36\x0f\x1c\x57\x63\x3a\xfd\xce\xce\x43\xad\x98\xce\x0a\x63\x7b\x40\xe2\x1e\xa9\x29\xa3\xab\xff\xde\xd9\x4e\xec\xf8\xef\xce\x7a\x7f\xdf\x6f\x5a\xc7\x7b\xff\x03\x6d\xe3\x4a\xcc\xc3\xce\xbb\x7d\x76\x42\x8b\x24\xf6\x7f\x0b\x3f\xcf\x19\x9d\xfb\x3f\x70\xac\xb7\x66\x8e\x0d\xdd\xd4\x58\x33\x4c\xe2\x8d\x7f\x9b\xd1\x13\xa1\xf7\x9f\x1c\x7c\xd7\x5d\xaf\xc4\xf8\x79\xb9\x0e\x58\xaf\x2f\x07\x6b\xdc\xd0\x79\x5c\x37\x7f\xe0\xf3\xf3\xeb\xef\x80\xe3\x98\xc7\xfa\xda\x64\xaf\x0f\x7b\xf8\x0f\x74\x9e\x7f\x2f\xf7\x63\xcb\x7d\xd7\x7c\x42\xb4\xeb\x44\x7b\xb9\x33\x76\xd8\xf9\x99\x0f\x6b\x78\x39\x10\x7c\x3a\x9b\xe8\x7f\xe7\x43\x9d\xc6\x3a\x42\xef\x7f\xaa\x33\xc6\xd9\x7f\x8b\x0f\xe3\x34\xe5\xeb\x5b\x44\x3b\x39\x9e\xdf\xef\x8c\xa1\xbc\x9a\x17\x3e\x8c\x10\xa1\xd7\x3c\x46\x70\x9a\x06\xcd\xba\x19\x0a\x7c\x67\xdb\x5b\x1d\x20\x1c\x13\xec\xd3\x4d\x90\x0d\x9a\xb6\x16\xe0\xb0\x15\xc9\x48\x88\x45\xe5\xba\x1b\x24\x28\xd0\x82\x51\x5b\x0c\xb0\xb6\x6e\xd5\x3d\x34\x4a\x85\xa5\xf1\x74\xe3\x27\x9a\xad\xe5\x4c\x13\x55\xf4\x4c\x16\x8a\x76\x96\xe2\x50\x26\x6b\xa4\x21\x63\x9a\xb0\x94\xcf\xe7\xed\x4a\x2e\x97\x23\xf8\x47\x4f\x9f\xec\x7c\xa4\x33\xbe\xdb\x33\xec\xb5\xa7\x48\x39\xde\xfc\x9b\xce\xd8\x62\xfb\x03\x84\xcc\xe8\x84\xbe\x3a\xd0\x59\xbe\xc7\xce\x25\xd6\x83\x93\x43\x1f\x9f\x15\x1e\xbe\xdf\x6b\x77\xfb\xdf\xa9\xe1\x75\xf2\x71\xb4\xf9\x9c\x84\x8e\xd9\xf9\x0e\xf1\x3c\x62\xf3\x79\xbc\x7c\x20\xfc\x04\x4b\x3e\xff\xda\x07\x3b\xcf\xe9\xae\x1b\x41\x83\x4f\x4c\x3a\xe7\x83\x1c\x7c\xba\xfd\xc2\xce\x6b\x67\xd5\x18\x68\xf2\xb3\x99\xe6\xfb\xae\xbe\xab\xed\x7a\x8c\xa3\x77\x7d\xd4\xb4\x69\x74\x15\xe7\xc8\x7e\x12\xbf\x6f\x3b\x1e\xc7\xfd\xef\xd8\xda\xf9\xbe\x7b\xbf\xd0\xe6\x6f\x1d\xf0\xad\x11\xc1\xb3\xbd\xab\x70\x1e\xcb\xb5\xc4\x38\x3b\xfd\xbc\x85\xfd\x80\x35\x84\x5f\x42\xac\xa9\x0d\xef\xb6\xfa\x8b\xce\x7d\x57\x0e\x13\xfd\x9b\xcd\xf7\xdd\xf0\x5c\xab\x5e\x73\xf0\xef\xc8\x2d\xc4\xf5\x52\x53\x87\xec\x9b\xe1\xd3\xcb\x5a\x24\x71\x60\xa8\xed\xf9\xad\xc6\xf3\x33\xf4\x9e\x79\xad\xba\x62\xfb\xd7\x0f\x8f\x7d\x18\x7a\x27\xef\x3d\x8f\xe8\xf4\xf3\xe2\xf5\x00\x44\x16\x8e\xbd\x0d\x8e\xe1\x00\x76\xe8\xbb\xc0\x9d\x13\x97\x87\x46\x71\xfe\x9f\x63\x40\x1f\xde\xc7\xc7\xd1\x9d\x2e\x82\xe8\x1b\x74\x7f\x6e\xfe\x7f\xfd\x33\xb9\x83\x8f\x0f\xe3\xf0\x0f\x5d\x03\xe3\xef\x7c\x97\x32\x2c\xca\xb0\x15\xcb\x56\x2c\x28\x59\x54\x15\x13\xe1\x96\x1d\xb6\x90\x75\x54\x60\xba\x15\x38\xc9\x5e\x00\xfb\xe1\x8f\x44\x74\x2e\x7a\xd7\x42\x7f\x43\x33\x96\xc0\xef\x42\xc6\xbe\x3e\x70\xb1\x19\x88\xae\x5f\xaf\x6f\xd8\x80\xaa\xbb\x76\x1d\x38\xa0\x8f\x8e\x8e\x8e\x22\x75\xdb\xb6\xc7\xd1\x3f\x9f\x5b\xbe\x11\x5e\x60\x7f\x44\x4d\x47\xc5\x6f\x2c\x5d\x03\xbb\x5a\xec\xb8\xf3\xbe\xc3\x5f\x73\x75\x4e\xbd\xfd\xc7\xb4\x0a\x8e\x70\x33\xa3\xcc\xc4\xec\x23\x43\x85\xfa\xe7\xc1\x6e\xff\xbb\xf5\xc4\xdd\xf8\x17\x5c\x0a\xac\xa7\x51\x56\x94\x0a\xf5\x47\x26\xf7\x05\x26\xcc\x52\x85\xcf\x67\xef\x83\x86\x05\x75\xa4\x5a\x48\xf9\x7a\xd7\x8e\xf1\x6b\x02\x33\x4d\xf3\xd0\x2c\x08\xcc\x4a\xc5\x54\x64\x41\x30\x45\x55\x29\xf3\x95\xae\x80\x5d\x45\x39\x94\x63\x8d\x64\x05\x86\x03\x5f\xac\x56\x8d\x6a\x15\x4d\x31\xe1\xbb\xe3\x4a\x70\x1d\x54\x90\x61\x4a\xd9\x8c\x99\xd6\x6a\x4c\x40\x46\xd5\x8c\x02\x45\x98\x69\xac\x63\xd2\xc6\x5f\x7f\x98\xf9\xfc\x49\xab\x8d\x72\xe4\x82\xc8\xa7\x9a\x22\xf5\x99\x6f\x3f\x8b\xf0\x3f\x37\xbc\xd7\x8a\x83\xdc\xfe\xdf\x6e\xc5\x28\xae\xfe\xe0\x7d\xeb\x52\x6b\xe8\xf8\xf5\x4b\x5a\xfd\x87\xfd\xff\xe6\x93\xc7\x16\x1b\xb8\xfa\x1b\xc4\xf3\x38\x38\xc1\xa9\x63\xb2\xca\xb7\x6e\xea\xb6\xee\x6d\xdc\x7e\x3c\x71\xbd\xd0\x7c\xfe\x75\x97\xb4\x8e\x83\x75\xaf\xcf\x56\xfb\xc7\x2d\xb1\x87\x6d\xc1\x71\x5c\x13\xeb\x6c\x40\x3e\x9d\xa0\x35\x74\xc2\xb0\xd2\x79\x0e\x76\x6f\xf1\x3d\xab\xe2\xae\xf1\xc4\x6e\x5c\xd5\x62\xf7\xd6\x96\xf5\x5f\xf7\x65\x13\x63\x4e\xe5\x81\x33\x88\xfb\xf0\xde\x7d\xee\x23\xfc\x8a\x3b\x68\x8d\x59\xb2\xfa\xb7\x81\x33\xc1\x51\x0b\xff\xc1\xb1\x11\xfa\xc0\xef\xda\xdf\x3f\xe2\xe6\xe6\xc0\x72\x7e\x21\x96\xf3\x46\x1e\x9d\x33\x01\x80\x91\xde\x10\x08\x4c\xef\xc5\x79\x8e\x70\x1c\x56\xdf\x5c\xe8\xc4\x5e\x75\x92\xf0\x60\xf5\xc3\xca\xd3\x13\xe0\x6d\xf4\xfe\xf2\x97\xd0\xbe\xbb\xe1\xb4\x79\x66\xc0\x32\x6d\xa3\xa6\xb7\x49\x37\x7d\x35\x8a\xfc\xcf\xd7\xe0\xf1\xf0\x0f\xe7\xc7\xd1\x91\x68\xec\xeb\xb0\x6f\xfc\x16\x33\x20\xd7\x4c\xd3\x80\x19\x24\x74\xad\x39\x9c\x84\xb7\xd8\x42\xac\xfb\xc6\x3e\x20\x6c\xad\x44\xe0\xde\xe7\x5b\xb1\xaa\x6b\x23\x8f\x68\xd3\xa1\x58\x16\x36\xff\xba\xf3\x3c\x8d\xfd\x8e\xb0\xd9\x44\xfb\xfa\x29\x9d\x65\xfc\xc0\xb9\x9d\x71\xcf\x86\xa7\x89\xeb\x0d\x02\x6f\x2d\x6c\x6d\x1f\xfd\x9b\x8f\x63\xf1\xad\xe9\x08\xbd\xf5\x64\xa2\xdd\xf1\x5b\xb3\x1d\x6c\x95\xf7\x5e\x3b\x7e\xe3\xd9\x60\xdd\xb1\xc1\xab\x26\xe3\xeb\xe7\x11\xef\x4b\x60\x94\x9d\x3f\x25\xfa\x27\xb8\x9a\xb1\x6f\xb6\xbe\xd7\x06\xdd\xc1\x10\xc4\x7d\x15\x6f\x5e\x12\xbb\xee\xc3\x52\x79\xaf\xf7\x1d\x8e\x0d\x72\xbe\xdb\x5c\xc2\x23\xb5\xd6\x93\x57\x27\xb7\xd8\x5c\x6c\xe3\x66\x13\xfe\xa8\xe9\xfa\xa3\xfd\x6e\x95\xb3\xff\x17\x77\x42\xc4\xa7\x84\x30\x8b\xa0\x07\x62\x69\xcc\xa3\x58\x76\x15\x46\xa1\x29\xa2\x14\x2a\xa6\x51\x05\xb1\x32\x4c\x43\x80\x00\x65\xd5\x4a\x30\x46\x01\x04\xca\x0a\xa7\x73\x32\xc5\x51\xa0\x6a\x89\xa2\xa5\x06\x8b\x96\x65\x59\x36\x87\x2a\x5a\x3a\x03\x65\xdb\xa0\x64\x94\xc9\x19\x16\x0c\x53\x39\xcb\x4e\x41\x23\xa6\xea\x82\xae\x2a\x48\x81\x46\x32\x99\x56\x59\xa3\x29\x27\x84\x9f\xbe\xf3\x22\x62\x9c\xf9\xe6\x78\x7a\xf9\x8d\x5a\xe4\x6d\xeb\x97\xbd\xf9\xe2\x48\xcc\xb4\xe3\xe5\xce\xd7\xaf\xfb\x4b\x2b\x6e\xde\xdf\x2e\x0f\x6a\x73\xbd\xac\x60\x7d\x7a\x47\x8d\x24\x56\xed\x6f\x68\x15\x6f\x3e\x1c\xff\xf4\x8f\xcd\xf9\x68\xc7\x2e\x6f\x8c\xb7\x62\xac\x03\x37\xb4\xf9\x6a\x24\xee\x7f\x82\x90\x1f\xa5\x29\xcf\x16\xec\xdc\xff\xaa\x88\xdb\xae\xe0\xf3\xa0\xde\x38\x0c\xdf\xd3\x79\x1c\xd6\x9b\x9d\xef\xbb\xf5\xaa\x36\xdb\x35\xe8\xb3\x15\x2d\xd8\x77\xd5\xbe\xce\xd8\x7a\xf8\x6e\xa2\xdd\xc9\xfd\xbc\x0c\x9f\x5b\xc3\x15\x85\x86\xef\xf2\xfc\x00\xab\x39\xd6\x3b\xfe\xcb\xbb\x37\x4b\xe2\xf7\xe1\x3b\xdd\x76\xa3\x71\x2e\x73\x25\xe6\x62\x86\xef\xf0\xe6\xa0\x91\x6f\x0f\x73\x49\x23\x1d\x71\x7d\xa4\x89\xeb\x5b\x38\xa6\xb5\xf3\xbc\xfb\xfa\xfc\x92\xbd\x97\x10\xd7\x93\x78\x47\xee\x8c\x43\xd7\x47\x3a\x8f\xf5\xda\xb9\x9d\xc7\x7a\xed\xa7\x84\x0c\x59\x4d\x4e\xca\xba\xbc\x33\x1e\xdf\x73\x5a\xe7\x7e\x86\x97\x78\xb8\xbe\x81\x5b\x3f\x66\x40\x84\x1e\x99\x57\x6d\xf6\x8f\x9f\x07\x5b\x64\x77\x94\x86\x17\x13\x72\xa4\x37\xfa\xda\x76\x99\xcf\xc6\xeb\x8d\x77\x1b\x3b\xb3\x23\x86\x4f\x6c\xfd\x1b\x96\x9a\x8a\x77\x1f\x3c\x4e\x5b\x39\x1c\x3b\x3d\xbb\xf3\x38\x39\xf9\x6d\x40\xd0\xe5\x7a\x39\xe2\xfc\x97\x17\x77\xdb\x8a\x72\x9d\x40\xf7\xba\xde\x0a\x0e\xc6\x7b\x1a\x7e\x6a\x1d\x20\x1b\x74\xc9\xce\xc1\x92\x9d\x0a\xb0\xb6\x04\x93\x30\x2d\xa0\x98\x73\xfc\x88\x93\x61\x06\x46\x6d\x39\x10\xb3\x79\x58\xb2\x73\x5d\x61\x54\x40\x49\xc8\xa1\x1c\x2c\x42\xd6\x84\x1c\xcd\x99\x19\xbb\x9c\x31\x51\x55\xb1\xd2\x50\xb0\xf3\x54\x12\xe5\xd3\xba\x51\x35\x33\x54\x34\x93\xc9\x64\x70\xa4\x70\xb9\xec\x5b\x87\xdb\xdf\x6b\x5b\xb7\x66\x13\x9b\xa5\x9f\x25\x64\x29\xd3\x94\xed\x6d\x8d\xf3\xd4\x43\x13\x0b\x42\xdf\xa4\x55\x66\xf1\xb6\x1f\x5e\x39\x3e\xef\x5d\xee\x4c\x66\xe1\xc8\x6c\x6a\x7c\xee\x9d\x6e\x9d\x17\x6f\xce\x77\x70\x1d\xee\xa3\x46\x12\xdb\xee\xf7\xb5\x7b\x7b\x70\x0e\x76\xdb\x36\xde\xfa\x5c\xdb\x26\x75\xb8\x5e\x8b\x24\xb6\xaf\xab\xcf\xdf\xf6\xf5\xf8\xdb\xb7\xfc\x36\xd2\x91\x05\x2f\xf7\x52\x8b\x3c\xef\xd8\xe2\xc9\x2d\xe3\x62\xaa\xbe\x72\x3e\x92\xd8\xbe\xa6\x94\x8f\xd0\xdb\xd7\x56\x75\x57\x16\xf2\xb4\x16\xe9\x3f\xf0\x18\x35\x75\xa2\xd2\x90\xed\x75\xc1\x58\x8b\x3e\x75\x7c\xb5\xf4\x27\xc4\xbd\x30\xce\x58\xd5\x8d\x65\x65\x19\x81\xb1\x37\x7a\x3e\xd9\xc2\x1d\xab\x8f\x05\xf3\x59\xae\xd5\x86\xe3\xb1\x4e\xff\x99\x58\x57\x8e\x2e\x7f\xc6\xa7\x9b\x9b\x38\xde\x99\x9b\x2f\xb7\xea\xbc\x1d\x0f\xb4\xe8\xbc\x46\xfd\xa5\x85\x3e\x1b\xde\xb2\x0e\xb7\x1f\xdf\x19\xb3\x8c\x08\xad\xd7\xef\xb8\xc4\x37\x27\x33\x26\x22\xa1\xfd\xf4\xa5\x4c\x62\xfb\x9a\xd7\xde\x66\x96\xec\xb2\x03\xe7\x4e\xfc\x78\xb6\x36\x7f\x13\xb3\x70\xac\xef\x37\xef\xcf\x7b\x74\xfe\xbb\xde\xfc\xe0\xf7\xd9\xf6\xcd\x36\x9b\x65\x12\xef\xff\x51\xe7\xe7\xdb\x71\x6f\x67\x3d\x37\xfc\x55\x42\xcf\xe1\xfe\x1d\x5d\xbd\xe3\x54\xfc\x5b\xac\xf7\x4e\x1e\xb7\x11\xa1\x0f\xfc\xa6\xb3\x6c\x6c\x9b\xe9\xb3\x07\xf5\x31\x5b\xd6\xf6\xac\x84\x0f\xb5\xef\xa7\xc4\x98\x11\x7b\x87\xe9\xff\x6e\xd5\x81\x7b\xce\x68\x5b\x0f\xe9\x26\x6e\xd8\x86\x6d\x04\x08\xe0\x1a\x29\x79\x1c\x43\x35\x13\x7c\x89\xc4\x40\x89\xee\x01\xa6\x37\xde\x13\x8f\xf4\xce\x1a\xea\xa5\x42\x11\x7c\x24\xa1\xef\x64\xb7\x80\x1b\x15\xc0\x0a\xc6\x4d\x12\xd1\xf8\xa5\x06\x68\xa7\x71\xe8\x72\x16\x5a\x26\x8e\xa8\x2c\x33\x16\x43\x85\x11\x88\x72\x0a\x6f\x2a\x96\x2a\xa4\x62\x06\x9b\x4d\xa5\x79\xab\x22\x42\xc6\x90\x92\xe3\x06\x2c\x21\x29\x68\xe8\xa2\x2e\xe8\x87\xca\x30\x6d\xd6\xdd\xd8\x9c\x2e\x2b\x8a\x69\x95\x25\xc8\x19\x48\x09\x66\xf2\x79\xa3\x50\x85\x2c\xca\x57\x8c\x09\x50\x4e\x97\x53\x28\x57\x44\x45\x98\x4c\x22\x3e\x6b\x65\x74\x2d\x9d\x85\x2c\x14\x8d\x42\x45\xb7\x04\x4b\xaf\x55\x8a\x45\x43\x96\x25\x43\xe2\x11\x07\xab\x85\x8c\x56\x84\xe1\x8e\x6b\x69\x7b\x63\x2d\x71\x13\x7c\xa8\x88\xd7\xfa\x8b\x3c\x88\x24\x76\x53\x2a\x60\x16\x8e\xad\xfa\x7b\x70\xee\xe8\xfc\x77\xc9\xdf\xdb\x3a\xd8\x86\x69\x1c\xbf\xb2\x17\xdb\xec\xa9\x8d\xd5\xd3\x3e\xdf\x5e\x3e\x37\xaf\x46\x89\xbb\xa6\x46\x5b\xdb\xf7\xfd\xc0\xb7\xa6\xbc\x3c\xf6\x8e\x1c\x6c\xbb\xb9\xb3\xad\xd8\x8a\x5a\xf5\xd6\x88\xe4\xe3\xac\x3d\x7b\x74\x60\x66\x43\x93\xb5\xfb\x01\x0c\x3d\xd2\xc0\x71\x72\x43\x6e\xd2\xb8\x3e\xdc\x36\x40\xac\x89\x6c\xf3\xbe\x63\xcf\x77\xb4\x77\xf4\xf0\xed\xbe\xe7\xf7\x38\xa2\xb1\x03\x9d\xd7\x83\x97\x8f\x2e\xd5\xc0\x4d\x3b\x71\xfd\xf6\x0d\x1c\x31\xa6\x7e\x5f\xa0\x99\x7b\x4e\x6a\xd4\xac\x19\xfb\x09\xbe\xf7\x6d\xbe\x76\x39\x92\x18\xfb\x29\x20\xf7\x75\x5a\xf0\xc2\xd8\xf6\xce\x3e\xce\x08\xb9\x77\x46\xee\x33\x74\xb9\xed\x67\x4d\xf0\xa1\x03\xf4\xc3\xcc\xe2\x1d\xdd\x17\x06\xe7\x2d\x9e\x5f\xa8\xeb\xa1\x8f\xc1\xdc\x65\xad\x35\x74\xb1\xcd\x4b\xa4\x3f\xc0\x96\xef\x37\xde\x33\x5c\x59\xf7\xa7\xb7\x2d\x0a\x5c\x02\xc0\x45\x2f\x73\xee\x8e\x87\x97\xff\xa3\x3e\xf6\xa7\x35\x65\x01\x04\x01\x3b\x71\x66\x7d\x2c\xc1\x11\x60\x32\x38\x11\xd7\x12\xc5\x31\x3b\x78\xf5\xcd\x9a\xde\xe1\x27\x88\x93\xd5\xe2\x98\xee\x29\xa1\x49\xb0\x0b\x2f\x4f\xfc\x1d\xde\x13\x75\xd2\x66\x13\x1e\x37\xe8\x12\x0d\x41\x54\x04\x43\xd4\x14\x68\xe9\x82\xa2\x89\x86\x64\xea\x30\xa3\x0b\x12\xfe\x51\xb3\xdf\x63\x53\x72\xd5\x30\x62\x49\x2a\xa9\x89\x65\x54\xcc\xf0\x94\x69\xa1\x58\x4a\x57\x65\xb5\xb6\x15\xbd\x03\x2f\x5e\x05\x4f\x47\xbf\xc8\x3d\x7d\xfb\x5d\x0f\xac\xba\x3b\x73\x37\x3c\x81\xd6\x52\x05\xd3\xb4\xf8\x7c\x26\x57\x4e\xe5\x4d\x33\x2d\x14\xc8\x9f\xc6\x3f\x63\x93\x4a\x0e\xb2\x02\xc7\xe9\x7c\x5e\xcd\x1b\x6c\xda\x80\x45\x5e\x90\x34\x25\x30\x6b\x25\xbc\x0f\x0d\xaf\xb4\x56\x1a\x2b\x9f\x57\x6a\x5f\x0c\xac\x43\xef\x97\x64\x78\x5f\x63\xfc\x7e\x48\x3f\xc6\x2c\xde\xce\xca\xc1\xb9\xef\x71\xad\x3e\x23\xa1\xe7\xcd\x1f\xb6\xca\x1c\xd6\xdb\xf4\xd6\x99\x3e\xac\xee\x62\xef\x48\xa2\x8e\xba\x23\xf4\x06\x8e\xb0\x75\x46\x24\x31\x66\xb6\xad\x4b\x02\x7b\x6f\xa7\x0e\x83\x8d\xbf\xe4\xdd\x23\x49\x62\xe3\xed\x73\x3a\xfb\x27\xdb\x8e\xe8\xec\x27\xac\xba\xb0\x33\x5e\xda\x0e\x7d\x36\x59\xf3\xda\x9f\x23\xae\x27\xf4\x44\x7a\xf4\x30\xeb\xf5\x2b\xbe\x31\x6a\xe2\xdc\x13\x88\xf6\xbb\xbd\xe7\x59\xb4\x77\x74\xe2\x2c\x10\xbc\x70\x6c\xfe\xcf\xda\x6c\x55\x62\xf7\xaf\x31\xd7\xf4\x1b\xff\x7d\x46\xfa\xb0\x3e\x7a\xab\x33\x0f\xb0\xae\x8d\x23\x5e\xc5\x1c\x86\x7f\xc0\xef\x37\xb2\xcd\x5d\x13\x2e\x7e\x03\x27\x81\x3e\x7c\xba\x66\xa1\xb3\x26\xa6\xd4\x4d\xd8\x49\x70\xe0\x1c\x5c\x7a\xe5\xe4\x84\x7b\xbe\x3b\xd8\xdf\x7d\x4a\x20\xd1\x1f\xec\x21\x23\xac\x0f\xc3\x3d\xd1\x15\x3e\x5f\x88\xc2\x0c\x52\x79\x2d\x99\x8c\xea\x31\x51\x90\x4b\x3c\xd2\xd2\xd9\x54\x1e\x95\x79\x58\x65\x98\x30\xca\x05\xee\xb3\x6c\xdd\xb2\x28\xd5\xd6\x6b\x5f\x6b\x27\xa5\x34\x3d\x16\x95\x45\x43\xd7\xf2\x6c\x56\x29\xe6\xca\x31\x4e\x13\x52\x22\x55\x66\x50\x41\x90\x62\x86\x6d\xd4\xb2\x9a\x16\xe0\xed\x02\x34\x03\xcc\x61\x09\xaa\x76\xac\x34\xfa\x50\x67\x3d\xba\x0a\xd7\x21\x70\x73\xdf\xaa\xb4\x86\x6b\xa0\x9d\x06\x16\x34\xce\xbf\x91\x55\xa8\x02\xf5\x57\xc5\xd1\x6f\x8d\xd0\xac\x48\x30\x94\x98\xee\x70\xce\xfe\x11\xa1\x9d\x11\xe1\xb3\xaa\x15\x63\x91\x82\xb8\x64\x25\x6d\xa5\x2d\xc8\xc0\x58\x8a\xbf\xc8\xca\x4c\x00\x11\x4a\x3a\x12\x61\xde\x82\x05\xc4\xe7\x60\x4c\x2a\xdb\x87\x60\x19\x45\x6b\x4f\x14\xcd\x42\x41\x93\xe4\x14\x67\x72\xb2\x92\xe7\xf2\x41\x2b\x57\xe2\x79\x8e\x8f\x6a\x59\x28\xb3\x28\xad\x31\x29\x91\xaf\x9d\x6a\xe7\xa9\x18\xaa\x98\x66\x0e\xa6\x8c\x7c\xde\x40\x39\x33\x63\x4e\x37\x82\x47\xe0\x41\x91\xb3\x69\xd3\x54\x6b\xc9\x00\x5f\xcc\x35\xc7\xc4\xe7\x53\x30\xf4\xbe\x05\x84\xcc\x13\x6b\x73\xeb\x63\x44\xbb\xdc\x94\xa1\xf5\xc7\x10\xb2\x25\x37\xaf\x1f\x2d\xfa\x64\xce\xb3\x5d\x5e\xae\x4a\xd6\xab\x17\xee\xc4\x27\xe1\xfd\x16\x10\x06\xc2\xc4\x05\xa1\x11\x5c\x3f\xbf\x79\xbe\xfe\x1c\x30\xcb\xd9\xb3\x98\x3e\xd0\xcd\xc0\xfe\x53\xf0\x29\xd3\xa1\x81\xee\xbe\xe9\xee\xbf\x6d\x63\xed\x48\x1f\x1c\xe8\xee\xa3\x7e\xd9\x95\x1b\xe7\xe0\x43\x23\xe8\x9d\x47\xe1\x71\xe8\x8f\x70\x0f\xba\xe2\xf5\x27\x9f\x84\x08\xee\x43\x97\xbd\xba\x62\xc5\x21\xae\x62\x96\x4a\x86\x2c\xf3\xbc\x29\x28\x4a\x91\x2f\x05\xa7\x5a\x56\x10\x99\x6f\xd4\x92\xe8\x02\xf4\xc7\xeb\xc6\xe1\x93\xd4\x95\xf6\x4b\xcf\xc2\xbb\x9f\xb4\x9f\xd7\xe0\xc3\xb0\xd7\x13\x31\x4b\xad\xc5\x02\x12\xaa\xa6\x15\x28\xc0\x2c\xbc\xfa\xa0\xd6\xca\x67\xe0\x31\xb2\xee\xf2\xf8\x12\x77\x2c\x76\x38\xf5\x2b\x6e\x6d\xe5\x51\xdc\x76\xa9\xb3\x2d\x5d\x13\xec\xac\xd7\xf6\x7d\x8f\x68\xc7\x67\xa6\xf6\xe5\x3a\xfb\x61\x0e\x57\xbd\x6e\x0d\x68\x72\xd5\x9e\x9e\x5f\xf7\x5c\x9b\x6e\x26\xdf\xe1\x9a\x4e\x76\x21\x42\xaf\xbf\xac\x0d\xa3\xe0\xeb\xb7\x3e\xeb\x61\x91\x94\x23\x47\x18\x85\x34\xf8\x80\x5b\xdc\xe7\x65\x49\x7d\x9e\x11\x5a\xd7\x63\x86\x6d\xe1\x31\x1b\xbc\xd8\x17\x30\xe7\xee\xec\xd2\xdf\xdc\x49\x17\x8f\x90\x9c\x2e\xdf\x5c\xf3\xfb\x7e\xed\xf3\x0d\xb4\x48\x62\xdd\xe5\x6d\xfe\x17\x11\x1f\xb2\x1b\x9f\xd8\xde\xbd\xdc\xfb\xee\x11\xfa\xa9\x06\x16\xd9\xbd\x3c\x78\x24\xb3\x68\xf9\x0f\xe1\x1b\x00\xcc\xcc\x73\x1d\x75\xc9\xbe\x9d\x9d\xb1\xe6\xee\x73\x3a\xda\xa2\xc4\xee\xbf\xd6\xbf\xdd\xf0\x3e\x81\x67\x3d\xdc\xea\xe5\xcc\xf5\xee\xb1\xe6\xdb\x9f\xe7\x9b\x65\xce\xe9\x74\xef\x08\xbd\xfb\xea\xce\xdc\xd4\xd6\x04\xc1\x89\x11\xf8\x74\xad\x4d\xac\x59\xab\xe9\x97\x6d\xbf\xab\xd5\xfe\x6e\x8d\xfb\xe6\xeb\xac\x89\x05\xa1\x8d\xb4\xce\x2c\x1e\xfb\x6f\x38\x3e\xef\x6e\xee\x4c\x66\xe1\xae\xdb\x22\x60\xde\x5d\x5c\xc3\x67\x70\x75\xcc\x2e\xb1\x89\x53\x87\x6f\xf2\x7c\x70\x8c\x01\xde\xbc\x0b\xf8\xf7\x8f\xdc\xbc\xae\xbb\x4e\xc4\x5c\x36\x8e\x24\x1c\xbe\x91\x90\xc1\x86\x6c\x26\x76\x27\xf1\xdb\xf6\xe3\xef\x34\xbc\x96\x8c\x48\x22\x3d\x0b\xdb\xf0\x41\x62\x0c\x04\x82\x87\x98\xd9\x19\xdf\x8e\x92\x1c\xaf\xd0\xd4\x97\x63\x57\xb7\x61\x16\x87\xcb\x5d\x47\x60\xf1\x6c\x93\x2f\x1c\xbe\xc1\x7b\x0f\x17\x6b\xec\xfc\x2d\xa8\x44\x12\xaf\xe6\x40\x25\x42\x6f\x75\x72\xc8\x8b\x8d\xbe\x76\x4d\xc5\xef\x88\x2b\x60\x0c\x5f\xdf\x69\x8e\xbd\x7c\xba\x62\x63\x6e\xd2\x97\xe2\xb5\x81\xbd\xb3\xe1\xeb\x3a\xc9\x64\x66\x26\xb1\x36\x88\xbd\xbb\xad\xc7\x77\xf6\x9b\x47\x5f\x6c\x95\xbb\xad\x1f\xb4\xc8\x5d\x8a\xf4\xaf\xf6\xfd\xde\x87\x09\xeb\x6b\xff\x67\x2d\xfe\x34\x47\xda\x9c\xd1\xe1\xce\xf8\x6b\xe5\xab\x44\xbb\x42\xd8\x22\x96\xf0\x1d\xf1\xf5\x7b\xff\x09\xfc\x7c\x78\x43\xdf\x39\x72\x9d\x27\xae\xc7\xe3\x9a\x7e\xdf\x77\xbd\x17\xa3\xe6\x1b\x6f\xb1\x93\x6f\x97\xc1\x58\x14\xd0\xae\xbe\x79\xd8\xb3\x53\xa7\xe1\x93\x7c\x75\x9b\xd4\x72\xee\x6c\x3a\x3e\xc7\x3f\x18\xef\x99\x42\x79\x85\xeb\x66\x0d\x35\x1d\xff\x2e\x1f\xf3\x08\xff\x6c\x9a\xf0\xbf\x56\xa1\xc1\xd5\xab\xe1\x4f\xd0\xa0\x46\x09\x76\x86\x7a\x3f\x6b\x49\x29\x3b\x13\x00\x3a\xaf\x29\xaa\xac\xa4\x0b\x42\x5e\x4f\xe7\x6a\x6c\x80\x4d\x07\x62\xb6\x04\x19\x98\x11\x10\x8b\x4a\x69\x54\x46\x29\x05\xa6\x21\x63\xcb\xf4\xc3\xf6\x3f\xae\xb0\xbf\x21\x08\xd4\xc5\xe8\x49\xd8\x05\x1f\x51\x29\x55\xd7\x33\x86\x12\x45\x59\x49\x51\x15\x45\x49\x0b\x16\xa7\x1b\x7a\xad\x6c\x59\x7a\x59\xb5\x2c\x98\x42\x51\x58\x45\xf9\x8c\xa1\x97\xbd\xf9\xc6\x31\x63\xaf\xdf\x54\x5f\x4f\x63\x5b\x70\xb4\xd1\xb2\x4e\x32\xb5\xe1\xa7\x9f\x37\x96\xbb\x7a\xdd\xf1\xbf\x30\xf4\x3c\xfd\x98\xbb\x16\xfa\x77\xa1\x89\xaf\x82\x60\x24\x34\x76\x41\xe0\x09\x10\x6c\xd7\x91\xa3\x9f\x74\xc2\x67\x11\x7a\x77\xc2\xc7\x95\xa9\x91\xc4\xe8\x21\x9f\xde\xa9\xcf\xf3\x6a\xfa\x39\xf7\x3e\x4b\xf6\xee\x9d\xb8\x00\x1c\x77\x01\xe0\xea\x98\x3b\x33\x71\x13\x00\x17\x5c\xcf\xcd\x24\xd7\xf8\xda\x0b\xda\xe4\x33\xdd\xc0\xef\x11\x7a\xf4\xdb\x5e\x7b\x8a\xdc\x8f\x1b\xfe\x32\xa1\x93\xf0\x3a\xca\x1c\x5b\x1f\xa7\xd7\xfe\xe8\xb2\x06\x0c\xae\x13\x86\x73\x88\x80\xf9\x6e\x6d\x3c\xb7\x8a\xa7\x2b\x09\xe4\xf9\xba\xa6\x28\x74\xf9\x48\x68\xcc\x3c\xe3\xfc\x88\x4e\xc6\xe8\x44\xff\x50\x9c\x0e\x9d\x02\x9d\x30\x8d\x9e\x40\x89\x63\x03\x29\x24\x5b\xba\xcc\xf1\x95\x0a\xd4\x4c\x98\x42\x79\xbb\x1c\xe0\x6c\x01\x86\x61\x5a\x44\x29\x54\xb2\x50\x15\xf1\x0a\x34\x20\xb0\x95\x00\x6b\x97\x51\x11\x26\x4d\xa8\x4d\x80\x09\x90\x34\x54\xbb\x1a\x88\xc5\xa2\x54\x94\x65\x59\xbb\x22\xf2\x50\x82\x79\xa4\x59\x48\xa3\x0d\x5e\x32\x44\x45\xe5\xd8\x28\x93\x95\x65\x03\x55\x55\x23\x23\xa6\x35\x08\x90\x02\xcd\xaa\xa1\x2b\x59\x43\x85\x61\x43\x92\x32\x4c\x58\xe1\x64\x23\x99\x44\xd9\x58\x94\x95\x52\x8c\x9d\xd3\x75\x5d\x6f\xdf\x77\x59\xb1\xa3\xb3\xad\xda\xd2\xd3\x59\xf7\x0c\x5f\xdb\x19\xa3\xaf\x7b\xbc\x95\x47\x74\xda\xb7\x8c\x11\x3e\x4d\x9a\x56\xbd\x3c\x1b\xe7\x37\xf8\x39\xe2\x40\x63\x6f\xe8\x94\xe9\x5e\xc6\xca\xee\x78\x90\x38\xcc\x18\x20\x32\x98\x41\x17\xe3\x4f\x8f\x9b\x30\x69\x06\x78\x03\xb2\xa8\x00\x25\xa4\x64\x2b\x22\x2a\xa1\xaa\x6d\xe5\x50\x5a\x86\xac\x89\x24\x28\xa0\x22\xcc\x05\xf8\x5a\xb6\xf1\x31\x60\xd1\x84\x15\x94\x29\x41\x4e\x42\x59\x54\x36\xab\xc8\x54\x20\x07\x01\xca\xd2\x31\x51\x14\x45\xdd\xce\xe8\x0a\x6f\x29\xe5\xa2\xae\xcb\x8a\x4e\x09\xaa\x8a\x0c\x0d\x59\x32\x4a\x1a\x86\x91\x55\x2c\x13\x86\x51\x12\x16\x26\x80\xa1\xcb\x05\xef\x9d\x9d\x31\xfa\xa8\x8d\xa7\x24\xc6\x68\xf5\x93\x9d\xf1\xe2\xba\xcb\x3a\x63\x92\x95\x2f\x77\xe6\x72\xf7\xc9\xad\x38\xd2\xa9\xa7\x3f\xe6\x8f\x5f\xf5\xf4\xed\x9b\x9f\x74\xe6\xe9\xd6\x69\x9d\x7d\x82\x0d\xff\xd1\xca\xe3\xae\xfb\x5d\x1b\xae\x71\xd6\xa3\xc3\x59\xfd\xbd\x33\x4f\xb0\x0f\xe7\xbb\xc7\xe7\xc3\x9c\x3a\xfa\x7d\x60\x91\x6f\x67\xba\xbe\x5c\x70\x8a\x15\x27\x21\xc4\x29\xd3\x9d\x34\x36\x83\x71\x88\x4b\xb7\x77\x91\xd9\xea\x1a\x5f\x79\x27\x6e\x4c\x7c\x96\xac\x56\xa2\x24\x13\xa5\x60\x1a\xb2\x12\xaa\x22\xc3\x42\x45\x24\xf2\xb0\x54\xd7\x9d\x26\xa5\xd5\xca\x74\xd2\x44\x49\xa8\xc0\xac\x84\x4c\x64\x59\xa8\x84\x38\x1e\x56\xbc\xaf\xeb\x9d\x44\xeb\x57\x09\x82\x21\xa0\x7c\x96\x53\x4c\xdd\xd4\x32\x96\x25\xe8\x82\xc5\xe5\x20\x27\xd4\x54\xa4\x42\x20\x65\x25\x53\xce\xa0\x2c\x94\xf2\x8a\xa1\x14\xf8\x2a\xd4\x04\x9d\xe3\x74\x01\xb8\x5c\x2b\xc6\x40\xab\x8e\xc2\xb8\xf0\x48\x02\x6b\xa7\x69\x6f\x6f\x6f\x7f\x77\x9b\x6f\xe6\xe0\xc2\xab\x5b\xe7\x61\xfd\x25\x58\x63\xf5\xf9\xf8\x49\xcf\x0e\x0f\x5f\xd3\x66\x87\x71\xfb\xe8\xec\xce\xf6\x79\x74\xc8\x37\x3f\x86\xd7\x7e\x02\x68\xe1\x90\xf7\x0e\xe0\x79\x26\x63\x9e\xd4\x66\x3f\x1b\xfe\x4a\xf4\xa3\x34\x7d\x8e\x91\xef\xb4\xc9\x17\xbe\x7e\xcb\xef\x3a\xcb\xf5\x86\x9f\xb8\x36\xdb\xdd\x73\xc2\xb1\x34\xdd\xa0\x17\x9c\x05\x2e\x04\x00\xe2\x38\x9a\x40\xd7\xe4\x10\x35\xdd\xf7\x73\x5f\x37\x15\xa8\x7b\x91\x83\xae\x73\x89\x8b\x47\x0f\xf6\x93\xbe\x66\xd3\xad\xef\xfa\x99\x96\x47\xba\x08\xe5\x22\x4c\x95\xb4\x32\xca\xc3\x5d\x56\x11\x65\x0d\x28\x7f\xc3\x6d\xe8\x3a\xd9\xe0\x54\x25\xc7\x59\x79\xa3\x60\xb2\xa6\x22\xb2\xe1\x83\xf9\x92\x61\x18\xb2\x20\x0b\x06\x27\x2a\x99\x54\x8e\x8e\x0b\xc8\x9c\x00\x2a\x64\x20\xa8\xa0\xaa\x0e\x93\x15\xfb\x87\x29\x3b\x87\xb2\x0a\x54\xe1\x59\x8d\x26\x2a\x90\x46\x59\x54\xa9\xb7\x55\x74\xa8\x23\x55\x47\x3c\x12\x14\x08\x20\xc3\x30\x14\x07\x55\xa4\x1b\x8a\xa6\x18\xe9\x5a\x2c\x90\xa9\x7b\xa7\x29\xa8\x34\xc7\xc5\x5b\x47\xdb\xbf\xe5\xc3\x6f\xa6\x87\xf7\x1f\x6d\x5d\xef\x9b\x8e\xc6\x98\xd2\x61\xb9\xae\xf6\x64\x0d\xf3\xb9\x2b\xb6\x77\xc0\x5e\x4d\x4e\x7a\x4a\x67\xce\x6d\xcb\xff\xf8\x70\x76\x33\x56\xeb\xd3\x56\xac\xe6\xc8\xf2\x96\x1f\x12\xf8\x22\xe3\xc5\x1c\x24\xc6\x70\x64\xca\xd8\x1c\xa2\x2f\x8f\x77\xdb\x72\x3c\xd1\x97\xa3\xcf\x62\xc0\xbf\x37\xe7\x3e\xeb\x3a\x1c\xf5\x42\xc8\x7f\xcc\x69\x1f\xfd\x62\x9b\x6f\xe8\xe4\xf7\xf7\xef\x89\xa5\x1a\xfd\xb8\x18\xff\x2a\x9f\xde\xf2\xde\x79\xeb\x2f\x3a\xcb\xe7\xba\x9f\x74\xbe\x7e\xa5\x9f\x67\x14\x3d\x9e\xf1\xca\xce\x7a\xda\xab\x59\x21\xe0\x18\x02\x6f\xfd\x6e\xf9\x5e\xeb\xba\x3b\x80\x7d\x4d\x97\xe9\xbf\xc2\xef\x6f\x91\xb8\x6d\x75\x97\xf7\x7b\xf8\xbb\x95\x2f\xe1\xdf\x10\x5c\x7e\xac\x71\xee\x35\x04\xe2\x20\x85\x99\xf4\xba\x8a\xed\xee\xeb\x86\xdd\x5e\xc9\x66\x5c\x28\x36\xde\x33\xa5\x6e\x66\x67\xcd\x85\x9d\xb6\xbb\x66\x0d\xc5\xa7\x37\xcc\x2d\xd9\xda\x17\x62\x8d\x43\x79\xb3\x2b\xcd\x8a\x16\xcf\x98\x61\x63\x02\xe4\x44\xc4\x56\x50\x46\x82\x7c\x16\x25\xa1\x84\x2d\x71\x5e\x97\x54\xd5\xd0\xb3\x52\x51\x43\xe5\x80\x02\x71\xc2\x91\xa2\x59\x10\x0a\x86\x65\x64\xa5\x82\x56\x0d\x44\x91\x56\x99\x00\xd0\x40\x15\xc4\x27\x63\x9c\x9e\xca\xa8\xbc\x02\x05\xae\x54\x4c\x99\xac\x95\x49\x07\x8c\x52\xc9\x88\x2a\xb2\xae\x88\x28\x0d\xd5\xa2\xae\x99\xc5\x7a\x53\x55\x36\x75\x9c\x6d\xba\xa2\xaa\x7a\xc5\x6f\x7b\xdf\x7c\xbf\x2d\xc6\x8a\xc0\x2d\x5e\xed\x87\xe6\x9a\xc3\xed\x9b\x1a\xbe\xb4\xd6\xd0\x5d\x23\xb3\x79\x10\xa1\xf7\x75\x8c\x2f\x89\xd0\xbb\x5f\x69\x95\x99\x55\x47\xb4\xc9\x24\x19\x6b\xf3\x21\xd1\xee\xec\xa1\x86\x80\xff\x4c\x41\xca\xe1\x5c\x46\xe3\xa0\x35\xae\x58\x21\x70\xd4\xa0\x3b\xc7\x37\x38\x79\x30\xc1\x64\x70\x2a\x98\x89\x2b\xf1\xf7\x86\xe2\x0e\xe3\x49\xd4\xe1\xf6\x6c\x6c\x08\x1f\x54\xed\x77\xcb\xd7\x11\xa5\x9d\x3b\x3a\x3b\xff\xa3\xb3\xd0\x62\x6d\x20\x50\x8a\x88\xb2\x9c\x2c\x8a\x92\xc2\xb2\x1a\x8c\x52\x69\xa8\x9b\x18\x66\x89\x61\x94\x31\x91\xc4\x66\x35\x0d\x46\x91\x1a\x4c\x46\x03\x6c\xb5\x14\x48\x31\x51\x3b\x1c\x48\x5a\xd8\xfd\x89\x3a\xa7\xcf\x1a\x87\xfb\xeb\xee\x8f\x12\x7c\x8c\x15\xed\x7c\xc1\xd0\xa1\x2c\xb0\xac\xc2\xb1\x6c\x4c\xca\x29\x92\xa4\x57\x74\x54\x81\x8c\x5a\x4c\x5a\x15\xea\xf8\x14\xaf\xeb\xc9\xe4\xb8\xa4\x69\x7a\x4e\x4a\x1b\x90\x41\x2c\x2c\xa2\xaa\x69\x28\x39\x6f\x0f\xa9\x2e\xf7\xd7\xb7\x8d\x39\xa1\xe3\xb6\xbc\xdb\x8a\x83\xb6\xdc\xf1\x79\xbc\xfb\xd8\x45\x9d\xfd\xdd\xcc\x23\x9d\x79\xbf\x4d\x47\xb4\x72\x53\x5b\x1e\x6c\xc3\x7d\xf8\x79\xd6\x1f\xe1\x6b\xe7\x1a\x32\x89\xf9\x15\x7a\xe5\x33\x44\xff\xb8\xb6\xea\xde\x71\xd0\x1a\x53\xab\x35\x75\xf1\xc6\x5f\xfa\xfc\xa1\xba\xec\x85\xf1\x1e\x2d\xde\xf9\x19\xbe\xdc\xe3\xc8\xdf\xa4\x35\xec\x03\x0f\x60\xf9\x70\xca\x21\x74\xc7\x7b\x18\x37\xc7\xca\x60\xdc\xf1\x79\xa6\x84\x9a\x85\xda\x67\x0d\xc5\xa9\x50\xff\xac\xba\x79\x75\xaa\xe0\x74\xe2\xca\x83\xe1\x68\xd2\x4a\xc5\x60\xba\xa6\x96\x8c\xa2\x49\x95\xed\x28\xfc\x73\x32\x0a\x4d\x3b\x13\xa6\x58\x46\xd1\x39\x23\x6a\x0a\xc9\x64\x18\xc9\xa9\x8a\x6a\xea\xe1\x2a\xb4\x98\xd8\xf8\x8d\x6d\x6c\x79\x9e\x4f\xa5\x44\x09\xc5\x2a\x28\x86\x58\x19\x6a\x30\x4f\x15\x50\x26\x87\x44\x41\xd4\x25\x01\xc9\x85\x98\x19\x93\xca\xa8\x98\xd5\x14\x18\x83\x61\x9d\x4f\x41\xeb\x73\x38\x73\xa1\x91\x3b\x7f\x5f\xb6\x39\x7e\xc4\x79\xd2\xe3\xc1\xd9\x38\x97\x4a\xfd\xad\xbb\x82\x53\x67\xc0\x50\xec\x74\xd8\x77\x72\xa8\x7f\x1e\x9c\x0d\xb1\x67\xd7\x3f\xb9\xa3\xc2\x9b\xde\x59\x3b\x06\x4a\x5c\x92\x12\x11\x8b\xd4\x3c\xc5\x40\x29\x69\x57\x11\x98\x00\xb1\x64\x59\xc9\x6b\x2c\x0b\x75\x28\x8f\x67\x28\x93\xcb\x76\x50\x7d\x35\xa3\x93\x96\xa4\x4a\xbc\xa0\x57\x0c\x2e\xcd\x4a\x69\xc5\xe2\xd4\x8c\x21\x53\xe5\x36\x7d\xd7\x41\x29\x76\xd6\x15\xda\x61\xf0\xe1\xcc\x36\xdd\xe8\xec\x19\x1c\xd5\x59\xfe\xb7\x34\xce\x7a\xdc\x3a\x31\x18\xda\x42\xdf\x11\xe9\x1f\x9d\x37\xf1\x21\xf5\x24\xb3\x64\x74\x2e\x38\x89\xfa\xcd\x9c\x7f\xce\xfe\x51\x64\xe1\xd8\x4f\x82\xff\xcb\x81\xb9\x77\x92\xf1\xd9\xbb\x17\xfb\xf6\xe9\x9b\x58\xc3\xc1\x7f\x7f\x6b\xc5\x33\x8e\xe5\xdb\x02\x09\x7c\x20\x7a\xf6\x3b\x31\x86\xa3\x07\xd2\x85\x4e\xd8\x79\x54\xf0\x61\xa6\x26\xf6\x7c\xc1\xc7\x0f\x36\x39\x82\xcb\x88\x76\xa9\x19\x9b\xb8\x1d\x6b\xdf\xe1\x4b\xbd\x7b\xe4\x09\xbb\xff\x42\x67\xfc\xbc\xf2\x45\x9f\x2d\x68\x8e\xdb\xc9\xae\xae\x9e\x31\x31\x3b\xf4\x34\x7d\x3b\xce\x8f\x77\x2e\x10\x1a\x5c\x43\xd3\x8d\xa9\xaf\xb1\xee\x78\xa4\xd7\xab\xaf\x3a\x18\x9f\x35\x17\xba\xc9\x90\xe2\x89\xfe\xc9\x3d\x03\x83\x81\x10\x1b\x1a\x18\x3c\xcc\x8e\x4a\x30\x79\x41\x12\x7e\x5c\x63\xe0\xc3\xe8\xbb\x70\xc1\xeb\xf0\xba\x37\xde\x40\xff\xf5\xfd\x7f\x5e\x8b\x3e\xce\xbd\x89\x76\x5f\x0e\xbf\xf0\x1d\xf4\x27\x38\xf8\x05\xf4\x7c\xe8\x47\xcf\x7e\x8f\x82\x47\x7f\xf1\x7f\x7e\xf9\x4b\xaa\xeb\x37\x07\xc7\xff\xfc\xe2\xfe\xfd\x4f\x5d\x77\xeb\xb9\xe7\xbf\x78\xf1\xad\xcb\xf6\x9f\xff\x6d\xfa\xf6\xdb\x6f\x5e\x81\x16\x3c\xf3\xf2\x8b\x2f\xa2\xca\x08\x2a\xa3\xff\xdc\x64\xbe\x07\x2f\x47\xdf\xfa\xf5\x6b\xcf\xc3\x4b\x47\xe6\x0e\x76\xa3\x2b\xd1\x80\x0c\x97\x50\x3d\x94\x76\xfa\xad\xf6\xe6\x67\x9e\x41\x7f\x3c\x71\xf1\xd3\xd4\x74\x78\x3f\x7a\xe5\xd5\xe7\x56\xac\x78\xee\xa1\x25\xb5\x85\x81\xf7\xd0\x07\xa3\x0f\xc1\x53\xe0\xfd\xa0\x3d\xfe\x7c\xd5\x2c\x1f\x4f\x58\xd7\x9b\xb7\xfa\x62\x05\x9b\xed\x62\x5b\xbb\x13\x3b\x75\x11\x8e\x4d\xba\x18\x90\x31\x29\xae\x6f\xb4\x85\x6e\x89\xcf\x72\x79\xc2\x3d\x5b\xdb\xb0\x61\xfb\xfe\xc7\x25\xee\xef\x5c\x14\x5a\x4b\xdf\xc7\x2c\x1e\xeb\xab\x02\x0e\xcc\xdf\xcc\x2c\xdc\xfc\x1f\x1f\x07\xb9\x0b\xe6\x7d\xb5\xd3\x3c\x6f\x7a\x80\x90\x0b\x7c\xaf\x4d\x33\x7d\x76\x29\xd5\x90\xfb\x4d\x97\xe3\xb3\xad\x77\x13\xcf\xed\xd5\xd9\x7b\x73\x0c\x7c\x4e\x7c\xda\xc6\x1d\xc4\x18\x60\x9c\xbd\x9f\x01\xad\xb1\xc6\x19\x22\xc6\x96\xac\xf5\xd4\xc2\xe9\x6c\x0f\xb7\x3e\x97\x83\x69\x36\x59\xc4\x3d\xf0\xd8\x6c\xcc\xf8\xee\xc1\x35\xc6\x7f\x85\x53\x5f\x15\x5b\xaf\xe1\x2f\x75\xc2\xc8\x9b\x1e\x6b\xe3\x14\xb0\x8f\xb8\xf1\xdd\xce\xef\xe7\xd5\x06\x6a\xb1\xb1\x2b\x9f\xec\xac\x93\x36\xfd\x9b\xaf\xbd\x69\x93\xc7\xdb\x30\x3b\xde\x5b\xd9\xf7\x9e\x8f\x97\xf2\x6c\xe9\x08\xb9\xaf\x80\xf5\xc9\x7e\xab\x05\x23\x9c\x11\x5a\xe5\x3d\xe7\xc2\x0d\xc7\x0f\x7d\x36\x6f\x80\x3b\xcb\xfb\x9d\x37\x9a\xfc\xe7\x9b\x89\x53\x82\x7e\x3c\xe0\xda\xeb\xfe\x56\x9c\xb0\xae\x13\x4f\xef\xbd\xc3\x81\x41\x62\x7e\xb0\xdf\xfd\xa6\x81\xe5\x9d\x05\x64\xbc\x10\x47\x62\x97\xcd\xf7\x7b\x7e\xd8\x17\x9c\xbe\xf4\xef\x82\xb7\x22\xf4\x9a\x3f\xb5\xe2\xd4\x37\x4f\x07\xed\x31\x58\x5a\x24\xb1\xe2\x97\xa0\xf5\xcc\x6d\x73\xcf\x86\x7e\xf3\xa7\xad\xfe\xdf\xa6\xff\x39\x8c\xbc\x3a\x38\x7b\x66\x6b\x3f\x7b\xdf\xf2\xf5\xef\xad\xf1\x8d\xff\xd9\x26\xc7\xc4\xd8\xad\x9d\x43\x5c\x8f\x6d\xd8\x8a\x33\xdb\xae\x77\x7c\x3c\x7c\x7a\xc2\x8b\x15\x15\xfd\x31\xca\xdb\x31\xda\x1e\xbe\xd8\x1b\x57\x02\x37\xb9\x6b\xff\x22\xcf\x8f\x75\xfc\xad\x1e\x2c\xe3\x38\xee\x6d\x98\xf7\x63\xfa\x95\x5a\x1b\xce\xc3\xcf\xe6\xac\xbd\x7d\xf8\x3c\xd2\xbe\xad\x9d\xd6\x85\x57\x63\xab\xc9\xbf\x3a\x7c\xea\x22\x62\xbc\xb4\x26\x17\xb0\xa2\x3d\x26\xce\x91\xff\x31\xdf\x7c\xe8\x91\xc4\xfe\xa3\x7c\xe3\xe2\xed\xc1\x6c\x38\xb6\x6d\x9e\xb0\x4d\x7d\x93\xef\x20\x07\x2e\xd7\x10\x49\xbc\x7e\x0d\x66\xaa\x22\x9d\x64\xcd\xab\x07\xd6\x8a\x87\xf3\x3e\x9e\xca\x5b\x7b\x9b\x97\xf9\x74\xb1\x16\x49\xbc\xf9\x5e\x8b\xfc\x37\x72\xce\x3f\x55\x1f\xbf\x4d\xcf\x36\x24\xa5\x3d\x1e\x39\xd3\x3c\x53\x10\x23\x39\xff\xbd\x8c\x6f\xfc\xea\x7d\xdd\xd6\x7c\x3f\x8f\xef\x57\xb1\x05\x9e\xef\xd4\x0e\x73\xd3\x64\x37\x2a\x5c\x37\xfe\xf8\xe8\x46\x22\x85\xb0\x9b\x9d\x7a\xd6\x10\x24\xb2\x6d\xc8\x94\x6a\x41\x60\x51\x2a\x92\x52\x3c\x2c\xd9\x80\xca\xd8\x42\x20\x65\x2b\x90\x81\x92\x88\x04\x54\xb1\x50\x19\x89\x0a\x94\x60\xcc\x56\x03\x29\x9b\xa7\xb2\xb5\x2a\x2c\xb0\x3c\x92\x28\x89\x4f\x41\x8d\x4f\x42\x51\x95\xd2\xb2\x39\xce\x99\xaa\xa2\x5a\x5d\xd5\x46\xc6\x4e\x53\x91\x0c\xd5\x50\x0d\x8b\x4f\x6b\x15\xa4\x42\xa3\xaa\xeb\x52\x06\x37\x29\x92\xa4\xc8\x32\xc5\x88\xba\xaa\x28\xb2\xa4\x28\xaa\x42\xc6\x6c\x6e\xfc\x31\xc6\x1f\xe3\xc4\xf8\x12\xf3\xb4\xf6\x5a\x9f\xff\xe0\xe9\xc2\x55\xa1\xce\xba\x79\x24\xeb\xf9\xa8\x9c\xb3\xef\xbd\x82\xf1\x9d\xb7\x6a\xe1\xfb\x9c\x94\x9a\x1e\x6f\xe8\xf9\xd8\x9b\x57\x12\xed\xce\xfe\xf2\xb5\x3e\x9d\xe0\xf0\x29\x46\x24\xb1\xeb\x1a\x2c\xfb\x53\x7c\x7c\x4a\xf3\x7c\xd0\x8d\xad\xf6\x6b\xff\x24\xbc\x4f\xfd\x7e\x8b\x5d\x75\x62\x15\x3e\x68\x93\x7f\x42\xd7\x6e\xea\xf7\xf1\x5d\x1e\x47\xb5\xa9\x7d\x9d\x3a\x76\xf8\xdf\x7c\xcf\xda\x3c\xb3\xb8\xd0\xa7\x8f\xb4\x48\x62\xd3\x71\x4d\x19\x07\xc1\x06\x57\x0e\x4e\x20\xaa\x51\xf4\xd2\x21\xd7\xd7\x38\x25\xd0\xdd\x2c\xab\x3e\x48\x87\xfa\x63\x87\x0b\x9d\x69\xa9\x5d\x47\x57\xf9\x4c\x11\x66\x50\xce\xa8\xf0\x13\x20\x6d\xea\x15\xb1\x22\xa3\x1c\xcc\xa6\xb3\x2c\xcc\x8e\xf3\xad\x41\x34\xf4\xe6\x15\xf6\x1b\x2b\x57\x52\x77\xdb\x6f\xd4\x3f\xb4\xae\xb1\xd1\x9c\x91\x97\x0d\x0d\x86\x51\x1a\x0a\x65\x4b\x37\xd3\x46\x26\x1a\x36\x51\xe9\x30\xf1\x34\xf6\x1f\x6a\x87\x6e\xba\x86\x42\xe8\x8f\xc3\xe8\x96\x61\x3f\x5e\xc0\x72\xb7\xe1\x47\xad\x78\x38\x93\x6f\xf3\xd3\xd3\x9e\xbe\xa4\xc7\xfe\xe1\xb6\x2b\x0d\x7b\xb7\x1a\xd7\x92\x1d\xbe\x90\xd0\x65\xb8\x9f\x91\x2f\x77\xd6\xfd\xee\x7e\xa0\xd8\x59\x7e\xf7\xfe\xb6\x33\x2f\xb7\x99\xd4\x7d\x72\xf3\xac\xdd\x4e\xbc\x8b\x32\x7c\x81\xdf\xde\x6d\xce\xb5\xdd\x9b\x88\x93\x5f\xe5\x64\xfd\xfc\x22\xce\x89\x5a\xff\x6e\x07\xad\x82\x2f\x80\x6e\xf7\x14\x74\xe3\x74\xcb\x05\x38\x57\xb9\xfb\xa7\x3e\x95\x21\x27\x7a\xaa\x0f\xe2\xfa\x19\x3d\xf1\xc6\xbf\x3d\xff\x8f\xd3\xd1\xcb\x03\x6c\xad\x1c\x88\xd6\x4a\x81\xac\x59\x2b\xdc\x89\xcb\x50\x3e\x61\x18\x68\x69\xfd\xa7\x20\x2e\x3a\xf2\xf5\xe6\x8f\xf5\x6f\x1f\x37\x8c\x83\xf7\xb5\x9f\x9b\x3e\xca\xd2\x4d\xa3\x56\xe2\x7e\x62\x5c\x62\xcb\x70\xd8\xf8\x89\x11\x98\x6d\x7c\xdb\x28\x18\x94\x6d\xcb\xc1\x19\x9f\x7b\xae\xd4\xb5\xd5\xcc\xe2\xfd\xfb\x5f\x01\xe7\x7f\xc8\xb5\xe2\x6e\xe2\x6c\xe9\xf0\x82\xce\x76\x6c\x65\xa5\x13\x17\x13\xa1\x37\x9e\xdb\x99\x47\xb3\xbe\xdd\x79\x1d\x6f\x64\x88\xf5\xea\xec\x55\x3c\xdb\xb2\x77\xe2\xca\xd0\x8a\x1b\xda\xb0\x39\xae\x0d\x31\x72\xed\xe7\xe1\xef\x7d\x9b\x09\x5c\x81\x7d\xdb\x6d\x38\x36\x63\xf8\xfc\x56\xbb\xb3\xb1\xd6\xa6\xd3\x9c\x73\xd5\x0e\xab\xcb\x1d\x46\x0f\x9d\xd1\xea\xe3\xac\xa2\x41\x2b\x27\x4e\xe0\x88\x8d\x53\xdb\xf0\x02\xee\xc7\xaa\x10\xef\xe5\xc4\xca\xcf\xc6\x71\xbf\x9f\xe2\x4a\xf0\xff\xb7\xc5\x3e\x3b\x71\xfa\xa7\xf8\xf4\xb5\x37\x07\xd6\x07\xad\x3e\xd4\x81\x5d\x6d\xfc\x19\xa1\x1b\xd7\xbd\xdf\x49\x97\x46\xe8\x7d\x37\xb7\xbe\xdb\xfa\x45\x6d\x63\x4d\xf4\xb3\x72\xc4\xe7\xd3\x34\x71\xf4\x00\x31\xa6\x98\x27\xdb\xf3\x22\x1e\xd3\xf9\x9d\xf1\xc8\x8a\xad\x9d\xf9\x0f\xeb\x1f\x3e\xdd\xee\xf9\x14\xd6\x9a\x56\xfb\xe4\xee\x8f\x3d\xd9\xaa\x87\x56\x6c\x69\xd3\x05\x78\x7c\xac\x5c\xdb\xf8\x34\xfd\xc4\xc4\x0a\x27\x03\xff\x3c\x42\x2e\xd4\xc6\x19\xf6\x0c\x3e\x61\x9c\xe9\xf1\xdf\x67\x87\x8a\x71\xff\x52\xd0\xe1\xec\xc5\xc6\xf9\x6d\xf7\xc2\xb6\x79\x64\x0e\x68\xe5\x0e\x09\xfc\xb4\xef\x7d\xef\x5d\x58\x47\x2e\x5d\xf4\x3b\xb7\xed\xdd\x9d\x31\x79\xd0\xb7\x1e\xbc\xbd\xe1\xcc\x5b\xad\x63\xb8\xf1\xf6\x36\x1d\x4f\xc4\x10\x5a\xa4\x6c\x6c\xf2\xf4\xe6\x92\xcc\x4c\xb8\x64\x62\x7c\xe6\x93\xdc\x39\x4c\x68\x6c\x12\xdc\x3c\xf1\x21\xa9\x23\xac\x3f\x11\x18\x2e\xd4\x58\x33\x60\x1a\xce\xbd\x5f\xb7\xa1\x17\x81\x5b\x70\xa5\x81\xa1\xde\x29\xa1\x06\x8e\xab\x6b\xca\x40\x1f\xed\x06\x66\xcc\x1a\x8a\x13\x78\xed\x2c\x5f\xb6\xe9\x3e\x37\xdb\xf4\x40\x77\x5f\x60\xa0\xbb\xaf\x67\x0a\xec\xc8\xfe\x05\x24\xa8\xc6\xc2\x66\x0c\x66\x50\x8a\x89\x51\x02\x2a\xeb\x59\xa1\x62\x16\x55\x54\x54\xf2\x1a\xaa\x42\x29\xc6\xa0\x74\x20\xa5\xcb\x8a\xac\xd8\x86\xcc\xe9\x29\x59\x95\x24\x56\x48\x8a\x2c\x57\x8e\x4a\xa6\x6a\x95\x4a\xe1\x72\x89\x9a\xd7\x81\x08\xec\x2a\x64\x2b\xd1\x52\x46\x17\x79\x23\x27\x98\x06\x8c\x56\xf3\xaa\x91\x35\x78\x91\x02\x42\x5a\x92\x54\x45\xd6\x04\x4d\x96\x0e\x96\x65\x39\x6c\x32\x0a\xcc\x23\x11\xe5\x45\x98\xa6\x40\x00\x20\x16\x72\xb5\x2a\xe4\x0a\xdc\x04\x68\x63\x09\x49\xb9\xdf\x78\x66\x67\xfb\xbb\xf6\x1a\xd0\x1a\x5f\x83\xe7\x72\xf4\xd3\x36\xff\xc6\xa9\x97\xf6\x66\x9b\xcc\x11\x75\x67\x5b\x74\xde\xcd\x8e\xce\x8b\x84\xac\x47\x41\x10\xfc\xae\x95\x0b\x60\x68\xeb\x19\x82\x57\x20\xf8\xf0\xe1\x39\x3e\x8c\xa5\x47\x12\xe9\xba\xaf\x92\x48\x2f\x04\xcd\x73\x8a\x2d\xb1\xff\xd6\xa7\xad\x72\xb7\xf1\x6b\x6d\xb1\x47\xce\xba\xc1\x67\x24\x37\xfe\xd8\xb7\x46\x3d\x7f\x6b\x3d\xd5\x89\x57\x88\xd0\xdb\x7f\xdb\xd6\x0f\xf4\xe9\x00\x4f\xcf\xa7\xcf\xc7\xcf\xea\x9c\xdc\xfc\x49\x27\x3d\xb3\x6a\x4a\x67\x4e\x63\xe4\x11\x42\x77\x3b\xb9\xd9\x97\xb5\xe9\x49\x07\x1f\xed\x68\xf1\xd5\x39\xf2\x1c\xd2\xd6\xa3\x7d\xfd\x7b\xb6\xe1\x40\xe3\x6c\x4f\x0c\xcf\x3f\x1b\x59\xbc\xe7\x61\xf0\x08\x07\x66\x07\x22\xf4\x2b\x7b\x3a\xdb\xe1\x95\x9b\x3b\xf3\x2c\x6f\xfc\x91\xe0\x2e\x32\x44\x4c\xc2\x6c\x77\xad\xba\x58\xcb\xab\x75\x34\x19\xcc\x00\x9c\x93\x7f\xca\x2b\xa5\x3d\xd0\xdd\x87\x33\xc0\x13\x31\x3d\x01\x07\xe2\x9c\x32\x74\xb8\x93\x0b\x01\x3d\xa0\xd5\x34\x13\xc7\xdf\x09\x76\xe6\x77\x86\x31\x93\xe2\xed\xac\xfd\x2b\x58\x36\x29\x80\xa4\x34\x04\xe2\x04\xc8\x98\x56\x55\x86\xc0\x44\x9a\xad\xb5\x61\x9e\x20\xb0\x65\xa8\xeb\x48\xd5\xa9\x71\x14\x84\xaf\x1b\xb5\xe7\x64\x59\x2f\xcb\x69\x03\x46\x51\x0c\x96\x51\xc5\xd2\xcc\x52\xc0\xf8\x5c\xec\x73\x3b\x9e\xd3\x27\x99\xc5\x63\x3f\x09\x7e\x36\xff\xbd\x39\xaf\x30\x0b\x5f\x0a\x82\x69\xdc\x59\xf3\x7e\x8e\x63\x1a\x52\x13\x27\xd4\xf1\x0f\xc6\x7f\xa7\xe2\x6c\xee\x17\x11\x59\xdc\xc9\x62\x14\xb8\x4a\x08\x6c\xad\x99\x16\x74\x8b\xa9\x1d\xc6\x0f\x08\x6c\xbe\xed\xa9\xab\xe1\x8c\xfb\xd1\xd3\xf0\x7b\x89\x5e\xf3\x98\x93\xa8\x05\xf6\xc3\x89\x0b\x29\xad\xf6\xa1\x09\x3f\x43\x47\x06\xa6\x2b\x0a\x27\xc6\x54\x8e\xaf\x15\x2d\xc8\x50\x31\xbb\xa4\xc1\x28\x2a\x8f\x97\xca\x7a\x26\xa3\x89\x52\x8a\xd3\x79\x49\xcd\x70\xd9\xae\xe3\x2f\x99\xb7\xc4\x1c\x7d\xf4\x2a\xb9\xe7\xaa\xab\x1e\xbd\xf0\x12\xfb\xef\x4f\xc3\x49\xe8\x34\x5b\x11\x44\x46\x67\xea\x3e\xad\x18\x60\xcb\xc8\x50\xb5\xae\xa3\x71\x04\x83\x6e\x9a\xba\x2a\xd7\x52\x81\x12\x2a\xa6\x55\x98\x84\xaa\x8f\x47\x72\xf9\x8c\xf3\x7c\x3a\x45\x8d\x24\xd6\x9d\x4b\xf8\x43\x47\xe0\xeb\x5f\xc5\x79\xab\x1b\xa7\x09\xfa\xc0\x0c\xf7\x8c\x8b\x7b\xfe\xdb\x39\xe9\xdd\xd7\x03\xdd\x92\x70\x03\x3d\x03\x83\x93\xbb\x71\x5e\x95\x6e\x38\x40\x05\xfb\x4f\x19\x72\xf3\x5b\x77\x1c\x22\xea\xaf\x5d\x1b\xd0\xb3\x70\xee\xf8\x2f\xe1\x20\x1a\xa1\x56\x6d\x46\x3f\xdf\xb4\x09\x9e\xb1\xf9\xa5\xed\x57\x2d\xb7\x9f\x5a\x0e\x5f\x5e\xcb\xd8\x8f\x5c\x4b\x71\xef\x1e\x7c\xfb\x9e\xb7\x3f\x19\x1f\x68\x73\x95\x78\xc3\x40\x31\x58\x32\x0c\xc3\x40\xe9\x42\xfd\x3f\x74\x8f\xad\xc3\x32\x62\x28\x6d\x02\xd8\x1a\xa7\xc7\xb2\x92\xa6\xea\x62\xd7\xcf\x0f\xe3\x2a\x91\x18\x60\xe3\x15\x2d\x7c\xcb\x79\x84\x2e\x5c\x38\xf6\xa3\xab\xc6\xe7\xce\xe5\xce\x20\x70\x75\x73\xbf\xef\x9b\xc4\x1a\xcc\x35\x75\x95\x65\xfa\xfc\xfb\x3a\x2e\x19\x6e\xe3\x74\x9a\x58\x3b\xb1\xe5\x20\x66\x05\x0e\x79\xdf\xed\x6a\xae\xf3\xf5\x0b\x7b\x8e\x6c\xc1\x4a\xce\x1e\x0d\xce\x71\x0f\x68\xdc\xfe\x08\xbd\x01\x7c\x01\x9c\x02\x06\xb1\x07\x7b\x2d\x51\x71\x0c\xef\x2d\x36\x2a\xfe\xd4\xc5\xba\x19\x51\x8b\x0b\xda\xf9\xa4\x3b\xd8\xdd\xf0\x60\x0f\x33\x73\xa1\xc5\xa6\x1d\x36\x61\x96\x49\x9a\x6c\x14\xc5\xe1\xe5\xe1\xa7\xc2\xf0\x32\xb4\xfa\x88\xf0\x2f\xbe\x73\xf6\x2f\x7e\xfa\x95\xfd\x5f\xf9\xe7\xb9\xe8\xa3\xa5\x5d\x03\x8b\x17\x3e\xb4\xf8\xe6\xd8\x43\xf7\xf6\xd7\xf2\xd4\x33\x88\x1b\x19\x81\xa7\xa2\x5f\xd5\x9e\x69\x3b\x39\xf2\x47\x54\x48\xa7\x21\xcb\x73\xac\x28\xa1\xdc\xc0\xdc\xb9\x03\x2f\x75\x1f\x37\xf3\xc2\xa7\x6e\x99\x79\xcb\x9c\x27\x2f\xbb\x05\xed\x7f\xd6\xfe\xe1\x92\x2b\x26\xbd\x72\xcc\x17\xa9\xbe\xfb\xd0\x13\x57\xc0\xf7\xd0\x67\x6f\x04\x36\x1f\x66\x56\xfd\x7e\xe1\xce\x7d\x04\x87\x78\x6e\xbb\x0e\x6d\xd4\xea\x76\xe7\x49\x6f\xc6\xf3\xac\x4b\xf9\x6c\x87\xea\xf9\x08\xa9\x56\xdf\xc4\xd9\xa3\xd8\xf0\x4d\x02\x07\x7a\xb1\x27\xc3\xba\xef\xec\x19\xd7\x98\x73\xd7\x96\x0e\x75\xf6\xbb\xbc\x1a\xd7\x5c\x83\x7b\x4e\x9f\x83\xed\x16\xae\xb8\xbc\x4b\x24\x70\x82\xd1\xf0\xd3\xf7\x3e\x0d\x48\xbe\xda\xb3\x2b\xdb\xbf\xda\x8a\xef\x9d\xfd\x84\x95\xbf\x00\x2d\x5c\xef\x8a\xdf\xf9\xf6\x73\x3c\x7c\xbf\x0f\xef\x27\xb8\x9e\xe2\x2c\xbf\xde\x70\xfc\xeb\x9d\x38\x92\x7c\xf4\x7d\x62\xbc\xbc\xfd\xc2\xdd\x05\x1f\x17\x5a\x5f\x07\x2f\xb6\xe1\xf3\x77\xf1\xfd\xaf\x9e\xd1\x7a\x76\x1f\xcb\xfa\xde\xd7\x7c\xdc\xb1\x97\x33\xc4\x9d\x8f\x41\x62\x6c\x73\xc4\xd8\xce\xf4\xad\x3f\x6f\x5d\x7a\xb5\xe2\x1d\xdb\xa8\x47\x12\xdb\xf1\xfe\x96\xcf\xe7\xc4\xfd\xac\x7a\x90\x90\x9d\x73\x3a\xde\xfb\xec\xb6\xf9\x3b\x19\xb4\xf2\xf4\x84\xef\xb4\x21\xdc\xc9\x8e\x33\xb4\x65\xf8\xde\xd9\xe3\xb9\xc6\x8e\xf2\xf9\x0f\x9e\x1d\x5f\xf1\xdc\x61\xfc\x57\xb6\xcd\x6f\xc6\x73\x3d\x72\x6d\x47\x2c\x97\x18\xc5\x2c\xd8\xe8\xb1\xc4\x7c\x6b\x91\xc4\x81\x8b\x7c\xe3\xdd\x12\xdf\xb0\x66\x4a\x2b\x0e\x1a\x39\x0f\xdf\xfb\x2c\x1f\xef\xa7\x47\x12\xab\x6e\x01\x7e\xce\xdb\x95\x8b\xf5\xa0\xb3\x7f\xb9\xb7\x0b\xf7\x73\xa6\x4f\x5e\x5a\xd7\xf0\x19\x04\x66\xf3\xf4\xe0\xaa\xae\x36\xac\xe5\xe0\x45\x72\x7f\x02\xef\x2b\x99\x57\xb7\xc9\x38\x19\xe3\x4b\x9e\xbf\xbb\xd8\xeb\x7f\xe1\x9a\x2d\xff\x76\x04\x07\xe6\xbf\xe9\xf5\x85\xfd\xf3\xbd\x3f\x21\x9e\xeb\x74\xe2\x99\xf5\x48\x62\xe3\x67\x2d\xef\x98\x22\xb1\xe4\x1b\xef\xf9\x78\x06\x4f\x36\x37\xfe\xbd\x23\x6e\x4b\x6c\xc4\x88\x7f\xe3\xdf\xbc\x77\x74\xe4\x16\xaf\xba\xe1\xd3\x3a\xeb\x90\x8d\xff\xe8\xdc\xbe\x57\xea\xcc\xdd\xec\x25\xe3\x68\x0e\x78\xcf\xb4\x70\x3d\xbc\x04\xcc\x3b\x8d\x38\xa7\x45\x9c\x9d\xdd\x27\x12\xbc\x8b\x9b\x0f\x2b\x0c\x22\xf4\x86\x63\xf2\x2d\xfe\xe7\x8a\x67\x3b\xaf\x8b\x8d\xff\xec\xd0\xee\x8d\xc7\xd8\x25\xad\xeb\xe5\x40\xa6\xcd\x57\x72\x38\xe6\xd7\xda\x7c\x22\x67\xcf\xe7\x1d\xd0\xba\x97\x87\xd7\x91\xb5\xdb\xd7\x8f\xec\xf9\xcf\x7d\x51\x10\x49\x58\xfb\xab\x20\x42\xeb\x7d\x55\xd0\xce\x05\x0d\x9f\xea\xd3\x9b\x9a\xe7\xa3\xcf\xf0\xc9\x94\xb7\xd7\xbb\xed\xff\xe2\x6f\x93\x9d\xe4\x76\xe5\x13\xad\xdc\xc5\xd8\x77\xda\xe4\x86\xd0\x13\x5e\xbd\x7f\x6f\x6d\x6c\xf8\x7e\x07\x5e\x4c\x6f\xe0\x86\x0d\x8d\xf8\xcf\xcb\x9d\x71\x62\x16\x8f\xad\xa2\xc0\xbc\x93\x38\x10\xa1\x5f\x23\x39\x82\x82\xf7\x4c\x89\xed\xa7\xe0\xe7\xed\xf7\xee\x83\xb1\xce\xba\x5a\x9b\xce\x26\xce\x0f\x6c\xdf\x4a\xf0\x16\xb8\x7d\x55\xe6\xf3\x38\xa4\x15\xcf\x74\x92\xcd\x08\xbd\x61\x2f\x68\xe5\xf7\xee\x69\x93\x0f\x82\x67\xdb\xf0\x8d\xd6\xf1\x58\x45\xb5\xf8\x7d\x4e\x8e\xbb\xc5\xc3\x02\xb8\x8e\x03\x73\x5e\x89\x2c\x1c\xdb\x08\x3e\xe2\xc0\xec\x68\x07\x0e\x88\xde\x40\xb5\xcd\xc7\x57\x9b\xdc\x50\xeb\xde\xc5\x81\x23\x5b\xc6\x24\x45\xd8\x44\x7a\x8c\x6a\xb5\xaf\xae\x9c\x24\x7c\xef\x6e\x78\xf7\xce\x12\x3a\x1a\xcb\xa8\xab\xa3\xff\x82\x7f\x6b\xba\x37\xee\x8e\x4f\x5f\x6c\x93\xf7\xb4\x27\x73\xf4\xf0\x29\x9d\xd7\xfe\x70\x9f\xcf\x57\xd5\x22\xfd\x2b\xfa\xa8\x4c\x83\x89\x25\xf7\x5e\x1d\xbb\xb1\x76\x37\xe1\x27\x34\xfb\x6f\xd4\xc2\x3f\xd9\x7b\xbf\x8c\xc7\x65\xd2\xfb\xbb\x5c\x1f\x53\x71\x7c\x77\x70\x84\x97\x3b\x8a\x07\x37\x3b\x91\x90\x3d\xb8\xa0\x4b\xc0\x71\x1a\x88\x4f\x4f\x5f\x8f\x53\x31\xbf\x2f\x38\xd0\xfc\xb4\xf2\x3e\x93\xe0\xe1\xa2\x5f\xeb\x8e\x69\x59\x4f\x05\xa3\x87\x14\x41\xd2\x2a\x56\xc1\x28\x18\x25\xa3\x64\x64\x32\xd5\x83\x49\xc8\x14\xa0\x54\x28\x40\xa9\x54\x82\x4a\xa9\x34\x8e\x63\xbc\x92\xa8\x94\x56\x25\x49\x36\x34\x91\x57\x72\x26\x2a\x06\x74\xc8\x9a\x50\x45\x45\xb5\xa4\xe4\x54\xd3\x28\x28\x30\xaa\x4f\x00\x5a\x67\x45\x43\xe0\x24\x13\x15\x35\xf7\x3f\x3d\xad\xeb\x69\xe7\x3f\xc4\x68\x9a\x21\xcb\xba\x2c\xa2\x14\xcc\x67\x25\x5e\x31\xaa\x86\xa6\x19\xf9\xac\x96\x2b\x21\x00\xb3\x79\x4b\xc9\x96\xdd\xf8\x6f\x2c\xd7\x2b\x9e\xec\x60\x1b\xeb\xf3\x7a\xe0\xf3\xd6\x8d\x25\xb7\xb6\xbf\x96\xf5\xf1\xe8\xde\xfc\xad\x1f\xf2\xf5\xf3\xe5\x66\xac\xd6\x34\x10\x49\xac\xfa\x43\xfd\xb7\x96\x8f\x78\xf3\x87\x75\xe5\xc8\xf3\x84\x3d\x8b\xfb\xe5\xcd\x8d\x4b\xff\xb9\xcf\x76\xd4\xf5\xc2\xaf\x7c\x72\xd8\xac\xcf\x71\x2b\x3e\x97\xfb\x15\x8c\x00\x6f\xeb\xc4\x51\x78\xb5\xd1\xbd\x58\x9f\x3d\x7f\x07\xad\x9c\xba\x46\xf0\xce\x8f\xf9\xde\x51\x8f\x38\x52\xe8\xc7\xdd\x1e\x07\xb3\xf2\xf1\x36\x5f\x8b\xe4\x78\x1a\x31\x6c\xb3\x26\xd8\xd0\xf7\xe8\xc7\x99\x25\x07\xe2\xd4\x69\xa0\xe7\xac\xfb\xe7\xbd\xce\x2c\x79\xf9\x69\x4a\x9e\xf8\xeb\x99\xbb\xe6\x3f\xc5\x2c\x1c\xeb\xfb\x04\xce\x1d\xe7\xce\x74\x75\x31\x91\xa3\x78\x03\xb9\xc7\xef\xe4\xa0\xfe\x3a\x68\xdd\xe3\x77\xf2\x4a\x7e\xb7\xed\xbd\xc8\x98\x83\x3e\x62\x8d\x29\xb4\xc0\x2c\xd9\x1f\x98\x00\x13\x7f\xbd\xf0\x6f\xe7\x4d\x8d\x24\xf6\xfc\x0f\x00\x91\x45\x2f\x4c\x02\x8f\x52\x67\x72\x60\xee\x00\xb9\xa6\xd7\x0f\x76\xf0\x27\xb5\x48\x62\xc7\x67\xa0\x35\x96\xc3\xc1\x18\x1f\x76\x78\x3e\xc3\xd3\x4b\xb1\xce\x63\x35\xfa\x77\x42\x2f\xe1\x7e\x1c\xbd\xb4\x0a\xa3\xb8\x3a\x82\x04\x47\xe3\xbe\x5e\xa0\x35\xf0\x05\x30\xd9\x65\x0a\xe6\xb8\xb5\xf1\x2e\x01\x02\x58\xd2\xea\x8b\x86\x1c\xb6\xd7\xa9\x74\x35\x6b\xd0\x0d\x78\x77\xf2\x44\x4c\x77\xea\xb0\xb6\xd6\x44\xeb\xc5\x61\xd2\x3d\x71\xaf\x50\xe1\x61\x9c\xd3\xfb\x47\x6a\x73\x46\xa8\x53\xa6\xf5\x6f\x99\x95\xbc\x49\x16\x25\x51\x2e\x98\xac\x94\x4d\x99\x8c\x8c\x2a\x59\x85\x2a\x2b\xa2\x22\xaa\xb5\xa2\x91\x12\x0c\x31\xb0\xee\x8d\xcb\xee\x79\xf0\xde\xde\x7b\x1e\x1b\xaa\x5d\xdf\xc5\x8e\x17\x8e\xe9\x9a\x3a\xfe\xa7\x23\xbb\x12\xe3\xbf\x0e\x59\x16\x7c\x6b\xcd\x9a\xf1\x77\x5a\x19\x99\x60\x1e\xbd\xb3\x6d\x1b\x1c\xb8\x74\x70\xd6\xd5\xb7\xef\xe6\x25\x55\x11\x38\x54\x89\x45\x39\x89\x4d\x8b\xbc\x00\x53\x86\xa9\x66\x4c\x8e\x2d\xe8\x82\x85\x74\xfb\x6a\xf5\xba\xe8\xc6\xd8\xad\xd4\xd3\xda\x53\xda\xfd\x1a\xf5\x40\x4d\x0f\xdc\x5f\xdb\x19\x34\x0e\x43\xd6\x78\xf8\xd9\xf3\x9f\x86\xa7\x11\x58\x1f\xeb\xe0\x0d\x78\x55\x0d\x9f\xd4\x8a\xe3\xf6\x9d\x0f\x5a\xf9\x5f\x99\xe0\x4e\xfd\x67\xe7\x3d\x2e\x68\x7d\x67\x3e\x82\x1e\x3e\xb1\x33\xa6\x36\x27\xbc\xf6\x24\xb9\x4f\x35\xdc\x38\xa7\xf4\xc5\x89\xc1\xd0\x4a\x47\x67\x8c\x03\x66\xe1\x48\xcf\x83\x9f\xcd\xfe\x95\x1b\x93\xd5\xdc\xe7\xd3\x80\x7f\x1f\x24\x19\x7a\x18\xdb\xc2\x8f\x01\x88\x84\x56\x4c\xa3\xde\xf7\xd6\x3a\x5e\xcf\xeb\x88\xb5\x05\x8e\x74\x7d\xba\x47\xc0\x11\xee\x2e\xee\xf1\xa0\x1f\x9c\xe1\xc5\x6f\xba\x04\x5e\xb7\x57\xb5\xbf\xfe\x71\xf6\x19\x1a\xd5\xef\x70\xae\x6e\xa7\x2e\x77\x2f\x8e\xc5\xef\xcc\x55\x39\x11\xd5\x81\xaf\x41\x91\x09\x5b\x0c\x03\x73\x35\xc1\xa4\x34\x5b\xf3\x3e\x3f\xd2\x35\x5d\x31\x6a\x3c\xc5\x19\x54\xd8\xae\x1a\x76\x2e\x63\x18\xbc\x69\x40\x3d\x99\xaf\xa6\x20\x43\xc5\xca\x96\x68\x94\x0e\x15\x5a\xa3\xab\xe9\xa3\x52\xa9\x64\x32\x66\x6b\x30\xcf\x57\xb8\x0a\x8f\x7e\x20\xe8\x82\x2c\xa2\x18\xc5\xd9\x39\xa3\x52\xa1\x0a\xac\xa4\xca\xac\xa1\x8a\xbc\xce\xb3\x29\x41\x13\xb8\x80\xd9\x39\xba\x9a\xd4\x35\x2b\x1e\x6f\xb3\x1f\x04\x76\x1d\x7d\xa6\x0d\x37\x63\x7b\xfe\x26\xe6\xc3\x57\x3e\xea\x9d\xf7\x1a\xa5\x55\x70\x2a\x60\xc1\x2c\xbc\x87\xf3\x90\xc3\x8d\xce\x1a\xc2\x7f\xf5\xd2\xa1\xa1\x59\x43\xbd\x20\x78\xca\xf4\xfe\x21\x97\x49\x6a\x2e\xd6\x59\x83\xd3\x89\x65\x1c\x18\xe8\x1e\xea\x76\x0c\xfb\xac\xa1\x5e\x7c\x1c\x17\x0e\xe0\x7c\x38\xa1\x1e\xef\xb0\x4b\xdf\xc9\x89\xc1\xe9\x87\xc9\xc2\x0c\x4a\xa5\x64\x36\xad\x9b\xd1\x82\xa1\x4b\x66\x55\x91\x0d\x94\x46\x45\x18\x83\x31\x41\x33\x24\x33\x96\xd4\x34\x41\x15\xb8\x98\xc0\xb3\x31\xc8\xe6\x4c\xc5\xc8\x20\x5e\xcc\x96\xf8\xdc\x92\x67\xee\x7f\x26\x9f\xbf\xfb\x9a\x63\xd0\x47\x68\xcb\xb4\xb3\x4e\xa2\x1e\x7e\x69\xd3\xf2\x6b\xbe\xf5\xee\xb4\x6b\x1e\x98\x75\xcc\x33\xd3\x6e\xfa\xde\xa6\x9b\xc6\x4f\x6a\x63\x9f\xa1\x14\x63\x0c\x59\x61\xc2\xaa\x9c\x4e\x6a\x12\x23\x88\x3c\xaa\x9a\xd1\xa4\xca\x65\x4a\xbc\x28\x44\x19\x64\x2a\x62\xcc\x88\x25\xd9\xaa\x62\xaa\x96\x22\xa9\xba\xa8\xf3\xc1\xbb\x90\x12\x83\x95\x8c\x6e\xc6\x62\x9a\xcc\x69\xe1\x30\x95\xac\x70\xa2\x2a\xf1\x6a\x8c\xe1\x94\x94\x25\xf1\xe2\x61\xd3\x9c\xb7\xe1\xab\x48\x62\xd8\xc9\xe0\xf7\x00\xe1\x73\xd5\xf1\xe0\x41\xe2\x1c\xc1\xf1\x8d\x7a\xa4\xe1\x2e\x5a\xc3\x3c\x7e\x04\xcc\x02\x97\x03\x11\xdc\x0d\x00\x1c\x18\xec\x1b\x1c\x18\xec\x9b\x1c\xef\x1e\xc0\x83\x3d\xd0\x5d\xd7\x99\x83\x74\xa8\x7f\x68\xb0\xaf\x6d\x94\x9d\xb3\x7a\x83\x03\xd3\xc9\xa9\x19\xc2\x73\x73\x1a\x4c\xf4\x27\x06\xe1\xc0\x91\x18\x73\xcd\x9a\x3e\x79\x4a\xaf\xfb\x1d\x1d\xa2\xfb\x4e\xee\x4f\x0c\x76\x77\x55\x30\x1c\x9a\x00\x72\x8c\x31\xa2\x51\xdd\xd6\x4d\xf3\xd6\xcb\x53\xe5\xac\xa3\x36\x4d\x47\x6d\x96\xcd\x74\x8e\xfa\xc0\x10\x39\x49\x36\x98\xd8\x42\xfa\x84\xb0\x36\xe5\xd6\x7b\x26\xa9\xf1\x7e\xfb\xfb\x16\x53\x2c\x8b\x3f\xbe\x45\xa4\x62\x81\x49\xc7\x4e\xbd\xff\xa2\xd3\xc3\xe6\x71\xa7\x5e\xb5\x6d\xcd\xb9\x97\x04\x62\x45\xad\x68\x0b\x81\x94\x20\xc6\x84\x54\x2d\x1f\x98\x5b\xcb\xe6\x63\x49\x83\x2f\x5c\xda\xae\x3b\xb1\x4e\xbd\x70\x4d\x39\x25\x28\x12\x5f\x49\x32\x5d\x53\x14\xf6\x95\xa5\x5d\xa7\x9c\xae\xa2\x1c\x2a\xa0\x82\x62\xdc\xa8\x2d\xfd\x0b\x3a\x8d\x3b\xba\x37\x19\x4d\xa7\x7e\x7f\x42\x2a\x1a\x93\xa8\x64\x43\xcf\x28\x04\x46\x3f\xae\x95\xb3\x58\xb5\xa7\xcd\xff\x79\xc4\x5b\x3f\x8b\x47\xcf\x61\x27\xcd\xfb\xd6\xfc\x8d\xcc\x42\xe3\x96\xab\xa6\xcf\x7b\x74\xfe\x14\x70\x24\xf8\xd2\x04\x1f\xda\x49\xab\x60\x12\x88\x80\xa9\xe0\x14\x90\x04\xa7\x83\xf3\xc0\x3c\xb0\x00\x5c\x57\xd7\x51\x81\xa1\x1e\x3a\x38\x38\x1f\xf6\x0d\x0e\x0c\xf5\x05\x07\x86\xfa\x02\xf3\x61\x1f\x8c\x07\xf0\x61\xeb\xa1\x66\xeb\xc0\x50\xa3\x35\x3e\x84\xff\x04\xe3\x43\xf1\x40\x7c\x08\x1f\xbf\x25\xe7\xcf\x9d\x56\xea\x6d\x6a\xce\xc2\xbb\xfe\x13\x81\xb7\x4f\xb2\xf6\x9e\xb4\x0d\x52\xeb\xa3\xe6\x85\x3b\x8f\xd9\x02\x37\x52\xe7\xce\xbf\xd9\xbe\x6e\xcb\xb4\xb5\xa3\xd3\x76\x43\xb0\x23\xba\x93\xfb\x3f\xd1\x6f\xdb\xb7\x05\xee\xf9\xd2\xff\x1d\x1f\x83\x57\x9f\x88\x7e\x1b\x86\x03\x27\xa2\x1f\xc0\x3d\xf0\x98\x93\x50\xe5\x4a\x78\x52\x2f\xfa\xa4\xf6\xb3\x17\xee\xba\xef\xb2\xcd\x4b\x7e\x3b\xfe\xc2\x9f\xff\xfc\xfa\x5d\x17\x5d\x4f\x3d\x60\x7f\x93\xb9\x65\xe6\x9c\xe7\x99\xec\xd2\x7f\xff\xf7\x7f\x47\x53\xa3\x26\x7c\xcb\x7e\xe4\xbe\xfb\xde\xbe\xef\x9d\x77\xde\xb1\x0f\xbd\x1d\x54\xec\x45\xcb\x96\x7d\xb0\xac\x54\x2a\xd9\x6f\x7f\x80\xca\x35\x26\x50\x44\xd9\xaa\x02\x05\x58\x74\x77\x6d\xf2\x39\x33\xeb\xe7\x52\x36\x3d\x82\x63\x0b\x1f\x05\xfe\xbd\x74\xac\xbb\x56\xfc\xb6\x91\x41\xc1\xd3\x69\x98\x9f\x1b\x7d\xac\x0d\xff\x60\xbc\xb8\x6e\xa8\x83\xcf\x68\x7a\x78\xe6\x87\x9d\x39\xb5\x75\x7f\xf7\x71\x35\x6a\x24\x61\xbe\xe8\xc3\xd6\x9e\xfd\xdd\x81\x73\x85\xb8\x56\xf8\x58\x62\xfd\xea\x2d\xfe\x51\xb4\x13\x86\x5f\x47\xc6\xd7\x8f\xd0\xaf\x34\xf2\x2d\x6c\x5b\xd3\xb5\x07\x1c\x39\x73\xd2\xfc\x77\x99\x45\xe6\x7f\xc0\xd7\x01\x3b\xfb\xca\x79\xff\x4b\xe6\xec\x35\x91\x4f\x06\x47\x26\xbe\x18\x4a\xd3\xf7\xd7\x7f\xff\xa6\xf1\x08\xbd\x26\x72\x18\x3b\xde\xeb\xe1\x37\xf7\xf9\x77\xe1\xb8\xfd\x61\x9c\x1f\x14\x84\xc1\xad\x13\x0b\x42\xab\xe9\xc7\xf0\x99\xff\xf9\xe0\x8b\x6e\xc6\x85\xc5\x58\x8b\x38\x27\xff\xeb\xa2\xe5\x46\xc2\xf5\xc7\x1b\x5b\xf7\x83\x7d\x41\xa7\x66\x96\x97\xc1\xbc\x51\x3b\xa2\x91\x82\xa1\xd7\xdd\x19\x0a\xba\xff\x1e\x6e\xb3\xec\xc8\xb2\x09\xc3\x66\xb5\x0a\x59\x54\x36\xf2\xc2\x04\xc8\x4c\x00\x73\x02\xc8\x79\x1d\x55\x60\xb4\x0c\x35\x18\x46\x55\xf4\x47\x78\xe7\xcb\xf0\x29\xf4\x38\xbc\x02\xed\x81\x9b\xd1\x4d\x2f\xa3\x07\xe1\x4b\x68\x0f\xbc\x02\xad\xd8\xf2\x83\x1f\xc0\x2b\xde\xb2\x3f\xc5\xff\x1c\x7a\xb0\x0d\xb1\x15\xea\x3e\xda\x7d\x1f\x3c\xb0\x89\x7f\xe0\xde\xca\x9f\x5e\xbd\xf7\xd6\x6d\x0f\x7c\xf0\xc1\x07\xf6\xba\xb3\xcf\x7e\xe4\x7c\x34\xff\xfc\x47\x9e\x7e\xfa\x91\xf3\xe1\xf7\xce\xff\xe7\xc5\x17\x5f\xfc\x97\x8b\x2f\xbe\x38\x50\x38\xdc\x4e\x5a\x27\xee\x76\xe5\x23\x3e\x79\xf2\x78\xf7\x95\xb3\x5a\xb9\x89\x95\xcb\xda\xf0\x37\x51\x2f\xcd\xfc\xb5\x0f\x97\xd7\xfd\xe9\xf6\x38\x1c\xc2\x1f\x1a\x69\xec\x43\xb0\x13\x29\x87\xbf\xd9\xb8\x1a\xcf\xf7\xd4\x56\x6e\xd3\xe5\xa1\xb0\x17\xe2\xc6\x18\x79\x32\xb5\x3e\x09\xda\xf7\xc9\x65\x17\x7b\x26\xb6\xe3\x53\x0f\xc3\x3d\x9d\xf8\xd8\xcd\x19\x62\xad\x8a\x8d\x58\x00\x27\xde\x72\xe5\x77\x89\x67\x30\x30\xef\xf4\x31\x0d\x66\x7f\x81\x03\x11\x7a\x05\xc9\xc9\xae\x22\xb8\x86\x35\xe7\xb6\xdc\x67\xe5\x7b\xa0\xf5\x7c\x43\xba\xc9\x5d\xe3\xa7\xa0\x87\xa7\x10\xbf\x63\x45\x12\xeb\x4f\x6d\x1b\xe3\x03\x9e\x5e\x5f\x64\x5c\x0d\x9e\x07\x60\xce\x02\xce\x87\x9b\xd7\xcd\x6c\xe1\xbb\xdd\xba\x08\xeb\x06\x41\x7b\x3e\x30\xc3\xc3\xe5\x93\x5b\x7d\xf1\x7d\xd3\xda\xf4\x11\xe6\xe2\xd6\xff\xbe\x33\x87\xb5\xee\xdd\x0e\x7e\x9a\x16\x49\x6c\xfe\x56\xf3\xfd\x3c\xce\xc9\xb5\x43\x1b\x76\x81\xd6\x73\xe3\x18\x1f\xe3\xd3\x07\x0d\x6c\x10\xc1\xeb\x3a\x35\x31\x33\xf4\x06\xfd\x14\x3e\x83\x7a\x1d\xb8\x05\x7c\x15\xdc\x05\xbe\x06\x9e\xc2\x31\x8e\x6d\x75\x6b\x82\x87\x39\xb9\x84\xb9\x16\x9c\xc7\x93\x09\x35\x20\xde\xd0\xac\xee\x3e\xbc\x87\xe8\x6c\x21\xba\x7f\x0f\xf5\xce\x1a\x9a\x06\x67\x0d\xf5\xd1\xdd\x0e\xae\x26\x60\xe0\x74\xc7\xd3\x1b\xf2\xe0\x1e\xb5\x0c\xc6\x4c\x68\x9a\x30\x86\x4a\x26\x92\x4d\x54\xb2\x3f\x6b\x5d\xb6\x81\x8b\x6f\xb9\x7c\xd1\xbd\x3f\xb8\xef\x95\x63\xa2\x81\x39\xa9\xb3\xd6\x0f\x2d\x9a\x76\xef\x59\xa9\xde\xe8\x92\x69\x5f\x5e\x34\xff\xda\x27\xee\x5d\xbf\x78\xc5\xcd\x0f\xad\x78\x67\xf1\x3b\x0f\x3d\x34\xff\xf1\xb3\xa2\xf3\x1f\x5a\x94\x7c\x35\x7a\xef\xa2\x57\x87\x1e\xa2\xd8\x75\x5f\x7e\xf5\xcb\x23\xb5\xef\xbc\xba\xe8\xe6\x57\xef\x85\x5d\xeb\xcf\x7a\x68\xb4\x37\x16\x5e\x1f\x7e\xdc\x7e\xe7\xa1\x60\x79\xf5\xea\xd5\xab\x9f\x7d\xe6\x99\x67\x9e\xb9\xed\x30\xeb\xbc\x7f\xe3\x0d\x0b\x6f\xf8\x3e\x9c\x7d\xc2\xfc\x94\xfd\xed\xe5\x0f\x4d\x7a\x66\xd2\x42\x05\xbe\x96\x5e\x7d\xc2\xa9\xca\xc2\xd5\x0f\x5d\xbf\xf4\xf1\xb3\xdf\x7a\xf6\xea\xe5\x2f\x9f\x7a\xc7\xa9\x57\x5f\xfd\xfe\xa9\x8f\x3f\xab\xd8\xdf\x59\xfa\xf8\xa5\xcf\x2e\xed\x49\xbf\xb5\xf0\x1b\xe9\x85\xa7\xfe\x73\xe3\xfc\xef\xbf\x85\x32\x3d\x27\x9c\x70\xc2\xf2\xb3\xbf\x7f\xf5\xfc\x85\xc4\xbc\x7b\xfa\x61\xb8\x1b\xb4\x70\xe4\x2e\x2f\x32\xd0\xd1\x3e\x25\xf6\x07\xf0\x6f\x31\x9d\x78\xd0\x95\x0f\x13\x32\x84\xb9\x94\x7d\x3b\xda\xd6\x0e\xc1\x29\xa6\x31\xcb\x94\x1e\xf3\xeb\xa1\x0d\xdb\xda\x30\x8e\xb3\x0e\xce\x01\xfe\x3c\xdf\x6e\xfb\xab\xa8\x25\x86\x33\x15\xfa\x19\xfd\xa4\xfb\x4c\x4b\xb6\xe7\x80\x09\x06\xe7\xd2\x73\xff\x15\xa1\x87\xb7\x7c\x08\xfc\xfc\x8c\xc3\xf7\x6e\xbf\x91\xf8\x5d\xf2\x0c\xda\x61\xea\xf3\xac\x4f\x74\xe2\xc5\x22\xf4\x2b\x6f\xfb\xb8\x98\x66\xdc\xdc\x31\xbe\xb1\x6c\x72\x2e\xff\xf0\x71\xb3\x46\x24\xb1\xcf\x6a\x19\x2f\x77\x5f\xcd\xdd\x4b\x9c\x44\x8c\x89\xe6\xd9\x79\x7a\xd5\xee\xd6\xbd\x80\x7d\x1b\xdb\xf4\xcf\x52\x5c\x0f\xe1\x86\x1f\xb5\xe6\xdb\x27\x62\x18\x47\x1a\x98\xc4\x98\x10\x9c\xf1\xc9\xf4\xd4\xfd\x80\x2d\xf5\xb7\x58\xa8\x7f\xef\x6a\x38\xfb\x6e\xee\x3a\x1c\xbb\x5c\xd7\xb3\x02\x98\x02\x8e\x03\x27\x81\x93\x41\x02\x0c\xe1\xdd\xfe\x6b\x70\xa4\xdd\x40\x63\x87\xbf\xb9\xbf\xdf\xe7\x92\x2a\x6e\xbc\x4a\x1d\x45\x06\x9b\xce\xda\x5c\x18\xef\xe9\xeb\xee\x75\xbf\x20\xb3\xf7\x4c\xaf\x3b\xbf\x38\xc7\x0f\xec\x89\x77\x3b\x67\x92\xbb\x4a\x95\xb0\x1e\x86\x2c\xaa\xf0\x45\xd9\x92\xd8\x9c\x92\x4f\x96\xa8\x30\xcf\x2a\x49\x61\x5c\xa5\xd2\xb6\xa8\x41\x0b\x49\xf5\x0f\xc5\x4b\x62\x4a\x88\xca\x6c\x0a\x25\x35\x0d\x16\x51\xb2\xfe\x79\x82\x52\xea\xde\x73\xb5\x0a\x39\x01\x59\x13\xc0\x2c\xa3\xac\x0c\xd9\x0a\x0a\x07\x57\x1e\x0a\xa7\x75\xab\xcb\x94\x75\x5d\xd6\xca\x9a\xaa\x16\x32\xa6\xa2\x97\xa1\x22\x08\x9c\xc0\x73\x28\x53\x60\xb3\x5c\x1a\x19\x5c\x8a\x91\x18\x36\xac\xc3\xa2\xce\xa6\x59\x24\xf0\xbc\x61\xf1\xa6\x52\x42\x1a\x54\x0b\xaa\x26\x59\x41\xc1\xb0\x25\x3b\x8f\x44\x01\x66\xa8\x70\x20\xdc\x98\xb7\x05\xa1\x9d\xb4\xc1\x2c\x36\xae\xb8\xca\x9e\xdb\xc7\x7d\x33\xe2\xcf\x5b\x4f\xac\xbf\xe1\x2f\xb4\xda\xe7\xfd\xa8\x33\xaf\xe7\xca\xd8\xd1\xad\x3c\xc9\xe8\xa3\x2d\x9c\x6c\x2a\x94\xc3\x32\x76\x72\xe7\xf5\xb5\xb3\x82\xf5\xfd\x3f\x1a\xab\xcc\xdb\xa7\xad\xaf\xd7\xeb\x9a\x67\xf9\xf6\x6a\x84\x5d\xf1\x64\x7f\xdf\xcf\x5d\x1c\xe7\xe6\x40\x00\x47\x80\x63\x71\x6e\xf5\x14\x98\xe3\x72\x6f\xde\x0c\x4e\x26\x59\x76\xcc\xae\x3b\x5a\xdf\x17\x76\xd9\xdb\x94\x98\x81\xc1\xbe\xc0\xd4\x5e\xd7\xdd\x6b\x38\xf0\x87\x0d\xe9\x09\x3d\x3b\x5e\x2a\x69\xf9\xdf\x7d\xf7\x8d\x1f\xfe\x70\x1d\x3a\x75\xcb\x77\xa9\xd8\x5f\x47\xce\x3f\xff\x4b\xb7\x5d\xbc\x20\xfe\xa5\x2b\x67\xfc\xf5\x81\x73\x8f\x7d\xe6\xd8\xb3\xed\x83\xf0\x77\xe8\xe4\x37\x0e\x1c\x38\x6f\xc1\x8c\x78\xfc\x1c\xe6\x65\x26\x7e\xf6\xa9\x51\x74\x10\x7d\xf7\xd8\x2f\x2d\x38\xf5\xec\x5a\x1b\xe1\x46\x73\x86\x9d\xb6\x8b\x88\x91\xea\x33\x4a\x95\xd1\x6b\xcb\x96\xbd\xb8\x6c\xd9\xb2\x65\x67\xc3\x33\xd0\xcf\x5f\xac\x0d\xdf\x79\x5d\x6c\x79\xfc\xfa\xc0\xc2\x97\xb6\x7f\xff\xec\x5f\x6c\x0e\xa3\xaf\x2d\x5b\x83\xfe\xcf\xb2\x65\xe1\xe5\x77\xce\xb8\xfe\x3a\x26\xfc\xd4\x45\xe7\xbe\x1e\xee\xbe\xf5\x2b\x5d\xa7\x1e\x9e\x73\xf3\xec\xe8\xe8\x59\xd8\xff\xfe\x05\x91\xb3\x4d\xc0\x78\xa0\x19\x3f\x70\x14\x21\x37\x04\xb7\xb2\xfd\x37\x84\x1c\x10\x71\xce\xd6\x79\x3e\x3d\xef\xed\xcd\x59\x53\x5b\xf1\xa1\x6f\x9f\xdb\x89\xf7\x51\x26\x84\x90\x4e\x8b\x91\xc4\x3a\x1c\x37\x6c\xb5\xd5\x3e\x75\xf4\x90\xc5\xfa\x65\x99\x59\x3c\xd6\x17\xfe\xf4\xdc\xbf\x71\x2f\x46\xe8\xe1\x77\x7c\xba\xd1\x88\x24\xd6\xfc\xe8\xf0\xf2\x1c\xa1\x57\x91\xbe\xaf\xd9\xdc\xd7\xd9\xe2\xd4\xd5\x3d\x0a\xa4\x26\xce\xac\xbf\x07\x60\x5d\x19\xe3\xc0\x05\xe0\x6a\x70\x3d\x90\xc0\x62\xf0\x58\x5d\x0b\xb9\x47\xb5\x9c\xf8\xa2\x9e\xe9\xbd\x41\x87\xea\x19\x6c\x58\xff\xb9\x10\xd3\x10\xae\x4c\xc6\x03\xf1\xee\xf8\x64\xcf\x45\x68\xb8\x0c\xdd\x3e\x7a\xc8\xd5\x62\x7e\x82\xb8\x93\x0c\x76\x29\xaf\xc2\xff\x46\xc7\x53\x77\x9d\x3e\xe7\x8e\xc4\x54\x74\x32\x14\x8e\x41\x1b\xe7\x3c\xa7\xdc\x11\x0a\x2f\x0d\xdd\xfa\xaf\xa2\x32\x36\xf5\xed\xbf\xee\x7f\x62\x3f\xbc\xf7\xd5\xc0\xb4\xda\x87\x4f\x14\x8b\x50\x28\xda\x45\xfc\x0f\xea\x5b\x19\x13\x53\xfd\x61\x23\x2a\x3e\xbf\x47\x82\xd3\x2e\xe7\x6e\xe1\x44\xb8\x5e\x9a\xff\x04\x77\x8b\x7d\xd7\xf3\xbd\xfc\x6b\x8b\x6a\x9b\xdb\xa4\x53\xbf\xe8\xeb\xd7\x7d\xed\x2b\x57\x5c\x74\xf6\xd9\x77\x9e\xbb\x8c\x3d\x22\x16\x65\x98\xf0\xb9\x33\xbe\x76\xfe\xf9\xe7\x27\x63\xcb\xa2\xcb\xec\xad\xa8\x1b\x3d\x72\x05\x7c\x0e\x7e\x97\xda\x6b\x67\xd1\xb1\x70\xfa\x15\x57\x5c\x81\xfe\x71\xdd\x75\xd7\xfd\x01\x6d\xec\x8d\xcc\x10\x67\x3c\xc2\xcd\x5c\x08\xbf\xca\x9d\xbf\xf0\x12\x2e\x6a\xee\x99\x71\xe0\xf5\xde\xee\xef\xad\xef\x7b\xbd\xeb\xd7\x9f\xc7\x11\x9f\x13\x7a\xab\x8e\xab\x47\x66\xdb\xe0\x8b\xeb\x39\xc0\x2c\x5a\xfb\x0a\xb0\x26\xc6\x67\xff\x2f\x77\xc6\xc4\x04\xb8\xb2\xa1\x23\x46\x66\x1f\x07\x22\xf4\x8b\x2b\xdb\x7c\x43\x47\xd7\x1d\x41\xc8\x40\xfb\x1e\x50\xb8\x5d\xdf\x30\xf4\x70\xc8\xc3\xc3\xae\xcd\xdb\x7d\x0b\xde\xeb\x91\xf0\xb7\xb4\xdf\x87\x76\x7e\x67\xf7\x79\x04\x0e\xc9\xd5\x7f\x67\xeb\x83\x4d\xbd\xb6\x69\x99\x67\x73\x4d\x0f\xa3\xd0\xfb\xf6\xfa\xf0\x72\x33\x86\x35\x48\xac\x27\x02\x33\x0c\x77\x79\xf7\x48\x11\x31\x56\x09\x0b\xe7\xe4\xc9\x9c\x86\x79\xe3\x14\xe6\x64\xea\x98\x38\x01\x4e\x77\x25\xf8\x72\x70\x15\xf8\x32\xb8\xa1\x33\x2e\x0e\xc4\xbb\x4f\x82\x33\x60\x28\x8e\xcb\x50\x24\xfa\x87\xba\xfb\x26\xbb\x15\x28\x1a\x47\x80\xf0\x11\xa1\x8e\xe0\x99\x88\xa6\xa5\x36\xc0\xb8\x09\x57\xaf\x82\x71\xf4\x5f\xab\xd0\x62\x13\xfd\x57\x1c\xc6\xb8\x0a\x94\xa0\xc2\x23\xbe\x5a\x11\x15\x95\x4d\x55\xb4\x11\x91\x35\x58\x01\xbe\x1e\xb8\xb8\xf6\x0d\x78\x83\x69\xa2\x35\x81\xab\x6b\x3b\x6b\x37\xb5\x61\xe3\xb1\x40\xaa\x96\x37\x1b\xc7\x87\x82\x7f\x58\xbb\x76\xed\xda\xe7\x9e\x7f\xfe\xf9\xe7\xd1\x65\x36\x90\x04\x4b\x51\x15\x45\x10\x0c\x4a\xa7\x8e\x35\x32\xc9\xb4\x51\x9b\xf6\x74\xd7\xe9\xe3\x4a\xd7\x25\xcf\x1c\x3c\x8c\x54\x7d\xdf\x2e\x42\x41\x42\x79\x19\xf8\xce\x74\x39\x92\x10\x38\xcc\x5e\x36\xde\xe3\x06\x47\xe3\xb9\xd8\x44\x1b\xe0\x04\x10\x73\x99\x2e\x16\xcc\x02\x73\xc0\x02\x70\x07\xb8\x17\x3c\x8b\x6d\x90\x4b\x11\xb8\x6a\x81\x69\x64\x4f\x18\x9a\x3a\x0d\x0e\xf6\xf5\xf4\x0d\xf6\x9d\x48\x86\x92\x92\x9b\x41\xee\xba\x1f\x68\x52\xc6\xa7\x41\x3a\x54\xef\xaa\x0e\x55\xfa\x69\xc7\x2a\x39\x19\x42\x07\xe1\xac\xa1\xf8\xd4\xc3\x10\xf9\xa1\x4d\x68\x04\x9e\x57\x0b\x75\x4d\x89\x9e\x77\xd5\xf4\x23\x6b\x5f\xb9\xf7\xf1\x3b\xa8\x63\xba\xa7\xde\x9b\x98\x3a\xf4\x7b\xe5\xd3\x4f\x3f\x85\x5f\xf9\xfd\xc3\x3f\x45\x73\x17\x0c\x0d\x0d\x2d\x40\x7f\xb9\x6a\xee\x82\x05\x0b\xa8\x1f\x2c\x98\xcb\x0f\x2d\x40\x27\xdf\x36\x34\x74\xff\x10\x7d\xd3\x51\x8b\xbe\x7d\x53\xf7\x54\xea\xb4\x4b\x9f\x79\x00\x46\x4f\x47\x3f\xfa\xde\xaf\xd0\x47\x0b\xec\x1d\xb7\xf1\x43\x8b\x16\x6c\x17\xa7\xc2\xc9\x0f\x5f\x8a\xae\x7a\x78\xfc\xd1\xa2\x5e\x2a\x99\xa2\x74\xfa\xed\xba\x4b\xf8\x47\x75\x09\x65\x04\xf5\x81\xdb\xf9\x4b\xe6\x30\x76\x05\x49\x22\xb4\x60\x99\x2a\x27\x63\x6c\x8a\x2b\x4b\x92\x24\x15\xeb\x7f\x49\x48\x60\x79\x49\x60\x59\xde\x10\x45\x59\x11\x54\x41\x96\x53\x3a\x13\x8d\x4a\x49\x8d\x4b\xc6\x14\x45\x4a\x26\x4d\x56\x92\x58\x3d\x96\xe2\x78\x3e\x25\x1b\xb9\x28\x8b\x52\x1c\x2f\x76\xa9\xce\xfe\x40\xde\x34\x1e\x7d\xd9\xbf\x3f\xd0\xc2\x05\x6c\x71\x22\x87\xa0\x37\xa7\x38\x6e\x75\xff\x2f\x3a\xfb\x96\x8e\x4d\x5c\xfe\x8e\x2f\x8f\xa9\x7b\x46\xc9\xb1\x3f\xfb\x36\x78\xfb\xbf\xfe\x78\x34\x40\xd8\xab\x62\xf3\xfe\x26\x8e\x26\x31\x26\x70\xac\xf1\xd3\x6e\x9d\xf6\x46\xa4\xb1\x93\x7b\xf2\x12\x70\x1b\x00\xb0\x3b\xde\x3d\xe4\xec\x18\xd6\xa7\xb7\xbb\xb7\x67\x60\x30\x54\x17\x0e\x62\x65\xe1\x85\xe8\x60\xdd\xfe\xa1\xde\xd0\xc0\x10\x5e\xb9\xa1\x01\xfc\x99\xd2\x3b\x70\xce\x60\xc3\x86\x1c\x26\x5d\xce\x00\xd2\xb3\xd1\x98\x2a\xa6\xb4\x98\x9e\xe6\xf4\x72\xb9\x8c\xb6\x05\xaa\xb5\xb0\x45\x65\x6d\xbe\xfe\x41\xff\xe8\xca\x8d\x73\x01\x23\x25\x29\x66\xcc\x8c\xa5\xd4\x24\xc7\x64\x60\xd1\x62\xac\x34\x23\x84\xa3\x8c\xc6\xa4\x78\x89\x3b\x34\x50\xc0\x69\xe9\xa4\x24\x6b\xa4\x04\xd9\xe2\x72\xf4\x3c\x14\x45\x45\x21\xc5\xa6\xcc\x6c\x4a\xe1\x52\x5c\x40\x91\x45\x31\x27\x8a\xf6\x4c\xbb\x00\x05\x19\xe5\x24\xf4\xa9\xd9\x75\xb4\x2e\x4b\x56\x55\xce\x45\xcd\xb2\xa6\x95\x55\xb1\x10\x0b\xab\xac\xce\x71\x02\xac\x40\x19\x99\x96\xa2\xaa\x9a\x20\xd4\xa2\x01\xb3\xa0\x49\x90\x81\x4a\x3b\xc7\x67\xda\xad\xfa\x75\xe5\xd2\xa6\x7e\x35\x10\x81\x4b\xea\xdf\xa9\x3e\xde\xc1\xa9\x9f\xaf\x35\x30\x86\x61\x13\x73\xf6\x23\x7c\x7e\x70\x19\x05\xe6\x5d\xc9\x01\x66\xf1\xf0\x45\xef\x4e\x3a\x2f\x31\xdf\x62\x16\xad\x2d\xc3\x87\x40\x60\x70\xe6\x7c\x9e\xc0\x16\x75\xff\x67\x5b\x8b\x1f\x95\x72\x74\xf7\xda\x17\xea\x32\xf4\xe6\x4a\x5c\xe5\x58\x74\x75\xb1\x3f\xaf\xe0\x69\x60\x01\xf8\x0a\x58\x0c\xee\x04\xf7\x02\x30\x9d\x3c\x15\xd4\xfc\xbb\x3f\xd0\xa6\xa1\x0f\xcb\x5d\xd4\xbb\x70\xb6\x9b\x89\xe3\xe3\xce\x6f\xe2\xa9\xef\xed\x89\x0f\x06\x7b\xe2\x83\xb0\x27\x3e\x18\xd0\xb4\x94\xa4\xcb\x81\xb4\x24\x2a\x82\x6c\x0a\x29\x23\xc9\x9b\x1c\x63\x30\xec\x4d\x16\x14\x0d\xc8\xa0\x8a\x81\xd2\x16\xaa\x40\xa6\xd6\xc6\x2f\x06\x2e\x36\xa6\x4e\x83\x5c\xef\xb4\xe1\xc1\x69\x70\x39\x1a\x82\x2f\xa3\x07\xf0\xe7\x7b\xb5\x8b\x8c\xc4\xe0\x5d\xbf\xff\x3a\xbc\x07\x2d\x77\x3e\x59\x36\xa7\x0b\xba\xa5\x18\x8a\x61\xf0\xba\xc5\xa5\x8d\xa4\x69\x25\x33\x46\xb0\x6c\x9a\xa6\x8e\xc3\x4a\x8a\x87\x51\xd0\xd9\xb3\x38\x8e\x63\x59\x5e\x7c\x4d\x7d\x7e\xa9\xb1\xd4\x38\x8b\xba\x29\xc5\x8a\x30\x14\x55\xd5\x89\xa5\x4b\xd1\xc1\xa5\x4b\x9b\xb8\x0d\xcf\xf3\xda\x97\xdb\xfc\x0d\x6f\xcf\x2f\x42\xef\xfd\x36\xa1\xd3\x89\x5c\xdb\x46\xcd\x87\x57\x3d\x19\x33\xc8\xba\x65\x7a\x73\xed\x1b\x87\x08\x7d\x61\x34\xdb\x57\x91\xf5\xe4\x89\xf3\xc4\xab\x37\xbb\x36\xe3\xaa\x89\x54\x68\x33\xbd\x06\xcf\xff\x89\xb8\xc2\xf2\x7c\x70\x21\xf8\x12\xb8\x02\xdc\x04\xee\x00\x4f\x34\xea\x46\x10\xca\x7f\x36\x9c\x35\xe4\xa5\xc7\xeb\x77\xf7\x73\xfd\x3e\xab\x93\x16\x00\xd6\x3d\x95\x58\xb0\x55\x86\xfa\x83\xd8\xd3\xed\x71\xdc\xe0\x46\x86\x9f\xba\xe7\xdb\x13\x98\xda\xd3\xf4\x81\x66\xf6\x4f\xee\xeb\xee\xeb\x0e\x86\x6e\xbe\xf6\xda\x6b\x6f\xa6\x82\xd7\x5e\x7b\xcf\xa2\xc5\xf6\xba\x57\x92\x8f\xdd\x7b\x73\x88\x09\x3f\x76\xcc\x7c\xf4\x87\x8f\x2f\xff\xce\x73\xf3\x2f\x7b\xfc\x5a\x7b\x63\x80\xb1\xa8\xaa\x9d\xa9\xc2\xac\x80\x92\x4e\x5d\x3b\x56\x82\x0a\x4c\xd9\x16\x7d\x27\x87\x64\x3b\x9d\x84\x65\xa8\xe9\x29\x5e\x13\x50\x86\x63\x74\x26\x55\xe0\xa2\x1a\x93\x82\x2a\xd2\x02\x06\xd2\x29\x66\x5c\x82\x55\x24\x06\x0a\xb5\x54\x20\x59\x2b\x06\x92\xb5\xc2\x83\x86\x26\x4a\x5c\x92\xe1\x52\x31\xdd\x2c\x99\xd4\xa6\xb9\x17\xdf\x7c\xf3\xdc\xb3\xbe\xba\xfc\xe2\xe7\x9e\x98\xf1\x9d\x93\xa7\x84\x42\x53\x6e\x9e\xfb\xc4\xac\x59\x17\xff\xf6\xe4\xad\x77\xcf\x7d\x02\xfd\xe9\x85\x17\xee\xbf\x6d\xd6\xf0\x6d\x69\xf4\x17\x78\xf4\xc6\x1b\xef\x9f\xb5\x8c\x66\xef\x4c\x4d\xba\x63\x61\xdf\x35\x1c\x97\x3a\xf1\xdc\x73\xfb\xb8\xd4\xa4\xb3\xeb\x7f\x7f\x74\xdb\x6d\xf3\x6f\xbb\x6d\x04\xdd\x7b\xe3\xfc\x1b\xe7\x53\x2f\xeb\x28\x9b\x33\x15\x99\x31\xa2\xa2\x9e\x87\xfc\xb8\xd9\x55\x71\xf5\xc8\x77\xe8\xd7\x99\x25\x66\x1e\x3e\x06\xc0\xcc\xb5\x1c\x70\xf1\xd4\xa2\x8d\x2b\x60\x09\x1c\x77\xde\x23\x5c\x43\x76\x9e\xa2\x1f\xab\xe3\xd0\x00\x98\xf3\xdf\x1c\x60\x16\x1a\x03\x8b\x82\x73\xff\xc1\x91\x3c\x87\xe7\x3b\x6d\xd8\x4a\xe8\x85\xb7\x69\x95\x59\xb2\x8b\x47\x05\x00\xce\xfd\x7b\xa3\xff\x48\x68\x97\x18\xbc\xb2\xd3\x3e\x86\x71\xd0\xe7\x5f\x35\xf3\x71\xbe\x49\xc8\x19\xce\x11\x93\x59\xea\xe3\xab\x38\xb7\xce\x5d\x43\x1b\x56\xdb\xfc\x34\xe7\x2c\x55\x23\xd7\x40\xb2\xb1\x4e\xd6\x2d\x89\x62\xce\xa6\xd2\x8a\x91\x9d\x75\xf2\x2f\x82\x2f\x26\xe4\xde\xf8\xac\xf3\x3e\xcc\xbe\x4d\xa0\xe3\xfe\xc1\xba\xb3\x89\xe7\x24\xce\xd9\x19\xff\x74\xfd\x7a\x97\x33\x03\x93\x09\x8f\xeb\x5a\x70\x8f\xe3\x69\xb5\xea\xc2\x50\x6f\x67\x9d\x87\x0f\x4b\x06\x07\xe3\x3d\xa1\x81\x41\xda\xd3\x7c\xce\x6e\xaf\xbb\x20\x1a\x1b\x37\x87\xf3\xac\x80\x05\xa3\x16\x8c\xa1\x92\x85\xca\x16\x2a\xc1\x98\x62\xc4\x60\x38\x1a\x33\xd9\x28\xcc\x21\xb1\xae\xb5\xea\xf8\x03\x5a\xe3\xf9\x58\x4c\x4a\xc3\x2a\x32\x85\x70\x58\xa8\xdb\x30\x28\x23\xba\x64\x49\x46\x0e\x26\x51\x91\xca\xa3\x3c\x4c\xa1\x3c\x2c\xd6\xc2\xf6\xf5\x6d\xe7\x7a\x54\x49\x92\x74\x55\x95\x65\xbd\x1c\x13\xd8\x24\xcb\xf1\xaa\xac\x88\xaa\xac\xc2\x74\x32\x26\x5b\xbc\x2c\xff\xff\x58\x7b\x13\x38\x27\xca\xf3\x71\xfc\x7d\x27\x9b\x49\xd4\x56\x66\xb3\x2c\x1b\xef\x89\x0b\xd9\x78\x47\x57\xd8\x28\x0a\x83\x07\xa4\x78\x30\x1e\xc8\x78\xd5\x50\x15\xc6\xa3\x30\x2a\xea\x50\xaf\x11\x2d\x0c\x1e\x30\xa2\xc0\x20\xbb\x30\xdc\xe1\x0e\x2c\xb4\xa9\xad\x35\xb6\x55\x53\xab\x36\x3d\x6c\xd3\xd6\x23\x3d\x6c\xa3\xf6\x48\x6b\xb5\x5b\x76\xe7\xcd\xff\x33\xef\x24\x93\x77\x92\xa1\x9f\xdf\xff\xf3\xf9\xd6\xee\x02\x6f\xde\xbc\xc7\xf3\x3e\xf7\xfb\xbc\xcf\x13\x63\x82\xbc\x20\x14\x44\x11\xed\x8e\x71\x22\x17\x16\x24\x29\x25\xa7\x24\xb3\xec\xff\xee\x61\xdf\x84\x80\x23\x81\x58\xbd\x39\xa0\xd3\x22\xe8\x04\x51\x70\x01\xb8\x12\xdc\x06\x1e\x00\xdf\x00\x8f\x82\x27\xc1\x33\x00\xd4\x3d\x23\x78\xcf\x9d\xf8\xa6\x7c\x42\x5f\x37\xec\xa2\x03\x44\xf2\xf9\xbe\x93\xa0\x67\xb7\x40\x57\xe3\x49\x4d\x9f\x05\xfc\x09\xbe\xda\xb5\x19\x19\x17\xd1\x1e\xe9\x69\x8f\x74\x4e\xa8\xe9\x33\x51\x4b\x6d\x6d\xaf\x9f\x44\x2d\xfc\xa4\x16\x24\x65\x54\xd4\x42\x56\x16\xf8\x24\xaf\xf2\x92\x68\x08\x39\x5f\x49\x8c\x73\x22\xcf\x25\x05\x89\x4b\x72\x1c\x97\xcc\x56\xca\x6a\x25\xab\xc8\x29\x41\x56\x93\x62\x4a\x4b\x66\x34\x3e\x16\x4b\x24\xac\x2e\x2a\x97\x96\x93\x3c\xcf\xc5\x20\x5a\xbc\x6f\xdf\x74\xf1\x01\xf1\xc4\xf9\x0f\x8e\x3b\x01\x51\xd3\xcd\xb7\x7f\xbd\x63\xd4\x09\x73\x1f\x9d\x3e\xff\xc4\x13\xfe\x86\x7e\x7c\xd1\x33\x70\x2b\xba\x01\x6e\x85\x5b\xaf\x3a\xf7\xd1\xd3\xa7\xfb\xbe\xb4\xe1\x90\xb8\xc1\x5f\xd4\x34\x99\xe3\xa4\x24\x57\xca\xa7\x04\x31\x25\xc1\x60\x22\x16\x8b\xa7\x62\x6c\x3c\x26\x32\x6c\x98\x4d\x72\x9c\xa6\xc9\x4a\x42\x4e\xc8\xf9\xa2\x28\xa4\x52\x12\xc3\xc7\x59\x36\x96\x4a\xc4\x12\x71\x31\x99\xe0\xd9\x58\xdc\xbc\xf4\x91\x47\x9e\x44\xbd\x73\xf9\x31\x4f\x8e\x39\xa1\x17\x66\x3e\x35\x3f\x7e\x7d\xdc\xb8\xce\x31\x17\x3d\xfc\xe4\x45\x13\x4f\x3f\xb7\x77\xa2\xef\x8c\x79\xf3\xe6\xbd\x3d\x6f\xde\xa8\x07\x9e\x3c\x7f\xc5\x3c\x6a\x31\x7a\x66\x64\x04\x2e\xf0\xf4\x6d\xac\x7e\xc0\x9b\x9e\xd6\x7e\x95\xf0\xaf\x61\x1d\x63\xd7\x58\x97\xbc\x93\xaa\xbc\x1d\x5f\x6b\xeb\x35\xab\xcb\x44\x7f\xfb\xdd\xce\xd6\x16\x1f\xb9\x52\xa7\xbf\x10\xbd\xf3\x9f\x44\xbb\xde\x68\x5f\xbd\xc2\xa1\xfb\xb8\x6d\x23\xd5\xd6\xd9\xef\xea\xaf\x84\xa2\x3a\xbe\xbf\xda\x2d\x10\x72\x56\x69\xf0\x8f\x95\x41\x82\x17\x1a\x04\xdd\xbb\x7d\xd3\x8e\x2f\x5b\x23\xe3\xf0\x70\xff\xe7\xf3\x8e\x36\x55\x97\xfb\xfd\x56\xfb\x0b\xbf\x1c\xeb\xf8\x9a\xc1\xd1\xb5\xdc\x3a\x0d\xbc\xbf\x1a\x5c\x07\x6e\x00\x5f\x05\x0b\xc0\x63\xe0\x09\xb0\x04\x3c\x03\x56\xfc\x9f\xe3\x3f\xb4\xfd\xcd\x4e\x09\x58\x78\x18\x7a\xb0\x06\xea\x69\x23\x08\xc1\x17\xed\x89\x74\xda\xc2\xfa\xff\x86\x0a\x46\xd2\x74\xf2\xbf\x59\x0d\x73\xa1\x0a\xe4\x55\x98\x32\x55\x2a\xa1\xa7\xd3\x82\xa2\x48\xac\x22\xc7\x63\x66\x9e\xb7\xcc\x2c\x0e\x15\x50\x25\xa9\xc1\x3c\x4a\xc0\x7c\x22\x16\x47\x79\x9f\x2a\x24\xe4\x84\xf0\x7f\x42\x11\xa8\x80\x74\x19\xff\x0f\xa9\x82\xa0\x22\x25\xc5\x33\x2a\x13\x8e\xc3\x54\x11\x85\x45\x29\x99\xe2\xd8\x24\x95\x93\x78\x3e\x23\x08\xa8\x14\x8f\x19\x50\x49\xc9\x09\x25\xd5\xea\x6f\xd6\xfe\x45\xe0\x41\xb1\x71\xa7\x53\xb3\xa9\xfe\x89\x73\xb9\x8b\xb6\x2f\x05\x30\xe0\x24\x00\x20\x15\xe8\x01\xb5\x5a\x7c\x94\x75\x60\xfe\xde\xd1\x81\x90\x3f\x00\x70\x3a\x43\x10\xa2\x0c\x3d\xab\xc2\x98\xae\xb3\xb1\xb6\xa0\xc2\x6b\x72\xdc\x94\x0d\xa6\x42\xc9\x92\x99\x2b\x4a\x26\x2b\x40\x1e\x4a\x72\x5b\x16\xa5\x33\x32\x8c\x51\x71\x56\x93\xf5\x30\xd2\x0c\xa1\x58\x11\x32\x9a\x99\xab\xa4\x21\x03\x73\x88\x29\x1b\x29\x18\x83\x02\xa8\xd5\x6c\xc2\x77\x5d\xfb\x70\xde\x8e\x7d\xf5\x9a\x0f\xa2\x93\x0f\x0b\xe7\x7f\xda\x37\xd3\x75\x57\x2a\x87\xa2\xfb\xae\xc1\xed\xd7\xb6\xb4\x5f\x8b\xdb\xaf\x76\xee\x49\x6a\xe3\x1c\x3c\xdf\x35\x8e\x13\xa3\xba\x0d\x57\xdd\xd8\x77\x95\xab\xbf\x35\x0e\x8f\x6d\x9f\x89\xcd\xba\xe9\x3e\x5c\xcf\x68\xf0\x53\xc7\x26\xc2\x31\x26\xcc\x9c\x7d\xd7\x4e\x07\x93\x8e\xe5\x40\x88\xde\x55\xd7\x1b\x96\xda\x79\x27\x99\xb9\xdb\xae\x37\xcf\xa8\x56\xcf\x9f\x35\x79\x13\x33\xf5\xc0\xc4\x24\x98\xb4\x03\xeb\x44\x63\xab\xc9\xc0\x5b\xb4\x1a\xea\x39\xb0\x1b\x8d\xad\xfe\xde\x5a\xc5\x58\x40\xc6\xe8\xef\xbb\xd2\xb5\x06\xc3\xa9\x37\x7e\x7a\x63\x0d\x38\x27\x56\x3c\xa0\xd2\x0b\xb1\x6e\x7c\x6e\x3d\x23\x11\x4e\x47\xd9\xde\xdb\xde\x3d\xbe\xdb\xce\x45\x89\xff\x15\x19\x1f\x99\xd0\x70\x8e\xd6\x8f\x39\x62\x59\x39\xf8\xf0\xdb\xbb\x7c\xa3\xbb\x4e\x84\x5d\x81\xa8\x2f\x66\x70\xc9\x21\x24\x64\x35\x2d\x1b\x43\x8a\x00\xb9\x18\x2a\xe8\x06\x12\xa9\x04\x8f\x44\x21\xa1\x26\xf8\xb6\x98\x11\x66\x61\x85\x8f\x1b\xc9\x38\xd2\x79\x49\xc9\xc0\xa0\x50\x94\x60\x52\x67\xc4\x84\x21\x48\x45\x5a\x8a\x65\x55\xcd\xcc\x43\xdd\xe4\x15\x24\x57\x2c\xb1\x4e\xc5\x90\x44\x25\xb4\x4c\x46\x52\x39\x45\xe6\xd9\xe5\xf2\x63\x41\x34\x34\xb7\x47\xcf\x0c\x6d\x9b\x0b\x19\xf3\x48\xb4\xe6\x3f\x8f\xc1\xe5\xd4\xaf\x82\x68\x3b\xf7\x0f\xed\x43\x5e\x2b\x35\xf0\x41\x0e\x45\x77\x7e\xcd\x05\x13\xc7\xe7\xb7\x73\x34\xf6\x3a\xfc\x95\xf0\x39\xe2\xf3\xdd\xf1\xef\x96\xf3\xb2\x6d\x0c\x9c\xf7\x6e\x6b\x5d\x27\xd4\xeb\x76\xe9\x3e\xcc\x8b\xb5\x7a\xfe\x95\xb4\x73\x7f\x8a\x69\x6a\xdb\xe7\x04\x7e\x96\xad\xf1\x33\x1a\xc6\x9f\x99\x5c\x53\xec\xc1\xe6\x15\xae\x79\x9d\x3b\x5d\x7d\xd8\x63\x3d\x96\x4d\x1d\x77\xb5\x4b\xce\xdd\xff\xed\xb8\xfd\xaf\xce\xbc\xb5\x98\xf0\x9d\xc8\x05\x07\xa9\x7e\xc7\x60\xef\x6b\xcb\x55\xae\xbb\x26\xab\xfd\xaf\x56\xfb\xc1\x41\x17\x3e\xab\xa1\xe8\x5e\x7c\xd7\xe4\xe0\xbf\xe8\x86\xcf\xbe\x2b\x9a\xef\x1e\xb6\x5c\xe6\x9a\xf7\xa1\xea\xe8\xc0\xf3\xf4\x42\x66\xce\xe0\xa7\x3f\xfe\xf9\x94\xe3\xb8\x9b\x98\x39\xbb\xc7\x44\x2f\x99\xf4\xcd\x0b\x6f\x63\xa6\xaa\x2b\x6e\x79\xf9\xa2\xf4\xf9\x39\xe7\x3c\x9c\x71\x77\x7f\xd6\x32\x1f\x5e\xdf\xde\x7a\x4e\x76\xd9\xdd\x7f\x53\xbd\x56\xeb\x23\xb5\xf6\x9e\x4d\x6f\x8c\x98\x80\xb1\x4f\xdc\x35\x3e\x1e\x67\xf3\x0e\x02\x8e\xf8\x9e\xd7\xe6\x0b\x9b\x9e\x6f\x81\x0b\x1e\x7f\xe0\x2c\xe2\x3c\x6c\x3e\x82\xf1\x60\xc3\xa7\x2e\x7e\x61\xc9\xea\xbf\xba\xce\x43\x72\x8f\x63\x7c\x93\xb0\x71\xf1\x38\x06\xf6\x73\xec\xfb\xb9\x0b\x2f\xe5\x50\x74\xc3\xc3\xae\xf3\x76\x6a\x4b\xd8\xeb\xdf\x78\x4d\x73\xff\xc1\xdb\x5c\xfd\x1d\xb8\x19\xcf\xba\xf0\x5e\x75\xf8\xd4\x5d\xae\xfe\xc9\xfa\x1b\x56\x7b\x5f\xfa\x21\x17\x9c\xd5\x50\x74\xe0\xab\xae\x71\xe2\x75\x9f\xfd\x3a\x5c\x03\x65\xdd\xfc\x66\xdb\xc3\x1e\x67\xf7\xdf\x5c\x78\xa9\xd4\xd7\x6f\xb4\xb7\xd0\x1b\x6e\x1f\x38\x93\x80\x9b\x35\x4e\x4f\x3f\x34\x71\x16\x3a\x0c\xa1\x20\xf8\xa6\x3d\x3e\x18\x0d\xc2\x38\x37\x8c\x65\xe7\xdf\x08\xee\xb0\x6c\x98\xd1\x01\xcb\x0a\x19\x05\xeb\x3a\xf1\x84\xbe\x09\xe3\xba\x7c\x3d\x1d\xbd\x9d\x38\xc6\xb4\xf1\x56\x3d\xd4\xdc\xd7\x6a\xb3\xbd\x00\xb5\x2b\xa1\x2e\x9f\x8b\xf5\x75\xe0\x5c\xd9\x16\xef\x0b\x75\x05\xa2\xd4\x63\x6b\x82\x4b\xc5\xd9\xcf\xfd\x8c\xf9\xfd\xab\xd2\xf6\x7d\x77\xa0\x57\xae\xfa\xe7\x1d\x02\xfa\xcb\x86\xd9\x6b\xee\x5d\x7a\xfd\x1d\x57\x3d\x1e\x64\xee\xb8\x7e\xf6\x57\x92\x5f\xb9\xe7\x9e\xa5\xf7\x50\xfe\xa5\xc1\xaf\xc4\xee\x99\xbd\x94\x79\xfc\x9e\xd9\xd7\xa7\xce\x5b\x78\xcf\xc2\x3b\xd6\xdc\x73\x4c\xf2\x0e\xce\x1c\x59\xd8\x9e\xbc\x23\xd1\xb6\xd3\x88\xc3\x2c\x17\x33\x38\x16\x15\xb8\x94\xac\x55\xf8\x8c\xa4\x68\x7a\x30\x93\x91\xb2\xf4\x7d\x4f\xdd\x7d\xc5\x5d\xf7\x3d\x75\xd3\xa5\x8b\xb6\x3f\xb4\xfd\xa1\x0f\x9f\x7a\xe2\xd6\x7d\x6b\xbe\xe8\x42\x7b\x4e\x42\x5f\x5a\x33\x7f\xe6\xbc\x99\x33\x7b\x6f\x9e\xff\xd8\x9c\x99\x0f\xde\x3c\xef\x66\xc8\xc0\x6b\x6e\xbe\x7c\x62\xef\xcc\x79\x57\xcc\x99\xa7\x3e\xf0\xd8\xcd\xea\xed\xf3\xe6\xc0\xc0\x0f\x8f\xd9\xb8\x64\xa2\x3a\xef\xe4\x35\x4b\x26\xaa\xfe\x36\x16\x0d\x29\x41\x34\x24\xc6\xf4\xcc\x50\x5a\x84\xcc\xc8\x10\x32\x2a\x4a\x96\x62\xa0\x11\x44\x05\xce\x2c\xe7\xb4\x12\xc1\x8f\x1c\xbc\xd5\xfe\xe1\xe0\x5b\x0d\x6f\xd7\x9e\xe5\x9c\x8a\x4b\x5e\xda\xe7\xb8\xf2\xc8\x66\x5f\x91\x8d\x0f\x03\xf5\x7b\xc7\xf9\xf6\xf8\x4c\xcf\xda\xea\xc8\x4f\xc1\x91\x21\x8c\x89\xad\xfc\x77\xf3\xfd\x2d\xf2\xdb\xc6\xcf\xff\x12\x78\x45\xb4\x6b\x7f\x27\xf0\xd3\x7e\x73\xbe\xae\x41\x5f\x00\x02\xb1\xaa\xe3\xfc\x90\xa3\x70\xb5\xb0\xda\x55\x82\x5d\x47\xb8\x8d\x35\x28\xc3\x4c\x51\xc5\xa1\x02\x4c\x18\xb0\x44\xcb\x66\x56\x1f\xd1\x75\xbd\xad\x32\xcc\xd8\xdf\x55\x03\x3a\xcd\x80\x0e\x00\x3a\x6a\xdf\x6c\x7c\xbb\x3d\x92\xa7\x35\x33\x4e\xe9\xa6\xe8\x63\x86\x0a\x30\x6e\xc0\xcc\x48\x89\x66\x74\xb3\xac\x9b\x82\xae\xb7\x31\xc3\x15\xbf\x80\x75\x2a\xa1\x2a\x05\xd2\xb4\x04\x18\x10\x73\x56\x31\xae\xab\xcd\xdf\xd3\xd7\xde\xdb\xde\x07\x7b\xdb\xc7\xf6\x75\xb5\xf9\xf1\xbd\xe5\x24\xd8\xd7\x75\x34\x85\x03\x9d\x54\xc3\xb2\x79\x21\x1b\x46\x9c\x59\x64\x0d\xa3\x42\xc5\x0c\x08\x8a\x22\x1a\x42\xf9\x84\xa8\xf3\x6c\x30\x1d\xe4\x94\x4a\x5e\xa6\x25\xb3\xa8\x9b\x80\xd7\xb5\x54\x3a\xec\x0f\x0e\x87\xe3\xfe\xb2\x69\x88\x9a\x66\x48\x23\xc5\x30\xcb\xca\xa5\xc4\x90\xc1\x25\x05\x9c\x33\x5d\xa9\xb2\x01\x05\xe7\x8f\x3f\x0e\x44\x88\x3b\xd7\xfa\xae\x7a\xdb\xc7\x76\x74\x51\xb8\x5e\x00\xec\xb2\xc8\xc0\x97\x31\x28\xc9\xd4\x7c\xf1\xff\x02\x98\x34\xac\xff\xc7\x72\x46\xc1\x14\xcc\x74\x12\x66\x61\x02\xa5\xd5\x74\x56\x29\xd0\xca\x90\x3e\xa4\xeb\xb0\x8c\xc2\x55\x60\x16\x33\x10\x70\xa8\x88\x14\x59\xe3\x15\x2a\xc9\xa3\x62\x5a\xce\xdb\xba\x49\x8d\x3f\x82\x30\x8e\x42\x39\xd7\x82\x6c\xd4\xd7\x6b\x81\x37\xd4\x61\xdf\xd1\x50\x74\xf7\xc9\x3d\x94\x2f\x52\x77\xbc\xe1\xdb\x32\x0b\x64\x76\x18\x01\x86\x99\xd4\x26\x33\x41\x3d\x4c\x31\xe6\x50\x5c\xe6\xb9\x58\x2c\xa8\x85\xa5\x94\x26\x19\xf1\x61\x85\x0e\x2a\xbc\xce\x4b\xc3\x09\x1f\x3b\x52\x82\xaa\x01\x53\xc8\x28\x64\x59\x14\x36\x8d\x44\xd6\x28\xb5\xe9\x45\x18\x44\xac\x8e\x00\xca\x17\x32\x69\x16\xe5\xb3\x15\xc8\x51\x1a\xc5\xab\x46\x32\xa3\x84\x35\x94\x42\x65\x0d\x89\x6c\x4c\x17\x79\x3d\x4c\x15\xcc\x64\x8c\xac\xc9\x31\x80\x75\xad\x9d\xf8\xcd\x65\x4d\x5f\x36\x30\x3c\x6b\x67\xdb\x4e\x40\x14\x5a\xcb\x1e\x73\x0a\x0c\x74\xb3\x63\x2d\xae\x83\x75\xe9\x31\x5d\xed\xbd\xb0\x6c\xc0\x14\x2e\xc0\x8b\x71\x47\xa1\x52\x54\xda\x14\x4a\x30\x05\xc3\x89\x12\x02\x66\xc5\x48\xe9\x32\x8c\x25\x8c\x70\xc2\xa8\x18\xfe\x32\x8a\x51\x52\x59\xaf\xe8\x3a\x62\x74\x94\x89\xa5\xb3\xe9\x62\x46\x86\x02\x2c\xb2\xb9\x74\x36\x49\x95\x1b\x32\x00\xdb\x8f\x6b\x71\x9e\x45\xad\xc1\x8b\xe5\x80\x4e\xb3\xa1\xe8\x6e\x9c\x0b\x78\xf7\xaf\x1c\xda\x56\x03\x45\x5a\xb4\xf7\x14\xa2\x0f\x7c\xc0\xd5\x65\xc0\x54\x6c\x37\xcc\xdd\x37\x05\x30\xe6\x19\x1c\xb8\xf8\x94\x10\xad\xf7\x3a\xf2\xc7\x7e\xbf\x67\xc3\x01\xdb\xd8\xc0\x07\xae\xad\x4a\x81\x75\xf4\xe3\x60\x14\x60\x41\xbc\x8e\x57\x98\x5a\xb0\x53\xa8\x86\x67\x0d\xac\xf7\x35\x81\xca\xbf\xee\x79\x18\x45\xbf\x85\xb3\x46\x8e\x3f\xb0\x76\xe7\xc8\xbc\xb5\xf0\x44\xf4\x07\x38\x26\x8c\x1e\x47\x67\x9d\xfd\xf4\xa6\xa7\xba\x37\xc0\x29\x06\xf5\xa2\x39\xc7\x77\xce\xd0\x4f\xe0\xe3\xd4\x2f\x7f\xb3\x0c\x6d\x58\xb6\x8c\x4a\x98\x79\xea\xe5\xdc\xb2\x43\x17\xdf\xbf\xf8\xc6\x67\x4f\xa6\x7a\xcc\x7f\x45\xfc\xcf\xa0\x93\xa8\x87\xff\xba\xf6\xf3\xb5\x6b\x1b\x32\x1f\xdb\x41\x3a\xae\x0b\xaf\xd5\x65\x5a\xa9\x3a\x31\x30\x9f\x1e\xcb\x4c\xd3\xc4\x6a\xb8\xfa\xfe\xd4\x24\xf7\x1c\x6e\xbf\xb1\x2a\xd5\x72\xdb\x9c\x3e\xbc\x2c\x44\x6f\xfa\x9b\x23\xbb\x6a\x32\x59\xff\x0f\x1e\xe7\x53\xe2\x1e\x84\x6c\xff\x84\xd0\x29\x74\x3a\x11\x8a\x7e\x19\x67\xdf\xd0\xea\x75\xba\xbe\x51\xbf\xaf\x5e\xb7\xc2\x82\xfb\xc0\xe9\xc7\xfe\xc0\x91\x81\x06\x9d\x0a\x45\x37\xe3\x8c\xf8\x3b\x35\x42\x77\x30\x68\xde\x7e\xd3\xc7\xd0\x5a\x99\xd0\x65\xec\x7c\xea\x38\x4e\x54\xfb\x4b\x8d\xe7\xa5\x71\xee\xfb\x30\x38\xde\xe6\x5b\x96\x5e\x4f\x41\xe0\xef\x01\x90\xc8\xe0\x02\x3a\x22\x69\x3a\x3b\xa2\x24\x92\xbe\x70\x0e\x15\x50\xda\x1c\x12\x7c\x59\x98\x30\x39\x36\x6e\x18\xb2\x9a\xd6\xd2\x02\xcc\x66\x4d\x85\x0e\xeb\x9a\xa2\x21\xb6\x0a\x50\x41\xd5\x20\xf0\x81\x78\x42\xcf\x29\xd9\xb4\x9e\x52\x21\x0b\x8b\xf6\xf9\xbf\x5f\xbd\x3c\x30\x9a\x3e\x13\xbf\x27\x39\xc9\xae\xcc\x68\xcd\xed\x23\x27\xc4\x16\x06\xe6\x2d\xd0\xf7\x8e\xa6\x45\x2d\x02\xfd\x77\x78\xca\x42\x59\x99\x2d\x8b\xf7\x28\x70\xf6\x3e\x83\x8d\xf9\xee\x7a\xd5\x9c\x63\x7e\x90\xf2\xfd\x10\x7e\x85\x3e\xd3\x14\xe1\x0e\x1d\x3d\x78\xf6\x35\x0f\xf5\x3f\xfc\xcc\x33\xf7\x5d\xfd\x10\x1c\x05\xfb\x23\x37\x5e\xfd\x0c\x7a\x00\x75\x2f\x18\x78\x8d\xba\x07\x40\x3b\x86\xde\x5f\x01\x67\xd7\xf8\xb4\x17\x3b\x6d\xb7\xc0\x40\x41\x6b\xdb\x2e\x18\xc8\x01\xc6\x34\x20\x5b\x11\x51\x09\xa5\x39\x35\x9d\x64\x83\x46\x90\x53\xcb\x65\xc5\x1c\x62\xe3\xb0\x22\x98\xe1\x14\x25\xcb\x48\x89\x27\x0c\x29\x25\xea\x09\x4e\x86\x61\x05\xe9\xfe\x8a\x6e\x16\x44\x4d\xd3\x25\x33\x1b\x66\x63\x62\x29\x3e\x64\x70\x3c\xef\x4f\x6a\xca\x48\x0a\xe9\x1a\x0c\x52\x45\x59\xe4\x25\x4d\x12\x52\x82\x0c\x65\x58\xac\xe3\x4a\x2c\xa0\x5b\x67\x39\x88\xb3\xdc\xef\xfe\x31\x68\x6a\xdf\x84\xdf\x2c\xb8\xda\xb1\xef\x67\xc7\x03\x1e\xfd\x2d\x1b\x1e\xe7\x66\x1d\x38\x8a\x68\x4f\xd3\x42\xbd\x7d\x70\x91\xa3\xd7\x59\xb8\x9b\x08\x45\xf7\xf7\x63\x9f\xf2\x5a\x57\xff\x78\x28\x3a\xf8\x2d\xd7\xf8\x89\x2a\x5f\xd3\x57\xe7\x59\xed\x2f\x7c\x00\x80\xfb\xbe\x6e\xdb\x0d\xae\x76\xb6\xca\x07\xf2\xb4\x14\x8a\xbe\xf0\x41\x19\x84\x68\x63\x46\xac\x31\xbe\xd6\x58\xe7\x0b\xff\x01\x64\xbb\x1c\x8a\xee\x7a\x16\xc7\xb0\x2d\xab\xcf\x5e\xfb\xcc\xf6\x6b\xe1\xef\xec\x0c\x11\x6b\xc2\xef\x12\xb7\x5f\xe9\x9a\xdb\xea\x9f\x69\xf4\xdf\x7e\x9d\x6b\x6f\x4e\xfb\xbe\xcb\x89\x71\x34\x8b\x1f\x6e\x7d\xa0\x65\x1c\x02\xa6\x4e\x6d\x6e\xe7\x8d\xf5\xe6\x3b\x5b\xfa\x6b\x8d\xf1\xf5\x98\xd7\x7a\x42\xf4\xbe\xdf\x35\xaf\x67\xe0\xb4\x96\xb3\xcc\xd0\x5c\x28\xba\xfb\xcd\x96\x76\xa5\x31\xfe\x8b\xdf\x20\xda\xb3\x8d\xf6\x2d\xef\xbb\xc6\x77\xd6\xbf\xe1\x97\xae\x75\x4a\x0e\xae\x9c\xda\x7c\xc6\x03\xf9\xa6\x33\xae\xd5\x27\xeb\x7f\xb8\x65\xbf\x36\x5f\x6c\x5d\xa7\xd1\x18\x7f\xcb\x2d\x2e\x38\x87\x43\xd1\x81\x53\x5a\xc6\x49\xd7\xfb\x87\x1a\xb9\xbf\x1d\x38\xbf\x80\xf3\x09\x6d\x08\xb9\xfa\x73\xce\xbe\xee\x70\xcd\x1b\xab\xb7\x6f\x15\x5c\xe7\x68\xd9\x54\x77\x35\xe1\xb4\x2b\x9f\x96\x0b\xa7\xed\xf7\x14\x65\xdc\xfe\x3e\xb1\x7e\xbb\xee\x43\x87\x47\x7f\xcb\x46\x8a\x35\xb5\xd7\x62\x70\x57\xcf\xfc\x5f\x78\x35\xf8\x53\x62\x3d\xf8\x1c\xf7\xe0\x3c\xd7\x7b\x70\x4e\xfa\x17\xde\x6b\xa5\x81\x10\xad\x2f\x25\xe6\xb0\xe3\xf9\xf7\x58\xed\x2f\xbc\xd7\x3c\xf7\xde\xcf\x5b\xd6\xaa\x59\xb0\xb3\xf3\x3e\x34\x9d\x25\x57\x1f\x7f\xff\x49\xae\xf1\xb9\x50\x74\xeb\xa3\x2d\xe3\xe0\x37\x2a\xeb\xfe\xd8\x82\x2b\x18\x16\xfb\xaf\xf5\x38\x63\x67\xcf\x1b\x67\xbb\xf8\x87\x85\x43\x3d\xf5\xdd\x3a\xf3\x62\xda\x78\x71\x53\xa3\x1d\xeb\xab\x5c\x40\xa1\x13\x20\x04\xc6\x82\x53\x00\x80\xed\xa3\x7b\x23\x9d\x76\x91\x33\x8a\x0e\xf4\x4c\x82\xed\xbe\x48\x27\xed\xc7\xc9\xdd\xf1\x15\xee\xd8\x9e\xee\xc8\x18\xff\xd8\x3e\x7f\x31\x01\x39\x64\xa4\x04\x53\x08\xea\x39\x31\xab\x0c\xf9\xb5\x02\x2a\xc3\x18\x4c\x73\x28\x8e\x34\x64\xa0\x38\x0f\x0d\x18\xaf\x82\xac\x06\x93\x69\x18\x84\xc1\x2c\x9d\x40\x09\x41\x13\x04\x98\x42\x95\x21\x41\x16\x4a\x90\x1f\xc9\x19\x43\x19\x25\x99\xe6\xb3\xb8\x7e\x6f\x7a\x28\xa7\x69\xb9\xba\x6f\x90\xb3\x79\xaa\xed\x1b\xdc\x3f\x40\xc8\x6b\xbb\x96\xc2\x95\xae\x76\xdb\x26\xb6\xf4\xad\x28\x6e\xef\x6f\xf6\xe1\x58\x3d\x19\x5a\xfb\x33\x61\x7b\xa5\xe9\x85\xa1\xb9\xcf\x3e\x0e\xc0\xf0\x9b\x1c\xb8\x63\x67\xc8\x1e\xcd\x0f\x96\x62\x5a\x49\x80\x00\x38\x15\x5c\x08\x78\x30\xd3\x8e\xd6\xb5\xc4\x1f\xce\x93\xd1\xdd\x69\x67\x6c\xeb\x24\x32\xb6\xe1\xea\x33\xdd\xd8\xe0\x6d\x1f\x3d\x11\x76\x62\xb9\xd8\xed\x80\xd1\xa9\x97\x6c\x3b\xed\x7d\xdd\xbd\x63\xba\x26\xf4\xb5\x45\x46\x86\x7c\xcc\x48\x0a\xa6\x9e\x3a\x09\x7e\xef\x83\x51\x70\x34\x7a\x3b\x90\x31\xee\x5d\xb4\xe6\xa6\xcc\xa2\x0f\xae\x45\xef\x40\x61\xd4\xa2\x33\x2f\xfc\xc6\xbd\xfe\x0b\x38\x41\x49\x09\xc5\x20\x9f\x12\xf9\x44\x8a\x2a\x87\x0b\x42\x51\x48\x1b\x19\x86\x57\xf9\x92\xa6\x71\xc9\x12\x27\xc9\x61\xba\x57\x3f\xa4\xea\x74\x1a\x0d\xc7\xc5\xe7\xb8\xeb\xf9\xe7\xc2\x8c\xbc\x66\xe9\x9a\x85\x3f\x5e\xb3\x34\xf3\x9b\xe7\xf8\xeb\x39\xe9\xfa\xd9\x06\x1c\x46\xac\xa0\xf2\x02\x54\x50\xa9\xc2\xcb\x7c\x11\x0a\x23\x25\x24\x57\x04\xd1\xe0\x35\x99\x89\xc5\xf5\xa4\x92\x87\x6c\x59\x4d\xe7\xc9\xf7\x75\x35\xf8\x7d\x44\xc0\xd5\xe6\x57\xe3\xb0\x5c\xf8\xc8\x05\x57\x39\x14\xcd\x6c\x68\x39\x37\xcc\xc7\x56\xc9\xae\xfe\x3d\x76\x7f\x66\xce\xfa\x8b\x20\x98\x34\x81\x03\x21\xf7\x77\x32\x18\x07\x70\xf5\x17\xed\x4f\xcd\x67\x3a\x30\xd6\x35\x87\xea\xb4\x77\xbb\xda\x95\xfa\x5b\x0e\x3b\xff\xb4\xf6\xc7\x26\xbf\x48\xd4\xc0\x79\x90\xf6\xdd\x4d\xb4\xe3\xbd\xd5\xfa\xff\xc1\xb5\x37\x25\x14\xdd\xf7\xf5\x96\x79\xed\x75\xde\xe5\x1a\x47\x6c\x82\xdd\xef\x89\x76\x9b\x37\xe1\xba\x8f\x7b\x2e\xc4\xbf\xf1\x7d\xd8\x9e\xc9\x4e\x1f\xd1\xd6\x57\x57\xe1\x7b\x73\x0d\xd7\x43\x04\x5f\xc6\x36\xbd\x6d\x73\x47\x6a\x39\x32\x2f\x01\x5f\x01\x73\xc1\xd7\xf1\x2b\xa2\xc5\xe0\x29\xb2\x4a\xac\x7d\x81\x3c\xae\xb3\x86\x90\x36\x82\x4e\x82\xe3\x71\x64\xd6\x85\x30\xd2\xde\xd3\xdd\xd9\x1b\x19\xdf\xdd\x39\xae\x7b\x3c\x0e\xdc\x6b\x5c\x2b\x75\x4d\xe8\x8b\x8c\x39\x09\xb6\xf9\x9d\xfc\xc0\x3d\x9d\x91\xf1\x0e\xae\xf7\xf9\x7b\x58\x18\x89\xf6\x58\x9a\x5f\xf3\xe3\x05\x9c\x89\xb3\x13\xbf\x6c\x48\x43\x55\x85\x1a\x92\x60\x72\xa4\x04\x79\x24\xfb\xcb\xb1\xd2\x50\x32\x99\x67\x32\xbc\xc0\x8d\x68\x8c\x9e\x32\x7c\x40\xc9\xe5\x50\xae\xe0\xe3\x25\xaa\x92\x14\x65\x9d\x2b\xe8\x99\x52\x22\xa3\xa4\xca\x12\x87\x32\x5c\x85\x43\x06\x4a\x04\xc3\x6d\x41\x64\x68\x43\xdc\x90\x36\x12\x57\xd3\x62\xd1\x40\x06\x95\x60\x19\x24\xb3\x94\x8e\x72\x54\x39\xc6\x9a\xe9\x44\x8c\x2a\x98\xf1\x36\x55\x12\x63\x09\x96\x8f\xf1\xc3\x8c\x06\x45\x4b\x11\x56\x28\xd6\x2c\xd1\x5c\x22\x21\xc6\x45\x31\xae\xa9\x71\x29\xc1\x71\xe9\xb8\xc0\x0a\xb2\xa9\xca\x7c\x2a\x69\xa4\x51\x31\x2f\x8a\xa2\x20\xf2\x42\x22\xcc\xc8\x2c\xc7\x85\x25\x26\x9c\x08\xb2\xb1\x58\x51\x62\x99\x70\x58\x4e\xc6\xe4\x84\x90\x4f\xc7\xe3\x62\x9c\x93\xc3\xe1\xa0\x88\xf2\xe1\x70\x4c\x8f\xe7\x50\x21\xc9\x33\x72\x30\xa1\xa3\x2c\xcc\xa5\xcb\x42\x02\xf3\x10\xdb\x9e\x89\x83\x08\xe8\x01\xa7\x83\xb3\x41\x9f\x75\x2e\xa1\x8e\x08\xe5\xeb\xed\xec\xa6\x03\xbd\x9d\xdd\x54\xa4\xf6\x70\x2b\x62\x43\x35\xd4\x11\x19\x87\x4b\xc9\x75\x4f\xe8\x88\xf8\x60\x47\xed\x6f\x74\x40\x80\xe1\x30\xe3\xe7\x82\x4c\xb9\xc2\x84\x73\x05\x16\xe5\x05\x8d\xcd\x08\x7a\xd8\x2c\xaa\x45\x25\x2d\xa3\x70\x3c\x86\x86\xfc\x05\x26\x88\xf8\x60\xd8\x08\x33\x28\xc1\xfa\x4a\x71\xc4\xc5\xb8\x4c\x32\x8e\xb8\x30\xeb\x2b\x40\x16\x72\x28\x87\x4a\x7a\xa5\xa8\x23\x99\x51\x83\x43\x95\x8c\xa4\xa6\xad\x66\xbd\x5c\xaa\x82\x7c\x1e\x02\x94\x30\x0d\x98\x47\x45\x43\x87\xf1\xa1\x02\xf0\x03\xb1\x9a\x0a\x28\x74\x9c\xc8\xc9\x0f\x60\x47\xc4\xda\x80\xaf\xbb\x2f\xd2\xd1\x3d\x1e\x46\x7c\xa7\x58\x2d\x30\xd2\x11\xc1\x3f\xbc\xe0\x67\x63\xa5\x72\xdc\x08\x0e\xb3\x7c\xd1\x27\x23\x3e\x01\x33\x94\xc0\xa2\x54\xc2\x4c\xc1\x4c\x02\xf1\x54\x18\x96\x58\x94\xf0\x89\x54\xde\x4c\xe8\x23\x5a\x86\xca\xe9\xd8\xd0\x4c\x98\x79\x33\x41\xc5\xcd\x02\x15\xb7\xe0\x67\xdf\x13\xc7\xb1\x27\xc5\xce\x22\x41\xc0\x8f\x72\xc3\x2f\xd4\xd1\x3d\x2e\x64\x41\xce\x76\x6b\x40\xe2\xef\x12\x04\x36\xec\x8a\x25\x86\xcd\x97\xe2\xa8\x8c\x61\x27\xb3\xc3\x5c\x22\x56\xf1\x67\x99\xe0\x70\x25\x18\x86\x42\x25\x2d\x67\x2a\xd4\x10\x1b\x1e\xae\xb0\x2c\x34\xca\x19\x39\x53\xf1\xe9\x90\x83\x02\x4a\xa3\x9c\x86\x86\x86\x74\x54\x62\xb4\xa0\x0a\x13\x30\xa5\xc1\xe0\x10\xaa\x54\x60\x5e\xd1\x64\x43\x19\x61\xac\x7f\x96\xcb\x30\xa7\xa8\x8a\xa1\x02\x1a\x88\x76\xbc\x3f\x38\x12\x8c\xab\xd1\x68\x9f\x7d\x4f\x64\xa7\x58\xc2\xa9\x30\x22\x3e\x9c\x36\xa5\xb3\xdb\xa1\x9c\xbe\xc8\x04\x0b\x03\xc6\x47\x8e\x82\x11\x5f\xc4\x02\xab\x05\x5b\x9a\xe2\x74\x36\xd6\x96\x1e\x06\x72\x5a\x85\x71\x94\x86\x62\x98\x69\xd3\x18\x18\x43\x05\xb6\x54\x51\x25\x4e\x62\xd5\x24\xc7\x0c\x17\x12\x2c\x4a\xfb\x45\x06\xa5\x59\x19\x19\x61\xc8\xc3\x72\x18\xa9\x31\x14\x84\x42\x0c\x65\xc3\xb4\x12\xe7\x79\xad\xa0\x8b\x30\x6c\x4a\xe5\x21\xc4\x6a\x28\xab\x4b\x1a\x63\x30\xa9\x12\x04\x5a\xda\x40\x59\x98\x44\x59\x14\xb3\x7e\xc3\x64\x06\x00\x1a\x68\x58\xff\xa8\xef\x23\x8e\x73\x98\xfe\xff\xd8\x87\xaf\x76\x1c\x16\x0e\xdb\x7f\x6d\xda\x4b\x01\x72\xf6\x5e\x58\x54\x6c\xd9\x4b\xc1\xcf\x31\x23\x99\x30\x94\xb5\x94\xce\xeb\x14\x1f\x1e\x31\xc2\x2c\x4c\x6b\x82\xce\x6b\xff\x2f\x9b\x89\x0b\x92\x20\xa6\x4c\x1e\x26\x33\x3a\x8c\x0b\xa2\x90\x4a\xd5\x79\x2f\xd6\x3b\x5f\xc4\x7e\x00\xed\x43\x47\xd6\x5c\x64\xbf\xd1\xd8\xf6\x24\x75\xc4\xa4\xe9\x93\xb7\x84\xe8\x2d\x1a\x20\x7d\x3f\x72\x28\x3a\x88\x7d\x1c\x83\xff\x71\xf9\xf9\x2d\x7b\xed\x49\xac\xfb\xdb\xb5\xeb\x28\x18\xc4\xfd\x53\xe0\x4b\xe0\x64\xc7\x27\x89\xed\xe6\x1e\x97\x3f\xd2\xf6\xc7\xb1\xd1\xf1\x30\x98\x86\x15\xc4\xc0\x60\x81\xad\x02\x94\xe1\x7d\x89\x34\x0c\x63\xab\x39\x23\x54\xe4\x24\xa3\xb3\x4a\x1e\x65\xd3\x74\xca\xcc\x1b\x23\x9a\x20\xa6\x65\x89\xa7\xf3\x66\x5a\x32\xb4\x8c\x32\x52\x61\xd9\x54\x8e\x43\x43\x4a\x4a\xac\xd5\x62\xc5\x79\x21\x07\x5f\xc2\x6b\xfd\x8e\x23\x03\x2d\x1d\x53\x0a\x45\x77\xcd\xb1\xda\x77\xcd\x75\xda\x53\x81\xac\xa5\x37\xed\xc5\x19\xf1\x0e\xde\x63\xb7\xc3\x78\x55\x08\xc8\x96\xed\x9a\xc1\x35\x92\x76\xdd\x0e\x1a\x77\x5f\x38\xf7\xdc\x2e\x7c\x47\xb2\xeb\x56\xbc\xe7\x20\x96\x81\x06\xad\x81\x51\x98\x53\x9c\x05\x6e\x03\x22\xf8\x3a\xb8\xb7\x8e\x2f\x38\xf1\x8b\x25\x3e\xc6\x76\x5a\x48\x43\x77\xe1\x08\xd1\x4e\x0c\x8c\xce\xd1\x63\x7a\x59\x27\x82\x70\x5c\xe7\x38\x7c\xc3\x60\x7f\xa7\xdb\x42\x9b\xee\x46\x88\x79\x84\x8d\x5e\x08\x01\x7e\x02\xd7\x6e\x71\xcd\x40\x0f\x76\x74\x41\x9c\x7d\x61\x42\xdf\x29\xd0\x92\x47\x94\x22\xb3\x31\x2a\xcb\x71\x30\x7b\x28\x1b\x4f\x88\x30\x4e\xf1\x5c\xdc\x4c\xc7\x83\x6d\xc1\xe1\x21\x2a\xa5\xc3\x58\x89\xaf\x02\x94\x8e\xcb\x10\x24\x19\x35\x2c\xa3\x4c\x29\x65\xa6\x28\x86\x55\x14\x96\xa5\xf4\x58\x1c\x0e\x55\x24\x8d\x13\xf4\x64\x29\x9f\x0a\xeb\x31\x0d\x95\x50\x41\x47\x43\x28\xc8\xc3\x6c\x1e\x25\x24\x31\xa7\x4b\x9c\x42\x71\x66\x9e\x92\x93\x66\x3a\x06\x8d\x58\x18\xb1\x94\xc6\xb0\xb0\x42\x6b\x1c\x1b\x4e\xc5\x59\x54\x2e\xb3\x61\x51\x55\xd9\x58\xac\x90\x2c\xf0\xb1\x78\x2a\x11\x0b\x87\xc3\xb1\x64\x4c\x4e\x26\x92\xbc\x22\x88\x61\x26\xcc\x0a\xb1\x18\xca\x4b\x7c\x2a\x95\x66\xc3\x49\x29\x61\x88\x3c\x9f\x45\x65\x5e\x4b\x64\x60\x90\x13\x53\x22\xc3\x41\x3e\x2e\x23\x31\x89\xca\xf1\x44\x22\x2e\x02\x08\xe4\xaa\x14\xd0\x68\x01\x44\x2d\xe8\xb6\xf9\xdb\xc7\x75\xd9\x3f\x75\x38\x52\x11\x36\x3a\xbe\xdd\xdf\x33\xae\xf6\x33\x96\x16\x44\x64\x20\x85\xaa\x30\x26\xf0\x69\xcc\x48\x4a\x2e\xc1\x84\x1c\xd6\xc2\x42\x1a\xe5\x50\xda\x30\xf9\x30\x95\x37\xd3\x61\x4a\x32\x33\x3c\x55\xa2\x05\x85\x4f\xa2\x92\xa4\x4b\xa8\x28\xeb\x0a\x32\x62\x31\x3e\x13\xcf\xa9\x31\x5e\x84\x6a\x4a\x4f\xc1\x98\xa0\x0b\x90\xe5\x75\xbe\x6e\x8f\x88\x98\x76\xe6\xee\xba\x02\x9c\x0d\x2a\x17\x9e\x3c\xfe\xdd\x10\xbd\x73\x7b\x8d\x76\x84\xc0\x06\x5a\x62\xe6\xec\xdc\xde\x5e\x99\xfc\x20\x07\x98\x69\x83\x7b\xab\x67\x82\x63\x2f\x01\x93\xdf\xc0\xbe\x13\xde\xd6\x85\x76\xe1\xbb\xe6\x5d\xb3\x1d\x9a\x4b\xd9\xf1\x84\x3b\xb0\x7d\xb8\xa3\x5e\xab\x44\xc3\xed\x4a\x28\xba\x03\xd7\xf2\xdb\xd1\xb0\x63\x45\x5b\xc7\xdb\x89\xef\x00\xb5\x0f\x9a\xdb\x77\x8c\xc6\xfe\x8e\xed\x8e\xcf\xc6\x9a\x97\x0f\x45\xb7\xe1\xfa\x13\xd6\xec\x8e\x0f\x16\xfb\x5a\xb6\xe3\x97\xbd\xdb\x29\xd0\xb4\xc7\xa5\x6f\x00\x15\x24\x2f\xb8\xf8\x82\x6a\x88\xde\xff\x22\xb0\x65\x55\x32\x60\xd0\x22\x88\x82\xf3\xc0\x85\x60\x8a\x5d\x89\x9d\x0e\x90\xe7\x72\x4e\x3d\x37\x8b\xfb\x60\xc6\x45\x3a\xbb\xdb\x27\xf4\x75\x05\xec\x20\xd9\x09\x7d\xb8\x7a\x8d\xfd\xdf\xb8\xf6\x08\x9d\x4b\xa5\x73\x50\x66\x90\x0c\x73\x0c\x8a\xc7\x53\x72\x22\x68\x30\x5c\xac\x54\x48\xa1\x7c\x18\xf2\xa8\x14\x86\x09\x54\x49\x42\x65\x38\xe9\x4b\x48\x89\x44\x58\x35\xaa\x00\x95\xd8\x64\x52\x86\x61\xc8\xa0\x4a\xfd\x87\x16\x15\x8e\x43\xc5\x84\xce\xa1\x02\xa7\x73\x48\x8c\xb1\xc9\x6c\xbc\xc2\x25\x92\x22\xcc\xc4\xf5\x38\x8c\xc7\xf5\x04\x64\x38\x2d\xa9\xe8\xc3\x69\x26\xa8\xb2\x48\x86\x62\x3c\x66\x04\x99\xb6\xb4\x35\x84\x99\x84\xac\x09\x62\x30\x5e\x83\x05\xd6\x6b\xb7\xe3\xfb\x29\x0c\x05\x17\xac\xd3\x27\x7a\xb4\x2f\x0a\x45\xad\x16\x66\xda\xbe\x5f\x80\xef\x82\x09\xe7\x3f\x38\xe9\x32\xd7\x77\x4e\x75\x7d\xc7\xe2\x4b\x12\xad\x87\xa2\x3a\xce\x9b\xa6\xbd\xdf\x3c\x07\x1e\x8b\xd6\xde\x73\xf0\xe5\x2b\x81\xa5\xf4\xf5\xa1\xe8\x9e\x55\xf8\x5d\x5c\xf0\xf7\xbf\x77\xce\xd3\xce\xcf\x70\x3e\x00\xcc\x9c\x3d\x1f\x98\x02\x77\xf1\x05\x2b\x99\x69\xcf\x9f\x06\xcf\xa8\x7e\x70\xee\xbb\x93\x5e\x24\xc6\x35\xea\xe3\xee\x5f\x73\x98\xf9\xea\xfe\xa6\x6b\xaa\x62\x60\x2d\xfd\x94\xd5\x3e\x0c\x42\xf4\x53\x89\xb7\x8e\x74\xfc\xd2\x76\xdc\x08\xce\xd2\xb0\x9f\x8c\x25\xd0\x2d\xbc\x1a\xc0\xd5\x52\xb5\xdf\xba\xc6\x7f\xbc\x0e\x9b\xcd\x1f\x83\x4b\xc0\xcf\x2f\xf8\x4b\x5f\xa5\xf6\x6e\x03\xc3\x79\x0b\xae\x4c\xb9\xe5\x08\xcf\x35\x4d\xdb\x42\x83\x53\xc0\xbb\x17\xfc\xaa\xef\x27\xb5\xd8\x0a\xdb\xde\xb5\xef\xe6\xbf\x43\x7c\x27\x4d\xec\xe3\x37\xa0\xe9\xce\xd8\xee\xbf\xe1\x53\xd7\x1c\xab\x6a\xfd\xa7\x6e\xf8\xf0\x9e\x23\x27\x2e\xe0\xee\x76\xfc\x0c\xc4\x77\x36\x36\xea\xa3\x08\xb5\x7b\xf2\x9f\xe2\xf5\x06\x1d\x5a\x4b\xd9\xfe\x8d\x01\x5c\xb3\x5e\x2b\x12\x72\xd5\xbe\x9f\x3f\xc3\x05\x2b\x27\x57\xb6\x3d\xbe\xfe\xb9\x43\x9b\xb5\x3b\x82\xfe\x21\x57\xff\xe6\xf1\x7f\x0d\x1a\xf7\xa5\xd8\x37\x94\xfe\x0c\xbf\xaf\xc7\xf9\x7a\xd3\x9f\x3b\x78\x61\xc7\x18\xfc\xdb\xb5\x56\x27\x06\x60\xe0\x24\xd7\x1c\x19\xac\x8f\x5a\xfc\x05\xdb\x78\x03\xc7\x1d\x06\x3f\x7e\xe5\x6a\xd7\x9d\xf6\x77\x09\xbe\x66\xc7\x82\xec\x75\xcd\x2b\x38\x7e\x0a\xfb\xee\xfe\x44\xd7\xde\x56\xd8\x7b\x0b\xd1\x4b\x97\x9c\x67\xe3\x19\xe7\x3e\x83\x81\x13\x0e\x33\xef\x2f\xbd\xcf\x79\x00\xe7\x85\x03\x63\xc0\x75\xd5\x64\x60\xbf\xab\xe6\x44\xe3\xb5\xcf\x69\xb8\xfa\x6e\x1f\x98\x88\xf3\xcf\x5c\x01\xae\x02\xb3\xc0\xcd\xe0\x49\x5c\x07\xb0\xe5\x71\x28\xac\xb5\xf5\xd6\xda\x70\xe5\x01\xaf\xb6\x5a\x58\x34\xae\x62\xd1\x55\x7b\x77\x16\x21\x9f\x94\x79\xf1\x4e\xfb\xb1\x50\x7b\xa0\xa7\x0f\xff\x58\x8a\xc4\xf7\x7c\x4f\x8e\x3c\xbc\xec\xf3\xcf\xe1\x7d\x9f\x9b\x3a\xfe\x63\x64\x33\x05\xcd\xea\xa3\x33\x66\xbc\x3c\x0d\x8d\x58\xbf\xdf\xa1\x82\xe6\xd0\xe2\x19\x33\x0e\xce\xb0\xfe\x7d\x70\xc6\x62\x7d\xa4\xa8\x53\x6d\x5f\x1f\x7e\x1e\xde\xa7\x84\x45\x25\x35\x1d\x8e\xa0\x36\xf8\x3c\xfe\x3b\xfa\x28\x95\x90\x13\x29\xff\xf1\x37\x3f\xbd\x01\xf6\x06\xd1\x6b\xf0\x8e\x2e\xa4\x44\xaf\x98\x79\x66\xf0\xa9\x93\x6e\x5b\xb1\xfd\xa6\x42\xd7\x5f\x5e\xed\x2a\x5e\x71\xc5\xa5\xf0\x78\x5a\x34\xcb\x70\xca\x6d\xb7\xdd\x86\xde\xb6\x7e\x7d\x64\xbe\x0a\xaf\x5f\xb4\x68\x11\xd2\x9e\x7a\xea\x29\x38\x9d\xfc\x17\x7a\x0f\x2d\x5a\x84\xd0\x69\x0a\xfc\x27\x9b\x96\x79\xf1\xf8\xc7\xef\xc6\x7f\xf2\x7c\x8a\x13\x78\x9a\xb3\xd8\x72\x4e\xd0\x52\x28\x2f\xea\x22\x4a\xc5\xc2\x49\x2d\x51\x48\xf1\x29\xa8\x27\xf4\x04\x8c\x27\x74\x0e\x26\x98\xb0\xc6\x59\x7a\x65\x0c\xe3\x33\x0f\x4e\xc0\x7a\x65\x57\x9b\x9f\xe9\x8a\x74\x46\x42\xa0\xf7\x9c\xbe\x2e\xaa\xfb\x64\xe0\xab\xab\x99\xed\x63\x7d\xd1\x76\x7f\x3b\xad\x28\xa8\x84\x72\x2c\xa5\x9a\x1a\x0f\x59\x21\xc9\x6a\xf1\xbc\x8a\x14\xd1\xd4\x61\xbc\xcc\xa2\x32\x52\x93\x3e\x36\x1e\x36\xf3\x34\xaf\x26\x58\x54\x2a\x18\x28\x8d\x94\x52\x0c\xa9\xb0\x08\x73\x26\xcf\xf3\xba\x28\xf0\xfe\x72\xc2\xd4\x8b\x10\xc4\x11\x76\x02\xfb\x20\x8b\x7d\xbd\x12\x38\x11\x67\x95\xc4\x2b\x09\xd5\x57\xd2\x81\xef\x98\xad\xa5\x58\x12\xcf\x5a\x4a\x47\xd4\xe7\x6f\xaf\x05\x87\x48\x02\xaa\xa0\x72\x90\xa1\xf0\xfb\x8b\xa4\x18\x8f\xe9\x71\x51\x30\x10\x1f\x33\x75\x3d\x9d\xc8\x55\x81\x40\xe5\xe3\x4c\xd0\xcc\x51\x82\xc2\x6b\x49\x85\x96\xb4\x58\x18\x15\x0a\x3a\xd2\x11\x0f\xb9\x24\x1a\x32\xa8\x30\xcc\x98\x1c\x97\xd2\x65\x41\xa4\x59\xc6\x54\x8b\x30\x1c\x43\x09\x33\xa1\x19\xbc\xae\xd9\xeb\x4b\x62\xdb\xf1\x78\xc0\x82\x71\xf8\xbd\xda\x98\x06\xa0\x2c\x4c\x22\x20\xd5\xd5\x1e\x69\x87\xd1\x9e\x48\x3b\x3d\x64\x16\x83\x61\x2a\x65\xe6\x92\x10\x24\x93\xc1\x34\x23\x4b\x32\xd2\x05\x53\x80\xc9\x21\x16\x15\x91\x94\x34\xda\x74\xb3\x12\x0e\x9a\x3a\x1d\x37\xd3\xba\xa4\xa3\x0a\x2a\x96\x62\x45\x1d\x2a\x50\x32\x87\xb8\xa4\x2e\xf0\x3c\x2d\xea\xa8\x08\x63\x66\x42\xd6\xd0\x10\x96\x63\x1d\x01\x85\x9e\x15\x8a\xee\xbe\x05\xfc\x3a\x34\x75\xf0\x25\xf0\x6b\x0e\x5c\xfc\xbe\xc3\x6b\x70\x3d\x82\x01\x9c\xf1\x7d\xe0\xed\x9a\x5f\x56\xb5\xe3\xa8\x70\x1e\xc5\xe3\x88\xdc\xbc\x21\x3b\xdd\x26\x13\xaa\x1d\x38\xe5\x8b\xc0\x8a\x1e\x6f\xab\x1c\x2a\x48\x9a\x56\xd6\xdb\x94\x61\x25\xeb\x07\x5c\x32\xc6\x6a\x09\x43\x31\x82\xc3\x06\xad\x26\x24\xbd\x9c\x11\x20\xab\x68\x06\x4a\x20\xae\x64\x99\x90\x0a\x15\xb6\x65\x6c\xcd\x7e\xd9\xbd\x14\xf3\x8a\x5f\x38\xfe\xac\xb8\x5d\xc3\x60\xbf\x8e\x7d\xfc\x4f\x39\x32\xd9\xd5\x7f\xc7\x93\xde\xed\xda\xcf\x0f\xd3\xfe\x33\x87\xa7\x71\xae\xf1\x9f\x76\x74\xbb\x24\xd9\xae\xe1\x1a\x05\x80\x06\x3a\xce\xa9\xa5\xd5\x38\x94\x75\xaa\x67\x36\x72\x97\x3a\x95\x71\x6c\xbb\x34\x80\x73\xe3\x34\x00\xd5\x51\x03\x94\xff\x5c\xdd\x64\x74\x9d\xaa\x98\x8c\xf5\x33\xd6\x08\xb3\xfe\xf0\x21\x83\x0f\xf3\x09\xb1\x20\xb7\x95\x87\xc3\x25\xbf\xca\xb3\xb1\xa0\x12\x53\x65\x35\x38\xcc\x50\xbf\x1b\x11\x55\xd5\xa7\xa3\x6c\x06\x85\x33\xfe\x6f\xb2\x49\x4e\x11\x63\xc9\xb8\x9c\xd1\x14\x69\xa4\x6c\xe9\x44\x96\x8e\x24\x50\x76\x8c\x8f\x5e\x5f\xfb\x2e\x5c\x37\x6a\xbf\x4e\xf8\x12\xd3\xb4\xca\xcc\x59\xf6\xfa\xe7\x5f\x9c\x9d\x3b\xff\xcd\x10\xbd\x7f\xb5\xfb\xb3\x50\xd4\x6a\x61\xe8\x7d\xf5\xfc\x4c\x7a\x13\x1c\x7e\xea\xdd\x5f\x7b\xe7\x30\xfd\xdf\x76\xda\x5d\x70\xde\xf1\xf8\x61\xfa\xbf\x75\x98\xf1\x7f\xe2\xf4\x77\xe1\x43\xfa\x6b\xde\xe3\x6c\xef\x25\x6c\x44\x72\x9c\x37\x0f\x33\xef\x8f\x0f\x33\x6f\xbe\xb9\x7d\xeb\xfd\x18\xa6\xab\x1d\xfc\xac\x8d\xb3\xd1\xef\x82\x75\x6d\x7c\x66\xee\xd6\x4e\xf4\x65\xf3\xf6\x29\xed\x13\x2f\x08\xe1\x4f\x31\x6e\xb1\xe4\xdc\x5b\x66\x1c\x66\xee\x37\x08\xdc\xb5\x63\x31\x70\x2d\x60\xad\x9e\x0b\x66\x55\x35\x6a\xdf\xdf\xed\xd7\x41\x30\x34\x6d\xf9\x4b\x68\x92\x79\x1d\x07\x26\x1e\x72\xfc\xbd\xce\x58\x5b\xaf\x75\xf9\x81\x9d\xf6\x0d\x17\xd8\x7e\x82\x7a\xdc\x25\x38\x16\x8c\xc5\x7e\x82\x31\x5d\x63\x3b\xba\x28\x7f\xc8\x1f\x00\x90\x8c\xc9\x87\x91\xce\xd1\x00\x5f\xaf\xfb\xb2\x46\x52\x80\x4c\x5e\x2d\xa0\xdc\x10\x14\x53\x28\x8e\x4a\x82\x6a\xa8\xac\xae\xc7\x63\x23\x65\x4a\x41\x45\x54\x14\xa0\xa6\xa0\x30\x2d\xa3\x6c\x26\x9d\x86\x40\x44\xe5\x2c\xe2\x2b\x59\xc8\x53\xfa\x08\x27\xa5\x58\x23\xc6\x72\x6d\x92\xce\x99\x1c\xaa\xa8\x50\xa2\xc2\x00\xf8\xa8\x54\x95\x6b\x2b\xd0\x52\xed\xdd\x67\xed\x95\x9f\xaf\x26\x8f\x29\xd8\x03\x7c\x52\xce\x90\xd2\xd9\x44\x31\x23\x65\xf3\xb0\xac\xea\xa8\x62\xc0\x30\x2d\xa9\x39\xb5\xa0\x21\x45\xcd\x2a\x79\x0d\xc9\x02\x92\x90\x2e\x43\x3b\x1e\x4a\xc4\x76\x11\x0b\x46\x83\x08\x38\x0d\xd7\x28\x02\x7e\x32\xa9\x49\xaf\x5d\x68\x0e\x6f\xd8\xd7\x37\xa6\x6b\xc2\x38\x6b\xa3\x7e\x6b\xa3\x90\xf5\x1b\x28\x83\x2a\xbc\x64\xe8\xac\x61\x24\x94\x62\x6e\x38\xe9\x2f\xab\x39\x34\x64\xc0\x84\x8c\xf8\x82\x12\x8b\x95\x0e\x71\x94\x81\xf2\x28\x9f\x82\x9a\x8e\x82\x34\xab\xa2\x7c\x7a\x24\x25\x0b\x61\x83\x4d\xb5\x85\xd5\x0c\xca\x49\x15\x1d\x0d\x65\x75\x18\xa3\x62\x29\x49\x50\x65\x3d\x61\x16\x8a\x1a\x64\xa0\x01\x7c\x98\xff\xca\x18\xfe\x2c\x38\xb5\xf9\x04\x7c\xae\x13\xb0\xc1\xe1\x2c\xcf\x97\x31\x84\x38\x64\xf2\x7a\x19\xe5\x8b\x50\x56\x50\xb2\x92\x52\x75\x95\xd5\xf4\x44\xcc\x2c\x15\xd2\x52\x26\xaf\x50\x3a\xca\x59\x4b\x33\x34\xc4\xd0\x32\x62\xcb\x42\x01\x72\x3c\xd2\xcb\x28\x53\x31\x60\x12\x96\x4d\x20\xa5\xe2\x46\x82\xe5\xfc\x25\x49\x57\xd3\x12\x12\xf4\x84\xa9\x57\x54\x98\x80\x05\x0c\x3f\xa1\x96\xab\xdd\x8f\x7d\xfd\x00\xe2\x8b\xb8\x40\xc4\x5a\x65\x5f\x2b\x9e\x8c\x6f\x8f\xf8\x22\x9d\x76\x18\x06\x95\x80\x45\x98\x4e\x22\x0e\x71\xba\x2f\x19\x8b\x43\x90\x51\x72\xa8\x3c\x04\xf9\x14\x12\xab\x80\xe7\x95\x02\x5b\x16\xe2\xa6\x90\xa7\x72\x79\x14\x4f\xc1\x8c\x61\x96\x69\x95\x13\xd2\x12\x57\x42\x05\x41\xc8\x54\x30\xda\xc8\xd9\x0c\x0c\xc2\x21\x33\x29\x08\x61\x3d\x1c\x6f\x13\xab\x40\x47\x00\x95\x54\xc8\x40\x15\xe3\xf0\xda\xea\x5d\x01\x9d\x1e\x07\xc6\x80\x6b\x31\x04\xb1\x9d\xdb\xd6\x15\x88\x8e\x6b\x1f\x4d\x9f\x06\x7b\x6a\x99\xa2\x03\x91\x23\x61\xa0\x67\x6c\x47\xf7\x51\x30\x40\x07\xe2\x67\x8f\xee\x1a\x63\xfd\xd7\x1b\xe9\x64\xfb\x26\xf4\x75\xf9\x02\x74\xf7\x29\x30\xda\x7d\x72\x20\xda\x83\xff\x1b\x7f\xee\x64\x18\x1d\x7f\x6e\x47\xa8\x2f\xd2\xf6\x84\xf1\xd2\xad\x0f\x4d\xfd\x17\xfc\xf2\xfd\x92\x84\x50\x52\xd3\xd8\xa4\x98\x18\x09\x53\xf2\x99\x30\xca\xe4\x73\x02\x3c\x27\xfa\xa3\x15\x52\xe8\x68\xea\xd8\x53\xe9\x63\x2e\x3a\x4a\xa2\x34\x98\xb8\x28\x7e\xf4\x96\xd3\xc6\xdf\x2a\xa0\xa3\x91\x70\xe3\xd9\xc7\x1c\x3d\xbf\xfd\xb4\xf8\xc9\xb1\x88\x8f\xf6\xed\xce\x1e\x8d\x12\xf4\x38\xb3\xb4\xf8\x9b\xb7\x3f\x60\xbc\xf9\x85\x52\xa9\xa0\x84\x28\xe8\xc1\x64\xdb\x54\x6d\x31\x92\x90\x2c\xcb\x05\x98\x45\x8b\x51\x81\x9f\x38\x31\xd0\x3b\x1d\x06\x4e\xf1\x07\xaf\x38\xe3\xcf\xdd\xe8\xd3\x14\xef\x83\x6d\xa3\xa2\x9d\xa3\x66\x4f\x3b\x3f\x14\x3a\xee\xc8\x51\x0f\xc1\xd7\xe1\xaf\x58\x00\xfc\xe0\xb3\xea\x35\x81\x4d\xf4\x71\xce\xbb\x69\x4b\xef\xb0\xe8\x26\x04\xbb\x70\xc0\x1f\x3e\x3b\x88\x01\x43\x66\xd1\x9e\x30\x9e\xbe\x49\x4f\x57\x81\x52\x31\xd7\x8b\x55\x80\x54\x01\x6a\x54\x06\xf2\x90\x55\x50\x05\x65\x47\x5e\x83\x6c\x45\x29\xa3\x0a\xf5\x4b\x23\xa5\xc9\x12\x2b\xcb\x89\xb8\xff\x69\x1e\x15\xd1\x90\x0c\x81\xf9\x37\xb9\x0a\x14\x55\xcf\x1b\x45\xa5\xa4\xfb\x2e\xd3\xf3\x6a\x41\x87\xd2\xa1\xa0\x94\x62\x8c\x70\x2c\x51\xe3\x3d\x38\xc7\xfc\x20\xb6\x7e\x06\x7f\x54\xe3\x3d\x7c\x95\x0f\xbc\x48\x8b\xe0\x68\x70\x36\x00\x10\x17\x06\x9b\xd0\xd1\x85\x5f\xa0\x8c\x85\xbd\x9d\x63\xba\xf0\x41\x8e\xb1\xfe\x45\xa2\x18\xee\x18\x19\x1f\xf1\x95\x74\x33\x23\x43\xad\xa0\x32\xe9\xa0\x41\xe5\x04\x53\x47\x9f\x0c\x4c\xbf\xf1\xd7\x4f\xbe\x30\xf0\x7a\x05\x9e\x37\x1d\x45\xd0\x4f\x2f\x5a\x70\xd1\xd9\x91\xe9\xd3\x8f\xf9\xd0\x2c\xdf\x08\x7f\xfd\x8e\xf9\x21\xf5\x0e\x14\x50\xa1\xa8\xa8\x39\x05\x32\xc1\x24\x87\x94\xb4\x91\xa6\xa5\x57\xae\xbc\x72\xd1\xd3\xe2\x16\x71\x4b\xea\xf9\xe7\xe1\x79\xe8\x5b\x62\xea\xd8\x2d\x27\x5f\x09\xdb\xd0\x67\x7b\x5e\x58\x54\x78\xc1\xb1\x15\xb1\x9d\xb5\x17\xc7\xfa\x67\x2e\x24\x6c\x48\xec\xaf\x19\x7c\xad\xb1\xbf\xc6\x5b\x91\x50\xf4\x20\xae\x65\xbd\xef\x34\xc7\xbe\xb3\xec\x38\x31\x14\x1d\xc4\x7e\x85\xc1\x93\x9c\x71\x6a\xf9\x49\x06\x71\xed\x8e\x03\xb7\xd4\x74\xb1\x9a\x7c\x00\x7e\xfb\x0e\xa2\x1e\x38\x69\xe7\xab\x0e\x59\x50\xa2\x02\x2d\xec\xa2\x1d\xc7\x61\xb5\x47\xec\x6c\x7b\x7e\xd5\x50\x53\xaa\x3e\xac\x50\x43\x86\x8f\x31\x63\x49\x59\x97\x0c\x23\x93\x83\xbc\x60\x56\x86\x78\x49\xd7\x58\x5d\x67\xc3\x28\x8d\x52\x1c\xcc\x43\xc9\x0c\xc2\xa0\xaa\x6a\x92\x41\xab\x7c\x4a\x12\x93\x79\x18\x43\x45\x1d\x95\x8b\xd9\x12\x8f\x8a\x69\x54\x32\x32\x30\x48\xe9\x23\x69\x39\xc5\xa6\x63\x2c\x07\x4b\xa8\x5c\xc8\x16\x21\x03\x4b\x7c\xba\x2c\x15\x0a\xc0\x89\xe5\x95\xea\xfb\xd9\xb5\xa9\xd9\x86\xb6\xf6\x1f\xa2\xf7\x7e\x93\x80\xd7\x0d\x16\x5c\x30\xbc\xa6\xed\xbd\xbb\x3a\x13\x8c\xba\xa4\x7b\xf2\x3b\x24\xec\xd7\xe0\xf8\x87\xbd\x2b\x08\x58\x4a\x0d\x58\xee\x9e\x4f\x9c\x49\xd2\x9a\x7b\x2f\xae\xe1\xe4\x3a\x13\xdd\x99\x83\x36\x8e\x76\xd9\xbe\xf5\xf6\xe8\x40\x18\x4b\xdc\xd7\x9c\xb1\xb8\xc6\xb9\x0c\xec\x24\x64\x6a\x02\xfb\xb9\xed\xf6\x2e\xa2\x3d\x47\xf4\x37\x88\xbb\x5b\xa3\xb1\xd6\x5d\xd5\xe6\xbb\xe4\x5a\xff\x31\x44\xbb\x48\xb4\x77\xba\xee\x02\x6a\x70\x0d\xd1\xbb\x56\x11\x7b\xc3\x7e\x49\x7b\x6f\x03\xa3\x09\x7f\x82\x33\x6f\x88\xde\x7d\xa4\xcb\xf7\xa1\x86\xa2\xc6\x97\x5b\xf0\x96\x6f\xe0\xed\xde\xab\x1d\x3d\xa5\xf6\xbe\x3f\xb3\x1f\x9f\xdb\x0a\xaf\xf5\x30\xf4\xae\x3f\x10\xfd\x6b\x67\xc3\x58\x67\x30\xbd\xd8\xe8\xaf\x10\xfd\x3f\x20\xc6\xd1\x1a\xed\xab\x1e\x20\xce\x38\xd3\x80\x9b\xf6\x23\xd7\xfa\x9d\xfe\x03\x0c\x71\x96\xc4\x19\x0f\xb4\xd7\xe8\xc8\x5e\x67\x18\x1c\x05\x7a\x70\x0c\x2b\x71\x3f\x4d\xb0\x9b\xae\x31\x5d\x6e\x86\x03\xb1\x44\x1b\xdb\x11\x81\xc0\x5f\x36\x25\x6a\xe8\xbf\x82\x8f\x31\x93\x54\xd6\x10\xc4\xac\xac\xaa\xb9\x4c\x4c\x4b\x0b\x28\x8e\xca\xbc\xa8\xc8\xac\xa2\xc4\xcd\x04\x95\xca\x23\x2e\x05\x0d\x1d\xf1\x74\x58\x1f\x32\x8c\x21\x94\x30\x14\x29\x6d\xa4\xb2\x86\x1e\x4e\x71\x46\x1e\xea\x66\x45\x4a\xb1\x3a\x9b\xa2\x8a\x1a\x8a\x57\x81\x5a\xc1\x2a\x4b\x6d\xbf\x24\x9e\x90\xe7\x62\x34\xce\x65\x20\x44\xb4\x2b\xc4\x7e\x3b\x88\xf6\x4c\xa3\xff\xee\x23\x08\x78\x2a\x0d\xfa\x7b\xf1\x4b\xc5\x46\x7f\x91\xa0\x8d\x5b\x9a\xfd\x42\x76\xfb\x81\x32\x20\xe3\x2f\x1a\xe7\xf8\x0d\xe2\x5c\x88\xf6\x35\xff\x26\xd6\xc3\x11\xeb\x1c\x05\x3c\xe7\xd5\x7e\xe8\x3d\xce\xc1\x63\x5c\x78\x22\x87\xa2\x7b\xbe\x20\xe4\x09\x8d\xd7\xa3\xd1\x77\xd5\xfc\x48\x1d\xe0\x2c\x90\xb0\x23\x46\x3b\xea\x29\x99\x7a\xdb\x19\x7f\xcf\xd8\xf6\xc6\x69\x37\x1f\x36\x56\x74\xed\xf7\x73\x7b\xe9\xd2\x7f\xd9\xc5\xfe\xdc\x21\xae\x6d\xb4\xae\x9b\xb7\xad\x43\x4f\xce\x82\xe3\xe1\x51\x06\x2f\x16\x0d\x45\x2f\x65\xf4\x6c\x12\xc5\x50\x59\x90\x64\x91\x95\xe4\x58\x78\xa4\x4c\xe9\x69\xc4\x26\xa1\xaa\xa3\x70\xdb\xe5\x2a\xe5\x5f\x01\xc7\x8e\xdc\xe2\xdb\x87\x9e\x44\x0f\x0f\xad\x7c\x07\x1e\x83\x8e\xd1\x52\x29\x29\x2d\xa6\x25\x89\x4f\xe8\x06\xe4\x90\x88\x73\xc6\xb3\x09\x2a\x2e\x21\x4e\xd3\x52\x90\xab\xc1\x23\x45\x9c\xf3\xd1\xc4\xbe\x53\x16\x7d\xbf\xf8\x59\x13\x4f\xe3\x5c\x78\xf1\xe5\x66\x7f\x5b\xed\xfc\x5f\x27\xc6\xc9\x34\xf8\xca\xe0\xaa\x66\xff\x70\xed\x3c\x4d\x6f\xfa\xde\xbd\xbe\x79\x3d\xbb\x1e\x76\xf1\x0f\x05\xcb\x7b\xd5\xc2\x2f\x16\x84\xe8\x03\x3f\x4d\x37\xd1\xeb\xce\xdd\xae\xfe\x8d\xb7\x44\x98\x9f\x0d\xdc\x46\xf0\x2d\x7c\xce\xc6\xdf\x71\xff\x2f\x5c\xfc\xc9\xc1\x97\x5d\xf3\xbd\xf1\x7d\xdd\xb7\x9a\xd7\xbf\x7b\x5f\x0b\x9f\x73\xe0\x16\xa2\xd7\x8f\xb8\xe0\xd6\xe0\xa3\x5f\xf2\xa6\xbf\xbd\xd7\x13\xed\x6a\x7d\x3d\x21\x7a\xff\x77\x88\x7d\xe1\xda\x67\x7b\xb0\xbf\x5d\xff\x97\x4b\x2f\x70\xc6\x5f\xff\x07\x6f\xd9\xb4\x7f\x85\x8b\xaf\x37\xe8\x66\x25\xa1\x2f\x10\xfc\x6f\xdf\x8b\xcd\xfd\x37\xe3\x18\xde\x83\xef\xb9\xda\xe5\x50\x74\x9f\xee\x6a\x6f\x92\x3f\x3b\x3f\xf1\xde\xef\x01\xbf\xd7\x7e\x19\x7a\x35\xbe\x8b\x06\x6d\x18\x0f\x33\xb4\x0c\xba\xc0\xe9\xb8\x3e\x84\xa3\x8b\x8f\xe9\x08\x44\x7b\x48\x8e\xda\x8b\x8b\xc1\x76\x77\x32\xb0\x67\x42\xa8\x63\x7c\x77\x7b\x77\x7b\xc4\x6f\x3f\xd1\x0a\x75\x74\xe3\xf2\x2f\x91\x73\xfa\x6a\xd7\xad\xdd\x6c\x74\xbc\x9f\x37\x74\x59\xca\x65\x8b\x05\x59\xcd\xf0\x62\x8a\x67\x85\x54\x7c\x44\x34\x60\x42\x4b\x23\x49\x32\xb2\x41\x43\x87\x09\x8a\x85\x5c\xde\x10\x87\x92\x19\x64\xe8\x32\x4c\x66\x32\x0a\xcf\x18\xf1\x1c\x62\x14\x54\xcc\xd0\x32\x62\x52\x8a\x9c\x4e\x95\x51\x41\x29\x97\x50\x5c\x16\x18\x23\x9c\xf2\x07\xd1\x10\xe2\x60\x3c\x35\x12\x47\x9a\x6c\x50\x31\x8a\xe1\x51\x16\x16\x25\x45\x32\x87\xb2\x12\x8c\x43\x05\x65\xcc\x58\x2c\x16\x4c\x6a\xc9\x52\x92\x17\xdc\x3c\xc8\x86\xd9\xfe\xc5\x04\x6f\xb5\xdb\x3f\x77\xe1\x6c\x0a\xc7\x3f\x3a\x3c\x7d\xdd\xb7\x09\x1c\x57\xeb\xbc\x98\x89\xee\x5f\x84\x4f\xd2\x74\xe0\xdc\xe0\x03\xd1\xbd\x38\x3a\x59\xfb\x81\xf3\xbd\xac\xf3\x3d\x7a\xfd\x07\x5e\x38\x14\xa2\xf7\xbf\xe1\xa2\xed\x86\xae\x52\xd7\x01\x1c\x1f\x7e\xff\xef\xf0\xcc\xc7\xb9\x64\x84\xb3\xde\x81\x23\x00\x29\xbb\x9d\x7d\x1f\xec\x24\xf6\x21\x34\xd6\x73\xa0\x3e\x3e\x5f\x8f\x4b\x5b\xf1\x04\xd6\x55\x28\x6f\xd9\xbd\x2b\x75\x18\x5d\x28\xe8\xcd\x83\x06\x02\x84\x2e\xa9\x35\xe6\xdd\xbf\x92\x18\x07\xc3\x75\x80\x76\xd1\xbc\x93\x8b\x75\x00\xfb\x6d\xf4\xcf\x40\x93\x4e\xb2\xfb\x6b\x2e\xde\x2a\xe2\x7d\x39\x70\xdb\xf9\x27\xaf\xfd\x86\xe8\xb5\x8f\x18\x9e\x32\x71\xa0\x8d\x58\x0f\xa1\x0b\xaf\x7f\x91\x18\x47\x69\xac\x7f\x80\x22\xe0\xaf\x12\xf0\x87\x04\xaf\xc7\xed\xab\xee\x6d\xa1\x6d\x82\xd7\xef\x09\xba\xf0\xc1\x69\x5f\xdf\x4f\xf0\x0e\xbc\x9e\x17\xef\x6a\xd1\x8f\x85\x46\xff\xfe\xdf\x12\x70\xe0\x89\x73\x01\x2e\xdd\xd2\x59\x7f\x7f\xcb\x9d\x9e\x3d\x4e\xe6\x81\xe6\xf6\xcc\xfd\x4d\x3c\xc8\xa5\xfb\xed\xfc\x9d\x83\x9f\x5c\x03\x3f\x43\x74\xff\x14\x17\xdd\x38\xf0\x39\xf0\x9e\x97\x6e\xc3\xd0\x83\xd3\x00\xa9\x53\x29\xf5\x76\xfd\x9f\x2e\x19\xe3\x8c\x73\xb0\xc3\x75\x5e\xce\xb9\x1f\x68\x23\xe0\x8f\xc7\x5f\xff\x1c\xae\xc4\xf2\x1e\xd1\x4e\xf0\xe8\xb5\x0f\x39\xed\x09\x52\x27\xef\x2f\x36\xf3\xe2\x9a\x6d\xf8\x0a\xd1\x9e\x24\x64\xb9\xcf\x5b\x77\x5a\xbf\xd2\x5b\xe7\xdf\x36\xe0\x2d\x23\x57\xfa\xbc\xe7\x1d\xfc\x8a\x8b\xbe\x1a\xfc\xec\x39\x6f\xba\x7b\xf1\x08\xef\xf1\x0f\x06\x88\xf6\x6c\xa3\x7d\x67\x9e\x68\x4f\x34\xda\xfb\x7f\xed\xa2\x2f\x67\xfc\xc1\xe4\x61\x64\xe1\x0b\xc4\x79\x25\x31\xfe\xdf\xe3\xe2\xaf\x0e\xbd\xd7\xf0\x73\x39\x31\x0e\xc1\x43\x77\xd8\x37\xdf\xaf\x12\x7a\xad\xe2\xc8\xff\x15\x35\x39\x66\xf3\x26\xa5\x96\xaf\x72\x7c\x2d\x7e\xa8\x3d\x72\x18\x8f\xc4\x84\xf1\xed\x91\xf6\xc8\x04\xd8\x48\x3b\x68\x2b\x90\x3e\x23\x1d\x66\xa9\xac\xa9\xa6\x94\x82\xa5\x30\x16\x61\x4c\x40\x2c\x2a\xf1\x92\xa6\xb2\x9a\xc6\x86\x4d\x9d\x62\x63\x48\x68\xe3\x86\x73\xd6\x0f\xca\x50\x99\x2c\x4a\xd4\x1c\x89\x4a\x8c\x8b\x9b\x6c\x4c\x93\x45\x5d\xd4\xa5\x9c\x64\x14\xa0\x86\x58\xec\x57\x64\x39\x2a\x4f\x95\x92\x48\xd5\x11\xaf\x21\x4e\x43\x6a\x49\xcb\x42\xc6\x81\x67\x02\xeb\x5e\x36\x9f\xc1\x7e\x69\x70\x04\x78\xa9\x3a\x29\xb0\x9e\x9e\x0b\x7c\xc4\x0d\xab\x1d\xd5\x88\xed\xa0\x8e\x5e\x86\xb2\x5f\x52\xdb\x89\x4b\xad\x3f\xc7\x59\x7f\xc7\xde\x83\x8e\xba\x0f\xd6\xd7\x13\xf2\x05\xda\xf4\x61\xf1\x37\x2b\x1f\x39\x38\x6f\xe5\x03\xd4\xc5\x86\x31\xf2\xed\xb6\xdc\x30\x47\x9d\x66\x18\xe8\x77\xba\x6e\x3e\x33\xa0\xdc\xb4\x7c\xe5\xf1\xcb\x17\xde\xb6\x70\x39\x0c\x2e\x9c\xb9\x79\xf9\x4e\xff\x19\x1a\x7a\x04\x71\x48\xd5\x65\x09\x26\x29\x7a\xb8\x40\xbd\xaa\xb7\xfd\x7d\x24\xa3\x20\xa3\xad\x27\xa5\xaa\xba\x88\x14\x41\x52\x55\x01\xc9\x29\xa4\x22\x43\x82\xbc\x07\x0e\xac\x7f\x9e\xb0\xa3\xd3\x0d\x1a\xcf\xd4\xef\x80\x66\x55\x63\x81\xdb\xe9\x95\xcc\x9c\x83\xef\xa1\xc8\x94\x4b\x27\xbd\xc4\x4c\x3b\x78\x5e\xf5\xf2\xea\x9f\x2f\x49\x4c\x79\xb3\x36\x5e\x9c\xe0\x6d\xbf\x22\x70\x4a\x6e\xc8\x60\xbb\xf6\xf1\xc1\x01\x07\x7f\xe4\x06\xfe\x1c\xc4\xaf\xab\xb4\x9c\x23\x7b\x74\x82\xf7\x7d\xe1\xa9\xaf\x45\x77\xe1\x17\xcb\x6b\xa1\x33\x17\xa6\xa7\xfd\x7f\x68\xd1\x69\x09\xba\x5c\x7b\x3b\xd1\x2e\x35\xda\x57\x9d\xea\x4d\x7f\xfd\xf5\x78\x40\xb9\x6e\x73\x1f\x7c\xcf\xd2\xbd\xd7\x7f\xb3\xe8\x4d\x4f\xcb\xbd\x75\xcb\xc1\x0a\x21\x57\xf5\x06\xbf\x5c\x7d\xbf\xcb\xe6\x73\xe8\x2c\xb3\x98\x90\x27\x04\x9f\x58\x37\xda\x9b\x3f\x0d\x4e\x75\xe9\x96\x8e\x9e\x72\x60\xbc\xb7\xad\xb9\x76\x8e\xcb\x16\x74\xf8\xf1\xe0\x1a\xef\xf5\xec\xff\xbd\x8b\x6f\x39\xfd\xf7\xad\x26\xe4\x80\xde\xf0\x85\xac\x0e\x06\x1b\x7c\x9a\xd0\x69\x07\xeb\xbe\x99\xbe\xea\xb9\x81\x37\xe9\xeb\x99\xb9\x6b\x0e\xc1\x30\x60\xce\x9b\x38\x69\x90\x99\xb3\xea\xa3\x3f\xf9\x2f\x28\x4d\xfe\x19\x33\xed\xc0\x69\x60\xcb\xc8\x98\x0b\x06\x2f\xa7\x1c\x98\xa9\x0e\x3e\xbc\xeb\x2d\x83\x0f\xbe\xe5\x2d\xf3\x8c\x2b\x89\xfe\x2c\x71\xb6\x9f\x7b\xf3\xe8\xc1\xe3\x08\xfc\x6d\x9c\x55\x74\x0f\x7e\x61\xb3\x67\x33\xf1\x59\x93\x7e\x79\xe0\x05\x07\xd6\xf6\x67\x6f\x7a\xe8\x12\x0d\x5c\xd1\x5c\x7c\x51\x06\x51\xc0\x81\xa9\xe0\x72\xcb\xb6\xee\xab\xdd\x0b\xd7\x6a\x30\x5a\x9c\xd1\xe7\x14\x02\xaa\xff\x82\xbd\x9d\x75\xdf\x4a\x60\xec\xb8\xd6\x3b\x0d\x7f\x17\xed\xef\x19\x9b\xa7\x32\x6c\x3a\xec\x63\x46\xf2\x61\xd6\x17\x1e\x49\x0b\x6d\x02\x8a\xe7\x2d\x9e\xa9\x95\xcc\x7c\x1e\xe5\x53\x25\x03\x69\xb0\xc2\x87\x51\x82\x62\xd8\xb0\x29\x53\x25\x43\x96\x92\x2a\x2f\x94\x32\x22\x2a\xa3\x92\x20\x09\x3c\x2b\x08\xb1\x30\xca\xca\x29\x41\x92\xa0\x10\x2b\xa3\x02\x07\x39\x7f\x59\x0b\xcb\x1a\x9f\x54\x75\xcd\x10\x0c\x15\x32\x43\x19\x59\x33\x34\x31\xae\x26\x79\x93\x1f\xe2\x84\x14\x2f\x26\x25\x51\xcb\x69\x55\x20\x09\x8c\xc6\xb0\x09\x8a\x4d\x08\x92\xc0\x19\xaa\x9c\xd2\xc4\x1a\x7e\x10\xb6\xe5\xfe\xe7\x09\xfc\x93\x1a\x67\xd2\xff\xef\x16\x1b\xf2\xb7\x2e\xd8\xf2\x55\xa9\xe6\x13\xc6\x31\x62\xeb\xee\x20\xc6\xc1\x6f\x16\xb7\x7d\x8c\xe5\x6c\x90\xe0\x75\x18\x5f\xfb\x71\x0e\xde\xc1\xeb\xbc\x71\xaa\xff\x17\xcd\xbe\x91\xda\x7a\x3e\xf3\x96\xcb\x07\xc6\x10\xf4\x46\xec\x6b\xef\xa9\x84\xde\x92\x22\x7c\x32\xaf\xb8\x70\xcd\xe1\x79\xab\xe6\x11\xe3\x13\x3e\xa8\x17\xff\xe3\xad\xe7\x1b\x5f\x07\xa4\x0f\xc2\xf1\x61\xee\x7f\x8b\x98\x17\xc3\x6d\xc7\xfe\x16\x9c\x24\xf6\xbb\xf2\x18\x67\x3d\x57\x04\x96\xd3\x4f\xd4\xd6\x33\x6d\xc7\x47\xd5\xbb\x41\xdb\xc5\x68\xf2\x66\x47\x27\x93\x43\xd1\x9d\x8f\xbb\xc6\x4a\xd5\x79\xe7\xfe\xb7\x1b\x3c\x18\x1c\x81\x61\xfd\x35\xfa\x7e\xe0\x03\x47\xe0\x18\xe2\x73\xc0\x84\x5a\x5d\x36\x2c\x23\xc7\xb5\xc8\x42\xd8\x5c\x22\x01\x5b\xb5\xe3\x7b\xdb\x23\xe3\x7b\x3b\x2d\x11\x1a\x69\xb7\xeb\xeb\x59\x3f\xd4\x2f\xda\xe4\x61\x15\x5d\xa1\x2b\x92\xaa\xb1\x86\x2a\xa9\x06\x54\x55\xa5\xac\x97\xfd\xe9\xd9\xb3\xef\xbd\x73\xfa\xf5\xa7\x2c\xba\x68\x8a\x79\xdb\xa6\xd9\xb3\xa1\xb1\x11\xcd\x36\x4d\xb8\xde\x34\x6f\xb3\xff\xa0\xef\xd7\x9f\xe6\x25\x45\x16\xea\x82\x52\x15\x90\x82\x74\x09\x0a\xbe\xea\xc8\x9e\xa7\xd1\x5b\x82\x30\xea\xe9\x51\xd3\xe1\x28\x44\xc3\x43\x4f\xfb\xae\x7e\xfd\x75\x34\x0b\xbf\xb0\x3f\xd1\x3c\xcf\xfe\xb3\xd9\x8f\x1a\xa2\xd3\xdb\x5c\xb6\x4c\x43\x07\x3e\xcd\x65\xe7\x3b\xbc\x7b\xfb\x4d\xde\xba\xd9\x8e\xd7\xbc\xfd\x05\x3b\xef\x3b\x8c\x6c\xbb\x8d\xc0\x3d\xbb\x6e\xee\x16\x8b\x37\xed\xc4\xaf\x66\x57\x7d\xe4\x35\xc7\xb6\xc9\x2e\xfd\xd8\x59\xd3\xda\x6f\xb8\x64\xb8\xb3\x87\x1d\x27\xb8\xd6\x2a\xd5\x65\xf1\x76\xfc\xe9\xf6\xcf\x3d\x64\x53\x74\x0f\xae\x10\xbe\xe3\x29\x67\x6d\x06\x2d\x84\xa2\x3b\x46\xd5\x57\x55\x6b\xbf\x38\x30\x93\xbe\xaf\x26\xb7\x6a\xd2\x6b\x27\xb7\x7b\xd8\xd1\x15\x1c\x7d\x72\xe7\x43\x25\x0f\x5b\x28\x44\xef\xd8\xe8\x0d\xc7\x4c\xb2\x19\xd7\xf7\x8d\xf9\x5f\x34\x90\xfe\xbd\x8b\x96\x1c\x9a\xdf\x2e\x34\xcb\x85\xf4\xe2\x16\x5d\x83\xf0\x6f\x6d\xaf\xbf\x3d\xbd\x0d\xd7\xdd\xba\x83\x99\xbb\x5d\x04\x34\xf5\xc1\xe4\xe9\x13\x3f\x0b\xd1\xfd\x19\x87\x0f\x11\x76\xde\xca\xb3\xbd\xf5\x90\x1d\x13\x88\xb3\xcd\x12\x6b\xfd\x91\x37\x4e\xa5\x4f\x71\xc9\x77\x39\x14\xdd\xf1\x1b\x8f\xfb\x1a\x39\x64\x9f\x4e\x74\x4f\x5b\x1d\x22\xad\xfe\xbb\x1d\x8b\x08\x19\x9f\xa9\xcb\xe1\x10\x7d\xe0\x4c\x62\xac\x4c\x63\xee\x03\x75\x9b\x68\x49\xf5\xcc\x80\x4e\x5f\x69\xb5\x9f\xf5\xe7\x10\x3d\x78\x89\xcb\x36\xb4\xf6\x7c\x71\x13\xfc\xc8\xbb\x22\x3a\x2d\x10\x3a\x13\x61\x63\xee\x5c\x43\xf4\x97\x09\xde\xfb\xbb\xc3\xd0\x0b\x99\x43\x29\x47\xd8\x50\xe3\xbd\x75\xb5\x6d\x23\xcd\xbc\x7d\xf0\x52\xd0\xec\xd7\xc3\xeb\xc7\x32\x25\xba\x0d\x67\x97\xd8\xf6\x09\x61\x27\x3b\xf4\xb2\x76\xa1\x37\x1f\x5f\x2b\x13\x7b\xe0\x88\xb5\x5e\xe5\xa2\x61\xcb\x1e\xc3\xef\x14\x57\x1a\xde\xb8\xba\xfd\xcb\x2e\x7b\x4c\x75\xda\x2f\x27\xda\x45\x02\x5f\x54\x6f\x1a\x49\xff\xd4\x85\x47\x8d\xfe\x63\xbc\x61\xb4\x83\xbc\xeb\x22\xee\xf0\x76\x1e\xef\xed\xa7\x38\xf8\x6b\x97\x9e\xe8\xe0\xfb\x41\xc6\x75\x66\xce\xfa\x77\x8c\x78\xeb\x4c\xe9\x2f\x79\xeb\xb3\xe9\x78\xf3\x7e\x77\xf4\x36\xd1\x78\xed\x9d\x68\x4d\x0f\xbd\xcf\xe5\x5f\x68\xd0\x6c\x97\xd3\x1e\xaf\xd1\x7e\xab\x3f\x48\x27\xd6\xf9\x92\x6b\x9c\x06\x2f\x7e\xb0\xd6\x6e\xd4\xe1\xb9\xeb\x71\x6c\xb3\x60\x3d\x71\xd7\xe2\xda\x77\x62\xf6\x9e\xb7\xbf\xdf\x82\x5f\xf6\x1e\x26\x01\xb7\x5f\xbd\xa6\x57\x5a\x38\x11\x8a\x2e\xff\x6d\x71\x28\x44\xeb\x9f\x10\xfb\x73\xe6\xdf\x75\x9c\xb7\x2c\x58\xff\x98\x4b\x16\xb8\xc6\xdb\x3d\x84\xb3\x41\xa3\xea\xf1\xcd\xf3\xd5\x60\xbc\x85\xd0\x25\x74\xc2\xcf\xae\xb8\x70\x50\xa9\xcf\x55\xbb\x1d\xd9\x85\x3f\xbb\xb3\xca\x07\xee\xa4\x1f\x67\xe6\x6c\x3f\x61\x9b\x7f\x8a\x38\xf9\x67\x21\x7a\xf0\x8b\x23\x3d\x71\x71\xf7\xee\x66\x9d\x68\xf7\x5e\x9c\x5b\x3f\x53\xe7\x16\xad\x7a\xe3\x4e\xca\x75\x0e\x62\x28\xba\x7b\x4f\xd3\xb9\x25\x6c\x5a\x5e\xff\x88\xcb\xbf\xe4\xba\x3b\x0e\xd1\x03\x4f\x10\x78\xfa\x8c\x83\xa7\x53\x07\x16\x2f\x05\x17\x3f\xca\x91\x70\x69\xc8\x97\xe9\xcd\xf0\x3a\x30\xd9\x5a\xaf\x4d\xb9\xda\xf7\x89\xf3\x51\x43\xd1\x03\x37\x37\xad\xeb\x9c\xc0\x7a\x07\x9f\xa6\xae\xf9\xd2\xcb\x7f\x9b\x32\x8b\xfb\x96\x1b\xf7\x5f\xf4\xb9\xbe\x23\x35\x6c\xb3\x20\x08\xd1\x2b\x19\x17\x1f\x6e\xd8\xf5\x0f\xba\x70\xdf\xb1\xb5\x0f\xe0\xd7\x60\xda\xcb\x5e\x72\x63\xfd\xfc\x66\xb9\x51\xbb\x9b\x9a\x73\x18\x5e\x79\xac\x37\xbd\x6f\x7d\x96\x68\xc7\xb2\x7b\xd5\x5d\xa0\xd9\x2f\x49\xf8\x73\xd7\x9f\x4d\xc0\x5d\x69\xd8\x7a\x6b\xc9\xbb\x6a\xc2\x9f\xb8\xf6\x7e\x4f\xd9\x13\xb5\xac\x33\x86\xd6\xbe\xe7\x85\x57\xeb\xef\x24\xe8\x2b\x43\xf8\x72\x16\x60\x3d\xf5\x48\x90\xaa\x8e\xb7\xf4\x35\x10\xa8\x55\xd5\xb7\xa3\xe4\xc7\x83\x89\x60\x4a\x23\x26\x15\x92\xd1\xec\xf5\x5c\xdf\xdd\x76\x66\x7b\xbf\xa5\xcd\xda\xe5\x69\x3c\x3c\x3c\x01\x41\x1f\xc9\xe8\x50\xd4\xf4\xb2\x5c\xa4\x40\x39\x2b\xe5\x8a\x28\xe9\x0b\xa3\x34\x54\x90\xa2\xe3\x1c\xdd\x45\xd8\x43\x19\x66\x0a\x4d\xa2\xb6\x98\x37\xc2\x57\x75\x7d\xe4\xce\x56\xbd\x96\x0e\x23\x79\xa8\x02\x15\x34\xc4\x17\x73\x72\x26\xa3\x66\xd5\x82\x8a\x32\x5a\x51\x43\x3c\xcc\x68\xc5\x77\x57\xac\x58\xf1\x27\x33\x18\xe8\xf5\xd6\x6c\xbd\x60\x33\x38\xc9\xa5\x5f\x38\xed\x1b\x17\x7b\xfb\x1b\xd6\x2e\x70\xd9\xce\x8d\xfb\x86\xff\x12\xfd\x85\xc6\xb9\xec\xc6\xa7\x7f\xa0\xc7\xa1\xb9\x6c\x83\xe6\xd6\x3f\xe4\x8c\x75\x61\x60\xa7\xa5\x03\xe2\xb1\xa6\x1a\x77\xbd\xf1\xc5\x45\xe7\x72\x67\xe2\x37\x88\xb6\x3f\x5c\x03\x7e\x70\x3c\x38\x03\x9c\x5d\x3b\x95\x69\x4e\xd4\x4e\x97\xff\x44\x58\x0f\x01\x1f\xdb\xe3\xef\x19\x17\xed\xe9\x1d\xd3\x05\x9b\x1f\xaf\x3b\x35\x4c\x5a\x4e\xc7\x2f\xa7\x55\x41\x37\xa8\x24\x63\xe6\xf9\x72\x32\x19\xd4\x19\x49\x54\x50\x46\x42\x20\x0c\xf3\x1c\x63\x84\x13\x54\x5c\x14\x79\x89\xd5\x92\x09\x33\x6e\x18\x54\xc1\x8c\x5b\x3f\xa6\xee\x71\x42\x5a\x9c\x93\xf8\xb8\xa4\x71\x7c\x2a\x1d\x4b\xcb\x69\x8d\xd3\x12\x8a\x6e\x88\x66\x71\x24\x9b\x12\xc2\x5a\x38\x29\xa1\x6c\x1b\x40\x25\x0d\xa5\xb4\xb6\xdc\x61\x0e\xaa\xd5\xbe\xdc\xfa\x23\x4f\xbb\x33\xba\xdb\xce\x64\xf5\x5d\x2f\x19\xae\xbd\xe4\xad\x9f\x1e\x7c\xdf\x5b\x17\x58\xff\x0d\x97\xcd\xe8\x8c\xb3\xf9\x6e\x02\x47\xb0\x6d\xbe\x2d\x8b\x75\xff\x47\x9b\xec\x0b\xac\xb7\x18\xb3\x5a\x6c\x43\xdb\x97\x32\xb9\x45\xe7\x23\xfc\x43\xdb\x1e\xf6\xd6\x73\x56\x37\xf0\x2d\x1e\x50\x1b\xf8\xb6\x6d\x1c\x81\x87\x64\x3b\x8e\xfd\xc2\xf5\xda\xb1\xbe\x0c\x3a\x89\xd7\xe6\xe7\xe1\x1b\x54\x27\xe5\x7e\x23\xe3\x7e\x2b\x56\xc0\x2e\xec\x73\xae\xff\x86\x3d\x63\xa9\x7c\x5e\xcb\x64\x64\x21\x25\x69\xa2\x2c\xe6\xc4\x34\x12\x32\x9a\x68\xa4\x6b\xe7\x1f\x53\x53\x59\x23\xe7\x2f\x69\x59\xa4\x8b\x50\x30\xf4\x1c\xca\x48\x30\x51\xd4\x0b\x48\x95\x60\xca\x1f\xc4\x09\xf3\x0d\x43\x57\x8b\x23\x29\x5f\x1e\x65\x72\x1a\x8c\xc1\x2c\x1c\xf2\x76\xd7\xfa\x93\x7c\x15\xe4\xd4\x2c\xca\xf2\xa8\x94\xd3\x32\x28\xc7\x23\xb5\x0a\xb4\xa1\x06\x8c\x9c\xf3\xdc\x7b\x99\x8b\xf6\xc4\x50\x74\xdb\x59\x1e\xfe\xa7\x06\xaf\x9f\xe7\xed\x4b\xc8\x5c\xea\x92\xa5\x42\x28\xba\x7b\x0a\x21\xcf\xbe\xe3\x25\x07\xb6\x2e\x20\xe6\x48\x10\x73\xdc\xe7\x92\x03\x92\xc3\x3f\xee\x6b\x96\x27\x7b\x6e\xc4\xfc\xfb\x86\x16\x3b\x44\x09\x45\xf7\x08\x0d\x7d\xa2\xe6\x7f\x73\xf6\x58\x9b\xe7\x5e\x02\xcf\xec\xbd\x60\x39\xb1\xe7\x7a\x97\xbe\x28\xd4\xf5\xe9\xf4\x6f\xbc\xf4\xcb\x90\xbb\xdd\xf6\x27\xbd\xeb\xa1\x47\x36\xee\x03\x67\xb9\xf4\x57\x67\x3d\x7b\xae\x23\xd6\x93\x24\xe4\xd6\xbd\xde\xf2\x72\xd5\x7a\x17\x9c\x1a\xf7\x8a\x77\x79\xea\xcd\x75\x9b\xfa\x3e\x37\x9c\x6a\x67\x31\xe0\xad\xf3\xae\x3d\xd7\xd3\x6f\x10\xdd\xf9\x1d\x7c\xae\x59\x02\x4e\x6a\x1d\x1e\x5b\xbf\xeb\xed\x6b\xd8\xfa\x69\x33\x9d\xae\xbe\xaf\x45\xdf\x92\x1a\x73\xaf\xbe\xb7\xd9\xa6\x3e\xb0\xb7\x45\xb7\xc5\x6b\xdd\x75\xc0\x5a\xd3\x8b\x81\x26\x3d\x95\xf4\x99\x7d\xdb\xc5\x87\x1a\xf1\x12\xf7\x78\x9d\x45\x88\xde\xf3\xe1\x61\x64\xd8\x3d\xae\x3d\x58\x78\x76\x1f\x86\xed\xbd\x04\x0e\x2a\x8d\xf3\x88\x81\x10\x9d\x89\x97\x48\xbd\x5a\x0a\x45\x77\x7d\xa7\x81\x9b\xbb\x5e\x6a\xfa\x2c\xeb\xf9\x19\xd6\xd1\xf4\x0f\xad\xcf\x56\x4b\xc4\x3e\xdd\xb1\x0c\xd1\x01\xfb\x95\xdf\xb7\x08\x9b\xd9\xb1\x81\xd7\xa6\x08\xfd\x35\xd9\x68\xdf\x92\x73\xf9\x6d\x1c\x3b\x6b\x0b\xa9\xd7\x59\xf6\xc0\x9c\x83\xef\x31\xa7\x72\x60\xd2\xcd\x21\x7a\xf5\x1b\xc5\xc6\x9e\xf0\x1d\xf5\x81\xd7\x08\x7a\x3f\xe8\x85\xdf\xfd\x3f\x77\x6c\xfc\x63\x02\x02\x3d\x39\x14\x3d\xf8\xed\xf4\xcf\x2c\xbd\xfa\xac\x5f\xe3\xf6\xfb\xeb\xb6\xfc\xe0\x17\x9d\x20\x44\xef\xff\xbe\x8b\x0e\xd5\x50\x74\xcb\x6b\x80\xf4\xff\xa4\xea\x6f\x30\x07\x27\xb6\xf8\x54\x08\x3d\xbf\xff\x67\x44\x3b\x71\xf6\xfd\x05\x2f\x3c\x0d\xd1\x07\x58\x02\x4e\xd9\x86\x5e\x39\x38\xdc\xcc\x2b\x6b\x3e\x84\x97\x5c\xf6\x9f\x54\x1f\x67\xf0\x1a\x97\x7d\xdc\xd0\x9b\x2e\x6c\xde\x57\x8d\xfe\xbb\x89\x7d\x11\xfe\x9d\xc1\xb9\xae\x75\x4a\xa1\x68\xff\x4f\x5b\x78\x34\xe1\xdf\x59\xf9\x19\x31\x4e\xae\xc1\x47\xf6\x0d\xbb\xe4\xaa\xb3\xaf\x2d\xe4\xf8\xcb\xe8\x47\x6a\xe3\x4c\x5b\x73\x44\xb5\x0f\xf8\xa7\xda\x75\xd8\x9b\xef\xac\xfe\xd5\x22\x1f\x7e\xd4\x24\xbb\xf9\x80\xd4\xe0\xa9\x2b\x5f\x6a\xb6\x77\xd6\x9d\x84\xef\x80\xa7\x36\xd1\x2c\x61\xcf\xaf\xfc\x0e\x71\x0e\x2a\x11\x5f\xd3\xed\xc2\x57\x31\x14\x1d\x78\xa8\xe5\xfc\x09\xfb\x7f\x1b\x79\xf7\x93\x6c\xc8\x93\xfe\x77\x88\x35\x61\x7c\x59\xf5\x37\xe0\xf6\x2f\x72\x84\x3e\x4a\x6f\x19\xf0\x3e\xff\xf5\x27\xbb\xce\xc1\x39\xff\x01\x85\xe0\x6b\x04\x1d\x68\x07\x5a\xf8\xfc\x79\x2d\xfa\x0d\xc6\xa3\xd5\xdf\x6c\x59\x8f\xcd\xff\x1f\x6d\xa2\x03\x8e\x8c\xbb\x59\x25\xba\xf0\x48\x09\x45\x57\x7f\x1d\x34\xc7\x3f\x61\xbd\x67\xad\xd4\x02\x37\x32\x1e\xa1\xcf\xdb\x1f\xb4\xe5\x5c\xd0\x44\xfb\xfd\x6f\x37\xad\xc7\x8d\x5f\x87\x89\x43\xe9\x7f\xab\x79\x1c\x17\x0f\x19\xf4\xe2\xd7\x99\x99\x2e\x3c\x12\x42\xd1\xd5\xf3\x88\xef\xec\x77\xc3\x69\xd5\x9f\x9b\xe0\x57\xbb\x23\xde\xa2\xb6\xd0\x0f\xe1\x67\xd3\xf6\x79\xfb\x32\xb6\xcc\x22\xda\x09\x79\xbb\xe5\x63\x6f\xbe\x33\x78\x81\xeb\xdc\x94\x50\x34\x33\x9b\x58\x6b\x86\x80\x95\x05\xc3\x9f\xb4\x9c\x11\xe1\xf3\xda\x82\xe3\x42\x41\x10\xcf\x31\x40\x2b\xd8\xda\x3c\x06\x9c\x04\xc6\x81\x8b\x40\x12\x5c\x89\x6d\x9a\x48\xcd\xdc\x8c\xd4\xeb\xb1\xb9\xb4\xd2\x5a\x65\xbe\x76\x60\xe9\xa4\x9d\x8d\x4a\xff\x91\x93\xa3\x17\xda\xa5\x19\xed\x24\xd4\xd6\x57\xa9\x9e\xb6\x22\x1f\xa7\x58\x63\x44\x30\x28\x26\xc6\x8d\x94\x5b\xf5\x55\xdf\x55\x5b\x07\x1e\x5d\xfc\x32\xb3\x0e\xde\x78\x70\xdd\xe7\x68\xda\x59\x73\xdf\x3d\xa9\x27\xb8\x8e\x59\x8c\xde\x7d\xf9\xc1\xc5\xcf\x3e\xf8\xfe\x6e\xf4\xf9\xb3\x27\xcd\x5a\x36\xab\x2d\xfc\xe8\xac\x75\x33\x1e\xa0\x15\x51\x41\x5a\xb1\x02\xd5\x94\x10\xf6\xd6\x5c\xdb\x8e\x7c\xd0\xb8\xd3\xd0\xd1\x7b\xe6\x87\x70\x39\x7c\xf3\x58\x73\x39\x9a\xb5\x75\xf4\xb1\x91\xc8\x60\xcf\x1f\xee\xba\xe0\x2b\x17\xdf\x33\x6b\xd6\x8a\xf5\xd4\x97\x47\xa3\x77\xff\x71\x56\xf9\xe3\x77\x47\x2e\x80\xbe\x77\x5a\xfd\x80\x83\xe3\x9a\xcf\x6f\x50\x6c\xb1\x2b\xec\x37\x01\xa9\x16\xfc\x57\x1b\xfc\x61\xf5\x7c\x6f\xfd\x6a\xf0\x7c\x97\xae\x2b\x87\x6c\x6d\xa8\x7e\xae\x7b\xbd\xf4\xab\xcc\x13\xc4\xdc\x84\x4c\xee\x7f\x93\x38\xef\x34\x41\x33\xc7\xba\xfa\x3b\x3c\x7c\xf5\xb3\xcd\x73\xef\xd1\x5a\x70\xd9\xae\x83\x7d\x63\x0b\x3f\xd6\x08\x5d\x10\xeb\xcc\xda\x1e\x87\x2e\x04\xac\xe7\xce\x6d\xa2\x17\x77\xbc\xda\x72\xd7\x5a\x9d\x35\xad\x67\xbd\xfb\xf7\xff\xd8\x9b\x2e\xd6\xce\x76\xe9\x6f\x5a\x28\xba\x6f\x6d\x8b\xbe\x8c\xf5\xee\x2d\x31\xd7\x7a\x12\x75\x59\xd3\x8f\x73\xa8\x6a\xbb\x5d\xfe\x1f\x47\xd6\x68\xbb\x5c\x7c\x51\x0d\x45\xd7\xbe\x6e\xf1\xe3\x6d\x1f\x13\xed\x77\xd0\x32\x33\x67\xcb\x81\x6f\x83\x29\x1f\x73\x96\xac\xfe\x82\x80\x37\x21\x7b\x37\x7f\x56\xb3\x09\x53\xd5\xa9\x81\xe7\x70\x2e\xf5\x93\xc1\xc4\x5a\x05\xc4\x59\x38\xf7\x76\xe3\x3a\xdd\xe7\x7e\xa8\x50\x2b\x72\xf0\xff\xd2\xa5\x85\x5a\xdb\x0a\xfd\xd7\x6d\x5e\x28\x2d\xdc\x75\x70\xf7\x2c\xf4\xd7\x83\x57\x3e\x7f\xc1\x85\xc7\x5e\x79\xe9\xa5\xe6\x21\x98\x29\xee\xbe\xee\xe3\x5b\xd0\x1f\xa9\xa3\xac\x1e\xf7\x2c\xdc\x7d\x70\xf7\x75\xe8\x53\xaf\x1e\xe8\xaa\x56\x27\x03\xf5\xfa\xf7\x94\x1b\x96\xdc\xb1\xfc\x86\xdd\x97\x2d\x5f\x0e\x03\xe8\x17\x5f\xbb\x26\xb8\x7c\xd4\x25\xf0\xf7\xca\x78\xf4\xd6\x1d\x77\x2c\xff\xad\xdf\xff\xfd\x45\x37\x2d\xbd\x4b\xbb\x69\xef\xe5\x9a\x06\x8f\x42\x3f\xbd\xf5\x9a\xc0\x73\xa3\x2e\x81\x7f\x79\x7c\x02\xca\xdf\x79\xe7\x73\xef\xc3\xa9\xde\x8e\x87\x1a\xec\x88\x3b\xcd\xe5\x3f\xf0\x96\x2b\xeb\x4f\x68\xd6\xa1\x6d\x79\xb9\xaf\xdf\x25\x3f\x1a\xfa\x4f\xc2\xe9\x3f\x31\x70\x0d\xbd\xb4\x66\x8f\xf5\xf4\x8f\x83\x4f\x02\x18\xa2\x0f\xbc\x36\xfc\x99\x5b\x2e\x6f\xbd\xba\x85\xde\xb1\xbf\x72\xf5\xdd\x4d\x3c\xb6\x1e\x1f\x6a\xe3\xcd\x4e\x02\xff\xc4\x86\xdd\xa7\xed\x70\xd9\x08\x0e\x4d\x6b\xdb\x5d\xf6\xa3\x43\x0f\xfd\x6f\x10\xe3\x13\xfa\x74\xff\x6b\xcd\xfa\x46\x8d\x4e\x5e\x77\xed\x5b\xaa\xc3\x6f\x5d\xa9\x99\xd6\x37\x57\x5b\xf4\x5f\xcc\x1b\x56\xdf\xd9\xa2\x3f\x10\x70\x3d\x78\x0e\xf0\xf4\xd9\x68\x69\x17\xdf\x6b\xf8\x4d\xee\x22\xda\x89\x78\xbd\xed\xf8\x06\xf4\xc0\x16\x42\x06\x36\x60\xb1\x8d\x98\x9b\x88\xa7\xdf\x52\x8f\x45\xdc\x5a\xe5\x02\xb3\xe9\x9b\x43\xd1\x8d\xd1\x57\x87\x42\xf4\xaa\x8f\xae\xf4\x7b\xe9\x04\x1b\xbf\xe3\x8d\x33\x5b\x86\x9a\x65\xe9\xe6\xf3\x3c\x78\x95\xb3\xb7\x4d\x27\x79\xeb\x1c\x1b\xea\x31\x55\x9b\xaa\xc9\xc0\x4c\x5a\x66\xa2\x83\x5f\x5c\xec\x0f\xd1\x9b\x5e\x7a\x99\xd4\x05\x1c\x59\xb2\x69\x03\x71\x96\x18\xa6\x07\x4e\xc7\xfe\xf0\x97\xf1\xae\xb7\x12\x7c\xac\x31\x47\x9b\xb7\x1e\xba\xe1\x13\x6f\x7e\xb8\xf1\x50\xb3\x5e\xb1\x96\x23\xe4\xc9\x16\x02\x07\x84\x50\x74\xc3\xba\x96\x7d\xdb\x76\xee\x09\x1e\x3a\x8d\xb3\x8f\xcc\x3f\xbc\xed\xdf\x8d\x67\x7b\xc3\xef\x85\xdf\x11\x38\x29\x36\x70\x72\xf5\xbf\x5d\xe7\xe0\xc8\xca\x4c\xa1\x19\x67\xc8\xfb\x9c\x4d\xbf\x70\x60\xc8\x35\xe8\x64\xd3\x19\x2e\x79\xe2\xd0\x89\xb6\xb9\x59\x7e\x6f\x2a\xb6\xe8\xc1\x84\x9c\xd9\x34\xcf\x45\x9f\x6a\x28\xba\x2b\x4f\xd8\xd0\x6f\x78\xc8\x3f\x7a\xe3\x1b\x2e\x19\x24\x84\xa2\x2f\xd2\xd8\x87\xe0\x27\xec\x91\x26\xff\xe0\xa6\x13\x9a\xe9\xb1\xff\x47\x2d\xeb\x22\xf0\x60\x13\xf6\x51\x83\x23\x41\xbc\x7a\x69\xe0\x2d\x7a\x21\xce\xdf\xd1\x0e\xba\x70\xad\xb0\x53\xc0\x59\xe0\x32\x30\x03\x00\xe8\x54\x02\xed\xa9\xdd\x04\x90\xd2\xa0\xa3\xe6\x51\xa4\xf1\x9b\xe1\xae\x40\x74\x9c\x3f\xd2\x1e\x69\x64\xc1\xc1\xd9\x99\xbb\x69\xca\xdf\x33\x76\x42\x5f\x77\x5f\xa4\x3d\x42\x75\x51\x93\xce\xec\xdb\xfc\x95\x33\xa9\x73\x0f\x15\x69\x5c\x74\x65\xb3\xf5\x7b\xa4\x63\xd1\xed\x77\xdf\xbe\xe8\x9c\xa5\x0b\x6e\x5f\xb0\xe8\x1f\xf7\xcd\xd0\x1f\xd2\xa9\x6f\x2c\xfe\x25\xca\xcf\x84\xa3\x7d\x97\xc1\x2f\xbf\x71\xef\xeb\xe8\x90\x19\x6d\xf3\xa1\xcf\xce\x7b\x2c\x37\x39\xb0\xf2\xe8\x7b\xd0\x9f\xde\x96\xdf\xed\xfc\x27\x2a\xdc\x05\xbf\xfc\xc7\xe3\xab\xcb\xa8\xb2\x19\xf6\xeb\x73\xaf\xe9\x99\xfb\x8d\x05\x4b\x55\x55\x85\xbd\xf3\x65\x59\x93\xd1\xc2\x94\xf2\xd8\x72\x11\x5d\x35\x0b\x3d\x87\xb6\xcf\x85\xd3\xda\x46\xcd\x78\xe5\xb1\xe5\xb7\xac\x5e\xbe\xed\xb1\x57\x56\x7f\x68\xfe\x08\xed\x64\xd9\xc4\xf2\xf8\xeb\x62\x72\x16\x7c\xf6\x75\x74\x48\x7c\x8c\x7f\x67\xf5\x6a\x78\x74\x03\x96\x52\x5d\x37\xce\xdc\x8a\x7f\x7f\xad\x05\xae\x18\xa7\x56\x5d\xda\xa2\x27\x60\x3a\xda\xf3\x3b\x82\x5e\x36\xb9\x65\xc8\xc6\xbf\xb5\xf0\x7c\xc2\x2e\xdd\xf4\xfd\x66\x9b\x7b\xd3\xec\xa6\xfe\x49\xf2\x7d\xf0\xe6\xd3\x9a\xcf\xba\x36\xeb\x61\xe2\x48\x36\x7e\xd2\x6c\xeb\xef\xf8\x8c\x58\xeb\x06\x02\x6f\x1b\xef\x44\x5e\x6e\xc6\xf3\xd5\x77\x10\xdf\x31\x9c\xcf\x12\x16\xde\x6e\xbe\xb4\xc5\xf6\x22\xf0\x7c\xeb\x65\xcd\x7a\x61\x0d\x37\x57\x35\xeb\x60\x35\x3e\xbe\xde\x19\xe7\xe2\xc0\x0b\xf4\x7d\xcc\x9c\x4d\xe0\xbb\xc3\x53\x46\xb9\x74\x24\x67\x5d\xd8\x8b\x1f\xdd\xde\x7c\x3f\x8c\x69\x79\xb5\xd8\xc2\xa7\x08\xdf\xde\xc1\x46\x8c\xdc\x71\x81\xed\xf4\xf3\x35\x1a\x9b\xd6\x3f\x0a\x2c\xab\x7e\x38\x31\x35\xe5\xe8\x56\x3a\xdf\x9b\x76\xd1\x9f\x10\x8a\x6e\x0a\xbb\xe6\x10\xeb\x3c\xc9\x8e\x63\xdb\x5b\xf7\xf9\xdd\x5b\xbd\x2e\xf0\x00\x7d\x03\x33\x67\xd5\x47\xc7\x76\x71\x60\x52\x99\x99\x7b\xe0\x8f\x70\x3f\x38\x8a\x03\x93\x66\x33\x53\xd7\xdc\xf1\xc5\x21\x6e\xf1\xa4\x5b\x08\x5d\xc1\x39\xef\x0d\x51\x67\x4e\x96\xbc\x27\xdd\xf8\x59\x8b\xff\xc3\x86\xdf\x3a\x97\xfc\x72\xda\x37\xfc\xbc\x19\x76\x2b\x65\x0f\x5f\x83\x1c\x8a\x6e\x78\xc9\x82\xe9\x86\xef\x82\xe6\x3b\xf7\x45\x35\x5c\x8b\xee\x3d\x7f\xd9\x91\x21\x7a\xcd\x0b\xee\xef\x65\xb6\x36\xc6\xc3\xf1\x73\xc9\xc0\xb7\xe9\x67\x41\xa0\x76\x8b\x71\x1a\xb8\x04\x4c\x07\x3c\xb8\x0e\xdf\x63\x30\xfe\x9e\xb1\xe3\xdd\x79\x07\xdc\x77\x94\x75\x9e\xd4\x11\x99\x30\xbe\x17\x67\x37\x0f\xf9\x03\x63\x7d\x74\x80\xc6\x99\x01\x3c\x55\xd6\x53\xd7\xa2\x67\x66\xc2\x33\xe1\xdc\x15\x97\xde\x77\xc5\x85\x27\x5d\x71\x69\xb4\xcb\xfc\xb9\x2a\xa4\x45\xc3\xf7\xdb\xbb\xaf\xdc\x34\xf5\xf6\x91\xe3\xa9\x30\x13\x36\x62\x61\x8a\x3b\x54\x09\xc1\x43\x81\xd5\x01\x6a\x92\x89\x16\xc2\x5f\x5e\x83\x26\xae\x8e\x2a\x7b\xd0\xef\xaf\x81\x5d\xda\xc2\x13\xd1\x09\x68\xa9\x47\x68\x5e\x0e\xfd\x00\x7d\xaf\xf0\xc8\xae\x4f\xe1\x75\xe6\x4d\xb7\x5e\x31\xea\x09\xe6\xa4\x09\xf0\x17\xc9\x82\xae\xea\x52\xff\xf7\xa6\xfe\xb0\x1f\x9e\x98\x48\xc4\x93\x82\x3a\xf2\xab\x19\x37\xdd\x34\x63\x09\x7a\xa5\x7f\xf9\x4e\x78\xdd\xc0\xbd\x2b\x6f\x56\xae\x5b\x72\xdb\xce\xb6\x03\xff\xeb\xce\xac\x46\xcf\x1b\xbe\xe7\x71\x2e\x52\x28\xba\x31\xd2\x42\x67\x04\x9e\x6c\xe2\x5d\x32\xa8\xf1\x1e\xf2\xae\x66\x1d\x6b\xf3\xcf\x40\xf3\x9d\x76\xba\x71\xaf\xbc\xff\xc7\xcd\xb6\x54\xe6\x60\x8b\x5c\x27\xde\xe7\x6e\xfe\x89\x4b\x4e\x37\xd6\x73\x7d\x33\x3f\xca\xfc\xd9\x83\x77\x2a\xa1\xa8\xfe\x0f\xcc\x71\x67\x03\xf7\x7d\x1c\xe6\x21\x99\x9d\x2d\x73\x13\xba\xc3\xd6\x19\xa0\xc9\x1f\x96\x59\xd0\xa2\x77\x13\x7a\xf1\xa6\x1e\x6f\xdf\xc6\xa6\xb2\xab\xbf\xf3\x8e\x6b\xe3\x23\xcd\x7c\x5e\xff\x3b\x8e\x47\xf9\x0d\xb1\x56\xa9\xca\x07\xf6\xd0\x0a\x33\xe7\x85\x7f\x80\x6f\x70\x67\x4c\xbc\x32\x44\x6b\x37\x36\xd3\x1a\x8e\x55\xa1\xd7\x1f\xeb\x6d\xbf\x6e\xde\x49\xf8\x87\x08\x3f\xd0\xa6\x4b\x40\x93\x1f\xcd\x5e\x97\xfa\x47\x6f\x7b\x57\x1b\x70\xf1\xa7\x06\xaf\xc8\x79\xeb\xb4\x1b\xf7\x7b\xfb\x9f\xf4\x46\x0d\xa4\xf1\x81\x27\x1c\x9e\x3d\x77\xfb\xa9\xd4\x29\x00\x9c\x79\x32\x07\xea\x1e\xda\x67\xfb\xa9\x4b\xaa\x7f\x39\x3d\xc8\xdd\xe2\x65\x9f\x18\x55\x17\x4e\x3a\xba\xda\xa6\x23\xbc\xd7\xbf\xe9\x45\xef\xf5\x6c\x9e\xd8\x7c\x0e\x1b\x37\xbb\x78\x8d\x50\x9d\x64\xe9\x9a\xb5\x7c\x5c\xc7\x80\x13\x1a\x39\xba\x9b\xb3\x72\xf9\x1c\xce\xd2\x65\x17\x1f\xf6\x60\x24\x81\x2b\x8c\x11\xc3\x30\x7c\xa9\x11\xfc\xf3\x3e\xc1\x34\xa4\xb6\xd8\x70\x51\xa7\x86\xcc\xa0\x99\x6e\xf5\x48\x51\x5b\x47\x74\x51\xf4\x89\x28\x9f\x46\x6c\xc6\x4f\xd9\xcc\x40\x46\x29\xc5\xa0\xc0\x61\x9e\xb6\x00\xf2\x7d\x82\xfa\x07\x57\xbc\xa3\xcb\x87\x1d\x8a\xae\xb4\x38\xf3\x34\xed\x18\xf8\x68\xf5\xf4\x73\x2f\xe6\x3c\xfd\x39\x5a\xff\x61\x6c\xad\xb5\x2d\x74\xfd\x5a\x83\x56\x00\x5d\xd7\x4f\x41\x07\x38\x0e\x67\x87\xbf\x10\xd7\x92\xb5\xeb\x32\xbb\xaa\xc7\xfb\x1b\x10\xc5\xed\x21\x18\x18\xeb\x6b\xef\x6e\xb7\xdf\x39\xb5\x42\x93\x12\xa0\x60\xc0\x84\x8e\xef\x90\x51\xde\x40\x69\x3f\xab\x8f\xc4\xf4\x38\x1c\xd2\x29\x16\x85\x33\x30\x25\xa3\x72\x56\xcf\xa0\x4a\x0a\x26\x0d\xc4\x21\xc5\x83\xf5\xfe\xf0\xe0\xc1\x83\x07\x9f\x5d\xb7\x6e\xd5\xaa\x8f\xd0\x92\x91\x11\xb8\x10\xcd\xf9\xef\x7f\x9f\x41\xbf\x41\xd5\x27\xff\x09\x59\x33\x47\xc5\xd1\x77\x5e\x5a\xf0\x2f\x38\xb5\xed\xc2\xff\xcd\x63\xb1\xac\xda\xf4\x2b\x6c\x43\xbd\x06\xc8\x7b\x2c\xd7\xdb\xd1\x4d\x37\x3b\x72\x6c\x5c\x20\x47\x2f\x00\x47\x81\xee\x5a\xee\xf4\x09\xe0\x02\xec\xf3\xac\xdd\xc7\xdb\xa5\x75\xfb\x6a\x59\xa5\xc7\x74\x05\xc6\xf6\x60\x19\x65\x17\x2e\xf0\xe3\x2a\x93\x63\x3a\xea\x4f\xa9\x9a\xd4\xeb\xda\x33\xaa\x45\xda\x90\x56\xd1\x47\x52\x6f\x2f\x67\x18\x6a\xe2\x2d\xdb\x7e\xfd\x45\x12\xfd\x04\x7d\x80\x7e\x30\x19\xd2\xdf\xba\x65\x46\x7c\xb2\xf8\x06\xbc\x7d\x9d\x80\x4e\x67\x82\x73\x2f\xd6\x75\xf3\x4f\x6d\xb9\x61\x0e\x86\x2c\xb5\xda\x3c\xc5\x23\x92\x63\x2c\x1a\x82\x02\x4a\x43\x80\xe4\x2f\xf7\xb0\x3d\x8f\x0c\xcc\x99\x76\xd6\xca\xbe\x07\xe6\xcd\x58\x3c\x69\x46\xdf\x95\x67\x9d\x35\x67\xe0\xbd\x59\x73\x18\xe6\xab\x68\xab\x39\x0d\x3e\xa1\xc3\x05\xaa\xff\xee\xff\x19\x77\x53\xe3\x63\xfa\xa7\x84\x1e\xf8\xa2\x9b\x8f\x1f\xe8\x25\x3e\x5b\xd3\xaa\xa3\x86\xe8\x0d\x3f\x20\xe8\x18\xfb\x43\x36\x3c\xed\x61\x57\x35\xfc\x1e\xba\x8b\xee\x85\x50\x74\x70\x82\x35\x4e\xd3\xfd\x9b\xe3\xef\xc9\xbc\xe7\xb2\x6f\x1d\x7e\xb3\x81\x7c\x67\x44\xc4\xde\xae\x9d\xdf\xac\x4b\xe3\xdb\xa0\x68\xff\x0f\x9b\x74\x1f\xec\xc3\xdb\x70\x6b\xcb\x5a\xb3\xd6\x9a\xb6\x8f\x6b\xd2\x01\x6b\x6f\x78\x37\x1c\xe1\x1d\xbb\x5c\xe3\x8d\xaf\x36\xfb\x13\x6a\xbe\x18\xb7\xcf\xca\xd9\xc3\x1a\x7f\xcd\x0f\x28\x55\xcf\xb7\xf4\x40\x9c\x07\x75\x32\xb8\x18\x7c\x05\xcc\xc0\xf5\x60\x22\x9d\x91\x40\xed\x49\x62\xa8\x23\x40\xf9\xe8\xc0\x98\xce\x86\x76\x75\x21\xb4\x70\xb2\xe3\x5c\xbb\x98\x46\xad\x44\x0c\xce\x84\x61\x51\x73\x7b\x77\xbb\xcf\x1b\x31\xb7\xf8\x14\x94\xe0\xf9\x44\x56\x17\x05\x31\x51\x90\x0b\x89\x58\x2c\x21\x4b\x71\x81\x15\xf8\x58\xac\x82\x0a\x3c\x94\xca\x6c\xa6\x2c\x54\x72\x9c\x9a\x4d\x95\x33\x55\x70\xb3\x85\x95\xbe\xd5\xfa\x88\xae\x7f\xa9\xed\xbb\xc3\x97\xa2\x89\xad\x08\xda\x76\xaf\x96\x12\x24\x5e\x15\x05\x0e\xe5\x51\x5e\x82\x1c\x4c\x85\x99\x6c\x39\x9d\x66\xf4\x70\x2a\xa5\x0c\xc9\x9a\x06\x41\x50\xca\x88\x5a\x2a\x9b\x92\x79\x39\x95\x81\x77\xaa\x70\x31\x52\x2a\x55\x00\x35\x74\xba\x4e\x3d\xf5\x3f\xf0\x55\xaa\xfb\x1e\xf6\x5a\xb6\x49\x74\x0b\xd6\x22\xb6\xec\xf2\xd2\x8f\x8c\x6f\x79\xcb\x46\xe3\x5e\x2f\x1f\x21\x43\x6f\xfc\xea\x61\x74\x85\x33\x9a\xcf\xb3\x86\xc3\xab\x89\xfe\xa9\x06\x7f\xd9\xf7\x52\x0b\x2d\x5c\xd1\x82\x5f\x8a\x85\x5f\x1b\x4b\x2d\xed\xb2\xd5\xbe\x76\x5e\x8b\x7d\x43\xca\xf6\x9b\x9b\x7d\x71\x3b\x1f\xc4\x7a\xfd\x51\x2d\xb6\x92\x14\x8a\x6e\xe8\xf3\xf6\x6f\x6c\x19\x8d\xe1\xc7\xb8\xf8\x64\xcd\xdf\x53\xf3\x63\xac\xf4\xf6\x29\x0d\x8e\x77\xd1\x96\x25\xc3\xb6\x11\xfc\x61\x55\xed\xb3\xb8\xcb\x3f\xf5\x8d\x9a\x2c\xb2\xda\x0d\x5a\x01\x67\x82\x73\x6b\x7e\xee\x9b\xeb\xb2\xa8\x13\x57\x77\x18\xd3\x1e\xe9\x8c\x8c\xe9\x08\xf5\x75\x51\xbe\x31\x7d\xe7\x4c\x18\x8f\x43\xe8\x6c\xb4\xa6\x7c\x76\x91\x99\x9a\x21\x51\xfb\xd2\x98\xae\x40\xbc\xa7\xbd\xbb\xdd\xea\xe2\x29\xa5\x92\x90\x33\x60\x02\xe5\xa1\x12\xd4\x82\x50\x40\x19\xdf\x19\x02\xab\x25\x8c\x93\x4e\x61\xc2\x1a\x93\x4a\x0a\xfc\xe9\xcf\x88\xe9\xe4\xf4\x31\x23\x02\x54\x50\xae\x2d\xc3\xc5\xb5\x58\x62\xb8\x04\xe3\x3a\x0c\xa3\x72\x56\x12\x73\xba\x68\x48\x15\x11\x55\x50\x46\x57\x04\x4d\x0b\x6b\xb2\x28\xab\x10\xc8\xbc\xa1\xa5\xfd\xb9\x6c\x56\x4d\xc3\x4a\x0e\x15\xb4\xbc\xc5\x99\x4b\x2c\x4a\xa1\x42\x29\x28\x49\x6c\x45\x2d\xa7\x54\x31\x63\xc0\x04\x2c\x68\xe9\x7f\x4b\x0a\xa7\x4a\xe6\xb9\x85\x82\xce\x3f\x73\x9b\x96\x35\x2b\x54\xbc\x90\x51\x4b\x90\xf1\xe5\x9b\x75\x08\xc5\xd2\x21\x1a\x38\x6f\xbf\x3d\x7b\x1b\xf3\x9d\x2f\x18\x12\xfe\x0e\xfe\xee\x7f\xd6\xdb\x37\x78\x10\xdb\xe9\xc0\x0f\x52\xd5\xe9\x01\x83\x7e\x18\xbf\x79\xb2\xec\xb6\x1b\xed\x17\xcf\x13\xfa\x2c\xb5\x29\x80\x41\xec\x11\x71\x66\x6b\x55\xbd\x13\x6c\x31\x18\x19\xed\x3c\x04\x6c\xca\x97\xdc\x6d\xa7\x03\xac\x3f\x07\x1c\x1f\xa1\x25\x85\x8b\x25\x92\xac\x98\x08\xcb\x41\x59\x65\xb9\x43\xa5\x56\x76\x01\x9f\x86\x47\xf4\x5e\xb0\xf4\xab\x97\x28\x97\xf6\x7e\xef\x82\x0b\x60\x3b\xfa\xea\x11\x70\x29\x9a\x13\x6c\x87\x1f\xa0\x0f\x8e\xb9\xe4\x8a\x73\x83\x1b\x4f\x9e\xb3\x69\xe3\x9c\x73\x1f\x44\x97\x28\xf0\xb9\xf9\x68\x0d\x5c\x7a\x6c\x3b\x52\xe0\x73\x47\xa0\x73\x28\x9e\xcd\x26\x19\x56\x60\x65\x8d\xe5\x62\x8c\x28\xb6\x95\xbc\x79\x47\xdb\xcc\xf9\xc2\xb4\xc7\x96\x3f\xb6\xa4\x6f\x7e\x6a\xb1\x78\xcb\x92\xf9\xb3\x96\x9b\x66\x8c\x99\xbc\x7c\xf2\x3b\x42\x72\x2e\xd5\x8d\x2e\x41\x3f\x7c\x0c\x9e\x00\x6f\x5e\x3e\x6b\xfe\x92\x5b\xc4\x06\x1c\x97\xd2\x22\x33\xe7\xe0\x7b\xc3\xe0\xe2\x0a\x07\x98\xa9\x5b\x95\x1f\x80\x29\x53\xb8\x26\x5a\xd2\x3f\x21\xf0\x7f\xa5\xa3\xef\x63\x3f\xbf\xd1\xea\x53\x55\x08\xff\xfc\xab\x2d\xbc\xa2\xd3\xc3\xef\x27\x85\xa2\xc6\xa2\xc3\xfb\x23\x18\xfa\x40\xc4\x5b\x16\x6d\x08\x3b\x7a\xb4\x9d\x5b\x2e\x04\xa2\xe0\x34\xf0\x15\x27\xc3\xf6\xad\xb8\x16\x9b\x57\x11\xb1\xae\x78\x17\x51\xa3\xa9\x56\x45\x0c\x76\xd1\xfe\xce\x48\xbb\x85\x05\x94\x23\x81\x3a\x22\x54\xa0\x67\xc2\x31\x70\xac\xef\xb0\xd1\xac\x01\xc0\x09\x72\x4a\x28\x04\x53\x62\x2a\xc5\x71\x94\xc1\x66\x6f\xbc\x21\xde\xcb\x2f\xdb\x98\x4e\xf3\x79\x45\xe7\xe2\xb9\x84\x74\xd7\x38\x73\xf3\x94\x3f\xa0\xff\xc2\xef\xa2\xc9\x01\xf8\x2e\x7d\x87\x74\xc6\x4d\xc7\x49\x63\xcf\x8c\xd1\x28\x7b\xf4\xcc\x85\xb7\xc2\x1b\x7f\x0a\xcf\x42\x3f\xb3\x7e\xd0\x25\x9a\x24\x4b\x5a\x42\x57\x24\x45\x83\x41\x45\x48\xab\x69\x3a\xd1\x28\x36\x56\x16\x64\xa1\x0c\xb9\x91\x12\x92\x2a\x37\x5f\x1c\x0b\xcb\xbc\xfa\xc4\x4c\x3d\x29\x97\x20\x53\xd4\x07\x7e\xd1\x06\x54\x8e\x15\xcc\x64\x92\x43\xc9\x12\x6b\xb0\x22\x0c\xa2\xfc\x90\x38\xe4\xd3\x60\x89\x35\x87\x54\x24\xe8\x54\x5a\xc2\x0e\x48\x39\xa5\x28\x9a\x88\x78\x01\x69\x28\x2d\xc2\xa4\xc3\x0f\x1d\x7f\x97\x41\xde\x1f\x90\x77\x3b\x2f\x34\xfb\xb3\x6d\x5d\x69\xf5\xbb\x84\xbf\x90\x88\x3d\xd1\x9e\x77\x8d\xd3\x88\x25\xca\x35\xdb\xc2\xb5\xb3\x3d\xcb\x25\x1f\x1a\xf6\xc0\x0a\x6f\x7f\xc1\xfe\x67\xbc\xfd\xf7\x1b\x9e\x70\xc9\x25\x39\x14\x5d\x87\xf1\x79\xdd\xc7\x4d\xb2\x81\x58\xab\xfe\x71\xb3\x7e\xa5\x97\x09\x1a\x78\x8e\x90\x67\x6a\x28\x3a\xb8\xba\x85\x06\x08\x5f\xf6\xda\x1b\x5c\xba\xa0\xe3\x2f\xdc\x70\x93\x6b\x7f\x6a\x28\xba\xf6\xeb\x2d\x3e\x03\xc2\x96\xdc\xb0\xc0\xa5\x0b\x36\xf4\xae\x57\xbc\xfd\x66\xc6\x42\x6f\xdd\x71\xc3\xd9\xde\x72\x6f\xc3\xb1\x2e\x39\xad\x84\xa2\xfd\xdf\x6f\xa1\x55\xac\x2f\xef\x79\x00\xdf\x83\x3f\x48\x40\x44\x6b\x96\xbf\xb5\xb3\x5a\x4e\xd0\x33\xf1\x86\x2b\x83\x2b\x91\x64\x3a\xdd\x34\x6d\x1c\x68\xd9\x3f\x01\xc7\xd5\x64\x0c\x19\x11\x9f\xb8\x71\x6a\xb3\x4e\xbd\xe1\xa1\x16\x3f\x34\xe6\x3d\xc6\xfb\xa0\xf5\xae\xcf\xd1\x53\x8d\x7a\xae\x67\xa7\xa6\xfb\xe0\x46\xbc\x87\x65\xa0\xe9\x8e\xc4\xee\xbf\xea\x56\x57\xbb\x12\x8a\xee\xf8\x7e\xe3\xee\x64\xc7\xab\x9e\xb8\x8b\x65\x18\x8e\xaf\xe7\x03\xcf\xe2\xb7\x0f\xd1\x9a\x6d\x96\x00\x93\xc0\x25\x44\x75\x44\xcc\x97\xba\x02\xbd\x75\xa3\xdf\xf5\x5f\x37\x1c\x1f\xe9\x74\x7e\x5a\xd9\x91\x32\x3c\xd4\xc6\x0c\xf3\xf0\xe4\xe8\x19\x97\xbf\x75\xa3\x76\xf9\x2f\x4f\x3c\x53\x1b\x7f\x22\x9c\x89\xfa\xeb\x1c\x06\xde\x35\xf2\xb9\x0a\x0d\x54\xb6\x54\x00\xeb\x67\x64\x9d\x87\x35\x96\xb0\x8b\x20\x9a\xa7\x9e\xd5\xf3\xe8\x9f\x46\xce\x5a\x37\x6d\xf2\x59\xd7\xdd\xb2\x78\xcb\xa3\xeb\x1e\x1d\x58\x7c\x9d\xaf\x63\xcb\x16\xf4\xa7\x75\xeb\xd0\x47\x03\x03\xfe\x33\xfe\xb7\xed\x8a\xf1\x66\x55\xdf\xe1\xfd\xed\x21\x7a\xdd\x34\xc2\x97\x44\xbc\x6f\xd4\xff\xe2\xed\x2f\x36\xd6\x34\x9f\x6f\xcd\x27\x75\x05\x68\xd2\x1f\x0e\x5c\x44\x60\xea\x33\x04\xcf\x72\xce\x65\xd5\x06\x40\xde\x59\x34\x72\x72\xac\x24\x70\x8b\xb0\xb1\xb5\xa7\x6b\x36\x8d\x58\xbd\x34\xf0\x24\x2d\xe1\xd7\x2b\x67\xe1\x58\xf7\xc9\xb8\x66\x4d\x77\x27\xe3\xeb\x09\x1d\x03\x6b\xd5\xc5\xc7\x10\x61\x0c\xdd\x76\x32\xb1\x1e\x5f\xdd\x86\xc1\x1e\x89\x76\x2f\xb7\xf0\x89\x37\xbd\xa4\xed\x6f\x4b\x8c\xa4\x7c\x06\xba\xfa\x9c\x4b\x2e\x3e\x76\xc9\x11\x37\xdf\xfc\xd8\xe5\xe8\x3e\xfd\xda\xdb\x2f\x3f\xe6\x81\xed\x97\x07\xa9\x7f\x98\xed\xbe\xd1\xba\x59\xd4\x75\x2a\x66\x16\x47\xfe\x5c\xc8\x48\xd9\x3c\x93\x4b\x4b\xe9\x1c\x14\x55\xa5\xa2\x57\x7c\x6f\xe7\xcc\xdf\xa2\xd9\x3c\xdc\x0b\xff\x4e\x7d\xa1\xa2\xed\x8f\x09\x5c\x22\x91\x64\xa4\x78\x8f\x2a\xc3\x59\xa8\xc8\xc6\x1e\x4b\xc4\x13\xd4\x17\xb2\xd9\x6e\xca\x3c\x4f\xa9\x48\x80\x61\x7f\xaf\xa8\xaa\xba\x84\xb4\x94\xa2\x6a\x22\x12\x45\xdb\xeb\x23\x38\x70\x55\x43\xd1\x34\xe6\x03\xe9\x07\x41\xf3\x7b\x67\x4b\xce\x5f\x0d\x9a\xe3\x93\x71\xfb\x8e\x3f\xe3\xd8\xc5\x3f\x80\x46\xcc\xaf\xd4\x78\x13\x18\x06\xa1\xe8\xc1\x05\x65\xc0\x4c\x4d\x5f\xb7\xa1\x78\xf1\xb7\xa6\x7c\xe1\xf0\x6d\xe7\xdc\x57\xad\x68\xd1\xf5\xf1\x7b\xb5\x6d\xf7\xb5\xf8\xfd\xeb\xb2\x6a\xee\xde\xfd\x70\x2b\x38\xe2\x02\x9d\x9b\x1e\xa2\x77\xcc\x70\xf1\x3f\x87\x9f\xd9\x37\xf5\x98\xab\xd1\x7b\xbc\xdf\x3b\xd1\xab\x96\x7a\xfb\xa8\xfa\x5f\x26\xf6\x89\xe5\xc8\x9e\xe5\x78\xb4\x65\x2d\x36\x8b\x25\x4b\xfe\x0c\x9a\x63\x10\x89\x77\xbe\x6b\x6e\x69\xe6\x2b\x35\xde\xf1\x14\x31\x07\x11\xfb\x3a\x80\x5c\x7e\x6c\x87\x9e\xf6\x49\x85\x46\xbb\xd4\x88\x8f\x1a\x30\xbd\xf9\x99\xde\x72\x17\x6b\xdb\x3d\xdb\xfe\xdd\xb4\x07\x22\xde\x61\xed\xdd\x2e\xbf\xad\x12\x8a\xee\xde\x81\xdf\xc7\xec\x74\x7d\x27\x61\xcb\xe3\xdd\xdb\x09\xdf\xe7\x51\x38\x27\xd6\x3b\xf4\x5d\x60\x0c\x38\x1e\x9c\x0c\x62\xe0\xfc\x5a\x3e\x8e\xab\xc1\xcd\x60\x76\xad\x56\x43\x37\x45\x56\xd2\xec\x09\xf4\x4c\xe8\xb2\x68\xa9\x46\x2c\xb6\xa5\x34\xae\xb7\xa6\xaa\xd7\xcb\x9a\x8d\xf7\xe1\x68\x3c\x9f\xc7\xf3\x12\x3a\x60\x5b\x52\x60\x5c\x6f\x7b\xb7\x9f\x7f\xf8\x04\xf8\xd7\xb9\xbd\xcf\x67\x32\x57\x7d\x7f\xe3\x86\xd7\x2f\x7a\xfd\xe9\xb9\x5f\x39\x7d\xde\xf3\xfc\x55\x73\xe7\x8e\x45\xbf\x43\x3f\x51\xee\xba\xed\xce\x85\xd4\xfe\x65\x4b\x94\x3b\x07\x46\x36\x2d\x9b\xf1\x9d\x7f\xdd\x7a\xf4\xa8\xc0\xb2\xa3\x97\xa0\x65\x68\x68\xd9\x1b\xca\x5d\x0b\xef\x5d\x52\x68\xd5\xd4\xa8\x99\x7a\x42\xd0\x92\x02\x0f\x83\x30\xa8\xeb\xf4\x9d\x3d\xf7\x3f\x8b\xca\x7f\x38\x70\xe5\x33\x5f\xdf\xf5\xbd\x99\xf7\xcf\x3c\xf0\xc8\xda\x49\x5f\xfd\x64\xce\x77\x9f\xf9\xe1\x9b\x23\x8f\x5d\xb3\xe0\x99\x27\x6f\xbc\x6c\xeb\xaf\xef\x7e\xe5\xf5\x1b\xd1\x96\xc8\xc9\x27\x47\x98\x87\xcf\xff\xfe\x82\xcb\x6e\x84\x0f\x5f\x8d\xfe\xfc\xcc\x7d\x5b\xfd\x3f\xf0\xd6\xd4\xfc\x0f\xc5\x0d\x63\x24\x47\x71\xa2\xa0\x41\x4e\x36\x83\x0d\x1e\xe9\xe8\x18\xfb\x6e\x73\xf1\xce\x86\x5c\x5e\xea\xd2\xcb\x75\x27\x76\xe1\xd7\x2e\x1c\xd0\x1d\x5d\x4f\x75\xe9\x6e\x72\x28\xda\xff\xbd\x16\xdf\x11\xc6\x19\xfc\xee\x96\xee\xff\x2e\x81\xdb\x78\x3d\xfd\xdf\x01\xcd\xf1\x82\xe4\x1b\x28\xbf\x8b\xde\x1c\x9c\xd4\x96\x38\xbe\xcc\x78\x60\x3b\x2d\xd7\xb2\x3e\x1d\x03\x4e\xa9\x71\xda\xcb\x70\x1c\x19\xce\x21\x3d\xbe\xb7\x1d\x27\x6f\x19\xdf\xdb\xde\xdd\xd3\x65\x47\x87\xb9\xab\xb7\xfa\x9a\xfe\xed\xe1\x35\x8a\xeb\x30\xa6\x43\x56\x1f\xae\x4c\x69\xdb\x37\x3c\x43\xd3\xa0\x11\x2c\xca\xd9\xf7\xe0\x03\x03\x70\x3e\x7a\x0e\xbe\x35\xfc\x5b\xf8\x32\x7a\x8a\x86\xf7\xaf\x85\xf3\xd0\x0a\xf8\x93\xe1\x0f\xe1\x77\xd1\xd3\xe6\x4d\x1e\xc2\x93\x29\x43\x1e\x65\xca\x48\xbd\x5a\x5f\x6d\xea\x3f\x64\xcd\xf4\x90\x52\x5c\xb5\x63\xc7\xd3\x3b\x9f\x7e\x7a\x27\xf5\xd2\x96\x2d\x4b\x36\x2f\x59\xb2\xd9\xb7\xf1\x70\xee\xa0\xc6\xb9\x39\xf0\xe8\x27\xdf\x96\x11\x71\xeb\xda\xe2\xe6\x7b\x06\xfd\x8f\x16\x1d\xea\x7f\x6a\xe2\xcd\x84\xbe\xf7\xe2\x5f\xbc\xf9\xc0\x3a\xe8\xe2\x33\x72\x28\xfa\xe2\x5e\xd7\x59\xc7\xab\xe7\x07\x7e\x42\x3f\xce\xcc\xd1\x9e\x2b\x0f\x27\xee\xe4\xce\x62\xe6\xac\xfa\xa8\x34\x7c\xfe\x52\xee\x4c\x66\x9a\xfa\x47\xf0\x72\xf5\x5f\x13\xcf\xe1\x9e\x6d\xf5\xed\x84\x68\x43\x03\x9e\xf7\x61\xfd\x59\x97\x6f\x52\xa9\xaf\xbf\x86\x7d\xdf\x24\x70\xb5\x61\x7f\x3c\x49\xe8\x96\x98\x47\xaf\xfc\xad\x2b\x56\xd1\x91\x0f\x7b\xfe\xd2\xa2\xc7\xe2\x18\x49\xfd\x0f\xc4\x1c\x4f\x10\x36\x82\x1a\x8a\xee\x6f\xf5\xef\x62\x1f\x58\xff\xb7\xbd\xfd\x4d\xfd\xdf\x72\xb5\x27\xab\x13\x02\xaf\xd0\x0f\x58\x6b\xad\x7c\xc1\xcc\x5d\x73\x26\x7c\xb4\xfa\xd7\x84\xca\xdd\x14\xa2\x07\xb7\x9d\xf4\x85\x43\x33\xce\xbb\xd8\x10\xbd\xfe\x75\x17\x0d\x34\x74\xc6\x45\xde\xb6\x6f\xff\xc1\xc3\xd0\xd2\x97\x1c\xda\xbb\x22\xb0\x84\x7e\xa4\xfe\xa6\x5a\x5b\xf6\xb8\xff\xa2\xd7\x39\x92\x5f\x37\x62\x30\x1e\x27\xc6\x12\x1b\xf1\x14\x07\xaf\x75\xc6\xaa\xe5\xb3\xa9\xe9\x3f\x0a\xa1\x17\x11\x79\x0a\xfb\xc9\xf8\xfc\x4c\xa3\xdd\xb8\xcd\x05\x2f\x35\x14\x3d\x30\xb3\xc5\x66\xca\x12\x36\xcd\xa0\x8b\x0f\x09\xf5\x77\x4a\xbb\x06\x9b\xe4\x0a\xb9\x87\xc7\x5c\xe7\xdb\x68\x7f\xd4\x39\x13\x77\x0d\xb3\x7f\x82\x46\x0d\x33\xc7\xf7\xa9\xff\x9e\xc0\x89\x47\xdc\x32\xcf\xb6\x6f\x57\x7d\x50\xf6\xf4\x97\xae\x7c\xa6\xd9\x6f\xb9\xe5\x3f\xd8\xce\x3c\xbe\x45\x3f\x12\x43\xd1\xc1\x15\xa0\x35\x6e\xb7\x91\xd3\x63\x53\xb3\x5c\xdd\xf0\x1d\xd0\x1c\x8f\xaf\x11\x7c\x61\xbf\xb7\x4d\xdc\xbf\xcf\x75\xae\x0e\xee\xe8\xeb\x5d\xba\xb6\x1c\x8a\x6e\xc6\xfa\xca\xbe\x9f\xb7\xe8\x2b\x16\x9d\x94\x30\x2f\xf9\xb0\x65\x1f\xce\xfc\xeb\x8f\x22\xc6\xdb\xd5\xd0\xbb\x32\xcf\xc2\x24\x38\xbd\xef\xe4\x0b\x32\xcc\xb4\x2d\xbf\x85\x0f\x55\xff\x3e\xfe\xc0\xe4\xcb\x48\xdd\xdc\xe5\x5b\x7d\xd8\x2d\xab\xf6\x35\xbf\x35\xa8\xf9\x90\xd6\x73\x0d\x3b\x6b\xfd\x24\xb7\xce\xb2\xe7\x36\x62\xbc\x87\x08\xfb\xa0\x91\x77\xfd\x1b\xcd\xf6\xc1\xfa\x23\x3d\x70\xd1\xb1\x0b\xd7\xb7\x79\xfb\xa9\x57\xcf\x6d\xc6\xd1\x9a\xff\x83\xf3\xe6\xab\xc6\x5e\x42\x56\xe2\x7d\xec\x29\xe0\x33\xca\x10\xfd\x89\xb7\x4e\x5a\xdd\x7e\xe7\x9c\x3c\x3a\x8f\xe0\x76\x9c\xcb\x04\x1c\x59\xf7\x0f\x80\xa3\x88\x2c\x88\x0d\x0b\x84\x90\x8a\xbe\x9a\x15\x32\xde\xb2\x32\x2c\xbd\x87\x88\x57\xb1\xa5\x9f\x5d\x33\xce\x43\x1e\x02\x1d\x26\x74\x98\xd4\x87\xb3\xa7\xb7\x2d\x44\x3f\x86\x77\x0e\x9f\x0a\xef\x43\xdf\x86\xc5\x37\xdf\xa4\xae\x58\x72\xfb\xbc\xaf\x7f\x7d\xa4\x78\xf9\x31\xfa\x31\x97\x7f\x5b\xe3\x15\x5e\xf3\x71\xaa\xac\x48\xda\xf0\x97\x3c\xde\xe8\xa2\x22\x4c\xa0\x7c\x11\xe9\xa8\x77\xbd\xf9\xea\xaa\x55\xd4\x64\xf3\x55\x6a\xf2\x8d\xd7\xe6\x1f\xb9\x6d\xd9\xaa\x6d\xeb\x4e\xdd\xbb\x9e\xfa\x96\xac\xf1\xaa\xc2\xf3\x69\x51\x94\xa8\x81\xc3\x5d\x3b\xbb\x68\xac\x76\xd2\x0f\x12\xf8\xf7\x02\xfd\x38\x13\xdd\xbc\xfc\x3c\x50\xfb\x74\xea\xc1\x05\x7b\xfc\x53\xd0\xe4\x9f\x93\xf6\x49\x8d\x3e\xf6\x12\xdf\x23\xee\xf9\xb5\x07\x08\xbe\x47\xde\x51\xdf\x5f\xb3\xdf\x6b\x74\xec\xbc\x8b\xbf\x0c\xcc\x00\xd7\xe0\xa8\x76\xec\x3e\xae\x5f\x67\x75\x05\xa2\x3e\xd7\x6d\xd6\xf8\x73\x7b\xda\xfc\x3d\x63\x61\x94\xb8\x69\x1d\xeb\x15\x12\x04\x23\xed\x91\xbe\x5a\xea\x2d\xeb\x3f\xaa\xd0\xc6\x9b\xc5\x58\x4c\x4c\x16\x33\xa2\xa4\x88\x45\xa9\x20\x0b\x09\x59\x49\x88\xac\x28\x24\xe2\x41\x54\x41\x5a\x12\xea\x30\x1c\x0e\x97\x50\x41\x80\x89\x4a\x2c\x91\xcb\x8a\x30\x9c\x47\x1a\xe2\x5b\x8f\x03\x6a\x6d\x2b\x86\xe7\x0d\xec\xd9\x03\xaf\xdd\xbb\x75\x6f\x9b\xa2\xc5\x63\xa2\x9a\xd2\xc5\x54\x12\x29\x39\xad\x04\xd3\x6c\xb6\x58\xbb\xd3\x4a\x72\x43\x8a\xaa\x42\x46\x0a\x67\x25\x45\xcc\x72\x71\x8d\x93\x53\x19\x4a\x3e\xcc\x13\xea\x84\xb9\xeb\x39\xd8\x8b\xde\xb6\x7f\xc0\x11\x80\xab\x76\x07\x5e\xa7\xfb\x41\x27\x88\x80\x71\xe0\x14\x07\x4b\x2f\xc3\xfe\x79\x7f\xa7\xdb\xcf\xde\xdb\x39\x76\x9c\xad\xa5\x8d\xeb\x6a\x0b\xf4\xe0\xba\x87\x87\xf5\xbb\xc2\x1a\x86\xb7\xf7\x76\x46\xe8\xe1\xdb\x7f\x87\xde\x98\xfc\xc2\xf7\xae\x0b\x3f\xd2\xf3\xcd\xe1\x4f\x1f\x59\x09\x8f\x1c\xfe\xcb\xb3\x70\x1b\xba\x1e\x2e\x89\xa1\xcf\x3f\x99\x76\x67\xdb\x55\xc3\x7b\xd7\xf9\xc6\x8c\x7c\x62\xfd\x98\xdf\x6d\xd5\xd9\x7c\x57\x3f\x01\x5f\x79\xf2\xd0\x7f\x1e\x81\xaf\xc3\x7d\x8f\x3c\x3a\xe9\xaa\xb1\xc7\x4d\xb8\x61\xb2\x7e\xc3\x0d\x77\xc1\xdc\xe0\xa4\xfb\x1f\x5d\xfe\xf1\xa3\xfa\x0d\x93\x6f\xf5\x5f\x64\x5e\x00\xb7\xaf\x44\xc9\xcd\xbe\xf3\xbd\xb5\x37\xff\x13\xe8\x8b\x3c\xda\x04\x6f\xce\x7b\xc8\x8a\x50\x54\x5b\x83\x6f\x7d\x3f\x6e\xe2\xfd\x0b\x30\x9f\xfd\xa0\x89\xcf\x3e\x44\x2f\x65\xe6\xa6\x5f\x47\x9f\x80\xa3\x93\xef\x4c\x7e\x88\x99\x9b\x7e\xb3\x7a\x7a\x75\x64\xaa\x8f\x5b\x11\x6a\xbc\xdd\xae\xe9\x21\xd8\x0a\xae\x53\xc5\x82\x26\x3d\x68\x3b\xf6\xbd\x9d\xd6\x24\x43\x89\xbc\x57\xeb\x07\x9b\xf5\xc8\xf5\xfb\x3d\x74\xa7\x86\x7c\xd9\xe3\x6d\xab\xae\xab\x36\xcb\xaf\xfe\xdd\x2d\xe3\xd8\x39\x0d\xb0\x5f\x75\xdb\x5f\xf0\xef\xe6\x37\x67\x2e\xdb\x7b\xb0\xcd\xa1\xbd\xd3\x02\x3f\xa6\x05\xd0\x01\x7a\x6a\x79\xed\x92\xe0\x4a\x5c\x33\xc9\xc2\x9a\xde\xce\x6e\xac\xdf\xf7\x8e\xef\xb6\x7e\xc6\x45\x3a\xbb\x71\x5b\x6f\xa3\x0d\xb6\x8f\x1e\x13\x61\xed\x32\xc2\xb8\xbe\x73\xa4\xdd\x22\x37\xe8\xe9\x84\xa1\x6e\xa7\x14\x34\x54\x2c\xc2\xa0\x29\x57\x8a\xc5\x32\x95\xa7\x52\x95\x52\x69\xc8\x54\xcb\xa5\x52\x11\x9d\x71\x2d\xbc\x08\xbe\x3a\x3f\xb8\xe1\xd4\x99\x97\x9b\xff\x42\xfc\x92\xb6\xf9\xe6\xc3\xe8\x5b\x70\x3a\xfc\x23\x7a\x1d\x9e\x7f\x68\xa1\x87\x23\xff\x34\x55\xd7\x74\x4d\xd3\x35\x5d\x55\x75\xcd\xd0\x34\x43\xd3\x87\x05\x34\x34\xb6\x73\xc6\xb2\x73\xde\x98\x72\xce\x94\xbb\x7c\x67\x98\xff\x81\x4b\xd1\x10\x0c\xa2\xa1\xb6\xf7\xbc\xed\x3f\xb7\x4e\xbf\xb2\xa3\xc5\x77\x4a\xe8\x8a\xeb\x4c\x97\xaf\x4c\x0e\x45\x37\x2c\x07\xee\xb8\x54\xf7\x3b\x93\xef\xbb\x74\x19\x47\xe7\x5e\xe9\xae\xc5\xe2\xe8\x77\xeb\x46\x5c\xbe\x0c\xcd\xe1\x97\xf7\x35\xfb\x8e\xd7\xde\x64\x9d\xf4\xda\x9b\x5b\x7c\x0a\x52\x28\xda\xbf\xab\xc5\x2f\x42\xd4\x0f\x39\x70\x96\x4b\xde\xaa\x4d\xba\xc3\xbd\x6e\x9d\xb0\x86\x9f\x2d\xef\x52\xb6\x92\xb1\x1e\xf7\x10\xb8\x68\x7d\x76\x0e\xf1\x99\xe4\xac\x81\x88\xd3\x58\xf7\x85\xb7\x6f\x7a\xf0\x0e\x97\x6f\xda\x91\xf9\x07\x62\x35\x5f\x87\x50\x8d\x07\x7e\x4c\xdf\xe7\x54\x86\xb5\xdf\x1f\x9e\xe6\xbc\x40\x6c\xc7\xe8\xd9\xde\x51\x4b\xb2\x88\x7f\x5a\xa4\x74\x8d\xe7\x59\x02\x64\x5c\x97\xbf\x93\x74\x2a\xb6\x77\xfb\x70\xa0\xfb\x49\x38\x5a\x82\x1e\x9a\x3f\xdc\x35\x7f\x83\xaa\xc2\xc8\x63\x8f\xc1\xb0\xa6\xa1\x03\x72\x32\x29\xf2\x23\x07\x5b\xb1\xd1\xb7\x0e\xfd\x01\xbd\xd3\x47\x65\xa8\x48\x1f\x82\x97\x08\xaf\x3c\xbe\x60\xd3\xbe\xef\xff\xe3\x12\x34\xf7\xad\x45\xd9\xcb\xde\x42\xb9\x4b\xe0\x8d\x7f\xbf\xfa\x73\xb4\xe5\x52\xf8\x4d\xff\xcf\xd1\xd8\x27\x9e\x80\xef\xa1\xb1\x30\x85\x0c\xfb\x07\x9e\x90\x14\x39\x21\x39\xde\x1b\x49\xa1\x14\x0f\xeb\x9c\xa8\xa6\x12\x4a\x4a\xd5\x85\xac\x64\xf0\x86\x0e\x13\xe6\x10\x55\x56\x0c\x41\x4d\x49\x4a\x31\xa5\x2a\xa4\x4e\x2b\x86\xa2\xfd\x3b\x40\xf3\xfb\x3b\x91\x90\xc1\x2d\xb1\x2f\x98\x6f\xd4\xcf\x6d\x1e\x81\xcf\x0e\x9f\x5a\x37\xdc\x8c\xcf\xfb\x9f\xf2\xe6\x47\xfb\x49\x9c\xfa\x3a\xf1\x9d\x54\x28\xda\xbf\xbd\x45\x07\xc7\xf3\x1f\xa0\x5a\xd6\x2b\x37\xfc\x70\x7b\xff\x03\xc8\xfb\x27\xcb\xc6\x78\x9f\x98\xe3\x6e\x07\xcf\xb0\xee\xa7\xbf\x07\x5a\xef\x28\xe4\x50\x74\xab\x0f\xc7\x33\xfc\x07\x90\x77\x56\x5c\xc3\x26\x0b\x45\x9f\xc3\xda\xe7\xc1\x05\x6e\x5b\xb9\x3f\xdd\xe2\x73\xb7\xfd\xb0\xaf\x58\xe3\xd5\xb2\x4c\xe6\x9c\x75\x93\x3e\x6e\x1c\x7f\x8b\x63\x1a\xb8\x20\x43\xa7\xc0\x18\x70\x06\x19\xb5\xd3\x08\x4f\x88\xd6\xc3\x13\xfa\x22\xe3\xec\xe6\xee\xb3\x43\x64\x73\x77\x47\x67\x3d\xab\xae\xd5\x54\x2b\x7c\x36\xde\xdf\xca\x6c\x01\x64\x75\x08\xaa\xc0\x10\x05\x41\xd0\x79\x23\xf5\x93\xaf\xa3\x21\x1f\x03\x19\x1d\x06\x0b\x77\x1f\xb8\x7c\x81\xae\xf3\xd9\x9b\xfe\xfc\xd5\x4a\x1c\x0e\x21\x25\x0d\xd9\x24\x2a\xe4\xf5\x34\x2a\xa5\x20\xa3\x22\x8d\x02\x23\x82\x87\x3f\x8e\x29\x14\xd4\xb8\x24\xa9\x52\x0a\x29\x50\x34\x34\x35\x53\x54\x0b\x05\xb5\x0a\xd4\x87\xf9\xbf\x22\x05\xca\x4f\xee\x92\xb3\x85\xb6\x62\x45\xcb\x8b\x9a\x0a\x19\x14\x83\xe5\xa1\xb4\xaa\x19\x5a\x25\x78\x18\xe6\xdb\xca\x1b\xb5\x3b\x5d\x78\x29\x85\xa2\xfa\xef\x5a\xe4\x19\x86\xfd\xae\xe6\x5c\x79\xf5\xf6\x29\x2d\xed\x04\x8f\x79\xf1\xbf\xc4\xf8\x02\x31\xef\x1d\xde\xbc\x5a\x13\xbd\x79\xfb\x4e\xd3\xdb\xcf\x5b\xfb\xd6\xdc\xda\x67\xf1\x80\x4a\x2f\x0b\xf5\xa8\x49\x00\x7c\xd7\x85\xe8\x5d\x8f\x83\x72\x73\xee\x55\x86\xde\x75\x6f\xf3\xfd\xc8\xce\x43\x2d\xf8\x8b\xe7\x58\x77\xa8\x85\xde\x88\xfc\x34\xeb\x50\xb3\x4d\xe6\x5a\xd3\x1c\x37\x5c\x5d\x9f\xdd\x8e\x3f\x93\xf0\x78\x9a\xb5\xf7\x30\x08\xd1\xeb\xb3\x25\x6f\x3f\xfd\xb6\xe6\x75\xb9\xec\xc5\xdb\xdc\xb6\xc5\xe6\xe9\x8d\xcf\x56\xd1\x84\x7f\x4a\xae\x7f\x36\xb8\xcb\x45\x8f\xa1\xc0\xdb\xb4\x18\xea\x79\x61\x01\x78\x0d\x5e\x16\xea\x59\x9a\x80\x53\xd0\x9b\xa1\x7a\x0e\x3d\x87\xc6\x6d\xd8\xed\xfd\x97\xb7\xcd\xae\xdd\xea\xd2\x9d\x84\x50\x74\xd7\xeb\x38\xe6\xf3\xff\x23\xed\x5d\xe0\x9c\xa6\xf2\xc5\xf1\x73\xd2\x69\xda\xf5\x99\xe9\x30\x4c\x7d\xec\x9a\x3a\xd0\xa9\xef\xe8\x30\x4c\x94\x57\x00\x95\xb8\xa2\xc6\x27\x71\x45\x8d\x2b\x42\x14\x90\xb8\xa2\x46\x45\xc9\xfa\x22\x3e\x80\xe8\x02\x06\x05\x26\x80\x40\x41\xc0\x32\xc0\x5a\xef\xee\x5e\xab\xbb\x7b\xed\xaa\xbb\xb7\x7a\x57\xad\xae\x7a\xbb\x0f\xaf\xb3\xd7\x7d\xd4\x7d\xce\x65\x9a\x33\xff\x4f\x4e\xd2\x34\x7d\xe0\xbd\x9f\xdf\x7f\xf8\xb4\x33\x9c\xa6\x27\x27\xe7\x7c\xdf\xcf\xdf\x83\xc6\xd8\x3e\x47\xae\xda\x1e\x58\xff\xb7\x03\xeb\x57\x62\xc9\x81\x60\xee\xcb\x4d\xf5\xfc\xdf\xb3\xd7\x6c\xab\xa3\x7f\x8d\x3c\x50\xfa\x8a\xcf\x6e\x6c\x86\xad\x58\x95\x66\x7c\xcd\xa3\x75\x4b\xea\x72\xb6\x1c\x5d\xc9\xa1\x1c\x91\x04\x41\x9e\x06\x7b\x70\x64\x45\x47\x6f\xc4\x73\x60\x9e\x05\x03\x9a\xa8\x17\x02\xd5\xd2\x80\x5f\xb3\xdf\x3a\xff\x3c\x07\xda\xc4\x90\xc5\xb4\x51\x29\x33\x9d\x8d\xe7\x64\x3e\x3e\x52\x48\xa7\xe9\x90\x8a\xd2\x02\xab\xb0\x82\x29\xb2\x1a\xcb\xa3\xb8\x41\xab\xba\x02\x35\x21\xae\xc7\x05\xdb\x6c\xc1\x0a\x8d\xa5\x9b\x72\xb0\x0f\xbd\x45\xfc\x08\xbd\x05\xfb\xd0\xc7\xf0\xf5\x4d\xf6\xcc\x4d\xbf\x27\x54\x0d\xb1\x43\xa6\x0e\x29\x58\x94\x54\x94\x97\x64\x56\x15\x69\xc5\x60\x0d\x95\x8e\x97\xb2\x6c\x3a\x67\xa5\x53\x59\x33\x2c\x1f\xc6\x50\xbf\x7c\xc9\xcc\xaf\x3f\xfa\xe0\xae\x5d\x0f\xae\x79\xd4\x3e\x66\xd2\x4c\xe2\xdf\xc6\xfb\x79\x26\x06\xb9\x02\x74\x00\x1a\x24\xc1\xe9\x38\x6e\x39\x18\x13\x19\x08\x41\xe9\x4f\xf4\x27\x60\x57\x04\x57\xbe\x73\x5e\x13\x83\xc2\x41\xc4\x6b\xa1\xd8\xde\xdd\xe7\x52\xdb\xf0\x61\x76\x8f\xc8\xb5\x15\x2a\x45\x9a\x18\x8a\xcb\xaa\x95\x8b\x17\xcd\x14\x13\xad\x0c\x89\xa8\x0c\x37\x7e\xff\x6c\x62\xde\x46\x9b\xdc\x08\x4f\x3e\x0e\x6e\x5f\x76\xce\x79\x4b\x67\xa2\xfb\x67\x9c\xb2\xf0\xd4\x19\xed\xf0\xf8\x47\x60\x3b\xfa\xf3\x23\x57\x2e\xbb\x72\xd9\xa2\x12\x71\xda\xc5\xdf\x5c\x34\xe3\xba\x91\xf5\x2d\x42\x9d\xca\xaa\x82\x8a\x66\x5c\xa3\x38\xb5\x1c\x3e\xb6\x67\x61\x65\x4a\xe8\xa2\xca\x4b\xa1\xb7\x2e\x41\x95\xe4\xfd\x73\xa7\xde\x3c\xf7\xaa\x79\x53\xe6\xce\xfd\x14\x76\xa0\x3f\xde\x89\xd2\xef\x3f\x3e\x77\xe1\xcd\xeb\xa7\xcc\xfd\xce\xbc\xfb\x17\x86\xa6\x7f\x95\x0d\xfc\x7a\x97\x26\x50\xf3\x0f\x7e\x1c\x09\x4f\xfd\x97\xa9\x67\xc5\xc8\xf5\x41\xbd\x5d\x76\xe4\xad\x0d\xc1\xb8\xfa\x63\x70\x0e\xd6\x7a\x52\x0b\xf4\xe2\x4f\x80\x1e\x2f\x36\x5c\x00\xd7\x80\xb9\xe0\xdb\xee\x2e\x3b\x3a\x76\x07\x8e\xa9\xf7\x7a\xab\xd5\x0a\x41\xf4\x8f\xed\x8a\xb8\x90\xe9\x39\x98\xfa\xbc\xac\xc1\x20\xa4\x06\x33\x81\xfa\x5a\x18\x50\x8e\x6a\x63\x46\x0a\x6d\xcf\x3d\x07\x9d\xdf\x61\xe7\x0d\xee\xde\xb6\x8d\x78\xcb\xac\xa4\x4c\x82\xa1\x53\x69\x36\x35\x57\x16\x25\x51\x2e\x98\x8c\x94\x65\x4d\x4a\x46\xe5\xac\x42\x0c\x29\xa2\x22\xaa\x95\xa2\xc1\x0a\x86\x18\x7a\x75\xdd\x65\x4b\xee\x5e\x12\x5f\xf2\x20\x7b\x48\x6a\x91\x98\x9e\xd3\x1e\xac\xe8\xc4\x32\xed\x4e\x8d\xb8\xa6\xf2\x03\x52\x42\xb9\x4c\x06\x72\x02\xcb\x8a\xf2\x47\xbc\xa4\x2a\x02\x87\xca\x74\x9c\x93\x98\xb4\xc8\x0b\x90\x35\x4c\x35\x63\x72\x4c\x41\x17\x2c\x34\x68\x5f\x75\xaf\x18\xdf\x4c\x4b\xe4\xe9\x87\xcd\x4d\x17\xeb\x73\x33\x8d\x1b\x1a\x6d\xf5\x2e\xee\x3f\xf7\x5c\x60\x3c\xe7\xd0\x8b\x4d\x7f\x6f\xa2\xf9\x98\x9e\x6d\xd8\xd2\xc4\x17\x03\x35\x22\x36\x6c\x6d\xb4\x89\x7a\x14\xe7\xfa\xd6\x76\xb2\x0d\x9b\xeb\xf8\x9f\xc3\x77\xdf\x68\x92\xd3\xb0\x2c\xf4\xc2\x7a\x87\x7e\xbd\x60\x36\xd9\x31\x1d\x3a\x6a\xb5\xe0\xbd\x8e\x9c\xf4\x5a\xcd\xd6\x68\xcc\xc5\x9f\x19\x58\x1e\xd5\x63\xc9\xc1\x0f\xf0\x68\x2d\x67\x86\xa9\xd9\x01\x29\xd2\xf8\x16\x68\xb0\xb5\x6f\x18\x68\x5a\x57\xc0\xb7\xb3\x2e\xd4\xa8\x33\xaf\xfb\x6d\x93\xec\x96\xae\xe9\x56\x9b\x9a\xd6\xea\xcd\xf3\xbb\x3a\x3b\xa6\xa3\x27\x9d\xd9\x64\x47\xc5\xeb\xdc\xf9\x6a\x80\x9e\x5f\xdb\x4a\x6f\x34\x3f\xaa\xd3\xdf\xfc\xb5\x0e\x06\xfd\xe0\x01\x7b\xc0\xa6\x4f\x1a\x75\xb4\x3a\xfe\x2a\xfa\xb2\x82\xe9\x3c\xc7\x01\xaa\x26\x2b\x80\xa3\x81\x38\x3a\x23\x32\x40\xca\x01\x9c\xed\x02\x27\x80\x7e\x30\xc9\xf3\xf4\x5d\xee\x60\x6c\xcd\x1a\x14\xc2\x16\xb2\xbe\xee\x44\x67\x6f\x5f\x6f\x67\x6f\x5f\x2d\xf3\x2e\x92\x38\x06\x3a\x28\xd9\x7b\x4e\x7f\xc2\x15\x4b\x5b\xe5\x07\x57\x2d\x9c\x6d\xa0\x02\x0c\xa2\x64\xd3\xce\x6b\xb8\x2d\x3f\xc2\x9a\x85\x02\x94\x8a\x46\xa1\x02\xe0\x30\x4d\x2b\x3c\x0b\x73\x36\x4f\x11\x06\x25\xe9\x2c\x17\x57\xa5\xa8\x3d\xc4\xe7\xf8\x02\x83\x4a\xf7\xe2\x24\xe1\x0c\x4e\x12\x4e\x34\x1b\xd9\x48\xc1\x2e\x42\x5e\x46\x79\x19\xe5\x90\xa4\xa6\x9d\x1f\x74\xde\xe9\xdd\x73\x2e\x94\x1e\x9e\xf3\xee\x93\xd1\xfb\xe7\x6c\xbc\xf0\xa9\x29\x7f\xd3\x75\x5d\x0f\xdf\xda\xda\x9c\xe6\xcb\xf2\xba\x0f\x57\x73\x1a\x7d\x29\x9b\x7e\x05\x1a\x6b\x1b\x58\x81\xfe\x1d\xd5\xbc\xca\x15\x18\x9f\x24\x67\x9e\xb3\x40\x2c\xb9\x1b\x77\x3f\xdd\x9a\xa9\x87\xd1\x67\xc3\x2d\x70\xb6\x56\x37\x6f\x59\x4b\xd9\xd4\xf5\xce\x90\xc6\x35\xf5\x3a\x8b\x27\x39\xfd\xbd\x51\xe6\x3a\xf0\x3a\x96\x67\x72\x58\x82\xda\xd1\x44\x0b\x70\xcc\xdb\x81\xae\x16\x30\x5b\x8b\x55\x28\x36\xea\x60\x1e\xfc\x7d\xda\xda\x6f\xe4\xed\xdc\xd5\x9e\xfd\x08\xfb\xf2\xc0\xd1\xe0\x24\x30\x0e\x9c\x0a\x18\x30\x11\xcc\xc0\x91\xa2\x0e\xf4\x78\xb9\x42\xb8\xda\xac\xdb\x23\xa9\x6a\xaa\xed\xee\xc7\x21\xa2\x2d\x4d\xb5\x55\x71\x04\xe2\xef\x27\x3a\xc7\x90\xdd\xcc\x59\x90\xe9\x3a\x67\x0a\xec\xee\xec\xee\xeb\xee\xc4\x25\x6b\x3b\xbb\xfb\xda\x0a\x1c\x4d\x30\xfa\xc8\x90\x4e\x08\x71\x06\xa5\x43\xc2\xec\x9f\xfc\x00\x9e\xc1\xa2\x6c\x69\x18\xe5\x38\xd8\xfb\x5e\x5a\xe1\x8a\xf3\x9f\xd8\x30\x7b\x44\x6e\xa1\xc9\xc4\x43\x42\x25\x4d\x14\x6d\x9e\xc8\xda\x4c\x1b\x50\x91\x0c\xe5\x09\xd2\xbc\x94\xcc\x0f\x6b\x43\x1a\x94\x91\xaa\x90\xaa\x20\x94\x35\x7d\x98\xe3\x0e\x15\x65\x51\xe6\x28\x25\x2e\xab\x51\x25\xca\xcf\x9d\x4b\x89\xec\x84\xb9\x61\xbd\xb5\x98\xd2\xc6\x22\x55\x62\x45\x16\x99\x79\x49\xcc\xb0\xe7\xb7\x49\x14\xcb\x0e\x0f\x67\x21\x2d\xca\x85\x3a\x1b\x8e\xb7\xd7\xff\x53\xe7\x97\x71\xe8\xdb\xc6\x26\xd8\x09\xe6\x79\x5f\xd5\xa8\xd3\xd6\xd9\x2a\xaf\x6c\xa5\xab\x6c\xd8\x50\x47\x67\x6a\xbe\x97\x77\xea\xf4\x59\x35\x96\xdc\x8a\xa5\xe3\xb5\x7f\x6b\x84\xcf\x2d\xef\x05\xe8\xf7\x15\x01\x1b\x8d\x1c\x4b\x6e\x68\xac\x9d\xe3\xd1\xb2\x0d\xcf\xd5\xc6\xb1\x9c\x26\x44\x16\xfa\x74\xc9\x95\x68\x67\x80\x0b\xc1\x37\xeb\xe9\x51\x2b\xc0\x70\x08\x53\x67\x77\xa7\x1f\x5d\x4e\x46\xaa\x02\x6b\xc4\xd3\x81\x6b\xe4\x8c\x0a\x95\x2b\x94\x49\xe4\x6c\xce\x79\xd9\x6a\x0b\x09\xeb\x3d\x38\x43\xff\xf2\xcb\x5b\x5f\x31\xaf\xbd\x5c\x84\x5f\x43\x53\xe3\x8f\xc3\x91\xc7\xed\xb5\xfa\x7a\x0e\xc2\x77\xd0\xa5\x70\x0b\xfa\xd7\x5f\x13\x0b\xed\xb5\xce\x8b\x14\xed\x37\xe0\x95\x8b\xd0\x0f\x16\xc3\x6f\xb7\x66\xed\xc4\x93\xba\xbe\x7c\xc5\xdd\xc6\xed\xb3\x67\x2f\x6f\x9f\x6d\xaf\xeb\xed\x85\xd9\x49\xc6\xec\xdb\x97\xaf\xb0\x5f\xb9\x1e\xbd\x71\x7d\x15\xbf\x5c\x5d\x68\x1d\xe6\x9d\xab\x41\x8b\x7a\xe6\xbb\x04\xfc\x99\x1f\xeb\x04\x8e\xc2\x9f\xad\x27\x97\xe2\xba\x0d\x9d\xe0\x9b\xe0\x52\x70\x05\xb8\x06\x7c\x0b\xdc\x00\xe6\x81\xdb\x80\xe2\xe1\x5a\x02\xe3\x59\x6f\x7b\x77\x4f\xb5\x6f\x57\x20\x12\xbf\x33\x81\xdb\x92\x74\x57\x0d\x0c\xdd\xbe\x35\xa1\xaf\x17\x23\x9b\xf7\xbb\x07\xf6\x75\x7f\x9d\xf0\x78\x40\x95\x17\x34\xd7\x1b\xbe\x86\x89\xc3\xf2\x88\x08\xcb\xf1\x38\x62\x0c\x23\x6a\x6a\x59\xc5\x54\xa1\x75\xd9\x9c\xdb\x2f\xa5\x37\xd2\x53\xe1\x79\x68\x3b\x3c\xe1\x86\x1b\x3e\x7e\xf0\xed\x6b\xf6\x3c\xb6\xf6\xb1\x8d\xf3\x57\xcd\xff\xd1\xed\xdb\x7e\x89\xfe\x08\x3b\x7e\xf9\x4b\x54\x81\x47\xdd\x0e\x1f\x7f\xec\xb1\xb5\xab\xd0\x9c\xc7\xd6\xae\x3a\xf4\x70\x0b\x6a\xbf\x54\x10\x55\x95\x63\xd0\xc3\xb6\xfc\x7b\xbf\x4f\x58\xdb\xc9\xdf\xba\xfb\xee\x2b\xcf\xbe\xe0\xca\x7b\x9e\x44\xa3\x0f\xa0\xd1\x37\x6f\x7a\xe4\xa6\x37\x91\x0e\x2b\xa8\x0d\x5e\xba\x57\xbe\xfb\x81\x77\x96\x3c\xf3\xc0\x33\x4b\x9e\xbc\xe7\x11\x74\xdf\x93\x4f\x2e\x79\xe6\x99\x67\x9e\x41\x5f\x3a\xef\x6d\xc9\xaf\xc8\xbb\xf4\x65\xac\x0d\xeb\x5b\xd0\xeb\x1a\x3f\xfe\xd0\xf7\x39\x7a\xfe\xad\x5d\xd7\x37\xe4\x76\x4d\x89\xbc\x4f\x3e\x58\xf5\xd7\x3e\xf3\x09\x9c\x0f\x1e\xed\x4b\x9c\xb7\x8a\x5a\xf0\xdc\x09\x70\xdc\xe8\xdf\xd8\x37\xa6\xad\xa0\x66\xed\x5b\x0b\x75\xb0\xbc\xf7\xc1\x49\xb3\x7d\xf9\xab\xe6\x43\x33\x7d\x1b\xe7\xd7\x70\x5f\xa5\x63\xc0\x18\x70\x3c\x38\xcb\xb3\x6d\xba\xb2\xb6\x8c\x73\x0e\xdd\x9e\xf8\x21\x87\x9e\xb6\x7b\x8a\x1e\x7e\xef\xe8\x1d\x13\xc1\xc7\x3e\xc6\x8f\xf6\x9a\x0a\x61\x6f\xa7\x33\x76\x2c\xac\x0d\x05\xbf\xe3\x17\x08\x6f\x0e\x9b\x7c\x69\x90\x1a\x81\x73\x2f\x47\x4f\x7e\xb4\x0b\xcd\xbc\x89\x58\x02\xd1\xfa\x6b\xef\x7d\xee\x89\xca\xe7\xbb\xa6\x5f\xb4\xeb\xda\x07\xf5\xa8\xc0\x49\xb2\x19\xd5\x14\x49\x92\x78\x5d\x36\x14\x42\xd3\x05\x4e\x52\x0c\xca\x54\x25\x59\xe1\x4d\xc9\x50\x2a\x59\x2d\x2e\x69\x12\x61\xb9\xbf\x78\xa3\x02\x4c\xf4\xaf\x7b\x57\x2f\xd8\xb4\x83\xde\xb4\x62\xc9\x8a\x4d\x70\xfc\x8a\x1b\xbf\x3f\xf0\xaf\xc4\xab\xe8\xa3\x09\xa7\xa3\x5f\xdf\xb5\x66\x0d\x84\x7f\xdd\xf2\xe8\x2f\x60\xdf\xce\xd3\xdf\x7f\xf2\xa2\x9d\x8f\x8e\x7f\xe3\x91\xd3\xb7\xb4\xfd\x49\x14\x58\x5e\x95\x78\x9a\x96\x54\x55\x15\x55\x49\x16\x87\x61\x2a\x8d\xc7\x38\x67\x48\xd2\x9c\xa1\x7c\x3c\xab\xf1\xaa\x11\xcf\x69\xbc\x8a\xa2\x48\x2b\x97\xa1\x46\x94\x6e\x5e\xb9\x72\xe3\x22\x74\xe7\x75\x4b\x57\xae\xbc\x0e\x2d\xbc\x19\xdd\x8f\xd6\x2c\x85\xd7\xb5\x90\xd3\x9e\x9d\xdf\x44\x8b\x1b\x63\xd2\xab\xb6\x9e\x19\x4d\xe3\x99\x80\x8c\x7d\x79\xa3\x0c\xba\x87\x6b\xe1\xff\xd1\x63\x49\xab\xbb\x69\x1c\xcb\x28\xe6\x07\x2d\xc6\x1d\x5d\xa0\xb9\x0e\x8d\x5b\x7f\xe9\x86\x26\x3e\x8f\xd7\xb3\x93\x0d\xf0\x06\xa1\x9e\xde\xec\x3f\x23\xa0\xeb\x1d\x0b\xc4\xd1\xee\xc8\xa3\xe4\x7a\x4f\x5e\x3c\xc9\x8b\xc5\xed\x03\xe7\x06\x34\xea\xeb\x00\x80\x91\x9e\x71\xe3\xbb\x22\x89\x4e\x10\xee\x19\x37\x3e\x81\x21\xcd\x91\x21\x3b\x3c\x19\x12\x56\x7f\x7b\x80\xe5\x2a\xd7\x21\xaf\xbe\x7c\xe4\x2b\xed\x12\xa1\x9f\xef\x98\x0b\x2f\x84\xa1\xd5\xb7\x10\x71\xf4\x6e\x65\x74\x31\xb1\x1d\x8e\x43\x1d\x33\xcf\x3b\x75\x55\x62\x6d\x48\xaa\x58\x7a\xa9\x04\xa5\xb2\x9d\xc1\xbf\xe0\x79\x5b\x2a\xe9\x2d\xc4\x19\x02\xab\x32\xe2\xfb\xc4\xbf\xda\x33\xe0\x91\x86\xb1\x4c\xcc\x17\x84\x12\xc1\xe5\xf3\x5c\x2e\x37\x72\x6b\x0b\x0f\xfa\xf4\x19\x77\xdc\x9a\x9b\x24\xdc\x8a\x5e\xba\xed\x9e\xcb\xfe\x9e\xe8\x9b\x31\x79\xb2\x7d\x2c\xa2\x21\x2d\x08\x02\x1a\x16\x45\x91\xc8\xa0\x3f\xad\x5c\x09\x63\xff\x21\x29\xbc\x2c\xa1\x57\x9f\x68\xb7\x0b\x27\xcb\x32\xa3\xa7\xf8\x14\xaf\xf3\x29\xf2\xbd\xaf\xf6\xa9\x7b\xb1\x66\xcf\xde\xd2\x74\x26\x35\x5f\x7b\x72\x1d\xee\x44\x6b\x5c\xd6\xa0\xab\xb8\x27\x75\x29\x68\x88\xc1\xd9\xb0\xae\xe9\xdc\x7f\x10\xf0\x83\x4e\x06\x80\x9a\x75\x60\x06\x78\x61\xf4\xd3\x49\xcb\xa6\xc7\x1b\x6c\x5b\x6b\x5b\xc3\xf0\x86\x35\x4d\xf2\x6e\x20\x66\xfb\xd9\x79\x8d\xfa\xa3\x9b\x0b\xf8\xfc\x81\x26\xde\xe5\xd0\xcf\xef\x35\xdd\x03\x3f\xab\x2b\x9b\xec\x58\x0a\xea\xf3\xac\x03\x72\xf5\xa6\x8f\x1a\x65\xd3\x3a\x7d\xea\x92\x00\x3c\xd7\x64\xa0\xd9\x8d\x78\xea\x8d\x5f\x5c\x27\xcf\xd6\x64\xfd\x6f\x7e\xa5\xff\xea\x22\xfc\x99\xe0\xeb\xb0\x38\xa6\xc8\xc0\xfd\x97\x70\x7c\x08\xbe\x87\xef\x6d\x3a\x1b\x4c\x07\x17\x80\x8b\xc0\xe5\xd8\xc2\xd4\x94\x1d\xdf\xd7\xaa\x33\x58\x57\xa4\x2d\x1c\x19\x37\xde\xa1\xd8\x5d\x63\xbb\x12\xed\x09\xc2\xa1\xc3\x7d\xed\x89\x64\x4f\xa4\x33\xd1\x17\xee\x4c\xf4\x75\x04\xea\x14\x84\x2c\x13\x72\x26\x14\x50\xc6\x44\x39\x13\x65\x21\x6f\x4b\x2d\xec\x6c\xa6\xc5\x40\x1a\x4a\x22\xb2\x50\xb1\x8c\x0a\x0a\x4c\x0f\xf3\x0c\xcc\x54\xe4\x68\xd6\x90\x05\x58\xa4\x99\x72\x28\x5a\x19\x0e\x45\x73\xa6\x9d\x36\x4d\x42\xb4\xd3\xa4\x2a\xcb\xb2\x2e\x3b\x6f\xfc\x61\xe4\x57\x2d\xc5\x58\xa2\xa1\x66\x73\xb2\xaa\xf3\xa2\x64\x97\x50\x76\x48\x34\x87\x32\x30\xcf\x32\x65\x51\xcc\xf3\x3c\x2a\x22\x86\xe3\x61\x11\x0d\x59\xe0\x68\x5c\x97\xf0\x29\x52\x0e\xd0\x8d\xaa\x95\x32\x90\xb9\xd9\x9e\x08\x46\x8c\x62\x81\xad\x91\x5e\x04\x28\xc3\xf8\xb1\x9d\x91\x09\x3d\x0d\x09\x9c\x87\x8f\x36\x3d\x27\x94\x43\x8b\xe1\x8b\xe8\x6a\xf8\xf1\xc8\x2a\x58\x41\xb3\xe1\x01\xb4\x78\xfd\xa1\x43\x70\xcd\x5f\xec\xfb\xf0\xaf\xca\x17\xaa\x2c\x29\x4a\xa8\xac\x70\x3a\x2b\xa3\x54\x4a\xa3\x61\x9a\xa5\xb5\x38\x6b\x7f\x09\x35\x0b\x6a\x48\x83\x85\x91\x0c\x2c\x21\xcd\xfe\xa2\x45\x0c\xaa\x6c\xe7\x14\x55\x59\xbe\x5c\x51\x15\x28\xde\x71\xc7\x1d\xe8\x25\x45\x51\xec\x23\x79\x43\x90\x24\x49\x56\x79\x45\xe1\x65\x95\xd2\xc4\xb8\xa4\xa4\x54\x11\xbd\x25\x49\x9a\x64\x18\x12\x79\xce\xff\x92\x53\x8f\xe9\xc4\x8e\x71\x01\x58\x9c\xd5\x80\xf7\x4f\x07\x3e\xbb\xb0\x1e\xb7\x3c\x1b\xc2\xbe\x46\x9c\xc3\x76\xa4\xe4\x20\xd6\x4b\x07\x0f\xb4\xb2\x6d\x6c\x7a\xbf\xce\xa7\x51\xab\xfb\xf1\x7e\x1d\xfe\xd4\x6c\x43\x46\x23\xdf\xda\xb0\xaa\x49\xdf\xf4\x73\xb2\x62\xe4\xf3\xc1\xda\x66\xaf\x90\x22\xb5\x60\x6b\x61\xf4\x12\x00\xce\xfd\x92\xab\x46\x13\xcd\xda\x7e\x24\xb0\x01\x38\xef\x36\xae\x79\x7d\xae\xb5\x88\x34\x2e\x68\xa5\xcb\x58\x93\xea\xec\x51\x35\xf9\x69\x75\x1d\x1d\xf1\x63\xb7\xad\x2e\xdf\x2e\x72\x4a\x44\x23\x25\x1c\xe7\x55\xb3\xa5\x4f\x01\xd7\xe2\x38\xf9\x5b\xc0\xad\x18\x4e\xb1\xf1\x77\x5c\x7f\x5f\x62\x7c\xe0\xef\x70\x30\x4c\xbe\x19\xbb\x3d\xd4\xef\xf2\x21\xd5\x83\xf6\x6e\xcf\xb6\xee\xaa\x27\xa7\xc0\xce\x44\x1f\xf4\x7e\xb7\x0d\x11\xb2\x91\x2b\xa7\x60\xb4\x80\x52\xb6\x42\x48\x7a\x7e\x28\x05\x41\x11\xa5\x88\xb2\x26\x71\xa2\x6a\x9b\xba\xc8\x09\x1a\xd2\x5a\x04\x3e\xc8\xcf\x55\x4e\x5f\xff\x26\x5c\xfa\x1c\x5c\x8a\x9e\x82\xbf\x40\xe7\x10\xb3\xec\x57\x9e\xb3\x5f\x21\x66\xa1\xd3\xe0\x7b\xe8\xa9\x73\xe1\x24\xf4\x53\xf8\x1e\x9c\x50\xf9\x67\xf5\x2f\x52\xb2\x8b\x3a\xcf\x69\xac\x60\x69\xfe\x5f\x71\x9a\x91\x98\x94\x88\xdf\x87\x5a\x53\x83\x50\xe7\x97\x0f\x3d\xf4\xe5\x7f\x5f\x7a\xe9\x92\x4b\xd1\x91\x97\xdd\x75\xff\xfd\x77\x5d\x06\xff\x7e\x29\x1a\xba\xee\xba\xeb\xf0\x9b\xef\x8f\xad\xd5\xef\x3a\xbf\xce\xae\x59\xa3\xc1\x33\x5b\xdb\xd9\x8c\x19\x75\xb4\x5c\x8b\x25\xcd\xdd\x2d\x64\x1c\x2d\x96\xb4\xa6\x35\xd9\xfd\xdc\x98\xe1\x95\x2d\x7c\x62\x6a\x2c\xf9\x22\x13\xc0\x9d\xe9\xfe\x67\xeb\x48\x95\x5a\xb0\xb1\x67\xf4\x2e\x00\x66\xee\xe6\xbc\x6a\x12\xfe\x7a\xc5\x58\xd2\x9a\x10\x90\x8b\x8e\xc6\x7c\xf1\xf5\x3a\x7b\x1a\x0d\xce\x68\x8e\x98\xe9\xc0\xd5\x64\xda\xfd\xaa\x32\x21\x37\xa6\xc0\xcd\xb9\x18\xdf\xf4\x9f\x70\x64\x1c\x24\xc2\x3d\xe3\x22\x55\x83\x79\xb3\x9b\xe1\xbf\xdb\x72\x23\xdc\xa5\x6d\xdc\x48\xce\x08\xd1\x95\x92\x4c\x08\x76\x46\x83\x3c\xca\x7e\xf2\x18\x45\xdf\x78\xc3\xfc\x59\xd7\x4c\xbb\xf1\xf6\x8f\x89\x5f\xae\xa2\xba\x6e\x9f\x7f\xfb\xac\x1b\xfa\xe7\xdc\x7e\x10\xfd\xcc\x8c\xc7\x87\x21\x23\xa1\xd2\x28\x28\xa3\x21\x01\x9a\xc3\xa1\x8d\x95\x9b\xe1\x32\xcb\xaa\x9c\xd0\xa2\xac\xca\xb0\x5e\x59\x6e\xcb\x0a\xcc\x0a\xa8\x2c\x09\x6d\x6b\xc6\xcf\xb9\xec\xa2\x1b\x6e\xe0\x2f\x9a\x2f\xdc\x78\xf0\xc3\x71\x02\x2f\x2c\xbe\x65\xce\x9c\x1b\x84\x1b\x2c\x9e\x8d\xd3\x43\x9a\x69\x42\x80\x86\x4d\x63\xe8\x1f\x1b\xdb\x4e\xa9\xc8\xa1\x1d\x87\xcf\x57\x9b\x33\xca\x45\x0e\x92\x0f\x51\x0b\x0e\xec\x87\x49\x00\xd9\xdf\x72\x67\x52\x0b\xf6\xef\x80\xc7\x8d\xfe\xb3\x7f\x29\x37\x97\x5a\xf0\xcc\x32\x38\x19\x1c\x31\xd1\xe4\x00\x75\xe1\xba\xcf\xc2\x60\x72\x9c\xab\x93\x4f\xea\xe4\x00\x2e\x80\xf3\x35\x5d\xd9\x04\x8d\xfd\x16\xc4\x58\xd2\x7c\xaf\x35\xfc\x6c\x68\x8c\x45\xe7\x23\xb9\x9a\x2d\x6c\xdf\xd4\x3a\xbb\xbb\x1a\x4b\xae\xbf\x2b\x70\xff\x69\xf5\x7e\x55\x6f\x74\xea\x61\xe4\xff\x29\x8d\xb2\xd6\x8b\xdf\xc7\xb5\x17\xee\x6c\xb0\x99\x07\x7b\xa3\x1f\x6c\xd4\x01\x76\xbd\x1c\xb8\xff\xe4\x56\x36\x41\x63\x52\xa3\x6f\xda\x8d\xe1\xf0\x30\xeb\xbc\x96\xf6\xa3\x73\x1b\x7d\xc4\xde\x38\x7b\x18\x7b\x53\x7f\x63\xdc\x85\xa7\x2b\xfd\xc2\xa7\xab\xc7\x46\xe4\x26\xba\x3a\x15\xdb\x76\xe6\x80\xeb\xc0\x8d\xff\xcf\x74\x35\xd1\x58\xa8\xa9\xb1\xb9\x6a\xd8\xfb\xe0\xff\x0f\x35\x85\x3a\x11\x67\x4c\x3a\x4e\xa4\x46\x68\x2b\xa4\x56\x74\x93\xe0\xec\x5c\xc8\x50\x14\x96\xa7\x65\x86\xaf\x28\x26\xa4\x09\xcd\xd6\x0c\x28\x23\xf3\xff\x95\x8e\x12\xb9\xd9\x27\x9e\xdd\xbf\xe4\x02\xf4\xbb\x9b\xbe\x35\x0a\xd0\x98\x2b\x67\x1f\xb3\xec\x98\x69\x50\xb6\x3f\x21\x9e\xdc\x83\x3e\x91\xaf\x6c\xd8\xfb\x6d\x7f\xc7\x71\x2a\xff\x68\x80\x6f\x0c\x63\x1b\x1a\x63\x6e\xbc\x9c\x82\x0d\x8f\xb7\xb0\x2d\xb1\x6e\x4c\x18\xc6\x94\xea\x89\x4e\xf4\xe4\x5d\x4f\xae\xdf\xf2\x0d\x3c\x5a\x5f\xaf\x43\x6e\xc0\xbf\x09\xfe\x7c\x59\x52\x8a\x25\x5f\x78\x16\xf7\x60\xb9\x21\x70\xaf\x39\xa3\x6c\xe4\x3d\xf2\x41\x6a\xfe\xba\xcf\x08\x30\x55\xe1\x00\x35\xdf\xb8\x7f\xe8\x2f\xe7\xce\xe4\xe6\x52\xb3\xb6\xdb\xf0\x81\xd1\xca\x84\xb7\xb8\xb9\x58\xa6\x66\x47\x4f\x8f\x14\x48\x11\xc7\xc2\xb8\xd2\x74\xb0\xd2\xc0\x57\xc6\xc4\x34\x0e\x43\xbf\x97\x59\xf5\xd5\x87\xeb\xda\x8c\x4f\x74\xfa\x9d\xcd\x5a\xd8\x14\xdf\x87\x89\x8d\xf0\x6b\xe8\x9f\xdb\x17\x5e\x77\xdd\x75\x1b\xaf\xd8\x74\xf3\xbf\x2f\x44\xc3\xa1\x93\xe1\xa9\x1b\x21\x18\x05\x1b\x97\x3a\xa3\x4b\xd7\xde\xfc\x9f\x8b\xd0\x3f\x2b\x95\xf0\x13\xf6\x43\xc4\xdb\xab\xec\xd7\x57\xd9\xaf\xad\x24\xde\xb6\x1f\x7a\x0c\xee\x43\x97\x11\x3f\x85\xaf\xa2\xe9\xf6\x04\xfc\xf7\xdb\x30\x8b\xf8\x91\xcd\x2d\xe0\xeb\x0f\x6f\xbc\xb1\x36\xb1\x68\xd1\x23\x8b\xae\x43\x4f\xc2\x79\x1b\x57\x3e\xba\xe7\xd5\xb5\xc1\xa1\x45\xdf\x5f\xf6\xe8\x9e\x57\xdb\x3e\x7f\xe2\x0e\x74\x1b\x3c\x0a\x5d\x01\xf7\x22\x1b\xae\xbc\x03\x1d\x78\xe8\xbe\xfb\x2e\xbf\xf7\x8e\x7b\x43\xe7\x1f\x3e\x76\xa6\xa1\x5f\x8a\xd1\x5b\x27\xa7\x89\xb1\xe4\x7a\x3b\x70\x86\xe7\xd4\xfb\xf1\xbc\xd1\xb3\x1b\x65\x3b\x37\x7e\xd6\xfb\x94\x09\xf0\x54\x07\xc6\xf4\x26\x1a\x8a\xe5\x47\xf3\x97\x0d\xba\x6e\xca\xab\x35\xaa\x05\xe8\xd1\x59\xa0\xca\x17\x4c\x52\x75\xe0\xe4\x68\x30\xf1\x1a\x0e\x50\x0b\x9e\x2b\xc3\x79\x00\xf4\xed\x71\xfe\x5e\x79\x33\x3c\x1d\x80\x89\xab\x38\x40\xcd\xda\xbd\x12\x8e\x05\xa0\xff\x58\xae\xea\x17\x0c\xd6\x33\x3b\xb3\x4e\xce\x50\x62\xc9\x0d\x8f\x35\xad\x2d\x50\x1f\xf8\xf9\x0b\x1b\xe9\xeb\x86\xe6\xde\x16\x41\x7a\x78\x46\xd3\xf5\x8f\x80\xc6\x5c\xbd\x7d\xa4\x46\xcd\x7f\xfc\xe2\x2d\x60\xe6\x6f\xb9\x7a\x7b\x20\x17\x11\xb0\x9e\x79\x76\x60\x2f\x4f\xaf\xd7\x4d\xd7\xbc\x1f\xf8\xec\xb4\x7a\x7f\x8b\x37\x7a\xea\x57\xce\x77\x4a\x80\xbf\x29\xb1\xe4\xb3\x8d\xf5\xa9\x3c\xdb\xfd\x86\x87\x9b\xec\xf3\xc1\x58\x9e\x87\x5a\x8f\x1b\xa9\x46\xde\xe2\x8d\x57\x6b\x28\x2e\x1e\x65\x23\x0b\x5c\x3e\xd1\x79\x44\x8c\x34\xfe\xf1\x41\x4b\x9d\x62\xc3\x77\x1b\xfd\x15\x1b\x4e\x0b\x3c\x43\x32\xf0\x0c\xb5\xe7\x1e\xef\xdb\xa4\xbe\x1e\x79\x0a\xd7\x23\x19\x0b\x8e\x07\xdf\x00\x27\x83\xa4\x97\x29\x70\x09\xb8\x12\xdc\x05\xee\x07\xdf\x05\x2b\x70\xb6\x3f\x16\xba\xbd\x64\xf1\x9e\xfe\xb1\x27\xc1\x3e\xec\x30\xfa\x3a\x0c\xba\x36\x23\x89\x63\x42\xdd\x91\x9e\x89\xe7\x4c\x85\xfd\x89\x8e\xae\x48\xa2\xd3\xe5\x40\xdd\x4d\x31\x33\x1d\x55\x3d\xd5\xd7\x3d\xc9\xc8\xc4\x7e\x37\x98\x21\xd9\xd3\x16\x6e\x95\xe5\x11\xd1\x90\x0e\xf9\x0a\x35\xa4\x16\x60\x99\xd1\xd8\x54\x34\x67\xe4\xf3\x79\x28\xe6\x8c\xac\x3d\x8d\x0c\x7d\x8f\xfc\xfa\x38\x6e\x96\x19\x13\x6f\x38\x25\x4e\x56\x16\x9c\x72\x17\x19\xba\x16\xfd\xd7\xa4\x53\x6e\xe8\xee\xbb\xad\x2f\x76\x5b\xec\x4c\x74\xcf\xad\x67\x71\xb7\xcd\x86\x67\xf7\xc5\x6e\x6b\x3f\x8b\x47\x3f\x84\x69\xb4\x07\x5e\xf9\x30\xbc\x0a\xed\x86\xfb\x50\xec\x92\x5b\x7e\x56\xec\xa2\xae\x5f\x3a\xe5\x4e\xea\x24\xb4\x07\x3d\xd6\xf3\x5c\xe5\xb7\xcd\x04\x27\x5c\xd6\x65\x94\x17\xec\x22\x8a\x4a\x30\x43\x50\x84\xca\x89\xbc\x50\x76\x74\xfe\x82\xe4\xfc\xa0\x3d\x17\x7e\xef\xd5\x4b\x4e\x3f\xfa\x4e\xf2\xf8\x6b\x9f\x82\xec\x51\x3d\x37\xbe\x72\xc9\xb5\xa7\xdf\x78\x89\x34\x9f\x5e\x7c\xe3\xd1\xc9\xa7\x24\x6e\xd1\xfc\x45\x8b\xe9\xfb\x6e\xb1\x0f\xdd\x32\xe7\x86\x5b\x6e\xb9\x61\xce\x2d\x97\x9f\x7f\xcc\x09\x63\xc6\x4c\xb9\x65\xd1\xe4\x54\x2a\x15\xb9\x7c\x0a\xf9\xd4\x57\xc7\xf3\xb9\x39\x7e\x5a\x13\x7e\x09\x7e\x7e\x8f\x0b\xc9\xb3\xf4\x21\x78\xed\xe8\xf6\x89\xdf\xef\xff\x06\x00\xa0\xc3\xa3\x41\x0a\x08\xe1\x13\x3f\x11\xa4\xc0\xe9\x80\x01\x13\x00\x0b\x26\x03\x0e\xdc\x04\x6e\x05\x8b\xc1\x1d\x81\x73\x77\x85\x83\x6e\x32\xd2\xdf\xd5\x16\xee\xc1\xce\x45\x87\xfc\xf7\x4f\xec\xef\x1e\x0b\xdd\x43\xef\xed\xec\x75\x8d\x93\xbd\x55\x28\x08\xfc\xdd\xd1\xeb\xb9\x96\xea\x0e\xb8\xc7\xf3\x8f\x24\xfa\xba\x83\x11\xc5\xd5\x57\x0b\x6e\x32\x4c\x0c\xdb\x51\x96\x50\xb9\x78\x5c\xa2\x50\x11\x19\x4c\x81\x4e\xb1\xba\x23\x31\xa8\x6a\x8a\x2a\xa7\xd0\xef\xde\x5b\xb8\x70\xe1\x27\xf6\xd1\xdf\xb9\xf9\xe6\x5f\x2c\x5c\xb8\xd0\xfe\xd2\xfd\xfd\x62\x51\x2b\x14\x20\x40\x43\x92\x68\x98\x29\x46\x96\x59\x95\x2a\x0d\xa7\x54\xb1\x04\xa9\x22\x21\x30\x76\x5c\x50\x39\xce\x62\x59\x93\xe3\x0e\x71\x2d\x3c\x99\x45\x55\x44\x59\x89\xa5\x14\x9e\xd5\xe2\x9a\x24\xab\x48\x8c\xcb\xbc\x14\x9e\x72\xf7\xdd\x77\xdf\x6d\x3f\x07\x6f\x7b\xd0\xf9\x41\xeb\xf0\x2f\xf8\x40\x2e\xa7\xe6\xd4\xa2\x44\xa5\x04\x9e\x36\xb2\x29\x9e\x89\x2b\x6a\x41\xcd\x55\x72\xf6\x90\xa2\x10\x71\x7b\x08\xa6\x91\xe8\xbe\xda\x0a\xff\x87\x98\xcd\x5d\x97\x62\x7d\xfd\xb2\x56\xfe\x2c\x0f\x97\xc7\xd5\xe1\xbf\x1c\x4b\x6e\x7a\xb7\x49\x7e\xc1\xf2\xf9\xa6\x77\x1a\xec\x91\x33\x22\x1a\x69\xc6\x92\xbb\x93\x00\xc4\x22\x1b\xf2\xa3\xff\x55\x39\x1e\xe7\x1f\x72\x91\x1f\x3a\x74\x77\xdd\x67\x23\x80\x3d\xdb\xe1\x19\x07\x66\xc2\xc9\x80\xe8\xfb\xd1\xd4\x2f\xa8\x59\x07\x66\xc0\xa3\x46\x47\xd8\xe3\xb8\x33\x83\x34\x7d\xdb\xde\x00\xcd\xe9\x0e\xf0\x3b\xc3\x5f\xe7\xc9\x75\x7c\xd0\x88\x25\x77\xd3\xd8\x27\x9f\x68\x78\x36\x77\xbe\x3d\x58\x3e\xdb\x0b\x82\xb5\xda\x59\x97\x4f\x0c\x6c\x07\x8d\xbc\x00\xc7\x69\x3c\xdb\x5c\x53\xbc\x56\x4f\x26\xb9\x9d\xc1\xab\x48\x00\x00\xda\xab\xb2\x9e\xaf\x73\x76\x82\x13\x70\x57\xd7\x5e\x9c\x23\x25\x80\x05\x60\x11\xf8\x0e\x50\xc1\x83\x9e\xef\xb4\xb7\xaf\xbb\xd3\x7b\x45\xea\xe3\xdd\xab\x96\x33\xcf\x17\xef\xca\xcb\x1d\xc1\x06\xa3\xdd\x24\x2e\xcb\xd4\xd5\xdb\xd7\xdd\xee\xcc\x11\xc6\x2e\xc4\x8e\x44\xfb\x98\x5a\x3e\xd1\x14\x98\xec\xe8\x26\x3b\xbb\x5a\x18\xdf\x3e\x82\x4f\xa0\xbb\xbf\xfd\x53\xfc\x73\xfc\x35\x93\xa7\x5f\xc6\x43\x30\x29\x35\x37\x31\x69\x3a\x43\x13\xf2\x88\xde\x06\x46\x14\x8d\x50\xe2\x34\x12\xda\xb4\x11\xcd\x08\x49\x15\x4b\x63\x59\x46\x8c\x4b\x34\x6d\x51\x92\xaa\xcb\xa6\x69\x9a\x21\x89\xd2\x45\x91\x89\x42\x29\x1e\xa7\xa2\x72\x94\xe7\x79\x81\x65\xe5\xa8\x72\xa8\x85\xcc\x4e\xfc\xc8\xd6\x60\x9e\x1b\xe2\xca\x7c\x9e\x93\x59\x91\xe3\x79\x91\x13\x78\xf2\x79\x5e\x54\x54\xb9\xa4\x70\x8c\x5d\x46\x59\x55\x42\x25\x9b\xe1\x78\x4a\xa5\x68\x33\x6b\x88\x06\xe4\x21\x37\xa4\xa2\xb4\xca\x72\x68\xd8\x94\x64\x18\x85\xba\xcd\xd2\xac\x16\xcf\x48\x4c\xaa\xc4\x42\x59\x16\x84\x30\xf7\x95\x79\x22\x5e\x1d\x4a\x17\xee\xf7\x69\x4d\xfa\xa7\xe4\xc3\x13\x5d\x67\x73\xae\x8d\x9f\xd4\xa8\x97\x3e\xfb\x7c\x6b\x39\xc4\xfc\x8f\x26\x3c\x71\xe5\x90\xe5\x0d\xe3\x4c\x9d\xee\xf9\x8d\xc3\xe8\xa4\x5f\xf7\xf1\x8a\x71\xed\x63\x5b\xbe\xee\x3c\xc3\x16\x9c\x57\xbb\xe5\x84\x80\x7c\x2f\xc6\x5c\xc9\xbe\xfa\xcd\x13\x7d\x79\xe7\xdb\xe4\x77\xa9\xf9\xfb\x7f\xf2\x8d\x63\xce\xf8\xc1\xb4\xbb\xa8\x05\xe9\xe5\xf0\x57\xa3\xa3\x67\x7e\x3e\x6d\x2b\xc6\xbb\x4f\x46\xff\x72\xe6\x15\xdc\x93\xfe\xbd\x6b\xb6\x9f\x13\xea\x70\x4b\x89\x25\x2d\xc5\x99\xdf\xba\xa3\x41\x57\x09\xe6\x22\xe2\x3a\x4a\x20\x54\xad\x89\x00\x28\xcc\x11\x00\xec\xa5\x22\x9d\x31\x18\x01\x21\x02\xf6\x8c\x03\x1d\x13\xfd\x96\xa7\x0e\x34\xa6\xad\xe8\x10\xa1\xca\x76\xa6\x60\xda\xbc\x04\x35\x28\xb3\x34\x62\x2d\xd1\x34\xcd\xb6\xb2\xa5\xe6\xcd\x3c\xa9\xda\x39\x8a\xb7\x53\xa8\x64\x41\x81\xa0\xec\x34\x1a\x36\x4d\x68\xc1\x68\x1a\x1a\x2c\xd2\xd1\xb0\x04\xa3\x90\x75\xfe\x2a\x4b\x30\x0a\xda\x80\x04\x95\x88\x15\x2a\x80\xb0\x17\xb5\x00\xe0\xd8\x8e\x08\xd1\x33\xde\x7d\x0f\x34\xac\x22\x65\xd3\x32\xb4\xec\x28\x90\xf8\x34\x2b\xd9\xac\x61\x18\x7a\x9a\x60\x24\x3a\x1b\x17\x43\x85\x1c\x2a\xeb\x10\x0c\x0b\x85\x51\xc0\xc3\x68\x21\x25\xa0\x7c\x46\x2d\x14\x4a\x43\x2c\x04\x45\x80\x63\xaf\xd9\x48\x86\x8c\xc6\x92\x03\x6e\x3c\xdc\x71\xf8\xf9\xdb\xc0\x8a\x51\x31\xf2\x32\x39\x0b\x50\x20\x8e\xeb\x21\x82\x6a\x1c\x65\x7f\x17\x11\x21\x71\x20\x65\x2f\x85\xdb\x2f\xc0\xae\x31\x5e\xca\x64\x18\x27\x09\x90\x20\xdc\x33\x0e\xb8\x86\xf5\x36\xc9\xe2\xf5\xbc\x40\x99\x71\x9e\x45\xc5\x61\x15\xc5\xad\x22\x2a\x2a\x90\xca\xc1\x25\x16\x95\x62\x87\xd3\x5a\x1a\x95\x87\xa0\x21\xd8\x66\x5e\x40\x22\xca\xc8\x30\x0b\x4d\x94\x32\x64\x55\xd3\x08\x0e\x51\x29\x5a\xc8\x33\xa3\x80\x67\x79\x99\x88\xa3\x1c\xca\x49\xba\x34\x1c\x3e\x36\x2e\xcb\x8a\x60\xe4\xe4\xbc\x59\x10\xd2\x69\x68\xe4\x50\x8e\xb3\x04\x68\x41\xc0\x0f\xeb\xaa\xe1\x9e\x3b\x5f\xf5\x2d\xbd\xf4\xba\xf3\x6c\xfb\xbf\xe1\x3d\x9b\x9b\x0f\xaf\x82\xa3\xbd\xda\x25\xa0\x23\xd1\xef\x88\x65\x09\xb7\x4a\x60\xb8\xb7\x7d\x0c\x70\x9e\xc4\x79\x3c\x10\xf3\xba\x83\xe1\xf7\x0c\x34\xa9\x34\xd5\xa6\x8d\x28\x02\xe2\x14\xa8\x09\x48\x0b\xe5\xd3\x90\x81\xa2\x82\x44\x4b\x75\x64\x1f\x00\xa3\x02\x41\x5b\x8a\xa6\x1b\x76\xdc\x94\x74\xcd\x08\x1b\x43\x54\xd1\xac\x68\xf6\x90\x09\x8b\xa1\x94\x8a\x52\x2c\xa2\xac\x74\x19\xca\x48\xcd\x99\xce\x37\x52\x50\x63\x50\x26\x23\x17\xf2\x0c\xca\xe7\xa4\x12\x5e\x3b\xeb\xd6\x0c\x76\xd7\xfe\x52\x35\x4f\x60\xd9\x28\x1f\x61\xc8\x7b\xa9\xf9\x2f\xbd\xce\x84\x67\xee\x9c\xf6\x4e\x8c\x3c\xf0\x27\x0f\x66\x9f\x18\x15\x22\x33\x48\x0d\x8c\xc1\x12\x0c\x3e\x82\x04\x45\x78\x24\x37\xd6\x91\x20\x23\x3d\xce\x31\x06\x1d\xf3\xe1\x9e\x89\xfd\x13\xc7\x77\x85\x7a\x88\x6f\x9b\xac\xd0\x56\xd0\xb3\x5a\x86\xce\x6a\x22\x4f\x8d\x28\x7a\x5a\x80\x3c\x1c\x3f\xb0\x7c\xde\xed\xe6\xcf\xda\x3f\x7a\xe5\x2e\xeb\x95\xc5\xe8\x67\x57\x55\x16\xcf\x46\xbf\xb1\xae\x32\x49\x8d\x51\xd5\x11\x15\xa9\x71\x2b\x0e\x53\xa1\x4c\x56\x37\x21\x8d\xca\xc8\xbe\xfc\x8e\x7b\x9f\xb8\x95\x7f\x62\xd7\xe3\xbb\xee\xfd\xcd\x13\x4f\xdc\xf1\xe6\xfa\xbf\xc6\xd1\x06\xba\xf9\x3c\x76\xff\xd8\xd7\x69\x3c\xbe\x7e\x00\xc7\x71\x1a\x71\x50\x3b\x3f\x37\x6e\x08\xc7\x93\xbd\xf4\x7a\x20\x1e\x62\x0b\x79\x47\xac\xe7\x80\x05\x8e\x08\x4d\x8f\x91\x3b\xdc\x3e\xbb\x5c\x95\x87\x0e\x38\x3a\x0e\xe9\xcc\x16\xf0\xb1\x39\xfa\xea\x6f\x1d\x1e\xb9\x27\x0a\x1a\xe0\xe3\x20\xae\xac\xbe\x7d\xb1\x4f\xab\x3c\x59\xe2\xb9\xb7\x70\x5f\x4c\xcb\xbf\xde\xab\xa5\xea\xc1\xd3\x8a\xba\xf5\x6b\xb1\xe4\xde\xfb\xeb\xee\xab\x57\x75\xae\x97\xbe\xe6\x8c\x0f\xbc\x17\x98\x47\xc0\xf5\x56\xdc\x7e\x96\x1f\x06\xc6\x71\x9e\xbf\xb5\x04\xfb\x10\xc4\xc0\xfc\x69\x92\xa2\x16\x9c\x64\x80\x30\x3c\x7b\xca\x5d\xbd\xb7\xc5\xc8\x03\x17\xfb\xdf\x31\x6a\xcf\x30\x70\x46\x40\x4f\xc4\xbe\xcb\x1d\x2c\xde\xbb\xb9\x8d\x7b\x31\x88\xe3\x6c\xf7\xff\xb6\xee\x19\xd8\xea\x19\x1c\xbc\x20\xb0\xa6\x74\x6d\xfe\xfd\x2b\xfd\xf1\x6a\x4f\xc6\x7b\x70\x9e\xd4\xeb\x81\x71\xab\xfa\x0c\x31\x72\x63\x5b\x60\xaf\x03\x7b\xb7\x01\xd5\xcd\xaf\x57\xe7\xdf\x77\x75\x60\xdc\xac\xcd\x33\xf8\xdb\xc0\xfc\x99\xea\x7a\x62\xe4\x8e\x45\x81\xeb\x8d\xda\xf5\x7b\xb6\xd4\x3d\x97\x1e\x4b\xee\x3c\x58\x77\x36\x7c\xf5\x8c\xdd\xeb\x07\x7e\xe5\x8f\xcf\x88\xec\xf4\xcf\x60\xd6\x46\x02\xbc\x31\x7a\xe8\xbc\x7f\x99\xf6\x4e\xf0\xd9\xbc\xbd\xfe\x65\xab\x67\xa6\xc8\x8d\x4f\x05\xd6\xe4\xd6\xd5\xf9\x6b\x1d\xfc\xd6\x6a\xd4\xe1\x18\xe1\x83\xb3\x1b\x9f\xc1\x9d\x7f\x47\x77\x13\x1e\xe0\xf1\x3d\xb8\x66\x20\x08\x83\x9b\x47\xa7\x45\xbe\x47\x7e\xd7\x8b\xb6\x75\xeb\xce\xe3\x74\x02\x2f\xa5\x20\xd1\x9e\x80\x38\x3d\xb6\x33\xd1\x9a\x48\x7b\xc1\x38\xd3\x20\x67\xc2\xa2\x09\x25\x64\x55\x86\x51\x2e\x94\x41\x29\x7b\x33\x99\xfe\x1f\x31\x74\xe4\xff\x4e\xa4\xc3\xf7\xc2\xa8\x9b\xeb\x6a\x20\x06\x16\x50\x0e\x72\x28\x07\xdf\x35\xd1\xb8\xf8\xcd\xf3\x16\x5e\xf2\x44\x76\xde\xab\xcf\xe4\x67\x6f\xde\x0c\x97\x67\xd1\xcf\xa7\xac\xbf\x04\xae\xfe\xfb\x05\x7f\x7c\xf8\xce\x27\xbc\x7d\xc0\x76\xf5\xc1\xd1\x16\xb0\xa8\xfb\xf4\xa0\xcb\xc7\xa7\x6a\x7d\x42\x0c\xd3\xfe\x99\x29\xa3\x5c\x64\x2b\xf9\x60\x6c\xc1\x01\x0b\x44\x43\x6f\x70\x60\xe2\x7d\xd4\x85\x2b\x67\x8e\x7e\xc2\xcd\x9d\x30\xcd\x3b\x1f\xa9\x76\x3e\x03\x1f\xb5\xc6\xff\x4d\x72\xe0\x1c\x1e\xc1\x36\x67\x0c\x63\xbb\x97\x8d\x6b\x38\x9f\x17\xb1\xce\x60\x2d\xf1\xcf\xd3\x9b\xdf\xa5\x2f\x03\x2b\x1a\xcf\x7f\xeb\x6f\xea\xae\x9f\x35\x2a\x44\xd6\x93\x2a\x35\xff\xe0\x87\x10\x4c\xcd\x72\x80\xba\x30\x73\xd7\x04\x30\xe5\x2d\xae\x01\xf6\x77\xcc\xc1\x75\x77\x96\x34\xd2\x8d\x03\x97\xd5\xcd\xc7\xd7\xe8\xdb\x30\x88\x91\x6b\xa7\x44\xab\xeb\xaa\xd6\x3f\xc0\xeb\xda\x7d\x51\xe0\xb9\x03\x38\x64\x96\x5b\xd3\xc9\xdd\x6f\xf9\xd7\x7b\xb5\x84\xf6\x5f\xdf\x44\xaf\x44\x97\x17\x85\xc2\x53\x96\x38\xbc\x68\xc7\xb5\xad\xe6\xa2\xc8\xfd\x27\x34\xae\xf5\xc0\xa7\xb5\x67\x00\x6d\x98\x5e\x19\xb8\x46\xd4\xf1\xd8\x92\x0f\x82\xd5\x01\x60\x62\x62\x5f\x90\x41\x7b\x89\xb3\xd8\x95\x05\x3a\xf0\xff\xbc\xc0\xb2\x50\x26\x0d\x4b\xd6\x21\xd1\x82\xa5\x4a\x19\x0a\xd1\x34\xd5\x96\x1f\x49\x49\x28\xaf\xc1\xb8\x80\x0a\x61\xcb\x94\x94\x4c\x51\x40\xf2\x28\xc8\xa0\xa8\x00\x45\xc8\xa5\xd2\x54\x4a\x90\x14\x9b\x32\x04\x4d\xd7\x48\x15\x65\xca\x48\x83\x5a\x19\x15\x38\x36\x25\x18\x76\x1e\x09\x1a\x34\x60\xb1\xc4\x96\xd3\xba\x60\xa6\xa1\x80\x74\xcd\x14\xa0\x0a\xb5\x94\xa5\xc9\x62\x26\xc7\x96\x33\x62\xda\xdb\x57\xab\x0a\x37\x14\xf9\xd2\xd4\xc0\x5e\xc8\xb5\xbd\x18\xf8\x0f\x1f\x6e\x05\xcf\x47\x84\xfb\xda\x6e\xaf\xf6\x85\xd5\xb0\x1d\xd3\xd9\x23\xdc\xdb\x6c\xf7\xea\x3a\xfa\xe0\xc3\xe5\x8e\x0d\x81\xf9\xad\xc0\xfc\xef\x06\xae\xcf\x04\xf8\xc9\xed\x87\xa1\xe9\xfb\x1a\xcf\xe6\xc5\x74\x03\x4d\xaf\xc3\x93\x8d\x7f\xac\xbb\xde\x7f\xde\x83\xe7\xd6\x3d\x97\x1a\x4b\x3a\x4f\x44\x91\xc6\x58\x7c\xc6\x11\x8c\x27\x2a\xa9\x81\x6e\x2c\x9f\xd4\xaa\x66\xba\x71\xa3\x91\x44\xa8\x37\xd4\x4b\x55\x55\xc4\xfe\x89\xed\xae\xc0\xe2\xc6\x99\x26\xfa\x13\x24\xec\x4f\x44\x5c\xd3\x59\xc4\x33\x9d\xb9\x62\x70\x67\x64\x42\x0f\x2c\x4a\x5c\x9e\x65\x2c\x91\x90\xc5\x61\xa1\xa0\xa6\x45\x35\x95\xe1\xf9\x78\x7c\x04\x68\x9a\x06\xd3\x30\x6a\x67\x20\xc5\xb0\x70\x88\x88\xb3\x28\xc5\x12\x1a\x57\xc9\xa4\x43\xa6\x42\x9b\x29\x29\x2d\xd1\x16\x2d\xda\x69\x83\xb1\xcc\x34\x2c\xf0\x16\x47\xaa\xaa\xa1\x19\x74\x19\xe9\x48\xb7\xd3\x43\xf1\x74\x9c\x57\xa0\xa0\x4b\x0a\xe4\x09\xda\x90\x04\xbb\x38\xa4\xa2\xf8\xd0\x50\xd1\x34\x52\xa6\x91\x4a\x67\x52\x59\x2b\x4e\x8f\x82\x92\x50\xca\x65\xf2\x54\xc9\x68\x41\xcf\xf7\x57\x02\xe7\x95\xae\x9d\xd7\xba\x4c\x00\xcf\xf0\x39\x0e\xbc\x53\x87\x67\x0d\xd7\x1f\xbc\xce\xa3\xff\xbc\xeb\xbb\xf6\xa2\x5f\xdc\xbd\x74\x64\x3e\x1c\x7a\xeb\xea\xda\x5d\xe7\xf4\xb5\x27\x1c\x1d\xa5\xa3\xbb\xaf\xb7\xbd\x77\x62\xad\x4c\x82\x27\x08\x46\x3a\xbd\xb0\x4d\x22\xd2\x03\xda\x43\x8e\x3e\x33\xb1\x2d\x97\x8e\xb3\xb0\x68\x9a\x82\xc0\x2b\x74\x26\x65\x17\xa9\x9c\x99\x8d\x1a\xe6\x10\x03\x33\x76\x91\x48\xa1\x82\xc4\x19\xac\x54\x29\x1b\x0a\xa7\xa9\x59\xca\x52\x14\x49\x16\x33\x3a\x64\x8b\x66\x5c\x34\x04\x52\x4b\x29\xa2\xad\x9a\xb6\x2e\x0a\x94\x1e\x65\x08\x09\x31\xc8\x12\xa1\x02\x65\x93\xd0\x55\x34\x84\xe2\x30\xa3\x9b\xa2\x69\x10\x14\x92\x15\x4d\xce\x1a\x45\xcb\xc8\x67\x8d\xbc\x89\xb2\x45\x19\xaa\x04\x0d\x0b\x29\x64\xa1\x61\x71\xb8\x19\xfe\x06\x0a\xad\xf7\xe5\xa5\xd3\x02\x70\xa9\xd7\xe0\xde\xe8\x6c\x84\x7b\x0f\x1f\xaa\xf2\x1e\x57\xf5\xbd\x1e\xfc\xd0\xa1\x9f\xe9\x39\xf1\x06\xbc\x7a\xb1\xa3\x8e\x3f\xd5\xd3\xb6\xe4\x7e\x2c\x9d\xee\x1f\x1b\xe0\xed\x7a\x75\x4d\x07\xce\xac\xc3\x09\xd9\xc3\x89\xe4\x8b\x27\x63\xef\x6b\xc2\xeb\x81\x72\x6a\x64\x15\x69\xfa\xf9\x96\x0e\x5e\xb8\x15\x14\x49\x3f\x6b\x30\xd2\x33\xce\xed\xe9\x11\x0e\x58\x8d\x4f\x82\x7e\xb5\x9a\x2e\xec\xdb\x77\xb8\xba\xab\x79\x11\xa2\xc9\x10\x59\x8e\x83\x45\x6b\x24\x6b\x29\x2a\x14\x08\x83\x63\xed\x6c\x4a\x24\x86\x2c\x49\x17\x2d\x54\x34\x94\x9c\x9c\xf9\x87\x15\xe5\x78\xbe\x9c\xd6\xcc\x21\x53\x83\x29\xde\xb6\xd0\xf0\x28\xb0\x87\xe5\x90\x88\x18\x4d\xd1\x15\x83\x34\x69\x49\x17\x79\x9b\x25\x18\x3b\x4f\xb0\x82\x52\x94\x78\x91\x93\x8a\x86\x25\x58\x86\x90\x2a\xeb\xb2\xfe\x3e\x95\x35\x38\xc6\x28\xc8\x39\x9d\x63\x59\x4b\x85\x14\xca\x0b\xa6\x06\xcb\x7c\x41\x95\x75\x7f\xef\xb5\xda\x19\xee\xec\xaf\xf3\x97\xe8\xb1\xe4\xae\xa7\xf0\x59\x8d\x09\xec\x71\xb6\xc6\x8b\x0e\x2e\x68\xa4\x51\x69\xba\x8e\x07\x36\xea\x10\x1d\x18\x47\x48\x4f\xbf\xb7\x70\x8c\xd8\x78\x70\x1a\xee\x31\xe3\x61\x89\x67\xa4\x0a\xd6\x0a\x6f\x4f\x4c\x0c\x77\x26\xfa\xea\x0a\x54\xfa\xba\x76\xb2\x27\x24\x67\x69\x36\x04\x46\x40\xb8\x70\x88\x09\x5b\x71\x23\xcf\x6a\xb4\xc1\xc9\x7c\xea\x90\x04\x4b\x1c\xd2\xda\x24\xbb\x2c\xd3\x16\x2d\xc1\x61\x89\x36\x68\xb1\x42\x99\xbc\x64\x2a\xb0\x84\x09\x0c\x69\xa5\x04\x1e\x51\x86\xa9\xdb\x43\x65\xda\xa2\x55\x28\xb6\xb1\xd2\x70\x2e\x57\x89\x67\x32\x4c\x2e\x9d\xd2\x8c\x94\xa9\x45\x99\x51\x90\x11\x0a\x99\x6c\x96\x29\x64\x7c\xf9\x02\xc7\xa8\xec\xda\x8f\x6d\x7c\xbf\x6d\xb5\x47\x14\xb9\x73\x6b\x23\x5e\x1c\xe0\xeb\xe0\xd6\xdf\xbb\x83\xb1\x06\xf9\xa5\x5a\xc3\x1f\xcf\x33\xf8\xba\x47\x5f\xbc\xbc\x0d\x30\x06\xc4\xc1\x89\x80\xc6\xb5\x2e\xbc\x60\xef\x26\xfd\xb1\x23\xd1\x99\xe8\x77\x04\xcd\xce\x44\xac\x63\x62\x47\x17\x11\x8a\x39\x3b\xda\xe5\xec\x6e\xa8\xda\x20\xa1\xdd\x73\x95\xf4\xf5\x76\xba\xa5\x91\x43\xc4\xf7\x22\xf7\x5f\x3f\xef\x99\x7f\x39\xb6\xf4\xdc\xbc\x2d\x5b\x17\xa1\x8f\x2e\x19\x9a\x77\x35\x3a\xf4\xe4\x25\xdf\x6b\x27\x0c\x5b\x39\xe8\xbc\x85\x4f\x40\x29\x8a\x97\x78\x53\x31\x04\x96\xa2\xe3\x06\x2d\x0b\xaa\xaa\xa6\xc5\xbc\xa2\xd2\x15\xc5\x30\xf4\x36\x3a\x9d\x4b\x31\x9a\xc0\x85\xf6\xae\xb9\x6b\xea\x0d\x77\x3d\x70\xe9\x59\x8f\xee\x7f\x60\xff\xe2\x77\x1f\x7d\xf4\xfa\x03\x6b\xfe\xbb\x0b\xe5\x4e\x22\xee\x32\x9e\x31\xe0\x07\x06\x92\x91\x55\x84\x0c\x8b\x44\x54\x46\x65\x01\x46\x19\xe4\x28\xf0\x69\x5d\x4b\xe7\x61\x96\x00\x76\x16\xc5\x91\xee\x90\xaa\x02\x61\x0d\x0f\xf3\x9c\x28\x69\x8e\x7c\xa2\x8e\xb2\x91\x3c\xa9\x62\x5b\xc8\x37\x81\x00\x40\x87\xef\xa5\x49\xb6\xf7\x52\x5d\x89\xce\x44\xac\x0b\x1b\x47\x62\xbd\xe7\x74\x74\x11\xdd\x27\x7b\xe5\xa1\xea\xfb\x42\x34\xc6\xca\xe3\xfd\x0b\x61\x8c\xcd\x42\xcb\xc4\x21\x81\x43\x94\x45\x11\x51\x04\xe2\x9c\xc2\x9b\x8a\xa5\x0a\x2c\x6d\x30\x59\x36\xcd\x5b\x65\x11\x52\x86\x94\x1a\x31\x60\x09\x49\x61\x43\x17\x75\x41\xaf\x5c\xbd\x39\xba\xe2\xea\xe5\xc6\xc7\x5f\xfb\x81\x79\xb7\x66\xdc\x8e\xfe\xf3\xaa\x3f\xce\x3f\xff\x33\xe3\xfc\xe5\xcb\x97\x87\x33\xf9\xbc\x51\x18\x86\x0c\xca\x97\x8d\x51\x30\x94\x1e\x62\x51\xae\x88\x8a\x30\x95\x42\x7c\xd6\xca\xe8\x5a\x3a\x0b\x19\x28\x1a\x85\xb2\x6e\x09\x96\x6e\xbf\xf5\xd8\xbc\x8b\xaf\x5a\xfc\xd8\xbc\x49\x89\x07\xd7\xad\x5a\xb5\xf8\xaf\xab\x56\xdd\xf5\x9b\x67\x61\xe8\xd4\x77\x1e\x9b\xfb\x6c\x50\xa6\xd5\x62\xc9\x03\xf7\x35\xc8\x82\xd5\xde\xf0\x2e\x7e\xbf\x5c\x47\x73\x7d\x19\x61\xdf\xa6\x3a\xd9\xd8\xd1\xfb\xde\x6f\x98\x47\x70\x61\x71\xeb\x4f\x9b\xc6\x03\x32\xcb\xae\x70\x9d\x6e\xcc\xc5\x92\xa6\xcb\x33\x4f\x68\xc4\x8d\x97\x78\xdc\x3b\xf0\xa2\x2a\x26\x78\x9f\x89\x01\x7e\xfa\xab\x46\xfd\xeb\xc5\xd9\x75\xf8\xa1\x56\xeb\xe5\xb9\x3a\xe4\xce\xef\x07\xee\xe1\xcb\xd7\x14\xb9\x6b\xd4\x9f\x67\x52\xe4\x7a\x7f\xad\x17\xbe\xf8\xd0\xfd\x23\xe7\xce\xe6\x5a\xca\x52\xe9\x52\x60\x2e\xb1\x46\xef\x76\xcc\x6a\xc4\xd9\x97\x36\x34\xc8\xfc\x9e\xfe\xbd\xef\xe2\x26\x5c\xb6\x02\x6b\x7a\xac\x51\xdf\xf5\xee\xbb\xbd\x8e\x6e\xe2\xfb\xc6\x41\x8c\xdc\x79\xfc\x50\x95\x5f\x79\x32\xa8\xdb\xcb\x66\xb7\x51\x95\x44\x3d\xbd\x22\x48\x77\x7e\x16\xb0\x9b\xb8\x67\x7d\x82\xf3\x9d\x8d\x38\x63\xd6\x88\xd5\xdf\xe7\xc5\x93\x00\x88\x25\xd3\x97\x54\x2d\x2b\x41\xb9\xd6\xe5\xcb\xcf\xff\xa8\x51\xbe\x1c\x9c\xd1\xf4\x8c\x01\x79\xda\xba\xc6\x1b\x5f\x30\x7a\x59\xe4\x7b\xa4\x1a\x9b\xbf\xf6\x11\xf0\x19\x07\xa6\x1f\x49\x5d\x78\xc0\x02\x70\xda\x3b\x93\x3a\xfc\xef\xe1\x98\x41\xf7\x7b\xb8\x3c\x78\xdd\xb9\x6f\xbf\x3b\xa0\x93\x84\xab\xe3\xa0\x03\xa4\xc0\x99\xb8\x8f\x64\xcb\xce\x64\x5f\x21\x49\x8d\xef\x8a\x24\xa8\x48\x83\x48\x3b\xd1\x65\xe1\x84\x05\x4f\x58\x0b\x8d\xb5\xf0\x04\xf4\xd9\x5a\xa4\xac\x45\x9f\xa1\xa1\xc3\xc8\x53\xa1\x35\xeb\x27\x13\x3f\x9b\x3d\xf9\x97\xf3\x8d\x53\xdf\xba\xfa\xfa\x93\x4f\xb3\xf7\xde\x70\xb7\xfe\x36\x8c\x6c\x9e\xbf\xe5\xfa\xf5\xe1\x42\x3a\x9d\x4e\x1b\xce\x0f\x64\xff\x37\x71\x6a\x23\x63\xd8\x20\x67\xd1\x26\x2d\x9a\x84\x90\xd7\xa5\xe1\x7c\x3a\x2f\xe6\xb2\x75\xf2\xce\x3a\xdc\xfb\xc7\xba\xba\x91\x9f\x6c\x7f\xaa\x49\x0e\x4a\xd7\x60\x6d\xc7\x63\x75\x38\xa9\xc7\x92\x99\xb3\xb0\x0c\x74\x71\x1d\xcc\xfa\xb4\x60\xff\xd3\xad\xe5\xb8\x74\xf1\x30\xfa\xcb\xa2\xd6\xfa\x8e\xb5\xd0\xbf\xaf\x86\x63\x12\x16\x6c\x9b\x3e\x5a\x26\xe6\x72\x60\xc2\xe9\x31\xf2\xa5\xb5\x01\x1f\x83\x1a\x4b\xee\xc1\x32\xdb\x1e\x5c\x5b\x77\xff\x07\xf5\xf7\xd9\xfe\x5a\xe0\xfc\x49\x4f\x0f\x5b\x88\xbd\x61\x27\x80\x1e\xdc\x7f\x0d\x04\xab\xbe\xe3\x8c\x94\x31\x6e\x44\x90\x2b\x8f\xe1\x1c\x29\x4c\xf8\x5d\xe5\xd4\xad\xf1\xe4\x96\x7a\x72\x04\x34\x57\x49\x95\xd7\xa0\xdd\x6b\xd6\xc0\xab\xd0\xee\xd0\x4d\xcf\xf6\xc2\xd1\x2b\x27\x3d\x38\xf3\x54\x34\x7f\xd2\xcc\xc7\x9e\xcd\x0c\x9c\xfc\x18\xec\xbf\x05\x55\x56\xdd\xf2\xce\x2d\x70\x1a\xfa\x41\xc6\x36\x04\x68\x41\x39\x95\xa6\x68\x55\xd3\x04\x53\x52\x8a\x30\x2e\x22\xa1\x92\xb2\x04\xd9\x54\xc9\xce\xca\xc5\x17\x5c\x10\x3a\x68\xc7\x88\x85\x1f\x32\x9b\xee\xa6\xf6\x5e\x76\xd9\x9c\x1b\xef\xbe\xf1\xc6\x9f\xef\xa5\x7e\x8a\x7e\xb7\x69\xf9\xa6\xcf\xde\x5b\x77\xcf\x7b\xf6\x20\x2a\x4a\x26\x03\xa3\xa5\xb8\xc8\xf3\xac\xa6\x32\x96\x22\x0b\xa6\x41\x00\xc6\x90\x04\xd9\xc3\x5f\xef\x1c\xf6\xe2\x38\xc7\xbd\xd8\xca\xb0\xf7\xd2\x00\xad\xf3\xe9\xd3\xa6\x1b\xea\xce\x5a\xf4\x70\x9e\x34\xda\x1b\x75\xc6\xc1\xdd\x58\x7e\x0b\xda\x0c\x78\x3c\xfe\x51\x93\x2d\x41\xa8\xd2\x80\x18\x79\xa0\x9a\x6f\x7a\xe3\x28\x13\x59\x45\x6a\xd4\xfc\x1d\x33\xff\x67\x3e\xb7\x60\xd2\x9f\xa8\x05\x2b\x7f\x33\x6a\x8f\x4e\x99\xfe\xd9\xac\x07\x1c\xfc\x1e\xf9\xef\x69\x5b\xa7\xec\xf7\xd6\xc2\x44\x4c\x92\x89\x25\x4d\x5c\x9b\xd3\xa0\x02\x32\x26\x86\x97\xc1\xd7\xaa\xa7\xee\xdb\x48\x4d\xff\x79\x49\xe3\xd8\x3a\x7b\x87\x1e\x4b\x0e\xfe\xae\x89\xe6\x62\x7a\xb4\xfd\xe9\xba\x71\xa5\xfa\xac\x9e\xbe\x7b\x0c\x86\x9f\xa8\x57\x57\x87\x05\x1d\x75\x5d\x22\x30\x15\xe9\x24\xc3\xc1\xb0\x42\xb7\x28\x3a\x6e\x4e\xd4\x49\xd6\x15\x4d\x87\x5e\x80\x6f\xbd\x48\x1a\x48\x67\x52\xdb\xcc\x02\x1a\x96\x64\x59\x8a\x0b\xb2\x50\xca\x56\xf8\x90\xa1\xa9\x12\x83\x68\xc2\xe0\x55\x4d\x55\x54\xd5\xcc\xc8\x59\x55\x55\x46\x86\x09\xd6\xce\x5b\x10\x8c\x82\xb0\xac\x8b\x96\xa0\xa1\x82\x2c\x58\x9c\x64\x03\x43\xd7\x75\x8b\x60\x25\x26\x93\x12\x49\xd6\x4a\x1b\xb6\x28\x08\x71\x93\x8a\x13\x25\x4d\x45\x71\x41\x94\x65\x5d\xb7\x0c\x59\xd1\x34\x59\x97\x74\x49\x16\x79\x48\xdb\xaa\x0e\x55\x9b\xcf\x16\x84\x42\x96\x4d\xe7\xf8\x6c\x86\x13\x86\x74\xd5\xb4\xd2\x79\x26\x6f\x35\xdb\x80\x76\xff\x4f\x3d\x8f\xa7\xe6\x5b\x4b\xda\xbe\x36\x79\xe5\xb4\xad\x31\x72\x07\xe3\x7f\xd6\x17\xb9\xc9\xf9\xec\xa5\xd7\x8f\x00\xfd\x13\x39\x40\xcd\xda\x75\x32\xd8\x35\xfa\xb7\xc9\x47\x4e\x5b\xe2\xc1\x49\xb6\x66\x2f\x5e\x7f\x54\x00\x7e\x94\xda\xf8\xc1\x62\x6b\x1a\xb5\xf7\xe9\x3a\x1e\x52\x1d\x4f\xee\xc6\x95\xa1\x77\xff\x20\x20\x6f\xd7\xec\x29\xff\xee\xc3\x91\x47\xd7\xb6\x0f\xd5\xd1\xb5\x06\x39\x60\xe0\x17\x81\xeb\xf1\xf3\xef\x19\x8b\x73\xe6\xb1\x66\x32\xf0\x73\xfc\x59\x1a\xfb\x67\xf9\x58\x72\x37\xce\x61\x32\x8e\x6e\xb4\x19\x7a\xb6\xe4\x4b\x41\x83\xdc\xe5\xd9\xd5\x3f\xad\xe3\x91\xba\x4f\x23\x6f\x6b\x6d\x7f\x1b\x78\xab\xf5\xf8\xa0\x6b\x4b\x3e\xb2\xea\xc3\xf0\xba\x98\xba\x95\x3e\xab\xfd\x38\x2f\xf2\x34\xa6\xce\x6e\x6c\x59\x70\x8b\xd1\x76\xf7\xf5\xb6\x63\x3a\xe7\x65\xf7\x76\xb7\x77\x1f\x07\x0f\x53\x01\x2f\xf8\x0e\x8b\x06\x9d\x0a\x47\xad\x52\x09\x52\xc3\x05\x18\x2f\x95\x78\x41\x83\xa0\x4d\x1f\x32\x4b\x66\xa9\x54\x82\xaa\xf3\x1a\x1a\xaa\x70\xba\xa2\xe8\x7a\xd8\x32\xe4\xb4\x68\x54\x86\x65\xce\xe2\x24\x42\x96\x78\x8b\x93\x48\x2d\xc5\x73\x26\x32\x0c\x64\x98\x26\x54\x0c\x48\x0b\x9c\x9c\x47\x1c\x54\x90\x51\x7d\x21\x50\xfb\x9f\x9d\x11\x8a\x9a\x6a\x98\x66\x56\xc8\xa4\x39\x23\xc3\x67\x75\xde\x48\xf3\x19\x3d\xb8\x27\xb5\xf3\x7b\xb3\x8e\xb6\xd1\x3e\x6d\x3b\xca\xe3\x0b\x97\x60\x7e\xb1\x11\x1c\x0b\x8e\xc7\xf5\x07\x66\x83\x2b\xaa\x39\xd1\x55\x0d\x27\xd9\x03\xb1\xf4\x8f\x7b\x16\x54\x53\xc9\x83\x6d\xa7\xdb\x13\x6e\x07\xab\x50\x57\x40\x85\xf7\x6d\x9a\x2e\x86\xb7\x45\x45\x96\xf8\xe8\xd0\xb8\xfc\x77\x5f\x21\x3e\x4a\x31\xe8\xa5\xf3\x2f\x3f\x1f\x8e\xbd\x6f\xc5\xf9\x77\xae\x80\x53\x89\x07\x56\xfc\xe9\x4f\xdf\x9c\x7f\xdf\xa2\x13\xee\xbc\xef\xe4\x13\xec\x87\xff\x78\xe3\x94\xfb\xce\xba\x71\xac\x15\x67\x38\xbe\xa4\x1b\xe9\x4c\x59\x2f\x0a\xb6\x89\x86\x0b\xb6\xc1\xc3\x3c\xd4\x10\xa7\xc9\xaa\xa2\x91\x1b\xf9\xf9\x0f\xa1\xe5\x68\x03\x7a\x6d\x0e\x0c\xc3\x59\x44\xa8\xf7\x74\xfb\x5b\xd3\x7b\x9f\x7e\xf3\xf3\xd3\x1e\x7f\xc2\xde\x49\xfc\xe3\xe9\xa7\x1f\x47\xd7\x2c\xbe\xec\x98\x27\x8e\xfd\xfa\x79\xf0\x31\x7e\xf1\x43\xfc\xfd\x8b\xd0\x73\x71\x4d\xe2\x52\x9a\x29\xa6\x15\x29\x95\xc2\x2a\x7e\x49\x36\x38\x98\xca\x71\x39\x59\x56\x5a\xf9\x35\xb6\x1e\x5f\x47\x07\x55\xf0\x0d\x9c\xdd\x79\x5a\xa0\xcf\x6b\x8b\xe6\x38\xb8\xc1\x43\x47\x57\x24\x91\xec\xe9\xe8\x4b\x44\xfc\x46\x39\xe1\xc3\x10\xc0\xb6\xb8\xcc\x11\x92\xad\x11\x9c\x9d\xc3\x2f\xeb\x90\x65\xf2\xbc\x08\xe3\x9a\x25\xc2\x3c\xc3\x2b\x76\x99\x22\x68\xbb\xe4\xbc\xda\x0a\x5f\x41\xf7\x54\x55\x37\x2c\x3d\xad\x5b\x06\x4b\xe4\x44\xde\x80\x1c\x94\xd8\xbc\x28\xa0\x94\x45\x6b\xa8\x90\x4e\xa3\xa2\x65\xe5\x0e\x43\xee\xdc\xe7\xf7\xec\xea\x8e\xfc\x14\x23\x9f\xbe\x26\xe0\x1f\x08\xe8\xd7\x6b\x86\xea\x70\x51\x89\x25\xd7\x7c\x49\x81\x18\x99\xb9\x8a\x69\xc0\x75\xd7\xce\x9b\xb9\xdf\xb3\x91\x3b\x7c\xec\x4a\x52\x05\xdd\xa0\xdf\x83\xb9\xba\xd0\xf4\x1a\xe3\x18\xd7\xe1\x16\x9a\xea\xeb\x1d\x13\xf1\x25\xd6\xde\xce\xee\xff\x83\xc4\x1a\x11\x2e\xbd\x64\xca\x25\x63\x6f\xa6\xa6\xa3\x1f\x93\x47\xfe\xf4\xa6\x4b\x1e\x5d\x3d\x73\x78\x0a\x1c\xd3\x83\xde\x5e\x05\x7f\x1e\x7e\x3c\x6c\xef\x81\xf0\xbb\xf0\xb4\x07\x3e\xfb\xec\x01\xf4\xde\x77\xd1\x28\x9a\x6d\x88\xac\xb6\x6c\x0d\xb5\xe9\x3b\xca\xdc\xa5\x62\x46\x83\x6c\x41\x8b\x8b\xaa\x10\xfa\xb8\x32\x59\xbe\x89\xde\x4c\x0b\xa1\x23\x79\xf6\xad\x97\xb5\xc2\xe6\xdf\xa7\xf5\x7d\xf0\xd6\x4a\x5b\xdb\x4a\x49\x55\x25\xf8\xc7\x9d\x3b\x77\xee\x7c\xee\x99\x67\x9e\x79\x06\x5e\x84\xe4\xb9\x4b\xe5\xdd\xcb\x8a\x96\xf1\xf6\x01\xe3\x87\x2f\xd4\xe4\x56\xda\x91\x5b\x85\xe1\x26\xb9\x3f\x46\x6e\x3f\xc2\xdb\x47\x03\xf7\x28\x51\x63\xc9\x5d\x96\xa3\x5b\x6c\xbb\x0a\x30\x31\x72\xdb\xd5\xbe\xdc\x87\xe3\x51\x1c\xae\x4f\x25\x37\xe0\x2a\xdc\x9b\xbf\x6c\x96\x69\x28\xf2\x85\x52\x80\xa6\xca\x01\x7b\xe3\xcf\x7c\x3d\x50\x08\xea\x81\xc6\x91\x8d\xf2\xeb\xb6\x7f\xc3\xfa\xd0\x8f\x1a\x69\x76\xf0\x1c\x1b\xf9\x45\x8c\xdc\x34\x3b\x30\xae\x06\xfc\x48\x7f\x0e\xc8\x29\x6e\xfe\x89\x6b\x23\x3b\xc2\xb7\x5b\x7a\xbc\x62\xcd\x97\x78\x9e\xaf\xd5\xc9\x35\xf3\x62\x3d\x4f\xaf\x02\x47\x84\x96\xc6\xc8\xbd\x42\x33\x1c\xc6\xc8\xb5\x3f\x6c\xe4\x39\xdb\x1f\xc6\xf1\x65\xf7\x55\xa5\x9b\xe6\x3d\xdf\xf6\xdd\x00\x4c\x07\xf9\x4b\xde\x1b\xff\xce\xe8\xb4\x48\x9a\xbc\x89\x5a\xb0\xfa\xa8\x51\x1b\xac\x9f\x1e\x3d\x0f\x38\x52\xda\x11\xff\xe0\xce\x9c\xfc\x72\xcd\xdf\xeb\xf0\x7e\x02\x4c\xbd\x90\x73\xe6\xac\xea\xec\x97\x8d\x8e\x89\x9c\x45\xaa\xd4\x82\x03\x10\x0e\x8d\xfe\xfb\x19\xcf\x72\x9f\x51\x0b\x9e\x79\x1b\xbe\x37\x3a\x7c\xfa\xbb\x53\x7f\x47\x5d\xb8\xff\xb7\x61\x30\x29\xcb\xb9\x6b\xee\x8d\xfc\x20\xe0\x67\xbe\x7f\xe6\x17\xad\xf8\xdb\xae\x68\x60\xaf\xf0\x59\xaf\xc1\xbe\x58\x67\xc7\xbc\x71\xc1\xab\x53\xf5\x5e\xdd\xb8\xef\x9b\xf4\x68\xd9\x1f\x02\x3c\xdd\xa5\x71\x18\x9e\xb6\x60\x4b\xc1\x96\x4b\xea\xe9\xdf\x0b\x07\x5b\xdb\x8b\x1d\xc8\xa0\xc8\x17\xce\x08\x8c\xe7\x6a\x7b\xbb\x73\x49\x6b\x7d\x68\xfb\x37\xeb\xe0\xc6\x1f\xdf\x92\x6f\xed\x9f\xc9\x14\xeb\x6c\x2f\xbe\x6c\xb0\xe5\xe5\x80\xbd\x3b\x53\x85\x1b\x2a\xb9\xff\x18\x7c\x82\x1f\x06\x78\x9e\x16\x4b\x6e\x2e\xd4\xd9\x53\xf8\xaa\x8d\xd0\x85\xe5\xad\x57\x07\xe0\x00\xeb\x55\x5b\xef\x6b\xf0\xe1\x7a\xcf\xbc\xad\xec\x5c\xef\x40\x60\xbd\x4e\xbf\xe5\xce\x16\xb2\xb5\x1a\x4b\xbe\xb4\xa3\xc1\xf6\xe2\xe5\xdb\xed\xfe\xa6\x33\x6e\xfe\xa2\x8e\x37\x0b\xb1\xe4\x8e\xa9\x38\xd6\x1f\x73\xe8\x1d\x53\xfc\x33\x32\xfc\x33\x22\xb7\x2f\x6f\xb4\x99\x6c\xa5\xeb\xfc\xaa\x42\xb5\x56\xb5\x47\x07\xfa\x5b\xeb\x99\x83\x9f\xd6\x3d\x9b\xe0\xeb\x0d\x5f\xab\xb3\xa5\x48\xb1\xe4\xaa\xd1\xba\xb8\x91\x86\x79\x8c\x68\x60\xef\x30\xbe\xbf\x70\x3e\x68\xf4\x7f\xd7\xec\x28\xa4\x11\x09\xac\x1f\xe3\xe2\xd6\xd3\x41\xa3\xff\x39\x00\x2f\x6b\xca\xad\xef\xbb\xf6\x6e\x9f\x5e\x7a\x67\xb6\x0d\xc7\x13\x6e\xc3\x1d\x80\xbd\x7e\x7e\x0d\xb0\xb7\xa5\xa7\xb5\xad\x79\x2b\x68\x0d\xab\x07\xfe\x08\x1a\x7c\x80\x3b\x56\xe1\x38\x53\x57\x33\x22\x03\xcf\xc7\x54\x3f\xdb\xb1\xba\x0a\x69\x41\x38\xd8\x32\xa1\xb5\xbd\xeb\xa5\x97\x41\x4b\xdf\xb7\x47\xab\xe3\x75\xb8\xe5\xd3\xd8\x03\xc7\xfb\xe3\x6c\x9d\x2f\x0d\xe7\x1f\x81\x23\xbc\x35\x5d\x05\x8e\x03\xdd\xe0\x0c\x5f\xee\xbd\xcc\xed\x66\xd5\x81\xeb\x92\xe1\x98\x89\xfe\x04\xd9\x5d\xd3\xcf\xba\x3b\xaa\x29\x96\xb5\x64\xcb\xc0\x5f\x87\x95\x81\x7b\x83\xa2\xa0\x23\x2d\xff\x29\x04\x90\xc2\x41\x2b\x8e\x8a\x28\x2d\xc2\xb2\x80\x72\xd1\xa8\xc8\x09\xbc\x98\x62\x04\x4b\x2e\x72\x3a\xcb\xf3\x8c\xc6\xc9\x12\x34\x0c\x8e\xe7\x9c\x3f\x65\xa8\xe9\x2c\x8b\x47\x45\xfb\x37\x86\x23\xbe\x84\x73\xa6\x68\x8a\x3a\xca\xca\xbc\xc5\x89\xa8\x28\xd3\x99\xb8\xd4\xd6\xb1\x69\xee\xca\x45\xd7\x25\x16\xdd\x7c\xde\xa9\xe8\xd6\x75\xeb\xda\x38\x55\x29\xa1\x21\x51\x55\xca\x51\x96\x95\x79\x86\x89\x2b\x4a\x96\x78\x8a\x51\x44\x5e\xe0\x55\x49\x55\x19\x59\xe0\x79\x5e\x91\x14\x8d\x91\x04\x41\xe0\x55\x59\x39\xf4\x37\x31\xab\xa8\x9a\xae\x5b\xa2\x69\x08\xba\xc5\xa7\xf5\x94\x69\x30\x96\x11\xfe\xb7\x91\xb7\xef\xba\xfe\x38\xf3\xf8\x93\x27\x85\xee\xb7\x4f\xac\x9d\xaf\x03\x5f\x7f\x6b\xb0\xff\xd4\xf9\xaf\x77\xcf\x6d\xa4\xb5\x03\x6f\x34\xf9\x2b\xf4\x00\xcd\x79\xc3\xbf\xde\xb3\x4d\x6e\xd9\x0a\x82\xfe\x71\xdf\x8f\x81\xe9\xac\x5b\x0d\x9a\x1c\xdc\xee\xd3\x79\x0c\xbf\x6b\x7e\x45\x83\x18\xb9\x6f\xca\x50\x03\x6d\xde\x72\xa0\xce\xb7\x22\xfa\xf4\xff\x03\x7c\x6f\xa1\x11\xde\x5c\xbe\xb3\xf5\xf9\x3a\x5c\xf6\x69\xc8\xda\x09\x75\xf4\x51\x73\xd7\x14\x23\xd7\x8f\x89\x83\x16\xb2\x72\x32\x9d\xc1\x4f\xb2\x37\x60\xaf\xd0\x63\xc9\x7d\x53\xf0\x7e\x1c\xf2\xe7\xea\x75\xed\xca\x18\xa6\x23\x1b\x68\xe2\xe0\xe8\x17\x7e\x0e\x8d\x4f\xef\x36\xff\xb3\x91\xef\x6c\x9e\x5e\xf7\x6c\x0a\x8e\x53\x70\xe4\x89\x05\x65\x10\x23\xd7\x7c\xc9\xb4\x5a\x13\xb9\x99\x69\x25\x97\x50\xa4\x11\x6e\x4d\x13\x36\x9f\xe8\x8d\x5f\x3a\x7a\x59\xe4\x6d\xf2\xd6\x58\x8f\x9e\x05\xe3\x88\xdf\x3b\xfc\xff\xbf\x3e\xe6\xe6\x9e\xf9\x07\x9f\x5e\xf8\xfe\x51\xeb\x30\x3e\xf1\xc1\x0f\xeb\x78\x98\xaf\x0f\x6f\xb8\x3a\x70\x3e\x86\x2f\xd7\x91\xd6\x23\x75\x3a\xba\xc3\x17\x26\xfb\x7c\x21\xb9\x63\x12\x5e\x77\x5b\x6b\x7a\xe9\xf7\x27\x96\xab\xf1\x83\x2e\xdd\x5d\x5b\xa9\xa3\xf7\x46\x2c\xb9\x76\xa4\x8e\x97\x39\x6b\x7e\xce\x9f\x67\xfe\xda\x15\x57\x51\x53\xd7\x72\x80\x9a\xf5\xf8\x24\xe2\x56\x70\xc1\x59\xff\x3e\xe5\x5d\x2f\xee\xe1\xac\xc8\x02\x52\xc5\x71\xf5\x6e\x35\xd3\x89\x60\xb2\x1b\x43\x8f\x4d\x3b\xf5\x7d\x24\x13\xb5\x22\xa6\xe3\x0f\x23\xa7\x47\x7a\x26\x86\xb2\xa1\x23\x2b\x7f\x7f\x1a\x7e\x89\x8e\x25\xbe\x78\xdc\x4e\x7d\xf7\x71\xa2\x60\x33\x70\xc5\xac\x38\xdc\xfe\x40\x65\xff\xa3\xc4\x11\x63\xfb\x2a\x3b\x0d\x81\x51\x25\x33\x65\x2a\xb2\x24\x89\x96\x06\x99\xbc\x11\x17\x74\xbe\xed\x56\xfb\x0f\x8f\x43\xc2\xfe\x83\x7d\xb3\xa2\x10\x1b\xd1\xf5\xf0\xb8\xf0\x99\xf3\x66\xa3\x4c\x2e\x0f\x45\x56\x4c\x21\x49\x92\x25\x4b\x13\x86\x0a\x69\xd3\xcc\xe8\x28\x5d\x94\x61\x9a\x50\x61\x9c\x46\xd9\x61\x61\xa8\x95\x3d\x70\x56\xdd\x1e\xaa\xb1\xe4\x01\xec\x97\x30\x42\x8d\xf2\xe2\xc1\x3d\x75\x38\x7e\xd9\xe8\x05\x91\x9d\xe4\xa3\xd4\xfc\xfd\xbf\x85\xbd\xd3\x8e\x9a\x1a\xa6\x2e\x5c\xff\xe2\xd2\xf0\xe4\x7e\xae\x95\x8d\x2e\x99\x69\x77\xbe\xed\xc9\xf6\x42\x35\x2f\xdb\x5d\xc3\x96\xab\x41\x4b\x38\x1e\xdc\xda\x9a\x1f\xae\xf9\x3c\xc0\x5b\xe6\xd5\xe8\x8c\xf5\xf6\xdb\x41\x38\xd1\x62\xc9\xcc\x7d\x4d\xf2\x5c\x40\x36\xb4\xee\x6a\xb4\x17\xec\x38\x0f\x43\xdd\xb9\x01\xbe\xd6\x70\xef\x75\x5b\x1a\xe9\xc9\xbe\xfb\xeb\xf8\x9a\x88\x75\x49\x9f\x06\x04\xfa\x8b\x55\xeb\x43\x62\xb8\x1f\xf8\xa9\xbf\x26\xcf\x3f\xe6\xda\xee\x07\x7e\x02\x1a\x6c\xf1\x07\x6e\x00\x8d\xfe\xb1\x80\x4e\x3a\xf0\xe3\x00\x7f\x34\x6b\xf3\x3c\x97\x09\xcc\x1f\xf0\x0d\xac\xfb\xb4\x51\x26\x35\x37\x36\xf9\xa6\x6b\xb2\x6a\x72\x87\x5b\x5b\x83\xa8\x5f\xab\x4b\xa7\x77\xe3\x2e\x25\x06\x0c\xc8\x0d\x5a\x8c\x14\x5c\xfd\x43\x1a\x4d\xb9\x67\xb9\x1b\x4b\x09\x06\x08\xe0\x64\x2d\xbe\x35\x99\xbe\x00\x7b\x0e\xce\xaf\x3f\xb7\x75\x7a\xc3\xb9\x79\x3d\xa4\xdd\xfb\x7a\x72\xef\xeb\x3e\x0c\x64\x6a\xf6\xb5\x81\x63\x1b\xf7\xcf\xa5\x09\xab\xab\x3e\xbe\xc5\xa3\x97\x44\x36\x90\xf7\x52\xf3\x77\xb0\x91\x43\xd3\x4e\x9c\x7c\x0a\x35\xeb\x99\x73\x1d\xd9\x8a\xfb\xd7\xf3\xee\xf4\xed\x94\x6a\x2c\x39\x28\xd6\xc5\x52\x09\xd5\x5e\x69\xde\xbe\xbf\xd6\x1a\x36\x37\x57\xeb\x6e\x4a\xa3\x5c\x24\x8f\xc7\x71\x8e\xfd\xfe\xcf\xaa\x1c\xd5\xb7\xd7\x4b\xb1\xe4\x4b\x6d\xd8\xc7\x19\xc2\x27\xbc\xb8\x5e\xa7\xf3\xe4\xa2\x9c\x67\x8b\x71\xc6\x9f\xf0\x7b\x31\x76\x81\x33\xc1\x24\x5c\x53\xb9\x2e\xde\x2e\x1c\xac\x8c\x88\xe9\x0f\xf6\x5e\x05\xda\xfc\x4c\xf4\xda\xfc\xb8\xdd\x70\xbf\xc2\x9e\x10\x6e\x7b\x12\x9e\xf6\x58\xe5\xb8\x07\xe1\x19\xe8\xce\xd0\xc6\xca\xcd\x2b\x89\x87\xed\x07\x9c\x57\x88\xbe\x61\xe3\x2f\xe3\x67\xdd\x40\x9f\x7c\xf4\xa3\x27\xdd\xbe\xed\xd1\xcb\x56\x6e\xac\x14\x57\xc1\x53\xd1\xfb\x6b\x1f\xed\xf9\xe5\x0f\xa7\x21\xe2\x70\xd1\x45\xd7\xa1\xf7\x3e\x44\xeb\xe1\x82\x0f\xdf\xb4\x7f\x06\xaf\x5a\x80\x72\x4b\xd1\xf7\x6e\xbd\xb4\xef\x3f\xe2\xb1\x44\xe2\x81\x53\x5f\xb9\xb6\x8f\x27\xfa\x5f\x39\xf5\xf1\x1d\x0f\x56\xc6\x9d\xaa\xcc\x38\x65\x12\xf9\x97\xff\xcd\x2b\xd6\x52\xbf\xda\xd7\xa4\x8f\xad\x27\xb0\x9e\xf6\xa3\x3a\x1c\xd2\x7d\x1a\xf8\x74\x00\xce\xac\x9a\xbe\xb7\xb6\x1a\x7f\xa4\x57\x73\x7a\x07\xfe\x05\xe3\xd0\x8c\xc3\xe8\x7b\x8f\x04\xe6\xd9\x47\x1a\xd4\x7c\xe3\xce\x19\x60\xca\x47\x5c\x3d\x7e\xb1\x75\x31\x7f\xaf\x36\xe2\x9d\x8b\xa7\x6b\x7e\x17\xd0\x7f\x31\xbe\x1c\x58\xdc\xa0\xe7\xb2\xc1\x67\x1e\xf8\x61\x6b\x5d\x73\xb0\x18\xe0\xbb\x01\x59\xe3\xe0\x11\x8d\xb2\x86\x37\xcf\x0f\x40\x03\x0d\xf5\xe2\x40\x7f\xe3\x8d\xb3\x7e\xcd\x01\xac\x41\x6f\xbb\x38\x00\xef\x38\x4f\x68\x1b\xd6\xf7\xb6\xcd\x6e\xbd\x47\x03\xaf\x04\x9e\x0b\xf3\xe6\x81\x6c\xc3\x73\x79\xb6\x38\xf7\x0c\xfc\x5e\x07\xbe\x0d\x1f\xd3\x55\x37\xeb\x9c\x1c\x78\x39\x70\x6f\x87\x56\xbe\x85\x71\x1d\x1d\xe6\xde\xdf\xaf\xb3\x05\x68\xb1\xe4\xa6\x53\x30\xed\xfb\xa0\xd5\xf9\xc7\x92\x4f\xff\x0e\x4b\x0d\xf3\x5a\xe1\xf9\xc0\xc1\xc0\x39\x48\x81\xf1\x03\xad\xe9\x82\x25\x07\xf8\x80\x59\x93\x4f\x37\x1e\x02\x5f\xd4\xdf\xdb\xbb\x7e\x41\xa3\xcc\xfc\xf4\x99\x58\xf6\x5e\xdd\x5a\xbe\xb2\x6e\x6d\xe4\xe3\x1e\xdd\xb3\x5b\xc9\xbf\x14\x39\x10\xec\x51\xa8\xd5\xec\x22\xdb\x4f\xc1\xdf\xaa\xd4\x7f\x86\x47\x3d\xc8\x59\x3d\xe2\xdd\xc7\x5b\x57\xe6\x7b\xce\x67\x5b\x67\x82\x5a\x9c\x81\x5a\xd5\xd5\xcc\x7f\x6f\xd0\xfd\x1d\x58\x66\xab\xb9\x0d\xab\x0f\x05\xd6\x80\x79\x9a\x7b\xb6\x6b\x57\xe0\x4f\xff\xa7\x59\x4f\x8c\x91\x1b\x0f\x78\x7a\xdf\xfc\xd1\x49\x11\x93\xbc\xd3\xcb\xf2\x76\xeb\x09\x4f\x06\x33\xc0\x15\xb8\x82\x48\xa4\x27\xe6\x68\x78\x6e\xb0\x52\xaf\xd7\xa0\xca\xcb\xdc\xed\xec\x86\x7d\xdd\x9d\x1d\xde\x2b\xdc\x14\x2c\xe6\xa9\x7a\xf5\x2e\xe2\x18\xc4\xb4\xb1\x0b\x17\xd3\x4c\xc2\xaf\x4b\x7c\x4e\x34\xe8\x54\x99\x66\x0c\x96\x2e\xa1\xe1\x52\xa9\x54\x82\x51\x5b\x31\xa0\x3e\xec\xfc\xb4\xfd\xde\x90\x4c\xc1\x1c\xe1\xb1\x7a\x17\x2a\x2a\x42\x9a\x97\x51\x51\x49\x65\x52\x32\x71\x9b\x49\x13\x29\x81\xd5\x38\x1a\x09\x0c\xaf\x6b\x30\x25\x95\x14\x28\x19\x94\x0e\x69\xa5\xd4\xd6\xad\x9b\x90\x82\x0c\x23\x4b\xb2\xc8\x28\x9a\x6e\x39\xff\x0c\x2e\x44\x5b\x16\x2a\xba\xaf\x42\xae\x24\x96\x72\x9c\x30\x0a\x0c\x35\x9d\xb6\x72\x7c\xde\x4a\x65\xb3\x6c\x21\x13\xde\x1a\xcf\x1a\x54\x49\x12\x54\xcd\x32\x38\x48\xdb\x06\x1a\xca\x6b\x90\x26\xb8\xa8\xa5\x20\x2d\x6b\x64\xbd\xb8\x18\x7c\xae\x99\x0e\x2c\x9b\x75\xe2\xfd\x1e\xf6\xe1\x30\x10\x07\x39\x90\x01\x0d\xb6\xc6\xc1\x93\x40\x7d\xfc\x9e\xe7\xc7\x72\x6d\x2a\x83\x1f\x34\xf2\x4b\xd7\xa6\xbe\xf1\xaf\xad\xe9\xd3\xc0\x4b\xad\x75\x92\xc1\x43\x75\x78\x54\xe3\xbb\x7b\x03\x78\x94\xae\xc1\xad\x2b\x8b\x78\x75\xb5\x39\xbf\xc7\xe4\x9e\x06\xda\x52\x87\xdf\x2b\x5f\xc5\xd8\xbf\x03\xd7\x1b\x76\xe8\xce\x56\x72\x25\xe8\xf0\xea\x34\xb9\x35\x73\x97\x83\x47\x0f\x13\x3b\x72\x0c\x8c\xf4\x4c\xec\xc0\x99\x5a\xc1\x38\x91\x6e\x6c\x42\x70\x8d\x0c\xde\x7b\x7f\xd7\xc4\xfe\x93\xe0\xc4\xfe\x6e\xb2\xe3\xff\xd2\xd8\xa0\x91\x21\xc7\x5c\xc5\x21\x46\x14\x21\x8d\xeb\xfc\xd1\xa8\x84\xeb\xfc\x95\xe0\xd8\xb9\xb3\x2f\x58\xf8\xea\xc2\xc7\x8f\xed\x0a\x9d\xdc\x77\xe6\xfa\xbe\x0b\x4e\x5a\x78\xe6\xc4\xae\xb1\x37\x7f\xe3\xaa\xf3\xa7\x5c\x75\xdf\x42\x73\xde\xd3\x73\xef\x7c\xfa\xdf\xe6\xbd\x71\xe7\x9d\x53\xee\x3b\xb3\x6b\xca\x9d\xe7\xf7\x3c\xd1\x75\xc4\x82\x39\x37\x8a\x0b\x7e\xf1\xec\x59\xd2\xf7\xd9\x75\xc7\xca\xe8\xaf\x2f\x2f\x21\x7e\xb3\x64\xce\x92\x39\xf7\x54\xfe\x73\x55\xbf\xb0\x6a\x0e\x9a\xa9\x33\x71\x99\x53\x28\x55\x92\x78\x81\x35\xb5\xe1\xb4\xce\x70\x2a\x17\xb6\x71\xa4\x8a\xa6\xa9\x2a\xca\x6d\xfa\xd6\x05\xd7\xbe\x0e\xfb\x4f\x9c\xda\x6f\xbf\xfe\xf4\x5d\xc7\x3c\x7c\xcc\x05\x4b\xe0\xe3\xdb\xcc\x13\x4f\x59\x72\x81\x79\xd7\xb7\xee\x5a\x76\xf6\x0f\x1e\xbe\xf2\xe9\x27\x4e\x91\x4f\xb9\xf2\x8a\xf7\x4f\x59\xf6\xf0\xed\xf6\xcf\x2f\x99\xbf\xfc\x9e\xab\xcf\x47\xff\x79\xf2\x71\x33\xe7\xf7\x0e\x5e\x3f\xfb\x6a\x78\xf1\xfa\xcd\xcb\xff\x65\xcb\xf9\xbd\x9f\x18\x57\xef\x0c\xbf\x8b\x58\x51\x14\x32\x9a\x94\x49\x9b\x96\x66\xaa\x28\x57\x96\xa1\x46\xf0\xd0\x60\x50\x7a\x88\x83\x74\x4d\x57\xf7\xf9\xf6\xb3\x6c\xb1\x81\xd6\xba\xf2\xe1\xce\x7f\x75\x4e\x7d\xe7\xab\xad\x64\xfe\x9d\xb9\x00\xbf\xc2\xf6\xcc\x7d\x2e\x55\xab\xf5\x8b\x9a\x16\x79\x8c\x54\xa9\xf9\xc6\xb7\xee\x39\x66\xd2\xd4\x69\x5b\x5b\xf1\x07\x0f\x16\x77\xd7\xc1\xae\x8f\x33\xcf\x4e\xac\xd3\x9d\xaa\xe3\xc9\x9d\x58\x96\xde\xe9\xca\xad\x73\x46\xb9\xc8\x8f\x49\x95\x5a\xb0\x63\x35\x91\x02\xe0\x2c\x9c\x99\xbe\x63\x15\x71\xf4\xe8\xa7\xe7\x98\x33\x8e\xa6\xe6\xef\x9b\xd2\x06\x26\xbf\xe3\x68\xa5\x07\x4f\x80\xdf\x06\xa0\x6f\x36\x57\xd3\x91\xfc\x58\xa8\xe7\xbf\x19\xe0\x9b\x01\x5b\xf5\xba\x5f\x7b\xe3\x53\x46\xd9\xc8\x8b\x8e\xbc\x6b\xde\x74\x02\x98\xa6\x72\x80\xba\xf0\xe0\x87\xff\x0c\x4f\x7d\x7d\xda\x3b\x81\x67\xf2\xed\x6d\x1b\x7b\x03\xfc\x59\xc3\xfd\x6c\x5e\xac\xc3\x21\x37\xb6\x86\xad\xca\xf5\xab\xdd\x3e\x02\x5f\xc3\x35\x5c\xb2\xe4\x2a\x2f\x03\x9d\x06\xe3\x40\x0a\x4c\x05\x57\x00\xd1\xc1\x9f\x9e\xfe\x2e\xaf\xdb\x47\x7f\xa2\x2f\x11\x0e\xe6\x93\x07\x0b\x33\x55\x4b\xf9\xe0\xfa\xef\x7e\xcf\xaa\x2a\x4e\xb4\xbb\xa5\x7c\x88\x90\xaf\x4b\x13\xdb\x89\xb3\x4e\x5e\x7c\x26\x31\x7d\xa4\xeb\x0f\xa1\x13\x2b\xbf\x93\x89\x4b\xec\xfd\xa1\xc5\x17\x5f\xdc\x7d\x66\x17\x77\xf2\x84\x0a\xbf\x18\x8e\x21\xe6\xd9\x1b\x6e\x87\xab\xd0\x77\xd0\x52\x82\xd2\x88\x38\x12\x4a\x90\x12\xd0\xdf\x2a\xda\x0f\xd1\x01\x09\x7e\x7b\x2f\xe2\x91\x61\xb0\x29\x55\xd4\x96\x2e\x9a\xcb\xce\x63\x0b\x2a\x8c\x66\x34\x4a\x50\x39\xb2\xeb\xe2\xd3\xef\xb9\x7d\xf6\x88\x70\xe5\x9f\x91\x7a\xf9\x37\x8f\xbd\x3b\x32\x69\x04\x5d\x45\x9c\xb0\x15\xfd\x43\xba\x02\xad\x34\x0c\xa5\xac\xa8\x4f\x55\x10\x07\x33\xc5\x8c\x6c\x0e\x85\x39\xc4\x0b\xa2\x64\x28\x68\x58\x5d\xf6\x88\x22\xc9\x48\x19\x05\x12\x14\x08\x00\x87\x1c\x05\x9c\x2f\x37\xcb\x55\xdb\x97\xb5\x96\x17\x06\x76\x1d\x46\x3e\xdb\xd9\x68\x6b\x5e\xff\x67\xd0\x18\xd3\x10\x80\x83\xfd\xa8\x51\xb7\x76\xc7\x57\xff\xbd\x4e\x3f\xd4\xaa\xe3\x83\x9b\x5b\xea\x69\xe4\xea\xbf\xd5\xe9\xab\xfe\xf5\xe6\xcf\x5b\xd1\xf5\x18\xb9\xfe\xf8\xc3\xe8\xdc\x33\x02\x3c\x3f\x5b\x93\x47\xf7\x17\x03\x78\x59\xb3\x43\x24\x0f\xe2\x78\xfb\xd5\x7f\xf5\x61\xf5\x59\xf2\x7e\x6f\xae\x0b\x9f\xff\xd9\x81\x2f\xa7\x6f\xe1\xe6\xfa\x72\x58\xb6\x8a\x17\x31\x72\xf0\xfc\x00\x9f\xc0\xf6\x26\x57\x1f\x37\x5f\xac\xb7\x8d\x51\xf3\x77\xef\xe4\xc0\x94\x77\x39\x10\x4b\x1e\x7c\xbe\xaa\x25\xf8\x78\x51\xb3\x77\x8d\xad\xc3\xe9\xda\x7e\xed\x6b\x3c\x3f\xd7\x5e\xb8\x71\x51\x9d\x1d\xd1\x1f\x1f\x1c\x08\x3c\x3f\xae\x27\xb7\x1f\xd7\x42\xda\x87\x6b\xc0\x81\x23\x81\x30\xca\x78\xb1\x8b\xd5\x6e\x85\x3c\x98\x0d\x04\x70\x15\xb8\x15\x2c\x69\x5d\x41\xb6\xa9\x87\xd3\x59\x10\xa7\xd6\x84\x1c\xee\x54\x6d\xcf\x11\xfc\xd7\x1e\xe9\x99\x18\xf6\xdc\xf3\xf8\x75\x78\x73\x55\x1b\x30\x20\x63\x42\x16\xe5\x4d\x54\x30\x50\x1e\xb2\x44\x41\x11\x4c\x4e\xb6\xa3\x2a\xab\xea\x3a\x91\x16\xe2\x46\x9c\xb3\x04\x8b\x5d\xab\x53\x71\x48\x51\xb4\x91\xa2\x61\x16\xb1\x50\x47\x2a\x7e\x0d\x8d\x64\x05\x29\x0d\x8b\x5e\x86\x21\x87\x72\xf6\x8f\x0e\x63\xdf\x0a\xd4\x9b\x3d\x54\xdc\xf2\xda\x85\xaf\xed\x9a\x38\xa5\xf4\xbd\xab\xb7\x0c\xee\x1a\x4c\xbe\xb6\x25\xb2\x73\xb0\xeb\x67\xcf\xb4\x3d\x4b\xf3\xbc\xc0\x31\xa2\xac\xab\xf8\x1f\x01\x54\xa5\x24\xa8\xea\x28\x70\x5f\x6d\x9f\xff\x6f\x66\x30\x87\x5e\x5d\xe1\xc5\xc8\x9f\x80\x25\xc7\x05\x81\x4a\x31\x6e\x06\x07\x11\xee\x19\xd7\x91\xa8\x7a\xe6\x7d\xcf\x41\x53\xd1\xf4\x70\xcf\xc4\x98\x1b\x07\x0e\xdd\x64\xf4\x6e\x47\x10\xa8\x7a\x12\xda\x13\xf5\x45\xe8\xbc\xe0\x30\xdc\xd3\xa2\x3b\x81\x8f\x07\x56\x5b\x11\x04\x83\xc3\xd6\xdd\x9f\x84\x2f\x6e\xb1\xb7\x9d\x47\x1c\xbf\x16\x6d\x38\xfa\xd2\xf3\x66\x4d\x9a\x7e\xfc\x71\xbd\x3d\xe7\x4d\x98\x70\x3c\x7d\xdd\x27\x83\xab\x8e\x59\x71\xdb\x35\xab\xff\x2d\xba\x71\xc5\xbc\xdb\xee\x9d\x8b\xbe\x98\xf5\x8b\xad\x7f\xb9\xb7\xf3\x7a\x75\x2e\xf1\x29\x8c\x73\x06\x03\x73\x65\x91\xa2\x52\x7a\x8a\xe1\x05\x91\x65\x51\x89\x53\x58\x86\xe6\x39\x0a\x0d\xd1\x29\x99\xe7\x18\x4e\xe0\x18\x96\x29\x41\x8d\x95\xa0\x29\xb2\x68\xb8\x5a\xc9\x85\x53\x65\x43\xd2\x08\x53\x51\x34\x49\x25\xef\x48\x2d\x58\x6d\x1f\x1a\x78\x56\x81\x9b\x28\x8e\x5f\x30\x8b\x4b\x9d\xc4\x70\x73\xa6\xb1\x34\xad\xfc\x97\xfd\x3d\x4d\xe6\x15\x55\x97\x28\x4a\x31\x54\x5d\x29\x69\xba\x08\x19\xc8\xd2\xc5\x2c\x9f\x0d\xfd\x38\x47\x5b\x7a\x41\xe6\x25\x56\x48\x19\x29\x06\x09\x48\x53\x1c\x50\xe1\xa1\x0c\xad\x14\x2d\x89\x12\xc7\xc8\x29\x56\x50\x4c\x53\xcb\xd8\x79\x0d\x99\x2a\xca\x4a\x39\x5d\x97\xb3\x46\x4e\xce\xa6\xeb\xf4\x0f\x57\x2f\xf0\x74\x93\xbf\xb4\xd2\xd5\x07\xd2\x75\xf4\xcf\x88\x25\xd7\x4b\x4d\x36\xdf\x4c\xcd\x9e\x3f\xb8\xd3\xc3\x37\xb7\x4e\x98\xea\xd5\x4e\x71\x30\xee\xdc\x86\x1a\xaf\x35\x8b\xca\x61\x19\xd1\x29\xb0\x59\x42\xec\x0a\xf4\xc0\x0d\xd6\x77\xad\xf6\xc3\x0d\x37\x94\x9c\x0a\x29\xa1\x4c\x45\x30\x09\xcd\xd6\x9c\x97\x2d\x1a\x22\xa3\x29\xa6\x22\x4a\x1c\x17\x60\x4a\x04\xd7\x28\x06\xb2\x6d\xa2\x99\xcf\x1b\x28\x4e\xd0\x76\xc9\xb0\x4b\x04\x8d\x68\x2d\x9f\x57\x43\x4c\xde\x28\x14\x0a\x50\xca\x93\x92\xd7\x11\x47\x82\x32\x62\x45\x49\x32\x95\x51\xa0\x8a\xa2\x2e\x70\x4d\x2c\x4a\x14\x45\x51\xc6\x6f\xaa\x2a\x6b\x92\x22\x67\x32\xb2\x22\x69\xb2\x8a\x7f\x86\x34\x4d\xab\xee\xe7\xd7\x5c\x9f\x06\xde\xff\x05\x99\x73\x89\x0b\x46\xf7\x9e\xf6\xe9\xf4\xd5\xd4\xac\x03\xcf\x12\x67\x8f\xbe\x73\xda\x02\xbf\x56\xaf\x1e\xb0\x7b\xee\x68\xcd\x8f\x9e\xbf\x20\x30\x2e\x07\xf4\xff\xae\x46\xfb\xa6\x7b\x7e\xc6\x3f\xa2\x2d\xf5\x09\xf3\xed\x80\xbe\x82\x65\xb2\x35\x7f\xc1\x50\xf3\x65\x6b\xfe\x38\xb8\xa5\x91\x7f\x79\xf4\xfb\xec\xd6\x7c\x6d\xcd\x71\x8d\x7c\xc0\x51\x48\xa9\xe4\xae\xab\xf0\x5d\xca\xfe\x5a\xf1\x33\x7b\xb0\xb9\xbd\xee\xde\x3e\x0c\x9a\xef\xb6\xe6\x1d\x6b\xa3\x74\x75\x9c\x09\xf2\x9a\x67\x37\xb4\x96\xf5\x56\xe3\x78\x13\x10\xf1\x63\x01\x17\x82\x25\xe0\x4e\x70\x0f\xb8\x1f\x18\x60\x9d\x1b\x03\xd8\xd5\xdb\xd9\x8d\x5f\x38\xbb\xbc\xbf\xbb\xaf\xb7\xda\xd1\x23\xd4\xdb\xee\x76\xcf\x71\xdd\xa3\x9d\xd5\x7e\x76\xce\x67\xb5\x51\xb7\xce\xc6\xd8\xae\xc8\xb8\x9e\x04\x4e\x7e\x49\xf4\x25\x9c\x8b\x02\xd7\x76\xb7\xf7\x86\x70\x9e\xa2\xdb\x0d\xaa\x13\xf7\x89\xea\x08\xc4\x51\x77\xb9\x35\xcd\x4f\xf7\x3a\x4a\x10\x2c\xab\xea\xd1\x62\x31\x5a\x28\x44\x21\x45\x14\x60\x34\x5a\x1a\x8a\x96\x87\x47\x01\x34\x68\xd5\x40\x39\x08\x72\xa6\x22\xa8\x9a\x26\x5b\x82\x25\x5a\x10\xd8\x19\x08\x72\x8a\x28\x88\x12\xa7\xd1\x6d\x51\x64\x1a\x65\x01\xe5\xf3\x76\x3a\x87\x34\xbe\x6c\x20\x93\x60\x28\x4a\x15\x33\x82\x29\x59\x10\xa0\x9c\xa1\xa5\xb2\x50\x83\x79\xc4\xb2\x50\x44\xe9\x28\x54\x90\x21\x65\x32\x8c\x19\xe7\x24\x49\x60\x54\x86\x2d\x15\x69\x24\x20\x31\x87\x38\x16\x5a\x90\x46\xc3\x0a\x2b\x2a\x22\xa9\x49\x6c\x9c\x93\x04\x59\x22\x78\x3b\x2b\xc9\x82\x24\xca\x76\x1e\x15\xb3\x92\xcc\xf3\x8a\xc4\x67\x72\x8a\x20\xf1\x92\x2c\x49\x32\xcb\x2a\x3c\x6b\x71\x1c\xad\xf3\x8c\x29\x65\xd2\xb2\xce\x0a\x3a\x15\xad\x5e\x90\x85\x29\x82\x8a\xdb\x45\x58\x64\x44\xae\x24\xf0\x15\x3a\x2e\xf2\x51\x4a\x10\x52\x02\x97\x62\x55\x85\xd1\x68\x8d\x36\x95\x94\xcc\xf3\x5c\x0d\xce\x33\xb5\x33\x5f\xed\xd6\x08\x81\x40\xf6\x62\xf1\xe2\xce\x79\x86\x8f\x87\x1d\x91\x23\x60\x88\x8c\xe0\xc2\x96\xed\x14\xec\x89\x1d\x07\xc7\x91\x96\x84\xca\x74\x2e\xa7\xe6\x0b\x29\xc3\xb2\x72\x05\x54\xd6\xca\xa1\x28\xa9\x9a\x8c\x5d\xb4\x75\x54\x32\x21\x4d\xa4\x09\x25\x4e\x1d\xa2\xc2\x25\x2a\x6a\x17\xed\x61\xc4\x29\xd0\x84\x39\x22\x47\xb9\xf7\xcf\x87\xb4\x08\x45\x2a\x31\xf2\xc0\x49\x01\x3c\xd5\x63\xc9\x41\x6c\x95\x19\xd4\x3d\x58\x4b\x63\xf9\x49\xf7\xeb\xdc\xb8\x55\xd7\x00\xec\x6a\x0b\xf7\xd0\xe1\x26\xff\xb9\x9b\x4c\xe5\x85\xa1\x06\xc5\x7f\x9c\x63\xd5\x97\xe8\x74\x08\x2c\x99\x16\x6c\xab\x62\x32\x44\x81\xd0\x4c\xd5\xd0\x0c\xbb\x2c\x73\x16\x2b\x23\x5d\xe5\x2d\x5e\x31\x42\x51\xdb\x0a\x2b\xd9\xac\x6d\x88\xa6\xa6\xd0\xba\x2e\x38\xb4\xb2\x32\x1c\x56\x71\x05\x03\x86\xd4\x4d\x39\x6e\xf2\x42\x5e\x56\x15\x41\x56\x25\x55\x66\x44\x49\x92\x44\x7b\x38\x8d\x49\x65\xae\xac\x48\x74\x3a\x25\x14\xcc\xb4\x99\x4e\xa3\x5c\xba\xf1\xf9\x62\xe4\xce\xc5\x9e\x3e\x23\x8f\x5e\x12\x31\x49\xa5\xe1\xf9\x38\x37\x57\xb7\xf5\x33\x42\xe7\xf1\x3a\x1b\x74\x9b\xee\xbe\xde\xf6\x70\x5f\x6f\x27\x6c\x28\xe9\x4d\xe6\x04\x5b\xab\xc8\x0c\x31\x4c\xe8\x69\xe5\x27\xc6\xdb\x76\x5e\x9f\x6d\x4c\x30\x91\x92\x61\x0d\xce\x0a\xa7\x0b\x05\x49\x92\x34\x3a\x2d\x30\x23\x96\x59\x28\x10\x8a\x65\xeb\xb0\x88\x52\x84\x23\x51\x59\xd5\xbf\x48\xc5\x90\xe2\xa6\xca\x7e\x6c\x0a\x99\x47\x9e\x52\x45\xfd\x11\x7a\xe9\x23\xe2\x23\xcb\xd0\xcb\xf6\x9f\x36\xfd\x62\xfe\xfc\xce\xad\x47\x5c\xfe\x3c\x9a\x0f\x9f\xdb\x44\xc4\xa8\xed\xeb\xd0\x1f\xef\xbb\xef\x3e\xb4\x42\x51\x14\x00\xc2\x40\xf3\xf2\xba\xc3\xe0\x2c\x30\x01\x9c\x07\xb8\xea\xb3\xc1\x04\xc6\xd8\x5e\xdc\x3b\x09\x37\xc5\xc4\xd5\x27\xc6\xb7\xb9\x3d\xb9\x88\x70\x0f\xe8\xc0\x04\xc0\x8d\x7e\x0f\xc6\xb8\x3b\x67\x98\xae\xa4\x59\xa2\x60\xf3\x6d\x92\xc4\xa4\x59\x31\x57\x91\xa2\x54\x5b\x74\xa4\xc8\x84\x8c\x14\x1a\x2a\x43\x87\xed\xa0\x22\x1a\x42\x19\x01\xb2\xf9\x8c\x6e\xa0\xb2\x02\x45\x13\x49\x30\x4f\x45\x91\x4a\x00\x23\x5f\xe2\x90\xc9\x31\x46\x8a\x43\xba\xc8\x1a\x8c\x40\x6a\xba\x1a\x37\x11\x9f\xc9\xd0\x19\xc3\xe0\x39\xc3\x40\xe5\x2c\x97\xb2\x18\x4d\xe1\xac\x14\xa7\x64\xb0\x99\x0b\x40\xd3\xe0\x78\x3b\x6f\x8a\xb2\x1e\x2a\x8b\x32\x27\x89\x8c\xe0\xbc\x03\xbf\x56\x81\xfb\xbc\x5f\x07\x1c\xb8\xc0\x3f\xc9\xb1\x5d\xbd\xd8\x4e\xe8\x36\x41\xaa\xba\x71\x7b\x42\x89\x6a\x57\x24\x9c\xd1\xdb\xe6\xef\x40\xcf\x99\xd0\x8b\xd6\x84\x63\xbb\xc6\xf5\xbb\x60\xab\x33\x44\x09\xc9\x3c\x37\x2c\xe8\x3c\x57\x16\x19\x8b\x61\x21\xb0\x0e\x95\x2c\xc8\xf0\xc3\x30\xc7\xd0\x69\x3a\xd5\x96\x1a\x31\xf9\xd0\xb0\x51\x82\x00\x0a\x0c\x62\x50\x0e\x15\x91\xca\x43\xb6\x6c\xa4\x44\xc6\xc8\xaa\x30\x9a\x45\x06\x41\x9b\x45\x18\xd5\x48\xcd\x14\x29\x33\x2d\xa9\x9a\x24\x69\x86\xc1\x6a\x32\xca\x65\xb2\x90\x57\xed\x21\x59\x49\x89\xa2\xa1\x6b\x59\x85\x8f\x5a\x94\x26\x31\x16\xcd\x8a\xb4\xc0\x66\x35\x25\x0b\x59\x34\xac\x8b\xa2\x8e\x65\x1b\x21\xa2\x05\x70\xd4\x91\x74\x6b\xf5\x30\x0f\x0b\xc7\xe1\x50\xa2\x33\xd2\x9c\xd0\xdf\xde\xd7\x91\xe8\x4f\x74\x8e\x09\xe1\x94\x7e\xf7\xca\xc0\x77\xbb\xb1\xce\x41\x66\x05\xdb\xa8\x68\x0c\x31\x44\xe8\x86\xa6\x29\x3a\xa2\xf8\x94\xc6\xf0\x48\xe3\x52\x3a\xcd\xb5\x95\x04\x48\x09\x69\x25\x23\x6a\x34\xce\xf2\x3f\x94\x17\x14\x1d\x52\x66\x48\x65\x2a\x12\xd7\x26\x0b\x23\x0a\x15\x1a\x76\x04\x45\xa1\x62\x9a\x29\xd3\x34\x89\xa2\x48\x9b\xb4\x60\x71\x16\x47\xea\x86\x4a\x9b\xac\x60\x0a\x92\xcc\xf0\xa2\x20\xf0\x2c\xc7\x0b\x3c\x67\xa2\xa2\x91\x46\x20\x4f\x9b\x34\x27\xc2\x68\x21\x2b\x43\x0d\x0e\x9b\xa8\x68\x46\x79\xa4\xa5\x05\x54\x52\xd4\x94\xa6\x44\x53\x85\xac\x90\xc9\x98\x06\x93\x36\xcc\x2c\x55\x50\x01\x38\x02\x5c\x38\x3a\x29\x72\x19\xf9\x24\xe8\x00\xe7\x82\xe9\xb8\xb2\xf0\x15\x40\xf4\xac\x7f\x6e\xbe\x47\x10\xa3\x27\xf6\x27\x3a\xdc\x02\x78\xbd\xc9\x9e\x7e\xdc\xdb\x86\x8c\x38\x98\x12\xa9\xdb\xb2\x89\x7d\x30\xd1\x33\xb1\x3f\x3c\xb6\x2b\xec\x28\x60\xe1\xb1\x5d\x91\xce\x44\x7f\x78\x4c\x24\xd1\x1f\x39\x8c\xb2\x06\x8f\x0d\xbf\x8c\xd0\xdb\xb7\xcc\x5b\xb4\xb0\xeb\xaa\xa5\x57\xff\x29\x3f\x72\xe3\xf3\xd3\xd7\x3f\xfe\x97\x77\x53\xd3\x2f\x7a\x86\x21\xf6\x12\x17\x70\xc2\xb5\x8f\xf3\xd7\x6e\xbe\x09\x86\x6e\x7a\x47\xde\x72\xed\xe3\xf1\x41\xfe\x5c\xc6\xfe\x26\xec\xbd\xe8\xd6\xe9\xe8\x2a\xee\x14\x34\x01\x9e\x93\xba\xfc\x6c\xf4\xc9\xf4\xd4\x47\x21\x85\xad\x88\x54\xdb\x71\xd7\x5e\x3b\x3d\xbe\x9e\x3a\xb7\xf2\xda\xd3\xdc\xb5\x8f\xdf\x44\xfc\x82\xa7\xd6\x53\xec\x33\x67\x3f\x97\x82\x5f\x3e\xbe\x6c\xc1\x6b\xe7\x5f\x30\xe6\xe1\x63\x3a\xff\x79\xe5\x15\xf0\x27\xd9\x6d\xb3\x3f\x85\xdd\xb0\xbd\xf7\x74\x3a\x72\xe7\x49\x17\x2e\x22\x8f\x3e\x69\xfe\xec\x77\xe6\xdf\x88\x5e\x7e\xec\xf8\x45\xc7\xcf\xde\x4d\xc0\xe3\x6e\xbc\x32\xc9\x5d\x40\x5f\x38\xed\xf8\xe3\x7b\xcf\x7d\xf4\x96\x5b\xde\x3a\xe7\x8c\x1b\x3f\x9d\x3d\xfb\xa4\x2b\x66\x77\x9c\x6e\xce\x3f\xf7\xde\xef\xcc\xbf\x85\x5e\x74\xe3\xd1\x8b\x96\x1f\xf5\xe4\xb5\x2e\x2f\xb9\x6d\x94\x8b\x14\x48\x85\x5a\xb0\x6f\x35\xea\x07\x53\x7a\x67\x4e\x9d\x47\xcd\xda\xb6\x1a\xbc\x35\x5a\x3e\x6f\x09\xe7\xda\xf1\x4d\x37\x96\x1a\x84\xfd\x2e\x42\x53\xc0\x65\xe0\x4a\xaf\x13\x48\x15\x3f\x3d\x35\xd6\xa5\x4a\xed\x89\xf6\x5e\x5c\x73\x15\x13\xd2\x5e\x97\xa8\xb6\x08\xd4\x0f\xb5\x27\x3a\xeb\xaa\xb0\xb6\x77\x79\xdd\x53\xbc\x16\xbe\x94\x60\xf3\x15\x9a\x09\x71\x28\xce\xa5\xa0\x44\xa7\x74\x96\x86\x1c\xc7\xa6\x39\x36\x77\x88\xca\xd0\x0c\x03\x19\x54\x80\x39\xc8\x19\x90\xb3\xb3\x44\xca\xc8\xe5\x04\x45\x53\x68\x55\x4b\xd1\x76\x51\xb0\xad\xa1\x2c\x45\x2b\xba\xa0\xd2\xf4\x28\x40\x19\xde\x74\x64\x0d\x98\x87\x79\x91\xd5\x19\x81\x54\xf4\x14\xa5\xa7\x79\x89\xe3\x52\x82\x28\x2b\x8c\xc4\x23\x05\x1a\x3c\x8b\x64\xcb\xf9\x41\x29\x5d\x37\x50\x54\x11\xe3\x46\x9c\x66\x61\x11\x02\x3b\x5b\x4c\xa5\xe2\x71\x5e\x37\x78\x8e\x61\x59\x2e\xe4\xc8\xdc\x25\x55\xa5\x34\x83\xb3\x54\x5c\x2b\x4c\xc5\xbe\x12\x06\xe3\xf4\x49\xce\x0e\xe1\xd2\x01\x6d\x30\x42\xc0\x8e\x2e\x02\x13\x29\xe8\x10\xa9\xf1\xc9\x50\x7f\xac\x6b\x22\x61\x9a\xa3\x00\x15\x74\xc8\x87\x0c\x48\x41\x4a\x2b\xa3\x7c\xda\xb0\x4a\x90\x87\x69\x01\x71\xc8\x42\x43\x76\x59\x82\x43\x90\x2a\x5a\xa6\x51\x2c\x93\x8c\x80\xd4\xa2\x3a\x0c\x99\x21\x94\xd7\x21\x03\x69\xc4\x49\x28\x3b\x34\x6c\xa4\x0d\x48\x97\xb3\x66\xb6\x58\x72\xe8\x77\xa9\x58\x06\x5e\x6c\x3b\xb6\xd7\x78\xeb\x39\x1b\x4b\x9b\xce\xed\xdb\xc2\x11\x30\xfe\x24\x18\x20\x9b\xe3\x5d\xbd\x17\x26\x8e\x80\x81\xc4\xfd\xee\xf6\x04\x51\xd2\xca\x28\xab\x40\x26\x24\x42\x00\x69\x11\x15\x51\x39\x63\x98\x69\x28\x41\x55\x42\x14\xca\xa2\x61\xdb\x12\x60\x01\xd2\x96\xa6\x19\x85\x42\xa5\xd0\x56\x8e\x6a\x3a\xa7\xd1\x86\x90\x62\x28\xdb\xb2\x50\x96\x54\xa5\xa2\x6e\x2a\x59\x69\xc8\x84\x51\x25\xcf\xab\xa2\xcc\x58\x82\xae\xc9\x26\x2f\x39\xe2\x9b\x28\x21\x80\xe8\x51\x10\xcf\xc4\x55\x48\xdb\x51\x62\x18\xd7\x18\x50\x02\x6b\xf7\x25\x98\xea\xfa\xc7\xb5\x5e\xbf\x23\xc0\x8c\x4d\xd0\xfd\xe3\x5c\xc7\x7a\x82\x4e\xf6\x61\x0b\x66\x6f\xc2\x7b\x94\x8c\x5c\x7d\x14\x01\x15\xf0\xa3\x64\xa0\x0c\x55\xd1\x2e\xa1\x02\x4a\x23\x20\xc0\x1c\x8c\x1b\xaa\x66\xe4\x8b\xd0\x18\x31\x75\x68\x40\x86\x82\x51\x3a\x15\x37\x53\x86\xad\x22\x90\x25\x18\x07\x50\x4c\x68\x21\x89\x54\xa5\xb4\x62\x08\x26\x9f\x35\x8b\xa2\xc9\x2b\xa2\xc4\x98\xa2\xa6\x09\x3a\x2f\xf0\x82\x24\x09\x22\x4a\xd9\xa5\x7c\x8a\x8e\x46\x29\x3a\x23\x16\x44\x5e\x0e\x51\x3a\x2a\x43\xca\xab\xf5\x88\x6d\x69\xbb\xb0\x5f\x74\xd7\xdb\x01\xdb\x93\xeb\x3b\x79\x12\xfb\xf5\x70\x85\xf8\xfd\x8f\x03\x00\x08\xbf\x9e\x4f\x07\xe8\x01\x00\xb6\x85\x71\x2a\x4c\x5b\x57\x75\x0f\xc6\x8d\x87\x1e\x94\x8d\xaf\x42\x99\xb3\x27\x2a\xd4\xa1\x00\xa9\x82\x9a\x2b\xc2\xd4\xb0\x8c\x86\x50\x1a\x15\xed\x61\x09\xea\x90\x45\x43\x28\xd7\xc6\x58\x46\x09\x8a\x0e\xcc\x31\xc8\x40\x69\x14\x17\x61\x1e\xb2\x43\x19\x33\x3d\x54\x24\x79\xcd\x30\xd3\x9a\xa9\x19\x96\x91\xb5\x2c\xcb\x54\x75\x55\xb1\xd3\x1c\x1a\x2a\xe6\x94\x8c\x5a\x2e\x6b\x19\x25\x97\x87\x34\x37\x9c\xcb\x79\x36\x68\xc3\x8d\x9f\x78\xf1\x73\xbc\x72\xec\xd7\xc5\xf2\x0c\x1f\xd1\x48\x0d\x74\x81\xd3\xc0\x34\x70\x05\x98\x5f\xcb\xf6\xaf\x76\xc1\xc3\x59\x3a\xc7\xc1\x44\x57\x4d\x29\xf1\x53\xf6\xc6\xb7\x18\x83\xb5\x31\xff\xb2\x86\x4b\x9c\x0d\xb0\x42\x94\x15\x8a\x56\x86\x29\x8b\xb0\x24\x3b\x9b\x37\x6d\x9e\x83\x39\xa8\x54\xca\xba\xae\xcb\x82\xcc\x8b\xb2\x24\x2a\x4a\xd6\xe0\x15\x43\x96\xdb\xa2\x86\x26\x0b\x32\xe7\x0c\xaa\x4a\xc6\x10\x54\x43\x56\x2a\xba\x22\x8b\xbc\xcc\x09\x1c\x2b\xea\x96\xce\x2b\xba\x28\x86\x4d\x85\xe5\x64\x49\x94\x65\x49\xe0\x59\x5e\x10\x38\x49\xe6\xc2\xb9\x5c\xce\x40\xb2\xae\x20\xba\x90\x2e\x40\x0b\x45\x55\x8b\x87\x19\x98\x85\x26\xcf\x0a\xa2\x20\x0a\x3c\xc7\xab\x22\xaf\x71\x1a\x23\xb1\x8c\xda\x62\x0c\x49\x2c\x27\x49\xa2\x24\xa5\x18\x4d\x31\x78\x95\x53\x59\x26\x2d\x0a\x3c\x2f\xaa\x92\x28\x30\x1a\xcd\x32\xac\xca\xf2\x3c\x08\x7b\xbe\x0d\x0e\x9c\x86\xe9\xf2\xb7\xc1\xdd\xd8\x1f\xe6\xd6\x4f\xe8\xe9\x6f\xeb\x8a\xf4\x34\xb6\x59\x48\xb8\xc5\xf6\x31\xe0\x24\x22\x75\x9b\xd5\xd3\xef\xd6\x7b\x0a\x0c\x38\xd0\x13\x1c\x71\xf7\xb3\xd5\x1e\x87\xd2\x95\x21\x32\x5f\x29\x13\x71\x45\x15\x61\xb4\x24\x3b\x0a\x96\x4a\x5b\x02\x6b\x17\x2d\x7b\xd8\x62\x19\x1e\x46\x0b\x32\x2f\xc1\x9c\xa6\x70\x3c\xe7\xd0\x5d\x41\x94\x24\x21\x2d\x1b\x3c\x51\x56\x78\xde\x90\x59\x4e\x74\x47\x04\x9e\xb3\x15\x85\xe7\x35\x89\x65\xf1\x45\xbc\x20\xf2\x3c\x47\x0c\x2b\x3c\xcf\xb1\x12\xc3\x09\x82\x24\xf1\xbc\x20\xf1\x1c\x1f\xce\x18\x46\x91\x4d\x29\xb2\xaa\xa4\x46\x34\x51\xa2\x8d\x38\xdf\x46\x8f\x80\x30\x18\x01\xe1\x78\x9c\xd2\x44\x53\xe4\xd8\x0c\x27\x8b\x3c\x2f\xf1\x9c\xc8\x89\xbc\x68\xf2\x9a\x20\x72\xb2\x68\xd4\x06\x38\x4e\x40\x22\xa7\x4a\x86\xc4\x09\xa2\x33\xbf\x20\x70\x1c\x2f\x4a\x9c\x2a\x39\xdf\xe3\x03\x63\x00\x82\xc2\x28\x4f\x02\x8c\x87\x00\xf6\x62\x2a\x89\x0d\x92\x7d\x09\xb7\x4a\x5c\x58\xb2\x2c\x3b\x1f\x47\x29\x19\x5a\x14\xd2\xda\xa4\x4a\xc6\x22\x32\xa4\x3a\x5c\x20\x32\x76\x41\xb3\x14\x68\x99\x90\x23\x34\x14\x0f\xf6\x89\x18\xc0\xb6\xe6\xed\x3f\x6f\x8c\x09\xd9\x31\x07\xc7\x2e\x7d\xab\x71\x7c\xe7\x84\xba\xeb\x7f\x3a\x7a\xa6\x5b\x8f\x35\xb3\xd8\xd1\x95\x36\x7f\x6b\xf1\x7f\x05\xe2\x29\x8c\x58\xd2\x99\x81\x22\x37\xd7\x7a\x73\xb3\x6e\x4c\x88\x33\x1e\x23\xf7\x7d\xbb\x91\xfe\xb8\xd7\x6f\x7c\xc7\xd3\x71\x9d\xf1\x14\x29\x83\x31\x6e\x54\x93\x5f\x0d\xaf\x1b\x97\x42\x02\xed\x50\xb1\x08\xc1\x22\x52\x87\x86\x42\x25\xab\x92\x61\xcb\x1a\x8c\x93\x12\xa2\xe1\x10\x8a\x9b\x28\x57\xb1\x88\x3c\x12\xd0\x90\x0c\x05\x38\x54\xf5\x61\xb8\xb6\x9b\x1f\x3b\xf7\xd9\xb3\x29\xe0\x3b\x31\x6b\xe3\xfb\x5f\x0f\xf8\x3c\xb4\xda\xf8\x8e\x95\xbe\x4f\x82\x8d\xa4\x49\x33\x96\xdc\x8c\xfb\xdd\x6e\x58\x06\x1a\x62\x1c\xdd\xeb\x0f\xde\x12\x98\x1f\xdb\xb6\x36\xb9\x94\xb5\x1a\xa3\x37\x79\x94\x8b\xbc\x8d\x9f\xfb\xf7\x1f\x03\x6a\xd6\x96\x0f\xc0\x8f\x01\x38\xef\x6d\xae\xea\xf7\xc8\xb8\x9f\x61\x2f\x61\x2a\x70\x8f\x87\x49\x95\x9a\xbf\xff\xc7\x21\x30\x75\x0a\x07\xa8\x59\x5b\xe7\x83\x15\xe0\xe8\xf3\x3e\x9e\x36\xcb\x5b\x1b\xce\x87\x75\xbe\x17\x23\xf7\x6f\x68\x8c\x03\x71\xd7\x96\x59\x1c\x98\xcf\xb5\xc7\xe1\x71\xeb\xcb\x56\xcf\x12\x23\xb7\x54\x6b\xa0\x2d\x18\xbd\x22\x62\x90\xba\x73\xff\xf0\xd7\x26\x7f\x31\x6d\x6b\x8c\x7c\xfe\xaf\x81\x38\x1a\x7c\xbe\x1b\x70\x0c\xe4\xea\x3f\x06\xee\x6d\x54\xef\x11\x23\xb7\xbe\x16\xd8\x47\x37\x86\xe0\x6c\x0c\x27\xbf\xf7\x6d\x1b\x5c\x44\x23\x19\x70\xb2\x5f\xe1\xa7\xcf\x6b\x8b\x15\xa4\x2d\xdd\x00\xf6\x8c\x83\x89\x1e\x98\x4d\x0b\x62\x48\x1e\xc9\x90\x06\x92\x60\x0e\x71\xa2\x9e\x36\xe8\x74\x86\xa3\x91\x62\x4b\x32\x21\x43\xb9\x32\xc4\x84\x19\x3a\x9b\x85\xc3\xa6\x89\xa2\xa6\x1d\x75\xf5\x7e\xa2\x88\x28\x54\xd6\x87\xa1\xa6\x7b\x71\x5d\x42\x44\xc2\x75\xdc\xee\xc5\xe7\x7a\x5f\xc0\xd6\x62\x91\x2a\x38\xde\xaf\xcb\xd5\x5e\x5d\x0f\x6e\x18\xe2\xea\x43\x44\xd4\x4a\xb1\xd0\xb2\x08\xcb\x96\x42\xf1\xca\x90\x55\xd1\x42\x1a\x8a\xcb\xba\x0e\xa3\x24\xcb\x18\x1a\xd4\x90\x66\x22\xda\xb4\x65\xc2\x34\x61\xa9\x68\xc9\x5e\x1f\x59\x7e\x94\x0f\x39\x67\x43\x1e\x8c\x37\xc4\xb8\xc4\x31\xbc\x18\x01\x1b\x26\xe7\xac\x6f\x37\x8e\x88\x3f\x18\xf7\xe3\xd1\x1c\x19\xd0\x19\xc7\xbd\x9f\x07\x46\x1b\x63\x34\x0e\x8e\xc5\x3e\xc1\xa3\x1b\x63\x85\xdc\xf9\x0f\x56\x6d\xaa\x26\xb6\xb5\xfa\x75\x4e\xad\x50\xe0\x7a\x1c\xd3\xb4\x43\xc1\xf8\x7f\x67\x63\x0c\x91\x33\x4f\x8c\xcc\xc8\x75\xb0\xa3\xc5\x92\x03\xff\xc0\x78\xbe\x2c\x70\xbd\x51\x5b\xcf\xc0\x88\x3f\x5e\xad\xc7\xe9\xae\xe7\xde\xc0\xf5\x99\xda\xfc\xfb\xd6\x07\xc6\xdd\x1a\x54\x38\x52\xe5\xe0\xd8\xa6\x98\x26\xa2\x61\x9d\x67\x47\xde\xf1\xe7\x9f\xb5\x6b\x0d\x58\x3b\xfa\xeb\xc9\x7f\xe3\xaa\xf7\xc6\xb1\x46\xdb\xdd\x3c\x26\x18\x98\x4b\xac\xae\x35\x46\x3e\x5f\x8d\x3f\x51\xab\x75\xb7\x77\xf7\x39\xb2\xd2\xc0\x30\xfe\x56\xc3\xfd\xf7\x1d\xdd\xb4\x4f\x62\xed\xb9\x9f\xcf\x35\xe2\x98\x5b\x1f\x72\xe0\x1f\x8d\xcf\xe1\xae\x69\xe0\x7f\x02\x78\xe4\xd2\x6d\xdc\xaf\x65\xf0\xe3\xc6\x7d\xf5\xae\xff\x3b\xa8\xc5\x29\xe2\x67\x73\x57\xb9\xfa\x0f\x8d\xbe\xe2\x9d\x10\x5f\xff\xcf\x46\x78\x49\x6f\x6c\xda\x57\x8c\xbf\xee\xfa\x57\x7f\x51\xb7\x4e\xad\x3a\xfe\xe2\x7d\xad\xcf\x79\xd7\x31\x8d\xe7\xfc\xc2\x7e\x1c\x4f\x49\x35\xad\xff\xee\xba\x7d\x73\xd7\x6f\xc4\x92\x03\x65\x7c\xdf\xff\x6e\xbd\x3f\x07\x5e\x6c\x82\x47\x7c\xdf\xc1\xdd\x01\xdb\xbc\x46\xf2\xb1\xe4\x01\x0c\xbf\xab\x7f\xdf\xb8\x3f\xe9\x4b\xf0\x59\xfe\x13\x7f\x3a\x84\x3f\x53\xaa\x9f\x65\x8e\x0b\x7c\xf6\x79\x00\x7f\x34\xf7\xfe\x31\x72\xf3\x2f\x5b\xdf\x7f\xd3\xaf\x03\xe3\x6a\x00\xee\xff\x7c\x98\x73\xfb\x6b\x80\x1f\xba\xe7\x8c\xf3\x6e\x56\xff\x57\x1d\xde\xfa\xfb\x3d\xf0\x97\xba\xfb\xea\x3e\x0c\xdf\x16\xd8\xef\x4c\xe0\xbe\x5f\xfa\xe3\x9e\xef\x64\x3b\xdd\x00\xa7\xce\xf5\x4a\x35\xef\xd1\x39\x25\x7f\xdc\x0c\x9c\xdb\x3d\x4d\xf0\xe8\x9e\xcf\x67\x81\xeb\xd5\xda\x3a\xfd\x1c\x1a\x3f\x8f\x76\xf7\x5f\x70\x8c\xd6\x97\x55\x28\x0b\xd2\x24\xf7\x19\xb6\x26\x03\x73\x61\x7c\x73\xef\xed\xe7\x87\xd4\xea\x44\xb8\xcf\xf6\xa7\xc0\xf8\x07\xd5\xf1\x18\xb9\xf9\xc4\x93\xa8\x56\xb0\xba\x99\x6e\x84\x81\x6d\x93\x6a\xe7\xec\xe5\xd0\xb9\x74\xc6\xbf\xc7\xe0\xed\x01\xff\x8c\xdb\x7b\xf3\x3f\xf1\x73\xff\x2e\xb0\xaf\xe9\xda\xbd\x77\xdd\x12\xc0\x73\xb7\x16\x44\x5b\x8b\x18\x77\xaf\x6e\x7d\xfa\x6f\xf8\xb3\xbf\xe3\x19\xdd\xfa\x56\xa7\x54\x63\x5c\x07\x5e\x06\xc0\xed\xac\x14\x23\x5f\xd8\xff\xeb\x56\xb0\x3e\xbd\x89\xb6\xbb\xfb\x32\x14\xa0\xed\x0a\xae\x9d\xdf\x86\xef\xf0\x9b\xba\x33\xaf\xc1\xd4\xe7\xad\x71\xd8\x8f\xdf\xf0\x6b\x5b\x7a\xf7\x3d\x3b\x30\x8e\xe3\x2d\xbc\xf1\xf3\x9b\x68\xbb\x4b\x3b\x7e\x5d\x37\xbf\x7f\x5f\x73\x57\x13\xcd\xc7\xe3\x56\x6f\xe3\x3c\x1b\xd4\x3a\xff\xae\x8c\xcf\x4f\xf3\x61\xb0\x9a\xfb\xad\xf8\x39\xb3\xee\xf3\xfe\x67\x23\x4e\xb8\xf0\xb4\x1a\xe7\x3f\x80\x63\x70\x7c\xd3\x07\xa4\xe5\x57\xcd\xe8\x05\xfd\x60\x12\x98\x06\x66\x7a\x9e\xdf\xc5\x40\x07\xa0\xa3\xcb\x0f\x21\xed\xee\xec\x0d\xf8\x73\xbb\xdb\x23\x3d\x13\xbb\x3a\x7b\xfb\x22\xde\x0b\xe2\x30\xd3\xbe\x5e\xb7\x77\x75\xb5\xaf\x67\x7f\x6f\x5f\x37\xfc\xbf\xcf\xe1\xc8\x1a\xb5\x16\x42\x55\x87\xb1\xa3\x02\xfd\xf9\xd6\x13\x97\x1f\xdb\x79\xc7\x89\x9d\x9f\x7f\xf8\x93\x9f\xfc\xe4\x27\xef\xa2\x63\x1e\xec\xbc\xea\x1e\x65\xa7\xf3\x43\x2c\x4e\x76\x7d\x6e\x9b\x9f\x77\x9d\xb4\x10\xfe\x02\x9d\x83\x5f\xef\xa1\xd3\xee\xff\xe0\x03\xf8\xd1\xe2\xaf\x3f\x74\x6c\xe7\xd2\x13\xc7\xfe\xb9\xf4\xe6\x9b\x6f\xbe\xf9\xa1\x8d\x1e\x1a\x3b\xe7\xfe\xa5\x7b\x9d\x9f\x91\x47\x8c\x78\x1c\xaa\x26\x61\xd8\x4a\x08\xd8\xc0\xac\xe4\x42\x1c\x8a\x72\x92\x5a\x24\xd5\x94\xc2\x30\x29\x8e\x57\x35\x45\x53\x54\x95\x27\x52\x29\x29\x4f\x69\x5a\x59\xd3\xca\xaa\x1a\x8a\x8b\x92\xa2\xf0\x1c\x4a\xcb\x92\xcc\xa3\x8c\xa2\x84\x66\x7e\xe5\x17\xd0\x4f\x53\x0c\x6d\x18\x86\x69\x14\x0a\x86\x29\xb0\x92\x5e\xa3\x7b\xf8\x6c\x62\xb8\x96\xdc\xea\x4f\x5c\xf9\x0b\x96\x46\xa5\x30\x45\xea\x60\x9c\x2b\x7f\xc5\xda\xfd\x62\xf8\x13\xfb\x26\xf4\x90\x8e\x22\xe4\x15\xe9\x73\x35\xc3\x36\xc5\x64\xb4\xac\x69\x72\x6a\x4a\x95\x79\x2e\x9a\x47\x39\x15\x9a\x85\x14\x6b\x96\x54\x48\x19\xb2\x61\xa8\xa2\x40\xea\x74\x2e\x8d\xf2\x88\x42\x79\x94\xa3\x33\xa9\xa1\x21\x59\x1c\xce\x98\x79\x18\xcf\xc8\xa6\xa6\x9a\xa6\xa1\xf1\x92\xaa\x02\xbf\xd7\x8a\x83\x87\xbf\xc6\xeb\x0a\xf6\xc2\xc2\xf5\x1c\x07\x71\x2f\xb0\x3d\x0f\xd5\xe9\x33\x5a\x2c\xb9\xe7\x72\x8c\x0b\x8f\x06\xf4\x9f\x5c\xed\xfa\x81\x52\xe0\x7a\x23\x30\x4f\x38\x30\x2e\x55\xc7\x63\xb5\x3a\xf5\xa2\x5f\x4f\x0d\x5f\xbf\xfb\x37\x8d\xf7\xf5\xe6\x39\x2a\xc0\xff\xdc\xdc\x1b\xdc\xc3\x72\xb7\x76\x98\x79\x82\xf5\x6e\xd4\xc0\x3c\x93\x9a\xd6\xf9\x58\xc3\x73\x55\xc7\x71\x8f\xb3\x7d\x66\xab\x79\x62\xe4\xe0\x3a\x1f\x07\x05\x37\x06\xec\x39\xe0\xd0\xb5\x4d\x73\x8a\x20\x46\x6e\xba\xa6\x3c\x5c\xb7\xa7\xb8\xef\xd8\xa6\xdb\x40\x10\x36\xfc\x7b\xec\x5f\xd7\x6a\x8f\x28\x72\xf7\x32\xd0\x00\x4b\xbb\xb5\x06\x5d\xd6\x8b\x6f\x74\xe7\x79\xf1\x0f\x75\x3c\xd7\xa1\x47\xc7\x35\x3d\x9b\x59\xbb\x7e\x30\xd8\x9b\xd8\x95\x71\x7f\xd5\x74\x7d\x00\x26\xf6\x5d\x1b\x18\x17\x03\xeb\xbc\x27\x30\xbe\xd3\x9f\xff\xc2\x81\x4f\x2f\x06\x53\x8e\xe5\x6a\xf7\xd0\x02\xf0\xf2\x50\xeb\xfd\x5e\xab\x05\x78\x99\x8a\x6b\x28\xbe\x89\x69\xea\x5b\x4d\xcf\x8c\xe7\x59\xbf\xbb\xf5\xf9\xfb\x72\xa6\xbf\x17\xee\xf8\x4b\xc1\x3e\xa5\x81\xbd\x1e\x58\x51\xc7\xdf\xf0\x38\x85\xeb\x90\x97\x6b\xd7\xe3\x98\xef\x03\x2f\x37\xe1\x41\xba\xb6\xfe\x1d\x7b\x0e\xf3\x5c\x53\x1a\xf7\xda\x85\xa3\x3d\x41\xbb\x84\x56\xbb\x7e\xf7\x9b\x81\x71\xb5\x0a\x43\xb1\xe4\x33\x47\xe1\xca\x65\x1b\x1a\x9e\x19\xd7\xc8\xd8\x8b\x33\x8f\xf7\xbe\xd0\xea\x8c\x0e\xf6\x07\xd6\x1b\xdc\x27\xbb\xf5\x7a\x5f\xfc\x55\x6b\x7c\x7e\xf1\x9d\xc0\x38\x17\x98\x07\x35\x5e\xbf\x1f\x57\xb7\x1c\xac\xca\x38\x97\x8e\xb2\x91\xff\xc0\xfa\xf1\xa3\xff\x28\xc7\xc8\x81\xa7\xaf\x6c\x39\xff\xee\x0b\x9b\xf0\x1f\xe3\xce\x81\x5d\xad\x71\x67\xf0\xed\xd6\x70\xb1\x6f\x67\xd3\x3c\x2e\x3e\x6f\x0a\x8c\x67\x6b\xe3\x3b\xb7\xb7\x7e\xde\xb5\xf1\xc0\x38\xd6\x27\xdd\x73\xdb\x79\x59\xe0\xbe\x81\xf9\x07\x53\xad\xe0\x31\x46\xee\x7c\xb8\xf5\xfa\x77\x7e\xd1\x9a\xde\xad\x0e\xee\xbf\x12\x98\xff\xf5\xd6\xe7\x75\xa0\xa3\xf5\xfc\xbb\x6b\x3d\x96\xbc\xde\x48\xee\xfc\xbb\xce\x68\x5a\x27\x86\x21\xf3\xbf\xf1\xdd\x3f\x6a\x86\xd5\x40\x7d\x4e\xb1\x2a\xa3\xbb\xf7\xd8\xf5\x4a\x4b\x7a\x94\xdc\x8f\x3f\x5d\xfd\x61\x03\x1e\xe2\xcf\x76\x5f\x89\x57\x77\x55\xab\xb3\xce\x4c\x6e\x5c\xdb\xde\x73\xea\x60\xa9\xee\xac\x63\x35\xdd\xab\x61\x4f\xfc\x9a\x9d\x22\xae\xef\xe7\x3f\xc7\xe0\x47\xad\xe9\x61\xa6\xb7\x35\x4e\xbf\xb0\xf8\x30\xb0\x71\x7d\xdd\xf5\xba\x3f\xff\xef\x9a\x60\x03\x8f\xfb\xb5\x25\x1b\x60\x75\x47\xb2\xe5\x59\x90\x6b\xef\x6d\x8d\x0b\xe9\x0f\x9b\xce\xda\xc5\x7f\x5c\xbd\x70\xef\xaf\x1a\xf0\xff\x91\x9a\x7e\x72\xe0\xa7\x2d\x69\xdc\xd3\xad\xef\xb3\xf7\xde\x56\x34\x34\x46\x6e\x2b\xb4\x86\xf1\x17\x5c\x9b\x57\x08\xcb\xab\x16\xa9\x81\x13\xc1\xe9\x60\x32\x00\x1d\x89\x89\xfd\x5d\x63\x6a\xe1\xba\xb8\xd9\x47\x37\xd9\x86\x8d\xbe\x1d\x89\x3e\x1c\xa4\x55\xfd\x07\x7b\xeb\x4b\x6f\x69\xa1\x28\x13\x35\x53\x50\x66\x58\x55\xe2\x61\xca\x16\x0b\x04\x10\xec\x4c\x29\xa5\x21\x15\x15\x45\x02\xe4\x6d\x3e\x45\xa4\x2c\xcb\xce\x12\x3c\xa2\x60\xd9\x2e\x86\x86\x2c\x82\xb1\x0b\x70\x08\xc5\x09\xde\xce\x5a\x30\xaf\x5a\x94\xa1\xf2\x9c\x20\x2b\xc6\xb0\x68\xe9\x50\x2e\x94\x58\x5d\x84\xd1\xb6\xbc\x56\x11\x64\x53\x37\x74\x48\x69\x38\x07\x44\xf2\x6b\xb5\xd4\xf6\x61\x65\xd3\x3e\x60\xb8\xf0\x6b\x1b\xf9\x39\x77\xee\x3e\x1c\xf8\x4d\x00\x2e\x02\xb8\xf8\xc2\x47\x01\x39\xdf\xed\xe5\x83\x6d\x3b\xab\x8b\x8d\x70\xe1\x62\xce\xc0\xf9\x8d\xfb\xbc\x11\xf7\xfe\x39\x1c\x3f\x1f\x78\xab\x8e\x56\xf9\xe3\xe6\xcf\x5a\xf3\x9e\xbd\x0b\x5a\xf3\x48\xbf\xbe\x5f\xb6\xba\x9e\x0d\xf7\x60\xf8\x7d\xa4\x89\x76\xe2\xeb\xd7\x54\x69\xd8\x77\x46\xf9\xc8\xf7\x5c\xba\x70\xbc\x03\x27\xc5\x2f\x6a\x3c\xd5\xad\x61\xec\xc6\x2b\x7e\xd0\x44\xdb\xf0\x3c\xdb\x0e\x23\xcb\xf9\xb6\x07\xd9\xef\x67\x8f\x75\x6e\xdc\xd5\x9e\x5c\xfd\x7e\xfd\x77\xb6\x3d\x55\x47\x2b\x1c\x58\x7c\x1e\x8f\x5b\x7f\x75\xf6\xee\x91\x78\x4b\x5a\xf1\xc2\x70\xeb\x3d\xdd\xf8\xe0\x61\x64\xa7\x57\xeb\x70\x5c\x8f\x25\xf7\x76\xe3\xf1\x87\x5b\xf3\x9d\x6d\x66\x00\x26\xdc\xbe\x89\x38\x26\x6b\x30\xb8\xa7\x42\xed\xfa\xd5\xef\x35\xed\xd1\xc3\x4d\xf5\x43\x1a\xee\xb1\x79\x4f\xeb\x7b\x6f\xf9\xa2\xe9\xfc\xdd\xf1\x73\xfc\x7d\xf5\xf2\xcd\xdc\xf3\xd9\xf7\xa3\xd6\xe7\xf3\x42\x32\x30\x8f\xbf\x77\x31\x72\xcb\x6b\xad\xcf\x6d\xfb\xa5\xad\xc7\xb7\x8d\x1c\x46\x46\xba\xb8\x49\x36\x73\xe5\xe3\x63\x5b\xf3\xc8\x2d\x0f\x78\xe3\x5a\x55\x9f\xde\x85\x75\x82\x2d\xfb\x5a\xc1\x3b\x45\xbe\xb4\xa3\x35\x1e\xbf\xd0\xd3\x7a\xfc\xff\xa3\xec\x5f\xe0\xdd\xa8\xaa\xc5\x71\x7c\xf6\xcc\xc9\x24\x80\x17\xe6\xa4\x3d\xed\x00\x02\x13\xdb\xe6\x0c\x2f\x09\x1c\x4e\x3b\x3c\xda\x0e\xaf\x76\xf0\x8a\x8c\x5e\xd4\x41\x50\x06\xc1\x76\x7c\x32\xf2\x72\x2c\x08\x83\x22\x8e\xa2\x9c\x01\x69\xbb\xfb\x1e\xda\xd2\xa6\xf4\x95\x9e\xb6\x1a\x15\x2f\xc1\x67\xbe\x5e\xaf\x46\xf4\x7b\x8d\xde\xab\x46\xf4\x62\x14\xd4\xdc\xab\xd7\x6f\x7a\x4e\x66\xe7\xff\x99\x3d\x8f\xcc\xe4\x24\xde\xff\x4f\x9a\x93\xb8\x32\xd9\x8f\xf5\xda\x6b\xad\xbd\xf7\x5a\x3b\xf3\x73\x6c\xb3\x3b\xe6\xd8\xc7\x71\xf9\x3e\x3e\x47\x3e\x1e\xc1\x34\xc3\x5a\x64\xfa\x93\x7d\x7e\x84\x3f\xe7\x4b\xfb\xfb\xde\x71\x7a\x82\x7f\xb5\xe8\xbe\xdf\x82\x3e\x19\x4c\xb4\xb3\xfb\xda\x21\x73\x18\x82\xeb\x58\x6e\x8c\xb0\xbe\x0a\x96\x29\x58\xc5\xdc\xf7\x93\x81\xfc\xc5\x24\xf4\x57\xb4\x7e\x1c\x1f\x62\x83\x4f\xef\x1e\x2c\x3b\xce\x37\xe6\xe8\x4d\x1f\xfe\xa9\x41\x7e\x47\x96\xde\x13\xaf\x9b\x1c\xb7\xd9\x16\x47\x32\x9e\xd0\x9b\xdb\x6e\x8b\xf1\x75\x6c\x6e\x9b\x71\x84\x78\xea\xc7\xd1\xbc\x71\x1f\xfe\x77\x7b\x36\xe2\xef\x5e\x9a\xab\xb7\xb3\xf4\x93\x57\x04\xeb\x9a\xd2\xbd\x2e\xed\xd0\x9f\x26\x4e\x23\x2e\x25\x3e\xe2\xfb\xef\xfe\x36\xaf\xbf\x7f\xde\xe7\xcf\x67\x47\x2f\x1d\x27\xd3\xa1\x3f\x1f\xee\xf4\x2e\x0c\x02\x26\xe1\xf1\xbb\xf9\xe9\x5c\x70\x12\x31\x2c\x65\x18\xe4\x33\x58\xe4\xd7\x15\xc2\x27\x11\x27\x73\x4b\x27\x73\xb4\x6e\x8a\xbc\x20\x71\x9a\xc0\x1a\x19\xc3\xe2\xc4\x8e\x61\xa9\x0e\xb4\x6d\xd9\x2e\x40\x43\x14\x33\x4e\x53\x06\x44\x85\xe7\x8a\xba\x6a\x43\x0d\x5a\xa6\x6a\x3a\xed\x82\x60\x2a\xa2\x21\x16\x4a\x82\x00\x08\x64\x64\x80\x8e\xcc\x0c\x03\x2a\xa8\xc5\x8a\x52\x21\x03\x39\x15\x42\xb5\xa0\x23\xd5\x00\x86\x86\x4a\x40\x67\x19\x04\x81\x91\x41\x32\x29\x73\x65\x89\xe1\x14\xce\xb0\x39\x91\x67\x34\x6d\xa4\x2d\x3b\x45\xd4\x42\x12\xb2\x11\xe4\x8b\x3c\x60\x01\x2b\xcb\x5d\x02\x42\x07\x08\x50\xb6\x45\x43\xb1\x6d\x53\xd2\x4d\xeb\x71\x5d\x91\x4c\xdb\xb4\x04\x5d\xb5\x34\xd5\xd2\x15\xdb\x6d\xf3\x8c\x68\x8b\x35\x45\xd2\x48\x1e\x89\xa8\x62\x02\x0e\xa8\xb6\xa2\x5b\xaa\x96\xe4\xdb\x2d\x1b\xfb\xf4\x62\xc2\xbe\x7e\x66\xc1\x60\x78\x69\x5d\x82\x47\x22\x3b\xfd\xc9\x09\x7e\xa0\x5c\xec\xc8\x24\x78\x30\xb2\x65\x37\xdd\x96\xf0\x03\xed\x6c\x7e\x1a\xfb\xdc\xd3\x0f\xcf\x91\x79\xdf\xa6\x9b\x4a\xc8\x5d\xd4\xce\xb1\x37\x27\xe4\x37\xe2\xc1\x43\x77\x62\x3e\xf3\xef\x27\x1a\xdd\x82\xcf\x83\x25\xff\x26\x58\x6d\xce\xdc\xb0\xcf\xf7\xf4\x65\xd8\xe7\xbb\x37\xa6\x7b\x63\xf3\x1b\x24\xdf\x59\x1a\x6e\x1f\x24\x63\x59\x7a\xfb\xb9\x83\xfa\x60\xe8\xe9\xb0\xae\x9b\xe1\xdf\x19\x09\xc7\xb4\xb9\x98\xd0\x13\x91\xbc\x94\xce\xc7\x23\xfe\x61\x24\x2f\x31\xdd\x12\xe5\x6b\xe8\xb7\x4f\xc8\x41\x3a\x2a\x4b\x6f\x9e\x8d\xad\x8d\x72\x6f\x4c\x3b\x8e\x0e\xd1\x2b\x57\xcd\xb1\xa3\xfd\x39\x1c\x1f\xac\x03\x77\x1c\x1f\xac\x03\x77\xa4\x07\xaf\x97\x51\x1e\x87\x9e\xee\xa5\xe7\xe8\xde\x18\x7d\x9e\x78\xf5\x95\x54\x8c\x3e\x52\x6c\x4c\xf9\xa3\x78\xbd\x9e\xfa\x41\xdf\x3a\x82\xc7\xbb\xe9\x6d\x43\x7c\xdd\xd7\xe6\xe8\x41\x5f\xdf\x55\x06\xda\xfd\xf4\xf6\x0b\x13\xed\x38\x91\x8e\x3f\x2f\xb1\x1e\x59\xe1\xf3\x47\xc3\xfa\x3f\x52\xd8\xce\x71\x9c\x55\x7d\x33\x11\xc1\x83\x18\xc1\x6e\x4f\x2b\xe6\x77\x6f\x08\xbf\x4d\xac\x6d\x3e\xce\xff\x3a\x58\x1e\xf7\x3c\x98\xa0\x85\x1d\x3d\xef\x44\xf0\xe5\xe9\x27\xe9\xcf\x32\x6b\xb6\xff\xfc\xfc\xd4\x8a\xd3\x57\xbe\x94\x4d\xda\x4e\x31\xba\x6e\x9f\xbb\x0e\xfb\x74\x0a\xf7\xca\x9e\xec\x9e\x94\xbe\x97\xbe\x31\xbb\x66\xfa\x53\x97\xfd\x8b\x48\xac\xdc\xcd\xac\xda\x42\x17\xbf\x75\xf5\x77\xc5\x72\xc4\x57\xe5\xde\x18\xb6\xbd\x7f\x8e\x9f\xe7\xfb\x5b\x37\x27\xf8\x2a\x92\xe5\xe8\x7e\xa4\x9a\xb4\x33\xa6\x92\x67\x4d\xbe\x10\xf2\xf3\x91\xcb\x89\x54\xc0\x3f\x41\xfb\xbe\xcc\xec\xfe\x02\xa6\x7a\x17\x7f\x27\x84\x6b\x68\xb0\x2a\x7d\x3f\x26\x67\x3d\x5b\x2c\xbf\xc9\xc5\xdf\xfe\x4b\x8c\x1f\x22\x3a\xee\xd8\x3b\xd8\x6f\x9c\xde\x39\x50\xf7\xd0\x53\xdf\x1b\xfc\xfc\xc6\xfb\x87\xc0\x9f\x22\x06\xda\xef\xfb\xff\x32\x87\x1e\xf8\xf9\xfd\x78\x4f\x8e\x00\x84\xed\xdf\x73\x22\xc6\x3d\xdf\x2f\xf4\xfa\xc8\x14\x3e\x54\x48\x00\x7c\xd8\x30\x3b\xcf\x3f\xb6\xea\x1f\xe8\x9c\x97\xb3\xa9\x8c\x28\xdb\xa6\x4c\x11\x1d\xb5\x82\x9a\x40\x6e\x40\x08\x11\xef\xb6\xc8\x02\xa8\x28\x3a\x6c\x41\xa7\x50\x70\x8b\x2e\xcf\x03\x15\x48\xa8\x81\x2a\x1c\xe0\xab\xae\x95\x52\x55\x55\xb1\x6c\x88\x9c\x7a\x86\x75\xca\x82\x0b\x51\xb9\x20\x9a\xa6\x8a\x5a\xa8\xaa\x6a\x8a\x52\xb0\xea\x40\x64\x19\x58\x07\x6a\x84\x13\x8c\xdf\x22\xde\x4b\xd9\xd3\xdb\xe7\xd7\xfc\x7d\x78\x1f\xbe\xe1\xf7\x31\xff\xc1\x8f\x67\xbd\x15\xe7\xa5\x3c\x80\x31\xf9\x7f\x92\xb4\x3a\xfa\x41\xec\x97\x87\xb9\xdc\xec\x6e\x31\xad\xd3\x99\x6c\xfe\xc2\xcb\xf1\xd3\xd5\x21\xf0\xef\x46\xf8\xc2\x70\x62\x9e\x9f\xd5\x31\x3c\x90\xe1\xdf\xcc\x1b\xcd\x55\x69\xcd\x65\x49\xcd\x85\x14\x7f\x82\xa3\x58\xb7\x48\x2a\x2e\x47\x67\xa0\x5b\x81\x6e\x11\x42\x52\x81\xa4\x88\xdb\x2f\x75\xd5\x20\xf7\xc5\xad\x92\xb7\x86\x62\x7e\x26\x48\xe2\xbe\xee\x07\xd2\x9b\xe9\xf7\x13\x29\xe2\x74\xcf\x6a\x21\xa9\xf1\xec\xf8\x80\x7e\xc0\xad\x5b\xce\xff\xf6\x53\xc7\x4e\xa6\xaf\x74\x2f\x20\x15\xb7\x48\xcd\x3b\xf1\x16\x8a\xf2\xdc\x6a\xf7\x52\xfa\xfd\x1c\x5a\x8f\xfe\xf4\x56\x70\xf2\xfb\x9e\x72\xff\xed\x29\xf7\x85\x2f\x7e\x91\xbc\xea\x29\xf2\xbc\x98\x9d\xc5\x65\xf3\x47\xcf\xc6\x6b\xf1\xad\x11\x4e\xaf\x4b\xaf\xa4\x3f\x9d\xcd\x1f\x7e\x11\xeb\xf9\xa9\x9f\xa6\x22\x1a\x94\x68\x39\x9b\x3f\x8a\xb3\x54\x1c\xd8\x95\xf0\x43\x18\x6f\xfc\x58\x0f\xfe\x36\x82\x5b\x69\xe8\xc1\x0f\xe0\x73\x3d\x87\x5f\x8c\xf1\xa5\x4a\xeb\x7e\xfb\x7d\xb5\x6f\x71\xec\xc3\x6f\x67\xeb\xfd\x89\x35\x8c\xcb\xe6\x8f\x7d\xae\xaf\x9d\xc0\xff\xf1\x9f\xdf\xfc\xba\xd8\xf3\xa6\xd7\xaf\xdf\xfe\x9e\x9e\x6d\xa0\xa7\xcb\x74\x21\x9b\x3f\x74\xd1\x9c\xf1\x60\xfc\x6f\xfc\x77\x7c\x86\xe4\xd6\x18\x0f\xe9\xb4\x90\xcd\x1f\x7a\x39\x43\x64\x69\xe7\x3d\x6c\xdc\x9f\x2d\x84\xfd\x46\x7b\x13\xbe\xbc\x49\xde\xf3\xf8\x2c\xc5\x85\xfd\x72\x78\xf0\x68\x1f\x9e\x83\xfd\x01\x0f\x92\xa5\x8f\x3e\x9b\xd0\x25\x5a\xd8\xfe\xfe\x83\x31\xfc\x94\x7a\xf3\x8d\xea\xd5\xfa\x36\x31\xef\xf7\x1b\xdb\xaf\xf0\x6d\x21\x3d\x7c\xfe\xf0\x2d\x09\xfc\xfb\x78\xfe\x69\xd8\xfb\x81\x07\x63\xbf\x31\xb2\xf9\x3d\xbf\x98\x83\x23\xc5\x9b\x9b\x8f\x53\x27\xd3\x3f\x07\x8f\x27\x62\xf5\x67\x23\x79\x0d\xe6\xf0\x6a\x04\x87\x69\xc7\xa3\x8d\xbf\xc7\xd1\x87\x0b\x36\x7c\x7e\xfa\xf4\x44\x3b\x16\xb3\x66\xaf\xfa\x03\xe2\xaa\x5b\xc5\x38\x7d\xb4\x78\xdd\xe0\xc4\x58\xc5\xb4\xe9\xe1\xe3\xe0\x2b\x1e\xfc\xd0\xcb\x11\x5c\xf5\xf1\xea\x8f\xf5\xc0\x87\x62\xcf\xab\xbd\xb1\xee\xf8\x79\x82\xef\xd8\xf0\xf9\xe9\x5e\x4e\xdd\x82\x9f\x6f\x62\xeb\x7d\x89\x39\xa8\x5d\x25\x38\x4b\x53\xc4\x7b\x4a\x1a\xb6\xdc\xc2\x7a\x28\x41\xfe\x21\xef\xbb\xd8\x7e\x83\x16\xc6\x15\x9e\xdb\x82\xed\x4c\x4c\xc1\x4d\x9d\xe0\xbb\xb2\x9f\x1b\xd8\x1f\xd7\x01\x29\x31\xae\x88\xae\xd3\x2f\x27\xe0\x7c\x36\x7f\xf4\xf8\x1c\xdc\xc2\x18\x2d\x0e\xc4\x74\x27\xee\xfb\xf0\x8a\xbf\xf7\x7c\x54\x6f\xd5\xee\xea\x7e\x5c\x61\x2b\xce\x74\x35\xf5\x9d\xfe\xf5\x2a\xc0\xd3\xaf\x63\xed\x97\x68\x35\x84\xef\x9f\x8a\xc9\x6d\x4c\xce\xa3\x3d\x0e\x9f\x0e\x42\xf8\x7c\x62\x6f\x47\xf6\xe4\x3f\xd0\x2f\x37\xc6\xe0\x62\xaf\x9d\x68\x2f\xc3\xd7\x0b\x5c\xc8\xd9\x5b\x93\x67\xc2\x22\x3d\xb5\xf7\x9d\xb1\x7e\xb1\x7c\xfa\xd8\xdf\xf1\xa9\x08\x6e\xf6\xf0\x90\xa5\x8f\x2d\x8d\xb5\x83\x7d\xf8\x03\xab\xe7\xc8\x08\x5e\x73\xf6\x6e\xed\xc3\xa7\xed\xe7\x28\x0e\xf4\xdd\x97\x22\x7e\x09\xea\x58\x6f\x9a\xc5\xb1\x5e\x5c\x09\xe4\xb9\x5c\x6c\xac\x91\x8e\xd9\x7a\x4f\xcc\x96\xb1\x69\x25\x1b\x3c\x7d\xe0\xf7\x89\x31\x45\x73\xd8\x50\x88\xf5\x81\x6b\xea\xf8\x7c\x77\xfc\xe6\x84\x2e\x89\x70\x77\x6c\x24\x06\xd7\x63\xb4\xb7\xfa\xe5\x16\xc3\x03\xe9\x9d\xfa\x76\x52\xbf\xf9\xf3\x3b\x70\x5d\x8c\xfe\xb0\xc7\x17\xdb\xb3\xfd\xfc\xb5\xef\xa5\x3e\x3c\x05\x76\xbb\xdf\xf7\x91\x7d\x09\x3d\x16\xcd\x6d\xff\x7d\x31\x79\xc3\x7b\xb8\x1e\x2e\xb2\xf4\xbe\xef\xc4\x9e\xf7\xf3\x25\x7e\xbb\x4f\xfe\xc3\xfc\x9f\xb8\x9d\x22\x17\xeb\x17\xdb\xeb\xfe\x38\x9f\x3b\x1a\xc3\xb5\xe1\xe9\x0b\x1f\x77\xfb\xca\x09\xfd\x29\x45\xfc\x3b\x47\xcf\x07\x72\xf6\xe6\xfe\xf5\xc5\x6f\x7f\xdf\xb2\x18\x9f\xe2\x75\xc4\x87\xef\x7d\x21\xa1\xff\xa3\xf1\x44\x7b\x5f\x6a\xf7\x86\x74\x89\x3e\x97\x59\xb3\x7f\xf2\x9c\xd4\x8a\x07\x56\xfe\x30\x4b\x1f\x68\x0e\xd6\xc3\xfb\x42\xde\x7e\x4b\xf7\xfa\xf4\x76\x5c\xc7\xe8\x5b\x04\x91\x4d\x1f\x7b\xb2\xfb\xb7\xce\x65\xf8\xf9\x37\xa5\xbf\x44\x4b\xcc\x9a\xe9\xef\xbf\x65\x76\xf9\x33\xe2\x45\xd9\xe4\xba\x8a\xf7\xcc\xf6\xdd\xd8\x47\x1f\x4f\xbf\x69\xd9\xfc\xd6\xbb\x31\x6f\xbc\x90\xc0\xab\x10\xd1\x6d\x55\x0c\xaf\x9a\x67\xbf\x1f\xb9\x7e\x8e\x7e\x29\xf7\xf4\xc2\xbe\x5d\x09\x3a\x47\x75\xfc\xfa\xf4\x91\x1e\xd0\x2d\x7f\xd4\x8f\xa8\x2d\x0c\xbe\x33\xe2\xba\xea\xf8\xe8\x60\x1d\xb6\x1d\xfb\xc3\x04\x1d\xe2\x89\xe0\x82\x0c\x6d\x97\xfa\x35\x94\xa8\x89\xf9\x41\xd9\xc5\xa0\xdc\x24\x2e\xbb\x18\x15\x9b\x0c\xae\x16\x4e\x8c\x2e\x9a\x87\x93\x2b\x78\xe6\x17\x08\x6b\xd8\x2c\x5d\xb6\x70\x24\x35\xbe\x0c\x5f\xab\x5d\x44\xd9\xa0\x96\x71\x32\x40\x43\x30\xc3\xa9\xa2\xad\x38\x4a\x81\x65\x1c\xc1\xd6\x0c\xab\x28\x96\x4c\x99\x41\x3c\x25\x28\x82\xcd\x2b\xee\x3f\x40\x48\x6d\x4d\xff\xf8\xfe\x63\xa0\x8e\x78\x97\x21\xad\x56\xa3\x61\x19\x2c\xaa\x23\xc8\xb5\x1b\x8d\x76\x8a\x05\x6a\xc5\x81\x48\x6d\xd7\x01\x27\x20\xb9\x4b\x74\x09\xc0\x0a\x48\x07\xbc\xa3\xd9\x7a\x05\xb0\xa4\x08\x1a\xaa\x2e\xeb\xea\x7f\x77\x2c\x30\x9f\x73\x8b\x6d\xb3\x4e\x5e\x03\xa9\x6f\x42\x54\x80\x88\x17\x04\x1b\x6a\x8e\x44\x32\x10\xd4\xe6\xe8\xe9\xfc\x51\x5f\x1b\x55\x22\x59\xaa\x79\x6b\x87\xaf\x57\xf6\x7d\x3e\x46\x73\x3b\xc4\x7d\xb6\xb7\x5f\xa9\x85\x39\x11\x7c\xdd\xb8\x2f\x13\xe3\x1d\x5c\x3b\xd5\xa7\x2d\xfc\x4e\x82\x1e\x72\x28\x7b\xfb\x70\xdc\x93\x48\x13\x6a\xf7\xd2\x74\x9d\x36\x88\x31\xe2\x4c\x22\x47\x8c\x13\x17\xfa\xb7\x60\xe7\x85\xc8\x2d\x2c\x5b\x58\x00\x21\x72\x83\x6a\xc3\x0b\xf1\xbd\x03\x7c\x27\x6a\x9e\x9f\xe6\x24\x3b\x6f\x62\x32\x37\x36\x91\x9d\x47\xa6\x17\x2e\x9d\x47\xa4\x96\x2d\x06\x13\x0b\xa8\xbc\x46\x2a\xf5\x6a\xb5\xc5\xb8\x0e\xdf\xaa\xd5\x9a\x54\xb1\xc0\x40\x46\xa0\xfe\x7a\x6f\x1d\x4d\xdd\x06\xac\xbb\x1e\xfd\x32\x72\x6e\x03\xb7\x7e\xf0\xc1\xff\xf8\xeb\x6d\x7f\x44\xe4\xd3\x8b\x65\xb7\x70\xf3\xb8\x65\xb6\xb4\xd7\x1e\x04\x0c\xf9\xe8\x95\xee\x9d\xe8\xa6\xf6\xc8\xbd\x0a\xcd\x40\xc4\xdb\x88\x57\xcd\x2e\x61\x2b\x24\x63\x83\x3a\x20\x0c\xb3\x60\xeb\x9d\xa6\x82\x7e\xf2\x13\xeb\xb7\xe4\x83\xf2\x6b\x3f\xb1\xca\xa4\xa1\x36\x4b\x16\xec\x2c\x06\xd7\x02\x68\xdb\xc8\x40\x0e\xaa\xd6\xf4\x26\x60\xd1\x05\x85\xa7\xf9\x91\x62\x07\xed\xae\x26\x74\x54\x60\xb3\xdd\x16\xb3\x99\xed\x9e\x2c\xad\x8f\xe7\x56\x82\x3d\xdd\xb8\xe7\xc9\x84\x7e\x37\x42\xba\xed\x38\xa7\xdf\x16\x38\x70\xa2\x4f\x56\x85\xa0\x4e\x04\xa6\x4f\xf1\xeb\x09\xdd\xc5\x66\xf3\x5b\x52\x73\x64\xbb\x16\xea\xa2\x2c\x7d\xfc\x17\x7c\x5c\x57\x47\xeb\x53\xb4\x17\xea\xb7\x13\xca\x2a\xed\xdc\x94\xb0\x51\x7b\xcf\x9f\x9d\xd0\x29\x11\x7c\xdb\xa7\x13\x3a\xc2\x0a\xe1\x51\x6d\x2e\x35\x3a\xaf\x8c\x75\xf2\xfa\x07\x13\x7c\x67\x64\xf3\x3b\x3e\x84\xf7\xc8\x5e\xee\x87\xfb\xe3\xd9\xf6\x58\xc2\xa6\x90\x42\x3c\x6c\xfb\x64\xc2\xa6\x8c\xf0\x1c\xed\xfd\xfa\xbe\x0c\x17\xb6\x13\xed\x39\x7b\xb6\x20\xb6\xb1\xe1\xbb\x06\xe8\x44\x33\xac\x37\x39\x6c\x8d\xdb\x5b\x8d\xad\x35\x16\xce\x61\xd6\xc4\x67\x40\x45\xbc\xbe\x7e\x2b\x69\x57\xf8\x7d\x6f\xf9\x7a\xbf\xfd\xeb\xcf\x61\xc3\xf6\x18\x8e\xf0\x59\xef\x63\xdf\xee\xd9\x15\x53\xdf\xc4\x39\x7b\x35\x9c\xcb\x94\xc3\xb9\x65\xfe\x81\x18\x25\xc6\x70\xf5\xf4\xeb\xf0\xbd\xe2\x1c\x95\x1b\xcb\xf9\x0a\x8e\x0a\x2b\x6f\x25\x95\xdc\xd2\x40\x10\xc3\x04\x0a\xa3\x67\x83\x73\x41\x3a\x87\xeb\xd3\xe6\x3d\x29\x1d\xf9\x30\x95\xe9\xb4\x47\xa8\xcb\x3b\xdf\x29\x6d\xca\xfc\xe0\xee\xc3\x00\x42\x70\xd5\x86\x0d\x33\xe7\x90\x4a\xa3\x52\xd1\x14\xb6\x4b\xa0\x0a\x67\xea\xd5\x6a\x83\x62\x34\xd1\x12\x55\x16\x08\x62\x1d\x08\x40\x90\x90\x59\xaf\x4b\xba\x5e\x10\x9a\xce\xc8\xff\xb5\xd1\xc1\xf5\xe0\x31\x5f\xa5\x8d\x5c\xe7\xf2\xe4\x2f\x67\xd6\xa4\x9e\x86\xa8\x60\x23\x96\x2f\x40\x53\x71\x38\x9e\x64\x6d\x50\x2b\x1a\xb6\x6c\x1b\x6e\xb3\xd3\xd6\x24\x47\x33\x4d\x43\x91\x8a\xa4\x15\xd2\xbe\x14\xe1\x2d\x7f\xe0\x10\x5e\x9d\x4a\xb1\x35\x39\xa2\xc3\xa1\xdf\x27\xf8\xc2\x8c\x6c\xbe\x9b\x62\x38\x75\x22\xdb\x3e\x5e\x27\x32\x38\x43\xe0\xd3\x60\x8f\xdd\xbf\x96\xf9\x72\xf3\xec\xfb\xfa\xe9\x7f\xfc\x62\xec\xf3\xbd\x90\x68\x07\x86\x34\x8e\xee\xf3\x78\x7c\xf1\x00\xf6\x4d\xdf\xf5\x2a\x91\xa5\xf7\x16\x13\xed\x47\x72\xb9\xed\x97\xfd\x3e\xa2\xaf\xaf\x9f\x7d\xb5\xdf\x47\x7c\xf6\xbe\x01\x36\x11\x97\xcd\x6f\xfc\xfc\x00\xfe\x8d\xda\xd9\x31\x95\xb0\x33\xc4\x70\xbe\x53\xe1\x9e\x90\x89\x63\x18\x6a\x36\x3f\xf5\x3a\x8e\xc8\xd2\xf0\xab\xfd\xe3\x2c\x3d\xd0\x27\x97\xc1\x19\xde\x67\x3f\x93\x18\x8f\x1a\xda\x31\x1b\x71\x6c\x2a\x66\xdf\xc8\xe9\x4a\xcf\xc7\x3d\x32\xdb\x6f\x73\x07\xb6\xfb\x0f\x12\xe3\xb7\xb2\xf9\xe7\xbe\xd2\x37\xdf\x84\xad\x1f\x9d\x11\xe8\xf3\xa9\xa2\xbd\x6b\xab\xcb\xf8\x72\xb9\x93\xc6\xf1\xf9\x0a\x51\x8a\xf4\x16\xb6\xe9\x03\x7a\x7d\x34\xb1\x2e\xb2\x21\x3c\xaa\x71\xa4\x85\xe7\xda\x7d\xf8\xb1\x97\x13\x7a\x4e\xcf\xe6\xb7\x99\x73\xe8\x82\xf1\xb0\xeb\x8c\x39\xf0\xb2\x47\xaf\xe9\xf7\xcf\xb1\x91\xfc\xb3\x2c\x7f\x99\x33\x5f\xcc\xe7\xcf\xbe\x38\x07\xee\xdb\x02\xf3\xe7\xb4\xaf\xf4\xd6\x9f\x63\xe9\x7e\x7d\xb6\xfb\xf7\x83\xe9\xe5\x6b\x99\x0d\xc9\x18\xb8\x94\xcd\x6f\xc0\x27\x93\x36\x84\x7c\xe8\x74\xd5\xb4\x1d\xda\xa3\x0c\x7d\xe0\xb6\x08\xae\xa7\x2d\x8f\xaf\xb6\xe2\xfb\x11\x30\xe4\x2b\x3d\x5c\xf7\x0e\xad\xf5\x63\x33\x99\x3e\x5b\x7b\x77\xa3\x6f\x3c\xde\xbc\x82\x7e\xb3\xf4\xb1\x0b\x63\xfc\xd6\x5b\x07\xf2\xc5\x0c\xee\xe5\xc5\xc8\xcf\x2b\xc6\x64\x66\x7d\x6c\x6d\x8a\xf9\x1d\xcf\xfe\x70\xb0\x6c\x1c\x75\x13\x34\x28\x84\xf0\xdd\xdf\xef\xb7\x8f\x7d\x99\xd9\x7d\xc1\xe0\xb5\x72\xe3\x23\x09\x1e\x12\xb3\xf9\xdd\xe5\x39\x34\x33\xfc\x78\x14\x11\xdf\x3b\xf6\x79\x25\x6a\x67\xd7\xc9\x11\x5c\x8f\xfb\x23\x51\x8d\x27\xef\xf9\x6a\x18\x57\xc8\xd2\xbb\x64\x31\xc4\x9d\x67\x4b\x7b\x7e\x4d\x1d\xeb\xb2\x1b\x12\xb6\x47\x64\xeb\x6d\x38\x2d\x21\xdb\x62\x38\xdf\x9d\x71\x1b\xe0\xb6\x5e\x1c\xac\xf4\x9f\xdf\x8d\xf3\x8a\x19\xf2\xca\x51\xa6\x9f\xb7\xfc\xf1\xef\xbc\x37\xb1\xd6\x8b\xd9\xfc\xae\x73\x70\x84\xaa\x99\xc0\x73\x44\x97\xa8\x4e\x90\x1a\xea\x82\x03\xfe\xda\x5a\x4c\xc8\x7c\xd4\xfe\xd4\x8b\xfd\xcf\x3f\xf3\x52\x9f\xae\x91\xe2\xeb\x6a\x74\x5e\xc1\xd7\xd1\x91\xcd\xe0\xd7\xfb\x89\x3f\x3f\xfd\xe5\x3e\x1d\x17\xe8\xbe\x9d\x73\x65\xb8\xe4\xc9\xb0\x7f\xc7\x25\x82\x47\x35\xd8\x4a\x6f\x23\x88\x6c\x7e\xf7\xe9\xd8\xb2\x7e\x21\x36\x87\xc8\x67\x8a\xea\x50\xf9\x76\x03\x97\xcd\x3f\xf9\x66\xef\x37\x9e\xdd\xe0\x63\x2a\xd2\xf9\x5e\x7b\xef\x26\x92\x71\xaa\x20\xb7\x35\x3e\x95\x92\x9f\xde\x13\xce\x3e\xe8\x27\x56\x83\x6b\xae\x3e\x3a\xf2\x8b\x3e\x78\x36\xbd\x8b\xbe\x1c\xf3\xc6\xa6\x2c\xbd\xf3\xcb\xb3\xd3\x73\x79\x26\x76\x86\x43\xc7\xed\x47\xf2\x0f\xbf\x99\x58\x9f\x8c\x6c\xde\xb9\x6f\x8e\x7e\xc1\xbe\xf9\xd4\x4b\xde\xfc\xf6\x6c\xec\x9b\x1f\x1e\xd3\xf4\xae\xbe\xb5\x4b\xf6\xfd\xed\x67\x4e\xea\xd3\x91\x41\x1d\xa9\xad\x77\xf5\xcd\xc1\x4c\x3b\xde\xda\x12\xd8\xd6\x4a\x8c\xde\x56\x4f\xce\xa3\x9a\x20\x91\xdd\xf5\xcc\x82\xbe\x76\xbc\x7e\x85\x6c\xfe\x99\x4e\x02\x5e\xea\x6a\xbe\x3d\x16\x64\xb5\xae\x24\xe6\x1c\xe9\x85\x3d\x8f\x0c\xf2\x77\xb3\xb4\x13\xae\x69\xb7\xe0\xba\x43\x1b\xb3\x6b\xf7\x7e\x8b\x20\xc8\xcf\x8a\xc4\xc4\xe3\xd9\xfc\xe1\xeb\x3c\xbb\x00\x7e\x2d\x61\xa7\x78\x76\xc7\xcc\x00\x9e\x2e\x64\xf3\xcf\x7c\x7c\x8e\xbe\xc4\x7b\x53\xeb\xdf\x31\xe7\x79\xdf\x17\x1f\x19\x60\xbf\x1a\xd9\xfc\xb6\xcb\xe6\xe8\xa6\x58\x7d\x93\x18\x5c\x8b\xfb\x2d\x47\x4f\x0e\xfc\x3e\x2b\xc8\xd1\x71\x1a\xb1\x10\xe7\xbb\xbc\x86\xb8\x89\xb8\xb9\x97\x1b\x61\x0c\xef\x6f\x4c\xe6\x40\x90\xba\x30\xcc\xdf\x86\x6f\xaa\x2c\xf1\x4c\xd1\x25\x38\x65\x61\x0e\x8c\xce\xbf\x02\x8c\xe1\x93\x17\x39\x92\x4e\x8f\xaf\x00\xa3\x54\x8e\xa4\xa2\x44\x98\xcb\xf2\xd4\xa2\x89\x05\x0b\x97\x2e\xb3\xc0\x9d\x3b\xc1\x9d\x68\x2b\x58\xec\x9e\x03\xce\x44\x5b\xa9\x0f\x3c\xe9\x7e\xe5\xa9\xaf\x82\xbf\xa1\x93\xd7\x92\x7b\xd1\xff\x74\x3a\xe0\xcc\x05\xa8\x82\xd6\x5d\x08\x2e\xee\x74\xd0\xff\xa4\xfe\x28\x18\x8e\xa2\x74\x89\x8c\xa2\x6a\x8a\x60\x50\x2c\x5b\xd3\xda\x4a\xa5\x52\xec\x12\x72\xc3\x29\x89\x72\x53\xb2\x0c\x9e\x1e\xb9\xf7\xde\x07\x1e\x78\xf0\xc1\x07\xd0\x13\x7f\xbe\xe7\x9e\x3f\xff\xf9\xc1\x77\x3d\x78\xe8\x41\xe7\x82\xfb\xae\x9f\xf8\xd4\x92\xaf\x3f\x78\x68\xe4\xbd\x88\x53\x2c\x59\x01\x26\xaa\x37\x14\x43\xa9\x03\xb9\xd3\x40\x56\x97\x50\x34\x47\x86\xb6\x02\x25\xb3\x0a\xb8\x06\x2c\xd6\x02\xfe\xc1\x7c\x18\xe8\x9d\x5f\x11\x7d\x6b\x5d\xe0\x2b\xae\xee\xf7\x85\x82\xb5\xb7\x3e\x48\xdf\x65\xe9\x0d\x4f\x26\x68\x1a\xb5\x33\xf5\x42\xec\x79\x39\x80\xb7\xb3\xf4\x91\x4b\xaa\xf1\xb5\x94\xcf\xe6\x37\x51\xbe\x5e\x6b\x0f\x58\xff\x18\x7a\xf3\xff\x89\xf9\xa2\x31\xfd\x7e\xfc\xfa\xa8\x7d\x23\x1e\x07\xdc\x39\x2f\x66\x0b\xe0\x1a\x77\xb0\x82\xd7\x64\x5c\xbd\x78\xea\x9f\x07\xcd\x19\x6e\x8b\xc9\x18\x3e\xf7\x11\xd8\x7b\xdf\x89\xf5\x51\xa2\xb5\x68\x6e\x5f\x8f\xe1\x08\xdf\x9f\xf3\xc7\xb4\xed\xbe\x18\xdf\x97\x42\x78\x36\x79\x7e\xa4\xd8\x6b\xff\x99\xbf\x24\xec\xae\xa8\xfd\x6d\xf7\xc7\xda\x2f\xf6\xe6\xbc\xfe\xf1\x58\xfb\x3d\x78\x7e\x2f\xb6\xca\x82\xb3\x06\x7e\x4c\x25\xb2\x45\x8e\xcc\xc3\x23\x7e\x7e\xd0\xbc\x8f\x97\xfa\xe5\x31\x58\xf3\xde\x1c\xe9\x53\x39\xa8\xa7\xf5\x42\x86\xc8\xd2\x1b\x43\x1d\xb5\xd6\xa7\x11\xb3\xe6\xd0\xcb\x54\x6a\xf9\xcf\x56\x56\xb3\xbd\xfa\x1a\x6a\xb7\xe0\xdb\x11\xfe\x98\x37\xf5\xea\xf2\x5c\x95\xfe\x31\xfd\xa0\xd7\x47\xb3\xcd\xac\xdd\xbc\x80\xfc\x58\xf7\xa7\x17\xbc\xff\xaa\xaf\x30\xab\x9f\xfa\x24\x39\xd9\xfd\xaf\x8b\x1e\x5b\x79\x38\x8a\x39\x44\x73\x83\xbe\x27\xf0\xb5\xa0\x6d\xc5\xaf\x7b\x75\x74\xa4\xcd\xc4\xd6\x6c\xb5\xab\xa7\x4b\xb1\xb8\xf5\xdd\xd1\xbc\xae\x4b\xbf\x48\xbf\x87\x59\x7b\x7c\x11\xb9\xa5\xfb\xca\xf9\x6b\x45\x82\x59\xfb\xf9\xef\x91\x1f\x25\xa8\x0b\xb9\x95\x6f\xf3\x57\xd3\x78\x4c\x32\x90\x81\x4b\x12\xba\x52\x8d\xf8\x21\x9e\xfb\x18\xe3\xf1\xd8\x22\x8f\xbe\x4f\xfc\x29\xc2\x97\x1a\xc4\xaa\xaf\xc3\x63\xc7\xd5\x53\xa6\xbe\x1a\xd3\x9d\x91\x3c\x6d\x9e\xe9\x97\x1b\xdf\xfe\xd9\xf2\xa5\xd8\xfa\xa0\xf6\xec\xb1\xa8\xce\x86\xde\xa3\xa1\x47\x93\xa7\x7f\x1b\x7b\x3e\xbe\xcf\xf0\x7c\xbf\x2f\x14\xf8\x72\x7a\x8c\xd7\x63\x76\x51\x74\x0e\xc7\x9f\xb3\x14\xf9\x1e\x1f\x89\xc9\x9f\xdd\x8b\x8d\x1c\xfd\x71\x04\xd7\xfc\x7d\x2f\x5c\x91\x20\x8c\x07\x7c\x25\xea\xc3\xe9\xcd\x61\xaa\xdc\xef\xa7\xfa\xf0\xe7\xfe\x23\x66\x53\xc2\x9e\x6e\xd9\x7c\xd7\x60\x7e\xf7\x6b\xa1\x4c\xc5\x6b\xa1\x44\x78\xdd\x7e\x7e\xe4\x23\x68\xfe\x99\x28\x88\xb3\xe3\x6f\xfc\x7a\x6c\x1e\x4e\x4f\xa6\xa2\xfa\x0a\x7d\xed\xc0\x9f\xc5\xf0\x51\xe9\xed\x93\xed\xf9\x44\x0c\x6e\xc6\xf4\x26\x9f\x58\x23\x3d\xde\xf8\x86\x40\x64\xf3\xc7\x2a\x42\x26\x8b\x4f\xfc\x24\xf8\x55\x0b\x72\xca\xe3\xf9\xec\x3e\x0f\x73\xad\x6f\xdb\xdc\x85\x73\x34\x41\x66\xcd\x81\xe6\xc9\xaf\x5c\xf3\x8d\xab\xae\xcf\xd2\x7b\xbe\x93\xd0\x1f\x4e\xd4\xe7\x79\x09\xb8\x92\xcd\x1f\x7b\x2d\x61\xab\xa8\x78\x0f\x4e\x0a\xe7\x34\xf5\xa5\x44\xff\x6a\xd8\x7f\xaf\x96\x04\x8e\xe1\x14\xd2\x36\xad\x11\x0b\x88\x33\x82\x5a\x23\x17\x10\x97\x10\xef\x88\x45\x4d\x97\x2e\x5b\x48\xf7\xa2\x35\xf1\x84\xc1\xde\x0b\xd7\x17\xb9\xd0\x2f\x28\x89\x4b\x92\xf4\xd6\x5c\x9c\xe6\x7e\x6c\xd1\x64\x98\x4f\x75\x32\x97\x1e\x5f\x6a\x90\x6c\xb5\x58\x7c\x60\x39\x5b\x45\x65\x6e\xdd\xaa\x62\xb1\x44\xd6\x29\xd8\xd1\x1c\x52\x75\xa3\x17\xa8\xff\xc7\xb7\xc4\xc7\xd1\x5f\x50\x59\x3d\xf4\x27\xf9\xd7\x67\xda\x1c\xdf\xb0\x01\x44\x1a\xa8\xa3\x9a\x01\x08\x15\xfd\xf7\xb4\xfd\x53\xf4\xff\xb4\x3f\x6e\x41\x65\x32\x83\x6a\x96\xf9\xcf\x34\x63\xa3\x82\xed\xb6\x38\xde\xba\xf3\x4e\x87\xe5\x48\xd1\x06\x35\xb7\xe6\x32\x24\xa3\xa2\x9a\x86\xaa\x5a\x5d\x52\x2d\x55\x36\xf5\x0f\xdd\x64\x5e\x4b\x6b\xec\x9b\xc5\x52\xc9\x52\x2d\x4d\x31\xcc\x52\xb3\x59\xd3\x74\xd9\xb4\xd4\x3b\x45\x73\x80\x5f\x90\xa5\x37\x2c\x4f\xf0\x93\x96\xcd\xc3\xaf\xf7\xd9\x38\x7a\x7c\x3d\x8c\xf2\xdb\xab\x61\xec\x00\x9f\x96\x0b\x29\x73\x3c\xe6\x47\x46\xf1\x9e\xe9\x9b\x06\xf9\x84\x61\x4e\x7c\x82\x0e\xf6\x4c\x8d\xa0\x06\xfe\x24\x71\x99\x9f\xe5\x10\xa7\xbe\x1d\xcd\x8d\x4e\x84\x69\x6f\x97\x2d\x8a\xd2\xde\xe2\xa4\xb5\x38\xf7\xf9\xc4\xd8\xbc\x28\x77\x6d\x70\x73\x37\xba\x62\x11\x9e\xcf\x89\x2e\x60\x58\x99\x5a\x35\xd3\x26\x6b\x2d\xa6\x56\xcf\x34\x1a\x99\x16\xb0\x78\xd3\x99\x51\x1d\x93\x77\x6c\x51\xd3\x1b\x15\x80\x73\xca\xaa\xc8\xc9\x78\x7f\x34\xdb\x76\x4b\x29\xc1\x85\xa4\xe0\x56\x81\xc8\x30\x90\x63\x01\x7b\x42\xa1\x18\x5c\xdf\xbc\x32\x52\x35\x0d\x8b\xe2\x3a\x0d\x68\x98\x86\x69\xb8\x04\x2a\x57\x2a\x40\x22\xab\x9c\xa4\x89\xac\x61\x20\x93\x84\x92\x2e\xa1\xaa\x62\xba\x55\xcb\xb0\x2a\x3c\x57\x10\x44\xdb\xae\x58\x46\xa4\x3f\xa4\x6c\x7e\xe3\xbb\x89\xfe\x3d\x78\xa7\xa7\x3f\xb6\xf4\xce\xd2\x79\x70\xcf\x16\xf0\x35\xf2\xb1\xfe\xf5\x38\xd8\x9b\xdb\x13\xa3\x51\xa5\xa7\x0b\xb6\x7e\x38\x21\xf3\xd1\x3e\x43\x74\xd6\xac\xcf\x67\xdc\xf5\xc9\x98\x7d\x1a\xe3\x81\x8d\xb7\x25\x78\xa0\x10\xb6\xef\x14\xfa\x75\xb5\x3f\xfe\x43\x97\xc7\x74\x13\xec\xe9\xac\x28\x07\xbf\x6f\x8b\x45\x76\x83\x73\x79\xc2\x97\x54\xb3\xf9\xe7\xfe\x3d\xe1\x33\xae\xc5\x75\x20\x4d\x66\x8d\x23\xbc\x48\x5c\xfd\x06\x91\x60\x56\x1d\x7a\x99\x26\xae\x5c\x2e\xf6\xf5\x33\x3d\xed\xf9\x43\xd3\xc7\x12\xfe\x90\x18\xb7\x5d\xd6\xbf\x96\xd0\x25\x66\x52\x97\x4c\x1d\x8d\xda\xb3\xc3\xef\xb2\xf4\x46\x23\xfa\xcd\x75\x69\x87\xfe\x38\xb3\xc6\xbe\xec\xe2\xd4\x8a\xdb\x57\xbe\x14\xd3\x8d\x3a\x3e\x67\x8d\x71\xcf\x78\x7e\xea\x17\x70\xb4\x63\x7d\xd2\xc7\x9f\xde\x97\x90\x35\x35\xcc\x69\xeb\xf7\x73\xf4\x27\xad\xde\x7c\xca\x9e\x8f\xef\xc3\xa3\x5a\x04\x51\x5e\x9e\xf5\x3f\x9a\xe3\x97\x68\x21\x7d\xb3\x74\xe9\x63\x09\x3c\x2b\x91\xbd\x18\xae\xad\x16\x96\x7d\x25\x9b\xf7\x3c\x24\x86\x9e\x9a\x4e\xf8\x95\x91\x5d\x18\x9d\xc9\x8b\x7c\xe3\x40\xea\x8f\xf4\xdb\xda\xd3\x3b\xfb\xe6\x25\xc4\xe3\x5f\x53\xa5\x18\x3c\x66\x17\x1e\x58\x9c\xb0\x3b\x23\x5a\xac\xc7\x95\xb1\xa7\x0e\xe3\xf3\x64\xaa\x1f\xa3\xf2\xef\x98\xc7\xf2\x29\xfb\x67\xd0\xe7\xf9\xa9\xc7\x82\xdc\xca\xc4\xe9\x60\x31\x2d\x1a\xa8\xc5\x37\x9a\x7a\xab\x5d\xb0\x6d\x53\x17\x24\xb3\x68\xd8\x7c\xa1\x58\x17\x21\x44\x35\x08\x78\x12\xd2\x86\xc5\xbb\x15\xd7\x40\x35\x1b\xf0\x64\x95\x34\xd9\xcc\x4c\x99\xe3\x75\x4d\x68\xa1\x86\xa8\xab\xa2\x20\xa6\x20\x93\x41\x45\x97\x41\xac\x0a\xca\x64\x03\x54\xf8\xb8\xad\xb2\xed\x39\xbc\xa6\xbe\x2f\xc1\xb7\x46\x36\xef\x41\x18\x7a\xea\x50\x0c\x5e\x89\xc1\x7b\x77\x5a\x42\xf8\x8f\x71\x1c\x20\x3c\x2b\x15\xd5\xe3\xda\x83\xe9\xbb\xe7\xa5\x18\xde\xb0\x9d\x7d\x04\xc7\x85\xb7\x7e\xa8\x3f\x46\x34\xfd\x10\x8e\x59\x3c\x88\xa5\xec\x13\x41\x1f\xc1\xd9\xf1\xad\x1f\x4c\xfc\x46\xea\x0a\xe9\x3a\x8e\x65\xe0\x38\xcb\x14\x3e\xf7\x42\x90\x44\xc5\x8f\x79\xe3\xfd\x46\x7c\x72\x8f\xca\x91\x9e\x1b\x79\xc9\x4a\xb0\xf0\x54\x70\x3e\x78\x43\x7e\x92\x99\x97\xa3\x16\x63\x3f\x73\x5e\xb0\xf9\x5b\xa1\xad\x59\x93\xa7\x4c\x59\xb1\xf9\x4c\xa6\xc8\xc8\x4a\xd9\x51\x25\x97\x85\x40\x00\x02\x87\x64\x54\x16\x1b\x08\x92\x2d\x53\xb6\x64\x8b\xe6\x20\x6a\x74\xda\xa8\x26\xaa\xaa\x50\xd2\x14\x03\x70\xa4\xd5\xe1\xd9\x82\xa5\x70\x66\xaa\xe2\xda\x95\xba\x5c\xab\x24\x7c\xfd\x12\x8e\x11\x4d\x3f\x10\xb3\xfd\xf0\x19\x96\x83\xf8\x9c\x69\xdf\x19\x16\x25\x9b\x9f\xc6\xf9\xad\xa6\xfd\xfc\x50\x23\x01\xfc\x4e\x62\x31\x71\x2e\xae\x35\x4d\x2c\xc1\xe9\xb7\x3d\x3b\x60\x2c\xf2\x87\xd3\xe3\x4b\x97\x5d\x3c\x5e\xb8\x08\xe4\x27\xe9\x34\x7d\x1a\xa0\xe7\xe1\x54\xc9\x18\x03\xa3\xf3\x17\x4c\x70\x4b\x97\x2d\x3c\x95\xc4\xd9\x23\x73\xde\x12\x34\x92\x1e\x9f\x17\x6c\xba\x8e\xf0\xf7\x6e\x05\xbf\xfb\xba\xf8\x1a\xda\x44\x9e\x36\xff\x80\xa6\xdd\xa9\x68\xba\x25\xef\x7e\xf3\xe2\xc5\x13\x85\x93\xd2\x27\x9f\xca\xf2\xff\x22\xdc\x6a\xcc\x9f\x79\x1d\x05\xdd\x3a\x0f\xda\x6a\x13\xd8\x0a\x5b\xe4\x14\x0b\x29\xc8\x31\x91\x6d\x94\x8a\x1c\x6a\x55\xc5\x52\x0d\x54\x14\x55\x97\xf5\x9b\x24\x20\x93\x4f\x80\x47\xcf\xbb\xf2\x41\xe9\xf5\x1d\xe4\xa0\x6a\x49\xbd\xd7\x78\xfa\xc0\x9d\x77\x7e\xfe\xe9\x6b\xaf\xbd\x57\x7f\xc3\x47\x6e\x30\xae\xd4\x9e\xa3\x4e\xf9\xeb\xee\xff\x28\x93\x8c\x87\x51\x4e\x2e\x88\x45\xa1\xa2\xb3\xaa\x43\xa9\x9d\x02\x2f\x42\x85\x33\x52\x65\xd7\xd6\x6d\xdd\xb6\x12\xb1\x99\xa7\x7f\x4d\x10\xcc\xea\xc3\xef\x24\x48\xf0\xd1\x15\xaf\x5e\xfc\x95\x44\x2d\xd7\x0f\xe0\xf8\xe0\xa6\x04\xae\x3d\x5e\x7c\x0e\xef\x71\xde\x19\xc0\xcd\xb0\xad\xe7\x70\x4d\xf5\xa7\xc3\x3d\x01\x1b\xfb\x38\x5c\x36\x7f\x1c\xdf\x2b\x3a\x22\x27\xfc\x84\x42\x48\x9b\xdd\x2b\xfa\xed\x75\x1f\xbe\x8f\x8a\x64\x20\x3c\x33\xbc\x1b\xf3\x67\xb8\x56\xed\xc2\xed\xbf\x8b\x59\xbb\xf3\xea\xce\xdf\x88\xf1\xcb\x1e\x5c\x7e\x83\x3f\xaa\xa0\xf6\xb4\x7f\x8e\x0c\x9f\x50\xdf\xfb\x6c\xc4\xeb\x41\x0c\x78\xef\xe6\xc4\xdc\xfc\xda\x38\x56\x36\x7f\x1c\xdf\x60\xd8\xba\x24\x61\xaf\x1b\xd9\x7c\xb1\x99\x98\x9b\x11\xc6\x89\x0e\x2b\x1e\x7c\x7f\x78\x17\xa8\x88\xe1\x52\x36\xbf\xf9\x8e\x04\x8e\xfc\x7d\x10\x21\x9b\xdf\xf7\xa3\x04\x3c\xca\x61\xbe\x15\xe3\x7a\xeb\xfb\x83\xb8\x8f\xdf\xfe\xcd\xb8\x5e\xa8\x9f\x5d\xf7\x1a\xe2\x7a\xbf\xa6\x45\x3c\xee\xe3\xfd\x37\x2f\xa8\x42\x11\x56\xa3\x48\xf2\x29\x9d\xa6\x07\x33\xea\x85\x24\x42\xdf\x06\x93\xe8\x5f\x80\xd5\x79\x2b\xd8\x88\xbe\x07\x96\xa2\x7f\x5d\xf7\x95\xaf\x80\xeb\xbf\xe6\x76\xf0\xdb\x89\x7f\xa5\x0a\x88\xe7\x40\x4b\x69\x81\x92\xcc\x16\x79\x55\x40\x04\x72\x2c\x04\x8d\x62\x09\xf3\x68\xb9\x02\x1a\x32\x0b\x39\x89\xbe\xb9\xd3\xf8\xda\x27\xbf\xbf\x6e\xdd\xf7\x3f\xf9\x35\xf0\xa3\x6f\x7d\xeb\x5b\x2e\x7a\xfe\xf9\xe7\x81\x05\x51\xd3\x63\xc6\x82\x5e\x28\x17\x38\x0d\x52\x6a\x47\x60\x45\x5b\xe5\xcc\x54\xc9\x85\x4e\xb1\x50\x86\x81\x6f\xee\xe7\x4a\x52\x71\x0c\xed\xb4\xc4\x1a\xa0\x64\xf3\x1b\x3a\x09\x5a\xd9\xe1\xda\xb9\x75\x4d\x02\xae\x86\xf5\x27\xb7\x62\xdd\xba\xf5\x03\x31\xdd\x8a\xe1\xf0\x2b\x7d\x34\x0f\xd6\x98\xad\x6b\x71\xbc\xe5\x40\x2c\x56\x80\x79\xa1\x84\xe3\x96\xa5\x85\x09\x1a\x4a\xd9\xfc\x6e\xbc\x66\x7b\x5c\x1d\xe3\x05\x0f\x5e\x4c\xf0\xc2\x2d\xdd\x85\xe9\x2f\xd2\x4f\x65\xf3\x5f\xfc\x04\x71\x72\x96\x3e\xae\xbe\xfa\xdd\x60\xfc\x41\xbc\xb4\x34\xbf\x57\xc3\xef\xd9\x2b\x82\xb1\x06\xb1\xa1\x0d\xed\xc4\x1c\xc4\x68\xce\x78\x7f\x07\xbe\xd6\xbf\xae\x6e\x6d\xe3\x33\x7c\x6b\xfb\xed\x88\xad\x58\xf6\x22\xb8\xe9\xef\x6b\x87\x73\x3e\xf2\x81\x08\x1e\x8e\x89\xc1\x63\xca\xe2\x99\x8f\xc6\xda\x32\x22\x1e\xbd\x33\x86\x27\x3f\xff\x0f\xa6\xdb\x54\x2f\x2f\x90\xec\xe7\x9a\x74\x70\xc4\xe6\xf8\x7b\xa2\x3e\x02\x39\x2e\xad\x4d\xe0\xcf\xa7\x9b\x9e\xcd\x6f\x7d\x6f\x62\xac\x4a\x24\x93\xb8\xfd\x8d\xcf\x27\x64\xd8\xce\xe6\xb7\xde\x9e\x78\x3e\xa2\xdb\x71\x0c\x3f\xfe\xde\x04\x5c\xca\xe6\x8f\xdf\x86\xe1\x6a\xd4\x7e\x40\xff\xf5\x3f\xec\xb5\x43\x50\xa1\x8f\x12\xc8\x1e\x31\x0f\x27\x11\x0c\x12\x09\x06\x09\xe6\x01\xae\xc5\x31\x9a\xd3\x80\xec\x50\xa2\xe3\xf9\x09\x4e\xa7\xe2\xa0\x12\x68\x51\x62\xa7\xe2\xbd\x52\x3c\x90\x51\xc9\x7b\xc1\x99\x32\x84\x29\x09\x89\xa0\x32\xdb\x04\x95\xc8\x36\xc4\x76\xc3\x66\xff\x84\x60\xe8\x07\xe9\x5d\xcb\xf3\xc5\x89\xd3\x83\xec\x46\xe7\x13\x17\x87\xd1\xde\x20\x1b\x6e\x94\xce\xd0\x73\x52\x53\x31\x77\xd5\x77\x54\x97\x8c\x78\xd2\x6d\x03\x11\x52\x1c\xc4\x23\x50\x67\xf4\x94\x3c\xc3\x36\x81\x8a\x2a\xa0\xee\x79\x2a\xe1\x0b\xf0\x86\x55\xd3\xaa\x24\x03\x88\x86\xd8\x6a\xa5\xea\x8e\xe3\x38\xb6\x2b\xda\x88\xb3\x49\xdd\x26\x2b\xb6\x8d\x14\x88\x64\x88\x4a\x4a\xd1\xd2\x6c\x53\x31\x6c\x5b\x4e\xda\x79\x47\xbe\x81\xed\xc2\x77\xc4\x74\x38\x96\xd9\x7d\x9f\xc0\x1c\x74\x6a\x8c\x27\xfc\x58\x3d\xde\x3f\x3f\x14\xc6\xff\x1c\x6c\xa7\x7a\xb4\xc4\xb5\xb2\xb7\x62\xda\x10\x00\xe7\x09\xf6\x68\x70\xf6\xdc\x3c\x8e\xb1\x23\xfd\x74\x7a\x9c\x00\x6d\x58\x90\x40\xd5\x21\xcb\xae\x84\x6f\x11\xb0\xed\x36\x25\xbb\x90\xd4\xdc\xa6\xa2\x9b\x80\xa0\x85\x42\x11\x82\x92\x37\x0d\xc9\xfb\x07\x41\x19\x82\x72\xc9\xd2\x80\x10\xea\x13\xdb\x1f\xdb\x8e\x13\x58\x37\xf7\x7c\x15\xdb\xdf\x77\x2c\xbd\x0e\xfb\x24\x37\x04\x36\x84\x3f\x17\x83\x38\x89\x38\x93\xc8\xe3\xaa\x12\x81\x87\x99\x1f\x4f\x8d\xa4\x96\x2e\x5b\x18\xd5\x4b\x59\xba\x6c\x09\x18\xcb\x8d\x32\xd4\xf8\x0a\x30\x39\x9a\x5a\x98\xc8\x11\x15\x53\xe1\x1e\xe1\x46\x64\x8e\x21\xeb\x27\x6c\xb2\xc1\xb0\xc8\x04\x1c\xe0\x1a\x65\xb5\x59\x74\x04\xd4\xee\x12\x35\x44\x88\xed\x3a\xaa\xa4\x9c\x99\x4c\x05\x6a\x32\x28\xd9\x05\x20\x3b\x24\xeb\x36\x71\x1a\x00\x73\x46\x22\x21\xe2\x41\x1d\x29\x82\x68\x15\x69\x43\x14\x6d\xbb\xc0\xb7\x04\x49\x14\x75\x85\x17\x4c\x45\x14\x65\x9b\x2b\x88\xa8\x66\x23\x03\x95\xbb\x84\x0a\x5b\x45\x50\xab\x16\x54\x08\x71\x7a\x27\xef\x9f\x22\x49\x15\x7c\x0f\xd4\xd3\x05\x36\xae\x62\xb6\x22\xb8\xe3\xb2\x30\xba\xc6\xc9\x50\xe3\x4b\xb3\x93\xa3\xb9\xfc\x78\x2e\x95\x5b\xba\x2c\xb7\x80\xea\xcb\x7d\xd5\x37\xaf\x26\x59\xe3\x79\xa8\x53\x19\x54\x11\x54\xd0\x9c\xe1\x2a\xb6\x2a\x03\x5b\x10\x51\x95\xd4\x80\xad\x0a\xae\x2a\x2a\x90\xe3\x80\x8c\x3d\x6c\x92\x40\x04\x69\xcc\xf0\x64\x15\xb1\xa0\x89\x34\x41\xb4\x9c\x54\x55\x12\xa4\x2a\xb4\x74\x0b\x15\x90\x85\x6a\x4a\x09\x30\x35\x92\x35\x8d\xb6\x61\x1a\xa8\x5c\x90\x45\x08\xad\xaa\x55\x85\xb0\x6a\x55\x35\x49\xaa\xfb\xf6\xab\x8e\x73\x82\xe8\xc4\x59\x38\x96\x40\xe3\xc2\xb2\xe9\x89\x81\x9c\x04\xf0\xf4\x82\x84\xd1\x0b\x89\x25\xe9\xc5\xd4\xc2\x05\x69\x3a\x96\xba\x0a\x9f\xa5\xc3\x37\x5e\x3d\x37\xc3\x2f\x2e\x9b\x22\xb8\xc2\xbd\x5a\xe1\xd1\x02\xb4\x01\x8f\xea\x80\x41\x2d\x20\x77\x6a\x40\x46\x0d\xc0\xcd\xb2\x94\x86\x6c\x51\xd4\xc5\x7b\x45\x53\xdb\x9a\x01\x13\xd4\x75\x97\x76\xca\xbf\xcd\xcc\xbb\x45\xb2\x25\x93\xb7\x34\x51\xcc\x54\xbb\x84\x0e\xf8\x36\x5f\x6e\xc8\xad\x32\x57\x70\x0c\xa5\x5d\x41\xa5\x11\xcb\x30\xae\x05\x19\xc0\xbd\xbe\x06\x14\x54\xb4\xf1\x9a\x6b\x59\x40\xb3\x80\x0a\x6c\xa8\xc9\x56\xe9\x43\xba\x54\x7a\x94\xef\xb4\x5f\xb7\x55\x22\x59\xe5\xdf\xb6\x3f\xc8\x39\x7c\xa9\xa4\x29\xa8\x5d\xb1\xcb\x40\xc8\xd8\x5d\xc2\xb0\xcc\xb6\x28\x42\xd1\xb4\xda\x3d\x3d\xab\xe0\x33\x58\x78\xbf\xbc\x14\x9e\x15\x13\x22\xfd\x8b\xf5\xa3\x83\x63\xe6\x44\x8a\xb8\xa5\xbb\x3c\xfd\x04\x7d\x1f\x71\x16\x71\x45\x50\xc7\x0e\x63\xd1\x63\xf0\x89\x81\xf4\x06\xc9\x2f\x96\x2c\x4c\x8d\x2f\xc1\x5f\x2c\xc2\xa7\x0f\xfb\x6b\x47\x2e\x0c\xb0\x3f\x52\xca\x2f\xf9\x8c\x3e\xf9\xc4\x85\x1b\x9e\x00\x37\xa3\xbd\xe0\x52\xf4\x7d\xf0\x58\xe7\x4c\xf0\x23\xf4\x1b\x70\xd6\xec\x67\xed\x82\x0d\x71\xf9\x39\x0f\xbd\x02\xd3\x29\xb1\xc0\x42\x75\xc0\x57\x79\xde\xd4\x53\x4d\xdd\x90\x54\xce\x94\xe4\xd9\x32\x84\x23\xd2\x6c\xd9\x7b\xa5\xee\x5c\x7d\xf9\x55\x07\x9e\xbd\xe4\x43\x1b\x37\xde\xf3\xe2\x3d\xdf\x58\xb7\xee\x1b\xf7\xbc\x08\xc8\xf3\xd7\x38\xce\xbd\x5f\x7a\x70\xef\x82\x4f\x5d\xff\xb9\xb3\xbe\xf4\xe0\x97\xae\xbf\xfc\xaa\xbd\x9d\xdf\xb8\x37\xbc\xfb\x56\xe6\x29\xe6\x86\xa5\xe8\x55\xea\x43\x7f\xba\x13\x1d\xfa\xa0\x37\x77\xa5\x2b\xa5\x59\x9a\x25\x58\xe2\xf5\xc1\x19\x58\x02\xcc\xc9\x96\x4d\x7a\xa2\x70\x3a\x98\x97\x1b\x3d\x17\x8c\x7a\x4c\x34\x9a\x1b\x9b\xbf\x64\x34\x37\x9a\x66\x55\x55\xb5\x39\xa8\x88\x6e\xdb\x71\x9b\xbc\x03\x0d\xd5\xc1\x9c\xed\x90\x99\x59\x99\xcc\xf8\x9f\x68\x76\x86\xd3\x75\xc6\x61\x74\xa0\xb8\x4d\x92\x45\x25\x54\x57\x5b\xc0\x02\x0c\xd9\x44\x1c\x90\x50\x19\x48\x9d\x3a\x90\x8a\x72\xdb\xfb\xe8\x8f\x4b\x4e\xdb\xb4\x40\x8c\x13\xe7\xe3\xca\x2f\x02\x41\x80\x60\x18\xb9\x24\x7e\x71\xfd\x78\xff\xc2\x75\x6e\xd1\x1b\xf2\x93\xde\x03\x78\x98\xa9\xb3\x40\x6e\x14\x8f\xb7\x5a\x28\xd9\xa6\x9a\x2a\xaa\x9a\xac\xf3\x86\x2c\x22\x56\x69\xea\x9a\x2c\x64\x20\x67\xa3\x92\xd6\xb4\x11\x07\x1a\xa4\x85\x58\xd7\xf4\xdf\x49\x1e\x69\xa8\xa2\xb4\x80\x0d\x58\xb2\x3d\xab\xe9\x1a\x03\x19\x5d\x41\x85\x02\x9f\x29\xe8\x62\x55\x50\x54\x32\x43\x99\xa8\x06\x0a\xa8\x66\xd7\x54\x5c\x83\xa1\x80\x6a\x3e\x3f\xa9\x5d\x89\x6e\x61\x79\xf4\x57\xb6\x8b\x42\xdd\x3e\x00\xaf\xde\x7c\x96\x52\x73\x10\x4b\x31\x65\x4e\xa0\x4c\x55\x55\x4c\xde\x52\x44\xc4\x3b\x6e\x5b\x74\xec\x36\xd0\x84\x76\x50\x57\xa7\x3e\x0b\x41\xcb\xff\x44\xeb\xbc\xa6\xce\x38\x78\x94\x1a\x90\xdc\x16\xc9\xa0\x1a\x6a\xe2\x12\x23\xa4\x62\xb8\x0d\xc0\xa2\x26\x60\x5d\x01\xb0\xac\x09\xbd\x8f\x78\x0d\xb6\xf0\x1d\x01\x9b\x48\x61\xba\xbf\x91\xb8\x84\x58\x8a\x75\x7c\x3a\x3f\x9e\x0a\x16\xa2\xb1\x5c\x3f\x33\x07\xf9\x85\x41\x6e\x12\x2f\xca\xe1\x7b\xca\xd0\x54\x55\x51\x67\x55\x8a\x2f\x7a\x4b\x2e\xe9\xe8\x9a\x6e\x73\x65\x55\x44\x44\x11\x11\x0e\xe9\x74\xea\x80\xc7\xac\x51\xf4\xfe\xba\x4a\xef\x33\x6d\x8b\x92\x2e\x8b\x65\x90\x41\x6d\xdb\x99\xad\xa9\x2a\x0b\x59\xb9\x82\x3c\x73\x43\x1e\x69\x3b\x88\xa8\xd5\x6a\x6e\xbd\x5a\xc5\x07\x56\x52\x80\xe8\x4a\xe9\x0c\x2d\xe3\xfa\xad\x17\xe0\x33\xdb\xb8\x0a\x4a\x7a\xc1\xc2\xc1\xa3\x0d\x8a\x19\xe2\x98\x77\x7c\xcc\x40\x4e\x71\xd5\x36\xcf\x93\x19\x55\xd3\x6c\xbe\xac\x0a\x6e\xb3\xe8\x36\x6c\xb2\x54\x2c\xa9\xe5\x62\x19\xce\x36\x45\x92\x73\x1b\x64\xd5\x5b\x7f\x5c\xa1\xf7\x99\x96\x8d\x8a\xc9\xb0\xb3\x25\x55\x63\x1d\x56\xae\x7b\x26\x0f\xe2\x53\xbc\x24\x98\xa2\xa4\xea\xae\x52\xa9\x54\xdc\x66\x25\xa8\x05\x60\xe1\x58\x14\x93\xcd\x1f\xc4\xb9\xcd\x0f\xfe\x38\x16\xa3\xe2\x3d\x3b\xee\xe0\x4b\x09\xb8\x83\xef\x81\x78\x70\xcf\x5e\xcb\x1f\xc4\x11\x91\x83\x35\x3c\xf7\x4c\xd7\xa0\x5b\xa9\x46\x50\xc3\xd6\xb3\xdc\x08\x10\x18\x6b\x71\xf1\xf4\x5e\x74\xcb\x99\x55\x1c\x27\xc4\xf3\x6c\x0c\xe3\xa9\xc6\x09\x08\x21\xad\xb9\x2a\x99\x71\xdb\x64\x66\x56\xc5\xdf\x11\x21\x7e\xc5\x34\x41\x1b\x51\x0f\x67\xf6\xfa\xf0\xd8\x02\xf4\xf5\x93\x26\x8a\xb3\x72\x91\x2c\x96\x5c\x19\xb7\x52\x22\x89\xd9\xe8\x13\x22\x52\xcc\x4c\xc1\x71\x52\x35\xa0\x21\xe8\x96\x40\x19\x49\xa0\xdc\x21\xfc\x77\xbf\x3f\xa6\x2b\xd0\x0d\xba\x30\xa7\x3f\x8f\x76\x83\xe6\xd5\x70\x50\xc6\xfb\xe7\x80\x36\xca\x90\x10\xb4\x67\xf5\xf0\x13\xca\xd0\x85\x99\xa6\xe9\x3a\xa4\x6a\xa6\x58\x44\x78\x9d\x02\xad\x03\xfd\x77\xdc\x97\x44\xb7\xf1\x39\x83\xd0\xe3\x4c\xf4\x35\x68\x7e\x74\xdb\x71\x5b\x5e\x7f\x24\x74\x5c\xcd\xef\x89\x64\x66\x95\xf0\x93\xdb\x4a\x69\xb3\x8a\xe5\xe1\xcf\x1c\x71\x3c\xed\x8d\x04\x5f\x21\xb8\x0c\x5e\x2e\x79\x62\x04\x5c\xdd\x5d\x47\x1f\xa3\xef\x08\x6a\x38\x9e\xe6\x67\xcc\xf7\x37\x62\x7c\x0b\x9b\xda\xe7\x38\xee\xa6\xd4\xdd\x33\x4f\x1c\x18\x39\x63\xf6\x15\xef\x45\xdf\x31\x7b\x19\xf9\x95\xd9\x25\xe4\x71\xf0\x44\xe7\x26\xf0\x19\x4f\xb7\xd4\xfc\xf8\x74\x94\x13\xf4\x42\x6f\xfc\x31\x25\xe8\xb9\xc1\xfe\xe9\x87\x70\x36\x41\xc1\x83\x31\xdf\xb4\x1f\xa5\x6d\x57\x93\x1b\x96\xad\x17\x98\x12\xaf\x68\x48\xd7\x1a\x16\x62\x1d\xd2\xc2\xd8\x74\x3c\x63\xc4\x01\xed\x94\x3e\xdb\xec\x12\x05\x3e\x23\x43\xa9\xcd\xf1\x8a\x0a\x04\x6d\xc4\xf4\x04\x14\x89\xfe\x9c\x50\x1d\xfa\x6f\x80\xf7\x74\xc9\xcf\xba\xd7\xa7\x2f\xa3\x1f\x26\x52\xc1\x29\x62\xcf\xae\x27\x7c\x4b\x3d\x35\x84\x3f\xc9\xfd\xbb\xde\xfb\xf1\x2f\x7e\x6e\xe4\x87\x07\x67\x66\x0e\x1c\x20\xcf\x75\x7f\x4a\xfe\x92\xe4\x67\x66\xc2\x4f\x6e\x9d\x7e\xf8\xbc\xbf\xec\xbd\xee\x9b\x1f\x9f\x21\x9e\x78\x82\x26\xdc\xc7\xc1\xef\xd0\xe9\xe0\x77\xb3\xcf\x81\x86\xa7\xb0\xa3\x58\x0d\x83\xcf\x8b\x9f\x82\xd7\xfa\x93\x02\xff\xc2\xf3\xa9\x0b\x34\x24\x16\x26\x30\xe5\x69\xe1\xa8\xb4\xcb\xb2\xec\xbc\x5c\xfa\x54\x90\x1e\x5f\x0c\x30\xb6\xc0\x64\x6e\x6c\x3c\x37\x96\x4b\x8d\xe5\x26\xbd\x25\x9b\xe4\x20\x2f\x8c\xd4\x33\x56\xc9\xa9\xb3\x2d\x28\xb3\x62\x66\x56\x95\x38\x5d\xd6\x01\x47\xd5\x3b\xa6\x4d\x19\xa8\xe1\x84\x48\x70\x00\x87\x1a\x34\xe4\x55\x79\x36\x83\x0c\x1e\xf2\x16\xd0\x29\x45\xe1\x55\xc1\xa8\xa3\x66\x47\xaf\x8e\x28\xc8\x6a\x36\x9b\x4d\xd8\x6a\xe1\x64\x84\x34\x61\xf8\xe7\x92\x62\xb2\x7c\x7e\x58\xc9\x1d\x6f\xd0\x25\x8a\xb1\x01\xbf\xc8\x59\x64\xaa\x79\xea\x0c\x14\x48\xc3\x21\xe1\x8c\x1c\xd6\x5a\x6b\xcf\xda\xe1\xa7\x19\x21\x9d\x99\x65\x84\x11\x93\x2f\xd5\x8a\x55\xae\xe1\x18\x1a\x3b\xab\xe8\x08\xd2\x19\x5d\x77\x25\x50\x34\x0c\x03\x19\xde\x1f\x1b\xda\x48\x6b\x78\xab\x73\x0d\xf0\xa1\xbe\xc2\xf7\xe2\x0e\xe3\x7d\xd8\xc3\x95\x58\xac\xc6\xa6\x0b\x11\x0f\x7b\x23\x5e\xe4\x47\x4c\x53\x3e\x27\x87\xf4\xf5\xdf\xa3\xed\xab\xd1\x9c\x91\x66\xdb\x4d\x60\x53\x8d\x0e\x07\xb1\x7d\x53\x04\x19\x57\x0e\x3f\x01\xa1\x58\x9c\x69\x14\x8b\x29\x8e\x2e\xc0\x52\x87\x23\x05\x0f\x99\x80\x73\x0b\x3e\x6e\x41\x7d\xa6\x6c\x9a\x29\x79\xb6\x8a\x69\xee\xe7\x84\x8f\x68\x7e\x38\xdc\x27\x86\xf8\x7e\x91\x99\xcd\x1f\xc2\x39\xaa\x0f\x85\x67\xa6\x6b\x5d\x91\x6e\xe1\x9c\x24\xbf\xc4\xf0\x07\x22\x3f\x3d\xb8\xcf\x77\x18\xef\x25\xc5\x72\xc5\x0b\xfe\x5e\xcf\x76\x7f\x5f\xf9\xcb\x01\x4f\xf9\xf0\x37\xc5\x66\x7f\xd1\xdf\xa3\xd7\xd2\xc9\x89\xf9\xa1\xc3\xd0\xab\x8e\x01\x4e\x22\x0f\x6f\x26\x0f\xcd\x9c\xb4\x85\x9c\xef\xbe\x46\x1e\x22\xe7\xcf\xae\x08\x3f\xcd\x90\x24\x9b\x71\x32\xa0\x11\xc8\x22\x23\x20\x41\x04\x7a\xc1\x6d\xa7\x7e\xf8\xc0\x03\xee\x2a\xb0\xe5\xf1\xc7\x1f\x47\x1f\x79\xfc\xf1\xc7\xdd\x63\x8a\xaa\x2a\x95\x0a\xf4\xb4\x0e\xe2\x45\x28\x02\x31\x5a\x3b\xfc\x7d\xad\xbf\xe0\xfd\xf8\xd0\xf6\x7d\xb8\x7b\x75\x5a\xc5\xfb\x48\xb7\x52\xb3\x2b\x6e\x14\x2f\x64\x56\x1d\xfd\xcc\xdb\x89\xe5\x67\x89\x21\x8e\xa4\x34\x43\x6b\xd9\xfc\x16\x7c\x9e\x6f\xaa\x18\x8b\x65\xe0\xbb\xc1\x0e\xde\x4b\x77\xde\xdd\x1f\x7f\x3f\xf4\x30\xc6\xe9\x43\xb1\xb5\xcb\xc0\xfe\x2f\x3e\xe1\xb2\xf9\xaf\x11\x6d\xe4\xe0\x6c\x2b\xa6\xcd\xc1\x9d\x11\x3c\x3c\xab\x8a\xfd\xe8\x43\x7f\x8d\xc1\xfd\x79\xf8\xb4\xfc\x9f\xa8\xfd\x30\x77\xb3\x7f\x6e\xed\x2f\x01\x6f\xfa\x7e\xba\x10\xd3\xeb\xe3\xbe\x34\x8d\xe2\x3d\x6c\x80\xb1\xbf\x6c\x2e\x95\x26\x18\x32\x3d\xbe\x02\x2c\xf1\xb4\xb1\x90\xb2\x50\xa3\x09\x18\x15\x55\x50\x15\xe9\x0d\x64\x19\x80\xab\xa3\x86\x03\x6a\xa8\x40\x1a\xa0\x36\x5b\x0e\x3f\x75\x14\xa7\xdc\xd0\xeb\x36\x69\x39\x0e\x2d\x74\x8a\x50\x73\x6c\xc0\xa0\xb6\x03\xd5\x12\x68\x57\xab\x55\x6c\xae\xb8\x15\x54\x43\x35\xc5\x96\x1b\x6d\x57\xe9\xf1\x68\xa9\x37\xaf\xbd\x5a\x22\xd6\x67\x64\xf3\xd3\x78\x5e\x7e\x3e\x5c\x82\xc6\x31\xe7\x12\x2d\xc7\x64\xee\x82\xa8\xe2\xef\x1c\xfd\x10\x16\x02\xc2\x13\x1e\xc5\xdb\x15\xa3\x39\xa0\xa5\xa4\x99\xb2\x03\x4a\x48\x26\x65\x50\x9e\x6d\x87\x9f\x66\xf4\x34\xd1\xa9\x28\xd0\xd6\x8a\x86\x5d\x05\x9c\xe2\x4a\xa8\x8d\xea\xa0\xc6\xa3\x2a\x6a\x2a\xa8\x42\xcb\x9d\x06\xa8\x97\x4a\x25\xc4\x14\x8b\x45\x24\x43\xc7\xd0\x0c\xc5\x56\x75\xa9\x54\x25\x39\xb7\x6c\x58\x8a\x20\x93\x10\x9f\x41\xa8\xe0\xbb\xb7\xcb\xf0\x38\x4f\x8b\x45\x73\xf1\x58\x71\xe1\xfc\x68\x15\x88\xc6\x1d\x18\x63\x63\x39\x00\x47\xca\xb3\x92\x43\x19\x1d\x6b\xa4\x3c\xd4\x68\xe9\xe8\xb4\x79\xc2\x4c\x5d\x81\x18\x58\x41\x93\x1d\x5d\xd7\x29\x1b\x95\xf1\xf0\x4a\xa5\x52\x6a\x19\x0c\xe3\x2f\x22\xe6\x8f\x9f\x61\xfe\xf8\xa7\x98\xad\xe5\xdf\xfd\x78\xc4\x93\x8b\xc3\x8f\x46\xf1\xc6\x20\xee\xbd\x15\xe7\xcc\xdd\xf2\xab\x98\x2e\xf1\xf7\xf7\x70\xfe\xff\xb0\xfe\x0a\x38\xab\x7b\x03\xfd\x07\xfa\x64\x66\x4d\xe9\x94\x95\xec\x15\xeb\x96\x3f\xc4\xac\xda\x7c\xe0\xa7\xcc\x35\x27\x89\x3f\x0c\x62\xad\xa3\xe9\x22\x7d\xbd\xf7\xbb\xf2\x37\xb2\xf4\xb1\x2f\xb7\x7e\x84\xf1\xa3\x77\x6f\x48\xdb\xb4\xd9\x87\x9f\x73\xff\x77\xfc\x50\x51\xcc\x05\x1c\x1d\xd9\x3d\x7b\xeb\x33\xd4\x1d\x9d\x6d\x23\x07\x9e\x99\xbd\xd6\x71\xc8\xac\xfb\x27\x72\x3f\x39\x3a\x7b\x6d\xf8\xc9\xfd\xf3\x52\x91\xa3\xd8\x76\x83\x12\x59\x7e\xe4\x53\x48\xb3\x2c\xf4\xf1\xce\xcf\xde\xfe\x76\x6a\x1c\xfd\xca\xb2\x2c\xa4\xda\xb6\x9d\x3a\xae\xea\x10\x2a\xb8\xd6\x44\x39\xbc\xff\x30\x7d\x3f\xbe\xa7\x21\x36\xfd\xf9\x37\x71\x9d\x1b\x23\x9b\xdf\x82\xcf\xd3\x4f\xed\x8d\xe2\x5b\xc1\xde\xda\x41\x7c\x02\x66\x6a\x4f\x7f\xac\xda\xe7\xdf\xbd\xef\x8a\x62\xc6\xc1\x7d\x03\x88\x63\xc6\x9b\x0f\x24\xf6\xdf\x03\x7a\x30\xf4\x21\x9f\xdf\x33\xc4\xfa\xee\x4d\xe9\xed\xf4\x9a\x3e\x3c\x2d\xf3\x57\x19\x6f\x45\xa1\x42\x3c\x4d\x8c\x2e\xc2\xf6\x4d\x70\x33\x29\x85\x2b\x7e\x2e\x22\x83\x33\x2c\xb9\xb1\xf9\x64\x3a\xbb\x30\x9d\x5f\x4f\x37\x4e\x70\xd4\xc5\x5f\xf8\xc2\x5b\x3f\x87\x6e\x7a\xf2\xc9\x27\x9f\x04\xf3\xa1\xf7\x01\xcc\x87\x90\x3a\x08\xd1\x4b\x12\xf8\xc1\xc3\x7f\xd3\xef\xd2\xbf\xab\x4c\x71\x1c\xb8\xff\x9d\x05\xf5\x95\x8f\xbd\x90\xfa\xb6\x05\xce\x6d\xff\x29\x75\xcb\x2c\x63\x9a\x23\x2d\xc4\x00\x05\x15\x81\xd2\xa9\xf8\xef\xdf\x45\xbf\x68\x7c\x0c\xdc\x4d\x3e\x8d\x90\xfe\x8e\xdf\x81\xbd\x67\x3c\xf4\x01\x7d\x3e\xfa\xe6\xc7\xd0\x23\x2f\x7c\xec\x3b\xd1\xbc\xf1\x79\x07\x88\x63\xe8\x53\xc1\xbe\x0c\xc8\x60\xdf\xd0\xc3\x47\x09\xf3\x5b\x23\xb6\x3f\xe2\xe7\xb0\xb9\xbf\x5c\xc9\xd2\xc7\x66\x99\x70\xcd\xf5\xf4\xb9\x1c\xf8\xc1\x61\x06\xf8\x60\x7f\x24\x88\x41\x04\x91\x08\xdf\x31\x8b\xfe\x9b\xf0\xb8\x66\xae\x96\x08\xde\xd9\x54\xc3\x55\x81\x64\x03\x03\x59\x2d\x57\xa0\x0a\x9d\x9a\xd3\xa9\x50\xa2\xcb\x82\x8c\xe7\x78\x41\x20\xb9\x2a\xc4\xde\x81\x2f\x86\xc1\xa7\x0e\x8b\xdd\xf5\x26\x90\x68\xd9\x55\x2c\x55\xb5\xa1\x6d\xd9\x5d\x02\x10\xb6\x65\x43\x5b\x55\x2d\x60\x7b\x7c\x66\x58\x96\xe5\x0a\x10\xc2\x88\x67\xbc\x39\xe3\x3d\xaa\xd2\x15\xb1\x98\xa8\xbf\x86\xe0\xb5\x62\xff\xfd\x09\xdd\x6f\x86\xb2\xb7\xef\x03\xd1\xf3\x46\x70\xd6\x02\x3f\xbf\xef\xcf\xb1\xb8\x7a\x91\x16\xb3\xf9\x7d\x1a\x86\xf7\xe2\xe4\x9e\xbd\xc2\x67\xf3\xcf\x7d\x98\x80\x59\xfa\xe0\x79\x6c\x26\x6a\xbf\xdc\x93\xed\xe2\xdb\x62\x71\x72\x1c\xcf\x87\xf8\x04\xfc\x41\x7c\x56\x8b\x38\x89\xb0\xba\x26\xae\xc9\xba\xa8\x8f\x0a\xd7\x84\xab\x3f\x3e\x85\x3c\x27\x28\x18\xfc\x87\xf1\x9d\xc2\xb8\x1f\xac\xb5\x81\x40\x1a\x90\x34\x4b\x25\xd7\x24\x8b\xae\x42\xb1\x27\x04\x8a\x75\x15\xb2\xe8\x5a\xa4\xd1\xa9\x53\xbc\x6b\x51\x8c\x6f\xf2\xce\x72\x29\x63\xc6\x82\xd8\xc6\xd3\x41\x7d\xb6\x1c\x7e\x9a\x51\xe9\xd6\x09\x86\x16\x24\xa9\x62\x56\x64\x53\x32\x4d\xc9\x94\x0d\xc9\x94\x24\xa9\x2a\x49\xae\xea\xb6\x80\x28\xcb\x32\x6a\x79\x7f\x9a\x26\x91\x3c\x1f\xe2\x51\x84\xa1\xa7\x76\xc7\xd6\xf0\x62\x0f\xcf\x47\x1f\x8a\xe8\x72\x43\x7a\x13\xfd\x48\x80\xb7\x55\x7b\x3f\x7d\x46\x6a\xc5\x33\x2b\x5f\x8a\xf6\x7a\xfc\xfb\x46\x58\xfe\xfd\xdc\xb9\xc4\x49\x81\x1c\x14\x62\x2b\xc2\x38\x8e\xf5\x63\x89\xc6\x95\xc2\x12\x78\x9b\xc3\xa7\x1e\x5f\x4f\xe6\xc6\xce\xf1\x0b\x46\xe2\xa2\x7e\x55\xe0\xa0\x6a\xaa\x8c\x2a\xa0\x88\x14\xd0\x68\xb7\x40\x0b\xa9\x20\x83\xe3\xc3\x16\x68\xcd\x5a\xe1\x27\x54\xf1\x7c\x5b\xb7\xcd\x28\xa8\x86\x6c\x19\x48\x54\x01\x40\xc0\xaa\xa8\x85\x0c\xb2\x5a\x26\x4b\xae\x5c\xb6\xab\xb6\x5d\x25\xeb\x10\x42\xac\x1a\x51\xb3\x8c\x8a\xd5\x6a\xd5\xb0\x55\x28\x59\xaa\x61\x9b\x38\x50\xff\x3a\xcc\xab\x26\x7d\x49\xc2\xf6\x3d\x33\xc6\x11\x58\x3f\x2d\x0c\x74\xf9\x92\x50\xa7\x07\xba\x69\xc9\x10\xdd\xee\x78\xba\xe9\x1d\xa4\xe3\xaa\x10\xe8\xc8\x26\x5f\x8a\x3e\x62\xef\xf6\x96\xf5\xeb\xc9\xf5\x43\x97\x43\xfa\x12\xeb\x21\xa4\x9b\xf6\x03\xde\x1f\x30\xd1\xf9\x13\x35\xaf\xd3\x1c\xeb\x5f\x16\x13\xe7\x21\x7c\x3a\x97\x2e\x8f\xe8\xa9\xa5\x75\x2c\x37\x78\x9f\x6a\x6a\x57\x4c\x97\xfb\x35\xb0\x70\x5d\x8b\xe9\x8f\x47\xb4\xd4\xd2\xd6\x00\x39\x58\xfd\xff\x4d\x0e\xe6\x8d\xe6\x46\x53\xb9\xb1\xdc\x44\x6e\x12\x9f\xe1\xf7\xde\x97\x04\x3b\x4f\x80\x25\xa1\x43\x6a\xb5\x9a\x0b\x49\xe8\x6a\x14\x77\x82\xa5\x78\x57\x20\xab\xae\x46\xc2\x4e\x95\x12\x5c\x8d\x12\x3c\x23\x0c\xd4\x58\x1c\xff\x72\x80\x6a\x07\xb1\xe3\xe0\x53\x47\x87\x29\xd9\x39\x61\xd0\x9c\xaa\xd6\xcc\xaa\xe4\x0b\x83\xf7\x9f\x2c\xcb\x35\x49\x72\x35\x94\x01\x6d\x43\x96\xcb\xb2\x5c\x45\x3c\xa8\xbb\x90\x38\x19\xef\x67\x2b\x38\x16\x76\x4a\xcc\x7e\xf4\xe7\x18\xf8\xb1\x41\xfd\xe1\x89\xa8\x82\x60\xee\x7f\x5b\xbb\x69\xd6\x32\x4c\xdd\xee\x64\x4c\x4d\xd5\x4d\x52\x74\x28\xa6\x38\x03\x1d\x8a\x40\xd2\x08\x33\xdb\xb2\xc9\x86\xcb\x8d\x48\x70\xd6\x81\xd0\xdf\xdd\x00\x8d\x59\x27\xfc\x84\x38\xda\x96\x0d\x51\x95\x15\x51\xd1\x15\x49\x41\x4d\x24\xe1\xb0\x42\xb9\x4b\x78\x24\x47\x66\xa7\x21\x49\x14\x87\x6a\x9e\x71\x26\x38\x8e\xd3\x5b\x87\x85\x6c\xfe\xf8\x97\x7b\xb4\x0b\x74\x1e\xde\xfb\xd9\x8e\xeb\x45\x4c\xdf\x9f\xb0\xbf\x23\x5d\xbb\x0b\xe7\xd9\x21\xfe\x81\x30\x71\x1e\x2d\xa5\x8f\xdf\xcf\x19\xc4\xf1\x83\x74\xda\x30\xb8\x43\x57\x4f\x08\x56\xaa\x38\xa3\x84\x33\x6e\x07\xf2\x6a\x82\xf6\x8c\x94\x26\x4e\x10\xc5\x61\xdf\x2a\x58\xc5\x29\xb6\xe4\x29\x33\x45\x51\x50\xc3\xfb\xd3\xb4\x45\xb7\x09\x24\xac\xd7\x30\xd0\xc6\xf3\x7a\xa8\x7b\x47\x7a\x17\xfd\x7e\x6f\x5e\xaf\xa4\x98\x55\x5f\xfc\xed\xe4\x6b\x2b\x58\xf1\xa2\x60\xce\xc1\xbd\x2d\x6f\xce\xd9\xde\xbd\x2d\x88\xef\x1c\x46\xeb\xc2\x2e\xbc\xf7\x4c\x9c\x86\x65\x5f\xa5\xc5\x18\x2e\x7a\x98\x48\xac\x05\x03\xe6\x1c\x59\x2b\xbd\xb3\x0b\xa9\x89\xc9\x45\x43\xe1\x72\x4a\x99\x29\x3a\xa0\x82\x44\x52\xf1\xb7\x51\xfd\x4f\x40\x81\x88\xb5\xed\x62\x11\x88\x45\xc4\xe2\xb7\xa2\x6b\xcf\x85\xd1\xa2\x2b\x01\xc7\xd3\x64\x8a\xf7\xc7\xec\xf0\x9a\x46\xd5\x71\xe4\xc1\x2d\x36\x9b\x4d\x92\xe8\x87\xf8\x76\x97\xef\x3f\x99\xc4\xb9\xc4\x2a\xe2\x0e\x5c\x5b\xe6\xa3\xc4\x7d\xc4\xc7\x3d\x2a\x93\xa3\x13\x4c\x2f\xff\x1b\xf6\x31\xc8\xf4\x82\x89\x4b\xe6\xf9\x29\x4e\x83\xac\xa8\x61\x52\x0c\xbc\x1b\x88\x37\x4f\xe8\xf4\xd2\x65\xf8\xd9\xa0\x70\xe9\xf0\x2f\xfd\xf8\x4b\xff\xf9\x0e\x95\x82\x8a\xa3\x00\x89\x61\x2c\x8e\x05\x8c\x5b\x50\x35\x43\xb1\x74\x4b\x97\x25\xce\xe2\x35\x55\xa9\xb2\x06\x14\x6d\xcd\x34\x3a\x22\x59\x52\x04\x93\x65\xda\xa8\xce\x59\x66\x8b\x2d\x1b\xa6\x62\x6b\xb2\x24\x99\xd5\x06\xb4\x18\x76\x44\x53\x04\x93\x61\xfb\xbe\x96\x45\xb3\xd6\x70\x2c\x86\x75\x0d\x57\x85\xb0\x52\x01\x52\xc5\x6d\xe3\x37\x8a\x07\x3a\x68\xa2\x0c\x72\x78\x8e\x2f\x88\x76\xab\x04\x6b\x22\x6a\x3b\x36\xc8\x14\x9a\xb6\x25\x68\x92\x29\xa9\x55\x20\x93\xb2\xed\x08\x82\x20\x70\xba\xa2\x73\x86\x59\xe7\x8b\x66\x86\x91\xd5\x02\x6a\x43\x96\xe3\x79\xc1\x2a\x26\xbe\x2d\x19\xf1\x6f\x5d\xc7\x35\x35\xb2\x89\xda\xa6\x69\x22\x5b\xd7\x75\xe2\x14\xbc\x5e\x42\xda\x08\xf8\xea\x3a\xe2\x46\xe2\xe6\xa8\xda\xcf\x47\x3d\x4d\x94\x5e\xb0\x70\xb4\x5f\xb5\x86\x06\xe0\xc4\xd8\xa2\x60\x39\x5d\x70\x05\x48\x2f\x7a\xc3\x62\x8f\x36\x59\x30\x36\x31\x49\x05\xb5\x7b\x30\x15\x7a\xa5\x4b\x63\x9f\xe6\x0d\xe1\xc8\x11\x05\x72\xa2\x8c\xb7\x37\x1c\xa0\xe2\x68\x17\x04\x1a\x04\x36\xd2\x81\x27\x74\x78\xe7\x5f\x87\xb0\xa0\xb5\x51\x5b\x29\x88\x86\x05\x4a\x95\x4a\x65\x46\x37\x45\x45\x15\x4d\x49\xd7\x80\x6c\x4a\xb2\x22\x99\x92\xa1\x01\xc9\x14\x25\xfc\x51\xad\xd9\x1e\xef\x96\xcb\x40\x28\x21\x16\xbf\x95\x40\x8d\xab\x68\x22\xa8\x59\xd0\xb2\x2d\xcf\x8a\xb4\x6c\xd4\xb4\x50\xa3\x68\x35\x58\x5b\x37\x6c\x43\x07\x04\xe5\x78\x8b\x34\x84\x94\x50\xa8\x42\xa7\x24\xd5\xcb\x95\x7a\xa1\x0a\x61\x51\xaa\x15\x2b\xd5\x42\xd9\x82\x8e\x54\x2d\x96\xdc\x62\x47\xd2\x34\xaa\x8c\x9c\x7a\xbd\xee\x56\x9a\xcd\x66\xa0\x1b\xf1\x59\x42\x4f\x2b\x66\xe9\x69\x7c\xaf\x8f\x38\x95\xb0\xbb\x72\x5a\xa7\xd5\x98\x7c\x9f\x4e\x9c\x83\x77\x6e\x26\x02\xd9\x5e\x3d\x58\xba\x53\x9e\x3d\x72\x21\xae\x00\xbe\x38\xb5\xb0\x67\xa1\x84\x11\xcf\x54\xb0\xf3\x1a\x6e\x00\x7a\xff\x07\x28\x3d\x09\x57\x41\x65\xb6\x11\x7e\x9a\x69\x03\x1b\x30\x9e\x0b\x6e\xd2\x9c\x84\xaa\xc8\x16\x80\xe4\x56\x64\xd4\x44\xb2\x08\x4a\x24\x0f\xca\x80\x97\x50\x03\x29\x14\x03\x67\x64\x98\xaa\x00\xe6\x84\x04\x08\x87\xd2\x3a\x30\x7c\xd1\xaa\xdb\xf6\x2d\xbd\xa6\x2c\xcb\x75\x8e\xd7\x78\x4e\x53\x0b\x9c\xc6\x3a\x0a\xcf\xe9\x2c\xcb\x72\x1a\xcf\xca\xa8\x52\xa9\x00\xb1\xe2\xd6\x6d\x9b\xe4\xab\x72\x97\x10\x5b\x62\xcf\x26\xf0\xfd\xde\xab\xe6\xac\x13\x38\xaf\x85\xaf\x1b\xa3\x5c\xaf\x10\x9f\x99\x17\x43\x5d\xba\xe7\xa1\xc4\xd9\x37\x31\x9b\xf7\x20\x0c\x3d\xb5\x33\xb1\x0e\x45\x3a\x76\x3d\xce\x63\x4b\x64\xf1\x3d\xd0\x1d\xb4\x19\x65\xa1\x38\x3d\x8a\xda\xfa\xa7\xe4\x97\x13\xd7\xe1\xca\xf7\x6f\x25\xde\x8e\x63\xe7\x0c\x35\x9e\x1d\xa5\x70\x0e\x44\x10\xb3\xbc\x86\xea\xd5\xff\x3f\x9e\x19\xb9\x10\x36\xcc\xea\x21\x9b\x95\x2c\xd1\x3d\x99\xfc\xa1\x7b\xf1\xc5\xe4\x3d\xee\x17\x1e\x03\x6b\xd1\x26\xf2\x9c\xc7\xd0\xd2\xc7\x1e\xdb\xb9\x13\xf0\x3b\xd1\x52\xfc\xb6\x93\x3c\x46\x7e\xcb\xbd\xf2\x62\xf2\x03\xee\x86\x47\xc1\x7b\xd1\x76\x72\xc1\xa3\x68\xf9\xa3\x8f\x3a\x0e\x58\xbc\x03\x2d\xc7\x6f\x3b\x68\x73\xb6\x81\x18\x54\xd3\x00\x0b\x1c\xd2\x62\x11\x44\x75\x01\xb0\x64\xd1\xb6\x91\x60\x95\x51\xa1\x63\x69\x1a\x65\xa0\x72\xb9\x5c\x46\x99\x72\xb9\x9c\x92\x86\x7d\x13\xfa\xd3\xba\x7f\x7e\xbc\x94\xc1\xe7\x97\xd2\xd8\xa2\xa3\x09\x82\x98\x4f\x58\x5d\x25\xad\xd3\xda\xdf\x59\xb3\x3d\x9d\x72\x0d\xf1\x8f\x41\xf5\xfa\x04\x4f\xa7\xa2\xf7\xd1\xe8\xa4\x5d\x2a\x78\x5f\x36\x00\xb6\x30\xc1\xe3\x13\x98\xc7\xc7\x42\x1e\xd7\x52\xdc\x4c\xc3\xc6\x9c\x2d\x81\xca\x6c\x3b\xfc\x34\x53\xa6\x32\x9d\xb6\x59\xad\x02\xb1\xea\xb6\xf1\x5b\x73\x0e\xa4\x62\xcf\x08\x76\xaa\x0c\xb8\x13\x52\xdb\xa6\xcc\x8e\x19\xbe\x68\x0d\x29\x80\x10\x45\xb1\x2e\x8a\xa2\x67\xf3\x7b\x9f\x1b\x92\x24\xb5\x63\x9f\x5b\xa8\x59\x2a\x01\xb6\xec\xb6\x0d\x83\xcc\x94\xe5\xb6\xdc\x96\x08\x10\xd4\xb2\x20\x82\x78\xf5\x7c\xff\x5c\x03\x3e\x1c\xb1\x60\x22\x97\xce\x71\x8b\xa9\x34\x9d\x1e\x27\xe6\x2d\xa4\xd3\xd9\x85\xa3\xb9\x0a\x0d\x95\x42\x49\x12\xdc\x8a\xe7\x92\x39\x35\x50\x13\x91\x8e\x78\x64\xd9\x8a\xa4\x58\x80\x17\x8a\xac\x50\xa9\xbb\x04\x4d\xd8\x4c\x4b\x2b\xd8\x8e\xdb\x80\x6e\x91\x2d\xd7\x00\xdb\x2a\xda\x26\x68\x92\x26\xdf\xae\x23\x53\x18\x69\x12\x41\xce\x71\xec\x53\x05\xbc\x1c\xbb\xd7\x1a\x57\xda\xe7\x82\xf4\x22\x6e\xf1\xf8\x18\x9d\xf6\x33\x19\xf5\xab\x7a\xac\x7b\xc6\x72\x93\x06\x55\x70\x28\xb1\x53\x21\xed\x52\xc9\xd5\xbd\x11\x36\x80\x06\xd8\x42\xd3\x6d\xba\x4d\x5b\x2d\xab\x80\x2d\x38\x0c\x5b\x6c\xe2\x1c\xa3\x05\xb2\xe6\x56\x48\xb1\x53\xa3\x6a\xa0\x85\x18\xd0\x4a\xb5\x2c\x0b\x9a\xa8\x01\x51\xdd\x81\x65\x0e\x42\x33\xe3\xe8\x56\x09\x14\x58\x45\x86\x02\xa8\x41\x1b\x7a\xdf\x37\x2d\x0b\x35\x6c\x3b\x8c\x03\x5b\x7e\xce\x02\x78\x2e\xbe\x1f\x39\x2f\x11\x57\x33\xb2\xf9\x23\x38\x7e\xb6\xf7\xbb\xfd\xf1\x36\x0f\xc2\xd0\x7b\x7f\x11\xc4\x69\x1d\xff\x3c\x58\x82\x37\xaf\x4f\xe0\x23\xd8\x68\x9c\xc4\x3b\x63\x03\x6c\x48\x9f\x74\x11\xc2\x72\xdc\x78\x9a\x0e\x4c\x8a\x05\xa9\xd1\x5c\x8b\xac\x38\x64\xd5\x15\xa8\x8c\x33\x63\x43\x8a\x70\x45\x67\xa4\x39\xcb\x3a\xc0\x42\x06\xc9\x01\xbb\x23\x87\x9f\x66\x1a\xb4\x5e\x50\x4c\x81\x73\x6b\xa0\x84\xe4\x32\x60\x80\x51\x40\xe5\x8e\x52\x2c\xf0\x8a\x51\xe3\xed\x0c\xa3\x02\xd1\x65\x68\x4e\x51\x2c\x05\xd5\x1d\x07\xf0\x0a\xaa\xb9\x35\xa0\x78\x86\x66\x4d\x55\x55\x54\x37\x0d\x5d\x92\x64\xcd\xd4\x33\xa5\xb2\x2c\xc8\x46\xa9\xc1\x89\xa2\xc6\x01\x39\x1e\x23\x2f\xd9\x78\x1f\xc1\xaf\x01\x4f\xe2\x98\x23\xa4\x6d\x62\x3e\xae\xde\x8b\xad\x2a\xac\xcf\xe6\xe1\x79\x8c\xe6\x70\x49\xf7\x74\x7e\x7c\xc4\x2e\xb0\x64\x65\xc6\x68\xda\x55\x46\x37\xc5\x92\x45\x56\x58\xae\xd3\x94\x39\x9b\x93\x69\x5b\x56\xa0\x6b\xb9\x6d\xa4\x2b\x40\x07\x82\x2a\x97\x14\x83\xac\x8b\x05\x54\x2b\x95\xf9\x6a\xd1\xa3\xc1\xbf\x74\x73\x99\x33\xe8\x77\x33\x6b\x2f\xba\x8a\xf8\x7c\xf7\x57\x2b\x9f\x5d\xf9\x26\x66\xd5\x91\x0b\xf7\x7e\x75\xd5\xf1\x4b\xee\x0f\xe2\x32\xf8\x2e\xec\x34\xae\x6f\x79\xf8\xf9\x58\x8c\x2f\x0e\xcf\x0c\x81\x93\x43\xe0\x5b\x86\xc0\x41\x2c\xe6\x0a\x69\x3b\x9b\x3f\x4c\x78\xf0\x8b\xae\x8a\x3d\x5f\xec\x3d\x3f\xf5\x4c\xdf\xf3\x6b\x3f\xfb\x67\x82\x40\x1d\x91\x58\xfe\xe1\x2c\xfe\x15\xfe\x6e\x91\xf7\x1d\xb3\xf6\xe0\x7c\xf0\xd3\xee\x6f\x0a\xfc\xd5\x8f\x46\xdf\xf5\xf5\x3f\xe5\x44\xe7\xda\x30\x9c\xa0\x88\x85\xf8\xa6\x1c\x01\x82\xdb\xe4\xe9\x1c\xd3\x3b\x0a\x95\x9b\x97\x1b\x1f\x8d\xcc\xde\x51\x06\x04\x04\xf2\xcf\xce\x53\x0b\xa8\x9f\x74\x2e\xd8\x36\xf2\x27\x97\x58\x49\x7e\xe3\xa1\xef\xbf\xef\x23\x17\x7d\x61\xcd\x7d\xab\x5d\xe2\xc3\xe8\x85\x17\xc9\x12\x57\x80\x22\x4f\x6a\x33\x75\xd4\xb6\x1b\x0c\x34\xe5\x06\x2f\xf1\x0e\x2f\x8e\x4c\xed\x7e\x78\xf7\x41\x74\xd1\xbf\x2f\x3e\xf4\xc6\x8f\xbd\x06\xde\x26\x92\x15\x59\x2c\x28\x9a\xed\x42\x94\x41\x9a\x02\x34\xa0\x9a\x52\x51\x25\x4d\xa7\x2a\xd4\x9c\x1e\x5e\xac\xd8\x3c\x76\x0c\xc6\xef\xd4\xf6\x21\xf0\x6d\x31\x38\x3e\x2b\xbb\xe3\x59\xbc\xb6\xdf\x33\xf8\xf9\x43\x63\x31\xb8\x13\x6b\x67\x6b\x0c\x8e\xef\x69\xee\x5d\x9b\x68\x27\xa0\x13\xb3\x66\xfb\x97\x96\xbc\xba\xdc\x98\xd0\xb2\x49\xda\xc6\xdb\xda\xd2\xff\x9b\xc3\x7f\x7c\xd7\xef\xaf\xd4\x97\x5f\x17\xfb\x4d\xc4\x27\x1e\x84\x59\xbd\xe1\x74\xb4\xa0\xfb\xeb\x7f\x3c\x38\x79\xe9\x9c\xef\xe8\x03\xef\x19\xd2\xcf\x66\xa2\x77\xf7\x23\x8e\x93\x4d\x31\x5e\xf8\x32\x6d\x11\xff\x40\xbc\xde\x8f\x4a\x81\x89\xd1\xb1\x6c\x2a\x9d\xa7\xc8\xd4\x38\x31\x0a\x26\x46\xe7\xfb\x06\x32\x99\x1e\x27\xbc\xc5\x6e\x18\x43\xa4\x76\x7f\xea\x2e\x90\xbb\xe3\xc4\x7b\x75\xf4\x82\x04\x76\xbb\x4f\x7e\x6a\x7e\xf9\x53\xb7\xbe\xdf\x7e\x6f\xfd\x7e\x70\x0b\xfa\xd4\xdf\x61\x89\x3f\xa0\xf4\xd9\x6e\xfb\xdf\x8a\xff\x03\x3e\x82\x9e\xfa\xe3\x26\x70\x19\xf8\x1e\xf8\x3d\xaa\x7c\xee\x93\x9f\x2c\x6e\xda\xb4\x0e\x7d\xf0\xaf\x1f\x04\x5f\x20\x6f\x78\xea\x7f\xe1\x94\x01\x7c\x02\x87\xc8\xd5\xc6\x18\x1c\xc6\xe0\x1b\xfa\xf9\x24\x80\xaf\x1f\x48\x0f\x7a\xea\x69\x62\x30\x7f\x7e\xb1\x9f\xaf\x4a\xf7\x24\xf8\x44\xc0\x71\x59\x3b\x9b\x9f\xc6\xb9\x3d\xa6\x9e\x1a\xd2\xce\x93\x83\xfa\xcd\xd2\xa5\x4f\xc7\xe0\x4e\x6f\x3c\xfb\x6b\x43\xe6\x65\x0f\x81\x4f\x0d\x9e\xd7\xf6\xbf\x44\xf0\x82\x9f\x6f\xde\x87\x4f\x7f\x6c\x08\x1e\x9e\x18\xc2\x7b\x5f\xe8\xe7\xbd\xbd\x5f\xfc\x7b\x72\x37\xf5\xf9\x21\xf0\xc7\x87\xf4\xfb\xb9\x21\xf0\xcf\x0e\x69\xc7\x1a\xfc\xfc\x81\xb3\x06\xe1\x27\xbb\xfa\xb3\xbf\x20\x08\xf4\x8a\x48\x5c\x79\xe1\x00\xda\x7c\x66\x70\x1f\x07\x5e\x3f\x04\xd7\x8f\x0d\xa6\x59\x71\xfb\x90\x31\x9d\x3d\x64\x0e\x43\x68\x5f\x7c\x71\xf0\xf3\xc5\xdb\x87\xb4\xf3\xe8\x90\x7e\x2f\x19\xc2\x8b\x9f\x1a\xfc\xfc\xbe\x4b\x06\xc2\x57\x6d\x59\x7e\xd5\x39\x2b\x0e\x5e\x7f\x74\xe0\x6f\xd0\x90\x39\x1c\x1d\x3c\xd6\x7d\xdd\x21\x7d\xbb\xfd\xb8\xde\x7b\xfa\x1c\xfe\xf2\x6b\x70\xdf\x3d\x48\x4f\x47\xfc\xf2\xc9\x21\x38\x7a\x24\xf6\xfc\x61\x6f\x8d\x7d\xce\x01\x9b\x08\x6a\xa2\x29\x1c\x60\xd6\x4e\xff\x01\xfc\x3b\x71\x52\xe1\xf8\x25\xaf\xc6\xd6\xe2\x64\xbb\xe6\x90\xfe\x1e\x1e\xd2\xdf\x43\x91\x7e\x10\x13\xfa\xe1\x13\x43\xda\x79\x70\x08\xfc\x81\x21\xf0\x75\x43\xe0\x1f\x4f\x8e\x87\x59\xbb\xe7\x69\x62\x7f\xd7\xbc\xf6\xcc\x6b\x3e\x9c\xc5\x58\x1b\xf0\x1b\x23\xb1\x7f\xdc\x83\x0f\xd3\x11\xf7\x0f\xd1\x11\xf7\x0d\xd1\xd1\xf7\x0e\x69\xa7\x47\xc3\xd3\x7d\xbb\x67\xcf\x29\xee\x74\xf7\xd8\x4d\x87\x27\x5f\x18\x6a\xf7\xdc\x1d\xf5\xb1\x34\xbd\x9d\xb6\x98\x35\xd3\xff\xfc\x83\xea\x55\x6f\x2a\xec\xc8\x0e\xd0\x45\xcf\xbe\x30\x58\x47\x3d\x2b\x0d\xe6\xa1\xdd\xcd\x84\x0d\xe7\xd1\xae\x86\x69\x87\x33\x3e\x4c\x0f\x9b\xdf\x47\x87\xf0\x80\x3e\xe4\xf9\xbb\xfa\xe5\xf2\xd9\xc7\xe6\x8c\x33\xbe\x66\x7d\x64\x08\xfe\x3e\xdc\x6f\xc3\x04\xcf\x7f\x68\x08\xfc\x83\x43\xc6\xf9\x81\x7e\xf8\x1e\xe1\xef\xea\xf6\xf7\x0f\x59\xfb\xb4\xc1\xba\x60\x6a\x6d\x0c\x1e\x5b\x83\xa6\xd6\x0c\x9e\xd7\xb3\xa1\xed\xfe\x48\x57\x4c\x7f\xc5\xef\xf7\x32\x82\x59\xbd\x33\xdd\xfd\x68\x17\x5e\xbb\x66\xf2\x2f\x03\xfa\x08\xef\xf0\xde\xd6\xbd\x2e\xfd\x65\x7a\xbd\x07\x3f\x27\xc5\xac\x3e\xfc\x32\xb1\x89\x18\xbd\xfc\xfb\xcb\x4f\x19\xd0\xcf\x7b\xfa\xed\xb6\x67\xd3\x17\xfd\xe1\xca\xb7\x4d\xbc\x63\x80\xdd\x36\xbe\xeb\x95\xae\x8d\xea\x73\xf5\xc3\x33\xf5\x04\xcf\xf4\xf5\xf1\x4c\x73\x88\x6c\xdd\x19\xc3\x61\xad\x87\xc3\x67\x36\x0d\x6c\x27\xbf\x1b\xdf\xc0\xd9\xfd\xf8\xa0\x3e\x76\x5d\x3d\x90\x4e\xab\x77\xe6\x08\xbb\xfb\xed\x2b\x3a\x93\xcb\x07\xcc\xbd\x67\x17\x08\x09\x9e\xba\x63\x08\xaf\xbd\x77\xa0\xfd\xb2\x7a\xf7\x59\x04\xd1\x5d\x28\x12\x57\xbc\x1c\xb4\x15\xa3\xc9\xce\xf2\x90\xb6\x6e\x1f\xdc\xf7\xee\xe9\xfe\xe7\x77\x3d\x35\x07\xb7\x71\x9a\xab\x83\xe1\xcf\x54\x06\xc3\x77\xfe\x72\x08\x2d\x6e\x8b\xc1\x4b\x31\xf8\x7b\x06\xb7\xe3\xcc\x0e\x99\xd7\xbb\x63\x34\x2d\x45\x34\xcd\xef\xc6\xd9\x2c\x77\x6b\xd1\x77\xc5\x1e\xbd\xf7\xbc\x7d\xc8\x98\x6e\x8d\xda\x12\xd2\x36\x0d\xb3\xf9\x03\x17\x60\xf8\x2d\x31\xdd\x04\x63\xb2\xf7\xae\x21\x38\xba\x79\xc8\x58\x95\xc1\x3a\x62\xe7\x3b\x87\xe8\xf6\x77\xc6\xe6\x16\xef\xf7\x1d\x43\xda\x7f\xfb\x60\x99\xdf\x79\xc1\x90\xf9\xde\x34\x64\xfc\xff\x14\x83\xef\xf6\xd6\x08\xd8\x20\x9e\xe9\xb6\x2e\xdf\x30\xf1\x8b\xd0\x3e\x81\xbf\x9a\x78\xe5\xea\xc7\x97\xbe\x7b\xe0\x38\xc2\xf3\x10\xab\xbb\x85\xf4\x26\xbc\x5e\xdc\xd3\xfd\x6f\xf1\xcb\xa2\xc5\xac\xda\x86\x4e\xfd\xd9\xca\x93\x26\x97\x0e\xa4\xfd\x5b\x87\x8c\x53\x1e\x48\x63\x7a\xea\xc6\x21\xcf\xbf\x25\x66\x7f\xc7\xe1\x37\x0c\xb1\x0f\xde\x3c\x04\x0f\xb8\x0e\x25\x91\xc6\xfc\xb0\x99\x86\xc4\x69\xc4\x59\xc4\x95\x84\x48\x5c\x4b\xdc\x4c\xdc\x16\x9c\x06\x1e\x9b\x8f\xc3\x49\x9e\x1f\xb7\x70\xe2\x2c\x90\x5d\xe8\x79\x7e\x69\xec\xf9\x4d\x4e\xe0\xfd\xec\x89\xd1\x45\x63\xd8\xc3\x1b\x5d\x34\x8a\x03\x34\x8b\x46\x27\x26\x17\xcd\x9b\x98\x5c\x34\x31\x36\x31\x39\x6f\x78\xf8\x26\x75\x37\x64\x39\xe0\x28\x76\x81\x43\x15\x59\xd3\x8a\x96\xad\xb7\xa4\xaa\xa9\x54\x55\xc0\x75\x3e\x5d\xb7\xab\xd5\x7a\xdd\xd2\x54\x49\xb2\x55\xdb\xa8\x6b\xe5\x46\xdd\x50\xd5\x96\x72\x7b\x81\x23\x5b\x33\x4a\xd3\xaa\xb0\xaa\x2e\x39\x26\x09\x59\xce\x25\x64\xc1\x2c\x48\xa9\x0c\xa7\xeb\x96\xd8\x2c\x18\x46\xc5\xd2\xda\x66\x55\x42\x76\xd1\xb1\x40\x01\xb5\x4a\x16\x20\x80\x49\x0a\x96\x65\x59\x48\xe0\x75\xcd\x54\x25\xa4\x83\x12\xb4\x74\xa7\x0a\xaa\x16\xe2\xeb\xf5\x3a\xe5\x88\x92\xe5\xea\x6e\x03\xa9\x32\xd0\x81\xa2\x49\x8e\x62\x50\x44\x81\x47\x15\x58\x16\x4b\x4e\x0f\x8f\x9b\x3c\xbe\xf9\xec\x66\xa2\x80\x5e\x5b\xfe\xea\xf2\xc6\x50\x1b\xef\x4d\x11\x8e\xa5\xf4\x46\xda\x26\x16\xe3\x2c\xfa\xab\x89\x1b\x88\xf7\x12\x9a\x8f\xe3\x20\xd7\x40\xce\x3f\x1b\xd0\xcb\x1c\x8d\x2f\x4c\x4d\xa6\xc7\x17\xc7\xb7\xd7\x31\x51\x98\xe8\x46\xda\xb2\xa5\xf8\xf2\xe3\xd2\x79\xfe\xde\x7b\xdc\xfd\x0e\x31\x3e\xea\xc7\x63\xde\x6b\x33\x6c\xd1\x52\x2d\x28\x99\xa0\x59\x03\x2c\x6a\xda\x3a\x8b\xca\xc8\xe0\x4a\x36\x6a\x83\x4c\x51\x95\x01\x03\x54\xb3\x20\xea\x22\xd2\xc4\x82\xc9\x8b\xd4\xed\xf6\xc2\x3c\xf8\x3f\xcb\xdf\xe8\xdc\xf2\x4f\xe7\x7c\xf0\xbd\xd7\x9d\xb6\x10\x6d\x79\xf3\x1d\x77\x1c\x7e\x64\xdd\x9b\xd7\x5d\xbb\xae\x73\x06\x59\x64\x39\x9b\xf7\x88\xa1\xd6\xed\x22\xab\xea\x22\x94\x58\x8b\x13\x47\x1a\x05\x8e\x95\x55\x5d\x93\x55\xcd\x84\x16\x82\x2c\x6b\x49\x05\xc8\xb0\xc0\xb0\xa0\x2a\x9a\x25\x57\xe5\x4d\x45\xd0\x24\xcd\x14\x4c\x8d\xfa\x25\xa7\xab\x1d\xbb\x6c\x71\x36\xa7\x39\xa4\x59\xd4\xb5\x36\xaa\x17\xcb\x52\xd9\xf9\x2a\xd9\x10\x85\x82\xac\xd8\xae\x85\x08\xa4\xc9\x40\x06\x8a\x2a\x95\x14\xd2\x2e\x95\xf9\x4a\x69\x10\xbe\xaf\x1f\xa2\xe3\xa4\x21\x32\xb0\x7a\x88\x3e\xfe\xfc\x10\x99\x5c\x15\x5b\x67\xe2\xed\x5c\x17\x93\xc9\xf8\x78\xae\x8d\xe0\x57\xa4\xf7\x45\x6b\x5c\xbe\xf4\xbd\x0f\x9f\xcc\xac\xfa\x22\xbb\x6c\x76\xc5\x52\x71\x90\xae\xb8\x26\xd6\xbf\x13\xeb\xbf\xb7\x2e\x9f\x9b\x76\x7c\x9b\x24\x93\x62\x56\x7f\xee\x62\xf4\x08\x7a\xf9\x4d\xef\x5c\x79\x3e\x6e\xeb\x7c\xdf\xf6\x9d\x2a\x77\x6f\xec\xbe\x70\xcd\xd6\xc9\x63\x11\x7f\xf6\xe3\xe5\xaa\x21\x76\x97\x18\xc3\x63\x31\xf6\xfc\xca\x21\x3a\x66\x45\x64\x2b\xe5\xd3\x5f\xa6\xef\xc7\xb6\xd2\x2b\xcc\xea\xa7\x9e\x23\x7e\xd2\xed\x5e\xf6\xf9\x95\xdf\x8d\xd9\x44\x6b\x77\xa6\xc0\xf3\xe4\xed\x2b\xc6\x96\xb1\xcc\xda\x43\xe3\xe8\xd1\xee\x2f\xff\x71\xe1\x95\x85\xa1\x32\xb4\x7c\x08\xed\xae\x1c\x32\x96\x2b\xa2\xe7\x2f\x4f\xef\xf1\xfa\xfb\xe2\x15\x60\x43\x77\xf6\x92\x5f\x8a\x42\xa2\x8f\x78\x5b\x97\x47\x6d\x2d\x4b\x3b\xe1\x7c\xb3\xab\xb6\xff\x92\xf8\xb5\x48\x2c\xbd\x38\xc2\x45\x29\x86\x8b\xcb\x62\xfd\xc7\x69\x24\x0c\xd1\xdb\x61\x1d\x93\x37\x75\x4f\x49\xef\xa4\x1f\x60\xd6\x6c\x5c\x36\xf5\x93\xab\xdf\x79\xe9\x7f\x65\x57\x5d\x74\xd5\xc9\x3f\x14\x89\xab\x4e\x1b\x38\xb6\xa5\x43\xe6\x39\x39\x84\xd7\x2f\x1d\x62\x1b\x4f\x0c\xc1\xe3\x25\xfd\xf3\x78\x0a\xe2\xfd\xdf\xfb\x86\xac\xc3\x17\x47\xcf\xf3\xb1\x7e\x57\x3d\xb5\xf1\x2a\xe2\xca\xab\xc5\xc1\x7d\x14\x62\x63\xad\xc4\xc6\x7a\xd1\x60\x1c\x3a\x6f\x88\x3d\x1f\xc7\xf9\x1b\x63\x70\x18\x83\x5f\x38\x44\x5e\x2e\x18\x82\xa3\xf3\x63\xcf\xc7\x6c\xa7\xa9\x30\xff\xdc\xdb\xbb\x85\xf4\x41\xda\xf4\xc6\x3f\xd6\x62\x56\x39\xd7\xec\xfc\xea\xd5\x9b\x27\x8f\x0d\xc4\xc7\xb9\x43\xfa\xe0\x87\xcc\x61\x3c\x06\x77\x62\xf0\x7c\x4c\x87\xf4\x70\x97\x7f\xee\x06\xfc\xed\x92\x81\xbf\x59\x3c\xa4\xef\x45\x31\x78\x39\x06\x7f\xc3\x10\x9a\xe6\x86\xb4\xc3\x0d\x19\xeb\x39\x03\xf5\x5d\x38\xd6\xb3\x13\x3c\xb0\xc6\xfe\x2b\xf1\x9a\x48\x5c\xfa\x68\x9f\x0f\xb4\xc5\x93\xcd\x03\x79\xd0\x20\xa8\x8b\x1e\xbc\xe4\x2f\xcc\xda\x67\x66\xc1\x8e\x6e\xe3\x92\xc9\x8b\xff\x35\xa1\xaf\xe2\xb8\xc3\xb1\x38\x82\x22\x54\xc2\x48\xdb\x29\x87\x98\x87\x4f\x22\x10\x20\x3c\xda\x1f\x9d\xf0\x27\xa8\x54\x6e\x6c\x3e\x45\x13\xe9\xf1\xc5\xf3\x72\x0b\xfd\x0d\x23\x87\x15\x1c\xc3\x84\x55\x41\x2c\xdb\xa6\xdd\x80\x80\x30\x5c\x13\x76\x9a\x64\xd5\xd2\x51\xb9\x22\x83\x76\xc9\x6d\xb0\xb6\xa9\x9b\x76\xca\x71\xa0\x51\xd2\xea\xa6\xae\x59\x55\xad\x0e\x6b\xb6\x0d\x2c\x4a\x17\x75\x0d\x55\xda\xa8\xa8\xc0\x3a\x59\x71\x54\xcb\x82\xbe\x0d\xae\x75\xdf\x1a\xdc\x4f\xb8\x1b\xdb\x8f\x0f\x9d\x7c\xba\x78\xd1\xca\x2f\xe3\xb1\x4a\x7e\x2d\x51\x62\x3e\xb1\x98\x58\x31\x68\xac\x8b\xf1\x60\x49\x10\x55\x4f\x5e\x86\xab\xe5\x50\xf8\x32\x3a\x3e\x31\x81\x6b\xb7\xe4\x26\x73\xcb\x41\x6e\xa4\xcc\x8a\x8e\x66\x1a\x55\x5e\x28\x1b\xa6\x59\x85\x80\xd0\x51\x05\xc9\x62\xa7\x42\xd6\x9a\x6e\x53\x6d\x43\xc3\xd4\x2d\x43\x17\xdd\x3a\xa8\x93\x56\x33\x43\xda\xae\x9a\x61\x40\x09\x98\x1a\xb2\x91\x5a\x44\x8c\x4a\xca\xaa\xab\x93\xa5\x2e\x41\x9b\xde\x6c\x35\xc7\x90\x44\xdd\xd6\x1c\xc3\x31\x2c\x87\x2c\x00\x59\xb1\x11\x81\xea\x96\x69\xab\x92\x2e\x2a\x96\x85\x64\x1b\xb5\x6c\x9e\xb7\x6b\x76\x1d\xb6\x2c\x68\x03\xce\x16\xea\x44\x30\x77\x21\x36\x77\x7a\x0a\xc7\x38\x09\x32\x38\xd7\xac\x13\x6f\x22\xde\x12\xdc\x40\xcd\x91\xd4\xb2\xbe\xd9\x7b\x74\xc1\x1b\xbc\x61\x5d\x68\x32\x4d\xe7\xfc\x0b\x7a\x4c\x6a\x7c\xf1\xe8\x64\x6e\x32\x37\xba\x28\x56\x59\x7a\x59\x0e\x5f\x9e\x62\xc8\xaa\x56\x22\xed\x86\x68\x73\x62\xd5\x30\x9d\x7a\x41\xa8\xea\xa6\x5d\x81\x4d\xbd\x02\x1b\x64\xc6\x6d\x17\x94\x86\xca\x38\xac\x2c\xa2\x72\x55\x45\x2d\xb7\xe4\x1f\xd2\xce\x94\x8a\x15\xb5\x89\x2b\x5f\xe8\xb6\xec\x36\x28\x15\xb5\x68\x11\xd6\x4b\x80\x01\x2c\x6f\xea\x9a\x29\x17\x35\x49\x54\x75\xd9\x56\x4c\xc5\x92\x4d\x54\x82\xa8\xc8\x73\x4a\xad\x80\xda\x92\x28\x69\xc0\xca\x20\xbb\x69\x55\x00\x93\x81\x40\x36\x55\x4b\x37\x34\x4d\x91\x35\x0b\x76\x6c\x20\xa3\xb0\xde\x81\x9e\xc0\x49\x58\x13\x2e\x89\xab\xfc\x34\xce\xde\x3f\xfd\x51\x8f\x4f\x00\xe3\xdf\xc3\x0a\x4e\x78\x04\x77\xa2\x83\xed\xde\xa5\x61\xa6\x11\x4a\x2b\xf3\x02\x55\x70\x66\x55\x07\xb4\x25\xa4\x8e\x38\xb3\xf8\x45\x9b\xbc\xa9\x9d\xa8\x15\x1d\x9a\x37\x5d\x16\xd4\x66\x8b\xa0\x45\x50\xc1\xb9\x4d\x26\x38\x33\x82\xcf\x24\xc6\x5b\x5d\x16\x65\x30\x29\xd2\xa5\x4e\x8b\xe3\xc9\xa2\x33\xdb\x74\x40\x9b\xe7\x5c\x16\x48\x23\xec\x6c\xd3\x7b\xd1\x0c\xb4\x8d\x99\xba\x65\xa5\x78\xd3\xea\xb4\x80\xde\xb1\x81\xcf\xf7\x45\x5c\xc7\xc2\xcc\xe6\xa7\x6f\xf6\x66\x02\x83\x3c\x84\x40\xe8\xaa\x7e\xad\xb9\x43\x7e\x4d\xc1\x30\x76\x6b\xe2\x73\xc2\x76\x36\x0f\x71\x8e\xb1\xa3\x61\xdd\x8b\xa8\xc6\xea\xa1\xab\x13\xcf\x6b\x5d\xd9\xcf\x67\x7e\xe8\x08\x86\x87\xfe\x7c\x11\x9f\x39\x34\xb2\xf9\xa3\x38\xef\x99\x13\xfa\xb0\x16\xae\x59\xa8\x67\xf3\xc7\x10\xce\x9b\x17\xe4\x3c\xf5\x70\xeb\xdf\xe3\x80\xb8\xa6\xe4\x81\xdb\xa3\xf1\x18\xc1\xfd\x0b\x9c\xe5\x0f\x86\xf9\xeb\xec\xa8\x56\x22\xde\x83\x3d\xd6\x8d\xe0\xaa\x7f\x1f\xeb\xf8\x9b\xf0\xf3\x07\xa3\x7e\x83\xfc\x6c\x5e\xbf\xb1\x7a\x85\x51\xed\x5d\xff\x3e\xc3\xd4\x19\xd1\xf3\x37\xa4\xef\xa2\x3f\x11\x8e\xf3\xb9\xbb\xbf\x9b\xc2\xf7\x99\x4e\x74\x85\xb4\x40\x3f\x48\x30\xc4\xeb\x71\xa6\xd2\xf3\x88\x37\x12\x04\x60\xe2\xf6\xfe\xe8\xa2\xd1\x25\xfe\xa5\x39\x7c\x83\x29\xb8\x44\x1a\xcb\x59\x9a\x16\xe4\xa2\xa6\x71\x86\x21\x66\x58\xc4\x39\x9d\x9f\xe1\xeb\x8f\xa0\xca\xa3\x1a\x6a\x4a\xe4\x79\xeb\x3e\xf8\xc1\x0f\xac\x43\x8f\xa4\xe4\x99\x92\x33\xc2\xcc\xb6\xbc\x17\x59\x75\xeb\x55\x16\xb2\xa2\x06\x38\x97\xa0\xec\xd5\x35\x88\x6c\xcb\xd6\x44\x85\xde\x26\xd9\x92\xaa\x5e\xe9\x8a\xe0\xd9\xcf\xa2\x5b\x9f\xec\xe1\x07\xe7\xa5\x3c\xe2\xe7\x40\x22\x22\xfc\x84\xb5\xea\xf0\xdd\xc3\x63\x61\x0c\x5e\x0f\xf7\xfa\x03\x3c\x9c\x1e\xe1\x41\xf3\xcf\x4d\xf9\x78\xdb\x74\x5d\xac\x1d\x7c\x07\xe1\xe8\xc3\x89\x76\xac\x30\x7f\xcc\x34\xae\x50\x7b\x0c\x45\x70\xa9\xd7\x4e\x96\x9e\x7e\x31\xc6\x6f\x06\x9d\xc9\xe6\xf7\xe3\x9c\xf7\xfb\x77\x46\xcf\x2b\x71\x7a\xed\x09\xed\xfd\x0b\xba\xe7\xa6\x4b\xf4\x8d\xd9\xfc\x8e\x27\x94\x5f\x67\x69\xe7\x96\x47\x7f\x9a\x9c\x97\x47\xf1\x2c\xbd\x2d\x8c\xc5\xab\xb8\x7d\x3d\x9b\x87\x87\x31\x7f\xae\x89\xc6\x1f\xd4\x92\x98\x7e\x36\xc1\x27\x0e\x96\xc7\x1e\x1e\xd8\xd8\x7c\x71\x5e\x49\xe7\xd1\xc4\xf3\x7a\xe8\x17\x14\x71\xdd\x91\xe2\x58\x34\xfe\x20\xfe\x0b\x0f\xf5\xe1\x21\xc8\x2b\xec\xe3\x61\xc7\xa9\x31\x3c\xf8\xb5\x2d\xee\xc6\x79\xa3\xb6\xc5\xf8\x1c\xc7\x6a\x3c\x0a\xc6\xea\xac\x5b\x98\xbe\x11\x3e\xb7\x85\xf8\x9c\xea\x4a\xe9\x87\x69\x83\x59\x73\x9c\x78\x5d\xea\xf2\x07\x56\x7e\x9f\x59\x75\xfc\xe4\x71\x62\x79\x43\xec\xd1\xc7\xee\xe1\xd5\xcf\xa9\x4c\xbc\x8e\xf8\x4c\x57\x4e\x6f\xa6\x2d\xe2\xa4\x40\xbb\x9d\x89\x6b\x97\x4d\x10\x97\x11\xab\xf1\x79\xab\x40\xdb\xe5\x46\x73\x4b\xa9\x39\xb9\x8c\x40\x98\x6d\x61\xd1\x64\xce\xf7\x74\x53\x1e\x7c\x71\xcf\x25\x8e\xae\xd2\x2e\xa5\x72\xa3\x78\x81\x18\xa9\x3a\x2c\x0f\xea\x1d\x15\x14\xb8\x12\xa9\xe1\x3c\x40\xfe\xeb\xe7\x96\xf9\x59\xdd\xee\x5c\x4b\x5e\x63\x93\x27\xbb\x7f\xb3\xdd\xaf\x1f\x79\xd2\x96\x36\xd9\xe0\xb3\x7c\xf5\xc4\x65\x60\x94\x5c\xf4\x7b\x47\x79\xf2\xd7\xb3\x2f\x6c\x3f\xfb\xca\xff\xb2\xd0\x6f\xa6\x9e\xbd\xf2\x6d\xe0\x2c\xf4\x1b\xef\x45\x5b\x67\x5f\x7d\x65\x67\x8a\xfa\xe8\xdb\xd0\xfe\x4f\xa3\xcf\x7c\x1a\x3d\xf6\x69\xe4\x5e\x7b\xcf\xb5\xca\x3f\xa2\x0f\x80\xdf\xa1\xd3\xd7\x7d\xef\x7b\xe4\xed\xe7\xbe\xf5\x7d\x0a\xbf\xee\x7d\x6f\x5a\x7e\xcf\x72\xfe\xa2\x6b\x3f\x74\xed\xd2\xd4\x6a\xde\xbc\x6d\xe6\xb7\xef\xdc\x91\xba\xf3\x2e\x77\x1d\xf8\x4c\xe7\x16\x30\x85\x3e\x1a\xd3\x33\x66\xd6\xcf\x00\x8d\xb9\x8b\xa1\xa7\xfc\x5a\x7d\xb7\x77\x47\xd3\xc7\xe9\xeb\x3d\xda\xfc\xe8\x20\xb3\x7a\xfb\xf9\xc4\xd6\xee\x8f\xae\x78\x52\xf4\xf9\x4e\x4d\x43\xfa\x91\xec\x5a\x8f\x8f\xc0\xf7\x45\xe2\x8d\xff\x94\x5d\xeb\x71\x13\xf8\xb3\x48\x9c\xfb\x52\x96\x3e\x70\x4f\xc0\x3f\x37\xa6\x9f\xa1\x6d\x66\x4d\x71\xfe\x49\x27\x5d\xf1\xfa\x95\xbb\x98\x55\xcf\x4c\xac\xeb\x5e\xf1\xe9\x95\xb5\xa8\x7f\xbf\x3e\xf7\x27\x12\x7c\x67\x62\x3a\x9a\x3e\xbf\x30\x34\xdc\x1f\xf1\xc5\x75\xe9\x17\x7b\x7c\xb1\xe9\xf4\xcb\x52\x31\xfe\xf5\xe4\xe0\xfb\xbd\x76\xb0\x0d\xe0\x9f\x67\x3a\x17\xeb\x31\x4c\xc6\xf0\x6c\x19\x09\xce\x06\x0b\xd3\x8b\x97\x8c\xa4\xc6\x17\x2f\x5b\x4c\xe1\x3c\x56\x7e\x56\xa1\xd3\x01\xc8\x2e\x5c\xbc\x8c\xaa\x3b\x64\x51\x94\x8a\x62\x01\xb1\xa4\x20\xa2\x62\xbd\x5e\x55\x90\x82\x5a\x5d\x02\x69\x1a\x30\xdb\xa8\xa9\x69\xa0\xea\xd6\xaa\x50\x97\x49\xc6\x6c\x83\x8c\x9c\x32\x00\xd1\x25\x6c\xcb\x2c\x68\x1a\x32\x91\x89\x9a\xba\x24\x38\x46\xd1\xd1\xa1\x62\x36\x40\x01\x02\xd3\x2d\x23\x1e\xd9\x6a\x1d\x28\x80\x20\xa1\x2b\xa3\x76\xb1\xda\x24\xa2\xd8\xb1\x99\xcd\xef\xc6\x79\xc6\x76\x9f\x1d\x5b\x9b\x7c\xdd\x85\x65\xf9\xf0\x95\xd1\xda\x14\xd4\x2b\xd9\xb7\x12\xcf\x39\xbc\x1f\x64\x84\xf7\x43\xf6\xe1\xaa\x64\xfb\x42\x9f\xf9\xb2\xee\xf2\xf4\x3f\xd3\x8f\x31\x6b\xa6\xef\x02\x7f\x13\x8b\xe2\x1b\x99\x55\xc7\x6e\x7f\xf9\xe4\x95\xef\x5a\xf9\xa3\xa8\x3d\xac\x93\x76\xe0\x9c\xd7\xd3\x77\xc5\x74\x27\x86\x6f\x5e\xd4\x83\x07\x67\xd2\x1d\xda\x88\xf2\x5a\xf3\xf8\xfc\xe7\x3b\x62\xa7\xc5\x12\x71\xb9\xf0\xc0\x58\x20\x58\xb8\x2a\x39\x26\xc8\x7c\x0a\x47\xed\x12\x69\x2f\x17\xe5\xa9\x45\x63\x0c\xce\xbf\x32\x6f\x62\x74\x11\x4e\x7c\xb9\x07\xbc\x63\x0b\x38\x07\xfd\x7a\xcb\x7d\xef\x79\xf7\xdb\xb7\x7c\x62\xff\xbd\xdf\xdb\x8f\x7e\x34\x4e\xbe\xe2\x9e\xf1\x18\xf8\x39\xca\x7b\x2f\xf2\xd3\xa7\xa1\x2f\xa0\x4b\x17\x80\xff\x22\xbf\xed\x00\x4b\x85\x05\xbe\x09\x54\xbe\x62\x56\xf4\x92\x55\xaa\xca\x4d\x33\x03\x05\xa1\x6e\xd7\x60\xa5\x52\x15\x74\x83\x4d\xd5\x8a\x45\x9b\xd3\x34\x4b\x93\x11\x04\x66\x05\x9a\x56\xdb\xfd\xbf\xee\x97\xc0\xed\x6b\xd0\xd7\xd6\xa0\x3f\x7c\xfe\x4d\x17\x6d\xbf\x28\x35\x0f\x13\x55\xe8\x12\x05\xd3\x44\x06\x32\x51\xdb\xd6\x2d\xdd\x29\xa9\x50\x85\x0d\xc0\x0a\x88\x43\xb6\x02\x0c\x50\x21\x1d\xb7\x01\x2c\xb7\xd5\x70\xca\xd5\x88\x76\x7e\xad\x19\x5c\xc3\x64\xf7\xf5\x31\xbd\x1d\x87\x9f\x9b\x88\xeb\x78\x3c\xc0\x63\xb8\x1a\xc5\x5b\xc2\x7a\x51\xf8\xf9\x1d\x7f\x8c\xf1\x46\xac\x9d\xa9\x05\x09\xde\x30\xb2\xf9\xc3\x7f\xc3\x55\x69\x56\xc6\xe0\x58\xde\x77\xbc\x9a\xa0\xb1\x12\xc1\x71\xfd\xa7\x1d\xb8\xbe\x1a\xce\x53\x5a\x4c\xc3\x54\x2d\x3a\xb1\xea\xc9\x10\x3e\x4f\x3a\x2f\xc8\x12\xe1\x67\x32\x29\xb6\x6b\x45\x9c\x61\x01\x54\x7a\x7f\x53\xb5\x19\x1d\xc2\x94\x3d\xa3\x8f\xb4\x67\x33\xfe\xcb\xbf\xa7\xaf\xa7\x21\x7d\x2b\x41\x11\x27\xc5\x72\x51\x4c\x8c\x2e\x02\x38\x67\xdc\xa0\x1e\xa8\x17\xf6\xec\x01\x5f\x03\x99\xba\xd1\x68\x83\x1f\x54\xda\xb5\x8a\x83\x73\xe6\x94\x82\x14\x05\x2c\x6a\xd2\xb7\x76\x26\xc9\xdd\x4e\xcd\x6e\x16\xdd\x5b\xdc\x26\x84\x38\x29\x99\x85\x0c\xff\x15\xd4\x34\x80\xb4\x96\x1d\x3f\xbc\x80\x20\x48\x27\x4b\x1f\xdf\x10\xd9\xca\xb8\xf6\xe2\x71\x88\x71\x38\x16\xd1\x28\x09\x9f\x1f\xe1\x50\xf7\x6b\xb0\x79\xbf\x67\xe8\xa9\x79\x09\xb8\x67\x8b\x62\xdc\x1e\xff\x62\x02\xee\xd1\xc2\xaf\x79\xba\x31\x06\x77\x68\x93\x19\x9f\xfa\x05\x3a\xc3\xdd\x9e\xcd\x6f\x7a\x15\xdf\x77\xd9\x98\xf8\x9d\x98\xcd\x1f\x7f\x3d\xfe\xdd\x86\x39\xfd\xfc\x61\x4e\x7b\xd8\x17\x0e\xc6\x1b\xd6\xef\x5d\xd5\x9d\x97\x86\xf4\x64\x36\x7f\x7c\x23\xb1\x2b\x9b\xde\x7b\xa4\xfb\x0a\xf9\xed\xa8\x7f\x2b\x9b\xdf\x24\xe1\x7e\xe7\xb4\x1f\xcc\x6f\xb4\x1f\xfe\xcc\x3b\x06\xf4\x0b\xa3\xe7\x99\xfe\x79\x7b\x98\x60\xf2\x87\x57\x61\xed\xb5\x7a\xc0\x77\xf4\x54\x98\x6b\x53\xc6\xb9\xfa\x8d\xa8\xad\x53\xe7\xe0\xf0\x5a\xdc\xd6\x75\x21\x46\x12\xdf\x5d\xd3\xc3\x13\x71\x52\xe0\x03\x99\x04\x4b\x9c\x1d\xc4\xbd\x85\x60\x7f\x81\x00\xa3\xf3\x27\x82\x74\x2c\x7e\x36\x96\xd1\xf9\x64\x7a\x7c\xe9\xe9\x00\x2c\x18\x4b\x5f\x1a\x6c\x10\xa4\x7b\x4b\xfd\xd2\x81\x6c\xaf\x8b\x02\x97\x71\x32\x42\xc1\x31\x25\x64\x9a\xb6\xde\x02\xba\xe8\xf0\x9d\x4a\xd1\x16\x1d\xa8\x40\x4b\xb2\x6c\x50\xd2\x61\x53\x6f\xa6\xf8\xc1\x4c\x2b\x76\x1a\x92\x58\x2d\x34\x64\x51\xd2\xc9\x12\x2a\xd7\x50\x5b\x33\x8a\xc0\x04\x26\x2a\xd7\x5a\x4c\xbb\x02\x1c\x49\xb5\x0d\x11\x8a\x0a\x34\x04\x4b\xae\x57\xf4\x0a\xe2\x90\x08\x21\xa8\x20\x31\xcc\x6b\x05\x0a\x09\xfa\x1c\xb9\x3a\xc1\x2f\x6a\x88\x9f\xe9\x6f\x62\x9f\xef\x5b\x73\x70\xe7\xfd\xe6\xaa\x3e\xdc\xad\xc3\xf7\x8d\x5e\x4f\x70\x41\x1e\xa7\x4b\x03\xec\x05\xda\xdd\xf3\x85\x27\x7a\x07\x82\xc3\x43\xc1\xfd\x17\x44\xe7\x0d\xc0\x5b\x91\x02\x3b\xc0\xe7\x57\xaf\xbd\x71\xe5\x0f\x3a\x6d\x72\xd3\x06\xd7\xdd\x81\x52\x3b\xc8\xcd\x9d\x2e\xa0\xc1\x2c\x4a\x91\x9b\x49\x6a\xf6\x8e\xf0\xd3\x17\x06\x22\x2e\xf5\xc7\x47\x1f\x5d\x75\xc3\xaa\x1b\x1e\xff\x90\x7b\xca\x96\xc7\x1f\xdf\x45\xba\x1f\x42\xcf\xde\x73\xcf\x3d\x68\xdb\xbd\xf7\xde\x8b\x2e\x44\x37\x3d\xf5\x14\x38\x80\x6e\x02\x8b\xd0\x2f\xfc\x57\x5c\x3e\x8e\x3e\x8f\x79\xeb\x1f\x12\xbc\x65\x65\xf3\xc7\x2e\x1d\x2c\x67\xc7\x2e\xc0\x35\x32\xb0\x54\x1d\x11\x63\xb2\xab\x64\xf3\xd3\x7e\xed\x9c\xf5\x73\x64\xe7\x69\xac\x5f\x7f\x97\x80\xab\x11\x5f\xbf\xae\x5f\x66\x37\x10\x03\x64\xd0\x93\x83\xf5\xf8\xf9\x53\x30\x5d\x4e\x09\xfa\xd5\x63\x37\x08\xce\x22\x2e\x21\x2e\x27\x56\x10\x57\x13\xab\x62\xb9\xa6\xfa\xef\x57\x04\x59\xc3\xfc\x9c\x27\x63\xb9\xf0\x04\xe5\xe2\x79\xb9\x81\xea\xf6\x67\x73\x6f\xae\x8d\x9c\x23\xf1\x3a\x2f\x21\x02\x08\x19\x3b\x03\x74\x54\x92\x01\xa7\x35\x35\x01\xb5\x74\xc0\x73\xa8\x46\xda\x83\x59\xfc\xa4\x39\x77\xdc\xd6\xca\xaa\xa4\xca\x0d\xd3\x81\x96\x8d\xf4\x96\x59\x03\x12\x6a\x34\xf5\x26\x80\x2e\x33\x80\xb5\x93\x7c\x2a\xcc\xa1\x11\xd6\x17\x47\x9e\xc7\x35\x92\x71\xc5\x88\xa3\xcf\x27\x71\x78\x64\x65\x08\x0d\xd6\x3a\xdd\x8f\x25\x1e\xc1\xf4\x9e\xf2\x6b\x5c\x9d\x1c\xe4\xbc\x35\x12\x37\xc8\x7b\x77\x31\xc2\x7c\x82\xf3\xd3\x8b\x96\x2e\xc3\x49\x05\xc7\xe6\x2f\xc8\x71\xcb\xfc\xcc\x76\x5c\x7e\x39\xc0\x59\x06\x47\x7d\xa3\x25\x37\xe8\x3e\x52\x4f\x18\x82\xa4\x6c\xb9\xc9\x1c\x25\xdb\x14\xd3\x69\x51\xb6\x60\xb3\x4c\xa7\x4e\x56\x18\xb7\x20\x02\x05\x70\x4a\x81\x35\x39\x88\x0c\xa4\x98\xa8\xc8\x00\x0d\xe9\x25\xd3\x21\x95\x2e\x31\xa2\xcf\xda\x36\x4e\x98\xd5\x04\x5a\xa7\x14\x7e\x6a\x5b\x27\x9c\xa2\xed\x19\x2a\xc0\xea\xfd\xa5\x0d\x51\x97\x74\x56\x2b\x48\x2a\xaf\xf1\x1c\xc7\xb0\x19\x4d\xb0\x0a\x05\xb9\xc0\x68\xac\xea\x96\x91\x80\x14\x15\x28\xa0\x4c\x56\xdc\x1a\x62\x40\x41\x96\x65\xd4\xc6\x17\x94\x50\xcd\x34\x3d\x0a\x94\x4a\xc1\x3d\x65\xbf\xf6\xaf\x94\x1d\xb7\x24\xe2\x1c\x8a\xc9\xd2\xc7\x21\xd1\x8c\xd7\xe5\x38\x32\x89\xe5\x04\x73\xf8\x91\xa5\x31\x39\xf1\xfc\x3e\xbc\x06\xec\xf2\xb5\xcc\xd3\xf8\x0e\xeb\xcd\xdd\x35\xe9\x5d\xf4\x5d\xc4\xeb\x88\x51\x6c\x3d\x5e\x40\x5c\x81\xb5\xb3\x84\x73\x3c\x2a\xc4\xad\xfe\xc9\xef\x31\xdf\x2d\x9b\xcc\xa5\x26\x17\xcd\x4f\x83\xdc\x64\xee\x0d\xf9\xe5\x60\xd1\xa9\x38\x05\xe6\xb9\x60\x6c\xfe\x84\x7f\xa3\x17\x2c\x4c\x8f\xa4\xd2\xf9\xf1\xb1\xdc\xa4\xe7\x9c\xa5\x73\xf9\x71\x3a\x15\xde\x29\x1a\xc3\x98\xc7\x79\xa3\x42\xcc\x03\x3e\x55\x44\x0c\xc9\xcd\x30\xa0\xc5\x20\x96\x12\xea\x19\xc4\x8d\xd4\x90\x2e\x8a\x6d\x4e\xb6\x55\xc1\x91\x50\x93\x12\x79\xa0\xcd\x16\x46\x6a\xb3\x05\xf2\x86\xed\x17\x81\x7b\xc0\x8f\xde\xd9\xf9\xcf\xce\xec\x77\x7e\x7b\x1b\xf9\x30\x4b\x1a\x5f\xda\x7e\x3f\x5a\x3a\xf2\xdd\xd9\xcb\x9e\xa0\x76\x75\xde\x3d\x52\x7a\xa1\xfd\xf3\xbd\x0e\xc8\xa3\x9f\x83\x83\xf8\xef\x21\xef\x2f\x05\x55\x11\x65\x40\x9b\xe3\x44\x91\xe3\x50\xbb\xc0\x17\x0a\x42\xa1\xc0\x6a\x1c\xcf\xb2\x05\x54\x94\x46\x7e\x7a\xde\x99\xf7\xa9\x1f\x59\x71\xed\xcd\x2b\x56\x2c\xbb\xef\xb3\xea\xb2\x15\xcb\x7e\x83\x5e\x59\xfb\xe6\xce\x3b\x5e\xfe\xf8\xc7\x5f\x7e\xf9\xa3\xde\xff\xfa\xf4\xc5\x91\x65\x03\x74\x95\x15\xea\x9d\x29\x3f\xcf\xd6\x08\x90\xbb\x12\x0d\x69\x2e\x6e\xbf\x45\xd9\xbe\xa2\xff\x68\xe8\xcc\xb6\x1d\x67\x24\x33\xdb\x0e\x5f\x34\x77\x82\x2f\x95\xe8\x3a\xe2\x80\xd4\x69\xe0\x17\xf6\xfb\x20\x8e\x7f\x70\xd9\xfc\xd1\xb3\xf1\x6a\xfe\xb5\x58\x5c\xc1\xb7\x89\x70\x1c\xe2\x40\x58\x1f\x03\xe2\xb8\x1a\x91\xcd\x1f\xc6\xf5\x1c\xf6\xe0\x73\x29\x44\x2a\xac\xf7\x4a\x9c\x1a\x79\x0f\xc1\x4d\x8b\x70\x49\x19\x8f\x5d\xda\x8e\xdc\xf1\x11\xae\xc0\x52\x85\x99\x42\x4a\x98\xe1\x2b\x94\x50\xa0\x38\x7b\xb6\x05\x61\x18\x44\xf2\x5e\xb4\x25\x29\xb0\x0a\x81\x0a\x35\x97\x9f\xad\xe9\xfa\x48\x01\xb5\x4c\xa4\x5b\x48\x71\xf0\x38\x83\x9c\x52\x25\xec\x6f\x7a\xa3\xc5\xe3\xb1\x71\x0e\x09\x23\x91\x19\x67\x22\x1d\x54\x72\xf1\xd3\xb3\x62\x3e\x9a\xcc\x8d\x8d\xc6\x06\x44\xd5\x8a\x2c\xd9\xea\xb4\x38\xb2\x00\xf8\x13\x2c\x60\x41\x8d\x73\x59\x2a\x03\xda\xbd\x3b\x7f\xf8\xde\x9f\x51\x82\x95\xd9\x22\x84\x23\x4a\x05\xba\xa6\x6d\xa3\xb6\x85\x34\x1b\x29\x30\xc8\xe7\x80\x7d\x57\x1f\x77\x87\x2e\x8c\xe1\xb4\x44\xb3\x3e\x3c\x4b\x4f\x9f\x1e\xe1\x54\xf6\x6b\x5e\xf8\x38\xdd\xfc\xdf\x01\xbc\xd0\x95\xd2\x12\x8e\x7d\xfc\xa7\x07\xdf\xf5\xab\x58\xcc\xd0\xb7\xa9\x70\xac\x66\xd7\x2f\xa3\xf6\x65\xbf\xc6\xbb\xdf\xef\xae\x5f\x24\xe0\x46\x04\xff\x8f\xd8\x78\x70\x4c\xe6\xf0\x2d\x3d\xdc\x05\xb1\x2f\x5c\xb7\xe9\xc8\x3a\x1c\xab\x21\x23\x1a\x8b\x69\x8b\xd6\x83\xbc\xa5\x6f\xc4\x37\x39\x16\x8e\xa4\xf0\x02\x94\x0c\x02\x8f\x31\x9e\x30\x67\x4f\x07\x8b\xa9\xa5\x93\x23\xa9\x31\x10\x43\x31\xdd\xf6\x74\x51\x99\x21\x4b\xae\x94\x61\x48\xc9\xe9\x18\x0e\xa8\x33\x19\xd7\x52\x34\x4b\x91\x29\xc7\x60\x50\x15\x39\x80\xa7\xac\x8e\x11\xbe\x68\xdd\x66\x19\x59\x83\xba\x3c\xeb\xc8\xf2\x88\x2a\xeb\xb2\x5b\x42\x85\xb2\x0e\x41\x99\x14\x40\x93\x45\x55\x45\x61\x33\xb6\x6b\xda\x48\xf2\xfe\x85\xf3\xc0\x75\xb7\xfc\x79\xec\x3f\x18\x9b\x9f\x42\x4b\x21\xdc\xc1\xf7\x6d\x88\x34\xe6\x61\x8f\x67\x3c\x3f\xe6\xb4\xa0\xb2\xd3\x79\x81\x27\x83\xab\x72\xfb\xf1\xa1\x73\xc0\x48\x2a\x9c\x6c\x7a\x7c\x71\x7c\x6e\x54\xc9\x71\x90\x06\x2b\x55\xb3\x31\x52\xaa\x98\x8e\x5e\x11\x34\xd4\x40\x26\xc5\xc3\x4e\x06\xb6\x64\x4a\x41\x26\xd5\xee\x64\xc2\x17\x6d\xb8\x2d\x50\x53\x50\xcb\x31\xca\xb5\x72\x53\xaa\x57\x6b\x46\xd9\x9a\x6d\x4a\x12\x65\x8a\x4e\xc9\xe3\x72\xcd\x42\x9a\x19\x8f\x49\x46\x74\x39\xfe\x7c\x44\x47\x21\xa8\x87\xe0\xd3\xf7\xdf\x63\x74\x37\xe9\x4c\x04\xff\x75\x04\x0f\x62\xd1\xc7\xba\x1e\x7c\xfd\x0d\x31\x7e\xc0\xb1\x36\x0f\x92\xa5\xd7\x5f\x45\xc4\x63\xb3\x11\xbf\x6d\xfb\x7c\x04\x57\xe2\xf0\x03\xf7\x05\x78\x34\x70\x2e\x23\x81\x38\x99\x38\x95\xc8\x46\x35\xb2\x08\x10\x06\x63\x72\xa3\x54\x6e\xec\x5c\x4f\xf4\x06\xe9\x04\x50\xaf\x42\x4d\x49\xb5\x1c\x4f\xc3\xba\x9a\xdb\x4c\x49\x4e\x47\x77\x1c\xca\xee\xe8\xe1\x6b\x84\x43\x2d\xb7\x8e\x54\x15\xdf\xe1\x25\xdb\x6e\x13\x98\xcd\x66\x13\x35\x67\x8b\xb2\x3c\xa2\xa0\xba\x8d\x53\x72\xdb\xe1\xbc\x82\xfa\x6b\x47\xef\x8d\xe9\x88\x11\x9c\x03\x48\xa7\xd5\xe8\xde\x2b\xe6\xe6\x74\x70\x37\xa9\xc7\xd0\xde\xe2\xe3\xe9\x0a\xfc\x4a\x25\x09\x4e\xb7\x44\x64\x23\xa5\x40\x11\x9d\xb2\x30\x92\x99\xb5\x79\x7e\x44\x74\x3a\xaa\x53\xac\xca\x80\xa9\x20\x8d\x64\x45\xa4\x81\x66\xc1\x6d\x09\x54\x01\x69\x94\xd3\x51\xc3\x17\xad\x9a\x2c\x63\x40\x0d\x8a\x7c\x27\x23\x8a\x94\x02\x75\xe8\xd4\xa1\x06\x75\xd6\x62\x67\xdb\x06\x32\xbd\x7f\x44\x3a\xa8\xa5\xd7\xcb\x87\x70\x7a\xb0\x47\xd9\x57\x56\x0c\x04\x99\xe4\x47\x73\xa9\x85\x74\x74\x37\x9a\x14\x46\xaa\xb3\x82\x13\xbf\xd7\xe9\xb6\x1c\x3a\xd3\x69\x38\x2e\x0b\xea\x5a\x0d\xa9\x12\xd0\x28\x03\x88\x80\x93\x50\x0d\xd5\x68\xb1\x63\x90\xa6\x8e\xa0\x81\xa0\x4e\x16\x3a\x02\x74\xcb\xa4\x24\x1b\x15\x1b\xea\x8e\x6e\x3b\x25\xd5\xc7\xa9\xed\xd7\xad\xf3\x79\xeb\xd8\x65\x31\x9e\x73\x68\x8e\x59\xb3\x75\xc5\x8d\xcc\xf2\xf7\x89\x1e\x9f\x1e\x8e\xc5\xda\x4b\x3d\xfe\x5d\xbf\x32\xfa\x8d\xd7\x16\x13\xf1\xe9\xcb\x31\x7e\x34\x22\xbd\x95\x3f\xbe\x05\x47\x50\xc8\xe8\x3b\x35\xa6\xd3\x7e\x1e\x93\x05\xdf\x5e\xc7\xf0\x1d\x6e\xe0\xff\x3c\xd4\x5d\x95\x76\x68\x11\xe7\x1b\x19\x4d\xdc\xd3\x25\x00\xc6\x56\x10\xc0\xc2\x38\x5b\x88\xff\xfa\xd9\x46\xfc\xdc\x8a\x13\x41\x7e\x45\xea\xb4\x77\xfe\x1b\xba\x61\x25\xb8\x07\x2c\x7b\x0f\xfa\x4f\x74\xd5\x5b\xc0\x77\xc9\x3d\xe0\x33\x20\xbb\x06\x21\x64\x9d\x07\xf6\x83\xf1\xf7\xa1\xdf\xa3\x3b\x3b\x56\xaa\x3e\xe3\xe7\xa8\x04\x65\xc0\x43\xc0\xb9\x0f\x39\x0e\x45\x6b\x86\x62\x89\xe8\x8f\x5a\xcd\xb0\x0c\xb2\xa0\x98\xd0\x54\x7f\x6f\x95\x60\xd9\x4a\xad\x72\x4b\x16\x10\x50\xd5\x7f\xb9\x68\x76\x53\x24\xab\xf8\x5e\xe7\xb1\x91\x84\x8e\x76\xb0\x6e\x8b\xd6\x92\xe3\xb7\xc4\xf0\x8f\xf7\x03\x8e\x2f\x23\x22\xdc\x07\xba\xcd\xa1\x4d\x3c\xff\x5c\x74\xcf\x3b\xc8\x3e\xbc\x24\x88\x8a\x63\x07\xda\xf7\x26\x16\x53\x8b\x42\x77\x62\x80\x88\x8e\x43\x53\x37\x6d\xfa\x5c\xd3\xa8\xe8\xa5\x99\x02\x09\xc5\x82\xc3\xf3\x94\xe1\xd6\xea\xc0\x52\x90\xd8\x6e\xb5\x11\xa7\x02\xb3\xe9\xd6\x52\x6d\xa7\xc3\x38\x0e\xd5\xea\x30\xe1\x2b\x75\x92\x6a\x9a\xb6\x76\xb7\x54\x84\xba\x05\x96\x68\xba\xa0\x48\x10\x55\x2c\xa7\x02\x8a\xc8\xac\xdb\x25\xc0\x22\x69\xb6\x25\x49\x23\x0c\x6a\xd8\x48\xf5\x94\x60\x68\x7b\xe0\x18\xb2\xbf\x4e\x3e\xfd\xff\x22\x7f\xd8\x5b\x3f\xcd\x6c\xde\xf9\x47\x0f\xbe\xf5\xd6\x98\xad\x82\xf7\x7c\x8e\xe3\x3c\x3c\xeb\xdf\x1c\xc3\x5d\x39\xe4\x9d\x2c\x7d\xfc\x8a\xd8\x3a\x6c\xf7\xd6\xe1\x03\xab\xa2\xb8\xa8\xe0\xb5\xdf\x57\xef\x4f\xc0\x3e\x04\x66\x96\xb8\xdf\x30\x9e\x9f\x5c\x38\x50\x30\xe3\x09\x0b\x80\xed\x90\x16\x28\xb3\x28\xe3\x3a\x3a\x28\x83\xb2\x2a\x70\x90\x2f\xb9\x35\xb7\x21\xa9\xd5\x11\x6d\x16\x42\x4a\xe8\x54\xc3\x17\x62\x9c\x54\xed\x84\x0d\xea\x06\x6a\x21\x53\x05\x2a\x25\x83\x02\xe0\x45\xd4\x40\x75\xda\x2c\x4a\x8a\xa9\x89\x3c\xc3\x32\x50\xac\xc8\x2c\xaf\xb5\x5d\x96\x64\x65\xd4\x50\x50\x53\x06\xcd\x4e\x1b\xb2\xaa\x2e\x5b\x82\xca\xcb\x50\x29\x60\xfd\x8c\x6b\x72\xc4\x6c\xa3\x73\x71\x66\xcd\xc1\xf6\xd1\x59\x71\x7d\x37\x2f\xa6\x59\xa8\xba\xc3\x90\x15\x97\x67\xc8\x02\x60\xdb\x2d\x50\x00\x6d\xc6\x65\xa8\x0c\xc9\x74\x34\x0a\xf6\x5e\xb6\xd5\x42\x25\x15\xf0\x54\x06\xf0\x80\x57\x50\x1d\xd5\x68\xc3\xb6\x8d\x8e\x68\xdb\x54\xc5\xb0\xdd\xb6\xae\xb7\x0c\xe4\xe8\xa8\xa8\xa3\xa6\x6e\xca\x96\xa8\x0b\x1a\x34\x85\x9e\x1d\xca\x87\xf2\xbc\xed\x5f\x03\x5a\x95\x71\x2d\x76\x4c\x43\x96\xc8\xd2\x7b\xdf\xd0\x08\xe3\x4d\x41\x7e\x9d\xfd\x4f\xe0\x18\xfa\xae\xfe\x35\xcf\x6f\x67\x73\x39\x46\x73\x5c\x33\xfa\xc0\xf7\x12\x3c\xa2\x44\xb5\x48\x71\xdc\x76\xff\x13\xb1\xfd\xc5\x92\xe7\xf7\x1f\xc1\x75\x96\xf7\x4f\xc5\x78\x4a\xf6\xd6\xe0\x63\x37\x26\xe4\x14\xe2\x9a\xd1\x11\x4f\x95\xde\x9f\xb0\xaf\xa3\xf1\x1c\x3d\x33\x06\x7f\xcc\xd3\x85\x3b\x5e\x7a\x25\xae\x3b\x9d\x30\x3f\xa2\xbf\x36\x87\xf9\x11\xf1\xda\x16\x83\xc3\x8b\x22\xb8\x11\x6f\xff\x78\x36\xd6\x3e\xce\x41\xe5\x3f\x3f\xfd\x8d\x84\x2d\x18\xb4\xc3\xd0\xcf\x3d\x1c\xc1\xcd\x9e\x1f\x90\xa5\x8f\x9e\x11\xb3\x09\xca\xbd\xb5\xff\xd8\x67\x12\x36\x44\x21\x9b\x5f\x2f\xf7\xe9\x2b\xd9\xaf\x71\xbc\xff\xac\x04\xdc\x0e\xeb\xca\xfa\xed\xec\xbb\x31\x36\x5f\x0d\xd7\x7e\xfa\xb7\xbe\x76\x8c\x20\x86\x8a\xe7\xb5\x77\xb6\x3f\x0e\xbe\x0f\xd7\xeb\x9a\xca\xc4\xda\xb1\x7b\xeb\x41\xf1\xfc\x18\x1c\xef\xbb\xef\x3b\x63\x8e\xed\x5b\xf6\xe8\xbb\x0f\xe7\xa4\x3b\xb2\x2e\x36\x2f\xb3\x87\xcf\x7d\xcb\x62\xf3\xf2\x6b\xc0\xf8\x74\x5c\x13\x6b\x07\xf7\xeb\xf3\x49\xf1\x94\xd8\xde\x8b\xe5\x8d\xff\x48\x06\x8f\x33\x9d\xd0\xe7\x66\x88\xe7\x2d\x4e\x14\xaf\xf7\xe8\x65\xe1\xac\xeb\x02\x71\xa5\xef\x55\x85\x7a\x3a\x1d\x16\xcf\x18\x62\xac\xe0\x34\x96\x71\x4d\x44\xd6\x15\x01\xa8\x12\x5f\x62\x65\x50\xe9\xd4\x38\xb2\xd1\x69\xb2\x1c\xd5\x9a\xad\x14\x58\xaa\x06\x3b\x10\xda\x65\x1d\x48\x65\xc4\x93\xa2\x88\x58\x92\xe3\x5d\x05\xd4\x79\xc1\x48\xf8\x3e\x96\x6a\xa8\x86\x50\xd0\x6d\xdd\x12\x05\x5b\x64\x3b\xa6\x20\x90\x15\x5d\xd1\x8b\x55\xdb\xb0\x74\x5b\x92\x66\x6d\x0d\x95\x34\x54\xd6\x22\x5c\x60\x5f\xd6\xc7\xc5\x73\x5f\x09\x62\x5f\x2b\xbb\x62\x7a\x39\x7d\x1b\x41\x25\xb2\x67\x2c\x09\xf3\xd5\x01\x9c\xe8\xc2\xf7\x24\x70\xc6\xc9\x3e\xb5\x3a\x0f\x2b\xd4\x73\x00\x3e\xcb\x14\x5f\xb7\x6f\x4c\x7d\x75\x66\x15\x34\xcb\x3a\x34\x52\xff\x3f\xc6\xbe\x05\x4e\x6e\xaa\x5c\xfc\x9c\xcc\x4e\x66\x44\x85\xec\x94\x65\x47\x41\xc9\xb0\x74\x36\xbc\x73\xd9\xee\x36\xd0\x57\x68\xa1\x8d\x50\x20\x4a\x81\x00\x02\xe1\x82\x25\xe5\x19\x15\x21\xbc\xc3\x3b\x60\x59\x82\xd0\x36\xd0\x57\xfa\xda\x4e\x1f\xd0\xe9\x4b\x57\x79\x8d\x2f\x5c\x5f\xfc\x17\xf1\xea\xa2\x5e\x5c\xf5\xaa\xab\xa0\x8e\xde\x2b\x2e\xdd\xc9\xd9\xff\x2f\x27\x8f\x39\xc9\x4e\x41\x71\xa0\xfd\x26\x73\x72\xce\x77\xbe\xf7\xf9\xce\xf7\x5d\xe4\x38\x13\x3f\x6e\xe3\x27\x86\x9d\x0c\xf0\x40\xf4\xd9\x77\x0d\xf2\xd0\xb5\x97\xc1\x0d\x13\xea\x38\x32\x14\x68\x0b\xd0\x85\xac\x8a\xea\x48\xbf\x25\xfe\x53\xe6\x5a\xeb\x3f\x90\x88\x2c\xc7\xd0\xa1\xd4\xf6\xb7\xc6\xfd\x0b\x1a\x1b\xa9\x2b\x6e\x41\x9b\x6e\x40\x3b\x6e\xa0\x8f\xd2\xaa\x9a\xa5\x6e\xc3\xff\x86\xcb\x24\xcd\xd2\xe5\xe7\xf1\xbf\x49\x9b\xdc\x2a\x94\xf7\xfc\xcf\x14\xbd\x2d\x63\x7d\xbe\x64\x0a\xdd\xe1\xfa\x2d\x01\x8e\xe2\x7c\x03\x37\xca\x2b\x08\xe8\x2b\xce\x2b\x70\xa3\x73\xd6\x81\x27\x13\x36\xbc\x35\x69\xe5\x6c\x5f\x9e\x85\x36\xd6\xb6\x98\xcf\x42\x3f\x79\xd5\x7c\xac\xf3\x9e\x27\xe6\x23\xe1\xda\x5c\xbf\x68\xc1\x07\x46\x34\x9f\x75\x57\x12\xf4\x5e\xc3\xf5\x48\xaf\x4e\xf9\x0e\x4a\xce\xf2\xf9\x3e\xe4\x8f\x35\x20\x95\x87\x10\xf0\xf7\xea\x97\x08\xbe\xc7\x72\x28\x80\x6f\xe5\x13\x3e\x72\x73\xbd\xef\xc5\x70\x2b\xac\x1b\x7b\x66\x4a\x7e\x24\x7c\x93\xbd\x87\xb7\x92\xf7\x05\x7a\xcb\x43\xc4\x7c\x9c\xe6\xf3\x5b\x3a\x08\x38\x7e\xef\xa6\x40\x1e\x3c\x7f\x10\xdf\x67\x94\x98\xa7\x1a\xd9\xbf\x05\x7a\xe0\x23\xa1\x9d\xa5\x4e\x5e\x88\xeb\x87\x26\xab\xc0\x04\x75\x91\xe3\x0c\xb5\x63\x21\x9d\x6b\x3f\x75\x7a\x67\x1b\x6e\x27\xd9\x7d\xec\x74\xcc\xaa\x99\x40\xe7\xe2\xc8\x62\x4f\x54\xab\x52\xce\x6a\xde\xb0\x3a\xa8\x49\xb6\xa2\x56\x46\x14\xcf\x9c\x04\x96\xc3\x42\x83\x43\x63\xe3\xf2\xa0\xad\x41\x05\x16\x91\xe9\xb6\x71\x13\x23\xa3\xd9\xe1\x03\xbc\x83\x63\xac\x35\xc8\xd9\x90\x3f\xf0\x89\x5c\xef\xf8\x0f\x33\x0f\x22\xc1\xbe\xfe\xea\x2f\x2c\xb9\x7d\xc9\x99\x27\x6f\x75\x61\xed\xea\xc5\xe8\x6f\x5f\xb8\xe3\xea\xd9\x8b\x21\xb7\xe4\x93\xf7\x2d\x76\xec\xad\x99\xcb\x91\x66\x3a\xfe\xff\x90\xfd\x40\xa4\xb7\xc2\xfc\xa3\xbd\xed\x29\xdb\x49\xcd\xb9\xb4\x5c\x28\xaf\xfd\xcd\x14\xdf\x91\xd0\x37\xeb\xf2\x07\xc1\xf7\xf2\x58\x5e\x1f\x9d\x53\xb0\x3e\xe8\x7f\xf7\xe7\x05\xfa\x99\x27\x5a\x3f\xbf\xe6\xf2\xf4\xf8\x7b\x5e\x49\xd1\x69\x18\x0b\x09\xe8\x74\xed\xaf\x63\xb8\x11\xd8\x72\x01\x7c\x1f\x9b\xd0\x73\xb1\x3e\xa8\x46\x77\x57\x8d\xa8\xe7\xf5\x1a\x7c\xa6\xf7\x04\x1d\xc2\xef\x9a\x9c\x95\x1b\xa0\x4b\xfe\xf3\xbf\x02\xcc\x22\x7b\x37\xd8\x32\xf9\xce\xac\x6f\x8b\x3c\x59\xb7\x71\xdd\x87\x12\x34\xe3\xbf\xdb\x8a\xe2\x0e\x0c\xbd\xe6\x32\xc2\xff\x71\x9a\x3a\x61\xcd\xa5\x04\x8d\x55\x9b\x6b\xde\xfc\x66\xc2\x4e\x65\x0b\xe5\x3d\xcb\x12\x6b\x0e\x7a\x7c\x89\x85\xf2\x16\xdc\x6f\x73\xcb\x0d\x69\x1b\xe1\xd9\x63\x12\x7b\x63\x63\x9d\xa3\xc7\x34\x7c\x07\x01\x57\x7c\x1a\xde\x97\x4b\xd1\xbc\x44\xce\x67\xf7\x7f\xc7\x36\x57\xb8\x07\x1b\x8f\xf0\xfd\xb1\x35\x38\x43\xef\x89\x2c\xf1\x0e\xbc\xff\xf5\x97\x0a\xf4\x3a\x89\x90\x23\xb8\x2f\xdc\xc0\xff\xf9\x7c\x42\xe8\x53\x23\xe8\xc9\x18\xf2\xcf\x79\xf1\xbb\x6f\xcc\x3d\x45\xdf\x17\xbe\x7b\xe1\xca\xff\x3a\x23\x3b\x87\x0f\xf3\x19\x02\x3d\x12\xcb\xb6\xcd\x27\xb5\xd2\xb5\x05\x7a\x93\x4a\xd8\xff\x58\xc7\xfb\xd4\x5b\xa0\x37\x1d\x02\x52\x71\x94\x55\x2a\x96\x91\xb7\xc6\x70\xdf\xa6\x14\xe3\xf1\x17\xb5\xa6\xed\x2d\x13\x69\x19\x89\xc7\x29\xef\xb9\x1f\x5b\x54\xf7\x85\xdf\xe9\x4d\xfa\x2b\xd0\x1b\xbf\x9f\x18\x4b\x2e\x94\x37\x9d\x9f\xda\x23\x31\x88\x51\x04\x38\xdf\xf8\xa7\x30\xe6\x16\xe4\x37\x9a\xf1\x19\xc6\x19\x71\x66\x53\x54\xf6\x13\x1b\x00\x1d\x61\x36\x53\xf0\x4f\xb9\x3b\x2e\x61\x84\x33\x3d\x09\x99\xd2\x37\xb3\x74\x44\x67\x86\xa9\x14\xd9\x8c\xe1\xc9\xb8\xaf\x99\x80\x14\x4e\x80\xba\xa7\x52\x75\x8f\x71\xbc\x3c\x35\xee\x69\x50\xe3\x04\xa4\x66\x78\xdc\x5b\x5c\x85\x35\x0e\x55\xb1\x63\x3a\xe4\x0b\x16\x01\xe9\x2c\xe7\x0d\xf1\x1c\x6d\x72\x22\x8f\x44\xc5\x56\x2c\x59\xb1\x4c\x7b\x64\xc4\x36\x2d\x45\xb6\x14\x5b\x81\x35\x09\x99\xf8\xa4\xa1\xa1\x88\x9a\xac\x34\x6b\x1e\x1a\xe0\x30\x30\x3d\xee\x7f\x33\x1b\xcc\x6f\x9e\xc5\x44\x11\xc4\x6c\xa9\xa3\x04\xb2\x38\xd5\x24\x36\x6a\xa6\x95\xa6\x95\xca\xdd\x34\xe9\x8c\xc4\xce\x6b\xb6\xbb\x2f\x23\x3b\xd4\xa8\xc7\x66\x0c\xe7\x80\x66\x53\x55\xc4\x67\x81\x37\x06\x19\x8a\x15\x0c\xdd\x69\x88\x8e\xaa\x2b\x54\xb1\x8e\x8a\x75\x6a\x7c\xc4\xb5\xd0\x60\xa6\xd6\x10\xe3\xcf\xc8\x50\x45\xa9\xd6\x1a\x8a\x6c\xa0\x71\x61\x84\x36\x44\x43\x42\x83\xb5\x41\x28\x8e\x9a\x68\x58\xb5\x8b\xac\x57\x14\x45\x6a\x8c\xe3\x2c\x17\x32\xc8\x32\x86\xaa\xc8\x52\xd0\xb0\x8a\x86\x95\x8c\x23\xa9\xba\x2e\xcb\xaa\xaa\x98\x42\xd8\x5b\x10\xcb\x91\x8d\xb8\xdf\xe1\xc6\xc3\x22\x8f\x34\xb6\xf1\x62\xdb\x75\x53\x94\x9f\x2f\x45\xb2\x76\x0d\xee\xf9\xb9\xe6\xe2\x98\x7e\xc3\xde\xd5\x6b\x2e\x4a\xc8\x60\x2b\x8a\xd3\x05\x72\x64\xc5\x39\x04\xfd\x36\x75\x76\x79\x23\x8e\x97\xac\xdf\x10\xbe\x9b\x6f\xc6\xa4\x0b\xf4\xa6\x2b\xe3\xdf\x28\x01\x7c\xf7\x34\xff\x37\xbb\x0f\x8f\xac\xde\x38\x7e\x1a\xbf\x67\xf5\x65\xb1\xec\x8e\xee\x8a\xaf\xc5\x12\xa0\x2d\xc1\x57\x56\x44\xf3\x1b\xfe\x33\x86\x0b\xa4\xdc\xdb\xfb\x21\x42\x76\xe3\xf8\x73\x38\xfe\x25\x84\x1c\x23\x7c\x91\x15\x67\x13\xf2\xd3\x6c\xda\x91\x7b\x6e\x22\xe6\x83\x79\xca\xfd\x36\x9e\x3d\xb6\xa9\xc1\x47\xc0\xba\xc9\x53\x73\x6b\xe9\xd3\xa6\x54\x11\x8d\x78\x29\x3e\x3b\xe9\x24\x89\xea\xdf\x84\xe5\xd6\xde\xe3\xbd\x7a\xef\xbd\xd4\xe9\xde\xab\xd1\x07\x8d\xdc\xe3\xbd\x75\xef\xbd\xd4\x31\xde\x5b\xd1\x27\x7b\xe8\xbd\x8d\xd7\xee\xbd\x37\x73\x6a\xe3\xb5\xe8\x43\x3d\xd0\xf8\xfa\xfc\xf9\x99\x45\x7f\xba\x1d\x6d\xbb\x07\x6d\x7a\x90\x3a\xa1\x31\xb0\x60\x41\xe6\xd2\xff\xbb\x13\x6d\x36\xd1\xfa\x87\xb2\x6f\x35\x9e\x39\xe5\x94\xcc\xb5\xef\x3c\x88\x1e\x7b\x14\x3d\xf4\x44\x53\x3e\x60\xd9\xb7\xff\xb9\x94\xae\x21\x62\xc2\x0c\x5d\x8d\xce\x8f\x1e\x99\xbc\x30\xf7\x24\xfd\x65\x66\xe9\xaa\xab\xa6\x65\xfb\xfe\x77\xde\x0f\x99\xa5\x4f\xc2\x8f\x2e\x99\xbb\x6b\xf6\xb7\x99\x45\xcf\xdf\x05\x0e\x80\xc3\x85\xbf\xcf\xdb\x1c\xd3\xcd\x33\xb4\xc9\x2c\x5d\x37\xfb\x64\x30\x67\x42\x24\xe5\x74\x62\x4f\x19\x7a\x5f\x44\x83\xb5\x20\x76\x5a\x28\xaf\xdc\x86\xfb\x83\x5e\x42\xc8\x5c\x22\x86\xb2\xf7\x87\xf1\x38\x4e\xd0\x9b\x77\xc3\x3f\x41\x72\xfc\xd0\x4e\xdb\xf3\x99\x84\xbf\x65\xe3\xda\x7a\x4d\x3b\x60\x49\x22\x86\xd8\xd4\xa1\x17\x10\x71\x3f\x42\xaf\x3f\xfd\x13\x62\xfe\x04\xcd\xac\xf9\x4c\x9a\x87\xf6\x57\x13\xef\xb5\xa2\x5e\xc1\xbb\xef\x4c\xcd\xc7\x24\xed\x92\xdd\x2a\xc1\xa3\x35\x5a\x29\x94\x9f\xc1\xf7\xa8\x7d\x1e\x65\xe8\x27\x32\xf8\x3b\x33\xd6\x89\x2c\xbe\xcb\xd2\x8f\xb5\x26\xf6\x8b\xab\xed\xf1\xb8\x89\xb3\x9c\x95\x4b\x88\x79\xe8\x3e\x4d\x63\x5e\x2a\x0f\xcc\xc0\xd9\xb4\xa5\x58\x0f\x07\xf7\x9e\xff\x89\xd7\x74\x49\x2b\xb9\x50\xa0\xd7\xf5\x11\x38\x0b\xf2\x00\xbf\x9a\x5a\x6b\xc2\x1e\x59\x4f\x01\x32\xee\x2a\x47\xfc\xf7\x44\x13\xae\x07\x3d\x38\x03\x1c\xef\x79\x23\xa1\xd3\x62\x1f\x78\xfd\x0b\xc4\xde\x9a\x3e\x7f\xaf\xc2\x67\x73\xab\xae\x6a\x4d\xb3\x6b\xff\x2b\x41\x0b\xd1\x7c\xae\x7d\xf2\xb7\xe0\x51\x70\xe8\xe9\xaf\xce\xfb\x52\x81\xde\x7f\x4b\x1a\x2f\x18\x23\xe5\xc7\x7e\x88\xbb\xe6\xab\x2d\x7e\x1f\x64\xc0\xd2\x4f\xc0\xf8\x3b\xf2\x9d\x3f\x25\x64\x13\xb6\xe3\x57\xe1\xde\xae\xeb\xf7\x11\x71\x1e\x02\x37\x6b\x0f\x24\xec\x99\x18\xbe\xea\xab\x89\x35\xc5\xb2\xcc\xd5\x88\xf1\x89\xf7\xae\x13\x5a\xed\x2f\x83\x57\xc3\xd0\x4f\x04\x3e\x84\x35\x79\xbe\xbf\x0e\x42\x62\x5d\x0c\x2e\xf3\xb5\x64\xd8\xad\xb5\xa7\xa3\x2b\x48\xd0\xe9\xed\xf2\x35\x64\x57\xd8\x9d\xa1\x3d\xfc\xc0\x9e\x0e\x7c\x97\x3a\x78\x32\xa8\x9c\x1d\xe8\xd7\x23\xb2\xb9\x63\xc3\xf4\x4d\x1c\x24\xe8\xf5\x35\x6e\x0f\xec\xed\xea\xc8\x08\x63\x36\xb4\x7c\x05\x8e\x0c\x7b\xcc\x76\xea\x0e\x6e\x9b\x54\xaf\x53\xae\x63\x5a\x35\x7b\x78\x18\x71\x26\x55\x47\x2a\x1c\x42\x66\x05\x32\x12\x1a\x73\xed\xca\xb8\x06\xf3\x15\x54\x81\x55\x54\x31\x4d\x4a\xad\xd1\x45\x4d\xd3\x34\x4b\xd7\x35\x4d\x3d\x00\x24\x97\x56\x90\x04\x39\x8f\x0d\x3e\xd4\x3b\x8f\x7f\xef\x7b\xdf\xfb\xde\x4d\xe8\x1d\x78\x38\x5a\x7e\xcb\x23\x37\xee\xbb\xf4\x96\x5b\xbe\x81\xd6\xc3\xcb\xbe\x79\xe3\x8d\xd7\xee\xbb\xf1\x11\x38\x76\x13\x7a\x7b\xeb\xd6\x56\xfb\xb5\x7e\x67\x02\xff\x76\xac\x33\xce\x4e\xc8\x1d\xb3\x10\x72\xe0\x8a\xa4\xfd\x19\xf3\xff\xba\xff\x89\xed\x7d\x29\xc8\x53\xdf\xf6\x54\x82\x87\x06\x27\x8d\x9c\xec\xcb\xb5\xfe\x49\xec\x37\x92\x7d\xdf\x4d\x1f\xee\xf8\xbc\x4c\xf7\x4f\x26\x68\x56\x2f\x94\x1f\xfb\x46\x44\x89\xb1\x6e\xdb\x4b\x1b\xcc\xb5\x4f\xef\x00\x26\x00\xb3\x39\xb1\x49\xa7\x3e\xbf\xd4\x9a\xe7\xb4\x03\x77\x27\x68\xc8\x8e\xf8\x77\x8f\xdb\x92\x2f\xe8\x81\xbb\x12\xfc\x1e\xc9\x08\xba\x52\x48\xc4\x92\x7c\x5f\xf6\x7e\x90\x8c\x21\xc6\x36\x3a\xa6\x69\x7c\x27\x06\x1c\x82\x7b\x09\x38\xb8\x3e\x5f\x2e\x8c\xbf\x7c\x0a\xd7\x7d\xbd\x04\x5c\x8e\x2b\xcd\x47\x91\xdf\x1c\x76\x62\x63\x2b\xad\xdc\x5d\x6a\xef\xe9\x23\x4f\x10\xb2\xf8\xc4\x3f\xd9\x35\x8b\xce\x76\xcf\x85\x3e\xb1\xe1\x04\x80\x34\xad\xb6\x7d\x98\xba\xce\x5b\xe9\x7f\x3e\xe7\x32\x1c\xc5\x23\x8d\xc9\xc3\xba\xd3\xa8\xd8\xb0\xce\x30\xa8\x32\xc4\x41\xd3\x36\x14\xd3\x42\x75\x4d\xb3\x65\x13\x8a\x2c\x43\x31\x1e\xcf\x50\x5a\x5e\x35\x0c\xb3\x68\x19\x7c\x91\x41\x79\x11\x8d\x69\x83\x4e\x11\x0d\x52\x80\xf5\xc6\x9c\x71\xc7\x19\xc7\xff\xcb\xe6\x2c\x64\x58\xf0\x3d\x96\xe7\x3c\x83\xe5\x26\x81\x65\x41\xc0\xb1\x94\x25\x36\x34\x51\xd1\x54\x49\x91\x35\x51\xe7\x39\x51\x36\x14\x54\xb7\x58\x93\xe5\xb5\x8a\xa1\xca\x55\xc7\xd0\x32\xa3\x53\x69\x38\xd6\x35\x41\x6e\x46\x20\x07\x97\x24\x74\x47\x4c\xb3\xfd\xd1\x1d\x8a\x2f\x4f\x2e\xc8\xdd\x42\xcf\xf2\xe5\xe9\xdb\xa0\x90\xdb\xfd\x3a\x75\xd7\xe4\x44\x6c\xe7\x58\x85\xb2\x7b\x44\xd3\x17\x00\x87\x02\x15\xdf\x81\xd4\xa7\xd4\x95\x9d\x8b\x2b\x23\x9f\x03\x2e\x07\xff\x89\xbb\x47\xe3\x68\x58\x5c\x03\x36\xf5\xf7\x5c\x9c\x7d\x11\xff\x13\x32\x7e\x67\xae\x54\xee\xee\xec\x2d\xe5\x3a\xb2\xbd\x25\xfc\xc9\xf8\x3b\x1a\xdc\x1c\xc4\xd9\xf3\xd3\xcb\x59\xdf\x4f\xa8\x53\x35\x4f\xb4\xa1\x8b\xd4\xe8\x43\x0d\x51\x23\x1e\x67\x07\xcd\x04\x83\x4f\x85\x2d\x52\xc3\x9e\x48\xa9\xd8\x55\x70\xa9\xd1\x03\xae\x2b\xca\x0a\x04\xba\x55\x84\x26\x53\x14\x11\x57\x0c\xca\xa0\x22\x86\xa9\x66\x55\xb3\x5a\x87\xa2\x80\x64\x54\x41\x86\x37\xa6\x40\x17\xf2\x83\xb0\x36\x6c\x79\x82\x4b\xeb\xde\x10\xb4\xc5\x11\x71\x44\x84\x4e\xfc\xc7\x0a\x2f\xa8\x92\x26\x69\x92\xca\x42\x55\xe4\xcd\x6a\x8d\xe3\x59\x76\x4c\xe2\xd8\xaa\x24\x55\x25\x09\x8d\x18\xba\x2a\xb2\x8c\xcd\xca\x0a\x67\xb3\x9c\xc8\x70\x82\x40\xf8\x54\x71\x6c\x79\xc5\x3b\xb1\xce\x8d\xf6\x0f\xc3\xfb\x3d\x82\xcf\x70\x6c\x36\xd0\x05\xcf\x7c\x2c\xa1\xdf\x7c\x19\x72\x7a\x82\x9f\xe4\x66\x2c\xa1\x0a\x0a\xf4\xce\xdf\xe5\x53\x3a\x62\xc0\x9d\x62\x5b\x58\x4d\xfa\x58\x13\xd5\xef\x50\xb1\x6c\x71\x0a\xa1\x6d\xb0\xb3\x1c\xdb\x70\xbe\x7e\x56\x99\xa5\xbb\xef\xa0\xc1\xec\x7f\xfa\x12\x64\xf5\x15\x84\x3c\xb2\x7c\x59\xb1\x02\xe7\x26\xf7\x37\xe2\x77\xf0\x09\x7b\xe7\xfc\x84\x6f\x2b\x15\xca\x03\xa7\xf8\xfa\x66\x15\xbe\x91\xd0\x3f\x41\xd8\x48\xbe\x2d\x77\x21\xc6\x53\x90\x0f\x01\xf1\xfa\x34\x9a\xc7\x39\x10\xa5\x8e\xb6\x6c\x27\x6e\xf2\x83\x2f\x5b\x1c\xde\xac\xdb\xd9\x0e\x60\x37\x96\x12\xe5\xee\x99\xd9\x63\x67\x96\xa0\x9c\xad\xa2\x2a\x1a\x73\x28\x41\x17\xab\xaa\x88\xf2\xaa\x5d\x71\x58\xb7\x22\x72\x68\xc4\x1b\xd6\x28\x01\x32\x1e\x9b\x91\x87\x47\x74\xc8\x41\x50\x9f\xd0\x68\xde\x1e\x31\x14\x9b\x41\xc3\x26\x3f\x38\xdc\xa8\x19\x2a\x5b\xe1\x38\x81\x1a\x44\x3e\x08\x4a\x70\xd0\x51\x25\xd3\xd4\xec\xb0\xb7\x3e\x96\x6d\x9b\x71\xfc\x7c\xcd\xe2\x78\x2f\x22\x1f\x0a\xfb\xfa\xc1\x7d\x39\xd0\x86\x6d\x30\x89\x56\xc1\x71\xe0\x74\x70\x1e\xf8\x4c\x74\x6f\x34\xaa\x6a\x4b\xb4\x2f\xed\xc2\x94\x1f\xac\x23\xbc\x16\x9a\xea\x1f\x0b\xa3\xba\xb7\xc1\x23\xbe\x7f\x1a\x1c\x92\xc9\x59\xa9\x5a\xa7\x64\x49\xb3\x24\x0e\x89\xb2\xa5\x2a\x45\x4d\x13\x38\x34\x84\x38\x0d\x3a\x30\xef\xd9\xd4\xb0\xa2\x59\x86\x3a\xea\x4e\x54\xb3\x43\xba\x21\xc8\x9c\x2e\x28\x13\xc0\x86\x26\x2f\xa8\x43\x86\xc1\x0b\x14\x23\x8a\x6a\xcd\xd5\x44\xd1\x63\x6c\x38\x8c\x78\x5a\xb5\x75\xcd\x32\x4c\x59\x96\x6b\xaa\xcc\xda\x9c\x58\x19\x35\x2d\xc5\xb4\x05\x41\x91\x64\x59\xf1\xf2\x1e\xaf\xaa\x8c\xc3\xc8\x54\xd1\x03\x19\x1b\x09\x6c\x51\xd7\x2d\x45\xe0\x79\x4e\xd5\x1c\x43\x14\x90\x6b\x39\x01\x6e\x16\xe4\xfa\xe9\x3b\x23\xdc\xec\x5b\x32\x77\x22\xa6\x5f\x2c\xaf\xf6\x3d\x9b\xc0\x25\x8f\xe1\x5a\xa1\xbc\xa3\x0e\x40\x21\xf7\xe4\xa7\x50\x40\x0f\x46\xe8\xbf\xe3\xde\xe9\xb9\x52\x47\x29\x4a\x3d\x3d\x16\x52\xb0\x1b\xf7\x97\xe9\x9b\x86\x7b\xa7\x53\xaa\xab\xb6\xc9\x9e\xc1\x66\x80\xc7\x0d\x53\x8a\xea\x0d\x4d\x02\xdd\x93\x54\xca\x55\x3d\x91\x1a\x63\xf3\xc8\xd4\x6d\x0b\xb2\xb4\xc1\x8f\x39\xe3\x35\x07\x71\x95\x6a\x0d\xd6\x91\x8e\xc6\x1c\x98\x87\x96\x33\x08\xc1\x90\xad\x05\xfd\x11\x9d\xe8\xbe\xcc\x4e\xec\x6f\xf6\x1f\x48\xfb\x0e\xfb\xbf\x82\x7b\xef\x0d\xc6\xfc\xa4\x04\x67\x4d\x6b\xce\xc3\x36\x02\xae\xf3\x03\x32\xf8\x1c\xd7\xa0\x2d\x5c\x6f\xfe\xb4\x70\x0d\x61\xef\x71\xd8\x5d\xf8\x18\xcc\x75\x83\x5c\x09\xab\xac\x4e\x3a\x3e\x5a\xc1\x67\xe1\x74\x36\x30\x98\xfa\x66\xe2\x9b\xc3\x94\x5b\x91\xa9\x31\x45\xa5\xe4\x03\x16\x1a\x77\xea\xb6\x0c\x2d\x85\xaa\xe9\x92\xa7\xe9\x70\x89\xc3\xb0\x54\x05\x59\x79\x86\x62\x10\x67\x43\x4d\x46\x76\x55\x45\xbc\x02\xab\x32\x92\xe1\x28\x93\x1f\x93\x55\xbd\x42\x5b\xbc\x61\x98\x9a\x83\x04\x64\x21\x5b\x87\x45\xa8\x52\xac\x6a\x43\x50\xd7\x34\x73\x94\x15\x05\xdb\xd4\x1d\x34\xae\xba\x06\x14\xc6\x07\x2d\x77\xd4\xd1\x2c\x5d\x36\xec\xf0\x6c\x12\xdf\x85\xdd\x73\x1d\xf6\xd9\x87\xb0\x94\xf9\x26\x5e\x7b\xf3\xfe\x08\x8e\x0d\xee\x8d\x6a\x0d\x2a\x51\xae\x0e\xfe\x0d\xfd\xdc\xcb\x31\x3c\x8a\xab\x5e\x87\xef\x8d\x6e\xca\x47\xf0\x30\x26\x19\x8c\xb3\x1d\x4e\x19\x07\xc3\xd7\x5f\xdd\x1a\xbe\xb5\x08\x9a\xe3\x04\xb1\x02\x0c\xdf\x73\x03\xf1\x5e\x62\x9e\xeb\xc7\x62\xb8\x9c\xd3\x9b\xcf\xaf\x7b\xb2\xf5\xf3\x9b\xee\x8f\xf9\x3e\xb4\x13\x57\xe2\xbb\x51\x2b\xfe\x8c\xf7\x9a\xc2\xcf\x6b\x34\x1b\x74\xec\x9d\x56\xea\x28\x51\xe4\x11\x19\x08\xf2\x79\x1d\x7a\xb8\xa1\x38\xd5\x36\xd9\x6d\xc8\xae\x69\x19\xd0\x82\xbc\x67\xc1\xd1\x4c\xb5\x21\xd3\xac\x83\x86\x86\x27\x86\x6d\x27\xa3\xdb\xba\x09\x79\x8a\x3d\x50\xa7\x74\x10\xf6\xbc\x8b\x73\x26\x0b\xf4\xae\x28\x7e\xb8\x6b\x52\xca\xf1\xd8\xf7\xbd\xf5\x5a\x9f\xcf\xfe\x1a\xc7\x77\x7c\xff\x8b\xf1\xe1\x78\xa7\x2e\x4f\xe8\x0f\xbe\x50\xae\xe2\x48\xea\x9a\x73\x09\x38\x1e\x3f\x80\xef\x6b\xd6\x1d\x95\x72\x95\xec\x78\xa1\xbc\x03\x4b\xef\x81\xeb\x63\xb8\x1a\xe4\xa2\x07\xf0\x9d\x2b\xe3\x71\xa2\x1e\x90\x27\x61\x9f\xf3\x92\x18\x6e\xe5\x1c\x3a\x1f\x8d\xbf\xf3\xdb\xf1\x38\x56\xe0\xaf\x05\xe3\xac\xf9\x54\x3c\x7f\x9f\x16\xf2\x85\xf2\x73\x18\xbe\xeb\x56\x62\x5d\x01\x5f\xbe\x86\xf7\xfc\x55\x62\x9e\x9a\xef\x53\x05\xe3\xb8\x0a\xb1\x57\x46\x73\xbd\xcf\xcd\x22\xc6\xc7\x7b\xe8\x8f\x40\xe4\x97\x49\xd1\xd9\xff\x73\xbf\x4d\xbc\x57\x98\x5c\x90\x1b\xa0\xbf\x58\x28\xaf\xbe\x18\x00\x66\xd1\xfe\xc5\x60\xf7\xe4\xc4\x69\x7f\x16\x41\x5c\x5f\xc7\x97\x69\xf8\xfe\xd4\x9a\x73\x08\x9c\xe2\x58\x70\xf0\xee\xe7\xef\x26\xe0\x41\x6e\xd8\xe3\xb8\xd6\xed\x25\xc4\x9c\x82\x73\xec\xef\x60\x7d\xf2\x6a\x2c\x5b\xc4\x20\x2e\xb1\x06\xdf\xd7\xee\x7f\x8f\x98\x2b\xf6\x3f\x06\x6e\x4a\xd0\x84\x84\xe3\x06\x72\xb0\xb6\x02\xbd\xa7\x18\xaf\x41\x0a\xce\xb7\xf1\x3c\xcb\xcf\x32\x78\xb4\x71\x62\x4e\xbe\x0e\xbf\x30\xb5\x6f\x21\x4f\x06\x6b\xd8\xda\xac\x4d\x28\x07\xbe\xe7\x36\x5f\xb7\xd3\x3b\xd4\x04\xfe\xf8\x42\x79\x67\x23\x81\x3f\x11\xdb\x0e\x5c\x4c\x47\x9b\x08\x3a\xc2\xb8\x08\xe0\x7b\xfe\x9b\xc0\x45\xc5\xdf\xcf\x80\x7e\xf7\xac\x49\xd0\x2f\x17\xcd\x67\xcf\x2f\x89\xf1\xf1\x3c\x83\x71\xb6\xdf\x92\xb6\x97\x82\xe7\x57\x2b\x31\x2e\xc4\xe0\x6c\x7d\x00\xcb\xa6\x7d\x37\xc7\xcf\x87\xb1\x91\x90\x5e\x5e\x89\xe1\x4a\x98\xef\x78\x4d\x6a\xcf\xf8\x60\x9e\x01\x1d\xad\x21\xeb\xcd\x60\x1f\x70\x07\x8e\xf7\x6f\x6d\xd6\xe4\x13\x82\xde\x4d\x55\x1c\x7b\x7a\xf6\x7a\x62\x6f\xb0\x4c\xc4\xf4\x45\x0f\x2c\x23\xf0\x59\x09\xf8\x3b\xb8\x63\x9f\xe0\xd7\x78\x5d\xfb\x4f\x23\xf8\xac\xe2\xe3\x7f\xef\x57\xa7\xf0\x9f\xdd\xe4\xbf\xf5\x8f\x27\xde\x9b\x8f\x68\x77\xeb\xc5\xf1\xf3\xe1\xbd\x87\x70\xdf\x2f\x8b\xe1\x5a\x93\x1e\x0a\xb4\x53\x27\xd6\xeb\x34\xf1\xbf\xf5\x98\x34\x9f\xed\x78\x0c\xd3\xc9\xe3\xc4\x7e\xd9\xcd\xe7\x77\x9e\x43\xcc\x07\xc3\x57\x9e\x9f\xd8\x17\x21\x5a\x6f\x80\x9f\x15\x47\x12\xfb\x88\xf3\xf8\x02\xf8\x9e\x5f\x25\xe4\x4d\x3c\xff\xb5\x7f\x21\xe4\x0d\x1e\x27\x94\x37\x12\x41\xcf\x83\xcd\xf9\xc4\x39\x33\x6a\x54\x23\x20\xe0\xbd\x15\xff\x99\xe0\xed\x78\xfc\xfe\x7f\x25\xf6\x85\x2b\x94\xf7\xee\x4f\xe0\x5f\x8c\x6c\xc5\x6d\x1b\x13\xfc\x22\xe0\xda\x01\x66\xa1\xbc\x6b\x6e\x62\xbd\x18\x3f\xbe\xdc\xdd\xdb\x48\xf1\x57\x88\xe7\x80\xde\x9e\xbb\x34\xad\x93\x42\xb9\xbe\x88\x98\x8f\x18\xd1\x49\x81\x5e\x8f\x08\xb8\xd1\xa4\x9f\x9d\x8b\xe2\xf9\x84\x67\xf9\xa1\x2c\x5b\x48\x8c\x6f\x37\xc7\x77\x8e\x4e\xcc\x87\x8b\xf8\x74\xfb\xe7\x09\xbc\x05\x35\x14\x70\x4f\xd0\x35\x67\xc7\xe3\x18\x41\x5c\x21\xc4\xdb\xbb\xc4\xfe\x0a\x74\x31\x78\x6f\x81\x7e\xf6\x2b\xc4\xbe\x10\x74\xb2\xeb\xc4\x84\x7e\xd3\xa3\xf7\x6e\x5d\x42\xac\x4b\x21\xe8\xb6\x89\x7f\x3d\xd0\x63\xee\x8d\x38\x2f\xbb\x89\x4f\x3b\xbc\xe3\x8a\xf9\xab\xb2\x96\x98\x0f\xde\xdf\x6d\x17\x4e\xd9\x97\xa0\xaf\xe4\x77\xb1\x1c\xf8\x4c\xfc\xbc\x41\xf2\x6f\x9c\xfb\xf4\xf0\xe4\x21\xb9\x2f\xd1\x67\xfb\xfb\x35\x77\x53\x81\xde\xfe\xf7\x97\xbe\x15\x8f\x8f\x7b\x2e\x87\x7c\x77\x2a\x31\x3e\xc1\x47\x2b\x3a\x13\x74\xe5\xcf\xe7\x27\x09\xba\x0a\xf0\x60\x45\x78\xd8\xbb\x89\x98\x3f\xa6\xab\x7d\x38\x4e\x43\xc8\x37\x89\xc4\x7f\xdc\x77\x53\x8e\x72\x8a\x02\x78\x65\x0f\xc1\x5f\x46\x53\x67\xec\x08\xa4\x3d\x1f\x7e\xa7\x04\xb2\x3e\x58\xc3\xb6\x06\xf1\x0e\xd5\xf7\x69\x83\xb1\xf6\xde\x47\xd0\xca\xeb\x4d\x5c\x6f\x3b\xec\x38\x92\xe7\x85\x42\x79\xfb\xa1\x09\x5c\x4b\xd1\x39\xd1\x8e\x9b\x13\xfa\x50\xc4\x73\xd2\x0a\xe5\x6d\x83\x89\xbd\x94\xa3\xbe\x78\xc1\x7b\x77\xed\x8d\xd7\xc0\x93\xfa\x79\xfb\x49\xf1\xf3\x3c\xc9\x33\xdb\x46\x09\x99\xab\xf8\x32\x71\x27\x9f\xd0\xab\x42\x54\xe7\xc3\xdf\xe3\x42\xb3\xce\x87\x10\xe9\xc8\x80\x76\x63\xbb\xd5\xc0\x3a\xcf\x2a\x94\x57\x5f\xe4\xfb\xd1\xdb\x7f\x3f\xda\x94\xad\x76\xd3\xd6\x1a\xb8\x95\x98\xbf\xdc\xdc\x9b\x01\x8b\xd8\x1b\xec\x1b\x85\x3a\x6f\x27\xb1\xc7\x15\x5f\xcf\xaf\xbe\x08\xd3\xee\x9b\x04\xaf\x12\x7b\xbc\xf7\x49\x62\x7c\xbb\x29\x0b\x56\x7e\x3f\x41\xeb\x31\x2d\xae\x8d\xfc\xf7\x93\xe3\xfb\xdf\xb7\xfe\xa1\x5e\xa0\xd7\x2d\x49\xc8\xdc\x18\x9f\x9b\xaf\x6b\x6d\x53\xad\x60\x08\xfc\xc7\x74\x52\xa0\xab\x9f\x4e\xc8\x20\x31\x9a\xcf\xc0\x33\x69\x5a\x0f\x65\xd9\x59\x84\x4c\xc1\xb1\x8c\x15\x0f\x26\x64\x4a\xcc\x93\x01\xcf\xec\xbd\x37\x31\x1f\xb3\x50\xde\x3a\x94\xb0\x15\x25\x4c\x0f\x7c\x2c\x3b\xbe\x1b\x8f\x63\x06\x78\x5e\xf1\x5a\x42\xe6\xca\x91\xdd\x34\x30\x32\xc5\x36\x22\x6c\xe9\xed\xd7\xa7\x65\x5f\xa8\x33\x9a\x75\xcc\xc2\xfc\xa3\x90\xe7\xf9\x04\x1e\xd4\x78\xdf\xbf\x95\xd6\x85\xeb\xae\xc0\xf9\x79\x17\xb5\xd6\x3d\x7b\xae\x24\xe0\x0b\x69\x83\xb9\x76\xe3\x25\x99\x1b\x00\x38\xeb\x45\x31\xb4\x54\xe2\x3a\x7e\xbe\x5e\x5d\x9b\xe2\x19\x5f\xde\xc7\xef\x5e\x3d\x1e\xc3\xe7\xe7\x1e\xa4\x4d\x66\x69\xf5\x92\x36\x30\xe7\xc3\x22\x60\x16\xae\xa8\x77\x4d\xcc\x3d\x5e\x3c\x89\xa0\x3d\x23\xa0\x3d\xa6\x5c\xc5\x99\x39\xdb\x17\xc4\x32\xa9\xd6\xd4\x09\x6b\x16\x24\xf6\x4f\x2c\x94\x57\xb0\x53\xf6\x4f\xc3\xb2\x07\xe7\xa7\xc5\x32\x55\xc6\x75\x8a\x62\x5b\x63\xed\x10\xa1\x43\x48\x5d\x37\xbf\xb5\x6e\xdf\xb2\x2c\x41\x4f\x56\xbc\x4f\xd8\x67\x07\x74\x58\x3f\xc1\x8c\xf3\x1c\xf1\xed\xd7\xe0\x66\x72\xd8\xd1\x3f\x38\xbf\x28\x77\xe3\x14\x65\x22\xd9\xb1\xab\x37\x3a\xce\x68\xc7\xd7\x00\xe3\x43\xdb\x72\x77\x89\xce\x4d\x2b\xf5\x96\x86\x20\xe7\x64\x8a\x0e\x4e\xc6\x57\x90\x56\x85\x40\x36\xf5\xc6\x98\x9a\xd1\x5d\x8f\x71\x0c\x4b\x85\xbc\x55\xd7\x0c\x15\x72\x2e\x12\xa1\x85\x46\x60\x2d\x53\x6c\x8c\xc5\x1f\x5d\x57\xbc\x41\x59\xaf\x50\x75\x8f\x09\x8e\x38\x6c\x6f\xd8\xb6\x24\x97\x17\x05\x1d\x71\xa2\x08\x79\x45\x34\x1c\x97\x17\x79\x53\xb7\x6c\x8a\xd7\x82\xec\x47\x15\xa9\x92\xa6\xca\x5e\x3d\xbc\x87\xf2\x99\xc8\xae\xdf\xf2\xcb\x40\x0f\x7c\xbc\x25\x8f\xad\xdb\x96\xd6\x7b\x2b\x71\xfd\x8e\x98\xe6\x04\x7c\x76\x24\x14\xca\x03\x33\x13\x32\x3a\xd8\xd3\xf8\x7e\xf3\x1a\x7c\x37\xb3\xff\x9f\xf1\xbe\x06\x67\x86\x83\x89\x7d\x8d\x75\x53\x20\x47\xd7\xbe\x95\x90\xbb\xb1\x2d\xbd\x2f\x17\x3f\x1f\xd6\xef\x0c\xe4\xc7\x9a\xbb\xc2\xfd\x93\x26\x2f\xcc\xad\xa0\x0d\xf0\x61\xf0\x09\x7c\x62\x85\xbb\x6e\xc1\x9e\x0e\x7c\x75\xa2\xb7\xa7\xbd\x94\xf3\x37\x8c\x0c\x1b\x96\xb2\xed\xd1\xbd\x02\x58\xea\xe8\xa2\x70\x4e\x0b\xde\xd3\xc2\x34\xdc\xc5\x37\xc3\x3b\xf8\xe6\x84\x33\x51\x6f\x6b\x5b\xf6\xb5\xb3\x6f\xfa\xd4\xfc\x23\xe6\xcf\x9f\xfe\x89\xc6\x6f\xa8\x7b\xd0\x15\x5f\xfe\x32\xec\x44\x7f\x6a\x18\x94\x59\x17\x14\xa8\xa0\x51\x87\x17\xf4\x21\x6d\x1c\x0a\xb6\x4d\x33\x63\x50\x46\xd5\x31\x64\x3d\xdc\xdf\x78\x68\xd9\x39\xf9\x47\xf2\x9f\x9c\x91\xb9\xe8\x4d\xc4\x5d\x4a\x9d\x8a\x2a\x6f\x66\x7e\xe4\x4c\x82\xd1\x46\xad\x9a\x29\xaa\xaa\x0e\x15\x58\x9d\x30\xa8\x62\x8c\x0f\x22\xe7\x8a\xb0\x79\xe5\xc0\x1f\xdc\x83\x7b\x5e\xaf\xbe\x98\x90\xbf\x76\x53\xfe\xae\xba\x34\x2d\x37\x83\xd8\x5a\x2c\xa7\x62\x79\x1d\xe2\x7b\x34\x01\x8f\x6d\xea\xfd\xcd\x9a\x98\x66\xee\x16\xda\x60\x96\x6e\x59\x71\x1b\x38\xfd\x3a\xf1\x7d\xec\x87\x2d\x6e\x42\x17\xc5\x3a\x64\xef\xf6\xc4\x9c\x62\x1f\x78\xdd\x6f\x08\x78\xad\x49\x7f\x5b\xda\xd3\xf4\x17\x8c\xb3\xe9\xe3\x04\x0d\x10\x3a\x67\xcb\x23\xc4\xf3\x86\x4f\x33\xeb\xff\x96\xf2\xe3\x12\xf3\xdc\xf0\xd3\xf8\x79\x2e\xac\x81\xb5\x31\x81\x53\x39\xea\x5f\x1e\xce\x87\x26\x70\x54\x89\x64\x76\x81\xde\xc4\x12\x74\xaf\xe3\xde\xef\x1b\xb0\x0c\x3a\x23\xf1\xbc\xbf\xde\x1b\x52\x7b\x16\xe6\x04\x04\xf3\x5f\x79\x05\xf1\x5e\x82\x0f\x57\x1e\x46\xcc\xdf\x6a\xea\x96\x4d\xdf\x23\xe0\x66\xd3\xb6\xda\x43\xd6\xa5\xaf\x34\x75\xe0\x26\x23\xe6\x29\x21\xa7\x61\xff\x22\xb0\x0f\xd7\x10\xb4\x45\xf0\xe0\xc6\x6f\x25\xd6\x15\xfb\x3b\xfd\xff\x97\x98\x67\x3c\x9f\x95\x42\xc2\xd6\x88\xe7\xb3\x4f\x49\xd8\xc3\x7a\x6c\x73\xe5\x13\xbc\x1f\xdb\x93\x1b\xf1\xed\x99\x6d\xaf\x10\x7b\xcf\x16\xca\x9b\xf7\xa7\xf6\x52\x20\x6d\xd3\xcd\x1f\x4f\xf8\x84\x72\xb4\x86\x4d\xe7\x27\x70\xe7\xe3\xf4\xd2\x94\x0f\x66\x84\x70\xec\x7b\x3f\xd3\x47\xc8\x9d\xa0\x8f\x1d\x96\x3b\x9b\x67\x26\x68\x2b\xde\xb3\x4d\xab\x12\xef\xf5\xc7\xd9\x97\xe2\x57\x8b\xa4\xd1\x8d\x13\xc4\xf8\x4e\x64\xf7\x32\xf4\xe6\x37\xd2\xb8\x08\xec\xb7\xcd\x51\x4d\x55\x25\x8a\x85\xef\xba\x95\xf1\xed\xb4\xc8\x37\xbb\x70\xf2\xf2\xdc\xfd\xf4\xe5\xfe\xfc\x3b\x0e\x29\xd0\x7b\x0e\xff\x56\x07\x61\x4f\xc6\x34\xb4\xf1\x55\xc2\x77\x32\x9b\x34\xe1\xbe\xd9\xca\x0e\x64\x68\xf7\x1b\x09\xbc\xc5\xf6\xf3\xc6\x27\x48\x5f\xd4\xdf\xe3\xa7\x7f\x9f\xf2\x9d\xa4\xe0\x5e\x44\x80\x37\xf7\x25\x82\x16\x71\x7e\xc3\x93\xf3\x53\x3e\x52\x18\xaf\xad\xcc\x01\x20\xc8\xfe\x0a\xac\x9a\xb8\x6e\x7f\x2c\x3f\xf6\x45\x79\x56\x9f\x9e\x94\xf0\x99\xf6\xd2\x7d\x37\x1f\x05\xe6\xac\x17\x01\xb3\x68\xf7\x37\xc0\x2b\x00\xcc\xbe\x50\x6c\xfa\x4b\x6a\xa1\xec\xfe\x39\xa1\x63\xa4\xe8\x0e\x46\x80\xf3\x0d\x9f\x6b\xcd\x87\xee\x68\x62\xaf\x63\x5f\x66\xe3\xa2\xf4\x5e\x3f\x73\x35\x9e\xed\xc5\xc4\xda\xdd\xa6\xdf\xb5\xe1\xfe\x84\xff\xa6\x44\x34\xb6\x6e\x61\xa8\xab\x34\x6c\xfb\x09\xf8\x64\xb5\x0c\x8e\x07\x73\xc0\x19\xcd\x4a\x96\xa5\x30\x3b\x02\x06\x7a\x29\x61\x6c\xf4\xcd\xec\x7a\x1f\xf0\x30\xad\x4f\x8c\x73\x62\x66\x6c\x42\xb2\x5c\x1d\xca\x43\x48\x86\xc3\x19\xb3\x61\x42\x2b\x23\x21\x41\x82\x63\x2e\xaa\x3a\x3c\xaf\xd7\xd4\x31\xc8\xfb\x0a\x6a\x42\x0a\xbe\x18\x75\x52\x5f\xd0\x82\x2d\x8a\x48\x80\xac\x2a\x59\xe6\x10\x92\x2a\x48\xb2\x1d\xcf\x51\x55\xa8\x8b\x82\x51\x1d\xf5\xea\x63\x70\x30\x0d\x09\x71\xa1\x91\xb8\xde\xbe\x2d\x21\x33\xf4\x42\x79\x8d\x98\xd2\x47\x32\xb9\x07\x71\x4e\x5d\xac\x8f\x02\xf8\xc0\x3f\x88\xbd\xac\x34\xf9\x73\xeb\x47\x08\x59\x85\xf3\x29\xd6\xcc\xf3\x65\x49\x05\x77\xaf\xa9\x2c\x0c\xf7\x21\xe2\x09\xbc\x0f\x7b\xb6\x24\xe4\xa4\x58\x28\x6f\x58\x96\xa0\x65\x71\x52\xcd\x0d\xe1\x5c\x8e\x3b\xb9\x24\xcd\xfa\x72\x52\x8b\xe5\x76\xb3\xff\x44\x58\x33\x24\x8c\x93\x5c\x48\xd0\xcb\x70\x14\x3f\x29\xd0\xfb\x97\x68\xcd\x71\x48\x1f\xf1\x5a\x82\x8e\xd6\xc7\x3e\xd3\xc2\x75\x8b\x66\x82\xb9\x5b\xc4\x26\xbf\x10\x7e\xd9\xca\xbe\x34\x4d\x06\xf0\xd5\x9b\xa7\xf8\x1d\xb8\x56\x49\x7f\xd4\xcb\xa4\x3c\x79\x6e\x6e\x07\x7d\x3b\xb3\xd4\x59\x76\x64\x76\xee\x3f\xe7\xbd\xce\x2c\xac\x5e\x32\x72\xc8\xbc\x6e\x91\xc4\x89\x19\xe2\x2a\xcc\x61\xea\xff\x47\xfc\xae\x66\xcc\x98\x76\x48\x7d\x8f\xfb\x2c\xaf\xbd\x35\x25\xab\x43\x1f\x2d\xf4\x27\xb6\x10\xcf\x63\xf8\xea\xad\x58\xee\xb3\x91\x75\x19\xc7\x0e\xa3\xf7\xd3\xab\x07\x12\x76\x9f\x55\x28\x6f\xff\x5c\x4a\xce\x9e\x95\x73\xe9\xc7\x43\xdf\xe3\x5a\xfb\x0f\xd4\x27\x41\xae\x67\xaf\xf8\x68\x01\x6b\x92\x58\x96\xb9\x4d\x59\xb6\x3a\xd2\x63\xe7\x07\x79\x63\xbe\x5f\x93\x05\xb3\xbe\x87\xf3\x0e\xef\x6c\xed\x37\xaf\xdd\x9f\xb0\x25\xac\x42\x79\xeb\xaf\x31\x66\xfe\x9e\xf0\x3b\xe3\x79\xaf\xec\x4d\xfb\x6d\x21\xce\xd6\x25\x6c\x83\x90\xee\x0b\xe5\xe7\x7f\x8a\x23\xa8\xd7\x12\x7b\x67\x16\xca\x95\xa7\x08\x3b\xba\x4e\xf0\x85\x14\x8d\xd7\xff\x37\x2c\x53\x3e\x84\x69\xea\x9b\xd8\xfe\xfd\x38\x38\x3a\xae\x4b\x15\xd4\x3c\x21\xac\xe0\x6c\x67\xee\x08\xa2\xa6\x49\xb6\xdc\x4d\xe7\xb2\xed\xe4\x29\x74\x07\x4e\x92\xe9\xed\x6a\x6f\x16\xfd\xe9\xe9\xe8\xc1\x97\x41\x82\x23\xac\xae\x83\x19\xc9\xf0\x4f\x0e\x3f\x0e\x25\xd1\xb6\x3c\x47\x33\x35\x68\xc3\x9a\xae\x6b\x4a\x06\xa8\x2a\xc7\x17\x25\x96\xaf\x58\x55\xcb\x75\x1c\xd7\x85\x5c\xd5\xaa\xbc\xb7\x9e\xb2\xd0\x98\x20\x41\xc5\x76\x6c\x9e\xd3\x5c\x75\x18\xb2\x8e\xd3\xb4\x9d\xf3\xbc\x58\x93\x4d\x56\x90\x25\x41\xd0\x06\x75\x51\xd5\x84\x11\xaf\x22\xcb\x8c\x99\x17\x8d\xf1\xf1\xf1\x71\x54\xa3\xc6\xd1\xb0\xeb\xff\xaf\x4d\x74\xd0\xd8\x50\x43\x97\x07\x33\x8c\x2e\x9a\x90\x85\x23\x13\x3a\xc5\x36\x69\x1a\xcb\x92\xed\xbf\x9a\xe2\x7b\xd8\x4d\xbb\x67\xf5\x34\x62\x6f\x70\x0d\xd4\xb5\xdf\x4e\xc4\xcb\x82\xe7\x63\xfe\xef\xff\x6b\x4c\x13\x72\x60\x1b\x84\x76\xad\x45\xc8\x05\x9c\xaf\x18\xca\xb6\x37\x12\xfe\x93\x1c\xd9\x3d\x41\xee\x5d\xff\x5f\x62\xba\xdb\x11\xfb\xe0\x8b\xd6\xec\x84\x1b\x26\xeb\x3d\x9f\x12\x9b\x3e\x94\x1e\xd1\x58\x9c\xe3\xe7\xef\xfd\xd5\x91\x6c\x28\xe4\x56\x76\x51\xab\x09\xd9\x10\xd3\x4a\x9c\x17\x19\xd4\x44\x8f\x69\x72\xfd\x8b\x09\x1f\x23\x86\xef\x7d\x23\x61\x13\xc5\x36\xcb\x8a\x42\x42\x46\xeb\x85\xb2\x7b\xed\x14\xff\xd0\x6e\xc6\x36\xf6\x8c\x24\x64\xb7\x5c\x28\xef\x0a\x72\x46\xde\x21\x9e\x57\x7c\x3c\x61\xdb\xa7\xfc\xcc\x1f\x7c\xac\x3f\xb5\x22\xe9\x03\x04\x7e\xc9\xda\xef\x24\x7c\x8c\x78\xae\x03\x0f\xa6\xfd\x9b\x40\xb6\xae\xbd\xa9\xf5\xf3\xeb\xbf\x9e\xe0\xc3\xb8\x5e\x29\x96\x22\x74\xff\xdb\xe1\x77\x17\xe7\x36\xd3\x4f\x85\xbf\x59\xb8\xf7\xe4\xeb\x0f\x9b\xf5\xab\x79\x3f\x89\x7f\x17\xf4\x56\xad\xa6\xd6\xae\xe5\x2a\xfe\xfe\xed\xdc\xe3\xaf\x65\x53\x35\xa2\x20\x52\xb6\x06\xef\x0a\x76\xb1\xff\xcf\x21\xcf\x4b\x41\xec\xe5\xf1\x17\xc1\x48\xa1\x5c\x59\x08\xc6\x0a\xb4\x3b\x9d\xb0\x2f\xc4\x42\x79\xcf\xd1\x89\xd8\x67\x60\xbf\xc4\xf4\xb5\xa2\x2f\x01\xd7\x23\x1c\x3c\x73\x41\x1a\x07\x2b\xe7\x80\x64\x6c\x55\xf2\x65\x47\xa8\x77\x16\x39\xbf\x00\x2f\x00\x30\xeb\xb8\xb0\x2e\xab\x16\xdc\x8f\xdd\xf3\x73\x3c\xdb\x3f\xa5\x65\x78\xa8\x77\xc8\x78\x20\xa1\xa7\xd6\xff\x91\xe0\x05\xb7\x49\x13\x03\xf7\xa4\xe5\x63\x80\xf9\x95\xb3\x63\xbb\x37\xd4\xe7\xab\x5e\xc6\x7e\xfe\xbc\xc4\x1a\xf4\x42\xf9\x99\x73\x53\x7a\x20\xcc\xa9\xda\xb3\x04\x24\x63\xf4\x62\x90\xa3\xb8\x66\x56\xca\xfe\x14\x03\xde\xdc\x93\xa6\x5d\x2d\xbc\x9b\x73\x65\x22\xce\x26\xe0\xbb\x02\xf1\xba\x56\x7f\x26\x9e\x67\xa8\x97\x57\xe1\x33\xee\xfe\xb1\xc4\x1e\xc8\x31\x1e\x76\xb4\xd6\xd7\x4e\xe4\x83\xcd\x9c\x14\xfc\x3d\x60\xae\xdd\x73\x28\x35\x0d\x80\xd3\x66\x8b\x80\x59\xba\xfa\xa2\x2c\x38\xed\x87\xbe\x9d\xbb\xf7\x67\x54\x19\x80\x93\xcf\x14\x23\x3e\xc5\xfa\xe1\xa9\xc7\x53\x73\x0c\x7b\x9e\x6c\x38\x8c\xa0\xe5\x3f\xc6\xbc\x87\xdf\x6b\x1d\x9d\x88\x63\x8b\x71\x2d\xd6\x67\x5a\xc7\x65\x42\x59\xf7\x87\x84\xec\x88\x69\xae\xff\xf7\x80\x94\xb1\x56\x2c\x9b\x8e\x48\xac\x97\x2f\x94\xdd\xe3\x13\x78\x56\xb1\x0c\x54\x0a\xe5\x0a\xee\x95\xed\x53\x7a\xbc\x2f\x84\x8c\x75\x4f\x6f\x2d\x53\x9c\xd5\xc4\xf3\x84\xaf\xb0\xfa\x07\x58\x1f\x06\x35\x4b\x06\x69\x0b\x1c\x06\xca\x60\x0e\xf8\x0c\xb8\x1d\xdc\x0b\x1e\x08\xee\x2e\x75\xe6\x82\x92\xb0\xdd\x33\x3b\xfb\xb2\x51\xd7\xa7\x64\xc7\xa7\xe9\xad\xc1\xb9\xe0\xfa\x64\x77\xee\x50\xd8\xac\xdf\x8f\xcb\x56\xe4\x9a\xd1\x41\xba\x75\x78\x30\x5b\x2a\x77\x97\xe8\x4c\xa9\xb7\xd4\xe6\x2a\x82\x68\x2a\xb6\xea\x48\xba\xea\xea\x8e\xdc\xe0\xeb\xf6\xd8\x98\xa1\x28\x82\x68\xcb\x9a\x36\xa8\x8c\xb6\x19\xe3\xf6\xd8\x98\xab\xab\x8a\x62\x4b\xba\xe6\xc8\x35\x4b\xe1\x79\x51\x54\x1c\xb1\xa8\x49\x92\xae\x8a\xa2\x2e\x89\x52\x43\xa2\x6c\x9e\xb3\xb9\x8c\x8b\xa4\x61\xc8\xca\xee\xb0\xa7\x09\x72\xa6\xe2\x34\x1c\xc7\x30\x25\xc8\x0d\xaa\xee\xa8\x02\xa5\x61\xc4\x51\x4c\x06\xc8\x12\x92\x15\x33\xbc\x42\x2d\xf1\x9a\xaa\x4b\xa2\x26\x08\xaa\xac\x4a\xaa\xe3\x58\xbc\xaa\x98\x8a\x84\x86\x20\x6f\xea\x9a\x53\xb3\x1c\xc7\x62\x35\xd5\xd2\x64\x34\x08\x35\x5b\xd7\xac\x8a\xae\xf2\x1c\x2f\x28\x3a\x57\xe4\x8a\x3a\xcf\x73\xac\xc2\xf1\x02\xd2\x79\x5e\xe0\x6c\x5b\x72\x04\x43\xe2\x39\xc4\xb2\x1c\xd4\x04\xce\x54\x54\x49\x12\x0d\xc5\x30\x05\x49\xf2\xaa\xd5\x78\x6f\xc5\x42\x79\xd5\x8c\x14\xef\x9e\x97\x7b\x89\x7e\x36\x94\x57\xdd\x5b\x4e\xa1\x16\x4c\xbe\xcb\x2c\xda\x5d\x81\xfd\xe0\xe3\x3d\xcf\x8b\xcd\x7d\xd6\x23\x39\xd1\xff\x3f\x04\xdd\x55\x71\xcc\x01\xd3\x9d\xf3\x2c\x41\x5f\x98\x2f\x77\x82\x04\x7d\x89\x11\xdc\x7f\xbe\x40\xef\xd9\x96\xd6\x1b\xdb\x7f\xd1\x82\xa7\x62\xf9\xd4\xff\x3b\x62\x1c\xb7\xf9\xde\xfe\xdf\xa6\xe5\xe2\x9a\x4f\x27\x6c\x07\x71\xf2\xee\xdc\xc3\xf4\xed\xe1\xf3\x0b\xed\xee\x8b\xb2\xb3\x5f\x0f\x6b\x56\x0b\x51\x4d\xfd\xe0\x1d\x3b\x8f\x4d\xc8\x3a\xa5\x50\x76\x9e\x69\xf2\x4e\x78\x27\xdf\xa1\xf3\x20\x83\x3b\xca\xb3\xc1\x4d\xf5\x0c\x6e\x39\x41\x24\x0c\x66\xc1\xb4\x1c\x05\xa7\x77\x52\xb9\x6e\x00\xb9\x6c\xf5\x80\x6c\xd3\xc3\x8d\xba\xea\x6a\x0a\xab\xeb\x6a\x63\x34\xcb\x40\x76\xd8\x1a\x46\x63\x5e\xde\x1e\xad\x5b\xb0\x48\xe7\x1d\xe4\x38\x0d\x57\x57\xf2\x2e\x23\x65\xa4\x21\x34\x8a\x6a\x26\x54\x20\xab\x2a\x48\x19\x37\x20\x6e\x00\x03\x61\x6d\x52\xc9\xd6\x71\x1d\x54\x00\xa3\x06\x5d\x54\x8e\x60\x95\x63\x61\x89\x12\xa0\xc2\xf1\xb6\xc4\x42\xc1\x76\xc6\x07\x75\xa7\xe2\x0e\x0d\xaa\x70\x08\xb2\x9e\x9d\xb5\x35\x85\xd7\x4d\x67\x12\xd4\x1c\xdb\x71\x8d\xc6\x50\x86\xaf\xa9\x76\x9d\x62\x82\x75\x6b\x91\x5d\xb6\x0f\xd7\xca\xdf\x7f\x39\xa1\xa7\x54\x5f\xc6\xec\x7c\xd3\x87\xef\x8e\xce\xee\xe2\xda\x0b\xfe\x93\x0c\xbd\xbf\xb3\xf5\xf3\x7b\x1f\x21\xe0\x41\x4e\xd8\x52\x8c\xef\x37\x89\x71\x70\xef\x84\xfd\xf8\x0e\xee\xbe\xb5\x89\xd8\x46\x3c\xce\xc0\x8d\x84\x8f\x80\xed\xbe\xfd\x97\xfa\x7b\x9d\xc8\x27\xaa\x36\x9f\xdf\x7a\x63\xfa\xbd\x7b\xef\x4f\xbc\x37\xe8\x2b\x12\x3f\xbf\x33\x43\x8c\xef\x46\xe3\x33\xf4\xce\x3b\x88\xe7\x83\x5e\xc5\xb8\x7e\x96\xb3\xa2\xf5\x3c\xe3\x5c\x1f\x29\xba\x6b\x10\xc0\x57\x4c\xe9\xbf\x1f\x3e\x4f\xe6\xd5\xe8\xcd\xf7\x3e\x57\x23\xc6\xb1\xe2\xe7\x17\x6e\xdf\x70\xf7\x3b\xb3\x7e\x26\xfe\x47\x3c\x96\x8c\xeb\xf7\xaf\xc0\xb8\xb8\x22\x11\x7b\xb1\xa2\xdc\x85\xa9\x73\xdd\x8a\xef\x69\x39\x4e\xeb\xb9\xae\xed\x27\xe6\x84\xc7\x0f\xeb\x9b\x5c\x1a\x3f\x2f\x90\xcf\xef\xfc\x54\x22\xae\xe5\xc3\x47\x12\xcf\xc7\xfe\xdb\xfe\x4b\x52\xe3\x48\x24\x2e\xf6\x7e\x95\x98\x7f\x30\xcf\x63\x12\xf3\x97\x71\x1f\x79\x86\xb9\xf6\x99\x9d\x70\x01\x00\x7d\xc7\xf8\x5a\xfa\x99\x9d\x08\x02\x70\xea\x9b\x62\x6a\x4c\xe7\x69\x6c\x7b\xdc\xda\x7a\x9f\xe2\x7c\x9d\x34\x9d\x2d\x6b\x0d\xdf\xfd\xd1\xf4\x9c\xf7\x5f\x36\x85\x9e\x30\xdd\x6f\xfa\x45\x62\xce\x56\x74\x7e\xbf\xea\x54\x1f\xbe\xaa\x27\x8d\xdb\x60\xbf\xd7\x2e\x26\x6c\x30\xb2\x06\xcd\x72\x62\xed\x04\x7d\xec\xb5\x5a\xe3\xb0\x92\x21\xc6\x37\x9a\xcf\x6f\x7d\x99\x80\x9b\x4d\x78\x5c\xd3\x24\xde\xd3\x80\x96\x76\xd2\xc4\xf8\x83\x4d\x9a\xd9\x16\xe5\x37\x98\xf8\xae\x9e\x58\x28\x6f\x3f\x01\xcb\x49\x32\x8f\xb1\x4a\x8c\x7f\xe1\x14\x1a\x08\xe0\x24\xad\x06\xfc\xf6\xb3\xd4\x5e\x4b\xb9\x07\x9a\x7c\x5e\xf9\xf1\xdb\x00\xdf\x8d\x0e\x72\x54\x4d\x70\x0a\x98\x01\xce\x02\xe7\x80\x4f\xc7\x3d\x26\xa9\x5c\x09\x64\x7a\x7c\xb9\x18\x76\x04\x0a\xfd\xed\x69\xa5\xb0\x22\x7d\x50\x0f\x1a\x77\x7c\xe8\x9b\x09\xa7\x88\xee\xb6\xce\x5c\xf9\xa4\xb0\x2e\xd8\x98\x5b\x64\xa1\x3b\x64\x66\x44\x34\x62\xba\x79\x86\xe2\x94\x8a\x5b\x97\x6b\x4e\x83\x1b\x1c\x15\x29\xd5\x41\x83\x8a\x24\x2b\x0a\xcb\xaa\x92\x2a\xab\xa2\x0a\x41\x66\x48\x94\x0d\xf1\x80\x45\xf3\x1e\xa7\x58\xb2\x58\x94\x15\xc9\x13\xdb\x4c\xc8\x8c\x9a\xc3\x93\xc0\x53\xb4\x0a\xaa\x48\x90\xa3\x4d\x56\x10\x6c\x0e\xd9\x1a\x2c\xc2\x61\x8e\xb3\x6a\x6e\x45\x71\x65\x53\x17\x0c\xd1\x71\xe0\xa8\x20\x69\xb2\xc8\x16\x25\x59\x57\x65\x5e\xaf\xe6\x2d\xcd\x30\x1a\xa6\x85\x2c\x55\x2e\x5a\x45\x11\xaa\xa2\x59\xb5\x06\x4d\x5d\xaf\x9a\x8e\x1a\xe0\x8a\x8b\x70\xbb\xa2\x58\xf4\xf7\xee\xcd\xd1\x08\xb7\x5c\xb0\xd7\xdb\x67\x4f\xc1\xad\xd3\xdc\x8b\x38\x9f\x21\xde\x8b\x80\x06\x06\xbe\x9e\xde\xd3\x81\xc7\x52\xfc\x1b\xca\xd0\xb5\xbf\x9f\x22\x67\xdc\x26\xcd\xac\x22\x7b\xf7\x63\x1a\xde\x8a\xf3\x3a\x88\xe7\xc5\xa6\x5c\x2a\xd0\x03\x4f\xa6\xc7\x09\x65\xa5\x91\xe6\xb5\x60\xfc\x75\x87\x10\x3c\xa2\x35\xd7\xb5\xfa\x1c\x02\x4e\xd0\xe4\xbe\xdf\xb6\x92\xb9\x05\x7a\xe0\x74\x02\x3e\xd8\x7c\xfe\xe9\xb7\x5b\xcb\xcf\x3d\xaf\x24\xf0\x66\x14\xca\x6b\x47\xb1\x1d\xf3\xa9\xd6\x78\x5e\x7d\x1e\xa1\xf3\x70\xad\xf5\xd5\xf8\xde\x5a\xff\x6f\x08\xbf\x26\x38\xd3\xf7\xfd\xac\xf2\x73\xf8\x86\xd0\x73\x1d\xf1\x3b\x14\x2c\x8b\x73\x29\x5c\x87\xb2\x7e\xed\xf1\x53\x70\x8a\xd7\x10\x9c\x69\x26\xf6\x9e\xd0\x6f\x5b\xae\x6a\xbd\xf7\xf1\x59\x64\x62\x0d\x85\x66\x1d\x84\xd4\xda\x36\x9f\x98\xc6\xd1\xfa\x22\x96\x23\x6f\xb6\x7e\x6f\x7c\xd6\x92\x86\x6f\x25\xf6\x8c\x78\xef\x76\x52\x2e\xeb\xcd\x3d\xd8\x5c\x4e\xd0\x90\x6f\xcf\x7d\x0a\xc3\x7f\x42\x8c\x4f\xd0\xc4\x5e\x97\x18\xdf\x6e\xc2\x07\xee\x6d\xad\x87\x37\x7f\xa7\xb5\xfc\xda\x78\x37\x21\x37\x2b\xcd\xf9\xec\xef\x6d\x8d\x9f\xf8\x6c\x2c\xa6\xf5\x8d\x5f\x9c\xb2\x2f\x04\xcd\x61\x31\xdb\x42\x9e\x6e\x9a\xd1\x5a\xbe\x3f\x77\x71\xfa\xbd\x1b\x70\xee\x71\x82\x57\x03\xf9\xbe\x32\xf5\x5e\x81\x9c\x67\x7c\x4f\xdf\xc6\xf5\xef\x8c\x42\x79\xcb\x22\x9f\x16\xb7\x60\xac\x56\x3b\x5a\xed\xd9\x80\x39\xe5\x1d\x98\x86\xdc\x07\x5b\xd3\x56\x5c\x23\x20\xa6\x95\xe0\xec\x68\xeb\x0b\xc4\x1a\x2c\x62\xfc\xfb\x5a\xae\xb9\x3c\x80\x2d\xba\x81\x07\xe2\xef\xbe\x1b\x7f\xb7\x70\x43\xfb\x62\x30\xb7\x47\x4c\xd3\xcc\x4b\xfe\xef\xb6\xbe\x18\xbd\x8d\xb4\x1b\x83\xb9\x3d\xf1\x12\xe1\xcb\xe0\xb9\x85\x3c\x3a\x9a\xb6\xdf\x06\x1e\x9c\xc2\x87\x78\x8d\x41\xbc\x33\x5e\x8b\x84\xcf\xcd\x7d\x7e\x78\x05\xc7\x91\x5e\x48\xdb\x4a\xa1\x0c\x1e\x69\x4d\x37\xeb\x7a\x13\xf6\xad\x1d\xd1\xf7\xea\xb3\x5b\xf2\x0f\x8e\x7d\x31\xf4\xee\x69\x2d\xe5\x8f\x44\xec\x79\xa5\xc9\x5b\x6b\x49\x5b\xb3\xda\xa4\xe5\xb5\xc3\xe9\x7d\x72\x70\x5d\xea\x15\x27\xa4\xed\xc6\xd0\x9e\x5c\xdd\x5a\xfe\xaf\x5e\x94\xb6\x65\x43\xf8\x99\x31\xfc\xdc\xdc\x0b\xf4\xa3\xcc\x52\xe7\x69\x3a\x3b\x2b\x3f\xef\x27\x85\xee\x27\x3e\x39\xf9\x3a\x54\x99\x45\xcf\x0f\xc1\xa7\xc1\x89\x3d\x3d\xf3\xce\x22\x79\xcd\xf7\xd6\x18\xda\x9f\x4d\x8c\x63\xcc\x3b\x3b\xae\xc0\xfd\x8f\xf0\x2c\xfb\x7f\x8d\xef\x2f\xd5\x27\xa5\x1c\x4b\xdb\x41\x2d\x5a\x52\xdf\x53\x19\x1c\x4c\x28\x4c\xcb\x95\xbb\xdb\xb2\xdd\x85\x69\xf8\xce\xf4\xb4\xce\x4c\x8e\xd5\x35\xc3\xe5\x86\x35\xd1\x73\x4d\x77\x6c\x5c\x52\xac\x21\xd3\xe6\x78\x54\x43\x8e\x50\x31\x11\xeb\x52\x15\xb1\x22\x64\xd5\x03\x23\xba\xc6\x54\x18\xa5\x4d\x43\x1c\xaa\x33\x8a\x6d\xc9\x68\x14\x55\x64\x5d\x33\xb8\x2a\x2c\xc2\xd1\x03\x26\x5d\x84\x3c\x3f\x09\x40\x06\x0c\xe1\x3c\x60\x1d\xf4\x86\x59\x32\x9d\x6d\xd9\x20\xbf\x29\x31\xa9\x8e\x30\xc0\x11\xcc\xe9\xd4\x99\xbd\x78\x52\x38\xb7\xa9\x2d\xdb\xcd\x46\x55\x5d\xe8\x8a\x8c\x86\x90\x45\xc9\x5e\x95\x1a\xd7\x54\xdd\x66\x07\x55\xde\xab\x68\x5a\x91\x35\x1d\xd5\xe2\x78\x64\xa2\x3c\x3b\x36\xea\x0d\xbb\xd4\xb0\x57\xa5\x64\x54\x43\x36\x4f\xd5\x91\x08\xab\x48\xa6\x64\x58\xa5\x75\x9b\x63\x1d\xc4\xd8\x9e\xad\xaa\x79\x27\x2f\xc3\xc1\xe1\x3c\xc3\xb2\xb2\x3b\x28\xcb\x92\x54\x74\x99\x31\x4f\xc9\x08\x36\xac\xdb\xc5\xbc\xe3\xb9\xb5\x5a\x2d\xb0\xbf\x86\x83\xda\x61\x71\x2d\x97\xd3\x83\x3a\x57\xff\xe6\x3a\xd2\xc5\xf4\xa1\x9c\x95\xbd\x4a\x06\xe8\x9a\xa2\x73\x8e\x2c\x7a\xae\xae\xb1\x9c\x65\xa9\x36\xcb\x21\x13\x31\xfe\x1a\x86\x5c\x6a\xc4\xab\xb8\x70\x10\x49\x94\x02\x07\x27\xea\xd1\x9f\x68\xa9\x31\x6e\x7b\x5a\x70\x1f\x0e\x8e\x8c\x31\x45\x9e\x17\xab\xc3\xa2\x2c\x2b\x45\xb7\x38\xee\xf1\x19\xcd\x86\x43\x95\x4a\x05\x71\x95\x4a\x05\xb4\x61\x99\xa6\xd1\x36\xf8\x10\x38\x0a\x1c\x0b\xce\x01\x60\x5a\xdc\xea\x3a\x1b\xb5\x91\x6c\xcb\x75\xf7\xcd\x9c\x3e\xf3\x88\xce\xbe\x6c\x4f\x50\x03\x36\x9b\xcc\x60\xa2\x73\x7d\xd3\x83\xb5\x75\xe3\x16\xdb\x78\x65\x33\x3b\x73\x76\x86\xe1\xc4\x8a\xc2\x67\xc0\x7b\x5c\xdb\xa0\xa9\x58\xb6\xa9\xb9\x55\x34\x36\xa8\x56\x07\xd1\xb0\x32\x3c\x54\x69\x88\x4e\x9b\x6d\x1f\x90\x68\xce\xb6\x54\x93\xab\x28\xa2\xe8\xb1\xaa\x5a\x87\x40\x10\x9d\x8a\xe2\xf0\xc8\x46\x1a\x6f\xe9\x48\x72\xa9\x0a\xef\x16\xb3\x23\x92\xc8\x2b\xaa\x5d\x94\x44\x49\x10\x75\x45\xd4\x79\x83\x97\x54\x5d\x94\xa4\x3c\x32\xa0\xe5\x8d\x99\x5e\x15\xaf\x9e\xe3\xa0\x53\x51\x19\x4e\x12\x78\xa7\xc6\xab\x52\xd1\xd2\xab\x9e\x91\x29\xea\xbc\x08\x40\x1b\x58\x35\x39\x2f\x77\x35\x7d\x07\xe8\xc6\x15\x50\x64\xcc\x09\x39\xba\xbb\x7c\x0a\x3c\xa2\xf3\x54\xbc\xa4\x63\xa7\x13\xdb\xd5\x5c\xd3\xb4\x66\x79\x9e\xf6\x9e\x8e\x52\x07\x6e\x9a\x49\x36\xdd\xcc\x85\x3d\x35\x73\x57\x9f\x72\x49\xf7\xfc\xea\x89\xd7\xdf\x70\x85\x37\xe3\xe6\xfd\x60\x12\x32\xe7\x7d\x6a\xc5\x8f\xef\x5c\x79\x72\x0f\xda\x80\xbe\x34\xf7\xef\x4b\xbc\xdf\xb8\xd4\xdb\x0b\x37\xcc\x2d\x52\x4f\x3b\x13\x8f\x38\xd4\x5d\xcf\x64\x3e\x81\x7e\x3d\x71\x2f\xfc\xc8\xcb\x1b\x9e\xbc\xee\xfa\xeb\x1f\xfd\xbe\xfa\x85\x9b\xf6\x1d\xf5\xbb\x6f\x2f\x3e\xf0\xec\x4d\x7f\xa7\xca\xde\x7f\x5d\xcc\xcd\xff\x30\x9d\xbf\xaf\xad\x6d\x3e\xdc\xfa\xd2\xb2\xfc\xf1\x8b\x4e\x2e\x7f\xf9\xa9\xf2\x89\x27\x9e\x3e\xed\x9a\x47\xb6\x7a\x8f\x51\x7f\xdc\xde\xf9\x54\xe6\xe1\x4f\x7b\x33\x16\x2c\xa0\x7e\x04\x8f\xfe\xdc\x32\x6f\x95\x4f\xdd\x70\xaf\xb4\x58\x5a\x3c\x6b\xf1\xe2\xcb\xe6\xcf\xfb\x94\xfc\x91\x2b\x4e\x51\xce\x58\x30\xe7\x02\x4c\xbb\x41\xbc\xdf\x04\x1f\x01\x9d\xe0\x78\xb0\x04\xd7\x57\xc0\xfd\x06\x7c\x57\x21\xd7\x7d\x6c\xf6\x88\xce\xd2\xb1\xd3\xdb\xb2\xa5\x72\x37\xec\xc4\x0b\x3c\x05\xd2\xd9\xee\x00\x37\x31\x3d\xd0\xb9\x24\xad\xa7\xd0\xd6\x37\xb3\x04\xfb\x66\x76\xcf\x2c\xd1\x99\x7a\x95\x83\x06\x74\x95\xa1\x89\xe2\x88\x4c\x19\x50\xe4\x8b\x70\x18\x8d\xe0\xde\x63\x23\x70\xbc\xc8\x41\x57\xa9\xea\xaa\xec\x1a\x6c\x75\x12\x48\x90\x37\x4c\x7e\x64\xd0\x6d\xd8\x4e\x9b\xe0\x78\x06\xcb\x64\x58\x4d\x13\x24\x56\x15\x44\x64\x6b\x9a\x59\xe4\x50\x05\x59\xbc\x26\xa3\x8a\x43\xc9\x6c\xd1\x1b\x81\x43\xc3\xa3\x32\x3f\x09\x24\xda\x14\x8a\x55\xc5\x11\x34\x4d\xb4\x2b\x82\xac\x68\x8e\xa3\x89\x22\x1a\xd7\x54\x8e\xd7\x25\x8e\x11\x05\x5d\x66\x39\x8d\x17\x45\x06\xd5\xa0\x88\x78\x81\x47\xbc\xa2\x14\xcd\xbc\x08\x59\xcd\x52\x79\x4e\x2c\x5a\x8a\x8e\x18\xca\xe4\x05\xa4\xe4\x39\x95\x35\xb0\xfc\x8c\x72\x34\x8f\x04\x00\x66\xbb\x71\xb9\x45\x9f\xdb\x0b\x30\x07\x32\xed\x5d\xf1\x3d\xe0\x4c\xc5\x53\x84\x8c\x48\x0d\x4a\xa8\x8a\xec\x0c\xef\x09\x75\x2a\x6f\x20\x66\xdc\x45\x63\x48\xd0\xe0\x20\x64\x3c\x39\xc3\x67\x2d\xd1\x11\x34\x9b\xe7\x90\xed\x78\x75\x34\xee\x40\x01\x8e\x37\x84\xcc\x98\x37\x86\x86\x6c\xc8\x52\xc0\x21\xfb\x75\xee\xfc\xa9\x2f\xc9\x9f\x8f\xfa\x69\x1a\x51\xae\x63\x00\xef\x7f\x2b\xa1\x7b\xcd\x42\x79\xef\x5f\xb0\x4f\xbe\x26\xb6\xb3\x95\xdc\x4b\x51\x8f\xa5\x42\x6e\xdf\x93\xa0\xa3\x21\x85\xfd\x53\xb1\xad\xb8\x1d\xdf\xd5\xde\xf3\x67\x22\xf6\x17\xdc\xed\x7e\x0b\xc7\x53\x0e\x89\xed\xf2\x30\x1f\x68\x27\xb6\x9d\xf6\x7e\x2d\x0d\xf7\x21\xc4\x9d\xbd\xf8\x8c\x33\x18\x67\xed\x06\xe2\x79\x7c\x37\x22\x78\xde\xc1\xbd\xa5\xf0\x1d\x55\x7f\x5d\x4a\x28\x51\x01\xec\xcc\x86\xa5\xb1\x70\x29\x8f\xb6\x6c\xee\x58\xe8\xa3\x3a\xbc\xaa\x9c\xf8\x27\xdb\xcd\x46\xe5\x31\x69\x57\xf2\x94\x0c\xdb\x18\xa5\x8c\xc1\x41\xc4\xc3\x3c\x74\x14\x24\xa2\x61\x17\x8d\x23\x1e\x5f\x49\x46\x0c\x65\x37\x46\x33\xac\xa7\x53\x76\x63\x3c\x93\xf7\x2a\x3c\x55\xd3\xe0\x28\x62\xfd\x0f\xad\x58\xac\xe9\x98\x68\xdc\x41\xe3\x35\xb5\x62\xc1\xa2\x37\x4e\xe5\xd1\x78\xd5\xb4\x46\x6c\xc3\x31\x6c\xd3\x31\x19\xab\x31\x66\x20\xc3\x88\xf6\x43\x0a\xf7\xe3\x0d\x8c\xf7\x9f\x12\xeb\x1f\x8c\xd6\xcf\xd0\xeb\x37\x27\xec\x08\xb3\x50\x5e\x3b\x86\x6d\xd3\x37\x89\xe7\xf5\xe6\xf3\x71\xec\x2b\xb1\x1f\x0c\xbd\xeb\x32\x02\x8e\x63\x8f\x61\x6d\xf7\xb7\x08\xfc\x3e\x15\xef\xc7\xc2\x4d\xbf\x3c\xee\xe3\x73\xde\x9b\x2b\xb7\x1a\x6b\xe7\xff\xc6\x63\x89\x24\x7c\xed\x72\x02\x5e\x69\xee\xe1\xce\x3b\x5b\xef\xed\xc0\x4d\x89\x38\x8c\x8f\x0b\x9c\x77\xe8\x3c\x42\xcc\xc9\x6d\xee\xf9\xfe\x17\xa7\xac\x21\xa8\xd7\x41\xae\x21\xe8\x59\x8a\x73\xdb\xf6\x0e\xc6\xf0\xe3\x82\x98\xf8\xde\x7d\xe0\x37\x05\xfa\x59\x97\x88\x17\x39\xd1\xf8\x44\x8d\xe0\xf8\x8c\x26\xa4\x65\x32\xe6\x86\xe3\xad\x41\xed\xe3\xc4\x3c\x71\x8c\x3e\x98\xe7\x66\x38\x85\x66\xf1\x7c\x56\xd7\x08\x78\x70\x87\xf2\xab\x09\x9e\x48\xe0\x87\xa1\x9d\xaf\xc4\xcf\x0b\x01\x3c\x18\x3f\x8e\x19\x2a\xe4\xbd\xac\x42\x92\xb7\x30\x7c\xfb\x17\x0e\xc2\x73\x01\x7e\xa2\x1c\x91\x8b\x27\x17\xe4\x36\xd1\xf7\x30\x4b\x9d\x47\x3e\x34\xb1\xf0\xa3\x22\x60\x16\xed\x79\x12\x38\x60\xda\xac\x8b\xe7\x7d\x09\x64\xa2\xf5\x81\x32\x98\x0b\xce\xf4\x35\x3f\x59\x4f\x17\x9f\x24\x75\xe6\x8e\xcd\x94\x68\x2c\xc7\x7b\x4b\x7d\x41\x2d\x5d\xd8\x49\xe7\x82\x22\x75\xed\x51\xa5\x80\x20\xa6\x84\x8b\xce\x0e\x53\xb5\x22\xe3\xe4\x19\xaa\xde\x18\xe5\xa9\xb1\xc6\x90\xd8\xc6\xa1\x8a\x3b\xae\xa0\xe1\x41\x4f\x1d\x41\xc3\xfa\x78\x05\xd9\x70\x9c\xe3\x90\x0a\xc7\x05\x4f\x6f\xb3\xb5\xea\x28\xa5\x7b\xb6\x8d\xc6\x91\xa6\x41\x1d\xf3\xa4\x69\x5b\x32\x25\xda\x90\x83\x79\x09\x8d\xa1\xb1\xec\xb8\x24\xb2\x02\x6f\x6b\xb6\xe6\x54\x15\xd7\x81\x4c\x7d\x48\x77\x2b\x0e\x2f\xd8\x9a\x57\x33\xf8\xa2\x6d\x23\x00\x87\xc6\x6d\x5b\x1b\xb2\x2d\x26\x6f\xb2\x88\x95\x75\xd7\x92\x9b\xfb\x18\xef\xd7\xd6\x28\x5f\x6a\xfe\x64\x36\x77\x19\x3d\x9f\x59\xba\xff\xad\x43\xbf\x35\xeb\x57\x22\x60\x16\xee\x3f\xed\xf4\x97\x66\x1f\x26\x36\xe9\xa5\xda\xdc\xb7\x67\xbf\x36\x85\xbe\x82\xf1\x8e\x21\xf6\x99\x78\x7e\xf5\x2b\x09\x7a\x8f\x65\x22\x71\xe7\x3c\xbc\x43\x1b\x8c\xe3\xc2\xd6\xf4\x12\xd7\x77\x57\xb0\xdf\x14\x8f\xb3\xfe\x75\x82\xae\xb1\xac\x58\xfd\xf2\x14\xde\x57\x23\xba\x28\x34\xef\x3c\xf9\xe3\x0f\x35\xf9\x60\xc7\x1d\x7c\xf4\xfc\xfc\xdc\xa3\xb4\xc1\x2c\xdd\xfb\x35\x7a\x62\xd6\xdf\xc5\x93\x99\x85\xdb\x1e\xe0\x26\xe6\x9e\x28\x9e\x4c\xac\xc3\x2a\x94\xb7\xe0\x2c\xc9\xfd\x3f\x6b\xfd\x9e\xfd\xc7\xc7\xfe\x62\x58\x6f\xab\x82\xf3\x2c\x2a\x63\xad\xe9\xb5\xf2\x93\x04\x3c\x96\x0b\x2b\x3a\x13\xbe\x93\xaf\x9b\x56\x03\x50\x28\x6f\x5f\x83\xa3\x3a\x8f\xb4\xc2\xd5\x76\x44\xe0\x44\x23\xe0\x3f\x23\xc6\xda\xe1\xc3\xfd\xdf\x33\x0b\xb7\x5d\xd8\x95\x9d\xfb\xbc\xd8\xc4\x4b\xf3\x37\xe5\x3d\xb8\xc3\xf6\x9e\xdf\x13\x3e\xab\x59\x28\xef\x80\xd1\xdb\xe3\xdf\x04\xbd\x09\x31\x2e\x57\xc0\x84\x1f\xe8\xef\xc9\x4b\x09\x99\x62\x4c\x76\xe5\x2c\xda\x29\x94\x9d\x77\x01\x28\x2c\xf2\xf5\x43\x63\xb3\x08\xe6\x3c\x9f\x96\xaf\xc4\x1d\xa9\xf8\x9e\x69\x00\xdf\x33\x3f\x86\x47\x3e\x6b\x00\xff\x9f\xd6\x74\xb8\xfb\x5d\x82\xde\xd4\x26\xfd\x6c\x25\x6b\xbc\x0f\x35\xf7\x6f\x2b\xaf\x4c\xb4\xd2\x0f\x4e\x33\x06\xc9\x07\xe3\xfb\xab\x2a\xd0\x6b\xbc\x71\x92\x2f\xcc\x68\x5f\x07\xc8\x9a\x05\x76\x73\xbf\x57\x54\x12\xbe\xb5\xaf\xfb\xce\x9f\x22\x77\x65\x62\x1c\xab\xb5\xde\x88\x63\xb1\x3e\x7c\x7f\x3c\xfe\xc2\x8d\x1f\xba\xf9\xd5\x39\xd6\x3c\x8d\xa0\x29\xb3\x50\xde\xd2\x81\x63\x7b\xd3\x88\xdf\x58\xcd\x39\x3d\x7b\x7f\x22\x96\x66\x16\xca\x03\xb3\x12\x73\x4a\xed\xc1\xbe\x67\x13\x3a\x2b\xde\x83\x2d\x47\x26\x68\xd9\x8a\x79\xfb\xba\x84\x0c\x37\x23\x5c\x13\x77\x00\x12\x3a\x37\x8e\x35\x2a\x51\x7d\xf6\x60\x9c\x38\x4e\xab\x44\x7d\x81\x03\xf8\xfa\xff\x4d\xeb\xd0\x2d\xd8\x8e\x73\xec\x29\xeb\x9a\x99\x58\x57\x6c\x27\xae\x1d\x4d\xc1\x43\x5e\x08\xf6\xb8\xba\x24\xa1\x8b\x63\xbc\xc5\x71\x60\x35\x8a\xe9\x38\x4f\x60\x3b\xf4\xbf\x89\xf9\x28\x04\xde\x72\xc4\x38\xcf\xc5\xb2\x6f\xe1\x9e\x57\x3e\x01\xe6\x7d\x5d\x24\xe3\x3a\xfe\x1a\xde\x4e\xcc\x29\xee\x69\xb0\x7b\x7f\x42\x1f\xa7\x6c\xd4\x2d\xaf\xc7\xb6\x6e\xb0\x37\xdd\xfd\xbf\x00\xa0\x4d\x29\x94\x77\x0f\xfa\x36\xef\xfe\x23\x01\xa0\x76\x4c\xdd\xd3\x8d\x5f\x24\xd6\x7e\x43\x73\xed\x1b\x7e\xf9\xa3\xe6\xbc\x8c\x58\x76\xd0\x2b\x66\x10\x38\x24\x70\xb5\xe9\xc4\x78\x5e\xb3\x72\x0f\xc6\xe3\x2f\xdc\xff\xca\x9b\x13\xe2\x3a\xb1\xb9\x7e\x8d\xd0\xd9\x6e\x22\x96\xd6\x1c\x8b\x4d\xec\xb7\x6f\xa3\x7c\x16\xcb\xf2\x7d\xad\xed\xc1\x4d\x7f\x49\xf3\xd6\x86\x1d\x53\xe8\xd8\x6a\x3e\xbf\x61\x7a\x6b\xfa\xde\xf8\x0d\xe2\xbd\x46\x93\x17\xfb\x7f\x45\x8c\x5f\x6b\xe2\x62\x65\x84\x8b\x87\x27\x7b\xa2\xf9\xcf\x7d\xbb\xd0\xcc\x8b\x8e\x65\x43\xf5\xca\x29\xb1\xeb\x40\x56\xf1\x53\xe8\x0f\xaf\x6b\xc0\x9c\x02\xb7\x9b\xf8\x59\xb5\x69\x0a\x1d\x9f\x96\x92\x25\x62\xce\xa4\x35\x66\xe9\xde\x7d\x19\x30\xe7\x2d\x11\x14\xe8\xc7\x06\x12\x3c\x1a\xf3\x90\xfb\x5a\x6b\x9e\xde\x73\x45\x7a\x4e\xc1\x9a\xfb\x7f\x19\xd3\x99\xef\xab\xb8\x85\xb2\x7b\x1f\x86\xff\x22\x3d\xd7\xb0\xf7\xfc\x23\x31\xaf\x84\x67\x23\xdb\xf0\x19\x51\xff\x9b\x69\x5c\x84\x3c\xf7\x12\x01\x1f\x24\xde\x3b\x92\x7e\x7e\xcf\xa6\xc4\xf8\x71\x6e\xc9\x6e\x7c\xd6\xfd\xec\xf3\x84\xfd\x50\xa5\x2d\x1f\x17\x6d\x60\x8e\x8e\xef\xff\x92\x67\x1d\x38\x5e\x18\xbe\xe3\xe7\x44\x1c\x31\x38\x3b\xee\x9f\xc2\x8b\xc1\xdd\x2a\xdc\x67\xa2\xff\x67\xe9\x7d\x58\x75\xef\x94\x39\x05\xcf\xe3\x5a\x9d\xbb\x1b\xe9\xb5\x05\x39\xdb\x89\x7d\x0e\x7a\x83\x3f\x8e\x6d\xa9\x5f\xa4\x7d\x10\x07\xe7\x6b\xad\x3f\x34\xc1\xeb\x46\xa1\x5c\x5d\x87\xe5\xe7\x8d\x69\x1c\xad\xb2\xa7\x8c\x5f\xf1\xf5\xf6\xaa\x27\xa6\xc0\x71\x3c\x76\xed\xcf\x9b\x70\x90\x0f\xfd\xe3\xdb\xc1\x91\x61\x07\xcd\xe0\x9c\xf5\xe2\x28\x6a\xd9\x81\x5d\xd2\xe9\x1d\x5d\xbd\xb1\x4d\x9c\xed\x66\x33\x64\x85\x6a\xb2\x18\x60\x7b\xa9\x2f\xdb\x51\xea\xf5\x3f\x41\x27\xfe\xa0\xa3\x1a\xf9\x6f\xda\x92\xd0\x08\xb2\x33\x82\xe7\xc2\x3c\x34\x65\xc4\xa1\x21\x1b\xd5\x91\xa8\x42\x19\x16\xbd\x6a\xa6\xe8\xb9\x3c\x35\x58\x73\xf3\x45\x6a\x74\xc2\xcc\x3a\x07\xb4\xac\xc2\xe8\x4e\x51\x28\x8a\x45\x91\x2f\x1e\xa8\x40\xb7\x88\xc6\x32\xa3\x0d\x36\x33\x3a\x21\x9b\xaa\x6a\x18\x6d\xac\x2c\x98\x82\xec\xd5\xa5\xa2\x53\x14\xe1\xb8\x58\xb4\x58\x91\xbe\xdd\x2c\x32\xba\xad\x0b\x8e\x3e\x3c\x36\x52\xd5\x4d\x51\xb7\x35\xc6\xf6\x7e\xcd\xb1\x2c\x92\x44\x5d\x44\x35\x97\xb1\xf2\x42\x25\x53\xe4\x1d\x51\xac\x88\xa2\x37\x26\x55\x34\x5d\xd3\x74\x4b\xb0\x34\xde\x34\x38\x4b\xe7\x0c\x83\x33\x75\xd2\x4e\x0a\x68\x78\xfd\x2b\x04\x1d\x05\x7c\xbb\x3c\xc5\x0b\x31\x4f\x15\x7d\xfb\xa9\x50\x4f\xd1\x51\x70\x76\x90\xa0\x23\xa7\x49\xdb\x3b\xde\x4d\xd3\x5d\x90\x03\xdc\x82\x8e\x82\xf9\x50\x69\xdf\x74\xfd\x58\x6b\x3a\x0d\xc6\x5f\xff\xd5\x29\xe3\x7c\x79\x8a\x7c\xa9\x36\x6d\xa7\x55\xef\x24\x6c\x95\x58\xcf\x3f\xb3\x36\x3d\xfe\xce\x3d\xb8\x66\x15\x7e\xcb\xa6\x6a\xd2\xc6\x74\x1e\x6b\x41\xab\x3e\x8f\xbc\x3e\x65\xae\x6e\x73\xae\x6b\xfb\x12\xcf\xc7\xbc\xbc\xea\xeb\xad\x6c\x9e\x02\xbd\xe2\x55\x02\x7e\x61\x24\x07\x0b\x39\xe7\x3d\xea\xbb\xf1\x7c\x9c\x68\x9c\x42\xb3\xbe\xa3\x0f\xaf\xf9\xbc\xb3\xe7\x98\x94\x4c\x08\xef\x43\x3a\x8f\x62\x9d\x70\x42\x82\x07\xad\x42\x79\xd5\x65\x53\xd6\x15\xd8\x7f\xc3\x09\x9b\x3a\x96\xb3\xeb\xca\x2d\x6c\x15\xbb\x50\x76\x8b\x53\xc6\x19\xf4\xe1\x8e\x35\x05\x3f\x76\x13\x3f\x0e\xce\x7d\x05\x87\x44\xf8\x04\x87\x25\xfa\x9f\x9d\x02\x7a\x70\xe6\x04\x71\xcf\xba\xb7\xd4\x5e\x22\xfb\x8a\x76\x96\xda\x4b\x33\x7b\x7a\xbb\x60\xf8\xdf\xe9\xd1\x7f\x83\x7a\x92\x74\xae\x3d\x95\xab\x59\x98\xd6\xd5\xdb\x93\xe1\xe1\x90\x0d\x47\x11\x4b\xb1\x13\x32\x05\x90\xd0\xc6\xb9\x1e\xe7\x38\xd4\x88\xc7\xe9\x14\x40\xc0\x1a\x1b\x43\x33\xe0\x20\x92\xcc\x6a\x95\x9a\x15\xfe\x61\xe2\x38\x45\x15\x60\xb1\x2e\xaa\xda\xc8\x88\xa1\xa8\x82\x60\x4b\xba\x5e\x95\x87\xc7\x69\x60\x18\x36\xe2\x6d\x1b\x0e\x7b\x62\xc3\x91\xe5\x8c\xe6\xe9\x54\x5e\x45\x83\xba\x96\xf9\x1d\xaa\xe8\x86\xee\xff\x6b\x2d\x5b\xb4\x45\xd3\xe2\x39\x54\xb3\x45\xd7\xb1\x4d\xad\xe1\x64\xb8\xf1\x21\x0b\x72\x50\xb7\x01\x79\x26\xb5\x7a\xd1\x41\x74\xec\x8f\x0e\xce\x7b\x44\x0d\x46\x25\xca\x1b\x0c\xe8\x2a\xce\x1b\x34\xa3\xdc\x86\x5d\xb8\x2f\x44\x7f\x54\xdf\xd8\x99\x54\x73\xba\xbf\x5f\x6b\xb7\xe2\xb8\xc7\x7f\x13\xcf\xe3\xf3\x3c\x1f\xc2\xd0\xfd\x3f\x8d\x9f\x17\x82\xe7\x43\xf8\x1b\x31\x5c\x4e\xc0\x23\x3f\xb2\x12\xe7\x05\xe0\x5c\xdf\xfe\xd7\xe3\xe7\xad\xf0\xee\x24\x8e\x47\xf5\x0f\xb7\x1e\x67\x67\x64\xe3\xdc\x38\x39\x3f\xb7\x26\x86\x2f\x7c\xea\x36\xfa\x6f\xf3\x36\xcf\x0e\xbe\xb3\xa3\xbb\x16\xe1\x3b\xfe\x5f\xac\x87\xe4\x20\xf7\x39\x18\x6b\xed\xd3\x84\x9c\x23\xe6\xb4\xef\xb8\x78\xae\x46\xb0\x07\xe1\x38\x91\x0d\xa2\x47\xfa\x29\x5c\xdb\x8f\x63\x1c\x85\xe7\xb6\x3b\xff\x82\xcf\x93\x33\xf1\xf3\x72\x62\xcd\x3f\x8a\xd7\x26\x25\x70\xf4\xc3\x83\xc0\x7f\x40\xe0\xce\x24\xc6\xf9\x7e\xfc\x5e\x2d\x3c\x67\xc4\xf1\xe4\xfe\xa8\xee\x81\x9d\xda\x83\xe8\x4e\xb0\x9b\xda\x83\x57\xe3\x79\x86\x3c\x1c\x3e\xff\xdd\x56\xeb\x62\xe8\xfe\xef\xc4\x70\x21\x01\xff\x36\x81\x67\x3c\xfe\xae\x8f\xe2\xbe\xf9\x1f\xc1\x58\x3d\x7e\xea\xfe\x17\xe8\x67\x67\x13\xef\x08\x72\xf1\x7e\xe1\xff\x66\xe7\x2f\xf1\x6e\xff\x25\x5c\x87\x9e\xd8\xcf\x6f\x11\x34\x69\x10\xef\xff\x66\x0c\x37\x02\x3c\x55\x5e\x8b\xde\x1c\xca\x40\x9d\xd8\xb7\xf2\xbe\xa3\xf0\xaf\x6a\xb1\xdd\x67\x35\xdf\x51\xb9\x94\x98\x57\x50\x93\xe0\x73\x89\xb1\xb4\xc8\x87\x7c\x3e\xb0\xbd\x5f\x69\x0d\x7f\x9e\xbc\x13\xe6\x10\x73\x7d\x99\xb0\x4f\xc9\x71\x5e\x4a\x8f\x53\x79\xd1\xc7\xd3\xf3\xd8\xa7\xc0\x3d\x12\xcf\xcc\x6d\xa1\x5d\xf0\x71\x50\x02\xd3\xc1\x7c\x20\x83\x8b\x82\xfb\x5b\x61\x7c\xb0\x2b\x3c\xe9\xc2\x81\xc1\x72\x77\xdf\xcc\xae\x6c\xdf\xcc\x12\x9d\x3b\x22\xb8\x10\xda\xd1\xd5\x7e\xf8\x11\x25\x16\x3f\x4c\x97\xd8\x72\x6f\x7b\x57\x07\x93\xed\xee\x9b\xd6\xdb\x05\x3b\xe2\x9a\xc9\x33\x8f\xe8\x24\x3b\x01\xb6\x65\x47\xb9\xa2\x5d\x64\x29\xce\x15\x35\xd7\x52\x8d\xe1\x41\x34\x2a\xd5\x1d\xcb\x95\x05\x17\x0e\x19\x3c\x1a\xe2\x79\x73\xe2\x8b\xd4\x90\x27\x28\x19\x63\xd8\x81\x45\x68\x5a\xac\xc3\x29\x32\x62\x90\x3e\x58\x9d\x04\xfa\x30\x33\x4c\x8f\x38\x07\x2c\x27\x93\x67\x58\x97\x2b\xa2\x21\x05\x8d\x21\x4d\x82\x35\x4a\x86\x1a\x54\x45\xe4\x20\x3b\xf3\x7d\x59\x64\x44\xd1\x1c\xd4\x04\xd1\x92\x65\x83\x37\x59\x49\xe0\x75\x6d\x4c\xb5\x14\x91\x83\x2f\x3f\xf6\xea\xa3\xde\x1b\x47\x97\x17\x7f\xed\xa4\xb7\x16\xcf\x59\xfc\x59\xea\xb2\x0a\x3a\x79\xd7\x17\x9e\x84\x2b\x9e\xcc\x7c\xa3\xae\x9b\x10\x70\x2c\x2f\x88\x8e\xa6\x0b\xba\xa8\xf0\xaa\xae\x0a\xe1\x1e\xca\x09\x3a\x7d\xf1\x20\x74\xfd\xc2\x41\xe0\xdf\x20\x74\xa8\xea\xfb\x12\x03\xd8\x1f\xef\xff\x3a\xc1\x37\x41\xcd\x8c\x07\xb0\x4f\x72\x4d\x08\xff\xcf\xc9\x25\xb9\x3b\xfc\xe7\x37\x71\xb8\x06\xe0\xd7\xbd\xf9\x93\xbf\xbe\xf0\xba\x93\x8f\x0c\xcf\x22\x70\x3c\x6d\xcb\x1f\x71\x6c\x62\x8c\x78\x37\xa6\xe9\x2d\x2f\x44\x1c\x10\xd2\x83\xd0\xa4\x93\x02\xbd\x7c\x67\xfc\x3c\x1f\xf2\xcd\x5f\x70\x8e\x09\xbe\xb5\x33\x30\x37\xe4\x9b\x50\xc6\xfb\x33\x62\xe8\xfe\x28\x36\x6f\xe0\x98\xba\x5b\x28\x6f\xc6\x3e\xf9\x26\xae\x35\x2d\x6e\x7a\x32\xad\x2b\x42\x7c\x7c\x8d\xa0\x51\x8b\x80\x93\x75\xe6\x8d\xe6\x7b\x37\xbc\x49\xf8\x56\xd5\xe6\xf3\x1b\xfe\x78\x90\xf1\xf7\x1f\x84\xc7\xf6\xc5\xe3\x08\x09\x5e\xda\x9b\x90\x9b\xd1\x7b\xcb\x95\xaf\xe0\x6f\xf7\xc4\x76\x14\x29\x23\x77\x13\xb2\xbc\xb9\x86\xf2\xce\xbf\x62\xac\xff\x2d\x7e\x0f\x31\xdf\xfe\x6a\xbc\xbe\x24\x1d\xec\x22\xe4\x21\x89\x8f\x66\xff\x0b\x3e\x57\x21\x9e\x7f\x2e\x9e\x6f\x72\x7f\x76\xc6\xeb\x56\x43\x99\x83\xd7\x31\x80\x6b\xe5\xec\xef\x8e\x6d\xda\xf8\xdd\x05\xfa\xa9\x85\xf1\x6f\xf8\x30\xcf\x67\xae\xff\x9b\x10\x63\x3b\x88\xf1\xdc\xc2\xd2\xe7\xbf\x01\x5e\x14\x41\xcf\x7d\x01\x45\x16\xa2\x31\x03\x3c\x87\x74\x5a\x28\x3f\xbe\x19\x47\x1a\xdf\xc0\xf2\xa6\x12\xd0\x17\x38\x0c\x1c\x09\x78\x70\x3e\xb8\x1c\x5c\x0d\x96\x85\x75\x69\x0f\x0f\x0a\x14\xfb\xff\x3e\x1a\xe6\x82\x22\xb4\xb9\xee\x63\x61\x4f\x87\x2f\x5f\xb2\x1d\x87\xfb\xfe\x54\xe7\xa1\xb0\x74\x4c\xb9\xf7\x68\x88\xa5\x93\x6f\xbd\x85\x02\x2a\xaa\xef\x8f\xab\xd5\xc2\xf6\xa4\xf0\x09\x3a\x78\x76\xe6\xca\xd3\xdb\xea\x36\x0f\xc7\x64\xc1\x10\x39\x64\xcc\xf8\xac\x66\xbb\x4e\xf1\x21\x38\x4b\x45\xe3\xf6\x15\xbf\x55\xe1\xec\xc6\x6c\xfb\x7f\x9f\x13\xf7\xa1\x9f\xda\x35\x21\x6f\x32\x1a\x1a\xaf\xea\x92\x9d\x67\xa0\x5b\x87\x00\x8d\xe5\xd7\xc8\xfa\x0c\xd3\x1c\xd1\x20\x2b\xa2\x3a\x64\x65\x5e\x34\x9c\xec\x60\x20\x89\x8a\xac\x2b\x70\x68\x50\x19\x46\x43\x32\x14\x29\x15\xb2\x75\x65\x0c\x8d\xb6\x71\xbc\x69\x30\x35\x55\xbe\xe1\x86\x1b\xee\x92\x87\x2d\xa6\x8e\x46\x07\x4d\x17\x82\x91\x21\x63\x24\x63\x1a\x9c\xac\x49\x02\xc3\x73\x0a\x6b\x89\x9c\x64\x31\x3c\xaf\x99\x3a\xab\xc8\xaa\x24\xdb\xaa\x66\xb8\xba\x29\xf2\xb2\xde\xc6\xa2\x31\xc7\x82\x79\x2c\x93\x2a\x9a\x2e\x18\x82\x2a\x29\xaa\x22\xb6\x94\xfb\xdb\x63\x1d\x1f\xda\xe3\x21\x4d\x6c\x23\x68\x8b\xa4\xc5\x4a\x4c\xbf\x5c\xc0\xcb\x01\x6d\xad\xbc\x3f\xe1\x73\xbb\x85\xf2\x57\xfe\x95\xe0\x71\x0b\xe7\x1e\xf9\x7b\x7d\x1c\xce\xbf\xc2\x59\xdb\xfd\xcd\x7e\x06\x24\x9d\x0e\xc4\xef\x10\x30\xfd\x44\x70\x7c\x47\x1b\x7c\x18\x68\x93\x0b\x71\x4d\xfe\xa3\x00\x0b\x8e\x05\x5c\xd8\x29\x69\x21\x38\x3b\xac\x62\xdd\x99\x48\x3d\x98\x03\xbb\xc2\x12\xc5\x3d\xed\x3d\x7d\x99\x64\x8f\x24\xa2\x60\x7f\x86\x68\xdf\x9a\x0b\x5b\xbc\x06\x6d\xe7\xda\x4b\x94\x54\x29\xb2\x50\xd4\x35\x51\x66\x75\x41\x66\x6a\x48\x91\xa0\x5c\x41\x40\x1f\xe7\x6c\x38\x84\x84\xe8\x43\x99\x5c\x31\x93\x77\x0f\x68\x6e\xa6\xc8\x14\x47\xad\x61\xa4\xab\xd0\xc8\x48\x50\x86\xac\x8e\xc6\xd0\xe0\x05\xd4\x46\xef\x0a\x0b\x7e\x05\xdd\xf4\xd3\xcc\xfc\xc6\xcb\x36\x75\x8c\xf7\x56\x9b\xc4\xf2\x5c\x83\x95\x15\xc6\x62\xa4\xc1\xba\x61\x29\x96\x41\x59\x22\x1a\xd5\x7c\x6d\x35\xac\xb6\x8d\x8a\x32\xaa\x0d\x56\xa1\xc0\xf3\x68\x5c\xaa\x59\xa6\x69\x68\xb6\xe1\xa8\xff\x40\x79\x6b\x0c\x15\xbd\x31\x0b\xe6\x43\x1c\x6b\xb1\xdc\xa7\xfb\x37\x13\x72\x71\x98\x80\x47\xf1\xb1\xeb\x27\x2f\xc8\xed\x88\xf6\xbc\x90\x5b\x35\x77\x72\xc2\x9b\x88\x73\xe8\x9b\xcf\x6f\xc4\x78\xcf\x00\x6d\xd2\xf6\x6d\x7d\xf0\x21\x5c\x25\x3a\x91\x15\x44\x65\xb0\x6b\x54\x80\x85\x69\x39\x2a\x53\xa3\xc6\x79\xb1\x2a\x71\xd4\xe8\x7b\x46\x16\x0c\x1a\x43\x94\x3a\x3e\xdc\x56\x1c\x69\x8c\xd6\xd4\xaa\x3a\x98\x65\x2a\xb6\x50\x19\x72\x04\xce\x1b\x46\xa2\xe3\x50\x00\x8e\x23\x03\x71\x22\x1c\x85\xd6\xe4\x24\x98\x37\xf9\x1f\xb9\x75\xf4\xfd\x85\xf2\xde\x5b\x7f\x7e\x48\x81\xde\xf7\x3f\xef\xfe\x86\x90\x17\x46\xa1\xbc\xf7\x76\x1c\x1f\x35\x12\x3a\xca\x28\x94\xd7\xfe\x09\x4b\x90\xaf\x27\xe4\xb8\xff\xfc\x6d\xf8\xf9\xb3\x13\xfa\xc6\x28\x94\x77\x6d\xc1\x3e\xcb\x5d\x04\x3c\x38\x4b\x08\x6a\xd0\x04\x3d\xdb\xdb\xc2\x78\x84\x0d\x3e\x14\xf6\xf6\xc7\x7d\x46\x3b\x70\x35\xf4\x20\xa7\x3e\x99\xe8\x12\x56\x49\x2f\xf5\xc1\x90\x8a\xda\x80\xc0\x52\xe3\xef\xa9\x54\x9d\xe5\x28\xc1\x91\x64\x8a\x41\x35\xc5\xd1\x55\xd6\x30\xe4\x03\x2e\x1c\x15\x64\x47\x93\xe1\xa0\xd9\x28\x66\xc4\x46\xcd\xf5\xfd\x3f\xda\x56\x54\xc7\x91\x44\x54\x55\x0d\xd5\x69\x8c\xe8\x2a\x5b\xe1\xe4\x4c\xde\xb1\x74\xd1\xae\xd8\x88\xf1\xc6\xed\x31\x3c\x67\x2d\xec\x45\x88\xcf\xf8\xf7\xde\x9a\xd0\x91\xf1\x1a\x9f\x23\x75\x1b\xb1\xc6\x38\x57\xc0\x9c\x34\x83\x73\xf3\x67\x70\xce\x60\xff\x86\xd6\x38\x59\xbb\x9c\xb0\xb5\xd5\x26\x7c\xfb\x1b\x53\x70\x8e\xf7\x68\x47\x25\xe1\x03\xc5\xcf\xef\x5c\x48\xf8\x89\xc1\x39\xfe\xed\x75\x50\xa0\xf7\x9c\xcf\x80\xb0\xcf\x8b\x12\xf6\x79\xf9\x58\x5c\xf7\x4c\x8c\x30\x8f\x71\x1e\xb6\x72\x2b\x77\x67\x4a\x7d\x33\x4b\x47\xf8\xbe\x78\x7b\xa9\xe3\xf0\x23\x7a\x4e\x9d\x19\x8a\xff\xae\x63\xca\xbd\xbe\xcb\xde\x83\x39\x39\xf8\x6f\x5b\x9e\x67\xa9\x21\x34\xcc\x09\x70\xec\x3d\x06\x8e\x72\x22\x1a\xa5\x86\x8b\x9c\x0a\x87\xc4\xa2\x67\x0a\x83\x9e\x96\x1d\xf5\x14\x65\xc4\x34\x54\x9e\x71\x59\x0b\xe9\xea\x98\x85\xf2\x70\xdc\xa5\xf2\xde\xb8\x1b\xff\x89\x36\x15\xd5\x36\x54\xdb\xd6\x35\x5b\x12\x11\xa3\x6b\xda\xc4\x10\x35\xe8\x49\x2a\xcf\xe6\x05\x5d\x1c\x94\x64\x85\xaa\x59\x16\x1a\xb7\x6d\xbc\x7e\x87\xa4\xc5\xed\x5f\x24\xe4\x22\xf6\x93\x77\x7c\x0f\xfb\xd5\x0f\x63\x9a\xcb\x62\x78\x35\x5c\x7f\xd4\x91\xeb\xa0\x6b\xf7\x09\xad\xfd\x70\x9c\x78\x17\xaa\xbd\xf6\x52\xd0\xa1\x3c\x4a\x7a\x09\x97\x3d\x54\x14\x83\x65\xf3\x82\xbf\x6c\x96\x55\xe1\xb0\xcc\x78\x06\x8f\x8c\xac\x84\x0c\xd1\x1a\x93\x9c\xbc\x85\x86\xea\xc6\x24\xd0\xbd\x61\x05\x8e\x2b\xc8\x72\xdb\xf2\x13\xe3\xfe\x87\x36\x25\xc5\x92\x35\xdb\x56\x15\x4b\xe4\x91\x6c\xf1\x0a\xaa\x7a\x06\x1a\x67\x8b\xb2\xc9\xd7\x34\x49\x82\x02\xd2\x55\x47\x84\x45\x68\x19\xc8\x32\x40\x36\xca\x7d\xc1\xeb\x08\x3a\xab\x7f\xc0\x3a\xc8\x6e\x7d\xa9\xd9\x0f\xf3\x7c\x7a\xf6\x43\x02\xeb\x59\xfe\xec\x79\xaf\x96\x11\x1a\x43\x6e\x63\x28\x23\x78\xd5\xb8\xa5\x3a\x9e\xb2\x21\xc6\x53\x56\x15\x05\xb9\x9e\xa9\x3b\xc3\xc3\x8e\x0e\x0d\x0b\x99\x56\x93\xce\x2d\x82\x6e\xef\x69\xcd\x2f\xce\x43\x84\xcc\x09\xea\x99\x6e\x01\xe4\x39\x6b\x7c\x3f\x30\x80\x07\xb5\x2b\x41\x0e\xe8\x98\xbf\x6c\x8c\x87\xa0\xbf\x7c\x90\xdf\xda\x02\x17\x41\x1f\xc2\x2c\xd1\xc6\x30\x4a\x63\x4a\xa7\x85\xb6\x01\x8e\xa5\x46\x90\xcb\xf1\x54\x71\x7c\x1c\xd6\x19\x0e\x59\xd4\x68\x91\x85\x1a\x57\xf4\x46\xb8\x22\x2a\x66\x4d\xcf\xa6\x6a\x9e\x98\x91\xc6\x47\x33\x82\x27\x51\x83\x9e\xed\xc0\x11\xc4\x51\x06\x1c\x99\xa8\x46\x7f\xa2\x6d\x49\xb2\x54\xd9\xb2\x14\xc5\xe2\x79\xa4\x29\x8a\xa2\xd4\x3d\x47\xb3\x74\xdb\xd6\x2d\x0d\xea\xba\xae\x23\xd7\x30\x8c\x18\x57\xd5\x26\x4e\x76\x93\x67\x1e\xb8\xff\x6d\x88\xab\x07\x09\xb8\x1d\xe1\xb6\x40\x6f\xfe\x6d\x0c\xb7\x9a\xb2\xa2\x40\x6f\xb9\x84\xf0\xa3\xf1\x5d\xdc\xad\xf8\x5c\x72\x45\x29\x6d\x97\x07\xb8\xdd\xfe\xd5\x04\xce\x8d\x42\x79\x15\x8b\xcf\xc1\x6e\x23\xe0\x66\x73\x9e\x71\x0d\xb2\xf8\xf9\x60\x9c\x0d\x6f\xb5\xd2\x0b\x0c\xbd\x6b\x6b\x0c\x57\xc2\x1a\x13\xc1\x7b\xb5\xb4\xac\x0b\xf5\xc8\xe9\x84\xac\xd3\xa3\x79\x16\x9a\x75\xfa\x35\x5c\x73\xc3\x28\x94\xf7\xbc\x81\xef\xb9\x6f\x21\xc6\xc1\x31\xae\x0d\x4f\xe2\x78\xf4\x60\x31\x88\x49\xde\x36\x79\x58\xee\x21\xfa\xfa\xf0\x2e\x2d\x07\x4e\x04\x3c\x90\xc0\x67\xc0\x15\xe0\x9a\xe0\x5e\xed\x94\x2e\x1c\xd9\xb8\xe1\x50\x4f\x47\x57\x90\x4a\x1c\x68\xa1\x9e\xf6\xae\xac\x0f\x6d\xef\xea\x8d\x7a\x5f\x85\x9d\xb2\xba\xc3\x6b\xb2\x3d\x81\x1a\x9f\xd9\x89\x53\x34\x0b\x19\xac\xc8\xa9\x77\xdb\xee\x98\x78\xb8\xed\x89\xa5\x37\x9c\xb7\xf4\xe8\x87\x16\x2e\x6c\xbc\xb2\x1c\xae\x99\x79\xf4\xf2\xe2\x5c\xb8\xe2\xe9\x53\x4e\x79\xfa\xbd\xe5\x68\x12\xde\x74\x8a\xb7\x17\xda\x48\xb7\x0c\x03\x3e\xb7\xbc\x6b\xc6\x97\xff\xef\xff\xd6\x5c\x7c\xf1\xe7\x3f\xbf\x06\xfd\xe3\x84\x89\xa5\xf0\x23\x9f\x3c\xf1\xa1\x05\x9f\xf4\xbc\xcb\xe0\x7f\x3d\x3d\xff\xaa\x1d\x47\xa0\xbf\xa0\xaf\xcf\xd8\xb4\xe2\xb6\xbf\xce\x38\xe2\xa1\xc3\x66\xd0\xd7\x5b\x8d\xef\x79\x87\x5d\xf2\xe9\xc3\x1e\x3a\x6c\x3e\x75\x7e\xe3\xcf\x99\xd5\xb5\xb3\x2f\x39\x51\x3d\x7b\xfa\x74\xed\xd3\x77\xa3\x1f\xc0\xbe\xbb\xb5\xb6\xbc\xe7\x9a\x50\x3d\x63\x9a\x7a\x09\x04\x37\xdc\x78\xe3\x0d\x93\xe0\x96\x57\x5f\xbd\x16\xf6\xd9\xb7\xf1\x4f\x54\x9c\x2b\x79\xf4\x31\xf4\x8c\xf8\x88\xa9\xba\x1c\x0f\x5f\x83\xeb\xd1\x93\xe8\x3e\x0e\xae\x82\x57\x86\x7e\x0b\xa6\x49\x07\xdf\x82\x70\x1e\x20\x62\x6f\xd8\xf7\xd8\x8d\x7b\xd3\x3d\x57\xc2\xff\x0e\xfa\x57\x91\x39\x63\xc1\xf9\x17\x3e\xc3\x73\xf0\xfd\x0d\x40\x45\x77\x12\x40\x11\x74\x47\xb7\xea\x92\x5d\x5f\x4a\x54\xae\xbb\x10\x7d\xd1\xd5\xde\xe5\xff\xb5\x6d\xc8\x2d\xf2\x94\x3e\x09\x34\x5b\xd7\x58\x5d\x17\xf9\x49\x60\xea\xe6\xa8\xc7\xfb\x70\x06\x0d\xb9\x9a\xa9\x99\x23\xb4\xc5\xba\xb6\x33\x61\x1a\x6a\xd1\x2d\x72\x42\x9b\x82\x6a\xae\x01\x15\x58\x67\x1d\xdb\x39\x50\xc9\x2a\xa8\x66\x1b\x50\x0a\xe9\xa6\x12\xf6\xde\xc1\xe7\x15\xfb\x49\x7a\xc5\xbe\xf9\x3e\x1c\x87\x72\xee\x4d\xc8\x32\xab\x50\x5e\x71\x16\x3e\x97\x28\x27\xf8\xd3\xb7\xf1\xf1\xf9\xd6\x8a\xb3\x62\x7b\xef\x05\x5f\xc6\xe1\xfe\x30\xe7\xe2\x5a\x3d\xd3\x7b\x7b\x3a\xa6\x1f\x02\xf1\x4a\x67\xf6\x4d\xcb\xfa\x24\x17\x05\x76\x0e\x85\x6d\x38\xb0\x93\xeb\x9e\x3e\xad\x33\xcc\x14\x2b\x77\x77\xe1\xd4\xe7\x10\x17\x21\x04\x57\x28\x80\x96\x03\x07\x1d\xca\x2e\x1a\xba\x64\xb2\x0f\x5e\x33\x67\x1a\x62\x1d\x24\x19\x70\x90\x62\x4d\xd6\xe1\x74\x34\x8a\x54\x94\x1f\x1e\x67\x61\x91\x77\x05\x38\x86\xc6\x44\xd1\x95\x64\x4d\xe1\x65\x7b\x2c\x53\x71\x8a\x2c\x25\xa0\xaa\x24\xb8\xa2\x62\x48\x45\x49\xb0\xc6\x32\x43\x83\x0b\x9e\x5f\xb3\x0c\xdd\x89\xbe\x57\xd8\x77\xfc\xa1\x87\xc2\x79\x0b\xbc\x77\xe1\x5f\x4f\x43\xc2\x29\xd3\x4e\x7b\xe9\x9c\xd7\xaf\x9c\x7e\xce\x9d\xf0\x27\xe5\x55\x7c\xe6\x69\xde\x72\x14\x4d\x75\x2c\x47\x54\xf4\x31\xc8\xf1\x92\x18\xfc\x5d\xe7\x54\x41\xaf\x87\xf2\x9d\xc4\xe1\x3d\x84\xcc\x22\xe1\x77\xc7\xf4\x64\x85\x7b\x81\xe3\x2a\xfb\x07\xe2\xd8\x8d\x1c\xc0\xd7\xe2\x33\xc8\x15\x0b\x13\x32\xc8\x2a\x94\x9f\x3b\xbd\x35\xdc\xb9\xab\x35\x7c\x3f\x96\x41\x3b\xfe\x40\xc8\x14\x0c\xdf\xf3\x9f\x89\xe7\x6f\x9c\x2c\xe5\x36\xd1\x8e\xbf\xd7\x59\x86\x59\xf8\xf8\x2c\xe6\xff\xcd\x7b\x7d\xde\x47\x52\x63\xe1\xfc\xe0\x7d\xaf\xa5\xdf\xb1\xfb\x7f\x12\xf0\x38\x1e\x11\xac\x79\xf7\xef\xd2\x74\xf3\x3c\x48\xbc\x5b\x8d\xc6\xf1\x21\x85\x66\x5c\x7b\x3a\x1a\xce\x9d\x4b\x3b\xcc\xd2\xc7\x17\x7e\xe8\xc1\xd9\x57\xce\x95\x0b\xf4\xbe\x1f\xbf\xc4\x24\xdf\xbd\x39\xa8\xcf\xf8\xe3\xf4\x3b\x7c\x08\x43\xf7\xaf\x27\x64\x6c\x70\x8f\xe8\xa5\xc4\xbb\x95\xf8\x7e\xd1\x8b\x4d\x5a\x26\xef\x29\x6d\x7f\x21\x01\x8f\xdf\xbb\xf3\xf2\x14\xbe\xb5\x00\xbe\xbd\x3d\x35\x1f\x29\x31\x9f\x75\x31\xfc\x2c\x0c\x5f\xfa\xf8\x71\x60\x42\x04\xb3\xad\x02\x89\x57\xce\xff\x8e\x59\xfa\xf8\x91\xf3\x7e\x39\xfb\xba\x39\xff\x2a\xb4\xd8\x57\x7f\x46\x0c\xdd\xbf\x36\x4d\x67\xee\xd9\xa9\xf9\x0a\x89\xe7\xd7\x1c\x64\x9c\xd5\x53\xe0\x78\x2f\x1e\x9f\xd6\x0a\xce\xd0\xfd\xcf\xa6\xe1\x5b\x1d\x4c\xc7\x5b\x12\x7e\x40\x48\x03\x05\xfa\xf1\xa6\xee\x75\x48\x7e\xe8\x7f\x26\x86\x9b\x61\xbe\x04\xd6\x81\x3b\x7e\x91\xde\xcf\xdd\xbf\x4d\x8d\xaf\x26\xe6\xe3\x4c\x99\xcf\xf2\xd4\xfe\x88\x89\xe7\x57\x11\xf1\x6e\x72\x7f\x70\xbf\x17\x40\x03\x79\x72\x71\x6e\x84\xb6\xc0\x8c\xd0\xf2\x5a\x8c\xfb\xf7\xb5\x1f\x4e\xc7\xea\x33\x47\xe5\xba\xfb\xda\x7b\xbb\x12\x3a\x35\x02\xf6\x76\xb6\x97\xa6\xe1\x8b\x0d\x1d\xd9\xe9\xa5\x76\xdc\x21\x27\xe8\xf3\x84\x45\x1a\x95\x96\x71\xbe\xd0\xcb\x15\x15\xcb\xe4\x6c\x46\x46\x9b\x3f\x72\xf8\x3e\xbd\x3a\xa4\x2a\x8a\xc9\xd9\x8a\x80\x2a\xf9\xa3\xf6\xe9\xd5\xfa\x38\x65\xb6\x7d\x87\xb2\x6a\x13\x75\x54\x84\x32\xaa\x66\x24\xa8\xa0\x4a\xc3\x71\x44\x58\x47\x63\xa6\x2b\x2a\xda\x20\x67\xd5\x33\x6e\x28\xeb\x44\xc1\x16\x15\x4b\xb2\xac\x31\x2a\x8f\x8e\x58\xb6\x2c\xbf\x32\xbf\x0c\xbe\xb4\x09\xfd\xae\xa1\xfe\x02\x9e\x71\x46\x12\x64\xbc\x01\xa5\xe3\x9e\xa6\xe0\xab\x68\x36\xfc\x0e\x12\x9d\x8f\xed\x82\xb3\xd0\x77\xe1\x2c\x6a\x17\x6f\x3a\x55\xc5\x32\x51\x3d\xaf\x8d\xc2\x22\x2f\x8a\x8e\xac\x28\x96\x61\x9b\xda\x68\xca\xce\x0a\x69\x69\x45\xcc\x43\x73\x31\x6e\xbb\xb7\x7f\x05\x00\x6f\x61\xa1\x7b\xdd\x34\xfc\x5f\x4c\x9d\xe1\x9e\x93\x34\xf8\x34\x11\x23\x24\xe1\x4f\xa5\xe5\x44\x20\xd3\xfa\x9b\x39\xd0\x7c\x78\xbf\x6e\x67\x6b\x5e\x0d\xf7\xfc\x49\x82\x16\x2a\x04\xdc\x4e\xd3\x48\x30\xfe\xd6\xaf\x1c\x64\x9c\x27\x5a\xcb\xd8\xfe\xfe\x78\x9e\x7c\xe2\xf9\xc7\xa7\xc8\xa6\x80\xf6\x97\xa7\xe1\xcf\x3d\x8c\xad\x8a\x47\x22\xca\x25\x71\x1b\xfe\xe6\xcb\x69\x1c\xed\xfe\x33\x8e\x90\x4e\xe1\x0b\xe7\xce\x14\xfd\x1b\xe1\x38\x01\x9d\x3f\x76\x10\xf9\xf4\x68\x5a\x6e\xe0\xf7\x96\x77\x7e\x0b\x7b\xe1\xdf\x6c\x89\x0f\x2b\xfe\xcd\x1d\xb9\xb5\x18\x1f\x5b\x01\x28\x2c\xdc\xff\x54\xb6\x20\x82\x05\x77\x26\xe3\x88\x3b\x77\xe3\xf1\xce\x4b\xac\xd1\x97\x15\x95\x42\x79\xdb\xf5\x79\x50\xa0\x77\xaf\xcc\xb3\x49\x5d\x15\xd2\x41\x90\x47\xf3\x21\xa0\x4d\x2e\xc0\xf6\x54\xb2\xa7\xe3\x09\xd8\xe7\x2d\x75\x60\xe3\x15\xfa\x1f\xdf\xe2\x0d\xff\x3c\xbd\xd4\x51\x22\xad\x8c\xc0\xc8\x48\xfd\xfd\xf8\x6c\xed\x80\x08\x5d\x37\x7b\x94\xeb\x1e\xf8\x1d\xfe\xcb\xcf\x5c\x17\x56\x5c\xb7\x71\xb7\xff\xb7\xd5\x98\xd1\x46\x25\xd1\x15\x55\x55\xd7\xad\x7a\xc6\x76\x78\x4a\x44\x15\x49\xb0\x25\xc5\x10\x64\xd3\xcd\x2c\xe8\xbf\xa9\xc1\x67\x6a\x0d\x9e\xba\xf1\xd1\x8c\x30\x61\xb4\xdd\x33\x61\x2c\x73\xe8\x3f\xf3\x8e\xad\xea\x8a\x63\x0f\x6b\xda\x38\xe4\x78\xdb\x56\x55\xc5\xb6\x0c\x55\x1d\x06\x61\x1d\x55\x2c\x2f\xc1\x49\xa0\x07\x9c\x06\xe6\x81\xf3\x81\x0a\x00\x64\x22\xd1\x12\x1a\x4f\x39\xec\xb5\xcf\x9c\x0b\x67\x76\x52\x74\x10\xaf\xc8\x75\xcf\x6c\xef\x69\xf7\x3f\x41\xce\x4f\x10\xb5\xf6\x4d\xf3\xee\xbe\xf4\x8a\xa7\x07\x22\x07\xff\xbd\x23\x14\x39\xba\x24\xb3\x92\xcc\x32\xc5\x3c\xaa\x3b\x63\xf2\xa8\xed\x98\x3c\xe3\x70\x15\x24\x6b\xa3\x66\x95\x1b\x71\xc6\x9c\x06\xa8\x5a\xba\xe3\xe6\x5d\x53\xb7\x5c\x58\xb1\xac\xba\x33\xce\xba\x3c\x1c\x9e\x04\x58\xc4\x98\xaa\x69\xfa\x52\x87\x29\x52\x1c\xaa\xe9\x96\xa4\xd8\x8a\x6e\x8e\x64\x46\xbd\xc1\x11\xc6\x65\x04\x03\x02\xd9\x1b\xa2\x18\xd1\x1b\x15\xd8\x7c\x5e\x71\xc5\x49\xa0\xc8\x0a\xc5\x73\x96\x00\x15\x34\x22\x41\x09\x8d\x8e\x49\x9a\xa5\xcb\x43\x92\x6a\x69\xf2\xa8\x82\xc6\x26\x81\x3e\x9e\x1d\xe5\x15\x4b\x14\x65\x4d\x33\x55\x75\x70\x84\xe7\x78\xcb\x94\x35\x2d\x6f\xca\x6a\x35\xc1\x7f\xc7\x61\xbb\xe1\xb5\xb4\xdd\x1a\x9e\x85\xfe\x38\x11\x53\xb2\x0a\xe5\xca\x27\x5a\xcb\x89\xfd\x9b\x7d\xf8\xb6\x9f\x4e\xd1\xf5\xdf\xc2\xe7\xb0\x01\x87\x3c\x9c\x92\x79\x01\x0f\x3c\x94\x7e\x47\x30\x96\x73\x07\x48\x9d\x59\x55\x2e\x49\xe8\x31\x29\xa5\x97\x1e\x8c\x65\x9a\x1e\xae\xe1\xaa\xf7\x95\x69\x0f\xb4\xe4\x57\xba\xff\xfe\xb4\x1d\x83\x65\x54\x79\x2f\xd6\x8a\xdb\x9f\x8c\x65\x02\x29\xef\x0e\xa4\xfd\xe6\x90\xef\xee\x6b\x2d\x1f\xb7\xf7\xc6\xf0\xd3\xb1\xbd\x72\xed\x53\x9f\x44\xbf\x99\x44\x67\xbe\x75\x46\x36\xd8\x0d\x52\xd6\x6e\x7f\x6f\xca\x3a\xf0\x3b\xb6\xbd\x09\x40\xa1\xbc\xfc\x5f\x91\x14\x23\xe7\xbc\x1b\xd7\xd7\xd8\x31\x0f\x34\x79\xc4\xe7\xfb\x43\xc0\xa1\xe0\x93\xe0\xe4\xf0\x96\x6c\x27\x9d\x6b\x0f\x1b\xd1\xf9\xcc\xfe\x3e\x24\x4f\x1e\xe0\x4c\x2b\xb5\x97\x28\xc7\x55\x2c\x47\x37\x15\x68\x64\x68\xd7\x6d\x7c\xeb\xa0\x34\x2d\xd9\xbc\x68\xc9\x9a\x35\x44\xfd\x72\x55\xe3\xbb\x8e\x93\x99\xd5\xf8\x6e\x9b\xc5\x57\x2b\x0d\x31\xc3\x18\xaa\x03\x39\x78\xd1\x81\xbd\xb9\x45\x53\xc8\x55\x91\x65\x45\x57\xd4\x8a\xb7\xca\x9b\xfb\xa5\xbb\xa9\x1f\xa0\x79\x70\x4e\xcb\x7d\x34\x63\x1f\xea\xc2\xdc\x3a\xda\x02\x0c\x28\x01\x29\xea\x0d\x79\x30\xcf\x08\x03\xc2\x58\x4f\xa2\x3b\x2d\x3e\x94\x68\x2f\x35\x2f\xd7\x94\xe0\x60\xe4\x13\x55\x44\x45\x4d\xfa\x44\x02\x6f\x8b\xb2\xa1\xab\xf6\x68\xe3\x11\xea\x4c\xef\x59\x6a\x29\x3c\x93\xba\xcd\x7b\x94\xfa\x9c\xb7\x9a\x7a\xc6\xbb\x16\xbe\x00\xcf\xfc\xdb\x24\x40\x75\xf4\x22\x7a\x0b\xbd\xb5\x03\x3e\x0b\x7b\x3c\x83\xda\xee\xbd\x48\x5b\x2d\x1c\x23\x59\x56\x4c\xa3\xa6\x6a\xa3\xde\x67\x6f\x5f\xf6\xc5\x2f\x2e\xbb\xfd\x8a\x5b\xae\x39\xed\x92\x25\x57\x5e\x32\x0f\xdd\x05\x1f\xac\x2c\x59\x76\xf3\xeb\xd7\xdc\xd2\xca\x47\x59\x99\xa6\xf1\x5d\xff\x81\xf3\x32\x4e\x8d\x35\x19\x1d\x7d\x07\xb2\x58\xf2\x7f\x02\x9c\x0c\xe6\xe1\xa8\x58\xdc\x37\x79\x3a\x96\xf6\xed\x5d\xcd\xcb\x7c\xef\xef\x5d\x62\x40\xc5\x92\x6d\xc9\xca\xe6\x6d\xc5\xd2\x74\xef\x05\xdb\xf6\xee\xce\xd6\xec\x03\x43\x59\x61\x82\x69\xab\x1f\x18\x76\xff\x1d\xe4\xb5\xe5\x0d\x5b\xb1\x4d\x59\xb6\x4c\x4d\x37\xbc\x3f\x3d\xd2\x18\x91\x6c\xd7\xb6\xdb\x2a\xef\x87\xa4\x38\x9f\xc5\xa7\x77\x7c\x0f\xb2\xff\x5e\xd0\x3c\x87\x0e\x74\xf6\x4b\x00\x14\xba\xf7\xdd\x00\x80\xf7\x6e\x81\xde\xbf\x39\x2d\x53\x96\xe3\xbe\x7a\x04\x5c\x4e\xd0\xd6\x3d\x07\xb1\x57\xee\x4e\x8f\x13\x3e\x7f\x57\xfa\xf9\x1d\x27\xe1\xfa\xc9\xc1\xaf\xee\x6c\x39\xd6\x1d\x07\x91\x4f\xb7\x03\xf2\x9c\xaf\xf9\xbc\x91\x86\x6f\x3d\x2a\x65\xdf\x87\xe3\x2c\xc7\x5d\xe9\x5b\xc8\xea\x60\x1c\x1c\xbb\xc3\xb9\xb5\x58\x96\x81\x5c\xdc\xe1\xb9\x0b\xf4\x80\x33\x01\x80\x61\x39\x00\x18\x5c\xb7\xee\xea\x2d\xb5\x77\xc1\xde\x52\x47\x77\xa9\xa3\x94\xed\x28\xf5\x76\xfa\xcc\xf1\x81\x7a\x52\x3a\x60\x64\xab\xef\x55\x33\x87\xa2\x11\xbb\x0d\xd8\x68\xc4\x86\x83\x68\xc4\x46\x23\x90\xf3\x3f\xb6\xff\x9f\xc6\x81\x0f\xd6\x89\x6d\x8a\xdd\x10\xed\xb6\xd1\xc6\xeb\x0a\x55\xf1\x14\x05\x59\xd4\xb0\x61\x18\x86\xee\xff\xaf\xed\xb6\x83\xab\xbb\x28\x7f\x98\xb4\x7b\x3a\xc0\x91\xe0\xf8\xc0\xea\x69\x8f\x63\xdf\xf8\xa0\x92\x38\x9a\xfc\x20\xaf\x03\x0a\x59\xeb\x80\xe1\xb6\x49\x13\x83\xd1\x07\x0a\x5a\x1d\xf1\x22\xb4\xa9\x3a\xe4\xa1\x22\x23\x07\x0d\x7a\xe2\x07\x7b\x19\x6d\x7c\x43\xa7\x4c\x03\xd9\x06\x72\x0c\x34\xa2\x5b\x8a\x2d\x1a\x82\x69\x3b\x22\x6d\xbc\xaf\x13\x91\xce\x23\x6a\x15\xc7\xa8\x06\xb5\xd2\x36\x13\xfe\x22\xa9\xef\x6e\x6d\xed\xbf\x56\xc5\x29\xf1\x93\x3b\x08\x5a\xfe\x52\x32\x06\x10\xd8\xba\xcf\xe3\xca\x24\xcf\x9f\xdb\x92\xde\x6e\x21\x78\x0c\xd3\xad\x7b\xc1\x94\xf9\x12\x74\xbe\xf9\xda\xb4\xbe\x0b\xe0\x95\x9f\xb7\xa6\xe7\xf5\xda\x14\x1d\x1c\xf0\xd1\x17\x5b\xeb\xe0\xfe\x2f\xa4\xc7\x19\xf8\x63\x8a\x8f\xf4\xc4\xf3\x9f\x3f\x08\x1f\xe9\x98\x8f\x72\xb1\x7c\xf5\x69\xec\x30\xd0\x09\x3e\x01\x4e\x02\x73\x03\x0a\xc3\xed\x99\xdb\xbb\x82\xc0\x71\x27\x0d\xb2\xdd\x27\xc2\x2c\x41\x63\xef\xc3\x3f\x70\xbc\xad\x38\x31\x66\x53\x75\x8f\xc9\x8c\xb9\x0d\xc5\xa5\x38\x5c\x96\x41\x96\xa1\x03\x25\x08\xa0\x09\x65\x01\xd9\xc8\xf1\xf4\x7f\x87\x87\x90\x66\x3a\xc8\x42\x02\x94\x90\x0b\x47\x47\xd8\x51\x34\x2e\xd8\xdc\x08\xa3\xda\x96\xab\xd0\xe2\xfb\x71\x51\x42\xae\x86\x6b\xbf\x19\x90\xe7\x0b\x4d\xbb\xe7\xa6\x50\xb6\x84\x75\xae\x40\x27\xf8\x24\x38\x06\x9c\x02\x7a\xc1\x2c\x70\x4e\x50\xe5\x20\x68\x7f\xdd\xd6\x6c\xf6\x8e\xf3\x45\x3a\x71\xcf\xeb\x63\x32\x81\x03\xd2\x8c\x0f\x4c\xf7\xf9\xb2\x0f\xe7\x8b\x74\x7f\x90\xa1\x92\x11\x0c\x9e\xcf\x70\xc3\x23\x50\x83\x86\xe2\xd5\x91\x8b\x34\xc4\xf3\x50\x87\xb2\xad\xeb\xba\x01\x4d\xc5\x1d\x1a\xae\x78\x7c\xfe\x9b\x6d\x73\x26\xbe\x0d\xdf\x74\x15\x53\x12\x59\x45\x16\x50\xc5\x18\x42\x75\x6d\x3c\x33\x02\x41\x5d\x1a\x1f\x6f\xb8\x1f\x6c\xd7\xb4\xbd\x24\x72\xac\x6e\xc8\x12\x67\x4b\xba\xc5\x59\xac\x2c\x88\xa2\x60\xb8\x8a\x24\x8a\x32\x3a\xd2\x81\xbc\x67\xeb\x0a\xe3\x16\xa5\xbf\xaa\xae\x66\xc9\xa6\x6c\xd8\x96\x4c\x1f\x72\x50\x83\xa7\x95\x2e\xb8\x31\xc6\xf3\xd9\xbe\x8d\x13\xda\xc8\x0b\x97\x3f\xf3\xe1\xb6\x79\xaf\xcf\xf9\xaf\x96\xb6\xe7\x0d\xad\xf8\xa7\x40\x2f\xdf\xdd\xd2\xbe\xa5\xfb\xaf\x6f\xcd\x6f\xfd\xd7\xa5\xfd\xe3\x10\xbe\x6c\x0a\xff\x9c\x96\xe2\x9f\x50\x97\x6e\xdb\x4b\xc8\x0d\x0d\xdb\x22\x7a\x68\x8f\x06\xfa\x86\x07\x22\xb8\x32\xca\xfd\x8e\x1d\xb7\xbe\x69\xf1\xc9\x6a\xc8\x41\x69\x01\x3c\x3d\xed\x86\x46\x07\x2e\x38\x19\x9c\x08\x2e\xe5\xba\xfb\x66\xb6\x77\x65\xbe\x07\x59\x07\x56\x54\x4b\x90\x58\x45\xe0\xd9\x3c\x1a\x2f\xa2\x61\x1d\x82\x22\x1a\xfb\x78\x86\x6f\x0c\xdb\x54\xd1\x1b\xf3\x16\xb9\x45\x16\x8e\xa2\x71\xae\xe8\xb0\x82\xad\x1a\xfa\x48\xa6\x6a\xf3\x94\x80\x6a\x3c\x6b\xf3\x92\x2d\xaa\xe6\x60\x03\xbc\xb3\xfe\x77\xbf\xfb\xfa\xc7\x3e\x77\xe3\x82\x1b\x6f\xfa\xec\x31\x9f\xbb\xe9\xf8\x1f\xcc\x7a\xf8\xde\x77\xe0\x5b\x96\x85\xa4\x4a\xd1\x2a\xca\x10\x20\xcb\xd6\x0d\xc8\x52\xbf\x47\xaa\x59\xa1\xbe\xcb\x0a\xbc\x29\x8a\xbc\x2a\x6b\xb2\x61\xd5\x38\x35\xfa\x8b\x66\xa3\xf6\x97\x5f\x5e\x81\xfe\x30\xff\xc1\x53\x8f\x43\x5f\xbe\xe5\xb2\xd2\xda\xe3\x2e\x83\xed\xf3\xd7\x1e\x5f\x82\x4b\x12\xf1\xc0\x90\x16\xae\x25\xf0\xeb\x10\xb6\xcf\xd2\x96\xb1\x9e\x72\xe5\xbb\xd8\x42\x3c\xa9\x85\x8f\x55\xde\x86\x4f\xc8\xfb\x3f\x87\xbf\xd3\xe3\x98\x34\x1e\xef\xf9\xc7\xd2\xf4\xb0\x05\xdf\xbd\xd8\x1d\xe5\xf3\xa6\x9e\xef\xbf\x26\xf6\xbf\xa2\xbe\xc1\x01\xfc\xea\xf8\x79\x99\x7c\x7e\x0b\x8e\x6d\x83\x2c\xe8\x9e\xec\xc9\x7d\x96\xb6\x40\x37\xf6\xe0\x17\x80\x25\x81\x74\x68\xeb\xcc\x1d\x3b\xbd\x23\x99\xed\x11\xfd\x83\xcf\x6b\x8f\xe8\x0c\xef\xed\x04\x89\xac\x19\x82\x18\x0e\x83\x2d\xd4\x75\xb6\xbe\xf3\x41\x1b\xf2\xfd\x36\xfa\x3b\xba\xff\x6a\xe3\xea\x4b\x4e\xbc\xe6\xea\xcb\x1b\xa3\xd9\xbe\x89\xa1\x36\x61\xe2\xd2\xec\x02\x78\x74\xe3\xc7\x8f\xf6\x6e\x99\x38\xf0\xd0\xb9\xcb\xcf\xbb\x9d\xca\x95\xd0\x7a\xf4\xce\xcd\xf0\x1b\xcb\x5d\x01\xfe\x09\xfd\xf1\xdc\x13\xed\x13\xef\x56\x2f\x70\xee\x1e\xcb\x7c\xdd\x2a\xb2\xd4\x69\x68\x97\xf0\x1f\x4f\xce\x5e\x62\xdc\xb5\xc4\x1c\x85\xaf\x2e\xbc\x79\xf1\x8d\x97\xdd\xfc\xdc\xcd\xdf\xbf\xea\xdc\x8e\x07\x3b\xce\x85\x6f\xdf\xfa\xa5\xdb\xb4\x2f\xa1\x99\xb7\xbe\x70\xf8\x51\x97\xde\x7a\xc1\x55\xf3\x2e\xbd\xf4\xc9\xbb\x07\x16\xdf\x75\x33\x9d\x3b\xf1\xae\x07\xd4\x8b\xcf\x30\x0d\xcb\xfd\xfc\x1b\x90\x39\x69\xfe\xe9\x0f\x2c\x3e\x4f\xbe\x5f\xdb\xa5\x5e\xf5\xa3\xa9\x31\xad\x70\xd7\xff\xb3\x65\x1c\xef\xaa\x34\x2d\x84\x4f\xab\x53\x78\x19\xfb\xd4\xfd\x57\xb6\xde\xbb\x7d\xc3\x07\xd1\x6d\x57\x4c\xf1\xcd\x31\x4d\x6d\x9f\xc0\x5e\xec\x3f\x92\x31\x83\xf0\x37\x97\x13\x71\x33\x62\xac\x2d\xa5\x83\xbc\xe3\xb3\x69\x5b\x3a\x9c\xeb\x65\xe9\xb5\x85\xf0\x4b\xd3\xfa\x79\xf7\x6f\x12\xf6\x4d\x6a\x6d\x5b\x5e\x3e\x88\x5c\x8b\xce\xc0\x2f\x98\x3c\x3c\x77\x27\xfd\x80\x3f\xfe\xdb\x13\x85\xf2\xf2\xaf\x4e\xfc\xa8\x40\x6f\xff\xc7\xc4\x8f\xa6\xce\x75\xcb\x4b\x44\xcc\x20\xf6\x3b\x0a\xe5\x6d\xf8\x54\x7d\xf9\x86\xe4\x7b\x42\xfa\x57\xd2\xe7\x1c\xe1\xfb\x2f\x3e\x08\x3e\x2e\x9a\x62\xaf\x04\xeb\xbe\xb0\xb5\x1d\xb3\xe5\xf2\xb4\x3c\x0f\x7c\xff\xfe\x25\x07\x59\xf7\x05\x53\xf0\x1a\xc0\x3f\x13\xe3\xcf\x20\xf0\xb7\x70\xe3\x77\xe9\x77\xe6\x7d\x61\xce\x37\x92\xef\xc0\xd1\x90\xf2\xc6\x07\x63\x89\xef\xdb\x3f\xe7\xe6\x1c\xda\x06\x87\x83\x22\xce\x17\x9c\x0d\xce\x03\x57\x84\x9a\xbe\x29\xd4\xdb\x71\x32\x69\xb6\xbd\xd4\x9e\xed\x2d\x7d\x82\x2a\xf5\xc2\x52\x07\x1d\x54\x97\x21\xf2\x08\x7d\x2e\xef\x9b\x59\xca\x24\x0e\x33\x5b\xe9\x7a\x8a\xdf\x3a\xed\xa8\x36\xf6\xbe\xea\xe5\x5f\x9e\xfe\xad\x73\x44\xa1\x71\xfc\x05\x37\xdf\xfe\xed\xcc\x92\xc6\x5f\xa8\x2f\x21\x0e\x8e\x78\xc7\xb5\x55\x86\x27\x41\x86\x6d\x8c\x6a\xba\xae\x33\x8a\xae\x36\xec\x8c\x3e\xe8\x34\x0c\xc9\x62\xf2\x14\x83\xea\x6c\xd1\xe6\x04\x5b\x60\x45\xa3\x92\x31\x9d\x3c\x43\x69\xa8\x26\xda\xbc\x38\x28\xa9\xaa\x93\xbd\xe7\xa8\xe3\x8f\xf3\x5e\x7d\xfd\xd0\x9b\x3f\xea\xc0\xa7\x97\xcc\xd5\xb4\x2f\x23\x05\x56\xb6\xce\x9b\x77\xe9\xbc\x79\xe8\xc5\xbb\x97\x9c\x7b\xe8\xad\x15\x61\xee\xe1\xb7\x75\x74\x3c\x75\xeb\x92\xff\x10\xda\xfe\xce\xb1\xac\xc9\xb2\x8a\x2c\xc9\xbc\xa0\xda\x2e\xcb\x16\x4d\x51\x91\x25\x5d\xd4\x8d\xb4\x5d\xbe\x25\xa1\x2f\x43\x9d\x58\xb8\xb6\xf2\x49\x00\xd0\x72\x11\xcc\xbe\x2a\xa4\x2f\xfa\xb9\x87\xc3\x38\xce\xcd\x93\x67\x60\xbd\xf9\x21\xf0\x51\x7c\x63\x6a\x01\xb8\x00\x00\xd8\xce\x64\xba\x0b\x1f\x83\xa5\x76\xec\x99\x1d\xd1\x19\xdd\x14\x28\x85\x85\x42\x4a\x61\x56\x66\xa9\xb7\x0b\x67\xbd\xf4\x96\x3a\x20\x4e\xec\x6d\x8a\xcc\x29\xaa\xf4\xb7\x3f\xda\xfa\x9d\xec\x6b\x95\x89\x47\xdb\x6e\xf3\x3a\x2e\xba\xf8\xcd\x33\xfb\x5e\x98\x71\x16\xbc\x0a\x7d\x03\x3e\x8b\x96\x6e\x43\xaf\x95\xd1\xab\x3a\xcc\x7c\x02\x0d\xc0\x4b\x3d\x58\x28\x5f\x48\x49\xe8\x35\x6f\x58\x72\xb5\x9a\xe6\xf2\x70\xdc\x57\x9f\x36\x27\x50\x8a\xcb\x52\x3a\xaa\xf9\x7f\x11\x87\x04\x59\x35\x32\x67\xa0\x7f\xa2\x97\xd1\xb9\x73\xe1\xa3\x70\x09\x75\x1d\xba\xf3\x6f\x9f\xbf\x53\xba\xff\xa2\xeb\x3a\x2e\x3f\xcf\x72\x6c\x74\x1b\x7c\xf4\x9d\xb5\xfa\xad\x9b\x6c\xc7\x3a\x53\x42\x4b\x1c\xa7\xad\x6c\x18\x86\x33\x16\xe9\xcb\x71\x56\x31\x05\x81\x57\x24\x45\xd4\xf5\xb4\xbe\xc3\x7c\xb2\xb9\x2f\xcd\x57\x1b\x71\xdf\xca\xdd\xcd\x18\x89\xd2\x7c\xbe\x40\x6f\xd8\x40\xc4\x0c\x82\xe7\xb7\x26\xf6\x25\x86\x6f\xf9\x47\x6b\x3f\x7b\xc3\xf3\x2d\xe1\x4b\x37\xe5\xc1\xb8\x08\xe6\x1c\x5d\x68\xea\xcc\xa6\x5d\x77\x83\xff\xee\x00\x4e\xd8\x43\x87\x83\x63\x71\x0e\xde\x99\x58\x0b\xe2\x7c\xa5\x63\xa7\x27\xea\xa0\x4d\x0b\x2f\xc8\x45\xc9\x4a\x19\x7f\xf3\xfb\xa6\xf5\xf9\xdb\x8f\xad\xe6\x0f\xd8\x58\xea\x84\xb6\x6d\xde\x5d\x9f\xbf\x0d\x0a\x70\xc6\x59\xda\xcd\x8b\x6f\x6c\xe7\xd0\x5d\xe8\xb8\xae\x7d\x37\xa3\x3b\x3e\x01\xc7\x1f\xa4\xf2\xde\x38\x75\xe7\x81\x67\xa9\x6b\x51\xfe\xf3\xdb\xef\xcb\xdd\x78\x4a\x76\xd0\x9a\x50\xda\x2a\x13\x67\x7c\x7a\x55\xbc\xb9\x27\x1e\x6e\x1f\x75\x66\xb4\xb9\x3c\x63\x7f\xec\xfc\xa1\xf9\x0b\x55\x83\x42\x77\xad\x3c\xbb\x30\xfd\x0a\xfe\xd1\x2d\x33\x4f\x9d\xcb\x1f\x79\x93\xfa\x38\x3a\x4f\xd7\xef\xec\xbf\xe5\x96\xfe\x4c\x1b\xfa\x01\x5a\x86\xf6\xc9\x10\x4e\xbb\x0d\x1e\x47\xd9\xe8\x21\x48\x3d\x06\xbf\x66\x98\x78\x7b\x8d\x19\x67\xf2\xb2\x52\x67\x15\x63\xc6\x0c\x5e\x11\x15\x49\xd7\x31\x4f\x98\x4d\x59\x54\xa0\x37\xfd\x79\x4a\x7c\x65\x3a\x61\x5b\x7e\x3a\xe4\x23\x9e\xfc\xcd\xc6\x7f\x1c\x44\xce\xca\x84\x5c\x26\xe4\xf5\xc6\xe6\x79\xeb\x15\xe1\x38\xb3\x01\x28\x2c\x3c\xfa\x35\xf0\x23\x11\xf4\xdc\x8e\xbf\xbb\x39\x38\x47\x09\x65\xed\xa2\xcd\x92\xb7\x64\xf2\x8d\x0b\x5e\x3d\xb5\x83\x94\xb7\xcf\x3d\x84\xcf\xa4\x9a\x32\x32\x8b\x6d\x20\x17\xfb\x88\xfe\x3e\x9f\x01\x3e\x1d\x74\x7c\x9b\x19\xb4\x72\x4b\xa5\x18\xc5\x9f\x99\xbe\x2f\x84\x1b\x37\xb5\xf7\x74\x7c\xb0\x19\xac\xe7\xf8\xf1\xe1\x4a\xb6\xe6\xc9\x7c\xa6\xa8\xa9\xa2\xc2\x19\x22\x8f\x46\xdc\xe0\xff\x94\xc8\x7b\x36\xf5\xec\x26\x8a\x59\x7d\x80\x59\x4d\xe5\x10\xfd\x6f\xd8\xbb\xd4\xa8\x65\x3d\xf4\x38\x9a\x71\xc9\x25\xf9\xc7\xf3\x67\xc3\x63\xd0\x02\xf8\x12\xfe\xe4\xa8\x7b\x1e\xa7\x1c\x34\xfc\x2b\xf4\x34\xbc\xe1\x57\xef\x67\xe5\x26\xf7\x20\xc4\xf5\xed\xe9\xbd\x09\xe1\x3b\x5a\xed\x59\x81\xae\xee\x26\x78\xd2\x6d\xda\xb1\xfb\x7e\x88\x77\xf4\xfc\xe4\x6f\x02\xbf\x63\xdb\xbe\x08\xff\xa4\x6e\xab\x7e\x35\x25\x13\x12\xb1\x7e\x1c\xe9\xa0\xfb\xcf\x9b\x6a\xdf\x14\xe8\x8d\x6b\x0f\x12\x2b\x3c\x77\x8a\x1d\x83\xc7\xda\x8c\x6f\xc5\xf6\x2f\xc6\xdf\x2d\x25\x65\x55\xa1\xec\x5b\xde\x05\x7a\xf9\xd6\x77\x5b\xd8\x2d\x9b\x3e\x4b\xd8\x1a\x15\xc2\x0e\x38\xe7\x20\xfe\xdb\xd9\xe9\xf3\x8c\x0d\x5a\x2a\xee\xa3\x87\xcf\xaf\xc0\x77\x9f\x03\xeb\xe4\x53\xe1\x59\x0a\x93\xb3\xe9\x4a\xa1\xbc\xe1\xaa\xb1\x91\x82\x8f\x17\x36\x8c\x0d\x8a\xb9\x8d\xb4\x05\x3e\x19\xde\xd2\x9d\x03\xe6\x83\xcf\x80\xab\xa3\x6c\xca\xc4\x3f\x61\x7b\x94\xce\x5c\xa9\xdc\xdd\xd9\x5b\xca\x75\x64\x7b\x4b\xf8\x93\xe9\xea\xc5\x15\xd0\x9b\xae\x7e\x16\xa7\xa0\x7e\x50\xe8\xa3\x6d\xfe\xd1\x45\xea\x07\xde\x42\xea\x32\x6f\x0b\xfe\xfc\xe2\xc0\x8e\x75\xe2\xf9\x17\xa3\x9b\x1f\xee\x84\x77\x1d\x56\x9c\x87\x4e\x2c\xc2\x77\xd0\xe1\xfe\xe7\xb0\x5d\xd9\x25\xf7\xec\xfa\x2b\x9c\x33\x13\x5d\x80\x76\xa0\xbb\xbc\x77\x2e\x86\x6b\xe0\xc9\x5f\x83\x2f\xbd\xf6\x88\x37\x77\x1d\x9a\xf3\x6f\x04\x47\xb6\xce\x98\xad\x9d\xa7\x9f\xf7\xf9\x73\xb5\x2e\x78\xf7\xc2\x9e\xc7\x5e\x1e\x3e\xb1\xe7\x98\xae\x89\xf3\x4e\xe8\x7a\xf9\xbc\xf3\x5e\x3e\xf7\x5c\x54\xbb\xef\x76\xed\xac\x63\x0a\xab\x8f\xb9\xf8\xca\x13\x56\x77\x9d\x70\x56\xfb\x09\x73\xe6\xd0\xe0\x83\x62\x26\x5a\xd2\xef\xe9\x97\x08\x3b\x35\xa8\x35\x6c\xa6\x68\x31\x61\x27\xae\xac\x1c\x44\x7e\x2d\x02\xa9\x33\xf9\x7d\xe7\x10\xb2\x70\x61\x2b\x5b\x74\xc3\xe2\x74\x0c\x2e\xa0\xd1\xea\x02\xff\xdb\xea\x99\x49\x7d\x1a\xd8\x78\xe1\x78\x67\xc5\xbf\x73\x09\x5a\x3c\x33\xed\x73\x86\xb6\xe7\x82\xb4\x8d\xb9\x61\x69\x62\x8d\x31\xad\xbb\xbf\x9e\xc2\x87\x81\x0e\x7e\x32\xa1\x53\x95\x04\xbf\xd3\x1b\x8c\x78\x1c\x95\xc4\xed\xca\xcd\xe9\x71\xdc\x9f\xb7\x1e\x7f\xdb\x27\x89\xb5\xcd\x6f\x89\xdf\x33\xd2\x7c\x1e\xac\xcd\xad\x10\xf6\x9a\x1b\xc3\xcb\x1b\xb0\x4f\xd4\x2f\x86\xf8\x50\x49\x1b\xe3\xf1\x5e\x22\x86\x42\xec\x87\xbb\x6a\x0a\x6f\xae\x24\xe6\x35\x0f\x7f\x77\xe9\x64\x2f\x3e\x23\x5c\x5a\xad\x1d\xb2\x43\xfc\xfc\x4c\x93\x59\xba\x7b\xf1\xf1\xbf\x9e\x73\xd3\x8c\xdf\x63\x4e\x4d\xf0\x7c\xf8\xcb\xb9\x29\x9b\x32\xda\x97\x39\x31\x5c\x48\xe0\x6d\xf9\x14\xdf\x29\x78\x7e\x36\x21\x53\xaa\x4d\x79\xbb\x73\x17\xfe\x76\x56\x8c\xb7\x6a\x2c\x1f\x83\x53\x49\x7a\xf9\xd1\x29\xfa\x0b\xc6\x3b\x9d\x78\x7f\xb5\x89\xbb\x70\xbc\xd3\x42\xdc\xc9\x89\xdf\x08\x09\xdc\xd9\x85\xf2\xc0\x89\x18\x8e\xfb\x44\xe0\x9c\x06\x2c\x9f\xc1\x11\xb8\xe7\xe1\xb1\x80\x03\x27\x81\xc5\xe0\xb3\xe0\x86\xe8\x7e\x52\x57\x64\x06\xf7\xf6\x04\xc5\x3f\x32\x3d\x33\xbb\x4a\x87\xe7\x4a\xbd\xb0\xa7\x6f\x66\x57\xc9\xff\x03\x9d\xeb\xe9\x25\xc2\x47\x89\xe8\x11\x1d\x84\x8f\xde\x2f\x25\x00\xfb\x34\xc5\x0a\xc7\xc3\xb1\x3a\x14\x51\xcd\xf1\xf4\x21\x43\x44\x23\x90\x15\x87\xeb\xf9\x71\x68\xe5\x21\xeb\xa9\xc3\x4c\x7e\x0c\x1a\x0c\x14\x90\xcb\x2a\xa3\x07\xc6\xc7\xdc\x5a\xad\x5a\x1c\x92\x55\x4d\x65\x35\x8d\xd3\x0c\xc1\x31\xc7\xc6\xff\x8d\x90\x63\x8d\x17\x78\xcf\xaa\x59\x68\x14\xb2\x96\xac\x53\x86\x84\x6a\xba\x20\xe8\xc8\x11\x44\xc3\x98\x04\x8a\x56\xa3\x8a\xa3\xa3\x36\xaa\x8b\x96\x8c\x6c\x43\x61\x5d\x4e\x85\x0c\xc7\xba\x1c\x07\x85\x8c\xfc\xbe\xb1\xc7\x26\x0d\x3c\x9c\xe2\xd9\x04\xcd\xec\xfe\x4b\x6b\xdd\xdd\xdf\xd7\xd2\x4f\x2d\xef\xc0\x19\xe6\xfd\xbd\x2d\xe9\x6c\x46\xfc\x0e\x2e\x01\xef\x39\x48\x4c\xff\xd4\x29\xf4\x1d\xcc\xe9\x2b\xe9\x77\xef\x7c\xbb\xc9\x4f\xdb\x5f\xc7\xdf\x9d\x3f\xb9\x38\xb7\xa1\xe9\xdf\xae\x7c\x04\x82\xb9\xff\x37\xf7\xd3\xb1\x9c\x21\xc7\x5b\x46\xac\x9d\x3c\x67\x6c\xf6\x22\x10\x48\xdf\x63\x45\x7f\x78\x16\x20\x4f\x1e\x9d\x7b\x98\xee\xc7\xa7\x4d\xd3\xc0\xb1\x60\x06\x90\xc1\x52\xdf\x53\x0b\x8e\xd0\x3b\x4b\xbd\xa5\xee\x9e\x76\x06\x76\x83\xf6\x69\x1f\x18\xd5\x0c\x72\xcc\x3b\x0e\xf7\xff\x4d\xf9\x4e\x40\x57\x6f\xcf\x8c\x99\xbd\x5d\xbd\x3d\x7d\x61\xfe\x79\x48\xe0\x5d\xbd\x3d\x18\x4a\x7f\x7f\x60\xc2\x1b\x18\x68\xcb\x4c\x78\xeb\x9e\x41\xbb\xee\x80\xa7\x0a\xeb\x8b\x2c\xfc\x15\x9a\xe8\x2e\xae\x3a\x5a\x78\xe2\xca\xdb\x6e\xfe\x59\xa6\xf2\x04\x4f\xcd\x40\xdf\xe2\xd9\x27\xf8\x45\x4f\xcc\x53\xef\xfd\x1a\x5a\xbb\xed\xe4\xbe\x91\xa1\xfc\x1f\xdf\xed\x43\x6f\xdf\xf2\xb7\x93\x7f\xfd\x6e\x7e\xe4\x9b\x7d\xd4\x0f\x37\x76\x9f\xfc\xaf\x7f\xc1\x13\xd1\x4f\x9f\xfd\xeb\x5f\x7f\x3d\x72\x72\xf6\xa3\xe8\xd2\x33\xcf\x84\x03\x7f\xbf\xdd\xf1\x00\x2a\xa1\xd7\x2f\x86\x47\xc2\x35\x6d\xea\x51\x3d\x27\x7c\xe1\xf4\xd3\x4e\xb8\x48\xba\x5c\xba\xfe\x8e\x9d\xc7\x5e\x14\xfd\xe5\xf2\xfb\xbc\xdf\x9f\x70\xcd\xf9\xf7\x6d\x39\xea\x13\x16\xfa\xc9\xca\xeb\xbf\xf8\x07\xeb\x84\x13\xac\xfb\x6e\xf8\x82\x0f\x7c\xcb\x42\x67\xc3\xaf\x5a\x6f\xdd\x77\x43\x4b\xdb\x09\x67\x3c\xd1\xfd\x7c\xcc\xff\x2e\x41\x1b\xa7\xa4\x65\x67\x65\x77\x73\xaf\xf7\x3f\x9d\x1c\x6f\xf3\xa3\xcd\xef\x7c\x8b\x2c\x41\xcf\xc1\x78\x27\x1f\x24\xae\x79\xd2\x14\x3b\x2c\x90\xb1\x27\xa6\xf5\x6f\x60\xef\x87\xdf\x9e\x90\xb4\x53\xc3\xb1\x9a\x75\x0a\xc2\xdf\x84\xef\x3e\xae\x35\x3d\xf5\x73\xe9\x77\x84\xe3\x74\xc7\x67\x4e\x81\xdf\x78\x24\x38\x01\xcc\x06\x2a\xb8\x06\x68\x58\xee\xf5\xf4\xf5\xf6\xe4\x4a\x0c\x45\x84\x5d\x0e\x81\xb9\xee\xbe\xc2\xb4\xf7\x4d\xf3\xe8\x88\xa3\xe8\xa5\xb0\xf3\x5d\x57\x47\xea\xa2\x50\x7b\xa9\xb7\xab\xb7\x0b\x9b\x75\x61\x5f\xd8\x36\x66\x3c\xef\xe6\x61\x95\x53\x75\x5d\xe7\x2c\x93\xe3\x50\x9d\x75\x1c\xd3\xb2\x8b\x75\xaf\xf2\xc1\x76\xd7\xc4\x78\xd5\x86\x8c\x6d\xdb\x43\x50\x42\x83\x50\x41\x15\x07\x29\xb0\x82\x06\xa1\x34\x5c\xa5\x64\x54\x37\x06\x07\xa1\x3c\x98\x71\x55\x6d\xc8\xab\x22\xdb\x64\x5d\xb6\x4a\x29\xc8\x40\xaa\xa3\x99\xd0\x84\x4a\xc6\x3c\xb8\x0d\x86\x2c\x45\x91\x65\xa3\xae\x22\x5b\x33\x47\x46\x4c\x0d\xea\x6a\x5d\xd7\x75\xc4\x99\xa6\xd9\x2a\x9e\xd6\x5f\x9e\xe2\x63\x6c\x21\x7c\x8c\xa0\x17\xe7\x75\x93\xf3\x73\xbb\xe9\x47\x0b\x4b\x77\xaf\x04\xb3\x45\x30\xe7\xab\xcc\xc2\xbe\xb3\x3f\xfc\xcb\x79\x5b\x66\xfc\x3d\xa6\xa1\x6a\xbc\x5f\xe5\x0d\x87\xe2\xdf\x1e\x1b\xda\xd4\xa7\xe5\x36\xd2\x8f\x82\x6e\x20\x02\x19\x5c\x05\x3e\x07\x96\x81\x1b\xc1\xe7\xf1\x2d\xcf\xde\x9e\xc3\x3b\x7b\xa2\xbb\x9e\x51\x59\xf3\x9e\x53\x67\x76\x52\x5d\xc7\x74\x87\x95\xcd\x4b\xc9\x4e\xbd\xed\xc1\x3f\xfe\x86\x65\x3e\x70\x6b\x83\x93\x14\x7c\xa3\xc9\xdf\xe3\xed\x19\x27\xef\xe4\x87\x79\xc1\x50\x45\xc8\x78\x26\x67\xd8\xaa\x63\x56\x6d\x51\x62\x2d\x6e\xc8\xaa\x9a\x15\xa5\xaa\xbb\x5c\x43\xc9\x5c\x7f\xf9\x15\x5d\x27\x1e\x25\x1e\xdb\xf3\xeb\x47\x5f\xb0\xe0\x82\x47\xff\xf6\xc1\xfb\xda\xd0\x68\x70\x00\x38\x50\x40\x43\x70\x08\x8a\x36\xe4\xa9\x3b\xae\xd2\x6e\xba\xec\xe4\xf2\xac\x45\xd2\x2d\xaf\x6d\xbc\xef\xff\x9d\xd4\xe8\xbf\x65\xe8\xe3\x68\x78\xf5\x92\x45\x57\x9d\xb7\xe4\xbf\xfe\xe9\xa2\xdf\xc8\x17\x1d\x76\xdf\xa1\xa2\x8d\xae\x84\x1b\xfe\x3f\x69\x6f\x02\x1f\x37\x75\x2d\x8c\xdf\xab\xf1\x68\xdc\x0d\xe4\x09\x8e\x07\x0a\x64\x5c\x27\xe3\x29\x90\xa0\x92\xd8\x16\x64\x53\x02\x71\x14\x20\x41\x84\x4d\x40\x02\x82\x04\x47\xd0\x04\x54\x96\xa2\xb2\x8a\x5d\x2c\x06\x01\x59\x44\x42\x12\x65\xb3\x27\x4e\x02\x13\x27\x69\xa7\x5f\x59\xa6\xa5\x94\xe1\xb5\xb4\x43\x57\xbf\x96\xbe\x0e\xb4\xaf\x75\xbf\xb6\xaf\xee\x46\x07\x62\xdd\xf9\xff\x74\xa5\xd1\x5c\x8d\x07\xda\xf7\xfd\x63\xc6\x09\x47\x9a\xbb\x9c\x7b\xee\xd9\xee\xb9\xe7\xa0\x6f\xc3\x17\x37\x6d\x8a\x7e\x6e\xc6\x45\xf7\xcf\x9d\x7b\xfe\xaa\x55\x77\x5c\x79\x65\xf6\xad\x19\xa9\xe9\xf7\xdf\x71\xfe\xaa\x55\xb1\x3b\xce\xbf\x32\x83\xfe\x81\xe4\x7b\x76\xbb\x7f\x3c\x9c\x77\xc4\x14\x57\x4f\x3a\xb8\x31\xf2\x9f\xf3\x9e\x58\x70\x07\xb3\xf8\x99\x5d\x95\x39\x95\xff\x5c\x78\x60\xfe\x89\xa4\x8e\x44\x9e\x47\xed\xe2\x03\xf9\x42\xda\x58\x1d\xc4\xbe\x23\xf7\xef\xe7\x08\xb9\xa3\xd7\x74\x91\x81\x53\x09\xdf\x92\x67\xfb\xbf\x85\x6d\x2c\xbc\xbb\x0f\x7c\x3f\x2c\xab\x06\x66\x10\xf6\x57\x7b\x98\xe7\x0c\x4c\x27\x9e\x25\x1b\xea\x70\x53\xf0\xde\xff\x34\x50\x2a\xcb\x1b\xc4\x72\x4e\x01\xd3\x70\x3c\x27\xae\x25\x10\x5e\x6d\x32\xd6\xa1\xb5\xbd\xab\x9d\x4c\x00\xf2\xaf\xce\x54\x7f\x4e\x9f\xf7\xc1\x11\x13\x5e\x8d\x76\xc0\xdf\xc2\xab\x0d\x78\xf5\x87\xbb\xa3\xcf\x7f\xb8\x7a\x53\xd3\xba\xa3\xcf\x56\x3f\x70\xb1\x8c\xbe\x8e\xbe\x2e\xc2\x35\x11\x1a\xf6\xc0\x1e\x1e\xbd\x8d\xde\x1e\x7f\xf7\xdf\xd0\x67\xb6\x20\xb3\x0f\xaf\x23\xca\x38\xf7\xc2\xb7\x96\x21\x74\xc1\xd1\x65\xdf\x5d\x77\xd5\xe9\x77\x9f\xde\xdb\xd9\x7b\x77\x6f\x27\xfd\xcd\x8f\x56\x59\x00\x99\x1b\xd7\xc7\xdc\xc9\x8d\xcf\x20\x9e\x3c\x69\x82\xff\xde\xc3\xe9\x89\xf5\xb6\xbb\xdf\xce\x67\xeb\xf5\x8c\x6c\x8c\x58\x9f\x13\x82\xb5\xf3\xda\xca\x11\xcf\x8e\x0f\xf8\x3c\xb9\x76\x89\x8f\x90\x25\x6d\x0d\xcf\xee\xe8\x27\x27\x07\xfd\x7b\x71\x82\x7d\x4f\x6b\x9f\xdc\x37\x77\x77\x17\xc5\xf4\x1d\xfc\x6c\xeb\x0f\xe7\xd3\xb3\xde\x24\x6c\x80\x05\xb1\x03\x35\x3d\xfc\x89\x41\x57\xbb\x79\x7a\xcf\x38\xc5\x0b\x73\xb5\x09\x3e\x13\xfa\xc9\x56\x5f\x7f\x76\xe1\x3b\x68\x03\xb4\xfb\xf1\xfa\x0b\xc0\x62\xb0\x14\xac\x04\xeb\xc8\x7b\xe7\x27\x41\x42\x9a\xf4\x74\xb7\x74\x50\x91\xce\x78\x4b\x97\x57\x22\xb5\x3d\xb8\xe7\xd6\xde\x35\xb3\xa5\x23\x1a\xbe\xf8\xef\xc5\x97\x45\x3b\xbb\xff\x95\x6b\x52\x83\x2c\x93\x30\x93\x0c\x4c\x20\x03\x4a\x69\xd9\xe0\xf9\xb4\x24\x8a\x4c\xb2\x98\x1c\xd1\x47\x8b\x91\x29\x1b\x36\xc2\x5b\x36\x6e\xdc\xf8\xf2\xd1\x5f\xbd\xbe\x01\x9e\x0a\x6f\x41\xfd\xc1\x67\xd5\x4f\x06\x6e\x7c\xe1\x75\xf4\xf7\xab\x36\xa2\x3f\x2e\xfe\x87\xb3\xef\x5f\x3b\xa2\x9b\x78\x81\x4f\x8a\x92\xa9\x72\x08\xa0\x82\x92\x34\x93\x82\x01\xb3\xa8\x19\x15\x14\xa8\x51\x09\xf5\xd0\xa5\x97\xae\x5c\xd9\xef\xdc\xde\xdf\x4f\x3d\x7a\xf7\xdd\x48\xbf\x07\x7d\xe5\x21\xf4\xc6\x55\x5f\x7e\xa8\xbf\xaf\xaf\x6f\xc3\x55\x1b\x7a\xa3\xd7\x7d\x8c\x67\xda\x3f\xab\x7f\x3a\xc0\x77\xdf\xa1\x9d\xd7\xfc\x61\xce\xfd\xa7\x3f\xc5\xf4\x1e\xf9\xc2\x92\xf7\xe6\x7e\xf6\x8c\xed\x0d\xe8\xe0\x38\x7f\xbd\xd7\x54\x3a\x62\x26\xfd\x68\x7c\x8d\x4b\x37\xb0\x8b\x07\xb3\xa6\x33\x7d\x1b\x2b\x2d\xb9\x79\xbf\xed\xfe\x2c\xd3\xfb\x38\xd7\xf7\xe7\xb3\x9e\xec\x3a\xd1\xcf\xd1\x80\x65\x0d\x98\x8c\x6b\x88\xa4\x01\x07\x96\x04\x32\xe5\x36\x3f\x0e\x92\x0e\x32\x72\xb8\x12\xc4\xfd\xcb\x0b\xb4\xa8\xc5\x74\xfe\x1b\xa1\x5c\x30\x70\x3d\x4f\x50\x09\xda\xab\x45\xe2\xa1\xff\x77\x34\xbe\x69\x3a\xfc\xe1\x23\x4f\xed\xf9\xd1\x39\xe5\xef\xbe\xf7\xf3\xae\x97\x8e\x9c\x77\xce\x9c\xb9\xd7\xfc\xfc\x8a\x8b\xae\xd5\xaf\x40\xdb\xa8\xe6\xa7\xd0\x9c\x4d\x9b\xe0\xb7\xd1\x9c\xf1\xf7\xfe\x0d\x51\x72\x0c\x5c\xf7\x18\xbc\x0e\x6d\x81\x67\xa2\x37\xe0\x9d\xe8\xa1\xc7\xd0\x43\xf0\x4e\xf4\x1d\x78\x16\x7a\xf6\xf5\x4c\x06\x9e\x91\x41\x29\xfc\x57\x53\x21\x29\xe9\xb6\x2a\x71\xa6\xa8\x99\xac\xc9\xca\x9c\xc0\xa6\x35\x43\x14\x78\x51\x71\xf2\x4e\x4e\x92\x28\x01\x59\xa5\xe8\xc7\x29\x0c\x4f\xca\xb2\xb9\xc6\xf9\xbf\xca\x53\xbf\xfb\xdd\x53\x0a\x35\x79\x0d\xfa\xd6\x9a\x35\x6b\xd0\x9b\x8a\xa2\x78\xe7\xd5\x8a\x57\xdb\x07\xb0\xa0\x1b\xf4\x82\x4b\xc1\x4d\x38\x72\xc1\xc5\xc3\x4c\xef\x54\xda\x15\xda\x6d\x27\x43\x5c\xf0\xaf\x76\x57\x71\x2e\xc4\xf9\x50\xfc\xc0\xca\xc9\xff\x4e\x20\x0b\x9c\xe9\xdf\x17\xa5\x43\x65\x55\x27\xb5\x37\x25\x29\xc1\xb1\x22\xcd\x26\x92\x12\x49\x5d\x30\x74\x5d\x4e\x6a\x82\x38\x66\x48\x8a\x22\x25\x65\x25\x99\x28\x64\x78\x08\xb2\x48\xa4\x0a\x4e\x2e\x2d\x72\x3a\x2b\x3b\xff\x86\x61\x39\x2e\x8e\xb2\x69\x9b\x63\x4b\xaa\x66\xcb\xa2\xa0\x5a\x92\x29\xc0\x5b\xd7\x23\x2e\x62\xab\x1a\x62\xf5\x4c\x3a\x29\xcb\xa2\x26\x8a\x09\x3e\x61\x69\xf9\x82\x22\x26\x8d\x64\x82\x33\x35\xce\x90\xe4\x31\x5d\x45\xa3\xa2\x2c\x48\x62\x53\xe1\x23\xb9\x35\x32\x25\x31\x2d\xab\xfa\x88\x25\x89\xba\x28\x38\x2a\x65\x9d\x73\x8e\x96\x83\x62\x63\x7f\xc5\x24\x82\xff\x66\x09\xbe\x1c\xff\x08\x5d\xbd\x25\x80\x77\x7b\xfc\xf2\xd9\x77\xc1\xc0\xfc\xe2\xac\x5e\xa6\xef\xf0\xda\x4f\x0d\xcf\xdf\xd6\xcd\x10\xfc\x92\x3c\x6f\x4e\xed\xc7\x75\xaa\x9e\x64\xea\xfa\xf3\x7c\x3b\xe7\xe1\x67\xc7\xfa\xb2\x26\xec\x8f\x3d\x66\x82\x1d\xec\x8d\xfd\x33\x44\xdc\xc3\x04\x5d\xd0\xd5\x41\x1a\x8c\xbf\x96\xaf\x97\x0b\x9d\xa9\x7f\xca\x87\xa7\x2b\x4b\x63\x1b\xb0\x8e\xf3\xda\xdc\xdf\xcc\x1b\x3c\x7d\x6f\xbc\xef\xc8\x9b\x63\x3f\xe6\xc1\x8c\x77\x83\x18\xf0\xc6\x7e\xde\x4f\xfa\xfd\x9d\xe1\xe1\xe5\xc0\x2d\xad\x4f\xf2\x2b\x67\x72\x4c\xdf\x81\x9b\x9b\xb7\xf2\xdf\xe9\x9a\xe1\x9d\x46\x85\x6a\x13\x7a\xf3\xfb\x84\x2f\x27\xd4\xca\xa2\xd8\x7e\xda\x0c\xf9\x82\x2f\x06\xab\x81\xf6\xd1\xde\xe0\xa9\xff\x1b\x6f\xf0\xbf\x3a\xea\x8d\xb6\xfb\xa2\xc6\x67\x3d\xee\xa7\x89\x4f\x26\xa8\xa2\xc3\x53\xb2\x63\xe3\x4f\xe9\x43\xdb\xe6\x45\x09\x02\xd5\x48\x40\x9d\x49\xf0\x28\x9d\x80\x63\x88\x71\x3f\x4c\x36\x2a\xeb\xd9\x31\xc8\x73\x48\x44\x19\xa4\x39\xa3\x12\xb4\x21\x9b\x83\xf9\xa2\xe1\x70\xb6\x53\xfa\x77\x0e\x84\xc7\xcf\x87\x23\x19\xaa\xd9\x86\x25\x94\xb4\x9d\x72\x06\xa5\x9b\x16\xb1\x9c\x2c\x28\x82\x22\xc8\x49\x28\xf3\xac\x9e\xcd\xa7\xd9\x64\x72\x54\x48\x27\xb3\x82\x90\x15\x04\x34\xa2\xa9\x32\x9f\x64\xcc\xa4\x28\xa5\xcd\x64\x9a\x67\xd2\x1c\x47\x7f\xf6\x63\x0e\x8a\x3f\xbc\xfc\xf2\xcb\x2f\x7f\xf8\xdc\x73\x2f\xbc\xb0\x01\x8d\x34\x13\x74\x85\xe9\x70\xf7\x00\x3e\x67\xd8\x53\xf5\xd6\xe0\x67\x92\x97\x07\xd1\xf7\x95\xc5\x3e\x62\xbf\x54\x6b\xaa\xde\x5c\xf9\x7c\x4c\xa1\xaf\x66\xfa\x8e\xec\x61\x7e\x36\xe7\x55\x1e\x30\xbd\x8f\x3f\x7f\xdc\x4f\xe7\xde\x33\x27\xde\xd0\x5f\x13\x25\x62\x7d\xc8\xf6\x9a\x1a\xc6\xfa\x2c\x7e\x6a\x06\xba\x1f\x30\x4b\x7e\xc7\x37\xf2\x15\x47\x08\x7b\x2b\x4b\xd0\x3c\xce\x15\x0b\x3e\x05\xa4\x4a\x32\x56\xf0\x7d\x29\xae\x96\x3b\x0d\x74\x81\xf3\xc0\x0a\x6c\xed\xaa\x61\x9f\x4a\xab\xff\xf9\xd7\x71\x03\x30\xa8\xb6\xe1\x12\x62\x67\xd4\x3b\x5c\x8d\xe2\x3a\x61\x6d\x74\xac\xb3\xa5\xbd\x1b\xa7\xa9\xf2\xd3\x04\x4f\x81\x98\x05\x4f\x9d\xd6\x13\xed\xa6\x4d\xe3\x68\xc9\x34\x9b\x92\x47\x4b\xd5\x8f\x19\x50\x8e\x9e\xe6\x6c\x6e\xea\x1c\xed\x40\xe4\xce\x2a\xe5\x68\x2c\x5f\x14\x64\x79\xeb\xf8\xa9\x14\x2f\xcd\x7a\xe2\xc4\x59\x91\x51\xa4\x94\x60\xf3\xc5\x68\x75\xc9\x19\x47\x3f\x46\xdf\x9b\x53\x2a\x22\x3d\xaa\x8f\x5f\xb6\xfb\xa1\x59\x7f\x7c\x6b\x16\x7c\x2b\x72\xaa\x39\x75\x1a\x8a\x47\xd2\xe3\x23\x91\xf4\x37\x25\x75\xc5\x4b\x96\x82\xd6\x3b\xdf\xbf\x19\x66\xd6\x47\xbb\x9c\x43\x1c\x47\x2d\xdd\xd2\x53\x98\xfb\xd6\x5c\x6a\x64\xda\x49\x27\xad\x3b\xe9\xa4\x0b\x97\x2c\x5c\x72\x3a\x2b\x3d\xf0\xd8\x49\x27\x4d\x5e\x77\xd6\x85\x4b\x16\xf6\xcd\x5e\xb3\x6e\x7c\xe4\x74\x76\xea\x89\x53\x56\x5d\xcb\xae\x58\x7b\x3f\x95\x51\x6e\x38\xeb\xc6\x9b\xd1\x3d\xaf\x25\xdb\x2f\xeb\x4e\x75\x53\xf7\x9d\xc8\x9e\x78\xda\x9c\xab\x7a\x7b\x9f\x99\x33\x47\xe1\xcf\x39\x8d\x3d\x67\xc5\xee\x2f\x2e\x92\xcf\x01\xe0\x58\xbc\xde\xcf\xd2\x06\x98\x12\xe4\x66\xf5\xf2\x2e\x9f\x0d\x16\x83\xf3\xc0\x05\xe0\x22\xb0\x1a\xdc\x0a\xc0\xa4\xaa\xc7\xb4\xbb\x3e\xe2\x8e\x8e\x75\x4e\x6b\xe9\x20\xd6\xa6\x9a\x4d\xa3\xdd\xd5\x0e\x61\x7b\x6b\xfb\xb4\xe0\xae\x59\x38\x9b\xeb\xbf\x3c\xde\xcc\x97\xac\x5c\x4e\x12\x13\x92\x22\xc8\x58\xda\xa5\x15\x95\x83\x4c\x89\xd6\x2d\x27\x6d\x59\x30\x89\x4a\x30\x03\x59\x27\x5d\xfd\x17\x2a\x3a\x77\x37\x6d\x3b\x7a\x2d\xfc\x92\x69\xc2\x13\x1f\x7f\xdc\x79\x17\x9a\x48\x35\x55\x15\x3e\xe5\xff\xe3\xe8\xc0\xbf\x71\x06\x1a\x29\x94\xcb\x26\x2a\x27\x92\x46\x3a\x1d\xf2\xa9\x8a\xae\x89\xeb\x08\x82\x40\xe5\xca\xd5\xec\x1d\x4d\xec\x7d\xb7\x38\x53\xa8\xdf\x3a\x27\x50\x0c\x32\x35\xfd\x16\xf7\x57\x64\xea\xc7\x1d\x8f\x86\xce\x1a\xfd\xfd\x04\x27\x9c\x35\x78\x70\xbc\x35\xc0\x27\xc1\xec\xca\xd2\xd8\x33\x58\xf7\xeb\x04\x3d\x60\x09\x58\x49\x6a\x7e\x93\x66\xb6\xcc\x6c\x90\x12\xf7\x5f\x22\x38\xe6\xae\xa5\x5f\x2d\xcf\xd5\x15\x5b\xba\xa3\x64\xfa\x6c\x1c\x0c\x3f\xa9\x83\x50\x1d\x43\x6b\xbb\x6b\xcc\x2c\x95\x4c\x45\x11\x04\x53\x36\x95\x92\x52\x82\xad\xff\x06\x72\x27\xc9\xeb\xff\xcf\x37\x4f\x9e\xa6\x5c\x3e\xe7\xf6\x63\x77\x6d\x38\x7b\x04\xb2\x94\x1a\xbb\x46\x9e\x7e\xcd\x64\x65\xd6\xc9\x27\xc7\xde\x8c\xfd\xe3\x9a\x37\x27\x3f\x4f\x4d\xef\x1f\xff\xfb\xc3\x0f\x43\x1e\xe5\xe1\xeb\x70\xf1\xf8\xdf\xab\xff\x42\x5f\x8f\x7c\x08\x19\x34\x66\x6a\x96\x65\x1a\xaa\x93\xa6\x8a\xa3\x79\x1d\x26\xa0\x14\x39\xf9\xa3\x71\xbe\x45\xe5\x93\x68\x54\x12\x78\xd6\xc8\x70\x9c\xc4\x89\xb0\x94\x6e\x46\xea\x48\xd2\x4c\x2a\x63\xc8\xb6\x14\x1d\x32\x4e\xc9\x61\x64\x99\x1a\x43\x63\x86\x61\x20\xd5\x30\x0c\x40\xe6\x83\xf4\x78\x58\x7f\x85\xe0\xaf\xd8\x2f\xb0\x11\x57\x7c\x1c\x38\x8d\xb0\xeb\x08\x99\xda\x8f\x1a\x9e\xc3\xd1\xfd\x4e\xfd\x19\x60\xf6\x4b\x80\x8c\xb9\xac\x8b\xe5\xea\x1f\x6f\xec\x07\xef\xaf\xd6\xc4\x15\x2a\x0b\x71\xbf\x7d\xc3\xcb\xc6\x5e\xe3\xc1\xcc\x8d\xf1\xbe\xc7\x96\x83\x3f\xf2\xe0\x8c\x73\x03\x3d\x68\x6d\x65\x61\x2c\x43\x9b\x4c\xdf\x93\xa5\x4f\xef\xe3\x4f\xef\x59\xcf\xf4\x6d\x39\xff\x93\xbf\xe4\x67\x74\xbd\x16\xc7\x33\x08\xea\x07\xd4\xfa\xfd\x30\xe8\x57\x22\xf5\xb2\xfe\x0f\x08\xfe\xbf\x8b\x36\x98\x35\x07\x6e\x85\xe7\xa2\xf7\x7b\x96\x9e\xad\xf9\x71\x14\xf4\xde\x6a\xce\x98\xb9\x15\x21\xf6\x5c\x80\x93\x35\x07\x6e\x45\xff\x83\xfe\x38\x6b\xf0\xec\x14\xd3\xbb\x6f\xee\xd5\x60\xce\x0e\xbe\xf1\xdc\xca\x13\x70\xe7\xe1\xf4\x9f\xf5\x67\x85\xfe\xfb\xef\x4f\x38\x63\xf3\xe6\xf0\x8f\xfa\xb3\x28\x7c\x0a\x55\x5d\xd1\xbf\xfb\xdf\xe9\x89\x59\xf4\xa3\xcc\x9a\x6d\xbf\x76\x6e\xa8\x14\x79\x30\xeb\x83\x78\xdf\x91\x3d\xe0\x42\x1e\xcc\xf9\x5d\x9c\x7e\xfc\xb9\x8f\x6d\xe3\x6f\x8d\x64\x6e\xff\x5f\x43\xdf\x09\x64\x74\xff\x5f\x3e\x62\x2d\xc7\x02\xf8\x99\xb1\x27\x69\x33\xde\xf7\xc8\x7b\xad\x6f\xf1\xa0\xab\x8b\xe9\x1b\xba\xb0\xed\x97\xf3\xae\x9b\xc5\x06\xeb\x24\xd7\xf5\xf5\xe7\x7a\xfa\xf3\xe1\xff\x13\xc0\x4f\x89\xdd\x45\x6f\x60\xd6\x0c\x9c\x06\x68\xb0\x69\xfe\xce\xb3\x6e\x64\x7a\xbf\x70\x57\xe4\x97\xf3\xba\xba\x7f\x57\xa9\x80\xc5\x95\xa5\xb1\x6d\x9e\x4f\x0d\x2c\x9d\xff\xf6\xdc\x4f\x31\x6b\x36\x1d\x04\xcc\xf8\xe5\xf3\x07\xe6\xbe\x16\x8f\x1d\xf9\x01\x98\x82\xec\x06\x38\xc7\x67\x43\x20\x82\xe7\xae\xd1\x1a\xbe\x6f\xd3\x8e\x3d\x52\x33\x5d\xdb\x11\x44\x63\x00\xfa\xb5\xfa\x26\xb5\x93\x39\xf8\x8d\x48\xd2\x8e\xb0\x8e\x02\x01\xb4\x64\x24\xa0\x51\x1b\x95\x91\xa0\xc1\xcc\xa8\x63\x44\xad\xac\xa1\x67\xac\xa3\xa3\x79\xcd\x52\xf3\x91\x3c\x95\x73\x04\x0b\x09\xc5\x1c\x6c\xa6\xc0\xb8\x14\xc9\x20\x06\x95\x2c\xc8\x40\x9b\x1a\x15\xca\x59\xa9\x90\xcf\x8f\x48\x23\xf9\x1a\x5f\xd5\xe3\xa9\xa1\x7b\xdc\xf1\x3d\xf7\x0f\x82\x56\xbc\xbc\x48\x9a\x0b\x1f\x96\x09\x38\xce\xf5\xb6\x1f\xd7\x8c\x3e\xb8\xb2\xfe\x7d\xf7\xcd\x38\xbd\x7f\x23\x01\xf7\xf2\x0d\xe1\xdc\x16\x1b\x6f\x0d\xd1\xa2\xdf\x0e\x43\xef\xdf\x14\x6a\x5f\xaf\xc2\x0f\xff\x39\xf0\xff\x57\x73\x08\xe3\x1c\xf4\x43\x77\x13\xef\x4b\xb5\x76\x86\xee\x6a\xdc\xfe\xd0\x9d\x04\x5c\xad\xc1\x8f\x3c\x5a\x3f\x7e\xbf\xdf\xf5\x1f\xd1\xce\x1d\x04\xdc\x24\xe0\x5f\x21\xf4\x3e\x9c\x67\x79\x08\xe3\x6d\xe8\xf6\x10\x3c\xc0\xc3\xf0\x2f\xeb\xdb\x71\xf1\xc6\xd0\x07\x76\x12\x70\xbd\x06\x1f\xfa\x72\x00\x3f\x23\x76\x6b\x00\xef\xdd\xfa\xc4\xaa\xbf\xcd\x5e\xc2\x4f\x27\xe6\x70\x5f\xf5\xd9\xc0\x8d\xd7\x45\xe7\xfc\x6e\xfe\x0f\x1b\xf5\x33\x74\x5b\xfd\xfc\x3c\xf8\xde\xd3\x43\xfc\x54\x8d\xa7\xf6\xe3\xf8\x84\xac\x3d\x61\x3d\xbd\x76\xc8\xf5\xe4\xdd\x75\xdb\x3c\x84\xf7\x79\xa1\x4a\x35\x13\xfb\xd8\xff\x09\xc2\x96\xcb\x12\x34\xf3\x99\x46\x63\x8a\xd3\x07\x5e\x27\xe0\x72\x0d\xe7\xcf\xa3\x46\x34\xc9\xd0\x07\xff\xd6\x78\x4d\x83\x7c\x77\x41\xdd\x35\x77\x2d\xe2\x74\xf6\x98\xc6\x6b\x1d\xaa\x87\x26\xd6\x68\x72\xff\xf9\xf5\xfd\xfa\xb8\xb8\xb9\x31\xfc\xd0\x57\x1b\xd3\xcc\xfe\xf3\x02\xf8\x8c\xd8\x9a\x80\x36\x16\x6f\x8d\x80\x5f\x55\x7e\x73\xe6\xea\xf9\x8b\x27\x8e\xd5\x1a\xf3\xcf\xb7\x7c\xbe\xe5\xd7\xf6\xe5\xc0\x3c\x9c\x7b\xd4\xbf\x29\xe2\x15\xa3\xf4\xef\x02\xd4\xdc\x23\x3d\xbe\x4b\x0a\xff\x78\xaa\x89\xfb\x09\x5f\x74\x65\x22\x9d\xdd\x2d\x58\xfd\x64\x29\xcd\xa6\xcc\x91\x11\x47\x85\xa3\x28\x51\xce\x2a\x56\xc6\xce\x8e\x29\x10\xe4\x90\x0a\x4b\x8e\x4e\xe9\xe3\xb9\x88\xe0\x18\x91\x04\x05\x10\xa0\xc0\xb8\x2a\xf2\x26\x2b\x44\x80\xc9\x4b\xba\x74\xb4\x6c\x17\xf4\x4c\x54\xb4\x6d\x3a\xa9\x28\x68\xcc\x44\x65\x64\x98\xbc\xa6\x99\xba\x8c\x72\xb0\x50\xcc\x2b\xf9\x82\x09\x35\x43\x37\x5d\xfd\x61\x54\xd7\x51\x41\xd6\x38\x4d\xe6\x58\x53\xe6\x55\xc1\xe5\x6e\x68\x4c\x29\x43\x05\x36\x8f\xa7\x09\x3f\x82\x16\x4f\x59\x5f\x99\x40\x93\x16\xb1\x0e\x5f\x22\xe0\x06\x01\xc7\xf4\x05\x68\x3f\x1f\x20\x4f\x9c\x0d\xcc\xf5\xa2\x0d\x5b\x71\xfe\xc6\xae\x76\xd7\x1a\x87\xe4\xf9\xc0\xe4\x36\xac\x31\x56\x2d\xa3\xfa\x32\x9f\xa9\x4e\x9b\xce\x39\x25\x58\xf8\xa0\x0c\x8b\xce\x48\xa4\x8c\x0a\x88\x73\xd5\x6b\x58\x80\x9c\x0d\xd3\x47\x6d\x45\x2c\xdb\xa3\x9a\x60\x08\x02\x34\x1d\x15\x32\xd0\x70\x79\x78\xc9\xe5\xe1\xa2\x0a\x15\xc8\x38\x1a\x34\x38\x91\xe6\x4d\xcb\x45\xa5\x65\x59\x16\x32\x4b\xee\x1f\x24\x6a\xa6\xab\xc0\x19\x86\xa8\x48\x66\x5e\xce\x98\x30\x81\xd2\xb0\x88\xca\x96\xa1\x16\x4d\x45\xae\xcd\x55\xab\xed\x99\xbd\x5f\xab\xdf\x33\x3e\x2d\xde\x57\xef\x93\xc9\xe2\x7a\x5c\x1b\x27\xd5\xef\x81\xec\xd5\x98\x46\x71\x5c\x29\x68\xf2\x63\x7d\x74\x1c\x5f\x3d\x03\x2c\xac\x46\x90\xb4\xb7\x78\xc9\xdd\xa2\x93\xdb\xb0\xc5\x83\x31\x34\xb3\xb5\x3d\x1a\x4b\x75\xb6\x76\x74\x79\x49\x92\xbb\x66\xa6\x3a\xbd\x14\xec\x64\xad\x99\x49\xed\x11\x36\xcb\x24\x23\xc2\x87\xcd\xb0\x9c\x46\x6a\x53\xe1\x28\x07\x59\x91\x53\x4d\x4d\xe2\x94\x74\x3a\x83\x6c\x28\x4a\x99\x9c\x99\x1d\x13\xc7\x32\xc8\xc8\x25\x59\x94\x88\xa5\x3f\x2c\xb3\x4d\x99\x84\x55\xd4\xb3\x89\x11\x55\x15\x99\xa3\x9c\x88\x4c\x5a\x4f\x73\xec\xb8\x11\xd1\x84\xf1\x22\x25\xa5\x05\xc9\xb6\x45\x89\xe7\x58\xd5\x50\x15\x21\x9b\xd5\x78\x85\x93\x55\x96\x75\x92\xa6\x8e\x4a\x56\xc2\x4c\xf0\x32\x6c\x26\x74\x0a\x2d\x9e\x1a\xba\x09\xdf\xdf\x50\x31\xa5\xdc\xe8\x3f\x9b\x1b\x7b\x90\x7e\x9a\xe9\x1b\x5a\x07\xe7\xcf\xbf\x75\xee\x16\xa6\x77\xb0\xbb\xed\x7f\xe6\x3d\x35\x97\x0b\xf8\x08\x96\x49\x1e\x4f\xdf\x7b\x62\x63\xba\xdb\xb7\x23\xe4\x13\xd0\xe2\xa9\x7d\xeb\x70\xdd\x92\x95\xa1\xf8\x11\x57\x66\xac\xc3\xbd\xaf\xad\x7f\xdf\x6b\x7f\xe8\x44\x02\xae\x55\xd7\x28\x4e\x0f\x9d\x41\xc0\xed\xda\x78\x86\xca\xf5\x32\xd5\xa7\x81\xa7\x1b\xf3\xfe\xa1\x2f\x12\xed\x10\x35\xb1\x82\xba\x7e\x41\x5e\xc9\xc3\xae\x5e\x96\xda\xfa\x5c\x75\x17\x06\xf2\xc2\x1d\xd3\xf6\xba\xbd\xc9\x92\xf2\x62\xf0\xf5\x50\x1f\xc1\xdc\xb2\xb3\xea\xfd\x30\x1b\xae\xc7\xfa\x12\x59\xb7\x26\x57\x9b\xf3\x70\x35\xfe\xe4\xcc\xaa\x3c\x1f\x96\xdf\x05\x71\x7a\x4f\x57\xb8\x5f\xa6\x6f\x78\x65\x14\xcc\xe9\xe3\x01\xd3\x7b\xf8\xbd\xe4\x5f\xe7\xfd\x95\x7f\x2c\xcc\x8b\x3d\x3a\xdf\x74\x45\x63\x5e\x72\xe4\xba\xc6\x3c\xdd\xd2\x08\xbd\x24\xe3\xca\xc9\x17\x71\x14\xcf\x81\xbb\x42\xef\x1b\xd5\xf7\xf7\x8c\x34\x9e\xf7\xb6\xbd\xc4\xfb\xb9\x5a\xfb\x41\xfd\xba\x3a\x79\x3b\x7c\x75\xe8\xfd\x60\x4d\xf7\xd0\x1f\xc1\x0b\x6f\x20\x64\x6d\xa6\xc6\x1f\x76\x9f\x00\x48\xbe\xa1\x57\xe5\x4b\x50\x3b\xae\xae\xdf\x9d\xe9\x46\x34\x19\xa7\x77\xb5\x85\xfa\xf5\x69\x86\xc1\x15\x31\x19\xfa\x85\x77\x83\xef\x18\xb5\x39\x07\xb5\xdd\x5c\xf8\x48\x6d\x4d\x77\x1c\x60\xeb\x74\xb4\xa1\xcb\x71\xbd\x4b\x7c\xeb\x60\xc7\x4e\xa2\x7f\x3d\x68\xeb\x47\xf5\x78\xcd\x5e\x85\xe9\xe9\xea\xfa\x71\xf9\x7b\xe2\xfa\x46\x3a\x00\x91\x4f\xb3\xc6\x2f\xf1\xfc\x9e\x5e\xf8\x11\xef\xaf\xa9\xd7\xd3\x3c\x3a\x1a\xea\x6b\xb4\x87\x18\x7a\x47\xd2\xf7\x15\x7f\xd1\xdb\x73\x7e\x8d\x1f\x4f\x72\x5f\x08\x56\x83\xeb\x5d\x09\x14\xbe\xc0\xe0\x17\xa5\xe8\x6a\x6b\x6f\x6d\x8f\xf8\xf6\x01\x29\xcf\xbb\x7b\x42\x06\x02\x6c\x39\x6e\x36\x6c\xc5\xf9\x7b\x3a\x28\x3a\xd6\x39\x0f\xb6\x44\xda\xa9\xea\xf1\x96\x77\xc0\x15\xe9\x98\x39\xb9\xad\xbb\x47\x85\xb6\x05\x2d\xa4\x40\x71\x3c\x0b\x15\x24\x47\x0a\xa6\xa3\x98\x79\x8a\x77\xf2\x5b\xa1\x62\x41\x09\x65\xf2\xb6\xaa\xea\x96\x99\x95\x4b\x19\x94\xa5\x32\x7a\x9a\xd7\x78\x94\x14\x58\x95\x15\xe9\xcf\xf0\x92\x2e\x4b\x23\xcd\xa2\xac\x88\x9c\x4c\x8d\x26\x8a\xd2\x88\x94\xb1\xb3\x8c\x68\x88\x25\xd3\xe4\x85\x12\xaf\x6a\x09\x9a\x15\x04\x4d\xd0\x34\xa1\x02\x46\x35\x6d\x34\xa7\xa0\x5b\xe1\x1c\xf4\xed\x27\x8f\xbf\x7b\xe0\xee\x27\xd7\xa2\xfb\xe0\xbd\x2f\xde\xfa\x50\x7f\x11\x1e\x3c\xe3\xa1\x8b\x16\xae\x5e\xbd\x62\xd5\x79\xab\xaf\x8c\x5c\x8c\x92\x92\x21\x4a\x50\x47\xa5\x31\x51\x13\x47\xa0\x34\x5e\x42\xda\x98\xa4\xd8\xa2\xa9\x31\x69\xd6\x12\xf4\x02\x4c\x8e\x1a\x99\xc2\x44\xfe\xb5\xeb\xb5\x09\x3a\x35\x5e\x2b\x6b\x63\x63\xfe\xb8\xe3\xda\xc6\x7b\x72\xc7\x17\x43\x3a\xbb\xfb\x3e\xa6\xa9\xe1\x95\xf5\xf0\x83\xb8\x56\x96\xb7\xc2\xfd\x7f\xc0\xba\x85\x54\x59\x14\x7b\x9e\xd6\xc0\x24\x70\x0a\x3e\x07\x3b\x17\x5c\x51\xd5\xca\xc2\x0e\x7a\xd8\xd8\x07\x35\x89\xd0\xc6\xa2\x33\xfd\xc4\x9d\xdd\x93\x3a\xbc\x63\xb4\x96\x99\x6d\xfe\xd7\xaa\x47\xca\xd4\x53\x30\x69\x41\xcf\xb9\x67\x21\xc5\x42\x25\xe7\x83\x31\xb3\x54\x32\x64\x85\xe7\x4d\x41\x55\x72\x52\x49\xe6\xd2\x5a\x9a\xa7\x38\x8d\x13\x34\x09\xfe\xc9\xb6\x95\xc4\x88\x9c\x6b\xd6\xa0\x8a\x8a\xa6\x3d\xf8\xfe\x16\x84\xde\x72\x5e\xfb\xc9\xfb\xd1\x1f\xed\xdc\xb9\x73\xe7\xe3\xee\x1f\x94\xa1\x0c\x47\x33\xb2\x96\x61\xe9\x8a\x23\x53\xc5\x52\x5e\x87\x0c\x94\x29\x23\x5b\xe4\x46\x32\x5c\x7a\x2c\xc3\xe7\x5b\x3e\x9c\x4e\x2d\x40\x0b\x1e\x55\x6e\x84\x37\xdf\xf9\x26\xd5\x8e\xae\x38\x16\xbe\x8d\x4e\xbf\xdb\x39\xfd\xee\xbb\xa9\xb7\x6b\xb8\x7a\xa3\xb6\xc7\x0f\xca\xa7\x8f\xf9\x7c\xb3\x5a\x47\x6d\x39\x8e\x21\xc2\xd9\x1b\xfb\xff\x2f\xc1\xab\x6a\x72\xec\xba\xc0\x26\xaf\xca\x49\x5c\x1f\x60\x68\x55\x3d\xcf\xf3\xf7\xe0\xb5\x21\xfb\xc2\x08\xe0\xd7\x84\x78\x9b\x51\xe5\x85\xcf\x6d\x9b\xc0\xe3\x3d\x1b\xad\x7a\xef\xef\xf1\xca\xdc\xd8\x37\xe9\x5b\x98\xbe\xec\xd5\xb3\xdf\x3f\xeb\xc7\xfc\x0c\x66\xf1\x86\xe3\x20\x03\x00\xb7\x9a\x27\xf6\xba\xfb\x3c\x0a\xe6\x1c\xe1\x01\xd3\xf7\xe8\x65\x3d\x60\xce\xed\xbc\x6b\x5d\x9c\x8a\xcf\x46\x2f\xab\xf0\xb1\xc7\x68\x0d\x24\xc1\x02\x20\xd5\xb2\xe7\x7a\x55\x02\x4e\x85\x9d\x33\xcf\xe8\x6a\xe9\x20\x7e\xda\xbb\x7b\x70\xbe\xf0\x8f\x7d\x01\x36\xe0\x0a\x75\x34\x14\x79\xac\x09\x20\x81\x49\xc0\x9c\x28\x08\x09\x3e\xa9\x19\xba\xa1\x9b\x50\x4a\x30\x48\xfa\xe4\x47\x3f\x72\x3e\x0d\x3f\xf5\x30\x6c\x42\xe3\xcf\xdf\x74\xcd\x85\x97\x3f\x7c\xf9\xc3\x72\x41\x19\xff\xf2\xac\x94\x3a\x6d\x36\x35\x5b\x9d\x35\xe7\xcb\xe7\x52\xbb\xef\x5d\xdc\x8b\xce\xee\x5d\xac\x9d\x0a\x4f\x47\xb7\xc1\xc7\xf1\x67\x06\x75\x6e\xef\xe2\xa6\x49\x77\x2d\x3a\x07\x5d\xb0\x68\xd1\x6d\x9f\x87\x69\x74\x2f\xbc\x0f\x7f\xce\xa2\x66\x9f\xb3\x08\xcd\xc2\x74\x65\xdb\xa6\x65\x6a\x0e\x47\x8d\xb8\x74\xd5\x0c\x15\x92\xae\x0a\x0d\xe4\xcc\xb6\xee\xc6\x3a\xd1\x8b\x1f\xd6\xaf\x9d\xbf\xd6\x57\x87\xd6\xda\xf4\x64\x49\x9c\xde\x72\x2e\xa8\x3b\x9f\x19\xc2\x7b\x7b\xd3\xcb\x8d\xe4\x7c\x9c\xde\x50\x00\xe4\xb9\x63\xd0\xef\xc0\x43\xf5\xe3\xf1\xe8\xfb\xd1\x8b\x26\xc8\x1d\xcc\x9b\xb6\x5c\x48\xbc\x6f\xd4\xc6\x19\xaa\x75\xa7\x11\xe3\xaf\xde\x71\x61\xab\xfe\xa3\xbd\x38\x77\x41\xff\xef\x1b\xf5\xcb\xd0\xd6\x16\x50\x3b\x2b\xc2\xe3\x7c\x74\x31\x00\xf1\x54\x66\x31\xb6\x06\x16\x05\x7b\x0e\x8f\x69\xe8\x4a\x2c\xa3\xaf\xc0\x2d\x8e\x12\xdf\x73\xf7\x4a\xd2\xfd\xde\xb3\x77\x4c\xf8\x9e\x2b\x8f\xaf\xc0\xdf\xc3\xd5\xf2\xfa\x7f\x17\x96\xc7\xd6\xed\x35\xb9\x8b\x73\x4e\x09\x31\x81\xd6\x7c\x2e\x08\x60\x1b\x80\x53\xa7\xa5\x3a\x7b\xe2\x93\x62\xa9\xce\x28\x79\x20\x82\x8f\x3a\xe9\x68\xe7\xd4\x49\x6d\x54\x74\x6a\x4f\x37\x6c\xa3\xa2\x9d\xdd\x70\x32\x7e\x51\xb0\x90\x8c\x9a\xe1\x18\xb4\x44\xc9\x2c\x5b\x16\x27\x22\x5e\x54\x55\x39\xa9\xa8\x69\x54\x44\x79\x16\xa6\x61\xa2\x8c\xca\x49\xc8\x17\x33\x59\x34\x0a\x13\x05\xdb\xc9\x29\x63\xa8\x24\x96\x9b\xb8\xb2\x65\x99\xe5\x68\x86\x47\x3c\x1a\x63\x39\x59\x96\x2a\x00\x95\x24\x55\xe5\x9d\x51\x5d\x4e\xd8\x09\x19\x8e\x26\x13\x86\x55\x64\x13\xe6\x08\x54\x39\x54\x28\x30\x69\x73\x3c\xab\xa3\x31\xdb\xd2\x61\xa2\x54\x01\x52\xb9\x14\xe0\xbb\x29\x41\x6b\x71\x7a\xf8\x8a\x60\xde\x9e\x7f\x06\xe7\x5e\x1b\xbe\x22\x34\x6f\x05\xcf\x7a\x0e\x9e\x77\x14\xcf\x7b\xf2\xc7\xcc\xdb\xfd\x47\x5b\x53\x94\x8a\xe1\xd9\xbb\x20\xcf\x26\x8f\x0a\x26\x12\x50\x12\x96\x3f\x62\xf6\xb9\x34\x4c\x43\xa6\x5c\x01\x49\xc8\xe4\x10\x2b\x45\xca\xd0\xd6\x50\x0e\xb1\xd9\x31\x98\x28\x5a\x4e\x16\xe3\x01\x82\x26\xd6\x43\x04\xc7\x21\x71\x2c\xcd\x49\x92\x34\x8a\xc6\x24\x55\xe1\x51\xc2\x47\x43\x2e\x99\xd0\xcd\x7c\x3a\x61\x66\x20\x60\xcc\x24\x67\xa4\x93\x15\x90\x49\xa4\xb5\xf1\x51\xbd\x6c\x59\x1a\x04\xc5\x51\xa9\x54\xf4\xfd\xa5\x1c\xae\xdd\xf4\x16\xf6\xd9\xec\x2e\xd6\xc9\xd0\x43\x27\xd7\xf0\xe1\xd9\x05\x74\x19\xc3\x71\xcc\xfc\xfe\x56\xc2\xef\xca\xd7\xda\x39\x74\x12\x61\x63\xe4\x6a\xef\xbf\xc0\xd6\xef\xcb\xc1\x9b\xb1\x0d\xf3\xe4\x04\xd9\x7d\xc5\x04\xbf\x1d\xae\x7d\x7c\x08\xd7\x87\x7d\x81\xcc\x3f\xe5\xd5\x8c\xc0\x19\x31\x0f\x3d\x1c\xb2\x6d\xb4\x78\xea\xe0\x7f\x4f\x80\xe3\x75\xde\xff\xd3\x10\x3c\xd8\x7f\x2f\x4c\xc7\x76\xc2\xcb\xf5\x7e\x3e\xaf\xdf\xc1\x2f\x11\x70\xdc\xef\xa0\x1a\x1a\xbf\xe8\xd5\x58\x88\xa7\x86\xa6\xe0\xf7\x6f\x9a\xd0\x4e\xff\x84\xf9\xe2\xfd\xbd\x05\x4c\x80\x7b\x35\xfb\xff\x6b\xc2\x78\xb0\xde\xba\x5f\x6f\xdc\xce\xfe\xbf\x4d\x78\xdf\xaa\x8d\x7f\xfd\x9f\xea\xdf\x1f\xbe\x0c\xdb\x39\xdf\xac\xb7\x13\xfc\xf9\xf6\xd5\xf3\xb3\x17\xda\x43\xf4\x10\xe0\xed\xc0\x9e\xc6\x78\x1b\xc6\xf5\xf7\x86\x2f\x23\xe0\xd8\xaf\xe8\xbe\xc9\xa4\x0e\x7e\x13\x7b\xf8\x0a\x61\xfb\xd5\xeb\x3b\xa8\x0b\x12\xf0\xc0\x3d\x38\xbb\xe2\xa1\xdb\xea\xe7\x80\xdb\xa2\x8f\xbc\x54\x3f\xe7\xfd\xe3\x8d\x71\xf4\xe2\x95\x21\xb8\x52\xc5\xa9\x47\xa3\xc3\x4b\xea\xe7\xec\xe3\xe2\x9a\x7a\x3b\xdb\x83\xef\xff\x72\xbd\x1e\xe2\x8d\x67\xb0\x96\x9b\xc2\xaf\x25\x73\xa8\x3c\x81\x26\xcc\x5a\x3b\x1b\x16\x10\xfe\x03\x5c\xcb\x7c\x10\xcb\xb2\xc1\xab\x89\x3d\x96\xad\xed\xb1\xc0\x57\xeb\xc2\xaf\x0e\xf0\xb3\x78\xb8\x02\x36\x01\x70\xe6\x56\xde\xd5\x53\x1e\xc1\xb1\xb3\x37\x82\x63\xc1\x74\x70\x19\xae\x78\x05\xe0\x4c\xaf\xae\x47\xb5\x9c\x15\xac\x86\xc0\xf7\xb4\xd1\x31\x32\x37\x41\xb4\x73\x5a\x57\x3b\x6c\x6b\x8a\x06\x37\xb3\xa3\xe4\x63\x97\xe1\xf5\x78\x91\x8e\x34\x66\x75\x44\x04\x64\x93\x6e\x71\x46\x4e\x4a\x98\x69\xb3\x02\x46\xf4\xf1\xfb\xe0\x02\xeb\x1f\xff\xf8\xee\x09\x37\xde\x7e\xf1\x97\xfb\x56\x7e\xae\xef\xba\xf3\x51\x71\x26\x5c\x85\x5e\x6d\xba\x70\x27\x3a\x84\xbe\x00\xb7\xc1\x4b\xbe\xf2\xd8\xd1\x5d\xcf\x9c\xb9\x04\x7d\x7e\xc9\xcd\x37\x5f\x93\xbc\xfe\x66\x16\xfd\x18\xbd\x96\x86\x4d\x7f\xfb\xd1\x2f\xda\xdf\x79\x6c\xf3\x92\x9b\xe1\x89\x37\x2c\x80\x9f\xfe\xdb\x6b\x37\x7f\xf7\x0f\xce\xa5\xd7\xfe\x11\xbd\xb3\xe4\x28\x7d\x9e\xf3\xbb\xcf\x33\x0b\xef\x3a\xeb\x95\xb5\x57\xae\x82\x07\xb2\x59\x43\x66\xb5\x64\x42\x97\xc5\x84\x91\x10\x59\xce\xe0\x35\xe7\xfd\xb3\x7e\xbb\x3f\xd1\x7e\xd1\xf2\xf5\x07\x96\x2f\x3c\xf3\x0b\x3f\xbd\xe5\x0a\x66\x7d\xf3\xf2\x03\xc7\x33\x0f\x2c\xbf\x25\xd1\xfc\xc0\xc2\x5b\xce\x58\x70\x46\x0b\xd3\x8c\x4e\x5c\xf5\xc0\x13\xeb\x57\xdd\xf2\xe0\x03\x17\xad\x5f\xd8\x60\xef\xc7\xe9\x83\x7f\x27\xd6\xc7\xa0\xa5\x78\x6a\x70\x25\xb6\x17\x30\x07\xe8\xff\x6d\x98\xf6\x7c\xfa\xc6\x77\xa2\x37\xb6\x34\x5a\xef\xad\x35\xfa\x93\xbd\x75\x7d\x01\xd7\x70\xd8\xf7\x54\xbd\x8e\xb2\x1f\xd7\x4c\xca\xaa\x04\xdd\xe0\x33\x92\x23\xaf\x60\x5d\x24\x1f\xc0\x8f\x73\xdb\x67\xfa\x86\x2f\xfb\x04\x38\x73\x88\x07\xcc\x9a\x2d\x10\xb6\x55\x0e\x9f\xf9\xed\xb3\x3f\xc3\x2c\xde\xbf\x0d\x7e\xb2\xf2\x6e\xcf\x19\x0b\x7e\x15\xc4\x88\xbb\xfa\x86\x37\xfa\xff\x0e\xd1\x9e\x10\x4f\x59\x7b\x27\xd0\x2a\xe6\xef\xc3\x97\x60\xfe\x7b\x51\x68\x2f\xe8\x55\x3e\x32\xdc\x59\xbf\x07\xbd\xbd\xb0\x5f\x08\xed\x29\x3d\x9e\xda\xbf\xb8\x8e\x5f\x54\xfd\x1c\x97\xe1\x33\x82\x2b\xeb\xf7\x88\xdf\x4e\xef\x47\xc0\x17\xd5\xfb\x45\x5c\x78\x9c\x1e\xbe\xa0\x7e\xef\xfb\x7b\xb6\xa5\x9e\xcf\xee\x67\x1a\xf3\x59\xaf\x7d\xe2\x4c\xa1\xea\x37\xc0\xf3\x1d\x5c\x41\xec\x41\xac\x8b\xed\xc3\x7b\x7c\xc3\x67\x1b\xe3\x61\xf0\xca\x50\x3b\x7a\x00\x0f\xf3\xd3\x00\xbe\xfe\x9f\x13\xd6\xdc\x7b\xff\xf2\xc6\xe3\xb1\xc6\x26\xf0\x5f\x6f\x9c\x97\x12\x70\xbd\x86\x87\x4d\x2b\x26\xc8\xa7\xaf\x4e\xe0\x99\x1a\xd1\x2f\x99\x9b\x05\xb7\xb3\xef\xd3\x13\xe4\xab\x5c\xe3\xa5\xa1\x1a\x4e\xf8\xcc\xc5\xd7\x1b\xce\x0f\xf0\x26\x7a\xe3\xdf\xf2\x2a\xa6\xfd\x72\xbd\x7e\xe0\x8d\x33\xb3\x89\x78\x3f\x53\x93\x05\x83\x17\x37\xe6\xa5\x83\x17\x11\xfd\xda\xc1\xde\x4a\x6d\x6c\xf9\x9e\xcb\x39\x37\xd4\xc9\x40\x97\xa6\x53\x83\xcb\xf1\x5e\x7d\x99\xa0\x23\x77\x3d\xad\x09\xb2\xc2\xac\xcd\x6f\xc3\xe4\x46\xbc\x99\xa1\xf7\x5e\x4c\xc8\x2e\x8c\x0f\x8f\x2e\x06\x2f\x6c\x4c\x8f\x7b\xff\x4c\xcc\x1b\xdb\x13\xfb\xee\x99\x40\x8f\xf8\xfd\xcc\x7d\x8d\xe9\xd4\xc7\xd3\xb1\x01\xfc\xec\xd8\xb2\x60\xfd\x7b\xf7\xb3\x5f\x3d\xba\x30\xcd\xd7\xf9\x26\xbd\x35\xcd\x54\x73\x4d\x5c\x5d\x11\x63\x03\x2e\xff\xd8\x57\x86\x60\xfe\xf1\x3c\x60\x7a\x87\x3e\x7d\x0c\x98\xff\x65\xbe\x3a\x17\xc9\x9b\xbb\x27\x7f\xf6\xcd\x21\xe6\x8e\x71\x75\xe0\x24\x9c\x53\x00\x6b\x3e\xfd\xbf\x09\xf8\x09\xd6\xdb\x06\xff\x1b\xe3\xf8\xd7\x55\x4e\x46\x7e\xef\xf0\x91\xba\xb5\x0f\xad\x65\x66\x45\x63\x9c\x65\xaa\xf9\x09\x2e\xab\x08\xb1\xa7\xdc\x71\x1f\x7a\xb2\x19\x9c\xf9\x01\x0f\xe2\xb1\x7d\x42\x24\x46\xd0\xb5\x4b\x77\x57\x4c\xc0\x9b\x52\x93\xd5\x7b\x97\x4d\xd0\x3f\x31\x9f\xdb\xfb\x69\x02\x7e\x9f\xd7\x47\x13\x98\xcb\xf2\x80\x59\x7c\xe8\x78\xd8\x0e\x40\xd7\xd7\xf9\x90\x4e\x90\xb9\xc4\xa5\xb3\xa1\xc7\x31\xf7\xb9\x7f\x1d\x20\xfd\x54\x43\xe5\x09\x63\x90\x6b\xeb\x10\x9c\xe5\xd4\xd6\x14\xd3\xde\xde\x3f\x10\x70\x62\xdd\x06\xc5\xfa\x76\xbc\xbd\x7e\xa4\x7a\xf7\x4e\xab\xee\xdd\xf5\xb8\x9e\x7b\xff\xaf\x09\x1a\xb6\x6a\xf2\x66\xef\x2d\x04\x1c\xe3\x2a\x83\xf3\x30\xef\x85\xf5\xfa\x88\x27\x2b\x36\xac\x0e\xad\x87\xfb\xfe\x9a\xc6\x3a\xbc\xbf\x4e\x6f\x4d\xe0\x85\x58\x6e\x6d\xcb\xd4\xfb\xf1\x06\x1e\x6e\xa0\xbb\xea\xd5\xf7\x33\x0f\x85\x78\x6d\x40\x87\x7b\x67\xd5\xf3\x0c\x9f\xae\x77\x36\xe6\xb5\x87\x7b\x09\xfc\xe0\xf7\x0f\x6c\xc2\x74\x8b\x23\x3a\x06\x2f\x08\xeb\x78\x9e\x3c\x0a\x9d\xa5\x08\xb5\x3e\x86\x7f\x5e\xcf\xb7\x3d\xba\x19\x5c\x46\xf0\x2b\x5c\x2b\xc8\xdb\xff\x07\x56\xd5\xe3\xce\x5f\xcb\xa5\xc4\x1c\x08\x9a\x18\xac\xf1\x49\x2e\x96\xaf\xcd\x39\xf3\x8d\x10\x4d\x04\xed\x58\x9d\xf5\x7a\xfc\x41\x5c\x7d\x7a\xcf\xf7\x09\xbe\x6d\xb8\xef\xbb\x6b\xcf\xa4\xb6\xf3\xee\xd3\xed\xb3\x83\xb6\x7e\x50\xd3\x77\xf6\xfc\xe0\xf4\x5a\x1f\x62\xad\x8f\x01\xa3\x5e\xd6\x7a\xeb\x3c\xf0\x54\x3d\x2f\xf4\xe6\x3c\xf0\x58\xf0\xbe\x7f\x76\x34\xf8\x7a\x88\x5e\x96\x56\x84\xd8\xa3\xee\xde\x3a\xf2\xf2\x07\x60\xee\x83\xee\xde\xda\xb6\x0c\x3c\x00\x8e\x9d\x7d\xca\xfc\x62\xb0\xae\x81\xed\x37\xf0\x68\xd0\x0f\xeb\xad\x91\xd7\x8f\x75\x05\xc1\x73\x73\x55\x78\x9c\xde\xbd\xba\x7e\x8d\xdc\x7d\x15\xf7\xeb\xa8\x4d\xb4\x51\x87\xd9\xc6\xf6\xc5\x73\xc7\xd4\xf3\xa7\x7d\xd8\x77\x64\x5f\x5c\xcf\xbb\x7d\x99\x7b\x67\x88\x2e\x8d\x2a\x5e\x07\xbe\x31\x41\xb6\x62\xfa\x1e\x9c\x31\x81\xee\x3d\x1a\x3b\xbb\xbe\xdf\x01\x5c\x7b\xec\xc8\x2b\x13\xec\x9a\xd9\x58\x37\xbb\xa4\x91\xee\x11\xa7\x5f\x48\x4d\x90\xf5\x98\xbf\x64\x7e\x4a\xac\x9b\x52\xc3\x9b\x7d\x29\x01\xf7\xf0\x70\xd3\x04\x3e\x8d\xdb\x1f\x78\x24\x64\xe3\x05\xfb\x73\x13\xf6\xa5\x4c\x7c\xff\x85\x8b\xf1\xfa\x5b\x21\xf9\x61\x54\x65\x67\xe8\x6c\x0d\xd3\x8b\x85\x7d\x62\x1b\x47\x27\xd8\xae\x78\xaf\x3d\xbf\x90\xd8\x23\x84\x6e\xb0\xb9\x3f\x34\x5f\x23\x9e\xb2\xb0\xaf\x61\xf8\x92\xfa\x76\xf6\xfc\x47\x68\x8f\x04\xba\xd6\xe1\x58\x68\x9c\xae\x9e\x9e\x09\xf6\x0e\xbd\x1d\xc7\xb7\x81\x18\xd0\x70\xcc\x92\x02\x5a\xc1\x7c\xb0\x08\x9c\xe7\xdf\x4e\x06\xb0\x35\x36\x99\xa8\xe0\x35\xab\x73\xd2\xb4\x96\x8e\x16\x18\xed\xee\xc1\x26\x95\x1f\x76\xda\x14\xb6\xa9\xda\x5d\x9b\xca\x35\xac\xda\x68\xd8\x14\x8d\x4d\x9d\xee\x3b\x90\xda\x89\x32\x0f\x3d\xed\x94\x6b\x75\x75\x54\xd3\x85\xc6\xf8\x6c\xce\x34\x59\x21\x29\xf1\xbc\x90\xcb\x21\xc3\x70\x46\xe0\x13\xd9\xbb\x74\xb4\xdb\xf9\x23\xfc\x15\x7c\x5b\x10\xd7\xbe\xf4\xd2\xad\x72\x05\xa0\xb2\x68\xf2\x7c\x42\x10\x39\x94\x41\x99\x04\x7c\xe3\xb9\x8b\xd1\xb7\xcf\x81\x4d\xd6\x5d\xe7\xc3\x32\x6c\x86\x40\x74\xdf\x71\x54\x39\x8b\x2c\x1e\x72\xa8\x1c\x11\x25\x4d\x56\x93\x53\x5f\xe2\x98\x49\x51\x94\x3b\xf3\x9f\xb7\x8e\x4e\x1d\xe3\xa8\x51\x27\xa1\xc3\x12\x4a\xd2\x8a\x5e\x36\x4a\x6a\x42\x4f\xa4\xb9\x2f\xf7\xc1\x44\xd3\x78\x3e\x92\x3b\xfa\xbd\xa6\x59\x2b\xc4\x11\x85\xe1\x39\x8e\xd7\x33\x92\x92\x64\xca\xb2\xd8\x6c\x32\x7c\x29\xa1\x8b\x62\x73\x93\x24\xc9\xa7\xf1\xe8\x38\xde\x5e\x9d\x11\x04\x51\x57\x34\x9e\x96\x50\xc6\x66\xf4\xc4\x69\xa7\xe5\xd1\x88\x2a\xdd\xfa\x3d\xc4\x22\x53\xb1\xfd\xb5\x78\x91\xd6\x98\x35\xe6\x41\x30\x50\xa9\xcc\x89\xcc\xff\x41\xdc\xa3\xb4\x98\x7f\x56\xab\xe3\x3c\xde\x9d\xe0\x54\x5c\x3d\xfe\xda\xea\xb9\x9b\x77\x3a\xd3\x52\x8d\x7b\x0f\x32\xc3\xb5\xb4\x87\x6e\xed\x11\x4b\x91\xea\x0c\x9b\xbf\x38\x52\xde\x5b\x8a\x58\x77\x4f\xf7\x24\xc2\xbc\xb5\x20\x67\x45\x64\x0b\x32\x68\x0c\x72\x28\x99\x85\xbc\x88\xf4\x51\x94\x2c\x21\x4d\x82\x5c\x0e\xa5\xa1\x82\x0a\xb0\x18\x91\xc7\xed\xea\x87\x2a\x9a\x28\x8f\x14\x68\x40\x9e\x17\xf4\x92\x61\xa4\xd9\x42\x89\x57\x14\x29\x21\xcb\x2c\x1a\x45\xc5\xf4\xd8\x28\x52\x12\x90\xcd\x1b\x5a\xa1\x68\xab\x76\x29\x27\x17\x8a\x8e\x25\x8d\xa0\xb2\x30\x4a\xa7\x25\x49\x92\x0c\x94\x30\x0c\xd1\xd2\xca\x25\x43\x57\x74\x03\x8e\x4a\x12\x2a\x89\x68\x54\x42\x3a\x57\x30\x12\x49\x36\x2d\x1a\xb6\xc0\xb2\x49\xc6\x56\x45\xc6\x68\x16\xd5\x04\xa3\x0b\x72\x52\x95\xad\xb4\x2a\x31\x09\x0e\xb1\xa2\xaa\x69\x92\xac\xaa\xbc\xce\x05\xf2\xc9\xaa\xc9\x27\xbb\x76\xbe\x3c\x35\x96\xa5\x55\xcc\x3b\xde\x89\xd3\x87\xdf\xab\x97\xa5\xde\xde\xdb\x75\x7c\x63\x3b\x87\x38\x07\xf7\x63\x3f\x0f\xdd\x35\x41\xb6\x1b\x35\xde\xb7\xe9\x3b\xa1\xbd\xaa\xc7\x53\x7b\xec\xd0\xfb\xde\x59\x91\x1e\x4f\x1d\xfc\x0e\x61\x73\xbf\x17\xf0\x7b\xa5\x26\x07\x36\x3f\x11\xea\xc3\x6d\xeb\x87\x75\x6d\x09\xe4\xfb\x96\x4a\xc8\x0d\x8d\x80\x7f\x29\xd0\x2f\x17\xc6\x56\x61\xdd\xcf\x8a\x1e\x9d\x93\xe2\x67\x30\xbd\xd9\x8b\x3f\x07\xe6\x0d\xf1\xf5\xb6\x22\x9e\xcb\x91\xaf\x11\xed\x11\xfc\xc8\xba\xa9\x5e\x8f\x5b\xff\x07\xec\x2b\xb5\x88\xf7\xcd\x5a\xff\x9b\xae\x20\xc6\x9b\xaf\xc1\xf7\x24\x88\xf7\x09\xf9\xd7\xff\xee\x04\x1d\x16\xcb\xa1\x6d\xef\xd6\xeb\x59\x9e\x1c\xdd\xd3\xd7\xf8\x7d\x22\x46\xc2\x97\x37\xbb\x7f\x05\xc2\x3e\xbc\x90\x9e\x75\x70\x17\x01\xd7\x6b\xf0\x3d\x5f\x9d\x60\x8b\x62\x9a\x19\x58\x54\x6f\xf3\x7b\x78\xb3\x6e\xab\x87\xfb\xe3\x3c\x27\xe0\xbf\x52\xec\xca\x2a\xff\x8d\xd3\xe6\x43\xbb\x1a\xca\x83\xad\x35\x5d\xde\xb5\x15\xe5\xaa\xfc\xd8\x34\xd0\x58\x5f\x1e\xf8\x54\xc8\x36\x0e\x68\x7b\xc7\x4f\x26\xf8\x1a\x5e\xc1\x7a\xd1\xcd\x04\xfe\x0d\x42\xcf\xa9\xc6\xc6\x5b\x18\xce\xc7\x53\xd9\x9b\xb0\xbe\x9c\xac\xd7\xf9\x0e\x2e\xaa\xa3\x47\x5f\x3f\xf0\xda\x19\x5e\x5b\xff\xbe\x3b\x9e\x38\xbd\xf5\xbf\xea\x75\x3b\xdf\x77\xfb\x7b\x50\xb3\xcf\x6a\xf4\x96\x7a\xa1\x13\x53\x85\x97\x3b\x5f\xc0\x3e\x48\xd7\x0e\x7b\xd0\xb5\x07\x9f\xff\xf3\x49\x60\xfe\x27\xf8\x86\x76\xc5\xce\x7f\x34\xde\xd3\x7b\xaa\x71\xdb\xcb\xaa\xf0\x5d\x06\xae\x29\xf1\xf2\xfb\x75\x78\xdd\xf3\x7c\x88\xae\x83\x7d\xe8\xad\xa7\x75\x63\xbd\x7c\xf7\xfb\x7d\xbf\x7e\x7d\xb2\x38\xde\x7d\xdf\xca\x7a\xde\xe3\xe9\x2d\xbb\x67\xd6\xeb\x51\xde\xba\xed\xfe\x4c\x48\x0f\xd5\xab\xfb\x6f\xe7\xf1\x04\xfe\xcc\x1a\xdd\xed\x6a\xaf\xf7\x15\xec\x39\x12\xd2\xa3\xe4\x4a\x92\xb4\xed\x0f\x32\x8d\x7c\x0b\x4c\x6a\xf7\xf1\xd8\x6a\x7a\xb5\x4e\x77\xf4\xfa\xf8\x53\x68\xac\x46\xb0\x76\x97\x35\xde\x83\xd9\xff\xae\xa7\xbd\x0d\xe7\x4d\xc0\x29\xa1\xc3\xed\xbc\x7b\xc2\xde\xc4\xfd\x66\xd7\xd6\xd3\xcc\x4e\xbb\x8e\xe7\x48\xde\xda\x7b\x73\x3b\xfc\x87\xc6\x6b\xbf\x3d\x41\xf0\x61\xa5\xe6\xe7\x3a\xf4\x7c\x3d\xaf\x3b\x82\x6b\x21\xee\x79\xab\x21\x8e\xe8\xfe\x5f\xd5\xf3\x40\x3c\xfe\xc5\x3b\x7f\x06\x9e\xab\x7c\x38\xfb\xfe\xf9\x6f\xd7\xef\x37\x86\xde\x75\x22\xb1\x9e\x58\x2f\xdb\xd5\x8d\xf7\xe1\x5b\xc4\xdc\x08\x1f\xe4\xae\xb7\xea\xf5\x68\x1f\xfe\x66\x3d\xdd\xf9\x36\x7e\x3a\xc4\x77\x5c\xfe\xf2\x2e\x8e\x53\xc2\x4f\x87\xb6\x84\xf1\x97\xc1\xbe\x22\x0b\x47\xf6\xf5\xff\x17\x7e\x26\x62\xbe\x67\xc4\x53\x83\x98\x4f\xf6\xff\x32\xa4\xd7\x06\xb8\x1d\x58\x42\xf4\x73\x9b\x0b\xdf\xb1\xf7\x65\x77\x2d\x9e\x9c\x30\x8f\x4b\x6a\x31\x57\x3b\x1f\xa8\x93\x97\x78\x3d\x76\xb7\xd7\xeb\xb0\x9e\x6d\xb1\x7b\xb0\x5e\x07\xf7\xd6\x69\xef\x58\xbd\xdc\xf5\xe5\xf7\x1b\x21\xba\xd1\xab\xf3\x3b\x82\x2b\xbf\xf7\xbf\x83\x9f\x19\x95\x44\x2c\x43\x0b\xf1\xd4\xc0\xe5\xcd\x45\x97\x76\xd8\x62\x18\x5f\xbb\x7f\x38\x81\x36\x77\x04\x6b\xdb\xbb\x7b\xee\x2c\x30\xef\x3c\x5c\x64\xe3\x33\x3e\xee\x0d\xd0\x02\xda\xfc\x3c\xe8\xd5\xfb\x76\x32\xe8\x03\x6b\xc1\xcd\xd5\x4a\x3d\x58\xfb\x72\x35\xaf\x69\xa9\xce\x88\x57\xb5\xac\xfe\xdc\x82\x08\x8b\x98\x84\xc3\x51\x5b\xdb\x27\x55\xef\xda\x75\xf7\x74\xf7\xb4\x51\x91\xee\x9e\x40\xb5\xeb\xec\xc6\x87\x15\x93\xda\xa8\xea\x17\x29\x1c\x6b\xd5\x1a\x9b\xd5\x49\xeb\xb6\x62\x27\x92\xc8\x44\x32\x9b\xd7\x6d\x4d\x2d\xc3\x66\x96\xdb\xb9\x62\xde\x9d\xf3\x2e\x19\x79\xb6\x7b\xed\xc1\xee\xe6\x67\x9b\xd7\xa2\xbf\xbe\xb9\x36\xd2\xb4\x76\xc6\xb3\x33\x56\x8f\x7f\xe7\xf1\x4b\xd6\x3e\x70\xe7\xf3\x11\x73\x5c\x8d\x46\xac\x71\x85\x32\xcd\xc8\x31\xa6\xf9\x61\x9f\x2e\x0b\x82\x55\x2c\xeb\x2a\xa7\xcb\xbc\xc1\x24\x47\xca\xac\x6d\x1a\x56\x32\xab\x66\x54\x98\x96\x92\x66\x52\x44\x92\x99\x10\x4d\x11\x6a\x9c\x95\xa6\x3b\xf7\x17\xcf\x9b\x33\x7b\x76\xdb\xbd\x0f\xa3\xe9\xa5\x6b\x8e\x4d\x2d\x3f\xf7\xe8\x4f\x74\x93\x33\xb5\x66\x64\x27\x13\xac\xc1\x66\x65\x5e\x84\x5a\x6e\x84\x1b\xcd\x35\xb3\x63\x19\x31\x1f\xd9\x69\xbd\x6d\x51\x94\x93\xa5\x44\x27\x4b\x2d\x6d\x4e\x18\x16\x87\x58\x54\x4e\x24\x55\xde\xce\x0b\x02\x27\xb0\x46\x66\x2c\x99\x30\x47\xa1\xc6\xa2\xcc\xb8\x6e\x17\xd2\xf9\x4c\x73\xba\x02\x4a\x42\x69\x64\x64\x94\x29\xe7\xeb\xf6\x81\x67\x0f\x0f\xfc\x7d\x82\xdd\x8b\xf7\xdf\x4e\xad\x11\xcf\x89\xa7\xfa\xef\xc7\x56\x65\x67\x23\xfa\x0c\xc5\x04\x12\x7b\x6d\xd7\x29\x04\xbd\xe1\x3a\xc8\x1e\xff\xda\xc8\x04\xba\x16\xee\x9b\xe9\xdb\xb7\x32\x0a\xe6\x44\x78\x10\x4f\xed\xbf\xf7\x04\x10\xa7\x87\x3e\x11\xe6\x4b\x1e\xbd\xef\xfc\x76\x73\xcd\x97\x83\xfd\xf8\xd9\x56\x97\x7e\xf7\x60\x4b\x78\xfd\xdb\x3e\x0f\x12\x3d\xbd\xc4\xe3\x41\x3b\xc6\xeb\x79\xab\x27\x97\x76\x70\xf5\x72\xd7\x1b\xdb\x86\x3b\xea\xf1\x92\x99\x8b\xcf\x76\x26\x55\xad\xc3\x60\xfe\x81\x6e\x65\xff\xa5\x31\x1f\x1d\x26\xeb\x32\x69\xb4\xe5\xeb\x08\xa9\x6c\x05\xef\xb7\x5f\x04\x3a\x33\x21\xcf\xac\xb5\x21\x1e\x1b\xc8\xb3\xc1\x4f\xd7\xfb\x35\xbc\xf5\x1a\xda\xdb\xc8\x0f\xc2\xd0\x7b\x3f\x47\xf0\x06\x0c\xb7\xbe\x38\xc1\x3e\x27\xfd\x39\x47\x83\xb1\x8a\x1e\x7f\xf3\xf0\x37\x7c\x63\x63\x3f\xc5\xa6\xde\x90\xac\xd1\xab\xbe\xb3\x6d\x1b\x18\x0f\xce\x55\x16\xc6\x5e\xc7\x71\x55\x2f\x77\x1f\x9d\xf7\x7b\x7e\x3a\xd3\x3b\x7c\xd9\x7b\x47\xe7\x77\xf2\x33\xea\x64\x20\x9e\xb7\xfd\xfd\xc6\x7a\x42\x28\x56\x93\x38\xe3\xd8\x71\x3d\x61\x73\x98\x35\xbe\x6f\xdd\x50\x8f\x27\xbf\xfd\xff\x53\xbf\xae\x43\xbf\x0c\xd9\xfb\xde\x5d\x54\x35\x9e\xda\x8b\x63\x08\xfa\x7f\xde\x58\xdf\xb0\xdf\xf1\xe1\x62\x70\x2e\xbc\x13\xbf\xff\x9f\x01\xbc\x2a\x03\xf1\xfb\xfd\x23\x13\x78\x37\xa6\xb3\xad\xff\xd9\x58\xaf\xdf\x11\x27\x64\xa9\x17\xa3\xf0\x63\xac\xdf\xfd\x04\x6b\x29\x3f\xf2\xf7\xcd\x59\xb1\x1c\xfd\x10\xd3\x97\xb9\xa4\xe9\xe8\x5c\x8a\x9f\xce\x74\xbe\x70\x3b\xf8\x31\x88\xc6\x69\xa3\xa3\x1e\x8f\x3b\x66\x62\x3f\xce\xca\x7a\xb8\x37\x0e\xeb\xfa\xc6\x32\x64\x93\x54\x3f\xee\x8d\xbf\x0a\xe1\xcb\xdd\xbb\x87\x68\xd3\xdd\xbb\x11\x30\xf7\x3e\x1e\x30\x8b\x0f\x3e\x00\x1e\x00\x60\x4e\x9c\x0f\xe9\xd7\x9e\xdf\x6c\xcb\x71\xc4\xbc\xb4\x9a\x5f\xc5\xaa\x9d\x9d\x88\xa4\x3d\xb6\xe9\x12\xe2\xfd\x4c\x4d\xef\xc2\xd8\xa0\x2d\x25\xd8\x57\x99\x80\x56\xab\xcf\xd6\x04\xf3\x21\xf0\xba\xe5\xef\x8d\xe7\x19\xd4\xdc\xf7\xe8\xd1\x8c\xa7\x36\x2d\x0a\xd9\x3f\x75\x3a\xcd\xf6\x3c\x01\xc7\x74\xbf\xe1\x97\x55\xee\x13\xd0\x23\x61\xff\x6c\x58\x3e\x81\x7e\xf1\xc9\x53\xe0\xcf\xab\x1b\xcf\xc1\x3b\x09\x7c\x10\xfa\x3d\x8e\x56\xa5\xfb\x7f\x16\xd0\x18\xd6\xb1\xfd\xc8\xcb\x9f\x36\x94\xeb\xf4\x86\xad\xa1\xbd\x10\xf0\xdf\x2d\x7f\xab\xe7\x31\x5e\xdf\xdb\x8f\x09\xcd\x21\x78\x7f\x68\x82\x8d\xe8\xf3\xaa\x3e\x82\xbf\x61\xde\x70\xc8\xd3\x43\x6f\x0a\xe9\x44\x7a\x3c\xb5\xe9\x9c\x09\xbc\x47\x21\x68\xd0\x26\x6c\x29\xcd\xb5\xe1\x3c\x5b\x6a\xe3\xde\x10\xaf\x32\x82\x33\xf0\xd6\x7a\xbd\x72\x58\x9a\xb0\x66\x18\xa7\x16\xae\xf7\x69\x15\x08\x78\xae\xe6\x0f\x1f\xc2\xd1\x7d\xfd\x3f\x09\xe6\x4c\xc8\xae\xfe\x1f\x13\x38\xcd\xbb\xbc\xdb\xc3\x69\xff\x8f\x02\x7e\x51\xad\x4f\xf6\x2c\xd6\x11\x57\xe1\xa7\x3f\x0c\xeb\x76\xd6\x6a\x50\xef\xbb\xc5\xf8\xdb\x38\x2f\x64\xeb\x2c\xab\x9c\x15\x3b\xe4\xed\x95\xf7\xa3\x4c\xef\xa1\xf7\xe6\x1d\x9d\x77\x11\x71\x2f\x30\xa0\xa7\x38\xbd\xf5\xc2\x7a\x7e\xec\xe1\x70\xf3\x4d\x8d\xe9\x69\xeb\xb7\xea\x6d\x11\x8f\xdf\x6f\x33\x08\x1a\x20\xec\x9d\x4d\x7f\xac\xe7\x13\xde\xfe\x3d\xbc\xae\x9e\xaf\xfa\xb4\x34\xa9\x5e\x9f\xf6\x74\xca\xec\xa9\x18\x1f\x6f\x37\xda\x8b\x9b\x8f\x12\xf6\x05\xe9\x83\xb9\x76\x02\x9d\x61\x9e\x7e\xe8\x47\xc4\xdc\x88\xd8\xa0\x2d\x55\x9f\xc3\xea\xca\xe2\xd8\x1e\xfa\x01\x66\xcd\xa6\xd9\xce\x37\x2a\x95\x9e\xa1\xf9\xbb\x98\xde\xdd\xbf\xba\x07\xce\x79\x98\x5f\x11\xe0\xc4\xac\xf6\x93\xd9\x40\xf4\x83\xf5\x88\x81\x59\x38\x97\x2b\x9e\x69\x7f\xb1\x11\x5f\xde\xfa\xcd\x7a\x9d\xda\x3f\xd7\xda\x18\xda\x03\x5a\x95\x76\xfb\x7f\x50\x3f\x17\xaf\xf5\xed\x2f\x13\x7b\x8c\xf4\x63\xa8\xc4\xbe\x37\x6b\x7b\x72\xdf\x07\x21\x1d\x4a\x8b\xa7\xfa\xdf\xc0\x76\x78\x55\xbe\x5f\x52\x59\x1e\xdb\x4d\xdf\xca\xf4\xed\x79\xab\x02\xce\x1c\x9a\xff\x36\xd3\x3b\xf0\xa0\xf4\x89\x39\xff\x9c\x7f\x1b\xc1\x23\x03\xfe\x15\x8a\xad\x25\x70\xfc\xe2\x5f\x1a\xcb\xa9\x8d\xa4\x2f\x10\xfb\xa5\x86\x2f\x05\xa4\x5f\xdd\xe3\x83\x66\xb5\xfd\x20\x46\x57\xc3\x7b\xd9\xac\xd3\x79\xbe\x1f\xd6\x3d\xf6\xe1\xf8\xe0\xad\x55\xde\xa9\x07\xb8\xfd\x1c\x7e\xfb\xad\xfa\x31\x79\xef\x0f\xdc\xd3\xd8\xe6\xda\x12\xaf\x1f\xeb\xc0\xdd\x35\x99\x85\x73\xae\x08\xb1\x6d\x38\xbe\xdf\x8b\xf0\x5c\x08\xbe\x04\x6e\x07\x77\x83\x07\xc0\xa3\x60\xf3\x47\x44\xfa\xff\xef\x6c\x0b\x78\x0c\xc4\x8f\xe8\x58\x3b\x13\x23\x13\xcb\xe1\x44\x2b\xde\x97\xfd\xdf\x3d\x6d\xdd\x3d\x53\x60\x77\x4f\x07\xdd\xe2\x85\x5b\x11\x16\x4e\x8f\x67\xfd\xf4\x60\xf3\xa7\xe3\x73\xa9\x2e\x4a\xad\xbf\x29\x80\x36\x7f\xe9\x52\x7e\xfe\x23\xb9\x77\xbe\xb4\xfa\x8c\x9b\x2f\x39\xf3\x2b\xc7\x9c\x94\x7f\xe7\x94\x27\xf5\xaf\x3c\x72\xd2\xd6\x55\x1b\x56\xc1\xd8\xb2\x13\xf5\x13\x17\xa3\x47\xf4\xd6\xc5\xfa\x62\xb8\xec\x8c\x47\xa6\x52\x9b\xa5\x25\x0b\xfa\xbe\xda\xf7\xc0\x31\x93\x29\x67\xe6\xa9\xcf\xcc\x5c\x78\x52\xdf\x69\x33\x27\x4f\xbe\xfa\xa4\x0b\x17\x9e\x25\xde\xda\xf7\xcc\xd5\x8f\x49\xeb\x1e\x7f\xe5\xaa\x97\x6f\xbc\x71\xf6\xad\xa7\x4d\x3e\xeb\xc6\x05\xd3\x1e\x6c\xed\x5b\xf0\xc0\xcc\x75\x54\xf4\x19\xf1\x01\xf1\xf1\xf1\xa3\x0f\x2e\xbc\xec\xc1\xbe\xbf\x3c\x73\xda\xba\xe7\x26\x9f\x14\x7b\x26\x76\xdb\xef\x5f\x59\x17\x7d\x6f\xe3\xc6\x8d\x1b\xef\x73\xff\xa0\x37\xfe\x5f\xac\x93\x08\xbf\x63\x45\xef\x95\xaf\xc3\xb9\x27\xce\x3f\xd3\xc9\xad\xbf\xfd\x98\x87\x8e\x59\xac\xc2\xa7\x33\x5b\x4e\x3c\x55\xed\xdd\x72\xfb\x95\xda\x3d\x67\xbc\xf2\xf0\xc5\xeb\xfb\x4f\xb9\xe1\x94\x8b\x2f\xfe\xf9\x29\xf7\x3e\xa4\x3a\x39\xed\xde\xa5\x0f\xdf\xde\xba\xf7\x95\xde\xaf\xed\xed\x3d\xe5\xfd\x9d\xf3\x5f\x7f\x05\xbd\xd0\x7a\xe2\x89\x27\xae\xff\xc2\xeb\x97\xf0\xbd\x75\x7a\xa9\xc7\xb7\xb7\xbe\xf2\xb1\xb6\xef\xf7\xc2\xbc\x6d\x10\xd7\x96\xdc\xf4\x8d\x90\x2c\xb6\x02\xdf\xdf\x77\x42\xf2\x27\x90\x93\x9b\xba\xeb\xf7\xb6\x2f\xdf\xae\x69\xc8\x53\x53\xfb\x71\x85\x95\x5d\x87\x1a\xf1\xb6\xe1\x29\x21\xfd\xda\x88\xa7\x86\x5f\xc2\x75\xcf\x3c\x29\xf4\xdd\xe0\x3b\x84\x4f\x32\x14\x8f\x6e\xd7\x78\x4e\xff\x7f\x10\xe3\xf2\xee\x3c\x5e\x0c\xea\xcf\xc6\x26\x8c\xab\xff\xcd\xb0\x9c\xf1\xf8\xc4\x96\x09\x31\x2d\xde\x77\x2c\x4f\x96\x16\xc2\x38\xf6\xe6\x3f\x70\x57\x88\x87\xd5\x72\x43\xbc\xd1\x58\xbe\x0f\x0d\xd4\xdb\x53\xde\xbe\x7f\x74\x59\xbd\xac\xf1\xe0\x5b\xfe\x83\x58\x27\x02\x1f\xf6\x82\x7a\x5d\xfa\xf0\xef\xb1\xef\x0e\x47\x5a\xee\x5e\x19\xe0\xc4\xb3\x9b\xf0\xdd\xb7\x7d\x57\x55\x25\xf3\x44\x99\x36\x8c\x75\xb0\xe1\xc3\x84\x7c\x08\xec\xb3\x2d\x6d\xf5\xfa\x9f\xaf\x3b\xfd\xa2\x9e\x26\xbc\x39\x0e\x7f\x21\xa4\xf3\x28\x55\xb9\x91\x6d\x0e\xde\xf7\xf5\x3f\xcf\x9f\x6d\x5d\x15\xe2\xdb\x01\x6e\x6d\x9e\x68\x3f\x57\xf3\x59\x79\xf3\xc8\x5c\x4a\xe0\x31\xa0\xd3\x83\xb3\x43\x3e\x28\x2d\xd0\x6d\xbe\x43\xc8\x32\xb3\x26\x33\xac\x97\x42\xf0\xc0\x36\x1c\xda\x1d\xa2\x85\x20\xbe\x66\xf8\x33\xa1\x39\xa8\xd5\x39\x6c\x26\x75\x08\x9d\xa0\xcf\xd7\x43\xb8\x0b\xf6\xec\xfe\xa9\x8d\xe8\x80\xa1\x37\x3d\x37\xc1\xa6\xf7\x74\xa0\xf1\x90\x9e\xa0\xc7\x53\xd9\x1b\xf1\x78\x2e\x6a\x2c\x5b\x37\x6d\xf6\xe1\x7c\x75\x6d\xf6\x95\x4b\x20\x4e\x9b\xd8\x56\x00\xad\x40\xaa\xc8\xb1\x23\xf8\xde\x74\x07\xce\x20\xba\x08\x2c\x01\x4b\xc1\x45\xe0\x72\x70\x35\xb8\x0e\x7c\x11\x7c\x09\xdc\x07\x1e\x01\xfd\xe0\x59\xf0\x22\x38\x02\xbe\x01\xbe\x89\xfd\x59\x58\x86\xa4\x3a\xe1\x7c\x88\xcf\x12\x83\x84\x43\xdd\xd5\xf8\xd9\x68\x0f\x76\x76\x35\x7a\xe2\xdf\x20\x6c\xab\x66\x8f\xf2\x64\x02\x79\xc9\x9f\xb8\x34\xe8\xfd\x9e\x44\x78\xca\x3a\x08\x4f\x19\x55\xbb\x5c\x58\x93\x5f\x21\xf1\x55\x3b\xe8\x6c\xf7\x5b\x75\x45\x58\xf4\xf8\x19\x27\xdf\x89\xce\xdd\xdc\x36\x05\xfe\x7d\xc5\xd2\x2f\x7e\xf1\x99\xa5\x73\x8f\x5d\x91\x6a\x5b\x71\xec\x33\x07\xa7\xac\x5c\xb1\x74\x69\xdb\xea\xb9\x6b\x67\x8c\xb3\xab\x53\x53\x6e\xb9\xf3\xfe\xfb\x8f\x5d\xd1\x79\xf2\x6a\xf7\xd1\xea\x95\x4b\x2f\x69\x5b\x3d\xef\x96\x6e\xf8\x19\xf8\x25\xf4\x94\xfb\x69\x86\xd7\xa0\xed\x5f\x7c\xfc\x71\x6a\xcf\xa2\x63\x57\xb4\x75\x8f\xbf\x3d\xef\xd8\x15\x6d\x33\xa8\x87\x56\xb6\x4d\x59\x9d\x1a\xef\x5f\xe1\xfe\xd5\x74\x47\xaa\xed\x8b\x4c\x6a\xfc\x3f\x67\x1c\xbb\xfa\xd8\x19\xef\x5b\x9c\x61\x08\x8c\x95\xd4\x4a\x25\x0d\x2a\x9a\xa4\x49\x1a\x12\x4c\x51\xb1\xf4\xa6\x84\x22\x98\xbc\x72\x74\xfd\xe3\x3b\xbf\x79\xcb\xca\x29\xeb\x66\x74\xde\x9a\x38\xf8\x66\xe7\xad\x6b\xd7\xae\x6d\x7b\x66\xe5\xe3\x2b\x9e\x58\x36\x6f\xd1\xe3\xdd\x53\x6e\x9d\x32\x17\xbd\x76\xe7\xb1\xf3\x6e\xed\x86\xa9\x19\x8f\x4f\xa1\x75\x51\x52\x14\x9e\xaf\x00\x46\x4f\x17\xad\x44\x82\x4d\x2b\x46\x5a\x60\x93\x8a\xa4\x27\x18\x45\xcb\x25\x6d\x89\xe1\xf9\x74\xc9\x60\x27\x3e\x31\x14\x41\x11\xd1\x88\xa8\xf3\xaa\x96\xd4\xd5\x04\xfe\xdd\x9c\xcc\xea\x9c\x69\xe0\xdf\xba\x6a\xa6\x2d\x35\x89\x7f\xa3\x21\x94\x4e\x27\x78\x95\xb3\x65\x41\x86\x23\x9a\xa6\x99\x7a\x9a\x43\xa5\x82\x38\x5a\xc8\x16\xf8\x62\xa6\xe9\x04\x16\xb5\xa0\xdf\xa7\xd9\x4c\xcf\x1b\xff\xe4\x36\x5d\xc6\xdd\x9b\xf9\x67\x92\xd1\x7f\x05\x6f\x4f\xa3\xbd\x3f\x68\x66\xb6\x8f\xef\xcb\xbc\x91\x2e\x0c\x26\xff\x59\xe4\x47\x5e\x7d\xb5\xc8\x94\x5e\x04\x80\xa2\x98\x8a\x1c\x1d\xa3\x75\x9c\x07\xd5\xbb\x89\xd3\xd3\x86\xdd\xa5\x74\xac\x13\xb8\x3a\x48\x77\x4f\x37\xc4\x29\x8f\xa3\x49\x13\x8d\xa1\x02\x64\x47\x59\x64\x23\x21\x9d\xcd\xe4\x47\x92\x30\x5d\x30\x33\x68\xb4\x68\x6a\x30\x9d\x44\x0a\x6a\xe6\xa8\xe6\xa6\x32\x87\x92\x68\x94\x13\x0c\x85\xd7\xad\x62\x9a\x31\x21\x0b\xcb\x2c\x4a\xa3\x51\x26\x91\x19\xcf\x5b\x86\x6a\xfb\xb9\x5e\x05\x7a\x0c\xf3\xcd\xff\xc4\x7c\x60\x25\xc1\x4f\xbd\x7b\xb3\x38\xc2\xef\xc0\x67\x02\xb8\xe1\xeb\xc0\x18\xbe\xff\x75\xc2\xa7\x64\xd6\xe0\xc3\x85\x7a\x3b\xcd\x83\x1f\xaa\xd5\xfa\x51\xfd\x18\x43\x1c\x6f\x9a\x25\x63\xd9\x64\xe2\xfd\x47\xea\xdb\x79\x11\xdf\xb7\xd8\xff\x61\x00\xf7\xe3\xa8\xbc\xf7\xb7\x97\x88\xf1\x60\xbe\xbe\xff\xfb\x75\xed\xab\x1e\x0f\x7d\xe1\xf4\x8f\xeb\x77\xab\x45\xc0\x45\x17\x7e\xe0\xaa\xba\xf7\x7d\x19\xe0\xbd\xbf\xeb\x17\x01\x7c\xbe\x1f\xbb\xd3\x8f\x73\x85\x7c\x06\xdc\x57\xa9\xcc\xfe\xf6\xfc\x1f\x06\xf1\x26\x6e\x5b\xaf\xd6\xb5\x25\x93\x77\x2b\x08\x78\x35\xd7\x83\x37\xa6\x27\x88\x31\xe1\x73\x93\x03\xdf\x9a\xf0\xbe\x52\xc3\xd1\x81\xaf\x13\x6b\x66\x54\xdb\x89\xd3\x07\x2f\x27\xde\xcf\xd6\xde\x7f\xf1\x69\x62\x3c\x44\xbf\x2f\xc4\xea\xfd\x24\x1e\xfc\x45\xb2\xce\x25\x01\xdf\x32\xb9\xde\xaf\xe3\xaf\x65\x7f\xbd\xac\xf6\xe0\xc1\x3d\x09\xb9\x32\xe6\x8d\x73\x3d\x3e\x97\xcd\xbe\x47\xbc\x8f\xef\x98\x1c\x2c\x00\x10\x4f\x6d\x1e\x7a\xc7\x7d\xfa\xeb\x60\x3d\x09\xba\x18\x7e\x83\xf8\x8e\x41\xd0\xe3\xd7\x89\x39\x13\x63\x3a\x78\x7e\xc8\xc6\x09\xe0\xd9\x5a\x6e\xd4\x5c\x88\xde\x05\x62\xfd\xb1\x9c\xf1\xe9\x71\x09\x81\x8b\x4c\x6d\x3c\x1b\xb3\x01\xdc\x0c\xe1\xe2\xab\xf5\xbe\x32\x2f\x7e\x9e\x58\x4b\xc9\x8b\xcf\x7f\xe1\xa2\x09\x74\x4a\xe0\x6e\xdb\x5f\x3f\x02\xd7\x07\x09\x38\x87\xe5\x24\x86\x5b\x64\xcd\x52\xec\xbb\xdb\x36\x19\xaf\x65\x3f\x21\x57\xbd\xf6\xdf\xc3\x6b\x33\x97\x68\x47\xa8\xcd\x6b\x50\xaa\xdf\x1f\x87\x2f\x98\x30\x4e\x82\x7f\x6c\x7e\x3f\xb4\xef\x03\xb8\xbd\x2e\xb4\xbf\x83\x71\xae\x7f\x9f\xf0\x5d\x60\x3f\x18\x8e\x6c\xf4\x47\xb5\xfd\xac\xf0\x9a\x79\x63\x0a\xe2\x6a\xeb\x78\xce\x86\xb6\x10\x8e\x82\x3e\x0e\x1f\xa9\xa7\x89\x83\xe7\x85\x70\xa1\x54\xf4\x1a\x6d\xc5\xe9\x43\x27\xd4\xfb\x5f\xf0\x68\x52\x87\x30\x06\x0f\xb5\xd5\xf9\x08\x70\x1f\x99\x81\xd0\xde\x71\xf5\xa7\x9f\xd6\xe1\x49\xf4\xe2\x96\xbd\xf7\x83\xb8\xe5\x3a\x7c\x04\xb1\xb2\x75\x73\xd8\x5b\xab\x71\xad\x78\xb6\x90\xff\xbe\x1e\xe2\x21\x01\xfc\xe0\xde\xc6\x38\xda\x56\xab\xd5\xc5\x92\xfb\xc0\xba\x32\xb4\xce\x35\xdc\x5d\x5c\x4f\x17\xfe\x3e\xfb\x39\xd1\x0e\xc1\x13\x82\x58\xce\xa5\x95\xa5\xb1\x47\xe8\x95\x4c\x5f\xf6\xd7\x7f\x78\x77\x4e\x81\x07\x4c\xef\xc0\x37\xa7\x44\xe7\xee\xe6\x6b\xe3\x25\xf6\xed\xe0\xdd\x8d\x79\x8c\x75\x19\xb1\xaf\x88\x98\xc5\x10\x2f\x24\xf0\x37\xf0\x34\x01\xd7\x6a\x34\x63\x5d\xda\x18\x1f\x41\x6c\x44\xc0\x83\xbd\xf7\xb7\x96\x08\x78\xae\xc6\x53\x77\xdd\xd1\x98\xa7\x6e\xff\xcb\x47\xe0\xfb\xdd\xfa\x75\xf6\xde\xdf\xfd\xfb\x7a\xfd\xdc\x87\xbf\x17\x92\x53\xc1\xfb\x87\xb3\x04\xbf\x20\x65\xc5\x32\x82\x97\x13\xe3\xb1\x2e\xa9\xa7\x23\x2f\x2e\x2b\x84\x37\x8d\xc0\xc3\xe1\xc6\xfc\x34\x88\xef\x0a\x62\xaf\xbc\x9d\x99\xbd\xb8\x5e\x46\xf9\xf4\x12\xab\x97\x51\x1e\xde\x36\x3f\xd1\x58\xd6\xf5\x7f\x3b\x24\x1b\x83\xf9\x6e\x0f\xf3\x3b\xa3\x0a\xdf\xf3\x8b\xfa\x7d\xe6\x8f\xff\xba\xd0\xf8\x03\x7a\xd8\xf3\x1a\x01\xcf\x11\xf4\x7b\x7d\xbd\x3c\xf0\xda\x0f\x62\xc0\x94\xea\x99\x87\x07\x0f\x62\x8a\x94\xe0\x7e\x38\x6e\x27\x14\xb3\xe2\xcd\x17\xc7\x20\x64\x3d\x09\xff\x1e\xd1\x47\x6d\xed\x7b\x1a\xf3\xf8\x5d\x6d\x21\xbe\xa3\x07\xbc\x79\x82\x2f\xdc\x7f\xff\x02\xc2\x16\xca\xd6\xf8\x94\x1f\xe3\xf0\x9a\xff\x9d\x24\xb9\xcf\x89\x18\x18\xbd\xb6\x0e\x71\x7a\xe0\x72\x62\x3f\x93\x63\xba\x9a\x58\x1f\x02\x7f\x41\xbc\x89\x8c\xeb\x57\x04\x74\x71\x38\x49\xf0\x73\x62\x4c\x3b\xcf\x77\x9f\xee\x5c\xda\x80\x57\x85\xe3\x25\x02\x5c\x79\xe3\x0a\x62\x7f\xc2\xfb\x3c\x9c\xd7\xc6\xd3\x63\x02\xfc\x6e\xb8\xb3\xb1\x0e\x70\xe4\x1b\xa1\x35\x0c\x68\xe7\xc0\x65\xf5\x3c\xd4\x5f\xf3\x57\x43\x7b\xa5\xd6\xfe\xac\x09\xeb\xf7\x9b\x09\x32\x91\xd0\x0d\x76\x92\xbc\x4d\xaf\xc1\x83\xf3\x6c\x25\x58\x3f\x3c\x9e\xa1\x35\x8d\xf5\xb0\xa1\x5f\x12\x3a\x09\xc1\xf3\xb6\xcf\x0a\x70\x5e\xe5\x0d\x78\x2d\x36\xfe\x17\xd1\x7e\xce\x9f\x6f\x2e\x4e\x6f\x08\xd7\xfa\x0d\xe6\x65\x3f\x18\xd2\x79\x82\x3d\xd7\xff\xad\xc6\x7b\x82\x38\x07\x54\x49\x9a\xd9\x71\x66\x08\xff\xc1\x38\x83\x73\x6f\xa5\xea\xf7\xf0\x75\xa7\xa7\x1b\xd3\xf7\xc1\x3b\x1b\xc3\xb7\xe4\x1a\xe3\x87\x38\x17\x64\xfd\x3d\x8a\xf1\xf0\x5c\xb6\x5e\x07\xf3\x79\xe4\xc5\x1f\xc1\x1b\xa4\x7a\xde\xe3\xb7\xdf\xda\x58\x2f\x18\xc2\x1a\x51\xff\x37\xc3\x63\xf2\x71\xf4\xd5\x7a\x5c\xfb\x6d\x4d\x22\xd6\x46\xad\xf5\xb1\xed\x69\x02\xa7\xc4\xdc\x08\x3f\xb9\xe2\xd3\x34\xee\x7b\xbf\x77\x96\x98\x0f\xfa\x20\x6c\xa4\x81\xbb\x1b\xeb\x8c\x81\x6f\x3d\x38\x33\xf4\xda\xf2\xfd\xa7\xaf\xfa\xcf\x38\x92\x96\x36\xfc\xd0\xfd\x0e\x80\x41\xfe\xb9\xcf\xf9\x99\xe7\xbc\x50\xed\x96\xf6\x96\x99\x2d\x1d\x38\x33\x8e\x1f\xa2\x1d\x3b\x06\xc6\x3a\x01\x95\xb4\x93\xe9\x26\xd3\x11\x23\xdc\x78\x81\x02\xb6\xfd\x61\xd1\x86\x63\xe3\xd9\x88\x88\x54\x31\x21\xf1\x3a\x64\x68\x9d\x95\x44\x0b\x29\x96\xa3\x50\x89\xf1\x31\x99\xd2\x51\x82\xb2\x2c\x68\x19\x69\x85\x53\x20\xe3\xfb\x86\xf0\x3d\xa6\xe1\x0b\xb1\x7e\x56\x3d\x2f\x91\x70\xed\x65\x1f\xce\xd0\x07\x6b\x77\x61\xfd\x98\x8e\xcc\x66\xbc\x6f\xc8\xb8\x62\xef\xde\x93\x77\x7f\xe2\x39\x62\x3d\x31\xcf\xd9\xd2\xe2\xb6\x3f\x48\xfa\xa4\xbc\xfc\x37\xb8\xdf\x83\x35\x7f\xa9\xaf\xab\x66\x70\xe6\xb5\x0c\x99\x63\x15\xef\xcb\xbd\x9f\xac\x6b\xbf\x9a\xef\x03\xdf\x57\xd8\x42\xde\x61\xcd\x55\xdb\x89\xd3\x7b\x77\x85\x64\x89\x0b\x7f\x0a\xe7\x9a\x54\x89\x7d\x99\xa1\xa5\x78\x2a\x83\x73\x37\xf7\xbf\x12\x82\x6b\x3e\xdc\x8b\xa4\xa1\xb3\x93\x82\x3e\x30\xad\x66\x9e\xc1\x3e\xe7\x67\xf1\x37\xbd\xbb\x92\x42\x85\xf3\xe2\x43\x32\x98\x56\x33\x4f\x12\xe3\xb5\x6b\xfd\x6f\xba\x34\x44\xf7\xa6\x07\x27\xce\xde\x42\xef\x33\xf4\x96\xaf\x35\x6e\x67\x6b\x35\xfe\x44\xaf\x9e\x61\x67\x9e\xc6\x63\xc2\x15\x13\xfb\x5f\x0a\x9e\x79\x63\x7a\x02\xf7\xf1\xb8\xff\x1d\x13\x9f\xef\x09\xf1\xd4\xc1\x33\x31\xfc\x19\xa2\x2d\x1d\xe3\x04\xd7\x63\xcd\x98\xc4\x58\x8d\xda\x98\xfa\xab\xbc\x5f\x08\xea\x7d\x9e\x85\xdf\x0f\xdb\x43\xb5\x39\x60\x39\x09\x22\xa0\x80\x6d\xd2\x34\x60\x40\x07\xe8\x01\x00\xd6\x97\xc0\x8e\xb6\xe1\xd4\x5e\x9d\x38\x3b\x14\xbe\x8f\xd0\x3d\xad\x8d\x8a\x04\xe7\x4b\x3e\x2c\xc6\x6b\xaa\xa8\xa4\x4d\x41\xfc\xb0\x60\x53\x92\x9d\x10\x14\xd1\x92\xb5\xbc\x5c\x94\x55\xd3\x90\xc5\x24\xa5\xd9\x49\x45\x95\x35\x51\xd2\x0b\x72\x51\xd3\x2d\x5d\x55\x38\x3a\xfd\xc1\x98\xac\x30\x36\x23\x46\xc5\x0f\x72\x74\xa9\x9c\x40\xa3\xe5\x4c\x4e\x28\xa1\x52\x41\x2f\xc3\x74\x21\xc3\xab\x5a\xa6\x90\x40\x79\x34\x9a\x2f\xea\x39\xbb\x9c\xd5\x47\x20\x18\x29\x4a\xb6\xed\xc5\x8a\x41\x26\x72\x13\x3d\x1a\x7d\x35\x1e\x3b\xd8\x0c\x40\xe5\x5e\x00\x00\x05\xc6\x22\x99\x18\x4b\x0b\x20\x06\x8e\xc7\xd5\x09\xfc\x89\xc4\xf0\x98\xa3\xb8\x00\x0f\x1e\x33\x6b\x1f\x05\x76\xd3\x36\x31\x93\xe7\xb2\x99\x02\x2a\x0a\x19\xcb\x32\xb9\xf2\x68\x9e\x16\x1c\x19\x97\x61\xb7\x7f\xa8\x08\x9c\xc6\xb1\x3c\xab\x27\x92\xe9\x84\xca\xf2\x1c\x68\x02\xf9\x0a\x1f\x13\x68\x1e\xc7\x0a\xb6\xe3\xac\x33\x2d\xc4\x7d\x1a\xaf\xb7\xc0\x0f\x8a\x93\xac\x75\x47\xbc\xfa\x1c\xc7\xcd\x6c\x6f\x6d\xc7\x99\xd3\xba\xda\x53\x9d\x31\xc1\x34\x75\x3b\x3d\xa2\x08\xfc\x87\x39\x9b\x12\x44\xd6\x60\x79\x4a\xb6\x78\x11\xb2\x47\x73\x94\x26\x65\x79\x16\x66\xc7\x47\xd3\x94\xea\x28\xa2\x60\xc0\xd1\x64\x9a\xe6\x3f\x18\x91\x95\x84\x9d\x48\xa7\xa3\xca\x07\x56\x0c\x14\x55\x9d\xd3\x15\x9e\xb5\x75\xd3\xb4\x51\x4e\x92\xcd\xd1\xb4\x29\x08\x90\x31\x05\x16\xc7\x48\xba\xf4\xc3\xc6\x53\x87\x3e\x8f\xe9\x04\xc7\x16\x01\x1a\x7c\xb1\x72\x69\x6c\x0b\xcd\x83\x4f\x83\x38\xae\xdb\x7a\x32\xe6\x78\x20\xda\x89\xd9\x1e\x88\xc6\xa6\x46\xbd\xb2\x64\xf8\x2e\x4f\xcb\xe7\x61\x8b\xc7\xfc\x9a\x62\x68\x08\x4d\xb9\x8e\x5a\x09\x7b\x9e\x60\xda\xe0\x83\xf0\xd0\x4a\xb4\xd4\xb9\x00\xe6\x20\xab\xa0\x12\x92\xd0\x3d\xd1\x91\x0f\xd3\x36\xce\xfc\x9f\x83\x69\x0b\x26\xa9\xef\xa3\xe7\xde\xbd\x17\xce\x86\x0f\x5f\x74\xf2\x64\x64\x1d\xde\xf8\xda\x29\x46\xd6\xca\x19\xd1\x21\x27\x6b\xe0\xda\x74\xf8\x53\xa9\x00\xbb\x22\xd0\xa3\x34\x1f\x4f\xb9\x6b\xc9\xd0\xfd\x5f\x0f\xf8\x9d\x6b\x5b\xd6\xe0\x58\x3e\x82\x26\x70\x55\xe5\xb2\xd8\x46\x9a\x05\x51\x5c\xe3\xf3\xf3\x00\x54\x6f\x26\x35\x45\x3b\xa7\x56\xd7\x9d\xc8\x78\x1d\xe4\x52\x85\xed\x4d\xef\x43\x16\x36\xab\x15\x80\x46\x90\xa9\xa0\x31\x64\x8b\xd0\x8c\x7e\xd2\xfe\x50\xb5\x27\x53\x63\x76\x04\x38\x0a\x4c\xc3\x82\x84\xd2\x68\xc4\x46\x63\x88\x53\x60\x11\x02\x47\x8f\xf6\x1a\x39\xbd\xa0\x6b\x6a\x41\xd6\x35\xf8\x18\x92\xbc\x12\x07\xe3\x15\x98\x40\xa3\x06\x7a\xe0\xd0\xa6\x11\xf8\x9c\x13\xa3\x7e\x8d\x1e\xfc\xd3\x7d\xbf\x85\x5e\x7e\xcf\x62\x85\xf7\xe7\xf5\x09\x3c\xfe\xaf\x05\xf3\x72\xf9\x47\x0d\x5e\x95\xa5\x5a\x45\xf5\xe2\xf4\x7d\xf8\x91\x90\xcf\x41\x88\xa7\xf6\xfe\x1d\xc3\x0f\x07\x7b\x9e\x8f\x89\x2e\x7c\xb8\x0b\xc3\x0f\xf9\x70\x03\xf3\x14\xb7\x1d\xcc\xaf\x0f\xfa\xf9\x90\x21\x83\x6d\xe0\xe0\xfd\x6c\x29\xe4\x27\xe0\xe3\xa9\xac\x57\x13\xba\x39\xe0\x41\x9c\x8f\x7f\x6f\x3c\xc3\x3e\xdc\xaa\x28\x31\x85\x18\x4f\xd5\x57\xf3\x60\x65\x71\x6c\x4d\xd0\x7e\xef\x73\xed\xc7\x31\xbc\xbc\xe8\x6b\x7e\xdf\x1c\x5d\xa2\xc5\x78\x2a\x8b\xf3\xc7\x1c\x8c\x11\x7c\x4e\x73\xe1\x07\xf1\xdd\xb6\xfe\xaa\x4e\x93\xc4\x32\xaa\xd6\xc7\x8b\x84\x2e\x98\x25\xde\x7f\x21\xc0\x9d\x4b\xef\x01\x7c\xf7\x7f\x11\x70\x8b\x68\xe7\x40\xd0\x2f\xef\xc1\x7d\xdc\xed\xf7\xe1\x19\xac\x13\xd7\xe0\xfb\xea\xdb\xf1\xe0\x7b\x7e\x1b\xc0\x5d\x3b\xa1\x36\x9e\x21\x1f\xbe\xb9\x72\x6d\xec\x2b\xb4\xc4\xac\x39\x32\x13\x9c\x84\x22\xf3\x1e\x99\x77\x4f\x9c\x1e\xee\x62\x18\x9f\xe7\x33\x6e\x5b\x07\x2e\xc2\x67\x76\x5e\x4f\x7b\x83\x71\xe9\xee\xb3\xcd\x08\xeb\x6c\x5d\x21\xfb\x2f\xe8\x7f\xb3\x43\xd8\x2f\xb6\x0b\xdf\xf5\x05\xac\xeb\x74\x56\xbf\x15\xe8\xa9\xd5\xef\x78\x55\xca\xe9\xfe\x4c\x30\x1f\x02\xef\x3b\xab\xf2\xa5\x8c\xfd\xe9\xb5\xf9\xe0\xf8\x6d\xf0\x49\x60\x61\xfc\x0a\x41\xcd\xc3\x24\xe8\x01\x02\x38\x1f\x88\x60\x4d\x83\x7a\x87\xf8\x54\x29\xb8\x50\x88\x8f\x84\xa2\xad\xd5\x23\x20\xaa\x23\x99\xea\x6a\x99\xd9\x3a\x15\x92\xe5\x34\xdd\x3d\xdb\xe6\xdf\x82\x23\x5f\xa7\x63\x34\xe6\x9c\x33\x5b\xa7\x16\x68\xf9\x03\xdb\x82\x22\xca\xc2\x31\x28\xd9\x50\x38\x9a\x30\x45\x79\xa4\x94\xe6\x74\x53\x36\x59\x94\x41\x46\xda\x8e\xe6\xf9\x51\x94\x53\x95\x3c\xcf\x98\x0c\xaf\x8c\x56\x80\x6a\xc1\x84\x93\x93\x15\x8e\x4f\xca\x2c\x8f\x92\x96\x05\x4b\x28\xe9\x7e\xa2\x96\x30\x86\x72\x82\x96\x13\x18\x2b\xc1\x73\x68\x74\xd4\x7d\x97\x16\x90\xa4\x67\xdc\x3f\x28\x9f\x36\x25\x26\xcd\x72\x9c\x91\xe1\x25\x8e\xd1\x64\x5d\x93\x38\x21\x99\xe4\x8d\xb4\xa5\x26\x79\x09\xda\x56\x1a\xe5\x1d\x4e\x14\x19\x9d\xe1\x79\x54\x8e\xa8\x65\x05\x65\x14\x53\x97\x39\x35\x99\xe4\xcd\x74\x91\x63\x05\x19\x8e\xe5\xd3\x3e\xce\x89\x35\xec\x1f\x20\xf4\x3a\x85\x80\xef\x09\xd9\x07\xd5\xb5\x48\x0d\x7a\x37\x16\x76\x07\xfa\x0f\x49\x77\xbb\x82\xbd\xcf\x87\xf6\xd3\xce\xa0\x0f\x2e\xc6\x12\xf0\x6a\xce\xe0\x52\x85\x8f\x25\x08\xb8\x1d\xd2\xd3\x03\xf8\x3e\x9c\xf7\x03\xb4\x80\x0d\x95\x8b\x63\xb7\xd1\xbd\x81\xf4\xf8\x42\x50\xbb\xd0\x3b\x79\xbc\x10\x5c\x02\x2e\x07\x2b\xc1\x35\xf8\x9c\xd1\x2b\xa3\x1a\xc4\xa4\x74\x4e\x9b\xd9\xd2\x31\xa9\x5a\x82\x66\xe2\xe3\x09\xd5\x69\x5c\x5a\xf0\xff\xf6\x6b\x68\x56\x2b\x9e\xe0\xbf\xa9\x65\xb2\x28\x70\x0a\xc7\x0b\xbc\x28\x08\x9a\x2c\x88\xb2\x89\xde\xd9\xb0\xe1\xe4\xe8\x77\x3f\xec\x8a\xaa\x8f\x3f\xee\xa0\x6b\x97\x2f\x39\xf3\x86\x33\x17\x2c\x59\xb8\x7c\xc9\xb9\x77\x5c\x7b\xee\xf2\x6b\x9f\x1d\x17\xe9\xd2\x07\x49\xea\x5a\xd3\x84\x8f\x9a\xe6\xf8\xb5\xd4\x76\xe7\x9a\x27\xe0\x23\xe8\x2b\x91\x38\xf5\x75\x67\xf1\x33\x70\x23\xba\x61\xfc\x13\xd1\xdc\x87\x82\x0d\x47\x51\x82\x32\xe0\xd8\x51\xa3\xfa\xaf\xe8\x9e\xce\x2e\x61\xc1\x02\x61\xc1\xf4\x19\xd7\x9c\x35\xe3\xda\x19\x2b\xa6\x2f\x5b\xe6\x38\x7f\xa6\x3e\x75\xcf\x1d\xce\x9f\xe1\xfd\x9f\xef\x39\x6f\xd1\xa2\xf3\xce\x61\xd9\xbe\xb9\x6c\x1f\x2b\x9f\xbe\x7c\x39\xfa\x8e\xd1\xe5\x14\xa9\x69\x4e\x11\x1e\x44\xbf\xb8\x61\xf9\x6a\x54\x52\x44\xf4\x07\xc7\x86\xaa\x2c\xcb\x28\x2f\xcb\x72\xb0\x57\x55\x17\xdf\x07\x58\x7c\xf7\xff\xcc\x2a\x97\xf4\xd7\x8e\x23\xd6\x68\x3b\x5e\x8b\x4f\xf8\xf9\x02\x24\x30\x07\xf0\xe0\x1c\x7f\x37\x5e\x0c\x24\xef\xce\xa9\x5f\x29\x70\x66\x4b\x7b\xb5\xd8\x12\x59\x14\xcf\xdb\x6f\x7e\xb1\xb0\x6e\x17\xbf\xb8\x40\xbb\x97\xbb\x3d\xb4\x95\xbb\xda\x4f\x82\x18\xfd\x5e\x81\x27\xef\x32\x6b\xaa\xb3\x9d\x1e\xa5\xd3\x48\x87\x23\x28\x5d\x76\x12\xc9\x64\x13\x83\xb4\x0c\x4c\x68\xaa\x24\x4b\xa2\x92\x34\x84\x34\xd2\x2c\x64\x9a\x8a\x2a\x8f\x5a\xc8\xa6\x9a\xd3\x69\xa4\xc0\x66\x24\xc0\x1c\x32\x6c\x5c\x3d\xa6\x08\x45\x03\xf2\xc8\x74\xca\xae\xce\x85\xc6\x9a\x12\x47\x47\xdd\x8f\x0c\x15\x0b\xaa\xb2\xe8\x8c\xe0\x7b\xb8\x82\x26\xa0\x74\x3a\xa9\x4b\xa2\x91\x66\x15\xc9\xdd\x69\x42\x1a\x8d\xc2\xc4\x28\x64\x38\x56\x53\x24\x3d\x9d\x84\x23\x82\x26\x68\x8a\xfb\x07\x8d\x08\x42\x5e\xa8\x00\xa1\x2c\x22\x20\x8a\x1c\xcf\xf9\x38\x9c\x17\x7b\x8a\x16\xe3\x7d\x99\x7b\xc0\x2f\x78\x30\xfb\x59\x66\xcd\xee\x77\xe0\x1d\xe8\x0f\xb3\x2e\xe6\x84\x78\x4d\x1e\xa9\xd8\x3f\x59\xc3\xf5\x36\x62\x5f\x19\xb4\x12\x4f\x6d\x5c\x88\x6d\xfb\xb3\x43\xbe\x95\x60\x8f\xe2\xd5\xa3\x77\x7f\x3a\x78\x66\x4c\x78\xf6\x29\xc2\xef\x53\xeb\x07\xc7\xc1\x02\xca\xe7\x11\x26\x38\x09\x74\xd4\x59\xa2\x7e\x25\xfd\xe0\xaa\xb0\x7f\x72\x1e\x55\x73\x82\x06\x47\x9c\x66\xaa\xe0\x70\x11\x7e\x3c\x6f\x8f\x17\x23\xac\x23\x51\x19\x27\x19\x19\xd5\x1d\xd6\x10\x4d\xc1\xa0\xcd\x74\xde\xb2\xd0\x28\xfe\x8f\x85\x45\x0b\x26\xdc\xff\x72\x79\xdd\x90\x4c\x0d\xe7\x5f\xc7\xf3\x00\x11\xac\x53\x75\xe2\xac\x5c\x78\x1f\x62\x7e\xec\xdd\x5d\xee\x88\x12\xb7\x98\xab\x83\x89\xe4\x6c\x1b\x69\x96\x85\x38\x58\x88\x24\x4d\x98\x45\xa2\x79\x74\x84\x32\x6d\xca\x72\x94\x88\x30\x9e\xb3\x5d\xb3\xd8\x51\x69\xd1\xc9\x51\x82\x93\x83\xc0\xca\x66\xad\x0a\xc8\x2a\x8a\x55\x01\x16\x4a\xc0\x51\x0b\x7a\x36\xb8\xe1\x9d\x49\x81\x33\xbd\xba\x76\xd5\x6c\xf8\x74\xab\x97\xa7\xb4\xb5\x3d\x7c\xdf\xa6\xa5\x83\x82\x9d\x53\x27\x79\xb4\xdb\xd5\x3e\xab\x07\x67\xca\xa7\x74\x55\x86\xa2\xcc\x67\x05\x11\x8e\x39\xa0\x99\xca\x39\x7c\x33\x13\x11\x1c\x93\x33\xf2\x52\x22\x93\x36\x51\x69\x54\x17\x55\x47\x94\x28\xd6\x72\x04\x6a\x84\x69\x76\x6c\x4a\x6d\x76\x38\x98\xe3\x45\x5a\x57\x4d\x5d\x67\x35\xc9\x52\x24\x53\x91\x2c\xd4\x9c\x4c\xca\x19\xbe\x64\x48\x0a\x95\x40\x00\x95\xad\x22\xb4\x2d\x49\x31\x25\xc5\x92\x44\xd2\x5f\xe3\xda\xc7\xae\x0c\xa6\xf7\xb2\xf5\xbe\x91\x83\x98\x66\x0e\x36\x05\x3a\x46\xc2\x8b\x21\x7e\x91\x2f\x96\xe3\xf4\xb0\xc8\x8f\x04\x3e\x13\x9b\xd6\xe2\x9d\xd9\x1e\x00\x22\xdd\xf1\xd4\xe1\xb7\x5d\xfb\xb2\xff\x79\x42\x1f\xf6\x72\x75\x9e\x82\x69\xe6\xf9\x7a\xdf\xf3\xb0\x08\xc2\x35\x36\xaa\x71\xb9\x22\xb6\xf3\xff\x06\xde\x0f\xda\xf1\x6a\xd4\xe1\xca\xda\x03\xdf\xf3\xf5\x6a\x3f\x37\x3a\xae\x64\xbc\x00\x57\x7b\x20\x56\x81\xcc\x1c\xed\xfd\xa4\x3a\x27\x61\x53\x21\x16\xd4\xde\x9c\x8c\x75\x6d\xd2\x92\x8c\xb5\xb7\x52\xf8\xa2\x3b\x65\x4b\x1c\x34\x64\xce\x4e\xb3\x30\xe7\x00\x2a\xe3\x48\x11\xee\x03\xe0\x53\x6a\x33\xcc\xa6\x39\x03\xea\x50\xe7\x90\x81\x8c\xb1\x48\x5a\x10\x8b\xba\x66\xe4\xf2\xb0\x59\x40\x72\x05\x88\x92\x68\x24\x4d\x8e\x75\xf4\x12\x95\x29\x20\x59\x85\x4a\x16\x25\x68\x43\x51\x64\x95\x13\x05\x43\xd1\x15\x03\xff\xe2\x38\x87\x49\xf2\x3a\x9f\x56\x34\x51\xd0\x6d\x39\xab\x19\xa2\x65\x41\x06\x95\x24\x29\x61\x25\x58\x98\x57\x74\x34\xaa\x1a\x62\xb6\x01\x8e\x18\x7a\xf8\x79\x7f\x1f\x56\x69\xf1\x58\xb0\xc4\xdb\x87\x64\x74\xca\xff\x3b\x75\x46\x1f\xd1\xf9\x34\x27\x24\x15\x2e\xa1\x35\x6b\x46\x92\x77\x3e\xff\xff\x8b\x5c\xa9\xf6\x64\x4e\x60\x92\x52\x52\x33\x93\x7c\x9a\x51\x94\x68\xe7\xff\x9e\x7e\xc5\xc0\xef\x37\x3d\x94\xbf\x66\x79\xa5\x2d\xa6\xd3\x3a\xd3\xb7\xf3\xbe\xca\x4d\xfc\xd3\xb3\x73\x4c\xef\x61\xfb\x8f\x3f\x9b\xbf\x98\xaf\xf3\xcf\xf8\x74\xb7\x93\xb0\x1b\xb0\x3f\x78\x2f\xce\x5d\xb9\x77\x46\xc8\x3f\x5a\x7b\xff\xd4\xc6\xf0\xed\xff\xf0\x7d\x14\xae\x5d\x62\xd0\x06\xbe\x91\xc7\x87\xa9\xb1\xfa\x71\xff\xe7\xb8\x88\x2b\xa8\xb0\x92\xd0\xd3\x4e\x45\x3b\x41\x80\x74\x0f\xe7\xb0\xbd\xa7\x3d\xe2\x02\x28\x4b\x15\xa0\x26\xf2\x59\x9e\x87\xd9\xf1\x11\x86\x1a\x1d\x2f\x27\x23\x85\xf1\xe6\x44\x32\xa2\x72\x23\x1f\x2a\xb0\x98\xac\x00\x98\x4c\x56\x40\x11\xd9\x0a\xcc\xe5\x9c\x0c\x65\x26\x18\xd4\x4c\x25\x18\x47\x81\x39\x56\xa4\x34\x68\x33\x48\x95\x61\xae\x99\x41\x22\x6d\x68\x86\xa6\xb1\x8a\x64\xea\xa6\x6e\x0a\xbc\x2e\x21\xcb\x34\x4d\xc3\x42\x85\x92\x09\x19\x68\x9a\x3c\x6f\xea\xa6\x24\x7e\x58\xb6\x90\xc8\x8b\x13\xe9\x6d\xa0\x40\xe0\x20\x47\xe0\xe6\xb4\x00\x97\xac\x9f\x2b\x04\xdf\xc9\xd8\x7b\x0a\xf1\x3e\xf6\xad\xef\xfd\x3d\xa6\x5b\x31\xc4\x73\xa4\x78\x6a\x00\xfb\xe4\xfa\xb7\x10\xfe\x21\x2f\x57\xcb\x1b\x98\x17\xed\xab\xc7\xfd\x20\xac\x6b\x27\xb4\xb6\x41\x2e\x9d\xa0\x6e\xf2\x30\x3e\x1b\xb0\xc4\xc0\x0e\xf2\xc7\x39\xf0\x26\xee\x77\xb3\xbf\x86\xba\xe7\x5b\xc3\x3c\xe5\xfa\x5a\x5d\xeb\x8f\xe2\x2a\xd5\xc8\xb0\xa8\xab\x63\xcc\x9c\x50\x8c\xff\x18\xd8\xf1\xb9\x4e\x9c\x39\x23\xd5\xd9\xde\xea\xbe\x46\x68\x34\x58\x93\xc1\xcd\xd0\xb1\xce\xa9\x59\x98\x67\x79\x5d\xe6\x61\x56\x64\x33\xac\x00\x8b\x4e\x33\x65\x3a\x6a\x24\xf1\x41\x22\x92\x74\x54\xca\x74\x9a\xa3\x19\x91\x37\x38\x09\xa5\x39\x64\x53\x20\xc9\xd8\x4c\x82\x4a\xa0\xe6\x74\x52\x95\x64\x45\x15\x79\x81\x31\x13\xaa\xac\x9a\x85\x0a\x90\xa0\xa4\xf2\x69\xa7\x04\xf9\x04\xca\x08\x86\x22\x27\x54\x95\xcd\x15\x12\xa5\x1c\x12\x61\xd6\xb4\x59\x98\x8b\xe6\x44\x5e\x50\x54\x45\x49\x4b\xa2\xa1\x18\xb2\x61\xc8\x86\x82\x18\x59\xe1\x15\x39\xa9\xb2\xaa\x61\x5a\xba\xa1\xf1\x82\xa0\x4a\x82\x96\x65\x6d\xb5\xa0\x4a\x86\x2a\xa8\xa6\x9a\xd4\x59\x5d\x91\x18\xb3\x99\x97\x12\x8c\xc9\x24\x74\x43\x6e\x66\xf4\x44\xf8\xac\xc1\xe3\xe1\x87\xc8\x73\x60\xec\x7b\xdd\x73\x3d\x8e\x35\x39\x14\xa2\x0b\x3d\x9e\x72\x21\x0c\xbd\xf7\xf3\xf5\xf4\xe2\xc3\xc9\x7a\x0b\xb8\x1d\x0b\xfb\x9a\xfb\x9f\x23\xde\xd7\x6b\xef\x0f\xaf\x0a\xf5\xeb\xc2\x0f\x87\xd6\x3f\xa0\x5f\xcb\xa3\xdf\x0e\x5f\xa6\x78\xf5\xde\xbd\xf5\xbf\x0d\x7c\xe5\x5f\xcb\x94\xda\x2d\xda\xd6\xf6\xce\x99\x04\x01\x9c\x0c\x67\x9e\xd1\xdd\xe5\x45\x10\x62\x2e\x3c\x1f\xa6\x3a\xbd\xe2\x89\x3d\x1d\xad\x98\x1f\xb8\xcf\xaa\xe5\x5f\x7a\x3a\xba\x7c\xcd\xb6\x2b\xda\x39\x15\xce\xec\xa2\x23\x80\x67\xa1\xc2\xa5\x6d\x96\x85\x79\x27\x81\xa9\x21\xf9\x01\x1b\x61\x1c\x9d\xd2\x9d\x24\x05\x92\xe9\x48\xd6\x50\x65\x45\x43\x0c\x67\x67\x61\x99\xb1\x19\xaa\xd9\x65\xa0\x22\x6f\x0a\x66\x5a\x4d\x26\x92\x16\x23\xcb\x5c\x96\x37\xb3\x6a\xd6\x60\xf9\x34\xca\x9b\x9a\x64\x58\x42\x06\x02\x64\xa5\xa1\x9d\x54\x74\x59\x4d\xe8\x72\x3a\xc9\x20\x45\xcc\x1a\xd2\x88\x82\x46\xe0\x08\x2a\xa6\xa1\x8d\xc6\x0a\x22\x6d\x8a\xb2\x28\xa5\x05\xce\x50\x34\x97\x40\x34\xc5\x60\x59\x47\xe0\x04\x59\xe0\x78\x95\x69\x16\x8b\x45\xdd\x92\x44\x29\x69\xea\xa2\x22\x49\xe9\xac\x66\xa8\x9a\xa8\x8a\x4a\xd2\x2c\x08\xb2\xaa\x8b\x42\x4e\x13\x47\x74\x46\x63\xd2\x42\x9e\x17\x54\x45\xd6\x79\x46\x63\x10\x93\x53\xc8\xbd\x7c\xe8\x47\xb5\xb5\x01\x31\x70\x63\x65\x6a\x6c\x3f\x7d\x0b\x88\x82\x0e\xf0\x79\x70\x3a\x38\x17\x28\xe0\xc6\xea\xbd\xe6\x69\xe1\xa5\xa8\x96\x16\xf7\x7e\xba\xc9\x3b\xcd\xd5\xc8\x4f\x8f\xef\xfa\x56\x83\xbf\x6d\xbd\xaa\x3c\xd5\x1f\x4f\x37\x0c\x1a\xf1\x14\xd5\x08\xbd\x7c\xc9\xfd\xa7\xde\x44\xdd\xb5\x6d\xd6\x2c\xf8\x6b\x67\x2e\xd6\x0f\x97\x8e\x1f\x5a\x3f\xbe\x2f\x72\x89\x73\x3d\xb5\xc9\xe9\x8d\x18\x8b\xc6\x9f\x9a\x7f\xee\x1d\x33\x96\x53\xc7\xad\xe6\xee\xbe\xec\x56\xe7\x95\xc8\x12\xb4\x11\xb6\xa3\x9f\xc5\xe1\x83\x48\xb9\xfa\x37\xea\xcf\xbf\x80\xde\x81\x62\x1c\x8d\xc1\xe3\x51\x96\x8e\xdd\x7d\xc6\xfc\x7f\xa0\x7d\xf0\x54\xf4\x13\xb8\x06\x3d\xa7\xa1\x67\xe1\x3a\xf4\x26\xec\x41\xfb\xe0\x8b\x8b\xd0\xc8\x82\x53\xae\x63\xe7\xd0\xb7\xf4\x9c\x7f\xe6\xfc\x73\x66\x7e\x4e\x9c\xaf\xac\x53\xfa\xd6\xfc\xf4\xa7\x6b\xfa\x94\x75\xca\x25\x4e\x0f\x7f\xfd\xb4\xe5\x17\xa7\x4f\x5b\x71\xc1\x99\xcb\x1f\x5b\xb7\xf6\xba\x7b\x56\xbd\xaa\x9e\xaf\xdc\xb9\xea\xec\xd9\xd7\xad\x85\xe9\xe4\x35\x73\xd7\x5e\xbf\xfa\xbe\xd5\xe8\x7f\x60\x7c\xf5\x7d\xab\xaf\x5f\x7b\xdd\x95\x4b\xae\x38\xe5\xea\x73\xc8\x3d\xb6\x0d\x9f\x93\x58\x17\x84\xf4\x2d\x2b\x9e\x1a\xf8\xce\x04\x38\x3e\xa7\xdc\xf6\xeb\x10\x5c\xa8\xa4\x63\x59\xf7\xfd\xe1\xa5\x78\x8f\x9d\x1f\xf0\x52\x3f\x57\xba\xb5\x0c\xef\x49\x8b\x68\x07\xc7\x30\x58\xf8\x64\x6e\xc3\x77\x42\x7b\xd2\xac\xee\xbd\xfe\x4d\x84\x7f\x10\xfb\x08\xb2\x58\xcf\xeb\xdf\xe8\xef\x49\xad\x22\xc5\x44\x9a\x05\xc7\x61\x6a\xe8\xc2\xd6\x22\x59\x41\x36\xda\x39\x75\x5a\x8b\x6b\x78\x4f\x04\x46\x89\xa8\xde\x6c\x84\x91\x65\xbd\x90\x2c\xe8\x7c\x19\x65\x24\x68\xc3\x66\xc7\x8c\x18\x91\x84\x2c\x1b\xf9\x74\x51\xe7\xc6\x50\x46\x86\x19\x08\x1c\xd3\x11\x4c\xc9\x12\xcd\xa6\x84\x29\xdb\xa2\x49\xb3\x1f\x36\xab\x6a\xc2\x4e\xa8\xd0\xb2\x4d\x3b\x93\xa1\x46\xac\x09\x10\xbb\x30\x2a\x8d\x16\x24\xfc\xdb\xd7\x8d\x4d\x3a\x5d\xcd\x9f\x3d\xf8\x35\x40\x9e\x19\x0b\xf1\xd4\xe0\xd7\x31\xfc\x45\x42\x0e\xe2\x7b\x53\x83\xff\x07\xc3\x73\x84\xdf\x0f\xf3\xb5\x21\x7c\xdf\x6f\xd3\xeb\x80\xd4\xe1\x95\x78\xca\x6d\x99\xa1\xad\xa5\x01\x0e\x45\x2f\x0e\x64\x10\xe7\xe0\x18\xfc\xaa\xef\x47\xf7\xe3\x49\xc0\x89\xa0\x03\x70\x60\x19\xb8\xd8\xab\xc3\xe1\xf9\x9c\x5b\xda\x89\x93\x92\x9e\x54\xa4\xc3\x35\x94\x26\x9d\x0c\xa7\xc0\xee\x49\x51\x6c\x36\x85\x0b\xf6\x76\x4f\x73\x81\xc7\xc3\x3a\x28\x24\x90\xdd\x94\xc0\x56\x31\x32\xa1\x90\x2e\xeb\x05\xb5\xa0\xe7\x8b\x72\xd9\xcc\xf0\x22\x14\x91\x55\x4e\x08\x49\x21\xc3\x8e\xe7\xd1\x18\xb4\x05\x41\xd4\x93\x26\x97\x96\x15\x39\x83\x2c\x34\x0a\x33\x82\x20\x9b\xc9\x0c\x9f\x96\x65\xd9\x86\x79\x89\xd3\x59\x09\x99\x12\xab\xb1\x52\x54\x86\x09\x34\x6a\xa2\x51\x24\xa2\xbc\xa6\x19\xba\x9e\x91\x4d\xd9\x1c\x83\xaa\x09\x13\x48\xd2\x0a\xbc\x52\x82\xcd\x32\x35\x62\x7c\x50\x55\xa0\x6d\x53\x51\x72\x99\x08\x63\x8c\x8b\x8e\x2e\x4a\x09\x33\xc1\x42\x4d\x97\x94\x4c\x44\xcc\x16\xc5\x62\x8e\xcd\x16\xc4\x42\x0e\x84\xee\xc8\x9d\x8b\xe9\xfb\xbc\xc0\xfe\x71\x6d\x6c\x29\x9e\x1a\xc4\xb2\x65\xf0\x70\xe0\xdb\x75\x65\x85\x0b\x3f\x88\xe1\xc3\xc4\x19\x99\x44\x73\xfe\x1a\xf4\x6e\xbe\xee\x53\x60\xf6\x42\x22\xde\x4a\xa2\xd5\x78\x6a\x10\x57\x91\x1f\xac\xf9\xcc\xfd\xbb\xba\x83\x38\x56\x75\xc7\xd3\x04\xdc\xcb\x3b\x83\xd7\x79\x70\x77\x40\x17\x7a\xcc\x74\xe9\xe8\xb9\xa9\x13\xe8\xc8\xcb\x0b\x8f\x6f\x9c\x0c\x57\xef\x30\xf2\x01\x5d\xec\x09\xf5\xeb\xdd\x5f\x71\xe7\x80\xe5\x63\xff\x86\x10\x6f\x90\x03\xfa\x3a\x0f\x90\xe7\xe4\x6a\x00\x3f\x9f\xf0\x43\x63\xbf\xdc\x60\x1e\xc3\xcf\x25\xc6\x13\xd0\x63\x9c\x7e\xee\x6d\xa2\x7d\x62\xbe\x01\x8f\x09\xee\x80\x0e\xfd\x01\x7b\x1f\x7e\x17\xd0\xf5\x25\xb1\x7b\x5c\xdd\xfe\xc5\x6d\xf4\xd1\xb3\x0a\x3c\xcb\xf4\x0e\xbe\xda\x19\x9d\xf7\x2e\x91\x93\x95\xa0\xfb\xa1\x22\x71\xf6\x89\xe5\xfc\x5e\x7c\x56\xb0\xb7\xea\x67\xbf\x36\xb4\x4f\xd6\x0c\xff\xd6\x99\x0b\x40\xf7\x0c\x1e\x30\x8b\x87\xff\x1b\x1d\x0f\xc0\xe9\x93\xf0\x9d\xeb\xe7\x2b\x97\xc4\x2e\xa2\x25\xa6\x6f\xef\xc2\x58\x64\xfe\x67\xe6\x5c\x1a\xef\x1d\x3c\x0c\xd6\xf1\x60\xf6\x8b\x7e\xfb\xa2\x77\xbe\x49\xe6\x6e\x3d\x70\x72\x80\x13\x02\xb7\xbb\xab\x77\x7b\x2f\xa9\x2c\x8f\x6d\xa3\xef\x62\xd6\x6c\x7c\xd3\x79\x11\x7c\xa2\xe7\x9a\xf9\x5f\x8e\xc7\x06\xbf\x16\xd9\x06\x5a\x43\x76\xb5\x8f\xe3\x3d\xdf\x25\x7c\xfa\x22\xb1\x56\xeb\x43\x67\x09\x35\xf8\xb3\x04\x2e\x71\x9c\xc5\xa1\x6f\x84\x70\xe9\xdd\x5b\xe5\xe2\xa9\x3d\x7f\xc2\xed\xff\x0f\xb1\xb6\x26\xd1\xce\x33\xc4\xf9\x0c\x3e\x63\x58\x3f\x1f\xe7\x8d\xf9\x13\xe1\xa3\xf5\xf2\xd9\xfe\x19\xb7\x33\x46\xf0\x38\xdb\xe5\xef\x3b\x7e\x80\xe1\xd5\xdc\xbc\x67\x54\xc4\xd8\x77\x69\x8d\x59\xb3\xf3\x3b\xce\x36\x00\xd8\x9b\x79\x10\xa7\x07\x5f\xbd\x28\xe4\x97\xda\xf3\x47\xf7\x3b\xbb\xaa\xf4\x26\xe2\x7c\x9e\x7a\x3c\xb5\x4f\xc1\x7e\xff\xfd\x21\x19\x25\x55\xe9\x7c\xc7\x5e\x62\xce\x79\x77\x6e\xbb\xf1\x9d\xca\xdd\x97\x84\x64\x8e\x12\x4f\x6d\xfa\x36\x9e\xdb\xd3\x21\x3a\xd7\xab\xed\xf4\x9b\x04\x4e\x09\x1c\xed\xb8\x99\xe0\x05\x4a\x6d\x9c\xf6\xbd\xa0\x76\x6e\xed\xc5\x1a\xe1\x7a\xac\xfd\x4f\x11\xe3\xf7\x72\xd1\x63\xba\xec\x27\x73\xbc\xe2\x3c\xe1\xc3\x93\x42\xfb\x51\xc5\x72\x40\x8e\xa7\xdc\xd5\x22\xee\x6b\xd7\xed\xeb\xfe\x09\xb1\xdd\x1e\x7c\x73\x95\xc6\x6e\xaa\xf4\xc6\xee\xa0\x6f\x65\xd6\x3c\x3d\x13\xa5\x40\x6b\xd7\x2f\xe6\xf5\xc5\xe9\x7d\xca\x09\xef\xfb\x32\x42\x76\xf7\xb0\x1d\xc7\xbe\x72\x85\xc0\x05\x81\x6b\xbb\xa5\xbe\x6f\x6b\x49\x6d\x0f\x81\x4f\x81\xeb\x30\x5f\xec\x07\x51\x7c\xc2\x7c\x12\xe8\x00\xd3\x7d\xff\xfa\x25\xe0\x4b\x9e\x17\xa2\xb3\x3b\xa8\xc9\xd3\xd1\xd5\xee\xdd\x8c\x89\x12\xf7\x6d\x22\x41\xd5\xc4\x08\x99\x55\xb0\x2b\x86\xcd\x2e\x1c\xca\x32\x41\xf4\x7c\xf4\xb3\xa6\xf6\xbb\x6f\xbb\x6b\xcd\x83\xe3\x5b\xa8\x63\x1e\x80\xbf\x40\xd3\x1e\x70\xfe\xba\xe3\x81\x07\x17\x3e\xfe\x00\xec\x9b\xfa\xd5\x5f\xcf\x2c\xc3\xbf\xfc\xe8\x19\xf1\x81\xb7\xfe\x7b\xa8\x3d\x0d\x5f\x1f\x7f\x12\x4e\x4a\xef\xa4\x7a\x9c\x37\xab\x9f\xe8\x7c\x91\x95\x35\x3e\x5d\x84\xb2\x20\x70\x4a\x52\x4d\xa7\x39\x5e\xd6\xd0\x88\xc4\x49\x1a\xcf\x96\xa0\x2a\x08\xac\x98\x94\x92\x69\x51\x92\x2d\xea\x07\xe7\xdd\x7b\xee\x35\xcb\x11\x4f\x1d\xef\xfc\xee\xe1\x52\x89\xda\x3e\xfd\x72\xf5\x9a\xe9\x8f\xdc\xb4\xfc\x9c\x7b\xcf\x9e\x3e\xeb\xbc\xdb\xcf\x9b\x1d\x9d\x7d\xc2\x92\xd9\xe3\x3f\x8a\x4c\xbf\x00\xbd\x76\x37\x7a\xfe\x41\xb4\xfe\x21\xf4\xf5\x32\x9b\xb1\x04\x59\x81\x19\xf3\x83\x11\x5f\x44\x09\x02\x2f\x1b\x39\x08\x38\xcb\xac\x7b\xa2\xa8\xa2\x62\xd5\xf6\xac\x5a\xa5\xc7\xcd\xe5\x60\x6f\x72\x9e\x6f\x6e\xd3\x6b\x80\xac\x01\xc5\xe1\x35\xd6\xaa\x6b\xb9\xef\x7a\xc2\xae\xd6\xdc\x7d\x63\x09\x78\x6f\xfe\x89\x58\x63\xfc\xbe\xb5\x38\x44\x13\x62\x55\x47\xcf\x60\x3a\xcd\xe0\x98\x25\x00\x81\x58\x91\x5d\x38\xe0\xaa\x77\x7c\x5b\xdb\x5b\x67\x4e\xf5\x1d\xc0\x74\xb4\x15\x57\x70\x69\x3d\x6e\x72\x7b\x72\x1e\xec\x69\x3b\x86\x6a\x4f\xa6\xbc\x35\xea\xe9\x6a\xf3\xac\x9c\x76\x08\x60\x39\x43\x01\x04\xc6\x20\x07\x81\x9a\x1f\x81\x63\x8e\x30\x8a\x72\xb0\x0c\x73\x32\x4a\x3a\x45\x03\xca\x30\x69\xf1\x89\x6c\x42\xce\x21\x15\x71\x85\x6c\x4e\x28\x15\x95\x8c\x35\x5e\xa0\x0c\xd4\x1c\xd5\xcb\x65\xab\x5c\x82\x09\x6d\x24\x63\xd9\x99\x9c\x9e\x31\x72\xba\x9e\x4c\x26\xe4\x3c\x5b\xb2\x58\x49\x84\x59\x49\xb0\x24\x59\x4c\x48\xb2\x55\x06\x14\x90\x29\xc9\x95\xa5\x20\x01\x4e\x0a\x46\x5d\x2b\x61\xea\x95\x2e\xed\x6a\x8f\x76\xf7\xb4\xb7\xc2\x24\x95\x36\x61\x5e\x57\x95\x4c\x8e\x6a\x76\x18\x24\x38\x39\x01\x66\xa0\xe4\x24\xa8\xa2\x33\x12\x11\x4c\x1d\xc9\xd1\x92\x6d\x6b\xb2\xac\x5a\xba\x59\xce\x1b\x46\xc6\xcc\x66\x25\x29\x5b\xc5\x8f\x2b\xb7\x35\xc0\x02\x00\x3b\x5c\xfb\x7e\x5a\xd5\xbe\xa8\xe2\x6a\x5a\x15\x57\x13\x2a\x81\x52\x76\x36\x9b\xe5\xe1\x08\xd4\xc7\xf3\x54\xce\x29\x53\xcd\x36\xd5\xec\x94\xc7\x20\x0f\x9b\x95\xfc\x08\x2c\x3a\xbc\x8e\xca\x91\xe2\x78\x9a\x8d\x94\xd3\xb9\x62\xa6\x90\x2c\x65\x54\x25\x79\xb4\x4c\xc9\x02\x6f\xd8\x05\x2b\x6f\xe5\xf3\x56\xbe\x30\xa6\xe6\x4c\x4b\xd4\xad\x1c\xd2\x8a\xac\xc5\x2a\x05\x10\xc8\x2c\xef\xee\x9f\x97\xbf\x66\xad\xef\xfb\xf0\xe3\xa3\xc0\x54\x90\x06\xa7\x85\xd6\xd5\x1f\x6b\xb4\xdd\x2f\xe5\x5f\x9b\x10\xac\x6e\xd9\x04\xc5\xd9\xd0\x46\xb2\x05\x45\x6f\x94\xa3\x0e\x8b\xf4\x88\x62\x8f\x6b\xb6\x6d\x0b\x30\x07\x95\xf1\x51\x6a\xd4\x29\x40\x35\x62\x8c\x6b\xee\x27\x9a\x19\x19\x31\x47\x8a\x65\x2d\x67\x99\xc5\x71\x45\x56\x22\xcd\x1c\x6f\x99\x39\x73\x64\x5c\x2d\x38\xa3\x05\x10\xc4\x90\xb9\x74\x89\xa3\x93\xf6\xdd\xe0\xdb\x04\x7e\x6c\x2e\x5e\xcb\xd9\x60\xfe\xbf\x5c\xcf\xea\xd9\xd1\x54\xef\x22\x39\x71\x8f\xbc\x9d\x8e\x4d\x72\x27\xf0\xef\xac\x38\xd4\x1c\xd3\x54\x75\x05\x2a\x79\x33\x91\x88\xa8\x5a\x56\xb5\x93\x23\x92\x98\x48\x8e\xe7\xc4\xb4\x08\x8b\x88\x6d\x4c\x14\x4e\x12\x29\x02\xcc\x88\xbc\x52\x80\xcd\xe9\x74\xd2\xd1\xcb\x49\x33\x29\x69\xd0\x90\x12\x68\x0c\x27\x8e\x88\x82\x1b\x2b\x17\xc4\xae\xa5\xef\xc4\xf7\xd2\x92\xe0\x02\x70\xb1\x7f\xa2\x52\xbd\xf6\xde\xe3\x0f\xb7\xb3\x3b\x8a\xa7\xd3\xe6\xe1\x3f\x34\xed\x98\xb7\xf3\x8e\x9b\x3c\x33\xe9\xb9\x76\x93\x29\xec\x69\x0a\x21\xa3\xf2\xd2\xa9\xb3\x9b\x5e\x5c\x7b\xe9\xcf\xae\x1d\xe8\xf8\xcd\x05\x4f\x76\x2c\x38\x7a\xf3\x05\x8f\x7f\xf9\x2f\x91\x5d\x8e\xb0\x61\x03\xd5\xe1\xfc\x12\xbd\x0f\x07\xf7\xc0\xc1\x97\x9f\xbf\x6a\xf7\x4b\xf0\x55\xe7\x12\xf4\x3f\x47\xe1\x1b\xd0\x58\x86\x2e\x47\x9f\xfc\xf1\x8f\xe0\xf5\x37\xb6\x3d\x99\xee\x47\x67\x22\xed\xf0\xd6\x97\x96\xc1\x4d\xf0\x5c\xa7\x93\x7a\x0c\x5d\x1e\x49\xdc\x76\x35\x92\x23\x1d\x93\xbb\xba\x9d\xcd\x8f\xf4\x75\x3c\x71\x5a\xf3\xe2\x87\xe1\x23\x0b\x17\x5f\xfa\xd0\x37\xd0\x81\x5e\xf8\x5c\xf9\x99\xa6\xaf\xaf\x5a\xa5\xae\xba\x7e\x95\x7a\xad\x7a\xfb\x05\x9f\x99\x7d\xe9\x8a\x4b\x67\x9f\x70\x5c\xe7\x8a\xce\x07\x85\x2e\x61\xc5\x8c\x19\xea\xf5\xb7\xab\xd7\x5f\x3f\xab\xeb\x7a\xe0\x9f\xf1\xb8\x7b\x68\x06\x98\xd9\x70\x8d\x03\x36\x43\xec\x9e\x49\xed\x2d\xe1\x95\x9f\xe4\x93\x2c\x5e\x63\x8e\x02\x36\x95\x56\x24\xc5\xca\xc2\x9c\x23\x8c\xa0\x0c\x65\x40\x41\x45\x9a\x23\x34\xb1\x8c\x66\x70\x5a\xd2\x64\x39\x36\x71\x74\x04\x99\x3c\xcc\x42\x65\x7c\x8c\x2a\x20\x10\x51\x6d\x13\x81\x51\xd3\xd1\x4d\x93\xd2\x1d\x3d\x3a\x66\x18\x32\xcf\xab\x9a\x6c\xa8\x5a\x92\xd5\x74\x2d\xc9\x3b\xd9\x72\xc2\x4a\xe8\xd0\x86\x69\xd5\xd0\x4c\x23\x93\x11\xa5\xcc\x78\x11\x35\x0b\x02\x2c\xa3\x11\x1b\xd3\xec\xdd\x01\xcd\xce\x05\xe7\xfc\x4b\x9a\x6d\x6f\xed\xa8\xa6\xd5\x0d\x3b\x9e\x9a\xda\x3b\xbb\x7b\xda\xa3\xa9\xce\x76\x3a\x36\xf5\xdf\x22\x5c\x67\x5b\x54\xf8\xfa\x73\x86\x28\x2c\xf8\xe0\x43\x6a\xbd\xb3\x36\x32\xb7\x8c\x22\xa7\x39\x77\x53\x0f\xa0\x5f\xa1\x9f\x32\x07\x1f\x45\x3f\x6d\x5a\x26\x5e\x8e\xbe\xfc\xdc\xa3\xd4\x69\x8d\x49\x18\x2d\xbe\xf3\x86\xbb\x6e\x59\xdc\xf5\xd9\x96\x1b\x9e\x94\x36\x6e\x94\x9e\xbc\x26\xfe\x64\xd7\x35\xb7\xcc\xeb\xba\xab\x2b\x5e\xe5\x2b\xaa\x7f\x57\x1c\xe7\xb3\xef\x7f\xc2\x97\x15\xde\x39\x4d\x1a\x7c\xce\xab\x2a\xed\x95\xf0\x0b\x45\xef\x05\x9f\xee\x9e\x76\x35\x96\x1c\xcf\xb2\x5c\x84\x57\x14\x4e\x48\x2a\x2c\x87\xf2\x16\xca\xdb\xa8\x60\x53\x1c\x9f\x1e\x1f\xa5\xd3\x96\x6d\x1e\xcd\xc9\x0a\x63\x35\x8b\x11\xe3\xe8\x58\x13\x83\x3f\x7a\x34\x61\xda\x84\xae\x97\x8e\xa7\x86\x4e\xc0\x3a\xe0\x9f\x00\x79\x6e\x90\x0e\x6a\xe6\x9f\x40\xe8\x5c\xb6\x2b\x43\x87\xbc\xba\xe8\xc7\x87\x6c\x11\x2d\xee\x57\xa1\x19\x3a\x1e\x90\x71\x0e\xae\xce\x85\x6b\xf2\x0e\xb5\xf9\xf3\xf4\x78\x92\x0a\xa6\xe1\x95\xad\xf1\x7a\xff\x27\x1c\xd9\x85\x99\xa7\x48\x49\x8e\x48\x65\x6d\x2a\xeb\x88\x94\xe2\x58\x91\xa4\xc3\xc3\x24\x2c\xca\x88\x43\x23\x36\x2a\x21\x41\x85\x45\x98\x70\xa4\x48\xb3\x93\x69\xe2\x73\x56\xa9\x64\xe5\xac\xbc\x85\x32\x76\xb6\x00\x55\x47\xa1\x2c\x64\x17\xcd\x22\xe4\xad\x7c\xcd\x87\xe2\xd5\xa6\x1b\x73\x75\xf5\x17\x5f\x21\x7c\x2b\x5e\x8e\xae\x3b\xf1\x98\x4b\x04\xdc\xcb\x65\xf2\x0f\x0c\x1f\xab\x87\x0f\x63\x3d\x61\x40\x99\xd0\xce\x18\x20\x6b\xd7\x0b\x41\x4e\x55\xac\x23\x0e\x0b\x8d\xdb\x09\x6a\xd1\x73\xb5\x76\xc6\x70\xbd\x9a\x66\xd2\x07\xa4\x57\xdb\x0f\xea\xb7\x08\x15\xd6\xcf\x39\x8b\xdb\xe9\x7f\x9c\x68\x5f\xad\xcd\x77\x77\x24\xa4\xcf\xe8\xf1\x54\x76\x01\x1e\xcf\xe7\xeb\xc7\x7f\xe0\x95\x09\xe3\xc4\x3e\x2f\xaf\xdf\x21\xf2\x1e\x91\x56\x6b\x27\x3b\xbf\x1e\x3e\x84\xed\xca\xe7\xb6\x13\xf0\xef\x06\xf0\xde\x3d\x89\x59\x60\xde\x1e\xbe\xc1\xda\x30\xf4\xe1\xcd\xf5\x63\xf5\xda\xda\xf3\x3c\x01\xc7\x71\xfe\xbb\xf1\x19\xc8\xd0\xaf\xea\x6d\x16\xfc\x7e\x6a\x08\x47\xa8\x0d\xaf\x0b\x9f\xed\x7a\x6d\x11\x77\x15\x42\xf0\x1d\xa4\x7d\x8e\x63\xb4\x3d\x78\x90\x77\x4f\x08\x62\xa5\x31\x5e\xb7\x3d\x13\x3a\x4f\x09\xda\x09\x72\x71\x05\x70\x0f\x4f\xbb\xde\x0f\xd9\xf9\x3e\x3c\x4e\x6f\x7d\xad\x9e\x2e\xbc\xf6\x77\x3d\xd0\xb8\x9d\xa1\x5f\x00\xf2\xcc\xd8\xed\xf7\xe7\x78\x1d\xaa\x77\x58\x17\x57\xba\x62\x4f\xd2\xf7\x31\x7d\x43\x63\x9f\x00\x3d\xcf\xb8\xf6\xfb\x26\x0d\x6c\xac\xfc\xf3\xac\x7f\xf0\x57\x62\x19\xe2\xee\x49\x16\xb4\x80\x56\x70\x3c\x38\xd9\xe3\x40\x2d\xae\x3e\xd3\xd2\xd1\xd2\x14\xed\x9c\xd6\x82\x23\x75\xf0\xcf\xd4\x69\x5d\xed\x06\x3d\x8a\x8a\x90\x4f\x64\xb2\xb6\x63\x3b\x42\x12\x4a\xa8\x00\x47\x22\xfc\x78\xde\xfd\xc0\x02\xd4\xc6\xf3\x34\x6b\x1d\x2d\x25\xcd\x04\x83\x14\x68\xf0\xac\x9d\x68\xd2\x51\x19\x36\x3b\x22\x64\x9c\x74\x32\x3d\x1a\xf2\x25\x1d\xc6\x75\x68\xac\x45\x84\x3e\x6d\xb9\x76\xe5\x11\x6c\x9f\xbe\x48\xe6\xb1\xd2\x5d\xf8\xe1\xad\xa1\xf7\x3d\x5f\x80\x1e\x4f\xed\xc5\xd1\x18\xfd\x8f\x05\xbc\x49\x8c\xe9\xd8\x87\x8a\xfd\x82\xfd\x8f\x12\xfe\x0e\x9c\xdb\x64\x03\xf6\xb9\x06\x35\xd4\xbc\xd8\x7a\xd6\xdb\x9f\x71\x7a\xc3\x05\x21\xbb\x55\x8c\xa7\xac\xb3\xf1\x7a\x86\xeb\x3d\xf1\xf1\xd4\xae\x7d\x00\x30\x8b\x9f\xbe\x15\xf4\x03\x30\xfb\x1d\x1e\x90\x79\xfa\xbc\x39\x58\x0b\x89\xbe\x31\x7c\x60\x67\xa8\xad\x5a\xbe\xc4\x05\x13\xfa\xf8\x9e\x0b\xf7\xfa\x18\x5a\x0f\xbe\x06\xc0\xec\x17\xf9\x1a\xef\x55\xdd\x3e\x92\x20\x4e\xef\x3d\xbd\xec\x9d\x0d\x78\x3e\x37\x1e\x1c\x0b\x26\xe1\x8a\xd1\xd3\xc1\x19\xde\x89\x77\xb4\xb5\xa3\x0b\x2f\x67\x97\xbb\xc0\x81\x5a\xda\xd5\xde\x0a\x5d\x05\x80\x8c\xdb\x4a\xb9\xe2\x75\xf2\xb4\xc9\x9e\x21\x12\x7e\xd4\x19\x53\x19\x54\xb0\x8f\x26\x12\x90\xab\x00\x5a\xa9\x80\x71\x36\xc2\x8e\x17\xab\x1f\x58\xe0\x23\x69\xc5\xb4\x8b\xdc\x58\x3e\x5b\x12\x8b\xa6\x09\x19\x8d\x47\xaa\x34\xde\x6c\x19\x12\xe7\xe4\xa9\x31\x51\x93\x25\x45\x96\xf3\x65\x71\xcc\xd2\x8d\x88\x62\x32\x8a\xcc\x9b\x0c\x65\x19\x86\x63\xc3\x51\x0d\x59\x2a\x32\x35\x1b\x99\xba\x32\x6a\x48\x9c\xc5\xeb\x1a\x67\xb2\x92\x91\x56\x4c\x53\x12\x64\x59\x33\x94\x82\x2e\x88\x9a\x24\x58\xbc\xc9\xa9\x92\x00\xc8\x9c\x65\x16\xae\x38\xb2\x6b\x5f\x80\xc3\xd9\xb1\x2c\x7d\xa7\x8f\xc3\xde\xc3\x4d\xca\xd1\x39\xdb\x78\x4f\x9f\x74\xf1\xfb\x04\xbd\x00\x4c\x09\xa2\xde\xaa\x11\x3a\xc7\xb9\xbf\xe2\x30\x06\x22\xc1\xa1\x7f\x97\x6b\xa5\xc4\x5d\x9d\xa3\xa5\xa7\x2d\x56\xad\xa8\xdd\xd2\x31\x69\x66\x4b\x47\x8b\xfb\xe9\x69\xe9\x68\xea\x79\x76\xd2\xf1\xd4\x05\xe8\x57\x9f\x81\xdb\xd1\xaa\x67\x21\x27\xa1\x1f\xee\x7c\x06\x0d\x48\xf0\xe2\x3b\xd1\x0d\xb0\x30\xe9\xe7\x53\xaf\xb8\x77\xf3\xf8\x97\xa8\x31\x5d\x4c\x28\x56\x61\x94\xe3\x38\xb9\x5c\xc2\x7f\xe8\x05\xa7\x5f\x7d\xde\xae\xbf\xda\xcf\xa0\xcb\xd0\xa8\x01\x9b\xa1\x85\xee\x45\xbf\xb7\x7f\x0c\xdf\x7a\xc6\xfe\xeb\x86\xcc\x1d\xb0\x05\x9e\x64\x8e\x83\x84\x91\x44\x1c\xb4\x78\xd6\x66\x9a\x9b\xb4\x0a\x80\xc0\x51\x21\x70\x38\x16\x36\xfb\xfb\xc7\x3f\xe7\xdd\x8b\x69\xec\x08\x79\x27\xc2\x74\xe9\xdb\x9a\x3f\x81\xc6\xbc\x1a\x21\x5b\x70\x9e\x1a\x0a\x63\xcf\x0e\x9e\x5d\x14\xd0\x5f\xef\xa0\x74\x2b\x98\xb3\x8a\xaf\xfb\x1e\x7e\x46\x6f\x9c\x1e\xf8\x7f\xfc\x5c\x9e\xd6\x0c\xdc\xd2\xf6\xfa\xfe\xb7\xfd\x25\xd4\xbf\x88\xe1\x6a\x3c\xb5\xf7\xd4\xd0\x78\xdd\xf6\xf7\xba\x3a\x87\xd7\xf7\xde\x5d\x57\x81\x39\x5f\x26\xfa\xc6\x6d\x0d\x4d\x0e\xad\x75\x10\xf7\xb0\xa1\x2d\xd4\x96\xb7\x1f\xb9\x78\x6a\xdb\xb7\xea\xe0\x55\xfd\x25\x0c\xf7\xe2\x72\x84\x78\x6a\xc3\x6f\x30\xef\xdd\x4e\xbc\x8f\x6b\x16\xec\x4d\x4c\x18\x2b\xf6\x9d\xb9\x23\x89\xd3\xdb\x6b\xf5\xa7\xb5\x98\xee\xf2\x08\x0b\xfb\xbf\xfb\x6b\x75\x6d\x58\xaf\x8e\xbd\xf7\xfe\xd0\xf4\x34\xd9\x8e\xab\x37\xbd\x53\x47\xc3\xd5\x7c\xe8\xf8\xfd\xad\xf7\x04\xe3\xe1\xbc\x71\x1e\x78\x06\xb7\xff\x48\x88\xcf\xe8\x1e\x8f\x8b\xd3\x47\xbe\x10\x6a\xc7\x3f\x63\xae\x6b\x1f\xeb\x26\x1b\xa2\x21\x78\x06\xdf\x8d\x15\xe2\xa9\xfd\xde\x6d\x9c\x87\x03\xdf\x9f\xe8\xc9\x5d\x17\x33\x0c\xdd\x5f\xbd\x0b\x7e\x41\x45\x88\x1d\xc0\x75\x76\x2e\x8d\x82\xd9\xdb\x79\x77\xdd\x3e\xb5\x04\xcc\x3b\x9b\x58\x37\xcc\x4b\xf1\x9a\x56\xf3\xc7\x3f\x48\xf0\x53\xa3\x4a\x4f\x41\xed\x80\x8b\x2a\xc7\xc6\xfe\x83\xee\x62\x52\xbb\xf6\x1d\xfd\x2d\xb3\xf8\xd0\x1c\x78\x69\xe5\x3b\x5d\x5f\x9b\xbf\x8b\xcc\x9d\xb5\x6b\x67\x95\x6a\x09\xfa\x50\xab\xf8\xda\x54\xbd\xeb\x79\x59\x65\x61\xec\x67\xf4\x8d\x4c\xdf\xae\x7d\x9f\x3a\xda\xf3\x03\x9e\xc5\x79\xc1\x5f\xad\xbc\x3f\x7b\x11\x5f\x1b\x9f\x12\x4f\xed\xfc\x75\x03\xfc\xa8\xd5\xb1\xf5\x3f\x40\xd0\x03\xe6\xe7\xbb\xb6\x4d\xa0\x87\x4c\xf0\x7e\x75\x9e\xf7\x63\xfe\xec\x3e\x7b\x93\x56\xc1\x89\xe0\x4c\xb0\x14\x5c\x0d\x56\x81\x35\xe0\x8b\x00\xf8\x39\xdf\xaa\x51\x49\xb3\xc8\xa4\x39\x74\xf4\xe3\x1e\xc2\xf6\x9e\x36\x8f\x5d\x45\x63\x53\x23\x54\xd4\x65\x57\x1f\xcf\xa5\x22\x05\x89\xe7\x39\x23\x37\xa2\x4a\x49\x8d\x67\xf4\xe6\x5c\x31\x6d\xea\xaa\x9e\xb4\x64\x53\x84\x23\x1f\xfd\x50\x18\x3f\x08\x4b\x8c\xd5\x4c\x01\xc4\xea\x50\x14\x51\xd6\xb6\x91\x25\x43\x59\x43\xa2\x33\xa5\x11\x53\x6b\x2a\x32\x09\x45\xe5\x90\x59\x4c\x24\xa4\xa4\x65\xa6\x59\x96\x4b\x6a\x46\x81\x4d\xe8\x19\xc8\xb0\x23\xd6\xc7\x3e\x2e\x8e\xdf\x61\x33\x22\x6f\x55\x80\x6c\x6b\x30\x8d\x72\x92\x25\x41\xa6\xe9\xbf\xfe\x15\x1b\x04\xe4\x1d\x3a\x6b\x76\x68\x2d\x2f\xf0\xee\xca\xb9\x34\xf0\x01\x98\xdf\xc1\xbb\xfb\xa3\x09\x5f\x90\xf8\xa4\x7f\xcf\xed\x1a\x70\x82\x9f\xa9\x4f\x00\xcb\xfc\x5a\x3b\x6b\xbd\xd3\x75\xef\xa6\x54\x35\x95\x51\x90\xa5\x6f\xda\x47\x3e\x4a\x75\xc2\x9a\x33\xf7\x74\x58\xfb\xdd\xf9\xf1\x4b\x14\x4d\x70\x8c\xc9\xd8\xf9\xb4\xae\x69\x18\xf5\xb2\x91\xe1\x38\x23\x93\x57\xa4\x24\x95\x67\x13\x26\x63\xe7\xd2\xba\x8a\x9f\x19\x92\x91\xe1\x58\x33\x93\x93\xc5\x66\x66\xfc\x5b\xeb\x2f\x5d\xb7\xfe\xae\xc8\xdb\x2b\x17\x6f\xe8\x59\x79\xf7\xb2\x29\xeb\xa7\x2c\x5e\xdf\x3b\x65\xfd\x94\x9e\xa3\x47\xa9\xc2\x57\xce\x6b\xbb\xd6\x7c\xf9\x9d\xae\xae\xae\x2b\xff\xf0\x63\xfc\x87\x7a\xb7\x50\x4c\x5b\x42\x5a\x2b\xc0\x74\x92\x31\x46\xa1\x9a\x46\x76\x9e\xb1\xb2\xac\x33\x8a\x0a\xe9\xb4\x9e\x6c\xf8\xdc\xce\xb8\xcf\x8b\xc9\x34\xcf\xa3\x9e\x19\xbf\x7e\x7e\xd9\xe1\x7d\xbb\x5f\xeb\x7d\x6d\x7f\xe7\xf3\x2f\x75\xbf\xb6\x7b\xca\xf3\xdf\xe8\x79\x6d\x77\xf4\x9e\x7f\x6f\x9d\x78\x6f\x6f\x59\xdd\x13\xf6\x1c\xbe\x7b\xb7\xe5\x6f\x21\xb8\x5a\xe5\x61\x3b\x27\xe3\x3b\xe4\xf8\x76\xdc\xe6\xe1\x40\xc6\x78\x39\xba\x2b\xb5\x67\xfd\xf7\xe1\x67\x66\xf5\xcc\xc8\xc2\x91\xd8\xfd\x3a\xd1\x0f\xbe\xdb\xb8\xe9\x5b\x75\xb2\xc4\xd7\x27\x9e\xfb\x6b\x68\x6f\x2b\xd5\xb3\xa4\xe1\xc5\xf8\xae\x07\xf6\xba\x0d\x2f\x0a\xf3\xd1\xc3\xf8\x66\xbb\xc5\x85\xf8\xae\x19\x4f\x0d\x9f\x31\x81\x4f\xe1\xb3\x31\xab\x67\x02\xdc\xae\xf1\xfb\x0d\xb5\x1a\x08\xfe\x59\xa7\xe1\xca\xd6\x5e\xeb\x4c\xaa\x3c\xff\x98\x39\x0e\x7e\xf6\x60\x65\xb5\xf7\x9d\x4d\xdf\x04\x20\x1e\x7b\xcc\x76\xde\x01\x53\xc9\x7b\xbe\x9b\x70\x25\xe4\xfe\x7b\x09\xbd\x19\xe7\xc5\x3b\x84\x2b\xdd\x58\x5d\xbe\x8f\xd3\x7f\x1f\xd7\x3b\x3a\xbd\xea\x81\x69\x99\xd9\xda\xd1\xf2\x11\xd1\x20\xf8\xc7\x8b\xe2\x77\x3f\x69\x4a\xb5\x29\x73\x64\xc4\x51\xa9\xa2\xc3\x46\xe4\x71\xdb\x8b\x5f\xd6\x28\xc3\x31\x28\x0d\xff\xdb\x8c\x30\x70\x0c\x31\x70\x2c\x3a\x6a\x9a\x28\xef\xfe\x67\x99\x16\xca\x43\xde\x72\xff\x91\x31\x33\x99\x0c\x2a\x64\x32\xee\x78\x54\xdf\xc7\xe5\xea\xb2\x53\xc2\xe3\xa9\x85\x4f\xfb\xfd\xb7\xb4\xb7\x40\x99\xe2\x6c\x4a\x1d\x1b\x73\x4c\xdb\xc9\x50\xd2\xf8\x48\x24\xed\x14\xa8\x11\x58\x44\x2c\x2c\x46\xcd\xd1\x51\xa4\x58\x48\x72\x87\x62\x41\xc6\x2a\x97\xcb\x48\x45\x63\x90\xf1\xf1\x3e\x3f\x36\x84\xfd\x33\x2f\xbb\xfa\xb6\x35\x0b\x4e\xaf\x1c\xed\xf9\xde\x3c\x19\x3f\x4b\x7b\x32\xf8\x00\x8e\x87\xdb\xeb\xdd\x33\x8e\x55\x6b\x2f\xfb\xe3\x73\xb1\xf6\x05\x7c\xff\x72\xc2\x38\xeb\xf0\x34\xb3\x95\x89\x75\x76\xb7\xf8\x17\x27\x82\xec\x69\x50\xa0\x24\x9b\x52\xc6\xc6\x1c\xcb\x76\x6c\x4a\xc6\xf8\xca\x50\x65\x58\x40\x1c\x2c\x1c\x4d\x58\x25\x35\x17\x4d\xd8\x36\x1a\xd1\x44\x43\xd0\x10\x63\x0a\x92\xa9\x44\xc7\x0c\x03\xe5\x2d\x94\x1b\xd7\x22\x86\x95\xb5\xf0\x55\x97\x6c\x16\x09\x23\x48\xb4\x55\x03\xaa\xf9\xf1\x51\xaa\x54\x28\x89\xa5\x02\xcf\xa2\x52\x5e\x2c\x11\x7e\x1a\xd7\x96\x34\xb1\xcd\xf8\x94\x4f\x03\x3c\x8e\xfd\xd3\xc0\xd9\x60\x31\x38\x2f\xf0\xc2\x79\x73\x71\x31\x8e\xb3\xcd\xb5\xd4\x56\xa0\xa3\xa5\x3d\x86\x7f\x63\xf6\xd7\x32\xb3\x75\x66\xd7\xcc\x96\xf6\x93\x60\x7b\x78\xde\x51\x77\xde\x09\xca\x30\xa9\x7c\x2e\xe7\xf0\x94\x80\x64\x1b\x02\xcb\x42\x65\x1b\x66\x9c\x9c\xe9\xfc\x7f\x94\xbd\x09\x9c\xdb\xd4\xb5\x07\xac\x2b\xd9\xb2\xa1\xa5\x68\x3c\x19\xc6\x40\x21\x9a\x4c\xe2\x11\x6b\x04\x93\xc9\x88\x25\x89\xd8\x12\x41\x59\xc4\x2b\x05\xd1\x12\x10\x05\x82\x58\x02\x82\xb0\x08\x02\xad\x02\xa5\x15\x30\x93\x8a\x25\x44\x21\x40\x95\x84\x24\x9a\x6c\x38\x24\x69\x4d\x37\xdc\xd7\xcd\xdd\x0d\xb4\xc5\xed\x6b\xfb\x5c\x78\x2d\x7e\xa5\x8b\xe9\x7b\xaf\x75\x32\xd6\x9d\xef\xa7\x2b\x59\x96\x3c\x9e\x7e\xdf\x57\xea\x61\xb8\x73\x7d\x75\x75\xee\xb9\xe7\xfc\xcf\xb9\xe7\x9e\x53\xa5\x80\x65\xc3\x3a\x63\x28\xf9\xb4\x59\xb3\xa0\x8e\x67\x3d\xbe\x69\x16\x08\xc1\xd5\x88\x2c\xce\xb8\x15\x9c\x21\x19\x51\x6c\x98\x53\x18\x14\x64\x40\xdb\xf9\xc9\x02\x90\x60\x15\xd8\xb2\x5b\xc5\x69\x19\xca\x80\x2e\x98\x4a\x01\xc7\x00\x95\x77\x60\x2d\x2d\x83\x82\xa9\x9a\x8a\xa2\x34\x54\x35\xee\x9b\xca\xa3\xfb\xb3\x13\x6f\x44\x30\x13\xc2\x12\xd6\x02\xb4\x4f\x5a\x18\xeb\xd6\xa9\x2b\x52\x3f\x20\xaf\xa1\x6e\xde\x61\x82\x9f\x27\x8e\x3f\xfd\x4d\xee\x97\xd4\x8a\xf1\x77\x8e\x78\x60\xf1\x31\x67\xfc\x8d\x5a\x6a\x2d\x38\x1e\x5f\x3c\xe7\x8c\xef\xa3\x18\xe3\xd2\x14\x9f\xe2\x49\x0d\x1b\xc4\x4e\xeb\xbc\x81\x4b\xa6\x12\xfd\xa9\x9c\x5f\xbe\x3f\x70\xe4\xf5\xcf\x4a\x11\xfd\x91\xf6\x4c\x8a\x57\x14\x59\x67\x1c\x89\x73\x8d\x74\x1a\xc8\x75\xa5\x0a\x8b\x1a\xcc\xab\xc0\x10\xdd\x9a\x8d\x57\xa9\xb4\x45\xc9\x4e\x96\x01\x4c\x59\x2e\xc3\x9a\x0e\x1d\x05\x50\xb5\xa4\x76\xc8\xf6\x2f\xdf\x26\x6c\x9a\x2a\xd4\xac\x5a\xbe\x9e\xd7\x2a\x80\x3e\x24\x93\x9c\x6a\x66\x75\xc5\x2d\x66\x15\xc9\x29\x99\x65\xa7\xe2\x98\x3a\x48\xb7\x65\x8c\x90\xc9\xed\x43\x35\x70\xb6\x4e\xaf\x83\x8f\xda\x9f\xff\x62\x0c\xd3\x84\xfd\x5f\x79\x38\x82\x81\xbe\x41\xde\x18\xe4\xa4\x5f\xba\xfb\xf2\x11\x6c\xf1\xdf\x97\xf8\xf9\x8c\xd7\x4e\x5d\x95\xba\x36\xf9\xdb\x4c\x6e\xdf\x09\xff\xd8\x4d\x2d\xb5\x4e\x5f\x3e\xe7\xcc\xe4\x52\x2b\xe2\xaf\x30\x32\xb9\x5d\x28\xf6\x7d\xd7\x49\x9d\xf6\x40\x1e\xc5\x1a\xef\x39\x25\xd2\xee\xd7\xfd\xdd\x8c\x30\xf0\xae\x48\xbb\xd3\x8a\x75\x6e\xd5\xcf\xc7\x12\xc1\xbd\x29\x03\xdd\x6c\x9b\x8b\x31\x7e\x9c\x62\x20\xbf\xfc\xb8\xc4\xce\xcb\x6a\xbd\x81\x30\x49\xd0\x1c\x4d\x60\x87\x8a\x09\xfd\x50\x15\xd6\x09\x8e\x66\x08\x4e\xd7\x14\x93\x29\x4a\x72\x93\xb2\x6d\xa2\xde\xa4\xbc\x0f\x69\x08\x92\x55\x32\x81\x64\x71\x9c\xcb\x35\x35\x74\x9b\x57\x34\xa0\x91\x10\x61\xd9\x82\xa2\x11\xb1\x19\xb4\x4c\x6e\xcf\xa9\x28\xae\x33\xfe\x3e\x42\xab\xbe\xbf\xdf\x8e\x25\x41\x76\x4a\x20\xab\xa4\x86\xcd\xc2\xb2\xd8\x47\xb1\x39\x68\xe6\xc3\x3d\x03\x9d\x93\x6d\x9f\x2b\x45\x0f\x8b\x1d\x1b\xd7\x34\x4d\xb3\x98\x92\x22\x4d\xe6\x6d\x5c\x83\x4c\x42\x9c\xcc\xa3\x8f\x66\x59\x79\xad\x30\x59\xce\x2b\x96\xe2\x90\x1a\x64\x26\x75\x9f\x6b\xaa\x90\x4e\x4a\xd0\xa8\xba\xf9\x2a\x51\x10\xcb\x9a\xaa\xdb\xa6\x23\xa1\x0b\xea\x51\x5f\x86\x1f\x4b\xbe\x6b\x7d\xa7\x4d\xe2\xf3\xc3\xfe\x67\x83\xf9\x73\xe8\xee\xaf\x7f\xaf\xf0\x68\xec\x38\x6c\x00\x45\x51\xf9\x37\xbe\x22\xb7\xab\xfd\xb7\x00\x23\x03\xc7\xe1\x03\x23\xc0\x48\x52\x87\xea\x36\x51\x6e\xb2\x89\xa2\x65\x4a\x2a\x63\x89\x82\x30\x69\xda\x49\x6a\xd2\x4c\xa8\xa4\xe0\x56\xac\x06\xc4\x9a\x92\x2c\x67\xad\x2c\xc3\x68\xd0\x49\xc8\xb0\xe8\x38\x46\xa1\xd0\x85\x07\x0e\xf4\xc7\xec\x3b\xa1\xd5\xbe\xeb\xdb\x31\x5e\x56\x42\x5e\xe6\x63\xef\x14\xf2\xf8\xfe\x27\xc2\x71\x2e\x48\x7d\x91\x7c\x98\x5a\xb1\x63\xef\x44\xf2\x5c\x8c\x8f\xae\xa3\xef\x97\x6a\xef\xa3\xa7\x23\xcf\x46\xb6\x93\x5f\xab\xc1\x96\x62\xb8\x22\x9c\xd3\xab\x2f\x74\xe2\x0d\xbf\x7d\x67\x21\xd2\x8e\xfc\x55\xfb\x51\xac\xc8\xbe\xcd\x9d\xb6\x68\xb0\x4f\x1e\x8e\xed\x87\x70\xfc\xb0\xa6\xbc\x6f\xab\xa8\xad\x75\x0c\x73\xe5\x85\x34\xf2\xf7\xd5\xab\xef\x76\xda\x36\x7e\xff\x6d\xbf\xf5\xd7\x37\xc8\xdf\xa6\x61\x14\x36\x0b\x9b\x87\x9d\x80\x9d\xe2\xef\xac\x9e\x81\x1e\x8a\x18\x5a\x98\x19\xe9\x41\x01\xfa\x7d\x03\xbd\x33\x6e\x2f\x81\xa3\x71\xeb\x90\x5e\x34\x15\x11\x2f\xd1\x0c\x91\x9e\xa4\x12\x75\x5d\xd5\x64\x83\xc9\x4b\x52\x93\xb3\x2c\xa2\xd4\xe4\xbc\x0f\xa9\x49\x0a\xe4\x61\x15\x52\x50\x97\x6a\x40\x69\xe0\x79\x91\x83\x35\x1b\xd6\x9b\xa6\x2c\xa7\xad\xb4\xa8\x42\x27\xc1\xc2\x8a\x05\x05\x33\x94\x1d\x21\x0d\xc3\x3c\x7e\x1d\xfc\xb1\xfb\xf5\x6e\xef\x48\x91\x28\xb4\xbe\xd5\xae\xb6\xdb\xb7\xdd\xd9\x69\x27\xfb\x6b\xbd\x77\x43\x68\x0f\x07\xcf\xb5\x86\x11\x96\x3a\x3d\xb6\x46\xed\xbd\xa3\x63\x5d\xf6\x14\x45\xee\x6b\xd5\xa5\xb3\x51\xcc\x8b\x91\xc9\x59\xe8\xde\xd1\x78\x74\x4d\xbf\x49\xae\x6a\x8d\x73\xa0\x6f\xf1\x64\x10\x8b\xed\xe1\x47\x0b\xeb\xc5\x16\x62\x67\x62\x8b\x7d\xef\x55\xa2\x3f\x35\x77\x1e\x3a\x29\xcb\x0d\x8d\x26\x92\x73\x41\xfb\x66\x4b\x6a\x9a\x18\x21\x53\x43\x73\x41\x28\x4b\x48\x5a\x73\xaa\x00\xab\xf3\xb0\x00\x0b\x50\x86\xba\x08\x28\x20\x36\x1a\x3c\x90\x81\x00\xd8\x49\x16\x37\x45\xce\xa0\x19\xa2\x30\x59\xe6\x38\xa2\x2e\xcb\x92\x49\x9b\x32\xd7\x64\x6d\x4b\x95\x40\x1a\x50\x6e\x03\xd4\xbd\x6d\xec\x7d\x48\x4b\x96\x64\x41\x34\x35\xd9\x10\x0d\x4e\xe6\x59\x5d\x90\x14\x48\x49\x92\xc0\xb1\x16\xcf\x35\xab\xb2\x4c\x19\x94\x2c\xc0\x12\x5e\x57\x79\xcd\x06\x69\xa8\xea\x50\x35\xa2\x7c\x29\x66\x72\x5b\x7e\xdb\x96\x8f\x41\xfb\xab\x28\x77\xb1\x4f\xd3\xdb\x0f\x8f\xee\x69\x23\x5c\x9b\xcb\x63\x6b\x2c\xb7\x68\x3d\xfe\x50\xa7\xef\x67\xcb\x6f\x50\x1c\xfe\xe6\xc8\xda\x68\x64\x58\x63\x65\xa7\x1f\xcb\x43\x62\x8f\x4c\x09\xa9\x27\xc8\xbb\x90\x5c\x6b\xeb\x94\xe0\xfa\x6b\x32\x38\x43\x9d\x51\xa7\x10\xaf\x9b\x26\x4d\xd0\xcd\x2a\xb1\xd3\x3a\xc4\x58\x64\xe2\xee\xbb\x6f\x5d\x93\xdb\x73\xcd\xa7\x9b\x0b\x2c\x8b\xf8\x71\x73\x81\xf7\x21\xef\x72\x15\xf0\x1d\x6b\x3f\x2c\x15\x0a\x80\x83\xff\x6c\x16\x64\x29\x6b\x66\x05\x15\x16\x12\x18\xac\x9a\x50\x36\xba\xf2\xf3\x9e\xff\xeb\xce\xcf\xbb\x5b\xb1\xb0\xf5\x56\x4e\xbc\x80\xaf\x56\x77\xe7\xf3\xdd\xc5\x98\x2c\x52\x32\xb9\xdd\xd7\x4c\xa3\xbd\xd9\xa6\xcd\xf8\x83\x91\x76\xff\x0c\xc3\x97\xb3\xcb\x10\xcd\xd2\x58\x7d\x8a\x4f\x61\x24\x1f\xde\x31\xef\x6d\x45\x4e\xf4\x76\xb9\xfb\x3b\xa3\xc0\xa8\x93\xd4\xc1\xba\x8d\x67\xdd\x1a\x5e\xc0\xb3\x93\x6c\xeb\x37\x51\xd3\x44\x4f\x53\x88\x93\x55\xdb\x4e\xd0\x93\x55\xef\x43\xf2\xae\x08\x2c\xc3\x30\xa0\xea\xfd\xd0\x9b\x15\x49\xce\x1a\x69\x41\x84\x25\xa2\x06\xeb\x1a\xd4\x74\x7f\x6e\x55\x74\x67\xdf\x08\x67\xd6\x8f\x66\xc6\xb6\xaa\xbb\xfe\xff\x98\x5f\x15\x2f\xd9\x78\xe9\x60\xd9\x46\xf8\xb4\x84\x33\x93\x54\xeb\x37\x51\xd3\x74\x87\xae\x28\xd2\x64\xd9\xb6\x13\xec\x64\xd9\xfb\x90\x94\xa6\xb9\x12\x30\xbd\xf9\x69\xde\x0f\xb3\x59\x97\x25\xca\xa4\x04\x09\x96\x89\x12\x6c\xa8\xd0\x54\xe3\xf4\xf6\xe9\xfa\xe2\xda\xee\x32\x7e\xe7\xcf\x3a\xe5\xdc\xf6\xa7\x3a\xd6\xad\x95\xc7\xcc\xd7\x39\x43\x11\x79\x86\x72\x28\xee\x42\x59\xcf\xf6\xbd\x1c\xb1\x33\xd1\x79\x9b\x85\x7c\xb2\xd6\x89\xdd\xe4\x68\x86\xdc\xd9\xaa\x05\x67\xb6\x7c\xc1\x01\x7f\x3d\x10\x39\x93\x42\xe7\x1a\x7b\xd1\x9d\xa6\xfd\x5f\x89\xf1\x51\x38\x9f\xf0\x0c\x33\xdc\x7b\xc1\xfb\xbe\x17\xf1\x1d\xfb\xb1\xa8\xa8\xde\xb3\x75\x52\xa7\xff\xd3\xef\xff\xa5\x37\x22\xe3\x3f\x11\xb6\x2f\xdd\xf5\xc3\xd1\xe4\xe2\xcf\xf0\x2d\xff\x01\xef\x7f\x67\xe3\x38\xe5\xe9\x71\x89\x6d\xe3\x5e\xb4\x77\x76\x31\x88\x87\x4f\xe8\x94\x13\x88\xe7\x83\x93\xee\xe7\x7a\xc2\xf9\x5a\x11\x39\xfe\xef\x31\xb9\xaf\xb7\xf6\xc9\xf6\x4f\x46\xe8\x61\xb5\xe9\xb1\xef\xd8\xd8\x33\xc2\xfe\x07\xce\x88\xd1\x29\x7c\x3f\x8b\x8d\xd0\x49\x68\xb7\xef\xd8\xd5\x1d\x93\xe5\x8f\xc0\xb0\x6e\xf3\xdc\x3e\x27\x26\x2f\xc2\xe7\xbe\xb2\x38\xb6\xce\x7a\x0b\x13\x6c\x5f\xd3\x49\x0b\x7f\x9c\x2d\x1f\x8e\xac\x0f\xca\xb9\xba\x15\xd5\x4c\xdb\xf0\x76\x37\xfc\x95\x21\xb7\x5f\xd5\xa9\x17\xfd\xe7\x5a\xf5\x40\xc6\x8a\xfe\x39\x18\x76\x1c\x36\x0f\x1b\xc1\x96\x62\x17\x61\x97\xa2\xfc\xd3\xc9\xb9\xa3\xad\x0a\xca\xad\x34\xd4\x0b\x83\xa2\xc9\xf3\x86\x3d\xdc\x91\xe9\x01\x61\x46\x72\x9c\x1c\x9c\x93\x1b\x21\x66\x84\x1f\x25\x03\xd6\x61\x01\xa4\x2b\x34\xa3\xeb\x92\x49\xd3\xd0\x86\x22\x53\x2d\x99\x4e\xb6\x6a\x9a\x4a\xde\x54\xa5\xa6\x61\x97\x8c\x7c\x32\x6d\xa7\x69\x96\x49\x1b\x59\x49\xd3\x44\x47\x51\x25\x95\xb6\x04\xc1\x6d\x58\x16\xca\x29\x94\x76\x1b\xc9\x1a\x0b\xeb\x45\x86\x65\x59\xce\x2a\xf0\x02\x27\xb0\x9a\x6a\xd3\x94\xa6\x57\x18\x47\x4b\x67\x85\x6a\xb3\xe8\x5a\x50\x53\x81\x8a\x53\x04\x7b\xb0\xc4\x52\x52\x85\x83\x35\x4d\x50\x89\x74\xb3\x2e\xc9\xde\xa6\x57\x61\x9e\x28\xc3\x86\x0e\x75\x1d\x0b\xf2\xa7\xa0\xf3\x4f\x7f\x2f\x59\x27\x74\xc3\x12\x14\xb9\xfd\x9a\xee\x6b\x62\xcd\x9f\xa1\x3d\x2a\xc3\x8d\x96\xfe\xa4\xc8\x8d\xb3\x63\xfe\xb6\x90\x77\x5e\xf8\xa0\x53\xd6\x04\x38\x76\x25\xd6\xde\x47\x88\x67\xd7\xa1\xf8\xc9\x75\x37\x77\xda\x35\x01\x16\x8f\xca\x8e\x22\xca\x5b\xf5\x08\xd3\x69\x07\x39\x6d\x1e\x0c\x73\xe0\x8a\x61\x3e\x53\x34\x8e\xf3\xed\x18\x1d\x42\x7d\xee\x1c\xd9\xc9\xcb\x7e\xfb\xfe\x07\x3b\xc7\x9f\xb8\x75\x9a\x2e\x93\xdb\xef\xb5\x6f\x4d\x37\x3c\x4c\x91\xce\x9b\x9d\x32\x74\xef\x44\x1b\x87\x63\x69\x4c\x99\x3a\x2f\xf5\x6f\xa4\x86\x65\xb0\x63\x10\x2a\x38\x0d\x3b\x17\x71\x2e\xc2\x62\x91\x63\x53\x94\x70\x6b\xd8\x4f\xbe\xd4\x8b\x5c\x3d\xa3\x7e\x72\x8c\xb6\x97\xa0\x7f\xa6\xf4\x29\x89\xc7\x6e\xba\xe4\xda\x9d\x37\x2d\x5f\xfe\xc2\x43\x4b\x57\xde\xbb\x72\xe5\xd2\xb1\x87\xee\x75\x57\x8d\xe1\x1f\x8c\x4d\xfe\xf3\x08\xc3\xac\xc9\xd5\x93\x92\xc5\x43\x7c\x72\x99\x25\xca\xb2\x44\xcb\x32\xdb\x7b\xc7\x3d\xcb\x96\xcf\x7e\x68\xd9\x25\x93\xbf\x78\xf6\xd9\xc4\x49\x93\xbf\xf0\x3e\x49\x51\xb8\x6c\xd9\xaa\x9b\x2e\x3b\x67\xf9\xf0\x4d\x27\x09\xfc\xf0\x95\x67\x0a\x82\x00\x47\xc0\x8f\xdc\xaf\x12\xf7\x0a\xb0\x58\xd2\xcb\xfa\xa3\x8f\xba\xa6\x26\x51\x76\x56\xfe\xb3\x7b\xf6\x75\xd7\x52\xeb\x8e\xbc\x74\x14\xfe\x81\x58\xf3\xbf\x2b\xe0\xb6\x3b\xda\xba\x3e\xdc\xbb\xce\x17\x3a\x65\xd5\x8e\x8f\x4e\xd3\x3d\x6d\xf9\x49\xae\x9b\xdf\xcd\x1e\xa1\x72\xdb\xd1\x6d\xd8\xe7\xbe\x11\x59\x83\xd0\xb6\x99\x68\xc9\x19\x23\xe4\x95\xdf\xa2\x3c\xc7\xbf\x41\x3f\xff\x03\xad\xc7\xaf\x43\xbe\x0c\xf2\x5d\xef\xf1\xb3\xe3\xb4\x6a\x4b\xf2\xa1\x0c\x94\x10\x86\xee\x89\xf9\x73\xe5\x4c\x6e\x02\xdd\x2b\x9a\xf8\x5a\x44\xa6\x15\x50\xfb\x16\xb4\x7f\x4e\x8e\xcc\x5b\x6f\xf3\xe5\xc4\x6b\x9d\x32\xdf\x97\x75\x61\xbe\xe3\xcb\xfc\x1a\x7f\xd4\x8a\xfc\x29\xf8\xe4\xe2\xe3\xf9\xf9\x19\x72\x67\x34\x17\x32\xf2\x71\xef\xaf\x20\x9e\x7d\x3b\xc6\xb3\x1e\x96\xdd\x32\xcd\xe6\x8b\x60\xd9\x89\x78\x8d\x0c\xbd\xa5\x57\x9c\x0f\x75\xdf\x5b\xeb\x16\x07\x3c\x1b\xd4\xd2\xc5\x3e\x8a\x0d\x20\x1b\x6e\x3e\x36\x82\x9d\x85\x9d\xe3\xe1\x59\x32\x75\x14\x96\x4c\xe5\x86\x3a\x59\x31\x35\x84\xa5\x06\x72\x04\x1e\x71\x3b\x78\x26\x46\xbb\x8a\xd0\x29\x7e\x0b\x51\xb0\xd3\x59\x13\x58\x40\x10\x0c\xcd\xb3\xe9\x68\x47\x92\x9a\x92\x55\x92\x09\xae\x81\xd7\x1a\xa6\x06\x2d\xc2\x69\x4a\xde\x27\x51\xe6\x6b\xb0\xce\x01\x6a\x92\xae\x56\xc5\x6a\x2d\x61\x36\x1a\x52\x7d\x0a\x73\xed\x6c\x05\xd6\x59\x90\x25\x35\x59\x6e\xc0\xb2\x62\xb1\x9c\x8b\xf9\x10\xc9\x80\x36\x61\x89\x06\xc0\x6c\x07\x60\x53\x18\x64\x6c\x28\x58\x09\xcb\x10\x69\x83\x61\x68\x51\x17\x59\x83\x37\x4c\x5b\xe0\x35\x91\x33\x39\x8c\xc4\x2e\x98\x9a\x95\xfa\x3c\x79\x35\xca\x81\x71\x56\x90\x51\x05\x03\xed\x00\xd7\x85\xe8\x8a\xf9\xc2\xd1\xc1\x6e\x6d\xf3\xba\xf5\x9b\x69\x97\xe2\x02\xf1\xdc\x8d\xcf\x5c\x72\xfb\xec\x7b\x3e\xb1\x68\x36\x05\x3f\xb3\x10\xbe\xb5\xfc\x9f\xa7\xfe\x27\x5c\x42\xac\xb8\xee\xc9\x0b\x57\x1c\xb7\xf2\xf2\x33\x8f\xff\x08\x7c\x66\x01\x7c\x57\xfa\xd3\xc9\x3f\x27\x5e\x22\xae\xbf\xf6\x49\x61\xc5\x71\x2b\xc5\x33\x8f\x3b\x12\x3e\x3b\x0c\xff\xeb\xaa\xff\x3e\xf9\x2d\xfc\xe4\xfb\xb5\x3b\x8d\xa1\xaf\x5c\xa7\x34\x13\x5f\xfa\x12\xd1\x6c\x26\xbc\x0f\x79\x35\x5c\xf7\x14\x79\xff\x11\xd7\xbc\x06\xdf\xbf\x5f\x5d\xfe\x3a\xbc\x16\x3e\xeb\xfd\xf7\xf2\xd7\xe0\x9f\xee\x57\x97\x17\x1f\x82\xe3\xcf\x92\x0f\x7e\xe4\xba\xaf\xc3\x3f\x3c\xb0\xea\xda\x6f\xc3\x27\xdc\x4f\x5c\x2a\xcc\xba\x77\xd6\x59\x9f\x82\xff\x47\x9c\xf3\xa7\x7b\xe1\x9e\x3b\xda\xf8\xc3\xca\xe4\x76\x1e\x8d\xf2\x47\xfc\x77\x77\xdf\x83\xb3\x39\x26\x0b\xc3\x7d\xb8\xe3\xcc\x58\xbb\x11\xf2\xe1\xb1\x31\x19\x19\xb6\xef\x38\xa3\x13\xef\xf9\x18\x6a\xd7\x5d\x08\x61\xdd\xd1\xcd\x66\xd9\x21\xc5\xb0\x5d\xdb\x0e\xc3\x22\x7a\x07\xc9\x9f\xdd\x95\x69\x7a\xa7\x88\xf6\x0c\xea\xbf\xfb\x86\xee\x36\xd1\x86\x8f\x44\xb0\xc6\xa7\xc9\x07\x10\xfe\x9f\x8d\x0d\x62\x0c\x8a\x92\x09\x63\x61\x7b\x06\xe2\xfe\x5b\x9c\x18\xca\x1c\x0d\x7a\x83\x48\xa8\x3e\x10\x0b\x92\x5e\xd8\xeb\xe7\x86\x18\xf4\x39\xc4\x93\xf8\x29\x61\x97\xfb\xfd\x97\x5f\xc6\xcf\x70\xbf\x0f\x77\xcb\x12\x2f\x31\x32\xcf\xc1\x06\xa5\x5a\xba\xed\x31\xae\xf7\x21\x88\x67\x66\xe7\xf0\x4d\x37\x3d\xba\xf8\x13\xb3\x97\x5f\x30\x3f\x97\x5e\xb8\x05\xae\x5b\x09\x16\xef\x78\xe6\x49\x78\x70\x65\x6d\xe5\xf2\xe5\xb7\xdf\xf4\x2b\x7c\x91\x4b\xdd\x7e\x3b\x5e\x87\x09\x70\x4f\xe2\x99\x83\x35\x45\x49\x5b\x94\x0a\x4a\x50\x83\x8e\x04\xf2\xa0\x41\x60\x90\x05\x7c\xb3\x01\xf8\x32\x21\x1d\x77\xd1\x45\xee\xcb\xbf\x3d\x72\xec\xc8\x87\xc1\x2e\x78\x05\xfc\xbd\xfc\x3f\x40\x83\x6f\x16\xe5\x89\x3f\xdc\x79\xd1\xd5\x13\x58\x34\x3e\x24\xf0\x6d\x7c\xb1\xbb\x6d\x67\x31\x11\xd9\xa2\x85\x98\x35\xb7\xef\x31\x24\x55\xef\x8f\xcb\xfc\x6d\xf7\x45\x7c\x98\x1f\x42\xed\x8f\x86\xb9\xc5\xfc\xc8\xb2\xe3\xb0\x01\x14\x63\xb3\xb8\x9d\x89\x06\x65\x87\x0a\x6e\x22\x23\x7b\xab\x7d\xbf\xe5\x5f\xd1\x9e\xf8\xaa\x65\xe1\x3f\xb0\xed\x66\x29\xc1\x4d\x96\xc0\x37\xf5\xac\xa2\xcb\xf0\xa7\x84\xda\x34\xb7\xe2\x43\xee\xaf\x5a\x1f\xb8\x7f\x06\xba\x83\xd7\x5c\x0b\xbf\xd9\xb5\xc8\xdf\x58\xa7\xd1\x8e\x26\x2a\x0f\x1d\xaa\x11\x66\xdd\x35\xea\xae\x5d\x49\xce\xff\xd7\x34\x8e\x63\xab\x53\xa7\x61\x8a\x88\xae\x5b\x7f\x5e\x6c\x5f\x28\xad\xf6\x17\x1f\x8d\xd0\x16\xc5\x43\x78\xb4\xcd\x90\xce\x2f\x63\xed\x6a\x4b\x9e\xaf\xbb\x3b\xd6\x1e\xca\xf9\xed\xad\xb8\x0b\xa1\x75\x37\xec\x15\x74\x27\x70\xfc\xbe\xd8\x73\x85\x4c\x6e\xfd\xa2\x0e\x3d\xd2\xaa\x17\x85\xe6\xf3\xf2\x6d\x68\xdd\x0e\xc7\x6e\x0e\xee\x37\x10\x81\xe7\x79\x31\x76\x3e\x76\x11\x76\x2d\xf6\x69\x6c\x85\x27\x33\xfb\x06\x46\x07\x72\x23\xc3\xbd\x03\x7d\x03\x99\xde\xa3\xc2\xcb\xfb\x43\x38\x11\xa4\x79\xf0\x7f\xf6\x0f\xf7\xcc\x1a\xf6\x56\xce\xef\x70\x12\x98\x33\xd4\x51\x4c\x9b\x88\x2e\xef\x60\xb0\xbc\xc1\xe9\x37\xfe\x5e\x82\x99\xac\xac\xc1\xe9\xb4\x95\x06\x1c\x2c\x51\x32\x9b\xcd\x52\x56\x56\xe4\x15\xde\x64\xdc\x0a\x21\xf1\x8c\xce\x70\x6e\xd1\x36\x14\xcd\x16\x0c\x2a\x4d\x0b\x59\xca\xa4\x44\x9b\x61\xb3\x0c\x03\x58\x89\x53\x59\x09\x1a\x7a\x56\xd4\x45\xf5\xb2\xab\xd8\x65\x43\x97\xcd\xe7\x7e\xd7\x7f\xd9\xe7\x57\xac\xfd\xe5\x2f\x7f\xf9\xcb\x64\x9f\xf5\x4c\xbe\x08\x4d\xd3\x2d\x43\xbd\xaa\x69\x5c\x55\xcf\x03\x95\xc8\x82\xb2\xac\xf2\xaa\x02\xd3\x8a\xa9\x9a\x6a\xdd\xcd\xf3\xe9\x34\x63\xf0\x25\x36\x2d\xf0\xb8\x60\x39\xbc\x63\xb2\x74\xbd\xcc\x97\x13\xce\xc1\xaa\x22\xa7\xcd\xb4\x0c\xca\x50\x84\x65\x11\xe4\xf1\x34\x81\x41\x0e\x70\xcd\x06\xe0\xb0\xe0\xde\x6b\x34\xa7\x46\x1b\x3b\x9c\x9a\xfa\x06\x79\x6d\x80\x11\x52\x5b\x7e\x8e\x7f\x63\xea\x8f\xe1\x19\xad\x91\xc9\xed\xf1\x73\xcd\xdf\x1b\xe1\xa7\x2f\x90\x6b\x3c\xec\x90\xc0\x16\x9d\xc2\x63\xd4\xd2\x8d\xdf\xb8\x30\xb9\xe8\xdc\x25\x6f\x76\xf3\x23\x6e\x2b\x74\xda\x93\x81\xbd\x7f\x6e\x77\x7b\x72\x9d\x13\xe1\x13\xa3\xed\x53\xdb\xbe\x3a\x36\x8e\x19\xe2\x07\x10\x93\xa9\x42\x26\xb7\x3d\xdb\x05\x9f\xb4\xe7\x13\xad\x71\x92\x47\x39\x71\x11\xdf\x8e\xdf\x83\x45\x7d\xe4\x52\x6b\xfc\x3d\xb7\x74\xc3\xe0\x19\x72\x03\xd5\xf9\x5c\xbf\x3d\xbf\x2c\xe6\xc7\x6a\xdb\xc9\xeb\x63\xfe\x84\x96\x1d\x9b\x7b\xf2\x64\xe4\xb5\x60\xe3\xbe\x0c\xff\xd9\x2f\x9c\x8f\x75\xf8\xe7\x2d\x6d\x1a\x8e\x8d\xc8\xc7\xf5\x9f\xec\x86\x6f\x33\xa4\x75\x6f\x8c\xa6\xe1\x5c\xb7\x4d\x75\x62\x32\x7f\xae\x5b\xed\x4e\xfb\x22\xf0\x01\x9c\x16\xc3\x76\x5a\x26\xf7\xfc\x03\x31\x9d\xad\xa0\x1a\xb1\x5a\x4b\x76\x6c\xed\xe9\x66\xf7\x65\xc8\x89\x28\x16\x2c\xb4\xe7\xf3\xec\xfb\xdd\x31\xe2\xf3\xd3\x62\x9b\x82\xf7\x5d\xd6\xf9\xbe\x5b\xcf\xef\x38\xcf\x8a\xc9\x94\xad\x8f\xc7\xe8\x19\xea\xe5\x57\x6f\xef\x6e\x9f\xbe\xd4\xba\xc7\x79\xe2\x14\x9f\xda\x44\x6a\xd4\x8a\xbc\xf4\x67\x6c\xf1\x1b\x1e\xcf\xef\x3b\xbb\x0f\x5b\xfc\x13\xbe\xab\x8f\x23\x8c\x11\xef\xf0\xa1\xac\x3f\xbb\xbb\xaf\xe1\xc5\xd2\x34\x8c\xed\xcf\xb7\x85\x61\x0a\x68\xdd\xf8\x4c\xce\x43\xe3\x14\xb9\x8e\xee\xe4\xe1\x03\xe8\xce\x71\x0c\x3b\xa1\x78\xc7\xed\x28\xde\x7b\x7c\x55\xcc\xde\xd0\x7d\x7b\x83\x22\xb7\xce\x89\xd9\x0f\x42\x26\xb7\xf5\xbe\x2e\xba\x23\x9c\xff\xcb\xff\xdd\xd9\xee\xc7\xec\x85\xfd\xc3\xfc\x2f\xfe\x9e\xda\x72\x4c\x37\x3f\x41\x86\xdc\x86\x6a\x1f\x61\x87\xa1\xf6\xb7\x48\x2d\xe2\xef\x9c\x87\x22\x5e\xcf\x0d\x63\x15\x06\x7a\x87\x47\x06\x07\xfa\x86\x47\x40\xeb\xdf\x7e\xa8\xf0\x60\x0f\x42\xbe\xff\x5a\x27\x7f\x0f\xdc\xff\x34\xb8\xbf\xa9\x6f\xfc\xcd\x6f\xc0\x1d\x3f\x77\xbf\xe9\xff\x6b\x3b\x7c\x37\xb1\x0d\xfe\xfd\x69\x38\x71\x24\x7c\x77\x65\x03\xfe\x62\x06\x8d\x9c\xfc\xc6\xd7\xbe\xe6\x0e\x81\xbd\x96\x65\xc1\x65\x1b\x36\x6c\x70\x6f\x7a\xe1\x05\xf7\x20\x9e\x82\x63\x2f\x3f\xf1\x64\xf2\x57\xff\x2f\x1a\x39\x2e\x03\x82\xfd\xc6\xcf\xb0\xce\xff\x11\xe3\xef\x76\xfb\x4d\x31\x1d\x1b\xca\xaa\x57\xdb\xf6\x3f\x1b\xe5\xef\xcd\xad\xfd\xcc\x4e\xf1\xa9\xb2\x2f\x7b\xaa\x58\x86\xdc\x42\x33\x5d\xf7\xcf\xe6\xfb\xbb\xaf\x73\xbe\xd4\x7d\x3d\xd7\x15\x62\xfe\x9a\x50\xb6\x6d\xf9\x7e\xa7\xcc\x0b\xf8\xe5\x3b\x21\x3e\x0e\xee\x2b\xe4\x4f\xa1\xbd\xfd\x59\xef\xc4\xec\x81\x7c\x59\xd8\xdd\xdf\xb1\xed\xd2\xd8\x73\xc3\xf9\xe7\x97\x77\xdf\x4f\x13\x51\x9c\x68\xb5\xe5\xd1\x2b\xdb\xbb\xe3\xca\xcd\xf9\x58\x7f\xa1\xd5\xff\xe5\x93\xbb\xeb\x90\x2d\x7f\xe9\xe6\x87\xca\x90\x9b\x87\x62\xed\x62\x68\x8b\xfc\xb2\x9b\xbc\x8b\xd4\x01\x11\x5b\xf7\xdc\x83\xf1\x4b\x11\xf9\x85\x74\xe3\xc4\xdb\x31\x9d\xc6\x87\x3a\x16\xed\xe3\x75\xf7\xc5\xc6\x09\xc7\xdf\xbc\x20\xd2\x1f\xe5\x02\x40\xfd\x03\xbc\x3c\xf1\x56\x44\x16\x86\x6b\xbf\x21\x15\x79\xf6\x2f\xc2\xb1\x96\xed\x5b\x88\x7d\x7f\xea\xef\x67\xee\xe3\x9f\x8a\xe6\x02\xf4\xf1\xf7\x66\xe4\xd5\x98\x78\x3d\xa2\x3f\xbd\xef\xd9\x5d\xf0\x5d\xc8\x33\x2f\x1f\x13\x93\x55\x6d\x19\x33\xb7\x9b\xef\x82\x22\x37\x67\x63\x6b\xa4\x67\x72\x5b\x94\x0e\x99\x17\xe0\x08\x7f\x9c\x2d\xfd\xdd\xf4\x33\x15\xad\xd5\xd2\xf2\x9d\xf9\xfa\xff\xee\x08\xad\xf2\x6d\x5a\x39\x28\xe3\xc7\xae\x3d\x11\x39\x19\xf2\xab\x5d\x8f\xf8\x53\x1c\x52\xf7\x31\xd1\xd9\x07\x78\x2c\x43\xbe\xf4\x78\xc4\x97\x83\xf4\xbd\x03\xd0\x78\x28\x96\xdd\xe9\x3a\xb7\x4d\x8b\x3a\xf5\xab\xcf\x87\xeb\x2e\x8c\xcd\xd9\x68\xb5\x6f\xfa\x74\xec\xdd\xd5\x50\xcf\x9c\xd5\x75\x7f\xe5\x36\xa3\x2a\xf9\x9b\xa6\xe2\x32\x3f\x78\xf6\x5d\xdd\xf7\xc6\xa6\x33\xba\xc9\xf0\x48\x9d\x15\xad\xe5\x7b\xda\x7a\xde\xb4\xfa\x09\x62\xab\x26\xb6\x3f\xd6\x73\xdf\xed\x6e\x93\x6c\xb8\x21\x62\x33\x04\x6b\xde\xf0\x68\xb8\x8e\xea\xf4\x49\x6d\x47\xfb\xa6\x5d\x87\xeb\x22\x8f\xb6\xd4\x8a\x5d\xf3\x1a\xc7\xf2\x3b\x2e\xb8\xcf\xa7\x72\x86\xf4\xa8\x1c\xe2\xa3\x90\xb7\xc2\x5a\x29\xa1\x7c\xd9\x9c\xe9\x38\x67\x8d\xc9\xa3\x17\x99\x6e\x76\x7c\x86\x7c\xfe\xb3\x74\x7b\x5e\x7e\x5d\x85\xa7\x62\xbc\x18\xee\xcf\xe7\x7e\x87\xf0\x88\xd4\x49\x5b\xeb\xa5\x69\x18\x35\xb2\x6f\xf7\xae\xee\x94\xfb\x3b\xae\x6b\x8f\x8f\x1d\x86\x7c\x65\x3a\x69\x60\xf3\xb1\x61\x94\xb7\x70\x09\x76\x1e\xca\xc9\x7b\x8d\x67\xc7\x06\x11\x91\x7e\xf2\xac\xbe\xb9\xa3\xfd\x28\xcb\x75\xe4\x62\x71\x72\x68\xde\x08\x8a\x8c\xc8\x1c\x0d\x62\x19\x8f\x93\xc1\xbf\xe3\x3e\xdf\xe0\xce\x72\xdf\xc0\xc8\x00\x21\xd8\x04\xd5\xac\x13\x16\x2b\xc8\x74\xd6\x4d\x03\xae\x4e\xb9\x25\xc1\x06\xac\x44\x19\xb4\x0e\x75\x58\xd7\xa0\x9d\x05\x1a\x94\x0a\x46\x1e\xe7\x60\x21\x99\x3d\x54\x33\x41\x01\x0a\x38\x0f\xf2\x4d\xaa\xf5\x9b\x2a\x4b\x82\x9c\xd5\x78\xb6\x29\x19\x46\xcb\xf5\x46\x1a\x9c\x22\xa8\x92\x20\x30\x8c\x94\xcd\x2a\x6c\x3a\x4b\xd1\x02\xa3\xf0\x2c\x9f\xcd\x6a\x94\xec\xda\x30\x0d\x35\x11\xe8\xa0\x8c\x17\x20\x06\x25\x80\xf1\x3c\x5f\xe1\x79\xbe\x06\x29\x81\xa7\x94\x34\x9b\x2d\xe0\x5a\x9e\xaf\xf1\xd3\x64\x3f\x45\xee\x95\xbb\xeb\xb4\x7d\x5f\x8c\xc9\xe6\xf6\x39\xf2\x5d\xdd\x79\x75\xe3\x99\xdd\x31\xea\xfa\xf3\x63\xe3\x84\x76\xb5\x5f\x0f\x07\x3b\x1c\xb5\x3f\x47\x6a\x28\x47\xdd\x49\xe1\xca\x5d\x86\xaa\xe8\x62\xb1\x78\x88\x3e\x3f\xdf\x9c\x9f\xfe\x6c\x10\x65\x99\x8c\x06\x54\xf5\xfe\x2b\xbf\x44\xc4\x70\x25\x86\x7b\x06\xfb\x66\x11\xe3\xe0\xf2\xf9\x43\xe3\xcc\x10\xd8\x0e\x4f\x9f\x3d\x84\xaf\x81\x7f\xbb\xe9\xeb\x4b\xdf\x7d\x11\xfe\xf1\xde\x1f\xdd\x31\xbe\xe2\xc7\xe0\xc4\xa1\xf9\xf0\x77\xf8\x3f\x1f\xbe\xf2\xca\x9b\xae\x74\xbf\xb3\x62\xc9\x63\xa3\x2b\x0e\x27\xae\x6d\x6e\xfe\x3c\x7e\xb9\xfb\x4a\xeb\x03\x7f\x24\xcb\xac\xc8\x48\x2c\x5f\xcb\xca\x96\x66\x57\xab\xe9\x5a\x35\x79\xb8\xfd\xd3\xd9\xdf\x7c\xea\xf1\x1b\x2f\x7e\xfc\x91\x8b\x1f\xbf\xf5\x2f\xaf\xdb\x77\xaf\x7a\xf0\xf1\x0b\x6e\x03\x95\xf3\x37\x5c\x71\xcd\x0d\xb7\xdd\xb0\xea\xe2\xbb\x6f\x6c\x7e\xbf\x69\xe2\xaa\x06\x4d\x0d\x5a\x5a\xf2\xfd\x08\x6a\x92\x60\x49\x02\x0e\x8e\x45\x50\x13\x3f\xdd\x17\x14\xde\x55\xec\x90\x65\x0e\xca\x3c\xe9\x7c\x2f\xe2\x0f\x0a\xf1\xd1\x0e\x3f\x9f\x3c\x11\xc8\x72\x05\x3b\x13\xbb\x1a\x33\x30\x0c\xf4\x90\x29\x72\x68\xf4\xa8\xe1\xd3\x97\x80\x41\x3c\x35\xb4\xf0\x68\x30\x30\x34\x3c\xab\x7f\x78\x68\x14\x55\x2b\x6e\x25\x81\x3c\x1d\x25\x84\x1f\x0a\x8f\x49\x06\xfa\x06\x40\xf4\x5a\x30\x5a\x86\xbe\xc1\x91\x56\x7e\xba\x91\x01\xd0\x1f\x86\xb1\xf8\xa7\x2b\x73\xfd\xa4\xe3\x41\x7e\x5a\x3f\x9c\x12\xf5\x46\x61\x96\x49\x31\x2b\x69\x7c\x9a\x11\x98\x74\xda\xa2\x4d\xd5\x06\x76\xda\x4c\x3b\xbc\xc2\x73\x1a\x94\xb2\x9c\xc4\x4b\xa2\x22\xf1\x59\x35\xcb\xb0\x9c\x68\x88\x96\xa0\xab\x3c\x07\x4b\x80\x9a\x94\x40\xd6\x44\x65\x21\x78\x58\xb4\x55\x59\x50\x4c\x2d\x2f\x55\x35\x58\x05\x02\xac\x11\x8a\x4e\xe3\x8a\xa2\xf0\x62\x96\xb5\x6b\x56\x85\x03\x9c\xa6\x67\xb3\x15\x5b\x62\x39\xb7\x42\x81\x6c\x49\x2c\xc1\xaa\x59\xe6\x0a\x16\x14\x6c\xbc\xc4\x24\x24\x58\x17\xb2\x34\xa7\x32\x4c\x79\x0a\xb3\x35\x13\x50\x80\xd6\x79\x5e\x10\x78\x51\xb3\x4c\x45\x15\x4c\xd5\x2c\xb2\x0e\xcf\xa7\xa9\x82\x2c\x8b\xa2\xee\xd4\x1c\x40\x99\xa6\x6e\xe8\xb4\x2c\xca\x22\x5b\xa9\x58\xb2\xa9\xe4\x75\xc3\x15\x18\xde\xad\xca\x72\xda\xdb\xc3\x9a\xa0\x2a\x05\x86\xa1\x45\x39\x2d\x02\x8d\x92\x54\x55\x97\x75\x51\x15\x74\xd7\xc2\x6b\x6c\x44\xf7\x85\x3a\xeb\xf9\xc9\x60\x9d\xc3\x3c\x17\xaf\x9e\x13\xf3\x53\xf0\xe1\xd9\x1b\xd2\xcb\xbb\x91\x17\x63\x5c\x8d\xe8\xc5\x70\x4f\x3f\xf7\x68\x0c\x0f\x85\x7b\x74\xfc\xce\x98\x1e\x0d\xfb\x47\xea\x4c\xf1\xbe\x9c\xf7\xdb\xd7\x9f\x19\x3e\x9b\x6b\xe3\xad\x0c\xf9\x12\x17\x1b\x47\xcd\xe4\xec\x9b\x63\xf2\xdf\x97\x31\x52\x4b\x4f\xbf\xfa\x56\x77\xdd\xba\xef\xad\x18\xe6\x08\xf1\xdc\xfe\x95\x33\xd8\x89\xdf\x89\x8d\x13\xbe\x57\xa4\x1e\x56\xa0\x3f\xd7\x7f\x79\xda\x7c\x22\xef\x3b\xde\xaa\x25\x44\xb7\x7c\x74\x79\xa9\x8a\x65\x72\xa6\xca\x7a\x56\xca\xe9\x2c\x16\xde\x25\x36\x32\xb9\x75\xa8\x7e\xc4\x7a\x74\x43\x61\xdd\x15\x11\xbd\xd4\xc2\x4e\xb9\xbd\x7e\x1d\xad\x95\x21\xcd\x23\x71\x06\x2f\x6d\x88\xd9\x98\x6d\x9b\xf4\xf6\x98\x8e\xb3\x5a\x73\xdb\xf6\xbd\x08\x4d\x9c\x10\x87\x91\xe3\xb7\xc5\xf0\x5f\x78\x6f\x21\x86\xff\x10\xd6\xd8\x78\x51\x4c\xb7\x2a\xad\xb5\xf3\xc7\xb7\xae\x0f\xb1\x86\x27\x4f\x5a\x67\x6c\xad\xda\x4e\xb7\x4e\xc7\x59\x14\xb9\x3e\x7a\x67\xc2\xaf\x73\x84\x90\xd4\xfa\xaf\xc5\xf4\x7d\x68\x57\xaf\x1f\x8d\xbd\x5b\x9b\x2f\x57\x47\xfa\x1b\xed\x77\x9b\x28\x46\xfa\x17\x22\xcf\x5d\x18\x69\xd7\xdb\xe3\x6c\x78\x39\x46\xd3\x70\x0f\x6d\xf8\x78\x4c\x07\x85\xb9\x20\x63\x38\xa3\xe8\xad\x77\x80\x85\x1f\x8e\xe0\x2e\x44\x8b\x5d\x43\x18\x96\xc9\x79\x54\xc8\x90\x1e\x45\xa6\xbd\x43\xee\x39\x74\x7b\x78\xfc\x96\x6e\x76\xec\x8e\x6d\x31\xbf\x51\x68\x17\xad\x5f\x1e\xb1\x01\x10\x4f\xbd\x7a\x45\xc7\x1a\xc5\x7c\xc8\xdb\x1e\x8a\xb4\x1b\x2d\x5f\x74\x24\x17\x65\x87\x9f\x6c\xcb\x23\xdd\xf7\xd1\x78\x2b\xff\x01\x87\xec\x28\x29\x93\x5b\xfb\x07\x6f\x3e\xfb\xef\x8c\xf4\x37\x23\xeb\xe6\xdf\x37\x49\xa3\x73\xd6\xef\x90\x52\x18\x23\xe6\xd7\x9b\xb8\xd6\x43\x57\x23\x83\x43\x03\x3d\x03\xc4\x40\xdf\x00\x31\xd0\x83\x4e\x0a\xfa\x86\xfb\x06\xd1\x07\x79\x1d\x46\x06\x47\x86\x83\x0f\xba\x93\xe0\x89\xfe\xa1\x9e\x59\x29\x32\x85\x54\xf4\x51\xed\x10\xc7\xd1\x81\x91\xe1\x9e\x85\xbd\x7d\x03\x1e\xc6\x1a\x20\x3c\xcd\x4f\x94\x54\x55\xf1\x24\x7b\x16\xa8\xd0\x64\x41\x19\xb2\xb0\xa6\xaa\x66\xb5\x5a\xad\x02\x1a\xaf\x82\x6c\xa5\x52\xa9\x94\x81\xa2\xc1\x53\x41\xfa\x1f\xd7\xac\x5a\xc7\x9c\x72\x1b\x65\xd2\x56\x96\x6f\x4a\xe6\xca\xd5\x22\x58\xf0\x43\x78\xb8\x9a\xb7\x7d\x48\xf5\x1e\xbc\xf2\x13\x0a\x71\x32\xf1\xde\xcf\x25\xf8\x08\xde\xfb\x6f\x6e\x13\x7f\xfe\xf6\x8f\x9f\x7a\xcc\xdd\x57\x6d\x95\xb6\xe2\xff\x70\x0f\xdf\x2a\xd9\x57\x6d\xbb\xc6\x3d\xfc\xd3\xaf\x7f\xe2\x9e\x91\x4f\xc2\x13\x94\x05\x0b\xd2\x69\x33\x9d\xb8\x27\x0b\x6b\xf8\x86\x33\x38\xf5\xde\x8d\x9f\xc6\xf7\x1d\x33\x09\x44\xb1\x24\x01\xf9\x82\xf3\xa6\xe3\xaa\xf1\x9b\x23\x6b\x8b\xee\xee\xbc\x7a\x7e\x87\xad\xca\x45\xf7\xc6\xf3\xdb\xbb\x63\xed\xbd\x67\xc6\x6c\x9f\x50\x97\xaf\x5f\xd0\x5d\x06\xaf\x7b\x23\x62\x5f\x21\xf9\xf1\xaa\x9f\xc7\x74\x45\x4c\x46\x86\x7e\xdc\xf5\xa7\x45\xd6\xbc\x14\xe1\x91\xf6\xbd\x58\x6f\x8f\x59\xfe\x1e\xa0\xc8\x5d\xb9\xa0\x5d\x6f\xf9\x6b\x77\xcd\x43\xfd\x6f\x8c\xcc\x07\xf1\xec\x2e\x94\xcb\xd1\xc7\xf8\x58\x02\x6b\x4c\xd9\x29\x91\x64\x42\x8f\x16\x36\xaf\x5d\xe6\x0f\xf1\x4c\xb2\x67\xa0\x07\xf4\x0c\xf4\x24\x34\xbc\x72\xd0\x21\x79\x97\xc3\x25\x37\xef\xb8\x25\x9c\x73\x4b\x09\x73\x52\xc5\x79\xce\x22\x0d\x0b\x16\x5d\x89\xa8\xc1\xa2\x05\x0d\xa0\xb9\x75\x68\x02\x54\x8b\xde\x46\x3a\x8a\xc9\xe4\xf6\xe7\xb2\x58\x86\x7c\xa5\xc5\xfb\x36\xe2\x7d\x39\x93\xf3\x5a\x28\xf2\x95\xcf\x05\xbc\x6c\x4c\x99\x29\x9b\xcc\x86\xf3\x19\x6c\xdd\xa2\xf2\x70\xe4\x48\x70\xc0\x31\xd0\x33\x7c\xb4\x67\x09\xa4\x7a\x86\x7b\x40\x5f\xcb\x81\xe6\xcd\x73\x10\xb5\xf7\xf6\x0c\xf6\x18\x44\xba\xd9\x68\x54\xab\x0d\x60\xd6\x20\x0b\xca\xb5\x5a\xc2\x86\x05\xe4\x2d\xe3\x9b\x16\x30\x6a\xa0\x0e\xa9\x5a\x8d\xcc\x1e\xd4\x2c\xa0\xe1\x7e\x09\x1d\x11\xd2\xd0\x30\xbd\x37\x48\x68\x26\xcc\xbb\x0a\x34\x2c\xd2\x80\xb4\xf7\x47\xb7\x01\xb4\xa6\x0e\x34\x68\x60\x18\x89\x72\x85\xe4\x49\x0d\x9d\xfa\x2f\xc3\x3e\x86\x90\x31\x06\xfa\x06\x32\xfd\x0b\x7b\xfb\x71\x22\xe3\xc7\x51\x0d\xce\x21\x10\x8e\xc2\x09\xdf\x82\xe9\x45\x38\xae\x17\xe5\x13\xee\x19\xee\x19\xee\x19\x18\x1a\xee\xf7\xa3\xb2\x00\xf2\x1f\x7a\x7b\xb3\x67\x90\x18\xec\x1b\x4e\xa1\x5b\x4e\xc3\x23\x29\x0b\x2a\x59\x5a\xe6\x4d\xd9\x16\xf9\x2c\x95\x36\xb2\xb6\xa9\x58\x45\xbe\x6c\x0a\x74\xb3\x61\x98\x6a\x5a\xa5\x2c\x49\x49\x8b\x40\x84\x55\xd3\x24\x9c\xb4\x9d\x2e\x70\x8c\x4e\x73\x90\x72\x5c\x07\x37\x2a\xf9\xbc\x61\xdb\xb6\xf7\x0a\x76\xd2\x34\x21\x56\xae\x03\x9e\x85\x1c\x2c\xc1\x82\x61\xd2\x50\x06\x42\x49\x33\xf5\x3a\xe0\x70\xdd\x75\x60\x1a\xea\x12\x50\x00\x03\x19\x4b\xd3\x80\x6e\x56\x70\x01\xf2\xc0\xa8\xd5\x6a\xbc\x20\x08\xfc\xa1\x82\x9e\xc8\x1a\x79\xa8\xe0\x42\x5e\x73\x1c\x58\x2d\x95\xd0\x7a\x9a\x2d\xac\xb0\x6b\xdc\x93\xbb\xcf\xa3\xec\x23\xe3\x37\xa0\xb3\x4c\x3f\xe6\x9b\x9f\xb6\xa6\xe7\x63\x02\x26\x06\x2b\x3b\x30\x32\xd8\x13\xf8\x4c\x51\x3e\xe5\xbe\xe1\x11\x80\x4a\xb5\xa0\x34\xd6\x3d\x60\x64\x10\x95\x5c\xe9\x1d\x19\xec\x43\xd6\x47\x50\xbf\x65\x2e\x40\x19\x8d\x46\x07\x92\xe8\x40\x74\x16\x99\x1a\x5a\x0c\x0a\x04\xd6\xac\x81\x6c\xa9\xd8\x00\x66\x19\x2a\xc0\x2a\x95\x12\x34\xac\x97\x4b\x80\x69\x56\x81\x54\x00\x16\x54\x8a\xc5\xc9\x32\x6e\x70\xac\xcd\x12\x0a\xe4\x4b\x80\x93\xa0\x31\x85\x41\x7b\x0a\x83\x8c\x08\x84\x2a\x64\x12\x9c\x6d\xbb\x25\x47\xaf\x49\x79\x85\xe4\x9b\xb6\xae\x03\x59\xd7\xf5\x86\xaa\xe9\x3a\x2e\xeb\x3a\xb4\x75\x9d\x90\xa7\x30\x5d\xaf\xa9\xd0\xd2\x75\xd8\xe0\x38\x96\x37\x75\x21\xaf\x01\xac\x6e\x98\x92\x59\x80\x3c\x28\x96\x0a\x82\xc1\x18\xde\x5e\x03\xf4\x94\x40\x56\x48\x1d\x3b\x22\x38\xcf\xf5\x33\x25\x04\xe7\xe5\x03\x0b\xc3\x1c\x21\xde\xce\x93\x0b\x59\x9e\xc8\xda\x93\x86\x0d\x6a\x3c\xd4\x12\xda\xa4\xd1\xfa\x90\x3a\x23\xa9\x07\x0b\xb6\x4d\x0a\xaa\x5b\x05\x59\x97\xf3\x3f\xa1\xef\xb2\x4c\xea\x99\xa1\x97\x6e\x6c\xd6\x10\x9a\xbb\x5a\xc4\xc2\xfb\xec\x66\x26\xb7\x13\xd5\x56\xd9\xff\xa3\x4e\x7c\xe2\xb7\x8f\x7f\x3a\xe2\x03\xf5\xdb\x49\xd4\x7e\x7d\xd8\x3e\xbb\xdd\x9e\x21\xbf\x78\x34\xf6\x76\xd0\xce\xa5\x0c\xaf\x3d\x3f\x84\x4e\x88\xc8\x60\x3f\x3f\x3d\xc5\xa5\x6e\x25\x75\xec\xb0\xe0\xad\x87\xb1\x73\xb0\x65\xd8\x25\x6d\x1b\xd2\xb7\x0e\xfb\x5a\x26\x7b\x90\x0b\xbf\x33\x73\xb9\x7f\xe9\x0b\xf4\x05\xb4\x42\x9d\x92\xa8\xb6\xdd\x3c\xbf\x34\x9f\x0a\x4a\xd9\xb4\x4d\x51\x78\xe1\x50\xd5\x22\x1a\xcd\x74\xeb\xf3\x67\x7c\x5f\xff\xec\x67\x4e\x3d\x1e\x7f\x6b\xf2\xdd\xd9\xc4\x0f\xb2\x4f\xec\x7d\x64\x62\xf6\xde\xd5\x37\x5e\x4c\x35\xbf\x7a\x3b\xfc\xe6\x27\xc0\x2d\x17\x40\x93\x5c\x6c\x1d\x32\x2c\x22\x4d\xd1\x36\x93\x85\x25\x09\xd6\xa0\x22\x80\x22\x2e\x02\x05\xc8\x3c\xb4\xa0\x49\x1e\x3b\x7f\xe1\xec\xa1\xd9\xee\x83\xe0\x47\x4b\x3f\x58\x7a\xf0\x52\x57\x3c\x81\x39\x61\xe1\xf9\xab\x6e\xfa\xdf\xb5\xb3\xd6\x1c\xbb\x48\x7a\xf3\x63\x6b\x2e\x02\x27\xe2\x44\x5d\xd5\x01\xc6\xd0\x2c\xc7\x5b\x8a\xca\xa9\xbc\xc4\xca\xaa\xcc\xb5\xf0\x98\xe8\xe3\x8f\x89\x4f\x21\x7c\x85\xd2\x8d\x60\x00\x33\xa7\xf4\x94\x46\x66\xb1\x41\x3f\x73\x0c\x9e\x9a\x3b\x6f\x68\xf4\xa8\xde\xd4\x50\xb2\x55\xe5\x26\x30\x9f\x13\x88\x0a\x65\x52\x69\xea\x4e\x11\x38\xa0\x54\x30\x2b\x15\x4b\x87\x34\x2a\x1d\xc2\x1c\xcc\x12\x59\x57\xc2\x1d\x58\x85\x25\x16\xa4\x4b\x6e\x95\xcc\x5a\xb0\x62\x51\x6c\x49\x2e\xc3\xaa\x96\x67\x61\xd9\x82\xb6\x65\x01\xd9\x02\x4c\x36\x6d\xd9\x80\xc5\xc2\xda\xb0\x1e\x3e\xd9\x86\xac\xd4\x1f\x87\x3a\x26\xf0\x19\x38\x25\x74\x0e\x76\x6b\xa8\xab\xae\x4a\x6d\x24\x57\x51\x2b\x9c\xd2\x3f\x67\x9d\xf5\xfd\x25\x37\x53\x4b\x77\xde\x73\xf1\x11\x8b\xae\x58\xb2\x2c\xe4\x1d\xff\x7b\x28\xc7\x76\xfe\x50\x38\x9e\x9a\xb2\x48\x3a\x93\x9b\x58\x87\x9e\xf3\xfd\xb0\x9d\xf3\xcf\xe1\xbc\xe7\x50\xa4\x83\x70\x2a\xca\x27\xad\x04\xf5\x46\x3c\xa9\x31\x1b\x5b\x82\x2d\x6d\xc5\x96\xb7\x53\x95\xf5\x86\x37\xa3\x7c\xde\xe8\xff\xff\x96\xd1\x4c\x21\x04\x8b\x10\x9a\x05\xdc\x39\x44\xe1\xf9\x66\xa1\x9c\x94\x0f\xd9\x56\x82\x9d\x2c\x27\x2d\xf3\x10\x6f\x56\x92\x7c\xc1\x32\x44\x81\x6f\x34\x50\x52\x7c\xee\x60\x9a\x60\x5c\x1d\xd7\x61\x15\x56\xa8\xbc\x01\x2b\x09\x41\x94\xa0\x66\x19\x38\x43\x72\x82\xa0\x0b\xaa\x2a\x4c\x61\xb0\xac\x8a\xb0\x01\x4b\xa5\x12\xe0\x8a\xaa\xac\x2a\x3c\x9b\xa5\x64\x5d\x34\x0c\x51\x97\x28\x9d\x95\x14\x8e\x55\x59\xaa\x4d\x5f\xab\x45\x5f\x8a\xdc\x34\x2b\xe0\x87\xda\x94\x90\x4a\x93\xbc\x2f\x21\x12\xc9\x96\x36\x0e\x98\xc0\x7f\xcd\xb9\x84\x62\xc0\x1a\xcc\x23\x2d\x5c\x75\x2b\x38\xe3\xd6\xf1\xbc\x3d\x49\xdb\x40\x23\x79\x53\xe3\x21\x6b\xb9\x35\x3c\x6d\xe1\x69\xeb\xa0\x65\x5a\x24\xc7\x23\x9a\x6e\x9d\x12\x53\x49\xf2\x31\x2c\x89\x76\x64\x6f\x70\xfb\xa8\x1f\x07\x43\x18\x11\xc4\x94\x10\xfd\xe8\xac\xaa\x9f\x4c\xc6\x2b\x11\xf4\x0c\xf4\xcc\x45\xfc\x39\xf1\xc2\x5b\xf0\xf5\x31\x20\x57\x2c\x2b\xb9\xf0\xa5\x97\x1c\xcb\x99\xc2\xf4\x3a\xbc\x44\xad\xc1\x5f\x83\x3f\xc2\x63\x12\x1b\x21\x0e\xa0\xfb\x0e\xfe\xcd\x43\xf3\xc0\x65\x67\x11\x76\x53\x26\x1f\x5b\xe0\xfe\x01\xfe\xe4\x16\x20\x37\x7f\xe0\x16\xf1\xb3\xdc\x22\x39\x70\x31\xfc\xe3\xe4\xdd\xff\x0b\xdf\x7f\xf0\xc2\x13\xf6\x3d\xf9\xed\x6f\x3f\xb9\x6f\x63\xf3\x07\xc4\x51\x27\xe0\xcf\x59\xa8\xf6\x30\xf2\x63\xa1\x3c\x67\xfd\xfe\x52\xa2\xc0\xcf\xbe\xf0\x42\x6c\x0f\x4a\x76\x16\x64\x6b\xe8\x99\x8b\x57\xb5\x52\x1d\xe8\x50\xc7\xd3\x36\x9e\xf5\xa4\x3e\x54\x71\xd6\x95\x01\x86\x73\x8a\x6b\x95\xca\xae\x21\xe2\xba\xe9\x1a\x20\x4b\xb2\xba\xc2\xd4\x0d\xd8\x20\x2a\x4d\x91\x01\xb4\xde\x30\x9b\x3c\xd4\x1d\xab\xee\xe1\xd8\xba\x5d\x03\x1c\x61\x70\x58\x50\x03\xd9\x9f\xc7\x49\x88\xf3\x3c\x79\x83\x92\x01\x76\x5b\x91\xd1\x80\x62\xde\x5f\x14\x82\x77\x6d\x11\xcf\xe3\x79\x05\x56\x60\x9e\x10\x9b\x79\x9c\x82\x32\xb0\xa1\x8c\x0b\xce\xa4\x68\x03\xa6\xac\x95\xa7\x30\x4f\x15\xe1\x58\xb3\x98\x70\x2a\xbc\xc5\x29\x26\xcb\xd4\xac\x66\x16\x64\x4d\x80\x59\x93\x55\x41\x20\x6a\xac\x62\xc8\x4c\xd5\x84\x55\x02\xe5\x7c\x2a\x4d\xf1\x29\xca\xb3\xa1\xf6\xa3\x2c\xd0\xe3\x72\xc4\x6e\x44\x36\x51\xfe\x64\xd4\x8e\x6a\xb9\x63\x78\x80\x37\x75\xec\x14\x7f\xef\x44\xdd\x76\xa1\xeb\xae\x9d\x70\xb3\x55\xf5\xcc\xf7\xe2\xa5\xc8\x14\x92\xd1\x71\x36\xc8\x0d\x15\xf0\x02\x6b\x51\x69\x22\xdd\x2c\x66\x69\x82\x6b\x1a\x7c\x42\x81\x42\xad\x2a\xa9\x8a\xdd\x14\x6d\x59\x91\x1a\xb6\xf7\x5a\x2c\x03\x05\xd0\xa0\xb3\xae\x8e\x67\x05\x56\x2e\x5b\x6a\xb1\xe6\xe1\x27\x22\xef\x21\x2c\x28\x82\xb2\xae\x26\x1b\x06\xc7\x30\x26\xcf\xe9\xba\x99\x97\x2c\x8e\x77\x29\x51\xc4\x4b\x02\x6f\xd8\x79\x93\xe7\x75\x8e\x77\x1b\x32\x27\xb1\xa2\x26\x33\xa6\xe1\x38\x46\xde\x90\x15\x8c\xc4\xbe\x3c\x75\x41\x6a\x2e\xf9\x00\x36\x0b\xc5\x0c\xe7\xb0\x93\xd1\x29\x6c\x6a\x80\xc4\x3f\x02\x06\x53\x43\x0b\x4f\x5f\x0c\x46\x07\x7a\x3d\x98\xe0\xa7\xe7\x1f\x8c\xc4\xce\x04\x8e\xc9\xae\x0c\x0e\x7e\x77\x58\xf2\xb2\xf4\xc9\x0b\xe4\x5b\xde\x39\xe6\x91\xb1\x45\x83\xe9\x43\x13\x8b\xf6\x1c\x96\x68\xc0\x6b\xaf\x5a\xf4\xe4\xc8\xa5\x2f\x5e\x76\xcc\x8b\xc7\x2c\x75\x0b\x2f\x2e\xbd\xee\xc5\xbb\xc0\x77\x2f\x3d\xf6\xc5\x63\x96\x36\xd4\x1a\xac\x80\x1a\xcc\x26\x6c\x88\xe1\x98\x5b\xc5\x8b\x87\x68\x20\xe2\xa7\xca\x3f\x84\x07\x6f\x59\x94\x79\xe9\xb0\xc1\xd5\x45\xb0\x27\xb3\xe0\x73\xf0\x96\xd5\x8b\x1e\xbd\xe5\xd1\xb1\x93\xd7\x3d\x9a\x19\xf9\xd6\xa3\xd2\xba\xb1\x75\xeb\x4e\xde\x3e\x96\xdc\xbb\xea\x82\xdc\xc4\x23\xaf\xbd\xf6\xc8\xc4\xd3\xcd\x83\x78\x2d\x87\x25\x83\xfc\xee\x1a\x76\x22\xc6\x06\x99\x34\xb0\x6e\x3b\x72\x5a\x9a\xd1\xa1\xb9\xa3\x83\x3d\x73\x41\x67\xae\x8c\xf9\xbe\x4b\x96\x50\xd5\x32\x44\x17\xe1\x13\x82\x5b\xc7\x29\xb7\x8a\xe7\x9b\xac\x9c\x70\x74\x47\x32\xe8\xbc\x28\x64\xb3\x93\x86\xe6\xe8\x80\xb5\xeb\x80\xc5\xcb\x8a\x60\xf0\x8a\x26\x30\x36\xc3\x1b\x22\x6b\x33\x62\xd9\x12\x75\x53\x27\x35\x8d\xa7\x0b\x66\xa9\x68\x16\xcd\x66\xd9\x72\x4b\x35\xda\xa2\x05\x05\x08\x86\x6a\x14\xaa\x04\xc5\x4c\xaa\xa6\x23\x3a\x26\x63\xe6\xb9\x82\x99\xb6\x8b\x5c\xc9\x66\xb8\xaa\x23\xd9\x48\x06\xc9\xfe\x5d\x2a\xac\x0f\x3b\x3d\xb8\x75\x77\xae\x2f\xe9\xba\x2c\x07\x7a\x47\x3c\x1e\x41\x3a\x37\x60\xd0\xce\xeb\x45\x84\x26\xc3\x06\xcc\xe3\x59\xb7\x96\xa8\xb9\x65\x9c\x75\xeb\xb8\x73\xb0\xee\xb1\x1c\x49\xb9\x1c\x45\xd0\x69\x33\xaf\x94\xb3\x55\x55\xe4\x28\x57\x2c\xb9\xb6\x0c\x2a\x65\xd7\xc6\xcb\xd9\xb4\x2b\xd9\x38\xed\x56\x83\xeb\x51\xc1\x6f\xa4\xa6\x30\x94\xa4\xab\x8a\xa1\x98\xae\x81\xf3\x59\x57\x75\x8b\x12\x2c\xe7\x69\x83\x16\x0c\x58\x13\x4c\xd6\x36\x18\x16\x48\x8a\xa2\xc0\xa2\xa2\x28\x58\x98\xff\xc1\xd3\x5b\x7e\xf6\x13\x94\xa7\x11\xb9\xc6\x87\x7d\xd8\x4a\xa6\x86\x47\x86\xdb\x66\x78\xfb\x75\xc3\xb4\x00\xe1\xae\xeb\x09\xae\x5a\x13\x7e\xa8\x30\x82\x3a\x78\x09\x64\x61\x9d\x96\x78\xb5\xc0\x1b\x2c\xc0\x60\x91\x13\x75\xb3\x54\x2a\x14\xf0\x2c\xac\x01\xff\x53\x07\x8e\xda\xa8\x68\x65\x53\x35\xf2\x80\x82\x75\xef\x83\x2b\xb0\x96\xd5\x1b\xd0\x56\x00\x4f\x28\x80\x06\x98\x00\xeb\xb0\x4e\x70\x96\x29\xeb\x46\x81\xb6\x0c\x5d\x31\x4d\xc3\x32\x1a\x75\xa3\x66\x80\xb4\x39\xa9\x9b\x66\x82\x61\x24\x4d\x64\xf2\x86\x67\x5a\x62\x0d\xc8\x2b\x45\x1d\xe5\x52\xb1\x6c\xd9\x7f\x57\x74\xf6\x87\x32\x36\x2c\x6a\xcb\xea\xe0\x96\x38\x32\x71\x7a\x86\xdb\x77\xc6\xa7\xbf\x2a\x88\xbe\x1a\xaf\x1a\x0e\x48\xc3\x06\xfa\xe8\x66\x11\xe6\x4d\x4f\xa4\x03\x09\xd8\xb0\x02\x18\xf4\xa9\x82\x82\xda\xa8\xe8\x25\x80\xe9\x0d\xe8\xa8\x80\x27\x78\x20\x01\x46\x80\x45\x58\x24\x15\x4d\x64\x2a\x46\xc3\xa8\x83\x32\x64\x71\x0e\xb7\xf2\x46\xd5\x15\xea\x46\xc3\x00\x94\x39\xa9\x98\x66\x82\x63\x0f\x55\xd0\x3b\xe4\x15\xcb\xce\x2b\x7e\xfe\x09\x4f\xc6\x4b\xc1\x5d\xdc\xd3\xc2\x48\xee\xc0\x5b\x12\x64\xa0\xf0\xfe\x09\xbc\x25\x3d\x83\x91\xf9\x0f\xf4\x0c\x78\x78\xb5\xdf\xc3\x21\x9e\x06\x8d\xbe\x0f\xd6\xd5\x1b\xd2\x28\xab\x79\x60\x7a\x33\x64\x3d\x85\x93\x05\x3c\x2c\x2a\xaa\x0a\xeb\x4a\x01\x1a\x02\xe0\x09\x01\xb0\x00\x53\x61\x03\x96\x49\x49\x17\x10\xf1\x8d\x29\x2c\x61\x4d\x2a\x00\xf3\x5e\x05\x33\x27\x15\xcb\x4a\xb0\xcc\xa4\x93\x48\x2b\xba\xe2\xe6\x75\x20\xb8\x98\x66\x6b\xb6\x64\xaa\xa6\x61\xab\xa1\xff\xcf\xf7\xaf\xa2\x18\xcb\xf1\x6b\x23\x3e\x08\x14\x97\x70\x80\x46\xed\xcb\xc3\x73\x3a\x15\xad\xe5\x09\x61\x8e\xf5\x56\x05\xd3\x90\x16\x11\xcf\x51\xe4\x9f\x9e\xe1\x40\x85\x44\xe8\xd1\x87\xe8\x31\x32\x08\x02\xfc\xda\x1f\x39\x03\xc2\x19\x49\xb3\xea\xf5\xba\x27\x63\x0a\x80\x0d\x42\x4a\x31\xd8\x00\xa6\x68\x1d\x52\x4c\xb1\x00\x74\xe0\x40\x89\x0d\x8c\xf2\xbc\xa2\xeb\xb8\x0e\xc4\x46\x19\x48\x16\x21\x35\x9d\xd6\x87\xd4\x64\x81\x51\x54\x4d\xd3\xf1\x9a\x9b\xd5\x35\x4d\xd5\x35\x97\x81\xe5\x7c\x1e\xb0\xb8\xc5\xba\x1c\xae\xcb\x92\x04\x6b\x92\x02\x29\x57\x35\x0c\xdc\xac\x4a\xb0\x2c\xc3\x92\xec\xe9\x46\x3d\xa8\xdf\x7b\x0c\x76\x7c\x0c\x69\x05\x46\x46\x0b\x72\xd3\xde\x2b\x91\x25\x11\x16\xa1\x46\xb0\xcd\x32\xae\xd9\x93\x15\x1b\x17\x9b\x65\x82\x85\x45\x68\xb1\x78\x03\xb2\x09\x66\xb2\x42\x0a\x06\x97\xf5\x20\x76\xb9\x59\x56\x14\x82\x05\xac\x05\xe8\x6c\xda\x3a\xa4\x02\xab\x95\xfb\xda\x21\x0d\xec\x43\xc8\x02\xc6\x40\x3f\xaa\x2d\x8e\x0a\x8d\xa7\x22\x99\x61\xfc\xa7\xfb\x94\x25\x3c\x5b\xb0\x6a\xf1\xc0\x06\x65\x09\xb2\x50\x84\x0e\xe4\x25\x5c\xd5\x09\x0e\x96\x3c\xd4\x8f\x67\xed\xa6\x6c\xe3\x0c\xc2\xfd\x36\x83\xb0\x96\xc1\x0a\xb0\x61\x7a\xe8\x1e\x56\x0b\x06\x48\xd7\xcc\x82\x51\x70\x05\x4d\xc3\x0b\x05\xa3\xd0\x94\x00\x8d\x05\xf9\xad\x5b\xf3\x39\xb6\xdb\x8c\xe2\x38\x3b\x1a\xd7\xdd\x75\x46\x40\x44\x3e\x14\xbc\x78\x88\xc2\x2d\x98\x4f\xa0\x89\xd9\xdd\x27\x94\xcf\x5b\x79\xd3\xcc\xc3\xb4\x2b\x6a\x1a\x9e\x87\x12\xc8\x06\x7c\x99\xf6\xf8\x72\xe2\x61\x74\x2f\x39\x13\xe1\x57\xbb\xd5\x4e\x91\x07\xbe\x1e\xda\xa2\x81\xdd\xb2\x1e\xe5\xad\x5c\x3f\x3f\xf4\x7b\x07\x3e\xb0\x3d\x73\xbc\xf6\x3d\x03\x9d\x3e\xb6\x89\x87\x6b\x58\x86\xdc\x76\x38\xd3\xb6\x75\x0b\x28\x27\x1d\xca\x5b\xbb\x9e\x8d\x8c\xef\xc7\xe9\x9d\x1b\x6b\x97\x5a\xe7\x34\x7b\x10\x06\xdb\x43\xc7\x7c\xf4\xde\x7e\x43\x18\x6c\xcf\xec\x48\x7f\xe4\xb7\xdd\x83\xf6\xdb\xd6\x9f\x07\xf6\xcd\xed\x53\xcb\x52\x5f\x24\x6f\x45\xfc\x77\x06\xb6\x28\x38\x11\xef\x67\x03\x3d\xd8\x33\x34\x3a\x2f\xe4\x84\x44\xca\x4f\xe8\x1b\xf9\xf3\xe0\x68\x9b\x51\xd8\x64\xeb\xcf\x64\xe4\xcf\xa9\xce\x3f\xa7\xce\x1b\x86\xdb\xc1\xdd\x70\x2d\x38\xed\xb9\x04\x3c\x79\x0d\x98\x07\x9f\x03\xb7\xc2\xff\x3e\x7a\x18\xbf\x13\x5e\x06\x7e\x07\xe7\xc0\xd7\xcf\x84\xeb\x51\x4d\x9d\xfe\x47\x12\x30\x7b\x2f\x58\x80\xb0\xda\x9b\xc3\x44\xc2\xdd\x04\x7e\x03\xe7\x26\x3f\x26\x55\xa0\x4a\x0c\x36\x7f\x8b\x13\xbb\x13\xcd\xdb\x13\xcf\xe1\x47\x34\x7f\x42\x0c\xbb\xbf\x95\x12\xb3\x9a\x07\x89\xa7\x9a\x77\x12\xc9\x07\xb3\xd6\xea\x87\xe0\x0d\xe0\xe4\xc4\x69\xe0\xc5\x87\x56\x1b\x87\xa7\x56\xcf\x6e\xfe\x73\x2d\xfe\xd0\x03\xfd\x9f\x5f\xbd\x0a\xde\x74\xea\xa9\x60\xe3\xaa\xd5\xf7\x1f\xb6\x7a\xae\x9b\x7c\x2c\xd9\x5c\xd5\xff\x91\x5b\x1f\xbe\x0e\x3e\x3e\x7f\x3e\xb8\xff\xe6\x7b\xaf\xa1\x1e\xee\x77\xef\xba\xb9\x1d\xaf\x81\xfc\x16\x2f\x7d\x21\x8d\x65\xc8\xf5\x6c\xda\xc7\xb5\x41\x1e\x27\xac\xdf\xcf\x22\xdf\xaa\x31\xe4\xc7\xda\x0d\xf5\xfa\x9e\x05\xe4\x5f\xf1\x4c\x9b\xde\x81\x20\x01\x67\x6a\x28\x93\xa0\x40\xc9\x8f\x9a\xa3\x61\xd5\x86\x59\x36\x6f\x0a\x22\x50\x21\xe7\x3a\x36\xcd\x80\xa2\xe8\xca\x32\xce\xaa\xb0\x98\x15\x0d\x4d\xd0\x75\x59\xad\x25\x05\xc0\xc1\x92\xe5\x9a\xb6\x9b\xc7\x45\x13\x54\xe8\x72\x05\x57\x41\x89\x36\x8d\xc9\x0a\x54\x0c\xc0\x13\xb2\x50\x14\x64\x5b\x15\x2c\x0d\xe8\x2d\x8c\xe3\xd9\x0d\x49\xac\x17\x3b\x1a\x9b\x8d\x0d\xfb\xf7\xd9\x3c\x71\x92\x8c\x79\x7d\xe6\x45\x0a\x1a\x79\x78\xd5\x4f\x96\x19\xa6\x0b\xc5\xe6\x85\xf5\x65\x53\xad\x77\xf3\x5e\x2d\x85\x09\xae\xdc\xe4\x59\x82\xc6\xa5\xbc\xa2\x02\xd9\x3a\x24\x59\x89\x82\x01\x59\x81\x31\x19\x11\x9a\x12\x6b\xb2\x92\x6e\xb2\xc0\x61\x9b\x0d\x11\xd7\x45\x58\x14\x15\x49\x96\x64\x8e\xd3\x01\x85\xe7\x81\x61\x01\x16\x96\x81\x94\x86\x79\x0b\xca\x6c\xde\x30\x00\x0d\x35\x52\xd3\x59\xca\xd4\x58\x4b\x85\xc5\x42\x09\x88\x96\x26\xa9\xac\x2a\x31\xb2\xca\x6a\x32\x14\x59\xcd\x65\xa6\x30\xb3\x08\x1a\x9a\x20\xe8\x12\xcf\xb1\x12\xc0\x0c\xd3\x34\xa1\x63\x42\x07\x48\x1a\xe0\xd8\x3a\x90\x7c\xfe\xf6\x6b\xee\xeb\x48\x8b\x5c\x8e\x2d\x47\x59\xe0\xb0\x96\xf7\x6e\xb8\x6f\xd0\x2f\x74\x8d\x74\x47\x87\xc5\xde\x37\x38\x32\x30\x34\x3a\xe8\x97\x2d\x5c\x38\x1a\xf8\x7c\xfc\xfa\x95\x27\x80\x94\x07\xf9\xd0\x7f\xa2\x11\x92\x91\xdf\x7b\x83\x7c\xe5\xde\x56\x10\x40\x89\x4a\x5b\x14\x5e\x6a\x94\x39\x41\x92\x44\xa1\xe0\xc0\x86\x2a\xe8\x34\x63\x5a\x78\xc1\x15\xf0\xba\x4b\xd9\xae\xc2\xc8\x79\x82\xaa\x35\x18\x5d\x86\x05\x07\x68\x9a\xae\x4b\x50\xc7\x69\x16\xaa\x38\xc7\xe2\x46\xd3\x04\x55\xcd\xd0\x25\x28\x72\x82\x20\x0a\xa0\x02\x4a\x9a\x61\x48\x50\xe6\x04\x51\x12\x14\x86\x85\x9a\xc0\x03\xd6\xcd\xe3\x59\xc8\x91\x14\xc7\x31\x42\xc3\x64\x39\x96\xe1\x04\xe8\x54\x54\x4d\xe4\x58\x2a\xad\xea\x9a\xe1\x38\x9a\xa1\xcb\x54\x5a\xe3\xe4\x0a\x90\x24\x51\x14\x4c\x4d\xd3\xdc\x82\x2c\x8a\xbc\xdf\xdf\x6b\x43\xbf\xc1\x0a\xcb\x4a\x1c\x05\x59\x2d\xd0\xcb\xad\x3a\x04\x1f\x0d\xb2\x26\x9c\x8c\xb1\xd8\xf9\xd8\xa7\x90\xc4\x1e\xe8\x1b\xf4\x2b\x28\x78\x78\x24\x2c\xf5\x08\x86\x47\x06\x93\xc1\x07\x8c\x0c\xf6\x0d\x06\x9f\x94\xc7\x62\xc9\x18\x8b\xcd\x9d\x17\x8a\xfa\x80\xc5\xbc\x05\x1a\x19\xc0\x31\x5d\x48\x62\x05\x0f\x8b\x99\x07\xab\x05\x0f\x57\x0a\x92\x06\x30\x42\xaf\x56\xa1\x51\xab\x41\xbb\x5c\x26\x0a\x55\xb3\x66\x96\x05\x83\x05\x36\xeb\x62\x22\xae\x4a\xb0\xc0\x2b\x92\x24\xab\x2c\xab\x83\x2c\xee\x74\xf2\x59\x41\xd7\x41\x16\x6a\xa4\xce\x2a\x46\xd1\x74\x50\xea\x77\x9e\x95\x2c\x58\x2e\x7a\xff\x83\x69\x54\x65\xde\x31\x59\xc9\x2d\x95\x4d\x03\x28\x22\xcb\xaa\x3c\xcb\xd2\x72\x51\x95\x65\xa3\x6e\x78\x60\x56\xab\x30\x28\x9a\x2d\x81\xa9\x53\x6c\xca\x24\x2d\x44\x97\x13\x51\x25\x0c\x7f\xeb\xf7\xc5\xf3\xbf\xe3\x60\x28\xe3\x47\xa1\x20\x80\xe2\xdb\x84\x7e\xa9\x18\xc2\xc8\x67\x19\xdc\xf0\x10\xb2\x28\xfa\x15\x75\x9b\x12\x35\x85\x59\x75\x0a\x56\x01\x03\x1c\x16\x96\x08\xa7\x29\x81\x92\xc8\xd8\xac\xe8\x48\xac\xc3\xca\xa4\xc5\x28\x92\xab\x58\xae\x2a\x89\x94\x49\xb1\xb8\x06\x69\x68\xca\x40\x05\xba\x85\x5b\x6a\xb3\x81\x63\x82\x67\xfc\x18\xae\x9e\xaf\x70\x95\x7c\xe8\xef\x91\x49\x23\x93\x7b\x05\xdd\xa3\x3d\x70\x77\xc4\xcf\x86\xe2\xc5\xfc\x3a\x6e\xb1\x76\x94\xcb\x64\xc7\x43\x1d\xed\x41\x3c\xb8\xd7\x42\x91\x3b\xf6\x46\xce\x31\xfd\xf3\xc4\x9f\x21\xfd\x09\x63\x7e\x3c\xaf\xff\x2a\x2c\x9a\x1f\x5d\x6d\xcd\x67\xf7\x77\x8b\x58\x86\x3c\x70\x07\xba\x24\x90\xc2\xae\x9b\x3a\x29\xb5\x89\x7c\x1c\xd5\x46\x1c\xc2\x4e\xc1\x86\xb1\x8f\x61\x97\xb7\x6a\xed\xa0\x32\x1d\x01\x6d\xfb\x3d\xd2\xfa\x49\xd8\x10\x2c\x1e\x5e\xe8\xe1\x95\xfe\x80\xb8\x7d\xa9\x05\x43\xa0\x67\x56\x50\xff\x77\x70\x4e\x6e\xa4\x67\xa0\x87\xc2\x53\x43\x99\xa3\x01\xc8\xf4\xa6\x70\x22\xf1\xd8\xbd\x99\xc5\x77\x2e\x76\x6f\x78\xea\xa3\x2c\x38\xe2\x82\xc5\x17\xdf\xfb\xd1\x7d\x27\xc2\x0d\xca\x43\x37\xcb\x72\x99\x7d\x14\xdc\x0c\x37\x58\x32\xa7\x8c\x7e\xd2\x9a\xf3\xd0\xb1\x89\xc9\x65\xc7\x7d\x24\xb5\x36\x75\xe9\x03\x3a\x0f\x77\x7e\xe1\xb9\x6b\xfe\x0e\xf8\x65\x7d\x5f\xe8\xe3\xc9\xd5\xfd\xef\xbc\xb6\xe0\xf5\x1f\xd3\x0f\x5e\x7f\xe8\xf6\xab\xaf\x4e\x3f\x9f\x3e\x0d\xd7\x36\xc3\x73\x9b\x67\xbc\x0f\x7e\x76\xcb\xf3\xf8\x2d\x8f\xb8\x7d\xe0\xed\x33\x9e\x78\xfa\x9c\x27\x9e\x70\x0b\x5f\xfb\x61\xcf\x5b\x3b\x89\x47\x0f\xad\x3e\xff\xfc\xdf\x9c\x32\x69\x9c\x7f\x6b\xf2\x58\xf7\xb7\x70\x07\x5c\xb6\xe7\x01\x90\xc1\xef\xc3\xef\x84\xa7\xc1\x7f\xc0\xbf\xe6\xc0\x00\xc0\x43\x1f\x5d\x48\xbb\xdd\x2f\x62\x51\xdf\x5d\xd8\xbe\x23\x1f\x69\x47\xb9\x86\xf6\xa2\x3a\x88\x07\x56\x75\xef\xbf\xf7\xa1\xee\x6b\xf9\x6a\x74\x7c\x74\x26\x7e\xe0\xae\x69\xe3\xc8\xed\x71\x5e\x88\xae\xb1\xe2\xb5\xaf\x3f\xa9\xa3\x7f\x10\x1b\x10\xcc\xf3\x95\x4e\x9e\xd8\xb1\x27\xd6\xbf\x1d\xcf\x84\x72\x25\xbd\x7a\x59\x27\x2f\xfa\xe3\xbc\xba\x38\x6c\x67\x53\x1a\x3a\x23\x5f\x34\x6d\x9e\x7a\xbb\xff\xb6\x57\x23\xed\x62\xfb\x7d\x77\x5d\xdc\xbd\xff\xfa\x6b\x66\xa0\xf3\xee\xce\x3d\xe3\x8f\xb3\x91\x8e\xbc\xaf\x10\xe9\xbf\x6b\x5a\x7f\x9f\x6e\x1f\x44\xfa\xa3\x58\xef\x89\xfc\xbf\x5a\x2f\xe7\x73\xdd\xe7\xb9\x63\x67\xe7\xba\x3b\xf3\xbb\x8f\xf3\xea\x79\x1d\x74\x6e\xdd\xa5\x46\x7b\xf5\xd5\x68\x2e\x36\x7f\xbd\x50\x4e\xb3\x03\x77\x76\x8e\x7f\xe0\x0e\x14\x9b\xbf\x3d\x32\x7f\xc4\x0f\x5b\xfe\x67\xda\x73\xfd\x58\x87\xcf\x4c\x7b\xee\x1e\x72\x4d\xb0\xbe\x4b\xf7\x3d\xc5\x27\x17\xf7\x07\x77\xa1\xda\x72\xe2\x0e\x14\xbf\x10\xe5\xa1\x7c\xeb\x9d\x33\xe4\x8b\x73\x22\xed\x11\x1a\xe5\x2f\x8c\x3c\x03\xe1\xef\xad\xfb\x50\x3c\xe9\xcf\x62\x71\x16\x21\x6f\xbd\x7c\x30\xd2\xbe\x91\x5c\xdb\x9a\xd3\xd6\xa3\xf7\x1e\x7e\xce\xef\x97\xbc\x81\xfe\xf6\xc9\xa9\xc3\x52\x9f\x23\x2f\xa0\x56\x1c\xb8\xfb\x43\xdf\x1a\x39\x77\xc9\x9b\xd4\xb2\xad\xf7\x82\xc4\x54\x69\x74\x84\x67\xa3\x77\x63\xfc\x31\x77\xec\xe8\xa4\xfb\x96\xaf\x4e\x7b\xff\x7c\x7b\x0e\x9b\x76\x45\xce\x20\xd0\xfe\xd9\xf7\x02\xea\x7f\x47\xa4\xbf\x10\x99\xf3\x57\x22\xed\x91\x7d\x92\x5f\xd9\xed\x1d\x33\xe4\x26\x62\x1a\xdf\x20\xda\xda\xf5\x48\x7f\x3f\xa6\xc3\x9f\xff\xc4\x34\x7e\x45\xfd\x37\x71\xb1\xfe\xe1\x73\xd7\x5d\x18\x9b\x4f\x38\xce\xa6\xab\xbb\xf1\x19\x45\xee\x70\xba\xef\xf3\x30\x6e\xb1\xe3\xb9\xeb\xa2\xf9\x63\xb4\x76\xfb\x8e\xed\x11\xba\x59\x61\x7b\x6e\x02\xdd\x28\x1a\xbf\xa6\x83\xf7\xcf\x99\x46\xd3\x88\x9e\x8a\xc4\x9b\x05\xb5\x5c\xfd\x39\x6d\xfc\x78\xf7\x77\x5e\x7f\x62\x2c\x06\xc2\xc8\xe4\x36\x6c\x9d\x36\xbe\xd5\xa6\xc5\xc6\x74\xd0\x7e\xdd\x94\x90\x7a\x83\x7c\x9c\x5a\x71\xe0\x8e\x23\x7a\x47\x17\x2d\xb9\x90\x5a\x66\x5e\x81\xbd\x8f\x61\x67\xfc\x27\xdf\xed\x7b\x97\x77\xee\xa5\x2d\x8f\xa0\xbc\x07\x77\x44\xda\x8d\x36\x4d\x5e\xdc\x87\xb5\xe3\xae\x50\x7f\x7b\x20\x16\x67\xe4\x8f\x63\x66\x72\xeb\x4f\x88\xcd\xb7\x2d\x6b\x7c\xda\x6e\x8d\xd9\x8d\x9e\x8c\x46\x54\x5d\xcf\xc4\xda\x3d\xbb\x77\xa8\xdd\x8e\x11\xc0\xcf\xbf\xc3\x85\x79\x5e\x7b\xc2\x10\xd1\x64\x0a\x23\x06\x7a\xe6\x8e\x7a\xf6\x47\x4f\x7f\x10\xd1\x41\x4a\x6e\x51\xb2\x8b\xba\xe5\x38\x79\x20\x49\xcd\x6a\x01\x1a\x80\xab\xd3\xb0\x0a\x75\xc1\x26\x8a\x4d\x9e\x28\x92\x5c\x93\x2f\x1b\x86\x25\x15\x54\x4d\xb1\x01\x86\x73\xae\xcd\x72\x96\xc0\x89\xa4\x6e\x21\x3f\x9d\x3a\x85\x81\xc8\xf3\x4d\x52\x47\xf7\x94\xe7\xb5\x72\xda\x1d\xd5\x3f\x37\x98\xc2\x5c\x10\x4e\x61\x20\x37\xd4\xca\xe2\x4a\xd4\x05\x06\xa7\x5d\x4b\x74\x00\x55\x51\xab\xb5\x12\x60\x24\x97\x9b\xc2\xa0\x09\x98\x0a\x0d\xeb\xd0\x12\x71\x91\xe1\x60\x81\xa8\x34\x19\xa2\x42\xea\x8a\xde\x2c\x17\x4d\x25\xaf\xdb\xb2\x2e\x38\x65\x5c\x72\x2d\x8e\xb7\x45\x41\x24\xd3\xb2\x08\x0b\x85\x82\xf7\x09\xfc\x06\x62\x70\xdf\xe5\x06\x14\xe3\xb3\x22\xb6\x0e\x5a\x26\xb7\xef\x46\xd4\x7e\x53\x10\x0b\xa3\xa0\xf3\x49\x1d\x3b\x3e\xac\x4e\xe6\xa1\x6b\xbf\x78\xe0\xac\xa3\x06\xe8\x51\x44\x4c\xb2\x55\x66\x0e\x4b\x0d\x2c\x1c\x1d\x20\x3d\xc8\xe3\x61\x4a\xdc\xb6\x45\xdc\x11\x44\x50\x9d\x4c\x9b\xc0\xc1\x45\x91\xa6\x2d\x46\xe2\x5d\xc1\xad\x15\x05\x41\x04\x26\x87\x1b\x32\xeb\xe6\x35\x06\x54\x21\x8d\x6b\xa0\x06\xb3\xa4\xce\xea\xba\xa1\xb8\x12\xb4\x59\x9a\xa1\x6a\x52\x9d\x67\x05\x95\x28\x73\xac\x09\xe8\xaa\xaa\x9a\xae\x05\x0c\xa8\x01\xa3\xe5\x07\x41\xfe\xbc\xfd\xa8\x7e\xde\xfe\xa5\x11\x7e\x40\x31\x4b\xfb\x51\x2c\xd3\xfe\x76\x1d\x10\x31\xb8\x9f\xf5\x69\xa4\xf3\xe6\xc5\xfc\x29\x5e\x7f\xa4\x93\xf6\x9f\x1b\xc1\x83\xa8\xdd\xf9\x6c\xbb\x3d\x38\x43\x12\x49\x1d\xeb\x41\x99\x28\x87\x7d\xaf\x6e\x70\xee\x36\xdc\x33\x1c\xb4\xf8\xbe\xde\xc1\x9e\x01\x50\xb6\x4d\x1b\x96\x38\x58\xd0\x01\xcd\xc1\xaa\x6d\xe2\xa2\x6d\xdb\x79\x1b\xe6\x6d\x58\x24\xf5\xc9\x12\xc1\x34\x79\x68\x36\x94\x32\x60\x89\x62\xb3\x42\x30\xcd\x4a\x82\xf3\x9b\x5d\x07\x97\xd0\xb9\x1b\x90\x53\x56\xa2\x86\xf5\xa2\xf8\x90\x20\xe9\x4b\x5f\x58\xc3\x49\x01\x8e\x8d\x2b\xb6\x47\x48\xdb\xb5\x6c\x28\x11\x26\x90\x3c\x03\x14\x3a\x16\x3a\xfb\x53\x80\x15\xf8\x0f\x74\x3f\x3f\xf4\x2b\xa8\x16\xf2\x8b\xad\xbd\xa8\x4d\x49\x7e\x8c\xa2\xf5\x59\x74\x27\x34\x1b\xb6\x07\xb5\x56\x5f\x41\x7a\xe3\x95\xe8\xfd\x5b\x3f\xae\x10\xd5\x45\xd8\x9b\x8d\xd0\xd2\x8f\x2f\x43\xf7\x78\xc7\x3f\x15\x93\xf7\x5a\x26\xf7\xca\x51\xb1\xfe\x1a\x92\x71\xe1\x7c\x5e\xf9\x74\xe4\xb9\x9b\x48\x9d\x5a\xf1\xec\x8b\xcd\xfa\x92\x2d\x67\xd2\x99\xf6\xb3\x3b\xbe\xb3\x6b\x07\x16\xf5\x8d\x84\xed\xeb\x73\x91\x75\xb7\x22\xef\x1c\xc7\xac\x5a\x26\x77\x00\xc9\xa5\xf1\x4f\x06\x7c\x7f\xef\xd4\x91\xa8\x6e\x33\x85\xf5\x61\xc7\xfa\xb1\x56\x38\x48\x78\x1b\x16\x05\x58\x60\xc4\xe0\x40\x26\x89\xf5\x26\x83\xa4\xeb\x23\xc8\xd2\x6c\x99\xe9\xde\xe7\x83\xe4\x77\xef\x80\x2b\xc1\x28\xb8\xf7\x12\x78\x1b\x7c\x15\xee\x80\xa9\x95\x38\x0d\x68\xb8\xea\xdf\xef\x05\xec\x7f\x82\xd3\xc0\xdd\x97\xbb\xdf\xda\x79\xd3\xd8\xf2\x9d\xee\x32\x50\x75\xf0\x74\xb0\x72\x0d\x07\xd2\x89\x47\xdd\xdf\xc2\x5d\xef\x8e\x8f\x8f\x83\xe4\x07\x9b\x3e\xff\xfc\xdb\xe0\x5c\xb0\x0f\x5e\xf8\x16\xf8\x18\x58\x72\xc9\xf8\xf3\xe7\x3d\x33\x8e\x7f\xce\xf4\xfe\xa7\xeb\xba\x8e\xf8\xf1\xae\xa9\xb3\x52\x4f\x92\x8f\x62\xbd\x7e\x1e\xbc\xe9\xf3\x01\xdd\x6b\x7f\x0d\xf7\xdc\x05\xfe\xb4\x09\x27\x36\x81\xf7\x61\xdf\x26\xd7\xdd\x04\x8f\x22\x2f\xbc\x45\x59\x70\xd9\xf0\x5d\xe7\x9f\x0c\x2f\xdc\x03\x2f\xdf\x86\x7f\x62\x4f\x72\xd7\xdb\x6f\xbf\xfd\xf6\xc6\xf7\xde\x7b\xef\x3d\xf8\xb8\x2b\x5c\x7f\xeb\x61\xdb\xd3\x97\x81\xbf\x36\x97\x10\xdf\x72\x0f\x23\xd6\x81\x0c\xfc\x2b\x3a\x17\x16\x91\xaf\x1c\xc5\x6c\xb4\xcf\x34\x5a\xff\xb4\x0e\x6f\x5a\xb9\xbe\x15\x42\x70\xb3\x40\x86\x3c\x28\x5a\x75\xab\x6e\x81\x22\xe4\x81\xec\x66\x09\xbe\x59\xb4\x9a\x05\x60\x57\x2d\x20\x58\x00\x73\x69\x42\x6e\xda\x78\xb5\x61\xc1\xbc\x55\xb5\xa0\x00\x0a\xad\xb5\xe6\xda\x3c\x90\x21\xad\xcf\x44\x78\x40\x6f\xf3\xdf\xae\xd6\x5d\x4b\x3d\xf4\xf1\xa3\xb5\xde\x3b\xdb\x97\xd1\x98\x36\xf5\x71\xb4\xd6\x04\x96\xf5\x3d\x67\xfe\x39\x70\xfc\x8c\x6d\x08\x9d\xad\x4d\x27\xab\x90\x54\x0f\x99\xe5\x54\x7a\x92\x97\x12\x52\x5a\x33\x0c\x9b\xb6\x2d\x96\xa1\x26\x4b\xbc\x02\xb5\x34\xa8\xc4\x56\x96\x49\xb0\x1b\x9e\xdf\xbc\x19\xde\xfc\x93\xa3\x77\xce\xb9\xe4\x77\xc6\x3e\xe2\x5e\xcf\xb2\xb7\xbc\xb5\xec\x36\xc7\x6d\x37\x76\x9f\xfb\xf8\xd5\xa1\x7c\xb2\x82\x7b\x66\xfe\x5e\x93\x22\x34\x88\xec\x8f\xdd\xb3\xc2\x76\x25\xda\x3e\x7e\x55\xd8\x6e\x46\x69\x36\x1e\xaf\xef\xd2\xee\xff\x89\x80\x66\x36\xb2\xad\x34\xec\x48\x6c\x36\x36\x12\xe4\x12\x6e\x49\x24\x8f\x2c\x9d\xf2\x6f\xb8\x67\x56\xaa\x25\x23\x17\x8e\x22\xae\x58\x38\x02\x04\x1b\x94\x6c\x50\xb7\x5d\xd5\x76\x2d\xbc\x61\x3b\xb6\x6d\xc3\xa2\x0d\x0b\xae\x63\xa7\x6d\x1b\x3a\x02\x2c\x0b\x15\x1e\x56\x6d\x3b\x4d\x0a\xb0\x0c\x64\x68\x03\x01\xd2\x8d\x06\xac\x40\x0a\x97\x5d\x1b\xd4\x5c\xdd\xd3\x05\x78\x1d\x2a\x8a\x04\xea\xae\x06\xcb\x92\xc9\x96\x70\x1d\x66\x25\x25\xca\x27\x5a\x26\xb7\xff\x0d\x8f\x4f\x9e\xc9\x04\x32\x5c\xf7\xdb\xb1\xa3\xb0\x13\x3d\x8e\x5d\x38\x34\xec\x17\xbc\xe8\x47\xd8\xc0\xf7\x91\x12\x5d\xd6\xbc\x88\x57\x32\x87\xdb\x69\xbc\xee\xd2\xf7\xd4\x7e\x0e\x3e\xfc\x90\x5b\x28\x3b\x6e\x41\xc5\xc7\x6e\x74\x79\xbe\x73\xc5\x09\xe3\x9a\xff\x2a\x69\x16\xfc\x4e\x79\xbf\xae\x01\x16\xd8\x70\x01\x6c\x1a\x60\x16\xfe\x51\xbc\xfa\x2f\xd7\x7e\x0f\x19\x59\x4b\x3f\x8e\x70\x79\x87\xdc\x8c\xad\xf1\xf8\x15\x21\xaf\x88\x31\x99\xf6\x71\xac\x1d\x07\x8b\xc6\xd9\x03\x10\xd6\x1a\x88\xc8\x6b\x33\xd2\xff\xdf\x22\xba\x2f\xdf\xe6\x89\x3d\xc9\x18\x4f\x04\xf4\xa4\xc8\xf1\xcb\xc3\xfe\x62\xac\x5d\x8c\x60\xbf\x88\x4c\x1e\xbf\x6c\x9a\x5e\xf1\xdb\x2f\xed\x1c\x3f\x98\xcf\x25\x31\x6c\xd9\x6e\xbf\x38\x9c\xbf\x18\xeb\xff\xb1\x08\x06\x70\xda\xe3\x6f\xbf\x69\x86\xbd\x14\xaf\xc9\xd6\x6e\xbf\x10\x8b\x9e\xa9\xe8\x99\xdc\xae\xc9\x98\xfe\x0b\x75\xc7\x8e\xaf\xc5\xd6\x45\xef\x98\xbf\xd0\x9d\xce\x2f\x5f\x11\xa1\xb3\x13\xe9\xbf\x2c\xa4\x8f\x1a\xa5\xcf\xab\x9f\x9e\x61\xfe\x4b\xc3\xf1\xb5\x98\xde\xbd\x20\x32\xcf\x28\xfd\xcf\x8f\xe8\xd0\x28\x9f\x9c\x17\xec\x6d\x19\xd5\x18\x7e\x02\xeb\xc5\x86\x31\x7e\x06\x6d\xe2\x17\x17\x19\x26\xe6\xce\xeb\x27\x93\xe4\x91\x78\x70\x3f\x31\x80\x82\xa0\x9f\x0c\x4f\xcd\xe6\xee\x04\xdf\xdd\x04\xfe\xe7\x79\xf0\x63\xb8\xe0\x79\x78\xc4\x26\x78\x16\x58\xa7\xdd\x23\x96\x6f\x7f\x19\x07\x9f\x04\x73\xc5\x05\x53\xd8\x67\x3e\xf3\x25\xc0\x17\x70\x4c\xa7\x6c\x56\x16\xdd\x3c\xac\x6a\x40\xb5\xb3\x59\x60\x83\xb2\x08\x79\x28\xc0\x86\x5b\x13\x70\x39\xf9\xfb\x89\x89\x89\x89\xe7\x9f\x7e\xfa\xe9\xa7\x27\x3f\x77\x5c\x66\x8c\x9e\x03\x16\xc3\xbf\xdf\xb6\x45\x67\xee\x59\x78\xe2\xc8\xeb\x4c\x56\xb4\xb9\x0a\xcf\xf1\x5a\xa2\xcc\x32\x34\xac\x1b\xa6\x05\x18\x58\xb5\xcc\x7c\xb7\xfd\x62\xff\xa5\x3b\x96\x18\x8f\x62\xbf\xe8\x3a\x9e\xd3\x49\xff\x9d\xef\xc6\xf6\x91\xdc\x21\x8b\xf9\x18\x1e\x6a\x8f\xbf\x24\x82\x9f\xa2\xeb\xb8\x38\xe4\xdb\xa0\xa6\xc8\x8b\xcf\xb4\xc7\xc7\x70\xac\x80\x62\x44\x4c\xec\x04\x14\x57\xdd\xdf\x11\xe7\xd2\x37\x2b\x35\x30\x32\xdc\x83\xc2\x42\x47\x07\x7b\x86\xfb\x86\x17\x8e\x0c\xf8\x95\x77\x3b\x7a\x1e\x07\xda\x1d\xd1\x99\xfd\xc2\x45\x00\x5d\x55\xc4\x79\x8b\x4b\x68\x6a\x5e\xd4\x69\x47\x10\xb3\xb4\x6b\x52\x20\x6d\x42\xda\x86\xac\x04\x58\xa7\x62\x56\x69\x98\x57\x4a\x02\xa0\x24\x93\x4d\x94\xf4\x82\x62\xd2\x45\x49\xce\xd2\xae\x0e\x58\x13\x66\x35\xb7\x2c\x02\xcb\x84\x79\x13\x64\xd3\x50\x55\x2c\xbe\x4e\x9a\xac\xe4\x16\xaa\x59\x33\x2b\xaa\x40\x70\x38\xc6\x33\x45\x24\x83\x13\x01\x63\x71\x65\x53\x37\x4a\x2e\xc7\xf2\x6e\xbe\x46\x9b\xb4\xa8\x02\xa9\xc8\x15\x60\xb1\xc6\x59\xb4\x02\xf8\x02\x9d\x2d\x2a\x92\x69\xfa\x6b\x24\x47\x65\xcb\x9e\x95\xb1\xb5\x6b\xcb\x9c\x45\x9d\xb2\x71\xe7\x6f\x63\x7b\x56\x6b\xad\xdd\xee\x07\xd1\x1d\xb4\xd5\x2d\x0a\x07\xf2\xc8\xaf\x75\xf8\x8d\x8e\x7d\x2e\xc6\xf6\xd5\xd9\x9d\xeb\xfa\xa5\x2d\xd3\xfa\xfb\xb9\xf9\x27\x3b\xe4\x6c\x0c\x83\x8e\x9f\x15\x19\xa7\xad\x7b\x73\xbb\xd1\xcd\x9a\xdd\x1f\x0f\xe6\xf4\x09\xf4\x1e\x2b\xd6\xfe\xf8\xf0\x63\x79\x6c\x59\x2d\x82\x81\x3b\xe5\xc0\x99\x33\xc8\xb1\x33\x42\x9c\xb3\x0a\xe9\xbb\x7e\x74\xf6\x86\x81\x56\x6a\xd3\x96\x23\xfa\x70\x90\x1a\x5a\x0c\x7a\xe7\x05\x87\x86\xdd\x54\x5f\xd2\x9e\x3d\x72\xdb\xc2\xd4\xd3\xe9\x55\x3f\xdd\x70\x01\xdc\x70\xe4\x13\xf6\x6d\x1b\x6e\x4b\x25\x86\x0e\x69\xc9\xfc\xc1\xfc\xda\x69\x38\xf6\x52\xf7\xb5\x93\x06\x2f\xdd\x72\xd2\xdb\x8f\x5f\xa2\x82\x0a\xfc\x11\xfc\xcb\x75\x4f\x5c\xfb\x01\x50\x92\x66\x93\x37\x13\x55\xb0\x2e\x44\xb1\xa1\x3e\x68\xcf\x9b\x9b\x41\x9e\x8e\xce\xa0\xb7\x16\x86\xf4\x97\x63\xed\x23\xe1\xda\x3b\x31\x8c\xb3\x20\x66\xfb\xb5\xdb\x87\xa7\xe9\x9b\x39\x1e\x6e\x58\xfb\x74\xd8\x2e\xc5\xe4\xe6\xe9\x9d\x76\x4f\xd0\xde\xae\x8f\xc6\xfa\x36\x6a\xa0\x87\x76\x75\x5f\xbf\xed\xeb\x63\xeb\xa7\x67\x72\xdb\xc7\xba\xf0\x6e\x9b\x7f\xd8\xee\xf2\x6b\xe3\x6f\x66\xe8\x3f\x3f\x6c\xb7\x63\xed\xa7\x86\xed\x17\x44\xf0\xf4\xd2\xdd\x6f\x7d\x28\xcb\x63\x4b\x07\xe2\xfb\x2c\x78\xb7\x53\x66\xe0\x41\x74\xd7\x13\x4b\x62\xda\xd4\xf5\xa9\x22\x3a\x8b\x3e\x16\xdd\x97\x3e\x03\x61\x44\x14\x0f\x8a\xd8\x6e\x31\x18\xed\xc7\x7d\xc6\x6b\xe5\x6c\xf3\xa3\x84\xba\xd9\x52\x09\x6b\x3d\x38\xe5\x17\x37\xbb\xf0\xd9\x65\x6b\xbf\x74\x1d\x9d\x5a\x9f\x5e\xf6\xd9\xbf\xfe\xe1\x0b\xf0\x43\xb6\x0d\x2f\xc7\x05\xb7\x00\x26\xe4\x3a\xac\x0a\x00\x83\x6f\x81\x9a\x8d\x63\x36\xa8\xc1\xac\x0d\x31\x1b\x66\x13\x14\xd4\x64\x53\xb7\x55\x28\xd3\x59\x5a\xab\xb1\xb0\x61\xf3\xbc\x9c\x38\x6c\x92\x27\x7e\x64\xc2\xa2\x66\xca\x16\x9f\xf8\x73\xa9\x54\x2a\x99\x95\x4a\xa5\x82\xe8\xaf\xc4\x70\xcc\x49\x33\xec\xab\x13\x23\xb8\x2a\x6a\x57\xbc\xd3\xbd\x7d\xfc\x84\x69\x34\x43\x7c\xf5\xcc\xdd\x61\xbb\x16\xeb\xcf\x84\xfc\x66\xc4\x30\xf8\xd0\x0c\xeb\x9b\x8b\xed\x8b\x76\xfb\xbc\xae\x6b\x95\x7b\x05\x49\xb9\xf1\xb9\x11\xd9\xd4\x7e\xe7\x41\xb4\x8e\xa9\x10\x23\xb7\x73\xad\x1f\x8d\x9d\xe2\xdf\x88\xea\x45\x77\xde\xfa\xfc\x08\x2f\x3f\xca\x2b\x35\xb4\xb0\xdb\xfa\x81\x5c\xb2\x78\x88\xc7\xbd\x1f\x84\xf7\x23\x61\xdb\xc9\x39\xb6\xdd\x74\x51\x8e\x3d\x57\xea\x84\xcc\x47\x5b\xf8\x98\x85\xeb\xd6\xc6\x49\x3e\x51\x9c\xe4\x93\x7b\x50\x3a\x3d\x70\x77\x04\x2e\xc7\x64\x79\x40\xaf\x39\x33\xd0\x65\xa0\xf3\xfd\x9f\x53\x63\x72\x39\x94\x3b\xc1\xbb\xd3\x9d\xba\x02\xd9\x0d\x48\x63\x64\xc8\x57\xc4\xbe\x4b\xbb\xe8\xf4\xd9\x33\xc8\xaa\xe3\x67\x90\x0d\xc7\x75\x3e\x23\x68\xff\x68\xa7\x4c\x0a\xe6\x74\x6c\xd8\xae\x47\xb1\xe2\xce\x5f\xcf\x30\xfe\x31\x61\xbb\x1c\x9b\xe7\xd1\xe1\x3c\xd9\xd8\x73\xb3\x81\xdf\x43\x9b\x3a\x27\xb5\x99\xd4\xb0\xde\x20\xc6\xb6\x2b\xfa\x4b\x06\x71\x61\xc4\xac\x14\x99\x22\xe7\x83\xa3\xfa\x8f\x5a\x04\x5a\x91\x61\xc9\x48\x3c\xb1\xde\xb9\xb2\xe4\x0d\x02\x7c\x0d\xde\x45\x5c\xd2\xdc\x07\xe8\x85\x37\x31\xef\xd3\x9f\xbd\xf9\x96\xe6\xb7\x89\x45\xf0\x35\xf8\x14\x4b\x90\xf8\xfc\x2f\x4a\xd7\xe9\x4a\xf3\xe3\x97\x71\xfa\x7c\x29\x59\x0e\x57\xfc\x8d\xa7\x73\xbd\x70\xd5\xb3\xf0\x27\xd7\x9f\x77\x1d\x01\x32\x76\x32\x93\xf9\xfa\xff\x3d\x0b\x1e\xed\x3d\x6c\xe3\xce\x33\x1f\xbb\xee\xca\xeb\xce\xfd\xc4\x2d\x17\x5f\x77\x5d\x57\x5a\xf4\x4f\xa3\xd1\x20\x6a\x3f\x2a\xf4\x0d\xc5\xd7\xa0\x2f\x5c\x1b\xc3\xe7\x23\xfb\x22\xb4\xf2\xd3\x70\x7f\xd0\x7f\x56\xc4\x7f\x86\xfa\xef\xb9\xbd\x2d\xb7\x83\x7a\x1a\x4e\xb0\x87\x8e\x43\x35\x9c\x3c\x69\x37\xdc\x33\xd8\x0a\x32\x88\x57\x28\xef\xa6\x77\xc1\x08\xda\x41\xf7\x3b\x4e\xf3\xbf\x08\xda\x26\x18\x57\x00\x0c\x28\x4a\x10\xc5\xeb\xd4\x21\xab\x80\x02\xc8\xba\x52\xb6\x53\x03\x13\xef\x5a\xe0\x31\x97\x91\x2c\xcb\x84\x75\xdd\xc9\x03\xd1\x2d\xe2\x3c\x2c\x15\x0d\x1b\xa4\x13\x4c\xdb\x89\x14\x95\xf1\xdb\x51\xdd\xcf\xfd\x6f\xcc\xb0\x9f\x7a\x67\xc0\xb5\x99\x88\xfd\xd9\xe6\xd1\x5c\x1e\x79\x54\x77\x3f\x1a\xd0\x3a\xce\x77\xad\xfc\x72\x42\x7c\x0d\xf6\x7f\xd0\x9d\x4f\xf7\xfe\xa9\x13\x93\x05\xe3\x50\x33\xcc\xe9\xc8\x19\xf6\xc7\x47\x02\x4c\xf4\xc8\xd4\x17\x52\xcf\x93\x22\x92\x6c\x43\xed\x88\xeb\x20\x40\x13\xc5\x5a\x77\x93\x68\xe4\x99\xa6\x6b\xc0\x6c\xc2\x81\x3a\x9e\x6e\xd4\x00\x87\x9b\x90\xc6\x0d\x57\x83\xc7\x4f\xf3\xf8\xdc\x6f\xaa\xd9\x9a\x05\x79\xcb\x22\x4a\x4c\x93\x02\x45\xe2\x07\x51\x41\x96\xc0\xf4\xa9\xe3\x90\xdf\x2c\x89\xf2\x8a\x2c\xc1\x30\x7f\xf3\x00\x14\xf3\x9c\x1c\xea\x41\xf7\x2b\xd0\x05\xb0\xa3\x30\x94\x1e\x13\x27\x07\xe7\x60\x04\xe8\x1b\xc8\x0d\x25\xba\xea\xcb\x65\xaa\xe8\x08\x8a\xfb\x41\xa5\xce\xd5\x61\x5e\xc4\x6b\xb8\x2d\xc2\x12\x2c\x51\x0c\x6e\xbb\x86\x00\x18\x2d\x4b\x5b\x69\x45\x76\xa0\xa1\xb8\x0a\xae\xd2\x14\xac\xba\xc5\xce\x99\x7f\xd7\x2e\x0a\x25\x1b\x7c\x0c\xb2\x82\x69\x5a\x8a\x9c\xe0\x18\xd3\xe0\xd8\x82\x69\x56\x61\xc3\xb6\x19\xd8\xc8\x03\x09\xb0\xc0\x68\x18\x79\x06\x97\xdb\x2f\x35\x1d\x67\x07\x54\x3f\x02\x61\x03\x19\xed\x13\x0d\x55\x3c\xc9\x61\x27\x62\xa7\xfa\xb9\x5b\x47\x06\x46\x06\xe6\x05\xef\x01\x7c\xc3\x85\x4c\x0d\x50\x6d\x27\x5c\xa6\x27\x89\x2e\x36\xf5\x0c\xe0\x8e\x6d\xbb\x65\x9c\xc5\x31\x1b\xe7\xdd\xa2\xed\xaa\x96\xa3\x81\xb4\x65\x53\xd9\x44\x81\x77\x8a\xa6\x49\x3b\x96\x26\xb1\x93\x18\x91\x6f\x8a\x16\xae\xbb\x3a\xa9\x41\x41\xb5\xf2\x79\x4b\x9d\xc2\x4a\xaa\x5e\x00\x59\x8e\xa1\x5d\x0e\x4a\x26\x65\x51\x12\x28\x03\xa7\xec\x96\xcc\x20\xe6\xd2\x88\xe9\xc2\x0f\xcf\x80\x75\x3e\x14\xec\x6f\x7d\xea\x22\xf4\x3e\x49\x94\xf3\xf7\x1c\x0c\x43\x8e\xe2\x79\x49\xff\x16\x5e\x57\xf9\x89\x5e\xac\x6d\x92\x0d\xfa\xce\x26\xf4\x73\xd0\x7b\x75\x3c\x03\xb2\x80\x92\x60\x0d\xd6\xc0\x58\xf8\xab\xbb\xb9\x73\x89\xc0\xdb\x13\x59\x3a\x71\xf7\x53\x3f\xbc\xfc\x01\x7a\xd3\x85\xd7\xd3\xcc\x3b\x4f\xb9\x3b\x1f\xc1\x97\xae\x81\x7f\x79\xc0\x9d\x7c\x00\xfc\xe1\xae\x3f\xad\xf9\xf5\x2d\x60\x0e\xfe\x92\x98\x37\x0b\xd2\x00\xfa\x99\xf8\x78\xb8\x54\xbf\x39\xe1\xcc\x33\x9b\xdf\x83\xdf\xcb\x6e\x3b\xfa\x9e\xad\xf8\x80\xfb\x53\xf8\xa9\xcf\x81\x87\xc0\xdb\xf0\x36\xf8\xb3\x87\x40\x1a\x9c\xbb\x7b\xdd\x3d\x3f\xed\x86\x65\x0e\x0f\x7d\x05\x4b\xd1\xbb\xcf\xf2\x39\xb7\x15\x5d\x18\x0b\xd7\x03\x7d\xc4\x51\x7d\xed\x1a\x5d\x23\x0b\x86\x50\xad\xba\xae\x48\xa1\x66\xd2\x34\x28\xa0\xf0\x3c\x43\x84\x05\x49\x95\x14\x49\x42\xe1\x79\xc9\x5f\x95\x8b\xba\x26\xf3\x59\x59\x62\xd8\x52\x05\x5a\xd6\xe4\xcf\xa6\xd9\x1b\x05\x56\x16\x9b\x36\x2c\x9b\x75\x5c\xb5\x24\x45\x57\x44\x81\x97\x01\x0f\xd8\x27\xe0\x86\xef\x39\x4f\x3d\x31\xfb\xa9\xd9\x17\x5c\xfc\xc4\x4f\xc1\x7d\x93\x6a\xf2\x18\x60\x44\x7c\xe8\x53\x53\xd8\x83\x53\x67\x45\x70\xd9\xd0\x2b\x87\x4d\x4d\xc2\xc7\xa8\xa5\x6b\x7f\x71\xe8\x6d\xfe\xba\xe1\xbf\x05\x72\x24\x8a\xc5\x72\xbb\xd0\x0d\xf4\x5d\xe7\x75\xd1\xfd\xb9\x9d\xfb\x11\xa5\x0e\x0b\xe4\x55\xcb\xd7\x82\xe2\x6f\x27\x6e\xeb\xb4\x31\x7c\x5e\xdb\x79\x6c\xc4\x97\x16\x69\x77\x7e\x37\x83\x1c\x4b\xcf\xc0\x9b\xa9\x48\x3b\xc2\x11\xce\x97\x3b\x30\x4f\xec\xb9\xe3\x64\xd8\x5f\x6d\x8f\x93\x21\xb7\xb7\x7d\x1e\xba\xdf\xfe\xfc\x44\x6c\x1c\xb5\x35\xce\xc4\xcf\x51\x5e\x86\x37\x3a\x7d\x96\x68\x7c\x5f\x0a\x90\xe3\xc9\xf8\x3b\x20\x5c\x35\xb4\xfb\x8d\xa9\x3a\x5c\x9e\x21\xf7\x3f\xd4\x15\x67\xe7\x76\xfa\x15\x96\x12\xd3\xbf\x4b\x91\xe3\x44\xf8\xbc\x40\x4f\xec\xf8\x59\x4c\x77\xc5\xde\x87\x22\xc7\xf1\xee\x3a\x7c\xe7\x12\xac\xeb\xd9\xc1\x38\x98\x81\xee\x58\x77\x9f\xe4\xd8\x54\x84\x2e\x3e\xdd\x7b\x3a\xe8\x2e\x45\xdf\x6d\x62\x1f\xfa\x16\x0c\x31\x78\x64\xac\x9d\x6a\xcc\x4f\xa7\x67\x72\xce\xd5\x11\x5c\x91\x6a\xad\x39\x46\x61\x47\x85\x51\x90\x67\xfb\xe8\x22\x76\xd8\x93\x44\x75\x21\x02\xa5\xd2\x2a\x2d\x85\xc0\x7b\x97\x0d\x48\x25\xeb\xae\x24\xe7\x15\x89\x56\x55\xd5\x95\x40\xd6\x28\x96\xb4\x5a\x82\x29\x16\x35\xa7\x02\x57\x59\x16\xc0\x0b\xae\xd0\x7c\x93\xac\x1e\xa4\x3f\xd2\x29\x8e\x70\xdd\x82\x8c\x2a\x65\x6d\x5a\x00\x45\x51\x84\x0d\x4b\x2d\x14\xad\xb2\x5e\x2e\x12\x6b\x5d\x0b\x6c\x33\xff\x62\x11\xbf\x9f\xa6\x27\xec\x4e\x3e\xd9\x23\x05\x77\xa2\xce\x44\x35\x63\x3d\xdc\x34\x18\x64\x49\x43\x37\x87\x92\x03\xa3\x03\x7e\x6e\x00\x32\x85\x84\x2c\x72\x65\xf9\xc5\x30\x46\x67\xd0\xd8\xfe\xf7\x46\x06\x12\x22\x9e\x86\x98\x2b\xe0\xe9\xb4\x5b\xc7\x29\x07\x77\x5c\x7e\xe1\x27\xc1\x1a\xfc\x4e\xd6\xd5\xa0\x50\x85\x22\x0f\xd4\x52\xc5\xd4\xad\xf2\x27\x4f\x75\x65\x3c\xdf\x2c\x4d\xc3\x54\x55\x1c\x43\x43\x50\x6e\x1d\xbf\xf8\xb9\xe7\x9e\xc3\x87\xbf\xe3\x7e\xb6\x71\xfb\xba\x59\x8f\xcf\xfa\xf2\x17\xcf\x7a\xe4\x54\xe5\xbe\x2f\x0a\xcf\x7d\xea\xbe\x5d\xf8\x1a\xb0\x3e\x14\x31\x10\x5f\xbd\x7a\x75\xc8\x1b\x11\x5e\x1a\x73\xbb\xfb\x33\xc6\x9a\x9d\xb8\x12\x71\x4b\xee\x15\xd0\xe2\x82\xe9\xfb\x7e\xd7\x69\xdd\xf7\xf7\x81\x13\x02\xbb\x3c\x78\x06\xd6\x8b\xce\x6d\xd0\x9d\x9e\xee\x08\x1f\x11\x16\x60\xa1\x45\x1e\xe5\xa9\x85\x23\x3d\x03\xb3\x01\x9e\x6a\x55\x6a\x30\x81\xe5\xe0\xb2\x03\x2c\xa8\x38\xae\xed\x40\x85\x50\x1d\x16\x18\xc0\x94\xa1\x04\x35\xa8\x43\x5e\xc2\x75\x28\xe2\x9a\x83\xab\xae\x29\xe9\xa2\x48\x4b\x22\x43\xbb\x46\xcd\x2a\xd5\x0d\x90\x4e\x70\xa5\x92\xe9\x54\x92\x15\xdb\xb6\x6d\xab\x50\x28\x16\x05\x8e\xad\x6b\xb6\x09\xb2\xb0\x66\x99\x35\xa8\xd7\xeb\x16\xe4\x54\x54\xa6\x91\x03\xb6\x20\xc2\x9a\xa9\xe6\xcb\x4e\x55\xab\x94\xdb\xef\x6b\xb5\xf1\xc6\x8e\xa7\xc2\x5d\x97\x6c\xe1\xd7\xb0\x4e\xd8\x69\xdd\xdf\xb9\x7f\xa0\x6f\xb0\x67\x5e\x7f\xb2\x67\x70\x24\x91\x1c\x9a\xd7\x83\xd8\x05\x1d\x61\xce\x9d\x37\x32\xa0\x81\xb2\x8d\xb3\x36\x28\x43\xd6\x76\xcb\x36\x64\x19\x32\xdf\x00\xe9\x2c\xac\xe6\x5d\xc7\x15\x68\xc0\x4c\x61\xc0\x21\xe4\xa6\xed\x7d\x40\x05\x18\x4d\x3b\x59\xce\xe7\xf3\x79\xc4\x01\x25\xb3\xd9\xc8\x9a\xf4\x14\x56\xe7\x59\x9b\x22\xd4\x62\xd1\xad\x97\xdc\x1a\xcd\xe8\x2d\x39\xc5\xc5\xe4\xc8\x64\x77\x7b\x72\xec\x50\x80\x39\x5a\x77\x21\xfb\xb0\x79\xd8\x59\xd8\xc7\x30\xac\x77\xb8\x67\x78\x61\xcf\x30\x95\x0a\xce\xd9\xfc\xd4\x73\xd1\x73\xb8\xd6\xb9\xdc\xbf\xee\xd5\x33\xd8\x33\x50\xb0\x75\xc6\x4a\x53\x8e\x05\x0d\xa9\x21\x59\x52\x85\x50\xad\xbc\x55\xb0\x60\xde\x82\x85\xa6\x69\x6b\x8c\x95\xce\x16\x2c\xa8\xa1\xbf\x96\xa2\x7f\x4d\xd6\xa1\x2e\x82\x02\x2c\xa7\x35\x09\xe8\x6e\xbd\xa8\xa8\x82\x8a\x53\x50\xf3\x36\x0b\x30\xdc\x5a\xb5\x0a\x6d\xa8\x4b\x20\x0f\x2b\x69\x4d\xf6\xba\xe4\x55\x8d\x57\x70\x0a\xea\xa0\x02\x19\xaf\x01\x15\x4e\x8e\x62\x8e\x1d\x23\x11\x3f\x78\x0a\xd3\xa6\xce\xeb\xf0\x49\x1c\x8f\x9d\xee\xcb\x3d\xe4\x93\x68\xf9\x23\x02\x9f\x84\x9f\xac\x07\xeb\x26\x14\x08\x2a\xc1\x4c\x56\x08\xef\x47\xd2\xb2\x88\xe7\x2c\x0b\x9e\x63\xdb\x6e\xaf\xc5\x49\xb6\x20\x8a\x20\x3d\x85\x4d\x3b\xce\xdb\x68\xc1\xdf\x5b\xf8\xc5\xae\x8c\x6f\x75\x15\xe2\xca\x43\xb5\xe4\x05\xac\x6d\x37\x59\xbc\xaa\x88\x16\x60\x71\xab\x0b\x0e\x6e\x9f\x51\x3f\xd4\x5d\x9f\x8c\x1d\xec\xd4\x7d\xfe\xbe\xdd\x54\x8a\xd8\xa2\x88\x0f\x36\x7d\xbf\x43\xff\xf2\x51\x7d\xe8\x9c\x1a\xfa\x1c\x55\x5f\xae\xbe\x7a\x3d\x16\x3f\x33\x0c\xf8\xcc\xb9\x21\xa6\x27\xd5\xf8\x59\xd9\x8e\xe8\x7c\x50\x8d\xb4\xfd\x28\xae\x6a\xac\x81\x75\xec\xb7\x89\x5f\xb5\xf1\xfd\xd8\x3f\xbb\xe9\xd6\xed\xc3\x11\x3b\xd8\x42\xfb\xd0\xcf\x76\x32\xc3\x2e\xec\x89\x55\x03\x6f\xe5\x49\xd4\x41\xd1\xc6\x79\x1b\x14\x21\x6f\xbb\x45\x1b\xf2\xe5\xa4\xec\xda\x84\xd0\x2c\x38\xcd\x22\xc1\xbb\x4e\x58\xab\x2f\x59\x47\x3b\x4e\xd3\x34\xad\xe8\x32\xa6\x09\x6d\x20\x9b\x26\xc8\x5b\x50\xb0\x02\xda\xc4\xf1\x05\xba\x09\xe8\xa1\x8c\xe9\xf2\x74\xec\x1f\x11\xfa\x44\xdb\xff\xaf\x93\x0e\x3e\xfd\xc7\xfe\x17\x8b\x9e\xdd\x79\x74\xfe\x41\x17\x5b\x3a\x7c\xb6\xaf\xef\xc6\xfe\x27\x2e\xff\x83\xb1\xfe\x8e\xb5\x65\x03\x6a\x77\xfe\x1d\xeb\x3c\xb7\xcd\x47\xe6\xf4\x41\x77\x1e\x1a\xab\x47\x6c\xe6\xe8\x3b\xfc\x2d\xb4\xbd\xf9\x28\xe6\x5b\xfb\xb9\xd0\x2f\x12\x3b\x73\xd9\xb9\xa2\xab\x8d\xbd\xe2\xe9\x63\xee\xf8\xfd\xf0\x05\xf3\x57\x65\x90\x07\x20\x88\xb5\x69\x3f\x3f\xb7\x0b\xd5\xb6\xdb\xf5\x58\x40\x47\xce\x9f\xf3\x93\x28\x77\xfe\x81\x41\x0c\xcb\x2c\xdd\xb5\x13\xfb\x05\x8f\x9d\xf6\x89\x28\x6e\x0c\xe6\xf8\x57\xac\xe3\x9c\x67\xe2\x37\x1d\xf8\x2e\xd6\x7f\xe7\xba\xb0\x7d\xc0\xeb\x4f\xdd\xfc\xec\x2d\x53\xe4\xd4\x7f\x2c\xfd\xf0\xa2\xdf\x65\x48\x0f\x7b\x47\xf3\x5f\x05\xf4\xf9\x4b\xcc\xe7\xe6\xe1\xac\x4d\x31\xbf\x7b\x87\xed\x33\xd1\xc6\xca\x8c\xdf\xbe\xeb\xa9\xf6\x1e\xc8\x9f\xd7\x95\x8f\xfe\x1c\xae\x41\x10\x0b\x1b\xb5\x11\xf6\xff\xb0\x9b\xce\x9e\x58\x8c\xb5\xcf\x09\x91\xcd\xb1\x1d\xe5\x6f\x0b\x22\x9e\xce\x8b\xcf\xed\x4b\x7f\x6c\x8f\x17\x9c\x67\x85\x79\x96\x03\x5b\xc5\x8f\x6c\xb3\x43\x0c\x12\x59\xdb\x89\x1f\x46\xe6\x17\xa1\xe7\x44\x29\xc6\xff\x7a\x26\xb7\xeb\xf2\xc8\x1c\xfe\xad\x1b\x7d\xc6\xde\xef\x6e\x93\x38\xff\x08\xd7\x52\x8e\xfa\x93\xc6\xfe\x14\xf1\x1b\x45\xd7\xfe\xbf\x23\xed\x91\x3d\xb3\x0d\x49\xae\xb1\x5a\x88\x67\x2c\x52\x0d\x74\xc1\x1c\x6c\x61\xdb\x37\xed\x9f\x2b\x04\xd2\x25\x48\xea\xd0\x83\x72\x4d\x75\x45\xbe\x84\xea\xa9\x81\xab\x09\xa3\xa9\x81\xd5\xb6\x3d\x79\x0d\xe0\x2c\x80\x4d\x61\x96\xa6\x88\x92\xa5\x5a\x4a\x45\x83\x35\xa6\x13\x0b\xd2\x16\xb1\xdc\xc6\xa9\x49\x93\xd8\xd9\x68\x98\x92\xe3\x58\x96\xee\xaa\xb8\x0d\xeb\xb6\x51\x05\x32\x5e\x8d\x86\x69\xa1\x3c\xd3\x47\xa7\x1c\x52\xa3\x56\xec\xbf\x1f\x7f\x6d\xf1\x8d\x23\xb9\xcc\x8a\x67\x4e\xc2\xb6\xf3\xd8\x88\x9c\x21\xf7\xae\x0b\x72\xbc\xf8\x77\x8e\x89\xe0\xf4\x64\x10\x9d\xd6\x85\x6f\x33\x5d\x5e\xb6\x64\x24\x18\x8e\xa7\x77\x21\xf6\x38\x4e\xf3\x87\x9d\x53\xfe\xbf\x24\x7b\xa8\xfc\x42\x2b\x17\x10\xd8\xee\xe0\x79\x57\x24\xb8\x46\x85\x10\x5c\x11\xcf\x27\x7e\xdc\x64\x13\x7f\x0e\xa7\xfd\xb8\x4b\x83\x82\x09\x05\x0b\x7e\x50\x30\x0b\x96\x55\x30\x83\x35\xd4\xa2\xbc\xba\xfd\xc8\x98\x1e\x09\xf7\xfe\xc4\xfd\x68\xad\xde\x0b\xe4\xae\x14\xfd\xdb\x1e\x94\x8d\xed\xc0\x87\x43\xde\x2f\x44\xf6\xe4\x1f\xbb\xe2\xd8\x40\x5e\xe6\x57\xc5\x65\x42\xf0\x9d\x3f\x84\xf8\x00\xd9\x82\x1d\x35\x82\x82\xf3\x27\xdc\x83\xb4\xf3\x00\x32\x89\x5a\x7e\xd8\xf0\x04\xaa\x1b\x5b\x7c\x65\x33\x38\xe9\xdf\x37\xbf\xe5\xfe\x9b\xbb\xf9\x42\xf0\x75\x70\x16\xdc\xfa\xf8\xc4\x57\xd7\xbc\x09\x4b\x9e\x05\x44\xd0\x96\x05\x17\x59\x16\x38\x88\xac\xa2\x2f\x74\xd2\x1a\xff\x3c\x1c\xd8\xf0\x3b\x0e\x4e\xc1\x7d\xca\xc3\x17\xdc\x09\x9a\x4b\xe1\xd4\xd3\xca\x1e\x20\x1b\xf8\x23\xae\x05\xbe\x06\x6d\x70\xad\x89\x0f\xc7\xfd\x10\x6a\x87\x9c\xfe\xaf\xc8\x7e\x8a\xf8\x55\xbf\xe4\x57\x37\xe9\x0d\x68\x1b\x8b\xe5\x18\x7b\x37\x94\x1d\x9c\xdf\xbe\xfd\xc1\x98\xee\xd0\x5b\xed\xbe\x2f\x7c\xec\x9d\x10\x37\xc4\x68\xea\xb4\x6a\x5a\x5f\x32\x75\x65\xea\x05\x8f\x6f\x9f\x7a\x8a\x3c\x7f\xc9\xd6\x8f\xfd\xdd\x97\xa6\xc1\x58\x46\x6c\xbe\xbf\x47\xeb\x40\xb6\xd6\x2e\xb8\xa3\x77\x0a\x76\x1a\x76\x01\x8a\xb3\x1a\xed\x9f\x9e\xbe\xa2\x37\x4c\x5a\x14\xab\x5d\x38\x13\xd7\xff\x0a\xc8\x54\xda\xa6\x40\x31\xab\x69\x8a\x99\x35\x15\x96\xa5\x60\x59\x86\xba\x00\x58\x11\x16\x17\x79\x18\xfc\x69\xfc\x2c\xf7\xbb\x89\x8a\x2d\xaa\xba\x4a\x6b\x3a\x07\x35\xdb\x9e\xd4\xa7\xad\xd0\x61\x97\xc9\x83\x63\xf0\xcc\x77\x33\x2f\x66\x56\xbb\x70\xf9\x83\xcf\xde\x02\x68\xfc\xef\x50\x34\xac\x1f\x4c\x6a\x9a\x67\xcb\xca\x44\xb5\xa9\x24\xe5\x98\xaf\x3c\x8c\x37\x0f\xe8\x57\xed\xb4\xe1\xd6\xaa\xd3\xfc\x21\xd3\xec\xdc\xb1\xff\xec\x2a\x3f\x7f\xd7\xe9\x5b\x09\x34\x0b\x1f\x59\xd3\xe8\x1e\x7b\x00\x7d\xeb\xb7\xa1\xcc\x8f\xec\x17\xdf\x77\x32\xf6\x9b\x38\xf6\x0b\xf6\xcb\x7f\xfc\xab\x3d\x36\xf6\xeb\x70\x3c\xff\x6c\x1c\xe5\xa7\xda\xb6\x2e\xa2\x8f\x23\xe7\x53\xdb\x5e\xf8\x97\x73\xfb\x55\x1c\x43\x21\xa9\xd0\x9a\x45\xa5\xcb\x78\x2d\xbf\xc8\xdb\xe1\x99\x41\x3e\xf4\x17\x91\x2f\xfe\xb8\xbb\x5e\x1e\xfb\x65\x44\x06\x45\xe6\xbc\xfd\xd1\xee\x36\xf1\xd8\x2f\x3a\x7d\x35\x41\xfb\xcf\xc3\xfe\x4a\xb4\xff\xab\xd1\x7a\xfe\xd1\xfe\x6f\xcd\x80\xe9\xdf\x8c\xf8\x88\xcc\xb6\xef\x6f\xec\x8d\xce\xfe\xc1\x38\xe5\x4e\x5e\x09\xc6\xf9\x59\x38\x0e\x17\x6b\xff\x69\xec\x9c\xaa\x3d\xce\x4f\x22\x7b\x3c\x72\x56\x38\xf6\xe3\x4e\x1e\x0d\xfa\x47\xf3\xde\x19\x11\x9e\xfe\x61\xe0\x33\x68\xd5\x75\x3c\x2e\xa8\xeb\xb8\xc8\xb7\xb5\x10\x4a\x3f\xea\x04\x90\x1a\xa0\xe7\x0e\xa5\x3c\x13\xab\x17\xdd\x37\xee\x41\xda\x77\x28\x94\xab\x5d\x7c\x31\x72\x52\x71\x6d\x5c\x71\xad\x02\x48\x03\x9d\x83\x05\xb7\x02\x4d\x43\x16\x0d\x15\x68\xbc\x95\xe5\xed\x8a\x6b\x82\xe4\xdd\x87\xd6\x12\x96\x95\xf8\x83\x69\x1e\x1a\x99\xe6\x83\x49\x8f\xbf\x33\x06\x21\xf5\xc2\xc3\x2f\xac\x5c\x71\xd3\x4a\x90\x01\x37\xd3\x63\xf7\xfe\x68\x36\x2e\xe3\x27\x3f\xb3\xde\xad\xe0\x83\x6e\x85\xb8\x35\x2e\x57\xe5\x96\xcc\xf3\xdf\xfb\xe5\x9b\x42\x9c\xab\x06\x3c\xfb\xd1\x08\x5f\xfe\x20\xa0\x6d\xcc\x0f\x3b\x56\xea\xbe\x67\x3c\x29\x4c\x91\x63\xdf\xef\xc0\x3d\xfe\x7a\x7f\x2f\xb2\x7e\x4e\xbb\x7d\xfb\x71\x5d\x7d\xa5\xe4\xd8\x77\x23\xeb\x11\xe5\x8f\xef\x44\x6c\xb8\x28\xff\x7d\x7b\x06\x7e\xfa\xf7\xc8\xfa\xed\x26\x75\x74\x1b\x78\x3e\xb6\x00\x13\x02\x3f\x7d\x78\x8d\x23\x88\x02\x1a\x98\x93\x1b\xe9\x19\x0c\x2e\x31\xa4\x86\xe6\xb6\xee\x72\x2c\x1c\x45\x97\x39\xc8\x6e\x4b\x89\xff\xd0\xa6\x59\xfc\x79\xf1\x72\xb0\x09\xce\x16\x36\x35\x2e\x4f\xdb\x94\x09\x5f\x39\x68\x0a\xdf\x72\xb7\xa9\xf8\x89\x0e\x5c\x72\x97\x04\xd6\xd0\xf8\x99\x32\xef\x7e\xff\x7a\x0e\xdc\xc2\x50\xf0\x3a\x3c\x03\x3e\x80\xcb\xa8\xe6\x29\x9d\xd1\x1a\xc9\xeb\x47\x47\x97\x3c\x76\xe5\x65\xee\x5b\xf0\x97\xb3\xe9\x25\xeb\xe6\xff\x7c\xc5\xb2\x2b\xc1\xf5\xd0\xd8\x3a\xfe\x19\x90\x01\xf9\xcb\xd6\x4e\x7e\xe3\xb2\x2b\xef\x80\x27\x3e\xbc\x0e\xfe\x15\x64\xd6\x11\x62\x18\xb8\xe1\xd3\xe0\xb6\xa9\x35\xa9\x55\xe4\x88\xb7\xf7\xdf\xff\x46\x86\x5c\x2b\x4e\x9e\xd1\x55\xf6\x7d\x2b\x42\xfb\xc2\x34\x7f\x6c\x31\x8e\x79\x03\x9c\xfa\x7a\xe7\x7e\x0e\x64\x5f\x23\x94\x23\x52\xcc\x1e\xfb\x66\x57\xbd\x4d\x8e\x7d\xa3\xd3\x16\x0f\xe6\xf4\xf5\x4e\x9f\x7d\xd0\xbf\x5d\x3b\xd6\x8c\xc6\x75\x6c\x3c\x1b\xeb\xe6\x3b\x6a\xf1\xe2\x57\xe3\xcf\x46\xad\xb9\x3d\xb3\x22\xf6\x41\xa7\xde\x9e\x6e\xef\xf8\xfc\xdb\xaa\x19\x74\xf3\xd4\x40\x6a\x9b\x67\x53\xbd\xd2\x37\x35\x05\xbf\xc8\x2f\x3f\xeb\x1f\xd4\x8a\x67\x3f\x5e\x2f\xf0\xec\xd9\xd9\x4c\xfc\x6c\x21\xca\x9f\x5f\x09\xce\x8a\xda\xbe\x47\xb6\x9d\xb5\x30\xce\x4e\xbd\x41\x06\x4c\xbf\x2e\xf7\x70\xdf\x00\xf2\x42\x0e\xfa\x09\xae\xa2\xa8\xbd\x55\x3e\x6a\x74\x40\x07\x15\x1b\xd4\x6d\xd0\x80\x69\x1b\x52\x36\x64\x14\x5c\x91\x79\x9b\xe5\xf0\x34\x2b\x6a\x12\xaf\x55\xdd\x0a\x48\x03\x43\x84\x14\xac\x68\x0d\xb7\x21\x00\x3b\x0f\x59\x1e\x94\x1d\xef\x9b\x45\xc8\xdb\x30\xcb\xc1\x86\x5e\xe5\x20\x1f\x44\x1c\xd8\xb6\x6d\xc3\x8a\xa2\xf3\x92\x28\xf0\xa2\x20\xf2\x28\x75\x17\xa0\x60\xcd\xb0\x14\x1b\x32\xf9\x7c\x3e\x6f\x41\x11\xe4\x61\xbd\xa0\x58\x25\x2c\x85\x49\x53\x57\xa0\x3a\x05\x9e\x1d\xe2\xa3\xf6\x61\x54\xf9\x33\x44\x96\xfe\x94\x3f\x82\x42\xec\x46\x23\xa8\xb3\x1b\xa2\x6f\x55\x92\x88\x26\x73\x25\xbe\x67\x9a\x90\x4d\xb0\x93\x65\x78\x7b\x8a\x87\x9c\xe5\x96\xa9\x52\x83\x2f\xd9\x94\x5b\x4b\xfc\xd1\xb2\xdc\xb3\x4c\xd3\x75\x3b\xbd\x55\x0c\x6e\x71\xac\x99\xa5\x09\x15\x72\xe5\x68\x42\x57\x5a\x00\x72\x15\x52\xc4\x5a\xb7\x01\xae\x32\xe1\xdf\x5e\x84\x07\xc0\xc7\x9e\xdd\xd6\xf3\x64\xe6\xaa\xab\xc0\x99\xd0\x06\x2a\xb4\x93\x77\xdd\x71\xc7\x1d\x77\x8c\xad\x58\x71\xc7\x1d\xef\x70\x02\xcb\x30\xa6\x25\xda\x3a\x48\x37\x4c\x43\xb1\x62\xe7\x34\x73\x90\xcf\xf5\xef\x68\xb5\xbf\x1c\xc8\x22\x26\xa6\x0b\x0f\xcc\xc0\x5b\xfb\x43\x9e\x89\xf9\x0c\xb6\xa1\xdb\x59\x63\xfb\x42\xff\xb7\x9f\xeb\x66\x5f\x44\x3e\xbf\x1a\xee\xc5\x7c\x64\x2f\x66\x3b\x9f\xb3\xf5\x17\x88\xe3\xe7\xcc\x20\x23\xf7\x86\xfd\xb3\xb1\xbd\x90\x8f\xcc\x0b\xed\xf5\xad\x9b\x22\x7e\xae\x57\xe2\xf3\x0a\xc6\xda\xd3\xe9\x2b\xf2\xdb\xb7\x0e\x47\xf6\x75\x94\x26\xbb\xbb\xe3\x92\xfd\x2d\x1c\x20\x40\xa5\x2d\x37\x32\x43\xfb\xfe\x0b\xc3\xa0\x91\x49\xed\xfd\x12\x86\xc1\x46\x0c\xc3\xfb\xb4\xdc\x15\x3b\x2f\x6a\x3f\xc7\x2f\x72\xfb\x21\xec\xc6\xa9\x4b\x52\x9b\x03\x1e\xf5\x6c\xa3\x7e\xec\xb8\x30\xef\xf0\x85\xed\xfa\xa9\xf3\xc2\xfa\xa9\xbe\x77\x9f\x88\xa4\x09\x04\x7e\x71\x71\xc4\xd3\xfd\x61\xad\x93\x64\x6a\x2e\x31\x18\x49\x42\x47\x7c\xd8\x34\xc1\xcd\xa6\x39\x39\x95\x62\x1b\xe5\xc4\xff\xae\x19\x39\xdf\xf8\xb8\x2b\x5e\x7c\x8a\x7e\xea\xd9\xf3\x14\xde\xe2\x94\x44\xd5\x12\x24\x4b\x99\x3c\x03\x85\xb5\xac\x34\x4d\xf7\x48\x72\xdf\xc1\x4b\xc6\x92\xf7\xb8\x4f\x50\x69\xe2\x78\xf7\xa9\x12\x78\x8f\x73\x7f\xf0\x37\xee\x75\xf7\x41\x11\xcf\xe5\xdd\xbb\xf1\x3f\x64\xd3\xee\xf3\xe4\x4d\x6e\x19\x1f\x76\xcb\x8f\x99\x67\xb3\x79\x5d\x34\x34\xdd\xe2\x6c\x0d\x3f\x42\xb7\x25\xcb\x10\xd8\x82\x26\x9a\xee\x7f\x58\x2f\xb8\x65\x7c\xe4\xa5\xb1\x27\xf8\x53\x37\x3e\x33\xfa\xf2\x28\x18\x85\x5f\x3e\xf5\x85\x8f\x16\x37\x9e\xca\x77\xc3\x81\x3b\x42\x1c\x30\x92\xda\x10\xb6\xdf\xbc\xf7\x58\x8c\xc0\x6f\x59\xf2\xe8\x19\x2b\xa9\xa5\xfb\xbf\x51\x7f\x87\x7f\xfc\x8c\xa7\x3b\x78\xeb\x91\x18\x6f\x75\xfa\xae\x26\xa6\xe1\x3f\xd4\xbe\x35\xd3\x7d\x2f\x6c\xfd\x6c\xa7\xaf\xcb\xdf\x0b\x88\xf3\xc8\x31\x27\xc4\xaa\x6d\xfe\xcd\xed\x40\x59\x98\xc6\xb6\x87\x3e\x47\x3b\x82\xdf\xb6\x85\x3c\x1f\xc4\xca\xac\x5d\x81\xee\xea\x0e\x4e\xf3\xcf\xa0\xe7\x3f\xfb\x4e\xd7\xe7\x93\x63\x5b\x3b\x71\x75\xf0\x7e\x2f\x77\xf5\x37\xe6\x76\xa1\x6a\xb1\x63\x5b\x3a\x30\xa8\xcf\xa3\xd3\x6a\x3a\xc4\xec\x84\x4d\x5d\x31\x97\x1d\xd2\x51\x8a\x3d\xff\x4b\x33\xe0\xdc\x97\xba\xfb\xc6\xc7\x5e\x8c\xf9\xd3\xda\xed\x2f\x04\xfe\x69\xaf\xff\x5e\x14\xc7\xd1\x8f\x9d\x8c\xf1\xe8\xb6\xae\xc7\xff\x03\x3d\x47\x25\x10\xcc\xf5\xab\xc9\xf4\x0c\x86\x51\x42\x83\x7e\xd0\xf4\xc2\xcc\xd1\xa0\x6b\xe0\x2a\xe0\x0d\x4d\xd6\x4d\x11\x18\x32\x60\x40\x05\x17\x78\x57\x75\xf3\x45\xcd\x90\x75\xbd\x4e\x3e\x2e\x42\x03\xa6\x89\x12\x54\x4d\x28\xa6\x55\x5d\xd7\x14\x5c\x3c\xf4\x5e\xa7\x0c\x4f\x52\x92\xa6\xe9\x12\x34\x5d\x5e\xe0\xcd\xbc\x22\x9b\xbc\x80\x0b\xf8\x79\x06\x9b\xad\x9b\xae\x82\x5b\xb0\x0e\xeb\xaa\xe2\x3d\x41\x01\x5c\x16\x2c\x57\x55\x55\x35\x15\x45\x55\xc3\x5c\x0e\xed\x77\xdd\x18\xd2\x80\x8d\xd1\xe6\xf9\x19\x30\xe7\x86\x19\x78\xc2\xc2\x3a\xcf\xd7\x51\x1e\xaf\xb1\xf5\xd3\xfc\xb5\x51\x99\xfd\x5c\xb8\xf6\x21\xfd\x33\x68\xed\x33\xe4\x5a\xa5\x8b\xfd\x4a\x6e\xfd\xca\x0c\x58\x69\xdd\x0c\xb6\xcc\xb3\xdd\xed\xd3\xb1\x67\xba\xcb\xda\x97\xff\x18\x8e\x63\xc4\x64\x66\x2b\xd6\x9b\x9f\x52\x02\x7c\xe8\xf3\xef\x53\x33\xd8\x92\x66\xa7\x2d\x19\xf4\xff\x62\xa7\x7e\xdb\x8a\xee\x8c\xc4\xce\x5d\xa2\x3c\xbd\xb6\xd3\xe7\x89\xa2\xe7\x5a\x7f\x1d\x0f\xed\x88\xe8\xb3\xc7\x22\x72\x26\xa2\x0b\xc7\x9e\x8c\xc8\x19\x3f\x67\xdb\x39\x31\x1f\x50\xa7\x1d\xfb\x44\x77\x1d\xb9\x35\x17\x19\xdf\x3f\xd3\xf8\x6e\xdb\xb7\xb0\xff\x8d\x38\x3d\xf6\x3c\xd1\xe1\xf7\x88\xcf\xb5\x55\x53\x6f\xd5\xd4\xa9\xa9\x47\xc9\x1b\xbc\xf6\xc9\xf7\x3d\x99\xb1\xf2\x8f\x99\xd4\xc6\x8d\xc4\xfb\x70\x6b\xd7\x39\x7c\x75\x9a\x8d\xea\xd3\xd7\x08\x6c\x9c\x56\x2c\x44\x6f\xe0\x31\xbd\x68\xa6\x5b\xb0\xad\x8c\xd8\x81\xc7\x14\x15\x56\x0b\x2f\xb1\x0f\xe5\x16\x01\x74\x23\x06\x9d\x3d\x05\x37\x56\x47\x86\x7b\xa6\xc7\xb1\x32\xf6\x64\xdd\xb6\x13\xd4\x64\xdd\xfb\xe0\xec\xd5\x2f\x83\x0b\x72\x0b\x7b\x3e\x73\xfc\x45\xe7\xc1\xd5\xb0\x32\xe7\x42\xb7\xb2\x0e\x3c\xe3\x5e\x84\x7f\xf9\x39\xfc\x5d\xf7\x38\x30\xb1\x8e\x4c\x87\xfb\xb2\xc9\xb8\x0e\xc3\xe0\x52\x45\x81\x45\x05\xd7\xae\xc8\x65\xa8\xec\x7d\x67\x9b\xec\xdc\xe3\x06\x78\x13\x9c\x5f\x04\x69\xed\xee\xbb\x35\xd8\x28\xc2\x6f\x76\xe3\xb5\x2f\x74\x97\xdf\x63\x9f\x0f\xfc\x6e\x81\x9d\x89\x25\xb1\xa3\xdb\xb9\x64\xe7\xcd\x78\x53\x19\x9d\xb8\xcd\x42\x81\x68\x3e\x19\xd0\x65\x10\x32\x11\x78\xe5\xda\x29\x2a\x93\x55\x55\x92\x45\xe5\x50\xbd\x93\x1a\xa5\xa4\x04\x4d\x4e\x2f\xd3\x4c\xda\xa6\x04\x0e\x96\x2b\xfa\x14\x26\xc2\x22\xcc\x8b\x38\xa6\x43\xc5\x4c\x30\x93\x95\xd6\xe7\x2d\x9a\x51\x58\x3a\xb9\x2e\xa4\x46\xa9\xa9\xd4\x69\x9a\x66\x8a\x6c\x83\xe7\x04\x09\x30\x95\x2a\x63\x65\x01\x8b\x9b\x1a\x34\xbc\xff\x63\xd1\x3b\x35\x01\x0d\x1e\x9b\xc1\xe7\xf2\xb9\x69\x36\x11\xa2\xcd\xb6\xf3\x67\xf0\x19\x3d\x1a\xd1\x47\xc6\x34\x7d\xf4\x48\x9c\x87\x0f\xa0\x3c\x36\xfb\xff\x3e\xc3\x58\x6b\x22\xfb\x2a\xaa\xf3\xf4\x4e\xde\x0d\xde\xe1\xb3\x9d\xba\x30\xe8\xff\x99\x69\xb2\xd5\xc7\x07\x9f\x0c\x78\x5d\x8d\xf1\x3a\x8f\x5d\x81\x61\xa0\x7d\xc3\x6b\x61\x6f\xe0\x50\x8d\x66\xa7\x0c\xb3\x01\xa2\x25\x8e\x45\x72\x90\xa9\xa1\x79\x3d\xdd\x4f\x44\x36\x10\x05\xad\xc8\x4b\xb4\x2c\x28\x3c\x05\x6d\x1e\xe6\x25\x40\x73\xb0\x44\x58\x96\x9b\x37\x4d\x5c\x74\xf3\xcd\xcb\x00\x65\x02\x6c\x0a\x53\x15\x5a\xd3\x25\x55\x91\x69\x45\x61\x18\x5d\xe7\x00\x07\xeb\xf4\xb4\x00\x3d\x03\x72\x45\xca\xa4\x64\x40\x41\xc3\xd4\x54\x40\xbb\x15\x57\xe7\x45\xdc\x84\x82\xb7\xe2\xde\x48\x26\x6c\xd0\x59\x8b\xa1\xa1\xa1\xc9\x94\x93\x65\x38\xc0\x64\x69\x87\x07\x0c\x6e\x45\x0f\x53\x92\xd8\xdd\x53\xe7\xa6\x5e\x25\x35\xec\x23\x58\x06\x3b\x09\x65\x7f\x43\xb5\x13\x51\x45\x14\x14\xd9\xd0\xeb\x6d\x73\x70\x94\x0f\x54\x51\xa0\x10\xba\xbc\x9f\x1b\x42\x29\xbb\x93\x47\xf5\x2f\x1c\xed\xaa\xb5\xef\x76\x12\x94\x6d\x4f\x96\xb8\xa2\x5a\x4d\x5b\x09\x7a\xb2\x8e\xa7\x69\x8a\x10\xa0\x29\x17\x40\x16\x18\x2c\x4c\x43\x0b\x96\xdc\x8a\x00\x2c\x90\x2d\xdb\xb0\x40\xf0\x59\x0a\x36\xf2\xd5\x92\x3a\x79\xea\x34\x0f\xf3\x23\x8a\xda\x2c\x01\xae\xa4\x6b\x26\x50\xf3\x06\x21\xb1\xbc\x26\x8b\x74\x56\xa7\x45\x99\x31\x28\x56\x50\x35\x9a\x2e\x88\x2c\x27\x80\x3f\x46\xef\x43\x9d\x32\x35\x2b\xf5\x0b\xf2\x06\xea\xe6\x7d\x67\xbb\xc4\x94\xfd\xc9\x1e\xf6\x0b\xd4\xd2\x03\x03\x9b\xbf\x77\xc1\xe7\xce\x59\x39\xfd\x1e\xc9\xd6\x5f\x47\xe4\x74\x64\x4f\xbc\xfc\x8f\x88\x6e\x2a\x92\xd7\x7a\xfd\x93\x7f\xcc\xe4\x3c\xd4\x48\x2d\x1d\x7b\x5b\x9e\xb3\xe8\x3f\xf9\x7f\x86\xba\xf4\x2e\x6a\xc5\x81\x01\xec\x5c\x7e\xfe\xa2\x79\x19\x72\xed\x95\x33\xd8\x4d\x0f\xcf\x80\x0b\x1e\x9a\xa1\x7d\x75\xc8\xd3\x91\xbb\x59\x19\x72\xed\x2d\x11\xdf\xc0\x57\x50\x6e\xef\xc5\x28\x87\xdf\x70\x6a\x00\xf7\x85\x12\xba\x9e\x86\xf7\x2c\x18\x1d\x0c\xf2\x55\xa2\x23\xbc\x20\xd8\x6b\x70\x64\x78\xa6\x00\xdb\x2e\xc7\x7e\x23\x28\x5b\x7d\xf2\xb0\x67\x7a\xc0\x39\x3d\xc7\xf4\x9c\x7c\xcc\x93\xc7\xc8\x57\x5d\xa7\xa4\xb7\xf6\x1c\x73\xe9\x05\xd7\x9d\x7c\xd2\x55\x5f\x7e\xf4\xf5\xab\xae\x93\xe5\x45\x67\x67\xd2\x7f\xfa\x9f\xc9\x35\xd3\x56\xb2\xce\x9b\x36\x4a\x91\xa9\xc9\x92\x6c\x6a\x8e\x5c\x56\x61\x19\xa8\xb0\xce\x01\x3d\xf1\xb5\x43\xf0\x1f\xdf\x3a\x74\xe8\xd7\xf4\x9b\x6b\x00\x0e\x9e\x7c\xfc\xb5\xdf\x6f\xb8\xf0\x42\x85\x65\xe0\x5f\xbf\x75\xfd\xb7\xc0\xe9\x97\xf3\x57\x33\xa7\x3d\xf0\xd4\xe3\xf8\x50\xb8\xc6\x8e\x4e\x53\x55\x93\xd3\x34\x43\x93\x5c\x0b\xd7\xa6\x30\x47\x2f\x01\xd6\x2c\xd1\x26\x3d\x3d\x36\x74\xec\xc1\x6e\x72\x27\x93\xdb\xfd\x79\x44\xc9\x4f\x87\xb2\x24\x3f\x4d\x8e\x3d\x80\xb5\x64\x28\x92\x4b\x5b\x6f\xc4\xe2\x67\xe8\x31\xff\xd1\x4e\xe4\x03\xdb\xb9\xbf\xeb\x3a\x6a\x33\xe8\xf5\xfb\x23\xb8\x32\xaa\x93\xee\xeb\xda\x3f\x37\x81\xb2\xc4\x4e\x1c\x1f\xf2\x56\x04\x87\x6c\x7e\xb1\x2b\xcf\x05\x76\xc5\xae\x3f\xc7\x65\x6c\xf0\x9d\x37\x67\xf0\x2f\xdc\x3b\xc3\x7c\xef\x09\xf7\x04\xd7\x3e\x23\xcf\x90\x9b\xfe\x3a\x6d\x1c\x84\x6b\x37\xff\x2d\xb2\xb7\xa2\xe7\x1e\x42\x77\x1f\xfc\xe6\xef\x86\xfd\x63\xe7\x44\x9b\x5f\xc7\x3a\xce\x76\x36\xbf\xd2\x81\x07\xb9\x2e\xe7\x37\xab\xba\xbe\xdb\xdd\x9d\xf6\x97\xff\x8c\x2d\xe9\x4e\xcc\x89\x3c\x33\xad\x37\xbf\x2b\xd4\x45\x51\xec\xa7\x76\x8e\xb5\x79\x27\xd6\x19\x67\x11\x79\xf6\xcb\x5f\xee\xc4\xc1\x5b\xcc\x58\xff\xd0\xe6\x0c\xe8\x67\x45\x74\xdd\x74\xfe\xbc\x33\xf8\x9b\xea\x7d\x87\x5a\x71\xe0\xa3\xc3\xbf\xe6\x4f\x59\xf0\x4e\x4b\xb2\x1d\x58\x17\xb7\x1b\xd0\xb7\x72\x13\x0f\x46\xf0\x67\x18\xcf\xe0\x9f\x2d\x4d\x68\x2d\xcb\x1c\x7d\xef\x62\x34\x97\x15\x9b\xd7\x60\x3f\xe5\xb1\x05\x9f\xcf\xac\x78\xf9\x2f\xd8\x9f\x78\x6c\x81\x14\xc6\x84\x08\xad\x75\xdd\x7d\x13\x3a\x03\xbb\x31\xf2\xfd\x76\xac\xd3\x7d\x68\xec\x7b\x23\xcf\x0d\xf7\xe8\xc4\x3d\x08\xa7\xff\x3f\x8c\x7d\x0b\x7c\x14\xc5\xfd\xf8\xcc\x5d\xee\xa1\x55\xd9\x1c\x84\x1c\xbe\xb8\x18\x48\xce\x07\xb0\x10\x92\x9c\x42\xc8\xf2\x4a\x16\x05\x59\x05\x64\x11\x94\xe5\x15\x16\x50\x58\x04\x61\x55\xc0\x05\xac\xae\x04\x61\x51\x09\x0b\x14\xbb\x01\x84\xe3\xe9\xf1\xd2\xf8\xb3\xad\x69\xf5\xa7\xa9\xad\x35\xad\x6d\x4d\x5b\xdb\x46\x5b\x6b\xda\xda\x36\x5a\xab\x91\xe4\xe6\xfe\x9f\x9b\xdd\xdb\x9b\xdd\x3b\xfa\xff\xd9\xcf\x91\xeb\xec\xde\xec\xec\xcc\xf7\xfd\x34\x4f\x66\xa5\x75\x4d\x20\x61\x74\xfb\x83\x6e\x39\xdd\xbc\xfb\xe0\x41\x37\x6c\x59\xe3\x43\x73\xc6\xd3\x7b\x59\x76\xb4\x09\xcf\xf6\x80\x15\x7f\x8f\xaf\x81\xfe\x60\x22\xa8\xbf\x44\x44\x55\x45\x66\x2c\x23\xd1\x16\xda\x75\x58\x30\x53\x2c\x2c\xc5\x5d\x74\x86\x9a\x35\x5b\x4a\x7d\x95\x25\x45\x22\xec\x34\x3c\x61\x03\x76\x23\xca\x48\x76\x19\x28\x12\xe9\xd2\x61\x44\x83\x6d\x1a\x14\x90\x91\x0c\xa3\x4e\x5f\x30\xc9\x78\xc3\x49\x16\xd2\xb0\x95\x43\x31\xd4\x66\xa0\x2e\x44\x8b\xd0\x80\xe1\xa4\xea\xa5\x92\xad\x5d\x05\x3d\x28\xe6\xeb\x49\xd3\x39\x95\xe7\x65\xb9\x53\x92\x64\x59\x96\x55\x5c\x21\x4b\x53\x65\xa5\x95\xd7\xe5\x6e\x24\x43\xb5\x53\x55\xa4\x56\x45\x86\x3d\xaa\xaa\x66\x75\x50\x2e\xb4\xf4\xf8\xdf\x01\x48\x05\x19\x30\x66\x3a\xde\x93\x8e\x50\xdd\xf6\x79\x20\xc5\x80\xb1\x7d\xce\xbd\xb7\x76\x7d\x85\xdb\x3f\x62\x8d\x2f\x77\xeb\x54\xe6\xf8\xa1\x19\x6e\x1d\xd2\x1c\xdf\x8d\xfb\x5a\x82\x20\x50\x52\xd3\x03\xbb\x71\x1c\xc6\x65\xa0\x1f\x28\x02\x35\xb8\x6a\xef\x1c\xcb\x52\x46\x94\x4b\xf5\x11\x99\x8f\x66\x35\x78\xb2\x68\xaf\xeb\x7f\x66\x9f\x66\xb3\x45\x43\x6e\xe6\xce\x63\x07\x0e\xf4\xbd\xae\xc9\xa2\xac\x52\x9a\x24\x28\x2a\xe4\x55\xb9\x43\xeb\x80\x77\xc0\x0e\xdd\x13\x94\xe5\x64\x8f\x87\x4e\xb6\x7b\x94\xa4\xa2\x27\x13\x1e\x2e\xd9\xe3\x09\xa2\x28\xec\x48\x7f\x47\x51\x8f\x84\xab\x54\x4b\xdf\xf4\xe6\x24\x21\x7d\x75\x71\x8e\xef\xea\x19\x2b\x36\x6c\xb8\x1b\x7d\x70\xfb\xe2\x0d\x0f\xdc\xfd\xe9\xdc\x4f\xff\xb8\xe2\x3d\xef\x31\x41\xf8\xcf\xf3\x5f\x0a\xdb\x67\x6f\x5f\xbd\x7a\xfb\xec\xed\xc2\x81\xd9\xcf\xf3\x3c\xff\xd9\xec\xd9\xde\x3b\x6d\x01\x9d\xc0\xcd\x8c\xad\xf7\x02\xf6\xac\x6e\x5f\x66\xd3\x19\x52\x36\x10\x6d\xb8\x75\xc6\x31\x2c\x75\xd0\x0c\x2b\x9e\x39\x54\x76\xec\x7c\x26\xbb\xce\xf2\xab\x13\xb8\xb1\xbd\xc1\xfe\xcd\x9d\x66\x3c\xd7\xb3\x2c\x18\x98\x6c\xa8\x2d\x9a\xfc\x4a\x88\xc4\x7d\x92\x96\x2d\xb9\x84\x0c\x82\x6b\xe9\x80\xcb\xed\xb8\x04\x2f\x28\x06\x25\xe0\x66\x50\x69\x9d\x2c\xae\xea\xdf\xff\x12\x81\xf1\xbe\x62\x4b\xfc\xc0\xd5\x5e\xdd\xdf\xb2\xb2\xb6\xdd\x7e\x03\x87\x0f\xef\xf7\xb7\x7e\xc3\x94\xe6\x38\x2f\x13\x1a\x27\xca\xbc\x2e\x18\xaa\x27\xae\x71\x82\xc8\xe9\xbc\xa6\xf6\xb6\xea\xbc\xc0\xb3\x3a\xa7\xa8\x3e\x43\xef\x8d\x19\x86\x27\x9c\xec\xf2\x24\x3c\xe1\xde\x58\xe6\x5b\xb2\xcb\xfb\x8d\xee\x79\xca\x96\x20\x64\x5a\x15\x44\x91\xd3\x14\xd5\xa0\x55\x51\x10\x38\x55\xd6\xb4\x98\x22\xa4\xa7\x94\x55\xc4\xf5\xb5\x0a\x82\x97\x41\x9d\xba\xae\x23\x3a\x91\x48\xb8\xf8\x85\x19\x57\xf0\xa2\x8d\x1f\x56\x8e\xc7\xc1\xc1\x0e\xbb\xa6\x4b\x97\xda\xbe\xc8\xad\xb7\x34\xff\xd6\x45\xfb\x9d\x78\xb9\xd0\x6d\x97\xb6\xce\x63\x81\x7d\xbf\x48\x8e\x1f\x7c\x99\xe0\x9d\xe6\x7a\xf6\xa6\x61\xee\xdc\x76\x07\x4d\x77\xe0\xf2\xf6\x6c\xcf\x1f\xd9\x01\x0b\xf3\xdd\xef\x66\xf2\xa3\x43\x38\xe6\x0c\xf7\xb9\x30\x6b\x56\x5d\x07\x4a\xc1\x8d\xb8\xff\xde\xed\xb8\x4b\x28\x3e\xd6\x02\x5f\x79\x55\xb5\xa9\x48\xf8\x03\x55\x69\xf5\xd8\xe3\xab\xaa\xb6\xb0\xde\xd1\x44\x06\xeb\x57\x15\x45\xa5\x8e\xbc\x8b\xe2\x4b\xaa\xdc\x5e\x56\x60\x54\x2a\x8c\xba\x50\x3c\xda\x92\x30\x12\xe1\x56\x59\x13\x12\x71\x85\xe3\xb4\x1e\xd4\xd1\x16\x0f\x47\x0c\x36\xaa\x45\x59\x35\x16\xd1\xc3\xb1\x76\x3d\x22\x69\xa2\x97\xf6\x84\xf5\xce\x4e\x46\x14\xf9\x88\x28\x44\x93\x5d\x4a\x5c\xd2\x84\x44\x9f\x9a\x93\x84\x21\x69\xf1\x18\x4d\xb3\x11\x45\x49\x44\x28\x4d\x87\x80\x6e\xd7\x82\x61\x41\x8e\x21\xa3\x33\x12\x89\xd1\x28\xae\xe8\x31\x43\xa1\xd4\x38\x1d\x57\xe9\x68\xab\xca\x29\x5e\x29\x2d\xd6\x6a\xc9\xb0\xc4\x47\xf4\x28\xef\x69\x93\x8d\x16\xbe\x25\xee\xcd\x06\x33\x93\x32\x40\xf3\xcf\x5c\xf0\xe1\x94\x95\x1e\x22\x64\x00\xf2\x8c\xee\x77\xdf\x7f\xb0\xc2\x35\x8f\xe0\xb8\x3f\xd3\x83\xc3\xd2\x9b\xf1\x09\x0d\x03\x23\xb1\x4d\xa3\x1e\xdc\x01\xe6\x67\xfd\xd8\x15\x64\xbf\xfb\xd2\xc2\xd2\xc2\x52\x3f\xae\xa9\x9c\x3e\x9b\x62\xd3\x8d\x6d\x75\x52\x84\x15\x95\xa5\x45\x43\xf1\x97\xff\x43\x9c\x11\xfc\xf1\x1e\xea\x6a\xf8\xd0\x4d\xa3\xfa\x66\x4e\xbd\x69\xe2\x4d\x53\x07\x8d\x7a\x75\xcf\x99\x92\x75\x3b\xf5\x8a\x51\x53\xbf\x0c\xc2\xea\x31\x37\xa0\x8f\x07\x15\xc6\xe3\xb0\xf6\x55\x14\xc4\x7f\x3c\xed\xce\x80\x23\x2d\xc7\x9c\x1b\x1c\x11\x1d\xbc\x6e\x7a\x75\xdf\xf4\x3b\x67\x53\x4f\x06\x47\x7c\x88\xfe\x03\xbf\xf5\xe1\xf7\xa7\xc3\x02\x58\x01\x77\x8d\x88\x3c\x79\xea\xc5\xea\xfa\x08\x7a\xfc\xc0\x81\x03\xa8\xfe\x85\x95\x2b\x5f\x78\xc1\x73\xc2\x11\x88\xc4\x92\x67\x92\xcd\x27\xc2\x7b\xd6\xdc\x4c\xe0\x26\x41\xaf\x4f\xcc\xc6\x3b\x3a\x2f\xaf\x0d\xf4\x0c\x81\xb7\x59\xbb\x45\xd9\x41\xdc\x85\xf9\xe0\x94\x7c\x34\xa3\xf9\x34\xf1\x1c\x52\xc6\x99\x6b\xdb\x40\x78\xc7\x5c\xbf\x04\x56\xac\x1f\xce\x5b\xc2\x70\x81\xed\x53\x66\x4c\x09\x83\xfd\x4f\x97\xac\x1f\x40\xc6\x38\xfa\x2a\x8a\xac\x0a\x9e\x69\xf4\x1a\x42\x96\xb5\x83\x25\x45\xa6\xe5\xc3\xfb\x90\xcc\x71\x92\x90\xac\x73\xef\x7d\x87\x8f\xbb\x98\x30\x0a\xc2\xbd\x5d\xe9\x0f\x6c\xd7\x19\xb6\x55\x95\xd4\x96\x2e\xc5\xe0\x10\x87\x7a\x58\x49\xe0\x22\x02\x1f\x4b\x6a\x1e\xd0\x8a\x62\x34\x14\x0d\x94\xf0\x3d\xc5\xea\x82\x28\x42\x28\x08\x82\xa0\xf2\xbc\x20\xbc\x9d\x4c\x40\x51\x44\x2d\xe2\x6f\x54\x96\x11\x64\x5e\xe5\x35\x26\x6a\xe8\x30\x8c\x3a\x25\x3e\xac\x47\x78\xd8\xae\x22\x59\x51\x45\x18\x06\x56\xfd\x0f\x72\x8f\xee\xcd\x6f\x0f\x3a\x1c\xcb\x7b\x76\xfe\x83\x5d\x6e\x7e\x76\xe8\xc0\x25\x64\x73\x8c\x7f\x87\x87\xda\xba\x84\xe5\xbb\x3c\x54\x89\x7d\xff\xdf\x03\x59\xdf\xbf\xe0\xd4\x25\x0e\x1e\xb1\xe7\xa2\x2d\x59\xc8\xc4\xe5\x2f\x88\x35\xb5\x63\xf9\xb8\x10\x4b\xe4\x25\x36\xfd\xc4\x75\x5a\x71\xee\x6b\x29\xb8\x09\xd4\x80\x7a\xb3\x06\xbf\xd9\xf1\xa7\x38\x50\x36\x2c\x83\xa3\xa4\x01\xc6\x1f\x28\x1f\x52\x8c\xb3\xb5\xfc\xb0\x38\x60\x12\x52\xbf\xaf\x7c\xa8\xa9\xd6\x0f\xb5\xba\x09\xe5\xcf\xe4\xf2\x18\x72\x27\x6a\x13\x20\xeb\xe5\xa1\xd8\xcd\x75\xa3\x04\xa2\x95\x28\xed\xe9\x6c\xe9\x82\x31\x68\x44\x93\x3d\x48\x45\x2d\x88\x67\xa1\x00\x29\x45\xe0\x78\x01\xf2\x51\x35\xde\x69\x24\xc5\xa0\x47\xe6\x13\x92\xc0\x19\x72\x24\x91\x02\x2c\xa4\x65\x85\xee\x68\x31\x60\x93\x61\x5c\x3c\xd4\x5c\xf0\xbd\x8b\x57\xc3\x2e\x2c\xf7\x76\xa1\x30\x96\x7b\xc3\x9e\x36\xb6\x45\x92\x25\x81\x97\x65\x59\x88\x70\x74\x44\xd5\x44\x2e\xa8\x05\x35\x91\xd6\x22\x0c\xcb\xd1\x11\xc9\x90\xc5\x18\x27\x04\x0b\x7c\xa2\x10\xa5\x25\x36\x4a\x31\x31\x89\x8b\x44\x45\x9a\x61\x76\x26\xd9\xb1\x9e\x75\xc9\xaf\x3c\x1f\x72\x1c\xc7\x29\xb1\x58\x2c\x66\xd9\xfc\xb3\xf2\x66\x59\xe2\x1a\x0c\x15\x73\x6c\xbc\x31\xe5\x9f\x2b\x08\x7d\x82\xb7\x6c\xe6\x18\x6f\xa8\x06\xba\x25\xf9\x97\x71\xa9\xd1\x83\x1d\x31\x98\x0f\x13\xb6\xa0\xc0\x91\x59\xa9\xf1\xa0\x08\xf8\xc0\xc3\x29\x26\x70\xc1\xf2\x69\xdd\x8c\xfb\x8c\x5e\xd2\xab\x95\x37\x1d\xd0\xb2\x1b\x86\x7c\x81\x32\xaf\x69\x47\x19\xd2\xbf\xc4\x9c\x01\x4e\xfe\x2f\xce\x2d\x5f\x0e\x57\x7a\x05\x6e\x7a\x1e\x9e\x42\x2b\xde\x81\x83\x1a\x7e\xfb\xda\xf3\xdb\xbf\xd8\x00\x6b\x9f\x41\x09\xcf\xaf\xee\xaf\xda\x38\xfc\xfe\xfc\x4e\x2e\xaf\x68\x0b\xa1\x28\x0a\x03\xe8\x9b\x39\xe8\xf5\x3f\xdf\xff\x13\x78\x75\x52\xf3\x2c\x40\xa9\xb7\xa6\x7f\x01\x2b\x60\x6c\xcc\xe4\x61\x93\xc7\xe6\xea\xa8\x89\x4c\x5c\xff\xa3\xa9\x09\x04\x7e\xd4\x0d\xf2\x25\x3f\x1e\xf7\xd7\x6a\xc9\xf2\xef\xb0\x0e\xff\xce\x6c\xcb\x86\x9e\x86\xf7\x1f\x5a\x39\xdd\x85\xa0\x1c\x4c\x00\xf7\x64\x76\x2e\x90\x2b\xf3\xbb\xf4\x28\x9c\x9b\xe8\x28\xf2\x6f\x45\x55\x55\xe6\x4f\x4d\x54\x13\xba\xa0\xc7\x99\xb8\x26\x68\x06\x8c\x8b\x7a\x97\xd8\x85\x3a\xbd\x51\xc3\x1b\x49\x0a\x30\x02\x0d\x1e\x31\xa8\xc3\x40\x9d\x88\x11\xa1\x06\xa3\x49\xd1\xfb\x9b\xe7\xe1\xc3\xf7\x8f\x2b\x0f\x6c\xef\xb7\x64\xe3\x73\x0d\x7f\x2d\x47\x33\xa7\xc1\xfb\xcb\x51\x17\x2c\xef\x1b\x9c\xc3\x70\xc2\xac\x20\xcb\x9c\x86\xff\x6d\xe5\xe2\xba\xa8\xa3\x2e\x8e\x93\xe3\xac\x21\x77\x21\x09\x6a\x9d\x8a\x2a\xc4\x0b\x86\x7f\x1f\x5d\x73\xcb\xf8\x6d\xd7\xbd\xf9\xc0\xa8\xdb\xe0\x8b\x68\xf9\xe9\xc7\x76\xc1\xd8\x16\xf8\xdd\xac\x1a\x90\x4f\x7f\x7f\x13\xef\xda\x3d\xb6\xbc\x6f\xd2\x2d\x2c\x3f\x6e\x9f\x45\xc8\xfb\x98\xfe\x35\x1f\xfd\x6f\x36\x85\x43\x73\x6d\xbd\x6b\x16\xf6\xc3\x66\xf2\xbb\xca\xc0\x6d\x60\x32\x58\x88\x7b\xda\xe0\xf4\x7f\x3b\xb6\xb0\xa2\xc8\xec\x3d\x39\x60\x60\x45\x64\x1c\xcc\xc4\xb0\x5d\xca\x22\x68\x75\x6d\x1f\x4a\xfe\x2a\x5b\xbf\xb8\x06\xa6\xd1\x00\x5e\xe1\x51\x93\xb2\x8e\x8b\xe6\xea\x3a\xfc\x87\xae\xc3\xda\x5d\xf0\x56\x78\xc5\x3c\xf4\x33\xb4\xab\x6c\x1a\xec\xbf\xa6\x26\xb8\x97\x7a\x05\x2d\x6a\x5e\xd4\xc7\xe6\x00\x39\xd4\x19\xce\x10\x24\x0e\xd2\x1e\x4a\x87\x2c\x8c\x30\xa8\x0d\x69\x7c\x1c\x86\xa3\x74\x50\xa7\x38\x16\xe9\xa8\x5b\x6d\x8f\xa9\x0a\xfc\x77\xb2\x75\x3b\x8c\xde\x92\x6c\xf7\x8c\x48\xb6\x7b\xde\xef\xe1\x44\x55\xe2\x94\x68\x38\xcc\xeb\x74\x8f\xcc\x08\xfe\x52\x9b\xdf\x3c\x48\x0b\x02\x62\x20\xcd\x33\x72\x5b\x5b\x2b\xc3\x2b\x02\xab\x46\xc2\x91\x88\x11\xed\x88\xd1\x2c\xab\x47\x34\x2a\x6c\xd9\xc4\x08\x3d\xf6\x8c\x97\xa0\xe9\xa6\xdc\xf6\x03\x87\xff\x8f\x76\xe5\x9a\x6d\x73\xf3\x9f\xf8\xe5\x59\x1b\x8d\x1d\x33\xe6\xb4\x41\xcd\x24\x78\x13\xc1\xe3\x9a\x37\x13\x32\x3c\xe9\xb7\x99\xe1\x38\xfb\x49\xa1\xb2\x1d\xe3\x71\xad\xe1\xdd\xe0\xa7\x18\xef\x2c\x5d\x0e\x9f\xf9\x3d\x60\x1e\x58\x88\xfb\xe3\xa4\xf9\x41\x69\x26\x50\xd1\x76\x51\x99\x09\x8b\xb6\xa3\x2e\xaf\x25\x18\x5a\x22\xbb\xd9\x50\xdc\x4f\x0a\xf4\xd5\x19\x31\xbe\x28\x30\xda\x12\xe3\xfd\x92\xae\x77\xd3\x7c\x82\xa1\xf4\x30\x13\x43\x3d\xad\x3c\x52\xf4\x2e\xc4\xc3\xb8\x06\x5b\x11\xd3\x7d\x31\x98\x63\x12\x66\xd5\x76\xd4\x13\x57\x23\x61\x59\x60\x14\x2a\xdc\x83\x3a\x23\x86\xa6\x68\x11\x43\xd4\x38\xad\xa3\x95\x8d\xaa\x11\x96\xa3\xf5\x70\x9b\x1a\xe6\x54\xce\xd3\x85\x00\x87\xba\xa2\x91\x98\x16\x6d\xa7\x69\x96\x87\x1c\x8c\xa3\x4e\x98\xd0\x12\x09\x0d\x71\x44\x41\x16\x94\x1c\x81\x1e\xfb\xbc\xb8\x7c\xc4\xf0\xda\xe7\xcf\x55\x57\x57\x8d\x1b\xfc\xe0\xf6\x77\x06\xf7\xdb\x7e\x02\x52\x65\x1f\x9f\x8c\x24\x77\x6d\x3f\x5c\x7e\x78\x7b\xf0\xe4\xb9\x7e\x3f\x7a\x9e\x2a\x7f\xed\x70\xed\x21\x7b\x5f\xb3\xb6\x0f\xd3\x62\xe5\xdf\x7e\x37\xc6\x2b\x4b\x87\xc7\x78\x35\x00\x44\x01\x0d\x46\x83\x98\x99\x31\x6e\xe2\x95\x59\xd5\xd1\x52\x6a\xf3\xee\xa6\xd5\xe1\xaf\xbf\xa5\xde\xa6\x3f\x1e\x6f\x41\x71\xef\x5f\xbf\xef\x79\x31\x39\x17\x56\xb0\x8b\xd6\x5d\xb8\xf7\xe0\x35\x43\x1e\x7f\xe0\xe1\xb9\x7d\x83\xdc\x9b\xe5\x17\x5a\x7b\xda\x5b\x0d\xdc\x8f\xd1\x6c\xc1\x18\x4f\x7f\x2f\xf8\x61\xdf\x27\xdb\x3c\x01\xf4\xd3\x39\xe3\x17\x3c\x7b\x36\x7a\xeb\xad\xcc\xbd\xcb\xa6\x78\x87\xdb\x5b\xd1\x47\x99\x0d\x9a\x91\xd1\x9e\xfe\xcf\xa9\x93\xee\x78\x29\x2b\x8f\x58\x70\x88\xe9\xb9\x23\xee\xe0\xae\x7c\x7a\xca\x76\x5c\x9f\x14\xd7\x3c\xc2\x79\x5f\x56\xdc\xde\x0c\x97\x15\x8d\xe8\x3e\xe7\xc3\x04\xdc\x4c\x9e\xb7\x84\xd0\x90\x2f\x30\xc4\xeb\x0f\x90\xf5\x2d\x6a\x70\x89\x68\x88\xd5\x47\x2c\xeb\xe0\xc0\x28\x19\x76\x1a\x1e\x0a\x6f\x06\x54\x8d\x8b\x1d\x06\xd4\x50\xc4\xa3\x78\xa8\x64\x37\xea\xc2\x61\x7d\xad\xfe\xd6\xbe\x16\x89\xe9\x6a\x15\x14\x45\x81\x9c\x8c\x74\x35\x1a\xa1\x14\x85\x91\xa2\xb2\x40\x47\x91\x8c\x82\xac\x27\x08\x8d\x30\x85\x5a\x10\xc3\x42\x03\x0a\x91\x48\x3b\xe2\x19\x28\x74\x26\x75\x5f\x8f\x9a\xfe\x4f\x46\x46\x47\x07\x14\x64\x59\x46\x86\x22\xa8\x82\xc6\x88\x12\x43\xa7\x80\xa8\xaa\x30\x46\x05\x79\x41\x37\xd2\x02\x2a\xc7\x77\xab\x8a\x0a\x01\x1b\xe9\x54\x64\xa9\x23\x1c\x51\x44\x95\xe5\x73\x65\xc9\x66\xc9\x96\xe7\x49\xdd\xbd\x2c\xbe\x0d\xef\xe0\x74\x7c\x8d\x73\xc5\xb7\xde\xe9\x8e\x17\x68\x0e\x00\x67\x0c\x9e\x43\x37\xb1\x6c\xc0\xd3\xf2\xfa\xb4\xa7\xe6\xd5\x27\xfc\xc6\x45\xb7\x2e\x69\xfc\x01\xb8\x63\xb1\xc8\xf8\xa2\xeb\xf1\x6c\x77\xe4\xfa\x1b\x42\x65\xe9\xd1\x90\xff\x58\xbb\x6d\xcb\xca\x8d\x35\xbc\xdd\xb9\xb6\x67\x8e\x3a\x60\x6e\x55\x8a\x0d\x34\xa6\xe5\xb2\x33\x1d\xe0\xe7\xb5\xef\x55\xde\x4a\x35\x9c\xf9\x20\xf5\x17\x46\x18\xdd\x44\xd8\x97\x9d\xbc\x71\x8a\xdb\xc6\x61\xbd\x2f\xeb\xb6\xa1\x60\xaf\x47\x66\x1d\xf5\x4e\xd8\x6f\xbe\x12\xd3\xf9\xdd\x84\xed\x83\x94\xe9\xe7\x01\x57\x1c\x94\x05\xf7\x75\x39\xfa\xb9\x19\x2f\x36\xd9\xfd\x6c\xf3\xa9\x46\x07\x01\x03\x72\x7a\xfc\x04\xee\x2d\xb8\x3d\xe3\x53\x67\xc9\x78\x1e\xca\xbf\x7d\x22\xe1\x07\x27\xdf\x6d\x82\xdb\xd7\x8e\xf7\x22\x73\xfe\xe3\xad\xbd\x24\xfd\x1f\x0d\xf1\x4d\xf0\x9f\xb5\xe5\x35\x83\xa9\xba\x93\xfd\x3e\x7b\x6b\xdc\xee\x91\x85\x64\x7c\x65\xbc\x16\xc3\xe2\x38\x40\xe6\x3c\xde\x69\xd6\xf7\x4f\xa4\xdf\xb5\xe1\xb9\x73\x05\xd7\x8d\x6b\x1d\xbd\x31\x54\xb7\xb7\x0b\x5c\xc5\x80\x9a\x1a\xd2\x0f\x66\xad\x97\xc9\xe7\x07\x0b\xf9\x9b\x45\x42\x4f\x23\x74\xd9\xf3\x58\x2f\x3e\x7f\x87\x53\x97\xbe\x30\x04\xcf\x55\x6b\x9f\xab\x33\x57\x63\x5c\x7e\x5d\x6d\x7b\x0d\xb1\x57\x84\xce\xd7\xcc\xdb\xcf\x16\x48\x7a\x7e\xc1\xcc\xc2\x1e\x6b\xfb\x8a\x30\x6f\x3d\xf9\x12\xce\xa5\x4d\x4b\xfe\x75\x67\xde\x07\xbf\x63\x00\xfd\x3b\xf2\x7d\x8c\x4d\x0e\xdc\x90\x9c\xfe\x87\xed\x63\xf2\xc7\x21\x34\xf7\xbf\x84\xfd\x2f\x53\x67\x74\x7d\x8a\x0e\xbc\x90\x95\xab\xaf\xdc\x41\xbd\x5f\x7b\xa8\xaa\x2c\x2f\x1e\xdf\x4a\x3c\xa3\xc5\xed\xff\x39\xfa\xa6\x13\xee\xcc\xbc\x9d\xc4\x6b\xee\x3d\x3b\x38\x39\xfb\x1e\xc0\x0f\x94\xd4\xb4\x80\x59\xbf\xdb\xec\xfe\x56\x85\xfb\x09\xe6\x2f\x36\x54\x5e\x58\x52\x58\x55\x0b\x2d\x39\xa0\x20\x50\x5e\x58\x6c\x35\xdb\x80\x97\xb4\xd2\x05\xc4\x53\x17\xb6\x3f\x3f\xea\xf6\x92\xb9\x13\x26\xdc\xfe\xc7\x1f\xa0\x17\x9f\xff\x34\xf9\x5a\xf1\xa6\x0f\x37\x6d\x3a\x70\x60\x47\xf9\x08\xf4\x49\x6f\x7d\x13\x7c\x05\x4d\x81\xaf\xa0\xff\xb0\xb4\x42\xc7\xd0\xe1\x1c\xbb\xfb\xc6\x67\xd1\xf7\x0e\x1e\xdc\xbc\x65\xd0\xde\xf0\xc8\xd8\xbe\x6d\x70\x71\xef\x42\x1f\xed\x49\x4e\x47\x5b\xfa\x0d\x9e\xfc\xf4\xcc\x5d\x3f\x5b\x5c\x53\x35\x6f\xf2\xb4\x82\xad\x5b\x9e\x7d\x16\x7d\xb6\x77\xaf\x67\x1a\x2f\xc6\x24\x0e\x5e\x4e\x88\xdd\x0e\x9a\x65\xd1\xbf\xaf\xdd\xfe\x37\x0b\x9e\xb2\x36\x04\x89\xa4\xd7\x96\xbd\xbe\x3a\x9f\x1f\x64\x7b\x55\x8e\xdd\x16\xfb\x99\xce\xdf\x85\xaf\x56\xba\xe0\xd9\x84\x8d\x05\x84\xbf\x92\xb4\xb7\x8e\xce\x89\x41\x30\xd7\x55\x91\xdf\xb6\xb1\x9d\xac\x9d\x4a\xfa\x6c\xc8\x3a\x26\x98\xb6\x98\x75\x3d\xac\xa7\xd0\x2e\xbc\xbc\x86\xd0\x95\x47\xd8\x30\xae\x12\x34\x3e\x4d\xb1\x03\xc7\xfe\x01\xc7\xa7\x96\x58\x7b\x20\x3a\x72\xb2\x86\xbb\x6d\x60\x16\x7c\xb6\xa7\xaf\x1e\xf9\xcc\xca\x35\xee\x87\x65\xd3\x20\xb8\x0a\x0c\x00\xb5\xa6\xa4\x90\x86\xa8\xb4\x48\x50\x50\x1c\x18\x32\xcc\x32\x7b\x14\xfb\x03\x43\x86\x62\x50\x33\x83\x4c\xac\x5e\x2f\x5e\x7f\xc0\x8c\xbf\x29\x37\xf5\x90\x4b\x54\x3b\x15\xbd\x0c\xab\x30\x31\x2f\xdb\xd3\x56\xf0\x67\x58\xdd\x23\xa2\x6f\x50\x47\x72\x9f\xd2\x81\x7e\xb3\x0a\xd6\xc2\xbf\xe8\x1d\xef\xc1\xa5\x70\xf0\x9e\xa7\x5a\x1f\xdf\xc9\xa2\x57\xb9\x3d\x2d\xeb\x35\xfd\xbb\xaf\x40\x8a\x4f\x1e\xec\xe1\xe6\x1f\xd5\xa2\x5d\x6f\x73\x5f\x27\xe6\xc3\xef\xc2\xc1\xe8\x58\x14\x16\x27\xff\x27\x07\x2c\xcf\xcd\xb8\x7b\xe2\xc2\x27\x87\x3d\x1e\x5f\xfe\xca\xa6\x59\x77\xbe\xb9\x7a\xf9\xa6\x91\x23\xbb\xa4\x6b\xaf\x7d\xb2\xee\xf9\xf8\xb4\xb9\x37\xed\x97\x96\xc9\xf5\xcf\x2d\x5c\x1e\xdb\xde\x0c\x5f\xbb\x73\x1a\xfa\xc9\x4d\x23\xd7\x4f\x1b\x75\x27\x1c\xf4\x7c\x9d\x94\xf8\xe8\x5a\xe9\x39\xef\xf3\x58\x39\x61\x59\x41\x70\xf1\x31\xeb\x84\x86\xe5\xf7\xe1\xc7\x31\xa7\x39\x5d\x97\xc7\xdf\x59\x76\x02\xd3\xf1\x13\x35\x79\xe9\xc7\x2d\x6e\xb8\x36\x63\x15\x2e\x98\xbe\xd0\x9b\xad\xdf\xd4\x9b\x3e\xa2\x67\xe6\x83\xba\xbe\x0f\xc6\x2e\x1b\x5b\x63\xc1\x5f\xfd\x73\x9b\x41\xff\x54\x78\xdc\xe7\x63\x96\x92\x7c\xcf\xe1\x17\xbf\x29\xaf\x7e\x73\x23\x01\xb7\x2f\xa4\x79\xfc\x77\x1f\x1d\xf0\xb3\xda\x27\x2b\x3e\x0e\x35\x34\x7d\x42\xfd\x86\x01\x15\x3f\xb6\xac\x30\x69\xbd\x95\xb7\xec\x9a\xa6\x24\x69\x76\xcd\x9e\x9e\xb1\x1b\xf8\x9c\x24\xc8\x47\x90\xa0\xc2\x01\x01\xbf\xaf\xbc\x62\x54\x0d\x2c\xf1\x04\xca\xab\x06\xc1\xfe\xb8\xcf\x71\x65\x49\xd1\x80\xbc\x16\xb0\xa9\x98\xdc\xc0\xbe\x64\x22\xac\x74\x2a\x8a\x61\x68\x51\x1a\x75\xa6\x00\x6b\x36\xd1\x68\xf5\x76\x73\x61\xd4\x15\x69\x8f\x21\x26\xda\x26\x75\x1a\xd0\x40\x42\x10\xc6\x91\xd0\x9b\x13\xc9\xe8\xab\xc2\x04\xe7\xdb\x49\x1a\x49\x54\x84\xd5\x78\xbd\x43\x64\x62\x02\xcb\x15\xb4\xa8\xba\x8e\x3a\x0d\x03\xbe\xde\x1b\xd7\x68\x2a\xa8\x4b\xad\x29\xd0\xae\x74\xc0\x6e\xd8\x8d\xb4\xce\x64\xa2\x93\x61\xbc\x3d\x39\x74\x8a\x76\xc0\x41\xd4\x96\x91\xe8\xec\x59\x87\xca\xb6\x17\xf6\xf4\x50\x75\x17\x1e\xff\x77\xeb\x84\xc3\xa3\x9e\xc4\xb0\xe0\xf4\xdb\x94\x13\xf2\x11\x49\x47\xca\xf2\xfa\x6c\xcb\xd2\x10\x45\xf9\x4f\x4f\xbe\xf4\xb5\xed\x43\x6d\x99\x87\xa4\x3f\x43\x08\x19\x29\x41\x3c\xa7\x34\x67\xdc\xbc\xff\x86\x4b\x8c\x97\x58\xb6\x8b\xf4\xb3\xf7\xe0\xbe\x18\xa5\xe0\x4e\xdc\xbd\x58\xb0\x7a\xbc\x16\x95\x14\x52\xde\xf2\xd0\x20\x68\x26\x37\xe5\xaf\x51\x65\x67\xfe\xe0\xb8\x25\x2b\x2c\xd3\xb2\x6c\x94\xde\x80\xa3\x53\xcd\xee\xaf\x3e\xec\xd4\x2f\x2b\x2f\xf1\x7b\x5d\x1d\xff\x03\xf2\x45\x3a\xae\x1b\x9e\xf6\x70\x44\x8b\x85\xfb\x72\x0a\xd8\xc0\x66\x78\x64\x5a\xe5\x63\xd7\x97\x7b\x5e\x43\x47\x3f\xf8\xc3\xcc\xc5\xf3\xd0\x9c\xba\xf8\x7d\x33\x67\x5d\x1f\x7c\x76\xf0\x63\xe8\xc3\x99\x2d\x0f\xa0\xdb\xa7\x56\xcd\x7a\xf5\x3d\xf4\x2b\x58\x91\xdc\x06\xaf\x5b\x3c\x0f\x7d\xb8\x78\x2b\x1c\x82\x3e\x84\xa7\x61\x51\xb2\x26\xf3\xad\xa0\x55\x45\x00\xf1\xa8\x45\x80\x0c\x54\x3d\x1c\x4d\xd3\x2c\x0b\x59\x0c\x11\x82\xa0\x28\xe8\x4a\x6e\xca\xd8\xe1\x23\x56\x1f\xb9\x67\xd3\xf0\xb1\x88\xae\x2a\xbf\x26\xe0\x1f\xbb\x69\x6c\xeb\xd8\xb1\x53\x16\xc3\x97\x2a\xaf\xb9\x6f\xf5\xb9\x93\xeb\xd7\x4f\xbf\x6f\x39\xfa\x70\xf5\xea\xd5\xe8\x94\x2c\xcb\xae\xbd\x35\xe5\x52\xb2\x1e\x2f\x69\x7b\xfa\x0d\xbe\x3a\xd8\xbe\x96\x5b\x8f\xe6\x7a\x1b\x77\x35\xb7\xcc\xb1\xfd\x3a\xeb\x77\x8a\x03\x5e\xaf\xb5\xcf\xd7\xe2\x0f\x46\x63\x8e\xec\x44\xf2\x5b\x5c\xaf\x0f\xc7\x64\x4e\x0f\x1c\xf0\xcb\xb8\x12\xd1\x32\xf0\x20\x58\x6d\x56\x64\xc2\x3e\x41\x67\xc8\x65\x65\xa1\x69\x6e\x2d\xcc\x6b\xad\xf0\x07\xae\x87\x15\x85\xee\x98\x81\x4c\x5d\x87\x6c\x6c\xc1\xc0\x31\x30\x50\x6a\xe5\xdd\x56\x65\x22\x0a\x94\x6e\xbd\xa3\xa3\x35\x2c\x4a\x9c\xc0\x71\x11\x8e\xa7\xdb\x62\x8a\x92\x13\xad\xeb\x2d\xdf\x5b\x38\x68\x92\x7a\x19\x92\xa1\x8a\xc6\xc2\x37\xd1\x66\xf8\x38\xba\x19\xfe\xea\x20\xfc\x0a\x5d\x0e\x9b\x57\xad\x42\xf3\xe1\x31\x34\x5b\xfd\xd5\xb9\x0a\x05\x9d\x47\x27\x1a\xa6\xdd\x74\xcf\xfa\x3f\x78\x28\x18\x44\x3d\x30\x58\x10\xc4\xcd\x6f\x51\x27\xad\x46\x23\x48\x92\x85\x70\x3c\x22\x40\x86\x36\xc2\x11\xc8\x78\x0c\xcc\x16\x64\x59\x96\x7b\x7f\x30\xe8\xf6\xc9\x93\xee\x80\xab\x96\xaf\x5e\xbe\x6e\xb9\xb4\x7c\xf9\xf2\xe5\x52\xe7\xf2\xdf\x6d\x59\x7e\x2c\xbc\x7a\xf1\xe2\xc5\xa3\xee\xe0\xcf\x7b\xfe\xb2\x6e\x5d\xe7\xea\xd5\x4e\x3e\x6f\x9d\xc3\xd5\xc4\x7e\x13\xb8\x6c\xd5\x93\x18\x84\xaf\x3d\x98\xba\x3c\xbd\xe7\xa6\xbc\x18\x6a\xd8\xb5\xd1\xb7\x95\x01\x95\xdf\xa7\xea\x4e\x9f\xe8\x3b\x58\xfb\xc6\xe8\x1f\xe6\x89\x9d\x0e\xbb\x61\xc9\xc2\xdf\xe2\xbc\x3e\x30\xff\xee\x0f\x09\x3a\x44\xc6\xf4\x0e\xcc\xef\xfb\xdc\x5e\x94\x23\xe7\x63\x7d\xef\xcc\x0e\xb7\xcf\xc7\x9a\x27\x5b\x3b\x98\x73\xcc\xd3\xdf\x92\x71\x85\xd4\x70\x1c\xcb\xdd\x0f\xf4\xc7\x16\x7c\x5c\x43\x01\x66\xe2\x77\xac\xe8\x12\xbb\xfe\xc7\x40\x3b\x27\xab\xb2\xc4\x8a\x72\xc5\xe9\xbb\x03\xf3\x52\x1b\xc9\xc7\x26\xe3\x5e\xb6\xaf\xc5\xe8\x33\xbc\x42\x32\x61\x14\x04\x7b\x7b\xd2\x1f\xd8\x43\x47\x3c\x6d\xa8\x9d\xa6\x61\xd7\x37\x14\xec\xa4\x63\xa8\xd3\xd3\x1e\x89\x08\xb0\x2d\x16\x49\xaa\x74\x52\xcf\x31\x7c\xbe\x9c\xec\xe6\xe5\x78\x5c\xe6\x61\x4c\x40\x9d\xbc\xf7\x4f\x2c\xaf\xca\x8c\xa6\x09\xbc\xca\xd0\x88\x13\x78\xde\x33\x82\xcc\x4b\x71\xeb\x41\x64\x4e\x94\x7d\xde\x21\xff\xb3\x7d\x96\x0f\x58\xb1\x63\x36\x02\xe0\x1a\x2b\x0f\x3d\x06\xc6\xe2\x2c\x1d\xab\x70\x44\x5e\xb3\x2f\x2e\x68\x66\x47\xfb\x3b\x7b\x60\xe1\xe8\xe0\xca\x92\x22\x4f\x8d\x57\xe9\x53\x74\x0f\x97\x4c\x24\x4f\xe4\x60\x0b\x9d\x6c\xd3\xf5\x34\x03\x4d\x7f\x7c\x2d\x3c\xcf\x2b\x51\x95\x8f\x25\x5b\x34\xd8\x82\xd8\xf4\xc7\x53\x8a\x46\x3e\x7b\xbe\x60\xa5\xfd\x7e\x5a\x32\xd1\x97\xf0\x19\xdd\x12\x6a\x11\xa1\xd0\x1b\x15\x85\xa0\x16\x14\x3c\x82\x87\xc3\x43\x22\x7e\x9f\xab\x02\x66\x2f\x86\x4c\x67\xbd\x31\xa0\x16\x4c\x04\xb3\xd3\xef\x83\x9b\x81\x97\xfa\x03\xbe\x80\x65\x3d\xc2\xcd\xbc\x7d\x55\xd5\x25\xfe\xc0\xc0\xfe\xff\x97\x57\xca\x7b\xde\xaf\xc0\x7b\x26\x6b\x95\x9e\xef\x7d\x56\x33\x17\xce\x9e\xa7\x7f\xf6\x2e\x5a\x32\x19\xde\xf8\x03\xfd\xa5\x9a\xe1\x28\xe9\x79\x6a\x51\x0d\x7a\xec\xfa\x32\x1d\x26\xdf\xd1\x75\xf8\x02\x5a\x98\xfe\xf8\xce\xf1\xb3\xad\xf7\x7d\x55\xb3\x74\x9d\x29\xbd\x87\x72\x78\xca\xd7\x2a\x25\xef\xdc\x39\xfb\xf1\x9d\xd3\x79\xb9\x7c\x27\x55\x1f\x1b\xc1\x4d\x3f\x5d\xbf\x74\x44\x34\xea\x4d\x25\xf5\xbe\x9d\xbe\xdf\x5c\x7c\x18\x9d\x78\x00\xae\xbc\xf8\xf5\x03\x8b\x83\x4d\x97\x2d\xf6\xc8\x1e\x11\x0f\x3d\xe0\xb9\x48\xc2\x85\xe8\xc8\x17\xcb\xd0\xea\x42\x0b\x47\x9c\x31\x9c\xd4\x25\x74\xa0\x7e\x04\xae\x91\xf1\x26\x57\x11\xba\x36\x29\x6b\x5c\x49\x8c\x93\x34\xe1\x8a\x4b\xc4\xad\x7c\xeb\x12\xbe\xef\xcb\x09\x9a\x45\x8e\x5f\x96\xdf\xdf\x71\x66\xa5\xc5\x3b\x32\xb0\x9d\xc6\xf1\xd1\xe0\x36\x70\x27\x00\x30\x6b\x7d\xc4\xc7\x6c\xba\x8e\xca\x2c\x65\x23\xdb\x6d\x3a\xdb\xcd\xad\xac\xbc\xc4\x77\x49\x54\xf7\xdc\x0a\xef\x3b\x0f\xef\x43\x87\x60\x28\x39\x18\x5e\x83\x0e\xfd\x07\x3e\x8a\x9e\x4c\x2e\xf7\xf4\x84\xa3\xf1\x58\xc4\x1b\x44\x2a\xc3\x41\x4d\x92\x68\x3a\xca\x47\xd9\x5e\xc9\x80\x4a\x8c\x43\x9a\x27\x0e\x05\x26\x96\x4c\xb0\x49\x29\x07\xe3\x63\x0f\x3e\xb8\xf6\x41\xb4\x17\x2e\x7d\x10\xed\x7d\xc6\xfb\x03\x3a\x4a\x33\xac\x26\x72\x7d\x71\x41\xa0\xb4\x20\xe7\x31\xfa\xe4\x82\xb0\xc0\xb7\xf0\x02\xef\x61\x5d\xb1\x64\xce\x58\xf2\xa0\xdb\xce\x72\xfe\x0e\xcc\xc3\xcd\xd3\x0c\xd8\x32\x01\x79\xc6\xfe\xfc\x31\x26\x27\x27\x10\x7b\x4d\x9e\x65\x6e\xef\x2a\x33\x5b\xb9\x80\xb0\x61\x91\x74\xd9\x4b\xd8\xbc\x08\x59\xe4\xc0\xdb\x6e\xbf\xc6\xee\x6d\x0e\xf9\x80\x77\xf1\xb1\x4c\xbd\xd9\x7b\x53\x83\x08\xdb\x46\xc3\xd9\xd3\x5f\x1e\x1b\x37\x6f\xe4\x8f\xa9\xba\xb3\x2f\x5d\x7c\x8d\x39\x36\xfa\xf3\x1c\x1b\xab\x7f\x3b\x24\xe0\x8f\x84\x57\x40\xf8\x75\xe2\xd9\x3d\x69\xcc\xd4\x9e\xe5\x9c\xf6\xb8\xdd\x3b\x6c\xb8\xb4\xfa\x96\xc4\x37\x65\xf5\x9e\x46\x64\xad\x9b\x23\xf5\xe1\xc6\x24\x21\xb7\x37\xfa\xb7\x52\x0d\xe7\x6f\xf9\x78\x6f\xed\xe2\x6a\x1f\xb5\xf4\x42\x29\xf0\x83\xef\xd7\xb6\xdf\x7a\x35\xd5\xf0\x9c\x31\xfc\xd0\x98\x39\xd5\x7b\xa9\xba\xc4\x35\xe0\x0f\xb5\x3f\xbf\xf5\xb5\x5c\x5b\x56\x63\x5f\x7e\xf8\x6f\xec\xcd\xb1\x71\x95\x67\xf5\xf8\xc6\x8b\x2e\xdc\x36\x47\xbf\x01\xc0\x49\x0b\xcc\xf1\xa6\x67\xdc\xcf\x30\x6d\x48\x8d\x3d\x97\x78\x76\xae\xfd\xc4\x1c\xff\x8a\xe0\x43\xe4\x3b\xfc\x87\x80\x51\x42\x67\x3d\x8a\x2b\xf2\x1d\x7d\xc3\xfe\x8d\x91\xb5\x05\x5e\xb8\x3e\xbf\x8c\x70\xe6\x39\x37\x8c\x1e\x29\xc6\xef\x8d\x21\xcc\x8a\x89\xe7\x70\xae\x86\xfd\x9b\xa6\xa7\x6c\xf8\x8a\x39\xce\xe9\x4b\x2b\x0e\xc3\xb2\xc3\x60\x7e\x72\x0b\xa0\xc1\x9d\xe0\x6e\xd0\x90\x8d\x8f\xca\xd4\xe2\xae\xaa\x36\xff\x64\x62\x2f\x32\xbe\x0d\x4b\x25\xc1\x8d\x0f\x4b\x73\x1a\xbb\x96\x9a\x9d\x81\xaa\x2f\x59\x24\xab\xe0\xd9\x6f\x5f\x55\x04\x77\x4e\x5b\xff\xed\x9f\x2c\x7c\x73\x5f\xfc\x9f\xb7\xbe\xff\xdc\xb4\xda\xda\xda\x79\x3f\x58\x56\xb7\x70\x61\x0c\xfd\x6f\xc0\xf3\xaa\x7e\x91\xd7\xbd\x74\x38\x62\xd0\x91\xbe\x4e\x0f\x9f\x8c\xeb\xde\x68\x5c\x84\x34\xec\x8c\x85\xc3\x6a\x84\x8d\x25\xdb\x91\xa8\xe9\x41\x39\x21\xe9\x52\xb0\xcd\xfb\x4f\x0f\x9b\x6c\xe9\xfd\x45\x4e\xe8\xe4\x85\x92\x51\x15\x4d\xaf\x6e\x5c\x32\x73\xc7\x92\x8d\x1b\x97\xec\x98\xb9\x64\xc6\x92\x99\xb7\x6d\x7c\xb5\xe2\xe1\x79\x8b\x37\x05\xe1\x7b\xa8\xdd\x30\x20\x1d\x8d\xd0\x31\x26\x05\x54\x45\x45\x6c\x34\x12\x8e\x68\x6c\x0b\x1d\x61\x04\xd8\x85\x3a\x51\xb7\xa4\xb0\xdd\x5d\x70\x8e\xe6\xad\x77\xd5\x66\xcb\xe8\x09\x0d\x3b\x26\x83\xcb\x19\x30\xfe\xba\x4c\x6e\x2a\xf6\x58\x9b\xf5\x2b\xf7\x5b\xba\xdd\x6d\x80\xfb\x3f\xea\x74\x99\xec\x93\x52\x2c\xc7\xa7\x25\xf8\xf4\x61\xf4\xb7\xfe\x4f\xa8\xbf\x1d\x58\x51\xd5\xbf\xf4\xff\xa7\xbb\x79\xbf\xb5\xf6\x99\xa3\x33\xde\x36\x3e\x85\x81\xb5\x17\x2f\x2a\x0b\x66\xd6\xfd\x23\xfd\xed\xed\x05\xef\xde\x6b\x2c\xb5\x2e\xe5\xd7\xca\x78\x5b\x30\xef\x8b\x24\x75\x8f\x84\x5a\xe3\x4a\x3b\x54\xb4\x8e\x0e\x2d\xa6\x6b\x9a\x06\xbb\x3b\x3a\x34\xd4\x8e\xba\xd4\x1e\x18\x49\x0a\x1e\x09\xb5\x25\xd2\x37\x64\x68\xac\x59\x4f\xe9\x9f\x69\x38\x3d\x83\xf3\x30\xd2\xd0\x4a\xd6\x40\x34\xe5\xb5\x1d\x15\x84\x7e\x6c\xf6\x42\xfb\x0c\xe4\x8d\x25\x3d\xf3\x0f\xe0\xac\x63\xea\xa0\x59\x8d\xff\x76\xfb\xae\x4f\xbe\x8c\x73\x40\x2e\x10\xcf\x76\xd9\x1e\x1b\x73\xf3\xf2\x4c\x1c\xf9\x3c\x3f\x1d\x4d\x94\x10\xb4\x9c\x88\xaf\x3f\xff\x13\xfc\xab\x6e\x1b\x0f\x09\x1f\x49\xe3\xbf\xf2\xdb\x2b\x1b\xb3\x79\x23\x16\x1d\x3d\xf3\x7c\xd6\x37\x03\x82\x56\xcc\xff\x23\x58\xda\xbb\x09\x67\x64\xd6\x01\x01\xac\x4d\x73\xfa\x8c\xce\x6f\xe9\xfd\x43\xca\xcd\xaa\xbc\x66\x29\x05\x98\x2d\xc4\x30\xc2\x21\xeb\x95\x5a\x86\xa2\x8a\xc2\xd2\xc2\x8a\xca\x52\x58\x61\x4e\x93\x4d\x03\xac\x2e\xc5\xf5\x51\xf2\x86\x35\x7a\x19\xa8\x47\x28\x95\x0a\xc3\x0e\x04\x68\x8f\x98\x02\x42\x07\x8b\xba\x45\xd4\xa1\xf5\x30\x86\x84\x7a\xa0\x18\x09\x23\xdd\xcb\x2a\x2c\x2f\x72\xc9\x04\x1b\x55\xa2\xac\xc1\xb2\xac\x12\x56\xe9\x68\x57\x50\xd2\x64\xad\xab\xab\xab\xcb\xf3\xe0\x7f\x8a\x82\x6a\xe0\x2a\xb8\xf4\xbe\xa7\xd9\x07\xae\x5d\x33\x7d\xd4\x90\x7e\x7d\xb3\xd1\x4f\xee\xf9\xc7\xfd\xef\xf4\xe5\x88\xd2\x05\x05\x8a\x1e\x51\x64\x45\x56\x94\x98\xc6\x77\xb7\xab\x0a\xaf\x28\x31\x06\x6a\x8c\xc2\xf0\x2c\xcf\xa5\x3f\xd1\xde\x28\xc7\x85\xd5\x30\x0d\x19\xd4\xd6\x16\x6b\x83\x9a\xa7\x1b\x49\x30\x98\xd4\x3a\x51\xeb\xdd\x73\xae\xba\xfb\x0e\x34\xff\xf0\x80\x2d\x03\xe6\xfc\x0b\xfd\xf3\xf5\x07\xb5\x5f\x16\x7c\xb9\x62\xc5\x8a\x15\xdb\x16\x2f\x5e\xb1\xc2\xc9\xdf\xad\xf3\xfa\x47\x5e\xfa\x5f\x76\xe4\x26\x7c\xf5\x33\x97\x3f\x8a\x90\x39\x0f\xbf\xe1\x3c\x67\x0b\xf6\xff\x85\xe1\x6f\xb0\x8b\x17\x98\xfc\xf7\xef\x36\xff\x75\xd8\xbe\x1b\xff\x96\xa3\x43\x96\x62\x38\xbb\x03\x5f\xfd\xab\xf5\x1b\x91\xd4\x2f\xcf\x2f\xb3\x61\xd6\x8a\x89\x3d\x2f\xba\xf0\x68\x1d\x29\x4f\x5c\x98\x7c\x31\xc4\x8c\xa3\x2f\x50\x75\xbb\x76\xfc\xdd\xc7\x8c\x1c\xa9\x38\x64\xe9\xd2\xec\x7b\x35\x76\xd9\x72\x8d\x91\x95\x83\x1a\x3f\xb5\xf4\xcd\x4c\x6c\x7c\x04\x6b\x58\xc3\xc0\x78\xb0\xc4\x96\x46\x31\x84\x55\xa4\x01\xd5\x62\x1b\x01\xb3\xe2\x47\x65\x5a\x35\x29\x2d\xf2\x66\x54\x92\x4b\x45\xcf\x17\xda\x2d\x2f\xaa\x6a\x20\xc1\x8c\xac\xca\xed\xde\x56\x18\xd1\x21\x60\x18\x81\x17\xbb\x90\xd2\x0e\x3b\x75\x44\x69\x2a\x03\x41\x07\x12\xa0\x8c\x3a\x61\x8f\xc0\xf7\x74\xc3\x6e\x44\xa5\x3f\xbd\xdd\x39\xb1\x18\xaa\x22\x26\x54\x5d\x63\xe4\xa8\x2c\x32\xac\xd1\xc1\x75\xb5\x44\xc2\x86\x24\x28\x1a\x2f\xab\x12\x67\x14\x28\x92\x24\x33\xac\x28\x09\xaa\x9a\x04\x2c\xeb\x61\x19\x55\x52\x55\xc3\xe0\x38\x23\xd9\x61\x20\xd6\xf0\xd1\x36\x4f\xe8\x60\x65\xb9\x15\xb5\xa5\x00\xea\xa1\xe2\xe1\x96\x04\x1f\x17\x75\xa1\x43\x8c\xf2\xb4\x1c\xe3\x04\x96\x65\x79\xc1\xb2\xf7\x69\xb8\xd6\x64\x18\x0c\x01\xa3\xb0\x57\x60\x36\x98\x9b\xe9\xd0\x6d\xd6\x88\x80\xc5\x04\x07\x1e\x5a\x9c\xfd\x3e\x18\x5a\x17\x02\xe6\x15\xe2\xb6\xfc\x71\xb0\x66\x65\x53\xd1\xcb\x1a\x5e\xa6\xaf\xd5\xe8\x6b\x81\xed\x5a\x24\xaa\x2b\xbc\xa2\xa9\x2a\xdf\xed\x6d\xd5\xe8\x84\xc6\x6b\xba\x28\xf0\x09\x59\x8b\x44\x0d\x45\x50\xd4\x20\x2f\xf3\x6d\x7d\x5d\x5a\x38\xa2\xc9\x82\xac\x70\x71\xbe\x13\xb5\xe5\xf4\xdc\xf2\xff\xf4\x9b\xd1\x9a\xef\xdf\x17\xaf\x84\x61\x6f\x4b\x1f\xab\xa1\x56\xc8\x14\x04\x23\xb1\x18\x27\x48\x12\xa7\xb1\xa2\xd6\x16\x11\x59\x51\x12\x39\x95\x15\xf5\x78\x84\x65\x78\x41\x96\xf8\xa0\xc4\x89\x7a\x7b\xfa\x36\x51\x96\x78\x49\x14\x75\x6f\xbb\x1d\xb8\xb4\xf1\x91\xde\x23\x4f\xe7\x95\xbf\xb2\xf5\x3d\xc3\x04\xff\x28\x3b\xff\x2a\xe8\x0c\x05\xce\x56\x02\x80\x32\x75\x6a\x1d\xf1\xa8\x2f\x75\xbb\xfd\xfb\x26\xce\xbe\xb8\x12\xcf\xfa\x49\x1e\x1b\x4b\xd9\xa1\x57\xd2\xd7\x0e\xb5\x38\x6d\x81\xd6\x3a\xfe\x4c\xf0\x9f\x38\x41\x37\xfe\x44\xf0\x0c\xe2\xf9\x8d\x1f\x13\x74\x1e\x3f\xe3\xd4\x50\x42\x66\xfd\xc8\xc5\x1b\xcc\xdf\x74\x12\xb2\x1b\xa1\xbf\x36\xfe\x31\x27\xb6\x61\x08\xf6\xe3\x5e\x01\x40\x28\xf0\x34\x4a\xf5\xda\x7b\xc0\x93\xf1\x12\x58\x7a\xf7\xc7\x37\xda\xb2\x3e\x41\x37\x1a\xb3\x7d\x42\x46\x04\x5e\xce\xfa\xc1\xcf\x3e\x04\xde\x65\x86\x55\xbf\x1a\x6a\x38\x2b\x81\x7f\x32\xa0\xaa\x98\xaa\x3b\xbb\xda\xf7\x5b\x06\x54\x2d\x75\xc9\xd3\x58\x76\x6d\xfc\xfd\x25\x78\xe9\x87\xf6\x7e\x45\x48\x99\xb6\xf1\x77\x39\x74\xd6\xdc\xc7\x6c\x4e\x32\xd9\xaf\xa9\xcc\x98\x82\xaf\x9a\x75\x21\x63\x4e\x1b\x5d\x63\x47\x8e\xad\x15\xbf\xf7\xe1\xcd\xf8\xea\x07\xf6\x39\x92\x71\x4e\xd8\x4f\x77\xe8\xa7\x36\x6d\x23\xf7\xe4\xd7\xc4\x1a\x08\xff\xe6\xa1\x5a\xfc\x9b\x09\x2e\x5f\xe2\x0d\x04\x6d\xfe\x95\xb5\x37\x0e\x5f\x61\xd3\x98\x1c\xdb\x64\x69\xf6\x5c\x1a\x7f\xe9\x82\x41\x73\x7f\xde\xcf\xfb\x4e\xfe\xc6\x5f\xd8\x70\x36\x3b\xb0\xc7\x2f\x53\x0d\x3b\x8e\xfd\xee\x1a\x66\xfe\xc4\x3f\x3b\x6a\x68\x70\x81\x5d\xe9\x6b\x47\x66\xb7\xfd\x71\xfc\x8c\xf1\xaa\x59\x15\xc4\xce\x7f\xca\x5b\x7f\xa7\xf1\xe7\x36\xfc\x92\x7b\xdb\x6e\x9f\x53\x2d\x11\xcf\xdf\x70\x64\x78\xcb\xd7\x13\xfe\x50\x73\x63\xc8\xbf\x23\x13\x47\xa1\x98\xfb\x7b\xe4\x1e\xcc\x2f\x71\xfe\x80\xfd\x3c\xc6\x81\x2b\xef\xd9\xef\x96\xa9\xf9\x65\xc2\xd0\xcf\xdc\x3e\x62\xeb\x1c\x71\xd5\xa4\xc3\x5b\xed\x6b\x59\x3d\x1d\x47\x32\x50\xfe\xc6\x77\x9d\xba\x99\xb5\xf6\x9c\xfa\x95\xd6\xf3\xb3\xf5\x2b\x1d\xbd\xc2\x1a\xdf\xc9\xeb\xd7\xf6\x37\xfe\xd8\xc6\xbb\x31\x81\x17\xfd\xcf\xa4\x71\xa4\xc8\x17\xaa\x9b\xb2\x00\x7c\xc2\x80\x58\xdc\x89\xdf\xd6\xbb\x64\xea\x3e\xae\x4d\x0d\x08\x6c\xf2\x4f\x4f\x3f\xe3\xab\x0f\xa8\x86\x73\x7f\x2a\x3f\x30\x6e\xd0\x88\x66\xaa\xfe\xc8\xe3\xe0\xc7\xa9\x1f\x54\x7d\x43\xff\x30\x8f\x6d\xc8\xe2\xbd\xcd\x63\x6c\x18\x20\x65\xc7\xb7\x09\xd8\x20\xfd\xa1\x35\xf8\xea\x5b\x2e\x19\x05\xc3\x9a\xb1\x11\xeb\x8a\x8f\xb8\x68\x1a\xc1\xe7\x9b\xaf\xb0\x65\x0e\x72\x0f\xff\x97\xa0\x9f\x44\xfd\xdf\xc6\x37\x6d\xd9\x85\x76\x9c\xed\x1b\xb6\x7d\x84\x0d\xb4\x11\x7b\xf8\x23\x7b\x0f\x39\x87\x0d\xe2\x87\x84\x0c\x44\xc0\xa4\x59\x1b\xae\xb1\xd5\xa5\x33\x98\xba\x6d\x01\x41\x6b\x49\xdc\x78\x9d\xa0\x29\xe4\x33\x7e\xe0\xd6\x25\x8e\xef\xc4\xcf\xd0\x70\x34\x7d\x21\xfe\xbe\x03\x4b\x4b\x11\x6b\x5f\x1d\x3e\xbf\xc6\xef\xbb\x7d\xd3\xd6\xf8\xf7\x1c\x3e\xe6\x0c\xed\xf4\x37\xbe\x66\x8f\xd7\x07\x76\xfb\xe7\xa7\xc7\x7d\x1f\x50\x4b\x13\xb7\x02\x1a\xfd\xab\x76\x42\x6d\x2c\x54\x97\x30\x40\x2f\x03\xc6\xf1\x96\x0f\xf0\x5b\x01\xb3\xfe\xf4\x4d\x60\x2c\x18\x0f\x66\x81\xb9\x60\x01\x58\x6a\x5a\xaa\x33\x3e\x1d\x88\x99\x7a\x49\xd1\x00\xff\xcd\xd0\xf4\xfc\xa6\x25\x05\x33\xce\xb0\xa8\xb4\x32\xad\x2e\x16\x99\x61\x03\x66\xd4\x6a\x99\xef\x52\xc6\xbd\x62\xa2\x4a\x1b\x2c\xf6\x78\xcb\x43\xde\x6a\xef\x13\x7d\x6b\x3d\xc9\xbe\xe7\xbd\x0f\x24\xbf\x55\x50\xba\x17\x3d\x0c\x7f\xb9\x6c\xd7\x5d\x91\xbd\x31\xf4\xd6\x5e\xf4\xee\x5e\xf8\x53\xb4\x76\x6f\x37\xe7\x95\x25\xb5\x15\x52\x31\x14\xef\x6e\x47\x2d\x74\x77\x42\x86\x61\x95\x47\xac\xd0\x17\xce\xc9\x9c\xd1\x15\x49\xd1\xc2\xaa\x24\xc9\x0a\x14\x15\xb9\x5d\xef\xf4\x05\xd1\xfc\xf9\x93\xe7\xd4\x22\x69\x73\xed\x92\x37\xab\x6e\xba\xe3\xa6\x65\xe8\x77\x70\xe8\x5f\xe0\x2d\x4b\x6a\x37\x27\xa7\x2d\x5a\x74\xdf\xb8\x9b\xfb\x6f\x18\x34\x7b\xd2\x2d\xd2\xa0\x91\xe3\xae\x18\x19\x1b\xe7\xfb\xca\x96\x0c\x74\x41\x52\x55\x01\x75\x71\xa2\x2a\xf3\xa8\x93\x47\xed\xa8\x53\x82\x54\x3e\x7b\x6e\xe3\xff\x00\x77\x7c\x92\x09\x9b\xaf\xe6\xf7\xc5\x36\xb6\xe4\xf0\x22\x73\x9e\x57\x2e\x71\xff\xcb\x79\x63\x3f\xfc\x8d\x17\xec\xf1\x28\x89\x97\x87\x70\x9c\x42\xe3\x79\x7b\xad\xa4\xde\x7a\xce\xfa\x0d\xe3\xa4\xf3\x07\xc6\xb8\xfd\x3f\x96\xdc\x7d\xd6\x6d\xfb\xb4\xd6\x7a\x26\xbf\xdf\xa9\x31\x41\xd8\x19\x73\x78\xe3\x61\x25\x9f\xbd\xa9\xf1\x25\x02\x27\x49\xd9\xe7\xb4\x8d\xdb\x0e\xdf\x77\xe3\x29\x37\x7e\x58\xef\x76\xd2\x5e\xd3\x90\x80\xee\x7f\x84\x6a\x38\x5b\xd9\x7d\x25\x73\xeb\xc8\xba\x50\x43\xe3\x70\xf0\x32\x03\x46\xfd\x88\xaa\xbf\x50\x92\x4a\x81\x57\x99\x67\x62\xbf\xb7\xf6\xc1\xb9\x96\x13\x39\xf6\x3b\xcc\x8b\x4f\xcc\x4a\x5f\x3d\x71\x8f\xcd\x13\xc8\x6b\x33\xf1\xbf\x33\xf0\x1d\x77\x13\xb8\x8f\xd7\x76\x72\x2c\xe6\xd7\xe6\x6e\x1e\x07\x20\xd7\x26\xdc\x78\xcc\x4d\x2f\xac\xbb\xe3\x00\xe4\x95\x09\x8f\x5a\xe3\x35\xa9\xdb\x71\xbc\x63\xc3\x85\x1b\xba\xd7\x32\x60\x8c\x12\x6a\xb8\xf0\x07\xdf\x47\x0c\xa8\x58\x47\xd5\x5d\x18\x59\xf1\xb7\xb1\x3f\xaf\x9c\xea\xa8\xe1\x15\x21\xe8\xf6\x11\x5b\x16\x21\x69\xcc\x8b\x39\x72\x95\x09\xcb\x87\x2f\x61\x8f\x3c\x64\xaf\x71\x7a\x40\xf3\xab\xa1\x86\x53\x3f\xf7\x95\x32\xa0\x72\x8b\x49\x9d\x42\x75\xdb\x24\xf0\x0d\x03\x62\xb2\x83\x97\x9a\x3c\x02\xe7\x66\x34\x1e\xcc\x8b\x53\xcd\x6e\x1f\x89\x35\x6e\xb8\xe5\xb5\x23\x2f\x62\xfe\x7f\x04\xd3\xd3\x21\x79\xe1\xeb\xbb\xc4\x3e\x66\xe7\xca\xe8\x9b\x2f\x58\xd7\x04\xbc\xfe\x0c\x4d\x3d\x90\x23\x77\xe3\x71\x23\xe2\xe0\xf1\x9b\xf0\xfd\x5f\x51\x0d\xc7\x1e\xf1\x94\xd4\x7a\x19\x9e\xaa\x6b\xfe\xf7\x7b\x9f\x30\xe3\xab\xb6\x83\x6f\x65\xea\xa0\x01\x1f\x28\xc2\x55\xa9\x33\x39\xdc\x77\x01\x11\x3c\x9c\x89\xba\xc9\x7a\x52\xcc\xae\x08\x79\xb5\x53\xab\xe5\x27\x61\xcb\x1b\x0c\xcd\x4b\xd7\x65\xc2\x2a\xd2\x3f\x1a\x0c\xcd\xac\x11\x32\x0b\xa1\xa2\xa8\xca\x6a\x5a\x89\x9b\x5b\x97\x7b\xff\x28\x31\x0a\x23\xa1\xe9\x1e\xce\xf0\x48\x49\xcd\xd3\xf9\x4d\xab\xa7\x35\x99\x40\x39\x7d\x18\x02\xbe\xe4\xa7\xf0\xe7\x17\x27\xe9\x9b\x37\x7b\x7e\x44\x85\xf5\x68\xe4\x11\xf4\xdd\x5d\x68\x0f\x5c\x86\xf6\xc0\x8b\x70\x81\x06\xc7\x73\x7c\x0a\xa0\x3f\xb2\xec\xcf\x19\x4a\xa1\x58\x1a\x7d\xda\x36\x67\x57\x77\xef\xf7\xf7\xc2\x1f\xa2\x5a\x08\x5b\xc3\x9f\xa3\xb6\x29\xbe\xc7\x38\x81\x13\xb8\xde\x36\x4d\x53\x35\x55\xd5\x7c\x1b\x6d\x15\x76\x9d\xb4\x08\x7d\xb6\x09\xd5\xa3\xb5\xd3\x21\x07\x8f\x78\x96\x94\x5c\x53\x3e\xbc\xf2\xfd\x45\x8b\x16\x2d\x6a\x99\x97\xfe\xef\xcb\x45\xa3\xa3\x13\x06\x5c\x1d\x9d\x50\xb2\xbc\xfc\x9a\xe1\x13\xe0\x88\x65\xd1\xf1\xe3\xef\xdb\x35\xa0\x64\x51\x49\xc9\x70\x5b\xf6\xcc\x9e\x4f\xd9\x61\xdc\xe9\xfe\xf0\x61\x97\x6d\xc4\xb4\xb5\x7f\x27\xaf\xbc\xe7\x6f\xdc\xef\xa6\xdf\x2f\x8e\xc3\x3a\x5b\x6d\x56\x73\x7a\x91\xac\xad\x4e\x3c\xcf\xd8\x90\xbe\x7a\x7a\x81\x53\x96\xb1\xe6\xdd\xe7\xf6\xcf\x59\xbf\xc1\x3d\xfd\x1b\xf7\x3a\xed\x41\x16\xce\xeb\x97\xe0\x0d\x7b\xf2\xda\x02\xfd\x8d\x4d\x39\x76\x7f\x13\x5f\x77\x13\x78\x4c\xe6\xb9\xfe\x25\x7d\xf5\xe0\xa7\xf6\xbb\x90\xb8\xff\xbc\x3d\xd7\xd8\x40\x93\xdf\x8e\x4d\xc4\xf2\x7a\xfd\xc1\xe3\x70\x03\x7a\xb7\xf2\xc6\x31\x6c\x1e\x1a\xe8\x6f\x7c\xce\x41\xab\x2c\x3c\x0a\x95\xef\x49\x53\xd9\xab\x43\x4b\x9f\x9b\x03\x00\x78\x9b\x01\xc3\xbf\x0a\xf9\x77\x7f\xe3\x90\x63\xec\x7d\x31\x63\x40\x1b\x9f\xb5\xe6\x77\xd4\x6d\x6c\xdc\x95\xc3\x63\xcd\x35\x6b\xc4\x78\x4b\x76\xae\xd3\x09\x7c\x2e\x2f\xd9\x7b\x43\xe2\xf6\x4e\xc2\x77\x46\x3e\x63\x87\x5b\x07\xb2\xf8\xca\x33\x84\x2f\x2f\x9e\x7d\xb7\xf3\x0f\x80\xcb\x53\xab\x42\x75\xcf\x7e\x9d\x96\xad\xc6\xac\x75\xcd\x69\xae\xcf\x74\x86\x5d\x81\xd7\x77\xc8\xaf\x5a\xfd\xc0\x8a\xc1\x70\x30\xca\xaa\x7d\x97\xc9\xe8\x2f\x2a\x29\xaa\x28\xc4\xe1\x33\x85\xbe\xca\xd2\x34\x5e\x97\xf4\xaf\x2c\x2d\x82\x6e\xf7\x88\xd9\x44\x10\x5a\x29\xc7\x45\xd6\xc7\x57\x8c\xb3\x39\x2e\xd9\xd2\xd5\xfb\x33\xf4\xf7\x5f\xfe\x14\x0e\xef\x6b\x87\xf3\xbf\x07\x0d\x24\xbc\xf9\xa6\xe7\x23\x4f\x97\xa8\xeb\x9d\x6c\x57\xab\xd6\x16\x33\x64\x99\x15\x05\x49\x66\x93\xed\x49\x9f\x4f\xba\xa8\xe9\x05\x4c\x6f\x6b\xe6\x03\xc3\x34\xea\x41\x2d\x34\x64\xbc\x0c\x8c\xc0\x30\x87\xba\x50\x47\xaf\xee\xce\x46\xf5\x3d\xb6\x72\x25\xfa\xf9\xca\x55\x9e\xae\x0f\x57\xae\x6c\x5b\x80\xde\x59\xb9\xd2\x33\x47\x7d\xf7\xe9\x3b\xaa\x36\x0f\x7f\x64\xee\xd8\xcd\xc3\x26\xad\x58\xbe\x5c\x9b\xb1\xfa\xe9\xe4\x33\xc9\x16\x68\xd0\x6d\x74\x6b\x34\x2e\xc5\xa2\x4a\x98\x0e\xc7\x14\x26\xe2\x37\x9c\x79\xa8\xbc\x83\xef\x37\x12\x38\x40\x9e\xdb\xb6\xbc\xb0\xee\x6f\x7c\xda\xcd\x57\xad\xfb\x55\xfb\x3c\xa9\x1c\x58\xa5\xa8\xba\xe7\x6a\xc1\x69\x86\x1e\x7b\x83\x0b\xaf\x4c\xfa\x5f\xed\x80\xc3\x2c\x4c\x3d\x95\x9f\x3f\x1a\x55\x6e\x7b\x8c\x35\x9e\x8d\x17\xad\x26\x60\xb3\x41\x4f\x5c\xbb\x7b\x9c\x34\x76\x72\xa8\x6e\x67\x18\x7c\xc4\x80\xdb\x3e\x72\xc4\xc3\x9b\xcf\x7a\x32\x07\xe7\xcd\xf1\x6f\xe7\xa7\x1d\x4d\xe3\x81\xcb\x27\x6c\xed\xcf\x13\x97\xb0\xa1\x6c\xcd\xd1\x63\xcd\xf9\xb7\x60\x58\xbe\x0c\xeb\x54\x07\xfc\x32\xb8\x16\xdc\x00\xa2\x60\x38\x98\x00\x58\x20\x83\x8d\x60\x2b\x00\xd0\xac\x42\x01\xab\xaa\x73\x33\xda\x3c\x90\x28\xd4\x3c\x74\x60\x51\x60\x74\x79\xfe\x42\x26\x05\xbe\xf2\x48\x60\xa0\x55\x66\xbc\xc2\x74\x3c\xe4\xf3\x12\x0e\xe9\x5f\x5a\x59\x81\x6b\xac\x95\x95\xc3\x34\x56\x58\x3a\x06\x23\xf2\x2c\xa3\xb5\xa4\x80\xae\x32\x2a\x47\xab\x54\xb0\x0b\x75\x45\x75\x55\x56\x22\x86\xa0\xf1\x30\x1c\x8b\xa8\x91\x18\x12\x54\x8a\xd1\x58\x28\xd0\x1a\x9d\x13\x83\xe6\x3f\x33\x16\x7d\x27\xf9\x65\x14\x9e\x4e\xcd\xae\x82\xc3\xef\x1f\xf1\xe4\x88\xfb\x9b\xd1\x65\xd7\x78\x46\x27\x8f\x8f\xf0\x0c\x9a\xb2\xe6\xa9\x0b\x13\xdf\xd9\xf7\xd2\xef\x6b\xde\x79\xe6\x91\xdb\x57\xc4\x97\x40\xff\xec\xf6\x2f\x06\x04\xbe\x78\xfe\xc6\xb1\xb0\xff\xc4\x47\x96\x8c\xed\x99\x38\x62\x49\x74\xa2\x97\xa7\xc2\x92\x12\x43\x5a\x0a\x44\xa2\x7a\x34\xd1\x41\x33\x31\x96\x56\xb4\xb6\x68\x58\x6f\x81\x74\x14\x75\x27\x83\x8a\x41\xc7\x15\x2a\xd2\x96\x60\xe3\x86\x91\xa0\x5a\x34\x1f\x67\x6b\x21\x0d\xab\x26\x0c\x58\xd7\x34\x6f\xd9\xd6\x6d\xd1\x55\xeb\x56\x6d\x7c\x78\x9d\x74\x68\xd1\x6d\xd1\x0d\xa3\xe7\x2d\x1c\xbe\xa1\x84\x5d\xb8\xf5\x15\xed\xce\xcf\xe0\x95\x0f\x8f\x99\xb0\x8a\x1d\x93\xac\x5a\x75\x27\xfb\xb0\x77\xf0\x78\x76\x0c\x3b\xde\x92\xa7\x49\x19\xae\xec\xf8\x4c\x7c\x8a\x9b\xf3\xe8\x2a\x19\x59\x48\xb1\x69\x3b\x29\x73\x3d\x4e\xc0\x0f\xc9\x2f\x36\x11\xf8\xa5\xd9\xb6\x08\x53\xe2\xf5\x9f\xac\xc9\x2b\xeb\x66\xea\xf2\xad\x48\xd5\x64\xed\x17\xa1\x86\xed\x47\x7b\x11\x03\x26\x86\xa8\xfa\x6d\x23\x53\xef\xa4\xbc\x4c\xf7\x98\x6a\x4b\xf6\x77\xfa\xde\xcd\x15\x6d\xc8\x87\x53\x8d\x8f\x5d\x42\x27\xc9\xd4\xa5\xa3\x5d\xb2\xeb\x23\x16\x3c\x2f\x4c\xd5\x04\x5a\xfc\x6b\x70\xbd\x87\x1b\x70\xc7\x6f\xb3\x26\x29\x6f\xf6\x5b\x2f\x8f\xe4\x95\xc9\x70\xa4\x4b\x65\x49\xb9\xaf\xa4\x08\x87\x77\xf9\x2c\xef\x57\x46\x57\xce\x8c\x67\x04\xbc\x81\x8e\x14\x6c\x5f\x2b\x8b\xb8\xa4\x4e\x7b\x40\x5f\x2b\xfc\x6d\xdc\x73\xb9\x01\x3f\x46\xd7\x1b\xc9\xaf\xe2\xa8\xcc\xfb\x5e\x24\xec\x79\xff\x9b\x15\xde\xcb\x23\x49\x54\x70\xb2\x77\x66\xb3\x77\x79\x5f\x53\xc1\x9f\xef\xe2\x23\x74\x44\x0c\x5f\xfc\xb3\x0e\xc7\x7b\xdf\xef\x1b\xa6\x79\xce\x26\xef\x4c\x7e\xe9\xed\x6f\x78\x2e\x26\x5f\xea\x81\xaf\x72\xa8\x1c\xbd\x67\xa0\x0f\xd0\x88\x05\x70\x35\xbc\x35\xf9\x02\xfc\xa3\x7c\x77\xf1\x8e\x82\xa6\xbb\xee\xba\xeb\xae\x35\xb7\xdf\xce\x71\x45\xb7\x0c\x5b\xb9\x72\xd8\x7b\x5f\xce\x99\xf0\x6b\xf4\xf3\x09\xb7\x07\x56\x8d\x6e\x41\x2f\xc0\xd7\x9e\xff\xf7\x5d\x77\xa1\xb9\x8d\x8d\x6b\x17\x57\x3d\xb7\xe4\x18\xfa\x3b\xbc\xea\xe0\x7d\x6b\xab\x1e\xc3\xb0\xb0\x30\xb0\xcb\xe6\x85\x0d\x47\x66\x8f\x07\x35\x73\x18\x40\xd5\xc5\x37\x05\x2e\x1b\x5b\x51\xbb\x23\x95\x02\x63\xb0\xdd\x41\xa6\x1a\xf6\x14\x5d\xfc\x0f\x33\x6f\x6c\x05\xd5\x70\xb0\xf9\x6f\x0c\xf3\x97\xb1\x93\x43\x19\x99\x9c\x71\xc6\x2d\x36\xca\x97\xb0\x37\xae\xcf\xd1\x1f\xcd\x13\x5f\x77\x09\xbd\xe4\xe1\x4b\xc8\x4b\x6b\x09\x1a\xd9\x4a\xdc\xbf\xc6\x1e\xbf\x3b\xb0\x2b\xad\xaf\x3c\x7b\x23\xe8\x64\x40\xf5\x63\x54\xc3\x85\x72\xf8\xf3\xda\x75\xa3\x4e\x85\xfc\x89\x48\x5e\x7a\xf9\x10\xa1\x8f\x92\x6b\x5e\x9d\xdf\x8e\xd7\xb4\x9b\xd0\xe7\xc9\xfb\x25\x7b\xcd\xa2\x63\xcd\xab\xac\xf1\x98\x6b\xaf\x32\x71\x58\x52\x2a\x60\xc5\x61\x0d\xc6\xd5\x44\xef\x35\xeb\x89\x66\x74\x87\xc2\x8a\xc2\x12\x5f\xf6\xff\xe3\xe8\x5e\xeb\xfa\xd0\x34\x18\x57\x17\x56\x14\xe6\xad\x27\xda\x3f\x6f\x91\x00\x6f\xab\xee\x69\x4d\x32\xde\xe8\x37\x14\x8c\xe9\x50\x80\x5d\x1a\x8c\xa0\x4e\xc8\xf5\xd1\x09\x3d\xde\xa7\xe8\x38\x4d\x96\x0a\x23\x15\xc5\x68\xd5\x50\x11\xef\x26\xa2\x41\x6f\xd4\xf0\x46\x93\x12\xa4\xa1\xc4\x21\x0e\xb5\x19\xa8\x03\x71\x22\x94\x60\x2c\x29\xf9\xe4\x75\xab\x9e\x58\xb5\x0a\x06\xd0\x37\x2f\x3d\xbf\xe0\x5f\x0b\x16\xc0\xad\x68\x23\xfc\xc3\x56\xe1\xc4\xb0\xe9\x73\x6b\x17\x14\xc3\xf5\x68\xdf\xc0\x82\x65\x36\x29\xec\xbd\x65\xea\xd4\x87\x56\x57\xc8\x77\x9f\x40\xbf\x87\xd7\xbe\x70\xff\x8a\x5a\x19\x80\x6f\x11\x3d\x3b\xcc\x1c\xab\xd1\x20\x06\x58\x30\x15\x70\x60\x66\x1a\x7f\xf3\xf7\x0e\xf6\xa7\x15\x2a\x5c\x85\xc7\xae\x8e\x3e\xb4\xa4\xb0\xa4\xba\xa2\xb2\x34\xf3\x37\x27\x84\x95\x28\xcf\x93\xfe\xab\xc0\x76\xdd\x43\xeb\xb0\x1d\xd1\x7a\xb2\x5d\x47\xb4\x5f\xe7\xba\x50\xbb\x87\x69\xd5\xbb\x82\x31\x46\x89\x45\xa1\x7c\x51\x86\x09\xc4\x29\x89\x04\x54\x61\x1c\xf1\x4a\x3c\x9e\x34\xbc\x22\xd2\xa1\x8e\x44\x1d\xc5\x60\x1b\xd2\xf5\xf6\x76\x28\xb6\x27\xdb\xf0\x1f\x3f\x25\x8a\xa2\xa8\x8a\x22\xcf\xf3\x1a\x17\xed\xd4\xfa\x34\xaf\x84\x14\xd4\xaa\x8a\x12\x64\x60\x0b\x94\xa2\x31\x14\x97\x14\x31\xfd\x0f\x6a\x4b\xb6\x88\x6a\x77\xb7\x2a\x42\x41\x92\x24\x64\xc8\xb2\x6c\xe9\x13\xa4\x8d\xe8\x41\x1b\x36\x45\x87\x9e\xf1\x00\x61\x37\x6d\x25\xee\x5f\x61\xdb\x62\x2c\xfe\x70\x78\x6b\x5a\x07\xc0\x11\xcc\x75\x4d\x37\x83\x9f\x32\x60\xf4\x13\x79\x74\xec\xe5\x84\xfc\x43\xc2\xee\x32\x9b\x26\xc7\x08\x5d\x0c\xcf\x4a\xf9\x1b\x45\x97\x5d\xd5\x9c\x2b\x53\x87\xed\xde\xd4\x98\xc0\x56\xff\xe2\x50\xc3\x85\x1b\x7a\x05\x06\x8c\x51\xa8\x86\xb3\xc9\x2b\x7f\x3b\xee\xea\xd1\x9f\x50\x75\x17\xbe\x93\xfc\xa8\x76\x77\x45\x53\x2a\x05\xee\x4b\xd5\x06\x0e\xf9\x65\x6a\xe9\x85\xf7\x40\x41\xea\x4a\x66\xfe\xb8\xfb\x32\x79\x35\x8d\x51\xe0\xeb\xfb\x84\x19\x76\x5b\x1b\xb8\x02\xac\x4e\x8d\xc2\xb1\xca\x45\xd8\x73\x6c\x4a\xde\xf7\x80\x7b\xc1\xfd\x38\x8b\x7f\xa5\x59\x15\xa6\xc8\x6e\x37\x54\x6a\xaa\xcf\x79\x73\xa0\xfa\x5b\xf1\x10\xce\x3e\xe6\xae\x46\x14\xb8\x7b\x51\x45\xb5\xa3\x46\x35\x59\x94\xcb\x3b\x6c\xe2\x1f\x50\xfb\x84\x4d\x87\x26\xf6\xfb\xf6\x40\xb1\xef\x13\xf1\x19\xe8\x45\xd7\xb8\xb1\xe8\x2e\xcf\xf7\x92\x93\x38\xef\x0c\x74\xbc\x56\xaa\xa5\x23\x6c\x7d\x18\xed\xf3\x7c\x8f\xaf\x7e\x8a\x9e\x8e\xc6\x3c\x45\xaf\x97\x04\xef\x52\x6f\x14\xb5\x46\x60\x2c\x49\x77\x47\x50\x6b\x6b\x1a\xea\xec\x8f\x9c\x50\x05\xcd\xe8\x94\x94\x84\x60\xf8\xca\xa5\x89\x65\x13\xaf\xbf\x7e\xe8\xea\x61\x07\xee\x18\x7b\x37\xdc\xb4\xf3\x7a\x38\xcc\xc6\xb0\xe4\xba\x27\xd6\x3e\x81\x84\xa5\x5c\xbf\x67\x07\x4e\x80\xdb\xf8\x07\x37\x4c\xd9\xf0\x60\xc5\x75\x9f\x37\x2f\xdd\x50\xa0\xa8\x72\x9f\xe1\x15\x64\xa4\xaa\x48\x55\xd2\xff\x76\x73\x82\x2c\xf1\x3c\x2f\xb1\x2a\x0d\x2e\x07\x52\x6a\x46\xfa\x0c\xc0\x65\xe0\x4a\x50\x88\xeb\x26\x95\x82\x19\x80\x07\xf7\x83\x87\xb0\xa5\xc3\x0a\xf9\xf6\x5a\xd4\xc9\x97\xad\x47\x57\x62\xf2\x58\xdf\xff\x51\xe0\x2b\xa9\xaa\x2e\xb1\x05\xbe\x4b\xe7\x46\xc2\xce\x58\x04\x46\x93\x14\x0c\x87\x69\xd3\xce\x91\xfe\xc8\x3a\x4a\x68\x1a\xe4\x50\xc2\x0f\x18\xf4\x64\xf2\xfd\x9b\xe1\x8f\xd1\xe7\xf7\xdd\x0a\xc7\x2f\x1e\xb5\x73\xd4\xe2\x13\xc9\xbf\x5e\xe7\xe1\x93\x4f\x8c\xf2\x8c\x9d\xfe\xc8\xce\xd6\xfa\x5f\xbf\xf8\xea\x67\xcc\xaf\x9b\x94\xe9\x0f\x9d\x5b\x01\x8b\xe7\xfd\x1e\xc2\x81\x01\x94\x3a\x70\x33\x03\x87\xb0\xca\x8a\xf1\xa8\xa7\x7e\xd4\x8a\x9b\xeb\x7b\x97\xe6\xe4\x2c\x45\x78\x49\x55\x39\x16\x29\xaa\xa8\x4a\xc9\x6e\x86\xf3\x44\x50\xbc\xbd\x20\x2a\x8d\x27\xc4\xb9\x0d\xeb\xd6\xad\xca\x23\xce\x5d\xb1\x6e\xcc\xf8\xb4\x38\x57\xbd\x6a\x3a\xbb\xce\x7b\x3d\x16\xe7\x60\xd2\x3e\x25\x47\x5c\xa5\x89\x63\x0d\x96\x8e\x39\x37\x15\x0b\x9c\xc6\xb5\xe2\x46\x82\xfb\xc0\x22\xb0\x14\xac\x00\xab\xc0\x1a\xb0\x1e\x3c\x06\x1e\xc7\xd2\x79\xb1\x3f\x60\x47\x78\x95\x93\x81\x5f\xe9\xcd\xbd\x54\x5c\x84\xd5\x87\xab\xc8\x2c\xc3\x3e\x06\x9a\xd8\x71\x33\xc4\xe9\x3e\xa6\x43\x00\xe7\x0b\x9a\x75\xcc\x02\xae\x74\x1f\xf7\x5f\xcf\x17\xf5\x2b\xd7\xff\xfe\xf7\x4d\xeb\x97\x4e\x9f\xbd\x63\xf6\x0b\xeb\xde\x9d\xfe\x2b\x38\x64\xfe\xfd\x34\x1c\x82\xb6\xe6\x04\xe4\x04\x9f\x1d\x78\x1d\x7c\xf8\xba\x21\xf0\x16\xd4\x00\x7f\x80\x26\x54\x3c\xbc\xb1\xe2\xba\xc0\x13\x03\x57\xfe\x72\xc2\x5e\x1e\x7d\xdc\x08\x8f\xa1\x87\x87\x56\xf0\xb0\x5f\x00\x3e\x31\xe4\x7a\xf4\xf2\xf8\x81\x10\xa4\x00\x6c\x84\x03\x93\xf3\xed\x6f\xe3\xe1\xf5\xe8\x63\x78\x0c\x56\x24\x87\x64\xbe\xf9\xa6\x6c\x2a\x8f\x7c\xf9\xed\xe8\xa6\x75\xcf\xac\xbc\x3f\x59\xe4\xf9\x37\xfa\xe4\x7f\x57\x7e\x09\x67\x7c\xfb\xdd\x70\xbf\x67\x46\xc0\x32\x7b\xb7\x47\xde\x58\x72\xc3\x92\xea\x11\x68\xf8\x5d\xa8\x7c\x52\xb4\xe8\x86\x3b\xaa\x36\x47\xc7\x4e\x5a\x73\xbb\xa7\xf4\x2e\xf8\x9d\x6b\x06\xf0\x3b\x36\x8f\xa0\x6b\xfe\xc8\xf3\x3c\xea\x49\xff\x53\x39\x7b\xf6\x6c\xf4\xc5\xfc\xf9\xf3\x6d\xdb\x4e\x0b\x21\x7b\x2c\xb1\xe4\x4d\xab\x1f\x08\x28\xc2\xd9\x12\x77\x81\x59\x60\x0e\x3e\xaf\x65\x6e\x0a\x64\x19\xf0\x86\xf4\x2f\xf6\xa5\x8f\x2d\x73\x6a\x66\x53\xf4\xff\x76\x6a\xff\x17\xe2\xb3\xa6\xfe\x33\xf4\xbd\xfa\x27\x4f\xd7\x53\x3b\xc2\x2b\xd1\xbf\xbf\x5c\xd5\x04\x07\x1c\x67\x50\x4f\x9a\xa5\xf0\x2c\xa7\x09\x32\x1f\xe7\xda\x20\x10\x85\x18\x64\x51\x4e\x29\x19\x6f\xcb\xff\x91\xe8\x14\x5c\x7c\x70\xfc\x90\x09\xd7\x5d\x37\xf4\x81\x9b\xf7\xb2\xb7\x71\xf0\xa1\x6d\xd7\xa1\x25\x0a\xad\xab\xa2\x28\x0b\x2c\x4a\xc0\x58\x5c\x52\xf5\x84\xaa\x06\x29\x2d\xec\xcd\x16\x95\x69\xfd\xef\x24\x07\x5c\x0e\x16\x59\xbc\xff\x1a\x50\x02\xca\xc1\x30\x30\x09\xdc\x01\xee\x02\x0b\xc1\x26\xf0\x6c\xc6\xba\x8a\xb7\x2a\x53\x4f\x25\xad\x99\x06\xec\xfa\x88\xe5\x43\x71\x8f\x55\xab\xef\x40\xf1\x7f\x0b\x43\x1d\x9a\xa9\x48\x75\x3d\xb4\x2b\x52\x55\x17\x96\x0e\xcd\x6c\x7b\x26\xed\xc9\x94\x15\x4a\x2b\x2b\xf2\x9b\x71\x3d\x0b\xeb\x47\xac\xec\x17\x7c\xf7\xc3\xc8\xba\xf9\xdf\x0f\x3f\x39\x7b\x63\xdd\xba\x4d\x23\xca\x9f\x6c\x3a\xb0\x72\x65\xbf\xc8\xca\xfa\xf0\x3a\xaa\x16\x5d\x58\xd7\xaf\x7e\x5d\x2d\xbc\xa6\x3a\xbc\x32\x5c\xee\xfd\xb9\x1a\x81\x32\x23\x68\x1a\xdb\xaa\x1b\xed\x6c\x42\x66\x62\x74\x8c\x4f\x08\xac\xc0\xc7\x50\x27\x85\xe4\x58\x58\x0b\xc7\xc2\x30\xc8\xb4\xc1\x18\x8c\xc5\x90\x82\x54\x99\xe3\x85\x84\x02\x79\x18\x55\x61\x14\x75\x74\x75\x41\x1a\xb5\xab\xa8\x03\x46\xbb\xba\x50\x47\xae\xe7\xcc\xd3\xb1\xeb\x0c\x4d\x47\x99\xf0\x6a\x71\x6f\x64\xf3\x2e\xe8\x89\xbe\xb3\x97\x5a\xb0\x20\x8a\x76\xef\xa2\xe8\xf1\x31\xf4\xc2\xff\x9c\x89\xfe\xf8\x4c\x30\x8c\xd0\x0f\xd9\xb3\x3f\x6c\x7e\x27\xfa\x8b\xe6\x82\xd2\x08\x23\xc9\x5c\x8c\x52\xa2\x2c\x17\x95\x22\x34\x4d\xd3\x51\x51\x8e\x31\xd1\x18\x47\x69\xb2\x4a\x6b\x12\x92\x93\x02\x13\x53\x0d\x41\xd0\x25\x0f\x1d\xe4\x79\x99\x95\x38\x59\x51\x64\x4e\x62\xad\xa4\x4c\x41\xb0\xfa\x1e\x9a\x39\x8f\x59\x5b\xca\x62\x5b\x0e\x76\xc4\x43\x1c\xc0\x7e\x8b\x03\x63\x6d\x3d\x80\xd4\x51\x17\x5d\x42\x0f\x58\x08\xdc\x31\x6f\x26\xcd\x5c\x40\xd8\x00\x75\xc2\x46\x2c\xe4\x95\xe5\xcb\x0e\x5f\x86\xed\xca\x97\xe3\x6b\x33\x53\xf5\x01\xdd\x2f\xe2\xf5\x76\x86\x1a\x1a\xf7\x82\x2b\x19\x30\xfe\x75\xaa\x6e\xf7\xe5\x03\x3f\x1e\xb7\xab\x6a\x1a\x19\xbf\x66\xad\x63\x3e\xb1\x3e\xd2\x96\x73\x3f\xa1\xef\x90\xb1\x09\xf7\xe5\xf5\x7f\x94\xed\x1f\x83\xaf\xce\xb3\xf4\x0a\x9e\xd4\x4f\x0e\x7c\xcf\xed\xc3\x3b\xf6\x6f\x42\x67\x9e\xeb\xda\x1f\x93\x26\xdd\x4b\xe8\x28\x44\x6c\x78\xe3\x9c\x9c\xfd\x34\xf7\x8d\x27\x6c\xe8\xe4\x7b\xcc\xb6\x68\xdb\xe3\xa9\xdb\x02\xcd\x76\x5d\xb2\x62\x70\x1b\x96\xac\xd6\x02\x35\xa3\x4b\xfb\xc8\x80\x51\xab\x52\x59\x20\xd3\xad\xb3\xba\xb2\xa2\xb0\xb4\xb2\xc0\x57\x5e\x58\x51\x58\x55\x8d\x9d\xd1\xa5\x58\x9a\x2a\xf6\x07\xfc\x81\xaa\x5a\x88\x11\xd8\xcc\x5c\x77\xa4\x2c\x62\x9c\xb5\x90\x7d\x48\x7f\x87\x1c\x96\xc7\x16\xfa\x9f\x7a\xb4\x3d\xf9\xcf\x11\xf0\x1c\x7c\x62\x53\xed\xd2\xf5\x4b\xd1\x9f\x98\xe2\x27\xa9\xfa\x7f\x4e\x8f\xad\x1f\x31\x1b\xc2\xcd\x83\xe1\xaf\xd1\xd7\x70\x32\x7a\xed\x88\xaa\xa2\x8f\x10\x9a\xa4\xf5\xd3\xd0\x09\x38\x6b\xf3\xb0\x9a\xd5\xaa\xef\x05\xa1\xad\x9d\x15\x44\x5e\xd3\xda\xbb\x5b\x0d\x4e\x56\x79\x85\x31\x38\x99\x8e\x86\x63\xb1\x98\x1e\x8f\xea\xaa\x24\x47\x44\x96\xe7\x61\x6b\xab\x28\x4a\xbc\x82\x44\x45\x90\x25\xb9\xaf\x1f\xfc\x75\xdc\xe3\x37\xe0\x1f\xd0\x0d\x46\xf2\x62\x1c\xdd\xe4\xbb\xed\x91\x59\x57\x29\xf7\xdd\xb4\x73\x11\xb3\x68\xfa\x3d\xb3\x86\x2c\xbe\x33\x30\x6b\x31\x73\xdf\xac\xfa\xb2\x19\xca\x4f\x55\x74\x7e\xd8\x4f\x51\xc5\x23\x93\xca\xa6\xc2\x87\xd0\x1b\xfd\x06\xc2\x15\xea\x4f\x67\x4c\xba\x57\xf3\x0c\x13\xb9\x68\x42\x0e\x86\xdb\x68\xd4\xda\x16\x89\x4a\x6c\xbc\x95\xd3\xa2\x88\x17\x59\x4a\xa5\x18\x28\x45\xc2\x8a\x64\x44\x28\x55\x8a\x53\x0a\xd3\xc7\xa8\x6d\x7c\x22\x4e\x33\x9d\xb2\xa8\xf8\xce\x2f\x5f\xbe\x7c\xb9\x3a\x77\xee\xa3\x8f\xe6\x89\x1d\xbb\x27\xc7\x37\x6c\x8e\xcf\x22\x6c\x9e\xf6\xb8\x15\x7b\x1e\x78\x6e\x78\xea\x43\xf4\x3f\x79\x74\xf6\xb2\x17\x3f\xc6\xbf\x9e\x99\x17\x2f\x67\x5c\xc2\x06\x7f\x37\xe1\x1b\x30\xf5\x85\xd1\x04\x0c\xdf\x65\xfd\xc6\xe1\x93\x6b\xe4\x40\x36\x7e\x8d\xa4\x09\xd3\xed\xb9\x64\xc7\xf8\x9d\xf9\x71\x0b\x63\x8b\xbf\x71\x9a\xed\x5f\x24\xed\xbb\x53\x73\x6c\xa8\xe6\xf8\x1d\x84\x5d\x82\xb4\x33\xdc\x6e\xdb\xfd\xab\x03\xbb\xfd\x2a\xe8\x07\x22\x38\xb2\x9a\x06\xf5\x60\x1a\x8e\xc0\x9c\x0f\x16\x81\xf5\x58\x83\x4f\xb3\x8f\xea\x62\x5b\x41\x4f\x8b\x59\x84\x0a\x82\xb5\x51\x47\xb9\xca\x40\x26\xf2\x02\x57\xab\xac\x26\xab\x55\xa6\xf9\x5c\x45\x9a\xf1\x57\x79\x2b\x2a\xcd\xc0\xeb\x4b\xd4\x8b\x86\x3f\xd4\x74\x5d\xa5\x92\xcd\x61\x59\x9d\xee\x7d\x12\xbe\x82\xda\x64\x23\x4a\x3d\x4e\x09\x9f\x1e\xe5\x1e\x6f\x69\xe9\x3b\x27\xb7\xa1\xbf\x0a\xb0\xdc\xdb\x00\xeb\xff\x38\xbb\x1d\xfd\x18\x3d\x22\x09\x9e\xc1\xbc\xda\x05\x77\x8c\x40\xe3\xd1\x19\xf4\x63\x74\x17\x0b\x97\x7e\xbd\x94\x93\xd6\x0b\x70\x3d\xbb\x4a\xdf\xc9\xa1\x1b\xdf\xde\x5c\x74\xc3\xa7\x88\xda\x79\xcd\x88\xde\xde\xde\xde\xe4\x6c\x7f\xf8\x9b\xae\x47\xdd\x7e\x82\x82\xde\x9f\x3d\x16\x1f\xbc\x75\xc5\x16\x0a\xbe\x88\x1e\xea\x07\x3f\x47\x8b\x66\x0e\x2f\x9b\x7c\xfd\x96\xc9\x95\x33\xff\x99\x48\x76\x4d\x6e\x59\xb4\x62\xcd\x9a\x59\x0f\x3d\xf6\xd8\xcc\x99\x93\xe7\x3d\xba\x66\x66\x4d\x70\x6f\x70\xcd\x63\x95\xc6\xe0\xc9\x95\x35\x93\xc6\x3d\xf0\xca\xd4\x69\x95\x35\x33\x0b\xc6\x0c\x9e\x5e\x9b\x3c\xe0\x59\x34\x1b\x9d\x5e\x87\xbe\xbb\xce\x73\xbb\x00\x07\xdb\x0e\x84\x2c\xfd\x22\xe9\xea\x14\xb7\x8d\xd0\xd2\x87\x59\xb7\x7d\xc9\xe2\x07\xf5\x0e\x5b\x7b\x16\x1e\xea\x72\xf8\x84\x49\x1f\x27\xbb\x63\x13\x4e\xcf\x07\x20\x54\x9e\x08\x02\x80\x1e\x24\x7a\xdb\x89\xae\xe7\x4f\xb2\xd7\xe5\xa8\xd7\xd3\x38\xd1\xed\x2b\x3b\xf4\x1b\x22\x9e\x60\x82\xb5\xe6\xea\x80\xea\x7f\x24\xb4\x14\x47\xf3\x3f\xcb\x80\xdb\xe6\x52\x75\xa1\x37\xae\xbb\x72\xdc\xfc\xaa\x14\xb8\x02\xcc\x4b\x15\x59\x35\xf8\x33\xfd\xfa\xab\xc1\x74\x30\xd3\xca\x03\x7f\x18\xc7\x4f\xdb\x95\xc4\x32\x51\x3e\x69\x19\x72\xa8\x55\x4b\x6c\xe8\x25\xd2\x6a\x88\xec\x9d\x4c\x14\x10\x16\x9b\x70\x28\xd0\xd0\x92\xc2\x52\x0c\xda\xa6\xf1\xa9\xb2\xa2\xa8\x3a\x93\x07\x6b\xfe\xf5\x26\x92\xb4\x9f\x49\xd2\xde\xa8\x9e\x94\x8c\xa4\xac\x7b\x23\xc9\xd6\x34\x8c\x78\x63\x69\xe9\xa4\xaf\x2d\xfb\xbd\xb7\x23\x47\x35\xb8\x7d\x7d\x98\x82\xff\xe2\xd6\xef\x69\xa3\x53\xe0\xed\x0f\x50\x17\xdd\xf9\xdd\xe9\x2c\xc3\xf1\x6d\x70\xb6\x52\x8f\x16\xce\xee\x7d\xce\xf3\xdd\x9e\x9e\x1e\x58\x1e\x46\xcd\xe8\x76\x7a\x95\x26\xa1\x6e\x0d\x3e\x85\x1e\xf1\xbc\xe5\xbd\xaa\xef\x0b\x15\x22\xe4\x29\x68\xda\xb6\x6d\x1a\x7a\xfd\x75\xa4\x43\xb1\x05\xde\xf6\xf6\x8a\x15\x6b\x2a\xd7\xac\x59\xe3\x3d\x93\x96\x42\x35\x8e\xe3\xf9\xbe\xf7\xae\xbf\x7e\xf0\xc2\xb9\x35\x65\x03\x57\x0c\x9e\x34\x69\xf0\x43\xfd\xca\x86\x57\x0e\x2f\x9b\xb9\x70\xcf\xb0\x9a\x9a\x97\xd1\xcf\xa7\x2e\x5c\x54\xb9\x7c\xea\xd8\x47\xfa\xfd\xe9\x97\xfd\x60\xf4\xa1\x19\xe8\x10\xea\xbe\x77\xa6\x15\xd3\x95\x20\xce\x71\xbc\xed\x3b\xa9\xc6\x35\xee\x06\x80\x41\x60\x98\x15\x0f\xd0\x00\x1e\x00\xdb\xd2\xfc\x11\x6f\xa6\x2f\xe3\x35\xc9\x4a\xa0\x79\x2d\x10\xd8\xbe\x57\x58\x5a\x68\x15\x0f\x1c\x5d\x8e\x1b\x25\x95\x56\x57\x14\x96\xa6\x2f\x14\x67\xb2\x31\x4b\x4d\x3b\x45\xa0\xbc\xaa\xb2\xb0\xa4\xac\xbc\xb4\x64\x60\x71\x45\x55\x75\xfa\xe8\x2a\xb2\x91\x07\x99\xe8\x83\x34\xc3\x0d\x94\x57\x15\xcc\x7e\xe4\x06\xcf\x6d\x93\xe7\x43\xef\xe8\x2f\xde\x7e\x0b\x7d\x39\xfa\xf0\x96\xe7\x6a\xc6\xce\xfe\x68\xcb\x36\x69\xcb\x9d\x17\xc7\xe6\x18\xfa\xda\xd5\x8e\x0e\x26\x18\x96\x69\x4a\x09\xb6\xf5\x84\x21\x68\x57\x59\xb6\x9d\xeb\x81\x89\x70\x54\x63\xc2\xb0\xa7\x4d\x84\xb1\xbe\x68\x87\xda\x06\xa3\x34\x63\x40\x8e\x89\xb6\xc6\xa2\x88\xd5\xa8\x70\xdc\xc0\x3d\x01\x58\xd4\x02\x8d\xde\x0e\xd8\x85\xe2\x90\xef\x64\x14\xc1\xb7\x38\x42\xf3\x0c\x1d\x96\x28\x9a\x0e\x4b\x41\x2a\x16\x09\xb3\x02\x1d\xa3\xc2\x34\x9c\x67\xeb\x08\xe8\x0d\x48\xa1\xee\x24\x8b\x1a\x07\x2e\xbe\x6f\xe0\xc9\x73\x43\xae\xbd\x6e\xfa\x28\xf5\x36\xb8\xeb\x51\xf8\x26\x1a\x0b\xdf\xdc\x70\xf3\x4d\x83\xab\x6b\xc4\x17\xc4\x14\xf8\xf8\x57\x53\x0e\xbf\x03\xc5\x59\x53\xa6\xcc\x9a\x3e\x1d\xfd\x6a\xc8\xd0\xa1\xa2\xb8\x40\x14\x97\x2e\x5c\xb8\x54\x14\xa7\x57\xad\x05\x57\x82\x25\xa9\x3b\x03\x07\xfc\xaa\x85\x27\x73\xc1\x02\xb0\x04\xe3\xc8\x1a\xf0\x08\x78\x1c\x7c\x1b\xec\x05\xe0\xbf\xa5\xb8\xa4\x65\x9a\x72\xa2\xb7\x82\x27\x9b\xea\x52\x62\xeb\x6c\xa6\xf1\xa2\x1a\x9f\x41\xfa\x08\x08\x93\x87\xaf\xac\xbc\xc4\x1f\x28\xae\x2c\x2d\xca\x7c\x7c\x84\x94\x44\xba\xcd\xf2\x2a\x17\x9f\xe4\xa6\xbf\xf8\x28\xb1\x45\x52\xbb\x21\x83\x5a\xf1\xa7\x85\x12\x14\x5a\x0a\x2b\x34\x1d\xa1\xfa\xda\xa2\x34\x6f\x48\x5d\x90\x8b\xa1\x78\x3c\x4a\x2b\x0c\xcd\x45\x29\x23\x1c\x11\xb8\x98\x42\xd3\x09\x14\xa6\x3d\x1c\x6a\xa1\xa3\x29\x10\x89\x1a\x5d\x38\x9b\x06\x30\x11\x29\xcc\x48\xb1\xb0\x4c\xd1\x48\x52\x28\x5e\xe1\x21\x4b\xab\x91\xbe\x89\x39\x8e\xe0\x81\x17\xbb\x66\xce\x1c\xb4\x73\xd0\x28\x78\x17\x6a\xf9\xc5\x6d\xef\xc3\xc3\xde\x62\x34\x17\x0e\x4c\x4a\x7f\x7f\x7e\xce\x8c\xa5\x77\x4f\x16\xa6\x0a\x53\xd1\x1b\x4f\x0f\x58\x39\x60\xf2\x49\xf8\xd6\x35\x45\x4b\x17\x2c\x7d\xf8\xde\x95\x93\xc7\xd1\x53\x97\x0a\xab\xae\x5a\x7a\xef\x8c\xa5\xe3\x26\x57\xaf\xbc\xf7\xe1\xbb\x6f\xbc\xf1\xc6\x1b\xcf\x4f\x9e\x7c\x72\xea\xd4\x93\x53\xa7\x6e\x98\x7c\x77\xe9\xbd\x93\x03\x0b\xe6\x94\xae\xbc\x37\x70\xed\xb6\x87\xab\xd7\xad\x14\x37\x5c\xf9\xf4\xbd\xbe\x9f\xba\xe8\xbe\xd3\xe7\x5f\x66\xdc\x8c\xb1\x90\xb1\x6d\x94\x64\xdc\x58\xad\xdb\x4f\x7c\xf8\x71\x22\x66\x7e\x1c\xbe\xb6\xde\x8c\x25\xa1\x1a\x9a\x1f\x4a\xfd\x89\x59\x58\xf9\x7a\xa6\xaa\xd8\xb9\x9f\xcc\xfb\x5b\xcd\x23\xb1\x89\x56\x7c\xef\x0e\x9b\x17\x34\xec\xe9\xea\xde\xc3\x0c\xaf\x5e\x10\xaa\x3b\x30\xd6\xf7\x0e\x03\xaa\xdf\xcf\xe3\x37\xae\x21\xf8\x45\x02\x8f\xe3\x9a\x73\xe6\xd5\xc4\xf5\x00\x00\x0f\x96\xab\x04\xbf\x0a\x06\x82\x4a\xc2\xe2\x9f\xd6\x41\x71\x7a\x5f\x55\xa8\xb2\xb0\xa4\xa8\xa2\xd0\x2e\x1a\xeb\xac\xc8\x82\x21\xcf\x1b\x31\xbc\x5c\x5f\xc2\x6b\x30\x82\x2a\x5e\xec\xd2\x75\x8e\xf1\xc4\x0c\xc8\xc3\x88\x84\x3a\x51\x8c\xeb\x54\x14\x39\x42\xe9\x51\x1d\x29\x62\xa7\xaa\x68\x6c\x8b\xe1\x57\xdb\x75\x55\x53\x14\x2e\x8e\xc2\x48\x44\x6d\x42\x2b\x8c\x74\x78\x62\x3d\x88\x13\xe3\x4a\x8b\x6a\xd0\xd1\x60\x90\x55\x98\x2e\x96\x17\xe2\xd1\x88\x11\xa5\xf1\x5a\x2d\x3f\x0f\x18\x05\xa6\x3a\xd7\x5a\x55\x5d\x52\x34\xb4\xd8\x5a\x9f\x65\xde\xc0\xeb\xf3\x95\x0f\xad\xcc\xbe\x07\x2c\x74\xda\x5f\x4b\x8a\x06\xf8\x71\x6e\x67\xa5\x57\x8d\x7b\x3a\x93\x11\x2f\x13\xe3\x14\x3a\x9a\x94\x3c\x80\x4a\x76\xb3\x2d\xb2\x22\x46\x29\x23\xa2\x22\x49\x68\x93\x91\x10\x86\x2d\x28\xdc\xa1\xc9\xbc\x47\xf6\x04\x39\x4e\x61\x29\x23\xac\xb6\xb7\xcb\x48\x49\x74\x0a\xed\x4a\xd0\x2f\x0b\x9a\xa2\xc9\x32\xc7\x72\x89\x98\x1a\x63\xe8\x68\x90\x91\x98\x56\x8e\x17\x84\xa8\x4a\xb7\x26\xbb\x10\x8b\xe2\x7c\x07\x8c\x75\x79\xa4\xbe\x16\x24\x45\xc2\x31\x39\x9a\x90\x19\x16\x72\xd1\xf6\x56\x5a\x8b\x6a\x86\x96\xb1\x59\x2b\xe9\xf3\x8a\xe3\x6e\x3b\xf1\xb5\x80\x8c\x11\x4e\x8f\x3f\x84\xc7\xd7\x10\xe3\x18\x1e\xe3\x12\x1e\x5f\x4d\xc8\x01\x72\x5a\x97\x8c\xe3\x0c\x91\xf8\x2a\x42\x2e\xc6\xf2\xef\x4b\x37\xa6\xc7\x5f\x8a\xda\xf3\xd0\xa6\xae\x9c\x9e\x99\xf2\xc7\x97\x13\xf6\x7a\x2c\x4f\xc4\x97\x61\xb8\x1a\x0b\xb2\xf1\xcf\xb8\x7f\x54\x53\x0a\x8f\xe3\x38\x4f\xe0\xc5\xe3\xa2\x5f\xc1\xd1\x28\xac\xa9\x9b\x59\x41\x66\x25\x95\x15\x85\x43\xd2\x3c\xda\xeb\x3a\xbd\x21\xd5\xc5\xd9\x9a\xc4\x57\xc1\x92\x48\xb9\x05\x5e\xf6\xf9\x0d\x82\x25\xbe\xce\x27\xd1\x93\xe8\x88\x77\x02\xfa\x02\x6e\xbf\x78\xe1\x4b\xf8\x32\xfa\x08\xee\x46\x2b\x3c\xba\x97\xee\x6b\xf7\xd2\x34\x27\xd3\x91\xa4\x0c\x23\x9d\x54\xb2\x9b\x6e\x83\x0c\x13\x0d\xab\x11\x1d\x49\x29\x40\xc5\x98\xb6\xf6\x30\x4c\x20\xaa\x55\x13\x38\x8f\xea\xf9\xeb\xc3\xf7\x0f\xdc\xb0\x15\xfd\x7d\xeb\x56\xcf\xa3\x37\x27\xe7\xc2\x22\xdf\xe3\xac\x2c\x28\xbc\xc0\xc6\x62\x52\x24\xaa\x30\x91\x28\x15\x0c\xb2\x31\x39\x1a\x64\x99\x58\x98\x92\xa3\x4a\xb2\x15\x45\x90\xc6\x77\x40\x0e\x02\x8f\x06\x7c\x78\x5f\x76\xfb\x65\xab\x52\x73\x7f\x5c\x9d\xc4\x7a\xc9\x62\xc2\x32\xd6\x3f\x3f\xa4\x66\x5f\x35\x0d\xa8\x95\x24\xa0\xfa\x77\x43\xf0\x4d\x77\x87\xe1\x0d\xf6\xf5\x64\x3e\x2b\x74\x8f\x91\x14\xbc\x6a\x8c\x57\x62\xd1\x64\xc4\x13\xa3\x92\x2d\x74\x3b\x64\xd8\x68\x58\x8f\xa8\x88\x45\xed\x34\x83\x34\x28\xa1\x58\x22\xfd\x86\xa2\x67\x71\xf2\x89\x2d\x5b\x3c\x1b\xfe\xb4\x0c\xbd\x25\xa0\x8e\xd9\xfe\x5b\x79\x59\x94\x25\x89\x63\x58\x99\x56\xa3\xb1\x08\x45\x05\x39\x46\x8a\x51\x11\x91\x8d\xa8\xe1\xf4\xdb\x45\x91\xc6\x77\x42\xbe\xdb\xa3\x66\xe1\x0a\xd3\x93\xf8\x83\x39\xf0\x46\xc0\x67\xe3\x6d\x39\xe3\x18\x7e\x1a\x6f\x25\xe0\x4d\x4c\xc3\x49\x1c\xe7\xf1\xc5\x1f\x20\xec\x26\x71\xff\x26\xaa\xec\x5c\x82\x02\x54\xfd\xf1\x75\xb0\x3f\xe8\xac\x2a\xaf\xde\x66\xd7\xdb\xcc\xfe\x66\x85\x3b\x2e\xe5\x6c\xad\x03\x76\xed\xbc\x97\x63\x1b\x28\x10\xf2\x9f\xfe\x76\x0f\xa9\x03\x66\x61\x34\xe6\xbe\xff\xb4\x8a\xa3\xb9\x9e\x76\xdb\x4a\x9a\x1a\xf0\xf8\x53\xc0\x15\x27\x7c\xfa\x49\x3c\xfe\x6d\xc2\xc7\x85\x69\xeb\xe9\x27\xf0\x78\x26\x7e\x66\x62\x8a\x09\xb4\xf9\x9f\xa3\x96\x1e\x1d\xd2\x77\x17\xf0\x8f\xf1\x31\xc3\xa8\xba\xd3\x4f\x6f\x04\x63\xbf\x60\x32\x7e\x58\x05\xcf\x87\x33\x42\x4e\x6f\x25\xd6\xd5\x92\x9e\xef\xe4\x00\xdc\xf7\xe5\x24\x5e\x75\xb5\xd3\xce\x94\x5e\x15\xe5\x6f\xac\x22\xd6\x80\xdf\xa5\x09\xe1\xf1\x4a\x0b\x0f\x75\x33\x76\xdb\x92\xcb\x01\xac\xc0\xdd\xaf\xd2\x4a\x5d\x75\xa8\xbf\x59\x86\x2d\x32\xd4\x94\xc8\xa1\xd9\x27\xb3\xc4\x9b\x30\x3c\x5a\x52\x82\xc1\x1e\x86\xd3\x5b\x55\x23\x4a\x27\xa5\xbe\x78\x14\xea\x50\x41\x94\xe1\xd1\xcc\xf4\x43\x8f\x96\xfe\xd7\x2f\xa3\x96\xbe\x1e\x14\x0e\x47\x65\x91\x4d\x01\xd4\xce\x89\x82\x14\x49\x44\x60\x4f\xc2\xdb\x92\x54\x60\x0f\x0a\xc2\x1e\x87\x7f\xf0\x64\xff\xf4\xfa\xce\x93\xb1\x1d\x3c\xe6\x69\x71\x7c\x96\xcb\x88\x78\x26\x53\x07\x3f\x86\xc7\x37\x12\x7c\x2c\x88\xe7\x09\xe2\x28\x90\x10\x71\xbf\x69\xe3\x7b\x23\x3d\x7e\x0e\xd7\x1e\xc0\x39\xeb\xe9\xf1\x30\xa0\x2c\xdf\x2d\xe8\x5f\x12\xea\x6f\xb7\x55\x2c\xf7\x78\x2d\x77\x6d\x61\x49\xe1\xd0\xb2\x6c\x69\xba\xf4\x9e\x14\x96\x54\xfa\x7d\xe5\x11\x68\xd6\x17\x29\x54\x7d\xad\x41\x3a\x12\xa5\x83\x7a\x44\xe0\x64\x86\x0f\x5e\xec\x28\x50\xb8\x2e\xd4\x05\x3b\x50\x14\x72\x91\xa8\x26\x33\x3a\x15\x41\xd1\xa4\x12\x81\x2c\xa4\x10\x0d\xdb\x3b\x53\x80\xf6\xd0\xb0\x15\xb5\xe8\xa8\xd5\x1f\xee\x6d\x45\x3d\x6d\x3d\x74\xa7\xde\x01\xe9\x82\xa8\xa8\xd2\xe1\x44\xb2\x15\x75\xd1\x1c\x43\xb7\x75\xd3\x3c\x2b\x04\x8d\x30\x8c\x78\x18\x83\x0a\xea\xc9\x28\x8c\xa2\x8e\xf4\xc7\xb6\x61\xf2\x99\xfd\x0b\xf9\x5f\xaa\x21\xec\x67\x42\x76\x9f\xce\x65\x7b\xe3\x0a\x56\x7c\x38\xae\x10\x78\x21\x1b\x03\x2e\x59\x30\x3c\x1c\xd7\xf0\xcd\xc4\xa3\x6f\xc3\xb0\xb8\x2c\x54\x76\x24\xad\x4f\xfa\x13\x6f\x5e\xfe\x91\x53\xbf\x3d\xbf\xcd\x35\x4f\x26\x57\x27\x9e\xbe\xff\xd4\xe5\xf6\x78\xa6\x8f\x34\x5e\xcf\xc9\x37\x1c\x78\x2e\x86\xca\x4e\x9c\x49\x8f\x9f\xc8\xc6\xfd\x2b\xd6\x3a\xf1\x79\x26\x44\x62\x9d\xf1\x34\xce\x9e\xff\x57\xf6\xb9\xa0\x00\xb4\xa7\x62\x01\xd1\x4f\x83\x6b\xb1\xbd\x23\x6a\xea\x96\x85\x96\xfb\xa8\xd0\x0e\x0b\xb3\x8e\x10\x83\xb4\x75\x7e\x90\xf6\xa8\xc9\x9e\x82\x78\xb2\xc7\xa3\x24\x95\xae\x2e\x59\x8e\x1b\x0a\x1d\x4b\xea\x7d\x9d\x51\xa8\x40\x31\xcd\x34\xbc\x62\x9f\xee\xed\x42\x61\x1d\x51\x5e\xc9\xf0\x44\x92\x9d\x46\xb2\x03\x75\x50\x11\x8d\x8b\x77\x89\x1c\x2b\x44\xe2\x61\x18\xf3\xf2\x10\xf4\xc5\xcc\x72\x60\xa8\xc7\xa5\x8f\x9f\x83\xf8\xbd\x33\x35\x5d\xb4\x54\x34\x20\xf9\x63\xa1\xb2\x13\x38\x62\xf4\xe4\x15\x36\xbe\xf2\xe6\xfb\x9d\xbc\x2a\x3d\xfe\x1d\x6f\x4e\x8c\x21\xc6\x87\xe3\x67\x88\x71\x5c\x7b\xf8\x02\xee\x4b\x78\x2a\x93\x4f\xd1\x92\xa2\x03\xbc\xff\x6e\x6a\xe9\x69\x7f\xea\x9c\xe7\x64\xdd\x27\xf4\xc8\x90\xff\x48\x33\x71\x76\x8a\xf9\x9b\x90\xff\xcc\x06\x62\x2e\x2d\x3b\xd7\xee\x37\xec\x71\x9e\xc4\xb9\x33\x5f\x12\x38\x9a\xc8\xae\xe9\xe4\x95\x04\x0c\x1c\x4f\xcb\xac\x67\x7f\x37\x1d\xd4\xbc\xc6\x00\xaa\xee\xc2\x31\x3f\xa8\x29\x61\xb2\x32\x43\x22\xfd\xfc\xe3\x83\xd3\xcf\x3f\x71\x8e\xf8\x1d\x7e\xce\xb9\x67\xf0\xd9\xc6\x89\x71\x99\x78\x4e\x3f\x37\xac\x1d\xf9\xbd\x0b\x06\x05\xcb\xff\x85\xd7\x7b\x61\x35\x71\xbf\x98\xa6\x05\x2f\xe1\x7e\xdf\x89\x37\x88\x71\x1e\xd3\x88\x37\xd3\xeb\x31\x82\x04\xed\x90\xb3\xb4\x63\xdf\x97\xf9\xcf\x62\xf7\x28\x7b\xfc\xbe\xc0\xe9\xcc\xfd\xa1\xc0\xa9\x4f\xbc\x55\xa0\xc8\x9a\x9f\xb1\xe7\x29\x3b\xd3\x86\x77\xf1\x87\x2e\x7c\xf9\x9e\xe3\x1d\xb8\x54\x34\x90\x48\xc3\xc7\xc9\x6f\xe1\x77\xf6\x38\xec\xf8\xd6\x5a\x29\xff\xd9\x41\xc0\x6d\x6f\x32\xf7\xe8\x72\xc7\x1e\xd9\xf7\xe3\x90\xf3\xcc\x3b\xe0\x79\xcc\xfb\x8f\x0a\xc4\xfd\x1a\xf1\x6e\x0c\x31\x2e\x65\x60\x23\xe4\x3f\xd5\xea\xb6\xd3\x1f\x39\xe4\x3a\xb3\x4c\xfc\x9c\x89\xef\x97\xe5\x9c\xf1\x7c\xd7\xfd\x6a\x76\x9d\x21\xff\x85\x41\x36\x1d\xb0\xfa\xf1\xbf\x34\x2f\x3d\x7e\xa4\x99\x38\x1b\x23\x0b\xab\xc7\x46\xb8\xfd\x1c\x67\xf6\xe6\xc0\x10\x9e\xe7\x78\xc2\x31\x2e\x63\x3e\xc8\x65\xf0\xb0\x71\xb4\xfb\x8c\xf7\x0c\x75\xdc\x9f\xc6\xe7\x27\xd3\xb0\xbd\x6b\xed\x60\x30\xee\x05\x26\x8d\x3f\x9f\x13\xbf\xc1\xef\x70\x74\x71\x0e\x7c\x25\xb2\x7b\x71\x3a\xdb\x23\x38\x66\xca\x1f\xe7\x0b\xf1\xb3\x2b\xdc\x7b\x64\xed\x5d\xb6\xf6\x8e\x68\xc6\x81\x9f\x79\xd3\x35\xbf\x25\xf7\x1c\x7f\xc9\x85\x07\x96\x6c\xde\xfc\x7b\xbc\xa7\x71\x62\xdc\xf0\xab\x54\x43\xe2\x4d\x2f\x18\xf7\x1c\x03\x42\x65\xc7\xf7\xa7\xef\xd8\xdb\x67\xd3\x58\x02\x96\x2e\x1c\x27\xf6\x9c\xcf\xe2\xc3\xd9\x6c\xed\x6e\xda\x94\xc7\xcc\xf5\x9e\xad\xc9\xf1\xe1\x60\x98\x39\x1a\x22\xec\xf9\x66\x0e\xcd\x2f\x1d\x34\x51\xcc\xe0\x79\x7a\x47\xa9\xb2\x0b\xfb\xb1\xef\xcb\x43\x9c\x9f\xfd\xec\xe3\xa7\x1c\x34\x2b\xbb\xa6\xb1\xf6\xb8\x62\x9e\xc5\xa9\x1f\xb8\xf6\xca\x7a\xf6\xa9\xa3\xf9\xe1\xe3\xcc\x13\xf8\xd9\x18\xaa\x9a\x0a\x5d\xf8\x8e\x47\x75\x86\x78\x0f\x33\xb6\xc9\x3c\xbf\x51\xc4\x3e\x61\xde\x7b\xfc\x7d\xfc\x8c\x13\xf6\xb8\x4e\xd2\x57\x9d\x26\xde\x41\xcf\xe2\xe8\xa9\x7b\x89\xf3\x56\xb2\xe7\xb0\x67\x1e\x31\x0f\x3e\xef\x93\x85\x39\xbc\x57\xc2\xf2\x21\x95\x07\x3e\x94\x50\xd9\xd9\x72\xd7\x7a\x2c\x39\xd3\x5c\xcf\x9e\x21\x39\xb4\x04\x8f\x9f\xb9\x32\x87\x36\x98\x70\x79\x07\x81\xbb\x52\x76\x9d\x87\xbd\xc4\x19\x60\x99\xff\xc8\xd9\x1c\x7c\x20\xf6\xe1\xc0\x0e\x37\xbc\x1e\x3b\xe8\x58\x67\x36\x5f\x03\xcb\x2c\x8d\x23\x1d\x67\x19\xcb\xec\xff\xf9\x10\x31\x8e\x7d\x22\x47\xde\xcf\x9e\x31\xf0\x03\xcd\x7c\x5f\xe0\x03\xfd\xc1\x20\x2b\x0f\x02\x64\xad\x5c\x76\x43\x0b\xcb\x37\x6f\xc6\xf0\x61\xa9\xd8\x29\x3d\x0c\x35\x2d\x5f\x45\xde\xb8\xc2\xe9\xac\xe2\x8d\xc6\x15\x09\x4a\xc6\x45\xd1\x28\xd0\x8c\xde\x2e\x89\xd5\x19\x29\xea\x11\xe3\x1e\x31\xa9\xc3\x70\x0f\xa7\x2b\xbc\x11\x8e\x24\x95\xbe\x78\x18\x6a\x50\x48\xea\x05\x1d\x28\x16\x47\x31\xbf\xac\xea\xbc\xae\x72\x62\x42\x46\x72\x77\x37\x54\x13\x6d\xb2\xca\xab\x72\x92\x49\x24\x92\xdd\xa8\x87\x8a\xca\x4c\xa2\x83\x65\x59\x31\x2d\xff\x51\x7a\x67\x67\x67\x67\x1e\x78\x39\xbe\x9a\x38\x07\x2d\x3b\x7e\x74\x86\x9b\x7f\x1e\x1f\xe5\x3a\x7f\x8b\x6e\xc4\xa3\x39\xb8\x10\xcf\xca\x07\xe7\xb2\xbe\x5a\x4b\xf6\x3e\x6d\x56\x01\xa0\x1d\xfc\x33\xcb\x7b\x68\xf7\x39\x9f\xa8\x77\xc8\x94\x36\x0f\xdb\x8b\xf5\xa8\x44\x26\xc7\x5a\xcd\xc8\x25\x7b\x97\xa6\xc7\xf7\x8a\x04\x5d\x30\x6b\x07\x9d\x70\xd0\x0b\x25\x53\x1b\xf9\xd8\xbf\x5c\xf0\x42\xf6\x63\x30\xa9\x89\xbf\x71\x84\x93\x16\x1f\x9b\xe9\xfa\x4d\xa6\x96\x13\xa6\x3d\xa7\xb0\xb6\x74\x2a\x45\xe8\x1c\x69\xdd\xf5\xa5\x1c\x38\xc6\xe7\x70\xe6\x47\xf9\xe1\x3b\x3e\xcf\xb1\xaf\x7c\xa6\x27\xa1\xf1\x19\xee\xac\xf1\x86\x83\xae\xca\xa1\xb2\xa3\x17\xf0\x3e\x1d\x73\xe3\xe1\xb1\x2b\x72\xf0\x16\x8f\xef\x2e\xce\x19\xc7\xfa\xe1\xf1\xcf\x5d\xe7\x99\xd6\xb1\x6d\x3a\x7c\xfc\xd7\xc4\x38\x96\x93\xe2\x6f\x64\xe7\x01\x7e\xdc\xb7\x43\xf2\xab\xa0\x10\xdc\x00\x46\x5b\x31\xad\x38\x86\xab\x38\x40\x26\x03\x41\x77\xad\xc5\x3c\xb7\xb8\x9c\x05\xa6\x83\xa1\xb0\x74\x68\x21\x8e\x82\x2d\x2c\xf8\xf2\xa1\x9b\x47\x6d\xbe\x67\xc5\x43\xe7\xea\xff\x67\xde\x8a\x15\xf7\xdc\x37\x6f\x88\xc7\x90\x25\x4e\x8a\xea\x2c\xd7\xd7\x69\x78\x39\x85\x8e\x69\x82\xac\xb4\x71\xed\xa2\x2c\x0b\xa2\x18\xbd\x58\xdf\xd3\xf8\xf5\xd7\x0f\x14\x0f\x5e\x3b\x6d\x44\x63\xb0\x0b\xfd\xb5\xac\x71\x43\x0f\xfc\xd7\x03\x8d\x0f\x16\x3c\x39\xfa\xc2\xb3\xef\x6d\x3e\xf9\xf9\xfe\xcd\x27\x3b\x9f\x93\xc5\xf9\x8f\x3c\xe2\x99\xf4\x4d\x87\x20\x52\x06\xc5\xf9\xc4\x6f\x0c\x7f\x0f\x1a\x30\xf2\xa5\x67\xde\xde\x70\xa4\xab\x69\xe3\x91\x0f\x9e\x59\xbb\x78\xee\xda\xb5\x90\x81\x32\x52\x93\x41\x14\x67\x58\x36\xaa\xb7\xd0\x8c\x26\x18\xd1\x18\xd4\x54\xdc\x92\xa6\x13\x45\x08\x5e\xa6\x86\xca\x4e\x34\x3b\xce\xda\xcc\xe9\x63\x42\x65\xbb\x3f\xc1\x34\xa8\xd0\x96\xef\x63\x01\x0e\x9f\x29\xee\x53\x72\xf4\x6f\x99\xab\x24\x3c\x9d\x3b\xe4\x80\x7f\x21\xd3\x73\xfd\xd8\x59\xc7\x5c\x4a\x46\x17\x8a\xbf\xeb\x38\x6f\x23\x15\x33\xe9\xee\xf1\xbf\xb9\xee\xe7\x2d\xbc\x7b\xd0\x71\xbf\x9c\xa1\xaf\xa7\x9a\x30\x8c\xef\xc1\xd2\xc8\x12\x9b\x87\x63\x9c\x3c\x3e\xcc\xb1\x26\x05\xd7\x27\x57\x43\x65\xc7\x3a\x1d\xe3\x62\x46\x76\x39\x82\xe7\x3a\x82\xe7\x4a\xe3\x0e\x29\x07\x1d\xbf\xd5\x05\x9f\x12\x49\xf7\x8f\xc2\x1c\x79\x07\xd3\x8f\x23\x3a\x81\x17\x2d\x98\x0e\xe1\x71\xbd\x9c\xb8\x9f\xcb\xca\x1b\x47\x2f\xcb\xaf\x27\x1c\xd9\xeb\x80\x73\x35\x54\x76\x78\xb1\xeb\xdd\x2c\x3a\x74\xe6\xab\x9c\xf1\x2d\x36\xbe\x04\x2e\xfc\xc8\x1b\xb2\xf9\x0a\xe6\x97\xfb\xaf\x76\xc9\x53\x56\xbc\xdd\xb9\xc7\x73\xf0\x71\x9f\x7f\x07\xd5\xb0\xf7\x8a\x69\x70\xec\x66\x66\x18\x81\xdb\x02\xa6\x99\x6c\xa8\xec\x6c\x25\xa6\x4e\xc3\xdd\x72\xb9\x49\xc3\x77\x6f\x74\xcb\xf1\x17\x56\x39\xd6\x6a\xe6\x04\x70\xa1\xb2\x97\xcc\xea\x26\xc3\xdc\xef\xbc\xa7\xd4\xf5\x6e\x5c\x40\xf7\x6b\xb6\x8e\x07\xdd\xbc\xc0\xd2\x2f\x57\x38\x64\xd4\x34\xcd\x5f\x82\xef\x7f\xc2\xad\x7b\x25\xea\xf3\xd0\xa6\xb4\xac\x31\x31\x87\x06\x61\x19\xd1\xa4\xc9\xe6\xd3\x1b\x6f\x21\xe4\x2b\x25\x54\x76\x6e\x97\x6b\x2e\x99\xe4\x73\xa7\x47\x12\xef\x60\xea\x10\x9b\x72\xf8\x16\x9b\x7d\x87\xb3\xbf\xb5\xe9\xae\x55\x63\x5f\xbf\x17\xeb\xbb\x5f\xd8\xe3\xe3\x02\x1b\xfd\x52\xa8\xec\x99\xf5\x6f\x7f\x18\x2a\xbb\xb0\xdf\xf7\x55\xc8\x6f\x7c\x66\xe3\xb5\x96\x7d\xef\xc6\x9b\xed\xdf\x58\xb0\x7a\x06\x7b\xc2\xe3\xbf\x76\x8f\xef\xc6\xf6\xf7\x33\x5f\x10\x7c\x05\xeb\x9c\x69\xdc\x08\xf9\x8f\xdd\xe9\xde\xa7\x23\xaf\xe4\xbc\x83\x96\xa5\xd5\x87\xae\x75\xeb\x5f\xfa\x1e\xc7\x1e\xa5\x79\x0a\xa6\xed\x4d\xaf\x63\x5e\x67\xfa\xe7\x6f\x72\xae\xe9\xf8\xc4\xec\x35\x7d\x8d\xc5\x6b\x63\xe6\x79\x9c\x7b\x2d\x43\x05\x08\x99\xd0\xde\xf3\x17\xd7\x11\x74\x0e\xd3\x3f\xbc\x1f\x65\xa7\x4c\x0f\xd6\x8d\xd8\xb7\x6c\xd6\x46\x51\xb0\x25\xb1\x1c\xdc\x0c\x46\xe0\x9e\xfb\x77\x80\xbb\x9c\x79\x10\x85\x56\x32\x52\x79\x89\xd9\xf9\xab\xb2\xa4\x10\x77\x0e\xb3\xa3\x44\xed\x5e\xc3\x85\xa5\x59\x71\x0b\xbb\x2e\x71\x04\xaf\xb7\xac\xbc\xa4\xa8\x4a\x87\x31\xdd\x2b\xe8\xb8\x4b\x5a\x0c\x45\x12\x90\xe1\x90\xd2\x85\x22\x9d\x48\xe6\x61\xac\x05\x45\xa1\x88\xda\x60\xbb\x57\xe8\x33\x32\x1f\x38\x47\xd3\x92\x3b\x3d\x92\xe6\x91\x78\x45\x12\x63\xb1\xa4\xd6\xd7\x16\x81\x1a\x94\x93\x9a\x96\xa6\xf0\x1e\x09\x76\x50\x0c\x8d\xe2\x5d\xfe\x28\xcf\xf3\xbc\x8a\xc2\xaa\xca\xe9\x72\x4f\xa7\xaa\x88\x8a\x0a\xbb\x78\x1e\x75\x72\xa8\x8b\x47\xe7\x93\xed\xf0\x09\x8e\x43\xb2\xa8\xc8\x2c\xc3\x87\xf5\xb0\xae\x68\x9a\x86\x34\x9a\xd6\xa8\x3c\xf8\xbb\x67\x8a\xe3\x5c\xd5\xcc\xb9\xee\x61\xdd\xba\x82\x89\x11\x47\xaa\xdc\x3c\xfe\xfc\x3e\x17\x7c\x58\xf5\x87\x0e\x7f\x93\x23\xcb\x91\xb8\xb2\x94\xe0\x29\x72\x1a\xc6\x4d\x38\x3e\xdd\x40\xc8\x48\x84\xbc\x73\x1a\x53\x46\x7d\x9d\x2d\x6f\xb5\xda\xd7\xfc\x2f\x86\x6d\x58\x8b\x91\xb0\xbf\xef\x99\xfc\xcf\xd6\x1f\x76\xc8\x85\xf6\xf8\xf9\x40\x3e\x79\x84\xf2\xef\xdb\x4e\xf0\x2d\xc2\x76\xb8\xef\x31\xfb\xb9\x9c\x49\x77\xf5\xb5\x0e\xdc\x32\x6d\x9c\xf6\xfc\x07\xa6\xb9\x69\xd3\x6e\xbf\x0b\x57\xac\x5a\x3d\x78\xfd\x75\x07\x94\xc5\xa0\x66\x12\x93\x7d\x37\x3d\x4d\x8f\x2d\x7c\x8f\xe6\xe8\x42\x4b\x72\xf6\x1b\xf3\xf0\xb3\x0f\xe4\xa1\xaf\xf6\x9a\xf6\xed\x20\xe6\x21\xde\xf9\xc8\xe5\xf6\x9a\xac\xbd\xd8\x73\x83\xeb\xdd\x18\x92\x0e\xec\xc9\xea\x84\x82\x95\x0b\x6e\xda\x73\x5e\x25\x64\x01\x35\x2d\x87\x58\x74\x1a\xd7\x8b\xc0\x35\xb4\xa7\xa5\xe1\x0e\xf4\xc7\x78\x59\x01\x66\x99\xde\x51\xa7\x0f\xbf\xb2\xc4\x87\xb3\xb8\x0a\x4b\x5c\x82\x5a\x49\x46\x50\x73\xca\x7a\x44\xc0\x32\x6e\x22\x55\xd2\xbf\x22\x50\xc0\xea\x10\xe0\xdc\x2c\x3d\x05\x74\xd4\x0d\xa9\x3e\x16\x02\x0d\x82\x14\x90\xc2\x11\x99\xa3\xb5\x60\x37\xea\x8c\x6a\x4a\x0a\x78\x80\xa4\x49\xfe\x2a\x71\x19\xbb\x2c\xba\x8b\x61\x50\x8a\xa2\x76\xc9\xe2\x02\x71\xbc\xb8\xf9\x87\x61\xf4\xf5\x2e\x78\x90\xda\x4b\xf9\x65\x59\x96\xf7\x49\x92\x24\xed\xeb\xfe\xff\x49\x68\x70\x47\xef\xf7\xa7\xdf\xd9\x7f\x43\xff\xf1\xde\xd3\x67\x56\x35\xbd\x22\x1d\xd8\x7a\x7c\xeb\xbc\x3f\xc0\x44\xef\xee\x82\xb4\xc6\x64\xf1\x6e\x2c\xf7\x1f\x05\xf9\xf5\x7e\x93\x67\xec\xff\xb5\x9b\x3e\x9b\x32\xc6\xa9\xa9\x04\xde\x3c\x6d\xe3\x46\xdd\x0b\x53\x78\x50\x53\xc4\x90\x72\x8c\x7d\x36\xcf\x7f\xe6\x90\x33\x94\xcc\xd9\x1f\x1a\xe4\x18\xcf\xca\x2b\x03\x1d\xbc\x92\x09\x95\x1d\xf4\xa6\xc7\x0f\x16\x10\xf8\x87\xe5\xa1\x53\xfb\x31\x0d\xfe\x4e\xfa\xaa\xc5\xaf\xec\x1a\xed\x26\x6e\x5e\x78\xc5\x31\x97\x0d\x47\x3a\xd6\x15\xc1\x15\x18\x5e\xd6\xf9\x19\xdc\x37\xa0\x1f\x28\xc2\x99\x33\x43\xc1\xcd\xb8\xd6\x7e\xbd\x59\x69\xdd\xcc\x87\x81\xc5\x66\xae\x5a\xb5\x95\xf2\xe2\x1c\x25\x5b\xf9\x5f\x92\x6a\x57\x97\x14\x55\x41\xbf\xa7\x3b\x49\xdd\xe8\x8d\xf4\x75\x42\x56\x0f\x1a\x09\x25\xae\x8e\x6e\x6b\x57\xe3\x5d\x9e\x93\xe9\x2b\x83\xf1\x95\x21\xd6\x95\x07\xf1\x95\xde\x8f\x3c\x8a\xe1\x51\x34\x43\x95\x68\x26\xa9\xf4\x25\x22\x50\x87\x4a\x52\xc1\x11\x40\x1e\x05\x76\xc6\x22\xd1\x18\x12\x3b\xfc\x8c\xf6\xaa\x0e\x9f\x8d\xa0\x38\xd2\x54\x45\x81\x74\x51\xbc\x43\xe9\x68\x87\xbf\xd0\xce\xeb\xf0\xe5\xec\x70\x29\x1e\x46\x97\x09\x02\x8a\x89\xaa\xcc\xc4\xf8\xb0\x11\x8e\xab\x2d\x2d\x2d\x88\x8d\x84\x19\x83\x22\x6d\x25\x96\x84\x52\x4e\xe0\x5d\x82\xb0\x95\x94\xb8\xf9\xb2\x85\xd7\x8c\x43\x6e\xb6\xc7\x5f\x9c\xef\xa0\x71\xaa\x09\x57\x21\xff\x8b\x0d\x0e\x59\x37\xad\x13\xcc\x74\xd0\x13\xbb\x26\x3f\x3e\xd7\xb2\x83\xd8\x26\x76\xf2\x0b\x9b\x4e\x4b\x59\x3a\xdd\x44\xda\x40\xd5\xac\x9d\xe6\x08\x22\x9e\xa1\x11\x70\xf8\x1d\xb7\xdc\x74\xf8\x95\x1c\x59\x4e\xcd\xbe\x43\xf3\xd0\xfc\xf6\x1b\x87\x8c\x42\xec\xd1\x91\xa4\xe3\x7e\x25\x54\x76\x72\x9e\x63\xfe\x58\x86\x6f\x5c\xf8\x31\xbe\x7f\x9e\x43\x4f\xb0\xf1\xe8\xe0\x5b\xf6\xb8\x48\xda\xa6\x8f\xfd\xc4\xde\x23\xab\xbf\xa3\x09\xfb\xcd\x67\x08\x3b\x90\x98\x9d\xe7\xdc\x77\xf2\xe2\x5d\xd9\x99\xdf\x62\xca\xfb\x1b\x9b\x1e\xe3\x73\x30\xe7\x6a\xa2\xdc\x32\xbe\xf9\x6e\x07\xbb\x89\x3d\x25\xde\xf9\xe0\x3a\xe2\xd9\x04\x6f\x3a\x5c\x97\x63\x2b\x31\xf7\xae\xca\xa1\xbb\xd8\x76\xcc\x33\x9d\x0e\x3e\x60\xcf\x73\xa8\xc4\xc1\x7f\xec\xbd\x38\xcf\x13\xf0\x82\xf7\x3a\x4d\x17\xa8\x32\xc3\xd4\x0a\xca\x5c\xb4\x0e\x3f\xfb\xbb\x61\x87\xde\x99\x91\x75\xcb\x0e\x62\xab\xc2\xc1\x81\x36\x8c\x99\xb5\xd8\xbf\xcc\x68\x78\xce\xe7\x1f\x92\x09\xdb\x41\x00\xc7\xb7\xb6\x60\x3f\x9c\xd9\x43\x77\x26\xee\xf5\x94\x96\x03\xd3\x52\xde\x80\x81\x15\xa3\xfa\x17\x7b\xfc\xa5\x37\x94\x79\x33\xa1\x9f\x85\x56\x98\x70\x61\x49\x11\x61\x67\x1b\x55\x5d\x89\xf3\x61\x4b\x8a\x2a\x2a\x87\xfe\x7f\xae\x77\x78\xc2\xc9\x6e\x5f\x5b\x34\x12\x09\x1a\x61\x81\x93\xc4\x60\x52\x82\x5d\x28\xac\x25\xbb\x18\xc8\x68\x90\x41\xad\x46\x54\xe6\x19\x95\x0a\xa3\x76\x24\x45\x5a\x5b\x50\xab\x96\x48\x40\x26\x01\x29\xf2\xba\x12\x76\x5f\x2f\xe8\x68\xd5\x53\xa0\x25\x01\xa9\x68\x0a\xc4\xdb\x21\x2f\xb6\x6a\xa8\x1d\xd2\x88\x55\x55\xc4\xb6\x44\xd8\x98\x1e\x67\xd8\x18\x1b\xd6\xc2\xed\x4a\x4b\x4b\x8b\x92\x7f\xd8\x82\x69\xc2\x0f\x73\xe8\x1f\x04\x9c\x10\xb6\xe5\xc3\x57\x13\x36\x2f\x9d\x90\xc1\x7a\xdd\x3a\xab\x39\x4f\xf3\x49\xb7\x2d\xca\x1c\x3f\xd6\x9d\x23\x9b\x99\x36\x9e\xd7\x1d\xfa\x5e\x16\xc7\x7e\x40\xe0\x5e\x3c\x4b\x23\x9a\x16\xda\x30\x72\xb7\xb9\xce\x7d\x57\xe2\x8c\xdc\xab\x40\x84\x01\x93\xcc\xde\xca\x93\x30\x4c\x6f\x4c\xaf\xf5\xc3\xaf\xa8\x86\x43\xbf\x9a\xea\x1b\xbb\x9b\x01\x21\xff\xf9\xff\x25\xd6\x60\xbf\x63\x53\xbf\xbc\x72\x60\x59\x02\xd7\xd2\x3c\x4c\xdb\xfa\x86\x92\xd5\x37\x12\x83\x30\x55\x0c\x3b\x65\x2f\x73\xed\x89\x07\x08\x59\x4a\x4b\xeb\xb6\x26\xad\x8c\xe3\x7a\x10\x8d\x43\x9d\xb4\xec\xd0\xdb\x2e\x1a\xa7\x90\xfb\x70\x64\x4e\x7e\x1a\xb7\x27\x92\x23\x2f\x98\xf8\x7e\x3a\xbf\xde\xde\xfc\x66\x7e\x9a\x78\x28\xe0\x3e\xdf\xe6\xfd\x2e\xbc\xe2\x1d\xf7\xdf\x6c\xdf\x4f\x07\x74\x7f\x3c\x54\xd6\x78\xb5\xc3\x0f\x66\xd7\x99\x34\xdf\xf9\x0c\xb6\x1c\xc5\x13\xb6\xac\xa2\x66\x74\x4f\xca\xbf\x7b\x96\x83\xae\xab\x99\x67\x18\x9f\xbb\xd7\x94\x58\x81\xe7\xea\x76\xd8\x74\x78\x73\xcf\xad\xdf\x20\x62\xcf\xb1\x9c\x94\x7e\x7e\xc8\x7f\x7e\x25\x31\x6e\x64\xc6\x29\xff\x91\x2f\xdc\x76\x09\x0b\x4e\x6f\x20\x9e\x8d\xef\xd7\xc7\x38\xf6\x63\x4c\xaa\x7f\xe0\xb7\xfe\x19\xa1\xb2\x17\x26\x8d\x7a\x9f\xaa\x3b\xf3\xc5\xc7\x37\x33\xff\x1e\xf3\x41\x3e\xda\xb8\x7b\x8a\x3d\x57\xa5\x59\x13\x2e\xbd\x4b\x0c\x18\xb7\x38\x54\x16\x67\xd3\xab\x3b\x30\xc1\x69\xd3\x68\xc6\xba\x7a\xf3\x03\x36\x8c\xf3\x01\x3d\x2d\x77\x5d\x88\x77\xb6\x85\xfc\xcd\xab\xc3\x14\xb1\x36\x1b\x17\xf1\xd6\x67\x70\x97\xc4\xa1\xbb\xf3\xe3\x62\x33\x19\x9f\x84\xf7\xf0\x25\xdc\x3b\xad\x71\x48\x7e\x5c\x6c\x0e\x11\xb4\x5c\x4f\xeb\x6e\x98\x96\xfb\x8d\xbf\xe5\x83\xc1\x90\x7f\xef\x22\xb7\xde\x63\xc1\xe6\xa4\xfc\x3c\xa4\x79\x49\x7e\x3e\xbb\x67\xb0\x6d\xf3\xb1\xec\x31\xe7\xc7\xa5\xe7\x6f\xca\xd8\x88\x54\x6c\x13\xd1\x42\x65\xbb\x7b\xf1\x7e\x7f\xe3\x90\x2b\x6c\xd8\x68\xfa\x05\x21\x03\x61\xd8\x88\x3f\x87\x6d\x84\xd8\x72\xda\x58\x4a\xac\x35\xbb\xa6\x2d\x6e\xd8\xb4\xf6\x74\xa7\x83\x8e\xd9\xef\x76\xe1\xa4\xbd\xa7\x96\x4d\xd1\xb4\xaf\x34\x67\x62\xb8\x38\x8c\x8f\x76\x8c\x81\xfd\x0e\x5a\xc6\x66\x6a\xd1\x95\x22\x4c\x5d\xa7\xd8\xe7\x63\xd2\xdc\xbf\xe2\x95\x66\x60\x93\xcd\xc8\x66\x27\xb0\x7c\xd4\x58\xe2\xd6\x01\x4d\x9f\x75\xf3\x6c\x02\x27\x6d\x99\x2d\xe4\x3f\xf0\x1b\xb7\x0d\x00\xc7\x07\xf8\x9b\x19\x37\xad\x49\x38\x6d\x3b\x22\x96\x39\xd2\xbc\xfc\x1c\x00\xa1\x32\xb5\x14\x58\xde\x66\x87\x4f\x04\xc3\xe4\x99\x55\x0e\x7d\x5f\xb1\xf5\xd8\x48\xce\xfe\x61\x99\xf0\x78\x3c\xbf\xbd\x67\xcf\xf5\xf9\xf9\xcf\xee\x2e\x7b\xff\x68\xcb\xee\x6b\x9e\xe6\x60\xc7\x3b\xdb\x72\xd3\xbe\xc7\x09\xba\x65\xfa\x98\x26\xa7\xdf\x21\x3e\x29\x43\xbd\xc8\x7a\xb2\xf1\xb7\x30\xbd\x7e\xc7\x41\x6f\x14\x87\x0f\x32\x23\x3f\xc7\x31\xce\x89\xa1\xb2\x13\xd3\x30\x4c\x15\x65\x20\x31\x17\xef\xce\x38\xeb\xf2\x70\xa1\xb2\x26\x1c\x53\xd3\x78\x3d\xa1\x4f\x19\x7e\x3d\x54\xb6\xe7\x6a\x3c\x7e\x9d\x7d\xde\xb4\x29\xa3\x59\xef\x78\xad\x83\xa6\xc9\xb6\x6c\x85\xa1\xe4\xf4\xe2\x7c\xf0\xbc\xff\x4b\x07\x7f\xcf\xd2\xa8\x2c\x8d\xb0\x6c\x9b\x07\xfb\x03\xa7\x0f\x20\xbd\x56\xcd\x5e\xeb\x35\x04\x8e\xc9\xc4\x39\xcd\x72\xf3\x05\x6b\xad\x57\x03\x52\x17\xb5\xf9\xf8\x9e\x49\x8e\xf9\xe7\x85\x96\x26\x3a\x01\xf0\x16\x33\x60\xf4\xd9\x90\x3f\xfd\x2c\x72\xff\x9a\xae\x04\x6e\x7b\x38\x71\x16\xfb\x1a\x89\x67\x27\xb2\xb0\xb0\xfb\x77\xf9\x79\xe1\x77\xfb\xe5\xc3\x17\xca\x7f\xf6\x6e\x1b\x57\x69\x47\x0d\xe5\x41\x04\x0c\x0a\x04\x0c\x16\xe4\x97\xc5\xcf\xf2\x8e\x77\x63\xec\xbd\x0b\x3b\x78\xaa\xfd\xdc\xc6\x6c\x4f\x43\xab\xf6\xa6\x39\xff\xfe\x4c\x6f\x95\x47\x53\x95\x81\xfb\xfd\x8b\xa9\x86\xc4\x9b\x45\x9f\x8c\x3a\x51\x3b\x81\x5a\xba\x6b\x8e\x67\x23\x18\x48\x6f\xa8\x79\x92\x5a\x1a\x9f\xe6\x5d\x99\x6a\xbf\xe1\xa9\xf1\xfd\xa8\xfa\xf3\xc3\x3c\x4b\x52\x3d\x37\x5e\x60\x5e\x76\xd4\x4d\x4e\x04\xc9\xb8\x10\x3e\x55\x1f\x78\xdd\xbf\x99\x5a\xaa\x3d\x0c\xaf\x01\x57\xc5\x6e\xa9\x5d\x6f\x5a\xa1\x73\xe9\xda\x99\x91\x0e\x7e\xa8\x65\xd6\x76\xe0\x2d\x07\x5e\x2a\xa1\xb2\xa6\x2b\x1c\x7c\xd2\xe6\x9f\xe6\xfd\x47\xfe\x4d\xec\x39\xa1\xc3\xed\xdb\x46\xf0\x96\x0b\x36\x2c\xd7\x3f\x3f\x02\xbc\x08\xc0\x6d\xef\x30\xe6\xb5\x61\x81\x73\x69\xbe\xb3\xe7\x5a\x00\xa8\x86\xe7\x87\xaf\xfb\xcb\x98\x09\x0c\xa0\xea\x4e\xdc\x3f\xed\xab\x9a\x99\xcc\x08\x0b\x0f\x71\xac\xc1\xe9\xfb\x71\x2c\x2a\xf6\x0e\x9d\xbe\xcf\xa6\xfb\xf1\x34\x5e\x59\x3a\xf4\x40\x62\x8d\x89\xec\x79\x36\x66\x7a\x42\xb6\x64\x74\xa8\x9d\xc7\x2d\xea\x10\x21\xe8\x5f\xd6\x27\xfb\x67\xfc\xab\x01\xf9\xe8\xd3\x81\x1f\xe5\xd5\x97\xfd\x8d\xfd\xed\x67\x58\x74\xe8\xdc\x01\xbc\x3f\xcd\x8e\x7d\xb3\xe7\xd9\xff\xb2\x83\xa7\xd9\xfb\x76\xee\xfd\x1c\x1a\x6e\xf2\xad\xa7\x1d\xf8\x66\xdf\xbf\xbf\x9f\x5b\x0e\x3a\xfe\x21\xb0\xac\x35\x04\xcf\xcf\xc6\x40\x4c\x26\xe8\x05\xf1\xdc\xfd\x57\x39\x70\xca\xc6\xe7\xfd\xef\xe6\xe7\xed\xfb\x2f\xb3\x69\x58\xfa\xfe\xac\x5f\x28\x44\xac\x07\xaf\xf3\xe8\x00\x0a\xc3\x68\x37\x29\xf7\x67\xe7\xb9\x32\x3f\xee\xef\xff\x16\xb1\x6f\x78\x9d\x67\x3b\x5c\xf2\xab\x43\x3f\xd9\x7f\x45\x8e\x4c\x84\xf5\x90\xa3\xfd\xf3\xcb\x3e\x07\x7e\xe8\xd0\x63\x65\xaa\xe1\xcc\x17\x05\xe1\x9a\xa1\xb5\x57\x85\xfc\xdf\xfd\xbe\x7d\x6d\x5a\x20\xe1\xdf\x9c\xb1\xe3\xee\x79\x79\x84\x6f\xdc\xfa\xda\x5f\x38\x69\x4c\x13\x8e\xb7\x6c\x2c\xbc\xc4\x7b\x5c\x4e\xd0\xb0\x38\x41\xeb\x29\x87\xec\x65\xf3\xf0\xa6\x6c\x9c\xb1\x4c\xc2\x4b\x63\x3f\x87\xdc\x92\x9d\x7f\x06\xa1\x0f\xc7\xfd\x35\xa0\x02\xd7\xdf\x9d\x05\x56\x82\x87\xc0\xba\xb4\x3e\x5c\x54\xe2\xec\x80\x4e\x36\xe7\xaf\x81\xb8\x14\x16\x56\x74\xd3\x7f\x4c\x7f\x49\x26\x1e\xa5\xc8\xf2\xae\xe7\x2a\xc2\xd5\xd9\x3b\xf2\xdf\x60\xf8\x5b\xfb\x5a\x24\xa6\xab\x55\x50\x14\x05\x72\x32\xd2\xd5\x68\x84\x52\x14\x46\x8a\xca\x02\x1d\x45\x32\x0a\xb2\x9e\x20\x34\xc2\x14\x6a\x41\x0c\x0b\x0d\x28\x44\x22\xed\x88\x67\xa0\xd0\x99\xd4\xc3\x96\xb2\xcc\x30\x61\x4a\x12\x18\x85\x0a\xa3\x36\x24\x45\xda\xdb\x32\xea\x72\x37\x64\x74\xc8\xa3\xb8\x28\x44\x25\xde\xba\x2e\x46\x12\x71\xf3\x3a\xdb\xe6\xaf\xd9\x32\xaf\x71\xdc\xe2\x07\x6a\x86\x7f\xb5\x68\xeb\x56\x78\x33\x15\x98\x35\x6f\xd7\xbe\xe2\x67\x07\xcf\x9a\x3a\xeb\x2f\x5b\x1f\xdb\xf2\xd5\xe4\xeb\x7f\xfd\xd8\x9a\x15\xed\xc5\xd7\x3f\xb6\x68\xcb\xe4\x59\x7d\x0f\x4a\x12\x92\xb5\x20\x15\x8e\xd0\x8a\x16\x8b\xc5\x18\x4a\x09\x1b\xb2\xae\xeb\xa2\x2c\x23\x45\x0f\x52\x0c\x2d\xeb\xb1\x18\x1d\xa3\x14\x2a\x2e\x6b\x9a\x96\xe5\x27\x1a\x21\xa3\x5c\xe5\xd0\x6d\xf5\x50\xd9\x91\xb7\x5c\xfc\xcd\xe1\xbf\xd8\x1f\xb4\xf9\x89\x25\xbf\x5a\xf3\x64\x70\x62\x45\xea\x96\xc0\x31\xff\xda\x34\x7f\xf8\xe2\xdc\xd8\x36\xe6\x19\xaa\xbe\xe9\xf7\xe0\x68\xea\x8f\xb7\xed\x1c\x5f\x64\xc3\x4e\x46\x0f\xf5\x9f\x1d\x45\xc8\x9e\xf1\x34\x5d\xdd\x8d\x7d\x37\x8d\x57\xd8\x30\x65\xc9\x08\x96\x1d\xcf\x47\xc8\x5a\x98\xe7\x5b\xcf\xff\x56\x7e\x3a\xda\xf4\x2d\x1b\xe7\xa3\x81\x44\xfa\xfd\xce\xde\x89\xef\xcf\xc2\xf8\xdd\x81\xd3\xfe\x2d\x19\x9b\x75\xd3\x2b\x53\x2f\xaf\x39\xc7\x64\xe9\x5c\x2b\xc1\x4b\xef\x21\xd6\x64\xfa\x50\xcc\xb5\x5e\xe6\xc6\x7b\x8b\x5e\x06\x08\x59\x2a\x4e\xdc\x1f\xcc\x4f\x17\x77\xb7\x39\xe8\xa2\x2d\x2f\xee\x89\x11\x74\x97\x88\x49\x3b\x18\xcb\xaf\xdb\x9c\x1d\xec\xa0\x13\x92\x2d\x93\x75\x61\x2a\xfb\xa9\x2d\xcf\x13\x6b\x35\xfe\x42\xfc\x06\xd3\x52\xcc\xdf\xfc\x07\x7e\x40\xbc\x1b\x71\x0e\xc7\x8f\xd8\xe3\x96\x8e\xbd\xf7\x4e\x07\xad\xe3\x53\x74\xe0\x88\x5f\xa0\x1a\x76\x9e\x07\x73\x98\x61\x63\x15\x47\x7c\x2a\x4b\xc6\x65\xef\x27\xfb\x72\x1a\xd9\x67\xec\xb9\x8e\x78\xb6\x4a\xc8\x3a\x6f\x39\xd6\x64\x8f\x1f\xda\x92\x9f\x9e\x1d\x9f\x6b\x8f\x3f\x10\xb8\xd5\x6f\x50\x4b\x13\xef\x7b\xa6\x82\x21\x37\xce\xaa\xfd\x05\xb5\x34\xf1\x0b\xcf\xbd\xe0\x86\xf2\x17\xc7\xf7\xa7\xea\x12\x6f\x5e\x0b\x46\x55\x32\x19\x5e\xa3\x67\xf5\xb6\xb3\x33\xad\x39\xc6\xa6\xfa\x91\xbd\x87\x9e\x9d\x82\x3d\xd1\xfe\x0f\x3f\xc8\xf5\x71\x9c\xc8\x9c\x73\x0c\xd3\xd1\x2c\xac\x92\x76\x0e\x85\x38\x83\x32\x82\xee\x6a\x7e\x95\x6a\x38\xd2\xec\xfb\x9a\x19\x59\x43\x87\x96\x3e\xf7\xd7\x54\x2f\xf8\x19\x03\x6e\xd9\x14\xaa\xbf\xf0\x22\x00\xf0\x0e\x06\x54\xdc\x6d\xd7\x58\xb6\x65\xa1\xb3\x93\x08\x5d\x27\xee\x8f\x85\xca\x0e\x0d\xc4\x7b\x73\xc1\x31\xae\x85\xca\x0e\xe1\xae\x78\x4d\xc0\x31\xae\x84\xca\x0e\xf9\xf0\xfd\x7e\x27\xaf\xc9\xc0\xa2\xbe\xdf\x71\xbf\x1a\x2a\x3b\xf4\xb2\x63\x7e\xde\x45\x5f\xfc\x0e\xd9\xcc\x3e\xdb\x33\xb7\xe5\x3c\x17\xfb\x23\x1b\x7d\x6e\x7d\xc2\x92\x55\x0a\xdc\x32\x8c\x05\xd3\x58\xee\x31\xcc\x1e\x4e\x52\x26\x76\xfe\x24\x70\xe8\xe0\xe6\x33\xf4\xcc\x3b\x37\x7a\x1d\xb4\x22\x2b\x17\x66\xea\xd8\xdf\x83\xef\xdf\x4a\x2d\xdd\x71\x2b\xb8\xc2\xb3\xa4\xb6\xbe\xa2\xd3\x5a\x5f\xfd\xc9\x97\x52\x9f\x7a\xb6\xd7\x1e\xae\xfe\x3a\x8f\x3c\xe5\x71\xe0\x7b\x56\x77\x82\x6e\xf9\xc8\x8a\xf1\xc9\xf6\x18\x92\x2c\xbf\x0a\xee\xff\xd7\x08\x1c\x7c\x56\x09\x95\x35\xe3\x38\x98\xe6\x2a\x7b\xdd\x0e\xdc\xdd\x63\xf6\x93\xff\x16\x10\x53\xd3\x70\x0c\x67\xb6\xa6\xc0\x58\xc0\x80\x49\x99\xde\xf2\xb0\xc2\x8a\x37\xa8\x28\x2a\xb5\xbc\x9b\xa5\xc5\x56\x69\xc5\x34\x03\xac\x28\xaa\xa8\x84\x44\x20\x5a\x61\x26\x40\x0d\x97\x67\xb2\x9c\x9d\x43\x33\x13\x54\x64\x5a\x10\xfa\x89\xd6\x6e\x55\xd5\x8e\xde\xe2\xde\x5b\xda\x34\x28\x6b\x5d\x5d\x1a\x52\xb5\x36\x7f\xc1\xc4\xde\xef\xef\x3c\x7a\x14\x96\xbf\xf2\xd4\xeb\xbd\x3f\x49\x33\xa6\x4e\xd4\x13\xd6\xa4\x8e\x0e\xad\xb3\x93\xa6\xa9\x70\x98\xd3\x58\xcf\x54\x58\xf9\xc4\xa7\x9f\x2e\x3e\xfb\xdc\xac\x3b\x67\x81\x14\xe2\x8a\x9f\x80\x9f\x6e\x4d\x9e\x7a\xe2\xd9\x71\x5f\xff\x18\xcd\x87\xbb\xd0\x4f\x7e\xe3\x99\x91\x3c\x95\xfe\xf8\xbe\x96\x24\x49\xc2\x59\xe7\xf7\xa0\x2d\xd2\x0b\xe9\xff\xfa\xde\xeb\xe8\x8c\x28\x5c\x4c\x0f\x47\x60\xc2\xd3\x03\x45\xa4\x27\x83\x48\x0e\x52\x02\x07\x99\x4c\x1f\xb8\x3d\x8f\x3e\xba\xe6\xd1\x15\x5b\x16\x4d\x9e\xbc\xa6\xdf\xe4\xe4\x2f\x86\x0f\x87\x3b\xaa\xb6\x4c\x5e\xb4\xe6\xd1\xe4\xe7\x33\xd1\x27\x33\x73\x71\x73\x5b\x8a\x80\xa5\x16\x3f\x9f\x81\xd7\x6d\x28\x3f\xed\xdf\x33\x32\x3f\xed\xfa\xce\x5d\x0e\x98\x94\xed\x79\xb0\x3f\x08\xf4\xc3\xe3\xaf\xf9\x05\x50\x64\x9d\x60\x39\xa8\x01\x13\xad\x8a\x88\x8b\xc0\x3a\xf0\x28\xd8\x04\x9e\xc0\x1e\xc8\xd2\xa2\x01\x78\xfb\xad\x78\x91\xaa\x1a\x58\x6a\xc6\xeb\x06\x88\x32\xe4\xff\xed\x3e\xc2\x33\xe9\x96\x85\xbc\x65\xe5\xa5\x45\xff\xe5\x7a\x61\xfa\xfa\x28\xb8\x18\xfe\xf3\x47\x7e\xb8\x0a\xad\x5b\x8c\xce\x4e\x84\xa1\xd9\xe8\x7d\x38\x37\x70\x1e\xae\x7a\x6d\xdf\xfd\xcf\x9d\x7a\xbf\xe0\xc1\xde\xe7\x9a\xbc\xe3\xfb\x5e\x4f\x7f\x3c\x5b\x3d\x97\xbf\x1b\x80\x4f\x20\x61\x39\x32\xea\x60\xc9\x5c\xf4\x06\x5c\x15\x78\x1d\x3e\xf1\xbf\x07\x17\xee\x6f\xb9\x78\x16\xb2\x0a\x64\x78\x2e\xa6\x44\x50\x6b\x5a\x6e\x6a\x47\x2d\x5a\x4b\x0b\x8c\xb5\x44\x23\x11\x0e\xc6\x21\xa7\x42\x9e\x66\xcd\xcb\x62\xa4\x25\x81\x12\x6a\x5b\x1b\xe4\xda\xc2\x11\x4d\xf4\x0b\xcb\xa6\x5c\x7d\x8d\xf4\x17\x7d\xbd\xb4\x47\xba\xe6\xea\x29\xe8\xef\xcb\xb7\x2e\xd7\x17\x9d\x40\x03\xe0\x8d\xec\x57\xe3\xbd\x17\x96\xb1\x57\x5f\xbd\xea\x93\x3d\xeb\x56\xed\x59\x75\xf5\xd5\x2c\xfa\xe7\xb2\xad\xcb\xf6\x2c\x4c\x96\xc7\x62\x28\x2e\xca\x31\x8e\x0e\xaa\x41\x49\x16\x45\x11\xb5\xd1\x51\x11\x26\x58\x16\x25\xb2\xe3\x82\x20\xa0\x76\x3a\x2a\x9a\xe7\x26\x63\xbe\xa0\x85\xca\xf6\x74\x39\x68\x8c\x4b\xe7\x3a\xd1\x4d\xd0\x02\x2c\xf3\x9b\xb4\x67\x5b\x5f\x3e\x19\x9a\xf2\xef\x4e\x5d\x02\x2e\xb0\x6f\x03\x14\x00\x3e\x95\xc0\x39\xdc\x57\x82\x42\xec\x91\x36\xbb\xf4\x16\x62\x84\x2e\x2c\xa9\xca\xe4\x21\xe2\x5c\x44\xc5\x88\x31\xde\x58\x5b\x4f\xa2\x15\x76\x71\x48\xc4\x15\x62\x5b\x70\x65\xd8\x44\xfa\xbb\x5f\x8e\xc6\x85\x5e\xa0\xeb\x3e\xa0\x5c\x54\x0a\xc4\x5e\xdd\xfc\x58\xef\x61\xd9\x96\x4e\xe0\x38\xf9\x7d\x57\xda\x76\x08\x36\x20\xe1\x18\xb5\x7e\xe9\xf1\x17\xaf\x22\xc6\xe3\xd9\xf1\x13\xd9\x71\xc9\xa4\x5d\xd6\x78\x76\x1e\x26\xa0\x10\xe3\x57\xd8\xf2\x9c\x65\x6b\x3b\x81\x73\x7a\x4e\x5c\xee\x9c\x9f\x6a\x38\xd1\xcf\x03\xc6\x1d\x67\x40\xc8\x1f\x0f\x10\xd7\x8c\xec\x5c\xfb\xfc\xf6\x78\x7d\xe0\x18\xf9\x1b\xaa\xee\xdc\xbd\x13\x53\x35\xbf\xb0\xf4\x20\xde\x5e\x33\xce\x9f\x3b\x81\xe5\x37\x70\xa5\x95\xf7\xa8\x58\x71\x5a\x66\x6f\x10\xb3\x33\x23\x59\x95\xa5\xe2\xff\x31\xf6\x2e\x70\x6e\x54\xd5\xe3\xf8\xdc\xc9\x66\x12\x54\x60\x36\x65\x69\xd0\x2f\x92\xd0\x36\x1b\xc5\xd2\x81\xed\xee\x4e\x0b\x6d\x87\x57\x3b\xf2\x1c\x1e\xc2\x00\x02\x03\x42\x3b\x22\x8f\x41\x04\x06\x11\x19\x51\x64\x58\x79\x4c\x81\x76\xa7\x2d\x6d\xa7\xa5\xdd\xcd\x6e\xb7\x6d\xba\x6d\x21\x8a\x68\x54\xd4\xa8\x28\x41\x14\xe2\x8b\xef\xaa\xa8\x8b\x7e\xd5\xf8\xc2\xd0\xcd\xdc\xfc\x3f\x73\xe7\x91\x3b\xb3\x81\xff\xaf\x9a\x76\x39\xb9\x7b\x1f\xe7\x9e\xf7\xbd\xf7\x1c\x2c\xb9\x5c\x70\x4c\xd7\x1f\xfe\x1f\x3a\xdd\x8f\xa3\x0c\x8b\xae\x80\xcc\x76\x67\x07\x06\xb3\x73\xdb\x5c\xd9\x01\x1a\x8f\xec\x68\x3f\xba\x01\xe6\x7c\x40\x9a\x34\x4d\xd2\x2a\x16\x6d\x89\xac\xdb\x74\x8c\x6f\x96\xcc\x66\x25\xc6\xda\x34\x59\xb7\x65\xd2\x6c\x96\x62\xbc\x2d\xc7\x18\x32\x69\x37\xc8\xe4\x21\x81\x9c\x82\xd3\x34\x0d\xf2\x36\x0b\x68\x9a\x86\x15\x03\x94\x21\xe7\x7c\x62\xe2\xec\xaf\x4a\x90\x77\x3e\xb0\x50\xc8\x64\xc8\x62\xb9\x51\x2b\x92\x22\x03\x69\xf4\x92\xb2\x84\x68\xa7\xe8\xfc\x4c\xf1\x2c\x6b\xc9\x26\x27\x72\x22\xcc\x83\x9a\xc8\x89\x9c\xc4\xca\x2c\xcb\x5a\x2c\x6b\x37\xa4\x4c\x1a\x9a\x40\xce\xa4\x2b\x6c\x89\x05\x4a\xe8\x3f\xb9\x3c\x9b\x87\x35\x5d\x07\x79\x1e\x1a\x05\xe7\x4f\x28\x6f\x39\xaa\x9c\xbb\x3f\x8d\xed\xa9\x7b\x47\xf2\x87\x48\xbf\x5f\x8e\xbe\x3d\xda\xfb\x4e\xf0\xde\x6a\xa0\xef\xd6\x3f\x8f\x38\xe4\x90\xb7\xa7\x67\x25\x5e\x40\x77\xc2\x50\x3c\x78\xfd\xf3\xf3\x67\xe8\xc4\x38\x0f\x7e\x4d\x38\x16\xc5\x7b\x7c\x5d\x8d\xee\x74\xf8\xf5\x1e\x8e\x45\xf9\x89\x4f\x45\x2f\x7c\xe7\xcd\x41\x39\x99\xdc\x5a\x99\xdd\xd9\x9e\xec\x82\xbe\xee\x79\x00\x65\x23\x9c\x33\x97\x4a\xb8\x19\x1e\xe7\xbb\x89\x9b\x7a\xe6\x75\xa3\x0a\x5c\xee\x85\x1f\xf2\x73\x96\x05\x48\xd5\xd6\x49\xf7\x2f\xde\x2e\x39\x1f\xf0\x17\xc3\xb0\x05\xdd\x98\x96\xa6\x74\x9d\x15\x4d\x8e\x95\x00\xd1\xc5\x82\x69\x98\x66\x48\x4e\x17\x74\x2d\x2d\xf0\x1c\x9c\x8a\x5f\x7b\x68\x3a\xfe\x79\x63\x86\x33\xc8\x0b\x0d\xf2\x3a\xe3\x71\xdb\xec\xfa\x19\x0f\xcb\x15\xad\x0a\xa7\x79\x55\x6b\xe6\x63\x79\x3e\xaf\x4d\x91\x05\x13\x1a\x66\xb3\x28\x8b\x66\x52\x88\x31\x84\x77\x47\xd3\x6a\xaf\xd9\xf9\x9b\x5e\x33\xba\x13\xfc\xae\xf5\xda\xf2\xcf\x73\x27\xa6\x28\x07\x43\x38\xde\xc6\xf6\xb5\xf1\xe6\xe0\x30\xe0\x21\xa7\x8f\x49\x0c\xa7\x6f\x87\x6d\x2d\xd4\xb3\xff\x5d\xc3\xb3\xb5\x3c\xdf\x62\xfd\x73\x28\x8f\xfd\x62\xf4\xdd\x7f\xdf\xe5\xf7\xde\xea\xf4\xdd\x98\x7b\x93\xe0\xf9\xd9\xdf\xa5\x72\x07\x76\xbf\x87\x48\x75\xfc\x2e\xe8\xf3\x3f\x61\x7b\xa8\xf8\x21\xf4\x1d\xba\xb5\x39\xf4\x6f\xcc\x7e\xd5\xfc\xdf\xdb\x7e\x1b\x1a\xef\xeb\x9d\xc6\x73\xfa\xf4\xfe\x4e\xec\xfc\x03\xe8\x38\xdf\xa7\xff\x32\x6b\xbe\x7a\x64\x4e\xff\x42\xb6\x98\x4f\x6f\x87\x11\x73\x88\x63\xbd\xfb\x65\x83\xc4\x32\x94\x07\xfb\xe3\xae\xf4\x46\x4a\xb8\x5d\xc0\x15\xfb\xa9\x2d\x1f\xfa\x06\x22\xd9\x42\xff\x9f\x28\xf2\x3b\xea\x49\x1c\xf7\xe1\xdb\x96\x7c\xfc\x63\xe0\x3a\x6d\x09\xb7\xe4\x84\x4f\xb3\x57\x5d\x05\x2e\x51\x4f\x3a\x19\x41\xcf\xb7\xbf\x4b\x9a\x2d\x82\xce\x00\xc2\xae\x14\x32\x34\x6c\x14\x01\x83\x8e\xee\xd1\x07\xde\xff\xff\x4f\xb5\xd4\x59\xcc\x2d\xe2\xaa\x0b\x56\xdd\x75\xcd\x9d\x77\x31\xab\x85\x55\xab\x56\xdd\x7a\xcd\x2d\xf7\x31\x57\x0b\x17\x5c\xb0\xea\xae\xd5\xb7\xc2\x0b\x55\x9e\x6b\x6a\x31\x8d\xe3\xa1\x6c\x40\x55\x87\x9a\x1e\xff\xed\xff\x03\x55\x23\xbc\x72\xad\xe5\x89\x97\x5d\x3e\xaf\x13\xf4\x9a\xa7\xbe\x09\x8e\x6d\xcd\xcc\x5b\xcf\x2d\x4c\x51\xfb\x8f\x5e\xf2\x56\xd8\x2f\xf1\x70\x8f\x5e\x88\x0e\xfd\xf3\x5d\xe8\xc1\xf1\x4c\x81\x7f\xef\x17\xbd\x82\xa6\x12\xbd\xe8\xf2\x85\x97\x94\x29\x9b\x9a\x83\x6c\x5a\x22\x9e\x20\x00\x75\x24\xe8\x3e\x79\x70\x60\x70\x6e\x57\xbc\x17\x4c\xe9\xa6\x0c\x6a\x35\xdb\x88\xe5\x19\xae\x20\xe6\xc9\x7a\x53\xd5\x8a\x8d\x8a\x3a\x5d\x07\x69\x90\x91\x6c\x15\x16\x38\x4e\x4a\x26\xeb\x55\x06\x56\xe0\x94\x40\x0a\x8a\xa8\x81\x3c\xd0\x4d\x5d\x66\x75\xcb\x84\x16\x6c\xe8\x35\xbd\xa6\xc1\xa2\x5e\x04\x7a\x8c\x97\x79\xd5\x66\x92\x82\x60\xea\x92\x63\x58\x00\x50\x69\x09\xf1\x0a\xaa\xa1\xec\x66\x66\xa6\x12\x3d\x7e\x0c\xac\x9d\x61\x76\x3e\x70\x13\x36\x6b\x02\x03\xf2\xba\xc1\xb1\x0a\xaf\xcb\x8a\x2a\xc9\x56\xd1\x2c\x16\x44\x60\x82\x8c\x5d\x02\x79\x86\xa7\x54\x45\x37\xa6\xac\x7c\x9e\x91\x55\xc1\x10\x25\xc9\x28\x1b\xcd\x52\xcc\xb0\x04\xb3\x04\x8a\x86\x2c\x06\x71\x50\x74\x96\xb3\xd7\xcd\x09\xb1\x0c\x8b\x8f\xa2\xb3\xd5\xbd\xa7\xa3\x73\xeb\x21\x0c\xae\xf9\x70\x9a\x9a\x40\xfe\x0b\x01\x08\xa1\x25\x26\x4a\x94\x4a\x2c\x76\x71\xea\xd5\x77\xf6\xfe\x17\x4a\x67\xd5\x0e\xeb\x11\xb1\x79\x54\xa2\x7b\x00\x95\xbf\x22\xf3\x55\x4b\x06\x56\xdd\x36\x62\x9c\x2d\x90\x45\x3b\x49\x36\x2c\xb2\x61\x27\xc9\xa2\x2d\xc4\x38\x3b\xcd\x89\x53\x25\xa5\x5a\x2d\x01\x51\xb4\xc5\x82\x2c\x2b\xf5\x52\x66\x1a\x56\x04\xa0\xe8\x9c\x61\xd5\xcd\x82\x69\x99\x96\x65\x5a\x66\xc1\x2c\x2a\xa2\xa9\x19\x62\x49\x33\x41\x92\x94\x54\x09\x66\x58\xde\x14\x79\xc1\x9f\x7f\xa1\x3d\xff\xd1\x4f\x87\xe2\xc1\x0e\x2d\x21\x5f\x76\xcf\x89\x18\x1c\x6b\xbf\x97\x0b\xe1\x47\xf5\xe1\x07\x9e\x0c\xf5\xa3\xa4\x72\x7b\x50\xa5\x4d\xe7\xdb\x20\xae\x81\x64\xd0\xfe\x0b\x11\x25\xd6\xb1\xf6\x96\xd3\x7e\x12\xbd\x05\x09\xde\xe9\x4a\x08\x9f\x4e\x7b\x14\x53\x19\xfa\x7b\x74\x5f\xdc\xf6\x13\x87\x30\xb8\xda\x9e\x4f\xf0\x06\x9c\x47\x7c\xa0\xb8\xeb\x4a\x51\x5b\x17\x86\xc6\x0d\xd6\x3b\x71\x07\x06\x97\xb1\xf5\x9e\x86\xc1\xd1\xb9\xb0\x3b\x6e\xf0\xbe\xd9\x7d\xe3\xe9\xcf\x33\xb7\x03\xdd\xd2\x1d\xfa\x5b\x18\xa7\xa3\xab\x9d\xb1\x27\x97\x44\xc7\x76\xc7\x38\xe8\xe7\x47\x3d\xaf\x75\x2a\xd6\xd7\x9a\xa7\x3e\x4b\xf4\x92\x5b\x97\x17\xd8\x63\xe8\x95\x3b\x8e\xff\xe3\x7f\x57\xbc\x7c\xca\x43\x1e\x6e\xba\x13\x2f\x50\xa7\xa5\x72\xe3\xeb\xe9\x97\x53\xd4\xda\xcf\x2c\x7e\x11\xdb\xab\xa0\xdf\x5d\x25\x6c\x3c\xbd\x8d\xb3\x7d\x97\x63\x76\x86\x9b\xfb\xe7\x02\x24\xd1\xcb\xa1\x3d\xd4\x53\xb9\x51\x09\x69\xc9\x25\x51\x1c\xb8\xfd\x6f\x44\x77\x36\x88\x98\x9f\xb3\x90\x38\x12\x49\x78\x22\x5a\x39\x6e\x4e\xb6\x3b\xdb\xe6\xe3\xf9\x80\x4a\x74\x9f\xbc\x60\x6e\x57\xa2\x17\xb1\xf3\x02\x37\xf7\x5e\x86\x34\x0a\xa4\x61\x2b\x31\xae\x51\x8d\xf1\xb6\xc2\xc4\x65\xbb\x2a\x95\x64\xde\x10\xa5\x42\x4d\xb4\xb5\x16\xa1\x9b\x19\xa0\xe6\xe1\x74\x43\x28\x19\x32\x10\x41\x1a\x6a\x56\x57\x7e\xa6\x16\x9f\x36\x0c\xc3\x30\x4d\x03\x0a\x30\x63\x2a\xb2\x2a\x6a\x22\xcf\x14\x0b\xa0\x26\x0b\x70\x4a\xd5\x64\x4e\x00\xac\x98\xd1\x05\xcb\x2c\x76\xc2\xff\xc8\xd5\x21\x7c\xa8\xa9\xdc\x9e\x1a\x3a\x6f\x46\x58\xd9\xf3\x8b\x30\x1f\xec\xbf\x3f\x84\x13\xd9\xd7\xad\xc3\x69\x07\x5e\xf0\x73\x7e\xae\x6a\x71\x09\x09\xe5\x38\x58\x42\x12\xcb\xfe\xe6\xd8\xec\x5b\x7f\x89\xe1\xf1\x2b\xc1\x7e\xac\xdc\xfd\xc7\x6b\x8f\x5c\xf6\xc1\x15\x55\x4f\xee\x7b\xe7\x41\x05\xc4\x27\xc3\xc7\x44\xf9\xcd\xdd\xc3\xd1\x2b\x03\x38\xdb\xde\xf3\x14\x35\xea\xbf\x7b\xe6\xfc\xf8\xe9\x30\xba\x19\x75\xe0\x03\x01\x5f\x79\x76\xbf\xc7\x57\x7f\x0d\xd1\xa4\xe6\xf3\xc3\xde\xe5\x98\xaf\x82\xee\x0b\x8c\xaf\x6f\xbf\xb9\x7e\x7a\x2a\xf8\x9d\x87\x02\x1e\x5a\xb5\xff\xef\xc4\x1f\x08\x62\xf0\xdf\x9c\xff\x9d\xfb\xe6\xa9\x34\x8b\xf6\x15\x4c\x7e\xd2\x9d\xe5\xcc\xae\x97\xa2\xf0\xfd\xcf\x84\xe4\x89\x3b\xb6\xdf\x7e\xe5\xe8\x65\x17\xc7\x4f\xfd\x26\xd7\x11\x57\x5b\x4c\xec\x77\xc4\x36\xcf\x6f\x0a\xd3\xbb\x96\xca\x8d\x5e\x31\x8b\xde\x8b\xed\x7e\x4c\x5c\x66\xa1\xf7\x65\x13\xe7\x46\xe6\xe4\xc9\x02\x4f\x36\x7d\xf4\x1d\xf6\xee\xf8\xd0\xda\xd4\x54\x6e\xfc\xd3\xa1\x7e\x04\x74\x47\x43\x77\x71\x9e\xca\xad\xef\xb6\xe8\x14\xb5\x97\x99\xaa\x7b\xf9\x90\x4d\x6c\xff\xfe\x2f\x3a\x57\x8f\x37\x9f\xf5\x7c\xe6\x2b\x5b\x7c\x62\x13\xa5\x11\x47\x10\x1f\x20\x16\xb8\x19\xb5\xa8\x44\x37\x4a\xda\x87\xd2\xb4\x2f\xf0\x4f\x98\xd0\x73\xcc\xa0\x1e\x02\x98\x9b\xf0\xb8\x18\xc5\xb7\xfc\x72\xba\x6e\xf4\xa4\x3f\x8b\x12\xb5\x9f\xa0\x4b\x26\xe0\xf2\xd3\x55\xa1\x62\x4a\xa0\x1e\x2b\x4b\xaa\x51\x06\xb2\x6a\xab\x96\x99\x91\x0c\xf8\x08\x97\x89\xd1\x8d\xa9\x98\x90\xce\xc3\x5b\xb7\x32\xe0\x32\x93\xfc\xbc\x7d\x7f\x92\x8e\x0d\xd8\xa9\xff\x25\x57\x88\xf6\xd8\x7f\x47\xed\xbb\x2f\x23\x57\x5a\xf6\x45\xe4\x5f\xd3\xf0\x3a\x41\xd2\x4a\x24\xc1\xcb\x32\x6c\x88\x2a\xcf\x08\x0d\x85\xd5\x2a\x65\x4d\xe4\x0a\x92\x5e\x05\xe5\xbc\x2c\x8b\x5d\x0d\x5e\xd0\x75\x96\x81\xcf\xbf\xff\x8a\xe1\xe1\x6b\xae\x3f\xf9\x9a\x17\x56\x5e\x7f\xc5\xa1\x3f\xaa\xd7\x7c\xb2\x78\xcd\x4a\xe1\x9c\xc1\x95\x9f\x8c\xe0\x76\x78\xd1\xac\x3d\x75\xf3\xad\x7c\xbb\x03\x3c\xd0\xf7\x13\xfe\xfb\x1b\xc5\xe7\x6f\x0f\xdf\x7f\xe9\xa4\x87\x52\xd4\xfe\x66\xb2\xcd\x2f\xe8\xae\x34\xda\x3b\x6a\x54\xc4\xda\x4b\x6d\x19\x3c\xfe\x4a\xc8\x9e\x08\xf6\x2d\x78\xc3\x2f\xf8\xfc\xe3\xf6\x33\xb9\x36\x83\xeb\xb3\x80\x96\x26\xce\xea\x4c\x63\x41\x8e\x00\xc9\x97\xf1\xa3\x28\x6f\xec\xd0\x9f\x43\x3e\xa6\xea\xcb\xfe\xb1\x42\x48\x57\x04\x34\x3c\xf4\x66\x10\xbf\x5f\x9e\x28\x53\x9f\xa7\x57\xaf\xbf\x79\xf9\x5b\xcb\x9b\x1c\x41\xaf\xdc\x7b\xfa\xbf\xd1\x3d\x4e\x2c\xf6\xc3\xa6\x72\x85\xf3\x43\x72\x30\xac\x67\x73\xe3\xe8\x66\x9b\x97\x37\x41\xf1\xef\x63\x4e\xa2\x3b\x7d\x43\xd3\xd1\xd8\xee\x81\x67\x32\x44\x8a\x1a\xff\x69\x06\xdf\x53\x47\x46\xa1\x38\xd2\x81\x67\x30\x5c\xb9\x67\xe8\xe8\xdd\x03\x92\x54\xd4\xf8\x53\x18\x5e\x02\xb9\x56\x78\x20\x34\x2f\x87\xc7\x1a\x9d\xe9\xc3\x6d\xbf\x0e\x46\x75\xa8\x27\x9f\xb6\x75\xc6\xfb\xba\xb9\x51\xbb\x63\xfc\x03\xb3\xe4\x1f\x5a\xc3\xd8\x8d\xb3\xc6\x95\x7d\x3b\x85\x76\x5f\xeb\x51\x43\x7f\x0a\xf3\xf6\xd8\xa5\xef\x36\xd7\x83\xa9\x28\xad\x79\xf0\x85\x44\xe4\x9c\xca\x7d\x9f\x3f\xf4\xc7\xa8\xde\xdb\x85\x72\x3c\x16\xce\x43\x98\xba\x00\x5b\x77\xb0\xbe\xf1\x45\x1d\xc7\xce\xad\x47\x59\x34\x86\xfe\x80\xe9\x1e\x87\xb6\xfe\x3b\x4b\x87\xc9\xed\xbe\xc6\x92\x51\x1a\x71\x79\x69\x57\x7b\x1d\xcb\x13\xbb\xdb\x3c\x36\x76\x66\xcf\x5b\x61\x9d\xe0\xf6\x53\x98\x0c\xe9\x62\x33\x95\x1b\x46\x37\xd4\x87\xde\xe8\x6c\x63\x8e\xa6\xa3\xba\x73\xc7\xa7\x42\xf4\xe4\xda\x92\x01\xfe\x46\x17\x46\xf7\xd4\xdb\xeb\x76\xce\x17\x31\x44\xc7\xbf\xc7\xda\xf3\xa8\xfd\x2f\x67\xed\x5b\x19\xdd\xf3\x44\xb2\xc6\xfc\x52\xd4\x96\xf0\x64\xcd\xef\xa2\xf8\x19\x1e\x0b\xd1\x52\xdb\xf6\x40\xe7\x5b\x43\xbf\x8d\xce\x7f\xe4\xdb\xb3\xd6\x55\x6a\xcf\x7f\xcb\xc3\x51\xdd\x3f\x5a\x09\xb5\x97\x7d\xdf\xbe\x80\xe8\xa5\x70\x6e\x27\x9b\x9a\xa6\x36\xc5\x43\xed\xd5\x54\x6e\x9d\x81\xda\x9f\x13\xc8\x50\x36\xb4\xae\xa9\x10\x0d\x19\x01\xaf\x81\x68\x3f\xee\xb8\x43\xff\xdb\xd9\x6e\x1e\xf9\x6a\x94\x7e\x91\x2c\xcb\xed\x41\xd9\x9e\xf6\xbc\x8e\xbe\x5b\xd3\x3a\x37\x61\x51\x97\xa7\x56\x17\xce\x21\x66\x38\xe2\xd4\x47\xe8\x95\x8f\x6c\x22\xfa\x57\xbc\xbc\xec\xcd\xb0\x1c\x2f\xb2\xb3\x64\x8a\x7b\x6f\x79\x4e\x5b\xa6\x0c\xbd\x1e\xd6\x2d\xee\xbc\x9f\x3a\x33\xb4\x9e\xb6\xec\xfc\x4d\x94\xb7\x27\x9e\x47\x39\xb2\xd1\x6f\x0d\xfd\x1a\xe9\x67\xa1\x75\xa2\x83\x1b\xe2\x70\x62\x2e\x71\x1a\x71\x8d\x5b\x6f\x35\xdb\x3d\xdf\xb1\x96\x7b\xb2\x3d\x73\x02\x8d\x3c\x27\xeb\x97\x58\x45\x05\xee\xfd\x94\x90\xf3\xda\xd7\x42\xbc\x94\xaa\x28\xd7\xba\x67\x6f\x77\xc5\x91\xbd\xdd\xe3\xf8\xf0\x9e\xbd\x0d\xc6\x40\xcd\xd6\x00\x57\xd3\x1a\x0d\x50\xd9\xdb\xd6\xd1\x2b\xc1\xa7\x57\x5d\x70\xc1\xa5\x17\xac\xb9\xda\xfe\x56\xec\x03\x07\xd7\x81\xfb\x99\x4b\x6f\x19\xec\xdd\xbd\x62\x4d\x6f\x6f\x7a\xd1\x60\x7a\x67\xf3\xb2\xe7\x77\xc2\x6f\x1c\xaf\x66\xf2\x92\xa2\x09\x86\xac\x80\x24\xa0\x05\xbb\x00\x4b\xa2\x52\x2d\xe6\x61\xa3\x2e\xd4\x6a\x0c\xc9\xc4\x56\x9a\x3a\x69\x65\x38\x8d\x4d\x1b\x5a\x6c\xa9\xab\xb0\xed\x2b\x4f\x39\xf6\x9a\xf9\xa7\xf4\x9d\x7d\xc7\x2d\x5f\x39\x3b\x71\xcb\x1a\xf1\xec\xa5\x8b\xbf\x27\x9e\x9e\xb8\xf7\xc8\xbe\x8d\xcf\xde\x72\xc7\x29\x4f\xc0\xb2\x90\x4e\x8b\x82\x24\x8b\x0a\xaf\xb1\x86\x05\x78\x86\x69\x30\x8c\xce\x33\x22\x20\x04\xc6\x54\x23\x72\x67\xe7\xe9\x9d\xf5\xb7\xfb\x0e\x33\x04\xdf\x11\xd0\xfc\xaa\xa7\x6e\x23\x86\x5a\x33\xa7\x5c\xca\x31\xde\x1e\x4b\x6d\x1d\xbb\xe5\x9c\x8e\xb2\x98\x1a\x3e\x3e\x6a\x63\x6d\xfe\xc1\xac\x31\x5c\xbf\xe1\x11\x14\x2b\x78\x26\x6a\xeb\xee\xd4\x66\xf1\xa1\xd8\xe6\xc3\xe0\xdd\x6b\xe0\x3b\x7b\x72\xfb\xd9\x68\xff\x2e\x7c\xe3\xdd\x51\x9d\x34\xd2\x9a\xe5\x93\xb8\x3e\x84\xcb\x3f\xbf\x8a\xc2\xdd\x37\xdd\x01\x7f\x4a\xad\xbc\xcb\x87\x3b\xde\x40\x3e\x2c\xca\x54\xe1\xc8\x32\x9c\xa6\x77\xbc\x39\x6b\x0d\x85\xb6\x5e\xdd\xd4\x15\x95\x31\x2e\xfc\x49\x64\x2f\x11\x49\xcf\x0e\x31\x88\xc3\xb0\x57\xe0\xfd\xc4\x85\x78\x0d\x2e\xac\xb4\xdd\x3c\xb7\xd4\x9f\x77\x8e\x1a\xaa\xd3\x14\x73\x68\x7a\x21\x98\x9b\xc0\xae\x47\x39\x24\xde\x36\x69\xbb\x32\xf9\x74\x8c\x69\x4c\xc5\x58\x3a\x6d\x57\xe3\xb2\x6d\xc6\xe8\x66\xdd\xa4\x61\x15\xca\x12\x48\x03\xc6\xae\xc5\xd2\xb6\x69\x81\x0a\x64\x49\x09\x54\x66\x6a\xfe\x4f\x35\x90\x06\xb4\x00\xa7\xe1\x74\x8b\x10\x38\x49\x91\x19\x9d\x13\xa7\x81\xc0\xd8\x2a\x2c\x28\x2a\x32\x76\xf9\x82\x25\x90\x22\x65\xb0\xbc\xae\xe7\xf3\xb0\x0a\x09\x49\x17\xc5\x8a\xa4\x33\x8a\x2e\x01\x46\x14\x45\x38\xed\xfc\x95\x61\x65\x4d\x65\x59\x25\x2f\xf3\x82\x28\x88\x9c\x44\x5b\x69\x60\x71\x4c\x11\x99\xb6\x65\x36\xa3\x6b\x3e\xbe\x2a\x98\x4f\x12\xeb\x28\xd3\xa8\xa1\x5f\x46\x69\x73\x92\xed\xe0\x87\x3a\xb2\x1a\xe5\x55\x18\xfa\x45\x34\x5e\xb5\xf3\xce\x08\xcd\x1e\x97\x98\x6c\xeb\xd6\x2d\xbf\x7d\xff\x6b\x61\x1a\x74\xe1\x07\x7c\x1d\x24\x22\x19\x2e\xa4\xfc\x08\x47\xad\x93\x9d\x4a\xe7\xf6\x7e\x14\x69\xf6\x7f\x84\x69\x67\xc3\x8d\x21\xbe\x10\x5a\x19\x2f\x1f\x19\x92\xaa\x23\x67\x84\xf4\x96\xee\xe3\x62\xf7\x65\x9d\x6c\x73\xec\xed\x12\xef\x9f\xa3\xb9\x7c\xb4\x63\x7e\x67\x7b\x22\x78\x4b\x25\x04\x79\xd0\xd0\xb8\x3b\x7a\x43\xe3\x06\xb4\xbc\x6e\x71\xd4\xf7\x74\xfb\x2f\xde\x14\x9d\x8f\xdb\x7e\xc7\x47\x3a\xd9\x82\x29\x6a\xef\xe8\xbb\xc6\x88\x5e\x43\x7c\xe1\x7d\x47\x1c\xee\xbd\xb1\xcd\x12\x0b\x88\x45\xc4\x79\xb3\xf4\x80\x77\x73\x2f\x5a\xee\xb1\xcd\x3d\x98\xd4\xf7\x58\xa2\x1b\x97\xfa\x1a\x2e\xf5\xbf\x0f\x14\x03\x28\x4d\xc3\xac\xd5\x50\x95\x47\xf7\x9f\xd3\xda\xba\xa0\x28\x66\x32\xa2\x52\x50\x34\xc5\xa8\x01\x9a\xb7\x75\xd8\x50\xf5\x5a\x29\x0f\xeb\x0d\xa1\x54\x14\x49\x2d\x26\x60\x32\x1e\xdc\x53\x2c\xda\x02\x30\x0d\xc3\x80\x92\x61\x18\xb1\xf3\x5c\x99\xdf\x4c\x6b\x69\x5a\x16\x44\x55\x56\x05\x85\xb3\x2c\xa0\x72\x2c\x9c\x66\x39\x4d\xe2\x04\xc0\xf0\x79\xd3\x8a\xd0\xa8\x8b\xcf\xc9\x4f\x74\xb6\x33\x46\xee\xc3\xfc\x63\x33\xb0\xb7\x72\xdb\xd1\x2d\x9b\x1d\xf3\x82\x3d\x2e\xb6\xf7\x78\xbb\x15\xe5\x9b\xfd\x56\x88\x0f\x22\xed\xf7\xfd\xa6\xa3\xdf\x42\x6d\xbf\x2b\x2a\x73\x5d\x78\xf0\x96\x34\xa2\xfb\x9f\xfe\x41\x67\x1b\x7d\xdb\xf7\xa2\xf0\x9d\x33\xb3\xe4\x2a\x16\x87\xdd\xf6\x02\xc6\x7f\xa8\xff\x4d\x24\xb2\xd1\x11\x9f\x15\xce\xc6\xfa\xd2\x53\xb9\xe2\x9e\x59\x7d\x61\x76\xef\x88\xd8\xd1\xbe\xcd\x8d\xa0\x88\xd6\xc8\x17\x23\xbe\x14\xd2\x89\x1b\x8e\xc2\xf0\x54\xc0\xf0\xba\x10\xf3\xd5\xd0\x3d\xf4\xed\x8f\x38\x7d\x79\x16\xf0\xab\x98\x2e\x08\xf8\xca\x7a\x2b\xb4\x7f\x8a\x3f\x86\xf5\x6d\xa2\x1e\x9e\xef\xf8\x6f\x66\xed\x91\xe5\xb7\xa7\xa9\x75\x87\x42\x32\x4f\x0d\x64\xde\xcf\x43\xeb\x53\xfd\x98\xef\xc6\x5d\x9d\x65\xe4\x3a\x32\x44\x03\x4a\x2a\x57\x28\xa2\x3a\xd1\x08\x8b\xce\x58\x81\x1d\x18\x8c\x1d\xbc\xb1\x0a\x64\x83\x67\xcd\xfd\xac\x33\x3e\xb6\x3f\x8a\xe9\xd2\x60\xbe\xe8\x55\x51\xae\x38\xc7\xf7\x94\x71\x3f\xab\xf8\xb5\xd0\x1e\x2a\xbe\x9f\xea\x66\x54\x19\x7a\x25\xd0\xd9\x1e\x3d\xec\x70\x6b\x68\x3f\x8a\x6e\xd9\xbb\xf6\xf5\x4f\x43\x34\x16\xc8\xd3\xa1\x97\xb1\xf5\xba\xf7\x74\x70\xdb\xb6\x1a\xa6\xcb\x6d\x17\xcf\xa2\x25\xad\xdd\x57\xf0\x0e\x28\xb0\x71\x5c\xf8\xd6\xef\x74\x94\xb5\xb9\x3d\x28\x93\xe3\xd0\x4b\x61\xbf\xcb\xf3\xa3\x2e\xc2\xfa\xda\xee\xac\xa9\xf8\x3f\x04\x41\xaf\xd9\x42\x81\x55\xad\x43\x4b\xce\x5e\x51\xa5\x57\x4d\x3c\x49\xbc\x49\x74\x0d\xde\xbb\xe2\x8e\x00\x8f\x6b\xe8\xd5\xeb\x5e\xff\xf0\x6d\xa7\x5a\x4b\xc7\x52\xd4\x70\x0f\x16\xef\x28\xb6\x65\xc3\xe4\x52\x34\xee\x4f\x30\x1a\x56\x52\xb9\x75\xff\xf5\x77\x38\xec\x6f\x20\xbf\x11\xbd\x44\xa2\xa9\xc2\x99\x61\x59\xef\xc5\xce\xef\x89\xf2\xef\xf8\x75\x9d\xfd\x7b\x57\x07\x6c\x3d\x22\xc4\x3f\x01\x1d\x8d\x5f\x13\xf2\x41\x03\xbc\x8e\xdf\xf0\xae\x3a\xe3\xc7\x9e\x2c\xe0\x30\xf9\x47\x0d\xbd\xd8\x39\x26\x35\x2c\x46\x65\x93\x67\x63\x1c\x0c\xef\x1d\xbd\xc6\xb8\x86\xf8\x15\x71\xc4\xd2\xcc\x8a\x21\x9f\x67\x46\x3a\xea\xc0\x14\xb5\xf9\x42\x6c\x3d\x4a\xb0\x9e\xdc\x88\x7b\xf6\xfd\x23\xef\xbb\x64\xe2\x20\xc5\xa2\xef\x2a\xf4\xca\x0d\xa4\x58\x59\xf6\x00\xd7\x49\xde\xe6\xd6\xa1\xcc\x5a\xeb\xfe\xd3\x49\xde\x4f\xd6\x3a\xcb\xc4\x75\xdd\x51\xbb\xd8\x8b\xc1\xbd\xd2\x19\xd7\x1b\xd5\xa8\x9f\xeb\xe9\x93\x7f\x85\x7c\xbd\xa0\xfd\xd6\x7d\xd1\xf6\xc5\x63\x91\xfe\xff\x9f\xce\xf2\xc8\xf2\x73\xe9\xac\x6a\x25\x13\xfb\x28\x0e\xc5\xfc\x2b\xcb\xfe\x86\xf2\x1a\x17\x2f\xa9\x2c\xbf\x00\xcb\x6b\x2c\x07\x71\x5d\x6a\xe2\x98\xd0\xfa\x02\x1a\xd8\x5a\x9c\x25\xbf\x8f\x9b\xe5\x6f\x14\xdb\x7e\xf3\xa6\xb3\x43\x71\x85\xb6\xbe\xbc\xb7\xe3\x7c\x73\x4f\xa3\x4c\xb6\x0e\xef\xcf\xe6\xc5\xcd\xe5\xce\xbe\x79\x70\x47\x3d\x32\xd7\x2d\x6f\x04\xfa\x29\x24\x5b\x87\x9f\x0f\xe1\x36\xd0\x1b\xeb\x1a\x21\x79\xa2\xa6\x72\x5b\xf2\x1d\xe4\x4c\xc0\x6f\xc1\xfd\x6e\x97\x0e\x83\xbb\xf9\xa1\xf6\x46\x7b\x4f\x77\x2f\x0f\xad\xd9\xe1\xc3\x6d\x21\x5e\x0f\xc9\xa5\x54\xee\x91\x0a\x8a\xc0\x48\x9d\xec\x90\xad\xbe\xde\xb8\xa0\xc5\x25\x9e\xa5\x14\x7a\xf5\xe4\xbf\x97\x12\xcb\xe7\x38\xfb\x3a\xbe\x9e\x24\x96\x03\x2e\x12\x2b\x78\xe8\xa2\x3a\x91\xca\xad\x4f\xa0\x2c\x8a\xeb\x03\xfc\x62\x76\xc4\xe4\x49\xa1\xf5\x04\x78\x0f\xee\x49\x47\xf0\x35\xf4\xc3\xce\x34\xb7\x9e\xc3\x74\x29\x66\x7f\xef\x42\x59\x93\x77\x5d\xdd\xc9\x9f\xb4\xfa\xb0\xbe\x6a\xce\xef\x98\x4d\x4c\xfe\xff\x20\xe8\x0f\xc9\xaf\x1d\x8f\xa4\x89\x54\x6e\x43\x0b\x5b\x4b\xfb\xcd\xac\x6b\xb7\x5b\x98\xfc\xc4\xee\x1c\x07\xb2\x38\xd0\xff\x48\x9e\x53\x63\xbb\xb1\xf1\xdd\x78\xc8\xdc\x59\x7b\x83\xf8\x70\xd3\x0b\xfe\xa8\x9d\xd6\x3e\x54\x09\xf9\x1e\x6d\xf8\xf7\x43\x32\x55\xf3\x65\xd9\xc4\xfc\xce\xf6\xe4\xc6\x66\xc8\xa6\x0b\xe6\x39\xf4\xbd\x59\xfc\xef\xc2\xbf\x8b\xe1\x1c\x93\x2f\x43\x78\xae\xbd\x2f\x07\xed\x57\x9a\xaf\x9c\x4b\x9c\xea\x26\x7c\x89\xa1\xf7\x9c\x1a\x95\xf7\xee\x25\x13\xee\x0d\x2b\x94\x5f\x3e\xf8\x17\x74\x67\xbb\x9d\x8f\x96\x20\xec\x0a\x98\xb6\x60\xc9\x56\x61\xc9\x02\xd3\x76\xb9\x2b\x0f\x4b\x80\x87\x25\x2a\x6f\xc2\xf2\x4c\xbe\x8b\xb3\x4d\x52\x9e\x29\x77\xd5\xfc\x12\x4a\x36\xaa\xf8\x4e\x74\xa1\x1a\x42\x3a\xc5\xa2\xdb\x5d\x39\xe2\x44\x82\x00\x7e\xd6\xda\x6e\x74\xc5\xae\x3b\xe6\xde\x90\xa4\xe6\x1d\xdf\x8b\xca\xd8\xd0\xf1\xde\xf9\xcb\xc0\x87\xdc\xfa\x36\x83\xdd\x89\xb4\x35\x43\x5b\xa0\x6e\x5b\x09\xda\x2e\x58\x70\x1a\xa4\x9b\x8d\xae\x3a\xc7\xd5\x59\x0e\x4e\x43\x53\x02\x79\x58\x8c\x15\x38\x9d\xe3\xba\x84\x43\x0d\xd3\x8c\x27\x81\x60\x9a\xb0\x08\x04\x58\x6c\xe6\x01\x9b\xcc\x30\x0a\x10\x68\x58\xa8\x9a\x56\x9d\x86\x35\x26\x9d\x04\xde\xbd\x51\x8b\x34\x13\x52\xbc\x92\xa2\x86\xbe\x43\xe8\x41\x3e\x06\x2e\x95\x2b\xa0\xfc\xac\x43\xdf\xc1\x74\x1f\xca\xb5\x35\x8e\x64\xc3\xd0\xb7\x31\xdb\xca\xc0\xe0\xfe\x5b\xb0\xe1\xd6\x8a\x44\x99\xba\x36\xb5\x66\xfc\x04\x82\x20\xd6\x73\xc4\x29\x3c\xbd\x7a\xf7\x67\xe7\xfd\x7d\xf9\xd1\x4b\xe6\xd3\x2b\x77\x7d\x63\x0d\xb9\xec\xcd\xe5\x8b\x02\xfb\x00\xe9\x8c\x71\x94\xb7\x7b\x3c\x87\xf5\x5d\xa0\xc4\x54\x6e\x1c\xd5\xb5\x19\xef\x0d\xd9\x8c\x62\x2a\xb7\xeb\x2c\xc4\x5f\x67\xa2\x6f\x3f\x1c\xfc\x4e\x11\xfd\xce\x87\xd1\x7c\xca\xd8\xef\x6c\xf2\xe1\xde\x6f\xae\xdc\xf1\xbe\xfc\x5f\x97\x3f\xb0\x64\x49\xa8\x4f\x94\x77\x6f\xd7\xe9\x7e\x9f\x44\x97\xff\x46\x35\xb8\xf9\x4c\x00\x87\x3e\x8e\xea\xcb\xa0\x22\xc1\x14\xaa\xbc\x9c\x25\x89\x78\xef\x47\x40\xe4\x56\x94\x1c\xcf\x43\x5d\x04\x19\x29\x6d\x65\x44\x1e\xea\x05\x01\x4e\xb3\xb0\x02\x8b\x1c\x60\x00\x91\x87\x45\x2b\x36\xdd\x4c\xfb\x1f\x8a\x9b\x11\x61\x81\x17\xca\x4c\x8b\xe0\x58\x5e\x06\x3a\x6c\xc0\x69\xd6\x60\xab\xe5\x18\x57\xb5\xa7\x2a\xf6\x54\xd5\x59\xcb\x33\x88\x07\x98\x54\x6e\xff\x27\xce\x77\x78\xf2\x53\xd8\x1a\x0b\xd4\xdd\xa9\xdc\xe8\xff\x10\x44\x6a\xd5\x84\xe3\xab\xef\xe2\x88\x25\x6b\x90\x4f\xcb\x27\xf6\x53\x27\x07\xf7\x0c\xe7\xa2\x3b\x86\xbc\x43\xf5\xdd\xa1\x39\xcf\xed\xa3\xc9\x44\xef\x40\x0a\xf4\x75\xe3\x45\x6d\x72\xe8\xca\xe8\xa0\x17\xe6\x0c\xd7\xb2\xef\xcf\xf6\x0f\x0c\x66\xd7\xc6\xce\x6f\x4e\x6e\x22\x8f\xb4\xff\xe1\x7f\xde\xbf\x65\xcd\xc8\xad\x77\xad\x01\x8b\xb7\x5c\xf0\x3a\x79\x2d\x7b\x5c\x66\x7d\xef\xb0\x2d\xc0\x89\xbb\xc0\x5e\x92\xb7\x4b\x77\x91\x86\xa2\x83\x34\x9c\x96\x65\x51\x4c\xf3\xa2\x08\x4d\x20\xeb\x32\x4c\x53\x27\xcf\xfc\x91\xfc\xdf\x71\x78\xc2\x38\xec\xdb\xbe\x1f\x6a\xb0\x6c\x68\x22\xc8\x00\xd1\x2e\xe6\x33\x69\xda\x10\x0b\x3c\x2f\xc7\xdf\xd6\x87\xcc\x92\xa5\x19\x30\xc3\xf3\xb4\x41\x67\x40\xd9\xa8\x1a\x3a\x81\xe7\xc9\x1b\x47\x67\x08\x9b\x5e\xf6\xe2\x5d\x32\xca\x25\x77\x67\x80\x83\x79\xc4\x20\xb1\x82\x10\x66\xe3\x20\xb8\x05\x87\xa5\xc5\x9d\xd3\x01\x16\x7f\x27\x5c\x7d\x39\x76\x66\xf3\xeb\x1b\xdd\x6b\xaf\xee\x27\xbe\x7c\xc3\x6a\xed\xae\xab\x37\x9c\xf5\x31\x75\xed\xda\x5d\x6b\x1f\xda\xfe\x90\x7e\xeb\x1a\x76\xe3\x1a\x4d\xbd\x7a\xe3\x99\x97\xde\xf5\xf8\xda\x5d\x6b\xf5\xa7\x1f\x7a\xe8\xd6\xd5\x33\xe7\x5a\x72\x41\x51\x65\xc0\x5a\xc2\x14\x29\xb3\x99\x8c\x99\x37\x6d\x1e\x16\x54\x8a\x9d\xf9\x15\xf9\xc7\x09\x98\x9b\x80\x8b\x9e\x8e\x2d\x3c\xf1\x7b\x93\x6b\xcd\xc5\x77\x2a\x43\x77\x9d\x6e\xee\xdc\xb1\xf6\x44\xe5\x8b\x6b\xed\x9d\x27\xfe\xe0\xc0\x13\x1b\x06\xee\xbe\xed\x61\xf5\xf4\x8d\xa3\xa3\x4f\x9c\x78\xdb\x97\x9f\x38\xeb\x1d\x10\xd8\xa6\x19\xe4\xe3\xec\x47\xf9\x0d\x46\xdd\x5a\x2b\x71\x74\x77\xaa\x4e\xa9\x41\xfc\xe3\x4c\x44\xf5\xf3\xba\xdd\x6a\xa3\x54\x82\x42\x15\xb7\xe6\x91\xf1\xde\xf9\x73\xe6\x85\x70\xd7\x4b\x25\xba\x17\xf4\xc6\xd1\x67\x60\xb0\xb7\x2b\x3e\x77\x60\xb0\x3b\x31\xd7\xfd\xcc\x8d\x35\x62\x72\x5d\x94\xf2\x49\x93\x66\xf2\x65\x4b\x30\x18\x24\xbf\xb8\xb2\x49\xb2\x76\xc5\xff\xc0\x0a\xf7\xb9\x17\x80\x91\x86\x3a\xe0\x93\xb0\x5c\x30\x24\x58\x85\x35\x5e\x10\xa6\xd2\x95\x7a\xba\xa6\x52\xcc\x8c\x06\x35\x9e\x2d\x30\x35\x96\xe1\x25\x50\x84\x62\x51\xd3\x81\x10\x63\xca\x76\xbd\x62\x4f\x57\xec\xb2\x7a\xd3\xc3\x40\x97\x4d\x19\xb0\x92\x21\x02\x8e\xe3\x34\x9d\x33\xd2\x34\xac\x70\x26\x0b\xab\xac\xc9\xc2\xfc\xb9\xf8\xfb\xb1\x51\x57\x9f\xf8\xb9\x76\x8c\xd6\xaa\xc4\x13\x0e\x8f\xed\xfe\x19\x91\xa1\x57\x0e\x7d\xe3\x3f\x49\x6e\xd1\xb2\x09\x4f\xa7\x88\xae\x4d\x32\x8c\xee\x77\x8f\x59\x21\x9d\xa5\xa7\x72\x63\x28\xcb\x9b\xb9\x2e\xf0\x17\x9d\xf6\x4c\x2a\x37\x86\xde\x31\x8f\x6d\xf5\xe0\xba\x2f\xf7\xc6\xd0\x0d\x8e\xb1\x2d\x1e\xfc\x1c\xd4\x5e\xa5\xd7\xec\xd7\xed\x1f\x10\x0b\xfa\xef\x5f\xbe\x36\x85\x46\xf1\xde\x70\x23\xff\x71\x18\xbd\x97\x1f\xfa\x46\x30\xb6\xf7\x2e\xa4\x70\x58\x68\x4e\x22\x82\x4b\xa9\xdc\xd8\xb6\x10\x5c\x42\x70\x67\x4e\x5b\x51\x3f\xcf\x07\x32\xc4\x9b\xeb\x30\x1d\x9a\xab\x0b\xd7\x52\xb9\xe1\xee\x48\xff\x62\xc2\x74\xda\x8f\x7c\x9f\x26\x52\xd4\x18\x4a\x50\xe5\xdd\x15\x73\xfb\x99\x13\x6a\xaf\xfa\xf9\x78\xc7\x50\xcc\xc7\xfc\x09\x26\xbb\xd0\x3c\x87\x8f\x8a\xe0\x54\x70\x71\xed\xb6\x0f\xea\x31\x5d\xd3\x3a\xd7\xf1\x7d\xe9\x35\x3b\x1f\xb2\x9f\x21\x8e\x62\xbf\xbf\xe2\xa7\x01\x8e\x44\x1f\x17\xdb\xfe\x18\xea\xcb\x0a\xee\x70\x0f\xa0\x35\x7f\x1d\xb3\x59\xca\x8e\x6f\xb4\xf7\xe0\x34\x92\xa7\xc1\xd9\xb6\xe8\xf6\x33\x9c\xea\x80\x53\xc7\xde\xe6\x42\xf0\x9b\x5b\x67\x24\xc6\xa8\xbb\xe9\x35\xd6\x3f\xec\xcb\x5b\x87\x96\xae\x5e\xb1\x83\x5e\x39\x66\xcd\x21\xb8\xe7\xd0\xd9\x86\xe2\xf7\xf7\xd4\xd1\x11\xdc\x3a\x6b\x64\xfd\x35\x0e\x1f\x8e\xd1\x07\xb2\xbd\x76\x2e\x43\x7e\xb3\x3b\xeb\xe7\xbc\x39\x0b\x38\x1e\xb7\xf9\xf7\x5a\x4e\x69\x7d\x20\xf1\x5d\xea\x2b\xf4\x9a\x61\xc2\xb6\x88\xe3\x07\x37\xaf\xf8\x00\xbd\x6a\xfc\x53\xa0\xdc\x7a\xe3\x64\xed\xf4\x1f\x79\xfd\x66\x12\x26\xb5\x36\xb5\xe6\xc9\x7f\x13\x04\xb1\x91\x23\x96\x1e\x48\xad\x9c\x1c\x20\x2a\x1c\xb1\xf4\xea\x60\xaf\x95\x54\xce\x7a\x24\xb2\x17\xde\xd9\xe6\x46\x14\xb7\xde\xe8\xc7\xdf\x3e\xd6\x1a\x48\x18\xd4\xc9\xf4\xea\xa7\xd2\x87\xff\x71\xe9\xfb\x56\x54\x53\xed\xef\xd8\xd6\xb2\xc4\x37\xa9\xb5\xf4\x9a\x0d\x7f\xb4\x3f\x46\x1c\xbb\x8c\x38\xed\x18\x7a\xcd\x13\xeb\x6c\x9b\xe8\xef\xff\xf2\xb2\x41\x7a\xe5\xc6\xbb\xe6\x11\xdc\xf5\x67\x3c\x8a\xf3\xc3\xf0\xfb\x42\xfd\x73\xfe\x7b\xca\xdd\x7f\x45\xf2\xdc\xa7\x99\x4f\x22\xfc\x9c\x4a\xaf\x19\x39\x19\x5a\x2d\xc8\x7c\x78\xc5\x19\x8e\xdf\x0c\xc7\x89\x13\x98\xdf\x9c\x7a\x91\x33\x8b\x64\xc8\xf7\x1c\x46\x6f\x38\x86\xbe\x16\xf0\xb8\xf7\xf6\x6f\x72\x10\xf9\x01\xfe\x3b\xb6\x15\x68\xfd\x77\xd3\xab\x77\xff\xe5\x3d\xd9\xfe\x7f\x2c\x7f\x3e\xd5\xde\x2b\x0e\xcd\x91\x4f\xe5\x36\x40\x14\xc7\xba\x2b\x44\x5b\x7a\x40\x5b\x5f\x0d\x68\x45\x70\xed\x5e\x67\xd6\x34\x35\x54\x0a\xf9\x66\x5a\x2a\xb7\xf5\xcf\xa1\xb5\x32\xfe\x5a\x27\xb7\xb4\xd7\x8a\x6a\x7f\x39\xed\x33\x44\x82\x48\xa1\xda\x5f\xc8\x3c\x9d\xd7\x0d\xfa\xe8\x04\x4d\xc4\x7b\xe7\x13\xa9\xb9\xae\x12\x72\xa5\xb3\x63\x93\x50\x92\xd5\x94\x2d\x50\xb7\x92\x50\x87\xb2\x0c\x58\xc0\x2a\x25\x8b\xd7\x00\x21\xd0\x66\x46\x60\x61\xb1\xa1\x50\x99\x19\xae\x2b\x3f\x33\xd5\x55\x82\x75\xc8\xd0\xd0\x84\xb4\xa1\xcb\x8e\xaa\x60\xec\x52\x3e\x23\x58\xf9\x69\x8e\xe1\x25\x3c\x8e\x86\xec\x0e\xe4\x6b\xac\xf0\xf4\xea\x17\x5b\xf3\x13\x8f\x50\xc7\x11\x34\x71\x14\x91\x26\xfe\x07\xd5\x72\x42\xb6\xc5\x6c\x1b\xa2\xaf\x7b\x9e\x9b\x32\xb8\x27\x1b\xef\xeb\xa6\x41\x2f\xd1\x0d\xbc\xc7\x0d\xef\x66\x5b\x90\xd7\xae\x3f\xe7\x15\xf2\xf4\xc5\x1f\x3c\xee\xd1\x05\x8f\xd9\xb7\xc3\xe7\x6f\x83\x67\x58\x16\x29\x5b\x96\xbd\x99\xac\xda\x0c\x38\x7c\x03\xdc\x7b\x0f\xe8\x23\xc9\xd8\xcf\x9b\x27\x9c\x41\x1a\xb6\x72\xcf\x3b\x59\x17\xa4\x60\xff\x34\xf7\xc1\xa3\xe9\x07\x2f\xde\x72\xe6\x99\xd7\xc5\x5f\x69\x32\xb1\xd7\x9a\x4c\xd7\x31\xc6\x75\x36\x09\xe7\xc1\x9f\x5e\x06\xde\x0f\x36\x82\x4b\x1e\x25\x9b\xc6\xda\x0e\x06\x06\x6e\x5f\x8c\xac\x68\xdb\x17\xf8\x7b\xe7\x4d\x55\xb4\xd7\xed\xb3\x42\xef\x9d\xed\x53\x77\x84\xf4\x82\xee\xf7\xb3\xdb\x8d\x7d\xed\x0d\xf5\xa3\xa7\x72\x9b\x5e\x42\x79\xe8\xaf\x42\xbd\x3d\x83\xd9\xbe\x8e\xfc\x7f\x0f\x82\x1e\x0c\x68\x39\x54\x4f\x66\x98\x0c\xe4\xbc\x63\x9f\x07\x72\x78\xdb\x6f\x43\x76\xbb\xc3\x6b\x87\x85\xe0\x7a\x2b\x97\xd8\x44\x3d\xee\xc8\x55\xf8\x11\x62\xe9\xc9\xd7\x2f\x2f\xd3\xab\xc6\xf7\x12\xbf\x6c\xfd\x9e\xdd\xb3\xfc\xb7\xe1\xf8\xc4\x36\xf4\xca\x75\xdb\x1f\xb0\xf8\xa7\x0b\x47\xa7\x95\xdb\x7e\x1f\x9a\x83\x9c\xca\x6d\xfb\x5d\x68\x2c\xce\xf7\xb7\x5d\xbe\xde\x86\xee\x20\x10\x14\x82\x67\x28\x8b\x98\x47\x7c\x88\x58\x48\x9c\x44\x0c\x12\xa7\x78\xef\xca\x7a\xa8\x04\x46\x1e\xcb\x90\x45\x92\x75\x2b\xeb\x52\x89\xde\xf9\x3d\xd9\x81\xc1\x2c\x15\x6b\x9f\x4e\x66\x7b\x8e\x5a\xd0\x93\xed\x27\xad\x62\x9e\x21\x4b\x82\x48\xa6\x05\x41\xad\xe4\xa7\xc5\xbc\xdd\xb0\x60\x92\x99\x52\x1a\x82\xa8\x00\x83\x14\x65\xd6\x2e\x73\x3c\xa8\xc1\x3c\xa9\x92\xc9\x19\x15\x4c\xb9\x3f\x51\x56\x9e\xe7\x34\x59\x98\x91\x15\x39\x5d\x4a\xb3\xd3\x90\x01\x55\x58\xaf\x1a\x53\x64\x12\x14\x58\x46\x9b\xb2\x44\x51\x80\xe9\x7a\xbd\x6e\x1b\x75\x9e\xd3\xeb\xf5\x60\xcd\xe8\x3e\xe2\x24\xda\x8f\x91\xd7\x30\x5c\xb8\x75\x77\x90\x8d\x30\xb9\x17\x93\xad\x6e\x5e\x3d\xa4\x1b\x46\x6a\x58\x7b\x24\x3f\x46\x5e\x45\x51\x84\x1f\x63\x70\xf7\x6d\xee\xd7\xd1\x3d\x9c\x2b\x30\x38\xf2\xfb\x9d\x96\x29\x6a\xcf\xaf\xa2\xfd\xec\x40\xef\xa8\x0b\x34\xb6\x67\x65\x74\x2e\x8d\xf4\xfd\xc8\x2b\xd1\xfe\x77\xfd\x24\x34\xae\x1b\xfb\x96\x52\xb9\x5d\xe8\x3e\xc9\xc8\xcf\xb1\x7e\x4c\xac\x9f\x9f\x85\xfa\xd1\x7d\xf8\xd0\x01\x0c\xee\xe6\x69\xa8\x86\xe6\x23\xfb\x71\x82\xc2\x21\x14\x11\xdb\x1d\x9d\x8f\xd7\xbf\x7f\x17\xd5\x6c\x71\x6e\x9d\xae\x11\x34\xcf\xd1\x37\xa2\xfd\xef\x42\xf5\x17\x86\xf6\x87\xf0\xe0\xd8\x68\x57\x22\xdd\x36\x0b\x6f\x85\x9e\x59\xf8\xd1\xdb\xfd\x60\x79\xe7\xbc\x18\x97\x0b\xdf\xb7\x2b\x0a\x1f\x43\xf7\x56\x47\xea\x18\xbc\xd4\x9e\xbf\x99\xeb\x34\xcf\x14\xb5\xe5\xeb\xd1\xfd\x72\xdb\xef\x18\xc2\xe6\x53\xc4\xe0\xb5\x68\x3f\xee\xb8\x9b\xf6\x46\xc7\xdd\xfe\x9f\x08\x9d\x30\x38\x3e\x77\x7e\x7c\xd6\xbe\xc4\x42\x78\x50\x90\x9f\xe0\xd0\x0f\x7a\xf3\xbd\x63\x71\xe7\x7d\x19\x9a\x0c\xc1\x1d\xfb\x04\xc9\x82\xa1\x7d\xa1\xfe\x75\x7f\x9e\xdb\x6e\xc6\xe2\x43\x68\xdc\x8d\x77\x38\xf3\xdc\x74\x44\xb2\x23\x3e\x37\xbe\x14\xc8\x3b\xc1\xcd\x65\xe4\xea\xee\xa1\x62\x74\xfe\xee\x7c\xb6\x0d\x44\xe3\x46\x4e\xff\xf4\x2a\x13\x12\x2f\xb7\x66\x96\xf6\x70\x27\x7a\x35\x9e\x51\xee\x81\x1d\x6e\xc4\x7c\x6f\x28\x1e\xa8\xa5\x72\x4f\x21\xf9\xb4\xf1\x8e\xce\xb8\x1e\x42\xf9\x24\x89\xf7\x11\x52\xeb\xbc\xc4\x5e\xea\x0b\xc4\x7b\x91\xfe\x63\x88\xc5\xc4\x65\xc4\x55\x41\x65\xf0\x2f\x07\x59\xbc\xfb\xfa\xfb\xba\xb3\xc7\x81\x44\x9f\xff\xc0\x07\xff\x1f\xaa\xfe\xbd\xc0\xf9\xb1\x3f\xdb\x13\xef\xcf\xf6\xf8\x82\xaf\x2f\x54\x4e\xdc\xf9\x9f\x2b\xf8\x12\xbd\x03\x89\xbe\x81\xc1\x79\x54\x77\x5f\xff\xbc\x3e\xef\x1c\xda\xf9\x77\xae\x9b\x1f\x3c\xf4\x5b\x8e\xc0\x9c\x17\x2b\x98\x20\x69\xd4\xcd\x26\xaf\x6b\x99\xa9\x34\xad\xe7\xd3\x40\x80\x05\xc0\xc2\x0a\xfa\xc8\x4d\x25\x9d\x11\x75\x50\x80\x75\x94\xb2\x9f\x86\x75\xfb\xc8\x07\x8f\xfc\x20\xc8\xe5\x16\x8e\x9c\x79\xe6\xa9\x57\x1c\x77\x63\x6e\x81\xaa\xdd\x9d\x38\xf7\xc1\x8b\x16\x9e\xf9\x62\xf2\xcf\xfd\x0b\x5e\x39\xf5\xee\xbb\xdf\x56\xe1\x63\xce\xdf\xdf\x07\xfb\xc7\xc1\xb7\x96\x49\xcb\x06\x7a\xce\x3c\xf3\x7f\xbe\x09\x2f\xd9\xf7\x05\x4a\xd0\x8b\x45\x1d\x36\xd2\x19\x21\x9f\xcf\xb3\x9c\xca\xcb\x82\x2c\xa8\x40\xc9\x64\x24\x33\xc9\x97\x04\xa1\x24\x08\xb1\x7a\x7e\x05\x7b\xdf\xad\x17\xcc\x5c\x71\xd9\x65\x47\x0e\xd3\x0c\x38\x0b\xfe\x0a\x2c\x80\xbb\x9e\x19\x7c\x15\xdc\x4c\x7e\x8a\x79\xf0\x6f\xaf\x5e\x26\xdd\x0a\x2f\x7e\xfd\xf5\xd7\xed\xef\xbe\xfa\xea\xab\xff\x82\xd3\x20\x0d\x59\x49\xa0\x8d\x34\x07\xf2\xe8\xbf\xe8\xd9\x7b\x4d\xad\x97\xb0\xfd\x54\xdb\xf0\xa1\xdd\x9e\xaf\xeb\xdd\xc1\x21\x0e\x43\xaf\x98\x1d\x8f\x97\x98\x13\x3c\xbe\xf2\xf7\x27\xee\xc5\xec\xe6\x64\xbb\xb3\x72\x4c\x48\x33\x16\x9b\x89\xb1\x8d\x4a\x39\x5e\x3c\x24\xa0\x8f\x61\xcd\x94\x2c\xab\x8b\x9f\x29\xc5\x0d\x59\x64\x64\xdd\xb0\x4c\xcb\x34\x6d\x41\x96\xc9\x22\x14\x40\xda\xf3\xbb\x62\x12\xa5\xa6\xa8\x03\x13\x81\x1f\xe6\x9e\x45\xa3\xca\xb0\xfb\xf1\x5c\x7e\xa2\x33\xd7\xbd\xcb\x10\xed\x7d\x06\xb3\x1b\xdd\x1c\x71\xff\xeb\xc0\xf7\xa2\x98\x18\xca\x59\x84\xf2\xff\x13\x31\xe2\x83\x1e\xf5\xb1\xe8\x05\xa9\x63\x58\xf5\xb9\x74\xd0\x77\xf2\x40\xbf\x5f\x2a\x7b\x1e\x09\x7a\x89\x39\xf3\xc0\xbb\x2e\x33\xf6\xb0\x63\x48\x7d\xa6\x60\x00\x35\x9f\xcf\x9b\x49\xd1\x54\xb9\x5a\x12\x9a\x0a\xe0\x92\x56\x53\x02\xf9\x4c\xde\x62\x33\x20\x6f\x13\x02\x29\xdb\x26\xfa\x28\x26\xac\x5a\x16\x60\x60\xb5\xeb\x4f\xc6\x5a\xa0\x43\x75\x86\xe7\x85\x6a\xbe\x61\xf0\x72\x17\xdf\x94\x9c\xdf\xe6\x63\x02\xe0\x24\x81\x55\x54\xd3\x32\x2c\xc3\x0a\x30\x94\x09\x64\x0d\x55\x47\xf6\x15\xaa\x70\x77\xe0\x17\x21\x1d\x29\xa7\x72\x7b\x51\x8d\xb0\xbd\xb9\x50\x3c\xd0\xd9\x57\x54\xa7\x78\xe4\xda\x90\x4c\xf7\x70\x9b\xa2\x76\x4b\x98\x0e\x43\x31\xf8\x11\xe4\x77\xaf\xff\x0c\xd6\x0f\xba\x7b\x76\x20\x89\xce\xae\x1e\xc4\x7c\x65\x6c\x8f\x26\xbe\x13\x8a\x4f\x06\xed\x83\x77\x5b\x41\x3c\xd3\x6d\x3f\x59\x09\xf9\xdc\xaa\x5b\x97\x95\x46\x14\xd0\xa9\xff\xe0\x5d\x5b\xf0\x76\x7f\x04\xd5\x04\x3a\x90\xc4\xda\xa3\x79\x8e\x2a\x91\x7e\xbc\xba\xcc\x6e\x3f\x7b\x3e\x17\xea\xe7\xee\xd4\xea\xd1\x4f\x12\xa7\x71\xc4\xb2\xcf\xa7\xa8\xc9\xc5\xd8\x77\x82\xbf\x06\x9a\x9a\x78\xa9\xf3\x1a\xf6\x2c\x8c\xce\xd5\xad\x45\x1b\x5a\x43\x09\x6b\xbf\x28\xb4\x37\x01\x8e\x36\xfb\x77\xb4\xab\x2d\x2e\xc1\x38\x32\xf7\x82\x61\x77\x2f\x3f\x77\x55\x38\x1e\x85\xe6\x93\xdb\x67\x13\xf8\xdd\x74\xde\x3d\x73\x70\xe9\x62\xef\x95\xd8\xd8\x7a\x7b\xec\x91\xa7\x31\xb8\x5b\x73\xe6\xfe\xd0\x5c\x43\x73\xa2\xdb\xef\xcf\x14\x54\xf3\x53\x4b\xa1\x6a\x9f\xa9\xdc\x46\x37\xb3\xdd\x26\x8c\x66\xf4\x80\x26\xdf\x01\x4f\x41\xed\x4d\x29\x78\x9f\xeb\xce\xe9\xea\x90\xbd\xe5\xcc\xe9\x55\xd4\x0f\x8e\x3f\x05\x6b\x7f\x6b\xc8\xde\x0a\x78\x61\xe2\x4e\x6c\x0d\x56\x7b\x0d\x41\x8d\x50\xb9\x75\x46\xe2\x09\xea\xf6\x54\x6e\xb2\x8f\x98\xa1\x57\x4d\xa6\x89\x87\x08\xe2\x14\x81\x0b\xd1\xf7\x64\x1f\xea\x4b\xc1\xd6\x6d\xf8\x63\xd0\xd4\xba\xd3\xb0\x31\xb6\x51\x2a\xbd\xfa\xa0\xf8\xa5\xb7\xce\x78\x00\x65\x87\x4e\x12\xb8\x2f\x18\x8c\xbf\xf9\xe1\x4e\x3c\x41\x53\x93\x4f\x45\xe7\x3b\xf9\x2b\x02\xef\x47\xf1\x63\x1c\xde\xfa\x9a\xd1\x3d\xda\xbd\x73\x16\xed\x63\xf8\xde\x5d\xc0\xfa\x51\xda\x78\x0a\xde\x02\x06\x32\x60\xf7\x48\x84\x5e\x59\x9c\xe7\x76\x8f\x86\xe4\x6e\x40\xaf\x4f\x36\x3b\xf3\xe8\xf8\x6e\x0c\x8e\x74\xca\xc4\xaa\x59\x34\x86\xe4\xf4\x96\x35\xb3\xd6\x5b\x6c\xe3\x7a\xd3\x37\xb1\xf6\xc8\xae\x73\xf1\x36\x7a\x45\x67\x3a\x9a\xe8\x8e\xe2\xf3\xe9\xdf\x45\xf0\xc3\x25\x76\xb5\x65\xde\xc1\xc1\x8b\xeb\x18\xef\x04\x76\xfb\xc6\x4f\x47\xf1\xec\xd0\x04\x4d\xed\xfa\x4a\xe7\xf5\xee\x2a\x74\x86\x07\x75\x26\x9d\x7e\x46\x1c\x5a\x39\x90\x8c\x13\xcb\x8e\xe5\x08\x7a\xe5\x44\x6d\x19\xb1\x7c\x4f\xf0\x16\xe5\xf4\xc4\x6e\xf7\xfb\x2e\x62\x99\x89\x72\x5f\x7c\x20\x37\xb3\xe2\x16\xee\xc4\x4e\xfb\x1a\xd4\x97\x94\xc2\xf5\x25\x31\xfc\xfa\x77\xb8\x5c\x7c\x1d\x1f\xc2\x63\xb0\x7f\xd6\x2d\x21\x19\x18\xd4\xee\x0a\xc9\x3f\x37\xd7\x52\x0f\xca\x9b\xa5\xa0\xdd\xea\xc3\xec\xbc\xe0\x5d\x52\x30\x36\xdb\xe2\xdd\xb3\xda\x03\xc9\xaa\x83\xe3\x2b\x99\x88\xbc\xde\x33\x9b\x66\x71\xfd\xc1\x47\xe5\xbb\xbb\x86\x03\xaf\x63\x70\xd5\x9f\x13\x9d\x7b\x1a\xe5\xe9\xdc\xc4\x61\xbf\x13\xd0\xc9\xc1\x25\x51\xdd\xe2\xc9\x8f\xfd\x21\x7e\x09\x74\xc2\x93\xff\x0d\xf1\x5d\xc0\x2f\x4f\xbf\xaf\xb3\x1c\x9a\xa0\x3b\xaf\x61\xff\xc1\xce\xf4\x39\xb6\x22\xc4\x17\x01\x7c\xf4\x63\x18\x5c\xc4\xe0\x97\x47\xfd\x08\x4f\x67\xf6\x76\xde\xcf\x5d\x3f\xeb\x3c\xcf\x1d\x31\x8c\x2e\x4a\x6d\x19\xf7\xb8\xde\x59\x0f\x4d\xac\xc4\xfa\x91\xdb\xfd\x1c\xf4\xf7\x4c\xf7\xf7\x7e\x0c\xd5\x35\x5a\xf7\x50\x94\xaf\x5d\xfc\xaf\x5b\x1e\xda\xb3\x80\x8f\x46\x71\xbe\x46\xf7\x4b\xc6\xce\x9f\x45\x13\xd8\x7e\x15\x90\xdf\x8a\x72\x65\x9d\x92\xf8\x99\x97\x0f\xa4\x07\x9d\x37\x2e\xf1\x2a\x73\x5d\x4c\x5c\xe6\x66\x04\x19\xcc\xf6\x64\xc1\x11\x20\xd1\x4b\xf8\x67\x52\xa0\x8f\x4e\xa0\x63\xa9\x01\x2f\xc0\x76\x54\x9f\x63\xef\xa3\x3c\x01\x24\x75\x02\x38\xbe\xf7\xf8\x7e\xd0\xf7\xae\xa6\xde\x45\xeb\xd7\x7f\x2a\x56\x69\xb2\xe0\x95\x9b\x6e\xbe\xfe\x33\xe0\xfa\x81\x4d\x73\x7b\x7f\xfb\x8b\x2f\x7d\xcd\xfe\xac\x91\x17\xca\xb2\xc5\xe7\x01\x63\x18\x80\x35\xe8\x24\xcd\x25\x93\xc9\xa4\x4e\xf3\x46\x9e\x49\xf3\x87\x16\xd7\xd3\x79\x8b\xc9\x00\xda\x16\x38\x32\x6f\xd7\xd0\x87\x35\x5b\x84\x69\x02\xa2\x45\x50\x57\x35\xb7\x3c\x65\x82\xd7\x1f\xbe\xfe\xfc\x9b\x01\x01\x06\x8e\xbb\xe9\xea\xe9\x9b\x6f\xbe\x19\x3e\x06\x39\xa5\x2c\x6b\x82\x25\x03\x0d\xe5\x8b\xb1\xf8\x64\x92\x4e\xd6\x58\xd8\xe0\x68\x23\xbe\xee\x5d\xec\xc3\x3b\x83\xba\x7a\xaf\xa2\x9a\xdd\xe3\xf0\x7c\x6c\x6f\x02\x7e\xda\xbb\xd0\xb3\x8d\xc5\x16\x93\x38\x48\x69\xc4\x22\x62\x31\xb1\x9c\x38\x9d\x58\x49\x9c\x4f\x5c\xe4\x47\x94\x8e\x22\x13\x59\x22\xd6\xe7\xe6\x36\x40\x07\x7c\x3d\x59\x74\x65\x7d\x4e\xd6\x3b\xee\x73\x93\x57\xf5\xce\x5f\x70\xf4\xdc\x81\xc1\x77\xb3\x98\xfb\xb3\xe0\xcd\x6d\xc7\x64\xc0\xf6\x1f\x68\xb1\xd3\xe1\x6b\x9a\x95\xa4\xc9\x0f\x8b\x63\xdb\xea\xc2\xb7\xcc\xe6\x82\xd2\x6f\x39\xf2\x3a\x13\x3e\x2b\x7e\xf4\x42\x51\xcc\x64\x24\x5e\x12\xae\xe5\x24\x00\x62\x3f\x3c\x4d\x50\xb9\x43\x6f\x92\xd7\x1f\x99\x79\x74\xd1\x5c\xf2\x63\x87\xb6\xaf\xe8\x9a\x9e\x49\xbb\x9f\xcd\xcd\xa5\x9b\x37\xc7\xbe\xd7\x5c\x4a\x69\x1f\x5c\xdc\xff\xe0\x02\x38\x7a\x1d\x48\x80\xfd\xb9\x05\xda\x81\xf5\x9b\x2f\x5e\x7f\x8e\xfa\xc9\xfe\xdb\x4e\x7d\xec\x51\xf0\xed\xc5\x67\x5e\x7b\xce\xa9\x1f\x9c\x7b\xc6\x39\x9f\xbc\xe2\x9c\x85\x9f\xdc\x99\xb8\xef\xba\xdb\x14\xf8\xde\xfe\x8f\xf4\xaf\xba\xe0\x1e\xf1\x1e\xf1\x8b\x22\x5c\x70\xc1\x4a\xf0\x53\xd8\x78\x24\x2c\x6f\xdd\x7a\xa7\x11\x5b\x34\xe0\xc3\x5d\x77\x87\xfc\x7f\x84\xdb\x24\x91\xa2\x0a\x93\x53\x11\xdb\xdb\xc5\xf9\x38\x7c\x07\x7d\x19\xce\x8d\xa8\xfb\xed\xf7\x3f\xdd\xd9\x9e\x29\x6c\xc6\xe0\x3c\xd2\xa3\xd7\x13\x61\xfb\x23\x24\x3b\xd7\xcd\xed\x0c\x1f\xfb\x62\x48\x4e\x69\xa9\x5c\x61\xcd\x2c\x3d\xad\x61\xed\x07\xa3\xf2\x62\xd7\xb9\x21\xbe\x8d\xf4\x5f\xc8\x60\x72\xc7\xb5\xc9\x2f\xec\x6c\xab\xef\xff\x42\x68\x5c\x07\x9f\x5f\x0b\xec\x80\x95\xe3\xf7\x5d\x47\x2c\xb3\x90\xf1\x48\x79\xf5\xc5\x74\xe2\x04\xe2\x24\xa2\x9f\x58\x82\xf2\x3d\xb5\xe3\x9f\x3d\x2e\x5d\x66\xdd\x87\x45\x3d\x59\x3f\x86\x40\xc7\x7a\x07\x52\xfd\xe8\x66\x79\xc2\x8b\x83\xba\x44\x8a\x13\x68\x8c\x90\xd3\x19\x52\xe3\x38\x92\x85\x15\x36\xaf\xf1\x0a\xe4\x24\x5d\xe2\x58\x38\x4d\x1a\x9c\xc1\xe6\x49\xe5\x90\x50\x31\x14\x21\x9f\xe1\x81\x24\x92\x53\x3c\x63\x9b\x42\xba\xab\x3e\x43\x27\x11\x41\x56\xcd\xa6\x6c\x9a\x31\xb3\x29\x53\xba\x98\x4e\x2b\x02\x6b\xb0\x0c\x2f\x8a\x92\x20\x65\x98\x92\xcc\xf0\x82\x3e\x05\x59\x58\x14\xab\x80\x9f\x22\x39\x3a\xa9\xaa\x16\xcb\x31\xb6\xa1\x09\xba\x08\x69\x49\x02\x75\x38\x6d\x46\x7c\x8f\x5d\xc7\xce\xc2\x19\xf6\x1e\x33\xa4\xf3\x31\x1a\xd9\xa5\x75\xb2\x5f\x53\xd4\x86\xe1\xa8\x4c\x2e\x3c\x18\xa2\x9d\xa8\xce\xfa\x7b\x67\x5b\x74\xdf\xca\x10\xdc\x99\x0f\x3a\x73\x1d\xd9\x84\xf5\x8f\x74\xcd\xd8\xd3\xb3\x6c\x30\x34\xee\xc6\xdb\x66\xf9\x67\xd8\xb8\xe3\xb5\x4e\x3a\x8e\xa6\xc6\x2e\x89\xd2\xda\xe8\xcc\x2c\x1a\x74\xef\xb3\x22\x5d\x73\xe0\x60\x27\xda\x4c\x51\x05\x74\xe7\xd8\xbb\xf7\x50\xa0\x34\x22\x4e\xbc\x97\xc8\xa2\x88\x7a\x3f\xca\x22\xe6\xd7\xd1\x6e\x57\xd3\x46\xaf\xca\x5d\xda\x72\x9f\x95\xfb\xe2\xce\x81\xc5\x3a\x08\xbc\x58\x55\xe1\x34\x4e\x86\xba\xc2\xe9\x9c\xdc\x25\x96\x04\x11\x18\x50\x2f\x83\x24\x2f\x4b\x87\xa6\x64\x5e\x02\x84\x05\xad\x2e\x59\x6a\x5a\xa0\x94\xc9\x5b\x4c\x1a\xe8\xb2\x60\xeb\xc2\x94\x43\x53\xe8\xd3\xb0\x9a\x8c\x65\xc5\xaa\x4d\x86\xd2\x14\x95\x57\x65\x5e\xd1\x04\x4d\x11\x58\x53\x35\xa6\x25\x83\xe1\xf8\xbc\x6a\x54\x0d\xd3\x6e\x70\x0c\x2b\x88\x92\xa6\xc1\x8a\x2a\xaa\x12\x4c\x8a\x22\x68\xc0\x69\xa3\xed\x77\x38\xfc\x3d\x13\x8a\x1b\x87\x75\x42\x6e\x0f\xba\xa5\xb4\xa7\xb7\x13\x2f\xef\xc9\x75\xe6\xf1\x3d\xf8\x7e\xbc\x42\xdd\xed\xe1\x7d\xe5\x64\x99\x8f\x2f\xef\x5a\xf1\x72\xb0\xb7\x85\xb6\xdc\xdc\xbf\xb6\x93\x5f\x9c\xa2\xf6\xdf\x17\x92\x77\x81\x8d\xb7\x07\xdd\xb6\xda\x5f\x0e\xd3\xe7\xc6\xb0\x7f\xaf\xfa\x32\x78\x27\x7a\x67\xb4\xee\x81\x4e\x7d\xa5\x28\xeb\x63\x51\x3a\xd9\xe7\xc6\xb4\x5f\xc5\xe8\xd9\x6a\xfb\x20\x1b\x8e\xc0\xf8\x4b\x0d\xe8\x27\xa7\x7f\x04\x59\x5c\x8c\xf7\x9d\x97\x8b\xdd\xa5\x39\xf3\x8a\xa8\x3f\x36\x0a\x66\xe9\x11\xa1\x8d\x8f\x11\xbd\x93\x9c\x4f\x51\x23\x5f\x09\xe6\xe4\xdd\xb9\x76\x79\x6f\xf2\x8d\x10\x8f\xe9\xbe\x3d\xb7\xe1\x7d\xef\x10\x33\xd9\x85\xe1\xc8\xb3\xe7\xd2\x44\x2a\xb1\xe1\x44\xb2\xde\xaa\x7b\xe7\x0a\xe5\xf6\xfc\x0b\xcf\x75\xdc\x07\x6a\xf8\xd1\x4e\xbc\x1a\xb9\x63\x85\xd1\xc6\xfa\x4d\x51\x78\x71\xe5\xbb\xe9\x8b\xc9\x89\xce\xf6\x71\x50\xf7\x38\xd0\xbf\x7b\x8e\x9b\x85\x4f\x8c\xbe\x46\xef\x0f\xf5\xaf\xa5\x7a\x37\xde\x1e\x43\x59\x3d\x36\xde\x1e\x89\x1b\x94\x42\x32\x4b\x41\xf8\x6c\xc7\xbe\x9e\xea\xac\xf7\x47\x9e\xed\x3c\xff\xe1\xcb\xb1\xf6\x58\x6c\x6d\xf2\x9a\x4e\x76\x79\x8a\xda\xa9\x75\x9e\xff\x4e\x0b\x8b\x6f\xbc\x8c\xc9\xee\x6f\x2f\x89\xc8\x56\x77\xdc\x27\xfd\x1c\x0f\x7d\xad\x13\x13\xa3\xd4\x17\xe9\x35\x9b\xef\x21\x5e\x69\xfd\x69\xe9\x7d\x1c\x43\xaf\x3c\x90\x7c\x09\x2c\x9f\xc3\x7d\x3c\x90\xd5\xba\x6f\xa7\xec\xfc\x55\x1d\x8f\xa3\x04\xf4\xb5\xee\xab\x18\xcd\x63\xb1\xa0\xa0\x66\xa7\x1c\xe4\x16\x42\x74\xb7\xee\xeb\x11\x7c\xbb\x74\x94\x1b\xfe\x3d\x92\xe4\x52\x27\xdf\x6c\xc7\x9b\x51\x5f\x6b\xf3\x8f\x66\xe9\x0f\x4c\xee\xaf\xfb\x67\x67\x9c\xef\xbc\x1c\xf3\x85\xb1\x7a\x98\x01\x6d\x14\x90\xbd\xc0\xa7\x72\x13\x4f\x38\xf0\xa1\x89\x59\xb1\x8c\x44\x67\x7f\xd4\x7d\x97\x1b\xf4\x23\xa2\x18\x32\xa2\x8d\x69\xc7\xaf\x7d\x96\x8e\xd8\x30\x9e\x6f\x7e\x5e\xd4\x77\x5e\x8f\x72\x8e\xee\xeb\x09\xad\x57\xf7\x69\xcc\xba\x11\xe9\xa1\xc3\xbc\xf3\xde\x76\xcd\xe1\x41\xe2\x14\x62\x05\xf2\x6d\x66\xd7\x1c\x9e\x8b\xab\xa1\x48\xcd\x61\xf4\x8d\xab\x98\xe2\x11\x9d\x34\x37\xdb\x9f\x35\x00\x6b\xc6\x38\xc3\x3d\xca\x80\x52\xa9\x21\xe8\xea\x4c\x5e\x56\x25\x40\x1b\x50\xf3\x4a\x0d\x73\xcd\x72\xf0\x51\x04\xd6\x16\x58\x01\x14\xe8\xb4\x91\xa1\x6d\xb1\xcb\x98\x51\x9c\x4f\x3c\x69\xce\x94\x4c\xb3\x8b\x9f\x29\x51\x8c\x20\x08\x82\x0a\x93\xaa\xc5\x9b\xac\xc0\xb3\x9a\xa2\xab\xa0\x21\x8a\xb0\x26\xc2\x9a\x04\x4d\x9e\xe7\x79\x26\x9f\x61\xb9\xa2\xcc\xc9\x02\x34\x59\x16\xc8\x15\xb1\x4d\x7b\xee\x1b\xe5\xdf\x45\x78\x31\xf4\x6e\x3a\x44\x17\xee\xdb\x97\x55\x11\x59\xc2\xe1\xb6\xf3\xe4\x4d\x18\xbe\xb5\x36\x0f\xed\x3c\xa9\xb3\x8c\xdc\x32\x36\x4b\xfe\x7f\x60\xd6\xb8\x66\xbb\xff\xf1\x76\xce\x81\x7c\x62\x32\xa0\xc7\x95\x5b\x7f\xd4\xf7\xc6\x8a\x8f\x9c\x76\x54\x27\x1d\x33\x3c\xe2\xf9\xb1\x6e\xbe\xf6\x9b\x88\x18\x91\x22\xde\x4f\x7c\x90\x38\x9e\x58\x88\xef\xb7\xeb\xa7\xf6\xb8\xb7\x09\xdd\x33\x09\xd0\x77\x14\x95\xe8\x5d\x0e\x62\xd9\x6e\x94\x7e\x6a\x01\x9e\x4c\xf0\x9d\x9c\x2e\x67\xbf\xbb\x1e\x35\x0c\x20\x19\x2c\x97\x49\x6a\x49\xc1\x50\x05\x5b\x30\x05\x4d\x96\xb8\xd3\x63\xb5\x66\x7e\x94\x1c\xb2\xef\x84\x37\xea\xbc\x64\x08\xa2\x08\xf2\xf0\x95\x18\x4b\xa7\xcd\x34\x1d\xd3\x1b\x85\x5a\xdc\x3a\x24\xc5\xcd\x43\x72\xbc\x60\xcc\x28\xa6\x89\x76\x7e\x14\x4a\xc0\x9a\xe2\xd2\x72\xde\x10\x78\x11\x24\xcb\x65\x4e\x61\x74\x72\x25\x94\x35\x63\x6b\x5e\x55\xec\x12\x28\x09\xac\x51\xb1\xbb\x18\x26\xc3\x71\x0a\x2f\xf1\x12\x0f\x8b\x2c\x0b\x84\xa2\xe0\xe3\xbd\xdc\xc6\xfb\x53\x67\x74\xb6\x3b\x77\xfe\x30\xc4\xd7\x46\x2a\xb7\xff\x73\xb3\x7c\x13\xa4\x9b\xd6\xfd\x2d\xc4\x5f\x81\x1d\xbc\x17\x59\x33\x93\x7d\x58\xfb\x32\x26\x37\xd2\x9d\x7d\xae\x9d\x1f\xe8\x14\x13\xc1\xde\xb0\x2b\xfe\xb8\x2e\xff\x6e\x7e\x3d\x34\x9f\x76\x3f\x37\x60\x74\x5c\x68\xb7\xdf\x90\x08\xd1\x6b\xd0\x7f\xf0\x56\x37\x1c\xe3\xa7\xb6\xb5\x63\x3d\xac\x77\x7e\xe1\xfa\x86\x4f\xbd\x83\x4f\x57\xef\x3c\xff\xed\x2f\x44\xe5\x92\xab\xeb\x87\x76\x85\x7c\xd8\x40\xf7\xed\xc8\x62\x70\xa5\x6d\xf7\xef\xc8\x85\x74\x56\xdb\x4f\x78\x35\x3a\xae\xab\x1b\x9e\xfe\x6b\x7d\x1a\xf3\x37\x02\xfc\x04\x6f\xa5\xa5\x70\x2d\xd5\xd0\xfe\x22\x5b\xc5\x7d\xff\x1a\x89\x89\x6f\xf7\xe6\xb9\x6a\xc3\x00\xb1\xb7\x55\x5f\x3a\x79\xfa\x60\xe0\xaf\xea\xfe\xda\xd6\x5f\x1d\xb5\x73\x5d\xf8\xc8\x47\x3d\xdb\x5f\x69\x5d\x94\x30\x29\x19\x65\x9a\xfa\x10\xb1\x10\xf9\x93\x97\xa3\x9c\x16\x73\xe3\x88\x95\xdc\x90\x07\xe2\x33\x37\x4b\x7a\xbc\x77\x3e\xfe\xfe\x7f\x36\xbf\x81\xec\x40\x7f\x1f\xca\xdd\xdd\x73\xd4\xd1\x18\x03\xa3\xdb\xc0\x03\x83\x59\xd7\xab\x88\x15\x4e\x87\x2f\x81\x93\xe0\x4b\xbb\xbf\x74\xe5\xa7\x3e\xb5\xf3\x9e\xef\x7d\xe2\xef\x0f\xc3\x67\xc0\xed\x70\x7a\x29\x78\x12\x14\xd9\x0c\x69\xbf\x7d\x1e\xf9\xb7\x74\xc6\xfe\x5a\xfc\x85\x43\xa7\xa2\xcf\x93\xe6\xcc\x01\xd3\xec\x3a\x77\xe6\x00\x79\x31\x98\xdf\xfd\x40\x12\x7c\x0d\xfe\x95\x3e\xfe\xf4\xe3\x93\x5f\x3e\xe6\x92\x07\xee\x38\xe3\xe4\xa5\xf0\x8d\x73\x5e\x5e\x0a\xff\x43\x7e\xf2\xfa\x73\xae\x3f\xe7\x7a\x4a\xfe\xec\x09\xf7\x7f\xf6\x88\x4b\x2f\xbd\xe9\x82\xd3\x9a\x20\xfd\x85\x1b\x6e\xba\xfd\x0b\x9f\xbd\xe9\xd8\x7b\xfe\xc7\x3e\xa5\xff\xac\x2f\x7c\x21\x97\x83\x7f\xbf\xf1\xcc\x4f\x9f\x09\x9f\x5c\xb8\x10\xdc\xf4\xe3\x8b\xe3\x1f\xbc\x6e\xe3\xe3\x37\xde\xfd\xaf\x6c\xfa\xa4\xdb\x4e\xda\x7e\xe1\x69\xd7\x82\xf7\xc1\xff\xfb\xc2\xdd\xd7\x3e\x07\xee\x58\xb2\xe4\xda\x8f\x9e\x46\x44\xe3\xc1\xd8\xdb\xe3\x20\xce\xe1\xd1\xd4\x38\x46\xe3\x6e\xce\xc5\xd1\x59\x76\x1f\x66\xbf\x1c\xf8\x4b\xd4\x7e\xf0\x68\xf6\xf6\xce\x34\xbe\x63\x7b\x54\x26\xbb\xe3\x1e\x1c\x88\xd2\xf8\x8e\xbe\x59\x32\x00\xe7\x89\xe2\x3b\xc4\x63\x6e\x0c\xc9\x8c\x60\xbd\x63\xb7\xbe\x83\x0d\x32\x83\xd9\xe9\x37\x62\xbc\xf2\xfe\x6f\xb7\xf1\x80\xad\x77\xac\x16\xe2\x21\x3d\x18\x77\xbc\xb3\x6c\x38\xf8\x1c\x46\xfb\xc8\x2e\xde\x71\xb8\x7f\xfa\xd6\x49\x66\x6c\xfe\x75\x00\xcf\xe0\x36\xd4\x3e\x3a\x8a\x7f\x17\x6f\x28\xcc\xd4\xd6\x95\x81\x0c\x08\xde\xb5\x2b\xc8\x56\x0a\xe0\x41\x8d\xdf\x6b\x5a\x7c\xe2\x06\x74\x6e\x31\x91\x24\x96\xde\xc0\x11\xf4\xca\x91\xf3\x8f\x27\x96\x2d\xe2\x70\xfb\x51\xf3\xeb\x0f\x0e\x8d\x61\xb2\x4c\x6d\xcf\xcb\xbc\x29\x14\x93\x70\x6c\xa6\xab\x42\xfb\x26\xf9\x6f\x94\xd7\x3d\x84\xfa\x69\xe7\xfe\x62\x13\x96\x63\xdb\xad\xd3\x11\x7c\x34\xb4\x6f\xba\xef\x47\x1d\xec\xca\xb4\xe1\x95\xf6\xba\xb7\xed\x8d\xda\x14\xeb\x3f\xde\x99\x5e\xb6\xdd\x1b\xa2\x5f\xc3\xb7\xf9\xb6\x1e\xee\xd8\xb9\x3b\xd1\x8b\xb8\x9d\x4b\xc3\xbc\xb0\xef\x28\x74\x46\x3b\xc7\xd7\x4e\xb3\xed\x69\xac\xbe\x27\x6e\x37\x53\xeb\xaf\x0c\xe9\xb2\x00\x3e\xf2\x4f\x0c\xee\xbe\x19\x76\xd7\x71\x65\x94\xdf\xd6\x5f\x31\x8b\xdf\xdc\x39\xbd\x8a\xe6\xf4\x73\xff\x5b\x7c\x6c\x97\xc6\x83\xf7\xe2\xed\x33\x49\x77\x6c\x0d\x83\x6b\x6d\x39\x6e\xd5\xb1\xb1\xb5\x76\xfb\xa1\x91\x10\x2d\xb7\xcf\xee\xde\xd7\x99\x17\xb7\xcd\xca\x05\xe3\xad\xed\x02\x22\xc2\x43\x2e\x7c\x2c\x1b\xc5\x9d\x1b\x2b\x58\xef\x66\xe0\xdf\x19\xf0\x97\xde\xf6\xab\xb6\x2f\xeb\xc4\xbf\x29\xca\xfa\x49\x67\xbe\xb6\xac\xce\xf0\xcd\xbf\x8c\xce\x75\xfd\xe5\x1d\xf0\x1d\xcc\x75\xbd\xd8\xb9\x9f\xe0\x6d\xb6\xec\xd7\x18\xf3\xda\x5f\x16\xf5\x8d\x36\xa2\x1c\xe0\x45\x94\x35\x67\x68\x47\xa7\x7d\xc0\xea\x5c\x72\xb8\xae\x73\x6b\x12\x12\x87\x11\xd7\xb5\x4e\x4c\x7c\x8d\xba\x1b\xdd\x41\xce\x44\x62\xfd\xd9\xee\x76\xd6\xc4\x58\xb6\xcb\x4b\x9b\x38\x88\x15\xa4\x68\x3b\x20\x5e\x11\x92\x6c\x5b\x0d\x76\x72\x33\xc0\x8d\x71\xc6\x56\xf2\x4c\xac\x0a\x85\x02\xe0\x78\xa8\xd7\x60\x12\x36\x60\x41\x06\x74\x19\x4a\xa4\x28\xc3\xb4\xd5\x45\x34\x09\xe7\x03\xef\x04\xb5\x02\x99\x44\x55\xf0\x2d\xbb\x51\x80\xf9\xd8\x50\xcf\x11\xe4\x92\x43\x7f\x25\x57\x1c\x91\x80\x2b\xba\xee\x9e\x79\x10\x7d\x1e\x7c\xa4\x79\xef\x03\x0f\xc4\xbe\xd8\xbc\x37\xbe\x1a\xe6\x3e\x34\xef\x33\xe6\xc0\x17\xcf\x05\xf1\xca\x3d\x77\x5c\xf4\xb9\xcf\x9c\x0b\x8e\xb9\x18\x5e\x04\x6a\x97\x5c\x72\xc9\x25\x77\x9d\x77\xde\x25\x97\xd8\xef\x63\x16\x29\xca\xdc\xf4\xeb\x22\x7f\x19\x0f\x7f\x98\x67\xc0\xf2\x67\xa5\xf0\xfe\xec\xbb\x75\xd6\xbe\x29\x6d\x9c\x1e\x78\x6f\x67\x7d\x35\x29\x46\x79\xc1\x8d\x2d\x0d\x3d\xd2\x99\xe6\xb7\x1e\x11\xe5\x67\x6f\xcf\x88\x59\xfc\x89\xf2\x1b\xb8\x9c\x38\xf4\x74\x20\x2b\x31\x5d\x10\xe4\x1e\x08\x6a\x6c\x8d\xdf\x80\x62\x0c\x7d\x9d\x69\x6c\x7b\x2a\x6a\x17\xbb\x34\x3f\x7c\x69\x68\xcd\xed\xfb\x1e\x74\x48\xc6\x04\x7c\x18\xaa\x79\x89\xf8\x6d\x3b\xe2\xb7\xed\xe8\x46\xee\xf6\xa3\xc2\xeb\x76\xcf\x8b\x1f\x45\x95\xe6\x0e\x7e\xa6\xe3\xbc\xe6\x44\x75\x35\xa2\x71\x6a\xdd\x2f\x43\xf2\x24\xe0\xeb\xad\xe8\x94\x79\x68\x7b\xb0\x76\x8c\xf6\x0b\x8f\x62\x3e\x7a\x91\x92\x53\xb9\xe1\x03\xa8\xf5\xac\x9a\x88\xde\x5a\x70\x9f\x11\xd9\xd4\xa8\x52\xf7\xea\xfd\xf1\x1b\x88\x53\xd6\x72\x44\x0a\x97\xd7\x6d\xff\x2d\xe7\xac\x84\xa6\x86\xac\x4e\x72\xf3\xe0\x7b\x66\xf1\x7e\x6d\x96\x2e\x31\xdb\x71\xc8\x2d\xa7\x84\xec\xeb\x20\xf6\xb2\x65\x6d\x54\xb6\x78\xd4\xb0\xf5\x1d\x6c\xd9\x2f\x85\xf6\xab\x1d\xab\xd9\x1f\xa5\xc5\xd0\x1a\xb6\x60\xb8\x6f\xd3\xf5\x2b\x9d\x68\x85\xa6\x36\x7e\x3e\x44\x2b\x41\x5f\xeb\x1e\x44\x7d\x6d\x8e\xd0\x30\x9a\xef\xb6\x76\xae\xbe\x15\x09\x83\x32\xe9\x35\x85\x19\xe2\x77\xad\x7f\x9e\x3a\x78\xca\x9a\x14\x75\xe0\x98\xb0\x1d\x60\x5e\x37\xcb\x97\xc7\xd6\x3e\xfe\xeb\x10\x0e\x03\xbd\x57\x58\x17\xc5\x89\x47\xc3\xd3\x9d\x75\xcc\xfe\x57\x3a\xeb\xdb\x8d\xb7\x76\x96\x9d\x41\xee\x88\x88\xdd\x3b\xfc\x4c\xe7\x79\x0e\x1f\x8c\xca\x73\x2f\x0e\x7a\x51\xb4\x9f\x03\x37\x47\x7c\xd6\xd0\x3e\x6c\x7e\xa1\x33\x2f\x6f\x7d\xae\x33\x0d\x0c\x97\xa2\x34\x33\xc1\xcd\x92\x6b\x98\xef\x3b\x79\x69\xa7\x7e\x52\xd4\x81\xff\xeb\xdc\x7e\xe4\xde\x50\x7b\x33\xa0\x3d\xff\xdc\x72\x8d\x6b\x7f\xd2\xab\x0f\x24\xc9\xc3\x96\x3f\xba\xe2\xe9\x14\xb5\xe9\x92\xd0\xef\x04\x32\x61\x62\x12\x79\x85\xc5\x4e\x7a\x6f\xcb\x1b\x21\x3b\x26\xf8\x9d\x27\x1e\x77\x7e\xa7\x78\x02\xfa\x4e\xf5\xf3\x3c\xe0\xf2\x67\xe8\x29\x8f\xff\xbd\xfd\xd8\xee\xee\xc7\xb3\xa1\x7d\x0a\xc6\x09\x6a\xf3\x45\x64\x6b\x90\x4b\x42\xf1\xe7\xb5\xe9\xc5\x59\x76\x36\x76\x1e\xba\xe1\xe2\x59\x74\x79\x72\x88\xe7\x83\x1c\x13\xee\x99\xc4\xf0\xd7\x3a\xf2\x76\x6e\xcc\xcd\x9d\xba\x29\x18\x1b\xd9\xba\x07\x26\x68\x47\xae\x27\x1b\x78\xdc\xa1\x6d\x9b\x1f\xf7\x0e\x72\xfa\x4f\x48\xa9\xbc\xd7\xab\x83\x6d\x10\xf3\x88\x8f\x10\x03\xc4\x52\x4c\xdf\x5f\x41\x5c\xed\x66\xb1\xf3\x8b\x81\x75\xae\x89\x93\xeb\x8d\x79\x2a\xbe\x77\x41\xa0\xeb\x63\xd9\x9e\xec\x02\xaf\xf9\x82\x88\xce\x5f\x80\xfd\x4c\x1a\x12\x0b\x0a\x12\x6b\xe6\x59\x50\xb0\x09\xb2\x60\x8b\x31\xb6\x59\xb1\x9a\xb5\x58\xde\x96\x48\xcb\xa6\x41\x21\xcf\x26\xd9\x3c\xa0\xed\x3c\xa0\xb9\x2e\x9d\xcd\x80\x8c\x9d\x01\x74\x3a\x83\xee\xca\x36\x69\xff\xd6\x6c\xac\xee\xfc\x0d\x35\x03\x9a\x86\x01\x64\x68\xc6\xeb\xc1\x8f\x94\x21\xc9\xa2\xc2\x0a\x9c\x2a\xab\x92\x3a\x53\xea\xe2\x55\x49\x95\x55\x96\xb5\x79\x5e\x50\x14\x99\xe1\x44\x45\xe1\x18\x38\xad\xc8\x0a\xab\xaa\x2a\x0f\x35\x8e\x03\x5a\x4d\x91\xa1\xc6\xf1\x40\xaf\x29\x18\x8d\xb6\xe9\xe3\xab\xa1\x98\x08\xda\xa7\x24\x91\x0a\xd7\x30\x6c\xcb\x03\x2f\xff\xd2\xd0\xc6\x0e\x7a\x61\xb5\x71\xc1\x75\x47\x9e\xd2\x58\x51\x4d\x51\x8e\x65\x8a\xfa\x3c\x3c\xb1\x8e\xfa\x38\xbd\x66\xf8\x00\xf1\x89\xd8\x8d\x83\x5f\x3d\xf5\x5c\x7a\xcd\x43\xcf\xc1\x5d\x70\xfb\xc2\x6b\x7b\xdf\x4b\xaf\x7a\xe8\x39\xf2\x62\x38\xfa\x91\xdf\xe4\x5e\xe9\x24\xdb\x9e\xbe\x3f\x2a\x1b\xdc\x39\xaf\xfb\x50\x94\xd6\x37\xde\x42\x44\xe3\x62\x98\x0c\x9b\x5c\x13\xd2\x99\x42\x2a\x37\x3c\x89\xd6\xee\xbf\x41\xb9\xbe\xf5\x41\xd7\xb7\x5e\xfb\x1a\xaa\x49\xbb\x27\xfe\x87\x15\x3f\x3d\xcb\xd5\xf3\xac\x9f\xc3\x63\xc3\x7d\x68\xe5\x1b\x08\xdc\xdf\x33\x53\xb9\x6d\x3f\xc6\xec\x18\x33\x2c\xe3\x3c\xff\x60\x18\xe3\x41\x57\x37\x9f\x34\x4b\x5f\x16\x02\xdb\xca\x93\x1b\x6b\x7f\x82\xad\x25\xd8\xaf\x75\x7f\xed\x24\x37\x68\x6a\xe7\x8b\x1d\x7d\x04\xca\xfa\x70\x67\xde\x19\x6a\xe7\xef\x70\xda\x9b\xa9\xdc\xb0\xbb\xb3\xeb\xb0\xf6\x2a\x26\x97\xd0\xab\x94\x91\x45\x9d\xf0\x6b\x6e\xf4\x7e\x67\xb0\xc5\x27\x5e\xa2\x1e\x49\xe5\x36\xde\xf4\x9a\xb3\x8e\x03\x8b\xde\x4a\x51\x4f\xfc\x68\x51\x4f\x70\x2e\x6a\xa4\x72\xc3\xee\xbb\xb4\xe9\x60\x4f\x38\xb7\x3e\xe4\x7e\x74\xc6\x39\x5c\x0c\xe1\x2a\x18\x63\xe3\x68\x67\xdb\xc2\xb4\xb1\x75\xb8\xf9\x76\x77\xa3\xf3\x18\xe4\x05\x0d\x3d\x89\xea\x66\x9d\xda\xe2\x12\x3f\xa2\xee\x22\x62\xc4\x51\xc4\xfb\x89\x05\xc4\x62\x62\x09\x71\x09\x21\x7a\x2f\x32\xbc\xba\x59\x3d\xd9\x84\x5b\xa6\xa6\xfd\xe6\x10\xcc\xa5\x12\xbd\x03\xc7\x01\x3f\xfe\x3c\x00\xfa\x06\xe7\x26\xb2\x3d\x8e\x83\x90\x1d\x18\x9c\xe7\x78\x12\xfd\x71\xfc\xd5\xc6\xbc\xfe\x6c\xaf\xd3\xc4\x15\x2b\xa8\x78\x42\xf6\x5d\x22\xd6\xf1\x5d\xe0\x6d\x98\x58\x4c\x5e\x72\xf0\x34\xf9\x7c\xee\xfd\x97\x5c\xd2\x0b\x7f\xdf\xec\x51\xf5\x8a\x54\xd5\x54\x96\xd3\x38\x5e\x9a\x06\x59\xfb\x88\xfb\x8f\x00\xb7\x3d\x37\xf3\x4b\x70\xd6\x91\x89\x29\x70\x5d\xe2\x48\xf0\x7e\x7b\x5b\xec\x28\xf8\x47\x70\x2e\x3c\x00\xae\x84\x3b\xef\x87\x57\x9d\x70\xc1\x0d\x27\x80\xb3\xe0\xf9\x60\x12\xea\x43\x24\xb0\x5b\xf6\xfd\x31\x35\xaf\xe6\xd3\x31\x21\x14\xde\x36\x67\x54\xd3\xec\xd2\x67\x54\xea\xcc\x7b\x47\xbe\x08\x8d\x6b\x2f\x3e\xe2\xf1\x9e\xb3\xc0\x25\xe0\x3b\x7c\x4d\x53\x75\x95\x97\x04\x98\x07\x3c\xc7\x28\x25\x50\x3c\x2f\xb3\xf0\xd1\x4b\x2e\x39\x26\x9b\x3d\x66\xe9\x0f\x7e\xb5\xf8\x0a\xf9\x0a\x59\x3e\xef\x96\xc5\x0b\xe5\x2b\x16\x5f\xb2\xd4\xbe\x9b\xcf\x30\xac\xcc\x8a\xac\xc8\xc2\x0a\xcf\x03\xd6\xe4\xbc\x3b\x91\x88\x5e\x5d\xbb\x74\x78\x5f\x27\x3d\x9b\xc2\x63\xd2\x5e\x0d\x6c\xcf\xfe\xd9\x11\xd2\x1b\x01\x7c\xd3\xaa\xa8\xbd\xe1\x71\xdc\x13\x18\x5c\x6e\xd3\xcb\xc4\xdc\x4e\x3a\x99\xa6\x36\xb6\xdf\x19\x79\xf1\x91\xc7\xf6\x89\xe8\x4e\xc8\x54\x47\xfe\xd9\xbc\x26\x1a\x77\xf2\xec\xa5\xe7\x42\x7a\x35\xe0\xab\xcd\x5f\x8b\xc2\x3d\x7f\xa9\x6d\xe7\x30\x6d\x3f\x8a\xa6\x86\x1e\x0f\xe0\x7d\x89\x3d\xae\x5d\x71\xd4\x4c\xdf\xdb\xdc\x89\xf4\xaa\x27\xb7\x11\xaf\xb6\xfe\xba\x64\x21\xf7\x95\xe0\xfd\x96\xe3\x1f\x67\x1c\xfa\xde\x78\x13\xfa\xed\xb5\x9e\xef\xef\xd9\xb0\x08\x9a\x1b\x46\xd5\x3b\x87\x0c\x82\x20\x48\x32\xdf\xd2\xe3\x75\x4a\x21\xe2\x04\xed\xdf\xf3\x88\x65\xbd\xba\x36\xdd\xd9\x98\x5c\x2d\xca\xa5\x4a\x8d\xe4\x35\x53\x36\x61\x43\x83\x22\xa5\xa8\x05\xad\xa4\x41\xa1\x99\x56\x8a\xe2\x54\x55\x8d\x55\xfc\xf5\xb8\xe7\xda\xa8\x7e\xe0\x81\x6b\x82\x79\x0b\x38\x7c\xff\x71\x18\xbe\x18\x67\xfd\x1b\xd0\x99\x45\xf1\x1f\x51\x3b\xc4\x6d\xbf\xf7\x01\xac\x1f\x57\xf6\xbf\x11\x69\xcf\xe3\xfd\x4f\xfc\x2e\x80\xeb\xee\x9a\x3d\xf8\x0b\x51\xff\xf2\xc0\x13\x91\x7e\x0a\x5e\x7e\x3f\xd4\x7e\xf7\x31\x58\x7b\x01\xeb\xe7\xa5\x00\xae\xb8\xfb\xe7\xb5\x6f\xc7\x72\xa4\xf6\x7c\x52\xd4\x6e\xdc\x8e\x47\xef\x74\x8a\xa8\x62\xd8\x53\x77\x46\xed\x6c\xb7\x9f\xe1\xf1\xa8\x1d\xbc\x07\xe1\x67\xfd\x1d\xd8\xb8\xa5\x76\xfb\xd0\xfb\x09\xa9\x3d\xee\xe6\xa7\xa2\x71\xb0\x89\x2b\x23\xeb\xf5\xee\xa1\x6d\xfd\x65\x04\x6e\xe0\x78\x3b\xb0\x04\xc3\x27\xbe\xbf\xaf\x47\xe9\xde\x5d\xd7\xa6\xe9\x90\x3f\x19\xc0\x77\x7f\xb5\xf3\x7e\xed\xde\x87\xed\xaf\x1e\xc0\x73\xbb\x21\xd2\xd8\x76\x80\x53\x0c\x47\x7b\x92\xe1\x35\xd3\xab\x8b\xff\x00\xc4\x8a\x07\x39\xfc\xad\x42\x64\x9c\xad\x27\x62\xf4\x85\xe1\x75\xe3\xa7\xa2\xf6\xac\xdb\x7e\xe3\xee\x90\xfc\x09\xe0\xeb\x4e\xef\xbc\x3f\x07\xcf\x8d\xe2\xcf\x85\x1f\xe8\x8f\xfa\x5f\x2e\x3e\xf6\x7f\xb4\x33\xfc\xe0\x9c\xce\xf3\x9f\x7c\x2c\x80\xab\x78\xfb\x5d\xbf\x9a\xd5\x0f\x6a\xbf\x05\xbf\x23\xa0\xb6\xe9\x62\xeb\x2b\x74\x44\x8e\xb9\xed\x0f\x2e\xc1\xf0\x63\xb6\xe7\xbf\xe5\xa8\xa8\x7d\xe0\xed\x7f\x57\x94\xbe\x5c\x78\xe8\x7e\x3d\xdb\x6e\x6f\x7e\xbc\x33\x3f\x6d\x3e\x17\x83\xf3\x58\x3f\x62\xe7\xf6\x07\x2e\x88\xfa\xe5\x45\x14\x59\x99\xfc\xed\x3b\xec\xe3\x5b\x51\xbe\xf7\xfa\x7f\x0a\xc3\xa7\xd9\xc6\xe7\xa8\x1d\x8d\x93\xb8\xf0\xf1\x5f\x44\xfd\x44\x17\x7e\x80\x9f\xd5\x8f\x8b\xcf\xee\xa8\x3d\xe2\xc2\x77\xdd\xd3\x79\x7f\x77\x7d\xfc\x1d\xe0\x5f\xc4\xf6\x05\xe9\xc7\x31\x64\x87\x15\xca\x9d\xe9\x70\xec\x63\x9d\xfb\xc1\xee\x9f\x86\xe0\x63\xb7\x47\xd7\xe5\xf6\x53\xf8\x45\xb4\xbd\x0b\x1f\xff\x3e\x46\xe7\x48\xcf\x7a\xfb\x72\x62\x48\x4e\xeb\xc1\x7c\x70\x3d\x20\x63\xf0\xf3\x3a\xef\x57\xe1\x8f\xa1\x71\x83\xfe\xc7\xbf\xda\x19\x9f\x07\x66\xa2\xfd\x78\xfd\xb7\xf9\x4e\xf4\xf6\xdd\xdd\x47\xbb\xf3\xba\xc6\xce\xc4\xe6\xa9\xb6\xe1\xa1\xfb\xf9\x86\x0f\x4f\x51\x23\x7f\x89\xd2\x89\xdb\x7e\x78\x6c\x96\xbc\x74\x6b\xe0\x17\xde\x41\x5f\xbd\x1d\xa2\xf3\xf6\xba\x66\xdd\xed\x74\xfb\x29\xf2\x9d\xf5\xea\xe4\x44\x48\x9f\xe8\xc1\xb8\xa3\x51\x3b\xc7\x5b\xd7\x83\x58\x3f\xed\xf9\xe7\xf6\x97\x91\x84\xfd\x7b\xa4\x2f\xb7\xbe\xf8\x73\x9d\x65\xfb\x96\x23\x67\xf1\x8c\x3b\xa7\xa9\xce\x6b\xd8\xcf\x76\xc6\xc5\x7e\x3b\xaa\xeb\x3d\x9c\x8e\x74\xd6\x35\xd8\xd9\x1e\x87\xf3\xc0\xd6\x7f\x60\xfd\x94\xdb\xf0\x7d\x33\x51\x1a\x72\x79\x69\xdf\xe6\xce\xe3\x8e\xfe\x2c\xea\x4b\x79\xba\xf8\xc5\xa8\x0f\xe2\xce\x7f\xfd\x8f\xa3\x31\x0d\x17\x5e\xbc\x07\xb3\x0d\x30\xde\xd8\x79\x2c\xd6\x5e\xc4\x64\x5c\x22\x64\xb3\xb6\x75\xd8\x0f\x30\x9a\xc6\x68\x6e\xe7\x4b\x21\x9a\x08\xfa\xdf\x3e\x8b\xd6\x5d\xbc\x4d\x7e\x73\x96\xec\x46\xf0\x9d\x97\x85\xf0\xac\xf9\x3a\xe3\x89\x2d\xb3\x6c\x2a\xb7\xbd\x88\xd9\xac\x18\x7c\x3b\xec\x2c\x13\xc7\x93\xd1\x71\xdd\x79\x16\x5f\xee\xbc\x8f\x07\xc6\x66\xc9\x5c\x97\x0e\xcf\xee\xcc\x7b\x13\xb3\xee\x5e\x7a\x3c\xf3\xaf\xce\xb2\x26\x38\xd3\x0d\x6c\x21\x8f\x0e\x8f\x8c\xf2\x86\xd7\xfe\xf9\xa8\xcc\x75\xe1\xd8\xd9\x3f\xd7\x96\x11\x34\xb5\xfd\x5b\x9d\x65\x56\x71\x2c\x6a\xfb\xb9\xed\x87\x1e\xeb\x2c\xfb\x0e\xe2\x75\xf3\x31\xdb\x6f\x0c\xbf\x17\x8e\xe2\xe6\xfb\xdf\x17\xb1\xe5\x44\xcc\x26\x70\x4f\x61\xfd\xdc\xb1\x81\xff\xee\xe2\x68\xdd\xe2\x59\xf6\x02\xd2\xab\xdb\x7a\xeb\x11\x7d\xeb\xce\xd5\xba\xa1\xb3\xdd\xb1\xed\x8c\xce\xfa\x33\x74\x66\xda\xa6\xd1\x9c\x85\x6e\xc4\x7b\xf1\xa0\x90\x8c\xa5\xa9\x2d\xab\xa2\xeb\x73\xc7\xb0\xfe\x8e\xd1\x17\x36\xa7\x4d\xc3\x21\xbc\x06\xfc\xba\x61\x57\x88\x1e\x03\xf8\xd0\xa3\x51\x9b\xca\x5b\x9b\xd1\x79\x0d\x5b\x67\x9d\x8d\x79\xfc\xfa\x5e\x8c\x5e\xb4\x36\xff\x61\x67\x60\x3c\xbe\x6f\x9b\xef\xec\xac\x83\xb6\xf4\x77\xb2\x6d\x68\x6a\x5d\x4f\x67\xf9\xb4\xf5\x19\x4c\x0e\x61\xba\x75\xe2\x98\x28\xdd\x79\xf0\xd3\xb0\xf6\x42\xdb\x96\xd8\xba\x1f\x83\x97\x02\x78\x6e\xbd\x9b\x9d\xe8\xe1\xb0\xcc\x71\xbf\x9b\x70\x4f\x95\xbe\x12\xb6\xad\xdc\x71\xd6\xe1\x3a\xaa\xdd\x9f\x97\x43\x16\xd5\xcd\x41\x67\x53\xde\x3b\x83\x05\x04\x01\xe6\x92\x71\xf4\x6e\x2a\x91\x5b\x10\x77\x2b\xd8\xce\x07\x54\x3c\xeb\x85\x42\x12\xbd\x44\x2c\xdb\x9d\x25\xcb\xfa\x14\xac\xaa\x80\x8f\x29\xf5\x69\xad\x0a\xeb\x2d\xc2\xa0\xd3\x40\x07\x55\x09\xf2\x50\x9a\x82\x56\x57\xc1\x6a\x2a\x56\x55\x21\x25\x2d\x66\x34\x15\x4a\x16\x61\xc3\xd4\x0b\x15\x6b\x5a\xab\xd5\x4a\x42\x3a\x0d\x0b\x95\x42\x15\x68\x8d\xa9\x66\x59\xd3\x62\x79\xd5\x00\x5c\xd3\x04\x46\xab\x45\x5c\xdd\xea\x4b\xa8\x94\x44\xaf\x7e\xf2\xb1\x37\x66\x96\x6c\x72\x7c\x89\x11\x3f\x77\xa9\x18\xdc\x91\x46\x6f\x4b\xc7\xf6\x06\x70\x47\x4e\x8a\xa9\xdc\xc8\xd3\xb3\xe0\x28\x47\xe8\x18\x8a\x65\x0d\x0d\x61\xfd\xe8\x94\x9c\xca\x8d\x15\x67\xb5\x47\x77\x34\xd6\xbf\x3c\x0b\xee\xe6\x58\x29\x47\xe0\x9c\x7b\xd7\x7d\x03\x3a\x75\x9a\x64\x3c\x78\x6f\x2b\x97\x78\x8a\xfa\x02\xbd\x66\xe4\x9f\xc4\x77\x5a\x6f\x2e\xb9\x8b\x7b\x83\x5e\x39\xb2\xe3\x17\x87\x2d\xb9\x65\xc5\x76\x2f\x5f\x14\xba\x77\xb6\x61\x1c\xf1\xe4\x37\xb1\x71\x4a\xce\xbc\x26\x45\x04\xff\x46\x88\x0e\xe5\x54\xae\x38\x84\xac\x82\xe1\xa0\x3d\x8a\x53\xd2\xab\xc7\xf6\x76\xc5\x97\x5d\xb6\xe2\x65\x7a\xe5\xe4\x49\x67\x11\xcb\x9e\xe3\x70\xf9\xa8\xf9\xbf\xe7\xe6\x1a\x26\xe2\x84\xda\xd2\x13\x3a\xc5\x78\x79\x35\x7b\xfc\x5c\xba\x73\xd1\x45\x4e\x37\x9c\x86\x62\xeb\x03\xee\x4b\x93\x2a\x25\xbf\x6d\xea\x71\xee\x50\x19\x1d\x8f\xc7\xa4\x92\x24\x91\x6c\xa3\xde\x95\x56\x6d\x4d\xe6\x0a\xac\x44\x31\xd6\x94\x2d\x99\x40\xb1\x2b\xec\x54\xc1\x34\xab\x53\x66\x91\x2f\x99\x6d\xd9\x97\x4c\xe5\xf6\xa1\xbc\x32\x7b\xfc\x78\xa6\xde\x52\x3c\xf9\x86\x62\xbc\x7b\xd6\xcd\x92\xc5\x6e\xae\x6b\x3f\x67\xb6\xd6\x52\x5c\x9d\xb1\x61\x0c\xed\xe5\x43\xde\x5a\xf8\x96\x86\x6a\xed\x2f\x22\x16\xa3\x0c\x1a\xe7\x3a\x54\x9c\xc8\xf6\xa0\x57\x82\x83\x1d\x1e\x09\x06\x59\x41\x83\xe4\xa0\xf1\x81\xc1\xec\xd1\xc0\xbb\xc5\x3a\x07\x3b\x84\x40\x17\xea\xca\x66\x06\x14\xf5\x6a\x8c\x86\x35\xd1\xc8\x90\xbc\x62\x18\x75\xa1\x66\x35\xb5\x52\x4d\x22\xe9\x0a\x2c\xd1\x49\x91\x17\x79\x21\x9d\xe1\x39\x91\xe7\x33\x79\xa9\xd1\x25\xcb\x02\x2c\x72\x4d\xae\xab\x3e\x43\x5b\xb1\x62\x53\xd0\x04\x16\x58\x5c\xbe\x90\x67\xc0\xf4\xdb\x79\x30\x95\x67\x29\x2d\x23\xe8\x2d\xa2\x08\x92\x40\xca\x8b\x5a\xd9\x50\x25\x53\xd4\x15\xc9\x90\xf4\x69\x20\xd3\x34\xcb\xc9\x1c\x9b\xc9\x30\xac\xc2\xb3\x99\xb4\x5c\x29\x4a\xaa\x62\x97\x20\x6b\x58\xb0\x28\x29\xa2\xca\xc8\xac\x69\xf2\x5c\x40\x37\x68\x9f\x9f\x46\x75\x4a\xf7\xf8\x75\x84\x83\x37\xba\xa3\xe8\x1d\xd4\xe8\xe1\x18\x2e\xdd\x3b\x4a\xe8\xcd\xc2\x86\x31\x8c\x9e\x5d\x79\xfd\x24\x81\xdf\x8b\x69\xe3\xbe\x80\x70\x8f\xbf\x0d\x79\x9c\xba\x3f\x95\x3b\x70\x06\x41\xd0\x89\x8d\x57\xc7\x26\x89\xf7\x78\x77\xce\xb6\x50\x06\xbd\xba\x70\x5f\xf2\x9f\xa7\x3c\xca\x0d\xd1\xab\x1e\xfa\x26\xd9\xdd\xa2\x99\x27\x3f\xfa\x53\xe2\xbd\xe8\x0c\x63\x9c\x52\x51\x94\xf7\x78\x22\x47\x7c\x98\x38\x91\xf8\x34\x71\x27\xf1\x59\xe2\xf3\xc4\x63\x04\xd1\xbe\xaf\x98\x8a\x27\x72\x31\x94\xb2\xd4\xbb\xa4\x08\xba\xd1\xa5\x8f\xee\x39\x7d\xdd\xf3\xfc\x0f\xe8\xeb\xee\xeb\x9f\xd7\xdf\xfe\xf4\xf5\xf4\xf5\xcc\x6b\x7f\xba\xff\xff\xbf\xcf\x26\x02\xf2\x47\x14\xb0\x00\x51\x00\xaa\xd9\x3d\x98\xeb\xed\x3a\x0f\x2c\x4d\xae\x4d\x82\x4f\xc3\x3d\x17\x82\xac\xfc\x67\x79\x09\xfc\xfb\x6d\xe0\xc3\x19\xf8\x13\x70\xaa\xc4\xeb\x9c\x4c\x5e\xc3\x35\x15\x51\x17\x84\x8a\x20\x54\x44\xf1\x10\xa1\xc8\x3c\xfa\xe3\xfd\x23\x29\x52\xe4\xbf\x9b\x22\x1d\xab\x34\xd9\x7c\x4c\x6c\x16\x0c\x92\xb5\x2b\x79\x8e\x05\x49\x26\x6d\xd0\x19\x2b\x0d\x65\x48\xb3\x65\x86\x8d\x5f\x79\xd7\xfa\x47\xef\x7b\x10\x0e\xfd\xf6\xae\x6f\x83\x3e\xf8\xaf\x5f\xc8\xbf\x00\x9f\x87\x05\xd5\xe0\x74\x0d\xbe\x60\xd7\x75\x9d\xa4\xed\x3a\x30\xa1\xec\x7e\xba\xaa\xb6\x24\x4b\xb2\x28\x8b\x32\xfa\x4b\x92\xc9\xb2\xcd\x29\xa2\xe2\x43\x14\x51\x21\x0b\xcd\x1a\xaf\xf2\xb0\xa8\xca\xb0\x21\x4a\x19\x91\x67\x18\x26\xad\xf1\xac\x41\x0b\x3c\x81\xdf\x35\x2f\xa0\x73\x94\xf5\xc8\xa6\x25\x00\xa1\x21\x7f\x2c\x4d\x0c\xb8\xb2\xc2\x61\x1f\x54\x57\x27\x05\x12\x44\x2c\x71\x74\x0f\x4d\x7a\xf1\xf8\x81\xfe\xc5\xbd\x44\xbc\x77\x80\x18\xcc\x39\xff\xce\x07\xb9\xde\x2e\xe7\x9f\xac\x41\x55\x9b\x35\x9e\x37\x04\x90\xb7\x74\xad\xc0\x03\x4d\x85\xba\x2c\xe7\x8b\x05\x41\xcf\xeb\xaa\x20\xd2\xd0\x82\xb4\xd0\x00\x75\x93\xce\xc3\x0a\x94\x24\x60\x01\x3e\xcf\xc0\x06\x9c\x92\x41\x11\xe4\xed\x3c\x95\xb6\x04\xce\xa8\x58\x25\xd9\x50\x20\x03\x1b\x26\xc8\x83\x69\xb6\x54\x81\x75\xd8\xc8\x17\xd9\x72\x49\x16\xa1\x5a\xb1\x44\x20\x15\x45\x01\xd6\x4a\xa6\x05\x58\x96\x29\x4b\xba\x0e\x92\x04\xf0\xec\xc8\x34\x71\x46\x74\x0d\xf1\x04\x11\xa3\x3a\x2c\xc2\x99\x3c\x12\x14\x78\x12\xe1\x41\x7f\x41\x26\x55\xb2\x09\x8e\x2b\xf1\x20\x5f\x17\xcb\x25\x03\xf0\x0a\x2c\x59\xf9\x4c\xa6\x54\x16\x8c\xbc\xa1\xca\x72\x12\x6a\x76\x55\x24\x05\x60\xa5\xf3\x66\x91\xc9\x98\x9c\x51\x10\x0b\x26\xcb\x1a\x2c\x53\x34\x19\xbe\x45\x40\x43\x06\x25\xc0\xa1\xa5\x71\x4c\x71\x4a\xad\x18\xa6\x08\xf3\x0d\x03\xe4\x49\x82\xa6\x0b\xce\xd2\xea\xce\xd2\xca\x3c\x0f\xd5\x4a\xa1\x02\x2c\x59\x32\x14\x9e\xe7\x34\x91\x33\x39\x41\xe0\x78\x8e\x97\x0d\x81\x2b\xab\xba\xee\xd7\xfe\x13\x90\x9d\x9e\x4e\xe5\x76\xb9\xb2\x75\x56\x6e\xcb\x3d\xcf\xa2\xf7\x92\xe8\x8e\x1e\xca\xab\x8e\xee\xb5\x10\x73\x88\x63\x50\xd5\x24\x74\x0e\x12\x48\x40\xef\x90\xd5\x11\x92\xf1\x6c\x4f\x16\x43\xda\x7c\x67\xe3\x83\x83\x98\x81\x65\xc0\x43\x99\xf3\xcf\x02\x17\x4b\x0b\xb2\x5d\x49\x26\x43\x56\x60\x25\xcd\x81\xe9\xb7\x69\x30\xc5\xb0\x70\x8a\xac\x66\x32\x12\xa8\x0a\xb4\xad\x32\x50\x8f\x67\xec\xb2\x6c\xb2\x80\xa8\x28\xba\xae\x81\x8c\x02\x6b\x86\x9a\x31\x74\xb9\x9c\x2f\x99\x0c\x0b\x75\xbb\x21\x90\x0c\xd0\xe8\x34\xb4\xa0\x20\x80\x0a\xa2\x8a\x69\x58\x97\x81\x0c\xf2\x90\xa6\x34\x5e\xd4\x05\xd9\x30\x24\x51\xe7\x18\x28\xe8\x8c\x28\x1b\xbc\x5e\x90\x0b\x9a\xc4\xc3\x42\xd9\x98\x02\x1a\xa3\xe8\x53\xd3\xe9\x62\xc6\x30\x44\x38\x6d\x9a\x26\xc8\x0b\x0c\x6c\x28\xba\x3e\xcd\x30\xa6\x60\x08\x05\x1f\x6f\x45\x47\x2e\x16\x17\x22\xbc\xe1\xb9\x3f\x51\xbe\x57\x17\x6f\x41\x4c\xd2\xb5\x0b\x32\xa9\xdc\xc8\x7f\x90\x7e\x7d\x2b\x84\x67\x36\x95\x1b\x41\x95\x39\xf6\xfd\x1b\x83\x6f\x69\xe3\xff\xe0\xe0\xca\x36\xdc\xb5\x7b\x9f\x45\x3c\x77\x7e\xa8\x1f\xc6\x6f\xbf\xff\x19\xcf\x6e\x73\x79\xd4\x22\x38\x62\x25\x71\x0e\x21\xe0\xb9\x16\xb3\xf8\xee\x50\x91\xed\xe9\xc2\xf6\x25\xe7\x95\x22\xee\xf6\xde\x70\xb8\x0f\x90\x07\x06\x3f\x04\xa8\x44\xb6\x9f\x54\xad\x4c\x9e\x2c\x72\x3c\x68\xd8\x84\xc1\x38\x5b\xa3\xe9\x22\x90\x65\xe8\xd0\x5e\x52\xd3\x45\x23\x6f\xaa\x0c\x03\x75\x48\xf3\x64\x1a\xe8\x74\x1a\x96\x20\xc3\x83\x2a\x10\xf2\x4c\x03\xaa\x3c\x10\xa6\xa1\xcc\x30\x52\x65\x8a\x27\x45\x81\xb5\x4b\x9c\x08\x4c\x96\xb5\x1b\x64\x29\xc3\x92\x19\xca\xca\x70\xac\x2a\x72\x90\xd7\x4b\x92\xe9\xfc\x50\x29\xea\x55\x20\x65\xd2\x1c\x5f\xad\xa6\xad\x8c\xae\x65\xea\xaa\xae\x35\x78\xb6\xa6\xe8\x52\x95\x61\x8a\xbc\xc1\xe8\x80\xcb\xa4\x15\xb5\x0a\x1b\x9c\xc0\x43\x9d\x51\x25\xbe\x80\xc7\x54\xf6\xed\x46\xfa\xe9\x41\x6c\x7f\xd6\x53\x79\x7a\xf5\xe4\xaf\x56\x13\xa7\x0a\x8e\x2d\xb9\xe7\xd9\x10\x6e\x79\x7f\x8f\x0a\xb8\xad\x67\xf9\x7b\x44\x53\x85\x35\x01\x4f\xb1\xde\xfb\xfb\x4f\xa2\x31\xbe\x8c\xf5\x83\xee\x59\xec\x41\x75\x12\x82\xfa\x9b\x41\xbe\xd8\x51\x94\x47\x02\x1b\xd7\xa1\xb1\xb4\xdf\x7f\x40\x63\xd1\x1a\xc9\x0f\x60\x70\x34\x9f\xbd\x88\x97\x83\x7a\x2b\x62\xe0\xb3\xa0\x7e\x76\xfe\x23\xd4\x7f\xc6\x9d\x0f\x4d\x8d\xfc\x3b\x6a\xc3\xba\xf3\x7c\xfa\xc6\x90\x4d\xad\x05\xed\xff\x19\xf5\x7d\xbc\x7c\x80\x5f\xc2\xd6\x6b\x51\x79\x7f\xdc\x91\xcb\x43\xb6\xb0\xe0\xc3\xc7\xfc\xf8\x73\xb1\xc5\xba\xf5\x5b\xd7\xa3\xb7\x74\x43\x5f\xc4\xe6\xe3\xde\x6b\x7c\x2f\x11\xdd\x97\x62\x7b\x3e\x9b\xb6\x63\xfd\x63\xf0\x2d\x1b\xb0\xf6\x6e\x9c\xd0\xad\x6d\xfe\x1f\x57\x5f\x01\xa1\xc5\x51\x75\x4a\x23\x58\x97\x3b\xfc\x5a\x9e\xed\x73\x63\x4c\xc4\x23\x86\x70\xfe\x8e\x88\xf8\x78\x43\x29\x4f\x49\x82\xa1\x2a\x95\x3a\xa0\x2d\x53\xd0\xf3\x86\xc2\xf1\x49\x28\xd9\x45\x81\xd4\x80\x95\xce\x40\x0b\xe6\x25\x50\x05\x8a\x08\xcb\x50\xe1\x2a\x25\x5e\xb4\x24\xc1\x30\x45\x19\xd6\x61\x89\x27\xa7\x28\x4d\xe3\x58\x59\xe5\x38\x55\x11\x1b\x90\xad\x37\xd2\xc5\x8c\x65\x71\x1c\x2c\x15\xad\x22\xe0\x25\x76\xda\x30\xd5\x29\x51\x11\x8c\xbc\x43\xce\x8a\x96\x67\x75\x85\x61\x2c\xd1\xa3\x6b\x54\x83\x78\x3f\xf2\x2f\x0e\x7e\x12\xf3\xe7\x50\xfc\xed\x20\xca\x97\x7f\xf0\xc6\x90\x9f\xa9\xa4\x72\x07\x11\x8d\x62\x79\xc9\x04\x37\x9f\xf2\x41\x19\xf9\x29\xbf\x09\xf9\xcf\x4e\x3f\xab\x51\xbc\xe5\x75\xac\x3d\xaa\xf1\xe1\xc0\x53\x94\xc9\x84\xfc\x6a\xcd\x87\x1f\x1c\xcc\x47\xe2\x66\x6e\x3f\x41\x8e\x98\xc0\xaf\x76\xe1\x41\x0d\x79\xd9\x7f\xbf\xe3\xce\x73\x02\x7f\x03\x80\x62\xaf\x0e\x3c\x45\x4d\x9c\xdb\xb9\x9f\xe2\x63\x51\x7f\xfe\x20\xca\x11\xe1\xac\x2e\xb2\x5e\xd4\xff\x38\x15\x85\x3b\xdc\x9e\xa2\x9c\xde\x10\x3c\xc8\x1b\x79\x50\x9e\x22\x52\xd4\xf8\xfe\x4c\x24\x56\xeb\xe1\xe7\x8a\x50\x5c\x2e\xe8\x7f\x57\xf8\x4e\xa7\x92\xca\x4d\x7e\x0b\xf5\x2f\x87\xe2\x45\x41\x3f\x7b\xf6\x60\xf3\x29\xfa\x78\xa6\xa9\x11\xbc\xd6\x61\xb1\xbd\xde\x1d\xaf\x85\x78\x32\xe8\x67\xf4\xf0\x68\x1c\xcc\xeb\xc7\x0e\xc5\xeb\x82\x7d\xdf\x51\x8c\xc6\xfd\x5c\xf8\xde\xd1\x50\x0c\x49\xf3\xe1\x5b\x86\x3b\xe3\x7f\xf8\xc2\x59\xf3\x71\xdb\xaf\x0b\xd1\x8f\x9a\xca\x6d\x5b\x12\xc1\x83\x77\xa6\xec\xb6\x5f\x77\xd1\xac\xf9\x23\xb8\xf5\x09\x02\x8f\xa3\x06\xf3\xc7\xee\x0d\xfb\xf8\x77\xc7\x5d\x1f\x8d\x81\x6d\x79\x12\xe5\x24\xa5\xa3\x7c\xb1\xab\x8e\xda\x23\xff\x88\xa0\x50\xce\x20\x9d\x62\x83\xfa\x12\xc8\x13\x06\xd1\xda\x12\x5e\xad\x54\x64\xf3\xe5\xe3\x85\x43\xa2\xd5\x25\xcf\x98\xfe\x27\x96\x07\x02\xe0\x25\x58\x82\x05\x68\xf0\xb0\x02\x2d\x0e\x28\x14\x7b\xa8\x1a\x2b\xd4\x6d\xdd\xf9\x3f\x64\x79\xcb\x2a\x8a\xaa\x5e\xe0\x2d\x01\x8d\xab\xb6\x58\x47\xf6\xa1\x31\xe7\x10\x73\x89\x63\x51\x86\xf0\x3e\xef\xc6\x1b\xaa\x2d\xd3\x1e\x7f\x0e\x1a\x79\x81\x33\x8b\x05\x31\xc3\x8a\xe5\x9b\x35\x52\x3b\x64\x91\x1c\x94\xba\x32\x33\x53\xfe\x67\x5a\x87\x0d\x68\x28\x40\x88\xe5\x01\x07\x38\x11\x96\x60\x89\xd2\x35\x53\x9f\xa9\x75\xe5\x61\xc5\x82\x8c\x05\x59\x13\x16\x65\x5d\x32\x39\x85\xd3\x4d\x93\x47\xb8\x29\xf9\xe7\xe1\x13\x9b\x7f\xed\xd8\x18\xc8\x17\x24\x12\x84\xe9\xbe\xed\x23\x68\xe2\x68\xef\x3d\x68\x1e\x55\xc2\x69\x5b\x1a\x61\xcb\xa1\xf3\x84\xc9\x6a\x31\x93\x27\x4d\x8e\x07\xd2\xa1\x1a\xcb\x29\x53\x75\x81\x94\x05\xd6\x2e\xf3\x12\x5e\x48\xa5\xe1\x4c\x5e\x57\x80\x48\x4e\x03\x0e\xb0\x8e\x2c\x2d\x51\x1a\xc3\xb2\xba\x28\x34\x93\x31\x23\x9f\xd1\xb4\x1a\xac\x09\xa2\x00\x75\x1d\x8a\x06\xe4\x9d\x95\x18\x92\xc9\xab\x9c\x66\x1a\xbc\x77\x07\xdc\xcd\x3f\xf7\x6f\x67\x8f\x77\xc7\xbd\x75\xb8\xf5\x0b\xb8\x00\xd7\x1f\x20\xb2\x6e\x45\x18\x17\xdb\x6e\x75\xdc\x59\xd5\x44\x82\x05\x00\x22\xde\xb0\xf9\x18\xf7\x76\x32\x96\xb6\x25\x36\xae\x1f\x52\x51\xc6\x50\xff\x03\x58\xb9\x0e\x19\x0e\x18\x64\x1d\x30\x40\x14\xa0\x09\x4b\x14\xa7\xeb\x86\xa1\x43\xb5\xa9\x90\x9a\x0a\x0d\x15\x9a\x2a\xac\x29\xba\x68\x70\x2a\xab\x19\x26\x47\xe0\xb9\xc4\xf7\xbb\xf1\x8c\xfb\x31\xdb\xdd\xbd\x93\xb6\x08\xc9\x8a\x13\x31\xb8\xbb\xbe\x8d\x88\xf7\xe7\x61\x70\x94\xe3\x7d\xc7\xc7\xd1\xf9\xeb\x22\xcc\xf7\x47\xb2\xcb\xeb\xff\x0b\x1e\xdc\xf0\xeb\xc3\x7a\x70\x2d\xd4\xbf\xe2\xf7\xbf\x7b\x7b\x34\x26\xe0\xb5\xbf\x2f\xc4\xfb\x7c\x00\xff\x7c\x48\xb6\xb4\xdb\xdf\xeb\xf1\x9a\x9b\x3f\x41\x0f\x6a\xf2\x2c\x24\xfa\x08\x02\x74\xd3\xb1\xde\xd4\x31\x60\xfe\x82\xb9\x5d\xf1\xe0\x35\x07\x62\x81\x7e\xd0\x9f\xed\x01\xfd\xd9\x63\x1d\x5e\x00\x47\xbb\x3c\xe8\xec\x0b\x28\x54\xd5\x42\x4c\x22\x55\xd1\xb6\x9a\x55\x52\x37\xc9\xa2\x2d\x90\xcc\x0c\x4b\x12\x64\xbe\xa9\xc4\x0c\xf7\x43\x9a\x0d\x40\x8b\x70\x1a\x36\x60\x51\x9b\x82\x65\x05\xe4\xbb\x4c\xbb\x08\x65\x68\x6a\x80\x05\x7c\x6c\x3a\x29\xe8\x42\x52\x93\x24\x43\x6b\x6a\x31\x4d\x73\x7c\xd1\x16\xa1\xaa\x0d\x05\x4e\x31\xb2\xa9\xb3\xb2\xac\x08\x26\x4b\x10\x87\x79\x72\x5a\x45\x9c\x9a\xf5\xde\x65\x9e\x44\x0c\x12\xcb\x1c\x3f\x32\xd6\xe7\xf8\x92\xa9\x39\xed\x97\x95\x31\x32\xe6\x85\x2b\x16\x64\x7b\xb2\xb1\x28\x75\x05\xd9\x5b\x7a\x07\xe4\xae\x02\x6d\xd1\x60\x1a\x66\x32\x2a\xcf\x67\x32\x49\x3d\x2d\x89\x86\x6a\xe6\x67\x04\x8a\xd0\x15\x55\xd1\x66\xd2\x31\xb1\x59\x60\x62\xc5\xa6\x60\x92\xba\xad\xfa\x1f\x50\xae\x57\xb9\xa9\x29\x58\x53\xad\x29\xa9\x12\x4f\x02\x05\x1a\x86\x5d\x81\xc5\x29\x4d\xcd\x34\x2c\x40\x00\x99\x2c\x83\x1a\xe7\xf8\x8a\xac\x01\xb5\xa6\x41\xaa\x32\x2c\xc8\xd0\x52\xe0\x14\x2b\x1a\x32\xab\x49\x8a\xa0\xb3\x61\xda\x72\x69\x2e\xc8\xb5\x56\x44\xb2\xa1\x4d\xa3\x9f\x0b\x68\xe5\x8c\xc4\x56\x94\xb3\xd2\x69\xbf\x6a\xf2\xd6\xd6\x60\x6b\x66\xe5\x32\x8e\x08\xde\x62\xb4\x7f\x07\x9d\xb9\x11\x87\xa1\x98\x67\x89\xd2\x90\x24\x71\x23\x3e\x27\x13\x03\xc4\xa9\xc4\xe9\x0e\x0e\x7b\xfb\x8e\xee\x71\xd3\x9d\xf5\x39\xa8\x4c\x21\x54\x92\x94\x8b\xca\xb9\xee\x95\x3f\x14\x9f\xc1\x11\x19\xc7\x10\xa9\x75\x15\x93\x66\xd2\xcc\xe4\x15\x9e\x55\xa0\x98\x56\x04\x0e\x61\x53\x16\x0c\xd9\xc1\x26\xca\x1b\x60\x76\x29\x33\x86\xe0\xc8\x1b\x83\xac\xd8\x6c\xf0\xa1\x6b\x65\xb6\xea\xf8\x14\x95\x69\x76\x3a\x5e\xb3\x04\x81\x61\x78\x41\x34\x6d\x0e\xea\x2d\x42\xd7\xd3\xb0\x51\x00\x69\xa0\xc6\x24\x51\x95\x54\xc9\x66\x48\x42\x84\x53\x22\x9c\x16\xeb\x0c\xaf\x0b\xac\xaa\x4a\x79\x23\x8f\xdb\xd2\xde\xda\x3f\xeb\xe1\x8b\x43\xe7\x72\x46\x2a\x37\x81\xee\x49\x0f\xdd\x8d\xf1\x5c\xa9\x8d\xf7\xe2\x27\x03\x1e\x65\x13\x52\x3b\xf7\xe1\x90\x1a\x8a\xe7\x59\x41\xff\x77\x61\xfd\x98\xed\x7e\x0e\x0c\x84\xe2\x00\x79\x9f\xa7\x77\x7d\x2f\xf0\x29\x58\x2f\xe7\xca\x57\x51\x3f\xb3\xce\x41\x0e\xaa\x88\x0e\xce\x0e\xe2\x7f\xde\x9b\x49\x57\xb6\x3e\xf9\x76\xd0\x3f\x87\x8f\x1b\xdc\x39\x09\x74\x8a\x37\xcf\x3b\x82\x71\xc3\xf0\xcf\x60\x32\xc3\xc0\xe0\xb7\x87\xe6\xaf\xf9\xfd\x8f\xdd\x88\xf9\x62\x8a\x83\xcf\xf1\x0d\xa8\xfd\xa7\xa3\x32\xd2\xcd\x01\x16\xc8\x42\x21\x78\xbf\xb7\x28\xe4\xd3\x89\xc1\xf9\x27\xb2\x53\xc6\xde\x1b\x9a\xa7\x9e\xca\xad\x27\x91\xdd\xe7\xc7\x47\x4d\x3f\x6f\x87\x37\xcf\xdb\x3c\xf8\x05\x2d\x3e\xf1\x14\x75\x2f\xbd\x7a\xd7\x9c\x0f\xc7\x97\xdf\xc5\x11\xf4\xca\xc9\x45\x31\x62\xd9\x79\x5c\x47\x99\x3e\xf6\xe7\x59\xbe\x17\x1a\x7f\x9f\x3f\x8e\xea\xbf\x25\x2a\x20\x7b\xeb\xc0\x57\x43\xfb\xac\xfb\xfb\x39\xf6\x81\x10\xbc\x8d\xa7\xdf\x63\xfb\x89\x6a\xfa\x8c\x66\x90\x7d\xac\x62\xf8\x73\xef\x96\x2f\x0a\xe5\xee\x71\x6b\x01\x06\xf4\xb2\xe5\xe1\xd0\x3e\x04\xf3\xdf\xeb\xdf\xe1\xd3\xd1\x79\x6d\xbb\xae\x2e\xba\xf3\x45\xbc\x87\xf8\x6c\xeb\xc4\x84\x44\x3d\x89\xce\x95\xda\x15\xb9\x1d\xa9\x79\x0a\x41\x2c\x70\xa4\xb8\x77\xb2\x00\x7a\x5c\xf9\x9f\xed\xee\x75\x5f\xf0\xf5\x80\x78\x24\x77\xc8\xd1\x73\xfd\xd3\xa7\x6c\xae\x37\x76\xd3\x99\x1b\xe0\xcf\xe7\x4f\x91\x5f\xfa\xf7\xaf\x17\x97\x1b\xcd\x3f\x34\xef\x9b\x8a\x0f\x3c\x0e\x45\x13\x0e\x76\xdd\x3e\xd3\xe8\x3a\xac\xf9\x20\x39\x6d\xa7\xfd\x0f\x60\x85\x05\xe4\x77\x86\x0e\x9d\x35\x14\x3b\x2d\x75\xd1\x7c\x49\x3c\x55\xfb\xc8\x99\x8b\xb9\xcf\x70\x8b\x63\x7f\xf8\x3d\xec\x85\x97\x5f\x09\xae\x05\x2f\x90\x67\xc1\x2d\xb7\x7e\xe9\x4b\x5f\xfa\x52\x93\x05\x31\xf2\xe7\x37\xc3\xe7\xef\x80\x3b\xef\x8d\xdf\x2a\x9d\x06\xc7\x5e\x7c\x11\x5c\xd6\xbf\xc4\xe3\x81\x52\x9b\x07\xcc\x5e\x8c\x37\x0a\xbe\xdd\x91\xa2\xf6\x7f\x1e\xc3\x99\x8c\xf1\x46\x36\xba\x87\xce\xee\x61\xfa\x5a\x44\x34\xc7\xfa\xb9\x5f\xf6\xb4\xf3\x84\x7a\x36\xb3\x47\xeb\xb7\x62\xb6\xb4\x82\xc1\x6f\x09\x8d\xcb\xfa\xe3\x4e\xb2\x51\x3b\x61\xfd\x4f\xda\xbc\x41\x1c\x46\x58\x28\x6f\x8e\x86\x2c\x23\x3f\xcf\xcb\x22\xa2\x1f\x55\xf0\xe8\xeb\xe9\x73\x8f\x42\xda\x3b\xe0\x88\xe8\xb8\x17\x28\x8f\x6a\xb6\xe3\x40\xdb\x6e\x8a\x15\xac\x86\xcc\x6b\x0c\x0b\x64\xeb\x90\x62\x01\x85\xe5\x55\x45\x98\xb2\x1b\x5d\x95\x19\xd6\x8a\xe9\x4d\xb5\x11\x97\x0e\x59\x16\x6e\xc2\x36\x94\x3a\x2c\xcb\x80\x8d\xa5\x41\x1e\xe4\x05\x58\x83\x55\x4a\xab\x49\x2a\x2f\x70\xb0\x54\xad\x01\x81\xe3\x79\x49\x71\x74\xb9\x04\xab\x36\x03\x1a\x12\x92\xc2\x52\x43\x94\x38\x3d\xcf\xe7\x79\x5d\x62\x02\x3a\x46\x38\xdb\xf9\xc0\x2c\x39\x80\xc9\x93\x6d\x3f\x0b\xc9\x0d\x3d\x95\x1b\x45\x39\xda\x87\x6e\xc6\xf8\x10\xd9\x38\xae\x9c\x5c\x87\xee\xcc\xa2\x9c\x9f\xe8\x6e\x5e\x60\x51\x46\xf0\x36\x27\x30\x64\xda\xf6\xe5\xa0\x57\xe3\xa4\x0f\xd5\x39\x89\x28\x32\xcc\x60\x96\x63\xbc\x15\xe3\x9b\x25\x72\xea\xed\x02\x59\x6b\x96\x64\x4a\x78\xbb\x68\x00\x09\x5a\x60\x1a\x48\x3a\x90\x0e\x59\x71\xeb\x90\x84\x54\x99\xff\x71\xdd\x8f\x92\x00\xe4\x58\x12\xb0\x80\xe5\x60\x15\x56\xa9\xbc\x20\xa8\x82\xa2\x08\xb0\x0e\x75\xb9\xe0\xfc\x81\x96\xad\x80\x9a\x00\x1b\x42\x8b\x10\xaa\x8a\xc4\x68\x0c\x9f\xe7\x35\x3e\xef\xd2\xb1\x97\xd3\xc4\xa5\xef\xfd\x9f\xc3\x64\x02\x66\x1b\x04\xf9\x96\xda\x67\x45\xe8\xa5\xf9\xfe\xf1\xce\x3a\x61\xe7\xe9\x98\xce\x41\xf5\xd2\x77\xbe\x86\xe8\x1b\xcf\x97\x8d\xce\x50\x77\xff\xbb\x4e\xa4\xa8\x9d\x35\xe4\xb4\x25\xfd\xfa\x68\xc4\x1c\x0f\xb3\x7d\xc8\xde\x3a\xc3\xf1\x40\x1c\x53\xb1\x67\x9e\x23\x2e\x48\xc7\x03\x59\xe6\x9b\x8f\x2e\x8c\xf2\x60\xb3\xfc\x38\xcc\xaa\x8f\x69\x3c\x6c\xc0\x02\xa9\xd7\xcd\x16\x91\xb4\x54\x9e\x07\x56\x97\xe1\xc0\x4c\xd2\xaa\x1b\xb0\x96\xd4\x55\x9e\x03\x85\x19\x36\xae\x1d\xd2\xac\x2e\x6e\xa6\xec\x7f\x40\x52\x9e\x82\x8a\x04\x14\xb2\x0e\x58\x20\x09\xd0\x80\x25\x4a\x55\x99\xb4\xaa\x35\x1a\x70\x4a\x93\xd9\xf2\x74\x85\x66\x3d\x40\x41\x96\x18\xab\x68\xd1\xb6\xd8\xac\x92\x9c\x0c\xcb\x12\x2c\xcb\xb0\xa1\x88\x9c\x91\xe7\x33\x82\x21\x33\x0e\x3d\xad\x45\xb8\xb9\x09\xf9\xa1\x73\x88\xe3\xa2\x2b\x76\xec\xcb\x05\x7d\xdd\xf3\xc0\xdc\xf6\x99\xe5\x02\xec\x67\x10\xbc\x54\x78\x67\x7e\x6c\x50\x8b\xdf\x7e\x91\x7c\xd5\x30\xc0\x01\x23\x63\x6a\xb2\xa6\xf1\xa2\x56\x6a\xfe\x10\xfb\x8f\xf8\xd7\x1d\x4e\x2d\xc7\x2f\x39\x34\xb1\xb5\xeb\xe8\x99\x3f\xfb\x9f\xbf\xad\xf9\x3e\x3c\x73\x15\x78\x98\xfc\x1a\x38\x0b\x9c\xb5\x02\x7e\x07\xfe\x88\x3a\xfe\x91\xd7\x6c\x19\x7c\x9d\xe1\x78\x51\x15\x79\x89\x97\xb5\x02\xf6\x33\x9c\x81\x5f\x7d\xf1\x45\xb0\xea\x3f\xf6\xc5\xe0\xf7\x97\xc2\xff\x9e\x0f\xff\x7b\xfe\x2f\x6f\x5e\xb9\xe2\xc9\xe3\x56\xf4\xae\x78\x78\x65\x6f\x9b\x47\x85\x40\x4e\x7d\x23\x6a\xcb\xb8\x35\xfd\x03\xde\x55\xfc\x3a\x74\x7b\xd0\xfb\xe8\xa1\x9b\xb0\xf6\xfb\x1c\xba\xdd\x62\x10\x04\xbd\xf2\xf1\xb3\x2f\x21\x96\x7d\x3f\xa4\x77\x15\x7f\x8c\xa7\xbb\xb0\xdf\xd1\x29\xce\x87\xbb\x79\x65\x88\xc3\x08\xa1\x75\x42\x42\xa5\xee\x0e\xc5\x03\x72\x5e\x36\x4f\x0f\xb7\x3d\xde\x27\xde\xd5\xf6\x48\x62\x41\xe2\x23\x62\x01\x4a\x86\xd5\x93\xed\xe9\x8a\x7b\x59\x5a\xe2\x5e\x96\x16\xf7\x91\x89\x10\x97\x0f\x99\x66\x17\x3b\x53\xf1\x3f\xb1\x34\x10\x41\x5a\x86\xd3\xb0\x04\x25\x71\x0a\x2a\x3c\x30\x19\x53\x10\x4c\x5e\x52\x01\x0b\x8c\x58\x05\xca\x24\x63\x57\x41\x1a\xa4\xc5\xe9\xba\x55\x82\xd3\xd2\x74\x19\x4a\x64\x1e\x2a\x26\x69\xa1\x87\x6b\x3a\xf8\xc6\xd9\x7f\x3d\xfd\xaf\xa7\x7f\xeb\x94\x33\xe4\xb3\x17\x5f\x7b\xc5\xe5\x8b\xbf\xbc\x80\xda\x9e\x7f\xf4\x7a\xfb\x76\xf0\xda\x85\x67\x5f\x08\x88\xbf\xc0\x75\x37\xdd\x7d\xf8\xc0\x0d\x77\x7f\xfa\xcc\xff\x03\x03\xcf\xdc\x74\xd3\xd9\x8f\xdc\x7d\xd3\x0d\xdb\x82\xfa\xb1\x5a\x2a\xf7\xb4\x14\xd2\x3b\xbc\xbf\x0f\x3b\xd6\x22\x5b\xe0\x09\x0c\x77\x52\x7b\xdf\x76\xf8\xef\x28\x56\xb6\xb8\xc4\xa4\xc3\xc7\xdb\x2e\x7b\x0f\xd2\x6b\xe8\x30\xe4\x70\xe2\x71\x44\xdb\xb7\x05\x38\x75\x24\xe6\x2c\x3d\xd3\x3d\x0f\x1d\xbf\xf7\xf5\xcf\x5b\xe0\xfd\xeb\xf8\xe7\xff\x2f\x74\x1d\xfb\x99\x61\xd8\x3b\x41\x09\xf2\x5a\xb1\x48\xb6\xbc\x1f\x66\x6e\xa1\x6e\x7c\x7b\x3d\xb5\x76\xdb\xa1\x6b\xb6\xbf\x19\x67\x0e\x55\x37\xc5\x0e\x35\x29\xff\xf3\xa7\xeb\xbf\x05\x85\xb3\xc0\xfd\xe4\x28\x38\x15\x2c\x5b\x0e\x7f\x04\x5f\xa1\x6e\xb3\xaf\x06\x06\x2c\x28\xaa\xe2\xfc\x05\x16\xde\x07\x07\xe1\xfe\x6a\x15\x9c\xf7\x17\xfb\x32\x30\xf5\x31\xf8\xf6\x79\xf0\xed\xf3\x7e\x71\xd3\xca\xe5\x4f\x1e\xb7\x2c\xb7\xdc\xa3\xe1\x68\x2e\x91\x4f\x45\xed\x50\x4f\xcf\xb0\x9d\x65\x66\x70\xbe\x1e\xd8\x87\xe3\x6b\xde\xcd\x6e\xdd\x76\x36\xc6\x0b\x26\x55\x08\x78\xc1\xb7\x8b\x2d\xdf\xf7\x1e\x47\x6f\x6d\xb7\x3c\x1e\xf2\x33\xbc\x7b\x25\x98\xcd\xe1\xc6\xa1\xa4\xc0\x0f\x40\xfe\x07\x71\x04\x51\x71\x63\x13\x21\x3e\xf0\xf7\xcc\xf1\x7b\x2f\x20\x2e\x0d\xd7\x60\xed\xf1\xdd\xb1\x45\xee\x53\xac\x58\x94\x5b\x30\x57\xcd\x8d\x20\xcd\x23\x63\x58\x71\xd6\x58\xa2\x37\x35\x37\x35\x37\x35\x27\x4b\xfd\x36\x46\x35\x0f\x6d\x00\x3f\x83\x1f\x09\x3e\x0f\xde\x7a\xd5\x55\x1f\x5b\xdd\xba\xeb\xd6\x0d\x57\x6d\xb8\x2f\x76\x64\xf3\x1f\x9b\xc0\x2f\x60\x6f\xf0\x79\xf8\xd6\x6b\xae\xb9\x74\x0d\x84\xea\xad\x9b\xae\xd9\x14\xb3\x8d\x4c\x1e\xd4\x95\xbc\xa1\x96\x54\x43\xd5\x2a\x72\x55\x93\x05\x4e\x2b\x8b\xbc\x2c\x66\x60\x23\x4d\x96\x6d\x15\x54\x1c\x0d\xd8\xe0\xab\x79\x56\x62\xf3\x12\x2f\xb2\x32\x43\x29\xf6\xe7\xc0\x77\x85\x96\xf0\x5f\xfe\xa5\x3c\x7b\x0d\xdb\x2b\xf1\x97\xb1\xf2\xa2\x58\x17\x63\xea\x26\x24\x60\xb9\x5a\x34\xcc\x6a\xcd\xd0\xcd\x46\x0d\xa4\x55\x09\x28\x32\x2c\x4d\x81\x24\x50\xd9\xb0\x4d\x3d\x7e\x43\x68\x0f\x93\xad\x4b\x93\x04\x75\x8b\xb3\x87\xa5\x23\xe8\x55\xfb\x74\x90\x68\xbd\xb5\xf4\xa3\x5c\x3b\xce\xab\x05\xf6\xc5\x2f\xb1\x7d\xd1\xdb\xf0\x21\x39\x64\xbf\xe8\x3e\x3d\x0c\xad\xc1\xe8\xc1\xcd\xd9\xe3\xb6\x5f\x8d\xb5\x57\xda\xed\x83\x77\xfc\xae\xdf\xc3\xa7\x72\x5b\x9f\x0b\xf1\xbc\x16\xbc\xb1\x77\xcf\xa0\x6e\xc0\xe2\xe3\xa6\xc3\xf3\x7b\xff\x82\xe0\xd7\x77\xb2\xa7\x52\xd4\xa6\x03\xa1\xfe\x83\xb7\xc7\x41\xff\x17\xa0\x9a\xce\xf7\xd2\xab\x27\x17\xbd\x97\x18\x04\x1c\x41\xaf\x7a\x6a\x2b\xf1\x4d\x22\xbe\xb4\x8b\x73\xc7\xc9\x27\x8a\xe8\x2d\xb7\x3b\xfe\x27\x42\x7c\xa0\xa6\x72\x5b\xd1\x7d\xa9\x2d\x46\x60\x1b\x3b\xfd\xe9\xa9\xdc\x3e\x54\x23\xea\xc9\x3f\x11\x7b\x88\xc3\x96\x66\x57\x6c\x0b\x6c\xb7\x36\x0e\xaf\xc3\xec\x13\x64\x1b\xae\x43\xb9\x10\x86\xae\x0d\xec\xe9\x4c\xc2\x74\x78\x61\xcb\x63\x08\x2e\x45\x7d\xe2\x3d\xa7\xa0\xb5\xac\x08\xd6\xe8\xbd\x11\x75\x79\x79\xcf\xd2\x00\x57\x8e\xaf\xdf\xc6\x95\x7f\xef\x3e\xd7\x1a\x48\xbc\x48\xdd\xe2\xac\xfd\x75\x62\xc9\x01\x67\xed\xd6\x59\xc4\x8f\x5b\x6f\x9d\x72\x33\xd7\xe6\x69\x25\x95\xdb\x73\x1b\xca\x2f\x8b\x38\x7b\x8f\x82\xc9\x07\xcd\xd5\x71\xa9\x76\xcd\x78\xc9\xdf\x77\xb4\x7e\x6a\xdf\x67\x82\x35\x2e\x4f\xdc\x45\xdd\xe9\xad\x71\xe5\x43\x1f\x5d\xff\xd6\x69\x4f\x7a\x35\xd4\x4d\x34\xbf\x3c\xb2\x34\x8e\xe9\x54\x97\xb2\x7b\x00\x74\x81\xc4\xfc\x05\x94\x61\x35\x45\x8b\xa4\xad\x24\x54\x21\xa7\x80\x12\x90\x92\x80\x01\x12\x10\x35\x58\x85\x0a\x95\x9f\x61\xbb\x98\x99\x6a\x57\x05\x9a\x50\xa4\x61\x11\xb2\x86\xa1\x01\x03\xb0\x34\x64\xca\x2d\x42\x6f\x34\xd0\x78\x46\x8b\x4d\xb0\xc8\x56\x7e\x3f\x91\x21\x08\xe0\x3e\xe9\x46\x1f\xc7\x48\x46\xe3\x3a\xc3\xf6\x0f\x20\x95\xba\xa0\x8b\x26\x4d\x6b\xa6\x6e\x91\x69\x2b\x96\x6e\x4a\x56\xb2\x39\xa5\x80\x22\xe0\x92\x40\x04\x0c\xc8\x6b\x8e\xdd\x16\x67\xab\xcd\x02\x59\xb6\xb9\x98\x48\xd2\x05\xd3\x6e\xc0\x0a\x0d\xe9\x92\x21\x82\x4c\x2d\xd9\xb0\xaa\x7a\xb5\x1a\x8c\x2d\xa1\xb8\xdd\xf1\x44\xbe\xbd\x56\x14\xb1\x8e\xf7\xce\x9f\xe3\xc5\xb2\xb1\x39\xa0\x60\xff\x02\xaa\x60\x35\x59\x8b\xd4\x65\xde\x9e\x2a\xc2\x86\x02\xf4\x52\x21\xc3\x90\xaa\x28\xc2\x8a\x95\x6c\x96\x64\x50\x06\x02\x32\xb5\x01\xab\xc1\x3a\x34\xbb\x84\xa6\x42\x36\xec\x64\xcc\xd0\xf4\x92\xae\x56\x40\x26\xcf\xb2\x9a\xa5\xc0\x29\x77\x66\x9a\x04\x32\x53\x49\x58\x54\x2d\xbd\x60\xb9\x7b\x54\x68\x31\x09\xde\xb1\x41\x1e\x7f\x8c\x2e\xa7\xa8\x89\xf6\xdd\x62\x26\x61\x3a\xf0\x09\x74\xd7\x70\x4b\x3b\xbf\xad\x77\xe6\xb7\xdb\x8c\x9c\xf9\x31\xae\x3f\x39\x81\x5e\xec\x4f\xf8\xf9\xd0\x9d\xfe\xd1\x9d\xc8\x09\xb7\xbe\xe9\xd5\xa1\xb8\xb0\x9a\xca\xed\x47\xf5\x55\x76\x9b\x98\x1d\x5e\x70\x74\xc4\x6e\x94\x6f\x6a\x82\x0d\x64\x11\xe3\xe5\xc2\xeb\x47\xf7\x4d\x51\xc5\x35\xa7\x4f\x4f\x7e\xa1\x7b\x94\x05\xf4\xae\x7b\xe8\x2a\x6c\x0c\x37\x96\x8c\xee\x69\xee\xde\x10\x8c\xc1\xb8\x7e\xd6\xfa\xb2\xdf\x4b\xd0\x0f\xe2\xb1\x71\x54\x5b\x68\xe8\xe3\x18\x7f\xa3\xf8\xd8\xde\xef\x84\xe2\x63\x8a\xff\x86\x74\x02\xe5\x30\xd8\xf5\x3b\x0c\x6e\x50\x19\x1f\x3e\xe4\xde\x6f\x49\x22\xde\x32\x42\x67\x00\xf3\x90\x26\x23\xe6\x64\xe7\x64\x63\x28\x46\x3b\x27\xbb\x60\x30\x9b\x58\x90\xc8\x0e\x82\xc1\x6c\xe2\x43\x60\x30\xeb\x53\x4b\x7c\x2e\x89\xf8\xc2\x25\x4f\x05\x70\xf9\xae\x4a\x1e\xa4\x61\x2d\x33\x93\x61\x60\x2d\x2e\xa7\xa1\x91\x81\xc9\x34\xd0\x32\xa0\x4c\x43\x3d\x6d\xd7\x81\x96\x86\x5a\x97\x60\x36\xd3\x26\x29\x14\x58\x68\x42\x99\x03\x0a\x60\x01\x07\x68\xc0\x08\xb0\x0c\xa7\xe2\x19\x90\x81\x53\x06\x9c\x02\x19\xc3\x74\xfe\x40\xce\xf9\x4b\xb0\x8b\xa0\x0c\x19\x52\xaa\xa5\xe1\x14\x2c\xf1\x16\x0b\x08\x81\x2f\x9a\x15\x81\x20\x12\xbe\x2c\x0a\xf4\xf1\x09\x44\x1f\xb1\x04\x69\xe2\xbe\xa3\xe6\xfa\x41\xe8\xfe\xb9\xe4\xbc\xe3\x09\x3f\x02\xed\xbd\x97\xce\xc6\xfd\xd5\xf4\x21\x2e\x1f\x98\x8b\xbe\x35\xba\x24\x33\x09\xaa\x90\x4d\xeb\x22\xc7\x98\x79\x4b\x81\xa5\xcc\x8c\x19\x9f\x12\x59\x9d\x11\x66\xf2\x8e\x27\x9a\x8c\x49\x4d\x2b\x26\x9b\x76\xc5\x04\xb2\x09\xeb\xd0\xe2\x00\x57\x9b\xaa\x14\x1c\x5f\x41\x02\x69\x53\x33\xec\x02\xb4\x1a\xd5\x3c\xd4\xc8\x32\x59\x01\x96\x20\x0a\xa2\x08\x79\x4d\xd4\x44\xbb\x02\x8a\x90\x23\x79\xc7\xba\xad\x65\xf4\xcc\x54\x5a\xd2\x34\x5d\xc2\x6b\xb5\x6c\x41\x35\x8b\x27\x96\x04\x31\x25\x26\xa1\x39\x34\xe5\xd2\xed\x81\x17\x31\x3a\x44\x3a\xd1\xa5\xf3\x21\x3c\x9f\xb5\xfb\xae\xf2\xec\x36\x3d\x13\x14\xa2\x35\x93\xd2\x02\x8b\xb3\x97\x58\xe8\x9e\xb1\x75\x07\x7e\xb9\x7b\xce\x16\x77\xec\xf2\xd0\x5e\x7f\x04\xb8\x7b\x1d\x2b\x16\x48\xc1\x2e\xc6\xb8\x46\x2d\xc6\xd9\x05\x52\x84\xbc\x63\x5f\x92\x12\xfa\x9b\xb5\x9a\x99\x02\x29\x58\x2c\xd4\x21\xc7\x81\x22\x60\x01\x0f\x58\xc0\x38\x12\xca\xa4\x34\x0d\xf2\xba\xae\xeb\xa0\x04\xab\x85\x42\xc1\xe6\xec\x2a\x28\x40\x96\x14\xea\x34\x9c\x82\x35\x56\xe7\xa6\x19\xc5\xd0\x4d\xb3\xcd\x93\xe9\x54\x6e\xd7\x77\x11\x3d\xbf\x10\xe2\x3d\x87\x5f\xbe\x15\xe2\x17\x47\xae\xa1\xba\x57\x7b\xd2\xa8\xde\xec\xff\x21\x8c\x5c\x1e\xc4\xd9\x55\x4a\xf5\xa2\xec\x8b\xd0\x1b\xfa\xd3\x09\x9e\x38\x1f\xcf\xd9\xeb\xe0\x80\xa4\x4e\xf0\x97\xed\xa6\xed\x9d\x83\x87\x28\xfa\xb3\x47\x25\xe6\x0d\xf4\x67\x13\x8e\x19\x47\x2d\xe8\xc9\xf6\xa2\xf3\x0d\xd0\x47\x06\xa6\x77\x0d\xd4\x2d\x90\xb4\x40\x05\xb2\xa4\x4c\x8b\x22\x5f\x68\x9a\x05\x49\x95\x00\xa7\xc3\x02\x07\x4c\x48\x93\x86\xf3\x3d\x03\x19\xd8\xa0\x8b\x19\x38\x4d\x17\xc9\x0c\xb4\x78\x92\x07\x19\x9a\x67\xd3\xe9\x64\x73\xaa\x40\x37\x0b\x62\x2c\x09\x08\xa0\x00\x8e\x83\x16\x2c\xc4\xa7\x10\x3b\x28\x1a\x6c\xe8\x50\x04\x0a\xd4\x81\xc9\xe6\x75\x45\x07\x86\xe6\xfc\x81\xaa\xc6\x71\x1c\xa7\xc1\x52\x59\x92\xca\x42\x32\x23\x42\xd5\x2e\xb3\x46\xa6\x28\xa8\xa6\xc1\xbb\x34\xc4\xba\x35\x46\x5d\xfc\xec\x76\x33\x29\x88\x01\xbd\xb8\xf2\x6c\x49\x28\x96\xdd\xae\x3b\x85\xe2\x69\x63\x6f\x62\x7b\xe0\xc6\xf7\x86\x51\x5f\xe8\x56\xb2\x43\x83\x9e\x8c\x55\x1c\x59\x3d\x7e\x42\x68\x7f\x82\x1c\xeb\xbb\x50\x3e\xe0\xbd\xdf\x09\x6c\x03\xcf\x66\xd8\x85\xee\x63\x8f\x0f\x63\x7a\x1c\xbd\x01\x19\xdf\xec\x8c\x31\x8e\x24\xfc\xd0\x65\x81\x4c\x2b\xb4\x65\xdd\x7e\xbc\xfe\x69\x10\x47\xc4\x64\xac\x84\x68\x46\x4d\xe5\x0a\x6f\x86\xe6\x14\xdc\x23\x72\xfb\x29\xdc\x80\xd9\x8e\x25\x54\xcb\xfc\xfb\x21\xb9\xef\xe6\x1d\x0f\xda\x07\xf1\x4e\x29\x88\x11\x6f\x08\xc5\x88\x65\x7f\xdc\x91\xff\xfa\x18\x0a\x70\x51\x68\xcb\xf0\x20\x76\x1c\x9c\x4f\xba\xfd\x0c\x9f\x8b\x8d\xeb\xf2\x33\x1a\xd7\xbd\xd7\x44\x74\xa1\x9c\xd9\x02\xa5\x22\x99\x77\x0a\xaa\x85\xe0\x46\xd9\xe6\xb5\xe3\x20\x83\xd9\xee\x20\x52\xd9\x9d\xc5\xe1\x51\xfe\x9e\xeb\x9d\xed\x92\x45\x8b\xac\xd4\x19\x4d\x57\x24\x4d\xd4\x04\x55\x87\x95\x18\x61\x1e\xd2\xcd\x58\x12\x36\x18\x4d\x93\x25\x9d\x33\x04\x4d\x83\x8d\x38\x6b\x36\x4b\x26\x49\x58\x0c\xd4\xa1\xc8\x03\x0d\x08\x0d\x20\x00\x5e\x84\x25\x58\x88\x57\x8a\x45\x83\xe7\x24\x59\x14\x24\x49\x11\x0a\x50\x83\xa5\x4a\x0d\x88\x40\x73\x81\x82\xa2\x88\x96\xad\xd9\xd3\xc0\x80\x22\xc9\xd4\x32\xb0\x01\xab\xbc\xc9\x34\x18\xc1\x32\x8a\x62\xa0\x7f\x8b\xed\x75\x6f\x19\xf2\xe4\x58\xc1\xad\x2b\xe9\xc5\x19\x7b\x91\xcf\xec\x78\xcc\x41\x64\xd6\x35\x69\xc2\x91\xd9\xf6\x7a\xa9\x90\x3c\xb3\x4a\x22\x5b\xe0\x78\x60\x15\x0e\x59\x05\xa0\xb3\xbc\x21\x71\x55\xc8\x77\xa5\x67\xa6\x0d\xb2\x6e\xd3\xb1\x69\x64\xf3\xe5\x4d\x06\x1a\x50\x10\x80\x09\x78\x40\x38\x6b\x65\xa1\xe1\x08\x35\x58\x51\x75\x46\x15\xa1\x02\x88\x16\x01\x0c\x49\xe0\x15\xbd\x0e\x65\xcd\x84\x3a\x64\x01\x0f\x2d\x30\x55\xcb\x4c\xc1\x06\x6b\xe4\x6b\xb4\x64\xe8\x96\x18\xec\xa9\xe4\xd0\x98\xbb\xb6\x11\xff\x9c\xe5\x53\xad\x4c\xe2\x14\xea\xf6\xd4\x9a\xf1\xe1\xd6\x5f\x62\x1a\x47\x9c\xda\x4a\xad\x7a\xe4\x1b\xad\xbf\x34\x2f\xe4\x88\x15\xa7\x07\x74\x82\xe2\xe2\x0e\x9d\xa4\xda\x6f\xf2\x84\x56\xda\xa5\x7f\x2f\x66\x7b\x69\x88\xf7\x1c\xba\x5d\x1a\xd2\x2b\x81\xbe\x71\xe9\x2d\x88\x4b\xf2\x3e\xaf\x7a\x71\x8e\xaf\x60\x74\x78\x1b\xb2\xc3\x58\x94\x37\xf5\xd9\x0f\xb5\x6d\x18\x37\xd7\xdc\xd1\xc8\x1e\x42\xda\x68\xe3\x64\x30\x36\xe6\xc7\x07\x7c\x1f\xa1\xf5\x2d\x78\x6d\x2a\x0b\x3b\x3f\xf9\xff\x38\x7b\x13\xf8\x36\x8a\xeb\x71\x7c\x66\x65\xad\x04\x14\x58\x6f\x48\x22\x6e\x09\x27\xb2\x42\x09\x11\xb8\x4e\x94\x7b\xb9\xe2\xe5\x16\xe1\x12\xb7\xb8\x12\xb5\x50\x2a\xae\x76\x29\x01\x04\x85\xb2\x0e\x47\x17\x88\x9d\x4d\x9c\xc4\x9b\xf8\x92\x9d\x4b\x3e\x42\x05\xa5\x20\x28\xed\xd7\xa5\x50\x4c\xa1\xd4\xbf\x96\xb6\x2e\xed\x97\xaf\x5b\xa0\x88\xb6\x50\x13\x6b\x47\xff\xcf\xce\x5e\xb3\x2b\x29\x2d\xff\xef\xf7\x13\x92\x3e\x8f\xdf\xbc\x79\xf3\xce\xd9\x99\xf7\x2e\xb5\xf2\xf8\x98\x1e\x3f\xb5\xbd\x83\xed\x04\x47\xd8\x0f\x89\xc8\x2d\x2e\x21\x7c\x66\xd6\x8e\x01\xd7\x5f\x4c\xc4\x5b\x18\xbe\x1e\xdf\xd7\x72\xd8\x02\x7c\x07\xc0\x90\x35\xd1\xc1\x23\xc9\xa2\xf3\x51\x6b\x5e\x67\x5e\xb6\xda\x61\x33\xad\xfc\x63\x3d\xbe\x17\x04\x3c\x46\xfc\x27\x80\xb9\x7a\x94\x05\x89\x3a\xf1\xe4\xfd\xbb\xfa\x10\x8e\x45\x58\xfd\x5c\x67\xc6\x6c\xca\xd7\xc8\x42\x76\x86\x8f\xf2\xc0\x00\x25\x29\x94\xa2\x26\x3d\xbc\x3a\x9a\xc8\x48\x99\xa0\x28\x45\x22\x48\x41\x93\x68\x2a\x0e\xc1\x98\x9a\xf7\xc4\xd4\x74\x46\x54\x94\x4c\xc1\x1b\xc9\xa5\xa5\x54\xce\x9b\x2f\x14\x64\x34\x29\x97\x0a\x42\x32\x98\x8d\x04\x39\x4f\x40\x9d\x44\x89\xb4\x94\x86\x12\x54\x64\x18\x50\xc7\xe3\x48\x1a\x4b\x43\x00\x19\x4d\xfd\xb4\x6c\x82\xb1\xfa\xb3\x6a\xb9\xe5\x79\xf8\xfb\xcd\x47\x8e\xb3\x1a\x2b\x4e\x6e\xfb\xb5\x05\x37\xee\x54\xf5\x5e\xe3\x82\x1b\xf2\xd5\x7b\xb5\x03\xce\xe3\xfb\x92\x19\x36\x3c\x8c\xeb\xc9\xb5\xbd\x4b\xf0\xb4\x13\xe7\xa1\xef\x6a\xb9\xeb\xc0\x32\xf0\x26\x00\x4b\x42\x9c\xf9\x3b\xf8\xdc\xb2\xed\x37\xae\xdf\x31\xcf\xe4\xc6\x1c\x70\xeb\x2e\xa8\xde\x03\x9a\x98\xdb\x38\xff\xec\xc6\xef\xbe\xba\xc9\xde\xe5\x58\xee\xba\xf1\xbb\xa8\xed\x38\xd7\xc5\xf7\xe3\xf5\x73\x9f\x88\xbd\x67\xd6\xbe\xcd\x9a\x07\x7d\x0d\xc1\x39\x9a\x41\x35\xda\x98\xe9\x85\xb9\xec\xad\xf2\x97\xa6\xa8\x9c\x1a\x9f\x80\x49\x18\x88\x4d\x20\xa0\x16\x95\xa4\x2c\xc0\x48\x4c\x09\xc4\x94\xa2\xea\xa7\xa6\xd4\xb4\x57\x2c\x16\x95\xa2\xb6\x4f\x48\x8c\x64\xf3\xd9\xf1\x9c\x00\x13\x70\x3c\x58\xc8\xe6\x79\x0f\x90\x8b\xc0\xb8\x8f\x9e\xc0\x77\x05\x0e\x07\x33\xc1\x57\xf1\xd9\x6b\x53\xbd\x41\x07\x96\x14\x3d\xb2\x9d\x03\x67\x03\xaf\x46\x56\xf0\x24\xd8\x70\xc2\xe1\xb0\x71\x05\x6c\x3a\x15\x06\x28\x45\xc1\xa5\xbd\x02\x5f\x44\x3c\x41\x35\x59\xcc\x4a\x69\x59\x81\x31\x38\x09\x79\x01\x15\x51\xb0\x40\xf9\x61\x2a\xaa\x4e\x22\x80\x8a\xc1\x68\x22\x9f\x99\x94\x63\xbc\x37\xa3\x59\x34\x45\xef\x81\x86\x22\x82\x22\xe6\x05\xc4\xe7\x61\x32\x83\xc6\x27\x92\xf9\x78\x3e\x9e\xcd\x8c\x25\x1c\x3e\x7c\xe8\x24\x2c\xf3\x71\xb7\x6f\x37\xe0\x17\xd6\x80\x5f\xe0\x86\xef\x5e\x8d\xcf\x8b\x4e\xaa\x31\xfe\xfc\xea\xf0\xa1\x93\x2b\xe0\xf8\xce\xfa\xfa\xf3\x6a\xc0\xcf\x35\xe1\x68\xd2\xa7\xd0\x3c\xb3\xb6\x2f\x09\x17\x82\x47\x9b\xe7\xc4\xae\x61\xb5\xd9\x73\x55\x7e\xc7\x3c\x6f\xbc\xb5\x7c\xb8\xef\x55\xfa\x42\x26\x3c\x34\x7f\xce\x6f\x98\x96\xe1\x8f\xca\x4f\x83\x97\x4e\xfb\xdf\x66\xba\xca\xef\xe8\x75\xcc\x29\x13\x0e\x8e\x00\xcb\xf1\xad\x31\xfc\x7d\x46\x73\x4b\x07\x43\x5f\xe3\x42\xf6\x48\x38\xc7\x4b\x9a\x05\x53\xc4\x42\xba\x88\xb1\xb6\x88\xd5\x87\x7c\x91\xf8\x14\xca\x51\x89\xbc\x8c\xa6\xfc\x7c\x4a\x88\xc7\xa1\xb4\x3f\x07\x83\x0a\x0c\xa0\x49\x18\x47\x63\xda\xde\x65\x29\x11\xe6\xa2\x28\xa3\x2a\x88\x97\xa2\xbc\x28\x71\x52\x20\x98\x48\x22\x01\x26\xd1\x04\xbd\x3c\x93\x88\x4c\x88\xa5\x51\x8f\x96\x8c\x8d\x66\x92\x49\xc8\x43\x05\x26\x23\x37\x4f\x4d\x49\x5a\x3c\x0d\x24\x24\xf0\x8a\x94\x1b\x97\x32\x30\x48\xf9\x03\xa3\xd9\x0c\x47\x8d\x4a\x90\xfc\x5e\x8e\xd7\xe8\x07\x4c\xcb\xbe\x17\xc0\x25\xe0\xd3\x65\x1d\xcd\x2f\x55\x59\x3f\xef\xe0\xbf\xc8\x86\x87\x70\x6c\x38\x34\x9f\x80\x8f\x5b\xe3\x5b\x5a\xc7\xe1\xed\x00\x2c\x3a\x9c\xd3\x62\x1c\xed\x67\xcf\xd2\x02\xfe\x6e\xfe\x35\x90\xd0\x6f\xdb\x59\xdf\xca\xff\x5b\x76\xcd\x9d\xed\x6b\x32\x1f\x50\xd9\xed\xc7\xcc\x72\xf1\x0b\x17\x35\xf8\x1a\x17\xd6\xfd\x49\xca\x8d\x66\xc6\xa9\xb6\x4c\x3c\xcb\x0b\xfb\x9f\xfe\x32\xcc\xf4\xbc\xf8\xd8\x29\xcf\xf8\x9f\xf6\x43\x2f\x9a\xf6\x33\xf0\x32\xb4\x69\xe7\x33\xdf\xf8\xee\xfa\x73\x1e\xba\xe3\x99\xd3\xd0\x0e\xf8\x6d\xe6\xa0\x57\x6f\x58\xff\x10\x7c\x85\x9f\xca\x08\xd2\x4b\x72\x8e\xcb\x49\x9e\xf2\x7f\xe2\xf3\xfb\xd1\x4d\xad\xd9\x6c\xab\xb8\x29\xdd\x3a\x38\xde\xfa\x73\x65\x74\xfb\x3d\xd9\x4f\x5b\x53\xdb\x7f\x1e\xff\x79\x75\x79\x6e\xa9\x21\xe7\xab\x08\xf8\xb3\xb8\xf7\xd3\x7c\x00\xd8\x96\xce\x4b\x3c\x0b\xc1\x38\x07\x16\xf5\x19\x3f\xeb\xb2\x74\xa9\x65\x73\x3b\xf8\x2b\xf8\x67\x6c\xcf\xc2\x33\xdc\x7a\xc6\xd2\xd2\x1f\x2e\xf8\xa0\xea\x3c\x67\x11\xf3\xe8\x67\xa0\x3a\xfc\x4c\x07\x5d\x36\xfc\x8c\x1a\xf4\x9e\x5e\x1d\x3e\xf0\x46\x8d\xf1\xa7\xb9\xe1\xfd\x77\x54\xc8\x17\x39\x9e\xab\x01\x5f\x09\x6c\xd9\xd6\xfb\xdb\xe2\x8e\x56\xeb\x57\xb8\xe1\x3b\xbf\x8f\x63\xb6\x4f\x6a\x8c\x5f\x5e\x03\xff\xb2\x1a\xe3\x97\x3a\xc7\x33\x6b\xb7\x1d\x5b\xfe\x0d\xf8\xe5\xca\xee\x45\xd7\xb3\x78\x15\xee\xdf\x61\x5b\x72\x9a\x4d\x79\x87\x03\xb1\x1f\x55\x99\x67\x49\xd5\xf9\x5b\xba\xd7\x97\x7f\x0e\x24\xae\xbc\xe4\x5b\x16\x3e\xd1\xa2\x61\xb1\x83\xb6\x8c\x05\x8f\x11\xb8\xf6\xd0\x22\xb3\xb6\xe7\x58\xf0\x0f\x38\x2b\xb6\xaa\xf9\x72\x8b\xb6\x75\xe5\xc3\x7d\x1f\xd0\x17\x6a\xf2\xf1\xb5\xdf\x30\x2d\x23\x9b\xc1\x5f\xc1\xc0\x92\x3f\x2c\xec\xa9\xa4\xad\xa7\xc3\x4d\x5b\xf7\xef\xab\xec\x95\x2d\x23\x8b\xaa\xf2\xac\xa5\x35\x07\x5a\xcb\xbf\x5e\x36\xc1\x0d\x57\xe1\xe7\x42\x23\x3f\x32\xed\xed\xa1\xf8\xae\xcd\x05\xf8\xb4\x93\xb8\xb4\x01\x75\x63\x60\xc0\x8c\xac\xc8\x2a\xa3\x6d\x58\x94\xa6\x99\x0d\xb5\x8d\xb0\xf4\xb4\x5a\xf7\x34\x7c\xf7\xf8\xf0\x63\x27\x87\xd5\x6e\x4f\x41\x9d\x0c\x46\xa8\x98\x8c\x78\x85\x8b\x27\x27\xd2\x68\x0a\xe2\xd3\x91\x52\x9d\x96\xf3\xfb\xd1\x14\xe4\x50\x71\x62\x42\xa6\x72\x95\x96\x24\x1e\x47\x22\xe4\xd0\x94\x57\x46\x13\xb2\x02\x23\x09\x3e\x9a\x4c\xa3\x7b\x9f\x5e\x7d\x91\xba\xe7\xfa\x6f\xc0\xeb\xce\x59\xfc\xdd\x91\x7f\xa9\x9f\xfc\xc5\x73\x92\x6e\x36\xd0\xa4\x84\xe4\xb8\xc3\x6c\xa4\x38\x2a\x27\x41\x37\xbf\x3a\x67\x57\x93\x55\x66\xed\xfa\x01\xf0\x6d\xf0\x93\x65\xc7\x2c\xbc\x84\xc5\x3f\x35\x78\x9f\xb3\xf7\xaa\xeb\x9c\x1a\x32\x81\x6b\x01\x80\x83\x4d\x5c\xc4\x77\x4c\xf3\x6b\xd8\xf5\xc6\xd7\xe1\xa6\xe6\x86\xd0\xcc\xa6\x66\x68\xff\xad\x9f\xb6\x34\xcd\x6c\x30\x4e\x9c\x1a\xbc\xa1\xe6\x90\x87\xb0\xe9\x5e\x17\x97\xad\xd7\xa9\xf5\xda\x2e\xe1\xed\xa8\xd3\xf7\xc3\xf3\x7d\x8f\x54\x4a\x4b\xc5\x22\xcc\x14\x55\xfd\xaf\xd2\xc4\xb8\x04\x81\x34\x3e\x0e\xfd\xd3\xa3\x90\x19\x87\x29\xcd\x74\x07\xb9\xfc\x58\x6c\x0c\x16\xc7\xb2\x29\xa5\x30\xfd\x74\x84\x13\x04\x46\xf2\x33\xd1\x18\x1a\x87\xcc\xe4\xa4\xac\x0d\x9f\x2c\x14\x92\x30\x09\x27\x60\x3e\x86\x32\xaa\x88\x38\x9a\x51\xf3\xf0\xda\x1b\x6f\xbc\x11\xfd\x54\xfb\xcf\xa6\x8b\x2e\xba\xe8\xa2\x47\xef\xff\xc1\x0f\xee\xbf\xff\x7e\x34\x2e\xdd\xbd\x72\xc7\xc2\x5b\x2f\xba\xfb\xfe\xfb\x2f\xba\x6d\x3c\x2b\xc0\x34\x1c\x0d\x66\xe5\x44\x8c\x4a\x69\xd3\xdb\x86\x3d\xcb\xc5\xb2\x4a\x55\x5b\xf0\xb5\x1a\xb6\xa0\xa9\x06\xfc\xd4\x1a\xfa\x71\x4a\x8d\xf1\xd1\x1a\xf0\x05\x6e\x39\xd8\x3a\x06\x76\x82\x57\x17\x6f\x8c\x6d\xb1\xe4\xc0\xfd\x3b\x27\x13\xbf\x93\x27\xe0\xf3\x8d\xb8\x46\xef\x4b\x16\xc5\x15\xeb\xf1\xbe\x57\x8f\x8e\xbd\xc6\x53\xfa\x8c\x37\xa8\x8e\x6b\xf1\xe8\x38\x8c\xe1\xb0\xd8\xaf\x4e\xc9\x29\x39\x03\xb9\xa8\x16\x16\x43\xbf\x9a\x55\x3c\x13\xa5\x20\x1d\x55\x39\x34\x2e\xa3\x4c\x30\x57\xc8\x4d\xe4\x34\x2e\x8f\x05\x0b\xca\x58\xdc\x13\xd0\xeb\x22\xc4\x71\xae\x15\x67\xc3\x43\x61\x9c\xd7\x76\x02\xfb\xdb\x18\x7e\x23\xa4\xc3\x87\x1f\x25\xe0\x19\x3a\xc0\x86\x87\x71\xbd\xb9\xde\xeb\x2c\xb8\xf1\xb6\x67\x18\xf7\x07\xd8\x33\xdf\xca\x45\xb5\xfc\x45\xcb\xd1\x71\xed\x92\xcd\x8f\x00\xd7\xb7\x37\x1d\xbf\xd5\x17\xdf\xba\x5b\xa1\xe3\xdf\x73\x9f\x03\x8f\xc8\x86\x87\x13\x01\xc0\xd2\x7d\xc9\x49\x12\x4f\xc4\xc4\x33\xf4\x3b\x02\x0f\xce\xbf\x35\x7a\x58\xbb\x97\x7d\xbc\x9c\xd2\xbf\x39\x0e\xe3\x5a\x08\x43\x01\x62\xbc\x4c\x47\x2d\x3e\x94\x1c\x7c\x48\xb2\xe1\x8e\xfb\xb5\x79\x87\xc2\x16\x3c\xa1\xbf\xc5\xd4\xc7\x5b\x6f\x31\xad\xef\x80\x3a\xfd\x3b\xf3\x04\x9e\x2c\x9d\x60\xc3\xc3\x0f\x61\x7e\x5e\x65\xc1\x8d\x9a\x41\xfa\xf8\x81\x3d\x84\x9c\xc8\x36\xff\xad\xbe\xf4\x56\x9d\x53\x1d\x6e\xf5\xf1\xb6\xd7\x85\xf9\x6f\xf5\x16\xb7\xbe\xf1\xe9\xeb\xb5\xfa\xc9\x5b\xb1\xe7\x30\xfe\x76\xdf\xb7\xdb\x41\xa7\x05\xdf\xfa\x21\xb1\x2e\x5d\x67\x1a\x31\xdf\xc2\x04\x3c\x67\xaf\x77\xf3\x0f\x1d\xfc\x14\xd8\xf0\xe0\xa1\xae\xf1\x29\xfd\xbe\x8d\x21\x3f\xc3\x44\x3e\x8b\x6b\xf4\x0c\xcd\xc3\xe3\x4f\xb4\xe0\x29\x5f\x0e\xf7\xab\xff\x81\x03\xae\xe1\x51\xec\x75\x0d\xb6\x38\xe6\x0d\xb2\xe1\x81\xdd\xc0\xb9\x5f\x29\xe3\xfe\x18\xe6\xdb\xd6\x8f\xad\xb3\x86\xa5\xbe\xa7\xe8\x5b\x34\x3c\x4c\x84\xa5\xf7\x2d\x5a\xfc\xa1\x93\x7e\xfd\xfc\x9f\xd8\x2f\xe3\x5b\x90\xa1\x17\x25\x07\x3c\x6d\xd2\xb3\x6b\x9c\xe0\x8f\x6c\xaf\x77\xf8\x15\x82\x1e\xfc\x06\x77\x18\xbf\x2f\x1c\xbe\xc2\x5a\x2f\xa7\xcb\xc9\x50\xc4\xb5\x5e\x8e\xa4\x7f\xf7\x55\x04\xdf\xf0\x1b\x62\x6d\x24\x43\xef\x7a\xcd\xc1\x9f\xa8\x39\xef\xee\x17\x1d\x7a\x6a\xe1\xd9\x7b\x12\x01\xc7\xef\x56\x8d\x75\xad\x21\xe6\xcd\xdb\xe3\xb3\x3f\x71\xc8\x89\x68\xca\xdb\xc0\xff\x12\xe3\xd3\xf6\xf8\x81\x5f\xb9\xe5\xc1\xc0\x73\x8c\x5b\xae\x06\xfb\x1d\x7c\xd0\xe1\x31\x9d\x7e\x36\x9c\x7d\x0f\x77\xb2\xfd\x1d\x21\xd3\x16\xae\xfe\xcb\x88\x35\xe7\x6c\x9a\xb2\x5b\x1c\xb4\x5a\xb2\x62\xf5\xc9\x8d\x5b\x31\x36\xc6\xb3\x53\x76\xf0\x42\xb4\x78\xd1\x45\xd8\x20\xbd\xbe\x05\xae\x51\xda\xf6\x81\x5b\xb6\xf6\xb1\x2e\x59\x37\xe6\xcd\x3e\xc4\x00\x96\x1e\x4e\x38\xc6\x5b\x32\x94\xfd\x55\x05\x9d\xba\xac\x5c\xe9\xe6\x5d\xff\x21\x2e\x1e\x19\xf7\xb3\x0d\x5b\xf3\x6d\x87\x6d\x15\xd9\xf0\xc0\x54\x05\x3d\x79\x4d\x97\x74\x3e\xf4\x77\x11\x70\x11\xf3\x1a\xc3\x07\x0e\xad\xb0\x65\x98\x9f\x83\xe6\x19\xc0\x49\xe5\x84\xef\x45\xfa\x7c\x6d\xfc\x7b\x5e\x26\x3c\x38\xe3\x64\xc0\xd2\x1b\x2e\x3f\xce\x8b\x7f\x27\x4a\xda\xf5\xfe\x89\x0a\x7b\xac\xd3\xba\x81\xe0\xf5\x38\xb6\x8b\x57\xe0\x1a\x56\xb8\x33\xc6\xae\xb7\x08\x7e\x70\xd6\xfe\x3c\xe2\x90\x0d\x6b\x7f\x06\x16\x13\x70\x11\xcb\x3c\x5e\xc7\xe6\xef\x3b\x6c\x6c\x90\xd5\xbb\xfe\x1a\x3f\xb5\x7a\xff\x6a\x6b\xcc\xb2\xe1\xcd\xf8\x4e\xef\xfa\x93\xdc\xfe\x49\x5f\x7b\xef\xdf\x1d\x7b\x14\x34\xe1\x9b\x1f\x25\xf6\x14\xdb\x85\x3e\xe8\xb2\x3b\xda\x1e\x45\xd8\x70\x0e\x9f\x71\x12\x32\x60\xbc\x49\x35\xec\xa0\xe8\x18\x6f\xd9\xfd\xb6\x3f\x3b\xfc\x9f\xc0\x86\x37\x3f\x8c\xe1\x92\x43\x86\x35\x5e\xfc\xa5\x42\x36\x08\x99\xef\xab\xf0\xbb\x3a\xbc\xfb\x19\xc7\x5e\x6b\xe3\x9f\xaa\x90\x99\xa4\xb6\x07\x06\x4f\x5b\x09\x38\x7e\x1f\xfd\xc4\x77\x34\xfd\x1c\x7e\x44\x5b\x75\xfb\x03\x4e\x79\x1d\xbe\xbc\x62\xcd\xc4\xdc\x9b\x45\xb7\xef\xd5\x7d\xce\x26\xc6\xe1\xbb\xac\x3d\xb0\xfa\xa2\xea\x6b\x96\x4d\x3c\x5b\xd6\x39\x7c\x91\x15\x83\x8c\xbc\xef\x58\x9b\xc6\xa3\x5b\x6b\xf0\x08\x8f\xb7\x7a\xd1\xda\x77\x93\xf1\x1e\x74\xbf\x5f\x61\xcb\xf1\x78\xf9\x6e\xb7\x7e\xea\x7b\x39\xb2\xb9\xc2\xb7\x63\x3a\x7b\xc8\x77\x15\x69\x9b\x0f\x3d\xa7\x3a\xec\x4e\x8c\x0d\x6f\xc4\x67\xc3\xed\x0f\x10\xe3\x0b\xc4\xf8\x00\x21\x73\xf8\x9e\x84\x21\x8b\x0f\x55\xf8\x64\x0c\xdf\xfa\x73\x87\xfe\xc7\x4c\xf8\x86\x0f\x1d\x31\x5d\xc4\xe2\x03\x69\x47\x70\xdd\xb1\xf6\x97\x70\xbd\x30\xbd\x02\xfe\x57\x0d\xbf\x63\xda\x60\xec\x77\xba\x8e\x72\xac\xd9\xe2\xe9\xe6\xef\x39\x70\x59\xf1\x52\xef\xc1\xee\x3d\xd0\xe1\xc4\xdd\x79\xce\x8e\xdf\x88\xfb\xe1\x96\x9c\xb6\xbd\x5f\xc5\x16\x5a\x7a\xb3\xed\x4f\x6e\x99\xd3\x7b\x67\x12\x3c\xe5\x7c\x9b\xe9\x0c\xb3\x66\x64\x64\x35\x58\x1e\xe0\x0c\xe9\x75\xe2\x32\xe4\xf4\xc1\x0a\x9f\xa7\xef\xc3\xef\x2a\xf6\x01\xc3\xdb\xfe\xe4\xb0\x53\x16\x7c\xfd\x89\x0e\xfc\xa2\x19\x9b\x0e\xe4\x1d\xf6\xcb\xe2\x45\xcf\x1c\x22\x26\xc0\xef\x92\x31\xaf\xc3\xfd\xb8\x72\x78\x27\xe7\xd4\x91\xc1\xdf\x57\xac\x8f\xd0\xb5\xed\x1e\x07\x5f\x53\xa6\xae\x6d\xb9\xac\x22\xee\xc6\xfc\x76\xdc\x69\x4e\xd9\x71\x41\xee\x67\x8e\x35\x5b\xfb\xd3\xf5\x91\x63\x6d\x56\x1c\x6a\xf5\xe8\xb4\x75\x04\xaf\xd9\xaa\x2b\xa1\xfb\x42\x6b\xde\xfe\x5f\x57\x8f\x77\xf6\x76\xbb\xf1\xe8\xd2\xd8\xf6\x1d\x87\x0f\x33\xe2\x77\x96\xee\xfa\x1f\x87\xad\xe0\x4d\xfc\xfb\x9a\x2b\xe2\x35\x5d\xbe\x82\x6e\x39\xd5\x7b\x71\x3a\x6c\x97\x7e\xbf\x6f\xa2\x82\xcf\x59\x5b\x56\xac\xde\xa6\xbc\x59\x7f\x51\xd7\x8f\xb6\xaf\x39\xf0\x58\xf6\x74\x47\xa3\x83\x7e\x3b\xee\x7e\xcf\x61\x67\xad\x98\xc6\xea\x25\xaa\xc7\x77\x16\xff\x77\x7c\x41\xd8\x90\x9c\x86\x5f\xa3\x90\xc5\xfd\x3a\x58\x3a\xeb\xea\x41\x63\x7c\x17\x9c\x57\x21\xef\x18\x97\xd5\x23\x4e\xf7\x69\x96\x2e\x0f\xf4\xbb\x63\x36\x7d\x0d\xbd\xff\x20\xe6\x4e\x63\x5f\xae\xcb\xdc\xc9\x6e\x9d\xcd\x7d\xb7\xc2\xae\x49\x98\x17\xfa\xbc\x2f\x38\x72\x1f\x0b\xff\xf0\x41\x0e\x3a\x93\xc6\xda\xec\xfe\x7d\xba\xec\x4a\xe6\xf8\xf6\x9f\x3a\xe6\xb5\xe2\x9a\xf6\xae\x8a\x58\x04\xcf\x9b\xdb\xe8\xe0\xb5\xa5\x7f\xca\x5d\x56\x8e\xc0\xe9\x7b\xb3\x39\x83\xf9\x16\x71\xd8\x16\xde\xc2\xbf\xc3\x61\x67\x33\x6c\xb8\xfd\xfb\xae\xf5\xc6\xf5\xb8\xc5\xb0\x2b\x0f\x38\xc6\x5b\xf7\xa8\x2d\x99\xb3\x7b\x41\xe2\x6f\xd1\x9b\x33\x84\x8d\xd5\x73\xab\x64\x05\x3f\x65\x5b\xe7\xdb\x26\xdd\xeb\xd2\xe1\xf2\x25\x6e\x99\xde\xf3\x8e\x66\x57\xe4\x94\x89\xcd\xb2\xef\x66\x5e\x11\xee\xbe\x1f\x47\x80\x19\x57\xac\x80\xf9\x67\xf5\x7c\xe3\xad\x1e\x23\x73\x1d\xb9\x4b\xcc\x7a\x47\x38\x07\xc3\x8f\x71\xf8\x41\x4b\xb6\xad\x3a\x9b\xd6\xb7\x73\x5d\x77\xf6\xe5\xdc\x7e\xdc\xa0\x77\x2d\x41\xaf\x2e\xf7\x82\x2e\xf1\x96\xaf\x6a\xb4\xf0\xa5\x6c\x7c\xb2\x52\xe1\xcf\xf5\xb8\xd7\xbc\xcb\x1b\x28\xc7\x7c\x45\x1d\x3e\x1a\x63\xe9\xe1\xf7\xf9\x29\x62\x3f\xb4\x38\xe2\x33\xd7\x7e\xc4\x48\x5b\xbb\x35\x4d\xc0\x05\x53\xfe\x58\x5a\xbe\xc1\x91\xa7\x98\x31\xaf\xdd\x8b\x4c\xd7\x1f\x8b\x1f\xd6\xbd\xea\x38\xae\xef\xc4\x31\x6b\xda\xfe\x7d\x25\x58\x96\xe7\x9c\xb9\x84\x91\xcf\x19\xba\xf2\xb6\x43\x16\x38\xd3\x4e\xb6\xdf\x67\xf1\xd6\xcc\x83\x4f\xc4\x71\xea\x69\x8e\xf1\x96\x0e\x59\xfd\xc6\x74\x9e\x5b\x39\xc3\x20\xf9\x46\x17\xcb\xf8\x9e\x59\x04\xbf\xc3\x16\x9f\x64\x7a\x13\xb3\x66\xcf\xc1\xe5\x1f\x73\x97\x9f\xbe\x9e\x59\xb3\xe7\x2b\x1f\x6f\x38\x6d\xde\x99\xf3\x59\xcc\x35\x2c\x13\xe6\x3b\x9d\x06\xcc\x03\xec\xeb\x00\x0d\xf8\xf2\x12\xdf\x10\x1d\x07\x87\x81\x66\x70\x3a\x38\x0f\xa4\xc0\xad\x00\x40\x7c\xb0\x3c\x1b\xdf\xaa\x6d\x5c\xb8\x68\xee\xac\xd9\xfa\x35\x95\xa6\x99\xa1\x23\x7c\x33\x9b\x9a\x9b\xea\x1b\x9a\x1b\xf0\x93\x98\x86\xfa\xa6\x99\x4d\x0b\x9b\x43\xcd\x4d\xe1\x46\x6f\xd3\xcc\x59\x5e\xe3\x13\x55\x33\x9c\x19\x32\x8a\x02\x40\xf3\x2d\x8d\x7e\x24\xdd\x88\x6f\xa9\x19\x67\xa5\x8b\x42\xcd\x21\xaf\x12\xe5\xd2\x29\x5e\x8c\x40\x39\x9a\x4c\x71\xc1\xe9\x3c\x17\xc9\xc6\x02\x72\x30\x2a\xa3\xbc\x5f\x12\xc5\x5c\x1c\x4d\xc5\x0b\xdc\x98\x28\xfa\x51\x3e\x1b\x0c\x7a\x64\x29\x0e\x41\xba\x10\x8f\xe7\xe3\x53\xb0\xb0\xdf\x9f\x15\x15\xf8\x95\xba\x3f\xa9\x13\xd4\x79\xea\x48\x3f\xa4\xe0\xea\xf9\xe8\x77\xa5\x97\x9f\x59\x9b\xbb\x0e\xce\x6f\xea\x38\xfc\xb8\x8b\x3e\x54\x7f\xf5\xb8\xe7\x95\xd2\x8a\xba\x7c\x2a\xc1\xe5\x27\x22\x82\x90\x4c\x72\x1c\x57\xe4\x13\xf1\x44\x30\x1e\xcb\x48\x7e\x3e\x87\xe4\x68\x2e\x91\xe2\x92\x30\x9a\x8d\xe6\x32\xd1\xc8\x58\xbe\x90\x4a\x27\x45\x31\x29\x08\x39\x2a\x2d\xa9\x49\x75\x14\x25\xe2\x30\x47\xf9\x3d\xfe\x12\x8f\x9e\x59\xb3\x2e\x7e\xf8\xd3\xdb\x6f\x8b\x7f\xef\xee\x77\x66\x9d\xbe\xe4\xa2\x39\xf0\xab\xeb\xee\x26\xed\x94\x65\xdf\x37\x4f\x13\xfa\xfa\x32\xbe\x4f\xaf\xe9\x45\x8b\x74\x27\xe8\x04\x60\xe9\x95\x9c\x6d\xe3\xed\x18\xe8\xfe\xea\x36\x66\xeb\x2b\x16\xae\xb8\xa1\xe3\x58\xc7\x3a\x29\x77\xfc\xd5\xf1\x2c\x70\xca\xad\x59\x1b\xe7\x2e\xcd\x4f\xad\xdf\xe6\xc8\x1f\x38\xfd\x9d\x32\x9e\x23\x9c\xfd\x19\x96\xad\xb9\x84\xef\x89\x98\x7e\x7e\xe3\x65\x8e\x18\xd9\x8a\x3b\xac\x3e\x6e\x71\xb3\x46\xb2\xde\x6f\xd2\x90\xd3\x39\x95\x76\x86\xa5\xdb\xcd\x6f\x4b\xd6\xdb\xa5\x36\x7c\xd7\x6d\xe3\x8f\x08\xbb\xa4\xbf\xef\xc2\x6b\xec\x2f\xb8\xf3\xe4\xf6\x7b\x5d\x31\x43\x9c\xf4\x63\xeb\x1b\xaa\xad\xdd\xa2\xe9\x04\xa0\xd7\x84\xc0\x36\x06\xbf\xd2\x5b\x0a\x56\x82\x33\x40\x0b\x38\x0f\xac\x01\xdf\xd0\x6f\x99\xda\xa5\x2c\x66\x86\xec\x1a\x6c\xcb\x61\x68\xd6\x6c\x5f\x63\x9d\xb7\xf1\xd4\x45\xcd\x46\x6f\x33\xfd\x1a\x85\x37\x34\x33\xe4\x35\x2e\x60\x9a\x7f\xc3\x86\x99\x8b\xc2\x96\x16\x84\x9c\x3a\xa0\x3f\x28\xa3\x12\x12\x15\x90\x29\xbf\x3a\x05\xfd\xaa\xec\x61\x12\xf1\x48\x34\xc0\x07\x03\x68\x32\x11\x15\xa2\x48\x40\xfe\x60\x71\x42\x55\x24\xaa\xa8\xe6\x20\x40\x0c\x2c\x52\x59\x75\x92\x0a\x94\x26\x61\x01\x71\x54\x1c\x8e\x4f\x8f\x9b\xff\x42\x93\x85\x62\xa0\x24\xd6\x8d\xab\x13\x94\xa8\x0a\x1e\x3e\x82\xf2\xa5\x94\x24\x8c\x26\x60\x82\x13\x99\xa0\x50\x54\xc7\x25\x4f\xbe\xc4\xd3\x62\x3c\x1e\x17\x79\x94\x8c\x15\x39\xde\x9f\xf6\xc7\x92\x89\x14\x9f\x8c\xfa\x45\x7f\x1c\x4d\x40\x29\x06\x15\x5e\x14\x79\x85\xe3\xb8\xf1\x58\x2c\x86\xf2\x3c\x13\x2c\x03\x34\xc6\xa7\x78\x51\x4c\x72\x99\x44\x36\x10\x8b\x72\xcc\x64\x3a\xee\x90\xd3\xce\x7e\x97\x8f\x8c\xf9\x0a\x58\xe6\x4f\xa8\xf0\x9d\x78\x4f\x8c\xdd\x08\x39\x62\x05\x4b\xae\xb2\xac\x23\xe6\xe0\xd9\xf0\xd6\xb1\x0a\xfc\x0a\x81\x27\x48\xc0\xf3\xb6\x7d\x1d\x3a\xd3\xe1\x1b\x05\xc3\x37\x86\xdb\xde\xc6\xbf\x75\x3c\xe1\x9f\x32\x6c\x78\xf3\x7d\x15\x31\xa7\x64\xe7\x15\xca\x62\x02\x97\x64\xfb\x59\x65\x85\x5b\x07\x0d\x9a\x8e\x23\xf0\x64\x08\xf8\xb1\x96\xfc\x1b\x75\xe6\xdb\xde\xc0\xf0\x63\x1c\x6b\xb6\xe3\x3e\xc5\x91\x3f\x26\xd8\x70\xef\x3c\x42\x9e\x8f\x26\xf4\x8f\x73\xe9\xdf\x51\xf8\xdb\x57\x12\xf7\xe5\x7a\x10\xf7\x26\x3a\x82\xe8\xcb\x75\x17\x10\xcc\x3b\x0a\x64\xf3\xad\xaa\x2d\xba\xfe\xff\x74\xe4\x72\xd8\xff\x39\x86\xf0\x5b\xf6\x1f\x3e\x73\xdb\x7d\xcf\x26\x5e\xbc\xfb\xb6\xaf\x2d\xb9\x7b\xc9\xe9\x89\x77\xea\x78\x6a\xae\xfa\xbb\xc5\x94\xf8\xd3\x55\xb7\x5f\xba\xea\x98\xab\xae\x3e\x11\xbd\xa6\x1e\xf2\xe9\xa1\xeb\x0e\x83\xd7\x0d\x97\x0e\x85\x0b\x0f\xf5\xfd\x1a\x5e\xe4\x3b\x0c\x7e\x45\x7d\x89\xfa\x18\xfd\x0b\x2e\x43\xaf\xc2\x73\xd0\xb3\xeb\xd0\x1d\x27\x9e\x97\x9c\x07\x9b\xd1\x4d\x70\x0b\xea\xf8\x1e\x9c\x44\x01\x94\xf3\x46\x54\x91\x52\xd4\x64\x01\x06\x61\x3a\x82\xf2\xea\x18\x12\x85\xcc\x28\x07\xfd\x29\x29\x2a\x4e\xa8\x13\xb2\x67\xaa\xe4\xa7\x33\xe7\xfc\xfe\xe1\x7b\x1f\xbf\xf7\x9c\x1b\x57\xa3\x63\xe0\x45\xa7\x9f\x72\xe7\x0b\xf0\xb9\xcc\xce\x47\xd1\xa3\x37\x5e\x76\x78\xdb\xcc\x16\x78\x35\xdc\x16\x0f\x2d\x78\xe6\xf2\xcb\x8f\x0e\x85\x8e\x5e\xf6\xe6\x5f\x9a\xaf\xbd\xe5\xda\x5b\x6e\x89\xdf\xd1\xbc\xe0\x96\x6b\x9b\x2f\x5f\xa6\xae\x45\xe3\xbc\x10\xf7\x67\xb8\xb8\x10\x13\xb9\xb1\x58\x9c\x0f\x40\x7f\x2a\xe1\x8a\x57\xda\x7e\x55\xa1\x03\x29\x4d\xd6\x77\xcd\xae\x90\xb7\x1c\x21\xd3\x47\x3a\xec\xa1\x68\xda\xc3\xcd\xe6\x39\x8c\xd5\xd3\x2b\x87\x7b\x55\xb5\xbd\x8e\x7f\x2b\xe0\x8c\xe1\xb7\xae\x75\xcc\x71\x56\x99\xf7\xed\xc6\x75\x13\x4f\xb9\x06\x30\x6b\x34\xf8\xa2\xe7\x38\xc0\xb4\x6c\x9f\x47\x7d\x0d\x74\x2d\x78\x6a\xd1\x28\xa1\x8f\x56\x8e\xb1\xf1\x94\xea\x31\xe6\xfa\xd9\x04\xed\xa3\xb4\x62\xd1\x3e\xcb\x91\x17\x66\xd8\xf0\xae\x39\x0e\x3a\x78\x1c\x4f\xf1\x6c\x78\x73\x09\xc7\x47\x27\xba\xed\x86\x81\x67\xa6\x3b\x6f\xde\xf9\x49\x85\x1d\xc0\x39\x95\x31\x1e\xf7\xd9\x01\x75\xf8\x2e\xa7\x66\xdf\xcd\x6a\x35\x7a\xe5\x2b\xdc\x90\xcb\xe7\xb8\xc4\x88\x6b\x08\x86\x9a\x9b\xea\x43\x0b\xc9\x2a\x58\x9e\x60\x2e\x12\xa5\xa6\x52\x89\xb4\xa4\x48\xa2\x34\x1a\x99\xca\x70\x1c\xf2\x97\xc6\x78\x4a\x81\x53\xd3\xd9\x02\x4c\xc6\xa6\x3c\x63\xa5\xa8\xf9\x87\x16\xa3\x7c\xac\x34\xca\xf3\x82\x90\x42\xd1\x64\x32\x22\x47\x22\x11\xc8\xa3\xf1\x29\xb9\x00\xfd\x92\x47\x4a\x20\x41\x41\xd1\x2c\x8a\x64\xcd\x3d\xc5\xe7\x92\x43\x21\x6c\xa7\x82\xc4\x5e\x63\xbb\xd6\x83\xef\xcb\xee\xba\xdb\x0d\xcf\xfe\x16\xd7\x3a\x59\xe0\x88\xe1\x33\x6c\x78\xf7\xc9\xd8\x6e\xfe\x96\x88\x39\xf4\x33\xf1\x8d\x15\x70\x1d\xcf\x7b\xd8\xe7\xff\xce\xfc\xa9\x81\x0b\xff\xce\xce\x47\x2a\x7e\x27\x69\xcf\xdd\x77\x1e\x31\xb7\x6c\xc3\xb7\xbd\x68\xc1\x57\x6b\x70\x66\x4d\xcf\xa6\xba\x83\x96\xbd\xb5\xb2\x9b\xa5\xf7\x5c\xe2\xa6\x57\xff\x9d\x0d\x7f\x73\xd0\x2b\x9a\xeb\x1e\x22\xfb\xf7\x1b\x73\x04\x01\x4b\x77\x90\x77\x20\x71\x2d\xc3\x9e\x53\xf0\x39\xc7\x26\x02\x4f\xda\xe4\x1f\x43\xf7\x6c\x76\xd3\xda\xf3\xf5\x8a\xf1\x78\xcd\xb2\x80\x33\xf8\xdf\x3a\x74\x2e\xc3\x86\xb7\xe3\xba\x9d\x8e\xf1\x18\x4f\xd7\x8f\x5d\x3c\x32\xee\xa8\x0c\x5c\x8f\x63\x9c\x78\x35\x1e\x31\xf4\x10\x43\x8c\x27\x78\xb7\x63\x89\xfb\x3c\x63\x2b\xbe\x6f\xef\xc0\xa3\xfb\x9c\xf1\x0a\xfc\x7a\x0e\x1c\xc7\xf7\xab\xbf\xe9\x77\xd1\xa9\xc1\x19\x7a\xfd\x0c\x37\x1e\x9d\x3f\xf2\xc5\x6e\x3a\x75\x3c\x56\xef\x4f\xbd\x7f\x9f\x64\xe1\x61\x09\xfa\x71\xec\x68\xc0\x71\x9f\x26\xe0\xb5\xde\x38\xd9\x2f\x8e\x89\x7a\x1a\xf5\x8e\x9e\xb0\xf5\xfa\xfd\x15\x3d\x56\x32\xfe\x16\x3d\x01\xc5\x13\x2b\x8d\xe2\x2b\xa0\x89\x52\x56\x29\x8d\x7a\x62\xaa\x40\x89\xa5\x49\x18\xd5\x2c\x3b\x25\x52\xfe\xe9\xb4\xf9\x2f\xfc\xd8\x44\x2a\x4d\xc8\x32\x9a\x80\x41\x59\xf6\x04\x25\x14\xcc\xe7\xf3\x88\xc9\x66\xb3\x84\xfc\x08\x6c\x78\x1f\xee\xf6\x3d\x42\xf6\xcf\xc0\x67\xbd\x83\xf8\x3e\xe6\xbe\x97\x8d\xbc\x48\xc0\x67\x10\x1c\xf0\x59\x6f\xdc\x9b\xec\x97\x87\xee\x95\x68\x5e\xcf\x5c\xc9\x0c\xd7\x4a\x7c\x09\x65\x7f\x46\x19\xa3\x38\x85\xe2\xd4\x02\x95\x50\xb3\x1e\xae\x54\x50\x4a\x63\x9e\xa8\x9a\xa5\x12\x6a\x41\xc4\xcf\x90\x12\x30\x3f\x5d\x34\xff\x45\x73\x28\x8e\xef\xf1\xe5\x90\x22\x08\x92\xa0\xc6\x05\x79\x7c\x5c\x16\xa8\x9c\x80\xd2\x99\x4c\x06\x65\x04\x41\xd0\xe9\x17\xcc\xef\x02\xdd\xb8\x06\x7c\x0f\xd9\xdb\x47\xaf\xd1\x88\xdf\x1c\x75\x07\x09\x5f\xa1\xd7\x68\x2c\x60\xf9\xb9\xab\x02\x8e\xc7\xef\x5e\xe0\xd0\x3b\x1b\xcf\x71\x04\xdc\xc2\xc3\xd0\xbb\x10\x01\x4f\xdb\xe3\xf7\x91\x77\xe4\x13\xf6\xbc\x03\xeb\x08\x78\x07\x2d\x30\x6b\xf6\x1d\x79\x11\x58\x7e\xa2\x96\x6b\xef\x7b\x9e\xa0\x29\x6b\xcf\x31\xb4\xc5\xb1\xb6\x0c\x1b\x1e\xc4\xe7\xff\xfb\xcc\xbc\x60\x63\x99\xf7\x3d\x4a\xdf\xa7\x8d\x5f\xe0\x65\xe9\x9d\x3b\x71\xc1\x4d\x9f\xb9\x36\xe0\x25\xaa\xbe\x9d\x09\x80\xf3\x3e\x66\x35\xa9\x74\xdf\x05\x9a\x61\xdc\x60\xc6\xc5\xd2\x29\xd8\x08\x66\x84\xbc\x4f\x24\x63\x42\x2c\x39\x7d\x23\x4c\xca\x30\x85\x64\xc8\xa1\x02\xe4\x51\x5e\x46\x12\x4c\xa3\x3c\xe4\x91\x92\xcf\x66\x21\x97\x45\x01\xfc\x57\x5e\x1b\x97\x43\xa9\x04\x14\x04\x34\x99\x49\xa1\x7c\x02\x4a\x7e\xa4\x8c\xa6\x45\x3e\x93\xf6\xa6\x64\x59\x96\x55\xbf\x2c\xa3\x02\xe4\x64\x99\x9a\x92\x51\x34\x9b\xcd\xa2\x88\xa2\x28\x30\xab\x89\xbb\xac\x26\x91\x20\x41\x0e\x4e\x21\x06\xe5\x25\x98\xa5\x32\x80\xec\x95\xa3\xf3\xaa\xed\x27\x04\xaf\x04\x62\x9f\x2a\x7a\x4b\xe9\xf0\x7d\x2f\x54\x87\xef\x3a\xa8\xba\x3c\x8d\x2c\x25\xe0\xa2\x0d\xdf\x72\xb0\x7b\xef\xba\xfd\x8e\x3d\xb2\xe5\x06\x8f\x1f\x32\xfb\xf6\x09\x66\xbf\x76\x5d\x8e\xd7\x33\x15\xf2\xf7\x3c\xb6\x47\x24\x1e\xec\x8b\x76\x9f\x61\xeb\xad\x83\x4e\x4c\xff\xce\x9f\x11\xf4\x58\x78\x1c\x7d\xf5\xcc\x5a\xa6\x18\xde\xbf\x83\xc0\xa3\xd7\x50\xc5\x78\x36\xd8\x7d\xc5\x5a\x7c\x77\x6a\xe3\x95\x08\x00\xcc\xda\x67\xfe\x09\xd6\x97\x1f\x5e\x3e\xbd\x72\x94\x59\xb5\x6f\xcb\xea\xf2\xf2\x19\x2b\xdf\x22\xd6\x6f\xfd\xfe\xb6\x57\x89\x58\x3f\x47\xd4\x90\x33\xf7\xe3\x8e\xf2\x6a\xdf\x0f\xe9\x87\x34\xbe\x1c\x7c\x30\xeb\xeb\x2b\x7b\x1e\x28\x7f\x5e\xb9\x9e\x2e\x54\xc1\x77\x0c\xef\x33\xed\xb1\xfe\x46\x36\xc3\x86\x9f\xb8\x07\xf8\x59\xba\xfd\x1c\x50\x74\xad\x13\x8f\xef\xfd\x55\x05\x7f\xb1\x5e\x0e\x1e\x5a\x8d\x8f\x2c\x3d\xf8\x6a\x85\x7c\xe8\x6f\x19\xeb\x1d\xfc\xb2\xf8\xb8\x6b\xbc\x02\x8e\xe7\x6d\x3f\x9f\xe0\x3b\xc1\xdf\xf6\xeb\x2a\xec\x84\x2e\x1f\x2b\x2a\xf0\x60\xf8\xb6\x4f\xdd\xf6\x66\x17\x53\x21\x67\xb2\x3d\xef\xc0\xee\xea\xf4\x6c\x7d\xb2\x3a\xbc\xcf\x5f\x5d\x1f\xfa\x7c\xd5\xf1\xf7\xd1\x6e\x7d\x1b\x1c\x71\xd1\xc3\x91\x7a\xd8\xe7\x75\xe3\x69\xc7\xb5\xee\xd6\x1f\x56\x9d\x9e\xec\xd5\xd5\xec\x2e\x4b\x67\x0f\x77\xdb\x44\x7d\xbc\xa3\xc6\xb1\x62\xc3\xb3\x6b\x1d\x78\x44\x0b\xde\xe1\x9e\x77\xa0\xab\x82\x7e\x3c\xef\x46\x3d\x47\x3d\xb4\x3a\x1f\xb2\x6f\x58\x72\x6e\xf6\xaf\x7d\x1c\x8f\xff\x4a\x35\x7d\x66\xe8\xbe\xba\x1a\x7c\xf6\x10\xf0\xb8\x4d\x7f\x5f\xa5\x3d\xd2\xf0\xb4\x6c\xbb\x00\xfc\x00\x80\xa5\xaf\x73\x0e\x59\xef\xc5\x77\x98\xf6\x3d\x5f\x63\x8f\x29\x37\x4d\xb9\xf3\x2b\xc6\x13\x3e\x6e\x4b\xc4\x1d\x8b\xea\xf0\x3d\xc7\xd7\xc0\x0f\xdd\x32\xad\xd7\x84\xdb\x47\xf6\x2c\x26\xf0\xe3\x2b\x67\x0e\xdb\x39\xe8\xde\x03\xb3\x4e\x36\xe6\xdd\xc6\x1e\x07\x1e\x89\x0d\x0f\xaf\xab\xd8\x33\xd1\x1e\xdf\x5b\x26\xf0\xe8\xf5\xbf\x31\x7c\x3b\xf9\x0d\x10\x8f\xef\xc6\xb9\x48\x76\x46\x85\xec\xe2\xf1\xf2\xed\x15\xfc\xc1\xf0\x7d\xcf\x56\xb7\xc1\x1b\xcc\x6f\x95\x37\x94\x9b\x7c\x29\x3a\xcd\xac\xd9\xf7\xb2\xf7\xc3\xc5\x1d\x2b\xdf\x62\xe9\x21\xb6\x1a\x4f\x59\xba\xe3\xdf\x04\x3c\x65\xcf\xd1\x7e\x6e\x75\xb9\xeb\x78\xb7\xba\x1c\x6d\xbe\xd7\xb2\x8b\xc6\xde\xb4\xe3\xfb\x65\xeb\x0f\xa9\xbe\x67\x9b\x36\x3a\xec\x6b\xc6\xf4\x3b\x3d\xbf\xaa\xc0\x73\x36\xa6\xe7\x1c\x77\x1c\xa9\xd3\xd9\x63\xda\xc5\xb5\xa6\xfe\x0d\x9e\x05\x00\xb3\x6a\xdf\xf3\x25\x70\x7a\x84\xab\x4a\x6b\xcf\x6b\x04\xbf\xc7\x34\x78\x57\x30\xe2\x8c\x87\x1c\xf2\xb8\xc3\x96\xc7\xa0\x03\x5e\xd1\xfb\x79\x1f\xae\x63\xde\x7d\x94\x03\x4f\x46\xf7\x61\x2c\xdd\xbd\xa8\x3a\x4f\xf7\x76\x55\x97\xbb\x76\xbe\xc2\x76\xb5\x54\xc8\x29\xe1\x9b\x7a\x51\x75\xdd\xef\x0c\x54\x1f\xdf\x7e\x66\x75\xf9\x22\xea\xa1\x1b\x39\xcd\xbe\x97\xec\x79\xc1\x61\x78\xfc\x7a\x3a\x03\x3c\x44\x65\xaa\xc5\xe0\x0c\x70\x3e\xb8\x14\x5c\x01\xae\xc1\xfd\xe7\x71\xc5\xe8\x2f\x13\xf3\xe9\x5d\x07\x7c\xe1\xc6\x85\x73\xab\xfc\x6b\x86\x71\x13\x9f\x88\xfa\x71\x25\x02\x4f\xb8\xee\xa6\xe9\x2d\xea\x39\x90\x91\x60\x10\x4d\xe0\x8b\xf4\x0c\x2a\x4a\x68\x12\x06\xca\x00\x02\x54\x54\xd2\x69\x08\x04\x24\xe2\xbf\xa0\x2c\x25\x52\x29\x5e\x8a\x67\x32\xb0\x20\x25\xd2\xa9\xb8\x94\xc8\x88\x30\x2f\xc5\x53\x42\x42\x4a\x4a\x99\x71\x59\x4d\xc9\xb2\xfe\x5c\x17\xfa\xd5\x94\xf9\x2f\x34\xe5\x3d\xe1\x11\xb8\x54\x51\x64\x59\x0d\x28\x7a\xd4\xa8\x50\x93\x32\x8a\xe6\x72\x39\x14\xcc\xe5\x72\x1e\x29\x36\x26\x2b\xd9\xf8\x78\xbe\x30\x19\x1b\x53\x64\x25\x3e\x96\x1b\x9d\xb4\x60\xaa\x50\x8a\xa5\xd3\x9e\x51\x24\x8f\x8f\x8f\xab\xa3\xe3\xe3\xe3\x55\xe3\xc6\xc1\x89\x6a\x72\xce\xd2\xbd\x89\xa0\xf6\x93\xaf\x60\xf8\x03\xb4\x04\x18\x2b\xc2\x6e\x06\x8b\x1d\x7c\x9f\x4d\xfb\x16\x2e\x6a\x5c\x84\xf9\x56\xe7\x6d\x5c\xe8\x09\x19\xed\xb9\x34\x88\xc7\xf8\x9c\x34\xa3\xda\x0d\xfc\x2f\xb1\x5b\x75\x9f\x28\xe9\x54\xbe\x10\x17\xc4\x84\x18\x08\xa2\x02\x52\x22\x85\x49\xc8\x47\x65\x86\x81\x13\x68\x4a\x96\x13\xa3\x85\xb4\x84\xa6\xf8\x7c\xba\xb8\x5c\x4b\x2c\xe5\xd1\x51\x98\x1c\x55\xc7\xf1\x5f\x5f\x7c\xf4\x5f\xee\x17\x2d\x45\x0b\x29\x26\x9a\x8e\xc9\x79\x9e\x8b\xf1\x01\x51\x40\x52\x2a\x12\x09\x88\x4a\x42\x12\x21\x28\x8a\x99\x94\x84\xde\x2e\x4d\xc1\x51\x2d\x09\xf5\xe7\xf3\x79\xef\xdc\x03\xec\x51\x15\x59\xc7\xf7\x5c\x8d\xdc\x45\xa6\x45\xb0\x1c\xd7\xaf\x3b\x1b\x9c\x0f\x2e\x06\x57\xe8\xdc\x34\x5b\x5f\xd5\x87\xec\xec\xb3\xd9\x9d\x99\xea\x8f\x11\x1a\xf0\x27\xbb\x90\xd1\x75\x6b\x21\xac\x94\x71\x5c\x0e\x62\xb6\x2f\x3c\x97\x8a\xa5\xc5\x6c\xb1\x58\x2c\x52\x31\x34\x0a\x63\xa8\x08\x19\x34\x0e\x23\x12\x8c\xa2\x31\x8d\x25\x5a\x82\x43\xc5\xc6\xc6\xc6\xc7\x8b\x50\x14\xa7\xc6\x84\x51\x28\x48\x12\x0c\x4a\x28\x8e\xff\x52\xf3\x99\x49\x54\x48\xc1\x88\x27\x07\xf9\x62\xa6\x88\xf2\xb4\x28\x24\xa3\x45\x71\x4a\x2c\x83\x8c\x90\xa4\x22\x09\x41\x96\x85\x84\x3a\x9e\x14\x32\xd0\x2f\x4e\x65\x20\x90\xa6\x53\x92\x54\x97\xe0\x10\x48\xa7\xd3\x68\x34\x99\x4c\xaa\xc1\x64\x41\x90\x92\x8a\x20\x65\x14\xb1\x8a\x4f\xe9\x9d\xae\x9e\x1f\x58\x77\x29\xdc\x7d\x4f\x0e\x76\xc3\x0d\xdf\xc7\x3a\xfc\x80\x68\xd9\xb8\x5f\x55\x8f\x6b\x95\x9f\x3a\xfc\x8c\x35\x7e\xe3\xe5\xd5\x6d\xe5\x50\xc2\xe1\x13\xad\x78\xab\xed\x17\xd5\x6d\xee\x16\xf3\xfe\xe1\x82\xf2\x19\xbe\xe7\xb4\x5c\xb6\xfd\xb1\x79\x5e\x96\x56\x22\xff\x33\x5d\x25\xee\x09\x0f\xe2\x53\xa9\xf5\x07\xb9\x74\x16\xcf\x3d\xd0\x57\x11\xdf\xe0\x37\x8c\xeb\xfd\xd5\xed\xb1\xf5\x6d\xd1\x05\x5f\xef\xab\x1e\x63\x5a\x75\xc2\x9c\x34\xd1\x1d\x83\x8e\x98\xd1\x8a\x33\x3a\xde\xa8\xce\x53\xeb\x1b\xba\xed\x0f\x31\x7c\xf3\x74\x45\x0e\x8b\xe1\x6d\xaf\xb9\xf1\x6c\x3c\xb1\x22\x6e\x2b\xd8\x7b\xd3\xf6\xf3\xea\x74\xb6\x8d\x3a\x64\xc2\xf0\x87\x0c\xbd\xd5\xae\x79\x61\x9c\xcd\xed\x38\x58\xe3\xf5\x0e\x7c\x1b\x78\x3d\xed\x8c\x57\xf0\xef\x84\xdb\x71\x64\xb7\xde\xeb\xf2\x67\xfa\x3c\x66\x0e\x1a\x33\xef\x76\x6f\xd2\xcf\xa8\xeb\x2a\x62\x1f\x9d\x4f\x17\x11\xb9\x1c\x96\xb1\x36\x5c\xd3\x63\xbd\xc7\xbd\x6e\x05\xbf\x0d\x50\x22\x56\xcc\x6d\x9e\x19\xe3\xfb\x8c\xeb\x29\xb7\xbf\xd4\xd7\xd7\xf1\x5a\x75\xff\xda\xf6\x53\x07\x3d\x16\xff\x06\x97\x58\xf0\xe5\xbe\x1f\x58\xb9\xef\xaa\xf5\x47\x9c\xe6\x5d\x2e\xe2\x87\x89\xd0\xe8\x59\x9c\x01\x21\xa3\x6f\x63\x88\xf2\x11\xcf\xbd\xcd\x4f\xa4\x8d\x0b\x67\x84\x9a\x43\x0b\x3d\x71\x25\xe9\xc9\x95\xfc\x62\x0e\x4e\x28\xb8\x36\x0f\x53\x2a\x2a\x25\xc1\x23\xaa\xa9\xc8\xa8\x8c\xa2\x54\x90\xa3\x33\xc1\x71\x19\x15\x47\x61\x1c\xe5\xe4\x32\x90\x11\x0f\xf3\x32\x04\xf2\x28\x64\x64\xeb\xec\xcb\x38\xf3\x68\xd3\xcf\x24\xee\x77\xef\xf3\xe0\xe1\x38\x8e\x99\xeb\x96\xeb\x11\x5c\xb7\x65\xf0\x70\x82\x3f\x79\x6b\x7c\xcb\xd6\x59\xe0\x31\x00\x96\x4e\x73\xf6\x39\x83\xc0\x86\xfb\xd2\xae\xdf\x31\xe3\x3a\x3c\x47\x47\x82\xc0\xa5\xd3\xf4\x93\x2a\xe3\x2d\x9a\xf6\xf8\xdc\x76\x41\x87\x0f\x9a\xb5\x23\x04\xb3\x0e\xcb\x20\xee\xf9\xb8\x1e\xba\xd7\x60\x8c\x3f\xd4\x2d\x43\x83\xf8\xee\x52\xdf\xe5\xee\x1c\xc0\xa0\x33\xee\xce\x49\x0c\x78\x81\x88\x19\x09\x3a\x3b\xdf\x72\xcb\x9c\x0e\x77\xe4\xcd\x04\x3d\x6d\x05\x77\x8c\xa9\xc3\xfb\xae\xac\x8e\xc7\x7a\x0f\x91\x32\x7b\x49\x1b\xe3\x9f\xa8\xbe\x97\xbd\xa3\x35\xf6\x78\x3e\xa1\x33\xfa\x1d\xab\x73\x31\xdf\x40\x75\x3a\xb3\xbf\x72\xdb\x28\x9d\x6f\x03\xb0\x1a\x9d\x2c\x3d\xd0\xe5\xce\x9b\x47\xf0\x77\x16\xed\xb7\x9c\xb6\x51\xcb\xbc\x5d\xfb\xae\xd7\xf1\xb9\xba\x02\x4e\xec\x57\xee\x02\x07\x5c\x32\xe1\x6d\x24\x3d\x69\x7b\x7c\xdb\x4b\x96\x9c\x18\xf5\x98\xdb\x5e\xd4\xe0\xad\x66\x8e\x27\x9a\x75\xc5\x0d\x38\x22\x72\x3c\xfd\x6d\xc3\x72\x57\x8e\xe7\x90\xcf\xb6\x1f\x13\xfc\x21\xe7\x7d\xc1\x2d\xff\x3d\x6f\xe2\xf3\xa1\x3f\xba\xf7\x7d\xdf\x0f\x2b\xf8\x23\xd9\xf2\xd0\xf6\xa3\x0a\x39\xf9\x03\x86\xe7\x1d\x79\x9f\x35\xef\xb0\xe2\xce\x75\x06\x99\xda\xfa\xc5\xd2\x1b\x7e\x5b\x81\x1f\xdf\xd7\x1d\xfc\x83\x65\xdb\xcd\xef\x46\xd8\x56\xb6\xaa\x15\x74\xe2\x79\x95\x9f\x39\xe4\x53\x34\xe1\x43\xb7\xb9\x6d\xa8\x21\x9f\x25\x77\x7c\xa0\x8f\xdf\xfc\x40\xc5\xbe\x6b\xeb\x35\x3c\x72\x6b\xc9\x65\x53\xfe\x68\xfb\x3f\x40\x99\xf6\x1b\x1c\x04\xe6\x02\x30\x43\x7f\x08\x8c\xab\xdd\xe9\xff\x32\xdb\xdc\x92\x86\x76\x9c\x9a\x88\x70\x0a\x1f\xa5\xf2\x5f\xe4\xd3\x14\x13\xe1\xe5\x78\x14\x8e\xf2\xb1\x1c\xc7\x51\xa0\x54\xa0\xb2\x6a\x42\x51\x39\xaa\x50\xca\x79\x85\x74\x2a\x2a\x48\x32\xca\x66\x52\xd1\x8c\x2c\xc9\x31\x31\x25\xa3\x49\x05\xf9\xe1\x94\x02\x03\x00\x78\x4c\xdd\xc1\xdf\x40\x16\x3b\xbf\xe3\xd8\x2d\x26\xc9\xc8\xdc\x6a\x37\x69\x7e\xdb\x09\xc1\x85\x8b\x42\xb3\x66\x0b\x9e\x98\xfe\x55\x47\x50\x53\x41\x86\x2a\xa0\x42\x24\x46\x05\x4a\x79\x6a\x5c\x8d\x28\x6a\x84\x1a\x2f\xe5\x29\x10\x8c\xa1\x3c\x35\x15\x88\xa8\x0a\x25\x95\x46\x21\x57\x27\x4c\x8b\x9e\x48\x24\xa8\x66\x23\x01\xda\x9f\x4e\x8b\x69\x94\x8e\xc5\xc4\x04\x2f\x8a\x22\x9a\x82\x7e\x51\x14\xe3\x71\x31\x16\x83\x52\x1a\x89\x19\x35\x19\x8f\xc7\xe3\x66\xee\x5d\xe7\x7b\x86\xbe\x9d\x59\xd3\x36\x74\xb0\x77\xf1\xdb\x2b\xc7\x98\x55\x6d\x3f\x5c\xf7\xa3\xa5\x3f\x5a\x79\xb7\xd3\x26\xf4\xe3\xfb\x1e\x6d\xe6\x5b\xba\xa8\x09\x6f\xc3\x6f\xc5\x5a\xf5\x7d\xf0\x83\x8e\xf2\x52\xdf\xc5\xf4\x53\xb8\xe2\xe6\xb1\x44\x75\xef\x03\x74\xda\x9c\xdd\x54\xdf\x00\xeb\x43\xf5\xfa\x26\x79\x9b\x43\xc7\x52\x7a\x92\xa8\xa5\xa1\x75\x33\x62\x01\x4a\x41\x53\x91\x18\xcc\x7f\xc1\xc3\x5c\x8c\x2b\x03\x6a\x22\x10\xc9\xc0\x29\x3e\xa0\xc6\x62\x1f\x2a\x8a\xc7\xbb\x7f\x37\xdc\x13\x09\xee\x0d\x06\xa9\xcb\xa6\xdf\xab\x9b\xa3\xff\x41\x3f\xa4\x33\x5f\x64\x3c\x9d\xab\x2f\xba\xff\x8a\x2b\x1e\x78\xe0\x8a\x2b\xee\x3f\x63\x29\x5a\xfd\xad\x33\x56\x5f\xaf\xa6\xe9\x77\xd5\xcb\xa9\xfe\xc5\xab\x4e\xf9\x6a\xc3\xff\x5c\x70\xc1\x37\x2e\xb8\xa0\x0c\x2e\x28\xfd\x40\x26\xe3\x80\x41\xfc\xba\xcb\x5a\x6f\x8b\xbe\x5e\x66\x4d\xf7\x53\x10\xac\xf8\x03\xa7\xfd\xec\xd9\x0a\xfb\xf8\x1e\xd6\x9f\xdf\x19\xbc\x30\x65\xc2\x8b\xb9\x71\x3c\x58\x08\x38\x70\x19\xb8\x5a\xaf\xeb\xde\x18\xf4\xce\xa6\x7d\x4d\xe6\xcb\xf5\x85\x8d\x7a\x4d\x61\x9c\xfa\xcd\x98\x35\x1b\x17\xb0\x30\x1b\x3a\xd3\x7a\xbb\x3e\x68\x89\xb5\xb7\x52\x9a\xad\x16\xd6\x9e\xd7\xce\x42\x9b\xd5\xcf\xa3\x70\x10\x9e\xd1\xba\xe8\xdc\x5f\x7e\x4f\x5d\xbe\x9e\xba\x25\x39\x75\xd6\xbc\xbb\x4e\x3c\x73\xf8\xac\x79\xeb\x4e\x58\xf1\x76\xdf\xd5\xd7\x1d\x85\x0e\xa6\x36\x9c\x71\xeb\x5d\x77\xa5\xaf\xbe\xeb\x55\xb4\xff\xbc\xd7\x7f\x79\xd3\x06\x6a\x02\xa6\x83\x31\x85\x0f\xc2\x64\x29\x43\x65\x94\x48\x12\xfa\x51\x1c\xca\x28\x25\x23\x19\xa6\x50\x86\x0a\x26\x91\xcc\x07\xa5\x20\x4f\xa7\x1e\xbf\x74\xf6\x63\x77\x2d\x7a\x7e\x03\x7a\x6d\xe7\x4e\xb8\xf0\xb5\x2d\xdf\x7c\x7c\xd5\xe3\x77\x87\x6f\x7d\x78\xd5\xc3\x77\x95\xfe\xf5\xed\x9b\x84\xbb\x37\x3c\xfe\xfb\xf4\xd5\xc2\xba\x75\x37\x6d\xb8\xf1\xe1\x45\xca\x5d\xd7\x7a\xfe\x9e\x4a\x44\xd3\x19\x29\x1a\x53\xf2\x12\x9a\x14\x11\x07\x0b\x22\x0c\x48\x63\x8a\x20\x47\xe5\x8c\xce\xb3\xa7\xca\x67\x60\x9e\x1d\x62\x74\xd2\xf8\x2a\x68\x06\xe7\x82\x8b\x00\x98\xd1\x64\xb4\x37\x6e\xaa\xd7\x97\xaf\x2f\x1e\x73\xaf\x49\xbf\x8e\x30\x33\xd4\x0c\x67\x53\xf8\x5a\xce\x7f\xc3\x28\x45\x2a\x48\xa3\x9a\xfa\x5c\xd0\x1f\x8c\xc0\x25\xea\x7b\xd4\xb2\x4d\xe8\x9a\x4d\xbf\x8d\xde\x0e\x1f\x43\x77\xc3\x2e\xf4\x97\x27\xda\x3e\xb9\x69\x92\x7a\xe0\xbf\x67\x4a\xa0\xa8\x85\x62\x45\x94\xb9\xfb\x98\x55\x31\x74\xfe\x0d\xea\x17\xe7\x7f\xa7\x6e\xd5\xf9\xe8\x91\x9c\xfa\xe1\x8b\x2f\xd6\x3d\xc2\xa3\xc2\x68\x66\x0c\x1e\xfa\x1f\x18\x61\xf5\x61\xcd\xb0\xe1\xbd\x29\xcd\x06\xee\xc5\x37\x53\x5a\xf7\xbb\x7e\xb6\x16\xff\x4c\xef\x6c\xb7\xa6\xf6\xef\xed\xbd\xf9\x00\x3f\xbb\x09\xe7\xd0\x46\x6d\x49\x70\xb8\xf1\xfd\xaf\x09\x9c\x0d\x2e\xd4\xb8\xae\xf1\xdc\xea\xf0\xd0\x74\x3c\xac\xc5\xf9\x19\xff\x15\xcf\xbf\x78\xf0\xa5\x56\x78\x0a\x7a\x13\x5e\x5e\x6a\xd9\xa4\xe6\x4e\x38\x11\xf2\xea\x4f\xa9\x4b\x3a\xd1\xb9\xca\x9f\x4f\xbd\x1b\x76\xa0\x9b\xe1\xbe\xf7\xfe\x6b\x7e\x7b\xa7\xd0\x3d\x94\xef\xad\x3b\x5e\xbd\xe3\x8e\x8b\x8f\x39\x73\x11\xba\x2c\x89\xea\xce\xbd\xab\x6e\xc1\xb9\xe8\x89\x5d\xea\xe7\xcf\x3d\x57\xf7\xe8\x81\x19\x5d\x93\x27\x37\x56\xe1\xd7\x9a\x3d\xe7\x24\xbd\x4b\xde\x5f\xf9\x96\xfe\xbf\x59\x7a\xef\x5a\x2b\x8e\x30\x6c\xe1\x46\xfc\x9e\xbc\x6d\x1f\x70\x9d\x21\x0f\xdd\x4f\xec\xe1\x17\xce\x9f\xe9\x7b\x88\x47\xd0\xad\x53\x56\xfc\x81\xdf\x44\x1d\x7a\x0a\x86\x9a\xe7\xbc\x7a\xcd\xea\x38\x1b\x6e\xc3\xdf\x4d\x5a\x71\xd9\x79\x70\x90\x71\x37\x54\x20\x6a\xbe\x1e\x0f\x1a\x40\x0b\x38\xd7\xac\x6d\xa5\xd7\xc1\x74\x14\xbd\x24\xfe\x3d\x43\xdf\x2b\xa3\x6d\xe8\xac\xd9\xbe\x39\x1e\xe3\xf2\x4f\x63\x7d\x03\x6e\x3b\xd1\x5c\xef\x0d\xcd\x0c\x41\x06\x8e\xc9\x90\x53\xe0\xd8\x17\x93\x32\x8c\xa1\x51\x38\xa6\xfd\xaf\xd8\x74\x80\xf8\x1f\x93\xfb\x03\x34\x50\x53\x71\x49\x88\xcb\xc9\x54\x46\x4e\xa8\x13\xa3\x68\x3c\x9b\x09\xe4\x26\xf9\x22\x23\x4b\x49\x1e\x06\xea\x26\xa7\x03\x74\x20\x99\x4c\x26\xd5\x3c\x4c\x25\xb4\xff\x43\xa3\xfa\x5f\x63\x12\x1a\x13\x85\x78\x3c\x11\x4f\x70\xd1\xa0\x22\xc1\x14\xca\x47\x63\x22\xcf\xf1\x30\x8b\x26\xc6\x13\xf2\x64\x16\x16\x26\x8d\xdc\x86\x37\xe3\xd8\xdd\x33\x01\x60\xc3\xbb\x67\x69\xbb\xf2\xd4\x53\x84\x4d\x8e\xb3\xe1\x76\xdc\xdf\x47\xc1\xf7\xdc\x81\x07\xec\x2a\xf3\xbe\x75\xf4\x3a\xdc\x19\x6f\x3e\x00\x33\x1a\xe7\x68\xc6\xb8\x7e\xee\xcc\x50\xfd\xac\xa6\xb9\x3e\x6f\x5d\x63\xb8\xd1\x47\xfb\x1a\x41\x7d\xd3\x11\xbe\x59\xb3\xeb\xeb\x8c\x6e\x88\xf8\xbf\x1f\x9d\xe4\xd9\x40\xc5\x39\xf4\x5b\x74\x03\x35\x47\x7d\xef\x97\x47\x51\x77\x1d\xa1\x4e\xa0\x37\x5e\x7e\x21\x7d\x53\x20\x2d\xc1\x39\x4a\x20\x9d\x47\x6f\x7b\xde\xe0\xd0\x92\xd2\xcf\x78\xcf\x41\x70\xed\x99\xe8\x69\xf5\x30\x9e\xfa\x37\x35\xba\x21\x0a\x4f\x12\xb6\x25\xd1\x8b\x75\x1b\x90\x32\xc7\xff\x78\x1d\x75\xf5\x95\xc2\xae\x13\xef\xb8\x04\xfa\xe1\xeb\x42\xb6\x10\xa7\x26\x96\x52\x3f\x14\x8a\x49\x91\x87\xe3\x77\xbd\x7e\x49\x26\xa1\xc5\x35\xc9\x72\xc2\xa7\xd0\x3c\xf0\x82\xd9\x00\xe8\xd5\xc0\x3c\x21\xab\x54\x46\xa3\xaf\x71\xe1\xa2\xfa\x86\xa2\x92\x49\x8b\x72\x00\x4a\x49\x18\x81\x45\x2a\x1a\x57\x33\x48\x41\x05\x61\x32\x9d\x11\x8a\x34\x9f\x92\x44\x25\xa5\x4e\xa8\x80\xe7\x72\xc9\xd4\x64\x96\x8f\xeb\xdf\xc3\x0d\xdc\x6c\xf8\x6c\x5c\xc7\xbd\xf5\x33\x43\xce\x38\xbd\x36\x1e\xb3\x66\xf7\xbd\x1f\x1d\xc1\xdd\x7f\xda\x13\x2c\xbd\xe0\x34\x2b\x26\x4c\xe8\x31\xe4\x2e\xdc\x7f\xf8\xec\x9b\x1d\x70\x9e\x0d\x0f\x77\x54\x81\x0b\xd6\x1c\xff\x72\xc0\x33\x6c\x78\xd7\xae\xea\x78\xf6\x6e\xae\x02\xd7\xc6\xef\xac\x02\x4f\x5a\xf8\x71\xcf\x60\xe0\xb5\xf8\xa6\xd7\x30\xa9\xc7\x5d\x27\x43\x33\x43\x33\x34\xfb\xa4\xc5\x1b\x35\x38\x49\x3d\x59\x57\x98\xe6\x92\x9e\x89\x52\x10\x3e\xa7\x28\xa5\xb3\x0f\xc4\x59\xcf\xa8\xe2\xf1\xca\x70\xff\xa4\xf7\xf5\xaa\x2c\xb6\xe9\x8b\xb3\xe1\xbd\x0b\x6a\xac\xf3\x64\x1b\x0e\xea\xc0\xcd\xe5\x15\xbe\x1e\xfa\x64\xa3\x57\xe6\x02\x9d\x6a\x5f\x88\xb2\x6e\xe1\x2d\x0a\xcd\xc0\xab\x98\x5b\x6b\x05\x1d\x75\x53\xa5\x7c\x94\x9a\x8a\x66\xc7\xd2\x72\x20\x9b\x16\x12\x41\x15\x24\x50\xb1\xc3\x33\x56\x8a\xaa\x2f\x1d\x68\x41\x75\xa7\x6c\xe9\x41\xb7\xfd\xda\xbf\xe1\xa0\x1b\x7f\x0d\x4f\xa3\x4e\x93\x8b\xff\x61\x5d\xf6\xbe\xfe\x83\x58\x57\x8e\x90\xa9\x4f\x1d\xeb\x4d\x58\xf0\xa2\x03\x9e\xb6\xe0\x9f\xb8\xf9\x63\xc0\xff\x5e\x03\xfe\xb1\x13\xce\xac\xdd\x7d\x43\xf9\x04\xf0\xf6\x99\xdb\x63\xb7\xb3\x98\xab\x55\x7e\xe7\x23\x97\x8c\x98\x7d\x49\x9b\x01\x80\xf5\xe4\x05\x76\xca\xd7\xc8\x1e\x09\x67\xe0\xfe\x4f\xcd\xa1\x99\x47\xd4\x92\x1a\xfa\x8f\xd7\x5e\x2b\xfc\xf8\x84\x17\x1e\x6c\x52\x9f\xff\xea\xe6\xcd\xef\x76\x51\x27\xa9\xef\x1c\x44\x35\xab\xef\x94\x26\x0e\xa8\x9a\x5f\x9d\xbe\xfc\xb6\xdb\xea\x65\xe6\x9b\x1f\xa3\xbf\x7e\x7c\x29\x5c\x0d\x9f\xa4\xae\x47\xf7\x7e\xac\xb6\x7f\xfc\xe8\x32\xea\xb3\x03\xeb\xad\xcd\xfb\x0f\x6b\xf0\xf8\x6f\x86\x4c\xe9\xf0\xf5\xc0\x8b\xeb\xd2\x9f\x8a\x63\x71\xfd\x56\xcf\x0c\x7c\xfa\xe4\x03\xd0\x47\x41\xca\xdb\x38\x67\x46\xa8\xd6\x12\xeb\xbe\x93\xe6\x45\x2e\x8d\x5e\x82\x05\xbf\x42\x05\xd5\x71\x06\xc6\x60\x44\x98\x44\xe3\x02\x12\x52\x70\x3c\x82\x38\xb4\xe4\x40\x6b\xa5\x12\x19\x99\x17\x33\xd4\x6f\xfd\x30\x8b\xe2\xb2\x8c\x8a\x48\x16\x60\x04\x06\x90\x58\xc8\x4c\x50\x41\x8a\xfe\x0f\xb2\x66\xef\xdf\x5f\x1d\xeb\x4d\xb1\xe1\xdd\x5d\x07\xb4\x39\x93\x35\x64\xe7\xff\xdc\xe3\x7b\x6f\xaf\x8e\x67\x77\x77\x15\xb8\x2d\xb3\x1f\xb8\xf1\xef\x82\xd5\x75\xdd\x18\xff\xbf\x6e\x9b\x66\xc0\xff\x52\x83\xfe\x3f\xd7\x98\xf7\x7d\x37\xfe\xee\x8b\x0f\xc8\x87\x3f\xd5\x98\x77\xa2\x06\x9d\x7f\xac\x81\xe7\x0f\x35\xc6\xff\xde\x0d\xef\x7b\xac\x0a\x3d\xb6\x7c\xbe\xe7\xb0\x19\x36\xfe\xdf\xd5\xc0\xff\xdb\x1a\xf4\xfc\x3f\x2c\xe7\xb4\x61\x3b\x6f\xb1\xaa\x56\x1d\x89\x2b\x6a\xda\x5f\x1f\xf5\x4c\xfb\x00\xd6\xdf\x17\x54\x4a\x53\x8a\xe2\xf1\x97\xa6\xb4\x3f\xf0\x5c\x59\x2e\x9d\x7a\x20\xa1\xf6\x9e\x54\x92\x53\x29\x4f\x0a\x8d\x66\x51\x30\x47\x95\xbf\x18\xf5\x4e\x57\x17\x63\x07\xdd\x7d\x1b\x0e\xb8\x4f\xe3\x35\xf6\xfb\x37\x35\xf6\x0f\x7f\xd7\xc7\x31\xbc\x06\x6f\x77\xf4\xb2\x99\xaf\x7b\x10\x8f\xe1\xfb\xb4\xd5\xeb\x51\x44\x4d\xff\x81\x3d\xa0\x57\xfb\xcf\x7c\xdc\x71\xed\x43\x45\x39\x08\xeb\x7e\xe9\x67\x07\x62\x05\x4c\xca\x75\x77\xcb\xa8\x20\x53\xdf\x98\x96\xbc\x6f\x62\x65\x3f\xf8\xbf\xe0\x85\xb1\x86\x5f\xbb\x75\xda\x80\xbf\x53\x43\x16\xde\xae\xc1\xbb\x5f\x59\x7e\x94\xf7\xf5\xd0\x37\x80\x43\x71\x0e\xb9\x5c\x3f\x7f\xb0\xcb\xc4\xc1\xa6\xfa\x39\x8b\xb4\xc0\xef\x88\x59\x4d\xa7\xae\x80\x8b\x66\x53\x3e\x3a\x14\x0c\x37\xd7\x92\x0c\xef\x57\x4e\x09\x50\x33\x36\x95\x4e\xdd\x44\x2d\x3b\x32\x88\xde\xef\x87\xe7\x7c\x74\x1b\xfa\x2b\xba\xf3\xbc\x5f\xbc\x7d\xcd\x89\x07\x0d\xd6\x5f\x72\x1e\xda\x8a\xfe\xb4\x5d\xcd\x1e\xd0\xde\xdf\x70\xd6\xb5\xe8\x9d\xcd\x5d\xb0\x79\x59\x13\x5a\x87\xb6\x5c\x25\xdf\xd3\x77\x07\xea\x0e\x1f\x77\xdc\x8d\x3f\x6d\x46\xe3\x67\x9e\x79\xde\x55\xde\x79\xff\x89\x67\x36\x6f\xde\xaa\xc1\x9b\xb1\x1a\xf0\x37\x6b\xc0\x7f\x59\x83\x97\x6f\xb8\xe1\x83\x6f\x1f\x50\x6e\x5f\x77\xc0\x45\x0b\xfe\x8b\x1a\xf3\xbe\xe6\x1e\x3f\xf0\xcb\x03\xda\xd9\x9f\x3b\xfc\x76\x06\x1c\x0a\xea\x2d\x19\xb7\x4e\x04\x42\xf5\xa1\x85\x1e\xe3\x96\x41\x4d\x67\x96\xc9\x06\x82\x70\xac\x34\xe1\xe1\x4b\x01\xc8\x07\x47\xa9\x8c\x9a\xa1\x72\x6a\x5c\x8d\x2b\x99\x94\x54\x73\xfb\x32\x91\x54\x02\x81\x9c\x3a\x55\x97\x17\xd0\xd4\xf8\x78\x29\x3d\xe1\x99\x4c\x89\xa2\x9c\xd6\xf7\x2b\x9b\xa8\xb2\x5f\x71\x8b\xfe\xd1\x1a\x7c\xfb\x1f\x37\x7f\xb2\x7b\xaa\xf0\xc1\xe2\x67\xff\x11\xee\xd8\xb7\xbf\x86\xdf\x32\xf0\xff\xcc\xcd\xcf\xec\xf7\xaa\xdb\xe5\x81\xd1\xea\x78\xb2\x4b\x1d\x31\xaa\x0e\xbf\x10\xcc\x07\x1c\x58\x85\x6b\xb7\x32\xf6\x23\x11\x5f\x7d\x43\xbd\xaf\xfe\x88\xa6\x59\x4d\xa7\x2e\xd2\x14\xeb\x30\x18\x6a\x38\x21\xdc\x5c\xef\x6b\x5c\xd4\xdc\x34\x73\x51\x7d\x53\xbd\x57\x3f\x53\x68\xc0\x39\xa6\x17\x6f\x48\x4d\x83\x7c\xf3\xe9\xab\x43\xf3\x42\xa1\x79\xf5\xcc\xbd\x8f\xdf\x72\xa4\x3f\x74\xcb\x2d\x57\x86\x98\x0d\xa1\x0d\xa8\x70\xca\x8d\xa7\xcd\x3b\xf1\xe2\x67\x6e\x79\xbc\xc4\x0e\x6d\x7a\xfe\xf9\x8b\xce\x0e\xbc\x8f\x3e\x0b\x7e\xfd\x8a\x21\x24\x1e\xd0\x62\xdf\xa0\xfe\xe1\x23\x7f\x87\xff\xf5\x77\xe6\xa9\x3d\xd4\x89\x21\xf5\x89\xb3\x0f\x3a\xc8\x7f\x5a\xc7\xe9\x1f\x9d\x7d\xf6\x95\xd4\xbd\xcc\x43\xa1\x8f\x7e\x34\x0f\x3e\x80\x86\xd6\xc0\x0d\xe8\xd6\xc7\xd4\x9f\x1c\x37\xe7\xe1\xbb\x2f\x7a\xe6\xd8\xe3\xa8\xef\x50\xb1\x6a\xaa\x59\xc5\x1e\xff\xb4\x82\x7f\x47\x57\xe7\xeb\xae\x0b\xb5\xdc\x5f\xff\xad\x5d\x71\xe7\x5e\xef\x39\xee\x40\x7b\xba\xa7\xb9\xc6\x5e\xbf\x5a\x43\xd7\x7e\x52\x23\x5f\x7a\xa5\xc6\xf8\x97\x6b\xf8\x9a\x42\x0d\xf8\x4b\x15\xb1\xd4\x9f\x0f\x24\xc3\xad\x2f\xd6\x98\xf7\xc7\x35\xd6\xf5\x42\x45\x6c\x71\xc8\x01\x62\xac\x96\x8d\x5f\x80\x4b\xa0\x27\xf6\x97\xa6\xd7\xad\x9f\xc9\x16\xae\x1f\xd5\x98\xfb\x79\xf7\xdc\x7b\x3e\xc2\xfd\xa9\x3e\x36\x67\xaa\xf2\x3b\xcf\xd5\xa0\x37\x5f\x63\x8e\x1f\xba\xf9\xd7\xfd\xe8\x01\x75\xf7\xd9\x1a\xfc\xdb\xe7\x80\x4b\x16\x7c\xa4\x06\x9e\xe1\x8a\xb5\xbd\x8b\xd7\xf6\x1b\x6b\x76\xbf\x2b\x67\x3e\x9c\xcc\x41\xf5\x12\x8f\x8b\xaa\xf6\x77\xaf\x12\x43\x14\xea\xc4\x69\x01\x37\x77\x6d\xa7\x4e\x54\xdf\x6d\x85\x47\xa2\xff\x33\xff\x94\x6e\x3f\xa0\x8b\x0c\xee\x1f\x93\xeb\x40\xfb\xfe\xff\xe7\xd9\xfa\xb9\xda\xfa\xb9\xfa\x20\xf2\x14\x0e\xa8\x77\x36\x6f\x87\x1c\xf1\x64\x8a\x0d\xf7\xfe\xd8\xc1\x5b\xfd\x0d\x29\xa7\x8d\x9f\x9a\x62\x5a\x9e\x7e\x11\x5c\x05\x8f\x5e\x7e\x3c\xb7\xd8\xcd\x2f\xb6\xa5\xfb\x9f\x00\x80\xbf\x70\x60\xd1\x02\xeb\x67\x8f\x9a\xb2\xb5\xf7\x7d\x10\x85\x47\xae\xf8\x06\xb7\x83\xcc\x3b\xf7\xfd\xb0\x1c\x03\xe5\xb3\x2e\x6b\x7e\xc9\x95\x77\x3e\x61\xfe\xde\xa6\x8d\xa8\x07\xbc\xc6\xbf\x1d\x2b\x91\xfb\xdf\xf3\x6e\xc5\xfe\xe7\x08\xbd\x1a\xac\x21\x47\x39\x87\x2f\x14\xc0\xc1\x20\x0c\xce\x02\xe7\x82\x6b\x0c\x5f\x38\x33\xa4\x37\x27\x6c\x36\x3f\x24\xcc\x74\x74\x24\xc0\xcf\x54\x0d\x33\x5c\xf1\xcc\xcf\xd7\x38\xb7\xb6\x49\xf6\x5e\x2b\x05\x82\xb0\x80\xfc\x31\x3e\xad\xa4\x61\x24\xc1\xa1\x71\x38\x1e\xc7\xb7\xed\x52\xc9\x58\x34\x10\x89\x26\xd1\xb8\xfa\xca\xb8\x32\x3a\x9a\x0f\xa4\x52\xf1\x64\x22\x1e\x4c\x24\x02\xcc\x78\x0c\x32\xe3\x28\x7d\xc0\xcd\xbf\x33\x92\x88\x8b\x99\x64\x62\x52\x15\x84\x38\x2f\xca\xe9\x64\x54\x42\x39\x9e\xf7\x4b\xfe\x00\x8c\x79\x0e\x85\x7e\x34\x25\xa1\x31\x4e\x8c\x06\x51\x42\x48\x32\x0a\x13\xe4\x20\xcf\xc9\x3c\x4c\xc2\xd4\x7f\x9d\x3f\xee\xad\xa1\x3b\x7b\xaa\xd9\x36\xb6\x65\xdb\x79\x00\xc0\xc3\x38\xd0\xbc\xa5\x32\x26\xe9\x7e\xaf\x86\xbe\xed\xae\x11\xc3\xec\x72\xc0\xcf\x66\xd6\xf6\x1e\x5c\x3e\x08\xfc\xe9\x8c\xdd\x8b\xb6\xba\xe4\xc6\xc6\xb5\xb3\xfa\x1c\x3d\xdf\x34\xf2\x1e\x1d\x7e\x27\x38\x1c\x9c\x08\x96\x80\x16\x70\x3e\xb8\xce\xd9\xd5\x00\x37\x2f\x58\xb8\x12\xce\xd6\x72\xfc\x45\x66\x79\x74\xf3\xbc\x9e\xf6\xcc\xa6\x7d\x33\xf5\x03\xdf\x66\xda\xd7\x38\x67\x2e\x79\x14\x5c\x53\xc7\x27\xe1\xa8\x02\xc7\x50\x94\x8a\x4c\xfb\xa9\x28\x8a\xc1\xe5\xa3\x72\x52\x2c\xaa\x13\x09\xc8\xe7\x46\xc7\x82\x52\x0a\xe5\xe1\x58\x30\x2a\xc7\x82\x30\xa7\x8e\xc7\x67\xc5\x13\x69\x45\x8c\x8c\x17\xf8\x44\x3c\x0e\x63\x50\xe1\xe2\xa9\x58\x26\x9e\x4a\x2b\x69\xa4\x64\x4b\xf0\x80\x82\xe1\x49\xa7\x45\x41\x14\x05\xd4\xe0\x0f\x88\x31\x94\xc8\x65\x52\x72\x80\xc9\x24\x25\x31\xce\x45\x13\x29\x31\x83\xa6\xd2\x7c\xac\x18\x8d\x0a\xf1\x58\x7c\x2a\x12\x10\xe3\x19\x21\xc1\xf3\xf1\x24\x1f\xe7\xc5\x3c\xe4\x3d\xaf\xfd\x97\x36\x64\xc0\xad\x6f\x5d\xab\xab\xd8\x67\x3b\x06\xef\x77\xcb\xcc\xf6\x3f\x1e\x28\xf7\xef\x5a\xee\x80\xdf\x66\xda\x86\x2d\xcb\xca\x05\x78\xe8\xca\x60\xf3\xd7\xaa\xc8\x4c\xd6\x3d\x47\xd7\xa0\x63\x8e\xcb\xca\x2b\x7c\xed\xba\x1c\x7f\xfe\x01\xd3\xd2\x3f\x5e\x56\xc0\xdb\x2b\x2f\x8d\xbd\x4c\xca\xcc\xde\x1d\x07\x3c\x93\x30\xef\xc1\x9d\x50\x5e\xeb\x4b\xd1\x22\xb3\xe6\xec\x9b\x5f\xf1\x73\x60\x79\x1d\xdb\x92\xfb\xa4\x3c\x89\xeb\xc9\x3f\xe7\x38\x6b\x78\xc5\x85\xef\x62\x9f\x42\xdf\x84\xf1\x4d\x33\x2d\x5d\xe7\xa0\xe7\xc0\x9c\xb3\x36\x71\x0e\xb9\xed\x7e\xf3\x80\xbe\xae\xb7\xe2\x3c\xe3\xd8\x2a\xe3\xe3\xec\xda\xa1\x1f\x97\x47\xc1\x2f\x39\xb0\xe8\x57\x2e\x9d\xc9\xb0\xe1\x1d\x03\x07\x5c\x67\x4f\x0d\x78\x77\xc5\xdc\xd5\xce\xb7\x35\xfc\xfb\xaa\xc3\xbb\x46\x0e\xb4\xb6\xae\x1f\xd5\x58\x73\x97\x1b\xbe\x23\x5d\x1d\xcf\x8e\x6a\xf4\x08\x6c\xb8\xeb\xca\xea\xf0\xed\xfc\x01\xe3\xaf\x1d\xae\xf5\x36\x8a\x0f\xa2\x7f\x96\xbb\x5c\xfc\xb4\xe5\x7c\x3b\x31\xbe\x40\xc8\xa6\x52\x83\x9f\x9d\x6e\x7a\x94\xbe\x2a\xf4\x3c\xc8\xac\x5d\xdf\x5b\x66\x20\x5c\x35\x3f\x76\x76\xa5\xfd\xdb\x77\x54\x75\x5e\x2b\x5b\xaa\xe7\x2f\xdb\x4f\x3a\xa0\x7c\x6d\x33\xe0\x37\x97\xef\xf0\xf5\xd0\x37\x68\x91\xb7\xf7\x28\xa6\x65\xc7\x33\x60\x0b\xfa\x64\xf1\xa6\xb3\xbf\x5b\x25\x3e\xde\x6a\xfc\xce\xaa\xf2\x35\xbe\xef\xd3\xe7\x6b\xbf\xf3\x81\x97\x69\xd9\x78\x19\xfa\x23\x3c\xe4\x4c\x69\x61\x57\x65\x2c\x3c\x78\x27\x31\x7f\x96\xf0\xe5\x5b\x6a\xf8\x9d\x0e\xc7\xf8\xfb\x4d\x9b\xb0\x15\x01\x1f\xf8\xd7\xca\x57\x16\xae\xb2\x7e\x66\xaf\x65\x33\x71\xe6\xf3\x12\xfe\x6e\x7b\x2c\x58\x06\x38\x70\x26\x38\x47\xbf\x61\xa0\xc5\x00\x47\x60\x4b\x4f\xfb\x1a\xd9\xd9\x4d\xc7\x42\x76\xb6\x2f\xec\xa1\x7c\x8d\xa0\xde\xf2\x0d\x4d\xf5\x0d\x33\xb1\x7d\x37\xea\x59\x2c\x6a\xd0\x2f\x8c\xd7\x37\x84\xea\x9b\xea\x6b\x86\x00\xb9\xa7\x66\x1f\x0f\x9f\xb8\xa4\xf5\xe4\xe3\xd0\x9b\xe7\xdf\x78\xa3\xf2\x50\xeb\x2d\x1f\x9c\xf5\xd2\x77\x2f\x79\xe9\x6a\x38\xa3\x74\x23\x0c\x48\x30\x80\x26\xa7\xa6\x0a\x62\x32\x2d\x48\x71\x39\x95\x4f\x8c\x42\x3f\x9a\x94\x33\x19\xc8\xa4\x4a\xf2\x01\x2d\x7d\x2a\x74\xd7\x9d\x4f\x9c\xfe\xc9\xa9\xf7\xae\xfb\xd9\xe3\xb7\x40\xf0\xf0\x2f\xcf\x45\x8f\xec\xe9\x79\x02\x2e\x46\x93\xcf\x3e\x0e\xfd\xf0\x09\xea\x02\x59\x96\x04\xc4\x04\x33\x82\x28\x24\x11\x0f\x0b\x8a\x20\x48\x63\xb0\x28\x20\x3f\xbe\x7c\xcd\xc0\x89\xff\xfe\xdc\x69\x53\x8d\x7c\x46\xae\x21\xd7\x1b\x6b\xc8\x56\xbb\x73\x3c\xb3\xb6\x6d\x35\xfa\x0b\xf8\xeb\x59\x0f\x7d\xad\xdd\x25\xd7\x09\x36\xdc\x7e\x51\x15\x39\xb5\x65\xae\xad\x42\xde\x99\x03\xea\xf2\x86\x1a\x34\x3d\x53\x63\x0d\x4f\xd7\x98\xf7\xa9\x1a\xe7\xb4\x52\x0d\xfc\x3f\xa8\x38\xb7\x58\x82\xeb\x24\x2c\x76\xe5\x4b\x59\x5b\xd6\x87\xaf\xaf\xc1\xef\x27\x6b\xcc\xf1\x84\x1b\xbe\x75\xc5\x01\x75\xfc\xf1\x1a\xf0\xc7\x6a\xf0\x6e\x7d\x0d\x78\x6b\x0d\xde\x89\x35\xc6\x3f\x5a\x83\xa7\xdf\x27\xe0\x79\x82\xa7\x8f\x38\xe0\x19\x36\xbc\x67\x37\xce\xc7\x76\x55\xe4\x9a\x76\xde\xfa\x70\x0d\xfb\xf1\xbd\x1a\x34\x3d\x64\xc1\x57\xe3\xf1\x6b\xce\xbe\x19\x4c\x71\x60\xc5\x9f\x98\x16\x25\x56\xbe\x0e\xfc\xf2\x4c\x2e\x96\xad\x82\xcf\xac\x2d\x7a\x1b\xbe\x17\x7b\x27\xb3\x76\xfb\x2d\xea\xfa\x72\x79\xf9\x4b\x2b\xdf\x62\xe9\xc1\xef\x54\xe5\x4b\xa6\x86\xec\x3c\xa0\xe7\x29\x10\x94\xd3\xbe\x0c\x1d\xc5\xb9\xe5\x51\xe0\x38\x70\x82\x99\x55\x36\x87\x3c\xf5\x47\xcc\x0a\x05\x71\xc4\x89\xcf\x60\xeb\x43\xf5\x10\x37\x2c\xad\x0f\xc1\x94\x37\xb0\x7f\x52\xf1\x8c\x97\x22\x29\x91\x62\xa8\x40\x86\x51\xa2\xa9\xb8\xaa\xa8\xf2\x98\xb7\x58\xca\xab\x53\x94\x9f\xca\x6a\xff\xa5\xa3\x28\x20\xe7\xa7\xa7\x50\x2e\x18\x48\xe4\x62\x93\x7c\x2c\x9e\xf2\x64\xd5\x02\xcc\xe2\xd7\x19\x45\x8d\xb6\x27\x71\x6d\xa1\x00\x1b\x1e\xd9\x0a\x00\xe3\xdb\xfb\x62\xe9\xfb\x46\x5e\xc8\x13\x70\xba\xd3\xbc\xa7\x2c\xb9\xe0\x66\x5d\xd7\x09\x5c\x8f\x45\x64\xc3\x9d\x97\xe2\x35\x9a\x77\xaa\xb3\x66\xcd\xa1\xc1\x9b\x71\x7d\x09\xd3\x77\xe8\x77\xdd\x83\x6c\x78\xa4\x15\x9f\xdf\x99\xdf\x8b\x32\x26\xfe\x5d\xbf\xd6\xe0\xd6\x78\x01\x8f\x4f\xb0\xe1\xce\xab\x1c\xe3\x53\x98\xfe\xb4\x4e\x0f\x4b\x6f\x2d\x56\xe0\x79\xb1\x02\x8f\x3e\xbe\x54\x41\x0f\xbe\x47\xdc\x79\xa5\x63\xbc\x05\x37\xd6\x7b\xb5\x95\x37\x6b\xf0\xa8\x05\xbf\xc6\xb1\xae\x24\x1b\xd6\x28\x64\xe8\x7e\xd9\x31\x5e\x60\xc3\xfd\x1b\x1d\xf8\x13\x78\x7c\x84\x0d\x8f\x8c\xba\xd6\xa5\xc1\x03\x6c\x78\xf8\xff\x1c\x70\xbd\x3f\xe6\x35\x4c\xe3\xc8\xca\x52\x0e\x78\x59\xba\xff\x03\x06\x90\x6f\x07\xf4\x79\x3b\xaf\x75\xe0\xc9\xb0\xe1\xce\xeb\xaa\xe3\xef\x5e\x5d\x05\x9e\xb1\xf0\x98\x7d\xd0\xd7\x92\x7c\x60\xe9\xbd\xaf\x1c\x4f\x8e\x8f\xb1\xe1\xec\x22\x07\x9e\xf9\x58\x1e\x32\x6c\x63\xe7\x4a\x15\x57\xf8\xdf\x76\xa1\x8b\xcf\xd7\x3b\xf8\xa0\xd7\x4b\x49\xeb\xf3\xb2\xf4\xe0\x85\x84\xfc\x90\xeb\xba\xdc\x4d\x67\xdb\x70\x15\xfa\xd3\xe6\xf8\xb6\x21\x07\x9f\x53\x6c\xb8\x6d\xd0\x31\x5e\xaf\x19\x1a\x67\xc3\x6d\x39\x1c\xa7\x7c\xc7\x92\x73\xa3\x46\x79\xdb\xde\x2a\xf0\x00\x1b\xd6\x20\x0c\xdd\x79\xb1\x63\x7f\x83\x6c\xb8\x4f\xaa\x90\x1f\x7d\xde\x3d\x8e\x79\x9f\xd0\xe5\x9f\x69\xdc\x77\x53\xe9\xa7\xb8\x22\x8f\xde\x67\x2a\xef\x5a\xef\x25\x84\x3c\xeb\xeb\xdd\x5d\x21\xff\x98\x7e\x9d\x9e\xd6\xfb\x1c\xf3\x0a\x6c\xb8\xaf\xd7\x31\x5e\xd7\x47\x8e\x0d\xf7\x95\xab\xe8\xa3\x3d\xaf\xdd\xe3\xd1\x01\xef\xbf\xb8\xba\x9c\xb4\xed\x72\xd0\x93\x61\xd6\x64\x9b\x7c\x60\xe9\x2f\x39\xc0\xda\xbc\xe3\xac\x37\x05\x98\xd6\x9d\xbc\x63\xef\x33\x6c\x38\x7b\x9d\xc9\x09\x62\x6e\xd1\x9c\x63\xc0\xee\xdd\xe1\xa0\xa9\x75\x9d\x63\x7c\x90\x0d\xb7\x35\x56\xc8\x04\xee\x29\xbd\x69\x0c\x00\x53\x82\xb5\xff\x5a\x6f\x97\x45\x93\xa6\xfe\xa4\x5b\x2e\x74\xf8\x80\xf9\x16\x68\x91\x2e\x17\xcc\xda\xfe\x92\x7a\x07\x00\x2b\xae\x31\x57\x68\xd5\x14\xb2\x6c\x45\xd6\xec\xfd\x50\x30\xef\xb5\xe9\xf0\x9d\xe6\x1b\xfe\x9b\xca\x09\xdf\x66\x5a\x60\x1b\xfb\xff\x81\xe6\x00\xc0\xac\xda\x76\xe1\x37\xc1\xb2\xe7\x70\x7e\x78\x5d\x99\xf7\xdd\xa3\xe5\x9c\xfd\x1f\x0c\x80\xd3\x2f\xe6\x00\xb3\x6a\xdf\x1d\x25\x70\xfa\x8d\x9c\x69\x6f\x1d\x73\xf5\x7d\x51\x63\xbf\xfe\xcf\xb1\x1e\x6b\x9d\x59\x33\x47\x91\x31\x3c\xc5\x86\xfb\x67\x38\x78\xd6\x5a\xbe\xc6\x37\x44\x0b\xcc\xda\xce\x53\x20\x04\xde\x58\x64\xe5\x9b\xcc\xaa\xbe\xcf\x3e\x01\x4b\x76\x71\xc0\xe8\x57\x8b\xf9\xd3\xbf\xcc\xa1\x1f\x31\x13\x9e\xc5\xf6\xbb\x93\xb3\xf6\x2c\xa6\xd3\xd5\x79\xbe\x03\x9e\x34\xed\x50\xe7\x45\x55\xf4\x52\x60\xc3\x6d\x3b\x1d\xf8\xb3\x66\xfd\x68\x43\x4e\xe3\x96\x7e\x18\x35\xb9\xf5\xf5\xed\x39\xd6\xb2\x97\x86\x1e\x77\x5e\xe8\xc0\x93\xb4\xec\xe2\x05\x55\xec\x47\x92\x0d\x77\xae\x75\xc0\x13\x26\x3d\x9d\xe7\x39\xf0\x4c\x5a\xfe\x44\xf7\x03\xe7\x5a\xe3\x63\xe4\x3e\x74\xdf\xe8\xd0\x8f\xa8\x65\x3f\xec\xbe\x53\x9c\xee\x07\x0c\xf8\xd9\x0e\x3f\x16\x33\xf1\xb7\x0d\x58\x7e\xcc\xa0\xa7\xf7\x1e\x07\x3d\x09\xd3\x4f\xea\xf3\x0e\x87\x1c\xfe\xd3\xe2\x5b\x97\xf9\x8e\x45\xc4\x78\x82\xe6\xbc\x7b\xcd\x7a\x6c\x0a\x86\xf3\x26\x7c\xf7\xeb\x0e\x3c\xb6\x7f\xe0\x9d\x7a\xcf\x86\xdb\x7a\x1d\xf4\xa4\x4c\x3e\xf4\x9e\xee\x82\x9b\xfc\x6f\xa9\xb2\xef\xd6\x3e\x76\xae\xaa\xd8\xaf\xb3\x1c\xe3\xcf\xc6\xe3\x63\x6c\xe3\x88\x4f\x3d\x0d\xd8\xba\x98\x36\xe7\xed\xb9\xcc\x31\x6f\xda\xe4\xb3\x26\x81\x0c\xdd\x7a\xaf\xc3\xa6\x58\xb6\x66\xcb\x1c\xf7\xbe\x1b\xf4\x9c\xe9\xc0\x23\xb0\xe1\xee\x77\x1d\xf8\x2d\x1b\xa7\xe3\x6f\xff\xbb\x83\x3f\x69\x36\xdc\x79\x9a\x63\xfc\x0f\xca\xab\x7d\x6d\xf4\x35\xcc\xda\x5d\x4b\xd4\x79\xe0\x84\xc5\x47\x2d\x8f\x33\x2d\xdb\x2e\x84\x4f\x95\xbf\x38\xf5\xff\x56\xae\x20\x78\x92\x62\xc3\x23\xf8\xfb\x84\x81\x79\x9e\x81\x37\x4a\xf2\xab\xe7\x2a\x87\xcd\xe3\xd8\x70\xd7\x5c\x87\x3f\xb2\xfa\x9b\xb5\xf5\xe0\xf5\x7f\xd7\x5a\x67\x54\xaf\x99\x6a\xf8\x91\x7b\xdc\xfb\xaa\xc3\x77\x7c\xcb\x80\x47\x5c\xfe\xe2\x74\x4b\x3f\x1d\xf2\xbd\x7d\xd8\x21\xdf\x16\xfe\x6e\xbb\x1f\xa2\x93\xbf\x67\x38\xe6\xb5\xe0\xdb\x7f\xea\xe0\x7b\xcc\xa2\x67\x63\xf5\x7d\xda\xfe\xa1\x43\x9e\x2c\x39\xee\x1e\x70\xd8\x8b\xb4\x09\x6f\x8f\x54\xd7\xcf\xee\x63\x1c\xf4\x0b\x6c\x78\xdf\x76\x7b\x0f\x3a\x17\x13\x34\xa5\x2c\x5d\xf9\x87\xdb\xe6\xb6\x61\x19\x1c\x31\x6b\x4d\x5c\x55\xe6\x7c\x4f\xe8\xfb\x39\x0d\x98\xf0\x56\xe1\x60\xc0\xd2\x9d\x9c\xd7\x21\x57\x3a\xae\x2d\x66\x2d\xda\x2b\x30\xfc\x7b\x6c\xe3\xf6\xa4\x7a\x5a\x79\xda\x92\xf3\x94\x93\x1f\x5b\x4e\x70\xf0\xc3\xda\x37\x45\x75\xac\x23\xca\x86\xb7\x84\xaa\xe8\x85\x64\xf1\xa3\xb1\x3a\x3f\xb6\x1c\xef\xc0\x63\xf9\x93\x2d\xb8\x4e\x18\xf0\x81\x6f\x96\x39\xdf\x7a\x7c\xaf\xee\x20\xe3\x2e\x42\x14\xb4\x98\x55\x42\x7d\xae\x6f\x65\x33\xf0\xd9\x3b\x2e\x09\x3a\x9b\xf6\x35\xe9\x4d\xcc\xf5\x87\xfd\x70\xa6\x87\x25\x3f\xc0\x30\x70\x46\xa8\xbe\xa1\x1e\x22\x21\x1e\x4f\x27\xff\xea\x39\xb3\xf4\xc2\x46\x6a\xa6\xfa\xa1\xf9\xe7\x93\x6f\xa1\x97\x79\x78\x7c\x02\x6d\x87\xdf\x67\xfc\xb2\x9f\xd9\x1b\x8c\x3c\x10\x8b\x7d\x0b\xdd\xf0\x9b\x37\x2f\xff\x63\x1d\xff\xc9\xbf\x1f\x7b\x6c\xd5\x4d\xc7\xaf\x3b\x7f\xc5\x72\xf4\xb7\x29\x74\xdf\x66\x7a\xfd\xe9\x8f\x27\xae\x4b\x9e\x52\xba\x9d\x7a\xf0\x7b\xe8\xfb\xdf\x43\xf7\x3f\xa6\x9e\x88\xf6\x5f\xf3\xd8\xa5\x93\x8f\x5d\x7a\xf5\xec\xf3\xcf\x3f\xf9\xe4\x4b\xcf\xbf\xe9\xb1\x5b\x5f\x7e\x66\xc2\xfb\xd9\x46\x34\x0f\x7d\x8a\x3e\x95\x3b\x83\x9d\xc1\x38\x0f\x7d\xa0\x0c\x3f\xf9\xe2\x0d\xfa\x35\xd3\xe7\xc5\xc8\x3d\xdb\x71\xb1\xdb\x96\x91\x7a\xdb\x2a\x10\xf6\x9b\x67\xc3\xdb\xd7\x3a\xf6\x41\x70\xed\xdb\x77\x1d\xfb\x29\x9b\x76\xa5\x33\xe6\x80\x6b\xfb\x23\xb8\xfc\x9b\x21\x93\x5b\x8e\x73\xf9\x07\x07\xfe\xe1\x06\xc7\xfe\x8b\x6c\x78\xcb\xb1\x55\xc6\xa7\xd8\x70\xce\xe9\xcf\x2d\xfd\x54\xd6\x57\x99\xd7\x96\x5f\xa7\xfe\x58\x7a\xb8\xe5\x68\xc7\xf8\x34\x1b\x6e\x3f\xba\xca\xbc\x96\xdc\xb5\x87\x2b\xec\xd1\xb7\xab\xf0\xcd\x8a\xd7\xb6\x1c\x05\x5c\x7b\xa3\xed\x0a\x11\x5b\x5a\xfa\xbc\xe5\x48\x07\x9e\xb8\x89\x67\x4b\xc0\x01\xcf\x97\xd3\xfa\x39\x42\x0e\xf7\x1c\xd8\x32\xdb\x31\x3e\x61\xd1\x39\xc7\x6d\xd7\x0c\x6b\x3d\xd7\x41\xa7\xa5\x37\x1d\x66\xef\xc2\xa8\xcb\x7e\x89\x6e\x79\x68\x6f\x70\xf1\x39\xe2\xd0\xd7\xe3\xdd\xfc\xef\x58\x50\x65\x5d\x69\x36\xbc\x7b\x9d\x2b\x2e\x73\xcc\xbb\xed\x36\xc7\xbc\x96\xbd\xde\xfd\x91\x03\x6e\xd9\x9b\xce\x45\x15\xf1\x91\xbe\x5e\xa7\x1d\xe2\xd9\xf0\x56\xa7\x1c\xf2\xe6\xba\x3a\x4e\xae\x88\x0b\xf4\xb8\xf6\x0c\x47\x7e\x92\xb6\xe4\x24\x58\x25\xbe\x88\x5a\xf3\x86\x1c\x7e\x58\x62\xc3\xca\xd1\x8e\xf5\x5a\x72\xae\x9c\xe9\x80\xdf\x8e\xe1\xd7\x33\x8d\xb9\x7b\xd4\xa1\xf2\x9f\x98\xb5\x43\x23\xea\x67\x60\xde\xb2\xa7\x39\x6c\x9b\x8d\x3d\xfa\xaa\xef\x1e\xfa\x16\xb6\x51\xe1\xd4\x78\xf9\x43\x66\xd5\xe0\x77\xbe\xf1\xef\xa5\x9f\x73\x49\x8b\x8e\x84\xa5\x9f\x0b\x2d\xfa\xa2\x24\x7f\x5b\xed\xf5\xc7\x8c\x78\x46\xa7\xfb\x38\xb7\xcf\xd0\xe1\xdb\x9c\xe3\x05\xb6\xb1\xed\x57\x6a\x1e\xd8\x34\x65\x4c\xfe\x1a\xd6\xe5\xdb\xd5\xe5\x69\x68\x5b\xf5\xfd\x6e\xbd\xdb\x1d\x3f\x1b\xf4\xdb\x77\x69\x0c\x3a\xdb\x8f\xa9\x22\x4f\x49\x8b\x7e\x1c\x6f\x83\x3a\x33\x5e\xc5\x96\x7f\x3e\x38\x05\x80\x19\x66\x35\x11\x7c\xcb\xb0\x79\x61\x73\xc8\xdb\x1c\x9a\x89\x3b\x67\x1e\x31\xab\xe9\xd4\x45\x33\x69\x7c\x15\x2a\x44\x79\x1b\x17\xce\xc0\x5e\x21\xe3\x03\xaa\x02\xa7\x94\x69\xbf\x42\xf9\xfd\xaa\x54\x07\xca\x00\x81\xba\x29\x94\x8d\xa6\xf8\x38\x1f\x1f\x4b\xa1\xa9\x20\x1a\x4f\x16\x83\x48\xa9\x9b\x9a\xf6\xd3\x31\x79\x62\xbf\x98\x4a\x79\x85\x80\xbf\x30\x31\x31\x51\x9a\xa4\x32\x68\x3c\x18\x64\x24\x86\x4f\x41\x1e\xa5\xb3\x19\x11\x46\x4b\xc1\x31\x60\xbd\x65\xe4\xd8\x70\xee\x1b\x38\xde\xc5\x77\x6e\x80\xd7\x88\x6b\x45\xfc\x4e\x68\x01\xae\xe9\x8e\x6f\x47\x9a\x6f\x64\x89\x15\xe0\xaf\xc4\xb0\xb9\x61\x26\x0c\x35\xd3\x0d\xc1\x70\x73\x7d\x83\x46\xfb\xa2\x79\x70\x26\x5e\x50\x3d\x0c\x35\x87\xa8\x51\x3e\x02\xc5\x38\x97\xe3\x78\x8a\x51\xd3\x94\x5f\x99\x8e\x29\x70\x52\x95\x29\x26\x12\xa3\xa2\x13\x28\x58\x37\xca\xf3\x65\x20\x4c\x04\xd0\x68\x62\x2a\x80\xf2\x9e\x24\x27\xf3\xfc\x74\xac\x6e\x74\x3a\x46\x8b\xa9\x4c\x5a\x88\xa6\xe2\x72\x6e\x7f\x31\x93\xf1\x32\x39\x39\x99\x40\x20\x97\x53\x39\xd1\xcf\x25\xa1\x1f\x15\xc6\x44\x65\x72\x32\x12\xf0\xc3\x60\x49\xc9\x91\x6f\xa7\x72\x2a\xb6\x2b\xbf\x23\xf4\x29\x6f\xaf\x77\x4f\x94\x80\xeb\xb5\x3d\xf0\xf8\x91\x0d\x04\x1c\x9f\x11\xe7\x70\xef\x8c\x1e\xc9\x31\xde\xc2\xe3\xa8\xe7\x99\x31\xe1\xac\xdd\x67\x54\x7f\x7f\x95\x60\xc3\xed\xf8\x7b\x55\xfb\xff\x56\xe0\xc7\x3d\xef\x5a\xef\x72\xd0\x29\x98\xf8\xdb\x8f\x74\x8c\x4f\x99\xf4\x54\xd6\x95\xd4\xe9\x57\x92\x04\x3c\xa9\xcd\xab\xe3\xd9\xf5\x4d\xc2\x6f\x64\x6d\xfa\x87\xb6\xba\xf1\xec\xfa\x5c\xa3\x5f\xfb\x29\x31\xaf\x16\x1f\xbe\x83\xf3\x0d\xb2\xae\xe9\x76\x9a\x63\xd6\x74\x5f\xbd\xd2\xbb\xfc\x1f\x2b\xdf\x74\xfd\x4e\xd6\xe4\x1d\x4b\xef\x75\xd6\x3b\xe3\x4c\x5a\xad\xda\x95\x56\x9d\x2d\x1d\xbe\xfb\xd5\x8a\xbd\xd1\xd7\x70\x4e\xc5\x1e\x60\x5e\x54\xd6\x26\xd4\xc7\xf7\xe6\x08\xdb\x83\x6b\x01\xeb\xe3\x87\x96\x13\xbc\x90\xec\x3d\x1e\x5a\x46\xe0\x11\x6c\x3c\x3b\x4e\x77\xd0\x6f\xe1\xe9\x86\x0e\x1e\x6d\x65\xd6\xb6\x7f\x13\x4c\x02\x5f\xec\x06\x4e\x64\x69\x6d\x8c\xf1\xb3\x37\xe8\x75\xcc\xda\x1f\xfc\x0e\x74\x03\xb0\xf4\xd7\x2b\xdf\xd2\x39\x65\xd8\x60\xbd\xcf\xd0\x17\x1a\xbe\xdc\x7e\x02\x5f\xda\xe6\x47\x6e\xda\x31\x4f\xc6\xa4\xab\x7f\x8d\x83\x2e\xd1\x94\x3d\xa2\x16\x21\xa7\xd7\xa8\xd0\xe9\x1d\xb9\x81\x18\xdf\xa9\xd9\xd0\x9d\xbc\x67\xb6\xb9\xdb\xd6\xba\x2d\xbe\x76\x9c\xe2\xf6\x45\xb9\x12\xa6\x47\xad\xd8\x67\x4c\x4f\x36\xe4\xd8\x1f\xd1\x92\xed\x3b\x1d\xf4\x5b\xfb\xdf\xd6\x47\xd0\xa9\xaf\xeb\xdf\xf8\x4d\xff\xe7\x78\x96\x6f\x54\xca\x12\x43\x0f\xdf\xef\x58\x73\xda\xa2\x75\xbe\x83\x26\x6b\x8f\xfa\xd6\x3b\x68\x4a\x99\xb4\x76\xae\x71\xe8\x83\x68\xe1\xbf\xcf\x81\x27\x69\x8e\xcf\xfd\xcb\x21\x63\x16\xfe\x61\xb3\xae\xfa\x37\xcb\xbc\x6f\xab\x0e\xf7\x02\x96\x1e\x3a\xc3\x6b\xfb\x59\xfd\xcd\xf8\x7e\x3f\x60\xe9\xbe\x5f\x4c\xda\xf3\x62\x19\xee\xc5\x7d\x10\x73\x9f\x39\xf0\x73\xa6\xbe\x75\x9c\xe4\xa0\xdf\xda\x7b\xab\x46\xb8\x0d\xc7\xf4\xec\x3e\xcf\x6d\xef\x74\x3c\x3b\x3e\x23\xd6\xab\xd7\x5b\xc0\xf0\x76\xb2\x86\xdc\xa8\x0d\xef\x21\x6b\xdf\xa4\x6d\xfe\x6f\x7b\xbe\x82\x0f\xba\x6e\x2e\x21\x74\x99\xa8\xa5\xe8\x58\x97\x6c\xf3\x79\xc7\xd7\x01\xc9\x07\x81\x0d\xf7\x9c\x89\x25\xf1\xb3\x0a\x5d\xd6\xed\xef\x73\x6e\x1b\xb2\x2f\x8f\xfd\xf0\x3b\x15\xb6\x42\x97\xf5\xcd\x15\x32\x87\xe9\xec\xf8\xaa\x63\x7f\x79\x13\xde\x65\xda\xa2\x1b\xcb\xcb\x7d\xbf\xa6\x1f\xd1\xf8\x30\x0d\x98\x55\xdd\x8b\xee\xfd\xf7\xf2\x93\xb8\x56\xe7\x1c\x06\x8f\x2a\x6a\xa8\x62\x78\xb8\x1d\x77\x23\x68\xbd\xc3\xfa\x99\x68\xcf\xbf\x7d\x8e\x83\x5e\x6b\xfe\xdc\x6f\xdc\x7e\x41\x9f\xa3\xf5\x76\xf7\x3e\x0f\xe2\x7e\x9d\x3b\xf0\x1d\x0a\xa3\x6e\xdc\x00\x7d\xb5\x91\x65\x1e\x89\x5f\xc6\x9f\x02\x9a\xc1\x69\xb8\x0f\x4b\xdc\xac\xad\xa0\x57\x54\x30\x1a\x46\xb8\x5f\xbd\x18\x5f\xfb\xf5\x47\xdb\x5a\x5c\xd2\x30\xd3\x13\x6a\xd6\xa2\x91\x86\x99\x8c\xaf\x11\x6a\x01\x4a\x3d\x5c\xb8\x1c\x62\xb7\xef\x1d\x59\x10\x80\x7b\x4b\x87\x42\x91\x09\xfe\xd3\x73\x50\xe9\xdf\x4f\xc2\x8f\xd1\x0c\x6a\x7f\x9b\xda\xb4\x61\x03\xf5\x86\xda\xa4\xfd\x29\x85\x3d\x31\x34\x35\x2e\x21\x4e\x1a\x2f\x03\x98\xe7\xf3\xb0\x20\xf0\x7c\x26\x06\x85\x40\x14\x71\x3c\x0f\x0b\x88\xa3\xaf\xe6\x93\x92\xc4\x45\x91\x8c\x84\x8c\x88\xee\x22\xdf\xcb\x78\xe3\x52\x61\x7f\x22\x95\xf2\x66\x0b\x85\x42\xa1\x94\xc9\xc7\x52\x50\x19\x43\x93\xd9\x28\x95\x44\x99\x08\x03\xf3\x88\x11\xb2\x63\xd3\xe3\x8a\x6b\x9f\x7b\x71\xbf\x3e\x97\x5c\x64\xd8\xf0\xf6\x96\x2a\xf2\x62\xf8\x35\x96\xde\xca\xbb\x7d\xc2\xe0\x7e\x6c\xa3\xce\x76\xe8\x8d\xe9\x07\xc3\x3b\x57\xe1\xdd\x49\x57\x93\x8b\xd6\x6f\x39\xf6\xd2\x92\xf9\xed\x99\xea\xb2\xbd\xe3\x2a\x87\x4c\x5a\x3a\x6b\xd5\x68\x93\xcc\x1a\x4a\x3d\x8b\xb4\xb9\x7b\xf0\x37\xf4\x9e\x25\x84\x9e\x6b\xeb\xbb\xb4\x62\x7d\x82\x4d\x93\xf2\x4f\x07\x4d\x92\x39\x77\xeb\x6d\x35\x68\xbd\xce\xc1\x27\x2d\xbf\xa2\x30\x7e\xe0\x96\x5f\x1d\xff\xf6\x4b\x08\x3e\xbd\x81\xe5\x14\xf3\xb5\x87\x9e\x59\xd5\x67\x0f\x31\x0e\xdf\x22\x5a\x7a\x58\xef\xb6\x0b\x7a\x0c\x31\x70\x83\xc3\xae\x59\x71\x50\xc7\x89\x0e\x7a\x92\x6c\xb8\x1d\xf7\xcf\x19\x74\xd6\x7b\xca\xea\x7a\xc3\xd0\x39\x54\xdd\x4f\x54\xd6\x62\xd3\xe1\xed\xf7\x38\xe0\xa2\xb5\xc7\xdf\xac\xd0\x63\x1d\xcf\x3c\x87\x5f\x49\xb2\xe1\x41\xec\xdb\x07\xf7\x13\xf6\x91\x88\x2b\x77\xf3\x6e\x3b\xa5\xcb\xdd\xd0\xf1\x6e\x3b\xab\xcf\x2b\x5f\xec\xa6\xd3\xb0\xe3\xdf\xb5\xe0\xcb\x7d\x7b\xe8\xef\x19\xfc\x6c\xd9\x02\xc0\xe3\xe5\xcf\x97\x86\xb8\xf9\x64\x9c\x60\xe0\x22\x6b\x43\xe3\x5e\x21\x06\x7c\xb9\x63\xee\xb8\xe5\x8b\x22\xee\xbd\x31\xe0\x8d\xc4\xf8\x1d\x96\xee\xac\x6a\x9b\x37\x1f\xac\xf8\x0d\x47\xea\x55\xc6\x5c\x5f\x07\xaa\xee\xef\x5a\x6f\xad\x58\x1f\x1e\xdf\x7a\x0b\x61\xef\x5e\xa4\x05\x30\x0f\x2c\x00\xcd\xe0\x2c\x70\x15\xb8\x1d\x3c\x08\x1e\x01\x4f\x03\x19\x6c\x05\xdb\xcd\xf7\xab\xb4\x8f\xec\x36\x85\xaf\x2f\xe1\x96\x6c\xb4\x6f\xe1\x4a\xbd\x92\x66\xb8\x71\xb6\xfe\xd6\x0d\x9f\xc8\xd9\xed\xd6\xf4\xab\xaf\x9e\xa6\xe6\x26\x5c\x1f\x72\xd6\x6c\x5f\xe3\xcc\x86\x66\xfd\x02\xd4\xdc\xaa\x50\x18\x9a\xd9\x40\xd8\xcf\x06\xc3\x7e\x36\x90\x06\x74\x29\xb4\x0d\x28\xfd\xde\xa3\x17\x0b\xc7\x1d\xf7\x75\xe1\xcc\xdb\xe7\xcf\x9d\xdd\xfc\xb5\xf0\xb6\x91\xe3\x32\xe9\x91\xc3\x47\x6e\xcf\xdc\x93\xbe\x5e\xb8\xe1\xf6\x91\x5f\xfc\x62\xd7\xac\xe3\xce\x7d\xe0\x9e\x6f\x7c\xfd\x49\x74\xd5\x95\xe9\x6d\xe7\x3e\xe9\xb9\xa8\x24\x0a\x42\x0a\x8e\x07\x82\x72\x34\x10\x94\x84\x4c\x26\xc9\xc7\x13\x42\x8c\x8b\xa7\x39\x01\xc5\x15\x21\x9d\x8e\xc7\x78\x4e\x88\xc6\x12\xe9\x98\x58\x0a\x52\xe3\x93\x05\x11\x09\x99\xfc\x38\x14\xb9\x2c\x14\x83\x7c\x8c\x4b\x71\x30\x1e\x61\x90\x10\x8b\x41\x11\x09\x50\x4a\x65\xf8\x48\x34\xc0\x64\x13\x3c\x23\xf8\x63\x99\x00\x93\x8a\x72\x4c\x3a\x99\x8e\xa4\x62\x7e\x86\x8f\xc8\x89\x40\x30\x18\x18\x4b\xa4\x13\xa9\x54\x84\x4f\xf3\xe9\xa8\x77\x22\xa3\x0a\x28\x86\xe2\x09\x98\x82\x79\x8f\x9f\x8b\x46\xf9\x04\x1a\x17\x04\x21\x9a\x4c\xa4\xc5\xc9\x31\x21\x9e\x10\xc7\x84\x74\x5a\x88\xf1\xf1\x54\xaa\x38\x99\xe0\x93\xe9\x2c\xe5\xd7\x4c\x79\x3a\x6d\x9a\xf2\x42\x8c\x87\x79\xcd\x94\xc7\xa8\x04\x4a\xc7\xe0\x28\x0a\xa4\xb3\x63\xd3\x63\x39\x87\x1d\xd2\xe5\x61\x08\xd7\x67\x03\x87\xe0\x3e\xdd\x59\x5a\x21\x6a\xa3\xae\x02\xe7\x82\xab\xc1\x0d\x60\x0d\x10\x9d\xf5\x3c\xf5\x87\x5e\xcd\x46\xdd\x4e\x5c\xd9\xd3\xda\x9d\xfa\x85\x5a\xc6\xad\x79\x44\xed\xcf\xa2\xa6\xe6\x06\x68\x54\x62\xaa\x0f\xe1\x94\xbc\xe1\x08\x9f\x96\xb7\x9e\x10\x5e\x0e\x1b\x0e\xa3\x7c\x46\x3e\xdb\xa4\xbf\x19\xc3\x15\x4e\x34\xf9\xf0\xfa\xc2\x8d\x87\x41\x43\xbe\x16\x85\x68\xfd\xf8\xd6\xd7\x38\x87\x0a\x24\x04\xb9\x58\x2c\x16\x61\x90\x2a\xc2\x58\xb1\x38\x35\x85\xa6\x60\x26\x23\x7d\x31\x29\x09\x79\x98\x82\x45\xc4\x04\x61\x16\x25\x82\x30\x8d\xa4\x64\x2e\xa7\x8a\xde\x2c\x62\xa8\xe0\x7e\x06\x16\x19\x14\xf0\xc4\xc6\xfd\x28\x58\x37\x86\xd2\x1c\x37\x15\x8c\x4b\xc9\x98\xc2\xa3\x49\x0f\x17\x81\xa9\xe9\x68\xdd\xd8\x74\x74\x42\xe0\x52\x1e\x21\x95\x10\x26\x21\x17\x55\x44\x7f\x32\x9d\xcc\x07\x46\x53\x11\x3f\xe2\x04\x75\x8a\x87\x72\x1a\x09\xc5\x24\x4c\xd3\x4a\x82\x8b\x44\x12\x7c\x22\x4e\xf9\xd5\xa9\x78\x82\x4f\xf0\x29\xe4\x47\x93\x85\x51\x18\x84\xa3\x41\x14\x80\x39\x8e\x8b\xe5\x63\x3c\xca\x25\x39\xe4\x87\x53\xc1\x20\xc7\x05\x83\x68\x2a\x1a\x89\x46\x63\xd1\x68\x20\x15\x8c\x04\x02\x51\x94\xe5\xb3\x5c\x24\x1a\x8d\xc6\x12\x9c\x14\x89\x15\xd2\x01\x21\x20\x8c\x45\x85\x60\x2a\xca\x09\x71\xb7\x1f\x65\x68\x79\x99\x43\xaf\x79\x4b\xdf\x49\x7f\xb2\x9b\xce\x30\x6b\x9f\xfa\x29\xf8\x3b\x00\xb1\x9b\x38\xc0\xac\x1a\xdc\x4f\x83\x65\x57\x73\x76\x7c\x97\x30\x7f\xaf\x1d\xc7\x95\xc0\x63\xf4\x61\x4a\x80\x63\xc0\x09\x20\xa2\x57\x49\xaa\x0f\xcd\x0c\x01\xaf\x6f\x0e\xac\x6f\xa8\x07\xb0\x71\x0e\x8e\x67\xf4\xe2\x49\xda\xc6\xe9\x8f\x58\xe9\x6c\x02\x15\x50\xc6\x13\x50\xd3\x30\x00\xf3\x49\x14\x43\x63\x0a\x9a\x44\x9c\x00\x47\xa7\x54\x99\x9a\x42\xa3\x48\x89\x52\x93\x14\xaf\xa4\x45\x59\x29\xc5\x84\x84\x1c\x17\xe8\x84\x1c\x0b\xaa\x45\x19\x09\xf9\xfc\x04\x1c\x2b\x8d\x79\xa2\x28\x5e\x06\x4a\x11\xa6\x64\x0a\x04\xfc\xb2\x10\x45\x53\xb9\xf8\x98\xa4\x14\xf8\x51\x05\x58\xb5\x23\xd3\x6c\x78\x04\xf7\x5f\xe8\x08\x5b\xe7\x6f\x31\x3d\x6e\xe8\xc5\xf5\xd9\x7a\xff\x68\xc1\x8d\xfa\x81\x43\xf8\xce\x5a\xef\x7b\x04\x1c\xf7\xf9\xed\xc5\x1d\x85\x36\x7f\x46\xc0\x31\xfe\xa1\xe3\x6c\xff\x00\xbc\x40\x2c\xcb\xf8\x9c\xc9\xae\xed\x02\xec\x56\x79\x33\x8d\x6a\x62\xcd\xa1\x19\xa1\xfa\x79\x10\x5f\x9e\x32\xea\x2c\x47\xbd\x39\x55\xc0\xdd\x61\x22\x5f\xf8\x3d\x51\x95\xa7\xf2\xaa\xa0\xe8\xfd\x60\xe0\xe4\xb4\x64\xfe\x8b\x8e\x95\xb8\x31\x79\x42\x96\x27\xe4\x31\x2a\x88\xeb\xfa\xfa\xd5\xf4\xd4\xd4\x14\xf0\x82\x74\x39\xe3\x13\xe9\x04\x51\xb1\x18\xef\x8b\xb3\x7e\xae\x4d\x83\x51\xdb\xcc\xdb\x18\x74\x77\xab\xa1\xf3\x71\xbc\x49\x5c\xa9\x40\x49\x6a\x9a\x2a\xaa\x8c\x27\x36\x55\xf4\xc4\xd4\x00\x35\xa9\xa6\x28\xb9\x34\xee\x89\xa8\xc9\x28\x55\x54\x27\x28\x80\x00\xa5\x50\x60\x3a\x69\xfe\x8b\x4e\x88\x01\x7f\x46\x4a\xab\x89\xb4\x94\x96\xe5\xb4\x94\xa6\xb2\x69\x49\x60\xa4\xd2\x54\x26\x93\x41\x42\x26\x93\x31\xcf\x62\xb4\x98\x28\xca\x86\x3b\xf0\xb7\xc0\x3d\x38\x5f\x05\x07\x81\x64\x39\xed\x93\xe9\xb8\xf5\xb6\x89\xec\x58\x43\x7c\xa9\x81\xd8\x6a\x54\xe3\xad\x73\x35\x30\xe1\xe5\xf6\x17\x94\x3a\x50\x02\xda\x1f\x24\xd1\x93\x5f\x04\x46\xbd\x09\x35\x4b\x29\x6a\xd2\xc3\x4f\x8d\x7a\x78\x6d\x51\x6a\x56\xc1\x0d\x6b\x92\x30\x3f\x3d\x69\xfe\x8b\x8e\xab\x93\x90\x4f\xa0\x09\xcd\xae\xc6\xd5\x62\x5c\x88\x8b\x62\x5c\x88\xc3\x58\x22\x91\x40\x45\xab\x36\x9b\xde\x53\x57\x62\xc3\x7b\x71\x8e\xbd\x17\xdf\x7b\xc0\xb5\xee\x04\xfc\xfe\xf5\x10\xfc\xbe\x7d\xb6\x0f\x2b\x08\xf0\x36\x02\x8f\x59\x76\xa9\xc9\x3c\xcb\x33\x5e\x79\x34\xe9\x5f\xa1\x3c\x53\x4a\x14\x0a\xb0\x90\x44\xda\xff\xcb\x28\x18\xa7\x84\xac\xa7\x80\x92\x9a\x90\x64\xd3\x89\x6c\x32\x05\x73\x5f\xc4\xa1\xc2\x27\xe5\x74\x3c\xaf\x09\x0c\x12\xe9\x4c\x34\x8a\xc6\x65\x45\x81\x09\x94\x1b\x93\x61\x00\x15\x15\x54\x94\x51\x30\x37\x1a\x2d\x88\xb2\xac\x64\xf8\x6c\x01\x4e\xc8\x90\xd1\xf9\x9f\xf0\x68\x32\x4c\xef\x35\xfb\x59\xa6\xf4\xbb\x72\x23\xb8\xc2\xd1\x5e\xfb\x8e\x98\xf1\xc6\xa1\x07\xbf\x85\xdf\x6b\x7f\x4b\x88\xeb\xbd\xa5\xf7\x6e\x72\x8c\xe7\xcb\x31\x5d\x97\xf6\xe2\x1e\x89\x7b\xbf\x6e\xc1\x79\x5f\x14\xe3\xff\xbb\x6b\x3c\xa7\xe7\xa2\x7b\x5f\x74\xc1\xe3\xbe\x04\x86\x2f\x77\xc1\x8d\x9a\xdd\x3a\xfe\xc1\x93\x08\x78\xca\x86\xef\xea\x36\x74\x32\x59\xce\x68\xb1\x0b\xf0\x82\x43\xc0\xf1\x60\x31\x58\x69\x54\x75\x9b\x33\xb7\xce\xeb\x9b\x33\x57\xf3\x22\xf8\x1f\x18\x84\xf7\x60\x21\x34\x2b\x00\x12\xbb\xa3\xeb\x8b\xfe\x22\x9f\x2a\x26\x50\x0e\x65\x83\x30\xe1\x89\xc3\x18\x8c\x26\xd0\x18\x1a\x4d\x66\x04\x09\x0a\x50\x8c\x23\x06\xc9\x68\x52\x1d\x4b\xc0\x09\xc8\x64\x33\x19\xa9\x30\x5a\x9a\xaa\x13\x50\x80\x1a\x57\x23\xf9\x24\x9f\xe3\xe3\x30\xff\x85\xdf\x13\x51\xa3\xd4\x18\x62\xe4\x78\x54\x8c\xf1\xb4\x90\x2a\x24\xa5\xa4\xc8\xcb\x52\x2e\x91\x89\xa7\x93\x62\x4c\x4a\x28\x62\x52\x8a\x27\x13\xa9\x64\x3a\x99\x44\x51\x29\x27\xa1\xac\x9c\x8d\x49\x82\x2c\xc3\x84\x94\x43\x4a\x2a\xcd\x09\x49\x60\xf5\xbf\xd2\x78\x25\x63\xfb\x75\x3d\xc1\xdb\x02\x01\x4f\x12\xf0\x9c\xcd\xab\x21\xbb\x77\xe3\xb9\xbe\x4b\xb1\xff\xb8\x16\x9f\x15\xde\xb7\xdb\xac\xd3\x9c\xd1\xed\x60\xcf\x33\x38\xfe\xfb\x86\x63\xef\x2c\x3c\xbb\xef\x01\xb6\x6e\x27\x71\xff\xd7\x47\x2b\x64\x46\xef\x81\xbf\xdb\x25\x63\xc6\x99\xd3\xae\xf3\x5d\xe3\x45\x5f\xdc\xc6\xdf\x71\x29\x31\x2f\xae\xa7\xa9\xc3\xf7\xac\x23\xe6\xc5\xb2\x3a\x70\xaf\x0b\x0f\x4f\xae\xd7\xea\xef\x94\x30\xef\xc9\xec\x7a\xd7\x31\x3e\x51\x8e\xeb\xf0\xbd\xb8\xbf\x5f\xcf\xd3\xc4\x78\x99\x80\x3f\x45\xd0\xa9\xe7\xa9\xb8\x3e\xf7\xde\x13\x88\xf5\x8a\xf6\xbc\xfb\x4c\xbe\xa5\xcb\x09\x83\x6f\x73\x02\x80\xa5\x73\x29\x02\x7f\xda\xc4\xcf\xda\xfd\xa6\xac\xfd\xda\xbd\xc0\x81\x3f\x56\x4e\xea\xbd\x15\x86\xff\x36\xa1\xe5\xcd\x4c\xc4\x1c\x9f\xd6\xf3\xa9\x91\x4f\x2a\xe8\x21\xf6\x6b\xcf\x49\x15\xf8\x7f\xec\x1a\x9f\x36\xde\x24\xe1\xf1\xd6\xb9\xbb\xb5\xde\xdd\x2f\x38\xc6\x5b\xfc\xef\x98\xe3\xe2\xa7\x51\xa7\x7c\xd7\x46\x17\x9c\xe0\x27\x4b\x0f\x9f\x63\xe1\x5f\xe1\xdb\x43\xa7\x99\x35\x7d\xb7\x07\x3f\x5f\x79\x9c\x16\x95\xec\x9d\xf3\x4f\xb0\xe2\x56\xae\xea\x7e\xee\xfb\x3e\xb1\xbe\x9c\x2d\x17\x3d\x3f\x20\xe6\x11\xed\x79\x7a\xbb\x08\xb9\x90\x6c\x3c\x6d\x1c\x61\xf3\xb2\xf6\x3e\x0f\xfe\xcb\x41\xaf\x96\x37\xad\xab\xbe\xbe\xe1\xbf\x61\xf9\xfa\xb6\x7b\x7d\xbd\x9f\x55\xac\x5b\xe7\xc7\x3f\x2b\xe4\x94\xb0\x9d\x8a\x9f\x18\x2f\x99\x7a\xc9\xd0\x9d\xf3\x09\x78\xce\x86\xef\xb9\xcf\x8d\x7f\x10\xf7\xed\xdb\xfd\x32\x20\x7d\xae\x60\xae\xcb\xea\x9f\x95\xc0\x6f\x59\xd3\x6c\x78\x9f\xde\xa7\xfb\x5a\x02\x2e\xd0\x8a\xc1\xb7\xf0\x6e\xc4\x45\x58\x7a\x50\x2d\x32\xd6\xda\x6c\x5c\x07\x3b\x78\x67\xf5\x33\x73\xac\x4d\xb0\xf7\x66\xe7\x9f\x08\x9a\x38\x3c\xfe\x5a\x5c\x03\x1e\xdf\x38\x1e\x7c\xd9\xe2\x2b\xce\x91\xf5\x39\xfa\x92\x04\x2e\xd9\xc6\xb5\x7b\x2b\x21\xc7\x59\x9b\x7f\xdd\x5e\x6b\x0e\x41\xd7\x43\x6d\x7f\x58\x7a\xf0\x8a\xea\xe3\x7b\x53\xc4\x1a\x64\x9b\xaf\x1b\x3e\x26\xe4\x8b\xd0\x07\xa2\x5f\xa5\x03\xcf\xce\xbf\x3a\xce\x1d\x04\x36\xbc\x13\x7f\x1d\x1d\xfe\x1b\x63\x8f\x27\xf0\xe4\xfe\x66\xcd\x9b\xd4\xc7\xeb\x72\x34\xf4\x7b\x42\xbe\x2c\x5e\xb3\xf4\xee\xa9\xea\x72\x37\x7c\xb7\x43\xee\xac\xf5\x2a\x14\x61\xd7\xd2\xf6\x9e\x6d\xfe\x07\x31\xfe\x15\x0b\x4f\x4b\xe7\x5f\x20\x0d\xc0\xe2\x22\x67\xce\x91\xb5\x75\x67\x68\xab\xc3\x56\x59\x73\xec\x2e\x38\x69\x62\xd6\xec\x9d\x53\x37\x63\xf9\xf2\x95\x67\xb1\x74\xe7\x3b\x6e\x39\xd6\xe7\xdf\xfd\x13\x02\x9e\xc2\xf0\xd3\x2a\xf4\x24\x6f\xaf\xaf\xb3\x9b\xd8\x7f\xbd\xde\xd3\x4f\x2b\xec\x8f\x7e\x9e\xbe\xa9\x42\xf6\x9e\xd5\xec\xc9\xe0\xb5\x9f\x4f\x2f\x6b\xe2\x4e\x66\x56\x0d\x1d\xb9\x12\xae\x08\x71\x51\x6b\x5f\x93\xf6\x7e\x6c\x41\xc4\x5a\x24\x7b\x8d\x6d\x24\xbd\x59\x1b\x3e\xfc\x04\x11\xfb\x10\x76\xa9\xf7\x0f\x6e\x3b\xba\x13\xdf\x4b\x19\xf8\x33\x31\x9e\x90\x9b\x1d\x64\x7d\x72\xfd\x0c\xfb\x7a\x06\xb0\x74\x5f\x22\x62\xd3\x83\x75\xa8\xe3\x34\x97\x9e\x3a\xfc\x52\x47\x83\x05\x37\xf0\xeb\x72\x6c\xf5\x49\x73\x8d\xb7\xbe\xd9\x59\xe3\x87\x2e\xac\xd8\x87\x8c\x6d\x4f\x36\xce\x71\xec\x67\xc6\xc4\x63\xf5\x95\xb3\xe4\x6f\xf0\x50\x17\x9d\x31\x72\x7c\xfb\x75\x6e\x7b\xd5\xbf\xb2\xc2\xfe\x60\x79\xe9\x7c\xc2\x86\x03\x1f\x48\x94\xcf\xf7\xdd\x4b\xa7\x8d\xda\x07\xc7\x83\xaf\x81\x25\x80\x03\x00\x12\xf5\x4e\x67\x84\xea\x43\x38\xc7\x9a\x6d\x54\xe6\xf5\x35\x2e\xc4\x71\xdf\x5c\x1c\xc9\xe1\x41\x38\xc6\x9b\x81\x8f\x9c\xf4\xfc\xd4\x97\x50\x03\x9e\x43\x7a\xd4\xcd\x7b\xf6\x50\x67\xaa\x2f\x50\x6b\xd4\xcd\x2a\x2f\x07\xb3\x52\x5a\x94\xd2\xb9\xd4\x24\x1c\x0f\xa0\x31\x24\x05\x61\x0c\x8d\xc3\x48\x16\x4e\xe6\x60\x00\x4d\x8a\x72\x34\x2a\x71\x28\xc5\x07\xa4\x20\xe7\xbd\x4a\xed\x79\x4f\x9d\x77\xe7\x9d\xf4\x61\x88\x87\x87\x4c\xbf\x08\xbf\x82\xfe\x45\xd7\x45\xe3\x82\x9c\x91\xd3\x05\x31\x35\x36\x1d\x90\xf9\x98\x12\xa5\xa2\x52\x41\x92\x0a\x92\x3a\x09\xc7\x23\xb9\x74\x50\x4e\xcb\x85\x68\x41\x36\xd6\x6d\x7c\x23\x1d\x5a\x5e\xe1\x67\x24\x7b\x3f\x3b\x4e\x20\xf4\x3a\x61\xeb\xb5\xd5\x67\x4e\xe3\x1f\xa7\xf1\x6f\xcf\xc5\x2e\xbe\x72\x3e\x9e\xd8\xff\x5d\x16\x7c\xa5\x6f\xbb\x6d\x07\x46\xea\xc0\x83\x65\x75\x69\x7c\xe5\xd1\x56\x1e\x20\xb0\xe1\x6d\xf8\x65\x80\x83\x26\x2c\xf3\x9b\x7f\x58\x1d\x6e\xd8\x9a\x1f\xba\xf3\x89\xdd\x2f\x56\x89\x05\x34\x9f\x78\x8e\x0b\x6e\xd4\x1c\x93\x8b\xd8\x76\x93\xb2\x81\x65\xb2\x77\xa8\x62\x7c\xc6\x9e\x77\xe3\xd5\xee\xd8\x4a\xef\xad\xe7\x18\xaf\x58\xfe\x87\x1e\x6c\x71\xd8\x12\x4b\x56\xad\xef\xcb\x09\x1c\xc3\x1a\xba\xc0\xd0\xfb\xae\x70\xf8\x0c\x81\x0d\x8f\x2c\x74\xf0\x5a\x8b\x95\xd2\x84\x4f\xf2\x10\xe3\xd3\x84\xce\x86\x88\x79\xe3\xf6\xbc\xbb\xce\x73\xd0\x69\xfb\xdb\x7a\x82\xcf\x7a\x2d\xf7\x9f\x54\xe1\x83\xe5\xc3\xda\x17\xbb\x7d\x9b\x6e\xcf\x37\x6d\xf7\x57\xb1\x69\x0c\xdd\x77\x99\x5b\xe6\x86\x96\x39\xf0\xdb\x3d\xb3\x8f\xc6\xb6\xf1\xe8\xea\x36\xde\xea\x6d\x68\xc5\x1e\x3a\xfe\xf6\xf9\x04\x3f\x89\xf1\x1d\x41\x02\xff\x00\xce\x09\xc6\x8f\xd2\xfc\x8e\x89\x9f\x2b\x8b\xfa\xbc\x3b\x93\xda\xbc\x5b\x78\xc2\xb6\xc8\x36\xdf\x3a\x5b\x09\xdf\x4f\xd8\x70\xf9\x69\xb7\x0d\xd7\xf9\xd3\x85\xdc\xbe\x76\x18\xbf\x9b\x1f\xfe\x1b\x01\xc7\xe3\xb3\x95\x31\x2c\xa1\x93\xbb\xce\x22\xd6\x95\x24\x74\xec\x6d\x02\x4e\xe8\xc5\xde\x06\x82\x4e\xfd\x9d\xf8\xfb\x58\x7e\xae\x77\xf8\x53\x6b\x1f\x87\xcc\xb3\xa9\xb8\xf9\x2d\x78\x27\xfe\x26\x33\x8c\xef\xe6\x01\x3f\xc6\xff\x0e\x9d\x01\x5f\xc1\x95\xcc\xe7\x82\x53\xc0\x2a\x70\x1e\x58\xad\x9f\xca\xb2\x5e\xdf\x1c\x48\x79\x1b\xc1\x8c\x26\xa2\xc4\x08\x64\x67\xf8\x28\xcf\xdc\xd9\x94\xa7\x91\xfd\x52\xf6\xd2\x7b\xb5\x1c\x08\x16\x61\x24\x81\x8a\x65\x90\x47\x53\x69\x98\x7c\x51\x89\x8b\x09\x3e\x98\x4c\xc6\xa0\x92\x0c\x2a\x81\xa4\x3a\x2a\x45\x24\x59\x56\x9f\xfd\x72\x76\x94\xce\x44\xb8\x58\x19\x48\x0a\x3e\xc7\xc8\xa7\xa1\xbf\x0c\x4a\x4c\x3a\x19\xc8\x06\xe3\xd4\x28\xca\xa3\x5c\x14\xa6\x60\x2c\x12\x41\x0a\x1a\x8f\xc3\x68\x9d\xfc\x25\x4c\xac\x43\x0f\x76\xf1\x0e\xbb\x12\x2b\xc7\x8d\x1e\xe6\x9a\x5c\x87\xb7\x8a\x58\x4b\xa6\xad\xbd\xc6\x76\xb3\xeb\x8f\x15\x7e\x8a\xf0\xa7\x3b\xc9\x77\x09\x86\x6c\x04\x01\x4b\x77\xfd\x36\x4a\xca\x92\xad\x9b\xb3\x2a\xe2\x20\x8c\x67\x9f\xbf\xba\xcd\xe9\xbb\xc4\x9d\xd7\x18\xfe\xe0\x78\x47\xdc\x64\xe5\xf1\x7d\xe6\x7b\x94\x24\x8e\x43\x32\x6c\x78\x00\xd7\x7c\x6a\xfd\xba\x3b\x6e\xd2\x75\x64\xd7\xf1\x80\x8c\x37\x4c\x9d\x0d\xef\xc4\xaf\xf6\x77\x46\xad\x9f\xe9\x6f\xda\x72\xd5\xf5\xc1\xe8\x11\x72\xad\x1b\xd7\xe6\xdb\x2b\xe0\x58\xbe\xb7\xbd\x52\x81\x87\xec\x41\x72\xad\x43\x3f\x33\x6c\xb8\xff\xe0\x2a\xe3\x35\xbd\x9a\x5f\xa1\xb7\x84\xdd\xcc\x46\x1c\x6b\x16\xd9\xf0\xc0\x27\x15\xb9\x3f\xde\x9b\xec\xde\x0a\x78\x0a\x9f\x5d\x60\x1e\xf5\x5f\x40\xe0\xd7\xfb\x61\xde\xe0\x9a\xd7\x91\x1f\x75\x1c\x47\x8c\x4f\xe1\x3b\x19\x7a\x2e\x72\x36\x31\x5e\x3f\x33\x79\xb0\x62\xbd\xc4\x1e\xef\xbc\xdf\xbd\x2e\x1d\x3e\x30\xee\xf6\x13\x3a\xbc\xff\x93\x6a\xf4\xb0\x74\xee\x07\x0e\xbe\x49\x16\xfe\x85\x15\x39\x24\xce\xcb\x06\xda\xb0\xa4\xd6\x3b\x7f\xa6\xdb\xf2\x9d\x77\x54\xd7\x83\xfe\x36\x87\xdc\xf1\x6c\xb8\xad\xdb\x11\xff\xc6\xcc\x3b\x57\x43\xb8\x77\xe3\xd0\xd1\x8e\xf1\x9a\x6d\x3b\x5e\xd3\xc1\xec\xf9\xf8\xab\xf3\x9f\x9d\xeb\xc8\x1e\xe3\xe2\xb7\xe1\x7f\xf5\x18\xb5\xbf\x44\xf8\x5f\xbc\xcf\xd9\x0e\x57\xae\x10\xd7\x69\xdd\xf9\x70\x45\x8c\x95\xb7\xf9\x97\xfd\x89\x5b\x47\xfa\x2f\x73\xf9\x77\xc3\x5f\x0c\xbc\x56\x81\x3f\x65\xef\xff\xce\xa3\xdc\x72\x97\x5d\x50\x25\xd7\x49\xb3\xe1\xbe\x78\x95\xd8\x5e\xa3\xa7\x52\x3f\xb0\x2e\x8f\x0c\xe3\x7b\x2e\xf8\xe4\xa6\x35\x55\x2d\x6f\xda\xb7\xd6\xe2\x6b\x1c\xdf\x37\x58\xfb\xe4\xf7\x00\x43\x6d\xe4\xc0\x92\x63\x58\xba\xe3\x27\xb8\x36\x91\x16\x53\x9f\x83\xcf\xaa\x4f\x00\x27\x83\x33\xf4\xae\x02\xb0\xa9\x1e\x37\xbe\xaa\x6f\xaa\x6f\x9a\x81\x8b\xd3\x1f\x41\x7f\x15\x36\x9e\xba\xb0\xb9\xbe\xc1\xf8\xff\x2f\xe7\x30\x18\x19\x02\xb9\xc4\xcb\x45\x66\x2b\x7c\xe2\xe2\x73\x1e\x09\xdd\xba\xa4\xb8\xb5\xb8\x15\xcd\xfd\xb2\xde\x01\x45\x61\x5a\x9d\xa2\x00\x92\xd1\xfc\xb1\x31\xe4\xbf\xfc\xba\x2d\xec\x09\xf0\x1c\xb5\x8e\x2a\xa9\xbf\xa7\x7e\xe8\x79\xe6\xbf\x76\x07\x56\x9e\x61\xed\xf9\xce\x6f\xba\x6d\x59\xdb\xac\x2a\x36\x2e\xcd\x86\x7b\x3f\x75\xec\x55\x0c\x9f\x97\x18\xbe\x83\xa1\xdb\x3a\xab\xea\x12\x3d\x90\x70\xe7\xb7\xd9\xd5\x15\x7b\x9e\xb4\x75\x7e\xdf\x89\x6e\x19\xcc\x1e\x5e\x61\xe3\x64\x1b\x7f\xdb\xc9\xd5\x63\xb1\xec\xf3\xee\x75\x19\xb2\xd9\xe2\x88\xb5\xad\x18\x2a\xbb\xce\xa1\x2b\xb6\x4e\xfc\xd1\x21\x9b\x56\xec\xdc\xff\xbe\xdb\xcf\x0c\x7d\xee\xd0\xf7\x84\xf5\x3d\x19\xfb\xa5\xde\xef\x13\x3a\x84\xe9\x91\x8f\xc7\x39\xc4\x09\xd5\xf3\xe0\x5d\x27\x54\xf7\x7b\x72\xc2\x6d\x13\x75\xb9\xef\xcd\xbb\xed\x89\xee\xf7\xda\xbe\x5f\xe1\x57\x75\xff\x79\x2c\x01\xcf\xdb\xeb\x92\x1b\xdd\xb1\x79\xdf\x41\x0e\x79\x88\x9b\x3a\xaa\xc7\x62\xb9\x0b\x1c\xb6\xd5\xa6\xf3\x0a\x07\x3d\xf7\x18\xf4\xac\x7a\x66\xa4\x7c\x3f\xf7\xe4\xd2\x10\x11\x1b\x58\x73\xf7\xb6\xba\xe3\xc3\xce\x1b\xed\xbd\x37\xe2\x3d\x85\xce\xe0\xaf\x65\x27\x82\x05\x60\x29\x88\x1b\xbd\x6b\xc8\x4c\x78\x36\xed\x3b\x62\x76\x68\x66\xe8\x38\xd8\x74\xea\xa2\xd9\x87\xc1\x86\x13\xc2\x8d\x21\xa3\x94\x58\xfd\x1c\x4f\xb8\xd1\x3b\xf3\xcb\x65\xca\xcb\x64\x55\x51\x14\x2a\xa9\x2a\xd4\x48\x7c\x74\x34\x00\x15\x24\x72\x99\x60\x24\x20\x06\x13\xf1\xe4\x58\x1c\xe5\x24\x25\x9a\x9b\x8a\xc3\x89\x20\xe3\x47\x45\x35\xf7\xe5\x14\x9c\x4a\x97\x26\xbe\xfb\x5d\x4f\x50\xfd\x10\x3e\x5c\xb7\x3d\x13\x0c\xa4\x13\x92\x98\x19\x8d\xe6\x84\xb1\xd1\x62\x30\x96\xe1\xa3\x71\x6a\x32\x80\xc6\x12\x89\x80\x0c\xd3\x5f\x4e\xd7\x09\x9d\x60\xe9\xde\xa2\x5b\xe7\x8c\x73\xae\x83\xdc\x3e\xad\xaf\x32\xde\x20\xbe\x11\x74\x1c\xe3\x8e\x5b\xf4\xfd\xeb\x7b\x90\x80\xe3\x6f\x31\x1d\x47\x57\xc9\x7b\x2d\x3c\xad\x6b\xdd\x76\x7f\xdb\x0b\x8e\xf1\xee\x18\x6e\x0d\x91\xff\x90\xf4\x98\xfe\x26\x5d\x16\x74\x1d\xed\x9e\xd6\xfc\xc4\xd6\xa7\xb5\x9f\x8e\x9c\xe4\xcc\xd1\xf5\xb8\x72\xf0\x77\x6e\x5f\x34\x14\xad\xc8\xf9\xb2\xb6\x7d\xcb\xbe\x4b\xc8\xbf\x64\xca\x3f\x43\x2b\x97\xb8\xed\x86\x4e\xd3\x8e\x37\x09\x5a\x89\x9e\xe6\x8e\x58\x07\xdb\xc3\xee\x9b\x2a\x62\x29\xfd\xbe\x12\xa6\xb3\xfd\xe7\x8e\x9c\x4c\x34\x79\x3d\x5c\x71\xfe\xbd\xef\x5b\x0e\x3c\x31\x7c\xbe\x6e\xd2\x1f\x1e\xc1\xa7\x87\xad\x37\x5b\xb4\xe2\xfd\xd9\x7d\xa3\x7e\x56\x6b\xe1\x4a\xea\x6b\xd8\x13\xae\xc8\xcb\x74\xb9\xb8\xc7\x75\x2e\x61\xe4\x08\x43\xbf\xad\xb0\xe9\x44\x1e\x97\x6b\x71\xef\xbf\x0e\x1f\x31\x6b\x08\xde\x56\x16\x7c\xdb\xe8\x87\xd9\xf0\xfa\x93\x3e\x7f\x8f\xa5\xbb\xa7\x1d\x39\x82\x15\xe7\xf4\x85\xaa\xed\x0d\x4b\x6f\x7e\xd4\x6d\x83\x7a\xe5\xea\x67\x6b\x7d\xb0\x0a\x9d\xb6\x0d\x7d\xcc\xbd\x37\x3a\x7c\xdb\xe3\x0e\x59\xb1\xce\xe8\xdb\x37\xb9\x7d\x83\xa1\x4f\xe6\x1b\xda\x45\x66\x2d\x86\xa1\xa3\x21\x58\xd1\xce\x69\xf1\x5d\x8c\x78\x3b\x14\x33\xbf\x13\xe4\xf0\x59\xe0\xd0\xd1\x6e\x7a\xdb\xb2\x2e\x7e\x73\xe4\xb7\x91\x6d\x2f\x5b\x3e\xc5\xf1\x6d\xa7\x7f\x9b\xdb\xe7\x0e\x3f\x50\x25\x87\xcb\xb0\xe1\xf6\x99\x15\x71\x3f\x96\xbd\x61\x37\x9c\xf0\x29\x6c\xf8\x29\x7c\xd3\x55\x8b\x54\xcb\x65\x70\x6e\xf9\x14\x9f\x4c\xaf\x61\xd7\xee\x5b\x07\x00\xf5\x33\x0e\x34\x3c\xc3\xae\xdd\xad\x00\x40\xbd\xc6\x81\x86\x3f\x32\xab\x06\xfe\xfc\x51\xc7\xca\xee\x93\x5f\x20\xf9\xdd\xfb\x9c\x4b\xe6\x63\xfa\x77\x6e\x5d\xe6\xb3\x3f\x72\xeb\xd4\xd0\xae\x2a\xf1\xaf\xc6\x87\x1d\xd5\xcf\x69\xf6\xfc\xc3\xc5\x4f\x03\xde\xd6\xe5\xc2\xe3\xf0\x89\xbd\x1f\x54\xcb\x41\x59\x7a\x2b\xbe\xbb\x8d\xe3\x46\xfc\x4d\x17\xcc\x02\x4d\x60\x25\xb8\x14\x5c\x05\xae\xc7\xdd\x39\x9a\x4e\x5d\xd8\xac\x3b\x9a\xe6\xfa\xd0\xc1\xd0\xd7\xb8\x02\xce\xc0\x17\xc3\xf4\x26\xd9\x73\x3c\x66\x25\x33\xcd\xc9\xd0\xbe\xc6\xe0\x5c\xb7\xff\x59\xb8\xe8\x00\x0e\x88\x5e\x77\xf6\xbc\x23\x9f\xf1\x5f\x79\xe7\xf7\x56\xa3\xff\xe7\xbf\xf7\x99\x5b\x1e\xbf\xd2\x4f\xbd\xc2\xe7\xc6\x61\x0e\x15\xa4\x22\x5f\x06\x59\x59\x2c\x26\x8a\x29\x54\x80\xf9\x6c\x3e\x0a\xf3\xa5\x84\x1c\x54\xc4\x54\x46\x14\xe4\xd4\x18\x9c\x08\xa0\x09\x94\x0d\x4a\x19\x34\x09\x03\x0a\x1c\x53\xa0\x1f\x4d\x09\x52\x24\x9a\x89\x20\x91\x0b\x48\xc1\x18\x95\x50\x7f\xdf\xdc\xf2\x70\xc3\x2f\xee\x6c\x6e\x81\xef\xa1\x0f\xca\x20\xf1\xf0\x85\xbf\x87\x89\xba\x68\x26\x1a\x28\x48\xa3\x29\x29\x03\xfd\x28\x0b\xe3\x93\x8a\x28\x67\xa5\x5c\xc0\x2f\xc7\xa3\x7c\x46\x73\x44\x63\x99\xf4\xe8\x74\x5c\x4a\x72\x72\x20\x48\x05\xa4\x82\x28\x16\x24\xe4\x87\xb9\x48\x56\x88\x48\x82\x7d\xce\xbb\xa0\xcc\xf9\xde\xc1\xb2\xf5\xb7\xdf\x7c\xce\xd2\x7d\xa3\x5f\x23\xe3\x0f\x6b\xef\x37\xf6\x38\x7c\x8e\xc0\x86\x7b\xbe\x5d\xe5\x6c\x2a\xcd\x86\x77\x7c\xa3\xc2\xb7\xe0\x78\xae\xeb\x48\xc7\x78\xdd\x27\xf0\xa6\x4f\x18\xf9\x11\xb6\x83\x37\x39\xed\x8b\x9c\x76\xd9\xce\x33\x7c\xb7\x5b\xb6\x73\x55\xf7\x9f\xef\x98\x5e\x7a\x2a\x47\xe6\xb4\x96\x6d\xd8\xfc\x38\x41\x57\xda\xf6\x85\x3d\x9b\x1d\xbe\x50\x5b\x47\x7d\x85\xed\x21\xe2\xa5\x0d\x1f\x39\xd6\x67\xc9\xe4\x60\x17\x61\x9b\x15\xfa\x36\x66\xcd\x33\xca\x8c\x59\xdc\x8a\x15\x2f\xb3\xe1\x91\x93\x8a\xaf\xb3\x74\x6e\x0d\x81\x4f\x34\xe9\x92\xef\xb0\xe2\x4a\x41\xd7\xa1\x4d\x92\x26\xcb\x0e\xdb\x4a\xc4\xb9\xdb\xfa\x2d\xf8\xed\xbe\x1e\xba\xdf\xcc\xd9\x3b\x7f\x39\x73\x9e\x35\xbf\x7e\x46\x81\xf1\x77\x3c\xe7\xce\xcd\x74\x3c\x5b\xff\xe0\xb0\x55\xd6\x39\xcb\xc6\x2b\xab\xd9\x74\x86\x6e\x3f\xb7\x7a\x7c\xdd\xf6\x89\xdb\x67\xec\xbb\xb9\x82\x7f\xf8\xfc\x68\x88\x75\xc9\x81\x71\x06\xaa\xe3\xdf\xe1\x73\xc7\x2a\x3d\x0a\x70\x7f\xa7\x21\xce\x83\x36\x3f\xe1\x37\xfd\xbc\x91\x67\x74\x2d\xd5\xe4\xa6\x03\x77\x54\xde\xf9\x19\xe1\x0f\x2d\x5e\xec\x59\xeb\xce\x59\x8c\x35\x7c\xea\x38\xa7\xb0\xe2\x95\xcd\xf7\x3a\xf6\x46\xcb\x6b\x35\xa9\xd4\x25\x94\x6e\xd5\xfb\xbc\x5d\xae\xfb\x7b\x66\xcd\xe0\xb5\xde\x83\x96\x35\xad\xdc\xc1\xd2\x43\xb7\xba\xe3\xe3\x2d\xa7\x57\x8f\x1d\xda\x7e\x54\x25\xaf\xb6\x64\x63\x20\xef\xd6\x19\x9d\xde\xee\x7f\x10\xb2\x96\xb5\xcf\x7f\x7a\x8e\x76\xf0\x50\x64\xc3\x3d\xe3\x15\x76\x54\xb6\x63\x93\xcd\x4f\x56\xcf\xd5\x7a\xce\x74\xf0\x43\xc3\xb3\xa6\x7a\xfe\xdf\xe1\x3e\x8f\x72\xbc\xed\x71\x8c\xd7\xfb\x60\x3f\x5b\x11\xaf\x10\x77\x05\x36\x9e\xed\xe0\x8f\xe5\xbf\x37\xf2\xc4\xf8\x0c\x41\xe7\xb3\x6e\x7e\xf6\xbc\x53\x31\x2f\x86\x6f\xdb\x58\x5d\x26\x7b\xee\xaf\xa0\x9f\xd0\xe9\x9e\x87\xdd\x71\x78\xef\x21\xd5\xe3\x92\xde\xa3\x5d\xeb\x32\xee\x4c\xe8\xfb\x38\xe2\x73\xe3\xd9\x30\x51\x9d\x9f\x23\x9b\x6d\x7a\x70\x6f\x3e\xde\xf7\x86\x71\x4f\xac\x1e\xcc\x06\xf3\xc1\x62\x70\x21\xf6\x67\xc6\x2d\xf6\xb9\xb6\xf7\x59\x60\x15\xdc\xc4\x6d\x99\x58\xaf\xee\xce\xf0\xc1\x7a\xa8\x22\x8f\x3a\xa0\x1f\xf3\xf9\x53\x9c\x18\x4b\xa9\xc1\x4c\x3c\x21\x24\xa9\x1c\x17\x91\x82\xbc\x18\x0d\xca\x81\xe8\x07\x70\xdb\x7a\x38\x8a\xee\x7b\x1e\x1e\x7d\x1e\xfa\x60\x64\x7d\x0f\xfa\xc7\x15\x70\x81\x8c\xfa\xd0\xac\x2f\xe7\xc9\x20\xa3\x14\xf8\x42\x36\xc2\x15\x33\x69\x31\xaf\x14\xa2\xa3\x0a\xa3\x39\x21\xa5\xee\x61\xc8\xa0\xa2\x84\x12\x85\xec\x24\xcc\x96\x26\xa9\x49\x24\x4f\x66\x20\x03\xd3\xf0\xf5\x2f\xe3\xca\xf4\xbc\xe4\x2e\x2c\x47\x8d\xf2\xab\x00\x94\x1e\x67\xe9\x8e\x9f\x39\x73\x89\x1d\x9f\xb9\xf6\x81\xf8\x2e\xc3\xd0\xdd\xfb\x09\x3d\x20\x72\xfb\xcd\x0f\x55\xb7\x23\x43\xd7\xb9\xcf\x32\x36\x9e\xef\xd0\xbf\x23\xca\x57\xfb\x5e\xa5\x1f\x62\xd6\xee\x7b\x9e\x3a\x13\xcc\x58\xd6\xb2\xf2\x6e\x66\xed\xc8\x03\x54\x12\x1c\x3c\x7f\x8b\x7e\xa3\xe8\xed\xa3\x16\x8c\xaf\x98\x4f\xc6\x84\x1b\xcf\xad\x22\x2b\x96\x2d\xd8\x78\x8e\x5b\xd6\xdb\xbf\x5e\xc5\x7f\x59\x79\xca\xc6\xf3\x6a\xd8\x14\xf3\x1e\xf1\x35\x65\xde\xf7\x24\x7e\x97\x72\xad\xb7\xc8\xd2\xad\x6b\x3f\xaf\x96\xb3\xd1\xd8\xfd\x03\xf2\x7c\x63\x6f\xc4\x91\xa3\xc4\xcc\x18\x55\x8f\xfd\x87\x52\x16\xdc\xa8\xab\xa3\x7f\xcb\xd8\x72\x9f\xf6\xd3\xed\x9f\x5a\x7c\xfe\xb1\xc5\xe7\x96\x9e\x36\x78\x66\xf9\xd3\x85\x47\x72\x0b\xb0\x9d\x3d\xc5\xf7\x13\xfa\x7e\xcd\xce\x1e\x02\x16\xed\xe7\x00\xb3\xf6\xe9\x4b\xc1\x93\xe5\x0f\x96\xbc\xc6\x01\xa6\x65\x98\x05\xc3\xe5\xb7\x96\x7a\x38\xdb\x6e\xd9\x7a\xfc\x9a\x95\x13\xc6\x8c\x73\x5a\xbf\x36\xb7\xfc\xb2\x36\xb7\xe5\x2b\x0c\x7f\xd7\x1b\xa9\x62\xab\xad\x7c\xb1\xeb\x67\x6e\x9d\xed\x12\xab\xeb\xb2\x2e\x43\xfd\xc5\x0a\x59\xc1\xfb\xd0\x4b\xee\x03\x96\xad\xae\xff\x71\xe0\x49\x9b\xf1\xc0\x9e\xdf\x13\x3e\xe7\x06\x82\xe7\x96\x1d\xdf\x4e\xb9\xed\xb8\x3e\x77\xd7\x68\x75\x99\xe9\xfa\xb9\x9b\x26\x7d\xfc\xf6\x5d\x8e\x3d\xb5\xc7\xff\xc2\x9d\x2f\x62\x5e\x84\x07\x71\x36\xb9\x23\x65\xf8\xc8\xa0\x99\x4b\x32\x80\xa5\x77\x7c\x5a\x24\x73\x15\x4b\x77\xba\x5e\x73\xaf\xdb\x90\xbf\x10\xa1\x6b\x29\x02\x7e\xb4\x63\xbc\xb5\xe6\x5c\xd1\x9d\x3f\xe3\xcc\xd9\x38\x05\xe8\x1a\x33\xf4\x3f\x69\x9c\x47\x9f\xa4\xfd\xac\x1f\x67\x27\xfd\x3b\x09\x5b\x6f\xcf\x73\x54\xd5\x5c\x33\xdc\x8d\xa3\xd4\xfe\x97\x08\x5d\xb2\xed\x43\x8e\xa0\x39\x63\xc7\x26\xdd\xff\xe3\x96\x85\xee\xb7\x2b\xec\x0c\x71\x17\xca\x7a\xdb\xa9\xdf\x53\xb3\xd6\x38\x30\xe0\xce\xeb\x75\xf8\x8e\x05\x04\x7e\xfd\x5b\x98\xa2\xf1\xdc\xe1\x7f\x08\x7f\xde\x7a\x7d\xf5\xbc\xb4\xeb\x46\x4b\x2f\x8c\x35\xeb\x67\x25\xdd\xe6\xd9\xe2\xe5\xe5\xd5\xbe\x87\xe8\x0c\xb3\x76\xd8\x0f\x1e\x04\x07\x2d\x3b\x7c\x65\x17\xb3\x56\xfe\x04\xbc\x0a\x40\x0c\xdf\x80\x1c\xbc\xfe\x30\xd0\xfc\x2a\x67\xee\xb3\x48\x7c\x4b\x37\x63\x88\x15\xe5\x15\xbe\x2c\x9d\x62\xd6\xec\xf8\xeb\x0d\x60\xd9\x2f\x70\x15\xc0\x6b\x3f\xd0\x6b\x38\xce\x29\x9f\xef\xfb\x21\x7d\x9f\x46\xcf\xeb\x5a\xfe\xf6\xde\x02\xaf\x33\x8f\xdd\x71\xb8\xb6\x07\x3b\xf0\x8d\x1d\xe3\x5b\x8b\x65\x87\x76\x74\x3a\xe2\xe4\x98\x69\xcf\x74\x09\xd8\x78\x81\x05\x37\x62\xc0\x81\x0e\x5b\x3e\xf6\xfc\xa9\x9a\xfd\xee\x55\xad\xdf\xb9\xc1\xbe\x47\xc0\xb4\xec\xf8\x0d\xe8\x29\xef\x5f\x32\x6b\xe5\x5b\xa4\xbd\xd3\xd7\xb9\xe3\x45\x77\xbe\x93\xfb\x66\x85\x3d\x78\xd7\x3e\xc3\xcb\xfd\xef\x0a\x52\xbf\x1f\x64\xd6\xae\x7f\x01\x80\xf2\xbc\x95\x63\xfc\x2a\x7d\x35\xa4\x1e\xef\xed\x76\x9c\x2b\x58\x67\xba\x6d\xdf\x31\xa3\x5c\x2b\x0e\x24\x72\xb3\x91\x0f\x89\xf3\x00\xc2\xf6\xb7\x5f\x4f\xf0\xca\xb6\xcd\xe1\xed\x3b\x22\x9a\x85\xee\x0b\x02\xeb\x4c\xc3\xe2\xc9\x8e\x0a\x7b\xd7\xf3\x69\x85\x7d\xd4\xeb\xd6\xa1\x0a\x78\xce\x9e\xbb\xbb\x89\x88\xb1\x52\x26\x9c\xa5\x87\xb7\x38\x62\x4d\xfb\xee\xc3\xc7\x4e\xbf\xc6\xac\x95\x8e\xa4\x26\xca\x27\x44\x3e\xe6\x80\x1e\x37\xb3\xce\x33\x34\xe2\x0c\x70\x60\x33\xb1\xf7\xe3\x1a\xfc\xa9\xf3\xe2\xc0\xf4\x44\x9d\x5c\xdc\xa1\x53\x5d\x3f\x06\xce\xef\x25\x31\x1d\x97\xe6\x23\x4c\x79\xc9\xfa\xf0\xcf\x16\x58\x6f\xe9\x9f\xc3\xfb\x72\x3d\x56\xdc\xaf\x98\xb9\x23\xd1\xfb\xe6\x48\x70\x2c\x98\x07\x9a\xf1\x2d\x87\x84\xf5\x4a\xc4\xf9\x0a\xa4\x89\xf2\x36\xce\x81\x4d\xf5\x0d\x9e\xd9\xbe\x59\xc6\x25\x88\x39\xff\x39\x52\x5b\x48\x86\x6a\x1e\xc1\x33\x59\x0a\xc8\xb8\x74\x79\x16\x32\x2a\x6f\xfd\xeb\x89\x56\x3f\xfa\xf6\x05\x30\x0e\x47\x14\x65\xef\x23\xa7\x7c\x0c\x4f\x3a\x0b\x15\xd1\x27\x6f\x21\xb4\x12\xde\x52\xfa\x98\x8c\xd6\x0a\x01\x54\x44\x79\x57\xb4\x96\x62\xc8\x70\x8d\x8e\x96\x26\xe1\xe8\xe8\xe8\xa8\x3a\x55\x28\x14\xd4\xa0\x3a\x15\x15\x03\xb0\x4b\x2d\xd4\xdd\x32\x7f\xf5\xdf\xdb\x1e\x78\x12\x1e\x81\xa6\xbb\x1f\xf8\xcc\xf3\xee\x81\x62\x34\x26\x00\x25\xf7\x79\x83\x53\x16\xe9\xed\x6f\x11\x72\xa2\xd8\xf7\x05\xba\x57\x71\xb6\x9c\x48\xb6\x6f\x1a\xe8\x27\x72\x9b\xb4\x6d\xdb\xb6\x9f\x58\xdd\x6f\x28\x9f\x12\xe3\x33\x76\xee\x34\x74\x9b\x43\x8f\x2d\xb9\xed\xfb\x8a\x23\x77\xb2\xe6\x6d\x4d\x12\x70\x6c\x43\xb6\x1f\xeb\x92\xff\xa4\xfe\x8e\x7a\xef\x59\xb8\x66\x05\xce\xa0\x5a\xaf\xb3\xd6\xfc\x73\x9c\x97\xb4\x2c\x26\xbf\x31\x5b\xe7\x7d\x1b\x2f\xac\x9e\x67\xe8\x34\x0d\xfc\xde\x61\xb7\x33\xe6\x37\x1e\x79\x29\x31\x3e\x6f\xe7\xbd\xca\xe7\x0e\xfb\x6f\xad\x6d\xfb\xcd\xc4\x78\x7c\x26\xb2\xdd\x0f\xdc\x67\xdf\xc4\x59\xc5\xf6\xcb\x1d\x67\x3e\x36\xaf\xbf\x45\xc4\x7c\x18\x8f\xb2\xd5\x71\xae\x17\xc3\xe7\x71\x9a\xcd\x86\x38\x6e\x18\x32\x7f\x4a\xf2\xcf\xd8\xcf\xb5\x0e\xfe\x89\x6c\x38\xcb\xe3\xef\xed\xab\xb0\xf5\x5c\xe3\xf4\xc3\x86\x8d\xfa\xaa\xdb\x46\x6d\xbc\xa8\x82\x7f\xd8\x3e\xca\xb7\x38\xf6\x28\x5e\x16\x7c\xcf\xd1\x02\xb3\xa6\xef\x85\xdb\xc0\x72\x2d\x02\x5f\xfb\xcc\x24\x10\x01\x58\xf6\x2e\x67\x44\x86\x4e\x1f\xa2\x5b\x83\x91\xdb\xaa\xe7\x8b\x3b\x2e\x72\xc7\x6e\xb9\x99\x78\xef\x71\xc5\x58\xcb\xb6\xc7\x1d\x31\x97\x69\x17\x93\xd8\x86\x4b\x6c\xb8\x1f\xd7\x71\x6d\xbd\xd6\xe1\xe3\x2d\xb9\x53\xee\x02\xa4\x1e\xd8\x77\x0a\xe3\xee\x58\xcf\xf0\xc3\xbd\xc4\x1a\x14\xfb\x3b\x83\x16\xd1\x30\x74\xeb\x35\x84\x5c\x58\x34\xe9\x35\x0d\xc0\x21\x20\x56\x3e\xdf\xf7\x02\x9d\x01\x2c\x98\x07\xa2\x60\x21\x58\x06\x4e\x07\xe7\x80\xcb\xc1\xad\xe0\x0e\x20\xe0\xd7\x63\xff\x1f\x67\xdf\x02\x1f\x45\x75\x35\x7e\xef\x6e\x76\x36\xbe\x60\xb2\x18\xb2\xbe\x60\xd7\xc0\x66\x7d\x00\x0b\x21\x64\x79\x04\x06\x11\x58\x95\xc7\x8a\xa8\xab\xa2\x0e\x28\x61\x2a\x3e\x46\xf1\x31\x2a\xe8\x28\xa2\x03\x8a\x0e\x4a\x60\x20\x01\x06\x12\x60\xc3\x73\x03\x44\x63\x6d\xeb\x6a\x6b\xdd\xda\xd6\x46\x5b\xeb\xf6\x6b\xfd\x8c\xad\xda\xb4\xfd\x6c\x63\x3f\xed\x17\x48\xe6\xe6\xff\x9b\x3b\x8f\xbd\xb3\xbb\xf1\xf1\x47\x27\x84\xb3\x77\xcf\xdc\x7b\x5e\xf7\xdc\x7b\xcf\x3d\xc7\xb6\x55\xb5\xe6\x35\x25\x7c\x37\x89\xc2\xf6\xac\x0a\xdf\x7a\x0d\x55\x79\xab\x46\x79\x70\x25\x89\xe1\xe4\xa2\xd5\x48\x74\xe8\x29\xab\x2c\x0b\x96\x55\x96\x8d\x36\x2a\x06\x19\xb8\xdc\x41\xe3\x9e\x6e\x59\x2d\x71\xe4\xe7\x26\xbe\xeb\xf9\x8a\x95\xd8\x78\x82\xe3\x54\x91\xe1\x04\x8e\x4b\x88\x42\x62\x00\xc8\x81\x30\xec\x4c\x48\x59\x08\x62\x28\xd3\xdb\x8d\x32\x0c\xa4\xd3\x7c\xbc\x83\x85\x11\x18\x93\x62\x88\x2d\x0d\xf0\xf0\xb2\xce\x14\xaf\x66\x10\x2b\xf1\x1d\x9c\x0a\x4b\x1e\xa9\xb8\xed\xd1\x25\xae\x5f\x6e\xea\xff\xe4\x45\xf4\x94\xec\x0f\x4b\x7c\x82\x13\xb8\x14\xdb\x1d\x86\xa2\xd4\xd9\x99\xf1\x0f\x00\x94\x89\x42\x7a\x00\x40\x20\x04\x98\x08\x1f\x61\x5c\xa5\x52\x24\x2a\x30\x9e\xd9\x71\x2e\x1a\xe5\xe3\x0c\x1b\xe1\x03\xb1\x68\x24\x11\x65\xa2\x9a\x14\x88\x46\xc5\x24\x97\x88\x28\x8c\x20\x46\xe5\x70\x3c\xc6\xf2\x9c\xda\x93\x10\x4b\xfd\x9c\xeb\x4d\x5e\xe5\x55\x3e\x11\x4b\x25\x39\xc5\xfd\xe0\x88\xed\xf7\x5c\xc9\x56\xa0\x30\x9c\x87\x9a\xe1\xdf\x76\x45\x98\x18\x2b\xf2\x12\xdb\x21\xb1\x9d\x03\x40\xea\x90\xb4\x6c\x54\xe0\xe2\x0a\xe3\x8a\x49\x1d\x88\x4b\x65\xa3\x5d\xa9\x70\x20\x23\x86\x55\x72\xad\x67\xca\xc4\x0f\x8b\xaf\x3d\xb6\x2e\x22\xe4\x94\xb0\x5d\xbb\x26\x12\x32\x81\x6d\xa3\x19\x1b\x70\x6d\xbe\x6c\x99\xfa\x1d\xcd\x5f\x0b\xa9\x6f\x15\xec\x77\x10\x7e\xf1\xee\xcb\x08\xdb\x48\x9c\x3b\x6e\xf9\x79\x81\x9f\x8b\xed\x90\x7a\x32\x7f\xdf\xca\x80\x1f\x73\xee\xe3\xd8\x73\xc1\xee\x35\xc5\xd7\x10\x7b\x5e\xc8\xf7\x49\xcc\xbb\x06\xaf\x3a\xfa\x63\xd9\x51\xd3\x0e\xb5\xfa\x4c\x59\x5f\xe4\x6d\xa2\x44\x47\xfd\xba\x51\xf8\x6e\xde\x6c\xc0\x02\x30\x3a\x58\x8e\x4b\x9b\xe0\x0a\xc0\x66\x3d\x5c\x5c\x13\xf7\x7b\x09\xee\x30\x2b\x75\xe7\xd9\x2e\x2f\x59\x3b\x05\x0c\x0b\x96\xdc\xe9\x8e\xf4\x77\x3e\x2b\xcb\xf0\xa0\x2c\xa3\x45\xae\x3a\xed\xa7\x1e\x57\xb5\xf6\x6b\xfc\xa3\x7f\xcf\xf7\x92\xcd\x6d\xc9\x48\x8c\xe7\x98\x04\x1b\xe5\x13\x6c\x24\x2a\xc7\xe3\x2c\xf4\x8b\xa8\xe7\x74\x89\x7a\xe8\x64\x86\x1a\x7b\x32\x43\xdd\xb4\x0e\xdd\x2a\xa3\x37\xa4\x92\x7f\x7c\x77\xc9\x73\xff\x9d\x65\x63\xa2\x24\x96\x0e\x00\x3e\x20\x08\x22\x1b\xef\xef\x70\x87\x45\x96\x83\x09\x28\x03\x70\x96\xb5\x3e\x04\xa7\x81\x61\x38\xcf\x8c\x71\xef\xb7\x1a\x4c\x06\xb3\xc1\x8d\x80\x05\xf5\x46\xc4\x27\x1e\xf8\xa4\xd1\x45\x7e\x83\xf9\x79\x4f\x09\x57\xe7\x7b\xc5\x02\x94\xd0\x12\x13\x8b\x45\xc5\x18\xcf\xc1\x94\x1c\x8b\xe3\x5f\x79\xa8\x48\x51\x46\xff\x95\x4b\xf4\xf7\xba\x3b\xfb\x23\x8a\x4b\xd5\x58\xeb\x11\xc5\x64\x0f\xd7\xe9\x8a\x65\x53\x7c\x47\xa6\xef\xcb\xe7\x47\xec\x78\x9a\x7b\xfc\x19\x6e\xef\xd2\x3f\xc0\x57\x87\xa3\x4f\x51\xeb\x08\x58\x89\xfe\x07\x9e\xbd\x03\x66\x5a\xa0\x07\xf5\x3d\xfe\xfc\x98\x31\xcf\x4c\x43\x6b\x67\x55\x3c\x33\x62\x2a\xc5\x4f\x78\xf0\xe6\xab\x16\xcf\x7b\x6c\xf9\x63\x8f\x4d\xb8\x7b\xf1\x55\xf3\xe6\x3d\xb8\xfc\xc1\xa7\x27\x2c\x5f\xbc\x78\xf1\xbc\xc7\xee\x7a\x10\xcd\xed\x97\x5d\xbc\x80\x64\x01\x29\x02\xea\x62\x65\x56\x8e\x09\x09\x5e\x92\x58\x8a\x89\x5c\x2d\x28\x4f\x6c\xe3\xdf\x90\xb8\xf7\xfa\xce\x36\x22\x05\x26\xc8\x6f\xc8\xf2\x1b\xb2\xf6\x39\xfc\xaf\x8b\x8c\x48\x81\x37\x22\x6f\x28\xe6\xd9\xd6\x74\xef\x16\x4a\x00\x13\xc0\x74\xb0\x18\x53\x75\x2d\x00\xd0\xaa\xd6\x66\x9c\x5e\x19\x41\x14\x38\xcb\xde\x24\x33\xb2\xc2\xcc\x71\x51\x53\x69\x65\xb1\xf8\x7e\x5b\x82\xd6\x29\x19\xfe\x8f\xac\x72\x5f\x63\xdf\xd9\x2e\xe9\x95\x60\x12\x25\x5c\x20\xcc\x70\x81\x00\x92\x65\xce\x2f\xca\x8c\xa4\x84\x4b\xf9\xd2\x44\x36\xcb\xc7\xe3\x7e\x36\xd1\xa5\x88\x0a\x4c\xf4\x27\xbf\xdf\x66\x21\xf5\xe1\x8c\xa6\x37\x61\x2d\xfa\x05\x5c\x8e\x1a\xe7\xdc\xfc\xc0\xcd\x23\xef\xba\xb3\x0a\x3d\x0b\x1f\x40\x3f\x84\x73\xd0\x7b\x55\x70\x1d\x25\xc4\x38\x9e\x8f\xc7\x99\x48\x98\xa5\xfd\xbc\x9f\xf6\xfb\xe9\x40\x2c\x20\x30\x11\x26\x42\x97\xf2\xa5\x34\xaf\x75\xa0\x00\x92\xe2\x50\x84\x29\x97\x02\x03\xdf\x7d\x2b\x11\x8e\x15\xfd\xb4\x20\x72\x12\xc7\x27\xc2\x4a\x24\x11\x93\x38\x91\xa3\x25\x00\x4e\x03\xd1\x81\xab\xbc\x47\x70\x7c\xda\x50\x70\x3e\x18\x0f\x6a\x41\x1d\xb8\x16\xdc\x08\x1e\x34\x38\x52\x56\x5d\x16\xac\xa9\x2e\x33\xaa\x86\x7f\x2f\x3b\x61\x4f\xa3\x15\xde\x51\x55\x25\xc6\x34\x4a\x99\xf3\xe8\x70\xb2\x38\x1f\xfe\xaf\xb2\xc6\xbe\x6a\xee\x8e\x28\x30\xac\xc0\xb0\xda\xd7\x05\xd3\xb2\xdc\x9f\xfa\x5e\x76\xc3\xb5\x86\x1f\x31\x02\xfe\x7b\xd1\x63\xc7\x3a\xa7\xa2\xcf\xfe\x1b\x7d\x81\xd6\x4c\x84\xd1\xbf\x72\x57\xdd\xc0\xcd\x82\x25\xf0\xce\xc7\xaf\x44\x53\xef\x41\x57\xc2\xfd\xcf\xc3\x1f\xa3\x59\x70\x13\xba\x07\xfe\x1d\x0d\x7f\x1e\x8d\x86\x7f\x44\x8f\xc1\x27\xd1\x0d\x94\x3f\x0b\xa3\x28\x93\x45\x8a\xf6\xc7\xfe\xb4\xb7\xe6\x7b\xd8\x96\x09\xb3\x2e\x3c\x67\xcd\x92\x79\x13\xce\x59\x13\x5c\xbc\x64\xc2\xd3\xe7\x4c\x99\x30\x6f\xea\xc5\x0f\xdc\x95\x9e\x30\x6b\x16\xda\xbd\x64\xc9\xd3\x57\x3d\x76\xcd\xd3\x4b\x96\x3c\x7d\xcd\x63\x57\xe5\xf6\x50\x8c\xbd\x77\x23\x9f\x53\xee\x7e\xb1\x7d\x07\x80\x06\x3e\x6a\x3d\x43\xf8\xb2\xc4\xfe\x44\xa3\x75\x7e\x39\x39\x37\xe7\x7c\xd2\xe7\xa3\x76\xff\xaf\xc3\x17\xe7\x7d\xa1\x63\xce\xbb\x19\x79\x6b\xcd\x86\x17\x8a\xcf\xbd\x8d\x53\x6c\x1f\x33\x6e\xf8\x75\x78\x6f\x65\xce\xa6\x71\xb7\xd2\x75\x77\x30\xe4\x3e\x5b\xee\xfc\xc3\xba\xdf\x10\xb1\xee\x2b\x36\xe2\xf8\xca\x86\x1d\xf6\xbb\xad\xb5\xcf\xb0\xdc\xda\x74\xfd\x12\xfc\x59\x2d\xee\xd7\x13\x74\xfd\xb1\xf3\xdc\xff\x37\xad\x8e\xb9\xd9\x17\xda\x5c\xab\x53\xa0\xf9\x01\xc2\x9f\xd6\xd7\xae\xf5\x78\x4f\x05\x47\x0f\x6e\x3f\x66\xaf\x23\xe4\x5c\xac\x58\x7b\xca\xe1\xff\xe7\xee\xfe\x2d\x2a\xba\x0f\x48\x1d\x1b\x3a\x88\xff\x91\x00\xe4\x1e\xa0\xed\x4f\x6c\x79\x3e\xdf\x2f\x37\xf1\x27\x1c\xeb\x11\x7b\xdd\x71\xe2\x0c\x87\xbf\x9d\x3b\x1f\x5b\x4e\xf0\xaa\x23\x17\xc3\xb7\xe3\x7a\xe2\xbd\x02\x71\x66\x7d\xad\xa3\xff\x36\x9e\xad\xd7\xdb\x3e\x78\xd4\x58\xb3\xb5\x1a\x79\x09\x6f\xb2\xe9\xce\x91\x3c\xdf\xba\x98\x90\x05\x43\xd6\xce\x07\xf9\x71\x0c\x84\x3f\xbd\xf5\x1a\xc7\x9e\x88\xed\xdf\x34\xec\xb1\x65\xc4\x94\x4d\x83\xfe\x6d\x13\x1c\x32\x98\x3b\x63\xbe\xd5\x41\xe7\xdc\x79\xc4\xb3\x8e\x35\xb3\xec\x0b\xb5\x2d\x2b\xf0\xcf\x0c\x38\x07\x9c\xe7\xe7\xe6\x3d\xa3\x2d\x1f\x03\xe7\x3a\xd4\xbc\xe3\x6a\xf4\x7f\xdb\xce\xe2\xef\xdd\xbd\x98\xf0\x23\x89\xbd\xb7\x63\xa3\xf3\xd7\x47\xe6\xba\x62\x11\x41\x37\x22\x26\x55\x59\x4c\xac\x13\x09\x3c\x8d\x7b\x1c\x6b\x41\xc1\x92\xdd\xd4\x00\xe6\xce\x8d\x45\xe4\x9a\xda\x6c\xdd\x8b\x66\x72\xb1\x41\xdd\xc0\x17\x52\xff\x16\x01\x3e\xea\xc8\xed\x7e\xc7\xfe\x9a\x21\x2f\x07\x70\x8d\x4c\x50\x8a\xf7\x7e\x0e\x52\x22\x28\x07\x17\x82\x10\x98\x05\xe2\x60\x39\x58\x09\xee\xcd\xd5\x43\xc5\xcb\x1a\xdd\x65\xc3\xf9\x7c\xa0\xe3\xc2\x0a\xde\xc8\x31\x67\x49\x67\x59\xbc\x9a\x60\x0d\x8e\x25\xf9\x3e\x33\x80\x7b\x3a\x7c\xef\x59\xd8\x85\x6e\xfd\x05\x3c\x6d\x31\xfa\xf2\xc8\xb3\x2d\xe8\xa3\x65\xf0\x92\xd7\xd0\x7d\xee\x57\x9f\x9f\xba\xf4\x92\x4b\xe8\x48\x68\x04\xd2\x9e\x7f\x7e\x63\xdd\x5d\x4f\xc3\x4a\xf4\x51\xea\xe1\xd8\x52\xf1\xa5\x07\x77\xdd\xfb\x0b\xf6\x1d\x58\xf5\xf7\xd1\xf0\x22\x8d\xfb\x7e\xc6\x3f\x2a\xcb\x72\x0f\xaf\xc8\xbd\x08\xc0\x9e\x5e\x41\x14\x7b\x4a\x3a\x35\x9a\x8b\xd3\x32\x1d\x73\x31\x5a\xda\x95\x96\x03\x7e\x45\xf6\xb3\xbc\xc4\x25\x50\x2f\x4c\x64\x39\x4e\x48\xcb\x92\x5f\xe1\xbf\xbb\x9d\xb7\xe5\x42\xcc\xe9\x41\xf2\x79\x42\xde\x89\x33\xfe\x67\x2b\x08\x39\x22\xf4\x66\xdb\x97\x45\xd7\xb4\x73\x76\x82\xe9\xa0\xee\x2b\xdb\xb6\xd2\xde\x7d\xfa\xda\x5e\x51\xe7\x7c\x3a\xe3\x95\x99\x67\xd3\x73\x8e\xff\x1d\xaa\x33\x9e\x9f\xd5\xe6\xd4\x89\x1d\x3f\x77\xec\x25\x8e\x1b\x58\xe4\x7d\x85\xda\xae\xcb\xc6\x87\xc0\x47\x6d\x9d\x3d\xf2\x74\x62\x7f\x49\xf2\x85\x76\x6e\x72\xb4\xaf\x1d\x88\x7b\x8f\x53\x22\x5d\xff\xc2\x6b\x0f\x83\x29\xc7\x18\x40\xd7\x2b\xaf\xd7\x83\x3a\x37\x03\xe8\x39\xc7\xce\x2b\x01\x53\xe7\x31\x0e\xdb\xb8\xad\xa7\x60\x6f\x82\x38\x17\x6a\xf0\xe5\xaf\x9d\x1a\x4f\x80\xfc\x98\x30\x62\x4d\xd5\x78\x16\x41\x8b\x9c\x8d\x0a\x6d\xc3\x55\x2e\xd7\xdf\x50\xcc\x8e\xb7\x9d\x2c\x7a\xd6\x41\x6d\xef\x2b\xbe\x77\xbb\x3e\x51\x6c\xdf\x98\xa6\x76\xfd\x38\xdf\x0e\xa6\x2e\x21\xe6\xa5\xeb\x89\xb5\x98\xbd\x1f\xd1\xe4\xc9\x9f\x5b\x8c\x71\x6c\xfb\xb7\x93\xa7\x78\x1e\x03\x75\x15\x0c\xf0\x85\x36\x8f\xf5\x63\xdd\xb5\xe9\x42\xe4\x11\x78\xa1\xc3\x71\x46\x92\x8b\xeb\x9c\x4c\xc8\x0e\x79\x3f\x75\x08\xb1\x47\xb3\x83\x7a\x98\xae\xdf\x9e\x1c\xb8\x89\x89\x4c\x7b\x9c\x38\x4b\xb0\xcf\x8d\xf0\x5e\x4c\xa8\x19\x9f\x1b\x35\x1f\x73\xce\x65\xe6\xfd\xf6\xdf\xe6\xcf\x7d\x3b\xde\xcc\xdb\x9b\x26\xf9\x42\xed\xb8\x9a\xb0\xf9\x49\xfb\xcc\xc5\x88\x5e\xa1\x9a\xa7\x0d\xbe\x07\xdd\x3c\xa5\xd8\xfe\x4e\x53\x37\x21\x2f\xf8\xdc\xec\x48\x7e\xdc\x8c\x29\x5f\x8d\x67\x16\xec\xcf\x2b\xb9\x3b\x36\xad\xbf\xc9\x5f\xcb\x9b\xf4\x6a\x73\x9c\x3d\x88\x56\x7f\x0f\xe2\x4c\x0a\x07\x6f\x2c\xb6\x7f\xd4\x78\x5a\x71\x99\x6c\xbf\x1f\xcb\xc5\x75\xce\xb9\xa4\x31\x3f\xa6\xc2\x71\xbe\xb2\x6d\x3f\x41\x2f\x7b\xaf\x93\xa6\x0e\xfc\x89\x90\x3d\xbc\xe7\xb8\x61\x87\x27\xe0\x0b\x35\x3c\x63\xcd\x64\x18\x17\x67\xc6\x25\xce\xcc\x1b\x3b\x4f\xee\xc1\x1d\xfb\x2d\x31\xcf\x10\xfb\x03\x7b\x70\x46\xcb\x23\x55\xf8\xb3\xf0\x40\xcc\xdb\x69\xcc\x7d\x9d\xc0\x47\x35\xdd\x1d\xb5\x64\x25\x6e\xd4\x59\x6c\xfc\xa9\xfe\xe6\x4d\x7f\xcd\x97\x47\x33\x26\xf6\xec\xfc\xbd\x8c\xa6\xbf\x39\xee\x26\x47\x2d\xbd\xde\xda\x91\x37\x17\x9b\x7b\xbc\x66\x1e\x0f\x86\xf0\x2b\x0d\x7e\x7c\xe5\x38\x0b\x8a\x5b\xfa\xb1\x69\xac\x8e\xa7\xf1\xa7\x04\x2f\xda\x72\xb6\x72\xc7\xdd\x17\x83\x19\x17\x31\x39\xde\x8a\xb6\x2c\xce\x6d\x6a\x84\x67\x00\x10\x75\x33\x0e\x79\x33\xf3\x5d\x0c\x03\xc6\x99\x47\xdc\xb8\x07\x01\xca\xc1\x39\x20\x0c\x2e\xc5\xfb\x83\x53\xc0\x74\x70\x25\xb8\x15\xcf\x9a\x00\x5a\x53\x5c\x65\x59\xe5\xd9\xde\xaa\x49\x46\xbe\x3d\x4f\x4d\x65\x39\x74\x94\x92\x2f\x1b\x56\x5d\x53\x39\x0c\x83\x83\x65\x95\xf8\x5f\x65\xd5\x35\x95\xe4\xfa\x94\x98\x2d\x29\x4f\x55\x6d\x19\xc6\x04\xc9\x63\x90\x1f\xbb\xfe\x7b\xe3\xe1\xc3\xf7\xbf\xfb\x26\x7b\x24\x93\x69\x84\x1f\xbd\xeb\x6a\x49\x24\xa2\x6c\x80\x65\x22\x48\x56\xb2\xd9\x6c\x16\x75\x22\x55\x96\xf1\x6f\x01\x29\x20\xf2\x2c\xc7\xc7\x93\x5c\x67\x0c\x76\xc8\x1d\x1d\x1d\xfe\x5e\x94\x09\xf4\x74\x76\x2a\x50\x12\x22\x51\x36\x8a\x3a\xa2\x61\x3e\x1c\x75\x8f\x5e\xfd\xca\x6a\xd4\x08\x97\xff\xf9\xc5\xc4\xfd\xc9\xd5\xaf\xbc\xf2\xca\x2b\x25\xb7\x9c\xcc\x72\x5c\xa9\x5c\xca\xb9\x03\xae\x2e\x94\x55\x51\x44\x55\x5d\x71\x2d\xdc\x97\xf5\x02\xd4\xa5\xa0\xa8\x02\xbb\x23\x09\x56\x14\x44\x56\x95\xb8\x0e\xd4\x23\x65\x25\xad\x3b\x2a\xb2\x8c\x1a\x76\x45\xa5\x2c\x8a\x86\x3b\xc4\x88\xa2\xa8\xa9\x68\x87\x92\xa3\x7f\xee\xde\x6c\x68\xdf\x44\x9d\x73\xcf\x7f\x41\xf8\x62\xb6\xbd\xdf\xb6\xaf\xa8\xaf\x14\x3a\x84\xab\xe6\x35\x1f\xb7\xbf\x83\xf9\xb9\x6d\x6f\x81\xce\x8b\x84\x6e\xb5\xe4\x9f\x61\x98\xf3\x6b\x73\xbe\x1f\xb8\x2b\xe5\x58\x63\x45\xad\xf8\x03\xd3\x1f\xb6\xf6\x07\xa7\x0e\x5c\xe6\xfd\x99\x8e\xe7\xa5\xdf\x9f\x7f\x8a\x9e\x73\xf0\xeb\x2f\xc0\xf4\x27\x98\xdc\xbb\x71\x7c\xe5\xbe\x35\x05\xbe\x69\x47\xee\x7c\x06\x1f\x07\x02\xfb\x7c\x26\x17\x1f\x18\xcd\xdf\xdb\x33\xe7\xcb\x1a\xc2\x3e\x11\x6b\x98\x2d\xd3\x1c\x76\xcb\x3e\xdb\x5e\x7f\xad\xc3\xce\xf1\xbe\x50\x43\xe6\x9b\xe6\xe3\x2d\x67\xe4\xaf\x79\x8e\x8d\xcc\x6b\x5f\x64\x4f\x71\xfd\xe2\xbc\xbe\x1a\xb6\xf4\x9a\xfc\xf9\xd5\xdc\xa3\x3f\xcd\x41\xef\xdc\xdc\xfe\x6b\x82\xd7\x39\x3f\x87\xda\xf2\x67\x90\x5b\x03\x13\x31\x39\x5b\x5f\x23\xec\x18\xe1\xbf\x37\xfe\xaa\xa8\xbf\x44\xed\x3a\x94\xbf\x3e\x33\xda\xaf\xbf\x86\xf0\xa1\xcd\xb5\x74\x29\xf0\x51\xfb\x56\xf7\x14\xa5\x75\xd2\x57\xb0\x1e\x32\xd6\xc6\x17\x15\xec\x03\x1b\xf2\xb5\xb0\x68\xfb\xd0\x16\x2f\x7e\xfb\x22\x82\x3f\xb9\xb5\xde\x3e\xe2\x3b\xc4\x1a\x61\x47\x67\xfe\x5a\x69\x4b\xfe\x19\x96\x75\x07\xd7\x88\xdf\x59\x5b\x74\x4d\x41\xad\xbf\xda\xb1\x57\xae\xcb\xf6\x62\x50\x78\x9e\x17\x33\xda\xfb\xa8\xb6\xc9\x36\x8d\x78\x8b\x16\x3d\xba\xfd\x3f\xd3\x21\xa7\xa2\x2f\xa4\xd4\x3a\xe4\x3d\x6a\xc1\x4d\x1a\xe5\xf6\xc4\x39\x72\x5e\x6f\xbc\xda\xf1\x5e\xc9\xee\x67\xfc\x9b\xf4\x7f\xfd\x42\x9b\x3f\x6f\xe8\xbe\xef\xd6\x87\xef\x02\x75\xd3\x1c\x67\x59\xb9\x7c\x1d\xc6\xde\xfb\xe4\x82\x79\x1f\xcf\x57\x07\x4b\x8b\xf3\x54\x8d\x16\xd3\x13\x1f\xa5\x86\x70\xc1\x8c\x33\x70\xbf\x76\x50\x22\xa8\xc0\xb9\x26\xab\xc0\x65\x60\x21\xb8\x1d\xdc\x01\x78\x20\x83\x2d\x78\x5f\x6c\xd4\xe8\x8a\x12\x4f\xf9\xd9\xc3\x83\x81\x5a\xbc\x3b\x19\x0c\x54\x85\x6a\x3c\xe6\xcd\xb0\x0a\x6b\xe7\x37\xb7\x7a\xaa\xae\xf1\x56\x8d\xaa\xad\xc0\xe9\x5b\x71\xc5\xab\xef\xb7\x95\x56\x3d\xa9\xa6\xfa\x6c\xaf\xde\x8c\xdc\x0f\xad\x29\xab\x74\x19\xc9\x79\x8d\x09\x24\xb1\x1b\xbe\x08\x6f\xb8\x01\x3d\x86\xa6\x33\x10\x42\x5f\x3c\xe2\x5f\xef\x5f\x8f\xee\x46\x5b\xc7\xc7\xdc\x6f\x6d\xd3\xd6\xec\xde\xed\x5a\xab\xad\xd1\x9f\xc4\x1d\x57\x3f\x76\xf9\x9a\xdb\x8f\x7e\xd2\x1e\x82\xde\x3f\x4e\xf8\x4d\x77\xf3\xec\x2d\x57\xc9\x9a\xeb\xfb\xad\xb6\x36\x7e\x7a\x16\xe7\x85\x37\x7c\x78\xd6\xb9\x13\xcf\xf5\x72\x67\xcf\xe4\x6e\x9a\x58\x35\xe6\xa3\xa9\xcd\x63\x3a\xe1\x27\x0b\xa6\x2e\x98\xba\xc0\x3d\x75\x7e\x65\x74\x59\xf4\xc2\xf3\xcb\x87\x78\x87\xdc\x18\x79\xa8\xf6\xec\xf2\xc5\x3f\xd5\x5e\x99\x3f\xdf\x75\xc5\x3b\x4b\xd1\x07\xcb\x4a\xfc\xa8\x1b\x96\xf2\x09\x21\xc6\x0b\x6c\x40\x08\x44\xf9\x08\x2f\xf0\x31\x91\x75\x3d\xf1\x3d\xb6\xdd\x7a\x59\x45\xe6\x84\x9e\x80\x3f\xc2\x47\xd4\x38\x2e\x99\xd2\x23\x0a\x6c\x07\xe4\xa3\x51\x36\xc6\xe4\xec\x06\xa1\xa7\x2a\xce\x00\xa3\x4e\xb3\x3f\x93\x75\x3f\xd2\x94\x8f\xf3\x09\x5b\xf3\x52\x2e\x86\x46\x9d\x0d\x21\x00\xb5\xef\x33\x45\x64\x6a\xfd\x02\x42\xf7\xf0\x5e\x99\x79\xfe\x73\xb9\x8d\x2b\x6a\xda\xad\xf1\x0e\xdf\x28\xef\x5c\xb6\x91\x8c\x2d\xdb\x4d\x09\xbe\xaa\x36\xe4\x1e\x6f\x79\x59\xf6\x3c\x67\xdb\xa1\xc6\x5f\x10\xba\x44\xac\x6b\x94\x03\xf9\x32\x6e\x9e\xa3\x4f\x20\x74\x22\x69\x8d\xd9\x47\x6d\xbd\xa8\x60\xad\x81\x75\xe2\xf9\xcf\x08\x9d\x7b\x21\x17\xf3\xb2\xa7\xe6\xc3\xa2\xb6\x6c\x9f\xea\xb0\xeb\xb9\xf9\x78\x8f\xc3\x67\xb7\xd7\xc1\x6d\xd6\x1e\x63\xcc\xda\xcf\x6a\xfc\x39\xa6\xe7\x7c\xc2\x26\xee\xc1\x6b\xc8\xab\x4f\xc7\xd1\xa5\x5e\x30\x75\x36\x93\x7b\x37\x47\xd0\xee\xad\x62\x76\x80\xa6\xd6\xcf\x23\x68\xd4\x41\xb4\x9f\x5c\x9c\x46\x8d\xb3\x08\xde\xc8\x39\x1f\xe1\x40\x8b\xc3\xff\xb5\xc7\xb0\xff\xf7\xc5\xed\xcc\xfa\xab\xf2\x7d\x16\x33\xee\xe2\xca\xfc\xf5\x96\xe9\x37\xfc\xb3\xf8\xfc\xb0\xfe\x8a\xe2\xf8\x1b\x7f\x66\xc3\x39\xc7\x7b\x63\xc4\x7a\x23\x43\xa9\xbe\xd0\x86\xe1\xc0\x69\x3f\x63\xb9\x58\x2b\x1f\xb5\x75\xbc\x99\x07\x6b\xe1\x40\xdc\xdb\xae\xdb\xdc\x0d\x6f\x2d\x07\x75\xb7\xe8\xab\xff\x83\x5f\x97\x80\x69\x4f\x32\x45\xdf\xbf\x75\x9b\x63\x8f\xcc\xb6\xfb\x3b\xae\xb2\xdf\x6f\xc6\x8f\x18\x76\x7f\x5b\xae\xde\xae\xe9\xdf\x27\xe7\xe2\xfb\x0e\x38\xc3\xce\xfa\xb9\xf8\xb3\x88\x75\x77\xb2\x01\xd7\x5e\x6c\xe8\xc4\x23\x7d\xb3\x98\x1f\x74\xd0\x8a\x9f\x8c\x0c\x44\x8c\xbd\x18\x63\xaf\xb9\xa9\xf8\xdc\x4c\x35\x0c\x98\xf0\x29\x03\x31\xef\x8f\xf0\xbc\xf6\xfe\x28\x40\xcf\x69\x7c\xf3\xcc\xbe\xba\xa5\x78\x51\xe2\x82\xf2\x80\xe8\xc9\x52\x22\x38\x1d\x8c\x34\x4e\xfa\x82\xe5\x41\x6c\x83\x83\x35\x56\x72\x59\xf3\x7a\x6f\xb0\x26\xe8\xea\x51\x03\x11\x97\xa2\xd1\x9c\x20\x74\xc3\x00\xca\xba\xfd\x28\x05\x55\xc4\x26\xe5\x70\x77\x26\x8e\x78\x28\x53\x62\x80\xe7\x14\x85\xe7\xb3\x48\x90\x65\xdd\xb9\xe6\x62\x31\x49\x4a\x24\x5c\x7e\xc5\x18\x13\x67\xe8\xdb\xae\x67\xf5\x3e\x9e\x78\xcc\xa6\x9d\x79\x36\x70\x14\xd7\x00\xd9\xbb\x39\xdf\x17\x34\xe0\xc7\x05\x82\xd7\x06\xdc\xc8\xff\xd4\x41\xb4\x8f\xe0\xb8\x7c\x9c\x1f\x76\xd7\xb3\xc4\x1a\x2b\x91\xc3\x73\xb4\x8e\x80\x0b\x04\x7c\x9b\xad\x9f\x02\x99\x9b\x72\xd7\x86\xfc\xfe\xa4\xd2\xb8\x3f\xb9\x5c\x93\x66\x2e\xd1\x23\xab\xf3\xda\x9b\xbe\xa6\x89\x9f\xc9\xc7\x73\x08\xd7\x6a\x4f\xbd\x49\xd8\x05\x2c\x0f\x87\x90\x03\x4f\xcc\xaa\x17\x61\xe4\x42\x25\xf0\xeb\xeb\x06\xd9\xea\xcf\xe1\xd7\x88\xfe\x10\xb9\x32\x1d\xfd\xc7\x31\xd3\x29\xbc\xe7\xa1\x26\x88\xf6\x44\xee\x4e\x47\x7b\x8c\xe7\xd8\x1f\x71\x3f\xd3\x44\x7f\x0c\xfa\xfc\xb4\x78\x7b\xb3\x3f\x6f\x38\xec\x9d\x9d\x6b\x8f\x18\x97\xc9\x77\x23\x8f\x17\x81\xc7\x5c\xd7\x9b\x78\x5e\x77\xec\x29\x98\xfd\xa7\xa9\x1d\xcf\x81\xbc\xf5\x98\xd9\x3e\x5d\x1c\xbe\xef\x1e\x02\x2e\xe4\xe0\xbb\x48\x3c\x89\x1c\xfe\xc3\x6f\x12\x7c\x94\x09\x38\x79\x0e\x80\xfd\xf6\xfd\xac\x0e\x77\xd0\x07\xe7\x9c\xdd\xfb\x7c\x01\x1f\x8d\xb3\xab\xab\x0b\xe4\x84\x90\xc3\xed\x5f\x11\x70\x36\xf7\xde\xc6\x37\x1c\x7c\x14\xad\xfe\x1f\xfc\x73\xbe\xfc\x18\xb9\x0b\x1d\xef\x25\x72\x8e\x3a\xe0\xd8\x36\xee\x6a\x29\x80\x13\xb9\x45\x89\x7e\xf2\xa4\xfc\x13\x39\x2d\x13\xe6\x1c\xf4\x55\x5e\x7b\x53\x8f\x4c\x3a\x6f\x24\xe8\x66\xf0\xf7\x0d\x3c\x2f\xce\xcb\xb7\x03\xc6\x78\x9b\xff\x4c\x8c\x37\x95\xc3\x93\x1a\x52\x5c\x1f\xdb\xce\x2a\x90\x13\x0c\x6f\x9a\x5b\xbc\xbd\x9d\xb3\x30\xaf\x9f\xdb\x76\x13\x78\x08\xbe\xef\x92\x1c\xf8\x45\x0b\x7e\xac\xca\xa6\x83\x19\xb7\xb3\x0b\xe7\x68\xb4\xf3\x87\xe5\xbd\xf7\x60\x92\x80\xc7\x72\xf0\xe6\x8f\x09\xbd\x30\x6c\xff\x2f\x0b\xf4\x9d\x90\x87\x5d\xcf\xd8\xf0\x84\x97\xc9\xe1\x39\x72\x4d\x81\x3c\x63\x78\x63\x3a\x7f\xed\x6d\xc0\x77\x3c\xef\x90\x5b\xd1\x17\x3a\x34\x2f\xef\xbd\x8e\x9c\x8e\xa9\x74\x81\x5e\x60\x3c\x47\x2f\x25\xe0\x12\xf1\xde\xcb\x0a\xf4\x0e\xf7\xdf\xce\xdf\xa6\xcf\x0b\x06\x3d\xf1\x0d\x8f\xb6\xb9\xc4\x78\x85\x9c\x9c\x37\xce\x24\xda\x8b\x39\xfc\x76\x7e\x3e\x9d\x6e\x44\x3e\x3f\xa2\xff\x09\xb3\x06\x1f\x96\xb7\xe3\x1d\x05\x74\x30\xec\xc9\x3f\xf3\xe7\x17\x53\xdf\x6f\x22\xda\x13\xef\xdd\xfe\x1f\xa2\x3d\xa6\xf3\xc1\x71\xb8\x0e\x3f\xce\x6e\x98\x7a\xc3\xa6\x05\xc1\x7b\x3b\xef\x49\xdc\x8a\xd9\x32\x65\xe2\xae\x7c\x59\x69\x9b\xe3\xa0\xf5\x24\x3b\x46\xf1\xcd\xcf\x81\x8f\x6a\x78\xd7\x84\x5f\x32\x20\xe0\x7a\xf6\xf5\xa9\x37\xff\x0c\xa6\x0c\xe8\x7e\xcc\x01\xf7\x3d\x43\xeb\x8e\xce\x68\x2c\xc6\xeb\x83\x73\x09\x9e\xa6\x73\x34\xb1\xef\x86\xc7\x07\x22\xa4\xae\xb5\x7e\x4a\x8c\xd1\xe0\xe9\x74\xdd\x57\x49\x46\x81\x59\x65\xd4\xfc\x0e\xa1\x6f\xad\x5d\x84\x5e\x29\xb9\xf9\x26\xf9\x7e\xc1\x3c\x64\xb4\x2f\x25\xe0\xc6\x3c\x87\xf3\x57\x11\xf3\xa2\x29\xf7\xfb\xf3\xe5\xd2\x61\xdf\xed\xdc\x2e\x36\x1e\x03\x6e\xe7\xbe\x89\x5b\xbe\xa3\xa9\xe7\xaa\x43\xce\xec\xb1\x1d\xc4\x19\x2b\xd6\xcf\x29\x36\xe7\xb4\x2e\x2a\xae\xd3\xc9\xf3\x09\x38\x61\xdb\x1a\xee\x73\xc8\x9a\xfd\xee\xe4\xab\x05\x78\xb0\xec\xb7\xae\x75\xcc\xa5\x76\xfb\x03\xcf\x10\x34\x35\x6a\x03\xe2\xfe\x24\x9b\x06\xb1\x6d\x53\x1c\x78\x24\x1b\xde\x4b\xc0\x09\x9d\x68\x6d\x76\xf4\xdf\x7e\xef\xf1\x1b\x6d\x1e\x98\xb9\xa8\x0e\x9e\x5b\xc4\x27\xca\xe1\xef\x20\x68\x9d\xca\xe1\x39\x31\x27\xdf\x76\xb6\xb5\x3a\x78\x9c\xeb\x8f\x31\xae\x45\x84\x2d\x51\x72\xb6\xb6\xf5\x82\x82\xf1\x62\xf8\xce\x64\x81\x6c\x61\x5e\xaa\x38\xf3\x9b\x7a\x43\x9e\x5e\xe3\x3e\x35\x8c\xcb\xf7\xd3\xcc\x31\xd7\x13\x3a\x9a\x93\x8b\x5c\x2e\x26\x07\xcf\x68\xea\xf8\xf5\x0e\xfb\x96\x93\xaf\x5d\x8e\x31\xc8\xb6\x4c\xc0\x62\x63\xf0\xe5\xf2\x76\xe4\xe6\x3b\x3c\xb6\x7d\xa7\x1c\xed\x45\x0b\xcf\x91\x7f\x13\xfd\x34\xe0\x78\xcc\x6d\x38\x9b\x5e\xdb\x30\x5b\x5e\x92\x84\x0f\xf1\x23\x02\x17\xb6\xf5\x27\x16\xe7\xf1\xc1\xac\x67\x75\xa4\x3b\xcf\xd6\x0b\x24\xbd\x53\x13\x8b\xcf\x9d\x0d\xc9\x02\x5a\xe0\x1c\x1c\xa9\xe9\xf9\x3a\xab\x6c\xcd\x7b\xaf\xc3\x4e\xee\x5a\x5e\x5c\x2e\x8e\x3f\x4e\xd8\x29\x42\x2f\x95\x1b\x8b\xfb\x10\xbb\x6e\x2b\xd0\x4b\xc3\x17\x54\xf2\x7d\x56\x23\xcf\x8b\x43\x1e\x89\xfe\x34\xbe\xe6\xf0\xf9\x6c\x1e\xef\xff\x88\x80\x73\xb6\x4c\x84\x0e\x19\xb9\xd4\x66\x7f\xc3\x67\x97\xe7\xf9\xcc\x06\xaf\x5f\x75\xcc\x41\xa2\x2f\xb4\x6f\x13\xee\xd7\x1b\x0e\xdf\x29\xa7\x9f\x9b\x0a\x64\x06\xcb\xc6\xbe\x0d\x05\x3e\x0c\x6e\xbf\xf3\x8d\x82\xf1\x19\x36\xef\x0a\x3c\xca\x1f\x16\xd5\xad\xd6\xe2\x34\xb1\xeb\x25\xc6\xad\x7d\x73\x73\x1e\xfd\x93\xc3\xef\xb4\xef\x49\x3b\x6c\x06\x21\x93\x3b\xfe\x58\x5c\xaf\x5a\xbe\x24\xf0\xe0\x3a\x64\x3a\x06\x1f\xb5\xf3\x93\xd3\x8b\xfa\xe5\xf6\x9d\xd5\x3c\xfc\x76\x0e\x88\xb8\x75\x67\xc9\x7c\xef\x82\x82\x79\x04\xeb\xe1\x5e\xb1\xc0\x96\x18\xbc\x39\xbd\xf8\xfc\xb2\xb9\xab\xb8\xbf\xb5\x7e\x56\xbe\x8e\x9c\x08\x14\xe8\x42\x32\x67\xdb\xf6\xaa\xc5\xed\xc8\xde\xe3\xc5\xd6\x3f\x3e\x6a\xc3\xc5\x84\xce\xa6\x72\xfa\xbf\x1b\xdf\xf8\x5a\x7f\x99\xf9\x19\x4b\xbe\xa3\x31\x27\x5f\x2c\x31\x4f\x85\x8e\x54\xe1\xef\xcc\x2c\x36\x07\xec\xfe\x5d\x81\x5f\x64\xf4\xeb\x72\x07\x5d\xed\x39\x60\x6f\x7d\x51\x19\xa3\x1a\x1e\x2a\xf0\xa3\x30\x9f\xf7\x3e\x58\x60\x4b\x70\x5f\x5b\x4e\x39\xda\xdb\x63\xd8\xfd\x41\xbe\xee\x9a\xf0\x3f\x12\xfd\xec\xb0\xfa\xe9\xa3\x9a\x1f\x29\x3e\x07\x1f\x5a\x52\x00\xc7\xf4\x3b\xb4\x16\xf7\x76\x88\x4d\x27\xc2\xfe\xd8\x77\xf5\x72\x73\x86\x31\x2f\xfd\xbe\xb8\xbe\x35\x2f\x2b\x90\x49\x4c\x8b\x3d\x3b\x89\x35\x95\x91\xb3\xf7\x8b\x3c\x7b\x6b\xae\xc9\x8d\x3e\xed\xc1\x9e\xcf\x9e\xf9\xc5\xde\x61\xd7\xb4\xb4\xf7\x57\x8c\x71\xb7\xfe\xb2\xf8\x7a\xab\xfd\xb5\x82\xf9\xc4\xb0\xe9\xaf\x3a\xe4\xcc\xf6\x31\xec\xfb\xca\x79\xbe\x50\xf3\x8f\x0a\xd6\x43\x18\xff\xee\xd7\xf3\x6d\xd8\x89\xbb\x2d\x8f\xd8\x49\xef\x3d\xf1\x82\xb9\x87\x58\xdf\xb4\xcc\x29\x6e\xdb\x8e\xbf\x40\xb4\x27\xfc\xb9\x5d\x13\x09\xde\xa4\x72\x74\xb0\xef\x28\xe5\xe4\xce\x18\xd7\xbd\xf9\xf4\xd9\xd2\x9c\x67\x6b\x09\x5f\xce\x97\xbb\x27\x91\xb3\x77\xb8\x3f\xea\xab\x84\x1e\x24\x73\x74\xdb\xf2\x76\x71\x5f\x65\x3d\x53\xa0\xe7\x18\x6e\xdf\x15\xca\xc9\xa3\x81\xdf\xa9\x37\xb6\x9e\xa9\x3d\x84\x0c\xc9\xb9\xfe\xec\x9e\xec\xe8\xbf\x64\xc1\x8f\xdd\x52\xdc\xa7\xda\x22\x17\xd0\x79\x3a\xde\xb7\x6f\x2e\x6e\x97\xdb\x1e\x2d\xf0\x09\xb0\x4c\xb7\xb1\xc5\xc7\xdb\xd8\x51\xa0\xaf\x18\x4f\x63\x6e\x9f\x63\xbe\x77\x13\xb5\xc6\xe2\x97\xa2\x5e\xe4\x21\x7c\x11\xd9\xc6\xbf\xcc\xa1\x1b\xf6\xb8\xb6\xed\x74\xd8\x71\x1b\x6e\xc7\xa1\xe6\xe9\x1e\x11\x03\x6c\xc6\x70\x34\xec\x04\x64\xdc\x6e\xce\xe7\xc0\xfd\xb1\xe3\x5c\xf3\xe4\xbf\xf1\x95\x02\xbb\x88\xdf\x6b\xc7\x8e\xe4\x8f\xf7\xe5\xe2\xf4\x6f\x6c\x2f\xf0\xf9\x8d\x71\xed\x28\x98\xf3\xa7\x13\x71\x39\x33\x6c\x1a\xe1\x9c\xc2\xc6\xd8\x0e\x9d\x53\x80\x0b\xbf\x83\x88\x43\x31\x73\xbd\x1b\x76\x3f\x69\x9c\x40\x4c\xcf\xb3\x13\xd3\x89\x98\xb4\x3a\x5b\xc6\x08\x1d\xb4\x63\x70\xf2\xd6\x3b\xcd\x4f\x16\xb7\xf1\x0d\x93\x08\x78\x3a\xa7\x53\x3b\xde\x2f\xae\x53\xad\xe9\x02\x5b\x84\xc7\x67\xc7\x2e\xc4\xad\x33\x73\x93\x86\xbf\x2a\xa0\xb9\xc1\xeb\x26\x40\xfa\x0a\x16\x0d\x73\x67\x46\x71\xeb\x0c\xcb\x98\x53\x8f\xe5\x72\xe9\x98\xe7\x21\xba\x6c\xf8\x72\xe7\x21\x71\xeb\x3c\xc4\x78\xaf\x71\x1e\x02\x20\xae\xe9\x2b\x52\x0c\xae\x65\xe8\x88\xf6\x0f\x0e\xaf\xc0\x9b\xe8\xf8\xca\x70\xb0\x6c\x52\xed\xe8\x8a\x12\x0f\xde\x51\x2f\xa3\xba\xfa\xe4\x92\x40\x5f\x17\x7e\x7a\xfb\x7b\x12\x5c\x3a\xc3\x26\x33\x69\x18\x89\x6a\xfc\x00\x40\x52\x22\x06\x93\x11\x24\xa1\x8e\x38\xea\x86\x0c\xc5\x28\xb2\x2c\xc9\xb2\x92\xe4\xe3\xb2\x24\xc4\x25\x26\x29\xb8\x44\x4d\x09\xd0\x9c\xc4\x31\x71\x57\x4a\x71\xb3\xb8\x5e\x99\x51\xbb\xfc\x1e\x1c\xeb\x63\xdc\xeb\x01\xc3\x82\xe5\x41\x97\x17\x57\x27\x2b\x19\xe6\x0d\xe1\x4b\x0a\xc3\xf0\x4d\x07\xfd\x13\xaf\x59\x3f\xf3\x2e\x6f\xa4\x3f\xd0\x93\x86\x1d\x2e\x90\x60\x65\x58\x9a\x54\xa2\x31\x4d\xd0\x78\x06\xc6\xb2\x1a\x0f\x97\xa9\xea\xd2\x92\x74\x1f\x73\x9b\xfe\xe3\x0c\xfd\x87\x4b\x54\x90\x2a\xd0\x7c\x22\x91\xe8\x46\xbd\x2c\x97\x90\x4b\x95\x34\x0c\x94\x3c\xd3\x27\x94\x3c\xa6\xb4\x2a\x6f\xe2\x7d\x7f\xce\x8a\x27\x38\x22\x02\x40\xcf\x69\x7d\xaf\x0f\xcc\x9a\x6e\xd7\x91\x35\xf3\x4d\xec\xc0\x7e\x6e\x6b\xae\x7e\x89\x39\xff\xe9\x10\xa2\xf6\x83\x51\x07\x39\xea\x0b\x35\x1e\xc7\x7c\x3f\x46\xc0\xb1\x1c\x36\xb6\xe5\xe1\xd1\x75\x39\xe6\x0b\x1d\xfb\x0a\xcf\x89\x18\x0e\x5c\x80\x37\x72\xeb\x83\xe1\xe0\x7c\x9d\x3a\x76\x16\x1e\xe0\xce\x1d\x7a\xc0\x0a\xe0\xa9\x1a\xc5\x43\x55\x2d\x49\x69\xfe\x8c\x2b\xc0\x6a\x4a\x27\xea\x4e\x89\x81\x54\x6f\x0c\xb1\x1e\x41\x44\xdd\x88\x4b\x40\xce\xad\xb8\xb2\x5a\x58\x41\xa5\x9d\x49\x08\x5c\xbc\x16\x60\x39\x45\x12\xe2\x6e\xd6\xcd\x71\x28\x99\x91\x71\x80\x3e\x05\x92\xd8\x6f\x8c\x03\x0f\xae\xee\x7d\x2e\x18\x01\x2e\xc4\x15\x47\xca\x88\xda\xdd\x65\x67\x53\x5e\x4f\x55\xd0\x88\xb4\xd2\x01\x35\xc1\x72\x77\x52\x93\x65\x19\x76\xa2\x88\xfe\x50\x61\x86\x41\x99\x30\xa4\xa3\x9a\xa4\xc0\x2e\x14\xd0\x1f\x2a\xae\x05\xfa\xb2\xde\x52\xd4\x99\x44\x11\x15\x76\x9c\xec\x62\x39\xba\x54\xe5\xdd\xb4\xab\xcb\x80\x99\x75\xb5\xcd\x3e\xf8\xaa\xe4\xdf\xc2\x6d\xa0\xdd\x47\x2d\x1c\xe7\x80\x87\x16\xe2\x9c\xd2\xeb\xad\x78\x9c\x7c\xb8\x75\x67\xf9\x05\xcc\x1f\x96\xae\xdf\x17\x3a\xb3\x6f\xca\x3e\x66\x9c\x8f\x3a\x8a\xf3\x2f\x81\x52\x90\xc4\xeb\x9d\x18\x70\x83\xb3\xcd\x51\x1a\x15\x5e\x01\x0c\x96\x07\x6b\x83\x38\x05\x74\x2e\xa0\xcc\x20\x40\x05\x41\x00\x22\xd8\xac\xc2\x24\x01\xdc\x5b\x92\xea\x8b\x5f\x5b\x12\x43\xfe\x98\x88\x8b\x03\x44\x50\x14\x1e\x71\xd0\x25\x92\x48\x04\x22\x81\x48\x20\xaa\x89\x0a\xec\x46\x7e\xfd\x71\xcf\x91\x9e\x7a\x5a\x7b\x6f\xe9\xa2\x11\x4f\x8f\x98\xe5\x3a\xc7\xfd\x9c\xa6\xf6\xb1\x5e\xd0\xc3\x23\x55\x80\xdc\xc9\x0e\x96\x2d\x95\x4a\x59\x77\xda\xc5\x62\x90\x50\x74\xcc\x53\x8a\xd3\xe2\xf0\x30\x02\xce\x51\x09\x5f\x68\x9f\xe1\x45\x4f\x1e\xa4\x7d\xc9\x20\x34\x8d\x0e\x82\xa7\xd6\x86\x63\x7a\xfa\x42\x87\x8c\xda\x79\x93\x06\x69\x5f\x33\x48\xfb\x89\x83\xbc\xb7\x7a\x90\xf6\x13\x06\x69\x3f\x7e\x90\xf6\x91\x41\xda\x8f\x1b\xa4\x3d\xce\x2d\x0d\xbc\xb6\x9c\x5c\x68\x46\x24\xce\x00\xb3\xc0\x5c\xf3\x24\xb2\x26\x58\x63\x85\x8a\x10\xf7\xd7\x2a\x5d\x38\x92\xbf\xea\x3b\xc9\x8c\x4b\xd8\x30\xb2\x02\xbe\xa7\x09\x6e\xed\xa3\xcf\x3e\x9b\xf7\xc8\x4d\x8b\x47\xdc\x71\xdb\xd8\xc5\xef\xa2\x03\xb7\x41\xdf\x2b\xe8\xed\x31\x70\xed\xb7\xca\x8f\xeb\x4f\xe1\x28\x93\x92\xa4\x94\x34\x00\xd8\xb8\x5f\xf2\x33\xdd\xa8\x57\x16\xf9\xa4\x50\x72\xfe\xb7\x8a\x52\xb1\xb1\x8f\x29\x4a\x93\x39\x07\x5f\xdf\x5c\x37\xe5\x8f\x75\x7f\x2f\xfa\x9d\x4b\x07\xa1\xa3\x91\x3f\xf3\x34\x70\xff\xc0\x6c\xef\x44\x6a\x3e\xbe\xc7\x79\x8e\x19\xc7\x63\x44\x77\x02\xb3\xfc\x75\xb0\x3c\xe8\xb1\xca\x50\x5a\x57\x04\xbf\x93\xda\xfd\x2f\x7c\xb2\x62\xe4\x4b\x63\x47\xc2\x4d\xfd\xb3\x5c\x3f\xdf\x53\x37\x07\xd6\xf5\x6d\x73\x49\xf3\x51\xfc\xda\xb1\x2f\x56\x5d\x0b\x2f\xfd\x76\x0a\xf6\xcd\xab\x1b\xbb\xf8\x36\x79\xda\xd8\xa3\x4f\xc8\xf2\xfe\xa3\xf7\xc9\x63\x37\xdd\x5b\xb2\xf8\xbb\xe9\xa1\x73\xbc\x17\x0f\x42\x87\x8b\x6c\xf8\x0c\x2f\x47\x2d\xf2\xad\xd8\x7c\xda\xc0\xe7\xe8\xbf\x18\x30\xf9\x03\x1f\x75\xe8\x25\x70\x7a\x91\xef\x84\x07\xc1\x55\x35\x88\x6e\x85\xf2\xdb\x27\x71\x7e\x61\xfd\x5b\xc5\xf0\xb4\x96\x0d\x82\x7f\x74\x71\xf8\x81\x7f\x0e\xd2\xde\xca\x2d\x67\xe9\x8a\x31\x77\x9c\x0f\x02\x60\x14\xa8\x06\x33\xc1\x02\x6b\x06\xf9\x16\x4e\xba\xab\xcb\xcf\xae\xb0\xc2\xb0\x46\xd5\x8c\xae\xae\x18\xee\x1d\x5e\xe1\xc5\xff\xaa\xd5\x35\xae\x44\xf7\x4f\x74\xb7\x20\x6f\xb6\x29\xc6\xd3\x69\x1b\x17\xf2\xcf\xdd\xbc\x75\xc3\x95\xff\xbd\x18\x5e\x88\xca\xd6\xb9\xe0\x90\x27\xe6\xce\xdc\xbb\xf0\xf8\x03\xd0\xef\x82\x13\x1f\x28\xf3\xc1\x73\x20\x3b\x17\xfd\x04\xbd\x83\x10\xda\x3f\x13\x76\x50\xb1\x6f\x61\xb8\xf6\xdb\xb5\xd3\x97\x09\x37\x2e\xbf\xed\xd5\xc3\x0f\x2d\xd9\xff\x9f\x1f\xac\xbc\xb4\xf6\xea\xf9\xec\xf3\x3b\xd6\x2c\xf8\xc9\x27\x2e\xef\x18\xff\x90\x3f\x3f\xb9\xee\x49\x30\xd0\xd3\xf0\xe8\xb1\xa2\xf4\x3e\x30\x08\x1f\x06\xa3\x6b\xa5\x13\x4e\xaf\x90\x7f\x09\xe7\x82\xfb\x27\x0f\x9d\xfa\x24\x96\x19\xc7\x77\xf6\x5f\xfa\x4d\xbc\x5e\x7f\xe1\x20\xf0\x60\x3e\x5c\x8d\xe7\xe1\x21\xed\xe5\xdc\x86\x4a\xf0\x56\xff\xbf\xab\x5f\x9e\xb1\xbf\x10\xd7\x41\x77\xf1\x77\xec\x7b\x71\x10\x38\x7e\x07\x38\xd3\x96\x9b\xf3\x4c\xbb\x70\x89\x39\x17\xc7\xc0\x3c\x10\x07\x8b\x73\x77\xa5\xec\x0a\xcf\x95\xb9\xea\xce\xc3\xaa\x6b\x2a\x83\xe5\xd5\x35\xd0\xfa\xfb\x3b\xd9\x0c\xdd\xd5\x1c\x01\x15\x09\x2a\x88\x83\x2c\x52\xa1\x80\x24\x09\xc5\x61\x0a\xa9\x90\x45\x5c\xa6\xb3\x13\x26\x3a\xb5\x2c\xfe\x0b\x6d\xff\x56\x61\xd3\xce\x76\x7f\xd5\x7f\xa6\x7b\x49\x3c\x2e\xc6\x51\x38\x2e\x70\x9c\x10\x87\xd9\x38\xae\x9d\x3c\x00\x12\x89\x44\xc9\xef\xbe\x45\xb6\xfa\x5d\x92\x49\x8b\x98\x37\x41\x31\x76\xce\x80\x72\x70\x9e\x79\xeb\xdd\xb6\x96\xce\xfb\xec\x23\x21\x11\xb3\x5e\x30\xf6\x4b\x60\x55\xde\x84\x33\xec\x9b\x2f\xa9\xbf\xa6\x29\xb2\x0c\x33\x28\xaa\x3f\x54\x80\xe5\x99\x30\x17\xd5\x14\xd5\x02\xb9\xff\xa5\x0d\x73\x0d\xab\x47\x6f\xd7\xa3\x77\xeb\xbf\x5e\xf4\xc8\xa2\x47\xeb\xea\xaf\xba\xf5\xfe\xfb\x17\x79\xda\x10\x7d\xaa\x97\xea\x4d\xc7\x51\x4f\x02\x86\x4f\x76\x8b\x09\x85\x2b\x01\xb0\x07\x03\x12\x96\x2c\x25\x28\xc6\x17\x3a\xd4\x8e\x65\x6c\x46\x71\xb9\xd8\xbb\x86\x58\xdf\xe0\xfb\x27\x38\x7f\x5e\xe8\x00\x3e\xcf\x5b\x1f\x30\xfd\x37\x83\x4e\xc3\x70\xf5\xa7\x8b\xc0\x18\x4c\x9d\xcb\x0c\xff\xcd\x92\x13\x4b\x46\xa0\x51\x6f\xba\x52\x87\x7e\x07\x1a\xc1\x77\x4b\xae\x46\x07\x60\x00\x75\xc1\x07\xfa\x04\xb8\x02\x7d\x0c\x83\xa8\x0d\xfe\x79\x9d\x0e\x5a\x87\xba\x60\x80\xfe\x36\x2a\xfd\xaf\xa4\xa0\x5b\x77\x49\x92\x02\x93\x8a\x16\x86\xe7\x1c\x81\x65\xe8\x5f\x2f\x97\x34\x7d\x07\x1a\x39\xf5\x73\x24\xa1\x87\x06\xed\xf0\x59\xc5\xfa\x11\x83\xe8\xf3\x05\x83\xc0\xcf\x1f\x04\x7e\xde\x20\xf0\x73\x07\x79\xef\x39\xc5\xe1\xcd\x1f\xe6\xdb\xaa\x7d\x17\xa1\x8f\xc0\x25\xd3\xff\x50\xb9\x8b\xb0\x55\xf8\x3b\xf4\x8a\xcd\x6e\x10\x1b\x88\x4f\xf9\xd3\x94\xcd\x3e\x2c\x05\xe4\xfb\x9b\x47\xe5\xec\x0f\x38\xcb\xe6\xb3\x1f\x8c\x00\x17\x83\xb1\x60\x02\xd6\x03\x06\x5c\x0e\x62\xe0\x5a\x70\x03\xb8\x59\xe7\xb8\x59\xbf\xba\x92\xf2\x7a\xf4\xc9\xc3\xb8\xdc\x5e\x1b\x34\x52\xc4\x58\x02\xa1\xb3\xdb\x53\x53\x59\xee\x31\x0d\x45\x75\x51\x63\x51\x28\x0c\x12\xbc\xbb\x7c\xe8\x0b\x43\x86\xba\x7e\xdd\xc7\xdc\x0c\x13\x0b\x77\x7e\xd5\x89\x96\xce\x84\xa1\x5f\x6c\x3d\xfe\x08\xfa\xc4\xd5\x78\xfb\x4c\xf4\x40\xe5\x28\xf4\xd3\x92\x55\x68\x3b\x9c\xd4\xf7\x19\xac\x45\xbb\x5d\xeb\x76\xa1\xf7\x92\x49\x38\x6e\x97\xb4\x0b\x4d\xfd\x16\x61\x81\x7b\x2b\x2b\xcb\xcb\xcf\xff\x01\x3f\x7f\x19\x3f\x63\xce\xb2\xca\x87\xbc\xd1\x8b\x2f\x5e\xf7\x52\xf4\xa6\x8b\x2b\xdd\x17\xdf\x7b\x3d\xda\x01\x6f\xbb\xfe\xfa\xeb\xaf\xff\xf2\x71\xfd\x8f\x7b\xe9\x37\x8b\x50\x31\x9e\xf9\x07\xe1\x71\xc5\x20\xf0\xe1\xc5\x79\xbc\xe7\xee\xfc\xf6\x2d\xbb\xbf\x71\xce\x29\xb7\xe1\x51\x03\xbe\xe7\xb3\x6f\x6c\x7f\xf6\x20\xf0\x61\x79\xf0\xaa\x3d\xe7\xa1\x6b\x40\x63\xbe\x5c\x99\xfd\x9c\xbb\x7b\xdb\xc0\x7c\x70\x7e\xdd\xfd\x13\x47\x17\xa1\x85\x6f\x10\xb9\x1e\xc4\x17\xda\x7d\xd1\x20\x7d\xa2\x07\x81\x0f\x1d\x04\x3e\x64\x10\xf8\x59\x79\x73\xe0\xf9\x66\x4e\xa4\x18\x58\x00\x16\x83\x04\x58\x02\x56\x82\x7b\xc0\x2a\x2b\x3b\x2f\x8e\x5f\xc7\x3f\x2a\x28\xef\xa4\x5a\xfc\x57\x6d\xa8\x6a\xf4\x0c\xdd\x3d\xaa\xd5\xdd\xe8\xbc\x46\xc3\x72\x89\x7c\xad\x9f\x46\x0c\xfb\x77\x72\xc8\xe4\xc5\x35\x2b\x2b\x86\xbe\xfd\xf5\xc8\x17\x9f\x5c\xf5\x48\xc5\x86\xc5\x1b\x66\x2f\x59\x3c\x3b\x34\xf6\xd1\xdd\x6f\xbf\x5b\x31\x1c\x1e\xda\x30\xff\x91\x4d\xad\x6f\x8f\x5d\xb9\x64\xd2\xaa\xa1\x15\xe9\xcf\x46\xae\x5a\xb5\x72\x55\xc5\xaa\xd9\xeb\x6b\x52\x2b\xeb\x9e\xac\xbb\xfd\xf5\xf9\x75\x1b\x26\xcd\x4e\xcd\x9e\xb4\x61\x6c\xdd\xef\x9f\x9c\x5d\xb7\x61\x31\x7c\xeb\xdb\x7d\xf1\x45\x8f\x6d\x9c\x7a\xe9\x98\x31\x17\xac\xe0\x37\x8f\x18\xf2\xe0\xd2\xa6\xd1\x0f\x2d\x2a\x1d\x32\x6d\xe2\x98\xaf\x1b\x2f\x1d\x31\x3a\x33\xe2\xb1\x4b\xbf\x6e\xba\xf4\xaa\xcb\xd6\x35\x5c\x56\x3d\x66\xcc\x05\x1c\xdb\x10\xc2\x8d\x38\xed\xb7\x4f\x37\x5e\xd5\xf4\xf4\xc4\x87\x36\x4f\x6b\x78\x6c\xf4\x3d\x1b\xa7\x6d\x7c\x68\xe2\xc4\x66\x6e\xd6\x63\x9e\xec\xf7\xf7\xe3\x43\xc7\x4f\x62\x49\x7d\xd1\x69\xd3\x36\xcf\x83\x3e\x70\xf5\xb8\x61\x17\x3e\x4e\xaf\x38\xbe\x0f\x0e\x01\xf3\xc7\xfe\xf5\xc2\xfb\x06\x91\x43\x6a\xfd\x99\x83\xf0\xfc\x8c\xe2\xf0\x83\x8d\x45\x65\x73\xc5\x91\xc9\xa0\x17\xac\xb8\xbc\x72\xd4\x95\xf4\xdc\xe3\xfb\xe0\x2c\xb0\xee\x92\xdf\x56\x7e\x52\xe4\x7d\xa7\x0f\x22\xdb\xa7\x15\x87\x1f\x9a\x3e\x48\xff\x4a\x8b\xc3\x77\xcc\x18\x04\xbf\x77\x10\x38\x35\x08\x1c\xdf\xd7\x05\x65\xb6\x6d\xb7\x72\x23\xe5\xfc\xbf\x71\x60\x3a\xb6\xf0\xf3\xb0\x85\x5f\x6a\x7a\x80\xd5\xb8\x34\x17\xf6\xf8\xaa\x2d\x03\x4e\xfc\xee\xc1\x3b\x84\x65\xc1\xda\x60\x4d\xb0\x62\x78\x45\xf5\xa4\xda\x0a\x63\x35\x19\xaa\x1a\xf6\x1d\x1c\xa3\x1a\xe8\x7a\xe2\x89\x27\xe0\x19\xfd\xfc\xfa\x87\x1f\x3e\xf5\xc4\x13\x4f\x68\x6b\x8d\xbf\xfb\xdf\x2a\x29\xed\xeb\x8d\xbb\xd9\x7e\x55\x74\x25\xb4\xa4\x10\xf6\x77\x87\xfd\x52\x14\xd2\x7d\x5d\xb0\xd4\x1f\xe8\xfa\x36\x67\xe0\xd3\xc5\x8b\x17\x2f\x46\xf3\x20\xbc\x41\xff\x83\x06\x6e\xd4\xff\xfc\xf6\x86\x3a\xa4\xb1\x97\xbf\x3e\xae\xb6\x76\xd2\x45\x97\xd7\xd7\x5f\x78\x21\x45\x7d\x8b\x69\x77\xcc\xa1\x57\x2c\x87\x0b\xc0\xf2\x8b\xb7\x8d\xee\xa0\x57\xb4\x9f\x0b\x19\xf0\xc0\xc5\x67\x55\xbe\x6d\xcc\xa7\xc0\x0d\x3a\x07\x18\x6f\x84\x92\x81\x07\x9c\x0d\xfc\x96\xf5\xf0\x38\x77\xb5\x3c\xd5\x65\x95\x2e\xc0\xc7\x64\x86\x87\x5d\xee\x2c\x9b\x60\x12\x61\x96\x89\xf6\x67\x34\x41\x55\x29\x59\x54\x12\x8a\x58\x7a\xb2\x87\xe7\x4b\x93\x34\xef\x89\xcb\xa7\xcc\xfb\xa9\x26\x6e\x5f\x68\x21\x8e\x8f\x58\x6f\xed\x19\xe5\xc1\x8f\x3e\x57\x1c\xbe\x1e\xaf\x13\x00\x65\xf7\xd1\xf0\x75\xcb\xf0\x7a\x11\x90\xd9\xb0\xdc\x83\xf5\xda\x7d\x5c\x55\x11\x55\xf2\x4c\xdf\xc3\x37\xbb\x7f\xdd\x5f\x3d\x7c\x90\x31\x94\x2c\xef\x13\x5c\x9d\x8a\x8b\x57\x5c\xcd\xc5\x46\x43\xf6\xed\xb0\x5b\xef\x9b\xde\xc3\xa2\x7d\x76\xe5\xc3\x0f\x8f\xff\xc6\xf6\x70\x10\x38\x28\x0e\x97\x06\x06\x81\xa3\x41\xe0\xda\x20\xf0\xfe\x41\xe0\x7d\x83\xc0\x4f\x0d\x02\x3f\x39\x08\xbc\xb7\x38\xbc\xf5\x8b\x41\xda\xff\xdf\x20\xf0\xff\x0c\x02\xff\x7a\x10\x38\x3e\x87\x03\x1e\x5b\x66\x2c\x79\x99\x82\xef\x7f\x55\x97\x55\x97\x55\xd7\x54\x97\x0d\x2e\x31\xfa\xb2\xa9\xfc\xec\xe1\xc1\x09\xe6\xfd\xb0\x50\x0d\xbe\x30\x30\x56\xc9\xaa\x5d\x4a\xbf\x30\x76\x10\x09\x82\xac\x9b\xd5\x12\x31\x18\x4d\x47\x4b\x55\x3f\x87\xba\x10\x2b\xba\x92\x1a\x53\xa2\x65\xe1\x28\xf4\xa7\x2c\x3a\xe6\xfa\xa4\x88\x64\xb9\xbf\x42\x13\x3e\xa8\x2c\x1f\xff\xfc\xf8\xf4\x82\xc9\xb7\x41\xe1\xed\xa2\x63\xfa\xdf\x41\xc6\xfa\xef\x7c\x78\xf2\xe6\x6f\x92\xb5\xfd\x97\x14\x87\xa7\xc6\xe7\xc3\xf7\x6d\xfe\x26\x3c\xd2\x97\xc5\xe0\xbe\xb9\xd8\xff\x7a\x9f\x01\xb3\x9f\x26\x3f\x4b\x49\xdf\x84\x2b\xb5\x3e\x1f\xbe\x77\xf5\x37\xb5\x6f\xf9\x60\x90\x3e\xf5\x0c\x02\xff\xd7\x20\xf0\x7f\x0e\x02\x1f\x44\x3e\x53\xcf\x0c\xd2\xfe\x7f\xf2\xe1\xcd\x95\xc5\xfa\x4f\xd7\xb7\x5d\x54\xfe\x93\xc9\x93\xeb\xbe\xf2\x0d\x4e\xd7\x7f\x14\x87\xef\xf9\x74\x90\xf6\x7f\x1f\x04\xfe\xb7\xa2\xf0\x39\xbb\x2f\x7d\xeb\xf5\x68\x79\xcd\xf6\xa2\xdf\xe9\x1e\x04\xd7\x5f\xf3\xc7\xf1\x52\xef\x39\xff\x9c\xce\x4d\x7b\xc8\x1a\x07\x70\x03\x01\x9f\xc3\x8a\xe6\x09\x9d\xb1\xe7\x5d\x66\x2f\xae\xf5\xe5\xb4\xb1\xc0\x9e\xa4\xcf\xbc\x30\x58\x13\x74\xb3\x6a\x20\xec\xca\xf6\x31\x25\x3d\x9a\xec\x8e\xf4\x77\xaa\xfd\x19\x77\x54\x13\x61\x57\xd4\x95\x34\xcf\x10\xe3\x7d\x29\x4a\x0c\xc4\x19\x14\x17\x10\xd3\xa1\xa0\x24\x4c\x28\x1d\xee\xee\x44\xb7\xac\x65\x70\x70\x11\x74\x71\x03\x8c\x47\xa4\xfc\x60\x38\x00\xb0\x1c\x82\x9c\x2e\x4f\xaa\x99\x38\x1a\xea\x2f\xf6\x70\xa8\x17\x06\x14\x35\xc6\x07\xc4\x44\x8c\x41\x9d\xd0\x8f\xe2\x2a\xe5\x57\x51\x04\xf5\xa2\x1e\x55\x0d\x24\xc3\xf1\x78\x6f\x8f\xab\xf4\x64\x9a\xca\xe6\x7c\x19\xc1\x17\x3a\x86\x63\x43\x0f\xed\x23\xd6\x26\xc9\x1c\xfc\xe8\x3a\x13\xae\xe2\x38\x83\x88\x2f\x74\x02\xd7\x5b\xd8\xb2\x8a\x80\x2b\x54\xdc\x82\xdb\xf7\x6b\x54\x7c\xb6\x67\xb7\xdf\x77\xa7\x03\x2e\xfa\x42\x87\x71\xae\x8c\x13\xf3\x1d\x78\x78\xbb\xfd\x5d\x8e\xf7\x0a\x06\xdc\x47\x35\x5d\x65\xc3\xcd\xf3\xfb\x5d\xf8\x9e\x8b\x8d\x27\x69\x9d\x87\x1f\xfa\x0f\x3e\x1b\x3e\x97\x68\x2f\xe7\xfa\xd3\xf0\x33\x02\xbf\x44\xb1\x16\xfe\xc3\xed\xf9\x78\x0c\x3a\x9c\x18\x20\xe0\x0a\x15\x35\xe0\x3e\xea\xd8\x5f\x08\x3c\xf8\xac\xda\xec\xff\xdd\xc5\xf1\x1c\xfc\x07\x01\x4f\x59\x78\x68\xea\xd8\x39\x0e\xfc\x71\x5f\xe8\x98\x1f\xc3\xcf\x75\xd0\x8d\xb3\xf0\x1f\xba\x33\x9f\x0e\x26\xfc\x26\x02\x8f\x9c\x7b\x6f\xc3\x65\x0e\x1f\x36\xea\x0b\x1d\x9d\xe9\xc0\x9f\xc4\xf1\xf0\x31\xab\xbd\x5a\x4a\xe0\x37\xe2\xf3\xef\x70\xf0\x2b\x69\x9d\xf5\x1a\xed\xf7\xdf\x59\x9c\x3e\xc7\x5f\xee\x79\xbb\xb0\x3f\x3e\x6a\xcb\x42\x47\x7b\x1b\x4f\xf3\x99\xc5\xe1\xfb\x2f\x74\xd0\xd3\xa6\xdb\xf1\x97\x1d\xed\x45\x0b\xde\x3e\xb9\x38\x9e\x83\x87\x8a\xc9\xb9\x8f\x6a\xdd\xe3\x90\x43\x5b\x4e\xf6\x5f\xef\x80\xe7\xe8\x6c\xc5\x69\x29\x56\x3c\xd6\x89\x9d\xf8\x1e\x01\x8e\x3c\xd8\x72\xac\x18\x6f\x0e\xdf\x48\xe0\x52\x73\xef\xd8\xf5\xbe\xe3\x1d\x96\x0c\x19\xd9\xf4\xa9\xb6\xa7\x6c\x5c\xc4\x77\x9a\xa6\x17\x1f\xb7\xf4\x79\xf1\xfe\xee\xf4\x15\x87\x37\xd5\x15\xd7\x57\xf5\x2e\x82\xff\x5c\xae\xfd\x81\xdf\x13\xe3\x36\xf4\x09\xc7\xe1\x48\x9f\x15\xa7\xdf\xc1\xbd\x45\xc7\x46\x25\x9f\xcc\xd7\xef\xd6\xeb\x0b\xe4\x8b\x90\xdf\x83\xf3\x1c\xfc\x8f\xf9\x42\xc7\xeb\x0b\xf4\x83\xd0\xef\x03\xe7\x39\xda\x4b\xbe\xd0\xf1\xe6\x3c\x7b\x60\xda\x21\xa3\xfd\x89\x76\x07\x6f\x72\xf0\x47\x6c\x78\x24\x67\x87\x68\xea\xc0\x18\x82\x0e\x38\xd6\xc5\xe0\xfc\xce\x21\x04\x1e\x3b\x56\xdb\xe7\xb4\x73\x44\x3f\xf7\x3d\x48\xf4\x53\xcd\xe9\xcd\xd6\x1c\x5f\x2e\xf3\xee\xa2\x1e\x34\xdb\xcf\x39\x7e\xe0\x67\xa7\x66\xee\x99\xf1\xbe\x93\x97\x47\x26\xe4\xd9\x52\x33\xe6\xc9\x78\x47\xcb\x1d\x8e\x31\xeb\x34\xad\x70\xb4\x37\x64\x98\x33\x79\x19\x3a\x8c\xb3\x61\x1d\xa9\x2e\x66\x97\x4f\x50\x0e\x7e\xca\x96\xdd\xb4\xe3\xe3\x73\x7d\xba\xbf\xc0\xbe\x27\x73\x7d\xda\xf7\x5c\x71\x79\xdc\x61\xd5\x4d\x95\xac\xf8\xa9\x23\xb8\x8e\x53\x6a\x1a\x41\x27\x1c\x2f\x66\xea\x79\xb6\x38\x9e\x7d\x7f\x2b\x2e\xd7\x5b\x33\x0e\x3e\x33\x16\xfc\xc8\xc7\xf9\xfd\x6c\xba\xbc\xa0\xff\x84\x7d\xdf\xf5\x6e\xbe\x5c\xb7\xfc\xcd\xd1\x5e\xb2\xec\x94\xd1\xff\xad\xfb\x8a\xcf\x73\x3b\x3f\x29\x26\x77\x3e\x2a\xf5\x28\x01\x4f\xe7\xc6\xb5\x77\x78\x71\x7d\x92\x3e\x25\x78\x89\xe3\xa2\x0d\xbd\x3c\xf1\xb1\x43\x5f\x73\xf0\xc0\x20\x7c\x39\xdb\xd1\x9f\x9c\xfd\x38\xad\xb8\x6c\xed\xe8\x22\xe0\x2c\xd1\xfe\x2a\x02\x4f\x82\x18\xef\x95\x8e\x79\xd7\x9e\xcf\x9a\x6e\x32\xd7\x33\xea\xc0\x2c\xef\xeb\xd4\xdd\xe6\x69\x4f\x08\x9f\x60\xd8\x15\x8d\xcd\xed\x8a\x72\xf7\xf0\x72\xd2\x07\xaa\x1a\x66\xe5\x37\xc7\x09\x61\x8d\x84\x48\x41\x23\xec\x00\x27\x06\x1c\xe5\x1d\xa1\x6a\x29\x9c\x43\x28\xa5\x3f\xe8\x9d\x74\x52\x10\x22\x4c\x20\x11\x8d\x44\x52\x1d\x28\x2b\x97\xfc\x7c\xc6\x2d\xcb\xe1\xdc\xa6\x53\xa7\x9a\xd0\xab\x7e\xd4\x7a\x1d\x2c\x0b\xa0\x34\x64\x0e\x8d\x83\x65\xae\x07\xfa\xdf\xbd\xe1\x06\xf7\x04\xf4\xfb\x16\x54\xdd\xec\x59\x29\xa3\x40\x57\x56\x55\x69\xd5\x9f\x88\x77\x76\xc2\xde\x93\x49\xaa\xbb\x6e\x75\xd5\xc8\x63\xf0\x7e\xf4\xdc\x73\xda\xff\xb9\x4e\x43\xbf\x78\xe7\xa9\xa6\x4f\x9e\x7b\xaa\xea\xa9\xb1\x45\x6c\xcd\xde\x33\x1d\x34\x8e\x59\x3c\x6f\xd9\x9f\x2f\xcb\x7b\xfb\xf2\xf4\x34\x6a\xd8\x3e\x83\x87\xed\x35\x04\xed\x93\x39\x59\x6e\x26\x79\xbb\x96\x8a\xd1\x2b\x52\xaf\x80\x67\x00\x98\xfa\x01\x63\x5a\x22\xdb\x6e\xd9\xf2\xd0\xfc\x4f\x07\x5f\x22\xbe\xd0\xee\xb6\x9c\xdd\x02\x6e\x90\x1c\x18\xe3\x7d\x8b\x92\xc1\x85\x60\x1c\x98\x53\x10\x2f\x47\x79\xcd\xec\xf4\xde\x2a\x9c\xe6\x38\x58\x53\x5d\xa6\xbb\xc7\x3e\xb3\xe6\x06\x18\x84\x67\xd4\xef\xb5\x2e\xa8\x21\xb7\xfe\xb8\xa6\xa2\xe5\x2b\x57\x1e\x3f\x76\x5e\xa5\xfa\xf4\x8c\x03\x35\xa8\x13\x75\x5e\xfa\xf4\xfd\xe8\xab\x35\x70\xa6\xe2\x0f\xf4\xc0\x70\x02\xf5\x0c\x80\x0e\xd4\xcb\x43\x16\xfd\x34\x9b\x94\xa4\x48\x2c\x90\x60\xa2\xd1\x74\x17\x52\x95\x92\xab\xc4\x87\x85\x87\x85\x7b\xc5\x1f\xdd\x1b\x9a\x36\x26\x34\x66\x4b\x7b\x8d\x78\xe3\x08\xf1\x85\x13\xa2\xeb\xb7\xae\xd9\x61\x26\x3a\x00\x64\x55\x81\x7e\xd4\xd3\xc1\xc3\x52\xe8\x57\x11\x93\xe9\x54\x93\x74\xd2\x9f\x88\xa7\xd3\x30\x7b\x32\x49\xf5\x16\xf8\x9b\x34\xd5\xf6\x51\x71\x3f\xb7\x79\xa1\x43\xdf\x6c\x9e\xb4\xbc\x53\x7c\x1e\x91\xfe\x62\xb7\x67\x8c\x5c\x4c\x46\xfb\x86\x46\x87\x1f\x67\xdb\xa9\x3d\x13\x07\xd1\xf3\x3f\x3b\xec\x42\x6e\x9e\x3a\xd7\xc1\xbf\xdc\xfc\x3e\xcd\x81\x47\xb2\x64\xad\x7d\x92\x43\xff\x25\xfb\xbd\xaf\x14\xc7\xb3\x7b\x1f\x61\xd7\x70\xec\x1f\xb6\x6b\x46\x96\x5c\x4a\xfa\xc4\x69\xab\xb6\x4c\x2c\x62\x3b\x6d\x5c\xc7\xf6\x12\xb4\x48\x5a\xbe\x13\x4d\xed\xbc\x7c\x90\x31\x77\x11\x70\x31\x47\x23\x3b\x16\x3c\x4f\xfe\x77\xff\x80\x68\xcf\xe6\xd6\x0e\xf6\x5d\x6c\xd5\xaa\x57\x62\xb6\x7f\xda\x31\x97\xdb\x3a\xd1\xb8\x75\x90\xfe\x7c\x5c\x6c\xce\xf1\xe5\x62\xa9\x15\x5b\x86\x0c\x5b\xbb\xcb\x21\x13\xf6\x7b\x4f\xcc\x23\xe0\x7c\x8e\x3e\xc7\x7f\x5d\x74\x0e\x0c\xed\xc7\x37\xbb\xdb\xef\x2f\xe4\x1b\x91\x53\x39\xef\xdd\x5b\x65\x02\x8e\xf3\xa9\x18\xf0\xb6\xdb\x08\x1e\xe0\x9c\x5b\x06\x5c\x5d\xe1\xa0\x45\x0e\xce\xd9\x7d\x35\xef\x9a\xed\x8c\x16\x59\x0f\x24\xec\x75\xd1\x6f\x1d\xf2\x22\x18\x63\xf0\x51\x5b\xad\xbd\x51\xd9\xce\xf1\xdc\x83\xef\x6f\xe0\xdb\xbf\xd2\x7f\x7f\xc3\x67\x1f\xd9\xfd\x4d\xe5\xf4\x67\xc7\x7f\x88\xfe\x12\x7a\xb5\xd3\xf2\x47\x1f\xce\xad\x53\xde\x03\x3e\x6a\xc7\xff\x11\xfd\xc2\x31\xa6\xc6\xfc\x7c\xec\x2b\x87\x6c\xc4\x6d\xbf\xe6\xe7\x84\xed\x4d\xe7\xe8\x77\xec\x42\x02\x8f\x62\x8d\x8f\xa6\x76\xb5\x12\x74\x95\x31\x1e\xdc\xbe\x69\xaa\x83\x3f\x39\xfd\xdf\xee\x90\x6d\x5b\x06\x24\xeb\x3e\x96\x91\x8b\x44\xf6\x85\x5a\xa7\xe8\xf0\xd6\xa9\xc4\x7b\x53\x39\xff\xe8\x58\x2b\x81\xbf\x99\xba\xdb\xf2\x47\x5f\xfc\xc7\x3f\xfe\x83\xe7\x55\xd9\xd0\x67\xf3\xc4\x78\x9a\x11\x19\x80\xcf\x0f\xf4\xe9\x32\x58\x4e\x46\x3c\x93\x1b\x0c\x65\x56\xde\x73\xa3\xa0\x92\xfe\x18\x5b\x8a\x15\x25\x9e\xaa\x51\x30\xea\x12\x54\x57\xbc\xbb\x5b\x4b\x71\x52\x92\x97\xe5\x64\x1a\x96\xc6\x51\x04\xf5\xc6\x79\x9e\x0b\xf0\x7c\xc0\xaf\x89\x2e\xb1\xbf\xcb\x1d\xd0\x24\xb7\x1f\xa6\x50\x1c\xa6\xfa\x12\xd9\x14\x9f\xee\x74\x49\x01\x94\x41\x42\x14\x2a\x9e\x2e\x45\x41\x5d\x0a\xca\xb2\x8a\x24\x25\xe3\x9d\x42\x8a\x53\x3a\xa1\x80\x38\x21\x41\x2b\x74\x80\x71\xa5\x15\x59\x91\x24\x09\x75\xc9\x32\xe2\x13\x82\x24\x25\x92\x6a\x5a\x4a\xca\x98\x3e\x66\xdc\xff\x61\xec\xaf\xed\xcd\xd1\xcd\x01\x97\xf0\x3d\x23\x50\x82\xe1\x0a\x25\xda\x51\x12\xc6\x2e\x8e\x15\x70\x57\x46\x3c\xe5\x46\xd9\x08\x58\x16\xa4\xbc\xe5\xb0\x2c\x78\x0e\x0c\x96\x05\x5d\x4c\x32\xca\xc0\x6e\x86\x55\xc4\xb8\x8b\xd1\x44\x57\x44\xeb\xc4\x4f\xc7\x29\x51\x65\x62\x32\x8c\xb9\x14\xad\xbb\xb4\xd4\x15\xd6\xb2\xfa\x43\x09\x51\x59\x10\x78\x56\x4d\xaa\xa8\x57\x42\xbd\x32\xea\x51\xc4\x92\x68\x22\xc1\x43\x11\x75\xc2\xd2\x52\xba\x07\xf1\xb0\x14\xf5\x22\x16\xd2\x00\x9c\x0e\xb8\x81\xe9\xde\x1f\x50\xbc\x19\x33\x96\x3b\x05\xba\x08\x8c\xd7\xfb\xea\x82\x55\xc6\x89\x40\x75\x59\xe5\x30\x73\x6f\xd7\x88\x05\xb7\xe2\xc1\x87\xe1\x00\x68\xcb\x67\x72\xff\xd7\xd6\x5f\xa3\x77\xd6\xc3\x6b\xd1\x5b\xaa\xea\x7a\x7c\xcb\x96\x71\x2c\x23\x45\x59\x74\x4b\xc9\xdd\x7d\x2f\x52\x25\x91\xbe\x4e\x8f\xfe\xa3\xbc\x64\x55\xdf\xc6\x31\xb7\xa0\xcf\x51\x6a\x01\x1c\xef\xf9\xcd\xae\x53\xf7\xef\xa2\xf8\x49\xda\xaf\xd0\xeb\x77\x43\x1e\xad\xec\x8f\xb8\x4f\xf6\x73\x9e\x33\x39\x31\x26\xf2\x5f\x8a\x87\xc4\x97\xc5\x1f\x89\x25\x87\x1e\x45\xe9\xb7\x9a\x9a\x5c\x87\xd0\xe6\x4f\x3f\x85\x77\x62\xba\xf3\x56\x7e\x93\x36\x5c\x17\xb7\xed\x43\x82\x1f\xd8\xe6\xee\xdd\x8f\xf5\x61\x8a\xe9\xef\x71\xd8\x46\xe7\xf8\x31\x3b\x8f\x23\xce\x2c\xfc\x98\x23\x9e\x1a\xcc\x91\x9a\x60\x39\x8e\x77\x0a\xd6\x04\xbd\x41\x97\x2d\xb1\xb5\xc1\x5a\xec\xfa\xc1\x5e\xd9\x1f\x80\x1d\xe1\x88\xc8\x32\xae\x84\xa6\xba\x02\x5a\x17\x7e\xf8\x53\x49\x39\x16\x8f\x43\xbf\x2b\xa5\x65\x4a\x69\xcb\x27\x54\x91\xec\x09\xb0\x50\xf6\x8b\x29\x3e\x19\xc8\xf0\x09\x86\x46\x51\x56\xcb\x04\x10\x60\x61\x9a\x12\x22\x0c\x13\x8d\xc4\x13\xac\x2c\x48\xa2\x24\xc8\x09\x97\x14\x67\x64\x08\x14\x81\xa6\x13\xa8\x57\x14\x07\x80\xa0\xf5\x8a\x1d\xa8\x5b\xf6\x8b\x01\x86\xef\x40\x42\x5c\x26\xf2\x32\x12\xf5\x96\x8f\x9e\x47\xd0\xc4\x58\x3b\xfc\x1a\xd3\x04\xef\x59\x00\x0a\xc7\xb9\xcb\x94\x68\x9f\xfd\xd5\x80\xa9\x3a\x55\x4a\x3c\x83\x51\xc5\x5b\x35\x6a\x74\x59\x75\xd9\x24\x5b\x45\x6d\x35\x35\x8b\xf9\x24\x59\x94\xd2\x32\xae\x58\x20\x22\x33\x01\xd8\x43\x50\x43\x3c\x95\x52\xb2\x31\xd8\x03\x63\x6a\x87\x16\xb6\xc5\x39\x02\xd3\x9d\x49\x3e\x99\xee\x97\x05\xb5\x37\x91\xf5\x08\x42\x77\x2a\x16\x8d\xc4\x59\x49\xd6\xff\x93\x19\x77\x67\x54\xe6\x25\x17\x8d\xa2\x09\xad\x53\x96\x51\xb7\xf1\x78\x44\x41\x95\x52\x12\xc3\x75\x0a\x12\x07\xec\xbb\x2b\x51\x5f\xe8\xac\xf1\xba\x2d\x3f\x8a\xeb\x59\x4a\xff\x05\x80\x7d\x07\x47\xf6\x85\x9a\xf0\x5c\xd2\x62\xcd\x7b\x76\x2d\x9d\xa6\x09\x0e\x78\xcc\x49\xaf\xfd\x64\x6d\x62\x4c\xdf\xf6\xd3\x00\x79\x27\x93\xb5\xee\xb8\x9d\xc0\xb9\x5e\x4e\xe4\x6a\x6c\x9a\xb9\x03\x9a\xf0\x99\x95\xf4\x07\x13\xce\x59\x3e\xcf\x5e\x7c\xa7\x4c\xca\xe6\xe3\x37\xf8\x77\x6c\xa5\x09\x67\xac\xfe\x1c\xc6\x37\xfd\xf6\x59\xf7\xa8\x79\x9c\x23\xc4\xd6\x01\xe9\x43\x02\x8f\x91\x4f\x76\x3d\xde\x0f\x9a\x67\xb7\x37\x6b\x86\x1d\x5f\x80\xdb\xff\x9e\x90\x0f\xfc\xde\xa6\x88\x63\x5c\x9c\xb3\x3f\x0a\x99\x63\x14\xe7\x98\xd9\x32\x00\x00\x3d\x47\xfa\xc3\xa5\x3d\x75\x55\xd5\x13\x9d\xef\x3e\x8c\xf7\x96\x0e\x2f\xb0\x7a\x40\x8e\x63\x2f\x9e\x93\x5a\xc9\x7b\xdc\x18\xbe\xad\x31\x8f\x3f\xa6\xdf\xb3\x7f\x15\x96\xdb\x71\xf9\xf0\xbd\x38\x97\xd3\x7e\x6b\x8f\x58\xb4\xf9\xf6\xae\x03\x0f\x6b\xd7\x7d\xdd\x80\x65\x03\x9f\xa0\x1c\x5d\x6f\xf3\x1a\xaf\x4b\x0f\x7f\x02\xc8\x3b\x4a\x46\xde\x55\x7d\x1c\x86\xff\xf9\x21\x1e\xc7\xc7\xf8\x33\xc1\xe2\x5f\x3b\x3e\x9b\x90\x3e\x70\xc8\x8d\x64\xf5\x77\xd7\x17\x04\x1d\x71\xbf\xd4\x5f\x3a\xfa\xcb\x3a\xc7\x27\xfd\x8e\x78\x37\xc6\x63\xf0\x7b\x1b\x3e\x2b\x01\xa5\xe6\x1d\x36\x05\x5c\x6c\x46\x63\x4d\x07\x0b\xc1\x52\xb0\x1c\x00\x68\xa5\x57\x2c\x37\x43\xb2\xf4\xdf\x0a\x14\x18\x27\x61\x1c\x1d\xaa\xaa\xad\xa4\x86\x42\xdd\x9c\x97\xd7\x04\xcb\x3d\xfa\xe3\x8c\x42\xa9\x2c\x33\xf0\x55\x78\x83\x66\x60\x4b\x39\x3e\xdb\x87\x3c\x27\x30\xdd\xc9\x6e\x19\x4a\x42\x58\xf6\x33\x2e\x51\xd1\x22\xb1\xa8\x4b\xd2\x38\x57\x4c\xeb\xc0\x4f\xe7\xc9\xee\x28\xc3\x8b\xee\xd2\x70\x80\xef\x4c\xa4\x68\x98\xd1\x7a\x5d\xa5\xc6\xe3\x61\x79\x3e\x96\x08\x08\x4c\xec\x54\x46\x86\x4a\x2c\xc6\x76\xa5\xb8\x04\xcc\x72\x89\xce\x24\x1b\x8b\x69\x40\x86\x5d\x28\x50\x92\xf4\xd3\x52\x20\xda\xc3\xc7\xb9\x40\x3c\xc6\xf7\x30\x71\x21\x2e\xc4\xf8\x98\x00\x3b\xa2\x91\x44\xa2\x23\x10\x88\x33\x51\xbf\x10\x4f\xc7\x62\x1d\xb1\x58\x07\xa2\xe3\x71\x5a\x2c\x65\x60\x5c\xeb\x76\xc9\x48\x0e\xf8\xc5\x08\x1b\x8f\x44\x12\x71\x8e\x8f\x86\xb3\x6c\x9c\x94\x97\xa6\x31\x3a\x2f\x9b\xc6\x62\x69\xba\x84\x90\x3d\x9b\x07\xad\x4b\x1d\x3c\x93\x7c\xa1\x6d\xdb\x8b\xf3\xec\xf8\xed\x0e\xf8\x0b\x03\x37\x7b\xef\xa6\x1e\xa6\xeb\xb7\x3d\x09\x7e\xc2\x44\x66\xfe\x93\x9e\xdb\x96\x05\x21\x6d\xf6\xb4\xe8\xf4\x3a\x3b\x37\x9c\xec\x0b\x6d\xc3\xf9\x97\x24\xcb\x6f\x9d\x31\x30\xc7\xfb\x53\x6a\x0d\xbd\x62\xff\x2a\x6d\x23\x00\x97\x3e\xc3\x00\xba\x7e\xff\xaa\x73\xd1\x25\x1f\x30\x80\x9e\xbb\x7f\x95\x6b\x3b\xf0\x5c\xb2\x9a\xc8\xb5\x28\xfb\x56\xe8\x38\xe0\xe3\x0c\x18\xbf\xdc\x17\x3a\x72\x2b\x00\xbe\xb9\x5b\xdb\x00\x40\x1d\x0c\x98\xf8\x1e\xf0\x98\xf2\x19\x05\xe7\xe3\xdb\x13\x63\xc1\x44\xe3\x8e\x57\xde\xdd\x1a\xb3\x5c\x9b\xce\x58\xc3\x84\xe3\x9f\xc3\x88\xdf\x05\x2f\xdd\x9f\x71\xf5\x70\x1c\xaf\x84\x33\x6c\x54\x4b\xa9\x5a\x4a\x75\xf5\xf4\x67\xa0\x92\x56\xb8\x64\xca\x1d\xeb\x4c\x72\xa9\x4e\x21\x93\xe4\x53\x69\x4d\xee\x90\x39\x35\x45\x45\x95\xde\x3e\x8e\xe5\xc2\x6a\x38\xee\xce\xf6\x09\x25\x52\x5f\xd4\xc3\xf6\xa2\x52\x4e\x12\x15\x8e\x65\x45\x51\xe6\x50\x97\x20\x4b\x49\x9e\xc7\x3f\x4d\xbd\x15\x75\x9f\xbe\x01\xd3\xa6\xbd\xd3\xf6\x3d\x63\x5e\x41\x87\xb7\xbf\x8f\x69\xf6\x3e\xa1\xe7\x04\xbc\xfd\xd7\x0e\x3b\xac\xc3\x3b\xf1\x9e\x82\xb5\x77\xba\x62\x20\xe6\xdd\x4e\x5d\x4f\xd7\xef\x2b\xfb\xea\x0d\xe6\xc7\x33\x1f\xa0\xe7\xb4\xff\x6e\xe0\x0b\x66\xc9\xe4\xe9\xe6\x7b\xc2\x5e\xc5\xc2\xe7\xa3\x0e\xae\x04\x59\x5b\x0f\x31\xbe\x63\xd8\xce\xb4\xbf\x67\xdb\x2b\x9d\x97\xe6\x7b\x68\x4a\xb2\xe0\x02\xb6\x33\x09\x5f\x48\xfd\x4b\x6e\x1c\xc0\x8b\xcf\xf3\x24\x2a\xee\x88\xb5\xa9\xb3\x79\x52\x69\x46\xc8\x1a\xac\x08\x96\x07\x47\x07\xcb\x83\x1e\xf3\x6f\xcb\xe3\xa2\x8c\xfb\x79\x46\x41\x2c\xbc\xf3\xd1\x4b\xd1\x5a\xcc\x1d\x50\x35\x31\xa9\x89\xaa\x3b\xa0\xc5\xdd\x49\x98\x45\xe1\xfe\x4e\xd8\x83\x68\x77\x14\xff\x9e\xd1\x7f\x8f\x79\xd4\x53\x6c\xca\x4b\xf7\x65\x04\x19\xaa\x30\x13\x89\x48\x69\x41\x0e\x47\xb4\x0e\x8d\x0f\x67\x14\xad\x87\x8a\x4b\x02\x92\xbb\x11\x0d\x7b\xba\x21\xae\x6c\x65\xfc\xe1\x25\x41\x4a\x71\x34\x13\x09\x24\x94\x64\x82\x89\xc6\xfc\x02\x97\x36\xe7\x53\x4c\xff\xb6\xdf\x60\xdb\xd8\x69\x8d\x16\xf3\x26\x6c\xd0\xc0\xa0\xe5\xb6\x51\x20\x49\xe8\x4d\x8e\x66\x9d\x36\xcd\x22\xc6\xb9\x58\x3b\xb6\xd9\xd2\x6f\x88\x75\x07\x7e\xc7\x76\x9c\xb1\xbf\xfd\x7d\x87\x5e\xe6\xf0\xbc\x4b\xac\x5f\x48\x38\x69\xfb\x05\x02\x3f\xbe\x0b\x0a\x4e\x07\x12\xbe\xdf\x9b\x20\x78\x62\xc4\x31\xcf\x01\x57\xe6\x73\xc6\x50\x92\x61\x79\x9c\xf1\x18\x81\x0d\xd5\x13\x6a\xcd\xd0\x06\x5c\x99\xab\xa0\x34\x6c\x17\xc5\x68\x11\x77\x40\xd1\x04\x55\xe3\x15\x77\x58\x8b\xa8\x3a\x67\xdc\x01\xd8\x8d\xfc\xfd\x59\xfc\x7b\x18\xff\xce\x7b\x92\x9a\x18\x61\x53\x29\x29\x46\xab\xe1\xa4\xd6\xc3\x28\x09\x4d\x50\x74\x0e\xba\x64\xd8\xdd\x27\x59\xbf\x51\x09\x89\x43\x52\x2f\x8a\xc2\xcc\x00\x80\x22\x87\xd2\xa2\x28\x26\xf4\x47\x53\x62\x91\x40\x69\x94\x8f\x25\x63\xb1\x84\x08\x39\x7d\x2d\x23\x89\xa2\x68\xea\x86\x90\xd3\x8d\x83\x1b\x8b\xd3\xb3\xed\x5d\x5b\xc7\x74\xdf\x28\x47\xb7\x5f\x12\xba\xa7\x12\xed\x7f\x9d\xcf\xaf\x76\x7c\x27\xf3\xc4\xed\x76\x7b\x86\xa4\x7f\xdb\xaf\xec\xf6\x51\x03\x4f\xdb\x3b\x58\x86\x7e\x49\xc8\x90\x30\x50\x83\xbf\x53\xbf\x8f\xf6\x7b\x18\x30\x83\xa6\xeb\x9f\xfb\xf0\xde\xf7\xa6\xfc\xaa\xfa\xb8\x6f\x4e\xfb\xbb\x60\x16\x03\xea\x96\xd8\xf6\x81\xf5\x85\x4e\xdc\x86\xbf\xfd\xae\x63\x4c\xb9\xbe\xbf\xe3\xf0\x67\x72\xf0\x5f\x38\x6c\x7a\x0e\x9e\x21\xfa\x68\xd3\x8c\x36\x7a\x4a\x49\x6f\xdb\x74\x90\x73\xdf\xd9\x2f\xda\xdf\x11\x88\xef\x50\xd2\xcf\x6d\x3a\x44\xbc\x22\x6e\xff\x1b\x4c\x87\x5f\xd8\xf0\xa9\x26\x7d\x7e\x03\x80\x6f\xce\x4b\x6d\xa0\x9b\x01\x93\x77\xd8\xf6\x8c\x94\xdd\xb7\x1c\xe3\xe3\x7d\xa1\x7d\x3e\x0c\xff\x99\x0d\x37\xf7\xcc\x0c\x78\xcb\xdf\x07\x19\xdf\x4f\x89\xf1\xe5\xe0\xd6\xf8\xde\x24\xf6\x2d\x74\x9f\x4c\xc1\xde\xd2\xbf\x08\x7e\x12\xe3\x6e\xf9\x9d\xa9\x4f\x8f\xe0\x7c\x48\x2c\xf0\xe0\x5b\x66\xa3\xc1\x25\xe6\x8d\xbd\xab\xc0\xc2\x5c\x14\x5c\xee\x2e\x89\xb1\xc3\x5e\x13\x34\x26\x1a\xaf\xb9\xd4\x37\xb3\x40\x17\x58\x45\x4b\xf7\xca\x2d\xdd\xf3\x2e\x9a\xd2\x30\xfe\x1a\xf4\x72\x49\x29\xba\x0c\x36\xa0\x95\xf0\x5f\x7d\xb7\xbb\x68\x74\x27\xdc\x8c\xae\x41\x53\x14\x91\x93\x64\xbf\x22\x70\xa2\x0c\x93\x7c\xa6\x87\xeb\x7d\x11\x6b\x61\x58\xd5\xb5\x50\x50\x75\x2d\xc4\x71\xaf\xee\x00\xec\x45\xa5\xba\x5e\xf5\x67\xf1\xbf\x7f\x31\xef\xc6\xda\xa5\x97\xff\x70\xf5\x97\xab\xd1\xff\xac\x5e\x0d\xcf\x5e\xfd\xe5\x87\x8b\x56\xae\x7d\x74\x51\xcb\xa2\xdb\xd6\xae\x5a\xd4\xb4\xf2\xd7\xab\x57\x3d\x47\x9d\xb6\x76\x09\xda\xf5\x31\xda\x0a\x7f\xf0\x21\xbc\x61\x09\xfa\x60\xd5\xaa\x55\xf3\x1f\x59\xb5\xca\xb2\x67\xe6\x39\x7c\xd3\xc5\x38\x8e\xe0\x0c\xc2\x67\x4e\x11\x72\xf1\x86\x49\x37\x76\x60\x8a\xb7\x91\xe2\xc1\x19\x20\x00\x26\x82\x28\x98\x86\x63\xec\xaf\x04\x71\x70\x1d\xae\xca\x5a\xe2\xf1\x8e\x1a\x5d\xe2\xa9\x1a\xe5\xd1\xfd\x39\xca\x5b\xe1\x1d\x35\xba\x76\x78\xc5\xa4\x5a\x1c\x5f\x09\xbf\x03\xb1\xbc\x05\x24\x2e\xf9\x0b\x4b\x43\x1a\x26\xe2\xa8\x03\x65\x50\x2f\xea\x88\x43\x19\x46\xa2\x61\x28\xa9\x52\x92\x45\x3d\x88\x63\x3a\x93\x02\xdf\x9f\x86\x3d\x81\x70\xff\x0e\x2a\xa0\x45\xdd\xd1\xa4\xc6\xcb\x1a\x9f\x74\x47\xb5\xa8\xa8\x53\xcd\x1d\x70\x01\x04\xf4\xa7\x3f\xab\xff\x3b\x9a\x94\x58\x59\xa5\x53\x32\xab\x24\x61\x8c\xe7\xd2\x62\xda\x7d\x2c\x46\x2b\xac\xc4\x65\x32\xbc\x28\x46\x39\x41\xea\xe0\xe2\x92\xcc\x8b\x11\x86\x15\x65\x36\x5e\x42\x49\x0c\xca\xaa\x38\x12\x05\x06\x98\x01\xc0\xf3\x3c\xc3\x71\x7c\x14\xd7\xff\x53\x62\x2c\xcf\xc5\xbb\xe3\x5d\x59\x36\x63\xca\x30\xae\x53\xbc\xaf\x4c\x97\xd5\x7d\xb8\x92\x9b\x94\x26\x6c\x3f\xef\x0b\x35\xe3\x5a\xea\xfb\xac\x33\xe8\x99\x03\x23\xbd\x92\x3d\x17\x55\xed\xa9\x18\xf8\xa4\xff\x3a\x9f\x77\xcf\xf0\x81\x9e\xfe\xb9\xa0\x14\xdc\x35\x30\xdf\x2b\x52\x33\xc1\xd9\xe0\x22\x30\x1d\x2c\x02\xd7\x81\x1b\xc1\x2d\x60\x19\xbe\xf3\x6d\xaf\xf5\xf1\x52\x5f\x5f\xfc\x8f\xfe\xce\xc0\xef\xc2\x95\x27\x5d\x23\xd1\x03\x43\xe0\x91\x21\x37\xdd\x71\x9b\x50\xfe\xc7\x8b\x2f\x1e\x82\xea\x18\xf8\x00\x62\x4b\x5e\x73\x8d\x41\x2b\x87\xc2\x57\x87\xdc\x72\xd7\xf2\x47\x87\x7f\x72\xc9\xa5\x43\xd0\xf8\x99\x50\x44\xd7\x6a\x3b\x5d\xa3\x11\x3f\x04\x1e\x1f\x72\xf3\xca\xdb\x1f\x2e\xff\xe8\x92\x8b\x87\xa2\x5a\x06\x3e\x82\x96\xa0\xf2\xef\xc6\x23\x77\x0d\x5a\xb4\x1a\x7d\xbc\xa3\xf4\xa9\x29\xf7\xc3\xa7\x76\x6c\x40\x8b\x1f\x45\x5d\x4d\xa5\x4f\x4d\x5e\x05\xd7\x36\xbd\xe0\xf8\xcc\xbd\xad\x38\x73\x80\x7d\xcf\x3e\x27\xcb\xaf\xdb\xf6\x24\xee\x80\xff\x84\xf0\xe3\x48\x9b\x71\xc8\xe1\xaf\x59\xf6\xca\xe4\xe9\xbe\xa1\xf6\x77\x52\x84\xcd\xc2\xf5\x89\xc0\x19\x80\x1b\xa8\xf3\xee\xc4\xfb\x56\x01\x10\x36\xb5\x25\x06\xe6\x01\x16\xdc\x0e\x38\x00\x20\xd6\x17\x4f\x85\x59\x6f\xd1\x74\x78\x2b\x26\xe0\xfd\xc5\xf2\xe1\x15\x93\x3c\x41\x17\x76\x9f\xbe\x89\x47\xf6\x14\x4f\x5e\x2f\xc6\xd9\x8f\xcf\x81\xb0\x26\x78\x81\x2b\x58\x53\xb2\x18\x06\x60\xd9\x18\xf4\x2f\xf4\x57\xd7\x7b\xf7\xdd\x77\x54\xfe\xc9\x3c\x84\xf6\xcf\xbb\x7c\xde\xbd\x23\x5f\x0e\xa1\xe7\x5c\x25\x23\x43\xfb\xfb\x97\xc1\x54\x08\x35\x2d\xee\xbb\x1c\xfd\x4b\x3b\x49\x05\x34\xc6\x1d\x49\x62\x0b\x94\x74\x47\x34\x86\xe0\x90\xc9\x9d\xb0\xfe\x3b\xe2\xe2\xf1\x68\x22\xc0\x46\x23\xa8\xc7\xcf\x8a\x02\x94\x51\x2f\x2c\x75\x47\x03\x73\xc5\x58\x58\xb9\xf5\x71\x76\x57\xe2\x85\x17\xfe\x85\xbe\x9c\x1b\xa7\x1f\x2f\x0d\x40\xf4\xf8\xfe\x48\x24\x1e\x40\xf7\xed\x7a\x3c\xf1\xb1\xe7\x66\x39\x8e\xd2\x69\x24\x40\xa9\x03\x46\xe3\xa8\x47\x10\xc4\xa8\x28\x08\xf1\xfe\x14\x9b\xf0\x8b\x74\x22\x99\x4d\xc5\x7b\xa1\x1f\x26\x51\xaf\x2c\xf3\x8a\x92\x9b\x37\xb0\xfe\x24\x3d\x38\xef\x07\x65\x69\x91\xed\x6b\xdb\xf3\x96\xf4\x23\xc2\x0f\x10\x89\x39\xe8\x35\xc7\x1a\xdc\xd2\x53\x4a\xfa\x21\xe1\x9f\x11\x73\x93\xf4\xaa\xbd\xb7\x11\x37\x6a\x77\x98\xf0\x0e\x62\x8d\x2f\x13\x78\x5e\x21\x64\x46\x24\xe0\x2f\x13\x73\x22\x89\xbf\xbd\xa0\x9f\x46\xfb\x13\x76\x7b\x6b\xee\x33\xc6\x75\xdc\xb1\xb6\xc8\xc1\x8f\x39\xc6\xc5\xfa\x42\x87\xfe\x0b\xe7\x59\x31\x3e\x6d\x33\x71\xf1\x8e\xbe\xa6\x0a\xe6\x69\x03\x7e\x14\xcb\xf0\x69\x40\x1c\x98\xef\x15\xa8\xa5\x20\x0c\x66\xe3\xf9\xf1\x36\xb0\x82\xb8\x6d\x82\x4d\x7b\x39\xe5\xb1\x2b\xc0\x92\x77\xdc\xf5\x99\x60\x74\xb0\x26\x58\xe5\xb8\x39\x52\x59\xe1\xad\x2a\x0f\xd6\x18\xbb\x00\x65\x95\x65\x1e\xbc\xb1\x09\x1d\xa6\xa8\xdc\xd8\xa8\x0d\xd6\x10\x1e\xac\xf1\xb7\x3b\xc2\xc6\xb3\x6a\x5f\xaf\x27\x9a\x46\xdd\xae\x14\xab\x88\x6c\x0c\x31\x09\x25\xc6\xf8\xe3\xf1\x44\x0c\x65\x51\x80\x83\x09\x18\xd5\x14\x97\xaa\x96\xa4\x78\x3e\x12\x0b\xb0\x91\x58\xb7\xc2\x25\xfa\x53\xe1\x30\xcb\x27\x7a\x64\x57\x2c\xca\xb8\x3a\x98\xa8\x96\xc5\xe7\xde\xa5\x14\xa3\x85\xdd\x11\xdd\xe5\xd5\x78\xd5\x1d\xd1\x22\xee\xb4\xbe\xb8\x37\x17\x27\x11\xec\xf0\xa6\xb1\xd0\x6f\x0c\x56\x8d\x19\xfb\x83\x1f\xc4\x66\xde\xc3\x2d\x59\x30\x75\xea\x83\x0b\x66\x9e\x75\xcf\x59\x13\x97\x1d\x58\x76\x4f\x0d\x77\x4f\x15\xba\x01\x2d\xb8\x62\x61\xf9\xa3\xe5\x33\x61\xf0\xd1\x5b\xe2\xff\xf9\xc3\x05\xc3\x6f\x99\x32\x13\x55\xba\xae\xbc\xab\x7a\xc2\x84\x6a\xf4\xc5\x15\x14\x58\x59\x8d\x7e\xf9\x5e\x7f\xff\x7b\xb0\xa6\xfa\x17\xd7\x5f\x7f\xcb\x84\xeb\x16\x5e\x4f\xee\xfb\xe4\x64\xe2\x08\xc1\xcb\x14\xc1\xe3\xc3\x84\x6c\x65\xf0\x3e\xd1\xbf\xb2\xc0\x47\x1d\xbe\x9c\xce\xe9\x47\x9a\xe0\xe3\x21\x87\x7f\xc8\xd2\xf5\xc7\xb7\xce\xdf\x31\xed\xf6\x0b\xff\x69\x78\xb3\x3e\xc3\x13\x3d\x13\x88\x03\xd3\xbc\x32\xb5\x94\xa8\x42\x7d\x1e\x98\x01\xae\x01\xd7\x83\x9b\xc0\xad\xe0\x36\x32\xe2\xc0\xb8\x26\x67\xdd\x31\x2d\x37\xb9\xe4\x0d\xd2\xb9\x13\x12\x23\xbf\x41\x25\x65\xfc\x34\x0a\x5e\x7c\x07\xee\xba\x5e\x16\xd0\x5f\x1f\x7f\x1c\x9e\x83\xfe\xaa\x3f\xae\x15\xee\x87\xfb\x9f\x79\xd1\xb5\x58\x3b\xa4\x3f\xe8\x2f\x25\x2f\x68\xa7\xcd\x74\xfd\x73\x59\xf3\x15\xab\x02\x8d\x33\x67\x5e\xf4\x6c\x23\x5a\x7f\x23\x9c\xfb\x52\xcb\x06\xf4\xe6\x8d\xf0\xac\xb5\x8d\xcb\xae\xbc\xa1\xf9\xa5\x2f\xb4\x8f\xbf\x3b\x4b\x3f\xe8\x3f\x7b\xf1\xb6\x92\xf1\xe8\x0e\x78\xa6\xb6\x5a\x73\x5d\x85\xe6\xc2\xd2\xab\xbe\xb8\xf2\xab\xe5\x97\xa3\xa7\x1a\x86\xac\x1a\x72\xeb\xfb\xe8\xd3\xe6\x7a\xf1\x0f\xef\xaf\xba\x35\xf1\x7c\xdd\x79\xb7\xd6\xdd\x55\x72\xbc\x28\x13\x4d\x1d\x22\xe7\xfd\xb3\xb0\x6d\x1a\x62\xef\xdd\xe0\xcf\x76\x30\x8e\x79\x5f\xc8\xd3\xbb\x83\xb6\x3e\xf2\xe6\x3c\x64\xf0\xfd\x00\xc8\xf9\x6c\xfb\xa9\xbb\x0d\x9f\x8d\x9e\xbb\xfb\x02\xf0\x97\x81\x2f\xa3\x57\x31\x63\xcd\x3a\xa2\xc9\xdc\x77\xd4\x91\x8e\xbd\xd4\xdc\x3b\x5a\x07\xd1\x79\x6b\xaf\xf6\x51\x9c\x77\x87\xf5\xd5\x4b\x3f\xf4\xfc\x93\x01\x93\x93\xf4\x8a\xf6\xc0\xc0\x29\xd4\xcc\x6c\x9c\xf4\x77\xdf\x9c\xf6\xdf\x80\x7b\x18\x30\x75\xaf\x29\x9f\x8b\xb0\x0d\xaa\x52\xc7\x02\xa0\x3d\xe2\xa3\xf4\x77\x9b\xf9\x70\x88\x35\x84\xb4\x9f\x78\x27\x69\x8b\xf7\x11\x74\x20\x6d\x99\x75\x1e\x1e\xc6\x72\x2e\xea\xe3\x4d\xe9\x6b\xf4\x7d\xfe\x1c\x1d\xf0\x59\xdf\xc1\x39\x78\x9f\xec\x62\xfc\xad\x16\x73\xbc\x09\x87\xce\x34\xdb\x3a\xc3\x39\xe8\xb0\x87\xa0\x29\xde\x6b\x6e\xc0\xeb\x87\xa6\x8b\x6d\xdd\xbb\xc7\x2b\x52\x4b\x7d\xf5\xdb\x92\xe0\x4f\x0c\x88\x5c\x40\xd7\x6f\x90\xbe\xae\x62\x6e\xbb\x78\xa1\x6f\xae\x8e\x1b\xbe\xc4\x80\xc8\x24\x5b\x7f\x8d\x71\xd1\x98\xf7\xc6\x1b\x76\x03\x00\x86\x02\x79\x60\x84\xf7\x31\xea\x01\x10\xc4\xa7\x8c\x96\x17\xb0\x08\x24\xc0\x9d\x80\x07\xf7\x03\x01\xac\x06\x1b\xac\xca\x05\x66\x91\x99\xda\xaa\xda\x4a\x87\x35\xc5\x1b\xa2\xba\x0e\x55\x97\x57\x96\x8f\x2e\x2f\xf1\x54\x8d\x36\x4b\x9b\x19\xc7\x19\x84\x3a\x62\x95\xd4\x9d\x8b\x31\xb8\xc2\xf6\x28\xf7\x77\x50\x3d\x4f\xb9\xf9\x31\xde\xb9\x29\xd9\xb6\x96\x3e\xc7\x75\xc9\xf8\xc9\x57\x8c\x7f\x64\xfc\x8d\x37\x4e\x9e\xdc\x78\xd9\x1d\x91\x8b\xca\xc6\x4f\x0e\x1e\x9c\x79\xd9\x0d\x4f\x6a\xe7\xba\x6e\x47\xa7\x3e\xfa\x08\x0e\x47\x6d\x68\xfd\x64\x78\xeb\x9f\xfe\xf4\x3b\xf7\xb8\x55\x8b\x6e\x5c\xb6\xac\xbf\xdb\xc3\x9e\x52\x95\x92\x48\x5f\xa7\xf5\xb8\xc3\x30\x02\xc3\xba\x6d\xce\xa0\x48\x04\xf5\xa0\x54\x04\xc6\xba\xa9\x49\xda\x18\xf7\x25\xbb\xb4\xfb\xb7\x6a\xab\x76\xb9\x2f\xd5\x26\xba\x7f\x08\x3f\x42\x95\xfd\x1f\xc0\x2f\xd0\x30\xf7\x25\xf0\x33\x74\x5e\xff\x5b\xf0\x6b\x74\x86\xe7\xe4\xb6\x53\xb7\x6f\x73\x0f\xf3\x07\x94\x68\xc0\xfd\xf9\xb0\xf0\x85\xd7\x5d\x36\x2e\x7e\xdd\xd8\x3b\x6e\x0e\x06\xa7\x75\xcf\xaa\x39\xeb\xe6\xb3\xc2\x7f\xd4\x21\x57\x5c\x17\xbf\x2e\x7e\xde\xcd\xe1\xe0\x6d\xe7\xdd\x7c\x5d\xfc\xde\xb1\xeb\xae\xb8\x62\xe1\x8f\xd0\x70\x78\xf3\xc4\x63\x97\x1e\x1c\xbd\x71\xf8\x44\x7e\xda\x05\x4b\x97\x5e\x3a\xfa\xa1\xe1\xd4\x9b\xcb\xc6\xa0\xee\x1f\xfd\xe5\x2f\x3f\x82\xfe\x31\x2f\x2f\x58\x70\xed\x98\x05\x73\x17\x4c\x79\x2d\x7e\x65\xfb\x45\xe7\x85\xc7\xd5\xe5\xfc\xc6\x9c\x0c\x59\xe7\x0c\xe3\x06\xc6\x7a\xb7\xd8\x6b\xe0\x15\xad\xe2\xc0\x87\xda\xfb\x0c\x98\xda\x4b\xcf\x39\xfe\xcb\x9b\xf6\xd6\x85\x2f\xba\x16\x14\xfb\x3e\x8e\x77\x00\x23\x40\x62\xc0\xef\x4d\x53\x02\xbe\xcf\x64\xec\xe5\x5c\x02\xc6\x81\x6a\x50\x0b\xa6\x82\x85\x84\xbd\xb5\x66\xd9\x87\xc0\xa3\xe0\x71\xb0\x16\x3c\x03\x9e\x05\x2f\x80\x97\xc0\x7e\x70\x30\x97\x7f\x68\x98\x9d\xe9\xc0\x70\x0c\xf5\x55\x6a\x95\xf9\x8c\x36\xed\x75\xad\xc9\x60\xeb\x29\x66\x87\x61\x79\x75\x8d\xa7\xba\xa6\x72\xb4\xf9\x77\x55\xb0\x2c\x08\xab\xcb\x2b\x6b\xaa\xcb\x2b\x47\x57\x97\x57\x0e\xf6\xf9\x68\xe2\x71\x17\xe9\x8b\xde\xc6\xad\x20\x06\xa6\x4b\x51\x14\x66\x52\xee\x18\x52\xa0\xcc\xa3\x2e\x01\x75\xf3\x50\x42\x8a\xdf\x05\x10\x84\xd8\xf1\x97\xa4\x3e\x55\x2c\xc5\x2b\xdb\x08\xb6\xd5\xc6\x2a\x37\x8c\xf7\x06\xe3\x78\xcd\x10\x90\x34\x4e\xd1\x38\xc9\x1d\xd0\x18\x4f\xbc\x53\xeb\x4d\xa7\x61\x14\xff\x25\xb9\xfd\xfd\xdd\xb0\xa7\xab\x2b\x9d\x46\x5c\x3a\xad\xa5\xb2\x5a\xba\xbb\x1b\x72\xf8\x2f\xd1\xcd\xf4\xa7\x5d\xfe\xae\x2e\x14\xed\xea\x82\x99\x4c\x06\xc5\x33\x19\xd1\x2d\x20\x09\xaa\x02\xca\x8a\x28\x2b\x40\x15\x89\x25\xd1\x6c\xd6\xcd\x33\x99\x28\xea\x65\x99\xac\xa0\x7b\xb2\x42\x96\xc9\x32\xf1\x28\x8b\x78\x3a\x00\x55\x3e\x9e\x88\x67\x13\x89\x04\x14\xb8\x08\xea\x4a\x77\x77\xa7\x61\x20\x72\x52\x8d\x46\xa3\x51\x45\xff\x91\x40\x02\xec\x89\x65\x62\xb1\x18\xe2\x6d\x20\x8b\x78\xd8\x1d\x8b\xc5\x3a\x63\xb1\x18\xe4\x13\x4c\x56\xd4\x11\x8b\x59\x06\xa5\x62\x00\x94\x98\xfe\xac\x00\x2a\xcc\xdc\x41\x60\x58\x5e\x99\x75\xab\xc4\x3a\xc4\xdb\x7b\x84\x45\x80\xc1\xf2\x8b\x60\x4d\xb0\x3c\xe3\xea\x52\x5d\x3d\x1a\xed\x4a\x69\x71\x77\xbc\xb7\xd3\xcd\xe0\x94\x0d\x01\x18\x56\x3d\x82\x28\x70\x52\xb8\x23\xc1\x6a\x92\xce\x05\x97\x80\xc2\x14\x10\x04\x49\x90\x04\x59\x16\x24\xa1\x8f\x47\x09\x77\x52\xf3\xb3\x2c\xad\xd0\xf1\x34\x14\x7a\x7a\x7a\x8c\x98\x80\xef\xd1\x2f\x72\xe1\x41\xa4\x00\x1b\xac\x5f\x14\xb0\x3a\xd5\x97\x51\xd5\x92\x68\x5f\x46\x7f\x70\xb7\x24\x51\x94\x65\x51\x94\x34\xde\xea\x52\x0c\x75\xba\x93\x03\x40\x40\x92\x94\x77\x7e\x79\xe0\xa8\xae\x57\xc9\x47\x6d\xdb\x1e\x35\xf6\x80\x74\x88\x8f\x6a\xbb\x31\xff\x0c\x64\x27\xce\xd3\xbd\xed\x33\xc7\xdc\xa7\xfb\x4f\xb8\x56\xe1\xce\x52\xa2\x7d\x2a\x87\x27\x39\x94\x80\x1b\xe7\xa6\xb3\xf3\xde\x6b\x9e\xbd\xe8\x10\x9a\x3a\xd0\x4e\xc0\x45\x0b\x0f\x4d\xb5\xee\x72\xe0\xd1\xdb\x3f\x52\x80\x47\xcd\xe1\xd9\x6b\xe5\x18\xbe\x6f\x60\xb6\x77\x0b\xb5\xce\x57\x25\x4f\x43\xf7\x01\x8f\x8f\xda\x7d\xc1\xe7\x7d\xc0\x65\xae\x21\x04\x30\x14\xd7\xbc\xa9\x36\xf6\x7d\xcb\x88\x5c\x16\x44\xe0\x46\xa5\xab\x53\x55\x35\xc5\xc5\x59\xe7\x5b\x30\xa9\xba\xa2\x1a\xde\x70\x77\x09\x9a\xa4\x52\x42\x6f\x16\x8a\x8a\xbe\x7c\x8e\x2b\x30\x8a\x32\x0a\x4a\x29\x28\xa9\x20\xc1\x9c\x1f\xe7\x7a\x3b\xa8\x27\x7c\xf5\xc7\x5f\x03\xb7\x31\x60\xda\x44\xdf\x9c\x43\xcb\xc0\xd7\x0c\x98\xae\x11\xeb\x19\x7d\xfe\x34\xee\x0d\xed\xcc\x3f\x2b\xd5\x17\x32\x34\x25\xed\x30\xcf\xf2\x8d\x5c\x79\x61\xc7\x8d\x5e\x60\xe4\xef\x33\x8d\x56\xb0\x16\xfb\x97\xfa\xe3\x21\xc6\xc5\x79\xc3\xfd\x52\xc2\x1d\x57\xfb\x68\xd5\xc5\x24\xfa\x7b\xa0\x1f\x86\x51\xd6\x9d\xd1\x7f\x6a\xbd\x90\x47\xb2\xf5\x50\x61\xa5\xe7\x54\x8a\xe3\x3c\xf1\x9e\x53\x1d\xee\x74\x3f\xe3\x4e\x67\xb3\x5a\x47\x56\x4b\x75\xe3\x3e\xa4\x07\x62\x5e\x86\x2a\xc5\x31\x25\x65\x66\x86\x41\x60\x24\xca\xc3\x56\x92\xf0\x76\x8d\xfb\xc2\x65\xc1\x92\x27\x94\x01\x80\x7a\x64\xc8\x68\x5e\x4a\x3c\x29\x52\x71\xb5\x2f\xa0\xaa\x25\x5d\x7d\x81\x1e\x57\xaf\x56\xaa\xc0\x0c\x8a\x7a\xbe\x4a\xa0\xce\xa4\x98\xe9\x57\x50\xd7\xa9\xde\x44\xc2\x53\xda\xd7\xe3\xe6\x55\xad\x53\x86\xb4\xe5\x17\x19\x75\xfe\x70\x95\xd7\xe6\x72\x9b\x56\x8c\x97\xc7\x77\x50\xfe\xaa\xfb\x0f\x38\x32\x80\x3a\xda\x4d\xf8\x52\x11\x5f\xa8\x55\x75\x7c\x67\xc5\x40\xd8\xdb\x48\x89\x74\x7d\x73\x79\x49\x5f\xdd\xd3\x4c\x84\x9e\xb3\x63\xce\x55\xa0\xee\x56\xc6\x3a\xe3\x35\xef\xcd\x1c\xfd\x07\xa6\xbf\x51\xe4\xb2\xc4\xec\x83\x60\xc7\x52\x98\xba\x6d\xe8\x77\xb1\xcb\x5b\xfa\xe3\xc1\x29\x71\x8c\x83\x02\x01\x76\xa8\x2e\x4e\x85\x1d\x28\x86\x78\x97\xac\xf1\xee\x78\x7f\x4a\xed\x4f\xbb\x19\x8d\x77\xc9\x48\x42\xb1\x92\xb4\xa6\xa0\x6e\xf3\x14\xa0\xc7\xd3\xa5\xe8\x7f\x50\xa7\x84\xfc\x92\x82\x32\x30\xaa\x48\xb0\x5b\x82\x11\x45\x51\x34\x29\x9d\x4e\x93\x6b\x7b\xc1\x17\x6a\xc7\xf5\x81\x8e\xfe\x84\xd8\x2b\xc6\xf1\x6a\xed\xf8\x34\xfc\xf0\x8f\xf3\x75\xb8\x65\x04\xde\x53\x7f\x86\x80\xe3\xd8\xc1\x76\x1c\x53\xd0\x2e\x11\x70\x36\x87\xe7\x38\xd9\xbe\x19\xc3\xd7\xe1\x15\x51\x45\xdf\xe7\xc4\x1e\xbc\xdd\x9f\x96\x00\xd1\xde\xe8\xcf\xd3\x79\xef\x35\xe3\xf0\x9a\x71\xe6\xea\xfd\x6c\x7e\x3f\x0d\x3c\x27\x66\x38\xf6\xf8\xad\xfe\x84\x5a\xf0\x5e\x46\x8b\xd7\xfe\x4c\xb5\x3e\xf3\x51\x9b\xbf\x28\x2d\xf6\x1d\xaa\xed\x7f\x09\x5c\x0c\xae\x47\x90\xc1\x6b\xfe\x75\xf8\xd3\x37\xec\x7e\x11\xdf\x69\xf1\x14\xd0\x09\xb7\xb6\xeb\x0a\xe5\xbd\xa3\xa5\xa4\xa0\xbd\x01\x77\x17\x8c\x0f\xc3\x0f\xfe\x8a\xa0\x87\x51\xdf\xf7\xcc\x02\x3e\x28\xb9\xf7\x1e\x8a\x11\x70\x1c\x83\xd2\xfe\x14\x1e\x83\x11\x61\xe1\x72\xbe\xfb\x10\x5d\x80\x4b\xcd\xe1\x6a\x9d\xe1\xe0\x91\xe8\x0b\xb5\xc0\x41\xde\x8d\xdf\xd1\x8c\x6b\xfa\xb7\xe4\x8d\xbb\xed\x67\x05\xdf\x49\xe6\xde\xd1\x8c\x1c\xfb\x38\xf6\xb8\x9b\xb5\x62\x74\xf5\x51\xed\x63\xe8\x1c\x1c\xc7\x63\x1e\xf8\x32\x0f\xff\x2c\xef\x0b\x36\xfe\xb9\xad\x5b\x06\x1e\x1f\xe8\xbb\xec\x43\xa6\xc8\x3b\x1a\x86\x0f\x32\x6e\xeb\xcc\xe3\xae\x81\x85\xde\x1d\x94\x40\xaf\x68\x9f\x08\x00\x5c\xc6\x44\x26\x2c\xf0\xcd\x69\x7f\xd2\x33\x8c\x01\x33\xcb\x1c\x3a\x86\xbf\xd7\x30\xb6\x38\xcf\x93\x47\x09\x1e\xaa\xba\x0d\x69\xd8\x82\xc7\xd8\x5f\x5c\xa6\x0f\x8c\x2d\xd0\xd5\x75\x98\xbe\x38\x5a\xff\xe0\x1c\xa7\x1c\x1a\xfa\xd1\x74\x51\x01\x1d\x31\xbd\xec\xda\x0b\x39\x3d\xc3\x7d\x6a\x0a\x17\xeb\xab\x8f\x6a\xdb\x0f\x68\x13\x3e\x9b\x18\xc3\x9c\xfd\xc2\x3c\xcf\xf4\x75\x44\xad\x69\x3c\x7f\xb7\xe3\x7c\x34\x52\x23\xd1\x5f\x56\xe7\x89\x31\x8e\x66\x52\x9f\x12\xb9\xf1\x35\x7f\xe5\x18\xb7\xe8\x0b\xed\x4b\x17\x91\x11\xd1\x1a\x83\x9d\x6b\x3e\x37\x06\x83\xde\x5f\x12\xef\xe5\xad\xf6\x34\xb5\x77\x7b\x01\x5d\x97\x63\xfc\xeb\x1c\x70\xc9\x17\xda\xf3\x03\x2c\x53\xeb\x1c\xeb\x69\x1b\xff\xde\xf1\x05\xfd\x31\xe4\x1c\xe7\x2a\x69\x3e\xe5\xe4\x43\xea\xae\x82\x77\xe4\xe8\x1d\x6a\xc3\x71\x69\x6d\x7f\x20\x6c\xb3\x8e\x0f\x67\x95\x6f\x7b\xcb\x21\x1f\x39\xdd\xb8\xab\x80\x47\xfa\xfb\xa9\x3d\x4d\x04\xfc\x39\xea\x59\x4b\xd6\x77\x9d\x03\x76\x83\xa1\x53\xce\x9a\xf1\x3e\x19\x6b\xb6\x0f\x15\xf4\xeb\x09\x4a\xa6\x57\x28\x1f\x21\x04\xe8\xe8\x46\x06\x18\x78\x7d\xd4\x89\xb7\x2e\x3a\xdd\xf6\x0b\x8d\xda\x60\x6f\x63\xdb\x21\xe2\x5e\xfe\xdc\xfe\xbe\x94\x93\xbb\x2d\x97\xe7\xd3\xba\x01\x9f\xc5\x34\xf0\x05\x63\xc2\xb4\x3b\x8c\x7b\xb3\xe7\xc9\x62\xb6\xab\xb5\xa7\x38\x1d\x24\x92\x9f\xef\x50\x02\x5d\xdf\xbe\xae\x04\xd4\xbd\xcf\x00\x7a\xce\xbe\xc4\xca\xcf\xea\xfe\x30\xf3\xcb\xbc\x39\x0f\xcb\x8d\xfa\x2b\x07\x3e\xd1\xea\x73\xf3\xbf\xf3\x79\x64\xc0\xf7\x5c\xec\xd0\x21\x5b\x9e\x76\x8f\xcc\xc7\x63\xe0\xdf\xd9\x00\xc8\xb9\x56\xb2\xf8\x29\x6d\x73\xc0\x63\xbe\x50\x3b\xae\x5d\xd4\xfe\x24\xe1\x9f\x9a\x36\xb0\x17\xf8\xa8\xad\x09\x3a\x4f\x1f\x1a\x7e\x8b\xe9\x8e\xb9\x2d\x29\x85\xb4\xf2\x51\x6d\xb7\x12\xfb\xd9\xa4\x3d\xed\x25\xe0\x6a\xae\xbd\xb2\x3e\x9f\x4f\xfa\x98\x7d\x54\xd3\x5f\x8b\xd9\x40\x1f\xb5\xe7\xf6\x02\xfc\xb8\x37\xcd\x38\x1e\x1e\x9c\x69\xb5\xb7\xd7\xdb\x33\xc1\x5c\x30\x1f\x5c\x63\xaf\xb1\x01\x34\xe2\xd0\xaa\x73\x79\x64\x8c\x98\x16\x32\x92\x76\x58\x65\x39\xed\xae\xf2\x9d\x03\x83\xa1\x2a\x48\xa4\x09\x73\xe7\xd2\x27\x55\x55\x92\x49\x94\x2c\x6c\xf8\x0a\x56\x79\x75\x99\x55\x9d\x1e\x97\x0c\x2e\xab\xae\xa9\x2c\xc3\xd5\xe9\xdd\x66\x96\x1a\xcf\x33\x55\x7e\xf8\xc3\xfe\x79\x47\x9e\x3e\xf2\x0c\x9c\xa5\xa9\x7e\xd7\x52\x4d\xf4\xbb\x3e\x0c\xdc\xb2\xa2\x96\xa9\x58\x58\xeb\x1f\x49\x6b\x65\x0f\xbd\xfc\xfc\x83\x4f\xc3\x3f\xd3\x01\xf4\xab\x23\x47\xe0\xc4\x23\xcf\xb4\xd7\x57\xf9\xef\xf1\x8f\xbc\xbe\x96\x7e\x8c\x0e\xcf\x08\x94\x3e\x44\x57\x6c\x7d\x68\x5c\xf4\xc1\xb9\xfd\xab\x59\xa9\x43\x62\x59\xa5\xa7\xa7\xa7\x47\x1e\x00\x10\xf4\xf6\xaa\x2c\x54\x3b\xe2\x1c\xd7\xcb\x51\xcb\xaf\xb9\xe6\xd9\x27\xaf\xbc\xf2\xca\x2b\x11\x77\xf3\x13\xf5\x68\xde\x07\xa7\xed\x3f\xed\xe6\x2f\x61\xf6\x1a\xe4\x42\x4f\x2d\x86\x5b\xe1\xcf\x5d\x6f\x30\x33\xb5\x25\x3b\xf4\x3f\xfd\x7f\xb9\xa6\xbe\xb6\xfe\x9a\xda\xcd\xcf\x8e\xde\xfc\xec\x8e\x9d\x63\x53\x9b\xcf\x1f\xfb\x41\xc3\x55\x29\xcf\x33\xaa\xaa\xaa\x12\xea\x52\x51\x58\x95\x50\x07\x8c\x49\x2a\xcc\xaa\x30\x90\x4c\x26\x35\x39\x9b\xcd\x92\xf6\xa0\xf9\xff\x0a\xec\x66\x4a\xf7\x61\x1b\x62\x37\x83\xba\xaf\x74\xfd\x68\x5f\x77\xba\x67\xf2\x5f\x67\xbc\x97\xc7\x63\xcc\x4b\xbb\x06\x79\xfe\x9c\xbc\x76\x10\x7b\xf4\x35\x01\x97\x73\x78\xa4\xad\x0e\x59\xb1\xf5\x66\xcf\xd2\x7c\xfc\x07\x4b\x0b\x6c\x11\xd6\xa7\x26\x3c\x2f\xb4\x3f\x45\xc0\x5f\xa2\x64\x13\xff\x5c\xe5\x7d\xb0\x16\x50\x53\xd7\x32\x37\x01\x0f\x8e\x43\x90\x28\x11\x0c\x01\xc3\xcc\xfc\x74\x00\x06\x71\xec\x63\x99\xee\x76\x07\x6b\x2f\x82\x94\x37\x58\x03\xad\xcc\x95\xe6\x3e\x4a\x55\x2d\xde\x44\xc1\xe1\x8c\x41\x6f\x10\x06\x60\x47\x24\x49\xfb\xdd\xa5\x3d\x27\x01\xec\x62\x90\xe8\x8a\x04\xc2\xae\xee\xbe\x98\x47\xd5\xb2\x2e\x49\x13\x5c\x59\x2d\xac\xf6\xf7\x44\x64\xc1\x1d\xd6\xc2\x6a\x09\xdb\xa7\xba\xa2\x08\x88\x2e\xd1\xd3\xad\x44\x23\x11\xd4\x25\x49\x4a\x3c\xa6\x20\x0e\xf1\xbc\xac\xca\x99\x8c\x98\x92\x79\x49\xd2\x7a\x54\x5b\xc7\x8d\x39\x09\xfb\xcd\x7b\xee\x24\xd6\xd6\x46\x9d\x8b\xbb\xf2\xe0\xe6\x1c\xb3\xa7\x3e\xcf\x4f\x34\xef\xe8\x24\xfb\xb1\x2f\x31\x40\xb4\x27\xfc\x9f\x3d\xf5\x76\xfb\xb8\x71\x66\xd1\x52\xf1\xfc\x9f\x7c\x54\xd2\x4f\x9c\x71\xe0\xb9\x79\x0f\xae\x7d\x6e\xcf\xcd\x76\x8c\x38\x8e\x91\xa5\xf6\xac\x24\xda\x1b\xfd\xb9\x13\xc3\xef\xc8\x5f\xa3\xeb\x73\x27\xf1\x5e\x7b\x4d\x8f\x67\xba\xd0\x1e\xce\xfa\xd4\x3e\x8f\xd1\xfd\x47\x7f\xc1\x77\x8c\x1a\x35\xcb\x1d\x70\xbb\x76\x4d\x0b\xbe\x47\x7c\x24\x43\xb4\x97\x6c\x1a\xcd\x69\x39\x6b\x12\x98\xfe\x0a\x93\xfb\xec\x25\x4a\xa2\xeb\x77\x07\x66\x83\xba\xe7\x74\xd9\xdf\xb3\xac\x04\xd4\xdd\xc1\x00\xe7\x9c\x66\x8e\x67\x05\xc8\xdb\x03\xd1\x67\x85\x62\xe3\xd9\x77\x63\x1e\xdc\xbc\x5f\xb7\xe7\xb6\x82\xf6\x2f\xd9\x7d\x9b\xbb\x35\x01\xd6\x82\xd3\xa7\x8a\x33\x3a\x49\x5c\x06\x6f\x6d\xdb\x6a\xf2\x9c\xae\xdf\x7e\xcf\x78\x30\xfd\x13\x46\xb7\xbb\x24\x3e\x5c\x07\x64\xcf\xf2\x82\xf7\x60\xbe\x60\x5d\x9a\xb3\xa7\x9e\x02\xd3\x86\x32\x39\xd9\xc2\x77\xb6\xf6\x2c\xcb\xe9\x1f\x80\x20\x6b\xd4\x1e\x35\x72\xfe\x93\x3b\x4f\xa7\x43\xcb\x16\x0f\xb3\x57\xa8\xfa\x7f\xdd\xae\x8c\xea\x4a\x6b\x8c\x4b\xd4\x44\x37\x28\x15\xc4\x98\xe4\x57\xe2\xe1\x70\xa9\x96\x54\xb5\xb0\x2b\xab\x25\x5d\x09\x2d\xea\x91\xbb\xbb\x95\x2e\xa5\x1b\x45\x06\x80\x5f\xf1\x4b\xd0\xaf\xc5\x5c\x1d\x4a\xb7\xd2\x65\xfb\xed\xbc\x2f\x74\x04\x47\x78\xed\x1d\x62\xcb\xe7\x5c\xef\xd3\xd4\x13\xbe\xd0\xbe\x9b\xf4\xfe\x1f\xba\xe2\x8a\x21\x75\x75\x33\x1e\xb2\x65\x1d\xe7\x02\x38\x8a\x6b\x01\x1f\x79\xc7\x21\x0f\x82\x2f\x74\xe4\x17\x0e\x79\xb0\xed\x19\xc6\x45\x6d\xfe\x03\xc8\x5b\xfb\x1a\x70\xc3\x0f\x00\x10\x88\x03\x8a\x57\xa4\xe2\xa0\x12\xef\xf2\x98\xf9\xfd\xc9\x27\xb7\x3b\x82\x93\x15\x75\x29\xb0\x54\x71\xd1\x5a\x0f\xec\x42\x01\x97\x5f\xeb\x76\x71\x27\x81\x8b\xd5\x7a\x5d\xa5\x28\x0c\xb3\x08\xb8\x00\x15\x3f\x99\xa5\xc2\xa8\x57\x46\x5d\x32\xca\xea\xff\xcb\x30\x8c\xff\x0f\xc8\x66\x5f\x14\xf3\x0e\x1f\x8e\x8f\x6b\xc6\x3e\x0e\x70\x9b\xf5\x0f\x74\x9e\x2c\x02\x09\xdc\x9f\xda\x32\xc7\x9e\x60\x39\xae\x86\x3f\xa9\xb6\x26\x98\xfb\x2f\x97\x97\xd7\x5d\x3d\x2c\x58\x1e\xf4\x0d\x9b\x34\xac\xc2\xe5\x1e\x5e\x3d\xc1\x28\x89\xef\xc6\xc7\x83\x2e\xb7\xd1\xd8\x48\xe9\xdd\xa5\x48\x32\x8c\xa3\x14\x8c\xa2\x0c\x4c\xa0\x64\x8f\x1f\xd1\x5a\x4f\x24\xdd\x81\x32\x30\x8a\xba\x60\x00\x75\xc2\x08\xca\x42\x55\x85\x0a\xe2\x5c\x61\x5a\xa5\x61\x27\x8a\xd2\x51\x36\xa6\xb0\x49\x26\x1a\xa7\x25\x3f\xcf\x4a\x5c\x8c\x4d\x08\xf1\x78\xa0\x2f\x06\xbb\x11\xeb\xe9\xe2\x18\x85\x49\xb8\x7b\xfb\xe3\xb4\x5b\x15\x05\x49\x14\x05\x39\x22\x0a\x61\xa5\x94\xee\x14\x44\x41\x16\x5c\xf1\x54\x4a\xea\x80\xdd\xc8\x2f\xa3\x6e\xd4\xd5\x01\xe9\x28\x52\x50\x6f\x57\xaf\xbf\x47\x85\xa5\xf1\x98\xc8\x72\x30\x0c\x33\x72\x07\x0c\x88\x2a\xa3\x8a\xc0\xac\x27\x62\xdc\xcb\xa8\xd2\x6d\xc8\x89\xd7\xf0\xec\xb2\xc5\xbe\xc7\x93\xa2\x24\x70\x26\xf0\x63\x6f\x63\x85\x71\xc6\x63\xe7\x5f\x1c\x5d\x91\xfb\x1d\x06\xdd\xd5\xd8\xfb\xf0\x55\x4c\xaa\xad\x70\xb9\x7d\xd5\x13\x26\xd5\x54\xe8\x8e\x87\x4d\x20\x93\x38\xdf\x8d\xea\x29\x29\x10\x66\xe3\x6c\x2c\xce\xc4\x13\xaa\x2b\x2e\x31\x1c\xab\xff\x93\x4d\xa4\xb4\xd2\x92\x34\xad\x94\xd2\x30\x8d\x62\xfe\x08\x17\x96\x23\x1d\x89\x98\x3f\x20\xd1\x6c\x5c\x11\x04\x95\xef\x14\xe3\x81\xbe\x08\x05\xa4\x04\xcf\x8a\x7d\xdd\xdf\x85\x15\x94\x14\x48\xc4\x62\x71\x2e\xc1\xb0\x0c\x27\xa7\x03\x52\x2c\xc1\x25\x62\x6c\x8c\x93\x06\x00\xec\xe8\xc9\x48\x48\x4c\x67\xbb\x03\x28\x83\x32\xa8\x47\x91\xfd\xa8\x27\x05\x03\xaa\xcc\x77\x74\xc0\x52\xd8\xeb\xa2\x59\x9e\x17\x39\xe4\x1f\x94\x31\xd8\x4e\x98\xb5\x81\x9a\xff\x85\x29\x8c\xfd\x58\x93\xc6\x0a\x25\x81\xd3\xc0\x39\x66\x0e\x64\xd3\x8b\xab\x09\x86\xaa\xdc\xc3\x2b\xac\xbc\xaf\x46\x08\x5a\xde\xad\xf9\x12\x10\x0d\xb8\x3a\x4f\xa6\x5c\x99\x40\x38\x9d\x08\xc3\x0e\x36\xdc\x11\x66\x5d\x74\x6f\xa7\x0b\x44\x98\x12\x49\xed\x0f\xab\xaa\x3b\xdb\x1f\xd6\x1f\x4a\x8a\x25\x14\x25\x1a\x45\x59\x41\x49\x72\xd1\x84\xa8\x28\x02\xa7\xf5\xf6\xc7\x59\xd6\x9d\x42\x6a\x46\xeb\xca\x90\xeb\xb4\xe6\xe7\x70\xee\x9c\x65\xe6\x79\x25\x6f\xd5\xf4\x69\xc6\xb5\x94\x9b\xad\xda\x3d\xbc\x55\xc7\xa6\x79\x63\x1e\x7c\x96\xf7\x19\x0c\x7f\x56\xc7\xb3\xff\x86\x71\x7d\x84\xfd\x90\xac\x3a\x7f\xcd\xcf\x81\x1c\x7e\xd5\x6a\x4f\x53\xcd\x1b\xf2\xd7\x8d\x7a\x4b\x9a\x6a\x96\x88\xf7\x26\x89\xf6\x96\xaf\x3d\x17\xdf\x57\x96\xe8\xfa\x2d\x1f\xff\x00\xd4\x6d\xd3\xe7\xa4\xe6\xe7\x3e\x05\x75\x0b\x98\xbc\xb9\xb4\x19\xfb\x3f\xd2\xe6\xfc\x39\xf9\x04\xf6\xef\x9a\xad\xfb\xc3\x22\x9e\xff\x64\x5f\xa8\x79\x9d\x03\xce\x59\x77\x75\xcd\x7e\xad\x35\xf7\x86\x15\x1c\x47\xca\x80\x33\x01\x8d\xb3\x12\x8e\x00\xa3\xec\xbd\xe1\x60\x59\x10\x47\x43\x11\x1b\xdd\xc4\x29\x67\x92\xea\xe8\xcf\x30\x2e\xf5\x54\x2f\xec\x08\xfb\xb5\x08\xe4\xdd\x5d\xfd\x01\xeb\x71\x75\xc3\x04\x0c\x08\xa8\x07\x75\xa0\xb8\x88\x7a\x91\xc2\xc3\x38\xc5\xc8\xa9\xbe\x74\x09\x93\x48\x20\x3a\x85\xfc\xf8\x7f\x85\xe5\x25\x29\x21\xb0\x0a\xab\xc4\x6c\x5f\x86\xf1\x85\x8e\xbe\x8c\xf7\x24\xad\xd8\x9e\x6e\x0b\x7e\x64\xc0\x01\x37\x6a\x0f\xf1\xbe\xd0\x89\x04\x86\x07\x1d\x3e\x11\xe3\x0b\x1d\x86\x8e\xf6\x09\x6b\x2d\x7e\xe2\x06\xbc\x37\x98\x70\xec\xa3\x30\xbe\x50\xcb\x1a\xbc\x57\xd9\xe9\xc0\x1f\xf3\x85\x9a\x42\x0e\x3c\xc6\x5c\x3e\xc3\x17\xda\x71\x29\xf8\xd0\x47\xb5\xdf\xf5\x8f\xbc\xf7\xa6\x96\x14\xb4\xc7\x39\x89\x1a\x70\xbd\xa0\x36\x2b\x9f\xb6\x71\xc7\x28\xea\x0b\x1d\xc0\xb9\x90\xda\xef\x72\xf8\x56\x82\x35\xae\x96\xd5\x8e\xfe\x70\x36\xfc\x51\x7b\x5c\x26\x9e\x76\xec\x33\xb6\x3c\x42\xc8\x29\x86\xb7\x3c\xec\xc0\x1f\xb7\x72\x83\x18\xed\x0f\xc4\x1c\xbe\x03\x67\xc3\xe7\x3a\xe4\x47\x87\xdf\xe9\xc0\xf3\x03\xc3\x6f\xa7\xeb\x77\x5d\xff\x1e\x98\x32\x8a\xc1\x63\x33\xd7\xaa\x92\xe5\xd3\xb7\x36\xe2\x3d\x94\xbb\x0a\xd6\xb6\xf8\x1d\x87\xad\xba\xd9\x8c\x75\xe7\xae\x05\xdf\x95\xb3\x69\xc4\x38\xdb\xef\x6f\x76\xd0\x88\xf1\x85\xb6\x7d\xa6\xe3\x2f\xa4\x75\x1b\xe6\x65\xcb\xad\x36\xad\x19\x12\xcf\xb1\x98\x83\x07\xa2\x3d\xe6\x2f\x08\x38\xce\x49\xd3\xba\xda\xd1\x9f\x84\xe5\x3b\x18\xf8\x1b\x2e\x25\xde\x8b\xfd\xf9\x13\x7f\xeb\x02\x3e\xaa\x75\x79\x20\xb7\x17\x86\x6d\x69\xab\x21\x73\x7f\xcb\x5f\xf3\x6c\x7b\xcf\x41\x53\x83\x67\xbc\x2f\xb4\x35\xe2\xa0\x9b\x6c\xf1\x72\x7b\x8f\x03\xae\x3a\x79\x7f\xc0\xaa\xd9\xf5\x30\x7e\xef\x6d\x74\xfd\xa6\x1d\xeb\xff\x1e\x6d\x9d\x7d\x8b\x2f\xd4\xb2\x4a\xf7\x3c\xb7\xf7\x80\x6e\x00\xa6\x6e\x64\xc8\x71\x8a\xd6\x78\x0e\x90\x39\xe0\x8d\xdc\x08\x58\xd6\x5a\x63\x0e\x1b\x17\xf5\x85\xf6\x1f\x71\xd0\xc5\xae\xe9\x6b\xe0\x69\x1a\x9d\xaf\x73\xc7\x58\x07\x9f\x12\x56\xec\xe7\x09\x9c\xb7\xa6\x75\xb7\x83\x7f\x82\x2f\x74\xbc\xc1\x81\x9f\xb5\xc6\xb9\x7f\x48\x8e\x5e\xe0\x74\x70\xf9\xc0\x6c\xaf\x42\xb1\xc0\x8d\x63\xa9\xaa\xed\xe8\xf2\xab\xc1\xf5\x86\x2d\x1b\x56\x4d\xbb\xbc\x55\x93\x7c\x46\x1e\xd3\x9a\x6a\xfb\xa6\xb9\x3e\xc1\x3b\x6e\x9a\xe7\x62\xa7\x0c\xfb\x57\xeb\xc8\xeb\x4f\x26\x6b\x7e\xda\x2d\xf6\x8b\x6f\x6c\x7a\xe4\xe8\xca\x4d\xf7\xc1\x8d\x8a\xa2\xbd\x0f\x6f\xdd\x5c\x41\xaf\x5e\xf0\xc0\xf2\xe7\xee\x3f\x74\xdd\xf1\xe7\x6e\x79\xae\x6a\xe4\xc8\xaa\xaa\xe9\xe3\x9e\x6b\x59\xfe\xe6\x5d\x27\xdd\x1b\xdd\xd7\xa2\xa6\x0b\xe0\x7c\x6d\x18\x2c\x19\x81\x0e\xbc\x01\x7f\x85\x26\xda\x8f\xf2\xf4\x3a\xee\xc1\x96\x0f\x6f\xb8\xe7\xf3\xcb\xd2\xf0\xbf\x14\xb8\x17\x5d\x8b\xb6\x6f\xba\x6f\x25\x8c\x42\xbe\x5f\xa5\x98\x97\x7f\x3c\x6a\xf4\xad\xcb\xaf\xdf\x70\xfd\xfe\xfa\x4d\xf7\x7f\x82\x0e\xd6\xc7\x87\x3e\x39\xe4\x82\x6a\x78\xed\x27\x8f\xde\xa2\xfe\x12\x9e\xb3\x29\xd9\xf7\xe3\x92\x59\x49\x34\x32\x89\x2a\x52\x68\x68\x0a\xed\x62\xc5\x7b\x9f\x10\x12\xbc\xb8\x74\x13\x03\xec\xba\x64\xba\x6e\xe1\x33\x2d\xe9\x25\x5b\xc6\xa3\xe6\x99\xce\xb2\x3c\x19\x37\x65\xf0\x88\xe4\x90\x35\xdd\xcf\x96\xf0\xda\x11\xc7\xee\x34\xdc\x4d\xb4\xc7\xbe\x7c\xc3\xef\x69\xe0\xa3\x74\x0d\x20\xf0\xb0\xbe\xd0\xd1\x12\xbc\x5f\x85\x25\x54\x7a\xd1\x96\x3b\x59\xe7\xe7\xbe\xb7\x1d\x7a\x61\xd7\x7f\xdd\x75\x7b\x9e\xad\x34\xf7\xd0\x5a\xee\xc6\xfb\xa5\x58\xca\xa4\x4d\xf8\x33\x21\x4f\xe7\xef\x71\xc8\x24\xe7\x0b\x6d\x19\xef\x18\xdf\x52\x7c\xb7\x88\xa7\x57\x28\x37\x6a\xef\x00\x30\x65\x91\x6e\xb9\x5a\x14\xe7\x1e\xdb\xf1\xed\x8e\xef\xd8\xfd\x6a\xd9\x54\x44\xee\xf5\x77\x54\x17\xd8\x09\x95\x7a\xd4\x57\x25\xc5\x00\x70\xcf\xf2\x51\x07\x25\x1c\xa7\x6c\xdc\x39\xbc\xd9\x8e\xfc\xbb\x00\xdf\xad\x1f\x07\x6a\xc0\x1c\x23\x77\xfe\xb7\x4b\x1f\xac\xa0\x3c\x55\xa3\x46\x42\xfd\xa7\x07\xff\x0e\x8d\x1d\x2f\xec\x9b\xd6\x96\x55\x97\xd5\xc2\x6a\xa3\x20\x19\xbe\x88\xa4\xfb\xb8\x5e\xaa\xf2\xc2\x50\x4d\x09\x70\x4b\x48\x08\x40\x56\x03\x10\x04\x90\xda\x69\x95\x02\xc3\x4f\x47\x92\xe3\x45\xb5\x9b\x95\x3a\x63\x07\xd0\x63\x77\xfe\x09\x5d\x78\x2b\x3c\xf9\x3f\x4b\x3f\x42\x67\xdf\x04\xfb\xa0\xbf\xfe\xbf\xb5\x64\xbd\xeb\x4e\xd4\xf0\xfc\x9a\x35\xf7\x97\xa2\x01\x34\x70\xc6\x65\x4f\x30\x70\xd8\xba\xbd\xd7\x5d\xfa\xd2\xe6\xd3\xe6\x54\x07\x4b\x9e\x3f\xed\xfc\x0b\x5a\xae\xdc\x40\x45\xe5\xa4\x3e\xd5\x27\x51\x20\xa9\x4f\xf3\x74\x0a\xa9\x02\xc7\xaf\x5e\x9d\xe0\x45\x56\x66\xa8\xd9\x37\x28\x4f\x3f\x28\xdf\x7f\xdf\x63\x2f\x3c\xb0\x61\xc9\xca\x4d\x2d\x42\x0b\xfa\xfc\xef\x1b\xd0\xbf\x47\x8a\x57\x5e\xb5\xd7\xe7\x8a\x68\x7f\x3e\xcf\xf5\x3f\xe8\xd8\xe2\xba\x4d\xf3\xe7\xbf\x5d\x3d\xea\x8a\x5f\xd7\xa2\x9e\xda\xa9\x57\xaf\x72\xc8\x66\xd3\x58\x87\x6c\x26\xac\x1a\x7b\x86\x3d\xd9\x7b\x5b\xbe\x3d\xd9\xf6\xb6\x43\x9e\x04\x4b\xf6\x0d\x99\x51\xde\x25\xec\x2f\x96\x4b\x03\x4f\xcb\x7d\xc4\x3c\x84\xed\x78\x0b\xef\x90\xd7\xb8\x95\x97\x27\xd5\xe4\xe0\xff\x42\xdc\x7e\x8d\xaf\x6a\xef\xab\xfd\xaf\x03\x8f\x0f\x7f\xc3\xde\x67\xb0\x75\xa2\xe5\x5e\xeb\x5b\xe4\x9d\xe3\xa3\x17\xe6\xcd\x09\x0c\x69\xa3\xf7\x1e\x23\x64\x92\xe8\x6b\x73\xc4\xb1\x1e\x8e\xfb\x42\xcd\x31\xc7\x7a\x38\x61\xe7\xc1\xc1\xed\x8f\x1e\xcc\xb7\xe9\x06\xfe\xa3\x64\x6d\x49\x6c\x37\x9a\xef\xc3\xb4\x50\x09\x9a\xe2\xf7\x1a\xf6\xa4\xe5\x22\x47\x7f\x04\x73\xa6\xa1\x5a\x26\x10\x7e\xa9\x8c\x73\x14\x19\x34\x7d\x23\x7f\x9f\xd0\xec\xcf\x6e\x62\x6e\x27\xe1\x07\x1c\xb4\xb6\xfb\x29\xc9\x36\x9e\x45\xde\xdf\x52\x8f\xf9\xaa\x1a\xff\x57\x63\x07\xfe\x43\xcf\x3d\xf1\x37\xb0\x19\x9c\x5e\x77\x35\x43\xf2\x54\xf0\x85\x9a\x86\x3b\xc6\x91\xb0\xe9\xf7\x77\x07\x4f\x19\xeb\xbe\xe6\xd1\x23\x05\x73\x36\xd1\xaf\xa6\x72\x1b\x8f\x43\x96\x8e\x1e\x06\x79\x73\xff\xee\x2b\x1c\x78\x58\x8b\x1e\x06\xfd\xf6\xbf\xe7\xe8\x0f\x6f\xdb\xe9\x17\x1c\x78\x38\x7b\xae\x5c\xea\xd8\x2b\x64\x2c\x78\x9b\x75\x36\x1e\x19\x08\x1b\xf1\x39\x6d\x77\x75\x62\x1d\xa1\xbb\x8a\xf1\xbf\xe9\x6c\x82\x6f\xf8\x2c\xbd\x0d\x9f\x43\xb4\x89\x8e\xf1\xf2\x36\xfe\xc7\x1d\x7c\x8e\xf9\x42\x6d\x8f\x39\xc6\x15\xb1\x74\x73\xfb\xd5\x0e\xdd\x8c\x5a\x72\x74\x68\x6a\xae\x3d\x38\x0b\xdf\x7d\x52\xa9\xbb\xc1\x50\xfb\xf6\xeb\x98\x62\x33\x78\x59\x65\x59\x70\x08\xf4\x56\x4d\x87\xb5\x41\x7b\x75\x52\xfd\x0d\xf6\xf1\x3b\xb4\x49\x78\x19\x14\x55\xb4\x4e\x3a\xd3\xcb\x64\x54\x5a\xeb\x9e\xeb\x1e\x83\x7e\x12\x80\x93\xb5\x4b\xff\x1d\x40\x3f\x79\x03\x1e\x47\xf3\xed\xe7\x91\xb6\xf5\xec\xa6\xdd\x9f\xf0\x4f\xb4\xb1\xbb\xdd\xb4\x3b\x8c\xd2\x01\x18\xd5\x22\x3d\x01\x94\x4e\x1b\x29\x65\xcc\x47\x48\x49\xac\xac\x76\xf1\x62\x8a\x55\x21\x78\x16\xfd\x11\x8e\x5e\xfb\xd2\xd0\x47\xe9\xf9\xf3\x3d\xff\x79\xe2\xbe\xfe\x5f\xba\x6b\xee\x43\x8d\x4f\xa0\xc6\x87\xf5\x9f\x68\xde\x4d\xf7\xdd\xb1\x78\xf1\xe2\x3b\x66\x3f\x31\xb6\xa4\x61\xed\xaa\xfe\x37\xdd\xd3\x57\xa1\xad\x6b\xd1\x96\x47\xf5\x9f\xa7\xe6\x2f\x59\xb5\xf2\xda\x6b\xaf\xbd\x73\xf6\xda\xb1\xb6\x4c\xda\xf6\xad\xe1\x0c\x07\x6d\x6d\x9d\x3b\xf8\x03\x07\xef\xec\xf6\x2d\xf7\x03\x72\x9f\x53\x5f\x63\xa5\x1c\xf6\x70\xf5\xc0\x04\x6f\x23\x55\x4f\xaf\xd8\xfe\x39\x7a\x7b\xe0\xd4\xb8\xcf\x66\xbc\x4f\xcf\x39\xf1\xb7\xcb\x3d\xd3\xcb\xf1\x1e\xe5\x4a\x3c\xf7\x8b\xbe\xaa\x46\x4d\x73\x83\xdc\x7c\x69\xeb\x50\xcb\x03\x0e\x59\x90\xf0\x3e\xbc\xe0\x0b\x35\xe0\xf9\x52\x7a\x9e\x98\xc7\x71\xbf\x5a\xf0\x39\x60\xcb\x83\x8e\xfe\x72\xbe\xd0\xa1\x71\xba\x5d\xdc\x3b\x09\xff\x9c\x5d\xa0\x7f\xf8\xae\x5c\x1b\x3e\x71\x6c\x11\xf2\xf5\xcc\xb4\x17\x6d\xe6\x1e\x9a\x68\xc4\xf9\x80\xa1\xe0\x5c\x10\xc0\xf9\x86\xcc\xb8\x27\xe3\xee\xee\xb0\x6a\xda\x4b\x7b\xaa\x46\x81\xb2\x49\xc6\xf5\x20\x77\x52\xf3\x53\x92\x46\xc7\x5c\x92\xda\xef\x57\x61\x4f\x4c\xa5\xfb\x53\x1c\x4c\x43\xb6\x14\x86\x21\x0f\x23\x1c\x4a\x23\xc5\xa3\x2a\x4a\xa6\x3f\xe0\x66\xfa\xd3\xee\x2e\xd4\x89\x54\x5a\xcb\x76\x8a\x1c\x8c\x41\x50\x8a\x14\x29\x2d\x75\xca\x79\x76\xd5\x5c\xcf\x36\xd9\xeb\x59\x13\x6e\xac\x67\x8f\x20\xc7\xf8\xa2\xbe\xd0\x71\x7c\x4f\xea\xe8\xf1\x7c\xfb\x7c\x04\x9f\x8e\x1e\x86\x84\xbd\x30\x6a\x08\xe3\xe8\x8d\x03\x57\x10\xeb\x3b\x7c\xae\x68\xb4\x6f\x0a\xe5\xe3\x31\xd7\xa7\x4d\x44\x7b\xfc\xde\xa3\xc7\x0b\xd6\x83\x46\x7b\x8c\xbf\xe1\x4d\x07\x1e\xce\x17\x4a\xed\xc0\xf3\xd4\x9d\xf9\xbe\x50\x0b\x8e\xab\x4b\xed\x70\xe0\xb1\xdb\xdb\xeb\xca\x98\x8d\xdf\x80\xcf\x74\x8c\x4b\x97\xa9\x47\x1c\x78\x78\x8b\x3e\x47\x8f\x39\xe8\x13\xb5\x6b\x29\x63\x3c\x8d\x0b\x09\x3b\x8e\xf7\x85\xf7\xef\x75\xb4\xb7\xd7\x9a\x46\xfb\x16\xb6\x60\xbc\x18\x7e\x74\x87\x63\xbc\xf6\x5a\x2d\x6f\x5c\xf6\x5a\x25\xb5\xc3\x41\x07\xdd\x1f\xc6\x35\xcc\x0f\x2c\x04\x79\x6b\x2d\x03\x7f\xd3\x30\xc7\x78\x6d\x9f\xe0\x88\x86\xb1\x35\x12\xef\x30\x3f\xf3\x85\x8e\x62\xdd\x4b\xed\x28\x86\xcf\x5e\xbb\xa9\x79\x74\x65\x1c\xe3\xb0\xdb\x1f\xc7\xe7\xe6\xc0\x0b\x6e\x19\xb8\xc4\xab\x50\xb7\xda\x6b\xa8\xcb\x71\xad\x9b\xff\xaf\xd5\x93\xc7\x52\x2e\x7c\x59\x29\x48\x79\xdd\xd5\xf4\xe9\xd8\x76\xfb\x8c\x0c\x12\xab\xf5\xa5\xd3\x5f\x5e\x78\xf8\xf0\x1d\xf2\xbd\x70\xb3\xa2\x68\x69\xb8\xb4\xc1\x4f\xaf\x59\xf8\x40\xfd\xc6\x07\x0f\x5d\x77\xe2\xf9\x5b\x36\x56\x05\x46\x56\x55\xcd\x18\xb7\x71\x6f\xfd\xcf\xee\xee\xa3\x36\x2a\x28\xa6\x42\xe0\x47\x49\x37\x87\xe4\x52\x9a\x57\xe2\x5d\x19\xae\x23\x13\xcb\xaa\xaa\x20\x77\xc0\x83\x0a\xcc\xa0\x85\x68\xf3\x4b\xf7\xdf\x09\xeb\x60\xbc\x3f\x4d\x2d\xe8\x78\x7d\xf4\x68\x76\x45\xe2\xb9\x1b\x5a\x57\xbc\xf4\xe0\xa7\x68\xdf\x8a\xab\x87\x3e\x35\xe4\x82\x89\xf0\x86\x4f\xd7\xb0\x7b\xde\x3d\xb7\xaf\xc7\x2d\xf6\x0b\x25\x7e\x55\x96\xe3\x71\x94\x41\x00\x75\x0e\x80\x84\x14\xcf\x42\x7a\x00\x48\x1d\x62\x47\x8a\x94\x65\x43\xf6\xb7\x54\x3b\x78\x28\xfb\x42\x47\x77\x59\x5c\x72\xf2\x50\xa7\xad\xce\xad\xf7\x80\xcf\x5a\xeb\xd8\xf2\x63\xd0\x3d\xb5\xb3\xc0\x77\xc4\xef\x48\x35\xe5\xfb\x6f\x47\xf0\xda\x28\xb5\x9d\xf0\xa3\xb0\x5e\xb7\xe0\x3a\xd8\xa9\xc6\x7c\xbd\x3e\xda\xee\xe8\x93\x7d\xce\x61\xe0\x3f\xaa\x3a\xe6\x00\xdd\xcf\x3c\x80\xdb\x6f\xcb\xb7\x27\xba\x67\xe8\x80\x47\x4d\xfc\x87\x1c\x70\xde\x1e\x17\xce\xcf\x91\x52\xf2\xfd\x21\xf3\xbd\x87\x09\x7d\x54\x72\x7e\x95\x8d\x27\x66\x8d\xcb\xf0\x27\x6c\xf8\x84\x81\x59\xde\x57\xa8\x55\xbe\x50\xcb\xcd\x6f\xf6\xf9\x42\x2d\xb7\xbc\xd7\xa7\x8f\x7a\x64\x39\xb9\xd7\x6a\xbc\xfb\xe8\xd1\x62\xf3\x1b\x41\x0b\x1e\xcf\x47\x92\x2f\x74\x14\x67\x17\xd6\x67\x25\x82\x07\xf6\x18\xcc\xb9\xa3\x04\xfb\x26\x19\x2a\x06\x86\xe3\xca\x87\x75\x00\x40\xda\x57\x3d\x61\x18\x3e\x25\xa8\x72\x95\x05\xcb\x68\x77\xd5\xb9\xf0\x1c\xe8\x31\xb2\xbe\x06\xcb\x6b\x89\x34\x1c\xa3\xf1\xb5\x2d\xca\x5b\x15\x70\x57\x97\x55\x06\xcb\xaa\xcb\x28\x39\x12\x0d\x97\xaa\x7e\x36\x21\x44\xd8\xbe\x74\x46\xe6\xe3\x25\x91\x78\xaa\x13\x0a\x48\xca\x86\x23\x92\xcc\x2a\xfe\x00\xe2\x51\x38\x00\x33\x48\x82\x42\x32\x13\x81\xa9\xee\x6c\x16\xf2\xdd\x54\xac\xbf\xab\xbf\x0b\x06\xc2\xa8\x5b\x49\x43\xae\x84\xd1\x38\xad\x13\xb1\x09\x08\xa0\x04\x03\xae\xde\x1e\x39\x12\xc8\x68\xa9\xde\x40\x34\xca\x24\xd3\x31\x86\x89\x47\xd4\x08\x2c\x75\xc5\x3b\xfc\xa5\x8a\x46\xc3\x08\xea\x84\x11\x82\xce\x09\x5f\xe8\x18\xf6\x83\x77\x2b\xb6\x9c\x44\xbd\x9d\x3a\xfc\x30\xbe\x49\x73\x18\xdf\x97\x02\x1e\xb3\xfd\x4a\x70\x3e\x98\x68\xde\x82\xc6\x19\x85\x00\x76\xaa\x2a\x6b\xac\x40\x8b\x6a\x5d\xcf\xf5\xa1\xc3\x32\x1a\x54\x1b\x59\x2f\x2a\x03\xe0\x1c\x88\x89\xe4\x3b\x07\x0e\xab\xae\x31\xf2\x06\xe1\x88\x8c\x49\x76\x59\x2c\x4f\xd5\xa4\xda\xb2\xca\xda\xea\xb2\xca\xea\xb2\xea\x32\x4f\x4f\xe2\x57\xb7\x43\xff\x05\xe8\x6b\x78\xc6\xc7\x1f\xcb\x9f\x7f\xde\x87\x34\x78\x66\xf6\x29\xfe\x7e\x4d\x80\x4a\x6f\x38\xe2\x97\xc3\x3c\x8b\xba\x50\xa9\x96\xe2\x24\x2e\xdd\xa1\x46\x7a\x3b\xa3\xe9\x8e\x0e\x86\x89\x08\xf1\x80\x58\x4a\x77\x0d\x80\x80\xc8\x77\xf0\xb1\x58\x47\xcc\xc5\xfd\x2e\x73\x3b\x1c\x02\xa3\x6b\xe0\x90\x35\x5f\x7c\xb1\x06\xfd\x7b\xcd\xf4\x69\x27\x4e\xdc\x7e\xa2\x64\x49\x3f\x8f\x38\x94\x8e\xb0\x51\x91\x83\x22\xec\x76\x83\x7e\x15\x05\x50\x57\x14\x96\xc2\x1e\x77\x5a\xcb\xa8\x01\x21\x10\x13\x22\x1d\x5a\xa2\xbb\x94\xe6\x03\xa9\x54\x38\x16\x65\x22\x32\xed\x87\x40\x84\x49\x94\x80\x49\x52\x66\x0d\x5a\x4a\x1b\x1d\xb2\xcc\xdb\xf0\xe7\x1c\x3e\xb6\xe8\x0b\xb5\xe2\x5d\x90\xd6\xbb\x09\xdd\xc5\x39\x4b\x5b\xf1\x19\xc3\xee\x4d\x0e\x3c\x0f\xfb\x42\x07\x03\x00\xf8\xe6\xb4\xc3\xd3\xa7\x32\xa0\xee\x55\x62\x9d\x28\xfa\x42\xc7\xca\xf1\x5e\xe6\x70\xc7\x77\x58\xe3\x3b\x34\x25\x3d\x9b\xaf\x5f\xad\x7c\xae\x3d\xa0\x30\xbc\x9d\xba\x0d\x9c\x06\x2e\x01\xb3\x70\xc6\xa8\x1f\xe0\xdc\x02\xd8\x70\x57\x4d\xaa\x30\x6f\x9a\xe2\x32\x8d\x65\xc3\xa7\x42\x6f\x65\x60\x14\x3e\x40\x1b\x86\x67\x80\xb2\x4a\xf7\xff\x63\xee\x5f\xe0\xa3\x28\xaf\xc6\x71\xfc\x79\x76\xb3\xb3\x5b\x54\x98\x6c\x08\x59\x40\x65\x42\x48\x32\x28\x97\xd1\x90\x64\xb8\x66\xe4\x96\x11\xbc\x0c\xa0\x32\x82\xca\xa0\x25\x8c\x22\xb0\x5e\xb0\x43\x15\x5d\x2d\xe8\x78\x1f\x2a\xe0\x62\x00\x97\x70\xc9\x02\x02\x9b\x04\xda\x6d\xd5\x9a\xd6\x56\xd3\x7a\xdb\x6a\xab\xa9\xb6\xaf\x69\xed\xdb\xc6\x5a\xdb\x68\x5b\x1b\xc9\xee\xb3\xff\xcf\x3c\x73\xd9\x99\xdd\xb5\xef\xff\x6d\xbf\xbf\xdf\xef\x6b\xdf\x24\xbc\x67\x9f\x7d\x2e\xe7\x9c\xe7\x9c\xf3\x9c\xe7\x3c\xe7\xfc\x47\x04\x2f\xf9\xc5\xd6\x0b\x3c\xd7\x67\xbe\x3e\x67\xa5\xdc\x5e\xe5\xe9\x58\x79\xd9\x4a\xf6\xa2\x17\x20\x87\xba\x37\xee\xde\x7d\xc1\x46\x34\x88\x06\x96\xb1\x2b\xae\x3a\x31\x7c\xcb\xf0\xb1\x97\xc9\xef\x25\xfe\xf7\x3c\x40\xdc\x34\xe5\xae\xc7\x76\xb4\x5c\xf3\xc1\x6b\xdb\x0e\x5e\xb1\xa6\xf1\x1a\xf4\xe1\x36\xf4\xd7\xd0\x8e\xf5\x1b\xb6\xad\xdf\xf2\x1a\x7c\x90\x3c\xb6\x6d\x7d\xa3\x47\xf3\xd4\xfc\xe7\x0c\xe1\xc4\xf3\x4a\x13\xff\xcd\x8f\xcc\x00\xff\x00\x8d\x6c\xed\xec\x83\xe6\x67\x38\xd7\xf2\xe1\x71\x0e\x1a\x04\x4c\x5a\x5e\x09\x82\x20\x84\xeb\xac\x5e\x0a\x5a\xc0\x2d\x60\x03\xae\xa2\xa3\x6b\xda\x11\x30\x57\x80\xb7\x16\x1f\x5d\xca\xbe\xea\x83\xda\x7f\x45\x8d\x09\x16\x35\x6c\x39\x45\xf8\x6a\x9d\xbb\xef\x9d\x27\xef\x5d\xb5\xea\xc9\x9f\x04\xbe\xf3\xe0\xaa\x5d\xfb\xd6\xee\xbb\x06\xce\xfb\xf4\xa1\xd0\xda\x7b\x57\x7d\xae\x7e\x73\xe5\x4a\xf5\x07\x81\x93\xf7\xaf\xdc\x1e\xbd\x31\x7a\x15\x64\x7f\x7f\x7f\xc5\x4d\x9b\x57\xde\x05\xc3\x29\x9a\x0d\xc5\x18\x45\xce\x02\xc4\x64\x22\x61\x2d\x9c\xea\x8e\x33\x30\xd0\xc7\xa6\x7a\x7a\xb4\x10\xa5\x8a\x94\x1a\x20\x07\x50\x5f\x68\xb0\x3b\x2c\x08\x3d\xa2\xf7\xc9\x97\xeb\x2e\xfb\x46\xcb\xfc\xd2\xeb\x6f\x50\x5b\xae\xfe\xc6\x65\xf7\x6d\xff\xcd\xf5\xe3\x3b\x23\x57\x6f\xf4\xbe\xfa\xe2\x45\x8b\x6e\xbf\xe9\x92\xd2\x15\x2b\xbe\x75\xd3\x92\xdb\x17\xdd\xfd\xe8\x2f\x57\x54\x3e\xf7\xcd\x25\xeb\xfe\x99\x96\x91\x84\x52\xac\xcc\x6a\x61\x93\x34\x51\x44\xa1\x7e\x0e\x02\x38\xa8\x93\x26\x4a\x45\x28\x4e\x61\x12\x19\xa1\x3f\xc4\xb2\x3a\x69\x38\x8e\x63\xa2\x14\x04\x2a\x8c\x21\x09\xc6\x72\x7b\x8f\x0b\xd6\x1c\xc0\x35\xc6\x8f\x51\xae\x7d\xb1\xc4\xa2\xd7\xc1\x0a\xf0\x7b\x30\x71\x7a\x7c\xd6\x4e\xe7\x9e\x31\xf7\xd2\x23\xf9\xfb\x75\x3f\x8e\xd1\xdd\xff\x74\xbe\x7f\xd0\xdc\xf7\x0f\xe7\xb7\x6f\xc3\x77\x6f\x9d\x23\x5d\xed\xb9\x60\x4d\xdb\x6f\x5c\x73\x62\x71\x7b\x5d\xae\x0c\x2f\x68\x6f\xdc\xa7\x6c\xc0\xfd\xab\x0e\x1b\x14\xb7\xdf\xbf\xb3\x48\xff\xb9\xf9\x3f\xe4\x80\xe3\xbc\xf3\x26\xfc\x41\x87\xee\x37\xc6\x2d\xcb\xf5\x03\x48\x6b\x9e\x76\xfd\xdb\xfc\xba\x70\xcd\x58\x6a\xac\x37\xea\xe0\x36\xd6\xd5\x57\x55\x9b\x7f\x71\x86\x50\xbb\x76\x58\xa9\x5d\x17\xd8\x67\xd7\x05\xfe\x8f\x64\xc7\xe5\x30\x8c\xb4\x48\x38\x0c\x69\x5d\x85\x46\x14\x05\xfd\xf8\xc1\x07\x5f\x7a\xf0\x41\xd4\xec\x6d\x4a\xff\x70\x94\x37\x94\xee\xd7\x92\x49\xc8\x25\x51\x00\xff\xc9\x5c\xf8\xbf\x97\x1f\xbe\x91\x88\x57\x52\x32\x12\x94\x1e\x78\x5d\xfa\x1a\xef\x4b\xe9\xcb\xbc\x3d\x5a\xa6\x06\x51\x50\x67\xb3\x7e\x96\x65\x4b\x3a\xfe\x4f\x08\x0f\xd3\x66\xc2\xf9\xb4\x75\xcc\x93\x84\xba\xcd\x45\xf7\xb0\x4d\xaf\xad\x2e\x3a\x5e\x45\xb6\xa8\xf7\xdd\x52\x35\x2b\x3b\xbb\x37\xe8\xe6\x6b\x23\x06\xc8\xf8\x8e\x71\xdf\x3b\x0c\xcc\x33\x78\x11\xdf\xf5\x4e\x32\x23\x32\xd7\x98\xef\x1d\x01\xac\x1b\xe9\x77\xca\x15\x1d\xdf\x0d\xde\x0a\x6f\xad\x29\x6f\xfc\xb9\x60\x8a\x39\xd0\x6a\xec\x27\xca\x73\x40\x23\xd7\xa7\xf1\x1b\x7a\x4a\x75\x7b\xa9\xbe\x82\xa8\x1a\xef\x29\x25\xcb\x2c\xea\x62\x73\xa9\xae\xb4\xaa\x34\x27\x86\xfc\xba\x18\x2a\xc5\x54\xf7\x9a\xd4\x85\x9f\x3e\xe8\x57\x56\x5e\x7d\xdf\x77\x87\xff\xe4\xc8\x4d\x3b\x5a\x57\xa2\x3f\x34\xff\x62\xe5\x15\xff\x7c\xfc\xea\x07\xb7\xca\x33\x6a\xae\xba\xfc\x4e\xff\x39\x2b\x2f\xbf\xfc\x92\x4b\x66\xac\x5d\x79\xf7\x6a\x78\x6c\x2d\xc1\x4d\x5e\xb9\xf2\x7e\xe2\xce\x95\x57\x5c\x71\xd5\xe4\x15\x57\xad\x6e\xce\xbc\xba\xb6\xac\x79\xe5\x25\x30\xb9\xb6\xec\x8a\x15\xcd\x25\x5f\x06\x48\x32\x24\x53\x12\x2f\x91\x99\x9e\xb0\xaa\x78\x38\x56\x90\xe2\x71\x9e\x0c\xc9\x1c\x15\x0e\x90\x89\xde\x50\x2a\x1e\x8f\xd0\xbd\x32\xcb\xc6\x39\x42\xd1\xc2\x42\x58\xd1\x24\x5e\x4d\x44\x12\x91\x7e\x4d\x95\x93\xf8\x04\x12\xa3\xd0\x98\x18\xcb\x08\x32\xcf\x31\xbc\x14\x91\x05\x45\x94\xc5\x41\xc8\x84\x25\x96\x93\x24\x21\x14\x92\xc2\x8a\x22\x46\x24\x51\x1e\xe8\xa1\x54\x85\x0b\xd3\x54\x54\xe5\x22\x25\x5f\x64\xba\x11\x87\x52\x28\xa5\xd0\x03\x30\x04\xfb\x61\x04\x0e\xa4\x35\x14\x42\xfd\xac\xfe\xff\x7a\x7b\x52\x61\x2a\xd4\x93\x91\xb2\x80\x14\x78\x3a\xd9\x47\x71\x1c\x43\xa9\x14\x24\x3d\xb1\x04\x15\xa1\xd2\x71\xc3\xc1\x54\x74\xff\x3e\xe0\xb0\xad\x0d\xb9\x84\xdf\x85\xed\xdf\x61\xfa\xd8\xbc\x59\xce\x9f\x22\xd6\x81\x31\x66\x66\x48\xd1\x7c\x03\xfd\x6d\xf0\x1c\x48\x80\x53\xe0\xfb\x00\x40\x4f\x29\xce\x57\xa6\xd3\xaa\xb6\xa6\x9e\x6c\xac\x2c\x1d\xe9\x37\xb2\x9a\xf8\xdc\xdb\x10\x13\xab\xde\x26\x96\x11\x44\x0b\x3d\x65\x44\x05\x61\x7e\xbf\xa6\xbe\xa6\xb6\xb2\x74\xe4\xff\xf8\xed\x09\x56\xa1\x48\x18\xac\xc0\x63\x7b\xf4\xb1\xbd\xfa\xc8\xb5\x0d\xf5\xa5\xa6\x55\x5d\x65\x1b\xd4\xd8\x83\x47\x54\xd5\x52\x10\xbf\xa7\xc6\x6f\xaa\x1b\x6b\x6a\xfd\x57\x0c\x1b\x36\xa2\xca\xb7\x70\xf4\xf5\x8d\x65\x95\x9e\xcc\xa7\x0d\xd5\x0b\xae\x79\xcc\x73\x71\xd5\x4b\xc7\x8e\x4d\x9e\x72\xfe\xe2\x46\x5a\x38\xff\xf4\x7b\x55\x7f\x38\x7a\x34\x76\xfe\x1f\x1e\x58\xb1\xe2\xe8\xca\x4c\x83\xcf\x0b\x7d\x70\xd4\x85\xbe\x2b\x46\xaf\x6f\x9c\xe5\x29\xc9\xbc\x21\x08\xd7\x3c\xe6\x59\x34\xf6\xad\x82\xaf\x8c\x82\x2d\xe8\x0b\xfd\x4b\x25\x8c\xaf\x62\x24\xc3\x07\xc2\x74\x34\x3c\x69\xca\xf0\xa1\x70\xaf\xdc\x53\x22\xf1\xdd\x03\x50\x15\x35\x5e\xa1\x68\xf4\xf7\xcc\x63\x21\xd8\x83\xf3\xab\xa4\x68\x98\x42\x29\x48\xa2\x01\x18\xc5\xbf\x43\xa8\x7f\x20\x14\xf2\xbc\x89\x7e\x8f\xd2\x5b\xb7\x6e\x0d\xbd\xbd\x68\xdb\xb3\xf0\x71\x06\xbd\xbe\xfc\xdd\x4d\x4b\x16\x7d\x1b\xce\x83\xeb\x1e\x59\x7a\x9e\x84\xfe\x71\x9b\x6f\x58\xc3\xf8\xeb\x37\x8d\x5f\x56\x75\x9e\x38\xfa\x9b\xf0\xac\x6b\xca\xae\x19\x81\x76\xdd\x76\xdb\x6d\xf0\x28\xfa\x0c\xfd\xf5\x5e\x66\xe9\x3d\xa1\xb7\xbf\xfd\xeb\xb7\x3f\x41\xaf\x7f\xff\xb7\xa2\xf1\xcd\x07\x96\x96\x8b\xe8\xbf\xf3\xbe\x39\xf6\x8a\xb3\xcc\x6f\xfa\xa6\xa2\x1f\x7d\xfc\xda\x49\x0a\x7d\xf1\xe8\x63\x70\x10\x1d\x79\xf7\x13\xee\xa3\x9f\xc3\x07\xee\x5b\x52\x76\xce\x15\xe8\x6f\xea\xa2\x99\x53\x26\x07\xa7\xb6\x8c\xb9\x03\x9e\xd3\x4c\x2c\x47\xa7\x96\x2d\x5b\xf6\xdc\xad\x65\x23\xc7\x00\x0f\x90\xb2\x92\xbf\x87\x60\xc0\x28\x70\x81\x7e\xf6\x29\xcb\x3b\xfc\x40\x7d\x33\xc3\x0a\x8f\x7f\x54\x99\x55\xe0\x16\x6f\xe8\x06\x42\x66\x69\x96\x09\x68\x21\x49\xd0\x38\x39\x4d\x65\x81\xda\xef\x55\x55\x59\x4b\x68\x31\x45\x8d\xa5\xd4\x81\x78\xbc\x47\x8b\x6b\x2a\xc1\xa4\x55\x24\xe9\xf8\xa1\xd0\x60\xb4\x07\xca\x25\x81\x0c\x85\x38\x24\xcb\x50\x80\x31\xaf\x82\x62\x3c\x1a\xec\xef\x47\x83\x7c\x5f\xaa\x37\x29\xf6\x0e\xf4\xf5\x70\xf1\x64\x0a\x00\x2f\xce\x19\x13\x27\x38\x50\x03\xe6\x80\x25\xf8\xce\x8c\x70\xc4\x8d\x37\x36\x94\x56\x0d\x83\xfe\xda\x86\x60\x59\x95\xe9\x36\xae\xaa\x9d\xd0\x58\xa9\x9b\x47\x95\x45\x14\x8e\xbe\x8a\xa0\xb9\x8a\x60\x59\x4d\x6d\x63\x59\x43\x49\x93\xe7\xa1\x13\x3f\xf1\xf8\x02\x37\x3c\x72\x69\x8b\xbf\x65\xc6\x8c\x51\x17\x3e\xe2\x7f\xf1\x7d\xf1\x9d\x58\x60\x93\xff\x9e\x47\x6e\x78\xa0\x25\xb0\xe1\x62\xe8\x8b\xa3\x15\xed\xb0\x1b\x52\x0c\x47\x47\x19\x35\x8c\x92\x99\x14\xe2\x44\x4d\x84\x49\x85\x66\x05\x4e\xa1\x19\x96\x53\x24\x81\x17\xc3\x12\x45\x9c\xf5\xc8\x81\x9b\x33\x97\xff\x79\xf4\x33\xa1\x4b\xbe\x0d\xf7\xa1\xe7\x51\xd7\x2d\x0f\xdc\x08\xcf\x86\x67\xbf\xf3\xc1\x25\x0f\x4c\x6f\xfb\xf6\x23\xdf\x6c\x7d\x29\x1d\x43\x22\x4a\xf2\x2a\x9b\x88\x40\x0d\x0e\x7a\x52\xe9\x28\xa2\x75\x5d\x82\xad\x1d\x94\xa2\x51\xff\x20\x1a\x40\x29\xb6\x27\xd9\xdb\xcd\xc3\x10\x64\x07\x7a\x99\x2c\x88\xe2\x73\xac\x60\xe4\x8d\x3f\x7c\x3e\x00\x41\x42\x7d\x2c\xd5\x67\x9e\x6f\x05\x23\x97\xd2\x7e\xa3\xc6\xff\xf9\x8e\x33\x1f\xf6\x8d\xed\xff\xb6\xeb\xdc\x61\xf4\xc3\x05\x6b\x0e\x9f\xe7\x6a\x6f\xf4\xc3\x59\xfd\x1f\x98\x3a\xe0\x6c\xaf\x18\x70\x92\x50\xef\x77\xf8\x00\x7e\x48\x28\x64\xcb\x33\x33\x3f\x05\xb3\x2f\xe2\x00\xb9\x70\x4f\xe9\x0d\x60\x76\xa3\x79\x27\xb3\x26\xbb\xd8\x7f\x9c\xb8\x9f\xac\xd9\x43\xfa\x86\xc8\xe6\xd8\x9d\xe0\x18\x5c\x38\xe3\xae\xba\xbb\xcc\xef\xe2\xdc\xf8\x7b\x70\xde\x8a\x3d\xa5\x8e\x3e\xf1\xbd\xc6\x1e\x23\xe3\x43\xc4\xb6\x81\x04\x23\x3e\x65\x8f\x91\xfd\x0b\xdf\x53\x98\xef\x76\xa3\x84\x00\xc6\x82\xa5\x98\x4b\x72\x9e\xab\xa0\x65\x79\x8c\xaf\xad\x29\xad\xaf\xd4\xc5\x8d\x11\xef\x59\x9a\x6b\x73\x3e\xb4\x1b\x79\x4a\xcd\x97\xf6\x24\xac\x05\xa5\xf8\x9d\xa6\x6e\x77\x43\x50\xa2\xf6\x46\x14\x35\x99\x54\xa5\x68\x8a\xed\xa5\xe9\x90\x46\x85\xa5\x9e\x88\x9c\x0e\xc0\xa4\x2c\x47\x20\x1d\x83\x5a\x2a\xac\x84\x63\x3d\x51\x29\x3e\x40\x6a\x02\xc5\x50\x1a\xa5\x48\x89\xfe\x2c\x88\xa1\x5e\x94\x54\x21\x87\x7a\x20\x2b\x4a\x3c\xe4\x09\x2e\x29\xc9\x52\x58\x62\x18\x95\x67\x51\x8a\x11\x58\x45\x8a\xa9\x90\x96\xc5\x30\xcf\xa0\x6e\x4f\x28\xd3\x8f\xfa\x44\x49\x94\x05\x96\x53\x05\xae\x3b\x6e\x98\xc5\x02\x8c\x44\xd2\x09\xaf\x20\x22\x06\xf5\xca\x90\x84\x11\x31\x0a\x03\x54\x28\xca\xe7\xec\xba\x70\xb0\xa6\x0b\xfb\x76\xbb\xac\xbb\xc3\x2b\xb2\x35\xfe\x57\x88\x68\x70\xed\xd2\x47\x00\xf0\xce\xe7\x40\xe5\xf7\xc9\xb5\x5d\x5d\x99\x61\xd9\x87\xa6\x9f\xaa\x7c\x96\x6c\xee\xea\x02\xef\x66\x1f\x9a\xbe\xa0\xf2\x41\x1c\x1b\xab\x65\x25\x7f\xdc\x37\x08\x46\x03\x50\x56\x49\x56\xb8\x50\x59\xa6\x4b\x6f\xaf\xc7\x5b\xa9\x95\xf4\x07\xba\xe3\xe1\x54\x7f\x5f\x6f\x44\x4b\x70\x31\x91\x8b\x8a\xbd\x49\x29\x12\x1a\xea\xf1\x0d\x66\x41\xaf\xd6\x1d\xed\xd1\xb4\xa4\xaa\xa9\x19\x1e\x52\x34\x12\x61\x00\xca\x5e\xcd\x88\x2d\xc4\x79\x70\xc1\x59\xa6\x75\xc9\xd8\x59\xee\x20\xf0\xd5\x4e\xf0\x95\x56\x96\x56\x57\x94\xf8\x6a\x4b\x8d\xa4\x19\x3e\x2b\xcb\x78\x89\xcf\x9a\x0a\xa8\xf6\x0e\x46\x28\xa8\xc2\x1e\x11\x71\x48\x44\x31\x44\x32\x1e\xda\xdb\x3f\x94\x84\x09\x06\xf5\xa2\x41\xc1\xc3\xd1\x4c\x94\xa7\x33\x09\x6f\x3c\x2d\x7a\xe3\x99\x38\x0c\x40\x10\x93\x54\x59\x49\xc4\x45\x04\x32\x03\x84\x26\x52\xfd\x4a\x54\x85\x24\xea\x8b\x46\x13\x83\x19\x0a\x85\xc3\x9a\xc0\x4a\x25\x49\x81\x63\x44\x39\xaa\x69\xb8\x06\x40\x82\x93\xa4\xb0\x28\x0b\xbc\xa8\xc1\x80\x6a\xd9\xed\xde\x30\xa1\x06\x89\xd3\xaf\xd8\xbe\xb7\x38\x11\x0d\xd6\x74\xe1\xd8\xb1\x3d\x23\x1c\xf6\x3d\x8e\xc5\xeb\xf8\x1e\xf6\x37\x6d\x71\xf9\xb0\x73\xf0\x1f\xd8\x70\x33\x66\x5b\xef\x37\x98\xab\x87\xc8\xda\xf1\x36\xb8\x7d\x5b\xee\xac\x3f\xcf\xff\x81\x0e\x3f\x1c\xc6\x6f\xb6\x1e\x99\x37\x64\xfb\xc5\xf0\x7c\xf6\xe0\xf7\xa1\x7b\xac\x78\x6b\xc5\x86\x9f\xe3\x82\xdb\xf3\xdc\x73\x16\xf6\xf1\xff\xd4\x01\xc7\x7e\xb4\xd3\x38\xd6\x7a\xcf\x30\xd7\x3d\x94\x1a\xac\xd9\x8b\xef\x7b\x4e\xf7\x98\x3e\xa4\xbb\xb2\xac\xff\x69\xe2\x0e\x93\xaa\x97\xe2\xac\x8f\xa5\x15\x0d\xd5\xb5\xbe\xfa\x4a\x7f\x89\xaf\xb1\xb6\xa1\xb1\x96\xf0\xeb\x46\x83\xaf\xa6\xd6\x5f\x61\xe5\x82\x84\x66\x2c\xa9\x15\x51\x8a\x7f\x8d\xf2\xf9\x27\xd4\x56\x12\x46\x81\x1f\x1c\x9e\x68\x44\xe9\x6a\x42\x3f\x0c\xd0\x48\xf5\xd0\x22\x54\x61\x44\x4a\x0a\xbc\xca\xc9\xc9\x6e\xd8\x9b\xe9\x0b\xd1\x31\x06\xa9\x06\xc1\xd3\x22\xda\xeb\xd9\x76\x05\xfb\xf8\xd4\x46\x78\xd6\x86\xa6\x5d\x8d\xcd\x70\x45\xfa\xc9\x5a\xba\xc4\x8f\xd8\x5f\xc0\xb1\xd7\xa0\x27\x7e\x8f\x02\x7f\x46\xdf\x69\xfe\xfd\x71\xf4\x90\xa7\x62\x6a\x6d\xe6\x6d\xb8\x74\x43\xd3\xbd\x4d\x1b\xf4\x73\xa7\xc4\xf2\x9a\x3c\x10\x96\x7a\xa2\x02\x27\x89\x92\xc4\x33\x9e\x69\x25\x22\xcf\xca\x11\x51\x91\x4a\x2a\xbe\xb1\x73\xda\xc6\x9b\xc3\x0f\x4e\x93\x57\xdc\x3b\x6b\xd2\x7d\xf7\x4e\xdb\x19\x7e\xef\xc3\x8d\x0f\x2e\xba\xf7\xbe\x49\xb3\xe0\xb7\x16\x5f\xbb\xe8\xda\x45\x36\x9e\x70\x0c\x6a\x07\xce\x5b\xd4\x11\xb4\xb0\x6b\xc7\xba\xe9\x38\xc7\x79\xe4\x4f\xcd\x74\x9d\xe5\x4c\x9a\x92\xc4\xf1\xbd\x0e\x9c\x4b\x16\x0f\x04\x89\xe7\xee\xb1\xe5\x24\x6d\xd0\xf4\xf8\x4f\xf1\x1b\xae\x02\x9a\x9e\xc2\xf7\xb0\x1d\xdf\xcb\xef\xff\xf4\x2b\xa4\xde\x4f\xe9\x60\x1e\x4d\x0d\x5a\xef\xf8\xd2\x6e\xcf\xf8\x95\x1c\x8f\x75\xce\x76\xf4\x1f\xb3\x78\x95\x24\xda\x52\xf9\xbc\x71\x1a\xcf\xe7\xa0\x97\xb2\x74\x50\x83\x7f\x2b\xf1\x44\xb0\x66\xcf\xf0\x5f\x7f\x11\x24\x3a\x9b\x1c\xed\x71\xff\xa7\xb1\xff\x7b\xd7\x64\x87\xce\x8a\x61\xff\x96\x86\xf1\xf3\xb4\x63\xef\x18\x7b\xa4\x07\xbf\xbb\xfb\xb1\xa3\x1f\x19\xc3\x03\x05\x3c\x6c\xec\xc1\x1f\xe7\xc1\xcd\xf8\xe0\x8e\x97\x0b\xda\x3f\x4f\xa8\x64\x4b\xc7\xf7\x20\x68\xf2\xea\xba\xac\xfd\xda\x6f\x80\xa6\x45\x5c\xee\x7b\x89\x1c\x9e\x76\xde\x6b\x7e\xaf\x31\x3b\x57\xc7\x07\xd9\x72\xfa\x55\x38\x34\xe7\x2a\x6e\x72\xb0\x66\x57\x29\xbe\x11\xda\xe9\xde\xc3\xc6\xf7\x3a\x7e\x54\x6c\x3d\x24\xd1\x11\x77\x9d\xf9\x6c\xbc\x1f\x1d\xcc\x97\x1d\x47\x86\xe5\xf6\x9e\xd9\xff\x0f\x74\xf8\xfe\xd1\x00\x90\x0b\x8f\x1c\xa8\x05\x73\x3e\xe6\xf2\x78\xa7\xcb\x78\x7b\xf8\xaa\xad\xe7\x69\xc3\xcf\x10\xff\x23\xde\xdf\x01\xc7\x18\x18\x97\x5d\x11\xd7\xfe\x36\xf2\x97\xab\xa0\x01\x5c\x02\x16\x80\x4b\x71\x76\x52\x23\x12\x3c\x97\xa2\x5a\xdf\xba\xf8\xbe\xa8\xb2\xbc\xae\xa1\xb1\xa2\xc4\x5f\x6b\xdc\x16\x19\x9b\xd8\x78\x75\x55\x53\x0b\xf5\x96\xb8\xbe\x44\x8d\x2e\xdd\xf5\x9f\x71\xd0\xc8\xd7\x88\x33\x9b\x7a\xe2\x0c\x05\xfb\x79\x3a\xca\xc1\x68\x3a\x42\x79\xc5\x74\x38\x44\x95\x70\x28\xde\x9d\x8a\x44\xd4\x34\x13\xe8\x4d\x30\xa8\x7f\x90\x8f\x68\xc2\x60\x12\x29\x1e\x40\x85\x10\xed\xa1\xe8\x4c\x18\x26\x29\xca\x2b\x64\xc2\x5c\x18\x46\x39\x95\x65\xa0\x26\xa4\xe3\x5e\x36\xdd\xe3\x65\x07\x22\xbc\xa8\x2a\x22\xea\x43\x22\x9b\x8c\xc9\x84\xca\x8b\x02\xcf\x4a\xaa\x10\x61\x68\xb5\x2f\xac\x08\x51\x04\x06\x69\x5a\x65\x29\xd1\x33\x28\xf1\x6a\xb8\x47\xa5\x99\x88\xa0\x72\x4c\x46\x14\x25\x8e\xe7\x78\x31\x25\x49\x29\x59\xd6\x38\x59\x60\x58\x35\xa6\x84\x19\x46\x74\xbe\x75\x3b\xf5\x4b\x7c\xcf\x7e\xdc\x81\x47\x4c\xc3\x7d\x3f\x72\xf1\x98\xbe\xa7\xe2\x38\x7f\xc4\xc7\xb8\x16\x01\x8e\x48\x39\xf9\x89\x9b\x5f\x0d\x1d\x70\xe4\x16\x07\x7d\x93\x16\x7d\x83\x44\x7c\xa9\x6b\x9f\x44\x82\x35\x89\xe9\x79\xfb\xc4\x7a\x9b\xf5\x56\x1e\x9f\x70\x4e\x3e\x6c\xdf\x9c\xdf\x7f\xd7\x7d\x2e\x1e\xc9\xed\x67\xcc\x9f\x5d\xe5\x05\x7c\x8b\xf7\x7f\xd7\x96\xfc\x71\x8d\xf6\xed\xc3\xf2\xf7\xe1\xc1\x47\x8a\xef\xcf\xae\x7b\x5d\xf3\xe4\xad\x71\x0d\xfe\x6f\x7d\xb1\xa0\x7f\x3c\xee\xce\x9d\x05\xf2\x08\x8f\xbb\x2f\x99\xbf\x2e\x03\x9f\x3b\x3e\xc9\x6f\xbf\x0b\xd7\x9a\x3d\xfd\x8a\x43\x07\x27\x08\x2d\x58\xd3\x75\x4f\xc1\xfe\x32\xe0\xf8\xbe\xfb\xf4\x77\x0b\xf0\x83\xe5\xd7\xee\xa7\xf3\xe5\x51\x67\xb0\xf8\x7a\x8d\xf9\xd8\xef\xd9\x75\x78\x8f\xd5\x4f\x90\x68\xf5\x16\xd0\x0b\xaf\xeb\xd0\x42\x17\xdd\x95\x60\xcd\x29\xec\x03\xd8\x43\xd8\xed\x17\xf8\x4f\xd8\xf3\x59\xd8\xf9\x83\x3b\x4b\x66\xad\x6e\xba\xc3\x8d\x8b\xbd\xf3\xf2\xd6\x6c\xad\x01\xe3\xf4\xd0\x3b\xc5\xec\x11\xb2\xe6\xa4\x91\x3d\xe4\x41\x7b\x5e\x8e\x75\x1f\xa8\x2c\x26\xff\x49\xe2\x60\xc8\x25\x6f\xb5\x60\xcd\x1e\xbf\xde\x97\x81\xc5\x83\x4c\xb1\xf1\x8f\xbc\xe6\x92\x4f\xba\x8e\xc4\x32\x5d\xbd\xd7\x45\x8b\x9c\xee\xb9\xcb\x35\xb6\x45\xa3\x9a\x5d\x2f\xe0\x6f\x6d\x71\xf0\xab\xfd\x99\x51\xef\x56\xbd\xc7\xad\x0b\x8e\x2f\xc8\xa3\xb9\x73\xfd\xc4\x41\xab\xee\x5d\x55\x96\xf7\xbf\x65\xac\xfd\x13\x5d\xc7\x7d\x3e\x2e\x9f\x56\xc6\xbc\xa6\x16\xf0\x2c\xa6\x6d\xe7\x41\x5b\x67\x5c\xef\x8f\x11\x0f\x93\x2d\xfb\x47\x7b\xcb\x66\x6d\x6d\xba\x34\x48\xb4\x0d\xd9\xdf\x11\x72\xf3\x0d\xd6\x74\x74\x62\x69\x10\x74\xf2\x2e\xd9\xb2\xff\xc6\xd1\xa0\xe9\x42\x0e\x04\x73\xb4\xcc\xb3\x1f\xda\xe6\x38\xf0\x8f\x71\x13\xdd\x85\x6b\x25\xdf\x9d\x8f\xcb\xfd\xf8\x0c\xb8\x7f\x74\x71\xfd\xbe\x3f\x92\xaf\xaf\x63\x77\x16\xf0\x10\x1e\x77\xef\x55\x05\xfb\x06\xc3\x63\x6f\x02\xe7\x3c\xf3\xf6\xf1\x5e\xbe\xf8\xb8\x3b\xde\x2f\x2e\x6f\xf6\x36\xdb\x38\x14\xfc\xed\x84\x46\xb6\xe8\x2b\x6a\x52\x75\x7d\xdd\x21\x8d\x03\x4d\xb7\x71\x45\xe5\x51\xac\x33\x7f\x7c\x43\x9e\x3e\x2d\x16\xa3\x15\x49\xb4\x05\xf3\xe7\x15\xeb\xf8\x8a\xbd\x63\xf4\xff\xb0\xab\x1f\x9b\x7e\x8f\xff\x1c\xdf\xe2\x5f\x68\x7e\x46\x1b\x7d\xed\x5d\x58\x20\x9b\x63\xb9\xb1\xf7\x2e\xf8\x0a\x99\x5a\x56\x4c\x96\x90\xc4\x5e\x9c\x7f\x01\x9c\x05\xb6\x64\xe7\xfa\x8f\x13\xeb\x41\x08\x8c\xb3\x2b\x1a\xac\xc0\x37\x4d\xb7\x83\xfb\xac\x7c\x88\x55\x8e\x07\x73\x8d\xc6\x9f\x0a\x9c\x78\x96\xa8\xae\x34\xd3\xcf\xfa\x8d\x40\x63\x7f\x79\x55\x7d\x89\xaf\xb6\xa1\xae\xb4\xaa\xc2\xcc\x82\x58\x5a\xad\x1f\xa4\xf5\x23\x1b\xd6\xf4\xd5\x15\x3e\xac\xe6\x27\x58\xb5\xb4\x26\x54\xfb\x89\x2a\x3f\x31\x02\x9a\xca\xdd\x97\x0b\x25\x99\x50\x5d\x72\x66\xdb\x68\x12\xfe\xea\x9e\xd1\xb7\xde\x79\xf8\xeb\x8f\xdf\xb9\x2d\xb5\xec\xd5\x5b\x6f\x5a\x56\x3a\xfa\xd6\x5d\xcb\x16\xdf\xba\x68\x34\xca\x96\x0e\xfd\x16\xfe\xa9\x72\x7c\x26\xed\x39\x5a\x39\xbe\x67\xcb\xad\xa5\x5b\xb6\xa1\x5f\xa2\x37\x2e\x58\xbc\xf8\xeb\x1f\xc3\xf5\xe8\x29\xeb\xc7\xc3\x2a\x1c\x8c\xc0\x3e\x21\x12\x1e\xea\x86\x11\x1a\x91\xbc\x12\xa1\x3d\x6c\x12\x46\x43\x94\xc6\x52\xb0\x1b\xa5\xd0\x20\xc3\x04\x92\x24\xcd\x7b\x13\x69\xc1\x9b\x40\x4a\x6f\x9f\x22\xc8\x9c\x28\x89\x3c\x8a\xa0\x30\xb1\xbe\x7a\xc6\xb4\x4d\x1f\x25\xc4\x45\x9b\x96\xac\xda\x3a\x77\xcb\x8c\xbb\x5a\xb6\x9e\x77\xde\xa5\xbf\x94\x9e\xd9\xf0\xd8\xfe\x51\xd5\x13\x26\x6d\xd8\x30\x61\x92\x84\xbe\x35\x42\x1a\xfe\xd8\x5d\xd5\x23\x36\x04\x60\x42\x10\x3e\x5f\x84\xb2\xe7\xcd\xfc\xc6\xfc\xc9\x37\xce\x57\x2b\xce\x47\x0f\x1d\x5e\xbc\x79\xd9\x65\x9e\xab\x6a\x46\x3d\x74\xcb\xbe\xea\x9a\x9a\xfa\x59\xf3\x6f\xac\xa8\x98\xef\x0f\x3c\x34\x7b\xb6\x36\x6b\xd6\xf1\x71\xd3\xe6\x2d\x9b\x37\xbf\x7e\xc4\xf9\xb7\x6f\x9e\xe5\x3e\x17\x18\x74\x3b\xf9\xf7\x7c\x79\x83\x6d\x38\x33\xbf\x82\x4b\xae\x18\x3c\x39\xbd\xe0\x7c\x86\xe1\x7b\x7c\xb6\x8f\xc4\xac\x33\xb3\x07\xc7\x18\x75\xe2\x13\x80\x7a\xb7\x79\x06\x34\x73\x38\xe8\xb6\x0a\x49\xa8\xdf\x74\xf1\xb7\xad\xdf\xf6\x5e\x6a\x9f\x19\xcd\xbe\x8c\x77\x66\xa7\x7e\x99\x2f\x6b\x8d\x35\x1c\xd8\x0a\xf2\xed\x63\x0c\x6f\x7d\x23\x9f\x87\x77\x05\x0a\xe4\x80\x9a\x5b\xf3\x5e\x1c\xb7\x05\x86\xe3\xb8\x98\x18\x21\x81\xaf\xd9\xf7\x50\x17\x9a\x95\x04\xae\x05\xd7\x83\xd5\x60\x2d\xce\x94\x5c\x6e\xdf\x35\x18\x25\x6b\x2a\xad\x60\xa4\xfa\x4a\x5f\x5d\x43\x7d\xdd\x48\xeb\x7e\xbb\xb1\xca\x6b\x24\x40\x2b\xc5\x5c\xab\x33\x2d\x66\x48\x83\x6d\xcd\x84\xde\xd0\xe2\xde\x5a\x8b\x6f\x8d\x38\x26\x68\x72\xaf\xce\xbc\x7e\xf5\xcb\xc1\x98\x16\x23\x00\x4f\xcb\x34\x3f\x24\x7a\x62\x19\x49\x85\x51\x24\xe3\x17\xb3\xe2\x40\x40\x23\x21\x87\x12\x54\x7f\xb8\x9b\xee\xed\x46\xa2\xea\x49\x4a\x34\x54\xa1\xc8\xc7\xd2\x4c\x32\x4a\xf5\xa7\x78\x51\xa4\xa1\x02\x03\x48\x84\x71\xd4\x0d\xc3\x64\x48\x61\x42\x50\x43\x3d\x3d\x48\xc3\x71\x86\x9c\xac\x2a\xa2\xa2\xa1\x81\x58\x54\xe2\xc2\x2c\x17\xe1\x50\x2f\xea\x21\xa4\x48\x46\xcc\xa4\x10\x2f\xc2\x24\x1c\xf4\x06\xe2\xba\x41\xca\x71\x28\xd9\x43\x47\x69\x46\x52\x55\x49\xed\x8b\xc9\xe1\x38\x92\xf8\x98\x07\xa0\x28\x17\x0a\x33\x11\x0a\x25\x22\x21\x4a\x62\x28\xce\x03\x42\xa4\xc6\x41\x8d\x61\x78\x96\x45\x0c\x4d\xd1\x2c\x2b\x0a\xfa\xee\x50\x58\xd6\x4b\x49\x4a\x58\x95\xd2\xb1\x10\xc5\x70\x02\x4d\x51\xb2\xc8\xd8\xf2\xc8\x92\x61\xc4\xd1\xf7\x5d\xba\x24\x27\xa7\x16\xe5\xcb\x42\x83\x96\xed\xef\x16\x95\x85\xc4\xd3\xbb\x8b\xf3\xfb\xde\xc5\x0e\xdd\x87\xc7\xdd\xe3\xc9\xe9\x2a\xe0\x81\x3d\x59\xd1\x37\x40\x84\xc1\x08\x10\xca\x65\x75\xd5\xcf\x16\x1e\x7f\x6d\xb0\xc2\x78\x06\xe1\xab\xf5\x52\xd1\x10\xed\x51\x78\x4d\x0d\x33\x88\x94\x63\xe1\xbe\xde\x58\x4f\x8c\x4a\xa1\x01\x9e\x08\x53\x4a\x38\x9a\x48\x8a\x11\x0d\xf5\xa7\x54\xc8\xa4\xd2\x92\x14\x8e\xab\x8a\x60\xea\x4e\xc1\x8c\xbd\xbf\x0e\x8f\x3b\xce\xd6\xa9\x82\x61\xdf\x77\xe0\x58\xca\x8e\xeb\x6d\xb8\xe8\x6c\x7f\x3c\xe0\xd0\xc1\x72\xae\x7d\x4c\x74\xb4\x37\xfa\xc1\x6f\xd1\xf5\x4f\x4d\xb8\xe9\xeb\xec\xc0\xf9\x05\xf6\x78\x1d\xed\x55\xc7\xb8\xd7\x82\xbc\x3b\x3f\x03\xde\xf5\x80\xa3\x1f\x63\x3e\x62\x5e\x3f\x82\x11\x93\x6d\xb4\x3f\xde\xe6\xea\x47\xb5\xfb\x5f\x62\xc3\xcd\xf7\x60\x1d\x97\xe5\xf5\x63\xd6\x43\xef\xe0\x0b\xe6\xe9\xc4\xcf\x8f\x1d\xfd\xe3\xba\xf4\x7b\xf3\xfb\xe1\xfd\x3c\xf6\xed\xe2\x08\xc7\x76\xd1\x65\xf3\xdb\xfd\xec\xf8\xa7\xcb\xa6\xd1\xe1\x0b\x0b\xe6\x63\x8c\xbb\xd8\x05\x17\xf0\xf9\x55\x0b\xd6\x74\x2c\xc2\xf3\xb1\x64\x59\xb3\xd1\x3f\xd9\xd2\x71\x9d\x77\xf8\xec\x31\x4d\x9b\x82\x44\xfb\x9e\x62\x38\x0d\x12\x1d\xfb\x8a\xcf\x29\x7e\x9d\x03\x9e\xcc\xad\xc1\x3e\x8f\xd9\x73\x3d\x72\x56\x01\x0d\x62\x56\x7b\x92\xd8\x3d\xdc\x05\x57\x30\x7c\x30\x48\xb4\x8f\xcd\xef\xdf\x38\x8f\x39\xd6\x66\xc6\x16\x19\x6b\xdb\x7b\xa5\x03\x17\x98\x57\xda\x95\xaf\xa0\x99\xc1\xd3\x5b\x7a\x72\xfd\x24\xad\x7e\x1c\xe7\x22\x9d\x96\x78\x9e\x7b\xaf\x28\xa0\x99\x94\xc3\xc3\xde\xcb\x1d\xf3\x51\x73\xf3\x39\xf4\x76\x7e\x3f\x6d\x5f\xe6\xf5\xc3\x98\xef\x4c\x56\x15\xac\xeb\x01\xdc\xbe\x79\x98\x8e\xff\x45\x0e\x5a\x6a\xb9\xfe\x77\x5e\xea\x68\x1f\xcd\xc1\x13\x71\x1b\x6e\xf1\x22\x5e\xd7\x9e\xab\xf3\x79\xa5\x73\x69\x01\x5d\x12\x39\x3a\x1e\x5d\x5b\x7c\x5d\xb1\x4d\x8e\xfe\xb1\x8d\x66\xc2\x13\xf9\xb2\xa0\xad\xac\x60\x5d\xb1\x5c\x3f\xcf\x76\x9b\x70\xd1\x9a\xcf\x69\xdd\x8e\xae\xd9\x2b\x60\x6d\xbc\xd9\x5e\x73\xdc\x41\xe3\x25\x76\x5f\x82\xb3\x2f\x5d\x3a\x3a\xde\xea\x47\x80\x0f\x9c\xe7\x78\xab\x6f\x56\xe4\x34\xbc\x32\x56\xfe\x4f\xc3\x11\xe3\x7c\xea\xed\xe9\xe6\xa9\x18\xcd\x79\xe9\x24\x27\x79\xd8\xb4\x16\xa2\x3c\x89\x58\x3a\x10\x83\xbd\x21\x2a\x3d\x50\xc2\xc9\xe9\x41\xef\x60\x3a\x60\xfd\x10\x11\x39\xc2\x46\xc2\x0c\xab\xc9\x51\x51\x1c\xe2\xc2\xe1\x92\x6e\x26\x12\xd5\xd2\x7d\x09\x44\x26\x11\x99\x30\xd7\x86\x79\x6b\x2f\xc6\xb5\xaa\xd8\x67\x56\x33\x87\xdd\xa1\xff\xc6\x72\xc8\x78\x1b\xe2\xb5\x62\xcc\xcd\x38\x13\x5c\x7d\xb4\xbc\xb2\xbc\x12\x5f\x08\x94\xda\x53\x2f\x05\x66\xdd\x83\x7a\x9f\x71\x35\xac\xcf\x9e\x88\x08\xa8\x17\x45\xbd\x74\x46\x85\x21\xa8\x49\x48\x40\x49\x8f\x10\x4b\x93\x31\x0f\x87\xfa\x11\x2f\xc3\x38\x24\x33\x61\x2f\x99\xe9\x66\x3c\x71\x44\x7b\x07\xd2\xa4\xfe\x43\xc8\x2a\x4d\x26\xb4\x6e\x25\x9e\x80\x34\xe2\xd3\x31\x49\xf2\x4a\x50\x45\x83\xd1\x48\xa4\x57\x8b\x91\xd1\x21\x3e\x81\x42\x09\x27\x0d\xc3\xc1\x9a\x8e\xf9\xf8\x14\x66\x9d\xeb\x36\x1a\xf9\x7b\xc8\x96\xb6\xf5\x7d\xe0\x92\x73\xf0\x9b\xe8\xf9\xe3\xac\xef\x98\xf5\xf3\x3b\x70\x4d\xe0\xb6\x9f\xbb\xf8\x41\xb4\xe1\x29\x17\x3f\x2b\x96\xbf\xa6\x63\x7e\x01\x9f\xe3\xb1\x3b\xe7\x39\xe0\xdd\x98\x0f\x31\x7c\xd7\xcf\x0b\xf8\x0d\xf7\xdf\xb1\x00\xe4\xe6\x83\xfd\x17\x46\xfb\xae\x7b\x5c\xf2\x44\xb1\xe7\xf3\xa6\x8b\xff\x79\xab\xfd\x61\xe4\xd8\x8f\xd1\x5c\xff\x07\x7e\x54\x7c\xdc\xb6\x37\x5c\x70\x1b\x0f\xf6\x79\xce\x96\x3f\x46\x5e\x83\x53\x5f\x38\xfa\x4f\xe4\xd6\xdb\xfa\x86\x63\xfe\x6a\x6e\xbd\x6d\x0d\xae\xf6\x5a\xb0\xa6\xed\x75\x9c\x6b\x08\x67\x98\x69\xfb\x19\x8e\xb7\x63\xf1\x5b\x55\x0e\xe7\xa0\xad\xc4\xf5\xa8\x2e\x02\x8d\xb8\xea\x5e\xa9\xab\x28\xa6\x23\xf5\x0d\xc4\x29\xdb\xdd\x55\x6d\x3d\xfe\xda\x86\x6a\x47\x16\xb2\x01\x82\xcd\x30\x1e\x2d\x63\x64\x68\x0d\x05\xd4\xa8\xd4\x4d\xa5\xc2\x0c\x43\xa6\x07\xcd\x4a\xb7\xf8\x07\xc6\x15\x21\xca\x87\xd3\x4c\x5c\x54\x62\xaa\x97\x51\x99\x18\x13\xe9\x96\xa9\x44\x48\xf2\x80\x12\x4e\x8b\xeb\xff\xcb\xf4\xa2\x5e\x2a\x41\xc5\xa0\xec\x4d\xc4\xb5\x78\x1c\xf5\xc4\xe3\x48\xd5\x12\x7c\x52\x23\x59\x34\xd0\x2d\xf6\xf6\xc4\xe3\x4c\x32\x4e\x76\xf7\x30\xbd\x49\x63\xcd\x9c\xf5\xa6\xbf\x13\xdf\x8d\x9e\x72\xbe\xf9\x90\x08\xce\xba\x87\x6a\xb3\x7c\x63\x9c\xfd\xc6\x02\xdf\xdb\x76\x96\x3a\xe0\x38\x97\xb2\xd1\x4f\xeb\x07\x20\xd7\xbf\x51\xc7\xdc\x88\x11\x9e\xea\xea\x47\x0a\xd6\xb4\xe1\xdc\x16\x1d\x9b\x1d\x70\x1c\xb7\xd4\xf6\x48\x5e\xff\x9c\x69\x07\xe1\x9c\x04\x6d\xd6\xd9\x38\x82\xfd\x2d\x42\xb0\xa6\x0d\x7b\x94\xda\x54\xe0\x5c\x97\x39\x6e\x90\xd8\x69\xbd\x29\x64\xf0\x1b\x5e\x39\x58\xd3\xb9\x8b\x1c\x08\x12\x9d\xa5\x03\xce\xf9\x88\x56\x7b\x3b\xff\x2b\x87\x73\x4c\xb2\xd6\xb8\xfb\x52\xf9\x78\x30\xe1\x6f\xb9\xe6\xaf\x04\x6b\x8e\xf5\x17\xcc\x3f\xa6\x8f\x6b\xb6\xcf\xd5\xb9\xd3\xed\x3b\x21\x58\xb3\xef\x4d\xd7\xfc\xd9\xec\xe5\xfe\xef\x10\x5b\xc8\x96\xe7\x36\xad\xf7\xcd\x3e\x9f\x03\xe4\xc2\xce\xe1\x1e\xdf\x1c\x8f\xcb\x0f\xaf\x18\xf1\x7e\x41\x62\x0f\x72\x8c\xff\x92\x0e\x6f\x05\xe3\x74\x19\x92\xc3\x2b\x6b\xc4\xf9\x74\xbd\xeb\xc2\xb7\xf1\x7e\x8a\x0b\xd6\x1c\xc6\xb1\xfb\xfb\x5e\xcf\x5f\x87\x31\xdf\xc3\xef\xba\xce\x76\x4a\xb0\xe6\xf8\x4f\xf0\xfa\x86\x3b\xd6\xd7\x8d\xf9\xe5\x97\x05\xf4\xc4\xef\xbc\xf6\xbd\x56\x80\x0f\x47\xff\x5d\x87\xf3\xf9\xc2\xe0\x97\xd3\x47\x1d\xf0\xb0\x03\xdf\x3f\x2b\x36\xcf\x20\xd1\xb9\xd1\xd1\x3f\xae\xdf\x6c\xe4\x6c\xb1\xe7\x63\xe4\xcc\x8a\x05\x6b\x76\xe3\xb3\xe9\xa9\x77\x1c\xfd\xc4\x72\xfb\x60\xdf\x4f\x5d\xf4\xb7\xf9\xb7\x73\x4e\x71\xfa\x1f\x5c\xec\xea\xc7\x6e\xff\x5c\xa9\x7d\xf6\x35\xcf\xac\xfb\xf0\x39\x67\x9f\xd3\xa7\x25\xe1\xb8\x6f\x1c\xb7\x79\xf4\x1d\xd7\xba\xec\xf9\xec\xde\x99\x8f\x07\x03\x6e\xe7\xf7\x55\xac\x73\xc2\x3e\x7c\x56\xde\x37\x2f\x7f\xff\xb5\xb7\x15\xc1\xbf\xbd\x5f\xed\xbb\x2f\xce\xb2\x51\x0d\xb8\x7d\x77\xc7\x5a\xba\x03\xcf\xb3\x66\xf7\x0e\xac\x8d\xbf\xe1\xa6\x81\xb1\x77\x0e\xa0\xe2\xb8\xd8\xf7\x13\x17\x0f\x89\xd6\x9a\x5d\xf7\x7d\x11\x8b\xa7\x49\xe2\x70\x97\x03\x9e\x20\x14\xb2\xa5\x73\xb8\x17\xcc\xfa\xb9\xae\x1b\xa3\x03\xc5\xf1\xb1\xe3\x8c\x43\x27\x7c\x0f\xaf\xfb\x57\xba\x2d\xbc\x8b\xb9\x24\x87\x27\x5c\x53\xac\x4d\xc3\x36\xda\x62\x07\x3e\xa2\xb9\x75\x1f\x19\xe6\xe8\x3f\xa9\xf3\xe3\x91\x5d\x05\xf2\x2e\x9a\x1b\xf7\xc8\x4e\x17\x9e\x94\x60\xcd\x91\x7e\xd7\xfe\x90\xb3\x4b\x4c\x3b\xec\x38\x00\xe4\xc2\xbd\x2b\x56\x7e\x6d\xe6\xf2\xa6\x76\x07\x0f\x70\xd6\xba\xf7\xbd\x6c\x7f\x47\x30\x7c\x3b\xed\xbf\x0a\xe9\xb6\xc2\x15\x21\x27\x3e\x54\xab\x7d\xbc\xd5\x1e\xdb\x7c\xff\x1c\x1f\xe3\x1a\x9b\xb5\xea\x13\x19\xb2\xc2\xce\x97\x6f\xc8\x24\xd6\xba\x53\x72\xac\x8d\x31\x6c\x14\x63\x6d\x6d\x97\x38\xfa\x31\xfa\xbf\x2e\xaf\x7f\xb3\xee\x9a\xd1\x7f\xeb\x27\x0e\x1c\xc9\x38\x36\x18\xf7\x73\x4c\x70\xf4\x13\xb7\x79\x89\xe8\x5a\xe1\xd0\xbf\x78\xaf\x9d\xc2\x79\x25\xda\x7f\xe5\xa0\x25\xbe\xe3\x3a\x34\x15\xcf\xff\xdd\x7c\x5c\x1b\xfd\xec\x34\x62\x17\x47\x60\xf8\x6e\x82\xcd\x8b\x3c\x9e\x0e\x66\xe3\xbb\x46\xe3\x85\xf0\xf5\x38\x37\x1a\x09\x6b\x27\x94\x5a\x91\xc6\x8d\x75\xa5\x66\x14\x72\x69\x95\xb7\xae\xb4\x0a\x96\xe3\x34\xa0\xf8\xc7\x91\x5e\xb4\xac\xb2\x14\xd6\x57\x95\x97\xd5\x57\x9d\xe7\xa9\x33\xbd\x3a\x7e\x47\xd1\x7a\xf3\x35\x4f\x52\x43\xbd\x0a\x24\x51\x47\x09\x33\x94\x6a\x82\x71\x24\x6a\xaa\x0a\xbf\x67\xfe\xe3\xe9\x68\x34\xd3\xd2\xdf\xd3\xd3\xd3\x03\x49\x52\x92\x39\x95\x8a\xb1\x0c\x45\x66\x12\x90\x8b\xeb\xff\xd1\xa4\x18\xa2\x19\x86\x94\x42\x0c\xea\x0b\x07\x68\x85\x19\x64\xc8\x70\x80\x22\xbe\x96\xae\x46\xf3\xd0\x1f\xaf\x4d\xc3\xfb\xbd\xbf\x8b\xa0\x8f\x33\x03\x2a\x04\x77\xe2\xdf\xf0\xa5\x2f\xbb\x88\x8f\xd5\x78\x24\xae\xc6\x33\xea\x00\xa5\x85\x54\xd8\x5d\x42\xa2\x54\x3c\x8e\x7a\xe3\x71\x55\x37\x06\x22\x71\x2a\xae\x06\x62\xf1\x50\x3c\x1a\xa0\xfa\x92\x5c\x32\x11\x8f\x87\x12\x71\x27\xff\xb0\x36\x1f\xfe\x30\x5f\xc6\x9a\x32\xe7\x11\xd7\x3e\xce\xb5\xef\xb6\xe1\xac\x93\x2e\xfb\x5e\x72\xed\x19\x5d\x46\xfd\xa0\x60\x2f\xe1\xd8\x31\x53\x4e\xbc\xe8\xe2\x13\xc5\xba\xcf\x73\xe8\x1a\x5d\x26\xdb\x7c\x75\xe0\xef\x45\x65\x14\x71\xf8\xbb\x0e\xfe\x8c\xe7\xf6\x8b\xeb\x7e\x31\x99\xd3\xa1\x5d\xf7\x15\xe7\xab\xf6\x0f\x5c\xf3\xcf\xc9\xb3\x17\xf2\x75\xa2\xd1\xfe\x99\xb0\xab\x7f\x1b\x3f\x6d\xff\x28\xce\xff\x76\x7d\x7c\x43\x0e\xd8\xed\x0f\x3d\xeb\x92\xa3\x39\x59\xfd\xbc\x4b\x56\xdb\xf3\xd9\xbd\xeb\x2b\x74\x59\xd2\xb1\xdf\xc3\x8e\xf9\x7f\xbf\xf8\x7a\xf7\x7d\xcf\x35\x4f\xd5\xc2\x4f\xe7\xdf\x5c\x72\xc0\x9e\xe7\x8e\x3f\x15\xc7\x7f\xeb\x3f\x1d\xe3\x3a\xe6\xf9\xcc\xca\xe2\xfd\x1f\x1a\xeb\xc2\xa7\x2e\x2b\x17\x14\xc8\xb1\x68\x6e\x5c\xf5\xae\xe2\xf3\x3f\xe4\x7c\xe3\x6e\xc4\x24\xa2\x82\x7e\x1c\xf3\xdf\xbb\xcc\x61\x1b\x60\xdd\x77\x0a\xe7\x49\xc6\x59\xaa\xad\xfc\xd4\x9c\xe5\x3b\x78\xe6\x5a\x7c\x66\x70\xfb\x08\x14\x53\x36\xd5\x3c\x7c\x89\xfe\xe9\x89\x5a\x87\x3e\xb3\xf1\xd1\x76\xa4\x38\xbf\xec\x7f\xdd\x01\x77\xbc\xe1\xe8\xea\x72\xd1\x53\xb5\xf9\xfd\x11\xd7\x79\xc8\xd0\x71\xba\xfc\xbb\xd3\xd1\x8f\x92\xeb\x5f\xdd\x94\x7f\x3e\xd3\xdb\x07\x89\xc3\x19\x17\xfe\xec\x71\x0f\x34\xbb\xf4\x46\x44\xd7\xbb\x1e\xa0\x5b\x9e\x41\xa2\x2d\xe4\x92\xc9\xac\x35\xf6\xc1\x44\x71\xdd\xbe\xff\xa8\x8b\xd6\xb2\x8d\x8b\x8f\x5c\x63\x58\xba\xcf\x9d\xcf\xbc\xca\xd8\x3f\xfa\xf8\x9f\x82\x39\xb2\x6e\x03\x9f\xfa\xa4\xd4\x7d\x1f\x17\x76\xec\xaf\xdf\xe5\xcb\x99\xc4\xf1\x02\x39\xe3\xc0\xa3\xeb\x1e\xd2\xc1\x3f\x7b\xaf\x72\x9c\x13\x31\x7f\x1e\xc7\xef\xb7\xd5\x3b\xf3\xf5\xa0\xd1\x3e\x76\xda\x61\x83\x61\xf8\x5e\xec\x7b\x55\xef\x70\xd1\xc3\xe6\x83\xd8\x9d\xae\x73\xb1\x6a\xd1\x23\xe6\xcc\x3b\x6f\xe4\x05\xc1\x79\x09\xd4\xdb\x8b\xef\xaf\xbd\xd7\x14\x97\x4b\x09\xa7\x5c\xb2\xf1\x13\x24\x9e\xb9\xb6\x2f\x8f\xff\x63\x4f\x15\xec\x0b\x87\x3c\x3f\x42\x15\xe7\xa7\xbd\x57\x17\x6f\x7f\xe0\x65\xc7\xba\x70\xfb\xd6\x7f\xb8\xf4\xb8\x8d\xb7\xd8\xc3\x79\xb6\x91\xe9\x87\xdc\x89\xa9\xbf\x37\x67\x0f\x5c\xe9\xd7\x88\x6d\x64\x4b\xfb\xaf\x4a\x7c\xb3\x3e\x69\x7a\x8b\x6c\xde\x07\xc0\x56\x30\x7c\x66\x75\xd3\x41\x7c\x5f\x6b\xde\x5d\x63\xbb\x70\x9d\xce\x9f\x4f\x2f\x2f\xb6\x76\x92\xd8\x2b\x16\xc8\xc6\x11\x2e\xde\xc8\xc7\x6d\xce\x3f\x6e\xe6\x0c\xde\x89\x71\xa5\xde\xe6\xa0\x35\xf6\xe9\x19\xb4\xde\xf9\x6d\x97\xae\xb1\xfb\x39\x70\x4f\xf1\x3d\xb6\xff\x2a\x97\x8e\xb0\x75\xd3\xde\xe5\xc5\xed\xcb\x4e\xd2\x85\x43\xdb\x56\xdc\x7b\x9d\x3d\x9f\xb9\xfe\xe7\x09\x85\x5c\xbb\xfd\xd3\x6c\x16\xbc\xc1\x5d\xc7\x96\x06\x17\x9e\x7a\x07\xfc\x93\x03\x73\x4e\xdb\x31\x24\x36\x3e\x4e\xc4\x8a\xcb\xa2\xbd\x2b\x8b\xc3\xed\xdc\xc2\x86\x3f\x51\xb2\x78\xb6\xe3\x4b\xd7\xba\x95\x60\xcd\x1e\x58\x60\x1b\x3a\xf6\x96\xeb\xbe\x31\x96\x3b\xf7\x1c\x79\xc3\x25\x27\x72\x32\x3e\xec\x1a\xd7\xf6\x71\x1e\xc2\x2f\xf2\xd4\x8d\xf8\xb3\x3a\xfc\x1e\x15\x7f\x67\x08\x90\xcd\xda\x4d\x30\x92\x3d\x33\xad\x0c\xe7\x1f\xe1\x6c\x7c\x61\x3c\x1e\xca\xba\x78\xda\xc6\xfb\x3e\xb5\x38\x9d\x5a\x27\x16\x97\x11\x76\x7e\x7b\xc1\xc8\xb7\x6b\xc9\x41\x75\x43\x71\xba\x1a\x65\x7d\x30\x3f\xd1\xfe\x04\x11\x25\x5b\x8e\xcd\x0d\x7e\x31\x71\xf9\xa4\xdb\x83\x44\xe7\xe5\x2e\xda\x6a\x36\xef\x58\xf7\xa0\xa2\x5d\xd7\xea\x17\xae\x33\xab\x61\xaf\xe5\xe6\x9a\x75\xe8\xa4\x4e\xe2\x5e\x43\x27\x91\xcd\xd1\xf7\xc1\x5e\x50\x36\xf3\x58\xd3\xa6\x6c\x36\xdb\x8f\x6e\x0e\x54\x11\xb7\x92\x6b\xdb\x76\x64\x6e\xc8\xce\xbe\xf8\x81\x4b\xef\x27\xd7\x3e\xf3\x8a\x37\x00\x9f\xbe\xe0\xb3\xa9\x4f\x90\x6b\xbb\x26\x7a\x8e\x80\xbb\xa6\x5e\x56\xfb\x3a\xb9\xf6\x99\x80\x57\x41\x7f\x1f\xbf\x8e\xb9\x9a\x6c\x3e\xf5\x9a\x07\x65\xcf\xbf\x60\xf7\xf4\x87\x6d\x1b\x0f\xeb\xc3\xd6\x8c\x8b\xde\x82\xa5\x73\xdb\xdf\xcf\xb3\xe1\x4d\xfd\xd9\x8a\x5c\xf0\x70\x76\xae\xa1\x63\xf6\xae\x20\x06\x9a\x52\xb3\xea\x83\xc4\x33\xb5\x8e\xbe\xa2\x96\x7c\x24\x89\xa3\x56\xbd\xc9\x88\x85\x8f\xe3\x8d\x3a\x0f\x3e\x7e\xbb\x8b\xa7\x74\x9c\x9f\x53\xc0\x83\x58\xee\xb4\xbf\x57\x30\xd7\x48\x4e\x87\xa9\xeb\x5d\x6b\xd0\x75\xfa\x14\xcc\x6b\x0c\xe6\x9c\xa9\x0e\x9d\x9e\xd3\xad\xb7\x7e\x05\x7f\xfc\xc5\xc1\x1f\x98\x46\xc6\x18\xad\xab\x1c\xb6\x86\xaa\xef\xa3\x56\x9c\x7f\x5d\xc5\xf9\xd1\x81\x07\xf4\x66\x45\xbf\x40\xf0\xb8\xda\x15\x80\x95\x5e\x57\x2e\xed\xb2\x0a\x6f\x65\x59\xa5\xb7\xb2\xbc\x12\x8a\x25\x03\x22\x94\x28\x2d\x21\x46\xa8\x98\xc8\xf3\xe4\x90\xcc\xc5\x19\x4f\x8c\x1b\xea\x89\x94\xa4\x86\x18\x82\x4f\x77\x67\x64\xd4\x1f\x88\x07\x7a\x60\xdc\x93\x22\x33\xbd\x9e\xf8\x50\x32\x0a\x9c\xf9\x46\x4f\x61\xdf\xde\x71\xd6\xa1\x77\xb0\x7d\xa0\x43\x1c\xbe\xba\x88\xe5\x7b\x3b\x81\xe3\xd8\x74\xac\x9b\x70\xc1\x6c\xdf\x88\x65\xca\x14\x07\x1c\xeb\x17\x03\x7e\xdc\x59\xbf\x46\xc4\xf9\x55\x59\x1c\x6f\x9b\xb2\xe1\xa6\x6f\xca\x18\xb7\xeb\x5d\x07\x9d\x45\xcc\x33\x43\xae\x71\xf5\x73\x71\xd8\xea\xc7\xe1\x03\x89\x58\xf7\x5f\xc6\xb8\xb6\xbf\x41\x87\x63\x1f\x5e\xeb\x19\xdc\x4f\x83\xa3\x7f\x4c\xb3\xe3\x38\x6b\xd0\x49\x4c\xe7\x5d\xa5\xf6\x77\xb0\x5f\xc6\xe8\xcb\xf6\xcb\x44\xac\x7b\x48\x03\xbe\xfb\x29\xc7\x9c\x62\xb9\x35\xd8\x7e\x9f\x08\x3e\xc3\xdb\x73\xb2\x7d\x1a\x61\x4b\xdf\xec\xc4\x19\xed\x8f\xd7\x9b\xf0\xa8\x75\x9f\x79\x14\xc7\xfa\x1d\x9f\xe6\x18\xd7\x81\xd3\x67\xfe\xe1\x82\xdb\xf3\xb1\xfd\x35\x11\x7c\x86\xd7\xc7\xbd\x18\xcb\xd7\x3e\x57\xff\x7c\xb0\x66\xb7\x41\xfb\x19\x8e\x7e\xf0\x59\xdd\xd8\x53\xf6\x59\x3d\x62\xc5\x60\x18\xfd\xb4\x7e\x59\xb0\x07\x1b\x30\x7e\x1e\x72\xc0\xe3\xb9\xf9\xd8\x67\x7b\xd7\x9e\x25\x89\xf8\x5a\x17\x0d\xc2\x56\x3f\x47\xce\x76\xf0\x62\x98\xb8\x8f\x5c\xdb\x36\x1c\xf8\x4a\xca\xe6\xcc\xa8\x7f\x97\x5c\x7b\x7c\x7a\xfa\xba\xec\xef\xe7\xfc\xa2\xbe\x84\x5c\x78\x7c\xfa\xdf\xfb\xb8\x9b\xea\x17\xba\x70\x83\xfb\xe8\x38\xe4\xc0\x7d\x34\x87\x83\xf6\x5f\xbb\xf8\x53\xb2\xda\xb7\x0e\xe6\xf3\xc3\xce\xef\xe2\x3b\xf8\x46\xd7\xdc\xd9\x60\x8d\x7e\xc2\x75\xc1\xcd\x73\x65\xd7\x96\xbc\x7d\x61\xd6\xf2\x35\xd6\xda\xfa\x85\x6b\x3e\x36\x0e\xec\xf3\x51\xc4\xd2\x79\xc6\x7c\x76\xfc\xb9\x00\x97\x0d\xae\x73\xa2\x62\xf9\x7f\x8e\x37\x0c\xea\xe7\xa6\x0f\x02\x56\xfb\xc9\xfe\x7b\x88\xfb\xcd\xf5\x36\xef\x58\x08\x5e\xcd\xfe\x93\xed\xe6\x56\x98\x73\xc2\x77\x24\x06\x2e\x0e\x11\xf6\x18\xac\xb1\xb7\x0d\x78\x97\x75\x87\x9d\xb4\xde\x67\xb5\x19\x72\xee\x16\xd7\x9a\x65\xa3\x7d\x90\x68\xfb\xd8\xb5\xf7\x6c\xfe\xb4\x6d\x41\xd1\xba\x67\x6c\x1b\x81\xef\x54\xf0\x4b\xab\x36\xa3\xde\xb2\x66\x7f\x86\xeb\xf1\xb6\x8d\x74\x7c\x16\xb1\x6c\x66\xa3\x3f\xdb\x66\x36\xea\x12\xe6\x6c\xf2\x9b\x1d\xb8\x52\x72\xb4\x6e\xfd\x87\x8b\xa6\x7c\xb0\x66\xff\x55\x05\x7b\x3f\x96\xc3\x79\xeb\xdf\x5d\xbc\x91\xe3\xf7\xbf\xb9\xfa\x61\x2d\xb8\x2a\x3b\xe0\x0e\x7d\x77\xfc\x62\x17\x0f\xe4\x78\xaf\xd7\x84\x2f\xc9\x72\xfe\x56\x82\x23\x5b\x9e\xda\x36\x1e\x34\xbd\xa0\x9f\x69\x8e\x5f\xfc\xce\x17\x4d\x5e\xce\xb9\x9f\xed\xf1\x8d\xb8\x17\x40\xe0\xfe\x14\x42\x00\x67\xe1\x4a\x88\x35\xb8\x46\x09\x70\xde\x68\x1a\x95\x49\xe0\xbf\xaa\xf6\x49\x28\x10\xc4\xce\xf0\x31\x18\xf0\xf4\x43\x39\x2d\x78\xf8\x4c\x12\x26\x90\x50\xc2\xcb\xb2\xac\x52\x09\x91\x4d\xcb\xb1\x98\x37\x9a\x96\xf5\x1f\x42\xc8\xf4\xa3\x58\xaa\x17\xca\x9e\x50\xa6\x1f\xaa\x61\xd4\xaf\x21\x39\xdd\x23\x89\xa4\x46\xf2\x11\x14\xf7\x0e\xa0\x81\x08\x8a\x44\x6c\x7d\x86\xdf\x8b\xb5\xe3\xe8\xc4\x0e\x67\x7e\xe3\x04\xb1\xc4\x84\x2f\x7c\x0e\x81\x00\x07\xe6\x1e\xb5\xed\x1a\x2c\xf7\x9f\xc3\xde\xe4\xf6\xb7\x1d\xdf\x79\x07\xeb\x4c\xdc\xd7\x73\xef\x2e\xf3\x39\x74\x26\x1f\xac\x69\xc3\x31\xc7\x8e\xfc\x87\xa6\x8d\xa9\xf7\x60\xfe\x26\x8e\x0f\xda\x63\x18\x77\x92\xbb\x5d\x63\x88\x56\x8e\xee\xce\xbd\x79\x70\xd6\xb4\x15\x6e\xca\x83\x9b\xf2\xda\xe8\xfd\xe4\x2c\xc7\x5c\x0d\xdf\xd8\x46\xd7\x9c\x14\x2b\x0f\x54\x3b\xbe\x83\x6d\x4f\x39\xc6\x8d\xd9\x73\x25\xf6\x34\xbb\xfa\xd7\xf1\xf7\x66\x01\x2e\x30\x5f\xb7\xcd\x75\xf5\x2f\x59\x3e\xda\x76\xbc\x0f\x6c\x1f\xad\x64\xdd\x79\x9a\x70\xce\x85\x23\x29\x58\x73\xf4\x67\x05\xeb\xc2\x7b\x30\x3e\xb9\x38\xfc\x48\x4b\x01\xde\x8c\x75\xe1\xfb\x96\x42\x7c\x76\xb4\xe7\xcd\xdf\xf4\xab\x1b\x6f\x4c\x5c\x39\x2b\xf1\x7a\xdb\x9a\x0a\xc6\xc5\xfd\xe8\x10\x92\xd8\xe1\xcc\xe1\x87\xf3\x1c\xb4\xbf\x8e\xdb\xbf\xe1\x80\x47\x70\xfb\x37\xf0\x1b\xa1\x57\x6d\xfc\x9b\xb6\x8c\x51\x7b\xbc\x1d\x67\xc6\x53\xd7\xda\x63\x68\x16\x0d\x48\x62\xff\x8b\xae\x39\xe9\xb8\x9e\x53\x30\x27\xd5\xa2\x3d\x49\xb4\x59\xef\x96\x18\x2b\xf6\xb2\xfd\x8d\x1e\xfd\xfc\xde\xe7\x98\xd3\x29\x7c\xce\xfd\xd5\x34\x1d\x47\xa9\x01\xe0\x1e\xb7\x6d\x65\x71\x5c\xb7\xcd\x2a\x0e\xdf\xf5\xa4\x0b\x6e\xd7\x42\x6f\x9b\xe9\xe2\x2d\x39\x1b\xf2\xa7\x72\xb8\xd8\x7b\x57\x28\x65\xf3\x74\x34\xb7\xde\xb6\x19\x0e\x1d\x6b\xc0\xdf\x70\x9d\xcd\x6c\x9c\xb6\xb1\x05\xb8\x76\xb4\x57\x5b\xec\xf9\xb0\x26\x2f\x1a\x58\x5e\xe3\x68\x8f\xe7\x69\xf6\xdf\xe8\xb0\xf7\xb0\xdf\xa3\xad\x21\xaf\x7f\x53\x47\xb5\xd5\xbb\xe0\x4a\x76\x9e\x3f\x4a\x7c\x8b\x6c\xe9\x98\x31\x7a\xa8\x69\x22\x87\x71\x6a\xca\x45\xa3\x6e\xbe\x0a\x02\xb8\x1a\x41\x5e\x75\x89\x5a\x68\x06\x71\x3a\x44\x62\x3d\xce\x33\x67\x7d\x50\x42\xb2\x94\x97\x1e\xec\xf3\xb2\x1c\xa2\x4a\xfa\x86\xa8\x98\x37\x96\x96\x7c\x94\x12\x11\x15\x2a\x2a\x48\x67\xe2\x31\xa8\x7a\x23\xe9\x48\xd4\x23\x64\x12\x84\xca\x0b\xaa\x2a\xa3\x28\x92\x54\x0d\x29\x99\x90\x21\x0b\x3d\x5c\xba\xdf\x1b\xcb\x02\x24\xa8\x71\xab\x3e\x82\x4c\xa8\xe0\x7c\x30\xde\x94\xd4\x17\x1b\x59\x24\x8d\x90\xd0\xf2\x4a\x67\x91\x68\x63\x3e\xb8\xe4\xb7\x15\x88\xe2\x35\x27\xe7\x01\x28\xea\x0d\x84\xa8\x38\x1b\xf2\x06\x50\x14\xf2\xce\x59\x09\x5e\x31\xc3\x7b\x92\xb9\x9f\xb0\x3d\x4d\x9f\xa4\xb1\x0c\xc3\x0b\x5a\x26\xe2\x9e\xa2\x27\x12\xc9\x02\x5d\x64\xa3\x08\x9e\xab\x79\xff\x6c\xe4\x70\xdd\x8d\x7d\x50\x38\xbe\x06\x7c\x0d\xa8\xd9\x99\xfe\x97\x70\xcd\x8e\x73\xcc\xfb\x13\x06\x4c\x03\x2c\xb8\x1a\x00\x68\x15\x57\x2b\xd5\x27\xea\xa8\xe4\xf1\x55\xc8\x2e\xcb\xa5\x76\xa9\xd3\x97\x5e\x31\xca\x7e\x21\x5d\x53\x5f\x5a\xe5\xf1\xd5\x36\x94\x55\x95\x74\xc6\xb4\xa8\x97\x8d\x66\x06\x3d\x81\xa1\xc7\x2b\x48\xb8\x38\xfd\x1e\x9c\x37\xa2\xe2\x87\x9e\xdb\x32\x4f\x7e\x0b\xde\x84\xf6\x7a\x66\x5e\x7d\x7d\xc3\xe5\xe3\xd6\x34\x4c\xc9\xfc\xfd\xd1\x5e\xb8\x19\x3d\x74\xf7\xdd\x77\x7b\xfe\xac\x68\x30\x14\x08\x04\x42\x64\x40\x23\x79\x45\x66\x23\x24\x1a\x94\xfb\x48\xa5\x24\x30\x68\xe4\x3b\x8b\x79\x02\x9e\xc1\x4c\x0a\xc6\xd0\x00\x1c\xd0\x09\xc8\x31\x48\x43\x72\x24\x8a\xc2\x19\x5a\x12\x49\x35\xc0\x7b\x98\xf4\x80\x37\x9a\x05\x48\x54\x92\xf0\xbb\xd0\x87\x86\xd2\x7f\x6b\xf0\x07\xa6\xdc\x51\xb3\xff\xaa\xd9\xd7\x79\x3a\x32\x3b\xfe\x71\xd3\x7b\x9e\x5a\x33\x3f\x29\xd6\xcf\x3a\xa6\xc8\x9a\x43\xf8\xf6\xf7\x90\x51\x83\x79\x63\x96\xf3\x3f\x4e\x28\x64\x4b\x6c\x5b\x05\xb8\xf8\x47\x1c\x20\x9b\xf7\x21\xf8\x2c\x00\x17\xff\x8c\xb3\x70\x1d\xb3\xbf\x4b\xb4\xe2\x7a\x81\xa0\x04\x84\xb3\x61\x7f\x9c\x10\x81\xcf\xcc\xe8\x6d\xd6\x38\x86\x95\xf5\x75\xee\xe0\x92\xf2\x4a\x8f\x7f\x42\xb5\x23\x61\x5c\x83\xd1\xd2\x87\x7f\x13\x03\x12\xea\x45\x51\x1e\x72\x43\x29\xd4\xaf\x7a\x85\x0c\xef\x89\x64\x22\xf8\xa7\x2f\x93\x0c\x2b\x30\x00\x43\x0c\xa3\x45\xf8\x18\x19\x42\x51\x14\xa6\x63\x44\x40\x42\x7d\x28\x2e\x40\x16\x0a\xe1\x2c\x40\x14\x0f\x13\x84\xa8\xa0\xde\xa4\x16\x4d\x27\x35\x6f\xdc\x08\x2c\xd1\x50\x5f\x84\x64\x65\x91\xe9\x19\x64\x39\x9e\x0f\xa9\x51\xaf\xaa\xa0\x9e\xee\x68\x34\xa5\xa0\xe8\x40\xb4\xc7\x3a\x03\x5f\xef\xff\x36\xd6\x85\x67\xa7\x40\x90\x88\x8e\x1f\x56\xee\xb0\x01\xc2\xc1\x9a\xc3\xb8\x7a\xae\x9a\xab\x01\x28\x19\xba\xf3\xb0\x1f\xc3\x6f\x72\xc9\x0d\x1b\x1e\xfb\xc8\xa5\x4b\x94\x60\xcd\xa9\x17\xf1\x7d\xc4\xd9\x36\xdc\xb4\xf3\x3b\xf1\x1b\x65\xf5\x46\x87\xad\x18\xcd\xf5\x73\x6c\x9d\x43\xfe\x38\xfa\x57\xad\xbc\xc8\xb7\x64\xeb\xfc\xdf\x27\x76\xe8\xf3\x1c\x36\x21\xb8\xf0\xe0\xb5\x43\x5d\x1c\x98\x74\x25\x7e\x07\x11\xce\x36\xf8\x35\xe2\x7e\x47\x3e\x23\x0a\xd4\x80\x79\x60\x11\x10\xc0\x35\x46\xce\xcb\xea\xba\xd2\x2a\xfd\xaf\x0f\xd7\x51\x2a\xd5\xd9\x3d\xb7\x11\xca\x70\xc2\xf5\x6a\x17\x35\xed\x34\x25\x0d\x8d\x3a\xa9\xcb\x1a\x1a\x6b\x6a\xab\x08\x23\x4d\xbb\x0f\xd7\x4b\x79\x94\x18\xfc\x32\xe0\x3d\x5b\xd3\xee\xd3\x77\x78\x66\xae\xaf\xfb\x0c\xe7\x51\x55\xdf\x34\xed\xb2\x5b\x6e\xbb\xa5\xe2\x96\xcd\xf5\x53\xc4\x14\x12\x59\x28\x23\x29\x23\xd9\xd4\xee\x8d\xf3\x6c\x98\x24\x51\x14\x29\x94\x2a\xa3\x7e\xb5\xbb\xa7\x8f\xa6\xfa\x59\x5f\x48\xec\x45\x2c\x0b\x23\x90\x16\x51\x3f\xe2\x79\x98\xf4\x8e\x89\xdc\x95\x49\xc1\x19\xea\x3e\x15\x3e\x80\x62\x50\xcb\xbc\xb2\xe6\xd2\x91\x0f\x8e\x5d\x42\x7c\x73\xd5\xc6\x2b\xef\x9b\xba\x6a\x6d\xd3\x72\x6e\x79\xd3\x2a\x61\x79\x33\x55\xd1\x48\x6e\x64\x97\xaf\x82\xef\x64\x96\x07\xc6\xd1\x34\x0f\x5f\x58\xf5\xe4\xc6\xfb\x78\x71\xd5\xe1\x55\x1b\x57\xb9\xea\x66\x61\xbc\x9e\x38\x53\x9c\x9e\x6a\xae\xe6\x72\xd8\x49\x1f\x75\x95\xc3\x96\x70\xf0\xcb\x31\x35\x5f\x5f\x99\x74\xbe\x21\x5f\x2f\x99\xfd\x5c\x6f\xc3\xc9\xdc\xb8\x41\xff\x23\x2b\x00\x48\x5b\x67\x12\x27\xdf\x5d\xe7\x38\x93\x63\x7d\x75\xd8\x78\x23\xb6\xd2\xe1\x0f\xc2\xf0\xdd\xd5\xf8\x0c\x1f\xb0\xdb\x9b\x3e\xb0\x23\x93\x5d\xf0\x5c\x7e\x72\x5c\x8b\x40\x1f\xc5\xde\x07\x0e\xfc\xa8\x2b\x8a\xe3\xe7\x68\xae\x3e\xec\x65\x0e\xf8\xc2\xa3\xb7\x0e\x20\x6e\x15\xfb\x82\xcd\xc3\x78\xcd\x47\x9f\xc4\xef\x32\x0c\x8c\x5c\x5b\xac\xbf\x23\xb7\x16\xc7\xd3\xb1\x6b\xed\x75\x98\x36\x9a\xb9\x6e\xf1\x2b\xe8\xb3\xbc\x38\x9e\x4e\xe5\xf6\x6d\x00\xfb\x3a\x6a\x4f\xfc\x06\x80\x74\x28\x58\x7b\xe2\xbf\x00\x18\xca\x18\x3b\x15\x7f\xaf\xd9\x88\x71\xdc\x5d\x49\x7f\xca\x7d\x36\xfd\x1b\x41\x27\x2e\x39\x17\xee\xaf\x31\xf5\xd0\xda\xec\x52\xff\xa3\xc4\x66\xbc\xe3\x46\x83\x71\xa0\x1a\xcc\xc5\xd9\x00\xae\xce\xc5\x76\x96\x1b\xcf\x88\x26\x40\x47\xb1\x21\x5c\xdd\xe0\x5f\x6f\xb9\xaa\xfa\xba\x52\x58\x53\x5b\x49\xf8\x1b\x9c\x5b\xce\xf7\xae\x8c\x2e\xc9\xbc\x5f\xb2\x1e\xad\xf6\xdc\xf0\xa5\x0f\x4e\xf5\x6c\x44\x17\x79\x1a\x32\x3f\xf3\xbc\x09\xa7\xc2\x5a\x1e\xfd\x1c\xfd\x3c\x73\x66\xe3\x5f\x51\x87\x08\xa7\x96\xfc\x4c\x7a\x0f\xdd\xcf\xc1\x8d\xe8\xe6\xcc\x52\xcf\x5d\x99\x47\xf0\xcf\xbb\x71\x9e\x93\x28\x0a\x1d\x41\x9b\x6b\x97\xf3\x1f\x3e\xed\x59\x45\xd3\xe8\x33\x96\xf9\xb0\x64\x8b\x34\x88\x36\x2f\x87\x4f\xc2\x71\xba\xa8\x5e\x21\xc2\xb7\x3c\x9f\xdd\xdb\x30\xb6\xe9\xa1\x4d\x0f\x3d\x04\xdb\x27\xa0\xfa\x4d\xa8\x6f\x2c\xff\xd0\x92\xc9\xb7\xae\x58\xd1\xf0\xd0\x04\xe2\xee\x35\x8f\x5d\xb3\xe5\x8a\xeb\xd7\x2f\x5c\xb3\x70\xcd\x15\xeb\xaf\xb8\x66\x4d\xed\xd4\xa9\x23\xd6\x37\x5c\xb1\xde\x53\x9a\x99\x34\xb5\x76\xe1\xd4\x80\x67\x58\xcb\xb1\x35\x5b\x6f\xd8\xb1\xfe\xe0\xd5\xf7\xdc\x50\x04\x8f\x57\xe7\xf3\xaa\x01\x3f\xfc\x35\x1b\x2e\xb8\xda\x5f\x05\xf2\x7c\x81\x9d\x38\xf6\xdc\x96\xb5\xb7\x64\x67\xeb\x36\x29\xd9\xf2\xc4\x7d\xbf\x7d\x85\xfb\x78\xf2\x6a\x72\xe1\xe1\x40\x76\x18\xf7\x68\x53\xab\x2d\xa3\xb1\xcf\x62\xef\xf5\xb9\x3d\x01\xce\xc2\x36\xa2\x86\xe3\x8a\xcf\x02\xe3\x01\x0d\x38\xb0\x10\xdc\x08\x64\xb0\x01\xdc\x09\x36\xe3\x17\x18\x3a\xad\x4a\x2a\xfc\x35\x93\x71\x26\x49\x02\xe7\xf0\xa8\xd6\x29\x62\xbc\x28\x9b\x60\xbc\x28\xc3\x07\xda\xaa\xc6\x6a\x33\xfd\x83\x7f\x54\x05\xe1\xaf\xa8\x2a\xad\xfa\x2a\x62\xe7\x68\x5d\xd6\xd0\x58\x5b\xe9\x92\xae\xb0\xa1\x71\x54\x85\x27\xa2\xf4\xa0\x7e\x09\xd2\x5e\x19\x0a\x7d\x62\x2f\xea\x41\x72\x44\xf2\x70\xd7\x1d\x84\x14\x94\x18\xc4\xa2\x04\x1a\xd4\x15\xa3\x3c\x28\x0b\x61\x25\x0c\x15\x31\x1c\xfd\xf1\x7c\x04\x10\xe3\x4b\xa8\x7f\x5d\x87\x5e\xf8\x35\x1f\x96\x7e\xa1\x25\x84\x83\xf7\x24\x9e\xbb\xe1\x4f\xaa\x2f\x22\xf4\x20\x9e\x81\x11\xc4\x67\x44\x5c\xf2\x13\x97\xfd\x54\x18\x4a\xd6\x25\xb2\x4c\x29\xe2\x80\x9a\xec\xed\xa3\x50\x0f\xe3\x63\x84\x14\xa2\x19\x18\x85\x21\x01\x0d\x20\x96\x83\xa9\xf4\xd6\xd8\x0b\x27\xef\xf3\x04\xb8\xb8\x28\xc9\x32\x2f\x87\xc3\xbc\xc8\x8b\x61\x99\x17\x02\x4a\x40\xbe\x6e\x9a\x1a\xe2\x18\x96\x63\xe5\x38\xcf\x33\x2c\x0f\x05\x18\x47\x3d\xd3\x6e\x15\x58\x96\xe7\x67\x4d\xe3\x27\x4d\x9b\x45\xcd\x82\x21\x4f\x4a\x90\x78\x99\xe5\x45\x46\xa4\x45\x46\x62\x18\x8e\x62\x49\x99\xe2\x24\xa8\x65\xba\x49\x8a\x62\x60\x44\x94\x45\x99\x93\x44\x85\x97\x79\x04\x28\x6e\x62\xa3\x53\xc6\xda\xfc\x70\xc0\x5b\x7c\xcf\xef\x7f\xcd\xa5\x4b\x6d\x78\x5b\xef\x57\xe8\xd8\x65\x2e\xff\x4d\x8e\xdf\x96\x3a\x64\x93\x53\x36\x2e\xc9\x1f\x37\xf6\x53\x5d\xce\x1d\xc3\x55\x2b\x55\xa1\xa8\xbc\xbe\xd2\xfe\x0e\xe3\xf8\x0e\xa1\x5e\x51\x7c\x0f\xa8\x97\xdb\xf0\xd9\xfe\x76\xdc\x5e\x3f\x1b\xb7\x3c\x77\x12\xf6\x37\x1d\x6c\x88\x92\x0b\x9f\x98\xfe\xe5\x0f\xb9\xd9\x8d\x27\xcd\xef\x46\x1d\x7d\x5e\x96\xbf\x7e\x03\x1e\xeb\x71\x8c\xe5\x94\xa9\x8b\xf3\xcf\x6e\x78\x2c\x42\x5d\x94\x2f\xff\xcc\xfe\x2f\xb5\x75\x21\xed\x9a\x33\x7e\xdb\x0a\x48\x2c\x4b\xf7\x12\x11\xe0\x05\xc3\xc1\x28\x9c\xa7\xbe\x06\x5c\x0c\xa6\xe3\x7d\x75\x19\x58\x0a\x36\x82\xbb\xc0\x3d\xe0\x01\x2b\xbf\x62\x6d\x43\x63\x75\xa3\xef\xe2\xea\x89\xb0\x82\xf0\xfb\xfc\x75\xf5\x3e\xc2\x5f\x69\x3e\x74\x33\x7e\xd7\x8d\xb4\xca\x3d\x52\xb0\xae\xb4\xba\xc2\x57\x6b\xfd\x71\xb4\xfa\x1f\x44\xea\x57\x58\x31\x10\xf8\x3e\x3d\x53\xa6\x6d\x0f\xa9\xdb\xd1\x3f\x29\xd8\x41\xc3\x8b\xd2\x97\x97\x4c\x0a\x6d\x8f\xc2\xd2\x50\x32\xb3\x2b\x76\xc4\xf3\x48\xfa\xdd\xd8\xc3\xec\xf6\x98\xa7\x33\xf6\xf0\x25\x6a\x0c\x6e\xd7\xa4\x89\x6c\x40\x09\x09\x02\xca\x0e\x9d\xab\xc2\x6f\x92\xa8\x81\xf7\xdc\xae\xc1\x9b\x47\xa3\x29\x1c\x7a\x28\xf1\x30\xbb\x3f\xe6\xe9\x8c\x6f\xbf\x44\x3b\xe2\x79\xe2\x3f\xb5\x81\x48\xb4\x7c\x63\x5d\xe9\xe8\xf1\xb3\x66\x5d\x3e\xfe\xc2\xf1\x75\x17\xbc\xbe\x7d\xfc\x68\xf5\xc2\x0b\xae\x9e\x39\xfe\x72\xfc\xbb\xee\xf9\xa3\x6d\xe3\xdb\x5a\xe0\xa7\xe8\xe0\xf8\x8d\x33\x67\xc2\x23\xe6\xdf\xca\xf1\x75\x97\xd5\x8d\xbf\x0c\xff\x26\x28\x29\x2c\x44\x18\x49\xe6\x44\x4e\xe4\x24\x41\xe4\xa9\x10\x4b\x86\x59\x51\x82\xbd\x19\x21\x40\xe9\xf6\x52\xb7\xa4\x85\x23\xbc\x28\xc5\xa5\xb0\x04\x86\x83\x70\xb6\x1e\xdb\x94\x65\xa0\x02\x9c\x8b\xb3\x62\xd6\x99\x51\x6a\xcd\xe0\xeb\x60\x1d\xb8\x0d\x7c\x03\x00\xe7\x69\xca\x78\x7f\x38\x1b\x5a\x4f\x67\xcb\xf3\x8e\x5a\x3a\xdc\x87\xc1\xba\x94\xb4\x5a\xfd\xff\x4b\x34\xb7\x70\xf4\x85\x45\x91\x93\x42\xf3\xae\xe6\x11\xa8\xbb\x3e\xac\x45\xe0\x00\x22\xf5\x9f\x92\xeb\xaf\xbb\xee\xba\x07\x2f\x78\xe2\xba\x99\x99\xbd\x4f\x5b\xc5\xa8\xd0\x8f\x32\xc7\x9f\x7d\x16\x9e\x42\x97\xe9\x3f\xbe\xe5\x52\x37\x12\x74\x8a\x88\x4e\x11\xa8\xe9\x14\x09\xa1\x18\x92\x31\x45\xb4\x64\xaa\x9f\xa2\xb2\x80\xf3\x51\x62\xbf\x4e\x40\x05\x52\x3a\x49\x04\x1e\xf6\xc2\x47\x91\x24\x70\x01\x99\x94\xc8\x95\x97\xf3\x8a\x32\x10\xe3\x7b\x79\xd6\x3b\x39\x3d\xfb\xf2\x65\xc4\x9d\xc4\x32\xf8\x26\x7c\xf3\xfb\x97\x0f\x5d\x75\x15\x5c\x8d\xa6\x67\x6e\x2b\xb9\xa6\xeb\xf2\xa1\xab\xbc\xe9\xd5\x2b\x16\x85\xa7\x2d\xbd\xb6\x7e\xd1\xac\xc5\xd3\x96\x2d\x5a\x3c\xeb\xfc\xf3\xeb\x47\xad\x9e\xbc\x74\x19\x7c\x2a\xd3\x39\x62\xd4\xf9\xd5\xf3\xe0\x96\x6b\xef\x5b\x16\x9e\xbf\x74\xc5\x13\xcb\x6e\x5e\x0d\x30\x0d\xa6\x61\xbd\x64\xd8\xf5\x63\xf0\x99\x9d\x06\x93\x00\x03\x1a\xc0\x32\xb0\x02\x48\xa0\x05\x80\xea\x72\x5f\x7d\x75\x45\x75\x7d\xb5\x7e\xde\xfd\x7f\x0e\xe5\x5e\x12\xf6\xa1\xf3\xbc\xb0\x2f\xa3\x7a\x7d\xe9\xa1\x92\xdf\xfc\xbf\x80\x68\x91\xf7\x2e\x8e\xf2\xde\x05\x2b\xd1\x1a\xef\x8b\xe9\x1b\x17\x09\xc4\x46\x42\x80\x2f\xc2\x17\xba\x16\x7d\x26\x08\xf0\x2a\xb4\x28\xf3\x48\xc9\xa4\xe3\x8b\x3e\x13\x4a\xce\x93\x25\x41\x61\x45\x89\x15\x38\x81\x15\x05\x81\xa3\x28\x36\x24\x33\xa2\x08\x13\x19\x95\x0c\x51\x34\x0f\xa3\x92\x2a\x2a\xbc\x28\x45\xc5\xb0\x9c\x2f\xef\x70\x34\x55\xec\x67\xb6\x5c\x63\x0c\xdf\x96\x29\xef\x9a\x1d\xfe\xd7\x98\x43\x3e\x2e\xb4\xe5\x23\x89\xef\x6c\x5a\x4e\xdd\x0a\xe6\x70\x60\xc2\x5b\xc1\x96\xa7\xe6\x81\x5d\x1c\x98\x72\x75\xb0\x59\x97\x8d\xf0\x38\x07\xa6\xcc\x2f\x2a\x63\x17\x38\x64\x6f\xd4\x01\x9f\xef\xd0\x31\x71\x07\x7c\x9e\x79\x2e\x57\x8d\xba\xc1\xc0\x0b\x4a\x41\x35\x98\x0e\x40\x59\xde\xa9\xae\xa1\x1e\xe2\x5a\xf4\xe5\x55\xd8\x06\xad\xab\xaf\xaa\xc7\x99\x6c\xed\xc0\x51\x1b\xa6\x46\xa3\x04\x1f\x15\x14\x49\xa4\x24\x89\xa6\xce\x44\x3d\x11\x34\xd8\xdb\x0b\x03\x19\x65\xa0\xb7\xb7\xdf\xd3\xe3\x91\x06\xfa\xfa\x06\x33\x6a\x7f\x5f\x5f\x2f\xa1\x0c\xf6\xf8\xd9\x2f\xa3\x61\x31\xa4\x85\x28\x96\x20\xd5\xa8\x16\xd5\xb4\xa8\x16\x55\xd5\xa8\x16\xd3\xb4\x98\x16\x05\xa6\x2f\x02\xc7\xf3\x25\x4a\xf4\xf3\xc1\xb1\x97\x1e\xdc\x32\xf3\xfa\x06\xe3\xdd\x97\xfb\x33\x22\x61\xe9\xf1\x1c\xdc\x83\xe1\xa0\x00\x0e\x30\x1c\x16\x87\x9f\xcc\x16\xc0\x71\xff\xea\x5c\xdc\x91\x1f\x68\x06\x1c\xcb\x34\x0e\x5c\x01\x96\x82\x16\xf0\x4d\xe3\x85\xad\xbe\x07\x74\xe3\x8d\xf4\xd6\x36\x04\x4b\xeb\x1b\x7c\xe5\x75\x53\x75\x73\xce\x48\x2f\x5d\xe1\x33\x93\x7c\x56\x8d\x80\xa5\x0d\x8d\x15\xfe\x8a\xc6\xfa\x46\xfc\x61\x63\x99\xe1\x3b\x72\xa2\xdd\x3c\x6a\xdb\xa8\xaf\xb4\x51\x5f\x00\x23\xbe\xc5\xff\xfe\x14\x8c\x69\xaa\xaa\x85\x17\xd7\xbf\x9a\x41\x8f\x12\x9f\xc2\xc5\x1f\xfc\xf2\xfd\xdf\x8d\x4a\x7f\x3e\xe6\x37\xa9\xd4\x26\xaf\x98\x5c\x47\x7d\xe0\x5d\xa3\xf4\xf6\xae\xf3\xf4\xf5\x79\xdf\xd1\x78\x89\xa6\x42\x14\x1d\x0a\x7d\x99\xd0\xb4\x1e\x8f\x92\x05\xfd\xfd\x90\xcc\xc8\x30\xd0\xd7\x37\xe8\xe9\xcd\x03\x94\xdc\x14\x16\x42\xbd\x11\x7d\xf7\x21\x15\xf5\x0b\xb7\x43\x05\xd2\x7f\xa1\x96\x45\xa3\x6b\x50\xeb\x36\xb4\xf7\xf1\xf3\x36\xad\xdc\x14\xea\x82\xd2\x53\x94\x17\x46\xe8\x73\x16\xcc\x4c\x10\xb7\x7b\x11\xa5\xa2\xbf\x0d\x83\xde\xc7\x4b\x8e\x7d\xa9\xca\x42\x40\x0d\x50\x2c\x21\x0c\xf6\xf8\x43\x32\x2f\xf1\xb2\xfb\x17\x7e\x83\xe4\xc4\xed\x58\x30\x0b\x2c\x02\x57\x80\x1b\xc1\x5d\x5f\x89\xdd\x5a\x5f\x45\x63\xfd\x08\x58\xea\xbb\xa8\xcc\xc6\x63\x59\x01\xc2\xff\x23\xcc\xbe\xfb\x23\x18\xd3\x22\x9a\x26\x2f\xae\xff\x0e\x1a\x71\x07\x91\x79\xc7\xbb\x3e\x90\x82\x33\x7d\xa9\xd4\x1d\x9e\x54\xca\x0b\x67\xbe\xf6\x93\x9f\xfd\x68\x78\x66\x8c\x8e\xe8\x92\xe4\xff\x1a\xb1\xf2\xc2\xf1\x7d\x05\x88\x9d\xa7\x69\x5e\x8d\x78\xe4\x73\x2f\x14\x7c\x99\x9f\x44\xd1\x27\x41\xe8\xdd\xeb\x61\xd1\xf3\xdb\xd0\x96\x6d\xd5\x5b\x6e\xda\x44\x1d\x83\x91\x12\xea\x7f\xc6\x2a\xbe\x83\xb4\xf8\xd8\x87\xf9\xd8\xba\x47\xe9\xcb\x4a\x7e\x4e\x87\x9f\xf8\x03\x86\xe3\x7b\x14\x70\xb6\x55\xbb\x05\x04\x41\x35\x98\x09\x96\x80\x6b\xc1\x2a\x70\x1b\x78\x1c\x3c\x05\x76\x83\x67\xc1\x31\xec\x7b\x36\x1f\xf8\xdb\xf9\x30\x7c\x15\xee\xfc\x18\x8d\x15\x0d\xd0\x2c\x82\x60\xe4\xb7\xaa\x32\xab\xa0\x54\x17\x85\x5a\x15\x91\x7d\x76\x90\xb9\xbb\xaf\xea\xba\x72\xc3\x21\x58\x6e\x38\x98\xeb\xea\xfd\xf8\x6f\x7d\x5d\x69\xa5\xa5\x5e\x8c\xdf\x1e\x5d\x29\x19\x75\xa9\x71\x52\x44\xef\x62\x59\x14\x39\x81\xe1\x22\xbc\x20\x44\x64\x86\x17\x79\x1e\x86\x39\x8a\xe1\x39\x5e\x10\x45\x95\x11\x38\x96\x63\x93\x3c\xf4\xa5\xd4\xde\x54\x44\x16\x04\x41\x0d\x85\x25\x8d\x4b\x0e\x51\xfd\x91\xde\x54\x44\x12\x78\x21\xc2\x89\x52\x94\xed\xf6\x53\xda\x19\xa0\x79\x58\x8e\x61\x19\x1e\x52\xa2\x20\x25\x79\x51\x96\x15\x56\x16\xe5\x30\xd7\x2f\x65\xfa\x23\x21\x9e\x61\x69\x06\x72\x34\xc5\xf2\x4c\x32\xc0\xf1\x2c\x43\xab\xe9\xa8\x2f\x2c\xc6\x50\x9c\x83\x34\x24\xa5\x7e\x14\x17\x60\x18\x06\xa4\x7e\x24\x08\xb0\xfb\x4c\x8f\xe6\x09\x67\x34\x8f\x42\x21\x05\xc5\x79\x62\x3c\x45\x33\x0c\x47\xd3\x9c\xc0\xd0\x1c\x25\x84\x68\x2a\xd4\x23\x50\xa1\x10\xcd\x33\x14\x4d\x0b\x21\x8a\x0c\xf1\x1c\x0d\x87\xab\xaa\x22\xcb\x61\x89\x47\x03\x10\xf0\xb2\x1c\x8e\x28\x3a\x44\x0a\x8b\x18\x22\x09\xe1\xb0\x82\x58\xd4\x17\x8f\x43\x2a\x42\xd3\x2c\x43\x87\x18\x41\x88\x08\x02\xc7\x73\xa2\x7e\xba\xe2\x23\x7c\x48\x26\x29\x86\xa5\xa9\x3e\x3a\xc4\x30\x5c\x9c\xd4\x1b\x51\x2a\xa2\x61\xaf\xa4\x48\x2a\x17\x96\x13\x92\x2a\x49\x72\x16\x08\x11\x29\xce\x28\xaa\x18\x66\x28\xde\x38\xeb\x9a\x75\x96\xc1\xf9\x60\x1a\x58\x84\xeb\xb0\xdf\x02\x1e\x04\x8f\x81\x6f\x83\x28\x38\x68\xe7\x4c\x31\x54\x44\x3d\x56\x12\xe5\xa6\x9a\xd0\x89\xea\xfb\xbf\x83\x35\xc2\x0a\x49\x42\x29\x35\x38\x28\x29\x99\x1e\x45\x1e\x18\x90\x29\x5a\x90\x3d\xe4\xff\x25\x9c\x10\x09\xd1\x94\x2c\x85\x63\x4a\x6f\xaf\x12\x0b\x4b\x74\x48\x14\x98\xff\xef\xa8\x4e\xe0\xda\x49\x12\xc1\x9a\x76\xe4\xb9\x60\x3c\x60\x0c\xaf\x70\xc5\x57\xdd\x8a\x18\x34\xcb\xa5\xaa\x2c\xad\x2a\xad\x8c\x11\xdd\x5f\x72\x29\x1f\x75\xa6\x2f\xea\x1d\x4c\x07\x7c\x9c\x2c\xc9\x1a\x9d\x94\x98\x33\x89\x98\x87\x11\xe8\x28\xc5\x8b\x9e\x80\xc0\x25\x78\x1e\xb2\x48\x8c\x21\x91\x60\x35\x05\xf1\x5a\x14\x49\x99\x90\x24\x85\xa2\x21\xc1\xc3\xa4\x7b\xbd\xc9\xa4\x18\x66\xc2\xd2\x40\x44\x65\x14\x29\x8a\x06\x20\x69\x9e\x31\x71\xac\xc7\x2e\x1c\xb3\xa7\x36\x39\xee\xaa\xb1\xbd\xb4\xff\x76\xfc\x0e\xc2\xca\xcb\xa6\xd9\x6f\x22\xf1\x7b\x1f\x75\x8e\xe9\x93\xd3\xcf\xf0\xdf\x27\x14\xe0\x07\x23\xc0\x38\x30\xd3\xac\xbc\xd7\x02\xd6\xe9\xa7\x15\xa3\x8e\x93\xaf\x8e\xf4\xf8\x6a\xe7\xc0\xc6\xba\xf2\x91\xf8\xb2\x87\x30\x2a\x89\xe2\x5a\x50\x66\x82\xbf\x5c\xbe\xf8\xca\xfa\xca\x86\x7a\x1c\xd7\x66\x61\xab\xcc\xa8\xb6\xe6\x0c\x64\x20\xfc\xfa\x37\xab\xea\x2b\xeb\xeb\x6a\x2a\xea\x1a\x2b\x47\xf9\x2b\x77\xa3\x29\xbb\xe1\xb0\xe8\x67\x28\x2b\x7c\xf6\xbd\xd8\xf6\x25\x22\x15\xd8\x1e\xa2\x2b\x13\xbb\x2f\x1d\x82\xf0\xfc\x2d\xb0\x02\x7d\xec\x87\xb3\xd0\xe1\xe4\x53\xe2\x63\x4f\xad\x42\xe8\xd2\xcf\x97\xa0\xdf\xc1\xa5\x7e\xf4\x3b\x96\xe8\xff\x32\xd4\xef\x0b\x9c\x19\x8c\x7a\xfb\xd2\x54\x0c\x25\xa2\x84\x2a\x4b\x2c\x4f\xc9\x0c\x83\xe2\x34\x35\x80\x84\x18\x92\x7b\xa9\xee\x3e\x0e\xc5\x29\x62\x1d\x3a\x1b\x3e\x84\x22\xf0\xd3\xef\xa3\x57\xd0\x99\x31\xeb\xc7\xbc\xd2\xfc\xc7\xc9\xd4\x1d\xd4\x6e\x8a\x9a\xd4\xec\x39\x57\x51\x22\x92\x2a\xc8\x8a\x22\xc4\xa4\x88\xa8\xa9\x34\x9b\x49\xad\x5b\x80\x32\x2b\x2f\x47\x31\xb4\xce\x13\x40\xdb\x2f\xbb\x3c\xf0\x4d\xff\xfc\x77\xeb\x1b\xd6\xbd\xf4\xd2\xba\xd9\xb3\xd7\xd5\x9b\xf6\x68\x52\xc7\xef\x7e\x5c\x27\x73\xff\x11\x07\x3d\x76\xdb\xf4\xf0\xc7\xde\xf1\xee\x36\x7d\x6b\x57\xe0\xfb\xa3\xb5\x4f\xed\x02\x00\xae\xe4\x40\xdd\xb4\xe0\xc2\xce\xeb\x7c\x9f\x71\x80\x5d\x69\xc7\x94\xa9\xc1\x9a\xfd\xb8\xd6\xc3\x7e\x67\x0d\x68\x23\x7e\x1b\xdf\x3b\x77\x5e\x67\xde\x9d\x2a\x59\xd1\x9f\x24\x22\x80\x02\xd5\xf8\x96\xb2\x0e\x2c\x30\xea\xb8\xe8\x98\x1f\x55\x49\x19\x64\xab\xa4\x6a\xc7\xd7\xd4\x97\xea\x02\xa2\xac\xb2\xb4\xb2\x01\x56\x36\xd4\x4f\x84\x23\xfd\x95\xf5\xb0\xb2\x71\x22\x24\xfc\x56\x6a\x1b\xab\xc2\x8b\x2e\x7b\xbc\x52\x82\xf5\x0c\x66\x54\x0e\x02\x48\x4a\xa1\x28\xc5\x0b\x28\x8a\x7a\x48\x81\x4f\x66\x52\xa2\x87\x8a\x65\x7a\x3d\x24\x8d\x64\xd8\x1b\x40\x94\x27\x12\xf0\x04\x86\x22\x30\x41\x21\xc6\x13\x0e\x90\x1e\x3a\x24\xf3\x0a\x19\xea\xe9\xa3\x15\x41\xe3\x05\x59\x0e\xd1\x44\x84\x89\xa4\xb5\x4c\x1f\x1d\xa2\xa3\x5c\x0f\x4d\x07\x44\x01\x76\x23\xa9\x2f\x9a\x82\x31\x6f\x58\x44\x6c\x38\xac\xc8\x7d\x99\x44\x9f\x22\xf7\x21\x52\x8b\xf3\x0c\xc3\x87\x22\x0a\x04\x4c\x52\x21\x69\x96\x71\xc5\x6a\x9c\x26\x00\x20\x9b\x8f\x86\xb2\x37\xc3\x31\xf3\xe7\x4d\xbb\xda\xe9\x9b\x3f\x8d\xed\x62\x75\x76\x7e\x7c\xc7\x69\xe3\xee\xca\x8a\xfb\xb0\x73\x7c\x9c\x1c\xd2\x6d\xef\xf6\x75\xf7\x82\x59\xd7\x72\x45\xbf\x73\xda\xe7\xf2\xff\xab\xc1\x9a\xd3\x38\x6f\xc7\xe9\x92\xfc\x7b\x81\xd3\x38\x76\xfa\xb4\xc7\x41\x37\xa3\x3d\xf8\x8a\xf6\xc6\x5c\xdd\xf9\x5e\xad\x39\x11\xea\x0c\xfb\xfe\x82\x33\xde\x21\x9d\xfc\x03\x8e\x73\xc4\x19\x3a\xcf\xb9\xa8\xe8\x77\xa6\x17\xf4\x85\x65\xc5\xc9\x21\x07\x1c\x9f\xcf\x4e\xa6\x0b\xe0\xce\x7e\xd8\xaf\x80\x37\x7e\x05\xbc\xe1\x2b\xe0\xf5\x8e\xbb\x3f\x23\xc7\x22\x1e\x77\xbf\xf5\x56\x6b\x5c\xf6\x46\xff\x3e\xe2\x19\x72\x6d\xfb\xd9\x20\x09\x3a\xa7\xb7\x4f\xff\x51\x90\x38\x39\xf4\xde\x98\x22\x7d\x4d\xfb\x8a\x31\x9c\x35\xda\xf6\xdb\xf0\xe6\x5d\x6d\x70\x02\xf8\xa8\x61\x43\xc3\xcb\x36\x0e\xd5\x60\x4d\xfb\x87\xf8\x3b\x17\x17\xe5\x03\x42\xbd\xe8\x2b\xc6\xb0\x6a\xec\x6e\xca\x36\xf8\xb7\x13\x9b\xc9\xb5\x3b\x27\x66\x3e\xcb\xa2\x3a\xad\xa9\x99\x6c\xde\x1f\x01\xf1\xec\x1f\xa7\x67\xb9\x95\xe6\x77\x39\xa3\x8e\xdb\xc9\x4f\xf0\x77\xa7\xba\x70\xa0\xcb\x05\xfc\x1e\x4e\xc5\x71\xb5\x60\x18\x90\x70\x0e\x38\x0d\x0c\xc7\x15\x3a\xce\x05\x14\x98\x00\x2e\xc0\x1e\x8c\x59\xb9\xdc\x46\xfa\xa6\xf6\xd7\x02\x5d\xdf\x54\x12\xde\xca\xfa\x89\x38\x2d\x81\xf9\xb7\xcc\xf1\x7e\xb1\xda\xe1\xef\xf3\x24\x63\x34\xe3\x49\xb2\x2c\x54\xce\xa8\x51\x01\xc6\x38\x4f\xb7\xc0\x64\x22\x32\x0b\x7b\x11\xed\x09\xc3\xd4\x50\xb7\xf5\xaf\x70\x5c\x8e\x49\xf1\x21\x5e\x0b\x2b\xaa\xea\x1d\x88\x70\x71\x4e\x41\x7d\x32\x1d\xa7\x25\x42\x63\x38\x4e\x95\xc5\xb4\xe2\xa5\x25\x0d\x06\x7a\x25\x31\x8c\xd8\xfe\xfe\xfe\x4c\xbc\xbf\xbf\x1f\xf1\x5a\x5c\x8a\x6b\xa2\xd0\x1b\x51\xb4\xa8\x1a\x67\xe3\x5a\x48\xd3\x98\x98\x0a\x9c\xb9\x62\x3a\x71\xfc\xd0\xc9\x5b\x6c\xfc\x9a\x79\x52\x4f\x37\xb9\xf2\x5b\xdf\x9d\xe5\xfd\xd7\x13\x11\x72\xed\xa9\xda\xec\x7a\x00\x16\x5c\xc8\x01\x72\x61\xeb\xfb\x0c\x98\x07\x38\xdd\x36\xe3\xb3\x63\xfd\x0f\x10\x11\x70\x8e\xa3\x22\x8d\x71\xeb\x3e\x13\x2c\x36\xab\x58\x11\xfe\x3a\x8c\xac\x86\x8a\x86\xc6\x2a\xc2\x6f\x55\xa0\x81\xe6\xdf\xb2\x22\xb9\x1c\xca\xfd\xd3\x6a\xe1\x28\x50\xe1\x9d\x02\x6b\xbd\x1e\xe8\x0d\x96\xd5\xd4\x42\x45\xd3\x4d\x1c\x36\x99\x91\x58\x21\x35\xc8\xd1\xfd\x0c\xcf\x47\x22\x10\x47\x60\xe8\x7f\x54\x81\x56\x29\x2e\xd3\xa3\x32\x6c\x84\xf3\x50\x2c\xa9\x92\x0c\x47\xab\xb4\xb7\xff\x5e\x78\x56\x74\xe2\x8c\xbb\x16\x3c\x7e\x10\xfd\x63\x54\xff\xce\x29\x17\x10\x11\x26\x1c\x91\xc5\x74\xbf\xa7\x9b\xd5\xfa\xfa\x24\x51\x94\x50\x22\x95\x4a\x65\xfa\x7b\x7a\x7a\x90\xaa\xc6\xe9\xb8\x4a\xd2\xa8\x3f\xc9\xf7\xa6\x12\xdd\x54\x4f\x22\x90\xec\x0b\x0c\x44\x7d\xeb\xcf\x0c\x3d\xbf\x12\x5d\x39\xe5\xcc\x90\x67\x7a\x86\x46\x2d\xf0\x55\x78\xab\xa7\x4a\x5d\x69\xf3\xa8\x91\x0f\x07\xe7\x50\xe9\x1c\x96\xcf\xbb\xa7\x71\x6c\xd6\x73\xbb\x1c\x70\xfc\x9e\xad\xf5\x03\x1c\xbf\xf0\xbe\x03\x8e\xe3\x76\x4e\x30\x38\x1f\x5b\x93\x03\xae\xe4\x68\x74\xa2\x32\x7f\xcf\x1c\x24\x70\x2d\x6b\xec\xf1\xd7\xdb\x38\x6b\x4d\x9e\x9e\x4d\x81\x60\x2e\xaf\x82\x9d\x73\xe7\xb0\x5c\x30\xd7\x84\xd1\x5e\x87\x77\xec\xce\x1f\xc3\xc8\x8f\x65\xcf\x29\x62\xad\xa1\xeb\x06\x16\x04\x89\xa3\xd5\x03\xce\xfe\x55\xa3\x9f\x20\xd1\x71\xc2\x6c\x5f\x97\xe5\xfd\xdb\x8d\x35\x7c\x02\xc8\x85\xcf\x6d\x62\x3e\x9f\xfd\x47\xee\xd1\x3c\x3c\xe1\xb1\xed\xfc\xda\xf6\x9c\xba\x6e\xc0\x71\x0a\xa3\xf3\xf1\x64\xe0\xe3\xf4\x6d\xc0\x19\x77\xa6\x06\x6b\x5a\x3f\xc3\x6b\x48\x3a\xd6\x1c\xcb\xf1\xbe\x9d\x33\xc2\x96\xc1\x06\xbc\x75\xc0\x01\x97\x1d\xf0\xbf\x3a\xe0\xeb\x88\x08\xd9\x72\xba\xc9\x57\x31\xf3\x44\xd3\x18\x72\xe1\xf1\x1b\x37\x81\x99\x37\x70\x79\xf4\xee\x30\xf2\xd4\xce\xce\x1f\xe7\xc8\xd4\x02\xb8\xe2\xe0\x8f\x11\x8e\x3d\x89\xd7\xfd\x4c\xd6\x45\xa3\x1b\xb3\xbc\xff\x0e\xcc\x37\xef\x8f\x01\x64\x73\xd7\xcb\xde\x4f\x00\x98\xb7\x8d\xcb\xdd\xfb\xe0\xbe\x74\x7a\x3f\xf7\xb5\xe2\x3c\x78\xf4\xb8\x03\x27\xbc\x03\xfe\x9c\xa3\xbd\x96\x83\xb7\xfe\xc5\xd1\xde\xc8\x67\x30\xcb\xc5\x07\xb9\xf6\x98\x76\xbb\xad\xf7\x5b\xcd\x59\xd6\xbf\xc3\xc0\x95\x07\xcc\x7e\x0f\xe7\xdd\xb8\xf2\x42\x30\xfb\x2f\x5c\xde\x1e\x30\xc6\x39\xdc\xe9\x58\xbb\x11\x93\xb7\xbe\x60\x0f\x84\x73\xed\x77\x6d\x74\xc0\xd5\x1c\xbc\x3d\x98\xcf\xb7\x06\x8f\xb4\x6f\xcf\xa7\x85\xce\x53\x8e\x9c\x09\x61\x2b\xb7\x79\xeb\xa7\xf8\x4e\x5f\xcb\xa7\x51\xeb\x9f\x0b\xf6\x8b\xe4\xc0\xdf\x3b\x0e\x3c\x45\x2c\xde\x09\x12\x07\x1e\xb7\xf9\x7f\x9e\x5f\x25\x1e\xd1\xf1\xf4\xc9\x50\x90\x78\x16\xf1\xc3\xec\x7e\x44\x07\x8f\xe7\x72\xc3\xf2\xfe\x47\x0c\xf8\x00\x08\x12\x4f\x5f\x37\x2c\x37\xee\x93\xc4\x03\xe6\xfc\x17\x76\x6e\xdc\x35\x6c\x6e\x8c\xcb\xa3\xc5\x9e\xfa\x02\xb9\x12\xcd\xf1\x73\x8c\x2f\x4e\x6b\x47\x7e\x79\x4b\xe7\x16\xd2\x3a\xc7\x4b\x86\xd4\x21\x76\x11\xe6\x67\x8c\xf9\x36\x13\x8f\xd1\x39\x3b\x7f\x0f\x63\xf8\xc2\xe3\x3f\x58\x83\xab\x91\xe4\xe1\x16\xc7\x7c\xb7\xcd\x2d\x4e\xeb\x83\x64\x3e\x4d\x8d\xf6\xcf\x4c\x74\xf0\x8c\x4d\xd3\x60\xcd\xd1\x56\x7d\x07\xec\x4e\xe7\xed\x31\x2c\x8f\x0e\x7d\x9a\xbf\x96\x63\xab\x0b\xe8\x1a\xcb\x8d\x7d\xa4\x24\x8f\xcf\x6a\x8f\xfe\xd4\x4b\xe1\xd3\xdd\x0d\xf6\xbd\x25\x9e\xd3\x89\xfd\xae\x3c\xe3\x79\x7b\xbb\xe3\x54\xfe\x3e\x32\xe0\x3b\x27\xbb\xd6\xa6\x5a\xfb\xe8\xc8\xca\x7c\x59\x67\xe4\xcd\x70\xd0\xc2\x94\x69\xad\x9f\xe4\x64\x0a\xae\xe9\xae\xf3\x5f\x18\xfb\xda\x2b\x5c\x75\xdd\xa7\x83\x26\x70\x19\xce\xd7\x50\x59\x5e\x69\x59\x33\xba\x82\x76\xea\xe7\x3a\x53\x3f\xd7\xd9\xfa\xb9\xca\x65\xd2\x60\xfd\x5c\x41\xf8\x4b\xcd\x4c\x9d\x0d\xd5\xce\xe3\x78\x55\x69\x55\xa9\x77\x96\x67\x44\xe6\x33\x54\xa2\x06\x48\x08\x68\x36\x96\x49\xf2\xb1\x24\x47\xc7\x39\x86\x96\xa4\x5e\x09\xf5\xe8\xbf\xc3\x2c\x25\x53\x2c\x45\x93\x4a\x80\x46\xdd\x4a\x88\x8e\x30\x90\xa2\x94\x90\x37\xc6\x46\x7a\x34\x95\xe9\xee\xe5\xfa\xbc\x32\xcf\xb3\x22\x25\xd1\xf4\x40\xd4\xfb\xfa\x4e\xef\x74\x9a\xa6\x95\xb0\x94\xee\xf6\x92\x52\xb2\x5f\x96\x22\x3c\x8a\xf6\xf5\xf5\x65\x52\xbd\xbd\xbd\x48\xd1\x92\x74\x32\x1a\x4b\x50\xc9\x18\x49\x0f\xc4\xf9\xee\x44\x3c\x45\xf6\x6b\x3e\x56\x13\xb8\xa1\x41\x86\x57\x45\x51\x2c\x19\x60\xe9\x21\x20\x89\xa4\x16\x60\x4b\xc4\x2f\x53\x44\xb7\x7d\x97\x2d\x07\x6b\x8e\x8d\xc3\xb5\x9f\xf7\xe3\xdd\x7f\x7e\x9e\xdc\x6e\x29\xd8\x07\x52\x4e\x86\xd8\x79\x46\x74\x78\x6f\x8e\xd7\xe2\x2f\x53\x81\x62\xb2\x2e\xfe\x91\x83\x86\xd1\x9c\xac\x38\x32\x2c\x7f\x5f\x1e\x6b\x2e\xa0\xb9\xa1\x8b\xe3\x2e\x9e\x15\xac\xf3\x4d\xd7\x0d\x01\x7d\xdc\xa9\x03\x45\xf7\xfd\x9e\x81\xfc\xfe\x0d\x78\xc7\x31\x17\xaf\xa9\xb6\x4c\xfb\xcc\x01\xc7\x32\xea\x39\xc6\xe2\xfc\xbc\x79\xe2\x9a\xaa\x36\x3c\x17\x9b\x5f\xa1\xef\x47\xb3\xe6\xc2\xa3\xa6\x5c\x1b\xe1\x6f\x23\xae\xd4\xc7\x18\x78\x35\x48\xc4\x3f\x1c\xf6\x9e\x1b\x17\x18\xa7\x35\xbb\xb0\x06\x37\xdf\x90\xe5\xd9\x07\x76\x3e\x8a\x7c\xf8\x33\x05\x36\xce\xc3\x58\x87\x14\xc8\x22\x63\x7d\x7b\x68\x47\x7b\x5c\x8b\xe1\xc0\xdf\x72\xf8\x06\x67\xe1\xbb\x35\x95\x88\x80\x0b\x00\x6b\xe6\x3c\xb9\x14\x5c\x0e\x96\x61\x5f\xf5\x1a\x23\x12\x39\x57\x44\x01\x07\xd2\x54\xd6\xd4\x32\x7e\x1c\xc8\x6b\x57\x5e\x20\x7c\x15\x13\x1a\xc7\xe9\xc7\xfb\x72\xf3\xec\x30\xa1\xa2\xb2\x51\xff\xcc\x7d\x74\xf0\x15\x1c\x1a\x8c\xdf\xbe\x3e\x18\x49\xb3\x21\xd2\x4b\x66\x68\x32\xe0\x25\x91\xc4\x30\x71\x46\x42\x1a\x2d\x44\x59\x1a\x89\x9e\x28\x95\xe9\x83\x7d\x21\x3a\x13\x87\xdd\xdd\xa8\x57\x82\xdd\x09\x51\x0e\x51\xb0\x5f\x82\xd1\x21\xa0\xf2\x50\x92\x60\xb7\x88\x44\x56\x83\x1a\x0a\x7b\x28\x98\x48\x33\xd6\xbf\x86\xb8\x88\x2c\x2b\x8a\x4f\x8b\x08\x1a\xaf\x64\x80\x40\xc7\x68\xde\x23\x4a\x54\x8c\x12\xbd\x31\x95\xa2\x15\x9a\x51\x38\x81\x95\x64\x59\x64\x38\x41\x11\x15\x9a\x52\x23\x7c\x24\xd2\x13\x12\x42\x21\x51\x42\x24\x0c\xb3\x11\x85\xe3\xa9\x7e\x9e\xe7\xb3\x40\x10\x84\x1e\x5e\x13\xc2\x22\x2f\xca\xa2\x2c\xf1\x62\x98\x0d\x4b\x8c\x28\x32\xb2\xe8\xb2\x0d\x31\xfe\xed\xfc\x21\x7c\x76\x9e\xb1\xcf\xf6\x75\x83\xa1\x3c\xfe\xc2\x74\x34\xeb\x10\x34\xd9\x76\x90\xcd\x2b\x63\x74\xdd\xbe\xb9\xb8\x6e\x4f\x5c\x56\xdc\x06\xda\xf3\xd7\x82\xfd\xd4\x5e\xb0\xbf\x9f\xb1\xf4\x4c\xd0\x9f\xb8\xc5\xdb\x59\x4c\x5f\x1e\x2c\x2f\x66\x8f\x92\x44\xb4\xc6\x35\x7f\x25\x58\x13\x7f\x17\xef\xef\xd7\x8b\xeb\xdd\xae\x72\xc7\x7c\x70\x3f\x87\x9f\x70\xd9\x89\x82\x55\x57\xa0\xab\x0e\x9f\x57\x27\xe7\xaf\xab\xa3\xcd\xd5\x5e\xb5\xde\x05\xec\xc2\x67\xe6\xd6\x4f\xed\x7d\x69\xbe\x33\x35\xf6\xe5\x89\xf7\xf1\x69\xe2\x03\xd3\x5e\xc3\x7d\xe5\xec\xb5\x20\xf1\xec\x1a\x7b\x9c\x05\xfe\x6f\x10\xf7\x5b\x36\x47\x7b\xcf\x3c\xdf\xac\xdb\x9b\xde\xb6\x75\xaf\x51\x3f\xf9\x75\x2c\xf3\x9e\x77\xac\x45\xc9\xed\xe7\x63\xf8\x4d\xa8\x3a\x09\x7f\x06\xb2\xf3\xfc\xbf\xc2\xeb\xfc\xcb\xf4\x21\x7d\x7f\x26\x8b\xdb\x9e\xbf\xca\x97\xb7\x9d\x5f\x2b\xa0\x53\xb7\xa3\x7d\x6f\x71\x9b\xb4\xf5\xbd\xe2\xba\xf7\x99\x95\xc5\xf9\xa3\xf5\x5d\xc7\xfe\x4f\x12\x11\x30\x05\xcc\xb2\x77\xbf\x91\xf3\xe8\x26\x5c\xa9\xb9\x92\xf0\xd5\x4e\xc8\xab\xa2\xd2\x68\x14\x5f\xc9\x15\x4d\xb2\x2b\x27\x19\x89\x3f\xff\x3d\x19\xc0\x66\x06\x12\x88\x93\x20\xdd\x8d\x38\x8f\x48\x87\x10\xe5\xa1\xa8\x8c\x0c\xe3\x34\x1b\x15\x68\x18\x96\x98\x38\xc3\xc0\x58\x7a\x20\x40\x7a\x7a\xd3\x03\x64\xc8\xdb\x83\x22\x31\xc8\xb2\x28\x9c\xd1\xfe\xcf\x08\x83\x9e\x48\x84\x8f\xe8\x12\x41\x54\x70\x2d\x2e\x59\x62\x05\x4e\x61\x68\x5d\x22\x44\x99\xa8\x30\xf8\xbf\x15\x08\x79\xe7\xc5\xce\x5b\x0b\x74\x4b\x34\x27\x2b\xda\x6e\x2e\x6e\x9f\x1d\x1a\x57\xdc\x1e\xb7\x73\xfe\xe4\xf1\xd4\xee\xed\xf9\xe7\x06\xc3\xee\xde\xf1\x21\x5d\xe4\xdc\x40\x12\x87\x7e\x5b\x4c\x77\x04\x89\xc3\xa3\xf2\x79\x67\xdf\xf7\x8a\x9f\xf9\x8c\xdc\x3b\x8e\x75\xb1\xce\x73\x76\x3b\x28\x6e\x53\x1c\xf6\x15\x5f\xef\xbe\x64\x71\xdd\xd7\xfa\xcb\xe2\xbc\xac\x5e\x98\x6f\x8f\x1e\xba\xfb\x5f\x9d\xdf\x0e\xfd\x34\x7f\x6f\x19\xf8\x39\x54\x5a\x20\x33\x0f\xe4\xf5\x23\x18\x39\xa0\x8e\xe0\x77\x65\x4f\x5b\x6f\x87\xed\xf8\x45\xc3\xb2\xda\xed\x3c\x57\xdd\x66\xaf\x77\xe1\xc1\x33\x6b\x86\x66\xee\xe7\xac\xda\x23\x73\xfd\xef\x11\x2a\xd9\x72\xe8\x83\x75\x43\x73\x4a\xb8\xc9\xe4\xc2\xd3\x4d\x9f\x81\xa6\x66\xf3\xdc\x30\x07\xcb\x16\x3c\xd6\x17\x80\x5c\xfb\xe4\xbb\xe0\x00\xf0\xcd\xfc\x4c\x97\x59\xc7\x18\x17\xbd\x6c\x7b\xfa\xd0\xe8\xfc\xf9\x1b\x78\x3e\xf1\x70\xbe\xec\x35\xe0\xea\x05\x98\x30\xc3\x01\x9f\x9d\xe1\xef\x24\x9e\x05\x23\xc0\x79\x76\xcd\x65\xc3\x96\x5e\x00\x16\x83\x5b\xc0\x46\xb0\xc9\x7a\x27\x65\xa6\xbd\xaf\xd4\xad\xe5\xff\xc0\xfb\x55\xa1\xb7\x2d\xaf\x1a\x03\xeb\x2e\x6e\xa8\x37\xca\x1f\x7a\xab\x2c\x7b\x7b\x42\x99\x97\xf0\x97\x1a\xa1\x84\xbe\xae\xb9\xd5\x70\x75\xfa\xbf\x5e\xda\x96\x84\xdf\x3f\x7f\x66\x7a\xd1\xbf\xe9\x26\xf3\xbd\xb8\xe0\x9e\xad\xc3\x3f\xff\xa4\x7c\xd9\xb9\xe7\x94\x6f\x29\xbf\x6c\xce\xe5\xdb\x27\x9e\xb9\x88\xb9\x60\xd9\xc6\x05\x70\xf5\xf0\xe1\x1b\xef\x82\xe5\x17\x8d\xbc\x67\xf8\x44\xe2\xd9\x3b\x1e\xdd\x91\xe9\x40\x23\xd1\xbd\x2b\xe1\x66\xf8\xba\xa7\xe3\x8e\x1b\x87\xfd\x5b\xee\x34\xef\x17\x72\xe5\x18\xf4\xf8\xdd\xe8\x14\x3a\x71\xe3\xca\x91\x2f\xde\x0d\x57\xc1\x37\x33\xf7\x8c\xa9\xdd\x78\xc9\xe4\xe6\x92\x7f\x8c\x41\x0b\xe0\xb5\x65\xe7\xa0\x57\x33\x63\xaf\x58\x59\xbb\xfa\xca\x02\xdd\x1e\x24\x0e\x4e\x71\xe9\x5e\xcd\xe2\xf7\xd3\xd6\xf9\xb9\x2a\x57\xf3\x06\xd7\x83\x09\x15\xdf\x37\x76\x8e\x26\xde\x7a\xef\x69\xda\x9f\xc1\xa2\xf6\x27\xde\xfb\x89\xf7\x6c\x1f\xc7\x5c\x53\x67\xce\x2e\x19\x9a\x75\x03\x37\x39\x48\x1c\xb2\x6c\xe6\x55\x59\xde\xbf\x86\x88\x90\x6b\x0f\xfc\x12\xae\x00\xa0\x6e\x33\x07\xc8\xb5\xa7\x7e\x02\x3e\x07\x80\xc5\xd5\x38\xbb\x6e\x38\x17\xcc\x1a\x8f\x7d\x37\x52\x6e\x6d\x21\x10\xcc\xe5\x7a\xb2\xcf\xc1\x06\x4f\xee\x9a\x54\xdc\xbe\x3e\x8e\xf0\x0b\xf2\x07\xf0\x67\x53\xb2\x73\xfd\x2a\x71\xbf\x3e\xa7\x8f\x87\x66\x6f\xd2\xf7\xce\xce\x69\xe1\xb2\x59\x3f\x6c\xba\xd4\xcd\xff\xa6\x5c\x7d\xa1\x98\xff\x2f\x48\xb4\x8d\xb6\xfd\x16\xac\x91\x4b\xf0\x40\x6a\xea\x17\xc1\x9a\x53\x3f\x31\xa4\xf4\x27\x03\x4e\x9b\xbd\x6d\x6a\x9e\xec\x36\x7d\xfc\xe6\xbc\xcf\x80\xa2\x3e\x9f\x83\xdd\xc5\xfc\x7c\x24\x71\xc0\x5f\x6c\x4e\x24\xd1\x36\x31\x1f\x9e\x58\x53\x20\x73\x8d\x77\x24\xaf\x15\xc8\x38\x47\x3f\x87\x9b\x8b\xe9\x00\x92\xd8\x7f\x2a\x9f\x47\x0c\xf8\xb3\x21\xd7\xba\x94\x60\xcd\xb3\xba\x2c\x33\x25\xdd\x81\x29\x0e\x39\x6d\xcb\xbf\x9d\x9b\xec\xef\xcc\xf1\x3f\x99\xe3\x9d\x03\x57\x8f\xfb\xa2\x98\x5e\x3a\xf0\x63\x87\x7e\x30\x7c\xba\x63\x0a\x70\xea\x98\xd3\xe9\x97\x8a\xcb\xef\x03\x17\xe7\xdb\xa4\x46\xfb\x83\x17\xe5\xdb\xa4\x07\x13\xd8\xcf\xe0\xb4\x49\xb7\x13\x91\x60\x6d\xdb\xaf\xbc\x17\x39\xfc\x1b\xbc\x11\xbb\x67\xae\xab\x26\xb1\x1c\xe4\x6a\x44\x89\x59\xc9\xff\xb0\x3e\x86\xce\x87\xe4\xc2\x44\x8f\x02\x66\x3e\xc8\x15\xd5\xaf\x7b\x7f\xed\xf0\x6b\xed\x32\xf6\xcc\xe7\x60\xce\x63\xfa\x4e\x68\x7b\xe5\xc2\x33\x73\x7e\xd8\x74\x7b\x9e\xbe\xc3\xeb\xd9\xf1\x7e\x81\x1e\x34\x78\xe1\x8d\xe2\xfe\xbf\xb6\xd9\x0e\x3c\x62\x78\xdb\xd5\xd8\xaf\x36\xcc\xd5\x5e\x0d\xd6\xc4\x3e\x2b\xf0\x2f\xc6\x1c\x74\x7a\x19\x0c\x16\x93\x17\x7b\x7e\x9d\x3f\x6e\xdb\x93\x2e\x3a\x89\x96\xfd\x10\xad\xc6\xef\xa5\x2b\xb0\x36\x99\x68\x7f\x66\xbc\x4d\xaf\xc0\x39\xda\x06\xf0\x67\xb4\x7b\x9c\xdd\x1f\x3a\xce\xa0\xe7\x00\x31\xbb\xc0\xff\x2a\x11\x06\x63\x41\x3d\xb8\x14\xdb\x9e\xab\xcd\x8a\xff\x77\x80\xcd\xe0\x3e\xb0\xcd\xc8\x2b\x3f\xcd\xb8\x35\x36\xae\x8e\x3d\xfe\xc6\xb2\x0a\x8f\xb7\xa1\xd1\xb0\x1f\x8b\x7e\x54\xeb\xc5\x61\x30\xe5\x38\xee\x05\x07\xcd\xd4\x95\x57\x56\xff\x07\x5e\x21\xdf\xd9\x8d\x15\x3b\xc9\x43\x3f\xa9\x7d\xf0\xae\xbb\x1e\x1c\xb7\xb3\xe5\x89\xe5\x3b\x4f\x6f\xd8\x76\xea\xc5\x0d\xd7\xf8\x49\xcf\xcb\x8d\xa1\x27\x46\x1c\xfa\x49\xed\xb6\xbb\xb6\xe4\x3e\x3b\xf4\x42\xcb\x35\xe3\xb6\x69\x83\x83\x1a\x12\xf5\xdf\x30\x3e\x04\xff\x2d\xaf\x11\xf4\xbe\xfa\x16\x2d\x08\x02\xad\xbc\x0a\x6b\x29\xf2\xa1\x3f\xc2\x8d\x34\x3a\xf2\x2a\x09\x9b\x99\xcc\xdb\xe8\xb7\x34\xcd\x71\xe3\x5e\x7d\x8b\x8e\xf2\x56\x83\x0f\xe1\x37\xec\x06\x9f\xa3\x1f\xd2\x74\xc4\x77\x77\x54\x33\xff\x3b\xf2\x6f\xf8\x99\x0c\xda\x73\xd9\xd1\xfe\x18\x71\x6f\xb0\x26\x21\x02\x40\xae\xd5\x36\x80\x17\xc1\xfa\xe9\xaf\xcd\xcc\x92\xcd\x8f\x76\x7b\x1e\xcd\x3e\x37\xeb\xf9\xba\xd1\x85\x72\x7d\xff\x85\x5f\x71\x4e\xfd\x4d\x3e\x7c\x2f\x5f\xc4\x46\xb6\xdb\xc7\xfe\x91\x2f\x13\x62\xcf\xe4\xd9\x9e\x2e\x99\xb3\x9f\x2b\x2e\x43\xf6\xcf\x70\xc8\x9c\x48\x6e\x9e\x7b\xfa\x1c\x3c\x1e\xb1\xf4\x0f\x59\x13\x9d\x80\xf9\xb8\xd6\xb6\x03\xb5\x9c\x1c\x54\x6b\x1c\x67\x52\xcd\xf2\x93\x92\x84\x5a\xed\xe8\x0b\xe7\x47\x69\x1f\x85\xed\xe1\x0a\x1b\x6e\xd5\x6f\xec\xd2\xc7\xc0\xd9\xca\x08\x75\x82\x7d\x1e\xc6\x9f\x69\xf5\xf8\x04\xbb\xbf\xb8\x1e\xd9\xf3\xa1\x63\x0c\x2c\x0b\x63\x5d\x8e\x3d\x59\x65\x7f\xe7\xf5\x9c\x0f\xae\x93\x9c\xf6\xf3\x62\xbe\x84\x3d\xff\x95\x6f\x3f\x1e\xb8\xe7\x5f\xf8\xc6\x73\x35\xcd\x6c\x5a\xef\xf9\xef\x3c\x5d\xe5\x92\xe7\x47\xe3\xf9\xfd\x18\x79\x56\x0a\xe5\xbf\x79\x0e\xb0\xee\x59\x8c\xf7\x31\x62\xb0\x66\xcf\xef\xf1\xaa\xc6\x3b\xec\xf1\x5e\x9c\xaf\xa3\x23\xa7\xab\xd4\x4a\xf3\xb3\xb9\xfe\x7d\x58\x4f\xbe\x8e\xef\x10\xce\x9d\x33\x34\xa7\x92\x9b\xec\x58\xb7\x59\x53\xed\xab\x79\x6d\x8f\xe5\xc3\x5c\x8e\x7d\x13\x1a\xd9\xd2\x5e\xe1\x3d\x77\xf6\xf7\xe7\xfc\x21\x48\x74\xdc\x98\xcf\x57\x7b\x7e\x97\xb7\x76\xd6\x38\xdb\x99\xb8\xfd\x6d\xfe\x19\xe5\x54\xb9\x0b\xb7\x2a\x1e\x43\x0d\xd6\xec\xf8\x08\xdb\xec\x4e\x7a\x1b\xf9\xb4\x62\x05\x7c\x6e\xd4\x4b\x59\x59\x9c\x46\xe6\xb8\xfd\x2e\x9a\xda\x3c\xdb\x51\x70\x0f\x62\xb6\xff\x63\x31\x78\x30\x97\xdb\xce\xe6\x0d\x23\x77\x9f\xeb\xcc\xa7\x39\xda\x0f\x77\xf5\xa3\x05\x6b\x8e\xbc\x55\x7c\x9f\x3e\xf3\x56\x81\x8e\x32\x72\xa7\x94\x15\x3f\xc3\x99\xf3\xfc\x83\xc3\x4e\xcc\xe9\x1b\xa2\x7d\x64\x3e\x7e\x8e\xbc\xf9\xaf\xe4\xc3\x9e\x8f\x8b\xf3\x6a\xdb\x74\x90\xef\x9f\xc3\xf0\xbd\xf3\x6d\xf8\x42\xff\x09\xdd\x96\x68\x65\xbc\x0b\xb3\x5f\xd8\xb6\x84\xae\xcb\x36\x13\x8f\xeb\xbc\x72\xf6\xd4\xc6\xeb\xe6\x5c\x48\xb6\xec\x5c\xf6\xf5\xe1\xb3\xcf\x6a\x3a\x40\x2e\xdc\x79\xd5\x4d\xbe\x99\xa7\x38\x97\x2d\xde\xfa\x46\x01\x0f\x3a\xf7\xf7\x9f\x5c\xb2\x45\xb5\x64\x4b\x67\xa3\x6b\x7e\xf6\xd9\xa0\xd3\x78\x43\x59\x06\x9a\x50\xbf\xff\x05\x62\xa6\xfd\x06\xbd\x1c\x8c\xc5\xef\xbd\xae\xc2\x7e\x9d\xf5\xe0\x36\xb0\xc9\xd4\xad\x8f\x82\xed\xf8\xe5\x57\xb5\xae\x05\x4b\xcd\x1f\xaf\xc3\x4b\x53\x56\x59\x5a\x37\xb2\xa2\xae\xbc\x2a\x58\xa1\x6b\x57\xaf\xbf\x6e\x54\x63\x43\x6d\x85\xc7\x4f\xd4\x9a\xf1\xa3\x1e\xaf\x55\x26\xbb\xae\xb4\xae\xb4\xae\xbc\x4a\x3f\xf0\x95\x55\x39\x02\x24\x08\xff\xbf\xd6\xb5\x85\x67\x44\x6f\x3d\xdc\x8a\xee\xd9\xfc\x24\xfe\x6f\xb2\xbc\xe0\x8e\xf5\xf7\xc0\x85\x4b\x2e\xda\x34\x69\xd1\x71\x78\xf5\x56\xdf\x9f\xff\x7c\xf6\xd9\x57\x8f\xbd\x75\xc2\x8e\x92\xc0\xe8\x2a\x06\xde\x7c\xf6\xe3\x93\x2f\x3e\xb7\x7c\xd9\x7d\x8b\xb6\x5f\x7b\xd1\x59\xe8\x90\x67\xd5\x8c\x0b\x6e\x9f\x30\x03\x05\x37\xdf\xb7\x61\xc3\x59\x7b\x57\x6c\x1e\xb6\x39\xbd\xfb\x76\x1a\x56\xd2\x53\x23\x99\x97\xc7\x56\xce\xff\x59\xef\x2c\xe6\xc3\xb1\xcb\x67\x6f\xd8\xf0\x7e\x18\x7d\x47\xff\x7d\x72\xea\xd8\x35\x67\x35\x65\x3e\xbf\x63\xe2\xd4\xcd\xb3\xe1\xef\x67\x8f\xdc\x7c\x4e\xc3\xa2\xa9\x9b\xc7\xfb\xba\xcf\xf4\x97\x78\x77\xf4\x67\xa2\xfa\xff\x21\x81\x7d\xe1\xb1\xeb\xbf\x15\x8f\x25\xb9\xee\x58\xc9\x37\xe0\x8d\x3f\xdc\xbf\x1b\x8d\x3a\xf2\x5b\x48\xce\x47\x29\xf4\xc2\xc8\xac\x3f\xf0\xa7\xe9\xe8\xa5\x89\x67\xdf\xc6\xad\xd9\xb9\xe5\x7e\xe5\x67\x70\xb4\x67\x1e\xfc\x40\xba\x8d\x0f\xaf\x4e\xbf\x06\x2f\x40\xef\x6e\x47\xd5\x3f\xdc\xbc\x1f\x3e\x50\xc2\x33\x1b\x23\x6b\x97\xa7\xff\xec\x79\x9d\xa6\xb4\xff\xfa\xaf\x55\x22\xf3\x10\xea\x7c\xf3\xcd\x37\x33\x7f\x7e\xe5\x95\x57\xd0\xa3\xf2\x46\x5a\xde\x18\xa0\xd1\xe7\xdf\xbd\xf2\xad\xb7\x4e\xbe\x44\xbd\x7a\x32\xf0\xdd\x0f\x03\x7f\x7d\x3a\xcf\xcf\x67\xf2\xc9\x27\x2e\xfe\xd6\x82\x35\x07\xb6\xba\xe4\x91\x98\x15\x8d\xba\x2d\xf8\x3c\x45\xec\xfc\xa9\x6b\x9f\xd8\xbe\x4d\xbb\xfe\x9e\xcb\x37\x42\x12\x7b\xfe\x5c\x7c\xff\xb4\x35\x16\x87\xb7\xfe\xa2\xb8\x1c\xd9\x59\x8f\x2f\x3a\x4b\xb1\xbc\x38\x65\xbf\xa5\x9a\x04\x2e\x02\xf5\x60\x3a\x68\xc6\xde\xc7\xab\x71\xad\x3d\x9d\x4f\x0d\xcf\x43\x65\x69\x65\x99\x9d\xee\x04\x87\x36\x63\x4f\x41\x5d\x79\xa5\x5d\x60\xc8\x2c\xf5\x5c\x5f\xe9\x6b\x68\xac\x2a\xf7\x9a\xad\xff\x93\x08\x9d\x92\x29\xde\x0b\xd3\xbf\x3c\x0c\xfb\x10\xa5\xff\xec\x81\xfe\xa7\xff\xc8\x4d\x95\x84\x55\xef\xa1\x6f\x27\xe0\x0f\x9e\x46\x33\x9e\xde\xc8\xfd\xf1\x25\xf4\x08\xbc\x01\x7d\x09\xdf\x5c\x2e\xbc\xf7\x21\x7c\x05\xcd\xd0\x7f\xd2\xf7\xff\x9b\x5e\x0a\x62\x66\xe6\x23\xb8\x70\x35\x7a\x6b\x35\x7a\x51\x92\xa4\x86\xc6\x6b\xa5\xa5\x9b\xee\xcc\xac\x9f\x33\x07\xfe\xa3\x71\xd3\xb5\x77\x6f\x7a\xf8\xe1\xf9\x0b\x1e\x46\xb5\x0f\xa3\x87\x1e\x26\xce\xfe\xb7\xdc\x12\x16\xef\x38\x68\xfe\x6c\x5e\x5c\x04\x3e\xeb\x83\x59\xcf\x73\xba\x1c\xa7\x5d\x67\x2d\x5b\x9f\xc5\xce\x77\xe9\x39\x5d\x8e\xbd\xe3\x92\xb3\x13\xb2\x65\xfe\x37\x0c\x9b\xe3\xd7\x80\x6c\x3e\xf0\x00\x38\x9e\xfd\xf9\xcc\x07\x2f\x79\xdd\xfc\xce\x31\x5b\x17\x2d\x3c\x7a\xfd\xa4\x5c\xcd\x70\xde\xca\x47\x60\xe8\xa9\x68\x95\xc3\x56\xc2\x3e\x10\x83\x7f\x3b\xe7\x17\x97\xcf\x7b\x3e\xcd\x87\x1f\x0b\x14\xc8\x7f\xac\x97\x0f\x4e\xc5\xf5\x80\x0d\x4f\x18\x55\x4c\x07\xa8\xe3\xf2\x79\x78\xf7\xe3\xc5\xfb\x32\xed\x9b\x43\x5f\xa1\x53\xff\x52\x5c\x87\x19\xf9\x3d\xc1\xb9\x60\x4a\xb6\xce\xff\x12\xb1\xbb\x68\x4c\xde\x62\x7b\x3f\xac\x06\x6b\xcd\x13\xd1\xd3\x60\x2f\xd8\x0f\x0e\x81\x23\xe0\x38\xe8\x02\xdf\x03\xa0\xcc\x5f\x3b\xa1\x31\x77\xae\x29\x23\xfc\x95\x0d\x8d\x16\x83\xfb\xac\xbf\x39\x91\x6e\xb2\xb8\x29\xde\xff\x93\x2f\xe7\x22\x06\x8d\xd3\x52\x63\xa5\x51\xd7\x00\x3f\x3a\x98\x50\x81\x03\x08\xad\x1b\x00\x9f\xf5\xd7\x51\xd3\x68\xff\x85\x3c\x2c\xb9\x7b\xcd\xa8\x51\xf0\xc6\x09\x13\xfe\x98\xfe\xfe\x6b\xc2\x25\x70\xe7\x84\xf3\xd0\xba\xbf\xfe\x15\xde\xf8\x45\x26\x6e\xfc\xd9\xd0\x32\x63\xc6\xf2\x19\x9e\xf3\x2f\x1e\x75\xc7\xa8\x09\x0f\x4c\xb8\xb3\xdc\x73\xe9\x8c\xf2\x3b\x46\xcd\xf8\xcd\xa4\x4b\x21\x71\x77\xcb\xa8\x51\xf0\xeb\x13\x26\xf4\xa7\xbf\xa3\x7f\x7b\x57\xf5\x79\xe8\xe6\x81\x01\xf8\xf5\x7f\x66\x0e\x19\x7f\xd6\xb5\xcc\xd4\xbf\x5d\x59\x37\x6a\x53\x79\xf5\x03\x13\xee\x1c\xe5\xb9\x6c\xc6\xa8\x3b\x47\xcd\x18\x3a\x1e\x09\x85\x3c\x32\xcd\xc0\x28\x1d\x16\xa2\xbc\x22\x0e\x45\xc5\x48\x42\x8a\x49\x8c\x28\xf3\x50\x10\x3c\x32\x43\x65\xba\x59\x1e\xf6\x20\xd6\x23\xc0\x9e\xa1\x7e\xeb\x5f\x28\x2e\x52\x51\x8a\x1f\xe0\x43\xd1\x10\x07\xdf\x22\xe5\x87\x9e\x6c\x0a\x51\x1b\x59\x06\x5d\xe8\x99\xcd\xd1\x0c\x8b\x7e\xcb\xf3\xfc\x3f\x05\x41\x78\x8b\x93\x1a\x97\x73\x1c\x2f\x4c\x5d\xce\x93\xbc\x50\xb1\x9c\x27\x05\x7e\xdc\x95\xbc\x07\x92\xb2\xaa\x71\x21\x2a\xcc\x32\x88\xf6\x70\xf8\x4b\x7d\x3c\xcf\x0f\x0a\x82\x90\xe2\x24\x56\xd4\xbf\xc4\x88\xfa\x97\x42\xa2\xfe\x25\x4a\xe0\x89\x9f\xcc\x1c\x35\x42\x9a\x5c\x8d\xe6\x2f\x91\xe6\xc9\xd2\xa4\x69\x77\x2d\xda\x38\x73\x11\x5c\x37\xa9\x7a\xed\xbd\xf3\xaa\x27\x4f\x7e\x77\xc9\x92\x25\xe9\xa5\x4b\x97\xbe\xb5\x68\xe9\x24\x69\xd1\xa8\x45\x4b\x26\x5f\xbb\x14\xf8\x81\x94\x55\x75\x9d\xe0\x8a\x63\xac\x05\x00\xfa\x6b\x41\x99\x7d\x61\x03\x0d\xba\xe7\xdd\xd6\xe0\x38\x0a\x3e\x2a\xc0\x98\x11\xdd\x19\x86\xca\x19\x15\xb2\x11\xde\xd3\x23\x30\xe9\x3e\x98\x42\x8c\x19\xd9\x69\xfe\xeb\x8c\xe0\xa7\x06\xfb\x4a\x68\x49\x83\x24\xa4\x19\x9e\x53\x7b\xd2\x72\x89\xa8\xb2\x92\x94\x49\x0e\x0c\x0c\x64\xa2\xfa\xaf\x78\xd4\x3a\xe3\x60\xbf\xdb\xc9\x9b\x71\x5c\xc9\x77\xcc\x7d\x22\x64\xc3\x86\x0f\xca\x88\x11\x74\xc0\xad\xfa\x3d\x47\xb1\x8d\x1c\xb4\xe1\x66\x6e\xa0\x8e\xd3\x38\x9b\xdf\x4b\xb6\x5f\xde\xdc\x9f\x1d\x49\x6c\xf3\x7e\xd7\xd1\x8f\x71\xa7\xf8\x1d\x0c\xcf\xd5\x24\x13\x9d\xfd\x74\xfc\xdd\x86\xaf\xf6\x6f\xc6\x70\xbd\x7d\x73\xfb\x72\xf0\x6b\x30\xbc\xf1\x7b\x33\xcf\x98\x6b\xd0\x72\x7d\xb5\x15\xe4\x05\x36\xe0\xed\x41\xd7\xd8\x36\xfc\xb9\x45\x0e\xb8\x96\x83\xef\xf9\xcc\x01\xff\x95\x05\x37\x7f\xfb\x5b\xbb\xc1\xfd\xc5\xd6\x12\x24\x4e\x4f\x2f\x80\x9f\xc6\x7e\x98\x2e\x90\x8b\x63\xd2\x3f\xdb\xa8\x7f\xf6\x2c\x9a\xaa\xaf\xf3\xb4\xfd\x1d\xd9\x89\x17\x3b\x6f\x61\x2c\x1b\x31\xce\x26\x4f\xe3\x58\x0a\xf5\x7c\xc7\x18\x58\x8f\x74\x9c\xc4\x77\xbf\x4d\xae\xb5\xd8\xfd\xd8\x31\x57\x42\x56\x71\xae\xdd\x8e\xd5\xc8\x5b\xfb\xce\x51\x36\xdc\xcc\xc9\x14\xff\x10\xb8\xe7\x69\xb5\xd7\xd7\x46\x1c\x6b\x76\xb4\x57\x72\x70\x3b\x1e\x49\xb0\xea\x5f\x75\xdd\x9f\xd7\x0f\xe7\x7f\x1a\x9f\xcb\xcb\x75\xdc\x1e\x63\xc6\x81\x20\xf1\xf0\xc2\xa9\xc0\xae\x37\x67\xe1\x9d\x38\xfa\x33\xc7\x77\x1c\x3c\x12\x6f\x73\xc1\x55\x7b\xec\x13\x2e\x78\x8e\xd7\xe2\x05\x6b\xc0\xb5\xb4\x3a\xb0\x3f\x1c\x0c\x07\xab\xb3\x37\xfa\xdb\x88\x2d\xc0\x87\xb3\xa9\x95\x82\x0a\x7c\x27\x73\x11\x68\xb0\xdf\xce\x2c\xb6\xaa\x2c\xe2\xdc\x51\x38\x15\x5c\x79\x25\xac\xf0\xc0\x5a\xe0\xb7\x72\xd9\xf8\x6b\x1b\x4c\xdb\xc7\xbe\x8a\x6d\x68\xc4\x05\xe6\xf0\x03\x74\xfd\x1f\x15\xba\x7d\x54\x59\x5e\xe9\xe9\x5b\x37\x6b\xf3\xec\x5b\x50\xa9\x9f\x1e\xec\x25\xf4\x5f\xf0\xec\x92\x3f\x0f\x8d\xf4\xdc\xfe\xd0\x9f\x10\x77\x1d\xec\xf8\xde\x95\xaf\xa3\x17\x79\x78\xa9\xf7\xfe\x08\xcb\x2b\x02\x5a\x25\x33\x1e\x40\x86\xa0\x70\x26\x2a\x0b\x30\xa6\x78\x00\x15\x42\x0c\x4a\xc1\x14\x62\x4b\x18\xc4\x66\x34\x98\x8a\xe9\x82\x32\x4d\xfa\x99\xc1\x14\xb1\x65\xd9\xd7\xf5\xff\x29\xe8\x87\x0a\xbc\x2e\x02\x59\x11\x85\x51\xbf\x0a\xa9\xfb\xef\x78\xf9\x8e\xa7\x6f\xf1\xce\xa3\x15\x91\x93\x32\x6b\x97\x4d\xbe\xb1\xbe\x26\xf3\x57\xb8\x60\xf2\xe6\xe3\x93\x6b\x26\xbf\xbe\x42\xff\xef\x26\xfd\x17\x7a\x7b\xb3\xb5\x9f\x65\x47\x5d\x24\xa2\xe3\x39\x07\xdd\x1d\xfc\xd3\x71\xb8\x80\x56\x06\xbc\xbd\x00\xf7\x27\x81\x33\x07\xb0\x80\xfd\x09\x7a\xff\x09\xbc\x67\x70\xc5\x75\xbd\x0d\xfe\x2c\x92\xa3\x3b\x49\x74\x1c\xb4\xbf\xa3\x3a\x79\xba\xa3\xad\x60\xff\x9d\xc4\x77\x2d\xc6\x8b\x90\xf3\xdc\x7c\x7d\x62\xbe\x35\x82\x1b\x6e\x8c\x61\xc7\x70\x28\x78\xff\xe9\xed\x71\xac\xd4\x09\xde\xb1\xbe\x64\x8e\xb7\x0e\x3f\x61\xc2\x67\x66\x57\xfb\x7f\x4c\xc8\x64\x4b\xc7\x77\x3e\x1f\x98\xf1\x3c\x8e\x6a\xf7\x49\xa3\xe7\x3c\xda\xf4\x96\x3d\xb7\xb0\xc5\xf7\x24\xb1\x6b\x6a\xfe\x3e\x31\x78\xbb\xf3\x6b\x05\x32\x0b\xcf\xab\xf5\xdd\x62\x7b\x81\x24\x3a\x0e\x38\xe0\x38\x06\xe3\xe9\x4b\x5d\xf2\x5b\xb2\xee\x4f\x4f\xcc\x73\xdd\x9f\xe6\x6a\x38\x1a\xfd\x2c\x70\xc8\xe3\x58\xae\x7f\xfb\x5e\x58\xc0\x3e\x11\x1b\x7e\xe8\xde\x82\xf9\x63\xba\xee\xf8\xd0\x86\xb3\x66\x5e\x57\x43\x16\x03\x87\xde\x48\xe4\xf6\xac\x7d\x7f\x2a\xe0\x7c\xde\xb9\xfe\x9f\x2d\x2e\xd7\xec\x7b\x64\xc1\xba\x9f\x33\xf0\x66\xdf\xcf\xb9\xe4\x23\x99\xbb\xcf\xcb\x93\x77\x76\xec\x46\x9e\x5c\x3b\x70\x73\x71\x3c\x27\x9c\x3a\x46\xc9\xc9\xdf\x8e\x3e\x1b\x3e\xcf\xdf\x67\x8f\xdb\xbc\xe3\x34\x48\x65\x87\x66\x43\xec\x77\xb8\x12\xd7\x8b\x55\x74\xde\x80\x60\xce\x87\xba\x8d\x7f\x20\x27\x3f\x23\x39\x7c\x07\x89\x1d\xce\x7c\xfc\x46\xae\xd3\xa9\x79\xf2\x53\x72\xcd\xf7\xe2\x82\xfd\x78\xda\x75\xef\x23\xb8\xef\x96\x0c\xee\x33\xef\x96\x72\xf5\x3d\x4f\xbb\xee\x7e\x74\x9d\xe4\xe8\xeb\x88\x95\x4b\xe8\xca\xec\x3c\xff\x73\xc4\xdd\x64\x4b\xc7\x69\xaf\x6f\xf6\xd3\x4d\x29\x72\x61\xdb\x68\x71\x68\x56\x9a\xcb\xa3\x95\x21\xdb\x9f\xfb\x16\x3e\x7d\x0e\x37\xf9\xd0\xcc\x63\x6d\xf0\xa1\x9d\xc7\x5a\xb0\xf2\xb2\x9b\xf3\xce\xd5\x56\x93\x4d\xbf\x2e\x8e\x41\xb2\xeb\x77\x08\xd6\x39\xca\xd8\xe3\xc7\xbe\x8e\xb5\xd1\x4d\x76\x5f\xe1\x1c\xed\xf7\x5f\x90\xbf\x97\x8c\x3b\x10\x97\x6d\xe3\xdc\xfb\xbf\xc9\xb7\x61\xda\xcb\x43\x38\x6f\x6c\x28\x5f\xaf\x60\xda\xef\x7b\x38\xdf\xee\x30\xb0\xdb\x3e\xaa\x78\xff\xfb\xaf\x2a\xe0\x21\x0c\x3f\x55\xee\x58\x33\xd6\xf9\xc6\x9a\x77\x7c\x54\xbc\x1f\xdb\x07\x2c\x61\xdb\xc1\x6e\xbf\xfb\x11\x07\x8e\xb0\xdf\xca\xc0\xc3\x01\x5c\x27\x0c\x8c\xb0\xea\xd0\x98\x5a\x6e\x3c\xa0\x71\x04\xd2\x5c\xb0\x10\x67\x2a\x58\x0a\x44\x7c\xd6\x01\xb0\x34\x97\x3f\xd4\xd0\x74\xf8\xf9\xab\xf3\x79\xac\xcf\x71\x4d\x03\xb1\x5b\xe0\x7f\xb8\xdc\x31\x94\x64\xa5\xe1\xa9\x72\x75\x55\x81\xbb\xf2\x4e\x17\xbe\x79\xa5\xe7\xe7\x77\xa3\x6a\xf8\x01\x9a\xe9\x99\x96\x79\x7d\x96\xe7\x59\xf4\xc5\xac\xeb\xeb\xe9\x91\xf5\xb3\xc6\xa2\x8f\x3d\x53\x66\x4d\xf9\xc6\xf8\x99\xe8\xd9\xdb\xea\xe7\xae\x5b\x94\x39\x72\xf7\xf0\xb1\xef\x8f\x67\x0e\xa0\x51\x8b\xef\xde\xd5\x30\xfe\xfe\x73\x67\x4f\x5c\xba\x34\x29\xa2\x01\xfd\xf7\x9d\xe5\xbf\x45\xbf\x63\xe0\xa4\x92\x0b\x20\xd0\x04\x41\x90\x04\x3e\xc4\x0b\x6c\x16\x08\x22\xa3\x30\x42\x89\x8a\xa2\x99\x3e\x24\xf2\x30\x09\xfb\x3d\x83\x48\x80\x4c\x02\x7d\xa4\x45\x35\x14\x92\xc5\x40\x34\xc0\xc3\x1e\x4e\x8b\x73\x09\x8d\x61\x06\x62\x7c\xd2\x77\x39\x25\x08\x4a\x58\x4a\x27\x3c\xfd\x62\x6f\x8f\x2c\x8b\x0a\xd2\xfa\xfb\xfb\x33\xc9\xfe\xfe\x7e\xc4\x2a\x32\x1f\xe5\x4a\x64\x18\x43\x92\x36\x94\x94\x85\x90\x1a\x12\x4b\xa8\x64\x77\x1f\xdb\x9f\xcc\x97\xfb\x41\xe2\x59\x32\x7f\x7f\x9b\x3c\x33\xb2\xa8\x0d\x49\xb4\x97\x15\x97\x6b\x47\xde\x74\xb5\xd7\xec\xbd\xfa\x56\xbe\xdd\x6e\x8c\x7b\xc0\xaa\x1b\xcf\x64\xaf\xf3\x1f\x23\xbe\x45\xae\xdd\x95\x04\xbb\x40\xc9\xcc\xf5\x4d\x07\xc8\x85\x1d\x27\xff\xf0\xeb\x99\x2f\x70\x96\xbd\xa8\xe5\xc6\xb7\x7d\x4d\x02\xce\x81\x1a\x0d\xd6\x1c\x7e\x05\xbf\x7b\xc0\x3c\x0b\xce\x01\xeb\xb3\x1b\xfc\xef\x10\x77\x82\x73\xcc\xca\xbb\x17\x81\x46\xdb\x6a\xba\x1c\xdc\x00\x36\x02\x00\xcd\xcb\x40\x23\x8a\x0d\x96\xe2\xb7\xd4\xd8\x83\x54\xe6\x6b\xac\x86\xf5\x95\xe5\xce\xa8\xf1\x7f\xe1\xb5\x34\x92\x55\x19\xaf\xf3\x8d\xdb\x42\xfc\x1e\x1f\xff\x6e\xcc\x81\xfd\xfb\xb6\xa7\x7f\xbd\x1b\xbe\x3d\xba\x6e\x7f\x53\x2d\x9c\x9b\xb9\xc9\xf3\xd2\xf6\xcc\xdb\xbb\x77\x7b\xca\x60\xe6\x53\xcf\xe4\xcc\xdb\xe9\xff\xde\x72\xce\xb9\x70\x44\xd5\x45\xed\x99\xee\xf2\x73\x9b\x4e\xa4\xd8\xaa\x97\x1b\xd9\x85\xb2\xfc\xde\x46\xf4\x7d\xfd\xf7\xd6\x72\xf4\x27\x74\xe8\x22\x78\x33\xfc\x64\xcb\x88\x51\x70\x7e\xb2\xfa\xbc\xbb\x26\xcc\x9c\x34\x69\xe3\x86\x36\xcf\x4f\xa7\xd5\x2d\xda\xf0\xd4\x4c\x1d\xbe\xe2\xd5\x69\x93\xb6\x4c\x2b\x99\x38\x10\x0e\x0f\x70\x33\x2e\x5c\xb8\x0a\x7d\x81\x1e\xdd\x84\xa6\x2f\x58\xe0\xed\x40\x19\x18\xf1\x64\x9e\xf8\xf6\xb7\x09\x9e\x99\x7e\xc9\xc3\xb7\xaf\x4e\x1f\xf6\x42\x8a\xda\x3e\xf4\xb7\x9b\x6f\xf9\xe6\xb5\x68\xc7\x47\x1f\x7d\x94\xe9\xf8\xe4\x93\x4f\xd0\xbc\x07\x36\x5f\xbb\x7f\x09\x71\xf6\xc4\x0b\x2e\xda\x3a\x77\xd9\x8c\x3b\x57\xde\x79\xcf\xca\xef\x54\xde\xba\xe8\xa6\xbd\x3f\xb8\x78\xe2\xc4\xad\xcb\x56\x4e\xdf\x0a\x80\xdf\xbc\xe3\xd5\xf2\x5e\xc4\x19\xaf\x07\xad\x24\xb4\xae\x1a\x88\xb9\xca\xdf\xd0\x71\xf6\x77\x3e\x21\xf4\xf4\x26\x42\xb4\x97\x1e\xe2\x7d\x7d\x67\x28\x5f\x9c\x54\xa2\x7c\x8c\x4a\x72\x1c\x43\x9e\x91\xa1\xc2\xa0\xc1\x92\xd0\x50\xbf\xfe\xe3\xed\x95\x58\x95\x15\x07\x44\x4e\x63\xa5\x4c\x54\x95\x15\x25\x02\x07\x44\x2a\x46\x89\x84\x46\xb3\x6c\x26\xa2\x28\x11\x14\xea\x0d\x69\xa4\x0c\x99\x92\x08\x8f\x12\x11\xa4\x29\xe9\xde\xb0\x2a\x44\x14\x56\x8d\x73\x71\x95\x12\xfa\x22\xe1\x68\x34\x16\x67\x8c\x1a\x27\x6c\x56\x34\x64\xd4\x61\x6c\xf1\xed\x75\xc6\x75\xc5\x70\x8d\x1d\xfc\xea\xac\xd3\xaa\x83\xd0\x92\x5d\xe0\x97\x89\x6d\x64\x6d\x67\x49\xfa\x41\xe0\x0b\x12\xcf\x1d\xcc\xf3\xef\xe0\x7c\xea\x5d\xd6\xbe\x48\xd9\x77\xa1\x38\xb7\x75\xd7\xeb\xc0\xe9\xc3\xcd\xbd\xdd\x3c\xd7\x21\xf3\xb1\x0f\x37\x8e\x73\x5e\x47\xc7\x83\x3c\xdf\x58\x17\x8e\xfd\x38\xb9\xde\xf6\x8d\x59\xfe\x26\x7c\x97\x72\xd2\xaa\x8d\xd7\x90\xe5\xfd\xfb\x08\x26\x58\x73\xb2\xf7\x0f\x80\x6c\x56\x47\x20\x98\xbd\xe4\x92\x95\x73\x6e\x74\xe6\xfd\xdc\xfd\x86\x6b\xae\xb2\xb3\x2f\x92\xe8\x4a\xd9\xf2\xdd\x35\x76\xeb\xdb\x2e\xdb\x07\x8f\x81\xd7\x30\xd6\x3e\x33\x9a\xb2\xc6\x58\x73\x6b\xab\xdd\xbf\xe9\xb7\xde\xfd\x6b\x8c\x53\xeb\xed\x49\x04\xeb\x52\x2d\x58\x73\xf8\x14\xb6\x65\x4f\xdb\xe3\x72\xce\x71\x0f\xe2\xb3\x3a\x18\x06\x6e\xce\x2e\xf2\x3f\x4a\xdc\x01\x7c\xd8\x5b\xa6\x6b\x8f\x69\x60\x06\xe0\xc0\x62\x70\xa5\x75\x3e\xf2\x56\x14\x63\xc7\x46\x9d\x1d\x7d\xf5\x95\xe7\x79\x2a\xeb\xbd\x05\x7c\x68\xec\x65\xac\x75\x1a\x6c\xb5\x53\x32\x8b\xa3\x35\x8a\xbd\x55\x9b\xe8\x79\x3e\x5d\x57\xf2\x87\xa1\x31\x25\x3f\x1e\xbe\x74\x13\x23\x8d\xbd\xf3\x02\x66\xe4\xf0\xa1\x79\xf0\xac\x73\x3d\x87\xd3\x2f\x78\xe7\x2f\x98\x33\x7e\xfd\x78\x26\xfd\xb7\x96\xa5\x6b\xa5\x0d\x9e\x67\x57\x8c\x7d\xe0\xdc\xc5\x9d\x8b\xcf\xfd\xd6\xd8\xf9\xe8\xad\x97\x9f\x5a\x73\x35\x31\xa6\x75\xe8\xbc\x92\x8f\x88\x3b\x04\x81\x93\x38\xb4\xfa\xfc\x25\x68\xec\xa2\x4d\x73\xd1\xe1\x67\x46\x6d\x1d\x35\xb7\xc3\x7b\xd3\xcc\x33\x4b\x96\xac\x5d\xb2\x24\xf3\xfc\xa5\x4b\x66\x8a\x8b\x46\x2d\x3a\xb2\x6a\xd3\xda\x0d\x1b\xee\x9a\xb4\x4d\xff\xb5\x75\x63\x09\x81\x4e\x64\x32\xe8\xf6\x6b\x7f\x0f\x65\x48\x7a\x5e\x46\xeb\xfe\x7f\xac\xbd\x09\x9c\x1c\x55\xb5\x3f\x7e\x6f\xf5\x74\x75\xb3\xd7\x74\x32\x99\x16\x59\x7a\x98\xa4\xa7\x10\xc1\x22\x93\x99\x29\x08\x49\x4a\xc0\xa4\xd8\x42\x21\x2a\xc5\x5e\x2c\x26\x05\x88\x16\x20\x52\xe0\x56\x51\x21\x05\x01\x53\xa8\x84\xca\xb0\x55\xc8\xd6\x01\xc9\x34\x09\x99\x34\xd1\xbc\x37\xfe\x9e\x4f\xda\xbd\x71\x79\xb6\x0a\x38\x20\xea\x3c\xde\xf3\x39\xea\x13\x9b\xcc\xf4\x9d\xff\xa7\x6e\x2d\x7d\xbb\xba\xba\xff\xef\xe7\xfb\x29\x93\x4c\xee\xa9\x73\xab\xee\x72\xee\xf7\x9c\x7b\xcf\x39\x17\x66\xbf\x46\xe0\xac\x15\xf4\xd3\xe3\x7c\xd3\x5c\x6a\x8c\xdb\xcb\xd1\xf1\x7c\x06\xdb\x14\x7b\xbf\x1f\x3f\xce\x9b\x5f\x23\xf6\x5f\x71\xf9\xe3\x8b\x9b\x9e\x0f\xea\x1f\xb0\xdf\x9a\x99\x06\x87\x67\xe8\xd1\x35\x91\xf7\xe2\xf3\xb7\xb1\x6f\x45\xe7\xf0\x73\xaf\x36\xd5\x13\xe6\xbb\xdf\x73\x0b\x3e\x0f\x0b\xe6\xe3\x27\xbc\xf9\xc2\xac\x79\x72\x6c\x1e\x58\xf2\x47\x57\x5f\xdd\xd3\x15\xad\x6b\x14\xc7\x37\x6d\x7e\x95\x98\x7b\x5e\x39\x8e\x69\x79\xee\xb5\x68\xdb\x36\xff\x3a\xb6\x0d\xf9\x1d\x78\x5f\x69\x74\x4d\x7c\xdf\xed\x78\x96\x90\x5b\x3b\x94\xdb\xfc\x18\x8e\xd4\x1a\xfb\x65\x73\x3b\xbc\x76\xef\x3b\xac\xf9\xdd\xcc\x9a\x27\x6e\x38\xfc\xf8\x33\xbe\xb6\xfc\x07\x99\xc6\x7b\xe4\xb9\xb3\x3d\xda\xae\x47\xe9\x99\xa5\xdf\x12\x4e\x6b\xa2\x71\xa9\x02\xbd\x2e\xb3\xf6\xeb\x6e\xab\x7f\x2e\x80\xa5\x66\x86\x1e\x3d\xbf\xea\xe9\xc0\x42\x6a\x07\x6d\x30\x6b\x9f\x39\xd1\xa5\xad\xd8\x31\xf2\xc3\x0c\xbd\xfb\x2d\xcc\x67\x35\xf7\xc1\x23\xc1\x7e\xf9\xcd\x78\x4d\xfb\x6c\x66\x60\xc7\xa2\xd9\x63\x01\xc8\x0c\x6c\xfe\x71\xa2\xdf\x5d\xc3\xfc\x58\x32\x35\xf0\x29\x7a\x12\xeb\xc6\x9b\x03\x9f\xdb\x30\xef\xef\x23\x2a\xc6\xf0\x60\x9f\x49\x68\xee\xa3\x9d\x81\x0d\x78\x8b\x3f\x6e\x6b\xf7\x96\xd0\x19\x00\x70\x37\x07\x23\x47\xf6\xab\xf7\x6d\x9b\x03\xff\xa7\xc8\x3a\xbc\x23\xb8\x27\xb2\x10\xf4\xdd\xae\xcd\xc7\x26\x87\x4f\x5b\xf1\xe3\x4c\xdb\x31\xda\x7b\x17\xf1\xbd\xde\x3a\xf3\xcb\xf8\x79\xe6\x3d\xbf\x27\x88\x11\xff\xe0\xdc\xd2\x54\x81\xfe\x74\xc6\x5d\xd3\x6f\x9f\x9b\xc9\xd0\xcf\x3c\xc7\x00\xf2\xfe\x81\xcd\x1b\x9a\xfa\x63\xcd\xdc\x8d\xa9\x4d\xf4\xca\x4c\xfe\x59\xeb\xed\xdf\x67\xe8\xdd\x4f\xf6\x2c\x6c\xee\x8f\x1d\x85\xf8\x39\xe6\xcb\x55\xe0\xc7\x5f\x0a\x9f\xdf\xdd\x46\x0e\xf1\x3c\x7a\xb6\x91\x0b\xcf\x6f\x57\xf1\x6c\x40\xca\x42\x23\x27\x2a\xce\x3b\x6d\x1e\xdb\x32\xe7\x7f\xd1\xb4\xce\x5f\x38\x37\xe4\xb6\x97\x59\xbb\xa7\x6b\xf6\xa1\xb9\xb7\x97\xfd\x4e\x38\x35\x83\xa3\x0d\x43\x5c\x72\x79\xf0\x99\xce\xe8\x75\x61\x5d\x7e\x0c\xe2\xe6\x7f\x6b\xea\x8b\x4f\xcc\x0d\xa6\x1e\x71\xeb\xfa\xca\x51\xf5\x3f\xcd\xbd\x35\xa4\xac\xd8\xca\xac\xda\xd3\x05\xb6\xcd\xbd\x7d\xe6\x41\xdf\xe7\xc2\x6a\x6e\xff\xe8\x47\xe3\xfb\x65\xf4\xc6\xe8\xbc\xf2\xe7\x48\x80\x37\x56\x18\xef\xe5\xdd\x05\x1f\xe8\x98\x61\xae\xfd\xcd\x3f\x6b\xc2\x8f\x42\x88\xc9\xb8\x1f\x77\xad\x8c\xce\x83\xb1\xa5\x4d\x32\x1f\xce\x1b\xb7\x67\x19\xfa\x99\x9e\xf8\xef\xdc\xf5\xd9\x68\xff\xda\x27\x34\x8d\xdf\xe5\xc1\xfc\xdf\xf5\xe2\xec\xbf\xcf\xcd\x2c\x1d\x76\xa5\xda\x9f\xff\x72\xd0\xbf\xbe\x6c\x06\x3e\xaf\x37\xf9\xb6\xd5\xc0\xce\x0f\xd6\x4f\x07\x80\x19\xd8\x74\xb0\x8e\x4f\xbb\xb6\x7d\x89\x1c\x7b\x66\xcd\xae\x2d\x14\x58\x3e\x26\x44\xc7\xdf\x1b\xb3\x97\x23\xf3\xc8\xf7\x23\xdf\xfd\x24\x9e\x17\xef\x8a\xf6\xef\x2e\x29\x32\x4f\x83\xfb\x77\xa5\xc6\x3a\x0c\x0e\x07\x37\x7b\xef\xf6\xb3\x5d\x7e\x10\x7c\xc4\xcf\x77\xf9\x31\x70\x3b\x00\xf3\xfc\x4c\x3d\x3d\x7d\xdd\x7d\xc7\xc3\x3e\x8a\x3e\x05\x0e\x0c\x2e\x1e\x19\x1e\xf1\xf2\xf6\x50\xa9\x81\x85\xf3\xf0\x11\xae\xfb\x7f\xe8\xaa\xd1\xc3\xcb\x60\x7f\xaa\xbd\xc2\x38\x38\x9c\xea\xe9\x1b\x4a\xf6\xc4\x40\xb4\x7f\xfc\xb4\x07\x9e\xf7\x45\xf8\x30\xfa\x04\xbc\x0a\x6d\x83\xdb\x8e\x12\xc5\xb3\x8f\x5d\x72\x5a\x8a\x4e\xa1\x9f\xfc\xca\xba\xe3\xd6\x92\xf6\x8e\x06\x87\xde\x8f\x7e\x70\x1a\xec\x43\xbf\x83\xef\x46\xfb\xe1\x0f\x7e\x89\x9e\x48\x95\x8e\x4a\xbc\x55\xc8\xb1\xd0\xa9\x97\x29\xab\xae\x51\x05\x46\xd1\x39\x35\xab\x71\x5c\x36\x5b\x97\xed\x5c\xce\x35\x9d\xa0\xc3\x70\x39\x2d\xcb\x21\x5e\xcf\x8a\x86\x04\x0b\x7c\x56\x67\x58\x2e\xa7\x67\x93\xd3\x1b\x37\x9a\x1b\xd1\xa5\xaa\x80\x7e\xf2\xe8\xfa\x2c\xfb\x89\x89\xca\xed\x07\x9f\x44\xdf\x7b\x69\xed\xdf\xe1\x4a\xf8\x4f\x8f\x6e\xdc\x88\xde\x78\xf4\x51\x74\x66\x2e\xa7\x16\x12\xb3\xac\xc8\xd7\x1d\x5d\xd7\x51\xba\x9a\x33\x18\x11\x1a\x5d\x82\x54\x36\x8c\x9a\xae\xcf\x4e\xeb\x26\x6b\x6a\xb9\xdc\x74\x51\x2c\x4c\xd8\x16\x5b\x30\xd3\x76\x21\x5d\x32\x22\x32\x8e\xe7\x60\x7e\x13\xf6\xaa\x32\xb3\x21\xe6\x61\xbb\xdf\x95\xca\x4c\xe3\xce\x34\x97\x07\xaf\xdb\xee\xfa\xcf\xd0\x66\x6f\x93\xfd\x6d\x04\xf3\xb6\x30\xd0\x84\x9d\x61\xf9\xd8\x93\xc4\xf8\xe3\xfd\x03\xbf\x9e\x05\xf1\xba\x67\xe1\x43\xe1\x3c\x0a\xd6\xd9\x1f\xe3\xdc\xf2\x58\x6a\xcc\x1e\x42\x36\xcc\x4c\x7e\xdf\x1d\xf1\x6b\x5b\xe1\xa5\x26\xd9\x13\x9a\xbf\x69\xd7\x47\xa3\xf6\xe6\x0b\x7b\xdc\x77\x6c\xc6\x92\xbc\xe9\xa0\x9f\x5f\x4a\x4c\x99\xb4\x8d\x6d\x91\x33\xc1\x72\x70\x36\x10\xc1\x6a\xf0\x21\x70\x85\x9f\x9f\x03\xcf\xaf\x6e\x3f\x65\xd6\x90\x6b\xd4\xb9\x26\x5a\x06\x76\xf7\x77\xc7\x4c\xbf\x5e\x7f\xf6\x25\x48\x73\x25\x66\xf6\x41\xf9\xc1\x11\xea\x06\xf4\x23\x78\x22\x7a\x1d\xae\x41\xa3\x8f\xa0\x45\x1b\xe1\x85\xdf\x5b\xf2\x85\xeb\x1e\x87\x1f\x98\x48\xfc\xb3\xcd\xe4\x60\xa1\x5e\xa2\xf4\xba\x49\xe9\x69\x59\xe3\xb4\x6c\x91\xcd\x32\x75\xdd\xc9\xb1\xb0\x88\x24\xfc\xa3\xf1\x59\x25\x2b\x20\x51\x65\x79\x55\x80\x45\x8e\x51\x19\x8e\xe7\x34\x96\xb6\xb9\xa2\x85\x8a\x16\x32\x2c\x94\x85\x53\x16\xc5\x40\xe9\xe0\xf7\x75\x98\x9e\x2d\x40\x03\x19\x5d\x13\x39\x49\xf0\x27\x56\x85\x31\xd2\x0a\x54\xbb\x04\x19\x9b\x39\xc6\xec\x94\x6e\xe6\x4c\x9d\x61\xa7\x0a\xc2\x44\xd1\xb2\x73\x8e\x95\xb6\x4b\xe9\xb2\x11\xa7\xdb\x3d\xd2\xc8\x81\x7d\x6e\xea\xd3\x58\x17\x7c\x13\x00\x66\xe5\x13\xef\x67\x16\xae\xf8\xf1\xb9\x7b\x09\x1e\x23\x93\xdf\x76\x5d\xcc\x3a\x11\xae\x93\x66\xc3\xef\x4a\xf2\xf6\xa4\x47\xaf\x6d\x60\x07\x38\x1c\x2c\x9a\xbb\x38\xf5\x14\x7d\x2f\x98\x8f\xef\xb9\xf1\xf6\x79\x24\xf0\x11\x70\x15\xb8\x1e\x00\x38\x38\xd4\xd7\x33\xc8\x50\xa9\xde\xe1\xcc\xbc\xc1\x44\xef\xf0\xc8\x40\xaa\x3b\xb1\xa0\x37\xbc\xb1\x2c\x3f\x90\x08\x4c\xf3\x7f\x70\xbd\xa0\x9e\xff\xf5\xec\x2f\x7f\x78\xfb\x63\x1f\xde\xfa\x48\x4a\x87\xd2\xf6\x4f\xad\x74\x76\x9e\xbe\x00\xae\xf8\x72\xfd\x17\x1b\xe1\x2d\x3d\xa7\x6c\xa1\xce\x81\x53\xcf\x66\x4f\x84\x7b\xeb\x1b\xa8\x37\xea\x27\x50\x6f\x31\xb7\x6e\x78\xdf\xad\xbd\x9f\x19\x58\x39\xd0\x5b\xef\xdd\x73\xe2\x72\xf8\x06\x3a\x01\xbe\x71\xe2\xf0\xc0\xad\x03\xc3\xa8\xf7\x93\xc3\xcb\x3f\xf3\x61\xf8\xab\xe1\x63\x3e\xc9\x9c\xb6\xfc\xb4\xcf\x9c\x48\x5d\xf2\xe8\xa3\xe8\x77\x08\xdd\x72\xd7\x5a\x78\x2e\xfc\x50\xfd\x7b\xd7\x98\x9b\x3e\xbb\x17\x3a\x5d\xfc\x9a\xbb\xd0\xd7\x0f\x1e\x84\x1f\xba\xf6\xe2\xfa\xaa\x8d\x1b\xa9\x69\xf6\xfd\x7c\x7d\x93\xae\xdf\x86\x52\x2f\xbf\xcb\xcc\x2a\xf0\xba\xae\x0b\xa4\xf2\xfd\xf7\xbf\x63\x18\x75\xda\x78\x98\xdf\xa2\xa7\xd9\x7f\x2f\x88\xa5\xe7\x1f\x36\x59\xe7\xfe\xf4\xe6\x22\x53\xb9\x7b\x6e\x0e\xdc\x3a\xf7\x81\xd4\x28\x7d\xaf\xdb\xdf\x87\x27\x99\x55\x3b\xef\x9e\xfd\x36\x38\x65\xf9\xdc\xf2\xb7\x5a\x31\x6b\xf7\x71\xe1\xb8\x06\x98\x70\x7f\xd3\xd8\x15\x9a\xb1\x75\xf4\x86\x28\x26\xee\x1a\x6b\x7a\x5e\x8f\x60\x74\x8b\xef\xe3\xa8\xd2\xa4\x27\x84\x58\xf4\xd4\x7f\xe2\x35\x2a\xa8\xa7\x18\x94\xef\xfe\x5d\x53\xfd\xe1\x1e\xe1\xe3\x37\x35\xd9\x84\x62\xf3\x77\xda\xff\x0a\x22\xfb\xe4\xcf\x8d\x36\xe9\x34\x72\xf3\xf3\x9b\x16\x47\xd7\x1b\xaf\x7c\x87\x1e\x5d\x1b\xbd\x7e\x1b\xbd\x26\xaa\x63\xed\x49\x36\x7d\x8f\x1e\xe4\x8a\xdf\x8c\x7d\x53\x9e\x78\x3f\xf1\xbc\xb7\xf7\x89\xed\xf8\xdd\x6f\x45\xbf\xff\xa9\x1b\x9b\xd6\xb9\xe6\xf5\x9d\xde\xf4\xd1\x68\x7f\x16\x70\xd4\x6a\xf8\xbc\x18\xe8\xbf\xdb\x1e\x86\x60\xc5\xb9\x02\x49\x53\xc2\xbb\xe6\x71\xdb\x76\x61\x3c\x00\x47\x02\x6d\xee\xb2\x94\x41\x3f\x06\x0e\x07\x47\xfb\xbb\xab\xc1\xbe\xea\x35\xe0\x46\x70\xb3\x2b\x73\xdd\xf3\x69\x57\x82\x16\xe3\x3c\xae\x30\xbc\x3e\x28\xd5\x3f\xe2\x23\x35\x69\x18\xc3\xde\xf9\x0d\xd9\x3b\x1a\x36\x59\xd3\x81\xec\xc1\x36\xa1\x9d\xf4\xa2\xcf\xaf\xbc\x6f\xcd\xb1\x77\x5c\x81\xfe\xfe\xf9\xcf\xd7\xef\x79\x14\xde\x85\xee\x87\x4f\xa0\xab\xa0\x45\xa1\x9b\xe0\x26\xb4\x11\xde\x06\xef\xd5\x04\x61\x83\x52\xff\xa7\xeb\x85\x4f\x2f\xba\x05\x3e\x6b\x65\x13\xd9\x19\x23\x69\x1d\xd2\x92\x12\xa3\xda\x59\x3e\x2b\x64\x45\x36\x7b\xa8\x08\x95\x23\x7e\x9a\x98\x9e\x65\x12\xd3\x33\x82\x2e\x29\xba\xd6\x95\x93\x39\x83\x97\xea\x35\x21\x6b\x65\x05\x38\x2d\xba\x7f\xd1\x5f\xad\xf7\x2d\x3d\xe5\x98\xf5\xf3\xdf\x47\x9d\x8a\xf2\xd4\x79\xe8\x8f\xb7\xdd\x72\xcf\x3f\xff\xf3\x3d\xb7\xdc\xf6\x57\xee\x23\x67\x9e\xbe\x6a\xf8\x8c\x2b\x17\x0d\x49\xf5\xa1\xa5\x27\xa5\xd0\x2d\xef\x93\xdf\xf7\x97\xdb\xe9\x3b\x52\xe7\xc8\xd4\xd3\x27\x59\xa2\xf8\xf0\xaa\x55\xe8\x23\xcb\x3e\x7f\xfe\x35\xe7\x9f\x7f\xc9\x47\xdf\xf7\xd1\x4b\xd8\x6b\xae\x39\xe9\xa3\x97\x9d\x74\x8d\xdc\x77\xcd\x65\xfe\x78\xf0\xa9\x1f\xba\xe3\xb1\xe7\xa6\x5b\xa6\x97\x2d\xc1\xe3\x71\x1d\x88\x9c\x3b\xf8\xb2\x72\x73\x74\xcc\xbd\xf2\xdd\x39\x62\x6c\x49\xbd\x7d\x5e\xf4\xf9\xd1\x66\x99\x08\xe7\xf2\xb6\x5f\x47\xb0\xd3\x3f\x8b\x18\xc5\x39\x8f\x76\x34\x7c\xcf\x4f\x4b\xfd\x94\xd6\x32\xf9\xb1\x85\x9e\x3e\x77\xce\xef\x71\xf9\xe2\x60\xbf\x00\xcf\xc1\x55\x4f\x5c\x54\xff\x30\x38\xf5\x8c\x2f\xad\xb8\x93\xbc\x8b\xcd\x6f\xc3\xda\xf8\x79\xbb\xfd\xbf\xa2\xeb\xcc\x93\x74\x44\x97\x0e\xe4\xee\xea\xa6\x72\x3e\xd4\x19\xbe\x1f\x69\x5b\x73\xfd\xa7\xc6\xbf\x77\x33\xbe\xe3\x07\xdf\x3b\xe6\xe9\xa4\xf3\x41\x0e\x9c\x05\x04\x70\x6e\x88\x29\x38\x9b\x66\xf7\x60\x77\x7f\xef\x48\x6f\x57\x72\x60\xd1\xbc\x7e\xf7\x1f\x70\x64\xde\x20\xce\xdf\xd1\xdf\x3d\xf8\xbf\xc1\x92\xe7\x12\x57\xa3\xfa\x5b\x6f\xc1\x57\x73\xe8\x3e\xc4\x0d\xc2\xa3\xe0\x2f\xde\x7c\x1b\x5e\x73\x2f\xf5\xe6\x9b\xeb\x5e\xfd\x45\xa2\xe7\x7f\xa3\x61\x4e\xda\xa8\x54\x37\xfe\x7a\xe9\x86\x7b\xef\x7c\x48\x84\x12\xa5\x43\x69\x26\xc1\xc1\x47\xa0\x02\xab\x28\x87\x0a\x5d\xda\x3f\xa0\x56\x36\xed\xbb\x7d\xaf\xa9\xcf\x23\x38\xfe\xd8\x6e\xa2\x9c\xb0\x1b\x36\x6f\x24\xca\xbd\x79\x76\x55\xd3\x3c\x0b\x7d\xde\x9e\xbb\x90\xc0\xfd\x23\x82\x7d\x00\xec\x7b\xf4\x2e\xec\xe3\xb9\x0c\x9c\xe3\xdf\xca\x73\x83\x17\x55\xda\x00\x79\x7f\x77\x38\x3c\xca\xf9\x47\x07\x08\xba\xf5\x0d\x7b\x43\xdf\xdd\x47\x5d\xc9\x65\xa1\x6d\xd7\x35\x1b\x1a\xd9\x1c\xe4\x6d\x5b\x37\x8a\x65\xc5\xac\xc8\x93\x89\x9f\xff\x2f\xc6\x6a\xe6\x37\xd4\xb7\xea\xbb\xee\xef\x45\x05\x74\xe9\x09\xf0\x0c\xf4\x2a\x7d\xcb\x4d\x3a\x1a\xfb\xde\xeb\x50\xbd\xfe\x83\xe8\xa2\x4d\xff\x72\xdb\x37\xbf\x79\x81\xfe\xab\xdb\xd6\xeb\xd4\xc4\x3f\x30\x68\xf0\x07\x77\xa1\x77\x1f\xdf\xff\xf9\x0f\xad\xf8\x6a\x3f\x05\x9b\xf0\x6a\xdf\x9e\xa6\x31\xf4\xee\x7e\xd4\x99\xb5\x4f\xac\xae\x53\x00\x2c\xb3\xdd\x15\xc9\x1d\x19\xd2\x96\xc7\xb7\xcf\xe5\xb7\xeb\xc1\xe8\x90\x34\x6f\xff\x6c\x94\xbc\xcf\xdf\xe3\x29\x47\xf6\xc3\x82\x39\xf4\xdd\xa6\xf7\xf3\xf8\x7c\xfd\x7e\x66\xcd\x8e\xe7\xbb\xfe\xb2\xd4\x11\x1e\xc8\x34\xce\xd8\x43\xfd\xb1\xf0\xe9\x36\x75\x95\xe3\xd7\xb7\xcd\x2f\x45\x74\x84\x60\x9f\x64\x5e\x53\x79\x44\xf7\xd9\xf1\xfe\x70\x3f\xd9\xb7\x3d\x7c\x1d\xe7\x47\x51\xcc\xdf\x5e\xea\x24\x07\xdb\x3f\x19\xae\xab\x7c\xd3\xda\xf3\x1d\x42\x27\x0a\xd7\xed\x4c\x6a\x47\x72\xb6\x06\x98\x70\x6d\x33\x83\x75\x75\x7b\xb5\x7e\x0b\x00\x23\x8b\x85\xe6\xf5\x10\x7f\x93\x99\x21\xfa\x9b\xc4\x80\x20\x0e\xfd\x86\xb9\xcf\xa5\xee\x70\xcb\x8b\xf8\xdc\x6c\xf7\x93\x33\xcb\xc3\xbe\xc0\xe7\x75\xdb\xee\xc3\x39\xaa\xee\xc5\x3b\xe3\x5f\x8a\xf4\xeb\x78\x64\x7f\x28\xb8\x07\x74\x61\x53\xbb\xb5\x20\x56\x70\x2b\x8e\xf1\xdb\xd1\xdf\x66\xdf\xa0\x71\x56\xe8\xfb\x52\xec\xc6\xe3\x66\x06\xf9\xdc\xec\xf0\x9b\xb0\xdf\xb9\x79\x74\x74\x7c\x8a\xff\xd5\xa9\xbf\xc7\xf6\x85\xfb\x3b\x4d\xe5\x5b\xb6\xc7\x63\x83\x79\x54\xfc\xf3\x5b\x2f\x21\xf6\x68\x71\xb9\xdd\xd7\x09\x63\xcc\x23\xc3\xef\x6f\x7e\xef\xbe\x28\x56\x39\x3f\x8e\xe8\xa6\x41\x7f\x1e\x6c\x2a\x17\x9a\xeb\x79\xba\x10\xff\xde\x6d\x27\x87\xcf\x2f\x4b\x3d\x42\xdf\xcb\xac\xd9\xd3\x75\x66\x72\xf9\x0a\x01\x30\x2b\xb7\x9d\xf3\xf6\xdf\x97\xae\x15\xae\x8d\x5b\x87\xcd\x23\xe2\xeb\xdb\xfa\xa9\xe8\xfc\x7e\xda\x88\x69\xb7\x9e\xc9\x3b\x2f\xbb\x73\xc6\xa9\x04\x9a\x2a\x29\x5b\x5b\x4f\x8a\xb1\xc7\xdd\x72\x2a\x46\x5f\x37\x32\xf9\xad\x30\x66\x4c\xdd\xb9\x74\x06\xfe\xd6\xc3\xc3\xfd\x41\x21\xb5\xc1\xbb\xeb\xf2\x08\x70\xc6\xb8\xdb\xc6\xd1\x35\x37\xcd\x9c\x75\xa5\x40\xee\x39\xb8\x7d\xfc\x06\xfe\xb6\xd7\x89\x6f\x0b\xcf\xa3\xb6\xdc\xcc\xe0\x55\xad\x96\xf6\xef\x58\xcc\xe1\x33\xc8\xa3\x80\x08\x2e\x04\x12\xb8\x12\x5c\x0b\x6e\xc0\xbb\x51\x3a\xf8\x1c\xce\x2d\x1d\x80\xca\xc8\x82\xde\x64\x9f\x9f\x3a\x9d\xb8\x63\x65\x41\x32\x95\x1f\x68\x56\x68\xb1\xff\x32\x76\x5c\x0e\x34\xe0\xa1\xbe\xa4\x7f\x4b\x4b\x62\x70\x78\xa4\x37\xd5\x87\xef\x80\x23\xd0\x07\xeb\xc0\xcd\xce\xd1\x38\x53\xb7\x6a\x1f\x92\xed\x44\x2e\x9b\xd3\x05\x6e\xb6\x06\x79\x1b\xda\x36\x94\x51\x01\xb2\xa8\x4a\x31\xc8\xb0\x61\x56\x95\x84\x19\x31\xe9\x1c\x52\x92\x62\x5a\x35\x59\x89\xc9\xe5\x04\x71\x66\x52\x14\x65\xc8\x3a\x48\x83\x53\x68\x1a\x32\xa8\x0c\x2b\xd0\x46\xaa\xfb\x53\x99\xcc\x31\x36\x07\x6b\xaa\x54\x9f\x12\xcb\x5d\xec\x4c\xb5\x8b\x55\x79\x96\xe5\x72\x1c\x9b\x3d\x54\xd2\x44\x55\x56\x12\x1c\xcf\x99\x39\x1e\x2b\xc3\x7c\xb2\x86\x26\x8b\x45\x98\x63\x73\x92\x20\x57\x78\x9e\xe7\x55\x49\x15\x74\x45\xd2\x73\x39\x54\xe3\x65\xbe\xa6\x67\x25\x46\x14\x38\x2a\x9b\xcb\xea\xb2\xaa\x0b\xaa\x24\x49\x35\x01\x55\x38\x2e\x27\xf0\x82\x60\x09\x82\xc5\xf3\x48\xe4\xf9\x6c\x3a\xa7\x65\x45\x4d\x54\x45\x49\x90\x04\x59\xe0\x64\x99\x55\x25\x52\x8e\x9d\x9f\xc4\xc8\x87\x9e\xc9\x6f\x7a\x07\x8f\xe9\x76\x3c\x23\x0e\x6b\xd6\xe7\x9c\x7f\x8b\xe1\x09\xd6\x4e\xfa\xa9\x3f\x12\x6b\x3f\x5e\xa3\xdc\xd5\x89\xa1\xb7\x5c\x13\xae\xc1\x4d\xcf\x3b\x3f\x27\xf4\x45\x62\x3d\x75\x7e\x16\x62\x42\x93\xcc\x38\x3f\x8d\xce\xe7\x4d\x9b\x5a\x70\x95\xb8\xfb\xb9\x49\xd7\x26\xde\x3b\x7a\x45\xf8\xfd\xe7\xa7\x9e\xa1\x0d\x66\xed\xa6\x1d\xf5\x7b\x41\xef\x99\x1f\x5e\x71\x2c\xb3\x72\x4f\xd7\xdd\x87\x9d\x55\x5d\xb1\x8d\xbc\x53\x71\x0c\x9f\x25\x98\xe9\x26\x5d\xcb\x0c\x65\x3c\xe5\xeb\xb7\xba\xd7\x0e\x70\x1c\xe0\xc1\x85\x40\x03\x9f\xc4\x73\xfb\x4b\xe0\x81\xe0\x84\xb3\x29\xe8\x79\xb8\x29\x20\xba\x0d\x71\x00\x86\xb7\x08\x34\x02\xa3\xdb\xa8\x5a\x23\x5e\xfe\xff\xe1\xa1\x76\x2a\xd7\x88\xb7\xb3\xc2\x48\x59\x23\xcd\x58\x05\x56\xd3\x14\x2d\xab\x89\xa6\xa8\x89\xbc\x62\x98\x25\x45\x64\xb2\x94\x26\x66\xf5\x34\x63\x15\x73\x9a\x1a\x52\x05\x45\x37\x4a\xb2\xc4\xce\x56\xa7\x6c\xc8\xd8\x53\x53\x36\x9a\xb6\xa7\x92\x69\x27\x9b\x83\x6a\xbd\x82\xb7\xcd\x0c\x46\xd2\x38\x35\xab\x73\xd9\x6c\x5a\xe4\x24\x45\xe0\xd2\x75\xab\xc0\x4a\x9e\x4e\x56\x12\xb3\x6a\x96\x47\x35\x95\x91\x14\xa1\x96\xd3\xd2\x10\x94\x2b\xac\x2c\x4a\x9c\x56\x81\x7c\x2e\x6b\x4c\x41\x9d\x45\x76\x99\x49\x43\x89\x43\x69\xe4\xe4\x38\x51\x60\x2b\x95\x9c\x24\x49\x9c\x5a\x85\x5c\xeb\x23\x85\x1c\x6b\x75\xbd\xa9\xeb\xba\x6e\xc9\xb2\x2c\xc3\xb3\x72\xae\xce\xa6\xe9\x1a\xca\x4e\x67\xcd\x2c\x2f\xe5\x0a\x06\xab\x19\x6a\xa1\x8b\x73\x55\xb7\x69\xc3\x98\x9d\x76\x9c\x5c\xd1\x66\xb2\x95\x12\x5f\x2a\x14\x26\x98\x49\x33\xce\x5e\xd9\x32\x14\xaf\xab\x8c\x2e\x6d\x9a\xc7\xae\x3c\x7c\x25\x32\xff\x9a\xe6\xd9\xe6\xf5\xd1\xb5\x7f\xcb\x5d\x11\x2c\x0f\xb0\xff\xbe\x96\x75\xd9\xf3\x7f\xfc\x18\x9e\x5f\x34\x21\x6f\xd8\x2f\xc7\x93\x4e\x27\xf0\x9b\xbd\x73\xee\xec\xd4\x18\xfd\x08\xb3\xd6\xd9\x36\xfb\xea\xdc\x3b\xcb\xae\x58\xf1\x29\x77\x1e\x7f\xe8\x88\xe5\x2b\x84\x2b\xc9\xef\xf5\x72\xd1\xb7\x62\xa2\x8f\xad\xc9\x96\x7d\x9c\xcb\x9b\xf6\x89\xe4\x70\xff\xc8\xdb\xaf\xa9\xc5\xef\xcb\x98\x2d\x67\x1c\xbe\x4e\x27\xb7\x79\x6f\x22\x1e\x8b\x4d\x2a\x1e\x3b\x1f\xbf\x31\xfa\xde\xcd\xf7\x36\xb5\xeb\xea\xb9\x0f\xa4\xbe\x4c\xaf\x63\xd6\x6e\x38\x11\x00\x30\x23\xbc\x6f\xf8\x4a\x66\xe5\xee\x27\xff\xf6\x07\xe1\xea\xa1\x1f\x86\xf8\x65\x87\x7b\xe6\xb0\x69\x2f\x5d\x0d\x6d\x28\x3d\x5e\x67\xd9\xf1\xf5\xe8\x77\xf9\xeb\x00\x68\x1a\xbf\xb0\xfc\x91\x5f\x86\xfd\xd7\xa4\x9b\x8e\x5e\x46\xb4\x1b\x7f\x8f\xb7\x5e\x8e\x7e\x30\xde\x8e\x1e\xbd\xb4\x4d\xf9\x87\xda\xe8\xd6\xcf\x85\xdf\xc9\x79\xeb\xf1\x23\x0f\x35\xed\x83\x35\xc5\x37\x11\x7b\x54\x8d\x7e\xfd\x52\xcb\x7c\x21\xce\xd1\x5f\xc8\xba\xd4\xf5\x73\x71\x63\x34\xfa\x91\xf8\x39\xe0\x5c\xdf\xd4\xd7\x76\xd0\x47\xeb\x91\x5f\xce\x45\xe6\xcc\x25\x51\xfd\x73\xec\xed\x26\x3d\x39\xfa\xde\x0f\x37\xd9\xbd\x4e\x26\xbf\xfb\x29\xac\x9d\xe0\xf3\x12\xc0\x00\x75\xee\x03\x29\x1d\xe7\x22\x0d\xee\x7a\xf6\x22\x6c\x3c\xbf\x33\xcf\xce\xbd\xd2\xb5\x74\xe7\xf9\x51\x8c\x3d\xc1\xb5\x6f\xd1\x7f\xb7\x59\x84\xff\x27\x1b\x6c\x81\xb6\x33\x4d\x4d\xd4\x05\xcb\x5b\x21\xbd\x1f\xaa\x4c\x55\xeb\xac\x05\x4b\x48\x0c\x7e\x10\xb0\xd2\x4c\x22\x3b\x63\x26\xcd\x43\x7a\x52\x8c\xec\xae\x65\xab\x89\xea\x2c\x9b\xa8\xce\x48\xed\x77\xd7\xba\x58\xe7\x90\xe2\xd0\x5a\xbd\x0c\x2d\xa1\x2a\x54\x05\x68\x87\xbf\xa2\xed\x27\x2e\xe8\x45\x77\x0e\x5f\x3f\x8c\xfe\xb4\x2e\xb5\x2e\x75\xe1\x0d\xd4\x37\xf2\x0f\x9f\x7a\xaa\x39\x3c\x8c\xb8\x73\x1f\xbe\xf4\xe6\x0f\x5d\x7a\xe5\xed\x43\xb7\x5f\x79\xda\x2d\x37\xe7\x6f\xbf\x21\x7f\x8b\xfb\x5f\xe2\x37\x68\x62\x62\xc2\xf3\x4f\x16\x9a\xb1\x7e\x54\x22\xec\x0e\x72\x5c\x2e\x6e\x33\x77\x6b\x51\xbb\x66\x74\x35\x9e\xbb\xfd\xf1\xba\xc4\xe8\x45\xc4\xf8\x16\x1a\x7a\xf6\xfa\x3a\x1e\xdf\x63\xc0\x25\x73\x1f\xc0\x18\xec\xf9\xa9\xf6\x80\x77\x87\x99\x66\xbd\x2c\x25\xfe\xcd\x8b\xf3\xfc\x84\x78\xad\x63\x3a\x30\x8c\x5d\x4d\xfb\xbc\xfb\x48\xbc\x68\xd3\x64\xd3\xc6\xea\xff\x06\x7c\xbf\x0b\x87\x8e\x49\x8f\x1e\xc3\xc0\xd1\xd9\xa7\xbe\x42\x9d\x55\xff\x76\xf8\xe3\xdc\x73\xc7\xdd\x1f\x5d\x37\xfb\x75\xaa\xcb\x80\x3f\x41\xa7\x19\xf5\xd9\x27\xd6\xad\x13\xcc\x75\xf0\xda\x85\x2f\xbc\xb6\xf8\xbf\xe1\x1f\x2a\x1b\x2f\x5e\x57\xa6\xf4\xff\x05\xe6\x26\xff\xcc\xf3\x2c\x9b\xab\x1b\xb0\x2c\x4e\x0b\xd3\x22\x7a\x53\x32\x25\x55\x46\x39\x4a\xa8\x4f\x58\xd3\xd3\x54\x85\x53\x74\x95\xb3\x74\x59\x34\x45\x8e\x97\x0c\x49\x48\x26\xfe\x11\x54\x6d\x92\xef\x23\x70\x0e\xdb\x23\x03\x29\x0c\xef\xbe\x08\xf4\xbd\xfc\x8e\x3c\x1e\xc1\xd9\x0e\xb4\x99\x70\x5d\x22\xe6\xc2\x8e\x85\xd1\x35\x60\xf3\x17\x3b\xd9\xac\xa3\x17\x12\x6b\x12\x51\xcf\x56\xa3\x09\x97\xec\x4c\xfe\x85\x77\xb9\xe5\x2f\x64\x9b\xe6\x9a\x95\xc9\xef\xba\xb1\xb1\x96\x90\x7e\x7c\xa3\xe7\xe1\x3c\x44\xa7\xe0\x6f\x3d\x84\x69\x8f\x05\xfe\x04\x3b\x96\xa0\xe5\x73\xb3\xa7\xbf\x25\x3c\xc4\xac\xdd\x08\xd0\xb3\xe0\x98\x53\x0f\x13\xfe\x83\xf0\xad\x69\xd2\x25\x37\x7f\x21\x6a\xc7\x8e\x8a\x11\x1d\x83\xf3\x74\x0c\x77\x15\x67\xe8\x47\x0f\xb4\x91\xab\x0b\xc2\x36\xb1\xa9\xa2\xdb\xa6\xcd\xeb\xf0\xd7\xbd\x03\xc8\x33\x90\xc0\xfe\xf7\xcf\xac\xd7\xd7\xc2\x7e\xc0\x63\xb0\x19\xdb\xa4\xce\xf6\x50\xef\xe1\xbc\x7e\x18\x3d\x1f\x3f\xfd\xf7\x36\xfd\xbc\xaa\x79\x9f\x2b\xd0\xeb\xd7\xbf\x1d\x7d\xfe\xa9\xff\x68\x6a\xdb\xb5\x73\x42\x6a\x2b\x6d\x30\x6b\x36\x9d\xd4\x7b\xd8\x92\x57\x56\x6c\x75\x7b\x69\x5e\x63\x6c\x30\x36\x7b\xb6\xea\xfa\x20\xaf\xcc\xa5\x73\xa7\xa4\xee\xa2\x3f\xcd\xac\xdd\x74\x16\xba\x67\xee\xcf\xa7\x2f\x11\x4e\x73\x75\x1f\xed\x8f\x4b\x6f\x13\xcc\x98\x33\xa3\x95\x04\xf6\xe1\xf5\x63\x2b\x8e\x34\x08\x75\x1c\xa1\xf9\x9b\x37\x07\xb8\xf4\xe8\xdc\x99\xa9\xc7\xe8\x35\xcc\xda\x0d\x57\x01\x06\x6e\x58\x51\x59\x7e\x2c\xb3\xf2\x89\xf7\x1f\x91\x58\xf1\xe3\x65\x3f\x8a\xc1\xa1\x0f\x10\x78\x46\xae\x5f\xe7\x36\xe1\x53\x68\x7b\xaf\xff\xef\x70\xdc\x39\x2f\xe6\xc2\xeb\xe3\xcd\x9f\x27\xe6\x2c\x69\x23\x91\xf9\x3d\xb0\xae\xe8\x9c\xde\x34\x56\x61\x4e\xa9\xd1\x73\x9a\xd6\xd3\x41\xaf\x9c\x59\xbb\xf9\x5d\x68\x01\x60\x96\xfc\x58\x78\x9f\xb7\x8b\xe4\xe7\x6d\xf1\x72\xfc\x9f\x8d\xbf\x35\xf0\x3d\xb8\x0e\xe7\xb8\xd0\x99\xb5\xe6\xad\xf5\xdb\x01\x38\xf3\x0f\xde\x7e\x25\x13\xa3\xb3\x8d\xbe\x9f\xd8\x17\x24\xda\xbd\xf9\x73\xf1\xba\xe2\xd8\xf3\xd1\xb9\xf2\xc4\x71\xc0\xdf\x0d\x8d\x1b\x8f\x51\x81\x90\x03\xec\xf7\xb0\xf9\xb3\x0d\x9d\x06\x24\xf0\xfa\xe1\xaa\x62\x27\x82\x45\xe0\x64\xdf\xc7\x99\xf1\xfc\x5b\xb0\x67\x33\xd3\xec\xe7\xec\xad\xef\xb0\xaf\xa7\x2f\x21\x15\xd9\x1c\x65\xa8\x05\x3d\x67\x48\x1c\x33\x6b\x75\x4d\xea\x25\x49\xcd\x69\x92\xcc\x33\x33\x2c\xd4\x38\x55\x17\x6d\x51\xab\x9b\x49\xe6\xd0\x34\x6d\xf2\x32\x5b\xaf\x95\x6d\x0d\x72\x75\xb1\x5e\x9c\x62\x1c\x46\x87\x66\x62\x4a\x40\x15\xbb\x20\x17\xec\xd9\xa2\x1d\x8e\x83\xd6\xf0\x31\xde\x31\x4e\xc8\x9f\xe6\xf6\xcf\xd8\xbb\x71\x3f\x04\x67\xc0\x26\x8e\xcf\xb7\x32\xf9\x31\xbc\x06\x8d\x05\x7e\x61\x4e\xf8\xfc\x71\x80\xf4\xcf\x55\x02\xbf\xdd\xc7\x7e\x82\xfb\x6d\x3c\xd4\x59\xfd\xd8\xca\x31\xec\xe7\xf4\xbc\x44\xf4\x33\x8e\xc5\xda\x87\xf3\xd6\xee\x08\xee\xa5\x7a\xef\x9c\x94\xfa\x02\xad\x33\xf9\xe7\xde\x7e\xe5\xf7\x19\x7a\xec\x84\xc3\x1b\xf3\x0e\xd7\xbf\xe3\xd9\xa6\xef\x6f\x94\x7b\xb1\x6c\xcf\x84\x38\xee\xc7\xd1\x8c\x1d\x8f\xc7\x6b\x05\xf1\xfd\x9e\x5f\x1e\xce\x51\x34\xfa\x3a\xb1\xce\xe1\xef\x7c\xec\x62\xdc\xde\x13\xc2\xef\xf7\xeb\x1f\xc5\xf9\xf4\xdc\xda\x42\xb9\xc1\xfd\xb0\xc7\xbb\x1b\x06\xf7\x1b\xa0\x7d\x7f\x1a\xdd\x8f\xbc\xf4\xf2\x52\x00\x1c\x2f\x80\x37\x8e\x9a\x4f\x40\x19\x52\x5d\x0b\xf6\x8f\xba\xfb\x46\x7a\x53\x89\xbe\xa1\x3e\x7a\xa0\xaf\x67\x70\x38\xd9\x47\x07\xf7\xb7\xe5\x61\x38\x4b\x68\x19\x66\x11\x53\x84\x32\xef\x98\x69\x51\x17\xa4\xac\x2c\xe4\xb2\xe9\xd9\x5a\x97\xa1\xda\xa2\xca\xa8\x92\x90\x4b\xcf\x98\x56\x51\x86\x76\xa9\x5e\x86\x0c\x05\x18\x9b\x51\x29\x06\x09\x39\x03\x95\xa6\x79\x68\x21\x47\xb1\x21\xc3\x31\x4e\x2e\x0b\x75\x03\x4d\x08\xac\x9d\xe5\xeb\x66\x97\x3c\x53\x48\xd6\x50\xd1\x2c\x0b\x36\x2b\x4c\xca\x8c\xc1\xb0\x2a\x2a\x22\xcd\xc9\x1a\x59\xa5\x42\x01\x3e\x67\xc8\x45\x13\x4a\x46\x56\x45\xc5\x8a\xa6\x55\xe4\x49\xcb\x35\xa0\xa5\xac\x82\x6a\xb2\xc2\xb9\x40\x6e\xfa\x32\xe3\x8f\xc1\xce\xed\xb8\x8f\x82\xbe\x2b\x05\x73\xc2\xf3\x5d\x0c\xfb\x5a\x88\x8c\x25\xb9\x07\x8a\x75\xe8\xcd\xde\x59\xc0\x59\xc4\xde\xab\xec\x8e\xc1\x43\x38\x3f\xd5\xa3\x47\x13\x3a\x9c\xb7\xe7\x8f\xf3\xf8\xed\x18\x0b\xc7\x5e\xf4\x72\x99\x8f\xe2\x5c\x5e\xeb\xff\x1a\xe2\x89\xbf\x06\xef\xc6\x73\x71\xfd\x5f\x88\x39\x44\xcc\xdd\x26\x9f\x3e\xe2\x3b\x43\x9f\x3e\x29\xc8\xfd\x35\x96\xc5\x79\xb9\x70\xc6\x9d\xf5\x7f\xc6\xb4\x8b\xe6\x2e\x72\xe7\x05\xb3\x76\x6f\x2f\x1a\x06\xc9\xc5\x6b\x05\xc0\xac\xdd\xbb\x00\x5d\x04\x12\xa7\x7f\x63\xc5\x52\x77\xa6\x33\x81\x1c\x61\x1c\xde\x87\xef\xc9\x1b\x6b\xe4\xcb\x90\xbc\xfc\x4f\xde\xb7\x84\x7e\x57\x5a\x30\x6f\x47\xf1\x7d\x14\xcf\xbc\x49\xc8\x75\xe3\xdb\x03\x5c\x9d\xf6\xfb\x13\xb7\x8b\x59\xf3\xe8\xbc\xc3\x1e\x3b\x53\x3c\xfb\x4e\xe2\x3d\x7a\x73\x9b\x43\x9f\x0d\xb3\xa9\x6d\xf4\x58\xe0\x27\x56\x08\xe2\xc0\xfc\xe7\x6f\x20\xd6\x7d\xa2\xfc\xa9\x1b\x09\xb9\xf7\xee\x89\xc3\x3e\x12\x9b\x5a\xca\xbd\xe7\x77\x3c\x45\xd4\x8f\xd7\x89\xb1\x13\xf1\x7b\x73\x51\x7d\x7c\x14\xef\xfa\x8e\x5e\x13\xad\x67\xd3\x47\x9b\xea\x8f\x8c\xe5\xe8\xd5\xc4\x58\x12\xfd\xba\xb9\xb1\x2e\x36\x3f\x7f\x53\x38\x17\xbd\x3c\xe1\x03\x4f\x96\x66\x55\x6f\x84\xf8\x98\x7a\xc2\xb3\x6f\x21\xc8\x11\xe9\x7d\xff\xa8\x1a\xae\x37\xfe\x77\x6e\xbf\xa0\x69\x9c\x8d\x60\xfc\xfd\x7a\xc8\xf3\x27\x35\x38\x7f\xca\xd0\x63\x41\x8e\x91\xd3\xe7\x96\xa5\x1e\xa2\x3f\xcd\xac\x19\x3b\xf1\xc6\xb7\x97\x55\x05\xc0\xac\x7c\xf2\xf1\x5f\xd2\x67\x16\x7d\xff\xd9\xf4\x1c\xef\x7d\x97\xdb\x13\xcc\xaa\xaf\xad\x44\xf7\x03\xf0\xbe\x53\xc2\x7b\x71\x88\x31\x5d\xff\xa7\xf0\xdb\x24\xaf\xdc\xf1\xe2\x42\x4e\x48\x07\x7d\xd5\xd4\x27\x63\xfb\x88\xb5\x9f\x28\xdf\xf9\x72\x53\xf9\xdd\x9e\x5c\x65\x56\x9a\x0c\x78\x5c\x00\xe7\xbc\xee\xcf\x33\xbf\x3d\x5e\xbf\x6c\x7b\x3f\x31\xae\x44\x7f\x6d\x3b\x9b\xa8\xcb\xdb\xe3\x38\x0c\xc7\x58\xe3\x53\xbe\xe7\xbf\x83\x69\xe7\xcd\x9d\xe3\xbd\x7f\xcb\xed\x2f\xcf\x10\x7d\x19\x1d\xf3\xa5\x4d\x63\xae\x7b\x7b\xcf\x2d\x7d\x6f\x64\xf2\xce\x4f\x9b\xca\xc3\xfc\x00\x9b\x36\xb5\x94\xe3\x1c\x80\x5b\x86\x6a\x64\x3f\x09\xf8\xf9\xc6\x18\x5e\xd1\x24\x93\xe1\x1c\x71\xfe\x2d\x94\xb9\x4b\x52\x1a\x7d\x5d\x66\xcd\xa6\x5d\xe0\x6c\x01\x2c\xbb\x39\xb3\x72\xf7\x61\xe0\x1d\x01\x9c\x79\x52\xf8\xbd\xb8\x4f\x36\xdf\x83\xfb\xfd\xc4\xa6\xbe\x0a\xfb\x70\xf3\xbe\xf8\x3e\xdc\x75\x5d\xfc\xf3\xbb\xae\x27\xfa\x96\x9c\xa3\x93\xc4\xba\xe8\xd9\x4e\x87\x13\xb6\xd3\x61\xcd\xb6\x8b\x27\x7f\xa1\xed\xe2\xe9\x4f\xae\x8d\x72\x43\xf0\x74\xf3\x7a\x60\x8b\x4d\x7d\xa8\x06\xeb\x9a\xab\x83\x37\xf5\xad\x3b\x37\xc3\xbb\xf0\xd6\xff\x17\xf1\xad\x5e\x8e\x41\x6c\x47\x84\x31\x81\xc7\xcf\x7d\x30\xf5\x2c\x6d\x66\x06\x9e\xd8\x5b\x3f\x0a\x30\xae\x84\x9c\x73\x78\x6b\x5f\x84\x7a\xde\xe0\xdc\xe1\xa9\x6f\xd0\xe7\x32\x03\xe6\xad\xf5\xc4\xdc\xff\x71\x9f\xbf\xf4\x07\x20\x05\x01\xd6\xdb\x74\xbc\x23\xf3\xae\x30\x3a\x08\xc0\xc0\x4f\xd9\x3f\x1e\x82\x7d\x64\x00\x69\xe3\x96\xd1\x21\xcf\xfa\xee\x25\x37\x59\xbc\xa0\x22\xc5\x49\x30\xb3\xd3\x09\x60\xcf\xb0\x16\xa5\x20\xae\xab\x3a\xc3\xc2\x9a\xa9\x29\x9a\x41\xb1\xa6\x5d\xae\x4e\x68\x13\x95\x22\x2a\xca\xb5\xa9\xea\xa4\x3c\x5d\x2d\x15\x0c\x55\x51\xf5\xd9\x9a\xa1\x28\xaa\x46\xe5\xf0\x93\xb4\xae\x9b\xe6\x21\x59\x92\x92\x85\x19\xae\x4b\xc8\x89\x8a\xa6\x49\x82\x58\x29\x17\x4b\x7a\xb9\x58\xac\x9a\x66\x25\x5d\x30\x35\xab\x50\x72\x44\x45\x77\x55\x46\x49\x57\x04\x34\x25\x48\xba\x22\xe2\x76\x5f\x35\x27\xa6\x1e\xc4\x71\xb5\x0f\xbd\x02\x98\x95\x3b\x95\x77\x1f\xb6\xec\x2f\x2b\xb6\xfb\xf3\x3f\xd8\xef\x7d\x08\xc7\x47\x3e\x4d\xc8\x85\x17\x33\x8c\xf7\xed\x9e\x7f\x90\x28\xf7\xf2\x08\xe0\x73\x89\xe7\x1f\x8a\xee\xb5\x3d\x8d\x73\x0c\x3e\x7d\x05\xf1\xfc\xcf\x82\x7a\x32\xf4\xd3\x3f\x5c\xd2\x78\x1e\xe7\xc0\x70\x9f\x64\xe8\xd1\x33\xc3\x7a\x34\xcf\x36\xdc\xf7\x08\x9e\x03\x7f\x6c\x5a\x0b\xdc\xfa\xf1\xbe\xf0\xd3\xd8\xff\x00\xa4\xb1\x4e\x66\xd3\x06\xc8\x80\x05\xe0\x58\x70\x02\xf6\x18\x1d\x04\xe7\x07\x39\xc8\x7b\xfa\xba\xfb\xa8\x20\x0d\x39\xf4\xc2\x39\x7b\xba\xfd\x84\x35\x83\x3d\x7d\x43\xde\x20\x63\x07\x90\xd4\x00\xec\xa5\x93\x3d\xf3\x17\x04\x17\xcb\xf6\x9d\x94\x1f\xea\x1e\xec\x19\xee\x92\xb8\x2c\x55\x41\x59\x58\x3e\x24\xa7\x1d\xcb\xa1\x26\xb3\x39\x28\x20\xc7\x42\x05\x7c\x4e\x37\x05\x15\x0b\xb2\x33\x9a\x03\x1d\xa4\x54\x4a\x2c\x9a\x9e\x96\x92\x40\xa9\xa1\x49\x5e\x2f\x08\x69\x9b\xe1\x79\x54\xab\xea\xce\x34\x6d\x88\x8a\x55\x44\x0c\x62\x90\x29\x43\x0b\x4e\x51\x65\x81\x47\x62\xb1\x58\x2c\xe2\x9c\xaa\x93\x93\x48\xb2\x2d\x54\xe5\x05\x53\x15\x64\xca\x34\x75\xa9\x94\xcb\x0a\x13\xdc\xb4\xc0\x09\x32\xa5\x4c\x4a\x7e\x5f\xb8\xeb\xbb\x95\xc9\xef\xf6\xee\xca\xbc\x93\x90\x2b\x6c\x9f\x3f\xf3\x11\xdc\x77\xff\x19\xf6\x5d\xa0\xd7\xdf\x89\x9f\xff\x24\x51\x6e\xba\xe5\xcf\xe0\xdc\x9a\xcf\x34\xf6\x2f\x57\xa5\x5e\xa6\x97\x65\xd6\x3c\xb0\xee\xe4\x0f\x08\xe0\xcc\x6f\x67\x56\xee\x7a\x07\xd0\x02\x58\x46\x85\x7c\x4f\xba\x7c\x8e\xab\xed\xac\x32\x7f\x08\x8f\x9d\xfb\xe3\xf0\xeb\x67\x9e\xe5\xd3\xb0\xaf\xd8\x33\x97\xe2\x6f\xf8\x0f\xe2\x5d\x06\xb6\xdf\x3d\x9b\xf3\xad\xe8\xb7\xf9\xe5\xff\x1e\x7e\x03\x9f\x2a\xd0\x52\x26\xbf\xeb\x10\x5e\xb7\xde\x69\x2a\xd7\x33\xf9\x67\x70\xe6\xe5\x67\x2e\x21\xea\xc1\x6b\xd0\x33\x1f\xc4\xe5\x97\x12\xe5\xb8\xaf\x76\xfd\x1d\xd7\x53\x23\xca\xf1\x77\xba\x25\x0c\xbd\x7e\x2a\x2c\x67\xfd\xe7\xbd\x72\x9c\xe3\x12\xdf\xcf\xce\xb9\xdf\xdf\x94\x15\x69\x10\x9c\x07\x6e\x06\x1f\x07\x77\x80\xbb\x00\x80\xde\x64\x6b\x24\xbd\x1f\x59\x70\xa2\x3f\xe1\x8e\x87\xc4\x84\x4b\x7a\xab\xca\xc2\x91\xde\x64\xd3\x7c\x3b\x1a\xf6\x9d\x94\x5f\x06\x07\x7b\x16\x42\xff\x42\x7c\x3a\xc8\x58\x37\x14\x98\x09\xde\xbd\x1a\x27\xc3\x54\xdf\x50\x92\xc6\x17\xe5\x0e\xf5\xa5\xf4\xfa\x14\x2c\x1f\x12\x6d\xdd\xa0\xa6\x99\x9c\xce\x65\x35\x64\x9b\xc8\x82\x1a\xb2\x60\x0d\xaa\x16\x14\x67\x44\x1d\x96\x11\x0f\x41\x39\x5b\xaf\x72\xc9\xb4\x34\x8d\x4a\xa2\x52\x11\x19\x9d\xd1\xd0\x64\x59\xd2\x60\x6e\xa6\xda\x65\x4f\x4e\xd6\xd3\xc7\x9d\x95\x50\xcc\xd9\x49\x4d\x2d\x2a\xf0\x8e\x5b\x51\x0d\x8a\xb9\x34\x02\x14\xcb\x20\x95\x62\x19\x38\x5d\x9f\x4e\x67\x29\x6e\xb6\x96\x60\x67\xab\x34\xa3\x89\xa8\x86\x26\xeb\x53\x28\xa7\x40\x9b\x02\xd4\x24\xcb\xb1\xbc\x58\x12\x45\x51\x2c\xb8\x7f\x88\x13\xbc\xa2\x64\xb3\x8a\xc8\x43\x56\x66\xb3\xb9\x6c\x36\xcb\x67\x15\x9e\x93\xaa\x52\x16\x15\x8a\x5a\x81\xcb\x21\x87\x65\x27\x79\x41\xfd\xcc\x8d\x0a\xcb\xaa\xa2\x28\x96\xd8\x9c\x88\x78\xd5\xeb\x73\x3e\xb5\x95\xb6\x40\x16\x1c\x8f\x2d\xea\x65\xc4\xad\x23\x57\xe3\x88\x7f\x57\xc6\xfb\xe9\x54\x57\x32\xb5\x70\x51\x57\x72\x60\xe1\xa2\x85\x03\x38\x5e\x7b\xde\xf0\x48\xdf\x82\x60\xa7\x1b\x67\xaf\xf9\x87\x46\xa7\x2b\x66\x74\xba\x8c\xa5\x27\x51\x77\xef\xdf\xf6\x1a\xbc\x14\x0e\x5e\x84\xae\x45\xdf\x46\x3f\x41\x57\x5c\x0a\xcf\x81\xc3\x68\xea\xb3\x0f\x53\x77\xcc\x5f\xb8\xf1\xfb\xeb\xeb\xe7\x3d\x9c\x38\xea\xa1\xd9\x1f\x39\x4e\x62\xf1\xec\x8f\xba\x36\x36\xc6\xa8\xca\xe4\xac\xb8\x31\xe2\xcd\xc6\x18\x09\xc9\xac\x34\x07\x50\x55\x94\xc2\x41\x92\x4d\x08\xa8\x19\x81\x5f\x73\xfb\x8a\xd3\x73\x37\x9d\x7c\xe5\x95\xa7\xdc\x72\xec\x8a\x8b\xae\x5a\xf3\x9e\x2c\xfa\xee\x99\x1f\xbe\x04\x1d\x42\xf7\x2f\x5e\x0c\xef\xfa\xc3\xba\x64\x51\x13\xd1\x14\x9a\x8e\x1d\x95\x92\xe4\xfe\xaf\xc2\xa9\x4a\x36\xab\x8a\x3c\xe4\x35\x36\x9b\x76\x47\x85\x75\x47\x65\x52\xcc\x86\xb2\x51\x20\x64\x98\xcc\x9f\x8a\xf7\x8d\x46\x79\xbc\x66\x8f\x34\xc9\xa4\x96\xc9\xbb\x52\xca\xd0\xeb\x7f\xd7\x46\xc6\xde\x6c\x91\x49\xaf\x1c\xe7\x8b\x00\x47\x03\x65\xee\x64\x3c\xde\x69\x70\x24\x60\x40\x1f\xde\x3d\x6f\x8c\xf8\x87\xc1\x75\x58\xce\x7a\xf1\x76\xb9\x6b\x12\x7b\x57\x7a\xa7\xdc\x01\x23\x2f\xf4\x0e\x31\x3a\x39\x30\xec\x8f\x7b\xcf\xff\x83\x71\x7f\xe4\x02\xea\x96\x43\x77\x53\xd7\xcd\x3b\x0e\x0d\x75\xed\x98\xb9\x62\x4f\xe2\xec\xd9\x7f\xda\xd3\xf5\x58\xfd\x9d\x73\x94\x73\x96\xf6\x5e\x70\xfe\xf1\xf5\xbf\x24\x7e\xf9\x87\xd2\x2d\xdf\x7a\xad\x7e\xcf\x55\xbf\x41\xff\xb9\xf2\x4f\xc9\x4b\xf1\xb8\x4b\xb6\xd1\x34\xee\x36\x54\x91\x0d\xa7\xff\xe7\xe3\xfe\xda\x7d\x9f\xff\xfc\xe9\xef\x41\x7f\x40\xbf\xbf\x79\xe5\xe2\xbb\xbe\xfd\xa1\x95\x3d\x9f\x3b\x8e\x1f\xeb\x3f\xff\xda\x3b\xee\xb8\x40\x5e\xb3\xe6\xac\xbb\x39\xba\xdb\x10\xd1\x64\x2d\x3a\xe8\xe5\xc6\xa0\x57\x3b\x0c\x7a\x38\x86\x4a\x26\xef\xae\xa8\x0c\xbd\xfe\x0d\x3c\x26\x47\x04\x63\x85\xe3\xa6\xdf\x8b\xfd\x66\x3d\x1f\x9a\x0f\x01\x05\x7c\x0a\xdf\xf9\x45\xf7\x0d\xe4\x16\xf5\x72\xc9\x9e\xbe\x5e\x7c\xaf\xcf\x40\x43\x63\x1a\xf2\x2e\x04\x82\xc1\x11\xc7\xff\x33\x21\x84\x26\x55\x5c\x80\x56\x0b\xd4\x57\xe1\x3e\xa9\x3e\x45\x4d\xa4\xeb\xd5\xc7\xe1\x97\x04\x74\xeb\x1f\xe1\xa4\x39\x5b\x35\xe1\xe4\xb7\xd1\x85\x12\x1c\xfa\x35\x4a\x43\xd9\x5d\xac\xdc\x9f\x2e\xfb\xff\xcd\x70\xa4\xc5\xb4\xba\x44\x59\x22\xaa\xc2\x7b\x55\xee\x6b\x05\x24\xe5\x72\xb0\x58\x78\xf0\x2c\x95\x15\x91\x23\x56\x45\x3a\xdb\x41\x04\x8b\xde\xc2\xc8\x29\xb2\xbb\x30\x72\x90\x55\xd8\x6c\x96\x09\x16\xc6\xb2\x98\x05\xcd\x32\xe8\xcb\xc8\xeb\x51\x9c\xf3\xcb\x27\xa3\x38\xea\x97\xff\x26\x5a\xbe\xe5\x53\x2d\xf8\x47\xd6\x83\xe3\x9e\xc1\x51\xe1\x78\xbb\x9a\xf0\xc9\xe0\x54\x70\x3a\x21\x7f\x97\x83\x4f\x80\xcf\x04\x9a\x15\xbe\xc7\xc9\x95\x43\xbc\xe0\xe2\xeb\x9f\x17\x24\x83\xc3\xa9\x7e\xcf\x21\x6a\xe4\xff\x72\xe0\x4f\x84\x71\x83\xbd\x28\x9c\x0e\x74\x72\xa0\xcb\x38\xeb\xbd\x94\x84\xa6\x73\x3c\xb4\x0f\xa5\xa1\x73\xdc\x92\x1a\xa5\x65\x96\x0b\xd0\x5a\x32\xbf\x3e\x79\x2e\x7a\xb0\x4b\x47\x59\xca\xae\xab\x76\x5d\xa0\x26\x50\xda\x4a\x28\xb3\x8e\xfb\xd3\x55\xfa\xff\x1b\x7c\x49\xf4\x47\xbb\x2a\xa6\x75\x46\x47\x53\x45\x45\x87\x60\xa6\xe2\x81\x27\x67\x67\xa7\x51\x99\x4b\xb0\x1c\x27\x73\x59\x59\x9e\xbf\x44\x66\xb3\x93\x6c\x8e\x77\x90\xc5\x2b\xb2\xac\xf0\x93\xfc\x04\x9f\x94\x55\x17\x13\xab\xd1\xa1\x2f\x36\x86\xbe\x28\x73\x2e\x10\xe6\x84\xb4\x2a\xf1\x62\x45\xca\x71\xbc\x22\x67\x59\x95\xcb\x71\x4d\xb9\xa8\x71\x2e\x04\xe7\x18\x62\xef\xc0\x71\xed\x32\x07\xe7\xcc\x59\xff\x6a\x38\x8e\x39\x6f\x7c\x1d\xbc\xe7\xe9\xe0\x5c\xe0\x60\x5e\xb0\xf6\x36\x9d\x35\x7b\x77\xf5\x8c\x80\xa5\xe0\x62\x70\x29\xb8\xcc\xf7\x83\xd3\xc0\x97\x00\x58\xe4\x2e\xa6\x83\x43\xfd\xd1\xbf\x61\x38\x9e\xdd\xfd\xdd\xfe\xb8\xba\xa3\xbf\xc8\x3f\x84\x74\xff\xfe\xbf\x5f\x63\x69\x4f\xae\x5b\xa4\xba\x04\x9f\x46\xd7\xdc\xf4\xbd\xef\xc1\x51\xf8\x35\xf4\xb1\x9b\xbe\xf9\x4d\xb8\xc5\x2f\x99\x29\x26\xa5\xfa\x26\xea\xfb\x5f\xa9\xbf\xf4\x99\xfa\x4b\x5f\xa1\xbe\x5f\xdf\xf4\x09\xb8\x0f\x5d\x40\x8d\xc3\x6f\xa2\x73\xdd\x9f\xfa\x39\xee\xbf\x93\x8b\xa3\xa3\xac\x23\xdb\xf2\x47\xb9\x06\x55\xb3\x49\xc4\xa7\x51\x59\x48\xe6\x44\x77\xd4\xd3\x56\x55\x60\x74\x46\x45\x55\x2c\xe3\x97\xa1\x37\xaf\xba\xf1\xaa\xf0\x0f\xaa\x70\xdb\xd0\xdf\xef\x45\x6f\xc0\x13\x3e\x37\x3d\xf4\xf3\xab\xaf\xbe\x7a\xf8\x23\x1f\xb9\x3a\xb9\xf5\xff\x77\xcd\x65\x55\x91\xc9\x2a\xd9\x2c\x0b\xb3\x0a\x9b\xcb\x65\x39\x56\xe2\x58\xa1\xc4\x67\xfd\x7d\x9c\xcb\x52\xe3\xf4\xfd\xcc\x9a\x51\xfe\x77\x47\x8f\x5c\xb7\xe2\x2e\x66\x95\xbd\x19\xfc\x06\x1c\x7d\xc6\xa2\x15\x77\xf8\xe7\x0c\x45\xda\xc9\xe4\xb7\x1e\xed\xda\xe2\x5b\x19\x6c\xfd\xba\x33\x22\xe9\xcb\xb5\x0e\x7a\x41\x1e\x2c\xc6\xb1\x0c\x61\x64\x6d\x37\x48\xa6\x16\xc2\x9e\xfe\x21\x9c\x76\xa6\xbb\x2f\x19\x58\xab\xa9\xa3\xa1\x97\xec\x2f\xf4\xf9\x0a\x12\xd8\xb8\x05\x58\x81\x1a\xc1\xe5\x0b\xe1\xf0\x48\x5f\x6a\x81\x9d\x60\x1c\x77\xdd\x84\x06\xac\x48\x48\x43\x96\x83\xa6\x50\x56\xa4\xd2\x50\x98\x9d\x86\xb2\x95\x63\x75\x59\x96\x35\x29\x2b\x0b\xea\x54\x97\x6d\x70\xa6\x2a\x2b\x26\x2f\xa9\x4e\xbd\xa6\x73\x3c\x95\x95\xf4\x5a\x45\x99\x44\xd3\x68\x12\x89\x3c\x34\x6a\xe5\xaa\xae\xc8\xb0\x04\x8b\x9a\x80\xd2\xca\x64\xb2\x66\x18\x16\x9a\x40\x35\xcb\x32\x21\xd0\x94\xa9\xa2\xe5\xc0\x2c\x14\x72\xac\x24\x72\xbc\x21\x70\x6a\x4e\x62\xd5\x12\x4c\xb3\x9a\xa4\x18\xaa\x24\x09\xaa\x81\x74\x41\x10\x74\x47\x53\x75\xd3\xd4\x4a\x92\xc5\x9b\xa2\x28\x71\xfa\x24\xaa\xc9\x86\x28\x36\x6c\x4b\xcf\x77\xee\x13\xd8\xde\xf9\x38\xb1\xa7\x8c\x6d\xda\x3d\x09\x9c\x8b\x01\x7b\x24\x8d\xdd\x11\xea\x36\xde\xdd\x84\x8b\xf0\x59\x86\xda\xc4\xa3\xfb\x3c\xf4\xd8\x6d\x44\x39\x3e\x03\x1a\xd3\xf0\x39\x62\xe0\x47\x74\x0e\x9a\x4c\xdd\x46\x9f\xe7\xd6\xf3\x1f\x2f\x33\x2b\x9f\xfb\x97\x2b\xb7\x2c\x7d\xfb\xec\x6a\xf3\x3e\xc6\x9e\x4f\xe0\xbc\x08\xf3\x88\xba\x70\x4c\xd8\x1e\xaa\xa9\xae\xd0\x0f\xd7\x7b\xf7\xd6\xa3\x42\x3d\x6c\x59\xea\x73\xc1\xb7\x32\xab\x9e\x59\x0c\xbe\x35\xf7\xf6\x19\xe3\xc2\x69\xa4\x3f\x63\x01\x9f\x5e\x17\x16\x11\xba\x1b\x3e\x2f\xf6\xda\xb7\xfb\x44\xa2\x1c\xef\xfb\xed\x7a\x0a\xe7\xa8\x6c\x7e\x3e\xec\x8f\x27\x5f\x8c\xee\x31\xe3\x77\xd3\xdb\xdf\x1b\xf7\x3c\x43\x17\x16\x36\xd5\x6f\x06\xe5\x5b\xbb\x09\x7b\x1e\x7f\xcf\x56\xec\xa3\xbf\x35\x13\x1d\xa3\xad\xf3\x9b\xfa\x3b\xf4\x6d\x76\xdf\xc8\xd0\xdb\x4f\x21\xca\xf1\x7b\xb7\x9f\xd2\xf4\xde\x30\xe7\xd9\x0b\x00\xe7\x6e\xfe\x9a\x4b\xdd\xfb\xd5\x70\x9f\xa9\x41\xa3\xd7\xbf\x42\xec\x3f\x91\xe5\xbf\x6e\x2a\x6f\xec\x4b\xfd\xaa\x4d\xf9\x2f\xdb\x94\x37\xee\x61\xe4\x52\x1f\xf7\xea\xaf\x81\xcc\x9a\x87\xde\x7a\xfb\x2e\x01\x2c\x1d\x64\x56\xbd\xf0\x36\x5c\x3c\xf7\xe6\xe0\x79\xcb\x3f\xea\xf3\xfb\xe7\xec\x3e\x3f\xce\xf9\x07\x0e\xc7\x7b\x73\x86\xbf\x4f\xd5\xb0\x42\x4f\xc1\xb9\xab\x7c\xe9\x0f\xfc\x96\xfd\xdc\x9d\x7d\xae\x52\x86\xfd\x4c\x9a\x33\xf5\xe2\xb4\x66\x8b\xb0\xd9\x64\x41\xc7\xa1\x64\x07\x16\x90\x3c\xab\x22\xa5\xcb\xae\x17\xea\x85\x54\xba\x56\xab\x26\xd5\x43\x36\x4e\xce\x49\x29\xb0\x3c\x53\x0d\x7e\x9b\x2d\xaa\x55\xa4\x8a\x50\x4f\x30\x50\x82\xac\x88\xca\xa8\x9c\x9c\x36\x4d\xd3\xb4\x6a\x35\x5d\xd7\x2b\x96\x52\x57\xa0\x65\x9a\x26\xd2\xdc\x3f\x26\x75\x4d\xb4\x79\x85\x97\x6c\x85\x0f\xf6\x6c\xf0\xd8\x13\x2d\xf0\xb3\x42\xcd\x6b\xf1\xbd\xee\xc6\xa1\xd5\x81\x73\xb5\x8b\x2a\x03\x38\xb7\x9b\xff\x6f\xa2\x1d\x13\xd0\x70\x28\xce\x81\x16\xd2\xe0\xd4\x6c\x89\x52\x0f\xd9\x94\x3c\x3b\x01\xab\xc8\xa0\x72\x14\x57\xaf\x24\x78\xc4\x17\x1a\xae\x4d\x6e\x53\x10\x8f\xf4\x98\xc6\x54\x8a\xc5\x62\xd1\x2a\x5a\x7a\x9d\xa1\xa6\x75\xab\x58\x2c\xd6\xb3\x85\x42\xa1\x80\x2a\xee\x1f\x85\xe6\xf6\x84\x71\x0e\xae\x5d\x74\xb1\x2b\x2b\x8f\x8f\x00\x72\x8f\x4b\xcf\xe4\x1d\x05\x9f\xf3\x0f\x81\xc6\xf3\x78\xce\x7a\xcf\x87\x79\x7d\xc3\x75\x6b\x14\xe7\x72\x0a\x9f\x77\x82\x33\xaf\x51\x9c\x4f\x67\xfd\xbf\xc5\xd7\xb3\xa3\x42\xec\x03\xe1\x3b\x48\x0b\x59\xb7\xfc\x81\x25\x84\x9d\xe6\xe5\xbd\xf8\x02\xae\x07\xfb\x40\x03\x0a\x28\x38\x97\x8a\x06\x06\x70\x3e\x24\x57\xe1\x76\xfb\x1e\xf7\x6a\x4f\x6f\xc3\xb6\xee\xee\xf2\xaf\xf7\x74\x81\x25\x97\x18\xec\x5e\xd0\x8b\xf7\xc9\x16\xf4\xba\x0f\x86\x16\xd8\xf0\x32\xd8\x95\x1c\x18\x1e\xf1\x76\x45\x47\x68\x53\x44\x93\xc8\x49\xf0\xb3\x65\x58\x85\xa2\x82\x0a\xc8\x66\xa1\x06\x0b\x32\x12\x90\x81\xaa\xf5\xaa\x0b\x28\x12\xaa\x21\x51\x85\xe5\x4a\x5d\x49\x70\xa8\x8a\x4a\x1c\x55\xca\xd9\xa2\x20\xf3\xa6\x28\x54\x26\x54\x34\x85\xaa\xa2\x2e\x4b\x59\x59\xca\xe5\x50\x01\x4d\x4b\xd3\x25\x59\x56\x0c\x45\xe4\x69\xcd\x60\xb3\xba\x95\xb6\x4c\xd3\xd1\x4b\x6c\x49\xb1\x8c\xca\x84\xed\xe8\x65\x08\x26\x6d\xd3\xb6\x2d\x8d\x49\x9b\xb3\xf2\x1c\xc8\xe6\x64\x45\x52\x04\x45\xb3\x8b\x46\x49\x95\x18\x93\xc9\xf2\x56\x49\xb5\x25\x59\x16\x54\x49\xcd\xe5\x00\xe8\xf2\xfb\x42\xc7\xf1\x67\x67\xe3\xd8\xd7\xde\x14\x71\x66\xdb\x8d\xaf\xab\x18\xc1\xa9\xdb\x16\xf5\xd2\xa9\x9e\x20\xa5\x5b\x37\xce\x62\xee\x5d\x2c\x90\x1c\xc8\xc1\x5e\xba\xd1\x73\xc9\xff\x61\x57\x75\x95\xad\x1c\x95\xd5\x8b\xbc\x9c\x33\x38\x89\x37\xd5\x29\x65\x42\xb2\x44\x4d\x2b\xa2\x49\xd1\x30\x61\xb6\x66\x2a\xb2\x2c\x3b\xfa\x84\x32\xa9\xa1\x49\xa8\xa2\x29\x0e\x4a\x14\xa3\xa4\x75\x28\x40\x95\xe8\x50\x01\x32\xff\xc3\xce\xd3\x73\x6a\xbd\x56\x65\xac\xac\x09\x45\x54\x2c\xea\x56\xcd\xd4\xd4\xe2\x94\x91\x4d\x9b\xa6\x22\x19\x8a\x88\x26\x61\xae\x68\xe8\x76\xc1\xd4\x19\xb3\xae\xaa\x69\xce\x94\xbd\x1e\x36\xf8\xff\x49\x9f\x92\x31\xa2\xa3\xf8\xbe\xde\xc7\x87\x88\xf3\x01\x8c\x0d\x2e\x2a\x30\xf4\x28\x9e\xa7\xe0\x30\x1f\xf7\x04\xbc\xca\x1d\xef\xef\x03\x78\x77\x4c\xe2\xfb\x1d\x82\xb5\x21\x08\xbb\x18\x69\xec\xcb\x77\xf7\x75\xa7\xc2\x88\xc0\x58\xef\x47\x2e\x69\xd7\x0d\xca\xaa\x6b\x09\xf6\x9d\x5c\x22\x57\xd7\x28\xab\x6e\x38\xf8\xe6\x06\x20\xb2\x16\x2b\x51\x0c\x9c\xac\x59\x82\x64\xca\xb3\x92\xa5\x1b\xa6\x9d\x2c\xe8\xba\xa1\x5a\x75\x20\xf1\x05\x4e\xa4\x34\x45\x70\x04\x99\x16\xea\xac\x63\x15\x2c\xab\x60\x39\x26\x2c\x8b\xba\xc5\xd9\x9a\x8e\x78\x58\x16\x78\x47\x13\x8d\x99\x69\xb9\x62\xe8\x96\x63\x38\x66\xc1\x91\xac\xa2\x58\x32\x45\xab\x20\x16\xcd\x68\xfb\xa2\x79\xf1\x5a\x9b\xd7\x1d\xe8\xd2\x94\xbf\x63\xdd\x2e\x72\xba\xdc\xda\xb0\xae\x1a\xca\xd9\x28\x07\x27\x6d\x38\x39\xc3\x76\x6e\x4e\xc1\x74\x9b\x63\x16\xa8\x2a\xaa\x3a\x8e\xe3\x98\xee\x1f\xb3\x72\xbb\x76\xf8\xe7\xa2\x78\xfd\x79\x1c\xaf\x57\x7b\x20\x81\xe1\x78\x3d\xdc\x83\x63\x7e\xc2\xf5\x50\x09\xd6\xc3\x67\x65\x6c\xab\x28\x44\x79\x91\x16\x82\xf2\xf5\x3f\x23\xce\xf2\x30\x1e\x6f\x7f\x09\xe7\x92\xbd\x12\x90\xbe\x01\x46\x26\xbf\xf7\x4b\x4d\xef\xf5\x7c\xe5\xb4\x4c\x7e\x1f\xf6\x6b\x59\xff\xd3\xa8\xae\xe6\xd5\xff\xf8\x92\xb0\x7e\xce\xdb\x9f\xb2\xb1\xed\xf4\xf8\x20\x71\xde\xeb\xf9\x85\xe0\x3b\x5d\x9f\x95\x89\xef\xc4\xb1\x47\x8f\xed\xc4\xf1\x91\x58\x2b\x5b\xff\x13\x42\x9f\xd1\x33\xf9\xaf\x9f\x1f\xe1\xf1\xf5\x96\x67\x7e\xde\x52\x17\x7e\xfe\xd9\xeb\x9a\xca\x57\xce\x9d\x9a\x5a\x43\x8b\xcc\xda\xd1\xd3\xa1\x3a\xf7\xe6\xe2\xa1\x15\x1f\xcd\xe4\xc7\xfe\xf0\xf6\xc2\x0c\x7d\xd4\xe9\x6f\x33\x84\x8e\x64\x66\xf2\xdb\xf1\x79\x7a\x78\x6f\xb8\x16\xe8\x2f\x5e\x7f\xed\x7c\x80\x68\x4f\x19\xeb\x48\xf8\x8b\xb7\x53\xc4\xf3\x56\xf0\x3c\x91\xa3\x58\xf3\x7c\xae\x32\xf9\xd1\xf7\xe1\xf2\x97\xa2\x67\x3c\x9b\xf1\x7d\xdc\xa3\xa7\x37\xd5\xe3\x96\xdf\xdd\x54\xae\x04\x67\x4b\x5b\x3f\xd7\xd4\x46\x2d\xc8\x81\xec\xbd\x37\xcc\x81\xac\xe0\xf3\x0b\x21\x93\xdf\xee\xc5\x55\x26\x89\x79\x50\x26\xe6\xc1\x06\x26\x28\xf7\x75\xdd\xad\x1f\x6b\xfa\x4e\xaf\x1e\x2d\xe8\x9f\xad\x9f\x6d\xea\x73\x77\xbd\xf9\x7c\x53\xfd\x4a\xa8\x43\xe2\xe7\x47\xf1\x9d\xb9\xe0\x18\x20\xcd\xad\x74\xbf\x1f\x9c\x80\xef\xd8\xf0\xf2\xc5\x5c\x48\xe4\x45\xf8\x1c\xf8\x02\x30\xdd\x35\x29\xb8\xe0\x3a\x4c\xf0\xd9\xe7\x5d\x6c\x81\x77\xec\xe7\x91\x39\x67\x63\x97\xaf\x21\x3f\x99\xec\xa2\x9e\xbe\xa1\x96\xe5\xeb\x7d\x64\x1a\x4c\x48\xa6\xa0\xed\xf7\x0e\xb6\xe6\x0d\x76\xf7\x27\x06\xbb\xfb\x7b\xe6\x27\x54\xa8\x8b\x39\x2b\xc7\xc3\xe9\x7a\x55\xa6\x9c\xaa\x62\xab\x13\x3a\x32\x74\x5b\xd3\xa4\x09\xc8\xf2\x3c\x9a\xb0\x65\xc1\xe4\x95\x84\xe0\x48\x8a\xa9\xd6\x41\xa2\x88\x34\xec\xb1\x5b\x99\x99\x82\x25\x1c\x3b\xa6\x59\x10\xcc\x01\x83\x63\x95\x1c\x0f\x35\x08\x0c\x85\xe7\x65\xa1\x5e\xd2\x45\x51\x93\x12\xb6\xc8\x19\x9c\xa0\xf1\x59\x8b\xe1\xcb\x2c\x63\xa6\x59\x64\x2a\x0a\x27\xb1\x32\x27\x4c\x65\x15\x5b\x77\x26\x27\xd3\x53\x93\xc9\xe5\xa3\xce\xbb\xbf\xfa\xa0\x3e\xaa\x4b\xe7\xdf\x72\xf7\x83\xf7\xe9\x97\x5d\x26\xe9\xe7\x5c\x06\x1f\xbe\xec\xc6\x73\xae\xbe\xe6\x2c\x56\xbf\xec\x9c\xab\xeb\xe7\xa0\x3b\x56\xdf\xb0\xea\x96\x5b\x56\xdd\xb0\xfa\x86\x97\x7a\x16\x2f\x3e\xfd\xf4\xc5\xab\x5e\x7a\xa9\x67\xf1\xaa\x53\x56\x9d\x52\xdf\x2e\xdc\x2c\x5c\x25\xac\xfa\xf0\x8d\xa7\xdf\xbc\x7a\xf1\x87\x3f\xd2\x7f\xd5\x87\x17\xac\x5a\xb5\x70\xf5\x2a\xfa\xac\x77\xa6\x54\x35\x6d\x33\x1a\x2c\x23\x19\x95\x65\x58\xa0\x40\x02\x20\x0e\x0a\xb3\x35\x28\x54\x84\x88\x1d\xe1\xcd\xf9\xad\x9f\x69\x9a\xab\x6a\x26\x3f\x7a\x1a\x20\xe3\x2c\xd4\xe0\xf9\xe2\xc9\x8d\xfb\xf5\xd6\xbf\x1c\xf2\x78\xf7\xd6\xf0\x8d\x79\x06\x32\x58\x9f\xb2\x69\x95\xf0\xf7\xe6\xfc\xfd\xea\xab\xc1\x75\x60\x8d\x7f\x1b\xf2\xa7\xc1\x3a\xb0\x1e\x9f\x0f\xf9\xfb\x5f\xbd\xfe\xc6\xb5\x3b\x05\xfc\xfb\xcc\x07\x87\x87\x06\xe7\xe3\x8b\xd1\x03\xcb\x7c\xa4\x7f\xa0\x9b\xdc\xd4\xee\xe9\xef\xc6\x1a\xfd\x90\x77\x03\x47\xcb\x24\x1a\x1c\xe8\xef\x5b\xd0\x3b\x38\x34\xd8\x33\x38\x32\x48\xa7\x06\xdb\xc2\x44\xca\x38\x94\xb6\x2c\x73\xda\x85\x0a\x3d\x08\x17\xec\x32\x44\x56\xcb\x09\x48\x98\x4a\x1b\xae\x32\x36\xa5\x4e\x28\x45\x95\xab\x6a\xd5\x5c\x85\xe3\x79\xc9\x64\x2c\x3e\x87\x78\x83\x12\x5d\x88\x43\xbc\x90\xcc\xd6\x27\x5c\xa5\x9a\x2a\x1e\x02\x54\xb9\x3e\x41\x09\xf5\xa2\x51\xe0\x74\x08\x72\x8c\x63\x9a\x9c\xce\x64\x4b\x33\x55\x4d\x51\x54\x1d\x4e\x08\xac\xc1\xf2\x54\x9a\x67\x8d\x1c\x0f\xa7\x04\x56\x67\x79\x5a\xd5\xeb\x52\xbd\x8c\x44\x19\x96\x28\x90\x48\x17\xd0\xc4\x04\xe7\xb0\x65\x51\x12\x24\xb1\xa8\x1a\x86\x6a\x14\x2c\xbd\x30\x51\xb6\x15\xa3\x9c\x46\x0e\xc7\x31\x12\x93\xcd\x19\xb0\x64\x72\x9c\xc6\x71\x93\x68\x52\x50\x79\x4d\xe3\x55\x41\xd6\x78\x5e\xd3\x34\x81\xd3\xea\x55\x5e\xe6\x65\x9e\x17\x44\x5e\x12\x58\x5e\xe4\x45\x81\xe3\x45\x5e\xe2\xc3\x31\xd4\x83\x35\x67\xf7\x52\x62\x4d\xd8\x4a\x9b\xcc\x9a\x67\xb6\x5f\x07\x96\x2d\x12\x00\xb3\x72\x7b\x22\x0d\xce\xfc\x19\x76\xf6\x4c\x06\x6b\x9e\x8f\xcf\xef\x07\xab\x70\x36\x94\x41\xcf\x4b\xbf\xbb\x39\xbb\x74\x4f\x57\x43\x13\x5c\x38\x0f\xef\x98\x75\x87\x9e\xfd\xfe\x05\x3a\xc4\x62\x40\x4d\x3b\x55\x87\x32\x67\x27\xa8\xa2\xa6\x8a\x32\x6b\x08\x42\x7d\x1a\xa6\x4b\x4a\xa1\xe4\x58\x93\x1a\xe4\x9d\x7a\xcd\xa1\x8a\xb3\x25\xca\x4c\x08\xa6\xa2\xe8\xda\x4c\x59\x15\x2c\x41\x99\x56\x04\x9b\x53\xba\x78\x53\x92\x74\x99\xd6\x91\x0e\x4d\xa4\x1b\xa8\x32\x5b\x51\x14\xc6\x66\x24\xca\xb0\x5d\xf3\x4b\xab\xd7\x28\xbe\x5c\xb0\x2a\x30\x37\x6b\x25\x6a\x90\x33\xa0\x2c\xd9\xb2\xaa\xaa\xaa\x26\x6b\x2a\xd2\x24\x59\x96\x25\x59\xd2\x04\x55\x0c\xd7\x77\xef\xee\x80\x63\xdd\x3e\x7a\x6c\xb8\xc9\x6e\x30\xc2\xf2\x91\x26\x7b\x25\x2c\xdf\xfd\x6e\xff\x4c\xbe\x34\xa7\xa6\x8a\x34\x07\x8e\xc3\xa7\xf1\xef\x01\xa7\x81\xc5\x60\x18\x9c\xe9\x6b\x37\xdd\x7d\x3d\x83\x8b\x47\xfc\x9d\xbf\xfe\x5c\x7e\x19\xc4\xbd\xd4\x0d\xbb\xfb\xbb\xe7\x2f\xc0\x97\xfe\x0c\xf5\xf5\x84\x7f\x0f\xf5\xf5\xe0\x75\x11\xd4\xcb\x14\x5f\x2f\xb3\x4e\xc1\x10\x19\x87\x2b\x21\x56\x9f\x03\x76\xbd\x4a\xb1\xf5\xc9\x84\x56\x12\x61\x1a\x3a\xb3\x3a\xd2\x13\x9a\xf7\xb7\xdb\x27\xee\xef\x34\x87\x78\x6b\x76\xaa\x92\xe6\x75\x71\x82\x17\xe5\x42\x22\x67\xc3\xf2\x3b\xe5\x64\xe1\x90\xc3\xe6\x92\x85\x22\x3e\x7d\x97\x27\x26\x26\x4a\x25\x54\x2a\x97\xcb\xa5\x12\x00\x34\x28\xcf\x29\x29\x9b\x16\xfc\x8c\xb1\xef\x05\x1c\x58\x12\x68\x9f\xdd\x7d\x78\x8f\x7a\x64\x39\x1c\xe9\xa5\xe8\xbe\xfe\x93\xf2\x9e\x7c\xfa\x6b\x79\x22\x6a\x6c\x73\x49\xb6\x5e\xa0\xca\x75\x5e\xaa\x5a\x96\x2a\x30\x36\x5b\x44\xaa\x32\x69\xd4\x6b\x36\xe5\xd4\xcb\x76\xa2\x36\x9b\x56\xa9\x74\xbd\x46\x39\x14\x37\xc3\x05\xbf\xd1\x02\xe2\xcc\x3a\xb0\x39\x36\x9d\x96\x26\x04\x34\x29\xcb\x4a\xc5\x4e\xd8\xa6\x5d\xa8\xa7\x1d\xc7\x41\x6c\xa1\x50\x20\xf4\x2a\x39\x93\xdf\x86\xcf\x6e\xb6\x49\x4d\xfa\x80\x8b\xcb\xaf\xe3\xd8\x7f\x9c\xbd\x6f\x7d\x05\xd3\xac\xe0\xce\xb6\xcd\x93\x6e\x69\x71\x91\x7f\xce\xfd\x08\x2e\x97\x41\x02\xe4\x9a\xc6\x6e\xb9\x9f\x87\x0b\x67\x4b\x49\x06\xe3\xd8\x37\xd8\x6e\x1c\xe7\x45\xc6\x31\xe9\xff\x3d\x8f\xb8\xa0\xed\x11\x7a\xf2\x9d\x1c\xbd\xb4\x5e\xa5\xf4\xba\xa9\x42\x20\x9b\x22\xa3\xb3\x05\x94\xd3\xe6\x80\x53\x77\x28\xa5\x5e\x49\x88\xa6\x58\x81\xd6\x6c\x19\xa9\x09\x01\x4e\xcd\x6a\x28\x97\x30\xbd\xbf\xf9\xa4\x74\xa8\xe8\x74\x31\x33\xd3\xf8\xe7\x54\xf3\x6a\x34\x29\x21\x51\x61\x25\xce\xe2\x04\x51\x80\x15\x11\xe6\x66\xf5\x04\x5b\xcf\xe6\x72\x09\x56\x76\xff\x87\xa6\xf0\xbe\xac\x8c\xff\x4b\x4e\x22\x16\x66\x65\x54\x93\x49\x9d\xc7\xed\xab\xcc\x80\xfb\x27\x3a\x31\x43\x17\x83\xfd\xa4\x2b\xe7\xde\x95\xfa\x3e\xbd\x94\x59\xfb\x60\x7d\xee\x3f\x13\x1f\x5f\xf1\xf2\xc2\x17\x99\x95\xc5\x45\xff\xfe\xaf\xef\x5f\xb0\xf4\x07\xbe\x8c\x7c\x9f\xb6\x99\xb5\x0f\x6f\x00\x00\x7c\x47\xe0\xf8\x7b\x5c\x3a\x33\xb5\xe2\xe5\x65\xbd\xbe\x4e\xe2\xb8\xba\xcd\xe8\xa9\x58\xc7\x78\x2f\x21\x43\xde\x38\x3c\xd8\x18\x07\xdf\x6f\x15\xdf\xc1\x57\xc4\xfb\x66\xc5\xe0\xde\x58\x1d\x7f\xa7\x9c\xc9\xbb\x5f\xc6\xe4\x8b\xd8\xc3\x7d\xfd\x8f\x43\x3f\x2c\xef\x1e\x70\xec\x6b\xf6\xe8\x37\xc2\x79\x20\xfb\xf3\x03\xc7\x37\x6d\x0b\xe2\xa1\xec\xb9\x63\x53\x5b\x68\x99\x59\xb3\x6d\x35\x73\x60\xc5\x99\x67\x7d\x95\x59\xb5\xf9\x78\x30\xaf\x2b\xb1\x7c\xef\x99\x43\xbe\xef\xce\x04\xad\x64\xf2\xa3\x5e\x74\x89\x97\xdf\x91\xc6\x6d\xe5\x68\x31\x3c\x5b\x38\x09\x70\xcd\x37\xef\xe1\x55\x0f\xe7\xcf\xeb\xee\xc3\x7b\xce\xdd\xf8\xe0\xc0\xcb\x1b\x85\x97\xc5\xfe\xee\x3e\x2a\x97\x28\xce\x4a\x36\x65\xd4\x8d\xe0\x07\x65\x6d\x2a\x67\xa1\xa9\xb4\x51\x10\xa7\xa6\x28\xab\x5e\x4d\x96\xec\xfa\x14\xc5\x5a\x48\xb5\xa9\x2c\x2d\xce\x96\x28\x59\x43\x05\xf7\x3f\x58\x9a\x9d\x9e\x2d\xc0\x89\x72\x59\x30\x24\x08\x4c\x33\x61\xcf\x6a\x76\xbd\x0c\x8b\x48\x4c\x28\xa1\x6f\x93\xea\xf6\xf9\x18\xde\x39\x1f\xeb\x26\xb0\xde\x70\xdb\x35\x86\x73\xd8\x8f\xcd\xf7\xd7\xad\x4f\xcc\x7d\x20\x25\xd3\x1f\x6f\x3a\x33\x39\x19\x8c\xe0\x15\xbf\x1f\xcf\xfb\x68\xcc\x96\xdf\xc6\xf9\xc1\xc6\x48\xa4\x89\x89\x37\x46\x47\xd7\x51\x1b\xea\x77\xd6\x2b\x89\xc9\xd9\xdc\x7a\xea\x27\xf5\xd3\x82\x1f\x74\xd6\x46\xaa\x7f\x23\xfa\x2b\x7a\x56\x84\x34\x83\x0e\x51\xa3\xf5\x57\x93\x3f\xdd\x58\x7f\x93\x3a\xee\x51\xf4\xe9\x2f\x53\xef\xa6\x3f\x5e\x9f\x86\xe6\x7d\xf7\xd6\xaf\x87\xbf\x5a\x75\xe8\x92\xbf\x88\xf0\xe3\xf5\x4f\xd6\x2f\x87\xfc\x94\x74\xdf\x7b\xef\xbb\xef\x63\x89\xc3\x66\xff\xfe\x31\x74\x29\x1c\x40\x65\x6a\x67\xa8\xf3\xc8\xd8\xd7\x0f\xef\xa9\x8e\x65\xfc\xf1\xf2\xe2\x31\x74\x70\x1c\xe8\xf7\xcf\x7f\x2e\xc4\xe3\xe5\x63\x18\x95\x68\x68\x1d\xf9\x44\xbf\x3b\x7c\xf3\x4e\x80\x27\xc2\xe1\x79\x90\xd8\x8b\x73\x5b\x37\xcf\xd7\x5c\x12\x0b\x7a\x47\xb0\xce\xeb\xa5\xcd\xc9\x0f\x74\x65\xa1\x6a\x63\x6f\x06\x91\xad\x19\x65\xad\x6c\x4c\x54\x94\x9a\x55\x10\x24\x28\x21\xbb\x96\x15\x73\x62\x81\x7b\x67\x02\x6a\x36\xd4\x91\x09\xe5\xd9\x32\x14\x91\x25\x24\xb2\xb3\x53\xd8\xf6\x66\x14\xde\x12\x38\x87\xe3\xaa\x59\x24\x23\x90\x85\x80\x97\x92\x0a\xcc\xa2\x29\x0b\x4d\x21\x09\x4d\xe8\xba\x69\x18\x05\xc5\x52\xac\x69\xa8\x59\x30\x8b\x64\xbd\x2c\xa8\x93\x30\x4d\x39\x85\x02\xb6\xc3\x91\x80\xb2\x56\x19\xc9\x86\x95\x35\x2d\x56\x93\x39\x53\x17\x6d\xd6\xd0\x42\xb9\xd0\x33\xf9\x6d\x17\xba\xf6\xc3\xb3\xcf\x02\xd2\x7e\x30\x33\xf9\x5d\xd8\xc7\x6d\xd7\x57\xc2\x3d\x6b\xdf\xee\xdc\x65\xe1\xf2\x87\x9b\x9e\x37\x32\x79\x1b\xdb\x97\xbb\xbe\xd6\x64\x8f\x86\xf5\xac\xff\x61\x7c\xfd\x8f\x3c\xdc\x64\x6f\xb8\x76\x27\x8e\xa7\xd8\xb5\x91\x58\x0b\xbc\x33\xd9\x8d\xb8\x9e\x1f\x34\xed\x71\x5b\x99\xfc\xd3\xaf\x34\x3d\x7f\xd3\x1c\x97\x7a\x0c\xe7\x8d\x7d\x08\x80\x59\x75\xc5\xcb\xcb\x6d\x66\xcd\x0b\xef\x7d\x33\xcd\xf7\xae\x78\x8e\x59\xb5\xfe\x87\xf0\x8b\x89\xbb\x86\xd0\xd9\x9f\xc7\x75\x28\xfe\xf9\x30\xae\x7b\x57\x70\xff\xcf\x2d\x73\x57\xe2\x3d\xc1\x35\xbb\xbe\x0a\x6e\x17\xc0\x52\x27\xb3\xf2\xcb\xc7\xcf\x7c\x53\x00\xa7\xde\x82\x65\x62\xca\xcb\xd1\x08\x7a\x40\x3f\x78\x6f\xa8\x03\x5d\x44\xec\x13\x36\x36\x2a\xfa\xba\x17\xc2\xc1\x63\x21\xc6\x04\xaa\xff\xa4\x81\x3c\x1c\xec\x1e\xf6\x4e\xfb\xc2\x5f\x08\x4d\x34\x49\xfc\x9e\x50\x34\x54\x43\x13\x14\x40\xa0\xcb\x46\x59\x38\x85\x00\xe5\x1c\x62\xa1\x96\x30\x9c\xb4\x92\xcb\x32\x69\x33\xeb\xa8\x92\x3a\x93\x75\xca\x4e\xb6\x8c\xa6\x45\xca\x08\x7e\x43\x45\x5b\x97\x4d\x9b\x9a\x72\xff\xb2\xea\x55\xc7\x54\x2c\x9b\x9a\x2c\x18\x8a\xe9\xd0\x86\x2e\xe4\x4c\xb3\x50\x30\x6d\xb3\xce\x52\x45\x76\x76\x12\xf1\xa8\x68\x98\x39\xa4\x96\xa6\xa9\xec\xec\x14\x2f\x5a\xb2\x28\x26\x8c\xf0\x37\x5d\x90\x75\x55\x50\xf1\x9f\x55\x51\xd1\x35\x51\xc5\x7f\xba\x1d\x96\xf2\xef\xce\xb6\x41\x12\xf4\x81\x45\xf8\xe6\xc5\x25\x58\xb3\x09\xf5\x3a\xdc\x01\xb8\xfd\x09\x6f\x99\x4b\xe1\x53\xd1\x61\x5f\x1d\xc8\x63\xa7\xad\x9e\xf9\x8b\x7a\xfa\x02\x2f\x51\x5b\x13\x0b\x82\x9a\x48\x97\x0c\xab\x92\x96\xd8\x5c\xda\x62\xad\x2a\x8b\x38\x07\xe5\x78\xdb\xac\x24\x2a\xf6\x2c\x56\xba\x29\x15\x96\xd2\x33\x93\xb0\x82\x7f\x2d\x33\x33\x13\xba\x54\x10\x35\xda\xb6\x4b\xe2\x84\xcd\xf2\xd5\xc2\xac\x8e\x26\xa6\x59\x64\x51\xd9\x7a\x8d\x4a\xa3\x4a\x4d\x85\x3c\xb4\x29\xb1\x52\x2f\x57\x2a\xaa\x5a\xaf\x96\x25\xc1\x2a\x97\x13\x96\x59\x10\x0b\x16\x1e\x7f\x13\xcf\x39\x25\x93\xdf\x03\x9a\x74\x3e\x33\xb2\xc7\x02\xc2\x72\x57\xa7\x50\x83\xe7\x47\xdf\x13\x96\x07\x31\xb7\xb8\x3c\xbc\xdb\xce\x0c\xd6\x5a\xb7\x3c\x43\x6f\x0d\xfc\x45\xc3\x58\xcb\xe2\x33\x78\xef\x7a\x6f\x8e\xac\x5f\x0f\xeb\x3f\x99\x78\xaf\xd2\xa8\xff\xb9\x73\x88\x72\x7c\xa7\xb3\x57\xee\xac\x22\xca\xb5\x46\xbb\xb6\x31\x44\xb9\xda\xa8\xff\xf9\x39\xe2\xfb\xb1\x2e\xbb\x0d\xef\x45\x6e\xcb\x10\xdf\x5f\x24\xea\x99\x47\xd4\x63\x11\xe5\x3d\x44\xbb\x0c\xb7\x7f\x8a\x38\x3f\xfc\xce\x5c\xd3\x77\x86\xef\xdd\x36\x9f\x28\x27\xfa\x7f\x1b\xdb\xd4\x3f\x61\x3d\xdb\x16\x10\xe5\x66\xa3\x7c\xcb\x38\x51\x8e\xeb\x2f\x7e\x1d\xeb\x0b\x41\x4c\x94\x11\xdc\x0d\xff\x34\xf6\x7f\x74\xb6\x85\xcf\xfb\xf9\xb9\x1f\x7b\x57\xcb\xf3\x4e\xe3\xf9\xc7\xb2\xf1\xdf\xe9\x3c\x1c\x96\x9f\x93\x7a\x8c\x56\x98\x01\xe7\xe4\xc4\x05\x73\x33\x19\x6f\xa6\x1c\x1e\xc4\xa7\x86\xb6\xb1\x77\xcb\xca\x22\x70\x32\x38\xa3\xb1\x63\xd2\x40\xd3\xee\x46\x94\x7b\xcb\x9d\x92\x81\x16\xb1\x1c\x8e\xf4\x41\x0d\x96\xb3\x69\x87\x61\xa8\xd2\xa1\x49\xac\x39\x07\x3f\x73\x20\x59\x3b\x94\x76\x28\xa6\x3e\x4d\x15\x28\x66\x46\x0c\x7e\x7b\xa7\x96\x12\x10\x6f\xd7\x2b\x4c\xb9\x26\x94\x1d\xa6\x3e\x45\x67\x39\x3e\xc7\xe6\xea\x2a\xac\x8a\x35\x71\x0e\x48\x73\x00\xa5\x21\x27\x49\x12\xaa\xe1\x3f\x2c\x54\x81\x9c\x69\x33\x06\x23\x49\xbe\x7e\x9d\x76\xfb\xe4\xeb\x19\x7c\x67\xe4\x79\x84\xed\x88\x75\x37\xb7\x84\xa1\x9f\x7f\x2f\x71\xfe\x87\x65\xe1\x39\x1c\x27\xfb\xdc\xd9\x4d\xfb\x9f\xee\x1c\xcb\xb5\xd4\x53\x68\xd4\xb3\xef\x06\xa2\x5c\x69\x94\x87\x73\x5e\x09\x7c\xb0\xfd\xf2\x73\x09\x5c\x31\x88\xf2\x0f\xc4\xd7\xff\x74\x8d\xc0\x9b\xbd\xb4\xc1\xac\xd9\x72\xcb\x47\xc0\xf2\x94\xe0\x7e\xd3\xf9\x04\x8f\x43\xd4\xb5\x92\xc0\x22\xaf\x1c\xef\x73\x3e\xb7\x0a\x90\xfe\x44\x6e\x39\x8e\x19\x0e\xdb\xa6\x86\xf5\x78\xcf\x5f\xe0\xeb\x24\x92\x37\x2f\x41\x1a\xf4\x80\x01\x7c\x77\xed\xc5\x81\x67\xd1\x50\xdf\x40\xca\x3f\x2f\xe9\xee\xef\xce\x0f\x24\xe9\x54\xb7\xfb\x8f\x81\xee\x85\x23\xbd\xa9\x4c\x6f\x2a\x0f\xfb\xc8\xbd\x11\xff\x48\x66\x1e\x3e\x3a\x74\x27\x8b\x97\xc8\xc6\xd5\x53\x2a\x02\x97\xc8\xbd\xc3\x26\x00\xc7\x28\xb2\x22\xea\x8a\x6e\xcb\x7a\x42\x91\xa4\x52\xce\x36\x05\x98\x2d\x2b\x36\x5f\x94\x2b\x87\x72\x94\x24\x89\xbc\x94\x93\x73\x5c\x21\x5d\x53\x2a\x69\xb3\x54\xe8\x62\x1c\x67\xa6\xcc\x4f\x68\x93\x69\xbb\x2b\x37\x33\x4d\x1b\x82\x64\x59\xc2\x94\xa2\x2b\xba\x6c\xe9\xa8\x08\x25\xd3\x34\xb3\x0c\x9a\x12\x55\x91\x13\x61\x85\x95\x35\x0e\x55\x4d\xd5\x86\x25\xa4\x8b\x62\x56\x67\xd8\x69\x54\x2d\xa8\x4e\x19\x71\xaa\x36\x5b\x86\x7c\xd9\xd0\x2d\xa8\x15\xcd\xd0\x9f\xdd\xca\xe4\xf7\xe0\x9c\xf2\xeb\x9b\xf3\x5d\x37\xca\xbf\x17\xf6\xa3\xec\xe1\xf7\x73\x3f\xc2\xb9\xb3\x3d\xea\x77\xc3\x73\x40\x87\xe0\x29\x87\x75\x71\x1e\x8f\x5f\xfe\x12\x68\x9c\x8d\x63\x3b\xe1\x59\x9c\xbb\x77\xfd\x77\xa2\xe5\xcf\xe0\xb8\x89\xf5\x38\x87\x2e\x48\x05\xe7\x92\xe0\x18\xf0\x6e\xc0\x62\x7b\xf0\x6c\x3c\x5a\x84\x6e\xe8\xea\x92\x49\xc2\xb1\x24\x19\xdc\x6d\xe4\x96\xf4\x76\x0f\xba\x06\x40\xf7\x60\x77\x4f\x77\x5f\x77\xdb\xc7\x12\x93\x36\xa5\xd5\xad\x44\xae\x56\x71\x15\x45\x0d\x95\x0d\xce\x50\x54\x59\x11\x64\xd9\xa2\x26\x74\x41\xad\xb0\x46\x3a\x6b\x69\x8a\x52\xb3\xed\x43\x92\x9d\xcc\xce\xe6\x9a\x1e\x51\xa5\xc6\x23\xb4\x6e\x5a\x96\x65\xb9\xfa\x66\x81\xd5\x44\x59\x95\x44\x59\x52\x2c\xce\x66\x55\xab\x94\x15\x78\x59\x56\x15\x1d\x5a\x33\x12\xdf\xa5\x23\xcd\x44\x1c\xac\x64\x1b\xcf\x99\xac\xc9\x37\x9e\x23\x73\xf8\x3d\x8f\x5c\xd9\x7d\xe1\x73\xcc\xef\x43\x7b\xcc\xbb\xbb\xb5\x8e\xd7\x00\x14\xdd\x8b\x2f\xe0\xfb\x27\x77\x9f\x47\x94\xe3\xe7\xbd\xf2\x27\xfb\x88\x72\xbc\x7e\x3f\x89\xfb\xbe\xf0\x1c\xa1\x43\x7a\xf7\x61\x5d\xdf\x54\x1e\xde\xf5\xe6\xf9\x8c\x14\xbe\x4e\x9c\x69\xe0\xd8\x9a\x3d\xcb\xb0\x3f\xc7\x73\xd1\xb3\xe5\x27\x73\x4d\xcf\xbb\xe5\xf8\x6c\xa0\xf0\x6c\x4b\x39\x5e\xc3\xbe\x56\x8b\xd4\x1f\xe4\x6f\x9d\x8e\x7c\xa7\x1f\x1f\xe9\xb7\xeb\x84\x26\x5b\x4b\xcf\xe4\xb7\x3e\x14\xa9\xc7\xf7\xe3\xdf\xb9\xa5\xa9\x1e\x39\xc0\xab\x9d\x0e\xc6\xcf\x2d\x44\xfd\xde\x5a\x78\x4e\xa4\x1f\x64\xcf\x4f\xb2\x80\xfb\xbf\x80\x88\xfa\xf1\x1a\xf9\xec\xa3\x2d\xdf\x89\xdf\xbb\xf7\xa3\x91\x7a\xfc\xb3\xf4\x9d\x6f\xe0\xf7\xbe\x4e\xf4\xc3\xe7\x71\xbb\x5c\x5c\x5d\xf5\x6c\x17\xf8\x33\x00\xfc\xa4\xd0\xd4\x47\x3b\x3d\xdf\x99\xab\xa2\xe7\x24\x4f\x1e\xdf\xd2\xa7\xb8\x2f\x76\xbe\x27\xa6\xaf\x83\x77\x34\x74\x89\xb5\x73\x67\xa7\xbe\x4d\xeb\xcc\xda\xaf\xf4\x24\x3e\x08\xe0\xa2\xad\xc2\xfb\x98\xb5\x8f\x08\x89\xf7\x80\xae\xfc\x9f\x56\x7c\x92\x59\xb9\x93\x49\xcc\x2c\x3f\x12\xfb\xfd\x84\x7b\x71\x5e\x1d\x4f\x1e\x47\xb4\xcb\xb3\x7d\xf0\x9d\x4b\x3b\x19\x10\xf1\x4d\x78\xec\xb9\xc8\xb7\xf8\x67\x2a\x3b\xb1\xcd\xbc\xb3\x3b\xfa\xed\xf6\xb1\x2d\xdf\xee\x04\xdf\x9e\x69\xe8\x2f\x61\x8e\x94\xad\xb7\xb5\x3c\x8f\xcf\xc3\xb6\xfd\x73\x4b\xb9\xdd\xe8\x83\xa7\x37\xc5\xd5\xcf\xd0\x5b\x9e\x88\x96\x6f\x59\x12\xd3\x97\x76\x26\xff\x34\x3e\xeb\x7b\xfa\x23\x2d\x7d\x8f\xdb\x35\xca\x36\xd9\x56\x8d\x72\x2e\xec\x7b\x17\x1b\x75\x66\x4d\xe1\xeb\x69\x70\x66\x59\x00\xcc\xaa\x4d\xcb\x20\x04\x60\x64\x3a\x1c\xfb\x27\xdd\xb1\x79\xa4\x06\x6f\x03\x5d\x4b\x52\x2b\xb6\x66\x70\xef\xfa\xfe\x17\xb8\xce\xc7\xb0\x4c\xad\xff\x76\x74\xbf\xf4\x31\xdc\x96\xf5\xff\x02\xc8\x73\x45\x3d\x93\xdf\xfc\x57\xbc\x86\xd4\x43\x59\x08\xd6\x90\x5d\x78\xcd\x09\x62\x35\x6f\x9f\xe3\x53\x77\xb8\xba\x58\x61\xd7\xb1\xd3\x99\xd4\xf3\x97\x26\xb6\xce\xbd\xed\x3f\xaf\xb9\xba\xb0\xfb\x3c\x43\x3f\xf6\x0c\xd1\x46\xbc\xae\xef\xc4\xbe\xa3\x3b\x9f\x22\xea\xc7\xdf\x33\x86\xe3\x88\x0b\xbb\xc2\x72\x57\x66\xb5\x50\x66\x77\x11\xcf\x97\x71\xfd\xcf\xb6\x3c\xef\xe0\xf2\x67\x5a\x9e\xb7\x1a\xdf\x13\xce\xeb\x48\xf9\x93\xc7\x13\xe5\x46\xa3\xdc\x3e\x36\xba\x16\xed\xc4\xf9\x94\xb6\x3c\x1e\xee\x43\xe1\xfd\x2e\x70\x18\x38\x1d\xbc\xdf\xbf\x67\x04\xcc\xf3\xd2\x38\xf6\xf5\xf4\x85\xf1\x7b\x7d\x64\x2e\x47\xc2\xbf\x38\x97\x1f\xea\xf6\xce\x60\x06\x31\x08\x61\x05\xa2\xe9\x90\x6d\x19\x74\xb5\xcf\x60\x5b\xcb\x82\x62\x8e\xb5\xf8\x1c\xd4\x66\x0b\x89\x82\x43\xd9\x75\x95\x52\xea\x96\x0b\x5a\x94\x5a\xc7\xe0\xc5\x57\x6b\x42\xda\xce\x6a\xa8\x88\x26\x54\x4a\xad\x3b\x75\x5e\xe4\x0a\x5c\xce\xce\xb1\x95\x59\xb5\xca\x72\x54\x55\x51\x24\x8d\xb5\x45\x1e\x65\x2d\x0b\x4e\x61\x5b\x37\x9b\xac\x88\x3c\x27\x29\x26\x64\x2d\xd3\x44\xaa\x62\x2a\x86\x6a\x28\x6c\x96\x15\x79\x43\xe0\xb5\x44\xc9\xac\x2a\xaa\xa2\x72\xb2\x60\x9a\xa2\x80\x8c\xd9\x92\xa2\x64\xed\xac\x24\xa3\x62\x57\x16\x55\x1d\x24\xda\xe1\xdd\x8c\x7c\x26\x7f\xd4\xe9\x00\x30\x2b\xf7\xde\x76\x67\xf2\xac\x45\x2b\x5e\x0a\xd7\x43\x3c\x07\x1e\x5d\x8e\x7d\x91\x7a\x09\x5d\xd5\xbb\xc3\x0d\xcb\xe9\x0b\x80\x98\x93\xf8\xf9\xaf\x63\x7d\xdf\x7e\x17\x31\x16\xf8\xec\x76\x2f\xf6\x7b\x7c\x7e\xc2\x2f\xbf\x3a\x78\x7e\x87\x83\xd7\xc9\xf3\x67\x27\x00\x58\xb2\x5e\x08\xd6\x20\xcc\x53\xc4\x39\x6c\x5c\x4e\x7f\xbc\xe5\x54\x89\x76\x32\xf9\x67\xfe\x13\xcb\x5e\xb0\xc7\xf9\xb1\xb9\x8b\x52\x8f\xd2\x26\xb3\x76\x87\x83\xe6\x83\xe4\xe9\x1b\x5d\xe9\xdb\xe1\xc0\x6f\x82\x34\x77\x00\x9f\xcb\x74\x03\x6d\xee\xa2\x54\x91\xbe\xad\x69\xaf\xee\x3d\xe0\x7d\xe0\x32\xa0\x82\x8f\x61\x9f\x66\x13\x3c\x08\x2c\xf0\x35\x2f\x9b\x56\xbc\x6f\xb3\x3f\x53\xfa\xfd\xa1\x1f\xe8\x4f\x0e\x0e\x8f\xf4\x2d\x6a\xca\xfd\x49\xce\x9b\x5c\xd3\xbc\x49\x45\x0f\xe8\x7a\x83\xfc\x9f\xff\x03\xa7\xe9\x32\xfc\x37\xf4\x9e\x3b\xdf\x7c\x13\xfe\x18\xbe\x84\xce\xf8\xd4\xcf\x7e\x06\x7f\x01\x7f\x81\x4e\xbe\xf3\xcd\x37\x0f\x1d\x80\x12\x93\xd5\xd9\x2c\x54\x8d\x6c\x76\x72\x56\x2b\xe7\x2c\x28\x94\x73\x0c\x9a\xa2\x0c\x8b\x72\xea\x0a\xa5\xd6\x2d\x4a\xaa\x17\xf1\x0f\x57\xaf\xf0\x15\x98\x15\xd3\x56\x4e\x47\x0e\xaa\xa8\x94\x56\xb7\x75\x45\x91\xd4\xac\x29\xf0\x88\xb5\x2c\x58\x45\xac\xfb\x23\xd3\xb9\x3a\x9f\xe0\x0b\x75\xcd\xaa\x6b\x85\x04\x5f\xe7\x0d\x58\x43\xe9\x44\x8e\x02\x08\xb8\x3f\xb3\x55\xfc\xef\x77\xd0\x5f\x2f\xbb\xf6\xb2\xf0\x0f\xf4\xeb\x5c\x96\x65\x79\x85\xcd\xa9\xaa\x28\xe6\xd8\x22\x27\x73\x55\x56\xe2\x24\x56\x4a\x33\x0c\x2b\x72\x0a\x97\x13\xe0\x24\xab\x23\x9d\xe7\xd3\x72\x9a\x4b\x5b\xb0\x66\x72\x25\x8e\x3e\xe2\x93\x23\x73\x0f\xa0\x2a\x64\xbf\x58\x1b\x79\xe5\xba\xeb\xae\x1b\xbe\xe2\x8a\xeb\x80\x7f\x9e\xef\xe5\x7a\x19\xc0\xeb\xe0\xff\xc1\x93\x2e\x11\xe4\x13\x01\xc7\x80\x1e\x30\xd8\xc8\x93\xd5\xd3\x47\xc1\x01\x30\xcf\xbf\x60\x05\xf6\x52\x5e\x8c\xc0\xc8\xf0\x48\x2f\x95\xa2\xfb\x72\xf9\x65\x10\x07\xc8\x75\x0f\x76\x0f\x9b\x94\x91\x4b\x3b\x4c\x36\x51\x9a\xe5\xac\x7a\x59\x85\x35\xbb\x6e\x77\x55\x2c\xd9\x92\x2c\x28\x39\x13\xa8\x22\x3a\x13\x39\x36\x5d\x60\x44\x01\x4d\xce\x01\x73\x62\x4a\x84\xb9\x8a\x53\xea\x9a\x2a\x55\x99\x4a\xd1\x9e\x9d\x46\x69\x0b\x16\xa9\x32\xc5\xe8\x86\x64\x68\x75\x93\x43\xe6\x74\x29\x9b\x63\xb9\x69\x0e\x55\x04\x41\x92\x74\x5d\x31\x75\x9b\x72\xea\x53\x05\x72\xef\x40\xcf\xe4\x77\xe1\x7b\xbc\x76\x05\xeb\x9f\x1e\xf8\xf5\x3e\x83\x73\x0d\xed\xf2\x12\x5d\x77\x61\x9d\xa5\x48\xeb\x60\x19\xbe\xa1\xfd\x1a\xcf\xc7\xcc\x3f\x52\x59\x4a\x05\x27\x2a\x27\xe5\x97\xc1\xfe\xc6\xee\xda\x50\x5f\xcf\x60\x77\xf4\xdf\xf8\xba\xcc\x6e\x3c\xed\xba\xe7\x2f\x98\xe7\xbb\x3f\x35\x76\x73\xb1\x5f\x59\x42\x2c\xc8\x09\xad\x3e\xe9\x4e\x17\x69\x52\xd2\x05\xc6\xc8\x99\x88\xd3\x6a\xb6\x81\xb2\x50\x46\x02\x9c\x40\x45\x38\x69\x34\xff\xab\x5e\x83\x25\x1e\xf2\x14\x33\xa3\xc2\x9a\x58\x85\x13\x86\xc2\x8a\x8a\xc4\x72\x12\x27\x0a\xa2\x20\x8a\x82\xc0\xd3\x3a\xa7\x21\xbd\x30\x5b\x9b\x60\x55\xde\x16\x45\xc9\x2a\xab\x8a\xa6\xa8\x65\x38\x19\xfc\x92\x85\x86\xf4\x4e\xa9\x6b\xda\xb2\x66\xe4\x1c\x9b\x90\xea\x53\x54\x96\xe3\x14\xd9\x54\x24\x41\x66\x65\x5e\x92\x44\x51\x90\xbc\xf3\x47\x21\x58\x43\x9e\xc7\x71\xad\xcf\x07\xe7\x17\xa5\xb9\x85\xde\x3e\x6a\x31\x8f\xe3\x4d\xdf\x3f\x77\xf3\x9c\x71\x81\xb9\xec\x43\x80\xf6\x6d\x61\x13\x7b\x68\x34\xce\x19\x5d\x69\xc4\x1b\x06\xbe\x7f\xbb\x17\x91\xe4\x4b\x30\x8d\x27\xcd\x50\xf7\xf0\x48\x1f\x9d\x4a\xf6\xf5\xf4\x0d\xfa\x32\x8b\xff\x2e\x20\xde\xd1\xb4\xca\xa4\x52\x60\x39\x4a\x95\x64\x4a\x70\x10\xab\x96\x20\xaf\x30\x85\xac\x2c\x22\x15\x55\x2c\x55\x40\x8c\xac\x53\x59\xc4\xc3\xb2\xe3\x8a\x96\x13\xfe\x06\x73\x7a\x42\x97\x74\xab\x56\x62\x25\xd1\x30\x94\x59\x41\xaf\xe5\x58\xd1\xe4\x26\x04\x5e\x54\xbb\x34\x55\xd3\x54\x73\x72\x12\x39\xd5\x2a\x3e\x6f\x0b\x6c\xab\xa3\x9b\x22\x98\xdf\xe3\xdf\xde\x8f\xfd\x31\x53\x5d\xc9\x54\x7e\xa0\xa7\x0f\x87\x81\xa6\xfa\x16\xd1\xb0\xdd\x82\x16\x05\xae\xe0\x67\x1e\x11\x85\xd1\x05\x1c\x09\x3a\xb0\x20\x4f\x4e\xce\x56\xcb\x55\x89\x32\x18\x8a\x43\x55\xa1\xae\xc0\x22\x92\x4c\xc7\x81\x16\x9c\x40\x82\x59\x2c\x42\x07\x96\x90\x68\x16\x0a\x90\x53\x15\x41\x66\x0d\x81\x45\x13\x36\xaa\xda\x68\xca\xb6\x61\x16\x4d\xc1\x22\x64\x6d\x28\xd0\x3a\x27\x54\x15\x5b\x54\x04\x5e\x16\x8d\xaa\xee\x70\xa8\x88\x34\xdd\xd1\xc3\x3f\x90\x51\x9f\x90\xe5\xac\xc9\x88\x3a\xaa\xc1\x34\xfe\x29\x50\x35\xb7\x1e\xdb\x6e\xe4\x2a\xf2\x7c\x68\xf1\xdd\x13\xcf\x07\x77\xb8\x89\x81\x9d\x33\xea\xe5\x60\x5a\x18\x96\xaf\x4a\x8d\xb9\xba\xc2\x96\x6d\xee\x9c\x78\xfa\x6f\xf0\xca\xb9\xb9\x25\xda\x8a\x1f\x87\x3c\xae\x6e\x88\xfd\xb7\xb6\x6c\x23\xea\xc2\xfe\xaf\xdb\xee\x88\xd4\xe5\xeb\x80\x0e\xf6\xcb\x7f\x1e\xfb\x2f\x81\xc3\xc0\xd8\xdc\x85\xa9\xfb\x69\xde\xc7\x18\xcf\x5b\xcf\x8b\x80\x6b\x3a\xed\x82\xdd\xfd\x43\xfd\x3d\xfd\xf8\xe0\xb3\xa7\x7b\xb0\x7b\x51\x90\x32\x77\x30\x58\xbf\xc2\x48\xde\xee\x30\x5f\x74\xc0\x9c\xe8\xeb\x3a\x77\xe6\x9b\x0f\x27\x4e\x9a\x7d\xcd\xfd\x41\x75\x6b\xca\x84\xda\xd4\x14\x5c\x0c\x05\x73\x7a\x5a\x2d\xd9\xb2\x24\xc3\x34\x12\xb2\x26\xac\x99\x75\xdb\xb4\x05\x08\x2a\x48\x82\x0e\x9a\x98\xc4\x5a\x87\x5a\xb7\x69\xbe\xfe\x6b\x78\xc1\x25\xe8\x8f\xe7\x41\x70\x48\xd7\x8b\xc9\x89\x7a\xc9\x1d\x44\xc3\x95\xe6\x0f\x7e\xe1\x0b\xf7\x7c\xe1\xf6\x07\x6e\x3e\xef\xbc\x7b\xba\xcf\xab\xef\x3e\xfd\x74\xb8\xf3\x8c\x0d\xe7\xdd\x7c\xcf\x17\xea\x3f\xba\x02\xfd\xf4\x72\x7c\xe7\xac\x95\xd2\x5c\xbd\xe1\xc8\xef\xba\x7d\xb9\xf1\x26\xf4\x1f\xe0\x4f\xe7\x3a\xcb\xe6\x01\x1a\xac\x9d\xfb\x20\x3e\x3b\x9a\x0f\x58\x3f\xee\x4f\xc6\x99\xad\x92\x2e\xc0\xb9\xd3\xeb\x70\x98\xc2\xd7\x9f\x2e\x84\xa4\xf3\xb6\x7f\x73\xf2\xbc\xa6\x0c\xc2\x3d\x91\xf0\xb0\xee\xbe\xa1\xfe\xa1\xfe\xe4\x50\x5f\x4f\x62\x70\xa8\xbf\xaf\x67\x70\x28\xd5\x2f\xd5\x50\x91\x92\x4b\x36\xaa\xa5\x45\x55\x97\x24\x68\x1d\xfa\x30\xac\x16\xa8\x34\x3e\x27\x72\xea\xb5\x02\x62\x8f\xd9\xbd\x11\x1e\xf5\xe5\x2f\x7f\xf9\x3b\xf0\x03\xe8\x1b\xf0\x43\xe8\xeb\x9b\xd0\xd5\x70\x2b\xfa\x26\x3c\xf7\x47\xbb\xa9\xf3\xd1\x5f\xef\x1a\x1f\x87\x17\x8e\x77\xfd\xc5\x90\xd9\x49\x73\xb6\x9c\xe0\x91\x8d\xca\x86\xa2\x40\x11\x3a\x50\x61\xe1\xc7\x35\x4d\xd3\x2c\x45\x31\x0c\x34\x7d\xf9\xe5\x97\x5c\xf2\xe9\xff\xbe\x1e\xdd\x7f\xf3\x17\x5f\x79\xe5\x8b\x37\xc3\xbb\xae\xff\xef\xdb\x6f\xbf\x1d\x9d\xf8\xc5\x2f\x7e\x31\xdc\x5b\x29\xd2\x77\x67\xd6\x8e\xdd\x0b\x00\x40\x02\x18\x3e\x3d\x43\xef\xf8\x53\xb3\x2e\xb4\x6f\xc2\x9d\x37\x5f\xf9\x25\x48\x13\xfa\xb3\x9e\xc9\x3f\xf2\x4d\x06\x64\xe8\xbd\x38\xd6\x1d\x30\x38\xdf\x94\x43\xf3\xbe\x5f\x6b\x3f\x18\x08\xa3\x5b\x2f\x05\x97\x83\x6b\xc1\x47\xc1\x4d\xe0\x56\x70\x1b\xbe\xe3\xaa\xd1\x6d\xae\x4a\x31\x38\xd4\x9f\x74\x27\x0b\xe1\x49\x92\x18\xec\xee\x87\xee\x24\xf3\x7f\x9a\xef\xbd\x80\x43\xfd\x3d\xf3\x86\xfa\x8f\xa7\x06\x87\x3c\x97\x93\x54\x53\x3a\x48\x2f\xa5\x54\x63\x0a\x27\xac\xb2\x0d\xd3\x76\xb5\x0a\x99\x99\x89\x5a\x19\x2a\xae\x90\x8a\xaa\x5e\x54\x1d\x8a\x29\x3b\x9a\x5d\xda\x64\x59\xe8\xe8\xa9\x72\xb9\x5c\x86\x0c\xa3\xa8\x82\x99\x73\x78\x2e\xc7\xd4\x8b\x50\x28\xb8\xff\x63\x19\x39\xcb\x72\x1c\xa3\x64\x39\x34\xa9\xa5\x59\x9d\xab\x71\x8c\x96\xce\x51\xbf\x4d\x5c\x30\xbb\xef\x71\x2a\x53\xff\x2f\xfc\x63\x58\x96\x69\x9a\x45\xcb\x2a\x16\x8b\xa8\x20\x3b\xaa\x29\x19\x8a\x6e\x98\x72\xf2\x4f\x75\x95\xfa\x96\x59\x30\x0a\x66\xa1\x6e\x4e\xe7\xac\xac\x09\x27\xba\x18\x54\x29\x14\x50\xb5\x50\x30\x0b\x05\x64\x1a\x85\x5c\xc1\x4c\x3b\x85\x6c\xc1\x4e\xe7\x26\x4b\x42\xa9\x58\x28\x64\x8b\x85\xae\xc7\xeb\x22\xdc\xf2\x35\xf4\x91\xaf\x79\xf2\xcc\xcf\x89\xa9\x97\xe8\xf3\x33\xf9\x3d\x47\xbb\xf3\xd9\x3a\x0d\xce\x80\x5e\xee\x67\xcb\x07\x41\x3a\x38\x0b\x04\x49\x90\xc7\x5e\x1d\x67\x81\x4b\xc0\x65\xe0\x6a\x77\x4e\x53\xa9\x81\xe1\x79\x7d\x89\xc1\xf9\xae\xae\x96\xe9\x1d\x9e\xd7\x4b\x25\x32\x83\x8b\xe7\xe1\xb3\x1c\xdc\x6f\x54\xc2\x57\x42\x92\x6e\xe7\x37\xc5\x51\x79\xd7\x87\x0c\xb9\x33\xba\xcf\x1b\xb4\xee\x79\xe4\x68\x3d\xf8\x48\xea\xbb\xda\xb3\x5d\xb0\x92\x76\xd2\x50\x45\x76\x3a\xa7\x08\x96\xec\xc8\x5c\x96\x71\x78\x4b\xd5\xcd\x82\x50\x34\x24\x06\xb1\x09\x5e\xe6\x2d\x56\xae\x8b\x96\x85\x58\x3b\x57\xb0\x34\xd3\xd2\x8a\xea\x14\xac\x66\x51\x05\x59\x39\xc8\xbb\x1a\x55\x01\x4e\x15\xdd\x25\xd8\xb4\x39\xce\x12\x90\x2a\x66\xad\x9c\x40\x1d\xc8\xd5\x0b\x35\xa3\xda\xf5\x29\xa8\x4c\x38\x36\x52\x6a\x55\x98\xe3\x91\x34\x07\xe6\x00\xcc\xf2\x48\x83\xac\xa3\x5a\xda\x04\xcc\x52\x02\x9c\x54\x34\x49\x53\x66\xeb\x6c\xd7\x12\x4e\xd2\x6d\xc3\xd6\x26\x4c\xb5\x32\x93\xb5\x45\xde\xe1\x28\xce\x9a\xb0\xac\x09\xab\x3e\x05\xab\x6c\x51\xcb\xd9\x9a\x3d\xc1\x4d\xd8\x00\x7a\xfb\x03\x5d\x1a\xc8\xe2\x53\x71\xb7\x99\x0b\x92\x7d\xa9\xfe\xf7\x42\xb7\x1f\xc0\x3c\xbc\x95\x97\x78\xf6\x09\xaa\x58\x97\xfe\x06\x2f\x80\x59\x7e\x12\x9d\x5c\xaf\x3e\x7f\xd3\x46\x1d\x02\xc5\x39\x7e\xf0\xb9\xdf\x76\x69\xf5\xaa\x8d\xcc\xbe\x54\xe1\x98\xf1\xc7\x5e\xde\xaf\xc3\x5b\xe1\xbf\xe4\xbe\xf9\xf5\xed\x57\x62\x1d\x70\x62\x4e\x4c\x09\x58\x46\xde\x0d\x4e\x04\x00\x76\xcd\xc3\xe3\xe0\xdd\x0d\x99\x1c\x58\x38\x0f\x1c\x16\xc4\xf5\xbb\x7a\x3d\x75\x2e\x5c\xf0\xb7\xb1\xbb\x9e\xdc\xf8\x9d\xef\x8c\x7d\xfe\xa9\xf1\xd7\xd0\x6f\xef\x82\xcb\x7e\x84\x0e\xa1\x5f\x27\xef\xb0\x0f\x15\x6d\x3b\x29\x1d\x2a\x26\x4f\x7d\x07\xcd\x1d\x82\xe7\x1d\x8f\x3e\x83\xde\x78\xe5\xb7\x77\xfe\xf6\x67\xe8\x8d\xfd\x6b\x5f\x81\x29\x98\x87\x00\xde\xf0\x0e\x23\x8a\xf4\xf4\x3b\x53\x49\xd3\x9f\x3b\xd8\xb7\xf6\x81\x97\x5d\xd9\xdd\x13\xdc\x51\x7d\xc9\xdc\x8d\x29\x9b\x56\x33\xf9\x27\xe9\xd7\x5f\xc9\xd0\x8f\x05\xb1\x13\x2a\x78\x9a\xfe\x5b\xd7\x85\x18\xbf\x5d\xbd\x03\xa4\x7a\x53\x0b\x17\x61\x77\x7e\x2f\x38\xf2\x89\xa4\x8c\x6a\x93\x15\x15\x95\x11\x2b\x4d\x57\xaa\x13\x33\x16\xfa\x41\xe2\x8b\xb3\x9f\xed\x3a\xdf\x42\xa5\xa2\x69\xd7\x4a\x96\xa2\x16\xa6\x37\x8f\x62\xdd\x70\x2b\x18\x4e\x5d\x40\x6b\x20\x09\x0e\x03\xf3\x71\x2f\xbb\x53\x2b\x07\xb1\x3d\xcb\xa4\x18\x90\x1c\x58\x08\x32\xae\xd6\x42\xff\x5c\xaa\x1b\xb3\x2a\x47\xd5\xea\x4f\x77\x4d\xcc\x08\xd4\x02\x27\x8d\x4c\xa4\xaa\x90\x87\xbc\x56\x5f\x40\x17\xde\x91\x69\xcd\x52\xb2\x36\xfa\x96\x03\x5f\x45\x1c\x83\x6c\xc4\x58\xa6\x0a\x73\x50\xe6\x5d\x7b\x51\x4d\xd8\x18\xf7\xe8\xbd\x5e\xee\x4d\x3d\xa1\xe1\x7d\x08\xfa\xe1\x51\x3c\x16\xc5\x84\x94\xe2\x69\x1d\x1c\x01\xba\x41\xaf\x37\xde\x81\x52\x41\xfa\xb4\xb9\xa6\xf0\xb4\x73\xa8\xe4\x50\x35\x8a\xb3\x35\x43\x37\x66\x0d\x5d\xb0\x04\x8d\xd6\x91\x81\x64\xc8\xa0\x69\x58\x80\x8a\xe4\x48\x9a\xac\x69\xba\xac\x6b\x00\x02\x19\x96\xb0\xed\x9e\x27\xf5\xfc\xe0\x67\x41\x6f\x6a\x61\xa2\x0f\x27\xd7\x09\xb3\x5e\xf4\x55\xa8\x89\x2c\x63\xa7\x19\x6a\x7a\x76\x92\xa3\xa6\x66\xcb\x42\x17\x8b\x0a\x4e\x4d\x46\x95\x52\x5d\xa9\xa2\x8a\x56\x2b\x20\x0b\xd6\x58\x16\x29\xb0\xc6\xd7\xb5\x64\x4d\x14\x72\x3c\x67\xa9\x96\x6a\x17\x65\xc7\x86\xcc\x74\x59\x73\x0a\x36\xc7\x5b\x6a\xb0\x7e\x27\x0a\x6e\x7b\xc7\x36\x78\xff\x86\x9e\xbe\x4e\x6f\xbe\x30\xdc\x8f\xd8\xea\xae\xe3\x2f\x1c\x03\x40\x26\x55\x5c\x47\xdd\x12\xee\x93\x3f\x4f\x5b\xcc\x9a\xc7\x5f\xfc\x0c\x38\x6b\x44\x00\x19\x7a\xd3\x24\xb1\x87\xa1\xbb\x7a\x89\x8d\xf3\xdf\x85\xf1\x71\xfa\xdc\xd9\xde\x1e\xcf\x0b\x2f\x03\xc0\xac\x79\xee\x9e\x54\xea\xdc\xef\x9c\x7d\x1e\xb3\x6a\xc3\x45\xe8\xee\xb9\xff\x73\xde\xc5\xe1\xfd\x16\x3d\x29\x9b\xb6\x33\xf9\x7d\x39\x90\xc3\xd9\xa1\xf6\x0b\x60\xe4\xd6\xcc\xca\xe7\x21\xd8\xe7\xfe\x46\xfa\xb3\xbf\x80\xf7\xdc\x76\x15\xa3\xfb\x88\x1e\x1e\x11\xf7\xde\xf8\x7b\x7d\xcf\xdf\x33\xe5\xce\xe9\xde\xf0\xac\xcf\xb5\x43\xb4\x4c\xfe\xe0\xdb\xae\x3e\xf4\x8d\x33\x00\xe9\x2f\xe4\x96\x4f\x02\xc0\xe4\xbf\x81\xa3\x8e\x4a\x0b\x62\x69\x38\xa2\x63\xff\x5f\x89\xf7\x44\x69\xaf\xf9\x34\xc3\x7f\x17\xce\xdf\xfd\x0d\x1c\x31\xb0\xff\xa7\x1d\xf8\x5e\x20\xf6\x89\x5d\xda\xcf\x31\x0d\x7b\x4f\xed\x7f\xca\xa7\x29\x31\x7c\x0f\xf8\x34\x35\x86\x76\x67\xa4\x0d\x64\x9d\x4a\x84\x8f\xa4\x5d\xe0\xd3\xcc\x18\xda\x70\xe4\x5b\x48\x5a\x5f\x87\x3a\x8f\x6c\x4f\x1b\xff\x7b\xfb\xef\x1c\x7f\xc3\xa7\xe9\xad\xed\x1b\xff\xa1\x4f\xd3\x62\x68\x25\x00\xc2\x98\x8a\x68\x9d\x5b\xc3\xb3\x86\x22\xc1\xc7\x61\xda\x97\xdb\x8f\xd1\xf8\xdd\xc4\xde\x52\x94\xef\xc6\xc8\xf8\x91\x7c\x57\xc7\x8e\xad\x47\x3b\xb3\xfd\x3c\x1b\x5f\xd4\xbe\xaf\xc7\x99\xf6\xe3\xbe\x6f\xa6\xfd\xfb\xf6\xfd\x3e\xd8\x8b\xa2\xf1\xde\xe3\xc1\xff\xc6\xb2\xf0\x9e\xd0\x36\x08\xca\x5f\xc3\x3c\xf8\x46\xa4\x12\xdd\x9e\xb6\xff\xcf\xa1\xad\xa1\xb4\xd0\x5e\xf1\x69\x2a\x5d\xc1\xb4\x7f\xc7\x34\xbc\x0b\xb2\xff\xa5\x90\x2f\xdb\xc2\xb7\xc7\xa7\xf1\x74\x0d\xd3\x7e\x8a\x69\xd8\xcb\x6f\xff\x13\x3e\x4d\xa1\x0b\x2d\x7c\x66\xf8\xbe\x42\x0b\xdf\x1d\x91\x36\x90\xb4\x6b\x42\xbe\x56\xda\x79\xe1\xfb\x5a\x69\x4b\x02\x5a\x4a\x6c\xa1\x9d\x18\xd6\xe9\xb4\xd0\x0e\x6f\xff\x9d\xe3\x7f\x0b\xbf\xb3\xda\x42\x9b\xf4\x69\x7a\xeb\x38\x8c\x7f\xdf\xa7\x69\x31\xb4\x71\x9f\x26\xf9\x63\x44\xd6\xb9\x25\xb4\x09\x59\x82\x0f\xdf\x0c\x35\xfe\x60\x38\x46\x62\x4b\x9d\x77\x85\x63\xe4\xb4\xf0\x5d\x1f\xd2\xa6\x5b\xf8\x2e\x8a\xd0\x7e\x4a\xd0\xf8\xf6\xf3\x6c\xbc\x3f\x32\xee\x64\x1b\x8e\x0e\xfb\x73\x22\xca\xb7\xef\x9d\xf0\x7d\x93\xd1\xf7\xed\x7b\x33\x16\x17\xde\x4d\xe0\x02\x29\xe7\xd8\x7b\xb2\x94\x6e\x4f\x23\x70\xa1\x95\xf6\x5a\x28\xaf\x24\x2e\xe0\xac\x94\xfb\xbf\xdb\x81\xef\x85\xc8\x9a\xe3\xc9\xf2\x31\x11\x5c\x68\xe5\x7b\x20\xf2\x3e\x92\xef\xce\x48\x1b\x48\x9a\xd2\x81\xaf\x81\x0b\xad\xb4\xe1\xc8\xb7\x90\xb4\xbe\x0e\x75\x1e\xd9\x9e\x46\xe0\x42\x2b\xad\x81\x0b\x2d\x6d\x27\x70\xa1\x95\xd6\xc0\x85\xd6\x3a\xe3\x71\x21\x13\xc1\x85\xd6\x3a\xe3\x71\x21\x13\xc1\x85\x56\xbe\x8b\x63\xc7\xb6\x27\x82\x0b\xad\x7c\x8b\xda\xf7\x35\x81\x0b\x2d\x7c\x04\x2e\xb4\xbc\xaf\x0d\x2e\x1c\xd9\x06\x17\xe8\x0e\xb8\x40\x77\xc0\x05\xba\x03\x2e\x1c\xd6\x01\x17\xe8\x0e\xb8\x00\x3a\xe0\x02\xdd\x01\x17\x40\x07\x5c\x00\x1d\x70\x01\x74\xc0\x05\xd0\x01\x17\x40\x07\x5c\x00\x1d\x70\x01\x74\xc0\x05\xd0\x01\x17\xe8\x0e\xb8\x40\x77\xc0\x05\xd0\x01\x17\x12\x1d\x70\x81\xee\x80\x0b\x89\x0e\xb8\x40\x77\xc0\x05\xba\x03\x2e\xd0\x1d\x70\x01\x74\xc0\x05\xba\x03\x2e\xd0\x04\x2e\xf8\xb2\xc0\xe4\x0f\xfe\xcd\x2d\x3d\x50\x6f\x91\x85\xdf\xb8\x3c\x07\xf0\xcd\x46\xa5\x54\x7b\xda\xfe\xbf\x44\x64\x81\xa4\xbd\x1a\xd8\x0b\xde\xf7\x1f\xf8\xab\x4b\xdb\x8f\x6f\x7f\x73\x31\xa2\x49\x16\x48\xbe\xbd\x11\x59\xf8\x19\xa6\xe1\xe8\x96\xfd\x4f\x46\xfa\x84\xe4\xbb\xbf\x79\x8e\xed\xff\xa4\x4b\xc3\x4f\xd0\x07\xde\x8a\xb4\x81\xac\xf3\xda\x88\x2c\x90\xb4\xf3\x23\xb2\x40\xd2\x86\x22\xb2\x40\xd2\x72\x11\x59\x20\x69\x47\x44\x64\x81\xa0\x8d\xbf\x1d\x91\x05\x92\xf6\x7a\x44\x16\x88\xb6\x8f\xff\x20\x22\x0b\x24\x6d\x7f\x44\x16\xc8\x3a\x9f\x0e\x65\x01\x8f\xc3\x01\x77\x74\xf2\xe3\x8f\xe1\x31\x7a\x2b\x22\x0b\x64\x9d\x7a\x44\x16\x3c\x1a\x1e\xdb\xf1\x1b\x22\xf3\x9d\xe4\x5b\x1d\xa1\x91\xdf\x72\x46\xfb\x79\x36\xbe\x30\x32\xee\x24\xdf\x31\x11\x59\x20\xf8\xf6\x1d\x0a\xdf\x57\x8c\xf2\xed\xfb\x5d\x1c\x2e\x1c\xf8\x41\x3c\x2e\x1c\x38\xd0\x1e\x17\x3c\x5a\x3c\x2e\xf8\xb4\x58\x5c\x38\xf0\xed\xf6\xb8\xe0\xf3\xc5\xe2\xc2\x81\x62\x7b\x5c\xf0\xf9\x62\x71\xc1\xe7\x8b\xc5\x05\x9f\x16\x8b\x0b\x3e\x2d\x16\x17\x7c\x5a\x2c\x2e\xf8\xb4\x58\x5c\xf0\x69\xb1\xb8\xe0\xd1\xe2\x71\xc1\xa7\xc5\xe2\x82\xd7\xf6\x78\x5c\xf0\x69\xb1\xb8\xe0\xd7\x19\x8b\x0b\x07\x76\xc4\xe1\xc2\x81\xe7\xf1\xda\xf2\x1a\xa6\xdd\x1b\x87\x0b\x3e\x5f\x2c\x2e\xf8\xdf\x12\x8b\x0b\xfe\xb7\xc4\xe2\x82\xcf\x17\x8b\x0b\x3e\x5f\x2c\x2e\x78\x7c\xf1\xb8\xe0\xf1\xb5\xc1\x85\xc7\xe3\x71\xc1\x45\x04\x86\x3e\xb0\x21\x56\x5e\x37\x74\xc0\x85\x0d\x04\x2e\x88\x21\x2e\x7c\x85\xc0\x85\xb7\x62\x71\x61\x43\x07\x5c\x58\xd7\x01\x17\x36\xc4\xe1\x82\x4f\xc3\xb7\x12\xed\x5f\x17\x8b\x0b\xeb\x3a\xe0\xc2\xba\x0e\xb8\xb0\xae\x03\x2e\xac\xeb\x80\x0b\xeb\x3a\xe0\xc2\xba\x0e\xb8\xb0\xae\x03\x2e\x6c\xe8\x80\x0b\x1b\x3a\xe0\xc2\xba\x08\x2e\xe4\x08\x3e\x7c\xf3\xe4\xf8\x43\xb1\xb8\xb0\x21\x0e\x17\x30\x87\x8f\xc1\x6d\x70\x61\x43\x07\x5c\x58\xd7\x01\x17\x36\x74\xc0\x85\x75\x1d\x70\x61\x43\x07\x5c\x58\xd7\x01\x17\x6e\x6d\x83\x0b\x97\x77\xc0\x85\xcb\x3b\xe0\xc2\xe5\x1d\x70\xe1\x86\x0e\xb8\x70\x79\x07\x5c\xb8\xb8\x03\x2e\x5c\xde\x01\x17\x2e\xee\x80\x0b\x17\x77\xc0\x85\x8b\x3b\xe0\xc2\xc5\x1d\x70\xe1\xe2\x0e\xb8\x70\x71\x07\x5c\xb8\xb8\x03\x2e\x5c\xdc\x01\x17\x2e\xef\x80\x0b\x97\x77\xc0\x85\x8b\x3b\xe0\xc2\x07\xda\xdb\x0b\x7e\x9d\xb1\xf6\x82\xcf\x17\x8f\x0b\x97\x77\xc0\x85\x8b\x3b\xe0\xc2\xe5\x1d\x70\xe1\xe2\x0e\xb8\x70\x79\x07\x5c\xb8\x98\xc0\x85\x02\x90\x52\x52\x72\x2a\x93\x3f\x88\xfd\x5a\x0f\x04\x39\x17\x0a\x73\x72\x4a\xa2\xc5\x4c\xfe\xe0\xab\x98\x07\x7b\x43\x97\x92\xed\x69\xfb\xa7\x7d\x9a\x18\x43\xfb\xb5\x4f\x53\x7d\xda\x14\xa6\x79\xfb\xfd\xdf\xe9\xc0\xf7\xbc\x4f\xe3\x7d\xda\x4f\x30\x0d\x7b\xc7\xef\x7f\x3c\x52\x27\xc9\xb7\x3e\x42\x23\xf9\x6e\xf7\x69\x4a\x0c\xed\xea\x0e\x7c\x62\x07\xda\x60\x87\x3a\x4f\xe8\x40\x3b\xac\x7d\x9d\xe3\xff\x1d\xe9\x6b\x92\xf6\x1b\x9f\xa6\xb7\xb6\x7d\xfc\x7b\x3e\x4d\x8b\xa1\xed\xf3\x69\xae\x2c\x44\xeb\x74\x7c\x9a\xe0\xf1\x8d\x6f\x6e\xf0\x1d\xfc\x49\xfb\x31\x1a\xff\x54\xec\x18\x79\xb4\xeb\x22\x34\x92\xef\xc2\xf6\x63\x3b\x3e\xd2\x7e\x9e\x8d\x9f\xd4\xbe\x3f\xc7\x8f\x6a\x3f\x27\xf6\xd5\xda\xbf\x6f\xdf\x6f\x31\x2d\xdc\x53\x3d\x70\x14\x6e\xf5\x9f\x5b\xce\xe0\x7e\xed\xf2\xbc\x88\x33\xa8\x97\xba\xda\xd3\xf6\xff\xc9\xa7\x49\x31\xb4\x5f\xf9\x34\xff\xac\xed\x00\xce\x73\x7a\xf0\xf7\xa0\x71\xd6\x66\x84\xfb\x75\x24\x5f\xd1\xa7\x05\xfb\x60\x15\x4c\xfb\x13\xa6\x3d\xe6\xd3\x94\x18\xbe\xfb\x7c\x9a\x1a\xc3\x77\x5b\xa4\x0d\x24\xed\x2a\x9f\xa6\xc5\xd0\x56\x75\xa0\x2d\x8e\x7c\x0b\x49\x3b\xbe\xc3\xb7\xa4\xdb\xd3\xc6\xff\x1a\xe9\x17\x92\xf6\x9a\x4f\xd3\x5b\xdb\x3e\xfe\xdd\xc8\x77\x92\xb4\x17\x22\x63\x44\xd6\xf9\x54\xa4\xaf\x3d\x3e\x7c\x57\xd7\xf8\x03\xed\xc7\x68\xfc\xce\x0e\x7c\x4a\x2c\xcd\xe3\xbb\xa0\xfd\xd8\x8e\x0f\xb7\x9f\x67\xe3\x7d\xed\xfb\x7a\xfc\xc8\x48\x7f\x12\x7c\xfb\xfe\xde\xfe\x7d\xfb\x82\x3d\xea\x00\x87\x70\xe9\x8b\xbf\x0e\xcf\xc8\x83\xf2\x5f\x62\x9e\x97\x08\x59\x88\xa5\xf9\xb2\xa0\xcf\x49\x29\xb9\x85\xf6\x2b\xff\x5d\x81\x8e\xf4\x26\xa6\xe1\x9b\x10\xf7\xff\xab\xcf\x17\xe8\x48\x24\x5f\xd1\xa7\x05\x3a\x12\x8e\xb7\x7b\xf1\x20\x21\x0b\x7a\x88\x95\x24\xdf\x7d\x3e\x2d\xd0\x3d\x48\xbe\xdb\x22\x6d\x20\x69\x57\xf9\x34\x2d\x86\xb6\xaa\x03\x6d\x71\xf0\x2d\xbe\xee\x41\xd2\x8e\x0f\xbf\xc5\x69\xa1\xa5\xdb\x7f\xa7\x2f\x0b\xfa\x9c\xe8\xeb\x48\x24\xed\x35\x9f\xa6\xb7\x8e\x83\x2f\x0b\x8d\xef\x24\x69\x2f\x84\x63\xd4\xf2\x9d\xbe\x2c\xe8\x73\xbc\xaf\x23\x79\x7c\x7b\x09\x59\xd0\x43\x1d\x89\xac\xf3\xce\x70\x8c\x9c\x16\x3e\x25\xac\x93\x69\xe1\xbb\x20\x42\x23\xbf\x65\xb8\xfd\x3c\xf3\x65\xa1\x31\xee\x24\xdf\x91\x61\x7f\x4e\x44\xf9\x7c\x59\xd0\x43\x1d\x89\xe0\xf3\x65\xc1\x08\xdf\xf7\x67\x2c\x0b\xbb\x1a\xb8\xe0\x97\x7b\xb2\xb5\xa9\x19\x17\x5a\x69\x04\x2e\xc8\x2d\xb4\x00\x17\x02\x59\xf8\x3d\xa6\x39\x84\x2c\x18\xa1\x2c\x90\x7c\x21\x2e\xf8\xb2\xe0\xc9\xf2\x83\xcd\xb8\xe0\xf7\x09\xc9\x17\xe2\x82\x4f\x23\xf9\x6e\x8b\xb4\x81\xa4\x85\xb8\x10\x43\x5b\xd5\x81\xd6\xc0\x05\xa5\x85\x16\xe2\x82\x3f\x57\x48\x5a\xba\xfd\x77\x36\x70\xc1\x97\x05\x92\x16\xe2\x42\xeb\x38\x34\x70\x21\x86\xd6\xc0\x85\x96\xef\x24\x70\x81\x25\xf8\xbe\x10\xc1\x05\xb1\xa5\xce\x10\x17\xfc\xf6\x91\x7c\x0d\x5c\x60\x5a\xf8\x2e\x88\xd0\xc8\x6f\x19\x6e\x3f\xcf\x1a\xb8\x10\xd3\x67\x21\x2e\xf8\xb2\x40\xf0\x35\x70\xc1\x97\x05\x82\xcf\x97\x05\xd7\x5e\x90\x1b\xf6\xc2\x8b\x3a\x61\x2f\xc8\x0d\x9d\xeb\xc5\x1b\x23\xf6\x42\x0b\x8d\xb0\x17\x5a\x69\x0d\x7b\x41\x6e\xd8\x0b\x2f\x7e\x3c\x62\x2f\xb4\xf2\x35\xec\x05\xb9\xa1\xe3\xbd\x78\x45\xc4\x5e\x68\xe5\x5b\x1f\xa1\x91\x7c\x0d\x7b\xa1\x95\x76\x75\x07\x3e\xb1\x03\x6d\xb0\x43\x9d\x27\x74\xa0\x1d\xd6\xbe\x4e\xc2\x5e\x68\xa5\x35\xec\x85\x96\xb6\x13\xf6\x42\x2b\x2d\xd6\x5e\xf0\xeb\x6c\xd8\x0b\x24\x1f\xce\x5f\x36\xbe\xa1\xfd\x18\x11\xf6\x42\x2b\xdf\x75\xb1\xb4\x1b\x23\xf6\x42\x6b\xfb\x46\xda\xcf\x33\xc2\x5e\x68\xe5\x3b\xaa\xfd\x9c\x20\xec\x85\x16\x3e\xdf\x5e\x08\xdf\xf7\xe2\x4a\x6c\x2f\xfc\x25\x2a\x0b\xee\xfc\x67\xf2\x07\x71\x46\xa0\x17\x97\x46\xbe\xf1\x15\x5c\xdf\xd2\x58\x59\x20\x69\x51\x59\xf8\x03\xa6\x09\xb1\xb2\x40\xf2\x45\x65\xe1\x65\x4c\xcb\x37\xc9\x82\x3b\x1f\xa4\x4c\xfe\xc5\x33\x5c\xda\x7e\x7c\x9b\xdf\xc1\x1f\x44\xde\x47\xf2\x45\x65\x81\xa4\x45\x65\x81\xa4\x45\x65\x81\xa4\x45\x65\x81\xa4\x45\x65\x81\xa4\x45\x65\x81\xa0\xb5\xc8\x02\x49\x8b\xca\x02\xd1\x67\x2d\xb2\x40\xd2\xa2\xb2\x40\xd6\x19\x95\x05\x8f\xef\xd4\x58\x59\x20\xeb\x8c\xc8\xc2\xf8\x27\x30\x0d\xdf\xb2\x77\xf0\x95\xc8\xf8\x91\x7c\x51\x59\xf0\xbe\x65\x49\xac\x2c\x90\x7c\x51\x59\x20\xdb\x10\x95\x05\x82\xaf\x45\x16\x88\xf7\xf9\xb2\xd0\xd0\xc9\x70\xce\x81\x17\x4f\x6c\xb1\x17\x7e\x85\x79\x70\xe6\x9e\x12\xd5\x9e\xb6\xff\x8f\xa1\x4e\xa9\xb4\xd0\xaa\xa1\x1e\x87\x75\xa4\x17\xf1\x7d\xce\xfb\xff\x05\xf7\xd7\xaf\x22\xf6\x02\xc9\xb7\x3b\x62\x2f\xfc\xd8\xa5\x95\x70\x04\xdb\xfe\xcd\x11\xbd\x91\xe4\xfb\x52\x44\x0f\x27\xf9\x3e\x11\x69\x03\x49\xbb\x22\xa2\x6b\x93\xb4\x0f\x74\xa0\x71\xa1\xbd\x20\xb6\xd0\xde\x1d\xb1\x17\x48\x1a\xdd\xfe\x3b\xc7\xff\xec\xd3\x04\x5f\x47\x22\x69\xaf\x44\xec\x05\xa2\xed\xe3\x2f\x45\xbe\x93\xa4\xed\x89\xd8\x0b\x64\x9d\x4f\x44\xec\x05\x8f\xcf\xf3\xa5\x30\x23\xf6\x02\x59\xe7\x1d\x11\x7b\x81\xe4\xbb\x26\xa4\x4d\xb7\xf0\x9d\x17\x37\xb6\x2f\x1e\x8e\x69\x4b\xda\xcf\xb3\xf1\x13\x23\xe3\x4e\xb6\xe1\xf0\x88\xbd\x40\xf0\xed\xfb\x5b\xc4\x5e\x20\xde\xb7\x6f\x32\xf2\xbe\xff\xc2\xb3\xfd\x6f\x2d\xb2\x50\xc5\xef\xfa\x43\xac\x2c\x10\xb4\x16\x59\x20\x69\x11\x59\x38\xf8\x5b\x4c\xc3\x6f\x74\x25\xa2\x49\x16\x48\xbe\xa8\x2c\xfc\x10\xd3\x7e\x12\x2b\x0b\x24\x5f\x54\x16\x48\xbe\xa8\x2c\x90\xb4\xa8\x2c\x90\xb4\xa8\x2c\x90\xb4\xa8\x2c\x90\xb4\xa8\x2c\x90\xb4\xa8\x2c\x10\xb4\x16\x59\x20\x69\x51\x59\x20\xda\xde\x22\x0b\x24\x2d\x2a\x0b\x64\x9d\x51\x59\xf0\xf8\x7e\x19\x2b\x0b\x64\x9d\x51\x59\x20\xf9\xa2\xb2\x40\xf2\x45\x65\xc1\xfb\x96\xc9\x58\x59\x20\xf9\xa2\xb2\x40\xb6\x21\x2a\x0b\x04\x5f\x8b\x2c\x10\xef\x6b\x91\x05\x8c\x0b\xa5\xef\xc7\xe3\x42\x09\xdb\xdb\xa5\x44\x7b\xda\xfe\xff\x0a\xfb\x59\x6e\xa1\xfd\x32\x22\x0b\xbf\xc3\x34\xcf\x07\xe3\xdb\x71\xb8\xe0\xf3\x8d\xc5\xe2\x02\x8e\x10\xdf\x3f\x1a\x87\x0b\x3e\xdf\xbd\xb1\xeb\xad\xc7\xa7\xc5\xe2\x82\x47\xbb\x32\x76\xed\xf7\x68\x2b\x3b\xd0\x4e\x8f\xc5\x05\x8f\x76\x5c\x2c\x2e\x78\xb4\x54\xfb\xef\x1c\xff\x4b\xf8\x9d\xd5\x16\xda\xab\x71\xb8\xe0\xb5\x7d\xbc\x1c\x87\x0b\x3e\x6d\x6f\x2c\x2e\x78\x75\x3e\x19\x87\x0b\x25\x9c\xdd\x6a\xfc\xfe\x38\x5c\xf0\xeb\xfc\x64\x1c\x2e\xf8\x7c\xd7\xc6\xe1\x82\xcf\x77\x7e\xec\xd8\x8e\x63\xda\x50\xfb\x79\x36\x9e\x8b\xc5\x05\xaf\x0d\x47\xc4\xe1\x82\xc7\xb7\xef\xed\xf0\x7d\xa5\xe8\xfb\xf6\xbd\x1e\xd1\xad\xfe\x82\x67\xfb\x96\x16\xdb\x19\xeb\x5c\xa5\xaf\x82\x38\xdb\x99\xa0\xc5\xdb\x0b\x3e\x2d\xd6\x5e\x28\x8d\xb6\xb7\x17\x7c\xbe\x58\x7b\xa1\xf4\x39\x10\x67\x3b\x93\x7c\x51\xdb\x99\xe4\x8b\xb5\x17\x7c\x5a\xac\xbd\xe0\xd3\x62\xed\x05\x9f\x16\x6b\x2f\xf8\xb4\x58\x7b\xc1\xa7\xc5\xda\x0b\x1e\x2d\xde\x5e\xf0\x69\xb1\xf6\x82\xd7\xf6\x78\x7b\xc1\xa7\xc5\xda\x0b\x7e\x9d\xb1\xf6\x42\xe9\xde\xf6\xf6\x82\x5f\x67\xd4\x76\x26\xf9\xa2\xb6\x33\xc9\x17\x6b\x2f\x94\x1e\x6c\x6f\x2f\xf8\x7c\xb1\xf6\x82\xdf\x86\x58\x7b\xc1\xe3\x8b\xb7\x17\xbc\xf7\x05\xb6\x73\xb8\x8f\xf4\x47\x3c\xdb\xef\x6a\x91\x05\x6f\xde\xde\x1c\x2b\x0b\xbf\x68\xd0\x5a\x64\x81\xa4\x91\xb2\x20\x65\xf2\xee\xfc\x67\xf2\x07\x71\xf6\xb0\x92\xda\x81\x8f\x94\x05\x29\x93\x77\x6d\x62\x26\x5f\xfa\x70\xac\x2c\x90\x7c\xeb\x9b\xdf\xd7\xc4\x47\xca\x42\x94\x76\x75\x07\x3e\xb1\x03\x6d\xb0\x43\x9d\x27\x74\xa0\x1d\xd6\xbe\xce\x26\x59\x88\xd2\x48\x59\x90\x32\x5e\xab\xbd\x27\x5a\x65\x81\xe8\x97\x26\x59\x88\xd6\x19\x95\x05\x8f\xef\xaa\x58\x59\x20\xeb\x8c\xca\x02\xc9\x17\x95\x05\x92\xef\xc2\xd8\xb1\xbd\x21\x56\x16\x48\xbe\x93\xda\xf7\x67\x8b\x2c\x10\x7c\x4d\xb2\x10\x79\x5f\x8b\xed\x8c\x73\x2c\x95\x56\xb7\xe8\x48\xd8\x77\xb7\x84\x33\x95\xb6\x9c\xb5\x11\xb4\x96\xb3\x36\x92\xf6\xab\x88\x8e\x84\xef\x1b\x28\xe1\x4c\xa0\x2d\x67\x6d\x24\x5f\xf4\xac\xed\xfb\x98\x86\x6f\x78\x6c\x39\x6b\x23\xf9\xa2\x67\x6d\x24\x5f\xf4\xac\x8d\xa4\x45\xcf\xda\x48\x5a\xf4\xac\x8d\xa4\x45\xcf\xda\x48\x5a\xf4\xac\x8d\xa4\x45\xcf\xda\x08\x5a\xcb\x59\x1b\x49\x8b\x9e\xb5\x11\x6d\x6f\x39\x6b\x23\x69\xd1\xb3\x36\xb2\xce\xe8\x59\x9b\xc7\xe7\xc5\x55\x46\xcf\xda\xc8\x3a\xa3\x67\x6d\x24\x5f\xf4\xac\x8d\xe4\x8b\x9e\xb5\x79\xdf\x72\x26\x88\x3b\x6b\x23\xf9\xa2\x67\x6d\x64\x1b\xa2\x67\x6d\x04\x5f\xcb\x59\x1b\xf1\xbe\x96\xb3\x36\x1c\xd7\x56\x5a\xd4\x88\x6b\xf3\xcb\x71\x6c\x50\x09\x67\xe0\xf4\xe3\x17\x62\x69\xbe\x9f\xaa\x16\xda\xce\x24\x2d\x12\xbf\x50\x3a\x09\xaf\x63\x38\x03\x14\x11\xef\x9c\x6d\xe1\xdb\xeb\xd3\x02\x59\xc0\xb1\x48\x25\x9c\x9d\xd9\xf7\x53\xd5\xc2\x3e\x21\xf9\xee\xf7\x69\xc1\x1c\x23\xf9\x3e\x19\x69\x03\x49\xbb\x36\xe4\x6b\xa5\x9d\x1f\xbe\xaf\x95\x36\x14\xd0\xfc\xb9\x42\xd2\x72\x61\x9d\x4e\x0b\xed\x88\xf6\xdf\xe9\xfb\xa9\x6a\xa1\xbd\x40\xd2\x62\xfd\x54\x4b\x5e\x9c\xe3\x0f\x7c\x3e\xad\x75\x8c\x7c\x3f\x55\x2d\x94\x05\xb2\xce\xa7\x7d\x5a\xe0\xa7\xea\xf1\xe1\x6c\xfc\xbe\x9f\xaa\x16\xca\x02\x59\xa7\x1e\x8e\x91\xd3\xc2\x77\x43\x48\x9b\x6e\xe1\x5b\x1d\xa1\xfd\x9c\xa0\x9d\xd1\x7e\x9e\xf9\x7e\xaa\x8d\x71\x27\xdb\x70\x4c\xd8\x9f\x13\x04\x1f\xa6\xf9\x7e\xaa\x5a\xe8\xa7\x4a\xbc\xcf\xf7\x53\xb5\x02\x9f\x8f\x6f\xe0\x3b\xad\x0e\x06\x79\x86\xad\x30\xee\xfa\x05\xd0\x88\xfd\x4f\xb7\xa7\xf9\x31\x9e\x56\x18\x1f\x4e\xd2\x82\x75\x2c\xf0\x13\xf9\x67\x4c\x1b\xc2\xb4\xef\x76\xe0\x7b\xc1\xa7\x05\xf1\xda\xbb\x30\xcd\x5b\x53\x9f\xf2\x69\x4a\x0c\xdf\x03\x3e\x4d\x8d\xe1\xbb\x33\xd2\x06\x92\xa6\x74\xe0\xbb\xc0\xa7\x99\x31\xb4\xe1\xc8\xb7\x90\xb4\xbe\x0e\x75\x1e\xd9\x9e\xe6\xc7\x78\xc6\x7e\xa7\x1f\xe3\x69\x85\xb1\xff\x44\xdb\xfd\x18\x4f\x2b\x8c\xfd\x27\x69\x25\x9f\x26\xc5\xd4\xb9\xd5\xa7\x09\x4d\x7c\xf8\xe6\x3f\x3f\xc6\x33\x76\x8c\xfc\x18\xcf\xc6\x18\x91\x7c\x37\xc6\xd2\x3c\xbe\x8b\x63\xc7\xd6\xa3\x9d\xd9\x7e\x9e\xf9\x31\x9e\xb1\x7d\xed\xc7\x78\x36\xfa\x93\xe0\xf3\x63\x3c\x63\xdf\xe7\xc7\x78\x4a\x73\x32\x6d\x62\x5a\xd9\x2d\xfd\xc6\xc9\x61\x0e\xcc\x40\x26\xf7\x60\x1e\x7c\xd7\x8e\xef\xb3\x1d\x4b\xf3\x7d\xb6\x95\x10\x17\x48\x9a\xb7\x07\xc8\x87\x3a\xd2\x41\x4c\xf3\xce\x9b\x5e\x0a\xf9\xb2\x2d\x7c\x7b\xfc\x6f\x0c\x70\x01\xdf\x3d\xf9\x0d\x9c\x59\xd8\xf7\xd9\x56\xc2\xf5\x81\xe4\x33\x7d\xbe\x60\xbd\x25\xf9\xee\x88\xb4\x9b\xa4\x5d\x13\xf2\xb5\xd2\xce\xf3\x69\x4a\x0c\x6d\x49\x40\xf3\xd7\x4d\x92\x76\x62\x58\xa7\xd3\x42\x3b\xbc\xfd\x77\xfa\x3e\xdb\x52\x88\x0b\x24\x6d\xd2\x6f\xbb\xde\x3a\x0e\xbe\xcf\xb6\x12\xe2\x02\x49\x1b\xf7\xeb\x0c\x70\x81\xac\x73\x8b\xcf\x27\xa4\x58\x5a\x0d\xf9\x3c\xff\xcf\x07\xc3\x31\x12\x5b\xea\xbc\xcb\xa7\xb9\xb8\x10\xe5\xbb\x3e\xa4\x4d\xb7\xf0\x5d\x14\x8e\xed\x34\xf1\x2d\x1e\x8d\x6f\x3f\xcf\x7c\x9f\x6d\x29\x1c\x77\xb2\x0d\x47\xfb\x7c\x01\x2e\x10\x7c\xbe\xcf\xb6\x14\xea\x48\xc4\xfb\x7c\x9f\xed\x10\x17\x5c\x44\x60\xe8\x6f\x1c\x4b\xe0\x42\x91\x90\xad\xf9\x11\x5c\x68\xa1\x11\xb8\xd0\x4a\x8b\xc7\x85\xde\x08\x2e\xb4\xf2\x35\x70\xa1\x48\xc8\xf2\xd1\x11\x5c\x68\xe5\x6b\xe0\x42\x2b\xdf\x9d\x91\x36\x90\x34\xa5\x03\x5f\x03\x17\x5a\x69\xc3\x91\x6f\x21\x69\x7d\x1d\xea\x3c\xb2\x3d\x8d\xc0\x85\x56\x5a\x03\x17\x5a\xda\x4e\xe0\x42\x2b\xad\x81\x0b\xad\x75\x36\x70\x81\xe4\xeb\x8e\xe0\x42\x6b\x9d\x77\x47\xc6\x88\xe4\xbb\x31\x96\x36\x3f\x82\x0b\xe4\xb7\xcc\x8f\xe0\x42\x2b\xdf\xa2\xf6\x7d\x4d\xe0\x42\x0b\x1f\x81\x0b\x2d\xef\x23\x70\xc1\x20\x70\xe1\x88\x36\xb8\x90\xec\x80\x0b\xc9\x0e\xb8\x90\xec\x80\x0b\xe9\x0e\xb8\x90\x6c\x8f\x0b\x07\xe6\x3a\xe0\x42\xb2\x3d\x2e\xf8\x7c\x77\x44\xda\x4d\xd2\x1a\xb8\xd0\x4a\x6b\xe0\x42\x2b\x2d\x16\x17\x7c\x5a\x2c\x2e\xf8\xb4\x58\x5c\xf0\x68\xf1\xb8\xe0\xd3\xe2\x71\x21\xd9\x01\x17\x92\xed\x71\xc1\xaf\x93\xc4\x85\x06\x1f\xd5\x01\x17\x92\x2d\xb8\x10\xe5\x8b\xc7\x85\x64\x07\x5c\x48\x76\xc0\x85\x64\x7b\x5c\xf0\xdb\x10\x8f\x0b\xc9\x0e\xb8\x90\x04\x2d\x31\x9e\x99\xfc\xc1\xef\xba\xa5\x07\x66\xc3\xfc\xe1\x41\xf9\x5e\xfc\xae\x7f\x07\x0d\xdb\x39\x96\xe6\xdb\xce\x52\x28\x0b\x24\xed\xd5\x70\xcc\x3d\x59\xf8\x27\x4c\xc3\x27\x1a\xfb\xcb\x21\x5f\xb6\x85\x6f\x6f\x44\x16\x0a\x98\x86\xe3\x07\x7d\xdb\xb9\xd1\x27\x24\xdf\xfd\x91\x39\x46\xf2\x7d\x32\xd2\x06\x92\x76\x6d\x44\x16\x48\xda\xf9\x11\x59\x20\x69\x43\x11\x59\x20\x69\xb9\x88\x2c\x90\xb4\x23\xda\x7f\xa7\x6f\x3b\x37\x64\x81\xa4\xbd\xee\xd3\xf4\xd6\x71\xf0\x6d\x67\x29\x94\x05\x92\xb6\x3f\x22\x0b\x64\x9d\x4f\xfb\xb4\xc0\x76\xf6\xf8\xf0\xed\xe6\xbe\xed\x2c\x85\xb2\x40\xd6\xa9\x87\x63\xe4\xb4\xf0\xdd\x10\x99\xef\x24\xdf\xea\x08\x8d\xfc\x96\x33\xda\xcf\x33\xdf\x76\x6e\x8c\x3b\xc9\x77\x4c\xd8\x9f\x13\x51\x3e\xdf\x76\x96\x42\xdb\x99\xe0\xf3\x6d\xe7\xf0\x7d\x07\xbe\xef\x96\x1e\x2c\xc7\xe3\xc2\x81\x17\xdb\xe3\x82\x47\x8b\xc7\x05\x9f\x16\x8b\x0b\x07\xfe\xa5\x3d\x2e\xf8\x7c\xf1\xb8\x30\xd6\x1e\x17\x7c\xbe\x78\x5c\x18\xeb\x80\x0b\x63\x1d\x70\x61\xac\x03\x2e\x8c\x75\xc0\x85\xb1\x0e\xb8\x30\xd6\x01\x17\xc6\x3a\xe0\xc2\x58\x7b\x5c\xf0\xda\x1e\x8f\x0b\x3e\x2d\x1e\x17\xc6\xda\xe3\xc2\x81\xed\xed\x71\xc1\xaf\x33\x16\x17\x7c\xbe\x58\x5c\xf0\xf9\x62\x71\xc1\xff\x96\x58\x5c\xf0\xf9\xe2\x71\x61\xac\x3d\x2e\x78\x7c\xf1\xb8\xe0\xf1\xb5\xc1\x85\xc7\xda\xe0\xc2\x03\x1d\x70\xe1\x81\x0e\xb8\xf0\x40\x07\x5c\x78\xb8\x03\x2e\x3c\xd0\x01\x17\x8c\x0e\xb8\xf0\x40\x07\x5c\x30\x3a\xe0\x82\xd1\x01\x17\x8c\x0e\xb8\x60\x74\xc0\x05\xa3\x03\x2e\x18\x1d\x70\xc1\xe8\x80\x0b\x46\x07\x5c\x78\xa0\x03\x2e\x3c\xd0\x01\x17\x8c\x0e\xb8\xf0\xa9\xf6\xb8\x30\x7e\x1f\x9e\x31\x46\x2c\x2e\x7c\xaa\x03\x2e\x3c\xd0\x01\x17\x8c\x0e\xb8\xf0\x40\x07\x5c\x30\x3a\xe0\xc2\x03\x1d\x70\xc1\x88\xc3\x05\xcf\x5e\x38\xf0\xb1\x36\xb8\x20\x77\xc0\x05\xb9\x03\x2e\xc8\x1d\x70\xe1\xfa\x0e\xb8\x20\x77\xc0\x85\xd5\x1d\x70\x41\xee\x80\x0b\xab\x3b\xe0\xc2\xea\x0e\xb8\xb0\xba\x03\x2e\xac\xee\x80\x0b\xab\x3b\xe0\xc2\xea\x0e\xb8\xb0\xba\x03\x2e\xac\xee\x80\x0b\x72\x07\x5c\x90\x3b\xe0\xc2\xea\x0e\xb8\x70\x6e\x07\x5c\x90\x3b\xe0\xc2\xb9\x1d\x70\x41\xee\x80\x0b\xab\x3b\xe0\x82\xdc\x01\x17\x56\x77\xc0\x05\xb9\x03\x2e\xac\x06\x91\xd8\x7f\x1a\x64\xf2\x07\x71\x24\xdc\x81\x33\x5b\x62\xff\x71\x2e\x9c\x03\x27\x83\xb8\xd8\x7f\x82\xd6\x12\xfb\x4f\xd2\xa2\xb1\xff\xdf\xc4\x34\xef\x2c\x20\x1a\xfb\x4f\xf2\x45\x63\xff\x77\x60\x9a\x77\x9e\x16\x8d\xfd\x27\xf9\xa2\xb1\xff\x24\x5f\x34\xf6\x9f\xa4\x45\x63\xff\x49\x5a\x34\xf6\x9f\xa4\x45\x63\xff\x49\x5a\x34\xf6\x9f\xa4\x45\x63\xff\x09\x5a\x4b\xec\x3f\x49\x8b\xc6\xfe\x13\x6d\x6f\x89\xfd\x27\x69\x51\x7f\x24\xb2\xce\x48\xec\xbf\xcf\xb7\x00\xd3\x36\xb4\x1f\xa3\x96\xd8\x7f\x92\x2f\x1a\xfb\x4f\xf2\x45\x63\xff\xc9\x6f\x89\xc6\xfe\x93\x7c\xd1\xd8\x7f\x92\x2f\x1a\xfb\x4f\xf0\xb5\xc4\xfe\x13\x7c\xd1\xd8\xff\x83\xff\x8a\x65\xe1\xc8\x96\xd8\x7f\x57\xa3\xca\xbf\x88\x6f\x5a\x6c\x89\xfd\x27\x68\x2d\xb1\xff\x24\x2d\x8c\xf1\xf4\x69\x07\xf0\x77\xe0\xbd\x06\x22\xc6\xb3\x95\x2f\x1a\xfb\xbf\x0d\xd3\x3c\x5f\xef\x68\xec\x3f\xc9\x17\x8d\xfd\x27\xf9\xa2\xb1\xff\x24\x2d\x1a\xfb\x4f\xd2\xa2\xb1\xff\x24\x2d\x1a\xfb\x4f\xd2\xa2\xb1\xff\x24\x2d\x1a\xfb\x4f\xd0\x5a\x62\xff\x49\x5a\x34\xf6\x9f\x68\x7b\x4b\xec\x3f\x49\x8b\xc6\xfe\x93\x75\x46\x63\xff\x3d\xbe\x37\x31\x2d\x1a\xfb\x4f\xd6\x19\x8d\xfd\x27\xf9\xa2\xb1\xff\x24\x5f\x34\xf6\x9f\xfc\x96\xff\x8f\xb3\x7f\x8d\xb7\xeb\x2a\xcb\xfe\xf1\xd9\x36\x7b\xd1\xaa\x8f\xd4\xb4\x69\xd2\x96\x22\x2a\x44\x0e\xa5\xad\x20\xd8\x8a\x40\x68\x52\xb2\x4d\x1a\x4c\x4b\x8e\xa5\xa5\xe1\x24\x81\xd0\x24\x2d\xa0\x69\x4d\x9a\xb6\x09\x39\xc0\x83\x9c\x69\x2b\x88\x01\x0f\xb4\x52\xc2\xae\x9a\x9d\xb9\x56\x76\x24\xad\xb4\x7f\xc5\x13\x07\xa5\x15\x1e\xb5\x3c\x8a\x02\x8a\x46\x41\x1f\x15\x91\xff\x67\x8d\x71\xaf\x31\xaf\x79\xdd\xd7\xb8\x5f\xfc\x5e\x36\xdf\x5e\x63\xce\xb1\xd6\xba\xf7\xb5\xc6\x1c\xf7\xb5\x06\x67\xff\x51\xc7\xd9\x7f\xd4\x71\xf6\x1f\x74\x2e\xfb\x0f\x3a\x97\xfd\x4f\x2b\xd9\xe1\x17\x5d\x3f\xd2\xc7\x93\xe6\xe1\x46\xf5\x23\x01\x73\xfd\x48\xc8\xb8\x1f\xa9\x4d\xec\x33\x50\x0b\x5d\x3f\x12\xea\xb8\x1f\xe9\x23\x89\xcd\x41\x2d\x74\x7d\x29\xa8\xe3\x7e\x24\xd4\x71\x3f\x12\x32\xee\x47\x42\xc6\xfd\x48\xc8\xb8\x1f\x09\x19\xf7\x23\x21\xe3\x7e\x24\x60\xae\x1f\x09\x19\xf7\x23\xc1\xdc\x5d\x3f\x12\x32\xee\x47\xc2\x31\xb9\x1f\x29\xeb\x7e\x0b\x6a\xa1\xeb\x47\xc2\x31\xb9\x1f\x09\x75\xdc\x8f\x84\x3a\xee\x47\xc2\x7b\xe1\x7e\x24\xd4\x71\x3f\x12\xea\xb8\x1f\x09\x74\xae\x1f\x09\x74\xae\x1f\x29\xf9\xc2\xf0\x1e\x97\xfd\xcf\xb5\xf5\xbe\x46\x65\xff\x81\xb9\xec\x3f\x32\xce\xfe\x27\x5f\x18\xfe\x0a\xf9\xc2\x22\xa7\xe3\xec\x7f\xae\xe5\xb7\xf5\x7d\xc1\x5e\x13\xd4\x71\xf6\x1f\x75\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x60\x2e\xfb\x8f\x8c\xb3\xff\x30\x77\x97\xfd\x47\xc6\xd9\x7f\x1c\x93\xb3\xff\x59\x77\x3b\xf9\xc2\xb4\x1b\x93\xb3\xff\xa8\xe3\xec\x3f\xea\x38\xfb\x8f\xf7\xc2\xd9\x7f\xd4\x71\xf6\x1f\x75\x9c\xfd\x07\x9d\xcb\xfe\x83\x0e\xb3\xff\xdd\x7a\x61\xe8\x7b\xb6\xd3\x77\xae\xe1\xab\x1a\xd5\xb3\x0d\xcc\xf5\x6c\x23\xe3\xfc\x42\x5a\x2f\x0c\x6f\xa0\xf5\x82\xd7\x71\x7e\x21\x7d\xc7\x1b\x6e\xa4\xf5\x82\xd7\x71\x7e\x01\x75\x9c\x5f\x40\xc6\xf9\x05\x64\x9c\x5f\x40\xc6\xf9\x05\x64\x9c\x5f\x40\xc6\xf9\x05\x60\x2e\xbf\x80\x8c\xf3\x0b\x30\x77\xd7\xb3\x8d\x4c\xae\x17\x6c\x4c\xee\xd9\xce\xba\x9f\xa1\xf5\x82\x1f\x93\x7b\xb6\x51\xc7\x3d\xdb\xa8\xe3\xfc\x02\xde\x0b\xf7\x6c\xa3\x8e\xf3\x0b\xa8\xe3\x9e\x6d\xd0\xb9\xfc\x02\xe8\x38\xfb\x7f\x3c\x39\xc9\xf0\xc5\xae\x16\x66\x9a\x92\x9f\x76\xb5\x00\xcc\xd5\x02\x32\xae\x85\x63\x89\xe9\xec\x3f\xea\xb8\x16\x7e\x3d\xb1\xc5\xb2\x16\x50\xc7\xb5\x80\x3a\xae\x05\x64\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x00\xcc\xd5\x02\x32\xae\x05\x98\xbb\xab\x05\x64\x5c\x0b\x38\x26\xd7\x42\xd6\xe9\xec\x3f\x8e\xc9\xb5\x80\x8c\x6b\x01\x19\xd7\x42\xbe\x17\x9d\xfd\x47\x1d\xd7\x02\xce\x81\x6b\x01\x74\xae\x16\xe0\x7a\x2e\xbf\x90\x12\x97\x22\xfb\x7f\x38\x69\x74\xf6\x1f\x98\xcb\x3b\x23\xe3\xbc\xf3\x30\xb1\x7c\x16\x09\xe7\x9d\x51\xc7\x79\xe7\x5f\x1d\xb3\x4a\xf6\x1f\x75\x9c\x77\x46\x1d\xe7\x9d\x91\x71\xde\x19\x19\xe7\x9d\x91\x71\xde\x19\x19\xe7\x9d\x91\x71\xde\x19\x98\xcb\x3b\x23\xe3\xbc\x33\xcc\xdd\xe5\x9d\x91\x71\xde\x19\xc7\xe4\xbc\x73\xd6\xe9\xec\x3f\x8e\xc9\x79\x67\xd4\x71\xde\x19\x75\x9c\x77\x4e\xf7\x52\xc9\xfe\xa3\x8e\xf3\xce\x38\x07\xce\x3b\x83\xce\xe5\x9d\xe1\x7a\x2e\xef\xfc\x60\xa3\xb3\xff\xf7\xa5\x6b\xe9\xec\x3f\x30\x57\x0b\xc8\xb8\x16\x8e\x26\xa6\xb3\xff\xa8\xe3\x5a\xf8\x70\x62\x3a\xfb\x8f\x3a\xae\x05\xd4\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x19\xd7\x02\x32\xae\x05\x60\xae\x16\x90\x71\x2d\xc0\xdc\x5d\x2d\x20\xe3\x5a\xc0\x31\xb9\x16\xb2\x4e\x67\xff\x71\x4c\xae\x05\xd4\x71\x2d\xa0\x8e\x6b\x21\xdf\x8b\xce\xfe\xa3\x8e\x6b\x01\xe7\xc0\xb5\x00\x3a\x57\x0b\x70\x3d\xae\x85\x36\xf7\x60\x7c\x4a\xfb\x42\x25\xfb\x0f\xcc\x65\xff\x91\x71\xf6\x3f\xf9\x42\x25\xfb\x8f\x3a\xce\xfe\xe7\xbf\x01\x3a\xfb\x8f\x3a\xce\xfe\xa3\x8e\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x0f\xcc\x65\xff\x91\x71\xf6\x1f\xe6\xee\xb2\xff\xc8\x38\xfb\x8f\x63\x72\xf6\x3f\xeb\x74\xf6\x1f\xc7\xe4\xec\x3f\xea\x38\xfb\x8f\x3a\xce\xfe\xe7\x7b\xd1\xd9\x7f\xd4\x71\xf6\x1f\xe7\xc0\xd9\x7f\xd0\xb9\xec\x3f\x5c\xcf\x65\xff\xf3\x53\x53\x9f\xfd\x4f\xdf\xb9\x2a\xd9\x7f\x60\x7a\xbd\x50\xc9\xfe\xa7\xf5\x42\x25\xfb\x8f\x3a\xb9\x5e\xa8\x64\xff\x51\x27\xd7\x0b\x95\xec\x3f\x32\xb9\x5e\xa8\x64\xff\x91\xc9\xf5\x42\x25\xfb\x8f\x4c\xae\x17\x2a\xd9\x7f\x64\x72\xbd\x50\xc9\xfe\x23\x93\xeb\x85\x4a\xf6\x3f\xeb\x74\xf6\x1f\xc7\x94\xeb\x85\x4a\xf6\x1f\x75\x72\xbd\x50\xc9\xfe\xa3\x4e\xae\x17\x2a\xd9\x7f\xd0\xe9\xf5\x42\x25\xfb\xff\x40\xa3\xb3\xff\x1f\x4b\x1a\x9d\xfd\x07\xe6\x6a\x01\x19\xd7\xc2\x6c\x62\xdb\x65\x2d\xa0\x8e\x6b\xe1\x50\x62\x3a\xfb\x8f\x3a\xae\x05\x64\x5c\x0b\x38\x26\xd7\x02\x32\xae\x05\x64\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x00\x73\xb5\x80\x8c\x6b\x01\xe6\xe7\x6a\x01\x19\xd7\x02\x8e\xc9\xb5\x90\x75\x3a\xfb\x8f\x63\x72\x2d\xa0\x8e\x6b\x01\x75\x5c\x0b\xf9\x5e\x74\xf6\x1f\x75\x5c\x0b\xc8\xb8\x16\x80\xb9\x5a\x80\xeb\xb9\xb5\xf3\x89\x46\x67\xff\x7f\x33\x69\x74\xf6\x1f\x98\xdb\x6b\x43\xc6\x7b\x6d\x47\x12\xd3\xd9\x7f\xd4\xf1\x5e\xdb\xaf\x24\xa6\xb3\xff\xa8\xe3\xbd\x36\xd4\xf1\x5e\x1b\x32\xde\x6b\x43\xc6\x7b\x6d\xc8\x78\xaf\x0d\x19\xef\xb5\x21\xe3\xbd\x36\x60\x6e\xaf\x0d\x19\xef\xb5\xc1\xdc\xdd\x5e\x1b\x32\xde\x6b\xc3\x31\x79\xaf\x2d\xeb\x74\xf6\x1f\xc7\xe4\xbd\x36\xd4\xf1\x5e\x1b\xea\x78\xaf\x2d\xdf\x8b\xce\xfe\xa3\x8e\xf7\xda\x70\x0e\xbc\xd7\x06\x3a\xb7\xd7\x06\xd7\xb3\xfd\x85\xd2\xa7\xda\xa6\x93\x6e\x8f\xff\x41\x97\x6b\xb3\xfb\x48\xd9\xa0\x9c\x2b\xb7\x3e\x55\xc9\xac\x4f\xf5\x9d\x65\xed\x8c\xec\x2f\xa9\x16\x52\xae\xad\x4d\x67\x00\x5b\x9f\xea\x3b\x4b\x2d\xa0\xee\xb7\x8d\x4d\x6a\x21\x65\x91\xda\xfc\xfc\xe9\x43\xc6\x26\xaf\x09\xea\x0e\x1a\x9b\x7c\xc6\x50\xf7\x26\x9a\x03\xb2\xeb\x8b\xce\xb3\x15\xe5\x7a\x9e\x3d\x67\xc2\xec\xb3\x82\xec\x49\x65\xcc\x43\x8e\x7d\x6f\xfd\x3e\xad\x4f\xf5\x9d\x65\xbd\x80\xec\xcb\xc6\x76\xf8\xf7\xc1\xfa\x54\xdf\x59\x6a\x01\xd9\x51\x63\x93\x5a\xc0\x31\x3f\x62\x6c\xd2\xa7\x9a\x75\xe7\x27\xf6\xf6\xf2\x1e\x4d\xbb\x31\x77\x94\xf7\xe8\x90\xd3\xbd\xaa\xb0\x93\x4e\xf7\x12\x62\xf7\x02\xbb\xac\xfe\x39\xb3\x3e\xd5\xee\x7d\xc7\x39\x3c\xbe\xbc\x9e\x27\x58\x67\x7d\xaa\xef\x2c\x7d\xaa\x70\x3d\xeb\x53\x3d\x59\xb2\xff\xf9\xd7\x60\x3f\x64\xb5\x70\xb2\xe4\xae\xc7\xdf\xa8\xec\x7c\x74\x3b\xf7\x5f\xb3\x53\x8c\x2d\xf1\xec\xe8\x3f\x1a\x9b\xf4\x89\xbc\x2f\xb1\xf4\x6c\xd7\x32\x9e\x27\x4b\x1e\x1d\x75\x0f\x1a\x9b\xe4\xb5\xf7\x24\x96\xcf\xcc\xff\xb8\xb1\x1d\x42\x77\x57\xb9\x5e\x62\xe9\x5f\xb3\x7a\x70\x74\x0f\xcd\x01\xc7\xdc\xda\xd7\xf5\xd8\xc6\x80\x2d\x33\xb6\x49\xb0\x8b\x03\xdd\x79\x01\x9b\xaa\xcf\x7d\xf6\x64\x7d\xee\xb3\x5f\x32\xb6\x5d\xb0\x87\xe9\x3d\xc2\x31\xef\x2f\x6c\x06\x74\xf9\xfc\xfe\x0f\x1a\x9b\x16\x63\xee\x2f\xf7\xe9\x75\x37\xd1\x1c\x50\x77\x9d\x9c\x5f\x66\xd3\xf5\xcf\xd9\xec\xb3\xeb\xaf\xf5\xec\x13\xe9\xf5\x44\xdd\x19\xf5\xeb\x1d\xc9\xdf\x47\x67\x4a\xed\x7d\xb0\xc1\x73\xff\xbb\x7f\x7f\x6b\xd2\xe4\x73\xff\xcf\xae\xb3\xa3\xdf\x35\xb6\xc4\xfe\xe6\x20\xfb\xba\x31\xfb\x4d\x98\xe3\xef\x49\x2c\x9f\xef\xfc\xe7\xc6\x26\xbe\x80\xba\x13\xc6\x26\xbe\x70\x7b\x62\xf9\x6f\xff\xc7\x8c\xed\xb0\x31\x51\xf7\x7e\x63\x93\xbf\xb7\xa8\xbb\x9d\xe6\x80\xec\x0d\x45\xe7\xd9\xfa\x80\x5d\x6e\x6c\xe2\x0b\xc8\x9e\x59\x74\x87\x1c\x5b\x14\xdc\xe7\x69\x65\xee\x8f\x32\x9b\xfd\xa7\x32\xf7\x74\x2f\xb3\x7f\xd1\xcd\xfd\xf8\x5b\x8d\x6d\xf7\xef\xd1\xec\xa7\xe8\x3d\xc2\x31\x3f\x51\x58\x03\xba\x7c\x7e\xff\x2f\x95\xf7\x68\xda\x8d\xf9\x96\x72\x9f\x87\x9c\x6e\x7b\x61\x27\x9d\xee\x65\xc4\x6e\x07\xf6\xe2\xfa\xe7\x6c\xf6\xc7\x26\xaf\xb5\x7f\xcd\x66\x9f\x50\x5e\xcf\x13\x4e\xf7\xb8\x72\xbd\xc7\xf8\x7a\x47\xfe\xb5\xef\x0b\x63\x47\x80\x73\xff\xbb\x7f\xcf\xb5\xb5\x80\x7c\xc1\xb3\x53\xe4\xdf\x95\x05\x3d\x5f\xb8\xad\xe7\x0b\xf9\x7b\xc2\x23\xc5\x17\xbc\xee\x41\xfa\x9b\x93\x6b\xf9\xf1\xe4\x0b\x5e\x77\x17\xf9\x10\xea\xf6\xd0\x1c\x90\x6d\x0d\x74\x1b\x03\xd6\xf9\x82\x67\x17\x07\xba\xf3\x02\x36\x55\x9f\x3b\xf8\x82\x9b\x3b\xf8\x82\x67\x0f\xd3\x7b\x84\x63\x6a\x5f\x98\x4f\xbe\xe0\xc7\xd4\xbe\x30\x9f\x7c\xc1\xeb\xae\x93\xf3\x5b\x40\xbe\xe0\x75\xcf\xae\xbf\xd6\xe0\x0b\x5e\x77\x46\xfd\x7a\x15\x5f\xf8\xbe\x8a\x2f\x0c\x02\x5f\x18\x04\xbe\x30\xf8\xff\xe8\x0b\x83\xc0\x17\x9a\xc0\x17\x06\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\xca\x17\x70\xee\xb3\x7f\x21\x7d\x61\x10\xf8\x42\x13\xf8\xc2\x69\x81\x2f\x0c\x02\x5f\x38\x2d\xf0\x85\x41\xe0\x0b\x83\xc0\x17\x06\x81\x2f\x34\x81\x2f\x0c\x02\x5f\x18\xf4\x7d\xc1\xae\xf7\xcb\xe3\x7f\x1d\xfd\x57\xe7\x0b\xf6\xef\x6f\x1b\x6b\x46\x79\xdf\x79\x41\xc0\x9a\xf2\x77\x65\x13\xb3\xa3\xff\x30\xf1\x05\xbb\xff\xf7\x26\x96\x7e\xd9\xfb\xe8\x17\xca\xdf\x9c\x45\x4e\xf7\xc0\xa4\x96\xad\x16\xee\x48\xec\x2f\x13\xbb\x6f\xf2\xb7\xd1\xc6\x44\xdd\x9d\x93\xbf\x0f\xc6\x50\x77\x07\xcd\x01\xd9\x0d\x45\xe7\xd9\x86\x80\x2d\x2d\x7f\xab\xa6\x1d\xbb\xa8\xe8\x0e\x39\x76\x6e\x70\x9f\xf3\xca\xdc\x1f\x65\x36\xfb\xcf\x65\xee\x39\xab\xfe\xf5\xb4\x1e\xca\xbd\x9a\x5f\x9c\xf8\x82\x7f\x8f\x66\x1f\xa2\xf7\x08\xc7\x9c\x29\x0c\xdf\x87\xcf\x27\xf6\x81\xf2\x1e\x4d\xbb\x31\xf7\x95\xfb\x3c\xe4\x74\x37\x16\x76\xd2\xe9\xae\x25\x86\xf7\xb2\xbc\xfe\x39\x9b\x7d\xd6\xe4\xb5\xf6\xaf\xd9\xec\x05\xe5\xf5\x3c\xe1\x74\xa7\x97\xeb\xcd\xb0\xee\xc8\x37\x95\x2f\x8c\x3e\xad\x7d\x61\x74\xb4\xee\x0b\x99\x69\x5f\x30\x26\x7d\x61\xf4\x40\xdd\x17\x4c\x27\x7d\x61\xf4\xf1\xba\x2f\x98\x4e\xfa\x82\xe9\xa4\x2f\x18\x93\xbe\x60\x4c\xfa\x82\x31\xe9\x0b\xc6\xa4\x2f\x18\x93\xbe\x60\x4c\xfa\x42\x66\xda\x17\xf2\xdc\xb5\x2f\x18\x93\xbe\x60\x63\x4a\x5f\x18\xfd\x6a\xdd\x17\x6c\x4c\xe9\x0b\xa6\x93\xbe\x60\x3a\xe9\x0b\x76\x2f\xd2\x17\x4c\x27\x7d\xc1\x74\xd2\x17\x4c\x27\x7d\x21\xeb\x2a\xbe\x70\x77\xc5\x17\x0e\x04\xbe\x70\x20\xf0\x85\x03\x81\x2f\xbc\x3d\xf0\x85\x03\x81\x2f\xdc\x1a\xf8\xc2\x81\xc0\x17\x6e\x0d\x7c\xe1\xd6\xc0\x17\x6e\x0d\x7c\xe1\xd6\xc0\x17\x6e\x0d\x7c\xe1\xd6\xc0\x17\x6e\x0d\x7c\xe1\x56\xe9\x0b\xb7\x26\x5f\xb8\x03\x6a\x81\x7d\xe1\x40\xe0\x0b\xb7\x06\xbe\xf0\xa6\xc0\x17\x0e\x04\xbe\xf0\xa6\xc0\x17\x0e\x04\xbe\x70\x6b\xe0\x0b\x07\x02\x5f\xb8\x35\xf0\x85\x03\x81\x2f\xdc\x1a\xf8\xc2\xeb\x2b\xbe\xb0\x2e\xf0\x85\x75\x81\x2f\xac\x0b\x7c\x61\x53\xe0\x0b\xeb\x02\x5f\xb8\x32\xf0\x85\x75\x81\x2f\x5c\x19\xf8\xc2\x95\x81\x2f\x5c\x19\xf8\xc2\x95\x81\x2f\x5c\x19\xf8\xc2\x95\x81\x2f\x5c\x19\xf8\xc2\x95\x81\x2f\xac\x0b\x7c\x61\x5d\xe0\x0b\x57\x06\xbe\x70\x79\xe0\x0b\xeb\x02\x5f\xb8\x3c\xf0\x85\x75\x81\x2f\x5c\x19\xf8\xc2\xba\xc0\x17\xae\x0c\x7c\x61\x5d\xe0\x0b\x57\x82\x2f\xe4\xec\xff\x53\xe7\x2f\x3e\xfe\x81\x54\x0b\x97\xf6\xb2\xff\x3b\xe6\x2f\x3e\x7e\x30\x69\x7e\x34\xd5\xc2\x59\x75\x76\xf4\x7f\x8c\xad\x16\xec\x6b\xc6\x36\x23\x4b\xa7\x30\x0c\x46\x67\x1b\x9b\x16\xba\x4f\x1a\xbb\xd4\xd8\x6d\x89\xe5\xdf\x22\xfd\x4d\x63\x3b\x84\xee\x7d\x74\x3d\xd4\xdd\x46\x73\x40\xb6\x25\xd0\xad\x33\x76\x9b\x60\x2f\x32\xb6\x49\xb0\x0b\x83\x31\x17\x06\xec\xd4\xfa\xdc\x67\xbf\x51\x9f\xfb\xec\xa3\xc6\xb6\x0b\xf6\x7b\xc6\xc6\xb5\xc0\x63\x1e\x2e\x0c\x75\xf9\x77\x1b\xef\xae\xbf\x47\xb3\x7b\xe9\x3e\x51\xb7\x4d\xb2\xac\xbb\x26\x98\xdf\x15\xf5\xcf\xd9\xec\x25\xf5\xd7\x7a\xf6\x7c\xf5\x39\x33\xdd\xa0\x7e\x2f\x47\x72\x4f\x70\x97\xaf\xbe\x3b\x7d\x32\xbf\xc7\x65\xff\xf7\x8f\x35\xc3\xfc\x8b\xf4\xf3\xeb\xec\xe8\x77\x8c\xad\x16\xec\xab\xc6\x26\xcf\x54\xdf\x99\xee\x23\x3f\x2f\xf9\x7c\xa0\xfb\x5d\x63\x93\xe7\x60\xe9\xbb\xc0\x30\x9d\x14\x71\xf4\x5e\x63\x3b\x84\xee\xbd\xc6\x36\x0b\xdd\x6e\x9a\x03\xb2\xd7\x07\xba\xb5\x01\x5b\x62\x6c\x93\x60\xcf\x30\xb6\x5d\xb0\x73\x82\x31\x4f\xa9\xcf\x7d\xf6\x1f\xeb\x73\x9f\x7d\x84\xae\x87\xec\x41\x63\x4b\xc4\x98\x1f\x27\x96\x75\xe9\xbc\x98\xd9\xbb\x8c\x4d\x8b\x31\xf7\xd0\x7d\xa2\x6e\xab\x64\x59\xb7\x31\x98\xdf\xb2\xfa\xe7\x6c\xf6\xe2\xfa\x6b\x3d\x7b\x1e\xbd\x9e\xa8\x9b\xaa\x5f\xef\x48\x7e\x46\xdd\x65\xff\xef\x1c\xff\xeb\xf0\x51\xd7\x8f\xf4\x96\xa4\xf9\x14\xd4\x82\x64\x56\x0b\x5d\x3f\x12\xb2\xaf\xda\xb5\x26\xdf\x91\x7e\x31\xb1\x3f\x81\x5a\x18\xeb\x16\x39\xdd\xef\x1a\x9b\x7c\x47\xda\x99\xd8\x08\x6a\x61\x47\xf9\x8e\x84\xba\xf7\x1a\x9b\x7c\xf7\x40\xdd\x6e\x9a\x03\xb2\xd7\x17\x9d\x67\x6b\x03\xb6\xc4\xd8\xe4\x3b\x12\xb2\x67\x18\xdb\x6e\xdf\x21\x90\x9d\x13\xdc\xe7\x29\x65\xee\x8f\x32\xb3\x5a\xe8\xfa\x91\x60\xee\x56\x0b\x5d\x3f\x12\xb2\x07\x8d\x2d\xf1\xf7\x69\xb5\xb0\xa3\xac\x17\xb2\x6e\x06\x6a\xa1\xeb\x47\xc2\x31\xf7\x94\xfb\x3c\xe4\x74\x5b\x27\xcc\x7a\x8e\x50\xb7\x91\x18\xde\xcb\xb2\xfa\xe7\xcc\x6a\xa1\xeb\x47\x42\xdd\x79\xe5\xf5\x3c\xe1\x74\x53\xe5\x3e\x1f\x63\x9d\xd5\x42\x97\xaf\x4e\xbe\x30\xfc\x0d\x97\xfd\xcf\xb5\xf5\x9e\xbe\x2f\x78\x06\xbe\xb0\xc1\xb1\xe2\x0b\x76\xff\xc9\x17\x86\xbf\x4c\xbe\xb0\xc8\xe9\x8a\x2f\x58\x2d\xe4\x5a\x3e\xd8\xf7\x05\x1b\x13\x75\xc5\x17\x8c\xa1\x6e\x37\xcd\x01\x59\xf1\x05\xc1\xd6\x06\xac\xf3\x85\x69\xc7\x8a\x2f\xd8\x67\x05\xd9\x39\xc1\x7d\x16\x5f\xb0\x5a\x00\xd6\xf9\x82\x7f\x1f\x3a\x5f\x10\xac\xf3\x05\x77\x9f\xe0\x0b\xf8\x3e\xec\x26\x5f\x98\x76\x63\x16\x5f\xb0\xf9\xa1\xae\xf3\x85\x33\x9d\x6e\x23\x31\xbc\x97\x65\xf5\xcf\x59\xe7\x0b\xfe\x35\xeb\x7c\xc1\x6a\x01\x75\xc5\x17\xac\x16\x40\x67\xb5\x90\xb3\xff\x65\xbd\x30\x7c\x73\xaf\x67\xbb\x7c\xaf\x1a\xbe\x82\xd6\x0b\x8e\xc1\x7a\xc1\xb3\xaf\x95\xef\xda\x99\xbd\x3b\xb1\x2d\x89\xfd\x59\xf9\x2e\xea\x75\xdd\x7a\x61\x43\xf7\xdd\x70\xb8\x9e\xd6\x0b\x5e\xd7\xad\x17\xbc\xee\x36\x9a\x03\xb2\x2d\x81\x6e\x1d\xcd\x01\x59\xb7\x5e\xf0\xec\xc2\x60\xcc\x85\x01\x3b\xb5\x3e\x77\x58\x2f\xb8\xb9\xc3\x7a\xc1\x33\xb9\x5e\xb0\x31\xbb\xf5\x02\xea\x56\xd1\x7a\xc1\x8f\xb9\x97\xee\x13\x75\xdb\x24\x7b\x05\xad\x17\xfc\xfc\xae\xa8\x7f\xce\x60\xbd\xe0\x75\xe7\xd3\xeb\x89\xba\x41\xfd\x7a\xb6\x5e\x28\xd7\x1b\xa6\x5f\xfd\x3b\xfe\x4b\xae\x16\x0e\x24\xcd\x65\xb2\x16\x80\xb9\x5a\x40\xf6\x35\xba\xc7\xcc\x7c\xf6\x9f\x75\x5c\x0b\xbb\x13\x7b\xb2\xac\x05\xd4\x71\x2d\xa0\x8e\x6b\x01\x19\xd7\x02\x32\xae\x05\x64\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x00\xe6\x6a\x01\xe6\xee\x6a\x01\x19\xd7\x02\x8e\xc9\xb5\x90\x75\xcf\x90\xb5\x80\x63\x72\x2d\x20\xe3\x5a\x40\xc6\xb5\x90\xef\xe5\x59\xb2\x16\x50\xc7\xb5\x80\x73\xe0\x5a\x40\x1d\xd7\x02\x5c\xef\xc8\xbf\xd0\x77\xb2\xbb\x92\x2f\x5c\xe0\xd6\x0b\xfb\x92\x26\xf5\x7b\xb4\x67\xd6\xd9\xd1\x6f\xd3\x7a\x01\xd9\xdf\x19\x9b\x7c\x47\x7a\x47\x62\xe9\x77\x06\x8f\x7e\xb6\x7c\x17\x5d\xe4\x74\x73\xb4\x5e\xd8\x35\x66\xed\x7f\x25\xf6\x51\x5a\x2f\xa0\xee\xdd\xf4\x3d\x1c\x75\xbb\x68\x0e\xc8\x36\xd3\x9a\x00\xd9\x4b\x03\xf6\x82\xc9\x98\xf6\x1d\x02\xd9\xd3\x68\xbd\x80\xec\xec\x32\xe6\x0c\xb3\xd9\xef\xd2\x7a\x01\xd9\xd7\x69\xbd\x00\x73\x9f\xfd\x73\x5a\x2f\x20\x3b\x51\xde\x23\x77\x9f\xb3\x1f\xa3\xf5\x42\xd6\x9d\x92\xd8\xfb\xcb\x77\xfb\x69\x37\xe6\xed\xb4\x5e\x40\xdd\x1b\x0a\x3b\xe9\x74\xeb\xcb\xdc\x4f\x76\xf7\x32\x4c\x67\x72\xcc\x5e\x5e\xff\x9c\xcd\x3e\x93\xd6\x0b\x38\x87\x45\xb4\x5e\x40\xdd\x69\xb4\x5e\x80\xeb\x1d\xf9\x27\xba\xde\xfb\xd3\xa7\xfd\x9b\xae\x16\xf6\xa6\x6b\x7d\x45\xd6\x02\x30\x57\x0b\xc8\xb8\x16\xde\x9e\xd8\x3f\xca\x5a\x40\x1d\xd7\xc2\x2f\x24\xf6\x19\x59\x0b\xa8\xe3\x5a\x40\x1d\xd7\x02\x32\xae\x05\x64\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x00\xe6\x6a\x01\x19\xd7\x02\xcc\xdd\xd5\x02\x32\xae\x05\x1c\x93\x6b\x21\xeb\x1e\x91\xb5\x80\x63\x72\x2d\xa0\x8e\x6b\x01\x75\x5c\x0b\xf9\x5e\xfe\x4a\xd6\x02\xea\xb8\x16\x70\x0e\x5c\x0b\xa8\xe3\x5a\x80\xeb\xb9\x5a\x48\xbe\xd0\xfe\x81\xf6\x85\xf6\x58\xa2\x3f\x50\x67\x47\xff\x5b\xf9\x82\xb1\xbf\x57\xbe\xd0\xa6\x5f\xde\x38\xfa\x39\xe5\x0b\xa6\x3b\x2e\x7d\xe1\x37\x12\xbb\x47\xf9\x82\xe9\xde\x23\x7d\x21\xeb\x6e\x95\xbe\x90\xd9\xeb\xe4\xdf\xfe\xcc\xd6\x04\xec\x85\xa5\x16\x96\x38\xf6\x74\xe9\x0b\x99\x2d\x90\xbe\x90\x59\x23\x7d\x21\xb1\xd9\x7f\x50\xbe\x90\xe7\x3e\xfb\x05\xe5\x0b\xc6\x1e\x90\xbe\x90\xc7\xbc\x4f\xf9\x42\x9b\x7b\x1b\xee\x54\xbe\x60\x63\xde\xa1\x7c\xc1\x74\x37\x28\x5f\x30\xdd\x06\x62\xf9\x5e\x7e\x27\xb1\xa5\xf5\xcf\xd9\xec\x45\xd2\x17\xf2\x1c\xce\x55\xbe\x60\xba\x79\xe5\x7a\x33\x7c\xbd\x23\xff\x4c\xdf\xad\x52\x12\xbf\xfd\x15\xbd\x5e\x68\xdf\x55\x5f\x2f\x64\xa6\xd7\x0b\xc6\x78\xed\xfc\xae\xc4\x52\xf5\xb9\xb5\x33\xea\xe4\x7a\xa1\xdd\x59\x5f\x2f\x98\x4e\xae\x17\x4c\x27\xd7\x0b\xc6\xe4\x7a\xc1\x98\x5c\x2f\x18\x93\xeb\x05\x63\x72\xbd\x60\x4c\xae\x17\x8c\xc9\xf5\x42\x66\x7a\xbd\x90\xe7\xae\xd7\x0b\xc6\xe4\x7a\xc1\xc6\x94\xeb\x85\x76\x4f\x7d\xbd\x60\x63\xca\xf5\x82\xe9\xe4\x7a\xc1\x74\x72\xbd\xd0\xbe\xb5\xbe\x5e\x30\x9d\x5c\x2f\xd8\x1c\xe4\x7a\xc1\x74\x72\xbd\x90\xaf\x37\x59\x3b\xf7\x9f\x23\xb5\x3f\xa7\x9f\x23\xb5\x9b\x65\x2d\x00\xd3\xcf\x91\x8c\xf1\xda\x19\x19\xaf\x9d\x91\xc9\xe7\x48\xed\x4b\x65\x2d\xa0\x8e\x6a\xe1\xe8\x4d\x63\x96\xd4\x83\xf6\xa5\x34\x07\x1c\x53\x3e\x47\x32\x26\x9f\x23\x19\x93\xcf\x91\x8c\xc9\xe7\x48\xc6\xe4\x73\x24\x63\xf2\x39\x52\x66\xfa\x39\x52\x9e\xbb\x7e\x8e\x64\x4c\x3e\x47\xb2\x31\xe5\x73\xa4\xf6\x1a\x59\x0b\x38\xa6\x7c\x8e\x64\xec\x15\x01\x93\xcf\x91\xda\x57\xc8\x5a\x40\x9d\x7c\x8e\x64\x73\x90\xcf\x91\x4c\x27\x9f\x23\xe5\xeb\xb9\xb5\x73\xda\x5f\x68\xaf\x74\xdf\x91\xd2\x33\xda\xf6\x85\x8d\xda\x6b\x03\xe6\xf6\xda\x90\x7d\x95\xbe\x23\xa5\xfd\x85\xf6\xc5\x8d\xda\x6b\x43\x1d\xef\xb5\xa5\x67\xc2\xed\xd3\x1b\xb5\xd7\x86\x3a\xde\x6b\x43\x1d\xef\xb5\x21\xe3\xbd\x36\x64\xbc\xd7\x86\x8c\xf7\xda\x90\xf1\x5e\x1b\x32\xde\x6b\x43\xc6\x7b\x6d\xc0\xdc\x5e\x1b\xcc\xdd\xed\xb5\x21\xe3\xbd\x36\x1c\x93\xf7\xda\xb2\xee\xc7\x1a\xb5\xd7\x86\x63\xf2\x5e\x1b\xea\x78\xaf\x0d\x75\xbc\xd7\x96\xef\x25\x9d\x32\xee\xf6\xda\x50\xc7\x7b\x6d\x38\x07\xde\x6b\x43\x1d\xef\xb5\xc1\xf5\x8e\x4c\xb2\x51\x93\xec\xff\x53\x1a\xca\x3b\xdb\x7d\xa4\x6c\x90\x9d\xfb\xcf\x7d\xaa\xc8\xb8\x4f\x15\x98\xeb\x53\x4d\xb9\xb6\x74\xfa\xbf\xef\x53\x45\x1d\xf7\xa9\xa6\x2c\x92\x9d\x99\xcf\x7d\xaa\xa8\xe3\x3e\x55\xd4\x71\x9f\x2a\x32\xee\x53\x45\xc6\x7d\xaa\xc8\xb8\x4f\x15\x19\xf7\xa9\x22\xe3\x3e\x55\x64\xdc\xa7\x0a\x8c\xfb\x54\x73\x3f\xe6\xec\x17\xd3\xfb\xf0\x83\xc6\xb6\xfb\xf7\xc8\xf5\xa9\xe2\x98\xdc\xa7\x9a\x75\xf9\xfc\x7e\xee\x53\xc5\x31\xb9\x4f\x15\x75\xdc\xa7\x8a\x3a\xee\x53\xdd\x03\x8c\xfb\x54\x51\xc7\x7d\xaa\x38\x07\xee\x53\x45\x1d\xf7\xa9\xc2\xf5\xac\x4f\xb5\xcb\xd1\xdd\x32\xfe\xd7\x63\x97\xb9\xec\xff\xd8\x61\x6a\xd9\x7f\x64\x9c\xfd\x07\xc6\x19\xcf\x63\xcf\x4d\xdf\x59\x6e\x4c\xac\xcb\x78\x7a\x1d\x67\xff\xaf\x6f\xea\xd9\x7f\xd4\x51\xf6\xdf\x74\x99\x71\xf6\x1f\xc7\xe4\xec\x3f\x32\xce\xfe\x23\xe3\xec\x3f\x32\xce\xfe\x23\xe3\xec\x3f\x32\xce\xfe\x03\xe3\xec\xbf\xfd\xb6\xc1\xf5\x89\x51\xf6\xbf\xc7\x38\xfb\x8f\x63\x72\xc6\x33\xbf\x9e\x3a\xfb\x0f\xaf\x35\x64\x3c\x91\x5d\x94\x18\x67\xff\x51\xc7\xd9\x7f\x78\x8f\x5c\xf6\x1f\x75\x9c\xfd\xc7\x39\x70\xf6\x1f\x75\x9c\xfd\x87\xeb\x71\xc6\xf3\x58\x72\x99\xe3\x3b\x5c\xcf\xf6\xcf\x36\xf5\xec\x3f\x30\xd7\xb3\x8d\x8c\x7b\xb6\xb7\x25\x96\x7b\x4a\xb9\x67\x1b\x75\xdc\xb3\x7d\x5d\x53\xcf\xfe\xa3\x8e\x7b\xb6\x51\xc7\x3d\xdb\xc8\xb8\x67\x1b\x19\xf7\x6c\x23\xe3\x9e\x6d\x64\xdc\xb3\x8d\x8c\x7b\xb6\x91\x71\xcf\x36\x30\xd7\xb3\x0d\x73\x77\x3d\xdb\xc8\xb8\x67\x1b\xc7\xe4\x9e\xed\xac\xd3\xd9\x7f\x1c\x93\x7b\xb6\x51\xc7\x3d\xdb\xa8\xe3\x9e\xed\xeb\x9a\x7a\xf6\x1f\x75\xdc\xb3\x8d\x73\xe0\x9e\x6d\xd4\x71\xcf\x36\x5c\xcf\x65\xff\xb3\x2f\xf8\xec\x7f\xae\x2d\x9d\xfd\x47\xc6\xd9\x7f\x60\x2e\xfb\x7f\x63\x53\xcf\xfe\xa3\x8e\xb3\xff\xb9\x96\x75\xf6\x1f\x75\x9c\xfd\x47\x1d\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x81\xb9\xec\x3f\xcc\xdd\x65\xff\x91\x71\xf6\x1f\xc7\xd4\xbe\xa0\xb3\xff\x38\x26\x67\xff\x51\xc7\xd9\x7f\xd4\x71\xf6\xff\xfa\xa6\x9e\xfd\x47\x1d\x67\xff\x71\x0e\x9c\xfd\x47\x1d\x67\xff\xe1\x7a\x2e\xfb\xbf\xa3\xd1\xd9\xff\x5c\x5b\x3a\xfb\x0f\xac\xe2\x0b\x3a\xfb\x9f\x7d\x41\x67\xff\x51\xa7\x7d\x41\x67\xff\x51\xa7\x7d\x41\x67\xff\x91\x69\x5f\xd0\xd9\x7f\x64\xda\x17\x74\xf6\x1f\x99\xf6\x05\x9d\xfd\x07\x56\xf1\x05\x9d\xfd\x47\xa6\x7d\x41\x67\xff\xb3\x4e\x67\xff\x71\x4c\xed\x0b\x3a\xfb\x8f\x3a\xed\x0b\x3a\xfb\x8f\x3a\xed\x0b\x3a\xfb\x8f\x3a\xed\x0b\x98\xfd\xef\xae\x77\x73\x83\xd9\xff\xee\xdf\x5f\x3b\xd6\x8c\xf2\xbe\xf3\x82\x80\x35\xf4\x3a\x03\xb3\xb5\x73\x57\x0b\x99\x61\xf6\xbf\xab\x05\xd4\x3d\x40\xb5\xf0\xf2\xc4\xbe\xd4\x74\x6b\xe7\xae\x16\x50\x77\x27\x7d\xc6\x50\x77\x07\xcd\x01\xd9\x0d\xf4\x79\x47\xb6\x21\x60\x4b\xa9\x16\x90\x5d\x44\xb5\x80\xec\xdc\xe0\x3e\xe7\x51\x2d\x00\xb3\xb5\x73\x57\x0b\x30\x77\xcb\xfe\x77\xb5\x80\xec\x21\x7a\x8f\x70\xcc\x99\xc2\xf0\x7d\xf8\x6c\xd3\xad\x9d\xbb\x5a\xc0\x31\xf7\x51\x2d\xa0\xee\x46\xfa\xbc\xa3\xee\x5a\x62\x78\x2f\xcb\xeb\x9f\x33\x5b\x3b\x77\xb5\x80\xba\x0b\xa8\x16\x50\x77\x7a\xb9\xde\x0c\xeb\x5c\xc6\x33\xf9\x82\xc8\xfe\xa7\xda\x1a\x1d\xa9\xfb\x42\x66\xda\x17\x8c\x49\x5f\x18\x7d\xb2\xee\x0b\xa6\x93\xbe\x30\xfa\x58\xdd\x17\x4c\x27\x7d\xc1\x74\xd2\x17\x8c\x49\x5f\x30\x26\x7d\xc1\x98\xf4\x05\x63\xd2\x17\x8c\x49\x5f\x30\x26\x7d\x21\x33\xed\x0b\x79\xee\xda\x17\x8c\x49\x5f\xb0\x31\xa5\x2f\x8c\x3e\x5c\xf7\x05\x1b\x53\xfa\x82\xe9\xa4\x2f\x98\x4e\xfa\x82\xdd\x8b\xf4\x05\xd3\x49\x5f\x30\x9d\xf4\x05\xd3\x49\x5f\xc8\xba\x8a\x2f\xdc\x59\xf1\x85\x7d\x81\x2f\xec\x0b\x7c\x61\x9f\xf4\x85\xed\x89\xbd\x23\xf0\x85\x7d\x81\x2f\xec\x0c\x7c\x61\x5f\xe0\x0b\x3b\x03\x5f\xd8\x19\xf8\xc2\xce\xc0\x17\x76\x06\xbe\xb0\x33\xf0\x85\x9d\x81\x2f\xec\x0c\x7c\x61\x67\xe0\x0b\xfb\x02\x5f\xd8\x17\xf8\xc2\xce\xc0\x17\x6e\x0a\x7c\x61\x5f\xe0\x0b\x37\x05\xbe\xb0\x2f\xf0\x85\x9d\x81\x2f\xec\x0b\x7c\x61\x67\xe0\x0b\xfb\x02\x5f\xd8\x19\xf8\xc2\xe6\x8a\x2f\xac\x09\x7c\x61\x4d\xe0\x0b\x6b\x02\x5f\x78\x79\xe0\x0b\x6b\x02\x5f\x58\x11\xf8\xc2\x9a\xc0\x17\x56\x04\xbe\xb0\x22\xf0\x85\x15\x81\x2f\xac\x08\x7c\x61\x45\xe0\x0b\x2b\x02\x5f\x58\x11\xf8\xc2\x8a\xc0\x17\xd6\x04\xbe\xb0\x26\xf0\x85\x15\x81\x2f\x2c\x09\x7c\x61\x4d\xe0\x0b\x4b\x02\x5f\x58\x13\xf8\xc2\x8a\xc0\x17\xd6\x04\xbe\xb0\x22\xf0\x85\x35\x81\x2f\xac\x68\x28\xfb\x9f\xce\x5f\xf8\xf9\xc6\x67\xff\xa7\xe7\x2f\x3e\xfe\x9a\xa4\x49\x67\xc3\xf5\xb2\xff\xc4\x7a\xd9\x7f\x66\x5d\x3f\x52\x66\x5b\x13\x4b\xcf\xae\xa1\x1f\xc9\xeb\x30\xfb\x3f\x66\xd7\x26\x96\xf6\x71\x7a\xd9\x7f\xd6\x61\xf6\x7f\x7a\xfe\xe2\xa3\x69\xbf\x3d\xa9\x07\xa3\x27\xd0\x1c\x70\xcc\x2d\x7d\x5d\x8f\xad\xa3\x39\x20\xc3\xec\x3f\xb3\x0b\x83\x31\x17\x06\xec\xd4\xfa\xdc\x7b\xd9\x7f\x9a\x7b\x2f\xfb\xcf\x0c\x7b\x30\x78\x4c\xcc\xfe\x77\xba\xb3\x12\xbb\xbb\xfe\x1e\xf5\xb2\xff\xcc\xb6\x05\xec\x9a\x60\x7e\x57\xd4\x3f\x67\xbd\xec\x3f\xeb\xce\xa7\xd7\x13\x75\x83\xfa\xf5\x5c\xf6\xff\xcd\xe9\x93\x72\x86\xcb\xfe\xbf\x6a\xac\x19\xfe\x5b\xa3\xb2\xff\xc0\x5c\xf6\x1f\x19\x67\xff\xdf\x90\xd8\x77\x13\xe3\xec\x3f\xea\x38\xfb\x7f\x4d\x62\xff\x90\x18\x67\xff\x51\xc7\xd9\x7f\xd4\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x98\xcb\xfe\xc3\xdc\x5d\xf6\x1f\x19\x67\xff\x71\x4c\xce\xfe\x67\xdd\x97\x13\xe3\xec\x3f\x8e\xc9\xd9\x7f\xd4\x71\xf6\x1f\x75\x9c\xfd\xc7\x7b\xe1\xec\x3f\xea\x38\xfb\x8f\x3a\xce\xfe\xa3\x8e\xb3\xff\xa0\x73\xd9\xff\x37\x8e\xff\x75\xf8\x88\xeb\x47\x7a\x45\xd2\xfc\x5e\xa3\xfa\x91\x80\xb9\x7e\x24\x64\xdc\x8f\xf4\xfa\xc4\xfe\x18\x6a\xa1\xeb\x47\x42\x1d\xf7\x23\x6d\x48\x6c\x08\xb5\xd0\xf5\x23\xa1\x8e\xfb\x91\x50\xc7\xfd\x48\xc8\xb8\x1f\x09\x19\xf7\x23\x21\xe3\x7e\x24\x64\xdc\x8f\x84\x8c\xfb\x91\x90\x71\x3f\x12\x30\xd7\x8f\x04\x73\x77\xfd\x48\xc8\xb8\x1f\x09\xc7\xe4\x7e\xa4\xac\xfb\x04\xd4\x42\xd7\x8f\x84\x63\xbe\xa5\xdc\xe7\x21\xa7\xe3\x7e\x24\xd4\x71\x3f\x12\xde\x0b\xf7\x23\xa1\x8e\xfb\x91\x50\xc7\xfd\x48\xa8\xe3\x7e\x24\xd0\x71\xf6\x7f\x98\x3a\xc0\x8f\xbf\xc9\x65\xff\x73\x6d\xbd\xbb\x51\xd9\x7f\x60\x2e\xfb\x8f\x8c\xb2\xff\x29\xf5\xbf\xf8\x68\xfa\xcd\xcd\xe3\x5b\x8a\x6e\x91\xd3\x71\xf6\x3f\xd7\xf2\x81\xbe\x2f\xd8\x6b\x82\x3a\xca\xfe\x1f\x4d\xbd\xea\x49\x3d\x18\x1e\xa0\x39\xe0\x98\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x60\x2e\xfb\x0f\x73\x77\xd9\x7f\x64\x9c\xfd\xc7\x31\x39\xfb\x9f\x75\xb7\x92\x2f\x4c\xbb\x31\x39\xfb\x8f\x3a\xce\xfe\xa3\x8e\xb3\xff\x78\x2f\x9c\xfd\x47\x1d\x67\xff\x51\xc7\xd9\x7f\xd4\x71\xf6\x1f\x74\x98\xfd\xef\xd6\x0b\xc3\x37\xb9\xf3\xda\xd2\x77\xae\xe1\xa6\x86\x7b\xb6\x89\xf5\x7a\xb6\x99\x61\x7e\xa1\xac\x17\x86\xaf\xa7\xf5\x82\xd7\x61\xcf\x76\xf9\x8e\x37\x5c\x47\xeb\x05\xaf\xc3\x9e\x6d\xd6\xdd\x46\x73\x40\xb6\x25\xd0\xad\xa3\x39\x20\xc3\x9e\x6d\x66\x17\x06\x63\x2e\x0c\xd8\xa9\xf5\xb9\xf7\x7a\xb6\x69\xee\xbd\x9e\x6d\x66\x72\xbd\x60\x63\x62\xcf\x76\xa7\xbb\x92\xd6\x0b\x7e\xcc\xbd\x74\x9f\xa8\xdb\x26\xd9\x26\x5a\x2f\xf8\xf9\x5d\x51\xff\x9c\xf5\x7a\xb6\x59\x77\x3e\xbd\x9e\xa8\x1b\xd4\xaf\xd7\xcb\xfe\x8f\xd9\xcf\xa5\x5a\x58\xe6\x6a\xe1\xd5\x49\x73\xa9\xac\x05\x60\xae\x16\x90\x71\x2d\xdc\x90\xd8\xf3\x65\x2d\xa0\x8e\x6b\xe1\x65\x89\xfd\x88\xac\x05\xd4\x71\x2d\xa0\x8e\x6b\x01\x19\xd7\x02\x32\xae\x05\x64\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x00\xe6\x6a\x01\xe6\xee\x6a\x01\x19\xd7\x02\x8e\xc9\xb5\x90\x75\x4f\x97\xb5\x80\x63\x52\x2d\xcc\xa6\x67\x84\xe9\xff\x18\x8c\xff\x8f\xde\x1c\x50\xc7\xb5\x90\xef\xe5\xc7\x64\x2d\xa0\x8e\x6b\x01\xe7\xc0\xb5\x80\x3a\xae\x05\xb8\x9e\xcb\x2f\xa4\x5f\x83\x1d\x3e\xc1\xad\x17\x5e\x99\x34\xdf\xdf\xa8\xbc\x33\x30\x97\x77\x46\xc6\x79\xe7\x2d\x89\xe5\xde\x21\xce\x3b\xa3\x8e\xf3\xce\x1b\xc7\xac\xfd\xcf\xc4\x38\xef\x8c\x3a\xce\x3b\xa3\x8e\xf3\xce\xc8\x38\xef\x8c\x8c\xf3\xce\xc8\x38\xef\x8c\x8c\xf3\xce\xc8\x38\xef\x0c\xcc\xe5\x9d\x91\x71\xde\x19\xe6\xee\xf2\xce\xc8\x38\xef\x8c\x63\x72\xde\x39\xeb\x72\x6f\x03\xe7\x9d\x71\x4c\xce\x3b\xa3\x8e\xf3\xce\xa8\xe3\xbc\x73\xba\x97\xe1\xe3\x12\xe3\xbc\x33\xea\x38\xef\x8c\x73\xe0\xbc\x33\xea\x38\xef\x0c\xd7\x73\x79\xe7\xb4\x3b\xd2\xfe\xab\xab\x85\x4d\xe9\x5a\x7f\x2b\x6b\x01\x98\xab\x05\x64\x5c\x0b\xaf\x4b\xec\x1f\x64\x2d\xa0\x8e\x6b\x61\x7d\x62\x7f\x2a\x6b\x01\x75\x5c\x0b\xa8\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x19\xd7\x02\x32\xae\x05\x64\x5c\x0b\xc0\x5c\x2d\x20\xe3\x5a\x80\xb9\xbb\x5a\x40\xc6\xb5\x80\x63\x72\x2d\x64\xdd\x17\x64\x2d\xe0\x98\x5c\x0b\xa8\xe3\x5a\x40\x1d\xd7\x42\xbe\x97\xbf\x94\xb5\x80\x3a\xae\x05\x9c\x03\xd7\x02\xea\xb8\x16\xe0\x7a\x5c\x0b\xed\xef\x37\xb8\x76\xa6\x9a\x6c\xd3\x6f\xed\xb9\xec\x3f\x30\x97\xfd\x47\xc6\xd9\xff\xe4\x0b\x6d\x3e\x7f\x81\xb3\xff\xa8\xe3\xec\x7f\xfe\x1b\xf0\xeb\x89\x71\xf6\x1f\x75\x9c\xfd\x47\x1d\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x81\xb9\xec\x3f\xcc\xdd\x65\xff\x91\x71\xf6\x1f\xc7\xe4\xec\x7f\xd6\xdd\x97\x18\x67\xff\x71\x4c\xce\xfe\xa3\x8e\xb3\xff\xa8\xe3\xec\x7f\xbe\x97\xdf\x4e\x8c\xb3\xff\xa8\xe3\xec\x3f\xce\x81\xb3\xff\xa8\xe3\xec\x3f\x5c\xaf\x97\xfd\x2f\xeb\x85\xf6\x43\x7a\xbd\xd0\xbe\xb3\xbe\x5e\xc8\x4c\xaf\x17\x8c\xc9\xf5\x42\x7b\x67\x7d\xbd\x60\x3a\xb9\x5e\x68\x7f\xa1\xbe\x5e\x30\x9d\x5c\x2f\x98\x4e\xae\x17\x8c\xc9\xf5\x82\x31\xb9\x5e\x30\x26\xd7\x0b\xc6\xe4\x7a\xc1\x98\x5c\x2f\x18\x93\xeb\x85\xcc\xf4\x7a\x21\xcf\x5d\xaf\x17\x8c\xc9\xf5\x82\x8d\x29\xd7\x0b\xed\x1d\xf5\xf5\x82\x8d\xc9\x6b\x67\xd4\xf1\xda\x19\x75\x72\xbd\xd0\x1e\xac\xaf\x17\x4c\x27\xd7\x0b\x36\x07\xb9\x5e\x30\x9d\x5c\x2f\xe4\xeb\x61\xf6\x7f\xea\xab\xf3\x17\xb7\xa9\x16\x8e\xfb\x73\xff\xf3\xe7\xf6\xb5\xb2\x16\x5e\xd3\x31\xfd\x1c\xc9\x98\xac\x85\x71\x15\x9c\x39\x68\xb7\xd2\xeb\x8c\x3a\xf9\x1c\xa9\xbd\x5a\xd6\x42\x1e\xf3\x7d\x69\xcc\xd7\xf6\x5f\x93\xa4\xc8\xbb\xcf\x83\xe3\x2f\xa3\x39\xe0\x98\xf2\x39\x92\x31\xf9\x1c\xc9\x98\x7c\x8e\x64\x4c\x3e\x47\x32\x26\x9f\x23\x19\x93\xcf\x91\x32\xd3\xcf\x91\xf2\x6b\xa6\x9f\x23\x19\x93\xcf\x91\x6c\x4c\xf9\x1c\xa9\xdd\x28\x6b\x01\xc7\x94\xcf\x91\x4c\x27\x9f\x23\x99\x4e\x3e\x47\x6a\x37\xc9\x5a\x40\x9d\x7c\x8e\x64\x73\x90\xcf\x91\x4c\x27\x9f\x23\xe5\xeb\xb9\xb5\x73\xda\x77\x6e\x57\xba\xef\x48\xe9\x19\x6d\xfb\x82\x46\xed\xb5\x01\x73\x7b\x6d\xc8\x78\xaf\x2d\xed\x3b\xb7\x57\x34\x6a\xaf\x0d\x75\xbc\xd7\x96\x9e\x09\xb7\x4f\x6b\xd4\x5e\x1b\xea\x78\xaf\x0d\x75\xbc\xd7\x86\x8c\xf7\xda\x90\xf1\x5e\x1b\x32\xde\x6b\x43\xc6\x7b\x6d\xc8\x78\xaf\x0d\x19\xef\xb5\x01\x73\x7b\x6d\x30\x77\xb7\xd7\x86\x8c\xf7\xda\x70\x4c\xde\x6b\xcb\xba\x9c\xf1\xe4\xbd\x36\x1c\x93\xb3\xff\xa8\xe3\xbd\x36\xd4\xf1\x5e\x5b\xbe\x97\x9f\x68\xd4\x5e\x1b\xea\x78\xaf\x0d\xe7\xc0\x7b\x6d\xa8\xe3\xbd\x36\xb8\x9e\xed\x2f\xcc\x50\xf6\xff\x66\x97\xfd\x4f\xd9\xa0\x4a\xf6\x1f\x19\x67\xff\x81\xb9\xec\x7f\xca\xb5\x55\xb2\xff\xa8\xe3\xec\x7f\xca\x22\x55\xb2\xff\xa8\xe3\xec\x3f\xea\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x0f\xcc\x65\xff\x61\xee\xee\xec\x42\x64\x9c\xfd\xc7\x31\x39\xfb\x9f\x75\x3a\xfb\x8f\x63\x72\xf6\x1f\x75\x9c\xfd\x47\x1d\x67\xff\xaf\x07\xc6\xd9\x7f\xd4\x71\xf6\x1f\xe7\xc0\xd9\x7f\xd4\x71\xf6\x1f\xae\xd7\xf5\xa9\x5a\x7f\xc6\xda\xf1\xbf\x1e\xbb\xd4\x65\xff\x97\x8d\x35\xc7\xd2\x6f\xb0\xba\xec\x3f\x32\xce\xfe\x03\x73\x19\xcf\x55\x89\x3d\x27\x31\xce\xfe\xa3\x8e\xb3\xff\xcf\x4b\xec\xc2\xc4\x38\xfb\x8f\x3a\xce\xfe\xa3\x8e\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc0\xdc\xb9\xff\x30\x77\x77\xee\x3f\x32\xce\xfe\xe3\x98\xf7\xcb\xf7\xef\xe2\xc4\x38\xfb\x8f\x63\x52\xf6\x3f\x29\x16\xcf\xa6\xfd\x85\xe3\xcb\x68\x0e\xa8\xe3\xec\xff\xf3\x80\x71\xf6\x1f\x75\x9c\xfd\xc7\x39\x70\xf6\x1f\x75\x9c\xfd\x87\xeb\x41\xc6\xf3\x40\x9a\x43\x72\x99\xe3\x6b\x5c\xcf\xf6\xe5\x49\x93\xf6\x32\x5c\xcf\x36\x30\xd7\xb3\x8d\x8c\x7b\xb6\x57\x26\x96\x7b\x4a\xb9\x67\x1b\x75\xdc\xb3\x7d\x59\x62\xf9\x0c\x27\xee\xd9\x46\x1d\xf7\x6c\xa3\xee\xf6\xfe\xbc\x7b\xac\xeb\xd9\xf6\x6c\x7d\xc0\xb8\x67\x1b\x19\xf7\x6c\x23\xe3\x9e\x6d\x64\xdc\xb3\x0d\xcc\xf5\x6c\xc3\xdc\x5d\xcf\x36\x32\xee\xd9\xc6\x31\xb1\x67\x7b\x73\xd1\x3d\x29\x31\xee\xd9\xc6\x31\xb1\x67\x9b\x75\xdc\xb3\x8d\x3a\xee\xd9\xbe\x0c\x18\xf7\x6c\xa3\x8e\x7b\xb6\x71\x0e\xdc\xb3\x8d\x3a\xee\xd9\x86\xeb\xb9\xec\x7f\xda\x8d\x3e\x76\x9e\xcb\xfe\xe7\xda\x3a\xbb\x51\xd9\x7f\x64\x9c\xfd\x07\x56\xf1\x85\x85\xe4\x0b\x5e\xc7\xd9\xff\x5c\xcb\xdf\x4f\xbe\xe0\x75\x9c\xfd\x47\x1d\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x81\xb9\xec\x3f\xcc\xdd\x65\xff\x91\x71\xf6\x1f\xc7\xe4\xec\x7f\xd6\xfd\x00\xf9\x82\x1f\x93\xb3\xff\xa8\xe3\xec\x3f\xea\x38\xfb\xff\x3c\x60\x9c\xfd\x47\x1d\x67\xff\x71\x0e\x9c\xfd\x47\x1d\x67\xff\xe1\x7a\x2e\xfb\x9f\x12\x0f\xc7\xbe\xb7\xe2\x0b\x53\x81\x2f\x4c\x05\xbe\x30\x15\xf8\xc2\xe9\x81\x2f\x4c\xd5\x7d\x61\xf4\xdd\xc0\x17\xa6\xea\xbe\x60\x3a\xce\xf2\x20\xe3\x2c\x0f\x32\xce\xf2\x20\x93\xbe\x60\x4c\xfa\x82\x31\xe9\x0b\xc6\xa4\x2f\x64\x56\xf1\x85\xa9\xc0\x17\xa6\xea\xbe\x60\x63\x72\x96\x27\xeb\x4e\x0d\x7c\x61\xca\xf9\x02\xeb\xb4\x2f\x4c\x05\xbe\x30\x15\xf8\xc2\x54\xdd\x17\x6c\x0e\xda\x17\xa6\x02\x5f\x98\x6a\x54\xc6\x33\xad\x17\x46\xdf\x76\xb5\xb0\x34\x5d\xeb\xab\x8d\xca\x78\x22\xe3\x8c\x27\x30\x97\xf1\xbc\x72\xcc\x8e\xa6\xbd\xc9\xd1\xbf\x50\x2d\xa0\x8e\x33\x9e\x3f\x99\x58\xfa\x9d\x70\x97\xf1\x44\x1d\x65\x3c\xf3\xb9\xf8\x47\x53\x97\xc9\xf1\xa5\x34\x07\x1c\x93\x33\x9e\xc8\x38\xe3\x89\x8c\x33\x9e\xc8\x38\xe3\x89\x8c\x33\x9e\xc8\x38\xe3\x09\xcc\x65\x3c\x61\xee\x2e\xe3\x89\x8c\x33\x9e\x38\x26\x67\x3c\xb3\x2e\x3d\xf7\x76\x19\x4f\x1c\x93\x33\x9e\xa8\xe3\x8c\x27\xea\x38\xe3\x89\xf7\xc2\x19\x4f\xd4\x71\xc6\x13\x75\x9c\xf1\x44\x1d\x67\x3c\x41\xe7\x32\x9e\xc9\x17\x46\x7f\xa8\x7d\x61\xd4\xd6\x7d\x21\x33\xed\x0b\xc6\xa4\x2f\x8c\x1e\xac\xfb\x82\xe9\xb4\x2f\x1c\xae\xfb\x82\xe9\xb4\x2f\x1c\x0e\x7c\xe1\x70\xe0\x0b\x87\x03\x5f\x38\x1c\xf8\xc2\xe1\xc0\x17\x0e\x07\xbe\x70\x38\xf0\x85\xc3\x75\x5f\xc8\x73\xd7\xbe\x60\x4c\xfb\xc2\xe1\xba\x2f\x8c\x7e\xad\xee\x0b\x36\xa6\xf4\x05\xd3\x49\x5f\x30\x9d\xf4\x05\xbb\x17\xe9\x0b\xa6\xd3\xbe\x70\xb8\xee\x0b\xa6\x93\xbe\x90\x75\x15\x5f\xf8\xa5\x8a\x2f\x1c\x0c\x7c\xe1\x60\xe0\x0b\x07\xeb\xbe\x30\xca\x7b\xc4\x9c\xfd\x47\x9d\xf6\x85\xdd\x81\x2f\x1c\x54\xbe\xd0\xd3\x71\xf6\x1f\x99\xf6\x85\xdd\x81\x2f\xec\x0e\x7c\x61\x77\xe0\x0b\xbb\x03\x5f\xd8\x1d\xf8\xc2\xee\xc0\x17\x0e\x06\xbe\x70\x30\xf0\x85\xdd\x81\x2f\xbc\x39\xf0\x85\x83\x81\x2f\xbc\x39\xf0\x85\x83\x81\x2f\xec\x0e\x7c\xe1\x60\xe0\x0b\xbb\x03\x5f\x38\x18\xf8\xc2\xee\xc0\x17\xb6\x54\x7c\x61\x7d\xe0\x0b\xeb\x03\x5f\x58\x1f\xf8\xc2\x2b\x02\x5f\x58\x1f\xf8\xc2\xaa\xc0\x17\xd6\x07\xbe\xb0\x2a\xf0\x85\x55\x81\x2f\xac\x0a\x7c\x61\x55\xe0\x0b\xab\x02\x5f\x58\x15\xf8\xc2\xaa\xc0\x17\x56\x05\xbe\xb0\x3e\xf0\x85\xf5\x81\x2f\xac\x0a\x7c\x61\x69\xe0\x0b\xeb\x03\x5f\x58\x1a\xf8\xc2\xfa\xc0\x17\x56\x05\xbe\xb0\x3e\xf0\x85\x55\x81\x2f\xac\x0f\x7c\x61\x55\xa3\xb2\xff\xe9\x17\xec\x47\x97\xf5\xb2\xff\xab\xe7\x2f\x3e\xfe\xa2\xa6\x91\xd9\x7f\x62\xbd\xec\x3f\x33\xcc\xfe\x8f\xd9\x8a\xc4\x7c\xf6\x9f\x75\x9c\xfd\xbf\xb4\x69\x64\xf6\x9f\x75\x94\xfd\xef\xe9\xf0\xdc\x7f\x66\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x0b\x03\xc6\xd9\x7f\x60\xbd\xec\x3f\xcd\xbd\x97\xfd\x67\xc6\x3d\x18\x38\x26\x66\xff\x3b\x9d\xcf\xfe\xf3\x98\x98\xfd\x67\xdd\x36\xc9\x74\xf6\x1f\xef\xe5\x8a\xfa\xe7\xcc\x65\xff\x51\x87\xd9\x7f\xd6\x71\xf6\x1f\x74\x2e\xfb\x7f\x55\xa3\xb3\xff\x2f\x6c\x9a\x6a\xf6\x1f\x98\xcb\xfe\x23\xe3\xec\xff\x74\x62\x3a\xfb\x8f\x3a\xce\xfe\xa7\xdf\xe7\xae\x64\xff\x51\xc7\xd9\x7f\xd4\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x98\xcb\xfe\xc3\xdc\x5d\xf6\x1f\x19\x67\xff\x71\x4c\xce\xfe\x67\x9d\xce\xfe\xe3\x98\x9c\xfd\x47\x1d\x67\xff\x51\xc7\xd9\x7f\xbc\x17\xce\xfe\xa3\x8e\xb3\xff\xa8\xe3\xec\x3f\xea\x38\xfb\x0f\x3a\x97\xfd\xff\x99\x46\x67\xff\x9f\xdf\x34\xd5\xec\x3f\x30\xd7\x8f\x84\x8c\xfb\x91\x5e\x9c\x98\xce\xfe\xa3\x8e\xfb\x91\x7e\xbc\x69\xaa\xd9\x7f\xd4\x71\x3f\x12\xea\xb8\x1f\x09\x19\xf7\x23\x21\xe3\x7e\x24\x64\xdc\x8f\x84\x8c\xfb\x91\x90\x71\x3f\x12\x32\xee\x47\x02\xe6\xfa\x91\x60\xee\xae\x1f\x09\x19\xf7\x23\xe1\x98\xdc\x8f\x94\x75\x3a\xfb\x8f\x63\x72\x3f\x12\xea\xb8\x1f\x09\x75\xdc\x8f\x84\xf7\xc2\xfd\x48\xa8\xe3\x7e\x24\xd4\x71\x3f\x12\xea\xb8\x1f\x09\x74\xee\xdc\xff\xe4\x0b\xc3\x5f\x77\xd9\xff\x5c\x5b\x3a\xfb\x0f\xcc\x65\xff\x91\xf1\xb9\xff\xd9\x17\x3e\x48\xbe\xb0\xc8\xe9\x38\xfb\x9f\x6b\x59\x67\xff\x51\xc7\xe7\xfe\xa3\x8e\xcf\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x07\xe6\xb2\xff\x30\x77\x97\xfd\x47\xc6\xd9\x7f\x1c\x93\xb3\xff\x59\xa7\xb3\xff\x38\x26\x67\xff\x51\xc7\xd9\x7f\xd4\x71\xf6\x1f\xef\x85\xb3\xff\xa8\xe3\xec\x3f\xea\x38\xfb\x8f\x3a\xce\xfe\x83\xce\x65\xff\xd3\x7a\x81\xb2\xff\xe5\x3b\x97\xc8\xfe\x13\xeb\xf5\x6c\x33\xc3\x9e\xed\xb2\x5e\x10\xd9\x7f\xd6\x71\xcf\x76\xfa\x8e\x27\xb2\xff\xac\xe3\xfc\x02\xea\x38\xbf\x80\x8c\x7b\xb6\x91\x71\xcf\x36\x32\xee\xd9\x46\xc6\x3d\xdb\xc8\x16\x06\x8c\x7b\xb6\x81\xf5\x7a\xb6\x69\xee\xbd\x9e\x6d\x66\x72\xbd\x20\xb2\xff\x9d\xce\x67\xff\x79\x4c\xec\xd9\x66\xdd\x36\xc9\x74\xf6\x1f\xef\xe5\x8a\xfa\xe7\xcc\xf5\x6c\xa3\x0e\x7b\xb6\x59\xc7\x3d\xdb\xa0\xeb\x65\xff\xc7\xba\xd4\x01\x3e\xbc\xc2\xd5\xc2\x92\xa4\xf9\x49\x59\x0b\xc0\x5c\x2d\x20\xe3\x5a\xf8\xe9\xc4\x5e\x28\x6b\x01\x75\x5c\x0b\x3f\x91\xd8\x53\x64\x2d\xa0\x8e\x6b\x01\x75\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x19\xd7\x02\x30\x57\x0b\x30\x77\x57\x0b\xc8\xb8\x16\x70\x4c\xae\x85\xac\xbb\x50\xd6\x02\x8e\xc9\xb5\x80\x8c\x6b\x01\x19\xd7\x42\xbe\x97\x67\xcb\x5a\x40\x1d\xd7\x02\xce\x81\x6b\x01\x75\x5c\x0b\x70\x3d\x97\x5f\x58\x9d\x6a\xe1\x89\x6e\xbd\xf0\x82\xa4\x39\xb3\x51\x79\x67\x60\x2e\xef\x8c\x8c\xf3\xce\xcb\x13\xcb\xfd\x48\x9c\x77\x46\x1d\xe7\x9d\x9f\x33\x66\xed\xb7\x13\xe3\xbc\x33\xea\x38\xef\x8c\x3a\xce\x3b\x23\xe3\xbc\x33\x32\xce\x3b\x23\xe3\xbc\x33\x32\xce\x3b\x23\xe3\xbc\x33\x30\x97\x77\x46\xc6\x79\x67\x98\xbb\xcb\x3b\x23\xe3\xbc\x33\x8e\xc9\x79\xe7\xac\xcb\xbd\x14\x9c\x77\xc6\x31\x39\xef\x8c\x3a\xce\x3b\xa3\x8e\xf3\xce\xe9\x5e\x86\xe9\x4c\x0e\x97\x77\x46\x1d\xe7\x9d\x71\x0e\x9c\x77\x46\x1d\xe7\x9d\xe1\x7a\x2e\xfb\xff\x92\xf4\x69\xff\x96\xab\x85\x9f\x4a\xd7\xfa\x3b\x59\x0b\xc0\x5c\x2d\x20\xe3\x5a\xb8\x22\xb1\x6f\xc8\x5a\x40\x1d\xd7\x42\x3a\x7b\xac\xfd\xac\xac\x05\xd4\x71\x2d\xa0\x8e\x6b\x01\x19\xd7\x02\x32\xae\x05\x64\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x00\x73\xb5\x80\x8c\x6b\x01\xe6\xee\x6a\x01\x19\xd7\x02\x8e\xc9\xb5\x90\x75\x8f\xca\x5a\xc0\x31\xb9\x16\x50\xc7\xb5\x80\x3a\xae\x85\x7c\x2f\x7f\x2d\x6b\x01\x75\x5c\x0b\x38\x07\xae\x05\xd4\x71\x2d\xc0\xf5\x5c\x2d\x24\x5f\x68\x3f\xad\x7d\xa1\x9d\x6b\x54\xf6\x1f\x98\xcb\xfe\x23\xe3\xec\x7f\xf2\x85\x36\x3f\xf3\xe1\xec\x3f\xea\x38\xfb\x9f\xff\x06\x7c\x34\x31\xce\xfe\xa3\x8e\xb3\xff\xa8\xe3\xec\x3f\x32\xce\xfe\x23\xe3\xec\x3f\x32\xce\xfe\x23\xe3\xec\x3f\x32\xce\xfe\x23\xe3\xec\x3f\x30\x97\xfd\x87\xb9\xbb\xec\x3f\x32\xce\xfe\xe3\x98\x9c\xfd\xcf\xba\xdc\xdb\xc0\xd9\x7f\x1c\x93\xb3\xff\xa8\xe3\xec\x3f\xea\x38\xfb\x9f\xef\x25\x9f\x95\xc0\xd9\x7f\xd4\x71\xf6\x1f\xe7\xc0\xd9\x7f\xd4\x71\xf6\x1f\xae\xd7\xcb\xfe\x97\xf5\x42\x7b\x48\xaf\x17\xda\x77\xd7\xd7\x0b\x99\xe9\xf5\x82\x31\xb9\x5e\x68\xef\xae\xaf\x17\x4c\x27\xd7\x0b\xed\xae\xfa\x7a\xc1\x74\x72\xbd\x60\x3a\xb9\x5e\x30\x26\xd7\x0b\xc6\xe4\x7a\xc1\x98\x5c\x2f\x18\x93\xeb\x05\x63\x72\xbd\x60\x4c\xae\x17\x32\xd3\xeb\x85\x3c\x77\xbd\x5e\x30\x26\xd7\x0b\x36\xa6\x5c\x2f\xb4\x7b\xeb\xeb\x05\x1b\x53\xae\x17\x4c\x27\xd7\x0b\xa6\x93\xeb\x85\xf6\x6d\xf5\xf5\x82\xe9\xe4\x7a\xc1\xe6\x20\xd7\x0b\xa6\x93\xeb\x85\x7c\x3d\xce\xfe\xe7\xe7\x48\x74\xee\xff\xea\xf9\x8b\xdb\xfc\x5b\x46\x69\x1f\xf1\xf8\x8b\xe8\x1e\xd3\x3a\x3d\xfd\x1f\x95\xe7\x48\xc6\xe4\x73\xa4\x76\x9b\xac\x05\xd4\xc9\xe7\x48\xed\x1a\x59\x0b\xa8\x93\xcf\x91\x4c\x27\x9f\x23\x19\x93\xcf\x91\x8c\xc9\xe7\x48\xc6\xe4\x73\x24\x63\xf2\x39\x92\x31\xf9\x1c\xc9\x98\x7c\x8e\x94\x99\x7e\x8e\x94\xe7\xae\x9f\x23\x19\x93\xcf\x91\x6c\x4c\xaa\x85\x36\xfd\x4e\xc4\xec\xdd\xbd\xf7\x5d\xbc\x47\xfa\x39\x52\x52\x57\x9e\x23\x99\x4e\x3e\x47\x6a\x5f\x29\x6b\x01\x75\xf2\x39\x92\xcd\x41\x3e\x47\x32\x9d\x7c\x8e\x94\xaf\xe7\xd6\xce\x69\x7f\xa1\x5d\xe5\xbe\x23\xa5\x67\xb4\x6d\x3a\x5b\xc2\xed\xb5\x01\x73\x7b\x6d\xc8\x78\xaf\x2d\xed\x2f\xb4\xcb\x1b\xb5\xd7\x86\x3a\xde\x6b\x4b\xcf\x84\xdb\x67\x34\x6a\xaf\x0d\x75\xbc\xd7\x86\x3a\xde\x6b\x43\xc6\x7b\x6d\xc8\x78\xaf\x0d\x19\xef\xb5\x21\xe3\xbd\x36\x64\xbc\xd7\x86\x8c\xf7\xda\x80\xb9\xbd\x36\x98\xbb\xdb\x6b\x43\xc6\x7b\x6d\x38\x26\xef\xb5\x65\x5d\xce\x47\xf2\x5e\x1b\x8e\xc9\x7b\x6d\xa8\xe3\xbd\x36\xd4\xf1\x5e\x5b\xbe\x97\xcb\x1a\xb5\xd7\x86\x3a\xde\x6b\xc3\x39\xf0\x5e\x1b\xea\x78\xaf\x0d\xae\xc7\xe7\xfe\xe7\x5c\x5b\xfb\x64\x97\xfd\x4f\xd9\xa0\x36\x9d\x9f\xeb\xb2\xff\xc8\x38\xfb\x0f\xcc\x65\xff\x53\xae\xad\x4d\x67\x00\xbb\xec\x3f\xea\x38\xfb\x9f\xb2\x48\x6d\x3e\x0b\x97\xb3\xff\xa8\xe3\xec\x3f\xea\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x0f\xcc\x65\xff\x61\xee\x2e\xfb\x8f\x8c\xb3\xff\x38\x26\x67\xff\xb3\xee\xfc\xc4\x38\xfb\x8f\x63\x72\xf6\x1f\x75\x9c\xfd\x47\x1d\x67\xff\x9f\x07\x8c\xb3\xff\xa8\xe3\xec\x3f\xce\x81\xb3\xff\xa8\xe3\xec\x3f\x5c\x8f\xcf\xfd\x3f\x96\x2a\xe4\xf8\xb3\x38\xfb\x9f\xcf\x8d\x6f\xd3\x6f\x9f\x1e\xff\xa1\x3e\x1b\xff\x77\xf5\xdc\x7f\x60\x2e\xe3\xf9\xb4\x31\x3b\xfa\xc8\x98\x1d\x7b\xae\xb1\xd5\x42\xc7\xd9\xff\x45\x89\xe9\x73\xff\x51\xc7\xd9\x7f\xd4\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x58\xe5\xdc\xff\x7c\xbe\x38\x67\xff\xe1\x75\x71\xd9\x7f\x1c\x93\x33\x9e\x59\xa7\xcf\xfd\xc7\x31\x39\xe3\x89\x3a\x3e\xf7\x1f\x75\x9c\xfd\x5f\x04\x8c\xb3\xff\xa8\xe3\xec\x3f\xce\x81\xb3\xff\xa8\xe3\xec\x3f\x5c\xaf\x72\xee\xff\x25\xae\x67\xfb\x07\x93\x46\x9f\xfb\x0f\xcc\xf5\x6c\x23\xe3\x9e\xed\xa7\x26\xa6\xcf\xfd\x47\x1d\xf7\x6c\x9f\x93\x98\x3e\xf7\x1f\x75\xdc\xb3\x8d\x3a\xee\xd9\x46\xc6\x3d\xdb\xc8\xb8\x67\x1b\x19\xf7\x6c\x23\xe3\x9e\x6d\x64\xdc\xb3\x8d\x8c\x7b\xb6\x81\xb9\x9e\x6d\x98\xbb\xeb\xd9\x46\xc6\x3d\xdb\x38\x26\xf7\x6c\x67\x9d\x3e\xf7\x1f\xc7\xe4\x9e\x6d\xd4\x71\xcf\x36\xea\xb8\x67\xfb\x1c\x60\xdc\xb3\x8d\x3a\xee\xd9\xc6\x39\x70\xcf\x36\xea\xb8\x67\x1b\xae\xe7\xb2\xff\xe9\x1b\x9e\x38\xf7\xff\x87\x3a\x5f\x38\xb6\x40\xb1\xca\xb9\xff\xc0\xb4\x2f\x54\xce\xfd\x47\x1d\x67\xff\x73\x2d\xeb\x73\xff\x51\xc7\xd9\x7f\xd4\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x98\xcb\xfe\xc3\xdc\x5d\xf6\x1f\x19\x67\xff\x71\x4c\xed\x0b\xfa\xdc\x7f\x1c\x53\xfb\x82\x3e\xf7\x1f\x75\x9c\xfd\x5f\x04\x8c\xb3\xff\xa8\xe3\xec\x3f\xce\x81\xb3\xff\xa8\xe3\xec\x3f\x5c\xcf\x65\xff\x93\xab\x89\x73\xff\x73\x6d\xe9\x73\xff\x81\x55\x7c\x41\x9f\xfb\x9f\x7d\x41\x9f\xfb\x8f\x3a\xed\x0b\xfa\xdc\x7f\xd4\x69\x5f\xd0\xe7\xfe\x23\xd3\xbe\xa0\xcf\xfd\x47\xa6\x7d\x41\x9f\xfb\x8f\x4c\xfb\x82\x3e\xf7\x1f\x58\xc5\x17\xf4\xb9\xff\xc8\xb4\x2f\xe8\x73\xff\xb3\x4e\x9f\xfb\x8f\x63\x6a\x5f\xd0\xe7\xfe\xa3\x4e\xfb\x82\x3e\xf7\x1f\x75\xda\x17\xf4\xb9\xff\xa8\xd3\xbe\xa0\xcf\xfd\x4f\xa7\x32\x8c\xbe\xe5\x6a\xe1\x49\x63\xcd\xe8\xff\x36\x2a\xe3\x89\x8c\x33\x9e\xc0\x7a\x6b\xe7\xcd\xf3\x73\xea\x3f\xbb\xc3\x60\xf4\x4f\x54\x0b\xa8\xe3\x8c\xe7\xc2\xc4\xd2\x9e\xa6\xcb\x78\xa2\x8e\x33\x9e\xa8\xe3\x8c\x27\x32\xce\x78\x22\xe3\x8c\x27\x32\xce\x78\x22\xe3\x8c\x27\x32\xce\x78\x22\xe3\x8c\x27\x30\x97\xf1\x4c\x73\x1f\xaf\x9a\xcf\x1c\x8c\x5f\x01\xac\x85\xf4\x8a\xe4\xff\xc3\x67\x3c\x71\x4c\xce\x78\xe6\xd7\xf3\x4f\x9a\x46\x64\x3c\xe1\xb5\x76\x19\x4f\xd4\x71\xc6\x13\x75\x9c\xf1\xc4\x7b\xe1\x8c\x27\xea\x38\xe3\x89\x3a\xce\x78\xa2\xee\xf4\x7e\x2d\x8c\xbd\x60\xa2\x1b\x8f\xe1\x7d\x41\x64\xff\x53\x6d\x8d\x7e\xab\xee\x0b\x99\x69\x5f\x30\x26\x7d\x61\x34\x57\xf7\x05\xd3\x49\x5f\x18\xdd\x53\xf7\x05\xd3\x49\x5f\x30\x9d\xf4\x05\x63\xd2\x17\x8c\x49\x5f\x30\x26\x7d\xc1\x98\xf4\x05\x63\xd2\x17\x8c\x49\x5f\xc8\x4c\xfb\x42\x9e\xbb\xf6\x05\x63\xd2\x17\x6c\x4c\xe9\x0b\xa3\x0f\xd5\x7d\xc1\xc6\x94\xbe\x60\x3a\xe9\x0b\xa6\x93\xbe\x60\xf7\x22\x7d\xc1\x74\xd2\x17\x4c\x27\x7d\xc1\x74\xd2\x17\xb2\xae\xe2\x0b\xee\xdc\xff\xd1\x9e\xee\xef\x4a\xc5\x17\xf6\x04\xbe\xb0\x07\x7c\xa1\xd4\x42\x3a\xf1\x3f\x57\x84\xaf\x05\xd4\x69\x5f\xb8\x39\xf0\x85\x3d\x81\x2f\xdc\x1c\xf8\xc2\xcd\x81\x2f\xdc\x1c\xf8\xc2\xcd\x81\x2f\xdc\x1c\xf8\xc2\xcd\x81\x2f\xdc\x1c\xf8\xc2\xcd\x75\x5f\xc8\x73\x77\xd9\x7f\x64\xda\x17\x6e\x0e\x7c\x61\x5b\xe0\x0b\x7b\x02\x5f\xd8\x16\xf8\xc2\x9e\xc0\x17\x6e\x0e\x7c\x61\x4f\xe0\x0b\x37\x07\xbe\xb0\x87\x7c\x61\x86\x75\x2e\xfb\x9f\x7d\xc1\x9f\xfb\x9f\x6b\xeb\xaa\xc0\x17\xae\x0a\x7c\xe1\xaa\xc0\x17\x5e\x16\xf8\xc2\x55\x81\x2f\x2c\x0f\x7c\xe1\xaa\xc0\x17\x96\x07\xbe\xb0\x3c\xf0\x85\xe5\x81\x2f\x2c\x0f\x7c\x61\x79\xe0\x0b\xcb\x03\x5f\x58\x1e\xf8\xc2\xf2\xc0\x17\xae\x0a\x7c\xe1\xaa\xc0\x17\x96\x07\xbe\xf0\xfc\xc0\x17\xae\x0a\x7c\xe1\xf9\x81\x2f\x5c\x15\xf8\xc2\xf2\xc0\x17\xae\x0a\x7c\x61\x79\xe0\x0b\x57\x05\xbe\xb0\xbc\xe1\xec\xff\x7f\xcc\x5f\x7c\x3c\xfd\x8a\xec\xe8\x27\xdc\xb9\xff\x4f\x4c\x9a\xf4\x8c\xcc\x9d\xfb\x0f\xcc\x9d\xfb\x8f\x8c\xcf\xfd\xff\xd1\xc4\xf2\xfe\x2a\x9f\xfb\x8f\x3a\xcc\xfe\x6f\x9a\xbf\xf8\xf8\x82\xc4\x72\xaf\x37\x9f\xfb\x8f\x3a\xcc\xfe\xb3\x0e\xb3\xff\xcc\xb6\x04\x3a\xcc\xfe\x33\xc3\xec\x3f\xb3\x0b\x83\x31\x17\x06\xec\xd4\xfa\xdc\xdd\xb9\xff\x30\x77\x77\xee\x3f\x32\xec\xc1\xe0\x31\xf9\xdc\xff\xac\xcb\xbf\xcd\xc8\xe7\xfe\xe3\x98\x7c\xee\x3f\xea\xf8\xdc\x7f\xd4\x5d\x13\xcc\x8f\xcf\xfd\x47\xdd\x25\xf5\xd7\xda\x9d\xfb\x8f\xba\x41\xfd\x7a\x2e\xfb\x9f\x76\x2b\x46\xf3\x5c\xf6\xff\x09\x63\xcd\xf0\x64\xaa\x85\xef\xad\xb3\xa3\xff\x6e\x6c\xb5\x60\x5f\x36\x36\x79\xd6\xf5\x94\xc4\xfe\x2b\xb1\x3f\x32\x36\x2d\x74\x47\x13\xdb\x51\x9e\x83\x9d\x95\x58\xee\xcb\xfe\x08\x8d\x89\xba\xb7\x9b\x6e\xb3\xd0\xed\x30\xb6\x41\xb0\x57\x05\xba\x97\x18\xdb\x24\xd8\x65\x01\x7b\xb2\xb1\xed\x82\x3d\xbe\x7e\xbd\xd9\xff\x32\xb6\x44\xb0\xaf\xd8\xdc\x77\xf8\xb9\xcf\x7e\xc6\xd8\x76\xc1\x8e\xd9\x98\xab\xc5\x98\xbf\x21\xdf\xbf\xff\x93\xd8\xbb\x8c\x6d\x12\x63\xee\x0c\x74\xaf\xad\x7f\x5e\x66\xaf\xae\xbf\x0f\xb3\xcf\x0f\x74\x4f\x0d\x5e\xb3\xb3\x4c\x77\x9b\xd7\x1d\xf9\x9f\xfa\x67\xe9\x48\xfe\x5b\xdd\x65\xff\xd3\x5f\xe9\xe1\xe7\xac\x16\xba\x7f\x3f\x2f\x69\x7e\x17\x6a\x41\x32\xab\x85\xed\xa5\x1f\x09\xd9\x97\x27\xf7\x6f\xbe\xf6\x23\x89\xfd\x3e\xd4\xc2\xf6\xf2\x1d\x09\x75\x47\x8d\x4d\xbe\x23\xfd\x40\x62\xbf\x03\xb5\xb0\xbd\x8c\x89\xba\xb7\x13\x43\xdd\x0e\x9a\x03\xb2\x57\x15\x9d\x67\x2f\x31\xb6\x49\xb0\xcb\x26\xcc\xbe\x43\x20\x7b\xb2\xb1\x49\x3f\x12\xb2\xc7\xd7\xef\xd3\x6a\x61\xfb\x77\x97\xd8\x77\x24\x64\x5f\x31\xb6\xc3\xbf\x0f\x56\x0b\xdb\xcb\x77\x24\x64\xc7\xca\x7b\xe4\xee\xd3\x6a\x61\x7b\xe9\x0b\xcb\xba\xdf\x84\x5a\xe8\xe6\x87\x63\xee\x9c\xe8\x6c\x7e\xa8\x7b\xed\xe4\xb5\xb6\x9e\x23\xd4\x5d\x5d\xd8\xe9\xee\x5e\x9e\x5f\xff\x9c\x59\x2d\xe8\xd7\xec\x2c\x63\xb7\xd9\x77\x24\xd0\x59\x2d\x6c\x2f\xdf\x91\x40\x67\xb5\xd0\x9d\xfb\xff\xe1\xf1\xbf\x8e\xdd\xa1\xff\xef\x56\x5b\x6f\xef\xfb\x82\x67\xe0\x0b\x1b\x1c\x2b\xbe\x60\xf7\x9f\x7d\xe1\x4e\xf2\x85\x45\x4e\x57\x7c\xc1\x6a\x21\xd7\xf2\x9e\xbe\x2f\xd8\x98\xa8\x7b\x3b\xd5\x1e\xea\x8a\x2f\xd8\x1c\x90\x15\x5f\x10\xac\xf8\x82\x60\x9d\x2f\x4c\x3b\x56\x7c\xc1\x3e\x2b\xc8\x1e\x5f\xbf\xcf\xce\x17\xac\x16\x90\x15\x5f\xf0\xef\x43\xe7\x0b\x82\x75\xbe\xe0\xee\x13\x7c\x01\xdf\x87\x9b\xc9\x17\xa6\xdd\x98\xc5\x17\x6c\x7e\xa8\xeb\x7c\xe1\x4c\xa7\xeb\x7c\xe1\x74\x77\x2f\xcf\xaf\x7f\xce\x3a\x5f\x10\xaf\x59\xf1\x05\xab\x05\xd0\x75\xbe\x60\xb5\x00\x3a\xab\x85\xdc\xb3\x5d\xd6\x0b\xc3\x6d\xee\xbc\xb6\xf4\x9d\x6b\xf8\xb2\x46\x9d\xd7\x06\xcc\x9d\xd7\x86\x8c\xcf\x6b\x4b\xeb\x85\xe1\x6b\x68\xbd\xe0\x75\xd8\xb3\x5d\xbe\xe3\x0d\xaf\xa2\xf5\x82\xd7\x61\xcf\x36\xeb\xb0\x67\x9b\xd9\x96\x40\x87\x3d\xdb\xcc\xb0\x67\x9b\xd9\x85\xc1\x98\x0b\x03\x76\x6a\x7d\xee\xee\xbc\x36\x98\xbb\x3b\xaf\x0d\x99\x5c\x2f\xd8\x98\x7c\x5e\x5b\xd6\x2d\xa7\xf5\x82\x1f\x93\xcf\x6b\x43\x1d\x9f\xd7\x86\xba\x6b\x82\xf9\xf1\x79\x6d\xa8\xbb\xa4\xfe\x5a\xbb\xf3\xda\x50\x37\xa8\x5f\xcf\x9d\xfb\x7f\x51\xaa\x85\xa5\xbd\x5a\xd8\x34\x7f\xf1\x30\xe5\x7f\x8e\x5f\xe0\x6a\x61\x3c\xde\x05\x69\xbc\xe7\xb8\x5a\x60\xf6\x35\xfa\x1c\x2d\x4e\xec\xa7\x5c\x2d\xb0\x8e\x6b\xe1\xec\xc4\x9e\xe4\x6a\x81\x75\x54\x0b\xe9\xd4\xc2\xac\x1e\x8c\xd5\xbd\x39\xe0\x98\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x58\xaf\x16\xca\x7b\x34\x9b\xf7\x8d\x2e\x80\x5a\xe8\x74\xcf\x91\xb5\x80\x63\x62\x2d\x74\xaf\xe7\x8f\xba\x5a\xa0\xd7\xba\x57\x0b\xcc\xb6\x05\x8c\x6b\x21\xdf\xcb\x45\xae\x16\x58\xc7\xb5\x80\x73\x38\x9f\x5e\x4f\xd4\x71\x2d\xc0\xf5\x5c\x7e\x21\xfd\xe2\xc1\xf0\x5c\x97\x5f\x38\x3f\x69\xbe\x37\xd5\xc2\x19\x75\x76\xf4\x5b\xc5\x7f\x37\x38\xf6\xd7\xe4\x6b\x4f\x4e\x2c\xf5\xac\x1c\xfd\xb4\xb1\xc9\x77\x24\xd4\x1d\xa1\xef\x48\x63\xc5\xe2\xf6\xdf\x13\x3b\x54\xbe\xb3\xdc\xe3\x74\x6f\xa3\xeb\xa1\xee\xe7\x68\x0e\xc8\x5e\x41\xdf\x91\x90\x5d\x49\xdf\x91\x90\xfd\x04\x7d\x47\x42\xf6\xc3\xf4\x1d\x09\xd9\xff\x2a\xcc\xdd\xe7\xec\x7f\x94\xb9\x3f\xea\xd8\xdf\x18\xdb\xe1\xdf\x87\xd9\x3f\x29\x63\x7a\x36\xa4\xef\x48\x38\xe6\xaf\x15\xf6\xa4\x4e\xd7\x7e\x27\xb1\x77\xd0\xfc\x70\xcc\x5b\x26\x3a\x9b\x1f\xea\x5e\x53\xd8\x49\xa7\x5b\x5d\xde\x87\x93\xdd\xbd\x0c\xe7\x25\xf6\xbc\xfa\xe7\x6c\x76\x71\xfd\xbd\x9d\x9d\x64\x90\x27\xdf\x91\x40\x77\xe4\xbf\xe9\x3b\x12\x5c\xef\xc8\xdf\xd3\xf5\x52\x9f\x6a\xfb\xcf\xae\x16\xce\x4d\xd7\xfa\xb2\xac\x05\x60\xae\x16\x90\x71\x2d\xfc\x70\x62\x5f\x95\xb5\x80\x3a\xae\x85\x33\x13\xfb\x23\x59\x0b\xa8\xe3\x5a\x40\x1d\xd7\x02\x32\xae\x05\x64\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x00\xe6\x6a\x01\x19\xd7\x02\xcc\xdd\xd5\x02\x32\xae\x05\x1c\x93\x6b\x21\xeb\x3e\x2f\x6b\x01\xc7\xe4\x5a\x40\x1d\xd7\x02\xea\xb8\x16\xf2\xbd\x7c\x51\xd6\x02\xea\xb8\x16\x70\x0e\x5c\x0b\xa0\x73\xb5\x00\xd7\x83\x5a\x38\xd0\xf9\x42\xfb\x90\xf6\x85\xf6\x68\xa2\xdf\x53\x67\x47\xff\x4d\xf9\x82\xb1\xc7\x94\x2f\xb4\xf9\x99\xcf\x1f\x2a\x5f\x30\xdd\xac\xf4\x85\x8f\x24\xf6\x61\xe5\x0b\xa6\xfb\xdf\xf2\x6f\x47\xd6\xfd\xbc\xf4\x85\xcc\x5e\x29\x7d\x21\xb3\x55\xd2\x17\x32\xbb\x54\xfa\x42\x66\x3f\x22\x7d\x21\xb3\xef\x97\xbe\x90\xd8\xec\x7f\x1a\x5b\xd2\xf3\x85\xcc\xfe\x56\xf9\x42\x9e\xfb\xec\x9f\x2a\x5f\x30\x36\x92\xbe\x90\xc7\xfc\xf5\xc2\xf0\x7d\xb8\x37\xb1\x77\x2a\x5f\xb0\x31\x7f\x41\xfa\x42\xd6\xfd\xac\xf2\x05\xd3\x5d\xa5\x7c\xa1\x9d\x49\xec\xa7\xea\x9f\xb3\xd9\x1f\xad\xbf\xb7\xb3\xf3\x95\x2f\x64\xdd\x91\xef\x94\xcf\x52\xcb\xd7\x3b\xf2\x55\x5a\x67\xa4\x6f\x4e\x74\xee\x7f\xf9\xce\xd5\xbe\xbd\xbe\x5e\xc8\x4c\xaf\x17\x8c\xc9\xf5\x42\xfb\xde\xfa\x7a\xc1\x74\x72\xbd\xd0\xee\xa8\xaf\x17\x4c\xc7\x6b\x67\xd4\xf1\xda\x19\x99\x5c\x2f\x18\x93\xeb\x05\x63\x72\xbd\x60\x4c\xae\x17\x8c\xc9\xf5\x82\x31\xb9\x5e\xc8\x8c\xd7\x0b\x38\xf7\xde\xda\x99\x99\x5c\x2f\xd8\x98\x72\xbd\xd0\xee\xae\xaf\x17\x6c\x4c\xb9\x5e\x30\x9d\x5c\x2f\x98\x4e\xae\x17\xda\x7d\xf5\xf5\x82\xe9\xe4\x7a\xc1\xe6\x20\xd7\x0b\xa6\x93\xeb\x85\x7c\xbd\x5e\xf6\xbf\x3c\x47\x6a\xdf\xa4\x9f\x23\xb5\xaf\x76\xb5\x40\x4c\x3f\x47\x32\x46\xb5\xd0\x6e\x6d\xca\xb9\xff\xc7\x17\xc3\xeb\xcc\x3a\xf9\x1c\xa9\xfd\x19\x57\x0b\xac\xe3\xec\x7f\x62\xf9\xdc\xff\xb1\xda\x3f\x47\xb2\x31\xe5\x73\x24\x63\xf2\x39\x92\x31\xf9\x1c\xc9\x98\x7c\x8e\x64\x4c\x3e\x47\x32\x26\x9f\x23\x65\xa6\x9f\x23\xe5\xb5\x73\xfb\x5a\xa8\x05\x7a\x5d\xf4\x73\x24\x1b\x53\x3e\x47\x32\x9d\x7c\x8e\x64\x4c\x3e\x47\x6a\xd7\xb9\x5a\x60\x9d\x7c\x8e\xd4\x5e\xe7\x6a\x81\x75\xf2\x39\x92\xcd\x41\x3e\x47\x32\x9d\x7c\x8e\x94\xaf\xe7\xd6\xce\x69\xdf\xb9\xfd\x69\xf7\x1d\x29\x3d\xa3\x6d\x9f\xd7\x74\xfb\x0b\x92\xd9\xfe\xc2\x8e\xfe\xfe\x82\x31\xde\x6b\x4b\xfb\x0b\xed\xe5\x4d\xb7\xbf\xb0\xa3\xbf\xbf\x60\x3a\xb9\xbf\xd0\xe6\x33\x16\x3e\x42\x63\xa2\x4e\xee\x2f\x98\x4e\xee\x2f\x18\x93\xfb\x0b\xc6\xe4\xfe\x82\x31\xb9\xbf\x60\x4c\xee\x2f\x18\x93\xfb\x0b\x99\xe9\xfd\x05\x63\x5f\xa1\xef\x48\x30\x77\xdb\x5f\xd8\xd1\xdf\x5f\x30\x26\xf7\x17\x6c\xcc\xdf\xa0\xef\x48\x59\x97\xb3\x93\xef\xa2\xf9\xe1\x98\x3b\xe9\x3b\x12\xea\x5e\x3b\x79\xad\x71\x7f\xc1\x74\x72\x7f\xa1\xfd\xf1\xa6\xdb\x5f\x90\x9f\x33\xbd\xbf\x60\x73\x38\x8b\xbe\x23\x81\x4e\xef\x2f\xe4\xeb\xd9\xfe\x42\x97\xaf\xce\x27\x96\x3f\xc5\x65\xff\x73\xae\x4d\x9f\xfb\x8f\x8c\xb3\xff\xc0\x5c\xf6\x3f\xe5\xda\x2a\xe7\xfe\xa3\x8e\xb3\xff\x29\x8b\x54\x39\xf7\x1f\x75\x9c\xfd\x47\x1d\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x81\xb9\xec\x3f\xcc\xdd\x65\xff\x91\x71\xf6\x1f\xc7\xe4\xec\x7f\xd6\xe9\x73\xff\x71\x4c\xce\xfe\xa3\x8e\xb3\xff\xa8\xe3\xec\xff\x22\x60\x9c\xfd\x47\x1d\x67\xff\x71\x0e\x9c\xfd\x47\x1d\x67\xff\xe1\x7a\x9c\xfd\x3f\x9e\x52\x72\xc7\x2e\xd3\xd9\xff\xb9\xff\x69\xc4\xb9\xff\xe9\x5f\x2b\xd9\x7f\x64\x9c\xf1\x34\xf6\xdc\xc4\xe8\xdc\xff\x9e\x8e\xb2\xff\x3d\x46\xd9\xff\x1e\xa3\xec\x7f\x66\x47\xd3\x1e\xe3\xb1\x67\xd2\x1c\xfe\xad\xa9\x66\xff\x7b\x6c\x63\xc0\x28\xfb\xdf\x63\x17\x07\xba\xf3\x02\x46\xd9\x7f\x64\x9c\xfd\xc7\xb9\x73\xf6\xbf\xc7\x28\xfb\xdf\x1b\x93\x32\x9e\xa6\x93\xd9\xff\xde\x98\x94\xf1\xec\xe9\x6e\x92\xef\x5f\xfe\xbd\x98\x9f\x91\xf3\x93\xd9\xff\xde\xf5\x28\xfb\x6f\x4c\x66\xff\x7b\xba\x33\xea\xd7\x73\x19\xcf\xff\x95\x3e\x29\x4f\xe7\x9e\xed\x94\x8e\x5e\x3c\xf7\xdf\x8d\xe8\xd9\x4e\xff\x5a\xc9\xfe\xf7\x18\xf7\x6c\x4f\x35\xd5\xec\x7f\x4f\x47\x3d\xdb\x73\xdf\x6c\xaa\xd9\xff\x9e\x8e\x7a\xb6\x7b\x3a\xea\xd9\xee\x31\xea\xd9\xee\xb1\xf5\x01\xa3\x9e\xed\x1e\xa3\x9e\xed\x1e\x5b\x14\xdc\x27\xf5\x6c\x23\xe3\x9e\x6d\x9c\x3b\xf7\x6c\xf7\x18\xf5\x6c\xf7\xc6\xa4\x9e\x6d\xd3\xc9\xec\x7f\x6f\x4c\xea\xd9\xee\xe9\xa8\x67\xbb\xa7\xa3\x9e\x6d\xbb\x17\x99\xfd\xef\xe9\xa8\x67\xbb\x37\x07\xea\xd9\xee\xe9\xa8\x67\x1b\xaf\xe7\xb2\xff\xd9\x17\x5c\xf6\xdf\x6a\x6b\x41\x23\xce\xfd\xef\xb1\x53\xe4\xdf\x15\x9d\xfd\x1f\x34\xd5\xec\x7f\x4f\x47\xd9\x7f\xab\x65\x99\xfd\xef\xe9\x28\xfb\xdf\xd3\x51\xf6\xbf\xc7\xb6\x06\xba\x8d\x01\xa3\xec\x7f\x8f\x5d\x1c\xe8\xce\x0b\xd8\x54\x7d\xee\x9c\xfd\xc7\xb9\x73\xf6\xbf\xc7\x28\xfb\xdf\x1b\x53\xfb\x82\xcc\xfe\xf7\xc6\xd4\xbe\x20\xb3\xff\x3d\xdd\x75\x72\x7e\x32\xfb\xdf\xd3\x3d\xbb\xfe\x5a\x73\xf6\xbf\xa7\x3b\xa3\x7e\xbd\x8a\x2f\xb8\xec\xbf\xd5\x96\xcc\xfe\x23\xab\xf8\x82\xce\xfe\x67\x5f\x90\xd9\xff\x9e\x4e\xfb\x82\xcc\xfe\xf7\x74\xda\x17\x64\xf6\xbf\xc7\xb4\x2f\xc8\xec\x7f\x8f\x69\x5f\x90\xd9\xff\x1e\xd3\xbe\x20\xb3\xff\xc8\x2a\xbe\x20\xb3\xff\x3d\xa6\x7d\x41\x66\xff\x4d\x27\xb3\xff\xbd\x31\xb5\x2f\xc8\xec\x7f\x4f\xa7\x7d\x41\x66\xff\x7b\x3a\xed\x0b\x32\xfb\xdf\xd3\x69\x5f\xd0\xd9\xff\x94\xbe\x18\xfd\xa7\xab\x85\xef\x8c\x35\xa3\xfc\x9b\xf3\x0b\x02\x46\x19\x4f\x64\x65\xed\xbc\x79\xf0\x99\xc1\xe6\x89\x2f\x1c\x4d\x3d\xdb\x9c\xfd\xef\xe9\xf2\xda\xf9\x9e\x52\x0b\x39\xaf\x9d\x7a\xe3\x39\xe3\xd9\xd3\xdd\x69\xba\xc9\x67\x0c\x75\x77\x18\x9b\xcc\x01\xd9\x0d\x45\xe7\xd9\x86\x80\x2d\x35\x36\xa9\x05\x64\x17\x15\xdd\x21\xc7\xce\x0d\xee\x73\x5e\x99\xfb\xa3\xcc\x38\xe3\x89\x73\xe7\x8c\x67\x8f\x3d\x64\x63\x4e\xde\x23\x1c\x93\x32\x9e\xa6\xfb\x5c\xd3\xf8\x8c\x67\x6f\x4c\xca\x78\xf6\x74\x94\xf1\xec\xe9\xae\x2d\xf3\x3b\xe9\xee\x65\x79\xfd\x73\x66\x6b\xe7\x7b\x4a\x2d\xa0\x8e\x32\x9e\x3d\xdd\xe9\xe5\x7a\x33\xac\x73\x19\xcf\xe4\x0b\xa3\x3f\xd0\xbe\x30\x9a\xad\xfb\x42\x66\xda\x17\x8c\x49\x5f\x18\x9d\xa8\xfb\x82\xe9\xa4\x2f\x8c\xee\xab\xfb\x82\xe9\xa4\x2f\x98\x4e\xfa\x82\x31\xe9\x0b\xc6\xa4\x2f\x18\x93\xbe\x60\x4c\xfa\x82\x31\xe9\x0b\xc6\xa4\x2f\x64\xa6\x7d\x21\xcf\x5d\xfb\x82\x31\xe9\x0b\x36\xa6\xf4\x85\xd1\x47\xea\xbe\x60\x63\x4a\x5f\x30\x9d\xf4\x05\xd3\x49\x5f\xb0\x7b\x91\xbe\x60\x3a\xe9\x0b\xa6\x93\xbe\x60\x3a\xe9\x0b\x59\x57\xf1\x05\x97\xfd\xb7\xda\xda\x1f\xf8\xc2\xfe\xc0\x17\xf6\x83\x2f\x50\xf6\x3f\xfd\x32\xcc\x60\xee\x3b\xd2\x17\xf6\x07\xbe\xb0\x2b\xf0\x85\xfd\x81\x2f\xec\x0a\x7c\x61\x57\xe0\x0b\xbb\x02\x5f\xd8\x15\xf8\xc2\xae\xc0\x17\x76\x05\xbe\xb0\x2b\xf0\x85\x5d\x81\x2f\xec\x0f\x7c\x61\x7f\xe0\x0b\xbb\x02\x5f\x78\x63\xe0\x0b\xfb\x03\x5f\x78\x23\xac\x17\xd8\x17\xf6\x83\x2f\x68\xa6\x7d\x61\x7f\xe0\x0b\xbb\x02\x5f\xd8\x1f\xf8\xc2\xae\xc0\x17\x5e\x57\xf1\x85\xb5\x81\x2f\xac\x0d\x7c\x61\x6d\xe0\x0b\xd7\x07\xbe\xb0\x36\xf0\x85\x95\x81\x2f\xac\x0d\x7c\x61\x65\xe0\x0b\x2b\x03\x5f\x58\x19\xf8\xc2\xca\xc0\x17\x56\x06\xbe\xb0\x32\xf0\x85\x95\x81\x2f\xac\x0c\x7c\x61\x6d\xe0\x0b\x6b\x03\x5f\x58\x19\xf8\xc2\x8b\x02\x5f\x58\x1b\xf8\xc2\x8b\x02\x5f\x58\x1b\xf8\xc2\xca\xc0\x17\xd6\x06\xbe\xb0\x32\xf0\x85\xb5\x81\x2f\xac\x6c\xd4\xb9\xff\xdf\x97\x6a\xe1\x52\xce\xfe\xa7\x53\xd3\x17\xcf\xa5\xf3\xb0\x38\xfb\x9f\xd9\xd1\xb4\xf7\x30\xf7\x6d\x63\x96\xfd\x4f\x0a\x75\xee\xff\xf4\xfc\xc5\xc7\xe7\x25\xe6\xcf\xfd\x67\x1d\x9d\xfb\x3f\xf7\xaf\x89\xf9\x73\xff\x59\x47\xe7\xfe\xf7\x74\x74\xee\x7f\x8f\x6d\x09\x74\x74\xee\x7f\x8f\xd1\xb9\xff\x3d\x76\x61\x30\xe6\xc2\x80\x9d\x5a\x9f\x3b\x67\xff\x71\xee\x9c\xfd\xef\x31\x3a\x7f\xa1\x37\x26\x65\xff\xd3\xc9\x0b\x76\x7e\x7f\x79\x6f\xc5\x7b\xc4\xd9\x7f\x63\xfe\xdc\x7f\xd6\x5d\x13\xcc\x8f\xb2\xff\x3d\xdd\x25\xf5\xd7\x9a\xb3\xff\x3d\xdd\xa0\x7e\x3d\x97\xfd\xff\x9e\x46\x9e\xfb\x3f\xf7\x9f\x63\x8d\x3e\xf7\x1f\x19\x9f\xfb\xdf\x63\x7c\xee\xff\xa9\x89\xc9\x73\xff\x7b\x3a\x3a\xf7\x7f\xee\x64\x62\xf2\xdc\xff\x9e\x8e\xce\xfd\xef\xe9\xe8\xdc\xff\x1e\x7b\x7d\xa0\x5b\x1b\x30\x3a\xf7\xbf\xc7\xe8\xdc\xff\x1e\x3b\x27\x18\xf3\x94\xfa\xdc\xf9\xdc\x7f\x9c\x3b\x9f\xfb\xdf\x63\x74\xee\x7f\x6f\x4c\x3a\xf7\xdf\x74\xf2\xdc\xff\xde\x98\x74\xee\x7f\x4f\xb7\x55\x32\x79\xee\x7f\xef\x5e\x96\xd5\x3f\x67\x7c\xee\x7f\x4f\x47\xe7\xfe\xf7\x74\x53\xf5\xeb\xb9\x73\xff\x4f\x6f\xe4\xb9\xff\x73\xff\x2f\x69\xe4\xb9\xff\xc8\xf8\x2c\x92\x1e\xe3\xb3\x48\x9a\xc4\xe4\xb9\xff\x3d\x1d\x9d\x45\x32\xf7\x4f\x89\xc9\x73\xff\x7b\x3a\x3a\x8b\xa4\xa7\xa3\xb3\x48\x7a\x8c\xce\x22\xe9\xb1\xb5\x01\xa3\xb3\x48\x7a\x8c\xce\x22\xe9\xb1\x73\x82\xfb\xa4\xb3\x48\x90\xf1\x59\x24\x38\x77\x3e\x8b\xa4\xc7\xe8\x2c\x92\xde\x98\x74\x16\x89\xe9\xe4\xb9\xff\xbd\x31\xe9\x2c\x92\x9e\x8e\xce\x22\xe9\xe9\xe8\x2c\x92\xde\xbd\x2c\xab\x7f\xce\xf8\x2c\x92\x9e\x8e\xce\x22\xe9\xe9\xe8\x2c\x12\xd4\xb9\x73\xff\x93\x2f\xf8\x73\xff\xad\xb6\xe4\xb9\xff\xc8\xf8\xdc\xff\x1e\xe3\x73\xff\xb3\x2f\xc8\x73\xff\x7b\x3a\x3a\xf7\xdf\x6a\x59\x9e\xfb\xdf\xd3\xd1\xb9\xff\x3d\x1d\x9d\xfb\xdf\x63\x74\xee\x7f\x8f\xad\x0d\x18\x9d\xfb\xdf\x63\x74\xee\x7f\x8f\x9d\x13\xdc\x27\x9d\xfb\x8f\x8c\xcf\xfd\xc7\xb9\xf3\xb9\xff\x3d\x46\xe7\xfe\xf7\xc6\xa4\x73\xff\x4d\x27\xcf\xfd\xef\x8d\x49\xe7\xfe\xf7\x74\x74\xee\x7f\x4f\x47\xe7\xfe\xf7\xee\x65\x59\xfd\x73\xc6\xe7\xfe\xf7\x74\x74\xee\x7f\x4f\x47\xe7\xfe\xa3\xce\x9d\xfb\x9f\xd6\x0b\x43\xd7\xb3\x9d\xbf\x73\x89\x73\xff\x89\x71\xcf\x76\x8f\x71\xf6\x3f\xad\x17\xc4\xb9\xff\xac\xa3\xf3\xda\xf2\x77\x3c\x71\xee\x3f\xeb\xa8\x67\xbb\xa7\xa3\xf3\xda\x7a\x6c\x4b\xa0\xa3\xf3\xda\x7a\x8c\xce\x6b\xeb\xb1\x0b\x83\x31\x17\x06\xec\xd4\xfa\xdc\xb9\x67\x1b\xe7\xce\xd9\xff\x1e\x93\xeb\x05\x1b\x93\x7a\xb6\x4d\xe7\xcf\xfd\xe7\x31\xa9\x67\xbb\xa7\xdb\x26\x99\x3c\xf7\xbf\x77\x2f\x57\xd4\x3f\x67\x7c\x5e\x5b\x4f\x47\x3d\xdb\x3d\xdd\xa0\x7e\x3d\x97\xfd\x4f\xa9\xd0\xe1\x32\x57\x0b\xff\x95\x34\x97\xca\x5a\x00\xe6\x6a\x01\x19\xd5\xc2\xf0\xf9\x4d\x97\x5f\x38\x8d\x5e\x67\xd4\x71\x2d\xfc\x4b\x62\x3f\xa2\x6a\x61\x3c\xce\x99\x8b\xc7\x55\x70\xe6\x60\x78\x69\xff\x35\x49\x0a\xcb\x2f\xcc\xd1\xbc\x7b\x63\x72\x2d\x20\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x19\xd7\x02\x32\xae\x05\x60\xae\x16\xe0\x35\x73\xb5\x80\x8c\x6b\x01\xc7\xe4\x5a\xc8\xba\xa7\xcb\x5a\xc0\x31\xb9\x16\x90\x71\x2d\x20\xe3\x5a\xc8\xf7\xf2\x63\xb2\x16\x50\xc7\xb5\x80\x73\xe0\x5a\x40\x1d\xd7\x02\x5c\xcf\xe5\x17\x52\x47\xc4\xf0\x09\x6e\xbd\xf0\x1f\x49\x93\x76\x1f\xf8\xac\x73\x64\x7c\xd6\x79\x8f\xf1\x59\xe7\xa7\x24\x96\x7b\x87\xe8\xac\xf3\x9e\x8e\xce\x3a\x9f\xfb\xe7\x31\x6b\xff\x33\x31\x3a\xeb\xbc\xa7\xa3\xb3\xce\x7b\x3a\x3a\xeb\xbc\xc7\xe8\xac\xf3\x1e\x7b\x69\xc0\xe8\xac\xf3\x1e\xa3\xb3\xce\x7b\x8c\xce\x3a\x47\xc6\x67\x9d\xf7\x18\x9d\x75\x8e\x73\xe7\xb3\xce\x7b\x8c\xce\x3a\xef\x8d\x49\x67\x9d\x9b\x2e\xf7\x36\xd0\x59\xe7\xbd\x31\xe9\xac\xf3\x9e\x8e\xce\x3a\xef\xe9\xe8\xac\xf3\x7c\x2f\xc3\xc7\x25\x76\x79\xfd\x73\xc6\x67\x9d\xf7\xe6\x40\x67\x9d\xf7\x74\x74\xd6\x39\x5e\xcf\x9d\x75\x9e\xfe\xb5\xfd\x57\x57\x0b\xff\x9e\xae\xf5\xb7\xb2\x16\x80\xb9\x5a\x40\x46\xb5\x30\xf7\xdd\xc4\xfe\x41\xd6\x02\xea\xb8\x16\xbe\x91\xd8\x9f\xca\x5a\x40\x1d\xd7\x02\xea\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x19\xd7\x02\x30\x57\x0b\xc8\xb8\x16\x60\xee\xae\x16\x90\x71\x2d\xe0\x98\x5c\x0b\x59\xf7\x05\x59\x0b\x38\x26\xd7\x02\xea\xb8\x16\x50\xc7\xb5\x90\xef\xe5\x2f\x65\x2d\xa0\x8e\x6b\x01\xe7\xc0\xb5\x80\x3a\xae\x05\xb8\x9e\xab\x85\xe4\x0b\xed\xef\x6b\x5f\x68\x47\x8d\x38\xf7\x1f\x19\x9f\xfb\xdf\x63\x7c\xee\x7f\xf2\x85\xf6\x81\xc4\x3e\xa7\x7c\xc1\x74\xc7\xa5\x2f\xfc\x7a\x62\xf7\x28\x5f\x30\xdd\x7b\xa4\x2f\x64\xdd\xad\xd2\x17\x32\x7b\x9d\xfc\xdb\x9f\xd9\x9a\x80\xd1\xb9\xff\x3d\xf6\x74\xe9\x0b\x99\x2d\x90\xbe\x90\x59\x23\x7d\x21\x31\x3e\xf7\x1f\xe7\xce\xe7\xfe\xf7\xd8\x03\xd2\x17\xf2\x98\xf7\x29\x5f\x68\x73\x6f\xc3\x9d\xca\x17\x6c\xcc\x3b\x94\x2f\x98\xee\x06\xe5\x0b\xa6\xa3\x73\xff\xed\x5e\x7e\x3b\xb1\xa5\xf5\xcf\x19\x9f\xfb\xdf\x9b\xc3\xb9\xca\x17\x4c\x47\xe7\xfe\xe3\xf5\x7a\xe7\xfe\x97\xf5\x02\x65\xff\xcb\x77\xae\xf6\x9d\xf5\xf5\x42\x66\x7a\xbd\x60\x8c\xd7\xce\xe9\xbb\x7d\x9b\x7f\x43\x92\xd7\xce\xa8\x93\xeb\x85\xf6\x17\xd4\x7a\xa1\xa7\xe3\xb5\x33\xea\x78\xed\x8c\x4c\xae\x17\x8c\xc9\xf5\x82\x31\xb9\x5e\x30\x26\xd7\x0b\xc6\xe4\x7a\xc1\x98\x5c\x2f\x64\xa6\xd7\x0b\x79\xee\x7a\xbd\x60\x4c\xae\x17\x6c\x4c\xb9\x5e\x68\xef\xa8\xaf\x17\x6c\x4c\xb9\x5e\x30\x9d\x5c\x2f\x98\x4e\xae\x17\xda\x83\xf5\xf5\x82\xe9\xe4\x7a\xc1\xe6\x20\xd7\x0b\xa6\x93\xeb\x85\x7c\x3d\x77\xee\x7f\x7a\x8e\xe4\xb3\xff\x79\x2d\xde\xbe\x56\xd6\x02\x30\xfd\x1c\xc9\x98\x7c\x8e\x94\x7e\x01\xa0\xf2\x1c\xc9\x74\xf2\x39\x52\x7b\xb5\xac\x05\xd4\xc9\xe7\x48\xa6\x93\xcf\x91\x8c\xc9\xe7\x48\xc6\xe4\x73\x24\x63\xf2\x39\x92\x31\xf9\x1c\xc9\x98\x7c\x8e\x64\x4c\x3e\x47\xca\x4c\x3f\x47\xca\x73\xd7\xcf\x91\x8c\xc9\xe7\x48\x36\xa6\x7c\x8e\xd4\x6e\x94\xb5\x80\x63\xca\xe7\x48\xa6\x93\xcf\x91\x4c\x27\x9f\x23\xb5\x9b\x64\x2d\xa0\x4e\x3e\x47\xb2\x39\xc8\xe7\x48\xa6\x93\xcf\x91\xf2\xf5\xdc\xda\x39\xed\x2f\xb4\x2b\xdd\x77\xa4\xf4\x8c\xb6\x7d\x41\xa3\xf6\xda\x80\xb9\xbd\x36\x64\xbc\xd7\x96\xf6\x17\xda\x2b\x1a\xb5\xd7\x86\x3a\xde\x6b\x4b\xcf\x84\xdb\x74\xce\x9b\xdb\x6b\x43\x1d\xef\xb5\xa1\x8e\xf7\xda\x90\xf1\x5e\x1b\x32\xde\x6b\x43\xc6\x7b\x6d\xc8\x78\xaf\x0d\x19\xef\xb5\x21\xe3\xbd\x36\x60\x6e\xaf\x0d\xe6\xee\xf6\xda\x90\xf1\x5e\x1b\x8e\xc9\x7b\x6d\x59\x97\xb3\x9a\xbc\xd7\x86\x63\xf2\x5e\x1b\xea\x78\xaf\x0d\x75\xbc\xd7\x96\xef\xe5\x27\x1a\xb5\xd7\x86\x3a\xde\x6b\xc3\x39\xf0\x5e\x1b\xea\x78\xaf\x0d\xae\x67\xfb\x0b\xd4\xa7\xea\xb3\xff\x39\x1b\xa4\xb3\xff\x3d\x46\xd9\x7f\x64\x9c\xfd\x4f\xa9\xff\x9c\x62\xe8\x72\x6d\x93\xf5\x02\xea\x28\xfb\x9f\xb3\x48\x3a\xfb\x6f\x99\xe6\xbb\xd2\xbd\xfc\xa0\x31\xfb\x8c\xa5\xd1\x2c\xb3\xdd\xe5\xda\x6c\x0e\x38\x26\x65\xff\x7b\x6c\x43\xc0\x28\xfb\xdf\x63\x94\xfd\xef\x31\xca\xfe\xf7\x18\x65\xff\x91\x71\xf6\x1f\x5f\x33\xce\xfe\xf7\x18\x65\xff\x7b\x63\x52\xf6\xdf\x74\x32\xfb\xdf\x1b\x93\xb2\xff\x3d\x1d\x65\xff\x7b\x3a\xea\x53\x6d\xf3\xef\xda\xa4\xdf\x24\xb6\xde\x65\xf9\x39\xe3\xec\x7f\x6f\x0e\x94\xfd\xef\xe9\x28\xfb\x6f\x3a\x99\xfd\xcf\xe7\xfe\xcf\xfd\x23\x67\xff\xe7\xbe\xd4\x94\xbc\xb6\xcb\xfe\x23\xe3\xec\x7f\x66\x3a\xfb\x9f\x99\xce\xfe\xa3\x8e\xb3\xff\x9f\x6b\x1a\x77\xee\xbf\x65\xc0\xd3\x5d\x2c\x3e\xfa\xd6\x34\x8b\xcf\x4d\x5e\x13\xd4\x55\xb2\xff\x99\x6d\xed\xb1\xcd\xe2\x7a\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x07\xe6\xb2\xff\xf0\x9a\xb9\xec\x3f\x32\xce\xfe\xe3\x98\x9c\xf1\xcc\x3a\x9d\xfd\xc7\x31\x29\xe3\x99\x14\xf9\xff\xf0\xd9\x7f\xd4\x5d\x27\xe7\xa7\xb3\xff\xa8\xe3\xec\x3f\xce\x81\xb3\xff\xa8\xe3\xec\x3f\x5c\x8f\x33\x9e\x73\x5f\x6f\xa2\xec\xff\x5f\x34\xaa\x67\xfb\x2f\x9a\x7a\xf6\x1f\x19\xf5\x6c\xcf\xa5\x73\x56\x2b\xd9\x7f\xd4\x71\xcf\xf6\x67\x9a\x7a\xf6\x1f\x75\xdc\xb3\x8d\x3a\xee\xd9\x46\xc6\x3d\xdb\xc8\xb8\x67\x1b\x19\xf7\x6c\x23\xe3\x9e\x6d\x64\xdc\xb3\x8d\x8c\x7b\xb6\x81\xb9\x9e\x6d\x98\xbb\xeb\xd9\x46\xc6\x3d\xdb\x38\x26\xf7\x6c\x67\x9d\xce\xfe\xe3\x98\xdc\xb3\x8d\x3a\xee\xd9\x46\x1d\xf7\x6c\x7f\xa6\xa9\x67\xff\x51\xc7\x3d\xdb\x38\x07\xee\xd9\x46\x1d\xf7\x6c\xc3\xf5\x38\xfb\x3f\x76\x04\x99\xfd\xcf\xb5\xa5\xb3\xff\xc8\x38\xfb\x0f\xcc\xf9\xc2\xdf\x34\xf5\xec\x3f\xea\x38\xfb\x9f\x6b\x59\x67\xff\x51\xc7\xd9\x7f\xd4\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x98\xcb\xfe\xc3\xdc\x5d\xf6\x1f\x19\x67\xff\x71\x4c\xed\x0b\x3a\xfb\x8f\x63\x72\xf6\x1f\x75\x9c\xfd\x47\x1d\x67\xff\x3f\xd7\xd4\xb3\xff\xa8\xe3\xec\x3f\xce\x81\xb3\xff\xa8\xe3\xec\x3f\x5c\xaf\xe2\x0b\x3e\xfb\x9f\x6b\x4b\x67\xff\x81\x55\x7c\x41\x66\xff\xcd\x17\x74\xf6\x1f\x75\xda\x17\x74\xf6\x1f\x75\xda\x17\x74\xf6\x1f\x99\xf6\x05\x9d\xfd\x47\xa6\x7d\x41\x67\xff\x91\x69\x5f\xd0\xd9\x7f\x60\x15\x5f\xd0\xd9\x7f\x64\xda\x17\x74\xf6\x3f\xeb\x74\xf6\x1f\xc7\xd4\xbe\xa0\xb3\xff\xa8\xd3\xbe\xa0\xb3\xff\xa8\xd3\xbe\xa0\xb3\xff\xa8\xd3\xbe\x20\xb3\xff\x73\x69\x17\x78\xf4\x6f\xae\x16\xbe\xd8\x34\xd5\xec\x3f\x32\xce\x78\x02\xe3\x73\xff\xb3\x2f\xe4\x8c\xa7\xcb\xfe\xa3\x8e\xce\x77\x9e\xfb\x6c\xd3\x54\xb3\xff\xa8\xa3\xf3\x9d\x33\x3b\x9a\x9e\x79\x8f\xd5\xbd\x39\xe0\x98\x74\xbe\x73\x8f\x6d\x08\x18\x9d\xef\xdc\x63\x74\xbe\x73\x8f\xd1\xf9\xce\x3d\x46\xe7\x3b\x23\xe3\x8c\x67\xfa\xd7\xfc\x7f\xf8\x8c\x27\xea\xe8\x7c\xe7\x1e\xa3\x8c\xe7\x78\xbd\x3c\xc9\xf0\xcf\x7d\x91\x6a\x01\x5e\x6b\x97\xf1\xfc\x62\xa7\x73\xd9\x7f\xd4\x71\xc6\x13\xef\x85\x33\x9e\xa8\xa3\xf3\x9d\x7b\x3a\xce\x78\xa2\x8e\xce\x77\x46\x1d\x67\x3c\xb3\x2f\x88\xec\x7f\xaa\xad\x4a\xf6\x1f\x98\xf6\x05\x9d\xfd\xcf\xbe\x50\xc9\xfe\xa3\x4e\xfa\x42\x25\xfb\x8f\x3a\xe9\x0b\x95\xec\x3f\x32\xe9\x0b\x95\xec\x3f\x32\xe9\x0b\x95\xec\x3f\x32\xe9\x0b\x95\xec\x3f\x30\xed\x0b\x95\xec\x3f\x32\xe9\x0b\x95\xec\x7f\xd6\xe9\xec\x3f\x8e\x29\x7d\xa1\x92\xfd\x47\x9d\xf4\x85\x4a\xf6\x1f\x75\xd2\x17\x2a\xd9\x7f\xd4\x49\x5f\xd0\xd9\x7f\xf3\x85\xbb\x2a\xbe\xa0\xb3\xff\xc8\xb4\x2f\xc8\xec\xbf\xb1\x77\x24\xf6\x05\xe9\x0b\xfb\x03\x5f\xd0\xd9\x7f\xd4\xb1\x2f\xa0\xee\x0e\xe9\x0b\xbb\x02\x5f\xd8\x15\xf8\xc2\xae\xc0\x17\x76\x05\xbe\xb0\x2b\xf0\x85\x5d\x81\x2f\xe8\xec\x3f\xcc\xdd\xf9\x02\x32\xed\x0b\x3a\xfb\x9f\x75\x3a\xfb\x8f\x63\x4a\x5f\x18\x3b\xc2\x99\x83\xb1\x5a\xf8\x82\xce\xfe\xe3\xbd\x68\x5f\xd8\x1f\xf8\x82\xce\xfe\xa3\x4e\xfb\x82\xcc\xfe\x9b\x2f\xf8\xec\x7f\xae\x2d\x9d\xfd\x07\x56\xf1\x05\x99\xfd\x37\x5f\xd0\xd9\x7f\xd4\x69\x5f\xd0\xd9\x7f\xd4\x69\x5f\xd0\xd9\x7f\x64\xda\x17\x74\xf6\x1f\x99\xf6\x05\x9d\xfd\x47\xa6\x7d\x41\x67\xff\x81\x55\x7c\x41\x67\xff\x91\x69\x5f\xd0\xd9\xff\xac\xd3\xd9\x7f\x1c\x53\xfb\x82\xce\xfe\xa3\x4e\xfb\x82\xce\xfe\xa3\x4e\xfb\x82\xce\xfe\xa3\x4e\xfb\x82\xcc\xfe\xcf\x7d\xad\x91\xe7\xfe\xcf\x3d\xda\x94\xfc\x34\x67\xff\x91\xf1\xb9\xff\x3d\x46\xd9\xff\x94\xfa\xb7\xfc\xc2\xdc\x97\x8d\x4d\x0b\x1d\x67\xff\xff\xb4\x69\xaa\xd9\x7f\xd4\x71\xf6\x1f\x75\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xb6\x30\x60\x9c\xfd\x07\xe6\xb2\xff\x30\x77\x97\xfd\x47\xc6\x3d\x18\x38\x26\x65\xff\x4d\x97\x33\xfc\x77\xd7\xdf\x23\x97\xfd\x47\x1d\x67\xff\x51\xc7\xd9\x7f\xbc\x17\xce\xfe\xa3\x8e\xb3\xff\xa8\xe3\xec\x3f\xea\x38\xfb\x0f\x3a\xce\xfe\xcf\xfd\x7d\xa3\xb3\xff\xe3\x15\x6e\x2d\xfb\x0f\xcc\x65\xff\x91\x51\xf6\x7f\xee\xaf\x13\xd3\xd9\x7f\xd4\x71\xf6\xff\x8f\x9b\xa6\x9a\xfd\x47\x1d\x67\xff\x51\xc7\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x60\x2e\xfb\x0f\x73\x77\xd9\x7f\x64\x9c\xfd\xc7\x31\x39\xfb\x9f\x75\x3a\xfb\x8f\x63\x72\xf6\x1f\x75\x9c\xfd\x47\x1d\x67\xff\xf1\x5e\x38\xfb\x8f\x3a\xce\xfe\xa3\x8e\xb3\xff\xa8\xe3\xec\x3f\xe8\x38\xfb\x3f\xf7\x95\x46\x67\xff\xff\xac\x69\xaa\xd9\x7f\x60\xae\x1f\x09\x19\xf5\x23\xcd\xfd\x65\x62\x3a\xfb\x8f\x3a\xee\x47\xfa\xc3\xa6\xa9\x66\xff\x51\xc7\xfd\x48\xa8\xe3\x7e\x24\x64\xdc\x8f\x84\x8c\xfb\x91\x90\x71\x3f\x12\x32\xee\x47\x42\xc6\xfd\x48\xc8\xb8\x1f\x09\x98\xeb\x47\x82\xb9\xbb\x7e\x24\x64\xdc\x8f\x84\x63\x72\x3f\x52\xd6\xe9\xec\x3f\x8e\xc9\xfd\x48\xa8\xe3\x7e\x24\xd4\x71\x3f\x12\xde\x0b\xf7\x23\xa1\x8e\xfb\x91\x50\xc7\xfd\x48\xa8\xe3\x7e\x24\xd0\x71\xf6\x3f\xfb\x82\xc8\xfe\xe7\xda\xd2\xd9\x7f\x60\x2e\xfb\x8f\x8c\xb2\xff\xe6\x0b\x3a\xfb\x8f\x3a\xce\xfe\xe7\x5a\xd6\xd9\x7f\xd4\x71\xf6\x1f\x75\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x07\xe6\xb2\xff\x30\x77\x97\xfd\x47\xc6\xd9\x7f\x1c\x93\xb3\xff\x59\xa7\xb3\xff\x38\x26\x67\xff\x51\xc7\xd9\x7f\xd4\x71\xf6\x1f\xef\x85\xb3\xff\xa8\xe3\xec\x3f\xea\x38\xfb\x8f\x3a\xce\xfe\x83\x8e\xb3\xff\x79\xbd\x20\xb2\xff\xe9\x3b\x57\x25\xfb\x0f\xcc\xf5\x6c\x23\xa3\x9e\xed\xf1\x1a\xa1\x9a\xfd\x47\x1d\xf7\x6c\xa7\xef\x78\x95\xec\x3f\xea\xb8\x67\x1b\x75\xdc\xb3\x8d\x8c\x7b\xb6\x91\x71\xcf\x36\x32\xee\xd9\x46\xc6\x3d\xdb\xc8\x16\x06\x8c\x7b\xb6\x81\xb9\x9e\x6d\x98\xbb\xeb\xd9\x46\x26\xd7\x0b\x95\xec\x7f\xd6\xe9\xec\x3f\x8e\xc9\x3d\xdb\xa8\xe3\x9e\x6d\xd4\x71\xcf\x36\xde\x0b\xf7\x6c\xa3\x8e\x7b\xb6\x51\xc7\x3d\xdb\xa8\xe3\x9e\x6d\xd0\x71\xf6\x7f\x2e\x9d\xb6\x2c\xb2\xff\x8f\x34\x4d\x35\xfb\x0f\xcc\xd5\x02\x32\x99\xfd\x9f\x7b\x4c\xd6\x02\xea\xb8\x16\xfe\x24\x31\x99\xfd\xef\xe9\xb8\x16\x90\x71\x2d\xe0\x98\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x98\xab\x05\x98\x9f\xab\x05\x64\x5c\x0b\x38\x26\xd7\x42\xd6\xe9\xec\x3f\x8e\xc9\xb5\x80\x8c\x6b\x01\x19\xd7\x42\xbe\x17\x9d\xfd\x47\x1d\xd7\xc2\x23\x30\x07\xae\x05\xd4\x71\x2d\xc0\xf5\x38\xbf\x30\x97\x76\xe7\x44\xf6\xff\xcf\x93\x46\x67\xff\x81\xb9\xbc\x33\x32\xce\x3b\xff\x55\x62\x3a\xfb\x8f\x3a\xce\x3b\xff\xd1\x98\x55\xb2\xff\xa8\xe3\xbc\x33\xea\x38\xef\x8c\x8c\xf3\xce\xc8\x38\xef\x8c\x8c\xf3\xce\xc8\x38\xef\x8c\x8c\xf3\xce\xc0\x5c\xde\x19\x19\xe7\x9d\x61\xee\x2e\xef\x8c\x8c\xf3\xce\x38\x26\xe7\x9d\xb3\x4e\x67\xff\x71\x4c\xce\x3b\xa3\x8e\xf3\xce\xa8\xe3\xbc\x73\xba\x97\x4a\xf6\x1f\x75\x9c\x77\xc6\x39\x70\xde\x19\x75\x9c\x77\x86\xeb\x71\xde\x79\x2e\xa7\xfb\x7d\xf6\xff\xf3\xe9\x5a\x3a\xfb\x0f\xcc\xd5\x02\x32\xae\x85\xd4\x33\x50\xc9\xfe\xa3\x8e\x6b\xe1\xd3\x89\xe9\xec\x3f\xea\xb8\x16\x50\xc7\xb5\x80\x8c\x6b\x01\x19\xd7\x02\x32\xae\x05\x64\x5c\x0b\xc8\xb8\x16\x80\xb9\x5a\x40\xc6\xb5\x00\x73\x77\xb5\x80\x8c\x6b\x01\xc7\xe4\x5a\xc8\x3a\x9d\xfd\xc7\x31\xb9\x16\x50\xc7\xb5\x80\x3a\xae\x85\x7c\x2f\x3a\xfb\x8f\x3a\xae\x05\x9c\x03\xd7\x02\xea\xb8\x16\xe0\x7a\xae\x16\x72\x57\x91\xcf\xfe\xa7\xda\xaa\x64\xff\x81\xb9\xec\x3f\xb2\xbf\x57\xbe\x50\xc9\xfe\xa3\x8e\xb3\xff\xf9\x6f\x80\xce\xfe\xa3\x8e\xb3\xff\xa8\xe3\xec\x3f\x32\xce\xfe\x23\xe3\xec\x3f\x32\xce\xfe\x23\xe3\xec\x3f\x32\xce\xfe\x23\xe3\xec\x3f\x30\x97\xfd\x87\xb9\xbb\xec\x3f\x32\xce\xfe\xe3\x98\x9c\xfd\xcf\x3a\x9d\xfd\xc7\x31\x39\xfb\x8f\x3a\xce\xfe\xa3\x8e\xb3\xff\xf9\x5e\x74\xf6\x1f\x75\x9c\xfd\xc7\x39\x70\xf6\x1f\x75\x9c\xfd\x87\xeb\x71\xf6\x3f\xaf\x17\x44\xf6\x3f\x7d\xe7\xaa\x64\xff\x81\xe9\xf5\x82\xce\xfe\xa7\x95\x42\x2d\xfb\x8f\x3a\xb9\x5e\xa8\x64\xff\x51\xc7\xeb\x05\xd4\xc9\xf5\x42\x25\xfb\x8f\x4c\xae\x17\x2a\xd9\x7f\x64\x72\xbd\x50\xc9\xfe\x23\x93\xeb\x85\x4a\xf6\x1f\xe6\xae\xd7\x0b\x95\xec\x3f\x8e\x29\xd7\x0b\x95\xec\x3f\x8e\x29\xd7\x0b\x95\xec\x3f\xea\xe4\x7a\xa1\x92\xfd\x47\x1d\xaf\x17\x70\x0e\x72\xbd\x50\xc9\xfe\xc3\xf5\x38\xfb\x9f\x9f\x23\x89\xec\x7f\x5a\x8b\x57\xb2\xff\xc0\xf4\x73\x24\x9d\xfd\xcf\xcf\x91\x2a\xd9\x7f\xd4\xc9\xe7\x48\x95\xec\x3f\xea\xe4\x73\xa4\x4a\xf6\x1f\x99\x7c\x8e\x54\xc9\xfe\x23\x93\xcf\x91\x2a\xd9\x7f\x64\xf2\x39\x52\x25\xfb\x0f\x4c\x3f\x47\xaa\x64\xff\x91\xc9\xe7\x48\x95\xec\x7f\xd6\xe9\xec\x3f\x8e\x29\x9f\x23\x55\xb2\xff\xa8\x93\xcf\x91\x2a\xd9\x7f\xd4\xc9\xe7\x48\x95\xec\x3f\xea\xe4\x73\x24\x9d\xfd\xcf\xfb\x0b\x22\xfb\x9f\x9e\xd1\x56\xb2\xff\xc0\xdc\x5e\x1b\x32\xde\x6b\x4b\xfb\x0b\x95\xec\x3f\xea\x78\xaf\x2d\x3d\x13\xae\x64\xff\x51\xc7\x7b\x6d\xa8\xe3\xbd\x36\x64\xbc\xd7\x86\x8c\xf7\xda\x90\xf1\x5e\x1b\x32\xde\x6b\x43\xc6\x7b\x6d\xc8\x78\xaf\x0d\x98\xdb\x6b\x83\xb9\xbb\xbd\x36\x64\xbc\xd7\x86\x63\xf2\x5e\x5b\xd6\xe9\xec\x3f\x8e\xc9\x7b\x6d\xa8\xe3\xbd\x36\xd4\xf1\x5e\x5b\xbe\x17\x9d\xfd\x47\x1d\xef\xb5\xe1\x1c\x78\xaf\x0d\x75\xbc\xd7\x06\xd7\x3b\x32\xc9\x46\x4d\xae\x97\x72\x6d\x22\xfb\x9f\xb2\x41\x95\xec\x3f\x32\xce\xfe\x03\xe3\xec\x7f\xce\x2f\xe8\x73\xff\x7b\x3a\xce\xfe\xa7\x2c\x52\x25\xfb\x8f\x3a\x3a\xf7\xbf\xa7\xa3\x73\xff\x7b\x8c\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x8f\x8c\xb3\xff\xc8\x38\xfb\x0f\xcc\x65\xff\x61\xee\x2e\xfb\x8f\x8c\xb3\xff\x38\x26\x67\xff\xb3\x4e\x67\xff\x71\x4c\xce\xfe\xa3\x8e\xb2\xff\xf6\x1b\x0c\x39\x0b\x4d\xe7\xfe\xdb\xbd\xc8\x73\xff\x7b\xd7\xe3\xec\x3f\xce\x81\xb3\xff\xa8\xe3\xec\x3f\x5c\xcf\xfa\x54\xbf\x5a\x7a\x3e\xfe\x60\xfc\xaf\xc7\x26\xbd\x79\x8f\x95\x7f\x3f\x3a\xd6\x1c\x4b\xcf\x61\x2d\xe3\xa9\xd9\x29\xc6\x96\x78\x66\x19\xcf\xc7\x4a\x3f\xd2\x89\xc4\x7e\x3c\xb1\x47\x8c\xad\x16\xba\x07\x8d\x4d\xf2\xda\x87\x13\x7b\x46\x62\x1f\x37\xb6\x43\xe8\xee\x32\xb6\x59\xe8\xf6\x94\x39\x78\xb6\x35\xd0\x6d\x0c\xd8\x32\x63\x9b\x04\xbb\x38\xd0\x9d\x17\xb0\xa9\xfa\xdc\x2d\xe3\x29\xe7\x6e\x19\xcf\xc7\x4a\x3f\x12\xb2\x87\xcb\x7b\xe4\xc7\xbc\x9f\x58\xd6\x5d\x94\xd8\x07\x8d\x4d\x8b\x31\xf7\xd3\x7d\xa2\xee\xa6\xc2\xbc\xee\x3a\x62\x87\x81\x4d\xd7\x3f\x67\x96\xf1\x94\xaf\xb5\x65\x3c\x1f\x2b\xfd\x48\xa8\x3b\xa3\x7e\x3d\xcb\x78\xb6\xdf\xdd\x30\x38\x90\xd8\xff\x2f\xd5\xc2\x53\xa1\x67\x3b\xff\xfb\x91\xa4\x49\x7f\xc3\xa1\x67\xdb\x31\xd7\xb3\x8d\x8c\x7b\xb6\x7f\x37\xb1\xa7\x24\xc6\x3d\xdb\xa8\xe3\x9e\xed\xfb\x12\xcb\x7d\x9c\xdc\xb3\x8d\x3a\xee\xd9\x46\xdd\xed\x34\x07\x64\x5d\xcf\xb6\x67\xeb\x03\xc6\x3d\xdb\xc8\xb8\x67\x1b\x19\xf7\x6c\x23\xe3\x9e\x6d\x60\xd0\xb3\xed\xde\x07\xe8\xd9\xf6\x8c\x7b\xb6\x71\x4c\xee\xd9\xce\xba\xfc\x37\x95\x7b\xb6\x71\x4c\xee\xd9\x46\x1d\xf7\x6c\xa3\x8e\x7b\xb6\xef\x03\xf6\xe2\xfa\xe7\xcc\xf5\x6c\xe3\x1c\xb8\x67\x1b\x75\xdc\xb3\x0d\xd7\xb3\x9e\x6d\xf6\x85\x73\x2b\xbe\x70\x56\xe0\x0b\x67\x05\xbe\x70\x56\xe0\x0b\xe7\x04\xbe\x70\x16\xf9\x02\xd6\xf2\xff\x0a\x7c\xe1\x2c\xf2\x05\xaf\xdb\x43\x73\x40\xb6\x35\xd0\x6d\x0c\x58\xe7\x0b\x9e\x5d\x1c\xe8\xce\x0b\xd8\x54\x7d\xee\x15\x5f\x38\x2b\xf0\x85\xb3\xc8\x17\xfc\x98\xf7\xcb\xf7\xef\xcc\xc0\x17\xce\x22\x5f\xf0\x3a\xed\x0b\x67\x05\xbe\x70\x56\xe0\x0b\x67\x91\x2f\xf8\x39\x68\x5f\x38\x2b\xf0\x85\xb3\xc8\x17\x6e\x03\x5f\xf8\x9e\x8a\x2f\xcc\x0b\x7c\x61\x5e\xe0\x0b\xf3\x02\x5f\x78\x5c\xe0\x0b\xf3\xea\xbe\x30\xfa\x9f\xc0\x17\xe6\xd5\x7d\xc1\x74\xd2\x17\x8c\x49\x5f\x30\x26\x7d\xc1\x98\xf4\x05\x63\xd2\x17\x8c\x49\x5f\x30\x26\x7d\x21\xb3\x8a\x2f\xcc\x0b\x7c\x61\x5e\xdd\x17\x6c\x4c\xed\x0b\xa7\x04\xbe\x30\x2f\xf0\x85\x53\x02\x5f\x98\x17\xf8\xc2\xbc\xc0\x17\xe6\xd5\x7d\xc1\xe6\xa0\x7d\x61\x5e\xe0\x0b\xf3\x9a\x7e\xc6\x33\x5f\x2f\x9f\xc2\xff\xef\x2e\xd7\x36\x9b\xae\xf5\x37\x8d\xca\x78\x22\xe3\x8c\x27\x30\x97\xf1\xfc\x64\x62\xdf\x68\x1a\x91\xf1\x44\x1d\x67\x3c\x3f\x9e\x58\xfa\xad\x26\x97\xf1\x44\x1d\x67\x3c\x51\xc7\x19\x4f\x64\x9c\xf1\x44\xc6\x19\x4f\x64\x9c\xf1\x44\xc6\x19\x4f\x64\x9c\xf1\x44\xc6\x19\x4f\x60\x2e\xe3\x09\x73\x77\x19\x4f\x64\x9c\xf1\xc4\x31\x39\xe3\x99\x75\x79\x3f\x97\x33\x9e\x38\x26\x67\x3c\x51\xc7\xd9\x7f\xd4\x71\xc6\x13\xef\x85\x33\x9e\xa8\xe3\x8c\x27\xea\x38\xe3\x89\x3a\xce\x78\x82\xce\xd6\xce\xe4\x0b\xa3\x87\xb5\x2f\x8c\x7e\xbb\xee\x0b\x99\x69\x5f\x30\x26\x7d\x61\x74\xbc\xee\x0b\xa6\xd3\xbe\x70\x6f\xdd\x17\x4c\xa7\x7d\xe1\xde\xc0\x17\xee\x0d\x7c\xe1\xde\xc0\x17\xee\x0d\x7c\xe1\xde\xc0\x17\xee\x0d\x7c\xe1\xde\xc0\x17\xee\xad\xfb\x42\x9e\xbb\xf6\x05\x63\xda\x17\xee\xad\xfb\xc2\xe8\x57\xea\xbe\x60\x63\x4a\x5f\x30\x9d\xf4\x05\xd3\x49\x5f\xb0\x7b\x91\xbe\x60\x3a\xed\x0b\xf7\xd6\x7d\xc1\x74\xd2\x17\xb2\xce\x65\xff\xb3\x2f\xbc\xaf\xe2\x0b\x7b\x03\x5f\xd8\x1b\xf8\xc2\xde\xc0\x17\x7e\x31\xf0\x85\xbd\x81\x2f\xdc\x12\xf8\xc2\xde\xc0\x17\x6e\x09\x7c\xe1\x96\xc0\x17\x6e\x09\x7c\xe1\x96\xc0\x17\x6e\x09\x7c\xe1\x96\xc0\x17\x6e\x09\x7c\xe1\x96\xc0\x17\xf6\x06\xbe\xb0\x37\xf0\x85\x5b\x02\x5f\xd8\x1e\xf8\xc2\xde\xc0\x17\xb6\x07\xbe\xb0\x37\xf0\x85\x5b\x02\x5f\xd8\x1b\xf8\xc2\x2d\x81\x2f\xec\x0d\x7c\xe1\x96\xc0\x17\x7e\xd6\xd5\x42\xae\xad\xab\x1b\x95\xfd\x07\x56\xf1\x85\xab\x03\x5f\xb8\x36\xf0\x85\xab\x03\x5f\x98\x0e\x7c\xe1\xea\xc0\x17\xa6\x03\x5f\x98\x0e\x7c\x61\x3a\xf0\x85\xe9\xc0\x17\xa6\x03\x5f\x98\x0e\x7c\x61\x3a\xf0\x85\x69\xf2\x05\xf7\x3e\xb8\xec\x3f\x32\xed\x0b\xd3\x81\x2f\xbc\x20\xf0\x85\xab\x03\x5f\x78\x41\xe0\x0b\x57\x07\xbe\x30\x4d\xbe\xe0\xe7\xa0\x7d\x61\x3a\xf0\x85\xab\x03\x5f\x98\x6e\x38\xfb\xff\xd8\xfc\xc5\x73\x0f\xa7\x5a\x78\x4e\x2f\xfb\xbf\x64\xfe\xe2\xb9\xdf\x49\x9a\xd4\x1f\xde\xcb\xfe\x13\xeb\x65\xff\x99\x61\xf6\x7f\xcc\x8e\x27\x96\x7f\x43\x17\xcf\xfd\x67\x1d\x66\xff\xc7\xec\x63\x89\xe5\xbd\x28\xcc\xfe\xb3\x0e\xb3\xff\xac\xbb\x8d\xe6\x80\x6c\x4b\xa0\x5b\x47\x73\x40\x86\xd9\x7f\x66\x17\x06\x63\x2e\x0c\xd8\xa9\xf5\xb9\xf7\xb2\xff\x34\xf7\x5e\xf6\x9f\x19\xf6\x60\xf0\x98\x98\xfd\xef\x74\xf9\x79\xd0\xdd\xf5\xf7\xa8\x97\xfd\x67\xdd\x36\xc9\xb2\xee\x9a\x60\x7e\x57\xd4\x3f\x67\xbd\xec\x3f\xeb\xce\xa7\xd7\x13\x75\x83\xfa\xf5\x5c\xf6\xff\x53\xa9\x16\x06\x90\xfd\xcf\x75\xf7\x5b\x63\xcd\xf0\x5f\x9b\x7e\xf6\xdf\x31\xc8\x78\x7a\xc6\xd9\xff\x63\x89\xfd\x77\x62\x9f\x0f\x74\xa5\x07\xc3\x74\xf7\x26\x96\xba\x08\x21\xfb\xef\x75\xa5\x07\x43\xe8\x4a\x0f\x86\x60\xaf\x0f\x74\x6b\x03\xd6\xf5\x60\x78\x56\x7a\x30\x04\x3b\x27\x18\xf3\x94\xfa\xdc\x21\xfb\xef\xe6\x0e\xd9\x7f\xcf\xba\x1e\x0c\x3f\x26\x67\xff\xb3\xee\xaf\x12\xeb\x32\x9e\x7e\x4c\xce\xfe\xa3\xae\xcb\x78\x7a\xdd\xc6\x60\x7e\xcb\xea\x9f\xb3\xae\x07\x43\xe8\xba\xec\xbf\xd7\x4d\xd5\xaf\xe7\xb2\xff\x0f\x8e\xff\x75\xf8\x67\xae\x1f\x69\x26\x69\x4e\x34\xaa\x1f\x09\x98\xeb\x47\x42\xc6\xfd\x48\xc3\xc4\x3e\x0d\xb5\xd0\xf5\x23\xa1\x8e\xfb\x91\x3e\x9a\xd8\x2c\xd4\x42\xd7\x8f\x84\x3a\xee\x47\x42\x1d\xf7\x23\x21\xe3\x7e\x24\x64\xdc\x8f\x84\x8c\xfb\x91\x90\x71\x3f\x12\x32\xee\x47\x42\xc6\xfd\x48\xc0\x5c\x3f\x12\xcc\xdd\xf5\x23\x21\xe3\x7e\x24\x1c\x93\xfb\x91\xb2\xee\x3e\xa8\x85\xae\x1f\x09\xc7\xe4\x7e\x24\xd4\x71\x3f\x12\xea\xb8\x1f\x09\xef\x85\xfb\x91\x50\xc7\xfd\x48\xa8\xe3\x7e\x24\xd4\x71\x3f\x12\xe8\x20\xfb\x7f\xa0\xf3\x85\xe1\xaf\xba\xec\x7f\xae\xad\x77\x34\x2a\xfb\x0f\xcc\x65\xff\x91\x71\xf6\x3f\xfb\xc2\xdd\xe4\x0b\x8b\x9c\x8e\x6b\x21\xd7\xf2\x5b\xfa\xbe\x30\xb8\xc7\xe9\xb8\x16\x50\xd7\xd5\xc2\x01\xc7\xba\x5a\xf0\x6c\x6d\xc0\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x00\xcc\x65\xff\x61\xee\x2e\xfb\x8f\x8c\x6b\x01\xc7\xe4\xec\x7f\xd6\xfd\x02\xf9\xc2\xb4\x1b\x93\xb3\xff\xa8\xe3\xec\x3f\xea\xb8\x16\xf0\x5e\x38\xfb\x8f\x3a\xae\x05\xd4\x71\xf6\x1f\x75\x5c\x0b\xa0\xeb\x65\xff\xcb\x7a\x61\x78\x63\xaf\x67\xbb\x7c\xe7\x1a\x5e\xd7\x70\xcf\x36\xb1\x5e\xcf\x36\x33\xec\xd9\x2e\xeb\x85\xe1\x6b\x69\xbd\xe0\x75\xd8\xb3\x5d\xbe\xe3\x0d\x5f\x4a\xeb\x05\xaf\xc3\x9e\x6d\xd6\xdd\x46\x73\x40\xb6\x25\xd0\xad\xa3\x39\x20\xc3\x9e\x6d\x66\x17\x06\x63\x2e\x0c\xd8\xa9\xf5\xb9\xf7\x7a\xb6\x69\xee\xbd\x9e\x6d\x66\x72\xbd\x60\x63\x62\xcf\x76\xa7\xfb\x69\x5a\x2f\xf8\x31\xf7\xd2\x7d\xa2\x6e\x9b\x64\xd7\xd1\x7a\xc1\xcf\xef\x8a\xfa\xe7\xac\xd7\xb3\xcd\xba\xf3\xe9\xf5\x44\xdd\xa0\x7e\xbd\x5e\xf6\x7f\xcc\x1e\x4a\xb5\x70\xb9\xab\x85\xdf\x4e\x9a\xe7\xca\x5a\x00\xe6\x6a\x01\x19\xd7\xc2\x5c\x53\x7e\x37\x6f\xf8\x7c\x7a\x9d\x51\xc7\xb5\xf0\x9b\x89\xfd\x90\xac\x05\xd4\x71\x2d\xa0\x8e\x6b\x01\x19\xd7\x02\x32\xae\x05\x64\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x00\xe6\x6a\x01\xe6\xee\x6a\x01\x19\xd7\x02\x8e\xc9\xb5\x90\x75\x4f\x95\xb5\x80\x63\x72\x2d\x20\xe3\x5a\x40\xc6\xb5\x90\xef\xe5\x62\x59\x0b\xa8\xe3\x5a\xc0\x39\x70\x2d\xa0\x8e\x6b\x01\xae\xe7\xf2\x0b\xe9\x17\x95\x86\xe7\xb9\xf5\xc2\xfd\x49\x93\x4f\xf9\xe4\xbc\x33\x30\x97\x77\x46\xc6\x79\xe7\x51\x62\xb9\x77\x88\xf3\xce\xa8\xe3\xbc\xf3\x3d\x63\xd6\xfe\xbf\xc4\x38\xef\x8c\x3a\xce\x3b\xa3\x8e\xf3\xce\xc8\x38\xef\x8c\x8c\xf3\xce\xc8\x38\xef\x8c\x8c\xf3\xce\xc8\x38\xef\x0c\xcc\xe5\x9d\x91\x71\xde\x19\xe6\xee\xf2\xce\xc8\x38\xef\x8c\x63\x72\xde\x39\xe9\xda\xdc\xdb\xc0\x79\x67\x1c\x93\xf3\xce\xa8\xe3\xbc\x33\xea\x38\xef\x9c\xee\x65\x38\x95\x18\xe7\x9d\x51\xc7\x79\x67\x9c\x03\xe7\x9d\x51\xc7\x79\x67\xb8\x9e\xcb\x3b\xa7\xf4\x71\x7b\xd2\xd5\xc2\x27\xd2\xb5\xfe\xaf\xac\x05\x60\xae\x16\x90\x71\x2d\xb4\x89\x7d\x4d\xd6\x02\xea\xb8\x16\x7e\x23\xb1\x3f\x96\xb5\x80\x3a\xae\x05\xd4\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x19\xd7\x02\x32\xae\x05\x60\xae\x16\x90\x71\x2d\xc0\xdc\x5d\x2d\x20\xe3\x5a\xc0\x31\xb9\x16\xb2\xee\xcf\x64\x2d\xe0\x98\x5c\x0b\xa8\xe3\x5a\x40\x1d\xd7\x42\xbe\x97\x2f\xc9\x5a\x40\x1d\xd7\x02\xce\x81\x6b\x01\x75\x5c\x0b\x70\x3d\xa8\x85\x03\x9d\x2f\xb4\x0f\x6b\x5f\x68\xdb\x46\x65\xff\x81\xb9\xec\x3f\x32\xce\xfe\x27\x5f\x68\x3f\x99\x18\x67\xff\x51\xc7\xd9\xff\xfc\x37\xe0\x57\x13\xe3\xec\x3f\xea\x38\xfb\x8f\x3a\xce\xfe\x23\xe3\xec\x3f\x32\xce\xfe\x23\xe3\xec\x3f\x32\xce\xfe\x23\xe3\xec\x3f\x32\xce\xfe\x03\x73\xd9\x7f\x98\xbb\xcb\xfe\x23\xe3\xec\x3f\x8e\xc9\xd9\xff\xac\xfb\xcd\xc4\x38\xfb\x8f\x63\x72\xf6\x1f\x75\x9c\xfd\x47\x1d\x67\xff\xf3\xbd\xdc\x9f\x18\x67\xff\x51\xc7\xd9\x7f\x9c\x03\x67\xff\x51\xc7\xd9\x7f\xb8\x5e\x2f\xfb\x5f\xd6\x0b\xed\x07\xf5\x7a\xa1\xfd\xc5\xfa\x7a\x21\x33\xbd\x5e\x30\x26\xd7\x0b\xed\xfb\x1a\xb5\x76\x46\x9d\x5c\x2f\xb4\x37\xd7\xd7\x0b\xa6\x93\xeb\x05\xd3\xc9\xf5\x82\x31\xb9\x5e\x30\x26\xd7\x0b\xc6\xe4\x7a\xc1\x98\x5c\x2f\x18\x93\xeb\x05\x63\x72\xbd\x90\x99\x5e\x2f\xe4\xb9\xeb\xf5\x82\x31\xb9\x5e\xb0\x31\xe5\x7a\xa1\xbd\xad\xbe\x5e\xb0\x31\xe5\x7a\xc1\x74\x72\xbd\x60\x3a\xb9\x5e\x68\xf7\xd7\xd7\x0b\xa6\x93\xeb\x05\x9b\x83\x5c\x2f\x98\x4e\xae\x17\xf2\xf5\x7a\xd9\xff\xf2\x1c\xa9\xbd\x49\x3f\x47\x6a\x5f\x23\x6b\x01\x98\x7e\x8e\x64\x4c\x3e\x47\x6a\xdf\x20\x6b\x01\x75\xf2\x39\x52\xbb\x5a\xd6\x02\xea\xe4\x73\x24\xd3\xc9\xe7\x48\xc6\xe4\x73\x24\x63\xf2\x39\x92\x31\xf9\x1c\xc9\x98\x7c\x8e\x64\x4c\x3e\x47\x32\x26\x9f\x23\x65\xa6\x9f\x23\xe5\xb9\xeb\xe7\x48\xc6\xe4\x73\x24\x1b\x53\x3e\x47\x6a\xd7\xcb\x5a\xc0\x31\xe5\x73\x24\xd3\xc9\xe7\x48\xa6\x93\xcf\x91\xda\x97\xcb\x5a\x40\x9d\x7c\x8e\x64\x73\x90\xcf\x91\x4c\x27\x9f\x23\xe5\xeb\xb9\xb5\x73\xda\x5f\x68\x57\xb8\xef\x48\xe9\x19\x6d\xfb\x53\x8d\xda\x6b\x03\xe6\xf6\xda\x90\xf1\x5e\x5b\xda\x5f\x68\x97\x36\x6a\xaf\x0d\x75\x72\x7f\xa1\xcd\x67\xe1\xf2\x5e\x1b\xea\xe4\xfe\x82\xe9\x78\xaf\x0d\x19\xef\xb5\x21\xe3\xbd\x36\x64\x72\x7f\xc1\x98\xdc\x5f\x30\x26\xf7\x17\x8c\xc9\xfd\x85\xcc\xdc\x5e\x1b\xcc\xdd\xed\xb5\x21\x93\xfb\x0b\x36\x26\xef\xb5\x65\x5d\xce\x6a\xf2\x5e\x1b\x8e\xc9\x7b\x6d\xa8\xe3\xbd\x36\xd4\xc9\xfd\x85\xf6\x39\x8d\xda\x6b\x43\x9d\xdc\x5f\xb0\x39\xf0\x5e\x1b\xea\xe4\xfe\x42\xbe\x9e\xed\x2f\x7c\xb5\xac\x17\x52\xae\xad\xfd\x91\x2e\xd7\x66\xf7\x91\xb2\x41\xed\x05\x4d\xd7\xa7\xaa\xd9\x44\x37\xe9\xfb\x02\x66\x7d\xaa\x8f\x95\x5a\x48\xb9\xb6\xf6\x49\x89\x7d\xc1\xd8\x64\xbd\x80\xba\x07\x8c\x4d\x6a\x21\x65\x91\xda\x85\x89\xdd\x67\x6c\x52\x0b\xa8\xbb\xd3\xd8\xe4\x33\x86\xba\x3b\xca\x1c\x0e\x38\x76\x43\xd1\x79\xb6\x21\x60\x4b\x8d\x4d\x6a\x01\xd9\x45\x45\x77\xc8\xb1\x73\x83\xfb\x9c\x57\xe6\xfe\x28\x33\xeb\x53\x7d\xac\xd4\x02\xcc\xdd\xfa\x54\x1f\x2b\xb5\x80\xec\x21\x7a\x8f\x70\xcc\x99\xc2\xf0\x7d\x38\x2f\xb1\x0f\x94\xf7\x68\xda\x8d\xb9\xaf\xdc\xe7\x21\xa7\xbb\xb1\xb0\x93\x4e\x77\x2d\xb1\xc3\xc0\x96\xd7\x3f\x67\xd6\xa7\xfa\x58\xa9\x05\x9c\xc3\x05\xe5\xf5\x3c\xe1\x74\xa7\x97\xeb\xcd\xf0\xf5\xac\x4f\x75\x07\x9d\xfb\x3f\xf9\xcd\xf9\xcd\xa5\x17\xe4\x3d\x63\x4d\x3e\x1f\xdd\x32\x9e\x9a\x9d\x62\x6c\x89\x67\x96\xf1\xdc\x5c\xfa\x91\x3e\x38\x66\x47\x1f\x19\xb3\x63\xcf\x35\xb6\x5a\xe8\x1e\x34\x36\xe9\x67\x79\x6b\x62\x78\xee\xff\xe6\xd2\x93\x83\xba\xbb\x8c\x59\x5f\x4a\x52\xd8\xb9\xff\x73\xef\xa1\x39\xe0\x98\x5b\xfb\xba\x1e\xdb\x18\xb0\x65\xc6\x36\x09\x76\x71\xa0\x3b\x2f\x60\x53\xf5\xb9\x5b\xc6\x53\xce\xdd\x32\x9e\x9b\x4b\x3f\x12\xb2\x87\xe9\x3d\xc2\x31\xef\x2f\x6c\x06\x74\x78\xee\xff\xe6\xd2\x8f\x84\x63\xee\x2f\xf7\xe9\x75\xaf\xa0\x39\xa0\xee\x3a\x39\x3f\x3c\xf7\x5f\x7e\xce\x2c\xe3\x29\x5f\x6b\xcb\x78\x76\xaf\x27\xea\xce\xa8\x5f\xcf\x32\x9e\xab\x4b\xed\xa5\x95\x78\x39\xf7\xff\x52\x3a\xf7\xff\x5d\x4d\xd7\xb3\x5d\x58\xfa\xd7\xfe\xb9\xff\x97\x96\xbf\x39\xc8\xf2\x33\xc0\x4b\x8a\x2f\xfc\x52\x62\x78\xee\xff\xa5\xc5\x17\x50\x97\x9f\x01\x4e\x17\x5f\x38\x90\x18\x9e\xfb\x7f\x69\xf1\x05\xd4\xbd\xdf\x74\x93\xbf\xb7\xa8\xbb\xdd\xd8\x64\x0e\xc8\xde\x50\x74\x9e\xad\x0f\xd8\xe5\xc6\x26\xbe\x80\xec\x99\x45\x77\xc8\xb1\x45\xc1\x7d\x9e\x56\xe6\xfe\x28\x33\xeb\xd9\xbe\xb4\xf8\x02\xcc\xdd\x7a\xb6\x2f\x2d\xbe\x80\xec\x53\x36\xe6\xe4\x3d\xc2\x31\x3f\x51\xde\xbf\x06\x74\x78\xee\xff\xa5\xc5\x17\x70\xcc\xb7\x18\x33\x5f\x48\x8a\xc5\xb3\xaf\x4c\x7f\x77\xde\x55\xd8\x49\xa7\x7b\x59\x99\xdf\x49\xb8\x17\x3c\xf7\x5f\x7e\xce\xac\x67\x7b\xba\xf8\x02\xce\xe1\x09\xa6\x9b\xf8\x02\xea\x1e\x57\xae\xf7\x18\x5f\xcf\x7a\xb6\xbb\x7e\xcd\xf4\x8b\x94\xe5\xdc\xff\xcd\xe5\xdf\x73\x6d\x2d\x20\x5f\xf0\xec\x14\xf9\x77\x65\x41\xdd\x17\x7a\xe7\xfe\x6f\x2e\xd9\x7f\xd4\x3d\x48\x7f\x73\x72\x2d\x3f\x9e\x7c\xc1\xeb\x3a\x5f\xf0\xba\x3d\x34\x07\x64\x5b\x03\xdd\xc6\x80\x75\xbe\xe0\xd9\xc5\x81\xee\xbc\x80\x4d\xd5\xe7\x0e\xbe\xe0\xe6\x0e\xbe\xe0\xd9\xc3\xf4\x1e\xe1\x98\xda\x17\xe6\x93\x2f\xf8\x31\xb5\x2f\xe0\xb9\xff\xcc\x16\x90\x2f\xe0\xbd\x2c\x20\x5f\xf0\xba\x67\xd7\x5f\x6b\xf0\x05\xaf\x3b\xa3\x7e\xbd\x8a\x2f\x7c\x1f\xfb\x82\xd5\xd6\x20\xf0\x85\x41\xe0\x0b\x83\xc0\x17\xce\x08\x7c\x61\x10\xf8\x42\x13\xf8\xc2\x20\xf0\x85\x26\xf0\x85\x26\xf0\x85\x26\xf0\x85\x26\xf0\x85\x26\xf0\x85\x26\xf0\x85\x26\xf0\x85\x26\xf0\x85\x41\xe0\x0b\x83\xc0\x17\x9a\xc0\x17\x4e\x0b\x7c\x61\xa0\x7c\xa1\xa7\xdb\x2e\x7d\x61\x10\xf8\xc2\x20\xf0\x85\x41\xe0\x0b\x4d\xe0\x0b\x83\xc0\x17\xf0\xdc\xff\x4b\xca\xf5\x7e\x6d\xfc\xaf\xa3\xef\x58\x2d\x94\x7f\x1f\x7d\x3d\xad\x31\xd2\x6f\x56\xcc\xbd\x9b\x34\xef\x1e\xb3\x51\x3a\xe9\xad\x9d\xe8\x26\xaf\x33\x30\x5b\x3b\x77\xb5\x90\xce\x94\xb7\x73\xff\xbf\x69\x6c\x52\x0b\xa8\x7b\xc0\xd8\xa4\x16\x0e\x26\x96\xf6\x0a\x6d\xed\x7c\x49\xa9\x05\xd4\xdd\x69\x6c\x33\x32\x3b\xf7\xff\x11\x9a\x03\x8e\x79\x43\xd1\x79\xb6\x21\x60\x4b\x8d\x4d\x6a\x01\xd9\x45\x45\x77\xc8\xb1\x73\xe9\x3e\x91\xcd\x2b\x73\x7f\x94\x99\xad\x9d\x2f\x29\xb5\x00\x73\xb7\xb5\xf3\x25\xa5\x16\x90\x3d\x44\xef\x11\x8e\x39\x53\x18\xbe\x0f\x9f\x6d\xba\xb5\xf3\x25\xa5\x16\x70\xcc\x7d\xe5\x3e\xd3\xfc\x46\xe9\x37\x7b\xe7\xf2\xb9\x50\x37\x16\x76\xd2\xe9\xae\x25\x86\xf7\xb2\xbc\xfe\x39\xb3\xb5\xf3\x25\xa5\x16\x50\x77\x41\x79\x3d\x4f\x38\xdd\xe9\xe5\x7a\x33\xac\xb3\xb5\x33\xf9\xc2\xe8\x21\xed\x0b\xa3\x23\x75\x5f\xc8\x4c\xfb\x82\x31\xe9\x0b\xa3\x4f\xd6\x7d\xc1\x74\xd2\x17\x46\x1f\xab\xfb\x82\xe9\xa4\x2f\x98\x4e\xfa\x82\x31\xe9\x0b\xc6\xa4\x2f\x18\x93\xbe\x60\x4c\xfa\x82\x31\xe9\x0b\xc6\xa4\x2f\x64\xa6\x7d\x21\xcf\x5d\xfb\x82\x31\xe9\x0b\x36\xa6\xf4\x85\xd1\x87\xeb\xbe\x60\x63\x4a\x5f\x30\x9d\xf4\x05\xd3\x49\x5f\xb0\x7b\x91\xbe\x60\x3a\xe9\x0b\xa6\x93\xbe\x60\x3a\xe9\x0b\x59\x57\xf1\x85\x3b\xd9\x17\xac\xb6\xf6\x35\xdd\x33\x55\xcd\xb4\x2f\xec\xab\xfb\x42\xef\xdc\x7f\xf6\x85\x7d\x81\x2f\xec\x0c\x7c\x61\x9f\xf4\x05\xd4\xdd\x21\x7d\x61\x67\xe0\x0b\x3b\x03\x5f\xd8\x19\xf8\xc2\xce\xc0\x17\x76\x06\xbe\xb0\x33\xf0\x85\x9d\x81\x2f\xec\x0b\x7c\x61\x5f\xe0\x0b\x3b\x03\x5f\xb8\x29\xf0\x85\x7d\xca\x17\x7a\x3a\xed\x0b\xfb\x02\x5f\xd8\x19\xf8\xc2\xbe\xc0\x17\x76\x06\xbe\xb0\x2f\xf0\x85\x9d\x81\x2f\x6c\xae\xf8\xc2\x9a\xc0\x17\xd6\x04\xbe\xb0\x26\xf0\x85\x97\x07\xbe\xb0\x26\xf0\x85\x15\x81\x2f\xac\x09\x7c\x61\x45\xe0\x0b\x2b\x02\x5f\x58\x11\xf8\xc2\x8a\xc0\x17\x56\x04\xbe\xb0\x22\xf0\x85\x15\x81\x2f\xac\x08\x7c\x61\x4d\xe0\x0b\x6b\x02\x5f\x58\x11\xf8\xc2\x92\xc0\x17\xd6\x04\xbe\xb0\x24\xf0\x85\x35\x81\x2f\xac\x08\x7c\x61\x4d\xe0\x0b\x2b\x02\x5f\x58\x13\xf8\xc2\x8a\x86\xb2\xff\x83\x45\xf3\x17\xcf\x7d\xa4\xf1\xe7\xfe\x8f\xbf\xff\x3d\x25\x7d\xff\xe3\xb3\x48\x12\x4b\xff\x9a\xff\x8f\x7e\xf6\x9f\x19\x66\xff\xc7\xec\xee\xc4\x52\xef\x78\x2f\xfb\xcf\x3a\xcc\xfe\x8f\xd9\xfe\xc4\xce\x4f\x0c\xb3\xff\xac\xc3\xec\x3f\xeb\x6e\xa3\x39\x20\xdb\x12\xe8\xd6\xd1\x1c\x90\x61\xf6\x9f\xd9\x85\xc1\x98\x0b\x03\x76\x6a\x7d\xee\xbd\xec\x3f\xcd\xbd\x97\xfd\x67\x86\x3d\x18\x3c\x26\x66\xff\x3b\x5d\x7e\x1e\x74\x77\xfd\x3d\xea\x65\xff\x59\xb7\x4d\xb2\xac\xbb\x26\x98\xdf\x15\xf5\xcf\x59\x2f\xfb\xcf\xba\xf3\xe9\xf5\x44\xdd\xa0\x7e\x3d\x97\xfd\x3f\x94\x6a\xe1\x74\x77\xee\xff\x2f\x8e\x35\xc3\x6f\x35\xea\xdc\x7f\x60\xee\xdc\x7f\x64\x9c\xfd\xbf\x33\xb1\xfc\x5b\x89\x7c\xee\x3f\xea\xf8\xdc\xff\xb7\x24\xf6\xf5\xc4\xf8\xdc\x7f\xd4\xf1\xb9\xff\xa8\xe3\x73\xff\x91\xf1\xb9\xff\xc8\xf8\xdc\x7f\x64\x7c\xee\x3f\x32\x3e\xf7\x1f\x19\x9f\xfb\x8f\x8c\xcf\xfd\x07\xe6\xce\xfd\x87\xb9\xbb\x73\xff\x91\xf1\xb9\xff\x38\x26\x67\xff\xb3\x2e\x9d\xb5\xea\xce\xfd\xc7\x31\x39\xfb\x8f\x3a\x3e\xf7\x1f\x75\x7c\xee\x3f\xde\x0b\x9f\xfb\x8f\x3a\x3e\xf7\x1f\x75\x7c\xee\x3f\xea\xf8\xdc\x7f\xd0\x1d\x99\x3c\xa3\x9e\xf8\xd0\x87\xc6\xff\x3a\xfc\x82\xeb\x47\xfa\xdf\x49\xf3\x60\xa3\xfa\x91\x80\xb9\x7e\x24\x64\xdc\x8f\xf4\xbe\xc4\xfe\x08\x6a\xa1\xeb\x47\x42\x1d\xf7\x23\xed\x49\xac\x85\x5a\xe8\xfa\x91\x50\xc7\xfd\x48\xa8\xe3\x7e\x24\x64\xdc\x8f\x84\x8c\xfb\x91\x90\x71\x3f\x12\x32\xee\x47\x42\xc6\xfd\x48\xc8\xb8\x1f\x09\x98\xeb\x47\x82\xb9\xbb\x7e\x24\x64\xdc\x8f\x84\x63\x72\x3f\x52\xd6\x1d\x86\x5a\xe8\xfa\x91\x70\x4c\xee\x47\x42\x1d\xf7\x23\xa1\x8e\xfb\x91\xf0\x5e\xb8\x1f\x09\x75\xdc\x8f\x84\x3a\xee\x47\x42\x1d\xf7\x23\x81\xce\x9d\xfb\x9f\x7c\x61\xf8\x61\x97\xfd\xcf\xb5\xf5\xae\x46\x65\xff\x81\xb9\xec\x3f\x32\xce\xfe\x67\x5f\xf8\x00\xf9\xc2\x22\xa7\xe3\x73\xff\x73\x2d\xef\xef\xfb\x82\x8d\x89\x3a\x3e\xf7\x1f\x75\x7c\xee\x3f\x32\x3e\xf7\x1f\x19\x9f\xfb\x8f\x8c\xcf\xfd\x47\xc6\xe7\xfe\x23\xe3\x73\xff\x91\xf1\xb9\xff\xc0\x5c\xf6\x1f\xe6\xee\xb2\xff\xc8\xf8\xdc\x7f\x1c\x93\xb3\xff\x59\xb7\x8b\x7c\x61\xda\x8d\xc9\xd9\x7f\xd4\x71\xf6\x1f\x75\x7c\xee\x3f\xde\x0b\x67\xff\x51\xc7\xe7\xfe\xa3\x8e\xb3\xff\xa8\xe3\x73\xff\x41\x87\xd9\xff\x6e\xbd\x30\x7c\x63\xaf\x67\xbb\x7c\xe7\x1a\x5e\xdf\x70\xcf\x36\xb1\x5e\xcf\x36\x33\xec\xd9\x2e\xeb\x85\xe1\xeb\x68\xbd\xe0\x75\xd8\xb3\x5d\xbe\xe3\x0d\xd7\xd2\x7a\xc1\xeb\xb0\x67\x9b\x75\xb7\xd1\x1c\x90\x6d\x09\x74\xeb\x68\x0e\xc8\xb0\x67\x9b\xd9\x85\xc1\x98\x0b\x03\x76\x6a\x7d\xee\xbd\x9e\x6d\x9a\x7b\xaf\x67\x9b\x99\x5c\x2f\xd8\x98\xd8\xb3\xdd\xe9\x56\xd2\x7a\xc1\x8f\xb9\x97\xee\x13\x75\xdb\x24\xbb\x9e\xd6\x0b\x7e\x7e\x57\xd4\x3f\x67\xbd\x9e\x6d\xd6\x9d\x4f\xaf\x27\xea\x06\xf5\xeb\xf5\xb2\xff\xdb\xe7\x2f\x1e\xa6\x0e\xea\xb9\x0f\xbb\x5a\x78\x47\xd2\xf8\x73\xff\x89\xb9\x5a\x40\xc6\xb5\x90\xd9\xf3\x65\x2d\xa0\x8e\x6b\x61\x5f\x62\xfe\xdc\x7f\xd6\x71\x2d\xa0\x8e\x6b\x01\x19\xd7\x02\x32\xae\x05\x64\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x00\xe6\x6a\x01\xe6\xee\x6a\x01\x19\xd7\x02\x8e\xc9\xb5\x90\x75\xfe\xdc\x7f\x1e\x93\x6b\x01\x19\xd7\x02\x32\xae\x85\x7c\x2f\xfe\xdc\x7f\xd6\x71\x2d\xe0\x1c\xb8\x16\x50\xc7\xb5\x00\xd7\x73\xf9\x85\xf4\xcb\xc8\xe2\xdc\xff\xb7\x27\x8d\x3e\xf7\x1f\x98\xcb\x3b\x23\xe3\xbc\xf3\xfb\x13\xd3\xe7\xfe\xa3\x8e\xf3\xce\x7b\xc7\xac\x72\xee\x3f\xea\x38\xef\x8c\x3a\xce\x3b\x23\xe3\xbc\x33\x32\xce\x3b\x23\xe3\xbc\x33\x32\xce\x3b\x23\xe3\xbc\x33\x30\x97\x77\x46\xc6\x79\x67\x98\xbb\xcb\x3b\x23\xe3\xbc\x33\x8e\xc9\x79\xe7\xac\xd3\xe7\xfe\xe3\x98\x9c\x77\x46\x1d\xe7\x9d\x51\xc7\x79\xe7\x74\x2f\x95\x73\xff\x51\xc7\x79\x67\x9c\x03\xe7\x9d\x51\xc7\x79\x67\xb8\x9e\xcb\xfe\xff\x72\xa3\xcf\xfd\x7f\x5b\xba\x96\x3e\xf7\x1f\x98\xab\x05\x64\x5c\x0b\xef\x4d\x4c\x9f\xfb\x8f\x3a\xae\x85\x3b\x12\xd3\xe7\xfe\xa3\x8e\x6b\x01\x75\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x98\xab\x05\x64\x5c\x0b\x30\x77\x57\x0b\xc8\xb8\x16\x70\x4c\xae\x85\xac\xd3\xe7\xfe\xe3\x98\x5c\x0b\xa8\xe3\x5a\x40\x1d\xd7\x42\xbe\x17\x7d\xee\x3f\xea\xb8\x16\x70\x0e\x5c\x0b\xa8\xe3\x5a\x80\xeb\xb9\x5a\x48\xbe\x20\xce\xfd\x4f\xb5\x55\x39\xf7\x1f\x98\xcb\xfe\x23\xe3\xec\x7f\xf2\x85\xca\xb9\xff\xa8\xe3\xec\x7f\xfe\x1b\xa0\xcf\xfd\x47\x1d\x67\xff\x51\xc7\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x60\x2e\xfb\x0f\x73\x77\xd9\x7f\x64\x9c\xfd\xc7\x31\x39\xfb\x9f\x75\xfa\xdc\x7f\x1c\x93\xb3\xff\xa8\xe3\xec\x3f\xea\x38\xfb\x9f\xef\x45\x9f\xfb\x8f\x3a\xce\xfe\xe3\x1c\x38\xfb\x8f\x3a\xce\xfe\xc3\xf5\x7a\xd9\xff\x31\x4b\x1d\x24\x74\xee\x7f\xf9\xce\x25\xce\xfd\x27\xa6\xd7\x0b\xe2\xdc\xff\x31\xbb\x2b\x31\x7f\xee\x3f\xeb\xe4\x7a\x41\x9c\xfb\xcf\x3a\xb9\x5e\x10\xe7\xfe\x33\x93\xeb\x05\x71\xee\x3f\x33\xb9\x5e\x10\xe7\xfe\x33\x93\xeb\x05\x71\xee\x3f\x31\xbd\x5e\x10\xe7\xfe\x33\x93\xeb\x05\x71\xee\x7f\xa7\xf3\xe7\xfe\xf3\x98\x72\xbd\x20\xce\xfd\x67\x9d\x5c\x2f\x88\x73\xff\x59\x27\xd7\x0b\xe2\xdc\x7f\xd6\xc9\xf5\x82\x3f\xf7\xbf\x7b\x8e\x44\xe7\xfe\x6f\x9f\xac\xc5\xc5\xb9\xff\xc4\xf4\x73\x24\x71\xee\xff\xf6\xf9\xf9\xc4\x7f\xfb\xdd\xbc\xb9\xbb\xe8\x75\x46\x9d\x7c\x8e\x24\xce\xfd\x67\x9d\x7c\x8e\x24\xce\xfd\x67\x26\x9f\x23\x89\x73\xff\x99\xc9\xe7\x48\xe2\xdc\x7f\x66\x5c\x0b\xc8\xe4\x73\x24\x71\xee\x3f\xcd\x5d\x3f\x47\x12\xe7\xfe\xf3\x98\xf2\x39\x92\x38\xf7\x9f\xc7\xa4\x5a\x48\x8a\xc5\xe3\x2a\x38\x73\x30\xfe\xff\xfc\x73\x24\x71\xee\x7f\x77\x2f\xfe\xdc\x7f\xd6\xc9\xe7\x48\xe2\xdc\x7f\xd6\xc9\xe7\x48\x95\x73\xff\xd3\xfe\x82\x38\xf7\x3f\x3d\xa3\xad\x9c\xfb\x0f\xcc\xed\xb5\x21\xe3\xbd\xb6\xb4\xbf\x50\x39\xf7\x1f\x75\xbc\xd7\x96\x9e\x09\x57\xce\xfd\x47\x1d\xef\xb5\xa1\x8e\xf7\xda\x90\xf1\x5e\x1b\x32\xde\x6b\x43\xc6\x7b\x6d\xc8\x78\xaf\x0d\x19\xef\xb5\x21\xe3\xbd\x36\x60\x6e\xaf\x0d\xe6\xee\xf6\xda\x90\xf1\x5e\x1b\x8e\xc9\x7b\x6d\x59\xa7\xcf\xfd\xc7\x31\x79\xaf\x0d\x75\xbc\xd7\x86\x3a\xde\x6b\xcb\xf7\xa2\xcf\xfd\x47\x1d\xef\xb5\xe1\x1c\x78\xaf\x0d\x75\xbc\xd7\x06\xd7\xb3\xfd\x85\xee\x7a\xe9\x1b\x57\x39\xf7\xbf\xec\x47\xdb\x59\xed\xef\x69\x7a\xb9\x36\xd3\xa4\xdc\x50\xef\xdc\xff\xcd\xe5\x6f\x0e\x30\xeb\x53\xdd\x3c\xa9\x85\x74\xe2\xff\xe2\x71\x15\x9c\x39\x98\xeb\x32\x53\x8b\x9c\xee\x01\x63\x93\x5a\x48\x59\xa4\xde\xb9\xff\x9b\x4b\x2d\xa0\xee\x4e\x63\x9b\x05\xbb\x83\xe6\x80\x63\xde\x50\x74\x9e\x6d\x08\xd8\x52\x63\x93\x5a\x40\x76\x51\xd1\x1d\x72\xec\x5c\xba\x4f\x64\xf3\xca\xdc\x1f\x65\x66\x7d\xaa\x9b\x4b\x2d\xc0\xfc\xac\x4f\x75\x73\xa9\x05\x64\x0f\xd1\x7b\x84\x63\xce\x14\x86\xef\x03\x9e\xfb\xbf\xb9\xd4\x02\x8e\xb9\xaf\xdc\xe7\x21\xa7\xbb\xb1\xb0\x93\x4e\x77\x2d\xb1\xb7\x02\x5b\x5e\xff\x9c\x59\x9f\xea\xe6\x52\x0b\x38\x87\x0b\xca\xeb\x79\xc2\xe9\x4e\x2f\xd7\x9b\xe1\xeb\x59\x9f\x6a\xc9\xd1\x1d\x4b\x4f\x61\xe7\x6e\xef\x7c\xc1\x32\xd2\x63\xb7\x5b\x7c\xec\x59\x50\x0b\x9a\x9d\x52\xfe\xae\x38\xe6\x32\x9e\x3b\x12\x4b\xbf\xc7\x71\xf4\x91\xe2\x0b\x5e\x97\xff\x8e\x6d\x2a\x79\xed\x9f\x4d\xec\xc2\xc4\x26\x7f\xc7\x76\x08\xdd\x5d\xa6\xdb\x2c\x74\x7b\x8c\x6d\x10\x6c\x6b\xa0\xdb\x18\xb0\x65\xc6\x36\x09\x76\x71\xa0\x3b\x2f\x60\x53\xf5\xb9\xcf\x9e\xac\xcf\xdd\x32\x9e\x3b\x4a\xf6\x1f\xd9\xc3\x36\xe6\x12\x31\xe6\xfd\xf2\xfd\xcb\xbf\xf5\xfb\xc1\xe2\x0b\x7e\xcc\xfd\xe5\xef\xbb\xd7\xdd\x24\x59\xd6\x5d\x27\xe7\x97\xd9\x74\xfd\x73\x66\x19\x4f\xf9\x5a\x5b\xc6\x73\x47\x79\x3d\x51\x77\x46\xfd\x7a\x96\xf1\xbc\xa4\xfc\x36\xca\xee\xf1\xbf\x1e\x7b\x9a\xcb\x2f\xdc\x90\x34\xf9\x8c\xaa\xb3\xeb\xcc\x7a\xb6\xbb\xde\x78\x64\xdc\xb3\xfd\x73\x89\x2d\x4e\xec\xcf\x8d\x4d\x7c\x01\x75\x27\x8c\x4d\x7c\xe1\xd5\x89\xe5\xdf\x7d\xf9\x98\xb1\x89\x2f\xa0\xee\xfd\xc6\x26\x7f\x6f\x51\x77\x3b\xcd\x1b\xd9\x1b\x8a\xce\xb3\xf5\x01\xbb\xdc\xd8\xc4\x17\x90\x3d\xb3\xe8\x0e\x39\xb6\x28\xb8\xcf\xd3\xca\xdc\x1f\x65\x66\x3d\xdb\x5d\x7e\x01\xe6\x6e\x3d\xdb\x5d\x7e\x01\xd9\xa7\xe8\x3d\xc2\x31\x3f\x51\x58\x33\xd8\x5c\x74\xe9\x77\x7b\xac\x67\xbb\xcb\x2f\xe0\x98\x6f\x29\xf7\x79\xc8\xe9\xb6\x17\x76\xd2\xe9\x5e\x46\xec\xd5\xc0\x5e\x5c\xff\x9c\x59\xcf\x76\x97\x5f\xc0\x39\x3c\xa1\xbc\x9e\x27\x9c\xee\x71\xe5\x7a\x8f\xf1\xf5\xac\x67\xbb\xcb\x57\xdf\x9e\x6a\x01\x7e\x67\xdb\xfe\x3d\xd7\xd6\xd9\xe4\x0b\x9e\x75\xbe\xe0\x58\xc5\x17\x16\x92\x2f\x78\x5d\xe7\x0b\x33\x50\xcb\xdf\x4f\xbe\xe0\x75\x9d\x2f\x78\x5d\xe7\x0b\x9e\x6d\x0d\x74\x1b\x03\xd6\xf9\x82\x67\x17\x07\xba\xf3\x02\x36\x55\x9f\x3b\xf8\x82\x9b\x3b\xf8\x82\x67\x9d\x2f\xf8\x31\xef\x97\xef\xdf\x0f\x90\x2f\xf8\x31\x3b\x5f\xf0\xba\x9b\x24\x3b\x9b\x7c\x01\xef\xe5\x6c\xf2\x05\xaf\x7b\x76\xfd\xb5\x06\x5f\xf0\xba\x33\xea\xd7\x03\x5f\xb8\x0d\x7c\xe1\x7b\x2b\xbe\x30\x15\xf8\xc2\x54\xe0\x0b\x53\x81\x2f\x9c\x1e\xf8\xc2\x54\xdd\x17\x46\xdf\x0d\x7c\x61\xaa\xee\x0b\xa6\xbb\x9d\xe6\x80\xac\xf3\x05\xcf\xd6\x07\x4c\xfa\x82\x31\xe9\x0b\xc6\xa4\x2f\x18\x93\xbe\x90\x59\xc5\x17\xa6\x02\x5f\x98\xaa\xfb\x82\x8d\x89\xbe\xd0\xe9\x4e\x0d\x7c\x61\xca\xf9\x02\xeb\xb4\x2f\x4c\x05\xbe\x30\x15\xf8\xc2\x54\xdd\x17\x6c\x0e\xda\x17\xa6\x02\x5f\x98\x02\x5f\xe8\xb2\x43\xe9\xd7\x60\x47\xdf\x76\xb5\x90\x9e\x7f\x8e\xd2\x19\x6f\x2e\xe3\x89\x8c\x33\x9e\xc0\x6c\xed\x7c\x69\xa9\x85\x9f\x4f\xec\x5f\x12\xe3\x8c\x27\xea\xf2\xda\x79\x49\xa9\x85\xd7\x24\x96\xce\xc5\x73\x19\x4f\xd4\xdd\x69\xba\xc9\x67\x0c\x75\x77\x18\x9b\xcc\x01\xd9\x0d\x45\xe7\xd9\x86\x80\x2d\x35\x36\xa9\x05\x64\x17\x15\xdd\x21\xc7\xce\x0d\xee\x73\x5e\x99\xfb\xa3\xcc\x5c\xc6\x13\xe6\xee\x32\x9e\xc8\x1e\xb2\x31\x27\xef\x11\x8e\xc9\x19\xcf\xac\xcb\xbf\x1d\x4f\x19\xcf\xd9\x7d\xdd\x98\x73\x5b\xa9\x16\x50\xc7\x19\x4f\xbc\x97\x6b\xcb\xfc\x4e\xba\x7b\xe1\x8c\x27\xea\x9e\x35\x79\xad\xfd\x6b\xe6\x32\x9e\xa8\x3b\xbd\x5c\x6f\x86\x75\x47\xbe\xa9\x7c\x61\xf4\x87\xda\x17\x46\x6d\xdd\x17\x32\xd3\xbe\x60\x4c\xfa\xc2\xe8\xc1\xba\x2f\x98\x4e\xfb\xc2\xe1\xba\x2f\x98\x4e\xfb\xc2\xe1\xc0\x17\x0e\x07\xbe\x70\x38\xf0\x85\xc3\x81\x2f\x1c\x0e\x7c\xe1\x70\xe0\x0b\x87\x03\x5f\x38\x5c\xf7\x85\x3c\x77\xed\x0b\xc6\xb4\x2f\x1c\xae\xfb\xc2\xe8\xd7\xea\xbe\x60\x63\x4a\x5f\x30\x9d\xf4\x05\xd3\x49\x5f\xb0\x7b\x91\xbe\x60\x3a\xed\x0b\x87\xeb\xbe\x60\x3a\xe9\x0b\x59\x57\xf1\x85\x5f\xaa\xf8\xc2\xc1\xc0\x17\x0e\x06\xbe\x70\x30\xf0\x85\x77\x06\xbe\x70\x30\xf0\x85\xdd\x81\x2f\x1c\x0c\x7c\x61\x77\xe0\x0b\xbb\x03\x5f\xd8\x1d\xf8\xc2\xee\xc0\x17\x76\x07\xbe\xb0\x3b\xf0\x85\xdd\x81\x2f\xec\x0e\x7c\xe1\x60\xe0\x0b\x07\x03\x5f\xd8\x1d\xf8\xc2\x9b\x95\x2f\xf4\xc6\xe4\xec\x3f\xea\xb4\x2f\x1c\x0c\x7c\x61\x77\xe0\x0b\x07\x03\x5f\xd8\x1d\xf8\xc2\xc1\xc0\x17\x76\x07\xbe\xb0\xa5\xe2\x0b\xeb\x03\x5f\x58\x1f\xf8\xc2\xfa\xc0\x17\x5e\x11\xf8\xc2\xfa\xc0\x17\x56\x05\xbe\xb0\x3e\xf0\x85\x55\x81\x2f\xac\x0a\x7c\x61\x55\xe0\x0b\xab\x02\x5f\x58\x15\xf8\xc2\xaa\xc0\x17\x56\x05\xbe\xb0\x2a\xf0\x85\xf5\x81\x2f\xac\x0f\x7c\x61\x55\xe0\x0b\x4b\x03\x5f\x58\x1f\xf8\xc2\xd2\xc0\x17\xd6\x07\xbe\xb0\x2a\xf0\x85\xf5\x81\x2f\xac\x0a\x7c\x61\x7d\xe0\x0b\xab\x1a\x3e\xf7\xff\xe4\xfc\xc5\x73\xb7\xa6\x5a\xb8\x8c\xb3\xff\x73\x6f\x48\x9a\x74\x86\x9d\xcb\xfe\x03\x73\xd9\x7f\x64\x98\xfd\xdf\x30\x7f\xf1\xdc\x9b\x13\x4b\xbd\xe3\x2e\xfb\x8f\x3a\xcc\xfe\x8f\x75\xaf\x4a\x2c\xff\xde\x28\x67\xff\x51\x87\xd9\x7f\xd6\x61\xf6\x9f\xd9\x96\x40\xb7\x8e\xe6\x80\x0c\xb3\xff\xcc\x2e\x0c\xc6\x5c\x18\xb0\x53\xeb\x73\x77\xd9\x7f\x98\xbb\xcb\xfe\x23\xc3\x1e\x0c\x1e\x93\xb3\xff\x59\x97\x7f\x7f\x91\xb3\xff\x38\x26\x67\xff\x51\xc7\xd9\x7f\xd4\x5d\x13\xcc\x8f\xb3\xff\xa8\xbb\xa4\xfe\x5a\xbb\xec\x3f\xea\x06\xf5\xeb\x59\x0f\x46\xf7\x6c\x31\xfd\x52\xcc\x68\xf2\x1c\x69\x7b\xf9\xf7\xd7\x8f\x35\xc3\x74\x36\x9c\xf5\x60\x48\x66\x3d\x18\xdb\xcb\xb3\x51\x64\xa5\x07\xc3\xd8\x1b\xd3\x7d\x9c\x92\xd8\xe7\x03\xdd\xef\x1a\x9b\x3c\x07\x7b\x45\x62\xdf\x48\xec\x5e\x63\x3b\x84\xee\xbd\xc6\x36\x0b\xdd\x6e\x9a\x03\xb2\xd7\x07\xba\xb5\x01\x5b\x62\x6c\x93\x60\xcf\x30\xb6\x5d\xb0\x73\x82\x31\x4f\xa9\xcf\xdd\x7a\x30\xe4\xdc\xad\x07\xa3\xbb\x1e\xb2\x07\x8d\x2d\x11\x63\x7e\x9c\x58\xd6\xfd\x4d\x62\x77\x19\x9b\x16\x63\xee\xa1\xfb\x44\xdd\x56\xc9\xb2\x6e\x63\x30\xbf\x65\xf5\xcf\x99\xf5\x60\xc8\xd7\xda\x7a\x30\xba\xd7\x13\x75\x53\xf5\xeb\x59\x0f\xc6\xa6\xe2\x43\xb7\x8c\xff\x75\xf8\x17\xdc\x83\x31\xb7\x39\x69\x1e\x82\x5a\x90\xcc\x6a\x61\x73\xe9\x47\x42\xf6\x55\xbb\xd6\xe4\x3b\xd2\x8d\x89\xfd\x29\xd4\xc2\xe6\xd2\x8f\x84\x3a\xee\x47\xba\x3e\xb1\x63\x50\x0b\x5d\x0f\x06\xea\xb8\x1f\x09\x75\xdc\x8f\x84\x8c\xfb\x91\x90\x71\x3f\x12\x32\xee\x47\x42\xc6\xfd\x48\xc8\xb8\x1f\x09\x19\xf7\x23\x01\x9b\xfd\xc7\x32\x77\xf7\x3e\xcc\x4e\x7e\xab\x79\xbb\x60\xdc\x8f\x84\x63\x4e\x7e\xab\x79\x49\xef\x7d\xb8\x1f\x6a\xa1\xeb\xc1\xc0\x31\x27\xbf\xd5\x3c\xf9\x8e\x84\xba\xc9\x6f\x35\x4f\x7a\x8e\x50\xc7\xfd\x48\x78\x2f\xcb\xea\x9f\x33\xd7\x8f\x84\xba\xf2\x5b\xcd\xf6\x1d\x09\x75\xdc\x8f\x04\x3a\x57\x0b\xc9\x17\x86\x1f\xed\x7c\xc1\xfe\x3d\xd7\xd6\x7b\xfb\xbe\xe0\x19\xf8\xc2\x06\xc7\xb8\x37\x2f\xf9\xc2\xf0\x43\xe4\x0b\x8b\x9c\xae\xf8\x82\xd5\x42\xae\xe5\xb7\xf6\x7d\xc1\xc6\x44\x5d\xf1\x05\x63\xa8\xdb\x4d\x73\x40\x56\x7c\x41\xb0\xb5\x01\xeb\x7c\x61\xda\xb1\xe2\x0b\xf6\x59\x41\x76\x4e\x70\x9f\xc5\x17\xac\x16\x80\x75\xbe\xe0\xdf\x87\xce\x17\x04\xeb\x7c\xc1\xdd\x27\xf8\x02\xbe\x0f\xb7\x91\x2f\x4c\xbb\x31\x8b\x2f\xd8\xfc\x50\xd7\xf9\xc2\x99\x4e\xb7\x91\x18\xde\xcb\xb2\xfa\xe7\xac\xf3\x05\xff\x9a\x75\xbe\x60\xb5\x80\xba\xe2\x0b\x56\x0b\xa0\xeb\x9d\xfb\x5f\xd6\x0b\xc3\x9f\x73\x3d\xdb\xe9\x3b\xd7\xf0\x95\x8d\xea\xd9\x06\xe6\x7a\xb6\x91\x61\xcf\x76\x59\x2f\x0c\xfd\x79\x6d\xac\xc3\x9e\xed\xf2\x1d\x6f\xb8\x81\xd6\x0b\x5e\x87\x3d\xdb\xac\xc3\x9e\x6d\x66\x5b\x02\xdd\x3a\x9a\x03\x32\xec\xd9\x66\x76\x61\x30\xe6\xc2\x80\x9d\x5a\x9f\xbb\xeb\xd9\x86\xb9\xbb\x9e\x6d\x64\x72\xbd\x60\x63\x72\xcf\x76\xd6\xbd\x84\xd6\x0b\x7e\x4c\xce\x2f\xa0\x8e\xf3\x0b\xa8\xbb\x26\x98\x1f\xf7\x6c\xa3\xee\x92\xfa\x6b\xed\x7a\xb6\x51\x37\xa8\x5f\xaf\x97\xfd\x1f\xb3\xf4\x2b\x1e\xc3\x2b\x7a\xb5\x30\xfe\xf7\x2d\x49\xf3\x93\xae\x16\x88\xf5\x6a\x81\x19\xd7\xc2\x9b\x12\x7b\xa1\xab\x05\xd6\x71\x2d\xbc\x32\xb1\xa7\xb8\x5a\x60\x1d\xd7\x02\xea\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x19\xd7\x02\x32\xae\x05\x60\xbd\x5a\xa0\xb9\xf7\x6a\x81\x19\xd7\x02\x8e\x89\xb5\xd0\xe9\x2e\x74\xb5\xc0\x63\xee\xa5\xfb\x44\xb6\x2d\x60\x5c\x0b\xf9\x5e\x9e\xed\x6a\x81\x75\x5c\x0b\x38\x87\xf3\xe9\xf5\x44\x1d\xd7\x02\x5c\xcf\x6a\x61\x43\xf1\xa1\x94\x0c\x1a\x3e\xd1\x7d\x47\x7a\x5d\xd2\x9c\xd9\x74\x79\x67\xc9\x2c\xef\xdc\x7d\x47\x42\xc6\x79\xe7\x9b\x12\xcb\xfd\x48\x9f\x2d\xfe\xbb\xc8\xe9\xe6\xe8\x3b\xd2\xa6\x31\x6b\xbf\x9d\xd8\x47\xe9\x3b\x12\xea\xde\x4d\xdf\x3d\x50\xb7\x8b\xe6\x80\x6c\x33\x7d\x0f\x42\xf6\xd2\x80\xbd\xa0\xac\xf5\xa6\x1d\x7b\x1a\x7d\x47\x42\x76\x76\x19\x73\x86\x99\xe5\x9d\xbb\xef\x48\xc8\xbe\x4e\xdf\x91\x60\xee\x96\x77\xee\xbe\x23\x21\x3b\x51\xde\x23\x77\x9f\x96\x77\xee\xbe\x23\x65\x5d\xee\xa5\x78\x7f\xf9\x3e\x33\xed\xc6\xbc\x9d\xbe\x23\xa1\xee\x0d\x85\x9d\x74\xba\xf5\x65\xee\x27\xbb\x7b\x19\xa6\x33\x39\x2c\xef\x2c\x3f\x67\x96\x77\xee\xbe\x23\xe1\x1c\x16\xd1\x77\x24\xd4\x9d\x46\xdf\x91\xe0\x7a\x96\x77\xee\xd6\x0b\xe9\x84\xdc\xf6\x5b\xae\x16\x5e\x9b\xae\xf5\x77\xb2\x16\x80\xb9\x5a\x40\xf6\x77\x76\xad\x49\x2d\x6c\x4f\xec\x1b\xb2\x16\x50\x37\x67\xba\x49\x2d\xbc\x3c\xb1\xcf\xca\x5a\x40\xdd\xbb\x4d\x37\xa9\x05\xd4\xed\xa2\x79\x23\xdb\x5c\x74\x9e\xbd\x34\x60\x2f\x98\x8c\x69\x9f\x15\x64\x4f\x33\x36\xa9\x05\x64\x67\x97\x31\x67\x98\x59\x2d\x6c\x2a\xb5\x80\x8c\x6b\x01\xe6\xee\x6a\x01\xd9\x09\x1b\x73\xb5\xbf\x4f\x57\x0b\x59\xf7\xa8\xac\x05\x1c\x93\x6b\x01\x75\x5c\x0b\xa8\x5b\x5f\xe6\x7e\x12\xee\xe5\xaf\x65\x2d\xa0\xee\x99\xa6\xdb\xe4\xdf\x5b\x57\x0b\xa8\x3b\xad\xbc\x9e\x8f\xf1\xf5\xac\x16\xc8\x17\xda\x4f\x6b\x5f\x68\xe7\x9a\x2e\xfb\x2f\x99\x65\xff\xc9\x17\x8c\x71\xf6\x3f\xf9\x42\xfb\x7b\x89\x7d\x4e\xf9\x82\xe9\x8e\x4b\x5f\xf8\x68\x62\xf7\x28\x5f\x30\xdd\x7b\xa4\x2f\x64\xdd\xad\xd2\x17\x32\x7b\x9d\xfc\xdb\x9f\xd9\x9a\x80\xbd\xb0\xf8\xc2\x12\xc7\x9e\x2e\x7d\x21\xb3\x05\xd2\x17\x32\x6b\xa4\x2f\x24\x66\xd9\x7f\xf2\x85\x3c\x77\xcb\xfe\x93\x2f\x18\x7b\x40\xfa\x42\x1e\xf3\x3e\xe5\x0b\x6d\xee\x6d\xb8\x53\xf9\x82\x8d\x79\x87\xf2\x05\xd3\xdd\xa0\x7c\xc1\x74\x1b\x88\xe5\x7b\xc9\x67\x25\x2c\xad\x7f\xce\x2c\xfb\xcf\xbe\x90\xe7\x70\xae\xf2\x05\xd3\xcd\x2b\xd7\x9b\xe1\xeb\xf5\xb2\xff\x65\xbd\xd0\x1e\xd2\xeb\x85\xf6\xdd\xf5\xf5\x42\x66\x7a\xbd\x60\x4c\xae\x17\xda\xbb\xeb\xeb\x05\xd3\xc9\xf5\x42\xbb\xab\xbe\x5e\x30\x9d\x5c\x2f\x98\x4e\xae\x17\x8c\xc9\xf5\x82\x31\xb9\x5e\x30\x26\xd7\x0b\xc6\xe4\x7a\xc1\x98\x5c\x2f\x18\x93\xeb\x85\xcc\xf4\x7a\x21\xcf\x5d\xaf\x17\x8c\xc9\xf5\x82\x8d\x29\xd7\x0b\xed\xde\xfa\x7a\xc1\xc6\x94\xeb\x05\xd3\xc9\xf5\x82\xe9\xe4\x7a\xa1\x7d\x5b\x7d\xbd\x60\x3a\xb9\x5e\xb0\x39\xc8\xf5\x82\xe9\xe4\x7a\x21\x5f\xaf\x77\xee\x7f\x79\x8e\xd4\x56\x9e\x23\xb5\xaf\x73\xb5\x40\x4c\x3f\x47\x32\x26\x9f\x23\xb5\xdb\x5c\x2d\xb0\x4e\x3e\x47\x6a\xd7\xb8\x5a\x60\x9d\x7c\x8e\x64\x3a\xf9\x1c\xc9\x98\x7c\x8e\x64\x4c\x3e\x47\x32\x26\x9f\x23\x19\x93\xcf\x91\x8c\xc9\xe7\x48\xc6\xe4\x73\xa4\xcc\xf4\x73\xa4\x3c\x77\xfd\x1c\xc9\x98\x7c\x8e\x64\x63\xca\xe7\x48\xed\xcb\x5c\x2d\xf0\x98\xf2\x39\x92\xe9\xe4\x73\x24\xd3\xc9\xe7\x48\xed\x2b\x5d\x2d\xb0\x4e\x3e\x47\xb2\x39\xc8\xe7\x48\xa6\x93\xcf\x91\xf2\xf5\xba\x7d\x67\xdc\x5f\x68\x57\xe9\xfd\x85\x36\x9d\x2d\xa1\xf7\x17\x32\xd3\xfb\x0b\xc6\xe4\xfe\x42\xbb\xbc\xa9\xee\x2f\x98\x4e\xee\x2f\xb4\xcf\x68\xaa\xfb\x0b\xa6\x93\xfb\x0b\xa6\x93\xfb\x0b\xc6\xe4\xfe\x82\x31\xb9\xbf\x60\x4c\xee\x2f\x18\x93\xfb\x0b\xc6\xe4\xfe\x82\x31\xb9\xbf\x90\x99\xde\x5f\xc8\x73\xd7\xfb\x0b\xc6\xe4\xfe\x82\x8d\x29\xf7\x17\xda\x9c\x8f\x94\xfb\x0b\x36\xa6\xdc\x5f\x30\x9d\xdc\x5f\x30\x9d\xdc\x5f\x68\xd3\x29\xe3\x7a\x7f\xc1\x74\x72\x7f\xc1\xe6\x20\xf7\x17\x4c\x27\xf7\x17\xf2\xf5\xdc\x6f\xce\xa7\x5c\x5b\xfb\x64\xf7\x3b\x18\x29\x1b\xd4\xa6\xbe\x8d\x76\x41\xc0\x26\xba\x49\xdf\x17\x30\xce\xfe\xe7\x5c\x5b\x9b\xce\x0e\x3e\x3a\xf9\x6d\xab\xc9\x7a\x01\x75\x0f\x94\xf5\x4e\xae\x85\x94\x45\x6a\xf3\x59\xb8\x93\xdf\xb6\x9a\xd4\x02\xea\xee\x2c\xeb\xb2\x7b\x9c\xee\x0e\xfa\x1b\x80\xec\x86\xa2\xf3\x6c\x43\xc0\x96\x4e\xd6\x73\xf6\x59\x41\x76\x51\xd1\x1d\x72\xec\xdc\xe0\x3e\xe7\x95\xb9\x3f\xca\xcc\xfa\x54\xbb\xdf\xc1\x80\xb9\x5b\x9f\x6a\xf7\x3b\x18\xc8\x1e\xb2\x31\x27\xef\x11\x8e\x39\x53\xde\x3f\x7c\x1f\xf2\x19\x1f\x1f\x28\xef\xd1\xb4\x1b\x73\x9f\xb1\x49\x2d\xa0\xee\xc6\xc2\x4e\x3a\xdd\xb5\x65\x7e\x27\xe1\x5e\x32\x5b\x5e\xff\x9c\x59\x9f\x6a\xb7\x76\xc6\x39\x5c\x60\xba\x49\x2d\xa0\xee\xf4\x72\xbd\x19\xbe\x9e\xf5\xa9\xce\xd0\xb9\xff\xd7\x59\x2d\xcc\x94\xdc\xf5\xaa\xb1\xa6\x77\xee\xbf\x66\xa7\x18\x5b\xe2\x99\x65\x3c\x67\x4a\x3f\xd2\x9a\xc4\x9e\x0b\xbe\x30\x53\xb2\xff\xa8\x7b\xd0\x98\xe5\xb5\x8f\x7e\x2c\xb1\x74\xc6\xfb\xdc\x32\x63\x3b\x84\xee\x2e\x63\x93\x0c\xf8\xb2\x4e\x67\x19\xcf\x6e\x0e\xc8\xb6\x06\xba\x8d\x01\x9b\xdc\xcb\x26\xc1\x2e\x0e\x74\xe7\x05\x6c\xaa\x3f\x77\x64\x96\xf1\xec\xe6\x8e\xec\x4b\xc6\xb6\xfb\xd7\xc5\x32\x9e\xdd\x7b\x84\xba\xfb\x0b\x9b\x01\x1d\x9e\xfb\x3f\x53\xb2\xff\xab\x40\xb7\xbf\xdc\xa7\xd7\xdd\x44\x73\xc0\x7b\xb9\x4e\xce\x0f\xcf\xfd\x97\x9f\x33\xcb\x78\xca\xd7\xda\x32\x9e\xf2\xf5\xb4\x8c\xa7\xbc\x9e\x65\x3c\xbb\xda\x4b\xdf\xf0\xca\xb9\xff\x9d\x3f\xad\x4c\x9a\x74\x3e\x7a\x7b\x76\x9d\x1d\xfd\x6e\xf1\xd8\x4d\x8e\x4d\x9e\x01\x4e\x7c\xe1\xa5\x89\xe1\xb9\xff\xdd\x73\x24\xd4\x9d\xa0\xef\x48\x97\x27\x86\xe7\xfe\x77\xdf\x91\x50\xf7\x7e\xfa\xee\x81\xba\xdb\x69\x0e\xc8\xde\x40\xdf\x83\x90\xad\x0f\xd8\xe5\xf4\x1d\x09\xd9\x33\x8b\xee\x90\x63\x8b\x82\xfb\x3c\x8d\xbe\x23\x01\xb3\x9e\xed\xee\x3b\x12\xcc\xdd\x7a\xb6\xbb\xef\x48\xc8\x3e\x45\xef\x11\x8e\xf9\x89\xc2\x1a\xd0\xe1\xb9\xff\xdd\x77\x24\x1c\xf3\x2d\xf4\x1d\x09\x75\xdb\x0b\x3b\xe9\x74\x2f\x23\x76\x39\xb0\x17\xd7\x3f\x67\xd6\xb3\xdd\x7d\x47\xc2\x39\x3c\x81\xbe\x23\xa1\xee\x71\xf4\x1d\x09\xae\x67\x3d\xdb\x9d\x2f\x9c\xef\x7c\x01\xeb\x7c\x01\xf9\x82\x67\xa7\xc8\xbf\x2b\x0b\x02\x5f\xc0\x73\xff\x67\x4a\x9f\x2a\xea\x1e\xa4\xbf\x39\xb9\x96\xf1\xdc\xff\x99\xd2\xab\x89\xba\xce\x17\xbc\x6e\x0f\xcd\x01\xd9\xd6\x40\xb7\x31\x60\x9d\x2f\x78\x76\x71\xa0\x3b\x2f\x60\x53\xf5\xb9\x83\x2f\xb8\xb9\x83\x2f\x78\xf6\x30\xbd\x47\x38\xa6\xf6\x85\xf9\xe4\x0b\x7e\x4c\xed\x0b\x59\xf7\x6a\xc9\x16\x90\x2f\xe0\xbd\x2c\x20\x5f\xf0\xba\x67\xd7\x5f\x6b\xf0\x05\xaf\x3b\xa3\x7e\xbd\x8a\x2f\x7c\x5f\xc5\x17\x06\x81\x2f\x0c\x02\x5f\x18\x04\xbe\x70\x46\xe0\x0b\x83\xc0\x17\x9a\xc0\x17\x06\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x34\x81\x2f\x0c\x02\x5f\x18\x04\xbe\xd0\x04\xbe\x70\x5a\xe0\x0b\x83\xc0\x17\x4e\x0b\x7c\x61\x10\xf8\xc2\x20\xf0\x85\x41\xe0\x0b\x4d\xe0\x0b\x83\xc0\x17\xf0\xdc\xff\xae\x16\xae\x6d\xf0\xdc\xff\xee\x3e\xae\x1c\x6b\x46\x79\xdf\x79\x41\xc0\x1a\x7a\x9d\x81\xd9\xda\x79\x66\x52\x0b\xe9\xc4\xff\xc5\xa3\x6f\x26\x27\x5a\x43\xb5\x80\xba\x07\xa8\x16\x96\x26\xf6\x7f\x9a\x6e\xed\xdc\xd5\x02\xea\xee\xec\x7f\xc6\x8e\xee\xe9\xd8\xf8\xff\xeb\xcd\x01\xc7\xbc\x81\x3e\xef\xc8\x36\x04\x6c\x29\xd5\x02\xb2\x8b\xa8\x16\x90\x9d\x4b\xb5\x80\x6c\x1e\xd5\x02\x30\x5b\x3b\x77\xb5\x00\x73\xb7\xb5\x73\x57\x0b\xc8\x1e\xaa\xbf\x47\xb6\x76\xee\x9e\x23\x25\x36\x9b\xce\x11\x1b\x7d\x8e\x6a\x01\x75\xfb\xa8\x16\x32\xfb\x5c\xd3\xad\x9d\xbb\xcf\x3b\xea\xae\x25\x86\xf3\x5b\x5e\xff\x9c\xd9\xda\xb9\xab\x05\xd4\x5d\x40\xb5\x80\xba\xd3\xcb\xf5\x66\x58\x67\x6b\xe7\x52\x0b\xa3\xd4\xe5\x3d\x76\x07\x55\x93\xa3\xd9\xba\x2f\x64\xa6\x7d\xc1\x98\xf4\x85\xd1\x89\xba\x2f\x98\x4e\xfa\xc2\xe8\xbe\xba\x2f\x98\x4e\xfa\x82\xe9\xa4\x2f\x18\x93\xbe\x60\x4c\xfa\x82\x31\xe9\x0b\xc6\xa4\x2f\x18\x93\xbe\x60\x4c\xfa\x42\x66\xda\x17\xf2\xdc\xb5\x2f\x18\x93\xbe\x60\x63\x4a\x5f\x18\x7d\xa4\xee\x0b\x36\xa6\xf4\x05\xd3\x49\x5f\x30\x9d\xf4\x05\xbb\x17\xe9\x0b\xa6\x93\xbe\x60\x3a\xe9\x0b\xa6\x93\xbe\x90\x75\x15\x5f\xb8\x93\x6b\x61\x94\x7e\x8f\x38\x55\x58\xcd\x17\xf6\x07\xbe\xb0\xbf\xee\x0b\x69\xd5\x30\x18\xbd\x43\xfa\xc2\xfe\xc0\x17\x76\x05\xbe\xb0\x5f\xf9\x42\x66\xc9\x1d\x06\x23\xee\xcd\xc3\x31\xb5\x2f\xec\x0a\x7c\x61\x57\xe0\x0b\xbb\x02\x5f\xd8\x15\xf8\xc2\xae\xc0\x17\x76\x05\xbe\xb0\x3f\xf0\x85\xfd\xd2\x17\x70\x4c\xe9\x0b\xa3\x37\x36\xdd\x33\x55\xf6\x85\xfd\xca\x17\x92\xc2\x3e\x2f\x15\x5f\xd8\x1f\xf8\xc2\xae\xc0\x17\xf6\x07\xbe\xb0\x2b\xf0\x85\xfd\x81\x2f\xec\x92\xbe\xb0\x39\xf4\x85\xb5\x81\x2f\xac\x0d\x7c\x61\x6d\xe0\x0b\xd7\x07\xbe\xb0\x36\xf0\x85\x95\x81\x2f\xac\x0d\x7c\x61\x65\xe0\x0b\x2b\x03\x5f\x58\x19\xf8\xc2\xca\xc0\x17\x56\x06\xbe\xb0\x32\xf0\x85\x95\x81\x2f\xac\x0c\x7c\x61\x6d\xe0\x0b\x6b\x03\x5f\x58\x19\xf8\xc2\x8b\x02\x5f\x58\x1b\xf8\xc2\x8b\x02\x5f\x58\x1b\xf8\xc2\xca\xc0\x17\xd6\x06\xbe\xb0\x32\xf0\x85\xb5\x81\x2f\xac\x6c\xf8\xdc\xff\xd3\xe7\x2f\x9e\xbb\xa6\xf1\xe7\xfe\xef\x98\xbf\x78\x6e\x45\xd2\xa4\xdf\x3e\xed\x65\xff\x89\xf5\xb2\xff\xcc\x30\xfb\xbf\x63\xfe\xe2\xd1\x25\x4d\x77\xfe\xc2\xd5\xc6\xa6\x85\x0e\xb3\xff\x63\xf6\xa2\xc4\xd2\x6f\x38\xf7\xb2\xff\xac\xc3\xec\x7f\xd1\x1d\xcd\xbf\x7a\xf3\x04\x9a\x03\x8e\xb9\x45\xe9\x8c\xad\xeb\xcf\xa1\xc7\x30\xfb\xcf\xec\xc2\x60\xcc\x85\x01\x3b\xb5\x3e\xf7\x5e\xf6\x9f\xe6\xde\xcb\xfe\x33\xc3\x1e\x0c\x1e\x13\xb3\xff\x9d\xee\xac\xc4\xee\xae\xbf\x47\xbd\xec\x3f\xeb\xb6\x49\x96\x75\xd7\x04\xf3\xbb\xa2\xfe\x39\xeb\x65\xff\x59\x77\x3e\xbd\x9e\xa8\x1b\xd4\xaf\xe7\xce\xfd\x4f\x09\x1f\x71\xee\xff\xf4\x58\x33\xfc\xb7\x46\x9d\xfb\x0f\xcc\x9d\xfb\x8f\x8c\xce\xfd\x4f\x27\xfe\x4f\x7e\x73\xfe\xaa\x40\xc7\xe7\xfe\xbf\x30\xb1\x7c\xce\x1b\x9f\xfb\x8f\x3a\x3e\xf7\x1f\x75\x7c\xee\x3f\x32\x3e\xf7\x1f\x19\x9f\xfb\x8f\x8c\xcf\xfd\x47\xc6\xe7\xfe\x23\xe3\x73\xff\x91\xf1\xb9\xff\xc0\xdc\xb9\xff\x30\x77\x77\xee\x3f\x32\x3e\xf7\x1f\xc7\xe4\x73\xff\xb3\xee\xcb\x89\xf1\xb9\xff\x38\xe6\xfe\xfe\x7d\x26\x45\xfe\x3f\xfc\xb9\xff\xa8\xe3\x73\xff\xf1\x5e\xf8\xdc\x7f\xd4\xf1\xb9\xff\xa8\xe3\x73\xff\x51\xc7\xe7\xfe\x83\xce\x7a\x30\x3a\x1f\x5a\x37\xfe\xd7\xe1\x23\xae\x07\xe3\xc5\x49\xf3\x7b\x8d\x3a\x8b\x04\x98\x3b\x8b\x04\x19\xf7\x23\xfd\x4c\x62\x7f\xdc\x34\xe2\x2c\x12\xd4\x71\xf6\xff\xf9\x89\x0d\xa1\x16\xba\x1e\x0c\xd4\x71\xf6\x1f\x75\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x07\xe6\xce\x22\x81\xb9\xbb\xb3\x48\x90\x71\xf6\x1f\xc7\xe4\xb3\x48\xb2\xee\x13\x50\x0b\x5d\x0f\x06\x8e\xc9\x67\x91\xa0\x8e\xcf\x22\x41\x1d\x67\xff\xf1\x5e\xf8\x2c\x12\xd4\x71\xf6\x1f\x75\x7c\x16\x09\xea\x38\xfb\x0f\x3a\x77\xee\x7f\xf2\x05\x71\xee\x7f\xae\xad\x77\x37\xea\xdc\x7f\x60\xee\xdc\x7f\x64\x7c\xee\xff\x55\x89\x7d\x10\x6a\xa1\x3b\xf7\x1f\x75\x7c\xee\x7f\xae\xe5\x03\x7d\x5f\xb0\x31\x51\xc7\xe7\xfe\xa3\x8e\xcf\xfd\x47\xc6\xe7\xfe\x23\xe3\x73\xff\x91\xf1\xb9\xff\xc8\xf8\xdc\x7f\x64\x7c\xee\x3f\x32\x3e\xf7\x1f\x98\x3b\xf7\x1f\xe6\xee\xce\xfd\x47\xc6\xe7\xfe\xe3\x98\x7c\xee\x7f\xd6\xdd\x4a\xbe\x30\xed\xc6\xe4\x73\xff\x51\xc7\xe7\xfe\xa3\x8e\xcf\xfd\xc7\x7b\xe1\x73\xff\x51\xc7\xe7\xfe\xa3\x8e\xcf\xfd\x47\x1d\x9f\xfb\x0f\xba\xde\xb9\xff\x65\xbd\x30\xec\x9f\xd7\x56\xbe\x73\x0d\x37\x35\xdc\xb3\x4d\xac\xd7\xb3\xcd\x0c\x7b\xb6\xc7\xec\xea\xc4\x5e\x9f\x18\xf6\x6c\xb3\x0e\x7b\xb6\xcb\x77\xbc\xe1\x3a\x5a\x2f\x78\x1d\xf6\x6c\xb3\xee\x36\x9a\x03\xb2\x2d\x81\x6e\x1d\xcd\x01\x19\xf6\x6c\x33\xbb\x30\x18\x73\x61\xc0\x4e\xad\xcf\xbd\xd7\xb3\x4d\x73\xef\xf5\x6c\x33\x93\xeb\x05\x1b\x13\x7b\xb6\x3b\xdd\x95\xb4\x5e\xf0\x63\xee\xed\xdf\x67\xfa\xd7\xfc\x7f\xf4\x7b\xb6\x59\x77\x4d\x30\xbf\x2b\xea\x9f\xb3\x5e\xcf\x36\xeb\xce\xa7\xd7\x13\x75\x83\xfa\xf5\x7a\xd9\xff\x31\x4b\xa7\xd4\x0d\x97\xba\x5a\xf8\xe9\xa4\xf1\xe7\xfe\x13\x73\xb5\x80\x8c\x6a\x21\x9d\xf8\xef\xd7\xce\x5e\xc7\xb5\xb0\x24\x31\x7f\xee\x3f\xeb\xb8\x16\x90\x71\x2d\xe0\x98\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x80\x8c\x6b\x01\x18\xd7\xc2\xf8\xf3\x7f\xe6\xe2\x61\x3a\xe7\x68\x3c\xd7\x5e\x2d\xc0\xdc\x5d\x2d\xe0\x98\x5c\x0b\x49\x37\x9b\xf2\x56\x63\x75\xed\x3d\xe2\x5a\xe8\x31\xae\x85\x3c\xe6\x35\xbd\x31\xfb\xf3\xf3\xe7\xfe\xf3\x98\x5c\x0b\x38\x07\xae\x05\xd4\x71\x2d\xc0\xf5\xf8\xec\xc2\x61\x5a\x51\xcf\xad\x77\xeb\x85\xe5\x49\xa3\xcf\xfd\x07\xe6\xce\x3a\x47\xc6\xd9\xff\xd5\x89\xe9\x73\xff\x51\xc7\x67\x9d\xbf\x60\xcc\x2a\xe7\xfe\xa3\x8e\xcf\x3a\x47\xf6\xf3\x34\x07\x1c\x93\xcf\x3a\x47\xc6\x67\x9d\x23\xe3\xb3\xce\x91\xf1\x59\xe7\xc8\xf8\xac\x73\x60\xee\xac\x73\x64\x7c\xd6\x39\xcc\xcf\x9d\x75\x8e\x8c\xcf\x3a\xc7\x31\xf9\xac\xf3\xac\xd3\xe7\xfe\xe3\x98\x7c\xd6\x39\xea\xf8\xac\x73\xd4\xf1\x59\xe7\xe9\x5e\x2a\xe7\xfe\xa3\x8e\xcf\x3a\xc7\x39\xf0\x59\xe7\xa8\xe3\xb3\xce\xe1\x7a\xee\xac\xf3\xbc\x83\xe0\xcf\xfd\xbf\x22\x5d\x4b\x9f\xfb\x0f\xcc\xd5\x02\x32\xae\x85\x97\x24\xa6\xcf\xfd\x47\x1d\xd7\xc2\x4f\x25\xa6\xcf\xfd\x47\x1d\xd7\x02\xea\xf8\xdc\x7f\x64\x5c\x0b\xc8\xb8\x16\x90\x71\x2d\x20\xe3\x5a\x40\xc6\xb5\x00\xcc\xd5\x02\x32\xae\x05\x98\xbb\xab\x05\x64\x5c\x0b\x38\x26\xd7\x42\xd6\xe9\x73\xff\x71\x4c\xae\x05\xd4\x71\x2d\xa0\x8e\x6b\x21\xdf\x8b\x3e\xf7\x1f\x75\x5c\x0b\x38\x07\xae\x05\xd4\x71\x2d\xc0\xf5\x5c\x2d\xe4\x5f\xd2\xf6\xe7\xfe\xa7\xda\xaa\x9c\xfb\x0f\xcc\x9d\xfb\x8f\x8c\xb3\xff\xc9\x17\x2a\xe7\xfe\xa3\x8e\xcf\xfd\xcf\x7f\x03\xf4\xb9\xff\xa8\xe3\x73\xff\x51\xc7\xe7\xfe\x23\xe3\x73\xff\x91\xf1\xb9\xff\xc8\xf8\xdc\x7f\x64\x7c\xee\x3f\x32\x3e\xf7\x1f\x19\x9f\xfb\x0f\xcc\x9d\xfb\x0f\x73\x77\xe7\xfe\x23\xe3\x73\xff\x71\x4c\x3e\xf7\x3f\xeb\xf4\xb9\xff\x38\x26\x9f\xfb\x8f\x3a\x3e\xf7\x1f\x75\x7c\xee\x7f\xbe\x17\x7d\xee\x3f\xea\xf8\xdc\x7f\x9c\x03\x9f\xfb\x8f\x3a\x3e\xf7\x1f\xae\xd7\xcb\xfe\xef\x98\xbf\xb8\x4d\xbf\xe8\x38\x5e\x35\xa8\xef\x6a\xe2\xdc\x7f\x62\x7a\xbd\x20\xce\xfd\x2f\x6b\x67\x71\xee\x3f\xeb\xe4\x7a\x41\x9c\xfb\xcf\x3a\x5e\x2f\xa0\x4e\xae\x17\xc4\xb9\xff\xcc\xe4\x7a\x41\x9c\xfb\xcf\x4c\xae\x17\xc4\xb9\xff\xcc\xe4\x7a\x41\x9c\xfb\x4f\x73\x77\x6b\x67\x64\x72\xbd\x20\xce\xfd\xef\x74\xfe\xdc\x7f\x1e\x53\xae\x17\x8c\xc9\xf5\x82\x38\xf7\xbf\xbb\x17\x7f\xee\x3f\xeb\xe4\x7a\x41\x9c\xfb\xcf\x3a\xb9\x5e\x10\xe7\xfe\x97\xe7\x48\x6d\xe5\x39\x92\x38\xf7\x9f\x98\x7e\x8e\x24\xce\xfd\xdf\x41\xe7\xfe\xf3\xda\x19\x75\xf2\x39\x92\x38\xf7\x9f\x75\xf2\x39\x52\xde\x77\x6e\xaf\xa6\x39\xe0\x98\xf2\x39\x92\x38\xf7\x9f\x99\x7c\x8e\x24\xce\xfd\x67\x26\x9f\x23\x89\x73\xff\x89\xe9\xb5\x73\x9e\xfb\xf8\x75\xf0\xcf\x91\xc4\xb9\xff\x3c\xa6\x7c\x8e\x24\xce\xfd\xe7\x31\xb9\x16\x50\x27\x9f\x23\x89\x73\xff\xbb\x7b\xf1\xe7\xfe\xb3\x4e\x3e\x47\x12\xe7\xfe\xb3\x4e\x3e\x47\xaa\x9c\xfb\x9f\xf6\x17\xc4\xb9\xff\xe9\x19\x6d\xe5\xdc\x7f\x60\x6e\xaf\x0d\x19\xef\xb5\xa5\xfd\x85\xca\xb9\xff\xa8\xe3\xbd\xb6\xf4\x4c\xb8\x72\xee\x3f\xea\x78\xaf\x0d\x75\xbc\xd7\x86\x8c\xf7\xda\x90\xf1\x5e\x1b\x32\xde\x6b\x43\xc6\x7b\x6d\xc8\x78\xaf\x0d\x19\xef\xb5\x01\x73\x7b\x6d\x30\x77\xb7\xd7\x86\x8c\xf7\xda\x70\x4c\xde\x6b\xcb\x3a\x7d\xee\x3f\x8e\xc9\x7b\x6d\xa8\xe3\xbd\x36\xd4\xf1\x5e\x5b\xbe\x17\x7d\xee\x3f\xea\x78\xaf\x0d\xe7\xc0\x7b\x6d\xa8\xe3\xbd\x36\xb8\x1e\x9f\xfb\xdf\xa6\x5f\xa4\x9c\xbb\xb6\xcb\xb5\xd9\x7d\xa4\x6c\x90\x9d\xed\xbf\x20\x60\x13\xdd\xa4\xef\x0b\x18\xf7\xa9\xe6\x5c\x5b\xee\xc1\x68\x7f\xd8\xd8\x64\xbd\x80\xba\x07\x8c\x4d\x6a\x21\x65\x91\x7a\xe7\xfe\xcf\x94\x5a\x40\x1d\xf5\xa9\xa6\x7f\xb5\xde\xc9\x2e\xd7\x66\x73\xc0\x31\x6f\x30\xb6\x59\xb0\x0d\x01\x5b\x6a\x6c\x52\x0b\xc8\x2e\x2a\xba\x43\x8e\x9d\x5b\xd8\x3d\x8e\xcd\x2b\x73\x7f\x94\x99\xf5\xa9\xce\x94\x5a\x58\xd6\xcd\xdd\xfa\x54\x67\x4a\x2d\x20\x7b\x88\xde\x23\x1c\x73\xa6\x30\x7c\x1f\xf0\xdc\x7f\xea\x53\xed\x9d\xfb\x3f\x53\x6a\x01\x75\x37\x16\x76\x92\xdf\x23\xeb\x53\xed\x18\xde\xe7\xf2\xfa\xe7\xcc\xfa\x54\x67\x4a\x2d\xe0\x1c\x2e\x28\xaf\xe7\x09\xa7\x3b\xbd\x5c\x6f\x86\xaf\x67\x7d\xaa\x77\x51\xf6\xff\x79\x56\x0b\x87\x4a\xee\x7a\x5c\x71\xfd\xec\xbf\x66\xa7\x18\x5b\xe2\x99\x65\x3c\x0f\x94\x8c\xe7\xb3\x9a\x2e\xfb\xff\x88\xe9\x56\x0b\xdd\x83\xc6\x26\x79\xed\x27\x35\x5d\x36\xfe\xe3\xc6\x76\x08\xdd\x5d\xc6\x36\x0b\xdd\x1e\x9a\x03\xb2\xad\x81\x6e\x63\xc0\x96\x19\xdb\x24\xd8\xc5\x81\xee\xbc\x80\x4d\xd5\xe7\x6e\x19\x4f\x39\x77\xcb\x78\x1e\x2a\xd9\x7f\x64\x0f\xd3\x7b\x84\x63\xde\x5f\xd8\x0c\xe8\x30\xfb\x7f\xa8\x64\xff\x71\xcc\xfd\xe5\x3e\xbd\xee\xd5\x34\x07\xd4\x5d\x27\xe7\x87\xd9\x7f\xf9\x39\xb3\x8c\xa7\x7c\xad\x2d\xe3\xd9\xbd\x9e\xa8\x3b\xa3\x7e\x3d\xcb\x78\x76\x67\xf8\xa5\x5a\x28\xd9\xff\xd5\xe5\xdf\x7f\xb4\xe1\xec\xbf\x64\xd6\xb3\xbd\xba\xfc\xcd\x41\x96\x9f\x01\x4e\x17\x5f\x48\x7d\xaa\xbd\xec\xff\xea\xe2\x0b\xa8\x3b\x61\x6c\xe2\x0b\x4f\x6c\x38\xfb\xbf\xba\xf8\x02\xea\xde\x6f\x6c\xf2\xf7\x16\x75\xb7\xd3\x1c\x90\xbd\xa1\xe8\x3c\x5b\x1f\xb0\xcb\x8d\x4d\x7c\x01\xd9\x33\x8b\xee\x90\x63\x8b\x82\xfb\x3c\xad\xcc\xfd\x51\x66\xd6\xb3\xbd\xba\xf8\x02\xcc\xdd\x7a\xb6\x57\x17\x5f\x40\xf6\x29\x7a\x8f\x70\xcc\x4f\x14\xd6\x80\x0e\xb3\xff\xab\x8b\x2f\xe0\x98\x6f\x29\xf7\x99\xe6\x97\x14\xf9\xff\x98\xf4\x6c\xaf\x2e\x7f\xfb\x51\xf7\x32\x62\x4f\x6c\x38\xfb\x2f\x3f\x67\xd6\xb3\xbd\xba\xf8\x02\xce\xe1\x09\xe5\xf5\x3c\xe1\x74\x8f\x2b\xd7\x7b\x8c\xaf\x67\x3d\xdb\xc5\x17\xc6\x8e\x70\xe6\xe0\xd8\xf9\xe0\x0b\x58\xe7\x0b\xc8\x17\x3c\x3b\x45\xfe\x5d\x59\x10\xf8\xc2\x22\xf2\x05\xaf\x7b\x90\xfe\xe6\xe4\x5a\x7e\x3c\xf9\x82\xd7\x75\xbe\xe0\x75\x7b\x68\x0e\xc8\xb6\x06\xba\x8d\x01\xeb\x7c\xc1\xb3\x8b\x03\xdd\x79\x01\x9b\xaa\xcf\x1d\x7c\xc1\xcd\x1d\x7c\xc1\xb3\x87\xe9\x3d\xc2\x31\xb5\x2f\xcc\x27\x5f\xf0\x63\x6a\x5f\xc8\xba\x9b\x24\x5b\x40\xbe\x80\xf7\xb2\x80\x7c\xc1\xeb\x9e\x5d\x7f\xad\xc1\x17\xbc\xee\x8c\xfa\xf5\x2a\xbe\xf0\x7d\x15\x5f\x18\x04\xbe\x30\x08\x7c\x61\x10\xf8\xc2\x19\x81\x2f\x0c\x02\x5f\x68\x02\x5f\x18\x04\xbe\xd0\x04\xbe\xd0\x04\xbe\xd0\x04\xbe\xd0\x04\xbe\xd0\x04\xbe\xd0\x04\xbe\xd0\x04\xbe\xd0\x04\xbe\x30\x08\x7c\x61\x10\xf8\x42\x13\xf8\xc2\x69\x81\x2f\x0c\x94\x2f\xf4\x74\xda\x17\x06\x81\x2f\x0c\x02\x5f\x18\x04\xbe\xd0\x04\xbe\x30\x08\x7c\x01\xb3\xff\xdd\xef\x6c\xa7\x13\x1b\x4a\xf6\xff\x50\xf9\xf7\x54\x5b\x63\x47\x38\x73\x30\xfa\x4a\x62\xdd\x6f\xce\x3d\x75\xcc\xc6\xff\x5a\xd6\xce\xdd\x6f\xb2\x01\xb3\xb5\xf3\x86\x52\x0b\x3f\x36\x66\x29\xe9\x39\x18\x7d\xd3\x74\x93\x5a\x40\x1d\xff\x6e\x5e\x5a\x03\x8f\xbe\xd4\x74\x6b\xe7\x4d\xa5\x16\x50\x77\xe7\xe4\xef\x83\x65\x4a\xef\x48\xbe\xfd\xa4\x74\xbd\x2f\xd1\x1c\x70\x4c\xfe\xdd\x3c\x64\xfc\xbb\x79\xc8\xf8\x77\xf3\x90\xf1\xef\xe6\x21\xe3\xdf\xcd\x43\xc6\xbf\x9b\x07\xcc\xd6\xce\x87\x26\xb5\x90\xfe\xd5\xe6\x67\x6b\xe7\x4d\xa5\x16\xe0\x75\x71\xbf\x9b\x87\x63\xce\x14\x86\xef\x43\xfe\x2d\xf7\x0f\x94\xf7\x68\xda\x8d\xb9\xaf\xdc\xe7\x21\xa7\xbb\xb1\xb0\x93\x4e\xc7\xbf\x9b\x87\xf7\xb2\xbc\xfe\x39\x73\xbf\x9b\x87\xba\x0b\xca\xeb\x79\xc2\xe9\xf8\x77\xf3\x40\x67\x6b\xe7\x25\x94\xfd\xbf\x4c\xfb\xc2\xe8\x48\xdd\x17\x32\xd3\xbe\x60\x4c\xfa\xc2\xe8\x93\x75\x5f\x30\x9d\xf4\x85\xd1\xc7\xea\xbe\x60\x3a\xe9\x0b\xa6\x93\xbe\x60\x4c\xfa\x82\x31\xe9\x0b\xc6\xa4\x2f\x18\x93\xbe\x60\x4c\xfa\x82\x31\xe9\x0b\x99\x69\x5f\xc8\x73\xd7\xbe\x60\x4c\xfa\x82\x8d\x29\x7d\x61\xf4\xe1\xba\x2f\xd8\x98\xd2\x17\x4c\x27\x7d\xc1\x74\xd2\x17\xec\x5e\xa4\x2f\x98\x4e\xfa\x82\xe9\xa4\x2f\x98\x4e\xfa\x42\xd6\x55\x7c\x61\x92\xfd\xe7\x9a\xdc\xd7\x74\xcf\x54\x35\xd3\xbe\xb0\xaf\xee\x0b\xa3\x77\x24\xf6\x05\xe9\x0b\xfb\x02\x5f\xd8\x19\xf8\xc2\x3e\xf0\x05\xfe\x7b\x9b\x75\xfc\x7b\xaa\xc8\xb4\x2f\xec\x0c\x7c\x61\x67\xe0\x0b\x3b\x03\x5f\xd8\x19\xf8\xc2\xce\xc0\x17\x76\x82\x2f\x6c\x2a\xb5\x00\x73\xaf\xf8\xc2\xbe\xc0\x17\x76\x06\xbe\x70\x93\xf2\x85\xd1\x6d\x63\x36\x9b\xc6\x1c\xff\x7f\xc2\x17\x6e\x0a\x7c\x61\x5f\xe0\x0b\x3b\x03\x5f\xd8\x17\xf8\xc2\xce\xc0\x17\xf6\x05\xbe\xb0\x53\xf9\x42\x5e\x2f\x8c\x36\x57\x7c\x61\x4d\xe0\x0b\x6b\x02\x5f\x58\x13\xf8\xc2\xcb\x03\x5f\x58\x13\xf8\xc2\x8a\xc0\x17\xd6\x04\xbe\xb0\x22\xf0\x85\x15\x81\x2f\xac\x08\x7c\x61\x45\xe0\x0b\x2b\x02\x5f\x58\x11\xf8\xc2\x8a\xc0\x17\x56\x04\xbe\xb0\x26\xf0\x85\x35\x81\x2f\xac\x08\x7c\x61\x49\xe0\x0b\x6b\x02\x5f\x58\x12\xf8\xc2\x9a\xc0\x17\x56\x04\xbe\xb0\x26\xf0\x85\x15\x81\x2f\xac\x09\x7c\x61\x45\xc3\xe7\xfe\x7f\x75\xfe\xe2\xb9\xd4\xe5\x4d\xd9\xff\xe9\xf9\x8b\xe7\x16\x27\x4d\xda\x89\xeb\x65\xff\x89\xf5\xb2\xff\xcc\x30\xfb\x3f\x3d\x3f\x77\x5f\xe4\xff\x63\x30\xba\xd8\xd8\xb4\xd0\x61\xf6\x7f\xcc\x2e\x48\x2c\xfd\xda\x65\x2f\xfb\xcf\x3a\xcc\xfe\xb3\xee\x36\x9a\x03\xb2\x2d\x81\x6e\x5d\x7f\x0e\x3d\x86\xd9\x7f\x66\x17\x06\x63\x2e\x0c\xd8\xa9\xf5\xb9\xf7\xb2\xff\x34\xf7\x5e\xf6\x9f\x19\xf6\x60\xf0\x98\x98\xfd\xef\x74\xf9\x79\xd0\xdd\xf5\xf7\xa8\x97\xfd\x67\xdd\x36\xc9\xb2\xee\x9a\x60\x7e\x57\xd4\x3f\x67\xbd\xec\x3f\xeb\xce\xa7\xd7\x13\x75\x83\xfa\xf5\x38\xfb\x3f\x3a\x3d\x39\xde\x73\x5d\xf6\xff\xc9\x63\xcd\xf0\x5b\x8d\xca\xfe\x03\x73\xd9\x7f\x64\x94\xfd\x9f\x7b\x66\x62\xff\x93\xd8\xe7\x03\x1d\x67\xff\xcf\x4f\xec\xeb\x89\x71\xf6\x1f\x75\x9c\xfd\x47\x1d\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x91\x71\xf6\x1f\x19\x67\xff\x81\xb9\xec\x3f\xcc\xdd\x65\xff\x91\x71\xf6\x1f\xc7\xe4\xec\x7f\xd6\x3d\x96\x18\x67\xff\x71\xcc\x3d\x74\x9f\xa8\xe3\xec\x3f\xea\x38\xfb\x8f\xf7\xc2\xd9\x7f\xd4\x71\xf6\x1f\x75\x9c\xfd\x47\x1d\x67\xff\x41\xe7\xb2\xff\x3f\x3e\xfe\xd7\xe1\x17\x5c\x3f\xd2\x0f\x27\xcd\x83\x8d\xea\x47\x02\xe6\xfa\x91\x90\x71\x3f\xd2\x33\x12\xfb\x23\xa8\x85\xae\x1f\x09\x75\xdc\x8f\x74\x6e\x62\x2d\xd4\x42\xd7\x8f\x84\x3a\xee\x47\x42\x1d\xf7\x23\x21\xe3\x7e\x24\x64\xdc\x8f\x84\x8c\xfb\x91\x90\x71\x3f\x12\x32\xee\x47\x42\xc6\xfd\x48\xc0\x5c\x3f\x12\xcc\xdd\xf5\x23\x21\xe3\x7e\x24\x1c\x93\xfb\x91\xb2\xee\x30\xd4\x42\xd7\x8f\x84\x63\x72\x3f\x12\xea\xb8\x1f\x09\x75\xdc\x8f\x84\xf7\xc2\xfd\x48\xa8\xe3\x7e\x24\xd4\x71\x3f\x12\xea\xb8\x1f\x09\x74\x2e\xfb\x9f\x3a\x22\x44\xf6\x3f\xd7\xd6\xbb\x1a\x95\xfd\x07\xe6\xb2\xff\xc8\x38\xfb\x9f\x7d\xe1\x03\xe4\x0b\x8b\x9c\x8e\xb3\xff\xb9\x96\xf7\xf7\x7d\xc1\xc6\x44\x1d\x67\xff\x51\xc7\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x64\x9c\xfd\x47\xc6\xd9\x7f\x60\x2e\xfb\x0f\x73\x77\xd9\x7f\x64\x9c\xfd\xc7\x31\x39\xfb\x9f\x75\xbb\xc8\x17\xa6\xdd\x98\x9c\xfd\x47\x1d\x67\xff\x51\xc7\xd9\x7f\xbc\x17\xce\xfe\xa3\x8e\xb3\xff\xa8\xe3\xec\x3f\xea\x38\xfb\x0f\xba\xde\xb9\xff\x65\xbd\x30\x7c\x63\xaf\x67\xbb\x7c\xe7\x1a\x5e\xdf\x70\xcf\x36\xb1\x5e\xcf\x36\x33\xec\xd9\x1e\xb3\x8b\x13\xcb\x67\xab\x61\x7e\x81\x75\xd8\xb3\x5d\xbe\xe3\x0d\xd7\xd2\x7a\xc1\xeb\xb0\x67\x9b\x75\xb7\xd1\x1c\x90\x6d\x09\x74\xeb\x68\x0e\xc8\xb0\x67\x9b\xd9\x85\xc1\x98\x0b\x03\x76\x6a\x7d\xee\xbd\x9e\x6d\x9a\x7b\x2f\xbf\xc0\x4c\xae\x17\x6c\x4c\xec\xd9\xee\x74\x2b\x69\xbd\xe0\xc7\xdc\x4b\xf7\x89\xba\x6d\x92\x5d\xff\xff\x67\xef\xdf\xc3\x1c\xb9\xaa\x7b\x6f\xbc\x4a\x3d\xad\x6e\x1f\x2e\x56\xf7\xb8\xa7\x65\x83\x13\x35\x73\x93\x2f\xd8\x0a\x93\x99\x11\x01\x83\xf0\x6d\x64\x07\x63\x19\xdb\x8c\xc6\x18\x8e\x08\x37\x81\x6f\x65\x72\x42\x64\x6c\x18\x8d\x07\xcf\xc8\x71\x08\x15\x30\x76\x01\x81\x28\x04\xb0\x1c\xb0\x91\xc1\xd3\x53\xdd\x0d\x46\x76\x80\xf4\x2f\xd7\x06\x4e\xa0\x93\x93\x4b\x73\x08\xd0\x71\x92\x13\x9d\x5c\x1b\x4f\xab\xe6\xf7\xd4\xde\xab\x76\xad\x5a\x7b\xd5\xce\xf3\xbc\xcf\xfb\xe7\xeb\x64\xc0\xe8\x33\xdf\x5d\xb5\x4b\xb5\xea\x5b\xfb\xb2\xb4\xc8\x78\x41\xef\xdf\x15\xe9\xf7\x59\x62\xcf\x36\xd5\xbd\x88\x5c\x4f\xac\xcb\xa6\x1f\x2f\x91\xfb\x1f\x32\xb1\x7b\x95\xe4\xfe\x87\x9f\xef\xb4\x2c\x36\xf7\x9f\x30\x2d\x16\x30\x23\xb1\x90\xc8\xfd\xbf\x88\x5c\x67\xac\xa3\xb1\xf0\x62\xc1\xf4\xdc\x7f\xa5\x0b\xa3\x00\xe5\x95\xc3\x35\x11\x99\x0b\x52\x9d\x0d\xd5\x89\x3e\xe0\x36\x69\x2c\x60\x46\x63\x01\x33\x1a\x0b\x98\xd1\x58\xc0\x8c\xc6\x02\x66\x34\x16\x10\xd3\x62\x01\x5d\x33\x2d\x16\x30\xa3\xb1\x80\xdb\xa4\xb1\x20\x75\xe7\xb3\xb1\x80\xdb\xa4\xb1\x20\xd8\xfc\x1d\x16\xcd\xef\xa7\x3a\x1a\x0b\xf2\x5c\xf4\xdc\x7f\xaa\xa3\xb1\x80\xfb\x40\x63\x01\xeb\x68\x2c\xa0\xe3\x69\xf9\x0b\xe2\x57\x14\x16\x5e\xac\x8d\x17\xb6\x0b\x0d\x9f\xfb\x8f\x98\x96\xef\x8c\x19\xcd\x77\xbe\x50\x30\x3e\xf7\x1f\xeb\x68\xbe\xf3\x39\x21\x4b\xc9\xfd\xc7\x3a\x9a\xef\x8c\x75\x34\xdf\x19\x33\x9a\xef\x8c\x19\xcd\x77\xc6\x8c\xe6\x3b\x63\x46\xf3\x9d\x31\xa3\xf9\xce\x88\x69\xf9\xce\x98\xd1\x7c\x67\xd4\x77\x2d\xdf\x19\x33\x9a\xef\x8c\xdb\xa4\xf9\xce\x52\xc7\xe7\xfe\xe3\x36\x69\xbe\x33\xd6\xd1\x7c\x67\xac\xa3\xf9\xce\xe2\x5c\x52\x72\xff\xb1\x8e\xe6\x3b\xe3\x3e\xd0\x7c\x67\xac\xa3\xf9\xce\xe8\x78\x5a\xbe\xb3\xdc\x79\xad\xe7\xfe\x8b\x7d\x87\x29\xb9\xff\x88\x69\xb1\x80\x19\x8d\x85\xf3\x05\xe3\x73\xff\xb1\x8e\xc6\x42\x5e\x30\x3e\xf7\x1f\xeb\x68\x2c\x60\x1d\x8d\x05\xcc\x68\x2c\x60\x46\x63\x01\x33\x1a\x0b\x98\xd1\x58\xc0\x8c\xc6\x02\x62\x5a\x2c\x60\x46\x63\x01\xf5\x5d\x8b\x05\xcc\x68\x2c\xe0\x36\x69\x2c\x48\x1d\x9f\xfb\x8f\xdb\xa4\xb1\x80\x75\x34\x16\xb0\x8e\xc6\x82\x3c\x17\x3e\xf7\x1f\xeb\x68\x2c\xe0\x3e\xd0\x58\xc0\x3a\x1a\x0b\xe8\x78\x5a\x2c\x08\x5f\x60\x72\xff\x45\x6c\xa5\xe4\xfe\x23\xa6\xe5\xfe\x63\x46\x73\xff\x85\x2f\xa4\xe4\xfe\x63\x1d\xcd\xfd\x97\xcf\x00\x3e\xf7\x1f\xeb\x68\xee\x3f\xd6\xd1\xdc\x7f\xcc\x68\xee\x3f\x66\x34\xf7\x1f\x33\x9a\xfb\x8f\x19\xcd\xfd\xc7\x8c\xe6\xfe\x63\x46\x73\xff\x11\xd3\x72\xff\x51\xdf\xb5\xdc\x7f\xcc\x68\xee\x3f\x6e\x93\xe6\xfe\x4b\x1d\x9f\xfb\x8f\xdb\xa4\xb9\xff\x58\x47\x73\xff\xb1\x8e\xe6\xfe\xcb\x73\xe1\x73\xff\xb1\x8e\xe6\xfe\xe3\x3e\xd0\xdc\x7f\xac\xa3\xb9\xff\xe8\x78\x89\xdc\x7f\x35\x5e\xf0\x3f\xcd\x8f\x17\x98\xdc\x7f\xc2\xf8\xf1\x02\x93\xfb\x1f\xb2\x8b\x04\xd3\x73\xff\xa9\x8e\x1d\x2f\x30\xb9\xff\x54\x47\xc7\xce\x58\x47\xc7\xce\x98\xb1\xe3\x05\x26\xf7\x9f\x32\x76\xbc\xc0\xe4\xfe\x53\xc6\x8e\x17\x98\xdc\x7f\xc2\xf8\xf1\x02\x93\xfb\x4f\x19\x3b\x5e\x60\x72\xff\x63\x9d\x9e\xfb\x4f\xdb\x64\xc7\x0b\xa0\xa3\x63\x67\xac\x63\xc7\x0b\x4c\xee\x3f\xd5\xb1\xe3\x05\x26\xf7\x9f\xea\xd8\xf1\x82\x9e\xfb\x1f\xcf\x23\x91\xdc\x7f\x35\x16\x67\x72\xff\x09\xe3\xe7\x91\x98\xdc\x7f\x35\x8f\x24\x7e\x01\x20\x65\x1e\x89\xc9\xfd\x57\x63\x7f\x26\xf7\x9f\xea\xd8\x79\x24\xd0\xb1\xf3\x48\x4c\xee\x3f\x65\xec\x3c\x12\x93\xfb\x4f\x19\x3b\x8f\xc4\xe4\xfe\x53\xc6\xce\x23\x31\xb9\xff\xaa\xef\xe2\x17\x00\xb2\xfe\xbb\x48\x2c\xa0\xeb\xc2\xcf\x23\x31\xb9\xff\xb1\x4e\xcf\xfd\xa7\x6d\xb2\xf3\x48\x72\xec\xec\x1f\xe2\x18\x93\xfb\x1f\x9f\x8b\x9e\xfb\x4f\x75\xec\x3c\x12\x93\xfb\x4f\x75\xec\x3c\x52\x4a\xee\xbf\x58\x5f\x60\x72\xff\xc5\x1c\x6d\x4a\xee\x3f\x62\xda\x5a\x1b\x66\x74\xad\x4d\xac\x2f\xa4\xe4\xfe\x63\x1d\x5d\x6b\x13\x73\xc2\x29\xb9\xff\x58\x47\xd7\xda\xb0\x8e\xae\xb5\x61\x46\xd7\xda\x30\xa3\x6b\x6d\x98\xd1\xb5\x36\xcc\xe8\x5a\x1b\x66\x74\xad\x0d\x33\xba\xd6\x86\x98\xb6\xd6\x86\xfa\xae\xad\xb5\x61\x46\xd7\xda\x70\x9b\x74\xad\x4d\xea\xf8\xdc\x7f\xdc\x26\x5d\x6b\xc3\x3a\xba\xd6\x86\x75\x74\xad\x4d\x9e\x0b\x9f\xfb\x8f\x75\x74\xad\x0d\xf7\x81\xae\xb5\x61\x1d\x5d\x6b\x43\xc7\x83\xf5\x05\xb2\x4f\xd5\xdf\x49\xf3\x17\x20\x6f\x5e\x1c\x2b\xce\x6b\x4b\xe4\x36\xe0\xdc\xff\xae\xda\xf7\x85\x18\xec\x53\xed\xa8\x58\x10\x79\x6d\xfe\x4b\x50\x2c\x74\xd5\x78\x01\xeb\x9e\x06\x16\xc5\x82\xc8\x45\x4a\xe4\xfe\x77\x55\x2c\x60\x1d\xc9\x5f\x90\x4c\xd6\xa8\xf2\xcf\x26\x7d\xc0\x6d\xde\xa6\x74\x3a\xab\x1b\xd8\x65\xc0\xa2\x58\xc0\xec\x22\xa5\xeb\x6a\xec\x6c\x72\x9e\x98\x6d\x51\x7d\x5f\xa5\x8c\xe6\x2f\x24\xd8\x5f\x02\x73\x18\xf6\x4d\xf2\x1d\x61\xd6\x57\x2c\x8f\x18\xce\xfd\xef\xaa\x58\x40\xd7\x1a\xf2\x17\xba\x2a\x16\xce\x43\xba\x3b\x15\x1b\x6a\xba\x9b\x09\x2b\x20\x76\x20\xfd\x3e\x83\x7d\xaa\x5d\x15\x0b\xb8\x0f\xe7\xaa\xeb\x39\xd0\x74\x93\xea\x78\x7d\x7a\xbc\x13\x51\x0e\x4d\xb4\xe7\x63\x36\xfc\x74\xa9\x1c\xfb\x02\xe4\x48\x8f\x87\x9a\xa5\x97\xa1\x58\xe0\x99\xad\x9e\x2b\x1a\x83\x1c\xcf\x86\xda\x8f\xf4\x42\xc1\xc4\x68\xfd\xe4\xf7\x95\x2f\xe8\xba\x67\xd4\xb3\x43\xb0\xa5\x4d\xc1\x2e\x14\x2c\x7a\x8e\xb5\x18\x5d\xf4\x1c\x6b\x32\xba\xa3\xc9\x3e\x24\xd8\xed\x06\xdd\x21\x03\xbb\x5c\xf9\x82\xce\x2e\x36\xe8\xce\x31\xb0\xf1\xf4\xbe\xcf\x0f\xd3\xfb\x0e\x39\x9e\x2d\x95\xfb\x8f\xd9\xb7\x92\xdf\x51\xa2\xcd\x27\xd8\xef\xef\x62\xc1\x7e\x4b\xf9\x82\xde\xe6\xf1\xe4\x79\x26\x74\xef\x61\x99\xd4\xbd\x89\xed\x9f\x64\xd5\xf4\xfb\x0c\x72\x3c\xd9\x6b\x0d\x39\x9e\xea\x7a\x26\x74\x67\xa4\x1f\x0f\x72\x3c\xcb\xa7\xeb\xd9\x8e\xd0\x89\xd9\xfe\xa5\xf3\x20\x16\xca\x2a\x26\xc7\x84\x46\xac\x65\xc0\x9e\x6d\x96\xc1\x9e\xed\xb2\x7a\xe6\x60\xf6\x2c\xb0\xc8\x17\x9e\x2f\x98\xac\x27\xf5\xe7\xc0\x22\x5f\xc0\xba\x01\x30\xf0\x85\xa5\xe7\x04\x3b\x57\xb0\x2f\x00\x8b\x7c\x01\xeb\x1e\x02\x06\xcf\xdb\x84\xee\x48\xb2\xdf\x09\x76\xab\xd2\xe9\xec\xa0\x81\x5d\x0a\x0c\x7c\x21\xc1\x5e\xaa\x74\x5d\x8d\xe5\x0d\xe7\x39\xa6\xfa\xbe\x4a\x19\xec\xd9\x2e\x2b\x5f\x40\x7d\x87\x3d\xdb\x65\xe5\x0b\x98\x7d\x23\xf9\x1d\x25\xda\xfc\x92\x62\x56\xb6\xa9\x74\x32\x57\xee\x13\xea\x3b\xaa\x6a\x6d\xde\xa7\xce\xb3\xab\xe9\x1c\xc5\x86\x9a\xee\x8d\x49\x06\xe7\x22\xd9\x95\xe9\xf7\x19\xec\xd9\x2e\x47\xbe\x90\xe8\xc3\x8b\xd5\xf5\x1c\x68\xba\x09\x75\xbc\x35\x7a\x3c\xd8\xb3\x4d\x7d\xe1\x1c\xe4\x0b\x7d\x14\x5b\x67\x11\x5f\xd0\x59\xec\x0b\x1a\x4b\xf1\x85\x59\xe2\x0b\xba\x2e\xf6\x85\x3e\x8a\xe5\x17\x12\x5f\xd0\x75\xb1\x2f\xe8\xba\xa3\xc9\x3e\x24\xd8\xed\x06\xdd\x21\x03\x8b\x7d\x41\x67\x17\x1b\x74\xe7\x18\xd8\x78\x7a\xdf\x91\x2f\x68\x7d\x47\xbe\xa0\xb3\x6f\x25\xbf\xa3\x44\x9b\x4f\xb0\xdf\xdf\x14\xf1\x05\xbd\xcd\xe3\xc9\xf3\x4c\xe8\xde\xc3\xb2\xb3\x88\x2f\xe0\x73\x39\x8b\xf8\x82\xae\xdb\x93\x7e\xad\x91\x2f\xe8\xba\x33\xd2\x8f\x87\x7c\xa1\x8d\x7c\xe1\x79\x29\xbe\x30\x6e\xf0\x85\x71\x83\x2f\x8c\x1b\x7c\x61\xd2\xe0\x0b\xe3\xe9\xbe\xb0\x78\xda\xe0\x0b\xe3\xe9\xbe\x00\xba\x23\xc9\x3e\x24\x58\xec\x0b\x3a\x3b\x68\x60\xac\x2f\x00\x63\x7d\x01\x18\xeb\x0b\xc0\x58\x5f\x90\x2c\xc5\x17\xc6\x0d\xbe\x30\x9e\xee\x0b\xd0\x26\xf6\x85\x58\x97\x31\xf8\xc2\xb8\xe6\x0b\x54\xc7\xfb\xc2\xb8\xc1\x17\xc6\x0d\xbe\x30\x9e\xee\x0b\xd0\x07\xde\x17\xc6\x0d\xbe\x30\x6e\x71\x39\x9e\x32\xbb\xff\x94\x16\x0b\x5b\xc4\xb1\xd6\xad\x38\xc7\x93\x67\x16\x89\x05\xc4\x60\xec\x1c\xc7\xc2\x0b\x04\xfb\xbf\x82\x7d\x8f\xc4\x02\xd6\xc9\xb1\x73\x49\xc5\xc2\x29\xc1\xfe\xc6\x8a\xc7\xce\x71\x2c\x60\xdd\xc3\xc9\x7b\x2c\xc1\xee\x85\x36\xa3\x58\xc0\x6d\xde\x06\xac\xc9\xb0\xba\x81\x5d\x06\x2c\x8a\x05\xcc\x2e\x52\xba\xae\xc6\xce\x56\xac\xa7\xb1\x2d\xaa\xef\xab\x94\xc1\xd8\x39\x8e\x05\xd4\x3f\x18\x3b\xc7\xb1\x80\xd9\x37\xa1\xcd\x28\x16\x70\x9b\x7d\xf5\xfd\xe1\xef\x41\xec\x19\x83\xb1\x73\x1c\x0b\xb8\xcd\x63\x24\x16\xb0\xee\x4e\x12\x0b\x58\x77\xb3\xea\xdf\x50\x3b\x97\x03\xe9\xf7\x19\x8c\x9d\x4b\x2a\x16\xb0\xee\x5c\x12\x0b\x58\x37\xa9\x8e\xd7\xa7\x3a\x18\x3b\x13\x5f\x58\xfc\x23\xde\x17\x16\xfd\x74\x5f\x90\x8c\xf7\x05\x60\xac\x2f\x2c\x3e\x93\xee\x0b\xa0\xe3\x7d\xe1\xf1\x74\x5f\x00\x1d\xef\x0b\x8f\x1b\x7c\xe1\x71\x83\x2f\x3c\x6e\xf0\x85\xc7\x0d\xbe\xf0\xb8\xc1\x17\x1e\x37\xf8\xc2\xe3\x06\x5f\x78\x3c\xdd\x17\x64\xdf\x79\x5f\x00\xc6\xfb\xc2\xe3\xe9\xbe\xb0\xf8\xd9\x74\x5f\x80\x36\x59\x5f\x00\x1d\xeb\x0b\xa0\x63\x7d\x01\xce\x85\xf5\x05\xd0\xf1\xbe\xf0\x78\xba\x2f\x80\x8e\xf5\x05\xa9\x4b\xf1\x85\x4f\xa4\xf8\xc2\xfd\x06\x5f\xb8\xdf\xe0\x0b\xf7\x1b\x7c\xc1\x35\xf8\xc2\xfd\x06\x5f\x38\x6c\xf0\x85\xfb\x91\x2f\xd0\xe7\xed\x61\x83\x2f\x1c\x36\xf8\xc2\x61\x83\x2f\x1c\x36\xf8\xc2\x61\x83\x2f\x1c\x36\xf8\xc2\x61\x83\x2f\x1c\x36\xf8\xc2\xfd\x06\x5f\xb8\xdf\xe0\x0b\x87\x0d\xbe\xf0\x2b\x06\x5f\xb8\xdf\xe0\x0b\xbf\x62\xf0\x85\xfb\x0d\xbe\x70\xd8\xe0\x0b\xf7\x1b\x7c\xe1\xb0\xc1\x17\xee\x37\xf8\xc2\x61\x83\x2f\xdc\x92\xe2\x0b\x07\x0d\xbe\x70\xd0\xe0\x0b\x07\x0d\xbe\xf0\x16\x83\x2f\x1c\x34\xf8\xc2\x35\x06\x5f\x38\x68\xf0\x85\x6b\x0c\xbe\x70\x8d\xc1\x17\xae\x31\xf8\xc2\x35\x06\x5f\xb8\xc6\xe0\x0b\xd7\x18\x7c\xe1\x1a\x83\x2f\x5c\x63\xf0\x85\x83\x06\x5f\x38\x68\xf0\x85\x6b\x0c\xbe\x70\x99\xc1\x17\x0e\x1a\x7c\xe1\x32\x83\x2f\x1c\x34\xf8\xc2\x35\x06\x5f\x38\x68\xf0\x85\x6b\x0c\xbe\x70\xd0\xe0\x0b\xd7\x58\x5c\xee\xbf\x18\x51\x2f\xbe\x5c\xcb\xfd\xcf\x08\x4d\xd1\xe2\x72\xff\x11\xd3\x72\xff\x31\x23\xb9\xff\x5f\x7d\x9e\x60\x62\xef\x38\xda\x83\xa1\xeb\x48\xee\xff\xd2\x4f\x05\x93\xbf\x37\x4a\x73\xff\xb1\x8e\xe4\xfe\x27\x74\x24\xf7\x3f\xc1\x6e\x31\xe8\x48\xee\x7f\x82\x91\xdc\xff\x04\xbb\xd0\xd0\xe6\xac\x81\x65\xd2\xfb\xae\xe5\xfe\xa3\xbe\x6b\xb9\xff\x98\x91\x3d\x18\x89\x36\x69\xee\xbf\xd4\xc9\xdf\x5f\xa4\xb9\xff\xb8\x4d\x9a\xfb\x8f\x75\x34\xf7\x1f\xeb\x6e\x32\xf4\x8f\xe6\xfe\x63\x5d\x29\xfd\x5a\x6b\xb9\xff\x58\x97\x4d\x3f\x1e\xec\xc1\x88\xe7\x54\xc5\x2f\x17\x2c\x46\xf3\x48\x4d\xf5\xb9\x15\x6a\x16\xfe\xd3\x8a\xf7\x60\xb0\x0c\xf6\x60\x34\xd5\xdc\x28\x66\xeb\x70\xac\x68\x4e\xf5\x0c\x71\x1e\xb6\x15\xaf\x3b\xf3\xba\xa7\x80\x45\xf3\x60\xff\x29\xd8\x3f\x09\xf6\x28\xb0\x16\xa3\x7b\x10\x58\x93\xd1\x1d\x4e\xf6\x21\xc1\xde\x6d\xd0\xdd\x68\x60\x15\x60\x0d\x86\x5d\x00\xcc\x61\xd8\x36\x43\x9b\x76\x7a\xdf\x61\x0f\x06\xdb\x77\xd8\x83\xa1\x8e\x97\x60\xcf\x00\xab\x30\x6d\x3e\x96\x64\xa0\xfb\xa1\x60\x1e\xb0\x2a\xd3\xe6\xd1\xe4\x79\x26\x74\xb7\xb3\x4c\xea\x0e\x19\xfa\x77\x79\xfa\x7d\x06\x7b\x30\xd8\x6b\x0d\x7b\x30\xd4\xf5\x4c\xe8\xc6\xd3\x8f\x07\x7b\x30\xe2\xdf\xa0\xc9\x85\x9f\x2e\xfc\x05\xc4\x82\x1a\x47\x2c\x05\x42\xf3\x4d\x14\x0b\x2c\x83\x58\xa8\x47\xfb\x91\x12\x6c\x1d\x8e\x15\xbd\x23\x4d\x08\xf6\x67\x28\x16\xea\xd1\x7e\xa4\x84\xee\x29\x60\xd1\x3b\xd2\xbf\x0b\xb6\x84\x62\xa1\x1e\xbd\x23\x25\x74\x0f\x02\x8b\xde\x3d\xb0\xee\x30\xe9\x03\x66\xef\x56\x3a\x9d\xdd\x68\x60\x15\x60\xd1\x3b\x12\x66\x17\x00\x83\xfd\x48\x09\xb6\xcd\x70\x9e\xb6\xea\xfb\x2a\x65\x10\x0b\xf5\xe8\x1d\x09\xf7\x1d\x62\xa1\x1e\xbd\x23\x25\xd8\x33\xc0\x2a\xfa\x79\x42\x2c\xd4\xa3\xf1\x02\xe8\x9e\x40\xb1\x50\x8f\xde\x91\x12\x6d\x1e\x55\xe7\xd9\xd5\x74\xb7\x47\x4c\xee\x39\x4a\xe8\x0e\x11\x86\xcf\xe5\xf2\xf4\xfb\x0c\x62\xa1\xae\xde\x91\xb0\xee\x1c\x75\x3d\x07\x9a\x6e\x5c\x9d\xe7\x1a\xd5\x41\x2c\xc4\xbf\x4d\x26\x7c\x61\xe1\x91\xd8\x17\xe0\x73\x19\x5b\x0f\x26\x7d\x41\x67\xc8\x17\xea\x1a\x53\xbe\x00\xb1\x20\x7c\x61\xe1\xd3\xc4\x17\xf2\x9a\x4e\xf9\x02\xc4\x82\x8c\xe5\x5f\x4b\xfa\x02\xb4\x89\x75\xca\x17\xe0\x7a\x61\xdd\xe1\x64\x1f\x12\x4c\xf9\x02\xc3\x6e\x34\xb0\xd8\x17\xaa\x1a\x53\xbe\x00\xf7\x0a\x66\xdb\x0c\xe7\xa9\x7c\x01\x62\x01\xb1\xd8\x17\xf4\xef\x21\xf6\x05\x86\xc5\xbe\xa0\x9d\x27\xf2\x05\xfc\x3d\xb4\x89\x2f\x54\xb5\x36\x95\x2f\xc0\x78\x01\xeb\x62\x5f\xc8\x69\xba\x43\x49\x96\x38\x97\xcb\xd3\xef\xb3\xd8\x17\xf4\x6b\x16\xfb\x02\x8c\x17\xb0\x4e\xf9\x02\xc4\x02\xd2\x69\xb9\xff\x62\xbc\xb0\xf0\x5e\x6d\xcf\xb6\x78\xe7\x5a\xf8\x25\x8b\xdb\xb3\x8d\x98\xb6\x67\x1b\x33\xba\x67\x5b\x8c\x17\x16\x6e\x25\xe3\x05\x5d\x47\xf6\x6c\xcb\x77\xbc\x85\x3a\x19\x2f\xe8\x3a\xb2\x67\x3b\xa1\x23\x7b\xb6\x13\xec\x16\x83\x8e\xec\xd9\x4e\x30\xb2\x67\x3b\xc1\x2e\x34\xb4\x39\x6b\x60\x99\xf4\xbe\x6b\x7b\xb6\x51\xdf\xb5\xfc\x05\xcc\xd8\xf1\x02\xb4\x49\xf7\x6c\x4b\xdd\xeb\xc8\x78\x41\x6f\x93\xee\xd9\xc6\x3a\x9a\xbf\x80\x75\x37\x19\xfa\x47\xf7\x6c\x63\x5d\x29\xfd\x5a\x6b\x7b\xb6\xb1\x2e\x9b\x7e\x3c\x2d\xf7\x7f\xab\x88\x85\x2b\xb4\x58\xb0\x85\xe6\x17\xd8\x58\x40\x4c\x8b\x05\xcc\x68\x2c\xfc\x37\xc1\x5e\xcd\xc6\x02\xd6\xd1\x58\xd8\x10\x6c\x27\x1b\x0b\x58\x47\x63\x01\xeb\x68\x2c\x60\x46\x63\x01\x33\x1a\x0b\x98\xd1\x58\xc0\x8c\xc6\x02\x66\x34\x16\x30\xa3\xb1\x80\x98\x16\x0b\xa8\xef\x5a\x2c\x60\x46\x63\x01\xb7\x49\x63\x41\xea\x2e\x64\x63\x01\xb7\x49\x63\x01\x33\x1a\x0b\x98\xd1\x58\x90\xe7\xb2\x87\x8d\x05\xac\xa3\xb1\x80\xfb\x40\x63\x01\xeb\x68\x2c\xa0\xe3\xc5\x63\x67\xf0\x21\xb1\x83\x64\xe1\x67\xe8\x3b\xd2\xd2\x69\xa1\x11\xa3\x09\xc8\x77\x66\x19\xe4\x3b\xab\x77\xa4\x04\x93\xf9\xce\x8e\x7a\x47\x9a\x14\x4c\xee\x47\xfa\xb6\xf2\xdf\xbc\xa6\xfb\x2a\x79\x47\xfa\x8f\x90\xf9\xa7\x04\x7b\x24\xf9\x8e\x94\xd0\x7d\x84\xbc\x7b\x60\xdd\xfb\x49\x1f\x30\x6b\x92\xf7\x20\xcc\xae\x37\xb0\x57\xa9\xb1\x5e\x55\x63\xe7\x91\x77\x24\xcc\xce\x52\x6d\xf6\x29\x83\x7c\xe7\xf8\x1d\x09\xb3\x67\x93\xef\x48\xb8\xef\x90\xef\xac\xde\x91\x12\x6c\xa0\xbe\x23\xed\x3c\x21\xdf\x59\xbd\x23\x81\x4e\xee\xa5\x78\x48\xbd\xcf\x54\xb5\x36\x8f\x24\xdf\x91\x12\xba\x5b\x15\x1b\x6a\xba\x83\xaa\xef\xc3\xf8\x5c\x16\x44\x4d\x0e\xc8\x77\x66\xef\x33\xc8\x77\x8e\xdf\x91\x70\x1f\xf2\xc9\x77\xa4\x84\x6e\x8c\xbc\x23\xa1\xe3\x9d\x88\x7e\x9f\x36\x8a\x05\x51\xd9\xc4\xff\x37\x6d\xec\x3c\x12\xc7\xfa\x31\x8a\x05\x96\x41\x2c\xc4\x63\x67\xcc\x7e\x0c\x2c\x8a\x85\xac\x60\xff\x84\x62\xa1\xae\x62\x01\xeb\xbe\xaa\xc6\x3b\x32\x16\xfe\x4d\xb0\x6f\xa3\x58\x88\xc7\xce\x58\xf7\x11\x35\x86\xea\x69\xba\xf7\x93\x3e\x60\xd6\x54\x3a\x9d\x5d\x6f\x60\xaf\x8a\xda\x84\x7b\x05\xb3\xf3\x80\x45\xb1\x80\xd9\x59\xaa\xcd\x3e\x65\x10\x0b\xf1\xd8\x19\xb3\x67\x55\xdf\xb5\xef\x01\x62\x21\x1e\x3b\x63\x36\x50\xdf\x91\x76\x9e\x10\x0b\xf1\xd8\x59\xea\x56\x51\x2c\xd4\x55\x2c\xe0\x36\x8f\xa8\xf3\xec\x6a\xba\x5b\x15\x1b\x6a\xba\x83\xaa\xef\x43\x74\x2e\x7f\x8b\x62\x81\xbd\xcf\x20\x16\xe2\xb1\x33\xee\x43\x5e\xb5\x39\xd0\x74\x63\xea\x5c\xd6\xe8\xf1\x20\x16\x88\x2f\xf8\x7f\xc8\xfb\x82\xff\x55\x2b\xce\xfd\x67\x19\xe4\xfe\x13\x5f\x00\xf6\x13\xce\x17\xfc\xdf\x17\xec\x3b\x9c\x2f\x80\xee\x6b\xac\x2f\x3c\x22\x58\x8f\xf3\x05\xd0\x7d\x94\xf5\x05\xa9\xfb\x00\xeb\x0b\x92\xbd\x8b\x7d\xf6\x4b\x76\x83\x81\xbd\x5a\xf9\x42\x45\x63\xe7\xb3\xbe\x20\xd9\x0c\xeb\x0b\x92\x59\xac\x2f\x08\x06\xb9\xff\xc4\x17\x64\xdf\x21\xf7\x9f\xf8\x02\xb0\xa7\x59\x5f\x90\x6d\x7e\x91\xf3\x05\x5f\xee\x6d\x78\x98\xf3\x05\x68\xf3\x5e\xce\x17\x40\x77\x1b\xe7\x0b\xa0\xab\x13\x26\xcf\x45\xd6\x4a\xb8\x2c\xfd\x3e\x83\xdc\x7f\xea\x0b\xb2\x0f\x67\x73\xbe\x00\xba\x2d\xea\x78\x7d\x7a\x3c\x2d\xf7\x5f\x8c\x17\xfc\x2e\x3f\x5e\xf0\x3f\x92\x3e\x5e\x90\x8c\x1f\x2f\x00\x63\xc7\x0b\xfe\xc7\xd3\xc7\x0b\xa0\x63\xc7\x0b\xfe\xfb\xd3\xc7\x0b\xa0\x63\xc7\x0b\xa0\x63\xc7\x0b\xc0\xd8\xf1\x02\x30\x76\xbc\x00\x8c\x1d\x2f\x00\x63\xc7\x0b\xc0\xd8\xf1\x02\x30\x76\xbc\x20\x19\x3f\x5e\x90\x7d\xe7\xc7\x0b\xc0\xd8\xf1\x02\xb4\xc9\x8e\x17\xfc\x0f\xa6\x8f\x17\xa0\x4d\x76\xbc\x00\x3a\x76\xbc\x00\x3a\x76\xbc\xe0\x3f\x90\x3e\x5e\x00\x1d\x3b\x5e\x80\x3e\xb0\xe3\x05\xd0\xb1\xe3\x05\x79\x3c\x2d\xf7\x5f\x66\x21\xa4\xcc\x23\xf9\xef\x62\x63\x01\x31\x7e\x1e\x09\x18\x3b\x8f\xe4\xdf\xc1\xc6\x02\xd6\xb1\xf3\x48\xfe\x0d\x6c\x2c\x60\x1d\x3b\x8f\x04\x3a\x76\x1e\x09\x18\x3b\x8f\x04\x8c\x9d\x47\x02\xc6\xce\x23\x01\x63\xe7\x91\x80\xb1\xf3\x48\xc0\xd8\x79\x24\xc9\xf8\x79\x24\xd9\x77\x7e\x1e\x09\x18\x3b\x8f\x04\x6d\xb2\xf3\x48\xfe\x1b\xd9\x58\xc0\x6d\xb2\xf3\x48\xa0\x63\xe7\x91\x40\xc7\xce\x23\xf9\xbf\xc4\xc6\x02\xd6\xb1\xf3\x48\xd0\x07\x76\x1e\x09\x74\xec\x3c\x92\x3c\x9e\x36\x76\x16\xeb\x0b\xfe\x35\xfc\xfa\x82\x2f\x6a\x4b\xf0\xeb\x0b\x92\xf1\xeb\x0b\xc0\xd8\xf5\x05\xff\x80\x95\xba\xbe\x00\x3a\x76\x7d\xc1\xbf\xc0\x4a\x5d\x5f\x00\x1d\xbb\xbe\x00\x3a\x76\x7d\x01\x18\xbb\xbe\x00\x8c\x5d\x5f\x00\xc6\xae\x2f\x00\x63\xd7\x17\x80\xb1\xeb\x0b\xc0\xd8\xf5\x05\xc9\xf8\xf5\x05\xd9\x77\x7e\x7d\x01\x18\xbb\xbe\x00\x6d\xb2\xeb\x0b\xbe\xcc\x8f\x64\xd7\x17\xa0\x4d\x76\x7d\x01\x74\xec\xfa\x02\xe8\xd8\xf5\x05\x5f\x54\xc4\xe1\xd7\x17\x40\xc7\xae\x2f\x40\x1f\xd8\xf5\x05\xd0\xb1\xeb\x0b\xf2\x78\xda\x5a\x9b\x98\xd5\xf1\x77\x68\xbf\x83\x21\x72\x83\x7c\xb1\x6f\xc3\x9f\x31\xb0\x48\x17\xed\xcd\x43\x0c\xf6\xa9\xc6\xb1\x20\xf2\xda\x7c\x51\x3b\xf8\x64\xf4\xdb\x56\xd1\xde\x3c\xac\x8b\x7e\xdb\x2a\x8a\x05\x91\x8b\xe4\xcb\x5a\xb8\xd1\x6f\x5b\x45\xb1\x80\x75\xd1\x6f\x5b\x45\xf7\x18\xd6\xdd\x9b\xec\x43\x82\xdd\xa6\x74\x3a\xab\x1b\x58\xf4\xdb\x56\x51\x2c\x60\x76\x91\xd2\x75\x35\x76\xb6\xe1\x3c\xe3\xdf\xb6\x5a\xa5\x0c\xf6\xa9\xc6\xbf\x83\x81\xfa\x0e\xfb\x54\xe3\xdf\xc1\xc0\xec\x9b\xc9\xef\x28\xd1\x66\x5f\x31\xfc\x3d\xc8\x1a\x1f\x9f\x54\xdf\x51\x55\x6b\xf3\x98\x3a\xcf\xae\xa6\xbb\x53\xb1\xa1\xa6\xbb\x39\xc9\xe0\x5c\x24\x3b\x90\x7e\x9f\xc1\x3e\x55\xf5\x3b\x18\x89\x3e\x9c\xab\xae\xe7\x40\xd3\x4d\xaa\xe3\xf5\xe9\xf1\x60\x9f\xaa\xaa\xf7\xb0\xf4\xaf\xe1\xa7\x4b\xd1\xde\x3c\x47\xe5\xc6\xff\x20\xd4\x24\xea\xfe\xf3\xcc\x06\x56\xd1\xd9\xc9\xe8\x37\x4c\x60\x3f\xd2\xd2\xb3\x21\x3b\xf9\x7d\x71\xc4\x7d\xa0\xab\x31\x3a\x9a\xfb\xbf\x2a\x18\xae\xfb\xef\x44\xf9\xef\x09\x1d\xcd\xfd\xc7\x3a\x9a\xfb\x8f\x19\xcd\xfd\xc7\x8c\xe6\xfe\x63\x46\x73\xff\x31\xa3\xb9\xff\x98\xd1\xdc\x7f\xcc\x68\xee\x3f\x62\xf3\x43\xd2\xf7\xb0\xd7\xbb\xe6\x45\x4d\xca\xf0\x3a\x08\xe6\xe8\xd7\x45\xcb\xfd\xc7\x6d\x3e\xa1\xbe\xbf\x3e\xd2\xe1\xba\xff\x4e\x94\xfb\x9f\x68\xf3\x38\xb0\x32\xa3\x7b\x8f\x62\xba\x8e\xe6\xfe\xaf\x22\x56\x4d\xbf\xcf\xb4\xdc\x7f\xdc\x87\x9f\x01\x5d\x93\xd1\xd1\xdc\x7f\x74\x3c\xc8\xf1\x54\x73\xaa\x4b\x22\xcb\x4c\xaf\xfb\xbf\xf4\xb7\x42\xc3\xd6\xfd\xc7\x8c\xd6\x6b\x4b\xb0\x67\x81\x81\x2f\x2c\xad\x0b\xc6\xd6\xfd\x4f\xe8\xe4\x1c\x60\x55\xf9\xc2\xf7\x04\x63\xeb\xfe\x27\x74\x0f\x81\x2e\x7a\xde\x62\xdd\x11\x60\x51\x1f\x30\xbb\x55\xe9\x74\x76\xd0\xc0\x2e\x05\x16\xf9\x02\x66\x2f\x55\xba\xae\xc6\xf2\x86\xf3\x1c\x53\x7d\x5f\xa5\x8c\xd6\x6b\xc3\x7d\xa7\xf5\xda\x12\xec\x1b\xd0\x66\xf4\x1d\xe1\x36\x49\xbd\x36\xd0\xb1\x75\xff\x13\x6d\xd2\xba\xff\x58\x47\xea\xb5\x25\x74\x6f\x54\xfd\x1b\xa2\x73\x61\xeb\xfe\x27\x74\x3f\x17\x5d\x6b\xfd\x9a\xd1\x7a\x6d\x09\xdd\x84\x3a\xde\x1a\x3d\x1e\xec\xd9\xa6\xbe\xf0\x22\xe4\x0b\x38\xce\x67\x88\x2f\xe8\xcc\x66\x9f\x2b\x33\xe9\xbe\x90\xa8\xfb\xef\x44\xfb\x54\x13\x3a\x9a\xfb\x2f\x63\xf9\x4c\xe2\x0b\xba\x8e\xe6\xfe\x63\x1d\xcd\xfd\xc7\x8c\xe6\xfe\x63\x46\x73\xff\x31\xa3\xb9\xff\x98\xd1\xdc\x7f\xcc\x68\xee\x3f\x66\x34\xf7\x1f\x31\xe4\x0b\x5a\xdf\x21\xf7\xdf\x51\xfb\x62\x31\xa3\xb9\xff\xb8\x4d\xde\x17\xa6\x89\x2f\xe8\x6d\xf2\xbe\x30\x4d\x7c\x41\xd7\xd1\xdc\xff\x55\xc4\xaa\xe9\xf7\x99\x96\xfb\x8f\xfb\x10\xfb\x82\xae\xa3\xb9\xff\xe8\x78\x29\xbe\xa0\xd5\xfd\x87\xd8\x62\xeb\xfe\x63\x96\xe2\x0b\x59\x83\x2f\xb0\x75\xff\x13\x3a\xde\x17\xd8\xba\xff\x09\x1d\xef\x0b\x96\xc1\x17\x2c\x83\x2f\x58\x06\x5f\xb0\x0c\xbe\x60\x19\x7c\xc1\x32\xf8\x82\x65\xf0\x05\xb6\xee\x3f\xee\x7b\x8a\x2f\x64\x0d\xbe\xc0\xd6\xfd\x07\x1d\x5b\xf7\x3f\xd1\x26\xef\x0b\x6c\xdd\xff\x84\x8e\xf7\x05\xb6\xee\x7f\x42\xc7\xfb\x02\x5b\xf7\x3f\xa1\xe3\x7d\x81\xad\xfb\xbf\x38\x12\xb1\xf0\x2f\xda\xba\xf3\x5a\xa8\x59\xfc\x81\x15\x8f\x9d\x79\x16\xe9\xa2\xeb\x8c\x18\xad\xef\xbc\xf4\xf7\x56\x5c\xf7\x3f\x62\x51\x2c\x60\x1d\xa9\xef\xbc\xf4\x7d\xc1\xc4\x38\x03\xc6\xce\xf1\xba\x33\xd6\x91\xfa\xce\x09\x1d\xa9\xef\x9c\x60\xa4\xbe\x73\x82\xd5\x0d\x8c\xd4\x77\x4e\x30\x52\xdf\x39\xc1\xce\x36\x9c\x27\xa9\xef\x8c\x19\x8c\x9d\xe3\x75\x67\xd4\x77\x18\x3b\xc7\xeb\xce\x98\x91\xfa\xce\x89\x36\xfb\xca\x17\xc4\xf7\x10\x8e\x97\x73\xf2\xc9\x9a\x5d\xfc\x13\xf5\x1d\x55\xb5\x36\x8f\x45\xcf\x7e\xd9\xbf\xf0\xef\x46\x3a\xf0\x85\x78\xdd\x19\xeb\x48\x7d\xe7\xc4\xb9\x1c\x48\xbf\xcf\x68\x7d\xe7\x84\xee\x5c\xd0\x45\xb1\x80\x75\xa4\xbe\x33\xd6\xc1\xd8\xb9\x96\xac\xfb\x1f\xba\x03\x17\x93\x8b\x4f\xa4\xfb\x82\x64\xbc\x2f\x00\x63\x7d\x61\x71\x29\xdd\x17\x40\xc7\xfa\xc2\xe2\x23\xe9\xbe\x00\x3a\xd6\x17\x40\xc7\xfa\x02\x30\xd6\x17\x80\xb1\xbe\x00\x8c\xf5\x05\x60\xac\x2f\x00\x63\x7d\x01\x18\xeb\x0b\x92\xf1\xbe\x20\xfb\xce\xfb\x02\x30\xd6\x17\xa0\x4d\xd6\x17\x16\x3f\x95\xee\x0b\xd0\x26\xeb\x0b\xa0\x63\x7d\x01\x74\xac\x2f\xc0\xb9\xb0\xbe\x00\x3a\xd6\x17\x40\xc7\xfa\x02\xe8\x58\x5f\x90\x3a\xea\x0b\xa1\x23\xe4\xb2\x8b\x1f\x4d\xf1\x85\x7b\x0d\xbe\x70\xaf\xc1\x17\xee\x4d\xf7\x85\xc5\x5f\xb7\xe2\x39\x55\xea\x0b\xf7\x1a\x7c\xa1\x65\xf0\x85\x7b\x0d\xbe\xd0\x32\xf8\x42\xcb\xe0\x0b\x2d\x83\x2f\xb4\x0c\xbe\xd0\x32\xf8\x42\xcb\xe0\x0b\x2d\x83\x2f\xb4\x0c\xbe\x70\xaf\xc1\x17\xee\x35\xf8\x42\x0b\xf9\x42\xbc\x1f\x49\xea\xc4\x6f\xa1\xc3\x9c\xaa\xf2\x05\x51\xf1\x5f\xfe\x8d\x6c\xa8\x4e\xec\x47\xc2\xba\x3b\x59\x5f\xb8\xd7\xe0\x0b\x2d\x83\x2f\xdc\x6b\xf0\x85\x96\xc1\x17\xee\x35\xf8\x42\x8b\xf3\x05\x39\x5e\x58\x7c\x5b\x8a\x2f\xd4\x0c\xbe\x50\x33\xf8\x42\xcd\xe0\x0b\x37\x19\x7c\xa1\x66\xf0\x85\x2b\x0d\xbe\x50\x33\xf8\xc2\x95\x06\x5f\xb8\xd2\xe0\x0b\x57\x1a\x7c\xe1\x4a\x83\x2f\x5c\x69\xf0\x85\x2b\x0d\xbe\x70\xa5\xc1\x17\xae\x34\xf8\x42\xcd\xe0\x0b\x35\x83\x2f\x5c\x69\xf0\x85\x57\x1a\x7c\xa1\x66\xf0\x85\x57\x1a\x7c\xa1\x66\xf0\x85\x2b\x0d\xbe\x50\x33\xf8\xc2\x95\x06\x5f\xa8\x19\x7c\xe1\x4a\x8b\xe4\xfe\x8b\x35\xe9\xa1\x88\x85\x9f\x4f\xe4\xfe\xb7\xa6\x77\x2d\xfd\x8d\xd0\x88\x39\xb2\x44\xee\x3f\x61\x89\xdc\x7f\xca\x70\xee\x7f\xc8\x7e\x22\x98\x5c\x5f\xc5\xb9\xff\x54\x87\x73\xff\x43\xf6\xe7\x82\xc9\xbd\xde\x38\xf7\x9f\xea\x70\xee\x3f\xd5\xb5\x49\x1f\x30\xbb\xc5\xa0\x7b\x03\xe9\x03\x66\x38\xf7\x9f\xb2\x0b\x0d\x6d\xce\x1a\x58\x26\xbd\xef\x89\xdc\x7f\xd2\xf7\x44\xee\x3f\x65\x78\x0f\x06\x6d\x13\xe7\xfe\xc7\x3a\xf9\xdb\x8c\x1f\x4f\xff\x8e\x12\xb9\xff\x54\x77\x07\xcb\xa4\xee\x26\x43\xff\xae\x48\xbf\xcf\x12\xb9\xff\x54\xf7\x22\x72\x3d\xb1\x2e\x9b\x7e\x3c\x5a\xf7\x7f\xe9\xff\x88\x58\xd8\x42\xeb\xfe\x2f\xfd\x55\xa8\x59\x10\x91\xe2\x3f\x2f\x9d\x9d\xfc\x0f\x60\x35\x86\xfd\x00\x58\x34\xd7\xf5\x23\xc1\x9e\x13\xec\x8f\x81\x55\x19\xdd\x49\xc1\xe2\x79\xb0\xef\x0a\x26\xf7\x65\x7f\x86\xb4\x89\x75\x1f\x02\x5d\x93\xd1\xb5\x80\xd5\x19\xf6\x56\x83\xee\x75\xc0\x1a\x0c\x7b\xb9\x81\xed\x00\xe6\x30\xec\xcc\xf4\xe3\xcd\x3f\x07\xac\xc2\xb0\x1f\x41\xdf\x5b\x7a\xdf\xe7\x57\x80\x39\x0c\x5b\x82\x36\x6b\x4c\x9b\x9f\x67\xbf\xbf\xbf\x12\xec\x37\x81\x35\x98\x36\xef\x31\xe8\xde\x99\x7e\xbf\xcc\xbf\x3e\xfd\x7b\x98\xbf\xc4\xa0\x2b\x1a\xae\xd9\x56\xd0\xb5\x75\xdd\x89\x20\xfd\x5e\x3a\x21\x9f\xd5\xaa\xee\xff\xd2\x3f\x86\x9f\x2e\x7c\x27\x5e\x5f\x80\xcf\xff\x52\x68\x9e\x42\xb1\xc0\x32\x88\x05\x47\xed\xd9\xc6\x4c\xc6\x42\xbc\xef\xe6\x87\x82\x2d\xa3\x58\x70\xd4\x3b\x12\xd6\x9d\x04\x5d\xf4\x8e\xf4\x6d\xc1\x9e\x44\xb1\xe0\xa8\x36\xb1\xee\x43\xe4\x78\x58\xd7\x02\x16\xf5\x01\xb3\xb7\x2a\x9d\xce\x5e\x07\xac\xc1\xb0\x97\x47\x0c\xde\x21\x30\xdb\x01\x2c\xda\x8f\x84\xd9\x99\xe9\xe7\x09\xb1\xd0\x3c\x5d\x81\x77\x24\xcc\x7e\x04\x7d\x6f\xe9\xdf\x03\xc4\x82\xa3\xde\x91\x30\x5b\x82\x36\x6b\xfa\x79\x42\x2c\x38\xea\x37\x18\xa4\xee\xf7\x50\x2c\x38\xaa\x7f\xb8\xcd\x7b\x22\x1d\xf4\x0f\xeb\xde\x19\xdd\x2f\xb0\xe7\x08\xeb\x5e\x1f\x7d\x0f\x13\x93\xda\xb9\x5c\x92\x7e\x9f\x41\x2c\xf0\xd7\x6c\x2b\xe8\xda\xf0\x8e\x84\x74\x10\x0b\xf1\x7e\x24\xa4\x83\x58\x50\xb5\xd5\xa5\x2f\xe8\x75\xff\x21\xb6\x3e\x94\xf4\x05\x9d\x21\x5f\xa8\x6b\x4c\xf9\x02\x9c\xbf\xf4\x85\x87\x89\x2f\xe4\x35\x9d\xf2\x05\x88\x05\x19\xcb\x47\x93\xbe\x00\x6d\x62\x9d\xf2\x05\x60\x58\xa7\x7c\x01\xfa\x80\x99\xf2\x05\x86\x29\x5f\x60\x58\xec\x0b\x55\x8d\x29\x5f\x80\x7b\x05\xb3\x33\xd3\xcf\x33\xf6\x05\x88\x05\xcc\x94\x2f\xe8\xdf\x43\xec\x0b\x0c\x8b\x7d\x41\x3b\x4f\xe4\x0b\xf8\x7b\xb8\x8b\xf8\x42\x55\x6b\x53\xf9\x02\xf4\x0f\xeb\x62\x5f\xc8\x69\xba\xd8\x17\x26\xb5\x73\xb9\x24\xfd\x3e\x8b\x7d\x81\xb9\x66\xca\x17\x20\x16\x90\x2e\xf6\x05\x88\x05\xa4\x83\x58\x10\x7b\xb6\xe3\xf1\xc2\xc2\x1d\x89\x3d\xdb\xea\x9d\x6b\xe1\x8d\x16\xdd\xb3\x4d\x58\x62\xcf\x36\x65\x78\xcf\xb6\x1a\x2f\x2c\xbc\x9d\x8c\x17\x74\x1d\xde\xb3\xad\xde\xf1\x16\xae\x23\xe3\x05\x5d\x87\xf7\x6c\x53\x5d\x9b\xf4\x01\xb3\x5b\x0c\xba\x37\x90\x3e\x60\x86\xf7\x6c\x53\x76\xa1\xa1\xcd\x59\x03\xcb\xa4\xf7\x3d\xb1\x67\x9b\xf4\x3d\xb1\x67\x9b\x32\x76\xbc\x00\x6d\xe2\x3d\xdb\xb1\xee\x00\x19\x2f\xe8\x6d\x7e\x90\x9c\x27\xd6\xdd\xc1\xb2\x37\x92\xf1\x82\xde\xbf\x2b\xd2\xef\xb3\xc4\x9e\x6d\xaa\x7b\x11\xb9\x9e\x58\x97\x4d\x3f\x5e\x22\xf7\x3f\x64\xff\x2c\x62\xe1\x35\x5a\x2c\xfc\xb5\xd0\xec\x65\x63\x01\x31\x2d\x16\x30\xa3\xb1\xf0\x63\xc1\x5e\xc9\xc6\x02\xd6\xd1\x58\xf8\x9f\x82\x15\xd8\x58\xc0\x3a\x1a\x0b\x92\x6d\x67\x63\x01\xb7\x49\x63\x01\x33\x1a\x0b\x98\xd1\x58\xc0\x8c\xc6\x02\x66\x34\x16\x30\xa3\xb1\x80\x98\x16\x0b\xa8\xef\x5a\x2c\x60\x46\x63\x01\xb7\x49\x63\x41\xea\x76\xb3\xb1\x80\xdb\xa4\xb1\x80\x19\x8d\x05\xcc\x68\x2c\xc8\x73\xb9\x88\x8d\x05\xac\xa3\xb1\x80\xfb\x40\x63\x01\xeb\x68\x2c\xa0\xe3\xd1\xda\x85\x4b\x22\xfb\x78\xe1\x6c\xba\x67\x7b\xe9\x7f\x09\xcd\xf3\x44\x2c\x9c\x91\xce\x4e\xfe\x9b\xf2\xdf\xba\xc6\xfe\x96\xf8\xda\xdf\x09\x26\xf6\xac\x9c\xfc\x43\x60\xd1\x3b\x12\xd6\x9d\x20\xef\x48\xdf\x09\x99\xff\x1f\x82\x75\xd5\x3b\x4b\x4f\xd3\x3d\x40\x8e\x87\x75\xef\x25\x7d\xc0\xec\x2d\xe4\x1d\x09\xb3\xd7\x92\x77\x24\xcc\xf6\x93\x77\x24\xcc\x5e\x42\xde\x91\x30\x7b\x81\x62\xda\x79\xce\x6f\xa8\xbe\xaf\x6a\xec\x87\xc0\x5a\xfa\xf7\x30\xff\xa7\xaa\x4d\x9d\x2d\x90\x77\x24\xdc\xe6\x67\x15\x2b\xc4\x3a\x5f\xec\x46\x98\xff\x30\xe9\x1f\x6e\xf3\x7d\x91\x0e\xfa\x87\x75\x6f\x57\x6c\xa8\xe9\x6a\xea\x7b\x18\xc6\xe7\xb2\xb0\x45\xb0\x57\xa4\xdf\x67\xf3\xbb\xd2\xbf\xdb\xf9\xa8\xfe\x78\xf4\x8e\x84\x74\x27\x36\xc9\x3b\x12\x3a\xde\x89\x9f\x90\xf1\x89\xa8\xc2\xef\xff\xb3\x96\xef\xfc\x17\xe2\x58\x3f\x40\xb1\xc0\x32\x88\x85\x38\xdf\x19\xb3\xbf\x85\x63\x45\xe7\xff\xbf\x05\x5b\x47\xb1\x10\xe7\x3b\x63\xdd\x09\x35\xde\x91\xb1\xb0\x22\xd8\x1f\xa3\x58\x88\x73\x3a\xb0\xee\x01\x32\xbe\xc2\xba\xf7\x92\x3e\x60\xf6\x16\xa5\xd3\xd9\x6b\xd5\xf1\x74\xb6\x3f\x62\x70\xaf\x60\xf6\x12\x60\x51\x2c\x60\xf6\x02\xc5\xb4\xf3\x84\x58\x88\x73\x79\x30\xfb\x21\xb0\x96\xfe\x3d\x40\x2c\xc4\xf9\xce\x98\x2d\xa8\xef\x48\x3b\x4f\x88\x85\xa6\x8a\x05\xa9\xfb\x2e\x8a\x85\xb8\x7f\xb8\xcd\xf7\x45\x3a\xe8\x1f\xd6\xbd\x5d\xb1\xa1\xa6\xab\xa9\xef\x61\x88\xce\xe5\x2f\x51\x2c\xb0\xf7\x19\xc4\x02\xfb\xdd\xce\x47\xf9\xf8\x51\x2c\x20\xdd\x89\x4d\x75\x3d\xd7\xe8\xf1\x4e\xfc\x44\xc5\x5e\x27\xf6\x05\xff\x9b\xbc\x2f\xf8\x27\x05\xfd\x6f\xe9\xec\xe4\xbf\x73\xbe\x00\x6c\x8d\xf3\x05\x5f\xce\xf9\xfc\x11\xe7\x0b\xa0\x9b\x67\x7d\xe1\x33\x82\xfd\x0e\xe7\x0b\xa0\xfb\x75\xf6\xd9\x21\x75\xbf\xca\xfa\x82\x64\xbf\xc4\xfa\x82\x64\xd7\xb0\xbe\x20\x59\x99\xf5\x05\xc9\xb6\xb3\xbe\x20\xd9\x0b\x59\x5f\x10\x6c\xfe\xa7\xc0\x2a\x09\x5f\x90\xec\xef\x38\x5f\x90\x7d\x9f\xff\x33\xce\x17\x80\x2d\xb2\xbe\x20\xdb\xfc\x9c\x62\xf8\x7b\x78\x54\x30\x97\xf3\x05\x68\xf3\x6e\xd6\x17\xa4\xee\x1d\x9c\x2f\x80\xee\x3a\xce\x17\xfc\xbe\x60\xaf\x4c\xbf\xcf\xe6\x77\xa7\x7f\xb7\xf3\xd3\x9c\x2f\x48\xdd\x89\x91\xba\x97\x7c\x7a\xbc\x13\xeb\xe4\xdd\x4a\x8c\x17\xfc\x4f\xf2\xe3\x05\xff\x43\xe9\xe3\x05\xc9\xf8\xf1\x02\x30\x76\xbc\xe0\x3f\x98\x3e\x5e\x00\x1d\x3b\x5e\xf0\x5b\xe9\xe3\x05\xd0\xd1\xf1\x02\xd6\xb1\xe3\x05\x60\xec\x78\x01\x18\x3b\x5e\x00\xc6\x8e\x17\x80\xb1\xe3\x05\x60\xec\x78\x01\x18\x3b\x5e\x90\x8c\x1f\x2f\xc8\xbe\xf3\xe3\x05\x60\xec\x78\x01\xda\x64\xc7\x0b\xfe\xe1\xf4\xf1\x02\xb4\xc9\x8e\x17\x40\xc7\x8e\x17\x40\xc7\x8e\x17\xfc\x63\xe9\xe3\x05\xd0\xb1\xe3\x05\xe8\x03\x3b\x5e\x00\x1d\x3b\x5e\x90\xc7\xc3\xb9\xff\xf1\x3c\x92\x7f\x27\x3f\x8f\xe4\xbf\x8d\x8d\x05\xc4\xf8\x79\x24\x60\xec\x3c\x92\x7f\x0b\x1b\x0b\x58\xc7\xce\x23\xf9\xd7\xb2\xb1\x80\x75\xec\x3c\x12\xe8\xd8\x79\x24\x60\xec\x3c\x12\x30\x76\x1e\x09\x18\x3b\x8f\x04\x8c\x9d\x47\x02\xc6\xce\x23\x01\x63\xe7\x91\x24\xe3\xe7\x91\x64\xdf\xf9\x79\x24\x60\xec\x3c\x12\xb4\xc9\xce\x23\xf9\x6f\x60\x63\x01\xb7\xc9\xce\x23\x81\x8e\x9d\x47\x02\x1d\x3b\x8f\xe4\xbf\x89\x8d\x05\xac\x63\xe7\x91\xa0\x0f\xec\x3c\x12\xe8\xd8\x79\x24\x79\x3c\x6d\xec\x2c\xd6\x17\xfc\xab\xb4\x77\x24\x31\x47\xeb\xbf\xc2\x8a\xd7\x17\x58\x06\xeb\x0b\xad\xe4\xfa\x02\xb0\x1f\x10\x5f\x13\xeb\x0b\xfe\xa5\x56\xbc\xbe\xd0\x4a\xae\x2f\x80\x8e\x5d\x5f\xf0\x65\x2d\xdc\xcf\x90\x36\xb1\x8e\x5d\x5f\x00\x1d\xbb\xbe\x00\x8c\x5d\x5f\x00\xc6\xae\x2f\x00\x63\xd7\x17\x80\xb1\xeb\x0b\xc0\xd8\xf5\x05\xc9\xf8\xf5\x05\x60\x3f\x22\xef\x48\xa8\xef\xb0\xbe\xd0\x4a\xae\x2f\x00\x63\xd7\x17\xa0\xcd\xcf\x93\x77\x24\xa9\x93\xb9\x93\xbf\x49\xfa\x87\xdb\xbc\x87\xbc\x23\x61\xdd\x3b\xa3\x6b\x8d\xd7\x17\x40\xc7\xae\x2f\xf8\x3f\x6f\xc5\xeb\x0b\xec\x7d\xc6\xaf\x2f\x40\x1f\xb6\x92\x77\x24\xa4\xe3\xd7\x17\xe4\xf1\xb4\xb5\x36\x91\xd7\xa6\xea\xfe\x3b\xc9\xba\xff\x72\x3f\x7a\x9c\xd7\x06\x1a\x91\x37\x94\xa8\xfb\xef\xa8\x7d\x5f\x88\xc1\x3e\xd5\x56\xb4\x37\x4f\x54\xfc\x87\xfc\x85\xa5\x67\x41\x17\xc5\x02\xd6\xd1\xdc\x7f\x91\x8b\x94\xa8\xfb\xef\xa8\xbd\x79\x58\xf7\x30\xb0\x26\x66\x89\xba\xff\xf1\x75\xc6\x6d\xd2\xdc\x7f\xcc\x68\xee\x3f\x66\x34\xf7\x1f\x33\x9a\xfb\x8f\x19\xcd\xfd\xc7\x8c\xe6\xfe\x23\x06\xfb\x54\xd5\xba\xb3\xf8\x34\xca\x19\x50\x79\x6d\xfa\x77\xa4\xe5\xfe\xe3\x36\x49\xfe\x02\xe8\x70\xdd\x7f\x47\xed\xcd\xc3\x6d\x92\xfc\x85\x84\xee\x36\xc5\x86\x9a\x8e\xe6\xfe\xaf\x22\x76\x20\xfd\x3e\xd3\x72\xff\x71\x1f\xce\x55\xdf\xfb\x40\xd3\xd1\xdc\x7f\x74\x3c\x2d\xf7\x5f\x54\x43\x50\xb9\xff\x1d\x95\x77\xbd\x68\xd1\xdc\x7f\x9e\xd9\xc0\x2a\x3a\x83\x1c\xcf\x8e\xda\x27\xf2\x0d\xc1\xf6\x09\xf6\x7d\x60\x35\x46\xf7\x0c\xb0\x28\x5f\xfb\x4b\x16\xcd\xfd\xef\xa8\xfc\x77\xac\xf3\x80\x35\x19\xdd\x51\xd2\x07\xcc\x6e\x37\xe8\x0e\x19\xd8\xe5\xc0\x1a\x0c\xbb\xd8\xa0\x3b\xc7\xc0\xc6\xd3\xfb\x0e\x39\x9e\x6c\xdf\x21\x16\x3a\x2a\xf7\x1f\xb3\x6f\x91\xef\x08\xb7\xf9\x84\x62\x7d\xa4\xc3\xb9\xff\x1d\x95\xfb\x8f\xdb\x3c\xae\xce\x53\xd7\xbd\x87\xf4\x01\xeb\xde\xc4\xf6\x0f\xe7\xfe\xb3\xf7\x19\xe4\x78\xb2\xd7\x1a\x72\x3c\xe3\xeb\x89\x75\x67\xa4\x1f\x4f\xcb\xf1\xfc\x13\x0b\xe7\xfe\xc7\xfb\xfb\x7d\x8b\xe6\xfe\xb3\x0c\xf6\x6c\xc7\x7b\xe3\x31\x7b\x16\x58\xb4\x67\xfb\x19\x8b\xe6\xfe\x37\x94\x2f\x60\xdd\x00\x58\xe4\x0b\x8f\x59\x34\xf7\xbf\xa1\x7c\x01\xeb\x1e\x02\x16\x3d\x6f\xb1\xee\x08\xe9\x03\x66\xb7\x2a\x9d\xce\x0e\x1a\xd8\xa5\xc0\x22\x5f\xc0\xec\xa5\x4a\xd7\xd5\x58\xde\x70\x9e\x63\xaa\xef\xab\x94\xcd\xff\x1f\xd5\x77\xed\x7b\x80\x3d\xdb\x0d\xe5\x0b\x98\x7d\x83\x7c\x47\xb8\xcd\x2f\x29\x66\x21\x1d\xce\xfd\x6f\x28\x5f\xc0\x6d\xde\xa7\xce\xb3\xab\xe9\x1c\xc5\x86\x9a\xee\x8d\x84\x3d\x66\xd1\xdc\x7f\xf6\x3e\x83\x3d\xdb\x71\xfe\x02\xee\xc3\x8b\xd5\xf5\x1c\x68\xba\x09\x75\xbc\x35\x7a\x3c\x2d\xf7\x5f\xfa\xc2\x8b\x90\x2f\xe0\x38\x9f\x21\xbe\xa0\x33\x9b\x7d\xae\xcc\x18\x7c\x21\x4f\x7c\x41\xd7\x3d\x43\x9e\x39\x32\x96\xcf\x24\xbe\xa0\xeb\x62\x5f\xd0\x75\x47\x49\x1f\x30\xbb\xdd\xa0\x3b\x64\x60\xb1\x2f\xe8\xec\x62\x83\xee\x1c\x03\x1b\x4f\xef\x3b\xf2\x05\xad\xef\xc8\x17\x74\xf6\x2d\xf2\x1d\xe1\x36\x79\x5f\x98\x26\xbe\xa0\xb7\xc9\xfb\xc2\x34\xf1\x05\x5d\xf7\x26\xb6\x7f\x33\xc4\x17\x74\xdd\x9e\xf4\x6b\x8d\x7c\x41\xd7\x9d\x91\x7e\xbc\x14\x5f\x78\x7e\x8a\x2f\x64\x0d\xbe\x90\x35\xf8\x42\xd6\xe0\x0b\x67\x18\x7c\x21\x6b\xf0\x05\xcb\xe0\x0b\x59\x83\x2f\x58\x06\x5f\xb0\x0c\xbe\x60\x19\x7c\xc1\x32\xf8\x82\x65\xf0\x05\xcb\xe0\x0b\x96\xc1\x17\x2c\x83\x2f\x64\x0d\xbe\x90\x35\xf8\x82\x65\xf0\x85\x31\x83\x2f\x64\x0d\xbe\x30\x66\xf0\x85\xac\xc1\x17\xb2\x06\x5f\xc8\x1a\x7c\xc1\x32\xf8\x42\xd6\xe0\x0b\x38\xf7\x3f\x8e\x85\x3f\x0d\x3f\x5d\x1c\x41\x2c\xc4\x79\x5f\x0b\xa1\x66\xf1\x59\x2b\xce\xf1\xe4\x59\xa4\x8b\xae\x33\x62\x5a\x8e\xe7\xef\x0b\x26\x46\xeb\x90\xe3\x59\x55\xb1\x80\x75\x4f\x03\x8b\x62\xe1\x71\xc1\x44\x6e\x21\x8c\x9d\xab\x2a\x16\xb0\xee\x61\x60\xd1\x3d\x86\x75\xf7\x92\x3e\x60\x76\x9b\xd2\xe9\xac\x6e\x60\x97\x01\x8b\x62\x01\xb3\x8b\x94\xae\xab\xb1\xb3\x0d\xe7\xb9\x45\xf5\x7d\x95\x32\x18\x3b\x57\x55\x2c\xa0\xbe\x43\x8e\x67\x55\xc5\x02\x66\xdf\x24\xdf\x11\x6e\xb3\xaf\x18\xfe\x1e\xc4\xfc\x06\x8c\x9d\xab\x2a\x16\x70\x9b\xc7\xd4\x79\x76\x35\xdd\x9d\x8a\x0d\x35\xdd\xcd\x84\xe1\x73\x39\x90\x7e\x9f\xc1\xd8\x39\xce\x6b\xc3\xba\x73\xd5\xf5\x1c\x68\xba\x49\x75\xbc\x3e\xd5\x69\xb9\xff\x62\x15\x3b\x74\x07\x2e\x26\x17\x17\xd3\x7d\x41\x32\xde\x17\x80\xb1\xbe\xb0\xf8\x8d\x74\x5f\x00\x1d\xeb\x0b\x8b\xfd\x74\x5f\x00\x1d\xeb\x0b\xa0\x63\x7d\x01\x18\xeb\x0b\xc0\x58\x5f\x00\xc6\xfa\x02\x30\xd6\x17\x80\xb1\xbe\x00\x8c\xf5\x05\xc9\x78\x5f\x90\x7d\xe7\x7d\x01\x18\xeb\x0b\xd0\x26\xeb\x0b\x8b\x9f\x4f\xf7\x05\x68\x93\xf5\x05\xd0\xb1\xbe\x00\x3a\xd6\x17\xe0\x5c\x58\x5f\x00\x1d\xeb\x0b\xa0\x63\x7d\x01\x74\xac\x2f\x48\x5d\x8a\x2f\xfc\x56\x8a\x2f\x3c\x60\xf0\x85\x07\x0c\xbe\xf0\x80\xc1\x17\x3e\x62\xf0\x85\x07\x0c\xbe\x70\xc4\xe0\x0b\x0f\x18\x7c\xe1\x88\xc1\x17\x8e\x18\x7c\xe1\x88\xc1\x17\x8e\x18\x7c\xe1\x88\xc1\x17\x8e\x18\x7c\xe1\x88\xc1\x17\x8e\x18\x7c\xe1\x01\x83\x2f\x3c\x60\xf0\x85\x23\x06\x5f\xf8\x55\x83\x2f\x3c\x60\xf0\x85\x5f\x35\xf8\xc2\x03\x06\x5f\x38\x62\xf0\x85\x07\x0c\xbe\x70\xc4\xe0\x0b\x0f\x18\x7c\xe1\x08\xe7\x0b\x72\xbc\xb0\x78\x5b\x8a\x2f\x1c\x32\xf8\xc2\x21\x83\x2f\x1c\x32\xf8\xc2\x5b\x0d\xbe\x70\xc8\xe0\x0b\xd7\x1a\x7c\xe1\x90\xc1\x17\xae\x35\xf8\xc2\xb5\x06\x5f\xb8\xd6\xe0\x0b\xd7\x1a\x7c\xe1\x5a\x83\x2f\x5c\x6b\xf0\x85\x6b\x0d\xbe\x70\xad\xc1\x17\x0e\x19\x7c\xe1\x90\xc1\x17\xae\x35\xf8\xc2\x15\x06\x5f\x38\x64\xf0\x85\x2b\x0c\xbe\x70\xc8\xe0\x0b\xd7\x1a\x7c\xe1\x90\xc1\x17\xae\x35\xf8\xc2\x21\x83\x2f\x5c\x6b\x31\x75\xff\x97\xc4\x3b\xd2\xe2\x2b\x68\xdd\xff\xa5\x93\x42\xf3\x12\x8b\xa9\xfb\x8f\x19\xad\xfb\x9f\x60\xa4\xee\xff\xd2\xd3\x82\x89\xba\x78\xb4\xee\x7f\x42\x47\xeb\xfe\x7f\x51\x30\x39\xff\x44\xea\xfe\x27\x74\xb4\xee\x3f\xd6\xd1\xba\xff\x98\xd1\xba\xff\x98\xd1\xba\xff\x98\xd1\xba\xff\x98\xd1\xba\xff\x98\xcd\x1a\x18\xad\xfb\x8f\x18\xad\xfb\x8f\xfb\x4e\xeb\xfe\x27\x18\xad\xbf\x80\xdb\x24\x75\xff\x41\x27\xe7\x67\x3e\x9e\xfe\x1d\xd1\xba\xff\x09\xdd\x1d\x2c\x93\x3a\x5a\xf7\x1f\x9f\xcb\x15\xe9\xf7\x99\x56\xf7\x1f\xeb\x48\xdd\xff\x84\x8e\xd6\xfd\x47\x3a\x2d\xf7\xff\x0f\x45\x2c\x8c\x6b\xb9\xff\x27\x42\xcd\x82\xf8\xc5\x18\xa8\xbf\xc0\x32\xa8\xbf\x10\xe7\x80\x63\xb6\x0e\x2c\x9a\x53\xfd\xba\x60\xb2\x7e\xdf\x77\x0d\x3a\x59\x7f\x21\xce\xd7\xfe\x3d\xc1\x7e\x22\xd8\xa3\xa0\x6b\x31\xba\x07\x41\xd7\x64\x74\x87\x81\xd5\x19\xf6\x6e\x83\xee\x46\x03\xab\x00\x6b\x30\xec\x02\x60\x0e\xc3\xb6\x19\xda\xb4\xd3\xfb\x0e\xf5\x17\xd8\xbe\x43\xfd\x85\x38\xf7\x1f\xb3\xe8\xf7\x69\x2b\x4c\x9b\x8f\x81\xae\x92\xd0\xfd\xb5\x60\x1e\xb0\x2a\xd3\xe6\x51\x60\x65\x46\x77\x3b\xcb\xa4\xee\x90\xa1\x7f\x97\xa7\xdf\x67\xf3\x17\xa7\x5f\x6b\xa8\xbf\x10\xff\x1e\x04\xd6\xd1\xdf\xa7\x45\xba\x13\xd1\xef\xd3\x46\x3e\x24\x32\xf1\x17\xbe\xab\xe5\xfe\x7f\x45\x68\xbe\x8e\x62\x81\x65\x10\x0b\x71\xee\x3f\x66\xeb\x70\x1e\xd1\x3b\xd2\xd7\x04\xfb\xff\xa1\x58\x88\x73\xce\xb1\xee\x29\x60\xd1\x3b\x52\x4f\xb0\x13\x28\x16\xe2\x3d\x18\x58\xf7\x20\xb0\xe8\xdd\x03\xeb\x0e\x93\x3e\x60\xf6\x6e\xa5\xd3\xd9\x8d\x06\x56\x01\x16\xbd\x23\x61\x76\x01\xb0\x68\x3f\x12\x66\xdb\x0c\xe7\x69\xab\xbe\xaf\x52\x06\xb1\x10\xe7\xfe\xa3\xbe\xcf\x7f\x5f\x1d\x4f\x67\xcf\x00\xab\xe8\xe7\x39\xff\x98\x62\xf8\x7b\xf8\x02\x8a\x85\x78\x0f\x06\x6e\xf3\xa8\x3a\xcf\xae\xa6\xbb\x3d\x62\xb0\x1f\x09\xeb\x0e\x11\x86\xcf\xe5\xf2\xf4\xfb\x0c\x62\xc1\x51\xef\x48\x58\x77\x8e\xba\x9e\x03\x4d\x37\xae\xce\x73\x8d\xea\x20\x16\xe2\xfd\x48\xc2\x17\x16\x3e\xa3\xe5\xfe\xcb\xd8\xfa\x8d\xa4\x2f\xe8\x0c\xf9\x42\x5d\x63\xca\x17\xe0\xfc\xa5\x2f\x78\xc4\x17\xf2\x9a\x4e\xf9\x02\xc4\x82\x8c\xe5\x0f\x26\x7d\x01\xda\xc4\x3a\xe5\x0b\xc0\xb0\x4e\xf9\x02\xf4\x01\x33\xe5\x0b\x0c\xbb\xd1\xc0\x62\x5f\xa8\x6a\x4c\xf9\x02\xdc\x2b\x98\x6d\x33\x9c\xa7\xf2\x05\x88\x05\xc4\x62\x5f\xd0\xbf\x87\xd8\x17\x18\x16\xfb\x82\x76\x9e\xc8\x17\xf0\xf7\xf0\x3e\xe2\x0b\x55\xad\x4d\xe5\x0b\xd0\x3f\xac\x8b\x7d\x21\xa7\xe9\x62\x5f\xc8\x69\xe7\x72\x79\xfa\x7d\x16\xfb\x82\x7e\xcd\x62\x5f\x80\x58\xc0\x3a\xe5\x0b\x10\x0b\x48\x47\xeb\xfe\xcb\xf1\xc2\x82\x43\xeb\xb5\xc9\x77\xae\x85\x9b\x2d\xa6\x5e\x1b\x66\xb4\x5e\x5b\x82\x91\x7a\x6d\x72\xbc\xb0\xf0\x0e\x32\x5e\xd0\x75\xb4\x5e\x9b\x78\xc7\x5b\x78\x3d\x19\x2f\xe8\x3a\x5a\xaf\x0d\xeb\x68\xbd\x36\xcc\x68\xbd\x36\xcc\x68\xbd\x36\xcc\x68\xbd\x36\xcc\x68\xbd\x36\xcc\x66\x0d\x8c\xd6\x6b\x43\x8c\xd6\x6b\xc3\x7d\xa7\xf5\xda\x12\x8c\x1d\x2f\x40\x9b\xa4\x5e\x1b\xe8\xaa\x64\xbc\xa0\xb7\x49\xea\xb5\x25\x74\x77\xb0\xec\x66\x32\x5e\xd0\xfb\x77\x45\xfa\x7d\xa6\xd5\x6b\xc3\x3a\x52\xaf\x2d\xa1\xa3\xf5\xda\x90\x8e\xd6\xfd\x5f\xfa\x23\x11\x0b\x57\x6a\xb1\x30\x2f\x34\x2f\x67\x63\x01\x31\x2d\x16\x30\xa3\xb1\x30\x10\xec\x55\x6c\x2c\x60\x1d\x8d\x85\x2f\x08\xb6\x83\x8d\x05\xac\xa3\xb1\x80\x75\x34\x16\x30\xa3\xb1\x80\x19\x8d\x05\xcc\x68\x2c\x60\x46\x63\x01\x33\x1a\x0b\x98\xd1\x58\x40\x4c\x8b\x05\xd4\x77\x2d\x16\x30\xa3\xb1\x80\xdb\xa4\xb1\x20\x75\x17\xb0\xb1\x80\xdb\xa4\xb1\x80\x19\x8d\x05\xcc\x68\x2c\xc8\x73\x79\x19\x1b\x0b\x58\x47\x63\x01\xf7\x81\xc6\x02\xd6\xd1\x58\x40\xc7\xd3\xf2\x17\xc4\xdb\xfb\xc2\xb9\x5a\xfe\xc2\x93\x42\x23\x2b\xa1\xe7\xd2\x19\xd4\x3a\x8f\xf3\x17\x30\xfb\x31\x19\x2f\x3c\x25\xd8\x36\xc1\xbe\x0d\x2c\x9a\x53\xc5\xba\xaf\x92\x77\xa4\x47\x43\xe6\xcb\xdf\xdb\x7b\x04\x58\xf4\x8e\x84\x75\x1f\x21\xef\x1e\x58\xf7\x7e\xd2\x07\xcc\x9a\xe4\x3d\x08\xb3\xeb\x0d\xec\x55\x51\x9b\xf0\x0e\x81\xd9\x79\xe4\x1d\x09\xb3\xb3\x54\x9b\x7d\xca\xa0\xd6\x79\xfc\x8e\x84\xd9\xb3\xaa\xef\xda\xf7\x00\xb5\xce\xe3\xfc\x05\xcc\x06\xea\x3b\xd2\xce\x13\x6a\x9d\xab\x7a\x6d\xa0\xb3\x05\x7b\x48\xbd\xcf\x54\xb5\x36\x8f\xa8\xf3\xec\x6a\xba\x5b\x15\x1b\x6a\xba\x83\xaa\xef\xc3\xf8\x5c\x16\x26\x05\xbb\x34\xfd\x3e\x83\x5a\xe7\xf1\x3b\x12\xee\x43\x5e\xb5\x39\xd0\x74\x63\xe4\x1d\x09\x1d\x0f\x6a\x9d\xc7\xc7\xfb\x03\x71\xb7\xff\xab\x16\x0b\x5f\x16\xc7\xfa\x11\x1b\x0b\x88\x69\xb1\x80\x19\x8d\x85\xaf\x0a\xf6\x8f\x6c\x2c\x60\x1d\x8d\x85\x47\x04\x5b\x61\x63\x01\xeb\x68\x2c\x60\x1d\x8d\x05\xcc\x68\x2c\x60\x46\x63\x01\x33\x1a\x0b\x98\xd1\x58\xc0\x8c\xc6\x02\x62\x5a\x2c\x60\x46\x63\x01\xf5\x5d\x8b\x05\xcc\x68\x2c\xe0\x36\x69\x2c\x48\xdd\xf7\xd9\x58\xc0\x6d\xd2\x58\xc0\x3a\x1a\x0b\x58\x47\x63\x41\x9e\xcb\xdf\xb0\xb1\x80\x75\x34\x16\x70\x1f\x68\x2c\x60\x1d\x8d\x05\x74\x3c\x1a\x0b\xbe\x78\x47\x0a\xdd\x81\x8b\x49\x5f\xd4\x4a\xf0\xa7\xd2\xd9\xc9\x4d\xce\x17\x80\xfd\x84\xf3\x05\xff\x19\xc1\xbe\xc3\xf9\x02\xe8\xbe\xc6\xfa\x82\x58\xdf\x87\xba\xff\xc4\x17\x40\xf7\x51\xd6\x17\xa4\xee\x03\xac\x2f\x48\xf6\x2e\xf6\xd9\x2f\xd9\x0d\x06\xf6\x6a\x15\x0b\x15\x8d\x9d\xcf\xfa\x82\x64\x33\xac\x2f\x48\x66\xb1\xbe\x20\xf7\x36\xfc\x03\xe7\x0b\xb2\xef\xf3\xdf\xe3\x7c\x01\xd8\xd3\xac\x2f\xc8\x36\xbf\xc8\xf9\x82\xff\x98\x60\x0f\x73\xbe\x00\x6d\xde\xcb\xf9\x02\xe8\x6e\xe3\x7c\x01\x74\x75\xc2\xe4\xb9\xc8\xdf\x82\xbc\x2c\xfd\x3e\x9b\xbf\x88\xf5\x05\xd9\x87\xb3\x39\x5f\x00\x5d\x9c\x1b\xd5\xa7\xc7\xa3\x75\xff\xe5\x78\xc1\xff\x6d\x7e\xbc\xe0\xff\x66\xfa\x78\x41\x32\x7e\xbc\x00\x8c\x1d\x2f\xf8\x5e\xfa\x78\x01\x74\xec\x78\xc1\xbf\x27\x7d\xbc\x00\x3a\x76\xbc\x00\x3a\x76\xbc\x00\x8c\x1d\x2f\x00\x63\xc7\x0b\xc0\xd8\xf1\x02\x30\x76\xbc\x00\x8c\x1d\x2f\x00\x63\xc7\x0b\x92\xf1\xe3\x05\xd9\x77\x7e\xbc\x00\x8c\x1d\x2f\x40\x9b\xec\x78\xc1\x3f\x9a\x3e\x5e\x80\x36\xd9\xf1\x02\xe8\xd8\xf1\x02\xe8\xd8\xf1\x82\xff\x6b\xe9\xe3\x05\xd0\xb1\xe3\x05\xe8\x03\x3b\x5e\x00\x1d\x3b\x5e\x90\xc7\xa3\x75\xff\x97\xbe\x25\xee\xf6\x5f\xd1\x62\xe1\x09\xa1\x69\xb2\xb1\x80\x98\x16\x0b\x98\x91\x58\x10\x9f\xca\xbf\xa1\xc7\x02\xd6\xd1\x58\xf8\xbc\x60\xd7\xb3\xb1\x80\x75\x34\x16\xb0\x8e\xc6\x02\x66\x34\x16\x30\xa3\xb1\x80\x19\x8d\x05\xcc\x68\x2c\x60\x46\x63\x01\x33\x1a\x0b\x88\x69\xb1\x80\xfa\xae\xc5\x02\x66\x34\x16\x70\x9b\x34\x16\xa4\xee\x26\x36\x16\x70\x9b\x34\x16\xb0\x8e\xc6\x02\xd6\xd1\x58\x90\xe7\xf2\x16\x36\x16\xb0\x8e\xc6\x02\xee\x03\x8d\x05\xac\xa3\xb1\x80\x8e\xa7\x8d\x9d\x45\x8d\x2a\xff\xb5\xda\x3b\x52\x5f\x68\x5e\x6d\xc5\xeb\x0b\x2c\x3b\x39\x22\xef\x48\x98\xd1\xb5\xb6\x25\xc1\x64\xcd\x8d\xef\x2a\x5d\x5e\xd3\xd1\xf5\x85\xcf\x09\x76\xbe\x15\xaf\x2f\xc4\xef\x48\x58\x47\xd7\x17\xb0\x8e\xae\x2f\x60\x46\xd7\x17\x30\xa3\xeb\x0b\x98\xd1\xf5\x05\xcc\xe8\xfa\x02\x66\x74\x7d\x01\x33\xba\xbe\x80\xd8\xfc\x3f\x92\x77\x24\xd4\x77\x58\x5f\x88\xdf\x91\x30\xa3\xeb\x0b\xb8\xcd\xc7\xc8\x3b\x92\xd4\xfd\x9c\x15\xaf\x2f\xa8\x5a\xe7\x89\x36\x8f\x92\x77\x24\xac\xbb\x5d\xbd\x5b\xe5\x34\x1d\x5d\x5f\x90\xe7\x52\xb6\xe2\xf5\x05\xf6\x3e\xd3\xd6\x17\x70\x1f\xce\x21\xef\x48\x58\x47\xd7\x17\xd0\xf1\xb4\xb5\x36\x91\xd7\xa6\x72\xff\x3b\xea\x73\x91\x1b\x04\xf9\xfd\x33\x06\x16\xe9\xa2\x7d\x5f\x88\xc1\x3e\xd5\x8e\x8a\x05\x91\xd7\xe6\xcb\xbd\x43\xdf\x03\x16\x8d\x17\xb0\xee\x69\x60\x51\x2c\x88\x5c\xa4\x44\xee\x7f\x47\xc5\x02\xd6\x3d\x0c\x2c\xba\xc7\xb0\xee\x5e\xd2\x07\xcc\x6e\x53\x3a\x9d\xd5\x0d\xec\x32\x60\x51\x2c\x60\x76\x91\xd2\x75\x35\x76\xb6\xe1\x3c\xb7\xa8\xbe\xaf\x52\x06\xfb\x54\x3b\x2a\x16\x50\xdf\x61\x9f\x6a\x47\xc5\x02\x66\xdf\x24\xdf\x11\x6e\xb3\xaf\x18\xfe\x1e\x70\xee\x7f\x47\xc5\x02\x6e\xf3\x98\x3a\xcf\xae\xa6\xbb\x53\xb1\xa1\xa6\xbb\x99\xb0\x2f\x21\x76\x20\xfd\x3e\x83\x7d\xaa\x1d\x15\x0b\xb8\x0f\xe7\xaa\xeb\x39\xd0\x74\x93\xea\x78\x7d\x7a\x3c\xd8\xa7\x3a\x54\x7b\x3e\xc4\x2c\xec\xd2\x67\x21\x16\x86\x2a\xef\xfa\x23\x16\xcd\xfd\xe7\x99\x0d\xac\xa2\x33\xc8\xf1\x1c\xaa\xfd\x48\xa2\x46\x24\xfc\x0e\xc6\x3e\x60\x35\x46\xf7\x0c\xb0\x28\x5f\xfb\x7e\x8b\xe6\xfe\x0f\x55\xfe\xbb\xd0\x9d\x14\x63\x90\xa5\x3d\xc0\x9a\xb8\x2e\xfe\x49\x51\xb7\x2b\x6c\x23\xd1\x07\xdc\xe6\xed\x44\x87\xd9\x21\x03\xbb\x1c\x58\x83\x61\x17\x1b\x74\xe7\x18\xd8\x78\x7a\xdf\x21\xc7\x93\xf4\x3d\x91\xfb\x3f\x54\xb9\xff\x98\x7d\x8b\x7c\x47\xb8\xcd\x27\x14\xeb\x23\x1d\xce\xfd\x1f\xaa\xdc\x7f\xdc\xe6\x71\x75\x9e\xba\xee\x3d\xa4\x0f\x58\xf7\x26\xb6\x7f\x38\xf7\x9f\xbd\xcf\xe6\xf7\xa4\x5f\x6b\xc8\xf1\x8c\xaf\x27\xd6\x9d\x91\x7e\x3c\xc8\xf1\xec\xab\xd8\x13\x2e\xb3\x14\xed\xc1\x88\x3f\x77\x2d\x9a\xfb\xcf\x32\xd8\xb3\xdd\x57\xcf\x1c\xcc\x9e\x05\x16\xf9\xc2\xc7\x2d\x9a\xfb\xdf\x57\xbe\x80\x75\x03\x60\x91\x2f\x1c\xb7\x68\xee\x7f\x5f\xf9\x02\xd6\x3d\x04\x2c\x7a\xde\x62\xdd\x11\xd2\x07\xcc\x6e\x55\x3a\x9d\x1d\x34\xb0\x4b\x81\x45\xbe\x80\xd9\x4b\x95\xae\xab\xb1\xbc\xe1\x3c\xc7\x54\xdf\x57\x29\x83\x3d\xdb\x7d\xe5\x0b\xa8\xef\xb0\x67\xbb\xaf\x7c\x01\xb3\x6f\x90\xef\x08\xb7\xf9\x25\xc5\x2c\xa4\xc3\xb9\xff\x7d\xe5\x0b\xb8\xcd\xfb\xd4\x79\x76\x35\x9d\xa3\xd8\x50\xd3\xbd\x91\xb0\xe3\x16\xcd\xfd\x67\xef\x33\xd8\xb3\xdd\x57\xbe\x80\xfb\xf0\x62\x75\x3d\x07\x9a\x6e\x42\x1d\x6f\x8d\x1e\x0f\xf6\x6c\xc7\xbe\xf0\x59\x0b\xe7\xfe\xc7\x9f\xcb\xd8\x9a\x21\xbe\xa0\x33\x9b\x7d\xae\xcc\xa4\xfb\x42\x22\xf7\x7f\xa8\xf6\xa9\x62\xdd\x33\xe4\x99\x23\x63\xf9\x4c\xe2\x0b\xba\xce\x53\xcf\x07\x5d\x77\x94\xf4\x01\xb3\xdb\x0d\xba\x43\x06\x16\xfb\x82\xce\x2e\x36\xe8\xce\x31\xb0\xf1\xf4\xbe\x23\x5f\xd0\xfa\x8e\x7c\x41\x67\xdf\x22\xdf\x11\x6e\x93\xf7\x85\x69\xe2\x0b\x7a\x9b\xbc\x2f\x4c\x13\x5f\xd0\x75\x6f\x62\xfb\x37\x43\x7c\x41\xd7\xed\x49\xbf\xd6\xc8\x17\x74\xdd\x19\xe9\xc7\xd3\x7c\x41\xfc\x3a\xab\xca\xfd\xa7\x31\x99\x35\xf8\x42\xd6\xe0\x0b\x59\x83\x2f\x9c\x61\xf0\x85\xac\xc1\x17\x2c\x83\x2f\x64\x0d\xbe\x60\x19\x7c\xc1\x32\xf8\x82\x65\xf0\x05\xcb\xe0\x0b\x96\xc1\x17\x2c\x83\x2f\x58\x06\x5f\xb0\x0c\xbe\x90\x35\xf8\x42\xd6\xe0\x0b\x96\xc1\x17\xc6\x0c\xbe\x90\x35\xf8\xc2\x98\xc1\x17\xb2\x06\x5f\xc8\x1a\x7c\x21\x6b\xf0\x05\xcb\xe0\x0b\x59\x83\x2f\xe0\xdc\xff\xf8\x78\xbf\x6b\xe1\xdc\x7f\xf5\xf9\xa2\xf8\x7d\xf8\x25\xb9\xbe\x30\x43\x34\xe1\xa7\xf2\x6f\x44\x63\xe7\xf8\x3a\x23\x06\x63\xe7\x38\x16\x3e\x21\x98\x5c\x77\xfe\x1e\x89\x05\xac\x7b\x9a\xc4\x42\x47\xb0\x55\x2b\x1e\x3b\xc7\xb1\x80\x75\x0f\x93\x7b\x0c\xeb\xee\x25\x7d\xc0\xec\x36\x72\xbf\x63\x56\x37\xb0\xcb\x48\x2c\x60\x76\x11\x89\x05\xcc\xce\x36\x9c\xe7\x16\x12\x0b\x88\xc1\xd8\x39\x8e\x05\xd4\x77\x18\x3b\xc7\xb1\x80\xd9\x37\xc9\x77\x84\xdb\xec\x2b\x86\xbf\x07\x91\xf9\x0b\x63\xe7\x38\x16\x70\x9b\xc7\x48\x2c\x60\xdd\x9d\xe4\x7e\xc7\xba\x9b\x09\xc3\xe7\x72\x20\xfd\x3e\x83\xb1\x73\x1c\x0b\x58\x77\x2e\x89\x05\xac\x9b\x54\xc7\xeb\x53\x1d\x8c\x9d\x89\x2f\x2c\x7e\x93\xf7\x85\xc5\x2f\xa7\xfb\x82\x64\xbc\x2f\x00\x63\x7d\x61\xf1\xab\xe9\xbe\x00\x3a\xd6\x17\x16\x7b\xe9\xbe\x00\x3a\xe2\x0b\x8b\x62\x5d\x45\xa8\x53\x7c\x01\xda\x64\x7d\x01\x18\xeb\x0b\xc0\x58\x5f\x00\xc6\xfa\x02\x30\xd6\x17\x80\xb1\xbe\x20\x19\xef\x0b\xb2\xef\xbc\x2f\x00\x63\x7d\x01\xda\x64\x7d\x61\xf1\xd3\xe9\xbe\x00\x6d\xb2\xbe\x00\x3a\xd6\x17\x40\xc7\xfa\x02\x9c\x0b\xeb\x0b\xa0\x63\x7d\x01\x74\xac\x2f\x80\x8e\xf5\x05\xa9\x4b\xf1\x85\x07\xb5\x58\x90\xb1\x75\xd4\xe0\x0b\x47\x0d\xbe\x70\xd4\xe0\x0b\x1f\x32\xf8\xc2\x51\x83\x2f\xdc\x65\xf0\x85\xa3\x06\x5f\xb8\xcb\xe0\x0b\x77\x19\x7c\xe1\x2e\x83\x2f\xdc\x65\xf0\x85\xbb\x0c\xbe\x70\x97\xc1\x17\xee\x32\xf8\xc2\x5d\x06\x5f\x38\x6a\xf0\x85\xa3\x06\x5f\xb8\xcb\xe0\x0b\x77\x18\x7c\xe1\xa8\xc1\x17\xee\x30\xf8\xc2\x51\x83\x2f\xdc\x65\xf0\x85\xa3\x06\x5f\xb8\xcb\xe0\x0b\x47\x0d\xbe\x70\x97\xc1\x17\xde\x9e\xe2\x0b\xd7\x19\x7c\xe1\x3a\x83\x2f\x5c\x67\xf0\x85\x37\x1a\x7c\xe1\x3a\x83\x2f\x1c\x30\xf8\xc2\x75\xe9\xe3\x05\xd0\xf1\xbe\x70\xc0\xe0\x0b\x07\x0c\xbe\x70\xc0\xe0\x0b\x07\x0c\xbe\x70\xc0\xe0\x0b\x07\x0c\xbe\x70\xc0\xe0\x0b\xd7\x19\x7c\xe1\x3a\x83\x2f\x1c\x30\xf8\xc2\x25\x06\x5f\xb8\xce\xe0\x0b\x97\x18\x7c\xe1\x3a\x83\x2f\x1c\x30\xf8\xc2\x75\x06\x5f\x38\x60\xf0\x85\xeb\x0c\xbe\x70\xc0\xa2\xb9\xff\x1b\xd3\xbb\x96\x7e\x47\xc4\xc2\x7e\x2d\xf7\xff\xc3\x42\xa3\xd7\xfd\x27\x4c\xcb\xfd\xc7\x8c\xe6\xfe\x7b\x82\xe9\x75\xff\xa9\x0e\xe7\xfe\x37\xa6\x77\x2d\x1d\x13\x4c\xaf\xfb\x4f\x75\x38\xf7\x9f\xea\x70\xee\x3f\x65\xb7\x18\x74\x38\xf7\x9f\x32\x9c\xfb\x4f\xd9\x85\x86\x36\x67\x0d\x2c\x93\xde\x77\x2d\xf7\x1f\xf5\x5d\xcb\xfd\xc7\x0c\xef\xc1\xa0\x6d\xd2\xdc\x7f\xa9\xd3\xeb\xfe\xd3\x36\x49\xee\xff\xfc\x1d\xe2\x7d\xf4\xc3\xe2\x6e\x7a\x61\x92\x25\x74\x37\x19\xfa\x47\x73\xff\xb1\xae\x94\x7e\xad\xb5\xdc\x7f\xac\xcb\xa6\x1f\x4f\xcb\xfd\xff\x6d\x8b\xaf\xfb\x1f\xbe\xc9\xa4\xd5\xfd\x47\x4c\xab\xfb\x8f\x19\xad\xfb\xff\x90\x60\x7c\xdd\x7f\xac\xa3\x75\xff\x3f\x28\x18\x5f\xf7\x1f\xeb\x68\xdd\x7f\xac\xa3\x75\xff\x31\xa3\x75\xff\x31\xa3\x75\xff\x31\xa3\x75\xff\x31\xa3\x75\xff\x31\xa3\x75\xff\x11\xd3\xea\xfe\x63\x46\xeb\xfe\xa3\xbe\x6b\x75\xff\x31\xa3\x75\xff\x71\x9b\xb4\xee\xbf\xd4\xf1\x75\xff\x71\x9b\xb4\xee\x3f\xd6\xd1\xba\xff\x58\x47\xeb\xfe\xe3\x73\xa1\x75\xff\xb1\x8e\xd6\xfd\xc7\x3a\x5a\xf7\x1f\xe9\xb4\xba\xff\x48\xa7\xd5\xfd\xff\x94\xc5\xd7\xfd\x7f\x40\x68\xf8\xba\xff\x88\x69\x75\xff\x31\xa3\xb5\x48\x1e\x14\x8c\xaf\xfb\x8f\x75\x27\x81\x45\xef\x48\xf7\x0a\xc6\xd7\xfd\xc7\xba\x0f\x11\x86\x75\x2d\xd2\x07\xcc\xde\xaa\x74\x3a\x7b\x1d\xb0\x06\xc3\x5e\x1e\x31\x78\x87\xc0\x6c\x07\xb0\x68\x3f\x12\x66\x67\xa6\x9f\x27\xc4\x82\xa3\x6a\x91\x60\x46\xeb\xfe\xa3\xbe\x6b\x75\xff\x31\x5b\x52\xdf\x91\x76\x9e\x5a\xdd\x7f\xa9\xe3\xeb\xfe\xe3\x36\x69\xdd\x7f\xac\xa3\x75\xff\xb1\xee\xf5\x8a\x4d\x6a\xe7\x42\xeb\xfe\x63\x5d\xd1\x70\xcd\x68\xdd\x7f\xa4\x83\x58\x88\x73\xff\x91\x4e\xab\x45\x22\x7c\x81\xa9\xfb\x2f\x63\x8b\xaf\xfb\x8f\x98\x56\xf7\x1f\x33\x5a\xf7\x5f\xfa\x02\x5f\xf7\x1f\xeb\x68\x5d\x1e\x19\xcb\x7c\xdd\x7f\xac\xa3\x75\x79\xb0\x8e\xd6\xe5\xc1\x8c\xd6\xe5\xc1\x8c\xd6\xe5\xc1\x8c\xd6\xe5\xc1\x8c\xd6\xe5\xc1\x8c\xd6\xe5\x41\x4c\xab\xcb\x83\x19\xad\xfb\x8f\xfa\xae\xd5\xfd\xc7\x8c\xd6\xe5\xc1\x6d\xd2\xba\xff\x52\xc7\xd7\xfd\xc7\x6d\xd2\xba\xff\x58\x47\xeb\xfe\x63\x1d\xad\xcb\x83\xcf\x85\xd6\xfd\xc7\x3a\x5a\x97\x07\xeb\x68\xdd\x7f\xa4\xd3\xea\xf2\x20\x1d\xae\xfb\x1f\x8f\x17\x48\xdd\x7f\xf5\xce\xc5\xd4\xfd\x27\x4c\xdb\xb3\x8d\x19\xcd\x5f\x10\xe3\x05\xa6\xee\x3f\xd5\xe1\x3d\xdb\xea\x1d\x8f\xa9\xfb\x4f\x75\x78\xcf\x36\xd5\xe1\x3d\xdb\x94\xdd\x62\xd0\xe1\x3d\xdb\x94\xe1\x3d\xdb\x94\x5d\x68\x68\x73\xd6\xc0\x32\xe9\x7d\xd7\xf6\x6c\xa3\xbe\x6b\x7b\xb6\x31\x63\xc7\x0b\xd0\x26\xdd\xb3\x2d\x75\x07\xc8\x78\x41\x6f\x93\xee\xd9\xc6\x3a\xba\x67\x1b\xeb\x6e\x32\xf4\x8f\xee\xd9\xc6\xba\x52\xfa\xb5\xd6\xf6\x6c\x63\x5d\x36\xfd\x78\x5a\xee\x7f\xd7\xd2\xeb\xfe\x87\x9a\xdf\x10\x1a\xbd\xee\x3f\x61\x89\x58\xa0\xec\xef\xc9\x7d\xf4\xb0\x60\x7a\xdd\x7f\xaa\xa3\xb1\x70\x9f\x60\x7a\xdd\x7f\xaa\xa3\xb1\x80\x75\x34\x16\x30\xa3\xb1\x80\x19\x8d\x05\xcc\x68\x2c\x60\x46\x63\x01\x33\x1a\x0b\x98\xd1\x58\x40\x2c\x11\x0b\xa4\xef\x89\x58\xa0\x8c\xc6\x02\x6e\x13\xc7\x42\xac\xd3\xeb\xfe\xd3\x36\x3f\x48\xce\x13\xb3\x3b\x0c\x8c\xc6\x82\x3c\x17\xbd\xee\x3f\xd5\xd1\x58\xc0\x7d\x78\x11\xb9\x9e\x58\x47\x63\x01\x1d\x4f\xcb\x5f\x10\xab\x23\x4c\xdd\xff\x5f\x17\x1a\xbe\xee\x3f\x62\x5a\xdd\x7f\xcc\x68\xdd\xff\x8f\x09\xc6\xd7\xfd\xc7\x3a\x5a\xf7\x3f\x74\xb4\xb4\xba\xff\x58\x47\xeb\xfe\x63\x1d\xad\xfb\x8f\x19\xad\xfb\x8f\x19\xad\xfb\x8f\x19\xad\xfb\x8f\x19\xad\xfb\x8f\x19\xad\xfb\x8f\x98\x56\xf7\x1f\x33\x5a\xf7\x1f\xf5\x5d\xab\xfb\x8f\x19\xad\xfb\x8f\xdb\xa4\x75\xff\x85\x2e\xa5\xee\x3f\x6e\x93\xd6\xfd\xc7\x3a\x5a\xf7\x1f\xeb\x68\xdd\x7f\x71\x2e\x29\x75\xff\xb1\x8e\xd6\xfd\xc7\x7d\xa0\x75\xff\x91\x4e\xab\xfb\x8f\x8e\x87\x6a\x9d\xcb\xe3\xfd\x96\x85\xeb\xfe\xc7\x9f\xff\x9a\x38\xd6\x0f\xd8\x58\x40\x4c\x8b\x05\xcc\x68\x2c\x7c\x54\xb0\x75\x36\x16\xb0\x8e\xc6\xc2\x11\xc1\xfe\x98\x8d\x05\xac\xa3\xb1\x80\x75\x34\x16\x30\xa3\xb1\x80\x19\x8d\x05\xcc\x68\x2c\x60\x46\x63\x01\x33\x1a\x0b\x88\x69\xb1\x80\x19\x8d\x05\xd4\x77\x2d\x16\x30\xa3\xb1\x80\xdb\xa4\xb1\x20\x75\xdf\x65\x63\x01\xb7\x49\x63\x01\xeb\x68\x2c\x60\x1d\x8d\x05\x79\x2e\x7f\xc9\xc6\x02\xd6\xd1\x58\xc0\x7d\xa0\xb1\x80\x74\x5a\x2c\xa0\xe3\x69\x75\xff\x85\x2f\x30\x75\xff\x65\x9c\xf3\x75\xff\x11\xd3\xea\xfe\x63\x46\xeb\xfe\x0b\x5f\x48\xa9\xfb\x8f\x75\xb4\xee\xbf\x7c\x06\xf0\x75\xff\xb1\x8e\xd6\xfd\xc7\x3a\x5a\xf7\x1f\x33\x5a\xf7\x1f\x33\x5a\xf7\x1f\x33\x5a\xf7\x1f\x33\x5a\xf7\x1f\x33\x5a\xf7\x1f\x31\xad\xee\x3f\x66\xb4\xee\x3f\xea\xbb\x56\xf7\x1f\x33\x5a\xf7\x1f\xb7\x49\xeb\xfe\x4b\x1d\x5f\xf7\x1f\xb7\x49\xeb\xfe\x63\x1d\xad\xfb\x8f\x75\xb4\xee\xbf\x3c\x17\xbe\xee\x3f\xd6\xd1\xba\xff\xb8\x0f\xb4\xee\x3f\xd2\x69\x75\xff\xd1\xf1\x12\x75\xff\xd5\x78\x81\xd4\xfd\x57\xef\x5c\x4c\xdd\x7f\xc2\xf8\xf1\x02\x53\xf7\x5f\x8d\x17\x98\xba\xff\x54\xc7\x8e\x17\x98\xba\xff\x54\xc7\x8e\x17\x98\xba\xff\x94\xb1\xe3\x05\xa6\xee\x3f\x65\xec\x78\x81\xa9\xfb\x4f\x19\x3b\x5e\x60\xea\xfe\x13\xc6\x8f\x17\x98\xba\xff\x94\xb1\xe3\x05\xa6\xee\x7f\xac\xd3\xeb\xfe\xd3\x36\xd9\xf1\x02\x53\xf7\x9f\xea\xd8\xf1\x02\x53\xf7\x9f\xea\xd8\xf1\x02\x53\xf7\x9f\xea\xd8\xf1\x82\x5e\xf7\x3f\x9e\x47\x22\x75\xff\xd5\x58\x9c\xa9\xfb\x4f\x18\x3f\x8f\xc4\xd4\xfd\xaf\x4e\xef\x0a\xef\xff\xa8\xee\xff\x92\x87\xae\x33\xd5\xb1\xf3\x48\x4c\xdd\x7f\xaa\x63\xe7\x91\x98\xba\xff\x94\xb1\xf3\x48\x4c\xdd\x7f\xca\xd8\x79\x24\xa6\xee\x3f\x65\xec\x3c\x12\x53\xf7\x9f\x30\x7e\x1e\x89\xa9\xfb\x4f\x19\x3b\x8f\xc4\xd4\xfd\x8f\x75\x7a\xdd\x7f\xda\x26\x3b\x8f\xc4\xd4\xfd\xa7\x3a\x76\x1e\x89\xa9\xfb\x4f\x75\xec\x3c\x12\x53\xf7\x9f\xea\xd8\x79\xa4\x94\xba\xff\x62\x7d\x81\xa9\xfb\x2f\xe6\x68\x53\xea\xfe\x23\xa6\xd5\xfd\xc7\x8c\xae\xb5\x89\xf5\x85\x94\xba\xff\x58\xc7\xae\x2f\xa4\xd4\xfd\xc7\x3a\x76\x7d\x21\xa5\xee\x3f\x66\xec\xfa\x42\x4a\xdd\x7f\xcc\xd8\xf5\x85\x94\xba\xff\x98\xb1\xeb\x0b\x29\x75\xff\x31\xa3\x75\xff\x51\xdf\xb5\xba\xff\x98\xb1\xeb\x0b\x29\x75\xff\xa5\x8e\xaf\xfb\x8f\xdb\xa4\x75\xff\xb1\x8e\xd6\xfd\xc7\x3a\x76\x7d\x21\xa5\xee\x3f\xd6\xb1\xeb\x0b\x29\x75\xff\x91\x8e\x5f\x5f\x48\xd4\xfd\x1f\xaa\xe3\x89\xbc\x36\x95\xfb\x1f\x7f\x2e\x72\x83\x12\xb9\xff\x3c\x8b\x74\xd1\xbe\x2f\xc4\x60\x9f\xea\x50\xed\xcd\x13\x79\x6d\x89\xdc\xff\xa1\x8a\x05\xac\x7b\x1a\x58\x14\x0b\x22\x17\x29\x91\xfb\x3f\x54\x7b\xf3\xb0\xee\x61\x60\xd1\xf5\xc2\xba\x7b\x49\x1f\x30\xbb\x4d\xe9\x74\x56\x37\xb0\xcb\x80\x45\xf7\x0a\x66\x17\x29\x5d\x57\x63\x67\x1b\xce\x73\x8b\xea\xfb\x2a\x65\xb0\x4f\x75\xa8\x62\x01\xf5\x1d\xf6\xa9\x0e\x55\x2c\x60\xf6\x4d\xf2\x1d\xe1\x36\xfb\x8a\xe1\xef\x01\xe7\xfe\x0f\xd5\xde\x3c\xdc\xe6\x31\x75\x9e\x5d\x4d\x77\xa7\x62\x43\x4d\x77\x33\x61\xf7\x23\x76\x20\xfd\x3e\x83\x7d\xaa\x43\x35\x4e\xc4\x7d\x38\x57\x5d\xcf\x81\xa6\x9b\x54\xc7\xeb\xd3\xe3\x69\x75\xff\x65\xee\x7f\x1b\x62\xc1\x55\x79\xd7\xb7\x5b\x34\xf7\x9f\x67\x36\xb0\x8a\xce\x4e\x46\xbf\x91\x1e\xed\x13\xf9\x55\xc1\x70\xdd\x7f\x57\xe5\xfe\x63\xdd\x33\xa0\x8b\xf2\xb5\xdf\x6e\xd1\xdc\x7f\x57\xe5\xbf\x63\x5d\xf4\x1b\xe9\x4d\x46\x77\x54\xf5\x5b\x67\xb7\x1b\x74\x87\x0c\x2c\xfa\x8d\xf4\x06\xc3\x2e\x36\xe8\xce\x31\xb0\xf1\xf4\xbe\x43\x8e\x27\xdb\x77\xc8\xf1\x74\x55\xee\x3f\x66\xdf\x82\x36\x2b\x4c\x9b\x4f\xa8\xef\xaf\x8f\x74\x38\xf7\xdf\x55\xb9\xff\xb8\xcd\xe3\xc0\xca\x8c\xee\x3d\x8a\xe9\xba\x37\xb1\xfd\xc3\xb9\xff\xec\x7d\x06\x39\x9e\xec\xb5\x86\x1c\x4f\x57\x5d\x4f\xac\x3b\x23\xfd\x78\x90\xe3\x19\xd7\x87\xfb\x80\x85\xeb\xfe\xc7\x9f\xdf\x6a\xd1\xdc\x7f\x96\xc1\x9e\xed\xb8\x2e\x1e\x66\xcf\x02\x8b\x7c\xe1\x57\x2c\x9a\xfb\x1f\xd7\x2e\xc4\xba\x01\xb0\xc8\x17\xde\x6a\xd1\xdc\xff\xb8\x76\x21\xd6\x3d\x04\x2c\x7a\xde\x62\xdd\x11\xd2\x07\xcc\x6e\x55\x3a\x9d\x1d\x34\xb0\x4b\x81\x45\xbe\x80\xd9\x4b\x95\xae\xab\xb1\xbc\xe1\x3c\xc7\x54\xdf\x57\x29\x83\x3d\xdb\x71\xed\x42\xd4\x77\xd8\xb3\x1d\xd7\x2e\xc4\xec\x1b\xe4\x3b\xc2\x6d\x7e\x49\x31\x0b\xe9\x70\xee\x7f\x5c\xbb\x10\xb7\x79\x9f\x3a\xcf\xae\xa6\x73\x14\x1b\x6a\xba\x37\x12\xf6\x56\x8b\xe6\xfe\xb3\xf7\x19\xec\xd9\x8e\x6b\x17\xe2\x3e\xbc\x58\x5d\xcf\x81\xa6\x9b\x50\xc7\x5b\xa3\xc7\xd3\xea\xfe\xb7\x2d\x9c\xfb\xef\xaa\xcf\x65\x6c\xcd\x10\x5f\xd0\x99\xcd\x3e\x57\x66\x0c\xbe\x90\x27\xbe\xa0\xeb\x62\x5f\xe8\xa3\x58\x3e\x93\xf8\x82\xae\x8b\x7d\x41\xd7\x1d\x25\xfd\xc6\xec\x76\x83\xee\x90\x81\xc5\xbe\xa0\xb3\x8b\x0d\x3a\x5a\x53\x09\xb3\xf1\xf4\xbe\x23\x5f\xd0\xfa\x8e\x7c\x41\x67\xb1\x2f\xe8\x6d\xf2\xbe\x30\x4d\x7c\x41\x6f\x93\xf7\x85\x69\xe2\x0b\xba\xee\x4d\x6c\xff\x66\x88\x2f\xe8\xba\x3d\xe9\xd7\x1a\xf9\x82\xae\x3b\x23\xfd\x78\x29\xbe\xf0\xfc\x14\x5f\xc8\x1a\x7c\x21\x6b\xf0\x85\xac\xc1\x17\xce\x30\xf8\x42\xd6\xe0\x0b\x96\xc1\x17\xb2\x06\x5f\xb0\x0c\xbe\x60\x19\x7c\xc1\x32\xf8\x82\x65\xf0\x05\xcb\xe0\x0b\x96\xc1\x17\x2c\x83\x2f\x58\x06\x5f\xc8\x1a\x7c\x21\x6b\xf0\x05\xcb\xe0\x0b\x63\x06\x5f\xc8\x1a\x7c\x61\xcc\xe0\x0b\x59\x83\x2f\x64\x0d\xbe\x90\x35\xf8\x82\x65\xf0\x85\xac\xc1\x17\x70\xee\x7f\x7c\x3c\x31\x23\xbc\xb8\xa1\xc5\xc2\x6d\xa1\x66\x51\xfe\xe6\x3c\xad\xef\x8c\x19\xad\xef\x8c\x18\x8c\x9d\xe3\x58\x78\xaf\x60\xff\x6c\x59\x4c\x7d\x67\xac\xa3\xf5\x9d\xdf\x26\xd8\xff\xb2\x2c\xa6\xbe\x33\xd6\xd1\xfa\xce\x58\x47\xeb\x3b\x63\x46\xeb\x3b\x63\x46\xeb\x3b\x63\x46\xeb\x3b\x63\x46\xeb\x3b\x63\x46\xeb\x3b\x63\x46\xeb\x3b\x23\xa6\xd5\x77\x46\x7d\xd7\xea\x3b\x63\x46\xeb\x3b\xe3\x36\x69\x7d\x67\xa9\xfb\xb6\x65\x31\xf5\x9d\x71\x9b\xb4\xbe\x33\xd6\xd1\xfa\xce\x58\x47\xeb\x3b\xe3\x73\xa1\xf5\x9d\xb1\x8e\xd6\x77\xc6\x3a\x5a\xdf\x19\xeb\x68\x7d\x67\xa4\x83\xb1\x33\xf1\x85\xc5\x65\xde\x17\x16\x4f\xa4\xfb\x82\x64\xbc\x2f\x00\x63\x7d\x61\xf1\xeb\xe9\xbe\x00\x3a\xd6\x17\x44\x26\x7f\x8a\x2f\x80\x8e\xf5\x05\xd0\xb1\xbe\x00\x8c\xf5\x05\x60\xac\x2f\x00\x63\x7d\x01\x18\xeb\x0b\xc0\x58\x5f\x00\xc6\xfa\x82\x64\xbc\x2f\xc8\xbe\xf3\xbe\x00\x8c\xf5\x05\x68\x93\xf5\x85\xc5\xdf\x49\xf7\x05\x68\x93\xf5\x05\xd0\xb1\xbe\x00\x3a\xd6\x17\xe0\x5c\x58\x5f\x00\x1d\xeb\x0b\xa0\x63\x7d\x01\x74\xac\x2f\x48\x5d\x8a\x2f\x3c\x9c\xe2\x0b\xc7\x0c\xbe\x70\xcc\xe0\x0b\xc7\xd2\x7d\x41\xfe\x86\xe4\xe2\x87\x58\x5f\x38\x66\xf0\x85\x7b\x0c\xbe\x70\xcc\xe0\x0b\xf7\x18\x7c\xe1\x1e\x83\x2f\xdc\x63\xf0\x85\x7b\x0c\xbe\x70\x8f\xc1\x17\xee\x31\xf8\xc2\x3d\x06\x5f\xb8\xc7\xe0\x0b\xc7\x0c\xbe\x70\xcc\xe0\x0b\xf7\x18\x7c\xe1\x3d\x06\x5f\x38\xc6\xf9\x82\x50\xc8\xbf\x91\xe6\x0b\xc7\x0c\xbe\x70\x8f\xc1\x17\x8e\x19\x7c\xe1\x1e\x83\x2f\x1c\x33\xf8\xc2\x3d\x06\x5f\x68\xa6\xf8\xc2\x0d\x06\x5f\xb8\xc1\xe0\x0b\x37\x18\x7c\xe1\xcd\x06\x5f\xb8\xc1\xe0\x0b\x57\x1b\x7c\xe1\x06\x83\x2f\x5c\x6d\xf0\x85\xab\x0d\xbe\x70\xb5\xc1\x17\xae\x36\xf8\xc2\xd5\x06\x5f\xb8\xda\xe0\x0b\x57\x1b\x7c\xe1\x6a\x83\x2f\xdc\x60\xf0\x85\x1b\x0c\xbe\x70\xb5\xc1\x17\x2a\x06\x5f\xb8\xc1\xe0\x0b\x15\x83\x2f\xdc\x60\xf0\x85\xab\x0d\xbe\x70\x83\xc1\x17\xae\x36\xf8\xc2\x0d\x06\x5f\xb8\xda\xa2\xb9\xff\xc3\xe9\x5d\x4b\xef\xb7\xf4\xdc\xff\xfa\xf4\xae\xa5\x5b\x84\x46\xac\xeb\x25\x72\xff\x09\x4b\xe4\xfe\x53\x86\x73\xff\x43\xf6\x3f\x04\x13\x73\xd0\x89\xdc\x7f\xaa\xc3\xb9\xff\x21\xfb\x25\xc1\xc4\x3a\x4e\x22\xf7\x9f\xea\x70\xee\x3f\xd5\xb5\x49\x1f\x30\xbb\xc5\xa0\x7b\x03\xe9\x03\x66\x38\xf7\x9f\xb2\x0b\x0d\x6d\xce\x1a\x58\x26\xbd\xef\x89\xdc\x7f\xd2\xf7\x44\xee\x3f\x65\x78\x0f\x06\x6d\x13\xe7\xfe\xc7\xba\xad\x82\x7d\x3c\xfd\x3b\x4a\xe4\xfe\x53\xdd\x1d\x2c\x93\xba\x9b\x0c\xfd\xbb\x22\xfd\x3e\x4b\xe4\xfe\x53\xdd\x8b\xc8\xf5\xc4\xba\x6c\xfa\xf1\xb4\xdc\xff\xbb\x45\x2c\x9c\xa1\xe5\xfe\xbf\x2b\xd4\x2c\xfc\xbb\xc5\xd5\xfd\x47\x4c\xab\xfb\x8f\x19\xad\xfb\x2f\x7c\x74\xe1\xb4\x60\xb4\xee\x3f\xd6\x3d\x05\x2c\x9a\x07\x6b\x08\xf6\x0f\x82\xd1\xba\xff\x58\xf7\x20\xb0\x26\xa3\x3b\x4c\xfa\x80\xd9\xbb\x0d\xba\x1b\x0d\xac\x02\xac\xc1\xb0\x0b\x80\x39\x0c\xdb\x66\x68\xd3\x4e\xef\xbb\x56\xf7\x1f\xf5\x5d\xab\xfb\x8f\x59\x34\x47\x5d\x61\xda\xa4\x75\xff\xa5\x4e\xee\x93\xa6\x75\xff\x71\x9b\xb4\xee\x3f\xd6\xd1\xba\xff\x58\x77\xc8\xd0\x3f\x5a\xf7\x1f\xeb\x2e\x4e\xbf\xd6\x5a\xdd\x7f\xac\xa3\x73\xd4\x48\xa7\xd5\xfd\x17\x19\xaa\x0b\xdf\xd7\xf6\x23\xbd\x53\x68\x7e\xdf\xe2\x6a\x91\x20\xa6\xd5\x22\xc1\x8c\xd6\x22\x71\x04\xfb\x13\x14\x0b\xf1\x3e\x18\xac\xa3\xb5\x48\xde\x2c\xd8\x02\x8a\x85\xb8\x16\x09\xd6\xd1\x5a\x24\x58\x47\x6b\x91\x60\x46\x6b\x91\x60\x46\x6b\x91\x60\x46\x6b\x91\x60\x46\x6b\x91\x60\x46\x6b\x91\x60\x46\x6b\x91\x20\xa6\xd5\x22\x41\x7d\xd7\x6a\x91\x60\x46\x6b\x91\xe0\x36\x69\x2d\x12\xa9\xfb\x12\x8a\x85\xb8\x16\x09\x6e\x93\xd6\x22\xc1\x3a\x5a\x8b\x04\xeb\x68\x2d\x12\x7c\x2e\xb4\x16\x09\xd6\xd1\x5a\x24\x58\x47\x6b\x91\x60\x1d\xad\x45\x82\x74\x5a\x2d\x12\xe1\x0b\x0b\x9f\xd3\x72\xff\x65\x6c\x7d\xc4\xe2\xea\xfe\x23\xa6\xd5\xfd\xc7\x8c\xd6\xfd\x97\xbe\xf0\x5b\xc4\x17\xf2\x9a\x4e\xf9\x02\xc4\x82\x8c\xe5\x4e\xd2\x17\xa0\x4d\xac\x53\xbe\x00\x0c\xeb\x0e\x93\x3e\x60\xa6\x7c\x81\x61\x37\x1a\x58\xec\x0b\x55\x8d\x29\x5f\x80\x7b\x05\xb3\x6d\x86\xf3\x54\xbe\x00\xb1\x80\x98\x56\xf7\x1f\xf5\x5d\xab\xfb\x8f\x59\xec\x0b\xda\x79\x6a\x75\xff\xa5\xee\x03\xc4\x17\xaa\x5a\x9b\xb4\xee\x3f\xd6\xd1\xba\xff\x58\x77\x88\x30\x7c\x2e\xb4\xee\x3f\xd6\x29\x5f\xd0\xaf\x99\x56\xf7\x1f\xeb\x94\x2f\x40\x2c\x20\x5d\xa2\xee\xbf\x1a\x2f\x2c\xfc\x8f\xc4\x9e\x6d\xf5\xce\xb5\xd0\xb0\xe8\x9e\x6d\xc2\x12\x7b\xb6\x29\xc3\x7b\xb6\xd5\x78\x61\xe1\xdd\x64\xbc\xa0\xeb\xf0\x9e\x6d\xf5\x8e\xb7\xf0\x06\x32\x5e\xd0\x75\x78\xcf\x36\xd5\xb5\x49\x1f\x30\xbb\xc5\xa0\x7b\x03\xe9\x03\x66\x78\xcf\x36\x65\x17\x1a\xda\x9c\x35\xb0\x4c\x7a\xdf\x13\x7b\xb6\x49\xdf\x13\x7b\xb6\x29\x63\xc7\x0b\xd0\x26\xde\xb3\x1d\xeb\x5e\x4b\xc6\x0b\x7a\x9b\x1f\x24\xe7\x89\x75\x77\xb0\xac\x41\xc6\x0b\x7a\xff\xae\x48\xbf\xcf\x12\x7b\xb6\xa9\xee\x45\xe4\x7a\x62\x5d\x36\xfd\x78\x89\xdc\xff\x90\x89\xd9\xa5\x85\xcb\xb4\x58\x78\xb7\xd0\x94\xd9\x58\x40\x4c\x8b\x05\xcc\x68\x2c\xfc\xb2\x60\x97\xb0\xb1\x80\x75\x34\x16\xde\x22\xd8\x76\x36\x16\xb0\x8e\xc6\x02\xd6\xd1\x58\xc0\x8c\xc6\x02\x66\x34\x16\x30\xa3\xb1\x80\x19\x8d\x05\xcc\x68\x2c\x60\x46\x63\x01\x31\x2d\x16\x04\x9b\x17\xbf\x19\xbd\x50\x26\xb1\x80\xae\x8b\x16\x0b\xb8\x4d\x1a\x0b\x52\x77\x3e\x1b\x0b\xb8\x4d\x1a\x0b\x98\xd1\x58\xc0\x8c\xc6\x82\x3c\x97\x9f\x63\x63\x01\xeb\x68\x2c\xe0\x3e\xd0\x58\xc0\x3a\x1a\x0b\xe8\x78\x5a\xfe\xc2\xfb\xc4\x95\x7c\xb1\x36\x5e\x10\x35\x37\x17\xc4\x6f\x09\x6a\xb5\xce\x11\xd3\x6a\x9d\x63\x46\x6b\x9d\xdf\x29\x98\xdc\x3b\x44\x6b\x9d\x63\x1d\xad\x75\xfe\xdf\x43\xe6\xff\x54\x30\x5a\xeb\x1c\xeb\x68\xad\x73\xac\xa3\xb5\xce\x31\xa3\xb5\xce\x31\xa3\xb5\xce\x31\xa3\xb5\xce\x31\xa3\xb5\xce\x31\xa3\xb5\xce\x11\xd3\x6a\x9d\x63\x46\x6b\x9d\xa3\xbe\x6b\xb5\xce\x31\xa3\xb5\xce\x71\x9b\xb4\xd6\xb9\xd4\xc9\xbd\x0d\xb4\xd6\x39\x6e\x93\xd6\x3a\xc7\x3a\x5a\xeb\x1c\xeb\x68\xad\x73\x71\x2e\x0b\x13\x82\xd1\x5a\xe7\x58\x47\x6b\x9d\xe3\x3e\xd0\x5a\xe7\x58\x47\x6b\x9d\xa3\xe3\x69\x75\xff\x45\x96\x9c\xff\x2f\x5a\x2c\xbc\x43\x1c\xeb\xef\xd8\x58\x40\x4c\x8b\x05\xcc\x68\x2c\x88\xdf\xdc\xf4\xff\x81\x8d\x05\xac\xa3\xb1\xf0\x26\xc1\xfe\x8c\x8d\x05\xac\xa3\xb1\x80\x75\x34\x16\x30\xa3\xb1\x80\x19\x8d\x05\xcc\x68\x2c\x60\x46\x63\x01\x33\x1a\x0b\x88\x69\xb1\x80\x19\x8d\x05\xd4\x77\x2d\x16\x30\xa3\xb1\x80\xdb\xa4\xb1\x20\x75\xdf\x63\x63\x01\xb7\x49\x63\x01\xeb\x68\x2c\x60\x1d\x8d\x05\x79\x2e\x7f\xcd\xc6\x02\xd6\xd1\x58\xc0\x7d\xa0\xb1\x80\x75\x34\x16\xd0\xf1\xb4\x58\x10\xbe\xe0\x2f\xf3\xbe\xe0\x2f\x5a\x5c\xdd\x7f\xc4\xb4\xba\xff\x98\xd1\xba\xff\xc2\x17\xfc\xa7\x05\xa3\x75\xff\xb1\x8e\xd6\xfd\x97\xcf\x80\xcf\x09\x46\xeb\xfe\x63\x1d\xad\xfb\x8f\x75\xb4\xee\x3f\x66\xb4\xee\x3f\x66\xb4\xee\x3f\x66\xb4\xee\x3f\x66\xb4\xee\x3f\x66\xb4\xee\x3f\x66\xb4\xee\x3f\x62\x5a\xdd\x7f\xd4\x77\xad\xee\x3f\x66\xb4\xee\x3f\x6e\x93\xd6\xfd\x97\xba\x2f\x0a\x46\xeb\xfe\xe3\x36\x69\xdd\x7f\xac\xa3\x75\xff\xb1\x8e\xd6\xfd\x97\xe7\xf2\x15\xc1\x68\xdd\x7f\xac\xa3\x75\xff\x71\x1f\x68\xdd\x7f\xac\xa3\x75\xff\xd1\xf1\x12\x75\xff\xd5\x78\xc1\xff\x34\x3f\x5e\xf0\xdd\xf4\xf1\x82\x64\xfc\x78\x01\x18\x3b\x5e\xf0\x1f\x4e\x1f\x2f\x80\x8e\x1d\x2f\xf8\x77\xa7\x8f\x17\x40\xc7\x8e\x17\x40\xc7\x8e\x17\x80\xb1\xe3\x05\x60\xec\x78\x01\x18\x3b\x5e\x00\xc6\x8e\x17\x80\xb1\xe3\x05\x60\xec\x78\x41\x32\x6d\xbc\x80\xfa\xae\x8d\x9d\x31\x63\xc7\x0b\xd0\x26\x3b\x5e\xf0\xef\x4d\x1f\x2f\x40\x9b\xec\x78\x01\x74\xec\x78\x01\x74\xec\x78\xc1\xbf\x3f\x7d\xbc\x00\x3a\x76\xbc\x00\x7d\x60\xc7\x0b\xa0\x63\xc7\x0b\xf2\x78\x89\xdc\x7f\x35\x8f\xe4\xa7\xcc\x23\xf9\xef\x64\x63\x01\x31\x7e\x1e\x09\x18\x3b\x8f\xe4\xdf\xce\xc6\x02\xd6\xb1\xf3\x48\xfe\xeb\xd9\x58\xc0\x3a\x76\x1e\x09\x74\xec\x3c\x12\x30\x76\x1e\x09\x18\x3b\x8f\x04\x8c\x9d\x47\x02\xc6\xce\x23\x01\x63\xe7\x91\x80\xb1\xf3\x48\x92\xf1\xf3\x48\xb2\xef\xfc\x3c\x12\x30\x76\x1e\x09\xda\x64\xe7\x91\xfc\x43\x6c\x2c\xe0\x36\xd9\x79\x24\xd0\xb1\xf3\x48\xa0\x63\xe7\x91\xfc\x06\x1b\x0b\x58\xc7\xce\x23\x41\x1f\xd8\x79\x24\xd0\xb1\xf3\x48\xf2\x78\xda\xd8\x59\x44\x96\xff\x8b\xda\x3b\x92\x98\xa3\xf5\x5f\x65\x71\x6b\x6d\x88\x69\x6b\x6d\x98\xd1\xb5\x36\xb1\xbe\xe0\x5f\x61\x71\x6b\x6d\x58\x47\xd7\xda\xc4\x9c\xb0\x7f\x9e\xc5\xad\xb5\x61\x1d\x5d\x6b\xc3\x3a\xba\xd6\x86\x19\x5d\x6b\xc3\x8c\xae\xb5\x61\x46\xd7\xda\x30\xa3\x6b\x6d\x98\xd1\xb5\x36\xcc\xe8\x5a\x1b\x62\xda\x5a\x1b\xea\xbb\xb6\xd6\x86\x19\x5d\x6b\xc3\x6d\xd2\xb5\x36\xa9\x93\xb9\x9a\x74\xad\x0d\xb7\x49\xd7\xda\xb0\x8e\xae\xb5\x61\x1d\x5d\x6b\x93\xe7\xb2\xdf\xe2\xd6\xda\xb0\x8e\xae\xb5\xe1\x3e\xd0\xb5\x36\xac\xa3\x6b\x6d\xe8\x78\xb0\xbe\x40\xf6\xa9\xaa\xdc\x7f\x57\x7d\x2e\x72\x83\x12\xb9\xff\x3c\x8b\x74\xd1\xbe\x2f\xc4\x60\x9f\x6a\xbc\xd6\x26\xf2\xda\x12\xb9\xff\xae\x1a\x2f\x60\xdd\xd3\xa0\x8b\x62\x41\xe4\x22\x25\x72\xff\x5d\x15\x0b\x58\xf7\x30\xe8\xa2\x7b\x4c\xe8\x4e\xca\x5a\x5a\x67\x03\x8b\xfa\x80\xdb\xbc\x4d\xe9\x74\x56\x37\xb0\xcb\x80\x45\xb1\x80\xd9\x45\x4a\xd7\xd5\xd8\xd9\xdc\x79\x26\x72\xff\xe3\xb5\x36\xc4\x60\x9f\xaa\xab\x62\x01\xf5\x1d\xf6\xa9\xba\x2a\x16\x30\xfb\x26\xb4\x19\x7d\x47\xb8\xcd\xbe\xfa\xfe\xf0\xf7\x80\x73\xff\x5d\x15\x0b\xb8\xcd\x63\xc0\xa2\x58\xc0\xba\x3b\x15\x1b\x6a\xba\x9b\x55\xff\x86\xe8\x5c\x70\xee\x3f\x7b\x9f\xc1\x3e\xd5\x78\xad\x0d\xf7\xe1\x5c\xd0\x45\xb1\x80\x75\x93\xea\x78\x7d\x7a\x3c\xd8\xa7\xda\x23\xb9\xff\x37\xa3\x77\x24\x79\xac\x5f\xb4\x68\xee\x3f\xcb\xc0\x17\x7a\x2a\x87\x1f\xb3\x75\xf5\x7e\x21\x8f\x75\xbd\xb8\x37\xc5\xef\x0c\x42\xdd\x7f\x5e\xf7\x94\xf2\x35\xc9\x2e\xb5\xe2\xdc\xf8\x47\xd5\x7b\x82\xae\x7b\x50\x79\xa5\x64\x2f\x15\xec\x52\xe4\x0b\x71\x1f\x70\x9b\xef\x26\x3a\xcc\x6e\x34\xb0\x8a\xf2\x6d\x9d\x5d\xa0\xde\x59\x74\xb6\xcd\xd0\xa6\x9d\xde\x77\xf0\x85\xb8\xef\x2f\x13\xec\x17\x91\x2f\xc4\xc7\x93\xd7\xe5\x65\x82\x7d\x4b\xbd\x07\xe9\x6d\x3e\xa6\x58\x1f\xe9\xb0\x2f\xf4\x54\xee\x3f\xba\xd6\xe0\x0b\x3d\xb5\xcf\x07\xeb\xde\x46\xfa\x80\x75\x87\xd8\xfe\xed\x41\xbe\xc0\xde\x67\xe0\x0b\xec\xb5\x06\x5f\x88\xaf\x27\xd6\x8d\xa7\x1f\x4f\xdb\x83\x71\x93\x85\x73\xff\xe3\xcf\x77\x08\xcd\x55\x56\xbc\x67\x3b\x66\x57\x59\x71\xbe\xfd\x29\x60\xd1\x3b\x12\x66\x3f\x26\xbe\xb0\x5b\xc4\xc2\x9f\x8b\x23\xbe\x1e\x58\xe4\x0b\x58\xf7\x55\xe2\x0b\x15\x2b\xce\x8d\x7f\x04\x58\xe4\x0b\x58\xf7\x11\xf2\xbc\xc5\xba\xf7\x93\x3e\x60\xd6\x24\xcf\x7e\xcc\xae\x37\xb0\x57\x45\x6d\xc2\x73\x13\xb3\xf3\x80\x45\xef\x48\x98\x9d\xa5\xda\xec\x53\x06\x73\xaa\xb1\x2f\x60\xf6\xac\xea\xbb\xf6\x3d\xc0\x9c\x6a\xbc\x07\x03\xb3\x81\xfa\x8e\xb4\xf3\x84\x39\xd5\x78\x0f\x86\xd4\xc9\x1c\xfe\x87\xa2\x73\x01\xdd\xcf\xc4\xf7\x04\xcc\xa9\xaa\x3d\x18\xf3\xb7\xc6\x2c\x54\x27\x9e\xfd\xf8\x5c\x0e\xaa\xbe\x0f\xd1\xb9\x48\x76\x69\xfa\x7d\x06\x73\xaa\xb1\x2f\xe0\x3e\xe4\x55\x9b\x03\x4d\x37\xa6\xce\x65\x8d\x1e\x0f\xe6\x54\x63\x5f\xb8\xd9\xc2\xb9\xff\xf1\xe7\x32\xb6\x66\xd0\x78\x81\x65\xc8\x17\x74\xc6\xfa\x02\xe4\xfe\x7f\xd7\xa0\x7b\x8a\x3c\x73\x64\x2c\x9f\x49\x7c\x41\xd7\xc5\xbe\xa0\xeb\x0e\x93\x3e\x60\xf6\x6e\x83\xee\x46\x03\x8b\x7d\x41\x67\xb1\x2f\xe8\x6c\x9b\xa1\x4d\x3b\xbd\xef\xc8\x17\xb4\xbe\x23\x5f\xd0\xd9\x33\xe4\xd9\x8f\xdb\xe4\x7d\x61\x9a\xf8\x82\xde\x26\xeb\x0b\xf3\x22\x97\x67\x69\x9a\xf5\x8c\x19\xe2\x0b\xf8\x5c\x66\x88\x2f\xe8\xba\x8b\xd3\xaf\x35\xf2\x05\x5d\x37\x9e\x7e\xbc\x14\x5f\x78\xbe\xe6\x0b\x32\xb6\x64\xee\x7f\x2e\x9d\xa5\xf8\x42\x96\xf5\x85\xd7\x5b\x71\xee\xff\xb7\x59\x5f\xc8\x1a\x7c\xc1\x32\xf8\x42\xd6\xe0\x0b\x96\xc1\x17\x2c\x83\x2f\x58\x06\x5f\xb0\x0c\xbe\x60\x19\x7c\xc1\x32\xf8\x82\x65\xf0\x05\xcb\xe0\x0b\x59\x83\x2f\x64\x0d\xbe\x60\x19\x7c\x61\x8c\xf5\x05\xdc\x26\xf1\x85\x84\xee\x56\xd6\x17\xb2\x06\x5f\xc8\x1a\x7c\x21\x6b\xf0\x05\xcb\xe0\x0b\x59\x83\x2f\x64\x91\x2f\xc4\xc7\x13\xd5\x4b\x16\xff\x53\x8b\x85\xab\x43\xcd\xa2\x5c\x77\x9e\x4a\x67\xb0\xd6\x16\xc7\x02\x66\x3f\x89\x7c\x01\xce\x5f\xf8\xc2\xa2\x5c\x77\xfe\x1e\x89\x05\xac\xfb\x1a\x89\x85\xd7\x08\x26\x7e\x27\x1c\xd6\xda\xe2\x58\xc0\xba\x8f\x92\x58\xc0\xba\x0f\x90\x3e\x60\xf6\x2e\x72\xbf\x63\x76\x83\x81\xbd\x5a\xc5\x42\x45\x63\xe7\x93\x58\xc0\x6c\x86\xc4\x02\x66\x16\x89\x05\xc4\xe6\xff\x81\xc4\xc2\x6b\xe2\xbe\xc3\xd8\x39\x8e\x05\x74\x5d\xe6\x9f\x26\xb1\x80\xdb\xfc\x62\x32\x16\xe6\x65\xad\xd5\x15\xf1\x84\xbc\x9a\xc4\x02\x6e\xf3\x5e\x12\x0b\x57\xc7\xba\xf9\xdb\x48\x2c\x60\x5d\x9d\x30\x7c\x2e\x97\xa5\xdf\x67\xf3\x17\x91\x58\xc0\xba\xb3\x49\x2c\x60\x5d\x3c\x17\xa1\x5d\x6b\x58\x6b\x23\xbe\xb0\xf8\x07\xbc\x2f\x2c\x3e\x99\xee\x0b\x92\xf1\xbe\x00\x8c\xf5\x85\xc5\xa7\xd2\x7d\x01\x74\xac\x2f\x2c\xfe\x5e\xba\x2f\x80\x8e\xf5\x05\xd0\xb1\xbe\x00\x8c\xf5\x05\x60\xac\x2f\x00\x63\x7d\x01\x18\xeb\x0b\xc0\x58\x5f\x90\x8c\xf7\x05\x60\xac\x2f\xc8\xbe\xf3\xbe\x00\x8c\xf5\x05\x68\x93\xf5\x85\xc5\x6e\xba\x2f\x40\x9b\xac\x2f\x80\x8e\xf5\x05\xd0\xb1\xbe\x00\xe7\xc2\xfa\x02\xe8\x58\x5f\x00\x1d\xeb\x0b\xa0\x63\x7d\x41\xea\x52\x7c\xe1\xa1\x14\x5f\xb8\xcf\xe0\x0b\xf7\x19\x7c\xe1\xbe\x74\x5f\x90\xf3\x48\x8b\xbf\xce\xfa\xc2\x7d\x06\x5f\xb8\xdb\xe0\x0b\xf7\x19\x7c\xe1\x6e\x83\x2f\xdc\x6d\xf0\x85\xbb\x0d\xbe\x70\xb7\xc1\x17\xee\x36\xf8\xc2\xdd\x06\x5f\xb8\xdb\xe0\x0b\x77\xb3\xbe\x80\xfa\x3e\xff\xbd\x64\x2c\x88\x4f\xe5\xdf\x48\xf3\x85\xbb\x39\x5f\x80\x36\xef\x14\xec\x61\xd6\x17\xee\x43\xbe\xd0\x53\x63\x67\xb1\xbf\x46\xce\x69\x2d\xde\xc9\xfa\xc2\x7d\x06\x5f\xb8\xdb\xe0\x0b\xf7\x19\x7c\xe1\x6e\x83\x2f\xdc\x67\xf0\x85\xbb\x0d\xbe\xf0\xce\x14\x5f\xb8\xde\xe0\x0b\xd7\x1b\x7c\xe1\x7a\x83\x2f\xbc\xc9\xe0\x0b\xd7\x1b\x7c\xe1\x2a\x83\x2f\x5c\x6f\xf0\x85\xab\x0c\xbe\x70\x95\xc1\x17\xae\x32\xf8\xc2\x55\x06\x5f\xb8\xca\xe0\x0b\x57\x19\x7c\xe1\x2a\x83\x2f\x5c\x65\xf0\x85\xeb\x0d\xbe\x70\xbd\xc1\x17\xae\x32\xf8\xc2\xab\x0d\xbe\x70\xbd\xc1\x17\x5e\x6d\xf0\x85\xeb\x0d\xbe\x70\x95\xc1\x17\xae\x37\xf8\xc2\x55\x06\x5f\xb8\xde\xe0\x0b\x57\x21\x5f\x10\xb9\xff\xd9\xe2\xf4\xae\x25\xb1\x6a\xbe\xb8\x2f\x91\xfb\xdf\x9a\xde\xb5\x54\x15\x1a\xf9\x7b\xaa\x67\xa6\xb3\x93\xcf\x01\xab\x31\xec\x47\x91\x2f\x00\xbb\x4e\x30\x51\x37\xee\xe4\x0a\xb0\x2a\xa3\x5b\x8a\x9e\x39\xc0\x5e\x2d\xd8\x39\x82\x7d\x1e\x58\x8b\xd1\xfd\x26\xb0\x26\xd6\x9d\x14\x3b\xae\x16\xcf\x21\x7d\xc0\x6d\xbe\x13\x98\xc3\xb0\xd7\x1b\xd8\x25\xc0\x1a\x0c\x2b\x1a\x74\x5b\xd3\x75\xf3\x41\x7a\xdf\xe7\xff\x3e\xbd\xef\xf3\xff\x93\x1c\x0f\xb3\xaf\x93\xef\x08\xb7\x19\xed\x69\xa9\x24\x74\x53\x82\x7d\x2c\xfd\x3b\x9a\x6f\x93\xf3\xc4\xba\x5b\x58\x26\x75\x6f\x30\xf4\xef\x35\xe9\xf7\xd9\xfc\x85\xdc\x77\x0b\xba\x59\xc2\xb0\x2e\x93\x7e\xbc\x13\xff\xa4\x9e\x65\xe2\x99\xb4\x28\x76\x72\x2f\x1d\xd4\x72\xff\xaf\x0c\x35\x0b\xff\x2a\x62\xe1\x85\xe9\xec\xe4\x4f\xd5\x33\x47\x67\x7f\x17\xf9\x02\xb0\x6b\xc5\xbd\x29\xf6\xd9\x2e\x8c\x94\x2f\xe8\xba\x45\xf5\x3c\x92\xec\x12\xc1\xfe\x5e\xb0\xcf\x45\xcf\x46\x46\xe7\x46\xcf\x07\xc9\xc4\xa7\xbb\x4e\x0a\x3f\x5c\xa2\x35\xe5\x71\x9b\xef\x48\xea\x12\xec\x3a\x03\x7b\x65\xf4\xac\x62\xd8\xee\xe8\x39\xcd\xb0\xe9\x74\x36\x3f\x4a\xef\xfb\xfc\x7a\x7a\xdf\xe7\xbf\x4b\xda\xc4\xec\x29\xf2\x1d\xe1\x36\x1f\x55\xbe\x80\x75\x7f\x2b\xd8\x83\xe9\xdf\xd1\xfc\x61\x72\x9e\x58\xf7\x6e\x96\x49\xdd\x8d\x86\xfe\x55\xd2\xef\xb3\xf9\x0b\xd2\xbf\x87\x79\xfa\x5b\x0a\x58\x47\x7f\x4b\x01\xe9\x4e\xc8\x39\xea\x38\xf7\xff\x46\x71\x67\xfe\xb9\xb6\x1f\xe9\x72\xa1\x79\x1a\xc5\x02\xcb\x4e\x46\xf5\xc5\xa2\x77\x24\xcc\xa2\xfa\x62\xd1\x3b\xd2\x35\x82\xfd\x91\x60\x51\x7d\xb1\xe8\x1d\x09\xeb\xa2\xfa\x62\xd1\x3b\xd2\x2b\x04\x3b\x89\x62\x21\xde\x8f\x84\x75\x51\x7d\xb1\xe8\x1d\x09\xeb\xee\x26\x7d\xc0\xec\x1d\x4a\xa7\xb3\xeb\x0c\x2c\xaa\x2f\x16\xed\xc1\xc0\x2c\xaa\x2f\x16\xbd\x23\x61\x36\xad\x58\x9f\xb2\xf9\xb8\xbe\xd8\xaa\xc6\xd6\x55\xdf\xb5\xef\x61\xfe\xbb\xaa\x4d\x9d\x3d\xa5\xbe\x23\xed\x3c\xe7\xa3\xfd\x5d\x95\xc4\xf7\xf0\x18\x8a\x85\x78\x3f\x12\x6e\xf3\xb0\x3a\xcf\xae\xa6\x8b\xf6\x77\x45\x7b\x8e\xb0\xee\x46\xc5\x26\xb5\x73\xa9\xa4\xdf\x67\xf3\x17\xa4\x7f\xb7\xf3\xf1\xfe\xae\x81\xa6\x8b\xf7\x77\xad\x51\xdd\x89\x7f\x4c\xbe\x93\x2d\x7c\x96\xfa\x02\x9c\x87\x8c\x2d\x37\xe9\x0b\x3a\x43\xbe\x50\xd7\xd8\xdf\x91\xf1\x82\xf0\x85\x85\x4f\xa0\x58\x88\xc7\x0b\x58\xb7\x48\xc6\x0b\x32\x96\x8f\x25\x7d\x01\xda\xc4\x3a\x97\x8c\x17\xb0\xee\x6e\xd2\x07\xcc\xde\x41\xc6\x04\x98\x5d\x67\x60\xb1\x2f\x54\x35\xb6\x9b\x8c\x17\x30\x53\xbe\x90\xed\x53\x16\xfb\x02\xc4\x02\x66\xeb\x64\xbc\x80\xfa\x1e\xfb\x02\xc3\x9e\x22\xe3\x05\xdc\xe6\xa3\x64\xbc\x20\x75\xf7\x10\x5f\xa8\x6a\x6d\x1e\x26\xe3\x05\xac\x8b\x7d\x21\xa7\xe9\x62\x5f\x98\xd4\xce\xa5\x92\x7e\x9f\xc5\xbe\xa0\x7f\xb7\xb1\x2f\x40\x2c\x60\x9d\x4d\xc6\x0b\x48\x07\xb1\x20\xf6\x6c\xc7\xe3\x85\x85\xf7\x24\xf6\x6c\xab\x77\xae\x85\x37\x93\xf1\x82\xc6\xd0\x78\x41\x67\xf1\x78\xa1\x1e\x8f\x17\x16\x9a\x64\xbc\xa0\xeb\xe2\xf1\x42\x3d\x7e\xc7\x5b\xb8\x81\x8c\x17\x74\x5d\x3c\x5e\xd0\x75\xf7\x90\x3e\x60\x16\x8f\x17\x74\xf6\x7a\x03\x8b\xc7\x0b\x3a\x2b\x1a\x74\x5b\xd3\x75\x68\xbc\xa0\xb3\xbf\x4f\xef\x3b\x1a\x2f\xe8\xec\xeb\xe4\x3b\xc2\x6d\xc6\xe3\x05\xac\xbb\x9a\x8c\x17\xf4\x36\xdb\xe4\x3c\xb1\xee\x16\x96\xbd\x99\x8c\x17\xf4\x73\x79\x4d\xfa\x7d\x36\x7f\x61\xfa\x77\x8b\xc6\x0b\xba\x2e\x93\x7e\xbc\x13\xff\x44\x8e\x57\xb7\xf4\xba\xff\xe1\xe7\x07\x84\x66\x3f\x1b\x0b\x88\x69\xb1\x80\x19\x8d\x85\x9a\x60\x7a\xdd\x7f\xaa\xa3\xb1\xf0\x2a\xc1\x5e\xc2\xc6\x02\xd6\xd1\x58\xc0\x3a\x1a\x0b\x98\xd1\x58\xc0\x8c\xc6\x02\x66\x34\x16\x30\xa3\xb1\x80\x19\x8d\x05\xc4\xb4\x58\xc0\x8c\xc6\x02\xea\xbb\x16\x0b\x98\xd1\x58\xc0\x6d\xd2\x58\x90\xba\xf3\xd8\x58\xc0\x6d\xd2\x58\xc0\x8c\xc6\x02\x66\x34\x16\xe4\xb9\x94\xd8\x58\xc0\x3a\x1a\x0b\xb8\x0f\x34\x16\xb0\x8e\xc6\x02\x3a\x1e\xc4\x42\xfc\x4e\x26\x7e\x1d\x63\xe1\x45\xda\x78\xe1\x0a\xa1\x79\x81\x88\x85\xe7\xa7\xb3\x93\xff\x49\xc6\x0b\x98\xfd\x6f\x32\x5e\x78\x9d\x60\x67\x09\xf6\x27\x64\xbc\x80\x75\x3e\x19\x2f\x84\xd1\xb3\xcb\xdf\x10\xec\x77\xc9\x78\x01\xeb\x7e\x83\xbc\x53\x62\xdd\x5d\xa4\x0f\x98\xbd\x8d\x8c\x09\x30\xbb\xd6\xc0\x7e\x81\x8c\x17\x30\xdb\x49\xc6\x0b\x98\xe5\xc8\x78\x01\xb1\xf9\x53\x64\xbc\x80\xd9\x8f\xc9\x78\x01\xf5\x7d\xfe\xdb\x64\xbc\x80\xd9\x57\xc9\x78\x01\xb7\xf9\x08\x19\x2f\x08\x9d\x2f\x7e\xdb\x70\xfe\x23\x64\xbc\x80\xdb\x7c\x3f\x19\x2f\x60\x5d\x53\xb1\xa1\xa6\xbb\x9e\x30\x71\x2e\x0b\x72\xbf\xc4\xab\xd2\xef\xb3\xf9\xf3\xd2\xbf\xdb\xf9\xb3\xc8\x78\x01\xe9\x4e\x9c\x26\xe3\x05\x74\xbc\x13\xcf\x92\xe3\xc9\x5f\x0f\xfe\xbf\x5a\x2c\x5c\x26\x8e\xf5\x43\x36\x16\x10\xd3\x62\x01\x33\x1a\x0b\xaf\x15\xec\x59\x36\x16\xb0\x8e\xc6\xc2\x2f\x08\xf6\xa7\x6c\x2c\x60\x1d\x8d\x05\xac\xa3\xb1\x80\x19\x8d\x05\xcc\x68\x2c\x60\x46\x63\x01\x33\x1a\x0b\x98\xd1\x58\x40\x4c\x8b\x05\xcc\x68\x2c\xa0\xbe\x6b\xb1\x80\x19\x8d\x05\xdc\x26\x8d\x05\xa9\xfb\x73\x36\x16\x70\x9b\x34\x16\xb0\x8e\xc6\x02\xd6\xd1\x58\x90\xe7\xf2\x57\x6c\x2c\x60\x1d\x8d\x05\xdc\x07\x1a\x0b\x48\xa7\xc5\x02\x3a\x9e\x16\x0b\xc2\x17\xfc\x3f\xe0\x7d\xc1\x17\xbf\xb5\xe7\xbf\x20\x9d\x9d\xdc\xe0\x7c\x01\xd8\x0f\x39\x5f\xf0\x07\x82\xfd\x29\xe7\x0b\xa0\x5b\x60\x7d\x41\x8c\xf2\x4f\x7e\x96\xf3\x05\xd0\x7d\x98\x7d\x76\x48\xdd\xfb\x58\x5f\x90\xec\xed\xec\xb3\x5f\xb2\x9a\x81\xbd\x22\x6a\x33\xf1\xbc\x95\x6c\x17\xeb\x0b\x92\x4d\xb1\xbe\x20\xd8\xfc\x26\xeb\x0b\x92\xfd\x84\xf3\x05\xd9\xf7\xf9\xef\x70\xbe\x00\xec\x6b\xac\x2f\xc8\x36\x7b\xac\x2f\xc8\xba\x06\x1f\xe5\x7c\x01\xda\xfc\x00\xeb\x0b\x52\xf7\x2e\xce\x17\x40\x77\x03\xe7\x0b\xfe\x97\x05\x7b\x75\xfa\x7d\x36\x7f\x7e\xfa\x77\x3b\x3f\xc3\xf9\x02\xe8\xe2\xdf\x52\xe8\xd3\xe3\x9d\xf8\x07\xf2\x6e\x25\xc6\x0b\xfe\xa7\xf8\xf1\x82\xff\xe1\xf4\xf1\x82\x64\xfc\x78\x01\x18\x3b\x5e\xf0\x1f\xb2\xb8\xb1\x33\xd6\xb1\xe3\x05\xff\x7d\xe9\xe3\x05\xd0\xb1\xe3\x05\xd0\xb1\xe3\x05\x60\xec\x78\x01\x18\x3b\x5e\x00\xc6\x8e\x17\x80\xb1\xe3\x05\x60\xec\x78\x41\x32\x7e\xbc\x00\x8c\x1d\x2f\xc8\xbe\xf3\xe3\x05\x60\xec\x78\x01\xda\x64\xc7\x0b\xfe\x91\xf4\xf1\x02\xb4\xc9\x8e\x17\x40\xc7\x8e\x17\x40\xc7\x8e\x17\xfc\x4e\xfa\x78\x01\x74\xec\x78\x01\xfa\xc0\x8e\x17\x40\xc7\x8e\x17\xe4\xf1\xa2\xb1\x73\x72\x1e\xc9\xff\x65\x7e\x1e\xc9\x7f\x07\x1b\x0b\x88\xf1\xf3\x48\xc0\xd8\x79\x24\xff\x36\x36\x16\xb0\x8e\x9d\x47\xf2\xaf\x63\x63\x01\xeb\xd8\x79\x24\xd0\xb1\xf3\x48\xc0\xd8\x79\x24\x60\xec\x3c\x12\x30\x76\x1e\x09\x18\x3b\x8f\x04\x8c\x9d\x47\x92\x8c\x9f\x47\x02\xc6\xce\x23\xc9\xbe\xf3\xf3\x48\xc0\xd8\x79\x24\x68\x93\x9d\x47\xf2\xeb\x6c\x2c\xe0\x36\xd9\x79\x24\xd0\xb1\xf3\x48\xa0\x63\xe7\x91\xfc\xff\xce\xc6\x02\xd6\xb1\xf3\x48\xd0\x07\x76\x1e\x09\x74\xec\x3c\x92\x3c\x1e\x1d\x3b\xfb\x32\x13\xe9\xa0\xf6\x8e\x24\xe6\x68\x7d\xf1\x7b\x8f\xda\x5a\x1b\x62\xda\x5a\x1b\x66\x74\xad\x4d\xac\x2f\xf8\x97\x5b\xdc\x5a\x1b\xd6\xd1\xb5\x36\x31\x27\xec\x17\x2d\x6e\xad\x0d\xeb\xe8\x5a\x1b\xd6\xd1\xb5\x36\xcc\xe8\x5a\x1b\x66\x74\xad\x0d\x33\xba\xd6\x86\x19\x5d\x6b\xc3\x8c\xae\xb5\x21\xa6\xad\xb5\x61\x46\xd7\xda\x50\xdf\xb5\xb5\x36\xcc\xe8\x5a\x1b\x6e\x93\xae\xb5\x49\xdd\xc5\x16\xb7\xd6\x86\xdb\xa4\x6b\x6d\x58\x47\xd7\xda\xb0\x8e\xae\xb5\xc9\x73\x11\x35\xbf\xb5\xb5\x36\xac\xa3\x6b\x6d\xb8\x0f\x74\xad\x0d\xeb\xe8\x5a\x1b\x3a\x1e\x5d\x6b\x93\xfb\x54\x55\xee\x7f\x4f\x7d\x2e\x72\x83\x20\xbf\x7f\x2a\x9d\xc1\x3e\xd5\x9e\x8a\x05\xcc\xd8\x7d\xaa\x90\xfb\xff\x1d\xf5\xcc\xc9\x6b\xba\xaf\x45\xb1\x0c\xb1\x20\x72\x91\x20\x37\xbe\x17\x3d\x1b\xb3\x3d\x4d\x47\xf6\xa9\x0a\x85\xdc\x99\x18\xed\x53\x8d\xfb\x80\xdb\x7c\x57\xf4\x5c\x61\xd8\x0d\x06\xf6\x6a\xf5\x1c\xab\x68\xec\xfc\xe8\x39\x0d\xf7\x0a\x66\x33\xaa\xcd\xbe\xc6\x2c\xd5\xf7\x55\xca\xf8\xfc\x85\x79\xb1\x17\x3f\xbc\x02\x70\x3c\xed\x3b\x82\x7d\xaa\x3d\x15\x0b\xb8\xcd\x2f\x2a\x5f\xc0\xdf\x83\xcc\xe1\x7f\x58\x3d\x53\xab\x5a\x9b\x64\x9f\x6a\x42\x77\x9b\x62\x43\x4d\x57\x27\xec\x52\xc4\x2e\x4b\xbf\xcf\x60\x9f\x6a\x4f\xed\xcd\xc3\x7d\x38\x5b\x5d\xcf\x81\xa6\xdb\xa2\x8e\xd7\xa7\xc7\x83\x7d\xaa\x9d\xd3\xce\x44\x2b\xf4\x8c\xbe\x18\x45\x3c\xfe\xb1\x30\x16\xac\x71\xab\x79\xba\x3a\xe1\x65\x5b\xd6\x8b\xac\x9f\xb5\xb6\x5b\xbb\xad\x0b\x2c\x6b\xeb\xdc\xde\x3d\x33\x73\xe1\xff\x4d\xc9\xff\xdc\x3e\x35\xb7\x77\x6e\xef\x5c\xf8\x9f\xf6\xdc\xde\xf3\xec\x99\xb9\xbd\xd1\x7f\x77\xc6\x0a\xdd\xb1\xd2\xe6\x4a\xa6\x3b\x6a\x8c\xd5\x36\xfb\xdd\xcd\xc1\x58\x65\xe4\x64\xdc\xcd\x35\xbb\x64\x0f\x83\x5c\xc6\xcd\x58\xa7\x9c\xe8\xdf\xc6\xd7\x3c\xcf\x73\x37\xd7\x3c\x2f\x58\xb3\x0b\x9e\x37\x56\x70\x83\x62\xbf\xdf\x0f\x72\xfd\x7e\x5f\x7d\x47\x4e\xb6\x36\xbd\xeb\x2b\x8f\x86\xe7\x79\xfc\x69\x88\xd9\xfa\xe9\xea\x44\x23\xdb\x9c\xde\x75\x42\xcc\x08\x1c\x1f\xc0\xf9\xaf\x9e\xae\x4e\x14\xb2\x2d\x6b\x56\xf5\xc0\xb2\xc5\xf9\x4f\x89\x33\xdf\x2b\xce\x7e\x46\xf4\x60\xbf\x3a\xf7\xa9\xf3\xec\xa9\xb9\x29\xbb\x9c\x71\x7a\x99\xf6\xa8\x9d\x59\xe9\x8e\x56\x7a\xa3\x95\x6e\x66\x65\xe4\x76\xed\x95\xa0\x94\x69\xd9\x6b\xa7\xaa\x99\xd2\x68\x25\xb3\x9a\x29\x8d\x2f\xf7\xfb\xa3\xd5\xde\xa8\xd6\x0a\x3a\x76\xcb\xcb\xac\xf4\xbc\x8d\x8d\x8d\xcd\xa2\x3d\x19\x6c\xd8\x93\xe1\x79\x8c\x89\x35\xde\x52\xb6\x6d\xcd\x58\xe7\x5a\x73\x96\x65\xcf\x66\x27\xe6\x72\x13\xd9\xed\x2f\xb9\xd8\xde\xb6\xe7\x65\xd3\x5b\xe7\xb2\x13\xbb\x2d\x3b\x3c\xa1\x99\xed\x53\x5b\xe7\xa6\xe6\x32\x75\xaf\x5c\xdb\xb2\x5c\x29\x0f\xda\xfd\x82\xdf\xae\x57\x73\xa7\x9c\x4e\xaf\x66\x57\xc7\x4a\xdd\xd1\x4a\xb7\x1b\x1e\x3c\xdb\x2e\xb5\x5a\xa7\xfa\x1b\xcb\x79\x2f\x6f\x97\xc6\xfa\x7e\xc7\xb3\x0b\x41\x6b\x64\x39\xdd\xb1\x52\x30\x69\x37\xc2\x63\x4f\x58\x8d\xd3\xf5\x89\x41\xd6\xb3\x2e\xb5\x0e\x58\xd7\x58\xd7\x59\x37\x5a\x87\xac\xdb\xc2\x73\x98\x98\x9b\xc9\x4e\xc8\x2b\x31\x37\xf3\x8a\xcc\xcb\xf6\xed\x9f\x7d\xa1\x3d\xb7\xbd\xb0\xeb\x12\x7b\xfb\x8c\xf8\x4e\xe5\xff\xcd\xec\x99\x22\xff\x7b\xef\xdc\xd4\xc4\xee\x1d\xe3\xfb\xf6\xcf\x4d\xd8\x53\xdb\xa7\xce\xda\xb6\x75\x66\x6e\xef\xf8\xde\xb9\x99\xf0\xc2\x4d\xcc\x66\x27\xb6\xcd\x4e\xec\xda\x9d\x9d\xd8\xbd\x6f\xff\xae\xdd\xfb\xb7\xcd\xee\xcb\x6c\xb4\xca\x99\x4e\xa1\x68\x77\x46\xeb\x99\xf2\x68\xb9\xbe\x5e\x6b\x55\x72\xed\x82\x1b\x94\x9c\xd3\x96\xeb\x04\x96\xdd\x0e\x72\xf6\x30\xe8\xd8\x1b\x8e\x13\xe4\x6c\x27\xc8\xdb\xeb\x81\x6b\x0f\x9d\xd1\xb0\xd9\xb4\x7b\x99\x41\x21\x3f\x72\x7a\x19\xb7\x53\x59\xb5\xdb\x9b\xab\x41\x67\xac\x60\xfb\xad\x46\xb1\x5c\x2a\xd6\x8a\xa5\x7a\xa5\x52\xad\x94\xcb\x95\x4a\xb9\x9c\xf5\xea\xc5\x66\xa9\x14\x78\xfd\x51\xa9\x53\x6c\x94\xdd\x6a\xb5\xe6\xf4\x1a\xd5\x56\xad\xe9\xdb\xbd\x7e\xb3\xda\xaa\x34\xba\x43\xbb\x58\x70\xdc\x6e\xb1\x58\x7b\xce\xdd\xb2\x71\xaa\x56\x28\x6e\xd9\x68\x85\xff\x04\x8d\xa0\x60\xaf\x15\xca\xd5\x6a\xa9\xdc\xa8\x94\xea\x85\x5a\xb9\x5a\x2e\x55\x4b\xa5\xf2\xff\x77\x2d\xff\xdf\xbc\x96\xa7\x4f\x5b\x35\xf9\x6c\x99\xde\xf5\xc5\x5f\x13\x31\xfb\x75\x4b\xc6\x4a\xed\x74\x6b\x62\x90\x6d\x5b\xcf\xb3\x76\x86\xcf\x1b\x7b\x76\xc2\x1a\x9f\xd8\x61\x5b\xe3\xbb\xad\x31\x78\xea\x4c\xed\xd9\xb7\x3f\x0c\xa1\x19\x78\xee\x4c\xcd\x4d\x89\xab\x34\x36\xec\x15\xed\xa6\xbd\xde\x08\x6a\x41\x3d\x70\x83\x5c\x3d\xd3\x19\x8c\xad\x04\xf5\xcc\xca\xa8\xd4\x6f\x37\xfa\x8e\x63\xaf\xfc\x74\x72\xac\x38\x2a\x65\x56\x82\x96\x53\xf5\xaa\xcd\x6c\xbb\x5c\x0c\x56\x07\x5d\xdf\x6e\x06\xbd\x35\xd7\x2e\x06\x43\x2f\xfc\xff\xe2\xf2\x6a\x79\xb9\xeb\x79\xf6\xaa\x67\xe7\x82\xbc\xdb\xab\xf4\x3a\xe2\xbc\xbb\xa7\x2b\xf2\x59\xf9\xc9\x8f\x85\xcf\xd1\xcf\x8a\xfd\x0c\x5f\x90\xbf\xd7\x15\x3e\x2f\xbb\xd9\xf6\xf4\xae\x47\xc5\x8a\xd5\xf1\xa7\xe0\xf9\x54\x13\xbf\x35\xd1\x9a\xde\x75\x42\xec\xcd\xff\xac\xf8\x7d\xc4\xe3\x5f\xb3\x2c\xeb\xf9\x56\x55\x32\x6b\xda\x2a\x59\x3f\x6f\x95\xad\x57\x59\xaf\xb7\xde\x60\xdd\x64\xbd\xd9\xfa\x25\xab\x69\xdd\x6e\x59\xf6\xcc\xdc\x54\x6e\x6c\xf7\xf4\x56\x71\x13\x4c\x85\xcf\x2f\xf1\x10\xdb\x33\xb3\x5d\xdc\x4e\xdb\x66\x27\x76\x4f\x6d\x9f\x0a\xe9\xd6\xed\x53\x7b\xf6\xce\x6d\xdd\xb3\x77\xfb\x9e\x99\x3d\x7b\x6d\x71\x51\x76\xce\xe5\xa2\x07\xcd\xbe\xfd\xdb\x45\x1b\xdb\xc7\xe6\xa6\xe6\xb6\xaa\x8b\xb7\x77\xee\x67\xed\xf0\xf3\x9d\xe2\xef\x4f\x78\xcf\xd5\x36\xdc\x95\x7c\xbd\x51\xf5\x5a\x99\xe5\xee\xa8\x6e\x5b\xee\xfa\xfa\xda\x5a\xb7\xd5\xf0\x5d\xc7\x77\x36\x5a\x83\xf5\xd3\x96\xd7\x6c\x6e\x34\x36\x07\xb5\x82\x5b\xa8\x6c\xf1\x33\x4e\xdd\xa9\x54\xf3\xb5\x6a\x31\x37\xb9\xdc\xea\x38\xed\x7a\x7b\x32\xd3\x1c\x79\x6d\xbb\x11\x74\xa3\x3f\xc5\x7a\xab\x57\x1b\xd8\x0d\xd7\x69\x38\xed\x6c\xae\x3d\x72\x46\xeb\x41\xa3\x66\x37\xec\x5a\xbd\xe2\xd5\x9d\x31\xab\xd9\x0c\x7a\xae\xdb\x69\x07\xe5\x7c\xab\xdd\x59\x0b\xf2\xf6\xda\x4a\xcf\x59\xb6\x2d\x7b\xb9\x1d\x94\x56\x57\x57\xed\xa1\x37\x28\x0d\xba\xc5\x60\xbd\x93\xef\xe4\x8b\xce\x72\xa3\xde\x70\x82\xfe\xe6\x30\x53\x6a\x04\xcb\xcd\x60\xb9\x31\x6c\x36\xcb\xed\x72\xad\x5a\x6f\xd6\xe5\x7b\x65\xe3\x74\x75\xa2\x15\x7a\xc6\x13\x62\xaf\xed\xf1\xaf\xaa\x3d\x55\x95\x89\x8e\xf8\x4e\x0a\xe1\x77\xf2\x05\xb1\x82\x72\x7c\x09\x58\x6d\xa2\x9b\xed\x4c\xef\xea\x7f\x43\x7c\xba\x68\xc9\x67\x69\xf5\x74\x75\x62\x90\x6d\x89\xa7\xf8\x4e\xeb\x3c\xeb\xa5\xd6\xcf\x59\x07\x2c\x2b\xbc\x7a\x3b\x42\x63\x9c\xda\x33\xb5\x67\x26\x3b\x31\x33\x2b\xee\x4f\x71\x39\xa7\xb6\xdb\xe1\xc5\xde\xb3\x77\x7b\x78\xbb\xda\xd1\x7f\x83\x8b\x4e\x8f\x4f\xec\x18\x9b\xda\x3e\x95\x19\x0f\x1b\xb0\x5b\xcd\x66\xc3\xce\xfb\x41\x7b\xb9\x3b\xa8\x35\xf2\xf5\x42\xb3\x54\x6f\xd4\x1a\x8d\x86\x67\xaf\x8d\xad\x6c\x96\xba\x1b\x1b\x76\xc7\xce\x8d\x9a\xf2\xbf\x37\x3d\x7b\xe0\xd9\x1b\x81\x33\xb0\xf3\xf5\x60\x7d\xc5\x5b\x09\xfc\xa6\x5d\x5d\x09\x7a\x99\x7e\xa7\xda\x1d\xd8\x5d\xcf\xb6\x4e\x5b\xde\xc0\x73\x73\xad\x5a\xdd\xa9\xd7\x1b\x9d\x8e\x33\xb2\xb2\xc3\xcd\x75\x7b\x65\x30\x18\x8c\x36\x06\x83\x41\x50\x6c\xb5\xdc\x60\xd9\xed\xf5\xec\xfa\xc8\xcf\xd4\x82\xc1\x72\xc7\xb7\x4b\x96\xf5\x42\xf1\xbc\xf3\xb3\x35\x6b\xdc\x3a\xc3\x7a\x81\x35\x65\xcd\x58\x2f\xb2\xca\xd6\x2b\xad\x8a\x75\xb9\xf5\x36\xeb\xbd\xd6\x3d\xd6\xbd\x96\x15\xdd\x66\x53\x73\xfb\x45\xef\xf6\x84\xf7\xe6\xde\x71\xf9\xe9\xec\x84\x8c\x55\x71\xb3\xaa\x3f\x73\xe2\x6e\x1d\xdf\xbb\x7d\x66\x16\xfe\xc8\x46\x26\xa6\xb6\x4f\xc9\x27\x1d\x5c\xc0\x7d\xfb\x67\x33\x13\xe1\xff\xde\x39\x37\xb5\x6d\xcb\x79\xf6\xc4\x5c\x61\x47\xf8\x30\xdc\x39\x35\x17\x1d\x20\x6c\xc9\xce\x7b\xed\x86\xeb\xd9\xcb\x5b\x96\x4f\x95\xdd\xd5\x55\xbb\xb1\xda\x59\x7f\xae\xdc\x6d\x37\x5d\x6f\x4b\xaf\x53\xf2\x8a\x79\x2f\x5f\xf0\xd7\x06\x83\xc1\x60\x38\x6a\x16\xf2\x0d\xd7\x2e\x7a\xe1\x3f\x81\x5f\xaf\x38\xb9\x7c\xb3\xb3\x5c\x6c\xd4\x6b\xed\x76\xbd\x5d\xad\x95\x4b\xb5\x5a\xbb\xe7\x3b\x8d\x5c\x7e\xd3\xb7\xbb\x75\xbb\x64\xaf\x65\xaa\xd5\x91\x13\x74\x83\x41\xab\xdd\x69\xd8\x93\xa7\xad\xb1\xb5\x4a\xb1\x55\x2c\x07\xbd\x76\xb9\xd2\xaa\x66\x6b\xf5\x56\xab\x5d\x6f\x06\x4e\xab\x1b\xfe\xb3\x5e\x77\x3a\x9d\x7a\xa1\xd8\xae\xd7\x0b\xd5\x6a\xbb\xd5\x6a\xb7\xda\xad\x4c\xab\x98\xaf\x77\x97\x5b\xad\x8d\x76\x7b\xa3\xdd\xce\x14\xda\x9d\x4a\xa9\x58\x08\xea\x76\xa7\xd0\xaa\x35\x1b\xb5\x66\xbb\xd4\xa8\x16\x8b\xcd\x4e\x39\x58\xf3\x72\x85\x42\xbe\x35\xaa\xd5\x2a\xdd\x7a\xd3\x71\xbc\x6e\xa6\xb4\xd1\x6c\x97\xda\x8d\x42\xd1\x6d\x54\x9b\x16\xdc\xdb\x15\x79\x9f\x3e\x29\x76\xb2\x1e\x5f\x40\xef\x43\xbd\xf0\x39\x24\xdf\x87\x1e\xbd\x5f\xd5\x1c\x85\xcf\x9f\xf8\x74\xf8\x79\xf7\x0e\xf8\xbc\x19\x7d\xfe\x15\x51\x49\xfa\x89\x4f\xab\xcf\xcb\x13\xfd\x30\x46\x9e\xfc\x76\x18\x23\x8f\x8a\xea\x5c\xc7\x7d\x60\x15\x78\xd6\x89\xd9\x87\xe3\x27\x41\x53\x89\x9e\x81\x5f\x16\x3b\xf3\x43\x2a\x3e\x77\xc4\x31\xdc\xe9\x5d\x5f\x11\xbf\x62\x78\x7c\x5e\xc4\xd4\x16\xd8\xc7\xd6\xb1\xce\x12\xcf\xfb\x9f\xb3\x2c\x7b\xcf\x54\xce\xde\xbd\x63\x7f\x76\x7c\xf7\xfe\xa9\x1d\x3b\x67\xb7\x8c\x4f\xed\xdb\x6f\x8b\x57\xb5\xa9\xb3\xa2\x47\xd9\x5e\x7b\xdb\xd6\x89\xcc\xee\x9d\xe2\x3f\xc7\xac\xee\xc8\xad\xdb\xad\xd6\x30\x58\xaf\xd4\x6c\xd7\xce\xb7\x82\xb5\xa0\xbb\xd6\x1f\xeb\x07\x55\x2f\xb3\x5e\xad\x35\xba\x05\xbf\x52\x3c\xe5\xd5\x4a\x6e\xa9\xb6\x25\xd7\x2c\x7b\xa5\xc6\xb8\x33\xb2\x82\x7c\xb0\xdc\xf1\x87\xb5\xaa\x97\xdb\x52\xaa\xb6\xdb\xed\xca\xa6\x53\xaa\x8c\x55\x7e\xba\x96\xed\x9f\x2a\xd4\xeb\x79\x2f\x5f\x1a\xeb\xac\x06\x1b\x25\x3b\xb7\x92\x5b\x0f\xd6\x4b\x76\x61\x5d\xf6\xa7\x7c\xba\x3a\xd1\x0c\xaf\x8d\x27\x7e\xa5\xe4\x63\xaf\x50\xcf\xfa\xc4\xe7\x0f\xad\xb1\xcf\x9b\xac\x37\xab\xae\x71\x65\xa2\x1d\x5e\x97\xc7\xc5\x77\x72\xfc\x84\x65\xa9\xe7\x96\xb8\xf6\xfd\x0f\x89\xcf\x9f\x54\xdf\x6d\x45\xfa\xa6\xb7\x4d\xb4\xff\x23\xd5\x8e\x23\x3f\x97\xcf\xb3\x13\x1f\x13\xaa\xaf\x28\x8d\xf8\x4e\x3c\xf1\x6b\x16\xc7\xbf\x8c\xee\x13\xa9\x11\x3b\x04\x8f\x3f\xa1\xfa\x50\x99\xf0\xc5\x77\xf5\x19\x71\xae\x67\xa1\x63\x8b\xcf\x9f\xf8\x97\xf8\x73\x6b\x5c\x9c\xab\x97\x6d\x5b\x2f\xb0\xce\xb7\x2e\xb2\x5e\x66\x55\x63\xd7\x3a\x5b\x3c\xea\xc6\xa6\xe6\xa6\xe0\xfd\x45\x3d\x19\xc5\xf7\x1b\x3e\x2c\xc6\xa2\xe1\xc3\xcc\xd8\xb6\x99\xf8\x1b\xfe\xf9\xdd\x5b\xc3\x2f\x7d\xc2\xfb\xe9\xba\xeb\xba\x63\x56\x2f\x17\x14\x96\xab\xb5\x66\xad\xda\xa8\x3a\x8d\x5a\xa3\xde\xa8\x37\x56\x82\x61\xa5\xba\xe1\xae\xdb\xb5\xa0\x1f\xfe\xd9\xb2\xda\xeb\x36\x9d\x7a\x25\x57\xaf\x55\x7a\x7e\xb0\xec\x8d\xaf\x79\x23\x2f\xb0\x02\xa7\x6e\x7b\xf6\x6a\x66\xb9\xdb\x0d\x7a\xa3\x7c\xe0\xd6\x2a\xe5\x66\xb9\x52\x69\xd6\x5b\xa5\x46\xa3\xd5\xa8\x37\x1b\xdd\xc2\x96\x76\xb7\x1b\xac\x74\x83\x72\xd7\xde\x70\x83\xea\xaa\xef\x38\xf9\x4e\xc1\xf1\xd6\xec\xc1\xa9\xdc\x78\x5b\x8c\x93\xaa\x13\xb5\x70\x0c\xf5\x05\xb1\x5b\xc0\x9b\x4a\x5c\x97\x56\x14\x6f\xde\x56\xf4\x79\x5f\xc4\xc2\x07\xc5\xe7\xd3\xf0\xb9\x77\xba\x3a\xd1\x16\x71\xf5\x29\x71\xdd\xfb\xf0\xee\x23\xe3\x30\x1c\xaf\xec\xb0\x5e\x16\x8f\xb5\xa6\xc4\x1b\xd0\xd4\xf6\x29\x6b\x7c\xf7\x0e\x7b\x6a\x6e\x1c\xbf\x16\xda\xd1\xff\x98\xc9\x4e\xec\x9e\xee\x8f\x4d\x76\xc7\x26\x37\x37\xec\x5a\xc6\xaa\x05\x85\x60\xad\x1b\x2c\x07\xd5\x46\xc6\xb2\x6b\x9b\x1b\xe3\x05\x2f\x57\xe8\xb6\x5b\xcd\x56\xb5\xde\x1a\x6c\x56\xbd\x5c\xa1\xed\xb4\xea\x8d\x7a\xab\x35\x1c\xef\xad\xac\x78\x41\x21\xb0\x56\xba\xab\xb6\x37\xca\x67\x56\x83\xd6\x8a\xb7\x6e\xaf\xd8\x1b\xc5\x82\xd3\xec\x74\x3b\x5e\xab\xd3\x6c\xad\xd9\x85\x42\xcb\x71\xda\x9d\x56\x63\xb2\xdf\x69\xd9\x93\x10\xdb\xb5\x09\x3f\x7c\x0e\x3d\x21\xd6\x5e\x8f\x7f\x49\xfd\x8e\x62\x79\xc2\x09\xfb\xff\xb9\xd7\x89\xcf\x1f\x4f\xdc\x77\xed\xe9\x5d\x0f\x8b\xfb\xeb\xf8\x63\x56\x1c\x53\xfd\xf0\xfe\xfa\xe4\x1f\x24\x62\xaa\x2e\x7e\x13\x2e\x7c\x6e\x89\xd9\x9d\xe3\x5f\x14\xd7\xeb\x79\x56\x43\xe4\x7e\xb4\xac\x6d\xf0\xee\x24\x9d\xe9\xb5\x56\xcd\xba\xc1\xaa\x87\x4f\x12\x39\x52\x9d\x39\x6b\x62\xfb\xbe\xfd\xea\x7e\x1c\x9f\x1d\x9f\x39\x6b\xdb\x5c\x61\xbf\x7c\x4b\x2f\xec\xde\x75\x89\x3d\xbe\x7b\xa7\x78\xaf\x12\xef\x45\x89\x41\xac\x3d\xb5\x67\x26\xb4\xf6\xf0\x7d\x69\x1c\xfe\x8c\xd5\xdc\xb1\xdc\xe6\x70\xcc\x2d\xbb\xf9\xfc\x73\xfd\x5e\xdb\xcb\xd4\xc7\xf2\xb9\x51\xa9\x66\x57\xed\x62\xad\x94\x0f\x5f\xc7\x9d\xa0\x5e\xaa\x05\xbd\x9c\xdd\x74\x83\xf6\x16\xf7\x94\xe3\xda\xad\xa0\x93\xb1\x6c\x67\x53\xfd\x9b\x6d\x75\x7e\xda\xed\xb8\xa1\x4b\x87\x8f\xad\x60\xdd\xee\x86\xff\x9e\x6d\x55\x9c\xaa\x93\x6f\x96\xaa\x23\x3f\xa8\x04\x8d\x86\x5d\x0f\xdf\xdb\xfb\xcd\xe2\x64\x21\x37\x39\xd9\x28\x77\x4a\xf9\x42\xbd\x90\x6b\xe6\xab\x95\xa0\x17\x4c\xda\xe5\x6a\xb5\x1a\x6c\xd4\x6a\xb5\x60\x3d\x58\xed\x74\xec\x62\xb0\xda\x0b\xff\x11\xcf\x85\xe6\x84\x2b\xee\x35\x11\xb3\xc7\xbf\x20\xae\x5d\x56\xdc\x9b\xcd\x6c\xdb\xda\x63\xdd\x6c\x35\xac\xb7\x59\x4d\xeb\x56\x74\xc5\xc4\x7b\xe2\xdc\xcc\x8e\xfd\xb3\x5b\xc6\xcf\xda\xb6\x27\xbe\x56\x2f\xd9\xb5\x77\x7c\xf7\xbe\xfd\x7b\xc5\xd5\xdc\x17\x5e\x4e\x7b\x4e\xb8\xfa\xdc\xc4\x5c\x46\xbd\x68\xee\x9d\xcb\x8e\xef\xde\xb1\x7f\xdf\xde\xed\xbb\xe7\xf6\xce\xed\xdb\x3f\xb7\x77\xfb\xde\x57\xd0\xe9\x81\xb1\xae\x9b\x59\x1f\xe5\xc7\x8a\xc5\x4a\xab\x90\x1f\xb5\xec\xc2\x5a\xfe\xb4\x15\xac\x97\x96\xed\x42\xad\x9c\xef\x14\x7a\x41\xfb\xb4\x95\xab\x94\x83\x66\x61\x7d\x25\xc8\x0d\xdc\x46\x2d\xe3\x05\xde\x96\x81\xe3\x8c\xd6\x0a\x19\x37\xd7\x68\xf4\x57\x0a\xeb\xdd\x42\x61\xb4\xd2\x0b\xf2\x35\x3b\xdf\xad\x57\xaa\xc1\x20\x53\x2e\xe4\x46\x1b\x8e\xe3\xda\xed\xa0\x9d\xc9\xd9\xee\x66\x23\xfa\xb7\x6c\xbb\xea\xd4\x5a\xb5\x5a\x68\xb3\x85\x42\xab\x58\xc8\xe7\x72\x93\xb5\x8a\x53\x9a\xac\x56\x0a\xad\x5c\xbe\x35\xf2\x83\x7c\xd0\xa9\xaf\xda\x75\x7b\x32\xe3\x8d\x06\x7e\x6b\x50\x0f\x86\x6e\xae\x3d\x59\x72\xd6\x6b\x9d\x62\xb5\x34\x39\xd9\x2a\x96\x06\x2d\x71\xc5\xab\xd5\x6a\xf4\xcc\x97\xfe\x29\xe6\x12\xbf\x72\x13\x7a\x86\xf7\xb2\x8d\xe9\x5d\x27\xc4\x0e\x87\xe3\xbf\x97\xb8\xff\xc3\x78\xf1\xc5\xe7\x8f\x5a\xb1\x9f\xbb\xe1\xe7\x8f\x8b\xdd\x35\xc7\x7b\x28\x2e\xc4\x73\xfa\xc9\x3b\xc4\xe7\x8f\xa0\xf7\xd1\xf0\xb9\x1b\x3e\x73\xf7\x59\xaf\xb2\x2e\xb7\xaa\xd6\xeb\x2c\xcb\x9e\xdb\xbd\x35\x1c\x92\x86\xe3\x25\xf4\xc4\x1d\x03\xfb\xdc\xb3\x7b\xdb\x9e\x97\x5d\x22\x5e\x5a\xc3\xe1\xc4\xdc\xd8\xc4\xdc\xfe\x9d\x73\x33\x73\x63\x30\x9d\xf3\xb3\x76\x66\x6c\xf7\xb4\xbd\x67\x6a\xbb\x7c\x2b\xcb\x5a\x41\xb9\xe4\x76\xf2\x99\xc9\xbe\x5d\x08\xca\x95\x5a\xad\xdc\x69\x34\x1c\xb7\xb1\xd6\xad\x75\xca\xe5\xc2\xe4\x64\xbd\x9e\xef\xae\xd4\xed\x9c\x1f\x38\x99\xd2\x5a\xc9\x76\x2b\xcf\xd5\x33\xa5\xd1\x4a\x3d\xb3\x16\xac\x7a\xc1\x5a\xc5\xcb\xb5\x5b\x8e\xbd\xe6\xba\xb6\xd3\xac\x3a\xb5\xe6\x96\x5a\xcb\xf6\xcb\x55\x37\xa8\xb8\x9e\xdb\x6a\xd7\xfc\x56\xb7\xd9\xf7\x6d\x27\x28\x3b\x8d\x49\xaf\x90\x6f\xac\xf6\x3d\x77\xb0\x6c\x17\x5d\x7b\xe0\x79\x5d\x2f\x58\xf1\x4e\x75\xb7\x34\x7a\xb9\xa0\x1c\xac\x36\xec\x49\xdb\x1d\xd5\x33\x4e\xb3\xd5\xea\xb4\xc2\x7b\x39\xf2\x9f\xf0\x7d\xfc\xf5\x56\xdd\x7a\xb3\xf5\xb6\xff\xf2\x2a\xec\xd5\x2f\xc2\xf8\x6c\x66\x0c\x86\xd9\xf0\x32\x0a\xe3\xee\x7d\x5b\x67\x33\xe1\xdb\x28\xbc\xa5\xc2\x9b\x67\x26\x7c\x87\x1d\x06\xc5\x92\xd7\xc9\x67\xf2\xbe\x5d\x0a\x8a\x95\x5a\xbd\xec\x36\x9b\x2d\xaf\xb1\xe1\xd5\xc3\x6b\x53\xab\x17\xdd\x41\xdd\xb6\x7a\x41\x23\x53\x19\x96\xec\x6e\x75\xb3\xe8\xad\x6c\x78\xed\x42\xb1\xdd\xa8\xba\x93\xf9\x66\xb7\xd5\x2e\xb6\x1c\xa7\x3b\xe8\x78\x2d\xaf\x5e\x6d\xda\xbd\xf0\x06\x75\x5a\x95\x82\x9b\xaf\x04\x8e\x97\x6f\xba\x0d\xed\x72\x39\xbd\x66\x7f\x60\x3b\x41\x09\x2e\xd7\x4a\xcf\x73\x07\x03\xbb\x24\x2e\xd7\x64\x39\x28\x05\x1b\x85\x42\xad\x52\xe9\x0e\xc2\x37\xcc\x51\x3d\xd3\x2e\xe4\x3b\xed\x7e\xdb\xd9\xb0\x4b\xe5\x60\xb8\x5c\xa9\xf4\x83\xb2\xb8\x7c\x2b\x5e\xbf\xe4\xbb\x93\xc5\xd3\xd6\x4a\x75\x15\xe6\xe1\x27\xba\xea\x9d\x2f\x7b\xfc\xf3\xf0\xbc\xa8\xa2\x6b\xfc\x2a\xeb\x26\xab\x61\xbd\xe3\xff\xc9\x35\xde\x29\xc6\x4a\xf0\xf7\xc6\xe7\x60\x48\x20\x94\x33\xe1\xc3\x46\x0e\x71\xe7\xf6\x6e\x97\xef\xf7\xf0\x9f\xff\xf5\x55\xee\xae\xd6\xec\x7c\x5f\x5d\xe5\x53\xae\xeb\x3b\x76\xae\xed\xe6\x26\xfb\x6e\xd3\x0d\x9a\xf6\x5a\x6f\x38\x0c\x5f\xb1\xbd\x95\x7c\x30\x0c\x7a\x65\xaf\x13\xac\xdb\xf9\x6e\x66\x4d\x5c\xee\x91\x5b\x2d\xb6\x8b\x95\xff\xfa\x42\x0f\xba\x9d\xd5\x15\xb8\xd0\x85\xb5\xb6\xb3\x6a\x5b\xc5\x42\xde\xed\xb7\xfd\x15\xaf\xef\x6d\x34\x9c\x66\xdf\xa9\x56\x3a\xcd\xaa\x97\x2f\x64\x0a\x5e\x7f\x4d\x5c\x65\xc7\x1b\x94\x07\x9e\xb8\x8e\xb5\xd3\x25\x71\x1d\xcf\x86\x51\xe4\x1e\xeb\x17\xc5\xdb\xd2\x8c\x30\x7b\x39\x39\x19\x3d\x5a\xe5\x50\x5f\x3c\x2c\xf7\x08\x2b\xda\x27\x2e\xd1\xfe\xd0\x92\x66\xec\xd9\x6c\xe8\x63\x7b\x5e\x26\x9e\xcd\x99\xed\x2f\xd9\xb5\x77\x6a\xcf\xcc\xbe\x89\xfa\x73\x35\xbb\xee\xda\x0d\xd7\x5e\x7e\xae\x3e\x70\x9b\xb5\xcc\x6a\x77\x54\xb4\xeb\x41\xcf\x5e\x0f\x3f\x2d\x6e\xe6\xd7\xfa\xc5\xf0\x1a\x54\x1b\x9e\xdd\xcf\xf4\x1a\x1b\xc1\x6a\xb9\xd5\x2f\x14\x26\xbd\xc9\x72\x6b\x75\xa5\xdd\x1d\x8e\xaf\x79\xfd\x4e\xa7\xd3\x09\x72\x81\x15\x74\xea\x43\xbb\x6d\xe7\x32\xab\xdd\xee\xa8\xb6\x16\xfe\x33\x2a\x06\xab\xe5\x8a\xdb\xac\x7b\xf9\x4c\xbb\xeb\xda\x56\xbb\x55\x5f\xce\x17\x8a\xc5\x95\xd2\x72\xa7\x54\xad\x65\x9c\xb5\x5a\xf4\x9c\x1b\x84\xf7\xd2\xe7\xc4\xbb\xf0\xf1\xcf\xa9\xe7\x5c\x43\x3e\x2f\xbf\xf8\xcb\xe2\xf3\xcf\xa2\xf1\x86\x97\xcd\x4f\xef\x7a\x44\xec\x74\x39\xfe\xbb\x68\xec\x20\xdf\x2f\xc4\x6e\xf4\xe3\x9f\x81\xcf\x3b\x22\xa7\x32\x7c\xaf\xdd\x2b\x3e\xff\x1d\x71\xaf\x66\xac\xae\x98\x0f\x6e\x59\xcf\xb3\x76\x59\x96\x2d\x46\x0e\xdb\xe5\xc4\xc9\x6c\x76\x62\x6e\x6a\xcf\x54\x34\x91\xb4\x5d\xce\x80\x84\x6f\x4e\x13\xb5\xee\x73\x6e\x37\x1c\x4a\xac\x7a\xc5\x92\xdd\xec\x66\x2a\xa3\xc1\x98\x35\xb2\xba\x9b\x6b\x63\x85\xa0\x52\x6b\x76\x36\xc6\xfd\xa0\x6c\x97\x82\x15\x7b\x79\x30\x08\x56\x4a\x4e\x23\x34\xda\x6e\xb0\xe2\x05\x45\x7b\xd5\xb3\x4b\x9d\x66\xd3\x96\xfd\xa8\x4d\x38\xd9\xf2\xf4\xae\x8f\x89\x55\xdb\xe3\x5d\x34\x36\x10\xfd\xfe\xb2\x58\x31\x7b\xf4\xdd\xaa\x1f\x95\x89\x56\xb6\x3e\xbd\xeb\xc4\x77\xc2\xcf\x3f\xf1\x45\x74\x9d\xbc\x6c\x65\x7a\xd7\xa3\xa2\x86\x2c\x5c\xad\xdf\x86\xb1\x5c\x38\x9e\xa8\x4d\xef\xea\xcb\xb1\xdf\xa7\xd1\x5c\x93\x78\xd7\x7f\x52\x54\x5a\x7b\xf0\x3b\xca\x73\xe0\xf3\x70\xc4\x90\xcb\x1e\xff\x14\x7a\x47\x6d\x87\xc7\x86\xcf\x7f\x0b\xbc\xa5\x73\xba\x3e\xd1\xc8\x56\xd5\x3c\xc7\x5e\xeb\x15\xd6\x6b\xc2\x88\x0f\x2f\xd7\xb6\xd9\x1d\xfb\x67\xad\xf1\x1d\x3b\xa3\x87\xe5\x96\xf1\xa9\xed\x53\x5b\xe6\x60\xec\xae\xbd\x44\x8d\x6d\x99\x9d\xd8\xf1\xd2\xf0\x8e\xdd\xbd\xc3\x2e\x8c\xfb\x9b\xeb\x6e\xaf\x59\xb7\x73\xab\x9d\xa0\x11\x54\x32\x25\xbb\x54\xab\x36\xd7\xfa\x4e\xa9\x1c\x6c\x9c\xb6\xbc\xc0\x0f\xfc\xfc\xca\x5a\xbb\xb7\xec\x05\x95\xae\xbd\x1e\xe4\x33\x1d\x7b\x78\xaa\x13\xfd\xdb\xba\x9d\xdf\xa8\x06\x1b\xc1\xc6\xa8\xd3\x5a\x0b\x96\x9b\x76\x21\x5b\x1d\xd5\xda\xcd\x52\xb9\xd3\x6d\x04\xab\x9d\x7c\xa5\x54\x6e\xb6\x7b\x9d\x72\xa9\x98\x0f\xea\x76\x37\xef\x95\xeb\xb5\x6a\xab\x6d\x77\xc3\x7b\xba\xe1\xba\xee\x66\xb1\xd6\xf2\xdc\x9a\xd3\x70\x9b\x6e\x15\xae\x35\xcc\xd1\x7d\x4c\x8e\x4f\x3f\x89\xde\xd5\xdd\x6c\x69\x7a\xd7\x93\x72\x7c\xf6\x09\x34\x66\x76\xc4\x3b\xff\x6f\x8b\x95\x94\x4f\xa3\xeb\xd9\x14\xef\x02\x62\x27\xd7\x27\x3e\x8c\xfe\x7e\x3f\xbc\x87\x3f\xfd\x84\x78\x47\xd8\x85\xc6\x7f\x72\x3c\x97\x4b\x7c\x5e\x15\xef\x02\xe1\xbd\x2d\x7e\xb9\xd0\x3b\x8e\xde\x11\xc4\x79\x7a\xa2\x42\xd8\xf1\x8f\xab\x35\xfc\x0a\x7e\x6e\x7b\x2f\x80\xcf\xbb\xa2\x9d\xf0\xf3\x6b\xc4\xe7\x67\x8a\xef\xf7\x4c\x18\x13\xb6\xac\x33\xad\xad\x62\x7d\x24\x7e\x7f\xae\x5a\xaf\x15\xef\xcf\xe0\xa2\xd1\x7a\x8f\x9c\xb7\x0e\x5f\x14\x26\xe6\x66\xe6\xc4\x7c\xcf\xdc\xde\xed\x33\x67\x85\xaf\x7b\xb3\xe1\xf3\x7e\xd7\x25\x36\xcc\x2f\x8e\x83\x60\x27\x99\x67\xdc\x39\xb5\x7d\xef\xf6\x99\xed\x53\x5b\xf7\xec\x85\x77\x0b\x39\x7f\x33\x96\xb3\x87\x6e\x26\x37\x1a\xda\x2b\xa7\x36\xec\x5e\x90\x1b\xb5\x32\xe5\xd1\x72\x29\xd3\x1b\xd5\x33\x6b\x5b\xca\xa7\x96\xdd\xb1\xfc\x7a\xa1\x94\x73\xca\xad\x66\xa5\x51\xf4\xcb\xb5\xb2\xbf\xb9\x16\x2a\xc4\x9f\x95\xb1\xc1\x66\xc5\xcd\x74\x47\x8d\xe8\x4f\xd0\x73\xd7\x5d\x77\x7d\x7d\x4b\x7f\x6d\xb5\xbc\xba\x12\x0c\x9d\xde\xb0\xb1\x9a\x2d\x57\x2a\x9d\x6a\xab\x55\xf5\x3a\x1d\x2f\x1f\xd4\x9c\x95\x62\x31\x5f\x2c\x34\x8a\xa5\x4a\xb5\x53\x69\xe5\xcb\x05\xb7\xe3\xd6\x47\x2d\x7b\xa5\x16\x7e\x01\x56\x6d\x6d\xd4\x69\x38\x99\x4e\xd0\xda\x08\xd6\x4b\xb5\x76\xbd\xe4\xd4\x9a\x95\x4e\x51\x3e\x93\x2a\x72\x0c\xf3\x98\x18\x69\x7f\xec\x1d\x16\x3f\x27\xe3\xa1\x77\x3e\x31\xfe\xff\x94\x5c\xa3\x7a\x18\xdd\x17\xe2\x9d\xef\x31\x31\xc7\xf2\x98\xc8\xcf\x3f\xfe\x10\xdc\x03\x8e\xfc\xae\x9f\x10\xf7\xd8\xf1\x8f\xa1\xe7\xa1\x68\xeb\x73\xa2\x32\xd1\xf1\x07\xc5\x77\x7a\x06\xdc\x03\x65\x6b\xcc\x9a\xb0\x9e\x27\xbe\xd9\xdd\x62\x4e\x65\xbf\x8c\x5b\x6d\x68\xa3\x2c\x27\xfe\x7e\xc7\xf7\xce\xcd\xfc\xac\xbd\x65\x7c\xf7\x8e\x9d\x5b\xc6\x27\x76\xec\xb4\x0b\xe3\x2b\xcf\x95\xbc\x8c\x15\x58\x99\x6e\xc6\x3a\xd5\x88\xfe\xed\x39\xc7\x76\xbb\x99\x49\xd7\x1e\x04\x15\x7b\x63\x63\x68\xaf\x05\xce\x96\xf2\x68\x23\x5f\x0f\x56\x02\x57\x2c\x55\xd9\x9e\x9d\x6f\x04\xc3\xa0\x95\x2d\x8f\x4a\x76\xcf\xf3\xbc\xa0\x16\xfe\x47\xc9\x0d\xff\x19\xb8\xee\x60\x30\x18\x2c\xb7\xdc\x86\x57\xed\x34\x5a\x6e\xbb\x21\xe7\x8f\x6a\xf2\x7e\xfd\x8a\xf8\x35\xa7\x2f\x34\x12\x73\x12\x61\xbc\xfd\x4e\xf8\xf9\x67\x8e\xa1\xcf\xe5\xf3\x4e\xac\x5d\xfe\xee\x9f\x25\xde\xb1\xd5\x9a\xe0\x6f\x7f\x34\xf1\xfd\x84\xf1\xf3\xfc\xf0\xf3\x27\xbf\xae\x9e\xc1\xf5\x89\x5a\xd8\xce\x23\x22\x2b\xeb\xf8\x47\x61\x6e\x43\xce\xb7\x78\x56\xce\xaa\x58\x57\x5a\xaf\xb5\xae\x97\xeb\x77\xd1\xa3\x6f\x77\xf8\xca\x32\x31\x9b\x9d\xd8\xb7\x1f\xa6\x37\x26\xb6\xcd\xca\xe9\xcb\xe8\x55\x72\x77\x76\x62\x5b\x38\x80\xcf\x84\x17\x35\x1a\xb3\x87\xff\x3e\x6b\x45\xff\x79\xa1\x3d\x56\xec\xb6\x1d\xbb\x60\x97\xaa\xd5\xd6\x9a\xdb\xa9\x05\xc5\xd1\xb0\x38\x5c\x73\xeb\x95\xa6\x53\xee\x54\x4b\x8d\x82\x5b\xa8\x54\xf3\x8d\xaa\x5b\xa9\x34\x9d\x42\xb1\xdd\xaa\x75\xca\xfe\xf2\x86\xdd\xaf\x8f\xd6\x83\x65\x7f\xd4\xaa\xdb\x75\x3b\x5f\x58\x1d\x16\xdd\x31\xab\xb6\x12\x34\x6b\x76\xcf\xee\xd5\x03\x6f\xe4\xd4\x32\xfd\x4c\xb9\x1e\x94\x37\xbd\x5a\x66\x32\x53\xce\x7a\x25\xaf\x96\x2b\x94\xca\x55\xb7\x57\x6b\x94\xf2\xed\xc6\xb0\xe8\x97\xf3\x45\xa7\xd8\x71\x1b\x5e\xb9\x51\xa9\xd4\x9d\xd5\xa2\x5f\xcf\x15\x2b\xe5\x72\x77\x50\x6e\x55\xf2\x83\xba\xeb\xd9\xe5\x60\xbd\xdb\xae\x75\x9d\x5a\xbe\xdd\x0c\x56\x1a\xeb\xd5\x56\xad\xd8\x08\xfc\x7a\xcb\x69\x3a\x81\xeb\xb4\x6b\x2b\xb0\x36\x3f\xd1\x51\xf7\x73\xf6\xf8\x47\xc0\x4f\x9a\x62\x1e\xde\xb5\x9e\x6f\x4d\x5b\x79\xeb\x42\xe1\x28\x2f\x17\xb3\x7d\x68\x52\x4f\xbc\x53\xcb\x75\x88\x9f\xb5\xb3\xe3\x73\xb0\x24\x9a\x9d\x08\x87\xe7\x2f\xdb\x61\xcf\xed\x9d\x9b\x88\x1e\x26\x63\x03\xaf\xee\xd6\x2a\xf9\x5a\xbd\x16\xd4\xbd\xc1\x72\x7b\x6d\x4b\x7f\xd0\xee\x3a\x83\x72\x73\x23\x58\xce\xf8\xde\xe6\xa4\xd7\x6a\x57\xed\xca\x72\x3e\x53\x1d\x39\x63\x1b\x9b\x4e\x73\x6c\x63\x73\x32\xfc\x93\x75\x83\x4a\xb3\x56\xf0\x8a\x15\xbb\x56\x0f\x86\xdd\x96\xbf\xe2\xaf\x57\x57\x97\x57\x1c\xbf\x73\x6a\xad\x5a\x1d\xab\x14\x0b\x5e\xad\xb2\x31\x5a\x77\x0b\x41\xbb\x1d\x38\x6d\x14\xab\xe1\x3d\x28\xbc\xf5\xf8\x6f\xaa\x79\x88\xf0\xfd\xc4\x11\x51\x37\x65\xcd\x28\xc7\xbc\xc4\x7a\x8d\x58\x1f\x98\x9b\x0e\x7b\x24\x9e\x9d\xf2\x81\x17\x3e\x20\xc3\xde\x4d\x9d\x15\xbe\xbe\xed\x9d\x7d\xa1\x2d\x5e\xdf\xe6\xf6\xcf\x4d\x89\xbf\x15\xfe\xdf\x38\x7a\x58\xee\x9c\x0d\x6f\x9e\x2d\xeb\xf6\x6a\x61\xb5\x35\xa8\x06\xfd\x53\x7d\xf1\x7a\xe2\x76\x9a\xcb\x8d\xfe\xa6\x9b\xe9\x8f\x6a\x63\xce\x58\xc9\xaf\x36\x73\x39\x6f\xb2\xb6\xec\xd6\x83\xa2\x08\xda\xcd\x6a\xa6\x30\x5a\x13\x7f\xf2\xee\x86\xeb\x6e\x6c\x8c\x95\xbd\x5c\xe0\x36\xed\x5a\xd6\x09\x86\xdd\xa6\x37\x6c\x76\xda\xd5\xa1\xdf\xee\x55\xbc\xd2\xc8\x0d\x8a\xe5\x42\xa9\x5b\x5a\x73\x2a\xf5\x30\xb8\x6b\x55\xb7\xe3\x7a\xea\x29\xd8\xc8\x05\xce\x8a\xeb\xca\xf7\xd8\xd0\x87\xda\xd6\x56\xeb\x7c\x11\x19\x6f\xb4\x1a\x96\xb5\x35\x31\xc1\x27\x07\x4f\x3b\xa7\xa4\x45\x44\x7d\x9c\x39\x6b\x62\xf7\xbe\xb3\x6d\x5b\xbe\x87\x6d\x87\x55\x92\xa9\x8c\x58\xbf\x92\xae\x60\x87\x5f\xfb\x59\x99\x89\xd9\x9f\xb1\xe3\x86\xc6\xf7\xed\x9f\xdb\xb6\xda\x0f\x6f\xc1\xba\xeb\x75\x9c\x8e\xd7\x5b\x69\x2e\xbb\x5e\x2f\x5b\xaa\xe6\xf2\x6e\xae\xda\xe8\xd4\x82\x55\xdf\xe9\x6e\xe6\xed\xaa\x67\x57\xd7\xda\xb5\x4e\xb5\xe9\x35\x7a\x4e\xaf\xb9\x96\x69\xd7\x4a\xed\x62\xd5\xf6\x1b\x63\x8e\xdf\x6c\x16\xdb\x8d\xfa\xca\xb2\x3f\xac\xad\x75\xfb\x76\xd1\xab\x05\x95\x6a\xb6\x52\x6f\xb6\xdb\x85\x5e\xa7\xd9\x6c\xb7\x9a\xae\xd3\x6a\xb6\x1a\xb5\xce\x68\x58\x2c\xb9\xc5\x41\xb3\x5c\xb6\x07\xab\x1b\x6d\xa7\x65\x5b\xb6\xb5\xe9\xd9\x95\x60\xe0\xf5\x07\xb5\x5e\x77\xe4\x64\xdc\x60\xbd\xdb\xec\xda\x45\xbb\x5f\x6f\x56\x1a\xf5\x60\xcd\x75\x0a\x41\xbb\x59\x2b\x94\x8b\xdd\x5a\xaf\x5b\xed\x56\xda\x2b\xcd\xee\xda\x9a\x7c\x37\x0d\xdf\x71\xfd\x6c\xd9\xda\x61\x15\xe5\x2c\x29\x1a\x3a\x8d\x4f\x58\x63\xdb\xd5\x4b\xfe\xf6\xcc\xd8\xee\x73\xec\xf0\x4a\xcd\xcc\x4d\x54\x9e\x73\xc6\x07\xa3\x46\xa9\xb9\xd2\x73\x96\x97\x07\x76\xd9\x19\xb5\xbb\x6b\xcb\xbd\x52\xb0\x16\xb8\x15\x77\x63\xb2\xe7\x35\xaa\x76\x69\x4b\xf3\x94\x97\x2d\x7b\xa3\x15\xaf\xd7\xa9\xbb\x2d\xb7\xb6\xec\xba\x76\x35\x53\x19\x39\xe5\x8a\xdb\x6a\x74\x8b\x19\x7f\x34\x0c\x9c\xba\x6d\xd9\x1d\xbb\x30\x66\x05\x3d\x0f\x9e\x95\xdd\x78\xfe\xf2\xc9\x71\xf4\x0c\x15\x5e\x26\xe7\x87\x4f\x7c\x0f\xbd\xc7\x76\xc2\x67\xe5\x97\xe4\x7b\xba\x9b\xf8\xfb\x6a\x3e\xd9\xfb\x6f\xe8\x1d\x4a\xbe\xf7\xbe\x37\x7e\xef\xb5\xb2\x51\x3c\x81\x5b\xcd\x5a\x45\xab\x14\xcf\x7a\x8e\xcb\x37\x8c\xb9\x68\x5f\x44\xf8\xa4\x10\x8b\x98\xb3\xd9\x89\xec\x5c\x61\xd7\x5e\x7b\x4f\x46\x3c\x3a\xdb\x63\xa5\xfe\x58\xe1\xa7\x96\x5d\x10\xcb\x3f\x63\xdd\xcd\xc6\x78\xd1\x7b\xae\xe5\x8e\xad\x7a\x35\xb7\x5f\xcd\xb9\xb9\x6a\x29\x18\x9e\xb6\x5a\x41\xb1\x57\x0c\x56\x83\xe5\x86\x5d\xb0\xad\xf1\x75\xb1\xd4\x58\xef\x78\x41\x23\xe8\xae\xae\xd9\xcd\x60\x18\x74\x0b\x85\x8a\x5b\x5a\xae\x14\xab\x75\xdb\x0d\x36\x82\xf5\x8a\x57\x5c\x15\x73\xb3\x1d\x31\x67\x5b\xb6\x5e\x6c\x5d\x60\xbd\x32\x3c\x4b\x31\x33\x1b\x3f\xbb\xe4\x18\x43\x8e\x28\xec\xb9\x19\x14\x02\xdb\x77\x46\xff\x73\xe2\x85\xb6\xf8\xa0\x93\xdd\xd8\x5c\xcd\x2c\x3b\x4e\xb3\x53\xf4\xeb\xd5\xd1\x6a\x77\xb4\xda\xcd\x2c\x6f\xae\xd8\x65\xbb\x32\x59\x76\x9c\x4a\xb9\xe2\x34\x3a\xa5\x6e\x66\xc5\xae\x4c\x56\x9a\x4e\xa5\x5c\xce\x55\x8a\xe1\x27\xd9\xb2\xb7\x76\xaa\xd6\x68\xe4\xbd\x7c\x6d\x6c\x78\xaa\xb5\xa5\x73\xaa\x30\xde\x5a\x1b\x0d\xda\xb9\x41\xbf\xdd\x76\xbb\x2d\xa7\xb7\xe6\xb6\xf3\x83\x7e\xbb\xd3\x71\x8a\xb5\x92\xd3\x5f\xb3\xa2\x31\x89\x9b\x75\xa6\x77\x79\xcf\x4b\xbc\x67\x36\x94\x7f\x5e\x18\xbe\x7f\x3c\x29\xea\x27\x1c\xff\xb0\xfa\x3e\xc5\xf3\xee\x4b\xcf\x89\x4f\x7f\x03\xe6\xa9\x57\xe5\x3b\x25\x8c\x60\x2d\x7b\x6a\x4e\x0c\x08\xc0\xe7\xe6\xa6\x76\xc4\x23\x79\x31\x82\x15\xcf\xeb\x6c\x7f\xe4\xd4\xbb\xf6\xe4\xaa\xb3\xb6\xbe\x6c\x17\xeb\xa3\xf0\x0d\xbe\x65\x97\x86\xa5\xa0\x1b\x94\x2b\xe5\x4a\xa6\xd1\x1d\x75\xb7\x14\x4e\xad\x85\x7f\xc6\xdd\x4d\xbf\xdf\x71\xfa\xed\x6e\xa3\x5d\xed\x2d\x67\x2a\xa3\x95\x6a\xd5\x6d\xd7\xbb\x93\xb9\x71\x6f\x7d\x3d\xe8\x0f\x46\x6b\xcb\x51\xbf\xc4\x7b\x98\x27\x7e\x21\xfb\xf8\x87\xd0\x3a\x94\x58\xa7\x3f\xf1\x49\xf1\xf9\xaf\xc3\xb3\x1a\xee\x5d\xeb\x85\xe2\xe9\x7c\x85\x75\x95\xd8\xc9\x71\xc8\x7a\x93\xf5\x16\xeb\xed\x6a\xdd\x22\x8c\xbb\xf0\xe4\x27\xc8\x84\xe8\xce\x59\x39\xe6\x86\xe9\xd0\x5d\x97\xd8\xa1\x35\xa9\xa9\xe5\x31\xb4\xd6\x3b\x0e\xff\x3d\x3b\x23\x5e\xb2\xf6\xce\xee\xd9\xbb\x7d\x1c\xfe\x4c\xb4\x9f\xcb\xf5\xdd\x46\x2d\xb3\xe6\x0d\xdc\x8c\x3f\xaa\x8e\x15\xf3\xe5\x66\x3e\x7c\xef\xb5\x26\x47\x1b\x1d\x77\x58\x99\x6c\xe5\x9c\x60\x25\x58\xeb\x0c\x73\xb6\x15\x2c\x7b\x1d\xd7\xf6\xbb\x63\xbd\xcd\xba\xbb\xb1\x61\xb7\xec\xfc\xc8\x91\xff\xbd\xde\x7c\x6e\xe0\xb8\x83\x81\x5d\x59\x5e\xb6\xab\x83\x41\x76\xb2\x33\x6a\x8d\x86\x41\x23\x8c\xf1\x96\x9d\xcb\xac\xb5\x5a\xbd\x62\xb3\xd2\xac\x54\x2b\x85\x62\xb5\xd8\x28\x4e\xe6\x72\x85\x4a\xb1\x51\x29\x97\x0a\xf9\x46\xbe\x16\x4c\x06\x8d\x60\x50\xb3\x2b\x76\x2b\x53\x0e\x2a\x41\xc5\xce\x55\xab\xd5\x61\xb5\x5a\x5d\xdf\x68\xb5\x36\x36\x3a\xe1\x3f\xf2\x7b\xaf\xc8\xb1\x8a\xf5\x3c\xeb\x7c\xb1\xc6\x23\x37\x61\x4c\x84\xc3\xe7\xf3\x6c\x39\xac\x3e\xd7\x46\x3b\x9b\xf6\x6d\x0d\x9f\x61\xd3\x53\x7b\xb7\x87\x7f\x35\x34\xc1\xcc\x58\x76\x22\x7c\xc0\x65\xc5\xed\xb1\x63\xa7\x5c\xe5\xdd\xe2\x78\xf9\x62\xa6\x3f\xca\x55\x8b\xb5\xce\xea\x66\xcd\x2e\x7b\x76\x31\x68\xd9\x8d\x4a\xa9\x55\xad\x17\x1a\xf5\x62\xbe\xb0\x5a\x58\xef\x6c\xac\x64\xfd\x66\xb7\x5b\xdf\x70\x56\x57\x4a\xb5\x9a\xd7\x2e\xae\x05\xab\x95\x52\x59\x2c\xf9\x79\x7e\xbe\xe8\x66\x5b\xa5\x46\xcd\x73\x6b\x8d\xa6\x9d\x13\x0f\xe9\x95\xe2\x28\xb7\xe2\xe5\x7a\xb9\x56\xa6\x3b\xea\x07\x6d\xc7\xee\x67\x9c\x95\xa0\xe5\xb8\xb5\xd3\xd6\x86\xbb\x62\xaf\xd8\xdd\xfc\xe4\xe6\xa0\x58\xea\x34\xaa\xde\x64\x6e\x6c\xad\xda\x6e\x57\x4b\xcb\x6e\x4d\xdd\xff\x6a\x1d\xf5\xf8\x03\x68\x3e\xd6\x0d\xc7\xe5\x72\x3e\xd6\xfb\xa4\xda\x3b\x1a\x8e\xfd\xaa\xd3\xbb\xbe\xf8\x51\xf1\xf7\x7f\x0d\x3d\x2f\xbd\x6c\x63\x7a\xd7\x23\x7f\x21\x3e\x17\xeb\xb1\xd6\xf3\xe1\xdd\xb2\x21\xde\xd7\xcf\x84\x5d\x6a\xd1\x28\xec\x66\xeb\x16\xf9\x94\x11\x23\xae\xe8\xd9\x02\x7f\xc6\xf7\xcc\x6c\xdf\xb9\x67\x66\xfb\x78\x72\xde\x28\xa3\x16\xdc\xf0\xb4\xd1\xf8\x1e\x31\x8f\x3f\x01\x37\xae\xbc\x75\x5f\xb2\x6b\xef\xce\x19\xe9\x34\xfb\xf6\x88\xf9\x24\x5f\x2c\x69\x38\x63\xc5\xcd\xd5\x76\x37\x68\x7a\xd9\xaa\x17\xd4\xdc\x51\xbf\xd3\x19\x73\x3a\x1d\x7b\xed\xb9\xa2\x5d\x73\xed\xaa\x6b\xaf\x3e\xd7\xcc\xb7\xda\xed\xcc\x6a\x77\x54\x10\x0b\x6f\x6b\xe1\xa7\xe5\xa0\xe0\xd9\xc5\x41\x3e\x58\x5b\xab\xd5\x56\xea\x93\xff\x7f\xf2\xde\x27\x48\x72\x25\xbd\x0f\xcb\x2f\x51\xa8\xc2\x5b\x72\xf7\xa1\xba\xa7\xa7\xf1\x48\xbe\x5d\xd4\xd4\x74\x37\x28\x8b\x5c\x68\x6a\xba\x1b\x4b\x6a\x77\x61\x51\xa4\x40\xae\x2c\x42\xa4\x49\x42\xa2\x56\x84\x24\xcb\x02\xfd\x17\x96\x6c\x0b\xb6\xfe\x18\xfe\x3b\x79\x73\x5e\x6c\xa6\x29\xdb\x81\x90\x82\x24\x68\x93\x22\x76\xdf\x6e\x04\x7c\xc3\xc9\x01\x3b\xc2\x11\x88\xb0\x1d\x46\x84\x7c\x40\xd8\x17\x1c\x2c\x19\xbe\xd8\xf5\x66\x0a\x59\x8e\x4c\x54\x75\x57\xcf\xbe\x95\x0f\x3e\xaa\x66\x80\x42\x67\x01\x89\xcc\xc4\x97\xdf\xf7\xfb\xfe\x25\x74\x8d\xe9\x29\x2f\xea\x78\x1c\xfa\xc2\x16\xac\xd5\xb3\x2d\x06\x74\x1e\xa6\x69\xea\x73\x02\x88\xf7\x40\x79\x02\xfa\x1e\x41\x52\x54\x55\x15\xa5\x91\xef\xfb\x3e\x2f\x78\xc7\xbb\x10\x0c\x88\x81\xfa\x3e\x77\x43\xf1\xd9\x12\xdb\x49\x5d\xd3\x31\x0c\xdd\xd4\x03\x3b\xf3\x5d\x9f\x31\xd3\x4a\x7d\x87\x69\x90\x7a\xe9\x83\xbd\x5d\xf2\xab\x42\x46\x45\xbe\x21\x4f\x74\x04\xe7\xec\xfa\xf3\xf2\x2d\xf2\x6f\xde\x9c\xe8\xd8\xd9\xdc\x3f\xbb\xfe\x03\xb9\xa2\xf8\x9b\xff\xe8\x44\x27\x9f\xfc\xe7\xf2\x6d\xab\x6f\xfe\xc3\xef\xf1\x97\xca\xb5\xaa\x7e\x63\x7c\x28\x0f\x26\xdf\xf6\x77\xa5\x4e\xf1\xe6\x3f\x78\xe0\xad\x07\x9b\xcb\x27\xff\x9d\x2c\xff\xf7\x1f\xce\x37\x17\xd5\x3c\x38\xbb\xfe\xbd\x4f\x04\xcf\x3d\x58\x5e\xfe\xbd\x07\x5a\x99\xf4\x1f\x99\xf9\xf8\xe6\xdf\x7d\xa8\x4b\x5c\x13\x9e\x5d\xff\x5e\x2f\xcb\xd3\x07\xbd\xff\x20\x8b\x7f\xef\x7f\x12\xe5\xbf\xf7\x3f\xa2\x63\xdc\x9f\xf7\xc0\xa3\x6f\x90\x8d\x7c\xf4\xcb\xe8\xcf\x9d\xea\xf3\x4b\x89\x4a\x0f\xd1\x27\x77\xe7\x52\x70\x9d\x6f\x96\xeb\xcb\x49\x31\x5f\x4e\x71\x1b\x4b\x38\x31\x8a\xdf\xcc\x4f\x22\x34\x0e\x36\xf1\xf3\x13\x6b\xb8\x12\x40\xcd\xa0\xe6\x0e\x50\xde\xd1\x36\x68\x73\x96\xf1\x2e\xda\xe6\x5b\x48\xb9\xd3\x0e\x43\xe2\x59\xb1\xe5\x40\xec\x9a\xa9\xeb\x65\xef\xda\xac\xd9\xe6\xa9\x61\xa5\xa1\x4b\x4c\xd7\xcd\x06\x69\x09\x2f\x09\x4d\x88\xef\x85\x95\x63\xa6\xa6\x34\x81\x87\x34\x50\xab\xb2\xa4\xf9\x18\xf2\x8e\xe4\x19\x78\x63\x8d\x19\x27\x6d\x52\x82\x85\xb3\x7c\xf4\x20\xb5\x93\xd4\x4d\xe3\x84\x6f\xa3\xd0\xcc\x13\x48\x21\x76\xb8\xc3\x07\xd3\x76\xa5\x19\x3c\x34\xf4\x31\xc0\x89\x4d\xd2\x9c\x9c\x58\xc1\x47\x3d\xcd\x2c\x96\x1e\xed\xdf\x48\x93\xf2\xb0\x98\xa7\xe8\x47\xd0\xdd\xc1\x16\xf2\xa7\xd1\xaf\xa2\x5f\x17\xdc\x0e\x3f\xa8\x74\xaf\x8f\xe0\xf6\x18\xa7\x22\xfa\x7f\x7f\xb0\x85\x9d\xfe\x74\x79\x07\x02\xbb\x1c\x3c\x09\xcb\x35\x6c\x96\xeb\xa5\xd8\xee\xee\x6f\xd7\x57\x1b\x39\x99\x37\xcb\x0d\xc8\xd0\xa1\xe5\x33\xbc\xb8\x79\x79\xbf\x9a\x6d\xd3\xaa\x4d\x23\xdd\x88\x3d\x23\xd5\xab\xce\x4a\xe2\x90\xb2\x88\x84\x91\xeb\xfa\x38\xa4\x79\x59\xdb\x71\x60\xa6\x9a\x5e\x34\x56\x14\x04\x84\x46\x24\x88\x13\xf7\xd3\x0c\xf7\x29\xab\x7b\xc3\xb1\x63\xd0\xea\xba\xae\xe3\xa0\x56\x49\xca\x1b\x4a\x8b\x5d\x44\x72\xda\x74\x1e\x58\x36\xef\xd4\xd6\xe6\x69\x63\x98\xae\x63\x64\xb9\xe5\xd8\xae\x99\xc4\x99\xef\x55\xbd\x53\x51\xd3\x22\xb1\xcd\x8b\xc2\x8c\xe5\x6f\x8e\x50\x10\xc9\xe1\x37\x37\x06\x44\x3f\x2d\x20\x71\xad\x4c\xd3\x67\x84\x37\x60\x8f\x26\x98\xa3\x6f\x18\x8d\xcb\x63\x1e\x2b\x01\x2f\x41\xe7\x3d\xf8\xbc\xda\xee\x91\x45\xed\x66\xa2\xc7\x64\xf2\x79\xa3\x2f\xa2\x9f\x44\xbf\x82\x7e\x15\xfd\x1a\xfa\x4b\xe8\xaf\x3c\xa2\xbd\x67\x0b\x89\x83\xe5\xf0\x4d\xb2\x56\xfa\x0d\xaf\xde\xfb\xf9\xe5\x01\x52\xdd\xae\xee\x64\xbc\xf1\x93\x58\xe4\x8b\xf5\xed\xf7\x8d\x45\xae\xc1\x21\xa0\xf3\x41\x03\x87\x37\x49\x18\x24\x49\x64\x04\x89\x5f\x44\x7b\x04\x81\xae\xf1\x5a\x09\xc0\x24\x82\x9d\x69\x90\xf3\x3c\xde\x7a\xbc\x23\x6e\xed\xc7\x5e\x0b\x86\xce\xfb\x5d\x8e\x3b\x8a\x87\x51\xc7\xe9\x98\x2a\xde\xae\xa4\xbb\x56\xb1\x46\x82\x93\xd1\x04\x04\x1d\x37\x71\x0c\xfd\xbb\xfc\x78\x34\x47\x49\x92\xd8\x76\xe2\x78\x71\xe8\x05\xba\x6d\x26\x8e\x2f\xfe\x9e\x4a\x7d\x8b\xb8\x59\xea\x27\xb6\x97\xd8\x36\xd7\xa2\x28\xf1\xc7\x21\x20\x94\x92\x00\xeb\x3e\x6f\xc3\x30\xe4\x5d\x10\x04\x0f\x3e\x44\xc1\x73\x64\xd6\xc0\x9b\x7f\x47\xce\x6f\xed\x10\x9b\x75\x1a\x9b\xfd\x47\xd0\x3d\xfa\xd9\xa7\x33\xfc\xfd\x51\xf9\x1e\x0b\x90\x1c\xf1\x69\xc6\x2b\xdf\x13\x62\x85\x53\x6c\x51\x6c\x8d\x2d\xb4\xdc\xc2\xce\x58\xd3\xb1\xc1\x36\xb7\xa0\x1d\xdb\x5e\x48\x57\x68\xc0\xdd\x0d\xc7\xa3\xb7\x19\x4b\x63\x42\x9d\x2c\x8d\x09\xd3\xbe\x5f\xe0\x94\x3a\x10\x42\xd3\xd1\xa3\xb4\x2c\x29\xc5\x65\xca\x23\x42\x88\xdc\x29\xba\x1f\x93\x34\xd8\xfa\x31\x25\x01\xef\x9e\x04\x3f\x3d\xc5\xa3\xdf\xfa\x0b\x72\x2c\xfe\xf6\x09\x0f\xb4\xa5\x8d\xf3\x1f\xc9\xf2\xbf\x75\x88\x2d\x0a\xa6\xf2\x83\xcd\xe1\x8f\xbe\x6f\x6d\x38\x72\x2e\xf5\xe6\xa5\xb2\xba\xbb\x9f\x09\x65\xe2\xfe\x72\xfe\xa1\xc4\x35\x9f\x83\x07\x10\xb3\x9a\xc2\xf3\x94\x8c\x05\x24\xf4\x8d\x30\xf2\x70\x52\x44\x4c\x28\xde\x94\xf1\x21\x02\xad\xc0\x91\xa1\xf1\x8c\x53\x1f\x5b\x38\x1a\xa2\xb2\xe9\x03\xcd\x50\x2c\x2d\xa1\x71\x67\x0c\xb1\x6d\x6b\x63\xc8\xc6\xc2\x87\x81\x8e\xf5\x3c\xe1\x76\x14\x18\xcc\xf4\x20\xa9\xba\xa0\xad\x6d\x7f\x8f\x72\x52\xec\x3a\x3f\x4c\x2c\x12\x0c\x55\xc2\xa2\x50\x0f\x03\x6e\xee\x91\x99\x59\x14\x4c\xee\x52\x16\x83\xf7\x90\xa3\xe6\x9d\x5d\xff\x9d\xff\x4c\xea\x64\xff\xe0\x81\x1e\xa4\x5d\x18\x7d\x1e\xad\xa5\xfd\x61\x83\xbe\x82\xbe\x8e\x7e\xfa\x69\x9f\xef\x6e\x61\xb2\xdf\x3e\xc3\xb3\x89\x4b\x4d\xa1\x8b\x20\x34\xd0\xd5\xa3\xcb\x77\xb2\x52\x4c\x86\x98\x69\x3f\xa7\x59\x40\x92\xc8\x8c\x13\xdb\x7a\x6b\x29\x19\xf7\x7c\xa8\x5a\x9e\x77\x6e\xc3\xc2\xd8\xf3\x42\xd0\x53\x5e\x01\x4a\x93\xd4\xe5\x04\x0f\x59\x06\x15\x8b\xf2\x90\xbe\xf3\x68\x9a\x12\xa6\xf4\x89\x93\x3b\x31\x1f\x22\x27\xb7\xa3\x79\xf2\xae\x4c\x42\x2d\xd7\x2d\x47\x69\x69\x41\x5d\x4e\xb6\x0e\xb5\xa3\x34\x75\x9d\xa4\x03\x93\xc7\x09\x25\x0d\xa4\xbb\x9c\x67\x65\xef\xf5\xa5\xeb\x6f\x69\x92\x97\x45\xeb\xb4\xa5\x91\xd7\x4e\x93\x4f\xb6\x39\x67\xc1\xe6\x11\xfa\x41\x64\xca\x19\xe0\xbf\xff\x84\xa7\xce\x0a\xf9\x76\x7f\xe0\xcb\x87\xae\xce\x65\x5f\x0f\x33\xe5\x51\xfd\x7e\x09\xf3\xc5\xc5\x04\x4f\xef\x6f\xa5\xdf\x72\x35\x4f\x59\x40\x03\xcf\x0c\x43\xff\xad\xa3\x64\xdc\x74\xa1\x2a\xc6\xdc\xad\x99\x1f\xba\x5e\x38\x24\xbc\x05\x2d\x8a\x88\xcb\x89\xae\x20\xc6\xde\x55\x8a\x91\x29\xf6\xae\x0f\x93\x34\x60\x71\x5a\x81\xe9\x8c\x84\x6f\xf3\xaa\x66\xd6\x96\x97\x6e\x48\xb2\x10\xfa\x61\x0c\xe7\xd1\x6e\x98\xc8\x00\xd7\x24\x4d\xb9\x47\x98\xe9\x05\x81\xeb\x24\x45\xc7\xdb\x20\x0a\xa8\x01\xfe\x58\x71\x5a\x14\x94\x84\x41\xe8\xc7\x5e\x60\xb3\x00\x9a\xd8\x2b\x6d\x87\x84\x3e\xd3\x33\xdb\x22\x31\xf9\x27\xd8\x06\x35\x61\x9c\x63\x2c\xbe\xd0\xe1\xa4\x06\x77\x12\x63\x2f\x9f\xe2\xe5\x7c\x71\xb1\xba\x7d\x38\x92\xff\x36\x17\xeb\x8b\xb5\x78\xe6\x37\x07\x50\x7d\x94\x2c\xb7\x02\x47\x1f\xfd\xaf\xe7\xb7\xab\x8f\xf1\x6a\x0a\x69\xbd\x98\xbe\x85\xf2\x06\x39\x1f\x40\xe7\x04\x92\x38\x76\xc0\x1a\x5c\x3f\x00\x3d\xb0\xc1\xec\x5d\xca\xa4\x27\xc3\x2f\xcb\xa1\x00\xcd\xe7\x43\xc9\xf8\xc0\xb2\x2e\xdc\x96\x5b\xb0\xb8\x67\x10\x1a\x7a\x8a\x96\xb9\xa2\x06\x56\x8e\x99\xd8\xcf\x75\x3a\x26\x69\x90\xf8\x34\x31\xf4\xc4\xf6\x63\xd3\xc8\x3c\x3d\xb5\xc3\xc4\xb1\x23\xea\x37\xb4\xc9\xfc\x2c\xae\x39\x81\x86\xdb\xe0\xe5\x51\x1a\x15\x49\xc0\x29\x6f\x82\x2d\x10\xd0\x70\x1f\x45\xa3\xe3\xfb\x49\x10\x04\x41\x2f\x76\x8f\xfe\x83\xf4\xc1\x7f\xf0\x37\x9f\xc4\xa5\x90\xb3\xeb\xef\xfe\x0d\x81\x3f\xff\xbe\x5c\x9d\xfe\xcd\xdf\x38\x89\x65\x23\x67\xd7\xff\xe5\x84\x3f\xff\xed\x93\x6b\xa4\x9f\xe2\x5b\x32\xc3\xff\xcd\xbf\xf5\x7e\x4c\xe0\x21\xc6\xed\xd9\x89\x5f\x43\x62\xdf\x62\x8a\xd9\x4a\x0e\xe5\xa5\x8c\xf7\x74\xce\xae\x75\xb9\xda\xdf\x9b\xbf\x2e\xf9\xd7\xe7\x24\x0f\xa7\x73\x2a\xa9\x57\x20\xd6\x1f\x93\xf6\x61\x41\xbd\xbf\x80\x1e\x72\x63\xa4\x4a\x3e\x71\xa5\xcd\x13\x3d\xfc\xf6\xea\x34\x1c\xf8\x31\x64\xeb\xd1\x77\x2e\xe3\xc0\x8e\x9c\xe1\xab\xb0\x5a\xc4\xd9\xdb\x30\x53\xcc\x8c\x92\x38\x4c\x08\xdf\x66\x61\xbe\xf5\xf4\xcc\x48\x78\xc6\xdb\x74\x86\x28\x8d\x93\xfc\x5d\x11\x27\x79\x58\xa8\x35\xdb\xf6\x34\x93\x11\x5a\x05\x58\x0c\xdc\xb7\xee\xbc\x19\xed\x80\x05\xbe\x11\x86\xc1\x8e\xcd\x0d\x3e\x10\x02\x7a\x92\x30\xd7\x4f\x42\xd7\x2a\x4c\xc3\x0e\x2c\xe6\xbb\x41\x1b\xb3\x98\x51\xc7\xcf\xa3\x38\xe6\x03\xaf\x09\x01\x87\xd7\x85\xf8\xf0\x84\x74\x49\xa8\xe7\x86\x5f\x1f\xf5\x11\xf6\x10\xf3\x79\xfd\x3b\xf2\xbd\x1a\x6f\xfe\xcd\x07\xbd\x60\xf2\x5b\x68\xb2\xf4\xdf\x78\x32\xce\xe2\x1a\xf9\x7e\x3e\xb6\x38\xd8\xd6\xe8\x3e\x5a\xc4\xf3\x44\xfa\x80\x84\x34\xf8\x49\xf4\x4b\x32\xbe\x4b\xb2\xba\x67\x0f\xe6\xa9\x97\xb7\x57\x87\xb2\xf9\x69\xd9\xc4\xff\x0f\xa3\x79\xcc\x4b\x3a\xfa\x89\x24\x06\x5e\x3d\xce\x31\x6c\xb2\x34\x0c\x59\xa5\x97\x24\xa4\x2c\x66\x11\x78\x4a\x20\x8a\x68\xa5\x69\x25\x09\x19\x8b\xb2\x10\xdc\x77\x55\x6a\x44\x69\xa8\x24\x44\x7c\xe1\xad\x18\xff\x5a\x0d\x46\x82\xc3\x31\x03\xc7\xb2\x13\xdf\x03\xfb\xd3\x08\xf7\x63\x85\xdd\xb1\x98\x27\xb5\xe3\xc7\x91\xa7\x6b\x61\x90\x46\x7e\xe2\xa7\xac\x6d\xbe\xb7\x28\xb4\x72\xe2\xc7\x4c\xee\xb9\xc5\xf3\xa6\x81\x60\x8f\x68\x49\x1a\xc7\xf6\xfd\x88\xd2\x86\x94\x4f\xfc\x3e\x53\x1e\xc0\xbf\xfe\x84\xae\x45\xb9\x5c\x59\xe9\xcd\x5f\x3b\xd1\xd9\x4f\xcb\xff\xea\xc9\x78\xb3\x93\x98\xae\x7f\xed\xa1\x9e\x78\xb2\xaf\xfd\xb6\x8c\x7b\x7e\x13\x9f\xd8\x0a\x26\xfc\x26\x57\x03\x78\xf3\xaf\x9e\xd4\x1f\x4a\x3d\x6f\x23\xed\x6e\xbf\x25\x7f\xfd\x57\x0e\x7a\xe9\xd1\xa6\xa5\xca\xd2\x7f\xf9\xc1\xef\xe7\x4f\xf6\x88\xbf\x2b\x57\x4b\x7b\xf3\x2f\x9d\xf4\x41\xfa\xc6\x7e\x4b\xda\x29\x7e\xff\x8f\x3f\xdc\x43\xcc\x7f\xef\xec\xfa\x3b\x32\x2b\xf1\xcd\xbf\x78\x72\xef\xec\xd1\x97\xf6\xc9\xaf\x9f\xf8\x68\x0a\x69\xdf\xf9\xda\x41\xf7\xf9\x05\x19\x47\x79\x32\xfb\x60\x75\xcc\xbd\x39\x35\xf5\x2f\x9f\xce\xad\xe5\x49\xbe\xd2\xfd\x4a\x5d\x5d\xdf\xac\xe7\x47\x33\xe0\x52\x10\xd5\xcb\x43\xae\x49\xc0\xde\xa6\x4c\xd1\xb2\x51\x87\xde\xb1\x98\x61\x62\xc6\xfd\x98\xa6\x21\x89\x22\x92\xf9\x34\xe1\xc8\x4f\x42\xdf\x8c\x22\x6b\x1c\x92\xd4\x23\x89\xe7\x87\x51\xc0\x5c\xce\xc0\xc6\x75\x96\x64\xd1\x1e\x29\xe9\x2e\x15\x5b\x5a\x0c\x11\x20\xa5\x1a\x7a\x7f\x18\xd4\x8e\x67\x4d\x03\x21\x63\xbc\x76\x3c\xc7\x32\x49\xe0\x79\x9e\xef\x3b\xb6\x45\x2d\x97\xbb\x43\xec\xeb\xcc\xf0\x5a\xa8\x6c\x2b\xb5\x1d\xc7\x8e\x1c\x3f\x70\xfa\x28\x4d\x78\x11\xf2\x2a\xe2\x5b\xbf\x8a\x92\x24\x71\x09\x65\xde\xd1\x86\x40\xe5\x58\xfe\x75\x39\x96\xff\xc2\x89\x4d\x40\xc6\x69\xb3\x99\x2c\xff\xf5\xef\xe3\x07\x8e\xde\x1f\xfb\x49\xbf\xff\x2f\xfe\xe7\x03\x7e\x0b\x1e\xf2\x80\x7e\x1a\x7d\x03\xfd\x3c\xfa\x45\xf4\x67\xd0\xaf\x9d\x58\x24\x9f\xe6\xff\x7c\xf6\x43\x58\xfe\x7f\x3d\x84\x87\x50\xeb\xc9\xcd\x72\x82\xf2\x16\xf4\x6d\xda\xd3\x5a\x8f\x22\x2f\x4b\x71\xce\xc6\x1a\x5a\xcb\x64\x86\x8e\x4d\x1e\x07\x91\xef\x10\xcf\x0f\x63\xdf\xf7\x79\xe4\xa7\x51\x60\xc6\xb1\xc3\x13\x2f\x70\x23\xdf\xf5\x82\xc0\x4f\x6c\x4e\x20\x86\x3e\x09\x3d\xb7\xc7\x6c\x8c\xc4\x36\xfa\xbe\x43\x1c\x1f\xb7\x29\xab\xa3\x52\xa1\x75\x4a\x93\x4a\xed\xe8\x48\x26\x1f\x44\x0c\x6e\xe0\x67\x41\x82\x5b\xc6\x78\xe3\x7a\xb6\x6d\x11\xdf\x73\x1d\xdf\xb5\x6c\x93\x99\x36\x0f\xf6\x28\x0a\x4c\x66\x79\x3d\x30\xcb\x4c\x6d\xdb\xb1\x43\xc7\x0d\x9d\x2e\x4a\x02\x9e\x05\xbc\x0e\x15\x37\xaf\xdc\x3a\x7b\xb7\x0d\xb3\x88\xf8\x24\x65\x01\x23\xef\xc5\x49\x1c\xf4\xa6\xbf\xf2\xf0\x5c\x82\x43\x6c\xfb\xa4\x43\xfc\xf3\x07\x7e\x19\x4f\xf2\x0a\x9d\xa3\x8f\xa4\xcc\xf9\x65\xf4\x67\x1f\xb4\xd3\xb5\xcc\x60\x59\xdd\x6e\xae\x6f\xee\xd7\xea\xe6\xee\x7e\xf5\x1c\x9e\xea\x58\xc7\x7f\x4f\x64\xd2\x52\xba\x2b\x9f\x3c\x93\xf5\xf2\x18\x0f\x41\xc1\x67\x10\x97\x9e\x65\x0f\xbb\xb0\xb1\x1c\x3f\x83\x90\x5a\x26\x2f\x5d\x9c\x30\x19\xc6\x10\x8e\x0c\xc7\x23\xc5\xd1\xc8\xc4\xe6\xb4\x83\xa3\x31\x23\xe2\x25\xaf\x22\x1c\x8f\x2c\x09\x43\x3f\xb6\x98\x67\x73\x2b\xcb\x84\x8a\x26\x36\xb5\xcd\x73\x22\x34\x76\x12\x47\xe6\x36\x49\x13\xc8\x98\x50\xaf\x42\x12\xa5\x01\x89\x2c\xdd\xf2\x9c\xd4\x73\x63\xa5\x24\xfd\xae\x9c\xfc\x08\x01\x2f\x66\x06\x6f\x33\xee\xe6\xa7\x31\x09\xc1\xd9\xf5\x27\xbd\xe0\x4d\xbf\x25\xdf\x08\xfe\xe6\x2f\x3f\xd8\x38\x0b\x21\xbf\xbf\x2d\xdf\x68\xf0\xed\x8f\x4e\xf8\x62\x20\xfd\x08\x37\xf2\xec\x7f\x0e\x3d\xe6\x9c\x4c\x7c\x57\xbe\x75\xf0\x3b\xff\xfb\xc9\x3c\x90\xf6\x79\x19\xa7\x74\xfd\x89\x7c\xa7\xce\x9b\xbf\xf4\x10\xab\x94\x9f\xc4\xd3\x2b\x27\x73\x2a\x94\xf6\xb4\xff\x5b\x9e\xfd\x17\x9f\xd8\xeb\x92\xb3\xeb\xbf\xff\xbf\xc9\xf3\xf1\xa1\xbc\xd8\x7b\x0b\x4b\xcc\xc1\xbf\xd3\xc9\xf3\xff\xc2\x43\x9b\x0e\xef\x7e\x66\x20\xca\x7f\xe7\xbf\x3d\xa1\x0d\x26\xca\x7f\x43\xc6\xf7\xbf\x09\x9f\xf0\x7c\xa1\x77\xfe\x2d\x59\xfe\x6b\x07\x3f\x48\xb4\x4f\x0e\xfe\xab\xcf\xa3\x73\x41\x2d\x93\x0d\x5c\x45\xb0\x40\x70\x75\x89\xe0\x06\x11\xc5\xce\x14\xeb\x53\x6d\xc6\x20\x02\x2d\xe5\x03\xcf\xb9\x9b\xf1\x8a\x17\x14\xe8\xac\x86\x82\xfb\xac\xe0\x01\x77\x08\x0c\x90\xfb\xe1\x58\xf2\x22\x81\xec\x34\xd7\x43\x60\x28\x69\xdb\x7b\xf3\xe7\x1f\x62\x7a\xbc\xd3\x98\x9e\x37\xdf\x3c\x19\x53\x19\x6f\xf7\x5d\x19\x57\xff\x49\xf8\x3d\x18\x41\xe6\x92\xfc\xd6\xe5\x09\xef\x92\xe7\x8b\x33\xf5\xb9\x18\xed\x87\xf3\xa7\x7a\xa4\xfd\xf3\xb7\x96\x4f\x78\x57\x7a\x76\xfd\xed\xff\x5e\xfa\xf1\xfe\xc1\x67\xdb\x45\xdf\xfc\xb9\x27\x3c\xd0\x39\x3b\x7a\x95\x7e\xf5\x24\x7e\x85\x9d\xc4\xaf\xfc\xd9\x93\x7e\xc9\x98\x0d\xd9\xaf\xeb\xdf\x97\x39\xea\x6f\xfe\xcc\x03\x1d\xd9\xd2\xce\xf9\x9f\x4b\x3a\xfa\x47\x4f\xe2\xa4\x8e\x71\x70\xd7\x85\x6c\xd9\x9b\xe0\xd0\x0f\x7b\xc2\x9a\xdf\xfd\x69\x59\xfa\x2b\x4f\x9e\xa7\xa0\xd5\xaf\xc9\xba\xfe\xe6\x93\xf6\xc6\x67\xd7\xff\xf5\xcd\x89\x2f\xec\x97\x1f\x68\x92\x3c\xc6\x93\x7c\xb2\x7f\xa8\x8b\x2c\xd8\xdc\x3c\xe6\x4e\x15\xce\x21\x6e\x64\x8a\x97\x25\xd2\xf2\x70\x8b\xfe\x18\xfa\x99\xcf\xe4\xe4\x8f\x59\x6c\x92\x7d\x1c\x9d\xe1\x32\x99\x53\x60\x2b\x21\x2a\x9f\x68\xb4\x9b\xe5\x7a\xc1\xde\x86\x2d\xcd\xcc\x30\x76\x58\x82\xab\x6c\x67\x3b\x82\x5b\xce\x12\x2f\x21\x60\xf2\xae\x4c\xa3\x28\x12\xba\xf7\x90\xf0\x1e\xcc\xc6\x01\x4f\x41\xcc\x8b\x93\xd8\x4c\x12\x87\x37\x8c\xa9\x2d\x1b\x19\xd7\x04\x0f\xf6\x41\xf7\x9c\xdc\xf3\x15\xbd\x28\xda\xa2\x71\xba\xc2\x22\xa6\xd1\x52\x8f\x52\x4a\xa2\x31\xc1\x71\x53\xa4\x03\xd8\xb4\x34\xa9\xe5\xbd\x73\x92\xc0\xc8\xcc\x50\xe9\x77\xe5\xe1\x39\x4a\x7f\xc7\xb7\xa7\xf8\xcb\x5f\x3a\xf0\xd2\x09\x53\xa5\x68\x81\x7e\x02\x7d\x4d\xf6\xfd\xe7\x1e\x2d\x7d\x97\x27\x3c\xf3\x20\xbe\xbe\x08\x97\x0f\xaa\xf7\x4c\xbd\x79\x35\xe9\xde\x57\x0f\x00\xf3\x7d\xb3\x15\x51\x2c\x31\xa9\xf4\x4a\x0d\x47\x82\xdb\xd1\x52\x9c\xd1\x09\x48\x62\x33\x2f\x4e\x69\x62\x8f\x15\x6f\xb3\xa6\x6b\x74\x9e\x73\x66\xfb\x7e\xce\x02\x08\xc0\x1b\xa9\xa2\x8f\x01\xce\xc7\x9c\x42\xcd\x1d\x1c\x40\xf7\xae\x3e\x1e\xcd\xcd\x30\xa4\xfe\xd8\x87\x49\x40\x92\x20\x0c\xfd\xc8\xb7\x0d\x2d\xd7\x31\x8a\xfc\xd2\x74\x69\x64\x32\x9d\xba\x26\x75\x53\x12\x24\x21\xb8\x61\x18\xf2\xf6\xa0\x67\xf9\x0f\xf3\x54\xbe\x45\xfe\xcd\x3f\x7b\xa0\x01\xb2\x67\xd2\x67\x7c\xfe\xb0\x02\x81\x8c\xc3\x3a\x8d\xb7\x9a\xba\x77\x58\x73\xe0\xd8\x4d\x5b\x2d\xc6\x04\xd3\x31\x16\x9c\x43\xb1\x47\x0f\x97\x63\x72\x8c\x83\xec\xdf\xd1\xe3\xd1\xdc\xd9\xb9\x0d\xeb\x18\xeb\x58\x83\x0d\xd0\x85\x46\x39\xc6\xc3\x30\x9c\xc4\xc4\x2f\x1e\x34\xe3\xbf\x76\xf2\x0c\x36\xcb\xd5\x72\x73\x71\x76\x2e\x04\xdb\xf9\xa5\xb2\xb9\x10\x7f\xae\xe5\x26\x4d\x86\x82\x02\x2f\x56\x8b\xa7\x0e\xee\xf9\xe2\xd1\x0f\x70\xf3\xea\xfe\xee\x7e\x2d\x34\xe7\xfb\xd5\x95\x10\x6b\xcb\xf5\x47\xd2\xa6\xf2\x24\xfa\xe3\xe6\xfe\xf2\x2e\x81\x24\x83\x6c\xe7\x99\x0c\xdb\xac\xf2\x99\x63\x57\x41\x11\xf5\x7c\x3b\x0c\xc3\x00\xe6\x48\xa8\x61\x86\xbc\x30\x21\x0f\x42\xdb\xb5\x22\xdb\xe2\xa5\x63\xe6\xba\x9e\x7a\x26\xd5\xab\xca\x31\x4d\xcb\x29\x33\x48\x4d\xce\x54\xbf\x16\x9f\x31\x4f\x6c\xcf\x75\x23\xd7\x8b\xfc\xc0\xf7\x69\x90\x7b\x6a\xcf\x18\x8d\x78\x02\x64\x0b\x36\xf8\x76\x96\x80\x67\xf0\x86\xf2\x21\xe5\x5d\xca\x07\x4a\x66\xa9\x65\xb9\x5d\x3a\x96\x61\xa8\x53\xcd\x07\xca\x5c\xdb\xb1\xac\xac\xb4\x53\xdf\x64\x5a\xc8\xc6\x54\xd1\xd3\x52\x8c\x22\x0f\xc5\x3c\xe2\x31\xe8\x4a\xed\x7a\xbe\xe3\xc6\x9e\x1b\x58\xb1\xed\x86\x51\xec\xee\xf7\xa8\xde\xa7\xd3\x3a\x14\xbf\xff\x57\x25\xde\x8e\x9f\xc4\x7e\x3e\xae\x43\xf1\x8b\x07\x3b\xe4\x14\xe3\x99\xa2\xe7\xe8\x87\xa7\x55\x28\x8e\xb8\x62\xae\xca\x20\x3b\x19\x6e\x77\x7d\xb3\x96\x6e\xf4\xf3\x93\x75\x20\x0a\x45\xcb\x70\x5f\x95\xbc\x05\x0b\x1a\x6b\xec\x38\xe5\x19\xb7\x3d\x60\x60\x77\x55\x07\x79\x36\x80\x5e\x55\xd9\xce\xcd\x32\xa5\xda\xb9\x6a\xd1\x34\xac\xcf\x62\x83\x19\x05\xf5\x99\x1b\x91\x6d\x99\xa6\xe5\x68\xef\xb6\x71\xac\x68\x1c\x41\x84\x4e\x73\xef\x27\x0c\xfa\x1b\xfc\x09\x5f\x8c\x8f\x72\xf4\xa1\x3c\x3d\xc6\x1b\x4e\xb9\x8b\x6f\x7e\xe1\x24\xae\x43\xf2\xcb\x29\x36\x36\x8b\x9e\xc8\xfc\xf4\xec\xfa\x77\xa5\x8e\xf4\xc9\x9f\x7f\x3f\x3e\xe4\x37\xff\x2f\x59\xcf\x9f\x3e\x94\xdb\x47\x1d\xe9\x3b\xd2\x13\xf6\xc9\xaf\xa1\xd3\xfc\xb9\xe4\xec\xfa\x3f\xfd\x87\xe8\x34\xd7\x91\x1e\xe5\xdf\x6f\x0e\x32\x2e\x7a\xca\x90\xf4\x0f\x32\x99\x1e\xe8\x7e\x89\x2e\x4f\x64\xf2\x25\x56\xe4\x94\x3b\x83\xb3\xf3\x05\x56\x2a\xdc\x67\x0a\xfa\x34\x51\xb5\x22\xa9\x71\xb8\x6d\x66\x46\xb7\x6b\xea\x30\x0f\x2b\xd5\x01\x8f\x97\xd4\xb1\xc7\x92\xdb\x8c\x61\x03\x6b\x3c\xe2\xba\x03\x5b\x60\xc7\x71\x62\x93\x2d\xe4\x3b\xb2\x7f\xbf\xf9\x7f\xa2\xf7\xf2\xda\x7e\x73\xb2\x43\xff\xfc\xfb\x3a\xc2\x6f\xff\x0f\xd2\x47\x97\xa2\xd3\xd8\x5f\x51\x8f\x7c\xd3\xe7\x9b\x3f\x75\x88\x51\x38\x9c\x8f\x16\x0f\x11\xb9\x7f\xea\x80\x48\xff\xa2\xcc\xba\xd8\x1c\x66\xf1\xf3\xcb\x43\x76\x35\x56\x36\xba\xd0\xcf\x9f\x9f\xcb\x8c\xe9\x09\x84\xe2\xf9\xfa\x85\x32\x5f\xdc\xdc\xaf\x96\xab\xe5\xdd\x3d\x56\x24\x80\x3d\x7f\x70\x90\x5c\xac\x26\xe8\xaf\x4a\xa6\xfc\xbd\x06\x3f\x3c\x0c\x19\xa0\x31\xae\x6c\x83\x58\x46\x6a\x58\x95\xae\x65\x3a\xf8\xbc\xd4\x4c\xdf\x21\x51\x6a\x59\xba\xae\x11\x3d\x74\x63\x2f\xce\x7d\x77\xdc\x62\x27\xf1\x1d\x63\xd4\x72\xc3\x4e\xa4\xad\xc4\xe0\xfd\xae\xc3\x88\xa3\x79\xea\xdb\xc4\xf6\x3e\x6d\x04\x92\xf5\xa0\xe3\xe6\xb4\xd1\x9a\xd2\xba\x56\xcb\xaa\x22\x16\xa1\x29\xb5\x88\x74\xfc\x72\xc2\x07\x92\xf3\x6d\xd6\xda\x3c\x6f\xdb\x3c\x37\x78\x53\x02\xa2\x71\x62\xe3\xed\x68\xc7\x09\x18\xe0\x13\x12\xef\xaa\x7a\xdc\xd6\xaa\x41\xc2\xbc\xf6\xea\x22\x67\xc9\x13\x53\xe1\x31\x1e\x7e\xc2\x26\x7f\x4f\xca\xfa\x5f\x43\xef\xe5\xd7\x7e\x77\x25\xc7\xfe\x9f\x79\x82\x63\x93\x07\x1c\xfb\x27\xd1\x14\xb7\x15\xca\xf2\x18\x5d\xa2\x1f\x47\x08\x2e\xd5\x63\x30\x92\x18\xe5\xeb\xdb\xe5\xe2\xe6\x7e\xb9\x59\xc2\x4a\x57\x4e\x96\x75\xf9\x1c\xc0\xcd\xdd\xd9\xf9\x5a\x61\x3a\x0f\x4c\x37\x71\x75\x66\xa6\x55\x1e\xb5\xc6\x50\x40\xaa\xb4\xbe\xd3\xc4\xcc\xcc\x92\xd0\xd7\x79\xa8\x15\x7b\x14\x37\x85\x36\xcc\xba\x2c\x1c\x99\x65\x04\xb5\xbb\x47\x69\x10\xe1\xd0\xce\x1c\xac\x73\x03\xc8\x3b\x97\xf7\xad\x91\x19\x10\xcc\xcc\xd1\x1a\xf3\x3d\x4a\x6b\xec\xe0\x02\xa9\x0f\xf1\x78\x5f\x40\x5f\x44\x2f\xd0\x6b\x19\x5b\x79\xf1\x98\xa5\x77\x5c\x35\xe2\x98\x52\xba\x5a\xca\x50\x5f\x58\x5d\x4c\x86\xef\x53\x1e\x74\x77\xbf\x48\xde\x3a\x35\x8b\x7d\xa1\x9a\xbb\x60\x64\xd0\x65\xe0\xf2\x6a\xd7\xf1\x5e\x61\xdc\xe4\xe9\x2c\x4f\x87\x1e\x02\x8f\x47\xbc\xe5\x0d\x4f\x42\x88\x00\x55\x24\x01\x8b\xd4\x75\x2a\xb3\x6e\xc7\x2d\x4f\xc3\x41\xa0\x5e\x99\x76\x9b\x51\x4a\x29\xe3\x15\xb8\x79\x9e\xf3\x81\x94\xd4\xb5\x0a\x9b\xa4\x2e\xb5\xc3\xa4\xa2\x61\x44\xde\x8b\x93\x9e\x62\xc8\xbe\xf3\xbf\x1e\x6c\x13\xc1\x41\x3f\x9b\xf2\x11\x7e\x0e\xf9\x28\x90\xfe\xec\x8b\xd5\xb4\x00\xd1\xed\x51\x86\x3d\x38\xbc\x2e\x1e\xf3\x8f\x97\x17\x9b\x5b\xe5\x62\x73\x7b\x25\xb8\xc1\x94\x6c\xb4\xb9\x58\x5f\x3c\x8d\x3d\x9c\x3c\xd9\x8f\xe6\xae\xdb\xd5\x82\xed\x62\x08\xa4\x9d\x16\xbc\x30\xe4\x25\x93\x56\xdf\xbc\x20\x39\x74\x59\x51\x14\x9f\x76\x80\x58\xe8\x26\x71\xbe\xdd\xb2\x28\xf4\x7d\x16\x86\x71\x16\xb5\x81\xef\x24\x76\x30\xef\x18\xb7\x28\x9d\xd4\x32\xc2\x13\x42\xc2\x90\x0f\x44\xc0\x06\x92\x85\xe3\xc0\x13\x5f\x66\x25\x37\x79\x2e\x7e\xe4\x43\x96\x15\x98\xf0\x98\xd0\xb0\xcd\x1c\x4a\x73\x46\x69\x2c\x84\x3f\xdf\x12\xda\x41\x8a\x69\x51\x7b\x55\xf9\x6e\x18\x8b\x20\xc0\x3e\xa7\xbd\xc4\x60\xe1\x94\x6f\xf0\xad\x89\x37\x7f\xe3\x84\xe7\xf8\x8f\xb2\xe8\xbf\xba\x3b\x29\x97\x36\xa1\xdf\xfd\x29\x79\xfe\xcf\x9d\xd0\xbd\xd4\xc7\xbe\x25\x75\xa5\xef\x56\x27\x98\x78\x9a\x3f\xd2\x8e\xf1\x89\x71\x82\xd5\xa5\x1e\x7d\xd0\x41\x7e\xf6\x80\x79\x26\x2c\xe4\x3e\x60\x9e\x9b\x09\xf3\x2c\x9f\x6d\xcc\x43\xe8\x9e\xf4\x32\x9c\xa6\x05\x9c\x5f\xce\x05\xf5\xdd\x41\xa4\x5a\x3c\x09\xc0\x88\x8c\xcc\xf4\x5c\x1e\xe7\xfe\x88\x32\xa5\xdf\x19\xc7\xad\xcc\x2c\x5e\x71\xe6\x42\xb0\x9d\xbb\xef\x02\x9e\x7b\x7e\x65\xf7\xbe\xeb\x45\x40\x14\xb7\x19\xbb\x7a\xec\x1a\x1e\xe9\xc3\xd6\xa6\x76\x79\xc0\xa2\x92\xc7\xa2\xcf\xa3\x0b\xf4\x87\x65\x9e\xf0\x2f\xbe\x9f\x9d\x7e\xf4\x03\x5d\x3d\x49\x40\xbf\x3b\x66\xa0\x1f\x03\x11\x15\x31\x57\x2e\x24\x56\x3f\xd1\xe9\x25\xce\xb9\xbd\xbb\x5f\x2d\xd8\xa7\x55\x44\x43\xc5\xcf\x76\x03\xf8\x19\x78\xbb\x5a\xad\xb3\x22\x49\x9c\xc0\x8c\x3c\xdb\xae\x73\xde\xd2\x5d\x2b\x54\x7b\x99\x98\x5a\xe2\x21\xcd\xc1\x33\xf2\x32\x08\x7d\xdf\x70\x03\x8f\xe5\x46\x99\xc5\xe1\xb8\x9d\x23\x3a\xa6\x63\x37\x65\xad\x0f\xb8\x23\x84\x77\x69\x4a\x18\xe1\x69\xdb\x51\xa6\x33\xc3\xf7\x9a\x06\xd8\xdb\x56\x2d\x06\x9e\x27\x11\xaf\x48\xe0\x1b\x66\x62\xe8\x85\xe7\xe9\x54\x37\x88\xa6\x13\x4d\x8f\xe5\xba\x45\x70\x88\x91\x43\xe8\x4b\xd2\x3b\x2c\xe3\x16\x0f\xcc\xeb\xf8\x38\xf4\x05\x46\x8b\x9b\xbb\x1f\x02\x1c\x72\x6f\x5e\x8d\x8d\x9b\x16\x9e\xce\x0c\xd7\xe1\xc3\x10\xf3\xc8\xb0\xf7\xa8\x8b\xab\xde\x57\x23\xc6\xde\xb6\xa6\x19\xf4\x16\xef\x7c\xc7\x0b\x55\x7f\xcc\x19\xef\x79\x9c\xd2\x08\x1c\x20\x08\x69\xd2\x96\x5f\xc8\xdc\x92\x1b\xf4\x65\xb9\x5a\xd2\x37\xd0\x2f\xa2\x5f\x39\x5d\x3d\xec\x90\x4d\x32\x35\xe4\xc1\xf9\xb4\xc6\xf3\xc5\xcd\xd7\xe0\x5c\x39\xc6\x7c\x1e\x02\x81\x4f\xe2\x2a\x2e\xa5\xf5\xe5\x20\xaa\x8e\x38\x29\x85\x98\x41\xcc\x29\xd8\x23\x02\x87\xd3\xb9\xa3\xdb\x86\x4e\x35\x2f\x21\x5e\xa7\x05\x71\x14\xba\x5a\x4d\xc7\x92\xce\x74\x17\x77\x2c\xa0\x4d\xd0\x64\x45\xe7\x77\x8c\xf4\x89\xcb\x99\xfb\xae\x85\x2d\xd7\x70\xc0\x78\xc4\x18\x30\x1e\xa9\xdb\x34\x25\x69\x9a\xa6\x35\x37\x2d\xc3\x4a\xcc\x22\x70\x43\x48\x78\x37\xf8\x49\xd0\x81\x3b\xd6\xbc\xac\x1a\x08\x38\xa5\xb1\xc9\x59\x44\xfc\x2c\xcc\x72\x8f\xfa\xb4\xf4\x68\x5d\x83\x95\x26\x63\x10\x45\x38\xe7\x3e\x98\xe8\x61\xfd\x07\x7a\x76\xfd\xad\xff\x45\xce\x17\xef\x09\x36\x08\xce\xae\x7f\x5b\xbe\x25\xec\x3b\x1f\x9e\x94\x97\xa2\xfc\x3b\x53\x9e\xcf\x9f\x78\xb0\xeb\x4f\x7c\x70\x21\xe9\xf9\x15\xba\x43\x3f\xf1\xe8\xf3\x3f\xc4\x91\xac\x6f\x57\x32\xaa\xe4\x68\x26\x5c\x3f\x81\xf1\x70\x74\xf7\x4f\x54\x1d\x41\x21\xf0\xb9\xce\x75\x12\x11\xc2\x85\x04\x2e\x71\x1c\x58\x85\xed\x83\x9f\x07\x24\x0c\xcc\x28\x76\x77\x2d\x58\xd2\x9a\x27\x17\x3e\x93\xeb\xca\xa8\x4d\x51\x10\x30\xde\xd6\x33\xf4\x4e\x8b\x66\x74\x87\x70\xc5\x32\x8b\x25\x74\x57\xc5\xa1\x91\x9b\xbe\x62\x42\x15\xc6\x4e\x1c\x8e\x2d\xd7\x48\x7f\xc8\xb3\x38\xda\x0a\x1c\x89\x9d\xfe\x21\x7a\x2f\xc7\xf9\x3f\xf9\x49\xd9\xdf\x9f\x39\xc1\x92\x72\x4d\x80\x4f\xe4\x6a\xc0\x6f\x7e\xfa\x04\x1b\xe6\x73\xf7\xec\xfa\x77\xe4\xfa\xd7\xdf\xfd\x61\xe9\x31\x99\xae\xfd\xe3\xe8\x54\x96\x3c\xac\xbf\xf0\xe6\xa7\x1e\xca\xe3\x05\x93\xf9\x76\x4c\x96\xff\xb1\x87\x7b\x1d\x72\x4f\xbe\xf3\xb7\x65\xdb\xfe\x8f\x27\xb1\xa4\x02\xd7\xc9\x38\xb1\xdf\xfb\x13\x27\xe5\xb2\xcd\x53\xf9\xef\xbe\x3e\x29\x97\xf9\x7f\x53\xf9\xdf\xfb\xa5\xf7\xed\x0e\xbf\x39\xe5\x77\xff\xd3\xe8\xd4\xce\x23\xea\x91\x6f\x46\xfc\x76\x78\x78\xd6\x91\xcc\x49\xb1\xd0\x17\xd0\xc7\xd2\xab\xff\x65\x74\x2b\x11\xed\xe9\xd3\xbc\x7a\xfa\xa7\x7a\x48\x2d\xc1\xea\xcd\x4b\x90\xfb\xe9\xb8\x50\xf4\x30\x4c\x6b\xb3\x4e\xdd\x91\x2a\x44\x31\xc2\x90\x54\x56\x93\x3a\x23\xe5\x76\x5c\xf3\x26\x06\x67\xe6\x1f\x0e\xc6\x38\xec\x39\xf3\x21\x9a\x85\x61\xcf\x33\x1f\xc2\xb9\xf5\x56\x8f\x63\x23\x33\x62\xd5\x62\x8f\x87\x46\xb0\x6d\xe2\xa6\x0d\xf6\xa8\x4b\x3a\x5e\xc4\x7c\xdb\x93\xbe\x8f\xf9\xb6\x23\xfd\x41\x76\x90\x13\x1b\xac\xfb\x3e\x1e\x3e\xe4\x51\x7c\xfd\x41\xcf\xa0\x07\xda\xc8\xa5\x2d\x45\xe6\xb0\xa1\x0f\x1e\xe2\xc4\xff\xd0\x21\xd3\x7d\xb2\x2a\xfc\xdc\x94\xeb\x7e\x5c\x0a\xeb\xee\x7c\xb2\xd2\x1e\x78\xc5\x49\xee\xc8\xcb\xfb\xa3\x15\xe1\x01\xf9\x2e\xde\xc3\xbc\x47\x46\xa2\xd4\x80\xb2\xed\x36\xce\x62\x16\x25\x03\xef\x02\x37\x08\xa3\x30\xc6\x88\x71\x8b\x59\x56\x00\x76\x39\x76\xc0\xf6\xa8\x3b\x1a\x5c\x77\x06\xb6\xc6\x36\xc0\xc3\xa8\x3b\x47\x53\x2d\x8e\x32\xde\x30\x06\x36\x6f\xd4\xa2\xae\x69\x53\x81\xe6\x74\x05\xb5\xbd\x28\xf0\x42\x7f\x97\xfa\x01\x1e\x74\x23\xa1\x39\x6d\x76\x61\x35\x0e\x95\x1a\x51\xc6\x04\x42\x22\x63\x12\x04\x98\xf0\x08\x1e\x62\x58\xa6\x3c\x3d\x0b\xbd\x46\x3f\x81\xdc\x93\x55\x41\x0e\xcd\x5f\x3e\x7f\x0c\xda\x39\x5b\x6e\x9e\x2d\x9e\x5f\x4e\x82\x15\x2e\x17\x42\x7a\xdd\x5c\x09\x60\x2a\x47\x65\x42\x38\x1d\xe8\x99\xb4\x15\x04\x3c\x17\xdf\x0c\xd7\x50\x38\x9c\x8c\x8c\xfb\xd4\x74\x58\xc2\x74\xdf\xe3\x29\xa4\x7c\x98\x67\x7a\xcb\xc6\xce\xc0\x0e\x1b\x87\x2c\x09\x09\xb5\x59\x1a\x12\xaa\xd2\xbe\xa7\x7c\xa0\x5b\xca\x49\x90\xd3\xa2\xa1\x21\x98\xd8\xaa\x8b\xd0\xc3\x8c\x82\x3e\x76\xc4\xe2\x26\xd4\x3e\x09\x94\x66\xe7\x29\x7e\x90\x24\x24\xe0\x75\x98\xa6\x2c\x7c\xb4\xb5\x66\x02\x87\xfc\xec\x5f\x96\x34\xf0\x35\x74\x5a\x9e\x3c\x94\x7f\xf5\x44\x57\x92\xb4\xf4\xad\xc9\xff\xf2\x47\xdf\xd7\x29\xbf\x35\xe5\x6d\xfd\xe4\x49\x39\x3d\x29\xff\x09\xf4\x18\xa3\x2b\xf3\x93\x26\xfb\xf5\x9b\xaf\x1c\xe6\x9a\x7f\xc0\x09\x1f\xa3\x17\xe8\x1a\xfd\x21\xf4\x33\x32\x2f\xfb\x61\x71\x95\xd5\x61\x7d\xbf\xc3\xbf\xf5\x72\x71\x83\x2e\x57\xd7\x37\x8f\x2e\x95\x29\x00\x57\x9e\xfd\x4c\x8a\x2a\xac\xac\x0f\x10\x14\xce\x2e\xcf\xce\xa1\x63\x9a\x5e\x17\xb1\x69\x71\xc7\xb2\x71\x34\x6e\x65\x2a\x1d\xe2\x88\xe9\x11\x68\x11\x58\x61\xe4\xc7\x52\x8a\xc5\x9c\xce\x8d\xd1\xc5\x85\x59\xc5\x59\x4c\xe3\x9c\x84\x05\xa9\x1c\x93\xd0\x14\x3c\x27\x4d\x8d\x39\xb1\x4d\x93\xe4\x89\x65\x05\x96\x35\xa6\x11\x89\x48\x3c\x93\xd5\xf8\x81\xcf\xb8\x19\xf1\x2c\x56\x28\xe5\x8c\xeb\x3c\xcf\x12\x12\x67\x5a\x19\xd0\xa8\x00\x07\x52\x36\x76\x3c\x0a\x20\x83\x01\x0f\x63\xc2\xab\x0e\x34\x30\x1e\xed\xbb\x91\x8c\x0b\x98\x7c\xcc\xce\xc1\x37\x35\xf9\xbe\x08\xfa\xa1\x43\xac\xd9\x06\x7d\x1d\xfd\x94\x8c\x2a\xb9\x14\xc3\x33\x59\x8a\xfe\xb1\x83\x73\xea\x41\x14\xdf\x87\x05\x38\xa5\x53\xf0\x62\x75\x0b\x5b\x66\x66\x69\xec\xf0\xd8\xc7\x21\x47\x42\x16\x8b\x8d\x19\x11\x18\x21\x68\xbe\xef\x27\x10\x71\x26\xb6\xb9\xc5\x46\x3f\x83\x8c\x09\xc2\x2d\xc6\x5e\xc8\x6c\x57\xe0\x29\xa8\xe6\xc4\x76\x53\x9a\x78\xb1\x7f\x1c\x92\xcc\x88\x00\x79\x81\x47\xb8\x21\x87\xc4\x9a\x9c\x82\x65\xf9\x69\x17\xaa\x3a\xd7\xf3\x91\xf9\x8a\xdf\x8c\xd1\x76\x7b\xb4\x43\x48\xda\xf8\xed\x89\x2f\xdd\x1f\x68\xe6\x63\x84\x66\x97\xf3\x2f\xe9\xd7\xe8\x67\x11\x5a\x2e\xd0\x9f\xc4\x7f\x17\x21\xf4\xd2\x35\x30\xfc\xc1\xc7\xe0\x7f\x0c\x5f\xfa\x18\x3e\xfc\x18\x3e\xfe\x83\x2f\x83\xfb\x65\xf8\xf0\xcb\xf0\xcd\x6f\x7e\x73\xf9\xcd\x6f\x7e\xf3\x9b\xb7\xb7\x0f\xd7\xcf\x4f\xae\xff\x79\x79\xfd\x0b\xf7\xf2\xbd\xcb\x57\xe0\xae\xe0\xc3\xd5\xe3\xe5\xd3\xb5\xf3\xff\xe6\x78\xad\x7e\x83\x7e\x56\x5c\x2b\xda\xa0\x0a\x29\xe7\xb8\xd7\x0a\xfe\x8f\xbf\x02\xf1\x57\xc0\xfd\x0a\x7c\xf9\x2b\xf0\xe1\x57\xe0\x2b\xd0\x7d\x09\x8a\x2f\xc1\x97\xfe\xe0\x1b\x10\x7f\x03\xdc\x6f\xc0\x87\xdf\x10\x55\x8a\x3a\x6f\x65\xbd\x27\xed\x9a\xe7\x9f\x51\xf7\xcf\xcb\xba\xef\xdc\xab\xef\x5f\xf5\x57\x21\xfe\x2a\xb8\x5f\x85\x0f\xbf\xfa\x7e\xd5\x08\x2b\xe9\xbe\x9b\xa5\xb3\x08\xfd\x00\xba\x44\x08\x5e\xdf\x6d\x5e\x4d\xb8\xfa\x7a\x79\x72\xac\xa4\xee\x7b\x1f\xa5\x73\x3d\xcf\xf5\x3c\x6f\xd7\x7a\xd3\x07\x81\x52\xf2\x6e\xe6\xcf\x3b\xa4\x20\x04\xeb\xe5\x66\xe6\x33\xc6\x3b\xb9\xae\x2a\x20\xc4\x3b\xc4\xa6\xdf\xce\xd7\xcb\x0d\x7b\xf8\x09\x01\x44\xbc\xc3\xe2\xb7\x2b\x71\xdd\xeb\xeb\xdb\xd7\x77\xb7\xa7\xfb\xcd\xb3\xf9\xc5\x33\xd1\x92\x87\x3d\x66\x5e\x2f\x3f\x87\x2f\xde\xd9\xad\xef\xb7\xb6\xdd\xf8\x41\x63\xdb\x4d\xe0\xb7\x96\xdf\xd8\xa2\xb0\x71\xac\x56\x16\xb6\x53\x3b\x52\xd0\x16\x29\xee\xd0\x07\xe2\x8f\x95\x09\xb7\x62\xb7\x48\x79\xc2\x35\xae\xf1\x04\x22\x6c\x60\x13\x42\xd0\xc1\xe0\x5d\x01\x16\x3f\x5e\x87\xbb\x45\x3a\xab\xbe\xe7\xba\x6c\xec\xc6\x9e\x33\x20\xb0\x85\x2d\x90\x99\xce\x1b\xb0\x0b\xde\xc9\x79\x2a\xae\x43\xa9\xbc\xdf\xc7\x08\x5d\xad\x5f\x5f\xaf\x57\x2f\x6e\xd6\xf3\xf5\xea\xc5\xfc\x62\xfd\x35\xd8\xac\x5e\x89\xee\x3d\xdf\xac\x5e\x3d\x5f\xa4\xcc\xf7\x79\xd9\x58\xba\xd5\xf0\xd2\xf7\x99\x46\x29\xf8\x61\x90\x85\x01\xf8\x94\xa6\x41\xd0\xf7\x41\x50\x14\x02\xe8\x16\x27\x6d\x52\x3d\x51\x37\x7c\x01\xa6\x4a\xe5\x2d\xae\x6f\xa6\x4a\x2f\x37\x77\xf2\x16\x8b\x54\xa3\x94\x17\x41\x98\x05\x21\x2f\x28\xd5\x98\x17\x80\x27\x6f\x05\x9e\xef\xab\x5e\x51\x8a\x6a\xcb\x22\xf4\xc5\x4d\xa6\x76\x0f\xb2\xdd\x0b\x84\x60\xa1\xac\x94\x9b\xf3\xd5\x22\x25\xd9\x3b\x3f\x23\x9d\xea\x82\xe3\x81\xcb\x2b\x0f\xf2\xc7\xb1\x69\xe4\xb9\xca\x4a\xb9\x3f\x5f\x9d\x2f\xd2\xee\x6d\xd5\x91\x6c\x56\x64\x33\xc2\x03\xc8\x3d\x5e\x83\x23\xeb\x8d\x64\xbd\x9a\x18\x0f\x31\x86\xeb\xe5\x6a\x91\x7a\x3c\xe3\x16\xb7\x78\xe6\x2d\x50\x04\x84\x27\x38\x79\xe8\x5f\x28\xce\x85\xd5\x72\x23\xce\xde\x2c\xd2\x4f\x91\x07\x21\xb4\xd0\x42\xe8\xe1\x0e\xa7\x3c\x06\x3a\xd9\x7d\xd2\x7d\x25\xeb\x56\xd1\x0f\x88\x56\x7f\x00\x37\x1f\xc8\x3d\x2c\x52\x77\x57\xed\x2a\x57\x49\x95\x87\x23\x70\x12\xa0\x3c\x4e\x20\x1f\x83\xe3\x91\xa8\x43\xdc\x73\xae\x4d\x75\x7c\x80\xef\x3f\x80\xf3\x0f\xe0\xfe\x03\x58\xa4\xbb\x74\x97\xba\x8a\xab\xb8\xee\xc3\x91\x4a\xb9\x0f\x45\x22\x5a\xc0\xc9\x74\x18\x49\xc3\xa3\xe8\xe7\xb1\x2d\xe8\xfd\x36\x3c\xde\xf9\xa1\x8f\x42\x1b\x9f\xee\x76\x72\x9f\x69\xe0\x92\x63\xff\x9e\xd4\x79\x25\x73\x00\x16\x29\xfb\x94\x2d\x50\x05\x71\xf1\x48\x0f\x9a\xbc\xa7\xb4\xa5\x8a\xc1\x62\xf3\x08\x77\xd8\xe2\xd3\x18\xcd\x10\x72\x1e\xc7\xe8\x4a\x1a\x97\x14\xc9\xe1\x17\x29\x0f\xb9\xa9\xa4\x64\x24\xd0\x3b\x60\x00\x1d\x3b\xc8\x28\x1f\x0e\x63\x8b\xbb\x19\x52\xc9\x61\x6c\xa7\xeb\xe4\xa2\xcc\x33\xb4\x4b\x81\x41\x9f\x72\x83\xe2\x0e\xe7\x7c\xe0\x3d\x03\x9d\x07\x93\xdf\x95\xcd\xf5\x45\x34\xa7\x87\x3c\x77\xa9\xd3\x1e\x97\xe6\x5a\x44\xbc\x02\x77\x74\xe4\xde\x16\xf4\x31\xd7\x05\x19\xa6\xd3\x75\x68\x11\xcd\x33\xa4\xa1\x1f\x44\xfa\x81\x33\x5d\x3c\x5b\xbf\xb8\x3a\xae\xeb\x55\xd8\xa6\xef\xfb\x4a\x39\xf6\xd8\x78\xe7\x89\xfd\xdc\x37\x6d\xdf\x17\x55\x08\x7e\xa3\xea\x1a\x9a\x27\xe8\x47\x11\x82\x17\x5f\x86\xeb\xf5\x8b\x2f\xe0\xf5\xc3\xc1\xed\xab\xaf\xe1\xcd\xab\x2f\xe2\xcd\xf1\x5b\x43\xbe\x5b\x47\xae\xed\x0d\xa1\xf3\x78\x64\xfb\x5d\xe4\x38\x51\xe7\xdb\x8f\x47\xaa\x6e\x67\xbe\xd5\x58\xd3\xde\xb3\x6a\xdb\xa9\xac\x69\x2f\xf9\x9c\xaa\x69\x68\x9e\x4e\xf7\xfd\x71\x3c\xdd\xf6\xf0\xfd\x19\x77\x75\xc3\x36\xb4\xac\xb0\x0d\xdd\xc7\x23\xdb\x6f\x63\xc7\x8d\x3a\xcf\x7e\x3c\x52\x35\xab\x74\x9c\xd2\x9a\xf6\x81\x5d\xd9\x76\x6d\x4d\xfb\xc3\x38\xef\xed\x45\xb4\x2f\x8f\xe3\xac\xfe\x63\xc7\xb9\x39\x26\x8a\x89\xeb\xac\x45\xb4\xaf\x0f\x79\x9d\x48\x7d\xfd\xfe\x30\xfb\xef\x8d\x32\xf1\x7d\x5f\x13\x57\x0b\xd4\xab\x6b\x08\x3c\xc1\xb7\xaf\x5e\x08\x39\xb1\x3e\xdd\xdf\xbe\x7a\xbe\x79\x25\x64\xc8\xe3\x5e\x43\x82\x37\x9f\x30\x66\xbf\xb5\xdf\x63\xdb\x76\xeb\x6f\x27\xa6\xee\x4f\x5f\x08\x80\xee\x43\xec\x21\x8a\xe6\x08\x5d\x5d\xce\x17\xeb\xbb\x7b\xec\x6a\xa6\xe7\x9b\x06\xd5\x93\x9c\x31\x31\xee\xde\xde\xc4\x1a\x1a\x04\xed\xab\x8b\xeb\x9b\xfb\xe7\x58\x4b\x68\x19\x77\x49\xd4\xd2\xa8\x9a\xe4\x4c\xb1\x1f\xb0\x8f\x98\xe0\x53\x57\xcf\xd6\x2f\x6e\x5f\x6f\x5e\x61\xd1\x3d\xdf\xf5\xfd\x00\x61\x20\xfb\x10\xfb\x38\x47\x0b\xf4\x05\x84\xe0\x70\x86\x72\xb8\xa3\xef\x7b\x9e\x6f\x4c\xb7\x15\x57\x05\x63\x3f\xdd\x1c\x4f\xf5\xca\xeb\x3e\x7c\xbc\x6e\xf9\xe4\x0e\xe2\x33\x5d\xc5\xa6\x7b\x19\xfb\x01\x77\x4a\x82\x2e\xd1\x97\x10\xba\xba\x7d\xfd\x35\x7c\xfb\xfa\x7a\xfd\x62\x71\x33\x49\xdd\x2f\xe0\x8f\xe1\xf2\x50\x03\xe4\x16\x31\x5d\xcf\x8f\xcc\x24\x4c\x12\x9b\x5a\x96\xe7\xfb\xde\xd6\x70\xc3\xd8\x75\x5c\xd7\x0e\x9c\x38\x76\xc3\xd4\xb5\xf5\x72\xaa\x5b\xb6\x47\x89\x91\x22\xe7\xf8\x5a\xd9\x9c\x1f\xdb\x62\x7a\x46\xaa\x8b\xb6\x6c\x71\xb2\x6b\xc4\xd9\x62\x5c\xe2\xbd\x8b\xa9\x12\x4b\xd9\xb6\x99\x2f\xf5\xcb\xf5\xf5\x52\xc7\x56\x54\xe4\x61\xa9\xc4\x03\x6f\x78\xdb\x37\xe0\x82\xf7\xf4\x5c\x75\x7d\xb7\xd4\x6f\x36\xcf\x97\x3a\xb4\x51\x9e\x47\x65\xd5\x83\x05\x4e\xdf\xf2\x92\x57\xa2\x5e\x6f\xef\xe2\x52\x89\x85\x7c\x52\x9f\x3d\xdf\x5c\xbc\xb8\xfe\x2a\xbc\x16\x84\x71\xf7\x55\x31\x9f\x2f\x5e\xcc\x3f\x86\x67\x8b\x8b\xe7\x17\xd8\xb7\x9d\x38\x12\xbd\x8a\x62\xc7\xa6\x54\xb3\xed\x20\x08\x6a\xc7\x09\x1d\xa7\x0e\x82\xc0\xb6\xeb\xd4\xd0\x8c\xe4\x69\x9d\x57\xaf\xef\x6f\x8f\x35\x3e\xff\x18\xe4\x1d\x44\x8d\x73\x71\x87\x5b\x28\x08\xb1\x9d\x28\x16\xb5\xc6\x91\x63\x57\x89\xa1\x19\x69\xfd\x3d\x35\x23\x80\x60\xef\xe2\x5c\x89\x05\x5d\xa8\x57\xcb\xab\x8b\xc5\xf2\x12\xe7\xbc\x00\xbf\xeb\xaa\x12\x97\x55\x1a\x8f\x45\xf2\xde\x79\xf7\xcb\x9b\x5b\x75\xa9\x42\xd0\x75\xe0\xf3\xc2\x4b\xb0\x1f\xa7\xd5\xe8\x95\x08\x23\x8a\x90\x12\x2b\xb1\xb4\xa9\x22\x58\x6c\x2e\xd6\xca\xfa\x5c\x6e\xb7\x9b\xfb\xf5\xed\xe6\x7c\xa3\xc8\xed\x42\xdd\xdc\xaf\x71\x65\x15\x95\x1d\xd8\xb9\x1d\xd8\x59\x6e\xe7\x85\x13\x38\x85\xe3\xdb\x19\xb7\x0a\xb3\xc0\x46\x15\xec\x91\x5c\x74\x10\x05\x95\x3f\xad\x54\xcf\xb7\x7e\x55\x21\x05\xe5\xfb\xad\x52\x28\x09\xfa\x08\xad\xe5\xfa\xdb\x02\x2d\x49\xea\x59\x5c\xde\xdd\x6f\xe6\x8b\xcb\xf5\x8d\xf4\x78\xbc\xbe\xba\x93\xc4\x35\xbf\x78\x06\x37\x73\x19\xf8\x04\x41\x18\xc5\x71\x54\xb6\x8e\x11\x9b\x61\x4e\xa2\x84\x91\x14\x34\x62\x3b\x8e\x03\x66\x9f\x7a\x7e\x0c\x7d\x2c\xd3\xf9\x92\xa8\x73\x23\x12\x15\x51\x9c\x24\x8c\x05\xbe\x6d\xdb\x8e\xc7\xdd\xc1\x8b\x3d\x6f\x92\x4b\x1d\x24\x8a\xa9\xe4\x72\xd6\x2c\xee\x2f\x17\x97\x8b\x9b\xc5\xcd\xfd\xcd\xfd\xe5\x0d\x76\x8c\x41\xef\x68\x14\x85\x31\xed\xf4\xde\x50\xf2\xc1\x4b\xf4\xca\x6d\x5b\xb7\xd2\x13\x6f\x98\xae\xef\x51\xa6\x18\xb8\x96\xf2\x61\x7d\xbb\x39\x58\x09\xd6\xd0\xf4\x7d\x30\x0c\x01\x10\x01\x7d\xfa\xc3\xb9\x40\x14\x03\x26\x1c\x79\xbb\xba\xe8\xb1\x0d\x24\x08\x8e\xf5\x50\xc5\xc0\x83\xe4\x13\x70\x0b\x17\x9f\x07\xc5\x90\x69\x30\x2e\x54\x14\x90\x03\x56\xd4\x56\x4f\xcf\xbb\xff\x31\x71\x22\xf4\x50\x72\x69\x2d\x1b\xaa\x36\xe2\xad\xb3\x97\x32\xaf\x07\x4d\x31\x70\x20\x79\xaa\xbc\x9b\x3a\xdd\x51\xd4\x89\x51\x10\x6c\x83\x69\xfe\x58\x08\xe1\x56\xce\x37\xf4\x01\xac\x01\x28\x78\x11\x2f\x95\x78\x27\x26\x0a\x52\x00\xed\x4b\x05\x29\x39\xfa\x08\x7d\x11\xad\x11\xba\xba\x58\xdf\xbe\xb8\xb9\x7d\xbe\x59\x5e\xdf\xbe\xbe\xbf\xdd\x5c\xbc\x92\xbe\x8d\xe7\x17\xcf\xe0\x76\x7e\xf1\xec\xf2\xe2\xee\xf6\x35\xb6\x7c\xe2\xc7\x51\xd3\xf8\x89\x6f\x79\x41\xcb\xdb\xa8\x8c\x5d\x42\xac\xc8\x01\xcd\x65\xb9\x11\xc7\x56\x60\x6a\x7b\xe4\x91\x1c\x58\xa7\x07\x41\xd6\xe9\xa1\x37\xd9\xf5\xdd\xfd\x56\xa9\x94\x44\x62\xfa\x1f\x96\x3a\x20\x3a\x3f\x41\xf3\x57\x07\x5a\x10\x2c\x59\xb4\x57\xf9\x3e\xbf\xb9\x61\x20\x3f\x21\xe8\x96\x2d\x3f\x16\x34\xdc\x08\xa0\x8f\x45\xa9\xf8\x15\x74\x51\x2a\x7e\xc5\x11\x39\x7c\xc2\x28\x0a\xc3\x28\x82\x48\x74\x7f\x64\xef\x15\x8b\x71\xb5\xf7\xa9\xd2\x28\x01\xfa\xc3\xe8\x1e\xa1\xab\x89\x44\xef\x36\xaf\x2e\x95\xc9\xc2\xfc\xd8\x84\xfb\x8b\xe9\x47\x74\x6c\x9f\xf2\xf8\x13\x26\x4e\x12\x44\x34\x8e\x7c\xdd\xb2\x6c\xa7\x64\x55\x57\x16\x29\x89\x69\x3b\x80\xd1\x55\x7d\xe2\x47\xb6\x6d\xf9\xbe\xe3\x24\x5a\x17\x27\x71\xc2\x0c\xde\xb9\x76\x9c\x64\xd5\xd0\x94\x95\x13\xd8\x43\xdb\x83\x35\xd4\x34\x83\x4c\x8f\x42\xdf\x2b\xd1\x51\x1f\x52\x85\x1c\x15\xbc\x5c\xf2\xce\x87\x06\x3e\x9f\xb9\x89\xd3\xe9\x47\x1d\x08\xb2\x99\xf1\xb6\x94\xca\x8f\xeb\x22\x84\x71\xaf\xe4\xaa\xa1\x4e\x32\x18\x81\xb2\x56\x56\xca\x5a\x51\x0a\x2b\xb1\xb0\x6d\x25\x96\x5a\x1e\xd6\x40\xd2\x11\x86\x0c\xa1\x79\xa8\x96\x07\x1e\xa1\xac\x2e\x56\xca\xfa\x5c\x6e\x93\xf5\xeb\x7c\xa3\xc8\xed\x02\x56\xe7\x2b\xd5\x75\xc1\xe0\x8d\xcf\x02\xde\xfa\xd4\xdf\x23\x30\x3c\xde\x83\xed\x53\x1f\x2c\xb1\x43\xbb\x01\x4c\x97\x77\x4a\xca\x4b\x09\x44\xc5\x46\xc0\x23\xd3\x11\xf7\x09\x2f\xc1\x43\x48\xc1\xfe\x9e\xa8\xc5\x5c\x47\x3f\x82\x56\xe8\xfa\x94\x16\x7f\x1c\x6e\x5f\xdf\x09\x6a\x9c\x3c\x6d\x5f\x84\x0b\x1d\x96\x82\x63\x2c\xef\x6e\x5f\xcf\x3c\xd2\x93\x3a\x6f\x68\x51\x90\x92\xb9\x34\x6d\x29\xd7\x0b\x70\xca\xb8\xef\xbc\x3c\x80\xc2\xcd\xd3\xb4\x30\x8a\x42\x73\x99\xab\xf1\xd0\xcf\x12\xde\xe3\x02\x62\x93\x12\xde\x73\x6a\x64\x29\x52\xd1\xb0\x1f\x16\xba\x5a\xff\xff\xa5\xcb\x81\x51\xc6\x18\xa3\x0c\x6a\xdf\xf7\xe4\x7f\xc5\xde\x35\x4c\xb1\xa8\xfc\x81\x31\x0a\x95\x27\xe5\xb5\xef\xcd\x50\xdf\x75\xbd\xd8\xf2\x2c\xcb\xb3\x3c\xc7\xc1\x5b\x4f\x2d\x77\x4f\x8a\xf3\x2c\x13\xf3\xb4\xdc\x0f\xf3\x5a\x6d\xbe\x97\x9f\xaa\x20\xf9\x29\x1c\xf8\xa9\x0e\x0f\x44\xfa\x01\x4c\x8d\xc2\x5d\x5e\x95\x79\xc9\x1b\x08\x23\xab\x74\x32\x30\xfa\xbc\xde\xb6\x3d\x54\x7d\xe4\x87\x01\x74\x3c\x69\x69\x52\x29\x56\x59\xd0\xa2\xa0\x4d\xc1\x69\x54\x0c\x19\x6f\x8b\xaa\xa9\x00\x01\x22\xc4\x0b\x03\x9f\x8c\x06\xb0\xb4\x8c\x53\xc1\x57\x94\x4c\xc9\x67\xa1\xa4\x27\x49\x4d\xb3\xd0\x8a\x0f\x44\x24\xf9\x9d\xa2\xf3\x4a\xed\xd4\x52\xf2\xcd\x0d\x5a\xea\xb0\xbe\x46\x4b\x1d\xa9\x66\x25\xce\xa9\x7a\xde\x82\xa5\x96\xbc\x1a\xcb\xb1\xe6\x75\x04\x3d\x98\x60\x81\x60\xa4\x80\x4d\x5e\xcd\x86\xc3\xb5\x6b\x71\xed\xe6\xb9\xb8\x16\x77\x95\x20\x51\x21\xc9\x79\xcb\x2b\x70\xb0\x83\x3d\x70\x13\x6e\xf0\x96\x77\xdc\x90\xfc\xae\xc1\xfe\xdc\x9e\x1b\x92\xdf\x2b\x57\x97\x2a\x2c\x7e\x00\x6e\xe0\xea\x5e\x55\x66\x91\x0d\x9d\xc1\x1d\xb0\x8b\xa1\x2d\xc1\xe6\x8e\x01\xad\x35\x37\x78\x1c\x57\x06\xa7\xa1\xd0\x7b\x42\x88\x8d\xea\xa8\xd3\x60\x1b\x34\xb5\x99\x65\x47\xdd\xe0\xb0\xe0\xdf\x5a\x29\x79\x02\x84\x0a\x55\x90\x62\xc2\x20\xe5\x29\xe3\x29\x02\xf0\xf7\x1a\x66\x60\xa3\x39\x52\x90\xfd\x47\xae\x84\x50\x5d\xae\x30\x6b\x12\x92\x80\x63\xf1\x0e\x4c\xd0\x24\x4f\xc6\xd9\xbc\x52\x2c\xa4\xc8\xf3\x60\x75\xb1\x02\x4b\x65\x6f\x23\xc5\x22\xb2\x0f\x21\x42\xb2\x9e\xe9\xf7\x1f\x05\x51\x89\x80\xc6\x60\x4f\xed\xd2\x11\x52\x87\x69\xec\x05\x2d\xaa\xc3\xae\xaf\x15\x43\x2d\x05\xf1\x88\xb9\x6e\xef\x07\xb5\x51\x9b\x83\xdd\x44\x3f\xdb\xbc\x3a\x5b\xea\x78\xfd\x02\x83\xd8\xcf\x97\xb2\x04\xdb\xfd\xe1\x83\x7b\x96\x12\x4a\x49\xca\x70\x07\x09\x24\x9c\x4c\xff\xc4\x31\xf8\x80\xb6\x3c\xe7\xf9\x5e\x62\x6a\xc0\x0c\xa1\x59\xa1\x96\x42\xef\x5d\xad\x97\xaf\xef\xd5\x1b\xd8\xcc\x8a\x42\xe3\x43\x08\x29\x53\x68\x95\xf7\xc9\xb1\x9d\x0e\x42\x6a\xad\xd6\xa2\x15\x3f\x0a\xb7\xf0\x35\x78\x02\x23\xf1\x02\x2e\x56\x6a\xbd\x8b\x21\x6c\xe2\x34\xce\x58\x54\xf5\x55\x47\x5a\x31\x39\x33\x48\xfa\x3a\x89\x53\x92\xe4\x4d\x91\xee\xd1\xc0\x5b\xed\xf0\x4c\x64\xdf\x6a\xf4\x02\x21\x98\x2d\x9f\xcd\x56\x92\x43\x48\xce\xfc\x4f\xc1\xed\x91\x45\x2f\x6e\xee\x56\xaf\x9e\x5f\xe8\xb3\x48\x2e\xc7\xb2\xdd\xd2\xb2\x2e\x8a\xb2\x22\x24\x2b\x48\x5c\xe6\x41\x09\xa8\xe9\x14\x64\xf3\xa6\xee\xbd\x22\xa4\x34\x4d\x19\x4b\xc3\x24\x49\x69\x9d\xf1\x69\x8d\x1d\xe8\x10\x9a\x6b\x6a\x85\x3e\x87\xce\xa4\xd5\x48\xe8\xb5\xb0\x59\x6e\x56\xcb\xd7\xf7\xeb\xf9\x02\xe6\x5a\x53\x8c\x01\x66\x55\xc3\x53\x4d\x33\x1d\x1e\x82\x27\x78\x59\xa6\xb4\x3b\x1b\xc2\xa6\x8b\xbc\x31\x43\x80\xbd\xfd\xa0\x96\x6a\x89\x7e\x48\xa0\xe9\xe7\x8f\x6d\x3c\x17\x9c\xf5\x6e\xf3\x6a\x76\xf1\x0c\xad\x5e\x60\x8f\xb6\x79\x5e\xe4\x01\x0d\x1c\x5c\x8c\xbd\x15\x87\x2d\x20\x3e\xec\x51\xe7\x14\x61\xc6\x18\x35\x1c\x5c\xe4\x3c\xd4\xfb\xaa\xdf\x3f\x3e\xe7\x1a\x5d\xc8\xb7\x01\x5d\x5c\xaf\x4d\x65\x73\x18\xdb\xf5\x0b\x31\x63\x56\xaf\xe0\xc8\x98\x6e\x5f\x5f\xab\xa1\x17\x72\x4f\xd7\xc2\xb6\xea\xb6\x75\xc3\x07\x70\xc1\x8d\xf6\x28\x2d\xf2\x94\x10\xa2\x96\xcc\x18\x8b\xbc\x6f\xfa\x3d\x02\x0f\x1c\x28\x20\x1f\xdd\x3c\xca\x9a\x7c\xd2\x63\xb0\x85\x90\xda\xaa\xa5\xc0\x26\x2b\xe9\x00\x06\x2c\x10\x87\xae\x14\x63\xa3\xea\x39\x7d\x2b\xed\x51\x0a\x76\xf6\x83\x2a\x78\xd5\x39\xfa\x58\xea\x9a\xb3\x89\x4f\xde\xea\x57\x8f\x5c\xeb\x81\x4b\x9d\xcf\x1e\x1a\x78\x33\x63\x60\x6f\x9b\xae\x07\xa3\x6f\xab\xaa\xe3\x61\x9f\xc4\x49\xdc\xec\x11\xa1\x84\x46\xb9\xa2\xe5\x5d\xd1\x35\x25\x20\x42\x3b\x56\xd7\xac\x77\xa2\x22\x8a\xa2\xa8\xd8\xa3\xa4\x49\x12\x12\x07\xc4\x7f\x7f\x5c\x56\xb7\xcf\x37\xe6\xf9\x7a\x12\x94\x67\x9b\x57\x72\x5c\x5e\xc0\x89\x2c\xc7\x99\x17\x42\xf9\x30\x2e\xa0\xf3\x8a\x57\x11\x68\x49\x51\x24\x84\x10\x66\x60\xbf\x18\x9a\x1e\x10\x2f\x79\xcd\x7d\x1e\xe0\x2a\x8b\x8f\xa3\x22\xe8\x24\x47\x08\xd7\x33\x53\xca\xd6\x69\x46\x2f\xe5\x3f\x5c\x8b\x39\x2f\x36\xdc\x82\xf7\xae\x03\x6f\x3a\x9f\xf0\x2d\xce\xe5\xf9\x9f\x7b\x3c\xff\xc0\x2d\x72\x71\x7a\x1a\x05\xf4\x78\x91\x00\xd5\xf2\x42\xc0\x36\x2a\xd5\x66\xd6\x3d\x60\xc8\x0f\x40\x6d\x76\xa1\x92\x8d\x26\xee\x4a\xe8\x22\xe8\x32\x4e\xa4\x31\x05\x63\x1b\x4a\xb5\x51\xfa\x83\xbc\x17\xcf\xea\x76\x75\x81\x6d\x25\x13\x17\x28\x01\xa5\x3c\x64\xec\x69\x9d\x1f\x60\x01\x37\xb1\x8d\xbb\xd1\x14\xe7\x41\x00\x31\x24\x19\x37\x23\x6e\xca\x3a\x9d\x7d\xa7\x96\x72\x3e\xaf\x45\x9d\xaf\xef\x5e\xde\x3d\x99\xd1\xf3\xd9\xfc\x63\x38\xc5\x24\x4a\xec\x03\xf2\x28\x29\x2a\xaf\x6b\xba\x21\xe0\x9d\x04\x27\x8e\x23\x11\x8a\x99\x90\x2a\x09\x83\x24\xa0\x51\x9d\xc7\x59\x17\x06\x3a\x6f\x1e\x20\x0b\xc2\x68\xbb\xf7\x16\x9a\x5a\xa2\x1f\x97\x51\x48\x27\x58\x4c\x2a\x54\xaf\xee\x6e\x75\xb4\x32\x27\x3a\x17\x68\x6c\x3a\x34\xd1\x52\x90\xff\x23\x1a\x3b\x9f\x75\x61\x45\x8b\xbe\xca\xa9\xe1\xb8\x5e\xcc\xeb\x3d\xe2\x15\x27\xe0\x82\xd9\x76\xd5\xc0\x19\x8f\xa1\x85\x18\x5c\x20\x35\xcd\x3d\xdf\x4b\x68\x18\xd4\x3a\xd0\xa2\x2e\x9b\xad\xcd\x43\x57\x0b\x82\xaa\x92\x2b\xc1\xc4\x3c\xe7\x0d\x2f\x03\x12\x00\x85\x08\x08\x0c\x3c\xe6\x45\xcf\x07\x5c\x18\x45\x96\xa4\xe0\x20\x0c\x11\x42\x73\xa6\x56\x93\xae\xbe\x12\x48\x0b\x36\x1f\x80\x72\x7d\x33\x5f\x28\x6a\x53\x8c\x65\x5e\x63\xb7\xc0\x2e\xf7\x73\x5b\xd7\x9d\x0c\x6a\xee\xa8\xd5\x5b\x17\x47\x50\xa7\xa1\x9b\x71\x67\x9a\x47\x26\x42\x73\x53\x2d\xd1\xe7\xd1\xf3\x29\xe6\xc2\x7c\x7e\xa1\xab\x17\x82\xed\xad\x57\xe7\xab\x89\x84\x57\x1f\xc1\xe1\x08\x9b\xd0\x80\x31\xf0\x16\xfc\x3d\xea\xc6\xae\x04\x3b\x27\xb4\xe0\x1d\x78\x19\xcb\x32\xb5\x2c\x4b\x3e\xd8\x9a\xc3\xbb\xaa\x57\xbc\x24\x89\xe3\x91\x8d\x03\x21\xa9\x90\x5d\xf5\x7e\x98\x3b\x72\xce\xa0\xab\x87\xb1\x14\xe0\xff\xc8\x49\xe6\x28\xeb\x79\x29\xad\xc9\xde\x50\xf8\x79\xde\xf3\x0e\x10\x68\xb4\xce\x1c\x48\x21\x86\x00\xa8\x9f\xf9\xbc\xe6\x3d\xef\x78\x2b\xe8\xbc\x47\x68\x1e\x4b\x59\xb1\x44\x68\xb5\x3c\x3c\x2b\x58\x6e\xc4\x01\x5e\x43\x0f\x3d\x38\x10\x71\xc2\x0b\xbe\x1d\x40\x07\x6d\xbb\x55\x4b\x4e\x78\xce\x19\x4f\x55\xe3\x1d\x01\x53\xfe\x33\x0e\xbc\x1f\x21\xb5\x99\x70\x81\x10\x8a\x87\xc5\x77\x57\x0f\x93\xa0\x1c\x3d\xdc\xa9\x65\xce\xdd\x6c\xdc\x9e\x9c\xff\x81\x94\x55\x87\xf3\xf1\x50\x1d\x4f\x16\xa7\xa2\x7c\xb2\xbf\x64\xfb\x61\x1e\xaa\x35\xfa\x48\x5a\x10\xe7\xab\x93\x01\x38\x92\xd8\x72\x35\x0b\xb0\x36\x70\x31\x0c\x14\x28\xc4\x7d\xed\x35\xc5\x1e\xf1\x16\x0c\xd0\x09\xe3\x85\xa2\x8d\xb6\x07\x04\x22\x39\x18\x79\xc0\x1b\xde\x89\xc1\x30\xa1\x90\xd8\x04\xa1\xb9\x3d\xb5\x7f\xb5\x3e\xac\xd9\xb1\x5a\x6e\xe6\x76\x39\xea\x65\x89\x87\x12\xe7\x63\xa0\x96\x23\xc3\x11\x3a\xe5\xb7\xb2\xbf\xb7\x57\xcb\x2b\xa1\xe6\x2d\x55\xb5\xdd\xf9\x42\x4a\x2b\x85\x90\xd1\x89\x31\x63\x7a\x9a\xea\xef\x22\x43\x5c\x83\xf6\x83\xea\x49\x9a\x39\xca\x9a\xe5\x66\xf9\x0c\xad\x5f\x60\x94\xb1\xbc\x28\xf9\x30\x74\x56\xee\x66\x54\xd9\xee\xb4\x66\x3f\xe1\x2d\x84\xe6\x89\x5a\xa2\x1f\x14\xed\x82\x85\x6c\xd7\x3d\x6c\x60\x9e\xf4\x63\x4b\xcb\x32\xc1\x76\x37\x52\x5c\xc4\x63\xa5\x96\xa3\xc1\xb0\x3f\x46\xe2\xba\x14\x21\x75\xab\x96\x48\x15\x4f\x57\x80\x23\x9c\x56\xb8\x54\xcb\xb7\x43\x2e\xc7\xd4\x47\x68\x2e\xe4\xde\x99\x90\x17\xeb\xb3\x0b\x21\x40\x3f\x90\xd9\x4b\xaf\xcf\xd7\xa0\xe4\xdc\xd3\xf4\x1c\x74\xc8\x20\x03\xa3\xd2\x35\xee\xaa\x88\xf7\xe9\x8e\xa9\xe5\xbb\x60\x96\xbf\xf5\x94\x84\x00\x7a\x37\x3d\x9f\x83\x4e\xf2\xa1\x6c\xe3\x54\xd9\x06\x36\xf8\x76\xb9\x99\x87\xd5\x2e\xd3\xf4\xbc\x52\x02\x4d\x2f\x66\x25\xef\xd2\x5d\xaf\x96\xef\x3c\xd0\xa8\x62\x22\x0c\xe1\x7e\x98\x67\x8f\x78\xe8\xc8\x34\x4c\x24\xf1\x10\x9e\xf0\x10\x84\x10\x82\x2b\xe9\x91\xf1\x9a\x57\x3c\x9b\xa5\xc3\xe1\x83\x3b\x88\x21\xe5\x09\x67\x9c\x71\xb9\x28\x8c\x40\xab\x12\x75\xb6\x02\xc8\x22\x8c\xbd\xc3\xb3\xfd\x1c\x3a\x3f\xac\x15\x6d\xce\x2e\x9e\xcd\x56\x57\x07\x71\xbf\x52\xb4\x0a\x7a\x81\xa6\x05\x1e\xe1\xc3\xb6\xce\xf3\x9c\xcb\x57\xaf\xa9\x65\xdb\xb6\xdb\x8c\x32\x32\xd9\xc1\x21\xe4\xa1\x6c\xaf\xd0\x84\xd0\xd5\x73\x75\xf1\x52\x79\x64\x6e\xba\x72\xd2\x68\x15\x79\x60\x24\x7c\x20\xbe\x68\xf0\xb1\x03\xd5\xb1\xdd\x46\x9e\xb0\x14\x74\xd9\xe0\x43\x07\xc6\x06\xdb\xef\x35\x5e\xf2\x76\x1d\xa1\x79\x24\x69\xe0\xe2\xb1\xfd\xba\x0a\x6b\xb8\x3a\x32\x1a\xdc\x54\xd0\x81\x06\x88\x77\x40\x3b\x9e\xf3\x0c\xcc\x2c\x67\x25\xef\x71\x38\x66\x6a\xd9\x34\xbc\x8b\xc6\x18\x87\x8c\x12\x92\x4e\xb4\x38\x47\x6a\x2d\xa4\xf0\x11\xf7\xdc\x5c\x5f\x09\x65\xee\xe5\x81\xb5\x08\x0e\x3d\x7b\x2e\xc6\xc9\xc4\xa8\xef\xaa\xda\x73\x78\xd5\xe6\xe2\x26\xdd\xe0\xb5\x65\x9e\x25\xd8\xcc\xb8\x98\x73\x95\x5d\xf8\x71\x12\x3a\x76\xec\x35\x34\x6b\x82\x2c\x48\x82\x38\xac\x4a\xd2\xd4\x82\x3e\xd8\xa1\xfd\x8b\x69\x6e\xdd\xae\x2e\x56\xb3\xb0\x1a\xb7\xb3\x66\xdc\xaa\x7a\x9e\x1f\x6c\xac\x73\x5f\x2d\x05\x37\x82\xe5\x33\x31\x9a\x72\x72\xc8\x18\xb6\xe5\x5c\xb0\xae\x8e\xf7\xbc\x29\x9b\xa6\xaa\x35\xb5\xdc\xf9\x5b\x21\x8c\xb7\x4a\xb1\xf3\xca\xb2\x2c\x95\x12\xc1\x81\xb7\x97\x93\x3d\x12\xd6\xb0\x81\xe7\x97\xe7\x6a\x53\x8f\x75\x35\xd6\x35\x24\xb6\x15\x4c\x40\x7c\x67\x52\x0a\xa6\xb4\xfd\x10\x84\x16\x62\x7e\x89\x09\xba\x39\x3f\xbb\xbc\xbb\x3f\xdf\xc0\x7a\x92\x07\x6b\xd8\x9c\x3f\x3f\xbf\xbb\x57\xb2\xba\xf3\x0c\xc3\xaa\x6b\x4e\xab\xad\x65\x59\xe6\x50\xf2\xa4\xee\x0c\xcb\xb2\xd4\x72\x97\xf3\x81\xb4\xb9\x12\xbf\xf5\x94\x9c\x14\x75\xbc\x0b\xd4\x72\x47\x62\xbe\xdd\x66\x13\xff\x4a\x0f\xbc\x56\xf2\x96\x0f\x60\xfd\x81\x10\x39\x1b\x98\xc7\x1d\x8f\x78\xd0\x60\x8d\xdb\x0d\x24\x10\xd7\xdc\xc1\x64\x4c\xf0\x16\x57\x32\x3d\x3a\x40\x20\xd4\x9d\x03\x9f\x46\xe2\x9a\xe5\x7a\x09\x9b\x19\x02\xd6\x8e\x43\x35\x0e\x2d\x6e\x70\xbf\x4b\xc7\x1a\xdb\xca\xa4\x9f\xb4\x08\xcd\xad\x69\x0c\x04\xae\x97\x48\x70\x35\xb7\xde\x15\x4a\xb0\xab\x66\xe6\xae\x50\x22\x3a\x4b\x73\xfa\x2e\x9d\x74\x41\x87\x57\x6a\x3c\x3d\x1b\x38\xf2\xec\x78\xac\xb1\x23\xa3\x43\xaa\xf9\x96\xbd\xb5\x3f\x43\xaf\xc1\xad\x62\xd4\x62\x26\x4f\x7a\x0d\x60\xca\xab\x59\x3d\xd5\xa3\x1e\xa2\x3e\xb1\x54\xc3\xc4\x2c\x2a\xd4\x86\x7d\xaa\x49\x7e\xa6\x61\x4b\xdd\xaa\x95\xc4\x34\xe2\x21\x7d\x00\x58\x83\x5c\xc2\x23\xca\x2b\x6c\x29\x6c\x17\x09\x90\x33\xf9\x7e\x2b\x4d\xdb\x7b\x52\x8f\x5d\xdd\xae\x34\xed\xff\xd9\x6a\x1a\xaf\x88\xd4\x61\x67\xed\x2c\x9b\x9b\xb2\xdd\xeb\xeb\x9b\xdb\xcd\xf3\xcb\x59\x96\xb2\xa4\xf3\xc3\x59\x4b\x0a\xbd\x48\xa6\xb9\x63\x09\xbc\x3b\x0b\xd1\xa5\xd0\x4a\x56\x37\xeb\x03\xd8\xbd\x3f\x05\x47\x4b\x65\xf1\x05\x38\x20\x5d\xd5\xb3\x34\xb2\x2d\x2a\x6c\xb4\x29\xc9\x4a\xb7\xee\xda\xa6\x28\xba\x3c\x8e\xb3\x92\xe5\x39\x03\x5f\xd7\xdc\x24\xf1\x49\x58\x96\xa3\x8e\x0d\x4d\x8b\xa3\x20\xc8\xe9\x01\xf3\xcf\xad\xb9\x81\xce\xd0\x17\x11\xba\x5a\x2f\x04\xaf\x7e\xb6\x10\xb0\x5f\x30\x88\xf5\x8b\xfb\x53\x60\xdb\xeb\x26\x29\x35\x2d\x1e\x3a\x40\x7c\xdb\x76\x75\xc6\x58\x56\xb0\x8c\x90\xb9\xc1\x49\x40\x73\xde\xca\xb9\xd5\xd1\xb6\x69\x9a\xb2\xef\x2b\x39\x7e\xfe\xa1\x3f\x82\x13\x2c\x9e\x18\xbc\x0e\xa2\x50\xad\x1d\x96\x96\x65\x51\x16\x34\x69\xf6\x88\x0b\xe5\x5d\x2f\x66\x26\x73\x9a\xa6\x6e\xdc\xcc\x11\x7f\x83\x71\xe0\x2d\xd0\x0a\x3c\x3e\x37\xd0\x72\xf2\x34\xcf\x27\x48\xb1\x79\x75\xb9\xb9\x59\x6e\x96\x6b\xe5\xd1\xaa\x66\xaa\x96\x9e\xf4\x9d\x50\x36\xdb\x3e\xd1\xb5\x92\xd8\xa2\xbd\x59\x06\x1e\xcd\x8e\x95\x66\x19\x94\x9f\xf6\xb0\xb5\xfa\xaa\x69\x9b\x66\x7a\x06\xda\x7e\x50\xb7\xb3\x10\x2d\xe5\x2c\x5b\x9d\x9d\x40\xc2\xcd\x2b\x74\x71\xb5\x92\xf7\x50\xb7\xbb\x46\x83\xb0\x29\xf3\x76\x8f\x78\x03\x66\xdf\x82\xbe\x6b\x70\x94\x11\x92\x63\xc4\x89\x9f\x79\x60\x0b\x58\x03\x0e\x1f\x3a\x8b\x66\xd9\x81\x2e\x9b\xb9\x29\xc7\x63\x5a\x9a\xf3\x6a\x02\xa2\x72\x70\x3e\x86\x95\x4a\x78\x5a\xf2\x0a\xdc\xb2\x49\x13\x2b\x8a\x92\x00\x52\xa5\xda\xb9\x4a\x15\x9b\x61\x55\x98\xd4\x08\x13\x99\xd4\xa2\x40\xcb\x8d\xb9\x35\x0b\xd1\x35\x7a\x85\xbe\x2e\xb4\xb6\xc5\x64\x45\x92\xb6\xef\x9f\x84\x57\x92\x19\x4a\xbb\xf8\xf5\xed\xeb\x7b\x69\xf8\xda\xbc\xba\x3c\x3f\x31\x31\x29\xeb\x13\x9d\x6e\x6e\x55\x6e\xdf\x38\x56\xe8\x07\x75\x59\xf1\x86\x37\xc3\x00\x46\x48\xe2\xa4\x6b\x43\x2f\x22\x44\x68\x76\x29\x61\x0d\x21\x8c\x75\x5d\x34\xf3\x62\x23\x48\x59\xad\x39\xbe\x65\x31\x5a\x95\x8c\x35\xae\x15\xc7\xbe\x59\x84\x45\x63\xf0\x3c\x4e\x04\x30\x8c\x47\x16\x86\x41\x10\xc7\xbe\x8b\x00\x1b\x08\xa9\xfd\xdc\x40\xcf\xe4\xba\x38\x8b\x49\xc7\x14\x52\x5c\x36\x6a\xb9\xc6\x46\xa9\x69\xc9\xd0\xd7\x65\x42\xaa\xac\x9c\x1b\xdc\xa6\x79\xd5\x8c\x36\xae\x68\x52\x74\x63\x3d\xc9\x47\xb5\x9c\xeb\xe8\x07\xe4\x28\x9e\xea\x08\x57\xb7\xab\xa5\x7a\xb1\xba\xbd\x9a\x45\x8e\xed\x38\x8e\x63\x3b\x35\xdf\x42\x05\xe1\x8e\x42\xa0\x66\x42\x5d\x70\x1c\x67\xec\x8c\x64\xe7\x19\x49\x62\x4c\xf2\x8a\x1b\xb3\x4e\xd6\xf7\xc3\x4f\xeb\x83\x03\xea\x11\xd5\x8a\xe2\x59\x27\x6a\x14\xff\x47\x9b\xb0\x34\xe1\x21\x0e\xda\x36\x7b\xa8\x77\x1b\x32\x2b\x8e\x66\x8e\x91\xbc\x73\x8b\x89\xfe\x05\x8f\x37\xe7\x86\xc0\x43\x92\x8d\x1e\x31\x91\xa2\x63\xa3\xe5\x06\xd6\x5a\x1e\xa4\x65\x89\x2d\x6c\x72\x6b\xa4\xb0\xf5\x79\x30\x37\x46\xc9\xc3\x7c\xd9\x4f\x43\xca\x87\x87\x9e\x29\x39\x1f\x64\x87\x18\x04\x2a\xd1\xd3\xb7\xc9\xa1\x1f\x00\x42\xee\x0e\xb3\x50\x6a\xaa\x0f\x03\xfa\x78\xb0\xb9\x14\xa3\x7d\x79\x18\xf2\xb9\x13\x45\x84\x14\x62\x57\x32\x43\x0b\x9b\xad\xa7\x45\x5d\x51\xe2\x8a\xa4\x65\x31\x66\xe2\x5b\x8c\xf7\xcc\xa3\x79\x59\xd6\xb5\x68\xd2\xf1\xf9\xcd\x42\x81\x4c\x56\xef\x57\xfd\xfc\x62\xa9\xda\xf2\xb1\x31\x43\x3e\xc3\xe3\x33\x13\x75\x88\x67\x88\x30\x6c\xf7\xc3\x5c\x9b\x85\x0f\xf8\xe9\xc8\x6b\x10\x9c\x90\x25\x6c\xc1\x18\x7a\x30\x79\x3f\xf4\xbc\x53\x7c\x69\xb9\xcc\xf3\x0c\x5b\xa0\x83\xc5\x1b\x01\x7a\x78\x0b\x36\x68\x8d\xf8\xb4\xed\x34\x6f\xed\xc3\x7c\x38\xf0\xb3\xe7\x8f\x2d\x9b\xee\x71\x7e\x42\xec\xb8\xd7\xb4\x92\x98\x7a\xda\xb5\xa0\xed\x51\x37\xb4\x79\xc6\x8a\x8c\x31\x4a\x7d\x1e\xcd\x6d\x92\xf1\x96\xf7\x7c\xe0\x9d\xd2\x56\x7d\x5f\x36\x4d\xdb\x48\xfe\xc3\x0d\xb5\x39\xde\x03\x36\xf7\x1b\x31\xc2\xf7\x8f\x7c\xe8\xfc\x94\x01\x19\x9a\xc1\x4a\x5d\x4f\x86\x56\x70\xa1\xae\x4b\x8f\x0c\x48\x29\xe9\xa7\x0d\x34\x56\xfa\xc0\x88\x46\x76\x64\x41\xd2\x2e\xa6\x16\xb3\x50\x5a\xe6\x17\x4f\x87\x58\x2d\xec\x24\xca\xf3\x92\x1a\x1a\x19\x92\x99\x9d\xdb\x45\x39\x16\x33\xaf\xee\x04\xad\xed\x07\x35\x9b\x85\xc8\x3c\xb1\x0d\xbd\xbc\x3e\x61\x2f\x17\xcf\x9e\xab\x5f\x04\xc9\x23\x70\x54\x17\x84\xf8\xdc\x4f\xda\xa6\xce\x9d\x92\x24\x89\x07\x7a\x9e\x74\xdd\x60\xe7\x81\xef\xbb\x6e\x41\xc2\x34\xf7\x98\xe7\x7a\x8e\x13\xbb\x34\xa4\xc5\xd1\x66\x96\xab\xf1\x51\xb7\x93\x91\xfa\xb7\x57\xe7\x93\x39\x53\x0c\xae\x9a\xa5\x49\x59\xf2\x2d\x68\x7e\x04\x25\xf7\xc2\x30\x64\xc4\xcc\x0b\x9c\x84\x36\x98\xbc\x25\x23\x89\xc2\x49\x07\x33\xf6\x83\xda\xcf\xbc\x09\xe5\x3e\x3b\x2a\x18\xeb\x83\xd0\x5b\xe2\xe6\x94\x96\x66\xde\xe8\x0a\x6a\xc2\xce\xbb\x92\x66\x65\x8b\x6b\x49\xf3\x15\x42\x73\x67\xe6\xa1\xcf\x09\xbd\x60\x23\x57\xd2\x82\x0d\x28\x84\x3b\x15\x18\x81\xae\xc9\x97\x97\x3a\x33\x6f\xf4\x5b\xcf\xda\xe2\xe2\x5d\x39\x61\x1c\x03\xa1\xb9\xb8\xf7\xa5\xd0\xaa\xd7\x47\xf0\x24\xe1\xd4\xe1\x0b\x66\xdb\xad\x66\x1b\x79\xcb\xfb\x2a\xb5\x4c\xcb\x2a\xea\xdc\x36\x4d\x8b\x94\xbc\x53\xb2\xc1\x1b\xd9\xcc\x1b\xcb\xac\x69\x52\x1c\x8d\x2c\xcf\xeb\x1c\x7b\xa2\xf6\x83\x6e\x36\xf3\x64\x64\x8d\x84\x4e\x12\x43\xad\x15\xc6\xfd\x06\x3c\xf0\x6b\xee\x43\xdd\xf0\x8c\x67\x0d\xb6\xb1\xc1\x43\xc8\xc6\x7e\x6c\xa0\xe2\xee\xd4\x27\x6e\xcc\xf5\x99\x87\x9e\x4b\x5c\xf8\xfc\x72\xf3\x5a\x34\xe7\x0b\xb0\x3e\xd8\x27\xbf\x0e\x50\x55\x60\xb9\xa6\xe6\x6f\x4b\x6e\x7b\x55\x16\x85\x5e\x14\xc5\xb6\x2d\xfa\x99\x45\xba\xe8\xa7\x59\x51\x9d\xea\x81\x5c\x8a\xeb\xc0\x4b\x8a\x99\xf7\x14\x67\xa9\xc5\x2e\xc3\x74\xa4\x8a\x3d\x26\x98\xa5\x8a\x4b\xe8\xae\x99\xce\x8f\x78\x25\xf5\x45\x21\x65\x9f\x3d\xdf\x5c\x98\x2f\x6f\x97\x93\x4f\xfb\x76\xf9\xfa\xe5\x4a\x7a\xa0\xa5\xfd\x60\x96\x16\x39\xdf\xee\x51\x59\x14\xa5\x10\x76\x79\xc1\x07\xd0\x8d\x30\xa2\x79\x06\x56\x18\xb2\x30\x04\x33\xcf\x59\x18\x6d\xf7\xc8\xd4\xcd\xfd\x84\xe3\x4a\x6e\xcc\xbc\xb9\x21\xb1\x92\x90\xdb\x25\xa5\x73\x63\x3b\xdd\xdb\xe2\x95\xca\xa6\x7b\x83\x7e\x75\xfb\x72\x29\xe6\xd4\xad\x39\xbb\x58\x4e\xbe\xef\x8b\xe5\xb3\xd9\x4a\xb4\x44\x49\x41\xe7\x43\x5e\x08\x8c\x2f\xee\xbf\x47\x7c\x5b\x08\x2d\x50\xdc\x08\xd0\x36\x0a\x59\x9e\xf3\x4e\x36\x82\xb7\x59\x4e\x05\xe5\x01\xb6\xb1\xa7\x36\x4a\x20\xe7\xd7\xed\xdd\xe6\xd5\xec\xe0\x81\x7b\xb9\x7e\x81\xed\x88\x86\x60\xba\x51\x1a\xd1\x88\xf7\x6e\x84\xbd\x3c\x4a\x92\x2c\x8a\x11\x46\xee\xde\xc0\x21\x38\x13\xef\xba\x3f\xf1\xda\xdc\x9f\x38\xf4\xdc\x2c\x8e\x33\xb1\x25\x81\xeb\x04\x81\xe3\x06\xd6\xf4\x77\x16\xbb\x41\xe0\xba\xbe\x2f\x9f\x31\x81\xad\x52\xcc\xc3\x43\x0c\xd3\x7a\xb9\x52\x0a\x4e\x4b\x6c\xa9\xf5\xce\x9e\x45\x93\x9f\xd7\xdf\x47\x38\x51\x1a\x71\xce\xa5\x54\x8a\x7d\x88\xcb\xb1\xd5\x94\xf6\x9d\x8c\x05\x71\xf7\x3a\x0e\xc0\x9e\x62\x41\xf0\xcd\xfd\x0c\x07\x69\xb6\x8d\x41\x27\x11\xa0\x2a\x6c\xc5\x39\x09\xb6\x60\xab\x48\xbf\xc3\xa9\x0f\x2a\x89\x7d\x3f\x16\x1b\xee\xc4\xb7\x17\xc7\xe2\xdc\x7d\xa2\x10\xb5\x10\xfa\x3e\xe8\x48\x2e\x30\x28\x17\xb5\xbc\x55\x88\x80\x76\x11\x44\xe1\xd8\x62\x57\x1b\x99\x5a\x8c\x68\x8c\x73\x52\xe0\xa8\x88\x9b\x1c\x61\x14\xef\x75\x85\xce\x22\xf4\xa1\xb4\x7a\x60\x99\x69\x3d\x5f\xab\xb7\x57\xf7\xcf\x2f\x9e\xa9\x4b\x1d\x2f\x6e\xbe\x06\x1f\x81\x92\x78\x24\x25\x8e\xde\x87\xbc\xc3\xa9\x95\xf0\x38\xcd\xc3\x34\x56\x6a\x9e\xd7\x7e\xd7\xeb\x86\xc6\x74\x3d\x34\x74\xa1\x34\xd7\xbc\x4f\x52\x7f\x0b\xfa\xc1\x07\x80\xe2\xbd\xa1\xb0\x99\xd0\x8b\x11\xcc\x0f\xef\x42\x43\xe7\x0a\x0b\x73\x96\xa5\x11\x74\xe5\x2c\xc8\xeb\x9d\xad\x58\x79\x12\x43\x2e\xd4\x18\x40\xc5\x5e\x53\xfc\x59\x23\x63\xab\x44\x23\x5e\x2e\xa7\x57\xec\x8b\xe1\x54\xfc\x76\x08\x20\xe1\x79\x06\x88\x81\xa6\x04\xe3\x96\xbb\x84\x94\x38\x8d\xb9\x8f\x3d\x40\x13\xad\xa2\x64\x4f\x94\x54\x69\x8e\xf1\x46\xc7\xc0\x61\x25\xdd\x6d\xc1\xd9\x62\xba\x05\x3b\xa1\x8a\xc9\xd8\xae\x9b\xe2\xd7\xf6\x86\x92\xce\x4a\x39\x12\xeb\xf3\xc7\x54\x08\x05\x8b\xf6\xaa\x53\x26\x8c\x92\xe6\x9a\x1f\x98\x91\x16\x9a\x96\x46\x9b\x08\xb4\x9c\x27\x90\xd1\x5c\xd1\x77\x6d\x12\xe8\x99\xe1\x60\xc4\xfb\x3e\x06\x1d\x72\x8d\x81\xc1\x87\x29\x6f\x4a\x57\xd8\xac\x92\xc8\x47\xe6\x08\xde\xa8\xe7\x0b\x65\x71\x73\xaf\xdc\x9f\xcb\xb1\x56\x12\x2f\x4f\x52\x4f\xe3\x6d\x44\x63\xa6\x33\x93\x5a\x10\xd9\x91\x62\xf1\x62\x1b\x15\x60\x69\xde\xce\x37\x95\xca\x64\x06\xb8\x26\x2f\x5d\x33\x32\x74\xd9\xe6\x42\x49\x95\x41\xc6\xbb\x5c\xdd\xaa\xe7\xab\x5b\x55\xd9\x28\xe9\x88\xa0\xd5\x79\x8c\x2d\x9d\xfa\x1a\xd5\x14\x93\x6a\x3b\x19\x37\x59\xee\x6d\xc5\x9b\xb9\x82\x56\xd4\xf5\xed\x49\xe6\x9c\xe2\x31\x19\x29\x6d\x42\xc7\x75\x4c\x9a\x90\x41\x46\x21\xa0\x32\x0f\x5a\xb4\x3d\x42\x2a\xfa\x82\xc4\x7f\x82\x66\xcf\xae\x30\x52\xaf\x6f\xee\xd0\x39\x2c\xae\x6f\xee\xcf\x70\x44\x3c\x37\x0d\x20\xb2\xf8\x96\x6f\x6d\x6f\x00\xcd\xe4\x29\x71\x7d\x12\x62\xea\x81\x5e\x7b\x7b\xc4\xc6\x72\x1c\x98\xe7\x24\x18\x61\x7d\xec\xbd\x6e\xf0\xf8\x56\x8c\x0d\x4e\x15\xa6\x3c\xe8\x5f\x0a\xdb\x35\x8a\x8d\xd3\x7a\xf2\xc5\x53\xa5\x51\x1b\xf4\xa1\xc4\xf4\xf3\x69\xe8\x3e\x0f\x37\x13\x7d\x2a\x18\xae\x6f\x5e\x7e\x04\x4a\xa9\xe5\x2e\x4d\x7c\x8d\x13\x5e\x6a\x78\xb0\x08\x77\x35\x8d\x37\x66\x02\xba\x6a\x44\xdc\x09\xc2\x0e\x5c\xcd\xd0\x4a\xcd\x88\x0d\xa3\xe7\x64\xec\x78\x67\x86\x03\x74\x20\xed\x6c\xc8\xda\x67\x4a\x3b\x77\xde\xa7\xd1\x36\x2a\x2b\x5a\xa5\xd8\xe9\xd4\xa6\xee\xdf\xa5\x4a\xce\x0a\x02\x3d\xd4\x13\x7d\xa5\x0a\x99\xbb\xd2\x96\x20\xe6\xdd\xdd\xd9\xf9\x09\x91\x92\x3d\xe2\x75\xb8\x6d\x35\x1e\x95\x60\x96\xe0\xcc\xb2\x31\xe6\x88\x66\x11\x10\x68\xc8\xb8\xc5\x05\xd8\xbc\x41\x80\x6c\xe4\x28\xb5\xea\x4d\x11\x8f\xd3\xd3\xb8\x90\x09\x24\xbb\x08\x62\xde\x29\x88\x77\x10\x39\x85\x52\x14\xc5\xce\x47\x80\x9c\x3d\x53\xea\xb9\xfd\x19\x74\xaa\x48\x3a\xbd\x92\x74\x5a\x57\x5a\x18\x59\x89\x1e\x5b\x96\x96\x0f\x29\xb8\x15\x77\xa0\x2b\xab\x99\xbb\xf3\x69\x64\x14\x86\x8b\x03\x5e\xf2\x6d\x0a\x1e\xf4\x5a\xa1\x81\xcb\xa7\x38\x34\xe4\xed\x4b\xa5\x9c\x3b\xb2\x7e\xe5\xf1\x95\xef\xcb\xf3\x1b\x0c\x37\xe8\x7c\x7d\xab\x0a\x20\x5c\xea\x49\xe4\x12\x3d\x36\x1c\x57\x2b\x2d\x5e\x51\xb0\xf5\x2d\xa0\x72\xd6\x8c\x0e\xcf\xb7\x46\x65\x11\x30\xb0\xa1\xed\xb6\x9c\x25\xe0\xe3\xbc\xd0\x20\xe2\x4c\xf2\x3f\xa2\x54\x72\x2d\x0b\x04\x62\x16\xa8\x37\x57\x72\xbb\x3f\xbf\xba\x50\xcf\xaf\x94\x8a\x67\x56\x61\x71\xa6\x41\x64\xf0\x46\x03\x5b\x2f\x74\x70\x79\x6d\x40\x88\x7d\x73\x0c\x35\x4c\xad\xc2\x82\xd8\xcc\x4d\xf0\x35\x5e\x99\xb9\xc9\x89\x75\x6c\x7b\xa2\x94\x73\x4f\xb4\x5d\xbd\x41\xe7\x37\x2a\x5e\xdc\xc8\xb5\x29\x24\xc1\x2c\xe6\x8b\xcf\xc1\x62\x0e\x76\x02\x65\xac\xf3\x3e\x48\x59\xe3\x95\x86\x09\x9a\xc3\x0c\x4d\xb7\x48\x94\x12\x06\x9e\x62\xe9\x3a\x6f\xb6\x31\x50\x18\x6c\x12\x69\x56\x62\xe8\x86\xe6\xf1\x8e\x7b\x79\x3d\xdd\xc7\xdc\x53\xa5\x9b\xbb\x93\x57\x70\x81\xe1\xe6\xe5\xb9\x7c\x25\xfe\x74\x2f\xa5\x1b\x34\x9d\x5b\x09\x50\x5d\xab\xbc\x28\xab\x82\xd2\xb4\xb0\x33\x33\x9a\x31\xe5\x35\xdb\x62\xa7\xec\x8b\x18\x7c\xac\xd9\x25\xd3\x26\x1e\x59\x2a\x54\x75\xa7\xb8\xb5\xe3\xbc\x54\xa8\x34\x04\x8f\xb9\xa2\x7b\x24\x57\xf2\x43\x5c\xb5\xb5\x27\x4a\x3b\xd7\x24\x12\x5f\x5f\xe8\xea\x91\x39\xae\xe5\x6b\xe3\x27\x2e\xd5\x52\x6e\xa7\xc0\x78\x57\x52\x2a\xc8\x8f\x2a\xed\x76\xcc\xb6\xac\xc2\x5e\x31\x0e\x58\x2f\xe4\xab\xf4\x53\x9e\xca\xb5\xf8\x89\x52\xa9\x3d\x52\xa7\xb5\x87\xe4\x84\x7e\x0e\x58\x48\x92\xc3\xf4\x7e\x8e\x2d\xc1\xf0\x0b\x6c\x12\x4e\x84\x44\xd1\x20\xa0\x3c\x0b\xe3\xca\x2f\x67\x5d\x4a\x12\x92\x70\xc6\x0d\x8e\x18\x23\xd0\xc0\xc0\x33\x1a\xc6\x54\xd0\xaa\xbe\x8f\x94\x5e\x2d\x04\xdf\x13\xb2\x0e\xab\x13\x27\x15\x0f\x63\xbe\x98\xe3\xc5\x99\xd2\xb3\x2c\xcd\xf9\x36\x86\x96\x72\x0b\x5b\x66\x6a\x6b\xa6\xef\x14\x66\x04\x7e\xc7\x8b\xa1\x80\x4c\xb1\xb5\x42\xb0\x3b\xc7\x28\x78\x93\xf2\xad\x18\x03\x7b\x9f\x2b\xcd\xdc\x91\x3e\x11\xac\x48\x7e\x2a\xc3\x73\xee\x17\x0f\x49\xf4\xe7\x9b\xe5\xc4\x59\xb3\x38\xa7\x6e\xa9\xf1\x42\x73\x19\x69\xf4\x21\x6d\x29\xd3\x73\xad\x04\xea\xc4\x33\xc4\x29\x6f\xc3\x04\x2a\xcd\x1d\x9d\xd8\x31\x2b\x9d\xb6\x38\x33\x4b\x03\x5a\xee\x3a\x46\x6a\x48\x5d\x13\x59\xfb\x54\x69\xd5\x41\xae\xcf\x84\x1e\xc7\x06\x2b\xf7\x67\x4a\xeb\xf0\x82\x37\x14\x6c\x30\x6d\xce\xca\x20\x2e\x88\x5a\x8e\xe1\x68\xd7\x59\x85\x43\x5c\x8c\x7a\x08\x25\x68\x21\x2f\x8e\xb4\x93\x28\xdd\xdc\x47\x3f\x24\x6a\x12\x94\x73\x58\x59\xed\x46\xae\xba\x7f\x7e\xb9\x90\xc3\xa3\x94\x94\xa3\x14\xb4\xcc\x2f\x22\xea\x87\xa6\xc6\x59\xc8\x68\x13\xe6\x16\x04\x36\x99\x55\x3b\x8f\xc7\x59\x0d\x61\x90\x92\xd0\x1f\x1a\x8d\x17\x62\x2e\x87\x58\x77\x4b\x33\x32\x0c\x39\x46\x89\x52\x1f\xe8\x64\x75\xa1\xe3\xc5\xb5\xa4\x94\x5b\x75\xa9\x4e\xcb\x97\x0a\x1e\xc3\xb3\xaa\x31\x7d\x98\xb2\xb4\xb6\x36\x34\x9d\x17\xe6\x10\xe2\x4e\xe7\x05\x4f\x89\x17\x14\x58\xd3\x05\x77\xb0\x73\x87\x52\xcf\x91\xbe\x45\x05\x99\x72\x3c\xca\xcf\x92\x09\x0f\x03\x83\xd3\x3c\xf0\xf3\x08\x98\xc3\x07\x5e\xeb\x42\x22\x22\x97\x7b\xb9\x1b\xe5\xb1\x42\x7d\x70\x7b\x9f\x77\xf9\x68\x8c\x4d\x6e\xa4\x04\xb6\xb8\x1e\x49\x00\x08\xac\x40\x8c\x94\xc0\x6d\xa9\x52\x49\x5b\xa0\x3e\x49\x86\xf3\x95\xec\xc4\xdd\xd9\x24\xb0\xc6\x00\xe7\x09\x2f\x58\xe3\xba\x45\xcc\x99\x92\xaa\x7a\x3e\xc6\x3c\xe0\x94\x06\x4e\x0a\x1a\x08\xd5\x07\x01\x08\x19\x32\xcc\x6d\xa9\x8f\x4f\x59\xfa\x9b\xe5\x4c\x19\xbc\x66\x28\x4b\x30\xf0\x96\x11\x7f\x17\xcc\xb3\xb1\xf2\xa7\xe7\x63\xef\x99\xd2\xcc\x2d\x39\x17\x0e\xe3\x76\x77\xb6\x7c\x7d\x23\x6e\xba\x39\x5f\x29\x0d\xa7\x64\x70\xdc\x2a\xd5\x38\x81\x44\x2b\x35\x88\x95\xb6\xe2\x11\x2f\x98\xef\x87\x60\x40\xea\x07\x39\xe4\x3c\x40\x18\x79\x08\x29\xa5\xea\x1c\x7c\xb0\x87\xe0\x29\x25\x1a\x2d\xdc\xfa\x3b\xaa\xc4\x33\x9a\xbf\xad\x8b\x23\xef\x4a\x95\x52\x6d\x24\x76\x5f\x5c\xdf\xc8\xe7\x75\xa0\x8d\xf3\x1b\x75\x31\x61\xb2\x05\x56\x9e\x2b\x25\x09\x23\xb6\xf5\x3c\x40\x79\x9e\x27\x24\xf3\x5d\x9d\xb7\x3d\xf6\x2c\x62\xfa\x09\xab\xd3\x8c\xf2\xa6\x0e\xdc\x02\x82\x86\xd2\xa4\xec\xc1\xd5\x74\xad\xd0\x4c\xa2\x9b\x3a\x0f\x78\x5b\x49\x9a\xd6\xe5\xb8\x38\xe8\x52\x22\xf6\x47\xa9\x77\xa3\x4e\x91\x2e\x5f\x87\xe7\x17\xcf\xce\xe5\xfc\x57\xbc\x98\x55\x09\x89\xa1\x6c\x35\xde\x0a\x2d\xb1\xca\xac\x34\x89\x72\x16\x96\x33\xab\x2e\x77\x3d\xf6\xa3\x88\x80\x0b\x91\x66\x64\x82\xcf\x8b\x9b\x59\xa3\x4b\x9a\x34\x65\x12\xa7\x10\x25\x55\xb7\x12\x37\x4b\x29\xa2\xa4\xe1\x38\x50\xd8\xfa\x6a\xf3\xae\xe4\x88\x42\x39\xb3\x10\x96\x74\xd5\xa9\xc7\xf8\x7f\x49\x46\xf2\x1d\xc2\x4b\xa5\x63\xbd\x55\x98\x3c\xd3\x06\xda\x1a\x04\x6b\x33\x47\xdf\x79\x4a\xf1\x6e\x3b\x16\x14\xeb\x4a\x79\xc8\x41\xd8\x57\x4a\x3a\xd7\xc4\xb3\x9b\xf4\xdc\x8f\x60\xb3\x14\xc4\x3e\xad\xb2\xa1\xa4\x43\x55\x93\x02\xec\x2c\xac\x39\xf3\x49\x41\x4a\x9d\x02\x9a\x95\x63\x55\xe6\x69\x53\x73\x2f\xf7\x0e\x18\x9e\x28\x85\x4a\x25\x7f\x9f\xa8\xfa\xfe\xec\xf1\x21\x28\xc4\xe1\x25\x6f\xac\x10\x4c\x92\xdb\x1a\x67\x1d\x8e\x2d\x36\xab\x47\x3a\x96\xc4\x09\x49\x0f\x3a\xb6\x74\x43\x2b\x74\x23\xd5\x05\xf1\x22\x1d\xe9\xca\xa0\xda\x42\x77\xb9\x5a\x20\xe5\x7a\xfd\x62\x31\x5f\xdc\x9c\x4b\x57\xf6\x90\xf1\x3a\xd2\x35\xdd\xf4\xa3\x6c\x70\xfd\xd0\x8b\x43\xdc\x82\xe3\x44\xdb\xc1\xc7\x9e\x20\x62\xe5\x20\x6f\x2c\xf4\x0c\xfd\x10\x32\xa5\xee\x71\x9a\xaa\x2b\x25\xf2\xea\x7c\x71\x7d\x1c\xae\x73\x45\x74\xcf\x37\x53\x2d\xd4\x6c\x41\xa5\x05\x44\x06\xf5\x92\x2c\x1d\x0b\x3b\x61\xa1\x37\x73\x76\x5e\x92\x18\xa5\x19\x2b\x74\x92\xfd\xef\xf2\xb0\xc2\xb9\x3d\xfa\x38\x19\x4b\xde\x79\xa0\x61\x77\x1a\x53\x47\xf0\x91\x89\x87\x83\x4c\x4b\x44\x70\xa0\xc9\xd5\xc4\xc9\x95\x2c\xed\x49\x92\x09\x75\x92\x7a\x41\x5a\xe8\x3c\xd8\x23\xdc\x58\x6c\xd6\x72\xca\xbd\xb6\x4f\xb0\x0e\x16\xf1\x49\x0f\x99\x6e\x14\x26\xd5\x0c\xd1\xa7\x78\x4f\x14\x36\x47\xf2\x59\x0b\x0c\xb5\x78\x79\x75\x3f\x83\xc5\xb5\xdc\x8b\x63\x25\xb6\x78\xcd\x53\x13\x62\xb0\xac\x81\x13\x03\x42\x88\x5c\xde\x73\xdb\x84\x5c\x0d\x8b\xc4\x2c\xad\xd1\x29\x89\x53\x58\x3b\x56\xd4\x41\xe9\x1d\xf8\x6b\xaa\xb4\x73\x53\xd4\xa9\x2e\x6e\x66\xea\xf5\xcd\xe6\xec\xfe\x12\x5e\xde\x63\x41\xc9\x6d\x66\xf3\x2d\xb7\x35\x2d\xd8\xea\x05\xdf\x02\x2a\x62\x97\x05\x8e\x57\x3b\xb6\x93\xce\x9a\xd2\x7b\xdb\x1a\x16\x64\x65\x30\x4c\xb2\x36\x95\xb2\xf6\x4c\xe6\x19\x3d\x72\xeb\xb3\xf3\x4b\x31\x11\x5b\xd2\x66\xbc\x49\xc1\x66\x45\x1e\x31\xea\x3a\xb9\xe7\x15\xe0\x45\xe0\xf1\x90\x6f\xd9\x00\x55\x13\x93\x88\x01\x82\x44\xbe\x43\x42\xea\x76\xc1\xbe\x52\x72\xb5\x90\xfc\x7f\xf5\x28\xb5\x6e\xae\x6f\x97\xeb\xfb\xcd\xf9\xfa\x00\xff\x72\xee\x6b\x1e\x8b\x43\xad\x75\x6b\xc7\xeb\xb4\x4e\xab\xf1\xc0\x09\x14\xb8\xe1\x56\x60\x9b\x95\xee\x78\x39\xf4\x39\xd0\x3c\xe7\xb1\xec\x37\x51\xba\xb9\x73\x78\x4e\x9f\xa5\x63\x94\x41\x45\x58\xa0\xf1\x2c\x29\x93\x52\x2f\xac\xd2\x82\xdc\x49\x66\x21\x8f\x79\x9b\x0c\xe0\x6a\xfe\xbb\xdc\x9a\x85\x46\x61\x42\x6c\xf1\xd4\xb3\x12\xd3\x3c\xd0\x00\x32\x24\x46\xfd\x00\xa1\x1f\x03\xc9\xc5\x84\x9e\x51\xef\x62\x6c\x1a\xdc\xc1\xa9\x51\x1a\x5a\xae\x34\x85\xf6\x8e\x1c\xe6\x21\x55\x52\x95\x7e\x86\x9e\x91\x96\x63\x89\xbd\xb1\xc1\xf6\x58\xe1\x6d\x9c\xe6\x30\xe4\x82\x53\x63\x14\xee\x13\x25\x57\x1b\xa4\xc8\xd1\x16\xda\x0c\x9e\x40\xdc\xd5\xad\x2a\x9b\x2f\x39\xbe\xed\xf0\x9e\xd7\x09\x0c\x91\x3e\x66\x98\x58\x4c\xd5\xf5\x42\x1f\x33\x9e\xf0\xa0\xcc\x41\xc3\x96\xa6\x15\xba\x99\x98\xba\xe0\x71\xf9\x9e\x28\xc1\x5c\x43\x1f\x4c\xda\xb1\xd0\x1f\xce\x3e\x82\x0d\xac\x97\x1b\x25\xa8\xfa\xb8\x28\x4a\xae\x95\x25\xce\x78\xc9\xf3\xa4\xf0\xc1\x83\x10\xb7\xef\x9a\x99\x86\x0e\x3c\x32\x51\x06\x75\x8b\x74\x69\x63\xc6\x1f\x82\x78\x50\x02\x5a\x28\x9b\xbb\xf3\xe7\x57\xb2\xc2\xf3\xe5\xeb\x9b\x8d\x32\xa4\x59\x68\xe8\x5a\xa2\x6b\x95\xae\xf9\x89\x3f\x56\x51\x44\x99\xa6\xd5\x38\xe4\x69\x9d\x98\xc4\x56\xab\x5d\xc2\x29\x81\xc0\xaf\xb9\xc7\x23\x4a\x6b\xec\x40\x1b\x4b\x7d\x57\xf6\x7d\xae\x1f\xd0\x85\xb8\x87\xc0\xd8\x9b\x97\xe7\x4a\x5e\x72\xcd\x30\x22\xa3\xd4\x34\x30\x6a\x5c\xf1\x94\x3b\x85\xa9\xd6\x3b\x8b\x07\x42\x11\xc1\x28\xd9\x97\x0a\x51\xd3\x43\x66\xcd\x51\xcb\x5d\xae\x96\x0a\x29\x79\x50\x28\x7a\xc9\x03\x2f\x8a\xd4\xfa\x9d\x3f\xd3\xde\x6d\x0f\xeb\x78\x50\x85\xa9\xd5\x61\x54\x90\x18\x96\xe5\xbd\xba\x5c\x2f\x15\x16\xf2\xbe\x4e\xb6\x83\xc6\x83\x4a\xad\xc6\x90\x3b\x3c\x8b\xf2\x14\x2a\xa8\x3a\x6d\x2c\x14\x74\xc0\x43\x54\x69\xd5\x46\x62\xc6\x03\x62\x54\x8f\xa8\xa8\x4b\x33\x16\x57\x42\x1b\x27\xbc\x08\xc0\x01\x2f\x9a\x85\xa4\xcb\x92\x92\x8d\xf5\xd8\x67\x39\x83\x6e\x8a\x11\xc5\xc8\x55\x5d\x28\xe7\xed\x31\x27\x4e\xd4\xf3\x21\x48\xfc\x59\x06\x6e\x18\x84\x5e\xe0\x84\x7e\xa4\x76\x6e\x92\xba\x71\xe7\x89\xfd\xe1\x3a\x1f\xf2\x79\x35\xd9\x74\xce\xbf\x9f\x4d\x27\xf2\xbd\x28\xf2\xfc\xc8\x77\x2d\xd3\x75\x2c\xdb\x99\x6b\x5e\x1c\x7b\x7e\x14\xf9\x96\xe3\x58\x96\xe3\xc8\x18\x86\xfd\xa0\xa6\x87\xb8\x8f\x8b\xf9\xfa\x62\x7d\xfb\x72\xa9\x5f\x1d\x42\x8d\x8f\xc6\x6d\x35\x8e\x88\x0c\x88\x24\x34\x76\xd2\x90\x51\x4a\x09\xd0\xcc\xa9\x6b\x07\xb6\x18\x39\x79\xa6\xd9\x99\xd3\x34\x75\x7d\x12\x9f\x59\xa3\x1f\x79\xb4\x05\xcb\x45\x5d\x17\xab\x8b\xd5\xed\xdd\x57\x41\x60\x75\xd1\x6a\xb5\x72\x69\x1a\xc7\x90\x70\x42\x70\xbf\x33\xeb\xba\x6e\xcb\x4a\x4d\xa8\x97\xa4\xbc\xa3\x4d\xe5\xe7\xcc\x1e\x1a\x0a\xae\xd0\x3c\x0e\xf1\xa8\x8a\x29\xe5\xa8\x74\x43\xa9\x0d\xdb\x6d\x15\x73\xec\x41\xc8\x59\x30\xe6\xc6\xbc\x9f\x67\x47\x5d\x7a\xde\xbf\xb5\xd5\x66\x6e\x10\x84\xf0\x89\xed\x6e\x31\x59\xef\x96\x07\x0b\x1e\xa5\x73\x63\x37\x70\x63\x27\x69\xe3\xc1\x17\xfc\x7c\xf2\x9d\x1e\x17\x07\x58\x1f\x56\x47\x5a\x1d\x3c\xc3\xf2\x05\xd6\x44\xb4\xbc\x9a\xbe\xc0\xe2\xae\xf4\x14\x8f\x88\x64\x44\x80\x04\x92\x11\x65\x5a\x73\xc9\x45\x68\x21\xb0\xdc\xf1\x0d\x23\x5f\x9e\xd6\x95\x3a\xbf\x5d\xdd\xac\x6f\x37\x02\x56\x9d\xcb\x4d\xd9\x5c\xac\x17\x32\xda\x5c\x46\xa7\x83\xb2\xb9\x86\xcd\xfd\x4a\x15\xdb\xea\x66\x0d\xe7\xeb\xf3\xcb\xd5\xf9\xfa\xfc\xc2\x05\xc3\x1a\xea\xb4\x4e\x20\x10\xbb\x30\xae\xff\x5f\xf2\xfe\x3d\x48\x8e\xe4\xbe\x13\xc3\x33\xab\xfa\x85\x05\x16\xa8\xc6\xcc\x60\x0a\xef\x6a\x0c\x06\x53\x0b\x2c\x76\x0a\xe8\x9d\x99\x02\x97\x00\x72\x57\xfb\xc8\x5d\x72\x77\x73\xc9\x15\x59\xa4\x04\x6e\x4a\x5c\x92\x25\x91\x2b\xa4\x5e\xa7\xa4\x18\xd4\xa6\x7e\x3c\xfd\x94\xd2\x51\x62\x4a\x3a\x2b\xca\x92\x1d\xac\x73\x58\x72\x9f\xac\x08\x77\xc8\x0a\xb9\x6c\x5f\xc8\x45\xc9\x61\xb5\xc3\x5a\xb3\xef\x0f\xdb\xcd\x38\x3d\x1a\x21\xad\xdd\x7e\xdd\xb5\x1d\x8a\x70\x73\x31\x95\xe3\xa8\xac\x9e\x07\x76\xa1\x93\xee\xfe\xf5\x20\xaa\xbb\xa6\x7b\xd0\x9d\xf9\xcd\xcc\xef\xfb\xfb\xfd\xf0\x7c\xe2\x43\x47\x0f\x65\xae\x74\xaa\xb2\xc4\x92\x21\xf7\xa1\x3b\xf4\xf4\xa4\x68\x0d\x7c\x3d\x81\x0a\xba\x7e\x6e\xb5\x02\x89\x5b\xdb\x03\x24\x42\xcb\x97\xa9\xdc\xef\x20\xa6\x3d\x99\xca\x62\x64\xf9\xe5\x65\x65\x7a\xa6\x34\x4e\xcb\x9f\xa2\x0f\x7d\x9d\x7b\x90\xee\x80\x00\x9c\x00\xaf\xeb\x9f\x6d\x7e\xab\xfe\x2f\xe7\x72\x6b\xf9\x00\x6e\xca\x3a\xe8\x82\x2d\xf0\xd4\xbc\xa6\xfd\xe3\xe0\x0d\x70\x17\x70\xf0\xb3\x40\x81\xbf\x46\x9f\x7a\xf2\x71\xef\x4c\xe8\x7e\xf2\xb5\x9f\x66\x77\x7f\xe2\x0b\x6f\xbe\xf9\xff\xfb\x99\x2f\xb2\xd7\xf2\xd7\x86\xaf\xd9\xaf\xdd\xfd\xe2\x17\xef\xbe\x66\xdf\xf9\x85\x57\xbf\xfe\xc6\xd7\xad\xaf\x7f\xfd\x59\xff\xe2\xa1\xe5\x3b\xe4\x23\xf4\x23\xd6\x47\x3e\xf2\xf4\xcd\x6b\xe0\xc8\xe5\x67\x9e\xbf\x75\xe9\xfa\xff\xff\x1b\xdf\xb8\xfb\xe5\x2f\x30\xf6\xd3\xf4\xa7\xef\xbe\x8e\x31\xbb\x2b\xee\x5a\x3f\x70\x17\xde\xcd\x76\x72\xb4\xda\x3c\x82\xef\xde\xa5\x9f\x7e\xe5\x95\x5f\xe4\xe7\xe9\x3a\xbd\x4d\xef\xd2\x1a\xa5\xf0\xf1\x33\xee\xf1\x23\x37\x36\x3a\xcd\x63\x10\x36\x21\x58\xff\xcc\x9d\x6e\xb7\xdb\x5d\x2f\x1f\x8e\xdf\x58\xbf\x63\xee\xdb\xdd\xf5\x2b\x77\xee\x98\x9b\xf6\xf1\x1b\xeb\xdd\xf2\x85\xf9\x3f\x68\xfe\xb2\xbb\x7e\xa7\xbb\x77\x73\x7c\xf9\xc6\xfa\xfa\xfa\x9d\x76\xf5\x31\xed\xfd\xbf\xbe\x16\x2c\xb4\x3b\x4b\x2b\x4b\xab\xc6\xd5\x06\xdb\xdd\x39\x5a\x5d\xb7\x72\x68\xcc\xf3\x0f\x61\x05\x5a\xd4\xdd\xbd\x2f\x9f\xbb\xf3\xfb\x8d\xf2\xf7\xf2\x32\x81\xbc\x2d\x73\xa4\xd7\x0e\x04\xb3\x61\x75\xca\x9b\x4b\x26\x18\x72\x05\x2e\xec\x26\xfd\x9e\x85\xf3\x33\x5f\xdf\x38\x07\x77\x13\x9e\x1a\x2b\x17\x5e\x87\xeb\x79\xfd\xbf\x87\xc1\x5b\xdf\x05\x77\xf3\xfa\xd1\x3f\x7e\xab\x78\x11\xb6\xef\xdf\x83\x47\xf5\xff\x0d\x8f\xd6\xfe\xb3\xb7\xde\x7a\xeb\xad\xfb\x7f\x04\x9d\xed\xe0\xee\x5d\x2b\x87\xce\x4f\xc1\xf6\x7b\xbd\xbb\x77\xef\xde\x6d\xe8\xb7\xde\x7a\xef\xdf\x7d\xfb\xe7\x7f\xfe\xed\xf2\xc2\xb7\x6f\xe3\xe7\x9e\x79\x06\x7e\xf3\x77\xdf\x62\x57\xaf\x86\xdd\xb7\x3e\xf3\xed\xaf\x3c\xf3\xc4\xc5\xc7\x82\xa7\x5e\xba\xb6\x7a\xe9\x49\x78\xd4\xf1\x16\x57\xaf\x7d\x35\x7e\xe3\x66\xed\x0f\x61\x70\xf7\x5b\xdf\xba\xab\x87\xdf\xfa\xae\x05\xd7\xff\xe8\xad\xb7\xfe\x48\xff\xf3\xf2\x5b\x1a\xfa\xee\xdd\xf7\x7a\xf0\xa8\x65\xc1\x63\xef\x3d\xf5\xd6\x5b\xf0\xb7\xe1\xd1\xda\x4b\xe5\x57\x6d\xaf\x43\xe7\xcb\xf0\x58\x11\x43\x47\xff\xe2\x37\x7f\xf9\x57\x7e\x13\xfe\x7b\xbf\xf2\xcb\xdf\x8c\xbf\xf0\x99\xcf\x7c\xfe\xf3\x9f\xf9\xcc\x17\xe0\xff\xf6\x3d\x1f\xbf\xf6\x6c\xab\x76\xf8\xd9\x0f\xbd\xf6\x29\xf8\x83\x17\xbc\x0b\x67\xff\xea\x37\xae\xac\x7a\x97\xb7\x3f\x6f\xd7\x2f\x5e\x87\xbf\xaa\x7f\xec\x33\x6f\x02\x1b\xbc\xae\xbf\xd5\xfc\x9d\xc6\x22\xb0\xc1\x0a\x58\x07\x04\xf9\xb5\x95\x95\x8b\xde\xe5\xe0\x32\xba\x6c\x5f\xbe\xfc\xea\x45\x78\xf1\xa2\x75\xe6\xf0\x61\x6b\x69\xc9\x5a\x59\x09\xae\xc2\xab\x57\xd7\xd6\xec\x93\x8e\x63\x83\x93\xeb\x5d\x77\xbd\x5a\xc4\x3b\xdd\x75\x68\x7e\x6d\x57\xbb\xe2\x4e\xb7\x5c\xe7\x72\x65\x0f\xd9\xf5\x72\x45\x6e\xc1\x8d\x27\xab\x62\xd1\xe6\xf2\xad\xdd\xd5\x38\x0a\xcf\xc2\x83\xa5\x31\xb6\xb6\x7f\x77\xfb\xf5\xed\x4f\xd8\xff\x7b\xe7\xa3\x9f\x7d\xf9\xda\xf7\x7d\xed\xb5\x2b\x9f\xfe\xe4\xc7\x2e\x7c\xec\xd9\x9f\x09\x6f\xdf\x5a\xfb\xd8\x73\x2f\x9d\x7e\xe1\xf9\x67\x5f\x78\xe1\xd9\xe7\x5f\x68\x2c\x6e\x7f\x62\xfb\x93\xf6\x3f\xbd\xbf\xfe\xf8\xad\x0f\x7d\xf4\x6b\x9f\x7a\xee\x8b\x2f\xad\x39\xa7\x57\x16\x7f\xef\xc2\x13\x1f\x5a\xbf\xf6\xec\xd3\x1b\x5f\x26\x4f\xe9\xff\xf3\xd6\x8b\x2f\xde\x42\x2f\xbe\xb8\xdb\x3b\x6f\x5a\x4b\x77\xf3\x7a\x17\xd6\x36\xbb\x55\x3a\xc2\x05\x60\xaa\x70\x96\xbb\x56\xe7\x81\x70\xe1\x04\x65\x23\x18\xc0\x50\x0f\xf4\x74\xac\x27\xd0\x9d\x4c\x64\xcb\xd3\x32\xc9\xd2\xb4\x9f\xa4\xc3\x61\x6d\x90\x52\x2d\x34\xd7\x4a\xa7\xd0\x9b\x4c\xa0\x93\xc3\x99\xf6\x7b\xbd\x7e\x3e\xc9\x58\xdf\x7c\x67\xb4\x33\xb5\xf3\x1a\x05\x8b\x46\xf3\xb6\x3a\x55\x3e\x47\x95\x4f\x5f\x85\xe9\xec\x03\x9b\xd4\x6e\xb5\xf4\x4c\x24\x28\xcd\xc6\x93\xf1\x68\x34\x1a\xe5\x59\x52\x0a\x0d\x29\x84\xa5\x60\x88\x15\xd1\x43\x93\x73\x31\xcb\x07\xfd\x51\x21\x25\x8b\x05\xe7\x9c\x57\x7a\x56\x1f\x80\x5a\x58\xc5\xa0\x60\xdb\x36\x4c\x7a\x01\xae\xb4\x61\xd4\xb2\xc0\xa4\xd7\xd2\x60\x52\xc3\x45\xbc\x03\xec\xe4\x7e\x66\x49\xe8\x6c\xc7\x35\x6c\x62\x0a\xf3\xff\xb7\x08\xc0\xea\x56\xb7\xde\x5e\xdb\x58\x6e\x77\xdb\xcb\x4b\x6b\xed\x95\xd5\xe6\xca\xea\x06\x8c\x49\x08\x5b\x4a\xf5\x95\xea\xe9\x31\xf1\xf4\x70\x38\x1a\xc1\xc4\xb8\x93\x75\xe2\x25\x5e\x91\x4d\x26\xb3\x01\xa8\xf4\xf2\x69\x2d\x32\xb1\xde\xc5\xd2\x32\x5c\x38\x10\xed\xad\x6f\xb6\x9d\xb5\xf2\x63\x6d\xf3\x0d\x8d\xb6\xc3\xa0\x3b\x1e\x41\x57\x4f\xc6\x23\x3d\xb1\xf0\x78\x2c\x65\x4f\xca\xb1\xe5\xc3\x16\x0c\x4c\x9e\xad\x09\xf9\x26\x21\x8c\x21\x0d\x75\xe2\x09\x57\x67\x30\xf6\x84\x0b\x71\xa8\x53\x6d\x72\x97\x1a\xd0\x03\x5e\x63\x54\x4f\x0f\xe0\x8d\x2f\xef\xe7\x2c\xc3\x39\xff\xd8\xe3\x21\x5e\x95\x10\xf4\x1e\x86\xc8\x0e\x21\xda\x96\x10\x6d\x8b\x7a\x56\x1b\xe7\xb9\xe6\x79\xae\xe3\xcc\xfc\x68\x9a\x65\x00\x82\x6f\xd7\xbe\x63\xbf\xd3\x58\x06\x4b\xe0\x36\x7a\x0c\x2c\x7b\xcb\xd6\x7f\xb2\xfc\xed\x65\x2b\x58\x66\xcb\xd6\x31\x53\xd3\xf0\x48\xf0\x88\xd5\x78\xe4\x91\xb7\x4b\x42\x36\x0e\x61\x00\x9c\x5f\xae\x83\xf5\x7b\x25\x5f\xec\xc2\x92\x67\xae\xdf\xb9\x73\xe7\x47\xaf\x05\xf0\xa8\xbd\x72\xe1\x09\x6b\xad\x7b\xce\xee\x5e\xbf\x65\x6d\xd9\xef\x34\xae\xdd\xf9\xa5\x37\xbf\xf0\xf5\xe8\xb1\xfa\xef\xd4\x4f\x5f\xff\xe8\xc6\xe3\x2f\x6e\x5e\x68\x34\x96\x5f\xf9\x07\xaf\x3d\xb6\x46\x7e\x8a\xdc\x78\xf1\x31\x67\xe1\x0a\xde\x28\xd7\x76\xe7\x9f\xe9\x45\xf8\x66\xed\x25\xb0\x00\x56\xd0\x82\xb3\xe4\x2d\x59\xc7\x5e\x38\x62\xdb\x47\x5e\x5f\x7c\xf4\x58\x93\x80\xd3\xe0\xf6\xbd\xdb\xd0\xf9\x9f\xaf\xaf\x3b\xf7\xee\x5c\x0b\x16\x2e\x5c\x5a\x33\xdc\xec\x96\x65\xd8\xd9\x51\xeb\x99\xe0\xf6\xf2\xa9\xcd\x95\xd3\x4f\xac\x2c\xfc\xc1\x05\xfc\x96\x5e\x3c\x7a\xf8\x1f\x3f\x72\xf8\xd8\xda\xd3\xdd\xda\xdf\xdc\x77\x5f\xfe\xca\x27\xd7\xab\x18\xe9\xcf\xd7\xde\xb1\xbe\xdc\x58\x04\x8f\x82\x93\xe8\x48\xfd\xe7\x6e\x37\x60\xe3\x08\x38\xf2\xab\x75\x00\x6e\xbf\x0b\xd7\xbb\x7f\x7e\xe7\xde\xb5\x00\xde\xb2\xb7\xba\x4b\x47\xed\xe6\x0a\xfc\xf9\x43\xc7\xdb\x47\x6b\xbf\xdf\x38\xff\xd8\x13\x27\x68\xed\x7f\x39\xf7\xf2\x6b\xa4\xb3\x78\xf2\x95\x4f\x7c\xc2\x03\x10\xde\xd5\x4f\x59\x3f\xb9\xf3\x35\xf0\x28\x38\x81\x0e\x1d\x01\xa0\xfe\x73\x8d\xf2\x93\xd6\xdf\x85\xeb\xf7\xae\x97\x9c\xe1\xc0\x07\xdd\x3d\x7c\xca\x5d\xa8\xfd\x5e\xe3\xfc\xe3\x9b\x67\x7f\x50\x7f\xe2\xe4\x47\x5f\xff\x78\x67\xf1\xe4\xcb\x9f\xfc\x44\xa7\x1a\xd7\x57\x6b\xdf\xb1\xbe\xd6\xe8\x80\x47\xc1\x32\x7a\xa4\xfa\xac\xfa\xaf\x1e\xa9\x46\x35\xff\xb0\xf2\x73\x36\xca\x4f\xb4\xbe\x76\xe4\x94\x7b\xbc\xf6\x7b\xf5\xf3\x57\xb7\xce\xfc\x60\xa3\x61\x3e\x6c\xc9\x7d\xe5\x13\xe6\xc3\x2c\xb0\x6a\xdd\xb0\xde\xae\xff\x09\x38\x0c\xce\x82\xcb\xe8\x64\xe3\xde\x91\xf3\xaf\x9e\x7f\xfb\xbc\x75\x1e\x35\x1e\xc1\xe0\xde\x89\x43\xef\x9e\xfe\x0b\xfb\xdd\xf6\x5f\x96\x34\xbd\x07\xd7\xef\x5d\xb9\xe3\xfc\xc5\xbd\x6b\xc1\xc2\x01\x3e\x55\x5f\xac\x6a\xdf\x37\x9e\xbc\x65\x75\xaf\x9f\xc8\x5e\x78\xed\x95\x57\x5e\x79\xe5\xb5\x17\xe0\x9f\xac\xbc\xf4\xe3\xaf\xbe\xc4\x3e\x72\x69\xe5\xc5\x1f\x7d\xe5\xdf\xf9\x8d\x9a\xf5\x5b\xff\xe4\x9b\xff\xd1\x6f\x7d\xf3\x9b\xbf\xf5\xa5\xdf\xf9\xc9\x5b\xb7\x7e\xf2\x77\xbe\xf4\xa5\x7f\xfa\x13\x1f\xfe\x3f\x2a\x7e\x74\xc4\x7a\xc9\xfa\x46\xfd\x9f\x81\x47\xc0\x12\x78\x1e\x5d\x3e\x64\xdd\x3b\xdc\xb4\xed\xe5\x37\x96\xbf\xb1\x6c\x2d\x97\x63\x59\xba\x57\x87\xb5\x77\x0f\x1d\x3b\x7c\xfe\xf0\xfa\x61\xbb\x75\xf8\xb0\x75\xec\xdd\xe6\x9f\x59\x7f\x0e\x6e\xdf\xbe\x77\xfc\x46\xb9\xb7\xee\x5d\x37\xe3\x33\x92\xf7\xde\xf5\x6b\x01\x5c\x31\x6d\x27\x4d\x95\x49\xc9\x74\x8f\xda\xc7\xa0\xf5\x8d\xaf\x7e\x43\xff\x02\xfc\xf2\x2f\x7d\x55\xff\x8d\x6d\xd7\x17\x4f\xb8\x87\x7e\xd3\x7e\x24\xcf\xef\x5a\xdf\x53\xbc\xf3\xc7\x97\x3f\x7b\xed\xf0\xea\x65\xff\xd8\xbc\x5e\xf5\x29\x6b\xcb\xfa\x7c\xfd\x0f\xc0\x45\xf0\x12\x5a\xee\x5c\xb8\x70\xee\xec\xd9\xc3\xde\xe2\xbd\xfa\xa5\x57\x2f\xbd\x7d\xc9\xba\x54\x8e\xea\x70\xa9\x33\xb4\x8f\xbb\xf8\xf0\xf2\xbb\x00\xb4\x3b\xef\x9e\xfb\xb3\xf6\xbb\xad\x8a\x5a\xc7\x6f\xac\xdf\x83\xeb\x57\x0c\xc5\xba\x73\x7d\xe0\x5a\x00\xaf\x9f\xb3\x2a\x0d\x7b\x6d\xa3\xdc\xfd\x15\x11\x8f\x5a\x55\x09\x4b\xf3\x16\x84\xcf\xdc\xfc\xe2\xab\x57\x7f\xfb\x9f\xdc\xfe\xf2\xe3\xa7\x3e\x7c\xf3\x29\xf7\x7b\xdf\x78\xe3\x53\x8f\xae\xae\xad\x1e\xfd\x9e\x0e\xfc\x2f\xf4\x1f\x1e\x5f\xbc\x51\x7b\x6b\xe5\xd9\xcf\x3d\xfd\xf5\x7f\xff\xcc\xa9\x5f\x3a\x7e\x7a\xe1\x91\x8f\x46\x2f\x7f\x6f\xad\xd1\xb4\xae\xc0\xde\x57\xfe\x27\xbb\x01\x0e\xac\xeb\xff\x00\xce\x82\xab\x20\x44\x9e\xf3\x48\xe7\x1e\x58\x7f\x75\xfd\xed\x75\x6b\xdd\x50\xf3\xb1\x7b\x8f\x5c\xfc\xeb\xa5\x93\x27\x9d\x63\x7f\x71\xee\xdd\xba\x19\x70\xf7\xc6\x7a\xb7\x5c\xe2\xeb\x66\xc4\xc7\x6f\x5c\x0b\xe0\x81\x95\xdd\x5a\x3e\x6a\x37\xbb\xa5\xb0\x3a\x67\xd5\xf7\x46\xbd\xb4\x78\xce\xb2\xde\xbe\xfc\xca\xdd\x67\xd1\x8f\x7c\x6c\xfd\xb9\x9f\xf9\xbd\x1f\xb9\xfa\xea\xdb\x14\x1d\x3b\x7c\xfa\xb3\x2f\x6d\x7e\x1a\x5d\xd4\xff\xe2\xd9\xd7\x5f\x7e\x61\xed\xf6\xd5\x93\x27\xaf\xde\xb4\x3f\xff\xf4\x5d\x72\xf5\x6a\x24\x3e\xfe\x23\xff\xe9\x37\xde\x5a\x7b\xeb\x34\x7a\x95\x3e\x75\xe5\xda\x2a\xfe\xa1\xff\xe7\xfb\x3f\xf1\xb1\x4f\x9f\x7c\x6c\xeb\xdc\xe3\x2f\x6e\x9c\x35\xb4\x5f\xb7\x5e\xb2\xde\xac\xff\x01\x68\x80\xf0\x3f\x07\x60\x67\x8a\xce\x03\x60\xc1\x7b\xf5\xd6\xab\xad\xb7\x5b\x56\xab\x9c\xc3\xd0\x1a\x5b\x53\xcb\xb6\xac\x77\xed\x3f\x03\x66\x1f\xc0\xf5\x3b\x66\xec\xed\x1b\xeb\xe1\xb5\x60\xa1\x8a\xf2\xff\x12\x44\xfa\x07\xad\x0d\xfd\x5f\x59\x2f\x59\xff\xd7\x57\xde\x34\xba\xb9\x0d\xae\x59\x37\xac\x1f\xad\xff\x09\x58\x05\x4f\x82\x67\xc1\x4f\xa1\x0b\xe1\xbd\xce\x33\xf7\xea\x8f\xdc\xbc\x7e\xa6\x56\xef\xd4\x3b\xf5\xe5\xc7\xef\x1d\x7b\xfe\xd5\xe7\xdf\x7e\xde\x7a\xbe\xfc\xb2\x4b\xf7\x96\xcb\xa5\x5e\x5b\x72\xf1\xf2\x23\x67\x6e\x5e\xff\xc8\xf5\xef\xbb\xfe\xc5\xeb\xbf\x79\xfd\x3f\xbe\x5e\xbf\xbe\xb8\xf1\x07\x37\xff\x9b\x9b\xff\xe3\x4d\xfb\x26\x78\xec\xdd\xc5\xbf\xdc\x78\x17\xfc\x85\xd9\x00\xed\x1b\x77\xda\xc7\xcd\x75\x03\xae\x5f\xb9\x37\x27\xeb\x8d\xf5\xf5\xe3\xcb\x37\x9c\x7b\xce\xbd\xdd\xcd\x70\xd4\x6a\x9e\xb3\x97\x0c\xad\x2f\x19\x52\x3f\x61\x97\x4f\xbb\xba\xc0\x13\xd6\x3a\x3c\x0a\x8d\x34\x3e\x67\x2d\xdf\xb2\x37\x9e\xbc\x04\x3f\xf6\xe4\x67\x9e\xbf\x7c\x62\xed\xc9\x73\x17\x6e\x05\x67\x2e\xbf\xfc\x43\xb7\xff\xd1\xaf\x9f\xbc\x1c\x9e\x2f\x59\xda\x15\xfc\xc6\x0f\xbe\x84\x5f\xfa\xc8\x89\xb5\xad\xce\xb1\xa7\x9f\xf9\xc7\xe1\xed\xe3\xde\xd5\x53\xee\xe3\xde\xc2\xd3\xf5\x3f\x39\xbd\xf5\x7a\xb8\x7a\xeb\xba\xdf\x5e\xb8\xba\xf5\xdc\xe5\x1b\x77\x9e\xb9\xf8\xb5\x1f\xbf\xfc\x5c\x78\xa5\xbd\x78\x65\xe3\xd6\x6a\xf8\xf1\xad\x33\x45\xfc\xd4\xf3\xcf\x3f\x75\x2e\x58\xf3\x8e\x35\x2e\xbc\x0c\x27\x5b\x9b\xa7\x2f\x5f\x3c\xfb\xe8\x91\x33\x2b\x8f\x9f\xd9\xdc\x32\x7b\xab\x63\xdd\xb0\xbe\x52\xff\x6f\xc1\x2a\xd8\x00\x4f\xa1\x0b\xd7\xda\xe3\x43\x67\xc0\xd6\xab\x5b\x6f\x6f\x59\x5b\x25\xad\x1e\xbb\x77\xe6\xf1\xbf\x6e\x2f\x2f\xd7\x2f\xbd\xdb\xf9\x8b\x23\xf3\xdd\x55\x1e\x87\xee\x2e\x07\x69\xdf\x30\x07\xb4\x9a\xf2\x2e\x77\xde\x5a\xa9\xa4\x42\xc5\x47\xce\x59\xab\x73\xfd\xe3\x96\x55\xd2\xc0\xfa\x4a\xe7\xd3\xff\xc1\xcf\x9e\x44\x4b\x4b\x9b\x27\x3f\xfe\x25\x74\xd6\x3e\xf4\xe8\xc5\xe0\xe6\xa5\x0f\xd3\x67\x2f\x3e\xf6\x91\x2f\x7d\xcf\xd3\x3f\xf6\x7a\xa0\xff\xbb\x67\x3f\xf1\xd2\x47\x2f\xdd\xbe\xea\x2e\x5d\xbe\x55\x7b\x86\xfe\x97\xbf\xf6\x7d\xad\xe6\x57\x1f\x7d\x64\xe3\x93\x3f\x76\xf3\xf8\xc5\xd3\xed\xd5\x17\x3e\xff\xf4\x33\x77\x5f\xbb\xba\xfe\x03\xbf\xf6\xbb\x9f\x89\x3e\x1a\x9d\x7c\xac\x7b\xea\x22\x7e\xea\x62\x39\xa7\x5f\xab\xc5\xd6\x77\xea\x7f\x02\x1e\x05\xe7\xc1\x33\xe8\xd0\x52\x70\x14\x1d\xb5\x8e\xb6\x4f\x95\x8b\x7e\xe6\x90\x83\x4f\x9d\xba\xf2\x28\xac\x3d\xba\xf8\xa8\xf5\x68\xa3\x7e\xa4\x7e\xe4\x76\xfb\xd5\xf6\x1b\x6d\xbb\x7d\x16\xac\xff\xe9\x9d\x72\x4d\xe1\xfa\x3b\x77\xee\x5c\x5f\xbf\xd2\x7d\xe7\xce\x8d\x83\xdc\x7c\xf5\xc9\xcd\xad\xa5\xa3\xb0\x5c\xbb\xea\xd8\xc3\xfe\xe1\x93\xee\x89\xd6\xb7\x8f\x07\xe1\xad\xf3\x1f\xd3\x7f\xc5\x7f\xfa\xc3\x37\xce\xaf\x9e\xbf\xbe\xfe\xa1\xe7\x6a\xbf\x70\xee\x23\xaf\xbe\x76\x71\xd1\x7b\x99\xbc\xb6\xca\x5f\xf9\xf1\xf3\x1f\x3d\xf1\x84\xbb\x70\xdc\x39\x75\x66\x75\xcd\x34\x5f\xb4\xb6\x7f\xb8\xf6\x9d\x9d\x3f\x6c\xbc\x6d\xf2\xd9\x3f\x86\xae\x3d\x7a\xa4\xe6\x2c\xc3\x65\xb4\x7e\xe6\xf6\x99\x57\xcf\xd8\x67\x6a\xb5\x33\xeb\xe0\x0d\xf0\x0d\xf0\x4d\x50\x03\x79\xeb\xc4\xe9\xd3\xb5\xb7\x8f\x7c\xe3\x88\x75\x44\x80\x63\xad\x37\x5a\x56\x0b\xac\xdf\xe9\x9e\xfa\xd3\x3b\xd7\x6f\xac\xbf\x03\xd7\x4f\x95\x43\xbf\xb9\xee\xae\xdf\x39\xf5\x4e\x69\x88\x94\x3c\xf3\x09\xb8\x76\x14\x96\xc2\x03\x6e\x75\xcf\xc1\xe5\xb5\x6a\x22\xb0\xb9\xa2\xbf\xf3\x66\xf7\x4b\x4f\x6e\xfe\x70\xf7\x73\xdd\x9f\x0c\xf2\xe0\x27\xba\xaf\x2c\x76\xce\x9e\x75\x7e\xff\xea\x0f\x6f\x7d\xae\xf6\x9d\x0b\xaf\x07\xc1\xeb\x17\x4e\x3f\xf5\x0f\x9f\x7b\xee\x1f\x3e\xf5\x47\x27\xaf\x3e\xf1\x64\x67\xe9\xc3\x5f\xb8\x52\x8e\xf9\xfe\x2f\xd4\xbe\xa3\xff\x7c\x3e\xe6\x97\xd0\xe5\x9a\x7d\xe4\xfc\x09\x78\x02\x9d\x39\x72\xe4\xcc\x7a\xeb\x8d\xd6\x37\x5a\xdf\x6c\xd5\x5a\x39\x38\x71\xfc\xf8\x91\xb7\xed\x6f\xd8\x96\x2d\x9c\x03\x83\x7d\xe7\xfd\x83\xdd\x1b\xeb\x7c\x88\x4b\xbb\x63\xde\x2a\x6f\x36\xba\xe7\xec\xe5\xed\xbb\xdd\x9f\x30\x63\x7c\xb3\xfb\xc3\x9b\x1b\x5f\xec\xbe\xf9\xf2\x9b\xe1\x0f\x5f\xfd\x7d\xe7\xec\x39\x6f\xb1\xf6\x37\xd5\x20\x4f\x57\x43\xfe\xe3\x2b\x5f\xf8\xf0\x52\xe7\xc9\x27\xae\x9e\xdc\xa3\xef\x57\x1b\x33\xe0\x00\x1f\x7c\x06\x85\x27\x4e\x9e\xf4\x1a\x47\xf1\xc9\x33\x6d\xb1\xbe\x72\x7b\xe5\xd5\x15\x7b\xa5\x56\x5b\x79\x80\xc4\x27\x4f\x9e\xbf\xe4\xba\x7f\x2b\x99\xff\xf4\xfa\x8d\x76\xf7\x41\x52\x5f\xbf\x71\xa5\xfd\x30\x5a\x2f\x2c\x1e\xb5\x8e\xc1\x95\xb5\x79\x71\x67\xa3\xb9\x61\x6c\x83\x0f\x10\xfe\x3f\x5c\xbc\xf0\xc4\xc9\xc6\x27\x1e\xd9\x7a\xfa\xc6\x95\x13\x6b\x87\x0f\x5f\x3a\xff\xd9\x37\xdf\xb7\x02\xf0\x1f\x9c\xbd\x72\x6e\xa9\xf1\xda\xd7\x0e\x9d\x5f\x5d\x3d\x69\xdb\x1f\xb3\xed\xe7\xcc\xfc\xde\xac\x7d\x47\xff\xaf\x4d\x07\x38\xe0\x71\xf0\x03\xe8\xa9\x9a\x7d\xe4\x08\xf0\xfd\xfd\x65\x00\xf9\xa9\x53\x60\xed\xc4\x2f\x7f\xfb\xfc\x5f\x9e\xff\x57\xe7\xed\xf3\xe8\xd0\xa3\xf8\xfc\xf9\x8b\xbf\x7c\xb2\xdd\xfe\x5b\x16\xe7\xfa\x7a\xd7\x28\x78\xf7\x4a\x23\x77\xfd\x94\xf3\xa7\x77\xae\xaf\xb7\x6f\xdc\x5c\x7f\xe8\x12\x55\xbd\x72\x1a\xcd\x95\x5b\x76\xd5\x21\x67\x73\xab\x7b\xd4\xfe\xc0\x72\xc1\x3f\xbc\xf8\xc2\x73\xe8\x8c\x7f\xf9\xe8\x9d\xfa\xd9\xe0\xe9\xcb\xab\x2f\x3d\x77\xeb\x94\x7f\xf9\xe8\xf7\xd7\xcf\x04\x4f\xbf\x6f\x01\xe1\xa7\xcf\x5c\x38\x73\xf9\x7a\xf0\xda\x53\x9d\x33\x17\xce\x5c\xb9\x56\xde\x54\x67\xe5\xc7\x6b\xdf\xd1\xef\x34\xbe\x05\x0e\x83\xf3\xe0\x3a\x3a\xd9\x10\x87\x0f\x9f\x5f\x3f\x02\x8f\xe4\x4b\x8b\xf5\xc3\x87\xcf\x2f\x8a\x53\xc7\xda\x6f\xb4\xad\x76\x35\x93\xeb\xd7\xd7\xff\x14\xae\xcf\x57\xed\xd4\x3b\x7b\x67\x18\x36\x57\x56\x4b\xc6\x74\x69\x4f\x5b\x2d\x3e\xb3\xe8\x9d\x9b\xef\x7c\x78\xb7\x7e\xe5\xe5\x1f\x79\xfe\x57\x7f\xa5\xf1\xa5\xda\xe9\xe0\xd9\xc7\x2f\x3e\xdd\xed\xd4\xeb\xb3\x93\x8f\x3f\xb1\x51\x1e\x80\xc7\x1b\x1f\xfe\xec\x73\x97\xbe\xfe\x33\x57\xae\x9f\x6c\x1e\x3a\x7d\xcd\xff\xc0\xb8\x42\x74\xae\x2e\x0e\xa3\x85\x13\xf8\xc0\xe0\x00\x78\xc8\xe0\xde\xd9\x1b\xdc\x15\x33\xba\xdd\xcd\x7e\x1e\xbe\x6f\x74\xff\x7c\x7f\xaf\x6f\x3f\x6c\x70\x7f\xfe\x78\xb9\xe3\x37\x9e\x78\xfc\xe4\xd2\xfb\x07\x37\x1f\x5b\xb3\x01\x16\xc0\x65\xf0\x0c\xea\x9c\x3c\x73\xe6\xfc\xa2\x58\x5d\x5d\x58\x07\x10\x1c\x6a\x9d\x3c\x73\xe6\x82\x9f\x9f\x3e\xbd\xd0\x12\x47\x8f\xd5\xdf\xa8\x5b\xf5\xf9\xf0\x6e\xac\x9f\x9a\x6f\xf4\x6e\x45\x3f\xf3\xdb\x5c\xd1\xdf\x1f\xdb\xda\x07\x76\xf8\x66\xb9\xc1\xdf\x79\xc8\x30\xaf\xcc\x37\x79\xf8\xf4\x8d\xc7\x97\xd6\x0e\x2f\x7d\xe8\xcd\xcf\xd6\xff\xea\xc1\xf1\xfe\xfa\xd9\x2b\xe7\x17\x1b\x8f\x7d\xfa\x90\xb7\xba\xea\xda\xf6\xc7\x1a\xcf\x81\x07\xf6\xf8\x02\x58\x07\x18\xad\x9d\x39\x7b\xb6\x75\xf9\xca\x15\x33\x85\xfc\x50\xeb\xf2\xc9\x6f\x5f\xf8\xcb\x0b\xff\xea\x82\x7d\x61\xed\xcc\xe2\xe2\x07\x66\x72\x7d\xbd\xdb\x2d\x77\xf5\x9c\xda\xd7\x2b\x93\xfe\x83\x33\x79\xe8\x46\x7e\xe8\x4c\xd6\xff\x35\x7b\xf9\xfd\x53\x22\x0f\xdf\xcb\x10\x5c\xd3\xcf\xc0\x1f\x05\x00\x2c\x02\x17\x1d\x3a\x26\x40\xab\x65\x1d\x3f\x6c\x81\x75\xe3\x5a\x2a\x87\x7a\x2d\x58\x7e\xb2\x1c\xdd\x9e\x6e\x09\xbb\xd7\x37\xff\xc5\x3f\xfa\xd9\x53\x37\xd6\xcf\x7d\xee\xcd\xb3\xe8\xd4\xd1\xab\x27\x2f\x3c\xf9\x2f\x7f\xe8\xe7\x16\x9e\x44\x1f\xb9\xfc\xe9\xb8\xd5\xfa\xd1\x5a\xfd\x8a\xf9\x6c\x47\xbf\x05\x7f\x0a\xfc\x36\x68\x83\xe3\x7f\x70\x08\x3a\x8f\x36\xde\x03\x60\xfd\x76\xf9\xc1\xff\xf5\xb5\x60\xb5\x5d\x4d\x7c\xd7\x21\x04\x7f\x0a\x9e\xba\xf1\xa9\xdb\x97\x6e\x9f\x38\xfa\xd4\x85\x27\xae\xff\xb6\xfe\xce\x33\x9f\x7f\xfe\x62\xfb\xd0\xaf\x37\x8f\x5e\xbb\x06\x3f\xbc\xff\x79\xbf\xf1\x6f\xf5\x79\xbf\xa1\xdf\x3d\xf8\x79\x01\x00\x75\x10\xec\xe0\x5a\xab\x21\xc0\xe1\x3d\x04\xd5\x07\xf0\xef\xea\xcb\x8d\x66\x77\x6b\xb9\xd9\x59\x5a\xa9\xda\xce\x9a\x6b\xde\x68\x76\x13\x6e\xac\x2c\x2d\x6c\xac\x2c\xb5\xbb\x1b\x2b\xb5\x56\x52\xa8\x04\xca\x54\xf7\x13\xcf\xef\x87\x3d\x04\xc1\x6c\x3c\x1e\x8f\xa7\x85\x48\x1c\x37\xce\x21\x9d\x95\x3f\xf5\xa1\x4e\x86\x63\xc8\xfb\xfd\x59\x10\x47\x43\x37\x93\xe5\xbf\x5c\x12\xdb\xf3\x5c\x35\xd3\xd3\x2c\xd3\x79\x96\xe9\x2c\x37\xfd\x60\xc9\x0e\xb6\x87\x0d\x69\x7a\x6d\xac\x9a\x2a\xed\xfd\x1e\xa5\x7f\x57\x17\xce\x69\xe2\xb4\xf2\x34\xf6\x3c\x1d\x10\x8b\x15\x53\xab\x55\xcc\xca\x2b\x71\x63\xe8\xc4\x30\x88\x63\x62\x9c\xda\xe5\x65\x5a\x8c\x8a\x94\xfb\x6e\x44\x0e\x76\x18\x05\x98\x62\x55\xb5\xd3\x2c\x75\x5b\x1b\x54\xfd\x54\xe7\x9e\x54\x33\x9a\xbd\x51\x58\x8d\x7d\x0c\xe5\xb6\xf1\x29\xb6\xbb\x4b\xc6\x91\xb8\xd9\x5c\xea\x18\x40\xd5\x5a\x3f\x73\x3d\x38\x2c\x5c\xd3\xd9\x86\xb6\x62\x11\x32\x4f\x06\xbe\xe7\xe8\x56\xae\xb6\x47\x2a\x1b\xcc\x3c\x61\xe1\x22\xb3\x70\x43\x06\x28\x28\x7a\xb1\x64\xc5\x64\xe4\x2a\x57\xc0\x48\x8f\x73\x9d\x43\x3c\x80\x5e\x0d\x91\x21\x63\x13\xc6\x80\x65\xe3\x79\xbf\xe0\x55\xd3\x71\x63\xbf\xe7\xf8\x8a\xc1\xcc\x7b\xd0\x2f\xbe\x39\x6f\x0e\x5c\x35\xc5\xee\x41\x6e\xfa\x42\xc0\xd1\x20\xf0\x61\x4b\x23\x98\x69\x9c\x68\x0a\x53\x1d\x59\x14\x39\x85\x07\x47\x5a\x8e\x42\x5f\x78\xa1\x81\xa4\x1f\xa9\x24\x56\x23\x65\x1a\x4b\x8c\x54\x2f\x52\x23\xad\x08\x0d\x29\x06\xf3\x71\xa4\x0d\x0e\x42\x70\xb3\x1c\xc7\xd6\x2e\xe2\x4f\x39\x9e\x39\x80\x5f\xf9\x50\x81\x3f\x3d\x18\x1b\xee\x6c\x6c\x6e\x75\x2a\x44\x5a\xb8\xb9\xb5\xb2\x64\xf7\x20\x48\xb5\x0b\x13\x9d\x41\xac\x60\x8b\x0a\x26\xa1\xa3\x05\x0d\x60\x4f\xf6\x60\x5f\x93\x38\x26\xc4\x45\x24\xd6\x0e\x9c\x4a\xa6\x65\x92\x61\x4a\xa9\xe5\x46\x64\x6c\xe3\x44\x0e\x65\x96\x45\x0a\xf7\x52\xc9\xfc\x44\x30\x57\xea\x1c\x13\x4f\xb9\x2e\xf4\x65\x1c\x45\x52\x88\x90\xc0\x5e\x1c\x0f\x4d\xee\x20\xa9\xf5\x1a\x7c\xde\x2f\x1f\x2c\xcc\xf1\x46\xf6\x7a\x2c\xaf\x54\x90\x81\xbb\xc9\x99\xa6\x03\x7e\xb7\x22\xe4\xca\xc2\x52\x67\x03\x2e\x75\x36\x86\x33\xd3\x64\x38\x51\x2c\xa1\x7c\x32\x0d\xfc\x08\xe3\x3e\xcc\x12\xed\x26\x24\x8a\x48\xd4\x8b\x8b\x09\xa4\xb3\x31\x9c\x68\x17\x4e\xea\x59\x9e\xab\xd1\xbc\x4d\xb2\xef\xc7\x38\xec\x6d\x33\x42\xac\xbe\xc7\xfd\x20\x60\x4c\x8d\x8a\x60\x30\xd0\xbd\xe1\x10\x80\x9a\xe5\x00\x66\xe8\x5a\x9d\xd0\x2d\xd3\x87\xb6\x24\xa3\xc1\x19\xd8\x45\xe0\x9b\x37\x94\x37\x99\xb5\xed\x72\x99\x9b\x73\x54\x2d\x83\xb1\x54\x35\xea\xb5\x95\x42\x70\xe6\x07\x50\x69\x11\xc4\x92\x38\xca\x13\xa3\x3c\xc6\x48\xc7\x31\x8c\x91\xce\xe1\x24\xf4\x35\xc1\xa1\x88\x67\xcc\x74\x04\xc8\x21\xf2\x48\x28\x03\xd2\xe0\x3e\x13\x94\x14\x33\x9d\x78\x2e\xe2\x61\x9f\x12\x0a\x85\x8e\x53\x25\xa0\x6f\xb5\x48\x44\xc2\x28\xee\x17\xbd\xc9\x64\xa2\x69\xc4\x48\x95\x87\x6f\x5b\x01\xa0\x4d\xd5\xc0\xc0\x05\x67\x4c\x2f\x0c\x07\xae\x6d\x9e\x84\x9d\x25\xbb\xb3\xdb\xe6\xde\xa0\x55\x1f\x86\xed\xce\x02\x3c\x07\xbb\x9b\x0b\x76\xa6\x27\x6c\x62\xf3\x14\x62\x6f\x92\x0c\xa2\x51\x2f\xd5\x23\x3a\xeb\x0f\x18\x86\x22\xd5\x23\x94\xb5\x54\x60\x8f\x8b\x89\x9e\x88\x89\xe5\x5a\x6e\xa2\x87\x3a\x9c\x31\x9c\x46\x4a\xc6\x32\x92\x23\x88\xe0\x50\x0f\x61\xa0\x83\x6c\x9a\x40\xc7\xf4\xd4\x36\x3d\xb8\xeb\xd8\x74\xe7\xff\x28\x20\xe0\x75\x40\xc1\xe7\xc0\x5b\xe0\x17\x4d\x56\xc9\xda\x45\xc3\xe3\x9a\xdd\x79\xf5\xf5\x53\xd6\x1c\xd6\x70\xe5\xc2\xa5\x9b\x70\xc5\x84\x08\xcc\x72\x6f\x74\xca\x03\x6d\x7e\x5f\x31\x97\x09\x0c\xc0\x92\xdc\xb0\xbd\xd2\x5e\x5c\x58\xea\x6e\xd4\x37\x56\x96\xe0\xd2\xd6\x2e\x54\x65\xbb\xbe\xb4\xb9\x75\xc9\x00\x32\x5f\x5a\x6b\xc2\xf7\x83\x71\x1c\xc4\x3e\xb3\xa3\x20\xa4\xd0\x91\xd2\xb1\x5a\xa8\xa7\x07\xe5\xd1\xf4\x4b\x2e\xd0\x12\x2e\xd5\x03\xd2\x67\x48\x67\x83\x9d\x52\xd6\x42\x84\xb0\x1e\xa7\xe3\x71\x0a\x3d\xac\x07\x16\xf1\x5d\x4d\x63\xc8\xf1\xa0\xaf\x5b\x7d\x38\x0b\x90\xeb\x44\xae\x17\x78\x7a\xe6\x79\x9e\x07\x5b\xc4\x75\xa3\xed\x14\xc5\x6c\x34\x12\x94\x22\xa4\x08\xa7\x83\x68\x07\xc0\x56\x3f\x84\xae\x3d\xf6\x5c\x2a\x72\xcf\x8b\xa9\x1e\xd1\x22\x11\x1e\x0e\x39\xc2\x24\x52\x34\x60\x5e\x2c\x21\x49\x68\x18\xfb\x54\x66\xd0\x0f\xfc\xe8\x7e\x62\xcf\xb6\x31\xb2\x67\xa6\x0d\x82\xce\x42\x17\xf9\x7e\x18\x86\x28\x84\x41\x9c\xfa\x81\xdf\x23\xa1\x1f\xfa\xb4\xd6\x12\x9e\x3b\x52\x88\x46\x92\xa0\x42\x58\x61\x2a\xf9\x18\xb6\x54\xe6\x29\x0f\xec\xe1\x55\xc4\xb5\xc9\x1c\x3f\xe3\x05\x83\x05\x0a\xe0\x41\xe6\xb0\x62\x35\xcb\x2d\xb3\x60\x22\x2f\x1b\x2b\xb0\xd3\xee\x34\x3b\x07\x32\x3e\x3b\x07\xe0\x12\x3a\x8d\xf9\x12\x56\xac\x64\xb7\x05\xba\x35\xc3\x98\x70\x4f\x86\xfe\xcc\x61\x4a\xa8\x52\x0e\x59\xa1\x1d\x15\x43\x64\x8d\xa8\x0a\x88\xc7\x82\xc0\xd7\x63\x87\xb3\x88\x32\xcc\x49\xdf\xd7\x33\x2f\xa0\x56\x54\xb8\x9e\x4b\x07\x54\xaa\x2a\xe0\x56\x8c\x6a\x93\xfb\x2d\x42\x1c\xe9\x04\x90\xe9\x64\x10\x0e\xa1\xb2\x5b\x5a\xcc\x8a\x64\x6a\x81\x62\x40\x8b\x7c\xe8\x48\x47\x41\x81\x42\x42\x31\x8a\x10\x8b\x98\xef\xed\x00\x09\xa9\xe3\x72\x26\x61\x44\xf5\xa0\xaa\xb1\x03\xf1\x4e\x6a\x33\x83\x6d\xb0\x00\x4e\x3e\x88\xdd\x64\x80\xe1\x36\xb7\xe6\xe8\x4d\xcc\x60\x30\x17\xc0\xf2\x52\xc2\xc6\xae\xce\x35\x0f\xf3\x9e\xd4\x13\xe4\x2a\x07\xd5\x11\x44\x3a\x4f\x68\xa0\x5d\x9d\x20\x29\x68\xea\x07\x70\x0a\x85\x56\x5a\xf8\x30\x81\xd4\x60\xc7\xc3\x41\x53\x35\x22\x93\x1b\xd8\xae\x3a\x26\xc2\xce\xf1\x7a\xf3\x92\xdd\x59\x5d\xb6\xe6\xf8\xe8\x4d\x73\xb7\x6a\xb0\xd3\xed\x8e\x1d\x58\x64\x08\x5b\x6c\x3a\xd2\x8e\x9e\xca\x7c\xcc\x67\xb0\x65\xa9\x82\xa5\x2a\x1f\xcb\x99\xe5\x58\x49\x7f\xc2\x86\x59\x31\x68\x44\x3a\x97\x42\xc0\x90\x23\x3d\x4c\x59\x16\x26\x8c\xe8\xac\xcf\x86\x43\x3d\x16\x9c\x99\x23\x08\x6c\xab\x5f\x61\xdd\x80\x27\xc0\x93\x20\x3c\x20\xa9\x2a\x3e\xdb\x59\xea\x3c\xd8\xca\x7e\x97\xcf\x5e\x5a\xa9\x22\xba\x1b\x9d\x46\xd3\xb8\xd6\xed\x08\x7a\x69\xc9\x9e\x7a\xa6\x6f\x3d\x04\x3b\x80\x47\x34\x8e\x08\x1c\xa4\xc5\x24\xe1\x11\xa3\x3c\xee\xb5\xc2\x22\x83\x03\x3d\xb6\x5b\x1a\x38\x2d\xcb\x2d\xe6\x5c\x37\x83\x20\x1c\xf5\x14\x61\x18\x51\xb4\x1d\x93\xc8\xca\x42\x1e\x84\x08\xcb\x96\x1a\x6d\x93\x71\xab\x35\xd4\x59\x96\x01\x0b\x44\x10\x5b\xad\x46\x58\xc5\xfd\x2b\x89\xb9\xb0\x6c\xd9\x6b\xc7\xa7\x8a\x33\x2e\x67\x92\x66\x49\xd6\x08\x59\x2a\xfa\x5c\xf3\x48\xa7\x3a\x63\xd0\xf4\xc4\xa8\x59\x15\xb6\xb0\x02\x75\x70\x1a\x74\xc0\x73\x00\xcc\x31\x68\x0f\x40\xd9\x96\x34\x36\x58\xfd\xbb\x50\x3c\xfb\x60\xed\x0f\xe2\x0b\xef\x43\xbb\x7b\xb5\x19\x0d\x93\x20\xd2\x91\x35\x11\xb4\x17\x73\xe8\xeb\x89\xcc\xa3\x69\xaa\x7b\x89\x9e\xc5\x43\x39\x9b\xc4\x38\x09\x63\x6b\x88\x29\x83\x4a\x33\xcb\x29\xa6\x44\x12\xec\xd1\x08\x99\xdc\x79\x0e\x65\x14\x05\x10\x34\x14\x4f\xb0\x92\x5a\x0c\x26\xe1\xb0\xa7\x26\x2c\xed\x43\xac\xf3\x81\x54\x53\xcb\x31\x6f\x15\x29\xf7\x3d\xae\xa4\xca\x59\xe4\xa5\x3e\xee\x29\xa9\xa8\xd3\x52\x66\x7e\x73\x4c\x4b\xb0\x00\xce\x81\xae\xe9\x7b\xd2\xdd\x87\x5b\x5a\x32\x0b\xb8\xb1\x52\x6a\x8f\xf3\x84\xbd\xad\x39\x70\xc1\x03\x62\x7f\xd9\xcc\xdb\x1a\x4f\x93\x52\x0f\x71\xf5\x24\xd1\x32\x99\x42\x24\x71\xac\x48\x44\x60\x30\x82\x03\x35\x18\x10\x1a\x11\x2f\x8a\x42\x1d\xf6\x18\x91\x98\xd5\xfb\x83\xc1\x60\x90\xe4\x79\x96\x4d\xfc\x34\xdd\x16\x56\x1e\x91\x04\x3a\x41\x9e\xab\x82\xb1\xc8\x51\x4e\x64\x31\xa9\x52\x92\xaa\x72\xdf\xe5\x06\x5b\x04\x83\x26\x78\x11\x90\x7d\xfd\x76\x61\x1f\x91\xf1\xf8\x72\x13\xd8\x2b\x8d\xe6\xf1\xf6\x03\x78\x38\x46\xd3\x9c\x03\xb1\xec\x3e\x95\x7c\xbd\x82\x0d\xdf\xea\xc0\xf9\x3d\x4b\xb6\x47\x89\x53\x73\x76\x80\xeb\x09\x1a\xf3\x34\xea\xf3\x1d\x20\xb0\xe7\x0f\x38\x0f\x88\x1f\x11\xdf\x6f\x21\xec\x3a\xc2\x4b\x52\x9c\x2b\xc7\xa5\x31\xe6\xd4\x73\x79\x40\x23\xc7\x1b\x0c\x10\x0c\x52\x2d\x60\x10\x44\xc4\x71\xa2\x06\xd6\xc3\x34\x85\x81\x4e\x55\x22\x22\xc1\x12\xaa\x87\xe3\x04\x4a\x6b\x10\xf8\x7a\x58\x0c\x7a\xbd\x56\xea\xd0\x88\x51\x1c\x22\x84\x39\x45\x12\x53\x14\xa0\x40\x06\x38\x0c\x71\x4c\xe2\xd0\x4f\xb0\x60\x59\x91\x30\x14\xc5\x7e\x5c\x9e\x7f\x61\x19\x3c\x96\xbd\x3c\x80\xef\x99\xeb\xae\x46\xee\x3d\xf0\xcf\xf0\xce\xe5\xb9\xbe\x5a\xaf\x60\x28\x2b\xf4\xbe\x83\xb8\x34\x73\x9c\xe5\x5a\x2c\x3c\x1f\xb6\xc2\x1e\x86\xbe\xce\x77\x41\xd0\x20\xdd\x8e\x83\x90\x4f\x45\x85\xd1\x58\x5e\xf7\x9d\xf2\xcc\x06\x3c\xa0\x22\x66\x94\xc9\x8c\x0d\x44\xcc\x58\x1c\x61\x4f\xbb\x0d\xe5\x47\xd1\xc0\xc9\x04\xe7\x82\x0b\x69\x85\x28\xa4\x33\x9f\xf3\xa9\x10\x33\x21\x2c\x96\xe7\x2a\x4f\x85\xe0\x92\x27\x82\xb3\xa4\x54\xfd\x22\x2e\xcc\x3e\x1c\x56\xf8\xc6\x60\x19\x9c\xab\xb4\x37\x33\xab\x25\x33\xd6\x8b\x6b\xb5\xfa\xda\xc5\xf9\x6a\x2d\x9b\xf1\x36\x60\xb7\x7d\x00\x50\xa2\xd4\x8b\x4b\x81\x52\x53\xa9\xeb\x5b\x1e\x4b\x06\x13\xac\x27\xe3\x1d\xa0\xb3\x08\x86\x43\x4e\x49\xc4\xa0\x17\xb1\x44\x11\x1d\x3a\x3a\xca\x61\x96\x9a\xa4\xf4\x54\xd3\xb4\x90\x16\x2f\xe7\xdb\x50\x1e\x42\x7c\x20\x48\x98\x20\xae\x90\x44\x71\xc4\x51\xc0\x7a\x58\x44\xb1\x6c\xdd\x97\x30\xcd\x32\xa5\xa7\xca\x74\x48\x4a\x4d\x33\x68\xbb\xc2\xa5\xaa\xb9\xc6\xa6\xc1\xbb\xbc\x70\x1f\x2d\xc8\x34\xd3\xd8\x97\x6c\x73\x48\x8f\xba\x69\x6a\xb8\xb4\x07\x82\x7d\x71\xf5\x01\x68\xa6\xfa\xda\xc5\x55\x08\x20\x4b\xe0\x20\x29\x47\x68\xb5\xca\x11\x7b\x44\xa7\xe3\x22\x23\x28\x10\x5e\x98\xe4\x31\xf4\x53\xcd\xe1\x48\x2b\xab\x05\x07\x3a\x54\x49\xa9\xe0\x21\x3c\x1d\xd1\x1d\xa0\xa7\x44\x20\xe4\x11\x12\x4e\xf5\x10\x41\x0a\x81\x9d\x47\x51\x14\x49\x2e\xfb\x24\x91\xd0\xa1\x24\xc2\x18\x8b\x48\xf0\x54\x72\xce\xf5\x38\x37\xad\x70\x43\x26\x65\x5f\x64\x15\xc8\x38\x13\xb1\x62\x1c\x40\xa0\x6a\xb4\x49\x8d\x6d\xf9\x80\x4d\xd9\xa4\xfd\xf7\x54\xdf\xf6\xd2\x7a\xae\xd3\xc1\x00\xd2\x7c\x5e\xd3\x11\xef\xe0\x5a\x6e\x70\x4f\x0e\x20\x27\xb5\x17\x1b\x57\xe0\x5a\x69\xcd\x76\xda\x07\x74\xa6\x8b\x0b\xed\xb9\x55\x23\xe0\xc8\x74\x26\x82\x29\x26\xd2\x8b\x91\x9e\x4d\xfb\x34\x4d\xd3\x64\xc2\x20\x49\x77\x40\xb9\x58\xbe\x31\x5e\x72\x8d\x28\xed\xb5\x02\x58\xae\x64\xa6\x72\x55\x0c\x2c\x3a\x1b\xa8\x19\x44\x30\xd0\xae\xc5\xf3\x0a\x83\xc4\x60\xe5\xd5\x01\x38\x02\x5c\x70\x0e\x5c\xac\xf6\x14\xa8\x37\x2f\x42\x50\x5f\x9b\xb7\x05\xaf\xf6\xce\x3e\x9e\xed\xda\xa6\x3d\xe9\x39\x2e\x54\x30\xa3\x9a\x6a\xa2\xa5\xf6\x89\xc5\x35\xb5\x78\x6a\xf1\x42\xa6\x85\xac\x25\x93\x24\x95\xe3\x02\x24\xc9\x34\x99\xd4\x41\xe0\x3a\x7a\xac\xd2\x14\x62\x3d\xcc\x15\x04\x5a\x96\x92\x2c\x29\xb8\x25\x69\x36\xa2\xa3\x01\x0e\xc6\x19\xe9\x55\xba\x02\xb7\xb2\x46\xd2\x90\xe0\x18\x58\x32\x59\x7e\x66\x97\x83\xfa\xda\x45\xd8\x29\xd7\xbd\x1a\x48\xb5\x5f\xec\x28\xf5\x7d\x6b\xaa\xfb\xf7\x39\xae\x85\xd0\x2b\x82\xbe\x9e\x70\xd8\x87\x40\x10\x85\x05\x63\x48\x21\xd6\x90\x41\xe0\xab\x62\xda\xeb\x71\x98\x48\xc6\xfb\x84\x44\x24\x22\x3e\x8e\x08\xc1\x26\x9f\x00\xdb\xa5\xcd\x61\xb4\xf6\x85\x7d\x1c\xb9\x83\xb0\xbd\x26\xaf\x70\x6e\x4a\x26\x30\x4c\x18\x16\x22\x83\xbe\x1e\x55\x90\xbc\x2c\x61\x23\xae\xa7\x2c\x0a\x65\x10\xd9\x53\x4b\x6a\xc5\x44\x9c\x49\xaa\x64\xaf\xe4\x6c\x45\x60\x4d\xf5\xa4\xaf\x66\x30\xb6\x92\xfe\x80\x0c\xfa\xa0\x61\xf7\x4a\x1d\xa1\xd6\x33\x31\xf6\x63\x60\x61\xde\xdb\x73\x0e\xde\xb4\xb0\x07\xd7\xd8\x5e\x59\x3d\x70\x5f\x23\x56\x56\x60\x55\xca\x3b\x29\x33\x21\xb2\xcc\xa6\x32\x93\x32\xcb\x6a\x3d\xed\xcb\x81\xc6\xdb\x63\xce\x6d\xaf\x18\xc3\x44\xee\xdf\x56\x38\xf4\xd8\x1e\x37\x38\x70\xc0\xa2\xb1\x51\x3c\x70\x11\xdc\x30\x27\x72\x69\x65\xa9\xdb\x36\xd5\x0e\x15\x6c\x9a\x5d\x7e\xdd\xdc\xd9\xd1\x5d\x32\x1d\x76\x37\xec\xee\x92\x21\x4b\x7b\xd1\x58\x61\x55\x79\xbf\x5d\x91\x6a\xed\xfa\x96\x49\x2f\xb2\xd3\xe1\xa8\x50\xad\x48\x44\xd0\x4f\x7d\x2c\x31\xc6\x43\x2c\x48\x22\xc2\x80\x90\xd8\x0f\xdc\x16\x0d\x39\xc5\x49\x10\x38\x52\x05\x81\x27\x59\x3d\x17\x23\xed\xeb\x40\x4b\x0c\x25\x1c\x5b\x83\x2c\xd3\xbd\xd1\x68\x34\xd2\xe9\xb8\xfc\xd1\x22\xf3\x82\x38\x0c\xf4\x24\xf4\x94\x97\xc6\x08\xc3\x50\x8f\x1d\x57\x60\x57\xb5\x2c\x31\xe0\xe0\x10\xc8\x76\x70\x93\xd4\x5d\x70\x11\xf8\x73\xbb\x36\x04\xcf\x81\x17\xc1\xcb\xe6\x2c\xee\x79\x75\x1e\xfc\x57\x59\x23\x5b\xe5\xd6\x5e\xde\x75\xa2\x54\x2d\x7b\xcf\x42\x03\x6b\x62\xce\xa2\x11\xdd\xe6\x0f\x8c\x32\xd6\xcf\xa8\xeb\x0e\xbc\xd4\x87\x99\x26\xc6\x99\x50\x5e\xd9\x76\xa2\x10\x8a\x86\x52\xcb\x34\x85\xb9\x46\xe5\x55\x75\x8d\xab\xae\x1a\x8b\xa2\xc4\x4b\xc2\x42\xaa\xca\x26\xd6\x6e\xdd\x2d\xa6\xa1\xe7\x33\x87\x32\x1c\xe3\x38\xe4\x04\x8e\x50\x48\xb3\xd1\x36\xaa\x0f\x87\x91\x1e\xd3\x62\x8a\x71\x1f\xe3\x34\xac\xd1\xf7\x66\x34\x92\x91\x35\xb0\xdc\x21\xd1\xe3\x38\x06\x96\x05\x0c\x1e\x6d\x08\x3a\x46\xba\x19\x3b\xe1\x11\xb8\x2b\xce\xb7\x0c\x1b\xdd\xdc\xa8\xb8\x69\x69\x19\xac\x3e\xf4\x2f\x9e\xdc\xda\xff\x0b\x8b\x59\x9e\x4e\x3d\x98\x38\xac\x17\x0b\x37\xa1\x61\xe8\x0c\xa7\x21\xf4\x26\xad\xc1\x08\x41\x30\xd0\x34\x82\x44\x33\x2b\xb5\xb0\x4e\x7d\x98\xb4\x58\x2f\x96\x8e\x8a\xc3\xc0\x2d\xff\xc0\x1d\xb5\xc6\x53\x04\xfd\xb1\x26\x04\x12\x4d\x1a\xa1\x0e\xc6\xdb\xb9\x9e\x79\x89\x17\x4f\x04\x95\x2c\x45\xb8\x7c\x92\x70\x3c\x14\xe5\x7b\xd9\x0e\xf0\x12\x8f\x0e\x62\x2c\x29\x8f\x22\xc5\x84\xe8\xc1\xf1\x70\xb7\x66\x17\xd9\x5e\x43\x98\x7c\x17\x83\x7c\xb6\xd4\x68\xee\x0b\x83\x7d\xce\xd8\x49\x06\x69\x4e\xa8\x1f\x06\x02\x23\x8c\x68\x14\x25\x31\xa5\xd0\xcb\x34\x9b\x83\xbd\x0e\x13\xcf\xa3\x14\x8b\x08\x13\x29\xe2\xed\x91\xed\x29\x9c\x0c\x61\x56\xd9\x64\x06\xe7\xba\x86\xc1\xd9\xb9\xcf\xed\x49\x83\xb9\xf6\x70\x6d\xa1\xda\x33\xc7\xeb\xf3\xac\x17\xb3\x65\xba\x4b\x5b\xf3\xf1\xd8\xc6\xa0\xb0\xa7\xd2\xf5\xa1\x83\x7a\x18\xc6\x5a\x40\xa2\xfb\x06\x8b\x29\xd9\xce\x13\x3f\x8c\x33\x98\xed\x2a\x09\x7a\x5a\x30\x45\xa3\x90\x07\x58\x0d\x95\x83\x15\xae\x61\x9f\xd2\x91\x9b\x2b\x25\x84\x50\x8a\x58\x19\x0e\x63\x08\xfa\x4a\xed\x00\x21\xf4\x54\xd9\x72\x12\xd2\x18\x47\x64\xdb\xad\xb5\x3c\x3d\x1b\xe1\xaa\x4e\x36\xb6\x44\x2d\x6a\x30\x93\xdb\xba\x5c\x7f\x3f\xda\x78\x25\x4f\xcb\x9b\x9a\x8b\xb4\x82\xb1\x4e\x06\x8a\x72\x91\x24\x53\x0a\x83\x44\x33\xd8\xef\xf5\x43\x38\x6c\x30\x81\x32\xe9\x08\x26\x39\xd5\x39\xc4\xa9\xe0\x49\x26\x13\xd7\x91\x81\x91\x57\x41\x13\xdb\xc8\x74\xb5\xac\x7c\x08\x8d\x66\xc7\x69\xee\x9b\xa6\x2b\x26\x17\xbf\x54\xf2\x2f\x6e\xc1\xa9\xcc\x30\x8c\xa4\xf2\x82\x5a\x1e\x06\x69\x9c\xfa\xa3\x28\x08\x66\xaa\x90\xc2\x8a\xa4\x9e\xcc\x74\x2b\x86\xfd\xa9\xe5\x52\x24\xd9\xd0\x47\x41\xd1\x57\xc2\xe9\x39\x29\x94\x3a\xd4\x63\x39\x85\x4c\xf7\x07\xa2\x57\xea\x0f\x35\x3b\xd8\xc1\x4d\x55\x1b\x19\xec\xa6\x27\x2a\xbd\x67\xee\x5f\x2b\x37\xf5\xae\xfe\x53\x39\x57\x2a\x95\x6d\xdf\xd5\x60\x52\xdc\x2b\xf5\x0d\x28\xd7\x1a\x6c\xcf\x5c\xcf\x9a\xe9\x00\xc3\x29\x11\xd9\x28\xd4\xe3\xf1\x50\xcf\xd0\x20\x89\x08\x0a\xa2\x41\x92\xbb\x1e\x95\xe9\xae\xf7\xb4\x15\x2b\x85\x35\xa9\x8d\x3c\xcc\x82\x40\xbb\x34\x16\x24\xf0\x64\x10\x45\x9e\x74\xfd\x00\xf9\x2e\x23\x3d\x98\x7b\x5e\x2c\x74\x46\xf5\x24\xd2\x11\x0a\x43\x0a\x2c\x6b\xb2\xc3\x9b\x55\x0d\x6d\xc7\x54\x2d\x75\x9a\xcb\xcd\xee\xbe\xce\x73\x10\x23\xdc\x08\xd4\xb1\x35\x2e\xbc\x50\x79\x93\x14\x66\x1a\x97\xdc\x1d\xce\xee\x13\xcb\x35\xc8\x48\x03\x3f\xe4\xc2\xc6\xc2\x09\x22\xc6\x94\x90\x06\x4d\x4c\xe0\x30\x4a\x4c\xff\x6e\x06\x07\xc6\x3e\xb9\x08\x2e\x83\x00\x6c\x82\x0f\xef\xeb\x14\x25\x6d\x36\xb7\x96\xad\xfa\x5c\x8d\x6d\x5e\x5a\xab\x55\x74\xda\xdc\x9a\x9b\x24\x95\x44\x87\xe6\xb1\x42\x0d\x66\x36\xee\xdb\xc1\x76\x1a\xc5\x04\xb1\x58\x4d\xf5\x34\x4f\x3d\x4f\x48\xaa\xbc\x40\x8f\x74\xea\xa7\x49\xac\x78\xbc\x3d\x99\x8a\x48\x11\x59\x1f\x49\x29\x79\x7a\x3f\xe7\x6a\xc4\xc7\xb5\x5e\x4f\x71\x99\x1a\x70\x34\x15\x07\x01\x93\x81\xce\x33\xcf\x0b\x7c\x94\x0e\x10\x21\x38\x10\xb1\xa4\x11\x57\x3e\x93\x44\xb0\x88\xf4\x63\xc6\xf5\x34\xea\x27\x3c\xe1\x54\x2a\x83\x34\x5d\x07\x3d\xdb\x69\xb2\x46\xb8\x97\x7b\x76\xba\x9c\xd3\x2e\xbc\xed\xc6\x1c\xe0\xb6\xf2\xf7\x95\xca\x64\xaf\x31\x28\x26\xb0\xf7\x1e\x80\xc3\x62\x54\x73\x74\xdf\x24\x43\x0f\xe1\x00\x92\x14\x3a\x8d\x50\xa5\xa5\x41\x98\xa6\x69\xaa\x95\x91\x2b\x00\x34\xac\x0a\xc7\xff\xe0\x77\x5c\xab\xd6\x6a\xff\x5b\x56\x96\x60\xb7\xbd\x62\x4a\x38\x0d\x06\x70\x45\x55\xa3\xb1\x96\x4a\x81\xf1\x40\x5a\x83\xda\x50\x33\x48\xee\x27\x10\x6b\x65\x65\xb9\xce\xf2\x1c\xe2\x5c\x66\xf7\x07\x96\x9f\x5a\x81\xc6\x29\xf4\x99\x1e\xf7\xd3\x5c\x67\x14\x06\x99\x8e\x1a\xa1\x52\xc5\xd0\x0a\xca\x95\xd4\xd1\xae\x9c\x80\x5e\x91\x2a\xa5\xc6\x03\x39\x85\x55\x27\xfa\x6c\xc0\xfb\xd0\x01\x96\x35\xde\xe1\x73\xbf\xf7\xc6\x03\x7e\xef\xce\xd2\x41\x98\xcd\x9b\xd0\x78\x90\x2a\x0d\xda\x3e\xa0\xfc\x97\x07\xc1\x8e\x21\x35\xe2\xc9\xf2\x74\xee\x21\xd4\x4a\x5b\x28\x4d\xe2\x61\x92\xf1\x94\xeb\x11\x1c\xe8\xb4\x05\x45\x5a\x69\xd3\xf7\x23\x0b\x68\x51\xef\x0d\x87\xc9\x28\xe9\x79\x6e\x18\x87\x7d\x12\xc6\x23\x3d\x4e\xe2\x24\x4b\x46\xdb\xc9\x74\x9a\xec\x80\x24\x81\x55\x0f\xf9\x68\x07\xd5\x66\x8d\x00\x9c\x33\x48\x86\x4f\x81\x67\x8c\x26\x55\x72\x89\xda\x72\xf3\xd2\xaa\x61\x19\x2b\x1b\x15\xa2\x6a\x25\x78\x57\x3b\xed\x07\x5f\xb0\x0d\xbe\xe1\x2e\xca\xa1\xc1\x8d\x95\x70\xda\x92\x8e\x0b\xc3\x71\x34\xd1\xf9\x68\x42\xa1\x37\x8a\x54\x0f\x0d\x7b\x49\x86\x7a\x42\xcf\xac\x10\x0e\x55\xcc\xc3\x94\xcb\x5e\xd8\x93\x7a\xe6\x8a\xbe\xce\x23\x18\xc0\x88\x4f\x35\x8e\x60\x0a\x13\xd9\xd7\x4c\x2b\x6c\x91\x46\x50\xe4\x2d\xec\x3a\xa5\xfa\x9e\x64\xb1\x10\x39\x63\x54\x31\xa6\x64\xac\xa2\x48\x14\x38\x23\x58\x12\xc2\x22\xa2\x30\x29\x1c\x9c\x0b\x2e\x7c\x34\x4d\xb9\xf2\x51\x36\x8a\x24\x07\xf5\x52\x6f\xb7\xa7\x0d\x6e\x3c\x1d\x6b\x20\x04\xb7\xf6\xfa\x50\x57\x70\xdd\xbb\xbc\x77\xae\x5f\xcc\xbd\x1d\x73\x30\xee\xcd\x8d\x65\x53\x70\x60\xd5\xd7\x6e\xc1\x8d\xb9\x46\x0d\x13\x3d\x83\x44\xc5\x28\x21\x64\xa8\x55\x26\xca\x33\xce\xa4\xe8\xb7\x68\xa9\x4c\x5a\x22\xf4\x84\x8b\x8a\x11\x24\xad\xa4\x05\xa5\x8e\x91\xce\xe3\xa4\xa7\x87\x96\xaf\x44\x2c\x54\x2d\x56\x50\x68\x99\xa4\x7e\x39\xd0\x38\x16\x31\x19\x41\xb7\xcf\x98\xb4\x38\x65\x84\xd1\xed\x09\x8e\xfc\x08\x0f\x70\xd4\x8a\x50\xa2\xc7\x63\xc1\xa6\x1e\x89\x25\x57\x73\xdf\x1c\xdd\x89\x6c\xd5\x60\xe0\xfc\x3c\xaa\xb2\x6c\xc1\xcd\x2d\xc3\x2d\xd6\x76\x7d\x1a\x86\x63\x2c\x2c\x5b\x25\x3b\x59\x98\xb3\x8d\x72\xa7\x59\x99\x1a\xef\x80\x7e\x82\x04\x45\x32\xc0\x24\xe5\xdc\xe7\x9c\xa7\x99\x54\x5c\x46\x98\xa7\xa1\x27\x3c\xa4\x59\xe2\x52\x15\xd5\x65\xa8\x1d\x3d\x09\x82\x14\xe5\x53\x9c\x7a\x6e\x41\x2d\xee\xb9\x42\xf4\x25\x9f\xc1\x20\xd4\xd3\x01\xc2\x79\xd1\x12\xa9\x9f\x88\x96\xbf\x03\x86\x78\x04\x80\x05\xfa\x76\xab\xe9\x37\x24\x58\x30\x88\xc3\x66\x58\x25\x0f\x9b\x97\x11\xae\x5e\x5a\x83\x0f\x84\xa3\xac\xfa\x5a\x29\x8e\xc6\x22\x52\xde\x54\x8f\x50\xe0\x43\x32\x65\x13\x3d\x86\x6e\x80\xa0\xb0\x49\x8b\xc9\x90\xb9\x1c\x05\x7e\x4b\x8f\x5a\x3b\x80\x8f\xc7\x75\x92\x4f\x10\x8d\x23\xe5\xb4\x2c\x14\x52\x11\x05\x9a\xc6\x31\x85\x2d\xed\xce\xdc\xd4\x95\xd0\xd7\xc9\x58\x66\xb0\x05\x40\xd3\x0a\x76\x90\xb1\xf5\x16\x0c\x06\xee\x6e\x85\xc1\x7c\x64\xcd\xb5\x6a\x60\xcd\x76\x49\x33\x78\xc0\x7b\xbb\xb0\x52\x81\x51\x1f\x80\xa1\x36\xfc\x6b\x17\xe3\xa8\x16\xd0\x50\x39\x83\x29\x8a\x60\x2b\x67\xd9\x84\x53\xcf\x87\xbe\x25\x89\x0a\x88\x47\x90\xef\xb5\x86\xce\x48\x0d\x1d\x61\x45\xe9\xf6\x20\x4d\x8d\x72\x31\x83\x68\x7b\xb0\x7b\xa7\xf3\x7a\x98\x66\x08\x31\x2a\x7d\xcb\x2f\xa7\xe1\x6b\x11\x04\x11\x86\x6e\x31\x9a\x38\xa9\x43\xa1\xd0\x64\x14\x0d\x21\x2d\xf0\x36\x8b\x88\x2d\x75\x3f\xcf\xf3\x62\x32\x18\x54\x75\xf4\x56\x7f\x87\xd4\xc3\x06\x37\x35\x6b\x5d\xe7\x11\x58\x8e\xf8\xc0\x9c\xb6\x36\x6b\x51\x82\x07\x69\x3c\x89\x64\x8a\x28\x04\x7d\xde\x1f\x49\xaf\xee\x16\x5c\xc7\x7a\xc0\x64\x02\x1d\x14\x4a\xbf\xe6\x86\x4c\xc4\xc1\xb6\x0a\xe3\xca\xce\x8c\x77\x48\xdd\x37\x34\xf3\xc1\xc7\xc1\xa7\x76\x7d\x84\xe6\xa3\x37\xe7\xe4\x5a\x7b\x10\xf0\xb4\x62\x65\x2b\xf6\x5c\xe5\x5b\x35\x70\xb7\x86\xa1\x6d\x99\xff\x61\xfc\xc6\x17\xb7\xda\x55\xb0\xa2\xe4\x30\x55\xe4\xc7\x42\x51\xc8\x5b\x4e\x7f\x14\xe2\x71\x2f\x4e\x06\x94\x20\xe8\x5a\x1e\xc6\x28\xf2\x62\xdf\x4f\x5c\x15\xc5\x2e\x6f\x49\xc7\x99\xce\xc8\x6c\x07\x30\x06\xc7\x79\xc9\xf5\x08\x0e\xd2\x30\x1c\xba\xda\x29\x7a\x2e\x6c\x4d\x34\x85\xe9\x90\x2b\x02\xfb\x31\x09\x65\x80\xeb\x3c\xcd\x90\xef\x11\xa4\x1c\x38\xf2\x31\xc7\x9e\x1e\x78\x9e\x98\x69\x1f\x63\x47\x38\x3e\x0c\xf5\x48\x70\x3a\xd4\x71\xe0\xb4\x04\x16\xb8\x17\x21\xc1\x85\x1e\xb4\xb8\x0c\xe2\xc8\x53\x28\x50\x8e\x0b\xb1\xe0\x11\x0e\x65\x5a\x8c\x29\x0b\x59\x54\xf1\x4f\x83\x83\x6a\x8b\x03\xb5\x2b\x07\xb8\xfc\x3c\xe8\x3a\x07\x3f\x6f\x57\x55\xcb\xbb\x7b\xa7\x7a\xc6\x56\x94\x58\xac\x50\x56\x5c\x24\x76\xb4\xdd\x4b\xb6\x07\x76\x58\xf4\xac\xa8\xe8\x29\x38\xd0\xa1\x45\xe1\xf0\xfe\x70\xf7\xce\x46\x08\x71\xa4\xdd\x50\x26\x89\x0c\xe1\x04\xe9\x19\x21\x64\x07\x60\x8c\x2b\x7e\xd0\xcc\x1a\xc4\xf8\x82\xcf\xee\xae\xd4\xf2\x2e\xb4\xf0\x89\xda\x3e\x28\xe9\x6a\xbb\x03\xdd\x44\x30\xa9\xc2\x54\x30\x99\xb4\x60\x5a\xf2\xde\xb1\x85\x71\xc1\x74\xaa\x73\x2e\x24\x85\xad\x1d\xd0\x20\x84\x49\x11\xcd\x08\x53\x32\xd2\xe3\x82\x10\x94\x46\x31\x63\x49\x6a\x05\x66\xfe\x74\x07\x35\x7b\xb5\x89\xf1\x6c\x95\x1a\xcc\x33\x46\xcb\xab\xed\xc1\xd7\x6f\x94\x52\x61\x6b\x63\xc5\x9c\xfc\x92\x08\x9b\x0b\x73\xf9\xb1\xff\xea\x82\xd9\x10\x75\xf3\xb8\xba\x0c\xea\x6b\x17\xed\x49\x82\x60\x02\x87\x44\xe3\x52\xaf\x2c\xa6\x18\xe6\xb0\x35\xd5\x7d\x0c\xd3\x49\x94\xe9\x21\x1e\x48\x3d\xb6\xa6\x2e\xb6\xc6\xa9\x18\x63\xe8\x2a\x3f\xd1\x03\x32\x8e\x75\xee\x70\x3d\xd1\x0c\x43\x06\xa7\x52\xe7\x05\x43\x16\xb3\x90\xd2\xc1\x76\x80\xec\xd4\x8e\x02\x94\x52\x49\x87\x43\x26\xa2\x34\xe9\x51\x26\xfa\x71\x4a\x45\x88\xa5\x26\x0e\x4c\x8b\x7e\x16\x61\x16\x31\x9e\xc4\x02\xa1\x62\x48\x55\xc4\x89\x83\xc6\x94\x47\x2e\xd6\x33\x2e\x68\xa9\xb7\x59\xbe\xc1\x25\x3d\x64\xe2\x14\x57\xc0\xf3\x95\xe5\x61\x62\xe9\x9b\xf6\x6e\x0c\x68\xd9\x6a\xee\x31\xe3\xb9\xe6\x66\x4e\xc4\x26\x7c\xc8\x6b\x5b\xe5\x5f\x5f\x5a\xb3\x87\xa9\xe7\x0e\x8b\x99\xf2\xfd\x52\xd9\xb1\x91\xea\x65\xc3\x40\xe0\x40\x7a\xf9\xc8\xe7\x2c\x4e\x52\x2e\x29\xc7\x61\x78\x7f\x8a\x7c\xe1\x0e\x26\xbe\x12\xbc\xd7\x17\x22\x16\x11\x46\xa1\xea\x8f\xc6\xae\xd3\x90\x3e\x75\xb7\x13\x3b\x0e\x34\x9d\x14\xbd\x09\x4c\x02\x2d\x26\x48\x86\xfd\x21\x92\xd8\x17\x72\x60\x10\x81\x32\x19\x86\x4c\x0f\x7a\x83\x90\x23\x5f\xc8\x21\x8f\xb3\x61\x90\x49\x84\x62\x1e\x68\x35\x41\x28\x9c\xfb\x58\xb2\x7f\x23\x1f\x0b\x4a\x38\xe6\x3c\x87\xa1\x1e\xe4\xb2\xdc\x2a\x2c\x65\x63\xae\x27\xac\x14\x8b\xd4\xf8\x58\x98\x4c\xe8\xa8\x17\xee\xfb\x58\x66\x7a\xd4\x3b\xe8\x63\xb1\x60\xbc\x43\x9a\xaa\x16\x18\x8c\x0e\x00\xbb\x4b\x73\x27\x78\xa5\xc1\xed\x33\x1b\xd8\x59\x5a\xac\x3a\x35\xd5\xc2\x14\x47\x92\x2a\xd6\xeb\x41\x87\x68\x39\x25\x31\x46\x1e\xc6\x41\xa1\xac\x50\x8f\xf5\x38\x82\xb1\xd2\x71\x2d\xe8\x29\x29\x24\xe9\xa9\x69\x92\x4e\x60\x56\x64\x3c\xf2\x12\x2f\xb2\xa6\x89\x5f\x4c\x87\x62\x66\x00\x2b\x2c\x10\x5b\xae\x89\x09\x2f\x80\xf3\xfb\x1a\xec\xae\xf6\x5f\x41\x16\x57\x95\xb8\xe5\xab\xbd\x46\xbf\x18\x98\x33\xca\x66\x23\x8b\x6a\x04\xf3\x62\x6c\xe5\xd0\x2d\x5f\xd3\x93\xf2\xf7\x06\x56\xa9\x46\xbd\x24\x49\xe1\x20\xdd\x9e\xc1\xc0\x60\x4e\x66\x73\x5b\x96\xd8\xbd\x46\x68\xb4\xd9\x0e\xb8\x6c\x64\x53\xf5\x9d\xdd\xb9\xc8\xe9\x6e\xac\x94\x3a\xad\xdd\xd9\xa8\xba\x72\xac\x2c\x39\xcd\xb5\xd5\xe5\xf6\x8a\x71\xea\xd4\x37\x6f\x42\xe3\x66\x64\x76\xa8\x27\x53\xa1\x5d\x39\x9a\xc1\x2c\xca\xe0\xc4\x0b\x48\x18\x45\x14\x66\x01\xf3\x9c\x96\x26\x84\xc0\x89\x76\x1b\xa1\xcc\xdf\xe3\x22\xa9\xa7\x79\x9e\xe7\xdb\x99\x72\x43\x02\x73\xa6\x07\x19\x99\x3a\x30\xd0\x34\xf4\x82\x64\xcc\xb6\x5b\x7d\x23\x03\xf0\x0e\xb1\x5b\x0d\xc7\xe0\x8c\xb5\x4b\x09\x63\xc0\x16\xe6\xee\xc5\xf3\xa6\x4e\xbe\xd4\xb6\x73\x0b\x68\x40\xac\x52\xbb\xdc\x01\xa1\x6a\x71\x46\x61\xaa\x54\xc3\x51\x3a\x57\xf7\xd3\x1a\xed\x39\x3a\xd0\x63\x0a\x5b\x50\x15\x91\xe9\x33\x8a\xeb\xb8\xe1\x80\x85\xaa\x82\xdb\x58\x86\x16\x5c\xdb\x5c\x30\xf2\xe5\xf8\xc2\xca\xc2\x89\xe5\xad\xcd\xad\x15\x8b\x5a\x13\x2d\x5d\x0f\xf2\xb0\x18\xd3\xa9\x60\xc2\x0f\xf8\x80\x0e\x73\x11\x87\x8e\x33\x6d\x38\x8a\xb3\xed\x40\x0b\x95\x42\x4f\xc4\x34\xe2\x90\xc1\x61\x91\x50\x96\xd3\xa4\xd4\x93\xc2\x1d\x66\xcf\x1a\xdc\xd8\x0b\x17\x0c\x7f\x32\xc1\x43\xab\xb9\x06\x9a\x06\x78\xfa\x81\x80\x4f\x7b\xa5\xbd\x02\x27\xd2\xc9\x47\x51\x3e\x48\xc6\x31\x74\x5b\xb0\xaf\x49\xdf\x6e\x61\xec\x85\x5e\xe8\xfa\x7a\x9a\x0c\x1b\xdc\x0f\x75\xda\x4f\xfa\x30\xd2\xfd\x61\x0c\xfd\x99\xec\xe9\x28\x22\x8e\x6c\xf9\xd0\x29\x42\xd3\x9e\x0f\xb4\x00\xdd\x61\x46\x3e\x1c\xac\xc7\xd9\xac\x30\xa3\xdb\x9d\xad\xee\xc6\xca\xea\xfb\x9e\x4b\x3a\x54\x92\xb3\x5b\xa9\xff\xcb\x07\x63\x1a\x1d\xb8\x7b\xd3\xce\xe1\x58\x7b\x7c\x32\x81\x23\x38\xd4\x01\x1f\x8d\xe0\xd8\xbc\x32\x9d\xbe\x37\x6a\x28\xcd\x63\xd7\xe9\xa7\x34\x9d\x0d\x6d\xa2\x19\x73\x1d\xc9\x63\xc6\x68\x8a\x07\x54\x67\x8d\x96\x50\x44\xa1\x7e\xa4\x73\x5b\xe8\x41\x1c\xc7\x7b\x0f\x7a\x2a\x82\xc0\x27\x11\x95\x12\xaa\x20\x70\x11\x66\x11\x8a\x43\x4e\xfa\x9a\xd1\x52\x42\x93\x4c\xb3\xdd\xd8\x30\x6e\x26\x76\x1f\x1c\x03\x8b\x46\xc3\x2b\x8d\x86\xba\xc9\x7a\x32\xfc\xbd\xd9\xb9\xb4\xd6\x38\xd8\x60\xe1\xe6\xbc\xd3\xdb\x34\xf1\x3c\x28\xe1\x20\x1a\x8f\xb7\xb3\x6c\x40\x2c\x8e\xac\x24\xef\x09\x1d\xd4\x32\x84\x23\xe5\xf5\x90\x57\x4c\xa5\x8e\xed\x7e\xe0\x7a\x79\xac\x50\x44\x09\x41\x72\xa0\x08\x8d\xf4\x68\x07\x60\xe2\x28\xd7\xa7\x3a\x82\xbd\x72\x1c\x64\x87\xd9\x3d\xb3\xbe\x6b\xe0\xea\xdc\xcf\xb1\x60\x60\x90\x2f\xd5\xe7\xaa\x47\xe5\x02\x5d\x5a\xad\x42\xd6\x95\xea\x31\xd7\x3a\x80\xc8\x19\x6c\xc9\x24\xc8\x53\xa6\x74\x0c\x67\x7d\xe8\xea\x09\x25\xb1\x48\x60\xe0\xea\x4c\xd3\xb0\x97\x94\x36\x5e\xdf\x25\xa1\x08\x71\x9d\x0d\x05\x1b\x41\x27\x88\x44\x2a\x7a\x59\xd2\x4f\xa6\x34\x8e\xb3\x18\x13\xc9\x48\xe2\xfa\x96\x9b\xf4\x75\x94\x66\x61\x9e\x54\x7e\x7a\x5b\x34\x3c\x83\x6e\xb9\x58\x45\xd0\x97\x56\x4a\xdd\xbc\xbe\xb6\xd5\x5e\xd9\x45\xb7\x68\x6f\x6e\x6d\x74\x62\xdb\xa5\xc9\x44\x8f\x3d\xc1\xa1\xb3\xeb\x6c\x4a\xb8\x9e\x36\x3c\xf5\xdd\x0c\xf2\xd0\x4f\x9d\x9a\x30\xd6\xa6\x0f\xfd\x02\xbb\xee\x70\xb7\x96\x0f\xd9\xa5\xee\x57\xdf\xd5\xb3\x2b\xe7\x40\xa9\x84\x74\x97\x56\x16\x9b\xab\xcb\x75\xc3\xa2\x9b\x6b\xab\x9b\x5b\xf3\x94\x90\x4d\x18\x20\x5f\xfa\x21\x1c\x73\x4c\x32\x3d\x1d\x8d\x1c\xe8\x39\x3a\x43\x23\x96\xe0\xa1\x0b\x81\xd3\x1a\x0e\x67\x10\x89\x06\x67\x12\x29\x16\xa2\xbe\x50\x13\x25\x98\xa7\x7c\xad\x06\x5c\x41\xcf\x55\x1e\x53\x6a\xa2\xe6\x6b\x80\xcd\x18\x6c\x70\xc8\xf4\x15\xec\xb6\x57\xe6\xd6\x93\xb1\x37\x20\x4b\x53\x18\xd0\x50\x84\x91\xe6\x89\x83\x15\x6a\xf0\xd9\xb0\xe1\x72\x81\x05\xf3\x3d\x9d\xcd\x0c\xf0\x9b\x05\xf0\x0e\xb6\xc7\xb5\x21\x38\x6e\x50\x82\xf7\xf7\x7e\x67\xbe\xa9\xec\x0f\xec\xa7\x15\x38\x53\x8e\x3b\xec\xc7\xbd\x0c\x53\x98\x68\x3f\x24\x14\xba\x3d\x6b\x8c\xb0\x8f\x3d\xe2\x79\x7a\xaa\xb2\xda\xd0\xf7\x03\xd9\x13\x99\xe4\xb1\xc0\x61\x69\x10\x53\xdd\x27\xd8\x91\x6e\x90\x95\x16\x3b\x00\x36\xe4\x40\x35\x64\x5d\x9a\xb5\x5a\x99\x7f\x7b\xbd\xf2\x50\x5d\x5c\x7e\x1f\xa3\xd8\xdd\xcb\x13\xe9\x3a\x19\x94\xb1\x16\xf9\x50\x67\x04\x46\x41\x69\xa9\x0f\x6c\x81\x51\x18\x79\xd4\xf7\xb5\x92\x3b\xa0\x2e\xb1\xeb\x8e\x62\xa5\xc6\xc3\x1e\x4f\x99\xe0\x7a\x54\x25\x68\x48\x1d\x40\xd3\x57\x55\xed\xe0\x06\xa9\xb9\xc0\x36\x5d\x2f\x1f\xca\x95\x3a\x56\x64\x93\xed\xfe\xa0\x96\x13\x42\x84\xa7\x42\xbf\x98\x24\x5a\xd5\x5c\xd5\xd7\x61\x14\x39\x89\x13\x40\xb7\x68\x59\x33\x00\x9a\x26\x3e\xa4\xea\x2d\x70\x7b\xee\x51\x7f\x0d\x7c\xaf\xd1\xde\x2b\x8d\xb4\x5b\x9e\x0a\x33\xb7\x92\x80\xbb\xfe\xc6\x95\x8d\xce\xc1\x7f\x97\xd6\xb6\x3a\x6d\xc7\x5e\xdb\x3c\xbe\xb1\x1b\x8f\x5c\x5e\xeb\x9c\x58\xee\x6c\xda\x1b\x2b\x67\xad\x2a\x96\x5e\x5f\x9a\x3f\xe7\x30\xd1\x00\x26\x4a\xe9\xbc\x0f\x03\xac\xc7\x43\x39\x95\xbd\x29\x85\x4e\x6f\x02\x7d\x83\xa0\x3e\x82\xbe\x96\x90\xf8\x01\xd6\xa2\xaf\x28\xb1\x54\x62\x07\x3a\xc2\x89\x06\xc8\x87\x1e\x66\xd3\xa9\x84\xa0\x90\xe5\xa3\xdd\xe7\xd1\x90\x0d\x24\x56\x51\xa6\x47\x26\x03\xd2\xe9\x45\x9c\x2a\x16\xb1\x88\x47\xdc\xf7\x7d\xdd\xd2\x54\x67\x24\x87\xc1\xd8\x42\x94\x8a\x20\x40\x61\xa8\x67\x51\xc4\xa3\x28\x8a\x06\xe5\x03\x98\xd7\x9d\x22\xbb\x65\xfa\x7c\xbb\x95\xec\xda\x97\x33\xbb\x62\x66\x73\x6b\x45\x58\x52\xf7\x1d\x1f\xb2\x50\xfb\x74\xca\x63\x41\x22\x81\xd3\xbe\xa0\x9e\x33\x6e\xb8\x49\xa2\xb6\x23\xad\x54\x1f\xb2\x08\xf7\x18\x44\x70\x52\x24\x08\xab\x14\xd8\x56\x6e\x79\xcd\x5e\xa3\xda\x37\x27\x1f\xba\x6f\x96\x2a\x9e\x5d\x0f\x99\xe3\xce\x60\x40\xf5\x70\x36\xd1\x23\x02\x89\x09\x39\x8c\xec\x98\x0a\x41\x71\x41\x1a\x32\x72\xdd\x5c\x4a\x35\x1c\x2b\x99\x08\x49\x64\x5f\x45\xac\x3c\x55\x1c\x8a\x66\x6a\xe2\x94\x55\x07\x3f\x13\x56\x5b\x36\x11\xbf\xd5\xce\x52\xa7\xbe\xfb\x15\xf6\x54\x67\xda\x8f\xe0\x0c\x26\xdc\x83\x0a\xf6\xa9\x26\x45\x64\x91\xa2\xaf\x07\xb5\x1e\xef\x4b\x15\x6d\x7b\xf5\x44\x4f\x72\x95\x43\x46\x3d\x3d\x93\x69\x1a\x2a\x26\xc7\x39\x4d\x2b\x0c\x1e\xc0\x77\x70\x2d\x69\xb8\x95\x5c\xde\xa7\xd7\x3c\x4a\x0d\x16\x3a\xb0\x8a\x53\x27\x35\xa0\x81\x17\xc2\x11\x29\x02\x0a\x51\x4f\x25\x21\x8a\xa1\xc3\x75\x02\x9d\x54\x71\x4f\x27\x5e\x49\xb8\x64\x3b\xd6\x4a\xaa\x59\x2a\x28\x16\x90\xc2\x61\xc1\x45\x32\x99\x62\xe3\x23\x76\xe7\x79\xa1\x67\x8d\x5f\x26\x78\xd0\x7a\x32\x62\xba\xf2\xd7\x6d\x2e\x18\x0d\x67\xa1\xdb\x5e\x99\xbb\x3f\xe7\x8e\x9b\xb6\x1d\xc1\x41\x62\x82\xab\x4a\x8f\xd5\x28\x1a\xf5\x92\x44\xcf\xe2\x89\x9a\x41\xa9\xc3\xd1\x74\x2a\x42\x9f\x79\x21\x64\x81\x27\xc2\x30\x31\x51\xd6\x5e\x41\xf5\x58\xf6\x52\x88\x8b\x81\x25\x74\x32\xe4\x19\xf4\xad\xb4\x57\x60\x28\x50\xcc\x10\x8b\x85\x9e\xb0\xd8\xeb\x71\x28\x76\xe5\x38\x6e\xf6\xea\x2e\xa8\xcf\xe3\x0d\x55\x96\xe3\x4b\xbb\xfc\xb6\xfe\x6f\x62\xf3\x3d\xc4\x22\xbb\x64\xa4\x81\x2f\x79\xcc\x15\x1c\x5a\xae\xc9\xe5\x2a\xe5\xba\x85\x0a\x13\x03\x0e\x75\x08\x07\xc5\x64\x62\xbc\xa3\x39\x0c\x8b\xd6\xee\xdd\x7b\xd2\x64\xfa\xb4\x20\x8b\xa0\x0f\x27\x16\x41\x05\xd5\x3d\x9d\x0b\x21\x7c\x7f\x3a\xac\xbb\x84\x0a\x46\x5c\x4a\x39\x2d\x06\x91\x48\x12\x11\x59\x21\xd5\x79\x29\xef\x33\xc6\x18\x94\x24\x16\x9c\xec\x00\xed\x50\xac\x68\x1c\x33\x4a\x04\x8c\x41\xcb\x72\x77\xbc\x66\xde\xa0\x07\x6c\xdb\x72\xce\x2f\xfe\x1d\x16\x6e\x77\x63\xa5\xb3\xd4\xdd\x80\xbb\xcf\x0f\x5a\xa1\xe7\xa0\x99\xb3\x99\xf2\x6a\x7b\xa5\xe6\xc1\x48\x99\x48\x0b\xd2\x39\x8c\x75\xa2\x0c\xa7\x18\xc0\x50\xf7\xfa\xbd\x1e\x0c\xfb\xda\x35\x4f\xdb\x91\xa0\x2c\x66\x88\x53\x46\x99\x0b\x09\x9e\x40\x06\x63\xac\xb1\xc6\x52\x94\x72\xac\x95\xd5\x47\x52\x2a\x5e\x20\x29\xc7\x63\x29\xad\x9c\xeb\x38\x49\x12\x4d\x94\x52\xd6\xcc\x98\xb1\x53\xc2\x04\x8f\xf4\xac\xf0\x50\x90\xf6\x18\x23\x58\x59\xbc\xca\x85\xea\xfd\x3d\xf7\xa1\xc9\x5c\x2d\xd7\x74\x37\x33\x68\x7f\x1f\x7a\x70\x92\x98\x06\x18\xa9\x1e\xa6\xe3\x68\xda\x4b\x32\x9d\xc7\xd0\xe9\xef\x00\x98\x6a\x77\x0c\x5b\x7a\x26\x71\xc0\x7d\x04\x05\xf6\x05\x26\xfd\xbd\xbd\x38\x12\xbd\x3e\xc4\x45\x66\x25\x5a\x8e\x64\x1f\x7a\xf3\xbd\x18\xb0\x52\x3e\x72\x3d\x89\xd9\xde\x5e\xb4\x61\xcf\xac\x4b\x60\xec\xfc\x33\x1f\xb0\xf3\xf7\x29\x5c\x12\xd8\xea\x4b\xc6\x38\x0f\x05\x63\x4c\xb8\x30\xc6\x33\x28\x61\x82\xb5\xab\x7d\x25\x13\x0a\xbd\x61\x23\x88\x98\x94\xd1\x94\x70\x21\x22\x3d\x29\xbc\x30\x2c\x69\x93\x94\xa4\x39\x64\x85\x3b\xa1\xc9\xeb\x3d\x0a\x96\xc0\x59\x70\xdd\x78\x4e\x9f\x05\x2f\x99\x1c\xa5\xe5\x39\x1f\xdd\x2a\xf9\x28\x30\xc9\x2b\x2b\x0d\x13\xb4\xb9\xb4\xd6\x58\xed\x6e\x6e\x74\x17\x9b\x9d\xa5\x15\x93\x1e\x68\x48\x37\x57\x09\x16\x0e\xc4\x2f\x4c\xe4\x62\x7d\x7e\x24\x84\x6c\xb9\xd0\xf7\x8b\x21\xca\x62\xca\xfc\x18\xba\x88\x12\xaf\xd5\x73\x15\x8b\x3c\x87\x30\x17\x4e\x94\xa3\x5a\xd0\x99\x84\x53\x9e\x11\xa2\x67\x31\xf4\x02\x09\x73\x1a\xb2\x90\xc6\x9c\xa4\x28\xde\x1e\x27\x84\x26\xdc\x1a\x90\x30\xf5\x51\x8a\xdc\xd4\x0d\x1b\xdc\xa3\x74\x7b\xa8\xc7\x82\xca\x38\x0a\x28\x0c\x03\x84\xb9\x40\x3b\x80\xd0\x20\x8c\x70\xd0\xef\x4f\xa7\x7d\xa5\x07\x7a\xc8\x0c\xac\xcc\x70\xcc\xc6\x30\xb1\x5a\xb1\xc0\x22\xbe\x1f\xf4\x87\x68\xd4\x0f\xc3\x59\x8f\x0c\x92\x34\xc3\x83\xc4\xef\xf7\x83\xbc\x07\xc0\x11\x10\xc3\x71\x33\x69\x28\x70\x66\xaf\x5b\xc9\x47\xc0\xab\xc6\x53\xf6\x06\xf8\x1c\xf8\xe2\xdc\xbb\xd8\x6c\x57\xa9\x82\x73\x83\xbf\xb2\xf7\x37\xb7\xd6\xaa\xb8\xcd\xdf\xf2\xee\xa5\xb5\x4a\x0f\x58\xea\x2c\xef\x27\x3e\x55\xb6\x42\x45\xc0\x83\x64\x34\x8f\xcd\x56\x14\xc4\x1e\x93\x99\x4f\x09\xe1\x09\x93\x94\xd1\x88\xc8\x74\xc8\xa9\x7f\x7f\x40\x02\xd6\x72\x62\x99\x7b\x84\x44\x4c\xc5\x92\xc6\x34\x22\x22\xcd\x05\x75\x5c\xe8\x95\x82\x08\x97\x72\x22\xd8\x6b\xe4\x32\xd1\xae\x18\x8f\xf5\x0c\x07\xcc\xc7\xb5\x19\x09\x98\x4f\xde\xc3\x34\x20\x2c\xaa\x0d\x63\xf3\x24\x85\x42\xc4\xd3\x1c\x52\x8f\x11\x46\x71\x3e\x0a\x72\x45\x64\x1a\xe8\xd1\xc8\xf3\x08\xe2\x0a\xf9\xde\xee\xfb\xf1\xfc\x7d\x2c\x7a\x81\xce\x73\xcf\xf3\x7d\xcb\xe7\x21\x8f\x59\xcc\xa8\xee\xc5\x12\x53\x8e\x58\x8c\x62\x8e\x78\xec\x63\x16\x47\x11\x33\x8f\xa0\x61\xcd\x76\x50\xb3\xd7\x10\x73\x9f\xcb\x65\xf0\x3c\xf8\xfe\x83\x5e\x97\xdd\xcc\xdb\x83\xc9\x70\x26\x63\x73\xf9\x00\xa5\x9f\x7c\xe0\x9d\x13\x7b\xab\xb0\x17\x1e\x3a\x70\xcc\xb7\x3a\x75\x5f\xb9\x0e\xd7\x7d\xec\x7a\x84\x10\x32\xf4\x5d\xd6\x62\xdc\x23\x04\x53\x11\x71\x12\x87\x88\x33\xe6\x7b\x8e\xcd\x3c\xf3\x8e\x5f\xbe\xc3\x89\x20\xd4\x73\x3d\x97\x53\x16\xf8\xce\xb6\x0f\x47\x0a\x8e\xb4\xe8\xcd\xa2\x59\x4f\x65\x7a\x16\x41\x2f\xd5\xa2\x21\x3c\xe6\x6d\x0f\xec\x90\xe8\x68\x54\x0c\x46\x5c\x28\x8f\xf8\x6e\x2c\x73\x8c\x26\x10\x04\x93\x7e\x98\xfb\x3a\xcd\x1c\x07\x85\xa2\xe7\x05\x7e\xe0\xc5\x72\xb0\xfb\x9e\xe7\x44\xd4\xd7\xf9\xc8\x71\x89\x56\x9c\xab\x49\xdc\x53\x10\xe8\x10\x0e\x77\x80\x52\x69\x5e\xf2\x08\x77\x87\x35\xd3\xba\x00\xa7\xc1\x16\x78\xa1\xa2\x54\xc9\xa7\x0f\x66\x74\x1b\x7d\xaf\xb9\x76\x71\x75\xb9\xbe\xd4\x7d\xdf\x5b\xbb\xa1\x67\x58\xb9\x3c\xaa\x76\xa8\x4b\x9d\xa5\x26\xc0\x2a\x81\x68\x96\x26\x51\x4f\x28\x96\xb2\x21\xcb\x21\x18\x85\x90\x6a\x8c\xf5\x74\x36\x53\x71\x44\x88\x8a\x04\xed\x11\xdd\x83\x49\x36\x0c\x60\xcf\x22\x16\xfb\xee\x18\xfa\x29\xc4\x29\x9c\xd6\x85\xf0\x9c\x54\x0e\x68\x62\xfa\x1d\x45\x3d\xc5\x92\x81\x94\xae\x72\x03\x11\x24\x32\x8e\x39\xc5\xba\x0f\x51\x8f\xcb\xa4\x2f\xa5\xe7\x48\xef\x3e\xef\x4b\x69\xa4\xc4\x40\x99\x7e\xee\x75\xe8\xed\xa0\x66\x5a\x2f\xcf\xdd\x0d\xf0\xb4\xd1\x71\xff\xf6\x39\x36\xcc\x24\x0f\x3a\xad\x96\x0e\x4c\xb3\x54\xa4\xf6\x3d\xfb\x86\xbb\x37\x5b\x88\x4b\xe8\x8d\x68\x3f\x56\x54\x45\x8a\xf6\xe3\x31\x74\x38\x0f\x60\xa4\x71\xf9\x16\xd8\x01\x29\x8b\x22\xaa\xa8\xa4\x43\xaa\x63\xd8\xd7\x71\x00\xfb\x35\x3f\xdd\x66\x49\x62\xab\x6d\x56\x5e\x75\xc5\x3c\x57\x72\xc9\x39\x57\x3a\x87\x2e\xa7\x3c\x56\x9c\xb9\x8e\xf0\x02\x63\x90\x7b\x04\x0b\x12\xce\x60\x8b\x51\x2e\x38\x67\x3e\xf7\xb6\x07\x05\x22\xc4\xca\x77\x00\xd7\x09\xdf\xcf\xf5\x52\x26\x76\xe5\x03\x0c\x5e\x99\x73\x5e\xe7\x60\x0c\xdf\x04\x28\x16\x4d\x44\xba\xb2\xc2\x2b\xf7\x6b\xfd\x40\x22\xde\xa5\x03\x89\x78\x9b\x37\x61\xf9\xf6\xd5\x8a\xef\xd6\x46\xca\x71\xe1\x2c\x4e\x10\xf5\x64\x18\x86\x82\xcd\xa2\x61\xa4\x38\x8a\x7b\x8c\x3a\x0e\xe4\x30\x8f\x34\xd1\x58\x8f\x8b\x19\xb6\x10\x74\xd3\x34\x42\x12\x93\xbe\x8a\x67\x7a\x16\x31\x93\xf9\xea\xbb\x7a\xa6\xfb\x08\x0a\xe8\xea\x9c\x53\x1a\xb3\x06\xf7\xc2\xb0\x98\x0d\x1d\xe9\x2a\x48\x74\xaf\xcf\x15\x04\x4e\x8a\x68\xaa\x7d\xd6\x72\x32\xaa\xe2\x49\xa6\x52\x19\xcf\x4a\xfb\x9e\x22\x42\x45\x2f\xee\xc7\xa5\x5d\xe4\x85\xb1\x8c\x15\x17\x83\x10\x73\x82\x00\x38\x62\xf4\xc4\xa4\x41\xe7\x39\x57\x55\xaf\xa8\x10\x7c\x18\x20\xf0\x2c\xf8\x14\xf8\x42\x65\xd9\x94\x9a\x70\x73\x6e\xd1\x74\xe6\xb9\x57\xf5\xee\xd2\xca\x6a\x77\x69\xa5\x5e\x9a\x3d\x1b\x55\x52\x54\xe7\x60\xce\xd4\xae\xa2\x52\xbe\x55\x9f\xe7\x4a\x2d\x2d\xee\xc7\x66\x37\xd6\xaa\xd7\xd6\xe6\xa9\x52\x02\x8e\xb4\x6f\xb5\x4a\xee\x18\xc8\x5c\xd9\x13\x39\x94\xba\xcf\x98\xe5\xc4\x31\xf4\xb6\x7b\x4a\x2a\x05\x9d\xed\xbe\x13\xf3\x18\xf6\x94\x8e\x94\x82\xae\x52\x42\x4f\x15\x2b\xb9\x32\x8e\xdc\xa4\x45\xfa\x92\xcc\x28\xf6\xd3\x41\x88\x65\xd6\xa0\x42\x08\x5c\xe5\xd6\x41\xae\xd5\x6c\x06\x59\x9a\xe7\xb9\x10\x71\xc9\x7a\x74\x56\xf9\x2f\x3d\x18\x43\x45\x88\x46\x71\xf9\x33\x8b\x3d\x14\xe3\x20\x0a\xc3\xd8\xef\xe3\x90\x24\xc2\xf3\x58\x84\xa4\x03\x05\x11\x46\x4f\x98\xec\x4c\xeb\x23\x3b\x9e\xfb\x9d\xe6\xd9\x46\x6d\x93\xa7\xb6\x55\xc5\x99\x3b\x56\x60\x73\x1d\x85\x96\xb3\xed\x40\x14\xe8\x51\x52\xea\x9b\xc4\x1a\x16\x81\x1d\x6b\x19\xeb\x18\x26\x31\x97\x85\x94\x00\x1c\x86\x83\x1d\xd2\x54\x0d\x01\xce\xcf\xab\xf0\x6e\x80\x9b\xe0\x69\xf0\x02\x78\x19\x7c\x1c\x7c\xd6\x78\x69\xe7\x91\xed\xe6\xf2\x51\xd8\xf1\x2e\xdd\x84\xcd\xb5\xad\x0d\x63\x43\x96\xb4\x86\x6b\x5b\x9d\xa5\xf2\x1c\x9a\xc8\x77\xbd\xd3\xfe\x80\xae\x58\xff\x80\x5c\xdb\xea\x2e\xed\x55\x0f\x75\x2e\x5c\xda\xa8\xf9\x89\xa9\x72\x50\x41\xec\x70\x9d\xee\x00\x31\x74\x27\x7a\x9a\xa9\x0c\xf6\xac\x41\x14\x14\x13\xa8\xdc\xc1\x18\xf5\xa7\x64\x3b\xb3\xe3\xed\x44\x8d\x46\x30\x1e\x17\x99\x79\xd2\x23\x1a\xaa\x90\x58\x2e\x43\x12\xc5\xdb\x33\xe1\x73\x29\x33\x15\xd0\x2c\x74\xa4\x1b\xe9\x49\x4e\x1b\x02\x33\xc2\x1c\xe9\x73\x1c\x86\xae\xc3\x1c\x51\x64\xda\xd5\x92\x94\xa7\xc0\x4a\xf4\x20\x50\x2c\x64\x9e\xeb\xba\x5e\xa6\x5b\x30\x28\x97\x67\x46\x08\x19\x13\x1a\xd1\xc8\x33\xf9\xdc\xa1\x97\xa5\x38\x49\x26\x9e\xe7\x47\xbe\x8c\x50\x04\x1a\x00\xed\xe0\xda\xac\x81\xc0\x59\xb3\x63\xb1\xa9\xef\x01\xf0\xc0\x9e\x34\x50\xf8\x55\xfa\xde\x9c\x60\x0b\x55\xfa\xef\x41\x2f\x80\x29\x51\x5b\xdb\xdc\xda\xa8\x00\x74\x3f\x40\xc0\xda\x6c\x9b\x0c\xd4\x58\x0e\x06\x72\xac\x06\x42\xf2\xa9\x35\xd3\x19\x94\x24\x42\x91\xc7\x43\x7f\x07\x24\x4e\x3e\x75\x23\x32\x96\x30\xd6\x03\xd9\xef\x43\x3f\xd3\x9e\x79\x6a\x20\xc9\x30\x26\x84\x9b\x2d\x87\x8b\x89\xc6\x04\xf6\x2c\x60\x03\xed\x69\xc0\x8a\x19\x21\x8e\x68\x21\x18\xe7\x5e\x1c\xfa\xc2\x69\x0d\x8b\xb1\x95\x30\x18\x52\x4a\xf5\x30\x8e\x63\xe3\xcb\x8e\x77\xa8\xed\x37\xf0\x9e\xbf\x73\x2f\x03\xe4\xa0\x1e\x53\x3f\xc0\x6f\x7b\xa5\xce\x81\xac\xbc\x40\xa8\x42\xdc\x2f\x86\x56\xa8\xf4\xb4\x3c\x44\x7a\xda\xc0\x52\x26\x5c\x49\x95\x14\x92\x32\x4b\x6a\x3e\xdb\xb5\xe9\xb1\x1d\x3c\x24\x2e\x71\xb0\x6c\xa9\xe2\x8a\x95\xb6\xa9\x20\x48\xa2\x80\xc7\xc9\x6c\x96\xb0\x18\x47\x49\x4c\x59\x3f\x1e\x33\xec\x4b\x1f\x55\x89\x9f\x5c\xd2\x61\x0f\x29\xd5\x4b\x54\x69\x46\x58\x7d\x3d\x61\x6a\x02\xf9\x6e\x50\xc2\x60\xec\xe4\xd6\xc0\xc4\x05\x4e\x57\xf9\x41\x8b\x95\x7f\xea\xe8\x6e\x82\xde\xd6\xe6\x6e\x7d\xdb\x79\x68\xb8\xb1\x6b\xd3\x56\x8f\xc7\x94\x3a\x11\xc7\xd4\x65\xd8\x77\xbc\x81\xab\x51\x0c\x95\xab\x53\x94\xe0\x48\xc5\x0d\x3c\x48\x84\x50\x8c\x0e\xa5\x9b\xb8\x81\x82\x49\x91\x67\x5c\xc2\x19\x0a\x87\x8a\xa4\x66\xbe\xc4\xe4\x9c\x8e\xc0\x49\x93\x59\xb7\x57\xa1\xb1\x5f\x89\x52\x65\xd5\x95\x67\x3c\xb2\xfa\x38\x4c\x82\xd0\x1e\xde\x1f\x51\x5e\xca\x24\x92\xca\x14\xc3\x78\x52\x64\x56\xcb\xee\x6f\x13\x7b\xc8\x55\xc0\xe2\x24\x8d\x0b\x37\x8e\xad\x90\x12\x99\x41\xbf\x70\x20\xd9\xf3\xeb\xaa\x7a\xcb\x7c\x57\x77\xb7\xd6\x70\x3f\xf7\xbb\x3d\x8f\x7a\xb4\x57\xe6\xd9\x3c\x7b\xb9\x35\xb0\xbd\xd2\x36\x41\xbc\x8e\x9c\x24\xd0\x4d\x60\x9e\x40\xaa\xd3\xc2\xd1\x93\x7a\xeb\x3d\x3a\xa9\x4d\x35\xda\x1e\xd9\x7e\x62\x7b\x45\x3c\x82\xe3\xb0\x98\xed\x80\x44\xcf\x34\xc0\x30\x85\xa0\x90\x35\x55\x1a\x2b\x9c\xcb\x9d\x52\x0b\x4f\x24\x9c\x4a\x29\xb5\x4b\xa9\xca\x70\x42\xa0\xab\x19\x4c\x46\xbd\x84\xa5\x46\x2e\x8a\x1d\xde\x94\x75\x32\xaf\x73\xbd\xfd\xc1\x0c\xf5\xdd\x71\xad\x99\xfc\xe3\xbd\x5a\x4f\x13\xb5\xaf\x62\x38\xfb\x7f\x6b\xca\x77\x04\xf4\x14\x54\x09\xf4\xf5\xc8\x18\xa4\x53\x1d\x0d\xa0\x17\x69\x35\xd5\x68\xa0\x55\x54\xe5\xa5\x8f\x8d\x27\x6b\x0c\xfb\x26\xdd\x4b\x69\xa6\x47\x30\x55\xb0\xaf\x89\x35\xf9\xee\xc8\xea\x6b\x5a\xeb\x27\x49\x9a\x4a\x2e\x85\x14\x61\x8f\x4f\x46\x4a\xc6\xe5\x2f\x9c\x73\x2d\x84\x76\x94\x92\x3d\xa5\x7a\xc0\x06\x72\x27\x6a\x92\x5a\x6a\xac\xce\xab\x7b\x59\x12\x73\x3a\x6e\x5d\x5a\x87\x17\xf7\x22\x84\xa0\x7e\x71\xf5\xd2\x9a\x5d\x0a\xf7\xab\xb0\x0a\x99\x8e\x73\x91\x46\x93\x92\x86\xb9\xee\x05\x10\xcc\x98\xc4\xd0\x1b\x24\xbd\x41\x1c\x0d\x07\xa9\x8e\x75\x68\x01\x98\x84\xd8\x87\x1e\x04\x58\xcf\xf4\xb4\xc8\xe8\x0e\xd0\x03\x0c\x1d\x6b\x96\x4f\x70\xe2\xb9\xc5\xd4\x02\x9e\xab\xa8\x40\xa1\xd7\x1f\x84\x3d\xe9\x87\x42\x85\x7a\xd0\xf7\xfc\x88\xe8\x98\x25\xaa\x4f\x85\xe8\x53\x45\xe6\x39\x6b\xb2\xc1\xc1\x0a\x78\x6c\x9e\x31\x74\x20\x67\xed\xdf\x26\x65\x2d\xcc\x6d\x6f\x3b\xa3\x4c\xf2\x58\x4d\xf4\xb8\xfc\x56\x21\xa9\xf4\x7c\x3d\xd0\xca\xef\xa5\x3c\x51\xf1\xf6\x64\xaa\xa8\xa2\x6a\x37\x63\x6d\xc4\x93\x09\x9f\xd4\xd2\x03\x19\x6b\x8c\x70\x19\xea\xe1\xd0\xf3\x83\x00\xa5\x19\xc6\x18\x07\x22\x56\x04\xc9\xc4\xe7\x32\x92\xbc\x4a\x58\xdb\x01\x51\x96\xf2\x94\xcd\x13\xd6\x6a\x80\xc2\x69\x93\x37\xb8\xe9\xdd\xfd\x04\xe8\x02\xeb\x5a\x60\xb2\x14\xad\x66\x7d\xaf\xf0\xb3\x52\x14\x37\x17\x4c\xed\x1e\xec\x58\xf6\xc1\x1a\x93\x95\xae\xc1\x5c\x1a\x27\x01\xe4\x54\xc2\x16\x8d\xd3\x4c\x8f\x82\x49\x2a\x7b\x14\xeb\x19\xc4\x6e\x22\xb0\x9e\x22\x64\x29\x1b\xf8\x43\x39\xe0\x99\x4a\x87\x64\x20\xb3\x30\x1c\x22\x25\xfc\x06\x77\x94\xda\x01\xfd\x44\x11\x9a\x33\x41\x13\x8c\x7b\x3d\x45\x8a\x7e\x6f\x90\x32\x38\xd4\x89\x9e\xb1\x48\x45\x52\x45\x8a\xf0\xe9\x2c\xef\xf5\xf2\xbd\xbc\x83\x70\x2f\xaa\x74\x11\x00\xd8\x36\x9b\x7f\x2f\x3f\xa5\x6b\x7c\x4e\xef\xab\xd3\x6a\x0c\xc4\x77\xa9\x48\x4c\x78\xa1\x07\x5b\x09\xf4\xdf\x0b\x9b\xfe\xf6\x10\x0b\x25\xbc\x24\x09\xb6\x53\x3b\xd4\x63\xa5\xa0\xa7\xc7\x49\xf9\xa3\xb9\x52\x71\xe4\x25\x3e\xe6\x25\x7f\x8f\x76\xa8\xdd\xfa\xfb\xf0\xf7\x2a\xef\x7d\x63\x45\x95\x1a\x45\x68\xf5\x0b\x42\x76\xeb\x13\x2d\x57\xcd\x94\x9a\xcd\x1e\xce\xdc\xff\xbf\x14\x5f\xaf\x72\xb8\xe2\x06\x33\x35\x1c\x97\x4d\x0e\x97\xfd\x40\x0e\xd7\xbf\x26\x85\x4b\xa6\xc3\x59\x2a\x4d\x06\x97\x87\x50\x3a\xf5\x39\x63\x55\x02\x17\xc1\x74\x84\x3c\xe5\x61\x1d\x57\x09\x5c\xb1\x69\x9a\xed\x05\x02\xa5\x03\x14\xbb\x4e\x11\x59\x3c\x90\xa2\x27\xd9\x6e\xfe\x16\xea\x17\xad\x34\x0f\xf2\xd4\xd9\xcb\xdf\xb2\xc6\x46\xdf\xf3\xc0\x45\xf0\xf8\x5e\x7e\xe5\xc1\x3c\x9f\xc5\xe3\xbb\xe7\x60\x61\xae\x8f\xd8\xa6\xea\x64\x69\xc5\x0e\x6b\x44\x63\x48\x29\x25\xcc\x53\x38\x1c\xb1\x88\x52\x84\x78\xd4\x77\x47\x0a\xc6\xc5\x34\x4a\x6a\xee\xfd\x49\xd2\xf0\x64\xbe\x1d\x45\xd4\x51\x0e\xb6\x01\xd3\x83\x58\xc8\xc1\x50\xf0\x11\x44\xdb\x5e\x2d\xce\xf5\xf8\x7e\x3f\x41\xbb\xb9\x6e\xd1\xc3\xe9\xf4\x77\xa5\xba\xc9\x74\x38\x4d\x44\x28\x48\x28\xbd\xd8\x24\xba\x1d\xa4\x53\xe8\x29\x0f\x1d\xa0\x53\xa0\x67\x86\x4e\x39\xa2\x5e\x41\x2c\xe1\xb9\xef\xa7\x93\x93\x4f\x82\x49\xbe\x97\xe7\xd6\x80\x72\x07\x37\x45\xc3\xdf\xf3\x90\xde\x34\xb9\xfd\x4b\x1f\x20\x58\x85\x69\x53\x21\xea\x9a\xb8\xca\x49\xd8\x69\xdb\x9d\xa5\x8e\x7d\x40\xef\x3d\xa8\x03\xdb\xa0\x26\x8a\x19\x9c\xd0\x18\x51\x4f\x84\x48\xf7\x12\x9d\x2b\x38\xd4\xde\x44\x71\x5a\x1b\xa5\xdb\xb1\x9d\x70\x1c\x30\x1f\x69\x8e\xfd\xd8\xc7\x16\x39\xf8\x5b\x4d\x70\x29\x8a\x56\x44\x5d\xe5\x62\x8b\x6c\x4f\x6d\x67\x7b\x68\x67\x82\x16\x53\x1d\x47\x53\x28\xa0\x63\x8d\x74\x04\xbd\xa4\xf0\x70\x84\x22\x1c\x9a\xc7\x31\xa6\x28\x22\xa1\x79\xac\xfc\x8d\xa1\x89\x3d\xac\xcc\x65\x54\x65\x3b\x5d\x5c\x5d\xae\xd5\x8d\x07\x78\xb1\x39\x97\x00\xc7\xeb\xcd\x8b\x95\xa7\xef\x40\x3d\xbf\x83\xfb\x6c\x66\x09\x38\xa4\x3a\x2c\x7a\xe5\xb2\xb7\x60\x3f\xb5\x5a\xda\x67\x50\x12\xcd\xb8\xd4\x34\x82\x69\xa4\x99\x2d\x10\xa7\x31\x65\x50\xea\x81\x9e\xc5\x50\xc1\xbe\xed\xb5\x62\x19\x3b\x4a\x47\x11\x8b\xa7\x53\xa5\x87\x32\x49\x21\xd2\xe3\x4c\x66\xb0\x65\x4d\xd2\x54\xe7\x88\xf0\x08\x03\xd0\x82\xa6\xef\x45\xdd\x07\xd7\xc1\x26\xf8\x10\xb8\x05\x9e\x01\xcf\x83\x97\xc0\x6b\x7b\xbe\xdc\xee\x3c\x0d\xad\x33\x57\x9d\x0e\x96\xdf\x55\x2c\x7e\xab\xb3\xdb\x83\xa2\x3b\x67\xa2\xf5\xf7\x3b\xef\x8d\x10\x38\x61\x61\x38\x4d\xac\x40\x88\x62\x68\x91\xa2\xe5\xb8\xb6\xd4\x13\xa4\x86\xe3\x58\x8f\x66\x7a\xa2\x11\x82\xfe\x28\x4b\x71\xa8\x7d\x0b\xbb\xae\x4e\x2c\x5f\x3b\x7a\x5c\xaa\x17\x54\xa7\x70\x06\xd5\x36\xdf\xbb\x33\x69\xe3\x96\x0f\x33\x8d\x7a\x51\x31\x76\xdd\xb4\x26\xd3\xb4\x47\xfb\xa1\x1e\xf9\x1e\x8f\xb0\x1f\x32\x12\x92\x50\xb8\xbe\xef\x86\x21\xf7\x7c\xe8\x87\x7d\x1a\x86\xe1\x08\x21\xa4\x29\xc6\x58\xbb\x3e\xf6\x0c\xc4\x0a\x78\x04\xa4\x30\x6e\x46\x76\xf2\x40\xce\xc1\xae\x0f\xdf\xe4\x1d\x7c\xc0\x47\xff\x90\xd7\x52\xdb\xdb\x1e\xab\x2c\x83\xe1\x40\x03\xf3\x04\x1d\xdb\xdd\x9e\xa8\x7e\x1f\x06\x03\xdd\x32\x4f\x76\x52\x0c\x21\x2e\xb5\x9a\x2c\x8e\x63\x48\x0e\xfe\xb6\x97\x3f\xd8\x64\xd6\x18\x1c\x07\x27\x4c\xd4\x64\x37\xb6\xb9\xa7\xb4\x6e\x6e\xad\x98\xba\x9d\x87\xbf\x5c\xf3\x6d\xac\x43\x0c\x27\xa9\xee\x27\x41\xc0\x72\x3a\x81\x01\x24\xba\x7f\x1f\x57\x6f\x8c\x93\xf7\xbd\x61\x8d\x55\x52\x24\x94\x42\x86\x42\xde\x1f\x17\xd3\x09\xcc\xde\xff\x0a\x68\x00\x69\xe1\x66\xbf\x21\xc0\x1a\xb8\x01\x6e\x9b\x5e\x0b\xd1\xbe\x05\xdb\x7e\xb0\x7c\x64\xf1\x44\xd7\xab\x2c\x50\xcf\xc0\x3d\x76\x56\xf7\xaa\x4d\x8d\xc4\xbd\xb4\xb6\x52\xef\x6e\x6e\x75\x4e\xd4\x1f\x88\x0f\x2f\x55\x15\x4a\x4b\x26\x45\x54\x96\x12\xd0\x24\xfa\xf1\x42\x9a\x8b\x14\xfd\x70\x04\x5d\xd4\x92\x2e\xd3\xa9\x1e\x52\x8b\x16\xc9\xb6\x82\x61\x02\x23\xe6\xfb\xd3\x6d\x36\x76\x3d\x06\xc3\xd4\x77\xf5\xc4\x83\x53\x1a\xe1\xd8\x15\x08\xe9\x96\x10\x70\x66\xea\xa4\x5b\x0d\x81\x68\xa0\x27\x41\x14\x46\x01\x75\xbc\x96\x1f\x05\x1c\x07\xc4\x42\xe1\x94\x10\x1e\xfa\x9c\x07\x01\x0d\x82\x60\xac\x43\x4c\x1c\xde\x0a\x9d\x81\x45\x7b\xe1\x10\x99\x5e\xe2\x7c\x07\x37\xb3\xda\x08\x78\xc0\x07\x01\x40\x7b\x31\xe2\x87\x51\x61\xb9\xd1\x6c\xec\x4e\x1f\xce\x93\xd7\x77\xd5\xe7\x52\xb9\xeb\x6e\x6e\x2d\xef\x52\x03\x3e\x8c\x0c\xe5\x7f\xac\x85\x89\xd5\x2b\x22\x2b\x2e\xaa\x9c\x47\x73\x71\x17\x05\xba\xaf\x73\x6a\xc5\x85\xb2\x26\x45\x3f\x18\x4f\xf0\x77\x53\x88\x13\x48\xb7\xf3\x71\xe0\x85\x13\xdf\x4d\xd0\x74\x9b\x8e\x5c\xcf\xea\x53\x1a\x12\x2f\x0e\x43\xed\x2b\x05\x47\xda\x2f\xaf\xda\x88\x48\xa2\x33\xc2\x11\x27\x81\x9f\x06\x7e\x48\x6d\x10\x6d\x4f\x7d\xcf\x71\x6b\x2a\x8a\x64\x0b\x11\x97\x90\xd2\xda\x0f\x43\x9d\x15\x92\x44\xae\x74\x71\x30\xb3\xdd\x49\xac\x07\x31\x80\x40\x5a\xa3\x26\x37\x31\xcf\x79\xb6\xd7\x83\xb5\x1e\xb3\x86\x57\x84\xe5\xb2\xd9\xfe\x77\x1d\xdb\x37\x63\xc7\x0d\x37\xc9\x93\x2c\x49\xb2\x24\x37\xf4\x8c\x61\xe5\xa3\x6e\x9a\xfc\xe2\xbd\x5d\xb5\xab\x1f\xaf\x3e\x94\xae\xfb\xbb\x6a\x8f\xac\x7f\x5f\x72\xa6\x10\x25\x30\xde\xce\x6d\xa5\xe6\x64\xdd\xdf\x5d\x9c\xbb\x4c\xf7\xf5\x20\x36\xc4\x9e\x14\x69\x38\x9e\xe1\xf7\x58\xe0\xa1\xe9\x9c\x9a\x63\xcf\xb3\x72\x1a\x21\xe2\xb1\x30\x38\x48\xcd\x86\x47\xa9\x18\x10\x46\xf4\x10\xc5\x38\xc6\x91\x2f\x70\x18\x59\x03\x52\x04\x81\xd7\x72\xed\x2c\xc4\x1e\x21\x01\x13\x02\x05\x7a\x58\x64\x84\xb8\xc2\x41\xfe\xc4\x1a\x8f\x22\x3d\x89\xaa\xfa\xac\x52\x4f\x0c\xe7\xfe\xba\xbf\x87\x1f\xa0\xdd\x91\xe5\x40\x03\x6b\x5c\x78\xa4\xd4\x18\xcd\x45\x52\x3d\x4c\x12\x18\xe8\x61\x83\x2a\xa5\xb8\xe2\x89\x2a\x62\xca\xac\x9e\xa6\xb0\x35\xb7\x01\xa3\x66\x5a\x1b\xec\xc9\x5e\xb0\xd0\xd9\xea\xac\x2d\x94\x2a\xbc\xbd\x5f\x3b\x5f\x72\x7a\x78\xb0\x6e\xbe\xdd\x81\x9d\xad\xce\x6e\x86\x4a\x29\x03\xd2\x5a\x88\xb6\xfb\xe1\x44\x79\x76\x3c\x80\xc3\xc2\x65\x29\x27\x32\x8e\xb3\x49\xa4\x43\x3d\x8a\x38\x8d\x3c\x4a\x7d\x6f\x7b\x02\x33\xdb\x0d\xb6\xa7\x7a\xa4\x78\xcc\xa4\x85\x5c\x3d\xd4\x22\x84\xca\x4a\x62\x06\xa3\x30\x90\x3a\x57\x82\xd1\x38\x62\x84\xa1\x5e\x0f\x46\xba\xc7\x88\xab\x5c\x37\x84\x43\x28\x48\x31\x43\x84\x45\x61\xa8\x7a\xbc\x67\xfa\x35\x59\x93\x79\x9f\x82\x27\x4c\x7c\xed\x60\x67\x91\xcd\x9b\x55\xd1\x56\xb9\xda\x07\xa7\xb5\x74\x70\x5e\x9d\xad\xb9\x02\x51\x97\x54\xe0\xd0\x43\x38\xf4\xb3\x19\x81\xe1\xa0\x98\x59\x12\x15\x33\x94\x2b\xcf\x42\x39\x8c\xb4\x8b\x22\x8a\x64\x1c\x8b\x94\xea\x59\x31\x81\x23\xac\xfd\x8c\x47\x3c\xe2\x70\xaa\x7d\x46\x5b\x49\xcb\x0f\x67\x59\xaa\x06\x03\xe8\x2b\xc9\x61\x1e\x62\xa5\x89\x6a\x25\x8a\x0b\x92\xb1\x5e\xdc\xcf\x6b\x24\x2d\x68\xcc\xb9\x34\xf6\x00\xb5\x7b\x4d\xd5\x90\x60\x19\x9c\x39\x90\x51\xbf\x5f\xdf\x7e\xe9\x60\x7d\x57\xbd\x64\x92\xab\xbb\x07\x60\xb3\x6a\x20\xd2\xdd\xe8\x2e\x6d\x55\xb5\xb3\xa5\x10\x28\x9f\x6b\x03\xee\x3a\x70\x8a\x63\x91\x05\xd3\xc1\x50\x4f\xc3\x61\x82\x42\x1c\x45\x43\x88\x38\xd1\x82\xdc\x17\x96\x81\xd8\xd5\xb3\x54\x3a\x3a\xd5\xc4\x0f\x43\x21\xf5\x48\xc2\x9e\x8e\xac\x89\x35\x2a\x7c\xe3\xa6\x6d\x48\xcf\x75\x63\x12\xba\x0e\xf7\x30\x72\xb9\xe3\x79\x41\xe0\x91\x48\xba\x61\x90\xeb\x29\x8a\x89\xe3\x46\x24\xe0\xad\xd1\xc0\x81\x2d\x4a\x74\x7f\x46\x43\x23\x43\x23\xc8\x8c\x0d\x72\xf4\x40\xcd\xed\x5e\x95\xd6\x81\xde\x46\xe5\xf2\x94\xd3\x6a\x1c\x83\x0f\x0d\xf3\xaf\xbe\x3f\xd6\xb9\x66\xf5\xd2\xc0\x92\x01\x82\xe9\x7b\x71\x18\x52\xa8\x2c\x8a\xc3\x62\xc0\x3c\x64\x1c\xcb\x1c\x4e\xef\x27\xbb\x77\x3a\x23\x61\x12\x20\x2b\x12\x44\x61\x7e\xbf\x95\x72\xa5\x52\xcb\xc7\x81\xf2\xc3\x86\x0c\x03\x11\x86\x45\x02\xc7\xbe\x2b\x06\x22\x0c\xa9\x33\x63\x8c\xe9\x5e\xf9\x30\x45\x46\x9f\x63\x82\x70\x4e\x42\x15\x31\x12\xa1\x28\x24\xb8\xea\x67\x83\x9b\x3d\x1b\x81\x13\x26\xa2\xbb\x69\x34\xa5\xdd\x39\x55\x25\x79\xfb\xdd\x24\xe6\x2d\x09\x56\x3b\xed\xaa\xb1\x9a\xc9\xa0\xdb\x6a\x77\xdb\xbb\x4b\x76\xc0\x95\x57\x53\xd2\xb5\x5a\x44\xf5\x87\x48\x4f\xc6\xf9\x2c\xcc\x14\x0e\x7d\x9f\xf5\x63\x2a\x14\xd5\xd8\xd9\x0e\x2c\x35\x9d\x4c\xa0\xe3\xea\xff\x97\xbc\xf7\x89\x91\x64\x47\xf3\xc3\x82\x91\xff\x42\xa3\xdd\x55\xd4\xf4\xeb\x2e\x8e\xb4\xbb\xc3\x9a\x7a\xfd\x9a\x0b\x69\xbd\xdc\xa9\xad\x6e\x42\x8b\x9d\xa5\x17\x58\x89\x36\x64\x9b\x96\x2d\x89\xb6\xb4\x36\x6d\x0b\x32\xfd\x4f\xa0\x65\xc3\x20\x60\xc3\x20\x7c\x22\x7c\x30\x08\x9f\xe2\x18\x80\x0f\x0e\xc0\x97\x38\xc6\x31\x8e\x79\x8c\x63\x1e\xf3\x98\xc7\x3c\xe6\x7b\x95\xc9\x32\x82\x91\x59\x95\xdd\xef\xbd\xc5\x8e\x7c\xf4\x34\xa2\x32\x2b\xa3\x5f\x4f\xf2\x0b\xf2\xfb\xfb\xfb\x7e\x5f\x15\x19\x34\xc1\xc7\x7d\x00\x26\x86\x85\x1d\x77\x59\x4a\xa1\xcc\x18\xa4\xc6\x0a\x02\x1d\x16\x0c\xd9\x12\x63\x82\xa1\x52\x84\x51\xa2\xcb\x3a\x3a\x6b\x2a\xe4\x08\xf6\x05\xe0\xb1\x2f\x41\xb0\x21\xea\xc8\x39\x07\x5d\x3c\x24\xfc\xca\x5f\xcf\xf4\xb3\x5e\x85\x85\xf9\x62\x8e\xc4\x54\x97\xfd\x27\x57\x79\xea\xa9\x04\xf4\xf6\xfd\xed\xe2\xed\x57\xef\xee\x5e\x4c\xfc\x9f\x80\xc5\x0b\xec\x69\xf5\x78\xf7\x36\x79\x4c\x5f\xb8\x83\xb7\xe7\x99\x0c\xb7\x0f\x8f\xf7\x8b\xf3\x35\x73\xc9\xaa\xcd\x18\x66\x0e\x95\x27\x9a\x93\xf2\xd4\x73\x80\x01\x66\xa5\x87\x36\x86\x68\x6d\x34\x6b\x6f\x44\x2e\x69\x34\x7e\x6e\x9e\x42\x6a\xeb\x04\x7b\xa0\x8e\xed\xe5\xdd\xc1\x7e\xbb\x19\xa3\x63\xe0\xa6\x6b\x61\x98\xe2\x9a\x73\x01\x91\x80\x1a\x96\xb0\x84\x92\x29\x32\xfa\x7b\x71\x1f\x4d\x5c\x8b\x1e\xc0\x21\xc7\x6b\x69\xe2\x2e\x2a\x90\x31\xc6\x46\xbf\x70\x37\x18\x33\x0c\xa9\x54\x90\xfd\x24\xa7\xcf\x32\xd9\xa6\xa9\xcb\x7a\xaa\x9b\xfc\x83\x2f\xfd\x9e\x8b\x44\x3e\x3d\xbe\xd4\x41\x5e\x5c\x9f\x5f\x7c\xf3\x27\x60\x75\x49\xe5\xcf\x7e\xc0\x61\x7c\x73\x49\x3f\x5c\x89\x64\xae\xab\xbc\x3c\xed\xf3\x8a\x70\x8b\xd1\xd1\xed\xc3\xba\x86\xdd\x9a\x38\x40\x58\xe1\x4b\x17\xc3\x60\xf6\xad\x6f\x80\xaf\x66\xea\x58\xfb\xed\x16\xa8\xfd\xa9\x4d\x2f\xad\x78\xb2\x36\x78\x0f\x8a\x10\x00\x74\x6e\xe9\xa8\x51\x46\x4a\x4e\x88\x87\x52\x40\x64\x10\x44\xb0\x44\x1c\x1b\x46\x29\x2d\x63\x1b\xcb\x18\xce\x79\xfa\x53\x1f\x11\x40\x29\x39\x2f\xa5\x8c\x87\xb8\x75\x0e\xa0\xb8\x4d\x74\xf6\x59\xb6\xca\x59\xd2\xb9\x2e\xfb\xc3\x54\xc3\x98\x30\x72\xff\xfc\xfb\x92\xf8\xf8\x99\x28\x7e\xf9\x2a\x8a\xc5\xab\x28\xa6\xb8\xe2\xf1\xfe\xf1\x8f\xf3\x2f\xca\x19\x0f\xab\xbb\xdf\x02\xa9\x1b\x7d\x3c\x43\xe7\x14\xe4\xc7\x79\x53\x83\x7d\x2c\x73\x4e\x85\xa6\xe8\x68\x6a\x1f\xfa\x0a\xb6\x3d\xb5\x1b\x56\xba\x52\xc7\x61\xa3\xe3\xa6\xf6\x15\x18\xd6\x33\x66\xed\xb1\x97\x72\x54\xc8\x62\x38\x6d\xd3\x4b\x74\x55\x09\xb6\xa5\x36\x03\x1c\x30\x2e\x62\xa5\x63\xe0\x00\x8a\xd8\x83\x50\xa6\x02\x86\x95\x8a\x51\xe6\x8a\x52\xb0\x12\x5a\x58\x42\x84\x10\xc3\x96\x31\x41\x47\x75\x59\x46\x2f\x93\x9c\xea\x53\xdb\xda\xbe\xb7\x63\x18\x71\x10\x42\x6c\xf8\xc1\x5b\x2a\x37\xdc\x13\x6d\x71\x96\x2d\xb2\xf0\x4c\x57\xf2\xdc\x33\xf5\xfb\xd9\x43\xea\xcd\x3f\x4b\x64\xf9\xf6\x92\x07\xfb\x15\x78\xf9\x6c\xf5\xfa\xd9\x35\x32\xe1\xc2\x29\xf4\x45\xbf\xd7\xd7\x6f\xee\x16\xba\xf2\x5a\xd7\x9b\x22\x21\x38\xd5\xda\x6c\xaa\xe3\xba\x32\x52\x87\xbe\x28\xbb\x4a\x87\xda\x6c\xcc\xa1\x79\xce\x1c\x32\x56\xcf\x84\x47\xce\x9a\xe3\x90\x63\x54\x56\x25\xcc\xb7\x45\xd5\xa8\x1e\x0d\x86\xf3\xf2\x54\x57\xa7\x1d\x07\x6b\x17\xcb\xa5\xeb\x08\xb3\x92\xc2\x52\x1a\x67\xa4\x55\x56\x1c\x40\x51\x63\x6a\x05\xc5\x58\x68\x97\x40\x84\x72\xdf\xa1\x26\x30\x6f\x71\xed\x98\x3b\x1a\xeb\xa1\xd3\x91\xed\x60\x55\x5a\x50\x44\xe9\x6b\x0d\xf0\xc4\x0b\x55\x3c\x8b\x55\xb7\xf4\x57\x18\xf2\x17\xb2\x8d\xd9\x0f\xa3\x35\xe7\x6d\x85\x01\x02\x56\xc5\x10\xb7\xf1\x10\x1b\x05\x7a\x3d\x2b\x8e\x87\x30\x67\x5c\x70\x87\x03\xc5\x51\xd7\x31\x2c\xbd\xe0\x71\xb3\x09\x1b\x40\x63\x3b\x38\x40\xe3\xa6\xea\x23\x39\x23\x3a\xd1\x49\xe5\xf5\x84\xb7\xae\x9e\x6d\xea\x61\x3c\xf7\xd5\x82\x9b\xbb\x9b\xf7\x1f\x3e\xbd\x7b\xb3\xfa\x90\x74\x72\x2a\x66\x5e\x5a\xa7\xd7\xa7\x0e\x48\xe5\x83\xaa\xd9\x73\x16\xd7\x4c\x00\x5c\xc5\xcd\xa8\x60\xc7\x6b\xd1\x1d\xfb\xd3\xbe\xea\xd9\x26\xee\x45\x17\x6c\x85\x16\xbe\xef\x63\xb3\x3e\x4d\x7d\xfc\xb3\x7c\xfb\x5c\x25\x9f\x64\x95\x98\xb8\x5e\x08\x45\x16\xb7\xf9\x2c\xb9\xc5\x67\xd6\xaf\x19\x03\x6d\x0d\x86\xa7\xed\x8c\xb6\x3e\x00\xff\xc4\x73\x5f\x47\x64\x71\x8b\xcc\x02\x8d\xae\x4f\x35\x1a\xb7\xa8\xaa\x0a\xec\xc0\x21\xca\x28\x09\x58\x83\x69\xb6\x99\x7c\x66\xf9\x3e\x61\xae\x2e\x5c\x01\x5f\xe5\x17\xb2\x80\xcf\xb8\x02\x42\x5f\xd7\x86\x20\x8c\x2c\xa1\x5e\x09\x51\x09\x29\x41\x51\xc7\xb0\x30\x09\x54\x55\xc4\xad\x21\x88\x73\xae\x68\xe5\xdc\xe8\x11\x43\xcf\xc3\x0e\xec\x26\x5f\x74\x0f\x86\x95\x58\x14\xd9\x4f\xb2\x77\xd9\xdf\xcc\x7e\x37\xfb\x45\xf6\xcd\xc5\x47\x99\x9a\xb8\x5f\xbd\xf2\xcf\x38\x25\x12\xb0\x92\xfa\x12\x82\x2e\x96\x54\xda\x2a\xc4\x26\x95\x06\xe8\xb1\x0d\x20\x7b\xce\x12\x48\x2f\x7b\xce\x66\x26\x97\xa7\x66\x51\x60\xce\x5d\x6d\xd5\x06\x14\x63\x0c\x6c\xed\x0c\xef\x6d\x6c\x4c\x6c\xad\x25\xfe\x8a\xb7\x65\x6e\xb2\xaf\xce\xf5\xd3\x0c\xfc\x4d\xf0\xf0\xcb\x37\xb7\xf9\xfd\x2f\xf2\xd9\x0b\xdc\x16\xdc\x3d\x2e\xef\x2f\xa0\x85\x9b\x51\x0d\x7d\x96\x52\x7f\x4c\x28\xa0\x51\xc5\x2c\x9b\x02\x61\x54\x04\x1c\x94\x2d\x9f\x9a\xbe\x32\x02\x14\xc0\xae\x3b\x94\x23\x40\x4d\xbd\x07\x36\x7a\xa3\x61\x69\x0d\xf7\x08\x45\x17\x29\xdc\xad\xa3\xaf\xb6\x5b\x60\xb7\x73\x73\x5a\x9f\x7a\x00\x49\xb4\x40\xcc\x58\x44\xd1\xc4\x61\x32\x27\x24\x16\x06\x5a\x28\x2d\x46\x2e\xfa\xba\x28\x11\xa2\x75\x4f\x95\xe0\x38\x94\xb0\x75\xce\xb9\x2c\xe1\x9f\x66\x66\xe5\x96\x21\xfb\xf9\x4b\xbe\xe5\xdf\xcd\xfe\x61\xf6\x8f\xb3\x7f\x96\xfd\xe7\x99\xce\xfe\xe5\x05\x9d\x76\x9d\xa3\x7b\x49\xc9\x2e\x57\x9f\x26\x07\xe9\x2f\xb9\xfd\x25\x04\xea\xf6\xec\x22\xfe\x28\x04\x0a\x32\xac\x8b\xd2\x3a\x29\x91\x92\x5c\x39\x69\x28\x47\x50\x08\x53\xb7\xeb\xb2\x78\x6a\x19\xd6\xa5\xfb\x91\xbb\x80\x8d\xe2\x72\xb9\x3a\xd5\xe4\x85\x4a\x20\xcf\x62\x36\x6a\x83\xc3\xac\xc6\x48\x23\xfc\xd4\xa5\x97\x99\xb1\x98\x1a\xf6\xa4\xd3\xcb\xc2\x2a\xcd\x20\x42\x71\x0f\xb2\xb2\x50\x54\xd0\x51\x81\x4a\x51\x96\x42\x93\xc1\x90\xb2\x64\x4a\x33\xfa\x97\xdc\x07\x5c\x12\x89\x24\x92\x78\x10\x04\x73\x41\x04\x27\xe9\x27\xc2\x86\x53\x29\xd2\xcf\xa9\xe7\xd0\x3c\xf3\x79\xbd\x0c\xe7\xa9\x59\x5f\x4f\x48\xa8\xf9\x22\x09\xf0\xf6\x01\x5d\x67\x10\x13\x2e\xf8\x76\xf5\xfe\xd3\xe8\xc5\x5d\x02\x8b\x4b\xf1\x22\xf1\x84\xdd\x3d\x4e\x7f\x65\x52\x5c\xcb\xd5\xeb\x56\x7b\xe1\x59\x99\x73\x1e\xbb\x88\x28\x73\x8a\x32\x08\x04\x10\x14\x7b\x44\xe2\x9e\x61\x8f\x49\xec\x66\x5d\xe5\xb5\x88\x44\xb4\xd6\x9c\xe8\x6c\xa7\x15\xa6\x10\x33\xe1\xd6\x38\xa8\x4e\xad\x29\x89\x2e\x2f\x29\xf7\x98\x21\x16\x07\xaa\xb4\x81\xc8\x28\x62\x8b\x72\xbb\x47\x56\xc6\x9d\x5b\x06\xc7\x4b\x2b\x79\x08\x50\x72\x41\x25\x83\x5c\x30\xc9\x6a\x23\x19\xd2\x41\x11\x4c\xe2\xf6\x58\x0b\x51\x1a\x44\xb0\x24\x06\x51\xc9\x25\xa5\x5a\x2b\x2e\x70\xc1\xf2\x5e\xcb\xa2\xc4\x18\x99\x80\x30\x42\x85\xe6\xfe\x68\xe7\x53\x3d\x9a\xcd\x36\x4b\xfc\x03\xbd\x55\x77\x2f\xbd\x55\x77\xdf\xef\xad\x02\xaf\xbd\x55\x37\x8f\x29\x63\xab\x67\x26\xf6\xa0\x08\xb1\xf0\x9b\xe7\x0c\xf4\xa2\x07\x87\x92\x0b\x26\x8c\x00\x1d\xb3\xa8\x2c\x22\x17\x22\x25\x65\x70\xe8\xbe\xb3\x36\x2c\xea\xd1\xd9\x38\x36\x6b\x4c\x19\xe8\x78\xac\x37\x0c\x14\x25\xe0\x51\x13\xc8\x1a\x90\xf1\x63\xd6\xbc\xf0\xd4\xb5\x8b\x2c\x7b\x97\xfd\x76\xe2\xc2\x79\xf1\xc5\x17\xab\xaf\xdf\x2f\xbf\xa4\x07\xfb\xcc\xe3\x2e\x2b\x96\x5b\x5b\x6f\x41\x21\x62\x17\x0f\x87\xd8\x4a\x80\x07\x23\xb9\xf4\x00\x6a\x57\xd7\xea\x74\xc8\xfb\xea\x54\x87\x30\xee\xea\x45\x46\x8c\xeb\xac\x20\x35\xb3\x96\x7a\x22\xb9\x12\x4c\x0f\xd4\x0a\xe5\x4e\xfd\xa9\x15\x22\x17\x31\xec\xfe\x7f\x55\x83\x59\xcd\xc8\xb3\x58\xd5\x4b\xfa\x82\xeb\x7e\xcc\xfe\x38\xfb\x37\x27\xbc\xcc\x54\xd3\x9c\x2f\xbe\x7e\x39\x15\x8b\x57\x55\x75\x9f\x9a\x57\x93\x26\xbe\x3b\x3b\x7d\x97\xac\xf7\x99\x6e\xcb\xce\xfa\x08\x95\x69\x82\x0b\xf1\x10\xd7\x00\xed\x31\xb1\x41\x3a\x84\xe3\xb6\xea\x07\x5c\x57\x4c\x14\xae\xb2\x71\x5b\x1d\x0e\x20\x80\xec\x64\xa6\x57\xd8\x18\xaf\x9a\x98\x39\x6b\x8d\x5f\xd2\x93\x33\x92\x69\x4b\xf7\x35\x42\x8c\xd2\x66\x20\x9c\xe2\xd3\x2e\x2f\x60\xe9\xb8\x42\x88\x18\x07\x46\x95\x1c\xc7\x1f\x47\x51\xb7\xbc\xa9\x31\x1f\xac\x0a\x59\xb6\xca\xfc\x33\x5b\xd9\x59\x9d\xfd\xfc\x05\xa1\xfa\xef\xa7\x38\x68\x42\x3f\x7e\xfa\x31\x05\x9d\x7a\x88\x2e\x40\x83\x1f\xe0\x60\x5a\x5c\xd1\x2e\x5d\x2b\xe2\x7c\x1b\xb6\x87\xb6\x22\x56\x52\x0b\xcb\xda\x57\x35\xf6\x4e\x8d\x8f\x8f\x09\x4e\x75\x9e\x05\x88\x06\x02\x6b\x88\x01\x8e\xdd\x0b\x1f\x9f\x38\xe1\x80\xb0\x6c\x81\x9f\x22\xfb\xf1\x8a\x4d\x6a\xb9\x8a\x34\x30\xee\xe5\x4c\x91\xb8\x6b\x10\x96\x34\x34\x94\x12\x1c\x09\xe8\x10\x74\xc2\x68\xa9\x0d\x91\x8c\x10\xdd\x61\xc6\x84\xc0\x8c\x3a\x63\x9d\x35\x5e\xe6\x01\x21\xd5\xd6\xc6\x1c\x9c\xdb\x19\x6a\x02\x0d\x06\x91\xd6\x0a\x3f\xcd\x53\x1c\xed\xb1\x9d\x37\x3f\x20\x9b\xc5\xfb\x6f\x7e\x5c\x36\xe0\xaf\x20\x9b\x0b\xd7\xd0\x35\x01\x5b\x3e\xd4\xbb\x78\x00\x14\x22\x27\x99\x83\x65\x55\x59\x8f\x9d\x55\xae\x76\x5e\x5b\x4e\x0d\xd8\x06\x84\xf7\x14\xd5\x88\x00\x16\xeb\x04\xf2\x1f\x2f\x73\xdc\x57\x88\xc8\x0e\x84\x2b\xe9\xb4\x92\x3a\x22\xce\xd2\x99\x43\x1a\x9b\x35\xa1\x94\x56\x3d\xa5\x14\x9d\xf6\xe0\x00\x4b\xaf\x9c\x16\xcd\x9a\x34\x0e\x13\x07\x20\x56\x52\x1b\xa4\x85\xaf\x7d\xe3\x9b\x20\x66\x84\x60\xb5\x19\xea\x3a\x0e\x4d\x13\x87\xa6\xf8\x5c\x40\xab\x79\xf3\x4c\x57\x4d\xea\xd1\xbc\xd4\x10\x7e\x2f\x71\x8a\x5f\xc1\x0f\xd3\xbc\xfe\xc4\x64\x9b\xe2\xe4\xd7\x09\xb5\x57\x49\x8f\x45\x96\x07\x69\x18\x87\x63\x18\x5b\xf4\xd6\x5b\x27\x6b\x94\xf3\x53\x17\x92\x47\x75\xbe\xa0\xd3\x95\x09\xa0\xb1\xc2\x73\xbb\x2c\x63\x5f\x17\xbe\xa0\xd5\xc1\x28\x53\x45\x77\x0c\xb9\x76\xd1\xbb\x18\x6c\xdc\x73\xe7\x8c\x36\xda\x09\x6b\x46\xbf\xaa\x7d\xe6\x2b\x9a\xfa\xa7\x5e\x26\x3b\xa7\xae\x98\xcf\xfd\xf2\xc5\x75\x1e\x06\xce\xda\xa3\x88\xcd\xd2\x9e\x20\x37\xa9\xfa\x0d\x4f\x25\xf0\xbe\x39\xb8\xc3\x6c\xbd\x5f\x9b\xf5\x6e\x0e\xab\x43\x15\x91\x91\xb0\x46\x1c\xac\x39\xdf\x6f\x5c\xbf\xae\x07\xbf\x6b\xb2\x3c\xf3\xb9\x58\xe1\xa5\xcd\x7e\x9e\x3d\x5e\xb3\x01\xbe\x74\x1b\x5e\x68\x52\x52\x06\xf9\xfd\x35\xa3\xc4\x5d\x22\x68\xf8\xe9\x9b\xfb\x0e\xf0\x1a\xd0\xb8\x06\x65\xdc\xd7\x75\xd9\x34\x75\xdd\x90\xbe\x4b\xb4\x32\xdd\xcc\xcc\x32\x53\x09\x83\xac\x64\xa4\x8c\xbb\xd2\x38\x67\x55\xd9\x2d\xb6\x55\xe5\x1b\xdf\x96\xd0\x23\x18\x5c\x59\x54\x45\xd9\xfb\x66\x38\xa9\x03\xac\xa0\x07\xbb\xe8\xe3\xda\x6a\x0d\x10\xa0\x59\xb6\xcc\xe9\x33\x5f\xa9\x25\x39\x77\xef\x4e\x6c\x4c\x19\xb8\x79\x69\x2e\x1e\x43\xf6\xd1\xe5\xbd\x7f\xfb\xf0\xe6\xcb\x0e\xb7\xcb\x03\x5d\x36\x5d\x78\x3a\x84\xbe\x3a\x00\x77\xf2\xb9\x3d\x1c\xbc\x3e\x17\x77\x4f\x5d\x55\x4d\x6c\xf0\xa7\x6e\x49\x62\x11\xf7\xce\x81\x72\xb4\x84\x07\xfb\x9c\x99\x78\x38\x6e\x94\x2c\x7d\xc1\x65\x5c\xcf\x76\x71\x17\xa2\xf2\x67\xae\xa0\x61\x65\x96\xe2\xd7\xe1\x0a\xda\x82\xf6\xbb\x0c\xb4\xa7\xc3\x1c\x46\x17\x55\x82\x31\xd4\xc0\x05\x00\x97\x22\x88\xa8\x40\x9d\xd0\x6b\x7b\x37\x39\xa8\xbf\x95\x99\x51\xb7\xa7\xfa\xd3\x6d\xd2\xee\xff\x4e\xf6\x1f\x66\xff\x63\xf6\x3f\x67\xff\x7b\xf6\x7f\x64\xff\x67\xf6\x7f\x65\xff\x77\xf6\xff\x8c\xd1\x47\x3a\xea\x0f\x2f\x15\x9d\x0f\xf7\xb7\x0f\x1f\x3f\xdd\xbf\x7f\xf9\xfc\xf5\xe3\xf1\xd3\x97\xe7\xfc\x3a\x6e\xe0\xc2\x6e\x3e\xc9\xf1\xab\x77\x0f\xbf\x04\x7f\xc5\xbf\xf6\x22\xf1\x04\x99\xb8\x1d\x5f\x1e\x1e\xef\xdf\x5f\x3f\x88\xeb\x1b\x2e\x14\xa5\x86\x65\x45\x8a\x52\x44\xae\x20\xed\x68\x59\xe8\x59\x16\xca\x42\xc3\x32\x60\x24\x23\x53\x25\x6d\x29\xd2\xa7\x60\xce\xda\x75\x7b\x38\x1c\x0e\x3b\x55\xd0\xaa\xa1\x00\xc5\x1d\xa0\x03\x94\x3a\x97\x13\x81\x3a\x8c\xbb\xe9\x7e\x49\xea\x86\xa4\xff\x84\x0d\xa5\x34\xdf\xed\x28\xc5\x04\x72\xdc\x19\x33\xba\x32\xf3\xf5\xf4\x3b\x2a\x7a\x63\xfa\xbe\xef\xf3\x00\x21\xc2\x58\x12\x2c\xa5\x1c\x7f\x4e\xbf\x4e\xff\x0b\x58\xd2\x01\x0b\xc2\x49\x89\x34\x41\x0c\x6c\x48\x2c\x8b\xb2\x9c\xa1\xab\x1b\x8a\xbe\xde\x00\x6d\x54\x94\x14\xa2\xe0\x55\x5e\x04\xba\x66\xdb\xf3\xef\x04\x9e\x3f\xc8\x72\x50\x3e\xf3\x55\x31\xe3\xd9\x6f\xa4\x3e\xc9\xd4\x8e\x76\x86\x37\x83\xb4\x9f\xc7\x30\x75\xb6\x61\x3b\x03\x48\x5d\x11\xbe\x5b\xdb\x0e\x74\x75\xfd\x5d\x53\xcf\x3b\xd0\xfa\xd6\x80\x02\x48\x6c\xad\xab\x7d\x03\xba\xa3\x12\x33\x7e\xe2\xd9\x4f\x32\x9d\x93\x97\x1c\xfc\x9f\x9f\x73\x85\xff\x22\xfb\x6f\xb2\xff\x3e\xfb\x9f\x7e\x2c\x63\xf8\x4a\x6a\xff\x27\x60\xc2\x96\x97\x89\x05\xfc\x6e\xf5\x78\xff\x76\xf1\x30\x05\xcc\x97\x4e\xf3\x8f\x97\xe6\x97\x4b\x8e\x7b\xf1\xf6\x4c\x54\x98\x6a\x3a\xe7\x67\x3f\xc1\x89\x1e\x3e\x7e\x7a\x58\xae\x1e\x1e\x73\x6e\x52\x14\x82\x21\x56\xb0\x8c\x19\x60\x45\xec\xa4\xa8\x69\xa9\x4b\xb1\x5f\x8b\x7e\xe6\x8f\x56\x5a\x01\x82\xe8\x67\xf5\xce\x01\x1e\x0f\xaa\xd3\xb5\x22\x6b\x3d\xc0\x2d\xd8\x49\x2e\xb8\x78\x42\xf9\xe6\x84\xcd\x78\x1e\xf3\x56\x70\x57\x7a\x12\x77\xea\x60\x8c\x2b\x4b\xb5\x2e\x8b\xaa\x2c\x4d\x59\xfa\xa5\x2d\x39\xe1\x94\x51\x84\x48\xc9\xca\xa2\x28\x21\x45\x1c\x63\x54\x16\x9a\xd3\xb8\xd9\x89\x01\x94\x20\x38\xca\x52\x6f\xb2\x8d\xbb\xbd\x3d\x00\x14\xdb\x8d\xd8\x03\x01\x0c\xe1\x4a\xd2\x28\x6a\x4a\xc2\x16\x13\x8e\x8a\x10\x34\x20\x0e\x22\x04\xc7\x8b\xa6\x79\x98\x6c\xb9\x9f\xe9\xec\x7e\x9a\x4b\xf1\xfe\xaa\xc0\x76\x7f\x26\xaf\x9f\xd2\x00\xaf\xd6\x14\x3c\xa4\x90\xf8\x66\x7c\xb8\xf3\x01\xf0\xa7\x0d\x60\xcf\x19\xc8\xb6\xdb\xb8\x07\x65\x70\x93\xf5\xc8\x9e\x33\x80\x9f\x78\xb5\xf5\xc3\x02\x56\x55\xa5\xbd\xd7\x4e\x3b\xe5\xfc\x71\x3d\xa3\xa3\xe7\xa1\x7c\x1e\x62\x17\x75\x3c\xe8\x1d\x10\x80\x1d\xc7\xbd\x54\x3c\xb3\xc5\x3e\xb7\x89\xd7\x60\xea\x58\x7e\x78\x5b\x2e\x3e\x7c\x7d\xb3\x10\x75\x7d\xdc\xd6\x71\x1d\x00\xce\xed\x71\x3b\x83\x43\xf4\x3b\xb3\x4e\xc9\xa0\x65\xa6\x9e\xc9\xaa\x5a\x98\xec\xa7\xd9\xcf\xb3\x3f\xca\xfe\x8b\xec\xbf\x4c\x7d\x3e\xcb\xd5\x19\x27\x7e\xf3\xf5\xa7\xa9\xf9\x1c\x9c\xc3\xd8\x9b\xfb\xc7\x6f\x3e\x2c\xc6\xcd\x79\x7d\xa6\xbf\x5a\x7c\xf8\x38\xa9\x95\x9b\xfb\x9b\x2f\xbd\x88\xbb\xc7\x2f\xfe\xa4\x2d\x94\x12\xee\x0f\x37\xf7\x4b\x28\x84\x16\xa8\x72\x0c\x14\x9d\xf6\xbc\x63\xdb\x53\x26\xa8\xa0\x4a\xf2\xc0\x74\x64\x55\xce\x38\x27\x12\x4a\x8c\xaa\xb8\x97\x1b\x5a\xcf\x87\x10\x22\x4f\x84\x43\xa3\xc4\x54\xac\x81\x7f\x62\xa0\x89\x1d\xe0\xc9\xda\xf4\x80\x45\x53\xac\x4d\x5d\xd4\xf3\xe1\x89\xe4\xa5\x73\xf3\xa1\x2c\x7a\x84\x14\xc3\x0c\x68\x44\x35\x6a\xb9\x55\x20\x30\x4e\xa5\x34\xf8\x39\xdb\x69\x29\x75\x1c\x18\x2f\x6c\x81\xba\x6d\xd0\xa6\x63\xec\x69\x9d\xef\x84\xe2\x4a\x28\x61\x8c\x50\xe9\xed\x69\xb3\x31\x5d\x5e\x12\x76\xca\x72\x39\xe5\xe8\xc5\x33\x5d\xd5\x0b\x9b\x64\xf8\x70\xd5\x37\xf5\x4f\xb2\xbf\x48\x58\xf2\x57\x69\x7e\xfc\x42\x9a\x6f\x47\x69\xbe\xbf\xca\x24\x7e\x9a\x68\x64\xee\xdf\xbc\x0a\x73\x3c\x88\xc9\x74\xdd\x9e\x7d\x92\xcb\xd8\xd3\x09\x95\x3b\x39\x00\x4b\x3c\x1e\x0f\xa2\x2b\xbe\xdf\x30\x2b\x5a\x39\x9c\x0a\xc1\x38\xd3\x52\x79\xae\x4e\x55\x2e\x0b\x2e\x30\x87\x92\x14\x45\x51\x17\x71\xaf\xf7\xb0\x33\xd5\xbc\x0a\xe1\x49\xef\xdc\x50\xcd\xab\x27\xed\x66\xd5\x51\x5f\x95\x5d\x4f\xde\xf1\xcd\x0e\x6e\xf3\xa2\xeb\x48\xdb\xce\x37\x45\x59\x41\xac\x19\xe6\x80\x97\x4c\xa3\x9a\x69\x05\x34\xe7\x4c\x70\xc3\xfb\xd6\xc8\xf2\x39\x73\xa5\x29\xe5\x18\x3c\x0b\x1d\x0f\x9c\x3e\xf9\x19\x5f\x47\xbb\xd7\x1b\x40\x01\xe2\xdb\xd3\x06\x04\x3a\xb0\x2d\xef\x25\xc7\x16\x11\x48\x35\x85\x13\x7f\x20\x5c\xb9\x85\xc9\x7e\x23\xc9\xf0\xcf\x52\x9f\xcf\xcb\x96\xbb\x99\x5c\xce\xd4\xd3\xb4\x5c\xbd\x3d\xef\xcc\xc5\xe7\x72\x5b\x5d\xcb\x2d\x31\x1a\xfe\x0a\xdc\x8e\xd6\x7e\xa6\x85\x50\x42\x2b\xef\x85\x9a\x43\x26\x04\xf3\xaa\xa6\x82\x07\xac\x03\x07\xc5\x77\x2a\x57\x85\x36\x90\x40\x86\x30\x2a\xba\x62\x50\x4d\x11\xba\x30\x17\x55\xf5\x64\x88\x32\x4a\xd8\xb9\x7e\x6a\x8a\x85\x11\x9a\x1b\x61\x55\xdc\x02\xac\x0d\x31\xb0\xdc\x4b\x6d\x01\x2a\x8b\x81\x1a\x82\x39\x70\xb0\x8c\xdb\x0a\x5a\xc8\xfc\x36\x18\x13\x62\xcd\x79\x2c\x8d\x60\x86\x36\x42\xd2\x4b\xbd\x2a\x2c\x64\xf6\x1b\xd9\xef\x66\xbf\xcc\xfe\x51\xf6\x1f\x67\xea\x8b\x95\x2e\x2e\x47\x6e\x76\xd9\x36\xd7\x0e\xea\xe3\x7d\xbe\xf8\xf0\xf1\xf1\x1e\x2c\x17\x1f\x7e\x05\x3e\x4d\x67\xe9\xf1\x65\xb7\x4c\x31\xde\xd9\x88\x8c\xfb\xe4\x0c\xdd\x36\x82\x31\x61\xa5\xaa\x84\xce\x0b\x50\xf6\xba\x66\xad\x1c\x58\xa5\x38\x0e\x8e\x3f\x35\xb9\xa0\x81\x10\xc4\x18\x86\x4d\xf1\x9c\xe9\x7d\x3d\x13\x3a\x0e\xea\xd0\x16\x11\xa3\xad\xdd\x16\xd5\x9c\x57\x55\x44\x05\x14\x9a\x39\x21\xad\x92\xfd\x09\xcf\xf9\x53\xd7\x7b\x6e\xac\x59\x48\xae\xa8\x91\x8e\xc7\x0e\x10\x6b\x08\x62\x06\x6f\x94\xb6\xa0\x2c\x07\x88\x2c\x41\x1c\x84\xd8\xfa\xd2\x97\xac\x8e\xfb\xda\xf8\xee\xa9\xf1\xd2\xb2\xa6\x8a\x4d\x6d\x2b\xd0\x6c\x19\x3b\x1a\xb0\x57\x1c\x0b\xc9\x25\xa7\xd4\xba\x3c\x93\x74\x43\x8c\xe4\xe2\x35\xbe\x79\x95\xdd\x9f\xa7\xce\xcd\x7f\xfc\xaf\x25\xbd\xd7\xe3\x95\xb8\x08\x46\x19\x26\x78\x0b\xb8\x0e\x78\x7f\x7d\x99\xd5\x67\x21\xd5\x11\xa3\xcd\x24\xb3\xa7\x6e\x46\xac\x70\xdc\x46\xec\x6c\xb0\xf5\xaf\x2f\xa7\xa8\x38\x3f\x1a\x30\x44\x0e\xba\xb8\x4e\xb2\x52\x96\x3c\x67\x36\x70\xef\x18\xef\xb4\x36\x09\x9b\xc4\x57\xf5\x8c\x64\xbf\x48\xf8\x97\xcf\x78\xd9\x6f\x1e\xde\x5e\x06\x38\xdd\xa3\xab\x1c\x4c\x2a\x61\xaf\xde\x5d\x72\x30\x89\x60\x78\x1d\x8a\x12\xec\xb8\x0a\xbb\xb0\x6f\x44\xdd\xe4\x90\x1c\x4e\xeb\xd8\xee\x63\xc3\x40\xd9\x29\xce\xa5\xde\x01\x6d\x59\x34\x50\xcf\x75\x7d\xcc\xea\x7a\x9e\x1d\xb3\x19\x41\xa8\x34\x46\xc0\x02\xd4\x9a\x31\xc3\x48\xef\xa4\x25\x1e\x51\x42\x19\x51\xbe\xa2\x12\xf2\x34\x47\x83\x02\xbf\x35\x13\xbf\xae\x7a\x66\x2b\x98\x6f\x53\x06\x7b\x7a\x20\xe7\x06\xbd\xcb\x19\x4e\x04\xe6\x67\x28\xd5\xf8\x85\x6f\x00\x0c\x40\xfa\x88\xe6\xbb\xd3\xde\x03\xef\x7d\xf4\x3e\xcf\x9e\x8a\x12\xec\x5d\x34\x54\x99\x2e\x1f\xea\xea\x39\x13\x1c\x14\x75\x77\x54\x87\x1d\x10\x4a\xc6\x7a\x5f\x29\x39\x00\x94\xfd\x24\x73\xf9\x61\x65\xaf\xb0\x1c\x9f\xe1\xc9\x2e\xbc\xd7\xef\xcf\xaf\xab\xe9\xf5\xb3\x6a\xe9\x18\x87\xcd\x51\xbe\x3e\x51\x0f\xba\xc8\x8f\x70\x7c\x9b\xaa\xbd\x78\xa1\xbe\xab\x3d\xd8\x46\x94\x6b\xb0\x7b\x6a\x2f\xef\xbe\x73\xcb\xc3\xb7\xc5\x52\x9d\xcb\x77\x52\xee\xa3\xdb\x53\x4a\xd7\x94\xd2\xde\x66\xcb\xcc\xe6\x9b\x95\x5f\x14\x5f\xcc\xb9\xfe\x91\xff\x6f\x80\x17\xd5\x77\xda\x27\x67\x6a\x5c\xbb\xbd\xbc\xfb\x8e\xad\xca\xc3\x7e\x51\x44\x7d\x38\xff\xe3\x1b\x35\xf5\x97\x98\x59\x58\xf9\x79\x98\xe6\x6a\x4c\x68\xfb\xf7\xa9\xad\x6e\x96\x89\xb8\x8f\x4e\x80\x3e\xef\x81\x02\x94\xc6\x36\xb6\xf3\xa0\x25\x71\x84\x12\xee\x04\x1d\xed\x1b\xd8\x27\x6e\xa3\x89\x73\x68\xc2\x4d\x5e\x90\xa1\xff\x56\x9a\x1e\x73\x61\xe7\x7e\xb8\x39\xa7\xb6\x6f\xbe\x67\xfa\x3f\x3d\x3c\x5e\xb8\x0e\xde\x3e\x3c\xae\x6e\x5f\x78\x29\xff\x00\x7c\x1f\x54\x40\x7d\xe7\x5b\x7f\xca\xca\x7c\x7b\x42\xf9\x36\xae\x53\xd6\x40\x1e\x77\x40\x4e\xe6\xdd\xf5\xbd\x22\x48\x20\x0c\xca\x4e\x0a\x42\x18\xe9\x09\xd2\x08\x0b\x8a\x2c\x24\xb1\x72\x94\x3b\x09\x38\x81\xae\x24\x4b\xda\xee\xf7\x6d\xdc\x26\xae\x39\x6e\x46\x43\x6e\xb8\x3d\xa4\xac\xb4\x10\x87\x03\x22\x9a\x32\x76\xb2\x53\x7e\x5a\x3b\xec\x75\x89\x5b\xc3\xbc\x35\x1e\x7b\x93\x65\x60\xe6\xb2\xb0\x70\x4b\x77\xe9\x4f\x9f\x50\xc2\x89\xd5\x29\x65\x9d\x3e\x7e\x4a\x00\xde\x6f\x3e\x2c\x10\xc5\xae\xac\x5a\xec\xac\x36\xc8\xab\xa0\x82\xe0\x10\x79\xdf\x2a\x51\xc2\x5c\x37\x6b\x2a\x04\xb1\x3b\x60\x28\xf4\x00\x82\x81\x44\x79\x28\xa0\xd2\x24\xc2\xd8\x23\x2c\xcf\x7a\x2e\x00\xb8\xaa\x96\x26\x45\xff\xaf\x35\xee\x0c\xdc\x25\x5f\x7a\xc2\xa6\x9e\x1d\xf1\x33\xec\xe7\x0b\x1c\xca\xfb\x49\xe8\xdf\xeb\xa8\x92\x00\xa7\x00\x1b\x98\xd8\x49\x90\xe9\x8d\xa1\x5b\xbb\xc7\x71\x97\x07\x49\x2d\x91\xdf\xf1\x99\x8a\x15\xb0\xd1\x0f\x0d\x8c\x2a\x66\x10\x54\x89\xfc\xb7\xaa\x86\x01\xa8\xe1\x34\xa4\x97\xf9\xd0\xed\x76\x5d\x88\x70\x6d\x5b\xe0\x62\xbf\xd7\x07\xb0\x06\x7b\x65\xb8\x51\xfc\xc4\x9c\xf3\x10\xb9\x51\x39\x56\xce\x81\xaa\xae\xeb\x28\xaa\x2a\xe1\x19\xc0\xbc\x4c\x73\x5a\xca\xe9\xb4\xbd\xbd\xcb\x13\x69\xd5\xc3\x17\x63\xb5\xf2\xd9\x87\xec\xcd\xdd\x87\x37\xb7\xb3\x87\x8f\x6f\xee\xe6\x7c\x46\xe2\xae\x80\x40\xc4\xba\xd4\x25\xa2\xa4\xf0\x50\x7a\xcb\xed\xde\x02\xc2\x63\x47\x83\x37\x7b\x58\x44\xb7\x2c\x7d\xdc\x6e\x2b\x75\xaa\x70\x29\x5a\xb2\xd7\x4c\x81\x4d\x34\xf1\xe0\x80\x04\x83\x03\x3d\x8e\x6e\x0b\x50\x96\x15\x99\x7e\xa6\xab\x30\x6b\xae\xf8\x20\xce\x1d\x20\xdf\xef\xbb\xb9\x79\x01\xd2\x5e\x47\xf1\x2f\x67\xf2\xea\x3c\x01\x0e\x68\x00\x9b\x00\x58\xec\x73\x78\xec\x73\xfb\x5d\xc8\xd5\xb1\xcd\x61\x5c\xcf\xea\x88\xe3\xf6\x4c\x7e\xb8\x7d\xea\x2f\xef\x8e\x03\x89\xbb\x58\x13\x20\xf3\x1d\xa8\x01\xe4\x71\x17\xcd\x4c\x71\xce\xb9\x91\x86\x8f\x5a\x9f\x9b\x31\x06\x1d\x9d\x09\xbe\xe7\x9c\x0f\x8a\x61\x0b\x29\xa6\x86\xe1\xc4\xe7\x51\x3f\xb3\x95\x9c\x0f\xbf\xe6\x5a\xa6\x9e\xa1\xcf\x61\x3e\x13\xef\xed\xb4\x96\x1a\xc0\x04\x5c\x44\x71\x9b\xa3\xe3\x21\x17\xdf\xf5\xb9\x38\x1e\xf2\x32\xee\xc0\xe8\x68\x77\x31\xcd\x85\xcb\x05\x68\x8f\xd9\xe5\xdd\x29\x53\x87\x18\x24\x70\x79\x07\x08\xc0\x22\x0e\x71\x98\x1b\xa5\x94\xb2\xd6\xca\x53\x9f\x33\x69\xad\xb5\xa7\x8d\xd6\x3a\xb6\xc6\x98\xe7\x4c\x1b\xe6\xa9\xc0\xd2\x6b\x92\xfd\x35\xd0\x3e\x93\x55\x58\xa8\xec\x6d\xf6\xb7\x5f\xbc\xe8\x7f\x9a\xfd\x67\x53\x57\xec\x84\x54\x3d\x77\x3d\x4f\x09\xa9\xfb\xf7\xe7\x86\xc3\xcf\x3f\x7d\xc9\x60\xbd\xcc\x96\xbb\xb9\xbb\x39\x87\x65\x69\x82\x58\xd2\xee\xaf\xbe\x74\xca\x6b\xfe\xfe\xb4\xfe\x79\x0d\x32\x0f\xca\x46\x78\x11\x94\x17\x41\x58\x51\x9d\xe8\xde\xef\xbb\xd4\xc1\xea\x85\x91\x96\x57\x32\x27\x2e\xa7\xa7\xf5\xd6\x8f\xb2\xe8\x9e\x78\x3f\x86\x1f\x7e\x38\x0d\x40\xe5\xe4\x34\xf4\xb3\xfa\xa8\x2e\x57\xbe\x3e\xec\xd9\xfe\x39\x8b\x4c\xad\xe3\x96\x83\x6c\x91\x29\x65\x18\xd1\x42\x36\x8d\xa0\x0a\x13\x23\xa5\xa1\x54\x31\x62\x2b\xcd\x34\xe5\xcf\x19\xa5\x5a\x12\xa2\xd9\x69\x97\x43\xa6\x09\x91\xcf\x19\xdb\xd2\x9e\x74\xa4\x41\xc4\x70\x94\xfc\x7d\x9c\x65\x05\x70\x89\xcf\x85\x25\x99\x4d\x08\x90\x7f\x3b\xfb\xa7\xc9\xaf\xfc\x61\x89\xdd\xfd\x90\xc4\x12\x07\xde\xa7\xdb\x31\x24\x99\x78\xc5\xee\x2f\xe5\xe3\x44\xe8\xf5\x3e\x99\xe0\xab\x66\xa1\xdb\x8f\x9f\xee\xde\xcd\x6b\x50\x04\x80\x77\xae\xe5\x8d\x0b\xae\x55\x9d\xa9\x4f\x04\x64\x61\xdb\x69\x6e\x30\x0b\xca\xc8\x4a\x0d\xe5\xa2\x3b\xee\x0d\xf4\x21\xee\xe3\x00\x85\x50\xfb\x4b\x92\xb4\xf6\x71\x93\x4b\x91\x5b\x58\x99\xa0\x82\xb6\x2d\x0f\xd6\x6d\x14\x8c\x7b\x3e\xdf\x2a\xe5\x3c\xf7\xa2\xd9\x1e\x1a\x69\xa4\x73\x52\x3a\x21\x18\x25\xc3\xda\x31\xad\x6c\x74\x3e\x22\x68\x61\x57\x11\xec\x8b\x32\x27\x5a\xc7\xb5\x8a\x5d\x09\xf9\xc6\x1e\x1a\x4e\x2d\x53\x86\x39\x22\x0d\xd2\xa9\xcd\x2e\x5b\x82\xe6\x4a\x56\x7f\x90\x3d\x9c\x31\x7e\x9f\xcb\xe9\xe6\x2f\x93\xd3\x9b\xbb\x1f\x00\x8b\xbd\x8a\xa1\xb5\x21\xb4\xaa\xb7\x67\x31\xf4\x8a\x19\x44\x82\x70\xa3\x18\xf4\x18\x64\x55\x33\x7d\xac\xe6\x2a\x3c\x6d\xaa\x6a\x8e\x9f\x36\xf3\x8d\xd6\xe3\x2a\x65\xbd\x01\x59\x37\xee\x2d\xa7\x94\xe3\x92\x11\xd2\x75\x46\x68\xe9\xa2\x8f\xb5\x35\xb1\x89\x54\x08\xb0\x7e\xce\xdc\xd4\xc7\xa0\x57\xcd\xf9\x9c\x5c\xba\x02\xbe\xf7\x5d\xdf\xff\xe0\xba\x46\x0f\x20\xa5\x7d\xce\xa9\x9f\x6b\xb0\xd8\x87\xf7\x8f\xd3\xf5\x35\x18\xc6\xef\xbf\x56\x7c\xfc\xfe\xca\xc8\x5a\x6d\xf2\x21\x2d\x73\xef\xba\xcb\x32\x5d\x03\xd6\x2c\xee\xe3\x26\xd7\xe5\xc9\xe7\x87\xe2\x94\xc9\x0e\x94\xa2\x0c\xa5\x8f\x55\xdc\x85\xd3\x1e\xe6\x38\x32\x08\x36\x91\x91\xdc\xcc\x77\xd6\x3a\xa9\x19\x25\xbb\x5d\xe0\xc6\x04\x6b\xad\xab\x45\xd0\xcd\x1e\xc0\x5e\x59\x15\x62\x30\x04\x4b\xe1\x85\x54\x4e\x0b\x08\x89\x23\x8d\x64\x5c\x73\xc7\x15\x75\x4c\x12\x37\xea\xbc\xf9\xf9\x39\xa2\xec\x6d\xf6\x77\xb2\x5f\x4e\xf3\x27\xae\xd6\x7a\xf3\xe5\x33\x7c\xfb\xf9\xc7\x67\x45\x77\x9b\xaf\xbe\x9e\x50\x27\x09\x8c\xf0\xf5\xf9\x39\x9e\x17\xe8\xbd\x5a\xeb\xf5\xf8\x1c\xab\xfd\xde\x6b\xc9\x45\x25\xad\x6c\xd4\x36\x2f\x42\x1b\x77\x01\x60\xd0\x54\xdb\x2d\x80\x80\x38\xd7\x9a\x1a\xe2\xc8\x62\x81\x81\x9d\xfb\xaa\x72\x83\x0c\x76\x54\x09\xb4\x57\xc6\x77\x2e\x04\x87\x85\xb0\x9c\xc6\x03\xc8\x6a\x69\xfc\x3a\x72\xba\x6f\x65\x63\x49\xec\x3d\xe2\x6b\x96\xb8\x00\xb9\x42\xb6\x9d\x9e\xaf\x78\x59\x1f\xff\x75\x57\x37\x3a\x29\xf3\xbb\x0f\xe7\x09\x1b\xb7\xcb\xc9\x49\xc9\x16\x5f\x7f\xfa\xf0\x57\x5c\xe2\x5c\x55\xba\x62\xb1\x88\x19\xdc\x1d\xb6\x7b\x08\xca\xd6\xbb\x6e\xd7\x28\xe1\x62\x17\x2b\xb0\xde\xe9\xbf\xda\x2a\x4f\xa8\xdb\x70\x27\x83\x08\xa8\x74\x66\x4d\x82\x81\x90\x0b\x19\x07\x5f\xf2\x2a\xfb\x4d\x40\x52\xdc\xd2\xfc\xa0\x3f\x3e\x9d\xd0\xe4\x27\xdc\xfe\x88\x37\xfc\x63\x9f\x03\xbb\x84\xdf\xee\xf4\x02\x7e\xb7\x0b\x89\x6e\x5e\x80\xe6\x58\x5c\xde\x7d\x77\x58\xb2\x6f\x7b\xbd\x10\xdf\xb5\x09\x29\x9e\x6b\xb0\x7e\x1a\x2e\xef\xbe\x6b\x96\xea\xdb\x7a\xd6\x28\x1c\xbb\x01\x63\xdc\x50\x4a\x5b\x49\x5f\x7f\xe9\xd4\xa4\x4b\xe4\x33\x5b\xd5\x79\x73\x46\xd4\xe2\xc4\x26\x74\x9e\x50\x7b\x9d\x1c\x3b\xd3\x05\x3f\xdc\x3c\x7c\xbc\x36\x39\xe0\x7b\x13\xda\x3e\xbe\x8c\x68\x9b\x15\xa1\x84\x00\x2b\x49\x18\x94\x78\x34\x1a\x9d\xd8\x87\x58\x9b\x3d\x0a\x17\xdc\x53\x32\xb9\x1a\x84\xd0\xb6\x5c\x59\x0d\x8d\x81\x30\x9a\x5a\x52\x47\x64\xde\x60\x58\x9e\xdc\xd4\x27\xc1\x82\xb2\x94\x19\xd0\xe2\x9e\xf6\x74\x4d\x01\xd1\xda\x47\xab\x05\xf4\x10\x51\xa0\xb8\x50\x5c\x8a\x6c\x91\xce\x54\x95\xdb\xec\xed\x4b\xf5\x38\x45\x21\xd7\x83\x76\xa7\xa6\xa2\xf7\xa3\xe2\x9b\x6c\x45\xa2\x7e\x7c\xb1\x14\xef\x1f\xef\x40\x93\x17\xd1\x83\xa6\x50\x4e\x1a\x68\x34\x45\x65\x94\xc0\x44\x9f\xab\x99\xb3\xb6\xf4\xfe\xe4\x4a\xa3\x76\xa0\x8a\xfa\x72\xe5\x36\x76\xf2\x39\xf3\xc8\x20\x66\x00\xb6\x52\x47\x5e\xda\x22\x38\x6a\x0a\x70\x90\x32\xee\x64\xdc\x60\x9e\x9d\xbf\x63\x9d\x9b\x54\xc9\xff\x59\xf6\xb7\x13\xbb\xd5\x67\x53\x89\x6f\xcf\xf1\x5b\x72\x80\xef\x1f\x5f\xa1\xdb\x57\x56\x4b\x9c\xb6\x29\x6a\xca\x62\xe6\x7d\x6a\x58\x72\xa9\xe9\x00\x9e\x76\x58\xe4\x1b\x61\x4c\xe0\x7d\x68\x36\xac\x73\x6a\xaf\x59\x6c\x59\x6e\xe2\x56\x18\x66\xdc\xac\xec\x95\x8a\x7b\x25\x62\xa3\x85\xe5\x18\x7a\xc2\x39\xb2\x10\xf3\x92\x30\x96\x70\x51\x40\x3c\xb3\x55\x93\xd7\x29\xff\xfe\x31\xcd\x72\x79\x05\xef\x27\x37\x37\xbf\xff\xc5\xf9\xfb\xcc\xa6\xfc\xde\x9f\x80\xbb\x6f\x1e\x1f\xde\xbd\x9d\x6a\x34\x57\x1b\xfb\x6e\x65\xa3\x84\x84\x53\x27\x34\xc6\x90\x43\x27\x6b\xa9\xb8\xe6\x9a\x0b\x74\x22\x8d\x0d\x33\x51\x84\xa2\x2d\xa1\x26\xe8\x29\x95\xad\x8a\x1c\x9d\xb6\x09\x20\x9a\x13\xd3\x59\xe5\x49\x67\x99\x14\x24\xee\x2d\x1b\x63\x9d\x0a\x64\xee\x39\x3b\xa8\x6e\xbb\xc7\x08\x23\x08\x19\x61\xad\x65\x71\xa3\x65\xb6\xcc\xba\xd9\x7e\x25\xae\xb8\x49\x7e\x27\xbb\x9f\x2a\x59\x17\x3e\x92\xbb\xab\xeb\x1a\x9d\xd3\xcd\xca\xe3\x7e\x66\x66\xf8\xb8\x71\x75\xd4\xd5\x92\x57\x51\x57\xa7\x5e\x73\x2d\xd4\x6c\x9b\x5e\x12\x37\x88\x88\x53\x25\x27\x44\x9b\x4a\x5e\xbe\xe2\xc2\x28\x29\xb8\xd0\x2a\xf5\xec\x83\xcd\x33\x5f\x91\xdc\x25\x8d\xf0\xcd\xf5\xfc\xc0\x9b\xbb\xc5\x34\x5b\xe6\x33\x33\x37\x11\xdf\xa0\x15\x09\x4f\xeb\x10\xe6\xf4\x69\x3d\xd3\x34\xf6\xa0\x8d\x6e\x53\xb1\xb6\x75\x6e\x23\xd6\x21\x36\xa0\x89\x1d\x02\x36\x77\xc7\x35\xa5\x33\x7a\xd2\x39\x29\x35\x62\x8a\x51\xc9\xa8\xad\x24\x53\x98\x2b\x5a\xea\xf4\x0c\x47\x9f\x2a\xe4\x55\xea\x17\x9d\xa6\x67\x7e\x3f\x9f\xf2\xee\x8f\xc1\xea\x1e\x7d\xd9\x14\xb0\x5c\x7d\xf5\x59\x4e\x25\xef\x5d\x59\x02\xc7\xa4\x5b\xfb\x4d\x10\x3e\x48\x7d\x40\x9b\xd3\x7a\xdf\x3d\x67\xb4\xf5\x0c\x53\x2a\xd6\x20\x33\x2c\xf6\x65\x29\x66\x87\xea\xa8\xaa\x2a\x39\x8d\x15\x82\xa5\x92\x14\x16\x40\x8c\x4a\x80\x22\x5f\xe8\x71\xb3\x95\x08\x22\x04\xa5\x74\x98\x95\x45\x81\x9f\xb3\x58\x13\x02\x54\x2f\xc6\x58\x7f\x4e\x56\x61\x69\x92\x5f\xf0\x52\xc7\xfd\x5c\x5c\xef\x7f\xe8\xd3\xfb\x00\x44\x05\x64\x6c\x1b\x27\xb5\xa9\x5c\x50\x4d\x88\xbb\x59\x05\xe8\x18\x0f\x0e\x55\xc7\xbb\xaa\x92\x5e\x39\xb5\x59\x96\x4a\x79\x25\xad\xe4\xeb\x8d\xe7\x8e\x7b\xaf\x94\xf7\xa4\x12\xf5\x61\xef\x94\xe3\x2e\xcb\x00\x50\xa3\xfd\xca\x6d\xea\x92\x7b\x99\xb3\x79\xc9\x06\xdc\x9c\xbb\x83\x3e\xbd\x62\x90\xef\x27\x48\xf1\xcd\xd7\xb3\xb5\xe8\x0f\xa0\x8b\x7c\xb6\x4f\x19\x2f\x96\x8b\x28\xa9\x5d\x8b\xa2\x28\x42\x69\xe3\x7a\x30\x83\x88\x58\x00\xab\x63\x2a\x69\x08\x06\xa9\x96\x52\x73\x1d\xb1\x81\x10\xc2\x52\xe1\x4a\x50\x56\xed\xa8\x43\x0e\xb4\x30\xcb\xb2\x1c\xc8\x67\xbc\xb2\xb9\xc9\x7e\x96\x76\xd4\x55\x75\xe2\x9c\x99\x4f\xf9\xe3\x9f\x01\xf0\x72\x4e\x57\x5f\xcf\x56\xec\xa9\x9c\x37\x4f\x72\xbe\x3b\xa2\xda\xc0\x7a\xe0\xb6\x70\xc6\xcc\x08\x37\x42\x18\xce\x43\x87\x22\xd9\xe7\x46\x33\xc5\xd5\x81\x52\xc7\x19\x03\xe2\x50\x1b\x0f\x30\xc0\x91\x49\x4a\xa4\xa2\x18\xbb\x02\xe0\x51\x77\xb1\x31\xe6\xcc\x87\xec\xab\xec\x6f\x9d\x63\xb4\x0c\xbc\xbb\xbd\x3c\x89\xf9\x99\x55\xfe\x9b\x0f\xe0\xc3\xb8\x8b\xbe\xbe\x7d\xf8\xac\x30\xf7\xf8\x3e\x55\x75\x52\x84\xe2\x30\xcc\xab\xd8\x57\xca\x62\x7a\xda\x9d\x1a\xb4\x1f\x05\x55\x95\x08\x6c\x05\x8f\x9c\x37\x40\xec\x02\x96\x16\x15\xae\x90\x7d\xa3\xa3\xf7\x3e\x86\x80\x62\x2b\x01\xcc\x07\x46\xad\xf3\x9c\x51\x5a\x1a\x66\x2c\x46\x71\x60\x84\xea\xa2\xee\x60\x49\x35\xa9\x05\x63\xdb\x58\x03\x71\xd0\x76\x74\x3d\x80\x7c\x36\xab\x2a\xa7\x89\x0f\xf4\xdd\xed\x0f\x16\x76\xbe\xf9\x30\xd7\x18\xe5\xf5\x49\xa6\x46\xb8\xfd\xb7\x7d\xde\xa5\x2a\xba\xcf\x2d\x84\x39\x25\xcc\x2b\xaf\x9d\xd3\x89\x0e\x21\x03\xc0\x3e\x8b\x95\xcb\xd1\x34\x2f\x6a\xb9\x78\x61\xb7\xb8\xb9\x7f\x7c\xe1\xb7\x58\x2e\x3e\xa0\x65\xe0\x87\x38\xe4\xf5\x69\xbb\x06\x9e\x44\xb6\xad\x86\xe8\x25\x08\xcd\x69\xc8\xab\x7d\xdc\xe3\x5c\xe4\xc8\x22\xa8\x9c\x25\x8e\x75\x71\x7f\xf0\xda\x4b\xe9\x64\x59\xf8\xf1\x1c\xf3\x67\xbd\x0a\x39\x79\xf1\x2e\x5e\x98\x05\x6e\xaf\xd0\x1d\xcb\x7a\xff\x6d\xb7\x0b\x33\x71\x6c\x2f\x57\x4e\x4e\xad\xb5\xb9\x58\xcb\xb8\x95\x71\x27\xd2\x8c\xab\x39\x5b\xae\x97\x3e\x2b\xaf\xe6\x01\xa2\xaf\xd3\x1c\xf5\xaf\x67\xdc\x23\x32\xe3\x91\x3d\xd5\x0c\xd8\xbc\xde\x9e\xe0\x10\x14\xe8\x96\x5e\x20\x68\xe2\x06\x57\x8a\x0b\x6c\xed\x18\xaf\xb7\xa0\x59\xe9\xa5\xcd\xde\x65\xff\x46\xf6\x67\x19\x4f\x7d\x0b\xff\x2c\xc5\x6b\xd7\x18\x9c\x44\x4d\x72\x3f\xcd\x90\x4a\xe0\x9d\x87\xc7\x55\x32\x0f\x37\xd3\x7e\xf9\x74\x7f\xfb\xee\x6a\x18\xd9\x19\xd4\x73\xf6\x1f\xd2\x30\xbd\xfb\xb7\x0f\x6f\xef\x52\x0f\x43\xe2\xd7\x79\xbc\x7f\x3b\x57\xae\x28\x73\x1f\x49\x1a\x01\xb7\x3e\x7a\x40\x0c\x97\xb6\xe2\x40\x08\x8e\x09\x39\x60\x4c\x05\x82\x71\x4d\x30\x23\x0c\x1d\xb4\x35\x92\x33\x26\x95\x60\x52\x79\x43\x94\x33\x06\x53\x42\x09\xdb\x1c\x36\xc3\xee\x84\xab\xf5\x1a\xd4\x51\x0d\xc3\xd2\x12\x04\xad\xd0\xf2\x84\xf2\x2d\x28\x9d\xe2\xcd\x51\x2b\x8c\x29\x1e\x30\x65\x04\x21\x90\x21\xc2\x18\x85\x94\x0b\x21\xa9\x94\x5c\x08\xc5\x0d\x15\x44\x4b\xc6\x10\xe1\x14\xcd\x4a\xbf\x89\x6c\xe3\xe7\x2e\xd6\x9b\xd3\x76\x38\x6d\x37\x9b\x2c\xcb\x56\x20\x3c\x8b\x95\x5a\xb8\x97\xee\x86\xff\x20\xfb\x8f\xb2\xbf\xc8\x32\x70\xf6\x77\x6f\x57\x93\xd9\xfc\xa2\xea\xb8\x5c\xdd\x5d\x79\x56\x77\x6f\xaf\x51\x3e\x77\x37\x97\x41\x7b\xe9\x02\xb7\x17\x7e\x82\xd7\xba\xf6\x6c\x8b\x30\x91\x9d\xb0\xb0\x2f\x4b\x8f\x4a\x60\xe3\x84\x6e\x19\x2f\x7b\x82\xa8\xc8\x35\x37\x4c\x40\xc9\x10\x3c\x6e\xe7\x52\x38\x2a\x91\x66\x18\x16\x4f\x35\x10\xa0\x3e\x43\xc1\x60\xdc\xc5\xda\x10\x1a\xb4\x1e\x80\xaf\x3c\x09\x21\xc2\xd9\xfe\x58\xe6\x2d\x10\x14\x9b\xb6\xc7\x0c\x41\x42\x68\x2a\x2f\x72\xcd\x8b\xad\x84\x06\x41\xb6\x8b\x83\x2b\x1d\xa4\x01\x0c\x79\x21\x44\xc3\x79\xc3\x79\xae\xb9\xe0\xa7\x03\xd0\x5a\x77\x27\x88\xb0\xa6\x28\xf6\x66\xe2\xd0\x98\xf3\xa5\x4d\xa8\x98\xd1\x77\xfb\xe5\x0b\x0e\xfd\x3e\x15\xef\xc7\x9f\xf7\x6f\x46\x0d\xf2\xf9\x78\x93\xd4\xf8\x01\x6e\xee\x6f\x7e\x27\x7f\xb8\xd1\x6d\x68\xdb\x2a\x0e\x3e\xb4\x4d\x5d\xcf\x28\x67\x54\x21\x8d\x71\x0b\xa5\xb7\x80\x34\xcd\x02\x03\x11\xdb\x10\xdb\x93\xb6\xb3\x12\x88\x63\x0d\xfc\x2c\x7c\xdb\x9e\xf1\xfd\x87\xa8\xe3\x20\x40\x07\x0e\xb3\x22\xa2\xf1\xaf\xfa\xb5\x07\xe3\xd9\x01\xbb\xac\x9d\xa3\x45\x9f\xfd\x56\xf2\xe7\xef\x13\xc3\xd1\x94\x66\xc8\x21\xd8\x37\x52\xc0\x7d\xdc\x20\xab\x9a\x45\x5f\x1d\x5b\x84\x83\x97\x0d\x42\xb3\x30\xfe\xb7\x9b\x67\x31\xef\x96\x2a\xa1\x24\xce\x6b\xba\xe6\x45\xfa\xe9\x9b\xfb\x9c\x6c\xc3\x76\x5b\x5b\x2d\x65\x50\xda\xf4\x6a\x3d\xdf\x03\x13\x83\xd7\x43\x1f\xfa\xea\x08\x67\x3a\x36\x6b\x07\x24\x38\x64\x79\x66\x67\x78\xd5\x24\xac\xfe\xdf\x3b\xdb\xc8\xf1\x5f\x9c\x1a\x63\x5e\xfd\xf6\x94\x46\x05\xe3\x09\x1a\xb5\xf0\x59\x09\x7f\x78\xfc\xa1\xb1\xbc\xf7\x8f\x77\x15\x20\x61\xb7\xeb\xa1\x36\xa3\x33\x83\x94\xe2\x71\x4b\x80\x88\xc3\x6c\x1f\x80\xa0\x84\x41\x07\x95\x72\xba\x18\x0a\xa2\xe4\xf8\x14\xad\x36\x4c\x4a\x21\x39\x2c\x0f\x20\x5b\xac\xdb\xd6\x2b\x62\x11\x74\x6a\x74\xcc\x05\xa1\x9e\x59\x40\xbb\xe8\x39\xaf\x51\x6d\x6c\xb3\x77\x8a\x71\x33\x7a\x2b\x3a\x61\xae\x31\x61\xc2\x67\xd9\x2c\xab\x67\x6c\xa5\x96\x3e\x7b\x77\xf6\xd9\x6f\x97\xab\xaf\xcf\x03\xcd\xa7\x03\xb2\x5c\xfd\xf2\x53\x82\x40\x7e\xfc\xe2\xe3\x8f\x9f\x3e\xa6\x59\x05\xc1\x6d\x76\x20\x1b\x70\x6c\xa2\xc4\xc1\x39\x0f\xb7\xde\x99\xca\x8f\xc7\xd9\x1d\x36\x87\x35\x8e\x6d\xd4\xb8\x0e\xa1\x82\xbb\xe0\x74\x53\x59\x7e\x0a\xcb\xfe\x5b\xb6\x38\x90\xb5\x45\xd8\x32\x64\xa9\x28\x0b\x63\x7b\xdc\xc8\x92\x11\xb2\x11\x25\xb2\x04\x5a\x36\x7e\x6a\x3a\x5c\xa9\xa2\x24\x11\xba\xac\xc8\xf4\x0c\xaf\xea\xa5\xcf\xee\xb3\xdf\x4f\x9c\x6b\xaf\xdd\x6c\x17\x85\xf6\xf6\x8b\xb1\xd0\xaf\x53\xf5\x3e\x2c\xee\x2e\x87\x3d\xb1\xb2\x8e\x8f\xee\x8a\xba\xe3\xc2\x60\x3c\x01\xed\xdf\x9e\xf1\x29\x00\x73\x22\x88\xa6\xd2\x7b\xcf\x34\x32\x92\xb1\xd2\x35\x62\xf0\x10\x3a\x21\x94\xf6\x60\x03\x4a\x08\x1d\x2e\x41\x71\x52\x79\xdf\x16\x6e\x3f\xe0\x8d\x6a\x29\x6e\xcd\x1a\x36\x60\x43\xb0\x86\xe4\x98\xa6\x9a\x27\xff\xfa\xc5\xc7\x5e\x8e\x3a\x8e\x31\xce\xab\xfd\x18\xdc\x40\x4a\x19\xd5\x5c\x09\x4b\xa0\xc0\x1a\x33\x85\x30\x22\x8c\x1a\xa8\xf4\xda\xc4\x43\x65\xfc\xba\xa9\x54\x00\x25\xc0\x64\x74\xfd\x36\x92\x48\xb2\x97\x63\x6c\x93\xf1\xfc\xb0\xf2\x4b\xfd\xd2\xd9\xf1\xf7\xaf\x76\xe7\xe7\x8c\x96\x97\x42\xd5\xdb\x94\xc6\xfc\x52\xd7\x9d\x6b\xe1\xd7\x3f\x0d\x40\x7e\xbb\xb5\x52\xb0\xd1\x10\xab\xb5\x7a\xce\xf2\xdd\x2c\x1c\x8d\xcb\xfd\xc9\x8e\xd7\x7e\x5e\x1f\xdb\x12\xce\x90\xf0\x98\x43\x85\x09\xaa\xf4\x20\x1b\x11\xcc\x5a\x56\xaa\x65\x82\xd5\xb4\x5f\x0c\x55\x65\xb9\x10\x46\xd0\xe8\x81\xed\x8c\x69\xb6\xa0\x88\xed\x9a\xd4\xb8\x95\x10\xee\x74\x69\x4a\x2c\x6a\x29\x99\x72\x5c\x62\x8e\xb1\xe2\x6c\x9a\xcd\xc6\xe7\x32\xcd\x1a\x9e\xa2\xa2\x7f\xef\x07\x3a\xf5\x6e\x57\x5f\x0c\x92\x7b\xe9\xd1\x7b\xfb\x78\xff\xf6\x92\x78\x7b\x73\x71\xfa\x27\x01\xa4\x61\x66\x49\x3c\x79\x51\x8d\x67\x1e\x34\x84\x19\x84\xe2\xbe\x2b\x7a\x24\x2a\xec\x4a\xb9\xa9\xd5\x5a\x06\x09\xe4\x5a\x8d\xee\x49\xa2\xdf\x0c\x76\xe0\x5b\x19\x0f\x80\x94\x71\x9f\x57\xcf\x59\x01\x58\xac\xab\x8a\x56\x4b\xcb\xad\x34\x72\x34\x88\x49\x13\xc3\x12\x8d\xbb\x9b\x70\x8c\x62\x17\x49\x74\x02\x28\xb0\xce\xab\x9d\xf1\x71\x1d\x7b\x6d\x4e\x38\x94\xae\xf4\x56\x18\x83\xb1\x2d\x09\x77\x32\x61\x02\xed\x0c\xae\xc2\x32\x9c\xa3\x69\x9e\xd6\x3c\x2e\x22\x65\x08\x52\xa9\xec\xab\xd5\xdd\x2b\xdd\xda\xdd\x65\x50\xe6\x37\xef\x1f\xef\x7e\x27\x4f\xe9\xf8\xd5\xdd\xdb\xfb\x7c\x75\xfb\xbb\xe0\x4a\xe5\xa4\x1e\xb4\x5f\x81\x4f\x77\xab\x77\x39\x8c\x3d\xc0\xc4\x97\x08\xe8\xd8\x95\xc0\x9d\xfa\x02\x1c\x0a\xed\x88\x84\x9a\x8a\x22\x7a\xbc\x91\x20\x2b\xe2\x1e\x74\x25\x48\x03\xe9\x41\xf0\x25\xcc\x8b\xba\x34\x06\x59\xc1\x0e\xc1\xb6\xb2\xd6\x8a\x23\xa4\x2b\x80\x29\x2e\xe2\xae\xe4\xf3\x0d\x50\x12\x43\x18\x6b\xa2\x20\xac\x55\xa1\x0b\x66\xa8\xa6\x41\xc1\x3d\x21\x82\x10\x80\x31\x21\xf6\x39\x33\xb4\x84\x65\xa0\x69\x86\x28\x93\x15\x86\xaa\x8a\x2d\xd1\x01\x37\xd9\x12\x74\xcf\x7c\xbe\x59\xaa\x54\x77\xbc\xc9\x6e\xb3\x3f\x4c\x73\xf9\xcf\x03\x92\xc6\x55\x7c\x78\xf7\x3a\x45\xf9\x75\xa6\xda\x45\x39\xfd\xe9\xb8\xfe\x34\x59\x6d\x8a\x57\x5e\x5a\xb0\xbf\xfe\x74\x37\x0f\x2c\xae\xa3\x27\xc0\x80\xcc\x12\x61\xc4\x66\x54\xb0\x34\x70\x62\x31\xcf\xb5\xa0\x0e\xed\xe2\x0e\x55\xc1\x39\x58\x49\xc7\x54\xa3\x5c\xd7\x83\xac\x84\x11\x03\xe8\x01\x8a\x43\xd9\x58\xa1\x03\x8f\x7b\x01\x28\x7c\xce\x96\xca\x51\xec\x90\x25\xb5\xa1\x5e\x08\x85\xb5\x28\x94\xe6\x5a\x47\xe2\x1b\x6a\x28\xb6\x3a\x20\x68\x54\x8d\x8c\x42\x86\xec\x3d\xc5\x38\x5a\xad\x3d\x97\xa3\x97\x14\x8c\x37\x7d\xf6\x9b\x19\x7f\xc6\xab\x76\xde\xa6\xf8\x79\xca\xa1\xf0\xe4\xdb\xfd\x8b\xec\xbf\xcd\xfe\x55\x66\xb3\xff\xf5\xb5\xca\xbc\x98\xf6\xc1\x74\x08\x5e\x52\x2c\x9f\x56\x69\xe6\xfd\xe3\xdd\xcd\xc3\xc7\xd5\x79\x22\xfc\xfb\xfb\x9b\x33\x1c\xef\x3c\xf8\x78\x0a\x08\x3e\x23\x53\x48\xbc\xa9\x3f\x03\xa3\xb7\x37\x7b\x78\xbc\x7f\xfb\xd5\xfb\x77\x6f\x57\xe5\x07\xf0\x19\x33\xf5\xdb\xd5\x1f\x7d\x00\x6a\x81\xbe\xdb\xd6\xa3\x0b\x02\x9c\x2b\x20\x28\xa2\x4e\x94\xf3\xeb\x82\x2b\x48\x20\x83\xa4\x20\x25\x66\xa4\x88\xc4\x27\x5c\xfb\x06\xe0\xbc\xec\x98\xa1\xa0\x2d\xcb\xa2\xb0\x05\x67\x8a\x1e\x33\xc6\x89\x80\x02\xe1\x75\x69\x8c\x09\x5d\x57\xf4\xdd\x22\x43\x1a\x1e\x77\xb2\x20\x02\x03\x0e\x0b\x59\x40\x0c\x65\x39\x6f\xe3\xc6\xf0\x01\x52\x1c\x2b\x22\x69\xdc\x59\xa8\x4a\x5a\x32\x82\x18\xa2\xb9\x63\x15\xa5\x8e\xd2\x26\x76\xd1\x74\xaa\x05\x0e\xd8\x63\x8b\x49\x87\x06\x8d\xe9\xcc\x1f\x1b\xc1\x4b\x57\xe0\xe1\x39\x6b\x4c\x03\x1c\x70\xf1\x50\x45\xe3\x05\xda\xf6\xbb\x02\x64\x75\x24\xd0\x28\xac\x24\x65\x90\xd1\x92\xab\x42\xd3\xc4\xc7\x8f\x9e\xf9\x62\xf4\xb3\xa7\xbe\x8f\x3f\x48\xf6\xe5\xcc\x43\x31\x3b\xb3\x4f\xcf\x46\xed\xf3\x3d\xd3\xbf\x5c\x7d\xf8\xf4\xf8\xf1\xd3\xdd\x9c\x11\xd4\x9f\x86\x01\x92\x04\x39\xac\x86\xa1\xce\x0b\xae\x92\x95\xe7\x94\x42\x42\x08\x17\x74\xe0\x34\xb6\x4b\xab\x8c\xf7\x92\x47\x1d\xb5\x6d\xa2\x0b\x52\x70\xea\x30\xda\x30\x5e\xf8\x02\x86\x12\x56\xa4\xa5\xe3\xf7\x02\x80\x3d\x0f\x33\x3b\xa3\xd3\x7c\xbb\x57\xfd\x7e\x95\xc0\x15\x1b\xbf\x5e\x2b\x29\xb4\xa7\x4a\x38\xd1\xe7\x4d\x08\x56\x0a\xa3\x5c\xac\x80\xf7\x4a\xbb\x4d\x36\x03\xec\x79\x3d\xe3\xb3\x09\xcf\xfe\xdb\x9f\x71\x2d\x8c\xf1\xf4\xea\xc3\xc7\xc7\x84\xb4\xbd\x19\xb7\xc3\x8c\x33\x86\x28\xa4\x10\xad\x21\xd3\xd2\x76\x5d\xd7\xcd\xca\x93\xe4\xac\xb0\x05\x56\x95\xe3\xdd\x00\xec\xce\xc6\xc6\xe2\xd4\x6b\x34\xb3\xc9\x47\xfa\x1b\x69\x5a\xde\xb9\xbf\xef\xcd\x67\xf5\xc4\xa9\x1e\xfa\x83\x34\xb3\x09\xbf\xba\x5c\x4d\x85\xe8\xc5\x79\xbf\xeb\x1c\x56\xa0\xad\x72\x7a\x5a\x9f\xd0\x69\x37\x57\x51\xe4\xde\x05\x2b\xeb\x5e\x78\xec\x0b\xb9\xf1\xfc\x08\x43\xa8\x1c\x05\x62\xdc\x74\x00\xe6\xf2\xd4\xa4\xfa\xda\x92\x13\x42\x88\x69\x1a\xc6\x18\xd7\x84\x9a\xd1\xa0\x53\x81\x3d\xa7\x0c\xc8\x48\x39\x86\x96\x0a\x5b\xc6\x41\xab\x54\x43\x37\x33\xbc\xf2\xcb\x2a\xfb\xed\xec\xef\x65\xff\x20\xfb\x87\x99\xcc\xfe\x93\xd4\x13\xfd\x1a\x6a\x2f\x5e\x5c\xa0\xd1\x15\xfd\xf8\xd2\xbe\xf7\xc5\x46\xf8\xcc\x59\x9a\x5e\x2e\xc3\x34\x7f\xac\x6f\x6f\xa6\x14\x09\x05\x8c\x43\x0c\xa8\xad\xe3\x1e\xae\x9d\x11\xce\x2a\x25\xdc\x3a\xee\xbb\xaa\x44\xf3\xc2\x10\x8f\x1a\xa6\x28\x81\x8c\xa1\x6e\x8d\xbd\x35\x16\x76\xd6\x72\xab\x85\x56\x7e\x73\x18\x1a\x84\x8e\x8d\x64\x8e\xc8\x39\x31\xdc\x71\xf5\xd4\x09\x62\x09\xcf\xb7\x96\x48\x2b\x8f\x95\x83\xda\xa9\x45\x65\x02\x19\x55\xb2\xe1\x1a\x69\x19\x90\xe1\x45\xc9\x04\xe9\x2a\x84\x30\x62\xae\x22\x12\x79\xc1\x0a\x53\x50\x85\x46\x6f\x0c\x16\x5a\x06\xac\x45\x59\x08\x49\x7b\x8f\x10\xc1\xcf\x19\x97\x44\xf2\x52\x2a\xaa\x05\xe1\x92\x4a\x81\x48\xc2\xf5\x21\x6f\x59\xe2\xf5\x00\xdd\x8c\xae\xaa\x45\x9b\xdd\x67\x0f\xa9\x9f\x28\x21\x7b\xa7\xc1\x3c\x5f\x4d\x43\x85\xcf\x14\xd5\x0f\x6f\x1f\x52\xb6\x7b\x12\xc9\xc5\xb8\x27\xfa\x85\x87\xaf\xae\x3a\xaa\x73\x8b\xd1\x1e\x97\xba\x28\xab\xd8\x94\xad\x89\xbd\xd8\x52\xc7\x7b\x13\xca\x22\x76\x1e\xc2\x99\x30\x45\x09\x1a\x48\x0d\x82\xb1\x45\x44\x8b\xc6\x15\x66\x27\xd7\x8a\x1f\x58\x67\x17\x2d\x1d\x43\x54\x8c\x35\x67\x6a\x1d\xa0\x82\x64\xad\xa8\xd0\x18\x11\x8c\xa0\x16\x0c\xd1\x31\x7e\x71\x9a\x12\x45\x2d\x93\xb6\x34\xa5\x99\x7a\x0e\xd5\x6c\xe2\xfe\x9d\xba\x67\x59\xc6\xaf\x3b\x1e\x6e\x5e\x68\xb5\xcf\xe9\xb2\x31\x76\xbe\xbd\x20\x29\x26\x8b\xfc\x5b\xe0\xfe\xdd\x17\x06\xf9\xf6\xdd\x6d\x6a\x8c\x77\x20\x54\x89\x4a\x53\xc4\xb6\x0f\xc2\xb9\xca\x0f\xb2\xaf\xe3\x01\xc8\x68\x86\xbe\x07\xb2\x03\x3e\x94\x30\x2f\x2d\xf2\x85\x1f\xf4\x50\xbb\x5e\x36\x56\x12\x84\x55\xa5\x88\x2f\x15\x8e\x7d\xb9\xa4\x9c\x6b\x1a\x0f\x05\xa5\x9a\x91\xaa\x0b\xca\x32\x0f\x0a\xba\xe5\x9c\x83\x71\x69\xd6\xd5\x8c\x58\x2a\x39\x35\x98\x72\x8e\xb1\x6e\xb8\x92\xda\x94\xd9\x32\x6b\x66\xeb\x95\x5d\x56\x2f\xf3\xc4\xa7\xa8\xe0\xb2\x8d\xef\x7e\x28\x58\xfe\x2c\x1a\x4e\xba\xf1\xe6\x7e\x16\x08\x15\x0d\x77\x65\x09\x30\x84\x1e\x43\x60\xa2\x4b\xcc\xe5\xe3\x55\x1f\x21\xe8\xcf\xe1\x30\x8d\xeb\x63\x48\xd9\xf4\xdd\x6e\x81\x18\x75\x6d\x8f\x31\x42\x18\x53\x6a\x98\x62\x8a\x6b\xd0\x32\x56\x33\xd6\x70\x0e\xf6\xa7\xc1\x01\x9a\x65\xf3\xc4\x23\x8c\x97\x2e\xfb\x1b\xd9\xcf\xb3\xdf\x4b\x78\x85\x49\xbc\x2f\xb2\x4d\x9d\x49\xd7\xbf\xa7\xef\xfd\x78\xf7\x47\x1f\x66\x3f\x7d\xf3\xe9\x0c\xbf\x49\x80\x97\xfc\x43\xde\x86\xa2\x04\x59\xcd\xb0\x27\x8c\x72\x1d\x22\xf3\x45\xb9\x6f\x29\xf1\x98\x10\xa6\x3d\xe8\x50\x01\xd4\x51\x80\x06\x19\x49\x85\x62\x15\x15\x5a\xc2\xe8\x22\x46\xa0\xa0\x72\xe9\x90\x14\x5e\x6b\xe1\xac\xd7\x7a\x07\x4a\x24\x84\xb7\x5e\x58\xe3\x8c\x3e\xc4\x46\x29\xef\xa5\x88\x4d\xdc\xc7\x75\x09\x32\x20\x48\xdc\xef\x4a\x14\x0c\xaf\x31\xc0\xfb\x6c\x99\xf1\x67\x36\x2f\x96\xf8\x5c\xcb\x1a\xf7\xd6\xc3\x99\xa3\xec\xd2\x88\x3d\x41\xa3\x6e\x2e\x39\xc7\x33\xc8\x7e\x5c\xd4\xcb\x78\xa8\x31\xa0\xec\x67\xf4\xb8\xae\x46\x81\xa6\xab\x39\xb1\x7c\x1d\x21\xa5\xc8\x68\x2e\x74\xd0\x9b\x51\x2f\xe6\x50\x71\x29\xa8\xd3\xad\xc1\x58\x2e\xf1\x69\x0b\x84\x8c\x83\x8a\x6b\x1f\xd7\x36\x06\x88\x0c\x27\x1c\x6c\x54\xdc\xb6\xb4\x01\x24\x97\xdb\xd1\x61\x63\x44\x2b\x31\x74\x1c\x93\xf4\x0c\xc4\xf9\x19\x4c\x67\xe1\x97\x97\xfa\xd5\xdd\xeb\x83\xb8\xbf\x70\xcf\x7f\xba\xbf\x79\xf8\x38\xbb\x34\x44\x9d\x0d\x57\x1a\x5a\xb5\xad\x21\x06\x3a\x0e\x10\x82\x75\xab\x95\xb5\x4d\xe5\x06\x59\x89\x35\xc0\xf4\xd0\x13\x09\xea\xa8\xc6\x4b\x1f\xea\xdd\xae\x3e\x2c\x1d\x62\xf4\x64\x39\x0d\x4a\xdb\xba\xde\x58\xab\x6c\x70\xb9\x17\xb1\xf1\xd1\xfa\xe3\xba\xeb\xc2\xb8\xcb\x52\x4c\xf4\xcc\xe7\x34\x71\x36\x7c\x4c\x9d\x8c\x7f\xff\xcc\xe1\xfb\x05\xcd\xf4\x22\x81\x3e\x3f\x9c\x49\xf1\xae\xdb\xa4\x5e\x06\xb3\xde\xde\x7d\xf3\x61\x79\xdd\xc7\x15\xfa\x70\x08\x6d\x1b\x0e\xa1\x07\x75\xc0\xfb\x56\xc9\x61\x3c\xb6\xc2\x52\x0c\x29\x23\x63\x84\xb3\xe6\x52\x03\x0e\x41\x63\x3d\xdd\x58\x63\x8c\xcf\xb5\xe5\x96\xd9\xc5\x7a\xb4\xa0\xbe\x69\x9a\x46\x61\xee\x3b\x23\x65\xeb\xa3\x96\x02\x39\xc8\x80\xf5\xed\x18\x07\x6e\xbd\x15\xe2\xe4\xf8\xce\xab\xa6\xad\x1a\xde\x84\x6c\xc2\x1e\xf1\xb9\x4b\xb6\xf5\xf6\xdc\x69\x3e\x59\xa8\xcf\xfa\xae\x92\xe5\x7c\x3b\x95\x11\xc0\xf8\x72\xf7\x43\xde\xe2\xc7\x4f\xd3\x43\xfa\x74\xed\x2e\x7e\x1f\x52\x67\xc0\xda\xa5\x87\x60\x8e\x15\xb0\x91\xce\x36\xf6\x44\x2c\x90\x7d\x5e\xc7\xae\x2c\x41\x7d\xb2\xb3\xf2\xb8\xcf\xd7\x85\x34\x58\x42\x8d\x11\x2a\x1c\x86\x1a\x62\x72\x3a\x6c\xa0\x9e\xb6\xe2\x73\x96\x50\x76\x71\x6d\xa8\x14\x1c\x94\xb4\x34\x25\x59\x22\x29\x35\x37\x86\x1f\x0e\xa1\x02\x59\x1c\xac\x45\x38\x6a\xa2\x49\xdc\x3a\x68\x4a\x12\xe8\xa8\x88\x51\xbe\xc6\x9e\xd2\x8a\xd2\x08\x85\x22\x5a\x20\xee\xb9\x92\x52\x1b\x64\x13\x67\xd9\xcc\xaf\xf4\xd2\x4f\x11\xc2\x14\xd2\x7e\x4c\x01\xc0\x72\xf5\x7e\xea\xca\x7d\x4d\x5c\x5c\xee\x5d\xba\x1a\xaf\x6f\x3d\x9e\xd5\xdb\xc7\x85\x68\x25\xe8\xa3\x17\xda\x69\xeb\x9c\x83\x1b\x20\x89\xd1\xcc\xe2\xb3\x5d\x1e\x23\x03\x73\xa2\xdc\x8c\xf7\xf7\xf1\x00\x14\x84\xdf\xbb\x1f\x5b\xd0\x61\x52\x71\x02\xf6\x7c\xe9\xa9\x70\x82\x16\x50\x10\xc5\x4b\x8d\x28\x35\x76\x72\x3c\x64\x59\x68\x36\xba\x52\x50\x90\xd6\x20\x04\xbf\xb8\xe3\x08\x22\x94\xf3\x2c\x2b\x66\xe6\xcc\x8f\xf5\xd7\xce\x9a\xf9\x21\x71\xf6\x5d\xad\xfa\xc3\xc7\x9f\x83\x1f\x7e\xd2\x77\xe7\xe3\xf7\x3b\xe0\xf3\xce\xdc\xeb\xb1\x33\x73\x1b\x48\xee\x4e\x98\x09\xd3\x1c\x42\x89\x40\x73\x52\xe9\xc9\xee\x4b\xe5\x10\x87\x12\x61\x5c\x9e\xe0\x1e\xfb\xc4\x65\x53\x1a\x86\x34\xa2\x11\xda\x52\x3a\x09\xd6\xe3\xf3\x25\x0c\x17\xa6\x44\x4b\x4b\x74\xd0\x42\x36\x0a\x71\x76\xda\x4b\x23\xa3\xaf\xa1\x2d\xf9\x7e\x16\x44\xdc\x98\x8d\xd6\xa7\x4a\x28\xa6\x24\x44\x4d\xc5\x42\x30\x8e\x78\x0d\x5d\x40\x95\xcb\x66\xb3\xfa\x59\x2f\xf0\xd9\x7f\xbc\x7d\xe9\xb7\x4e\xfa\xef\x3e\xcd\x38\xb9\x49\x19\xc9\x79\xe1\x4b\xd8\x3d\x67\xa0\x88\x07\xc7\x21\x72\xce\xb9\xa5\x45\x5a\x9e\xfa\xcd\xc9\xf8\x25\x31\xa7\x0d\xa0\x4f\x12\x84\x6c\x91\xe9\x7c\x93\xf8\xb9\x7e\x37\xfb\xbb\x19\x4b\xa7\x26\x03\x2f\xd6\x6c\xf5\x59\x7e\x77\x42\xc7\xdf\xaf\x5e\xdd\xbd\xcf\x9d\xb8\xf7\x97\x4c\xf9\x2a\xc5\x44\xf7\x93\xdf\x16\x40\x87\x70\xa0\x18\xd4\x27\x57\xe4\x58\x55\xda\xc3\xa0\x19\x2e\xa2\x46\xcf\x99\xa9\x4c\xb1\x37\x82\x9a\xb2\x8c\x9b\xd8\xa1\xca\x1d\x60\x6f\x9c\x70\x46\x32\xe2\x9a\x35\x20\x10\x31\x0a\x35\x22\x1a\xda\x62\x67\xa0\x30\x62\x71\xa0\x98\x70\x6e\x75\x6c\x02\xf2\x88\x36\x9b\xa0\xf9\x66\x4d\x6c\x45\x30\x22\xd0\x30\x49\x8c\xe9\x50\x50\x25\xa4\x0c\x0f\x9e\x10\xb2\xe7\x12\x49\x5e\x28\x55\x6a\x01\x83\x49\xfe\xd7\x22\xb3\x33\xbb\x92\x67\x79\x7e\x98\xea\xde\x6f\xee\xce\x78\xb6\xb3\xdf\x32\xa1\x92\x3e\x23\x48\x3e\x9b\x97\x49\x65\xbf\xed\x01\x8d\x0e\x38\x97\xfc\x13\x72\x82\x01\x0c\x91\x2c\x0b\x29\x99\x82\x8a\xd2\x88\xa0\x37\x21\x7d\x38\x5e\x0b\xa6\xac\x52\x56\xc5\x5a\x07\x50\x9d\xd6\x42\x16\xae\x94\xb8\xb2\xc6\x82\x02\x14\x3d\x8f\x07\x49\xcf\x73\x93\xc5\x6c\xb7\x34\xd9\x6f\x66\x6f\xb2\x9f\x25\x5e\xb1\x97\x9a\x6d\x7a\x3c\x3f\x07\xd3\x0e\x4d\x14\xb6\xb3\xbb\xf3\x2c\xa5\x0b\xdf\xfc\x32\x51\xe7\x9c\xa7\x26\xed\xc2\xa9\x0b\x40\x23\x5c\x53\x44\xac\x55\xba\xda\x7a\x19\x7c\xd5\x4e\x93\xe7\x6d\x74\xc5\xba\xd1\xa1\x62\x71\x67\x01\xc1\xb1\xcf\xbb\x14\xf2\x2f\xba\xd8\xf5\x03\x90\x9c\x11\xa1\x37\xae\xd1\x75\xcd\xe8\x73\xd6\x89\x2e\x2a\x1b\x82\x0d\x25\xf4\xad\x6b\xec\xae\x0f\x0d\x20\xc0\x73\xc9\xa5\x98\xe6\x4d\xf2\x79\xb1\x34\xd9\x9b\x84\xb0\xfd\x9e\x5d\x79\x7c\x98\x9d\x11\x04\x67\x4f\xf6\x73\xb8\xc6\x84\xc1\x3d\xeb\x9c\x8f\x9f\xee\x80\x70\x5b\xb7\xd9\xb8\xad\xdb\xed\xea\x59\x69\x6b\x42\x20\x28\x8d\xd4\x8c\x35\xc2\x28\x81\x94\x44\x50\xaf\x4d\xaf\xe3\x00\x76\xce\x4b\xc1\x8d\x3c\x75\x4b\xe3\x9c\xf3\x21\x84\xe0\x63\x65\x9d\x46\x18\xf9\xb5\xd2\xc2\x9c\x36\x46\xa2\x0a\x23\x0a\xfa\xb8\xe9\x4d\x07\x0a\xaf\x85\xc2\x84\x8a\x51\xee\x55\x9a\x6d\xf7\xff\x31\xe7\x5f\x4d\x39\xff\x4d\x18\x5f\xaa\x99\x78\xc9\xf9\x23\xe7\xea\x1f\xcd\xf9\x9b\x6f\x87\x73\xce\x7f\x17\x7d\xec\x05\xa8\xf3\x2c\x3f\x44\x3a\xba\x82\x7e\xf0\xa3\xed\x5e\xcd\xba\xac\x4c\xfc\xea\xaf\xbd\xd6\x8f\x2f\x5e\xde\xf7\xf5\xdb\x9b\xef\xe9\xb7\x2f\xb0\xe1\xe3\x41\x5d\xc0\x06\x42\x10\x4e\x5d\x5e\x9d\x74\xde\x96\xca\x11\x05\x0d\x21\x08\x9e\x44\x03\x09\xe8\x22\x07\x1d\x4a\x6a\x8c\xd2\xd2\x40\x1c\x7b\x4b\x98\xe5\x00\x13\x8b\x96\x16\x31\x72\x1a\x84\x95\x91\xf6\xa5\x2b\x35\x20\xb3\x9e\xc7\x8d\x1e\x75\x99\x52\x86\x58\x59\x26\xfd\x05\xf1\xa6\x62\x6d\x08\x75\xd9\xd9\x6c\x96\xa9\x99\x4d\xbc\xea\x5f\x9d\xf7\x76\x8a\x63\xae\x2a\x6f\x8b\x0f\x1f\x7f\x7a\x29\x72\xff\x00\x32\xe1\x9c\xec\x5a\xe8\x00\x09\x92\xd4\x73\xeb\x8c\x6d\x6a\x1e\x37\x72\x53\x45\xc4\x42\x0d\x78\xdc\xd7\x56\x38\x17\xdc\x5a\xee\xab\xd8\x00\x13\x77\x04\xf8\x9c\x3a\xa4\xad\x5e\xda\xca\x50\x62\x2c\xae\x9d\xe3\xda\x6d\x06\x67\x15\xc8\x00\xb2\xb0\x34\x76\xdc\x41\xfc\xb0\x36\xca\xe8\x60\x15\x72\x50\xa0\xda\x53\x3f\xfa\x76\xf4\x59\xa6\xfd\xf1\x2e\x4d\x96\x78\xfc\xd1\xea\x09\xb8\x22\x6b\x4e\x43\xd7\xee\x1e\x56\x77\xbf\xf8\xe6\x65\x94\xdf\x7e\x1f\xb6\xdb\xda\x68\x21\x83\x30\x76\xcb\x36\x79\xc6\xb0\x26\xec\xd4\x09\x5c\x61\xc1\x01\xa1\x3d\x40\x07\x1e\xfb\xbe\x67\x52\x11\xd2\xd7\xd3\xa6\xf1\x66\xb3\x0e\x7d\x7d\xdc\xe4\x4d\xdc\x77\x06\x68\xd0\x82\x46\x69\x62\x24\xf4\x0d\x6d\x7d\xcc\x8e\x1b\xc5\x6b\xed\xac\x15\xac\xc9\x9b\x89\x0f\x66\xd6\x5f\xe5\x0c\x3f\x9e\x33\x86\x68\x9a\xbd\xfa\xe1\x6a\x5f\x4c\xb3\x71\xef\x1e\xef\x3e\xfe\x09\x78\x51\x84\x49\xb3\x4c\x0d\x40\x52\xc4\x75\xe4\x04\x18\x40\x03\x57\x56\xed\x19\x71\x98\x5b\x41\x1d\x51\x20\xe8\xbd\x04\x25\x8d\x03\xe0\x45\xdc\x02\x54\x8d\x16\xa8\x00\x22\xd6\x45\xe3\xb5\x5d\x2a\xa7\x60\x50\x24\x1e\x5a\xb6\xa9\x53\xab\x0d\x0a\x0d\xaf\xc3\x53\xbf\xb7\xa1\x02\x85\xe7\x82\x79\xef\x7d\xc5\x3c\x73\xb5\xab\x2f\xbe\xaa\x58\x8a\xe4\x4b\x7f\xcc\xfe\xee\x84\x2c\x2d\x57\xaf\xec\x21\x09\x36\x73\x7d\x14\xff\x16\xb8\x7f\xf7\x43\x87\xf3\x62\x1e\xdf\xe6\x7b\xc0\x09\x97\x88\x70\xa9\x10\x17\x0e\xf4\x9c\x63\x81\x04\xc2\x6d\x57\x36\x22\xf6\x42\x40\x88\x31\x24\xae\x94\x5a\x3a\x6b\xad\x9d\xe9\xe8\x77\xb5\x64\x5e\x99\x50\x57\xfe\x84\x56\x45\x24\x42\x96\xa1\x24\x80\x1c\x4b\x50\xb8\xd9\xee\xdb\xbd\x52\x85\x2f\x46\xa7\xdc\xc4\x8d\x01\x34\x6f\xf2\x36\x42\xa0\x8f\x1d\x50\x26\x4b\xf5\x44\x35\xcf\x96\xe8\xbc\x77\x12\x97\xe7\x9b\x09\xb7\x71\xf7\xcb\x89\x1d\xed\xfe\x42\xf5\x7a\x4d\xf5\x7d\x46\xf2\x5f\xf2\x40\xb3\xf4\xd0\xfa\x7c\x38\xad\x19\xc8\x2a\x5c\x54\x90\xa0\x43\xac\x6d\x4e\x4f\x6b\x50\x29\xe6\x88\x04\x46\x53\x4b\x55\xb4\x01\x31\x81\x42\xc1\xba\x4a\x36\x0e\x72\xcb\x97\x28\x16\x7b\x5c\xd2\x8a\xae\x29\x61\x06\x54\xbb\x63\x1b\x6a\xde\x84\x62\xf4\xa5\x2b\x14\x19\x82\xa4\x49\x61\x3f\x18\x50\xdc\xef\xd9\x3e\xe5\xd7\x9a\x67\x31\x47\xa9\x5e\x98\xff\x21\xf9\xb1\x3d\x3f\x6c\xc3\x76\xeb\x94\x62\x2c\x70\xa9\x1b\x31\x9c\x2b\x86\xae\xef\x43\x1b\x8e\x74\x86\xe2\xae\x77\x40\x83\x69\x96\xaf\x9e\x6d\x57\x6c\x69\xb3\x9f\xa4\x59\x29\x17\x5c\xe5\xcd\xfd\x2b\xb8\xe5\x05\x0e\x91\x66\x8d\x51\x46\x25\xc8\x82\xa5\xba\x5a\x40\xd5\x6f\xd3\x2c\x98\xec\xc9\x81\xdd\x69\x93\xe3\x76\xcf\xf3\x6a\xbe\xa1\xc8\xb4\x1b\xae\x75\x74\xb9\x37\x18\x1a\x2b\xad\x95\x56\xc1\x52\xb3\xf1\xfc\xca\x99\x5b\x1e\x96\x2e\x7b\x7b\xd6\xa0\x57\xbc\x96\x67\x2a\xd2\xf7\x63\x5c\x36\xd1\x78\x5f\x7a\x96\xc0\x3e\x50\xd0\x4b\x63\xb5\xd4\xcd\x2e\x0e\x7c\xdf\xc5\x8d\xdd\x02\x02\x32\x2d\x62\x8d\x50\xde\x8c\xba\xb3\x1e\x83\xf8\xa5\x2b\x9d\x37\x12\x13\x4b\xa8\xa3\x0e\x0b\x59\xf9\xb8\xe5\x82\xe0\x7d\x2c\xfd\xf6\xba\x6e\xfb\x9b\x9f\xd5\x6d\xbf\x28\xdb\x6e\xdb\xab\xaa\x2d\x9b\x85\xa4\x33\xd5\x0a\x2d\x6d\xf6\x1b\x89\xa3\x61\xd4\x3c\x9f\x0d\xba\xbf\x9b\xd0\x13\x5f\xbf\xff\x0c\x54\x7e\xf7\xfe\xe1\xe6\x7e\xe9\x2b\x3e\x11\xd4\xb2\xef\xb2\x39\x39\x35\x2c\x47\xf1\x70\x72\x32\xc7\x20\x8b\xb8\x84\x94\x28\xca\x30\x91\x83\x8b\xc3\x3c\x84\xb0\xb4\xa7\x41\x89\xd2\x97\x1c\xec\x9c\x4a\xc4\xfb\x6c\x0b\x4b\x88\x55\xca\x04\x99\x1a\x45\x9b\xfa\xcd\xf4\xb3\x98\xab\xa5\x9d\xd0\x5c\x17\xce\xfd\x9f\xbe\x19\xad\xfc\xb8\x47\xf2\xd5\x4b\x0e\xfe\xa7\x63\x6c\x0e\x3e\x7c\xfc\xf4\xbd\x5e\x9f\xbc\xf0\x75\x6f\x14\xb5\x18\x89\x22\x04\x7f\x28\x18\x09\x94\x97\x82\xb2\x92\x9a\xd8\x1a\x49\x61\xb7\xc1\xb5\xb7\x0e\x35\xba\xd2\xb5\xe2\x78\xae\x48\x84\x71\x8f\xb1\xa7\x4a\x83\x32\xcf\x0a\x07\x54\xac\x9f\x42\x57\x41\x0f\x47\x2b\x84\xca\x23\x8b\xde\x28\xaf\x15\x75\x1b\x20\x61\x19\x40\x01\x3a\x1c\xd5\xbe\x28\x47\x5b\x0a\xec\xb3\x58\x1c\x16\xea\x8c\x8c\xbd\xc4\x0d\x97\x49\xf3\x3f\x18\x2d\xdc\x7d\x7c\xbc\xbb\x3d\x87\x84\x3f\x66\x4f\xf3\x6c\xb6\x8e\xb4\x80\xa0\x3a\xb1\x19\x3a\x6e\x67\xac\xd4\x8e\x08\xa4\x31\x45\xf0\xb8\x06\x08\xc5\xaa\x9b\x66\x19\x31\x3e\x7e\x2a\x08\x72\x90\x44\xeb\xa0\xf2\x0a\x48\xec\xf1\x42\x79\x8c\x63\x29\xb4\x88\xa6\x85\xae\x14\xfb\x99\xe1\x45\x2f\x44\x27\xe5\xa9\x91\x63\x84\x80\x8c\x47\xde\x40\xd4\xd7\xbc\x0a\xbe\x2e\x5b\x9b\x70\x1d\xdd\xb3\x58\x85\x45\x9b\x66\xf3\xdc\xbd\xac\x2a\xed\xf2\xcf\x17\x74\x9b\xbc\x83\xbb\x97\x00\xf7\x7a\x35\x77\x57\xab\x99\x67\x0d\xc9\xe9\x91\xcf\xab\x27\x3d\x37\xa5\xab\xa8\x83\x3d\x27\xe8\xa9\x02\x0a\xef\xd3\xfa\x90\x12\xd8\x23\x1e\x38\xf4\x90\xc5\xd2\x23\x15\x34\x08\x34\x90\x45\x8b\xe5\x69\xcd\xad\x88\x74\x28\x43\xa1\x01\x9c\xad\x59\xa7\xf5\x56\xa9\x93\x49\xad\x60\x85\x0f\xb8\x76\x78\xd3\xf2\xb6\x6b\xfa\x72\x1d\xb2\x6c\x36\x73\xcf\xfd\x02\x2d\xea\x33\xbe\x28\xf9\xbd\xd3\xb4\x90\x49\x81\x2f\x50\x70\x21\x8c\x51\xcd\xa2\xfe\xce\xe8\x6e\xb1\x3d\x75\xa0\x7f\xda\x81\x21\x5b\x65\xf5\xb3\x5b\xd5\xf3\xd1\xa7\x7f\x7b\x96\xc1\x18\x13\x26\x2e\xc4\x69\xec\xfb\x94\x3f\x7d\xbf\x5c\xdd\x7d\xfc\x04\x1e\xef\xde\x7e\xb8\x7b\x7b\x37\xae\xff\xf6\xcc\x2f\xbc\x6c\xbe\xdb\x0b\x2e\x41\xb5\x76\xb0\xcc\x09\xa5\xa7\x9e\xb3\xbc\xa0\x04\xb0\x28\xea\xd1\xd7\x1f\xaf\x1a\xb4\x51\x1c\xf9\x2a\xfb\x36\xcb\x0f\x27\x9b\x17\x14\xd9\x0d\x28\xc6\x68\x8b\x53\xcb\x09\x65\xd1\xdb\x34\xa9\x68\x42\x89\xa5\xda\x89\x7c\x66\x29\x4e\x65\x67\x66\xd5\xd7\x8c\xef\x15\xd8\x76\x52\xa9\x77\xaf\x2c\x87\x9f\x5e\xf0\x74\x97\xa4\xd1\xf9\xcf\xc3\x37\x1f\x2e\xc4\x24\xdf\x7c\xb8\x5b\x5e\x1e\xe4\xbc\xa5\xa8\x63\xc8\x23\x02\xb2\xa8\x52\xf5\xb6\x1d\x4c\xe0\x8c\x3d\x67\x2d\xa7\x86\x0a\xad\xbb\x1d\x7d\xce\x9c\x41\x5d\xcd\x11\x92\x95\x1c\x40\x93\x7a\xd2\xf4\x0e\x61\xbc\x85\xd8\x11\xb8\x57\x3c\x6e\x29\x06\x7d\x64\xa0\x5f\x1a\xa9\xb5\x22\x92\x59\x69\x85\xab\x98\xc7\x24\x72\xcb\x39\x93\x5c\xeb\xbe\x21\x07\x8c\x0d\x27\x3c\x1f\x60\x69\x54\x70\x62\xfc\x6b\xfc\x68\x19\xc5\x5c\x4a\x67\x37\x9c\xb7\x42\x8c\x3a\x7f\xc6\xe6\x7e\x65\x13\x6f\xf2\xef\x9c\x75\xef\x6b\x2a\xf2\xfd\xe7\xbf\x2e\x76\x0e\x01\xb2\x21\xc8\x60\x4e\xa8\x73\x91\x3b\x04\x8a\x31\x9e\xc6\x14\x53\x6b\x96\x9e\x18\x4b\x19\x93\xc2\x2a\xd1\xef\x88\xb6\x9c\x8d\x5f\x48\x88\x6e\xea\x8b\x53\x99\x4c\xdc\x44\x8f\x97\x33\x7d\xf6\x30\xbf\x9a\xc2\xd4\x77\x6f\xbf\xe0\xd1\x7e\x01\x44\x5c\x54\xe7\xdc\xcd\xca\x38\x10\xce\xa9\xe2\xce\xda\x22\x18\x43\x59\x61\x1d\x17\x48\x0b\x42\x7d\x2b\x0f\xae\x28\x6d\x10\xb5\x83\x58\x19\xb5\x73\xb1\x5b\x96\x5e\xa9\xd1\x6b\x10\xbd\x81\xa5\x6b\x9c\x91\x94\x6d\x1b\x58\x43\x15\x64\x6d\xbc\xef\x38\xab\xa5\x17\x35\x25\x8a\x5b\xbf\xce\xe6\xd9\x3a\xdf\xaf\xaa\xa5\x4c\x31\xc7\xcf\xb2\x5f\x9d\xbd\x82\x2b\xa2\xbd\xc5\x87\x97\x6c\xe7\xa4\x9b\xde\xde\xbd\xfd\xea\x9a\x5e\x64\xfa\xba\x1f\x3e\x25\x62\xf8\xbb\x75\xde\x9f\x86\xae\x82\xd0\x1b\x1c\x8a\x72\x88\x3b\x16\x40\x13\x65\x22\xbf\xae\x67\x3c\x35\xfe\xe9\xb8\xd6\x02\x17\xb6\xe4\x75\x2d\xfc\x41\xed\x6c\xdc\x10\xe3\xf8\x01\x96\x51\x2e\x65\x2c\x7a\x8c\x11\x44\xd6\x62\x0c\x29\x61\xb9\xe0\xf1\xc0\x01\xb1\x4e\xda\x3d\xc1\x1a\xd5\x9c\xf2\x61\x70\xc6\xb6\xba\xa7\x56\xf8\x6c\x31\xdf\x3e\xf3\x55\xb7\xb4\x19\xcc\x7e\xf7\x45\x97\xa6\xcd\xfd\xd5\xe7\xf8\x9e\xa4\xff\x3f\x7e\xba\x5f\xbd\x9b\x7d\x0f\xaf\xff\x78\xf3\x19\x1f\xd6\x62\x9d\x40\xfb\x86\xda\xc0\x6b\xef\x6a\x5e\x69\x42\x20\x92\xa1\x97\x64\x20\xf4\x00\x8a\xb0\xdb\x09\xc3\x28\xe4\x9c\xc4\x43\x4e\x05\x74\x50\xc4\x26\x95\x73\xc6\xd8\x84\xba\xf2\x20\x04\x09\xd4\x68\x6a\xa8\xa4\x02\x23\xdd\xc7\x83\x0e\x5a\x9c\xf6\xde\xfb\xd3\x5e\x09\x18\x10\x03\x07\xd9\xf7\x78\xd3\x22\xbc\xad\xf8\xc4\x13\x9d\x67\xcf\x34\xd5\x3a\xff\x7a\xf6\xdb\x9f\x4d\xf5\x9e\xba\x74\x53\x64\x7b\x33\xfd\xb9\xbb\x4d\xd9\xc4\xa4\x5a\x1e\x6e\xee\x6e\x3e\x7c\xbc\x7d\xf8\x74\xbf\x9c\x7d\x49\x81\xfc\x23\x19\xa6\xdc\x04\xef\x9d\x3f\xc9\xa6\xce\xeb\x58\x23\x80\x20\xac\x4f\x5c\x35\x7a\x4b\x36\x90\x57\x15\x80\x21\xca\xf4\x22\x19\x31\x98\x9d\xf6\x86\x73\x25\xc0\x81\x40\x0b\x09\xc7\xa5\x85\x68\x59\x1e\x12\x6d\x47\x16\xdd\xd6\x39\xa6\x09\x1a\xdd\x41\x1d\xa4\xc0\xf1\x70\x19\xe6\xfd\x9c\x09\x99\x66\xb7\x04\x29\x95\x51\x06\x19\x5d\x2a\x8b\xad\xce\xb2\x59\x16\x66\xd9\xca\x2f\x5d\xf6\xb7\xa7\xf5\xbd\xf9\x62\x52\xda\xe7\xd8\xbf\x97\x60\x6c\x62\xaf\x9a\xaa\x0c\x9f\x3f\xe7\x17\x7a\xf0\x1e\xb0\x3a\xe9\x4d\x1e\x3b\x60\x22\x2c\x41\x2f\x03\x95\xd0\x12\x8a\x62\x25\x6a\xb9\xa6\xf1\x00\xcc\xd4\x88\x3c\x17\xa3\xe2\x85\x0e\x79\xd7\xaa\x36\x84\x8d\x5a\x7b\xc9\x99\x69\xa4\x34\x06\xc5\x66\x49\x39\xb7\x64\xfc\xb3\x96\x50\x43\x84\x47\xf7\xae\x1a\x7f\xef\x30\x25\xbe\x0d\x82\x39\xa1\xf5\xe8\x06\x0b\x25\xc4\x9a\x3b\xa5\xdd\x68\x1b\x67\xe8\x59\x9d\xe7\xa4\xbe\xce\x2b\xff\xb3\x7f\x9d\x69\xe5\x2f\x53\xb4\x7f\x31\x2e\xf2\xd3\xcd\xfd\xbc\x02\xd8\x27\x68\x62\x11\x0f\x80\xc5\xde\x27\x5a\xb6\x03\x28\xe2\xa6\xb5\x16\x64\x76\x34\x07\x20\xb3\x27\x2c\x90\xc3\x1c\x03\xc8\x7a\x40\x40\xc1\x62\x33\xf4\xbc\x56\xb5\x4b\xa4\x5d\xf6\x44\xac\xdf\x6c\xbc\xcd\x07\x1b\x55\x5d\xd7\x91\xd5\x75\x9d\x6f\xab\x9e\xac\xab\xd3\xfa\xb8\x15\xac\x56\x7a\x08\x21\x6f\x32\x30\xcb\x9e\xf9\x22\x5b\xda\x84\x21\xbe\x30\x51\x7d\x95\xaf\xae\x61\x4d\x6f\xee\x66\xb8\x45\xc4\x11\x5c\x19\xa2\xb8\xc2\x38\x50\x22\xb7\x2e\xae\x17\x4e\x4b\x6a\xbc\x2f\x62\x67\x05\xb7\x8c\x1c\xbb\x7c\x90\xd4\x1d\xc0\x61\xb4\xc1\xf4\x59\xcc\xb7\x4b\x73\xd6\x49\x57\xb9\xc6\xc9\x16\x4f\xd9\xc6\x37\x37\xf7\x37\xb3\xb5\x87\x78\x18\x1f\x9d\xaf\xbc\xc0\x65\x55\x55\xd5\xd2\x20\xab\x4f\x55\x7f\xe2\xb2\x5a\x22\x77\xaa\x80\x7e\x4a\x55\xae\xc4\x1d\x3c\x93\xcf\xbb\x45\xb6\xcc\x7e\xd4\xbe\x67\x21\xf8\x94\xb9\x59\x66\xdf\x51\xd9\x2c\xe1\xa9\x02\xdb\xa7\x1a\x1c\xb2\xf9\xac\x7c\x66\xab\x6e\xe9\xb2\xbf\x7e\x99\xe7\x00\x6e\x57\x09\xab\x36\x86\x20\x13\x16\xe1\xe6\xee\x27\xaf\xe3\x16\xdf\x9c\xa3\xbf\xfb\x34\x29\x23\x89\x66\x3a\x85\x4b\x12\x4a\x53\x69\xab\xb8\xd6\x3e\x56\x18\xae\x63\x0f\x50\x21\x2d\x65\x50\x50\x54\xc2\x22\x94\xad\x6d\xd4\x50\xe2\x5c\x05\xab\x9d\x47\xeb\xc6\x34\xfd\xd2\x61\x15\xb7\x9b\xaa\x3f\xc4\x43\x67\x00\x02\xde\xd7\x21\x6e\x8e\xeb\xe7\xac\xac\x4a\xd1\xe7\xd9\xa9\x8e\x95\x02\x2e\xa7\x40\x07\x6f\x8e\x6b\x1b\x5c\x63\x62\x5d\x6d\xdc\xae\xce\xb2\x6c\x71\xce\x57\x9b\xc4\x43\xf7\x7b\x89\x4f\x72\xaa\x24\x4e\xce\xc9\xf8\x04\xef\x1e\x52\x13\x44\x3a\x46\x9f\x92\xa6\x7c\x9f\x64\x73\xbb\xfa\xe6\xcd\x55\xe7\xc6\x1c\x63\xa2\x3a\xe9\x4b\x08\xa0\x63\x1e\x90\x9a\x98\x18\x82\x71\xd2\x2b\xea\x24\x69\x18\xce\xa1\xf7\x5b\xc9\x50\x15\x49\x55\x81\x21\x92\x39\x66\x54\x1d\x80\x86\x9c\x3b\x12\x2b\xe1\xea\xd6\x29\xab\x9c\x2c\xfd\x2e\x38\x13\xfd\x68\x1f\xf6\x5a\x9c\xea\x93\xb4\x36\x1f\xcd\x06\xcc\xc0\x8c\x3d\xf3\xc5\xb0\xd4\x67\x6c\xf9\xea\xe6\x0b\xfc\xdc\x4f\xdf\x8c\x0e\xff\xea\xc3\xd7\x0b\xcf\x8d\xdd\x6c\xbc\x52\x8c\x07\x64\x4c\xc7\xb6\xbb\x2d\x05\x6c\xa9\x3d\x86\xb1\xab\x74\x5d\x79\x6f\x8e\x5d\xbe\x75\xad\x01\x25\xe0\x15\xc0\x24\x90\x2c\xcb\x7e\x23\x97\xe7\x59\xf2\xdf\x64\x7f\xe7\x6a\x7e\xec\x9f\x9f\x39\x17\xff\x22\xcb\xc0\x04\x4d\xbe\x9a\x43\x70\x76\xe7\xee\x6e\xee\x6e\x5e\x60\x05\xa3\xc4\xee\x56\xef\x66\xcb\xd5\xdd\x27\xf0\xe5\xf9\x7d\xb8\xb9\xff\xfe\xc8\x85\xe9\xe7\x1c\x56\x6a\xef\x2a\x02\xf6\xaa\x5a\xef\x58\xdc\xee\x28\x43\x25\x04\x0a\x41\xc0\x8e\x5a\xf0\xe0\xa5\x96\x87\x4e\x1d\x82\x88\x9a\x68\x45\x30\xe0\x2c\x4d\xe3\xf5\xfb\x93\x4f\x2f\x4f\x4d\x08\xf3\x56\xd0\x0a\xf3\x53\xe1\x93\x3f\xef\x68\xca\xe9\x35\xac\x0c\x25\x9d\x6f\x8d\xa9\x0f\x48\xbb\xca\x70\xec\xa9\x46\x10\x41\xa8\x29\x3a\x6d\xc1\x9a\x5a\x11\x60\xe9\xb0\xa0\x50\x6a\x22\x23\x21\x48\xa4\xc1\xa9\x71\x50\x4a\xcd\xea\x27\xcc\x4c\xe0\xc1\x52\x54\x7b\xee\x8c\xb5\xc4\x5b\x68\x2d\xf6\x26\xfb\x6b\x99\xca\xd7\x89\xaf\xfe\x55\xb7\xfd\xe9\x59\x72\x7f\xa9\x7e\xbb\x7d\xa1\xa2\x7f\x2d\xc6\xa7\x96\xaf\xfb\x34\x34\xfa\x57\xe0\xe6\xf1\xeb\x49\x3a\x93\xcf\x34\xa5\xdd\xc0\x01\xd0\x69\xde\x76\x62\xbb\x8e\xeb\x49\xdd\xed\x00\x8c\xeb\xba\xaa\x00\x6a\x22\x4d\x2f\xf9\xc0\xdb\x3d\xe8\xeb\x10\x0a\x6f\x18\x03\xe8\x3b\x6f\x95\xd4\x06\x7b\xa3\x8c\x03\xa5\xf6\x8d\x4a\x0a\x5d\xb1\xa8\x98\xb6\x56\x33\x50\xb3\x2d\x63\x6c\x43\x29\x05\x3b\x4b\x91\xb7\x11\x82\x5d\x6c\x82\xe4\x03\x28\xb6\x08\x53\xa1\x25\xf5\x5c\x5a\xc3\xb7\xaa\xd5\x7a\x8c\x7b\x7e\x13\xd0\x67\xb6\x6a\x17\xe1\x65\xfd\x13\xbf\xc3\x7f\x9d\xfd\xcb\xec\x7f\xc8\x6c\xf6\xbf\x64\xff\xdb\xa8\x23\x53\x96\x7c\xd2\x94\xab\x87\xd4\x1c\x71\xb6\x55\xf7\xd7\xe0\xcf\x1f\x9d\xd2\x34\x15\x91\xee\x5f\xa8\x6b\x27\x82\xbe\x4f\xaf\xad\xbe\xd3\x60\xf8\xa9\x27\xf1\xf7\xc0\x32\xf5\x4d\x7e\xfc\x34\x1a\x8a\xc7\xd9\xa7\x0f\x9f\xee\x97\xf3\x6e\x57\xf8\x22\x20\xaa\x29\x96\x75\xdc\x32\x90\xa9\xce\xa0\xd6\xb4\x68\x7b\xc2\x79\x75\xd2\xee\xa5\x7f\x8f\x0b\x81\x70\x49\x21\x8a\xd8\xfb\xcb\xec\x9d\x21\x40\x34\xab\xac\x20\x12\x87\x0e\x51\x52\x91\x61\x4b\x51\x69\x60\x88\xfb\xd8\xcb\x30\x46\xf6\xd0\x45\xbc\x43\x2e\x79\x7b\xac\x00\xfd\xb1\x00\xae\x2c\xa2\xce\x49\x09\x36\xad\x2d\xb9\x41\xf3\x56\x39\xa7\x38\x63\x5c\x10\xbb\x0f\xd6\x6d\xbb\x5a\x87\xc3\xf8\x48\x07\xd2\x90\x2e\x36\x94\x16\xb2\xc0\x85\x01\xad\xa3\x2d\xa9\x30\xc6\xd1\x08\x49\x28\x2e\x25\x11\x3d\x2a\x8a\x42\x12\x47\x88\x6c\xe3\x81\x78\xdc\x82\x40\x37\x0c\x21\x36\x20\x34\xc6\x19\xa8\x24\x34\xf1\xa4\xcc\x36\x59\x93\x70\x21\xbf\x9f\x18\x82\xaf\xd0\xa9\xe7\x31\x12\x2f\x00\xd5\x2b\xaa\xbc\x33\x2e\xef\x9c\x77\xbf\xcc\xed\xbd\x7b\xbc\x34\x6b\x2c\xa4\x4b\x61\x4d\x85\xa9\xa2\xa7\xa1\x71\x6d\xd9\x43\xa6\x49\x61\xa1\xaa\xbd\x68\x94\x93\x00\x97\x4e\x38\x4e\x94\xb2\xeb\x13\x1c\x04\x16\x86\xa2\xa5\x53\x5a\x69\x23\x99\xf3\xa5\x14\xa5\x2e\x29\x2c\x21\x21\x92\x32\xce\x4a\x13\x87\x0d\x3f\x80\x02\x54\xa7\x66\x94\xf5\x96\x0a\xa3\xb9\x72\x4e\x13\xab\x39\x97\xd9\x62\xd6\x65\x6c\xd5\x2c\x4d\x46\x33\x91\xfd\xa3\xec\xbf\xcb\xfe\xd5\xb8\xa2\x4f\xe3\x96\xca\x67\x0f\x3f\xbd\x7d\x98\x2c\xf0\x55\x5b\xe2\xa7\xdb\xe5\xb9\x2b\xf1\x4f\xc1\x37\x1f\xee\xaf\x9c\xa3\xfb\x57\x02\xe4\x0b\x86\x24\x15\xd1\xfe\x06\xf8\xf8\xe9\xc3\xf2\xfd\x5f\x76\x73\xd6\x6f\x0a\x5f\x68\x5c\xf8\x02\x1b\x62\x08\xf4\xb1\x22\x90\x11\xcb\x25\x42\x45\xe9\x89\x61\xd2\x77\xd4\x31\xc3\x71\x28\x24\x17\x94\x62\x25\x4d\x39\x00\xc6\xa0\x2a\x5d\x40\x4a\x09\x09\x15\x35\x58\x48\x04\x35\xe3\x8a\x51\x84\xf3\x9e\x21\xfd\x72\x57\x32\x43\xf8\xeb\x5d\x92\x1f\x0c\xa5\xa0\xc8\xcd\x49\xac\x05\x65\xdc\x76\xa5\x50\xcc\x2b\xac\xe9\xda\x68\x6e\x08\x11\xae\x96\x42\x4a\x4e\x2b\x61\xd4\x3e\xc7\x26\x20\x4e\x91\xb4\x2d\x86\xda\x0e\xd8\x7b\xc4\x38\x6e\x6c\x28\x91\x14\xe6\x8b\x9b\xb5\xb9\xba\x99\xf8\x5a\x80\x1f\xed\xfc\x99\x53\xe0\x3f\xcd\xfe\x79\xf6\x5f\xa5\x93\xfc\x6b\xb1\x2f\xbc\xa0\x2e\x2e\x91\xd4\x87\x4b\xb5\xe9\xf5\xd4\xfe\xe2\x43\xa2\xf4\x3e\x1f\xdc\xbb\x34\x87\xe2\xf7\xc0\x57\xab\xbb\xc7\xe9\xdd\x72\x75\xf7\x38\xaf\x41\xe1\x01\xd9\xd8\x86\x77\xd6\xeb\x4e\x35\x2a\x9c\x08\xc8\xfc\xae\x93\xcc\x60\xe2\x85\x93\x5e\xaf\x73\x5e\x41\x98\x57\xf1\x40\xb0\x10\x25\x94\x12\x29\x58\xb5\x88\xe1\x06\x37\x07\x4e\xa0\x83\x2e\x86\x5d\x41\x69\x59\x47\x26\x81\xae\xa2\x03\x03\x8e\x15\xf0\x65\x11\x55\x8e\x0a\xb0\x39\x96\x80\xc1\x32\x56\xe0\x50\x94\x79\x39\xdf\x49\xe9\x14\x09\xc2\x6f\x0f\x5e\x1a\x2e\x9d\x10\x8e\x71\x4e\x70\xd7\x27\xc2\x9d\x78\xc0\x18\xc5\xff\x97\xb5\xb7\x87\x91\x65\xd7\xef\xc4\x8a\x55\xfd\x51\x57\xd2\x3e\xd5\xbc\xf3\xe6\x0e\xe5\xd5\x07\xc7\x73\xcf\x3d\x7c\xd6\x93\xc5\x7d\xa3\x39\x87\x0b\xad\xb4\x14\x56\xbb\xe2\x1a\x5e\x98\x5e\x63\x0d\xee\x0a\xf6\xd2\x58\x07\x74\x60\x98\x80\x61\x80\x80\x13\x86\x0c\x19\x56\x58\x61\x85\x15\x56\xd8\x61\x87\x15\x76\xd8\x61\x87\x1d\xf6\xbb\x67\x8a\x63\x14\xfb\x63\x7a\xce\x3d\xf7\x49\x81\xcf\x7b\xd5\xdd\xd3\xdd\xc0\xed\xaa\x22\xff\xdf\xbf\xdf\x2f\x33\xa8\x44\x93\x17\xd1\x88\x91\x4a\x31\x1d\x0f\xa8\x2c\x2b\x4d\x1d\x2f\x39\x03\x28\xae\x4d\x3d\x85\x25\xf4\x25\x23\x18\x13\x19\x77\x98\x10\x2c\xb3\x6f\x8a\x7d\x06\x97\x61\xc1\xde\x60\xc4\xcf\x0a\x46\x67\xb8\xd4\x99\xfd\xfc\xf1\xe9\xe1\x4c\x49\x74\xa6\xdc\x7f\x63\x26\xaf\x89\xf3\x8a\x7d\x51\xc7\x1d\xc8\x9e\x9b\x7d\xdc\xe7\x99\xd9\x2a\xb5\x35\xce\x1c\xbb\xe6\xac\x08\xd1\x73\x9b\x48\xbe\x48\xb4\x6b\x23\xa5\xd6\x39\xd5\xd4\x11\xb1\x60\xce\x46\x0e\x7a\x6b\xad\x8d\xab\x61\xfa\x17\x95\x97\x3e\x1e\x94\xa8\x02\x64\x7b\xc4\x6a\x29\xb5\xd1\x26\xb1\xfa\x66\x59\x31\x2b\x33\xb6\xd4\x0b\x97\x7d\x93\xfd\x61\xea\x5d\x9f\xa6\x99\xbe\xff\x30\xfd\xa0\x37\xa0\x92\xbb\x8f\xf3\x44\x58\x92\xe6\x70\xde\x24\x9c\x3f\x5e\x21\x0f\x37\xf7\x1f\x3f\xdd\xcf\x37\x18\xa6\xde\x9c\xad\xd0\xa0\x10\x63\x54\x30\xaa\x38\xe3\x9c\x51\xe6\x69\x64\x1e\xec\x7c\xec\xaa\x12\x78\x21\x13\xf1\x29\x8e\x1b\x82\xa4\xaa\xa0\xa6\x58\xc3\xd0\x60\x8c\xad\x07\xa8\x2a\xe3\x76\xe1\x98\xb0\x96\x92\x03\xe5\x9c\x52\xc5\xa9\xc2\x92\x70\x8a\xa5\x62\x30\x36\x40\x45\x4c\x69\x2c\x19\xaf\x74\x49\x80\xf2\xb4\x82\x04\x13\x5b\x13\x4e\xa0\x17\x76\x3c\xe4\x9e\xd2\x0c\xcc\xb2\x8c\x2e\xeb\x05\x3e\xd7\x34\xbe\x50\x5c\xbd\x49\x27\xf2\xf3\x77\xe9\xb4\x27\x1f\x7e\x79\xe3\xf8\xf7\xfd\xd3\xfd\x2c\x2b\xea\xe8\x81\x14\x92\x70\xa4\x09\xde\xe0\x0a\x56\x92\x62\x55\x56\x04\x85\x0d\x44\xc7\xbf\x20\x85\x1e\xa8\x68\x16\x38\x34\x9f\xf7\x47\x69\xf7\x42\x45\xac\x91\x56\x38\x1e\xe2\x9a\x68\x69\x48\x6c\x67\x65\x84\x58\x1b\x85\x27\xff\x43\x56\x01\xc5\x7a\xb6\x4a\xbc\x20\xb3\x19\xc9\xd4\x52\x2e\x70\x56\xa5\x48\x97\xbc\x99\xa6\x3d\x8a\xa0\x9c\x84\xca\x1f\xcf\x18\xfd\x77\x29\x4c\x3f\x52\xea\x4e\x26\x7f\x29\x95\x22\x0c\x49\x42\xa7\x64\x1d\x40\x82\x1c\x64\x6e\xdc\xd7\x14\x19\x44\x85\x6c\x4a\xe8\x60\xd9\xee\x57\x71\xb5\xc0\x9f\x33\xa9\xca\x50\xf2\xdc\x3f\x87\xf9\x3a\x12\x5b\x63\x51\x03\xc1\x52\x7e\x3b\x4a\x9b\xe6\x42\xed\x6e\x5a\x38\x8b\xe2\x90\xe1\xa5\x5b\xa8\xcb\xba\x7f\x9f\xfd\xe9\x69\x72\xf8\x5c\x92\x38\x31\xa6\xcd\x7f\x82\xb1\x7a\x56\xb9\x00\x70\xa8\xeb\xf6\xd9\xd6\x0e\x54\xd7\x34\xd5\x95\x33\xde\x04\xb0\x36\xdc\x31\x3d\x5f\x35\x4d\xd3\xf8\x91\x79\x9f\xaf\x9a\x26\xca\x10\x65\x13\x5b\xb6\xb5\xda\x75\xc6\x0a\x67\xb3\x6c\x56\xf4\x59\xb7\x54\x0b\x75\x55\xb1\x9c\xae\xcb\xd5\xb5\x78\xb8\xc8\x93\x4e\xe1\xf6\xb4\x27\x6f\x1e\x9f\x1e\x12\x00\x71\xeb\x21\xea\x20\x0a\x04\xae\x77\xfb\xfd\x7e\x0f\xb2\xb1\x42\x44\xf7\x40\xa5\x2d\xb4\x50\x58\x6b\x23\xb1\x71\x7e\xeb\x07\xbf\xf3\x05\xa2\xd4\x80\x6a\xbb\xdd\xc6\x76\x18\x57\xbb\x5d\x36\x9f\xc1\xcc\xa6\xdc\xf8\xcd\xd5\xb8\xb9\xff\xca\xe8\xc3\x23\x38\x71\x97\x5f\xcf\xcb\xcc\x7d\x0d\x2a\xce\xb8\xc2\x16\x93\x68\x2b\xe6\xf9\x01\xa0\x68\x81\x8f\x36\x28\xe6\xa8\xca\x0f\x4e\x2a\xa3\x17\x36\xaa\x67\x29\x44\x19\x2a\x52\xef\x2d\xed\x00\xce\x45\x1c\x9a\x26\xae\xdb\xb6\xd8\x1b\xcf\x9d\x65\xbc\x55\x2a\xed\xef\x7c\x06\x33\xb9\xb4\x0b\x93\xe1\xc4\x49\x7d\x7b\xff\xf3\x77\x89\x1a\xec\x82\x1e\x3b\xee\xd8\xbc\x78\x38\x0f\x00\xde\xdf\x3c\xfe\xe2\xee\x98\xe2\x2d\x75\xac\x4b\x26\x91\x27\x0d\x41\xa8\x72\x88\x73\xc9\x95\x35\x8d\xd6\xa8\x57\x8a\xba\x56\x01\x56\x97\x1d\xc7\x16\xb3\xb9\xf6\x71\x13\xf7\xeb\x2d\x8a\xab\xb8\x0f\x2d\xe9\x74\xeb\xad\x6e\x1a\xa0\x80\x7b\x3e\x10\x66\x94\x54\xc5\x0e\x94\xc1\x82\x52\x48\x9e\x70\xf5\x60\x56\x65\x36\xe5\x2c\x7f\xf4\xaa\x81\x73\x7b\xa6\xf5\xbd\x40\x8b\xa6\x68\x7b\xc6\x01\x49\xaa\xd9\x40\xc6\x83\x5f\x89\x95\x0f\xb2\x56\x41\xc5\x03\xd0\x71\x98\x5b\x90\xbd\x64\x61\x13\xe2\xd6\x35\x0d\x20\xa3\xce\xeb\x6d\xe3\xfc\x2e\x6c\x8e\xb5\x4c\x9d\xb9\xa5\x5d\xc8\xec\xe7\x47\x6c\xef\xcd\x6b\x8c\xfe\xf1\x0f\xc0\x77\xcb\x8c\x6f\xe2\x36\xc7\xeb\x30\x94\xda\x4a\xa0\x16\xd2\x49\xf2\x92\xf9\xe7\xbe\xe0\xd1\xf7\xda\xe7\x18\x40\x9c\x81\x19\xcd\xca\xa5\x4b\xfa\xec\x97\xdf\x7b\x73\x7f\xa9\x1a\x5c\x03\xf0\xd2\x9a\x9f\x51\x20\xeb\x14\xe9\x97\x9a\x1b\xa5\x95\x0a\xbd\xee\x7d\x08\xb4\x0d\x0a\x8f\xd3\x6a\x6f\x8f\x22\x3b\x21\x1e\x5c\x15\x0f\x46\x48\x2b\xc5\xda\x5b\xdf\x2a\xee\x84\xaa\x7d\x00\x65\x96\x67\x75\x11\x52\x8d\xf3\x3e\x55\xce\x52\x40\x7d\xfb\x8b\xe5\xfd\xed\xc3\xa9\xb8\xfd\x74\x22\x69\x3d\xd6\x30\x9f\xde\xbf\x7e\x23\x95\x3a\x3f\x7d\x51\xeb\x3c\x7f\x2f\x27\xd1\x17\x24\x6e\x4a\x20\xf6\x56\xa3\xb6\xe6\xa5\x8e\x1b\xb5\x53\x07\x62\x1c\xed\xaa\xc2\xc4\xb6\xc0\x71\x55\x4e\x17\x99\xab\xb2\x2c\x6d\x29\x6a\x27\xdd\x5a\x6d\xf9\x40\xa4\x23\x75\x35\xdf\x4e\x76\x19\xdb\x0e\x61\x4b\x31\x3f\xac\x9d\x55\x46\xd7\x9c\x11\x4c\xad\x65\x18\x5b\xcb\x60\x25\xb1\xe7\x4c\xc8\x46\x3a\xa5\xa6\x0f\x31\x9e\x72\x79\xb0\x79\x61\x4b\x51\xd8\xd3\x7c\xea\x2f\xd3\x2a\xbd\xa2\x9a\x78\x77\xff\x65\x7f\xfa\x3e\xcd\x77\xa7\x1c\xec\x71\x72\x32\x77\x60\x33\xb7\x3f\x78\x37\xd3\x9f\xeb\xa6\x20\xcf\x83\x7d\xc9\xea\xb9\x35\x9a\x0a\xa8\xc9\x14\x4b\xe3\x2e\x76\x75\xec\x36\x00\x61\x18\x77\xac\xb0\x9a\xc5\xad\x16\xb1\x8e\x22\xc7\x51\x70\x96\x5c\x06\x12\xd4\xb6\xad\x65\xdc\x27\x0e\xe2\x6d\x6e\x97\xe5\xc2\x66\xf3\xec\x0f\x2e\x7d\xa0\xec\xb5\x57\xf5\x0a\xfb\x39\xde\xed\xf7\x27\xd7\x78\x3d\x84\x7f\x9a\x7e\x2b\x27\xa3\x4b\xc1\xc1\xb5\xc3\x6e\x65\xd6\xdb\x55\x6c\x04\xc8\x0e\xc3\xce\xec\x86\xe1\x39\xab\x67\x87\xfa\x37\x9b\xd9\x9e\x21\x87\xd8\xf3\x9e\x22\x0f\x69\x6e\xd2\xd3\xc2\x4a\x8b\x8d\x82\xac\xeb\xea\xc6\x74\x4d\xe8\x9d\xe9\xbc\x13\xce\xd5\x74\x84\xf9\xee\xd9\xe7\x6b\x65\xb0\x95\x48\x1a\x62\x65\x3c\x08\x4d\x8c\x38\xf2\x7d\xc8\x97\x66\xe1\x66\x36\xfb\xcb\xc4\xfd\x2b\x4f\xfc\x02\x37\xf7\xb7\xa7\x4e\xf9\x91\xe0\xe0\x1a\x2e\x9f\xc0\xd9\x6f\xfe\x7e\x4a\x92\xcd\x77\x8b\xe5\xdd\x74\x6a\x93\xd5\xba\xb9\xbf\x49\x64\xae\x97\xd5\xfe\xe9\xfb\x0f\x0b\x11\x2d\xe8\x23\xdf\x91\xca\x55\x14\xc7\x6e\x90\x22\x2a\x40\x52\x43\x64\x0d\x5a\x71\xfc\x2b\x00\x93\xfe\x8a\x0a\x60\x81\x03\x94\x8a\x01\xf7\xdc\xe6\x12\xb0\x83\xc2\x88\x0b\x8c\x19\xc2\x18\x73\x41\x70\xb1\x3d\x98\xf1\x20\x2b\x8a\x35\xaa\x30\x33\x4e\x10\x41\x84\x03\xf8\xf4\xa2\x3d\x70\x81\x08\x6f\x9e\x37\x05\x16\x22\x6e\x62\x0f\x38\x61\x18\x63\x85\x30\x27\x08\x23\x4e\x31\x3c\xf2\xe1\x98\x17\xbb\x08\x45\x9d\xdd\x65\x7f\x7c\xaa\x87\xfc\x9b\xcb\x4c\xf7\xd7\xab\xad\x0f\x0b\x30\x6d\x9c\xc7\x44\x27\x73\x56\x19\xf8\x74\xf3\x90\xe4\xab\xdf\x9d\xb0\x2b\x37\x1f\x3f\x3d\x3d\xcc\x76\xae\x82\x40\xa8\x8a\x49\xa1\x19\xd3\x9d\x68\x95\x94\x54\xd5\x4c\x0a\x5c\xd5\xe8\x79\x03\xb6\xa8\x51\x1c\x12\xe2\x36\x7b\x68\x15\x08\x55\x15\xeb\x7a\xb7\xdb\xed\xac\xd9\x15\x35\x14\xdc\xac\x6b\x2e\x0c\x67\xad\xd6\xaa\x99\x1c\xc0\x4a\x53\x66\x6a\x0e\xb8\x82\xc2\x46\x51\xd9\xaa\x0c\x16\x23\x57\xe5\x99\xc5\x34\x0e\x32\xee\x54\x5c\x57\xf0\xc4\xcb\x68\x5e\xf8\xb2\x9d\xc1\xec\x9b\x2b\x6d\xa8\xbf\xbf\x8e\xe3\xe6\xf7\x27\xf5\xbc\x2f\xa6\xeb\xef\x8e\xfa\x37\x60\xca\x0d\x4f\x26\x64\xb1\xfc\xf0\xdd\xfb\x37\xac\xd8\x9f\x4e\xa4\x7c\x37\x27\x19\x92\xf9\x74\x81\x66\x16\xc3\xbc\xff\x8d\x28\x44\x59\x8d\x2c\xef\x7b\xd0\x87\xbc\x8b\x09\x8e\x94\x92\x66\x14\xf7\x53\x94\x09\x2a\x34\xae\xe2\xb6\x5f\x55\xeb\x06\x1d\xb6\x7c\x5d\x4b\xd0\x01\x35\x96\x39\x4a\x4c\x41\x59\x9e\xc5\xe0\x41\x13\x55\x41\xa6\x8c\x3d\x51\x6b\x70\xa0\xb5\xf7\x62\x06\x09\x95\x12\xc1\xd5\x9a\xd2\xf5\x9a\x4a\x26\xa8\x64\x9c\xa2\xd2\x54\x80\x70\xa2\x30\x51\x8c\x30\x47\xa0\xc1\x52\x52\xc1\x24\xe5\x94\xd2\xd8\x31\xe6\x69\x90\x69\x16\xed\x67\x49\xaf\xbc\x2e\x76\xd9\xef\x64\xb7\x89\x0d\xe9\xcf\x93\x56\xe5\xdf\x64\x7f\x97\xfd\x4f\xd9\x7f\x4a\xfc\x7d\xff\xe7\x71\x2d\x1c\x5b\x09\x1f\xdf\x7f\xf5\x65\x22\x5c\x7d\x4c\x83\x0d\xf3\x5f\xbf\xff\xe5\xf4\xfd\xf9\xf2\xf1\x69\xbe\x58\xde\x5f\x73\xcd\xbc\x7f\xbc\x40\xb2\x11\x78\xbc\x79\x7f\x37\xff\x70\x7e\xba\xfa\xd6\xa2\xb2\x4c\x48\x66\x85\xa1\x21\xca\x2f\x5e\x0b\x3e\xbd\xf6\xf5\x7c\xf7\x03\x0c\x01\xfa\x10\x0f\x08\x74\x18\x90\x67\x31\xc3\x30\xd4\xa0\x82\xfd\x58\x37\x6d\xee\x9f\x37\x8d\xa7\xa1\xc9\xbb\xc6\x33\xdf\x80\x10\x14\xa6\xa5\x85\x42\xbc\x64\x9f\x91\x07\xb6\x8a\x94\xe7\x26\x00\x0d\x23\x61\xd1\x77\x9e\x36\x4d\xde\xb5\x81\x85\xb6\xd8\x61\x8a\x11\x66\x53\x34\x27\x2e\x2f\x39\x7f\x7d\x77\x1d\x8d\x26\x15\x44\x94\x72\x84\x11\xc1\x2b\x8f\xa0\xc3\x58\x24\xba\x7a\x41\x11\xe9\x9a\x1a\xd5\x0a\x0c\xb1\x47\x9a\x52\x10\x4e\xcf\x15\x22\x9c\x20\x9e\x1e\xd3\x4c\x79\x78\x61\x4b\x55\x1c\xb2\x7f\x72\xe9\xfe\x9c\xbb\x5a\xd3\xea\x4c\x65\xd8\xd3\x0a\xbd\xbf\x4d\x6a\xf7\xc7\x32\xe4\x77\xef\x9f\xde\x70\x8a\xbf\x4b\xa8\xfc\x6b\x8e\xd8\x19\x85\x55\x91\x85\x1f\x54\x28\x50\x59\xc5\x72\xe6\x63\x05\x24\xa8\x44\x3c\xc4\x3e\x2f\x7f\xd8\x6f\x29\xe8\x81\x8a\xa5\x2f\xf6\xcf\xd5\xf9\x68\x75\x17\x3b\xb6\x07\x92\xc4\x75\x6c\x08\x30\x79\x07\x04\xc0\x34\xae\xe3\xba\x38\x60\xb2\x35\x6e\x0f\xab\x95\x52\x84\x48\x4a\x62\x06\xda\xca\x20\x6c\x62\x47\x3a\xdc\x91\x1c\x12\x82\x55\x35\x2a\x85\xa1\x2d\x61\x09\x2d\x86\x59\x99\xa5\x9a\xeb\x2c\xcb\x7e\x27\xfb\x59\xf6\xf3\xec\x0f\xb3\xf7\x27\x85\xa3\x0c\xdc\x2d\x67\xf3\xe5\x87\xfb\xd3\x94\xff\x11\x70\x76\x8c\x47\x9f\x7e\x09\x6e\x8f\x02\xd4\x4f\xef\xae\x48\x79\x92\x90\x39\x35\x08\x48\xb0\xc2\xed\x0f\xed\x01\xe7\x52\xe4\x65\xed\x9e\x0f\x0b\xf2\x9b\x21\x80\x0a\x13\x2d\x69\x18\x57\xf9\xd0\x0b\xa2\xd9\x96\x86\xcf\x4d\x08\x33\xf5\xb9\x49\x47\x26\x2a\x4e\x3d\x22\x5e\x08\x8c\xb7\xb1\xd6\x18\x33\xce\xeb\x9a\x09\x26\xea\xb8\x8a\x8a\x60\x50\x07\xd2\x92\x6c\x99\xc9\x17\xb2\x6c\x0a\x7d\xc5\x71\x76\x64\x14\xba\xe2\x2e\x7b\xbc\xe2\x33\xbb\xd2\x43\xfe\xf0\x70\xe1\x8e\x4f\x16\xe3\xd3\x43\x1a\xf1\x41\xf3\xfe\x07\x1e\x52\x0f\xa7\x9d\x22\x35\xf2\x03\x5a\x92\xc3\xb0\x9d\x8b\x08\x55\xdb\x58\x25\x84\x0b\x6a\x0c\x83\x93\x2a\x38\xb4\xee\xf8\xb6\x95\x20\xdb\xee\xc3\x8c\x7c\x1e\x0a\x1d\x0f\x89\x5f\x94\x6f\x35\x8d\x07\x46\x30\xd3\xa8\x42\x95\xb3\x1b\x8c\x2c\x26\x8a\x53\x16\x28\xb2\x88\x2a\x9e\x65\xd9\x37\x59\xe2\xce\x29\x68\xf6\x7b\x59\x95\x14\x84\xff\xf8\xa2\x1f\xfc\x3a\x7f\x32\x9d\xca\xdd\x35\xbb\x59\x62\xd8\xfb\x13\xf0\xfa\x78\xdd\x2a\x2d\xd0\x4c\xc4\xaa\x2c\x41\xfb\xac\x80\xac\x22\xdb\xe5\x6e\x74\xe7\x23\x5a\xd5\xc5\xc0\x00\x39\xa8\x7e\x7a\x16\x7b\xb5\x8f\x9c\x01\x5f\x1c\xb6\x2b\xdd\x0d\x71\xaf\x9a\x9d\xdc\x14\xd4\x62\x38\x86\xdc\xb0\x03\xdb\xd2\x0d\xcd\x8d\x36\xd2\x53\xa7\x1b\xeb\xb4\xd5\xdb\xda\x5b\x81\x99\xe1\x54\x70\x41\xdd\xc9\x47\x4d\x76\x2a\x2b\xda\xec\x67\xd9\x5d\x76\x7f\xc1\x46\x7d\x7b\x77\xd2\xf4\x9c\x4e\xe4\x43\xf1\xf8\x66\xe9\x2c\xbe\xb2\x76\xf2\x3d\x41\x60\x4d\x50\x72\x4a\x3f\x64\xa0\xc5\xfb\x0d\x33\x04\xaf\xc6\x6d\xde\x75\x0c\x5b\x8c\xf7\x28\x3c\x67\x21\xcc\xb2\xe7\x2c\x31\x64\x37\x94\x52\x46\x30\x8a\x12\xb4\x38\xb6\x9a\x70\xd1\xf7\x42\x60\x4e\xfa\xe8\x63\x46\x69\x9e\xf5\xe2\x20\xb2\x6f\xb2\xf6\x85\x2d\x7d\xd1\x7c\xc1\x89\xf7\x67\xc7\x3c\xfa\xaa\xf6\xfb\xc5\xfa\x01\x27\xb6\xb3\xb4\x6b\xe7\x1f\xd0\xfb\xef\xdf\xdf\x7f\x7b\x37\x19\x4a\xc0\xe7\xe6\x87\x10\x66\xe2\x73\x37\x1d\x71\xbf\x30\xbf\x39\xc9\xf5\x1e\x80\x09\x40\x7e\xa6\xdd\x3c\xf8\x7e\x07\x10\x89\x32\xb6\xd1\xc5\x8c\x00\x0b\xe0\xaa\x90\xcf\x07\xae\xd7\x18\xb6\x45\x13\xeb\x0d\xe9\x48\x1f\x77\x2a\xfd\x8b\x9d\x92\x82\xc0\xca\x21\x26\x4a\x07\x29\x87\x30\xc5\x99\xb3\xac\x7f\xa1\xcb\xba\x60\x19\xce\x7e\x95\xfd\xf3\xc4\x89\xf7\x86\x85\xf6\x47\xea\xa2\xc7\x64\xff\x08\x15\xbd\xbd\x07\xd7\x9a\x7d\xef\x5f\x4b\x1d\x39\x0d\xf9\x51\x56\x39\x9a\x22\x33\x5a\x79\xd4\x4a\x31\x86\x30\xf6\x21\xdf\x44\x13\x1d\x70\x05\x1a\x4d\x1e\xc6\x92\x50\xd9\x37\x92\x71\xde\x88\x50\x30\x25\xbb\x5a\x5a\xd5\x88\xba\x60\x94\x52\xbb\x12\x51\xc9\x54\x25\x00\x55\x02\x26\x91\x9c\x89\x95\xb5\x22\x62\x8c\xa4\xa9\x0d\xa7\x8c\x2a\xca\x89\x92\x46\x4b\xc1\xd4\x91\xd7\x2d\x73\xe9\xbc\x42\xf6\xee\x62\x77\x5e\xcf\xeb\x64\x61\x8f\x77\x25\x4d\x3d\xa4\xfb\xf0\x70\x51\xca\xfd\x74\xb9\x6f\xd3\x59\x1c\x12\xef\x60\x88\x65\x18\xf7\x79\x15\x37\x73\x36\xb6\x25\x2c\xf4\x58\x1e\xc0\x86\x8e\xab\xb8\xab\x86\x71\xcd\x41\xd7\x8f\x4d\x91\xe1\x6a\x6c\xc3\x0c\x7d\xde\x4e\x47\xe1\x29\x63\x26\xc1\x61\x57\xd1\x60\x6c\x14\xf2\x74\x58\x33\x87\x95\xc1\x78\xcf\x06\x92\x65\xf3\xf4\x5b\x5d\xa1\xb2\xdf\x4b\xec\x84\xdf\x67\xbf\xba\x9a\xc9\x4f\x75\xe9\xbb\xd9\xfc\x75\x6e\xf1\xe6\xbb\x29\xe2\x00\x93\xc1\x3f\x91\xe0\x2e\x65\xf3\x43\xd3\x14\x14\x05\x0c\x01\xd1\x91\x8d\x9b\x99\x89\x2a\x57\xbf\xc9\x00\xc9\x4d\x24\x39\x1d\xd7\xf9\x00\x08\xc0\x3c\x0e\x71\x18\x0f\x66\x1f\x3b\x09\x48\x51\xc6\x83\xf7\xa0\x24\x18\x93\xda\x10\x48\xad\xb6\x16\x58\x14\xb5\x7e\xc9\x20\xb3\x1c\x2b\x21\x88\x45\xd9\x32\xb3\x2f\x64\x19\x8a\xee\x4a\xc9\xf4\x57\x69\x86\xfd\xfe\xd8\x38\x4b\x86\xe5\xc4\x0b\xff\xf1\x53\x8a\x8d\x6e\xaf\x29\x7b\xaf\x7e\xed\x3e\xdf\x95\x55\xa8\xf2\x6e\x24\x55\x95\xfb\xe1\xb0\xdf\xe5\xb4\xaa\x46\x0a\xb2\x19\xfd\xbc\xbe\x3e\x8a\x0a\x70\xc0\x49\x5c\xc5\xd5\xb8\x52\xfb\xd8\x0b\x40\x0a\x85\x31\x22\x1a\xa3\xb1\xd3\x3a\x17\x18\x6d\xe9\x9a\x0e\x6c\x60\xab\x0a\x1b\x82\xa4\xa0\x58\x1f\xed\x47\x96\x78\xe1\x0a\x7d\xd5\xf1\xfb\xb7\xd7\xf6\xe3\xf6\x2c\x91\x74\x66\xb3\x9a\x56\xf7\x2b\xa3\xd5\x1b\xc6\xac\xf9\x91\xe5\xe1\xf1\x34\x0b\x35\x3d\xe7\x2b\x86\x41\x3f\x25\x31\x38\x2f\xc7\x06\xac\xbb\x2e\xb6\xdd\x74\xfd\x37\xab\x10\x87\xd0\xc7\x41\x81\x6a\x88\x2b\xd0\x8e\x7d\xce\x27\x53\x32\x0e\x60\x07\x61\x4e\xe3\x30\x79\x02\x3a\x96\xe9\xa9\x50\x8c\x71\x86\x28\x31\xac\xd5\xad\x14\xd6\xb8\x97\x0c\x90\x38\xec\xbd\x72\xd4\x28\xae\xb9\x62\x06\xc1\x1d\x63\xc9\x15\x74\xd3\x43\x96\x81\xcc\x00\xb4\x74\x45\x97\xd0\xf2\x77\xf3\x3f\x06\xf7\xe8\xd3\x35\x3d\xec\x6b\xcc\x7a\xda\xce\xbf\xfe\xee\x74\xde\xf3\xdb\x85\x2e\x9f\x49\xc5\x81\x02\xad\xa2\xd0\xe3\x6e\x3c\x44\xe6\x63\x20\x40\x00\x38\xb6\x79\x02\xd4\x25\xba\x45\x90\x55\x60\xd5\xf1\x6e\x0d\x0e\xcf\xbb\x48\x73\xa1\x54\x59\x56\x95\xa1\x9e\x10\xc6\xb9\xa2\x5c\x52\x39\x45\x06\xb5\xe0\x92\x4b\x5b\x1e\x35\x83\x93\xc6\x41\xbe\xc9\xde\x9d\xe7\xf0\x6f\x4e\x19\x56\xba\xd6\xd3\x45\xbe\x79\x33\x86\x7f\x5d\xd3\x48\xda\xf6\xc7\xf2\x8f\x0c\x65\x27\x8d\x5b\x69\x50\xe9\x97\xcc\xd9\x38\x48\xd0\xc4\x8a\xf9\x1a\xb0\xb8\xab\xb5\x67\x2a\xb8\x4e\x75\x5d\x5c\x01\xe3\x3d\x01\x36\x47\x0e\x4a\x2b\xf2\x4d\x5c\xc3\x60\x54\x67\x3b\xeb\xfc\x6e\x57\xfb\x1e\x40\x80\x2d\xac\x6c\xd0\x56\x08\x11\x7b\x40\x9d\x30\xa2\x0b\xba\x2a\x5d\xa5\x51\x57\xb3\xfa\x88\x39\xd6\x2f\x62\x89\x0a\x96\xfd\x93\xec\x57\x27\x4e\xf7\x37\x33\xb1\x1f\x9f\xc0\x17\x68\x9e\xdb\xd9\x2b\x69\xef\x77\x9f\x2e\x86\xfe\x34\x21\x2b\xac\xd1\xc8\x18\x8c\x7e\x10\xa0\x8d\x15\xd8\xa7\x7e\x79\xea\xc7\x95\xbd\xec\xfa\x7a\xb5\xd7\xd3\x42\x99\x02\xd9\xb8\x07\x2d\xc8\x00\x0a\xa1\x60\xcf\x1b\x23\x61\x8d\x10\x05\x3b\x6e\xa4\x34\x3c\xf6\x50\x49\xa7\xc4\x0e\x54\xb5\x30\xb2\xd6\xc6\x98\xfd\xd8\x65\x67\x1b\xa2\x0b\x98\xfc\xcf\x9f\x9e\xd5\x46\x2f\xbf\xf0\xa2\xcf\x90\x6a\x6c\x5f\x29\xbe\x9d\xd6\x77\x9a\x40\x34\x31\x80\xaa\x8e\xbc\x06\x34\xba\xbc\x8e\x7c\x51\x4a\x29\x1d\xf2\x82\x46\x84\xbd\x69\x72\x15\x09\x18\x72\xd3\xb6\x3e\x8c\x07\x29\xf3\x32\x44\xde\xb6\xb9\x1f\x85\x52\x95\xaf\x14\xeb\x9d\xf5\x80\x01\xb6\xd3\xda\x1a\x73\xdc\x8b\x62\x29\x8a\xec\xc4\x7f\x70\xbe\xaa\xbf\x0d\x01\xf5\xdb\x3e\x2c\x36\x52\x9c\x7e\x11\xaf\xbc\x0d\x97\x31\xb4\x79\x27\xa4\xf4\xf0\xc7\x1f\x14\xd9\x58\x49\x05\x5d\x25\xf5\x2a\xd8\x1a\x08\x20\x0e\x26\xb6\x9a\x82\xee\xeb\x1f\x24\x0d\x72\xb6\x34\xc9\x2e\x57\xa7\x5a\x47\xb2\x1e\x17\xd3\x7c\x94\xfa\x3b\x16\x94\x2e\x6e\xf2\xfd\x15\x2f\xfb\x8c\x63\x94\x6f\xeb\x1f\x44\x5d\x48\x32\x1e\x66\xf6\xb3\xcf\xab\xb1\x5c\xb8\xb1\x12\x3e\xcd\x96\xb1\xb8\xd6\x43\xdc\x48\x50\x15\x01\x40\x90\xd1\xb8\x8f\xfb\x42\x51\x1e\x37\x6d\x03\x90\x8c\x2b\xbb\xb1\x76\x2d\x79\xe5\x2a\x1a\x44\x50\x8e\x69\x26\x9d\xa6\xd9\x51\xd7\x6a\x49\x0b\x9d\xfd\x93\x14\x1b\x7d\xb9\x46\x7f\xbc\xbb\xbe\xbb\x80\x5c\xa6\x85\xd9\x06\x61\x9d\x45\xce\x11\x34\x2a\xd6\xf4\xa0\x8d\xb6\xab\x95\xf3\xa1\xd9\x2b\x40\x9a\xa8\xc0\x2a\xae\x09\xe8\x72\x1b\x42\xa1\x9f\x5b\x23\x49\x20\x88\xe6\x07\x87\x2a\xef\x7c\x67\x6a\x1b\x35\xa8\x3b\x6f\xeb\x95\x33\xd0\xc3\x6a\xac\xd3\xde\xb7\x89\x83\x70\x95\xfd\x5e\xe2\x4e\xbc\x64\x92\x49\x4b\xf6\x52\x24\x5a\xfe\x0c\x2c\x3f\x7c\x77\x5d\xdb\x4c\x72\x53\x59\xa8\x50\xe3\xb5\x0d\x26\x18\x80\x66\xf0\xf8\xa7\xf3\x0c\x2a\x66\x01\xfe\x2c\xf2\xbe\xce\x57\x23\x2b\xf8\x61\x5b\xb0\x91\xe7\x2b\x4c\x89\x90\x46\x73\xcb\x4d\xe8\xcf\x7f\x30\xc8\xb0\x09\x71\x37\x85\x20\xce\x7a\x6f\xa7\xdf\xe5\x52\xde\xab\xb2\x6f\xb3\x3f\x3a\xcf\x2e\xdf\x2e\x96\xb3\x53\x0c\xf6\xdd\xfb\x6b\xb5\xdb\x05\xf8\x62\x4a\xed\xf6\xe1\x4a\x14\x6b\xeb\x70\x61\x36\x1b\x40\x80\xa1\xb1\x8c\x36\xea\xa8\x09\x20\x00\x59\x25\x94\x02\x92\xd7\xeb\x7d\x3f\xa2\x32\xf6\xb9\x0a\xb9\x18\xbb\x3c\x8c\x26\xdf\x8f\x55\x18\xcb\xfc\x30\xaa\xbc\x19\x9b\x42\x21\xac\x24\xc7\xd0\x62\xae\x90\x83\x04\x11\x0c\x95\x20\x14\x13\x56\xc6\x46\x08\x4d\x35\xd3\x4a\x69\x96\x28\x52\x32\x90\x1f\x39\x7f\xdb\xc4\x45\x72\xe6\x05\x9d\x2f\xbf\x2b\x6e\x1e\x6e\xf2\x44\x48\x99\xef\xc1\x50\x83\x5d\x6c\x5a\x50\xc9\x38\xf4\x75\x1b\x0f\x7a\xdf\xc5\x16\xec\xfb\x3e\xac\x74\xdb\x80\x2a\x96\x60\x1f\x77\x8d\xb7\xdb\x8b\x2e\x78\x93\x37\x6f\x95\x10\xa7\xf4\x3c\xf1\x05\xbf\xbf\xb9\x9f\x5f\xf1\x05\xd7\x8b\x21\xae\x81\xaa\x62\x08\x3f\x6c\x20\x50\x71\x03\x56\x05\x7f\xee\xcf\x47\xde\xb8\x28\x2a\x07\x9b\x5a\x38\x08\x0e\x42\xc4\xbd\x88\x03\x39\x6a\xb0\xf1\xa5\x2d\x54\x9a\xa1\x98\xe2\x9b\xf4\xf3\x4f\x64\x52\xf7\x8b\xf9\x39\x10\xfe\xee\xd3\xf7\x1f\xce\x50\xfb\x29\xd7\x05\x89\x03\x18\x86\xe9\x36\x07\x0c\xc7\x3d\x18\x68\xdc\x1d\x80\x94\xd1\xc6\x4d\xdc\xc6\xce\x00\x3e\x6c\xbc\x1b\xfc\xfa\x78\xa1\x9b\x1d\x1b\xb5\xcf\x0f\x5a\x3b\xc1\x31\x25\xcd\xa6\x65\xb8\x61\xc6\xd0\x06\x53\x13\x70\x3c\x6c\xc4\x06\x94\xc0\xc5\x4d\x13\xd1\xb9\x1f\x90\xc9\x17\xb1\x6c\x0b\x9a\x2c\xfe\xb1\x0e\xf6\x0a\x51\xbd\x39\x8d\xed\xff\xe2\xdb\x5f\x82\xc7\x33\x11\x6a\x82\xd4\xa4\xf5\x32\xc5\x02\xac\x46\x64\x26\xa4\x63\x12\x39\x0a\xe1\xe7\x03\x65\x05\x1b\xb3\x00\x3c\x50\x76\x8d\x08\xac\xe9\x6a\x94\x75\xec\xd6\x9c\x1b\xc0\x64\xae\x0b\x8a\x18\x8d\xbc\x9b\xec\x25\xa8\x28\x89\x9d\xc4\xa8\x84\xd8\xb2\x5e\x70\x01\x1a\x82\x6d\xb3\x37\x27\x7c\xcf\x74\xdf\xbb\x0b\x77\xf5\xaf\x8e\xcc\x98\x0f\xb7\x6f\xe7\x49\x12\x36\x62\x5a\x17\xf3\x2f\xa4\x22\x16\xeb\x61\x50\x4a\x39\xd4\x0a\xf2\xb9\xa9\x87\x21\x37\xcd\x98\x46\x3f\x72\x0b\x76\x9f\x9b\xf3\xab\x5c\x45\xe5\xc5\xb1\x27\x87\xf7\x7b\x0f\x1a\x21\x36\x53\xf6\xb0\x91\x52\x66\x79\xa6\xa7\xfd\x93\x6f\x32\x3c\x59\x9b\x53\x8b\xed\x98\xba\xdf\x3e\x1e\xc7\x87\xaf\x76\xd3\x49\x3b\xfa\xd3\xf1\x16\x86\x9c\xc0\xaa\x29\xab\x5c\x60\x2c\xac\xde\x7e\xee\x20\x2a\x7a\xdf\x83\x0a\x40\x11\x7d\x5c\xc7\x75\x34\x02\xd0\xdd\x2a\x34\x1b\x03\x74\x13\x51\x71\x18\xec\x08\xb7\x39\xa3\x14\x61\x8c\xa0\x9a\x52\x17\x8c\x95\x97\x14\x05\x2a\x35\xa9\x11\x61\xd2\x1b\xd3\x0f\xb1\x61\x52\x1f\xe3\x0e\x93\x6c\x8f\xcb\x7e\x96\xb2\xdf\xb4\x9a\x53\x87\x32\x6d\xf0\x63\x1c\xfa\x7e\xb2\xdb\xf5\x62\x33\x6a\x2a\x9a\xb8\x8f\x25\xcd\x2d\x80\xcf\xf5\x6c\x4a\xa3\x04\x8b\x75\x6c\x3e\xef\x96\xf8\xb0\xc9\x9d\xa7\x53\x20\x54\x35\xca\xdb\xc1\x30\x55\x3b\x16\xb7\x2e\x3b\xda\x12\xbe\xcc\xf2\x3a\x7b\x97\xfa\x5a\xd9\xbb\x57\x6e\xb0\x23\xa2\xf9\xbb\xb7\x82\xd9\xeb\x05\x2d\x4d\xcd\x3d\xac\x05\x21\xe5\x68\xea\x31\x30\xb0\x6d\xc7\xd5\x82\x34\x9f\x75\xd3\xcc\xea\xcf\x3a\xaf\x77\x1e\x3a\x48\xf8\x1e\xfb\xd2\xc7\x6d\xe4\x8c\x81\xfe\x25\xf3\x49\x17\x28\xf1\xd1\x4e\xff\xbd\xef\x4e\xd9\xc1\x22\x4b\x60\xdc\xdb\xd4\x53\xbe\xfb\x7d\x90\xe0\x5c\xe8\x54\xc5\x46\xdf\x3f\x2d\xab\x7a\xac\x45\x34\xd1\xf3\xdc\xb8\x08\xeb\xbc\xad\xca\xa6\xc2\x0d\x0f\xa0\x52\x55\x80\x9c\xc5\xf0\x92\xd9\x1c\xc7\x6e\x38\xc4\x81\x07\x03\xcc\x06\x48\x4a\xa1\xdc\xc6\x0d\x42\xd4\xe1\x8e\x12\x26\xd3\xf9\xaa\x17\x91\xf8\xc6\xd1\x49\x29\xfc\xd2\x39\xfc\xf1\x1a\x4c\xc7\xd9\x53\x2f\x56\x9b\xcd\x66\xa3\x8d\x0e\xa8\x97\xfc\x73\x17\x76\xbb\xdd\xee\x92\xdd\xe6\x76\x67\xa7\x7d\xca\x2b\x5b\x51\xb2\xdd\x3a\x6d\x77\x3b\x13\x3b\x9d\x30\x40\xe6\x45\x2d\xdb\x3c\x1c\x31\x49\xb7\xef\x9f\x1e\x6f\xdf\xbf\x52\x6f\xcd\x6f\x1e\x6e\xe6\x37\xbf\xf8\xf6\xfe\x28\x89\x30\xbb\x47\x1f\xbe\x7f\xba\x59\x7e\x78\x0f\x7c\x0d\xfa\x3a\x0f\xd0\x1a\xee\x50\x2d\x78\x19\x51\x1d\xb9\x05\x7d\x8e\x1c\xaa\xb1\x89\xdb\xa8\xc6\x1d\xd7\x07\x04\x60\xae\x1c\xb5\x5a\xc6\xbe\xaf\x6a\xb8\xa6\xb1\x06\x82\xc4\x01\x57\xa4\x61\x9d\x40\x08\x69\x40\x91\xc3\xe9\xb7\xf0\x65\xc8\xb3\xec\x0f\x4f\x16\xf2\x34\x5b\x74\xec\x18\x3c\xdd\xdc\xff\x6c\x0a\xb8\x3f\x7e\xba\x0f\x8b\xed\xb8\x62\x66\xc5\xab\x1a\x52\x12\x87\xad\x8a\x75\xb5\x8f\xed\x64\xa6\xe0\xb8\xcf\xb3\x10\x7b\x8c\x48\xba\xb4\x5c\x02\xb7\x3d\x88\xc0\xfa\x26\xf5\x8e\x49\x9a\x53\x34\xd9\x3f\xcd\xee\x4f\x6c\xe4\xff\x7d\x9a\x2e\xbb\x64\x58\xc7\x46\xed\x74\x85\x4f\xcd\xaa\x63\x3f\xe5\xcb\xb9\xb2\x53\x30\x07\xce\xd3\xc4\xe8\x8c\x0e\x9d\x35\x2d\xac\x3c\x9a\xb2\xe8\x0a\x82\x61\x0b\xca\xb1\xde\x76\x42\xa9\x96\x9a\x55\xea\xa6\x16\x5b\x21\x53\x63\x1c\xc5\xb5\x3f\x72\xc6\x3c\xd7\x80\xd0\x35\x40\x20\x4b\x3a\x32\xe6\x04\x1a\xdd\x71\x86\xb4\x23\xd8\x1a\x6b\x4d\xd0\x7a\x5d\x5b\xe3\xb8\x35\xe3\x6a\x0c\x42\x96\xbe\xe4\xf4\x50\x94\x1b\x29\x8d\x94\xa0\x1c\x25\xa3\x4d\xaf\xb5\x60\x3e\xc7\x59\x36\x2b\xc2\x89\x5b\xe1\x5d\x9a\x7a\xff\x8f\x6f\x7b\xe4\xa7\x0c\xfd\xe1\xee\x42\xfa\x7c\x62\xac\xfa\xc5\x49\x2a\x7f\x99\x06\x92\x5f\x11\x15\x0f\xef\x52\x87\xa2\x38\xb3\x8d\xa4\x98\xf7\xe6\x44\x73\x54\xf4\x6b\x0f\x32\xbf\xdb\xf9\x97\xcc\xaf\x61\x11\xe2\x41\x0b\x61\x6a\x21\xa1\xe5\x8d\x17\x7b\xb4\xdd\xec\xa8\x93\x98\x20\x24\x3d\xf3\x35\x25\x14\xd6\xfb\x5d\x38\x84\xd4\x3c\x7d\xc9\xd0\x4e\xb6\x78\x3b\xdf\x85\x10\x82\xd3\x5a\xa9\xda\xad\x28\xd7\x92\x69\x4a\x25\xae\x05\xe3\x60\xa3\x0d\x8b\x8d\x70\x88\x53\x8a\x91\xaa\x57\x71\x47\x18\xd7\xe3\xca\xfb\x10\x7c\xec\x80\xd8\x04\xab\x7d\x9a\x2d\xf1\x99\x48\x3d\xf1\x73\x47\xfe\x82\xd5\x79\x2b\x46\x70\xff\xca\x31\x76\xea\x8c\xcf\x56\x03\x41\x1e\x22\xa0\xa2\x56\xa0\x57\xd3\x4f\x16\x88\xc6\x83\xc3\x44\x39\x51\xe7\x27\x81\xee\x79\x6d\x0c\xd2\xd2\xf7\xcf\xad\x4c\xb7\x22\xc4\xa6\x70\x94\xe8\xba\x8d\xb8\x69\xe2\xbe\xae\xb3\x6c\x5e\x94\xe9\x1e\xd0\xc4\xb9\x86\xb3\x7f\x9d\xfd\x6f\x93\x65\x39\xb1\x38\xde\x7c\x38\xea\x58\x9f\x10\x93\xd7\x3f\xeb\xe9\xfe\xe9\x53\xe2\xc0\xb9\x7e\x77\xf9\xe1\xd3\x53\x2a\x9a\x2c\x96\xb7\x1f\xef\x1e\x9f\x12\xa0\xe8\x36\x0d\xd8\xbd\xb1\x11\x0f\x33\x68\x6b\x53\xec\xfd\x48\xf3\xf5\x18\xf2\x56\x19\x40\xe3\x5a\x0a\xad\x2a\xa1\xa7\x0d\xa8\xeb\x88\x00\x83\x5c\x70\x4e\x59\x45\x28\xf5\xb0\x09\xf1\x00\x02\x97\xdc\x34\x94\xec\x80\x26\xac\xae\xa7\x24\xb8\xa2\x9c\x36\xb3\x55\x54\xe3\x10\xa5\x04\x2d\x38\xe4\x87\xe8\x0f\x76\x6d\x09\xa9\x2c\x67\xac\x72\x55\x45\x2d\xa3\x63\xa9\x61\xd5\x33\x5a\xd9\xaa\xf2\xd0\x57\xca\x19\x27\x39\xac\x4a\xc6\xd8\xf4\xaa\xb2\x3d\x65\x95\xad\x60\x73\xce\xff\xc2\x5c\x24\xbd\x99\x7f\x95\xf1\x23\x77\xc5\x97\xea\x4c\xa7\xc8\x7a\xf9\x06\xc7\x37\xed\xd4\x4f\xc7\x04\xf6\xb5\x86\x70\x8e\xa0\x8a\xfb\x0f\x53\x58\x79\x7b\x0f\x2c\xc0\x01\x84\xfa\x3c\xd6\x91\x57\xb1\x5e\x0d\x62\x58\x63\xc0\xa0\x09\x4c\x40\xcd\x28\x2d\x3f\x37\x2c\xc0\xdc\xc0\x91\xd5\x5b\x05\x60\x13\x5d\x9e\x9d\x66\x41\xfa\x94\x99\x87\x68\x56\x05\x09\xe3\x40\xa2\x4e\xa5\xcb\x83\x9c\x12\x35\xe5\xa4\xb7\x22\x88\xb0\x8d\xa1\x29\x7d\xa5\xda\xa1\xa2\x46\x38\xe5\x8c\xf7\xd2\x4d\x0e\x7d\x2d\x63\x37\x45\xae\x47\x5f\xd6\x17\x30\x61\xff\xff\xab\x73\xae\x7e\x4d\xb8\x9e\x7c\xf9\x59\x21\x17\xdc\x5e\xf3\xbd\x3e\xfd\xc5\x87\x34\xd3\x74\xe4\x2d\x9c\xed\x93\x1a\x59\x9e\x45\xb4\x76\x3a\xea\x91\x62\xc0\x0e\xe3\xa1\x6d\xda\x71\x6f\xb5\x36\x84\x41\x41\x99\x77\xdb\xba\xa0\x5a\x79\x15\x16\x56\x19\x65\x3b\x2a\xcc\x96\x79\xc8\x36\x36\xa1\x1c\x2a\xd7\x4d\x51\x6f\xe5\x2b\xa6\xf8\x30\xf2\x82\x46\x2d\x34\xd3\x2c\xcb\xb2\x2a\xc5\xab\x3e\xdf\x5e\x30\x78\xd7\xea\xf9\xff\x4b\xf6\x5f\xb2\xff\x23\xfb\xbf\xb2\xff\x27\xfb\x7f\xdf\xf2\xc6\xbf\xc5\x5a\xce\x9f\x1e\x6e\xef\x4e\xc7\x3f\xee\x5b\xf3\x9f\x20\x8f\x7b\xff\x63\x6a\xb9\x13\x35\x46\x1c\xce\x62\xf9\x80\x55\xc2\x60\x06\x05\xc2\x15\x1c\x05\x30\x93\x3f\xdc\x2c\xf0\x9b\x6f\x48\x7d\xfc\x06\xac\x2e\xdf\x88\x19\xc1\x1a\xe2\x62\x4b\x91\x86\xf8\x87\x56\x13\xa6\x58\xd1\x6b\x4a\x15\x8b\x10\x23\x05\x71\xb1\x4b\x4f\xcf\x18\x43\x53\xa1\x62\x9f\x9e\xf2\xad\x62\x8a\x49\x1a\x57\xbe\x32\x25\x5e\xe5\xb4\x49\x74\x5e\x81\x52\x30\x5c\x7f\x44\xbb\xab\x8f\x3c\xe5\x84\x33\x7c\x7a\x0c\x42\x0a\x93\x1e\xb5\x90\x44\x73\x9c\x1e\x91\xd4\xd8\xc8\xe3\x63\x96\x65\xdf\x14\xe2\x85\xa7\x99\x8f\xdf\x4d\x31\xe9\x94\xd3\xff\x6d\xf6\xef\xb3\xbf\xcf\xfe\xf3\xa5\xda\x9a\x74\x06\xff\x04\x7c\x9d\xf4\x3b\x19\xb7\xf7\xd3\xcb\x33\xa1\xd9\xc9\xfa\xa5\x0d\x74\xf3\x70\xf3\xee\x2a\xc2\x7c\xba\x9f\x27\x19\x87\xc7\x5f\x3f\xdd\x3f\x3e\x3d\x14\x6d\x0d\xca\xb0\xaf\x9f\xb9\x77\x68\x0b\x2b\x8f\x21\x10\xb1\xbd\x90\x7e\xeb\x67\x03\x91\xf4\xa0\x8d\xfb\x54\x54\xa9\xe2\xbe\xa8\xa4\x24\xac\x8a\x06\x21\x56\xd7\x8e\x6b\x44\x40\x45\x29\x73\x66\x14\x79\xc7\x21\xa4\x08\x45\xd9\xb6\x0b\xe1\xbb\xce\xc7\x03\x44\x02\x63\x4c\x99\xe5\x5a\x68\x61\x81\x41\x48\xd5\x25\xef\x85\x98\xfe\x1f\x2b\x21\xa0\x58\xc1\x8a\xc7\x3e\x0f\x71\xc3\x05\x23\x08\x23\xc1\x64\x3b\x70\x04\xbb\x32\xc5\x4d\xbf\x53\x90\x74\x8d\xe8\x95\x56\xce\x3f\x3f\x55\x22\xff\xdd\x65\xd2\xee\xe1\xe9\xaa\xb4\xfe\xee\xf1\xf6\xe1\xfd\xe3\xed\xc3\xfc\xa4\xe3\x31\xff\x2a\xeb\xe4\xfb\x9b\x87\x8b\x6c\xfb\xcd\xe9\x28\x42\xd1\x47\x03\xd6\x21\xae\x43\x5c\x05\x30\x44\xed\x86\x01\xec\x56\xab\x71\x37\x39\xb2\x1c\x4e\xab\x6d\x74\x4d\x08\x41\x71\x21\x03\x15\xaa\xe1\x4d\xb1\xf3\xbb\x90\xc2\xb2\xdd\x6e\x41\x9d\x8c\xfe\x10\x25\x68\x5f\x32\xe0\x64\x82\x09\x48\xad\xf5\x10\x82\xa3\x46\xdb\x26\x22\xd0\x78\x6b\xd7\xbb\xfd\x33\xd7\xba\xe8\x0f\x36\x36\x36\x06\x3f\xf9\x74\x3a\xe5\x50\x0b\x7b\xd1\x31\x7f\x65\xcc\x7c\x2c\x1e\xdf\xa5\xe9\xa5\xf3\x90\xd5\x89\x75\xe0\x34\x8c\x3c\xff\xf0\xe9\x14\x38\xde\x9f\xa2\xca\x8f\x9f\xee\x3e\x7e\xca\x8b\xc4\x08\x76\x9a\x1a\x39\xb3\x80\xba\xb5\xef\xfb\x7d\x55\x97\x80\xc5\x55\x85\x08\xf2\xcc\x10\x3c\xd9\x75\xc1\x34\x97\x86\x61\xb4\x8f\x5b\xb4\x5f\xaf\xb7\x39\x1b\xfa\x5e\xcb\x8a\x11\x06\x47\x03\xaa\x75\xa1\x93\x76\xe2\x98\xc8\xa1\xc3\xe1\x30\xdf\x34\x8d\x4b\x6c\x5b\x3e\xfa\xbe\x3f\xd0\x68\xe2\xe1\xa0\x15\xdc\xfa\x43\x50\x0e\x61\x4e\x6a\x14\x52\x88\x63\x4d\x05\xa5\x30\x00\xe7\xd0\xbb\x41\x5b\x6e\x75\x84\xb1\x35\x36\xf5\x1b\xf2\xc3\x8b\x9c\xcb\x0b\x7f\x29\xf9\x69\xfe\xd2\x8f\x5f\x12\x98\x4e\x57\x20\x11\x98\x62\x0a\xb7\x63\xb3\x85\x58\x83\x5d\x84\x75\xdf\x37\x79\xc6\x95\x52\x50\x1b\xce\x05\x87\x8c\xa3\x8e\x5a\xc3\x69\x5c\x2d\xac\x34\xde\x0b\x1e\xeb\x28\x6d\x17\x5d\xd0\x82\x41\xe4\x09\xda\x70\x56\xfa\x12\x7a\xd2\x20\xb8\xa2\xa9\x17\x32\x2f\xa6\xfc\xb1\xfd\xff\xd1\xcf\x5f\x7c\xfb\xa7\xdf\xe6\xe7\x8d\xa9\x75\xd1\xb9\xd4\xe4\x59\xe5\x56\x9a\xc9\x73\x71\xa1\x24\x14\x8a\xc6\x16\x48\x1f\x39\xc0\x15\x63\x9c\x53\x5a\x61\x4a\x1d\xac\x39\xdd\x03\xcb\x44\x13\x28\xd9\x00\x81\xa9\x73\x9c\x33\x06\x29\x23\xe1\xd5\xcd\x1f\xe9\x6b\xfe\x51\x6e\xfe\xe8\xdd\xe1\xd7\xdc\x7c\xb6\x4c\xbd\x2f\x9e\xaf\x2f\x59\xf5\xaf\x33\x9a\xfd\xf5\x6f\xf1\x1c\x67\xf6\xb6\xf9\x15\x01\xe3\xf2\x47\xa0\xcb\x85\x8e\x30\x89\xde\xd3\x71\x9d\xaf\x2b\x69\x11\x47\x12\x91\xaa\x8a\x7b\x86\x3d\xe2\xe2\x19\xe7\xf2\x34\xd3\xd1\x47\xbe\xf2\x52\x5b\x5d\x30\x86\x02\xa4\x1b\x5e\xd5\x15\xcd\xd7\x8a\x4b\xa6\x78\xdc\xbb\xca\x55\xc4\x32\xc6\x05\x27\xb9\x68\x39\xaf\x13\x2f\xa3\x65\x8d\xd0\xd2\x48\x8d\xb5\x40\x5a\x63\xa3\x26\x7b\x9c\xef\x4e\x31\xf5\xbf\x3c\xd9\x97\x57\x9f\x78\xd4\x42\x7d\xf8\x09\x57\x77\x21\x0d\xbc\x3f\x4f\xc9\x1e\x3b\xa9\x67\xd2\xd0\xe5\xfd\xed\x3c\x21\xc1\xef\xbe\xf4\x89\x5f\x61\x29\x58\x58\xdd\x1b\xbf\x9f\x36\x67\x3a\xfa\x4a\x39\x62\xa0\x23\x04\x55\xcf\x6b\x4c\x64\x63\x76\x40\xd0\xd8\xb6\x98\x38\x46\x04\xae\x1a\x88\x94\xa0\x8e\x90\x2e\x42\x92\x8b\xd8\x13\xfc\x92\x21\xdc\x24\x8b\x94\x67\x0c\x19\xc8\x0c\x85\xb6\x22\xd1\xb8\xc4\x7d\xc6\x89\x47\x33\xa8\x95\x55\xc2\x48\x23\x63\x68\xa0\x83\x62\x9d\x57\x08\x5a\x63\xfd\x94\x51\x52\x69\x8d\xab\xac\x56\x96\x0b\xe6\xb4\x57\x84\x10\x32\x08\xb1\x96\x72\x2d\x65\x38\x72\x46\x1b\x8d\x9d\x2e\x51\xe3\x99\x77\x36\x54\x8d\x3e\xd6\x82\xfa\xc4\x05\x3e\xc5\xe7\x9f\x7e\x22\x1a\xba\x3b\x13\xa8\xfe\x74\x50\x34\xcf\xc2\x29\x1c\x82\xc3\x39\x1c\x0a\xdd\x4b\x26\xb4\x57\x8e\x6f\xba\xd0\x8f\xdb\xb7\x51\xd1\x9b\x70\x08\xd1\x0d\xb5\x5c\x33\xf1\x53\x41\x51\xf6\x3b\x49\xcb\xbe\x9d\x8b\x4b\x04\xf4\x1f\x92\xd6\xc6\x31\x06\xfa\x7a\xc4\x3a\xf9\xd0\x37\x8b\xfb\x4f\xc1\x87\x37\x4b\xfb\x12\xb9\x4e\xe6\xf8\xd2\xc6\x2b\xee\xa7\xdb\xff\xdb\x97\x3d\xd0\xa0\x0c\x60\x17\x52\x7c\x8a\xe2\x36\xcf\x22\xdd\x00\x24\xba\x26\x8a\xb3\x80\x57\xbe\xad\xa4\x53\xc8\x21\x58\xc5\x35\x67\x9a\x49\xf1\x2c\xb5\x55\x80\x4d\xe1\xec\xf6\x70\x88\x07\x50\x27\xb9\x93\x5d\x84\x36\x1f\x28\x19\xf7\x18\x54\xc7\x0a\xfe\x74\x34\x49\xcd\x3c\xdf\x49\xea\x09\x5f\x13\x18\x20\x99\x57\x8c\x31\x36\xc5\x87\xd6\x90\x9a\x4c\x3e\x40\xf3\x38\xf8\x40\x1c\xe3\x5a\x2a\x0a\xb6\x84\x38\xad\x2d\xd3\x8c\xb1\x1d\x8b\x07\x8c\xf1\xc0\x58\x97\x1a\x69\x9e\xd5\x5c\x4b\xa9\x0c\xb5\x12\x29\x43\xac\xca\x8a\x84\xa3\xb4\x09\xcf\x7b\xd4\xb4\xfb\xc9\x3a\xf0\x05\x37\x7f\xaa\xf4\x9c\x09\xff\x9f\xee\xe7\xbc\xbe\x00\x93\xeb\xa8\x8f\xd8\xab\x1e\xf0\xc4\xf3\x60\x8a\xd5\xb8\x43\x38\xa7\x75\xe4\x0d\x13\x6a\x6b\xe2\x01\x24\x63\xb0\x38\x12\x3b\x78\xad\xd3\xd3\xf3\x3a\x08\x31\xf6\x4a\x03\xc9\xa9\xed\xf6\xe3\x61\x3b\xd9\x73\x9b\xf6\x39\xc9\x7e\x9e\xdd\x65\x8f\x69\x76\x6b\x8a\x24\x52\x6b\xed\xfb\x3f\x07\x27\x89\xab\x87\xc7\x29\x25\x7e\x77\x73\x7f\xf3\x0a\xf8\x9f\xcd\x3f\xfc\xfa\xd3\xcd\x43\x6a\x05\x3d\xde\x9e\xb1\x8b\xc5\x50\x28\x5b\x1b\x50\x8a\xb6\x31\xab\x97\x8c\x6f\xda\x86\x8b\x1d\xf7\x5e\xf5\xb1\xb5\x06\x22\x2f\x48\x5d\x56\xb1\x8e\x08\xee\x87\x75\x0d\x54\x1d\x9b\xf5\x1a\xa8\xd5\x82\xf8\xde\x31\x16\xb0\xa0\x96\x06\x22\x7c\xe7\xa5\x72\xa3\x89\xe5\x4b\x56\x56\x82\xe3\x6e\x20\x94\xf2\xb2\xae\x40\xe5\x72\xeb\x7d\x9c\x02\x8d\x2c\x03\x85\x7c\x11\xf3\x2a\xe1\x2b\xb2\x8b\xa2\xcb\xcf\x67\xb6\x26\x32\x50\xbd\x5a\x38\x7c\xd8\xfc\xb0\x9e\x95\xdc\x82\x23\x3f\xb8\xcc\xc2\x52\x2c\xdc\xa5\xfb\x7c\xd6\xdf\x59\xfc\x3e\x48\x83\x20\xaf\x74\x92\x8f\x1f\xc1\xb5\x5c\x50\xd9\x50\x0a\x60\x14\x55\x09\x81\x7f\xee\x00\xc2\x65\x54\xa0\x62\xc2\x19\x61\x79\x34\x47\x6e\xc5\xe3\xb1\x30\xc4\x48\x8f\x31\x7b\x26\xc5\xa0\xb1\x57\x52\x38\x6f\x47\x51\xa7\xe1\xfa\x90\x65\xf3\xbc\x7e\xd1\x73\x98\x38\xe8\xee\x4e\x51\xef\x29\xca\x39\x47\x3a\xc7\xfa\xcc\x14\x97\x81\x2f\x93\xf9\x33\xd9\x42\xbe\xd2\x5e\x7b\x6b\xcd\xe8\x83\xde\x6b\x0d\xb8\x10\xa9\xe8\x02\x5f\xb2\x90\x6a\x0e\xd3\x31\x0f\xdb\xed\x66\xe3\x07\xef\x87\x61\x88\xec\x79\x2d\x05\x74\x15\xf3\x71\x55\x0c\x71\xef\xa3\x75\x59\xb6\xc8\x6c\x51\x26\x5b\xf5\xcb\xd3\x9c\xc3\xbf\xcd\xfe\xd7\xaf\xaa\x35\x7c\xfb\xf8\xeb\x4f\xbf\xbe\xc2\xc2\xfd\xe2\xa8\x64\x77\x3b\xe5\x40\x17\x05\xf5\xc9\xd4\x5f\xd7\x31\x3f\x3d\xcc\xdf\xf2\x41\x1c\x99\xca\x67\x87\x90\xbc\xd7\x86\x70\x85\xaa\x38\x6c\xca\x6d\xd9\x04\x0c\x4b\x5b\xca\xfd\xa0\x3b\x6b\x35\xa0\xdd\xb3\xcb\xc5\xd8\x05\x40\xe2\xb0\x2d\xaa\x88\x31\x58\x61\xdb\x0a\x09\xb5\x90\x14\x46\x2c\x9a\x05\x21\x18\x96\xa6\xe4\xda\xf0\x55\x69\x94\x58\x58\x2c\xb1\xa6\x84\xc1\x8a\x54\xb2\x82\x25\xc5\x9c\x10\x52\x56\x65\x6d\xb8\x0d\x43\xcb\x04\xa0\x71\xa7\xe4\xce\xb0\xb5\x83\xa6\xc2\xa2\x96\x2d\x82\x14\x29\x86\x89\xf1\x44\xa3\x26\x9b\x67\x4d\x6e\x97\x74\xee\x2f\x98\x87\xbf\xbb\x46\x3d\x7c\x2d\x09\xb9\xb6\x6c\xe0\xd7\x9f\x5e\xc9\x27\x13\x7e\xeb\x1a\x30\x37\x2b\x6d\x05\xb7\x55\x65\x08\x01\x2c\x7a\x20\x62\x97\x0e\xff\xac\x21\xd4\x1d\x30\xc7\x7b\x37\x1d\x63\xd0\x9c\x61\x57\x1f\x9c\xaa\x4a\xc7\xc7\x1d\x05\xc8\x75\x3d\x6c\x9c\x75\xb0\x33\x96\xcf\x3d\x41\xb0\x2a\x05\xa1\x06\x6b\xaa\x88\x01\x06\x56\xc2\x1a\x8c\x1b\x4a\x03\x21\x40\x55\x84\xe2\x95\x2d\x2b\x8c\x60\xdc\x58\xcd\x14\xaa\x0c\x93\x55\xa9\xb9\xc7\x47\xbd\xf8\x99\x7c\x61\x29\xb6\xfb\xbd\x54\x49\x3a\x0e\xe8\x1e\x47\x58\xde\xdd\x2d\xaf\x41\x03\x97\xb9\x86\x74\x0f\x67\xdb\x9c\xa0\xee\x79\x00\x3b\x58\x46\x8d\x03\x02\xbb\x44\x30\x30\xc8\x9d\xd8\x18\xf5\x92\x49\x50\xf2\xb8\x02\xc2\x11\x66\xec\x82\x5a\xd6\x86\xa0\x6c\x54\x44\x85\x43\x88\x3b\x53\x5b\x50\xed\x1b\xdf\x1e\xc2\x41\x09\xd9\x4e\x71\x66\xbe\x7d\xe1\xf3\x2e\xcd\x86\xff\x6e\xe2\xc1\xba\x4f\xdc\x4d\xaf\xf0\xad\xcb\x3e\x3f\xfe\xfd\xee\x2e\x2f\x3e\xfc\xbc\xd8\x3a\xd9\xab\x06\x50\xa3\xd4\x51\x01\xb8\xe6\x6a\x03\x90\x96\x4a\xaa\xde\x8a\xda\x86\x85\xe5\xb1\xdf\xd9\x5d\x2b\x8c\xb1\x32\x1e\x78\x5d\x3f\xa3\xfc\xa0\x1c\xc8\x34\x37\xc6\x8a\xb8\x16\x71\x1d\x37\x0a\xc0\x63\x2f\xbc\x28\x97\x6e\xe1\x13\x9f\xd5\x31\xaa\xfb\xa2\x07\x99\x16\x7a\xaa\x9f\x7f\xba\x5f\x5c\xd1\x83\x3f\x24\xc7\xfe\xdd\xa9\x85\x9b\x1e\xe7\x8d\xa9\xca\x7e\xe0\xfb\x55\xbd\x51\x00\x7f\x1e\x8a\x2c\x1a\x06\x1a\x18\x37\xb1\x95\x60\x2f\xe2\xaa\x2c\x25\x13\x5c\x62\x22\x1a\xbd\x99\xed\x58\x7b\xa0\xa0\x04\x58\x6c\x62\xc7\x80\x02\x4e\x1e\x62\xcd\x81\x5b\x78\x56\x96\x02\x3b\x6e\x84\xd4\x0a\x5b\xb3\x8d\x3b\x69\xcd\xbe\xa4\x54\x73\x42\xa0\x31\xbd\x08\x5c\x89\x52\x76\x52\x69\xa8\x3b\xa9\x53\x3c\xb2\x28\xba\x4c\x2f\xc3\x42\x27\xc6\xce\x5f\x9d\xf0\xd7\x19\xb8\xfb\xc5\xf2\x58\x80\xbe\xbd\x9c\xd8\x11\x47\x04\x8e\xd8\xd6\xdf\x07\x97\x13\x7b\xf7\xfe\xc7\x6f\x7d\xb8\xaa\x63\xcc\x9d\xaf\x9c\x92\x61\x5d\xee\x5b\xd9\x6c\xdd\x86\x03\xbf\xb5\x88\x1b\x06\x36\x96\x51\x21\x4d\xa5\x95\xa2\x9c\x05\xb1\x2e\x23\x31\x18\x0b\x2e\x2b\x29\x25\x65\x44\xcb\xb6\xb4\x12\x51\xc9\xc0\x4e\x22\x26\xd9\x42\x57\x92\x27\x90\x6b\x55\x2a\xeb\xbc\xee\xa9\xd5\xc0\xe2\xa0\xb9\x8a\xe5\x0a\x53\xcd\xa9\x14\x5a\x09\xd1\x2b\xe9\x81\x5b\xf7\x98\x2a\xc9\xa4\x50\x92\x33\x27\xa5\x03\x9a\x13\xaf\xa8\xb6\xe9\x31\x5b\x64\xf2\xc5\x14\x87\x85\x3b\xf1\xdb\xd1\xc4\xc0\x9c\xbd\xbb\x70\x93\x5e\xdd\xd9\x4f\xf7\xd7\x54\x0c\xe7\xd4\xf9\x8f\x5e\x4f\xfb\xe6\xe9\x22\x42\x9e\x28\x4d\x4f\x52\x44\x47\xc8\x91\x03\xa2\x72\x25\x50\xd1\x97\xd5\x6a\x25\xbb\x5e\x75\x06\x40\x12\x87\xdc\x0b\x6a\x88\x38\x50\xac\x10\x1d\x49\x70\xce\x19\xc1\x39\x23\x4e\xb7\x01\xf4\xce\x37\x6d\x25\x18\x9f\x16\xe3\x50\x3a\x4a\x91\x42\x64\x1e\x54\xf0\x7a\x72\x26\xd6\x7b\x6e\xa5\xb6\x1d\x30\x7c\x5a\x29\x23\xe7\x82\x0a\xbe\x3e\x1c\x3c\xe5\x4a\x1a\xc5\x07\x2f\x7b\x50\x51\x7f\x38\x78\xad\x05\x37\xf5\xda\xca\x2d\xe0\x40\x33\x41\x05\x4b\x38\x1d\x99\xf5\xa9\x46\xf7\x78\xd2\x68\x4c\xbe\x66\x8a\x3e\xcf\x89\xf3\xcd\xd1\xde\x7f\x05\x6d\xf3\x74\x7f\xf3\x71\x3e\x5d\xf2\xba\x1e\xdc\xa6\xae\x03\x80\xb1\x01\x42\xda\xd6\x28\xe5\x57\xd8\x2a\xeb\x45\xd7\x68\x36\x06\xc0\x63\xe7\x16\x4c\x51\xb8\xb2\x21\xef\x46\x11\x6c\xe7\x46\x69\xad\x57\xc2\x32\xc2\xb1\x85\x98\x11\x4d\x85\x90\xd6\xe6\x1e\xa5\xf5\x39\xc3\x59\xbf\x6c\x52\x8d\xe3\x43\xc2\x63\xa7\xfb\x03\xee\x2f\xf0\xb2\xfb\x53\x4f\xe8\xe1\xfd\x57\xde\x3b\x5e\xfa\xe5\xe3\xcd\x64\x6e\x97\x57\x88\xed\xe3\x69\xbc\x81\xc6\x51\x60\x8c\xd6\x26\x4e\x01\x92\x03\x0d\xd0\xd6\x18\x1f\xbd\x51\xca\x10\xce\x04\xe5\xdc\xd5\xd2\xd6\xeb\x52\x49\x5c\xba\x4a\xb4\x81\x57\x84\x32\xc9\x6b\x83\xb1\xa5\x79\xc7\xa7\x1b\xb0\xa0\xb6\x36\xc1\xda\x60\x6a\x7b\x79\x35\x6e\xa6\xef\x11\xf6\x92\xd5\x5b\x16\xbb\x80\xb0\xc3\x3d\x87\x04\x41\x83\x09\x50\xb8\x33\xd4\x33\xa1\x85\xd2\xe7\x73\x76\xcb\x76\xe1\x12\x57\xc8\x5f\x5e\xf6\xe4\x69\x1a\xee\xe1\x9a\x72\xf4\xe6\xe1\x2d\x94\xf2\xfa\xee\x3c\xdc\xdd\x7f\xff\xe1\x61\x71\x26\x6a\xbf\xce\xa6\x66\x12\x54\xa9\x59\xa3\xb6\x90\x20\x64\xd3\x79\x30\xb2\xa6\x8a\x60\x48\x69\xb5\xc3\x98\x31\x4a\xa8\x20\x84\xa0\xed\x01\x54\x0c\x51\x22\x2f\x68\x41\x2b\xe5\xb4\xdf\x3a\xc5\x95\x90\xf3\xad\x10\xd8\x3a\xc1\x31\x61\x9c\x30\xe2\x10\x8e\x75\xdc\x24\xf0\x2b\x05\x10\x28\x8c\x0c\xe5\x14\x2b\x4c\xb8\xd8\x19\xeb\xe3\x5a\xc5\x41\xc5\x83\x72\xc2\x5a\xc6\x6b\xa5\x45\xb6\x98\xc1\xcc\x24\x9c\xfa\x3c\xd9\xf6\x0f\xd9\xbf\x48\x2c\x10\xc7\xad\x76\xd9\x8d\x3f\xde\x8c\xa7\x2c\x21\x6d\xba\x6b\x68\xc9\xc3\xd3\xe3\xfd\xf5\x5e\x3c\xbf\xbd\xe8\x19\x53\x54\xc4\x0c\xd0\xd2\x27\x9a\xcf\x6a\xd5\x8b\xb6\x53\x83\x01\x25\x8b\x3b\x60\x09\xd2\x90\x80\x5d\xda\x67\xb5\xab\x9b\xb2\x72\x4a\x48\x49\xa5\x0e\xc8\xd8\x71\x53\x3b\x63\x4b\xc5\x24\xa5\x54\x9a\x1a\xd5\x0b\x43\x98\xe6\xa2\x91\xd6\x4a\x8f\x98\x73\x9e\x7b\xad\x75\x17\x5b\xc6\x99\x60\x24\x6d\x33\xbc\xb5\x8c\x2a\x69\xb4\x08\x52\x36\x1b\xbb\xd9\x58\x84\xa4\x70\x8a\xd5\x42\xd4\xeb\x64\x87\x68\x11\x4e\x76\xe8\x9f\x9d\xd7\xf9\xbb\x1f\x71\x24\x1f\x93\x80\x63\x52\x74\x22\xb4\xfc\xa3\x0b\x2c\x3f\x19\xa0\xe3\x9b\x57\xdf\x3f\xf3\xba\x1e\xd7\xb9\x07\x70\xb2\x43\x24\xf6\x65\xd3\x88\x10\x64\xa7\xf7\xe4\x25\xcb\x29\xc3\x06\xb3\x88\xac\xd3\x5a\x32\xae\xb1\xd6\xc1\x82\xa0\x5c\x5d\x57\x82\x0a\x4c\x88\x36\x5d\xa9\x80\xc0\x50\x55\x38\x0e\x14\x49\x44\xe7\xd6\xd4\xb5\xf1\x08\x32\x13\xac\xa8\x8d\xf6\x6b\x60\xa7\x6d\x20\x9e\xab\x29\x4c\x71\x54\x4a\xa9\xeb\xb5\x13\x3d\x80\xd4\xa5\xb7\x92\x74\x81\x60\x2b\x2b\x76\x80\x03\x27\x04\x11\x1c\x71\x9e\x68\xd1\xb3\x6f\x66\x3a\x13\xcb\xe6\x27\xf1\xdd\x93\x5d\xba\x9f\xec\xd2\x3f\x8c\xef\x7e\xba\x79\x83\xef\x9e\x99\xa2\xda\x0e\x23\x1c\x76\xa0\xe3\x83\x10\x03\x77\x62\x5c\xe5\xed\x28\x79\x41\x63\xcf\x75\x1a\x99\x42\xb1\xa9\x35\x17\x4a\xe6\x48\x4c\x6b\x7c\xc1\x9c\x89\x16\x78\x63\x8c\x89\xdb\x7e\xfa\x17\x83\x55\x36\xae\x25\x87\x0e\x52\x80\x10\xad\x85\x54\x4a\x5a\x95\x34\x3d\x67\x30\x23\xcb\xb0\xe0\xd9\xef\x9e\x34\x93\x8f\x5c\xc7\x7f\x93\x65\x20\x19\xd2\x23\xce\xff\xfd\xf5\xeb\x6b\xf4\xda\x2b\xc8\xeb\xbb\xd3\x8f\x4f\x38\x8c\xf7\x29\x58\x5c\x6c\x77\xc0\x78\x2d\x69\x88\xdd\xf9\x15\x70\xd3\x22\xe3\xb1\x4e\x4f\xa0\x53\xb8\x5b\xf1\x75\xdf\xac\x39\xa8\x5a\xe5\x36\xac\x07\x95\xea\xe2\x81\xed\x80\x50\x43\xdc\x33\x90\xcd\x0e\x83\x1b\x7b\x4b\xb1\xa1\xf4\xf2\x6a\x87\xa9\x62\x44\xa4\xc7\xb8\xe2\xd8\x30\x2b\x7c\x10\xc6\x08\xde\x68\x23\x4a\xbe\x71\xda\x70\x1e\x0f\x6e\x3a\xcd\x6c\x31\x0b\xd9\x36\x61\x48\xf1\x65\x8e\xf1\x5f\x9c\xb2\xad\x6b\x35\xc4\xb7\x94\xb6\x47\xe8\xda\xf2\xc3\xcd\xc7\xe2\xfe\xe6\x47\x34\x55\x73\x3f\x25\xd2\x04\xa2\x14\xa4\x2b\x10\x18\x45\x14\xd2\x0a\x33\xdc\x4b\x54\x56\xd6\xb0\xa0\xf3\xf5\x48\x7d\x5d\x03\xd4\x44\x96\x9e\x16\x56\x33\x14\x7b\x84\x31\x22\x9c\xdb\xce\x8e\x07\xce\x4b\x57\x61\xe0\x62\xb7\x55\x04\x42\xc3\x79\x8e\xf1\xc8\x47\x0d\x5c\x5d\xd7\x51\x87\x44\x6d\x98\x81\x59\x9f\x78\x3e\x6c\xf6\x17\x3f\xe1\xf7\x1e\x4f\x7e\xef\x6b\x30\xd3\xe4\xf8\x8c\x64\xc2\xda\xd6\x37\xc6\x98\x7d\xdc\x82\x92\x4b\x95\xe8\x3a\x5a\x62\xa4\xf3\xa2\xf1\x82\xc4\x12\x94\x71\xa3\x17\x42\x51\x14\x6c\x9d\xbb\xd1\xd5\xb6\x76\xa3\x54\x2e\x68\x46\x2d\x67\x92\x3a\x4c\x39\xd3\x4c\x08\xe5\x54\x6e\x50\x96\xcd\x66\x32\x73\x4b\xb7\xe0\xa7\xd9\x7f\x72\x9c\xf8\x7f\x77\xe9\xf6\xa5\xca\xc0\xd5\x14\x51\x62\x83\x78\xf7\x46\xea\x6f\xb6\x99\x72\x24\x7f\x2e\x96\xed\x8b\x2a\x22\x08\xc1\x5e\xd8\x04\xa2\x47\x08\xfa\x38\x08\x90\x59\xaa\x07\xde\x0a\x41\x99\xb0\xbc\x5d\xf0\x71\x07\xb8\x8c\x1b\x19\xb7\x96\xe2\x88\xbb\xca\x57\x66\xf2\xea\x9d\xaa\x01\xdc\x1a\x2d\x03\x23\x4a\xf9\x6c\x96\xf0\xd7\x6a\xa1\xb2\xdf\xcb\xfe\xe4\xeb\xec\xae\x0f\xcb\xc7\x1c\xbc\xd2\xe7\x9d\x3a\xe9\x0b\xf0\x78\xf3\xb0\xd8\x59\xa6\x39\x85\x8c\xb3\x51\x82\xfd\x0e\x6d\x51\x1c\xb8\xa7\x84\x43\xa4\x2d\xf5\x0d\xa7\xb0\xb2\x18\x08\x63\x16\xea\x87\x41\x0b\x18\x90\x9c\x0d\x7e\x33\xd2\xb8\x33\x6e\x2d\x39\xa3\x6a\x0f\x7c\x84\x8c\xf9\x3a\x80\xfa\x59\xa7\x9c\x65\x0b\xca\x84\xbd\x3e\xb2\x74\x4d\xb6\xf0\x24\xa1\xfb\xe9\xfe\xe6\x7e\xb6\xdd\xd6\x09\xce\x9c\x8d\x69\xc8\x77\x55\xac\xf3\x76\x1b\xe2\x7a\x64\x1e\x74\x69\x4d\x74\x59\xb3\xf4\x0b\x7a\xcc\x2f\x8a\x23\x04\xf3\xe1\xe6\x4b\x79\xfe\x13\x77\xe1\x5c\x78\xbd\x8b\x3a\x5f\x87\x10\xb8\x96\x02\x49\x09\x2b\x37\xc8\x9d\x89\x07\x3a\x37\x34\x1e\x80\x0d\x21\x7a\x3f\xae\x8c\xac\x42\x85\x28\x08\x87\xce\xae\x0f\x36\x61\xb5\x7c\xde\x9c\x7a\xa3\xdf\x9f\xf4\x10\x69\xf6\xd7\x27\x9c\xc4\x09\x38\x7f\x7b\x4c\x14\x3f\x7e\xba\x99\x82\x9a\xc7\xdb\xc7\xa3\xa1\xfb\x31\xce\xe6\x14\x6c\x5f\x45\x34\x39\x0c\xbb\x1d\x20\xb1\xb3\xca\x1e\xc6\x3d\xdf\x4d\x3f\x24\x58\xd0\x17\x7d\x54\x08\xb8\xe7\x15\x20\x28\xda\x55\x8e\xc7\xcd\xf9\x78\xee\x8d\xb0\xda\xce\x88\x58\xad\xe1\x0a\xd8\xbe\x27\x6d\xbf\xb0\xd2\x1a\xb7\xe1\x92\xc6\x8d\xf3\x84\x01\xe4\x0e\x07\x80\x2d\x1b\xb7\x39\x62\x3b\x36\xf0\x81\x69\x66\x8c\x96\x9d\xe4\xd8\x20\x82\x98\xe1\x38\xf9\x34\x35\xcb\x16\xe6\x14\x5b\xe3\x53\x05\x7c\x5a\xc3\xc7\x9d\xf5\xed\xeb\x64\xf3\xc7\x2b\x7d\xba\x0f\xaf\x6e\xff\x2e\x39\xbf\xe3\x00\xe2\xb1\x51\x0a\xea\xb8\x03\x2a\x75\x83\x7b\x2f\x8d\xad\x9d\x77\x7d\xce\x9d\xd2\x5a\xc7\x4c\x33\x4f\x75\x9e\x06\xe7\xe9\xd8\x02\x5d\xd5\x25\xf0\x51\xf1\xd8\xe9\x83\x8a\x7d\x2e\xbd\x56\xd6\xcd\x74\x2a\x9f\x06\xac\x95\xd3\x7c\x00\xb0\x33\xc6\xe7\x9e\xd7\x52\x69\xa1\x8c\x30\xea\x79\xcf\x05\x96\x6c\x25\x4c\xa5\x44\x88\xbb\xad\x6b\x36\x52\x59\xeb\x65\x96\x2d\x32\xf1\xe2\x67\xe5\x82\x9e\xf6\xe6\x1f\x24\xee\x81\xb7\xfa\x3e\x49\x8b\xe8\xe6\xf1\xe6\xd7\x9f\x6e\x1e\x6f\xde\x5d\x9d\x5a\x9f\x6f\x46\xdc\x5c\x88\x2d\x0d\x8c\x3e\x12\x0a\xca\x40\x69\x70\x81\x50\xcf\x46\xc3\x69\xc0\x6c\x41\x9f\x0f\x60\xd5\x47\xd8\x3e\x53\x2f\x58\x83\xf2\x7a\x74\x65\x6e\xc7\x26\xc7\x68\x57\xe3\x95\xab\x7b\xb6\x3a\xce\xc4\xf2\x5c\x16\x87\x94\x93\xfe\x3c\xfb\xa7\x5f\xe4\xa3\x27\x75\x8b\x73\xb9\x26\xcf\x1a\x88\x76\xad\xe9\x56\xf5\xa0\x01\x1e\x28\x72\x88\x6e\x73\xad\xbc\xd1\x2c\xf2\x85\x47\x94\xf8\xd6\xad\xdc\xe0\xcc\xda\x48\x85\x95\xd8\xba\xc6\x4d\xa1\xe9\x2c\x93\x2f\xbc\x58\x25\xdc\xf8\x2f\x12\x3b\x46\x9a\x56\xfa\x91\xd7\x3d\xe3\xbb\xa6\xe4\xbc\xcf\x57\x23\x13\x85\x8c\x2d\x33\x8c\x20\xce\x61\xac\xf3\x95\xa4\x9e\x88\x48\x3d\xb1\x46\x15\x36\xb8\x10\xa9\x91\x55\x03\x27\xff\x65\xbd\xf0\x96\xa2\x78\xe8\x8c\xcf\x32\x90\xc9\x17\x36\x83\x0b\x77\xb6\xd1\xf7\xb7\xf9\xfc\x44\x61\xf9\x4a\x26\xf0\x6e\x32\xd7\x47\x12\xf8\xf3\x89\x5f\xce\x3f\x2f\x1d\x84\x20\xf4\x31\x88\xa1\x6e\x9a\x7a\x03\x37\xa6\x85\x9b\x1d\x13\x1a\x1c\x86\xd8\x41\xc9\x25\x97\x10\x72\x2a\x19\x43\xd0\x80\x6c\xe1\x38\x46\x3e\xca\xed\x61\x0a\x76\x8f\xb8\x9c\x7e\x30\x0d\x28\xc3\x06\x43\xbb\x02\x1d\x62\xc2\x48\x86\x20\xe7\x46\x32\x88\xcc\x21\x5b\x24\xfd\x08\x9c\xee\xc1\x9f\x66\x7f\x7e\xea\x92\x1c\xf9\xc1\xdf\x9d\x6e\x07\xb8\xae\x23\xde\x1e\x11\xf5\x57\xd3\xf3\xf3\xa7\x87\x65\x71\xff\x74\x29\x85\xfd\x35\x98\xdc\xe2\x2f\xfe\x12\x24\x44\x40\xae\xd7\x07\x0e\xd0\xce\x54\x65\xb3\x16\xeb\x31\x80\xb5\x64\xb1\x04\x55\xea\xcc\xed\x29\xdf\xc5\x03\xc8\xc2\x38\x04\x50\xc6\x2d\xd8\xf1\x72\x9f\x13\xc3\x98\x2c\x95\x41\x54\x83\x15\x12\xe3\x90\x93\x71\x98\xf7\x2b\xe3\x1c\xc8\x64\x55\x39\xe5\x4c\x94\x5c\x58\xce\xb0\x50\x56\x70\xef\x9f\xb7\x8c\x15\x28\xf1\xff\x4a\x46\x88\x77\x5e\x62\x03\x35\xf2\x11\xca\x23\xf6\x49\xe5\xab\xe4\x33\xbf\xc9\xbe\xcd\x70\xf2\xf9\x17\xd4\xf3\x59\x86\xfc\xe6\xe1\xe6\xfb\x0f\xf3\xef\xce\x49\x4a\x91\xfa\x92\xf3\x0f\xe0\xca\x5f\x3d\x3d\xa4\x3d\xfd\x30\xcb\x28\x2a\xd0\x6f\xca\x82\x20\x5c\x72\xae\xb1\xd5\xc6\x73\x95\x97\xa0\x5a\x69\x21\x58\x27\x07\x56\x2b\x8e\xe3\x9e\x7f\x6e\x73\xc1\x2c\xa1\x88\x33\x54\xb5\xe5\x4b\xa6\x77\x65\xb3\xb0\x4c\x78\x4f\xc8\x5e\x2a\xcb\x64\x90\xb1\x05\xca\x58\x8e\xb8\x81\xd5\x7e\xca\xe3\x50\xb5\x45\xc8\x4a\x0e\xda\xe8\x5d\xe5\x2b\xd6\xc7\x43\x63\x5c\x9f\x66\x00\x45\xbe\x9b\x91\xc4\x3f\xf7\x5a\xd5\x3c\x16\x6e\x5e\x3d\xfe\xdd\xf2\x31\xc7\x47\x3d\x59\x11\x0f\x63\xab\xf2\x6a\x17\xa9\x60\x8a\x71\x46\xe4\x4a\x19\x24\x17\x4e\x79\xe5\x62\xe7\xac\xd9\x33\xa6\x18\xe3\xc8\x34\x1d\x63\xa9\x6f\x56\xbf\xb0\xc4\x57\xf4\xca\x0d\x78\xec\xa7\xfc\xef\xaf\xf1\xec\xf2\x95\x41\xf9\xac\x7b\x7b\x1e\xfd\x3b\x77\xcf\x92\xe8\xcf\xd7\xa2\xde\x29\xc3\xbb\x7b\xb8\x7d\x3c\x71\x7c\x3e\xbe\x72\x7c\x9e\xc7\xf2\x68\x81\xf7\xdb\xd8\x21\xe0\x1b\x2d\x15\x65\xb1\x46\x6e\x4d\x02\x24\x38\xee\xb6\x1c\x13\xee\xd4\x06\x60\x58\xc5\xcd\xf6\x00\xd6\x6a\x50\x6a\x50\x46\x46\x0f\x38\x65\x0e\x75\xbb\xdd\xa8\x39\xf6\x98\x95\x7b\x3e\x00\x06\x28\x8b\x76\x3b\x08\xa5\x09\xdd\xa8\x05\xb3\x26\x1a\x69\xa5\x54\x9c\xc5\x2d\xc3\x15\xd1\xa4\x26\x88\x2a\x50\xa1\xca\x30\x6b\x31\x01\xe1\x18\x3c\xb7\xd3\xbf\xb1\xa3\x84\xb6\x62\x46\x43\x47\xfa\x30\xda\x91\x0a\x56\x2b\x6d\x8d\x10\x21\x97\x59\x36\x2b\xca\x17\x31\xf7\x0b\x97\x95\x09\x19\xf1\xe7\xd3\x9d\x39\x51\x94\xdd\xfd\xb8\xd5\x7d\xf3\x95\x56\x77\x51\xed\x85\x63\x64\x37\x7a\x9a\x67\x31\x0b\xdb\x6d\x93\x53\x65\x8c\xae\x8c\xd5\x53\x7e\x8b\x88\x3a\xc0\xe0\x94\x88\x66\xbe\xb6\x4c\x2a\xaf\xa3\x76\x4d\xb4\xde\xea\xaa\x82\x0e\xc1\x97\x8c\x31\xe4\x10\x1c\x70\xa8\xa0\x91\x49\x63\x45\x17\x78\x59\x2f\x7c\xf6\x5f\x67\x7f\x96\xfd\xcb\xec\x7f\xcc\xfe\xe7\xb3\x7e\xc9\xf1\x27\xa4\xb6\xf4\xb1\xd1\xf5\xf0\xda\xbf\xfb\x38\x6d\xe8\xd3\xbb\xef\xa7\xbd\x7c\x9b\xb6\xf7\xfd\x71\x7b\x17\x27\x9c\xe6\x85\xc5\xff\xfb\xf9\xc7\x4f\xf7\xdf\x82\xad\xaf\x20\x30\x8c\x51\x85\x02\xde\x11\xac\x31\x67\xa1\x0a\x46\x22\xe3\x7b\x24\x41\x3f\x50\xa4\x31\xe7\xdd\x9c\x90\x7e\xc3\xf9\x4b\x56\x6d\xa5\x15\x44\x17\x50\x28\xd3\xf1\xd5\xba\x8b\x3b\xbc\xf6\x16\x40\x35\x65\x06\x0b\x8f\x30\x1c\x7b\x2e\x4a\x87\x1c\xa5\x94\x31\xdc\x39\xc3\xad\x05\x8c\xc4\xb0\x9a\xde\x60\xa4\xb7\xdc\x72\x41\x1a\xa6\x91\x34\x11\x5a\x2b\x18\x84\x0e\x31\x46\x2c\xc4\x02\x92\x23\x37\x5e\x51\xe8\x17\x96\xe2\xfe\x77\xd9\x87\xec\x5f\xbd\xce\xe2\xbc\xce\x55\x3e\x3d\x16\xaf\xb8\xbd\xcb\x4c\xc9\x65\x0a\xe0\x4b\x4d\xb6\x8f\x9f\xee\x67\xa6\x06\x59\x33\x0c\xcd\x4b\x56\xaf\xd7\x3b\x80\x50\x55\xa3\x1c\x8f\x2d\xe1\x0d\x44\xba\x93\x3b\x50\xe7\x90\x2b\x50\xc5\xbd\x56\x9c\x41\xc2\x55\x1c\x00\xe1\x34\x36\x0b\xdb\x36\x4d\xf0\xde\xb9\x10\x15\x63\x48\x79\xed\x9f\x43\x5e\x23\x64\xd7\xeb\x50\x6b\x05\x7d\xec\x18\xaf\xa6\x4b\x4a\xbd\x66\x3c\xcb\x96\x79\xf5\xc2\x97\xcd\xc2\xa5\x0c\xed\xfe\xd2\xcf\x3e\xf9\x97\x23\xe0\xfa\xfd\xa9\xd3\x95\x82\xaa\x44\xcd\x39\x4f\x1a\x3a\x57\x73\xa4\x5f\xe5\xa6\x9c\xf6\xe8\xfd\x6d\x71\x1a\x8e\x9f\x49\x57\x55\x39\x37\xdd\xb0\x67\x71\xfd\x92\xed\xe2\x8a\x1e\x56\x52\x50\x66\x0f\x40\xb4\x36\x56\xc4\x8c\xa6\xae\x0f\x43\x0d\x42\x48\x2d\xca\x55\x64\x79\x39\x1e\xea\xe4\x76\x28\x58\xc7\xdd\x90\x1f\xa2\xe9\x00\x89\x03\x58\x03\xb4\x70\x18\x41\xe7\x24\x45\x8e\x48\x39\x19\x44\x42\x29\x92\xf5\x8a\x1a\xc2\xf1\x67\x5e\x70\x29\xa5\x34\x6b\x1e\x57\xc2\xad\x56\x4e\x00\xc6\xd7\x53\x6c\xe4\xb4\xd6\xd9\xcf\x40\x9a\x8d\x9d\xb7\xc9\x83\x1f\xbb\x5d\xc7\x1a\xd3\x51\x79\xfd\xef\xb3\xff\x9c\xfd\x97\x0b\xeb\xe4\x79\x0e\xf1\x95\xfd\xef\xfb\x0f\xef\xff\x31\xa4\x93\xc5\x31\x48\x3d\xf9\xb6\x4f\xf7\x49\x7b\xe8\xc4\x4b\x75\x0e\x58\x67\xdb\x7d\xe9\x4b\x40\xe2\x9e\x6f\x74\xa3\xc8\xca\xac\xf1\x36\x2f\x39\x31\x58\x7c\xb6\x53\x62\xee\xce\x72\x81\x39\x57\x32\x31\xcb\xd0\x88\x9d\x3b\xd3\x4a\xae\x17\xe5\xf3\x16\xe6\xbb\xfa\x73\x1f\xc0\x1e\x8e\xdd\xa6\xae\x8b\xb6\x69\x46\x9b\x48\x31\x4e\xc7\xac\xd7\xde\x6b\xb7\x73\xd6\x0e\x5d\x6d\xfc\x0e\x18\x21\x98\xe0\x2c\x76\x03\xe9\x59\x1b\x03\xa3\x95\xaa\x48\xe9\xc1\xc6\x93\x96\xc4\xb5\xa2\xe3\x1a\x91\x9c\xd3\x08\x53\x8b\x95\x33\xb6\xa2\x2b\x96\xcd\x40\xc2\xc8\xcc\x61\x76\x97\xfd\x59\xf6\x57\xc7\x19\xab\xd3\x5a\xf8\xf4\x15\x6e\xbf\x8b\x55\xbf\x4c\xda\xbe\xf6\x76\x1f\xa7\x6b\xf3\x65\xef\x17\x6c\x40\xe6\xf7\xfb\x84\x8a\xa5\x5e\x1a\xd5\xc8\x21\xef\x41\xe5\x01\xd9\x9a\x8e\x77\xd6\x9b\xa0\x5a\xbd\x1a\x21\x38\x24\x69\x2e\x0c\x36\x75\x1d\xcb\x02\xd6\x39\x1c\x77\xa9\x11\x4e\xc6\xa1\x9e\x75\x5a\x5b\x4d\x84\x62\x9c\xef\x76\x41\x68\xd3\x58\xad\x6d\x2b\xbc\xea\xe3\x1e\x54\xad\xd2\xa6\x7e\xa6\xd6\x19\x27\x9f\xeb\x2e\xef\xb5\x35\xce\xd8\xee\x88\xad\xcc\x87\xc4\x7d\x79\x54\x22\x48\x38\xa6\xb7\x5a\x84\x09\xb6\x7f\xd6\x18\xd9\x7a\x02\x4c\x33\x25\xe5\x05\x3f\x6c\x0a\x16\x2b\xc2\x4c\x2f\xe7\xfe\x07\x5b\xcf\xe4\xe7\x76\xe1\xb0\xb0\xd6\x5b\xef\x2d\x99\xec\x0a\x8d\x4d\x22\xc1\xfb\xdd\x84\x3b\xb1\xc5\xfe\x34\x6b\xf9\xef\x4e\xab\xef\xc8\x0f\xf2\x7f\x7f\x55\x1b\xea\xee\x28\x7d\x77\xd1\xc2\x9e\xb6\xdd\x57\xd8\xc6\xd2\x85\x3f\x5d\xf1\xdb\xe4\x3a\xef\x96\xc5\xd3\xc3\x62\x79\x7b\xf7\xf4\xf0\x47\xe0\xf1\x34\xf3\xf5\x35\x4d\x29\x14\x2a\x08\xc2\xe8\xf2\xed\x88\xf2\xa1\x12\x9a\x6a\xd8\x62\x58\x8d\x64\xaf\x8f\xeb\x69\xa4\x2e\x0e\xc2\x57\x50\x63\xb8\x3b\x0c\xc3\x30\xec\xc7\xde\x55\x50\xd6\xce\x39\x30\x65\xac\x55\xd5\x97\xd5\xf4\xc1\x6c\x4f\xb0\x42\x84\xb3\xca\x40\x12\x07\x83\x88\xa1\xa0\x42\x06\x16\x7b\x84\x51\x34\x54\xf1\xb8\x0a\x95\x2d\x69\x97\x6f\x14\x63\x35\xa5\x87\xad\xa9\x09\x46\x94\x19\xad\xb5\x56\x56\xe4\x15\xac\x54\xbd\xb7\x3b\x42\x10\x8b\x48\x57\x15\x1f\xb4\x5e\xab\xe3\x2c\x25\x12\x02\x49\x01\x71\x50\xcc\x48\x69\x2a\x27\x7e\x74\x5d\x59\xf6\xb7\x69\xc6\xf8\x55\xf7\xf8\x1f\xbc\xae\x5f\xe7\x70\x3b\x5e\xd5\xd4\xce\x7c\xb8\x5c\xc8\x9f\x1a\xd3\xf9\x47\x5c\xc8\x1f\x76\x0e\xa2\x1e\x11\xc3\x68\xb7\x6d\x9a\xa6\xd9\x8f\xab\x80\xcd\x0a\xe0\xd5\xf4\x6f\xb6\x21\x48\x21\x4c\x49\x65\x2a\x12\xb7\x06\x13\xcb\xfe\x81\x8b\x07\x38\x16\x82\x52\x21\x8c\xb5\xc6\x1b\x67\x6d\xee\xa8\xd8\xb5\xd6\x1e\xbc\xdf\x3b\xf4\x53\x97\x2c\x9b\xe5\xd5\x8b\x58\x9a\x22\x24\x2d\xc6\xbf\x49\x9e\xe0\xf6\xfe\xa6\x5a\x7e\xf8\xf9\x1f\x80\xf9\xa9\x2e\xf4\x76\x7f\x3f\x3d\x3e\x9d\xfa\x5b\x3f\xf5\x59\x71\x02\x53\x9c\x21\x03\x4b\xf5\xb9\x77\xde\xe6\x96\x08\xd9\x58\x4e\x19\xa1\x8e\x71\xa1\xb9\xef\x2c\xde\xe6\x6b\x2c\xd4\xda\x52\x25\x24\x73\x54\x0a\x45\x55\xeb\xf0\xbe\x01\xab\xcf\xcd\xd6\x77\x1e\xc8\x22\xd8\x68\x63\x7f\x10\x20\x03\x04\xac\x6a\x55\x95\x52\x61\xac\x28\x0e\x8e\x13\x41\x85\xe2\x95\x82\x48\x56\xa5\x52\x8c\x49\xc6\xeb\x86\x53\x4e\xb9\x12\x95\xaa\x46\xc1\x8d\xe9\xfb\x3d\x4b\xfd\x85\x6f\x32\xf5\xa2\x97\xa1\xf0\x6f\x78\x25\x1e\x32\x32\x45\xf3\xef\x4e\x41\xd6\xfb\x2f\x9e\xc1\xc9\xdb\x4d\x5e\x6e\x7e\x95\x5f\x7e\x7c\xff\x5a\xb2\xfc\xb8\x02\xdb\x88\xec\x6e\x07\x36\x60\x88\xc4\x6e\x36\x60\x7b\x7a\xe7\x87\xcd\x22\x8c\x55\x41\x0f\x43\xa1\x9e\x0f\x40\x7b\x04\x83\xd1\xda\x89\x9e\x6d\x8b\xbd\x43\x6d\x6d\x5c\x23\x6a\xb6\x2a\x7c\x5c\x69\xa3\x2f\x0f\x71\xeb\xa2\xf1\x1e\x84\x92\x61\x4c\x98\x11\x54\x32\xcb\x7b\xc6\xe8\x94\x7b\x09\x6a\x78\xb6\xc8\xcc\x8b\x5c\x76\xc5\x26\xfb\x79\xf6\x6d\xf6\xd7\x27\x4f\x96\xbd\x3b\x2b\x42\x3e\xa4\x54\xeb\xe9\xf1\xc3\xc3\xfc\xf1\xd3\xfd\xfb\xb7\xb4\xd2\xe7\xff\x9d\xe0\x4d\x09\xdf\x9e\x02\x93\xe5\x4f\xf9\x36\x0f\x44\x55\x79\x04\x81\x74\x10\xed\x9e\xcd\x80\x03\x60\x6b\x1a\x37\xb9\xf7\x93\xd7\xca\xf5\x18\x92\x2c\xef\x74\xd0\x71\x4d\x37\x00\xf1\xd2\x23\x13\xeb\xb8\x56\xb9\x19\x6b\x27\x95\xd0\xd0\x33\x1a\x71\x08\x67\x6f\x56\x58\x88\x30\xa6\x86\x51\x63\xac\xb5\x2b\xa4\xe5\x4b\xc6\x14\x53\x4c\x97\xa8\xc4\x9a\x78\x4e\x44\xae\x59\x33\x1e\x38\x2b\x75\x49\xd1\x2a\x0f\x1d\x3b\xf0\x6c\x36\xeb\x33\x92\xfa\x45\x47\x5c\x0f\x3b\x4f\x8d\x1c\x53\xe4\xdb\xab\x76\xd1\x8f\x24\xcd\x6f\xce\x90\xaa\xe3\xb0\xce\x45\x2c\x60\x8e\x7a\x7f\xe0\xfc\x40\x24\xd1\x4c\x1a\x21\xad\xa5\x92\x50\x48\x29\x94\x5a\x75\xd3\x62\xda\xf7\x80\x4d\x81\xbd\x90\x5c\x0a\x31\xdf\xd5\x75\x3c\xb8\xb8\xdb\x12\xa9\xb8\x11\x4a\xd9\xc6\xed\x35\x2f\x43\x25\x6a\x29\xb5\xb5\x20\xf3\xc1\x4d\x89\xe5\x21\x84\xd8\x31\xa1\x25\xcb\xb2\xdf\xc9\x6c\xb2\x57\xbb\xec\x9b\x2b\xb5\x8a\xbf\x4a\x31\xd9\xff\x70\x9d\x5b\x4e\xeb\xf0\x4b\xd8\x64\xc2\xe6\x9c\xe2\xae\xf9\xe9\x46\xce\xaf\x96\xe3\xfb\x2b\xae\x96\xe3\x6d\xcf\x4b\x82\x00\x7d\xde\x01\x02\x51\xae\x0a\x16\x21\xcf\x6b\x61\x31\x83\x12\x23\x38\x06\x69\xd5\xc6\xac\x42\x8e\xc6\xed\x74\x3c\xcb\x04\xad\x0d\xa3\x99\xd5\x16\x59\xc7\xbc\xe3\x52\xd4\x91\x86\x58\x1f\x69\x53\x72\xef\xc1\x6a\xec\x8b\x5d\xe2\x49\xc5\x55\x44\x32\xca\x06\xda\x4a\x81\x4c\x30\xa5\x3d\xc0\x22\x1e\x04\x32\xc2\x30\x44\x30\xd3\x02\x53\xac\x18\x8f\x82\x31\xd0\xed\x5d\xd9\xa8\xa3\x0e\xf0\xd2\x16\xe6\xc2\x82\x7e\x8c\x47\xff\xc3\x6f\xe1\xd3\x3c\x79\xb8\x6b\x63\x0c\xee\x96\x8f\xff\xc8\x6f\x7a\x07\xd1\x2a\xd9\xde\xf5\xbe\xeb\xba\x0e\x64\x63\x13\x20\x32\x2b\xc0\x13\xf9\x66\x21\x1d\x5b\x4b\xc3\xd9\xfa\xd0\xf7\x7d\x0f\xca\xd1\x07\x88\xcd\x06\xf0\xed\xf4\xaf\x30\x98\x31\x4c\x38\x97\x4e\x19\x63\xb5\xd5\xb9\x40\x50\xac\xbc\x52\x5b\x63\xb6\x3a\xdf\x62\x27\xaf\x3f\x95\x18\x8a\x75\x38\x7d\x9a\xcd\x12\x06\xc6\x15\xeb\x64\x6f\x59\x26\x4e\xf6\xb6\x38\xda\xdb\xe5\xed\x85\xa6\xff\xd5\xa6\xde\x3f\xa5\xd1\x89\xf9\x8f\x69\x94\x8f\x1f\x81\x8b\xb9\x3d\x46\x2b\x4b\xfd\x9b\x83\xf1\xba\xc0\x64\xbb\xdb\x39\xcd\x85\x08\x32\xc8\x60\xf7\x00\x6f\x31\x60\xb3\x92\xc4\x3d\x90\x07\xd5\xca\xc6\x24\x2a\x64\xbe\x02\x70\x83\x81\x88\x7d\x3e\xfc\x50\xed\x02\x80\x21\xb7\xc5\xda\x45\x15\xbb\x78\x10\xa0\x04\x0c\x6c\x3b\x85\xa4\xae\x28\xd5\x8c\xd6\x2b\xa7\x14\x77\x9a\x57\xba\xc2\xd3\xdb\x52\x68\x65\xd6\x6b\x2d\x84\x90\xe9\xdd\x51\x88\xc9\xe8\x1e\x92\xd1\x5d\x1e\x71\xb6\x89\xe3\xe4\x0f\xb3\x7f\x7d\xba\xbf\xff\xf1\x4d\xce\x71\x4a\x02\x2f\x29\xc7\xb7\x77\x69\xf0\xee\xee\xc8\x3c\xfe\xa6\xd1\xbb\xb8\x96\x38\xfe\xf8\x8a\x06\xbd\x2e\x08\xcf\x82\x2d\xab\x1c\x33\x13\x1a\xba\x5f\x35\x71\x8d\x7a\x57\x33\x2e\x3b\xe0\x0c\x8f\x52\xfb\xcf\x55\xde\x6b\x5f\x02\x48\x98\xe2\x8e\xab\xe4\x1a\xa9\x1b\xe4\xe0\x63\x0f\x14\x57\x86\x33\xc9\xc7\xfd\x42\xf8\x6b\x36\xf7\x64\xac\x3a\x04\xa1\x56\x0c\x41\x0b\x19\x83\xae\x84\x8a\x12\xad\x3c\xa1\x14\x83\x4c\x7b\x5d\x5a\xa3\xb8\x8f\x42\x0b\xe4\xa0\x00\x6c\x17\x8c\xdb\x58\x46\x39\xa6\x4c\x44\x37\x76\x84\xe4\xa2\x61\x03\xdb\x1c\xed\x37\x5b\x86\xa2\xc9\x3e\x5e\xd8\xf4\xfe\xd3\xf1\xca\x9c\x4c\xd7\xcd\x1b\xcd\xa3\x2b\xfc\xef\x75\x57\xe6\xd3\x79\xfe\xe6\xd5\xb2\x9f\xc3\xed\x2f\x3b\x4d\xf9\x86\x2b\x25\x38\x11\x4a\x7b\x6d\xb9\x80\x4a\x10\x3c\xc4\x1d\x05\x64\x57\x56\xeb\x3d\x03\xb0\xab\x60\xd8\x31\xad\x10\xd2\x04\x39\x4c\x43\x4b\x01\xc9\xab\x22\xc4\xc4\x51\x0f\x86\xcf\x03\x18\x52\x76\xe2\xc2\x7e\x0f\xdc\x7e\x3c\x3e\x15\x8d\x42\xd0\x62\xa4\x28\xa9\xe3\xa1\xf5\xd0\x41\x29\xa1\x63\x86\x05\x8c\x2d\x35\x4c\xc1\x8a\x50\x0d\x11\xc1\x84\x50\xcc\x29\x42\x06\xa3\x71\xa3\x8f\x38\x00\x0d\xf8\x94\xab\xad\x8c\x31\x29\x96\x33\xcb\x50\x0c\x6f\x7a\xa1\x93\x85\xf8\x8b\x8c\x66\x7f\x75\xe6\xe0\x78\x4a\xea\x21\xef\xde\xf0\x87\xfd\x88\x4b\xec\x61\x79\xb2\xa3\x27\x76\xc1\x4f\xf7\xdf\x1e\xc0\x10\x80\x08\x60\xf8\xcd\x3e\xa4\x1e\xd1\x30\xfd\xc5\x3e\x57\x57\x7f\xfc\x50\x2d\xf6\xbf\xa9\xba\xb9\xdf\x11\xb0\x3b\x6c\x72\x54\x55\x71\x08\x33\xfd\xb9\x06\x12\xec\xf0\x38\x54\x45\x8b\x31\xc6\x91\x83\x92\x4d\xff\x36\xe9\x71\xab\x58\x3c\x50\x63\x10\xd4\x6c\x4b\x51\x5a\xff\x69\xae\xb4\x68\xb3\x79\x76\x93\xfd\x37\xd9\xaf\x53\x25\xec\xdf\x1f\xef\xf2\x87\x8f\xef\x4f\x25\xdd\xa7\xc7\x9b\xfb\x13\x4f\x64\xfe\x55\xf5\xa5\x69\xa7\xbc\xbf\xbb\xd4\x15\x12\x86\xe5\xe6\x4c\xc6\x7a\x9a\x3b\x04\x2b\x63\x77\x62\x03\xb0\x33\xc1\xb8\x31\x14\xd0\x97\x10\x78\x85\xb4\x0e\xca\x29\xe5\x55\x90\x82\x97\x95\x0a\x6b\x0e\x87\xaa\xa4\xcf\x99\x63\xc2\x73\x2e\x36\xa0\xca\xed\xe8\x73\x44\xa8\x92\x5e\xb7\xad\xab\x8b\x96\xad\x9c\x76\x62\x0b\x70\xdc\x6c\x63\x0b\x6a\x24\xb9\x8f\x9b\x56\x4b\x27\xad\xe5\x86\x5b\x5b\xc3\x4a\xae\xa3\x09\xeb\x12\xc1\xe6\xc0\x84\x18\x7b\xb0\x25\xd8\x1a\x68\xd9\x4b\x86\xa9\xd0\x5a\xee\x61\x5b\x2b\x6d\xc3\xc9\x16\xb0\xe5\xaa\xa8\xb3\xf9\x29\xf7\xfe\xdb\x13\x0e\xf0\xcc\x69\x78\x77\x7f\x21\xe4\xbf\xfb\x63\xf0\x96\x35\xf8\xfb\x0f\xf7\x37\x9f\xee\x96\xb7\x0f\x4f\xb3\xf9\x87\x94\x46\x7e\x0f\xce\xbb\xfe\xe3\xa7\x29\xf5\x3e\xa6\x66\x8b\x03\x45\x01\xb2\xb8\xad\x2b\x10\xa2\xaf\x28\x9f\x52\x4a\x52\xc2\x8a\x20\x87\xa4\xd4\xba\x5e\xb1\xc1\x71\x14\x83\xaf\xea\x10\xeb\xe8\xb1\xd7\xb3\xa1\x7a\xa6\x60\x1f\xab\xe9\x38\x1c\x62\xe5\x8b\x6c\xcc\xc2\x14\xc5\x15\xb5\x76\xc4\x69\xdc\xd7\x4e\x39\xa1\x78\xd0\xb4\xaa\x3c\x69\x74\xab\xb9\x13\xaa\xe9\x62\x5d\xb9\x2a\x38\x5c\x05\xd0\xb8\x3a\xb6\x6c\x4b\xf7\x25\xc4\x05\x8a\x1b\x2d\x53\xed\x78\xf5\xc2\x97\xdd\x2c\x4b\x75\x97\xc7\x4b\x05\xed\x8a\xaa\xec\x7c\xab\x8f\x34\x19\xef\x6f\x8b\xb7\xb3\xef\xef\x12\x20\xf0\x8b\x21\xcb\xf3\x26\x3f\xab\x0e\x3c\x3e\xdd\xcf\xb8\x83\x30\x57\x3e\x0c\x20\xa3\xb1\x8d\xfb\xb8\x89\x5b\xbc\x59\x71\x4e\xb8\xd8\x33\xe3\xbd\x89\x28\x0e\x53\x56\x8c\x28\xe2\x44\x75\xcd\x21\x14\x65\xde\xc5\x3d\xe8\xa2\x48\x4a\x16\xe5\x67\x99\x57\x47\x3a\x55\x42\xb4\xa3\xa6\xac\xf6\x71\x3f\xcb\x30\x82\x46\xd0\x13\xb1\x86\x85\x18\x61\x84\xa4\x15\x04\x61\xea\x7c\xdc\x07\x6f\x4c\x59\x57\xc2\x07\x00\x9f\xe1\x4c\x47\x61\xb8\x11\x5a\x98\xe9\x81\x62\xae\x0d\xae\x20\x3f\xf6\x0b\x12\x7f\xd4\x5d\xf6\xc7\xa9\x32\xfc\x37\x47\xed\xf7\xc5\x95\x50\xcc\x9b\xeb\x31\x25\x69\xef\xef\x6f\x2e\x08\xa6\xe3\xb8\xf5\xe3\xcd\xa7\xb3\xde\xf7\x2b\x1f\xc0\x2c\xf8\xb2\xca\x4b\x11\xda\x15\x8d\x87\xcd\x3a\x1e\xc8\xaa\xe6\x14\x13\xd3\x69\x6d\xab\x96\x46\xf1\x0c\x73\xbf\xdb\x6e\x83\x85\xb1\x8e\x1c\x32\x12\xa6\xdf\x3e\x45\x34\x73\x1b\xa2\x38\xd2\xab\x15\x1a\x41\x68\x9c\xc0\xc8\x61\xc9\xb1\xab\x30\x26\x18\x29\x85\x38\x91\xac\x8d\xda\xdb\xb6\x82\x96\x13\x5f\x02\x1b\xeb\x0a\xac\x6c\x1b\x69\xa4\x9c\x83\x75\x3c\xd4\x17\x9f\xd7\x24\xa6\xc0\x29\x36\xfd\xbb\x84\xdd\xca\x7e\x72\x87\x9f\x6e\xfb\x57\x46\x9e\xe7\xd3\xf1\x53\x11\xf9\x1c\x4d\x1b\x7c\x27\x68\xe3\x06\xdd\x87\xb6\x9f\x42\x11\x8e\xb0\x6a\xa4\xd0\x0e\xc7\xe1\xb3\xe8\xc2\x3e\x74\xdd\xf6\x19\xed\x3b\xc0\xf6\x7b\x70\x50\x8a\x4a\x68\x28\x8d\x30\x84\x33\x28\xa0\x68\x10\x23\xe1\x25\xdb\x58\xe5\xb5\x6f\xa8\x63\x5e\x07\x42\xcc\x5a\xb4\xa6\x19\xd6\x42\x08\x31\x6d\x77\xce\xf9\x7e\xdc\x73\x5e\x99\x92\xa2\x21\x6f\x56\x7c\x7f\xe2\x85\x3b\xda\xeb\x36\xfb\xe5\x25\x0e\x3f\x0d\x0b\xdc\x9e\x91\x86\xc7\x3d\x7d\x15\x90\xdf\x3f\x2d\xe6\x1f\xde\x7f\xff\xe1\xda\x46\x3f\x1c\x49\x98\x53\x2d\x78\x8a\x2a\xd4\xb8\xcb\x37\x4c\xe5\xb4\x36\x96\x50\xa7\xb5\x72\xd2\x1b\x25\xb4\x0b\x74\xbf\x7a\xde\xaf\xe3\x5e\x02\xc8\xe5\x7a\xd6\x18\x05\xb6\xbf\xd1\x60\xc0\x24\x84\xc2\x3d\xbb\x3d\xe8\x58\x35\x76\x24\xdf\x61\x4a\xa4\x73\x82\xab\x40\x29\x25\x5c\x32\x42\x88\x10\x8c\x10\x64\x88\x62\xd4\x72\x2b\x31\xde\xc6\xde\x5b\xcb\x99\xd1\xb1\x51\x98\x4d\xb9\x71\xf3\x62\x96\x75\xd1\xa7\xb8\xf4\x84\x58\x78\xcb\x37\x7f\x42\x77\x1c\x51\x2b\xf7\x27\xb9\xad\x2f\x6a\x7d\xf9\xb6\x09\x39\x09\x5d\xb7\x8e\xed\x14\x29\x59\x1e\xb7\xd4\xd4\xc2\xea\x78\x28\xda\xcf\x2b\xbb\x6d\x00\x39\xaa\x8b\x1e\x8f\xc2\x30\xc6\xb9\x89\xca\x30\xae\x14\x67\x44\x73\x83\x79\xdc\x1b\xe0\x0c\x68\xa4\x3c\xf0\xfd\x89\x8b\xb7\x79\xe1\x4b\x5d\xac\xb2\xf9\xa9\x9a\xf9\xcf\x4e\x1d\xf4\x4b\xb1\xf2\xcd\x9c\xc4\xd3\x8f\xd2\x86\x0b\x05\xfb\x9b\xac\x76\x9e\xd2\x05\xb0\x09\xd2\x4b\x9f\xd3\xc2\x8c\x7b\x84\xf3\x95\x0c\x98\x42\x89\x08\x1e\xa5\x72\x7a\x67\x7b\x9f\xab\xb1\x99\x8e\x67\x0f\x5a\xc6\xb5\xea\x74\xdc\xce\xb4\x2d\x61\xed\x79\xd3\x30\x21\x9a\xd8\x79\x70\x18\x5d\xb1\xd2\x56\x18\xc3\x22\x21\x38\xaa\xa6\xb2\x95\x3e\x08\x66\xb4\x05\x50\xbc\x64\x82\x8d\x1d\xe5\xca\x18\x95\xe3\x35\xaa\x20\xa2\x96\x63\x82\x15\x83\xcd\x29\x67\xd7\x89\x73\x70\xf5\x26\x0e\x38\xa9\x89\x1d\x4f\xe6\x6d\xd8\x73\xa6\x67\x99\x5f\x9e\x8f\x50\xd8\x3f\x01\xaf\x8c\xae\x3d\x68\xe2\x30\xef\x62\x0b\xd6\x91\xe6\xd9\x61\x07\xf6\x51\x81\x2c\xe1\xcb\x42\x9e\x7d\x36\xe7\x57\xb1\x1b\x77\x39\x1c\x77\x44\xc4\x75\xf4\x1c\x88\x02\x83\x1a\x20\x19\xf7\xd1\x82\x20\x26\xef\x20\xbc\xf0\x5e\x80\xc3\x49\x05\x69\x25\x36\x42\x34\x9a\xe1\x50\x11\x42\x1c\xa3\xe9\x5e\xb5\x2f\x7c\x89\x0b\x7f\x99\x8d\x3a\x33\x75\xa5\xe2\xf9\xc3\xd3\xec\x48\x43\xfb\xfa\xfa\x6a\x32\x6a\x7e\xf7\x5a\x4f\xbe\x60\x30\x8a\x6c\x6c\xf3\x5d\x88\x9b\x3d\x03\x66\x36\xb9\xfa\x2c\xc4\xc3\xc0\x00\x7f\xc9\x56\x8e\xdb\xee\xb9\xeb\x1c\x37\x6d\xde\xd7\x24\x6f\xc2\xe7\x36\xe4\x04\x47\x3a\x93\x9f\xdb\xe9\xc8\x5d\x6d\x22\x15\x9a\x58\xae\x9c\x89\x44\x4b\x62\x59\x07\xa1\x46\x50\x42\xa4\x31\x0c\x44\x8e\x6b\x4a\x73\xca\xe2\x41\xc4\x9d\x38\xc7\xf1\xa1\x38\xce\xa1\xe3\xec\xbf\xcd\xfe\xe2\xb4\xd3\x8f\x4c\xb9\xa7\x29\xae\xc5\xfc\x0b\xef\x34\x7d\x76\x74\x4f\x6f\x8a\x8f\xdf\xbe\xca\x53\x2d\x33\x1a\xab\x31\x90\x5c\x3e\xdb\x60\xb4\x71\xf3\x95\xde\xc5\x5d\xce\xc7\x3e\x2f\x3f\xab\x3c\x4b\x3c\x7f\x90\xe6\x25\x08\x9c\x53\x8f\x59\x34\x14\x7a\x48\x77\x14\x79\x44\xc6\x75\x30\xca\x7a\x20\x8c\xac\x7d\x5b\x4c\xc9\xa8\x83\x44\x68\x6b\x45\xdc\x19\x0c\xad\x39\xfe\x43\x06\x52\x2c\x2d\xd1\x72\xc5\x25\x51\xbc\xe2\x8a\x28\x81\xa5\xb1\x4e\x1e\xc4\x7a\xa5\xbb\x6c\x9e\xa9\x17\xb6\xd4\x45\x97\x7d\x73\x42\x2f\xfe\x9b\xab\x6a\xca\x17\x5e\xf9\xe3\xe4\x96\xef\x6f\x1e\x6e\xe6\x67\xf2\xf8\xc7\xb3\xc5\x7b\xff\x05\xba\x73\xb1\xfc\xf0\xde\x83\xb6\x82\x01\x43\xb0\xfa\xbc\x5f\x6c\xdb\xc6\x58\xc5\x2a\x25\x30\xee\xfb\xb8\x0a\x9f\x0f\x85\x78\xee\x7c\x4e\xc7\xf5\x56\x49\x3e\x9a\xc2\x69\x0d\x50\xb5\xdd\x4d\xf1\x3a\xd4\x0a\xed\x76\x18\x1c\x0a\x8e\x20\x21\xd4\xd4\x3e\x1e\x82\xb5\x0e\x39\xc4\xb8\x9c\x1c\xae\x9c\x91\x75\xdc\x69\x1e\x0d\x42\x5a\x53\x5c\x69\x58\x12\xc9\xa1\xad\x68\x55\x95\xb6\x4a\xdc\xc1\x3c\xd5\xbe\x6e\x2f\x0a\xca\x93\xbd\xf8\xef\x5e\x6b\xf9\x6f\xe6\x7c\xee\xe7\x67\x61\xa7\x33\x96\xf5\xfe\x74\xd3\xbe\x04\xb4\x5e\xb3\xda\xce\x7a\xd0\x34\x75\x2d\x8d\x96\x48\x69\x0c\xa3\x7a\x1e\x5a\xdf\x14\xd6\x8d\x75\xae\x63\x35\xdd\xd4\x42\x49\x54\x23\xf1\xbc\xcf\xd7\x71\xcb\x6d\x9a\xbb\x25\x71\x97\x4b\xc9\x1c\x15\x91\x5b\x26\x9c\xca\x37\x5d\x17\xc6\xc1\x4e\x5f\x45\x2c\x2f\xab\x2e\xae\xf7\xe2\x00\x10\xe8\x63\x3f\xc8\xde\xca\xe0\x49\xe3\x9d\x5d\x25\xdd\x6b\xd6\x62\x6d\xa9\x53\x04\x7b\x75\xac\xf5\xcd\x32\x96\xb8\xa7\x8e\x73\xa5\x7f\x97\xd0\xb9\x6f\x32\xce\x0b\x0d\xfb\x94\x71\xde\x7d\xfb\xfe\xd5\x61\xdd\x9d\x46\x46\xbe\x36\xf8\x34\x79\x29\x70\x9a\x4d\x7d\x63\x5c\x53\xf3\x7c\xd6\x86\xaa\xcc\xa9\x0a\x75\xcb\x0e\xeb\x7a\xa5\x82\xe1\x54\xc9\x06\x48\xa3\x23\x43\xec\xd9\x53\xa2\xc5\xb8\xcf\x37\xb6\xc1\x00\x52\x61\x29\xb2\xd2\x31\x82\x18\xa5\x24\xec\xd4\x26\xc4\x01\x38\xa1\xf2\xfa\x38\xa5\x1b\xfe\x3f\xd6\xde\x1f\x56\x72\x5d\x4f\x0f\x14\xa5\xaa\x3a\xf2\xd8\x33\xa3\x73\xfb\xf6\x3d\x1a\xcf\x8c\x1f\xcf\x3b\xb7\x5f\xd3\xf6\xce\x0c\x3d\xed\xee\xa6\x31\xf0\x98\xb0\x0d\x2c\x01\xc3\x0b\x02\xc6\x2e\xb8\xc0\xee\x82\x1b\x2c\xc0\x4d\x16\x0c\x19\x32\x64\xc8\x50\xa1\x42\x85\x0a\x15\x2a\xac\x50\x61\x85\x0a\x2b\x54\x58\x7e\x7d\xc4\x5a\x88\xaa\x3a\xa7\x4e\xdf\x3b\xb3\x9e\xdd\xed\xf7\x54\x55\x7d\x4e\xdd\xae\x92\xc4\x3f\xdf\xef\xcf\xf7\x7d\xd2\x51\x56\x08\x82\x71\x98\x70\x70\x12\x10\x12\x8e\x99\x45\x65\x69\x24\x43\x85\x85\x8c\x40\x5d\x96\x08\x53\xa9\x6a\xc4\x4a\x24\x10\xc2\xc4\x59\x2d\x91\x51\x82\x13\x12\xbc\xe2\xb9\xcb\x4b\x02\xe0\xd1\x1b\xd3\x19\xc6\x42\x15\x03\x97\xde\xe6\x26\x17\xf6\xa8\x0c\x77\x91\xdf\x21\xcf\x3c\xc6\xa2\xdb\xe4\xcf\x6e\xfc\x60\xa3\xae\xdd\x2b\x57\xfe\xa6\xa8\xf3\xe1\xd7\x7e\xfc\xee\xe9\xc3\x8d\xec\xf1\xee\x60\xab\x70\x92\x20\xff\x3d\x3e\xba\xae\x73\x4a\x30\xee\x98\x52\x9d\x18\x53\x7e\xf0\xe3\x68\x85\xa0\xd4\xcb\x4a\x8e\x7a\xd8\x40\xd3\x84\x83\x00\x65\x63\x87\x60\x15\xd0\x59\xcd\x5a\x63\x0c\xf5\xde\x61\x21\x0d\xa7\xf3\x3e\x4d\x2a\x63\xbb\xd1\x79\xef\xe0\x02\x06\xd8\xdc\xa7\x45\xe7\xcd\x1e\x24\x88\x1d\xbc\xf1\x35\x9f\x1a\x5b\xc7\x7a\x8e\x8b\x18\xcc\xc7\x4c\xef\xbf\x7d\xd5\x7e\xdd\x5e\x46\xf3\xb5\x99\x7c\x7b\xf7\xf3\xc7\xbb\xb7\xe6\xc2\x17\xd9\xba\xf8\xb4\xda\x2e\x3c\xde\xc1\xea\xf7\x87\x0a\x94\x1b\xfc\x6d\x08\xfd\xae\x7b\xee\x15\x3e\xf5\xd2\x5a\x07\x98\x0e\xde\xf1\xd2\x1a\x2c\xa0\xe0\x08\x07\x1d\x72\x96\x16\xa0\x2a\x8a\x50\x07\xce\x40\x03\x04\x9d\x82\x26\x40\xb7\x73\x9f\xf9\x30\xd5\x35\x28\x5a\x45\x0d\xe5\x88\x2a\x04\x1b\x6a\xe5\xb1\xa0\xd4\x98\xc2\x15\x84\xa0\x46\x6a\xd9\xc2\xb2\xe6\x9a\x39\x24\xa9\xc6\x38\xf6\xcc\x4d\x67\x76\x47\xb3\x2a\xf9\xc3\xe4\xc7\x8b\x0f\xe5\xda\x55\x91\xbc\xbb\x7f\xe9\x38\xf9\xb8\xb9\xfb\xf0\xbb\x8f\x5f\x77\x77\xef\xc1\x1b\xd1\x9b\xa7\xb7\xda\x59\x0f\xaf\x52\x66\x91\x8d\x3a\x81\xf6\xa0\x94\xd3\x4a\x21\x74\x4e\x0e\xc0\x94\x90\xfb\x2e\xf5\x19\xe6\x4c\xf8\xb2\xa2\xe8\x54\x84\x46\x01\x54\x86\x29\xdd\x57\xdf\x54\x55\xc5\x1d\xd2\xa5\xc5\x37\x75\x7d\x35\x4f\x60\x02\xbc\x60\x0a\x95\xc2\x28\x82\x29\x1e\x60\x49\xca\xbc\x02\xf0\x9c\x30\x5e\xda\x12\x9b\xde\x6a\x61\x42\x33\x77\x84\xa4\x6c\x78\x09\xf8\xa3\xae\xec\x70\x66\x77\x24\x1b\x62\x6e\xfe\xaa\x43\x92\xbc\xb2\xe8\xee\x1f\xe3\xd6\xfd\xf5\x71\xdd\x6f\xde\x68\xb6\x03\xbd\xcd\x7f\x7f\xaa\xb2\xc3\x33\x1a\xb6\x36\x30\x00\x41\x29\xc2\x3e\xec\x59\xa8\x79\x38\x05\x27\x00\x05\x49\x40\xd5\x55\x21\x6b\x39\xb2\x21\x9c\x04\x9f\xe6\x1e\x52\x27\x91\x24\x86\x59\xc4\x41\xc5\x46\x76\x64\xcb\x7c\xa8\x96\x98\x2d\xa3\xc9\x3f\x89\x2b\xc8\x5f\xae\xee\xa5\x6f\xf8\x4e\x2f\x1b\xc3\x65\xf3\xdb\x6c\x3f\x5e\xfb\x64\xe3\xd8\x02\x8f\xef\x77\x6b\x03\x9f\xf7\x79\x39\x8c\x7c\x3c\xb4\x93\x00\xfc\x5b\x0d\x68\x09\x2b\x54\x02\x38\x27\xdb\x82\x96\x0e\xe2\x20\xcb\xd0\x06\x51\x76\x90\x5a\x56\x52\x22\x90\xc7\x1c\xe8\x74\xd8\x87\x23\xdb\xd7\xf3\x94\x51\x54\x16\x8d\xb0\xaa\x6f\xb5\xa9\x73\x8a\x31\x13\xa6\x60\x1c\x71\x1a\xb4\x95\xac\x82\xd3\x58\x1e\xa7\xbc\x18\xc7\x72\x6c\x41\x69\xa6\xc6\xea\x3a\xd9\x25\xfb\x33\xbf\xc3\x69\x17\xe7\xc1\x82\xa1\x7e\x13\xdd\x64\x6e\x5c\x5c\x3f\xfc\x1d\xaf\x53\xef\x5a\xef\xdb\x36\xb3\xae\x73\xae\xeb\xb2\x6a\x7d\x4e\xbb\xe7\xca\x98\x4c\xcd\x1e\x1c\xdd\xaf\xbe\x4c\xae\xfa\x7a\x45\x96\x27\x3f\x5d\xf0\xe9\xbf\xb8\xd1\x4e\xbd\x2e\x19\xb1\x87\xed\x4d\x12\xef\xca\x30\xad\x00\x8f\xa4\x67\xa7\x15\x63\xde\xd4\x6a\x6f\xc2\xb4\x33\x7e\x1e\xfd\x4b\x96\x3a\x1e\xc6\x7b\x4f\x95\xb5\x9a\x07\x06\xa6\x73\xe2\x6d\x0b\x0a\x90\x3c\x47\x13\xce\x49\x85\x56\x87\xda\x2c\x78\x7e\x7f\x66\x77\x22\x13\x17\x05\xf7\x3f\xfb\x15\x7f\xab\x87\x1b\x2b\x98\x3b\xa1\x95\x34\xb0\xe6\xec\xb9\xae\x8e\x69\x3b\x73\x94\xea\xd9\x3b\x20\x43\x9d\x89\xe7\x66\xa5\x8d\xa6\xed\xb3\xd9\x14\x07\x23\x83\x37\xf6\xa2\x77\xd8\x66\x49\xf2\x53\xf2\xdf\xfd\xca\xd9\xc6\x05\xf2\xf1\xc3\x55\x64\xf2\xf5\x1a\xfc\xfc\xf5\xc9\x03\xe9\x01\x0b\x9d\xf7\x86\x49\x6f\x1b\xdd\xf9\x30\x65\x35\xc0\x35\xd0\xe1\x60\x26\x35\x98\xda\x8d\x1a\x24\x6e\x4c\xb5\xf7\x9e\x28\x6f\x94\x0a\x2c\xcd\xa7\x56\xd7\xa0\xf4\xde\xfb\xe3\xde\x0e\xa7\xf9\x90\xc2\x73\xb2\x37\xfb\x53\x92\xa6\xa7\xb8\x06\xc2\x98\x45\x7b\xe9\xf4\xba\xa2\xc9\x6c\x89\x98\x65\x95\xd6\xb3\x4c\x89\x7f\x3e\x7a\xa0\x0e\x59\xf9\x7c\xcc\xa0\x71\xf5\xbc\x67\x2c\x25\xc1\x4f\x97\xbd\x61\xf9\x77\x92\xe4\xfe\x86\xfb\x77\xe5\x3e\xff\xf0\xee\x21\xcd\x96\xbd\x14\xc4\x4a\xc5\xab\x96\x5c\x9c\xa2\xeb\xdc\xb8\xbb\xc1\x7b\xbb\x83\xa5\xbe\x28\xc3\x18\x46\x74\xec\xdd\xbe\xdb\xf7\x08\x3f\x97\x69\x19\x5c\x01\x1c\x32\x5a\xcb\xc2\x53\x81\x82\xa1\x40\x04\x13\x7a\xab\xa5\x76\xb9\x55\x52\x1b\xa0\xb4\xda\xdb\x3d\x28\xfb\x11\x53\x4a\x4b\x0b\x38\xe8\x69\xa0\xe7\xa4\x44\x82\xa7\x65\xf0\x32\xf4\x0d\xb4\x70\x02\xc2\x28\xcc\x0c\xa7\x15\x61\x46\x10\xc7\xfb\x46\xd6\x2f\x1a\xca\x4b\x5c\xf7\x4f\x93\x7f\x9d\xfc\x9b\x5b\x7c\xb7\x52\x9f\x2f\xb9\xe5\x25\x08\xcd\x5e\x24\xad\x6f\x14\x18\xff\x02\x2c\x13\xfa\xcb\xd7\xc7\xbb\x31\x1d\x4b\xe8\x48\x99\x36\x81\x6b\x84\xc0\xf1\xbf\x22\xd0\x43\xe8\x10\x4c\x13\x0c\xbf\x75\x26\xe5\x08\x56\x65\xb9\xc1\x81\x72\x0d\x30\x60\x32\xb8\xd0\x85\x6e\xae\x19\x38\x2e\xeb\x91\xe4\x01\x65\xa3\xe7\xf3\x20\x32\x82\x10\xa6\x54\x23\x8a\xb5\x26\xd1\x4a\x81\x07\x8f\x30\x84\xcb\x56\x8f\xa9\xe2\x44\x63\x0b\x09\x23\xd4\x22\xc1\xa2\xc6\x28\xbd\x93\x99\x7c\x89\x88\x56\x7c\xf3\x6b\x6c\xdc\x97\x4a\x48\xe4\xe2\x46\x6b\x15\x30\xf8\x12\x82\x43\x89\x3c\x81\x69\x3d\xab\x94\xce\x7d\x3c\xda\xdf\x57\x35\x65\xfa\x98\xee\xd7\xc8\x67\x39\x32\x86\x08\x61\x04\x73\x69\xb5\x36\x5a\x1b\x9a\x52\x4a\x74\x6f\xb4\x3e\x1a\x33\xea\x55\xdf\xd9\x9d\xcd\x9d\x49\x0f\x49\x16\x47\xdb\x9f\x24\xbf\x59\x95\x78\xee\x6e\xea\xa7\xe0\x52\x43\x7d\x69\x77\x76\x9b\xe9\x5b\x51\xef\xe8\x7c\x4c\xd5\x7f\x2d\x52\xb1\x44\x5d\x51\x54\xa7\x73\xca\x68\xf3\x6d\x52\xd4\x51\x99\x1e\x8c\xb1\xd1\x92\xdb\x04\x07\x0c\x64\x35\x97\x52\x6b\x4b\xac\xba\xe8\xb7\x9a\x2c\x49\xe0\x1b\xef\xdc\xef\x48\xe2\x17\x19\xa0\xb4\x49\xcb\x6a\x59\x36\xc0\x28\x25\xe5\x50\x13\x1c\xba\x2a\x0c\x15\x58\x4e\xb7\x96\xd2\x9a\x50\x89\x88\x28\xfb\x98\xf0\xb7\x69\x6e\xa2\x4e\xe3\x32\x66\x50\xf2\x9b\xab\x4e\xe3\x72\x4a\x4f\x17\xf8\xf0\xea\x66\xb6\x9a\xf0\x7e\xbe\x8f\xe2\x9c\xf1\xe4\xd9\xef\xf9\xb6\x6d\x84\xea\x5a\x50\x90\x59\x4f\x87\xa6\x82\xe3\xc0\x0e\x45\xe5\x25\xdb\xe0\xc6\x86\x52\xcc\x62\xe3\xbe\x99\x0c\x99\x70\x34\x54\x30\x0a\x1d\x03\x36\xf4\xab\x90\x07\x70\x61\xda\x73\x3f\x54\xa0\x9a\x25\x15\x02\x54\x3a\x6a\x86\xb2\xbb\x26\x2b\x93\xf7\x2f\x0c\x8e\xef\xa3\x2e\xf8\x21\xba\xdb\xef\xee\x7e\xba\x6a\x15\xde\xf0\xe3\x3e\x7e\x7d\xdc\x79\x5a\xef\x97\xf8\x15\x54\xcf\x02\x98\x40\x41\x1f\x3a\x0c\xea\x6f\x4d\x5a\x18\xd5\x17\xba\x4d\x87\xb4\xc4\xa1\x7c\x3e\x1d\x94\x13\x9a\x53\x42\x39\x27\x68\x2a\x4e\xa1\xcb\x4a\x5b\x16\xda\xad\xa2\x0a\x85\xc5\x46\xf1\x63\x25\xbc\x11\xcc\x12\x82\x88\xa1\x84\x1b\xdd\x5f\x35\x56\x33\x7d\xd1\xef\x89\x7d\x35\xaf\xf3\xed\xa5\x72\x79\xb3\xfc\xab\x0c\x95\xd0\x52\x92\xb1\xd3\x00\x92\x2d\xfa\xfd\x61\x3d\xaa\xe7\xbc\xaa\xb2\xd3\x73\x9e\x1e\x61\x21\x08\x37\x4c\x53\x4d\x83\x25\x04\xd8\xd1\x44\x7d\x11\x7b\xc9\x13\xfc\xf9\x75\xa7\xbe\x15\x4e\x85\x1f\xae\x15\xa3\xc8\xe8\x7d\xfc\xf2\xf5\xd3\xee\xad\xc8\xdc\x8a\x90\xd2\x46\x43\x94\x19\xd7\x83\x1c\x78\x34\x0f\xa1\x0d\x5d\x28\x08\x28\x80\x71\xc2\xd4\xfb\xd1\x3e\x1f\x5d\x2d\x01\xe9\x53\x54\xe6\x75\x5e\xa4\x15\x36\x4e\x99\xd2\x6a\x4c\xca\xf9\x50\x05\xc4\x01\x6d\x03\xcb\x7a\x8e\x91\x36\x1c\xe5\xbe\xe0\xa2\x34\x14\x13\xc6\x10\x15\x86\xab\x76\x9e\x30\xc6\x38\x9c\x7c\xe1\x72\x2c\x46\xe6\x91\x4e\x40\x1c\x63\x3a\x83\x17\xc6\xf9\xee\xa5\x71\xfd\x4d\x14\xf2\x94\x5c\x14\xe8\x3f\x5c\xea\x5f\xe5\xb6\xeb\xdb\xb4\xd8\xd7\xd6\x9a\x40\x84\xb3\x1a\x5a\x43\x20\x0e\xd3\x3c\x29\xb0\x07\xf9\x2c\xd3\xc3\x39\x91\x43\xb7\xef\xbe\xb1\x0c\x5a\x27\x4c\x27\x0c\x11\xa1\x57\xbc\x74\x25\xc4\x00\x86\x63\x63\x5c\x6f\xb9\xa2\x9c\x45\x2e\xc9\xaa\x4b\x1a\xbf\xcb\x5f\xac\x9d\x50\x6f\x13\x49\xab\x6c\xef\x2a\x8c\x7f\xd1\x45\x8d\x2b\xcc\xc3\x82\x29\xfb\x1a\x6e\x8c\xaa\x21\x81\x02\x32\xf8\x6d\xc4\x28\xa3\x73\xe9\x80\x4b\x15\xc7\xa5\x47\x92\xce\x24\xe4\x2d\xe3\x6a\x6a\x52\x9e\x41\x44\x03\xea\x0a\x5f\xd4\x23\x45\xa1\x12\xa8\x2c\x51\xc3\xf7\xb1\x95\xb6\x66\xc4\x34\x87\x08\x10\xaf\xeb\x76\xfe\xaa\xa8\xfc\xaa\xc4\x72\xdd\xd1\xae\x9a\x80\x0a\xf0\x3a\xa3\xf5\xb2\x57\xd7\xcf\x7d\x1d\x5a\x30\x65\xf4\xb9\x5f\x8e\x88\x17\xbc\x9f\x25\x21\x69\xdd\x34\x01\x76\xab\xb6\x36\xbe\x73\x99\x4c\xfe\x71\x72\x1f\xd7\x91\x87\xd7\xf5\x7e\x0d\x6f\xb3\x9b\xf0\xf0\xee\xe7\x0f\xd9\x58\x63\x60\x40\x2f\x82\x08\x3c\xb4\x81\xf2\x54\x02\x4c\xa0\x83\xc4\x58\xe7\xe5\xf3\x7e\x53\x98\xb6\x37\xe1\x14\xaa\x4c\x12\xd8\x2b\xaf\xa7\xd1\xbb\xbe\xa0\x1c\x0b\x1a\x04\x22\x52\x7a\xe7\x2d\xb7\x95\x7b\x59\x5f\xf2\x4b\x76\x28\xea\x10\xaf\x22\xd4\x17\xaf\xdb\x8b\x04\x31\x78\xfc\xf2\x6f\xc1\x3f\x07\xef\x7f\xbc\x7b\xfc\xbc\x6b\xa6\x99\x1e\xc0\x81\xce\xc3\x09\xfa\x59\xd3\x34\xaf\xe7\x72\x4c\x95\x9f\x6b\xd0\xc2\x80\x53\x59\x80\x63\x5a\x87\xde\xb5\xb4\x96\x00\x87\x9e\x57\x78\xef\x00\x5d\x50\x37\x97\x45\x21\x79\x1f\x7b\xc1\xcf\xe4\xae\xc9\x60\xfc\xdc\xcb\x0e\xf2\xc3\xf6\xee\x77\x1f\x6f\x27\x47\xe4\x58\xad\x0a\x8c\x69\x5d\xb3\x21\x53\x95\xf2\x3d\xd8\xf3\xca\x15\xc6\x11\x53\x5a\x86\x51\x1e\x30\x9f\x2b\x91\x42\x1e\xf6\xd6\x5b\xe0\xb3\x02\xb9\x46\x77\x34\x1c\x4c\x8d\x59\x68\xfb\xd2\x17\x7a\x0c\x4a\x7a\x06\x20\x17\xd4\x34\x49\x02\x40\x71\x66\xbb\x43\xaa\x93\x3f\x8c\x68\xff\x46\x07\x06\x94\xdb\xde\xff\x7e\xbf\x25\xdf\x8a\xcd\xf4\xfb\x21\xd5\xcf\x07\xe6\x6b\xef\x2f\x3e\x48\x4d\x46\xff\xff\xe9\x1b\xf8\xbb\x76\xcb\x9b\x77\x2a\x5b\xc2\x2e\x6e\x96\x87\x6b\xdf\x80\xf3\x65\xa9\xf6\x80\x45\x3d\xa5\x8c\x5a\xdc\x53\x4f\x20\x28\x6e\x14\x08\xf9\x4c\x7c\x59\xe8\x1e\xf0\xf5\x4d\x04\x51\xba\x32\x0e\xb4\x91\xc6\x68\x92\x62\x58\xf2\xa1\xd1\xfa\x20\xe5\x64\xd2\x03\x32\xee\xf5\xb7\x38\xcd\xcb\x52\x1c\xea\xcb\x6f\x63\x0c\x28\xcf\x6a\x83\x23\x07\xe1\xdd\x25\x42\x5a\x9d\xd3\x5f\x23\x93\x17\x2f\xb1\xdb\x57\xd7\x28\x2a\x7b\xff\x56\xcc\xf8\xfe\xf1\x1e\x3c\xbd\xff\xf4\xe1\xe9\xfd\x27\x80\x35\xa5\x9c\x49\xed\x1c\xb0\x8a\x32\x4e\xa5\xb6\x1e\x58\x4d\x19\x23\x52\x1a\x3f\xdb\x74\x3f\x93\xa8\xfc\x5f\xe2\x3d\xc8\x69\x5e\x95\xcb\x84\x0d\x83\xcc\x70\x28\x9a\x06\xc8\x61\xd8\x19\x21\x18\x65\xca\x6a\xa7\x05\x5f\x5f\x59\x2d\x04\x23\x4c\x59\xe5\x82\x5e\x70\xf2\xf3\xd8\xc3\x82\x7a\xd2\x13\x44\x54\xda\x04\x0c\xf8\x30\x0c\xf1\xfc\xcc\x99\xdd\xf1\xcd\xe1\xa5\x3f\xeb\x2f\x2f\x9d\x3d\x2f\x71\xe0\xb5\x09\xf7\xdd\x32\x52\xff\xdb\xa0\xce\x86\xa7\xe3\x0c\x3d\xe8\x03\xfd\x36\xa5\xc7\xb9\xac\x40\x17\x98\x76\x45\x09\x1a\x5c\xa1\x32\x6d\x66\x13\x55\xc5\x96\xa3\xf9\x7d\x53\x63\x6c\xa7\xb4\x79\x85\x3f\x9b\x43\x70\xc6\xeb\xe5\x21\x8c\x08\x23\x81\x08\x73\xda\x2e\x27\x84\x53\x86\x91\xec\xac\xd6\x47\xa5\x8e\xea\xe2\x19\x41\xef\xd4\x96\x26\x7f\x16\xef\xcc\x7f\x4c\x58\x92\x80\xa8\x7a\x72\x11\x3f\x01\xb7\xe2\x27\xef\x1e\xd2\xff\x07\xd8\xf6\xc3\x55\xa6\x36\xd2\xab\x68\xc7\x58\xd5\x8d\x56\x15\x79\x2d\x42\xa9\x80\x90\x6d\x8f\x9d\x31\x16\x76\xa6\x36\xa9\xae\x30\x06\x09\xa2\x95\xc0\x00\x87\x26\x1a\x64\x2d\x87\x78\x3e\x56\x08\x9b\x23\x68\x5e\x7d\x6f\x33\x59\x28\x4b\x43\x3f\x94\x25\x21\xe5\x3c\x84\xd1\x1f\x26\x54\x3a\x55\x97\xb9\xef\x00\x46\x61\x04\x0c\x1b\xa9\x25\x36\xce\xef\x7d\xef\xf6\x5e\x65\x0d\xc6\x02\xe4\x61\xda\xef\x43\xdb\xf7\xa1\xdd\x2f\x73\x38\x39\xb3\x3b\x0c\xa6\xa4\x5c\xef\xd4\x77\x1e\x9a\xf1\x7f\x4f\x20\x49\x35\x20\xa9\x63\x5a\x4b\x68\x0c\x0a\xcd\xec\xc3\xbe\x06\x53\x18\x00\x0e\xa5\xe2\x85\x2f\x28\xe0\x61\x0f\xc8\x7c\x48\xd2\xc4\x6c\xfa\xc8\x11\xbc\xbb\xf0\x19\xe3\xca\x70\x69\x62\x7b\x4a\xdb\xaa\x5a\x6e\x59\x9a\x54\x0b\x6c\xad\x76\x26\x30\xed\xbb\xce\xeb\xe8\x47\xe9\x17\x4c\xb8\xc9\xff\x61\xd8\xf8\x7a\x91\xd3\xb1\x2a\x11\xd0\x08\x7b\x06\xd3\x62\x1e\xaf\x55\xb2\x94\x7e\x33\x15\x46\xfa\x90\xd2\x57\xa1\xb9\xec\x04\x19\xe3\x0c\x71\x6d\xbd\x75\xb6\x72\x2c\xed\x10\x32\x5d\xe3\x7d\x38\x39\x17\x8e\xd5\x12\x7b\x8e\x67\x76\x67\xb7\xe6\xbf\xf9\xfb\x24\xb7\x37\x7d\xa3\x96\x9b\x9a\xe3\x78\x53\x61\x68\x23\x8f\x33\x5a\xd3\x3e\x4f\x15\xa1\x16\xe4\xa0\xb9\xfc\x04\x86\x71\x6b\xb0\x55\xeb\x2d\x3b\xf8\xbd\x1f\xbc\xca\x7a\xc1\x24\xa0\x61\x3a\x1c\x42\xb3\xdf\x87\x7a\xb8\xc6\x74\x59\xb3\x33\xb1\xdf\xf9\xe2\x65\xf6\xee\xbb\xd0\x74\x05\x20\x7f\x2f\xd7\x6d\x79\x8b\x05\xdc\x01\x7e\x4e\xac\x94\x52\x3b\x55\xcb\x56\x87\x13\x59\x19\xe6\x28\xf4\x4c\x53\x5c\x52\x06\x43\x9b\xd6\x8c\x78\xc4\x82\x70\x94\x5b\xb1\x1d\xab\xca\x29\xe9\x9c\x0a\x23\x28\x1b\x6d\x54\x1d\xb8\xaf\x7c\x28\x95\xc8\xab\x9c\x81\x3d\xf5\x0d\x6d\x3d\xc6\x53\xcd\xba\x24\x49\xfe\x71\xda\x9e\x79\xd4\x46\xcd\x92\x7f\x94\xfc\xf1\x4b\x0e\xec\x3f\xc4\x9e\xb9\xff\x71\x1d\x25\xb7\x4d\xb9\xdb\x87\xdd\x1f\xbf\xad\x9a\xdf\xe2\x98\xfb\xbb\x8f\x3f\xbf\xbb\xd1\x28\xda\xbe\x69\xe7\x7d\x2d\x56\x6c\x9a\xaa\x02\xb2\xaf\x65\xdd\x07\x6c\x4d\xa7\x9a\xf4\x20\x8d\x3f\xa4\x3e\xe8\x48\x8f\x5a\x8e\x5e\x78\xc2\x4b\x8d\x31\x7c\xb6\x9a\xa6\x84\xc6\x51\x1d\x8f\xb4\x10\x8c\x53\x3e\xd7\x46\x2a\x6d\x52\x1c\x0d\x8c\x25\x85\xb6\x24\x3b\x13\x08\x90\xa6\xd6\xad\x61\xb4\x6f\x55\xcd\x94\xe0\x32\x36\x57\xb0\x60\x7d\xe1\x0a\xd1\xa5\x04\x3a\x1f\x7a\xc6\x3a\xc6\x7a\xc6\x1c\x65\x92\x53\x4a\x7b\x25\x8d\x57\x06\x59\x59\x1a\x8b\x5c\x1c\xf7\x59\x93\x88\xbb\x6a\x67\x93\x3f\x7b\xf5\xe7\x7a\x0d\x61\x5f\x43\x84\x0b\x51\x07\xbc\x7f\x7a\xeb\x19\x7d\x7f\xb9\x12\x9b\x62\x82\xa5\x2b\x0a\x70\x9a\xf7\x25\x4c\xe9\x39\x01\x78\x2e\x00\x3e\x49\x23\x7b\xd1\x02\xe8\xd3\x4e\x49\xc2\xa0\xc2\x64\x55\x4c\xde\x25\x94\x42\x82\x1c\xc6\xb1\xd8\xe2\x94\x6a\x9b\x6f\xdd\x90\x15\xb3\x89\x32\xf4\x14\x02\x21\xe5\x41\x46\x7d\x25\x90\x1d\x13\x72\xa7\x77\x36\xaa\x03\xbc\x11\x47\x5c\x75\x67\xe2\xeb\x1f\x57\x02\xe7\xdb\xd4\xec\x4d\xcd\xfc\xfa\xf4\xb8\x41\x1d\x24\x9e\x42\x4a\x50\x5d\xb2\x29\x34\x08\x31\xac\xb9\xd6\x55\x5e\x3b\xa6\x54\xae\x14\xe2\x48\x52\x58\xd6\x07\x36\xf5\x79\xe9\x3b\xda\x57\x45\xe9\xb5\xe8\x7d\x98\xb6\xc2\x4a\x6c\xbd\x6d\x88\xf4\x8e\x60\x69\xb8\x11\x95\x2c\x0b\x69\x1b\xc3\x09\xed\x3a\x58\x23\xad\xe4\x5e\x3b\x7d\x14\x78\xaf\xac\xdc\x23\x64\x89\x11\x5d\xac\xc3\xa6\x3a\xea\xc6\xd9\x4b\x56\xe9\xb7\x97\xda\xd8\xc5\xaf\xf9\xbb\x95\xf0\x5a\x7d\xbd\x25\xc6\xde\xf2\x7f\x33\x0e\x7c\x05\x5c\x30\xdc\x28\x0e\x95\x46\xc1\xf8\xd4\xcd\x66\x39\xb0\xf6\x03\x6f\xd3\x43\xe5\xad\x69\xe7\xc9\x54\x83\x1a\xb3\xa2\xae\x8c\x6d\x37\x38\xe5\x73\x3b\x8b\x60\x95\x28\x97\x55\x54\x01\xef\x83\xf2\x99\x97\xa3\x71\xaa\xb7\xad\x69\x9a\x6f\x5e\x9c\x9c\xa9\x3a\xb7\xd7\x5d\x97\xa4\xa9\x3a\xab\xf8\xbd\xff\x34\xc6\x4b\x57\x89\xc2\x5f\x19\x2d\x7f\xdf\xef\x36\x85\xf2\x12\x94\x2a\x9c\x80\x80\x55\x5e\xa4\x62\xd6\x18\xa7\x5d\x30\xe0\xf0\xad\x05\x63\x38\xba\x5e\x02\xa9\x6f\x7f\x8f\xc8\xeb\xef\x37\x8a\x33\xe7\xea\x4a\x95\x18\x56\x92\xd8\x83\x73\x87\x67\xa9\x85\x6d\x3a\xaf\x0a\x8c\x3c\x67\x76\xb4\x76\x4c\xb2\xec\x98\x88\x3b\xbd\xd3\xbf\xd4\x77\xdf\xfd\x52\xe0\xfd\x85\x75\x12\xd7\x4f\x3c\x11\x54\x41\x04\xea\x50\x52\x9c\x52\x29\x08\x87\x8a\xe0\x60\xbd\x52\x4e\xd6\xa0\x8c\xa2\x82\x36\xd8\x6d\xa5\x15\x94\xc2\x6b\xfa\xdc\x0a\x51\xb8\x82\xd9\xd0\x65\x4e\x69\xe7\x03\xae\x82\x74\x49\x92\xa6\xfb\xb3\x89\xd7\xed\xfd\xca\x94\xbf\xc6\xde\x57\xd4\x7a\xff\x78\xff\x25\xbb\xc9\x79\x6c\x6a\xed\x9b\x28\xdd\x38\xc6\xe5\xe0\x00\xf6\xdf\xc6\x61\xd8\xa0\x80\xd3\xfc\x1b\x4e\x51\x60\x3b\x6b\x24\x1e\xdc\x34\xb9\x63\xf5\xac\x33\x4a\xbf\x4d\x55\xa8\x97\x45\x27\x49\xb2\xf8\x79\xf5\x45\x1f\xe5\xdf\xbd\xf8\xeb\x5c\x1b\x65\xae\x1d\x81\x6b\x07\x49\xb6\xb6\x01\x7d\xef\xbe\x7b\xdb\x29\xb4\x51\x35\x4d\xb1\xf2\xfd\xc8\xc2\x38\x9e\x42\x2f\x40\xd9\x0b\xce\xa5\x02\x89\x51\xce\x89\x40\x7b\x5f\x94\x53\x98\xd2\x7d\x38\xc6\x6d\x6e\x59\xe7\x4e\xdf\x78\x5a\x06\x07\x4c\xd8\x23\x6c\xcc\xce\x42\xe7\x6a\x45\xb1\x27\x4a\x13\x8f\x19\x65\x9c\x99\x0e\x4b\xc6\xd5\x6c\x31\x46\x95\x73\x95\x5f\x0e\x5f\x39\x47\xa9\x88\xb9\xb7\xb4\xbf\xcc\x95\x7f\x92\xfc\xe6\x9a\xb9\x88\xb6\xc0\x4b\x7c\x91\xdd\xb0\x84\xd7\xf8\xf7\x71\xbd\xbb\x17\x0b\xc4\x98\x6c\xfc\xf2\xf5\x71\x9b\x57\x65\x79\x02\x58\x86\xf1\x9c\x4c\xe1\xc8\x41\x35\x81\xa3\xa2\xb3\x05\x1a\x53\x23\x18\x80\x54\x80\xe4\x99\xf3\x0d\x9f\x5b\xab\x4f\x20\xe7\xce\x89\x0a\xc2\xe0\x82\xc0\xbd\x0f\xed\xce\x92\x12\x1e\x6d\x55\x81\x24\x9c\x2a\x7f\x9c\x99\x94\x8e\x51\x2e\x8d\x93\xd2\x3a\x77\x90\x25\x33\xa4\x1d\x18\xa7\xa2\xb4\xe6\xb0\xc4\xc4\xe9\x70\xae\xee\xfc\x0e\x5f\x9c\x04\x1f\xbf\xa7\xf4\x5d\x85\x67\xfe\x08\xdc\x7d\xfc\x72\xff\xb4\xe6\x9b\xb2\x48\xf7\xcf\xf0\x46\x06\x02\xb4\x94\xdc\xc0\x8a\x91\xb1\xb0\x42\x70\x4e\x09\x15\xed\xde\x03\x31\x9f\xa4\xdf\xe0\x6f\x74\x87\xfd\xfe\x59\x08\x59\xf8\x82\x65\x89\x92\x75\x6d\x1b\xd7\x0a\xe6\x0e\x80\x3d\xc3\x8d\xda\x87\xe1\x5b\xeb\x96\xf5\x93\x5c\xae\xe3\x9f\xbf\xf1\x85\x7f\x8c\xae\xe0\x4f\x51\x65\xe0\xd3\x9a\x48\xcf\xec\xb2\xa0\xb4\x81\xc7\xd6\xb6\xa4\xaa\x9e\x0f\xd5\x29\x66\xb6\xf4\x16\x03\x1e\xda\x2a\x8c\xd5\xcc\xd2\x64\x86\x22\xb5\x21\x4f\xbb\x0a\x44\xfd\xa9\x2d\xe8\xce\xfd\x8e\x6e\xf3\xe4\x9f\x5d\x62\x8c\xff\xb8\xae\x12\x5f\xde\xfd\x5a\x13\xd3\xd7\x9f\x1e\xbe\xbc\xdb\xae\x7c\xdd\x18\x25\xaf\x86\xd6\x77\xab\xd4\xcb\xd7\x25\xca\xb8\xfb\xf4\xf9\xe9\xfe\xeb\xe7\xa7\xcd\x44\x98\x72\xc4\x16\x10\x20\x99\x63\x4e\x0d\xc4\xa2\x65\x0d\x13\x5a\x71\x52\xe6\xcf\x7b\x0e\x04\x2c\xc3\x1e\x1c\x20\x74\x82\x97\xca\xf5\x87\x52\x01\xd6\xaf\x7f\xb2\xaa\xd1\x72\x04\xac\xd4\xda\x04\xdd\x68\x43\x19\xab\x95\x51\xad\xd1\x8c\x31\x0f\xca\xdc\x60\xa6\x24\x23\x66\xee\x4a\x5b\x84\xd3\x84\x0a\x9b\xa7\xce\x1e\x75\xb0\xd0\x44\x7c\xb8\x9c\x1b\xdf\xb2\xe4\x8f\xa2\x4a\xcd\x7f\xb8\xcc\xaa\x1f\xef\x9e\x2e\x1a\x22\x1f\xe2\x5e\xf4\x54\xdc\x7d\x8d\x84\xb5\xbb\xe8\x8a\x71\xf7\xf1\xfe\xd3\xfd\xd7\x2f\xcb\x85\xfd\x72\xf1\x08\x79\xb8\x51\x1b\xfa\x61\x73\xb0\x18\x94\xc4\xa1\xb2\x47\xc8\xa8\x30\x5a\xc4\xaa\x63\xae\xac\x35\xe4\xc0\x2b\xe2\x89\x95\x45\x38\x01\x22\x8f\x04\x99\x68\xf9\x55\x7a\x25\xa5\x62\x83\x6a\xfd\x96\xe1\x41\xa1\x46\x4a\x2d\xd9\xf1\x48\x8d\x36\x61\x4f\x8b\x29\x30\x5a\x84\x83\x57\x7a\x5f\x52\xa0\xc3\x58\x08\x40\x8c\x77\x5c\x50\xce\x03\x2f\x5b\x6b\x6b\x5d\xa9\xc1\x6b\x03\x50\xdc\x8f\xc0\xe1\xec\x77\x70\x4b\x2f\x3c\xb6\x65\xb5\xfc\x97\xd1\xe1\xf5\xf1\xc6\x0f\x63\xf5\x94\xfc\xf4\x56\x48\x63\x39\x6e\x85\x83\x52\x04\x54\x59\x54\x45\x01\xda\x00\x21\xa8\xeb\x6f\x5d\x33\x94\xa1\x3f\xc6\xb4\xe1\xcd\x51\x68\xdb\xca\x3a\x4d\x9c\x96\xda\x6c\xfa\x15\x09\xd0\x99\x19\x93\x76\xf4\x44\x8f\xf4\x48\x27\x76\x10\x86\x3b\xcc\xa3\x80\x40\x1c\x5f\xfb\x04\xee\xf0\x56\xbc\x78\xd0\x7e\x5e\x15\x32\x6e\x3d\x00\xe3\xec\xbf\xd5\x59\xfd\xb2\xbd\x7c\xf5\x77\x91\x93\xba\x1e\x19\x0f\x2d\xe8\x42\x0d\x64\xac\xce\x80\x3e\x24\x5c\x0d\x63\x59\x48\x43\x4d\x01\x43\x1d\x0c\xaa\xd3\x49\x7f\xab\xac\x33\x66\xb2\xf6\x64\x6d\xe6\x8d\xd2\xc6\x68\x65\x24\x2f\x60\x59\x32\x63\xa3\x26\xa6\x64\xa7\xe0\x9c\x8b\x89\xe6\xe4\xaa\x3a\xb9\xce\x87\x36\x61\x3b\xbc\x39\x45\xaf\xce\xab\x9f\xe8\xcb\xea\x1f\xb5\x99\xae\x2e\x8b\xd9\x8b\xe8\xd8\x0a\x61\x7e\x03\x96\xf1\xb3\xad\xa4\x5d\x35\x69\x92\xd9\xc6\xa0\x47\x6a\x0a\xa0\x5e\xbe\x73\x90\x4a\x48\xa1\x72\xb3\x20\xe8\xc1\x09\xed\xdc\xe6\x64\x60\x79\x30\xfd\x72\x89\x7b\xd3\x17\xb9\x85\xcf\xe5\x94\xe5\x94\x6b\x49\xfb\x65\xb2\xd0\x23\x0e\x63\xcf\x8e\xcb\x77\x3b\xcb\x5d\xb1\xc5\xf1\x7e\x7f\xbc\xde\xef\x57\x27\xc5\x17\x3c\x1f\x93\x49\x11\x80\x3c\xde\x3f\xae\x5f\xee\x43\x74\xd9\x8f\x42\x24\x23\x38\x54\x4b\x98\x0c\x7c\x18\xf6\x5e\x36\x6d\x55\x9f\x13\x05\xf2\x2a\x1c\x80\x0f\xe8\x10\x7d\x5b\x70\xa9\x4a\x0c\x34\x48\x9c\xc2\x44\xd2\x8d\xaf\x6b\xab\xe6\xd1\x59\xdf\xf9\x80\xc0\x70\x70\xd6\x76\x29\x54\xf3\x04\x08\x63\x12\x4a\x2e\x97\x90\x8e\x41\xcd\xb0\x58\xe6\x9e\x3b\x77\x3b\xbd\x2d\x93\xdf\xdc\x54\x92\x16\xdc\x77\x0b\xce\xdf\x45\x75\x8b\x1f\xde\x3d\x7d\xfe\xb4\x22\xf2\xeb\x2c\xfb\xe1\xdd\xcd\x75\x4d\x8f\xb0\xdc\x87\x43\x0e\x0a\x6e\x30\x2b\x19\x81\x30\x77\x65\x65\x38\x2b\xcc\x82\x5b\x5d\x95\x17\xae\x12\xc6\x73\xa7\x5a\x15\xcb\x48\xb0\x76\xca\x57\xdb\x52\x19\xa7\xe5\xdc\x1e\x4a\x5f\x6a\x50\x07\x3e\x49\x0b\x24\xe8\x62\xf7\x24\x21\x27\xe7\xcd\x69\x68\x14\xc8\xc3\x5e\x1a\xe3\xe4\x41\xd7\xa6\x89\x9a\xf4\x29\x38\x24\xe5\xb6\xd9\x92\xe4\x8f\xa2\x67\xd4\x45\x2a\xe1\x92\xac\x05\xef\x2f\x1a\xcf\x2b\x0e\xf8\xba\xf2\xe4\xb2\x5c\x28\x7d\xf0\x86\xa7\x09\xd7\x96\xe3\x50\xa4\xf2\x74\x0a\x47\xd0\x3c\xdb\xce\xeb\x4e\x4f\x9b\x44\x2b\x35\x1c\xa8\x31\x7a\x59\xc4\x66\xd9\xf7\xb6\xb1\x73\x91\x1e\x20\x37\xac\x68\x6d\xb2\x4d\xe9\xb9\xd9\xc1\x2d\x8e\xde\xd3\x57\x8d\xdc\x87\xbb\x18\x40\x5e\xad\xe0\x7f\xfb\x97\xe0\xaf\xc0\xc5\xdb\xe7\xe3\xfd\xcf\xef\x7e\xf7\x79\x77\xf7\x3e\xbb\x91\x67\xd9\x12\x3a\xe5\x05\xd0\xa1\x17\x1c\x16\xa6\x64\x0c\x09\x01\x59\xf0\xbe\xc1\xed\x89\x01\x4f\x8b\xba\x12\x59\xfe\x7c\x7a\xe9\x0d\xdd\x62\x8d\x25\xb7\x7d\x85\x1d\x47\x9c\x9a\xba\x24\x86\x62\x9e\xf2\x32\x56\xf5\x0b\x1d\xf0\x5c\x01\x65\x43\xb5\x6a\xf8\x81\xd3\xb9\xdd\xe5\x5b\x98\x6c\x2f\x55\xa0\x7f\x15\xdd\x4f\x1e\x36\xdb\x8f\x70\xbb\x2c\xab\x2f\xcd\x6c\xb7\x31\xd6\xbb\xef\x1b\x73\x56\xa1\xe5\xad\x67\xa1\x0a\x09\x02\x0d\xe0\x15\x61\xad\x9f\x73\x97\xb6\xea\x9c\xd0\xd2\x95\xa4\x26\xb1\x01\x2a\xad\xb9\xb2\x2d\xdf\xfb\x7e\xe2\x53\xa5\x29\x1b\xb1\xe0\x64\x0b\x2d\xce\x8d\x26\x56\x85\x63\x55\x81\x05\xed\x2b\xa4\x56\xa3\x0d\x1e\x90\xa9\x15\x43\x35\xd1\x86\x58\x22\x75\x25\x39\x97\xc9\x26\x95\xe7\x76\xbb\xdf\xd2\x4b\x8d\x38\xf6\x1f\xac\x78\xe4\x7a\x37\x3f\xbe\x20\xf8\x1b\x31\xc2\x0f\xa9\x04\xbc\x44\x35\x2e\x01\x9a\x8d\x95\xd0\xf7\xac\xba\xd2\xb0\x8f\x4a\x0a\xe2\xb9\x14\x5c\x0f\xe1\xb8\x71\x8c\x62\x21\x67\x19\x0c\xc6\x9e\x11\x9a\x59\x1f\x94\x0b\x3d\xe3\x5c\xb0\xe5\xde\xeb\x98\x0a\x8b\x9c\xeb\x69\x67\xb6\x38\xe2\x3e\x18\xc7\xda\xc3\x6b\xcb\xf8\x2f\x91\xdf\x35\xc5\x87\x2b\x04\x4e\xaa\xdd\x47\x80\x14\x4e\x87\x30\x50\x90\x74\x82\x32\x66\x40\xce\x85\xf1\x2a\xc8\x31\xc3\xcf\x83\x4f\x8b\x79\xda\x62\xcc\x5c\x67\x04\x75\xcc\x6a\xe1\xa9\x60\x82\x12\xd9\x51\xc5\x59\x3d\x37\xa1\x70\xc7\x05\xb7\x81\x3a\x41\x3b\xb6\x4d\x92\x6d\x52\x24\x7f\xfd\xd2\x63\x7a\x43\x47\x78\xd8\x5e\xaf\xc7\x32\x14\xd3\xd7\x9e\xfd\xa8\x7c\xf6\xe9\xc7\x87\x2d\x91\xc4\x62\x11\x0a\x87\xa8\x27\x44\x1c\x32\x97\x07\x07\x91\xe4\x56\x3b\x8e\x60\x5e\x61\x6b\xb4\xab\x69\x6b\x28\xec\x8a\xb6\xc8\x7d\xb1\x4d\x84\x62\x4a\xe4\xc8\x98\x67\x9b\x56\x9c\xda\x13\x72\xac\x15\xca\xd1\xc1\xd4\x03\x09\x87\xa3\x24\x96\x8a\xaa\x43\x0e\x55\x6d\xe3\xa2\x67\x04\x4b\xc4\xb6\xdb\x8c\x2f\x39\xc4\x97\xdc\x61\x76\xd1\xc2\x4a\xab\x97\x4c\xe6\x98\xe9\x67\x1f\x33\x48\x9b\x31\xe4\xee\x18\xca\xf9\xe8\x40\x1e\xcf\x79\x4c\xe8\xf6\xb8\xcd\x2f\x5d\xa7\x09\x78\xa3\xf6\xfd\x78\x7f\xa1\x9f\xfc\x09\xb8\x34\x69\x6f\x26\xea\x35\xa9\x8a\x32\xd4\x01\x97\xa7\x43\xf4\x5c\x02\x2a\x54\xc3\xb0\x1c\x00\x1b\x54\xf7\x98\x12\x9a\x57\x39\x28\xd3\xfc\x70\x98\x4f\xe1\x04\xfc\xe9\x74\x8a\xfa\x12\xa0\x4b\x8a\x5d\xb9\xcd\xe3\xac\x59\x15\xc5\x6e\xb4\xa2\xa2\xc8\xe1\x45\xd5\xf3\xdd\xe3\xfd\x4f\x8f\x9f\x6e\x0c\xc8\x32\x7a\x8a\xbd\x12\x4d\xad\x8c\xe7\x9d\x38\x9d\x8e\x82\x6b\xa6\x0a\x50\x72\xb0\x3f\xb1\xd0\x87\x56\x0b\x81\xc9\xde\x67\xc7\x25\x14\xf1\xb2\xea\x55\x55\xef\x9d\x6b\x41\x02\x96\x50\x59\xeb\x50\x85\x9c\x55\x56\x70\xce\x04\x70\xc9\x06\x4c\xe7\x76\x57\x6c\xfa\x57\x0f\xcb\x0f\xdb\xe5\xc3\xe2\xe4\x8d\xc8\xee\x7e\xcd\x51\xfd\x79\xfa\xe1\xf3\xa6\x9b\x79\x79\x68\xb2\xa1\xe9\x8a\xbd\x0f\xb1\xf2\x02\xe4\x01\xf9\x22\x3d\x54\xd5\xcc\x73\x5f\x84\x21\x3b\x59\xbb\xcc\x45\xdb\x95\x75\x02\xd2\xe4\xec\x77\xf9\x96\x26\xbf\x4d\x12\x10\x05\x8d\xae\x26\xe8\xaf\x69\xb1\x1b\x7c\xbd\x85\x47\x7f\xa8\x80\x0e\x02\x74\x10\x57\x04\x81\x26\x60\x60\x39\xc3\x0c\x72\x88\xd2\x65\xb1\x9c\x42\x92\xba\xda\x1b\x89\x8d\xf7\x75\x28\x84\x28\xaa\x02\x27\xeb\xda\xb9\x3d\x6e\xaa\x1b\xd6\xef\x35\x4f\xf9\x74\xff\xf4\xfe\x6f\xd2\xcf\x4f\xd9\xe5\xa9\x0f\x36\x6b\x82\xae\x8e\xc7\xea\x74\x5a\x1f\x81\x5a\xa6\x4b\xa0\x1b\x35\x0c\xa1\x1d\x86\x64\x03\x86\x44\xef\xd8\x66\x1f\x7b\x61\x57\x45\xe6\xb5\xc1\xe1\xa7\x87\xbb\xf4\xe3\x87\x4f\xf7\x3f\x5e\x6d\xec\x9e\x7e\xfb\xbb\xcf\xd9\x43\x7a\xf7\xf1\x87\x6c\xd2\xac\xa2\x2a\x2d\x0d\xaf\x98\x0e\xb0\x16\x96\xe4\xbe\x20\xf8\xd0\xf0\x43\x43\x68\xcd\x37\xfb\xba\xa7\x7d\x7d\xda\x9f\x28\x48\xf6\x70\xee\x29\xad\xd0\x40\x11\x95\x29\x41\x61\x3f\x60\x70\xd9\x7f\xd8\x0e\x6e\x49\xec\x51\x7d\x59\x9f\xde\x3f\x6e\xef\x6f\x34\xc5\x3f\xdf\x3f\x5e\xda\x37\xd3\x1c\x34\x10\x7b\x0a\x41\xf5\x0c\xd3\x51\xa2\x32\xf7\x85\xd0\x5e\x86\xf1\xa4\x86\x8d\x90\x02\x29\xe3\xfd\x3c\x60\xac\x61\xa3\x08\x05\xd3\x78\x4e\x9c\x31\x60\x05\x3e\x29\x38\x9e\xa7\xed\xb8\x2d\x93\x6d\x8c\x36\x56\xdc\xfb\xf8\xaa\x39\xba\x2e\x44\x6b\x35\x32\x3b\x32\xe8\x21\x0b\x7d\xb6\xaf\xa1\xad\x9d\x71\xbe\x0f\x07\x05\xca\xb6\xe9\x6d\x5b\x6b\x38\xeb\x6d\x29\x0d\x36\x32\x9c\xaa\xa9\x77\xd6\x3a\xdb\x69\x2f\x1b\x6b\xa5\x31\x55\x17\x63\x44\x9f\xb4\x5b\xb5\x51\x97\xf9\x9b\x80\xfb\xc7\xfb\xe5\x78\x7f\xff\x78\xbf\x55\x33\x4a\x69\x10\xa0\xd9\xa8\x67\x16\x7d\x79\x92\x73\x52\x85\x53\x9c\xb2\x49\x0a\xc6\xe5\xda\x6c\x4e\xc9\x1f\xad\xdd\x07\x17\xc0\x9b\x66\x1f\x7f\x78\xf7\xb8\x8d\x19\xf8\x1b\x2c\x99\x96\x40\x50\x57\x94\x60\x9a\x8f\xf5\x49\x8f\x2e\x0c\x29\xae\x9c\x6f\x3b\x6e\x35\xf7\x65\x19\xa6\x30\xa0\x7e\x83\x06\x28\x84\x0b\x38\x8c\x1a\x40\x20\x35\x0e\x55\x5d\xf2\x8a\xee\x8f\x94\x53\x09\xdd\x7e\xfd\xec\xfe\xdc\xed\x8a\x2d\x4c\x8a\xe4\xa7\x38\x7b\x57\xb7\xbc\xf4\xee\x63\x6c\x53\xbf\xc8\x14\x35\xf5\x12\x51\xd7\xf6\x68\x41\x62\x42\x0b\x7a\xa0\x2b\x59\x09\xbf\x85\xe1\xe0\x9f\x79\x46\x82\x9d\x96\x4b\xaf\x7d\xe8\xbb\x03\x3b\xb6\x31\x5f\x06\xc6\xf3\xb8\x4b\xb6\x64\xdd\x91\xde\x22\xe4\x5b\xd8\xf4\xf5\xf1\x3a\x87\x52\x0c\x44\xb0\xc0\x46\x3a\x4b\x44\xb3\x47\x61\x97\xa9\x42\x50\x99\x87\xce\x47\x15\xb6\x26\xd3\xde\xb5\xad\xf3\xce\x87\xc6\xe5\x3e\x27\x3e\x14\x60\x72\x3e\x7e\xe6\x29\xa9\xb6\xa7\x8d\x8b\x9d\x43\x31\x3a\xb8\xbf\xc9\x6a\x7c\x7e\xcc\xea\xe0\x32\x1f\x1c\x10\xa1\x01\xdd\x73\x02\x9a\xd0\x02\x9e\x9d\xbc\x0f\x93\x0f\x83\xf7\x00\xfb\x18\x37\x1b\x50\x6c\xd5\x26\x8f\xf7\xf3\xb2\x16\xdf\x3f\xa6\x26\x9d\xe6\xa2\x5e\xbe\xdd\x26\x9f\xf3\x0a\xec\xe3\x1a\x78\x48\xfa\x1d\xdc\xe8\x97\x7b\x1f\x1b\xb2\xde\x47\x55\x95\x14\x66\xfd\x33\x2d\x33\xfb\x6c\xe5\x86\x7d\xeb\x36\xba\x3a\xf9\x73\x12\xbf\x6b\x8a\x52\xbb\xdd\x67\x65\x92\xad\xff\x4d\x8a\xb2\xfa\x59\x66\x65\xb5\xfc\x9b\xe6\x5c\xed\xd8\x06\x45\x2d\xd2\xff\xfe\x16\x17\xbf\x7f\xba\x7b\xa3\x43\x72\x69\x93\x88\x6b\xdc\xfd\x4f\xb7\x56\xf5\x9f\x7e\xf7\x31\x56\x1f\xc0\xa7\x2f\x5f\x9f\x7e\xba\xdc\xca\x12\x50\x1b\x5d\xb1\x74\x8f\xf7\x61\x95\xa9\x51\xa1\x02\x86\x04\x15\xec\x12\xe1\x37\x1e\x94\x1a\x90\x28\x66\x3f\x00\x1c\xba\xae\x84\x0d\x30\xa1\x07\xd8\xa3\xfc\x04\xe7\x41\x50\x45\x44\x36\x08\xa1\xa8\x12\x92\x49\xa6\xb5\xad\x95\xb0\x0e\x78\x1b\x72\xab\x35\x93\x4c\x62\xa4\xe8\x82\x78\x10\x58\x50\x8a\xe4\xc9\x5d\xc4\xfb\x2c\x9b\x6e\x74\x0c\xfe\x3a\xa2\xac\x8b\x66\xc1\xe3\x8d\x36\xec\x82\x5d\x6e\x78\x37\x57\x01\xa9\x8f\x9f\x5f\x5c\xd5\x1f\xd3\x3c\x9b\x9e\x8b\xca\x7b\x90\x37\xa6\x7a\x16\x1b\xff\x4d\xdb\xac\x0e\xa6\x17\x8c\x12\x4a\x89\x18\x26\x4e\x6c\x34\x73\x57\x0e\x83\xb2\x0e\x83\x4b\xfd\xac\xb3\x29\x1c\x44\x4c\xf8\x9e\x13\x45\xc3\x49\x23\xa2\x61\x89\xb0\xea\x1c\x2e\x2d\x42\x92\x21\xea\x21\x34\x88\x4b\x9e\x24\x49\x0e\xf6\x67\xbe\x23\x1b\x1c\x63\xa8\x7f\xf6\xa2\xfd\xb8\xba\xe3\x45\x47\xce\x2b\x3a\xbc\x24\x85\xaf\xbd\xf5\xb7\x2d\x22\xdb\x95\xe4\x11\x9f\xb3\xb6\x92\x14\x59\x36\xf9\xe7\xd6\x1f\x21\xd6\x0c\xab\x30\xa5\xfd\x4c\xed\x32\xcf\xd2\xbd\x9f\xc5\x72\x5a\xd1\x01\xa5\x08\x53\x50\xaf\xaf\x37\xb8\x17\x92\xe9\xd0\xef\xf7\x80\x12\xcc\xb8\x6c\xc3\xa8\xd8\x38\x8f\x08\xa5\x70\x2f\x84\x08\x47\xce\x97\xef\xfd\x8f\x40\x73\x66\x3b\x9e\xb5\x2f\xd7\xfb\x5a\xc7\xf9\xab\x5f\x56\x26\xb7\xdf\x69\x23\xbd\xfb\x8e\x8f\x02\xf6\x69\x12\x92\xa8\x08\x0c\xa2\x72\x8d\x8d\xfe\x61\x6c\x93\x07\xba\x20\x32\x3f\x9f\xd2\x3c\x30\x7f\x71\x24\xc4\x73\x79\x7d\x95\xb5\xe1\x28\x85\x5c\x1e\xa6\xc0\xa8\x69\x1a\x43\x41\x41\x29\x3d\xb2\x28\x21\x9c\xe4\x40\x9f\xcd\x4e\x6e\x64\xf2\x47\xc9\x7d\x8c\xff\xff\x22\x8e\xf9\xff\x7c\xed\x68\x58\x69\x57\x77\x1f\x7f\xde\x7e\xbc\xdb\x3e\xbe\xbf\x7e\xdf\x57\x21\xaf\x08\xda\xe2\xb9\xfc\xe2\x67\xb7\x6e\x7d\xd9\xe8\x11\x28\x40\x2e\x8d\x99\x7b\xed\x25\x70\x60\x3f\x55\xe1\x94\xb9\x67\xe3\x53\x35\x57\x61\x4c\x21\xa5\x98\x95\x0a\xb5\x07\x7c\xea\x83\x4c\xf9\xf7\x3f\x09\x50\x49\x2e\x54\x5a\xc5\xa7\x8d\xc4\x90\x41\x53\x42\x16\x99\x76\x8c\xb1\x6a\x12\x74\x08\x94\xb2\x5c\x23\xcc\xa9\xa1\xac\xd2\x6f\xff\x5a\x22\x2c\x08\x14\xf1\x71\x8d\x3d\xcc\xd9\xee\x5c\x76\x8a\x7d\x14\x6b\xd6\xea\x85\x5b\xf8\xf4\x8b\xc6\xff\x08\x9c\x9f\x3e\xbc\x49\x59\x7d\xf9\x14\x19\xa6\xdb\x8f\x5f\x3e\xdd\x3f\xbd\xf4\xa3\x2e\xe7\xbf\xe9\x6c\x51\x02\xc3\x4b\x26\x84\xa6\x4c\xf5\xa2\x57\x5c\x50\xe5\xb9\x10\xb8\x18\x9e\x2b\xc0\x31\x0c\x1d\x38\x40\x34\x48\x54\x96\xc2\x06\x52\x22\xc4\x0e\xd7\x3c\x82\x33\xe7\x24\x3b\x95\x92\xbb\xb1\xd1\x46\x48\xd1\x68\xa3\x5a\x25\x8d\x3c\x0a\xa1\x6c\xc5\x18\xd1\x8a\x51\x13\xca\xdc\x14\x4e\x51\x97\xa7\x44\xca\xb0\x97\xa1\x2d\x56\x0d\xc2\x0c\xf4\x67\xbb\xa3\xd9\x3e\x79\xb8\x8c\xbd\x9f\x1e\xe2\x44\x5f\x6b\x27\xaf\x53\xe7\xdd\xaf\x50\xc1\xe3\x44\x6f\x04\xb1\x5e\x4b\x6a\x30\x39\xf8\xe7\xda\x8f\x98\x88\x74\x08\x23\xa8\x82\x02\xfb\x6f\x27\xd0\xc6\x72\xce\xe8\x40\x1f\x68\xd6\x4a\x35\x8e\x52\x53\x4e\xc3\xd4\x34\xcb\x50\x0b\x7d\xd8\xd3\x48\x05\xd4\xd4\xf0\x35\x2f\x62\xcf\x6e\x87\xb2\x53\xf2\xe7\xb1\x52\xff\xb7\xc9\xbf\x5f\x99\x72\x3f\x2e\xd7\x33\x1e\x6f\xb4\xc9\xbf\x7c\x7e\x8a\x19\xfa\x37\x60\x25\x46\xfb\xaf\xdc\xb4\x58\xe9\xee\x3a\x97\x57\x55\xd1\xed\x73\x2d\x05\xe7\x54\x6b\x4f\x9a\x3e\x6f\xd3\x24\xe5\x15\x2c\x8a\x5c\x17\x84\x4b\x4a\xd0\x51\xec\xa1\x7d\x11\xfb\x8d\xda\xb6\xbc\x11\x5c\xf7\x1a\x4b\xa3\x94\xa8\x8d\xb2\xa3\xe6\x1a\xe4\x33\x0f\x13\x82\x0e\xd7\x8c\x30\x80\xc2\x60\xb5\x1c\xc1\x51\x84\x69\xf9\x7f\x9c\x3f\xd5\x99\xef\x60\xe6\xde\x64\xce\xbe\x46\xf6\xc0\xed\x46\xf1\x9d\xa3\xe5\xdf\x5f\x41\x8c\xb2\x40\xc7\x60\x56\x45\xad\xd0\x81\x3e\x17\x06\x2b\x68\x31\x2a\x8b\xe7\x65\x7f\x7e\x29\xc8\xa7\x84\x20\x03\xf1\x6c\x0c\xc2\x86\xa4\x98\x40\x5f\x60\x45\x3c\xcc\x9c\x92\x92\x2b\x1e\x7c\x55\xd8\x82\x8c\x69\xbd\x97\xb2\x8d\x96\x89\x8e\x09\x2a\x38\xc2\xb5\xa6\xd6\x2a\x83\xad\xca\xb5\x2b\x2a\xb9\x8e\x17\x7d\xb6\xbb\x3a\x6b\x92\x3f\x4a\xfe\xd5\x4d\xed\xe0\xe3\xda\x06\xb7\x7c\xc5\x97\xb2\xdb\x8f\x77\x91\x83\x7e\x21\xbe\x2c\x63\x6a\xd9\xf7\xde\x64\x38\xff\x16\x6c\x7a\x07\x81\x21\x5c\x11\x18\x4e\x98\x69\x3d\x1b\x4e\x34\xc7\x06\x61\x1b\xa6\x5c\xdb\x30\xe1\x46\x28\xd2\x18\x51\x86\xd1\x8a\xcc\xd8\xb2\x5e\xa0\x9d\x38\xca\xbe\xce\x1a\x2c\x8c\xd3\x9c\x73\xa7\xe8\x7e\x94\x4a\x2a\xc6\x88\x3d\x8a\x29\x54\x9d\xd4\x54\x01\x35\xf1\xc9\xba\x70\x2a\xad\xb4\xc6\x68\xd3\x18\x25\x4f\xcb\xbc\x6e\xe3\xb8\x3f\x24\xff\x34\xf9\xed\xcd\x9e\x71\x83\x82\x6e\xea\x03\x71\xa3\x5e\xd5\x08\xff\xfa\x35\x5d\x78\x61\xd2\x7e\xfa\xfc\x94\x62\x60\x62\x8d\x0d\x4c\x61\xf4\x86\x63\x12\x4c\x60\xb0\x36\x61\x0f\xf6\xc1\xa5\x35\x82\xf8\xc8\xb8\x49\x29\xff\xa6\xa5\xf7\x1e\x94\xde\x83\xc2\xfb\xcc\x48\x69\xb8\xe6\x52\x62\x88\x0a\x45\x84\xe6\xe1\x58\x94\x98\xa3\x3a\x0c\xc6\x2c\x00\x20\x26\xa8\x93\x2d\x98\xce\x76\x57\x64\xe3\x4b\xb4\xf1\xbb\x17\xbd\xc0\x78\xdc\xdd\x34\x9a\x3f\xac\x37\xe1\xda\x7a\x9c\x62\x0b\x72\x0f\x12\xfb\xac\xf0\x26\xff\x76\xe2\x99\x7c\xae\x6d\x2a\xe6\xc6\xa0\xf2\x88\x4a\x47\x40\xf1\x6d\x04\x79\x09\xb3\xc6\x76\x9d\x9d\xa2\x2f\x97\xe6\x63\xd4\x32\xe4\xc6\x20\x14\x73\x6c\x7c\x87\x36\xea\xb5\xf3\x7e\xad\x85\xc5\xcf\xb9\x7f\xbd\x60\xef\xaf\x29\xc1\x2b\x91\x7e\x9d\x79\x69\x12\x34\xe0\x08\x56\x14\xf4\x41\x83\x31\xd8\xb6\x96\x55\xe7\xdb\x48\xcf\x71\xc1\x83\xe4\x2a\x0f\xb3\x1c\x20\xa7\xa9\x63\x1c\xab\xd9\x50\xc3\xa5\xd4\x7c\x02\xb0\xd6\x4a\xaa\xd4\xb1\x13\x3f\x27\x3c\xae\x13\xfd\x99\xef\xe8\x86\xbe\x64\xaf\xfe\xf5\x8a\xd0\x7f\xbc\x96\xf0\x7e\xc1\xa8\x5d\xc6\xe3\x97\xaf\x8f\x17\xdf\xed\x6d\x54\x8a\x7d\x7c\x0f\x8e\x60\x28\xaa\x1c\x74\x01\x16\x25\xe8\x4d\x70\x56\x49\xe3\x69\xe8\x99\xdb\xcb\xca\x84\x41\x03\x56\xe4\x41\x64\x7c\x76\x51\xd4\xe0\x72\x64\x47\x01\xcb\xa8\x39\xe1\x2c\xa1\xab\x86\x12\xb5\x88\xda\xd4\x20\x38\x11\x22\x09\x39\xd0\x03\x21\x6b\x8e\xd2\xee\x48\x76\x48\xfe\xec\xa5\xda\xb8\x8e\xb5\x57\xef\xbe\xfb\xd8\x3e\xb0\x8e\xb6\xed\x97\xaf\x4f\xef\xaf\x6e\x13\x29\x02\xdc\x83\x9c\x12\xc1\xf9\x29\x48\x0f\xda\xe7\xe3\x81\x82\x72\x0c\x14\x74\xa1\x4d\x11\x67\xe3\x18\x6d\xdb\x92\x90\x64\x4a\x6b\x8e\x88\x64\x54\xf3\xb9\x05\x2d\x37\x42\x6b\xa5\x30\x51\x81\x9b\x50\xeb\xe5\xba\x2d\xd8\x83\x65\xfb\x7f\x48\x6e\xf7\xf3\x35\xb7\xfb\xfe\xf1\xf3\x25\xb7\xdb\x81\x29\x26\x7c\x40\x17\xfc\xbe\x12\x75\xeb\xeb\x70\x12\x00\xbb\xd0\x80\x3a\x14\xe3\x82\x88\x2c\x81\x0a\x62\x60\x01\xaa\xa3\x68\x5b\xa6\x85\xb0\x2c\x30\x25\xb5\x95\x0b\x8a\xed\x8c\x76\x1e\x74\x2c\x98\x01\x62\x42\x09\x11\xc3\x00\x11\x23\x14\x27\xdb\x78\xcd\x64\xd4\x76\xf8\xd3\xa8\x0b\xfd\x2f\x6f\xf3\x44\x2f\x59\xf2\x17\x56\xe8\x6b\x92\x7c\xed\x08\x4f\xb1\x51\x52\x99\x4d\x4e\x9d\x8f\xe9\x83\x62\x66\xa0\x88\xa9\x84\x13\x06\xa6\x5f\xb6\xa8\x90\x58\x29\xb4\x01\x89\x16\xb5\xa9\xb3\x8a\x49\xad\x98\xd2\xb0\xac\x4d\xb5\x44\x34\x95\x71\xd0\xc0\xe7\xbe\x07\x2d\x95\x5a\xd1\x81\xed\x3b\xd1\x26\x5b\x70\x38\x9b\x88\x97\x7f\x88\x35\xfa\x35\x9b\x16\x15\xb2\x5e\x98\xe7\xcb\x43\x64\x70\xfe\x74\x2b\x37\xbf\x29\x50\x09\xda\x0e\x03\xfc\xcd\x03\x58\xa2\x16\xb4\x65\x99\x4f\x28\x0f\x2d\x0c\x63\xc6\x9f\xdb\xea\x2a\x20\x9e\x4d\x84\x1a\xa7\x35\xa3\x06\xc1\xd0\x29\x48\xc3\x38\x1f\x00\x97\x61\xaf\x23\x36\xd9\x27\xc9\xae\x8c\x1a\xd2\xdf\x65\x21\xa2\x8a\xc1\x77\xaa\x63\xa9\xcc\xc8\xf3\xde\xa7\xe5\x7c\x0c\x07\x30\x85\xc2\x1f\x0e\x60\x58\x5e\xb8\x71\xcc\x4c\xb0\x4e\x87\x2e\x08\xd3\x99\xe5\x21\xb9\x8e\x93\x7c\x53\xbe\xf8\x73\xfd\xe5\xfa\xaf\x5f\x56\xc8\xd5\xc3\x66\x73\x89\xd6\x9f\x2e\xc8\xf4\x95\x41\xb5\x9c\x79\x5a\x66\x5d\xc0\x60\x0c\x30\xcd\xb5\xdf\x93\xba\x09\xa7\x50\x53\x50\xf4\x6d\x8b\x05\x30\xa1\xf5\x91\x2c\x72\x39\x40\x5b\x89\x59\x8e\x9b\x72\x1e\xa9\xa4\x42\x31\xaa\x09\x16\xc8\x96\x08\x43\xae\x47\x60\xe9\x81\x1d\xe8\xdc\x62\x82\x57\xec\xc2\x76\x64\x93\x27\x7f\x1a\xdd\x7a\x23\xb7\xf0\xa7\x87\xbb\x5f\x60\x97\xaf\x77\x1f\x61\xcc\x6a\x6c\x7f\x7a\xb8\xe9\xba\xbd\x91\x09\xda\xee\xd9\x31\x1c\x31\x52\x23\x43\x1e\x91\xce\x3f\x37\xbe\x83\x84\x3b\x94\x26\x61\x02\x18\x62\x19\x3a\x02\x69\x5d\x49\x3a\x8f\xe9\xc8\x4d\xed\x64\xdd\xf6\xa1\x23\xc7\x66\xd8\xe4\x16\x95\x54\x60\x1d\xa5\xf4\x4e\xce\x81\x9c\x31\x94\xdb\x30\x70\x86\x0b\xca\x03\x43\x84\x32\xe7\xa2\xc3\x81\xe4\x8a\x39\xc4\xe8\xb2\x26\x54\x71\x0c\xed\x2f\x5a\x5d\x9f\x96\xab\xfb\xf1\xd3\xc3\xf2\x8d\x1f\xee\x3e\x5d\xf8\x84\xe9\xf7\xf9\xcf\xec\x45\xbc\x77\xe5\x52\x82\x3a\x55\xb9\xcf\x6b\x88\xa5\xc1\x5d\x90\x05\xa6\xc4\x71\xcd\x4a\x98\x57\xd8\x08\x2d\x1c\x73\x42\xc0\x57\x09\x5f\x20\x8a\x63\x18\x31\xc0\x19\x76\x0e\x23\xaa\xb0\x3d\x78\xdb\x91\x73\xd2\xb8\x81\x84\x43\xab\xb9\x52\x66\x04\x05\x0f\x46\xd7\xa1\xd7\x92\xba\x58\x5f\x4b\x93\xb3\xda\xd1\x6c\xb8\xe1\xcc\x47\x24\x1c\x35\x56\x56\x6d\x95\xdd\xd3\x6f\xb3\xc7\xf7\x1f\xd6\x62\xc1\xdd\xc7\xed\x7b\x70\x1f\xf1\x4c\x5c\x6e\x2b\xd9\x0d\x05\xa8\x43\x85\x2d\xc4\x50\xc1\x6a\xf0\x41\x01\x0d\x4f\x23\x4b\xcb\xb2\x08\x75\x46\x9e\x65\x56\xcc\x36\xb5\xd9\xa0\xca\x62\x89\x52\x85\x41\x1d\x48\xac\xd0\x0c\x33\x70\x28\x7b\x5e\xd0\x60\x42\x0e\x4e\x83\x94\x52\xac\x3a\xda\x40\x44\x4c\x52\xff\xbf\xab\xff\x7c\x79\xb8\xad\xff\xf4\x18\x8e\xa1\xcd\x01\x16\x06\xf3\x92\x13\x84\xf2\xae\x68\xb5\xe4\x85\x1f\x21\x4a\x0f\xbe\x28\xab\x86\x37\x4e\x54\xa2\x13\x95\x15\xce\x97\x7d\x2d\x9b\x2e\xab\x19\x77\x8c\x06\xd2\x16\xb6\x10\x00\x85\xae\x93\x12\x24\x80\x3a\x82\x21\x42\xa8\x16\x56\xd5\x95\x91\x4d\xcf\xa4\x52\xac\x91\x46\x5b\x99\x24\x29\xa8\xce\xc7\xed\x29\xeb\x92\x3f\x8e\x99\x98\x87\xdd\x2d\x9c\xfa\x39\x5b\xeb\x3d\xdf\x75\x83\x64\x85\x2b\xcb\x34\x67\x46\x31\x12\xa8\xaa\x34\xc8\xeb\xb1\x96\xbe\x8f\x88\x6f\x7f\x71\xd6\x3e\x3c\xe7\x59\x87\x50\x69\x94\xe4\x84\x1a\x29\x9a\x70\x44\x54\xd1\x52\x68\x2d\x8d\xd4\xf3\xf1\x82\xff\xcd\x0e\x66\xe3\xeb\xae\xbe\xac\xff\x7f\x47\x32\x2e\x26\x52\x5f\x26\x79\x4a\x33\x1f\x28\x84\x60\x68\xa8\x6b\x2a\x32\x0c\xa7\x70\x64\x80\x28\xef\xc8\xb0\xb7\x74\xce\xc1\x50\x94\x38\x38\x9f\xea\x39\x1e\xd9\x18\x10\x22\x46\x0b\x4c\xad\x60\x1a\x59\x84\x11\x54\x98\x52\x61\x20\x84\x00\xd1\x89\x5d\x62\x2e\xb7\xd3\xd9\x98\x7c\xbc\xe5\xa4\x5e\x62\xae\xef\xc4\xbd\x2f\x7e\x87\xcb\xd6\xf9\xe5\xdf\x2d\x98\xe3\x4b\x16\xe3\x97\xdf\x7d\x7c\xda\xdd\x7d\x27\x55\x95\xf5\xae\x84\x69\x71\xaa\x5a\xce\x78\x68\x89\xad\x91\xcf\xd5\xf1\xa0\x43\x5b\x53\x2b\xaa\x70\x02\x0e\xd7\xad\x3f\x09\x31\x08\x3b\x0c\x40\xee\xe7\x43\x7c\xca\x46\x84\x91\xd1\xcc\x42\x12\x14\x85\x05\xd5\xb8\xe1\x84\x29\x60\x96\xb8\x47\x1a\x12\x5a\xce\x99\x90\x27\xce\x79\x38\xad\x21\x7e\x02\x36\x30\xc1\xbb\x26\xcb\x93\x7f\x72\xd3\xe7\xb0\x7c\xff\xad\xe6\x8d\x98\xa0\xcf\x61\xad\xa5\x02\xa6\x77\xa6\x07\x75\x69\xb5\xeb\x74\x1b\x35\x34\xa7\x5d\x91\xe9\xbf\xab\xde\xf0\xf9\x31\x15\x99\x78\x6e\xe2\x46\x31\x6e\x92\xe7\xa4\x4a\x87\x19\x67\x3a\x38\xe3\x82\x0f\xca\xb9\xd5\xeb\x9a\x9c\xd9\xf6\x94\x1d\x2f\xb5\xa7\x9f\xd7\xcc\xe7\x55\xa3\x23\xde\xd4\xed\x45\xa8\xf4\x37\xe0\x52\x77\xfa\xfa\xf0\x65\xdb\xce\xa5\x55\xa8\xab\x19\x50\x10\x19\x46\x82\x59\x35\x18\x85\xd5\x5a\x72\x7d\x08\xa3\x1e\x4d\xc6\xe6\x65\x15\xc1\x96\x13\x9e\x79\x04\x05\x13\x96\xf3\x5e\x88\x89\x73\x42\x99\x1e\x5a\xee\x68\x92\x81\xe3\xb9\xdf\x91\xac\xb9\xec\x92\x11\xb3\xde\x2f\xa8\xe7\xb6\xf6\xb1\x12\xb9\xae\xf9\x97\x1a\xf8\xa0\xa5\xa2\xd6\x09\x07\x51\x70\xa1\x84\xc7\x31\xca\x83\xad\x3d\xf0\xcd\x12\xfa\x66\x8d\x0d\x78\x5f\x94\x9c\xf8\x96\x52\x2a\x61\x05\x47\x30\x84\x6e\x01\xcb\x71\x5c\xdb\x73\x7d\xc1\x0e\xff\xd0\xfa\x52\xd4\x90\xf9\xf4\xd3\xc3\x96\x32\x2a\x28\x9b\x8f\x16\x33\x4f\x28\x3f\x66\x4d\x11\x5c\x09\x95\xe0\x52\x33\x02\x4b\x47\xad\xd1\xae\xe7\xbd\xc7\xf0\x9c\x94\x20\x29\x72\x97\x17\x59\x85\x88\xa2\x98\x23\xa5\xe7\x22\xc5\x84\xd8\xa1\x74\x58\x0b\xa9\x94\x51\xba\xc3\xe1\xd8\x2a\x6e\x84\xd2\x15\x74\xd0\xd8\x28\xe1\x1b\xf1\xa1\xd9\xd9\xac\xbf\xe8\x68\x7f\xf8\x3b\xf5\x8b\x7e\x5e\x15\xb4\x5f\x46\x04\xf6\x65\x99\x12\xef\xa7\x23\x0f\xfb\xd3\x29\xb4\x78\x3a\x08\x41\xd9\xb2\xf8\x30\xab\x02\x85\x26\x1c\x56\x58\x01\xe7\x31\xeb\x21\x82\x5a\x73\x81\x1d\xd7\x16\x3b\xc8\x11\xc6\x50\xdb\x8e\x32\x48\x82\x8f\x3b\x3f\x00\x6d\x02\x77\x2c\x43\xc9\x9f\x5c\xbb\x92\xde\x3f\xbe\xbf\x52\x20\x5e\xb9\x14\x87\x0d\x0b\x05\x68\x82\xd8\x43\x6c\x38\x6e\xbe\x29\x30\xc5\xa6\x37\x92\x21\xd7\xd8\x01\x63\xc6\x85\x73\x83\x6d\xd6\xf3\x1b\x77\x36\xdb\xc7\x9c\xff\x53\xc4\xbf\x2b\x8d\xf3\xd3\xfd\x97\x77\x0f\xe9\xf6\xea\x27\x77\xe5\x95\xbd\xb1\x93\x4b\x14\xb1\x58\xd5\xd5\xa1\xf3\xc7\x30\x14\xbe\xa2\x79\x55\xa8\x73\x12\x8e\xa5\xb5\xac\x75\xa3\x87\xd2\xab\x6c\x92\xd4\x52\x99\xed\xa5\x61\x5a\xe9\xc0\x2a\x20\x58\x50\x7d\x49\x3b\x7c\x54\x9c\x61\x4b\x39\x68\xd0\xd0\xb2\xb6\xaa\x2f\x7e\x1f\xe9\x1a\x43\x64\xfd\x65\xfd\xfd\xe9\xe1\x6e\x8d\xf9\xa2\xb1\xe8\x47\xf0\x86\x11\x74\x7f\x31\x4f\xd9\x1c\xeb\xca\xe8\x50\x05\x8d\x8e\x8d\x93\xae\x1f\xd4\xcc\x41\x59\x01\x58\x81\x32\x1c\xab\x30\xe0\x70\xa0\x07\x78\x4e\x32\xeb\x7b\xe9\x69\xa1\xd5\x01\x3b\x5d\x40\x15\xb0\xb5\xd6\xfa\xd8\xe1\xdb\x20\x8b\x0e\x6b\x8e\xfa\x5c\xed\x68\xc6\x2e\xf3\x34\x7a\x19\xbc\xe9\xf1\x7c\xd9\xf0\x0f\x1b\xd5\x33\xad\x04\x54\x92\x3e\x1f\x79\x4c\xee\x4d\x53\xc6\xfc\xdc\x68\x01\x3d\x14\x29\x71\xc1\x19\x9f\x64\xa0\x3d\xeb\x1d\xcd\x44\xf2\xc7\xd1\xe1\x33\xb9\x6a\xce\xae\xd9\xfc\x97\x4e\x8d\x15\x27\x27\xd9\x31\x48\x70\x0a\x79\x1d\x0b\xcc\xe2\x48\x4a\x5f\x92\xb4\x75\x98\x1b\x96\x09\x17\xbc\x0b\x15\x50\x0e\x68\x12\x1b\x83\x11\x76\x92\x8b\xb5\x8e\x70\x3c\xdb\xb8\x7f\xfd\xf6\xb6\x72\xf4\x4b\xb6\xe4\xa5\x14\x07\x8e\xa0\x29\x90\xc7\x25\xd8\x07\x02\xea\x0b\x63\x92\x84\xc9\x9f\x3c\x70\x81\x65\x90\x10\xc4\x99\x73\xc1\xf3\xd8\x2d\xb9\x8f\xda\xed\x26\xcd\x5d\x8c\x81\xcd\x76\xca\x6e\xfd\xcc\x92\x0f\xb1\xf0\x1f\xf3\xeb\x4f\xe0\xf3\xe3\xfb\xa8\x2c\xf2\xfe\xf1\xf3\xc3\x32\x37\x9a\x70\xf0\x9b\xc4\x87\x83\x07\x5d\x38\xf8\x6b\x5a\x24\x26\x42\x27\x91\x36\xb3\x10\xc1\xa5\x83\x31\x66\x95\x74\x59\xc6\x83\x39\x37\x3b\x12\xf3\x35\x8f\xb1\xe6\x72\x6b\x10\x78\x43\x9b\x03\x17\x02\x53\xd6\xd4\xce\x09\xa7\x8d\xd6\x62\xbf\xe7\x5a\x30\x28\x38\x2c\xe7\x13\x18\x50\x70\x02\x14\x34\x1c\x32\x17\x06\x66\x3d\xaf\x35\x17\xbe\x33\xa1\xd3\xa2\xac\x20\x24\xa9\x08\xa8\x75\x0a\x14\x6b\x3d\xe6\xb8\xcb\xb3\xe6\x52\x11\xfb\x7b\x36\xe0\x6c\x64\x08\x74\x1d\x34\x75\xcd\xdb\xae\x0f\x07\x09\x92\xa6\xeb\xc4\x30\x28\x38\x63\xb0\x47\x24\x6b\xb8\xf2\xb5\xe3\xd2\x1b\xe1\xb9\xa3\x8a\x53\x4d\xa4\x32\x9e\x45\x6d\xad\x2c\x15\x09\xd9\x36\x59\xf2\xa6\x1e\x76\xc1\x68\xcd\x73\x9b\x46\x85\xa2\x2c\x99\x49\xba\x0f\x63\x55\xd9\xaa\x4a\x32\x30\x9e\xdb\xad\xcf\x78\xbc\xee\x7f\xfe\x86\xe9\xbe\x7a\x30\x7c\xf9\x13\x10\xaf\xf9\x02\x0e\x7e\xdc\x7a\xce\xb8\x85\x9e\xa0\xf9\x08\xa5\x35\x55\x9a\xcf\xa7\x3c\x2d\xe6\x53\xc6\xe7\x84\xf3\xd2\x95\xd8\x34\xc6\x7a\x40\x01\x3d\xe9\x50\x19\x84\x13\x00\xba\xf3\x7e\x07\x33\x14\xab\x5d\xd7\x78\x74\xf3\x86\x38\x00\x4e\xa0\xab\xe2\xd8\x49\x0e\xb2\xdd\x57\xf5\xa4\x8e\x4d\x68\x53\x57\xd7\x1e\x2a\x67\x8d\x08\x1e\x0c\x7b\x67\x75\x9f\x00\xe0\x92\x64\x87\xb2\xf6\xea\x42\xfd\xfe\xc3\xc3\x36\x1e\x3f\xbe\xac\x36\x0b\x76\xd8\x7e\xfc\xf0\x79\x39\xe2\xe2\x4a\x68\xbf\x07\x6d\x11\x68\x5a\x16\xf3\x01\xb1\x89\x16\xae\x54\xa1\xeb\x78\x60\x25\x18\x42\x5d\x02\xd3\x34\x18\x8c\x59\xab\x31\x5c\x16\x1c\xc5\x2c\xe3\x08\x22\x8e\x3c\x67\x52\x11\x4b\x14\xb6\x58\x96\x85\xc1\xcb\x7d\x1d\x12\xba\xc3\x59\xb2\xd6\xbc\x7e\xd9\x3f\x9b\xa2\xac\x09\x36\x56\x79\xc6\x6f\x35\x18\xe3\xca\x60\xb2\xc4\x79\x5b\x3b\x57\x5b\xbf\x8c\x49\x75\xee\x76\x65\xd6\x5e\x6b\x90\x97\xdc\xce\xca\xe3\x7b\x21\xcd\xff\xfc\x6e\xad\x46\x82\x03\x30\x45\x5e\x15\x29\x9a\x1b\x1d\x8c\x04\x54\x87\x3e\x23\x95\xf2\x65\x11\x9a\x60\x11\x48\xda\xba\xa9\xf7\x07\x9d\x21\xca\x0a\xe3\x43\x3f\xd8\xea\x14\x86\xaa\xa5\x08\x09\xe8\x5a\x20\x71\xe8\x6c\x49\xed\xf2\xfd\xdd\xb9\xdd\xf1\xac\x7a\x5b\x19\x7e\x23\x55\x13\x89\xae\x7f\x9b\x7e\x7e\x04\x6d\x0a\x31\x71\x9c\x82\x61\x26\x79\x6a\x4c\xc7\x4d\x69\x84\xa0\x45\x28\x70\xe8\xb4\xee\x69\xe8\xd2\x03\xc1\x42\x28\xcf\x68\xf0\xf5\x32\xc3\xbb\x63\xad\x51\x35\x54\x49\x0a\x9a\xa4\xd8\xc9\x6c\xb8\xd4\xa1\x5f\xf4\x8a\xc1\xfd\x1b\x6f\xeb\xc7\x3f\x02\xab\xe5\xc7\x89\x60\xb0\xff\xd6\x83\x01\x42\x50\x09\x0a\x73\x9f\x8b\xa6\x62\xa1\xcb\x6d\x2d\x2b\x95\x0d\x4c\x7a\x8f\x61\xe8\x43\x4b\x89\x41\x8d\xa2\xea\xd8\x35\x54\xd3\x6a\x5c\xeb\xab\xdd\xd9\xee\x50\xb6\xf6\x35\xae\x0e\x32\xb7\xeb\xfc\xd3\xd5\x81\x22\x2d\xb2\x61\x0f\x8a\x30\x55\xe1\x80\xc3\x24\x07\x7c\x02\x79\x97\xea\x30\x66\xd4\x4d\x6b\xe1\x73\x70\x56\x1e\xfc\x34\x4d\x53\x02\xd2\x24\x61\xbb\x24\x2b\xe3\xdc\x8a\x1e\x8b\xeb\xb1\x40\x9b\xa2\x7e\x4e\x6a\x50\x64\xe5\xdc\x83\xfd\x02\xaa\x02\x59\xd7\xd1\x7d\xcc\x79\xe7\x2b\xda\xbb\xaa\x2a\x5c\x2a\xaf\x30\x6b\x83\x59\x82\xe8\x3a\x76\x47\x9a\x2c\x77\x7b\xbf\x20\x22\xbf\xd6\x38\x87\x04\xef\xca\x9b\xf9\x7c\xa9\x71\xc6\x41\x92\x64\xe3\x33\x24\x99\x79\x76\x6a\xc3\xbe\x75\x59\xe2\x2a\x57\xf9\xcb\x67\x26\x68\x57\x66\x30\xe2\xd3\x87\xdd\xdd\x32\xd5\x62\x1b\x50\xd6\x55\x25\x06\x78\x54\xc7\x73\x62\xc3\x41\x80\x3e\x83\x45\xa5\xab\xbd\x1d\xdd\xe0\xcd\x90\x24\x20\xc5\x40\x6d\x3b\x70\x7a\xa9\x8f\xe2\xcc\x3d\x1b\x70\xf2\xcb\xef\x86\xb3\xd8\xf8\xdd\x72\x5d\x2f\x3d\x11\x7f\xf0\xe2\x55\xfe\x2e\xfe\x3d\x1d\x40\x7b\x4e\x40\x91\x1b\xc7\x44\x29\x38\x83\x30\x4c\x20\x09\xe3\x8e\xce\x4d\xe8\xe7\x2e\x9c\x90\x47\x0e\xb4\x29\x07\xb1\x0e\xb5\xcd\xc4\x99\xde\xb1\x8d\xbc\x51\x6c\xbb\xac\x11\x17\x95\xbc\x78\xb5\x56\xf7\xa7\x6b\xbd\xf2\xaa\xdb\x96\xd5\x40\x44\x93\x32\xd0\xfb\x30\xf8\x30\x79\x50\x87\xc6\x1e\x0e\x40\x1d\x67\xb3\xdc\x58\x50\x03\x9c\x1d\x9c\x0b\x56\x85\x5c\x86\x23\x28\x55\x9a\x28\xe3\xbd\x9f\x75\xd3\x2c\xf8\x25\xed\xcf\x74\xbb\xf2\x24\xff\x30\xb9\xbf\x56\x4a\xde\xc7\x42\x6e\xf6\xc6\x4c\xe7\xeb\x2f\xa5\xba\x56\x2f\x9d\x13\x2e\x0f\x73\x37\x94\xc8\x2d\x48\xac\x3a\x1e\x7d\x0a\x85\x3a\x94\xda\x0a\x41\x70\x01\x31\x15\x82\x1c\x39\x0d\xcd\xce\x48\xed\xdc\x02\x5e\x82\x32\x4d\xb0\x5e\x09\x84\x1d\x82\x07\xca\x72\x97\x97\x55\x59\xd4\xb8\xa2\x6b\x4c\x1e\xf5\x38\x76\x26\x3a\xfc\x2c\xe8\xe1\x6f\x2e\xf7\xf2\xda\xd2\xb5\xd2\xe2\x2f\x85\xc4\x87\x17\x2d\xb5\x37\x7a\x5b\x97\xc5\x68\xf7\xf4\x11\x6e\x91\x2d\x0a\x90\x2c\xc1\xff\x74\x4e\x0e\x61\x12\xc0\x22\x40\x43\x7f\x4e\x32\xfa\xdc\xbb\x28\x2a\xd8\xb3\xa0\x22\xc1\xe1\x10\x10\xd3\x82\x95\x42\xa2\xd8\xda\x27\x41\xdd\x0e\x08\xf4\x3b\x43\xcb\xa2\x97\x56\x1f\x0e\xce\xec\x8d\x12\xa1\xd3\xea\x64\xa1\xb2\xda\x99\x95\x96\x27\x9d\xb6\x32\x77\xb1\xd6\x7e\x4a\xe1\x1d\xdb\x99\x95\x27\xfd\x46\x63\xf0\xdd\x53\x0a\x3e\x26\xef\x2e\x0e\x57\x91\x6c\x40\x2b\x88\xd2\x4e\x39\x2a\xa0\x64\x18\xe5\xa4\x09\x4e\x03\xd6\x56\x3e\x4c\x7a\xd2\x52\x6a\x35\xee\x0c\xe4\x7c\xd6\x53\x51\x15\x0e\x0c\x01\x87\xbd\x02\x39\xa8\x42\x37\xa8\xee\x64\xb8\x8c\x3c\x1b\x90\x36\x67\xb1\x85\x3b\x99\xfc\x78\x71\xdb\x7c\x5c\x6d\xd0\xfe\x00\xdc\x7d\xfc\xf2\xc3\x9f\x80\x9f\x37\x03\x6f\x0e\x40\xf3\xca\xe5\x84\x1a\x82\x41\xb1\x93\x4e\x92\x70\xf0\xdf\x86\x0d\x0e\x65\x50\xad\xac\x40\x95\x96\xa0\xc7\xcb\x18\x95\x67\x76\x27\x5e\xbc\xec\xfe\x38\xee\x3b\xf7\x8f\xf7\xdb\xa7\xfb\xbf\x49\x57\xd3\x96\x6c\x0d\x03\xef\x1e\xdf\xff\x98\x26\xaf\x26\x6b\x77\xe2\x99\xa6\xd0\x5a\x67\xed\x7c\x74\x2e\x47\x58\x1d\xad\xa7\x69\x7e\x0c\xf6\xc4\x52\x55\x07\x4a\xac\xd6\x6a\x47\xe6\x3a\x95\xee\xe2\x65\xcf\xbf\x4d\x08\xe9\x3d\x40\xdc\x3a\x12\xf4\x39\x61\x8d\x07\x07\x2a\xa4\x8d\x31\x45\xb6\x11\xc9\x71\x47\x6e\xfa\x5e\x2e\x46\xa1\xf7\x9f\xee\x9f\x36\x62\x59\x4f\x5c\x34\xd7\x50\xcf\x36\x2d\xa6\xd9\x82\x22\x49\x37\xc5\xf9\xb4\x6b\x36\xcd\x8a\xae\xc0\xd5\xaf\xf1\xe9\xfe\x29\x76\xff\xdc\x47\x27\xcf\xd8\x23\xbd\x21\xa9\xd0\xce\x59\xd3\x68\x6f\xad\x9a\x8c\xd9\x34\x2e\x34\x6e\xde\xa7\x04\x87\x6e\x10\x3d\x48\xf0\xda\xcb\x21\x92\x2c\xed\xce\x6c\x5b\xef\xf2\xe4\x2e\xb9\x8f\x59\xca\x8b\x82\x06\xf8\x54\xc4\xcb\xfd\x4f\xc1\xc5\x0a\xdc\xb8\x50\x3b\x90\x38\xda\x3a\x69\x6a\xb2\xb7\xdc\x51\xb3\xcb\xbf\xe1\x0d\xfb\xd6\x6e\x0e\x61\x3f\xbb\x60\xc3\x20\x8d\x00\x25\xe0\xc1\x36\x1d\xef\xda\x24\x4d\x54\x4a\x37\x7c\x67\x92\x7f\x1f\xd9\xb1\x3f\x3d\xdc\xbd\x28\x9f\x5e\x32\xec\x2f\xad\x19\xb7\x56\xdc\x2f\x0d\xb5\xd1\x3c\x6c\xed\xcc\xf8\x18\x53\x44\x60\xcd\xdc\x26\x0c\x63\x65\x8d\x81\x0c\x19\x84\xed\x44\xa6\x60\x80\x0b\x66\x6a\x9a\x0e\xe0\xe7\xd6\x2b\x2e\x75\xdf\x4f\x91\xc7\xe2\xf6\xbc\xa9\x11\x05\xbc\x86\x30\x1c\xd0\x4e\x53\x0e\xbb\xae\xeb\x04\x47\x8c\x48\x29\xa8\x08\x15\xe5\x4c\x06\x09\x6c\x89\x05\x2a\x09\xa7\x40\x09\x2a\xa4\xa4\x24\xec\x21\xc5\xcb\x7d\x2b\xd2\xe9\xac\xef\xaa\x9d\x7a\x93\xd7\xfd\xd3\x9b\x0e\x81\x4f\x51\xeb\xf8\x3f\xbd\xde\xd1\xdb\x2c\xc7\xf5\x67\x9f\x2e\x3f\x5b\x9e\xdf\xfd\xca\xcf\xc0\x77\x5e\x34\x99\xc9\xfc\xb3\xf6\xa7\x13\x30\xa7\x79\x7d\x7a\x8e\xb8\x6d\x09\xeb\x59\x38\x2d\x8f\xc3\x12\x71\x38\xce\xbb\x98\xe5\xe8\xf8\x33\x01\x7b\x1f\x15\x2f\x8b\x6f\x22\xcd\x03\xd9\xa9\x79\x00\x3c\xaa\x70\x2d\x0f\x87\xb9\x01\xca\x2d\xeb\xaa\xf7\x1e\x88\xdb\xbf\x05\xe9\xdc\x32\xde\x5d\xb2\x8b\x3a\x4a\xed\xce\xc6\x3e\xc5\xff\x35\xf9\xdf\x93\xff\x23\xf9\x3f\x5f\xab\x5b\x6b\xdf\xc3\xda\xfb\xb0\x56\x43\xb7\x2b\x17\xe5\xd3\x8f\x0f\x9f\xde\x3f\xbd\x8b\x39\xd2\x1f\x62\x32\xe8\x25\x88\x8f\x5a\x2a\xef\x3f\x45\x85\xdf\x98\x32\x8d\x8a\xf8\xd7\xa2\xf0\x55\x04\x77\x19\x08\xef\x3e\x3f\xbd\xdf\x94\x1e\xe0\x18\x14\xc4\xed\x61\x04\x30\x3d\x62\x28\x4b\xfc\xac\x34\x4b\x85\xcd\xf7\xfb\x02\x43\xcb\x14\x84\x45\x61\x4a\xcb\x29\xd7\x8c\xe2\xe0\x81\x15\x52\x4a\x8c\x70\x11\x90\x35\x86\x94\x42\xf0\x92\x8d\x1d\x18\x85\x68\x1a\x21\x76\x56\x6b\x6d\xa5\xf4\xde\xd6\x84\x62\x42\x64\xd8\x03\x28\x30\x72\xf3\xa1\xea\x71\xf0\xe3\x39\x51\xaa\x0c\xfd\xd1\x29\xc9\x58\x56\x99\x26\x34\x0d\xe7\x7c\x4a\x49\x48\x82\x0c\x2d\x03\x0c\xa8\x70\xf2\xc2\xf6\x56\xa9\x26\x44\x7e\x4a\x93\x24\x77\x19\x3e\xb3\xc8\x5b\xbd\x56\xbe\xfe\x4b\xf4\x9b\x7a\xf1\x10\xfb\xfc\xe9\xfe\xf1\x7b\x22\xf0\xfd\xd5\x84\xef\x77\x1f\xbf\x3e\x5e\x45\x4c\x63\x91\xf9\x0d\xeb\xe8\x45\x4c\x77\x2d\xdc\x3e\xdd\xc7\xd2\xe7\xc3\xee\xee\x61\xd9\xe3\x62\xe1\xf2\x54\x05\xce\x17\xa0\xba\xae\x43\xa1\x05\xfe\x59\x94\x50\xd4\xcc\x96\x03\x84\x3c\x60\xb0\xbf\x64\x6b\xf2\x70\xca\x30\x17\x10\x43\x86\xe0\xa8\x95\x28\x61\xc0\x65\xc1\x0d\xed\x5d\xda\x10\x46\x27\x86\x09\x1e\x86\x1d\x77\x6d\xeb\xc2\xc9\x18\xa1\x84\xe2\x0a\x48\x58\xca\xfa\x08\x29\x82\x78\x12\xbd\x10\x1d\xe7\x4d\xc8\x39\x2f\x4d\x41\x81\x14\x4a\x42\x78\xe8\x8a\x42\x48\x35\x1f\x53\x1f\x0e\x04\x33\xcc\x48\x2b\x92\x5d\x3a\x5d\xb8\x4c\x7f\x78\xd1\x70\x58\xaf\xcc\xb5\x4b\x7c\x4d\x7c\xbd\x15\x46\x7e\xba\x14\x30\x3f\x5e\xae\xd5\x4f\x7f\x03\xee\x9e\xe0\xd5\xb5\xf0\xa7\x87\x65\xbc\x5d\xd4\x1a\xd7\xc5\x63\x7b\xd1\x71\xc8\x5e\x7c\xe1\xef\x94\x7d\x6e\x2d\x18\xa2\x0c\x5b\x20\xb5\x1d\x6c\x55\xf5\x3d\xe0\xe1\xa8\xf6\xca\x84\xc3\x02\xf2\x75\x7d\x44\xfd\x3c\x1a\xee\x68\xcf\x1c\xc6\x36\x0f\x83\x55\x07\x15\x26\x40\xdb\xb6\x06\xd3\x30\x0c\x0a\x34\x18\x4f\x88\x2f\xbb\xeb\xf6\x14\xf6\xfb\x01\x50\x8c\x30\x65\x47\xce\x39\x57\x42\x4b\xad\xa5\xe1\x07\xa9\x6c\x6e\xad\xa2\x96\x9f\x88\xa1\x25\x20\x7b\xae\x23\x25\x41\x08\x21\x06\x19\x3a\x42\x69\x18\x6d\xf2\x8f\xb3\xe4\xcc\xee\x9a\xe8\x33\x77\xeb\x9c\xf8\x9f\x93\xff\x92\xa8\xe4\xff\xba\xe2\xa8\xb7\x73\x6d\xfb\xb8\x66\x51\xd7\x9c\x4f\x44\x58\x4f\xef\x57\x21\xb7\x25\x8c\xff\xfc\xf4\xfe\xe3\xd3\xfb\x4f\xdb\xcf\x4f\xef\x3f\xbc\x18\x9d\xbc\x50\x53\xb2\x8f\x3f\x7c\xbd\xba\x79\xdd\xe2\x8c\xf5\x0d\x19\x03\x89\x07\xa5\x07\x65\x38\xfa\x70\xf4\xe7\x04\xe4\x40\xd8\xa6\x2c\x25\x81\x34\x78\x40\x5d\x67\x1b\x0f\x48\x68\x52\xdf\xd9\xa6\x01\xa4\x0b\x87\x66\x1e\x14\x97\x42\xae\xb4\x96\xce\x30\x6b\x6d\x9f\x12\x5f\xd7\xf4\x42\x06\x9f\xf7\x4e\x4b\x29\xd5\x2e\x59\x02\x7a\xa7\x94\xb5\x93\x94\x08\x52\xca\x0c\x9f\x47\xa9\x94\x4a\x11\x0f\xd3\x72\x79\x96\x49\xc6\x79\x8a\xa8\xd0\x92\x4e\xf1\xf1\xc8\x43\xbb\xe0\x04\x24\x38\x37\xfb\x68\xb9\x4f\x5b\x4c\xb9\x91\x2c\x49\x36\x09\x3b\xb3\xbb\x3a\x43\xb1\x0a\xf6\x3f\x27\xff\xdb\x8d\x3e\xc6\x45\x0d\xe4\xa5\xef\xe1\xf3\x6a\x1d\xf2\x79\x1d\x2b\x77\x1f\x7f\xbe\x7b\xfc\xdd\xc7\xdd\xe5\xed\xd7\x77\x7f\x5d\xc6\xd5\xd7\x57\x7d\xbf\xeb\xdb\x77\xd7\xf7\x6f\xbd\x2d\xca\xfd\x24\x08\x1e\x97\x09\xc6\x51\xe1\x4b\xe8\x9e\x2b\x47\x34\x85\x3c\xd4\x40\x8e\x42\x00\x5c\x00\x29\xb4\x7c\x1e\x96\x37\xd7\x82\xf6\x00\x87\x41\xc1\xc2\x41\x9e\x07\x1b\x48\x59\x17\xd0\xa0\x92\x87\x0e\xb0\x3d\x21\x12\x14\x05\x38\x38\x6f\x33\x84\xcb\xd2\x30\x5d\x94\x44\x99\x9e\x33\x48\x89\xb5\x82\x71\xde\x1b\x85\xb1\xf6\x0e\x71\x01\x12\x54\x96\x5c\x48\xa8\x85\xed\x72\x46\xa1\xcc\x0d\x2c\x6d\x4e\x30\x61\xbc\xb7\x42\x96\x50\x69\xc7\x89\x4a\x92\x64\x17\xf5\x08\xaa\x38\xc6\xfe\x45\xec\x70\x61\xab\x2b\xe7\xaf\x8c\xac\x87\x5f\x48\xa6\xbe\xea\x95\xef\x2e\xdd\x60\x8f\x17\xef\xcd\x6b\xfb\xe4\x55\xe1\xee\x55\x7b\xe5\xf3\x75\x2a\x3e\x66\x09\x80\x1e\x20\xbf\x9c\xba\x5f\xd6\xf0\x31\xc5\x0e\x02\x43\xa5\xf7\xac\xaf\xea\x81\xb5\x86\x12\x4c\x44\x2b\x99\x14\x24\x8c\x45\x30\x31\xc1\x55\x82\x9c\xee\x01\x01\x84\x04\x1b\x9c\xe1\x42\xb6\x16\x08\x80\xdc\xb2\x15\x44\xbb\xe7\xc1\x85\x03\x40\xc7\x63\x38\xec\xf2\x0b\x09\x5d\x6b\x05\xa9\x36\x9c\x14\x16\x31\x8e\x34\xc4\x18\x63\xa4\x0c\xa1\x88\xf0\xc2\x1b\x87\xbd\x0e\x66\x96\x94\xb8\x5a\xca\x4a\xa7\x38\x17\xc2\x30\xcd\x8d\xb5\x86\x6b\x96\x24\xbb\x0d\x4e\x74\xbc\x56\x7f\xfc\xa2\x9e\xf8\x26\x9a\x59\xf7\xe3\x6b\x14\xf3\xee\x42\xc3\x7c\xb8\xa8\x6b\x6e\xcc\xf2\x0d\x71\x18\x80\x7e\xae\x80\x0e\x07\x1f\xbd\xdb\x55\x48\x52\x34\xf3\x95\x67\x56\x05\xb5\x2b\xa5\x0c\xbd\xb2\x56\x49\x63\xcc\x3c\x85\x5a\x85\x2a\xc3\xda\xda\xb9\x75\xc9\x1f\x24\x4d\x96\xdf\xb9\xdd\xf2\xea\xa7\x8b\x7b\xe1\xab\xfb\xfc\x25\xf7\x1c\xd3\x3a\x1f\xdf\xbf\x18\x3c\xdd\x3f\xbc\xff\xf4\x79\xb5\x36\x7b\xf1\x36\xba\x84\x3e\x57\x13\xd5\x4d\xef\x8a\x3c\x15\xb3\xa2\xc2\x56\x55\x88\x51\x33\xc0\xcf\x07\x7f\x38\x80\x63\x28\x0f\x99\xf3\x46\x6a\x1b\xf6\x19\x5f\xb0\x93\x3a\x2a\xa3\x76\x0e\x43\xe8\xac\xe4\x6d\x65\x75\x68\x8c\xcd\xe8\xaa\x7e\x32\x1a\x03\x0c\x21\x92\x60\x1b\xac\xae\x97\x3f\x0b\x3e\xfa\x83\xc4\xa5\xee\xce\xec\xcc\x1b\x4c\x44\x92\x7f\x9f\xfc\xa7\xd5\xab\xea\xf3\x5b\x5b\xaa\x1b\x47\xc9\x2b\x56\xda\x5e\xaf\xed\xe3\xfb\xc8\x4f\xfc\x15\x99\x9b\x8b\xca\xcd\x2b\x3e\xaa\x80\x59\xd1\x2c\x09\x7b\xc0\x42\xe7\x22\x10\xec\x01\x0d\xae\xeb\x7b\xc0\xda\x90\xc7\xa7\x29\x43\xcf\x07\x6b\x30\xb6\x96\x2a\x0e\x88\x41\x88\x61\x43\x25\x03\xdc\x20\xa4\x0c\x15\x6c\x1e\xd3\x3e\x8c\x40\x3e\x77\x40\x84\x69\x47\x28\xd5\x3c\x60\xa6\x95\xd2\x0c\x0c\xfc\x9c\x5c\x3a\x30\xc1\xa0\x21\x62\x58\x51\x4e\x85\x44\x14\x63\xcc\x38\x63\x12\x51\xa4\xa8\x60\x2c\x8c\xda\x1a\x63\xd7\x5a\x4f\x7b\x36\xdb\x61\x67\xa3\xde\xd4\x43\xac\x86\x47\x17\x90\xb5\x5b\x29\xbb\xc9\xf6\x7e\xaf\x8e\x10\xa7\xd4\x87\xbb\x98\xf5\xbe\x4c\xa8\xc6\x52\xdb\xcc\xaa\x75\x14\x29\xc4\xd2\xc6\x60\x26\xe9\xdc\x3b\x44\x34\x43\x52\x20\x83\x71\x1d\xa6\x69\x02\xa8\x08\xfb\x50\x41\xef\x8e\xc7\x73\xb2\x33\x01\x2f\x7b\x96\xf7\xc0\xdb\x0a\xd7\x06\xa1\xc6\x10\x37\x53\x23\x89\xf5\xce\x21\xab\xdc\xde\xed\x89\xa7\xc4\x97\xc5\x18\x9b\xdc\xff\x20\x63\x67\x7e\xe7\x77\x3a\xd9\xc6\x8c\xeb\xc7\x58\x07\xff\x37\xc9\xbf\x4b\xfe\xa7\xe4\x7f\xb9\xad\xda\x7c\xcf\x0c\xfe\x70\xc9\xa9\xbc\xbb\xe9\x21\x5d\xdf\x74\x5b\x39\x78\xb3\xd6\x7c\x6f\x89\xb1\x65\x14\x33\x4c\x00\x12\x4c\x29\x29\xa4\xf2\x96\x68\xa7\x0d\xb3\x5a\xcd\x55\x95\x76\xd5\x73\x39\x11\xc2\x08\x49\x11\x21\x0c\x53\x4f\x30\x25\x64\x32\xaa\x91\x55\xaa\x9b\x8a\x34\x75\x68\x96\x28\x4d\x36\xf5\x51\x4d\x7d\x1f\x26\x3a\x36\x92\x53\x26\x27\x21\x4d\x4d\x83\xdc\x69\x8c\x05\xc5\x98\x19\xad\xb4\x34\xca\x53\x49\xad\x12\x42\x2a\xcd\xe7\x3a\x55\x73\x91\x52\x4c\x38\x45\x04\x2d\x8f\x15\x22\x82\xe2\x30\x31\x6f\x95\x36\x5c\x39\xcb\x72\xe8\x6c\x6b\x38\xb5\x4c\x2b\xee\x09\x67\x9c\x62\xd5\x52\xc5\xd4\x12\xe4\x6d\x37\x2e\x61\xd1\x63\xff\xd5\x83\x34\x01\xf7\x9f\xbe\xd7\x21\xfd\x74\x1f\xe9\x03\x9f\xb2\x08\x59\xd6\x39\x7b\x47\xb8\x94\x84\x42\x89\x69\x28\x9c\x00\x5a\x86\xee\x78\x54\x2a\x5f\xf6\x1b\x23\xc4\x8e\xcc\xdd\x9c\xac\x69\xf8\x54\x3e\x1f\x33\x9f\xb2\xb9\x03\xfb\x26\x8c\x6d\x20\x41\xa9\x21\x49\xb6\xe9\xe1\xb2\xee\xff\xd5\x05\x59\xfc\x97\xab\x63\xda\xb2\x50\xff\xee\xf3\x6a\xc0\xf2\xc3\xbb\x2f\xef\xd6\x4e\x86\x4b\xc9\x76\xbd\x95\x69\x16\x17\xf1\x8b\x68\xc5\x4b\x8d\xf3\xfd\xad\x31\xc7\x87\xcb\x98\x2c\xc6\x65\x0d\x29\x72\x9f\x03\x19\x9a\x02\x51\xe4\xb8\x26\x38\x2f\x5c\xc9\x89\x16\x42\x53\x2b\x18\x9c\x29\x28\xc7\xac\x95\xd4\x62\xf9\xbc\x4f\xe9\xdc\x7b\x00\xc3\xd8\xa4\xe6\x38\x0c\x4a\x94\x61\x0a\x6d\x09\x8a\x65\xb8\x46\xad\x18\xdb\x8f\xc7\xce\x85\x3e\x0c\x03\x80\x24\xa0\x71\x54\xaa\x3c\xba\xc9\x09\xa3\x5a\x40\x53\xe4\xec\x51\x5b\x66\x75\x48\x42\xa3\x4d\xd8\x1b\x6d\x74\x51\x1a\x4e\x2a\xe4\x8c\x4e\x36\xe9\x74\xa6\x5b\xfe\xff\x25\x2f\xb4\xc1\xb0\x18\xe6\x61\x5f\x40\xbf\x44\x5b\xf5\x30\xf8\x34\xe7\x6a\x0f\xb5\x11\x02\xe3\x02\x62\xcc\x04\x39\x70\x16\xba\x7f\x48\x5e\x68\x38\xb3\xad\x8c\x31\xd5\xc3\x0b\xb7\xf3\x57\xcc\x40\x16\x4c\x0f\xbe\x2f\xd6\x5c\x7b\x95\xd2\x49\x5b\xeb\x94\x32\xb3\xf6\x7a\xb2\x16\x08\x25\x11\x2d\x39\x62\xe1\xe8\xdc\x55\x09\x6a\xdb\x0e\xc3\x30\xb8\xa3\x73\xc7\xe3\x31\xc0\xe7\x56\x88\xd2\xe6\xb4\x09\x4d\x36\x86\xc9\x05\xe3\x92\x64\x9b\x15\x97\x18\xef\x0f\x22\xfb\xf0\xb7\xab\x77\x49\xe4\x8e\xc7\x45\x69\xdd\x70\x62\xeb\xc3\x6d\x5b\xf8\xdd\xaf\xcb\x6f\xbe\xff\x61\x7b\xf7\x73\x54\xba\xdd\x46\xc1\x9d\x35\x53\xba\xc9\x1d\x04\x45\xe8\x29\x24\xd2\xa6\xd4\xe6\x05\x40\xa1\xc1\xc4\x5a\x00\x71\xe9\x4a\x14\x68\x7c\xea\x41\xb3\x5a\x05\xf6\x42\x20\x02\x39\x42\x61\xd8\x03\xc2\xc2\xd4\xf8\xfe\x9c\x70\x40\x87\x70\xf2\xa0\x0a\x62\x67\xa1\x31\x9e\x50\xdd\x80\x04\x13\x6c\x72\x23\x64\xab\xb8\xc4\x4a\x94\x4c\x22\xc9\x4f\x5a\x5b\x17\xba\x38\x49\x68\xdd\x85\xd1\x7a\x33\x05\x02\x86\x73\x62\x6c\x0d\x60\x1b\x3c\x38\xb9\x24\x01\xe9\xf8\x26\x27\xfa\xf4\x5d\x4e\xf4\xd3\xfd\x63\x3a\x82\xfa\x04\xf2\x5c\xae\x29\x51\x52\xc2\x70\x3a\x85\xe9\x92\x11\xed\xc3\x54\xfa\x52\x82\xc3\x9a\x11\xdd\x24\x22\xc5\x1b\x16\x31\xc4\xa5\xb2\xfe\xee\xbb\x78\xfe\xdd\x2e\x3a\x38\x3d\xde\x2f\x40\xfd\xf1\xf3\xd3\xfb\x06\xd8\xb5\x49\x95\x3e\x8f\x80\x05\xbb\x2f\x2a\x5d\x65\x85\x6f\xdb\xd0\xf7\x3b\xc4\xb9\x61\xc6\xb0\xb9\x6a\x95\x52\x87\x31\xf8\x93\x5b\xfb\x08\x52\x60\xce\xea\xae\x4e\xc7\xe8\xc7\xff\x9a\x5d\xdc\x6c\x17\xa8\x7a\x2d\x0f\xdf\x34\x9c\xbe\xc0\xd9\xc7\x8d\xd4\x45\x0e\x28\x68\x50\x80\xa1\x0a\xa7\x50\x31\x50\xe3\xf4\x14\x86\x65\x6a\xee\x31\xf2\x14\xe0\xdf\x23\x80\xa3\xf3\xfe\x30\x1f\x52\x14\x86\x74\x14\x79\xce\x89\xe3\xd6\x0a\xcb\x9d\xe2\xba\x66\x0c\x29\x63\x30\x42\x84\xd5\x3a\xf6\x7e\x6e\x78\x42\xee\xfc\x4e\xbe\xe9\x45\xfa\x6f\xd8\xf9\xaf\x59\x92\x8d\x04\xd4\xc5\xe6\x69\xb4\x46\x66\x6b\x52\x6d\x19\xd0\x7d\xeb\x3d\x28\xab\xe8\xdc\x53\x56\xdb\x83\x73\xce\xce\xd4\xb9\xfd\xde\xb9\xb4\xb7\x41\xd6\x75\x1d\xe8\x0a\x46\xd6\xbc\xb0\xde\xd9\x17\x1d\xe3\x04\x5c\x8c\x69\x5e\xf7\xab\x77\x9f\xbe\x77\x43\xf8\x7c\xff\x74\x2b\x8b\x90\xd1\x81\x20\x4f\x78\xab\x19\x97\x56\x3a\xa1\x0c\xec\x7d\xdb\x32\xc5\x48\xc9\x19\xec\xa9\x26\x4c\x73\xb0\x8f\x84\xd7\x9d\x68\xb5\x82\x95\xef\xad\x14\x5e\x2b\x6b\xb5\x98\xe9\xf1\xe8\x67\x29\x79\xe9\x21\x4d\x1d\x27\x27\x27\xab\xb6\xe9\x79\xdf\x46\x9f\x8d\xb4\xba\xeb\x76\x3e\x62\xcd\x7f\x9e\xfc\x45\xcc\x91\xfd\x0f\xbf\xec\x30\xf8\xeb\x37\xdb\xe3\xfb\xdd\xa5\x5b\x62\x39\x89\x4f\xf7\x4f\x2f\xe3\xeb\x8d\x53\xc3\x6d\x99\x9e\xd8\xb2\x4c\xad\x74\xed\x40\xc2\x70\x3a\x86\x03\xa9\xad\xe4\x10\xf1\x23\xda\x7b\x6f\xe6\xa1\x9c\x6b\x87\xb9\x93\x7c\x38\x78\x7f\x4c\x73\x07\x4e\x21\xa7\x32\xfa\x35\x94\xf3\x09\x60\xeb\x46\x7b\x4c\xfd\xd0\xca\x66\xbf\xf3\x25\x2c\xa5\x64\x65\x61\x20\x62\xb9\x2b\x20\x2a\x0a\x29\x38\x2b\xa0\xc8\x8b\x1e\x5b\x33\x2f\x5b\xaf\xdf\xe3\x99\x03\x4e\xa9\x6e\x38\x29\x54\x81\x2b\x88\x15\xe3\x94\x11\xae\x44\xac\xad\x6c\x53\x9a\xda\x3b\xbf\xf3\xc9\x8f\x17\x15\x2b\xb2\x76\x2f\x5f\xab\x59\xaf\x52\x10\xbf\xfb\xf8\xf5\x71\x77\xf7\xf3\xc3\xa7\xfb\x1f\x1f\x7e\xba\xa1\x13\x44\x15\xb0\x87\x62\xfb\xf1\x6f\xc1\x26\x09\x03\x38\x96\xa8\x22\x10\x9c\xc2\x54\x6b\x87\x70\xe0\xa1\x44\x5d\x5a\x61\x24\x43\x23\x35\xc8\x07\x5f\xe4\x25\x47\xb9\x2b\x45\x65\x58\x68\xbd\x8f\xa1\x84\xaa\xd4\xd6\x9b\x18\xcb\x1b\xeb\x38\xc6\xa8\xd0\x34\x87\x90\x29\x96\x57\xe7\x04\xe6\x39\xe2\xc4\x50\xca\x41\x11\x1a\xc0\xcb\x30\x18\x45\x63\xad\x66\x13\x71\x52\x15\xd7\xf3\x5f\xb0\xce\xae\x89\x8d\xcf\x8f\x2b\xb3\xe6\x62\xde\xb5\x84\x98\xc9\x2b\x3f\xf1\xc6\x84\xf5\xf3\xad\xa2\x59\x66\x41\x5d\x45\x1f\xbe\xce\xcf\xd0\x83\x36\x48\xd0\x35\x2d\xaa\xdc\xa1\xac\x95\x63\xba\x11\xc2\x87\x69\x3a\x8c\xdc\x3a\xe1\x21\x1a\x98\xe4\x14\x72\x86\x01\xa9\x9d\x36\x55\x30\xb2\xde\xd3\x66\xdb\xed\xf7\xae\x0e\xdd\xbe\x03\xa4\x7e\xa6\xb0\xf4\x52\x17\x46\xd4\xc8\xf0\x82\x0b\x76\x4e\x2a\x88\x2d\x69\x07\xca\x39\x09\x46\xf1\xc2\x15\x1c\xe4\xb6\xd6\x8d\x56\xa6\x56\x8e\xaf\xe7\x69\x5e\xe2\xc8\x8f\xbf\xf4\x48\xba\xfa\xe2\x3f\xdc\x96\x08\x2e\x95\xf8\x57\xd7\xae\xfb\xc7\xcc\x74\x15\x10\xd5\x38\x56\xa1\xa9\x3a\x9a\x75\xa6\x8f\xe5\x02\x45\x8b\x50\xd3\xd0\x8a\x65\xb3\xdf\x67\x55\x35\xb7\xde\xa7\x7c\x6e\xb7\x87\x25\xba\x70\x55\x55\x55\xfb\x40\xfa\xc2\x17\x12\x14\xc1\x79\xa3\x01\x9c\x0f\xb3\xa5\x3c\xf5\x81\x01\xbc\xd6\x0d\x4c\x96\xdc\xf9\x9d\xb9\xea\x75\x7c\xba\xa1\x4e\xfe\xf8\xd3\x9b\x52\xe5\xda\x42\xfd\x62\xf5\x6d\x5c\x51\x8e\x51\x2c\x32\x85\xc1\x41\xa6\x70\xe1\x4a\xd9\xd5\xe2\x9c\xc0\x50\x29\x40\x50\xe8\x96\x25\x10\x53\xed\x77\x06\x61\xec\x9c\xad\x6c\x03\x0b\x2c\x89\xe3\x54\xf4\x47\xad\x44\x65\x2b\x4e\x84\x4b\x36\x89\x4a\xbb\x4d\x1e\x31\xff\xb5\xcb\xe3\x66\x07\x78\xf8\x4e\xb9\x0e\x74\x55\x94\x95\xeb\x9e\x25\xe0\x45\x55\x01\x2b\x88\xc7\x3c\x70\xc3\x85\x96\x3b\x2b\xac\xb1\xb6\x0d\x04\x74\x6a\x01\x3c\x88\x75\x5a\xad\xb1\x45\xd2\x65\x30\x9b\x76\xec\xa6\xc7\xf8\x25\xbb\xfa\xf8\x22\xb1\x0f\x3e\x3f\xbe\xcf\xa6\xd3\xe9\x74\x7a\xde\xd7\x51\x71\x3b\x9f\x4f\xcb\xf3\x6e\x81\x4f\x9d\xb6\x19\x9a\x74\x68\x97\x97\x3a\x01\x0b\x6e\xdc\x2e\xb8\xff\x4f\x23\x0e\xb8\xff\xce\xf5\x23\xf6\x69\xde\xdf\x7d\xfc\x79\xcb\xe8\x71\x1c\x9d\x52\x94\x55\xd4\x98\x81\x8f\xd3\x9e\x00\xb2\xd3\x8e\x87\xae\x2a\xbd\xf7\x56\x3d\xeb\xf4\xd4\xb6\x06\xe4\x40\x54\x00\xa2\x0a\x27\x49\x9a\xb8\x74\xbc\x13\x3b\x9b\xc0\x75\x4d\x7e\x53\x55\xfa\x7a\x89\x05\xbe\xfe\xf4\xf0\x61\xbd\x33\xdb\xab\x61\xcd\x05\x74\xde\x3f\x6e\xb4\x2f\x60\xea\x94\xe3\x1a\xd6\x14\xc1\xfc\x14\x8e\x44\x09\x44\x15\xc7\x20\x9f\x07\x2e\x55\xf3\x5c\x81\xb2\x3a\x9d\xbc\x2e\x43\x17\x0c\x04\x34\x1c\x77\x16\x12\x3a\x0f\x87\x05\x34\xb7\x56\xf8\x12\x4a\x4e\x85\x56\xce\x72\x55\x15\xa7\x93\x0f\x13\xc2\xde\xf0\x8a\x02\x12\xeb\x9a\x6d\x1c\xef\x3c\xc9\x2e\x9e\x10\x9f\xd6\x7a\xea\xf6\xd3\x8f\x77\x37\x14\xcb\xed\xc7\x9f\x7f\xb8\x4c\xd7\x5f\x97\xb5\xc8\x86\xcc\x3f\x6b\xe0\xea\xd2\x0b\x6b\x9b\x43\x25\xfb\x41\x84\x83\x06\x79\x1d\x8e\xb6\x94\x46\x90\x8c\xaa\xaa\x1a\xf8\xb1\xe9\x4f\x6c\xac\x2b\xc9\x8f\xcc\x3b\xb6\xe3\x0e\xb7\x46\x69\x51\x49\x67\x6d\x6b\x1b\x6f\x14\x28\x7b\xd8\x38\xea\xe6\x5a\x4e\x56\xe0\x8a\x19\x4b\x2b\x2c\x7c\xef\xb5\xf6\x49\x96\x92\x73\xbd\x75\x3b\x1b\xfb\xb8\xfe\xea\x8d\x87\xc5\xb5\x86\xfe\xe1\x72\x15\x5f\x72\x5a\x6f\x24\xe9\x06\x5f\x14\x6d\xa5\x7c\x25\x2d\x38\x0e\x31\x47\x40\xcb\xd0\x04\x4e\x00\x0f\x07\x80\x1a\x84\x14\xc8\x41\xed\xff\x6f\xda\xde\x1e\x48\x72\x5c\xcf\x13\x23\xc8\x4c\x26\x77\xdf\xbd\x3d\xd6\xf4\xf4\x6b\xbe\xdd\xbb\x3d\xf6\xf5\xcc\x14\x9e\xf6\x3e\x10\xaf\xb7\xbb\x71\xb7\xda\x3b\x84\x4e\x77\xc2\x7d\x28\x84\x3b\x29\xee\xa0\x55\x28\x04\x19\x92\xa0\x0f\x03\xb2\x04\x47\x11\x88\x90\x03\x13\x26\x4c\x9a\x34\x69\xd2\xa4\x99\x66\x9a\x34\xd3\xa4\x99\x66\xc6\x54\x12\xad\x20\x98\x59\x9d\xd5\x33\x6f\xf5\x14\x0a\xd5\x44\x56\xb1\x32\x6b\x3a\x93\x24\xf0\xff\xfc\xfd\x7f\x3f\x88\x2d\x0e\x25\xc5\x16\xd2\xdc\x40\x58\x6b\xa7\x9d\x6a\x95\x1b\x5d\xa8\x88\x95\xb4\xc1\x69\xe1\x46\x09\x2b\x39\x5e\x8e\xb0\x55\xd0\x69\xdf\xe1\xde\x25\x9b\xe4\x9c\x95\x3b\x11\xe3\xcd\x3f\x8a\x18\xfd\xbb\x9a\xc6\x37\xd1\x9c\xbf\x7f\xb8\x26\x1e\x9b\xce\x43\x94\xaa\x99\x12\x6e\xf6\xa1\xf2\x3e\x58\xe7\x36\x4d\x63\xa5\x6d\x72\x83\xb5\x70\x46\x0b\x50\x80\x7a\x2e\xd3\x7e\x56\x47\xe5\x74\xb3\x72\x5a\x77\x1b\xb7\x63\x31\x77\xfd\xc5\x4d\xd9\xe6\xfb\xc8\xa5\x91\x1e\xdc\x29\xf4\x1a\x88\xac\x3a\x01\x2c\xc2\x14\xa6\x5c\x89\x93\xb3\x4d\x3f\xa8\x46\x9d\x92\x3c\xd6\xef\xdb\x18\xbf\x7d\x9f\xfc\x45\xf2\x6f\x93\xff\x90\xfc\xb7\xf7\xda\xbd\xab\x73\xca\xee\x04\x71\xbe\xc8\xf4\x7e\xff\xb3\xcf\x66\x57\xd6\xae\x97\x4c\x9b\xf7\xd7\x7d\xe7\x2f\x56\x6b\x09\xc6\xaa\xf6\xa8\xaa\x9d\x36\x46\x50\xc6\x35\x26\x4c\x11\x1d\x58\xa3\x95\x62\x98\x12\x8d\x30\x57\xd8\x56\x40\x3a\x20\xc3\x49\x76\xa2\x95\xce\x34\x6a\x50\xe1\x9c\xf6\x8a\x30\xc9\x02\x43\xb5\xad\xd0\x76\x34\xb3\x0e\x38\x30\x0e\x24\xe8\xb3\x55\x42\x24\x8c\x5a\x6b\x24\xb8\xb2\xd3\x41\x33\x6e\x0f\x5a\x29\x8d\x29\x93\xf2\x34\x71\x2a\x54\x3b\x23\x50\x84\xb3\xd1\x42\x6b\x17\x5a\x40\xbc\xe4\xda\x01\x8d\x15\xe6\x84\x44\x0d\xad\xe4\x17\x99\x8b\x75\x01\x72\xd7\xfb\xfa\xb3\xe4\x1f\xc6\xbe\xd7\x3f\x5b\xbd\xdf\xeb\x9f\xf4\xfd\xc1\xfb\xd7\xef\xbe\x7f\xff\xfa\x5d\x54\x96\x7a\xfb\xfa\xed\x9b\xdf\x43\x91\x24\x1b\x33\x13\x2c\xe8\x5c\x38\xba\x70\x70\x60\x08\x36\xa5\x7d\x1f\xd0\xe1\x00\xf6\x4b\x6c\x38\x8f\x00\x85\xc3\x41\x31\x29\x19\x4b\x2b\x45\xa5\xa4\x34\xad\xd6\xdf\x73\x62\x45\x70\x91\x96\xe5\xbc\xe4\xcf\x83\x56\x9a\x69\xa9\xf4\xa5\x11\x22\x13\xb3\x05\x67\xf3\xb3\x87\x71\xb6\x36\xd3\x9f\xf5\xae\xcd\x6d\xf2\xc7\x31\x2a\xfb\x10\xeb\xf2\xff\x3c\xf9\x97\x2f\xa3\x93\xfc\x25\xc5\xc0\x76\xa5\x82\xf8\xf0\xe6\xdb\xfc\x16\x99\x64\xef\x57\x44\x0c\xf8\x19\x26\xab\xcd\x31\x1c\x80\x89\x04\xf8\xc0\x87\x52\x88\xc3\x11\x29\x45\x4d\x55\x47\x2c\x50\x03\x06\x0b\x71\xad\x96\xcd\xf4\x39\xb1\x76\x34\x05\xd5\x92\xd3\x2c\x91\x4f\x07\xb5\xca\x4c\x9f\xa4\xdc\x0a\x83\x6a\x4e\x85\xb1\xb4\x84\x84\x68\x4f\x31\xc2\x95\xe2\xfb\x70\xc6\xd0\xd6\xad\x24\x0c\x54\x41\x00\x3f\xb4\x94\x63\x13\xf6\xf3\xd9\xc5\x6c\x16\xac\x55\x32\x1d\xa1\x58\x99\xfd\x6c\x76\x4d\xee\xee\xaa\x9e\x7f\x76\xcb\x02\xf3\xeb\xfc\x53\x84\xdd\x7c\x8c\x93\x3c\x3f\x73\x36\x5b\xec\x20\x98\xe6\x91\xc0\x14\xce\x58\xf3\x41\x4e\x00\xd5\x30\x8a\x8c\x0a\x76\x49\xb8\x17\xe2\x28\xc4\x24\x44\xee\x90\xb2\x1a\x05\x04\x10\x53\xa6\xb5\x74\x26\x43\xc0\x73\xe3\x5c\x2a\xe6\x06\x1c\x02\x5a\x1f\x49\x92\x64\x99\x88\xfc\x8b\x4b\xcc\x51\xc7\x19\xb2\x9f\x89\x38\x56\xc6\xca\x1b\x7e\xfb\x6a\xe6\xee\x80\x5c\xef\x32\x3b\x3a\x50\xb9\x71\x74\x61\x72\x23\x98\x86\x93\x00\xbc\x33\x65\x39\x9e\xf9\x38\x8f\xa9\x3e\xc5\x59\x52\x7b\x11\xc0\x84\x3d\xc0\xa7\x6d\xb7\xdf\xef\xf7\xb6\xef\xfb\x3e\xec\xf7\x5a\x0f\x47\x5a\x95\xbd\x70\x02\xda\xa3\x9b\x9c\x9b\xdc\x31\x49\xb2\xcd\x90\x88\xc8\x51\xb9\x66\xcd\xd7\xaa\xde\x4f\x24\xb2\xee\xb7\xf9\x66\x3a\xb9\xe3\xd1\x2b\xc1\xb8\x63\x52\x74\x62\x02\x67\x8d\xb0\x22\xc1\x50\x24\x11\xdb\x14\xa9\x9c\xbd\x6d\xdb\xc6\x78\x13\x30\x98\xfa\xc6\x4c\x00\xa6\x02\x8e\x9e\x74\x8d\x6f\x49\x1b\x63\xce\x3c\x8b\x79\x5f\xae\x93\x6f\x5e\x30\xaa\x2d\xbb\xe7\x0f\xc1\xee\xf1\xbb\x57\x6b\x37\xe8\xfd\xeb\xec\xfd\x8b\xe1\xdb\x9f\x63\x54\xdb\xf1\xe6\x54\x1d\x8e\x0a\xd8\x72\xf0\x40\xfa\xc2\x51\x52\x15\xb6\x24\xde\x13\xa0\xe4\xd3\xc8\xbd\x94\x93\x94\x93\x52\xdb\x43\x70\x53\x38\x87\xc1\x98\x01\xd8\x13\xd0\x6d\x1b\xf6\x61\x40\xc8\xc3\x5e\x60\x3a\x3e\xdf\xc4\x67\x11\xed\x24\x49\x33\x95\xe0\xad\xcc\x75\x9c\x52\x7f\xbe\x4a\xd1\x22\x46\xbc\x43\xdc\xeb\xaa\x77\x5d\xd7\x84\xbd\x75\x7d\xd7\xb6\x5b\x08\x58\xe8\x5c\xe8\x66\xa9\xb3\x12\xb0\x4b\x0b\x62\xbc\x93\x25\x4d\xb6\xdf\xb1\xdc\x26\xbf\x8a\xac\x6c\x57\xcf\xb1\x46\x99\xf7\x6a\x4d\xef\x57\x2a\xc2\xef\x3e\x5d\x31\x78\x67\x5b\x94\x60\x9a\x66\x49\x53\xbe\x0f\x0c\x22\x84\x25\x26\x84\x08\x00\x43\xe9\xfd\xfe\x88\x41\x79\x08\xa3\x24\x96\xf0\xdc\xd6\x55\xa5\x82\x52\x4a\x82\x1a\x42\x84\x04\xc6\xb0\x12\xb6\x9b\xd9\xc0\xa8\x61\x02\x10\xa9\xb1\x5e\xfd\x8c\xca\x60\xbc\x0f\xbf\x48\xfe\xf8\xa5\x92\xc0\xee\x0b\xb7\x65\x04\x26\x27\xbe\x06\x16\x34\x3c\xb0\xc0\x43\x17\x90\x48\x8b\x03\x38\xd7\x50\x33\x0c\x06\xae\x0d\x23\x17\x96\x6b\x56\xf6\xdc\xab\xe3\xe0\x9c\x3d\xc1\x9a\x51\xa6\xad\x12\xeb\xbc\xff\x1f\x26\xec\x33\xdd\xf4\xf1\xbd\x6e\x58\x83\xff\x34\xf9\x57\x09\x4b\xfe\xab\x84\x27\xc9\xab\xbb\x89\xd3\x25\x81\xfd\x39\xb2\xfb\x65\x13\xff\x06\xfc\x8e\xe6\x72\x54\x37\x5c\xc7\x98\x57\xa5\xc6\x6b\x89\x6c\xf0\xa0\x74\x20\x71\x17\xec\x74\x51\x1d\x90\xc6\x10\xe8\xa0\x56\xf4\x48\x68\x81\xbf\x70\xc6\x5b\xe0\xee\x9a\xca\xf8\xd6\x54\x9e\x2b\x97\x6a\x2b\x99\x34\x07\x29\x0c\x33\xc5\xb2\xb3\xed\x7e\x9f\x33\xd3\xb6\xe6\x1c\xe5\xc1\x19\xa6\x9a\xad\x7d\x65\xcd\x44\xcb\x7e\xd2\x4f\x9e\xa7\xd4\x19\x88\x04\x82\x82\x12\xc8\xa1\x0e\x67\xce\x93\xe4\x17\x89\xf9\x6c\xb6\x45\x4e\x7f\x97\x1f\x7a\xf5\x33\x7e\xe8\xd5\xd5\xff\xdc\xfc\xd0\x4a\x8a\xfc\xee\x2f\xc1\x72\xf2\xbf\xe3\xf8\x94\xf5\x41\xa4\x89\x0b\xce\x06\xe7\xd2\x24\x28\x1e\xcf\xf4\xb4\x44\x47\x73\xec\x45\xa5\x91\xb6\x61\xde\x6b\xc0\xb5\xcc\xa0\x02\x54\xc9\x20\x15\xe0\x5a\xe5\xd4\xb8\xd0\xc5\xbd\x30\x01\xe1\x82\x91\xeb\xd7\x5c\xb5\x59\x39\x23\xa9\x16\x1b\xac\x4c\x3a\x3d\x1f\xdb\xf4\x74\x3b\x5e\xef\xbb\xfc\x8c\x36\x43\xb4\x81\xb7\xf3\x7c\x7f\x55\xd4\xfe\x67\xcb\x7d\xff\x49\x1f\xef\xdd\x9b\xaf\xe6\x0b\xc1\xd7\x2c\x15\x5f\x55\x5c\xe4\xe4\x01\xf1\x2b\xbb\xce\xe0\xa7\x1a\x0c\x81\xd8\xb6\x05\x5d\x3c\xe8\xba\x59\x66\x6d\x50\x60\x1f\xb0\x0f\x18\xec\x83\xf1\xd3\x04\xcc\x79\xb6\xf1\x47\x5e\x2e\xe7\x63\x19\x63\xcc\x06\xaf\xb5\x5e\xbe\x85\xc3\xdc\x70\x3b\x4d\x96\x03\x25\xa5\x0c\x5d\xc4\x70\x6f\xd2\xe9\xb3\xdf\xd2\xdc\x5c\x6b\xb2\xd7\x1d\x1c\x1b\x06\x1f\xb3\x2b\xee\x23\x7b\xbf\x4e\xde\xbe\xbe\x37\x5c\x59\xd3\x94\xd5\x79\x1e\x5d\x55\x2e\x79\x8c\xf2\x8d\x11\xc3\xa0\x15\x2c\x6c\xc9\x87\x9e\xe7\xa6\xe6\xec\x72\xca\x4a\x19\x78\x17\xca\x3e\x88\x01\x33\x25\x71\x87\xa1\x84\x0d\x23\x3c\xea\x48\xa0\xcd\x3e\x27\xcf\xd8\x9d\xd7\xb1\xe6\xf2\xfe\x8a\xd5\xb9\xa7\x23\x88\xd1\xda\xb3\x52\xee\xc7\xc7\x9f\x53\x59\x68\xd2\x61\x26\x0e\x34\x71\xfc\x25\x3e\x02\xf7\x99\x7f\x3a\xa4\xd8\x49\x63\x84\x97\x4d\x33\x39\xa1\x35\xf7\xc2\xfb\x8c\x3a\xa9\x35\xf3\xc2\x35\x39\xb9\x9c\x53\xc4\xc3\x41\x84\x83\x00\x87\xcb\xc9\x21\xdc\x39\xe3\xd9\xd0\x74\x07\xdc\x3b\xeb\xd9\xd0\xf6\x03\xea\xac\x71\x6c\xf0\x6d\x8c\x47\xe4\x67\xb6\xeb\x72\xf5\xff\x83\x16\xc4\x86\x2b\xba\xec\x3e\xed\x1b\xe0\x25\xa1\x9c\x4a\xe9\x1c\xe8\x14\xe5\x9c\x49\xe5\xdb\xb9\x8e\x1d\xc1\x14\xcd\x87\x12\x9f\x00\xa5\xa5\xaf\x29\x0e\xcb\x3d\xcd\x74\x28\xa6\x09\xa8\xe3\x31\x57\x9c\x51\xca\xa5\xd3\x46\x71\x46\xd6\x23\xb9\x3c\xc7\xa4\xd5\x26\x88\xd0\x68\x75\x39\xed\xeb\x0a\x2b\xdc\x20\x48\x44\xda\x7f\xd1\x82\xd8\x26\xea\x33\xdb\x56\x39\xbc\x32\x99\xfc\xed\xc5\x9b\x2d\x7b\xf5\xe1\xd3\xf3\x58\xd0\xa7\x35\x31\x58\x3c\xc6\xc3\xa7\x98\x3f\xaf\xd3\xa2\xdf\xbe\xe4\xa6\xd5\x99\xfe\x9c\x90\x0a\x41\x3f\x9e\x6a\x25\x41\x72\x8c\x5f\x69\xc9\x19\xa9\x82\x07\x67\x81\x18\xb1\x10\x31\x29\x0d\x97\x3a\x87\xee\xc9\x17\xae\x28\xc3\x00\x6a\x58\x37\xe5\x66\x08\x47\x50\xcf\x10\xc0\x39\x81\xa0\x06\x9d\x6f\xa7\xbd\xd5\x30\x60\x37\xec\x89\x31\xa3\x57\x87\xd3\x79\x5c\x7c\x11\xfb\xec\x36\x4d\xdc\x97\x7f\x37\xc6\x26\x77\x24\x81\x8f\x9b\xf5\xd3\x64\xcf\xac\x54\xe0\xf1\x9b\x57\x5f\x10\xe1\x1f\x57\x44\xf8\x0f\x8f\x80\x1d\xba\xa8\xbe\xdc\x18\xe1\xbb\x70\xea\xc4\xb0\xf7\x8d\x01\x96\xf9\x0a\x82\x21\x14\x7d\x38\xab\x93\x0b\x7d\x56\x7b\xe1\xaa\x3a\x8c\xa1\x43\xa7\xb6\xf1\x6d\xd7\x23\x92\x2b\x2e\xa5\x88\xdd\x49\x67\x55\x47\x0d\x37\x9c\xce\xcd\x54\x4b\xe1\x83\x08\x67\x05\x12\x80\x43\xb3\x3f\x72\x82\x59\xed\xf6\xc0\xa1\xd0\x74\x15\xe6\x6c\xd5\xd8\xe9\x36\x4d\xce\x92\xbf\x71\xcb\xc2\x62\x62\xf8\xfe\xe1\xd3\xc3\xfb\x87\x57\x6f\xd2\xec\xf1\x1b\xf0\xcd\xab\x5d\x9a\x6d\x14\x0a\x74\xde\x53\xb0\xac\xe4\xde\x11\x61\xf9\x4c\x19\x72\x88\x03\xe8\x8c\x6c\xc9\xb6\xff\x51\x96\x5b\xfb\xa3\xdf\x14\x28\xc0\x60\x29\x50\xa0\x0b\x2e\x10\x04\x06\xb0\xea\xf9\x1c\x37\x2e\x5f\xe2\xe9\x3f\x48\xbe\x89\x6a\x7c\x3f\x6d\xe8\x7e\x59\xb4\x79\xa9\x29\x93\x4c\x19\xdf\x5c\xb0\x61\xa2\xd5\xc6\xf7\xa9\xb2\x5c\x08\xae\x6d\xd3\xe7\x56\x70\x8a\x89\x36\xca\x2a\xc9\xa8\x32\x76\x3d\x40\xf1\xa9\xc5\x66\xfe\x51\x5a\x25\x6c\x67\x73\x1e\xf7\xfa\xdf\xbc\x2a\xed\xdc\x18\x4b\xfe\x45\xf2\xaf\x92\x7f\x9f\xfc\x6f\x6b\xa6\xb2\x78\x81\xdd\xad\x4c\x77\x53\x0d\xbd\x6b\x73\x6c\xd7\xa2\xf5\xb2\xba\x3e\xac\x00\xa5\xbf\x03\x56\xbc\xcd\xdf\x06\xf7\xe4\x4b\x8b\xcd\xda\x3e\x2e\xe1\xd5\xeb\x4f\xcf\x06\xec\xbe\x50\x99\xf2\xd4\xcc\x26\x6d\x97\xf8\x88\xeb\x70\xd4\x9b\x4e\x87\x83\x09\x3a\xe2\xd9\xd2\x09\xd7\xa2\x5a\x12\x01\x03\xc8\xd3\x54\x49\xad\xd3\xba\xac\x34\xaa\xea\xc9\x9c\x4e\x27\xa0\x26\x33\xcc\xa4\x75\x75\x90\xd4\x82\x52\xea\xde\xd2\x66\xaa\x99\x21\x85\xae\xc5\xe0\x78\xce\xb5\xd6\x38\x4c\x5d\x0f\xea\x70\xec\x3b\x50\x99\x08\x6c\xc3\xf1\xfb\x20\x79\xe8\x8f\x0d\x1d\xcf\x40\xc1\x1a\x22\x32\x70\xce\xf9\x51\x2f\x5f\x81\xda\x1a\x4a\x4e\x80\xe1\x72\x50\x35\xe6\x04\x56\x75\x05\x31\x94\x94\xb0\xe4\x17\x29\x4c\xdc\x4e\xe4\xf4\x27\xfa\x3b\xff\x4d\xf2\xdf\x27\xff\xd3\x6a\x3d\xaf\x35\xcd\x67\xce\xb5\xc7\x67\xcd\x93\x4f\xef\x5e\x70\x54\xfd\xac\x62\xcf\xfb\x2b\x00\xee\xaa\xc2\x13\x1f\x77\x7c\xa1\xd7\x80\x24\x35\x9b\xfe\x52\x10\xc2\x15\x25\xd6\xef\x95\x40\x8a\x63\x5d\xef\x27\x28\x05\xe3\x95\xa2\xda\x8d\x23\x10\x07\x7b\x0c\xc2\x56\x95\x8f\x68\xaf\xfe\x38\x0c\xc3\x70\x9a\x45\x59\x09\x07\x60\x44\x2a\x84\x89\x42\x53\x13\x8c\x2b\x5d\x21\xaf\x4b\x6a\x68\x4e\x83\xae\x3a\x59\x4a\x8d\xc2\x69\xa8\x6a\x42\x8d\xa3\x1c\x43\x2d\x54\x59\x68\x3d\x68\xbf\x7c\x85\x31\x76\xfa\x11\x61\xc6\x29\xab\x8d\x49\x4d\x55\xf1\x66\x74\xee\x6c\xed\xd9\x98\x83\xb6\xd0\xa9\xd2\x38\xe8\x75\x5d\x3b\x43\x16\x07\xfe\x07\xa9\x48\x48\xcc\xad\x7e\x9d\xfc\xe9\x1d\x4e\xf4\xbf\x4b\xfe\x87\xc5\x66\x6c\x77\x3f\xbc\xbb\xd2\x4b\xac\xb1\xeb\x6a\x30\xf2\x28\x51\x9c\xfd\x43\x90\xef\xb6\x5f\xcd\x4e\x6d\xdf\xbe\xfe\x36\xa2\x03\x7e\xf5\xa5\x9d\xf1\xfa\xdb\xfc\xcf\xc0\xe3\x8a\xe4\xda\x45\x82\x83\x48\xe1\xff\x16\xbc\xd9\xec\x1e\xbf\xdb\x8e\x3d\x28\x11\x46\x4f\x07\x8a\x40\x32\x31\x22\x35\x03\x49\xab\xcb\x32\x55\x6e\xee\xa4\x71\xba\xa0\x83\x33\xa9\x0b\xbd\xbb\xce\x28\xe3\x28\x50\x39\xfb\x4d\x0d\x87\x79\x64\x34\xf2\xbe\x1c\xe4\x70\xe4\x16\x57\x48\x86\x33\xe3\x5c\xab\x6c\x28\x2f\x53\x86\x8a\x8b\x04\xbe\xfa\x9c\xec\x31\x40\x5b\x5a\x95\xb6\x08\x07\x00\x0b\x55\x21\x88\x30\xd6\xdc\x91\xb2\x90\x8c\xe1\xba\xc6\xe1\x5c\x60\x58\xb9\x75\x5d\x22\x84\x06\x5e\x37\x92\x57\x25\x22\x0c\xd5\x4c\x71\x52\x52\xaa\xf0\x01\x0b\x46\x25\xe2\x28\x48\x45\x6b\x85\x92\x24\xf9\x65\x6a\xe2\x9e\xb6\x77\x3e\xf0\x63\xf2\x1f\x27\xff\x32\xf9\xb7\xc9\x5f\x25\x22\xf9\x1f\xe3\x8e\xfe\x6b\xbd\xe1\x8d\x13\xf4\xcd\xaf\x5e\x34\x82\x3e\x3d\x5e\xa1\x0a\xef\xbf\xf9\xd5\x0d\xac\x9a\x82\xf7\xd1\xf7\x3c\x82\xf7\xd7\xb1\xdc\x2f\xa4\x8f\x37\xd3\x90\x6b\x89\x08\xc1\x5c\x1a\x1b\xf6\x02\x63\x8c\xb8\xd4\x2e\xb4\x02\x61\x0c\x39\xd7\xd6\x6c\xcc\x93\xf1\x8b\xf7\x6c\x9a\x36\xba\x45\x07\xad\x69\xda\xaa\xef\x4a\x46\x29\xa5\xa9\x73\x05\x2e\xcb\xd2\x56\x8e\xd9\x20\x5c\x57\xa9\x96\x04\xea\x14\xab\x74\x4b\xd3\x36\xfe\x51\x70\x8c\x50\x42\xc1\x29\x0a\x8b\xe4\x96\x61\x08\x11\x17\x4c\x90\xe5\x08\x2e\xfb\x98\x32\x14\x8f\x18\x0f\xe7\xf9\x60\x41\x5d\xd4\x08\x42\x0c\x2b\xcc\x51\x8d\x6a\x51\xa3\xe0\x10\x66\x18\xb1\x70\xde\x33\x56\x87\x09\x54\x80\x06\x48\x15\x46\x38\x45\x81\x56\xb5\x42\x10\xa7\x65\xfc\x23\x81\x08\x23\x90\xc0\xe5\x7b\x92\xec\x52\x91\xd0\x9d\xc9\xdd\x1d\x1a\xe9\x1f\xac\x4a\xe2\x0f\x57\x96\xf1\xeb\x5c\xfa\x0a\x22\x03\x77\x44\x13\xf7\xca\x17\xdb\xe7\xb2\xc9\xee\xed\x1f\x81\x95\x6f\x6c\x65\x26\xfa\xf4\x76\xe3\x83\x06\xa8\xae\x9a\xaa\x02\x53\x50\x65\x91\x42\x7f\x29\x7d\x2a\xc2\x74\xcf\x3d\x63\xa9\xec\x69\x0f\x8e\xde\x22\xef\x66\x0e\xce\x75\xad\x28\x06\xc3\x4c\xcb\xd4\x95\xc2\x62\x52\x69\x51\xcc\x13\x1d\xe8\x01\x85\x63\x76\x4a\x11\xc6\x08\x56\xf3\xa1\xae\x8f\xca\x9c\xc0\x01\x0d\x78\x8f\x83\x67\x14\xca\x1a\xd7\x48\xe1\x5a\xc1\x9a\x11\xae\xd9\x60\x0a\xc5\x1c\x31\xf8\xb8\xc4\x5b\x29\x4f\xd4\xce\xe4\xfe\xc5\x39\xaf\x3c\x44\xeb\x09\x7f\x39\xdf\x1f\x1e\x97\xeb\x90\xdd\xd3\x6b\xbc\x38\xeb\x35\x00\xdb\xa0\xb6\xac\x52\x11\x8a\x3a\xa5\xee\xe9\xec\x52\x54\x56\x41\x03\x52\xf6\x59\x71\x39\xdf\x1e\x20\x21\xfe\x88\x0e\xa0\xe9\x5a\xd2\xf5\xf3\xb8\x49\x2e\x89\x4d\x8f\x73\x9d\x7b\x88\xd1\xec\xd8\xa8\xd4\x08\x61\xaa\xe8\xe7\x84\x9d\xe9\x89\x06\x23\x49\xa5\x4b\xbc\x44\x55\xb5\x89\xba\xb4\xbb\xb4\x4a\xc4\xae\xcf\xf9\x55\x9f\xe4\x1f\x25\xff\x2a\xf9\xab\xe4\x7f\xf9\x39\x15\x83\x3b\xad\xcc\x67\x32\xab\xed\xe3\xc7\x48\x34\x7d\x8b\xa8\x62\x25\xfe\xeb\x27\xd6\xbf\x88\x7b\xe7\x87\x2f\x7f\xf0\xe5\xf7\xd4\x6c\xa6\x79\x4c\x13\x29\xa3\x6c\x0c\x0d\xce\xc5\xd4\x69\x3e\x64\x66\x3a\xe0\xe3\x38\x9f\x64\x1b\x26\x7a\xce\x20\xa7\x10\xb1\x1a\x22\xc4\x30\x56\x14\xa1\x40\xbe\x7e\x26\x45\x9c\x23\xc8\x28\x42\x54\x22\xc4\x20\x0c\xf4\xab\x27\x72\x6e\x8f\x97\x8a\xb3\xd2\x14\x24\x23\x97\x64\x93\x5c\xca\x8d\x3e\x96\x10\x19\x5a\x4b\xc6\xa0\xae\x43\x07\x6d\xfc\x5b\x8a\x28\xa1\x0a\x43\x24\xbf\x7e\x22\x1c\xb0\x43\x84\x49\x8a\x88\x25\x98\x20\xa8\x5e\xfc\x0e\x51\x92\xe4\x69\x91\xf8\x5d\x93\x8b\x18\xf3\xad\x8c\x86\xff\xe4\x66\x75\x6e\xc1\xdf\x77\x59\x44\x41\xc5\xb2\xc4\x7a\xb9\x3e\x7e\x7a\xbb\x8a\xa3\x5e\xe5\xcc\x6e\x10\xaf\x6b\x53\x3e\x6f\x84\xd6\x75\xad\xb8\xe0\x9c\x1b\x15\x98\x72\x65\xa5\x2e\x3c\x2d\xfb\xc0\x90\x53\x8d\x14\x8c\xa2\xe0\x01\x4b\x93\x90\x9c\xb2\xfd\x05\xfb\xd4\xcf\x12\x4a\x72\x66\x55\x53\x13\x40\x9f\x28\xa8\x31\xcd\x99\xc2\x10\xd6\x35\x56\xa8\x26\xc8\xf4\xa0\x81\x18\x43\x64\x83\xd3\x1a\x52\xa1\x30\xa6\x3c\x9c\x9c\x08\xca\xb8\x70\x50\xc6\x73\xcc\xa4\xb5\x2b\x27\xc2\x1f\xa4\x32\x71\x3b\x19\xed\xeb\x2f\x9f\xe3\xf0\x1b\x23\xd2\x97\x89\xbf\x9b\x0d\xbd\x32\x0a\xde\x72\xa7\xd7\xab\x67\x7a\xbb\x39\xa2\x2a\x25\x4f\x49\x5a\x56\x75\x50\x1b\xf6\xd4\x35\x59\x79\x39\xe9\xb4\x9e\x8f\x91\x9b\x31\xb4\x59\x7f\xa1\x6e\x39\x81\xe5\x11\xce\x9b\xf1\x09\xe6\x96\x72\x63\x08\x0a\xe3\x7c\x96\x00\xa3\x91\xe1\xd0\x04\x0e\x0a\x7c\xc0\xa3\x49\x8a\x14\x45\x2c\x15\xb9\x9b\xbb\x58\xae\xfe\xa7\xdf\xcd\x82\x19\x67\x4a\x5f\x32\x5f\xde\x05\xe8\xdf\x7d\x9f\x0e\x1b\xfa\xd4\xbb\xb6\x05\xb0\xb7\xc3\xd3\x61\x4b\x7e\x1c\xfa\x6c\x9c\xcf\x5c\x82\xaa\xde\x77\xc4\x49\x09\xaa\x21\x9c\x5d\xda\xcf\x14\x38\xab\x19\xb1\x94\x29\x21\xc2\x39\x1c\x73\x12\xa4\x6e\x97\xaf\xe0\x0c\x0b\x0d\xc5\x7b\x2e\x19\xa2\x07\x52\x1b\x22\x8c\x0c\x13\x22\x94\x30\x8a\x31\xd5\x7b\x95\x6c\x52\x99\xd0\x9d\xce\x6d\xf2\xcb\x38\x49\xf1\x5f\xdf\x26\x89\x6f\x26\x64\x77\x6f\x32\xee\x96\xc7\xfd\xba\x8a\x5e\xfe\x79\xca\xf9\xcf\x1f\xaf\xc2\xf5\x77\xe4\xe0\xeb\x14\xf2\x36\x41\x75\x5a\xf9\x0b\xf2\x29\xac\x2a\xa1\xdc\x9e\x1f\x52\xd4\x3a\x61\x9b\xd0\x11\x78\x80\xb5\xaf\x6b\x40\xe7\x63\x55\x4a\xd2\x18\xa1\x6c\xd7\xd0\xae\x95\x8a\xcb\xda\x88\x1a\x16\xe1\x14\x34\x01\x0d\x80\x45\x75\x0a\x9e\x00\x7e\xae\x61\x7b\xe6\xa0\xea\x03\x06\xbc\x82\xb9\xc5\xe4\xac\xf5\x19\xd6\x47\xea\x78\x24\xab\x13\x92\x09\xc6\x29\x83\x04\xe9\xb2\x64\x8a\x28\xc9\x09\xd7\xde\x4b\xd9\xbb\xda\xd7\x94\x56\xb0\xe3\x86\xf5\x08\x7a\xae\xa9\x83\x95\x20\x1a\x73\x8d\x51\xb2\x4b\x8b\x44\x47\xbf\xfe\x97\xb1\x6e\xf3\xaf\x63\x6c\xf9\x3f\xdf\x6a\x7b\xdf\xee\xa2\x03\xde\xdd\x0d\x04\x5c\x87\x2f\xdf\xe5\xbb\xc7\x17\xb2\xf7\x0f\xef\x1e\x96\xe7\xbe\xf9\x35\xd8\x3d\x7e\x5c\xae\xe1\xbb\x3c\xbb\x9b\xac\x79\xfd\xed\xa7\x88\x2b\xbd\x53\x05\xbb\x4e\x9d\x64\xc8\x96\x15\x48\xa8\x15\x48\xd7\xdc\xed\xf7\xd3\xe4\xc2\x09\x94\x0e\x42\x41\x48\x55\xd5\x75\x01\xa5\x51\x35\x56\xbc\x16\x03\xdc\xc3\xba\x23\x85\x10\x47\x19\x3a\x29\x8e\xb2\x4f\x05\x55\x10\x57\x78\xf1\x60\xf5\xc8\xdb\xba\xcd\x6d\x8d\x91\x29\xdd\x7c\x32\x5d\xad\xbc\xb7\x43\x84\x2b\xdb\x81\x62\x1e\x04\xe3\x85\x2b\xd0\x18\x24\xf0\x63\xcb\x40\x01\x28\x20\xb5\xec\x2c\x63\x2a\x34\x5d\xd7\x05\xd8\x15\x5c\x74\x5d\x7a\x0a\xce\x95\xa6\x24\x43\x38\x2a\xc5\xf7\xc9\x2e\x35\x89\x88\xf8\xda\x57\x2f\xb2\x99\x9f\x9d\xc8\x01\x5f\x8f\x8e\x3c\x46\xcc\xde\x33\xcf\xc0\xc3\xdb\xd7\xb7\x31\xcc\xe7\x71\xcc\xc7\x77\xaf\xb3\xd6\x01\xb9\xaa\x93\x07\x1f\x07\xf3\xb3\x5e\x48\xc2\x6b\x8d\x71\xc3\xb0\x85\x61\x0c\xbe\x02\x24\x38\x9f\x16\x01\x6f\x70\xa8\x03\x89\xa0\xe7\x01\xd0\xcb\xf9\x76\xd4\x12\x91\x6b\xce\xf9\x5a\x17\xba\xb4\x01\x33\x56\x99\x8a\x82\x5a\x5b\x2c\x70\x6d\x6a\x17\x48\x4a\x68\x5a\xcd\x13\x05\x8e\x73\x1e\x46\x21\xc4\x7c\x96\x26\x49\xb6\x69\x95\xe8\xd8\xc7\x2f\xe2\xf4\xe4\xdf\x4f\xfe\x4d\xac\xae\x5e\x0b\x45\xb7\x32\xcd\x4f\xb4\x69\x5e\x3d\x7e\x7a\xb3\x0e\x23\x7e\x03\x7e\x76\x1a\xfa\xda\xc5\xf8\xe1\x31\x53\x0d\x3a\xcf\xcd\xbe\xe6\x37\xaa\xc6\xb4\xb3\x55\x0d\xac\x2d\x99\x92\x9a\x72\xd5\xc9\x41\x7a\xcd\x51\xd1\x20\xaa\x6c\x10\xb0\x02\x28\x90\x02\x08\x2e\x29\xad\x18\x45\x65\xf9\x39\x21\x8d\x3c\x16\x23\xe0\x65\x95\xeb\x5a\xce\x7d\x4a\x69\xd8\x9b\xe0\x35\x98\x90\x31\x2e\xec\xcf\xdd\x5e\x37\xcd\xd1\x18\xbb\x04\xde\xb6\x1b\x3b\xc3\x01\x0a\x06\x11\x43\x60\x18\x5d\x69\x4b\xac\xbd\x36\xfe\x68\x60\x9d\x6c\x53\x96\xf4\x3b\x95\xeb\xa4\x4c\xea\xe4\xef\x25\xff\x28\xf9\x17\x2f\xd9\x75\x76\x37\xbd\x9a\x5b\x37\x31\xc2\x07\xee\xa8\x9a\x6f\x6c\x31\xf1\x85\xed\x3d\xb3\x4d\xc6\x7c\x59\x01\x72\x24\xd0\x62\x4e\x21\x13\x5d\x6a\x6c\x51\x02\xfd\x39\xa1\xc8\x12\x89\x99\x34\xb3\xdf\xb0\x50\xa6\xf8\xa9\x4e\xab\x80\x1a\x53\xd6\x92\x4b\xca\xa9\x90\x63\x96\x60\x2e\x1d\x73\xd5\xe2\xa7\x58\xae\x6b\x8c\x2d\xa5\xcb\xce\xc7\x54\x75\xe7\x8a\x60\x4b\x19\x53\xd2\x0a\xd9\x84\xc9\xce\xda\xb9\xd4\xa2\x5a\x70\x21\xb5\x64\x9a\x8b\x3d\x53\x4c\x58\x80\x6a\xc1\xb8\x52\x32\x49\xd3\x2a\xe1\x3b\x9d\x9b\xe4\xef\x27\xe2\x0e\x1f\xb1\x46\x84\xaf\xbf\x7f\xb3\xfd\xc2\x05\x50\xff\xf0\x97\x60\xf7\xf8\xe9\x43\x6c\xc1\x7e\xfc\x35\x88\x1c\xd1\xbf\x7a\xf3\xdb\x9f\xb7\x8d\x7f\x09\x56\x9b\xf8\xe1\x8b\x69\x5c\x62\x4c\x1a\xe1\x24\xa9\x81\x48\x57\x65\x28\x40\x53\x06\x06\xfb\x81\x95\xa6\x12\x61\x0c\x47\xb6\x2f\xc7\x70\x36\x56\x81\x61\xca\xa6\x50\xd1\xba\x28\x1a\x2d\x94\x6d\x0c\x6f\x1a\x65\x20\xaa\x30\x46\xe8\x10\x26\x02\xd0\x54\xf4\x9f\x13\x02\x92\x43\x59\xee\x1b\x3e\xea\x70\xcc\x0d\xd6\x4c\x73\xca\x6b\xc8\x2a\x55\xd5\x65\x49\xb1\x40\x90\x97\x85\x2a\x79\xa8\xc2\x3e\x1c\xc4\x11\xc0\x54\xcc\x67\xc3\x4d\x41\xb5\xe6\x44\x2a\xed\x34\xb6\xb2\x30\x05\xc6\xc8\x0b\xc5\xbb\xaa\xb2\x4c\x51\x53\x97\x12\x49\x8c\xa3\x5f\xa6\x09\x89\xf3\x64\x2f\xa7\x0d\xaf\xac\x64\x5f\x4d\x26\x3c\x6f\xe8\x97\x15\xcd\x17\x4a\x3f\x03\xd8\xfb\xc8\xfb\x26\x7e\xdc\xa7\x24\x60\x1f\xf7\xec\x1e\xd0\x0b\xdf\x90\xa7\xc1\x2f\xfe\xfa\xf6\x38\xb3\x61\xa2\x07\x70\x3a\x4d\x68\x9a\x72\x4c\x48\x18\xa8\x31\x54\x33\xc6\x02\x9a\x29\x38\xb1\x70\x62\xe1\x4c\x47\x89\x6b\x5d\xa1\x9a\x18\x5a\x2f\x71\x12\x4b\xe4\x8e\xe6\x3c\xc6\x9f\xff\x34\x76\x4e\xff\xf3\xc8\xa1\xf6\xe9\x0b\xc9\xdb\xf5\x56\xbf\x98\x43\x7a\x77\x65\xa8\xfc\x49\x63\xe2\xeb\x90\xfa\xfd\x87\x77\xa9\x06\x47\xcb\xb5\x70\x7a\x4e\xb2\xb3\xeb\x80\xa5\x42\x11\x74\xe2\x36\x0e\x1d\xb1\xc5\x79\x09\x50\x0f\x81\x6e\x3a\xb9\x1a\x30\x7a\x19\x1c\xd0\x4a\x58\xe1\x80\xb7\x8a\x2b\x13\x86\x48\xd0\x7c\x3a\x6d\x09\x12\x35\x82\x58\x2b\x41\xb5\x12\x8c\x10\xcd\x48\xa9\x2b\x2c\x5a\xa6\x11\x0b\xc7\x59\x2e\x01\x66\x49\xc1\x79\x16\x59\x6d\x29\xc7\x0a\xa1\xc8\x27\x14\x27\x2a\x93\x22\x95\x09\xdf\x99\x5c\xc4\xd8\xe9\x37\x91\x8d\xf9\x9f\x27\xff\x3a\x61\x57\x66\xbe\x67\x56\xac\xb7\x7f\xf7\x87\x0f\xcb\xbd\xf9\x42\x95\x75\x23\xcb\xfa\x70\x9b\x24\xf9\x62\xcd\xaf\xf7\x35\xd2\x2f\x3d\x5f\x83\xef\xb7\x49\x8a\x03\x45\xa2\x43\xae\x90\x9f\x93\x4e\x98\xe5\x16\x1e\x03\x47\xc2\xa0\xd2\x15\x62\x5a\x9e\x82\xc1\x81\xc2\x01\xb2\xb2\x4b\xcb\x1f\x27\xc0\x22\x1d\x36\x09\x03\x52\xed\x51\x1e\x52\x3e\x76\x32\xd8\x5c\x04\x6b\xea\x12\x0b\xe4\x29\x26\x00\x29\x13\x8c\xa9\xcb\xb2\x2e\x38\xf2\x04\xd3\x14\x5a\xa5\x66\xb9\x24\x9a\xc6\x5b\xeb\xbd\x0f\x07\xa1\xa9\xc1\x52\x70\x3d\xac\xba\x88\x2c\xfa\x70\x72\xd7\x99\xb8\xde\xf1\x5b\xf9\xec\x05\x3f\xd8\xdb\xfa\x2b\x2d\xf1\x4f\x1f\xd7\xd5\x1b\x53\x91\x0f\xef\x5e\x6f\x5f\x44\x74\x3f\x3c\xbe\xcd\x97\xd8\x32\xd5\x9b\x29\x48\xc0\xe7\xa1\xaa\xd2\xc3\xd1\x0a\x47\xc4\x6c\x30\x48\x00\x65\xa5\xad\x29\x0e\x6a\xf1\xc8\x54\x18\x03\xc3\x09\x78\x1c\x0c\x60\x41\xa5\x87\x21\x0c\xc3\x00\xc8\x60\xf6\xb3\x4c\x09\x42\x41\x43\xe0\x43\x05\xa6\x9c\x18\x1e\x1c\xac\xb5\x5c\xa2\xef\xd0\x62\x58\x60\x8d\x5a\x84\xb0\x04\x84\x40\x83\x65\x5d\x68\x0a\xe2\xdc\xde\x29\x12\xd1\xcc\x67\x04\x51\xab\x93\x18\xd3\xf1\xe8\x8b\xff\x66\x52\x27\x68\xcd\x88\xbf\x9a\xdb\xbd\x05\x2d\x37\xb8\xfc\x33\x3c\xe4\xed\x0a\xf1\x06\x3f\xc5\xa5\x5d\x35\xc0\x33\x08\xcc\xda\x5c\x38\x3f\xb5\xe0\x10\x8c\x3b\xb8\xc3\x61\x5f\x7d\x4e\xc2\x80\x40\x72\x48\xed\xe0\x8e\x47\x50\xcc\x66\x1a\x66\xbd\x19\x82\xb9\x42\xd6\x54\xdb\xf0\x31\x22\xd6\x48\x15\x86\xbc\x94\xd2\x2a\x6b\x55\xb0\x9c\x5b\x51\x29\x02\x6d\xad\x97\xe3\xf8\x64\x6f\xda\xba\xc2\x1c\x3b\x46\xc5\x10\xce\xdc\xe0\x36\xe6\xfb\x7c\xe7\x72\x9b\xfc\xfd\xe4\xb7\x11\xf7\x40\x93\x7f\x93\xfc\xbb\x35\x62\xbd\xc5\xa5\xaf\xdf\x3e\xbc\xfb\x59\xae\x82\x87\xb7\x1f\x57\x55\x8f\x6d\xbe\x0e\x32\xaf\x27\x95\x6f\x3f\x7c\xfc\xf4\x6e\x39\xd7\xbf\x00\x71\x54\x6a\xad\xb8\x6c\x0a\x8a\x40\x09\xeb\xa6\xae\x01\x09\x18\x98\x76\xc9\x10\xa8\x16\xbc\x92\x12\x5d\x64\xe6\x2f\x3d\x30\x45\x20\x80\xd7\x10\xe0\x42\x85\x2a\x13\xaa\xe3\x8e\x86\x93\xc5\x43\xaa\x90\x62\x97\x26\x13\x97\xa6\xe5\x48\x23\x96\x5b\x26\x38\x87\x0c\x1b\x3a\x73\x6e\xec\x3a\x2a\xa8\x0c\x4f\xdb\x1a\x1a\x84\x8e\xb0\xa6\x81\x50\xcc\x50\x5f\xab\x9a\x56\x75\x49\x03\xa5\x81\x33\x49\x05\x8f\x98\x61\x91\xf4\x3b\x19\xf3\xbb\x77\x09\x8a\x5c\xd0\x3f\x33\x27\xf7\xea\x8a\xe7\x79\xc6\x73\xdf\x4f\xc1\xbc\x18\x89\x49\x05\x28\x3d\x68\x1a\x50\x87\x63\x13\x84\x0f\x27\x03\x3a\x0f\x0e\x01\xa5\x28\x3a\x59\x66\x6c\x59\x0b\x21\x29\x27\x42\x1d\xd3\xe3\x92\xf9\x49\x45\x05\xe6\xaa\xdf\xc6\x15\x17\x91\x8f\x73\x92\xf2\xb9\x8d\x62\xf6\xe9\x11\x0a\x1e\x21\x2e\x8a\xcb\xfd\x09\x72\xc6\xb5\x12\x42\x72\xd9\x5d\xf3\x0c\x9f\xeb\x58\xad\xf8\xc7\x5f\x26\x3e\xee\x1f\xaf\xdf\xbd\xfe\xf6\xfd\x0b\x8a\xbe\x58\x05\x58\x8d\x71\xdc\x7c\xd7\x32\x38\xf8\x49\x74\xfd\xb0\x82\x0a\x52\xd3\x38\x61\x8c\x51\x66\x18\xca\xa2\x64\x95\x2d\x68\x23\x89\x0a\x46\x54\xad\xf6\x65\x93\x3a\x93\x36\xee\x22\xfc\x86\x48\x09\x51\x4d\x21\x3e\xfb\x83\x07\xd2\x6f\x0f\xb1\x92\xea\xdb\xd6\x18\x54\x60\xbe\x98\x1c\xd6\x85\x23\xa8\x0f\x46\x08\xd7\x34\xcd\x10\xf6\x7d\x0f\x70\x68\xc3\xb0\x8a\x23\x36\x11\x10\xd2\x80\x63\xdb\x5e\xb9\xf3\x12\xbe\x6b\x72\x92\x7c\x93\xfc\x2a\xf9\x93\x38\xad\xf0\xf0\xed\x1f\xa5\xef\x1e\x3f\x7d\x5c\xc9\xc5\xbf\xf9\x35\x78\x75\xed\x14\xbd\x06\x3f\x49\xa2\x7e\x0f\x89\x59\x01\xa9\xc0\xd0\x56\x7d\x4d\xb5\x34\x51\x02\xde\xa4\x87\x70\x80\x84\x22\xcd\x8c\xb5\x8d\x56\x8c\x15\xc6\x60\x52\x73\x82\xb1\x1d\xd8\xa9\x29\x2a\xd3\xb0\xc1\x56\x35\xe5\xa2\x57\xe1\x9c\x93\xa7\x84\x88\xba\x70\x45\x45\x41\x11\x8e\x07\x0e\x20\x50\xe9\x3e\x08\x50\xcd\x14\xd4\x6d\xda\x3b\xce\xa4\xd3\x9a\x0e\xda\xed\x4d\xa3\x18\x3f\xf5\xb5\xaf\xad\x25\x4e\x18\xd5\x09\xea\x85\xe5\x2d\x46\x1c\x6b\xdd\x25\x79\x0a\x13\xbd\x33\xb9\x89\xfe\xff\x37\x71\xaa\xe7\x2f\x6e\x99\xf9\xc3\x1d\x2e\x66\xb9\x99\xaf\x9f\xa1\x6a\xe0\xe7\x98\xca\x6f\xbd\x0d\x82\x2a\x30\x5e\x92\xbd\x07\xd8\x1d\x8f\x73\xb3\x6f\x5d\x93\x56\x55\x0d\x58\xd8\xa7\x85\xa2\x86\x8a\x59\x59\xc2\xad\x04\x12\x96\xae\xa8\x81\x41\x95\x2b\x61\x6e\xa8\x70\x9f\x93\x88\x92\x09\x0e\x28\x16\x54\x38\x70\x80\x81\x4a\x21\xc1\x17\x3b\x4d\x5d\xb3\xc7\x07\x0f\xd1\xe8\x59\x6b\x9b\x0e\xf6\x4d\xed\x5b\xd8\xf9\x24\xf9\x45\x6a\x12\x73\xcd\x61\x7e\x8e\x3b\x61\xdd\x71\xef\xbf\xcc\x0b\xfc\xac\x4f\x78\xe1\x1f\xbe\xc4\x3a\xa9\x01\xb6\xe9\x9a\xc8\x80\x82\x9f\x96\x2c\x46\xa7\x63\x17\x96\x3b\xc8\xba\xa6\xbd\xf4\xb7\x03\x91\x9d\x2f\x45\xb3\xa4\xf6\xcb\x23\xaf\x84\x10\xc2\x8a\xf9\x90\xa2\xe5\x68\xc9\x44\xe2\x8c\xe6\xf2\x15\xf6\xf3\x08\xa8\x0c\x7b\x99\x6c\xd3\x32\x11\x11\x1b\xb8\xce\x73\xfd\x93\xa8\x38\xf0\x3c\x00\xfb\xf0\x12\xfb\xf3\x69\x85\x1c\xbc\x7f\x78\xb7\xd8\x8b\x9f\xcb\x56\x96\x44\x65\x15\x26\xc8\x53\x7a\x9d\xbb\x3e\x9f\x07\x2b\x94\x76\xcc\xcb\x9e\xef\x41\x11\x26\x6f\x0c\x28\x25\x50\xae\xaa\x81\xa2\x90\x2b\xa5\xb9\xd0\x9d\xde\x1b\x53\xd5\xda\x33\x4a\x48\xd5\x17\xdb\xa3\xf7\x4e\x87\xb2\x36\xda\x6a\x11\x28\x18\x1a\xad\xdd\x01\x9c\x74\x28\x22\x8e\xb3\x4c\x0b\x64\x8c\x0d\xc7\xd3\xfe\xa8\xfb\xfe\xd8\x9b\x1e\x14\x07\x42\x04\x30\x9d\x50\xed\x00\x97\xbd\xa5\x63\x7e\xe9\x22\xba\xe6\xaa\xc5\x7f\x2d\xdb\xbe\x7b\xa1\xbc\x7b\x2d\x1e\xfe\xf0\xf8\x76\x1b\xd9\x38\xb2\x2f\x17\x21\x8a\x23\x2e\x37\x24\xd5\xcb\x5a\xb2\x04\xa6\xe8\x04\x31\x80\x4a\x71\x5d\x7b\x46\x2f\xbe\x01\x1c\xe1\x70\x4c\xd1\x84\xeb\x20\xf0\x19\xa0\x38\x22\x7c\x9e\xcd\x39\x1c\xfa\x28\xce\x7b\x8a\xbc\x95\x4e\xf0\x8b\x12\x7c\x31\x03\xe9\xf1\xa2\x36\xb5\xe0\xbd\x64\x3c\x58\x21\xb4\x08\x06\x18\x11\xbc\x4d\x92\x2c\x85\x89\xdc\xb5\xb9\x49\xfe\x5e\x8c\xb9\xee\xee\xc9\xea\x6c\x5f\xe6\x81\x31\xed\x7f\xf5\xee\x36\xa5\x0c\x22\xaa\xf9\x7a\x7b\xd6\x79\xcc\xf8\x07\x3f\x7c\x8a\xb9\x64\x4a\x41\xed\x17\x03\x7e\x3a\x81\x32\xb8\x02\x50\x26\x31\xab\x39\xa9\xaa\x62\x8f\xac\xed\xcb\x09\x90\xf3\x39\x1c\xb3\xba\x2c\x54\x53\xbb\xb2\x02\x4e\x56\x5c\x2b\xcd\xb9\x1d\xf8\x5e\x73\x8f\xaa\x7d\x59\x6f\xa7\xe5\x0e\x59\xe3\x31\x0a\xac\xad\x5d\x4d\x4f\x61\x6a\xd8\x08\xac\x37\x56\x07\x5b\x55\x02\x94\x80\xd7\x5a\xba\x70\xfc\x9c\x1c\x26\x73\xe8\xc2\x41\x3b\x0b\x70\x53\x75\x7b\x4c\x62\x7e\xa8\x76\x3a\x17\x11\xd7\xfa\x90\xbc\x89\x15\xb0\x67\xb5\xbd\x97\xbb\x3b\x7b\x56\x2b\xbc\x6e\xa4\x0f\x57\xb9\xd8\xd7\x2b\x31\x77\xde\xb3\x80\x67\x85\xd2\x1a\x1c\x8d\xd6\xd2\xcc\x05\x45\x16\x52\x70\x96\xc4\x62\xe9\x31\xb1\x8e\xb9\x3a\xab\x43\xbd\x38\x1f\x00\x9d\xbb\x78\x0f\xca\x79\x9f\xe2\x5c\x58\x5a\x3a\xc5\x5a\x29\x34\xa3\x8c\x31\xca\xb8\x64\x52\x04\xc5\x30\xb3\x1d\x26\xb6\xb5\xe1\x30\x05\x8e\x81\x3e\x01\x64\xdb\x25\x27\x20\x89\xbb\xc6\x4b\x7f\xdd\x6c\xf5\x35\x83\x79\x9e\xad\xbe\xed\xec\x01\x8c\x0d\x18\x02\x49\xc9\x8f\xfb\x94\x07\xd8\xac\x54\xba\xa0\x76\x17\x97\xb9\xa7\x43\x93\x1e\x66\x94\x9e\xe6\x32\x8e\x57\xb7\xcc\x5a\xa6\x97\x4d\x5c\x84\x86\x85\x26\x2b\x8f\x72\x9e\x64\xcc\xa7\x78\xa2\x77\xec\x45\x2d\xf1\xd7\xcf\x1c\xe6\x31\xb7\x58\x37\xec\xfb\x75\x34\xf3\xdd\xfd\xd4\xea\x0b\x6e\xc6\x76\x23\x9e\x1a\xdf\xf7\x80\xf4\xb6\x0b\xb5\xf7\x93\xb5\x7b\xbd\x4f\x0f\x9d\x57\xbe\x23\x63\xab\xba\x7d\xe0\xd6\x4d\xfa\x98\x93\xf9\xe0\x6e\x53\x79\xa0\x0a\xf0\xe2\x33\xc2\x9c\xd3\x5a\x73\x6d\x8c\x38\x49\x67\x1a\x29\x69\xe3\x94\x89\x3e\xae\x4c\xd4\x6e\xc8\x55\xac\x7c\xfc\xbb\x84\xaf\x55\x80\x7c\xf7\xf1\x9f\x82\xbb\x26\xeb\xfd\xdc\xc8\xc3\x97\x8e\xeb\xee\xf1\xbb\x6d\x9c\x6b\x8c\x4e\xef\xfe\x6f\x96\x57\x1f\x3e\xde\x98\xe9\xd6\xd3\xd8\x15\x62\x7f\xa0\x42\x72\xe7\x0e\xa7\xa1\x61\xda\x72\x43\x1a\xa6\xe3\xe8\x0f\xf6\x2d\xf4\x56\xe9\x5a\x52\xce\xc1\x70\x49\x52\x28\x14\x63\x15\x17\x9c\x61\x52\x42\x4c\x3a\xac\x95\x64\xc1\x6c\x06\x29\x15\x37\x41\x1a\xa1\x95\xce\x95\x64\xb0\xd3\x45\xb5\x47\x61\xd8\xd7\x50\xd1\x76\x60\x0e\x06\x2e\x69\x69\x4b\x02\x54\x5d\x19\xd5\xd4\xa5\x55\x6d\x69\x48\xd1\x68\x75\xac\x6a\x83\x60\xa8\x28\x2d\x97\x0d\xd4\x10\x5f\x43\xc0\x04\xbf\x8c\x76\xcf\xbb\x16\x91\xa3\x5e\x67\x1e\x76\x69\x9b\x74\x3b\x96\xcb\x38\x87\x72\xef\x37\x96\x93\xfd\x22\x20\x9b\xef\x1e\x1f\x3e\x6e\xef\xe4\x3b\x5e\x5d\xb7\xfd\xd5\x5f\xbc\x28\x7c\x6d\x20\x6b\x1a\x21\x6a\xa8\x24\x35\x65\x69\x3b\xb6\x07\x3c\xb5\x85\x54\x90\x57\x02\x57\xb0\xe8\x8b\xa3\xec\xcb\x6e\x3e\xc7\x14\xf9\xa7\xf5\xae\x5c\x1a\x02\xc3\x00\x29\x21\xc8\x77\x18\xd6\x9c\xb0\xb4\xae\x8a\x20\xa6\xc2\x15\x1c\xd4\xc1\xb4\xca\x02\x34\x77\xb3\x02\xce\x18\x13\xf4\x3a\xc4\x07\x52\x13\x7b\x0a\x36\x9e\x43\x1e\x99\xa7\xae\x27\xf0\x8c\x67\xfc\x74\x85\x39\xe6\x77\x2c\x85\xd1\xd0\x5e\x41\xae\x31\x78\xcb\x1a\x29\x49\x96\x8c\x01\x51\x64\x30\xab\x6b\x02\x0d\x44\x18\x4b\x00\x1b\x5f\x56\xa9\x18\x42\x59\xa4\x63\xa0\x69\x3d\x1f\x41\xe9\x9f\xce\x1e\xe0\x79\x48\xc9\x89\x72\x65\xb2\xb6\x2a\x3d\x07\x90\x30\xca\x59\x5d\x11\x4a\x29\xa9\x2b\xd9\x1c\x60\x5d\xdb\xb0\xb7\x45\x61\x1b\x7b\xee\xc2\x1e\x90\xfe\x6c\x1b\x46\x38\x4f\x92\x34\xc6\x9b\x36\xd7\xf7\xd5\x88\xf5\xbf\x67\xdd\xf8\x7b\xe0\xd9\x87\xab\xe4\xdf\x5a\x9f\x7c\x1b\x69\xe8\x7b\x70\x6a\xc0\x29\x94\x29\x09\x67\x88\x00\x9a\x4f\x91\xb5\x08\xce\x63\x13\x87\x0e\x31\xd8\xcf\x27\x50\x42\x7c\x4c\x49\x28\x81\x03\x0c\xd6\xa1\x44\xdb\x93\xb5\xc6\x5a\x41\xad\xb1\xc6\x8e\x63\xfc\xc1\x99\xb5\x81\x32\xce\xe2\x1e\x82\x09\xdb\xf1\x9c\xde\x73\xb8\xc7\x4c\xf4\x8b\x27\x78\x78\x7b\x3f\xb0\x11\x79\xbd\xbf\x08\xd3\xac\x72\xde\xe9\x39\x3b\xcf\xb6\x46\x19\x12\x0a\x8b\xda\xe0\xaa\x0a\xae\xac\x9c\x91\xd2\x30\xc3\x0f\x38\x9c\x4c\xc7\x01\xb4\x47\x17\x0d\xd0\x61\x46\xc6\xa5\xd5\xcc\x73\x3a\x77\x18\xcf\xcd\x58\xda\xd2\x03\x4f\x10\xe5\x4a\x50\x4e\xb9\xea\xb4\xb0\xae\x03\x52\x86\x5e\xce\x26\x9c\x6c\xb2\x4d\xbb\x44\xef\x78\x4e\x7e\xbf\x59\xf1\xb7\x4b\xf8\xf3\xea\xda\x4d\xca\xbb\x56\x29\x44\x6b\x81\x16\xc7\xea\xd3\x62\x3f\x0f\x40\x07\x3b\x4d\xc5\xf3\x90\x75\x4e\xe6\x61\x86\x7c\xf5\xa3\xf5\x5c\x67\x6a\x79\x09\xf4\x36\x1c\xda\xc0\x57\x51\x81\xc5\x87\xda\x58\x67\xfa\xd3\xe4\x37\x31\xae\xb9\xe3\x98\x29\xd3\xbb\x5d\x94\x3d\x7e\xf3\x10\x29\xee\x6f\x44\x14\xd9\xdb\x0f\xb7\xa2\xce\x4f\x5a\x8c\x29\x3b\x57\xc8\xe3\x7a\x08\x2d\x40\xcc\x46\x55\xba\x1a\x16\xbe\x6c\x4c\xa3\xb3\x6a\x89\x69\x86\x50\x60\xaa\x1a\x05\x20\x27\x61\x04\x23\x93\x20\xf9\x9c\x48\x81\x51\x05\x91\x08\xe3\xd6\x28\x59\x6b\x63\xf7\xb3\x0d\xa7\xc2\x15\x1a\x9c\x43\x15\x0e\x02\x60\x30\x9e\x81\x81\x9c\x59\x23\xf8\x34\x6b\xcd\xa8\xf5\x4a\x20\x17\x3a\x4a\x97\xc0\x1b\xe0\xe5\xbc\xd6\x3c\x1d\xc5\x79\x93\xdf\x2e\xd7\xb5\xcc\x1e\x3f\x7e\xb3\x5c\xd1\x6c\xb9\x96\x77\xba\x6f\x2f\xc8\x17\xee\xd6\x6e\xd6\x74\x56\xd0\x0d\x6e\x2e\xe7\xac\x98\x0b\xe0\x23\xb9\x84\x1b\x6b\xa8\x09\x92\x92\x28\x88\x8e\xc1\xc4\x4a\x72\x13\x84\x0b\x72\xe3\x3f\x27\x81\x85\x8e\x1d\x00\x3e\xa6\x22\x48\x50\xda\x4b\xa3\xad\xb4\x04\x13\x2e\xb8\x64\x04\x59\x69\xb5\x3d\x1e\xd7\x39\x48\x1c\x63\x7b\x95\x54\x77\x3d\xb7\x1b\x25\xe0\x1a\x02\xbf\x2e\xd3\x2b\xf7\x5d\xf6\x21\xdf\xbd\x06\x77\xd5\xbd\x5d\xc1\x42\xe4\x24\x02\xea\xd2\x01\x1a\x08\x63\x9a\x92\xb4\x61\x87\x13\x28\x22\x2d\xe0\xf5\x91\x47\x4d\x64\x7d\x51\x99\xd3\x75\xa8\x82\xb4\x52\x01\x05\x8e\xc0\x95\x61\xf2\x65\x61\xe6\xc9\x05\x6d\x82\x35\xcb\x75\x13\x89\xdf\xe9\x68\x67\x97\xfd\xf3\xb3\x99\x30\xb8\xb5\x9d\xbe\x34\xac\x6e\x9a\x7f\x16\x14\x1e\xf8\x18\x38\xf9\x20\x7d\x38\x83\x5a\x5a\x0e\xb0\x0e\x0a\x8c\xb0\x6a\xca\x3a\x15\x33\x87\x34\x6d\x2e\x7d\x13\xd5\x69\x8f\xd6\x5a\xeb\x97\x1c\x77\x2e\x39\xd5\xdd\xe0\x84\xae\x84\x70\x8c\xcf\x8d\x8f\x33\x59\x9b\x88\x01\xc1\x39\x7d\xee\x4d\x26\x60\x2d\x2e\xad\x10\xf0\xfb\xcd\x7c\xcf\xed\xb7\xc3\xb3\x87\x28\x65\xe3\x5c\x93\xd4\xf7\xf3\xa9\xd2\x52\x49\x4d\xb8\x3a\xf9\xd0\xa4\xdd\x7e\xef\x86\x61\x16\x7d\x9f\xd3\x79\xa0\xd4\x86\xa4\xf1\x1a\xb8\x9a\x0b\xa3\x39\x21\xba\x3f\xa5\x24\xb2\x8f\x2d\x8f\x78\xbf\x16\xff\xdc\xe4\xfa\x8a\xe9\xf9\xcd\xaa\x71\x11\x4b\x9a\x6f\x1f\xae\x53\x8f\x51\xcf\x26\x16\xec\x5f\xbd\xfd\xf8\xe9\x37\x20\xdf\xbd\xfd\x90\xad\x78\xa6\xf7\x0f\x2f\xa0\x61\x99\x73\x04\x2c\xc6\xcf\xcd\xa7\x26\x18\x09\x88\x0f\x0e\x4c\x18\x06\x46\xb1\x91\x67\x05\xaa\xba\x0c\x3d\x38\x96\x35\x60\x35\xc3\x16\xb1\xd1\x21\x69\x59\xe9\x6a\x33\x0e\x32\xd7\x50\x19\xc1\xe6\x73\x30\xbd\x73\xa0\x4a\x0b\xc6\x19\xe6\xb2\x9b\x5b\xa5\xb5\x9a\x82\xe0\x8a\x49\x41\xc2\xa1\xae\x88\xc6\x9d\x60\x62\xb9\xbf\x2a\x91\x71\x7e\xe1\x4f\x92\x3f\xbf\x6a\x74\xec\xae\x5c\x5b\xdf\xc5\xd9\xa5\x9b\xc0\xd2\xf6\xb1\xce\xde\xdc\xba\x91\x5f\x78\x8f\xe3\x8b\x20\x9e\xa3\x63\xc3\x29\xad\x82\xea\x4e\x34\x8c\xbd\xeb\xc3\x24\x8e\x7d\x70\x69\x11\x2c\x02\x07\xef\x51\x3a\x86\x09\xea\x7d\x27\xfc\xf9\x10\x1c\x07\xb0\x6b\x7a\xba\xc4\x6f\x16\x54\x1a\x05\xcf\x97\x95\x59\x6a\x6b\xb0\x57\xc3\x71\x3a\x48\x43\xad\x55\xa5\x9b\x75\x29\x6d\x63\x28\x33\x4c\x5a\xec\x20\xc3\x58\x0a\x1b\xbc\xbc\x71\xab\xe8\x64\x88\xfd\x92\x75\xca\xf2\xcf\x7e\x5a\x83\xbb\x87\xa0\x7c\xfd\x5a\x7a\x06\x5d\x03\xda\xc0\xd3\xea\x89\xa6\x49\x60\x47\xd3\x1c\xc5\x31\x9d\xbc\xd7\xb6\x9b\x09\x68\xa3\x66\x65\x5a\x3f\xe1\xb4\x08\x7c\x3b\x39\xe7\x5a\xe7\xda\xd0\xf1\x46\x28\x69\xb8\xd2\x4a\x87\xa9\x6d\x5d\xef\x5c\x7f\xf5\x39\x5d\xcc\x9f\xee\x76\x71\xbe\xbb\x23\xdf\x7e\x49\xf9\x96\x6c\x6f\xaa\xba\x6f\x3f\x64\xad\x83\x08\xf0\x1a\x35\x14\x02\x13\xf0\xf3\x7c\xce\xfe\xa9\xc5\xc4\x80\x04\x9c\x6e\x52\xbb\xb9\x43\x4a\x48\x8e\x94\x71\x07\x37\xb9\xc9\x65\x96\x33\x01\xd0\xe9\x70\x58\xec\xbe\x9b\xa6\xeb\x5e\x51\x71\xaf\x7c\x7b\x55\x61\x4a\xbe\x2a\xab\xaf\x35\x82\x57\xf7\x35\xc9\xb7\x5f\xfc\xca\x0e\x73\x4e\x55\xad\x28\xbe\x9c\x8c\x33\xd3\xd1\xc7\x7a\x23\x07\xc5\x31\xda\x94\x58\x72\xce\xe9\x8f\x27\x29\x4a\x57\xca\x0d\x9f\xa7\x80\x42\xcf\x81\x00\x3e\x95\x61\xf0\xde\x34\xc6\x34\x41\x05\xa9\xdb\x2b\xb7\xb5\x8e\x76\xf8\xd6\xbb\xf8\x69\xeb\xe6\xc3\xc3\x5d\x98\xf0\x70\xc5\xb8\xdd\xf8\x62\x36\xbb\xc7\xef\x72\xe5\x84\x6c\xad\x1c\x4f\x54\x52\x52\x53\x8a\xe7\x7d\xe6\xe7\x3a\x3d\x5e\x0e\xd9\xe1\x30\x0f\x04\xeb\x19\x09\x6c\x30\x07\xba\xfa\x9c\xec\x19\x20\x99\xe4\x86\x4b\x6d\xf6\x66\x52\xac\x72\x15\x4f\xb1\x75\x46\xdb\xf9\x64\xc7\xaa\x96\x56\x28\x2a\x65\xeb\x06\xee\xae\x6b\x8a\x27\x32\xf2\x61\xfc\x36\x66\xc0\xe4\x39\x47\x89\xb5\x95\xd7\x3f\xdb\x73\xba\xb6\x9c\x9e\x3f\xfc\x1a\x5c\x2e\x8f\x35\x15\x4b\x40\xe3\xc0\xa1\xeb\x02\xb2\x86\x59\x29\x9d\x52\xc3\x91\x1a\xc1\x6b\x25\xf1\x31\x4c\x18\x90\x53\xe0\xa0\x9d\xfb\x94\x06\x91\xa2\x15\x82\x77\x69\x9c\x12\xda\xe4\x85\xd6\xe1\xe4\xc2\xa9\x63\x42\x31\xbb\x9c\xcb\xe8\x8e\x92\xd5\x1e\x92\x46\x4b\xab\xec\xd1\x5a\x67\xad\x0d\x93\xb5\x61\x24\x5c\x4b\xba\xd8\x28\x9b\xa8\x38\xa7\x97\xc5\x15\xf0\x1f\x45\x9e\x91\x55\x3b\xf8\xae\x2f\x1c\x21\x40\x11\x3d\xf8\xdb\x0f\x1f\xd7\x28\x03\xdc\x25\x91\xa9\xdd\x16\x3f\x9e\x53\xcc\x39\x44\x90\x41\x78\x72\x9b\x86\x73\x06\x4d\x15\xce\x2e\xf4\xb0\x34\x25\xca\x0a\x54\x9a\x12\xe7\xc4\xda\x4b\x29\x44\xe9\x4b\x96\xe1\xa7\xe3\xa6\x5b\x7e\xf3\x45\x41\x32\xfc\x74\xd8\x0c\xa1\x1b\xc7\xfa\xb8\xaf\x0f\x87\x7a\x1c\x96\xcf\xa7\x13\x16\xf7\xee\xef\xcb\x13\xf1\x55\xcc\x9e\x9a\x14\xba\x25\x4e\x5c\x3c\x5f\x8a\xe7\xbd\x5b\x9c\x5c\x80\x60\x9c\xc7\x29\x4e\x74\x1d\x00\xb9\x9c\x6e\x47\x4b\xc0\xe8\xcc\x4c\x9d\xeb\x7b\xe7\xd2\xde\x84\x48\x78\xb9\x7c\x4b\xb2\x88\x2f\xf1\xb9\x8b\x56\xe4\xd3\x17\xf5\xf5\x37\xd7\x69\x9e\xa8\x21\x79\x15\x5f\x07\x2f\xf4\x78\x5f\x06\xb7\x9b\xd2\xe3\x94\x0b\x7f\x38\x93\xd0\x87\x73\x98\x82\x21\x00\x1f\xb5\xe8\x19\x80\xd4\x76\xad\x98\xa7\xb0\x07\xc7\x26\x0a\xc6\xf7\x81\x2e\x3b\xa9\x89\x44\xfa\x12\xf8\x50\xe7\x0e\x51\xed\x04\xae\x1d\xe2\x0a\xfb\x9a\x60\xaa\x6c\x2b\x19\xa1\x6a\x9e\x8c\xb1\xca\x6a\x3b\x0c\x56\x5b\x15\xd7\x29\xd9\x91\xdc\x46\x0d\xe2\xbf\x15\x6b\x35\x6f\xf2\xdd\xc7\xef\xbf\x4c\x24\x7e\x77\x5f\xf8\xdb\x7e\xa1\x94\xf8\xe1\xfb\x17\xd4\xf5\x8b\x0f\xdf\xf0\xc6\xdb\x13\x28\x84\x6a\x5b\x83\x69\x10\x01\x41\x50\xa4\xf5\xa1\x53\xcd\x3e\x10\xe3\x47\x31\x02\xe8\x21\x01\x13\xd3\x63\x2f\xf6\x9f\x93\x53\xe8\x08\x28\x7b\xa1\x48\xeb\x35\x09\xd4\x38\x01\x60\x6e\xd1\x41\x54\x58\x30\x3f\x0a\xce\x79\x6d\xcc\x39\x0e\xe5\x4a\x36\x28\xad\xab\x9a\x31\xe7\x95\x90\xd6\x48\x4b\x3c\x64\xb0\x36\x08\x33\xad\x98\x6a\x57\xfe\x7b\x91\x1c\x62\x3e\xb1\xa2\x8f\x62\xcf\xff\xa5\xcd\x5e\xe3\xcd\x35\xc6\xc8\x1a\x4b\x46\x1f\x8b\x02\xe8\xc7\x31\x15\xe1\x48\xb9\x1e\x70\xd4\xb7\x4d\x87\x99\xe4\x02\xfa\x71\x74\x67\xe7\xce\x9a\xf3\xc3\x6c\x23\x04\x29\xbe\x4f\x97\x0c\x3b\x9e\xa3\x58\x03\xf8\x93\x7b\x15\x97\xd7\x3f\xe1\x81\xcf\x22\x4f\x77\x93\x76\x33\x1b\x36\xcb\xfa\x6a\x82\x48\xeb\x27\x0e\xce\xf1\x9e\xe1\x1c\x85\xc4\x1d\x03\xb4\x9d\x5d\xdc\x80\xed\x96\xbc\x88\x26\x36\xe2\x17\xfe\x34\x46\x9c\xb7\x99\xb7\x97\xf9\xf8\xc7\x25\x21\xff\xfe\x21\x8a\x45\xdd\x08\x8e\xaf\x85\xdb\xef\x52\x33\x36\xfb\x7d\x5f\x49\xc9\x04\x67\x35\xe7\x55\x39\x62\x50\x8e\x9b\x8e\x8f\xe1\x04\x4e\xbe\xe9\x4f\x6a\x00\x74\xab\x40\xb1\xec\xc4\x03\xb1\xa8\x0e\x5c\x8b\xb2\x29\x6b\x02\x28\xf1\x14\x08\x20\x2c\x2d\xc3\xc9\x5d\xf6\x19\x66\x41\x87\x56\x02\x04\x68\xaa\x8b\xd5\xce\xa9\xa4\xdd\x89\x1c\x3f\x63\xbd\x92\x2b\x48\x2d\x66\x95\x9f\x22\x86\x18\xdc\xd4\xca\x16\x6f\xd9\x6c\xba\x59\xd5\x29\x72\x4f\x25\x20\xe8\x0c\xea\x3a\x68\xd0\x82\x53\x20\x41\x6f\xca\xa7\x93\x8b\x48\x45\x6c\x7d\x68\x9c\x3b\x38\x1f\x8a\x43\xa8\x42\xe1\xc6\x64\x9b\x1e\x12\xbb\xa3\x39\xbd\xab\xf5\x2e\xef\x96\xef\xde\xfc\x44\x8e\xe2\x5a\x57\x5c\x97\xe6\xab\xaf\x24\x80\xd3\xc3\x46\xec\xa7\x1a\xb4\x52\x30\x55\x3b\x8a\x42\xdb\x84\xde\x83\xb3\xb4\x46\xb0\x46\x5f\x3a\x1f\xa3\xf0\x09\xf0\xd0\x86\xea\xcb\x71\x4e\x95\x97\xf5\x45\x5f\xe9\x80\x62\xfc\xde\x6e\x6a\x4a\x04\xc6\x84\xcd\xa3\x73\x2e\xd0\xc8\x27\xbe\x4d\x4d\xd2\x45\xec\xe7\x17\x1c\xdc\x1d\xbf\xfe\x17\x37\x7e\xbd\x2a\x26\x2d\x11\xb6\x9c\xa6\xe8\x29\xb1\xcb\x65\x58\x1e\x6b\x75\x79\x98\xc9\xb6\xa5\x54\x48\xeb\xf4\xb2\x67\xe3\xb5\xc8\x62\x1d\xdf\xe7\x3a\xf9\x36\xf6\xc6\x97\xd5\x71\x25\x14\xf8\xe6\xcd\x2e\x7d\x4c\xb7\x8f\x1f\xbf\x79\x15\x9d\xe3\xc3\x0b\xbc\xd7\xcb\x56\xc5\x72\x7d\xfe\x0e\x58\x52\x82\x6d\xeb\x0a\xc7\xb4\xd9\xef\x9d\x72\x5e\x7e\x4e\x64\xd7\x97\x41\x58\xaa\x85\x52\x44\x43\x23\x60\x5d\x38\xc5\x3b\x5f\x95\x9a\x0b\xad\x89\xb4\x8c\xb0\xc9\x56\xdc\xf2\x5c\x07\xa1\xac\xef\xc4\xa9\xfb\x9c\x9c\x1b\x80\xa6\xe0\xf7\xd2\x81\x3d\xe8\x00\xa1\xd6\x9d\x83\x1c\x8f\xa8\xc1\xce\x31\xd2\x50\x27\x7b\x5f\x6b\x6c\x98\xb5\x9a\x72\x2d\x1c\x0c\xa7\x13\x3d\x25\xdb\xb4\x49\xf6\x3b\x15\xf9\xb5\x7f\x99\xbc\x49\xde\xae\xf9\xc2\xeb\x2f\x70\x94\xdf\x31\x9d\xf4\x05\xb8\x92\xee\x37\xed\x13\x3f\x38\x26\x05\xf5\xcc\xd8\x8c\x3b\x26\x25\xf5\x4b\x46\x7f\xb2\xb7\x67\x43\xbd\xe1\x21\x49\xd1\x13\x49\x93\x80\x73\xec\x6a\x6c\xa5\xd2\xac\x75\xb6\xc1\x46\x28\xc3\x3a\x67\x1c\x36\x42\xeb\xe5\x28\xd4\x2e\x1c\x9d\x8b\x31\xfb\x26\xad\x63\xcc\x6e\x93\xbf\x71\xd5\x7a\x7d\xc9\xc6\xfe\x5c\x27\xfd\x3a\x1a\xb9\x8f\x20\x37\x8d\xaf\x2a\x40\x01\x63\xa1\x09\xc3\x31\xf4\x12\xb4\x2c\xdd\x87\x09\x4c\xa1\xa2\x26\xf2\xad\xa3\x50\x82\x53\x98\x2a\x65\x3a\xd1\xa4\xe7\xc6\x1b\xdd\xe5\x16\xc2\xea\xa8\x9c\x3d\x9d\xbc\x1c\x0f\x76\xb0\x81\xad\xcd\x49\xe0\xed\x10\x14\x3f\x38\xab\x7a\xd3\x9b\xbe\x5b\xed\x20\x4d\xd8\x8e\xe5\xe6\xaa\x7f\x1a\x99\xcb\x6e\x58\xeb\xd7\x6f\xd3\x5d\xbe\xe4\x15\x37\x0d\xf8\x15\x33\xf1\xea\x5a\x5b\x89\x2e\xf2\xc3\xdb\x5d\x76\xe0\x78\x4f\x70\x8b\x31\x28\x16\x03\x59\xd6\x15\xae\x4f\x55\x5f\xd7\x45\xd0\xbe\x0b\xa3\x04\xa8\x09\x96\x80\x36\xd4\xa0\x80\x18\x1c\x00\x0a\x38\x8c\x65\x6e\x94\x56\x0a\x09\x16\xe0\x10\xf6\x46\xc0\xb2\x70\xe2\xb8\xb8\xd9\x93\x37\x6e\x0f\x0e\x7b\xcb\x68\x38\xee\xf7\xf3\x69\x18\xd6\x3c\x82\x47\xfe\x9b\x6d\xf2\x0f\xae\x73\x50\x2b\x4a\x63\x55\xc5\xbf\xeb\xbd\x7d\xff\xc2\xf6\xc5\x8f\x7d\x93\xbb\xc9\xf1\x12\xb4\x89\x39\x01\xa7\x26\xad\xe7\x23\x82\x8a\x36\x4a\x0c\x9d\x1e\x3f\x27\x4c\x09\x56\x73\x51\x57\xc7\x70\xa2\x80\x9e\x42\xe9\x0d\x77\xcc\xe4\x86\x0b\x26\xf9\x04\x60\x18\x7d\x50\x55\xdd\x75\x64\x6c\x5c\x63\x8f\x5d\x18\xb4\x28\xdb\xaa\x26\xa0\x1a\x7c\xd3\x0f\xc0\x0a\xe3\xb9\x8f\x7c\x5f\x2a\x71\x3b\x93\xa3\x15\x3d\xba\x66\x35\x7f\x4d\x83\x70\xfb\xf8\x1d\xf8\xe1\xf1\x86\x25\xda\xad\x09\x6f\xda\x6f\x4c\xc0\x94\x4a\x58\x96\xad\xb2\xaa\x1f\x7a\xdd\x0e\x85\xb5\xca\xd4\xce\x60\x7c\x0e\xfb\x25\x10\xae\x8a\x72\x0c\x93\x00\xf0\x54\xd7\xad\xb0\x32\x7e\xf6\x1c\x79\x8a\x5d\x53\x94\x76\x90\xbd\xed\x0e\xfa\x30\x70\x75\xee\xeb\xb6\x96\x0d\x1d\x8d\xb7\x20\xc1\xa8\xec\x95\x57\x03\x44\x12\x23\x2b\x23\x27\xfe\xe2\x53\x78\xc4\x1e\xff\x49\x9c\xf5\x7e\x93\xc7\xf2\xc0\xaf\x56\xba\xb5\x0f\xcf\x74\x36\x4b\xb6\xf6\xee\xc3\xdb\xdd\x0b\xe1\xe2\x4f\x57\x65\x8e\x7c\x60\xe3\xe7\x24\x85\x81\x8d\xa0\x62\x61\x18\xfd\x3e\x1c\x04\xa8\x0f\x91\xf6\x86\xa3\x34\x99\xa6\x4c\x51\x80\x4b\xae\x98\xae\x1d\xaf\xab\x58\x3f\x1f\xca\xee\x20\x07\x9f\x0b\x5b\x15\xce\x3a\xe2\xd5\x12\x00\xf4\xca\x70\x67\x6d\xe9\x2e\xca\x8e\xa1\x6d\x4a\x5f\x93\x76\x3c\x9c\x85\xe2\x43\xb2\x4d\x55\xd2\xef\x78\x0e\x63\x8d\xfd\x4f\x63\x0e\x92\xac\xc5\x96\xd5\x7a\x82\x0f\xef\x5e\xaf\x00\x81\x67\x4d\xe8\xb7\xaf\xbf\xfd\x0b\xf0\xb0\xfc\x51\xda\x03\x11\xf8\x66\x0a\x1c\xf0\xa7\x2e\x55\x26\x74\x59\x35\x10\x6a\xab\x5e\x35\xd5\x90\x72\xe4\x2e\x53\x56\x5d\xa6\xcd\x71\x71\xba\x4f\xe3\x06\xf6\xfd\xac\x34\x21\xa0\x08\xa7\x96\xbb\xc3\x11\x82\xe2\x72\xb6\xc9\x36\x1d\x13\xbd\xab\xa2\xbd\xad\xae\x98\xf8\x55\xfb\xe3\x6b\xc7\x73\x2b\xa9\xdc\x53\x72\x6e\xda\x06\x0c\x4a\x0a\x0d\x5b\x46\x66\xb4\xe4\x83\xa7\x5b\x9d\x0f\x2b\xea\x88\xca\x06\x23\xa5\xd2\xb9\x0e\xfc\xa2\x84\xac\x9a\x8a\xa9\xd0\x6c\x78\xd8\x37\x01\x35\x19\x56\x86\x1b\xc5\x59\x23\xa4\x4a\xb2\xf4\x94\xf8\x1d\xca\xcd\x75\xae\xe0\x3a\x4d\xf0\x75\x57\x6d\x0d\x70\xde\x3f\xbc\xdb\xb8\x0e\xa2\x94\x6a\x25\x4c\xdd\x32\x36\x27\x0d\x20\x98\x81\x63\xa8\xdd\x30\xe4\x06\x4a\xfc\xd4\x70\x5e\xbb\x9a\x66\xcd\x93\xde\xd6\x24\x34\x33\x75\xa0\xb9\xe5\x31\x36\xc6\x52\x7f\xe3\x3a\xbf\xb0\x9c\x75\x09\x1e\xbf\x8b\xf4\x73\x9f\xc0\xfb\x87\x55\xc0\xe7\x45\x29\x02\xbc\x49\xef\xc4\xbd\x9a\xc0\x38\x10\x45\x33\xd0\x73\x07\x90\x07\x49\x27\x9a\x0e\x72\x89\x4b\x57\xab\xae\x93\xc0\x5b\xa9\x94\xbe\x38\x49\x1d\x91\xb9\xbe\x2c\xb1\xc0\xd1\x4e\x80\xb7\xb6\x6d\xfa\x94\xcf\xae\x6b\x6c\x63\x43\x55\x57\xb4\x21\x07\x49\xe5\xa6\x63\x9f\x13\x2b\xba\xae\xdb\x47\x0a\xb4\x18\x7b\xab\x5d\x91\xeb\x2f\xea\x6a\xbb\xb7\xe5\xee\x76\x49\x3e\xc5\x22\x6d\x64\x8d\x7f\x58\x8b\xe3\xd7\x9b\xd4\x37\x24\x3d\x11\xdc\x4b\x5f\xef\x39\xab\xe0\x2c\x09\x4c\xab\xc0\x3c\x65\x0a\x24\xcd\xad\xd9\x92\xeb\xba\xbd\xb0\x63\x07\x1b\xa8\x0e\xe9\x5e\xa3\x19\xcb\xf4\x24\xa8\x3e\x07\xda\x06\xea\x93\x2c\xc5\x89\xd8\xd5\x39\x4b\x7e\x79\xcd\x41\xde\xbf\x54\x93\x8a\x45\xad\x74\xb9\x6e\xf7\xaa\xf2\xaf\xde\x6d\xdf\x3f\xbc\xcb\xad\xe7\x8e\xd2\x9a\x32\x02\x9f\xce\xe9\x21\xb8\xb2\x02\x1c\xcf\x27\x0e\x5a\x76\xac\x6a\x41\x39\x61\x08\xe9\x4e\xec\xd3\xc9\xfb\x9c\xfd\x78\x54\xa2\x6c\x2a\x88\x37\x83\x13\xfc\x72\x0c\x07\x3b\xa5\x8c\x33\x84\x2d\xc1\x9c\xaa\x09\x74\xf0\xb2\xea\xbf\xc7\x38\x44\xe4\xea\x8b\x7a\xec\x57\x95\x8d\x5b\xa5\xcd\xa4\x75\xb4\x99\x60\xff\x74\x00\xfb\xf9\xe8\xb2\xfe\x42\x9b\x54\xcf\x76\xdb\x1c\x0e\xfe\xe8\xfd\x31\x14\x73\xe3\x57\x8e\xac\x25\x2f\x3c\x44\xac\xd6\xb2\x2f\x97\xdc\xeb\xf1\x0b\x4e\xeb\x21\xe6\x56\x37\xe0\xce\xba\x2f\x3f\x7c\x7c\xf5\xee\x6d\x5c\x25\x9f\x1e\x52\xbb\x4d\x02\x03\xf2\x49\x01\x11\x74\x5a\x37\xa1\xc8\x98\x68\x78\x53\x1f\x79\x5b\x0d\xa9\x45\xa2\xaa\x73\xe2\xf7\x4b\x18\xb4\xdf\xef\x9f\x86\x8e\x72\x60\x03\xed\x05\x6a\x00\x09\x0d\xac\x0a\xe0\x93\x4d\x4a\x12\x19\x7d\xf1\xf6\xca\x2c\x7b\xf5\x1a\xe0\x85\x03\xfe\xf8\xe1\xe1\x5d\x99\xae\xf8\xb0\x87\xb7\x6b\xb4\xf3\xfd\xaf\x5e\xed\xd2\x6c\x0b\x71\xdd\xd4\x38\xe0\x4d\x1f\x0c\x37\x04\xd5\x98\x40\xd8\x93\xd6\xca\x9e\xe2\x30\x70\x2f\x8c\x73\xd9\xd9\x70\x4f\x4d\x6e\xa5\xc1\x46\x85\x93\xbf\x38\x2d\x8a\xb6\xac\x49\x46\x03\x0e\xfb\x13\x37\x6a\x74\xe0\xd4\xa3\xb0\x1f\xd9\xf9\x34\x85\x23\x05\x25\x58\xae\xbd\xbf\xd6\xc2\x57\x75\xe3\x1b\x06\xf7\xe1\xa5\x08\x51\xec\xa7\x7e\xcc\x1e\xde\x3e\xac\x26\x23\x2f\x3b\xc6\x40\x19\x53\xce\x26\xb8\x22\x8c\x7c\x2c\xcf\xe7\x21\x6d\x38\x0c\x8e\x69\xe6\xa8\xce\x35\x6a\xb5\x0f\x9d\x8b\xcd\x8d\xf6\xe0\x9a\xb3\x03\xcc\x37\x73\x24\xec\xcf\xa0\xd4\x4c\xa9\x9b\x16\x98\x89\x39\xc4\x4d\xff\xf3\x6b\x83\x75\x15\xce\xbe\xab\xbd\xde\x36\xc7\x0e\x19\x13\xe3\x63\x39\x9b\x86\x31\xed\x87\x30\x01\x47\xb0\xaf\x71\xda\x5d\x4e\xb2\x2a\xe3\x2c\xaa\x99\xcd\xc6\x5c\x86\x35\x65\x57\xa1\xcb\x14\xc1\x4a\xf6\x5e\xca\x9a\x73\x6f\xca\x30\xe9\x60\xd6\x7e\xe4\x62\x43\x71\x0e\xaf\x4a\x36\x7f\xeb\x27\xb5\xa4\x77\x0f\xaf\x6e\x32\xe7\xb1\xde\xaa\x14\x93\xd0\x51\x7a\x39\x36\xa7\xe5\x7d\xe0\x55\x10\x2f\x87\x4f\xd7\x12\xc1\x06\xfd\x78\xde\x36\x61\x74\x3e\xd6\x92\x92\x4d\x3a\x24\xa7\x1d\xcd\xeb\xaf\xb5\x35\x1f\x9e\xff\xd9\x74\xd8\xd8\x27\xdd\x64\xf4\xd2\x47\xb1\x64\x3f\x4d\x79\xfd\xe3\xc1\x6f\x92\x7e\x56\x16\x98\x24\x4d\x59\x72\xdc\xb9\x1c\xc6\x95\x9d\x80\xa8\xbd\xb5\x36\x26\x36\x6f\x76\xdf\x6d\xef\xe2\xcd\x6d\xf1\x39\x09\x0d\x4f\xd5\x71\x56\x19\xe7\x1a\x14\x27\x12\xc6\xcb\x39\x6b\x83\x4c\xcb\x27\x01\x4e\xc1\x6d\xb0\x23\x56\x01\xe4\x9d\x93\x4c\x39\xe7\x7c\x18\xbc\x07\x24\x01\xa9\x8d\xbd\x6c\x19\x95\xe8\xee\xd0\x60\xe9\xee\xbb\xef\x97\xd8\xfc\xd5\x6d\xcc\x7b\xad\x33\x4e\x60\xbf\xf6\xb8\xe0\xac\xbc\x05\x15\x80\x94\xf9\xc1\x34\x35\x0c\x32\x10\xb4\x77\x81\xa7\x30\xe0\x2d\x8f\x52\x56\x67\x1f\x3a\x5b\x11\x29\xe8\x31\x9c\x29\xa5\xac\xf6\x2d\x20\xfe\x7c\xab\xd9\x9a\x88\x0f\xff\x55\xbc\x0b\xb7\x28\xeb\xdd\x43\xba\x7b\x4c\x6e\x13\xe6\xaf\xe2\xdc\x76\x6c\xad\xa5\x49\x48\x9a\xc3\x59\x01\x7c\x0c\x28\x6b\x05\xf1\x98\xa3\xa3\x6f\xec\xb8\xad\x97\xc4\xc8\x3f\x1d\x33\x14\xe4\x64\x41\x01\x8e\xe0\x28\x0c\xd5\x6a\x1e\xc3\x31\xb4\x14\x48\x50\x2d\x71\x47\x9d\x88\x58\x47\xfa\x83\x2b\xcb\xcd\x15\xe3\x72\x9d\xcf\x48\x93\xe5\x8d\xef\x4c\xe3\x37\x5b\xd3\x8c\x5e\x1a\xdb\xcc\xfb\x25\x5a\x96\xcd\xe7\xa4\x91\xa0\x15\xe7\x1a\x69\xc6\xa9\x44\x48\xed\x73\x32\x4f\x4d\xe3\x1a\x7d\x39\x6d\x0f\xd5\x12\xaf\x87\x32\xb4\x4a\x03\x9c\x0a\x2d\x31\x33\x14\x33\xb2\xea\xef\xa5\x32\x91\x3b\x91\xcb\xa8\x3d\xf7\x26\xff\x82\x67\x88\xa7\x1d\xc1\xfe\xd9\xde\xd7\x30\xa3\x33\x8f\x08\x6f\x31\x37\x0d\x11\xd6\x9e\x73\x89\x84\xf0\x93\x0f\x27\x1f\xba\x8d\x3e\x36\x12\xe0\xd8\x6f\xe5\x3b\x91\xeb\x95\x7d\x62\xf7\xfe\x7a\xf7\xae\xd2\xf4\x9b\x57\x6b\x0e\x16\xd7\xcd\xc7\x55\x40\xef\x9b\xac\xf1\xe4\x18\x2b\xc5\x25\x38\xcf\xc7\xa2\x00\x68\x54\xd3\x79\x08\x1d\x07\xce\x84\x24\xc5\x65\x98\x08\x75\x4d\x4e\x70\x1c\x9f\xf5\x8e\x51\x5f\x95\x87\x70\xb2\x00\xf6\x61\xea\xdc\x08\x4a\x4f\x99\xb3\x9a\x2f\xf6\x25\x2b\x93\x71\x57\x3e\xf3\x60\xdc\xa6\x0a\x1f\xde\x7e\x04\x0f\x6f\x7f\xbd\xac\xfb\x4d\xd3\xd5\x75\x9a\x5c\x12\xc0\x20\x98\x66\x12\xeb\x19\x06\x4a\xfa\x84\x36\x07\x3e\x37\x40\x05\x37\x1f\x80\x4f\xb6\xe9\x94\x1c\x77\x45\xae\xbe\x52\x1a\x5f\x22\x9c\xc5\x47\xfc\x26\x6a\x08\x5e\x7f\xae\x2b\xb1\x7f\x3a\x36\x11\x13\xbc\x07\xd5\x5c\xdf\x8e\xb6\x78\xf9\xe4\x4f\x6d\xaa\x63\xc9\x6c\xa5\xa2\xed\xa3\xc8\xd7\x26\x15\x89\x8a\xb5\xba\x87\x18\xc9\x2d\xd6\x68\xf7\x05\x35\xf3\x6d\xb4\x44\xdb\xfb\x76\x65\x8c\x23\xae\xfc\x01\xd9\xc0\x30\x37\x67\xb1\xdc\x23\xc6\xb1\x25\x30\x94\x0d\xf7\xb1\xf8\xc9\xc2\xe0\xa5\xf6\x3e\xe3\x56\x78\x6e\xb7\x85\x63\x42\x82\x12\x60\xc4\xb9\x2d\x7b\xce\x85\xb0\x97\x5e\xf1\xaa\xa9\x69\x6a\x50\x68\x4e\x0c\xd4\xcb\x2e\x09\x3d\x05\x6c\x59\x1f\x8b\xff\x6e\x77\x32\xd7\xc9\x1f\x5f\xfb\xa6\xf1\x8e\xfe\xe1\x6d\xc4\xf4\xe3\xc3\xbb\xd7\x25\x78\xfc\x18\x7b\x96\x77\xf4\x62\xa9\x5d\x3c\x62\x29\x1c\x11\x65\x8b\x4b\xe8\xc3\x81\x2b\xd3\x6c\x8e\xfe\xe0\xfd\xe1\xb0\x15\x4b\xf4\x70\x61\xe1\x5c\x58\x7e\x4a\x19\x9e\x61\x38\x29\x03\x3c\x70\x05\x80\x3f\xf6\x52\x6d\xd9\x53\x97\x0d\x49\x96\x4e\x89\xd9\xd1\x1c\x3f\x6b\x84\x7e\x6d\x19\x6f\xa0\x92\x1d\xd5\x8a\x2b\xe8\x19\xbb\x2c\xd7\x3f\x52\x4a\xef\xf7\x39\x7e\xaa\xd6\xb0\x71\x03\x7f\x3c\x6e\xfb\xd0\xcc\xc8\x81\x36\xee\xbb\x6e\xd7\x45\xfe\xea\x3f\xff\xc2\xc5\xf5\xf8\x11\x94\xeb\xac\xf7\xc7\x4f\xdb\x87\x77\x0f\xbb\x87\x6f\x7f\xf5\x17\xe9\x75\x4e\x22\xfa\xec\xdd\xe3\xa7\x0f\xef\x5f\x7f\x7a\x78\xff\x3a\x53\x9e\x64\xfa\x82\xa5\x51\xc7\x6c\x62\xb2\xab\xbb\xaa\x2e\xc2\xd1\x9d\xf9\x74\xe6\x86\x95\x1e\x75\xa1\x92\x93\x75\xb0\xf7\x67\xb7\x84\x4a\xae\x55\xfa\xf0\x39\x09\xf5\xc1\xe9\x09\x05\x0c\x3a\x18\x54\x84\xf5\xef\x09\x15\xa0\xab\x6d\xdd\x39\x04\x8a\x53\x92\xa6\x3c\x39\xee\x4c\xce\xaf\xb5\xa3\x2b\xa7\xfd\xc3\xad\xd6\xb5\xb2\xee\xbc\x7d\x58\x2e\xfa\x43\xca\x87\xe6\xd0\x1c\x9b\x71\x9c\x8f\x87\xac\x7b\xea\x86\xac\x3b\x6e\x62\x65\x26\x32\x5f\xca\xe0\xfd\x3c\xa4\x64\x86\x3e\x53\x51\xb5\xef\x1a\x03\xb1\xc4\xec\x7c\xb4\x3d\xbf\x4c\xde\x25\x09\x78\x7d\x1d\x00\x89\xad\xdb\xed\xfb\x87\xef\xbe\x7f\xb3\xd9\x3e\x44\x72\x93\x1b\xb6\x3e\x73\x07\xd5\x6d\x70\xcc\x0f\x66\xe7\x01\x04\x09\x0f\x63\x68\xa9\x03\x05\xf3\xa5\x09\xcd\x64\x37\xcc\xcc\xfb\x30\x99\x73\x0a\xd3\x3a\x94\x40\x1c\xa6\x30\x09\x6d\x8c\x08\xa7\xaa\x66\x1a\x0d\x92\xb2\x24\x49\xb3\x32\x19\x76\x24\x72\x2e\xad\xfe\xe8\xfd\x2d\x4e\x8a\xf5\xc7\x12\xa8\x35\xf2\x3a\x5c\xea\x26\x6d\x66\x91\xb9\x74\x3a\xfb\xd0\xce\xc8\x2f\x51\x78\x96\xca\x44\xe7\xe7\x1c\x5d\xf9\x66\x56\xa5\x9b\x74\x6d\x3f\x2f\xf1\x1b\x58\xcc\x0d\xc8\x8f\xcd\x6c\x8b\xc1\x2b\x16\xa3\x36\x80\x40\x71\x36\xc7\x30\xe6\xe8\x32\x98\x20\xc2\xc0\xd7\x36\xf2\x3c\x02\x37\xcb\x31\x8c\x8b\x0b\xa9\x22\x76\xc4\x26\x6c\x47\x72\x13\xfd\xd0\x97\x0e\xec\xb3\x3f\xba\xe9\x14\xae\x81\xc2\x86\xfa\xaa\x4e\xf5\xcc\xb8\x02\x75\x13\xd1\xe5\x63\x80\xcd\x72\xe1\x03\x86\x46\x84\x33\xa0\xb9\xa9\x05\xf3\x63\x03\x8a\x70\xf6\x27\x1f\x0e\x00\xf9\x93\x6f\x46\x9f\x5c\xdf\x4f\xc5\xeb\xf1\xfd\xcb\x78\xf4\xf5\x8b\x6c\xf3\xf6\xae\xd1\xf7\xb9\x6b\x46\x1f\x51\x1d\x55\x21\x35\x92\x95\x22\xcb\x3a\x74\xab\xa6\xad\x02\x2e\x94\xdb\x6e\xbf\xf7\xbd\xef\x83\xda\x2f\x5b\xe1\x30\x9f\xd3\x62\xf9\x7d\xf1\x3f\x3a\xce\x55\xa8\x98\x1f\xdc\x2c\xdb\xea\xf5\xee\xc2\xb1\x35\xf4\x59\xb6\x5a\xda\x81\xaa\x59\xce\x6f\xb1\x62\x3c\xb4\x4d\x18\x71\x38\xd9\x33\x0a\x51\xf1\x07\x44\x7e\x8c\x2d\xbc\xcd\x7d\xf9\xd0\xfa\x18\x8b\xf9\xa3\xdc\x83\xca\x5f\x65\xd1\x92\x2c\x1d\x63\xaf\x59\x3f\xdb\xd4\x7b\x2a\xa9\x87\xf7\x71\x5b\x2f\x8f\x1d\x6e\x42\xdf\x84\x7d\x03\xc6\x26\xc0\x2b\x2a\x8d\x86\x7e\x8b\x2f\xad\x0a\x49\x9a\xc8\x8c\x2d\x9f\x65\xee\x40\x1f\x28\xe8\x63\x2e\xef\x23\x86\xc9\x44\xcd\xe5\xbb\xd8\x37\xfd\x89\xb2\xec\xab\xb7\x9b\xbd\x44\x0d\x16\xc1\x6e\x9a\xcf\x49\x65\xfa\xc6\xf8\x76\x0a\x5e\x02\x3d\x1c\x4e\x7a\x1a\x64\x35\x27\xb9\x51\x0e\x3b\x1d\x8e\x3e\x34\x43\xd3\x9a\xb6\x39\x31\xcf\x87\xbe\xe5\xbe\xb1\x00\xae\xf5\x03\x9e\x34\x3b\x93\xd7\xd7\x95\x18\x97\xca\x62\x40\xf2\xdd\x63\x02\xae\x81\x43\xda\x6f\x9a\x80\x21\x6e\x7a\x63\x35\xd0\xa0\x9c\xc7\x8c\x8d\x8d\x6e\x8e\x79\xed\xb9\x78\x3a\x64\x64\x74\xca\x80\x0a\x4c\xa1\xd9\x8f\xfa\xb4\x4f\xd2\xd4\xc5\x7f\x57\x45\xec\xca\xb2\x2a\x5e\xc5\x9b\xb3\x4b\xc0\x2e\x05\x57\x02\xe0\xf5\x1f\x3f\x80\xa1\x58\xd6\xc2\x58\x02\x0c\xa0\x9e\xc2\xa8\x83\x96\x60\x84\x81\x64\xdc\x72\x4b\xed\x66\x28\x40\x1b\x98\xf7\xe1\x14\xbc\x06\x10\x54\xc1\x0e\xe6\x98\xd6\x29\xd4\x96\x59\x13\xd7\xe0\x21\x31\x3b\x99\xc3\x18\x8d\xac\x7e\xf3\xc3\x6d\x31\xdc\xa7\x0e\x31\x65\x7b\xfb\x98\x35\x9e\xb2\xb4\x98\xc5\x86\x85\xd3\x72\xeb\xa5\x8b\xd5\x24\x8c\x0f\x41\x1b\xa0\x86\x50\xa2\x2d\xab\x9b\x06\x34\xde\x07\xe1\xe7\x73\xcc\xd0\x50\x04\x9d\x7f\x4e\xcc\x08\xaa\x95\x6b\x3d\x95\xd7\x9c\xe0\x0f\x5e\x2a\x2a\x6f\x5f\x66\xd0\xb1\xb0\xb0\x7b\xfc\xee\xd7\x20\x6d\xd3\x02\x11\xc7\x10\x38\x3e\xe9\xcc\x56\x14\x55\x45\x53\xb2\xa6\x61\xc1\xba\x4e\x81\x72\xcb\xac\x42\xb6\xf1\xed\x6c\x60\x8d\x7c\xbd\x57\x54\xa6\x65\x38\x35\x47\x61\x2d\x58\x69\x68\xe3\xf5\x5d\xfc\x1b\x49\xb2\x9b\xea\x77\xf6\xb3\x91\x66\x06\xb3\xe6\x22\xfc\x66\x9c\x95\x5b\x6c\x08\x61\xd2\x8d\xd6\xc7\x18\x13\xa1\xce\x04\x95\x93\x65\xb1\x07\xd5\x96\xd8\x68\x7e\x0e\x47\x4e\x29\xab\x9a\x7d\x24\xd7\x4b\xd3\x7d\xa2\x77\x22\xe7\xc9\x2f\x6e\x0c\x3d\x0f\xb1\x06\xf2\xf0\xdd\x4f\x78\xe2\x36\x2d\x76\x13\x28\x70\x7f\xa4\xa0\xc8\x1c\x63\xdc\xd6\x1e\xa3\x30\x36\x39\x77\x08\x5e\x94\xb6\x9c\xf3\x8d\x86\xd5\x25\xe1\xbc\xf4\x25\xca\xd8\x53\xb9\xb5\xab\x0d\x91\xf1\x7d\x74\x54\xbd\xbf\xd9\xd3\x58\x8f\x59\x2f\x63\xbe\xcb\xdf\xae\xd7\xf1\xfd\x8a\x7c\xd9\xb8\xd5\x80\xa0\x26\x20\xac\x1a\x52\xfa\x0a\xa3\x70\x3e\xca\x40\x1b\x50\x2d\x7b\x37\xd7\xbd\x9f\x27\xe0\xe7\x31\xec\xeb\x9a\xf4\x70\x22\x98\x0a\x20\x52\x18\x64\x5a\xf9\x04\xa4\x2d\x28\x77\x32\x47\x37\xad\xdf\x87\xbb\x4c\xe0\x5a\x7d\x56\xa1\x8a\x0d\xb9\xea\x89\xa4\x45\x20\x60\x08\x55\x8e\x7c\x70\x3e\x54\xde\x83\xc9\x03\xb5\x5c\x23\x95\xb8\x1d\xcd\xcb\x88\x25\xba\x7a\xa3\x2b\x92\xe8\xe1\x6d\x36\x1d\xbd\x16\x9b\xa4\x59\xa2\xb5\xac\xc3\x81\x87\x81\x0f\x8b\xe5\x66\x73\x03\xf6\xe1\x90\x80\x54\xc4\x19\x7b\xbc\xde\xc9\x75\xd9\x3e\xab\x0d\x2c\x49\x6e\x09\x1e\x93\x87\xac\x0d\xd3\x66\xbc\x1c\xd2\xb6\x50\x1d\xd7\x95\xe5\xa4\x42\x21\x09\xbd\x03\x74\xbb\xac\xd2\x71\x86\x9f\x93\xd2\x97\xfc\x00\xcc\x7c\x0e\xbd\x06\x08\x74\xf1\x1e\x8e\x31\x3f\x50\x37\xce\xe9\x9f\x6c\x8a\x38\x06\xbf\x84\xb8\x5b\xdd\x2c\x5e\x97\x3b\x25\x6a\xa9\x30\x9c\x45\xda\x04\x68\x48\x4b\x74\xae\xc2\xde\x5f\xbc\x12\xb0\x41\x10\x67\xc4\x87\xfd\x18\xce\x18\x94\xe3\x7a\xff\x58\xe2\x76\x2a\xe7\x31\x6b\xbf\x23\xfb\xbe\x45\x23\xcb\x89\x44\x32\xa0\xfc\x39\x1e\xb9\x92\x4a\xed\x12\x2e\x08\xad\x09\xa9\xeb\x22\x9c\x9a\x89\x9f\xac\x55\x65\x5d\x7a\xd8\x04\x25\x4f\xae\x87\xc7\x66\x6a\xb6\x7c\xf6\x63\xd1\x14\x0e\x10\x32\xfb\x94\xa0\xd9\x22\x58\x14\x35\x6a\xc8\xe7\x84\x31\x9e\x3a\x68\x31\xe0\xe1\x80\x81\x0f\x2e\xd6\x73\xcd\xae\xcb\xf1\xb5\x8f\x57\x7e\xf3\xfe\xb7\xaf\x22\x85\x4b\xf6\xf0\x42\x57\x3d\x6d\xb2\x09\xe3\xaa\x74\x55\x63\x6c\x11\xf4\xea\x1b\x3a\xc0\xc2\x31\xc7\xb3\x0e\xc3\xe2\x1f\xea\x50\x03\x94\x26\xe0\x14\xa0\x9f\x79\xda\x7a\x30\xc6\xeb\x4a\x92\x26\xc6\xbf\x7f\x18\x57\xed\x33\xf4\xed\xbb\x37\x6f\x5f\x83\x3f\x02\x71\xae\xe9\xb7\xf1\x9c\xff\x0c\xd4\x3f\x7c\xf8\xf3\x4f\xe0\x6d\xd6\x2f\xf1\x2e\xb9\x28\xd9\x28\x90\x54\x19\x0a\xb0\xc1\xe2\x6c\x5a\x5e\xb5\x75\x7b\x1e\xc2\xd0\xb5\x60\x98\x4f\xb9\x5e\x1c\xee\xe0\xf4\x69\xd2\x41\x5b\x5c\x57\xa5\x3c\xa1\x70\x70\x42\x60\x07\x4c\x02\xd2\x23\x80\xbb\x3a\x17\x5f\x6b\x16\x6f\xba\x06\xa0\xe6\x69\x68\x00\xca\xc5\x93\xc8\xfa\xa7\x6e\x83\x2f\xe2\xaa\x9f\x1a\xb1\x5b\xfa\xaa\x2d\xfa\xfe\xd9\x53\xb6\x69\x19\x37\x53\x33\x9f\x36\x2c\x85\xf3\xe8\x2f\xc7\xac\x8e\xff\x4f\x06\x33\xbe\xa3\xd9\xe9\xa6\x1b\x9c\xc1\x4d\xfd\x74\xcc\x4e\x3e\x49\xd2\xc4\xa4\xc9\xae\xc9\xd9\x35\xc2\x5e\x37\xcf\x3d\xe5\xc5\xbb\x2b\x4b\xce\x5a\xc9\xfd\x35\x58\x52\xed\x5d\xfd\x63\xbb\x6d\x66\xc8\x9d\x66\x4e\xc8\xf6\xc4\x66\x77\xda\x37\x16\x8e\x7b\x36\x54\x83\xea\x00\xdc\xd0\xa7\x3e\x67\x36\xb4\x56\x50\xca\x18\xc3\x04\x7a\x03\x64\xd8\x23\x64\x18\x62\xc0\x86\xb1\x37\x2d\x70\xc0\x9d\x6c\xd4\xbb\xa0\x9f\xd9\xae\xdf\x1c\x93\xec\xd6\xaf\x5c\xb9\x27\x6e\x1f\x65\xbb\x4b\xae\x1f\x65\xfb\x98\x92\x8d\x7c\xf2\x32\x34\x39\x9c\x39\x96\x87\x56\xed\xf7\x03\xc0\x6a\x36\xcd\xf1\xd0\xd4\x87\x30\xd1\xcd\x71\xd9\xe0\xbe\xb5\xdc\x69\xc7\xf6\xce\x01\x9a\x92\x99\x12\xe2\x39\x65\x57\xad\x16\xb6\x39\xe4\xe2\x9a\xa7\xfd\xfa\xea\xad\x9f\x55\x64\xd6\xd8\x67\x7b\xcf\x5a\xbc\x27\xb0\x09\x49\x5f\x63\xbe\x64\xfc\xf1\x31\xb9\xc1\xb9\x61\xc8\x85\x69\x9c\xb3\x32\x24\xce\x39\x3b\x73\x21\xd2\x36\xd0\xc5\x3b\x67\x29\xfa\xcc\xb7\x28\x37\xb1\x4e\xbb\x44\xfb\x37\x30\xf7\xca\x13\xb7\xac\xac\xec\x06\x6d\x7e\x8c\x3d\xe4\x3f\x03\x8f\xab\x5c\xc0\xb2\x99\xbf\x7f\xb3\xc4\x94\x99\xd9\x43\x67\xb4\xae\x9d\xb0\xcc\x08\x4a\xb0\x6d\x8f\x46\x55\xb5\xe4\x58\xd7\x08\x61\x29\x2b\x42\x4a\x80\x19\xb4\x35\x0d\x5e\x2f\x89\x41\xaa\x90\x6e\x26\x58\xd9\x01\x60\x18\xce\x7d\x59\x69\x87\x82\x0c\x13\x84\x94\x90\x7e\x4f\x5d\x55\xce\x52\x30\x57\x10\x70\x1a\x3f\x27\x08\x94\x87\xaa\x0c\xd3\xe7\x84\x4c\x09\x48\xf1\x67\xba\x39\xc4\xdc\xeb\x9a\x01\x7c\xa9\xdc\x7e\x7c\xf5\xee\x61\x31\x67\xbf\x06\xef\xd2\xb3\x34\x27\x0c\x1b\x88\x6a\x02\x09\x2e\x65\x18\x0d\x80\x72\x5b\x01\x11\x9a\xa7\x71\xea\x4a\x57\x4e\x59\x1f\x4e\xb3\x0c\x52\x02\x9b\x92\x25\xb3\x4b\x92\x4d\x82\x3e\xd3\xac\xcd\x61\xb4\xb7\xbf\x8a\xef\xf2\xb0\x22\x21\xbf\x59\xd6\xd8\xc3\xdb\x57\xf7\x97\xde\x84\x42\x6a\xbd\x07\xe7\xe0\x81\xec\xfd\xe8\xfd\x38\xe6\x70\xb6\x30\x74\x41\xb4\x06\x14\x29\x4f\xb9\x0b\x6d\x50\x17\xdf\xb6\x99\x9c\x0f\xa0\x89\x3a\x41\x74\x2b\x73\x95\xfc\xf1\x97\xce\xf4\x0d\xf9\x7a\xc7\xf0\xbc\x4e\xf4\xfc\x35\x82\x3c\x20\xa9\xa0\x45\xd5\x14\x06\x42\x94\x42\x8a\x63\x5b\x94\xfb\x11\x72\xe2\x53\x2c\x38\x22\x35\x47\xe8\x73\xe2\x1c\x48\x3e\x27\xcb\x63\xdb\x70\x06\x85\xb2\x2d\x2f\xa1\x46\xbe\xc7\x18\xe2\xd2\x88\x2e\x54\x97\xa3\x10\x95\xaf\x98\x09\x2e\x8b\x42\xdf\xc6\x26\xdb\x44\x80\x3e\xce\x7f\xbd\x4d\x70\xc2\x92\x7f\x9f\xfc\xd5\xea\x43\xd6\x52\xe4\x75\xd2\x23\xbf\x27\xca\x88\x08\xcd\xb8\x80\x22\xaf\xcf\xa7\x1b\x1d\xc0\xc7\x4f\x1f\xb7\x71\x51\xe5\x7f\x13\x7c\xf5\xda\xab\x95\x2a\x7d\x09\x30\x1a\x00\xc3\xbe\x96\xcc\xee\x61\x6d\x11\xc0\xc1\x31\xde\xb8\x61\x38\x1c\x5c\x18\x37\xd8\xf9\xbe\xb3\xf0\x14\x8e\xd0\x68\xa5\x6a\x2b\x1c\xd3\x82\xc2\x1f\x05\x67\xb0\x76\xce\x21\xab\xe1\x18\x4e\xd0\x6a\xa9\xeb\x46\x7a\x71\xa8\xc6\x70\xae\x40\x9d\xb5\x8b\xdd\xc9\x2a\x63\x75\xe3\xb8\xa8\xbd\x6b\xf4\xe1\x60\x8d\x6d\xdb\xf4\x80\xc2\xb9\xad\x6b\x4d\xa0\x51\x4d\x55\xda\x06\x94\xf0\xe4\x8a\x12\x8b\xa2\xc4\x18\x4d\x0e\x55\xf1\x45\xd9\x56\xa5\x6d\x41\x05\xcf\x33\xd5\x14\x79\x58\x45\xec\x56\x9a\x34\x19\xdb\xf1\x18\xb3\xff\x9d\xb8\x22\x5f\x00\xcf\xbf\xff\x0a\xb7\x93\x95\xde\xcf\x2e\x55\xf3\x29\x2d\xe7\x2e\x65\x80\xf8\x58\x40\xaa\xe6\x29\x55\xb3\xf3\xb9\xbe\x1c\xa9\x51\x56\x1a\xad\x8d\xb4\xca\xb0\xf8\x1e\x3a\x9d\x76\x3a\xe6\x23\xff\xf8\x4e\xdb\xe7\xdb\x17\x9c\x0c\x6b\x5d\xf6\xed\x4d\x1c\x71\x7d\x71\xbb\xfb\xee\xf1\x46\x41\xf1\xf1\xc3\xdb\x48\xb2\x56\x84\x53\xb1\xe4\x0c\x9c\x4b\xca\xe5\x89\x4f\x2c\x1c\x01\x2f\x8b\xb0\xcf\x38\xa8\x1d\xa0\xa1\x5b\x42\x62\xaf\x40\x41\xc3\x68\xf8\xc8\x3b\x3a\x81\x65\x07\x6e\x47\xef\x6d\x41\xb0\xc5\x54\x33\xd2\x70\xc3\xad\xc5\xd4\x7a\x6f\x29\xb6\x0e\x79\x3e\x74\xdc\x30\x6d\x31\x4d\x40\x62\x3e\xe3\x8d\xcc\x8e\x31\x83\x5a\x3f\xef\x55\x42\x26\x52\x82\xac\x1f\xe9\x79\x05\xa5\xc6\xc7\xa2\x10\xae\x9a\xce\x87\xba\x4e\x93\xa0\x6b\xc9\xf6\xa0\x22\x16\x81\xc3\x3c\x51\x7e\x4a\x5d\x67\x2c\x32\x75\x15\x26\x90\x10\x87\x1b\x23\xb5\xf5\x95\xb1\x46\xc4\x6b\xf4\x19\xed\x5c\x4a\x93\xd7\x11\x77\xf8\x65\xe8\xff\x8e\xa9\xf3\xfb\x2f\xcf\xde\x13\x78\x02\x6d\xb4\xc4\xf3\x98\x8e\xcc\xec\xa5\x52\xdd\x89\x4f\x4e\xa9\xcc\x09\x6d\xf9\xdc\x66\xa5\x76\xfe\xa4\x8e\x7d\xbb\x17\xbd\xd5\x1c\x18\xc2\x84\x5c\x0c\xaa\xb7\x82\xb9\x08\xe7\x23\x4a\xf3\xe5\xa9\x51\x33\x6a\x99\xd2\xdc\x32\xce\x75\x92\x24\xbf\x4c\x38\x90\xbb\x26\x37\xc9\xaf\x9f\xd5\x56\xff\x79\x64\xe2\xfb\x5f\x93\xff\x3d\xf9\x3f\x92\xff\x33\xf9\xbf\x6e\xd9\xd8\x7a\x9f\x1e\x5f\xbd\xc9\xde\x5f\x89\x0d\x7f\x78\x7c\x75\x3f\xe9\xb7\xee\xaf\xa8\x38\x1b\x07\xde\xbe\xd2\x70\xfe\xfe\xe5\xbf\x92\xef\xde\x3f\xff\x2b\x77\xf0\xba\xef\xef\xf8\x0d\xef\x8f\x53\x4a\x91\x2a\xca\x61\x84\x52\x36\xf5\xa0\x5b\x89\xb1\x71\x8d\xe2\x65\x3d\x82\xd2\x2c\xc9\xf9\x34\x4d\x93\x99\xa6\xd3\x29\x9c\x5a\x29\x27\x19\xba\xe5\x7b\xaa\xd6\xff\x71\xaa\x25\x37\x75\xa7\x29\xe3\xda\xb8\x46\xf2\xb2\x52\x0c\x2b\xc4\x9e\x1a\x0c\x55\x8d\x37\x86\x40\x55\x13\x67\x20\xd4\xe8\x42\x71\xad\xea\x65\xc3\x62\x85\x37\x9d\x6b\x09\x84\x1c\x29\xdd\x0a\xe0\xaa\xe0\xa5\x46\xa1\xef\x21\xc4\x18\xb4\x42\x28\x3e\x8f\x42\x7b\xaf\x45\x0a\x79\x38\x48\x29\x43\xaf\x94\x6a\x8d\x5f\xff\x2f\xe9\x04\x30\x75\xdb\x4e\x28\x1c\xba\x1a\x22\x18\x0e\xc6\x13\x67\x6b\x6d\x89\xd5\x50\x59\x62\x15\x82\x9d\xc6\x4e\x5f\x8f\x07\x4b\x7c\x92\xfc\x61\xa2\x3e\xe3\x5d\x93\x95\x77\x78\xc0\xff\x2c\xf9\xd7\xc9\x7f\x91\xfc\x97\xff\x4f\xda\x91\x6f\x7e\xa2\x1d\xf9\xfb\xff\xad\x01\xda\x44\x61\x4e\x12\x86\xc5\x1b\x99\x2f\xda\x91\xfb\xae\x03\xa8\x0f\x55\xfc\x71\x02\x62\x15\xf0\xa4\xa1\x07\x3e\x48\x1b\x0c\x30\xb1\x82\xd0\x34\xc3\x00\x68\x1f\x92\xf8\x23\x3d\x22\xa4\x49\xa0\x44\x6b\xad\x09\xe8\xc9\x89\x52\x1a\x15\x23\x87\xdb\x0b\xc6\xbc\x78\x21\xf2\xdf\xda\xcf\x64\x67\x33\xfb\xfb\x62\x21\xb3\xaf\xb0\x90\xe0\xb0\x64\x28\xc7\x50\xa7\x66\x36\x19\xbe\xec\xfd\xe5\x90\xa1\x59\xa7\x36\x54\x45\xec\x3c\x58\x30\x3d\xb9\xdb\x51\x06\x85\x50\x2c\x40\x66\x8c\x31\x0c\x8c\xab\xf4\x6e\x38\x33\xc6\xa2\x3f\xfc\xff\xa2\x57\xf9\xf1\xd3\xee\x59\x1b\xf0\x5d\xb6\xd7\x44\xfb\xd9\xb5\x02\x55\xa2\x46\xa9\x50\x88\x08\x32\x1f\x0d\x44\x8a\x40\x1e\x95\xdb\xfd\xe7\xe4\x78\xf4\x76\xd5\xab\x04\xf5\x38\x9e\x7e\x56\xae\x12\xb9\xaf\xe5\x2a\xab\xda\x11\xec\xe0\x2a\x57\xb9\xf8\xc7\xf4\xb8\xa9\xa3\xf6\xc9\x33\xc6\xec\x27\x2b\xe1\x79\x4e\xfa\x77\xaf\x08\x01\x1a\x13\x6b\x63\x3c\xb4\xc0\x06\x3d\xea\xcb\xd1\x1c\x22\xd6\xaf\x01\x22\x88\x7e\x9a\x80\x1c\xe7\x21\xfe\xc8\x09\x21\x02\x05\x0b\x95\x64\x6d\xcb\xa4\x82\x40\xa3\x01\x42\xd8\x21\x84\x92\xed\x55\xef\x1a\xc7\xf8\xf1\x31\xf9\x4f\xa2\x3a\xf1\x4d\x47\xe4\x36\x7e\xf2\xcc\x87\xf2\x92\x4e\x01\xbc\xff\x10\xcd\xf2\xeb\xab\x0a\xfe\xfa\x5a\x9c\xc5\x7f\x7c\xb3\xbb\xfb\xf5\x2a\x57\x78\xfd\xd3\x4d\xe1\xac\xdd\x24\x6e\xae\xd3\xe3\xcc\x80\x68\x02\x4d\x5b\x26\x41\x15\x1a\xc6\x10\xac\x6a\x84\x42\x03\x7c\x8b\xd1\x19\x78\xcc\x9a\x86\x71\x08\x4b\x42\x5b\x58\x1a\x2e\xea\xaa\xc2\x94\x89\x72\x20\xe8\x0c\x1a\xc2\x36\x7d\x90\xf3\x21\x70\x06\x3a\x70\x4e\xcf\xc1\x80\xc4\x04\x0a\xa9\x32\xcb\x6a\xa6\xa4\xb0\x45\x05\xe7\x33\xc5\x58\x19\x4e\x0b\xdd\x13\x52\xe8\xb2\x35\xaa\xea\xe2\x91\x2d\x4a\x53\x4a\x82\xa5\xe6\xbc\x48\xfe\x20\x91\x9f\xe9\xf6\xa5\x3e\xec\xbf\x48\xfe\xc3\xaa\x02\xfe\x0c\x44\xbf\x5a\xd7\x87\x77\x0f\x37\xeb\xfa\xee\x27\xaa\xf9\xef\xff\xdf\x47\x68\xea\xe4\x8e\xc7\x71\x9c\x26\x77\x3e\x8f\xe3\xa9\x61\xec\xc8\xc3\x7e\xf9\xde\x9d\x6a\xe8\x51\x75\x0e\x03\x65\xc6\x32\x25\xa8\x2e\xca\xf1\x04\x05\x6d\x52\xc2\x59\xe4\x30\x44\xe1\x64\xcc\x3a\x47\x1d\x4e\xdb\xb1\x69\x6c\x3b\x97\x8d\x5d\x2c\x80\x6d\xd2\x53\x1b\xea\xae\xeb\x42\xdd\xb6\x6d\x3a\x52\x8c\x98\xb0\x83\x2c\x6b\xbf\x84\x75\xb0\xc6\xa5\x51\xfb\xf9\x7c\x39\xf0\x28\xd9\xe9\xd7\xb0\xee\xaa\xbf\xb8\x31\x51\x2f\xef\xf7\xc7\x41\x7f\xad\x97\xe7\x01\x5c\xfd\xf5\xf2\xe9\x70\xd8\xaf\xd3\x49\x13\xa8\xc2\xd8\x58\x0b\x6a\x13\x44\xfc\x11\x27\xc4\xd5\x8c\xb4\x3b\x1c\x9c\x4e\x0f\x2a\xfc\xdf\xa4\xbd\x4d\x90\xe4\xb8\x7e\x27\x46\x90\xf9\xc1\xa7\xa7\x5d\xb1\xa7\xa7\xa7\x19\xab\x7d\x12\x4a\x35\x3d\x0d\xad\x24\x0b\x9e\x52\x75\x21\xf6\x79\x15\xb0\xe4\xf0\x42\xb6\xa4\xc5\xca\xde\x0d\xc4\x46\x58\x01\xed\xda\x61\xf8\xe0\x30\x4e\x0e\x1c\x71\xc4\x11\x47\x1e\x79\xe4\x91\x47\x1e\x79\xe4\x31\x8f\x79\xe4\x31\x8f\x79\xcc\x37\x5d\x44\x39\x08\x66\x56\x65\xf5\xcc\x7b\xab\x5d\x77\x0d\xf3\x8b\x59\x53\xfc\x00\xfe\xf8\xfd\xbf\x7e\x3f\x75\xa5\x97\x97\xcf\xf7\x66\x45\x23\x76\x7a\x1f\xab\xa0\x17\x1e\x97\x7f\xfd\x63\xfd\x42\x70\x6e\xff\x59\xc8\x3c\xff\xf1\xb6\x56\x83\xba\x9a\x6d\x27\xe0\x8f\x2d\x50\x41\x66\x83\x9f\x94\xef\x53\x3a\xf5\x2d\x70\x3e\x66\x02\xce\x93\xce\x07\x0e\xda\x38\xdf\x4c\xbb\xdf\x03\xb5\x9b\x86\xf8\xb4\xc1\x8c\x45\x31\xc4\xa7\xe4\x60\xcc\xa1\x53\x02\x63\x4d\x03\xa6\xa6\xef\x0d\x05\xbb\x68\x55\xa3\x1d\x4b\x13\x93\xb5\xd1\x07\xfe\xbd\xe4\x97\x2f\xe7\x70\x0d\xd3\x7e\x2d\x50\x7b\xff\x23\xa0\xe6\xe6\x8b\x3b\x03\xb5\x9d\x91\xc2\x18\x55\x0a\xc3\x5b\xf5\x94\xbc\x40\x35\x07\xf8\x02\xd5\x1a\x7d\x62\x61\x74\x74\xe0\x9a\xed\x23\x52\x8b\xb2\xe7\x18\x1b\xc2\xb4\x64\xa2\xc0\xd0\x10\x3e\xbf\x5f\x3e\xe5\xc8\xd1\xda\x72\x83\x99\xc1\x38\x49\x36\x89\x78\x22\xdb\x6a\x3d\x63\xa7\x17\x4d\xf8\xe4\xed\xcd\xa7\x87\xbb\xcd\x33\x8c\xbc\x59\xba\x73\xd6\xff\x05\x6b\x84\x03\x27\x8e\x1b\x44\x57\x24\xa8\x06\x14\x2a\x34\xfb\xa9\xdd\x85\x9d\xd8\xf9\xb0\x03\x0a\xf4\x51\x7b\x25\x95\x53\x3d\x2f\x20\xf5\xe3\x90\x91\xa9\x4e\x65\xa0\x45\xfc\x5c\x83\xe1\xf3\x70\x79\xb5\x6a\x19\xe7\xcc\x51\x62\xb4\x6d\xa5\xa1\xa2\x56\xca\x88\x90\x70\xd7\x34\x8e\xa7\x89\x08\xfb\x79\x41\x39\xf2\x85\x5b\x72\x5e\xdf\xd8\x6a\x58\xa9\xeb\x31\xfe\x8f\x51\x83\xbe\x8c\xf1\x16\xb4\x35\x18\xce\x4d\x31\x55\x50\x75\xd4\x17\x99\x17\x64\xbe\x1b\x47\x60\x8f\x93\x8f\x4f\xab\x5c\x4a\xc7\xa7\xbd\x70\xe3\xe8\x44\x8a\xf8\x72\x1c\xf3\xc3\xf3\x71\x6c\xd5\x0a\xff\xd7\xf6\x1c\x80\x3d\x18\xab\xd8\x6f\x40\xa7\x3e\x2b\x1f\x0f\xcb\x3a\xdb\xa6\x3c\x40\x14\xc3\x87\x1c\x34\x8f\xf9\xe5\x55\x36\x28\x65\xf8\xb4\xe3\xbe\x69\x3c\x4f\x31\x0f\x3b\x29\x65\xd8\xcd\x87\xb3\x4e\xc4\x13\xdf\xb6\x6b\x73\xad\xe6\xb0\x1c\xcb\x77\x97\xdb\xfb\x52\xdb\xf1\xcd\x7a\xfb\xdd\xc7\x7f\xf4\x31\xee\x6b\xd0\xda\x3a\xe0\x31\x68\xb6\x6f\xc2\x2e\x45\x46\x56\x94\x65\x5d\xe0\x0d\x60\xa2\xf6\x01\xa5\x33\x96\xc6\x8f\xbb\x3a\x9e\x40\x93\x8a\x80\xca\x58\x49\x2f\xc1\xf0\x79\x7f\x79\x95\x59\x29\xb1\xa9\x95\xa5\xcc\x71\x83\x05\x75\x0c\xd7\x90\x2a\x11\x0a\x3e\x7b\x1a\x1c\x1c\x45\x18\x39\xe7\x4f\x49\xc4\x0e\x49\xf5\x44\xb6\x12\xec\x9f\xf9\x09\x16\x76\x82\x6f\x3f\xac\xde\x6f\xbf\xfd\xb0\x3e\xbf\x8e\x25\xb7\xdc\x3d\x25\xe1\xa8\x01\xf9\x3c\x02\x74\x54\x4f\x49\x38\xa4\x12\x85\x5d\xe4\x9e\x4c\x15\xa8\x01\x94\xe1\x18\x34\xd8\xf3\x4a\x28\x25\x98\xb0\x9a\x8d\x56\xf2\x8a\x31\xa6\x5c\xd4\x1a\xfd\x59\x7a\x7a\x22\x5b\x1b\x79\x35\xff\xe8\xac\xd0\xf4\x37\x2f\x8a\x5d\xcf\xf4\x9a\xf3\xfa\xf0\x7e\x7b\x51\x2f\x7e\xc1\x00\x71\x7d\x89\xd8\xfb\xb2\xef\x61\x21\x25\x5b\xf6\xbc\xbd\xe2\x36\x7d\x45\x92\xbb\xfd\xf8\x69\x6b\xfd\x63\xe5\xc1\xa1\x84\x35\x2a\xa1\x2e\x00\x76\xfb\xbd\x54\xd3\x49\x8b\x71\x54\x65\xc9\x48\x48\x40\x53\x3b\xd7\x0c\x23\x51\xc2\x39\x8f\x33\xf7\x68\x7c\xaa\xa6\xea\xb2\x81\xfd\xd0\x91\xbe\x0f\x3d\x6f\xf6\xb4\xdb\x24\x7b\x29\xf7\x51\x82\xb2\x2e\x89\xe2\xca\xc9\xae\x93\x4e\x71\x04\x39\x2f\x94\x50\x02\x6a\x8c\x4c\x91\x6b\x25\x02\x9a\x24\x38\xd0\x13\x0f\x27\xbe\xc3\xd4\x0a\xa4\x14\xc3\x16\x46\xee\xe2\xdd\x13\xdb\x0e\x1b\xff\x6c\xbf\xff\x26\xf9\x5f\x92\xff\x14\x19\x35\xdf\xdd\xbc\x89\x01\x80\x85\x19\xe0\x27\x89\xd8\x97\x32\xbb\xa5\xba\xe8\xc2\x22\x33\x7f\xed\xed\xc2\xcb\x1e\x49\xef\x5f\x79\x30\x5f\xf6\x32\x2e\x57\xc7\x3f\x62\xcd\x4c\x89\x0c\x31\x65\x51\x15\xd0\xc1\xa2\xeb\xaa\xaa\xaa\xfa\x50\x1a\x88\x88\x2d\x21\x51\x4e\xa6\x39\xf4\xb0\xd4\x91\x49\x15\x53\x6a\x30\x01\x1d\xe3\x9a\x8a\x90\x78\x48\x2d\xca\x6d\x2e\x76\x95\xe8\x0d\x44\x8e\x6c\x12\x1b\xca\x1e\x14\x50\xab\xaa\xdb\x41\x4a\x29\x41\x4c\x68\x6d\x8c\xd6\x06\xa7\x94\x62\x39\xed\xc0\x01\x21\x42\xa7\x31\xe8\x19\xb2\xec\xd3\x51\x21\xca\xa7\x51\xeb\xa3\x31\xa3\x0e\x23\x53\x42\xc9\xdc\xb6\xa2\xae\xf1\x53\x02\x0b\x28\x91\x67\x84\x81\x12\xf6\x0e\x2d\xba\xb1\xbb\x27\x1a\x31\xdb\x9f\x3d\x6b\x6c\xcc\xd7\x2d\xf6\x6e\xc4\x82\x87\xff\xdc\x75\x4b\xe3\x55\x03\xf7\xb7\xef\xe6\x8b\x36\xc3\x97\xad\x7f\x44\x82\xb8\x12\x9a\xf9\x61\x87\xa8\xe5\xc4\xf6\xf3\x49\xef\xa6\x93\x83\x10\x7b\x84\x0a\xee\x44\x56\xc4\x2b\xb1\x21\x7e\x3a\x1d\x4e\xc8\xe8\xd0\x00\x08\x28\x36\x46\x49\xee\xbc\xdb\xc7\x1f\x99\x69\x46\xe4\x63\x93\xd5\x82\x05\x11\x6a\x0e\x3a\x70\xcc\x92\xc7\x7e\xbf\x0f\x75\xdc\x66\x5b\xf7\xf3\x74\x9c\xd7\x91\x8d\x4e\xde\x9e\x7b\x11\x17\xa6\x84\x7f\x9f\xfc\x87\xe4\xef\x93\xff\xf8\xeb\x39\x43\x97\xe2\x82\xfb\x33\xf7\x46\xd4\x8e\x8c\x49\x9f\xf7\xcf\x5c\x82\xbf\xe9\x0a\x5c\x48\xfc\xe3\x40\x59\x15\x1e\x08\x3f\x2f\x9d\x3e\x34\xf3\x2a\x83\x33\x2d\x78\x5d\x0a\x59\x06\xfd\x1c\x07\x1b\x83\x7a\x81\x56\xa3\x85\xa6\x28\x15\x86\x87\xfd\xc2\xdc\xbf\x33\x25\x14\x0e\xd0\xf9\x5d\xbf\x51\x94\x31\x27\x84\x10\xee\x29\xf9\xa1\xe3\xc2\x96\x24\x2b\xd3\x7c\x27\xc2\x41\x08\xe0\xa7\xd3\x23\x5c\x1f\xe2\xbb\x03\x14\xb0\x64\x84\x29\xa9\xb8\x12\x8a\x81\x13\x84\xca\x59\x29\x3b\xce\x7b\x31\x5f\x9f\xfa\x89\x6c\xfb\xa8\xbd\xbb\xac\x06\x9f\xce\x4c\x67\x22\xf9\x7f\x92\xff\xf7\x25\x0a\x78\x31\xc1\x0b\xfb\xe8\x43\x6c\xbe\x7f\x77\xde\xc0\xdd\x45\x0f\x7d\xb3\xa4\x39\x3e\x3d\x7c\x58\x92\x01\x57\xe9\xc0\xec\xf6\xdd\xdd\x35\x27\xf8\x87\x73\x73\xd9\x7a\xd1\xf6\x3d\x37\x75\x9c\xbb\xcb\x36\xe9\x1e\x68\x84\x2d\x47\x3b\x8e\x2d\x42\x80\x4c\x63\x59\x07\x65\xcb\x69\x97\x46\xc6\xa5\x61\x08\x8d\xe1\x1c\xa1\xa2\x1d\x11\x57\x65\x91\xe1\x82\xc1\x32\xd7\x39\xb2\x15\x01\x5c\x2b\xf5\xb8\x67\xaa\x67\x7d\x7a\x6c\x2b\xe9\xda\x20\x3c\x03\x27\xe9\x06\x50\xf0\x50\xef\x77\xe1\x24\xc6\x56\x31\x4c\x34\xc8\x89\xb6\x8e\x07\x9e\xaf\xf7\x8c\x21\x21\x85\x44\x9c\x1a\x3e\xf9\x54\xcf\xa6\x65\xfe\x01\x43\x6d\xf6\x79\xa1\x05\x75\x05\x38\x06\x9c\xe7\x75\x53\xe6\x06\x19\x8a\x78\x5a\x86\x1a\x24\x75\xb0\xdc\x71\xc5\x05\x57\x52\x31\x8e\xb5\x77\x8a\xa0\x9a\x28\x45\x3c\x64\x84\x62\x24\x06\x29\x08\x97\xc5\x32\x2e\x8f\x4f\x74\x3b\x6c\xea\x33\x17\xf2\x9f\x26\xf7\xc9\x5f\x24\xff\x53\xbc\xee\x7f\x9f\xfc\xef\xd7\xcc\xc8\x6f\xbe\x60\x46\xde\x9e\x3b\x94\x5f\x7a\xb3\xde\xdc\xbc\xf9\xb4\xc4\x6b\x1e\xee\x8a\xaf\xee\xbe\x7f\x78\x9f\xde\xfe\xc1\xc7\xef\xae\xc8\xfb\xe3\x73\x76\x4d\xde\xb2\xb4\x27\x40\x4a\xc0\xce\x3f\x36\x1e\x1c\x20\xc4\xb6\x6e\x65\x07\x76\xad\x17\x55\xd3\xab\x26\xd6\x70\xa5\xc7\x88\xa3\x6b\x70\xfc\x7c\x3c\x82\x3d\xc5\x0a\xd1\xa3\x87\x39\x2a\x34\x74\x02\x91\xc7\xda\xef\x51\x5b\x31\x30\xf8\x23\xec\x6a\xd6\x72\xa2\x30\x17\x82\x28\x2c\x52\xc8\xb0\x42\x6c\x53\x53\x71\xd0\x0e\x24\xb0\xdc\x31\x45\x04\x63\x98\x6a\x4e\xb8\x66\x88\x1a\xce\x8d\x30\xd3\x11\x1c\xd0\xd4\xb1\x48\x16\x1d\xba\x70\xdc\xc1\xd0\xe9\x0e\xf4\x53\x2f\x34\x27\x2c\xad\x9e\x5f\x30\x41\x05\xef\xe2\x23\x89\x8f\x49\xb2\x4d\x17\x4d\x5e\x7b\xe6\x42\xf9\xbb\xe7\xb9\xfd\x53\xbd\xfa\x3f\xa1\x31\x3f\x23\xf3\x0f\xd7\x11\xe3\x2f\xf5\xeb\x1e\xe2\x42\x18\xb9\x0a\x9f\x45\x7c\xcf\x01\xef\x3d\x28\x23\x53\x30\x0c\x63\x64\x0a\x3e\xa4\x48\x7b\xe3\xb5\xf6\x93\xb0\x1a\x24\xc6\x3c\x46\x11\xbd\xba\xee\x3a\x2b\x25\xa5\x8e\x69\xd9\x88\x76\xe8\xba\x61\xd5\xf8\x30\x78\xbf\xb4\xb9\x86\x61\x93\xcf\x58\xd8\x0b\x21\x65\x18\xba\xae\xeb\x5c\xed\x5c\x5d\xd7\xad\x73\xce\x5a\x67\x0b\xab\xad\x12\x81\x00\x5f\x5b\xd3\x1d\xac\xb3\x36\xd0\x09\x53\x96\xee\xc3\xc9\x2e\x35\xaa\xeb\x64\x48\xd9\xd6\xae\xdd\xb9\x6b\xeb\xb9\xa7\xfd\x9c\xec\xbd\x26\x0e\xbe\xe6\xb4\xfa\xb2\x89\xf3\xe3\xed\xfa\xd3\xc3\xcd\x7b\xd0\xfb\x12\x02\x12\xf2\x34\x99\xf4\x00\x05\x50\x21\x8a\xf4\xa6\x0a\xe8\xa2\x30\x08\x01\xd3\x97\x10\xa0\xc0\x81\x0f\xda\x86\xd9\x7b\x11\x20\xa7\x6d\x5a\xc0\xf2\x29\xc1\x6b\x07\x31\x0c\x83\x08\xbb\xb4\x27\xe1\xa4\x42\x21\x41\x0f\x0b\x4e\x98\x26\xd8\x08\x6d\xad\x16\x46\x29\x4c\x54\xd4\xb6\xf0\x4f\x34\xf6\x1c\xff\x2c\x79\x1f\xbb\x93\x70\xd4\xb6\xa0\xc9\xff\x10\x6d\xd2\xdf\x27\xff\xe9\x9a\x8f\x03\xdc\x15\x2f\x21\xd3\xaf\x5e\xbf\x3b\x77\x2b\xbd\xcf\x96\x46\xab\xcb\xe3\xc3\xf9\x3c\xb7\xcf\x92\x60\x17\x0b\x74\x6e\x6f\xbd\x8d\x39\xb4\x95\xd7\x05\x54\x18\x9a\xe0\xc3\xd1\x42\x41\x05\xc6\x44\x6a\x2d\xb2\x52\xe7\x82\x4b\x4c\xe0\x3c\x80\x5b\x95\x23\x09\xc3\x5e\x11\x85\x1e\x0f\xaa\x40\x1a\x01\xa1\x0b\x2c\x51\xec\x0a\x9f\x9d\xd1\x62\xbe\x60\x56\xa9\x90\x67\x47\xdd\x76\x20\x21\x61\x3c\x85\x43\x70\x04\xf0\x43\xeb\x34\x28\x4d\x5b\xc9\xf5\x9e\x60\xca\x85\x01\x79\x90\x7b\x57\x6b\xab\x1a\x27\x2d\xb0\xe0\x18\xfc\xae\x3b\x98\xd6\x35\x56\xcd\xef\x8b\xb2\xab\x49\x65\x61\xe8\x49\xe5\x60\x6f\xa9\xd7\x65\x65\xb1\xa3\x4a\x2a\x19\x6a\xe5\x43\xab\x5b\xcd\x90\xc3\xda\x17\x3e\x17\xba\x31\x4b\xc8\x37\xd9\xae\x8a\xc8\xff\x41\xaf\xbc\xa9\x7f\xbd\x70\x84\xc5\x58\xc3\xcd\x6b\x6a\xd2\x57\x25\x08\xcf\x3e\xe0\xc3\xcd\xbc\x8c\xcf\x4b\xdb\x85\x51\xfc\xc2\x4c\x7a\xfb\xf5\xfb\xdb\x77\x77\x2b\x9c\x95\x87\x7d\xe8\x20\xb0\xb5\x16\x92\xd0\x50\x41\xdb\xe1\xdc\x97\x18\x85\xe3\xc8\x10\xe2\x56\x0e\xa0\x2c\x8b\x30\xee\x8f\xa0\x17\x3b\x21\x76\x42\xf3\x50\x01\x42\xa8\xf1\x87\xc3\x86\x1a\x1d\xb4\x30\x42\x48\x46\xc3\x48\x61\x89\x34\xf6\x18\x11\x09\x4a\x58\x6a\xa6\x0d\xc2\xc0\x6b\xad\x75\x18\x23\x48\x98\x5a\x82\xf3\x3d\x4f\x56\x59\xfd\xd4\x6e\xfa\x6c\x38\xf3\xc6\xfc\x8b\xb3\xa6\xda\xaf\x59\xa2\xbf\x5c\xa1\x95\xce\xcb\xb6\x84\x16\x15\xc3\x7e\x9e\x79\x87\xe9\xe0\x90\x70\x00\xb7\xf3\xbf\xac\x87\x04\x13\x02\x19\xd3\x4e\x5a\xe9\x94\x4c\x05\x91\x6d\xed\xdc\x68\xed\x21\xd6\x73\xfc\x2c\x11\xa9\xd9\x56\x1b\x97\xfc\xd3\x68\xcf\x7f\x11\x39\x7f\xcf\xaa\x84\xe0\x66\xc9\x4b\x45\x73\xf3\x70\xbb\xbe\xb9\xbf\xdd\x9c\x87\xe5\x59\x61\xed\x6c\x67\x66\x00\xfe\xaa\x2f\x3d\xa2\xf7\x8f\x0f\xb7\xf7\x17\xae\xf2\xe5\x27\x72\x87\xde\xdf\x6e\x53\x03\xf2\x22\xb7\x39\xc0\xea\xb1\x3a\xa0\x3d\x20\x20\x1f\x8b\xe9\xa0\xed\x51\x1c\x56\x0d\xb0\xc1\x7e\xde\x1b\xc2\x1c\x65\x7c\x58\xd5\x60\xef\xa9\x8e\xb4\xc0\xa8\x0f\xb5\x0b\x1e\x41\x08\xaa\xd0\xa4\xe3\x53\x12\x3b\x45\xc8\xa4\x67\xdf\x76\x77\x80\x1b\x06\x61\x89\x5a\xad\x19\x63\x68\xa0\xad\x51\x46\x1a\x4b\x19\x9b\x0e\xa0\x22\xd8\x2a\x6f\x82\x91\x2c\x8f\x34\x56\xa1\x64\x4c\x30\x49\x66\x18\x43\x24\x51\xa0\x22\xa1\x22\x67\x6d\xfb\xfe\x89\x9e\x7b\x08\x3e\x25\x7f\x91\xfc\x6f\x11\x53\xbc\x04\xaa\x36\x57\x5a\xf0\x91\xd2\xeb\xc3\x6b\xdd\xa4\xeb\x5d\x6f\xcf\x89\xac\xa5\x7c\xe3\xcb\xaf\x3d\x93\x82\x7d\x78\xfb\xc5\x9e\xcb\x8e\x95\xa1\x48\x15\x79\xdb\x23\x25\xb8\x28\x0d\xb3\x44\x08\x04\xad\x35\x8c\xc3\xd4\x60\xa8\x8a\xa6\x83\x5f\xee\xa3\x0c\x0e\xde\x7f\xde\xad\xf0\xe7\xc3\xaa\x9c\x2a\x8c\x54\xd9\xf6\x48\x0b\x21\x4a\xc5\x1c\xe1\x04\x53\xeb\x0c\xe7\x30\x75\x58\x15\x75\x07\xe3\x2e\x3d\xef\x92\xcc\x38\xcb\x59\xb1\x1a\xb4\xc7\x08\x91\x52\x0b\x03\x0b\x63\xf7\xa8\xd1\x05\x65\x28\x1c\x75\x01\x29\x31\x1e\x33\xfc\xb2\xaf\xb2\x97\x7d\x25\x07\xbb\xd3\x8e\xb8\x2c\x71\xd3\xe8\x2a\x2c\x48\x11\xbf\x65\xcd\x80\x2a\x5d\xe4\x0e\x85\xa3\x29\x4a\x41\xc2\x1e\x73\x7c\xd9\xd7\xa3\x4a\x16\x0e\x85\x83\x2e\x4a\x19\xb9\xc2\xfc\x13\x8b\x3c\x2d\xbf\x93\xfc\x7e\xf2\x67\x67\xc6\xfc\xff\xf5\xc7\x6a\xce\xe0\x47\xeb\xe2\xb9\x8a\xf5\x7a\x48\x9e\xf1\xc3\xd9\x82\x66\xdf\xbc\x9f\xef\xcf\x76\x91\x25\x9f\x41\xdc\xb6\x7e\x4c\xbc\xb5\x69\x19\x95\xa7\x42\xd2\xfb\x61\xa8\x03\x6c\xfb\xb4\x3c\x7a\x4a\x99\x64\x14\x32\x8e\x8e\x86\x94\xb6\xc4\xd3\xe9\xdc\xc7\x45\x19\x66\xb8\x70\x18\xe1\x32\x9c\x42\x0f\x39\x45\x64\x3d\x56\x53\x15\x92\xa0\x38\x70\xe0\x98\xee\x08\xc6\x8c\x87\xc1\x18\x17\x83\x46\xb3\x81\x75\x8f\xb5\x12\xd0\x43\x91\x11\xd7\xf4\x78\x57\xe7\xc1\x98\x2a\xf4\xc6\xe4\xd6\xa0\xb6\xc8\x2d\x23\x3e\x2f\xa4\x8c\x63\xd1\x3c\xf1\xf5\x7c\x1d\xfe\x28\xf9\xd3\xe4\xcf\xe3\xaa\x92\x7c\x11\xbd\x8f\xb6\xf0\x2a\x3a\x76\x0e\x40\x5c\x59\xbe\x67\x32\xdf\x97\x5e\xbd\xfb\xa5\x57\xaf\x45\xd8\x50\x2c\x08\x74\x10\x75\x87\x5d\x18\x73\x40\x9f\x12\xab\xa4\xb1\x3c\x9c\xe4\x91\x86\x11\xd0\x22\x1c\xf7\x07\xe0\x70\x0f\x5a\x46\x28\x29\x04\xc3\x05\x03\x0a\xa2\x18\xea\xe3\xeb\x9a\x51\x26\xb5\xd2\x44\x30\xa7\xa6\x82\x12\xa7\x8c\xae\x74\xaf\xac\xa8\x9c\x49\x8f\x91\x8b\x73\x5e\x82\x54\x2b\x24\xd1\x0c\xaa\x50\xf0\xd9\xdf\x3d\x3c\x91\x98\xd3\x9b\xad\xcf\x77\x51\x0f\xe1\x6f\x93\xbf\x4b\xfe\xfd\x4f\x7b\x38\xdb\x4b\x77\xea\xd9\xd1\xb9\x7f\x73\xb3\xfd\xcd\x3e\xdd\x2b\x7b\x09\xee\xde\xdc\xae\xa0\x05\x85\x9d\xc1\x80\x0d\xc7\xa8\x18\xec\x15\x35\x44\x01\x96\x9e\x38\xf7\xb0\xc2\x93\x2f\x66\xb7\xb7\x44\x16\x97\x5d\x3f\x1b\xd2\x21\xe4\x8b\x1f\x83\x16\xd5\x10\x65\xed\xc6\xf8\xaa\xb2\xf1\xdf\x41\x2a\xa6\x65\xf1\x99\x4a\xe1\xc4\x0a\xf2\xf2\xe2\xdb\x1a\xa5\x94\x56\x75\xda\x20\xa8\x7c\x63\xcc\x4e\xa9\xbd\x4e\xfd\x67\x3b\x8f\xed\x36\xea\x94\xdb\xe4\xb7\xce\x4a\x34\xdf\x27\x7f\x95\xfc\xc3\x75\x75\x52\x94\xd4\xbc\xff\x29\x02\xe0\x19\x44\x9c\xf5\x1f\xe7\x2d\x06\x47\xbe\x8e\xb5\x9a\xd7\x3d\x6e\x1f\x2e\x8c\xb2\xe7\x5a\x82\x8f\x0f\x8b\x58\x67\x36\xd8\x12\x66\xe6\x11\x63\xaa\x1b\x5b\x69\x6d\xcd\x0c\xc9\x2c\xe7\xfe\xb3\xc8\x2a\x6b\x9f\x12\xe7\xc2\xc9\x98\x83\x85\x00\x9d\xc2\x81\x02\x29\x87\xa2\xe4\x44\x10\x02\x91\x69\xc0\x09\x14\x95\xf7\x4d\x53\x85\x03\x92\x16\xa2\x26\x1c\x37\x16\x11\xec\x28\x11\x7e\xb2\x6d\x24\x3d\xae\xeb\xaa\x72\xad\x03\x24\x2e\x45\x0d\xe2\x9a\x06\x51\x99\x1e\x30\x08\x11\xd6\x18\x61\xc4\x3b\xad\xf5\xfc\xe7\x0e\x07\x73\x2c\x95\x8c\xbd\x5b\xe6\x49\xac\x97\xfe\x8e\x7f\x11\xbb\x1e\x97\x83\x9e\x81\xd3\xf6\x47\xe2\x1f\x6f\x6f\xef\xef\x3e\x3e\x5c\x83\xc3\x6c\x57\x17\xe5\xf8\x94\xc8\x7d\x68\x0a\x00\x99\xa2\x02\x4a\x56\x96\x0d\xeb\xe5\xb1\x74\x23\xd6\xe1\x50\x43\x7c\x11\xbb\xdd\x18\x48\xc9\xe4\x1a\x57\x05\x59\x23\x8f\xc8\x31\xec\x2b\xdb\x82\xd6\x49\x96\x1a\x1e\x5a\x1b\x9c\x59\xfa\x31\x9b\x27\x7e\xc6\xea\x0b\xb2\xfb\xf1\xf8\xbc\xbd\xbf\x7b\x21\x52\xbd\x64\xd5\x66\x04\xbb\x40\xef\x18\x99\xba\x5b\x48\x99\x9e\x29\x6f\x57\x49\x44\xe1\x91\x05\xa2\xf2\xe3\x58\x01\x1e\x9b\x1f\xc5\xbe\xd6\xda\x1d\x83\x74\x22\xcd\xab\x69\xa8\x3b\x66\x2d\xb1\x2e\x10\x50\x85\x76\x4c\xc9\x34\xcc\xdb\xc6\x58\xe7\xfc\x3c\x08\x7d\xf0\x5a\xbb\xca\x57\x42\x29\x27\xf1\x94\x08\x91\x32\x66\x30\x2d\x29\x77\xd5\x44\x7d\x90\x55\x92\x24\xe9\x8a\x25\x3c\xe6\x2b\x96\x1e\xfa\x97\xdc\xc0\xed\x97\xb4\x69\xcf\x3f\x77\x67\xc6\xbf\x48\x15\xbb\x32\x00\x56\x11\xf9\x4b\x43\xbb\xd0\x44\x56\x2d\x11\x9a\x2a\x66\x53\x47\x00\x43\xd3\x51\x03\xf8\xfc\xb2\x25\x79\x18\xd0\x7a\xac\x2a\xe7\x5d\x67\x9c\xb1\xb6\xef\xad\x35\xce\x74\xce\x07\x6c\x89\x48\xd6\x99\x78\xa2\x5b\xb6\x92\x57\x6c\xc2\x57\xac\xa2\xaf\xf5\x7f\x2f\x4a\x41\xcf\x82\x27\x35\x10\x3e\xa6\x75\x7b\x1f\x76\x3e\x1c\x3d\xa8\x43\x63\xf7\x7b\xa0\x0e\x93\x89\x31\x89\x1a\xe0\x6c\xef\x5c\xb0\x2a\xe4\x32\x1c\x40\xa9\xd2\x44\x19\xef\xfd\xa4\xcf\x7c\x11\xc3\x13\x5b\xd3\x8d\x4d\xf2\x88\x7e\x6e\x23\xeb\xd3\xdd\x19\xaa\xbf\x9f\xff\xf8\xf5\x22\xf2\x70\x17\xb5\x4b\x5f\x58\x44\xf7\x07\x6e\x29\xdd\x4d\x15\x06\xa7\x9e\x29\x8c\x21\x23\xa8\x75\xe3\x08\x10\x85\x1a\x92\xb0\x37\x18\x59\xba\xae\xbc\x50\xd6\xd7\xd3\x7e\x1a\x34\x2f\xaa\x92\xa5\xd0\x81\x32\x40\xe3\x98\xb3\x38\x0a\x84\x27\xeb\x95\x4c\x70\xe4\x96\xf8\xaf\xcd\x25\x39\x80\x7d\x4c\x85\xa3\xb0\x5f\x34\xb8\x1b\x20\xc2\x6e\x46\xf5\xae\x69\x00\x69\x02\x8c\x4f\x2f\xb9\xa4\xfd\xfe\x2a\x97\x44\x96\x5c\xd2\x26\xf1\x69\xfb\x05\xb7\xcf\x9f\xff\x97\xe5\xf0\xcf\xfd\xed\x17\x51\x9f\x4f\xf7\x6f\xbe\xad\xae\x53\xf5\xb3\x77\x11\x53\xf0\xf3\xf1\xb9\x7a\xbf\x07\x62\x98\xc6\xf8\x94\x0d\xfc\x14\xba\x94\x0e\xee\x98\x37\xca\x03\x1d\x93\x46\x34\x08\x62\xb4\x36\x04\x34\x74\xc4\x18\xef\x28\xa5\xe0\x64\x48\xde\xda\x79\x01\x3a\x0e\xa2\xdf\x01\x93\x27\xeb\x44\x3d\xb1\x6d\xbb\x16\x67\xef\xeb\x6f\x92\x7f\xfb\x85\x3f\x7d\xfe\x89\x21\xf9\xf3\x89\x7c\xf3\x87\x60\x7b\x03\xcf\x5c\x9d\xdb\x6f\xde\xbf\xb9\xb9\xbf\x30\xe3\x2d\x3f\xeb\xfb\x9b\x5f\x80\x98\x94\xf9\xee\xe3\x4d\xd4\xd0\x57\x80\x78\xe0\x22\xef\x71\x94\x90\xce\x83\xea\x00\xd5\xb5\x0d\x30\x35\x93\x1b\x00\x06\x12\x87\xdd\xa3\xf3\xee\xc0\x00\x33\x15\x95\x7d\x28\xb4\x17\x00\x37\x41\x83\x63\x4c\xf0\x0d\x19\x5f\x58\xc2\xaa\x74\xcf\x49\x28\xdb\x8c\x3e\xf6\xeb\x44\x08\x21\x0c\xb7\xcc\x09\xee\x08\x7d\x4a\x84\x91\x85\xaf\x0d\xf5\xec\x48\x15\x2b\x00\x1c\x29\xb6\x52\x39\x66\x39\xe7\x7c\x60\x61\x8f\x51\xe8\x75\xb2\x4a\x87\x27\xba\xad\x37\x2a\xf9\xdd\xc8\x00\xfd\xc7\x2f\xd9\xea\x6f\x3f\xbc\xdf\xfc\xce\x99\x20\x66\x69\xee\xb9\x7b\x78\xbb\xd9\xbe\xbb\x79\x7b\x17\x15\x0b\x96\x8e\x71\x38\x9a\x3e\x4d\x80\x16\xbe\x29\x40\x15\x64\x01\x64\x1d\x78\x7d\x2a\xca\xa6\x03\x1c\xf9\x3c\x40\x0e\xea\xa3\xf7\xc6\x34\x2b\x12\xda\x90\x07\xa9\x80\x03\x4d\x56\xe6\xd2\xc1\x72\xf4\xdd\xc4\x53\x3c\xf5\x69\xdf\x01\x51\xe4\xed\x54\x4f\x88\x39\x38\x9a\xda\xd4\x75\x02\x52\xf3\xc4\xd6\x7a\xe3\x9e\x6b\xff\x67\x88\x36\x83\x97\xed\x85\xb6\x39\x99\x2d\xfa\xa7\xfb\x73\x5f\x60\xe5\x21\x02\x6a\x97\x1f\x4f\x45\x65\xb5\xd2\x6a\xb0\xa0\xa4\x87\x63\x4e\x30\x33\xd5\xc6\x61\x67\xab\xb0\xc3\xa8\xd2\xc3\xc9\x8d\x6d\x68\xf7\x0a\x60\xd0\x55\x08\x03\xec\xb5\x04\x65\x92\x64\x89\xc9\xca\x6d\xb3\x69\x92\xdf\x3a\xf3\x20\x3e\x7b\x2d\xdf\x2e\x4a\x3c\xb7\x9b\x1f\x75\x6d\x2c\x52\x43\x1f\xee\xde\xdc\xa6\xd0\x53\xe9\x85\xe4\x00\x65\xc8\x95\x38\x55\x15\x36\xbb\x46\x76\x63\x17\x06\x09\x92\x46\x48\x52\x59\x85\x66\xdf\x4f\x1d\x83\xf2\x7e\xd3\x20\x6b\xa6\x16\xb4\x82\xf9\x71\x2c\x19\xb5\x95\x11\xca\x5b\xa5\xb9\x25\x1c\x41\x83\xb1\x30\x92\x29\x5f\x4c\xb3\x3d\xde\x64\x3c\x41\xdb\x6e\xa3\x92\xdb\xe4\xdf\x24\xff\x90\xfc\x1f\xc9\xff\x95\xfc\xdf\xcf\xcc\x49\x17\x34\x13\xc3\x60\xf7\xb7\x2f\x21\x9d\x08\x6c\xce\xcf\xaf\xe5\xb5\xde\x7d\x7d\xf7\xfd\xc3\x95\x38\xc0\x39\xad\x7e\xf3\x66\xf1\x92\x1f\x6e\x96\x80\xc2\xed\xdb\x2b\xc9\xc3\xac\xd3\x90\x19\x6b\x2b\x29\xa1\x12\x04\x41\x27\x0d\xb4\xa3\x2d\x21\x63\xe0\xd4\xab\xb2\x14\x0c\xca\x82\x98\xa6\xd9\xb5\x88\xe6\xb9\xc8\x89\x12\xa4\x84\x8a\x8b\x42\x05\x9c\xe9\x7d\x6d\xa5\x6f\x44\xf0\xac\xee\x59\x5d\x8d\x8b\x58\xcf\x79\xdb\xc8\x52\x18\xa3\xa4\xb2\x58\x62\x48\xfb\x5a\x29\x2a\x95\x44\x50\x88\x5e\x22\xc8\x84\x86\x44\x4a\x2d\x95\xc2\x45\x4e\x4a\x85\x31\x75\xb5\x12\x4c\x85\xc3\xa4\x09\xd7\x92\x0a\x21\x89\x45\x0c\x0c\xfc\xc4\x4e\x4b\x4e\x32\x23\x09\x8a\xb6\x12\x25\x7f\x93\xfc\xbb\xa8\x20\xba\xd4\xdd\xbe\xba\x1a\xbf\x00\xdf\xff\xe8\x5a\xdc\xdf\xdd\xdf\x9c\x3d\xac\xeb\xeb\xf6\xe9\xcb\x8b\x0c\xce\x33\x65\x7d\xf7\xf5\xb6\x58\x7f\xfc\x73\x70\xff\xfd\xe2\x43\xac\xdb\xc2\x60\x68\x20\x33\x5d\x37\x3a\x52\xca\x9c\x68\x4a\x68\xd1\x32\x57\xe8\x61\x6a\x4a\x8d\x4b\x93\x17\xcc\x6a\x6d\x38\x46\x50\x72\x42\x0a\xc3\x44\x6e\x8f\xe9\xbe\x9a\x0e\x1e\x70\x97\x07\x22\x8e\x4d\xde\xf7\xb5\xac\xda\xb5\x66\xb0\xaa\x4a\xe3\x9c\x51\xc6\x92\x52\x40\x43\x30\x6d\x0e\x42\xd2\xda\x28\x0a\x7d\x05\x29\xf6\x7e\xde\x09\xa1\x14\x98\x1e\x46\x21\x69\x65\xd4\xb4\x0b\x05\xd0\xc1\x81\xd3\xae\xcd\xc3\xa8\x34\xae\x4c\xc3\x84\x56\xf1\x1a\xe5\x19\x8e\x1c\x91\x22\xf9\x79\xf2\x3e\x72\x67\xbc\x28\x8e\x45\xc3\x7d\x7b\x1f\xc7\xf9\xd5\x6b\xf0\x12\x63\x9d\x87\xe0\xaf\x21\x3e\xfc\xb4\xbe\xbf\x79\xb7\x5e\x88\x0f\x57\x4d\xe8\xc1\xe0\xb4\x11\x6d\xea\x43\x0f\x76\x5e\x48\x51\x4d\x75\xc3\xb9\x48\xb9\xe4\x9c\x8b\xd0\x98\x72\x07\x1d\x2c\x63\x89\xc0\x39\x68\x08\xf4\x23\x2b\x4b\xd1\x80\x2a\xec\xe3\x72\x85\xd6\x65\xe7\x26\xef\x39\x11\x52\xcf\xaf\x1c\xc3\x52\x80\x5c\x4a\x8c\x14\xc6\x12\xa3\xd0\x31\x44\x31\x21\x4e\x5a\x69\xb4\x05\x47\x58\xe8\xb6\x92\x72\x94\xd2\x68\x9d\x24\xdb\x0c\xc5\xf5\x93\x5f\x71\x83\xbf\x8f\x18\xf2\x99\x1f\xec\x4b\x65\xfd\xfb\xcb\xaa\x70\x15\x35\xfd\x36\x3b\x66\xf0\x71\xf4\x69\x12\x92\xd3\x45\x4c\xbf\x02\x43\x20\xae\xeb\x42\x1f\x2c\xe8\x3d\xd8\x07\x74\x6c\x44\x5d\xfb\xf6\x24\x01\xdc\xf0\xa8\x9a\xdf\x85\x4a\x5b\x13\xbc\x76\xd3\xc9\x71\xee\x8a\x19\x56\xab\xb0\x03\xb2\xd3\xda\x26\x79\xb6\xf0\x2d\xdb\x67\x7e\xc9\x45\x05\xe2\xbf\xbf\x8e\xf9\xfc\xba\xcb\x0d\xce\xdb\xaf\x53\x83\x58\x69\x07\xf1\x21\x92\xf5\x02\x18\x86\x67\xb6\x72\xfa\xe8\x61\xc9\x3b\xa0\x96\x04\xcd\xbc\xa5\x8e\xcf\xb3\x69\x92\x96\x50\xc7\x81\x26\xa5\x2b\x31\x50\x04\xba\x12\x6f\x0c\x92\x0b\x39\xa5\x5b\x7e\x52\x09\xa1\x3b\x9c\xac\x0d\xe7\xad\xae\x5a\xda\x36\x08\xed\x3c\x6b\xac\x6b\x70\xeb\x90\xab\x71\xe3\x92\x64\x95\xa1\x33\x9f\xf4\xa2\xa9\xf3\x57\xbf\x51\x53\x27\xd6\x3d\x5d\x87\xaf\xaf\x34\x75\x5e\xc9\x9b\x2c\x74\x0d\xd9\x1e\xc8\x33\xd6\x7b\x2c\x40\x1d\x6a\xe1\x7d\x5d\xfb\x72\x38\xe2\xd6\x83\x53\xe3\xdb\x76\x37\xed\x87\x26\x94\xd9\x10\xf6\x54\x95\x3e\xe7\x9d\x63\x3d\x0e\x03\x3f\xa1\x6e\x93\x6b\xed\x94\x73\x2a\x54\x52\x5a\x59\x6a\x84\x5c\xa1\x9d\x10\xc6\x1a\x63\x43\xef\x06\x42\x38\xae\x38\x15\xa7\xd0\x71\x47\xf6\xd1\x36\x8b\x84\x44\xbd\x88\xdf\x3d\xeb\x15\xff\xcb\x45\x2f\x74\xfd\x22\x88\xf4\xee\xe6\xfe\xb9\x0c\x65\xfd\x11\x82\xef\x3e\xde\xce\x0b\xed\xfd\x4f\x88\x60\x9d\x07\xdd\x66\xcf\x42\x55\x40\x70\x3a\xe9\x56\x71\x3a\x59\xa5\x1b\x13\x4e\xc0\xc2\x22\xf4\x18\x54\xa0\xa0\xa8\xc5\xb4\x00\x32\xd4\xa9\x17\x02\x63\xc8\x51\x39\xe9\x0a\x24\xa0\x0b\xcc\x76\xdd\xc6\x58\x4c\x88\x91\xc2\x60\x32\xf6\xd4\x30\x65\x30\x29\x5c\xc0\x84\x52\xd2\x8b\xa7\x64\xda\x73\x9e\xdb\x9c\x02\x3b\xed\xd3\x76\x1f\x7a\xad\x16\x7b\xe0\x12\xf4\x05\xae\xbb\xe8\x90\x7c\xe1\x5e\x5e\x68\x8b\x2f\x59\x86\xec\x0b\xa4\x79\x9d\x10\xcb\xfa\x9d\xdf\xfb\x61\xd8\x07\x03\xf8\xe3\x00\x78\x90\xc7\x1d\x90\xfb\x7d\xdd\xf7\x40\xf4\xd3\x21\x3e\x05\x22\xf5\x89\xee\xc0\xd0\xd6\xac\xa9\x23\x19\xab\x77\xb5\x33\x53\x9d\x4a\xe3\xea\xba\x9e\x22\xdf\x7f\xab\x94\x0a\x27\x25\xb9\x27\x04\xd3\x4a\xe0\x24\x49\xb2\x0c\x27\x68\x2b\x36\x36\xf9\x3a\xa1\x31\x32\xf0\xfe\x47\x3c\xe0\x1f\x3f\x6d\xef\xde\xdd\x7d\xfa\x57\xe0\xee\xdd\xd7\xb3\x59\x9f\x3f\xfb\xa9\x6f\x3d\x2c\xca\x1e\x5f\x7e\x37\x0e\xb1\x15\x76\x05\x4c\x77\xc2\x50\x0d\x2b\x02\xe1\x24\x28\xd5\x2d\x72\x75\xee\x72\xe3\xc2\x81\x38\x5e\x94\x69\xad\x3c\x55\xa5\x23\x14\x4d\x46\x31\x51\xeb\x1a\x8f\xec\xe0\x4c\xee\x72\xef\xc2\x8e\x85\x81\x8c\x74\xbf\xb1\x08\xc3\xe9\xd4\x95\xb6\x30\x80\x50\x2c\xcc\xe0\x21\xf4\x1e\xc2\xea\x29\x99\xdd\x84\x72\x1a\x87\xd2\x96\x15\x60\x02\x69\xe9\xa0\x2d\xe8\x74\x72\x08\x79\x8f\x66\x7f\x7a\x87\x0d\x54\x71\x9d\x2b\x13\xba\xf5\x1b\x12\xf5\x72\xfe\x59\xf2\xfb\x67\xde\xab\x33\x1b\x61\xb4\xda\xdf\x3f\xbc\xb9\x7d\x1f\x4b\xed\xde\xdc\xbe\xf9\xf4\x70\x7f\xfb\x5c\xb1\xfd\xf5\x95\x5e\xc9\x43\xfa\x31\x43\xa9\xe6\x04\x13\xec\xba\x7d\x49\xb0\x18\xbb\xae\xeb\xa4\xe8\xc0\x28\x05\x81\xa1\x4a\x13\x45\x38\xab\x10\x96\x9e\xcc\xfe\xca\x86\xb8\x47\x54\x98\xb2\x08\xa7\x03\xcc\x7d\xbe\x2a\x8f\xc7\xc9\x81\x64\x52\x79\x71\x02\xfb\xba\x1b\x4f\x55\x05\x03\xae\x86\x1d\x73\x6e\xb0\xd6\x1d\x41\x72\x4c\x56\x99\x4d\xaa\xad\xba\xb2\x73\xaf\x62\xda\x3f\xb2\x6f\x5f\x9d\x93\xed\xbf\x48\xef\xee\x57\x8d\x47\xe4\x54\xe2\x9a\xc0\x31\x1c\x2f\x6e\x3a\x28\x1f\x07\x84\xc5\x0e\xa8\xe3\xf1\x78\xdc\x58\x64\xb4\x56\xd8\x78\xbf\x77\x07\x77\xf0\x59\x47\x89\x07\x49\x4c\x9f\xfb\xc3\xc1\x1d\x0e\xd1\x16\xd1\x38\x66\xde\x46\xee\xd4\x4f\x67\x66\xa2\x17\x26\xf4\x0b\x17\xe5\xd2\x6d\x7d\xb1\xff\x4b\x54\xe1\xed\x35\x87\x94\xf4\x38\xad\x74\x13\xb9\xcf\x29\x2d\xa7\x96\x1b\xb3\x93\x4b\xf5\xff\xc9\x2b\xc9\xb8\xf7\x3b\x71\xb4\xc7\x8e\x20\x03\x49\x9a\x78\x4c\x0d\xd9\x58\x64\x1f\x93\xa0\x8a\xba\x18\x33\x57\x59\x79\x08\xc9\x0c\xf5\x5d\x69\x8c\xd5\x3c\x48\x30\x3c\x25\x95\x1a\x40\x0e\x1a\xa1\x98\x92\x14\x5b\x41\xe3\x3c\x5d\x65\x3c\x19\xce\x5c\x77\x17\x1c\xff\xfe\x0a\xa5\xc6\x52\x98\x57\x2d\x90\xf7\xb7\x6f\xae\xb9\x42\x6b\x55\x14\xbb\x83\xee\x8e\xbb\x70\xe0\x80\xb1\x54\x1f\x62\x02\xac\x7d\xcc\x41\x1b\x2a\xa0\x8e\x91\xae\x2d\xdd\x57\x94\x7a\xbe\x71\xa2\x28\x5b\xe1\xf8\xb8\x77\xae\x1a\x5c\xed\x62\xc5\x61\xed\xea\xd0\x68\xc3\xad\x66\xa8\xd6\xd8\xce\x63\x71\x1f\x73\x31\xf2\x3f\xcf\xc5\x75\x59\xb0\xae\x85\xff\x64\x0d\xc4\x99\x58\x86\x4f\x83\x07\x0a\xc8\x25\x88\x91\x6a\xab\xb4\x32\x53\xa3\x98\xa3\x6a\x23\x03\x7d\xb4\x0b\xa7\x42\x13\xec\x0a\x87\xd1\xfb\x79\xe1\xc9\x5a\xd6\x48\xa9\x8d\x76\xdc\x2d\x1c\x3b\x99\x4a\xaa\x58\x23\xf1\x3b\xc9\x3f\x5f\xf8\xc9\x5e\x2b\x7b\x81\x2b\x31\xaf\xaf\xce\x6f\xe2\xeb\x6c\x04\xbc\x8a\x6c\xcc\xed\xe7\x79\x89\x6f\xd3\xce\x17\x58\x31\x49\x28\xa1\xa6\x99\xe6\x77\x82\x49\x35\xbf\x49\xab\x6c\xff\x88\xfc\xe8\xfd\x98\x9d\xe0\xd0\x58\xeb\xbc\xf6\x5a\x03\x04\x0c\xdc\xb5\x5a\xd9\xdd\xfc\x8e\xcc\xf7\xad\x8b\xeb\x1f\x39\xe3\x8f\x33\x33\xe9\x33\xe7\xd5\x17\x5d\xfd\xab\x3c\x2b\x1e\x8f\x75\x64\x7e\xdf\x07\xd4\x66\x3c\xcc\x68\x48\x55\x41\xce\xeb\xdb\x86\x4c\x15\xd0\x26\xd4\x3a\xd4\x6e\x17\x8b\xda\xdd\x2e\xc9\x32\x18\x39\x03\x4c\xf2\x4f\xce\x33\xeb\x4b\xbe\xab\xdb\x67\xbe\xab\xe5\xdc\x5f\xd8\xae\x5a\xcf\x24\x67\x90\xf3\xb2\x7c\x6c\x53\x72\x2a\x21\x28\x71\x90\x02\x30\x5a\x13\x46\x04\x26\xd8\xd4\xbc\x4d\x95\x73\x1b\xf3\x43\x6f\x78\x51\x95\x90\xac\x5a\x5f\x99\x29\x0f\xa3\xdd\xa7\xf3\xf7\x14\xc1\x5c\x1f\x40\x03\x1f\x7d\xbc\x07\x34\x31\x91\xe7\xe2\x9f\x47\x3c\x93\x5c\x14\xf7\xcf\x33\xea\xeb\xf7\xaf\xf8\xc9\xae\x29\xcc\x96\xb4\xfe\xba\xf6\x95\x52\xd5\x6e\xf0\x4a\xdb\xb2\xc0\x12\xe7\xbe\xd4\xb5\x17\x61\xac\x42\xe7\x40\x81\x9c\xe2\xbd\x6d\x04\x71\x98\x6f\x4c\xd0\x44\x18\xc5\x9d\xd1\x5e\x89\xc0\x51\x9e\x53\x45\x1a\xc1\xd4\x1a\x3f\x1e\x03\x09\xa3\x1a\x01\x31\xac\xd6\x16\xd4\xae\xa1\xad\x8b\xf3\x49\x24\x72\xeb\x36\x3a\xf2\xee\x7c\x7b\xc9\xb1\x5d\x98\x4f\x6e\xce\x82\xb3\x11\xf3\x7e\x7d\x95\x8c\x8d\x7d\x79\x5f\xad\xad\x87\x18\x0c\x1c\x7b\x8a\x42\xcb\xb4\x6a\xc3\x21\x12\xa6\xa5\xd4\xc3\x9d\xf5\xd2\xcb\xa3\xea\x9b\xd0\x6a\x55\x99\x7a\xa3\x91\xb3\x36\xef\x38\x52\xa6\xab\x34\x28\x41\x51\xf7\xa2\x6f\x02\x2f\xfb\x6a\x18\x45\xdb\x1c\x6a\x63\x81\xf0\x22\x0c\xe1\x68\x63\xa3\xdc\x2a\xab\x12\x1e\x39\x0d\xbf\x3e\x63\xc2\x79\xdc\x7c\x29\x0e\xf3\xe6\xe6\xc3\x4f\x7d\xb8\xbe\xd6\x0c\xda\x83\x86\x31\xee\x4a\x4f\x90\xb6\xaa\xaf\xc2\x01\x8c\x60\x60\x4c\x78\x58\x13\xac\x8d\xec\x7c\x18\x82\x91\xc4\x11\x91\xda\x68\x04\x36\xf8\x87\x81\x8b\xd2\x97\x18\x58\xc3\xb5\xef\x52\xe8\xe7\x4f\xe0\x7c\xd6\xde\x70\x39\x7f\xa2\x7c\xcb\x9b\x8a\x37\x3d\xef\x9b\x24\x01\x99\x49\xdc\xb6\xde\xe8\xc8\xe9\xf1\xcc\xc1\xf3\xe6\x92\x7c\x58\xcc\xe8\xc2\xf5\x16\xdd\xa9\x95\xf2\xa4\xaa\x01\x0f\xed\x0c\xe0\x4e\xad\xac\x9b\xda\x1f\x14\x28\x5c\xd8\x01\xb3\x27\xcc\x36\x1b\x88\xab\x19\xaf\xfa\xa7\xc4\xef\x06\xb7\xab\x43\x92\x26\xe1\xd4\xd8\x1d\x28\x3c\x48\x8c\x54\xf3\xd8\xef\xa2\xb6\xe1\xa5\xc6\xf9\x47\xe8\xf2\xa5\xc8\xe1\xcd\x4d\xd6\x81\xca\x83\x36\x70\xa0\x1f\x6b\x20\x83\xca\x54\x15\x60\x5d\x83\x31\xc0\x75\x35\x8e\xfe\xe0\xdc\x61\x3a\x4c\x4a\xca\xb4\x0a\x02\x94\xf3\x79\xa9\x64\xdc\xc2\x8d\x8d\x9d\x8a\x4b\x99\xcf\xdd\x35\xa7\xf9\x85\x6d\xf9\xe8\x39\x68\x08\xdf\x3d\x9e\x52\x1d\x4d\x58\x0b\x84\x24\xa1\x51\xce\x80\x7c\x63\x51\xe5\xb4\x7a\xb4\xfe\xe8\x47\xaf\x94\x53\x72\x97\x24\x69\x76\x3c\x6b\x5c\x2d\x5c\x7e\xef\x6e\xbe\x7a\x1f\xf3\x83\x2f\xd3\xe3\xbc\x4a\xbf\x34\xe3\xde\x64\x77\xbf\xbb\x8c\xcb\x2d\x0f\x4d\x81\x38\xf5\xd2\x31\x52\x96\xb9\x2b\x24\x77\x52\xd7\xbc\x53\xac\xdc\x13\x42\x95\x95\x40\xe5\xbe\xe8\x18\xb2\x88\xae\x89\x0f\xc7\x5d\x33\xe2\xd0\xec\x0f\x5a\x97\x7b\x7f\x72\xda\xb8\x06\x94\xc0\x4e\x90\x32\xe3\x8c\xca\x4e\xb1\x17\x06\x4b\x4d\x8c\x98\xcf\x7d\x9f\xd4\x5b\xbc\x31\xb1\xea\xf3\x85\x0b\xe6\xe6\xfa\x31\x3b\xf9\xb6\xea\xaa\xd0\xee\xfc\x63\x53\x0d\xa1\x5f\xef\x82\x4c\xd9\xd4\x81\x7a\xda\x4d\x1e\xf8\x69\x4c\x71\x90\xa9\x9e\xed\xc2\x3e\x69\xb6\x74\x83\xce\x3a\x71\x09\xb8\x82\x62\x6f\x17\x8d\x85\xdb\x0b\x07\x5e\x76\xca\x98\x30\x42\x43\x2b\x20\xcc\xc3\xbe\x08\x3b\x05\x92\xe2\x08\xb3\xfc\xf1\x14\x0b\x76\x37\x68\x3a\x0e\x65\x55\x4a\x20\x02\xaa\xac\x06\x76\x52\x53\xed\x01\x4d\xce\xf3\xbb\xdf\xca\x4d\xf9\xec\xf5\x25\x60\x69\x77\x89\x23\xe1\xa2\x97\xbd\x19\xaa\xcf\xa7\xae\x7a\x66\xe6\x77\xc1\x6c\xca\xcf\xc4\xfb\xd5\x10\x14\xc8\x27\x7d\x9a\x62\xc8\x28\x49\x33\x1d\xb9\xcd\xe7\xf1\x1d\x57\xb8\xb3\x14\xd3\x2b\x35\xa2\xe7\x41\xfe\xf1\xab\x87\xef\x1f\xb2\xbb\x37\xdb\xcd\x5a\xd6\xb5\x23\x4d\x07\x74\x2e\x14\x61\x25\x63\x65\x99\xef\xeb\x6e\x3e\x99\x43\x18\x19\x29\x2b\xb7\xdb\x55\xe5\x46\xf7\x45\xe9\x60\x11\xaa\xc0\x86\xdc\x17\x12\x14\x13\x04\xe3\x53\xe2\xec\x3c\x90\x40\x71\x2c\x42\x09\x64\x11\xf9\x15\x33\x9f\xa8\x18\xe7\x78\x17\xbd\x90\x67\x06\x95\x77\x37\x57\x34\x57\x7f\x08\xa2\xd2\xfa\x62\x51\x57\x45\xe4\x41\xb1\x21\x57\xa1\x15\xa0\xe4\xb3\x17\x98\x87\x03\x68\xf3\x41\x0c\xce\xf8\x6e\x6d\x40\xf2\x94\x4c\x07\x1f\xdc\xd1\xed\x41\xee\x39\x3b\x1e\x19\x07\x6e\xd2\xed\x60\xc6\xa8\x85\x90\x35\x09\x8a\x73\x3c\x4b\x7e\x76\xe6\x1c\x89\xb1\xef\x73\xc3\x72\xa4\x24\x4f\xd6\x1f\xbf\x5d\x8b\xba\x06\xca\x89\x8a\xdb\x40\x2b\xea\xac\x49\x79\xfd\x94\x4c\x3b\x91\x16\x1b\xfd\x88\xb2\xe2\x10\x8e\x0c\xc0\xb1\x2c\x83\x18\x4d\x3f\x92\xe9\xb4\xb3\xbb\xd8\xef\x99\x75\x89\x8e\x5c\x12\xbf\xfb\xcc\x80\xf3\x4c\xa7\xf0\xe9\x6d\xac\x36\xfe\xb4\x70\x86\x2f\x81\x97\x55\x57\x95\x30\x65\xb9\x6b\x6d\x5b\x74\x96\xd2\x32\x8c\xa1\x25\xc0\x00\x52\x84\x1c\x39\xd5\x76\x92\x38\x2c\x36\x06\x0a\xfe\x98\x87\x0e\x7b\xec\x00\xaa\x4d\x6d\xeb\xfd\x51\x55\x7a\xd8\xcf\xe0\xc1\x24\x49\x02\x56\x30\xe9\xb6\xfc\xb9\x2f\xff\x79\x94\xaf\x55\xd5\xd6\x8f\xbb\xaa\xdd\xc8\x1f\x0e\xab\xf2\xb3\x58\xd5\x9f\x8f\xf3\xf7\xcb\x44\x6d\xdd\xfa\xb0\x30\x09\xbd\x7b\xc5\x4d\xb0\xa2\x19\x0a\x2d\xd0\xc1\x57\x33\xba\x0a\xfd\xfa\xe0\x03\xf6\x93\x4e\xbd\x07\xbb\x04\xac\x9a\xc4\xc6\x38\xcc\xcf\xe2\xdf\x4a\x16\x23\xb9\x6a\x2a\xc0\x0e\x6a\x3c\x54\x1b\x11\xea\xa7\xe4\xe4\x4f\x7d\x24\x8f\x04\x2b\x93\xe8\xcd\x29\x72\x7f\xc6\xab\x1e\x6b\x53\xe7\x75\x75\x23\xea\xba\x3d\xb0\xaa\xf3\x1b\xf3\xab\x13\x68\x18\x65\xd9\xf1\xd1\x10\x12\x6d\x17\x8d\xf3\xf7\x9f\xcf\xbf\xf3\xe9\xfe\xee\xeb\x19\xed\x3e\x0f\xd8\xaf\xde\xdc\xfc\x16\x88\xf1\xd5\xec\x70\xca\xeb\x1c\xb4\xc8\x1a\xc1\x91\x52\x98\x94\xe1\x50\xf4\x3b\x0d\x64\x71\x5c\xa3\xba\x6d\xeb\x49\x05\x61\xca\xa6\x24\xc0\x82\x21\x88\x50\x0e\x16\xd0\x34\x72\x08\x6d\x32\x7b\xae\x75\xfa\x26\x62\xae\xa5\xd2\xe9\x8a\x71\xff\x95\x1a\xe7\x33\xe5\xfe\x99\x36\x36\x36\xdb\x9f\x83\x6a\xf3\xf0\x3d\x23\xc3\xc4\x63\xd0\x73\x55\xd5\x7c\xdf\xf4\x27\x3e\x78\xce\x30\x96\x3b\x2e\x8d\x62\xa1\x0a\x3b\xe0\xc3\x29\xdd\x85\x1d\x68\x1e\x71\x26\x7d\x20\x1e\x20\x9f\x4f\x03\x03\x47\x90\xd7\x95\xf6\xdd\xc6\x42\xae\x0d\x47\xa5\x43\x54\x20\x5b\x12\x84\x11\x54\x8e\x53\x44\xf8\x24\xbc\x31\xde\xc8\x40\x63\xea\xa1\xdf\x05\x84\x6d\xa9\xa9\xd0\x62\xbe\x23\xec\x09\x6d\xdb\x95\x88\x98\xed\x17\xc9\x87\x58\x63\xf4\x97\x67\xd5\xb6\x73\xdc\x08\xdc\xbe\x29\xb6\x0b\x71\xd5\xbb\xe7\xc8\xc4\x73\x7c\xf0\xf6\x95\xd0\xea\x26\x7e\xf1\xfd\xd9\x67\x7e\xf7\xf5\x87\xd9\xc9\x7c\xbe\x2e\xf7\x1f\xbe\x79\xb7\xfd\xb3\x8f\x40\xae\xe1\x0f\x63\x9d\x1d\x1f\x8b\x95\x1e\x9d\xb6\x60\x84\xa5\x2d\x98\x10\x24\x48\xfb\x94\x58\x41\x28\xe6\xa5\x80\x70\x28\xb4\x36\xb6\xef\xf3\xa1\x4f\x85\x29\x04\x97\x98\x52\xa3\x0f\x69\x55\x98\x62\x25\x42\x6b\x54\xe0\x61\x0c\x5d\xa3\x3c\x60\x80\x4d\x04\x22\x0b\x6b\x85\x49\x7a\x9a\x76\xa0\x0b\x34\x25\x13\x61\xac\x30\x39\xac\x47\x17\xbf\x44\x47\x1d\x7a\x45\xcb\x71\x47\x29\xe5\x82\x50\x27\x44\x35\x36\x75\x5f\x8c\xe7\x3e\x6c\x97\xba\x6d\xb3\x71\xc9\xb7\xc9\xdf\x2e\xaa\x66\x5f\x06\x99\x9f\xe9\x22\x2e\x2a\x33\x37\x2f\xdf\xb9\xf8\x76\x5f\x7f\x29\x8c\x1c\x8b\xb1\xee\x81\x2e\xa1\x57\xc4\x63\xeb\xc7\xf1\xd8\x08\x4e\x8c\x17\x12\x86\x51\x9c\xca\xa7\x04\xf8\x94\x51\xaf\x89\xc7\xf5\x92\x5c\xd1\xe1\xc0\x0d\xce\x4d\x2e\x7b\x27\x4c\x19\x46\x79\x2a\x7b\xa0\xd6\x94\x12\xd4\x0f\xc8\xf5\xbd\xf3\xae\xc5\x54\x09\xce\x41\x12\x06\xa5\xd9\xc1\x79\x8b\x86\x1e\xd9\xae\x73\xde\x55\xb4\x94\xd0\x73\x26\xfa\x70\x10\x9a\x0c\xce\xc7\x58\x08\xd8\x3d\x91\xad\x5f\xb7\xcf\x91\x90\x4f\xc9\x9f\x27\xff\x63\xf2\xd7\xbf\x21\x16\xf7\x5c\x50\xb0\x04\x3f\xc1\xd9\xc3\x38\xd7\x40\x3d\x87\x8b\xdf\x6f\x56\xeb\x8f\x7f\x0c\xde\xc7\x46\x89\x15\x57\x45\x71\x9c\xcd\x7d\x09\x44\x58\xe8\xed\x67\x1c\x64\x1f\xf7\x1e\x63\xd6\x80\xe6\x59\x55\xf0\x10\x6a\x09\xb1\x27\x84\xb5\x2b\xe1\x1f\x0f\x1e\xec\x3c\x0a\x5d\xf0\x0c\x08\x00\x47\x40\x41\x21\xc2\x29\xec\xd7\xad\x80\x65\x6c\x34\x30\x42\x73\xc5\x0d\x06\x07\x02\x8d\x37\x42\xf4\x9c\x77\x3c\xb5\x82\xb2\x49\x83\x03\x85\xc6\x4d\x34\x70\x80\xe7\x61\x3f\x94\xc3\x11\x3b\xd4\x21\xae\x6d\x6c\x85\x4f\x36\x31\x57\x56\xaf\xbb\xe4\x4f\x62\x75\xdd\x2f\xa3\xee\x77\x02\x96\xd4\xd8\x72\x36\xaf\xf3\x60\xf7\x3f\x4e\xa4\x5d\x68\x97\xc1\x77\x1f\x6f\x36\xdb\xf5\xfb\x4d\x32\x9f\xfc\x3a\x9e\xfc\xba\x1b\x41\x2e\x6a\x57\x3d\x1e\x2b\x5b\x49\xc0\xeb\xa0\xc0\x31\x26\x8a\x4f\x20\xaf\x81\x8c\x90\x2f\x06\xba\x92\xc7\x7c\x51\xc7\x09\x75\xca\x94\x08\x51\x11\xa7\xc2\xc1\x07\xce\x41\x05\x18\x48\x80\x01\x9c\x86\x2a\xd4\xe9\xa0\x49\x8d\x59\x88\x0c\x07\x40\x50\xe2\xb4\x72\xc2\x89\x28\xf5\x6b\x85\x13\x0e\x28\x11\x06\x11\x2a\xca\x18\xed\xe0\x18\x4e\xc4\xa3\x3d\x94\xd6\xf9\xd8\x47\xb4\x01\xf2\xa9\xdc\x56\xeb\x26\xf9\x98\xfc\x71\xf2\xdf\x26\x0f\x71\xc6\xc7\x6a\xb7\xbb\xed\xd2\x06\x7b\xfb\xc5\x35\xb8\xd4\x11\xde\xdf\x9c\xa5\xa0\xd6\x5f\x6f\x6f\xee\xb3\x78\xce\xef\x97\x14\x5a\xa4\x63\x4e\x31\x18\xf3\xa2\x2a\xc1\x38\x8e\xbd\x03\x8c\x7b\x55\x4f\xba\x62\x9c\xef\xdd\x1e\x50\x58\x4e\x7d\x6a\x60\x20\xa9\xc8\x0b\xe0\x02\xc7\x60\xe4\x0c\x87\x0a\x8b\x7d\x95\x4f\x9c\xa7\xea\x08\xf2\x03\x3d\x9d\xd6\x39\xe7\xf5\xd1\x1d\x1c\xa9\x11\x89\x09\xdd\x1e\x30\x54\x58\x66\x1d\x22\x4e\x11\xac\x8e\x05\x97\xc1\x51\xce\xd8\x2e\x94\xc8\x96\x8d\x30\x7e\x39\x3f\x90\x8a\xf4\xb4\x35\x1b\x11\x57\xed\xf5\x92\xe8\xba\xc6\xc9\xf7\x37\x2b\x17\x0c\x49\x31\xe8\xd9\xe1\x14\xe5\x41\x4f\x9f\x2b\xb0\x9f\x76\x29\x5e\x5b\xe8\x30\xb5\x08\x0e\xbe\x73\xae\xf3\xb1\x66\xa0\xca\xba\x2d\x5a\x9f\xa2\x8d\x7c\xe6\x75\x5d\x55\xa9\x9f\x74\x74\xa3\xd7\xa7\xa9\x77\x91\xa0\x18\x24\x87\x4c\x64\x87\x18\x77\x89\xdd\x43\xd7\x9a\x8e\xeb\x8f\x6f\xbe\xcd\x04\x0f\xa7\x70\xa8\x3b\x4c\x66\xdf\xa9\x84\xbb\x70\x14\x80\x6d\xac\x65\x28\x18\xc4\x39\x27\xfd\x48\x19\x91\x54\xa4\xb2\x8c\x7d\x80\x45\x8c\x99\x9f\x79\x0a\x2f\xc3\xef\xcd\xb9\xae\xf0\xcd\x79\x50\xae\x6f\xde\xdd\x64\xa4\x02\xae\x06\x3e\xe8\x89\x86\xe3\x6a\xf8\xa1\x9e\x27\x56\x05\x8a\x14\xce\x78\x6f\x63\xc7\x71\xf4\x31\xa2\xe4\x7d\x9a\xf8\xae\xf3\x0b\x37\x58\xd6\x3f\xed\xb6\x7e\x03\xcf\x6c\x9e\xdf\xbc\xbf\x52\xb2\x88\x9a\x3b\x35\x85\x40\x54\x53\x57\x01\x8b\x70\xe8\xb2\xdd\x23\xde\x40\xdf\x4c\x3d\x68\x03\x4d\xb9\x37\x3f\x98\x2a\x49\xb2\x44\x65\x24\x62\xb5\x75\xf2\xf3\xc8\x60\x71\xd5\x31\xb5\x7e\xc5\xb1\xb7\xc8\xc4\xa7\xa3\x0e\xa7\xe0\x14\x10\x19\x07\x08\x48\x31\x2f\x76\x13\x5d\x91\xdc\x56\x88\x97\x12\x53\x92\x87\x42\x04\x22\x80\x96\x4f\xc9\xc6\x88\xc1\x79\xd5\xb6\x72\x46\x32\xa1\x6f\xf3\x2a\xa7\x36\x1c\x98\xc7\x91\x33\x3c\x03\xed\x13\xd9\xba\xb5\x7e\xc6\x8a\x97\xd3\x58\x46\xee\x99\x20\x22\x5b\x96\xde\x55\x54\x92\xd9\xd5\x8f\xa7\x1a\x34\xb0\x9c\x58\xba\x87\x55\x99\xca\xc9\x96\x50\xd7\xf9\x84\x45\x6a\x01\x04\xc9\xc9\x8c\x61\x9f\xd9\x49\xa4\xc5\x34\xa6\x9d\x90\x55\x0d\x6d\x25\x45\x38\x4c\x25\xab\xe0\xc9\xb5\xa6\x69\x92\x2c\x39\x66\xf9\xd6\x6d\xe6\x75\x74\xe1\x46\x5f\x2a\x25\xae\x38\x22\xbe\x7d\xe6\x88\xb8\x7b\x73\x9b\xea\xba\x06\x8d\x69\x1a\x33\xd1\xcc\xb8\x6e\x38\xb2\x30\x8e\xfd\x81\x0f\x95\x95\x13\xaa\xeb\x8d\x78\xdc\xa5\xcc\x2b\xdb\x39\x77\xa8\x05\xae\xa8\x31\xc4\x23\x2e\x2d\x28\x27\x96\xfc\x53\x60\x9f\xf0\xb6\x5e\xf7\x67\x2d\xb9\x3f\x4e\xbe\x4f\xc8\xb9\x36\xee\xaf\x63\xfd\xea\x7f\x48\xe4\x82\x4b\x2e\x11\xa1\x7f\x0a\xae\x38\x0e\xef\xb6\xef\x6e\xee\xd7\xef\x6e\xee\xaf\x2d\xf8\x8f\x92\x2a\x1f\x2e\xe5\x66\x37\xd7\xe9\xd2\xeb\x46\xb8\x55\x5b\xc1\x34\x99\x92\xcc\x3c\xba\x8c\x15\x54\x96\xb8\xa4\x65\x51\xe4\x8f\xdd\x41\xa4\x7a\xf2\xa9\x7e\xe4\x9a\x50\x8b\x91\x1e\x00\x55\x88\x6b\x99\x3a\x5c\xe8\x02\x85\x23\x29\x4c\x8e\x01\xc6\x85\x29\xd0\xa4\x57\xd5\x67\x65\x33\xf7\x68\x2e\x1b\xc8\x59\x18\x43\xcf\x40\x95\x42\x80\x01\x26\x61\x1f\xc6\x75\x8f\x71\x68\x30\xc7\x7b\x99\x9b\x1c\x8a\x94\x73\x42\x2c\xc6\x00\x52\xad\xa6\x06\xd4\x84\xe8\x31\x60\x22\xa3\x06\x28\x85\x8c\x16\x8c\x41\x3e\x7b\x23\x90\xb3\x3e\xe4\x40\x90\x8e\xb4\xa4\x55\x0c\x5a\x88\x21\xb6\x14\x26\x49\xf2\xdb\x89\x7a\x82\xdb\x2a\x4b\x5e\xe5\xce\x7e\xf7\xac\xac\x3b\xdb\xc8\xe4\xed\x55\x2c\xeb\xcd\x59\x59\xe6\xfa\xfd\x2b\x0d\xe3\xab\xd7\x6d\x96\x4c\x89\x9f\xfd\xee\xcb\x96\x1e\x9e\x13\x6c\x97\xed\x71\x14\x6d\x5f\x36\xa0\xf6\x5a\x6a\x9b\xf6\xcb\xbb\xbe\xf5\xca\x35\x59\x32\x71\x30\x8a\x70\xe4\x4f\x09\x03\xc7\x89\x83\x03\x0f\x47\x11\x4e\x6c\x27\x2d\x75\x44\x52\xae\x05\x55\xd2\x50\x87\xe3\x6b\x92\x24\x9b\x54\x3d\xd1\x98\xbb\x99\xad\xfb\xd2\x57\xf8\xef\x2e\x7e\xf7\xdb\xf7\x69\xf6\x55\xcc\x31\xcd\x73\x32\x3b\xfb\xdd\x4b\x4d\xe9\xa2\x33\x7b\xe9\x5d\x9f\xbd\x82\xfb\xbb\xaf\xdf\x2f\x06\x0c\x2c\x55\x49\xb1\xc7\x3d\xbb\x7d\x77\xb7\x7d\x77\x77\x9f\xbd\xbb\xbb\xdf\xfa\xa7\xa4\x28\x28\xb2\xcc\x42\x98\x17\xb6\x9c\xcd\x97\x76\xb4\xd6\xa4\x98\x4e\x8d\x75\x05\xc9\x95\x60\x70\xdc\x39\x96\x7a\x97\xbb\x18\x28\x0e\x9d\x08\x0a\x74\xc6\x18\xcd\x39\xef\x7b\xbe\xf6\x7e\xaa\xf0\x1e\x40\x1c\x70\xd8\x3d\x25\x4a\x95\xe1\x54\x03\xd2\x2b\xeb\x0e\xc0\xa4\x6c\x6a\x42\x19\xec\x0c\x07\x68\xa8\xad\x16\xa0\x74\xfb\x94\x05\x0a\xdc\xc1\xe8\x03\xe5\x94\xb1\x1f\x3a\xb7\x2a\x5d\x17\x4c\x4a\x3b\xd5\xb6\x61\x1c\x86\xe4\xe7\x49\x93\x2d\x35\x96\xcb\x7d\xbd\x20\x9e\x65\xe5\xfb\xeb\xab\x7a\xab\xdb\x97\x1a\xab\x0f\xcf\xad\xfc\x2f\x2a\xce\xe0\xfe\xe6\xdd\xab\xe9\xb1\xd4\x12\xdc\x5d\x43\xbd\xfb\x15\x06\x2c\xf2\x6c\xb8\xd0\xd9\x61\x00\x7c\x98\x8a\xd3\xe9\x74\x7c\xdc\x47\x09\xe5\xb4\x9c\x22\xd8\x59\x79\x3e\x1f\x30\x68\x18\xd6\x88\x4d\x5e\x62\xa2\x58\x6b\xc5\xb9\x6b\xd0\xf1\x0d\x61\x2c\xb4\x3c\xca\x40\x5b\x3b\x2f\xe8\x36\x3d\xec\x45\xd8\xcb\x30\x0a\xd1\x21\x2c\x08\xa2\x52\x33\xad\x20\x76\x8c\x73\x69\x70\x49\x91\xa6\x94\x25\x91\x2b\xe6\x1a\xd7\x5f\xc6\xf3\x9f\xc4\x2e\xd3\xff\xf9\xb9\xc7\xf4\x8c\xef\xe3\xc8\xbe\xee\x0b\xfb\x35\x78\xff\x37\xe2\xfc\x05\xd8\x5f\xeb\x15\xbe\x80\xfc\xfd\x3c\xea\xcd\x31\xfe\xcb\xe0\xa8\x8c\x7a\x01\xfc\x8f\xf9\x4f\x60\xfd\xd5\xb1\x30\xc5\x64\x14\xe3\x52\x00\x12\x2f\xd1\x19\xec\xef\x26\x0b\x06\x7a\xa0\x47\x06\x58\x38\x84\xbe\x96\x6e\x86\xf4\xaf\x70\xff\xaf\xc1\xfb\x5d\x44\xf8\xc1\x50\x45\x04\x65\x4c\x50\xce\x92\x9f\x03\xf7\x44\xb7\xd5\xba\x7d\xce\x09\x7e\x7f\xce\x73\xfe\x45\xc2\x22\xfa\x7f\xff\x6b\x04\x10\x5f\x90\x70\xdc\xae\xec\xe8\xdb\x2f\xec\xe5\xef\x83\xcd\xfa\xe3\xa7\xc5\x5e\x66\xad\x2e\x40\x51\x14\x15\x2c\x80\x0f\x2a\x56\x04\x98\xe0\x40\xf5\xf9\x44\x64\x05\xf6\xb1\x20\x2c\x6e\xa1\x31\x10\xf9\x12\x0a\x4f\x66\xcb\xe8\xa3\x85\x3d\x6f\x03\x3f\x84\x03\x3d\xa5\x3d\x28\x41\x41\xc2\x29\x1c\xd7\x2d\x85\x65\x81\x11\xd6\x54\x52\xc1\x34\xa0\x54\x35\x92\xd2\x9a\xd2\x9a\xb1\x94\x51\xce\x42\x0e\x30\x42\xb2\x9f\x8e\x93\x02\x7b\x76\x62\x27\xb6\x57\x14\x2f\x46\x90\xc0\x24\x59\x25\x36\x2b\x63\xbd\x39\x4c\x3e\x24\x7f\x93\xfc\xdd\x17\x0a\x66\x2f\x35\x22\x17\x05\x81\x8f\x9f\xde\xdd\xdc\xdf\x6e\xc0\xb9\x94\xe4\xa7\x3d\x9f\x4b\x41\xc9\xc7\x4f\xef\xe3\x97\x99\x81\x26\xe6\x8e\x00\x1c\x94\x84\xb5\x67\xba\x08\x47\x39\x16\x3b\xce\x35\xc8\x5b\x94\x11\x57\x94\xfe\xe2\xfe\x1c\x99\x84\xb9\x29\x58\xe3\x99\xce\x8f\xb2\x2b\x76\x88\xab\x1c\xa0\x01\x6f\x74\x29\xad\xd5\xda\x34\x08\x6a\x8a\xd8\x31\x1c\x8d\x12\x83\xe1\xaa\xd3\x14\xe0\x92\xe0\xb8\xd7\x52\xcc\xa1\x67\x84\xb7\xa3\x52\xac\x32\x5c\xb6\x7a\x89\x9b\x25\x3a\x4b\xa2\x9f\xf7\x8b\xd8\x67\xfc\x6f\xcf\xec\x78\xb7\xaf\x1d\xf9\xa5\x22\xea\xfe\x6e\x5e\x08\xbf\x9b\x8d\xe1\xcd\xbb\x9b\xdf\x03\x77\xe7\x1e\xc9\xf4\xe3\xcd\x39\xa1\xbf\x5a\x7f\xfc\x34\x1b\xcc\xef\x1f\xde\x5c\x24\xca\x6f\xde\xdd\xcc\x13\xfc\x28\x11\xe7\x4c\x51\xa6\x2a\x5d\x69\xa9\x94\x14\x14\x06\x7e\x82\x28\xcd\x53\x53\xf8\x1c\xd0\xb0\x2f\x0c\x84\xa5\x29\x39\xe3\x1d\x7e\x4a\x76\xbb\x53\x19\xf6\xc1\x21\x84\x2c\x41\x4f\x49\xd6\x32\x6c\x11\x9d\x72\xb0\x0b\x78\xe3\xb8\x74\x95\x65\x5c\x71\xa6\xa5\xe1\xb3\xef\xc7\xb8\x94\x0e\xe3\x4e\x5b\xa7\xac\xdf\xb7\xb8\x51\x20\x3f\x72\xa3\x4b\x85\xa1\xce\x41\xf1\x94\xe4\x80\x01\xcd\x18\xe7\xac\xd4\x4b\x2c\xa3\x8c\x35\xd8\x2e\x59\x27\xff\x2c\x81\xc9\x7d\xf2\x57\xc9\xbf\x79\x51\x40\xfa\x74\xff\xfe\xa5\xa0\xfe\x9a\x09\x77\x7d\xf7\xe9\x3e\xf6\x17\x5c\xeb\x89\x7c\xb8\xbb\xbf\x8b\xb5\x6c\x5f\xbd\x7c\x76\xee\x17\x51\x8a\x0b\x2e\x27\x0a\x7c\xe9\x0b\x30\x06\xbe\x3b\xf0\xc3\xa1\x0a\x7b\x01\xa0\x0e\x15\x70\x82\x0b\xc6\x43\x35\xe4\xb6\xeb\x0b\x27\x24\xe3\xb8\x56\x5d\xd9\xa5\xa8\xf3\xf9\x7e\x10\x8d\xb2\x02\x77\x6a\x5f\xb6\xa0\x11\x94\x71\xbe\x71\x98\x49\x86\x2b\x69\x0b\x2d\x5d\xaf\x9c\x39\x84\x1d\x77\x0c\x24\x81\xc5\x3d\xad\xf6\x4f\x89\x93\xc6\x38\xa7\xea\x4a\xd7\xa0\x70\x27\xa7\x5d\xe8\x6a\x5b\x8d\xbb\xd6\x74\x80\x02\x8b\xa9\x64\x64\xc6\x8d\x89\x8f\xd8\xcd\x26\x7f\xb4\x78\x80\x6f\xbf\xa8\x95\xdc\xde\x5c\xa5\x98\x6e\x2e\xbc\x1b\x67\x56\xb6\xd7\x45\x74\xcb\x90\x79\x0e\xfd\x78\xa0\xeb\x67\xde\x25\x1d\xca\x02\xf4\xac\x26\xa2\x34\x98\xc0\xe0\x49\x2b\x06\x12\x4e\x40\x47\x97\xd0\xaf\xac\x2d\x8b\xb4\xb4\xd0\x9a\x56\xb6\xae\xda\xcb\x9d\x93\x8c\xea\x46\x08\xa3\x60\x68\xe6\x15\xc1\x60\x4d\x34\xe9\x64\xa1\x8a\x12\x29\x69\x64\xa5\x89\xc6\x1d\x22\xd8\xb6\x9e\x51\x43\x95\xa2\x16\x73\xae\x38\xef\xa9\x13\xd2\xc5\xf3\xeb\x33\xb4\xd5\x1b\x99\xbc\x49\x3e\xc5\xf5\xee\xdd\xd7\xbf\x04\xef\xe2\xec\x9c\xcf\xe6\xcf\xc1\xc3\xfa\xf6\x92\xc1\xb8\xf0\x0c\x5c\x71\xd2\x5c\x24\xda\xc1\x4f\x51\x9e\x7d\xdc\x74\xd8\x35\x8c\x85\xb1\x68\x85\xa4\xf9\xc4\xea\xb4\x7b\xec\x32\x19\x04\x04\x6e\x77\xda\x19\xc5\x8d\xd5\x4e\x34\xe4\x00\x4a\x5b\x42\x49\xd3\x7d\x53\x71\x1c\x92\xb4\xa3\xdc\x69\xe1\xab\x66\xe4\x5e\x77\x1b\xa9\x85\x15\x1c\xd6\x44\x42\x69\xcc\xb4\xd3\x59\x69\xb0\x61\x1a\x11\xc9\x88\x44\x0a\x11\xcd\x60\xc9\x68\x38\x20\x8c\x89\xd6\x82\x62\xac\xe6\xc9\x6d\x4a\x88\x96\xf9\x9c\x26\xdb\x6a\xd3\x24\xbf\x7d\xee\x7e\x4f\x2e\x19\x91\x48\x02\xb0\xfe\xe9\x32\xd8\x85\x8e\xe4\x27\xaa\x5d\xb7\xb2\xfa\x41\xf9\x74\xa4\x96\x91\xa9\x04\xa4\x02\x66\x31\xd6\xb3\x93\x8e\x83\xee\x41\xce\x43\x7d\x0c\xf9\x2e\x54\x02\x50\x17\x34\x38\xc4\x0a\xf0\x21\x63\x91\xdd\xc3\x6d\x8a\x30\xd6\x3d\xa0\x54\x50\x71\xa0\x94\x52\xc3\x35\x33\x92\x7a\xdb\x76\xda\x0a\x6e\xd8\x0c\x7d\x78\xc7\x92\x6d\x3a\x3e\xb1\xad\xdf\xd8\xe4\x4f\x9f\x3b\xf7\x97\x68\xcc\x2b\xef\xfb\x4a\xa8\xfa\xd2\xf6\xf7\x45\x5d\x23\xf8\xee\xe3\xcd\xf6\xdd\x15\x2c\xbd\xa6\xbc\xca\x1a\x8c\x95\x57\x3b\x80\x10\x0c\x3d\x30\x34\xe6\xbd\xc6\xe9\x08\x51\x5a\x1f\x65\xa3\x08\x36\xde\xf1\xae\xa3\x61\x20\xcd\x81\x74\xbe\x4b\x3d\x82\xa1\xe2\x51\xf1\xf3\xbc\x71\xc6\x0c\xe1\xe9\xc1\x31\xae\x79\xda\x62\x24\xad\xb5\x84\xdb\xaa\x41\xde\x59\x46\xad\x55\x06\xe3\xa9\x26\xdc\x1a\x22\x94\x26\x15\x14\xe9\x91\x10\xbd\x97\x61\x37\xff\xb7\xc6\x4c\x09\x29\x18\xb5\x54\xb2\x24\xd9\x26\x3a\x35\xcf\x7a\x35\xb7\xcf\x75\x61\x97\xfc\xd6\x59\xde\xf7\xdd\x75\x18\x26\xd6\xbf\x5f\xfc\x97\x9f\x72\x5a\x80\x48\x45\x9d\xd2\xc3\x61\xea\x33\xfc\xab\x3c\x43\x53\x93\x8a\xc7\x7d\x7c\x3e\xc5\xbc\x58\xfb\x59\x19\xe3\x74\xb5\xae\x9c\xb0\xdc\x85\x03\x2d\x5d\x49\x42\x4b\x4a\x5f\x90\x0d\xe2\xbc\x35\x1d\x33\x86\x69\x66\x18\x63\x3d\x63\xc1\x32\xc3\x14\xe7\x5c\x32\x21\x18\xe3\xd1\xab\xe0\x90\xcf\x8b\xc9\x16\xd4\xf3\xfd\x5b\x37\xe7\x3e\xcd\x97\x4a\xc3\xe7\x1e\xc2\x97\xa8\xca\xf3\x1d\x8b\xcb\xe8\x73\x7c\x65\xb9\xc1\x7f\x08\xb6\x37\xf7\xeb\xed\xcd\x3d\xb8\xf9\x38\xdf\xe7\x97\x3b\x99\x12\x30\x16\xb9\x2f\x52\x6a\xed\x68\x41\x42\x04\x3f\xf6\x1d\x1b\x47\x1e\x08\xed\xc3\x01\x8f\xed\x89\x72\xd1\xba\x06\x40\x1a\x04\x38\x14\x45\x60\xa9\x28\xe7\x1b\x8c\x53\x3a\xe5\x29\xe7\x41\x20\x93\xe5\x8f\xa7\xcb\xb6\x2e\x29\x2f\x4d\xa7\x3b\x8e\x7c\x51\x4e\x47\xc4\xad\xc2\x52\x4b\xec\x21\x4f\x0b\x84\x0c\x57\x9a\x69\x88\x18\xeb\x18\x0b\x27\x8e\x0e\xec\x29\x99\xfd\x90\x18\x27\x55\x19\x3e\xd7\x53\x3d\xbc\x58\xcd\xeb\x26\xac\x45\x5d\xfd\xfe\x47\x04\x45\x2f\x34\x93\x0f\x37\x3b\x40\xdc\xbc\xd6\xe7\x40\x04\x37\xd4\xb2\xaa\x55\x38\x70\x90\x8b\x30\x00\x9d\x87\x21\xf3\x80\xda\xe7\x2f\xec\x1a\xd9\xb4\xd5\x20\x4e\x34\x1c\x80\x2a\xc2\xb0\x49\x8c\xb1\xd2\x71\x65\x0c\xaf\xa5\x15\xde\x21\x62\x8d\xb1\x04\x39\xa1\x8d\x13\x9e\x5a\x2e\x9d\x8c\x76\x50\xa6\x43\xf4\x89\xbe\x5d\x72\xf5\xe7\x23\x7e\x5e\xc7\x66\x63\xf0\xe1\xdd\xed\xfd\xb9\xa9\x78\x39\x44\xf0\xe9\xe1\xe6\xdd\xfa\xe1\xfe\x66\xfb\xcd\x90\x1e\xea\x74\x1c\xa8\xb1\x5c\x39\x84\x4f\x00\xf1\x00\xc3\xbe\x0e\x6d\x10\x02\xf0\x3d\x63\xd2\x89\x26\xf2\x8b\x6a\x16\xaa\x30\x54\xe1\x24\xf5\xa6\x50\xca\x1b\x81\x1c\x96\x04\x6b\x52\x9b\x43\x53\x9d\xb4\x17\x51\x7c\xdf\xea\x21\x1c\x4d\x55\x19\x5d\xbb\x38\x8e\x22\x97\x9e\x5c\x97\xe7\x1a\x93\xa5\xfe\xe5\xfb\xb3\xc6\x55\xd4\x8b\xb8\x79\x73\xb3\x94\x6f\xdf\xbf\x72\x3f\x97\xd6\xe9\xeb\x90\x0b\x68\x56\xf5\xec\xef\x82\x5c\x86\x5d\x10\xa9\xff\x61\xd4\x9a\x82\x1e\xa8\xe9\xe4\xb3\xd3\x63\x7e\xd9\xb0\x69\x0e\x7c\x04\x92\x86\x21\xd4\x04\xa8\x74\x04\x14\x20\x16\x86\xb0\x5b\x97\xae\xe1\x52\x19\x39\x15\xa9\x29\x0b\x47\xf8\x30\x1d\x45\x18\x65\xd8\xcb\x8c\xcc\xf6\x8c\x3e\x62\xab\x48\x85\x04\x61\x95\x5c\x7a\x47\x93\x2a\xdb\x6f\xd5\x86\x5d\xf9\xd1\xc9\xdb\x9b\x97\xaa\xba\x88\x97\xcf\x73\x78\xb6\xc8\xd5\x66\x37\x8d\x60\xff\xab\x1e\xec\xa7\x71\x55\x84\x26\xa0\x98\xaa\xd8\x03\x51\x03\xb2\x61\x56\x07\x0b\xac\xd6\x5a\x3f\x25\xb1\xe3\x6c\x1e\x7b\x3c\xab\xb6\x7a\xe3\x93\x9f\x25\xf0\xb9\xaa\x3d\x52\x5a\xdf\x9f\x6b\xdb\xd7\xd7\x21\xbf\x34\xf1\xcc\x54\x5e\x00\xd4\xa7\x6c\xbf\x83\xa9\x04\x5a\xf7\x61\x4c\xc5\xd4\xa4\xf9\x67\x07\xf6\x53\xb7\xf1\xc8\x99\x80\x01\xd1\x6e\x30\xae\xcc\x7d\xc1\x35\x86\x95\xb5\xce\x9d\xf3\x02\x2a\x1b\xa2\x8d\x5e\xa2\x5b\x57\xdd\x4f\xdb\x9f\x62\x2c\x28\xd2\x66\x09\x11\x4e\xa2\x01\xbe\x4a\x8f\xd5\xbc\x26\x54\x53\x51\x05\xbd\x3e\x39\xe7\x8d\x69\x94\x52\xca\xcf\x0f\x71\x7c\xea\xcc\x45\x3d\x8c\x25\xf2\x90\xbc\x8d\x31\xab\xe2\x47\x71\xb3\x0f\x67\xbf\xad\x06\xac\xa8\x0a\xe0\x65\xc5\x64\xa9\x18\x85\x79\x38\xc9\xd0\xb2\x79\x5d\xda\x67\x87\xb4\x9b\x58\x44\x1f\xeb\xa3\x2f\x4d\x70\x35\x74\x90\x77\xc1\x6b\x2f\x4e\x3e\x14\x6e\x8c\xe7\x74\xc8\x76\xf1\x6f\x7e\x15\x3b\x8f\xae\x23\x96\x4b\xc0\x72\xfd\x5a\xe1\x2f\xaa\x55\xdc\x5e\xa2\x98\x2d\xc6\xd6\x4b\x8f\x77\xe1\x20\x00\x4b\x93\xac\xe0\x4c\xd6\xb0\x65\x28\x9c\x50\x38\xf0\xb1\xdc\x6f\xac\x25\x30\xec\x20\xa1\x84\xd6\x3d\x55\x8c\x88\x34\xcf\xf3\x20\x38\x87\x0e\x22\x50\x06\x2b\x3c\x03\x71\xdc\xe8\x74\x8c\x5a\x38\x4b\xef\xdb\x5d\x42\x2e\x73\xf4\xd2\x0f\xf5\x1c\xc3\x7a\x88\x97\x78\x69\xf3\x7c\x7b\x35\x94\xc0\x8c\xcf\x6e\x3f\x3d\xdc\x6c\xdb\x14\x55\x00\xfb\xc8\x05\x45\x0a\xa1\x95\x2d\x9d\x24\x45\xd0\x3e\x14\x3e\x34\xa2\xb7\x4f\x89\x05\xcd\xb4\x4f\xfb\xf9\x6b\x28\xb0\xd0\x17\xa8\xc3\x65\x38\xe2\x79\xca\x2a\x15\x1a\x39\xa8\x42\x17\xb4\xaa\x9c\xb6\x84\x02\x29\xe6\x7f\x61\x90\x18\x63\x2c\x67\x7b\x92\xb5\xdb\x7a\x53\x27\xeb\xa4\x88\x57\xef\x79\xa9\x7d\xee\xb0\x58\xbf\x78\x0a\xdf\x7e\x5c\x7f\xfc\xf0\xdd\xc7\xbb\x6f\xde\xaf\x4d\xe3\x44\x55\x4f\x49\x45\x65\xc5\x95\x04\x70\x3d\x16\xd3\xc0\x0f\x8c\xe5\x55\xa1\x95\x0d\xad\x0e\x49\x09\x06\x5a\xd4\x25\xd9\xd4\x98\x6a\x8e\x05\xd2\x2a\x40\xc0\x19\x51\x2d\xf6\x94\xcb\x06\x35\xa6\xf1\xd4\x13\x5b\xd5\x6a\xc9\x67\xf8\x27\xb2\x95\xab\xe2\xd9\xe7\x7f\xf7\x65\x0d\x56\x8c\x62\xcc\xc6\xe1\x4f\x40\xa4\x4a\x06\x6a\x4d\x7e\x18\xaa\x55\xf2\x98\x5c\xb6\x2c\x01\x14\x40\x16\x76\x61\x17\x4a\x7b\x0a\xb5\x02\x74\x55\x3c\xca\xb4\x32\xc1\x99\x60\x6d\xd8\x13\x5e\x29\x62\xa4\x66\x3e\x6a\xf2\x6d\x13\x1a\x63\x91\x22\xf9\xe6\xd9\x8b\xfe\x93\x85\xbf\xf2\x8a\xf5\xed\xe3\xd9\x6c\x3d\xdc\xac\x2f\x5d\x44\xcf\x47\x74\x65\xb4\x5c\xca\x39\x69\x30\xcd\x8e\x41\x54\x00\xe9\xf6\x33\x72\x4e\x00\x3e\x04\x0c\x4e\x19\xe1\x64\x3a\x1d\xb3\xee\x91\x5d\x36\x90\xd0\x30\x86\x96\x02\x91\x1e\x40\x01\x0a\x1e\x8e\xe1\xb0\xf2\xb3\x93\x65\x9b\xca\x99\xa9\x4d\x35\x27\xd6\x76\x15\xe3\xc1\xca\x10\x23\x28\x4f\x89\x55\xd8\x63\x86\x95\x35\x24\xc9\x12\x91\xed\x63\x7c\xe8\x95\x56\xe1\x9b\x67\xe3\xf1\x70\xe1\x26\x43\xa9\xf5\xf3\x8c\xce\xd4\xa9\xcb\xf8\x64\x2b\x70\x08\x65\x6a\xc0\x69\x53\x2a\x15\x2a\xee\x1c\xb7\x32\xf6\x2c\xa7\x89\xcd\xfa\x18\x0b\x2f\x16\x55\xa7\x68\x19\x66\xf3\xbd\xe8\x09\x80\xbb\x77\xdf\x3e\xcc\x36\xea\x99\x7e\xea\xe6\x0f\xbe\xbb\x4f\x71\x15\xb3\x63\xaa\x08\x2c\x20\xec\xbd\x4f\x79\x05\x8a\x1d\x3f\x84\x8e\xda\x91\xe6\x55\x61\xc2\xb0\xb7\x1b\x53\xbb\x01\x3b\x0e\xab\x1c\xd8\xe0\x8a\x34\xd9\x11\xed\x25\x31\x25\xc4\x1a\x37\x0b\xfd\x7b\x92\x26\x6d\x36\x6e\xf9\xc6\x2c\xb9\x83\xb7\x17\xe6\xb0\x67\x08\x7c\x7f\xce\xe2\xcf\xf6\xb8\xed\x2b\x50\x54\xa0\x8e\x3c\x86\x13\x09\xc7\xd5\xf8\x83\xeb\x57\x75\x90\x9b\x5c\x88\xd9\xf6\xba\xfd\x3e\x8c\x16\xd4\xd1\x58\x81\x44\x65\x63\xec\x07\x7d\xff\x63\x7f\xe9\x82\xd2\x86\x74\xac\xd3\xe3\x14\xe5\xfa\x32\x7e\xda\x65\x34\xf2\x55\xc3\x0d\x94\xd2\x45\xc6\x67\x61\xc5\x3c\xef\x55\x76\xd8\xd6\xaf\xd7\x0b\x10\x49\x8b\x6e\x2e\x81\xfb\x87\xbb\xed\xcd\xc3\xf6\x66\xfb\x87\xe0\xe1\x66\xbb\x69\x21\x28\xc2\x08\x7f\x18\xd1\x53\x02\x4a\xe4\x0b\x50\x15\x4d\x01\x4c\x89\x82\x2d\x81\x9b\x76\x65\x50\xc5\x86\x1d\xdc\xf1\xe8\x0e\x76\x9e\xcb\x47\xbd\xe8\x12\xa6\x89\xc8\x50\xac\x43\xfa\xf9\xb9\xca\x69\x09\x63\xcf\x73\xe1\x12\xe7\x59\xd6\xfd\xec\xd4\x20\x60\x40\x27\x03\x09\x3a\x34\xa1\xe0\xa9\x0b\x5d\x5a\x62\xec\x38\x03\x56\x55\x46\xf3\x47\xb9\xb1\xa4\xec\x75\xed\x8e\x83\xaf\xda\x70\x24\x58\x0a\x6d\xbd\x15\x52\xcc\x7f\xcb\x67\xfb\xad\xd9\xb8\xe4\xb7\x16\xdb\xfa\x62\x17\xee\x96\xa5\x7c\xbe\xfb\xf0\xe1\x4c\xd9\x01\xbf\xfb\x57\xb1\x81\x27\x65\x15\xe5\xb5\xd4\x1c\xe0\xb4\xa8\x00\x9b\xc1\xdc\x10\xbc\x68\x40\x89\x70\x5e\x15\x7c\x86\x16\x47\xb7\x23\xce\x6e\x1c\x96\x32\x50\x80\x05\x35\xc3\xd0\x53\x61\x25\x73\xb0\x84\xb0\x46\x7b\x82\x19\xab\xa0\x2f\xca\x24\x4d\x64\x36\xc4\x73\x3e\x57\xd0\x7c\xf7\xf1\x61\x35\x23\xd1\xeb\x8c\x40\x04\x6b\xb7\x6f\xe3\x4c\x4c\x59\xa6\x2b\xa7\x00\x06\x46\x18\x53\x48\x65\x3c\xac\x35\x84\x79\x20\x76\xda\x71\x30\xd8\xa3\xf4\xe1\x14\xe6\x79\xb9\x56\x5c\xaa\x41\x7b\x44\x06\x93\xbb\x1c\xcb\x03\x75\xc8\x00\xcf\x0f\xde\x99\x98\x4b\xcf\x86\x18\x53\x5a\x6c\xd1\xfb\xf5\x73\xc1\x17\xfc\x10\xed\xe1\xc3\x37\xef\x97\x72\xe3\x2d\x2e\xa6\x6a\xa8\x04\xc7\x1e\x35\x55\x38\x86\xdd\x63\x53\xa6\xa3\x96\xce\xfa\x83\x37\x4a\xb9\x75\xe5\x98\x26\x12\x3b\x7d\x90\x8e\x6b\xcf\x7b\x03\x08\xe1\x8a\x93\x24\x05\x22\x71\x9b\x7a\x93\x27\x77\xb1\x13\xea\xec\x92\x9f\x25\x1e\xe6\xc5\xec\xdd\x8f\xe5\xc8\x5f\x89\x92\xdf\x7e\xb8\xfe\x9d\xa5\xe0\xe6\xb5\x96\xf2\x8f\x7f\x65\xe5\xc0\xa1\x43\x98\x20\x86\x34\xd7\x45\x2e\x19\xe3\xc6\x42\x54\x62\x4c\x68\x2e\x35\xf5\xba\x14\x9c\x2a\x9e\x17\x18\x73\xa9\xea\x29\x07\xa7\x16\x22\x02\x09\x52\x4c\x14\x9c\xf2\xb2\xb4\x86\xd0\x92\x53\x42\x95\xa3\x8d\x2e\xe6\xdf\x12\x79\xc1\xa9\xf4\xb2\xdb\xe4\x8e\x13\xa1\x85\x64\x5e\x10\xaa\x95\xae\xc4\xb1\x85\x0e\xea\x5a\xf1\xbd\xb2\xfa\x24\x1d\x51\xc2\x96\x05\x86\x9a\x3a\xe7\x04\x8b\x6c\x61\xb5\xe2\x5a\x6b\x8a\xf9\xbe\x43\x0e\xd9\xde\x8c\xd6\xfa\x13\xef\x84\xd6\x2d\x2c\x35\x36\x26\xd6\x38\x25\xea\x49\xac\xd8\x73\x3d\xe1\xdf\xfe\x5a\xae\xd4\x37\xef\xcf\xb8\xfe\xea\x9a\xfe\xe8\xf2\x5c\x81\xe6\x0b\x76\x76\xc0\x2f\xf5\x66\xe2\xb1\x07\x3c\xe8\xac\xf2\x93\xf3\xbb\x34\x9f\x4e\x4d\xc6\x43\x07\x21\xc5\x92\x5a\xa1\xbc\x16\x4a\x1a\x1b\x2f\x04\xc6\x43\x18\x29\x20\x63\x5e\xb4\x47\x7a\x6a\x8a\xb2\xf6\xbc\x6f\xc2\x30\xaf\xca\x96\x5b\xcb\xc3\x78\xd4\x16\x24\x83\x66\x16\x96\x94\x53\x2e\x14\x13\xd2\x08\x86\x2b\x5b\x54\x25\xe3\xb8\xe6\x86\x37\x25\x74\x54\x53\x53\x14\x02\x69\x22\xe7\xf3\x75\x4f\x6c\xeb\xd6\x65\x5c\x1f\x7f\x27\xf9\x8b\xab\x0a\x97\x73\x9c\x20\x0a\x7f\xbc\xc8\x71\x7c\x9b\x6d\xb6\xaf\x4e\x32\xae\x53\x7f\x16\x59\x87\x3e\x9c\xfd\x1b\xe0\xd6\xc9\xe7\x24\x16\x49\xaf\x59\xf5\x03\xaf\x40\xbe\x2e\x26\x5d\x38\x72\xda\x49\x63\x35\x40\x3a\xec\x1c\xa5\xc6\x12\x05\x95\xc0\x38\xf8\x90\xd3\x14\x01\x59\x86\x2e\x30\x06\x6a\xc0\xe9\x21\x74\x0a\xe8\x31\xc8\x75\x19\x7a\x33\xaf\x61\x27\xeb\x40\x31\x9a\x42\x3a\x6e\x15\xa3\x7b\x69\x34\xc8\xcb\x42\x3a\x9f\xbb\x9c\x31\xbc\xd7\x56\x8f\x05\x6a\xb4\x15\x0d\x56\xcc\x12\x96\x00\xd0\xcc\x3e\x68\xda\x45\x0d\x8e\xeb\x33\x79\xbf\xfd\xf6\xe3\xf6\x9b\x1f\x9f\xc9\x77\xe7\x33\xf9\x83\x77\xe7\x73\x39\xae\xf9\xd4\x29\x81\xf7\xad\xd2\x4a\x1f\xf5\x53\x62\x64\xe1\x1d\xd5\x50\x4b\x42\xc2\x2e\x68\x06\x1a\xc0\xf3\xe2\x29\x09\x0d\x03\x0c\xe4\x38\xef\xa3\x96\x4d\x37\x0d\x69\x67\x29\x15\x5c\x1b\x8a\x07\xe5\xfc\x09\x52\xe6\x5d\xe1\x0a\xc6\x0a\x2f\x0c\xaf\x20\xb4\xcc\x10\x8d\x73\x46\x1c\x16\xf3\x1a\x32\xcc\xc7\x9b\x91\xd8\x9d\x30\x1f\xef\xef\x81\x77\xe7\x43\x8e\x8c\x9b\xdf\xbc\x9e\xb3\xd7\x87\x7c\x7e\xba\x49\x69\x26\x43\x4b\x99\x28\xca\xd6\x69\xed\x41\x79\x32\xe1\x14\x76\x85\xb1\xcc\x20\xab\x10\xce\x43\x1d\x20\x05\x27\xa0\x8b\x3c\xf4\x81\xf3\xf9\x82\x43\x14\x8e\xe1\x28\x67\x37\x27\xec\x33\x62\x21\xb3\x79\x9e\x33\xa3\x25\xab\x1a\xb7\xaf\x29\xaf\xea\xa2\x2a\x05\x47\x70\xd4\x56\x1f\x48\xd1\x68\x27\x1a\x54\x6a\x62\xb1\x8a\x79\xfe\x26\xa3\xdb\x79\xee\xfc\xe5\x52\x3f\x77\xff\x4c\x35\x76\xff\x25\x23\xd9\x73\x6d\xdd\x6f\xfa\x4e\xd6\xba\xd3\x30\x74\xdd\x30\xb8\xbe\x6f\x9a\xbe\x3f\xd6\xbf\x92\xf5\x71\xf9\xc8\x0e\x43\xdb\x0e\xc3\x69\x63\x26\xa1\x14\x57\x7c\x5e\xd2\xe2\x53\x6a\x1f\x8f\x59\x31\xd9\xd7\x9f\xce\x98\xec\x94\xa9\x6d\x72\xd6\xfe\x7b\xfb\xcc\x2e\xf0\x0a\x4f\xbf\x02\xce\x57\xaf\x4f\x60\xa8\x00\xa9\xc0\xfe\x57\xa7\xa5\x5f\x71\x37\xbf\x23\x9f\xd1\xd5\x9b\xf5\xd1\x39\xe7\x26\x03\x16\x0e\x90\x10\xa9\x5d\x4c\x02\x32\xff\xc4\x63\xbf\xce\xc7\xa5\x8a\x3b\xa6\x19\x37\xdb\xcd\x22\xc8\xfc\xe6\xcc\xc7\x91\x66\x0b\x79\xc5\x9b\xb8\x65\x5d\x7a\x82\xb0\xf0\x39\x86\xda\x92\xb1\xae\x9b\x16\x9e\xec\x08\x0f\xc7\xdd\x6e\xdc\x90\x5f\x1d\x28\x1d\xd0\xc8\x09\x55\xeb\x26\xb4\x91\xea\x80\x87\x93\x3a\x02\xe9\x67\xe8\xce\x63\x2c\x7b\xf7\x5c\x1b\x3d\x9f\xed\x8f\x98\x14\xce\x48\xee\xc2\xb1\x7f\x66\x55\x8b\x99\xbd\x77\x37\xf7\xab\x62\xfe\x7f\x89\xd0\x00\xff\x48\x41\x1d\x6a\xbf\xdb\x01\xd9\xcf\xce\xa1\x7d\x3c\xfa\x48\xde\x7b\xdc\x94\x52\x86\x5e\x59\xab\x94\xd6\x7a\x3a\x86\x4a\x06\x9b\xb1\x83\x0e\xc4\xfb\x45\xf3\xf8\xc9\xae\x75\xac\x41\xfc\x7e\xf6\x5d\x40\x84\x2d\xb1\xe9\xfc\x4b\x91\xf4\x87\x58\x3a\xf5\xa2\x74\x72\x1e\x15\x9f\x3e\x2e\xd1\x76\x01\x44\xe9\x4b\x80\x43\x5f\x00\x22\x04\x84\x90\x40\x14\x88\x03\x65\x11\x3a\xd0\x3b\x84\x98\xd6\xda\x6a\x6d\x3a\x68\x31\x14\x10\xaf\xfd\xe1\xe0\xdb\xc7\x52\xc8\xd2\x97\x2c\x63\x9f\xdb\xd5\xae\x0d\x35\x32\xc2\x34\xe6\x70\x30\x8d\x31\x9a\x09\x24\x58\x92\x6c\x23\x97\x87\xdd\xb8\xd8\x37\xf2\x47\x67\x66\xcd\xbf\x5a\x2a\x3f\x2e\x11\xc6\xfb\x9b\x58\xa8\x70\x91\xea\xf9\x74\x7f\x26\xd7\x9c\x6d\xc7\xb2\x22\x9c\xb1\xfb\xdd\x9b\x5b\x70\xf3\x2c\xea\x79\xf6\x50\x57\x05\x67\xa0\x40\xa8\x46\x08\xa0\xcf\x1c\x20\x8c\x33\x54\x31\xe5\x4a\x0c\x45\x11\xb4\x52\xb8\x14\x24\x1c\xbc\xbf\x14\x7f\xa5\xa5\xf7\x13\x5a\x39\xe1\xbb\xb2\x27\x30\x0f\x82\x05\x2c\x80\x11\x41\x6c\x9c\xd4\x52\x63\xc1\x9c\xa3\x24\xf4\x53\xad\x79\x95\x43\x92\x96\x53\x2d\xb8\x2d\x31\x3d\xa4\x87\x9d\x0c\x7b\x09\x92\x50\x84\x43\x50\xb5\x17\x43\xa8\x85\xa7\x87\x24\x4f\xfd\x93\x89\x38\x75\x7d\xd6\x7e\xfd\xfe\xb9\x8f\x71\x41\x1d\x77\x6f\x3e\xbd\x7d\x9f\xae\xbf\xb9\xb4\x8d\xdf\x9c\x0b\xd1\xb3\xab\xc0\xe2\xdb\x4b\x39\xf5\x7c\xb2\xe7\x6d\x55\x79\xab\xac\xc7\xd5\xb1\x77\xc7\xb0\x83\xaa\x2d\x4b\x9f\xab\xa7\xe4\x88\x8c\x63\x8d\xdd\x39\x68\xbc\xcd\x76\x9a\x79\xaa\x3a\xfb\xc3\xc9\x57\xde\x03\xe8\x1c\x28\xbd\xdf\x58\x61\x8c\x95\x3e\xb0\x1e\xd4\x2c\xe4\xbb\x02\x22\x8b\x07\x49\x18\x75\x4c\x80\x03\x3a\x0e\x6c\x67\x7c\x4b\x3b\x3f\x89\xe9\xe4\xfd\xbc\x64\xc6\xd8\x73\xdc\x92\x64\x93\xe2\x73\x7e\x7f\xf6\xf2\x6e\x93\x3f\x8c\x71\xc7\xa5\x0e\xf5\xa5\xad\xe3\x92\x89\x7d\xff\xf5\xf6\xab\x0b\x5f\xe7\x57\x67\xf5\x83\xab\x5e\x81\x55\x57\xe1\x94\x49\x66\x38\x0a\x90\x6b\xd5\x84\xbd\x40\x0e\xc9\xb4\xf2\x45\x0f\x10\x0f\x87\x96\x87\x56\x1d\xfb\x40\xb4\x1d\xd4\x90\x9d\xaa\xc9\x7a\x3f\xc3\xfa\x8d\x81\xce\x17\xbd\xe0\x4a\x37\xca\x74\x47\xdf\xe0\xd6\x87\xa1\x14\x2c\x9c\xb4\xb7\xa7\xbd\x57\x0a\x24\x25\x1f\x1a\xdd\x84\x6a\x42\xce\xa5\xfb\x19\xb0\x2e\x5c\x9a\xf5\x13\x8d\xf3\xe5\xda\x42\x5d\x77\x65\x3e\xb3\xc9\xc4\xe6\xd8\xe7\xfe\xe5\x17\x06\xbb\xd7\x9e\xed\xef\x83\x97\x73\x4e\x1b\x50\xc6\xc1\x75\x9c\xfc\x31\x1c\xf2\x74\x37\x61\xc3\xf9\xc0\x0d\x9b\xf6\xa9\x9e\xbc\x8f\x9e\xd6\x79\x63\xc4\x38\xec\x00\x31\x86\x1a\xbb\x81\x42\x44\x96\xf6\x70\x0c\x8d\x8e\x76\x2d\xec\x26\x0a\x8e\x3c\x44\xca\xe2\x51\x09\xa4\x31\x43\x5c\x8b\xc5\xff\x4d\xd5\x13\x5d\x8f\x1b\x93\x7c\x73\x9e\x4b\xbf\x4c\xfe\x3a\x56\xdf\x5c\xb0\xd4\xd7\xf1\x86\x5c\x38\xbb\xd6\xef\xb7\x4b\x8b\xef\xa7\xfb\xf7\xb3\x5d\x88\xb8\xff\xe1\xfe\xee\x5d\x76\x11\x21\xbf\xb9\xbf\xf9\x91\x6a\xe1\xdb\x2f\x09\xaf\x6e\xef\x6f\xb3\xc6\x46\x78\xd5\x71\x05\x8b\x69\xcf\x2c\x05\x09\x50\xf9\x41\x31\x96\x1b\xde\x7b\xce\x0b\x69\x76\x29\x9f\xda\x32\x85\xd3\x18\x69\xe0\x41\xc7\x79\x89\x4a\x02\x71\xb0\xda\xa1\xa2\x54\x65\x01\xcb\x98\x4f\xd2\x46\x6c\x0c\x95\x4c\x95\x9e\x10\x32\x55\xa1\x9c\xd7\x7b\x0d\xc6\xb4\x6d\x25\x42\xb0\x28\x72\x06\x0d\xc5\x04\x17\x72\xbe\xc3\x83\x26\x4f\x89\xe0\x87\xc0\x19\x2f\x4c\x4e\x00\x0a\x45\x2a\xc2\x29\x16\x67\x32\x0a\x29\x52\x6d\x9b\x24\xbf\x95\x1e\x9f\x70\xb4\x37\xcb\x3d\xbe\x4b\xfe\xbb\x57\x55\x08\x77\xcf\x6c\x41\xd7\x94\xd7\x77\xeb\xab\xae\xf5\x2f\x3d\xcb\x87\x85\xa1\x26\xca\xfd\x2f\x44\x06\xaf\x54\x68\x5e\x1e\x3f\xae\x8e\xde\x30\x6c\x11\xda\xfb\x47\xef\x40\x82\xb0\xe6\x58\x85\x36\x43\x8f\x7b\x97\x96\xd3\xe1\xb4\xca\x03\x05\x6d\xe0\x69\xf2\xd9\x81\x43\x94\xef\x65\x4e\x61\x89\x21\x0b\x3b\xd0\x73\xac\x8b\x42\x3d\x0e\x96\x33\x2d\xb2\x9e\x61\x87\x68\x4b\xb0\x87\xc4\xa2\xa2\x2a\xe0\xc6\xee\x95\xa1\x82\x9d\x9c\x3b\x71\xc6\x94\x19\xc2\x41\xf1\xa7\x24\x48\xae\x98\xd6\x4c\x71\x23\x09\xe3\x6d\x5b\x23\x86\xdb\x49\x30\xc7\x67\x97\x49\x73\xa3\x88\x90\x54\x73\x2c\x25\xd6\x32\x49\x92\xdf\x4e\x67\x3c\xd4\xc6\x7c\xec\x57\xe7\xfe\xc2\xff\x26\xf9\x97\x31\x0f\xf4\x77\xc9\x7f\x4c\xd4\xb9\xa2\x0e\x7e\x78\x97\x2d\xd0\xe8\xe3\x3c\x2e\xce\xe8\xe8\xed\xed\x32\xb1\x97\x15\xe4\xf6\x2c\xca\x7a\xff\x7c\xe1\xd6\x37\x2f\xad\x3c\xe0\x15\x05\xf6\xbb\x9f\xa0\xc0\xde\x1c\xe8\x53\x12\x1c\x9a\x97\x20\x67\xb4\x2e\x4b\xef\xcb\x12\x23\xeb\xab\x8c\x1b\x4c\x35\x1d\x68\xa1\x4b\xc2\x63\xf1\x16\x48\x9e\x92\xb4\x0a\x47\x40\xa7\x02\xa0\x70\x4a\xdb\x89\xa7\x30\x0a\x53\x8d\x00\x09\x2a\x18\x03\x3b\x81\x0d\x16\xd3\xc9\x12\xa9\x50\x6e\x0b\xde\xf5\xc2\x6b\x26\xa5\xdc\x38\xad\x4a\x8b\x5c\x80\x75\x37\x0c\x45\x60\x9b\xd3\x67\x96\x5b\xdb\xf8\x34\x29\x91\xe1\x54\x20\xc6\xa1\x60\xb1\x82\x2b\x1c\x95\x92\x4a\xb5\xd3\x49\x2b\x25\x82\x88\xfc\x18\xb8\x6e\x59\x5b\x93\x03\x2c\x91\x86\x0d\xa7\x0c\x14\xac\xd7\x2a\xf6\x6c\xa2\x27\xb5\x4e\x36\xfa\x95\x06\xde\x73\x2b\xee\xfb\x97\xb2\xfc\x17\x21\x36\xd4\x42\xe4\x71\x59\x05\x04\x81\x0f\x3a\x6a\x3e\xb4\xbe\xb6\xb6\xae\xd7\xca\x48\x6c\xbc\x6b\x9c\x9d\xc1\x0f\xd5\x69\x17\xf0\x0c\x40\x7e\x96\xf0\xd4\x6f\xab\x4d\x95\xac\x93\xaf\xe3\x5f\xf9\x98\x90\x8b\xfa\xcf\x79\x6c\xde\xfd\x04\x9b\xe4\x0b\x8f\xe4\x4f\xd2\x48\x9e\x29\x86\x2e\x09\xb0\x25\xb8\xfc\xf1\xed\x99\x46\x12\x54\xda\x1c\xf9\x0e\x98\x71\x21\x93\x94\x8f\xf5\x11\x75\xa0\x04\xc9\xbe\x4c\xcb\xf9\xb8\x3f\x8f\x9a\x50\x6f\xf8\xb0\xb2\xe0\x64\xd9\x99\x44\xf2\xf0\x38\x40\xe0\x42\x9b\xee\x4e\x91\xbe\x0a\x86\xd1\x85\x1a\x0d\xf3\x2c\xe8\x77\x68\x53\xd1\xde\x6b\x2b\x61\x59\xc2\x46\x29\x4a\x29\x74\x46\x13\xce\x42\x01\x94\xd0\xda\xdb\xe0\xce\x14\x92\x32\x8c\x0a\x9f\x4e\x58\x11\x85\x90\x00\x84\x5e\xf8\x23\xb7\x59\x72\xee\x93\xf8\x27\xb1\xb2\xfc\x2f\xce\xcc\x76\xe7\xea\xd2\x0b\x3f\xf2\x7c\x65\x5e\xb8\xc2\xa2\x9f\xf2\xee\xf6\xfe\x9c\x38\x3a\xdf\xa5\xfb\xcd\xf6\x23\x04\x8b\x6e\x71\xe4\x47\xf8\x25\xb8\xbf\xdd\x9e\x9f\xd7\x12\x43\xd0\x57\x53\xe2\xc1\x00\x11\x38\x50\xdf\x72\x4e\x2c\xc2\x5d\xe8\xfd\x89\x84\x5d\xe5\xdb\x70\x10\x20\x71\xa1\xdb\x95\x50\x13\xac\x9b\x1e\x01\x0f\xec\xe4\x7d\xe6\x7d\xf0\x4f\x09\x48\xdc\xe1\xe0\xce\xcf\x1b\xcb\x45\x38\x59\x0f\x4a\x4a\x42\x67\x60\xb9\x93\x8a\x31\x62\x0d\x72\xb4\x1f\x76\xb5\x36\x42\x5a\x84\x28\xe5\x5d\x91\xdb\x1f\x0e\x3c\x6d\x26\x91\x62\x6b\x8f\xc6\xc4\xb5\x60\x1f\xe7\xf0\x92\x13\xfb\xcb\x58\x51\xf1\x0f\xc9\xff\x79\x61\x18\xb8\x42\xfc\xb7\x2f\xde\xc0\x8f\x38\x8c\xaf\xf6\x81\xdf\x34\x6d\x7f\x09\xa2\x10\xde\x59\x39\x7c\x49\xf1\x96\x7b\x3b\x0c\x4d\x33\x0c\x76\x1c\xdb\x76\x9f\x8a\xc1\xed\x76\x5d\x37\x8e\x6e\xb7\x6b\xdb\x61\xda\xaf\xf2\xcf\xa7\xcc\x3c\xda\xcc\x3e\xba\x34\x91\x42\x08\x99\x16\x42\x68\xa6\x26\xef\x91\xd5\x32\x2f\x72\x5b\xd0\x30\x1e\x78\xef\x28\xb7\x62\xf6\xbb\x8d\x52\xd2\x28\x65\x64\x7c\x79\xf5\x6e\x1a\xa6\x83\x56\x46\x04\xc2\x84\xd6\x8c\x98\x56\xd4\x15\x1e\x51\x99\xe7\xa5\x66\x15\xa5\x02\xe4\x68\xb0\xac\x4a\xce\xfc\x4c\x32\x95\x91\xef\xf9\x4f\x16\xad\xc2\xf3\x78\x7f\xbf\x28\x01\x7d\xfb\x70\xff\xd2\xe6\x79\x56\x07\xfa\xf4\x70\xff\xaa\xcb\x33\x3d\xa6\x90\x31\x22\xa1\x47\xcd\x9e\x80\xa4\x0b\x3a\x65\x29\x62\x8c\x4a\x58\xa1\xba\x27\xc7\x26\xa8\x90\x18\x45\xb4\x4e\xed\xf2\x24\x27\xcb\x78\x61\x73\xe8\x8c\x70\x4a\xef\xec\xfc\x3e\xb7\xd0\x69\xe9\x94\x19\x10\x22\x96\x21\x15\x1f\x93\x64\x0d\xca\x27\xb2\xd9\x67\x3c\xc9\x93\xdf\x4e\x8a\x98\x87\x4b\x16\x1d\x81\x9b\xd7\x26\xe3\x02\x84\x41\x99\x5a\xec\x51\x99\xd6\x3f\x50\xb3\x1a\x3f\xc3\x79\x5b\x97\xfe\xf3\xce\xfb\x15\xfe\xbc\x4b\x77\x02\x11\x66\xb8\xa2\x8a\x06\x47\x28\xb0\x3b\x99\x24\x9b\x15\x4a\xf4\xff\x0f\x9f\x45\x00\xe6\xa2\x47\xa6\x1e\x2b\x60\x42\xe7\xbb\x0e\xd0\x46\x4e\xa7\x14\x4d\xec\x5c\x56\xb6\xf8\x2c\xc2\x5a\xa1\x95\x52\x21\x09\xf5\xec\xb3\xd0\x83\x0e\x34\xfa\x2c\x69\xda\x3f\xd9\x75\x11\x35\x77\xcf\xac\x54\x4b\xbe\xfd\x3c\x02\x23\x47\xf9\xdb\xe5\x4c\x1f\xb6\x9b\xf5\xc7\x87\xcc\x69\xc6\xad\x05\xd0\x18\x03\xf2\xa9\xd7\x6a\x48\xe1\x30\x14\xc7\x30\xc2\xc3\x46\x1b\x86\xf6\x6e\x1c\xdd\xde\x3d\xb6\x19\x24\x9f\x2b\xef\x43\x47\x9d\x38\xe7\x0a\xb2\xc4\xa4\xe3\x8a\x6c\x7c\xf2\x6d\x82\x62\x67\xff\xcd\x9b\xb3\xcf\xf1\xe6\x66\x89\x32\x5d\xe5\x78\xe6\x11\x71\xbf\x14\x5e\xfe\x22\xbd\xb9\x4f\xcb\xd0\x83\xd9\x51\x2c\x20\x50\xa1\x2b\x80\x9d\xfa\x1c\x9c\x72\x65\xb1\x28\x15\xe1\x79\x70\x68\x37\x7b\x01\x27\xd0\x02\x12\x72\x70\x5a\xf5\x40\x63\x8c\x60\x19\x3c\x51\xa8\x95\xb9\xca\x99\xa1\x9a\x7a\x05\x20\xc6\x12\x2f\xc7\x94\xb5\x4f\xed\x86\xa6\xc7\xc8\x31\x31\xdf\xeb\xab\x41\x79\xb3\xd0\xb7\xbd\x5f\x24\x69\x66\x70\x4d\x29\x23\x02\x3a\x14\xf6\x25\xff\xff\x48\x7b\x9b\xd8\x58\x76\x3d\x3f\xac\x58\xfd\x55\xf3\x6c\xcf\x94\xee\xb9\xba\x87\x76\x3c\x1e\x6a\x74\xcf\x11\xc7\x76\xc6\xf4\xd3\xe8\x88\xf6\xe4\xbd\x47\x18\xe3\x80\xc9\x18\x09\xf3\xec\x24\x84\x27\x19\x13\xb0\x1d\x10\x48\x02\x30\x59\x11\x08\x90\x30\xab\x10\xc8\x86\xcb\x5a\xd6\xb2\x96\xb5\xac\x65\x2d\x6b\xd9\xcb\x5e\xf6\xb2\x97\xbd\xec\xb9\x47\x45\x05\xc5\xea\xd6\x91\xce\xbd\xf3\x66\x82\x11\x4e\xa9\xa4\x6e\x49\xa7\x9b\xc5\x22\xff\x1f\xbf\x0f\xab\xc3\x6c\xad\x03\xe3\x31\x3f\x8e\x86\xf1\xd2\x14\x48\x85\x20\xda\x3d\x50\x3b\x15\x07\x0d\xf1\xac\x9f\xd8\x3e\xb3\x95\x4c\xfe\xdb\xd3\x3e\xf4\x4f\xde\x3a\xb1\x9e\x45\x59\x93\x05\xd6\x4c\x1f\x7f\x85\xb5\x9c\x0d\xb2\x6e\x96\x90\xc0\x61\x4c\x6e\x4f\x53\xdc\x52\x1d\x0e\x6d\x2e\x94\x75\x16\xba\x20\x25\x63\x25\xa1\xb4\xa7\x27\x25\xa2\x5d\x5b\x65\xbc\x97\x3c\xea\xa8\x6d\x13\x5d\xd0\x92\x20\xe8\x31\xda\x31\x5e\xf8\x02\x56\xb8\x26\x15\x63\x53\xde\x9c\x77\xcf\x6a\x53\xaf\x69\xf6\xdd\x19\x43\xfe\xa7\xd9\x9f\xbd\x65\xab\x5e\xdd\xfe\x2c\xd5\xa5\x3f\xbd\xbb\xfd\xf0\xe3\x87\xbf\x79\x77\xbb\x7a\xa5\xd4\x0d\x66\x39\xd9\xd9\x32\x79\xa6\x4a\x81\x8b\x0a\xe7\x94\x41\x25\x86\x61\x8e\xb8\x45\x18\x51\x82\xa0\x2c\x8c\xd7\x8e\x90\xa2\x1f\xeb\x1c\x09\x9b\x6a\xa7\x08\xa9\x42\x07\x6d\x75\xd1\xe5\xce\x94\xcc\xb0\xb1\x31\x25\xb5\x2c\x87\x30\x1e\x63\x47\x30\xf1\x32\x54\x95\x04\x2e\x54\x55\x37\x5a\x19\xe4\x9a\x8e\x6e\x80\x1e\x1a\x30\xc4\x3e\xee\xb4\x92\xde\x81\xd2\x8f\x7e\x0b\x3d\xb4\xa0\x3f\x3f\x08\x0a\x50\x6a\x58\x19\xa6\x5c\xfa\xfc\x79\x6b\x8c\x74\x65\x91\xf3\x71\x87\xf2\xea\xe8\x4f\x28\x17\x47\x1f\x1b\xef\x73\x36\xf6\x49\xf7\x92\xad\xd4\x9a\x26\x54\xff\xec\x1f\x7c\x73\x16\x17\x99\x02\xd6\x57\x32\x24\x2f\x2a\x24\x0f\xb7\x57\x8f\x0f\xb7\xf9\x00\x28\x41\x71\x00\x07\xd9\x4a\x51\x12\x12\x86\x2d\xb1\xf2\x90\x9c\x20\xfa\xe5\x49\x68\x6f\x71\xed\x9f\x4c\xe9\xca\x22\x1e\x8e\x18\x56\xc5\x62\xbf\xdf\x8f\xed\x61\xac\x50\xd2\xdf\xc9\xea\xbc\xdb\xf8\xb5\x4e\x3e\x94\xe4\x82\x69\x7a\x97\xd6\x86\xd7\x6c\x8a\xab\x73\x78\x37\x77\x73\xe6\xb0\x37\x39\x63\x5e\xdd\xdc\x9d\xe7\xed\xea\xe6\xe1\xe6\xfd\xed\xf5\x87\x3a\x57\x51\x81\x06\xda\xca\x54\xa8\x36\x42\x94\xc9\x1a\x0e\x2f\x75\xac\x16\x2a\x06\x50\x13\x41\x2d\x44\x51\xc7\x12\x82\xe4\x1b\x77\xc8\xd5\x58\x93\x94\xa7\xd7\x53\xa8\x30\x0c\x20\x5b\xeb\x58\xe9\xb8\x6d\xa0\x83\xd2\x01\xad\xd3\x13\x22\xee\xb4\xe6\x94\x12\xe4\x4b\x05\x70\x27\x22\x95\x52\xf6\xb2\x4c\x9c\x9c\xfa\x99\x2f\xf7\x6b\x3e\x77\x01\xd6\x9b\xab\xd7\x5a\xfd\x67\x29\xd3\xe9\xbc\x34\x4a\xc8\xa6\xd1\x42\x61\x52\x79\xdd\xd2\xb6\xf3\x7c\xb7\xe6\x16\xc1\x38\x24\x41\x7d\x2d\x9e\x86\x05\x3a\xea\x3d\x80\x1e\x14\x28\x24\xff\xe7\xd5\x92\xfe\x0d\x7d\xc8\x04\x10\x73\x4a\x48\xe2\x16\xa8\x58\x87\x44\x65\xdd\x02\x12\xdb\xb6\xae\x93\x7d\x7b\x3a\xfd\x66\x1f\xb2\x65\xe6\xf2\xc3\xb9\xa6\x3e\xe3\x37\x7e\x54\x53\x4f\xea\x0f\xbf\x00\x37\x57\x77\xb7\xd7\xf7\x37\x0f\xb7\xd7\x0d\xf0\x21\xa5\x71\xec\x69\x0f\x44\xb4\x7d\x69\xb4\x5d\x14\xa1\xeb\x62\xdf\xaf\x09\xe7\x86\x6b\xcd\xc7\x9d\xe6\x9a\xd7\x75\xec\x77\xe7\x5e\xd6\x34\x37\xf9\x0a\xa5\xbe\xce\x65\xef\x48\x6a\xb1\x5f\xab\x24\xa4\x1b\xef\xd3\xeb\x8e\xeb\xe2\x50\x21\x7c\xd0\x5a\x68\xe4\xb9\x6c\x4e\xf2\x58\x45\x2b\x6b\xc2\x5f\x74\xb3\x60\x3c\xac\x1d\x92\xe2\x07\x2a\x92\xeb\x1b\xb0\xc7\xc6\xd6\x5b\xbf\x10\x3a\x9a\x26\xb2\x3a\x8a\x2a\xd5\xbc\x4e\x49\x27\x9c\xa5\xf5\xfc\x9f\x26\xe6\xf9\x57\xb6\x8a\xaf\x24\x3f\x66\xe7\xe3\xd9\x3a\x70\x93\x76\xd3\x87\x9b\xbb\x65\xb6\x23\xd4\x0a\x5a\x31\x54\x97\x62\x17\x1d\xe0\xb1\xab\x93\x7b\x45\x55\xca\x4a\x2f\x4e\xf5\xc8\xf3\xee\x88\x21\x10\x4f\x5b\xc0\xc8\xd2\x8d\xbd\x14\x54\x5b\xed\x08\x0e\xbe\xf3\x71\x00\xd4\x77\xd1\x1e\x28\x28\xc0\x71\x31\x44\x06\x68\xdb\x70\xe1\x67\x9d\x94\x55\xc6\x41\x9b\xfa\x8b\x5f\xea\x0b\x69\xdf\xf9\x4d\x20\xc0\x0b\x80\x1b\x5c\x98\x8e\xc5\x6a\x88\x6d\x72\x56\x3c\x44\xdb\x82\x92\xc7\x66\x3f\xd6\x43\x6c\xd5\x14\x82\x54\xa0\x4b\xf3\xa5\xab\x97\xe1\xb3\x99\x8e\x05\x4f\xf9\xcf\x71\xcd\x23\x95\x56\x5a\x43\xbd\x1e\x5a\x6d\x99\xb2\xd2\x4a\x50\x8a\x53\xf2\xad\xdc\xca\x6c\x99\x29\xb0\xdb\xd4\xeb\x90\xfd\x9d\xb3\xc6\xff\xd7\x51\xf2\x5f\x17\xb8\x78\x11\xd5\x45\x04\x2e\x8a\xea\x07\x5e\x2d\x50\x09\xc7\x3d\x40\x15\xa8\xeb\x59\x75\x2e\x86\x1c\x46\x5d\x03\x6c\x62\x33\x8c\xdb\x3e\x36\x1a\xe0\x2a\x5a\x70\x48\xec\xc3\x3d\xe8\xd2\x7b\xac\xa3\x5a\x07\xca\xe2\xae\xeb\x12\x58\x70\xcf\x18\x63\x86\x5b\x6e\x8d\xf6\x75\x7f\x08\xd6\x04\x9b\x80\x71\xf1\xc4\xd3\x3e\x72\xc1\x2f\xde\x9d\x2b\x20\xc9\x7b\xef\xad\x4a\xf7\x65\x4a\x9c\xc1\x8b\x77\x37\x2f\xc0\xb7\xd5\x8b\x3c\xd2\xcc\x38\xfb\x3a\xc0\x5a\x90\x1a\x13\xc3\x99\x24\x65\x35\xa5\x84\xd4\x63\xd2\x8e\x47\x96\xbb\xa3\x6a\x15\x7b\x6a\xb8\xa9\xf5\x01\x70\x16\x1b\x60\x18\xdf\x27\x0d\xf3\xad\xa0\x63\xbb\x30\x4f\x21\x1d\xa1\x1a\x6d\x55\xe5\x7e\xb4\x2b\xcb\xb9\xd0\xd6\x06\x6c\xb5\x72\x4c\x31\x6f\xbc\xd1\x96\x70\xed\x9c\x37\x27\x29\x52\xfd\x42\xc8\xe8\xad\xb0\x32\x2a\xc6\x40\x7d\x30\xd3\x7b\x3c\x9c\xdf\xe3\x5f\xa7\xe6\x76\xff\xed\x8b\x47\xce\x2f\xc1\x8f\x6b\x6e\x2b\xe8\x49\x9e\x09\x6a\x39\x8a\x92\x59\xd5\xc4\xbd\x24\x81\xc8\xdc\xba\x42\x00\xc6\xe3\xc9\x88\xb8\x53\x87\x3a\x2a\xa3\x6a\x5d\x2d\x5c\x35\x0e\x21\x24\xd1\x63\x87\x82\x2f\x07\x29\xb4\xa9\xbc\xde\x6e\x5d\x45\x6a\xf7\x9c\x19\xb5\xd7\x41\xf7\xbd\x76\xfc\x08\x45\xdf\x98\x3a\xfa\x91\x39\x93\xb7\x51\x00\x94\x74\xd4\x4f\xcf\x36\xe5\x64\xb7\x2f\x55\xdf\x59\x75\xe0\xe3\xdd\xe3\x37\xb3\x9a\xdb\xe6\xcd\xc6\xf2\xee\xac\x8a\xf8\x53\xe5\x4f\x18\x98\xcc\x8d\x96\xae\xeb\xac\xe0\x51\xd1\x3c\x83\xce\xfb\x1a\x76\x8e\xd1\x72\xdc\x2b\x47\xb9\xd9\x2e\xb4\xfa\xec\x54\xe5\x1c\x28\xac\x05\x99\xf7\x6b\x4b\x7a\xe7\x1b\x1e\x3b\x6f\x98\x52\x21\x0e\x75\xe9\x21\xaf\x40\xc1\x24\x97\xc7\x27\x13\x49\x08\x60\x1b\x49\x42\x80\xa5\x23\xdd\xc3\xa0\x7f\x6e\xd7\x72\x71\x3c\xc7\xe4\xdf\x66\xf0\x27\x62\xf2\xeb\x4b\x3b\xaf\x07\x07\xe2\x31\xcc\xe1\x6b\xe2\x84\x79\x0a\x49\x97\x73\xa1\x34\x66\xc2\x4a\xc3\x0d\x8f\xc1\xba\x39\x5f\x95\xcf\x3c\x69\x3b\xfd\xc1\x99\x0d\xfc\x6f\xb2\xff\xe1\x5c\xc3\x3b\x6b\xc3\x5d\xdd\xfc\xb4\x3a\x61\x9a\xd4\x77\x8f\x37\xab\x29\x77\x9b\xc5\xd6\xaf\xdf\x54\xef\x2e\xfe\x1c\x0f\x73\xd3\xf8\xea\xf6\x0a\x7c\xbc\x7b\xbc\x7d\xbf\xde\x24\xfa\x4c\x53\x9d\xc2\x31\x44\x83\x50\x62\x00\x9f\x15\x75\x81\x7e\x72\x10\x4a\xcf\x5d\x59\x6c\x91\x8a\x05\xe8\x4f\xd3\xc7\xa2\x90\x02\x61\xc4\x10\xee\xa5\x10\x10\x45\x55\x96\x5c\xb3\xde\xe7\x35\xe3\x78\x60\x84\xd2\xba\x5e\x53\xd7\x34\xee\x39\x23\x09\x70\xac\x85\x05\x16\x41\x15\xf6\x10\x23\xc2\x0e\xa2\xe3\xbc\x13\xa2\x8b\xa5\x10\xd0\x96\x0c\x08\xca\x25\x82\xf1\xb4\x2f\x0b\xc9\xf8\x78\xca\x7d\x3c\x50\x42\x30\x23\x5d\xf2\x21\x58\x90\xe4\x29\xe6\x12\x2f\xe4\xe2\x53\xf7\xeb\x33\xba\x7a\x7d\xfd\x0a\xcf\x79\x3d\x4f\x98\xb9\x87\x70\x06\x62\x4d\xd1\xed\xfc\xed\x77\xf7\x6f\x3c\xa3\xbe\x52\x61\x05\x9f\x1e\x6f\xbe\xdb\xf8\x10\x0f\x85\x55\x52\x19\xee\x64\x4b\x9f\xb3\x00\x4b\x7d\xb0\xa1\x2c\xc1\x1e\xa1\x0e\xc3\x68\x95\x5c\xa8\x98\x95\x30\xcf\x98\xf7\x1d\x8e\x87\x61\x1f\x8f\xb0\x6d\x25\x65\x54\x36\xb6\x0f\x53\xe4\x76\x39\x00\x76\x32\x4a\xb9\xe2\x71\xdf\x94\x05\x22\x9a\x26\x61\x6a\xd6\x0e\x65\x61\x5c\x8f\x10\x34\x8c\x10\xa2\x62\x3d\x3a\x04\xad\x16\x28\x14\x42\x40\x5f\x10\xc2\x08\xb4\xc2\x82\x5e\x9c\xf8\x91\x47\x88\xa5\x98\xf6\x77\x9b\x30\xa4\x21\xe5\xaf\xff\x2e\xfb\xf7\x59\xf6\xee\x0c\xe5\xb9\x14\xd1\xfe\x11\x98\x21\xda\xd7\x5f\x41\x5d\xef\xa7\xf7\xfd\x00\x3e\x3d\xdc\xae\x37\xc9\xc0\xe6\xfd\xfd\x0c\x35\x99\x8b\x3b\xdf\xfd\x31\xd8\xdc\xa2\x99\x39\x31\xad\x1d\xef\xaf\x52\x0f\xe6\xf1\xf6\xfe\xfd\xa7\xc7\x6d\x00\xe5\x91\x9c\xe2\xb6\xa8\xb7\xb4\x0c\x50\x1f\x9b\xb2\xc8\xb3\xc4\xe9\x88\x47\xad\x94\xb1\xea\x24\x4f\x24\x0e\x56\x0a\xcc\x00\x2a\x5a\x08\xf3\xc3\x82\xc8\x40\x4f\x08\x3b\x08\x4f\x53\x6c\x63\x9a\x86\xd8\x88\x5a\xcc\x8c\x2b\x42\x29\x54\x34\xa0\xb1\x01\xb9\x53\x67\xc9\xda\x32\x44\x0d\x41\x08\x12\x2c\x19\x2c\x2d\x46\x96\x50\x23\x98\xe3\x96\x0b\xcb\xb5\x84\x22\x06\x84\x31\xca\xa1\x66\x0c\x1a\x46\x31\xc2\xde\xda\x22\x04\x49\xb9\x05\x85\x92\x0c\x02\x69\x31\xe6\x0c\xc3\x29\x7e\x6d\x9f\xc5\xfa\xb0\x98\x75\x64\xa6\x08\xf6\xe1\xc5\xd5\xe8\x7a\xbd\x79\x2b\x9b\x96\xe0\x7c\x9b\xbb\x5f\x82\x29\x3c\xfa\x7e\x35\x2d\xa5\xef\xbf\x58\x43\xde\xac\x3f\x5c\xdf\x3c\xe4\xa1\x2a\xcb\xbc\xc2\x04\xd4\x82\x0b\x87\x02\xc5\x91\x54\x11\x91\x4e\x3b\x55\x70\xae\x00\xcf\x9d\x19\x1b\xcc\xca\x54\xd0\xe5\x60\x9b\xcc\x20\x79\x91\x4b\xb0\x5d\x18\x5c\x42\x43\xf0\x58\x09\x51\xfa\x92\xd0\xbe\x6f\x99\xa7\x3d\xa0\x18\x6a\xaf\x24\x26\xc9\x6d\x73\x2f\x09\x99\xfd\x36\x8b\x4c\x3d\xb3\x25\x3d\xe3\x23\x7e\x99\x76\xb4\x3f\x4d\xdc\xda\x1f\xe3\x24\xae\xde\xe0\x24\xde\x04\x61\xbf\x00\xa9\xa0\x33\x5d\xd8\xab\xf3\x12\xf0\xfe\xfe\xf1\x76\xbd\x79\x15\x81\x5e\x7f\xb8\xbe\x7f\xb0\xa0\xa9\x80\x8b\x0e\xb0\xa7\x01\xa8\x28\x17\x7d\x18\x75\x18\x72\x1c\x07\x04\x58\x89\x76\x9c\x23\x0e\x19\x42\xad\xef\xa0\xb2\x06\x63\x31\x68\x2e\x4e\xe4\x84\x61\xdb\x02\xda\xc6\xf9\x94\xb4\x3e\x95\x73\x2a\xee\xe2\xae\x69\x01\x19\x0c\x53\x18\x8d\x2d\xe7\x85\x2b\x90\x68\xdb\xca\x4c\x8b\xb1\x86\xc8\x55\xcd\x81\xd1\x41\x08\x11\x8f\x82\x90\xd9\xef\x34\x5f\xf4\xc9\x77\xc4\x65\xbf\x97\xfd\xf3\x39\x4f\x7d\x1d\xcc\xbd\x41\xe2\xdf\x7f\x9c\xed\xe1\xbf\x0c\xc7\x39\xd6\x9b\x85\xaf\x8e\x9c\x34\xc9\x08\x6e\x1b\x5d\x0a\xae\xfd\x93\x00\x73\x64\xad\xf7\x88\x42\x5f\xc2\xa6\x4a\x7d\x57\x17\x5d\x15\x25\x68\x0e\x84\x5a\xbf\xb6\x4a\x2b\x23\x38\xf5\xd6\x1b\xef\x8d\xb7\x9e\xb3\xa7\x0e\x4f\x6b\x9b\x1f\x92\x15\x5f\x18\x24\x57\x75\x96\x2f\xcb\xe4\x21\x86\xb2\x77\xb3\xd2\xed\x57\x68\xd9\x4f\xef\x6e\x7f\xd3\xeb\x23\x0b\x26\x9d\xb0\xc8\x49\x0c\x8b\xb8\x23\xcf\x99\xda\x92\x43\xeb\x20\xaa\x66\x6d\x06\x16\xfb\x29\x38\xf2\x5b\x42\x6d\x58\xa3\x28\x1a\x18\xa0\x38\xc6\x2a\x38\x03\x8a\x58\x62\x29\xb7\xdb\xb0\x0f\xd3\xcf\x84\xbd\xe6\x32\x69\x5d\xb5\x69\xfc\x7c\xf6\xb3\x14\x11\x7f\x59\x11\x57\x69\xde\xbf\xec\xb0\x8f\xaf\x92\xe8\xdf\x06\x89\x88\x73\x9b\xba\xa7\x9d\x50\x72\xaf\x02\x26\xb9\x78\xea\xf3\xa1\xdf\xe5\xb4\xd0\x95\x30\x85\x61\x0c\x92\xaa\xd8\x1e\xd5\xa1\x2d\x5c\xe1\x2b\x1d\x4c\x61\x29\x40\x5d\x24\x2b\xa4\x85\xef\x77\x58\x8a\xaa\xf3\xb5\x1e\xe5\x01\x56\x90\x05\x50\xc5\x3e\x4e\x37\x08\x28\x40\xb1\xdd\x31\x47\xeb\xe0\x6d\x8a\xdd\x93\xfe\x45\x58\x6c\x13\x1a\xe6\xf7\xbe\xf0\xe5\xc1\xfb\x3c\x5b\xdd\x7d\x9f\xfd\x31\xb8\xfa\xf6\xbb\x7b\xf4\x52\x61\x5c\xc3\xea\xe9\x50\x81\x7d\x4d\xa3\x88\x9c\x83\x06\xd8\xba\xe2\x16\x94\x12\x06\x18\x62\x75\x30\x8b\xed\x48\x72\x36\x0e\xf9\x10\x4f\x24\x56\x51\x8b\x8a\x03\x19\xb7\x08\xf3\x80\x77\x86\xeb\x79\x7e\x35\x0b\xb7\x51\x6b\x9f\x94\x95\xe6\xf8\x29\x45\x4e\xab\xb3\xca\x51\xe0\xb9\x1a\x05\x13\xb6\x03\xb4\xf6\xda\xd7\x6b\x4f\x9a\xa0\xa5\xdc\xb5\xca\xb9\x30\xed\x49\x4b\x50\x2c\xba\xf5\xf6\xac\x35\xf0\xc5\xab\x15\xad\xde\x4f\xdb\xce\x6b\x26\xc8\xda\x89\xb1\x7b\xea\x68\xde\xe7\xa4\xae\xea\x66\x88\x86\xe3\x1a\xf1\xe8\x0c\x0b\x4c\xaf\xad\x37\xb0\xb6\xf2\xe4\xb7\x3b\xeb\x69\x65\xb0\x75\x32\x69\x24\x6d\x32\xf9\x2c\x96\x75\xaa\x61\x5f\xdc\x48\xff\xf4\xcc\x90\xfb\xa9\x1a\x76\xba\x41\xce\xaa\xb8\x2f\x9e\x17\x6f\x0a\xd9\xb7\x77\x08\xdc\x3f\xac\x17\x67\x55\x59\x70\x3e\xe7\x81\x20\xe0\xc3\x48\x03\x68\x21\x02\x35\x77\x41\x52\xe8\x69\x15\xcd\x71\xcf\xfb\x01\xe8\x30\x0e\x81\x48\x50\xb8\xd8\xd4\x10\x59\x82\xbd\x0b\x18\xf0\xe7\xec\xa8\xcd\x6e\x07\xd4\xec\x9d\x39\x9d\xd7\x8e\x89\x78\x08\x1e\x94\x14\xc7\xc1\xc2\xb2\x97\x82\x58\x87\x88\xb2\x92\xd6\xa3\x10\x22\x57\xd0\xfa\xda\x11\x4c\x39\x6f\x0b\x3b\xe2\x9d\x8d\x8d\x73\x2e\x56\x36\x95\xb0\xb3\xdf\xca\xda\x85\xda\x84\xb5\xcf\xca\x94\xc1\x7e\x7f\x5e\xbd\xff\x28\x61\x1a\xce\x8e\xbe\xa9\xc9\x94\xfa\x4d\x5f\xf2\xeb\xab\xf7\xd7\xf7\x0f\xb3\xb0\xc0\xfd\xc3\x87\xaf\x9a\xb5\xcb\xc6\x17\x65\x6e\xe3\x16\x63\x4f\xf9\x96\x30\x67\x5d\x1c\x12\x0f\x94\x3c\xed\xc2\x6e\x07\x0e\x11\xee\xf2\x62\x21\x9e\xda\x60\xcc\xde\x18\xb3\xf6\x04\x21\x4f\xa8\x50\x52\x0a\x51\x79\xab\xe2\x56\xd9\x7c\x6f\x95\x1a\xd2\x3f\x1b\x2b\x1d\xa6\x8f\x6c\x9d\xdb\xd4\x0f\x37\xd9\x2a\x55\xd7\x3e\x65\x2c\x13\xd3\xab\xcd\x13\x43\xfb\x8b\x9e\xdb\xe6\x66\x76\x41\xbd\xbe\x2d\x5f\x53\xf6\x12\x09\x7e\x8a\x41\xde\xdd\xae\x37\xdf\xbc\xd0\x09\x3e\x81\xab\xb3\xd2\xcf\x75\xb9\x98\xd6\xef\x05\x75\xcc\x1b\x77\xb4\xcc\x52\x1b\x51\x09\x76\x06\xba\x02\x9e\x88\x64\x52\x71\xca\xa4\x71\x0c\xf3\x12\xea\x22\xca\x7c\x8f\x0a\x05\x21\x79\xda\x1b\x44\x1d\x91\x75\x6e\x89\x66\x56\x69\x67\xf5\xda\xc0\xd8\xb7\xaa\x76\xd1\xa5\xd6\xbe\x8b\x99\x05\x0c\xf4\xa8\x09\x7e\x24\xfb\xda\x39\x13\x9c\xd1\xbe\x37\x40\x11\xa2\xca\x22\x1e\x0f\x60\xeb\x79\x3c\x80\x03\x53\xfa\xf3\xb0\x50\xc4\xf4\x71\x17\xb1\x92\x95\x97\x79\x29\xe3\x3e\xee\xe5\x0e\x94\xfb\x0c\x64\x3e\xdf\x6e\xcc\x12\x26\xb5\x92\xcb\x4c\x34\xf5\x0f\xb2\x5e\xc2\xd8\x77\x3d\xe0\xd9\x3a\x6b\xd2\x35\x76\xd9\xcf\x92\xae\xee\x3f\x38\xab\x99\xbe\xb8\xef\x7c\xb3\x78\x7d\x5d\x7f\x44\x80\x5f\xd1\x00\x51\x9e\x8d\x03\xd7\xbe\xab\x62\x35\x57\x4d\x9e\x4c\x9d\x5a\x81\x64\xdc\x4e\xe7\xe5\x50\x59\xe3\xc2\xda\x51\x29\x42\x57\x49\x50\x02\x62\x75\x1c\x94\xcd\x8f\x7b\x3d\x73\xc1\xd4\x56\x5a\xe7\xd4\x5c\x1b\x56\xcf\x7c\x99\xad\x49\xf6\x3b\xb3\x4a\xe5\xbb\x57\xc2\x59\x49\x56\xf5\xfe\xdb\x4d\x5a\x49\xbf\x7d\x11\x83\xfd\xf4\xcd\xdc\x5c\x33\xc0\xc7\x7e\x51\xcc\x19\xee\xb4\x1a\x87\xba\xac\xac\xaa\xf7\xc5\xb4\xd9\x79\x1d\x07\x71\xe8\xe2\xd1\x43\xed\xf5\x72\xd8\x7b\xbf\x4f\x8d\x9f\x58\x3b\xcd\x8d\xf5\xaa\x2c\x4d\xb0\xde\xec\x9d\x97\x80\x00\x8a\x76\x1d\xef\x66\x8e\x70\xf3\x4c\x37\xd5\xf2\x4d\xfd\x6f\xb6\xda\x7b\x59\x17\x7f\x01\x6e\xd7\x89\x32\xf4\x16\x66\xdf\x2f\x43\x6c\x89\x04\x25\x2f\x9b\x32\xc4\xd0\x9a\x03\x8f\x87\xb8\x13\xa0\x37\xf1\x50\x2d\xe4\x53\x73\x39\x96\xf4\xa9\xea\x10\x24\x8e\xb4\x8a\xc9\x43\xd7\xa3\x0a\x1e\x72\x65\x63\xad\x63\x3b\x6b\xe2\x66\xa7\xa5\xdd\x14\xa9\x37\xfc\xa3\xf5\xee\x2d\xff\x6d\xdd\x89\xb1\x7a\xf2\x24\xdf\xe7\xd6\x33\xe7\xfd\x78\xd0\x2c\x30\x15\xb5\xe1\x81\x99\xb5\x0f\xbc\x0c\x5a\x54\x4a\x18\x21\x95\x50\x82\x0b\x95\xf0\xca\xab\x4c\x3f\xb3\x4d\xbb\x0c\xe7\x1a\xc9\x59\x0d\x6a\x73\x73\xce\x7c\xd6\xd7\xaf\x0d\x88\x6e\x2e\xd2\x48\x1f\xef\x2e\x06\x44\x29\x8a\x4f\x4e\xd5\xf9\x4f\xd3\x61\xf3\xa2\xa6\xc0\xc7\xaa\x2c\x40\x37\xf6\x05\xd8\xab\x8a\x6b\x14\x18\x47\xd1\xb3\xbd\x06\x65\x19\x8f\x20\x14\x65\xdc\x9f\xb0\x07\xc7\x58\x4e\xc7\x22\x78\x94\x43\x43\xeb\xbe\x97\xdb\xb6\xdd\xf1\x5d\x65\x04\xb1\xb5\x94\xc6\xe0\xd8\x2f\x03\x09\xb1\xc4\xd8\x21\x18\x8f\x16\xba\x92\xc8\xe0\x9c\xeb\x1d\x41\xe0\xa8\xe2\x81\x1e\x19\x30\xd8\x86\xb8\x3f\x74\x22\x98\xb6\x97\x56\x76\xae\x66\xea\xa8\xfb\x30\x6c\xe7\x9e\xc4\x33\xdb\xd8\x05\xff\x82\xff\x7f\x5b\x2f\xbc\x5c\x56\xe0\x56\xc5\x38\x2c\xf0\xd3\x6e\xf6\x97\xdf\x26\xd4\x67\x3a\xf8\xd8\xc8\x30\x0c\x41\x02\xa3\x62\x2f\x33\x90\xb5\xd3\xbc\x59\xa8\xb9\xab\xb2\x5c\xbd\xbf\xb9\x5e\xae\xbe\xfb\x03\xb0\x41\xff\x18\xdc\xfe\xfe\xea\xee\xfb\xfb\xf7\x3f\x3f\x0f\xdf\x74\x19\xd7\x8d\x88\x7d\x74\x34\x37\x71\x17\xe1\x00\x6a\xa0\xf0\x78\x8a\x30\x9e\x10\x79\xce\x2c\x20\x86\xf9\x3c\xeb\x3e\xf3\xbc\x85\x38\x1e\xe2\x96\xe4\xdb\x85\xf2\x18\xf9\xea\xa8\x71\x8d\x55\x6d\xb7\x85\x37\x15\x63\x65\x11\x52\xcd\xab\x5e\x94\x1b\xb5\x66\x7f\x5d\x0e\x56\xbd\xee\xc7\x1d\x18\x7e\xc8\xc0\x6e\x1c\x96\x45\xec\x23\x4d\x05\xa3\x01\xb0\x00\xf0\x9a\x55\x75\x2c\xc0\xa9\xae\xeb\x3a\x86\xc3\xf4\x91\x65\x45\x3e\x3c\xd3\xb4\xe6\xbe\xcb\xfe\x69\xf6\xaf\xb3\x3f\xcb\xfe\xd7\xec\x7f\xcb\xfe\xaf\xcc\xbf\x72\x9c\x39\x7b\x6f\x4d\xc7\xfb\x4b\x97\xf3\x42\x5d\x4d\x29\xf0\x85\x60\x3c\xf7\x40\xd7\x09\x8b\x70\xd6\x03\xdd\xbc\x66\xe0\x27\xdf\xee\x87\x3f\x7a\xbc\x5d\xaf\x2e\x7f\x67\x5a\x0a\x56\x77\x8f\x0f\xb7\xef\x6e\xbe\xd4\x94\x52\xfb\xe1\x66\x95\x7e\xed\x66\xbd\xc9\x93\x7e\xaa\x0c\xa7\x53\xf2\x70\x3e\xe2\x9d\xef\x7b\x90\x55\x94\x4a\xc6\x71\x87\xa9\x94\x0c\xd7\xa0\xd8\xe5\xc6\xd8\xa1\x2c\x4a\x58\xaa\x92\x51\x5b\x32\x8e\xb9\x11\x98\x12\x81\x60\xa1\xb7\x04\x17\xbc\x78\xea\x06\xbf\xdd\x6a\x09\x8f\x71\x57\x0e\x03\x5b\xd4\x4f\xca\x2c\xab\xa3\x16\x9e\x46\x1f\x25\x76\x3a\xf6\x40\x1e\x4f\x08\xd3\xd8\x51\xba\x86\x42\x48\xe9\x19\xe3\xbc\x61\x4c\x73\x8b\x89\x12\x94\x94\x52\x48\x42\x2c\xc7\xce\x1d\x1a\xe7\x5a\xd8\xe8\xbd\x90\x4e\x6b\x15\x28\x96\x25\xe4\x32\x1e\x29\x35\xb6\x6a\xbc\x10\x5a\x16\xa5\x26\xc8\x95\xfa\x39\xb3\xdc\x6a\xcd\xc5\x94\x7a\x99\xaa\xc4\x08\x21\x41\x52\x5d\x87\x3e\x8b\x84\xb1\xff\x26\xfb\x87\xd9\xaf\xb2\x5f\x67\xff\xef\x6b\xc5\xec\x04\x5b\x9f\x86\xf0\xe5\x02\x3c\xbe\xf5\xc8\xbd\xb4\x9f\xa7\xe1\x7b\x79\x70\xf5\xe3\xdf\x07\x37\x8f\x2f\x9b\xff\xf7\x77\x37\xd3\x52\xbc\xf9\xa2\xf9\xf0\x2a\x97\x3b\xe7\x06\xbf\x7f\xbe\x80\x37\x2b\xac\x31\x25\x58\x60\xc2\x18\x23\x44\x71\x4a\x48\x53\xb9\xaa\x22\x52\x28\xca\x1c\x66\x4a\x11\xf5\xb4\xab\x9c\xb5\x82\x71\xee\xa8\x90\x81\x87\xbc\x11\x08\x53\xcc\x09\xa5\x92\x73\xa6\x04\x21\x78\xb4\xa0\xd3\x16\xc2\xdc\xc7\xae\xde\xf1\x78\xec\xe2\x51\xb4\x1d\x9b\x19\xf6\x43\xa4\xdc\x08\x0e\xa5\xc4\x89\xaa\x5c\x03\xc5\x05\xea\xbd\xec\xaa\x38\xac\x2d\xa5\x0c\x61\x45\x30\x25\x1a\x12\xc6\x21\xa6\x61\x18\x9c\x44\xc2\x68\x29\xe2\x0e\x48\x23\x95\x71\x76\x18\x1c\xe7\xda\xc6\x16\x64\x46\x2a\xdf\x96\x82\x12\x42\x15\x23\x8c\x6a\x42\x85\x40\x84\x44\xee\x19\x46\xbe\xe6\xc1\x9d\x54\x81\x4c\xa9\xad\xb4\x54\x89\x32\x40\x86\xac\xb4\xb2\x10\xad\x30\x2e\x64\x45\xf2\x38\xf6\x6b\x9b\xbd\x4b\xeb\xe9\x7f\xc8\x74\xf6\xbf\x64\xff\x7b\x66\x7f\xda\xe5\xf8\x6b\xd4\xd7\xc3\x26\xcd\xfe\xab\xf3\x48\x5e\x2c\x33\xef\x1f\xdf\x6f\xa6\x87\x53\xb0\x9e\xaa\x29\x33\xbc\xe0\xea\xf6\xfa\xe7\x2f\xe4\xbd\xe4\x2f\x71\x89\xc0\xe6\x5d\x72\xbe\xf0\xb9\x05\x2e\x80\x2c\x00\x1d\xab\xf0\x9c\x85\xe8\x56\xa5\x14\xc2\xa0\xc0\x51\x64\x86\x43\x22\x30\x64\x65\xd5\x20\xc9\x3d\x54\xd4\x10\x8e\x10\x33\x92\x50\x14\x59\x00\x4c\x88\x12\x11\xa0\x9d\xf2\x1e\xc2\xa2\x94\xb8\x94\xa5\xab\x60\x70\x82\x90\x40\x9f\x76\xb2\xa0\x92\x0c\x04\x4a\x88\x67\x22\x5d\xc2\x06\x37\x9f\x33\x2e\x90\x85\x74\x29\x3f\xf3\x0a\x36\x1e\x2a\x03\x20\xe2\x04\x2a\x61\x91\x76\x5b\xd4\x9a\xa2\x42\x03\xd4\x26\x17\x3f\x1c\x57\xd5\x88\x4b\x44\xa9\x04\x34\x84\xc8\x76\x05\xc6\xd0\xda\x29\xfb\xb5\xe5\x41\x1f\x8f\xc7\xc8\x60\xd7\x90\xc6\xbb\x0a\xd5\x2e\x03\x09\x3b\xd5\xad\xf5\x5c\xb3\x3b\x6b\x70\xbf\x46\x60\xdf\x27\xf4\xf1\xf9\xbb\x57\x48\xec\xa4\x25\x9b\xc6\xe5\xaf\x9e\xd1\xe7\xcb\x70\x9b\x1f\x59\x63\x85\x76\xc9\x72\xd6\xa8\xce\xec\x76\xc3\xa1\x6d\x9b\xa6\x05\x94\xc6\x93\xee\xf5\xd6\x46\xc5\x8e\x07\x3e\xa4\xac\x77\x1f\x11\x53\x4a\x40\xa5\x51\x92\x7b\x6a\x80\x3c\x40\x1e\x54\xa3\xf6\x0b\x93\x3b\xc2\x25\x47\x46\x27\xa8\xe4\x73\x06\x18\x68\xb5\x36\x51\x68\x5d\x69\x6d\x47\xe1\x6b\x6f\xfb\xbd\x29\x88\x45\xca\x2a\x6b\x15\x87\x1e\xd2\xe9\x4b\x59\x32\x6b\xac\xab\xb2\xec\x6f\xe5\x73\xce\x69\x52\x5d\x6a\xce\x53\xfe\x75\xf6\xdf\x67\x7f\x96\xfd\xbb\xec\x3f\x66\xff\xf3\xeb\x5e\xd8\xe2\x7e\x5a\x2f\xbf\x79\x97\x64\xa0\xbe\x7b\x91\x81\xba\x04\xc2\xb3\xaa\xc5\x19\x3e\x76\x75\xfb\xda\x9c\x64\x3a\xbe\xee\x9b\x2d\xce\xd6\x92\xaf\xe1\xb2\xf9\x61\x5a\x74\x51\xdc\x03\x5e\x84\x62\xfa\xa2\x44\x1c\x7a\x12\x20\x2a\x8b\xaa\x9c\x6e\x66\x4a\xb5\x62\x04\x3f\xed\x01\x8b\xc7\x65\xc9\x88\xc7\xec\xc9\xe6\x9d\xaf\xaa\xee\x69\xd7\x85\x60\x5d\x08\xa0\xac\xa2\x4c\x27\xdb\x34\x8d\xb3\x4a\x6b\x03\xa6\x3c\x50\xea\x75\xa1\xb5\xd7\x40\xc6\xc6\x47\x15\x0f\x47\x50\xa2\xc8\x62\xd7\xf9\x80\xe2\xa9\xea\xb5\xd4\xa1\x3a\xe5\x9d\xd7\x7b\x33\x05\xec\x11\x8e\x07\x65\x8d\x73\xc6\x2a\xc0\x95\x52\x71\x30\xc6\xc4\x5e\xa9\x83\x79\xce\xb8\xe5\x4a\x48\x26\x8d\x9e\x75\x61\x72\xff\x2c\x56\x3c\x79\x2b\xfd\x61\xf2\x5d\x7d\xd1\x85\x39\x4f\xa8\x37\xd5\xdd\x79\x64\x3e\xde\xa5\x4f\xef\xee\x3f\x3d\xde\x7e\xf7\x7a\x30\x96\x05\x82\x3b\x0e\x51\xd8\xf5\x3d\x37\x8c\x22\xc6\xd8\x6e\x77\x70\x10\xb1\xa1\x44\x8a\x41\xd4\xa0\xda\x0a\xa5\x35\x38\x30\xe2\x30\x5b\x5b\x21\xfd\x60\x7d\xef\xc7\xad\x16\xa5\x2f\x65\x5e\xf8\xde\x37\x95\x67\x74\xec\xf5\xae\x1a\x39\x3f\x78\x55\xb7\xa1\x16\x4d\x48\x98\xa3\x7d\xaa\xcf\xda\xec\xbb\x73\x7f\x6b\xf6\x89\xce\x40\xbe\xba\xcb\xfe\xee\x17\x97\x9f\xab\x19\x06\x7c\x95\xcc\x0e\x93\xa7\xf8\x63\xba\x9e\x57\xb3\xf1\xcc\xed\xfa\x47\x8f\xae\x88\x8d\x83\x03\x87\xf1\x94\x17\x21\x2f\xc7\x63\x59\x83\xa0\x63\x00\x4d\x40\x4d\x54\x16\x96\xf5\x74\x69\x9a\xa7\x1e\xb4\xa1\x28\xab\xa8\x7d\x59\x34\x6e\x0a\x13\x00\x89\xbb\x41\x03\x02\x86\x3c\x84\xae\x0b\xa3\x11\x3c\xfa\xba\xee\x97\xad\xd5\x63\x95\x6b\x42\xe3\x94\xfe\x84\x9c\x59\x4a\xc7\x3a\x57\x94\xc6\xda\xc6\x59\x9f\x74\xb1\xd8\x3e\x9f\xd6\x6a\x81\x5e\xf8\x80\x6f\xaa\x85\x67\xf5\xa9\x73\x5c\xb6\x56\x9c\x63\x01\x05\x9a\x66\x9a\xb4\xda\x5d\x3a\x98\x0b\x34\x7a\x21\xa0\x87\x44\xd4\x56\x7b\x00\x01\xda\xc9\xb8\x97\x73\x6e\xcf\x36\xd5\x8a\xbe\x70\x65\x2f\xf8\xb4\x73\x0b\xe1\xc2\xb1\x4e\xa8\xa4\x0f\xbf\x49\x01\xf4\xe6\x15\x5f\x08\xac\x37\xd7\xa9\xd7\xf3\xd2\x36\xcc\xf2\x76\x14\x89\x85\x9d\x37\xf9\x30\xa5\xf8\x75\x54\xa3\xdc\xd6\x1a\xd4\x00\x8f\x6a\xde\xa5\xa2\x04\x4d\x05\xb6\x15\xe8\x22\x4f\x3f\x5b\x3e\x55\xba\x6e\xad\xf3\xbe\x05\x18\x8f\x2e\x76\xc6\x02\x84\x77\x1d\xcf\xdb\x48\xc0\x36\x92\x15\x8d\x9d\x95\x76\xfa\xf4\xb9\xe7\xc8\x73\xe3\xa5\x55\x8e\x31\xc6\x9c\xb2\xd2\x7b\xa5\xb4\x30\x82\x17\xa1\x04\x3d\x25\xbd\x75\x9a\x89\x05\x9a\x12\xae\x14\xf3\xee\x72\xb8\xb1\x2b\x92\xfd\x9d\x73\xaf\x3c\x4d\x90\xef\x1f\x67\xa9\xcc\x77\xe7\x08\x78\xae\x66\x9c\x8b\xfa\x17\x2e\xec\x0d\x70\x60\x37\x3a\xc0\x76\xee\x74\x02\x43\xbd\x28\xe2\x16\x34\x71\x5b\xd7\xbc\xeb\x82\xdf\xcb\xaa\x8f\x7b\xe0\x63\x97\xa4\xcb\x17\xa2\xf2\x79\x8d\x98\xa3\x30\x38\xb0\x8d\x07\x6e\xa9\x74\x96\xef\x8f\x4a\x18\x2c\xa7\x5b\x2f\xc5\xab\x1a\xf8\x4d\xbb\x52\xd9\xef\x24\x45\xe5\x7f\x91\xfd\xb7\x3f\xae\xb2\xa6\x40\xe5\xe6\xea\x4b\x88\xf8\xf1\xea\xe1\xf6\xdb\x37\x61\xca\x14\x28\xbe\x4e\x89\x56\x97\x3f\x71\x31\x3a\x7e\xb8\xe9\x81\x98\x0d\x3c\xe7\x5a\x64\xbb\xa8\x06\x0f\x08\x2c\x71\x69\x4b\xc9\xa5\xae\xa0\xe4\x8a\x52\x1e\x94\xe3\x8d\x34\xe5\x30\x52\xea\x3a\xdc\xe4\x45\xe5\xb8\xaf\x22\x07\x59\x35\xad\xd3\x5d\x55\x46\x17\x31\x1c\xda\xe7\x6c\x05\x39\xb7\xd2\x5a\x49\x9d\x8b\xbb\xa6\xed\x71\x6b\x3b\x40\xaa\x60\x18\xb7\x94\x54\x5a\xc9\xc6\x28\xc6\x95\x57\x02\x5b\xc8\x09\x95\x8c\x38\x6b\xb5\x28\xa1\x61\xd8\x17\xa5\xca\xb2\x7c\x59\xbc\xf8\x3d\x9f\x9d\x45\xce\x26\x27\x69\xff\x7a\x3f\xe3\x68\x52\x9f\xe0\xf7\x3f\xbe\x6a\x14\xac\x86\x2a\x01\xbb\xf1\xd3\xa0\x83\x2b\xab\xd3\x89\x6b\x47\xf9\xf6\x28\x90\xf2\x4d\x11\x20\xd3\x6b\x1b\x4f\x3e\x9e\xaa\x0a\x9c\x62\x71\x38\xf9\x58\x97\xb5\xaf\xda\x20\x4f\xe0\xd4\xd5\x15\x4f\xf8\x09\xfc\x37\xc2\x4f\x70\xc0\x67\xf2\xf2\xd9\xdf\xb2\x7a\xf1\xde\xec\x9a\xba\x4e\xd5\xe9\x74\x4a\xd6\x47\x6e\xa4\x36\xec\xf7\xc1\xe6\x83\x8b\x3a\x84\x10\xf9\xd9\x7b\x33\xaf\x53\x3d\xd7\x67\xe5\x6b\xcc\xcb\xd9\xf1\xfa\xd3\x17\xcb\xeb\xff\x1f\x2f\x6d\x13\x9e\x54\x1f\xb4\x00\x07\x88\x02\x46\x91\x02\x3d\xd7\xd9\xa7\x90\x31\xd5\x9d\x3d\xb0\xc9\x95\xad\xea\xda\x16\xf0\x2e\x66\xe9\xb4\xda\x87\x64\x63\x6d\xe4\x11\x68\x50\xe6\x03\xa3\x44\xc8\xb8\x9b\x76\x9e\x51\xd8\x29\xdd\xb3\x79\xab\xa3\x9b\x5e\xbf\x0a\x61\xce\xbb\x5a\x60\x36\x7a\xa1\x53\x9e\x7e\x61\xe0\x27\xae\xfd\x05\xb7\x79\x75\xfb\xe1\xcc\xc0\x5f\xae\xee\xbe\x5f\xd7\x6c\x88\x7b\x02\xca\xcf\xf6\x78\xa4\x87\x43\x3e\xed\x7b\x14\x70\xc0\x58\x1c\xe2\x10\x25\x7b\xce\x62\x20\x40\x2d\xb4\x65\xc8\x42\x86\xa9\xa5\xc8\xc6\x4e\x62\xea\x18\xb2\x56\x60\x97\xb4\xdb\xcc\x33\xdb\xd4\x2b\x76\xee\xce\xfd\xdb\x2c\xfb\x70\x4e\xd0\xff\x4a\x09\xe3\xc4\xce\xff\xb2\x8c\xbd\xdf\x7c\xbf\xb8\xbd\xe0\xd0\xbe\x2c\x64\x1f\xef\x6e\x7e\x1b\xdc\xce\xa3\x9f\x2b\x57\x29\x60\xfb\xd8\xda\x20\x01\x6d\xa2\xba\x38\x7a\x02\x1a\x80\xab\x67\x43\xbb\xb8\xcb\xb3\xc8\x3b\x20\xcc\x36\x4a\x26\x05\xf1\x4c\xf8\x5e\xc4\xb2\xc7\xca\xd7\x01\xef\x07\x91\x8b\xe4\x82\xea\xf2\x26\x98\x88\x59\x28\x40\x28\x51\xc0\x50\xa6\xd2\x3f\xe7\xcc\xd9\xe0\x8d\x95\xc9\xe9\xd3\x49\x6b\xbc\xb3\x5e\x13\xc5\x99\xe0\x92\x73\x52\x07\xe0\x95\x1c\x08\x71\x82\x88\xa5\x97\xf2\x60\x22\x53\x9a\xbb\x64\x40\x9d\xf6\xf2\x7d\xd2\x38\xd3\xd9\x77\xd9\x7f\x9a\xfd\xc9\x34\x2e\xe0\x8b\x80\xd5\xea\xee\xe7\x2f\x02\x6f\x8b\xaf\x05\xdc\xe7\x87\x57\x3f\x25\x7a\x75\x81\x64\x9c\x61\x18\x53\xd2\x94\xea\x3f\x8b\x76\x21\xa4\x73\x5a\xf8\x66\x17\x77\xf4\xd0\x58\x4f\xb6\xad\x16\xa3\xd2\x79\xc1\x04\x41\x92\x60\x53\x31\x2f\xb9\xe0\x4a\x30\x14\x43\xae\xad\xe6\x38\x9a\x1c\x51\xc9\x99\xe2\x5c\x59\x26\xb9\x52\xe3\x1e\xf4\x15\x38\x46\x1f\x40\xa1\xe3\xa9\xae\xba\x78\x52\xa0\x6c\x63\xbd\xd6\xc6\x4a\x4a\xad\xe0\xba\xf4\x84\x60\x43\x39\xe3\x51\xe8\x4a\x21\xa4\xa7\xff\xc1\x21\x4a\x89\xa2\x94\x71\xc8\x18\x17\x5e\xd7\x8a\x50\xcd\x28\x47\xae\xc4\x8c\xc4\x4a\xca\xd0\x04\xd7\x6e\x23\x03\xd5\xc1\x59\x3f\xcc\x5a\xd8\x79\x95\x34\x98\xae\x5f\xfc\xb8\xe9\xb9\x77\xf1\xcd\xd5\xc3\xfd\xd5\x3c\x1d\xe6\x41\x38\xfb\x6f\x6d\x66\xa9\x9c\xc7\xab\xdb\x0b\xf0\xe4\xea\xc3\x2c\x09\x7e\xf7\x69\x35\xf0\xc1\xd4\x4d\xe5\x8c\x6a\xba\xa2\xdc\xb6\xa6\xfa\xa1\x5c\x34\x4e\x40\x5d\xc5\x21\xd6\x30\x18\x90\x25\x74\xfd\xf9\x58\x20\x87\x9c\xb3\x8b\xa6\x36\x56\x02\x04\xb2\x63\x3c\x12\xa6\x6d\x10\x84\x98\xe0\xab\x05\x0a\xe3\xb1\xf4\xa5\x37\x18\x85\x32\x97\x5a\xc7\x4e\xc5\x8a\x08\xb0\x45\xfb\x8e\xf5\xb3\x7e\x08\xe0\x9b\x6a\xe5\xce\x9d\xc6\x5f\x26\x6e\x66\x82\x96\xde\xae\x37\x73\x12\xfb\x22\x6a\xf6\x42\xbd\xff\x6d\x70\x83\x3e\x3e\x24\x29\xf7\xef\x1f\x6f\xae\x6e\x36\x37\x9f\x1e\x92\x06\x13\x48\x62\x4c\xeb\xcd\xcd\x43\xbe\xad\xcb\x72\xa1\x76\x18\x73\x0e\x15\xc3\xba\x2c\xea\x16\x71\xb2\x95\x2d\xc0\x04\x97\xae\x74\xd1\xc5\xa3\x47\xfb\x71\xaf\x40\x7b\x88\x10\xb8\x43\x9e\x15\xe3\x29\xaf\x0a\xb0\xfd\x5c\x83\xbe\x2c\x23\xca\x6d\x51\xe6\xd9\xca\x11\x58\x8e\x47\x4e\x0a\x88\xb1\xd0\x04\x41\x5c\x2a\x2a\x0f\x10\x42\x68\x70\x2d\x19\x9f\x16\xf3\xde\x54\x43\x5e\x6e\x31\x16\x22\x1e\x11\xc6\x88\x67\x59\x9e\xed\xf3\x72\xe3\xd3\x9e\xfd\x0f\x5f\xed\xd8\xcb\x69\xc7\x06\x17\x47\xd7\x57\xdb\xf6\x05\xfd\x75\x03\x2c\xd8\x8f\x1e\xd0\x9d\x8b\xa7\x23\xd8\x82\x63\x68\x08\x68\x01\xe3\xa1\x01\x3e\xfa\x53\x2b\xdb\xb6\x6a\x76\xac\xaf\xe2\x0e\x84\x85\xaa\x7c\x5e\x41\xe6\x68\xe9\x3c\x80\x65\xe1\x20\x75\xb0\x74\x5e\x2a\xab\xc4\x11\x20\xcf\x2d\x35\x3e\x5b\x65\x12\x9c\x36\x6e\x2d\xce\x1a\xc4\xb3\x1f\xd3\x79\x41\x5e\xbe\xd2\x52\xfa\x70\xa9\xa2\x5d\xda\xb9\xf3\x19\xad\xba\xd1\x2c\xd0\x78\x00\x19\x20\x38\xb2\xd8\x56\xf1\x10\xb1\x06\x1e\xa0\xb1\x59\x14\xa3\x49\xdb\x55\x1e\xc0\xe9\xb3\xbd\x7c\xb5\x16\x63\x2f\xbc\xe4\x95\x6d\x9b\xba\x33\x8e\x5b\x2f\x92\x30\x4b\xdc\x4a\x29\xb3\x45\xd2\x12\x23\x6b\x9f\xfd\x93\xa4\xa1\x96\x7d\xad\x4d\xf9\x36\xaf\x4b\xf6\x05\xb7\x17\x84\xfd\xcc\xd2\x78\x15\xdc\x27\xb0\x0b\x71\x05\xdc\xd6\x69\xc3\xd8\x46\x02\x6a\x39\x25\xc2\x12\xa3\x78\xaa\x4f\x15\x08\xa9\x48\x79\xc0\x54\xbb\x55\x1d\x84\x93\x02\x2a\xc5\x62\x1b\xc2\xda\x61\x84\xed\x14\xc2\xc9\x1d\xe7\xa5\x29\x28\x4d\xdb\xe1\x09\x78\xe9\x3d\x27\xd2\xbb\xa7\x56\x09\x18\x10\xcb\xfb\xb1\x99\xe6\xaf\x3d\xfb\x4e\xff\xad\x34\x9a\xb3\x43\xf9\xab\x08\xe8\xc3\x79\x15\xfa\xf0\x66\x85\x02\x5f\x79\x72\x4f\x61\xa4\x8f\x16\xb4\x4f\x0e\xd0\x5c\x2f\x4a\xe9\x83\x35\xcf\x59\xbb\x17\x3b\xef\x2b\x53\x79\xc3\xc6\x6a\xdc\xd6\x35\xd0\x92\x7a\x22\xa3\xb4\xc6\x68\xb7\xb6\xc2\xbb\x10\x0e\xe6\x18\x8c\x35\xc7\xc0\x02\xd5\x46\x49\xa5\x6d\x88\xa7\xc8\x40\xa3\x1d\x77\x86\xf2\x4a\x29\x9d\x2d\xb2\x3a\xdf\x27\x7f\xb9\xb3\x56\xd1\x14\xad\x9c\x71\xdc\x2f\x9d\xb1\x37\x2c\xae\xba\x02\x99\xa0\x0d\x9b\x76\xdf\x1f\x4c\x00\x9a\x30\xa7\xd8\x21\xb2\x25\xfd\x3c\x54\x8b\xe2\xe9\xb4\x76\xcf\x99\x36\x44\xf1\xb8\xad\x1b\x40\x85\x60\xda\x1e\x22\x0f\x53\x5c\xb0\x58\xea\xec\xb8\x16\x4b\x7f\x8e\xd7\x67\x55\x9b\xb3\xe9\xdf\x52\x83\x43\x84\xd5\x94\x8d\x2f\xfd\x93\xce\xf1\x34\xd9\xcb\x2c\xcf\xbb\x14\x4b\xb8\xec\x77\x92\x82\x56\x2a\x62\x5f\x48\x78\x73\xdf\x3a\xf5\x3a\x7e\xdc\x1c\xbe\x99\x15\x4b\x3f\xad\x02\xc7\xc0\x3d\x55\xdb\x30\x80\x3d\x62\x2a\xc0\x12\x84\x48\x99\xe8\xab\xd4\xb8\x4a\xdd\x61\x0d\xaa\xd8\x20\xc5\x9b\x3d\x5a\x3b\xe3\xc3\xd8\x47\x14\xbd\x04\x06\xf4\x79\x6d\x54\xf4\x88\xb1\xd0\xb8\x61\x08\x7d\x8a\x89\xaa\xbe\xb2\x4d\x10\x59\x06\x96\x3c\xa3\xe9\xf5\xfd\xfe\xab\xce\xcb\xfd\x17\x0f\xb7\xaf\x5f\x8d\xf3\x10\x81\x2e\x22\xa1\xb6\x09\x76\x3e\xfd\xff\x21\x6d\xa0\x35\xd2\xb2\xdd\xe3\xb5\x43\x46\xfb\x43\x33\xe5\x3e\xee\x34\xe3\x22\x4f\xbe\xd9\xcf\x1e\xfe\x79\xe6\xf2\x6a\x63\xd7\x36\xfb\x36\xfb\x3e\xe1\x56\x6e\x52\x55\x24\xf5\x9e\xe7\x32\xec\x8b\x50\xdb\xc5\x5b\xef\x18\x00\x0e\xe1\x50\x72\x63\xeb\xb2\xca\xcb\xc8\xf3\x00\xda\x2a\x09\xe8\xb9\x27\x07\x74\x14\x6b\x75\x00\xd9\x93\x00\x38\x78\xa6\x79\x13\x4c\x2a\xb6\x76\xde\x03\x9e\xd6\xe4\xe4\x33\x31\x6b\x12\x5d\xd0\x8d\x2f\xaa\x0b\x37\xd7\xdf\x7e\x77\x83\xce\x02\x28\xaf\x02\x10\x70\x7b\x49\xa4\xe6\xf0\xe5\xfb\x8f\x0f\x57\xef\x2f\x4c\x75\xba\xe2\x3f\x74\xd5\x12\x7d\xde\xaf\xd0\x0f\xbe\x06\x5d\xee\x25\x72\x58\xd0\x58\x56\xca\x4b\xaf\x4d\xd3\x8a\x71\x17\xf7\x5c\x39\x20\xf1\x69\x27\x86\x2d\x06\x7a\x17\xb7\x55\xc8\x49\xc8\xf1\xaa\x8c\x83\xd6\x71\x1f\x7b\x86\x11\x94\xdc\x22\x18\xb0\x10\x42\x32\x81\x7d\x03\x24\x67\x7b\xed\x38\x15\x7b\x49\x82\x34\x85\x10\xa0\x31\x6a\xd6\xf5\x59\x81\xec\x99\x6f\xca\x05\x4e\x5e\x6a\x73\x77\x34\xfb\xb1\xd7\xe9\xfb\xb4\x1a\xbf\xa8\xa7\x4f\x6f\x76\x53\x6a\xc5\x24\xb6\x8c\x7c\x26\x75\x4e\x65\x7d\x10\x20\xcb\xe1\xbe\x92\x61\x1b\xf1\x8b\x56\xd7\x02\x3f\xed\x95\x2a\xab\x52\xe4\xfa\xa9\x5d\xec\x5b\xed\x98\xe5\x8a\x2b\xaf\xb9\x8b\xd6\xb9\xa4\xbd\x93\xb4\x06\xd1\x34\xab\x3f\xcc\xf9\xe9\xd5\xac\x26\xf4\x06\x9c\x71\xf5\x3a\x33\x9d\x42\xba\xab\x29\x09\xda\xdc\xe5\x6c\x57\x69\x60\x40\x31\x85\xc0\x07\x73\x88\x87\x29\xed\x5c\x16\x91\x27\xbf\x14\x35\x1e\x99\xad\xac\xb6\xbe\x01\xc8\x8f\x75\x47\xa5\xeb\x1b\xfc\x9c\xed\x45\x17\x78\x68\x0e\x79\x87\x99\x65\xa8\xf2\x75\xed\x2b\x3f\x12\x67\x84\xf6\x82\x59\x59\xed\xc0\xde\xe8\xb8\x67\x2c\x68\x2a\x52\x3f\x49\x6e\xc2\x8a\xbe\xb0\x62\x7f\xf5\x15\xee\xf6\xd5\x05\x7f\x09\x38\x1f\xde\x26\xdc\x3f\xda\x35\xc4\x4a\x8d\xf5\x34\x5c\x0b\x38\x32\xed\x14\x0b\x5c\xd8\x23\x19\x87\xb8\xab\xfa\xbe\xc6\xa7\x1d\xef\x1a\x01\x04\x60\x63\xb5\x40\x23\xcf\xbb\xb1\x4e\x80\xc2\xdc\x80\xe1\xf3\x70\xf9\x6a\x45\xc7\x83\x98\xd2\x64\x21\xb4\xd0\x9c\x16\x4d\x09\x0e\x5a\x74\x94\x7a\x41\xc5\xc0\xb0\x17\x95\x97\x56\x00\x3e\xed\x2d\xbb\xe9\xea\x2f\x00\x05\xa7\x8d\x59\x57\x17\x2d\x85\x39\xb6\x38\xbf\x99\x37\xf2\xfa\x37\x9f\x56\x67\x7d\xca\x05\xaa\x11\xce\xbb\xcf\xf5\xaa\xfe\x41\xad\x64\x29\xad\x68\x61\xcf\x31\x2c\x7f\x68\x41\xa0\x71\xbb\xd8\x3e\x91\xc5\x76\x5d\x21\x8a\x23\xe2\x46\x6c\x35\x34\x65\xc9\x16\x92\xb5\x49\x74\x31\xcb\xf2\xfc\x94\x70\xde\x36\xe9\x8c\x9d\xd9\x84\xbf\x07\x2e\x6a\x42\xd9\x52\x87\x6a\x6f\x77\x9d\x17\xa6\xc2\xc4\x82\x6c\x6d\xc5\xe9\x60\xb7\x3b\x5e\x87\xa7\x62\x41\x28\xb5\xc9\x67\x2f\xcf\xf4\xb3\x5b\x56\x8b\x7d\xf6\x77\xb3\x8f\x53\x76\x7d\xd1\xb5\x9e\x67\xc6\x7a\x73\x77\x11\xe8\x7a\x2d\xf2\x52\x83\x1e\xa2\x8a\x20\xe0\x23\x64\xaa\x72\x78\xd7\x09\xa1\x24\x28\x7c\x6c\xf2\x42\x09\xc5\x3c\xd7\x52\xe8\xed\x71\x41\x19\x25\x5c\x05\x23\x23\xc7\x64\xda\xe1\x80\x63\xd4\x87\xd6\x53\x2a\x15\xd7\x8a\x0b\x77\xa8\xe6\xf7\x23\x57\x22\xc5\xe4\x7f\xff\xbc\x43\x97\x8b\x73\xcd\x7a\xda\xd7\xbe\x79\x77\xfb\x70\xff\x2e\x49\xd1\x2f\x8e\x01\xa2\xa3\x13\x5c\x5b\x5b\xab\x5e\xe8\xc0\xa9\x6f\x2a\x51\x5a\xca\xd6\xba\xec\xea\xb1\x89\xad\xd2\xa1\xdb\x06\xd7\xb6\xce\x03\x04\xa0\x7f\x3a\x80\x02\xf8\xb8\xdd\x5e\xf2\x22\x97\xea\x0a\xd7\x49\xd3\xfb\xbc\xd2\x66\xb3\x8a\xc8\xe6\xee\xfb\xb9\x35\xb9\x7a\xbf\x49\x1d\xba\x57\x53\x72\xf3\x3e\x2d\x42\xcb\xcb\x9c\x3c\x0b\x8f\xac\xee\xbe\xdf\xcc\xdd\xcc\x7d\x80\x30\xdf\x8d\xd5\xd3\x91\x80\x12\x64\x5c\xee\x19\xf0\xdc\x88\x53\x3f\x36\xb9\xaa\x0c\xe8\xe3\x3e\x6e\xa5\xee\x4c\xa8\xeb\xed\x56\xc6\x2c\x1e\x83\x34\x0d\x08\x38\x1e\x8f\x7c\xd8\x12\x50\x03\x18\x77\xf1\x40\x81\x07\x46\xa8\xd8\xf3\xdc\x63\xc9\xb7\x75\x34\x2b\x85\x51\x69\xe2\x56\x78\x48\x08\x66\x8e\x33\x4a\x29\xef\x88\x30\x95\xf4\x5a\x1b\xe9\x65\xc5\xc2\x16\x74\x88\x69\xb9\xb5\x4e\x32\xb1\x93\xb4\x32\x1d\x43\x61\x0a\x4f\x98\x97\x1a\x63\xca\xb3\x6c\xb9\x60\xcf\x2a\xe9\x1b\xff\x2c\x7b\x9f\xfd\xee\xcb\xcc\x9d\xfb\xfc\xe0\x4d\xc0\xf3\xcd\xbb\x4d\xbe\x98\x8d\x1f\x97\xa4\xc6\x78\x51\x3c\xf5\x54\xb8\x1a\xa8\x7a\x8a\xba\x90\x52\x14\xd4\x0a\xd5\x50\x8d\x43\xc0\xa1\xaa\xd6\x8e\x06\x1b\x2a\xaf\x00\x79\xce\x9e\x4a\xa3\x60\x83\x44\x3e\xc4\x2e\xb6\x04\x68\x40\x31\x8e\x75\xdc\x09\x40\xb2\x6c\x91\x39\x70\x48\x3c\xf0\xcb\xba\x79\xf3\xf0\x32\x07\xdf\xaf\x37\xd3\xe0\xce\x36\x32\xcb\x9b\xbb\xef\x17\x97\xc0\x21\x1b\xdd\x82\x96\xb0\xc2\xe5\x02\x7d\xee\xd5\xa1\xc9\x05\xe0\x42\x5a\x50\x0e\x96\x8b\x51\x8f\x0a\x02\x3a\x4c\x7b\x42\xbd\x2c\x3f\x1f\x57\xd6\x13\x8a\x38\xf3\xac\x21\x05\xa1\x44\x86\xca\x31\xca\x2b\x19\xfb\x28\x7d\x35\xfb\x3b\x4d\xeb\xe7\xf2\x78\xce\x10\xe6\xec\xee\xa2\xfb\x75\xfd\xed\xfa\x77\xc0\x4f\x95\xf4\xd2\x24\x48\x62\x18\xbf\x00\xb7\xd9\xea\xd2\xfc\x5e\x7d\x7a\xbc\xf9\x2e\xef\x62\xbb\x12\xed\x16\x9c\x98\xf1\x9c\x46\xc7\x38\xe6\xba\xf1\x26\x54\x3d\x50\x74\xac\xe3\xbe\x53\x80\xe1\xc3\x56\x34\xb5\x00\x7b\x20\xa1\xe0\x90\xc6\x53\x14\x1a\xd8\xfd\xe8\xf3\xc6\x05\xb0\x6b\xc3\x68\xba\xa5\xf6\xc6\x29\xeb\x9c\x90\x22\x48\x5e\x22\x2d\x55\xe5\x9c\x70\xbc\xb2\xa0\x09\x78\x2b\x2d\x27\x62\x90\xc4\x57\xa0\x70\x90\xd9\xb8\xaf\xbd\xed\x1d\x23\x94\x25\x2d\xda\x65\xea\x67\x57\x2b\x92\x6a\x10\xff\x38\x23\x2f\x15\x88\xb3\x13\xcb\x9b\x8d\x01\x7c\xd9\x18\x66\x6d\xb2\x34\xea\x79\xe7\x8e\xb1\xd1\x80\x2e\x04\x60\x80\xca\x38\xc4\x7e\xa4\x4b\x1e\x03\x57\xc1\x5a\xdd\xb6\xa0\x24\xe3\x36\x1e\x50\xd5\x0c\xd3\xe6\x70\x10\x6d\xd0\x20\x00\x14\x87\xb0\xc0\x4f\xbb\x15\x51\x83\x0b\xba\x91\x7d\xd8\xea\x5d\x2c\xbc\x12\x5e\x59\xed\xcb\x1a\xe5\xda\xc8\x38\x90\xb4\xd0\x02\xce\xb1\x57\x55\xd8\xa5\xeb\xa2\xa6\x5c\x7d\x25\x92\x8b\x49\x06\xfe\x10\x3c\x24\x00\xd5\x5b\x1f\xeb\x29\x4c\x9f\x11\x18\x7f\x00\xee\x7f\x09\x52\x02\xf7\xf5\x3e\xf7\xe5\x7a\xbd\xbb\xbe\x79\xc8\xfb\xbd\x0b\x06\xb0\x50\x95\x70\x89\x65\x60\x0a\x79\x8a\xd0\x53\x49\xf1\x02\x8e\x30\x00\x07\xa4\xed\x14\xac\x48\x3d\xee\xb8\xab\x9d\x72\xd3\xd0\xda\xb1\xe9\x94\xf2\xf3\x55\x1b\x2a\x05\x2c\xce\x39\x68\x0a\xce\x40\x10\xb6\x1a\x10\x42\x91\xb7\xa5\x2f\xf5\x89\xa2\xd8\x4a\x8c\x0a\xea\x58\x23\xad\x16\xda\x09\xaa\xb8\xef\x40\x2d\x55\x3c\xa5\xeb\x75\x32\xd4\x85\xbc\x35\x26\x9b\xf6\x91\xdc\xae\xfb\x15\x7d\x71\x6b\x7c\x71\x9f\xb8\x4a\x66\x71\x53\x3a\xbd\x68\xab\xdc\x8e\xbe\x1a\x7d\x6e\xcf\xae\x21\x36\x79\x77\x52\x1b\xa7\x88\xe4\x14\xab\xdd\x6e\x97\x30\x33\x72\xd3\x2d\xf7\x67\x8c\xd6\x79\x7f\xbd\xba\xf9\xee\xf7\xc0\xeb\x29\x7c\xf5\xf3\xa4\x3d\x78\xbe\xc2\x53\x58\x79\x7f\x01\x35\x98\x55\x01\x70\xdc\x8d\x3d\xa5\x66\x08\xde\x1c\x06\x20\xc8\xe8\x62\xe3\x3c\x06\x0e\xc7\xdd\x73\x26\x5a\xaf\x41\x05\x50\x94\xf1\x08\xca\x17\xd4\xc3\x72\x1f\x0f\x21\x1e\x24\x33\x53\xd0\xa5\x1d\xac\x61\x2e\x35\x8f\x83\xf5\x8a\x49\x30\x45\x53\xba\x03\x30\xf8\x78\xd6\x21\xd7\xcf\x62\x63\x97\xc7\x34\x2f\x3f\x4d\x01\xf0\xfb\x17\x25\xca\x0f\xef\xf3\xcd\xf7\x1f\xe6\xd6\xe5\xea\xad\x02\xd7\xeb\xcd\x09\xac\xee\xbe\x5f\x71\x40\x4f\x3a\x9e\xe2\x6e\xac\xdc\x2e\xee\x0c\x60\xe0\x50\xed\xb6\x40\x03\x54\xf9\xde\x05\x1e\x3b\x51\x75\x36\x54\x75\x07\x4a\x39\xd6\x27\xa1\x9a\x80\x0f\x83\x38\xb5\x2a\x71\xd8\x1a\x0c\xe0\xf2\x18\x7a\xbb\x0d\x4a\xee\x9d\x0d\x94\xc6\x93\x43\xa8\x12\x4d\x2f\x35\x69\x9d\xf5\xa2\x31\x96\xd5\x1d\x38\x49\x19\x6b\x42\xbd\xa4\x12\xb0\x46\xb8\x01\x64\xc8\x35\xd9\xdf\x06\xfb\x67\xbe\xea\xd7\xe2\x47\x7e\x31\x17\x9c\xe0\xab\x0c\xe5\xd2\x61\x79\xfb\xfd\xea\xaf\xf4\x59\x4b\x5c\x82\xd4\x5d\xcb\xd5\x14\x1b\x5a\x9f\x3e\x80\x98\x92\x51\x9b\x80\x6f\x21\x52\x57\x16\x4d\x59\x3a\x04\x01\x8d\x7d\x4a\x0b\xa6\x83\x8f\xd2\x13\x22\x5a\xa0\xf7\xd3\xc7\x5a\x8c\x65\x0e\x6d\x6c\x5d\xac\x7d\x5e\xbc\xfa\xe6\x84\x31\x42\x90\x52\x6a\x9d\xf6\xda\x59\x91\x33\x4e\xed\xce\x38\x77\xf4\xfe\xe0\x52\x4d\xb6\x7c\x16\x2b\x97\xf0\x05\x17\xac\x18\x7d\xed\x10\x3b\x65\x7e\xb7\x73\x3d\xfa\x2b\x9b\xfc\x9b\x4f\x0f\xef\x2f\xba\x71\x73\xe9\xe5\xfb\xc7\x9b\x05\xf5\x04\x08\x42\x76\x63\x09\x0c\xc5\x27\xca\x6d\x53\x54\x15\xc0\x4d\x24\xe9\x34\x1a\xa0\x8a\xaa\x00\x22\xd6\x45\xd9\xb5\xb2\x69\xcc\xce\x24\x19\xc4\xb5\xc5\xda\x29\x31\x45\x75\x42\x4a\xae\xea\x71\x57\x55\x55\x94\xd3\x27\x45\x08\xe4\x1e\x21\xee\x7d\x10\x41\x59\xd7\x26\x6c\x04\x7c\xe6\xab\x6e\xed\x13\xeb\xf6\x3a\xfb\xbb\x69\xde\xdd\x3f\xbe\xdf\xdc\x5c\x5d\x84\x18\xce\xd7\x26\x65\x24\xaf\xab\x03\xb7\xaf\xab\x03\xd7\x37\xd7\x79\x18\x50\x05\x01\xb4\x4f\xdb\x96\x34\x00\x6e\xeb\xd8\x4c\x81\x68\x00\x55\xd4\xb9\x52\x32\xf1\x32\x48\x1f\x92\x75\x9f\x5f\xd4\x51\xaf\x33\x8f\x55\x3c\xba\x54\x22\xae\xa2\xf3\x66\xdc\x9e\xa4\x2c\x7c\xc1\x65\x4a\x1c\x77\xa0\x51\xce\xa9\x6c\x95\x17\x69\x3e\xd9\xf4\x2a\x67\xf5\xdb\xb3\x2f\xe7\xf5\x6d\xca\x08\x53\xa6\x9b\x18\x38\x6f\xba\x8f\xf9\x5c\x15\x7f\x97\xda\xdb\x57\xb7\xd7\x79\x51\xfb\xba\x76\xf1\xe8\x43\x5d\x79\xbf\x40\x8c\x51\x85\x34\xc6\x1d\x9c\x62\x84\x64\x12\xb7\x42\x73\xe3\xb4\x1d\xb5\x5d\x94\x40\x3c\xd5\xc0\x2f\xf4\x5f\x0c\x73\xab\x2c\xe7\x91\xc7\x96\x9f\x80\x07\x28\x3f\x45\x01\x92\xf8\xfd\x21\xcb\x96\x39\x7f\xe6\x2b\xbe\x26\xe9\x35\xfe\xee\xac\x25\x99\xd4\xad\xd2\x48\x4e\x41\xdb\xe3\xf9\x15\x7e\xe1\x39\xe5\x26\x0f\x71\x40\x80\xea\x31\x0b\xd8\x55\x68\x38\x1d\x07\x60\x43\xac\x42\x02\x20\xac\x89\xdf\x45\xe9\x3d\x40\x7e\x37\x3a\x80\xc6\x6e\xe4\xd6\xe6\x5d\xe4\x49\x24\x68\x99\x8b\x67\xb3\x0a\x6b\x9d\xee\xaf\x39\x76\x79\x41\x73\xbe\xb0\x8a\xa7\xff\xf1\xea\xac\x11\x90\x10\x9f\x79\x30\xa1\x09\xce\x0d\x4f\x7d\x6b\x40\xd3\x00\x2c\x84\x65\x32\xee\x1c\x73\xce\x2f\x87\x0b\xc7\x2d\x44\x1a\x66\x75\xaf\x21\xd2\x5d\x7b\xb2\xc7\x3d\xe3\xf1\xd0\x89\x79\x3f\x32\xcf\x3c\xc7\x09\x53\xfa\x12\x77\xbf\x7b\xe5\x97\x55\x3b\xdb\xd9\xd6\x04\xcc\x2b\x4c\xc5\x76\x6d\xf8\x14\x76\xc7\x23\xf6\xf6\xf3\x71\x51\x32\x5a\x9d\x52\xde\x9d\x93\x67\xb7\x62\x6b\x95\xfd\x2c\x55\x4a\xbe\xe0\xc1\xc1\xb9\x54\x72\x7d\xf3\xe2\x79\xfc\x70\xb3\xc0\x92\xa9\xa3\xf6\x84\x01\x15\x6d\x97\xe3\xed\x74\x43\x7b\x8b\x87\x56\xc4\x03\x80\xcb\x5e\x11\xb7\xdd\x73\xa5\xaa\xd8\x7b\xff\x9c\xf9\x28\x19\x73\x4e\x88\x1c\xcf\x7e\x6e\x69\x2e\xe9\xb5\x39\xc7\xd7\x3f\xe1\xf1\xff\xcd\xc5\x9c\x23\x77\xc9\x5f\xfa\x39\xeb\xbd\xd1\x26\xd8\xca\xee\xf5\x36\x67\x0c\x3b\x4c\x97\xdb\x34\x44\x7a\xbf\xab\xf7\xdd\x13\x59\xd4\xd1\xf6\x06\xa0\xbc\xcc\xa1\x71\xd4\xeb\xd9\x6b\xcf\x3f\x8b\x15\x5b\x67\x67\x5f\xd8\xdb\x57\xbe\xb0\xb7\x79\x93\xeb\xd4\x87\xad\xe2\x09\x14\x87\x75\x16\xc6\x36\x3c\xf5\x0b\x16\x72\x31\xfb\x6e\x80\xd3\x46\xae\x6d\xf6\xbb\xd9\x1f\x67\xff\xe7\x45\x91\x2b\xb5\xe9\x2e\x63\xf4\xe9\xf1\x7c\xba\xa0\x1b\xff\xb2\x67\xc1\xfd\xd5\xed\x9c\xf4\xae\x37\x9f\x7e\x05\xde\xbf\x2a\xf8\xa6\x5f\x59\xcd\xf4\xbc\x97\xdf\xf8\xfa\xb9\xdb\x87\x9b\xfc\xa4\xa8\x29\x61\x3c\xc6\xa1\xac\x9c\xf3\x65\x6b\x1c\x37\x56\x22\x64\x43\xad\x4d\x09\x17\x4e\xb2\xf3\x0f\xc0\xda\x7b\x0f\x3b\xe3\xa8\x9b\x7e\xc0\x84\xda\x98\x12\x02\x14\xc2\x5f\x0c\x6b\x1a\x25\x95\x5e\x33\x5d\xd5\xda\x20\xa5\x98\x81\x30\x9e\xd2\x2f\xc5\x23\x34\x72\x6c\xa8\x72\x1a\x22\x53\xd7\x46\x23\xfd\xf2\x47\xcb\xca\xc7\x63\x69\xd5\xb0\x86\xab\x4a\x28\x82\x10\x29\x05\xe6\x65\xa1\xb8\x41\x82\x15\x25\x44\xd8\x89\x12\x96\x25\x95\x97\x67\x05\x4c\xcf\x52\xf9\xf2\x2c\x2c\x41\xf1\xd9\x95\x1e\x04\x4a\x8a\x92\xa0\xc0\x0b\x88\x88\x50\x04\x43\x0c\x05\xe1\x48\x13\x3e\x3d\x03\x21\xaa\xd8\x8f\x9f\xb2\xd9\x6f\x65\x32\x27\x67\x1d\xa2\xdb\x17\xec\xb7\xcc\xfe\x3c\xfb\x0f\x2f\x1a\xd7\xf7\xd7\x8f\xef\x37\x49\xc0\xe0\xab\x9d\x2b\x05\x6c\x77\xeb\xdf\x01\xef\xdf\xd8\x84\x5e\xb6\xf4\x7f\x90\xdf\xff\xfc\xf1\x7d\xfe\x02\x37\xb9\xdb\xdc\x3d\x26\x4d\xec\xd7\x15\xcc\x75\x90\x42\x73\xf5\x54\x86\x4a\x5a\x02\x8f\xb1\x79\x21\x03\x4e\xab\x88\xa6\x00\x0e\x1d\xa6\x4c\xd5\xc9\xcc\x30\x1d\xab\x63\x19\x05\xa4\x9a\x5b\x6d\x0b\x82\x21\x2b\x1c\x6a\x2a\x65\x02\xab\x34\x87\x1d\xec\xcb\xc2\x17\xe5\xb8\x0d\x56\x59\x17\xb9\x76\x3d\xaf\xd6\x9e\x49\x29\x05\x3b\x70\xc5\x28\xb3\x4c\x33\xcd\x2c\xcc\x65\x69\x28\xab\x38\x2c\x51\xc7\x58\x33\xfd\xcb\xbd\xc3\x9d\x35\x81\x0e\xae\x60\xd0\xc2\xe7\xac\x16\xcc\x32\xd1\x0f\xa5\x2b\x7d\x5d\x5b\x50\x72\x69\x8c\xe0\xd2\x73\x73\xd1\xc0\xcf\x8b\x54\x6b\x9b\x6b\x05\xf7\xaf\x1d\x12\x2e\xee\xc9\xf3\xcd\x7f\x76\x8f\x7b\xa9\x73\x5c\xcf\x01\xee\x5c\xf8\xba\x7d\x7f\xf3\x70\x53\x2f\x8a\x7a\x01\x9f\x0e\x53\x40\xb8\x20\xe1\x07\x16\x16\x65\x72\xd6\x3b\x01\x02\x76\x11\x4f\x91\xe1\x67\xb9\x42\x4f\x1a\xa1\x65\xf6\xb9\xd0\x46\x01\x1c\xb6\xfb\x29\x46\x5b\x33\x4a\x35\x89\x47\x16\x0f\x6d\x0b\x20\x03\x25\xd9\x31\xc6\xa2\xd3\x08\xc6\x83\x25\xd8\x28\x75\xe0\xd9\x26\xd3\xe0\xb4\xe9\xd6\x32\x83\x29\x86\x99\xd1\x10\xbf\xce\x32\x70\x3b\xbb\x54\xdc\x4d\x77\xc8\xd9\x1e\x26\x2d\x55\x8b\x4f\x8f\xb7\x9b\xfb\x87\x0f\x67\x37\x92\xaf\x5c\x9f\xe6\x26\xcb\xdd\xe3\xed\x6a\xfe\xb1\xd7\x52\x6d\xb9\xe3\x26\x9e\x64\x6b\xb6\x94\x92\x85\x88\x3d\x02\xee\x34\xa0\xda\xb3\x0a\x15\x2d\x25\xf9\x6e\xc1\x63\x5f\x40\xe0\x62\x4b\x2b\x5c\x98\x82\x1f\x0c\xb7\x07\x59\xeb\x9e\x50\x02\x04\x2e\x3b\x46\x9f\xd8\xca\xfe\xe0\xab\x25\xff\xdc\xa5\xe3\xd8\x2a\x4b\xd5\x8c\x35\x73\x4c\x13\xc4\x00\xa1\xcc\x15\x47\xcb\xa8\x65\x04\x52\x64\x18\xe5\x32\x08\x4b\x84\xf6\x76\x7a\x2a\xda\x08\x01\xe1\xcf\x99\xc8\x36\xf9\xe9\x99\xa7\xfe\xd7\x65\xbe\xff\x3a\xfb\xb7\xd9\x9f\x7f\x71\xdc\x7c\xb8\xbf\xba\xf9\x29\x0f\xb0\xc7\x73\x14\x97\x0c\x38\xaf\x2f\x86\x60\x3f\xa6\x7f\x5e\xdf\x3c\xfc\x24\xfb\x53\xd6\x00\x56\xa0\xa8\x22\x13\xc0\x47\x75\x31\x81\x05\xcd\x13\x66\xb2\x16\xbe\x2c\x76\x08\xf1\x94\x01\xbc\x10\xf3\x17\x4a\x4a\x4c\x90\x40\xf8\x60\x95\x84\x28\x42\x22\x2c\x1f\x42\x3e\x30\x46\x8f\x9c\x50\xb2\xdb\xad\x85\x6f\x5b\x1f\x4f\xd6\x4a\x2d\xb5\x30\xc0\x30\x5d\x1d\x10\x42\x08\x93\xa3\xec\xa5\xec\x84\x68\x62\x29\x24\x74\x25\x03\x52\x6a\x85\xd0\xae\x43\x4a\xea\xf1\x90\x87\xb8\xa3\x58\x10\x4e\x5b\x99\x65\xd9\xdf\xca\x14\xc0\x89\x0f\xf6\x21\xb1\x63\x67\x05\xc5\x5f\x65\xbf\xce\xfe\xbb\xb3\xcb\xe4\xac\x58\x73\xc6\xdf\x7e\xf9\xea\xee\xe7\x8f\xe9\x8a\x6f\xee\xd0\x87\x2f\x2a\xea\x8b\x8f\x77\x37\xd7\x2f\xf0\xb1\xbb\xc7\xdb\xeb\xb7\xbf\x9f\x7e\xeb\x22\x7a\xb3\xf8\x98\x7e\x80\xe5\x36\xe4\x9a\x69\xe1\x59\x64\xe3\x16\x30\xc9\x89\x41\x71\x88\x16\x0d\x43\x6c\x81\x38\x22\x60\x81\x1a\x7d\x38\x2b\xb2\xef\x20\xc2\xd1\x3f\xed\xb6\x5b\x20\x3a\x88\x79\x0f\x6a\x20\x03\x50\x52\x31\x47\xe2\x10\x35\xea\xda\xd8\x84\x61\x00\x72\x87\x4a\x28\xf6\x6b\x22\x44\xac\x94\xa5\x9a\x94\x22\x0e\xda\x52\x81\x4b\x57\x58\x40\x45\xe1\x4b\x69\x9c\x73\x71\x8b\xa1\x8c\x42\x6b\x1d\xb7\x14\x1b\xd0\x09\x11\x7b\xeb\xa9\xc6\x85\x2b\xac\x4e\x80\x32\x84\x70\xaa\xb5\xff\x76\xf2\x95\x6b\x56\xc7\x94\x15\xa0\x34\x72\x7f\x78\x56\xc1\x12\x2f\x28\xd0\x37\x15\xc4\x69\xfb\xba\x54\x0f\x17\xd3\x58\x7d\xbb\xb9\x79\x58\x5d\x1c\x61\xc0\x4c\x1b\x7d\x19\xa8\x8f\x5f\x8f\xd4\xd5\xc7\xbb\xdb\xeb\x4f\xbf\xe9\x27\x16\xe9\x27\x16\x7d\xc0\x78\x01\x63\x05\x8e\xb1\x0c\x4f\xf5\xb1\x18\x68\xf4\x00\x93\x14\x14\xe5\xb8\x00\xd5\x13\x07\x1a\x16\xd1\xe6\x65\x09\xba\x58\xd5\x54\x8c\xed\x14\x26\x94\x94\x93\x69\xab\x3a\xc5\x16\xd5\x21\x1e\xa7\x5c\x04\x7a\x04\x05\x03\x14\x94\x1e\x40\xf6\xea\xf9\x6a\x7e\xbe\x0c\x25\x84\x82\xad\x8e\x98\xd3\x88\xb5\x33\xc6\x71\x04\x76\x22\x9e\x38\xc2\xfc\x84\x30\xe7\x71\xaf\x29\x89\x3b\x6b\x63\xed\x3c\xa5\x84\x41\x5f\x56\x69\xc0\x5b\x42\x5c\x01\x7e\xf2\x19\x8a\x5d\x91\x65\xd9\x6f\x25\x0f\xb3\x7a\xcd\x92\xb6\xdb\x3f\xcf\xfe\x55\xf6\xdf\x64\xff\x53\xf6\x7f\x64\xff\x77\xf6\xff\xbc\xf1\xb9\xba\xfd\x76\xa6\xd7\x9d\x97\xde\xd5\x4c\x01\x4a\x12\x2e\xeb\xeb\x57\x56\x57\xf7\x7f\x34\x67\x32\xab\xaf\x1b\xfe\xb7\xf7\xd3\x0e\x06\xde\x90\x56\xcf\xe2\x54\x1f\x7e\xea\xc1\xd7\x8a\x55\x1b\x48\xb9\x61\xdc\x3b\x49\x71\x21\x22\x03\xed\xb8\x05\x99\x2a\xca\xad\x2e\x7c\x55\x0c\x82\x4b\xa6\xa8\x41\xae\x2a\x08\x82\x82\x03\x9b\x67\x54\x48\xc3\x9c\x56\x01\x6b\x21\x08\x6d\x31\xa5\xe8\xc9\xe4\x19\xe7\x54\x41\x8d\xb0\x6f\xe8\xb6\x8a\x21\xc7\x3f\x7a\x28\xe2\xb3\xe6\x55\x3a\xad\x59\x2b\x0c\xe7\x66\xcb\x15\xd6\x95\x1d\x8d\x5d\x38\x4f\x60\x69\x30\xd6\x65\xa9\x34\x27\xba\x54\xa5\xd5\x53\x16\xc8\x65\x6b\xad\x20\xc8\x61\xc1\x89\x45\x54\x1a\x4e\x28\x8b\x7c\xb4\x33\x63\xd6\x6b\xe1\xa5\xde\xb9\xaf\xbe\x27\x98\x24\xf5\x2c\x92\xd4\xb3\x52\x9e\x9f\xe3\x0d\x5d\x57\x19\x3d\x7b\x20\xbd\xff\xa2\x1b\x7e\xf5\x97\x89\x50\x9f\x63\xb1\x73\x57\x73\x76\x0f\x7a\xdd\x8c\xfd\x94\xba\xb1\x8b\x41\xda\xc0\x48\x65\x55\xdd\x75\xee\x45\x98\xba\x8b\x94\x82\x3d\x10\x65\x11\xb7\x51\x71\xe0\x01\x85\x28\x9e\x62\x47\x2b\x87\xa9\xe7\x94\x78\xca\xb7\xcf\x19\xcd\xb3\x25\x0b\xca\x5b\x03\x8d\xa5\x34\xd6\x21\xac\x2b\x45\x92\x39\x89\x96\xbc\x8a\x27\x1f\x92\x62\x35\x69\xa5\x95\x2d\x82\x5e\x3a\xe6\x20\x14\xdc\x22\xc4\x28\x63\xbc\xc0\x82\x61\x6c\x99\x78\xaa\x95\x2c\x03\xc4\x78\x51\x8c\x2c\xe1\x4c\x58\xc2\x6e\xbd\x3b\xa3\x6e\x67\xc5\xb7\xb7\xf8\xee\x69\x37\x7f\x71\xb4\xba\xba\x79\x48\x88\xe4\x87\xd4\x83\x9b\x72\x99\x87\x14\x39\x7f\x9b\x5a\xa8\x73\x3e\x7d\x56\x1e\xb8\xbd\xfe\xa2\x02\xf7\x07\x20\x91\xec\xee\x1f\x16\xe8\x14\xa6\x35\xad\x8c\xc7\x10\x9b\x70\xd2\xc0\x05\x10\x8c\x89\x06\x90\xa3\x33\x21\x68\x77\x88\xdb\x10\xfb\x02\x64\x2e\x60\xa6\x75\xe1\x8c\x3b\x02\x9a\x3a\x86\x25\x38\x46\x97\x97\xa7\xd3\x69\x8d\xa4\x94\xd2\x0b\x21\xa5\xe3\x7c\xb0\x43\x34\x02\x94\x6d\xf3\xa4\x41\x79\x02\x52\x4e\xc9\x11\x21\xb1\x3d\x36\x4a\x37\xa0\x3e\x34\x4d\x3c\x09\x10\xac\x48\xb6\x58\x42\x64\xcb\xcc\xe7\x70\x63\x53\x9f\xf5\xfd\x8c\x1c\xfb\x4d\xfc\xe8\xaf\xa3\x9b\x29\xa4\x59\x90\xa7\x6d\x1e\x7e\xe0\x79\xf5\xb4\x5d\xef\xc3\x0f\x3c\x1c\x56\xe8\x49\x21\xbc\x2c\xe7\x70\xa6\x68\x86\x39\x9c\xa1\x9c\x7b\x69\xad\x8c\x87\x59\x9b\xa4\x33\x08\xc6\xbd\xa3\xc4\x4a\x73\x92\xd9\x2a\x93\xf9\xcc\x6b\xfb\xfd\x84\x63\xf9\x2f\x92\xaa\xfd\x8b\xc2\xe8\xf4\xaa\x5e\x84\x48\xce\x7a\x6a\x2f\x42\x04\xb3\xa9\xef\xb9\x22\x73\xfb\x85\xef\x7c\x7b\xc1\x4d\xdd\xdd\xde\xbc\xbf\xff\xf4\x18\x42\x87\x4b\x5f\xc2\x43\x88\x82\x72\x87\xa6\xaf\x4f\x63\x97\xab\xb1\x14\xac\x57\x87\xd4\x4e\x4b\x7d\xa6\x0e\x48\x88\x02\x86\x40\x39\x84\x77\xb3\x73\xdc\x8c\x8b\xf3\x07\x12\x00\x22\x35\x46\x6b\x66\x85\x2e\xd5\x14\xdf\x4c\xf7\x38\x41\xf1\x40\xe3\x29\xcf\x4a\x8b\x79\xdc\xf2\x68\x78\xbe\xa5\x04\xf1\x69\x31\x70\xd6\xed\x76\xce\xba\x61\x50\x7a\x8a\x31\x29\x98\xfd\x1b\xbf\xc9\xfe\x20\x63\xd9\xaf\x93\xf3\xc1\x14\x58\xbc\x05\x31\xbd\x10\x66\x7e\x82\xf6\xf1\x3a\x2f\x9c\x1f\xde\xbc\xfe\x03\x2f\xbc\x8f\xcd\x57\x92\x33\xcb\x20\x09\x35\x9a\x32\x15\xb8\x96\x9c\x2b\xc9\xc5\x13\x3d\x85\xfd\xde\x2a\xc9\x58\x10\x46\xb7\x6a\xbf\xd4\x87\xe4\xf4\xd9\x3a\xa5\x75\x90\x46\x37\xaa\xaf\x25\x46\x4e\x33\xe1\x1c\x37\xd2\x18\xc6\xe8\x93\xca\x83\x0c\x78\x51\x47\xd9\x03\x28\x62\x75\x8c\xfa\x14\x91\x04\x66\x17\x8b\xb5\x57\x2c\x65\x28\x9c\x19\x72\x26\x91\x88\x10\x3c\x94\xd2\x49\x16\x8f\xa0\x74\x4a\xf9\x26\x78\xef\x0b\xa9\xbc\xe6\x71\x00\xcc\xaa\x29\x97\xd5\x08\x29\x45\x93\x7b\x2c\x61\x02\x61\x12\xad\x26\xd4\x39\x56\x9b\xe3\xd1\x3b\x1d\x12\xc7\x5f\x82\x43\xd2\x51\xfe\xc2\x71\xe5\xd9\x7f\x95\xfd\x9b\x39\xaa\xf9\xee\xfa\x45\x2a\xf4\xb2\x80\xdd\x5f\x1c\x71\x5f\x00\xf3\x5f\xcb\x10\x7f\xb8\xff\x74\xf6\xc2\x3c\x8f\xe8\x2c\x47\x3b\xcb\x33\xd2\x1c\xb9\x62\xc0\xd4\x48\xc6\xa3\x2c\x89\xe4\x4e\x05\x41\x21\xf2\xa5\x12\x5e\xdb\x46\xf4\x96\x97\xe3\x76\x34\xb9\x18\xdb\x59\xdf\xef\x7c\xe4\x59\x5f\xb8\x62\xb7\x87\xad\x71\xb8\xe9\x25\xb3\x44\xee\x8c\xb6\xda\xaf\xfa\x4e\x0b\x4a\x99\x50\x7e\x5f\xdb\x9a\x1c\xaa\x5a\x08\xd8\x9a\xad\x12\x56\xea\x3d\x80\x00\x3d\xd5\xb9\x74\xb1\x36\xb1\x76\x74\xba\x7f\x6c\x17\x8c\x74\x3b\xa1\xb8\x92\x8c\x3a\x2e\xc5\x39\x07\x98\xd6\xb0\x8b\x03\xe1\x9f\x9c\x3d\x70\x5f\x21\x06\xd3\x4d\xf3\xba\x48\xf6\x3a\xd2\xb8\x7a\x49\x67\x1e\x52\x3c\x7c\x49\x6a\x2e\xe7\xc5\xed\xf5\xa7\xc7\x8f\xb9\x0c\x39\xac\x12\xed\xb5\x18\x9b\x45\x69\xad\xf6\xa8\x95\x7a\xc7\x99\x85\x30\xca\x71\x8b\x4e\x87\xb1\x0a\xf9\x69\xac\x41\x36\xad\x54\x79\x33\x1e\x72\xf8\x74\x48\x37\x95\x02\xc3\xe7\xdd\xe5\xab\xc3\x3e\x78\xb8\xb6\x8c\x31\x4b\xa2\x26\x71\x2b\x44\xe9\x4a\x5e\x31\xce\x11\x64\xa5\x83\x22\x36\x60\x20\xa0\x22\xd6\x92\x9a\x10\xd2\x11\x42\x62\xcf\x8b\x12\x66\x3f\x7b\xe3\x91\x3c\xb3\x3b\xff\xb3\x57\xde\xe9\x17\x77\xe4\x0b\xb5\xe6\xf1\x85\x58\xf3\xe9\xf1\xe1\xf6\xc3\x43\x92\x75\xb8\xfe\x1b\x98\x25\x7f\x31\x48\xee\x06\x3b\x0c\xa4\x54\xa4\xd4\xc5\xae\x61\xde\x0c\x20\x08\x2b\x16\x6c\xef\x8d\xfb\xab\xbc\x92\x0f\xd0\xc2\xb3\x3b\xb2\x75\x2e\x6a\x5f\x52\xa4\xa6\x39\x8f\x5c\x09\x6b\x3d\x0c\xc3\x00\x8a\xb8\x8f\x5d\x93\xec\x90\xf9\x5f\xdf\x2b\x39\x79\x4a\xa5\xb5\xdd\x9f\x35\x77\xfe\x7e\xf6\xcf\x12\x03\xfe\xea\xc5\x20\x34\xe9\x7d\xbd\xbf\xd8\xc9\x2f\xee\x6e\xaf\xc1\xfb\xfc\xa5\x48\xf3\x52\xa9\xf9\x15\x78\x9f\x6f\x3e\x3d\x7e\x02\x17\xed\xe2\x39\x3b\xfa\xa3\xbb\x77\x53\x4a\xb4\x82\x52\x52\x0b\xd1\xd0\xb2\x1e\x22\xab\xf6\xb3\x0c\x0e\xe6\x7d\x3c\x58\x1a\x39\x3b\xe9\x50\xa3\x29\xc6\x86\x4e\xd8\x69\xca\x2a\xe7\x5b\x23\xcb\x15\xa9\x83\xd6\x8c\x94\x8c\x89\xaa\x3e\x86\xd5\x71\xdc\x87\x8a\x72\xca\x29\x5b\x30\x8c\x44\x65\x95\xda\x49\x19\x3b\xbb\x05\x5b\x18\xf1\x60\x4d\x4b\x91\xb6\x35\x2a\xb5\xdf\xa3\xc1\x14\x65\x47\xe2\xa9\xc3\x84\x82\xda\x3e\x67\xc1\x19\x5d\x3a\xa8\x75\x05\x8a\xa7\xb0\x38\x24\x1d\x80\x90\xcf\x3c\xc7\x8b\x7a\xd8\x7d\xf6\x9f\x67\xff\xe3\xbc\xaf\x7c\x81\x1d\x3f\x7c\x0d\x49\x4e\xeb\xeb\xa5\x24\xbe\xba\x94\xc4\x5f\xc5\xa4\xb3\xe6\xc3\xc3\xe2\xe6\x6c\xd1\x71\x59\xb3\xff\x01\xb8\xff\xf4\x78\xb3\xf7\x43\x2a\x52\x4e\xf7\xbe\x05\x3e\x19\x33\xa5\x1a\x48\x13\x65\xef\x9f\x76\x55\xd7\x25\xac\x72\x3a\x2d\x08\xed\x76\x42\xec\x0a\xa9\x95\x62\x3c\xaf\x50\xef\x8f\x38\x1e\x7b\x5b\xcb\xa0\x24\x35\xc4\x14\x0e\x47\xb8\x28\xa5\xd7\x14\x34\x64\x8a\x09\x49\x94\x54\x7b\xb9\xcb\x1b\x4a\xe9\x96\x52\x0a\x76\xbd\xf4\x52\xd8\xe0\x88\x26\xb6\x8d\x74\x5f\xb3\x22\x14\x96\x13\x87\xb0\x90\x42\x48\xa1\xa6\x7d\x47\xe5\x33\x6e\xe9\x5d\xf6\xcb\xec\x5f\xce\x75\x82\xb4\xe3\xdf\xbf\x30\x3e\x13\xeb\xf3\xf7\x92\x12\xce\xa7\x77\x3f\x65\x91\xbb\xde\xdc\xcd\x3a\x18\xb3\x88\xd2\x87\xd4\x51\xff\x16\x5c\x25\x69\xc9\x9b\x94\x1b\x4f\xc9\xc3\x10\x8e\xc7\x30\x84\xe9\x8d\x14\x65\x6e\x03\x0f\x25\xcc\x61\xc0\xa1\x1e\xd8\xbe\x69\x3a\xbe\x75\x82\x11\x26\x0b\x69\x99\x2c\xa3\x42\x58\x56\x4b\xc2\x95\x41\x71\x3b\xd6\x02\x63\x34\xee\x99\x1c\x86\x29\xc8\x51\xca\x1a\xa3\x94\x44\x08\xb9\x1d\xa0\x48\x70\xbf\xed\x83\x0c\xaa\xad\x98\x15\x56\x3b\x2d\x54\x6c\x03\x14\xa0\xc4\x58\xd5\x75\x6d\x7c\x3d\xdd\x37\xdb\xc2\x00\xac\x52\x2b\x24\x2b\x32\x91\xcf\x1a\x60\x37\x2f\x73\xe1\x31\xfb\xd3\xec\x3f\x7e\xd1\xb5\x39\x9b\x26\xbc\x11\x7e\x99\x85\xf8\xde\xdf\xa4\x1a\xe4\x57\x4d\x92\x77\x6f\x34\x4b\xce\xba\x48\xef\xdf\x80\x16\xe7\x08\x64\x36\xe1\x6d\x7c\x59\x00\x0e\xd1\x8e\x73\x83\x34\xee\x7c\x87\x95\x0b\x94\xb2\x23\x04\x18\xc1\x78\x80\x45\xdb\x02\xda\xc5\x32\x9d\x86\x05\x16\x4e\x18\xe4\x24\x46\x45\xec\xc9\x51\x0e\x78\xd7\x38\xe4\xc2\x45\xdf\x24\x69\x97\x1c\x10\xd6\x7e\xed\x70\x59\x1a\x0c\x47\x27\x84\x27\xbc\xeb\x1a\x2b\xfa\x3d\x28\x11\xb4\xd6\x42\x04\x4f\x09\x0a\x23\xa5\xcc\xd1\x73\x66\x4a\x57\x62\xd1\x0b\x43\x75\x3c\x61\xa6\x94\x93\x6e\xbb\x75\x12\x43\xa1\xb3\x54\x4f\xb1\x49\x57\x74\xee\xba\xcc\xf8\xd0\x7f\x76\xae\x11\x7f\xba\x4f\xe0\xe1\x1f\x8b\x66\xa6\x35\xf7\x7e\x96\x79\xfe\x5a\x6b\x66\x51\xe4\x95\x40\x10\x8a\x30\x1c\xa0\x96\x87\x6d\xfa\x00\xbb\xe9\x7e\x08\xde\x8f\x74\x31\x44\x9d\x30\xfd\xfb\xcf\xcd\xd9\x49\xdd\xac\xa9\x1b\xf7\x85\x2d\xad\xc2\xc8\x97\xb9\x76\x2e\x56\x2e\x06\xa4\xf2\x72\x2c\x3c\x38\x8e\x45\x68\x7c\x1b\x42\xeb\x9b\x69\xff\xcb\x71\x8a\x05\x2e\xbd\xbc\x9f\x67\x34\xfb\xe5\x2b\xe7\xb4\x57\x1d\x87\xd5\x1b\xff\xba\x04\xbd\x4a\xbd\xa2\x32\xc9\xfc\x7c\xff\xba\x9c\xe9\xea\x0a\xa8\x2a\x04\xff\x44\xba\x1a\xd0\x97\x12\x8f\x8a\xf5\x4a\x8a\x53\xec\x72\xbf\xab\xe2\xc1\x78\x05\xc2\x58\x0a\xe2\x30\x8b\xbd\xb5\xb5\xaa\xd7\x59\xaa\x66\x45\xec\x1c\xd8\x71\x1e\x8f\x22\x1e\x44\xee\x3c\x45\xde\x4f\x3b\x62\x0c\x5e\x39\xd0\x1f\xd0\xd3\x81\x71\xce\x19\x93\x8a\xce\xf5\xc7\x65\xd6\x2d\xb2\x0d\x4f\xb1\xe1\x77\xc9\xdd\xfb\xab\x2a\xcd\x9b\x92\xcc\xd5\xc7\xbb\x9b\xeb\x4f\x40\xe6\x3c\xe4\x56\x78\xed\xc5\x58\x3d\x6d\x11\xb0\xc0\x8c\x5d\x02\xfb\xe5\x0c\xec\x28\x8d\xd5\x71\x5d\x38\x17\xa5\xaf\xa9\x65\xb0\x2e\x83\xab\xeb\x3a\x5a\x4a\x7c\x91\x65\x1b\x60\x9e\xd9\xa6\x5d\x6d\xb3\xdf\xce\x1e\xb2\x7f\x91\xaa\x43\x7f\x9e\xfd\xfb\x97\x8e\xc7\x05\x62\xf1\xe1\x95\xa0\xd0\xb7\x9b\x39\xc1\x79\x38\x97\x19\xa7\x84\xe8\xd3\xac\x2b\xb4\xba\xbf\x4e\x7e\xb9\xe9\xfe\xf9\xba\xae\xf1\xa3\x57\xbf\xaa\x09\x33\x9a\x7b\x0c\x2a\xa2\x34\x43\x9f\x3b\x86\x1b\x0a\x2b\x44\xaa\xd8\x15\xc1\xfb\x56\xc4\x93\xe8\xd9\xd6\xfb\x22\x76\x0d\x42\x8b\x2a\x08\x90\x99\x5e\x88\x4e\x9c\x9e\x70\x4e\xab\x5c\x12\xab\x15\xa5\x63\x3b\x66\x08\x48\xc0\xc7\xa1\x4a\x35\x11\x0a\x3a\xca\x62\xbf\xec\xb4\x64\xdd\x1e\x5b\xab\x14\x63\xec\xc8\xa5\x90\x48\x50\x17\x0a\xde\xc6\x8a\xb4\x52\x33\x05\x48\x43\x5a\x47\xf0\xb6\xeb\xb5\x51\xde\x2b\x6b\xdb\x88\xbc\x8f\x53\x48\xca\x28\x87\xa1\x74\xce\x7b\x1f\x6b\x92\x0a\x45\xeb\xfc\x98\xea\x17\x3a\xe9\x96\x5c\x27\x87\xb6\xc7\x4b\x95\x1d\xbc\x92\xe0\x98\xde\xe8\x19\x50\x38\x07\x92\x17\x02\xc2\xa5\xa9\x93\x1a\x1c\x8b\xde\x6a\xa9\x2d\xd8\xe6\x7a\x2c\xf3\xfd\xd8\xe4\x68\xdc\x83\xf0\xe4\xe6\x87\xa9\x32\xad\xee\x02\xd8\xd5\x60\x1f\x5d\x75\x94\xa7\xaa\x6e\x9e\x33\x7d\xaa\x63\xbd\xd6\x5c\x19\x23\xc6\xe0\xc3\xa2\x0d\x26\x6a\x00\xab\xaa\x49\x8f\xed\xf8\xb6\x35\x4d\x54\xd6\xfa\x41\xd5\xfe\x90\xb2\x9b\x53\xe5\xdd\x2e\x5b\x2e\xd0\x73\xb3\xea\xd7\xe6\xdc\x01\xc7\x97\xbc\xf7\xc5\xb5\xe3\xf6\xdd\x05\xc8\xf3\xdd\xfb\xb9\xf9\x92\x98\x58\x8f\x1f\xef\x16\xe8\x94\x88\x4b\xfb\xb1\xdd\x9d\x50\xce\xa7\xa9\x06\xe3\xa1\x20\x48\x10\x54\x21\xec\xe0\x94\xc1\x23\x09\xc9\x6a\x57\x55\xbe\xf2\xbe\x8a\x26\xe2\xd0\x45\xed\xeb\xb2\x6a\x88\xd5\x38\x28\x56\x95\xb5\x4b\xda\x86\xb3\xee\xfa\x63\xe2\x3e\xfe\xcb\xd4\x81\xbf\x04\xef\x53\x32\x97\xcf\xbc\xd7\x77\x9f\x1e\xdf\xe7\x9b\x6f\x52\xad\x7a\xda\x80\x16\x33\xea\xe7\xea\xe6\x6a\x26\xbf\xde\x7f\xbc\xbb\x05\x33\x89\xf3\x72\x77\xa7\x21\x5e\x64\x7b\x88\x02\x81\x27\x56\xa2\xa1\x2c\xaa\x12\xf0\xd8\xa3\x64\x32\x4c\x70\x59\x16\xbe\x54\x4c\x0b\xd7\x0b\x8c\x23\xcc\x89\x15\xa4\x1c\x91\x2b\x11\x07\x99\xc5\xc5\x16\xd2\x44\xed\xcd\x9e\xb3\x85\x48\xa0\xeb\x55\xe0\x1c\x4b\x55\xd9\x00\x20\x30\xa3\xf5\xd1\xdb\x8a\xc6\x63\xff\x9c\x35\x0d\x8c\xdb\x0e\xa0\xda\x59\x04\xf3\xfd\xa8\xb4\xdf\x03\xe5\xbd\x8b\xa7\x56\xfa\x91\x76\x11\x76\xcb\x43\x33\xb0\xbe\xcd\x7e\x6b\x41\x9e\xc9\xa6\x59\x57\xd9\xcf\xb2\xf2\x55\x0e\xf3\xcb\xec\x4f\x5e\x3b\x0e\x5e\xd8\x70\xb3\x1f\xe9\x25\x4a\xbd\x5b\x5d\x9a\x2f\x5f\x65\x30\xef\x5e\xf3\x57\x51\xc0\x2c\x94\x50\xd5\x79\x23\xa7\x00\x00\x98\x32\x06\x62\x51\x59\x56\xa5\x14\x7c\xcb\xe2\x11\x9e\x92\x15\xc6\xd8\x2d\xec\x93\xaf\xa6\x2b\x79\x39\x2c\xeb\xb6\x64\x9b\x67\x5d\x27\xba\x7e\x5d\x61\x63\x22\x06\x08\x96\xaa\x3e\x24\x57\x53\xed\xb9\x54\x52\xe2\xc6\xd6\x15\xf5\xd8\xd7\xb5\x8e\xe5\xd3\x90\x33\x13\x3b\x15\x7b\x1d\x4f\x56\x91\x80\x05\x56\xde\x90\xa4\x45\xc8\x9f\xe5\xa6\x5d\x8b\xb3\x9b\x0f\xc9\x7e\x75\xbe\xd6\xd3\x7b\x7d\x11\x26\xba\xba\xbd\xba\xbd\x90\x1f\xa6\xf7\xff\x46\x26\xe5\x6c\x0f\x72\x7f\xf5\xaa\x63\xf1\x30\x3d\x98\x9f\xbb\xc7\x9b\x92\xf7\x07\xd0\xc7\xbd\xe9\xf5\xce\x95\x01\xea\x93\xe8\x75\x3c\x80\xae\xed\x09\x18\x00\x77\x94\x5b\x31\x1e\x18\xb1\x98\x81\xad\x66\x8e\xc9\x3e\x68\x47\x0a\x5f\xa8\x5d\xa5\xf2\xa0\x69\x20\x7a\xa4\x9e\x32\x2f\xd6\xc2\x62\x14\x5b\xe7\xad\x6d\xb6\xd1\x01\x77\x0a\x4e\x35\x0e\xb0\xb2\xf0\x1e\x3b\xc5\x34\x13\x92\x2b\xf1\x74\x74\x35\xad\x7d\x19\x19\xc5\x1e\x77\x92\x09\x70\x18\x4e\x04\x64\x03\x9c\x02\x54\xb1\x4d\xfd\xd6\xac\xce\xfd\x46\xae\xd9\xcc\xb5\xb8\x5e\xae\x2e\xb8\xb5\x37\x09\xc7\xf2\x05\x9e\x76\xe6\x08\x98\x95\x8f\x87\xd8\xe5\x3d\x95\x36\x01\x4d\xa5\x92\x50\x2a\x8c\xe2\x21\x66\x1a\x0c\xa7\x91\x2d\xa0\x71\xd6\xa8\xe3\xf0\xb9\x59\xb3\xe0\xb5\xd3\x86\x33\xfe\x9c\x69\x8e\x1c\x12\xfb\x63\x70\xba\xf2\x8c\x0a\xca\x84\xcc\x36\x99\x78\x26\x9b\x61\x05\xcf\x6c\xa1\x8b\x63\x7d\xca\x9a\xce\xc5\x82\x8f\x77\xd7\x6f\xd6\xeb\x17\x26\xda\xa7\x2f\x4a\x39\x73\xa1\xe8\xe3\xdd\xcd\x7a\xf1\xa5\x3d\xf0\x78\x73\x0d\xf8\x4a\x8c\x25\x5f\xe2\x28\x5a\xc0\x8c\xd5\xca\x0a\x0f\xe1\xb8\x1f\xc9\xb4\x34\xb3\x71\xab\xac\x04\xb0\x8e\x36\x2f\x09\x8a\x3a\xc9\xec\x4f\x87\x01\xba\x06\x46\xf3\x71\x2f\x7c\xc2\x65\x50\x10\x4a\x88\x74\x14\x2b\x18\x33\x69\x9d\xf5\x94\xee\x8c\x63\x04\x91\x32\x14\x7e\xcb\xa8\x0d\xde\x12\x0c\x88\x8c\x47\x31\xee\xb4\xe6\x5c\xc4\xbd\xd6\x3a\xb6\x08\x11\x37\x73\xa3\xf8\xa6\x5a\x37\xd9\xdf\xc9\xbe\xc9\xfe\x5e\xf6\x87\xd9\x9f\xcc\x55\xcd\xcd\xcd\x75\x9e\x6e\xa1\xcd\xdd\xa7\x04\x03\xdc\xcc\x91\xed\x77\x60\x36\x7c\xbb\xbd\xba\xcd\x5f\x90\xf5\xab\x8b\x1c\xca\xeb\x02\xe8\xb9\x4c\xbc\x2a\x0c\xcb\xd1\x76\x44\x74\x87\x09\xe3\x7b\xe0\x83\x88\x4e\xf6\x82\x09\x55\x08\xf6\xc4\xaa\x69\x31\xee\xd0\x41\xf6\xb0\xcf\xb3\x28\x72\xbf\xc8\x7c\xd7\x31\x25\x38\x12\x02\x95\x63\x06\x32\xcd\x85\xd0\xeb\x86\xb2\x29\x83\xf3\x88\x52\x64\x54\x47\x15\xaf\x4b\x28\x45\x41\x19\xe0\x71\x0f\xc8\xe7\x3d\xd0\x71\xaf\x0c\x1f\x82\x3f\xd4\xb5\x75\x4a\x40\x57\x42\xa2\x10\x97\x49\x05\x68\xf6\x49\x37\x49\x8f\xf8\x77\x93\xca\xed\x25\xb2\x5d\x2d\x6f\x36\x2f\x28\xd8\xc7\xef\xde\x7f\x3f\x0b\xf4\x27\x3f\xe1\x0f\xb3\x8f\x6a\x5e\x37\x10\x2d\x42\x1d\x8f\xa0\x00\x0d\x1e\x77\xb1\x8a\x55\xc4\x1c\x18\x80\x8c\xb0\xbe\x05\xb4\x79\x1a\xdc\x4e\x03\x02\x08\x60\x80\xd2\x38\xc4\xad\x05\x06\x28\x12\xeb\x58\xad\x03\x46\xc8\x36\xd3\xa2\x6e\x24\x69\x20\xa1\x4c\x28\xca\xbc\x51\xd6\x46\x41\xa4\x91\x84\x11\x69\x25\x9e\xfd\x8e\x79\xae\x36\xec\xac\x01\xf7\xf7\xd2\xda\xf7\x8b\xd7\x2e\xcc\x77\x9f\x3e\xbc\x04\x1d\x37\x17\x8d\xfa\x73\x12\x32\x57\xfe\xbe\x7f\x37\x87\x6f\x5f\xe0\x49\xf9\x76\x1b\xa4\xeb\xe3\xde\xf9\xca\x34\x8b\xa3\x27\x60\x8b\x85\x25\x28\x7a\xca\x5d\x33\x56\xbe\x2c\xb7\xb5\x68\xf6\x81\xe4\x68\xe4\x52\x02\x84\xa6\x79\xb6\xe8\x43\x51\xfa\x93\xe8\x6b\xbe\x53\x00\xae\x2d\x57\x4e\x73\xc3\x06\xad\x4d\x85\x9d\xb3\x76\xba\x3c\x5c\xb6\x98\xc3\x52\x68\xab\x65\x05\xa3\x04\x94\xfa\x10\x4d\x05\x58\x29\xf8\xce\x54\xe6\x30\x04\xd7\x64\x59\xf6\x33\x50\x25\x3e\xe7\x4f\xf5\x8f\xfe\xeb\xbf\x71\xdf\xe8\x47\xd1\xd3\xd7\x4d\xa1\x6d\xb9\xa3\x31\xfc\xa6\xa6\x50\x45\x65\x2c\x73\x52\xe5\x94\x29\xa9\x11\x1a\x87\x11\xce\x41\xd3\xb6\x06\x21\x9a\x1c\x83\x9a\x90\xd8\xff\x65\x8d\x1f\x56\xbc\x34\x7e\x8c\x89\x95\x32\x9a\x20\x5a\x56\x45\x48\x76\x5b\x0d\xa1\x3e\xcb\x41\x96\x77\x1b\xbc\x16\x09\x5f\x97\x7d\x1d\x0d\x81\xb0\xaa\xfe\x62\xb7\x46\x3f\x98\x15\xfd\x61\x58\xd6\x8b\x56\x87\x45\x15\x74\x94\x00\x55\x33\xce\x37\xe4\x32\xe1\x9e\xff\xd1\xb4\x43\x7c\xed\x52\xbc\xb9\xf9\xf6\xad\x9a\xd5\xa7\x2f\x2c\xd9\x0f\x3f\x95\xb2\xce\x4b\xe9\x66\xfa\xae\x07\xac\x7e\xa1\x10\x9b\x08\x4b\xd0\xcb\x40\x25\xb4\x84\xa2\x58\x8b\x46\x6e\x49\x3c\x01\x93\xbc\x75\xfa\xa5\x70\x10\xe6\xc8\xe2\xda\x0d\xaa\x0f\x61\x50\xbd\x13\xcc\x30\x11\x60\x6c\x39\x22\xa6\x59\x23\xa5\xac\xb0\xc2\xf2\x93\x86\xba\xc4\xb2\xd6\xc6\x0f\xd3\x23\x5b\x2c\x98\x3f\x74\x92\x39\x61\x0c\x73\x54\x09\x2d\xb4\x08\x6d\xa0\x5c\x1e\xb3\x39\x17\x57\xa9\xf6\x0e\xb3\xdf\x4d\x2b\xf0\xbf\xba\xdc\xaf\x5f\x89\x70\xad\x2f\x2a\x5c\x1f\xbe\x8c\xc3\x5b\x21\x8b\x24\x97\x39\x93\x2e\x5e\xef\xff\x27\x3f\xa5\xdc\x6e\x8a\x1d\x79\x13\x9a\x86\x0f\x4a\x31\x8c\x6d\x15\x98\x12\xf8\x07\x03\xf8\x6c\x12\x29\x77\xcc\x10\x02\x29\x23\x0e\xc7\x83\x38\xe2\x78\x04\x36\x76\x85\x21\xcc\x8a\x45\xa6\xa8\x25\x62\xed\x30\x67\x2e\xee\xbd\xc2\x9e\x1a\x8f\x1d\x99\xfe\x2a\x55\x7b\xb2\x57\x76\xe8\xb5\xf6\xd6\xc7\x46\x8a\xc2\x17\x14\xb0\xc8\xb4\x93\x40\x78\x1b\xf7\xb8\xd2\xcc\x08\xe3\x98\x33\xd3\x7d\xff\x2c\x36\x5d\xc2\x91\xcf\xf9\xf7\x2f\xa6\x68\xe7\xdd\xab\xd2\xfd\x45\x1d\xee\x15\x49\x6e\x9a\x3b\xdf\xac\x36\xdf\x2f\xf2\xd5\x74\xdb\x5f\xdd\x80\xab\xdb\xab\xc5\xed\xd5\xfd\xe2\xfe\xd3\x2f\xc0\xed\xea\xfd\xfd\xd5\xed\xf5\xb7\x1a\x70\x44\x2a\x86\x81\x70\x50\x9f\xb4\xb5\xcd\x73\xa6\x0e\x95\x0f\x26\x38\x89\xc6\x7e\x79\x08\xc0\xc7\xd6\x03\xa8\xe3\xb1\xb2\xf1\x28\x41\xa6\xe2\x16\x48\xe0\x4f\x61\x18\x86\xae\x1c\x80\x28\x4e\xa7\xd5\x8e\x53\x22\x94\xaf\x5d\x6b\x94\xf4\xc2\x31\x23\xb8\xe4\x42\x1b\x80\x0f\x4f\x32\xb6\xbd\x9f\x16\xe2\x7a\xe7\xf6\x00\x2f\x9a\xa8\x2f\xc0\xcd\x68\x85\xd4\x47\x04\x4a\xcd\xd3\x1a\x97\x1f\x9e\x45\xd2\xf6\xf8\xf9\xb9\x22\xfb\x5f\x26\x5d\xc3\x17\x9f\xc6\x2f\x6a\x8c\x57\x37\xd7\x2f\xce\xfd\x97\x7a\xec\x45\x5f\x6b\x1a\x81\xb9\xfd\x71\xff\xf1\xee\x22\x3b\xf9\x7a\xa1\x5c\x70\xe0\x28\xac\x20\x01\x5d\x84\x10\xe5\x3a\x9e\xcc\x60\x31\x8e\x9d\x35\xb0\xb4\x8a\x79\x12\x43\x44\x68\xbf\x8f\x0d\x26\xaa\x36\x07\xc0\x11\x8a\x2d\x30\x42\x1d\xc3\xd1\x88\x68\x87\x01\xc8\xbe\x8f\x46\x52\x47\xe5\x02\x3a\x2e\xb4\x58\xa1\xaa\x2f\xdb\x2a\x30\xe6\x9d\x75\x10\x45\xdf\x16\x10\x21\xe6\x1b\x66\x78\x19\x60\x0f\x0c\xc6\xde\x05\x4f\x79\x3c\x39\xed\xbd\x76\xe3\x30\x0c\xc3\x92\x2a\x2d\xb4\x12\xcc\x8b\x24\x0f\x91\x2d\x32\x97\xf7\x4b\x72\xee\x31\xfd\x27\x7f\x69\x87\xe9\x61\x8a\xf1\x1d\xa8\x66\x82\xbf\x7c\x6a\x80\x8e\x7a\x51\x87\x31\x04\xb6\x80\x4f\x87\x75\x69\x8c\xd7\xce\xe9\xb8\x7d\xce\x9c\x3d\xc5\x83\xcb\x96\x8b\x26\x69\x47\xfa\xec\x6f\xbf\xb8\xd2\x9c\xb7\x84\x29\x3b\x78\x31\xe4\xb9\x7a\x8d\x1a\xfb\x30\x17\x2a\xa6\x6d\x7e\xd5\x78\x84\x77\x07\x79\xd8\x86\x93\x06\xe2\x39\x03\xaa\x9a\x92\x7b\x2d\x99\xd3\x3c\x94\x30\xd6\x51\x21\x10\x62\xed\x77\x3b\x60\xb6\x6b\x8f\x05\x3f\xf9\x50\x81\xec\xd0\x1a\x50\x44\xb2\xdd\x8e\xbb\x78\x2c\x0b\x4f\xdb\x2d\xe3\x94\x91\x1a\x03\x14\x66\x68\x53\x96\xe5\x4b\xfa\xcc\x36\x61\x85\xb3\x55\xf6\xe1\xf5\xfe\x76\x7f\x7d\x53\x26\xbe\xe0\xed\x43\xba\x79\xa7\xf4\xf9\xea\xfe\xd3\x14\x57\x7d\x5a\x15\xd3\x75\x10\x39\xac\x08\xeb\x63\x55\xd4\x21\xf4\x22\x1e\xd4\x9e\x9f\x2a\x07\x63\x03\xf6\x72\x85\x95\xa1\x46\x61\x6a\x75\x88\x95\x01\x66\xec\x59\xdc\x56\xce\x6e\xf3\x2c\x06\x0d\x4c\x08\x59\xbe\xec\x93\x9f\xab\xcb\x7e\x96\xb4\x0f\x5f\xe9\x43\xde\x3c\x5c\x88\xf1\x5f\x4b\xe2\xfc\x7f\xa4\xbd\x4d\x90\xe4\x3a\x9e\x1f\x46\x30\x93\x55\x9c\x95\x76\x87\x35\x3d\xfd\x8a\x2b\x7b\x25\xd4\xd4\xeb\x2e\x8c\xac\xb5\xa0\xad\xad\x6e\x48\xa3\xf1\x62\xac\x2f\xec\x86\x24\x63\xd7\x5e\x09\xab\xb0\x24\x68\x57\x92\xb1\xb6\x65\xc3\xe1\x83\xa1\x50\x84\x8d\xf0\x47\x18\x3e\x38\x02\x11\xbe\xf0\xc8\x23\x8f\x79\xe4\x91\x47\x1e\x79\xe4\x31\x8f\x79\xcc\x63\x4e\x77\x12\xe5\x20\x98\x55\x95\xd5\xfd\xde\xca\x11\xae\x17\xcc\x64\x66\x56\x4c\x4f\xb2\x88\x3f\xfe\x1f\xbf\x8f\x9b\xac\xf5\x10\x01\x1f\x30\xe1\xa6\xd5\x20\x57\x22\x34\xe0\x20\xf5\x7e\x2f\x04\x67\x25\xe1\x2c\x1c\x2e\x2c\xb2\xba\xaa\xb4\x00\xe8\x38\x1a\x6b\xac\xaf\x3d\xf6\x81\x31\x5a\xb8\xa2\x00\x4d\x92\xac\x56\x34\xce\x54\x6d\xf2\x26\xf9\x0f\x22\xf2\xf3\x84\x64\x3c\xc3\x18\xde\x44\xe0\xeb\xed\xc3\xfd\xbb\xa5\x3b\x73\xbb\xda\x00\xe3\xe3\x1f\x7f\x17\x4a\x1f\x4a\xb0\x0b\x4e\x57\xd5\x76\x9b\xe6\x7e\x18\xfc\x8a\xaf\xf0\x71\x70\x61\xef\x42\x01\xf6\x0e\x14\x2b\x37\xb5\xa0\x30\x5d\x67\xc2\x3e\xe6\x14\x22\xfa\xb8\xb1\x53\x0f\xe8\x3f\x8e\x68\x97\xef\x50\x9f\x79\xb8\x7a\x4a\x61\xb3\x27\x31\xc8\xc5\xc4\xfd\xe1\xea\xe6\x0a\xdc\xbe\xbd\x7f\x77\xfb\xf6\x7e\x65\x05\x67\x0a\x6a\x4a\x82\x45\xca\x55\x4b\x0f\x57\x07\x9f\x1e\xc8\x0e\x40\x96\x7b\x48\xe7\x75\xd5\xaa\x15\x0d\x70\x18\x00\xeb\xfb\x0b\x36\x15\x52\x95\xbe\x54\x7c\xe3\xf8\xf6\x00\xec\x63\xa2\x43\x65\x6c\x07\x4b\xaa\xf1\x06\x63\xaa\xd3\x21\xe4\x40\xef\x76\xbb\x64\x9d\xe8\x54\x5f\xba\x4c\x26\x59\x02\x93\xf7\xf1\xde\x7d\xf2\x35\xfd\x16\x5c\x5f\x64\x2f\xfe\xf2\x3f\xb9\xfb\xc9\x02\xc0\x3e\x57\x27\x5a\xf1\x39\xb7\xb2\x6d\x05\x0c\x28\xf4\x21\x8c\x05\xc0\x14\x95\x15\x14\x3a\xd4\x87\x02\x16\xe3\x81\x82\xa4\xdf\x18\x5d\xa9\x3a\x63\xce\x19\x5d\x65\x92\x0a\x2d\x09\x0e\x5b\x0f\x0a\x79\x70\x45\xe1\x69\x57\xc2\x3c\xa7\xc4\x50\x0a\x28\xab\xa5\x91\xdc\x34\xa6\xa9\x13\x10\xb9\x5e\x36\x62\x3c\x97\x8c\xf9\x76\x75\xff\x76\x19\x89\xdd\x2d\x40\xd4\x87\xfb\x37\xb1\x56\x5b\x35\x15\x06\xd8\x17\x6d\x5f\x78\xad\x85\xa0\xb5\x1d\xe1\xee\x50\x10\xcc\xb4\xbe\x30\x68\x5b\x05\x53\x6d\xea\xba\xaa\x6d\x18\x07\x0d\x4a\x30\x56\xc0\x35\xc6\xec\x16\xac\x6e\xda\x46\xfd\x92\x37\x91\x35\x7d\x22\xc2\xc7\x64\x61\x5e\x21\x73\xce\x73\xf3\x36\xbb\xb9\xb8\xfc\x66\x4e\x8b\xe0\xeb\x3d\xfd\xee\xdd\xcd\x65\x49\x87\xfd\x89\x37\x4d\xdd\x21\x48\x04\x76\x9f\xab\x14\x87\x1d\x28\x4a\x3b\xa6\x3c\x2d\x71\x28\x27\x3c\x98\x4a\x58\x21\x39\xd5\x96\xe3\xd0\x16\x00\x85\xe6\xc2\x18\x58\x7a\xeb\x0d\x70\x61\x0f\x7c\x61\xa0\x1e\x07\x47\x9d\x64\xc4\x20\x4c\x84\x52\x94\x6a\x35\xc6\xfa\x6d\x55\x3e\xb2\x6c\x73\x61\x97\xeb\xf1\x85\x0f\xce\x32\xf3\x5f\x9c\x70\xbe\xcd\x24\x95\xaa\x6d\xad\x90\x84\x56\xdc\xc8\x4e\xed\xf7\x1b\x02\xca\x0b\xeb\x11\x0c\xb5\x97\x75\xe5\xad\x3e\xf6\xe9\xa1\x6b\xcc\x01\x30\xe4\x01\xc6\x15\x4e\x92\x0b\x80\x1f\x69\xbc\x27\x56\xc9\xaf\x27\x7f\xf1\xd9\xef\xf6\x04\xdf\x7b\xd2\xf8\xb8\x79\xfb\x84\x39\x8e\xb5\xcb\xb3\xed\xd8\xbb\x97\x20\x37\xe7\x89\xef\x16\x65\xba\xb7\x69\xbe\xae\x3f\xcb\xf1\x02\x0e\x52\x2a\xbb\xe7\x93\xaf\xc3\x61\xa1\x03\x86\xcd\x5a\x58\x15\x04\x3b\xee\xd2\xb2\x4a\x8b\x69\x0f\x36\xd8\x68\xa3\x11\x9e\xfa\xa9\x58\x0a\xb6\xdd\x1a\x05\x57\x05\x93\x49\xa3\x8c\x26\x18\x63\xef\x01\x39\x60\x6c\x19\xe1\x80\x55\x44\xca\xe0\x8d\x09\xb6\x29\x30\x57\x4e\x13\x32\xa7\x83\x9b\xe8\x2e\x1d\xf3\x9c\x47\x76\x29\xd6\x5d\xf2\xfe\xcc\xbb\x22\xde\xce\xf7\x17\x97\x37\xc5\xe5\x99\xa6\xf6\x97\x2e\x48\x60\xce\xee\xc0\xe9\x6b\x64\x77\xb7\x6f\x01\x42\xc8\x00\x51\x6d\x30\x5f\x8f\x0c\x77\x91\x10\xc4\x4b\x3c\x15\x69\x2e\x18\xaa\xf3\x62\x3a\x4c\x4d\x99\x9a\xe9\x90\xe6\x61\x60\x7c\x35\x04\x5f\x05\xbf\xa2\xf4\x90\xf6\x25\x34\xdd\x41\xca\x63\x37\x34\x45\x55\xf0\x3a\xad\x6d\xa0\xc6\x12\x08\x09\xf1\xa4\x02\x9d\xa5\x34\x0c\x75\x5d\xd7\x07\xe5\x16\x8c\xf4\xee\x91\x66\xfd\x45\xb9\x68\x8b\x46\x93\x0d\x70\x97\xbc\xb9\x7d\xce\xcf\x7e\xf4\xe6\x76\x05\xd3\x26\xb4\x78\xae\x88\x0a\x01\x3c\x6f\xa9\x62\x92\x32\x84\x6c\x2d\xba\x8b\xb2\x3a\x1c\x71\x70\x0e\xc0\x55\x3e\x12\xee\x19\x15\xcc\x80\x22\x2d\x96\xbd\x51\x3f\x9a\xf5\x76\xd5\x3d\x71\xf1\xdf\x3c\xfd\x29\x4f\x1b\x56\x04\xd8\x7c\x7c\x49\xf9\x3b\xd0\x54\x73\x8e\xae\x24\x31\x56\x58\x1a\x44\x28\x4a\x90\xef\x83\x58\x84\x84\x1a\x90\xac\xf2\xb6\x0d\x65\x57\xe4\x8c\xd7\x0d\xb7\x94\x54\x25\x1c\xe6\x04\x27\xfe\x7b\x6d\x9a\x5c\xaa\x0b\xf3\xcc\xfd\x7f\xbe\x75\xde\x9f\x6d\x90\x2f\xb7\x0e\xc0\xa9\xad\x53\x3b\x59\xb0\x47\xd8\xd6\xd2\x43\x34\xa9\xe3\x58\xa6\x87\xc9\x66\x49\x80\x75\x80\x59\x33\x0c\x01\xef\x21\xc1\xbc\xe9\x04\xa3\x04\x55\xf0\xe0\xba\xae\xeb\x22\x6f\x35\xdd\xc5\xb5\x7d\x9d\xdc\x9d\xed\xfc\xaf\x57\xcd\x0d\xb8\xbf\x7a\x65\x64\xea\xe6\x8d\x80\x87\xcd\xe0\xa5\x71\xde\xb5\x62\xb7\x09\x6e\x75\xa8\x89\xdd\xc8\xd2\xa3\xea\xb0\x35\x59\xdb\x75\x1e\x1b\x6d\xb5\x08\x1e\xf0\xd1\x78\x07\x60\x0e\xf8\xc4\x61\x29\x1a\xba\xd3\x7c\xf1\x7a\x37\x2b\x13\xeb\x88\x27\xae\xd6\xfd\x55\xc4\x83\x3e\xe7\x1e\xb8\x02\x5b\x0f\x0e\xd5\xa4\x57\xfc\xb0\x5f\xe1\xc9\x5d\xc0\x2d\xa0\xa1\xdb\x06\xd7\x38\xd7\xcc\xdf\xc1\xac\x92\xcb\xfa\x82\x47\x16\x43\x02\xbe\xc9\x3e\x9e\x76\xcf\x2c\x16\xce\xa7\xaa\xfa\xa4\x9f\x47\x1a\x90\x6c\x6a\xf9\x79\x93\xa1\x26\x1c\x00\x06\x2d\x9e\x0e\xc1\x85\x4d\xa0\x0a\x58\x80\x46\x0f\x0e\x82\x09\x26\xb2\xba\xd1\x52\xce\xfb\x5b\x25\xf3\xba\xf0\x15\xad\x88\x32\x35\xc5\x54\xb1\x38\x07\xf8\xd5\xd8\x5f\x6e\xa2\xef\xdc\x32\xb1\xfa\x9d\x33\xef\xdd\x3f\x49\xfe\x34\xf9\xef\x9f\xfb\x84\x97\x77\x3f\x5a\x22\xf4\x57\x93\xba\x0f\xb1\xf0\xf9\x26\xbb\xbf\xba\x7d\xf3\x1d\x6e\xbc\xef\x1e\x6e\xdf\x7e\xfc\xe6\xe3\x1c\x4f\x1e\xc0\xfd\xc3\xe5\xfb\xbb\xec\xed\xfd\xc3\xc5\xe5\x9b\xf3\x4a\xfc\xdc\x93\x37\xb7\x84\x1b\x2a\x3a\xd0\x1b\x04\x7a\x8e\x95\x71\xb4\xf1\x6e\x43\xbd\xa4\x14\x22\xb9\x39\x28\x18\x86\x82\x05\xab\xf5\x26\xd5\x8f\x49\xbc\x2d\xf1\x44\x01\x5c\x9a\xa8\x20\xf1\x0c\x79\x02\x49\xd0\x9e\x42\x0c\x12\x0f\xa1\xa7\x58\x61\x16\x90\x66\x4c\x72\xd0\x11\xa4\x21\xa1\x18\x29\x48\x2e\x0c\x1a\xfa\x4f\xd5\x5a\x1a\x07\x18\xd0\x70\xde\xf3\x50\x69\x11\xe5\xd0\x94\x08\x53\x84\x58\xd3\x73\x56\x32\xf5\xd9\xae\xea\x50\x50\x45\x94\x22\x8a\xee\x2b\x31\xe7\xba\x84\x42\x16\xb6\x1c\x31\xc6\x95\x23\x28\xe4\xda\x62\xa7\x20\xf5\x42\x48\xad\x0c\x71\xb2\x54\x06\x2f\x1a\xd6\x97\x09\x7f\x64\xab\xf1\x42\x9d\xa6\xe5\x3f\x39\x69\x08\x46\x7d\x8c\xab\x2f\x7c\xe0\x6f\x56\x2f\x03\xa4\x17\xaf\xf1\xf3\x4e\xe5\xce\x03\x14\x76\xcc\x70\x06\xa5\xc0\x61\x04\xa5\x8b\xd2\x0b\xf3\xb1\x77\x42\x69\x15\xe6\x3c\x0f\xcb\xca\xaa\x4a\xfa\x94\x33\x6c\x11\xbf\x50\x81\x4f\x2c\x14\x5a\x94\x35\x64\x60\x4c\xdb\x30\xd6\x41\xf8\x55\xc1\x1a\x21\x95\xd5\x8e\x3b\xfd\xb9\xe7\xa3\xd5\xbe\xd1\x86\x1b\x9d\xa4\xf3\x9e\x91\x89\x74\x1b\x75\x92\x5e\xdc\x4a\x5f\xad\xb1\x17\xa3\xd2\xd7\x90\x21\x60\x1b\x6b\x6d\xc4\x29\x5a\x22\xa5\x56\x0e\x0c\x8d\xad\x6b\x2b\x05\x65\x96\x0a\xe9\x98\x4d\xa5\xb5\x0e\x0b\xae\x19\x09\x18\x6c\xbc\x97\x15\x28\x9c\xb5\x8e\x69\x65\x24\x0f\x1c\xd4\x95\x55\x6d\xac\x69\x63\xef\xc3\xa5\xc3\x49\xe9\xfa\x9c\xf5\x73\xd2\x98\x3e\xbb\x44\x67\xcc\xd6\x95\xaf\xe6\x95\xf1\x09\x82\xdd\x0a\x3a\x63\xb4\x3d\x42\xc3\x1c\xd3\xc0\xda\x21\x8c\x0a\xe4\x69\x0f\x72\x90\x88\xc7\x24\x1c\xd2\x21\x5a\x3d\x0b\xef\x41\xc5\x37\x4a\x19\x67\x3d\xf7\x36\x14\xd2\x0a\x47\x15\xd1\xde\xd1\x24\x01\xc0\x3f\xea\x4b\x9d\x92\x18\xbb\x4f\xbc\xa3\xf3\xb5\x7f\x75\x3f\xa7\x79\xd5\x50\xf5\x55\xa8\xc1\xfe\x13\x04\xfb\xd0\x54\x5d\x4a\xa6\x3e\x25\x61\xb7\x0f\xae\xf2\xbe\x02\x66\x9f\x24\x2b\x50\x3d\x9a\x4b\x93\xa2\x67\x05\xef\xef\xf9\x4e\xab\x4d\xd5\x56\x60\xfb\x09\xa6\xe5\x2a\xa9\x94\xf1\xfe\x88\x8d\xf0\xdc\xa6\x68\xda\xa6\x70\xda\x7a\x9f\x26\xf8\x50\xf3\xb6\xdb\x0c\xb4\x6b\xe7\x18\x05\xea\xb9\x4e\x4c\xf7\xa7\x2c\x3d\xbb\xba\x7f\xaa\x10\xdf\xfe\xf8\xe2\xf6\xe6\xee\x49\xc7\x74\x99\x88\x5c\x45\xcd\xe9\x91\x1d\xc2\xd8\x09\x5c\x21\x0c\x8a\x49\x71\x1b\x76\x65\x55\xc5\x65\x86\x88\x93\x74\x0c\x87\x30\xe2\x54\xa5\xfb\x45\x5c\xdb\x10\xc5\x9d\x57\xa2\xca\x99\x71\x94\x72\xa5\x40\x5e\xe4\x71\x8f\x5b\xc5\xd9\x5f\xb3\xc2\x91\x3f\xf0\xe1\x54\x29\xa4\x5f\x64\x5b\xcf\x3d\x88\xdb\xcb\x77\xb1\xfb\xfe\x04\x97\xb9\x3a\x61\x21\xae\x52\xef\xf3\x02\x48\x52\x6f\x40\x0f\x6a\x1c\xfc\x34\x6c\x4c\x6f\x46\x47\x30\x26\x7a\xe4\x84\x4a\x38\xc2\xd5\x80\x21\xf4\xb9\xb0\x86\x6c\x16\xc4\xc3\x0a\x43\xc6\x82\xf7\xbe\xea\xb4\xb2\x52\x71\xc9\x88\xde\x72\x23\x4c\x4d\xfb\x60\x29\xf1\xa8\x8b\xe3\xb9\xed\x86\x69\x5a\x83\xe8\x3f\x9f\xa8\x47\x72\x59\x67\xf5\xb3\xe7\xd3\x5f\x4f\xfe\x65\xf2\xa7\xc9\xbf\x4d\xfe\x97\xe4\x7f\x4b\xfe\xaf\x33\x37\xd4\x13\x5e\xf3\xea\xe6\x0b\xdd\xd8\xa5\xe4\xbc\xbf\xfa\x00\x6e\x5e\xd8\x01\x1f\x17\x35\xcd\x58\xa7\xac\xb3\xcb\xf7\x77\xe7\xca\x10\x27\xc3\xb6\xa5\x13\x7e\x75\xf3\xe1\xe1\x26\x7b\xb8\xfd\xf1\x65\x76\xf3\xb0\x08\xc9\x2f\x3e\x62\x3f\x05\x6f\x7f\x7c\xbf\x18\xdf\x5c\xdf\xdc\x7d\xbc\xb9\x4e\xa1\xd0\x51\x76\x1b\x94\xe9\x16\xe0\x28\xc0\x0d\x94\xf0\x9f\xb0\xd7\x1b\x10\xe5\x6f\x28\x50\x21\x96\x9d\xb2\xae\xa7\x3a\x53\x01\xa5\x79\xd0\x00\x02\xc4\x9c\x2d\xa4\x12\x6d\xd1\x2a\x08\xf3\xc0\xcc\xb4\xa5\xa0\x53\xc1\x6f\x1c\x03\xb0\x7a\x4c\xd2\x24\x0f\x68\x55\x0c\x79\x40\xeb\x26\x38\x4a\xf7\xd5\x80\x36\x3c\x0c\x2b\x0c\x81\xf8\x2c\xd6\xcd\x67\x51\xa7\x07\x8f\xa6\x8a\x66\xb5\x40\x25\x16\x94\x53\xd0\x05\x4a\x39\x11\x44\x05\xba\xab\xeb\x1d\xd8\x94\x81\x00\x83\x09\x69\x08\x09\x3b\x46\x82\x50\xd8\x41\xe4\x15\xd4\x10\xc9\x01\x6b\xa8\x91\x40\x4a\x68\xd0\x94\x90\x10\x58\xee\x31\x84\xa4\x90\x88\x97\x18\x96\x24\xec\xd0\x96\x62\x94\x24\x79\x62\x1f\xf9\xa5\x5e\xb7\xcf\xdc\xda\xeb\x58\xff\xdd\x2d\xde\x97\x73\xd9\xfd\xee\x09\x27\x70\xe6\xdb\xfd\xee\xec\xbc\x9e\xff\xcf\xd9\xb6\x5d\xdb\xd3\xc9\x91\xdb\x9d\x73\xbb\xdd\x85\x5a\x9e\xd7\xed\xb4\xb1\x80\xdb\xf8\x38\x35\x93\x96\x32\xf5\x81\x03\x6c\x5f\x4e\x17\xbc\x87\x7f\x64\x97\xd5\xba\x4f\xde\x24\x3f\x4d\x7e\x3f\xf9\xc3\xe4\x8f\x92\x7f\x96\xfc\x71\x44\x5a\x7e\xa5\xde\xbc\xa8\x86\x9e\x5b\xa8\xbd\x89\x83\x8e\xec\xe6\xea\xf6\x44\x13\xb9\xba\xf9\x9a\x46\xf2\xf6\x0c\x91\xb9\x34\x66\x1e\x6e\x2e\x9f\xb9\x53\xeb\xa2\x02\xfc\x84\xf2\xdd\x54\xf3\xd6\x77\xac\xc0\x2e\x6c\x21\x70\xc8\x5a\x25\x4b\xcf\x10\x2b\x83\xe4\x00\x86\x26\xd5\x60\xd7\xf3\xa2\xdc\x97\x25\x07\xfb\xa0\x20\x68\x02\x8d\x55\xcd\x7c\xf4\x47\xe9\x4b\xc8\x5b\x3e\xa4\xdb\xed\x76\xaa\x77\x3b\xd0\x84\x2e\x8f\x4d\x4c\x16\xda\x75\x4f\x08\xb1\x64\x7e\x28\x02\xec\x02\xd9\x97\xbe\x74\xa0\x00\x63\x2f\xc2\x50\x42\x48\x50\x09\x8a\x30\x08\xc3\x0c\xd7\xc2\x40\xb0\x2d\x0b\x67\x9c\x12\x42\x04\xc4\x0a\xd2\x73\xde\x8b\x39\x3f\x9c\xe3\xb7\x49\x61\xf2\xd3\xe4\xaf\x2e\x0e\x79\x17\x97\x7f\x05\x7c\xbc\x5e\x67\xa7\xc9\x41\xa4\x89\x9c\x55\xd4\xeb\x9b\xbb\x0f\xef\x2e\x6e\xef\x3e\x9c\x33\xc2\xd3\xbd\x62\x15\x40\x20\xd9\xdb\x20\x03\x4c\x09\xc0\x94\xbb\x5d\xed\x54\xd8\x85\x1d\xb7\x51\xe7\x7b\xae\x9e\x7d\x79\x00\x45\xb3\x29\x0e\x69\x07\xca\x03\x09\xfb\x70\x98\x5a\x35\x86\x41\x80\x22\x85\x0c\xe2\x1c\x2a\xd1\x88\x02\x21\x44\xad\xa7\xa2\x2c\xcc\xa2\xd4\x2d\x0a\x8b\x68\x2e\x49\xb0\x98\x5a\x8e\x8c\x10\xd4\xa2\x24\xf9\x41\xa2\x1f\xf9\xe5\x26\x2b\x93\x3f\x97\x5c\x27\x7f\x2f\xf9\x27\x27\x0d\xe5\xff\x21\xf9\x9f\x9e\x3b\x43\x31\x94\x65\x27\x70\xdb\x1c\xb4\xb3\x9b\xd5\xfd\x8f\xaf\x4f\x03\xe6\x05\x26\x7a\xc6\x73\x8b\xf9\xf0\x4b\xec\x98\xff\xc6\x1f\xdf\xaf\x6e\x5e\x99\x7e\x7f\xcc\x3e\xbc\x28\x79\xbd\x0c\x2a\xef\x40\x54\xe3\x58\x25\xb6\x28\x39\x23\x15\xa2\xba\x06\x9d\xd4\x1e\x9a\xa2\x94\x92\xc8\x89\xae\x5c\xe1\x73\x40\xc2\x00\x29\xb2\x5c\x63\x54\x16\xb9\x2b\x6b\x45\x85\x34\x08\x06\x1d\x20\x06\x62\xbb\x1d\xc7\x71\xdc\xae\x94\x26\x45\x18\xb6\xdb\xed\x76\xb7\x3b\x84\x12\x63\x39\xa9\xca\x6a\xe7\x2f\x98\x20\x06\x8b\x4f\x32\xbe\x02\xd0\x8a\xda\x37\x59\x99\x0b\x0a\xb1\x15\x8c\x48\x6b\xac\x70\x43\x2e\x39\x22\x96\x4a\xd0\x1e\x3a\x13\x1a\xa3\xd1\xd8\x76\x8c\x97\x61\x1c\x8c\x94\x08\x51\xec\xa0\x88\xcd\x6c\x3e\xc9\xea\x00\x0a\xae\x99\xa6\x46\x40\x92\xa7\x55\x8a\x98\x76\x46\x10\x65\x98\x51\xe1\xc0\x94\x33\x3c\xec\x44\x18\xc2\x56\x81\x32\xe2\x56\x54\xca\x2e\x7d\x36\xe7\xab\xff\x61\xcc\x56\x4f\xba\x5d\xf3\xce\x05\xbe\xfd\xf8\xdc\x97\x3b\xb1\xd0\xc0\x37\xd7\x1f\xff\x13\xb0\x98\xf0\x5e\xbd\xbf\xfb\x29\x38\xc3\x52\xdd\xfe\x38\xf6\xc4\xd6\x10\x16\xab\xf2\x97\x68\x55\x16\x05\x50\xa0\xec\x85\x50\x7c\xa4\x07\x4d\x48\x05\x9d\xa1\xc1\x32\x42\x0b\x58\x0a\xce\x1d\x95\x53\x97\x22\xa9\x4b\x5a\x30\x08\xcb\xdc\x86\xad\x38\xe4\x75\x66\x30\xb1\xf3\x1e\x38\x42\x2a\x61\xd9\x33\x23\x00\x2c\xb6\x54\x13\x48\xc1\x96\x31\x5c\x60\x28\x14\x0e\x3b\x90\x4b\x19\xc6\x3a\xb7\x05\xad\x77\xb5\xb2\xf5\x1c\x43\xfe\x7c\xac\x5d\x59\x56\x3e\xc7\xb3\xbf\x12\x71\xe9\x7f\x90\xfc\xa3\xe4\xbf\x4c\xfe\x38\x51\xcf\x58\xd3\x67\x37\x06\x70\xe2\xa9\x9e\x17\x54\xcf\x60\xca\x77\xd7\x97\xf7\xdf\x2d\x1b\xb0\xa8\x06\x5c\x3e\xcb\x06\x2c\xb7\xd1\xcd\x79\xba\x54\x64\xe3\x27\xb4\xd8\xb5\xb4\x80\x38\x80\x3f\x63\x23\x28\xa9\xc6\x3d\x28\xca\xd2\x4a\x66\xcb\xf2\x31\x09\x03\xaa\x2b\xeb\x60\x2d\x3d\x4b\xad\xc5\x1d\x31\x14\x83\x3c\x74\xcf\xfe\xb0\x7c\x82\x9e\xa8\x1e\x88\x6d\xb1\xdf\xef\xf7\xc1\x4b\xe8\xa0\x08\xca\x96\xd2\x49\xc0\x19\x72\x88\x66\x65\xb0\xcb\xcf\x74\xc8\x4b\xca\xc8\xa1\x9e\x03\xbd\xf1\x84\x20\x0a\xad\x74\x65\x61\x45\x83\x4c\x85\x14\xe1\x94\x59\x6b\xac\x31\x8e\xa4\x9a\xc8\xa6\xb2\x85\x3e\x58\xbb\x37\xd4\x5a\xe4\x0d\xdc\x58\x66\xbc\xf1\xc8\x9b\xe4\x57\xa3\x4f\x49\x93\xd1\xe4\x07\x67\x6a\xb5\x7f\x2d\x2a\x4c\xfd\x22\xf9\x7b\xc9\x3f\x3e\xf1\x54\x9f\xee\x9a\x27\xae\xf8\xc9\x2f\xe2\x69\xf7\x58\xd0\x77\xf7\x6f\xef\x1f\xfe\x12\x38\xf3\x50\x99\x77\x92\xa7\xba\x25\xbb\xfb\xb0\xba\x38\x49\x90\x3c\xe9\xa1\x9e\xcb\xa4\x66\x0c\x16\x69\xfe\x59\x82\x43\x51\x7e\x1e\x06\x3f\x8e\x8b\x39\x04\xd9\x0d\x69\xb3\x2e\x3f\xef\x7c\x5d\x03\xd8\xd8\x8d\x27\xcd\x1e\x6d\x8f\x7e\xe8\x71\xdf\x83\xbd\x73\x20\xe9\x7b\xdc\x77\xa1\x23\xed\x63\x82\x0f\x85\x35\x0c\xa8\x8e\x73\xe9\x34\x6c\x1b\x0a\xb6\x84\x0b\xa2\xa9\xd0\x8d\x0c\x55\x93\x51\xc2\x8c\x41\x28\x54\xc0\x04\xe7\x03\x84\xd0\x69\x5e\xd1\xb4\xd8\x85\x5e\xc5\x9f\xbd\x24\xa5\x2a\x70\x49\x14\x86\x32\x74\xae\x24\x9a\xcc\xe1\x01\x9a\x22\x54\x18\x5a\xe1\x15\xc5\x0d\xc2\x9a\x61\x06\x5a\xc9\x28\x63\x82\x30\x62\x2b\x70\xea\x21\xa8\x47\x76\xe9\x32\x95\xfc\xec\xc9\x01\xfc\xe1\x24\xb9\xfb\x70\x75\xf3\x72\xb7\xdd\xbe\x52\x84\x9e\x23\xd9\xcd\xc9\x3a\xe2\xec\xdd\x37\x11\x21\xf7\x70\xc6\x58\x79\xb9\x45\xe7\x0d\x13\x1c\x40\x1e\x9a\x8d\x97\x2c\x3d\x44\xdb\xfc\x3e\x78\xc0\x46\x53\xb3\xde\x78\x69\xb8\xd6\xcd\x3e\x94\x43\xab\x38\x27\xcc\x31\xc7\xad\x1a\x10\x70\x7e\xd1\x5a\xb4\xc0\x06\xb3\x22\xa0\x0d\x2c\x4d\x42\x52\x55\x60\x58\xed\xcc\xb4\x0f\x3c\x34\x62\x00\x78\x97\x0a\x81\x29\xb3\x46\x29\x62\xe5\x66\xdf\x3a\xa6\xb0\x55\xc6\x28\x4a\x15\x45\x6e\xa3\xb9\x22\x26\x78\x71\xdc\x19\xa3\x8d\x52\x46\x1b\xb3\x2a\x85\x7d\xca\x09\xe9\x65\x9d\x99\x57\x58\xdf\x79\xcf\xff\x3f\x93\xff\x3b\xf9\x7f\xbe\xe4\xf0\x3e\xa1\x7c\x1f\x5e\x21\x81\xaf\xbf\x1f\xf3\x7b\xf3\xf6\xc7\xd1\xfd\x39\xaa\xcd\x5e\x7f\x07\xc1\xec\xfa\xf2\xdb\x0f\xef\xe2\x4e\xf9\xbc\xf2\xbf\x67\xa7\xcc\x9e\x77\x4a\x0d\x2a\x3f\x97\x32\x51\x7e\xb9\x0a\x6a\x6b\x8f\x9d\x1d\x22\x78\xb8\x01\x22\xa8\x6e\x1c\x81\x1a\xa6\x3e\x3e\xad\x24\x76\x0d\x63\x61\xeb\xb5\x15\xe9\x41\xf9\xdc\x0c\x6c\xdb\xd5\x1d\xab\x8d\xc6\xa4\x23\xda\x8a\xa3\x54\x3d\xc0\x3d\x48\x6c\x10\x01\xa5\x14\x60\xef\xb7\xb5\xc7\xe4\xb4\xf3\xd2\x92\x0b\x1c\xaa\x65\xe7\xdd\x34\xc5\x21\x6d\x41\x09\x12\x7a\xda\x7a\x87\x30\x4a\x50\x64\x94\x10\x89\xc3\x86\x48\x86\x9d\xc3\x4c\x12\xc0\xf1\x06\x21\x54\x63\x8c\x81\xb2\x4c\x51\x46\x0a\xa3\x39\xe3\x36\x78\xe1\x78\x8e\x90\xc5\x82\x40\x5b\x20\x21\x28\xc3\x22\xd4\x8c\x3e\xed\xdd\x9c\x9a\x8a\xce\x3b\xdb\xf3\xde\xed\x20\xcd\x15\x0a\x0e\x13\xc7\x90\x15\x82\x3a\x98\x24\x17\x31\xf7\x70\x19\x4e\x7e\x90\xfc\x51\xf2\x4f\x93\x7f\x91\xfc\xab\xe4\xdf\x9e\x6b\x9d\xbd\x7b\x56\x5d\x79\x22\x62\x2d\x96\x34\xa7\x2c\x2c\xca\x59\x9c\x17\xe9\x5f\x09\xc7\x5e\xdd\x5e\xdd\x7c\xf8\x18\x7b\x40\x57\xf7\x6f\x3f\x80\x87\xdb\xb7\x6f\x1e\x6e\xdf\x46\x85\x97\xeb\xaf\x07\xc6\x35\xa0\x11\x37\x06\xfc\xd1\xaf\xa9\x2b\x51\x87\xb0\xe3\x78\x1f\x76\x87\xc3\xe1\x00\x8a\xc9\x7a\x84\x59\x18\x21\xa8\x94\x24\x1c\x2a\x42\x43\x8f\x89\x90\x48\x09\xa2\x8b\x72\xd3\x21\x4a\x2a\x0f\x44\x91\x87\xce\x83\xbd\x6b\xe7\xad\x7c\x4e\xdf\x7a\x89\x08\xc6\x8c\x10\xc9\x28\xa5\xf3\x7a\x66\x64\xbd\x41\x08\x53\xea\x46\xc4\x39\xa5\x5c\x6a\xdf\xbb\xce\x6d\xbd\x5c\x6d\x08\x36\x3d\x0f\x09\xe7\x30\x5a\xbe\x6a\x51\x22\x42\x8d\xa3\x18\xb1\xd2\x0a\x3b\xed\xd2\x1a\x21\xb0\x09\x23\x40\xfd\x2e\x8c\x7d\x1f\xda\xae\x0b\xd5\x76\x95\x13\x4c\x20\x12\x18\x51\x28\x20\xc2\x90\x23\x8c\x93\x5f\x4b\xe4\x29\x06\xe7\x67\xaa\x30\x4b\xaf\x63\x41\x9f\xfd\x17\xc9\xbf\x78\x89\xc2\x77\x37\xf7\x4f\x3d\x03\xf0\x45\xf0\x5d\x20\x57\x59\x0c\xb6\xdf\x19\x82\xbf\xfd\xb3\x43\x30\x81\x45\x5a\x7c\x2e\x53\x02\x8f\x1b\x1f\x3b\x0e\x1e\xb8\xb5\xf8\xdc\xf8\xb6\x05\xa4\xb5\xfd\x2f\x0f\xae\x20\x16\x5f\x6c\xe6\x50\x8b\xf6\x47\x3e\x6e\xf1\x38\xa4\x85\xf7\x20\xd9\x8e\x78\x1c\xc2\x86\x74\x61\x87\x40\x5e\xd4\x9e\x01\x3f\x72\xa1\x2a\x0b\xfb\x0d\x05\x7b\x2a\x14\xd1\x4c\x98\x8d\x0c\xb6\x5d\xa2\x30\x3f\x28\x61\x39\xfd\xbc\x5d\xb7\x4f\xb1\x57\xc2\x70\xe8\x79\xab\xfe\x8c\x10\x5c\x93\x18\x82\x09\x79\x0e\xc1\x8a\xb1\x53\x08\xf6\xa0\x4c\x7e\x6d\xa9\x33\xb2\xe2\x79\x3f\xfb\x59\xf2\x3b\xc9\xdf\x4f\xfe\x20\xb2\x09\xff\x45\xf2\x5f\x25\xff\x26\xf9\x1f\xcf\xb4\x43\xbe\x47\x38\xe8\xd5\xdd\x18\xa3\xd3\x89\x78\x37\x57\x16\x0f\xb7\x6f\x57\x37\x0f\x4b\xb9\xfd\xb6\xb8\xbc\x8b\x61\xe9\x0a\x7c\xf8\x39\x88\xb3\xb4\xec\xfb\xba\x75\xb4\x84\xac\x62\xb6\x28\x37\x25\x72\x18\x02\x74\xb2\xed\x8b\x0a\xa8\x93\xf4\x40\x46\x24\xf6\xe7\x6e\xc5\xc3\x61\x74\x21\xb1\xe3\x1e\xf4\x62\x4c\x13\x4e\xa9\x70\x1c\x6c\x20\x0e\x89\x10\x73\xb4\xbe\xc8\x19\xf4\x90\x4e\xb5\xc3\xd4\xb2\x14\xe1\xd2\x15\x48\x91\xc2\x15\x68\x55\x20\xe8\x86\x2d\xa2\x94\x53\xc4\x95\xb5\xc6\x1b\x67\x69\xda\x5b\x1b\x0e\xde\x3f\x26\x6e\x95\x38\xf7\xb9\x27\x7c\xcd\x9d\x73\x6e\xb2\x8a\x32\x50\x90\xc7\xa4\xa1\xa0\xde\x21\x50\x84\xca\xb4\x64\x4a\x2c\xd3\x1e\x7b\x03\x71\xa5\x98\xd6\xca\x60\xab\xa0\x36\xc8\xea\x64\xa9\x2d\xe9\x65\x97\x25\x71\xae\xf7\xb3\x84\x26\x7f\x27\xf9\xe3\xe4\xdf\x25\xff\xeb\x92\xd9\x9f\xd6\xfa\xc2\xef\x9a\x2f\xd4\x09\x2c\x70\x6a\xa6\x5c\x9d\xcc\x07\x3e\x7c\xbc\x5c\x8c\xb1\xef\x3f\xde\xde\xfc\xf8\xf2\xfe\x21\x22\x46\x23\xb4\xff\x79\xf2\xf4\x95\x75\x42\x76\x07\x57\x27\x8a\xc0\x59\x8c\x58\xc6\xf3\x6f\xa2\x80\xd2\x37\x17\xda\x42\x8c\x71\xa1\x60\x89\x65\x21\x87\x4d\x81\x90\x7e\x4c\x14\x80\x2c\xec\x0e\xa8\xac\x21\x02\x5d\xe8\x4b\xa5\x68\x51\x20\x6d\x20\x09\x68\xc8\x47\x20\xf3\x71\x1a\x9a\x22\xef\x00\xcf\x8b\xc3\x71\xc3\x8c\x03\x30\x6c\xa3\xad\x88\x37\xad\x18\x6d\x18\x81\x08\x07\x04\xa8\xa8\x8a\x12\x08\xae\x5b\x21\x5c\x33\x88\x8d\x55\x9a\x91\x16\x24\xa5\xd5\x64\x87\xb1\x00\x1e\x2a\x99\x17\x04\x72\x55\xa0\x1a\xe7\x94\x01\x16\xb6\x83\xde\x03\x98\xd6\x9c\x23\x86\x27\x19\x18\x2c\xf2\x82\xe7\x10\xe6\x8a\xa7\xca\x33\xe6\x83\x60\x42\xb0\x3a\x4d\x4c\x59\x48\x5b\x70\xae\x05\xab\x1a\x2f\xb5\x72\x56\x14\x66\xaa\x0a\x84\xcc\x46\x6b\xcb\x98\xc2\x0e\x52\x82\xa5\xb4\x38\x58\x61\x18\x41\xd1\x73\x52\x46\xec\x38\x89\xd1\xe3\x3f\x4d\xfe\xee\x89\x45\xfb\x2f\x93\xff\xfa\x0b\x1c\xef\xfb\xab\x88\xe3\x7d\xa1\xe3\x9d\x95\x59\xcb\x90\xfe\xe1\xfd\xdd\xfb\xbb\x48\xd7\xcc\x22\x90\xf7\xcd\xc3\xcd\x6f\xa4\x51\x59\x23\xaa\x96\x2f\x6d\xcb\xfb\x33\xe2\xc1\x87\x8f\x4f\x60\x88\x55\x71\x88\xfa\xf3\x07\x8e\x8b\x21\xf7\x39\x40\x61\x9b\xe7\x14\x5b\x61\x10\x84\xd0\x62\xcf\x84\xde\x70\x08\x43\x92\x32\xcd\x60\x5e\xe4\xc7\x5d\x07\x05\x48\x6c\x81\xc6\x72\x98\xa3\xe7\x67\x9f\x5a\x4e\xb0\xf2\x9b\x6d\xc9\xd9\xd8\xf7\x7d\xaf\x64\x9f\x75\x9c\x38\xcc\xd6\x9e\x51\xc8\x85\xdd\xa0\x11\x14\xa1\xb4\x7b\xae\x1d\x3e\xd4\x9b\x0d\x09\xe3\xde\x4a\x53\x94\xa9\x9e\x3a\x21\x4a\xcd\x4c\x65\xc7\x11\x37\x6a\xea\xad\x35\xce\xad\x76\xee\xe8\x73\x03\xc3\x0e\x24\x65\x5e\xad\xea\x71\x9c\x86\xed\xb4\xc9\x8b\xed\xaa\xd4\x96\x7a\xb5\xe8\x8e\xc8\x47\x7e\x59\x67\x22\xaa\x90\xfd\x61\xf2\x47\xc9\x3f\x4f\x92\x37\xaf\x1d\x8f\x9e\x9a\xb8\xaf\xdc\x91\xfe\x3d\x9f\x47\x4c\xe7\x75\x14\x52\x3f\xa5\xd5\xb7\x51\x2f\x6b\xde\x0a\xbf\xe9\xfd\xae\x8d\x3f\xb6\x8f\x3f\x07\x7f\xe8\xe2\x8f\x5d\xde\xde\xf9\x5f\x7a\x72\x31\xfe\x12\x6d\x32\xeb\x30\x06\xfd\xa1\x03\x3b\xc2\x9c\x5f\xcb\xcf\x35\x20\x29\x24\x70\x2a\x69\x46\xa7\x03\x15\xf3\x7f\x8c\xc5\x27\x9a\xc2\x69\x4b\x15\x99\x4f\xe7\xd7\x44\xd1\x34\x99\x1c\x33\x2c\xd4\x1c\x3b\xc7\x88\xd1\xa1\xa2\x94\x46\x4f\xd9\xf1\xd1\xc6\xf8\xf9\xc3\x97\x89\xd4\xcb\x94\xe2\xea\x8b\xd7\x6b\x02\x70\xb5\xf8\x3f\x1c\x1d\x90\x61\x00\x64\x79\xe9\x8f\x14\x54\xa1\x5f\xd3\x61\x70\x83\x73\xc3\xd4\x37\x8d\xdb\x3b\xb7\x4f\x92\xa4\x48\xd4\xa3\x89\xff\xc6\x97\x9a\x6f\xb7\x67\x5c\xa0\x9f\x3d\x6b\xbf\x7d\x41\x7e\xcc\x4e\xfa\x6f\xaf\x05\xd2\xbe\xeb\xbd\x2f\x90\x2d\x2a\xc3\x9f\x06\x0f\xba\x40\x53\x0e\xba\xcf\xfb\xa7\xb3\x4f\x9b\x55\x7e\x3c\xf8\xcd\x06\xe0\x36\x5a\x3f\xe3\x16\x14\xf1\xad\xa6\x89\x6f\xc5\xa7\x4f\x28\x1d\x7d\x3a\x4e\x68\xc5\x0f\xc3\x8a\x4f\x28\x2b\x02\x01\x25\x63\xec\xc0\x39\xdf\x85\x12\x20\x21\x44\xd8\x09\x21\x00\x3a\x7f\x15\x46\x21\xa2\xdd\xd4\x92\x17\x8b\x47\x72\x59\x65\x65\xd4\x94\xfa\xc9\x09\x17\xf1\x37\x12\x7a\xaa\x61\x97\x7a\xe1\x4c\x67\xea\xd4\xd4\x3a\x6f\x6b\xbf\x5b\xc4\xc2\x62\xa9\xfb\x8a\x2f\x7b\xd2\x49\xfe\xf0\x70\xfd\xe3\xf9\xee\x3a\xd7\x8a\x7b\x85\xdb\xb6\x8f\x09\x50\x51\x35\xac\xd6\x42\x48\x6f\x3a\xd1\xa6\xd4\x08\x21\xe5\xb4\x17\xd4\x60\xb9\x52\x2b\x13\x1c\x02\xf2\x78\x00\x05\x0a\x55\x07\x76\x11\x02\x12\x8f\xd0\xc0\xd2\x16\x70\xaa\x80\xcc\x5d\x0e\x54\x70\x45\xbb\x61\x9b\x46\x8d\x0a\xe4\x3c\x74\x6b\xa7\x7d\x2f\x5b\x30\x6c\x2a\xed\x9a\x95\x88\xe4\x5b\x07\x05\x37\x9c\xd6\x20\x6f\xad\xd2\xa9\x60\x86\x09\xc1\x85\x64\x4a\x20\xab\x8f\x66\xe5\x74\xf0\x26\x38\x17\x8c\xab\x30\x85\x04\x6b\x8c\x73\x8c\x1c\x64\xba\xb2\xa2\x36\xc6\x6d\xbc\xb0\xc2\x11\xc5\xa4\x89\xa0\xae\x5f\x8d\xd7\xb2\xc9\xf0\x57\xee\xba\xbf\x97\xfc\x67\xc9\x1f\xc6\xfd\x3e\x59\x3a\x00\x29\x78\xc9\x3e\x9f\x3a\x00\x6f\xae\xd3\x27\xbc\xfe\x7c\x83\xac\xbe\xc8\xa7\x9e\xec\x2d\x9e\x9d\xf6\x6f\x63\xac\x7c\xf7\x6a\x77\x8f\xf4\x53\xaa\x04\xa3\xbe\x7d\x4c\x2a\x47\x1d\xc7\xae\xc8\x77\x61\x87\x2a\x67\xec\x5c\xf7\x0b\xb0\x5d\xd9\xa3\xf5\xa9\x9c\xea\xf9\xd8\xae\xe1\xe7\xed\x5c\xcf\xa2\xda\x6d\x8e\xf5\xaa\xd1\x55\xb3\x25\x61\x3b\x0e\xa1\xc5\x87\xd6\x0a\x07\xa0\xb4\x5e\x1e\x15\x81\x0e\x92\x20\x5d\x41\x3d\x03\x12\x7b\xbc\x12\x45\xa9\x2d\x09\xfe\x31\x81\xa8\x42\x9b\x11\x53\xc2\xb0\xf5\x3d\x2a\xab\x16\x60\x14\xf6\x00\xce\xf7\x24\xdd\xd1\xc7\x24\xf4\xd2\x44\x0c\xe8\x60\x8d\xc0\xa5\x87\x52\x10\x8b\x88\xb0\x92\x30\x5e\xd8\x1a\x37\xb6\x80\xfd\x86\x35\x75\xbd\x29\xda\xe8\x7f\x95\xe8\x64\x77\x59\x67\x30\xc9\x92\x1f\x44\x9d\xbf\xeb\xe8\x20\xf4\x84\x94\x3a\xf1\x4f\xde\xce\xeb\xf0\x74\xab\x45\xdc\xdc\x99\xa6\xe8\x89\x7d\x74\x7a\x7c\xe6\xc1\xdf\x7d\x00\x6c\xe3\x95\x6f\xd2\x72\xb5\x3f\x16\x3e\x1d\x26\x3c\x1f\x13\xad\x9d\x72\x15\xe8\x32\x7d\x24\x10\xae\x7a\xe9\x31\x83\x1a\x11\xb4\xb3\xe1\x20\x06\xdd\xb9\x30\x88\x9d\x1d\xb9\x14\xbd\xd8\x57\x5a\xb6\xb6\xcd\x20\x15\x56\x31\x19\xd4\x81\xf4\x84\x72\xab\xa8\x51\x10\x85\x83\x2e\x6c\x49\xe4\xa0\x35\xb7\x1b\xa9\x89\xc2\xc8\x30\x96\xb3\x6e\x23\xeb\xb8\xee\xe8\x25\xcf\xf2\xe7\x98\xf3\xeb\xc9\x6f\xc6\x75\xf7\xb7\x4f\xb1\xfd\x8b\xce\xd1\x9b\xb7\x37\x27\x3e\x72\x76\xff\xe3\xcb\x33\x1d\xe7\x39\x93\xfe\xc2\xdd\xe0\xfa\x64\x78\x70\xfb\xee\x1c\x01\x1d\xc9\xeb\xdf\x5c\x7f\x58\xee\x95\xc3\x05\xf9\x65\xef\x17\x17\x3b\xc0\x3d\x10\xcd\x27\xb9\xd5\x5d\x4a\x0d\x64\x8e\x68\x26\xad\x12\xdd\x28\xc2\x5e\x82\xbc\x5a\x69\xcf\x94\xe0\x50\x08\xf2\x79\xa3\xa9\x50\x62\xe5\xac\x0d\x7b\x8d\x85\xe2\xa2\x1d\xec\x4e\x82\xbc\xb6\x10\x23\x3d\xed\xe7\xcf\x55\x96\x87\xc6\xc4\x24\x3a\x74\x3a\xb4\xc1\xf5\xa6\x06\x1a\x68\x6f\x44\xa1\x04\x55\x0c\x61\x2d\xb9\xa2\x9a\x54\x76\xe2\x8a\x43\x07\x45\x6a\xa1\xa5\x9c\xe4\xd3\xde\x52\x46\x11\x52\x92\x28\xa2\x49\x55\x19\x51\xe4\x4c\xcf\x1f\xb2\x25\x66\x35\x8f\xec\x52\x64\x28\xf9\xb5\x58\xa3\x2c\xab\x6d\xde\x17\xff\x41\x9c\x7f\x7f\xa9\xdb\x7e\xfd\x64\x8b\x1a\x35\xdc\xaf\x4f\xeb\xeb\xfa\xbc\xe0\x7f\x0e\x6d\x27\xb3\x90\xc5\x1b\x76\xa9\xe3\xdf\xbd\xbd\x79\x58\x6e\x9a\x4b\xc1\x05\xd3\xc8\x32\x3c\x55\x1e\x8c\x01\xcd\x47\x68\xa6\xda\x47\x21\xf2\xf9\xf0\x60\xef\xc1\x21\xe4\x73\x2c\xdf\x35\xd2\x6e\xfc\x26\xec\x14\x20\x4d\xa8\x40\x1b\x8a\x1e\xa0\x30\x3a\x8a\x14\xa4\xc0\x03\xdc\x1a\x84\x34\xce\xd0\xa7\xbd\x54\xb9\xcf\xe5\xaa\x04\xc3\x86\xec\x28\x05\x32\xe0\xcf\xfb\x6c\x3b\xbf\x38\x70\xae\x68\x50\x25\x65\x4e\xd0\x2d\x40\x95\xb4\x5c\x83\x8a\x06\xdf\xcf\xa5\x1e\xc1\xbc\xef\xcb\x92\x13\x44\x62\xbf\x47\x3c\xca\x55\x95\xf1\xd3\xee\x95\x80\x05\x36\x13\xbf\xe9\x87\x8f\x6f\xa3\xaf\xcb\xfd\xd5\xc7\xab\x53\xee\xfb\xc3\x18\xdf\xdf\xde\x3c\xac\xd4\xb4\x4d\xe1\x7e\x4e\xfe\xbd\x0f\x3a\x18\x64\xbd\x09\xe3\x88\xca\xaa\x84\xbb\xc5\xcd\x65\xdd\x85\x5a\x86\x5a\x1b\x57\x40\xc7\x91\x2b\x00\x0f\x5d\x01\xdc\x0a\x32\x86\x09\xda\xdb\x40\x8d\x99\xd7\x2d\x7d\x64\x97\x36\x53\x27\x5c\xfb\xd2\x11\xd5\x4f\x55\x63\xbc\xe0\x8b\xac\xfd\x33\xae\xe3\xf2\x64\x40\xfa\xca\x75\x27\x0e\x35\x7f\xf2\x64\xd2\xbd\x98\x3b\x9c\xe0\x3e\xbf\x71\x6e\x71\xbb\x8a\xa5\xcf\xb2\xb3\x9e\xee\xf8\x18\x32\xef\x3e\xac\x21\x82\xab\x64\x9a\x77\xd6\x12\xe4\x5b\x7a\x08\x03\xb1\x03\xcd\x6d\x2e\x1a\x26\x04\x50\xd3\x6e\x3f\xe7\xe0\xd5\xc1\xef\x82\x11\x80\x8c\xa1\x04\x9a\x4b\x02\x21\xad\x37\x76\x93\xf6\x65\x09\x78\xf0\x36\x3a\x49\x39\x70\x00\xda\x02\xa2\xe8\xa0\xa7\x5d\x54\x97\xec\xe0\xd0\x09\x4e\xf7\x7e\x4f\x55\xa6\x08\xd5\x22\xec\x75\x39\x17\xd5\xb0\x2c\x11\x43\x8a\xe6\x88\x11\xa3\x90\x13\xcd\x63\x02\xf2\x4a\x19\x22\x0d\xc5\x24\x67\x40\x6c\x02\x0d\x0d\x07\x02\x54\xa9\x44\x30\xec\x85\x10\x62\xc3\xe7\x9f\xa9\x25\x04\xcc\xb5\x12\xd7\xb0\x44\x84\xb7\x2d\x21\x49\xf2\x2b\x51\xff\xd9\x67\x3c\xf9\x95\xe4\xa7\x27\x1f\x9c\xdf\x4d\xfe\x61\x9c\x6b\xfe\x1f\xe7\x18\xce\x0f\x7f\x06\xcc\xfd\x54\xde\xdc\xbc\x8d\x42\x16\x97\xf7\x6f\x6f\x3e\xde\xbe\xfb\x78\xfb\xcd\xf5\xbb\xb9\xf6\x04\xbf\x3d\x9f\xde\xdc\xbf\xbf\x8b\x32\xb6\x4f\x2d\xab\xf7\xdf\xd7\xb3\xfa\xf6\xab\xe9\x0e\x18\x6c\x09\x53\x36\x51\xc6\xf5\xb8\xda\xb9\x12\x82\x5e\x51\x6f\xb6\xf4\x50\x69\xaf\xbc\xa6\x58\x62\xee\x70\x18\xb8\x94\xed\x67\xdb\xa2\x74\x93\xb7\x5d\xce\x8f\x1d\x6c\x56\x79\xbe\x29\xf2\xb0\x2b\x36\x79\x01\x8a\xbc\x2b\xf2\xb0\x6d\xf2\xd2\x00\xac\x8c\x06\x7c\x00\x89\x0d\x28\xd0\x54\x00\x4c\xb9\xdd\x9d\x75\xae\x96\x99\x51\x15\x7c\x09\x72\x00\xbb\xb6\xd8\xa7\x3d\x28\x0f\x34\x1c\xc2\x61\x6a\xf5\x18\x46\x01\x8a\x8c\x23\x08\x35\x41\x42\x0a\x84\xb1\xee\x14\xc7\x8e\x18\x46\x35\xa6\x94\x09\x4e\xa5\xe1\x4c\xda\xc7\xa4\x93\x25\x53\x42\xf7\x4a\x60\x24\x04\x46\x61\x87\x30\x46\x18\x0d\x8c\xc0\x02\x6a\xd1\xf3\x02\x63\x4c\x5c\x45\x31\x2e\x8b\x4a\xb2\xc2\x95\x54\x17\x16\xb3\x42\xe1\x60\x30\x73\x02\x1b\xa1\x88\xc6\xc9\x45\xf4\xc9\x98\xeb\x9f\x39\x1b\xf8\xad\xe4\x6f\x9d\x3c\x62\x9f\x32\xc1\x8b\xcb\xbb\x8f\xf3\x5d\x9b\x9d\x43\x9c\x7e\x0e\xb2\xb7\x27\xed\x89\xb7\x73\xdc\x5a\x4a\x98\x9b\xab\x6f\xd6\xcf\x53\xf7\x77\x57\xb7\xef\x4e\xfa\xbb\x2f\x5b\xc1\xe5\x93\x02\x43\xcc\xb1\xce\x81\x3e\xdf\x46\x9c\xf8\x37\xf7\xbf\xb5\x16\x51\xa0\x23\x95\x88\x28\x1c\x08\x90\x79\xa8\x98\xb0\x28\xd7\x39\xef\x47\x19\x7a\x6d\x35\x68\x43\x1f\xa0\x33\xd2\x7a\x0e\x9c\x00\x08\x8c\x29\xa7\x93\x9e\x9a\xd6\x5a\x09\x92\x7d\xda\xaf\xf6\x81\x95\x90\x20\x6f\x24\x63\xbc\x16\x1b\x49\x72\xad\xb0\x28\xad\xa7\x80\xec\xf3\xbc\xdd\xd3\x5d\x57\x14\x7e\x20\xa0\x30\xc1\xa7\x89\xd2\x8c\xb1\x8c\x60\x8d\x94\x60\x8c\x53\xa4\x50\x59\x96\x18\x09\x4c\x68\x01\xeb\xd0\xed\xd8\x01\x40\xb0\xe9\xb8\x06\x5a\x18\x63\x45\xf0\x13\x63\xd4\x35\x4a\x56\x26\x65\xa5\x2e\x0b\x4c\x08\xd7\xa8\xf4\xcc\xc8\xbe\xc4\x44\xa9\x5c\x23\x28\xa9\x84\x85\x20\x0a\xf1\x22\x27\x50\x43\x1c\x6a\x8c\xf2\x65\x9f\x70\x8f\xec\x52\xaf\x0f\x67\xf9\xfc\x9c\xcd\xcf\xb9\xfc\xbc\x5b\x2c\x0a\xf1\x27\xcc\xf1\xd3\x31\xe7\x10\xef\xa2\xc4\xc9\xe9\xf9\x7b\x26\xd1\xe7\xe7\xab\x66\x22\x17\x74\x42\x2b\x54\x4d\xba\x9e\x4c\xb5\x82\x53\x3f\x67\xa6\x2b\x02\xb6\x01\x1e\xcf\xce\xa7\x9d\xed\xac\xed\xba\x95\x3f\x3d\xbb\xe5\x79\xad\x9d\x93\xc1\x82\x24\x28\x50\x3d\x26\xc0\x0e\x4a\x69\xa6\xb5\x66\x93\x21\x24\x75\x81\x00\xea\xbe\xf3\x34\x49\xfe\xfc\xc9\x23\xce\x24\x3f\x7c\xee\xd8\x2d\xec\xbd\x27\xbf\xd8\x18\x1b\x22\x66\xe1\xed\x82\x51\xc8\xde\xdf\xfd\x10\xfc\xe4\x6d\x76\xca\x31\xdf\x7d\xf1\xfc\x1a\x16\xfd\x34\x06\xbf\xba\xbd\x7a\x73\x16\x76\xd7\x50\x96\x25\xe8\x80\x17\x63\x7f\xec\xfa\x3d\x4d\x79\x5a\x0d\xed\xa1\xc8\x03\x05\x4d\x10\xb6\x69\x40\x0d\xda\xc0\x6c\xdb\x82\xcd\x1c\x2e\x6d\xdf\x03\xa4\x15\xe5\x50\x13\x1a\x06\x1f\x46\x1f\xc6\xaa\x8a\xae\x72\x2d\x40\x1e\xe0\xcc\xa8\xa2\xf4\xa4\xc2\x44\x0a\x4e\xbd\xd7\x94\xdb\x3c\xef\x42\x27\x8d\x7a\x7e\x08\xdb\x80\xb9\x28\x5c\xc1\xf0\x30\x0c\x43\x38\xa4\xf6\x31\x12\xea\xcd\x9c\x83\xdb\x38\xef\x20\x49\x76\xfa\xab\xff\xf5\xe4\xe7\xd1\x1f\xe2\x1f\x9e\xf4\x5f\xfe\xf5\x93\xc3\xfe\xbb\x33\x53\xa3\xfb\x0f\xab\x58\xc0\x5c\xdd\x2c\xea\xea\xf7\xab\xfb\xb7\x97\xf7\x5f\xb8\xe2\xff\xe8\xd7\xc1\x9b\x9b\x8f\x37\xab\x9b\x8f\x37\x17\xe0\xac\x91\x06\xbe\x6c\xb0\xcd\x0b\xf1\xf2\xb7\xef\x2e\x7a\x16\xf4\xd4\x63\x30\x1e\x55\x55\x40\x50\xf8\x30\xf8\x06\xd1\x45\x03\x25\x0c\xeb\x9e\xc2\x1a\x51\x4d\x3b\xa6\xa5\x8b\x1d\x58\x02\x8f\x3b\x6c\x4d\xe7\xd3\x04\x4d\x63\x9e\x5a\x36\xd1\x1c\x20\x5a\xba\x92\xb4\xa4\xf0\x05\x5e\x95\xa4\x50\x05\x0e\xb9\xc5\xc4\x32\xd0\x93\x42\x97\x88\x20\x03\x33\x62\x79\x61\x73\xc8\xf8\xe7\x56\xe9\x35\xb7\xd3\x0e\xe4\x13\x05\x18\x58\x63\xa0\x96\x8f\x89\x35\x41\x36\x85\x2f\xe4\x78\x18\x24\x40\xc0\x00\xfa\x98\xd8\xe0\x0c\x49\x1d\x63\x88\xb3\x82\x32\xc4\xe9\xb1\x13\x12\x2a\x51\xa2\xde\xb1\xca\x6a\x03\xad\xce\x8d\x2b\xea\x58\x2f\x82\x35\x7c\xf4\x97\x6e\x7d\x48\x7e\x7d\x5e\x3f\x4f\xdd\xca\xab\x33\x6b\xa1\xf9\x58\x63\xc0\x21\xaa\x49\x09\x58\x68\x62\x92\xa9\x8f\x55\xac\xc7\x71\xd8\xac\x29\xa7\x48\x48\x1f\x6a\x17\x61\x5a\x8d\x03\x72\x99\xa7\x3a\x50\x5d\xfa\x2c\xf9\xaa\x0e\x7f\x77\x9a\x03\xc6\xac\xf8\xa9\x40\x8a\xe8\xaa\x2f\x5e\x9f\xab\xf3\x3d\x31\x05\xe7\xc7\x61\x2e\x94\x7d\xd4\xef\x3a\x1d\xab\xe4\xab\xb7\xa6\x5d\xed\xa5\xad\x57\x63\xe3\x84\xab\x3e\x7b\x65\x36\xb2\x5d\xed\xb5\x6d\x64\x9b\x25\x93\x07\x2d\x3f\xb0\x3d\x03\xdd\xf3\x69\x47\x99\xe4\x44\xc6\x47\xc1\xe6\x74\x95\xc6\xc7\xc8\x37\x88\x7d\xdf\x3c\xf9\x69\xf2\xf3\x93\x77\xe3\xef\x3f\xf7\x2f\x5e\xed\xcc\xb7\xa7\x0b\xf7\xfa\xcd\x77\x4f\xde\xd6\x91\x6a\xfa\x66\xa1\x9a\x9e\xe9\x6f\x5f\x3f\xb1\xef\x73\xb0\xab\x40\xef\xf3\x52\x4b\xc9\x05\x66\xd2\xa2\x4d\x5a\x7c\x26\x29\x8c\x04\x51\xc9\x18\xe5\xaa\xc1\xed\xd4\xfb\x4d\x55\xd9\xbc\xd3\x4d\x6e\x81\x0b\xdd\x85\xaf\x8e\xdb\xaa\x5a\xc1\xe3\xd6\xa6\x68\x1a\x23\x2f\x65\xdd\x31\xe6\x30\xa2\x5c\x71\x32\x6f\x88\x36\x54\xce\x01\x85\x31\xa5\x9a\x11\x4e\x84\xb5\x2e\xd4\xa0\xf9\x44\x53\x16\x4c\x63\x3c\x40\xae\xeb\x27\x82\x71\xda\x4f\x5b\x50\xb3\xb0\x8b\xb5\xf0\x92\xa3\x6f\x32\x96\x64\xcf\x68\xc9\xbf\x11\x59\x6c\x7f\x70\x9a\x8c\x2f\x6b\xf0\x95\x6a\xd0\x87\x87\xdf\xbe\x7b\xf3\xec\xb3\xf4\xaa\x59\x9d\x9d\x42\xf5\xdb\x05\x76\xf3\x0c\x51\x3d\x5f\x7b\x1f\xef\x5f\x12\xca\x9b\x9f\xbc\x3f\xc9\x2a\x5c\x26\x34\x88\xa9\x42\xe0\x30\x75\xb5\xd7\x06\xd1\x32\xfa\xd4\x37\x8f\x89\xcd\x0e\x16\x53\xcb\x42\xcb\x0a\x57\xd0\x2d\x2d\x6d\x41\x80\x09\x6a\xb5\x0f\x38\x2d\x3f\xcb\x34\x09\x6c\xb5\x3d\xa2\x15\x3f\xb6\x2b\x76\x6c\x40\x6b\x95\x50\x36\x58\xa5\x2a\x59\x1f\x3c\x73\x1d\x29\x6c\x29\xc3\x7e\xaf\x57\xd4\x72\xcb\x4c\xc6\x0c\x29\x4c\x61\x83\x69\x1a\xef\x4b\x5f\x32\x56\x57\xa0\xfe\xd4\x66\xbd\x42\x9c\x50\x52\x12\x82\xe6\x47\x8c\x28\xd9\x4a\xc9\xa4\xac\x83\x90\x54\xd1\xd0\x60\xa6\x05\x41\xac\x91\x46\xea\x1a\x96\x90\x41\xcb\x28\x1b\xb4\xe5\xd1\xe8\xeb\x57\x62\xcd\x58\x67\x65\xf2\xc3\xe4\xc7\xc9\x5f\x39\x53\xf3\xfa\xfd\xa8\x68\x3b\xc7\xf8\xeb\x97\x18\x7f\x79\xf3\xfe\xee\x22\x12\x65\xbf\x66\x0c\xfe\xe8\xfa\x9b\xeb\x0f\x6f\x6e\x2f\xbe\xda\x01\xae\xce\x47\x5d\xe7\xe5\xe3\x87\xd4\x55\x65\x09\x92\x41\x61\x32\x19\xa1\x38\x70\x10\xec\xbd\x17\x2b\xe1\x29\xa8\x19\x72\xba\xd1\xce\xcc\x4b\x46\x2b\x06\x91\x6a\x39\x93\x12\x1e\xf2\xcf\x78\x2e\x1e\xac\xf7\xc0\xcc\x27\xce\x39\x57\x94\x46\x0a\x21\xa9\xd5\xdb\x40\x5d\x5e\xd8\x39\xf3\xe5\x56\x8f\x59\x89\x4b\xa8\x9d\x45\x88\x53\x82\x6d\x5b\x49\x26\x0e\x68\xeb\x83\xd8\x7a\xed\x75\x55\x6b\xab\x37\xf5\x48\xb0\x06\x85\xd9\xd5\x3d\x40\x45\x21\x83\x31\xb5\x9e\x1f\xc2\x08\x19\xe3\xcc\x4a\xaa\xb5\xea\x46\x88\x11\xa5\x96\x53\x2f\x55\x73\xba\x76\x55\x56\x26\x7f\xe1\xf9\xba\xfd\xfe\xa9\x8f\xfa\xaf\xce\x23\xd9\xa2\x3a\xfe\x84\xae\x7f\x96\xd3\x7b\x11\x89\x39\x49\x3c\x7f\x21\x15\xf3\x6e\x11\x07\x3a\xb1\xbf\xdf\xde\x5e\x65\x4b\x73\xfa\xdd\x99\x46\xdc\xba\x04\xa2\x28\x3d\x2a\x81\x0d\x09\x17\xc3\x08\x4b\xa5\x94\x26\x61\x13\x3c\xb2\x6a\x3c\x72\xef\x81\xf4\xc6\x54\x13\x4c\xfb\x63\xc3\x6a\x0f\xe0\x2b\x55\x99\x9e\x8b\x43\xa9\xa8\x84\x01\xfa\x54\x07\x08\xb6\x47\x29\xa8\x21\x62\x34\x4c\x48\xbe\xae\xe2\x94\xd0\x38\x59\x62\x08\x99\xf2\x42\xb0\xd2\x88\x3a\xd6\xe1\x6e\xda\xba\xd0\x38\xb0\x75\x29\x94\x51\x82\xa1\x95\x7c\x12\x5c\xd8\x1c\x61\x7c\x58\xb1\xbd\x31\x46\xeb\x5c\x2a\xa6\x05\xa3\x8e\x0b\x11\x63\x32\x8f\x71\xac\x4c\x7e\xf5\x2c\x8b\xfa\x45\xac\xb5\xff\xf3\xa5\x53\x71\xe6\x17\x71\xe2\xcb\x5f\x5c\x7e\xd5\xfb\xbc\x7e\x91\x5d\x3c\x33\xc0\x5b\xfe\x7b\x42\xc7\x7e\xc7\x9c\x2a\xf6\xb3\x84\x87\xa0\x42\xa8\x9f\x72\x24\x37\x40\x62\x18\xc6\x82\xa2\xcd\x66\xae\xaa\x61\x7c\x5a\x41\x0f\xf1\x18\x5c\x94\xd1\xf2\x41\x57\xf1\x7a\xed\x40\x19\x1a\xb0\xa7\xa1\xa6\x73\x82\xde\x70\xec\x30\x9b\xbc\x45\xcc\x8a\x14\x93\xc2\x95\x48\xa2\xaa\xcc\x4a\xc8\x8d\xa0\x93\x4e\x0b\xa4\x3a\x4b\x39\x52\x61\x1f\x8d\x27\xbc\xf7\xe9\x1e\x3b\xe9\x5b\xd7\xfb\xb9\x04\xf4\xbd\x6b\xbd\xb3\x52\x21\x2d\x8f\x85\x6f\x48\xe3\x21\xed\x2c\xf7\xde\x7b\x54\xbb\xdc\x55\x65\x63\xe2\x2c\x6a\xae\x7f\x61\xf2\x2e\xf9\x18\x2b\xb4\x3f\x49\x4c\xf2\x3f\x27\xff\x7b\x92\x80\xdb\xa7\x9d\x32\x16\x68\x91\xb6\xf3\x22\x52\x7b\xf3\x61\xd1\x82\x7a\x77\x86\x2b\xb8\x38\x49\x89\xfd\x7f\x90\xad\x8d\x5c\x83\x2f\x65\x6b\x4f\x6f\x9e\x6f\x8c\xe0\xd0\xa6\xdd\x71\xb3\x62\x41\x17\x10\xb8\xbe\x00\x45\xd7\x72\x6d\x78\x47\x2b\xba\x05\x45\xee\x10\xe4\x62\x7d\xc0\x4d\x4f\x59\xd8\x17\x1b\x21\xa9\x4e\x7b\x26\x4d\x83\xc7\xa6\xda\xe2\xda\x48\xce\x0f\x54\x70\xf2\x49\xad\x4a\xc6\xf4\xa6\xec\x38\x0a\xdb\x50\x11\x50\x01\x34\x99\x95\x5c\x95\x8c\xea\xb6\xec\x19\x0e\xdb\x50\x63\xe0\x00\x9a\xf4\x71\x3f\xb4\xa4\xeb\x57\xd5\xd0\x91\xbe\x5f\xb7\xd3\x4e\xa5\x3b\x85\xa0\x60\x42\x2a\x41\x5d\xa1\x0a\x2e\x20\x42\x25\x63\x1b\x43\x35\xa3\xd8\x13\x09\xb9\x0a\x1b\x25\x28\x2c\x2d\xe4\x0c\x99\x12\x51\x41\x10\xc6\xc1\x4e\x7b\xca\x0a\x53\x40\x25\x99\xa5\xa2\xd5\x4f\xaf\xa5\x88\xaf\x61\x89\x0c\x81\x32\x3e\x46\xbc\xe7\xbc\xfe\xd5\xa9\x93\xf8\x36\xf9\xf5\xd3\xfa\x3f\xc3\x10\x5c\x7f\x97\x47\xfc\xbf\xc7\x62\xf9\xbb\xac\xee\x9e\xbc\x95\x9b\xf4\x50\x96\x15\x46\xe9\xe1\x97\xdc\xa4\xf5\x24\x23\x81\x31\xad\x9e\x4f\x27\x5d\x8f\x04\x6c\xb6\x93\x4a\x93\x48\x20\x8c\x76\xf1\x6d\x15\x41\x1f\x2a\x54\xe0\x30\x61\x61\x9c\xb0\x52\x36\x5b\x32\x35\x61\xcf\xc6\xc6\xc3\xb1\x67\x69\xb5\xe4\x2c\xeb\x3d\x82\x98\x50\x4d\xc3\x5e\x72\x39\x3f\x1c\x39\x46\x8e\x28\x43\x15\x35\x18\x63\x1c\x4f\x38\x25\x84\x13\x4c\xa0\x93\x40\x60\xed\x97\x61\x75\x5a\x51\xda\xd0\x58\xa3\xf2\xe8\xaf\xbb\x5c\x99\xdf\x3e\x69\x01\x3e\x69\x11\xc4\x5e\xd1\x99\x6a\x4e\xcc\x5f\x6e\xbe\x16\x51\x7d\xb8\x79\x7f\xf7\xe6\xc3\xc7\x9b\x67\x13\xef\x08\xde\xbf\xba\xbd\x5a\xbc\x62\x41\x57\xe5\x25\xc0\xd3\x3e\x45\x13\x1f\x4a\x19\xa1\xab\x4d\x10\x6b\x09\x0b\x60\x9a\x12\x82\x72\x31\xc9\xf7\xcb\xa5\x38\xe0\x0a\x98\xb2\xe8\x60\x19\xb6\xf8\xb3\x58\xa1\x7a\x85\x26\x05\x30\x30\x3c\xd0\x30\xd6\x61\x17\xa8\x02\x1a\xd0\x49\x65\x16\x22\x18\x2a\x1d\xaa\x15\xc5\x61\xab\xa7\xd6\xa4\x15\x26\x86\x73\xa3\xcd\x30\x18\x6d\x6a\x03\x61\x68\x38\xaf\x27\xef\xbd\xab\x48\xa5\x87\xf9\x5f\x19\x8c\xe3\xd5\x52\x2b\xca\x47\x76\xd9\x66\x49\xf2\x6b\x27\x86\x07\x4c\xbe\x3d\xf1\xee\xff\x20\x11\xe7\x2a\x70\x7f\x66\x98\xcb\xbe\x66\x30\xcd\x57\xe7\xf2\xee\xdb\xaf\xaa\x84\x53\x78\x5b\x0b\x9f\x17\x60\x8b\xf0\xee\xe8\xa9\xea\x41\x4b\x50\x70\x90\xe2\xdd\x0e\xe8\xed\xb4\x89\x4f\x47\x49\xc3\x0e\x14\x61\x5f\x1b\x29\xa4\xb7\x4a\x76\x26\x6c\x01\xde\x12\x20\x32\xa8\xa9\x23\x7a\x22\x96\x48\xa7\x53\xc3\x4b\x5f\x52\x33\xc7\xb5\x04\xc2\x72\x09\x6c\x88\xea\x5a\xcd\x89\x60\x38\x44\x4f\xf3\xaa\xaa\xd2\xc6\xd2\xad\xc7\xde\x5b\xaf\x26\x9f\x96\xa3\xb4\x1d\x40\xbe\x87\x1e\x1e\x95\xab\x79\xed\x08\x6b\xe7\xc8\xe6\xaa\x97\xc8\x96\x24\x59\x62\x1f\xf1\x65\x93\x89\xe4\x87\xc9\xbb\xe4\x67\xa7\xea\xf2\x4b\x07\xd6\x53\x96\x7b\x3e\x30\xfa\x78\xfb\xee\xb4\x89\xbe\xc6\x94\x9d\x62\xe1\x29\xb3\x3d\xb5\x2a\x6e\x1e\x6e\xd6\x8a\xc0\x74\xfc\x94\x7b\x6f\x57\x79\x09\x07\x90\x7b\x80\x76\xa6\x65\x8d\xf5\xae\x13\xa3\xac\x27\x0c\x12\xbf\x6d\x05\x55\x08\x7b\xa9\x45\x25\x87\xac\x3d\x7a\x42\x57\xda\x1f\x07\xaf\x34\x03\x79\x1d\x1c\xb0\x2b\x7c\x1c\x32\x41\xa9\x9d\x76\x81\x85\x46\x00\x0e\xea\x54\x22\x14\x5a\x29\x8d\x21\x8e\x57\x7b\x90\x37\x42\x4b\x65\x84\x30\x8c\x11\x8c\xc6\xd1\x52\xc5\x4d\xa8\x1c\x46\x01\x21\x04\x38\x46\x56\xc8\x60\x9a\x88\x35\x30\x8f\xf4\xd2\x64\x22\xaa\xa8\xfc\x8d\x98\xdd\x3f\x57\x96\x97\xe7\xb8\x8d\x0f\x51\x12\x6b\x4e\x20\x3e\x5e\x3d\x2b\xfd\x2d\xb7\x40\x16\x01\x47\x5f\x74\xed\x4f\xb7\xcc\x6a\x61\x74\xbe\xb6\x34\xce\x4e\x84\x98\xeb\xcb\xf7\xef\x56\xd0\x13\xd0\x86\x43\xac\x9c\x8b\xb0\xaf\x5c\x11\x6c\x50\xc8\x38\x1f\x5a\xc0\x1a\x4c\x64\x15\xf6\xda\xb5\xb2\xcf\x6c\xe7\x23\x94\x95\x43\x01\xd1\xe7\x52\x12\x6a\x29\x13\xfb\x32\x93\x9f\xea\xfe\x62\x7f\x1c\xb8\x8b\xb8\x2f\x76\x1c\xc0\x5e\x36\xa1\xa6\x00\xaf\x5a\x50\x6c\xf5\xf6\x31\xc9\x04\x14\x5a\x28\xaa\x64\x91\x2b\x52\xd8\x71\xc8\x41\xa1\x04\x82\x8a\x2b\xd6\x48\xad\xf4\x54\xa7\xbb\x90\x30\x5e\xda\x02\x01\x4e\x39\x0d\x0e\xe4\x18\x29\x17\x88\x66\x66\x10\xac\xb0\x05\x69\xa1\xd2\xdc\x11\xc5\x95\xd1\x2c\x7a\x9b\xb1\x55\x9d\xe5\xc9\x0f\x4f\x0a\x76\xf7\x4f\x60\xad\x87\x05\xd3\x79\x7f\xf5\xe1\xe3\x75\x32\xa7\x5f\x0b\xa7\x19\xec\xfd\xe1\x00\xe0\xb1\x37\xce\x79\x29\xe4\x63\x12\x0a\xb6\x6b\x06\x27\xb4\x31\x59\xde\xb8\x8d\x73\x40\x07\x3f\x84\x41\xd7\x2a\xe4\xde\x0a\x03\x1c\xde\x3a\xe1\xe2\xda\x36\xd1\x7f\x2e\x39\xad\x6a\xfc\x9c\x37\xff\x5e\xc2\x93\x7f\xf4\x34\x4f\x3a\x1f\xc4\x2d\x7e\x32\xe9\xe5\xbb\xf7\x77\x0b\x84\xf7\xea\x26\xbb\x7e\xd9\x80\xc1\x49\x2d\x30\x9a\x22\x9d\x8e\xec\xab\x41\x5c\xda\x73\x64\xf3\x62\x1b\x76\xa8\xf2\xce\xc1\xd6\x54\xc6\x6b\x41\xa9\x1f\xf6\x00\x95\x10\xa8\x95\x3c\xd6\x3e\xa5\x53\x07\x0a\x0d\x95\x10\x9c\x53\xa6\x5c\x2a\xf8\x67\xa5\x7c\x14\xd9\xf7\xa0\xac\xaa\xe3\x06\x97\xae\x44\x41\x99\x82\x1a\x0a\x28\xb1\x28\xd5\xbe\x41\x08\x11\x68\x5d\x0f\x4b\xb7\x01\x08\x85\xbd\xcf\x4b\x69\x70\xb0\x23\xa6\x38\xad\x26\x6b\x40\x55\x12\xc2\x84\x14\x54\x52\x61\x03\x9d\x0e\xd6\x46\x7d\xde\x27\xe6\x80\x73\x52\x63\x23\x21\x1c\x36\x74\xb3\xa9\xdb\xa2\xab\xe6\x3a\xc3\x3d\xd2\x4b\x7d\x36\x0f\xbf\x8e\x93\xe1\x0f\x09\x4b\xfe\xc1\x77\x60\x9a\x4f\xfd\xa1\xec\xf9\x06\x3e\x39\xd1\x9d\x2a\xb4\xa7\x8f\x6f\x17\xb3\xfd\x6c\x99\x60\x7e\xfb\xf1\xfd\x42\x4f\x56\x19\xfd\xd4\x2d\xb6\xc7\x1e\xe4\x16\xe4\x40\x54\x9f\x78\x05\x9c\x17\xc2\x13\x6c\x40\x09\xc4\x4a\x1f\xab\x74\x8c\x9e\xaf\x70\x4d\xfc\x11\x7b\x80\xe4\x4a\x69\xbb\x01\x09\x0e\x9b\xdd\x3e\x74\x04\x24\x9d\x02\xb9\x11\xc1\x88\xac\x08\x83\x5c\x86\x4f\x87\x43\x55\x1d\x2c\xae\xf4\x24\xd2\x02\x63\xb1\xdb\x06\xc7\xa9\x20\x61\x33\x5a\xb7\xdd\x0b\xc1\x09\x2a\x4c\xc9\x19\xd4\x05\x26\x39\xc2\x64\xbe\x5f\xd8\x23\xbb\xec\xb2\xf2\xff\xe7\x5e\xb0\x00\x86\x7e\x74\x7d\xf9\x7e\xb5\xb8\x33\x2d\x7b\x41\xf6\xfd\x7b\x01\x30\xbe\x28\x81\x9d\x73\xdd\x04\xcb\x11\xb0\xa8\x1a\x8e\x5e\xe7\xba\x23\xab\x9a\x39\xbb\xb5\x83\xe8\x8d\x77\xad\xda\xd9\x30\x00\x1d\x3a\x0c\xea\x69\xc7\xb1\xc5\x7c\x49\x72\x79\x4a\x48\xe1\x8b\xa7\x24\x17\x63\xc3\xc9\xa4\xd3\x12\xab\xde\x51\xca\xf1\x59\x96\xbb\x73\x08\x1e\x5c\x68\xea\xba\x07\x7c\x82\x69\x1b\xc6\x8d\xeb\x01\x76\x5b\xec\xf0\x91\x2d\xfb\xc1\xd7\x99\xee\x7c\xaf\xa8\x47\x75\xe9\x33\x7d\x9a\x74\x2f\xeb\xea\xef\x47\xb5\x65\xf1\xba\xcf\xfd\x61\x69\x74\x47\x67\xe8\x67\x83\xfe\x9f\x83\xc8\x28\x7e\x46\x24\x9f\xdf\x5c\x4f\x00\x8b\xeb\x93\xe2\xe0\xf5\x89\x46\x33\x1f\x2b\x5b\xa5\x7a\xf2\x2b\x8a\x99\x43\xe5\x44\x53\x5c\x4c\x1d\x05\x18\x14\x0c\x95\xae\xb4\xc1\x04\x63\x42\x5f\x00\x16\x74\xef\x34\x4f\x45\xe8\xd6\xfa\xf3\xe2\x4d\x06\x76\x40\x1d\x37\x4f\x67\x7b\xfb\xcb\xd1\xcf\xf1\xc5\x1e\x0e\xc0\x1c\x0e\x99\x66\x8a\x2a\xc6\x39\x84\xac\x54\x25\x2c\xf3\x3c\x67\x94\x23\xc8\xd1\x9c\xa0\x06\x18\x74\xe8\x79\x0b\xca\x31\x85\xa1\x08\xf2\xc0\x18\xdb\x32\xc6\x76\x83\xd6\xc3\x10\x6f\xbb\xf9\xba\x44\xcf\xcb\xf5\x2e\xc9\xce\x5c\xf4\x7f\x33\x21\xc9\xef\x46\x0d\xea\xeb\x97\x31\xcd\xb3\xd5\x5e\x9c\xcd\x5c\x7d\xa5\x22\xfb\xf6\x26\x3b\xd3\xfb\xfb\x42\xdc\xe7\x06\x3c\xc3\x2b\x5e\x79\xf1\x81\xd6\xf8\x81\xd5\x69\xe1\x8a\x12\x50\x14\x3d\xf9\x2c\x86\x8f\x09\xa1\x66\x53\xd7\xd1\x93\x2f\x3e\x0d\x60\x17\xca\x23\xb5\x4c\x78\x42\xf9\xb8\xe6\x29\xf4\xdc\x70\x5a\x0a\x4e\x1e\x93\xe3\x66\xc1\x54\xc8\xe0\xf2\xbc\x6b\x59\xdb\xaa\x51\x01\x48\xc2\xb0\xde\xd1\xd1\x6a\xd9\x22\x08\x35\x23\xd3\x36\x85\x94\x10\x24\x4c\xa0\x71\xe6\xab\x94\x4a\xb9\xf5\xd4\xa8\xe3\x3e\x35\x04\x59\xdf\xda\x89\xcb\x79\x37\xa0\x69\x15\x24\x84\x39\x2c\x4d\x59\x10\x61\x14\xd5\x4c\x8b\xd8\xbb\x25\x31\x4e\x93\xa8\xfb\xb5\x68\x94\xfd\xd5\xe4\x21\xf9\x59\xf2\x7b\xa7\x3a\xfd\xdf\x3d\xc5\xea\x53\x83\xe8\xa9\xe1\xf3\x74\x37\x3d\x29\x69\x9e\x15\x3b\x37\xe7\x1d\xc1\xfb\x73\x33\xa3\x87\x2f\x5e\xde\x9d\xf5\x0b\xbf\x2b\x83\xfd\x78\xb3\x6a\x9d\x96\xda\x86\xd2\x5a\x6b\x2a\x40\x3c\xdf\xec\x65\x51\xe4\x55\xe1\x82\x0b\x07\xb7\x66\x56\x38\xe6\x8e\x65\x24\xdc\xac\x0b\xc5\x0c\x55\x21\x99\x97\x24\x5d\x13\x46\x2c\xe6\x01\x79\xee\x50\xee\x72\xb1\x75\xe2\xe8\x3c\xab\xe7\x17\x72\xef\x78\x63\x4a\x69\xe4\xaa\xb2\xa5\x34\xe2\xa8\x57\xb0\x5e\x91\xc9\x83\x62\x4e\x77\x71\x18\xea\x70\x08\x39\x05\x6d\x3f\xd5\x19\x21\xdc\x48\x5a\xb2\x6a\xce\x59\x7c\x09\x4b\x54\x28\xdc\x4a\xc6\x3b\x6d\xb9\xd5\x5b\x26\x98\x60\x44\x28\xa6\x04\x17\x44\xf2\x5c\x19\x62\x25\x1c\x08\x12\xc8\x33\xc2\x0f\x1d\x81\x0c\x59\x46\xf9\x00\xad\xa1\x5a\x41\x67\xa8\x0e\x23\xe7\xce\x92\x4a\x8d\xa1\x01\x72\xab\x1c\x37\x49\xf2\x83\xc4\x3f\xaa\x4b\x9b\x95\xdf\x81\x89\x3a\xcd\x4f\x5e\xf7\x7e\xc1\x97\x35\xd4\x17\xaf\x57\x9b\xe3\x76\xce\x3a\xe6\xa4\x6c\x85\x7f\x59\xac\xe0\x71\xbb\x82\x13\x4f\xe5\x54\x47\x19\xec\x55\xf9\x7c\xfa\xb9\xff\xae\x77\xd7\xde\xb9\xe9\xe0\xa6\xbd\x73\x69\xe1\xc0\x26\x34\x46\x99\xf9\x61\xda\x85\xda\x68\x33\x3f\xc4\x9a\x86\x5e\xba\x2c\x4f\x7e\xe3\x79\x0a\x22\x4e\x8a\xbf\xf7\x11\x2f\x78\x71\x79\xbe\x8e\xa2\x62\xf1\xb9\x87\xf9\x77\x54\x38\xef\xef\x9e\xb9\x0f\xaf\x81\x39\x1f\x6f\xbe\x71\xdb\xaa\xeb\xaa\x92\x4b\xa6\x38\x87\x82\xe3\x8e\x1c\xb6\xa9\x59\x8b\x05\x0a\x90\x96\x8f\x09\x44\x20\x09\x24\x85\xd3\xb6\x8a\xfa\x13\xaa\x9d\xd3\xda\x6d\xe4\x3d\x10\xbf\xd9\x00\xda\xf8\xcd\x34\x82\x9c\x04\x0f\xd7\xc5\xe1\xe0\xc3\x80\x2d\x82\x41\x68\x91\xfb\x5c\x00\x4e\x2a\x0a\x24\x90\xc1\x72\x23\x2c\x25\x46\xb8\xcd\xc6\x09\x43\x89\x15\x86\x2f\xbe\xa1\xc7\xad\x89\xfa\x00\xbf\x92\xb0\xf9\xfb\xaf\x0f\xa7\xbf\xd8\x93\x7a\xea\xef\x46\x24\xd2\x6b\xb6\xc3\x53\xb5\xf2\x6b\xe0\x94\x91\x3f\xbc\xa8\x9b\x5f\x9c\xac\x11\x4f\x61\x0a\xc4\x28\x75\xfd\x3d\x92\xa2\x16\xb0\xc8\x54\x05\x30\x6c\xdb\x39\x37\xab\x94\xe2\x72\xab\x76\x00\x86\xb6\xf5\x3e\x8e\x78\xca\x52\x6e\xe3\x36\xa7\x31\xee\x8f\x07\xe0\x08\x0e\x7b\xc8\xe1\x39\xa2\x0b\x4b\x7b\xe0\x07\x30\x74\x4e\xbb\x6e\xdd\x70\xee\x5c\xc8\xc9\xa2\xe7\x60\x41\xd5\x18\xa6\xfb\x3d\x38\xb8\x90\xef\xf7\xfb\xb2\x2c\xd4\x06\xe4\x71\x7f\xa3\xc7\xdd\xaa\xa4\x8c\xf0\x9d\x0e\x1b\x13\x36\xfa\x31\x51\x82\x3a\xcc\x28\xd3\x92\x9d\xe1\x51\x51\xf2\x83\x53\x44\xfe\x6b\xc9\x2f\x9e\xb1\x6e\xcf\xdc\xa2\xec\xe6\xea\xf6\xb5\xea\xc4\x13\x93\xf9\xc5\x52\xe4\x54\x0d\x3f\x4b\x1e\xcf\x37\xc8\x93\x7a\xef\xab\x10\x7d\x4e\x43\x4a\x21\x86\x80\x1e\xb7\x00\x97\x30\xf5\x2b\xd8\x15\x98\xc2\xc2\x95\xc2\x59\xee\x73\x3f\x6a\xdf\xe6\x9b\x2a\x22\x48\x4e\xc7\x71\x8b\xcb\x0a\x43\x8f\xd0\xf6\xe8\x47\x88\x2c\xb0\x7e\xce\xfb\x99\x65\x04\x72\x4e\x82\xb5\x96\x28\xab\x52\x27\xa3\xfe\x2c\xe2\xc2\x39\x4a\xca\xa3\x09\x2d\x2c\x89\x27\x9d\x64\x0a\xc8\x71\x27\x34\xde\xf4\xa9\xd3\x73\x9d\xec\x0d\xb0\xca\x68\x8d\x14\x77\x4e\x8a\x40\x85\x70\xa1\x52\x02\x56\x88\x01\x4e\x70\x6b\xb9\xf1\x2a\x2a\x08\x2c\x7b\x3c\xbd\xec\xb2\xfc\x84\xc3\x7a\x89\x04\x3f\x3d\xf1\xf8\xce\xd0\x58\x4b\xec\xfd\x29\x78\xbd\xea\xb3\xc8\x75\x7c\x52\xa8\xfb\xe6\x14\x55\x17\x98\x07\xd0\x95\xd5\xb6\x4a\xe1\x8a\x1d\xdb\x2a\x2d\xa7\xdd\x04\xbd\xd1\xc6\x83\x7d\x8a\xa7\x21\xa6\x86\x29\x4c\xc9\xd4\x47\x69\xf3\xcf\xad\x65\xb6\xf2\x20\x4f\x75\x95\xda\xe9\x70\x00\x94\x87\xfa\x31\xa9\x76\xa1\x55\x00\xef\x43\x9e\xe5\x91\x7f\xa8\x42\x65\xcc\xb0\x50\x11\x1b\xa3\xf5\xfc\xd0\x8b\xd0\x86\x41\x03\xd8\x32\xe6\x6b\x56\xe9\x79\xf9\x99\xc1\x58\x59\xcf\xdf\xf3\x09\x57\xb4\x7c\xcf\x25\xef\x7b\xc2\xb0\x24\x2f\xf0\xa1\xf8\x97\xff\x1a\x63\x04\x1e\x6e\xde\x66\xd7\xdf\xeb\xfd\x1b\x49\x7c\x2f\xde\x89\xab\x7a\xaa\x5e\x3c\x4a\x2f\xa0\x10\x44\x42\x49\xc8\x54\xd5\x4f\x6f\x4e\xbd\x81\x23\xc2\x9a\x11\x50\x07\x03\x44\x64\xfd\x34\xc0\x1f\x2b\xaf\xd5\x08\x86\x93\x77\x22\x0d\x5d\x86\xa6\xfd\x11\x67\xdb\x9e\x87\xad\x00\xf4\xd3\x4e\xce\xdb\xb6\x4c\xb7\x69\x11\xdf\x12\x96\x52\x0c\x39\x13\x9a\x29\xae\xb8\x11\x60\xa7\x75\xa7\x18\x6b\x39\x6f\x79\x5c\x17\x36\xd6\xb4\x34\xf9\xc1\x33\x67\xfe\xe7\xa7\x78\x71\xb6\x2e\x16\x1e\x74\x71\xf1\x1f\x81\xbb\xeb\x28\xc9\xf3\x6a\x66\x75\xf1\xca\x72\x27\x3b\x7d\xf5\x97\xa9\xd5\xc3\xcd\xbb\xf8\xf7\x07\x2d\xa7\x00\x4e\x25\x28\x10\x4e\xed\x4a\x4c\x23\x4d\x07\x5d\x59\x58\xd3\xb2\x0c\x7d\x5e\x18\x25\xa4\x62\x52\x7a\x3a\x08\xa5\x07\x55\xf9\x45\x77\x61\xea\x8f\xe6\x09\xb7\x98\x4a\x1f\xe6\x98\xc2\x42\x9b\x4a\x9f\xa2\x89\x65\x54\x68\xe7\x08\x29\xa7\x5e\x4f\xdd\x58\xe5\x4c\x83\x39\x89\x9b\xeb\x1f\xc1\xa4\xb2\x82\x6b\xdb\x00\xae\x42\x27\xa1\xd3\xce\x4e\xa3\xd4\xe9\x5c\x0a\xe0\xd6\xc6\xde\x86\x78\x64\x97\x76\xbd\x3f\xe9\x72\xfe\xe6\xb3\x07\xde\xfd\xdb\xa7\x45\xfe\xdc\xa9\x78\x96\x95\xcc\x3e\x7c\x8c\xfc\x8b\xd3\xee\x77\x86\xc9\xb8\xfe\xe6\xfa\xf2\xee\x9b\x57\xba\xb0\xe7\xc0\x8c\x13\xb4\x7d\x9d\x80\xbc\xda\x51\x2c\xb9\x1c\x83\xdf\x80\xae\x0a\xa4\xd2\x74\xd7\x45\x5b\xa1\x03\x18\x04\x1f\xb7\x4f\x77\xc4\xe7\x21\x1d\xc2\x1e\x63\x82\x1c\xd7\xa6\xca\x6b\xc3\x2b\x68\x1d\x97\x50\x4b\x42\xdb\x3d\x03\x45\x5f\x16\x7e\x60\xa3\xa7\x56\x8a\xde\x85\xdd\xda\x6a\xad\x29\x8d\xaa\xe5\x53\xc2\x58\xca\xa8\x53\xde\xd5\x35\xe7\xf5\x34\xd6\x81\xd5\xeb\xd2\x53\x42\x19\x97\xcc\x8a\x82\x10\x23\x7c\x73\xd8\x94\x55\xe9\x9c\x1e\xb4\xd7\x3b\x8d\x36\xd2\xca\x86\x2b\x6c\x44\x95\x2c\x3c\x6a\x76\x69\xb3\x22\xf9\x41\xf2\x97\x9f\xd1\xd1\xbf\x73\x72\xc7\x3e\x8b\xa1\x71\xb5\x7f\xc7\x95\xfb\xf6\x7b\xae\xdc\x97\x77\x0b\x18\x09\x04\x78\x2a\x40\x51\xa2\xd4\x02\x58\x81\x84\x52\x29\xd4\x2e\xd8\x01\x6c\xab\x50\x78\x47\x41\x32\x06\x09\x4c\xd8\x82\x83\x14\x87\x3d\xd8\x47\x2e\x61\x71\x24\xcf\xf7\x89\xa8\xc2\x38\xa7\xba\x61\xcc\x0a\x2e\x8d\x61\x44\x6a\x6d\x28\x7b\x75\x45\xb4\x3b\xbf\x22\x69\x33\xc7\x9f\x69\x54\x2a\x45\xa1\x5d\xb4\x91\x68\xcc\xe7\xf7\xc9\xfb\xe4\x17\x71\x92\xfb\xf6\xe6\xea\xed\x22\x01\x1c\x2b\xde\xd8\xf9\x3b\xef\x6d\xa5\xb1\x1b\x06\x9e\xc5\x54\x96\x2e\xe0\xd9\xef\x81\x65\x9a\x79\x22\x9c\xdd\xbc\xbd\xd4\x9f\xf2\xd6\xec\x41\xa9\x0d\x06\x1c\x94\xe4\x31\x01\xf9\xc1\x2b\x21\x84\x53\x35\x2f\x6b\x5b\x67\xf3\x99\xa8\xed\x16\xc0\x5d\xfc\x1d\x1a\x0e\x00\x0d\xa2\x93\x6d\x60\x69\xfd\xcb\x2d\x48\x6a\xc0\x7d\x5a\xae\xf7\x6e\xda\x09\xae\x8d\x2c\x0b\x83\xa8\xc6\xc6\x50\x62\x18\x3e\xec\xa5\x50\xa1\x09\xad\x04\x08\xd8\xb4\x9e\x74\xd8\x81\x5c\x0b\xc3\xb4\x91\xd0\x40\xa2\xb1\x36\x9a\x59\x19\x6a\xe7\x22\xd7\x04\x58\xed\x62\xcf\x0b\xc7\xb5\xb1\x4b\xbe\x39\xc3\x97\x44\x0d\xbd\x37\x37\x0b\x0f\xf7\xbc\xeb\xf9\xa3\x37\xb7\xe0\xc9\x92\xef\x29\xf1\xfb\x62\xd2\xe8\x41\x52\x0d\x83\xd2\x1a\x93\x8a\x57\x66\xcb\x87\x8b\xed\x91\xaf\xba\xcf\x0d\x50\xf3\xdf\xcd\xcd\x2b\x7b\x0f\x4c\x70\x4e\x4a\xc0\xe6\x6a\xcd\x4a\xb9\xda\x81\xe4\x31\xf1\x46\x39\xc5\xe8\x44\xd2\xc3\xa1\xd7\x20\x07\x12\x38\xf7\xd9\xbb\xcc\xee\x83\x77\xf3\x17\xa4\xb6\xb3\xf3\xc3\xa2\xf5\xb0\x70\xda\x78\xf2\xe3\xe4\x2f\xc4\x1a\xf5\x17\xc9\xdf\x3d\xb1\x61\x5f\x3a\x97\x0b\x0b\xfb\xea\xe6\xb9\x7c\xb8\x7e\xe6\x05\x3d\x4f\x94\x23\x6d\xe8\x24\xc8\xfb\x71\x11\xe4\x05\x51\x90\xf7\xe2\xf2\xe6\x61\xf5\xc2\x33\x8a\x4b\x7b\x5d\x23\x98\xd6\x9f\xfc\xde\x77\xa5\x52\xb4\xb6\x69\x57\xc2\xe3\x96\x63\x87\xe9\xca\xd4\x28\xed\x02\xa6\x6e\xa0\xb9\xc9\x4d\xd8\x6f\x8d\x0b\x44\x81\x8d\x09\x0e\x24\xd0\x03\x5e\x84\x1a\xec\x72\xa0\x8e\x2d\x80\x45\x1e\x7a\x30\xe4\x05\xf0\xb5\x42\x88\x52\x28\x08\x94\x85\xf5\x90\x66\x9c\x49\x17\xf2\x20\x43\x2b\x40\xb9\x65\xa4\xa1\x2c\x55\x94\x1c\x5c\x4d\x1b\x07\x31\x9b\xba\xb0\x81\x05\xd6\xb0\x11\x94\x02\x11\xb6\x83\x6e\xf7\x29\x25\x61\xab\x29\xd6\x61\x43\x30\xc1\xea\x31\x81\x82\x14\x90\x22\xa9\x11\x21\xa5\x64\x49\x9e\xb8\x47\x1e\xb9\xed\x3f\x4a\x60\xdc\x0d\x96\x0e\xe7\x7f\x7b\x52\x4f\x79\x1e\x92\x5e\x5c\xde\x5d\x7d\xf8\xc2\xcf\xef\xe6\x2b\x93\xa4\x8f\xb7\xd9\xfd\xd5\x2d\x88\x2d\xb4\xbb\xb7\xb7\x67\xcd\xd1\x6f\x3f\x2e\x1e\x28\x71\x15\x5d\xdf\xbc\xbf\xbb\xbc\x3d\xe7\x16\xa4\x84\xf9\x4a\x2a\x88\xb4\x64\x1a\xba\x8e\x75\x19\xac\xa4\x55\x02\x2a\x85\xd1\x91\xa5\x25\xa3\x58\x40\x09\x51\x05\xad\x50\x85\x49\x8d\xf7\x93\xf1\x70\xd7\x09\xbf\x05\x55\x50\xbb\xae\x08\x78\x6a\x4b\x90\x6f\x83\x02\xd5\x68\x2c\x07\x4d\x09\xac\xd2\x55\x0e\xbc\x45\x58\xe3\x50\x60\x68\x20\xce\x4a\xcd\xd1\x08\x29\x42\xcc\x58\x8a\x05\x61\xa0\x82\xf2\x73\xa2\x45\xe1\x0b\x48\xd6\x4d\xa8\x18\x2b\x4d\x01\xe7\x5c\x8a\xfa\xf2\x28\x52\x8f\x4b\xa1\x15\xe7\xc2\x8e\x79\x69\x30\x72\x79\xb9\xb5\x82\x10\x64\x9c\x24\x58\x86\x0a\x33\x4c\x31\xa6\x02\x73\x9a\xe4\x09\x03\xf8\xb2\xca\x70\xf2\xf6\x94\x95\xff\x66\x64\x54\xfe\xde\xf3\x2e\x73\x7b\x7e\x19\xaf\x6e\x9e\x51\x80\x57\x77\x4f\x88\xb4\x67\x9c\xfb\xcb\xb6\xf2\xf1\xe1\x55\x86\xb9\xae\xc0\xe8\xab\x8a\x1b\xad\xa0\xd6\x18\x06\x74\xec\xbc\xb5\x2b\xe7\xa7\x2a\x55\xd3\x21\xad\x27\xb9\xda\x08\xe2\x08\x3f\x56\xab\x22\xf4\x44\x11\x5c\x52\x9a\x17\x61\x63\x24\xd7\x42\xa7\x4c\x51\x43\xe4\xda\xb4\xad\x0f\x50\x73\xe8\x21\x24\xa0\xcd\x9b\xb0\xdb\xb2\x2d\x28\x40\x15\x86\x96\x35\x4a\x18\x4f\xbc\x91\x7a\xe4\x04\x1a\x98\x6f\x31\xf5\x4c\x0a\x29\x14\x55\x62\xe1\x2c\xa9\x47\x7e\xa9\x32\x75\xda\x1f\xfe\x56\xf2\x47\xa7\x15\x77\xfb\xb0\x94\xe5\x1f\x6f\xe6\x6d\xf2\xe2\xf2\xab\x89\xe5\xc7\xa8\xc3\xf6\x71\x69\x1a\xc5\xc1\x12\xf8\x02\xf5\x73\xae\xc6\xb2\xd0\x4e\x56\x3b\x46\xd3\x83\x0f\xb2\xad\x54\xb7\x23\x61\xce\x76\x74\x09\x01\x56\x72\x41\x9c\x3d\x26\x81\x11\xa0\x77\x53\xeb\x41\x81\x3b\x39\x56\xa1\xf6\xe9\xbe\x84\x81\xcc\x35\xda\xd3\x91\x8e\x69\x37\x8d\x65\xaa\x4a\xe3\xb5\x85\x5e\x72\x52\x4c\x15\x4f\xf3\x69\xc8\x14\x65\x5b\x45\xb9\xd6\x8c\xcd\x0b\x85\xe0\xe3\x46\x44\x24\x9a\xf4\xda\x72\x65\xd2\xd8\x18\xe7\x6a\x5b\x16\x93\x63\x07\xba\xa7\x60\x17\xac\x0d\xcd\x06\x7a\xc8\x36\xc0\xda\xd3\xac\x89\x5e\x56\xb1\x37\xf4\xe2\xa2\x73\x77\xba\x4a\x7f\xe7\x25\xa3\x5e\xea\xb3\x98\x4b\x3d\xdc\xbe\xcd\xce\x6a\xce\x93\xbc\xfc\xb9\x54\xf8\x09\xb3\xfe\x36\xaa\x5c\xcf\x9b\x0f\x20\x4e\x6b\x6d\x81\xce\x60\x50\x40\x7d\xc6\x40\x07\x9d\x1e\xc6\x50\x0f\x03\x90\xa3\x1f\x3f\x2d\xbf\x90\xc2\xb5\x0e\x79\xea\x27\x5d\x4d\x2e\x35\x01\x56\x2b\x7a\xec\xe6\x23\x38\xa3\x7b\x3f\xac\x77\x5c\x3a\x23\x94\xe5\x61\x03\x22\x3e\x79\x94\xf3\x4f\x31\xa7\x5b\xb2\x0e\x98\xd9\xcd\xc6\x32\x50\xd2\x2d\xd9\xf0\xd0\x87\xad\x8a\xe2\x03\xbf\x12\xb1\xaf\x55\x56\x3e\xb3\x8a\x16\x06\xe0\xdf\x4f\xfe\x75\xf2\x6f\xe6\x7d\x63\x41\xda\x47\x66\xda\x99\x7f\xe6\xdb\xe8\xf5\xfe\x32\xf0\xce\xa2\x5f\xe1\xed\x57\x86\x5b\x27\xcb\x4c\x70\x71\x19\xf9\xf5\x0b\xe2\xf9\x15\xd2\x25\x7a\x80\x5c\xff\xe8\xfa\xc3\x9b\x9b\x0b\x0f\x20\x0a\x3b\x50\x05\x6f\x0c\xd0\x15\x90\x5a\x87\x1a\xd8\x90\x17\x05\x18\x84\x71\x46\xd8\xbe\x0f\x1d\xee\xfc\xde\xf4\xbb\xed\x16\x98\x61\x6a\x97\xa7\x45\xb0\xb7\xde\x87\x12\xc2\x9d\xe6\x69\x5e\x95\x18\x6c\x45\x29\x84\x6e\xac\x57\xb6\x55\xbd\x55\x0c\x22\xd9\x48\xa6\x14\x0a\x7d\x0e\x38\x01\x98\xb6\x66\x43\xe9\xc6\xb4\x34\x0c\xb0\x74\x92\x41\x64\x09\x11\xc4\x95\x18\xfb\x95\x24\x84\xec\x29\xa5\x81\x71\xce\x83\x8d\x53\xdc\x35\x47\x5a\xf9\x21\xec\xda\xda\x5a\xeb\x6b\xed\xd4\xa6\x07\x18\x21\x3d\xca\xd0\x6e\x06\x40\xf2\x45\x3b\x7a\xde\x8b\xeb\xac\x4c\xee\xce\xb2\xaf\x93\xaa\xd5\x53\xba\x15\xfb\xec\x73\x26\x72\x5a\x4d\x91\x68\xf9\x70\x71\x7b\x07\x17\x37\xff\xc5\x8b\xe9\xfe\xe6\x21\x4e\x9a\xe6\xe7\x8b\x96\x0f\x07\x25\xa8\xc7\x78\x1f\x6c\x03\x4a\x12\x7c\x5b\x8d\xa1\x57\x20\xe9\x42\xbd\xa7\x96\x22\x3b\x6c\x31\x38\x80\x66\xca\xab\x35\xaa\x02\x0d\x3d\x20\x0b\x9d\xea\xf9\x2c\x2b\x1d\x2a\x07\x61\x38\x23\x4e\x42\x4f\xba\x61\x6c\xa4\xa5\xc2\xcd\x37\x4e\x57\xb8\x4f\x03\x4d\xab\x49\xa5\xa5\xd6\x5b\x63\x16\xbd\x7f\xfe\x28\x2f\x4d\x26\x9f\xe3\xc4\x59\x26\x79\xd2\xbb\x7c\xc5\x16\xb8\x79\xc1\xfb\x9f\xa4\x4e\x23\x43\x20\x36\x90\xbf\x9b\x22\xb0\x2e\x49\xb9\xca\xa7\x11\x6c\x03\x1a\x5a\x3e\x3e\x26\x90\xef\x49\xee\x72\x13\xfa\x46\x86\x72\x4e\x33\xba\x1a\x1d\x46\xda\x74\x5e\xf1\x74\x33\xc7\x8d\xd0\x57\xa7\x0a\x6b\x8c\x34\xc2\x4c\x12\xe6\x65\xa8\x2d\xa2\x86\x62\x5c\x96\x50\x60\xcb\x28\x03\x42\x9a\x1a\x61\x4b\x10\x03\x2d\x0b\x22\x74\xbc\x07\x64\x9b\x72\x0c\x43\x37\x2f\x94\x6d\x5c\x2e\xc9\x3a\x6a\x71\xf8\x4c\x9f\x66\xa7\xff\x7c\xc9\x22\x9f\xc7\xa6\x1f\xbf\xb9\x06\x2f\x0a\x1c\x67\x33\xd4\x27\xd5\xbe\xd7\x93\x53\x70\xbd\xce\x9e\xcb\xcb\xf3\x49\xe1\xa9\x49\xb5\xce\xee\xe0\xa5\xfb\xe5\xc1\x3b\x97\x1e\x16\xad\x82\xda\x29\x27\x5a\x31\x80\xdc\x01\x34\x58\xc7\xec\xe7\x7c\xef\xf7\x83\x11\x8c\x0b\x8f\xbd\x68\xf9\x36\x43\x34\x1c\x42\x3b\xd7\xe1\xe9\x66\xe2\xdc\x1b\x59\x1a\xc3\xe3\xf0\x65\x4c\x51\xd8\x85\x1e\xa5\x6e\xbd\x37\xd3\x2e\xf0\x50\x73\x20\x81\x4f\x65\x04\x1e\x05\xd2\x56\x92\x70\xae\xb4\x52\x9a\x23\x4b\x00\x91\x52\x33\xa6\x18\x69\x3d\xe5\x42\x9a\xb0\x35\x65\xc9\x0c\x33\x4c\xf0\xd2\x95\x04\xcf\xa7\x45\x6e\x92\x8b\x38\x73\x32\x51\x77\xe0\xcf\x27\x45\xf2\x97\x93\xbf\x9d\xfc\x93\x38\x4f\xbd\x5f\xe0\x07\x27\x4e\xef\xbb\xdf\x3a\x19\x0e\x9e\x79\x36\x2e\xd4\xf9\xec\xeb\x0f\x4e\xa4\x7a\x70\xd6\x76\x00\xcf\x6d\x87\xd5\x50\xe1\x3e\x24\x15\xc2\xdb\xed\x76\x9b\x52\x41\xb9\x6b\x5a\x2d\xb0\xe1\xc4\xc2\x6e\x44\xce\x8c\xd0\x71\x47\x3f\xe7\x35\x77\x9b\x8d\xe2\x48\xcf\x9f\xb4\x23\x72\x56\x6b\x68\xb9\x67\x61\x5c\xa1\x7a\x05\x27\xb7\x03\x5e\x04\x1e\x76\xf5\x3e\x2a\x79\x1e\x26\x93\x51\x28\x27\x98\x6e\x69\xa8\xea\x80\x9b\xbe\x70\x38\xf4\x4d\x51\x0a\xe2\x1a\xa2\x08\x34\x76\x03\xad\xdb\xa2\x8d\x9d\x3f\xe9\xea\xb2\x14\xc4\x9f\x3e\x69\xcb\x22\x7e\x34\x95\x9c\xfb\x4a\x34\x16\x24\xc1\x02\xbd\xad\x9c\xda\xbc\xf4\xb0\xd6\x87\x93\x57\xce\x12\x55\x9f\xb2\xb3\x67\x05\xf9\x93\x80\xfc\xb7\x77\xcf\x1e\x08\x1f\x3e\x9e\xcb\x11\xfe\x55\xf0\xda\x25\x20\xa6\x1a\x51\x76\x3b\xce\x58\xae\xce\x99\x05\x67\xce\x8e\x0b\x4c\x6b\xc9\x38\x56\x14\x54\xd1\x26\x17\x8c\x21\xc1\xa9\x7a\x4c\xe4\xc8\xc2\x5e\x85\xd1\x1f\x68\xad\xc3\x01\x28\x58\x86\x6a\xc5\x2c\x13\x8a\x4f\x1b\x86\x2c\x62\x35\x63\xcc\x96\x0e\xa3\x5d\xae\xbd\x89\xea\x77\x2b\xef\x61\xc9\xb0\x25\xc4\xd7\x6c\xdb\x33\x15\xed\x4f\xc8\x06\x43\x53\xe2\x2d\x6a\x06\xba\x5b\x6d\x6d\x05\xad\xb1\xc6\x5a\xe2\xc5\x7e\x70\x56\x58\x4b\x28\xf0\xd4\x52\xc1\x04\x9f\x0f\xf4\x19\xf1\xf9\xb6\xc2\x80\x86\xbe\x27\x3d\xf0\xe9\x3e\x68\x90\x4f\x7e\x5b\x87\x7d\x91\x33\xc1\x04\x61\xd2\x56\xc2\xc9\xf9\xf7\x18\xd0\x94\x32\x46\xb4\x96\xcc\xb1\xe4\xf2\xa4\x11\x43\x93\x3f\x97\xbc\x8b\x6c\x8d\x9f\x27\xbf\x48\xfe\x70\x99\x4f\x3f\xe9\x43\x66\xb1\xba\xf9\xda\x88\xe1\xee\x7d\x04\x54\x5e\xff\x68\xb9\xc2\xf3\xf5\x79\x19\xd9\xdc\x2c\xa4\xb3\xe7\x29\x77\xdc\xf3\x52\xe5\xac\xb7\x76\x52\xab\xa4\x84\xba\x65\x15\xc2\xc0\xf3\x52\x08\xa3\x15\x57\x95\x6e\x95\xc4\x23\x2e\xf7\x79\x49\x3f\x3b\x6b\x3b\xdd\x36\x96\x50\x4f\x99\x18\x80\x06\x87\x90\x6f\x1e\x93\xb4\x0a\x87\xdd\x0e\x94\x13\x03\xc5\x76\xbb\xde\xee\x01\x0f\x9b\x43\xf0\x1d\x41\x02\x10\xc0\xb1\xb3\x3e\xc0\xce\x69\xaf\xad\x53\xd2\x34\x9d\xb6\x2d\xa0\x39\x7b\x4c\x56\x05\xeb\x37\xba\xee\x98\x52\xc7\x2a\xad\x39\xb5\x1b\x6f\xb7\x76\xb9\xc4\x66\xe9\x87\xe8\x88\xe1\x25\xc9\x6f\xc6\xfd\xfb\x6f\xc6\x2e\x58\x8c\xca\x5f\x88\xa9\x2c\x82\x39\xf3\x42\x3d\x89\xe5\xdc\x5e\xdd\xdc\xdd\x3c\xdc\xdc\x81\x0f\x1f\x6f\xae\xdf\x3c\x7b\x12\xbc\x70\x58\xbe\x3d\x91\x58\xd6\x07\x54\xa4\x3a\xec\x28\xc8\xb5\x2a\x21\x24\x25\x0d\x51\xc5\x6a\x13\xf2\x76\x41\xf0\x55\xf3\x4e\xd4\xa7\x05\x06\x02\xc1\xc0\x49\xbe\xdf\x1f\xbb\x27\x76\xca\x5c\xc7\x6e\x53\xca\x26\x13\xea\xd0\x69\xe3\x24\x48\xf6\x19\xa1\xd4\xda\xa9\x10\x22\x77\x39\x4b\x85\x32\x32\x54\x40\x49\xa3\xa6\x7c\xa5\xad\x15\xa1\xa1\xd4\x4e\x52\xaf\x14\x37\xda\xf0\x50\x4f\x9c\x90\x8a\x09\x29\x2b\x93\x92\xa5\x66\x5c\x34\x24\x79\xf2\xc3\xe4\xb7\x23\x2f\xf3\xf7\x93\x3f\x4c\xfe\x24\xf9\x6f\xbe\x76\x28\x58\x00\xa2\xc5\x8f\x4e\x8a\x05\xef\x57\xb7\x2f\x4a\x72\x27\xda\xd5\xc3\xed\x39\xdf\x39\x7b\xfa\x1f\x78\x77\xbd\xe8\x29\x5f\xbf\xac\xd6\x05\x74\x7a\x93\xcd\xb9\xf1\xc5\xe5\xb7\x3d\x60\x55\x84\xcf\xdb\xa3\x00\x3e\xb4\x2b\x37\x38\x90\x94\x25\x82\x96\x78\x2e\x0b\x5d\x94\x82\x49\x4d\xb5\xd6\x84\x73\x41\x49\xd1\x4f\x82\x37\x1b\xd8\x80\xae\xae\x70\x5d\x87\x02\x30\xbf\x10\xe2\x8b\xa0\x42\x5e\x02\x17\x5a\x95\xa9\x4f\x55\x77\x59\x04\xe9\x9c\xb1\xd3\x30\x39\xd4\xd8\x00\xb3\x04\x22\x36\x35\x5c\x01\x9b\xe5\x73\xd4\x56\x8a\x15\xc6\x84\x31\x8c\x3b\x18\x9a\x03\x50\x95\xa4\xd4\x68\x23\x35\x37\x04\x4b\x88\xe6\x05\xc5\xa1\x86\xb8\xc4\x0a\x43\x29\xa5\x61\x85\x42\xa5\x29\xf9\xc1\x70\x23\xa4\xd5\xbc\x34\x4c\xab\xb2\x24\x92\x15\x4f\xdc\x4d\x72\x29\x23\x7e\xe8\xcb\x89\xd2\x43\xf2\xb3\xaf\xaf\xee\xf5\x17\x68\x83\xec\x4b\xc4\x7f\x2c\x22\x17\x9d\xd8\xcd\x2a\xa9\x57\xc9\x94\xa4\xfa\x93\x4d\xf5\x94\x14\x17\xee\x97\x26\x4e\x24\xd2\x04\xc8\x1a\x88\x4f\x55\xa6\x3f\xf9\x6a\x4d\x3f\x77\x4f\x07\x28\xf1\xbc\xdd\x61\x40\x57\x14\x40\x50\xf2\xb0\x0b\x63\x96\x73\x6e\xa8\x31\x74\x17\xb6\x51\xcf\x85\x8d\x53\x0b\x6a\xdc\xe3\x0e\x35\x9a\x20\x5b\xe2\x92\x58\x0a\x17\x3c\x14\x8d\xd8\x92\xdf\x49\xfe\x76\xf2\x8f\x93\x3f\x4d\xfe\xbb\xd7\x8e\x25\xf7\x91\xf7\xfe\x5d\x91\xf4\xc3\xcf\x41\xdc\x89\x4e\xf1\xe3\xf2\x14\xa5\xef\xef\x6e\xb3\x08\xa2\xbb\x3a\x81\x40\x1f\xae\x6e\x4e\x22\xaa\xdf\x83\x02\xdd\x00\x06\xb1\xa7\x08\x48\x57\xa2\x3e\x18\x28\xb0\x11\x52\x98\xda\x08\xad\xb5\x21\x02\x29\x8e\xf1\xf0\x98\x30\x40\xfa\xb2\xd9\xb1\x5d\x43\x1c\x61\xa2\xb6\x61\x37\x60\x0b\x0e\xb0\x0c\x3b\xbc\x1e\xa8\x6d\x04\x7f\x4c\x0a\xae\xa4\xa0\x76\x95\x4b\xe7\x07\xbe\x6d\x36\x7b\xb6\xad\xbc\xe0\x3b\x66\x34\x5d\x73\x4a\x31\x97\x4e\x49\x07\x99\x22\x42\x0a\xc2\x98\x61\x44\x38\x5f\x54\x25\x63\xc8\x33\x27\x3c\x35\xd4\x10\x4d\x58\x59\x1a\xc8\x5c\xdf\x4b\xd5\x83\x3e\x78\xee\x04\x07\xc5\x76\x43\x35\x6d\x40\x3e\x39\xb5\x77\x92\x54\xcc\x3a\xea\x89\xf2\xbd\xd7\xda\x27\xcf\xf5\x91\xcb\x58\xf2\x97\x5e\x55\x0e\xec\xa4\x98\x73\x8e\x2a\xf8\x0a\x45\x30\xa7\x52\xe0\x09\x6b\xf0\x17\xc1\xcd\x6f\x7d\xfc\x90\x7d\x97\x68\xc3\xf3\x40\xf8\x9b\x9f\xa5\xa7\xac\xf2\xf6\x99\x33\x70\xf2\x4e\xb1\x55\x2a\xa6\x66\x45\x21\xe6\xa5\x09\x3e\x18\x1d\xaa\x12\xd8\x40\x5b\xb7\x49\xf5\x8a\x89\x88\x3c\x28\x8b\x69\xcc\x29\x80\x5b\x09\x3f\x9b\xb5\xfd\x6c\x97\x19\xd8\x01\x88\xe3\xe6\xe9\x2c\xe8\x68\x26\x17\x76\x1e\xcb\x8e\x69\x5c\x38\xe8\x82\xa2\x9e\xaf\x6c\xad\xac\xa8\x8f\xa5\xe3\xca\x9a\x8c\x11\x83\x34\x23\x48\x13\x2c\x8a\xc2\xe4\x24\xc0\xa0\x42\xcf\x01\x01\x26\xc5\xe1\x80\x31\xc2\xa5\x29\x60\x9e\xe7\x4d\x90\x20\x21\x84\xf4\x18\xe3\x86\x4b\xa2\x78\xd9\xa2\x12\x73\xe2\x09\xe5\x3b\x6d\x99\x35\x10\x6d\x0c\x73\xc9\x65\xa2\x1f\x45\xd4\xbd\xcc\x4e\x6b\xed\x6f\x26\xbf\x97\xfc\xd3\xe7\x59\xfa\xd3\x8a\xbb\x3f\xa9\xeb\x3f\xb7\x2c\xe7\x70\xfe\xe6\x0c\xce\xb2\x88\x9c\x9d\xac\x92\xae\xef\x7f\x03\x3c\x03\x0e\xae\xde\xbd\x8a\xec\xef\xe3\x34\x15\x59\x29\xb5\x05\x0e\x14\x0e\x14\x61\xbf\x1f\xac\x90\x8c\x3b\xee\x44\x2d\xfb\x43\xd8\x57\xc6\x80\x44\x03\x66\xf2\x02\x18\x6a\x61\x19\xb6\xa8\xc4\xda\x1a\x17\xef\x5c\xd6\x0b\x90\x7c\xaa\x80\x9e\x63\xfc\x3e\x15\x6c\x92\xc1\x87\xde\x28\x8d\xf1\x76\x9b\x95\xc2\x68\x23\x0a\x6b\x8d\x0a\x73\xe4\x91\x3c\x34\x80\x1a\xa9\x55\x0d\x6a\x15\x54\xdb\xb6\xa0\x47\x84\x1a\xbc\x43\xc6\x18\xca\xc5\x60\xf7\x6c\xd3\xb8\xce\x1f\x2a\xd7\x01\x58\x4f\x8c\x92\x8a\xc9\x68\x47\x93\xd2\x85\xb3\x43\x2f\x75\xec\xf1\x2e\x9c\xe5\x7f\x92\xfc\xb3\xb3\x88\xf4\x24\x28\xf6\xea\x22\x3d\x17\xb0\xef\xbe\xb0\x50\x9f\xb7\xc5\xb3\x26\xd9\xc7\x87\xdb\xab\x57\xa3\xd5\x27\x80\x87\x03\x45\xb4\xc7\x3c\x1c\xe6\x6d\x2f\x02\x3c\xe7\xfc\x64\x50\x61\x04\xf8\x70\x08\xfb\x15\x5c\xe9\xe0\x41\xaf\x34\x53\xc8\x53\x16\x06\x96\x17\x86\x21\x0b\xfb\x43\xd9\x1f\x2a\xe0\x43\xe5\xc7\x11\xe8\x71\x6a\xe3\xd3\x5a\x5b\xeb\x8d\x73\x9e\x6b\x6d\x15\x0f\x06\xf8\xca\x9a\xcd\xd6\x3b\x67\x0e\x93\xe4\x01\x4a\x59\xfa\x82\x01\x6c\xf2\xb2\x20\xda\x13\x89\x4a\x5f\xb8\x69\x97\x36\x1c\x78\x6b\x6d\xb0\xc6\x98\x24\x8f\xfb\xbf\xcb\x92\xe4\x87\x67\x5e\xbf\xbf\xfb\x8c\x0d\x3e\x21\x57\x2e\x9e\x1d\x90\x57\x5f\x42\xa0\xce\xa6\xa3\xdf\x09\xfd\xbf\x7f\x7f\xb7\x8a\xf1\x1b\x8c\x73\x12\xc9\x11\xde\x4c\x79\x51\xf2\x03\x04\x05\x89\x60\x95\xa6\x01\xb8\x09\x28\x3e\x01\xaf\x88\x65\xb0\xc2\x74\x0c\x75\xac\xcb\x6c\xb0\x55\x1c\x8a\xcd\x89\x42\xd7\x60\xaa\xcb\x40\xfe\x5f\xca\xfe\x1f\x4a\x72\x5d\xbf\x0f\xc4\x09\x56\xd5\x34\x25\xcb\x7a\xec\x7b\xdf\xdc\xe1\xb3\x7f\x92\xd0\x9a\x7b\x67\xe0\x9f\xf4\xfc\x60\x8d\x66\x06\x5a\xfb\xc9\xd8\x23\x1f\x2f\xbc\x6b\xaf\xb0\xde\xe3\x35\x82\x3d\x67\x11\xed\xc1\x6e\x84\x10\x21\x42\x84\x08\x11\x32\x64\xc8\x90\x21\x43\x86\x15\x56\x58\x21\xc3\x0a\xeb\x76\x17\xd1\x7b\x08\x56\x75\x57\xcf\xcc\xd5\x91\x6e\x3f\x56\x57\xd7\xf4\x39\xaf\x49\x82\xf8\xfe\xfb\xfc\x89\x81\xe5\x70\x93\x21\x84\x8c\xa0\x13\xcf\xb3\xb2\xf4\xbb\xc0\x98\x88\x6d\x5d\xd7\x91\x36\x4d\x93\x6f\xb5\x31\x16\x6a\xe5\x5b\xdf\x25\xb8\xb1\xef\x7c\xeb\x39\x3f\x95\x4e\x60\x4f\x97\x59\xd0\x5c\x8f\x64\xe7\x27\x66\xf1\xcb\xff\x27\x4c\xbf\x5e\xea\x45\x7d\x89\x05\x4e\x17\x64\xd5\x7d\x39\xfa\xea\xcb\xd2\x6a\x21\x35\x13\x32\xe0\xe1\x8b\xd1\x57\xec\xa8\xb1\xf3\x4a\x49\xce\x21\x5e\x05\x39\xea\x38\x00\xba\x23\x80\x81\x6e\x99\x80\x65\xd7\xa3\x2f\x04\x19\x97\x9c\x72\x26\xb5\xb9\x1a\x7d\x01\x61\x11\x1c\x3d\xe1\xdc\x52\x3c\x99\x5c\x74\xde\xec\x40\xe9\x07\xec\xf1\x29\x74\x36\xbb\x49\x31\xcd\x6f\x6c\xf6\x27\xd9\x9f\x9f\xab\x8b\xff\xf9\xec\x0e\xff\xf1\xee\xe6\xe2\xdd\x9b\x3a\x73\x67\x05\xb7\x79\x2d\xbc\x9d\x33\x96\xd5\x53\xf3\xe6\xda\x54\x70\xc1\x24\xbd\x20\xee\x7d\xfa\x7c\xf7\xc3\xab\x63\x3d\x1d\x4b\xc0\x78\xd3\xca\x9a\x75\x22\xa2\x20\x24\x68\xf6\xa1\x82\x39\xa5\x74\xab\x63\x26\x59\xd8\x54\xa7\x3d\x42\xab\x42\x0c\xa0\x04\x0a\x4e\xc7\xd8\x44\x13\x21\x04\x1e\x64\x4e\x7a\x25\x41\xb9\x8d\xdb\xb0\xda\x9f\xe0\xe5\x00\xc7\xc1\x4e\xce\xae\x65\xdc\xb7\x25\x95\x18\x62\xa8\x2a\xdc\x0e\x50\x9b\x16\xc2\x4a\x12\x2c\x08\x8c\xc3\x74\x80\x95\x10\x0c\x99\x42\xf0\xca\x16\x10\x13\x02\x0d\xd1\xc0\xe2\x9e\x0c\x24\x2a\x44\xce\x9e\xcb\x4b\x2e\x08\x9f\xb4\x0c\x92\xf2\xd2\xed\xdd\xfb\x64\xbb\xb5\x48\x0e\x7e\xf7\x26\xe1\x46\x9f\x21\x03\x4f\xca\x55\x49\x69\xe9\x6d\x9a\x21\xbe\x5b\x2d\x31\xea\xfb\xb7\xc9\x4e\x7a\x91\x96\x7e\xfb\xfa\xc3\x4d\x82\x51\x7e\xf8\xd8\xb8\x7a\x15\x0a\x6f\x2a\xa8\x29\x12\x31\x14\x98\x11\xcb\x0c\x25\x65\x55\xb8\x4a\x30\x23\x85\xd5\xa8\x9a\x9a\x5c\x0f\xc3\xb0\x95\x8c\xc1\xd3\xb1\x76\xae\x30\x46\x2b\x01\x44\xdc\xad\xa0\x5f\x30\x6e\x7e\xad\xe2\x01\x50\x29\x21\x64\x94\xd9\x68\x8f\x3d\x40\x30\xd2\x71\x10\x12\x76\x76\x6b\xb5\x81\xd5\xaa\x33\x4d\x74\xb5\x54\xfa\x98\xd3\x58\xa4\xd6\x05\x40\x00\x45\x17\x94\x06\xc4\x59\xd6\xe8\x10\xe2\xb1\xae\x97\xb8\xac\x1f\xf5\x8d\xdb\xf0\xa7\xe9\xff\x92\xb3\xfd\xdd\x19\x61\x73\x61\x37\x5e\xf6\xc9\x6b\xe2\xc4\x12\x74\xe7\xd3\xbc\x16\x0e\xba\x7a\xdd\x5c\x20\xb5\x8b\xa5\x66\x3a\x00\xcd\x75\x9d\x93\xdd\x6e\x1a\x56\xe8\xe7\x72\x85\x26\x97\x9b\xd3\xb8\xaa\x26\xbf\x2a\x13\x47\xa2\x79\xa8\xac\x10\x5a\xbd\x2a\x15\xb1\x44\x9e\xb6\xa4\xf2\x25\xcd\x55\x22\xcc\xe6\xd5\xf0\x73\xd9\x86\xd4\xbd\x0b\x69\x96\xd5\x82\xec\x31\xdb\x64\x9c\x0f\x76\x60\xce\x31\xcb\x2c\xe7\x7c\xcb\x58\x14\x4c\x53\xc9\xb8\x90\x4c\x0a\x9a\xc8\xb0\x30\xbd\x36\xb1\x73\x69\x12\x95\x04\xb0\xe6\x18\xb1\x05\x7d\xc2\xc6\xfe\xe1\x95\x3a\xe2\x19\xf7\x9d\x44\xde\xdf\x3f\x6b\x88\x3e\x83\x05\x3e\xde\xbd\xbe\xb8\xee\x05\x9c\x97\x53\x47\xb9\x09\x2a\x76\xc9\xf3\x42\x9c\x74\x42\x36\x24\x4f\xe7\x2a\x8e\x6b\xd6\x7a\x15\x9a\x4d\x89\x83\x2f\x82\x92\xc7\xd1\x98\xd8\x1a\xb3\xc2\x07\x13\x6b\x13\x1b\x63\x0e\xca\x99\x24\x0c\x56\xa4\x1e\xab\xdc\x94\x49\xd3\xfa\x4f\xb2\xb7\xcf\x78\x85\xef\xef\x6e\xdf\x7e\x7c\xe6\x04\x9d\x5b\x81\x5f\x50\x81\xde\xdc\xdc\xfd\x02\x5c\x21\xd1\xc4\xaf\xf0\x0a\x63\xbe\x0f\xf1\x10\x07\x02\x24\x80\x53\xb7\xd2\xf9\x3e\x8c\xf1\x80\x01\x3e\x4e\xdd\xe4\xc8\x7c\xc5\x57\xc7\xf4\x6d\x22\x35\x06\x21\x51\xdd\x72\x3f\xb9\x1c\x4d\xbb\x74\x84\xfb\x36\x50\x66\x41\x99\xb7\x8b\xdf\xc1\x7c\x6c\xca\xa9\xaf\xe7\xfa\x9b\xd7\x6e\xea\x6b\xc1\x1c\xe5\x75\xc5\x18\xe6\x14\xa7\xd7\xd8\x62\x86\x11\x22\xcc\x4a\x23\xac\xb0\x24\x47\x94\xc8\x5e\x4b\xb9\x15\x62\x27\x9e\xb8\xb6\x29\x6e\xcf\x99\xe2\xd3\xf9\xbf\xa4\xea\x7c\x1d\xb7\x9f\xcb\xb7\x67\x69\xb4\x64\x6d\x9d\xc4\xda\xaf\x06\xd1\xf3\x3d\xf4\x00\xa6\x21\x72\x5a\x4e\x2c\x76\x8d\x95\x52\xd5\x32\xc8\xbd\x49\x32\xeb\x47\x50\xc4\xfd\x0a\xf7\x61\xac\xb7\xdb\xe3\x29\x1b\x7b\x20\xc6\x31\xaf\xfc\x34\x7a\x9f\xba\x69\xd5\x34\x7e\x1d\x9a\x43\x7d\x09\xcd\xd6\xcd\xff\xb5\xde\xb7\x6d\x1b\xc5\x54\x71\x9e\x8f\xf1\xe0\xa2\x71\x67\x1d\x5f\x7a\x53\x6f\x8a\xc4\x83\xfe\xfd\x4b\x27\xac\xb3\x17\xd6\x32\x46\x4e\xab\xef\xea\xc9\xbb\x3b\x3f\x58\x9f\xbe\xbf\x72\xd4\xc8\xbd\xae\xfb\x74\x36\xf3\xe1\x7c\x1d\xb7\x8b\x16\x10\x01\x36\x05\xd3\x3d\x80\x71\x0b\x86\x70\x1c\xea\xb1\x35\xfb\xd8\x6b\x80\x56\x3a\xe1\x6b\xe3\x3e\xee\xd7\xa3\x66\xd0\xba\xda\x35\x09\x45\xdb\xe6\xd0\xd9\x30\x6d\x9b\xf9\x13\x7f\xd2\xce\xad\x28\x7a\x38\x48\x2f\x3d\x33\x4c\x05\xcb\x2e\x1a\x76\xf3\x39\xd8\xec\x8f\xce\x58\xe1\xff\x6b\xe9\x27\x9c\xaf\xf4\xdd\x7b\xf0\x4d\x86\xd5\xcd\x8f\x3f\x5d\xfc\x15\xce\x5f\x9b\xa7\xe2\xef\xea\x22\x7c\xa3\x05\xba\x79\x0f\x93\x4a\x78\x19\xee\x55\x58\x95\x70\xda\x02\xea\xc1\x02\x23\x9c\xb3\xad\x1c\xc5\x66\x57\x27\xdb\x90\xc9\x76\xb1\x15\xa0\x08\xd1\xe5\x65\x1c\x00\x89\x3d\xd8\x82\x3a\x89\xed\xca\x9c\xb0\xd0\xe5\x78\xda\xe6\xfb\x09\x72\x2f\x45\xa5\x14\x9b\x50\xbe\x9b\x97\x70\x3c\x20\xa0\x37\x16\xe3\xc7\x6c\x4e\x68\x71\x1c\xe7\x82\xd1\xcc\x35\x90\x44\x5e\xf4\xad\xb6\x4c\xcc\x3f\x52\x7a\xa4\x7b\x53\x16\x4c\x53\x43\x05\x2f\x5d\x49\x90\xa1\x9a\x16\x66\xde\x5b\xfd\x23\xbb\x81\x57\xdc\xf7\xdf\x3c\xcd\xd8\x93\xcb\xd7\x97\x7a\x50\xcf\x8c\xd5\x97\xda\x4f\x1f\x96\xc6\xfe\x9b\x2b\x28\xc5\xbc\x0b\xed\x5e\xb1\x9f\xbb\xa5\x30\x39\xcc\xd7\x40\xdc\x17\x60\x5f\x96\x35\x2c\xc0\xfe\x21\x6c\x0e\x81\x2a\x25\xa0\x92\x28\x0e\xde\x3f\x34\x2b\x7f\xd2\xe5\xca\x9c\xdc\x4a\xfb\xa9\xf5\x3e\xe7\x53\xbb\xc9\xa2\x5e\xd6\x68\x34\x08\x22\x42\xcc\xf6\xb4\x35\xa2\xaa\xa1\xcc\xdb\x49\x82\x51\x53\xc3\xa2\xc5\x18\xd8\xbd\x5e\x3c\x73\x64\xea\x77\xf3\xa7\x1a\xff\xbf\x2f\x38\xbb\xef\xaf\x29\xb5\x17\xd9\x9f\xa7\x5b\xbc\x10\x6b\x9f\x12\x85\xf5\xdd\xfb\x1f\x3f\xbf\x7a\xbb\xc8\xa3\x26\xa8\xef\x7a\xf3\xe3\xe7\x77\x4f\xda\xbd\x57\xad\xc9\x9f\x36\x4f\xda\xb2\xcd\x31\xac\x7c\x38\x1c\x00\x8c\xbc\x07\x19\x8b\x7e\x1f\x8b\x5d\x0c\x12\x10\x1f\x05\x80\x47\xe0\xe7\x73\xbc\x1c\xa0\x89\xbb\xb8\xab\x40\xd5\x7a\x0f\x07\x67\x19\xb3\x8e\x31\x1b\xfb\x38\x80\xe1\x00\x91\xf1\xc2\xc1\xaa\xef\xb8\x61\xa4\x62\x1c\x03\x03\x8e\x6a\x3c\x4e\x41\x0c\xb1\x21\x80\x6e\x4a\x4a\x29\xb5\x51\x18\x81\xbd\xec\x1a\x65\x38\x33\xa0\x61\xec\xc8\x8e\x7c\xa2\x95\xa3\xac\x14\x44\x63\x8a\x8a\x12\x23\xd1\xf1\x92\x62\x44\x5c\x4d\x30\x86\x65\xcd\x59\x61\x0a\xa2\x82\x15\x82\x4b\x45\x2d\xce\xb2\x7c\xcd\xd2\x8c\xf0\x98\xfd\xea\xe2\x28\x77\xa9\xbe\x5e\xdd\xbc\xff\x0e\xe4\x37\xef\x3f\x7d\xf7\xfd\x9b\x5f\xdf\x7c\xb7\xb9\x79\xb7\xc1\xa1\x82\x60\x2b\x1d\x86\x31\x48\x6a\x6a\x90\xd1\xbd\xae\x5d\x11\x4a\x03\x4a\x3d\xac\x8f\x58\x09\x4b\x8e\xc8\xda\xbd\x90\xa0\x9c\x78\x3c\xf6\xc6\x03\x09\x74\xe9\x4c\xf4\xbd\xef\x9e\x71\x12\x76\x93\x9d\xa7\x92\x7f\x9a\xfd\xf5\x85\x21\xf3\xfd\xbc\x8e\x3e\x7d\x78\x73\xf3\x3a\x85\x94\xcf\xcf\xf7\xe8\xf6\xd3\xe7\x8f\x77\xe0\x05\xf8\xfc\xc9\x9b\xf5\xcd\x7a\xf3\xfa\x99\x1f\xf9\xd3\xed\xdb\xdb\xcd\xfb\x1f\x17\x1e\xd3\xd2\xb6\xb1\xab\x9a\xc3\xb2\x62\x3e\xf6\xd1\x57\xde\x81\x6a\x89\xea\x51\x8c\x7d\x14\x79\xb7\x2a\xe1\xe0\x8c\xb2\xae\x3d\x30\x50\x28\x17\x54\xed\x2d\x9a\xea\xbc\xa4\x71\x17\xdb\xa1\x75\x52\xd9\xe3\xc8\x63\x88\x32\x4c\x03\xce\x77\xd1\xb3\x5d\x1c\x28\xe0\x80\xf1\xb8\x8f\x82\x81\x76\x93\xb9\xa8\x0b\x5d\x48\x86\xa1\x2d\xc1\x6e\xbe\x29\x71\x2c\x2b\x0a\x86\xb1\x93\x52\x1b\xa5\x99\x23\x4c\x25\x16\xaa\x9a\x46\x83\xa0\x13\xdc\x49\xc5\x39\xb1\xbc\x8b\xbb\x9c\x60\x8b\x1a\x69\xa9\x66\x50\xb5\xc2\xf2\xb3\x37\x1b\x49\xfb\xf1\xeb\xec\x3f\x65\xff\xef\xbc\xa6\xbf\xd4\xb4\x3a\x4b\x10\x5c\xcc\x34\x7f\x78\xb2\xac\x5e\x66\x9c\x3f\xfc\x5b\x70\xf3\x76\xe9\x83\xfe\x2d\xb8\x4d\xd2\x6c\xb7\x0b\x6e\x6a\x69\x2e\x2f\x98\xfe\xd7\x57\x98\xfe\x8f\x77\x4b\x91\x31\x04\x50\x0e\xf2\x10\x3b\xaa\x07\x5e\xba\x4a\xc5\xed\x5e\xad\x8e\x4e\x2b\x3e\xb9\x15\x56\x06\x22\x0a\x2a\x44\x3d\x86\xe3\xbc\xd3\x99\xb6\xc6\x3a\x1e\xe3\x28\x51\xad\xad\xf4\x25\x95\xd1\x82\x63\xdd\x9e\xb6\xae\x2c\xc1\xf6\x58\x00\x1a\x9b\xc2\x5b\xa5\xb5\xdd\x73\x50\xcd\x7b\x9f\x2c\x1d\x22\xc6\x6e\x0a\x83\x88\x66\x08\x41\x88\x14\x0a\x82\x0a\x89\x30\x15\xce\x5a\x59\x96\xcc\x29\x89\x38\x3b\xf8\xc7\xac\x0a\x5a\x3b\x63\xf8\x08\x60\x67\x24\xc9\x99\x17\x34\x60\x88\x1c\x67\xbe\xaa\xb8\x32\x8a\xd7\xca\x99\xd6\x07\x46\x79\xbd\x60\x03\xd8\x4d\xbd\xde\x67\xbf\xcd\xfe\x7d\xf6\x5f\xb3\xff\x7b\x51\xf3\x9e\xaf\xcc\xbb\xf7\x9f\x93\x8c\xc1\x4b\x2c\xc4\x59\x9f\xe7\x22\x19\xfd\x6c\xef\xfd\xd4\x67\x7d\xf3\x52\xaf\x60\xf9\xe8\x5b\xd2\xdd\xf3\xaf\x7d\xf1\x51\x78\xb5\x3d\x8d\xe0\x68\x0c\x07\xd9\x91\x63\xec\x1c\x53\xd0\x51\x4a\xa7\x63\x1d\xb3\x80\x90\x04\xa8\xb6\x5c\x80\xe6\x34\xe6\x46\x21\x4c\x89\xd0\xa9\xba\xa2\x8c\x3b\x9c\x0f\xcb\x47\x84\x3c\x7f\x36\x05\x45\x08\xa5\x22\x21\xeb\x38\xa5\x5c\x30\x46\xf2\xad\x22\xc4\xbe\xfc\x6c\xbd\xf7\x03\xae\x34\xb1\x16\x96\xa7\x41\x8a\xd2\x97\x08\xe6\xfb\x93\x5a\x85\x13\x5b\x6d\x8b\x52\x29\xcd\x09\x1e\xa2\xc7\x14\x23\x2c\x44\xfa\x3f\xc2\x88\x72\x8c\x97\x4f\x30\x7a\xfe\x28\xf6\x84\x91\xb9\xbe\x21\x2c\x7d\x36\xe7\x4e\x64\xfe\x41\xbd\xfc\x28\xcd\x5d\xf5\xa3\x4c\x9e\x1c\x4b\x2f\xf6\xcf\x12\x1a\xe5\x97\x3a\xb0\x57\xe1\x24\x4d\x22\xdf\x3f\x87\xde\xcb\xc0\xf1\x2e\x01\x7d\xde\xdf\xbd\xba\xf9\x51\xaf\x68\xbd\xa2\xa7\x3e\x6f\xee\xab\xbc\x3e\xf5\xe3\x46\xdc\x37\x61\x8d\x1e\x76\x1b\xe3\xef\x99\xdf\x6d\x88\xb7\x46\xf8\x71\xcc\xed\x64\x53\x76\x3f\xd7\xa2\x6e\xde\x86\x4b\x67\x8f\xeb\xd2\x45\xe7\x15\x18\x37\x84\x52\x4d\x94\x22\xdb\x78\x50\x74\x17\xc7\xba\x06\x55\x6d\x29\x57\xb2\x2a\x59\x6a\xd2\x1a\x5a\x5a\x48\x08\xe1\x55\x91\xfd\x41\x5e\x9c\xb1\x15\xd7\xfa\x31\x38\x4d\x2f\x32\xf0\x05\xa2\x02\xbc\x94\xd7\xfc\x26\xe7\xf2\x19\x89\x64\xd6\xbb\x68\x81\x78\xd0\x40\x44\x97\x0f\x7d\x6c\x92\x33\xb2\x1f\x4e\x74\x3e\x2f\xb7\x21\x53\xc7\xb4\xe4\x95\x54\x68\xaa\x01\xd1\xcd\x28\xb7\x2b\xba\x6d\x75\x33\xac\x47\x67\xa2\x03\x8b\x00\xe6\x31\xcc\xff\xc5\xd6\x30\x77\x58\x44\xef\x77\x58\x78\x69\x99\x11\xda\x5a\x9e\xbd\x4a\x5c\x75\xfd\x82\x73\xf1\x1f\xae\xd5\xaa\x96\x01\xcb\xeb\x6f\xa9\x55\x7d\x31\x9b\xf9\x3d\x78\x21\x6e\xf5\xf9\xee\x59\xaa\xca\x4f\xaa\x9e\x8c\x5f\x55\xbf\x24\x55\x75\x2a\x5e\xd5\xa7\x0e\xad\xa0\x5c\xf0\x33\x38\x76\x21\xee\x43\xdc\x86\x9c\xa0\x89\xad\xbd\x73\x73\x5d\x14\x3d\xd0\x03\x60\x9d\xd1\x86\x18\x63\xa8\x17\xb1\xe3\xa2\xb2\x25\xab\x53\x5e\xdc\x02\x1e\x1d\x38\x8a\xec\x3c\x5f\x0b\x1b\x96\xfd\x2a\xab\xb2\x1f\xaf\xf0\xc5\x5f\xac\xb8\x27\x6f\xff\x37\x2f\x3f\x5c\x64\x8b\xbf\xcc\xf3\xae\xd3\x9c\xa5\xb6\x01\x59\xde\x85\x7c\x98\x48\xae\xee\x43\xae\x26\xa6\x5f\x8d\x88\x29\x04\x7f\x6e\x86\xb9\xdc\xc8\xfb\x9f\x8f\x79\x3b\x0d\x87\x1b\x3c\x6e\xb7\x4c\x0b\x56\x49\x81\x26\x9f\xeb\x7b\xb6\x2a\x6d\x34\xd6\x02\x17\xcd\x0a\x32\xaa\x08\xdf\x14\x94\x1a\xa6\x14\x3b\x28\x3d\x3f\xb4\x44\x71\x29\xf9\x41\x09\x1d\x16\x76\xab\xd5\x82\x47\x49\x29\xa8\x47\x5d\x12\xa6\x38\x5b\xb4\xfa\xd8\x8d\xdb\xe8\xec\x8f\xb2\xef\xce\xfa\x37\x97\x3e\xf6\xff\x7e\xee\xa4\xa4\x94\x77\x4e\x63\x9e\x7b\xd1\xc9\x6f\xf8\x9a\xca\x74\x26\x0b\x3f\x17\xc7\x57\x09\xe0\x17\x8b\xf5\x46\x85\x7b\x11\x56\x19\xb1\x94\x58\x2d\x85\xd4\x71\x1f\xac\x03\xc5\x1c\x23\x5c\x6c\xe3\xde\xae\x4b\x63\x94\x72\x0f\x41\xd9\x56\x74\x9b\xa6\x3d\x1e\xda\xc5\x1a\xb4\x06\xd8\x03\x74\xcf\x5e\xed\xa6\x8c\x9b\x60\x2a\x1f\xf0\xa9\x5f\xef\xe3\xd1\x5a\x50\x10\x41\x79\xc0\x44\xcf\x3b\x23\xac\x90\x40\x8e\x11\xde\x48\xab\xac\xc5\x2c\x08\x25\x77\x8f\x99\xb5\x73\x31\xbb\xe4\x87\x9d\x75\x92\x41\x87\x68\xca\x03\xf3\x45\x03\x6f\x7d\xc8\x36\xc9\x1d\xef\x6b\x39\xbb\x77\xef\x7f\xba\x7d\x0b\xe8\x79\xa8\xe7\x17\xc9\x39\x46\x27\x3d\xb5\xbd\x71\x88\x80\xe2\xb8\x3e\x08\x6d\x8c\x88\xf5\x44\x19\xf1\x8d\x94\x8c\xd9\x9c\x65\xaf\x96\xeb\xbc\xde\x66\xaf\x13\x86\xea\xb7\x89\xa3\xb9\x38\x4a\x7f\x85\xa7\xfb\x45\xaf\xc1\x1f\xde\xdc\x7d\x7e\xf3\xd4\xa5\xfc\xe9\x66\x19\xcb\x5d\x5a\x94\xe7\xca\xbd\x06\x5d\x08\x41\x5a\x25\xa1\x52\x04\x45\x36\x95\xc1\x7b\x90\x9d\x4a\x40\x72\xe9\x08\x35\x6c\x2a\x18\xb6\x98\x01\x4c\x10\x28\x68\x20\xdb\xc8\x53\x7d\x54\x97\x91\x4f\x47\x08\xda\xa4\x6c\xc0\xf7\x10\xaf\xb1\x64\x9e\xca\x55\x33\x17\x60\x7e\xca\xb4\xac\x42\x05\x69\xbe\x03\xed\x62\xda\xe5\x3d\x80\xd8\x09\xaa\x84\x50\x44\xf3\xe8\xb8\x08\x58\x79\xe3\x0d\xb4\x14\xd7\xd0\x79\xe3\x09\x2a\x43\x47\x92\x56\xee\x82\xdf\x5f\x34\x47\xfe\x55\x42\x05\xfd\xcd\x93\x23\x68\xf6\x8c\x14\xf9\xda\xe3\xf3\xf6\xa9\x52\x02\x2f\x14\x4f\x97\xad\xef\x6b\x69\xb3\xe5\xf5\xd5\x96\xc5\x7e\x7e\x42\x4e\xfb\xbc\x9e\x64\xde\x4c\x62\x85\x7e\xae\x56\x30\xc1\x44\x54\x1e\x4e\xdb\x15\x9e\x34\xca\x0f\xd3\x90\x67\x31\x1b\x19\x56\x88\xe7\x30\x2f\xe2\x41\x33\x21\x38\x70\x46\x1b\xe9\x1e\xb8\xd3\xc6\xba\xd5\x28\x69\x8d\x79\xec\x25\xac\x2b\xb1\x81\xb6\x2a\xa9\x25\x51\x11\x4b\xac\x25\x96\x80\x40\x2c\x29\xed\x64\x9b\x12\x21\x8a\x10\x6f\x9a\x82\x12\xc8\xe1\x14\xb8\x32\x5a\x71\xee\x98\xe6\x52\x6a\x6a\x04\xd1\x1a\x5b\xb5\xd4\x1f\x8b\xe6\x0f\x79\xd2\x62\x5e\x58\x0d\xd9\xd9\xeb\xf4\x02\x94\xd8\x5c\x21\xd3\x7f\x7a\xba\x30\x5f\xd8\x36\xdd\xbd\x06\xe7\xab\x75\x78\x85\x4e\x07\x30\x76\x41\x34\x3d\x90\x93\x8d\xf5\xaa\x0c\x0f\x87\x70\x20\xa0\x07\xfa\x74\xc8\x8f\xd3\x36\xc7\x93\x5d\xc6\xae\x3b\x20\xe6\x72\x53\x78\x13\x51\x2c\xd7\xe5\xc3\x61\x3e\x36\x24\x3a\x21\x39\x97\x52\x68\x3d\x05\xc6\xc1\x9e\x18\xa1\xb4\x56\xc2\xa4\x47\x68\xda\x12\xa2\x23\x53\x71\x50\x0b\x97\x6d\xad\xd7\xc7\xac\x3c\xab\x74\xff\x4d\x46\xcf\xb8\xeb\x25\x1e\x2c\xbb\xe5\xb5\x2d\xeb\xea\x4c\x93\x7c\xb6\x25\x48\x30\xba\x27\x57\x82\x39\x61\x77\xa0\xf3\x73\x75\xeb\xc3\x56\xee\xeb\xe8\xb7\x0c\x1b\xcc\xf2\x21\xe1\x9b\x88\x16\x42\xaa\xc7\xac\xc1\xc0\x73\xb3\x97\xaa\xd9\xc6\x91\xef\xc2\x98\x5c\x05\x60\x63\x78\xdc\x61\x2c\x57\x49\x96\xc2\xc6\x7d\x5f\x2b\xcb\x03\xb0\x09\x88\x41\x91\x66\x94\xc7\x96\x0a\xad\x58\x57\x4a\x1b\x14\x77\x94\x28\xe2\x20\xe5\x52\x3a\x12\x1d\x57\x8c\x54\x97\x39\xbb\xdf\xb0\x33\xee\xe7\x87\xb3\x5a\xd8\xdf\x2e\x3d\xb5\x97\xd2\x23\x2f\x1f\xd9\xcb\xb9\xfe\xf8\x6d\xb9\x91\xd5\x36\x10\x80\x27\xbe\x87\x2a\xd9\xc6\xdb\x68\x57\xde\xe9\x5e\xb7\xf7\x6d\xe3\x65\x68\x36\xac\xaf\x55\xdd\x9d\xfa\xaa\x3f\x10\x90\xc5\xe3\x82\xe5\x51\x00\x01\x2f\x16\x85\x91\x63\x44\x0a\xd4\xa0\x9c\xf4\x86\x41\x39\xaf\x6d\x34\x07\x41\x1e\xc0\xc0\x9c\xd5\x4a\x72\x65\x0c\x7b\xcc\xa4\x33\x5e\x0a\x67\x44\x10\xb1\xe1\xdc\xb5\x3c\x98\x43\x94\xa0\xd9\x7b\xab\x9b\xec\xfc\x7c\x92\x1b\xb3\x21\x4f\xac\xb3\x8f\x67\x57\xab\xff\xf2\x4f\x78\x3e\x5f\x8c\x30\xbf\x72\xe1\xbd\x3c\x9b\x2d\x8b\x43\xf4\x2b\x74\xda\xe5\x7a\xf2\x79\x3f\xd1\x73\xf7\x94\xe4\x43\xea\xa0\xce\xcf\xa6\x44\xf9\x3e\x16\x73\x9c\xcf\x2d\xd8\x3d\x34\x97\x77\x46\x69\x23\xed\x03\xf1\xe9\xb9\xdc\x4a\x1a\x08\x8f\x3b\x56\xd5\x15\xdd\x10\x5b\x16\xd4\xd0\x48\xa8\x9e\xf3\x2e\x4d\xc1\x90\x92\xaf\x69\xa4\x94\x8e\x8c\xb1\x69\xcb\xa4\x91\x8a\x0b\xcb\x0d\xe7\x42\x31\x2d\x88\x54\x48\xc9\x33\x16\xd8\x6d\x8a\xec\x7d\xf6\x97\x97\xf3\xfe\x62\x4e\xfe\x15\x71\xee\x22\x2c\xb3\xcc\xc3\x97\x8b\x94\xa6\x68\x7f\x08\xe6\xf2\xf7\x37\xe0\xc7\xeb\x25\xd1\x02\x51\xc2\x80\x4a\x60\x5c\x85\x76\x51\x03\x19\xeb\x79\xab\x81\x42\xc0\x94\x85\xd8\x91\xb8\xbc\x44\x55\xdc\xe1\x0d\xe4\x8f\x59\x6c\x72\xd5\x87\x78\x28\x94\x31\x4a\x82\xfa\xa1\x70\xc2\x69\x9b\x1b\x49\x2c\x16\x6b\x43\x30\x62\xcc\x59\xe3\x82\x8b\x5b\x23\x8a\x50\x08\x50\xba\xe0\x8e\x47\x63\x8f\x60\x74\xb4\x3a\xfa\xd3\xb8\xaa\xa2\x8f\xbd\x91\x1a\x70\xd0\x00\x55\x9d\x1a\xdc\x6b\xa1\x43\x22\x30\x65\xab\x9c\x25\x0c\x2c\xcd\xaa\xec\x4f\x97\x1c\xf4\x72\xce\x37\x67\xe6\xc1\xa7\x04\xfe\x7b\x7b\x97\x86\x65\x49\x28\xeb\x65\x03\xec\xbc\x12\xde\xce\x4f\x35\x02\x6d\x85\x3c\xad\xc0\x71\x50\x80\x9c\xd0\xce\x0d\x00\x61\x5a\x03\x4e\x51\x3f\xc7\x24\x5f\x56\x4d\x0d\x74\x5c\x36\x9f\xfa\x61\x07\xc6\xd8\x00\xb1\xa7\x56\xae\x1b\x42\x10\xe3\x6e\x3b\xe7\x02\xbb\x38\xca\x1d\x28\xc0\x4e\x4b\xa9\x95\x8a\x06\xcf\x45\x8f\x75\xce\xd9\xf9\x45\xb1\x90\x65\xff\x2c\xa3\x69\x06\x66\x5e\x20\x35\xfe\xdd\x93\x9a\xe6\x35\x42\xf3\x1f\x14\x68\x06\x37\x77\x7f\xbc\x9a\xff\xfe\xbf\xfa\x5b\xf0\xf9\xee\xfb\x79\x53\x5a\x12\xb5\xb7\x5f\x2d\xe1\x35\xc4\x70\x55\x4c\x03\xd8\xdd\xcb\xc6\xd7\xf9\x2e\x01\x31\x3b\x7f\x16\x41\x3b\x00\xe6\x01\x3d\x65\xc5\x7a\x5f\x20\x2c\xe4\xb6\x32\x96\xc0\xe2\xa1\x22\x75\xb1\xf6\xd1\x72\x62\x31\xf3\xac\xf2\x15\x9d\x46\x4f\x85\x57\xa0\x4e\x3f\x6d\x0c\xa1\x56\xc5\x5a\x44\x12\x1b\x01\x04\xa8\x73\x8d\xe1\x62\xf4\x73\x48\x56\x76\x91\x8a\xee\x20\x49\xe9\x0b\xa8\x5b\xe0\x4a\x6c\x46\xa9\x89\x91\xc6\x22\x67\x4a\xdc\x1a\x3e\x5f\x1e\x14\x6c\x96\xa7\xda\x35\xac\x7d\xf6\x36\xdd\xd1\x45\xb3\xe4\x8b\x0e\xfa\xc7\x17\x5f\x8b\x45\xc2\x1f\x82\xcd\xfb\x4f\xdf\x5d\xfc\xe1\x93\xac\xe3\xda\x78\x13\x52\x3b\x12\xc6\xfd\x82\xf4\x79\x10\xc0\xa5\xf5\x3a\x82\x2a\x6e\x01\x3e\x95\xf9\x18\x03\x05\x12\x1d\xe2\xa8\x8f\x3b\x74\xc0\x4a\x28\xc6\xb9\x6a\xe5\x61\xed\x1f\xfc\x5a\xf7\xbe\x75\x8d\x6f\x9d\x6b\x5c\x37\x7f\xf9\x2e\xfa\xc8\xb6\xa6\x01\x1c\x64\x92\x71\x2b\xa8\xd6\x07\x80\xe7\x9a\x8f\x25\xfe\xeb\xbc\x1a\xdf\x9e\xb1\xc3\xff\xe5\x45\x06\xfe\xeb\x97\x10\xea\x34\xa3\xfa\x7e\x11\x1b\x7b\x99\xa5\x9f\x3b\x92\xf3\x3f\x7e\x3e\x37\xe7\xde\xac\x37\xef\x3f\xbf\x7b\xbf\x46\x80\x87\xa4\x2f\xc2\x1b\xe9\x07\xb1\x6d\xda\x91\xef\x43\x90\x6c\xae\x07\x46\x6e\x1d\xfb\xb9\x03\xde\xa7\x5b\x2a\x4e\x1d\x90\x51\xf3\x55\x75\x1a\x93\x74\x7a\xc5\x50\x47\xb0\x87\x90\xb1\x2a\xea\x58\x54\x23\x24\x6b\xd9\x75\x7e\xd4\x55\x0c\x52\xb3\x9a\x87\x9a\x05\x66\x7a\x90\xf9\x31\xba\xc1\xb9\x21\x67\x5a\xcf\xb7\xc7\xc6\x3a\x4a\xe7\x63\x2f\x75\x25\x35\x66\xb8\x28\x9d\xa4\x01\x4a\x9e\xfa\x5b\x3c\xf5\x23\x51\x9a\x5d\xcd\x7b\xf0\x9c\x91\xff\xaf\xd9\xff\x73\x3d\xcf\xbe\x66\xae\xdc\xbe\xbd\x7d\xbb\xe8\xbe\x7e\x7b\xc6\xfd\xfa\xa7\x24\xd0\x70\x65\x4d\x79\x97\x2f\x43\xe0\x97\x4f\xf1\x79\xe6\x9d\x9a\x37\xa0\xf6\x65\x05\x24\xc2\x07\xce\x10\x45\xac\xc2\xad\x6f\xa0\x76\x1e\x63\x36\x16\x00\x11\x18\x0f\x55\x59\xd7\x00\xb7\x11\xa6\x6f\xdb\x15\x16\x96\x6b\x68\x39\x82\x45\xdc\xe2\x83\x1c\xf0\xbe\xb1\x25\xf4\x4b\xea\x4e\xe2\x10\xa2\x01\x6e\x8b\x89\x76\x1b\x84\x11\x34\x9c\x9c\x28\x17\xa5\x2b\xf0\x3e\x1e\x40\xb9\xef\x39\x28\x00\x01\x01\x43\xd7\x36\x84\xc1\x68\xd2\x24\xbc\xd6\xba\xae\xf3\x6d\xac\x7d\xe5\x4a\x52\xc7\x83\x36\xbc\x8b\x16\x51\x52\xd7\xae\x5e\x20\xdd\x35\x27\x22\xcc\xeb\x66\xce\x2f\xf1\xfa\xf0\xd4\x9f\xfe\x93\xec\x77\x4f\x7e\x28\xcf\x7c\xe8\x73\x46\xb2\x94\x9b\xc9\x1b\xfd\xed\xed\x5d\xb9\x79\xff\xe9\x63\x5a\x48\x39\x5b\x99\x93\xf3\xb9\x98\x9a\xcb\xb1\x72\x75\x2c\x72\xe4\xa3\x0a\xe0\x70\xdf\xd4\xe0\x58\x3f\x66\x71\x47\xf7\xc7\xdc\xc6\x62\x7d\x98\x04\x18\x79\x3c\xce\xff\x03\x72\x82\x36\x32\x40\x63\x97\x77\xb9\x9c\xc2\xc4\x01\x8f\x47\xa1\x49\x67\xf4\xfc\x37\x5e\x78\x5e\xbf\xca\x7e\x9d\x72\xbe\xbf\xb9\x4c\x4a\xae\xb5\x8f\x93\x2e\xe6\x5c\x17\x5f\xeb\x65\x24\xa9\x82\xf4\x67\x5f\x75\x32\x13\xab\xe4\x50\x57\x10\xd4\xa0\xe5\xbb\xe1\xa4\xdb\x81\xe7\x86\xe5\xbb\x6d\xd7\x03\x9c\x87\x1d\xdf\x75\xba\x1b\x4c\xd0\x20\xb3\xf1\x10\xe6\x64\x7f\x82\xc7\x3c\x8c\x10\xf7\xb5\xae\x5b\x1f\x34\x28\xd0\xfc\xf1\x86\xe3\xaa\x1a\x94\x27\x42\x09\x4e\xc3\x50\x0b\x69\x62\x1f\xa9\x95\xda\x59\xe9\xa4\xad\x7b\xd7\xc6\x21\x99\x2f\x13\xa9\x9c\x15\x41\x98\x06\xb0\x76\xe9\x95\xcd\xe7\x05\xb3\x3f\xca\x7e\x3c\x6b\xc9\x2e\x7e\xb5\x73\xc2\x93\x86\x3a\x69\x7b\xc9\xc1\xfb\x1f\xbf\x7f\x3e\xab\xef\xbe\x7f\x0b\x6e\x3f\x9c\xfb\x5f\x3f\x2d\x2d\xd9\xdb\x33\x5e\xfe\xc3\xd9\x30\x7c\x73\x9e\xca\x6e\xaa\x50\x96\x47\x50\xca\xc7\x2c\x1e\xbb\xc7\x4c\x00\x79\x2a\xf2\x2e\xd6\x18\x08\x32\x1d\x05\x68\xf8\x9e\x70\xca\x09\x83\x48\x7a\xde\xbf\xd2\x85\xa1\xd2\x08\x71\x8c\x35\x09\x56\xd3\xc9\x04\x5b\xd5\x7b\x56\x00\x02\x91\xe5\x38\xd6\x0b\x7f\x7d\x03\x71\x55\xb6\x22\xc8\xed\xd6\xba\xce\xf8\x7e\xca\xe2\xd6\xee\x73\x36\x97\x93\x18\x31\x62\x40\x01\xe4\x63\x36\x6d\x15\x46\x84\xb8\xda\x58\x44\x08\x8d\x7b\x08\x2d\x46\x74\xa5\x18\xc6\x5c\x08\x2b\xe5\x3e\xe9\x51\xbe\x4a\xd7\x82\x6f\x74\xf6\x97\x67\x96\xf2\xff\x98\x18\x33\xe7\xe7\x77\x99\x17\x9d\x89\x45\x09\xa2\xf0\xe4\x71\xb9\x44\xa8\x85\x65\xf6\xe9\xf3\xdd\xea\x1b\x43\x92\xfc\xa8\xca\x32\x57\x18\x83\x63\xdc\x0a\x6a\xb8\xc7\xd3\x91\xaa\x46\x6a\x11\x9b\x3c\xe0\x80\xaa\x5c\xdc\xab\xde\x77\x10\x31\x20\xab\xdc\x61\x38\xf5\x6e\x3d\x3e\x54\xc5\x7a\xff\x00\xd7\x7d\x38\xd9\xba\x5e\xd9\x93\xdd\x68\x5e\x16\x0a\x23\x4b\x08\xe3\x0c\x22\x4e\x25\xc2\x3d\xc5\x84\xd8\x10\x6d\xdc\xce\x25\xae\x06\x5d\x59\x18\xad\x11\x9a\xba\x39\x9b\x8a\x82\x31\xd0\x8c\x7a\x99\x95\xed\xe6\xbd\x6a\xdd\x27\xf5\xe3\x0b\xc3\xe3\xa5\xf6\xde\x33\x94\xe6\xdd\x59\x7c\xef\x43\x52\x54\x7a\xd2\xed\x7b\xd6\xb6\x3e\x33\xb2\x03\x81\x40\x1b\x4c\x40\x19\xd5\x1c\x6c\xce\x3e\x92\xa0\xc0\xc4\x02\x51\x21\xe5\x09\x8a\x0d\x39\xf5\x0d\x22\x80\x4d\xc7\x1c\xd5\xd1\xd4\x1d\x5d\xc4\x08\x5d\x34\xeb\x5e\x28\x57\x5b\xdf\x2f\x9b\x43\xef\x6b\xeb\x18\x9d\xb6\x2e\x38\x30\x20\x46\x23\x6e\xa6\x2d\x57\xeb\x5e\x44\xd9\x9f\xba\x6d\x06\xe6\xfb\xb5\xa2\xeb\x7e\xae\xfc\xbf\xff\x85\x65\xea\xfe\x81\x95\xb6\xee\xdd\xf0\xad\x35\xa3\x2e\x3d\xe4\x66\x7d\xc8\xee\x92\xea\x10\xcb\xfe\xf3\x93\x0b\xc2\xaf\x97\x97\xa5\x73\xb7\x59\x1e\xe5\xb3\xba\x66\xfa\x8d\x7f\x98\xa3\x3f\x27\x31\x69\x3b\xd3\xb6\x82\x60\x88\x87\x02\xc0\xb8\x2d\xfa\xa0\xad\xa3\x71\xd4\x00\xe1\xd8\x03\x5e\x48\x26\x54\xbb\xe2\x1e\x62\x00\x21\x9e\xaf\x2e\x8c\x4d\x8a\xe4\xf3\xa1\x4f\xa3\xd7\x72\x07\xea\xb3\xb5\x6e\x15\xc7\xf5\xa1\x12\xdc\x35\xce\x55\x55\xb3\xb7\xdb\xfa\x31\xdb\x99\x01\x48\xe7\x1a\x2b\xe5\x5c\x57\x29\x21\x38\x56\xda\x75\xae\x75\x83\xd5\xab\x46\xab\xed\xb1\xeb\xe2\xd0\xb6\xb1\x1d\xb2\x6c\x9d\x74\x4d\xda\x4d\x99\x6d\x52\xf4\xfe\x4f\x5f\xa1\xf8\x5e\x68\x97\x5c\xeb\x97\x3c\xaf\x94\x8f\x77\xe0\xee\xf3\x5c\xf6\x5e\x19\x0a\x7c\xfa\xfc\xd4\x81\x01\x23\x18\x43\xaa\x07\x70\x52\x2d\xa9\x62\xb6\x68\x98\x4c\x63\x48\x03\x4f\x0a\xfa\xe9\x08\x0a\x8c\x77\x39\x89\x15\xb0\x80\x93\x48\x4e\x6e\x41\x63\x5f\x35\x6e\xa4\xb5\x87\x4d\x99\xc4\xfc\x4b\x91\x46\xf7\xd8\x72\xcb\xe7\x6c\x6b\xfe\x46\xb0\x15\xb1\x57\xc5\x44\x19\xf5\xad\x92\x9e\xb2\x9c\xa5\x67\xbc\x4d\xbe\xca\x30\x45\x9a\x7f\x99\x62\xf5\xdf\x3c\xf7\xcc\x16\xf5\xeb\xaf\x7b\xd4\x37\x97\x42\xf8\xed\x59\x87\x62\x21\xe1\xcf\x99\x16\xab\xef\x9b\xba\xde\x88\xfb\x66\x00\xb5\x07\x21\xaa\xbc\x7a\xa0\x79\x15\x65\xb9\xf2\x31\x23\x3e\x68\xb9\x0f\x3b\x3f\xd7\x4b\xa0\xd6\x9a\x60\x8b\x89\x56\xc3\x71\x03\xef\x11\xc6\x9b\xdd\xfd\x76\xdd\x48\x8c\x53\xbb\xf9\x10\xb7\x24\xb6\x7b\x89\x0c\x57\x9a\xef\x08\x25\x84\x31\xc4\x75\x6d\x16\xcf\xa2\xa7\xfb\xf3\x2f\x92\x7e\xc4\xd2\xf5\xbb\x70\xfa\x6e\x3f\xbc\xd4\x8d\x78\x7b\xfb\xe1\x76\x09\x9a\x49\xd9\xea\xab\x5b\x72\x61\x4f\x9f\x6f\xcd\xa6\xf5\x4a\x0b\x03\x03\x67\xa7\x7d\xed\xf2\xa2\x99\xf6\xc0\x44\x37\x8e\xa7\xf6\x9b\x97\x7f\x25\xe6\xdb\x96\x60\x63\xe7\x3b\x41\x22\x9e\x06\x2e\x4a\x5b\x50\x10\xa6\x21\xef\x92\x75\x0d\xd7\x7b\xc3\x5f\xdc\x08\x35\x27\xc7\xa9\x67\x4b\x6e\xea\xe4\xe5\xc2\x9e\x74\xbd\xfe\xcf\x14\xf9\x9f\x29\x57\x67\xf9\xd4\xcb\xba\x4b\x00\xa0\x8b\x97\xcb\xdb\x6b\x06\xfc\x8b\x95\x98\xf4\xdf\xfe\x0c\x7c\x7c\xfb\x27\xf9\x32\x10\xde\x9c\x4d\x77\x57\x38\xea\xc6\x0b\x9a\x0f\x15\xb4\x14\xaf\xb2\x98\x59\x8c\x40\x1b\x33\x10\x42\x88\xbb\x0e\x40\x1e\x77\xdb\x30\xfa\xb0\x53\x7b\xdf\x03\x94\xea\xfb\x1d\x40\x31\x00\x86\x70\x8e\x08\x8a\x05\xa3\xbb\x71\x0c\x20\x9b\xec\xfc\xba\x16\x89\xaf\xd4\x88\x01\x90\x31\x97\xb0\x12\x94\x5b\x48\x90\x91\x5b\xb3\xf3\xac\x56\x43\xec\x92\xcb\x0d\x6e\x95\x13\xc1\x48\x23\x8c\x34\x10\x52\x4a\x09\xdb\xc9\x39\xd6\x09\xb1\x4d\x3c\xae\xcd\xb9\xb7\x2b\x32\xf4\xa4\x7a\x76\x99\x9a\xbc\x10\x71\x7f\x92\x45\xba\xfe\x0c\x7c\x43\xc4\x7d\x97\xef\x43\xbe\x1f\x2b\x58\x1b\xee\x3c\x13\xda\xe9\xd8\xac\xc8\xf1\xb0\xa2\x71\x8b\x9d\xe2\xc6\x52\x6e\x82\x88\x87\x57\x45\x78\x30\x21\xac\xdd\x83\x49\xf3\x95\x90\x97\xd3\x61\x7d\x50\xca\x22\x48\x88\xe1\x84\x13\x21\x6c\xec\x9d\x03\x94\x13\x6c\x18\x61\x44\x4a\x3d\x1d\x4e\x23\x63\xab\x6a\x6a\xc0\x8e\xa5\x1b\x9b\xfc\xca\xd4\xa3\xbe\x09\x1b\xfe\x0f\xf8\xde\xa5\x3d\xfb\xcd\x37\x5d\xef\x7e\xf9\xf3\xe1\x95\xfe\xd9\xeb\x8d\xbf\xd7\xe1\xdc\x56\xd8\x3f\xd4\x97\x77\xf7\xe2\xd5\xe1\xe7\xb2\xd9\x34\xf7\x22\x80\x31\x56\xb9\x05\xc7\x07\x77\x79\x77\x8f\x6e\xf0\x71\xbb\xe1\x86\x26\xe3\x30\x4a\x0f\x8c\xb1\x83\x21\x91\xa6\x9f\x52\xa3\xc1\x9c\xf3\x80\xb9\x06\xdb\x67\xff\xbf\xc4\xd4\x21\x19\x4f\x4c\x9d\xc4\x81\x7c\xa9\x45\xf0\x84\xba\xdc\x7c\x69\xc0\x77\xdd\x61\x7f\xf3\x44\x39\xbd\xc8\x13\xa6\x14\xf0\xcd\xbc\x8d\xe4\x23\xd5\xf6\x70\xf0\x4a\x32\xee\xa5\x95\xbd\x8e\x47\x50\x0d\x04\x10\xd0\x03\xe9\x53\xa5\x33\x3e\xec\x40\x1b\xeb\xbc\x6b\xe6\x5c\x2e\x22\xad\x5b\x59\x83\x32\x40\x0c\xb6\xc2\xb4\x5b\x1a\x0f\xbb\x31\x76\x14\x94\x3d\xa7\x52\x2a\x80\xa4\x34\x86\xae\xf7\x16\x56\x7b\x4f\x9d\x75\x46\x4e\x2e\xe7\xad\x33\x03\xa8\x7c\x0f\x3d\xa4\xd6\x3a\xed\x9c\x8e\x47\x26\x95\x64\x92\x5a\x23\x55\x01\x29\xb5\x4e\x30\xe4\x89\xd2\x38\x20\x4a\x39\x23\xa6\x66\x82\x52\x71\xd6\xe6\xe0\xe9\x9e\x7e\x77\xa5\xd2\xf3\xbb\xec\x63\xc6\xe6\x7b\xf9\x24\x72\x7e\xd6\xe8\xb8\xdb\xdc\xcd\x19\xc3\x55\x16\xff\x0d\x07\x85\x45\x65\xed\xf3\x5f\x3d\xcb\xac\x1d\xf3\x3e\x25\x43\x5d\x6c\x21\xca\xcb\xe3\x01\x1c\x11\x89\xfb\x1c\x81\x9e\x4e\x2d\x8e\x62\x83\xef\xb7\xf5\x3a\x3b\x65\xf3\x91\x63\x52\xf9\x8a\xac\x90\x15\x35\x37\x0f\xc8\x19\x63\x3d\x40\x0d\x1b\xfa\xa2\x2b\xcb\x32\x54\x2a\x92\xd8\x9b\xf5\x20\x30\x65\x8e\x11\xe7\x28\xb5\x96\xc6\x31\x16\x80\xb0\xc7\x8c\xef\x28\xc3\x9c\x54\xae\x66\x8d\x23\xbc\x53\x46\x6b\x8f\x60\x51\x55\x4a\x78\x4a\x65\xda\x77\x7d\xd2\x8e\x83\xd9\x26\x7b\x9d\xfd\xcb\x34\x0b\xf8\x3f\x92\xc7\xe8\xe2\x33\xf0\xe1\x22\xe4\x90\xbf\x7a\xfb\xe7\xef\x3e\x82\xaf\x0c\x06\x96\xf4\xf1\x0b\x8b\xe8\x2b\x98\xc9\xc5\x22\xfa\xdd\xfb\xcf\x9b\x84\x6d\xb8\x9a\xeb\x9f\x19\x1c\x6b\xc5\xa2\x9c\x1a\x04\x0e\x79\x17\x88\xe1\xb8\x0c\x50\xd5\x5b\x13\x7b\x8b\x89\x21\x71\x8b\x91\x85\xb8\x23\xd0\x40\xac\xd7\x85\xa9\x01\x95\x12\x11\xc8\x31\x8a\x9e\xa3\xb1\x2c\x35\x47\xa6\x2c\x77\x07\x28\xf9\xe8\x81\xe6\x9c\x81\xd2\xc8\xd3\x08\x6c\x60\x28\xea\x1c\x51\x81\x11\x37\xba\x41\x9a\x9b\x0d\xb4\xac\x74\xe5\x83\x80\x15\x1f\x48\x3c\x6a\xae\xd6\x02\x4b\x4a\x59\x85\x09\x21\x04\x22\x4c\x30\x36\x9a\xd3\x49\x09\x5e\xd9\x92\xe6\x99\xaa\x60\x55\x22\xa9\x10\x82\xb0\x14\x44\x4c\x78\xc5\xaa\x52\x30\x84\x27\xc3\x31\x56\x4a\x12\x08\x39\xc3\x50\x95\x90\x2e\x79\xa8\x49\x5c\x0c\x7a\x5e\x4d\xff\x6e\x99\x5e\xcd\x85\xc4\xd5\xb5\xb9\x5d\x60\xb0\x0b\x8c\x75\x0e\xc7\xf9\xe6\xfd\xa7\xef\x9f\x38\x98\x73\x39\xfc\x57\x8b\xa0\xea\xe7\x4f\xe0\x17\x2c\x1f\x60\xe4\xc1\x42\x64\x14\x75\x65\xd5\xee\xe9\xae\x82\x9a\x90\xc3\x92\x4d\x4d\xad\xf3\xd1\xd2\xd1\xf8\x1a\x7a\xad\x34\xf4\xc2\x73\x2b\x28\xc1\xce\xed\x5b\xb8\x91\x75\x50\x8a\xe2\x92\x52\x08\x43\xfb\x98\xf9\xb5\x3b\x1d\xa3\xc3\x58\x70\x32\x8c\x84\x51\x46\xe9\x7a\x24\x98\x73\x65\xb7\xdb\xd8\xf5\x3d\x9e\xfc\xde\x39\x00\x71\xe5\x5d\x07\x0b\xdb\x82\x0a\x1d\x43\xa9\x34\x8a\x6e\x0f\x55\x6e\x5d\x64\xbb\xd6\xb9\xc2\x95\x9c\xfb\x2d\xd8\xde\x1f\x37\x3e\xcb\xfe\x30\xe3\x8f\x6c\x53\x26\x0f\x86\x67\x4c\xfc\x5f\x5c\xa3\xf2\xae\x71\xf1\xdf\x96\x06\xfd\xaa\x73\x7b\x91\xff\x6c\x7d\x59\x81\x11\xe3\xc3\x49\x43\x24\x47\xd0\x12\x14\x2d\x45\x64\x1c\x81\x19\xa7\x3a\x7d\x13\x9a\x39\xaa\x27\x68\x89\xb6\x26\x77\xa2\xf2\x15\x37\xa8\xae\x36\x15\x44\xd8\xf0\x24\xf7\x0c\xa1\x6e\x0d\x65\xe2\x4a\xe2\x33\x6e\xbf\x29\xea\x5c\xdb\x39\xa7\x14\x8f\x3c\xe9\x2e\xfe\x2a\xfb\x77\xe7\x89\xd1\xf5\x46\xf9\xe1\xf5\x1d\x48\x00\xe7\x27\x63\xde\x67\x7c\xf3\xbb\x55\xaa\xac\x3e\xfd\x06\xdc\xfd\xf5\xfb\x0f\xaf\x13\xcd\x7c\x73\x1e\xae\xcc\x8b\xe0\xf3\x45\xfe\x6c\xb5\xad\xf3\x61\x22\xab\xea\x38\x02\x5d\x03\xbe\xea\x23\xae\x90\x12\x5e\x37\x82\xd2\xc2\x57\x52\xd6\x3a\xf4\x6c\xeb\x68\x75\x52\xad\xad\xd7\xb0\xa8\x5b\xa8\x30\xbe\xdf\xae\xaa\x38\x48\xe6\xf6\xb1\xe4\x7b\x1b\x5b\xea\x2b\x61\xd9\x86\x30\xc7\xbc\xdf\xed\xe2\xd1\xc7\x03\x37\x1d\x3e\x36\x75\x80\x8d\x1a\x34\x77\xc2\xb4\x00\x6d\x63\x1f\x47\xb9\x07\xa9\xdd\x22\x20\xc3\xe4\xe8\xf6\x4c\xe2\xd8\x5b\x4d\x18\x20\xac\x72\x0a\xcb\x45\x2b\x8f\xdd\x0c\x09\x07\xf1\xeb\xd4\xa7\xfd\x31\xfb\xff\x3f\xa9\x04\x5f\xfa\x07\x3f\xbe\x7f\x7d\xf7\x71\x7d\x16\x29\x79\xb5\xf8\x66\xbc\x7b\xff\xf9\xed\x87\x67\xbb\xb9\xcf\x1f\x12\x32\xe5\xfb\xab\x92\x72\xde\x52\xd7\x95\x2e\x2b\xe0\xc1\x4e\xc4\xbe\x9d\xb2\x78\xdc\xf3\xbc\x6a\xc0\xd6\x5a\x39\xb9\xcd\xfe\x1e\xd6\x23\x66\x62\x38\x70\xcc\xf6\xbe\xc3\x82\x40\x41\x09\xc8\x60\x38\xa1\x10\x56\xbb\x13\x9a\x8f\x8d\x11\x45\xe1\xb9\x67\x94\x52\x49\x9c\xc1\x88\xe0\x63\xe4\x86\x53\xc2\x39\x1a\x06\xc4\x39\x96\x64\x88\x6a\xea\x28\xcd\xd9\x56\xc6\xad\x3a\x73\xeb\xf1\x79\x5f\xbc\xcd\x70\xaa\x23\xf9\x93\xfe\xe8\x15\xaf\x15\x7c\x4d\x69\x5d\xa0\x31\xdf\xbf\xbd\xc4\xc7\x2b\x3e\xeb\xe6\xd2\x48\x38\xab\xe2\xdd\x02\x67\xf5\x4e\xf6\x80\x38\xeb\xb5\x9f\xd4\x4a\x7a\x88\x80\x97\xc8\xe9\x4e\x05\xa3\x6b\xd9\x68\x4e\x35\xa6\x12\xed\x09\xd3\xfe\xc4\x1d\x11\x9e\x61\x79\x04\x45\x92\x03\xc0\x10\x29\x6e\xf5\xbe\x90\x4a\x4a\xb6\x81\xec\xd8\xda\x5a\x1c\xe7\xc2\xf3\x18\x3d\xd8\x23\xab\x5d\x94\xc7\x60\xad\x69\xea\xf9\xc5\x77\xa2\x36\x3d\x60\x4e\xa9\x83\x61\x5a\x9f\x0e\xb9\xa1\xd0\x0e\x74\xce\x9d\x2a\x24\x04\x97\x80\x1c\x06\xa6\x69\x0f\xca\xec\x26\xe5\x6c\x21\x5d\x87\x39\x36\xfc\xfd\xd9\x0d\x6a\x89\x0f\x3f\xce\x51\x6f\xc9\x63\x6f\xce\xfc\xe9\xcb\x80\xfe\x49\x0e\xe8\x7a\x3c\x3f\x2f\xfe\xc4\x71\xd8\x7c\xc1\x71\x78\x97\x46\x85\x3f\x5c\x67\x16\xaf\x06\x3a\xf1\x53\x8d\x57\x34\x16\x1c\x53\xd0\x60\x66\xc5\xbc\xfc\x24\xae\x09\x01\x65\x7d\x1f\x6a\xc0\x11\xcd\xa9\x55\x42\xdb\x38\x06\x6a\x01\xe5\x85\x2b\x5d\x34\x8c\x40\xb8\xf2\x6e\x04\x08\x48\x1a\x51\x74\xb1\x8e\x48\x00\x03\xaa\xda\x28\xcb\x01\x0b\x14\xb4\x3b\x37\x15\xed\x0a\x1b\x6e\x99\x7d\xd8\x5a\xa9\xb4\xde\x40\x4b\x90\x85\x0d\x65\x88\x51\xce\x25\xb2\x9a\x28\x1e\x8f\xbe\x06\x15\xc1\x47\x44\x25\xc1\xd4\xc3\x12\x71\x6c\x59\x81\xa0\xd2\x82\x40\x87\x85\x44\xae\x22\x73\x45\x63\x6c\x80\x2c\x12\xc2\x79\xce\xb4\x65\xc6\x94\xcc\x73\x25\xce\x3d\x36\xbd\x1e\xb3\x37\xd9\x9f\xa6\xde\x4b\xba\x8a\xdf\x9f\x8d\xd4\xf3\xd5\x15\x22\xeb\xd3\xe7\xb7\xdf\x2f\x0b\xe8\xac\x05\x75\xed\xef\xff\xf6\xf5\x95\x72\xc3\x77\xbf\x01\x73\x5a\x72\x51\x4f\x7c\x01\x6b\x58\x46\xd2\x6e\x8b\xa0\x83\x15\x28\xaa\x40\x88\x63\x62\x27\x1a\xab\x2d\xa7\x75\xc7\x99\x82\x35\xdd\xb4\xa7\x7a\xe5\x22\xc7\x5c\x30\xc5\x88\x50\x34\xda\x20\x1b\xe8\x2c\x55\x07\xb3\x1b\x56\xd9\x94\xd1\xbc\x70\x73\x21\xc4\x0c\xc5\x15\xa3\x64\x3a\xf6\x18\xba\x0a\xaf\xf6\xce\x42\xa3\x63\x19\x0f\x8c\x4a\xe5\xac\x91\x8d\xd1\xfd\x36\x7a\xca\x3a\x40\x87\x9c\xda\xb8\x33\x0c\x23\xca\x69\x05\x2b\x2b\x41\x39\x52\x45\x10\x05\x58\x47\x13\xbd\x00\x18\xe8\xdc\xef\xf4\x14\x84\xb0\xed\x82\xec\x0d\x25\x17\x38\x59\x21\xa5\x9a\x9d\xad\xf9\xfa\x70\xf6\x9e\xf8\xdd\x93\xb7\xc2\xed\x87\x4f\x37\xe7\x4d\xe2\xcd\x99\x57\x7d\xad\x6a\x93\x98\x75\x29\x4f\xcb\xab\xba\xaa\x80\x3b\xed\x0f\xd0\x5e\x84\x21\xf7\x84\x00\x3b\xf5\x45\x5e\x14\xda\x51\x53\x39\x86\x51\x11\x0d\x1b\x14\x28\x1f\x33\xe0\xcb\x6a\x7d\x40\x08\xc6\x2c\xcf\xc8\x91\xc5\x03\xdf\x12\xea\x64\xdc\x35\x95\xab\xa8\xed\xbc\x6d\x41\xe6\xca\x72\xc1\x32\xb2\x9b\x7a\xc3\xb2\x3f\xca\xfe\x75\xf2\xd7\x5d\x1e\x80\xa5\x79\x7b\xf3\xc3\x9b\xb4\xbd\x3d\x09\x8b\xbc\x79\xe1\x7f\xff\xe1\xdd\x7b\x70\xf7\xf9\xd9\xbe\x13\x2c\x12\x59\xab\xbe\xa9\x60\x3e\xd4\x0f\x2a\xe4\x3c\x70\x22\xbc\x14\xc4\x62\xdc\x47\x7e\x68\x44\xdb\xfa\x7a\x50\x47\x1d\xdb\x1e\xe1\x98\xad\x10\x0c\x45\xb9\xe2\x13\xd9\xe6\x25\x99\x42\x3c\xb6\x93\x66\x79\xd1\x4d\x74\xc3\x10\x46\xa7\x3a\xf9\x5c\xcb\x9d\x90\xfb\xbd\x54\x8c\x11\xad\xa4\xd5\xa2\x1e\x6a\xa1\xb5\xd6\x94\x4c\x56\x56\x08\xba\x1a\x7b\x02\x50\x3c\x0a\x47\x92\x9e\xa3\x7f\xe4\x37\x66\x03\xbf\xf0\xff\x5b\xa6\x1e\xff\x38\x3c\xd5\xf3\x56\x9e\xaa\x1b\x70\x06\x9f\xaf\xda\x09\xbf\xa2\x13\xbe\x76\xfc\xeb\xbf\x0d\xa3\xca\x45\xfd\xc0\xea\x3a\xb9\x2e\x36\x79\xf9\xc0\x2e\xef\xa6\xc3\xda\x7b\xcf\x63\x3b\x44\x07\xe6\x9d\x6c\xab\x17\x08\x15\x9b\x38\x21\x79\x7b\x54\x4a\xc5\x46\x2d\xb5\xda\xa2\x1d\xb2\xcc\x4f\xe7\x73\xf8\xaf\x5f\xb3\x6d\xbe\x62\xd7\x3d\x31\x6f\x3e\x7c\xbc\x99\xb3\x8f\x97\xdd\xae\xaf\x8c\x8e\x3e\x7e\xb8\x5d\x6d\x01\x0d\xc0\x28\x15\x1d\x08\x51\x81\x5d\x44\x21\xf2\xb9\xae\x01\x32\xc1\x52\x34\xf0\xb1\x07\xbb\xfd\x7e\x7f\xda\xc6\xea\xa2\x4a\x98\x67\xd1\x4b\x59\xd7\x15\xf4\x86\x04\x1c\x0f\xf1\x80\x8c\x3a\xe8\x75\x23\xe5\xc1\x1d\xa4\xd3\x76\x4e\xe2\xac\x76\xd2\x6a\xa7\xb5\x3e\x6a\x0d\x7a\x67\xad\xb5\xc6\x0d\x06\x51\x8c\x70\xdd\x13\x27\xa1\x0b\xbd\x5b\x5d\xb4\xa3\xf0\x8d\x5d\xbb\xec\xcf\xcf\x7e\xe4\xff\x31\xa9\xa5\x7c\x79\x06\x4f\xc6\xa4\xcb\x62\xbc\xdd\x3c\x71\x39\x6e\x17\x3b\x81\xb7\x1f\x3f\x24\x8b\xc6\xab\x19\xe3\xaa\x9d\x0e\x17\xf7\xde\xbc\x88\x41\x8a\xa6\xa3\x46\x32\x57\x96\x71\x1f\x07\xe4\x54\xdc\x85\x95\x0e\xdb\x30\x8e\xa0\x3c\xd1\xb6\x69\xc2\x76\xcb\x9d\x0b\xba\xce\x51\x90\x4e\x84\xb5\x73\xc6\x68\x63\x5d\x27\x2a\xa2\x89\x6b\x18\x86\xbc\xb2\xaa\x77\xf9\xbe\x18\xc7\xd1\x2d\xb6\x69\x2e\x96\x40\x4d\x23\x3b\x3a\x59\x77\x75\xc7\xbb\x7a\xc1\xa5\x24\x1d\x98\xf5\x90\xea\xee\x67\x76\x73\xf6\xa4\x95\x9c\xf6\x82\xb4\x5b\xe6\xdf\x48\xb8\x6e\x3f\xbf\xbe\x79\xfd\xf6\x63\x82\x61\x5f\xa4\xb1\xd2\x00\xe6\xa7\x4b\x4d\x0b\xb2\xfc\x30\x95\x49\x5c\x74\xd5\x97\x55\x5e\x4d\xc7\x8a\x1a\x61\x8d\x17\x48\x14\xae\x12\xd2\x3a\xdf\xb2\xde\x32\x1c\xc7\x10\xfc\x44\x61\xdd\xac\x4d\x55\x9d\x8e\x17\x00\x76\x72\x66\xe9\x25\x0e\x98\xaf\x87\xd8\x28\xa7\x0e\xad\xef\x07\xdf\xd3\xc7\xac\xf6\x2d\x6e\xf5\x60\x84\x13\xba\x06\x72\x3a\x96\xae\xec\x5b\xe2\xca\x9c\xfa\x6e\x9c\xb4\x8c\xbd\x8c\x0d\x14\xab\xbd\x71\xd8\xeb\x45\xe3\xc7\x3e\xb2\x1b\xb3\xa9\xb2\x3f\xc8\xfe\xe2\xec\x86\xf7\xdf\xae\xd5\x22\xe7\x1b\xf4\xfa\x6d\xda\x3c\xae\xb5\x5b\x2e\x46\x0c\x9f\x3e\x7f\x02\x6f\x6e\x3e\xfc\x22\x55\xe9\xd2\xb6\x4d\x54\xa5\x35\xc2\x55\x7e\xfc\x19\xad\x50\x09\x9d\x81\xa8\x68\xa3\xe0\x00\xdb\xa6\x45\xc1\x59\x57\x75\xc6\x4b\xaf\x38\xa5\xb6\xdf\x7a\x8b\x80\x76\x74\xc4\x35\xaa\x00\x8e\x21\xcd\xcd\x13\xb7\xf4\xb4\xaf\x21\xe2\x3b\x20\x1f\xb3\x44\xd3\xca\x1e\xb3\x4d\xc5\xa4\xf7\x94\x4c\x25\x67\xb4\x88\x43\x70\x73\x1d\x6a\x54\x0d\x4b\xeb\x46\xdc\x99\x62\xde\xf5\xe3\xbe\x81\x88\xe6\x05\x32\x1a\x33\xe1\x8c\x33\x4e\x3b\x91\xf7\x10\xfa\x76\x34\xe6\x31\x33\xe6\x38\x5f\x94\x75\x5e\x67\xf4\xc6\xae\x9b\x14\x15\x7e\x93\xe2\xc2\xed\xf5\x79\x7d\x7f\x96\x4b\x4c\xd3\xd6\xeb\x82\xf3\x29\x41\x5b\x37\xd1\x5e\xcc\x1c\x9c\x3b\x1e\xc1\x2e\x91\xc8\x7c\xd4\xb2\x67\x38\xaa\x1c\x13\x69\x95\x52\x46\x3b\x6e\x84\x52\xeb\x26\x52\x6d\xb5\x1d\xd6\x2a\x0e\x9d\x89\xc6\x84\x69\xd4\x5c\x58\x6b\x35\x17\x4a\x70\xc5\x0c\x65\x94\xa4\x3e\x26\x4a\xf9\xd2\xf3\xde\x89\xff\xb1\x28\xd4\xf7\x6f\xae\x52\xa3\xd5\xe6\xd3\xd9\xca\x79\xbe\x75\xaf\x6e\xde\xdc\xfc\xf8\xd3\xd3\xf6\x09\xc3\x64\xea\x49\x87\x15\xfa\xa5\xed\x73\x1b\xca\x12\x58\x30\xf0\x28\x22\x8e\x21\x0a\x9e\x4b\x08\x42\x63\x4f\x24\x47\x98\x6a\xc5\xc0\xa1\xee\x3d\x89\x36\xba\x75\x63\x0c\x8b\xfd\x36\xee\x00\xda\x02\xda\x6a\xa5\x89\xd6\x1a\xe2\xa2\xb4\xdc\xf1\x7e\xd0\x2e\x44\xc6\xa9\x30\x84\x70\x29\xa5\x13\xc8\x6a\x7a\xc6\xa5\x36\x9b\x2c\xfb\xe1\xac\xd3\x4f\xb2\x7f\xbf\xcc\x12\x6e\x7e\xd8\xdc\xbc\xbf\xbd\x1a\x9b\x5d\x06\x88\x9f\x7f\x78\xf3\x21\xb1\x4f\x9e\x59\x8d\x77\x39\x78\xff\xe9\xfb\x77\xef\x9f\xdd\xf5\xc0\x95\xf0\xc3\x4f\x9b\x2a\xc0\x11\x40\xc1\x9e\x46\x65\x18\x0b\x20\x0c\x28\xd3\xc0\xec\x38\x6c\x0d\x5b\x42\xfb\x43\xe5\x8b\x12\x60\x34\x6d\xd9\xd1\x28\xc5\xf5\x08\x95\xa0\x65\x83\x56\xb6\x09\x82\x68\xc2\x14\x17\xc7\x58\x6f\x32\x8c\x1b\x15\xe0\xb4\x7f\x1e\x97\x21\x58\xb9\xe1\x98\x66\x66\xb2\xf1\xc7\x34\x36\x5b\x95\x90\xf3\x93\x8e\xbd\xf3\x20\x93\xcc\x28\x40\x1a\xc6\x6b\x90\xb9\x69\x8b\xe7\x72\x02\x23\x4c\x5c\x6a\x5f\x9f\xb9\xbf\x2e\x69\x3d\x3f\x77\x02\xe9\xa5\x7f\x7d\xce\x8e\x3f\xdc\xbe\x88\x36\xdf\xb0\xbe\xd8\xdc\x2e\x50\x9d\xb7\xcf\x50\x9d\x86\xc0\x50\x11\x01\x8e\x0c\x07\x42\xea\xd8\xce\x8b\x36\xa4\x90\xd2\xfa\xbe\x07\xa2\x9f\xc6\xf4\x6d\x65\xf9\x3e\x0e\xb9\xda\x85\x63\x21\x94\x95\x1c\x98\x4d\xc1\x25\x96\xbc\xd7\x06\x69\x3e\x49\xeb\xe7\x78\xe2\x2d\xf0\xce\xb9\xa8\xad\xb5\x39\x73\x04\x3e\x66\xfe\x74\x58\x95\xb1\x8e\x83\x55\x1a\x30\xd0\x00\x09\xb3\x6c\xb3\xea\x1e\xc5\x0d\x5f\x77\x67\x37\x8f\x85\xb1\xf9\xe1\xf6\x6b\x9c\xf4\xb7\x90\x66\x1b\x14\x80\xd7\x6a\xe1\x03\x4c\x5d\x00\xa2\xcf\xd9\xd4\xa5\x83\x7a\x46\x1d\x9f\x5a\x21\x2c\x95\xeb\x2e\xea\xd3\x28\x64\xe5\x2b\x26\xe3\xb0\xda\xc6\xa3\x8d\xc6\xe6\x23\x75\x8a\x5a\xc5\x8d\xd4\xea\xac\xa9\x23\x37\x59\xaa\x30\x3f\x25\x34\xcd\x9c\x6f\x6d\xbe\x44\x7d\xbd\xba\xb9\xc2\x15\xdc\xde\x9d\x1b\x50\x3f\x5e\xf9\xce\xfe\xee\xba\xca\x58\x69\x7d\x88\xbb\xf9\x81\x59\xdb\x39\xe3\x9b\x0e\x79\xfd\x70\xc4\x64\x7d\x94\xb5\x69\xe1\x28\x29\x7a\x28\xbc\x52\xc7\x66\x0f\xf8\x0a\x29\xea\x88\xda\x72\xec\x31\xed\x59\x55\x57\x24\x8e\x9e\x6a\xaf\x37\x99\xa1\x55\x42\xa9\x1b\x3f\x39\x4a\x22\xee\xa0\x87\x06\x64\x12\x3b\x59\xe7\x02\x9e\xb4\xd0\x5c\x49\x66\x3d\x0d\xb6\xac\x6b\xdc\xd6\x15\x1e\x16\x9f\x9d\x85\xa3\xa8\x37\xcf\xb3\xb8\xab\x0c\xe5\xf6\xc9\x3e\xed\x52\x59\x2d\xfb\xc7\xb9\xd4\x9a\xcf\xe1\xbb\xdb\x33\xf9\xef\xd7\x37\xcf\x14\xc6\x67\xe2\x30\xc9\x6d\xc8\x4d\xd3\x4c\x2e\xaf\xa2\x48\xc6\x38\x71\xf4\xa0\x99\xc6\x30\x8d\x45\x01\x6a\x17\xb7\xc4\x71\xc9\x03\xc8\x5c\x34\x45\x5e\x4e\x3a\xf7\xa7\x61\x45\x26\xbb\xaa\xe6\x4b\x03\xf6\xeb\x51\x88\xad\xdd\xc6\x46\x0c\x4a\x9f\xda\x7d\x0f\xb0\x88\x12\xd4\x18\xc6\x61\xeb\x95\xe7\xa0\x00\x4a\xa9\x01\x23\x20\x8c\xb0\x42\x88\x5d\x1a\x3b\x67\xab\x95\x4e\xd8\x91\xe2\xdc\x4d\xcd\x16\xb1\xb1\x73\x02\xf5\xc2\x4a\xe0\x45\xdb\xeb\xd3\xe7\x4f\xd7\xdd\x9e\x57\xb8\x3e\x1c\xb7\x7b\x84\xad\xa5\x1e\x1e\xcf\xc6\xe5\xa4\xeb\xd1\xae\xeb\x06\x3c\xd6\xde\x38\x1f\xe8\x60\x78\x60\x7a\x3a\x38\xae\x9d\x5d\x4b\x1c\x5d\x80\x44\x30\xd4\xee\x90\xc4\x91\x69\x5e\x05\xc8\x80\xab\x0a\xa3\x3b\x54\x39\x07\x4a\xbc\x33\x15\x62\x93\x6c\xb7\x74\xd7\x60\xb2\x0d\xdc\xcf\x35\x6f\xb6\xbb\xd1\x1b\xf8\xc2\x81\xe4\xdf\x5c\xba\x54\x6f\x6f\xcf\x8e\x96\x4b\x96\xf4\x71\x31\x36\x7a\x7b\xf9\xfa\x0d\xb8\x32\x37\x02\xbd\xaf\xe0\xfa\xe8\xc7\xf1\xf0\x33\xda\xef\x76\x94\x99\x71\xed\x47\x7f\xf0\xe3\x38\x02\x73\x38\x00\x3b\x8e\x1b\x88\x31\x76\xa9\x1d\x93\xbc\x8b\x7a\x46\x64\x1b\xdb\x44\x98\x3d\x1f\x51\x26\xc8\x4a\x3a\xce\x1a\x0b\xcd\x7a\xc8\xfe\x20\xfb\x55\xf6\xa7\xd9\xbf\x4d\xd3\xcc\x27\x45\xbc\x67\x19\xde\x6b\xe2\x5b\x82\x69\xa7\x96\xc5\xdb\x8f\x6f\x53\x87\xe9\x4c\x7e\xfd\x78\xf7\x09\x7c\x78\xfd\xeb\xef\x2e\x13\xdf\xdb\x1b\x79\x8f\x1a\x57\x03\x8f\x91\x45\x78\x25\x1d\x06\x9e\x79\x54\xc5\x1d\xe5\xd6\xc5\xbe\xe6\x75\x6c\x8d\x73\x16\xc7\xbd\xd8\x93\xc7\xcc\xcd\x59\x6a\x47\xc0\xc1\xef\x1a\xdd\x1b\x1d\x7b\x01\xea\xf5\xe0\xa6\x63\x14\xb1\xe3\x40\x00\x97\xf3\x9a\x09\x22\x18\xc6\xb5\x25\x5b\xa4\x74\x5b\x33\x50\x02\x86\x1b\x1b\xbb\x63\x24\x2c\x1e\x6a\x67\x5a\xe0\x1e\x33\xc0\xac\x8e\xdb\x96\xc4\x46\xbb\xe6\xf8\x98\x35\x6e\x00\x28\xd5\x5a\x62\x85\x92\xf6\xe7\x3f\xcb\x6e\x97\x67\xff\xfd\x8f\x7f\x06\x16\x52\x5c\xb6\x79\xff\x63\xce\xdd\x2e\xf6\x1c\x94\x47\x37\x26\x55\x5f\x50\xba\xc7\x2c\x36\x02\xe0\xf5\xc8\x06\x6f\xd5\x96\x1d\x83\xd3\x3d\x8b\xcd\xe0\x9a\x39\x57\x26\x49\x9b\x79\xff\xa4\xcc\x3c\x3f\x7b\xe7\xfc\xe9\x17\x26\xdd\xe0\x7a\xca\x7d\x59\x0b\x57\x8b\x38\x35\x70\xef\xde\x7f\xbf\xd4\xa9\xab\x03\x13\x5b\xe1\x31\x9d\x83\x55\xc0\x73\xa2\xd4\x3c\xb1\x87\xd5\x94\x79\xe0\x9f\x93\xa4\x13\xcc\xf7\x4d\x08\xdc\x0a\x5e\x49\x49\x42\x3c\xaa\xa3\x8f\x47\xa4\x1d\xc2\xa0\x8c\x32\x1f\x99\xdb\x8e\xc8\x28\xc9\xb1\x32\x0b\x64\xcd\xf3\x95\x6c\x9a\xd8\x77\x5d\xec\xbb\x55\xf0\x71\x08\xd3\x51\x89\x32\x54\x0c\xf4\xb1\xde\xdb\x01\x20\x0b\x0a\xa8\x14\x20\x19\xc8\xe4\x23\xbf\x09\x6b\x95\x91\x65\x3e\xf5\xa4\xb8\xfe\xdd\x0f\xeb\xbb\x1b\xf8\x63\xbe\x7a\x75\xf3\xc3\xb7\x84\x96\x9e\xe7\x3a\x9f\xef\xba\x95\x8a\x5b\x4a\x09\x96\x52\x23\x4c\x3a\xc0\x40\x5b\x45\x11\xdd\x9e\x95\x15\x36\x56\x28\x68\x14\xc2\xdb\x78\xe0\x00\x1f\x60\xff\x98\x71\x50\x6c\x2b\xd8\x39\x09\x70\x1b\xcd\x5a\x39\xce\x28\x67\x56\x50\x12\x87\xa3\x09\x16\x40\x40\xca\x32\xb4\x63\x53\x35\x95\xd2\xb4\x37\xce\x8c\x7a\x30\x4e\x0d\xa8\x72\xc4\x9a\x7e\xae\xe3\xe6\x3c\x58\x6f\x50\x76\x9b\xfd\x59\xf6\x71\xc9\x32\xd6\x9b\x2b\xdb\x9a\x9b\xf7\xf0\x89\x1d\x92\x4e\x2a\x8d\xa6\x12\x86\xe1\x1a\x9b\xb4\x79\x73\xf3\xb4\xa7\x5e\x4c\x69\x6f\xef\xde\xbf\xda\xb3\x58\x47\x8a\xa0\x87\x34\xee\x10\x74\x88\x39\xbc\x2a\x56\x2a\xdc\x37\x61\x5d\x53\x1c\x08\x3e\x55\xbe\xac\x00\x65\x93\x96\x79\x61\x0e\x18\x71\x2a\x19\x47\x58\x83\x32\x0f\xf3\xd9\x45\x0b\xec\x92\x08\xf3\xd8\x86\xc8\xf1\x06\x39\x54\x51\x46\x95\x28\x09\xa5\x52\x14\x3e\x76\xf1\xe8\x6a\x00\xb5\xc1\x8a\xd7\x08\xc1\xa9\x1b\xbd\x03\x8e\x40\x42\x15\x23\x10\xf2\x9e\x93\x06\x14\x09\x59\x79\x9c\x1f\x87\xcc\x64\xe7\xf9\x14\x4c\xb3\xd3\x97\xd3\xc6\xdf\x9e\xfd\x64\x3e\x5c\x30\xd0\xd7\x10\xfc\x2f\x51\x66\x9b\x39\xb9\xfc\xed\xf2\xe4\x2c\x1a\x11\x7a\xf2\x2b\x72\x1c\x57\x74\xf2\x21\x95\x75\x06\xec\x1e\xd0\x46\xdd\x87\xb0\x26\x0f\xc3\xe5\x58\x55\x40\x80\x4a\xc5\x31\x76\x51\x8a\x7d\xd4\x0c\x84\x4d\xc1\x79\x1c\x12\x9e\x99\x73\x1e\xd9\x24\xc0\x9e\x3f\x66\xec\x31\x63\x5b\xca\x34\x27\x4a\x4a\xe2\x51\xc2\x0f\x2e\x1a\x95\x3c\xfb\x67\x5f\xaa\x96\x3d\x61\x23\xdf\x7e\xbc\xbb\xb9\x26\xb1\x9f\x45\xf1\x52\xcf\xe0\xfa\x0c\xae\x54\xcb\x40\x99\x37\x3e\x6f\x26\xe1\x27\xe1\x80\xf7\x79\x93\x10\x0a\xbb\xfb\x30\x44\x9d\xc3\xf9\x5f\xfa\xeb\x93\x00\x50\xc6\x36\x86\x0a\xc8\x15\x02\x18\x20\x16\xb7\x71\x58\xef\xb5\x36\x22\x45\x2c\x61\xf9\x84\xf2\xdd\x7c\x32\x3b\x11\x47\x11\x47\xbe\x57\x02\x59\x48\x11\x33\x3c\x61\x40\xcd\x23\xb9\xb1\x1b\x92\xd1\xb3\x72\xc7\x7f\x4b\x5a\xe8\x67\xb2\xc0\x73\xd9\x95\x6d\x7e\xfc\xe9\x1c\xe1\x36\xaf\xbf\xf4\x94\xbd\xf2\x30\x78\xb7\x4c\xf7\xcf\xb4\x82\x4b\x15\xfb\xfd\xfa\xcd\xcd\xbb\xcb\x5d\xda\x06\x08\x3a\x19\x64\x59\xfa\xa6\xde\x0e\x82\x35\xb1\x8f\x3b\x20\x81\xa1\xd4\x35\x26\x90\x58\x72\xad\x44\xa5\x34\x8c\x6d\xac\xe7\x13\xcb\x76\x23\xdc\xb7\xa6\x3f\xd2\xc1\x6b\xcb\xf0\x16\xc0\xc1\xf3\xd8\x20\xac\x73\xf1\x64\xde\xde\x80\x72\xb0\x43\x3c\x4e\x5a\x0e\xd1\x52\xc0\x37\xa4\xa4\xb2\x53\xb8\x28\x51\x2b\x2a\x84\x09\x7e\xcc\x74\x85\x19\xa5\x75\xcf\x24\xde\x2d\x8c\xbb\xb6\x2a\x2d\x33\xb0\xd4\xcc\x52\x85\x2d\xa4\x18\xa7\xb9\x39\xd7\x14\x23\x50\xc5\xca\x8e\x27\xa2\xb4\x75\x9a\x2a\x2b\xfc\x59\x13\x90\x3f\x92\x84\x37\x5a\xe6\xe5\x97\x98\xfa\xef\x5f\xe2\x20\xc1\xfc\x2c\x7e\x4e\xe5\xec\x15\x57\xfa\xa9\x40\xbf\xfb\xba\xc5\xfe\xf9\x0e\x88\x0d\xbf\x6f\xc3\xba\x7a\x18\xe7\x23\x9a\x1b\x7c\xaa\x4c\xc5\x58\x48\xcc\xe8\xc6\x03\x98\xc0\x09\xe7\x23\x0f\xab\x0c\x75\x7e\xa7\xb6\x8d\xdb\x8a\x5e\x3b\xa9\x95\xb7\x78\x6a\xd6\x87\x98\x01\xca\xe2\x91\x3d\x66\x2e\xa2\xd2\x14\x65\x70\x18\xf9\x32\x79\x3e\x6f\x45\x1c\x10\x9d\x0b\xda\x96\x11\xcb\x84\x60\x16\x53\x61\xb9\x15\x49\xe3\x7f\x8e\xc7\xe4\xc6\xa5\x1e\xf9\x92\x29\xfc\xfd\xb7\xf2\xfe\x3f\xce\xff\xfc\xe6\xfd\xa7\xbf\x9a\x03\xef\x45\x4b\xf5\xfb\x8b\x16\xf3\xc7\xb7\x37\xdf\x14\x3e\x4a\xd2\x0d\xf3\xb6\xb5\x76\x1c\x5b\xcc\x54\x4e\x38\xf2\x98\x8d\x51\x81\xa1\x40\xcc\x12\xc8\x44\x35\x57\xd4\x75\xdc\x2b\x80\xea\xd8\x48\x20\xa2\xcd\xab\x63\xd4\x7b\x18\x8f\xd4\x24\x0d\xb1\xa0\x24\x13\x41\x35\xf2\xa0\x63\x07\x84\x36\xc9\x00\x95\x0b\x2e\x79\x6f\x2d\x34\x2a\xca\x66\xd7\xd1\x22\x14\xc8\x4f\x23\x18\x0e\xb5\xa9\x07\xd0\xd4\x75\x1d\x49\xd3\xe4\xa3\x45\xd5\xde\x13\x2d\x9d\x64\x53\x93\xd3\xc6\x9b\xe1\xe8\xfb\xaa\x3c\x3f\xdf\x89\x93\xbc\x41\x5f\xe0\x21\xf0\x73\x67\xe6\x6b\x77\xab\x85\x35\x7a\x73\xf7\xc7\xe0\xb9\x6f\xfb\xfe\xf3\x1d\x68\xd6\xed\x03\xaf\x57\xfa\xe4\xa3\x5d\x9a\x31\xdb\x88\x57\xf0\x69\xdd\x9e\xd0\xa6\xbf\xa7\xc3\x0d\xb9\x3f\xd2\x75\x5b\x1a\x1b\x7a\xb8\xf5\x84\x14\x0f\x86\xd0\xe8\x36\x28\xf6\x86\x3f\x66\x71\xd0\xdc\xcc\x2f\x8f\x99\xa6\x46\xec\x7d\x61\x0b\xcc\x95\x5c\x7a\x2a\x75\x16\x6e\xd4\x86\x9c\x75\x68\x16\xbd\x88\x6b\x6f\xa7\xb7\x97\xe6\xd8\x4f\x97\xa5\xf9\xd4\xc6\x4c\xdf\x57\xef\xef\x5e\xf7\xf9\x31\xe4\xc7\xa9\xc8\x25\xaf\x95\x25\x6c\xd2\xa7\x7d\xb5\xaa\x92\x79\x46\x01\x70\xea\xef\x49\x30\x3c\xec\x2e\xef\xb0\x9c\xb7\x9b\xb4\xcd\xec\xad\x67\x9c\x41\xe8\x2b\x91\xc3\x79\xbb\x11\x22\xee\xe7\x97\x91\x8a\x39\xd6\x99\xa4\x23\x35\xef\xf5\x30\xc3\x4f\x3a\xf7\x57\x10\x8c\xd5\x97\x52\x98\x3f\x7d\x89\xd1\x48\xe3\x80\x2b\x4a\xfd\xef\xc1\xdd\xd2\x61\x06\x45\xde\x86\x44\x3c\xab\x7e\x26\xab\x6a\xe2\x08\x40\x0f\x70\xdc\x02\x5a\xc5\x3a\x32\x0c\x64\xdc\xaf\x04\x40\x75\xfa\xd0\x9c\x02\xe0\x71\x77\xda\x6e\x8e\x11\x31\xdb\xd1\xa2\x2e\x4c\xdc\xef\x6d\x6c\x78\xcc\x34\x18\x78\x34\x9b\x4c\x08\x2b\xad\x95\xb1\xe1\xdc\x68\xa8\x09\x72\x95\x35\x9c\x2f\xbc\xdd\xd6\x0d\xb0\x22\x0e\x77\x92\xb1\x63\xdc\x9b\xc0\xdb\xc4\xcd\x22\x37\xcd\xa6\x48\xcc\xa5\xbf\xce\x48\x42\x22\x5e\xf6\xd2\x05\x4d\xf2\xe4\xba\xff\x29\xa1\x49\x92\x18\x4f\xea\x50\x2e\x80\xf9\x4f\x9f\x6f\x3f\xdc\x7e\xfa\x7c\x5e\x50\x57\xaa\x33\xeb\x7d\x8d\xc1\x21\x84\x6e\xcf\x1e\xb3\xdd\x71\x24\xdb\x9e\x73\x4a\xd5\x28\x85\x72\x32\xba\x87\x6d\xee\x77\x87\x83\xd3\x55\x6c\xa2\xa8\x30\x0e\x94\xc4\xbd\x07\x3a\xfa\xcd\x10\x12\x7a\x7c\x1f\xe1\xa6\x40\xc2\x36\x46\x12\xcf\x5c\xc0\x0e\x2b\xca\x31\xd2\x9e\x33\x26\x74\x13\xab\xd1\xc4\x3d\x42\xce\x8a\x50\x94\xb9\x9e\xda\xa2\xcc\x1b\xb7\x9b\xec\x54\x4b\x99\xcb\xe8\x0e\x0b\xd6\x86\xdc\xf8\xa4\x1f\x78\x7b\x46\x57\x7c\x7e\x42\xb4\x3d\xd3\x96\x16\x87\x9f\x2b\x7f\xbe\x5f\xf0\x81\x76\x6d\x90\xa1\x79\x05\x4f\x22\x09\xcd\xef\x1e\x82\xcf\xdb\x89\x4f\xac\xf1\xd2\xd7\xa0\x51\x61\x54\x63\xdc\x2f\x74\x2c\x09\x20\xa8\xcf\x74\xac\x7d\xa4\x0a\x78\x80\x26\xb5\xa9\x98\x34\x86\x17\x56\xc4\x41\xd8\x7c\x8c\x42\x35\xe9\x93\x9e\x37\x41\x85\x38\x72\x6e\x1a\x56\x9b\x71\xde\x2f\xf7\xd6\xc9\x26\xcb\xb2\x7c\x9d\x74\xd3\xd7\xdb\x0c\x66\xef\xb2\x0c\x5c\x8f\x5a\x6e\xbf\xd8\x96\xe7\x12\x28\x8d\xf2\xde\xdc\xe0\x82\x4b\x2e\x2a\xc9\xab\xaa\x88\x28\x6f\x60\xa3\xbc\x74\x5a\xd7\xb2\x67\x9e\xb2\x90\x17\x0a\xc6\x3d\x24\xeb\x6d\xec\x42\x65\x4b\x54\x47\x15\xbb\x51\x32\xcb\xb5\x66\x8e\xf3\x6e\x9c\xd0\xc6\x9d\x2a\xdf\x18\xb9\xe4\x40\xc9\x67\x6a\x7d\xc8\xfe\x38\xfb\x2e\xad\x1b\x98\xfd\x78\xf6\x25\xc9\x7e\xc1\x57\xea\x17\xcd\xa7\x16\x8b\xf8\x4f\xbf\x01\x9b\x8f\x77\x7f\xb2\xba\xfb\x78\x33\x67\x00\x0e\x7a\x7e\x6d\x24\x15\x9b\x6b\xaf\xa9\x35\xe4\x5c\x68\x64\x39\x89\x02\x7a\xd3\xe5\x55\x54\x20\xac\x0f\x0f\x48\xc9\xd2\x97\x32\x6f\xf2\x62\x2b\xe3\x4e\x4a\x10\xa6\xe3\x49\x6e\x9a\xf4\x53\xdc\x4f\x4e\xca\xd2\x95\x12\xd6\x5a\x5b\x80\x00\xda\x4b\x69\x10\x91\xd9\x45\x2f\xaf\xde\xd0\x34\x3d\x47\x49\x39\x39\x65\xb6\x97\xc1\xd0\x13\xfc\x7e\x11\xa2\x7e\xb5\x79\x0f\xc1\xbb\xf7\x77\xaf\x7e\x05\x16\x6f\x98\x27\x3c\xe4\xa5\x2b\x93\x1e\x87\x57\x88\xc5\x7d\x0c\x65\xb5\xea\x22\xea\x01\xe5\x7d\x73\x22\xa1\xd7\x40\x6c\x63\x95\x9b\xaa\x1c\xe3\x11\xe7\x0e\xf4\x94\x46\x83\x29\x99\xf7\x03\xbe\xa2\x9a\xe0\x87\xca\xbf\x2a\xa5\x64\xaa\x3a\xed\x7c\xd2\x99\xa2\x06\x57\x08\x3a\x45\x02\x11\x87\x81\x53\x23\x9d\x83\xb0\x2c\x6c\x34\x08\x63\x34\xf0\x88\xe2\xb6\x64\x80\xc4\x2c\xb7\x11\x72\x51\x4a\xb3\xf0\x48\xf3\x2c\x61\x8b\x58\x8a\x08\xf0\xc9\x1d\xeb\x2b\x66\xc1\xe6\xdd\xfb\x9b\xcd\x0b\x35\x9e\x2f\x3b\x4c\x6f\x9e\x79\x12\x6f\xd7\xad\x2e\x4b\x00\x81\x13\xce\x4e\xa5\x37\x7c\x2e\x2f\x1b\xb7\xcd\x9b\xc0\xb5\xd1\x95\xb6\x24\x72\x29\x31\x41\x12\x93\x38\xb8\xa4\xae\x3f\x1f\x39\x73\x6e\xc3\x64\x59\x75\xc6\x63\xca\xb1\x24\xb6\x63\x42\x76\xe3\x24\xce\x72\x3c\x7a\xe2\x49\x47\x82\xb1\xb8\x5f\xa9\x51\xc5\x56\x01\x32\x6d\xd3\x1c\x49\x66\xdb\x1b\xb3\xc1\x4f\x11\x23\xfb\xc7\x69\x80\xa5\x6a\x11\xec\x3c\x06\x3d\x84\x96\xe1\xdc\x4d\xea\xa9\x0f\xb6\xbb\xb7\x35\x61\x06\x64\x79\x3d\x1d\xd3\x7c\xab\x98\x8e\x9b\x0a\x4b\x8c\x38\x17\xce\x5b\xe3\x8c\xaf\x72\xc1\x98\x38\x1a\xef\x8f\x4b\x13\x3c\x7b\xe2\xe4\x84\x0d\xbe\x8a\xb7\x57\xc8\xc3\x67\xb5\x86\xbb\xd7\x9b\x17\xe4\xf7\xaf\x9d\x2f\xe6\xdf\xab\x5f\x0d\xd3\x0e\x0c\x3f\x1f\xc1\x30\xed\xd6\x65\x6c\x22\x49\x57\x6d\x00\xc2\x03\x7c\x7f\xd8\xb0\xa9\x59\xb1\x53\x57\x9f\xea\x95\x9c\xda\x7a\x5d\x3c\x1c\xe7\x63\x83\x8d\x88\x1d\x60\xf3\xc3\xb3\x5f\x76\xfb\xdd\x74\x10\xa6\x69\x8c\x00\x44\xc6\xfd\x82\xad\x5b\x34\xb8\x9e\x7d\x91\x9f\xab\x80\x8b\x3e\xd3\x0b\xdf\xcb\x2f\xfe\xc2\x17\xa1\x77\xff\x94\x09\xe4\xcf\x6f\x4f\x74\xd3\x4f\x7a\xc5\x4f\x6d\x7d\xea\x56\x6c\xd2\xc9\x09\x30\x0f\x79\xf6\xa0\x2e\xef\x36\x65\x74\xc6\x99\xf9\x25\xb6\x53\x2d\xdc\x30\x38\x01\xb4\x52\x2a\xb6\x5a\xa7\xb9\x02\x70\x8f\xf5\x2b\x9a\xf3\x73\x8f\xe1\xcf\x9f\x30\xe2\x2f\x50\x7d\x17\x44\xdc\xab\x9b\x04\x89\x5b\x67\x86\x6b\xae\x73\x24\x50\x40\xfc\x34\x3a\xc2\x3d\x07\x45\xc0\xd2\xa2\x22\x94\x04\xed\x06\x99\x73\x29\x8d\x51\x65\x3b\x90\x5d\x53\xe2\x6d\xc3\xea\x2e\x36\x10\xd2\x80\xb7\x04\x51\xb1\x70\x70\xd8\x8d\xdf\x94\x5f\x7a\x53\xac\x37\xaf\x9f\x94\xe9\x53\x3c\x78\x7d\x16\xa7\x7b\x9a\x0d\x24\x8e\xeb\x73\xf8\x7b\x31\x6f\x7d\x55\xcf\x55\x4e\x00\x15\xa9\x1a\x88\x81\x9c\x34\x28\x40\x23\x22\x8e\xe3\x1c\x16\x88\x02\x06\x90\xc9\x02\x51\x41\x43\x31\xa8\x26\x85\xf3\x5d\x3e\x86\x87\x31\x84\x74\x8d\x05\xe8\x1f\xc6\xcb\xbb\x48\x37\xa5\xad\xca\x96\x73\x4c\xb1\xd3\xa4\xd6\xdd\x7e\xdf\x69\x4f\xac\x83\x90\x53\xde\x94\x7e\x42\x13\xa5\x34\xef\xe3\x71\x2e\x60\xbd\x99\x57\x6b\x7e\xd6\xac\x39\x66\x7f\xb1\x68\x22\x7d\x7c\x26\xad\xfe\x05\x78\xff\xe9\x87\x4f\xbf\x07\x6f\x6f\x5f\x20\x4f\x2f\xa2\xaf\x3f\x7d\xf1\xbb\x0b\xbd\xec\xea\x57\x7f\xfc\x7c\x7b\xfe\xd5\x06\xf0\x45\x8a\x8d\x71\xce\xa1\xac\x8a\x45\x69\xce\xd7\x5e\xee\xdb\x7a\xce\x70\xda\x95\x9a\x97\xb3\x89\x0e\x50\xc6\x39\x54\x65\xdb\x8f\xa2\x0b\xde\x0f\x12\xc0\xd0\x7a\x40\x63\xb3\x36\xd6\x3a\x17\x83\x10\xae\x28\x20\xea\x63\x50\xca\x49\x1e\x0d\x18\x46\x6d\x1a\x80\x77\xd1\xe6\xc5\xc2\xf8\x8c\xb5\x10\x8e\x75\x71\xd8\x05\xe7\x9a\xa8\x40\xd3\x5b\xd3\x1e\x41\x39\xff\x8a\xcd\xfe\x20\x3d\xa3\x72\x83\xb2\x77\xa9\xde\x7d\x56\x16\xf8\xef\xcb\x1e\x38\x57\x06\xab\x0f\xaf\x7f\x7d\xf3\xe1\xb9\x65\x9d\x5a\xba\x3f\xfe\x06\x7c\x78\xf7\xfe\xf3\xcd\x7b\x08\xee\xde\x7f\xfa\xbc\xde\xfc\xf0\xe6\x4c\xdf\xbe\xfb\x9c\x24\x40\x5f\xdf\x6c\x5e\x34\xb4\x5f\xdf\xfc\xf5\xef\x96\xe6\xfb\xab\x9e\x4b\x31\xe7\xf5\x6c\xa0\x5b\xb3\xa5\x02\x5a\xa2\xe9\x43\x09\x8f\x1a\x14\x7b\x22\xf0\x80\xf3\x43\xec\x57\x90\x2b\x1e\xf9\xb4\xe7\x04\x50\x5c\xf9\x0a\x45\xb9\xb2\xf8\xc4\x57\x07\x54\x3d\x6c\x8b\x75\xc9\x2a\x57\xd1\x46\x42\x0f\x85\xc2\x1e\xed\x3c\x97\xde\x6c\x90\x2f\x4a\xec\x45\x3c\xea\xca\x44\x57\x57\xb6\x54\xcd\xbe\x35\x0d\xb0\xc0\x48\x0e\x0b\x1f\x1b\x2e\x14\xaa\xb8\x68\x99\xc0\x92\x45\xe6\xa2\x21\x9c\x93\x86\x71\x24\x58\xa5\x14\x32\xb2\x32\xa1\x6c\x54\x89\x1b\xcd\x6d\xd2\xb9\x50\x60\xbc\x11\x9b\x2a\xfb\xcd\xd2\x21\x7e\xd1\xc2\x5f\x9a\x95\x6f\x2f\x1e\xc3\xaf\x2f\x54\xa5\xeb\x0a\x69\xf3\x1e\xae\x3b\x0f\x73\xac\x3c\x53\xd0\x53\x02\xbd\x7e\xcc\xc4\x4e\x76\x5c\xaa\xe6\x31\x63\x36\x80\xf2\x31\x0b\x5a\x48\x59\xfb\x8e\x1f\x74\xdc\x02\xf5\x98\x61\xc0\x37\x15\x14\xb1\xea\x2a\x5b\x1a\x50\xc5\xb6\x35\xfe\x68\x85\xf2\x3b\x03\x2b\x6b\x19\x33\x82\xc6\x23\x28\x1b\x65\x8c\xb3\xba\x74\x4b\xfd\x10\xce\x58\x9e\xcd\x79\xcf\xfd\x7d\xf6\x77\xd7\x7e\x9e\xaf\xce\x62\xb7\x3f\x7c\xf8\x4a\xed\xf6\xee\x4b\xaf\xc7\xdb\x33\x9c\x07\x9c\x1d\x1e\x35\x0b\x54\xe7\xe5\x6a\x98\x6c\x85\x56\xd8\x34\xa1\x32\x84\x57\x30\xba\xb2\x0a\x56\x18\xcf\xb4\xea\xc9\x63\x26\x8d\x3e\xd8\x2e\x24\x0c\x58\x98\xd4\x69\x00\x4e\x4b\x11\xcc\x21\xf7\x3e\x77\xa7\x71\x3d\x1a\x2f\xbc\x21\xd3\x16\xa3\x69\xb7\x0b\x05\x53\x80\x22\x48\xb9\xe4\x54\x10\xa1\xb5\xe0\xc6\x78\xc0\x65\xdc\x71\x39\x41\x27\xbd\x95\xf9\x36\xb6\xad\x4b\xb8\x9b\x45\xb7\xf5\x9f\xa7\xf3\xfb\xfb\x97\x6a\x83\xef\xde\x5f\x50\x8e\xaf\x6e\x12\x68\xe9\x45\x45\xfe\xf1\xc3\xb9\xb6\x7b\x7b\x7b\x36\x2c\x5f\xb6\xca\x3b\xf8\xee\xe3\x32\xd5\xfa\x5b\xf0\xf9\xed\x1a\x92\x2a\x3f\x86\x7b\xe9\x57\xb0\x42\x17\xb1\x7e\x03\x9b\x41\xef\xea\x8a\x5b\xde\x7b\xa5\xb4\xd1\x12\xc7\x32\x9c\x5c\x2e\xa6\x26\xac\x50\xa3\x00\x06\x59\x39\xc2\xaa\x72\x90\xe1\x69\x88\xd2\x85\xc2\xb4\x3a\xe8\x62\xd8\x40\x26\xe2\xb6\xae\x01\x26\x24\xf6\xc2\xc9\x9d\x37\xda\xcb\x02\x42\x8f\x28\x26\x1c\x53\x26\x1c\x28\x9d\x73\x11\xa1\xaa\x28\x0a\x14\x58\x47\x20\x15\x79\x16\x77\x71\xd4\x96\x1d\x0f\x0b\x0f\x85\xdc\xf8\x75\x97\xfd\x51\xf6\x2e\xd5\xf2\x8b\xda\x40\x76\x2d\x88\xf5\xe3\x4f\x67\xd0\xdf\xaf\xc0\x75\xee\xfb\xea\x32\xc1\xbc\xfb\xf5\x66\xbe\x97\x6f\x36\xef\x7f\xfa\x6e\x3e\xf9\xd5\x15\x69\x3b\x37\xae\xaa\xb6\xad\x6e\xb7\x7d\xaf\x01\x5d\x59\x0f\x11\x38\x7a\xc8\x64\xd8\xeb\xbe\xae\x8f\xf2\x18\xb4\x80\x95\x1e\x21\xd7\x1a\xc5\xf1\x94\xac\x8f\x73\x5f\x9e\xba\x2a\x87\x92\x78\xca\x8f\x74\x7e\x36\x75\x12\x6b\x5d\x77\xbc\xac\x94\xd5\x4e\x05\x25\xbb\x1a\x0b\xe1\xe3\xc1\xb5\xc1\x3a\xdb\xb4\xc6\xea\x36\xf4\x10\x09\x50\xd6\x5b\xdf\x83\xb2\x28\xdc\x74\xf4\xc2\x13\x90\x1d\xf0\xb1\x03\xdb\xb6\x45\x7d\x93\x5e\x16\xdd\x0f\x92\x66\x35\xdf\x65\x3f\x65\xff\x43\xf6\x9f\xd3\x4e\xb5\xe8\x9d\x3f\x0b\xf1\xa7\x93\xfd\xed\x93\xca\xfe\xef\xc1\x59\x65\xff\x23\xf8\x96\x87\xef\x4f\x77\xaf\xf3\x6f\x48\xef\x5f\x47\x54\x80\x1a\xef\xb5\x94\xda\x6a\x6d\xfc\x6e\xe0\x7d\x1d\x8f\xaf\x32\x62\x1b\xce\x1f\xb3\x42\x59\x69\xf8\xc3\x0e\x28\x0f\x44\x6c\x98\x49\xee\xbd\x38\x86\x55\x9b\x1f\xa5\x93\x7b\xde\xb5\xcd\x9e\x6d\x7d\x60\x6c\xc7\x8c\xa1\xa7\x4e\x52\x47\x45\x64\x4e\x6a\xad\xd7\x3d\x65\x52\x2b\xc5\x29\x33\x82\x3b\x66\xb8\xd0\x6a\xae\x7d\x38\x1f\x87\x86\x2a\x5a\x1f\x26\xdf\xf7\x2e\x72\x25\xd2\x70\x28\x34\xea\x31\xf3\x8c\x7b\x6a\x3d\x75\x44\xd5\xfb\x4e\x99\xc6\xfa\x96\x76\x9e\xb0\x9d\x51\xee\xec\x5d\xb0\xe8\xa6\x2e\x1c\x8a\xbf\xbd\x64\x5d\xcb\xd7\xcd\x19\x91\x96\x02\xd6\xe7\xb3\xcd\xda\xd2\xa2\xfd\x7a\x02\x79\x16\x61\x78\xe5\x4f\x87\x24\xe9\xa5\xee\x87\x72\xdd\x3d\xe0\x72\xc3\x60\xd8\xed\xaa\x30\x40\x56\xde\xb7\x2c\xf6\x00\xd7\x80\x4f\xe5\xba\x57\xd4\x12\xb5\x4b\xf9\xc6\xd4\x3b\x6e\x9c\x05\x3d\x47\x01\xb1\xf5\xc1\x0a\xcb\xad\xb4\x32\x9a\xde\x43\xba\x07\x9d\xdd\x6e\x01\x3a\xb9\x24\xd0\x8b\x95\xc1\x46\x43\x3c\x78\xe1\x82\x76\xc4\xeb\x27\x1d\xa0\x31\xfb\xf5\x13\x27\x87\x3e\x4d\x56\x5f\x8a\x46\x6c\xae\xcd\xaf\xaf\x52\xb4\x6f\xa9\xb3\xdf\x20\x7e\x8c\x6d\x2e\xba\x10\x8f\x05\x53\x86\x73\xe0\xef\x25\x30\x75\xd2\x14\x61\xb1\x03\x32\xd6\x75\xea\xca\x75\x80\x45\xd7\x77\x1d\x10\xdd\x74\x48\xdf\xd6\xa3\x15\x68\xef\x4e\xc3\x8a\xc4\x10\x07\x9b\x7c\x2c\x6b\x20\x51\x21\x84\xd3\x93\xd1\x73\xee\xa6\x73\xa7\xe3\xa2\xaa\xe9\x9c\x5b\x72\xe2\xf0\xc8\x6e\xd4\x86\x66\xff\xfc\x6a\x72\xb7\x4c\x1d\x9f\x37\xaf\x0b\xd0\xfa\x9c\x21\x7f\x99\x5f\x82\x2b\xb5\xd7\x1b\xb5\xec\x50\x65\x55\xa3\x72\x2a\x36\xd5\xd4\xe7\xfc\xbe\xcf\xf9\x34\x38\xd0\x46\x9e\x73\xd0\x9e\xb2\xa7\x77\x3b\x73\x8c\x8d\x4a\x86\x18\x64\xd1\x7b\xdd\xad\xdb\xb8\x0f\x01\xc0\x24\x89\x31\x3a\x39\xb9\xdc\xc8\x58\xcf\x79\xf2\x9c\x1b\xc5\x83\x94\xcc\x23\x86\x68\xe0\xf8\x89\xbf\x97\xa5\x2c\xf9\x36\x7b\x73\xe6\xe6\x5c\x11\x9f\xae\x85\xd5\x6e\x9e\xf2\xc2\xb4\x19\xa5\xcf\x9e\xba\x69\x9f\xaf\xbb\x3f\xf3\xd6\x7b\xa1\x92\x7d\xfa\x7c\x07\xde\xdf\xbd\xba\xb9\xe2\xf6\xad\x2b\xcd\xa4\x10\x13\x63\x44\x50\x2a\x40\x8b\x2a\x5f\xc1\x1c\x4e\x4d\x09\xf3\x6e\xaf\x5a\x65\x64\x29\x15\x61\x15\xc7\xbc\x88\x0e\x75\x47\x56\x78\x28\x63\x13\x47\xa1\x2c\x0f\x6a\x04\x12\x55\xd1\xaf\x94\x8a\x0e\x93\x4d\x76\xcf\x30\xde\x74\xf7\xe3\x3a\x40\xce\x91\xc4\x18\x62\x4d\x91\x91\xba\x92\x42\x63\xa4\x19\x33\x94\x35\xaa\x34\x25\xed\x60\x89\x04\xb6\x94\x70\x00\x39\xd5\x7c\xfe\xf7\xb8\x55\x04\x67\x67\xec\xb1\xdb\x88\x2f\x74\xb3\xb3\x27\xa6\xee\xfc\xf5\xdc\x8d\x98\x2f\xd0\xa7\x0b\x33\x7b\xf5\x0d\xae\x40\x02\xb1\xa9\xa6\x82\xf9\xf6\x01\x6f\xda\x7b\xbe\x71\x85\xb2\xd4\x55\x81\x10\x58\xde\x5b\xb0\x47\xd1\xad\xf1\xc3\x76\x8d\x83\xa0\x8e\x88\x13\xf7\x5a\x1b\xbb\x82\x92\x7a\x22\xb6\xbc\x0a\x15\xdb\x08\x48\xf0\xb4\x17\x46\x44\xdd\x96\xae\xa4\x20\x5b\xf5\xb4\x53\x6a\x2b\xe5\x24\x85\xa2\x5a\x20\x3e\x18\xed\xbc\xb6\xd4\xe9\xd2\xfa\xa4\x7d\x01\x30\x50\xaf\x76\x1b\x96\xfd\x41\xf6\xaf\x9e\x71\xac\x77\x9f\x16\x6d\xfc\xd7\x5f\x29\x2b\x9e\x33\x85\xbb\x95\xa9\x21\x5a\x15\xf7\x02\x8c\x34\xea\xb5\x9d\x3a\x06\x02\xe1\x83\xd4\xa6\xd9\x93\x60\x28\xe5\x5a\x31\x1c\x03\x17\x32\xa8\x68\x37\x0c\x12\x7c\x6a\x56\x82\x9d\xc6\x9c\x09\x2d\xa9\x54\x14\x73\xe4\x4a\x54\x56\x0a\x22\x44\x19\x11\xda\x3e\x63\xcb\xd4\x86\x27\x6f\xf2\x65\x27\xfb\x8f\x5f\xc6\xfa\x37\xcb\xb5\xfb\x70\xfb\xe3\x4f\x6f\xd6\x9b\x67\x24\xf7\x79\x1c\x78\x8d\x0f\x04\x1f\x6e\xcf\x30\x85\xdb\x0f\xaf\xef\xd6\x19\xa3\xf9\x7e\x79\x80\x20\xc2\x73\xea\xa5\xc7\x00\x1c\x28\x4d\x1c\xa2\xa4\x02\x48\x55\x05\x58\x47\xb6\xd3\x55\xbf\xa7\xa0\xd8\x76\x73\xbd\x1b\x36\xdc\x0a\xcf\xec\xd4\x04\x30\x86\x70\x7f\xac\xc1\xb8\xe1\x4c\xc6\x76\x18\x00\x47\xe8\x48\xb9\x91\x04\xc6\xc1\xec\xe4\xd1\x94\xcc\xa0\x56\x21\x8c\x91\xc5\x18\x30\xde\x48\xad\x89\xf5\x22\xd8\x48\xe3\x38\x46\xc2\x80\x1d\xb3\x85\xab\x31\xd7\xcb\x59\xf6\x2f\xb2\x7f\x9d\xfd\x5d\x9a\x98\xbf\xb9\xb9\x7b\xbd\x70\x9c\xcf\x01\xea\x39\xbe\x2f\x82\x67\x6f\x17\x77\xaf\xef\xcf\xd4\xdf\x2f\xad\x46\x7f\x0f\xce\xac\xaf\xf5\xce\x41\x30\x0e\x13\xa5\xb9\x6e\xa3\xe2\x54\x72\x09\x11\x67\x92\x4b\x04\x39\xc8\x4e\x5b\xbf\xf7\xde\x57\x07\x39\x14\x73\xbd\xea\x73\xbe\xca\xc2\x76\x4b\x75\xd2\x0e\xc6\x53\x06\x32\x2b\xb5\x74\x9b\x8c\x41\x17\xb9\x0b\x02\x30\x4a\x95\x64\x55\x49\xa9\x12\xb4\xac\xac\x56\xb1\x03\xe6\xde\xe7\x38\x6a\x6b\x24\x20\xae\x7b\xcc\xb6\x5b\x17\x47\x2d\x50\xc0\xe2\x08\xb5\xd6\xd6\x64\xe7\x9e\x12\x4f\xb5\xe4\x5f\x66\xff\xe6\xac\x3a\xf3\xcc\xf4\x7f\x02\x94\xa5\x3f\xfd\x6e\xd1\x6b\xb8\xbe\x00\x37\x09\xd6\xff\xe9\x33\xf8\x32\x96\x6f\x5e\x0e\xa6\xaa\x0a\x04\x6e\x73\xd9\x3b\x5b\x56\xb9\xe4\x4d\xd8\x6a\x6f\x4f\xa4\x3d\xd2\x9c\x84\x38\x32\xc2\xb9\xa8\xa0\xa4\x82\x09\x21\x41\xb6\xea\xa8\x72\xf8\x7e\xbb\x69\x27\xcb\x5d\xd2\x7b\x24\x93\x5e\x43\x50\x1c\xc5\x31\x1e\x27\x67\x76\x71\x27\x41\xb1\x29\x21\x82\xb6\xb7\xed\x51\x22\x64\x83\xd5\xd2\x32\x61\x84\x1d\x80\x20\x44\x09\x5a\x55\x8c\x0b\xc1\x89\x0e\x50\x28\xcd\x27\xef\xe3\x7e\x19\x4e\x81\x02\xf3\xd6\x75\x52\xc9\x46\x5b\x91\xad\x57\xe2\x51\x24\x4d\xcb\x1f\xce\xcc\xb6\xab\xfe\xf2\x59\xd9\xeb\xaa\xbf\x0c\x92\x7a\xea\x19\x80\xe7\x03\xce\x91\x6c\xea\x3d\x3f\x6c\xbb\xc7\x8c\xee\x6b\x49\x84\x92\x7d\x4f\x4d\xe0\x11\x83\x6c\x64\x87\x23\x06\x01\x68\x16\x4d\xb4\xeb\x11\x1a\xdb\x19\x4e\x3c\xb5\x92\x3b\xca\x85\xd5\x5c\xd7\x85\x95\xca\x4c\x47\xc2\x6b\x45\x03\xd3\xb5\x63\xd9\x79\x1e\x8a\x93\xde\xc6\x73\xa5\xff\x77\xd9\xff\xf4\x25\xf2\xe7\xe2\xe7\x79\xf7\xea\xe6\x82\x09\xfc\x2d\x48\xf5\xce\x93\xff\xe7\xbf\xfd\x72\x30\xf1\xf4\xfd\xd3\xe7\xbb\x1b\xc0\x72\x55\xe7\xba\x69\x26\x9f\xb7\x27\x5f\x55\x6b\x18\x2d\x37\xb9\x56\xd1\xc6\x3e\x6e\x27\x4f\x41\x0d\x60\x84\x82\x45\x95\x57\x24\xe2\xbc\x99\x42\xd3\x04\xb0\x8d\x38\xd7\x60\xf7\xd0\x3d\xbd\xb3\x17\xf4\x75\x2c\xbc\x9c\x1a\xb6\x29\x29\x1d\xcc\x40\xe2\x80\xa0\x55\xcc\x6a\x41\x35\x74\x05\x61\x94\x59\x06\x08\x19\x0c\x63\x2c\x1e\x38\xe7\x91\x32\xc6\xa6\x91\x08\xb6\xe0\xe4\x9a\x47\x7a\x53\xaf\xdb\x73\x3f\xfc\xa2\xe9\xb5\x28\x0f\xde\xbd\xbe\xfb\x6e\x73\x93\xaf\x6e\xdf\xde\xe6\x69\x5d\xbe\xb4\xdd\x7b\x29\x2c\x3f\x1f\x2b\x0a\x76\x01\x8c\xd1\x59\x90\xe9\x83\x0f\xdd\xd6\x80\xa2\x8b\x6a\xe5\x9c\x54\x46\x4f\xca\x72\xc7\xac\xae\xe3\xde\xfb\x27\x7d\x01\x18\xf7\x79\x0f\x0e\xb1\xf4\x71\x3c\x3a\x50\x02\x32\xc9\x5c\xc6\x6e\xd0\x47\x40\x72\xc9\xb7\x56\xf9\xda\xd7\xbc\xf6\xd5\x83\xe1\x6a\x5d\xc7\xbe\x8b\x65\x1b\xab\x36\xcb\x56\x8b\x36\xde\xba\xcf\xfe\x32\xfb\x0f\xd9\xff\x92\xba\x19\x4f\x68\x82\x27\x80\xf5\xeb\x17\x74\x84\xab\x3d\xe4\x5b\x64\xa1\xf3\xfa\xfb\xfe\xee\x55\x0d\x64\x74\x73\x8e\xe4\xa2\x99\x93\x5d\x60\xa6\xa1\xc8\x61\x69\x2c\x93\x48\x31\x4a\x8a\xa8\x68\x2f\xb7\x70\x0f\x42\xac\xd7\xdc\x97\x30\xc7\x0e\x06\xb7\xd5\x6d\xf0\x7b\xb5\x0b\x56\x62\x5d\x4b\x61\x4d\x15\xbb\x72\x25\x94\xd7\xda\x2b\xa7\x3d\xc1\xb1\xed\x0a\x5f\x88\x10\x47\x67\x3d\xb0\x5e\x83\x11\x0a\xe9\xa3\x3b\x78\xe3\x4d\xdd\x69\xa7\xdb\x66\x47\xd5\x56\x1c\x9a\x2d\x28\x97\xb9\x9e\x48\x78\xeb\xed\x3f\xc1\x77\x79\x91\xb3\xba\x5d\x7d\xe5\xbb\xfc\x72\x27\xb9\x0a\xce\xeb\x0e\x34\x21\x04\xa1\xa5\xac\xa4\x44\x30\x8a\x53\xe7\x9d\x5b\x05\x37\xd9\xdc\x4e\xbb\x94\x14\x07\x01\x03\xe4\xa7\x7e\x55\xc4\x81\x1a\x8a\x2b\xca\x50\xec\x73\x2f\x88\xc5\x22\x62\x4b\xb9\x95\xab\xdd\xf1\xe8\x4f\x5b\x33\xe7\xc5\x90\xae\x0a\x34\x46\x19\xb7\x1c\x50\x60\x72\x12\x0d\x28\xdc\xde\xe9\x7e\xc0\xbb\x7e\x70\x71\x48\x46\x86\x14\x40\xe2\x1a\xd2\x38\x84\x3a\xcb\x7c\x5a\x9f\x2c\xe9\xcd\xb1\x73\x97\xf2\x39\xe7\x78\x76\x3c\x5f\xf4\xba\xae\xd0\x0a\x73\x20\x4f\x9d\xd6\x5f\x50\x96\x5b\x67\x82\xe4\xbb\x7b\x34\xd8\x2e\xdf\x21\x1c\x05\x40\x1e\x74\xc9\x6e\x64\x42\x71\xb7\xd2\x91\xad\x4a\x2b\x3c\xb7\x27\xea\x94\x33\x1e\xec\x38\xae\x11\xcf\x0b\x89\x6b\x2c\x36\x8c\x6b\x1f\x45\x34\xb1\x96\x00\x02\x95\x13\x82\x23\x6c\xdb\xb6\x4d\xc9\x73\xdf\xf7\x7d\xd3\x8b\xbe\x65\x62\xef\x9c\x77\x75\x4f\x86\x1a\x87\x96\xf4\x7e\xf1\x0e\x60\x37\x7e\xa3\xae\x74\x54\xaf\x7d\xc0\xde\x2f\x86\x5f\x2f\x24\x54\xaf\x5c\xc1\x92\x4e\x01\x38\x53\x02\xde\x5c\x3f\x78\x2a\x24\xf0\x88\xc4\xd4\xd2\xd3\x3e\xb7\xe5\xa4\x45\x0b\x84\x2c\xeb\x32\xcc\xa1\xd7\xc6\x7d\x09\x70\x6c\x3a\x2f\x59\x2e\x57\x08\x64\x3f\x1f\x76\xf5\xaa\x38\x1d\x2f\xc7\x46\x61\x43\x8c\x94\x4c\x0b\x6c\x48\x09\x2b\x94\x6c\x61\x29\xa9\x4c\xa5\x62\x19\x75\xec\x45\x0f\xe0\x2e\xc7\x53\x33\x75\xc6\x24\x72\xde\x5e\xc4\xc3\xa2\x23\xee\x93\xc7\x62\x96\xf4\x29\xff\xb7\x73\x57\xf1\x49\x1f\xff\xc2\x87\x4a\x19\xf0\xbc\xf2\xde\xfd\xfe\xac\x52\xb4\xd8\x04\xce\x37\x2b\x6d\x27\xdf\xd6\xfc\x4d\xfb\x8c\x07\xd0\x35\x1e\x64\xbe\x49\x93\x50\x29\x71\xa1\x45\x1b\x54\x33\xed\x5b\x14\x8f\xbc\xc3\xf1\xb8\xda\x3f\x66\xab\x31\x4c\x3a\x17\x52\x2d\x6e\xd9\x91\xf8\xa8\x43\x8e\xa6\xe0\xd7\xb2\xae\x43\x08\xa1\xae\x9d\xa2\x50\x55\x4e\x52\xee\xe3\x11\x14\x5b\x69\x99\x72\xce\xed\xe2\xae\x71\xf1\x20\x64\xe9\x4b\xa6\x13\x79\x60\x00\x9d\x6b\x01\xbe\x60\x7e\xe8\x8d\xda\xc0\x2f\xe6\xea\xbf\xcb\xfe\xfa\x19\x39\xf1\x7a\xe9\x22\x7d\xe1\x71\x30\xe7\x93\x3f\x7c\x58\xa2\x06\xfc\xe9\xdd\xfb\xcf\xff\x2a\xd5\xf0\x40\x3c\xc9\x49\xcf\x47\xdc\xbe\x32\x3f\xbb\xa5\xf7\x72\x00\xd2\x03\x7d\x2f\x36\x3e\xec\x8f\x76\x87\x62\x15\x43\xf4\x11\x11\xa0\x40\xe5\xe5\xbc\x1b\x85\x7a\x37\xd6\x1b\x18\xff\x3f\xce\xde\x1e\x48\x72\x5c\xbf\x13\x24\x48\x66\x27\xa5\x55\x48\xac\xe9\xa9\x69\xbe\x93\x9e\x1e\x4a\xd5\x33\xc5\xb7\x27\xad\xb0\xaf\xb7\xba\xa1\x5d\xdd\x0a\x0a\x5d\x6c\x60\xf7\x14\x71\x88\xb8\x8b\x0b\x9c\x07\xe3\x0c\x98\x30\x61\xc2\x84\x09\x13\x26\x4d\x9a\x34\x69\xd2\xa4\x99\x26\xcd\x34\xd3\x4c\x93\xaf\x2b\x89\xba\x48\x64\x66\x55\x56\xbf\x99\xa7\xb8\xeb\x09\x56\xb1\x2b\x6b\xa2\x33\x49\xf0\x8f\xff\xc7\xef\xa3\x04\x88\xcc\x64\x0e\x56\x9f\x04\xe0\x06\xad\x59\x75\x0c\x2e\xbc\x70\x90\x10\xcc\x30\x66\x67\xee\x4d\xb2\x8d\x33\xde\xbf\x8c\x93\xba\x3a\x56\xc9\x71\x6f\x8b\xc9\xef\x95\xbd\xea\xe3\xdd\x97\xdf\x82\xef\xd7\x77\x8f\xab\xf5\xa9\x79\x3d\xaf\x86\xfd\xfe\x40\x44\x2e\xbe\xce\xc6\xcb\xb9\x09\x5b\xd0\xd6\x70\x71\x69\x5b\x2e\x53\x3a\x94\xa9\x5a\x24\x4a\xc7\x83\x8c\x24\xcf\x62\xb2\x5b\x11\x34\x28\x29\x76\xd4\x18\x84\x2c\x47\x35\xdf\x0a\xb1\x0c\xfa\xac\x77\xe3\xcf\xbc\x91\xe3\x75\xfc\x97\x17\x64\xc2\xeb\x35\x7b\xa5\xd9\x1d\x83\xd9\x99\x39\x72\x02\xbe\xdd\xbd\xa8\xc9\x1f\xa3\xdc\xc3\xa7\x1f\x3e\x9c\x5d\x87\x93\xd5\xfc\xb5\x38\xcd\xc9\x07\x80\x1c\xc0\xa0\x5a\x30\x92\x43\x23\x7c\xd7\x98\xb2\xf2\x25\xe7\xe3\xbc\x8f\x36\x9d\x93\x46\x8b\xdf\xb6\xc2\xf9\xb2\xb1\x3e\xdd\x96\x4d\x51\x02\x06\xa1\xa2\x38\x1f\x43\xed\xfa\xe3\x9f\x50\x59\x2f\x85\x96\x5a\x68\x21\xeb\xc1\x6c\x24\xb7\x94\xfb\x8e\x0b\x61\x04\xdd\x0c\xc2\x0f\x80\x69\x82\x6b\xc8\xa2\x6c\xc1\xd9\x6b\xac\x5d\x1d\x57\xcb\x5f\x9d\x75\x53\x4e\xce\x42\x57\x1c\x91\xd5\xcf\x35\x6b\x4e\x21\x60\x75\x7f\xe2\x46\xac\x5e\xe4\x1b\xa2\xba\xc8\x8f\x57\x7b\x2d\xd8\x62\x08\xea\xa5\x04\x55\x85\x56\x14\x6f\xf6\x8c\x85\xa9\x54\x4e\x18\x71\xe0\x51\x29\xf3\x18\x08\xbc\xca\xb8\xf4\x1a\x94\x2c\xcc\xdd\x26\xec\x28\x48\x3a\x0f\x4a\x4b\x83\x24\xa1\xf0\xa1\x73\xb1\x3b\xbf\x4a\xb8\xb2\x96\xd1\x3a\xf4\xdc\x72\x36\x6f\x7a\xa2\x48\x3b\x87\xd6\x4a\x5b\x5b\x39\x19\x42\x1d\x55\x16\x3b\x24\x2c\x96\xc6\x92\x65\x4f\x58\x0a\x43\xbb\xb9\x68\x9e\xb6\x2b\x14\xa7\xbf\x17\xec\xc6\x3f\x46\x06\xd0\x29\x0c\xa7\x57\x96\xd0\xef\x4f\x82\x8a\xb7\x37\x57\x37\xf9\xfd\x1b\xa3\x81\xe8\x11\xf9\xe9\xf6\xe3\x8f\x2f\x50\x8a\xf5\xc3\x5a\x2e\x13\xd8\x7c\x35\xa5\xb3\x3e\x1d\xcb\xaa\x41\x65\x94\x51\xec\xcf\xa2\xb4\xd4\x01\xc2\xe5\x36\x0c\xb8\x19\x78\x65\x6a\x37\xef\x8d\x07\xe5\xd3\xc6\x81\x2e\x30\xe0\xea\xb0\xdf\x47\x89\xef\xc0\x83\x0d\x7b\x06\x30\x30\x29\x26\xb8\x66\x2c\xec\x63\xb7\x62\x7b\x52\x31\xf7\x4a\x13\x06\x2b\xc4\x91\x63\x54\x80\xb6\x23\x4a\xd9\x49\x5b\x8e\xf9\x29\x87\x77\x31\xcf\xe8\xcf\x7d\x8c\xc7\xe3\x9a\xbd\x9a\x9c\xbc\xed\x81\xbf\x35\xc8\x8b\xc8\xdf\xd7\x6e\xf3\x6f\x40\x74\xbb\xf8\x98\x1d\x63\xdf\x77\x3d\xd0\xe7\x11\x48\xd8\x76\xda\x30\xed\xec\xc0\x37\x76\x06\x24\xd8\xb1\xeb\x00\xe9\x80\x77\x08\xec\x69\xed\x70\x1d\x0c\x55\xb2\x19\x1d\x6c\x41\x42\xc3\xec\x78\x98\xe4\xae\xcf\x99\x94\xd6\x06\xe2\x5b\x6a\x75\xa0\xa0\x9f\xac\xb6\x3b\x30\xd8\x40\xfa\xbe\x07\xfb\xba\x33\xc5\xc0\x6a\xa5\x87\x46\xcd\xaa\xea\x6d\x18\x8d\xf7\xa0\xd8\x75\xda\x00\x71\xea\x33\x1e\x63\x37\x4c\x56\xd1\x2b\xe3\xc4\x52\xfb\xd7\x97\x0e\xfa\xab\xfe\xdf\x5b\x51\x53\x70\xa2\xc9\xbe\x48\x2c\x7e\xf9\xe1\xc3\x77\xef\xcf\x29\xc6\xfb\x93\x75\xff\x79\x03\x3e\x66\x5c\x80\x3a\x25\x8c\x4d\xb1\x8b\x00\x5b\x12\xb6\x84\x53\x02\x29\x85\x61\x04\x15\xd8\xa5\xbc\xea\x54\x27\xbd\xf6\x13\x99\xac\x64\x9a\x30\x59\x06\xf6\xb4\x37\xc7\x42\x6a\x32\xdc\xbb\x26\xd3\x9c\xb8\x9a\x05\x69\x09\x33\x7c\x05\xa9\xd2\x9a\xd5\xbd\xdb\xb8\x65\x36\xbc\x6c\x2b\x01\x22\x6e\xa4\x08\x9b\xce\x59\x3b\x8c\xca\xa8\xcd\x08\x0a\xb1\xef\x40\x02\x0a\xc8\xb4\xb5\x3c\xf4\x3c\x8c\x61\x92\xa0\x02\x65\x33\xd0\xa1\x43\x75\x98\x3b\xba\x39\xfb\x2f\x1d\x73\xe1\x13\xbf\x02\x26\x3f\x25\x9f\x23\xc3\xe2\xd4\x32\x3f\x97\x63\xef\xd6\x0f\xc9\xcd\x35\x50\xee\xf4\xf9\x56\xdf\x50\x17\x81\xf3\x12\x1b\xd5\x95\xb0\x33\x4a\x99\x52\x36\x1c\x60\x30\x65\xfb\x43\xe9\xd3\x3e\xea\x4b\xd3\xc3\xe8\x2a\x61\x58\xda\xe6\x45\x20\x69\x12\x92\x26\x52\x62\x79\xde\x05\x23\xb5\xec\xac\xd5\x8d\x6f\x7a\x0b\xb7\xce\x02\x0c\x46\x30\x2d\x3d\x60\x2a\x0c\xd2\xc2\xb0\xdd\xb0\x71\x63\xb5\x0d\x1b\x80\xac\x4e\x2e\xfa\x7a\x7e\x85\x93\x22\xf9\xf3\xe4\xfb\x58\xcb\xbc\x44\x9d\x87\xec\xaa\x91\xb6\x8a\x0b\xf6\x85\xc4\x0c\xde\xad\x4f\x4f\x5b\x9c\xfe\xff\x18\xe7\xbe\x79\x55\x57\x59\xf5\x7b\x94\x15\x68\xa7\xf7\xa1\x13\x00\x65\x0e\x10\x80\x58\x18\xc3\x70\x98\xf2\x2e\x54\xb2\xf1\x4a\x2b\xd5\x4c\x64\xf1\x61\xab\x86\xf8\xb8\xcd\xb4\x35\xf2\xb8\x49\x85\xde\x65\xf6\xa0\x57\x98\xb2\x28\xfe\x22\x14\xb3\x58\x10\x6b\x1d\xd5\x41\x18\xc1\x95\xd0\x98\xd6\x8d\x01\x2d\x63\x5b\x6d\x39\x61\x33\x86\x96\x18\xeb\x8e\xd1\x53\x9f\x79\xa2\xdf\xfa\x1f\xfc\xe7\x3f\x9c\xa8\x83\x6f\xe4\xe4\x7f\xce\xff\xe0\xf8\xd9\x57\xeb\x1f\xdb\x77\xed\x32\x81\xf1\x6b\x05\xfa\x65\x97\xed\xc2\x18\x48\x04\x7f\x0f\x00\x7b\x80\xbf\xce\x2b\xf2\x75\xd8\xae\xcb\xc3\xc4\x2d\xa7\x50\x08\x7a\xe8\xc0\x5e\x8d\x61\x2f\x41\x92\x4d\x69\xa2\x42\xb5\x2a\xac\x0c\x06\x18\x29\xa5\x7c\x4e\x4e\x5b\x6e\xab\xb9\xdd\x2a\x56\xfa\x8a\x8e\x88\x3b\x61\xa9\xde\xda\x39\xee\xb9\xe3\x33\x5e\xab\xbc\x4d\x7e\x7a\xe9\xe5\x5e\x84\x6b\xbe\x19\x5c\xdf\xa4\xab\x87\x24\x62\xd5\xb3\x4f\x27\x74\xd5\x1b\x75\x92\xd5\xc3\x65\xbd\x65\xbb\x8c\x87\x4d\x01\x81\x0d\xb6\x42\xa2\x2e\x6c\x89\x60\xef\xa8\x0b\x3b\x09\x34\x0f\x3b\xac\x1c\xdf\xc0\x22\xa8\xc3\x36\x6d\x97\x7d\xef\x2a\x68\x05\xf5\x65\x35\x86\x99\xfa\x18\x6d\x74\xb0\x79\xeb\x36\x9d\x0b\x75\x0d\x71\x5b\x4f\x04\x51\x01\x92\xb0\xef\x35\x48\x00\x8f\x52\x68\x73\x3b\xb9\x05\x06\x43\x28\xc6\xa4\xdd\x10\x42\x24\xa3\x59\xd3\x06\xd4\x24\x59\x7a\xc2\x90\xce\xc9\x5f\x46\x8d\xf6\x6b\x44\xdc\xfd\x4b\x27\xe3\x6c\x4f\x76\xe9\x75\xbc\xe8\x3c\x9e\xcb\xfc\xe3\xd6\xb6\xfe\x21\x6d\xc0\xde\x1f\x17\x7f\xca\x67\x2d\x64\xd3\x07\xe3\x46\xe5\x65\x98\x53\x12\x4a\x40\x7c\x59\xa5\x4c\xb5\x33\xa8\x69\xf0\x61\xb7\x0f\x2d\x05\x70\xe0\x8c\x50\xb3\x07\xb2\xe5\x01\x56\x2a\xb7\x4a\x59\x6f\x19\xd7\xad\x6e\xbd\x12\xca\xfa\x20\x11\xaa\x4d\x23\x63\x0f\x40\x71\x47\x18\xa6\x14\xcb\x7e\xe2\x12\xf2\x58\xf7\xd2\x35\x5f\x25\xe7\x7a\xf7\x1f\xe2\xcc\xf0\xbf\x9f\xf2\x90\x77\xeb\xcf\x3f\x46\x7b\xa6\x1f\x7f\xc6\x9d\xe9\x7f\x01\xf9\xdd\xc3\xe7\x1f\xcf\x52\xe5\xdf\x02\x11\xf3\x0f\x2f\xd6\x4d\xa0\x5a\xf5\x07\x26\xc5\x04\x2a\x6b\x43\x17\x4c\x0a\x41\xa5\x4c\xd3\x58\x84\xa7\x89\x99\xe8\xbe\x85\x43\x1f\x86\x6a\x0f\x92\x61\x53\x1d\x43\xd3\x19\x28\x01\xf6\x4f\xfa\x72\xd6\x83\x64\xd2\x9b\xfd\x22\xd5\x26\x6c\x05\x28\x56\xc9\x32\x0a\x5c\xd4\x9c\xef\x64\xc5\x15\x77\xa3\xa4\xa4\x86\xd3\x89\xaf\xdf\xd5\x0e\xab\xaa\x34\x8c\x03\x21\x84\x08\xbd\x52\xea\x30\x73\x65\x0d\x67\xdc\x70\x4b\x4e\x5a\x38\x2c\xe6\xb1\x7f\x12\xf1\x8c\x51\xf7\xeb\x2a\x3b\xf9\x05\x61\x9b\x8b\x09\x6a\x2c\x3e\x7e\x7a\xb8\x2e\xff\x53\x85\x21\x70\x07\x02\x0c\x44\xab\x66\x33\x18\x2d\x48\x25\x78\x8d\xc6\x29\x78\x7f\x18\x08\xde\xa1\xca\xc3\x1a\x24\x4f\xf3\xae\x46\x59\xe2\x43\xe2\xe3\x3d\x5f\x41\x2e\xac\xa5\x98\xb8\x60\x37\x9d\x77\xd0\x43\xca\xdc\x04\xec\x13\x5e\xf1\xbd\xb0\xd2\x22\xc5\x9c\x63\x24\xf0\x0b\x92\x6f\x97\xbc\xc4\x3a\xb5\x42\xc9\x9f\x25\x1f\x2e\xd8\x95\xb7\x1e\x6c\x2f\x4a\x1f\xdf\x9d\x62\xc2\xe5\x95\x2f\x2f\x81\x3b\x87\x35\xcc\x0a\xff\x95\xf9\x0c\xa2\x20\x3d\x25\x0d\x26\x7a\x06\x2c\x2f\x02\x23\x60\xe7\x17\xe9\x00\x26\x81\x6e\x2e\x63\xdd\x15\x22\x34\xf8\xed\x16\x48\x1e\x06\xd4\xaa\xc3\x26\xa5\x94\x08\x90\x80\xda\xfa\xc3\x86\xd2\x0c\xf9\x80\x9b\x80\xda\x58\xbb\x9e\x70\xf6\xe5\x8b\x0a\xd9\x05\x45\x72\x12\x54\xbb\xb8\xf1\xbe\x95\x37\xfc\x74\xe9\x5f\xfc\xcc\x2c\xe4\xf2\xbd\x5a\x8d\x8b\x3c\xe3\x2b\xfa\x45\x66\xc9\x92\x34\x4b\x91\xce\x8b\x69\xc2\x00\x88\x03\xec\x15\x72\x53\x3c\x89\xcb\xd9\xa1\x38\x97\x16\x6c\x55\x2e\x9d\xe5\xdc\x4a\xcb\x9d\xf7\x2e\x9e\x70\x0b\x24\xe7\x3c\x8c\x42\x88\xa5\x39\xf3\xf5\xd7\x27\x2d\xda\x7c\x1b\x9d\x4e\xde\x70\xfd\xae\x54\x43\x2e\xf6\x8c\x8f\x77\x37\x9f\xdf\xbf\x08\xf9\xbf\x15\xe1\x3a\x19\xe4\x9e\x09\x03\x91\x20\x94\xed\x3c\x01\x1e\x6c\x58\xa0\x01\x87\xed\xb2\xa7\x60\x00\x45\xd8\x87\x1e\x01\x09\xe0\xd2\xa6\xfb\x8a\xa6\xdb\xa6\xdf\xa2\x79\xb3\x0c\xcb\xfe\xe4\xcd\x68\x31\xb4\x10\x73\x1d\x76\x41\x51\xa0\xc0\xde\x86\x61\x51\x24\x55\x29\x71\x01\x1d\x10\xc9\x9a\x8c\x23\xd2\x08\x2b\x36\x1b\x65\x78\xa3\x18\xb1\x98\x76\x26\xf0\x12\xf8\xa5\x6f\x30\xb2\x35\x6e\x21\xa1\x88\x91\x3a\x7e\x0d\x95\x70\x5c\xb3\x92\x6c\x85\xe6\x15\x0d\xb3\x36\x22\x39\xeb\xe3\x75\xf9\x36\xf9\x8b\xa8\x8a\xf4\x2f\xc9\xff\xf9\x4b\xae\xf9\x31\x94\xbf\x8f\xb6\xf9\xbf\x02\xf7\xb7\x51\xb0\xf3\x21\xf6\x99\xce\xd3\x83\x3f\x6e\x9c\x1f\xef\x59\x34\xb7\x3f\x18\xa0\xc2\x90\xc9\x8d\x03\xac\x2a\xeb\xc2\x54\x9e\x8b\xa1\xe2\x4c\x0a\xda\xaa\x06\x0b\x29\x28\x2e\x8b\xcd\xa2\xa4\xe9\xb8\x07\x7b\xa3\x84\x32\xa1\x3c\x2e\x06\x72\xbc\xf7\x55\xb0\x01\x43\xa0\x43\x97\x33\xe7\xac\x75\xce\xd6\xfb\xfd\xd2\x4c\x13\x20\x30\xd0\x09\x28\xb0\x29\xa6\x91\x31\xa3\xc2\xae\xd5\x2d\xa8\x38\x91\x35\x72\x6d\xcf\x0d\xd7\x44\x51\xa9\x14\x9b\xfb\xde\x36\xb5\xa1\xc8\xd7\xdd\x09\xff\x4c\xd7\x2a\x9f\x23\xe3\xf4\x1f\x4e\xb8\xe0\x77\x2f\x3e\x36\xc7\xe3\xcb\x87\xd5\xc3\x97\x9b\x4f\x37\x5f\x5e\x05\xa2\xcf\x6d\x97\xeb\x9c\x31\x82\x51\x5f\x05\x78\x32\x64\x2b\x08\xdc\x6e\x9e\x77\xbb\x7d\xb9\x14\x95\x76\x3a\xb4\x80\x2b\x44\x6c\x1b\x5a\xab\x7b\xe1\xdf\x89\x63\xd0\x86\xaa\xae\x67\x77\x20\xb6\x26\xae\xae\x85\xcb\x67\x44\xb0\xdb\x3a\x6f\x47\xe8\x94\x2b\x41\x1f\x44\x99\x26\x6e\x4b\x29\x6f\x5a\x3a\x7b\xa7\xc5\x81\x71\x5e\xfa\x12\x65\xc5\x93\x5e\x55\x61\x4b\xa5\x58\xaa\x14\xa1\xda\x99\xc8\x59\xdf\x9e\x79\x90\x17\xec\x5b\xf2\xc7\xf4\x54\x63\x14\xb9\xa2\x9a\xe5\xc4\x21\x0c\x20\x44\x8e\x40\x40\x63\xf6\x3e\xc4\xc3\x1f\x3a\x5f\xd7\x7a\x07\xfc\x6b\x73\x73\x55\x20\x23\x25\x47\xca\x98\xde\x8c\x66\xb4\x3c\xd3\xb8\xe6\xc7\x34\xb8\xef\x43\x3f\x8e\xa1\x1f\x4f\xf3\x9f\x21\xf6\xf7\xb6\x2f\xef\xe9\x94\xc1\xfd\x1b\xef\xeb\x8d\xd0\xeb\xcd\xfd\xe3\x7d\x64\xdc\xdf\xdc\xe7\xcc\x21\x04\x4a\x88\x3c\xae\x00\x0d\xee\x02\xbb\x04\xee\x30\xf8\x1a\xe9\x19\xd8\x57\x41\xd7\x60\xdd\xec\xdc\x3c\xe7\x5b\xa4\xc5\x15\xa1\xcd\xf2\x8c\x61\xcc\x01\x9c\x5f\x69\x6d\xe2\x50\xaa\x26\x87\x4b\x91\xaa\x73\xbd\x6b\x56\xfc\x0a\xbb\xff\xf7\xa7\x9e\xe4\x37\xf8\xfd\x87\xd8\xfa\xf8\x65\xfc\xfe\xe7\xd5\xcf\xa9\xe6\x9c\x22\x88\xcf\xaa\x26\x7a\xb4\x38\x21\x88\x43\x8b\x5e\xca\x0a\x58\xc0\xa3\x43\xcb\x0e\x54\x31\x7b\x68\xd2\xe4\x49\x5c\xce\x08\x09\x66\xf7\x84\x57\xd0\x03\x1e\x5a\xe6\xb4\xa8\xb4\xa6\x5f\xb7\x60\x63\xb5\x92\x66\x55\x52\xaa\x59\x28\xa5\x26\x1c\x15\xb6\x50\x60\xcf\xc2\x9e\x52\xfa\x9c\x10\x42\xc2\xcc\x64\x31\x11\x62\x9b\xd3\x1c\xc3\x42\x2a\xb4\x3c\xf7\xcb\xb7\xcf\x66\x2d\xf2\xfe\x1b\xa5\xc9\xe4\x2c\x0d\x74\xb3\xfa\x05\x86\xc5\x1a\x7e\xe5\xab\xdd\xef\x0d\xd8\x67\xe6\x60\x7c\x4a\x97\x3e\x44\x5b\xfe\x26\x5a\xe6\xd6\xc7\x1f\x44\xff\xf4\xbc\xb7\xd1\x84\x6b\x17\x91\x91\x4d\xd0\xda\x47\x7d\x83\x24\x49\x53\x14\x79\x08\x45\xbc\xce\x09\xb8\xda\x90\x2f\xbc\xb9\x17\x89\xe0\x93\xdc\x0e\xb8\xb9\xbb\xc9\xb6\x92\x6c\x0c\x69\x29\x03\xe8\x39\x39\x2e\x80\x26\x28\x1c\x1a\x01\x6a\x14\xb6\x00\x17\xcf\x09\xa8\x11\x4b\x65\x30\xab\xc2\x77\xad\xc7\x4e\xbb\x30\xba\xa8\x90\x6b\x5a\x63\x01\x74\x08\x14\xce\xe9\x05\x1d\xff\xef\xe3\xfb\xc0\x67\xdf\x80\xbf\x38\x33\xd0\xaf\x7c\x03\x1e\x3f\xad\x4e\xe7\x3f\x7c\xba\xbb\xf8\x02\x26\xef\x63\xa1\x91\x09\xb7\xf3\xd1\x8a\x74\x7e\xc2\x03\x10\x1e\x8c\x01\xeb\x06\xd4\x68\x0e\x22\xec\x24\x15\x0a\x14\xb5\xab\xb0\x6a\x73\x1c\x3c\x18\xbc\x6d\xbc\x1f\x3a\x33\x15\x9e\x71\x29\x14\x48\x00\x82\x8d\x31\x55\x92\x64\x29\x7f\x66\xeb\x2e\x9f\x92\x3f\x4f\xfe\xf2\x84\x52\xbb\xd4\x67\x7f\x0e\xce\xe2\xc8\x2f\xb5\xe9\xb9\xbf\x7a\x71\x2a\x5c\xc7\x19\xdb\xe9\x2d\x4d\xae\xac\x8d\xa2\x4a\x91\x8a\x62\x35\xa7\xca\x97\xb5\xb3\xc4\x39\xaa\xd4\x36\xec\x3d\x18\x02\xf1\xbb\x01\xb9\xd0\x06\xaf\x4a\xe1\x24\x28\xa1\x2f\x20\xb7\xf9\x04\xb5\x64\xca\x1b\xa6\x6b\x8e\xd5\x0c\x08\xd4\x8a\x09\xaf\xa9\x39\xfe\xaf\x4d\xeb\xf6\xd0\x3b\x57\x35\xca\xf6\x40\x97\x56\x1e\x53\xaf\x37\xba\xba\xaf\x4c\xe6\x2b\xb4\xda\x1f\x81\x74\x7c\xf3\xd0\xfc\xf8\x8b\xba\xc7\x43\x5a\xf8\xb4\x58\xe6\x38\x2d\x42\xcb\xc6\x2f\x63\x8a\x4f\x6a\xc7\x53\x6c\x8e\x8d\x80\x1c\xe6\xcb\xd9\xd7\xf2\x8f\x09\x1e\x43\x4a\xad\x5c\x76\xdc\x76\x9d\xe5\x69\x25\xc3\x70\xcc\x2a\x27\xce\x79\xfb\xad\xde\xf1\xea\xfc\xd9\x70\xd4\xd4\xfa\x98\x7c\x8e\xea\x3e\xd7\x82\xa4\xf9\x37\x82\xa4\x77\xef\x7e\xfc\x43\x13\xad\xf8\x51\x7e\x0b\xbe\x31\x3d\xbe\x52\xdd\xcd\xa9\xad\xca\xb4\x16\x7e\xbb\x63\x61\x9c\xc3\x36\x28\x02\xc8\x56\x8a\xe3\x02\xa2\xd4\xf8\x86\x87\xa2\x58\xd0\xd9\x86\xeb\xe7\x3e\x5c\xaa\xc0\xd0\x1c\xef\x6d\xd4\x50\x46\xcb\xa6\x59\x36\x29\x0a\x12\xf8\x40\x56\xb8\x86\xa5\xd5\x1c\x43\x8b\x99\x44\xbe\x22\x08\x23\xc4\x1b\x42\x09\xe1\xc5\x10\xaf\x4a\x70\x6f\x3e\xbc\x10\x9a\x6a\x7e\x2c\xf3\xb9\xa6\x91\x1b\x7d\xb9\xc7\xff\x18\x67\xbd\xe7\x7b\x7b\xc5\xf0\xfd\xe1\x36\x56\x0a\xdf\x24\xda\x17\x09\xb6\x6b\x7e\x2f\xf8\xc5\xdb\xec\xf3\x79\xd9\x53\x2a\xc8\xe0\x4c\x3b\x17\xa0\xde\xa8\xae\x2f\x5c\x2b\x54\xa5\x15\xa3\x45\x98\x43\xc3\x80\x06\x75\x59\x4d\x61\xcb\x40\x35\x55\x70\x6a\x04\x40\xdb\x65\x17\xaa\x3f\x7a\xd3\x1d\x46\x5c\x09\x2b\xbd\x2c\x0a\xdb\xdb\x4e\x61\xdc\x7b\xe8\x21\x93\x84\x6c\xad\x35\x7b\x84\x7b\x65\x45\x07\xa1\x42\x86\x99\xe7\xe4\xdb\xb5\x70\x59\xe7\xf0\x4a\x83\xf7\x1f\x92\xff\x2d\x56\xbf\xc7\x8b\xf0\xf3\x7d\xfe\x33\xd2\xe2\xe2\x9d\x7e\x41\x4d\xff\x8c\xd3\x5a\xbc\x10\x59\x92\x57\xdd\xa6\x82\x40\x4b\x21\x34\x6c\x18\x0a\x8d\x0b\x9d\x07\xc3\xa0\x04\x77\x7a\x49\xa2\x3a\x3c\xd8\x02\x11\x9a\x00\x5f\xcf\x9f\xe6\x3f\xb2\x36\x56\x50\x1a\x5e\x94\x4b\xc2\x59\x69\x0a\xa2\x22\xe3\x7f\x9f\x19\xce\x60\x8d\x49\xc0\x52\xca\xd0\x28\xa5\xd2\x9f\x5d\x0a\x67\x8d\x2b\x16\xf1\x68\x1f\x92\x5f\x27\xff\x23\xf9\x7f\xde\x3c\x05\xd7\xf0\xc4\x73\x05\xfc\xc6\x5d\xf5\xd2\x2b\x7c\x3b\xcb\x4b\xcf\xfa\xbf\x3f\x3d\x80\xbb\xcf\xc7\x47\xe3\x65\xa0\xf9\xe5\xf3\xe3\x99\x49\x96\x77\xbe\x2c\x53\xac\x5a\xdf\x93\xfd\xd0\x8c\xb2\xb3\x9c\x20\x24\x5a\x40\xbd\x08\xb8\x14\x07\x4d\x89\xe4\xcb\x94\x6e\x4d\x53\x57\x20\x61\x48\x63\xa8\xb9\x25\x08\x12\x8c\x91\x1d\xc5\x64\x42\x0f\x9c\xd0\x69\x07\x50\xe1\x80\x2b\x98\xc7\xac\xe4\x18\x95\x30\xec\xeb\x60\x25\xa0\x28\x6c\xf3\x3d\xac\xa1\x6d\x15\xa9\x2d\xe6\x0c\x69\x84\x09\x43\xb5\xf4\x7b\x66\xa0\x6c\x08\x65\xd2\x9a\xd6\x40\xa4\x8b\x91\x71\x21\x96\x41\xf1\xd2\x95\x10\x83\x26\x6c\x3a\xd3\x83\xda\x18\xbd\x4c\x84\x98\xc0\x9a\xd2\x96\x48\xf4\x61\x74\x46\x6f\x8e\x31\x24\x2b\x63\x0e\x34\x47\xb4\xe7\x59\x93\x1a\x5c\x5d\xb1\x2f\xaf\x57\xf2\xe1\xcd\x1a\xba\xbd\x07\x67\xde\xee\xdf\x83\xe3\xaf\x5e\xa6\x63\x59\x87\x11\x1e\x7b\x4e\x09\x11\x1b\x65\x8f\x57\xc8\xf9\x69\x4f\xac\xe0\x84\x43\x8d\xeb\x50\x79\xa0\xad\x0c\xac\x2c\x05\x98\x07\x8e\x6a\x6b\x6b\x70\x7c\x42\x76\xa1\x4a\x51\x59\x98\x9a\x23\x8a\x6b\xe1\x26\x58\x43\xe3\x04\xa9\x1d\x5c\x5a\xc6\x4a\x53\x52\xb8\xcf\x2b\x26\xca\x8a\x85\x1e\xc1\xb2\x62\xf5\x24\xc2\x46\x5c\x3c\xc2\xfd\xaa\x8c\xce\xd7\x9f\xcf\x9d\x9f\x8b\x35\x74\x24\x6a\x9d\xd1\x04\xb1\xd5\x7f\xfb\xfd\xfa\x2e\xfd\x73\x70\xff\xf0\xe9\x77\xff\x15\x3c\xde\x7d\xf9\xb4\xbe\xfb\xf2\xaa\xe2\x12\x9b\x29\xc7\x22\x36\x15\xc3\x73\x42\x40\xb5\x09\x22\x45\x75\x15\xe8\x0a\x2e\xac\x82\xd9\x18\xca\x09\x30\x1a\xe6\x11\x02\x5a\x12\x36\x56\x92\x56\xe5\xd3\x9e\xb9\x3a\x85\x70\xd1\x22\xdb\x1f\xca\x78\x60\x4a\x83\x21\x34\xf0\xbc\x7c\xda\x83\x49\x33\xc3\x9c\xae\xa3\x84\x58\x5d\x6b\x43\x1c\x55\xb8\x96\xcf\x49\x83\x2c\x94\x6c\x23\x4c\x3a\x46\xd3\x92\x12\x11\x82\x02\x55\xa7\x39\x92\x78\xd6\xeb\x26\xb7\x49\x7d\x76\x9f\x39\x61\xe2\x2e\x1c\xa2\xdb\x8b\xb9\xc3\x8b\x4c\xff\xb9\xaf\x78\x7b\x7f\x03\x8e\xb9\xec\xfb\x2f\xf7\xb7\x77\x9f\x1e\xef\x7e\x58\x4b\xbf\xb4\x10\x58\x30\xb0\xa1\x0f\x3a\x65\x3d\x42\x60\xff\xfb\x12\xf8\x1a\xc9\x94\x05\xd5\x8d\x14\xec\x00\x5d\x1a\x97\x51\xb7\x49\xb7\x23\x63\xfb\x20\xe7\xd0\xa1\xdc\x86\xbe\x87\x7b\xe3\x08\x63\xbd\x55\xc2\x39\x25\x6c\xcf\x39\x75\xcd\x1c\x6d\xec\xb5\x94\x4b\xb2\xd9\x6c\x64\x7c\x1e\xd1\xda\xe6\x2e\xf9\x98\xfc\xa7\x8b\x37\xec\xed\x71\x85\x9c\x04\x39\xee\xbf\xe9\x6b\x5f\x00\x5f\xab\x57\xbb\xd1\xc7\xbb\xdb\xbb\xbf\x00\x9f\x6e\xca\xd5\xc3\xc7\xcf\x8f\x67\x29\x14\x97\x6e\x4d\x47\x00\x14\x0e\xc1\x89\x72\x46\x20\xa3\x30\x4c\x40\x0a\x6d\x50\xad\xc4\xb2\x7f\xd7\xba\x65\xf4\x80\xd4\x41\x67\x4d\xd0\xb5\x74\xcb\x20\x40\xbd\x2d\xf6\x83\x57\x4d\x97\x3b\xe3\x15\x33\xa8\xaf\xb9\x58\xf6\x9a\x95\xbe\xe2\x60\x6f\x05\xe7\x10\x11\xd6\x2f\x28\xa5\x4b\x97\x4e\x8d\x73\xcd\x36\xcc\x41\x79\x4d\x77\x5d\x11\x36\xc7\xe7\x8b\x27\x49\x16\x71\xef\x62\x45\xe2\xac\xe9\x5f\xaf\x7c\xc8\x22\x2e\xf1\x1b\x00\xdb\x2a\x52\xf8\x4f\x42\x35\x6f\xd5\xa1\x5f\x9b\x8c\x27\xf9\xb9\xd3\x47\xf6\x59\x5d\xd5\x1e\xc3\x74\xff\x7b\x9c\x77\x8a\xdb\x2d\xf7\xed\xbe\x65\xc6\x69\xc3\x86\x7e\x38\x70\x9f\x0b\xbf\xd0\xaa\xca\xd8\x79\xd6\x8a\x97\x84\xe2\x61\xaa\x4a\x23\x91\x2d\xab\xb0\x09\x5d\xcd\x69\xb0\x3e\x15\x68\xd9\xe4\x5d\x74\xf6\x35\x25\x41\x98\x09\x8c\x19\x54\x55\x0d\x2b\x89\x30\x2e\xa2\x04\x07\x23\x28\xd4\x8c\x97\xb6\xa4\xa0\xd6\xb8\x44\x15\xac\x8d\x47\x18\x13\x68\x99\x0a\x65\xaa\x55\xd4\xb8\x12\xf9\x18\x6b\xf2\x6b\xdd\xe2\x5f\x50\x2c\x06\x8f\xf7\xb7\x0f\xf7\xb7\x9f\xb2\x4f\x8f\xf7\xab\x4f\x8f\xf7\x27\x95\x54\xb0\xf1\x15\x04\x13\x21\xf3\xa1\x43\x58\xec\x81\xa2\x28\xb4\x08\xa7\x6a\x70\xd3\xf1\x0f\x90\xc3\x00\x4c\x15\xc8\x32\xa1\x14\xe7\x5b\x48\xb0\x66\x64\xe1\x29\x43\xb5\x1a\x0c\xa1\x94\x84\xd9\x39\xe7\xc2\xd4\xb6\x6d\x68\x2c\x41\x0e\x25\x39\xa0\x69\xb1\xc6\x79\x9b\xfc\x69\x64\x44\x56\x67\x7c\xd3\xdd\xfa\x4c\x54\x8a\x12\x34\x67\x08\xc2\xc6\xa1\xb4\x58\x7a\x52\x53\x33\x04\xd4\x34\xc1\x3b\x97\x73\x41\x2c\x16\x79\x5b\x3b\x67\x09\x97\xdb\xdd\xd2\xa4\x68\xd9\xef\xa3\x56\x51\xb2\x4e\x9a\x88\x0d\x1e\x63\xdd\xf1\x9b\x73\xf6\xf8\xdf\xce\xfd\xf0\x8b\x1e\xd1\xa7\x93\x27\x70\x76\xf7\x78\x9a\xb2\xbf\x5b\x3f\x80\xdb\xef\xff\x0b\x78\x04\x9f\x1f\xef\x4f\x35\x62\x8c\x2b\x2f\x42\xe2\xeb\x77\x77\x7f\xf3\xf0\x37\x3f\x3d\xde\x34\x59\x13\xb6\xb3\x5f\x26\x3f\x87\x5d\x5a\xa8\x6d\x5a\x0b\x82\x55\x61\x19\x18\x21\x59\x26\x21\xd2\x7a\x99\x56\x28\x24\xa9\x0f\x05\x6c\x7a\x52\x7a\x88\x68\x98\xb7\x25\x46\xf9\x68\xbb\xa7\x9e\xf3\x9c\x76\x5d\xd7\x2d\xde\x12\xb2\x9d\x1b\x02\x78\x5f\x6f\xc3\x56\xb7\x4b\x65\xc1\x1e\x38\xbb\xf0\x50\xd5\x15\x9a\x48\x98\x6b\x54\x70\x96\x36\x49\x76\xd2\x62\x5d\xa1\xe4\x18\x2d\xdf\x60\x3b\xce\xbe\x0c\x59\x4c\xd6\x6f\x3e\xdd\xdc\xbd\x91\x97\xba\xa4\xf7\xd7\xb9\x7e\x0e\x51\x95\xee\xbf\xe2\xc6\x71\x9a\xf6\x25\x1c\x7c\x09\x8d\xf4\x29\x5b\xba\x74\xf8\x0a\x53\xbb\xcc\x69\x21\xb9\x64\x4a\x6d\x33\xe2\x8a\xca\x1f\xd3\x36\x2a\xf5\xb4\x42\x8c\xbb\x50\x05\x19\x46\x3e\x80\x7a\x93\x62\x82\x43\x0f\x39\x13\x1a\x74\x8b\x71\x83\x73\x83\x1b\x8d\x12\x46\xa8\x11\x14\x90\x11\xed\xac\x13\x46\xea\x31\x49\xd6\xa0\x7c\x96\x6b\xb7\x12\x49\x11\xb9\xc5\x7f\x9d\xdc\x27\x7f\x7f\x72\xf4\xb9\x00\x4b\x3f\x9d\x1e\xc5\xfb\x4f\xab\x93\xc0\xf2\x0f\x1f\xd6\x9f\x6e\xb2\x63\xb6\x97\x9d\x1a\x41\xb1\x88\xfa\x12\xfd\xd7\xf3\xd5\x5b\xb8\x70\x66\x3a\x9a\xce\x5f\x51\x5a\xa2\xc0\x3d\x9e\x86\x76\xa8\xfb\x1d\x18\x9c\x85\x54\x6a\x67\x88\x6d\x7d\x3f\x3d\x27\x03\xd8\xd4\x61\x0c\x3b\xd6\xa6\xa5\xf2\x00\xce\x22\x6c\x43\xcb\xdb\x89\x96\x2e\xe2\x3c\x67\xb7\x12\x28\x3a\x40\xa2\xa5\x91\x88\x62\xcc\x2d\xa1\x8c\x60\x42\x04\x68\x03\x67\x94\x93\x40\xb7\xca\x32\xcc\x53\x28\xdd\x3c\x10\x61\x05\xa5\x91\x30\x3e\x08\xca\x92\x24\x01\x49\x03\xca\xb5\xcc\xf7\xc9\x5f\xbf\xc6\x9c\xcf\x5f\x3e\x5c\xbb\xb5\x5c\x72\xf5\x2d\x30\x35\xf6\xac\x06\xad\xc0\x8d\x02\xcd\x82\x52\xb7\xa8\x48\x75\x2f\x17\x9d\xda\x05\xe5\x85\x64\x48\x1a\xad\x50\xef\x1a\xd7\x78\xdf\xb8\x26\x49\xf2\xf4\xe4\x71\x96\x24\x45\x52\xc5\x39\x7a\x02\x2e\xaa\xff\xab\xd3\x3f\xf7\xb2\xc5\x5c\x03\xb2\xd3\x0e\x0c\xa8\xa9\xab\xb4\x7a\xd2\x80\x90\x1a\x54\x18\xb5\x18\x03\xf3\x75\x00\xb2\xc6\x99\x71\x0b\x76\x2e\x1d\x17\x9c\x33\x8d\x99\x70\xb5\x32\xc6\x22\x2d\x9c\x93\x3c\xa0\xa5\xc3\xf8\xb8\xef\x80\xe2\xc5\x9b\xa1\xc9\x37\x57\x0a\x72\xff\xe5\xed\xd4\xf7\x7a\xe0\xf7\x73\xb0\x7b\x70\x55\x9b\x1f\x7f\xc3\x00\x73\x42\x93\x1d\x53\xd1\x26\x88\x26\x96\x1c\xc7\xfd\xca\x8c\x7d\x1f\xa5\xe3\xe2\x37\x50\xa6\x73\x18\x81\x0a\xee\xe4\x18\xb8\xc9\x35\xe7\x56\x2f\x1b\x1d\x25\x68\xac\x4e\x91\x8e\x49\x68\x18\xa4\x94\xa9\x74\x81\xb9\xc5\xa6\xda\x81\xee\x94\x7f\xe2\xb5\x5f\xf1\xe4\x4f\xce\xb3\x8d\xab\xee\xfe\x05\x68\x70\xad\x61\xfc\x6e\x7d\x7b\x16\x06\x7c\xf7\x62\x1d\xfb\xe9\x45\xf4\x1b\xd5\x59\xf1\x7b\x98\xd5\x15\x0c\x45\xbe\x03\x30\x6c\x43\xc9\xbd\x15\x56\xa9\x76\xc7\x16\xbf\xe7\xfb\xc6\xd4\x53\x4f\x7b\x2b\x81\x07\x55\x50\xc7\x68\xee\xb3\xfe\x40\x8f\xc7\x8a\x13\x6a\x2d\x42\x61\xd8\xda\x9d\x95\x52\x73\xc3\x19\x6a\x1a\xd0\x51\xbd\x47\xc8\x30\xcc\x40\x41\xa1\x63\x7e\x67\x45\xe8\xc5\x29\xbf\x38\x69\x5c\x5f\x7c\x1a\x93\x9f\x11\x5e\xbe\xbb\xbc\xe7\x8b\xf2\xf2\xea\x97\x94\x97\xcf\x7a\x44\xe4\xab\x5c\x0d\x4b\xc3\x34\x23\xaa\xa6\xb6\xa3\xcb\x7e\x13\x5c\x6b\xeb\xed\x40\xc7\xd1\xb4\x00\xe5\xfa\xc9\xea\xac\x8f\x00\x1c\xe6\x94\xa8\x94\xa6\x07\x0a\x90\x55\x52\x99\x15\xb4\x61\xa7\x19\x46\x94\xd7\x08\x55\x4e\x81\x7a\xae\x91\x21\x88\x01\xd2\x04\x1d\x9c\x00\x10\xe8\xb4\x9f\xd4\x22\x8d\xb1\xdd\x89\xbf\xe2\x4b\x2a\x8c\x62\xb1\x26\xc4\xeb\x26\x9f\x92\xbf\x3a\x65\x20\xb1\x0f\xfa\x22\xbc\x76\xfc\x1c\xeb\x9b\x32\x3d\x33\x3b\x7e\xfc\xb0\xfe\xee\xfd\x3a\xcd\xae\x7e\xe3\x78\x73\xee\x5f\x7f\x63\x15\x5f\xcf\x46\x36\x6c\x29\xad\x6b\xc5\x89\x86\x42\x73\x45\x85\xa2\x14\xf4\x39\xa5\x0a\xb6\xba\x83\x1e\xd7\x15\x54\x0c\x69\xd8\x72\x4c\x28\xd7\x84\x82\x7e\xd1\xa6\xb6\xb5\xce\x27\x83\xeb\x03\x85\x48\x09\x34\xee\xb0\xc4\x98\x67\xbb\x63\xd5\xc8\x43\x63\x84\x04\x24\x72\x3c\x84\x81\xcb\x66\x19\x55\x4a\x53\x05\x0f\x0c\x42\xc9\xd1\x66\xc6\x4e\xf1\x6c\x5f\x84\x7d\x60\xa1\xb5\x42\x44\xd3\x50\x51\xf7\x61\x0c\x7d\x0d\x04\xa8\xcf\x3c\xc2\x69\x2d\x56\x2c\xf9\x0f\xaf\xaa\x48\xb7\x17\x8e\xc4\xea\x36\x22\xd8\xff\x1a\x44\x52\x5a\x8c\x73\x0f\x11\xea\x76\x5e\x80\xab\xe8\x55\x5c\xa5\xa5\x07\xf3\x8e\xb7\x03\xd8\x2c\xc7\x32\x36\xad\xc0\xc0\x43\xb5\x0c\x05\x07\x2d\xd0\x02\x43\x57\x8f\x01\x2d\x33\x15\x61\xc0\xc7\x7f\x79\x71\x69\xbb\xec\x33\xac\x54\x70\xf9\xcc\x39\x36\x42\x0a\xcd\x58\x4d\xb8\x66\xa8\x2a\xca\x42\x11\x8f\x2a\xc8\x25\xd3\x54\x68\x29\x11\x96\x51\xcf\x8a\x45\xcd\x98\x3f\x4b\x7e\x95\xfc\x73\xc4\xb0\x7c\xcb\x30\x7b\xe3\xa7\x17\x9f\xf8\x97\x0d\x29\xe6\x1e\xab\x6f\x65\xd4\x57\x77\x7f\x0d\x3e\xfd\xee\xe3\x6a\x67\xcb\xca\x18\x25\x34\x37\x0a\x24\x87\xda\x15\x95\xd6\xea\x58\x60\x2b\x90\x8c\xa1\xc8\xf0\xe2\x53\xe9\x53\xb9\xf8\x0c\x3f\x75\x08\x67\x53\x13\x26\x50\x01\x5b\x2f\xbb\xd0\x86\x2e\x30\x01\x24\x28\x1b\x2d\x24\x07\x28\x6b\x0f\x5b\xb5\x2f\x4b\x80\x56\x10\x22\x44\xa5\x12\x42\x50\xa9\x3d\xac\x6b\xc2\x15\x63\x82\x2a\xbd\x78\xab\xec\xb1\xd6\xb5\xca\x12\x22\xbd\xc2\x85\x2b\x35\x47\x0e\x22\xc6\x31\xb2\x56\x32\x21\x8f\xf7\xc8\x03\xb5\x56\xab\x32\xf9\x9f\x92\xbb\xb7\xba\x26\xd7\x82\xc4\x2f\x55\xc8\xc7\x93\x7c\xa1\x59\x4c\x06\x83\x32\x46\x23\xbc\xcc\x8b\x47\xce\x84\x3a\x83\x8b\xc9\x19\x21\x81\x7a\x06\x86\xdc\x6b\x6d\x9d\xd3\x4e\x53\x42\xa0\x63\xda\xb9\x20\x28\xf6\xb0\x3a\xf5\x51\x4f\xf3\xfd\x32\x72\xbb\x7f\x9d\xfc\x2e\x3a\xe9\xfe\x1f\x49\x02\xae\x34\xb1\x7e\x7c\x7d\x0b\x1f\x4e\x69\x2a\x78\xd3\x37\x38\x4f\x9d\x7e\xfc\xb9\x1f\x5e\x8f\x9e\x56\x0c\x14\x00\xb1\xb0\x0d\xe3\x32\x8a\x4d\x94\x57\xca\xca\x4e\x19\x58\x07\x1f\x64\x3d\x79\x67\xf5\x6e\x8f\xc9\x81\x64\x05\x65\x54\xd7\x0e\xd5\x61\x0e\x03\x02\x02\x54\x8b\xcb\x6c\x56\x31\x46\x0d\x3c\xff\xf8\xb8\xcc\xe0\x62\x17\x2e\xb1\xc1\x22\x2f\x8e\xdf\xf8\xaa\x1c\xa5\x95\x33\x93\xa3\xb5\xb2\xf4\x3d\xc5\x08\x97\x52\x6f\xeb\x91\x95\x90\xe2\x60\x16\xc9\x38\x74\x10\x59\xcd\x1d\x97\x3b\xf7\xcd\xdf\x4b\x21\x99\x94\x34\x7e\x3d\xee\x3d\x36\xf6\xd5\xc5\x37\xfc\xf3\x8f\x5f\x3e\x9f\x26\xd3\x2f\x29\xfb\xdd\x45\x69\xf8\x55\x9c\xf6\xee\x1d\xf8\x05\xbd\xef\xb4\x01\x49\xc3\x5a\x1b\x58\xa0\xa9\x01\x98\x50\x33\x1a\x07\xeb\x85\x2e\xb4\x02\x62\x3f\x6e\xaa\xc1\x2e\xdd\x89\x62\x05\xb3\xea\x50\xaa\xac\xf3\x4f\xe6\x34\xac\x4d\x1d\xd8\x3f\x99\xcb\x59\x28\xb3\xae\x80\x25\x17\x5b\x51\x42\x8c\x99\x6b\x38\xaa\x91\xa5\xbc\x2a\x15\x93\xb6\xae\x11\xa6\x56\x86\x62\x61\x8c\xa5\xdd\xac\xb5\x0e\x3e\xf2\xcf\xdf\x25\x2e\x62\x22\xa6\x64\x7d\xce\xe1\xef\x23\x07\xe7\xfc\x9e\x4f\xe0\x94\x8b\xb1\xcf\x65\x56\xfb\xfe\x0c\x5f\xf9\xb0\xfe\xe9\xcc\x03\x03\x45\xde\x2d\xbb\xaa\x7c\xd9\x9d\x6a\x97\x99\x83\x39\x1e\x86\xcf\x61\xa4\xa0\xcc\x2c\x80\x7b\xb5\x0b\xbb\x7c\x0a\xdd\x30\x00\xb6\x5b\x7a\x84\x9d\xc3\x08\x08\x19\x7a\xb5\xec\xb5\xe1\x1e\x1b\xae\x8d\xe1\x27\x7d\xfb\x75\x97\xcf\xc9\xdf\x47\xf7\x7d\x7e\xe2\xdd\xbd\x8a\x88\xbd\x46\xeb\xeb\x0a\x6a\x75\x51\x79\x3e\xd5\xb8\xa7\xcd\x74\x75\xfd\x1b\xeb\x87\x1f\x1f\xa3\xd7\xce\xeb\x08\xf0\xdd\x46\x4e\x61\xe0\xba\xd1\x5a\xb9\x63\xa1\x04\xaa\x3d\x26\x66\xd0\x8e\x59\x4f\x0d\xa3\x50\x70\x14\x64\x3d\x74\xde\x43\x27\x47\x9e\xe2\xa7\x3a\xd5\xca\x3b\x5d\x85\x2d\x17\x82\x55\x94\xb3\x19\x82\xca\xc8\x80\x33\x64\x5d\xab\xfb\x0c\x39\x6b\x55\x93\xcf\x1a\xa3\x46\x94\x95\xd2\x38\x74\x23\xac\x09\x62\xbe\xe3\x1a\x56\xc1\x2b\x5e\x35\x90\x02\x8c\x8c\x74\xb0\xb4\xd2\x55\x16\xa1\xa6\xf5\x06\x42\xc7\x42\x41\x8f\x79\x62\x75\x4c\xa1\xd0\xde\xea\xc3\x8e\x8e\x52\x29\xaf\xbc\x74\x36\x49\x52\x40\x81\x7a\xd7\xe5\xbb\x24\x4b\x7e\x7d\x72\xcf\x01\x77\xa7\x4e\x46\xb4\x29\xbc\x7d\xc1\x47\x7d\xfc\x72\xf7\xae\xfb\xea\x41\x09\x64\x19\xca\x1c\x07\x52\x00\x11\xcc\xb6\x15\x5d\x57\xe8\x1d\x03\x25\x0d\x43\xbe\x3b\xd8\x4c\x3f\x27\xfa\x18\xfc\x08\x36\xa7\xd6\x63\x61\x99\x12\x2e\xc9\x23\x9e\x98\xe4\xbb\xe4\x2f\xcf\xb3\xd7\xf3\xd4\xbc\x4c\x5f\x80\xfc\xf1\x49\x3f\x71\x2f\x7e\x3c\xbd\xf6\xee\xed\x6b\xe7\x95\x73\x8d\xfc\x86\xe9\x76\xd9\xa4\x8a\xf5\x54\x41\xc5\x11\x2a\xc3\x14\xda\x0a\x58\x50\x15\x8b\x4b\xd1\xd2\x1f\xfa\xe3\xee\x91\x62\xe9\xa9\x80\x8a\xd6\xe8\xb8\xc7\x0d\x15\x90\xa0\x58\xa6\xb4\x5a\x76\xb8\xb1\x52\xfb\x6c\x6c\x9d\x34\x4d\xbe\x0b\xd8\x2e\x9b\xb0\x85\x1e\x32\x73\x7c\x90\xf5\x08\xda\xd6\x1d\x7f\xea\x77\xc7\x1f\x3a\x2b\xbc\x34\x1d\x68\xdb\xc5\x63\xa6\x18\x11\x98\x2a\x16\x75\xd8\x8e\x75\x0f\x8e\x3a\x0c\x3f\x24\x7f\x15\x75\x58\xce\x75\x0f\xb8\xac\xa8\xcf\xb1\xfa\x01\x2f\x52\x44\x17\x43\xc8\x1f\x56\xeb\x8f\x59\xba\x7a\xf8\x5b\xf0\xf8\xea\x07\x99\x5b\x0c\x53\xfe\x54\x84\x59\x7b\xa4\x34\xe9\x5d\x91\x5a\x58\x2f\x88\x41\x07\x79\x56\xd8\xb2\xca\xaa\x80\xca\xb4\x0e\x49\x07\x1a\x1e\xd4\xc6\x86\x82\x01\x0c\xca\x00\xd3\xa2\x9a\x29\xd7\x7d\x3e\x73\x69\xc3\x10\x78\xb0\x62\x9c\x62\xee\x8c\x31\x18\x19\x79\x4e\x7c\x53\xb7\xbe\xac\x51\x6d\xad\xb0\x5b\xde\x2a\x00\xc3\xec\x2c\x9f\x90\x15\x56\xb3\x28\x4d\x74\xe6\xaf\xea\x55\x7d\xc6\xd4\xfc\x73\xf4\x79\xbd\xae\x12\x7e\xd6\x5c\xef\x55\x82\xed\x5a\xf3\x7f\xf5\x78\xf7\xeb\xf4\xee\x6c\xa9\x77\xfa\xee\x41\x53\xd5\x9e\xc0\x14\x21\xd8\xd6\x35\x68\x16\x07\xc6\xbe\x0f\x4d\x07\xb0\x0e\xdb\xbe\x09\x73\xd3\x87\x9d\x04\x75\x17\x26\x60\x97\x29\xad\x83\x06\x76\xd9\x65\x43\x98\x41\xd1\x00\xb4\xd4\xf1\x5b\x6e\x31\xc2\x8c\x51\x8e\x31\xb2\x66\x6f\x67\x67\x5d\x33\x06\x1d\xc5\x85\xe4\x60\xac\x6a\x8d\xb6\x2a\xc2\xbb\x8c\x52\x4a\x1d\x03\x98\x8e\x78\x08\xb6\x6e\xf3\x29\xee\x5b\xbf\x3d\xf3\x2f\xd8\x49\x47\xf7\xe1\x33\x88\xc0\x4e\x70\x12\x7b\x5f\x7d\xd3\x58\x39\x6b\xe9\x82\xfb\xc7\xab\x95\xfa\xfe\x2e\x5d\x3d\x7c\xfe\xee\xb4\x5d\xdd\x9d\x23\xc4\xed\xfa\x3f\x3d\xe4\xc6\xdb\xbd\xda\xa6\x90\x81\x5a\x85\x8e\x3d\x0d\x5a\x30\xda\xec\xc2\x7e\x6c\x21\x72\x02\xbb\xa2\x0c\xbb\xd0\xd5\x8d\x37\x16\x76\xca\x89\x74\xbb\xc9\x12\xe9\xb9\x86\x96\x63\x5c\x3c\x27\x45\x30\xb2\xf3\xc1\x12\xe8\x20\x0e\x95\xad\xa8\x63\xc0\xd5\xae\xce\xa7\x3a\xf8\x51\x4d\xa0\x08\x83\x36\x2d\x90\xc1\x16\x95\xd4\x38\xf8\x2d\x84\x9c\xd6\xcd\x80\x10\xa4\xb5\x35\x1d\xac\x7c\x03\x8a\x7a\x17\xe4\x71\x41\x57\xae\xb2\xa0\x0b\xc5\xa4\x25\x48\x90\x76\xc8\x6b\x38\xb4\xb4\x71\xae\x2d\xbb\xc8\x61\x5c\xa5\x36\xee\xeb\xf5\xcb\x6c\xeb\xf1\x92\x55\x44\xad\xf1\xdb\x5f\x86\xf8\x7f\x3b\xdf\x4a\x6d\x5a\x39\x50\x0b\xcd\x99\x5a\xda\x34\x11\x82\x49\x68\x29\x3e\xd6\x44\xde\x81\x79\xd9\x75\xd1\xce\x75\x06\xea\xe0\x2f\x67\xb9\x68\x1a\xc5\xb9\xb2\xfa\xd0\x9c\xa4\x83\x4c\xf4\x20\x6f\xf3\x4a\x07\xe9\xbd\x0f\xcc\xfb\xe8\x03\xcd\xe3\xfe\x5a\x24\x7f\x7d\x76\x22\x8e\x3a\xfe\xef\x4f\xb3\xcc\xfb\xa8\x02\xf1\x36\x84\x7f\xfe\x72\x73\x1f\xc7\x73\x27\x8f\xb0\xff\x2f\x9f\x44\xee\xfd\x34\x0d\x95\x54\x4c\x30\x06\x19\x47\x23\x36\x66\x9f\x1a\xb0\xf5\x23\xac\x35\xa3\x6e\xd9\x82\xbd\x10\x4c\xd5\x9e\xd6\xa1\xf3\x61\xdb\x80\x21\xc0\x93\x99\x7a\x0f\xd8\x61\xbe\x9c\xe5\x09\x28\xc2\xec\xc2\x16\xd9\x1a\x06\xa5\x45\xd5\x42\x01\x08\x6a\x2a\x08\xc8\xce\xfb\x1a\x72\xca\xad\x3a\xb4\x42\x94\xbe\x64\x27\x03\x76\x97\x57\x2a\x18\x6b\x6d\x90\xd6\xda\x33\xa7\xc6\x45\xcf\x41\x98\xfc\x14\xe7\x32\x2c\xf9\xbf\x2e\x2c\xd8\xeb\xe6\x60\x79\xa2\x4a\x7d\x8a\xe6\xbb\x37\x67\x0f\x9b\x3f\xd4\x1a\xb8\xc9\xee\x1f\xbf\xd1\x89\x3b\xc1\xd6\x4f\xbf\x3f\xfa\x0a\x02\x45\x19\x77\xb0\x21\x75\xd0\x83\xb2\xa5\x31\x5d\x4d\x8e\xa5\xf0\xc0\xb0\x41\x2c\xdf\xe1\x6e\x62\xec\x39\x29\xa5\x11\x8a\xd7\x22\x43\xb2\xb1\x13\x0b\xb3\xed\x77\x6c\xf2\x0e\x94\x96\x05\x45\x0e\xfb\x48\xb6\x8f\x2d\xb9\xa7\x8e\x1d\xef\x30\x02\x9b\xc0\x66\x33\x00\xe9\xc0\xc4\x96\x09\xd0\x9a\x4b\x26\x05\x10\xd7\x98\xf6\x06\x24\x4b\x61\xd5\xce\x32\xe2\xb8\x3c\x56\x00\xac\x61\xca\x79\x29\x14\x53\x32\x62\xa0\xe5\x4a\xbd\x93\xc9\xfb\xf3\xbc\xea\x5f\xa2\xa6\xe8\xb9\xda\x7f\x55\x45\x3d\x1e\xab\x37\xee\xea\x65\x94\x2d\x03\x8f\xf7\xb7\xef\x1f\xef\x6f\xc1\x1f\x79\x4d\x03\xea\x41\x1d\x11\x09\x3e\x4c\x3e\xf4\x29\xe2\xbc\x26\x35\xad\x71\x2f\xbd\x04\xac\xef\xfb\x6c\xf8\x83\x1f\xad\xb6\xd6\x5a\xeb\x8e\x81\x68\x7a\xda\x28\x59\xf8\x42\xed\xc2\x38\xe0\x01\xc8\xb4\x0b\x7d\xdf\x87\x6e\x1c\x53\xff\xfa\xda\xd0\xbf\x7d\xed\xa4\xf9\xc3\xd6\x2c\xdf\x27\xff\x7a\xba\xd3\xd7\x9a\x2e\x8f\x77\xeb\xef\x4f\x6a\xaf\xef\xd6\xd7\x2f\x7c\xf9\x7c\x32\xa2\x38\xbe\x70\x0a\xce\x11\x96\x16\x37\xf8\xf8\x25\x02\xbd\x3e\x82\xcf\x8f\x51\x26\xe7\xd3\x6d\x8a\x3d\xce\x7b\x33\x8a\x06\x6e\x98\xa0\x0b\x2e\x0a\x50\xb8\x50\x8b\x1d\x83\xf9\x68\x46\xe1\xe1\xc0\x65\x55\x2f\x04\x50\x1b\x0a\x1e\x12\x0c\x84\x0a\xad\x01\x28\x78\xd3\x33\x90\x58\x65\x18\x20\xdd\xcc\x05\x07\x10\xd8\xaa\x08\x5d\x89\x55\xbe\x47\x34\x90\xa1\x76\xb5\x9a\x4d\x05\xcd\x2c\x48\x55\x07\x34\x20\x87\x30\xdb\xbb\x4a\xed\xbb\x5a\x57\x74\x27\x5b\xc9\x9d\xd4\xb0\xd4\x88\x6c\x09\xb6\x3e\xec\x11\x2a\x58\x81\x4e\xb1\x29\xce\x24\xfd\xaa\x8c\x2a\xbd\xf8\x92\x55\xdc\xc6\xe7\xf6\xf1\xee\xc3\xd9\x3a\x31\x76\x46\x61\xa4\x9c\x9c\x44\x52\xde\x25\xf1\xc3\xdf\x1c\x2b\xba\xd8\x55\xce\xee\x3e\x7f\xf9\x2d\x78\xb7\xbe\xb0\xda\xd3\x29\x70\xf7\x6e\xf4\x07\x45\x59\xea\xb9\x02\xfb\x65\x64\x0d\x28\xa9\x2b\x6d\xe8\x9e\x13\x5b\xb3\x20\xc2\x20\xc0\x7e\x1b\x2a\xce\x81\x01\x5b\xab\x96\x81\x09\x08\x9a\xba\x0c\x75\xaa\x0a\x98\xc2\xd6\x4a\xa1\x74\x6e\xe6\xe3\x53\x31\x57\x42\x73\x12\x60\x98\x61\x45\x4d\x3d\x0a\x4a\x01\xf6\x61\xc6\x8e\xcd\x40\x20\x3b\x36\x84\x31\x12\x5a\xae\x95\xd8\x04\x47\x98\x16\x27\x8f\xa6\x8c\x3f\x8b\xb5\xcd\xfd\x0b\x3e\x25\x01\x67\x6d\xf4\xf7\x67\xc4\xf4\xf1\xeb\xba\x30\x4f\x1b\x1f\x93\xf8\xcb\x91\xfb\x27\xee\x5c\xde\x06\x05\x92\xc5\xcc\x8b\x02\x65\x72\x99\x63\xd9\x38\xcb\xfc\x9b\x2b\xc7\xa1\x37\xc3\xf9\xcb\x7e\xfd\xf0\x82\xed\x4a\xc0\x37\xb3\xb9\x17\xb2\x5a\xda\x81\x39\x9a\x08\x45\x19\x4e\xf2\x75\x9b\x92\x40\xc0\x10\x8a\xde\x13\xe1\x19\x67\xa0\x5a\x35\x4a\x33\x05\x1d\xe5\x87\xd9\xfb\x0b\x3d\x2d\xb7\x52\x1a\xae\xb8\x39\x7e\xd9\xa0\xae\x3b\x24\x59\x29\x79\x03\x48\x68\x96\x0d\xe3\xc7\xed\x0d\xee\xd2\xcd\xc8\xc2\x4c\x93\x2c\xa1\xd1\x3f\x14\x27\x7f\x77\xae\x9c\xa2\xf3\xdf\xfb\x93\x11\xcd\x99\x6e\x92\xc5\x50\x95\x66\x2f\x34\xc2\x97\xe8\xbe\x7a\xed\xf0\xdd\xdf\x7c\xca\xee\x1e\xef\xd6\x3c\x90\x92\x48\xe6\x54\xc3\x31\xac\x2b\x5b\x4b\x6e\x94\x6e\xf9\xa0\x55\x79\x50\xde\xb9\x1c\x36\x3d\x42\x9a\x93\xa7\xf6\x24\x7c\x55\x2f\x5b\x37\x4b\xe0\x82\xca\xb5\x0b\x7e\x1a\x40\x89\x83\xdd\xed\x78\x8b\x76\x0e\x14\x56\x19\xdb\x00\x06\x5c\xa8\x83\x0c\x13\x07\x18\xa8\xb4\x16\x82\x60\xca\xe5\x5e\xdb\x2e\x30\x9e\x16\x61\x1c\xe2\x7d\x4d\xe1\x33\x8b\xdc\x84\xbf\x79\x51\x99\xfe\x70\x35\x70\xfb\x96\x9b\x71\x72\x8a\x5d\xdf\xfd\xf4\xf0\xee\x5a\xdc\x24\x1f\x3d\x02\x15\xe0\x4c\xab\xb0\x49\xeb\x65\x62\x9e\x33\x28\x05\x8f\x08\x11\xd7\x2a\xd0\xc3\x94\xf3\x9d\x03\xdb\xce\x2b\xd7\x2e\x8d\x69\x5a\x3d\xe4\x5d\x4d\x36\xc6\x21\xc2\x1b\x17\x86\xb3\x9e\x79\xed\x1a\xc2\xd4\xd8\xd4\xbd\x5d\x06\xd3\x98\x4e\x2b\x3a\x19\xe5\x92\x3c\x6d\x63\xdf\x74\x48\xee\x93\x3a\xf9\x0f\x91\x1d\x17\x1d\x48\x7e\xf9\xbd\x5e\xec\x48\xde\x5d\xeb\x17\xac\xb0\x86\x33\xa8\x98\x10\x61\x07\x9a\x20\xa8\x8e\x90\xe9\x3a\xaa\x94\x6c\x38\xe7\x40\x95\xa9\xe8\x8d\xf7\xca\x0e\xa2\x4b\x27\xef\x94\x69\xf3\x41\xc0\x4e\xba\x1a\x29\xef\x42\x27\x39\xf4\x35\x05\xd8\x79\x8e\x6a\xeb\xbd\x92\x66\xd9\xb0\xee\x58\xf6\x49\xaf\x9c\x7b\xd5\x5d\xe0\xab\x2a\xf9\x21\x81\x67\xdd\x85\x7f\x3c\xc7\xc8\xf5\x6b\x2c\xbc\x39\xcf\x71\xee\x2e\xfb\xff\xea\x43\x9a\x9d\xa4\x4f\x7f\xfc\x0e\xc4\x7e\xdc\xc9\x2d\xe4\xfd\xa7\xc7\xfb\x9c\x3b\x92\x76\x04\x0d\xc2\xc1\x81\xf1\xaa\x5e\x5a\x5c\x73\x33\x1d\x1c\xa8\x10\x36\x9c\xce\x0b\x06\x7b\x4f\x98\x12\x55\x18\x83\xc6\x40\x8b\xb0\x95\xc8\x21\xb9\xe2\xc1\x39\xb7\xd9\xac\x2a\xd4\x1e\xec\xa6\x3b\xfe\xac\x4b\x07\x49\xa5\x9c\x21\xa5\x5c\x1a\x87\x50\x30\x61\x5b\x95\x96\x93\x86\x00\x0d\x58\xd8\x85\x06\x01\x01\x20\x0c\x89\x4e\x75\x94\x3b\x4d\x72\xb0\x7f\x16\x11\x87\xf0\x27\xc9\xfb\x58\x65\x27\x67\xf4\xe5\xf1\x01\x7d\xed\x08\x7f\x48\xb3\x78\x7a\xfe\x10\x99\x76\x8c\x39\xa5\x41\x91\x8e\x04\x02\x7e\x90\xa0\x81\x08\x28\x2f\x14\x40\x07\x98\x42\x1d\x84\xa9\x5d\xad\xf3\x3d\xda\xd8\xa7\x39\x83\xee\xb8\x76\xb9\xb2\xce\x29\x11\x4c\x1d\x68\xe8\x9d\x03\x06\xe8\xd0\x85\xb6\x06\x0a\x90\xb3\x3e\x62\x9b\xeb\xc8\xf9\xab\x5e\x78\xbc\xff\x7c\x9a\x5e\x5d\x5c\x77\xbe\xd5\x2a\xfa\x86\xa6\x1c\x73\xec\x1f\xaf\x49\x45\x3f\xbc\x5f\xa7\x0f\x9b\x74\xb3\xa0\x4c\xa7\xbb\xa5\x3a\xe0\x8c\x85\x9e\x2a\x46\x20\xe7\x75\xb0\x99\xcd\x74\xb0\xc7\x95\x03\x95\xac\x83\x5f\x0a\x2b\x94\xd6\xa9\x91\xd4\x62\x09\x7a\xab\xad\x72\x69\x63\x99\xa5\x26\xd7\xce\xb9\xc1\x2d\xfa\xb4\xc0\x53\xe5\xdc\xa2\x4e\x6d\xdc\x54\x0b\x1a\xba\x4e\x6d\x66\xeb\x59\x63\x09\x0d\x7d\x27\x26\x90\xec\xc2\xcc\x40\xb1\x4f\x92\x34\x1b\x23\x3f\xac\x49\xaa\x58\x1b\x5f\xf0\x1a\x17\x69\xfb\x9b\xb3\xe3\x5c\xf6\x6b\xf0\xe9\x66\x65\xf9\xce\xcc\x24\x6c\x01\x3e\x16\x25\x1e\x48\x13\x94\xde\x9b\xad\xd8\x00\x12\xc6\x51\x4e\xa0\x72\x80\xb8\xb6\x0d\xc8\xed\x36\x7e\x97\xe1\x1d\x07\x67\x1f\x5b\x1b\x67\x65\x38\xf9\xe1\x3c\xfb\xfc\xef\xaf\x8a\xe7\xaf\x22\x0a\x5f\xee\x1f\x3f\x7d\xfe\x46\xc7\xfc\xa4\x5d\x78\xfe\xef\x3a\x3a\x9f\xc3\x77\xbe\x7a\x80\x60\xf0\x35\x98\xb8\xe9\xb9\xb0\x7d\xd8\xa1\xc1\x29\xc3\xba\x1d\xdc\x6a\x1a\x9a\x0a\xaa\x94\xa6\xc3\x42\x7c\x34\x55\x53\x34\xcc\xa1\x8f\xe3\x9c\x64\x49\x98\xb6\x1a\x3a\x87\x0e\x5d\x16\x65\xdb\xc3\x14\x7a\x94\x36\x2b\x5c\x4a\x6b\x04\x35\x98\x08\x62\x6a\x5c\xd7\x8d\xc5\xc1\x33\x8e\xeb\x1a\xd4\xa1\xb4\xdb\xa0\x4c\x0d\xa5\xe1\x96\x08\x56\x39\x48\x6a\xcb\x8d\xa8\x0a\x9b\x24\x59\xba\x79\x26\xeb\x7e\x95\x9c\x3f\xe9\x09\xdf\xff\xd6\x7d\xf1\xe2\x68\x74\xf7\xd3\x43\x76\x76\xed\xcd\xb7\x75\x05\x9a\xc0\xb0\xb0\xcc\x6a\xd5\xee\xd5\xd2\xfb\xb9\x75\xf5\x76\xc3\x40\x5b\xc1\xcd\x89\x7d\xb5\x4a\xa8\x58\xb8\xe6\x5c\x30\xc5\x14\xb3\x7b\x60\x02\xae\x91\xa6\x98\xe5\x03\xc1\x61\x36\xe6\x78\x44\xcf\x14\x1c\xe3\xd9\x94\xfc\x45\xc4\xc0\xff\xbc\xfa\xf3\x37\xc6\x13\xe7\x5c\x39\x53\xa0\xb9\x60\x1e\x3d\x98\x82\xc0\xe9\xe4\xe7\x99\xd9\x68\x2a\x41\x96\x7a\x16\xd2\x30\x95\x4b\xa5\x6c\x6b\x6d\x1b\xaa\x63\x9a\xee\xcf\xe2\x57\xac\x96\x56\xc4\xf7\x70\xf2\xab\xec\xe2\xfc\x00\x26\x1f\x93\x2f\xc9\xff\x88\x3a\x70\xf1\x9e\xde\xdc\xdd\x7e\xeb\xb7\xf8\xf9\x57\xe0\x23\x78\x55\xd9\xbd\xe4\xeb\x67\x9b\xd3\x2f\xaf\xf9\xfa\x7f\x00\xd7\x09\x7b\x66\x59\xd8\x87\x26\xc5\xcb\x90\xb2\x42\x3b\xac\x2a\x43\x30\x2a\x03\xae\x84\xd6\xa0\x0d\xbb\x8b\xa7\xda\x8a\x13\xd7\x73\xbe\x2b\xa5\x91\x9a\x15\x98\x67\xb5\x74\x66\xcb\xec\x5c\x76\x3b\x32\xfa\x06\x40\x43\x83\x22\xf9\x64\x60\x49\x97\x89\x85\x6e\xa8\x7c\xc5\xda\x7d\x2f\x87\x74\x04\xba\x0c\x9c\x85\x49\xa4\x45\xd8\x71\xcb\xf8\xb8\xe9\x88\x22\xed\x7e\x29\xad\x8c\x49\x7a\x6d\x4b\x4d\x5c\xcd\x3d\x39\x86\xe9\x77\x71\xdd\x9b\xd8\x33\x3c\x3e\x61\x7f\x1b\x99\x08\x57\x5a\x4c\xb7\x67\x2f\xaf\x68\x37\x11\x47\xe0\xef\x6e\x8f\x2b\x3f\x56\x29\x27\x96\xf9\xf1\x97\xc0\xed\xf7\x9f\xee\x1e\xd7\xc6\x7f\xc5\xbe\x5b\xb9\xc0\xc1\xc6\x3f\x71\x0f\xb6\x45\xc0\x19\xdb\x17\x01\xe6\x6d\x18\x19\x0d\x33\x0a\x13\xdf\xa2\xb0\xe9\x32\x7a\xe8\xd3\x01\x81\x22\x9f\x4e\xb2\x15\xcf\x89\xd5\x07\x85\x70\xe6\x4b\xa9\x35\x87\x4b\x0d\x28\xa1\x66\x2b\x14\xb5\xc1\x6b\xb0\xe5\xf5\x39\xdf\x14\xe7\x1c\x64\x95\xfc\x5d\xf2\x18\xd5\x26\x2f\x0a\xa6\xb7\x77\xdf\xbd\xff\x26\x1b\x79\xf8\x99\x6c\x04\x9c\x8b\xca\xd5\xa7\xef\xd7\xe5\xea\xe1\xbf\xa6\xa7\x55\xf5\x4e\x45\xa1\x05\x20\x02\x2b\xa9\x64\x5e\x35\x14\x55\xc7\x9c\x44\x70\x25\x85\x66\x56\x98\xea\x60\x8e\x39\x49\xd9\x3c\x27\x2e\x18\x07\x0a\x57\x04\xc6\x9b\x16\x4f\x52\x48\xae\x56\x98\x52\xc6\x68\x6b\x43\xfb\x9c\x8c\x00\xe3\xa0\xe6\x2e\x26\x26\x93\x14\x5a\x19\xc0\x40\x1b\x50\xb0\xc7\xbc\x04\x01\x91\x96\xce\x85\xfd\xd2\x80\x5d\x28\x52\xb5\xdd\x17\xc1\x38\x8d\x5c\xeb\xb8\x96\x51\x00\x37\x4b\x4c\xca\xd6\x5d\xde\x26\xb7\xe7\x67\x24\x8d\xbc\xe6\xbb\x9b\xef\xaf\xd9\xbd\xc7\x90\x7e\xfb\x22\x17\x7e\x91\xeb\x51\x45\x27\x18\x4e\x1b\x82\x61\xe1\x0a\xde\x18\xf2\xb5\x4b\x9b\x30\x5b\x5d\x46\xdb\x00\xef\xc2\x9c\x23\x2b\xa5\xd0\x79\x1d\x5a\xa9\x48\xbb\x0b\x8e\x10\x5b\xf7\x8a\x48\x50\x2a\xb3\xab\xa0\xe1\xc4\x56\x10\x14\x9a\x0a\x75\xc2\x6a\xaf\x12\xf2\x4c\xd7\x7d\x5c\x33\xa7\x4a\xf7\x5f\x5e\x57\xcc\x1f\x2a\x66\x9c\x77\x9c\xd5\x05\xac\x79\x12\x4c\xbc\x56\x4b\xbc\x2d\x57\x0f\x1f\xdf\x3f\xde\x9f\x75\xc8\x24\xd8\xb9\x69\xa2\x42\x72\x28\x24\x0a\xd5\x52\xa6\x76\xd1\x99\x67\xd8\x23\x7a\xd0\x19\xef\x1c\x28\x40\x6b\x2a\x5f\x2b\x1e\xaa\xa0\xbb\x3e\x0c\x0a\x54\xc5\x70\x59\x49\x81\x0f\x83\x0b\x46\xf3\xb2\xa9\x04\xe0\x7b\xe7\xb4\xa5\x5e\xd5\x2e\x68\x58\x33\x5f\x6f\x09\x66\x02\xf4\x3a\x58\xa7\x14\x20\xe2\x58\xc7\x29\x70\x8c\x03\xbb\xe4\xfb\xe4\x77\x17\xd4\xcb\x09\xf5\x7d\x51\x0b\xfa\xfc\xe3\xb9\x82\x79\x7d\xe7\xd7\xdb\x68\x9a\x18\x58\x83\xa1\x5f\x14\x49\x69\x13\x34\xe2\x54\x32\x21\xd9\x66\x05\x83\x46\x03\x28\x48\xe1\x2b\x82\x42\x13\x26\x9e\x76\x8c\x72\x5b\x79\x5c\xe7\x3b\x82\x6a\x13\xf8\xce\x0e\x80\x21\xc6\x95\x64\xd4\xa8\x2a\x88\xba\xc4\x0a\x7b\x5c\x63\x99\x92\x30\x12\x5a\xe9\x0a\xc6\x6b\xdf\xa6\x68\x2d\xf2\xe9\x0a\x25\xff\x47\x79\x9b\xed\xbb\x7e\xd9\x80\xcd\xd7\x04\x6c\x96\x29\x9b\xc3\x10\xc8\x99\xc7\x4f\x1c\x40\xf9\x64\x55\x60\xa0\x53\x4a\xa9\x88\xb9\x69\xdb\xe3\xb5\xe0\xcf\x28\xfa\x58\xfc\xb7\x88\x2c\xbd\xce\xf0\xbf\x4d\xf0\x3f\x7d\x89\xea\x12\xeb\xbb\x6b\xb1\xa1\x1f\x3f\x7f\x89\x82\x52\xdf\x1d\xd3\xd0\x4b\xea\x0f\xd6\x1f\x3e\x7f\x59\xeb\x00\xab\xd3\x93\x25\x48\x0d\x2d\x14\xcc\x58\x33\xb2\xc9\x98\xf2\xd0\xee\xe8\x3e\xdd\x86\x96\x80\x06\x7a\x82\x39\xe6\xdd\x73\xc2\xf7\x36\x4c\xb8\x6e\xab\xd6\x49\x96\xed\x7c\x5f\x23\x43\xc9\x21\xa1\x3b\x81\x72\xec\x82\x1f\x7b\x90\xe0\xd0\x6e\x37\x7b\xb4\x75\x20\xf1\x5a\xbb\x16\x08\x20\x83\x68\x8d\x69\xa7\xa6\x82\xa6\xae\x2d\x35\x98\x2b\xce\x43\x3f\xf3\x0e\x94\x63\x5a\x1a\x83\x10\xe7\x62\x61\x8a\x31\x75\xe2\xbd\xe1\x75\xbb\x2a\xa3\xc7\xdf\x43\xf2\x4f\x51\x21\xec\xc3\xbb\xf5\x99\xab\xf8\x90\xaf\x4e\xde\x93\xf7\x27\x06\xce\xb9\x1c\x8b\x52\x51\xe7\x16\xf2\x99\x87\x79\x85\xc5\x3e\x55\xb5\x3f\xe4\xc8\x39\x0d\x20\xa8\xb5\x1d\x4c\xc3\x9e\x93\xb0\x57\xa1\x61\xa0\x66\x4a\xd5\xbb\xa0\x3d\x35\x1e\x53\x06\xaa\xbc\x02\xc5\x8e\xcc\x73\xd8\xf8\x0a\xa6\xdc\x6c\xf6\xa0\xa6\xc1\x85\xe9\x39\x09\x0d\x01\x70\x23\x39\x21\x0a\xd4\x80\x6e\x54\x48\x50\xa5\x57\x25\xda\xb0\x0a\x59\xd2\x8e\x4c\xc3\xea\x18\xf1\x89\x2f\xb4\x1a\x50\xdf\x3d\xed\x33\x4a\x48\x03\x4a\x43\xb9\x53\x84\x40\x54\xdb\x4e\x32\xe4\x89\x96\xcc\x12\x42\x18\x82\xda\xcd\x42\xa3\x92\x27\x09\x38\x61\x1b\xc0\x36\xf9\x70\x5c\x4f\x9f\x1f\x3f\x9d\x3b\x17\xaf\xfc\x87\x2f\x77\x32\xad\x8a\xa6\x00\xdb\x06\xcc\xa1\x68\x42\x41\x02\x25\x80\xe3\x50\x00\x76\xac\x9a\x8d\x71\x91\x01\xdb\x22\x5f\x8f\x71\x6f\x6d\x8f\x35\xf3\xaa\x4a\xfe\x2c\x29\x93\xef\x2f\xba\xdd\xe0\xca\x3e\xfb\x53\x16\x97\xed\xcd\xc9\xd7\x20\x42\xa7\xbe\x9c\xd1\x39\x31\xae\x7d\xb8\x39\x29\x94\x01\xd3\x94\x15\xa8\x7c\xd8\x34\x5d\x19\xd7\x2f\x0a\x9b\xd5\xe4\x97\x81\x4f\x4a\x33\x5c\x78\xe8\x43\x2b\xb7\xb6\x99\xdc\xb4\xaa\x6a\xce\x9e\x98\x31\x79\x77\x5c\xec\x87\x3d\xe0\x69\x77\x18\x64\x90\x08\x16\xd8\x90\x0d\x61\x3c\x6f\x5d\xa0\xa0\x3f\x1e\xd1\x97\x8e\xad\x75\x3e\x45\x75\x38\xfa\x86\x8b\xf6\xe2\x45\xb7\x8a\x26\x62\x7f\xfa\xe2\xe2\xf1\xdd\xcd\x7d\x0a\x1e\x92\xf7\xf7\xd9\x87\x37\xde\x37\xab\xd3\x4c\x2a\xa6\x01\xb7\x06\xb4\x2e\x6e\xec\xbd\x5b\xa0\x03\x7d\xe0\x39\x1c\x1c\xb0\xa5\xea\x98\x2a\x35\x43\x18\xef\x8b\xc0\x24\xb0\xc5\x60\xab\xd0\x08\xa9\x64\xc5\x35\x0f\xa4\x02\x93\xe4\xa1\x4a\x7b\xe5\x72\x25\xa5\xd5\x7b\x65\x40\xa2\x61\x34\xd0\x72\x61\x8e\xa2\x3e\x3b\x40\x16\x14\xb6\x12\x24\xa9\x0d\x85\x26\x3d\xa1\xa5\x2d\x2b\x4b\x2c\x76\x98\x68\x2b\x78\x7d\xe1\x74\xea\x75\xb3\x2a\x92\x5f\x9d\x3d\x40\x8e\x11\xee\xbb\x63\xdd\x78\x6e\x61\x9c\x67\xef\x27\xac\x51\xf6\x31\x7b\x35\x92\x7a\x7f\xbc\x37\xe7\x63\x95\x4c\x60\xc4\x14\x77\xf3\xa6\xe7\x14\x6c\xbb\xa5\x4f\x1d\x2c\x3d\xcc\x68\x17\xcc\xc6\xe0\x63\x5a\xa8\xad\x1f\xe9\x99\xfa\x5d\x86\x3d\x68\x00\x0e\x63\x36\x84\x5e\xfa\xb2\x0a\xd2\x39\xe0\xa0\xeb\x40\xe1\xb8\x80\xde\x2d\xb3\x07\x4a\x72\xca\xad\x64\x5a\x04\xf6\xaa\x5d\x75\xf6\xc1\x65\x6b\xb6\xa2\x51\x3b\xe1\x9f\xce\x9d\xc3\xff\xfd\xe7\x2a\xc8\x1f\xa2\xed\xdb\x2f\x36\x8e\x1f\xd7\x0f\x9f\x57\xc7\xec\xfd\x36\x5a\x09\xfe\x01\xff\xb3\x77\x68\x85\x51\xdd\x20\x5c\x33\x42\x8a\x2a\x14\x82\xa2\x61\xe9\xd3\x44\x08\x4c\x2b\x81\x50\xf0\x3e\x0c\x1e\x4c\xcb\x1e\xa9\x29\xf3\x98\xd2\xbd\x0f\x2d\x61\x6d\x64\xa7\x4d\x40\x1e\x86\xcb\xd9\x8a\x56\xf2\x50\x4c\x6d\xe1\x0a\x31\x64\xa4\xc6\x58\xcb\x85\x44\x58\x33\x11\x91\x15\xb6\xcd\x8e\x7b\x9b\x74\x3d\x82\xd4\x7b\x4e\x02\x3e\x86\xdf\x56\x29\x15\xb9\x91\xe4\xcc\x01\xba\x72\x97\x89\x9d\xf3\xf5\xcd\xd9\xd4\xf7\xad\x5f\xd0\xcd\xdd\xfa\xee\x4f\xc1\xbb\xf5\xea\x01\xfe\x57\x70\x02\xf9\x67\x32\x2f\x8c\x2f\x5b\x7f\xd8\x57\xa3\x03\x10\x6c\x02\xba\x1c\x4f\xfb\xd4\x06\x09\xd3\xa4\xa6\x82\x84\xb1\x02\x25\x21\x70\x99\x29\x70\xa1\xcc\x9d\x3b\x6c\x0b\x57\x3e\x27\x33\x71\x65\x26\x86\x61\x99\x87\x65\x86\x4d\x06\x03\x1c\xc2\x2e\xec\x64\x59\x78\x68\xb7\x60\x3b\x5c\x70\x5c\x34\x1f\xe3\xac\xf9\x21\x6a\x08\x1f\xab\xa6\xc8\xdc\x7c\x73\x7f\xee\x4b\xf0\x90\xdc\xdc\x83\xbb\xdb\xbb\xdf\x80\xf3\xda\xfa\xfc\x02\xfd\xb8\x3a\x03\xaf\x79\xcc\x8f\x8f\x77\x39\xde\x79\xe0\x70\xdd\x72\x5e\x2b\x49\xcb\x6a\x0e\xad\x02\x68\x77\x02\x40\x79\x4b\xa8\xa0\x8e\x69\x09\x8c\x25\x54\x32\xc7\xad\x04\xd6\x12\xa6\x98\x11\x5e\x2d\x2c\xeb\x02\x1f\xdb\x2a\xe8\x50\x61\xe0\x82\xcd\xa6\xfd\xfe\x30\xf6\xae\xf4\xa5\xf4\x29\x5f\x60\xd8\x2a\x90\xa4\x0e\x08\x07\x91\x91\x42\x30\xa7\xac\x47\x46\x70\x79\x39\x13\x92\x3a\x65\x03\x73\x13\x84\x5a\x52\x8f\xf7\x31\x27\x7b\xc6\x51\xbf\xf4\x6f\xa3\x96\x6c\x72\xba\x07\x6f\xed\x38\x5f\x40\x2d\xc7\x2d\x20\xe2\x59\x4e\x32\xee\xaf\x36\x50\x6c\xa5\x0f\x94\xe7\x4e\x35\x51\xcb\x9b\xa0\x65\x5f\xc1\xa1\x11\xbe\x17\x83\x38\x06\x7e\x84\x09\xcf\xc8\xa1\x66\x9c\x81\xba\x7d\x4e\x5c\xce\x9e\xba\xe3\xb1\x4a\x16\x2f\x97\xed\x54\xba\xd2\x00\x89\x6b\xc2\xa5\x20\x8c\x48\xee\x10\x0a\x3b\x0b\x34\x46\xae\x69\x41\x5c\x53\xc9\xc5\x67\xe7\x98\xe3\xdf\x9f\x91\xe5\x97\x4a\xeb\x32\x36\x7c\x89\xc7\xc7\xdd\xfb\xf1\xd3\x97\x2b\xa0\xd0\xe3\xdd\xfa\x64\xed\xe0\xc0\xce\x03\x6a\xb5\x68\xba\xb4\x5a\xe0\x94\x0e\xee\xe0\x5c\x18\xc8\xd8\xbb\x79\x49\xd2\x39\x54\xe9\x14\x5b\x4a\xbb\xc3\x88\x33\x75\x70\x39\x37\x46\x4a\x25\xbd\xb1\x66\x49\x18\x4b\x6b\x63\x09\x23\xc6\x5a\x4b\xa8\x5d\xb6\xbe\x32\x61\xef\xfd\x19\x1f\xd0\x44\x3d\xdb\xf7\xc9\xaf\x62\xfd\xf1\x56\x87\x3b\x5f\xbd\x0a\x32\x1e\xa3\xd4\xf7\xaf\xc4\xcd\x38\xb2\xbd\x7f\x97\xc7\x54\x2d\xdb\x32\x72\x96\xdb\xae\x6a\x04\x18\x50\x20\x11\xfb\xd0\x04\x27\x77\xa1\x65\x40\x06\x92\x15\xa8\xf0\x35\x90\x08\x6b\x41\x41\xbd\xf0\x4d\x9a\xb0\xa5\xdb\xd6\x26\xe8\x63\x66\x96\x8c\x0b\x5d\x11\x26\xc3\xd0\x75\x80\x20\x14\xb6\xc2\x59\x27\xb5\x1a\xa4\x95\xa1\xd3\x4d\xe9\x34\x25\x4c\x2a\x37\xf3\xc6\x02\xb9\xd9\x62\xcb\x23\xac\xf1\xac\x99\xd7\xe5\x9b\xe4\x4f\x93\xef\x2f\xdc\xb9\x4b\xdf\x36\x76\x2a\x4e\x46\xcd\xdf\xcc\x9b\x5f\xe6\xb3\x27\x4d\xfc\xcf\x60\xe7\xa9\x70\x8c\x31\x50\x01\x96\x17\x9b\xaf\x4d\x36\x1f\x9c\xf7\x65\x99\xa9\x65\x2e\x52\xb5\xec\x7b\x20\x49\x10\x1b\x13\x0a\x0e\x7a\x15\xca\xb4\x2e\xa2\x6b\x65\x9b\x6f\x50\xd3\x3c\xed\x32\xcc\x99\x07\x10\x54\x61\xef\x9c\x0d\x1b\x04\x2b\xeb\x2b\xd7\x12\xcf\x40\xb2\x95\x8e\x3b\x87\x0a\xcd\x88\xbc\xaa\xa7\x6c\xde\x24\x7f\x79\xee\x81\xfe\x43\x92\xbc\xce\x5a\xaf\x3c\xe0\xcf\x44\x91\x1f\xcf\xe8\xcb\xe3\x42\xce\xfe\x60\xc0\x0a\xa4\xe6\x8c\x34\xdb\xb0\x9b\x7a\xe6\x25\xf6\x30\x4c\xa1\xa9\x5b\x6f\x1c\xec\x94\xe3\x60\xce\x64\x30\x60\x38\x20\xa0\x43\xd7\x92\xda\x41\x72\x3d\x44\xcd\x50\x59\x09\x79\x4c\xe9\x20\x72\xa8\x9d\x90\xa2\xe8\x34\x31\x75\xfb\x7a\xe0\xee\xd0\x38\x97\x89\xc5\xd8\x16\xb5\xee\x7a\x4c\x9a\x27\x36\xf2\x83\xba\xe4\xfb\x58\x2b\xfd\xe3\x59\x6d\xf1\xdb\x6a\xe4\xdb\x36\xc3\xea\x2d\x79\xfc\x2a\xfc\x80\xd9\x6f\x36\x54\x5b\x05\x8d\x21\xa1\x38\x34\x00\xfb\x18\xe6\xf5\x41\x03\x1d\xc6\x1c\x3a\xee\x98\x3b\x50\xc0\x23\xb8\x71\x1a\xaa\x20\x43\x82\x81\x0d\x6d\xa6\x8f\x3b\x9f\x5b\xb0\xe2\x95\x87\x3c\x6d\x41\xe5\xbd\xeb\x9c\xeb\x66\xdb\xf0\xc6\x0d\xde\xbb\xb6\x82\x96\x91\x06\x1d\x73\x10\x05\xcc\xda\x47\x5f\xe5\x7f\x17\x79\xaf\x57\x0e\x80\xab\xb7\x32\x8b\x71\xbd\x64\xa5\x09\xdb\xc0\x18\xd0\xe9\x06\x50\xe0\x59\x30\xc1\x2d\x2e\xc7\xa5\xd6\x42\xd5\x96\xa3\xba\x08\xca\x85\x8a\x01\x6b\xc3\xb8\x2a\xe4\x64\xad\x1a\x3a\xe9\xe4\xb4\x0f\x6d\x5f\xda\x92\x75\x61\xe0\x1e\x8f\x17\x7c\x01\x5e\x37\x2b\x94\xfc\x2a\xf9\x4d\xf2\x9f\x93\x7f\x4e\xfe\xef\x44\xc4\x4c\xf0\x45\x7b\x39\xba\x54\xbf\xa8\x73\x9e\x79\x00\x17\xa6\xec\xfd\x5b\xb1\xd1\xcf\x5f\xee\xcf\xc9\xef\x1b\x25\xd2\x68\x09\x78\x92\x67\x3e\x37\xd1\xba\x14\xa2\xda\xc3\x3a\xdb\x06\x47\xed\x7e\x2b\xb6\xc1\x87\x26\x40\x0a\x0c\x48\x82\xe5\x34\xb0\xac\x69\xc9\x32\xd5\x35\x20\xdb\x93\x60\x73\xdd\x10\xd9\x58\xa1\x37\x7d\xd8\xd2\xbd\xb7\x0d\xc3\x0d\x18\x35\x0a\x23\x42\xe6\xc0\x7d\x0d\x9c\xb0\x5a\x72\xd9\xb4\x3b\xd2\xd9\x89\xa0\x0d\x28\xa0\x37\x3c\x6c\x6b\xc4\xf3\x8e\x90\x92\x20\xab\x38\x22\x96\x32\x55\x9b\x0a\x53\xce\x1a\xc6\x10\x0c\x25\x23\x25\x21\xa6\x97\x98\x58\xc6\x34\x32\x90\x62\xa4\xe4\x4e\x58\x4e\x6a\x30\x94\xca\xb6\x1a\x63\x43\x98\xc2\x16\x52\xae\x94\x25\x81\x0b\xc3\x29\x4c\x2e\x1a\x84\x62\x95\x44\x5c\xf3\x65\xa6\x73\xbc\x3c\x2f\xe0\x9a\x93\x4d\xc2\x45\x14\xee\xfd\xa7\x9b\xfb\xb7\x7e\x4e\x69\xec\x30\xbd\xe8\x68\x08\x57\xd5\x69\xa7\x5c\x74\x68\x46\x25\x5c\x3a\x4c\xd2\x72\xd9\x55\xa5\x19\xf4\x3c\x87\x9e\x51\x66\xa0\xc3\x75\xd8\x95\xd6\x79\x77\x61\x9d\xaf\x92\x9a\xb3\x83\x0a\x1d\xf4\x90\xfa\x74\x52\x6c\xe9\x53\x5c\x55\x72\xbb\x60\x80\x53\xf2\x24\x39\xaf\x7c\x85\x00\x0e\xfd\x80\x47\xa0\xd3\x29\x34\xd3\x32\x4e\x49\x96\x4c\x60\xb3\x46\x2b\x1a\xd1\xf6\xbf\x4a\x92\x93\x5a\x6c\x2c\x6a\x62\x35\x14\xb1\x82\xb1\xef\xb9\x12\xa0\x1c\x14\x65\x8b\x5f\x48\x0d\xf8\xae\x69\x5b\x60\x41\x43\xf9\x41\xad\xd8\xd7\xce\xe5\xe8\x69\xb3\xaa\x7c\xa3\x29\x26\x95\x56\x1b\xd4\xf0\xb2\xc6\x28\xf8\xa0\xa3\xac\x52\xec\xbd\x89\x75\x9b\xfb\xe4\xcf\x5e\x94\xa1\xfe\xee\x2d\x3e\xf4\x67\x86\x6c\x27\xd9\x9b\xd7\x5f\x18\x5c\x59\xf5\x8d\xb2\x5e\xf6\x0a\xa0\x95\x6a\x9f\x78\xd7\xa4\xd5\xb2\xbb\x1c\x8b\x75\x65\xd5\x39\x65\xac\x98\x14\x20\xb9\x87\x9c\x2a\x6b\xac\x18\x9b\xc8\x7c\x7e\x52\xce\xe5\x2e\x8e\xe7\xec\x7e\xb1\x33\x10\x90\x33\x69\xb5\x16\x9b\x3e\x0e\xeb\xb2\xe3\x7d\xcd\x78\xde\x5d\xea\xed\x3f\x76\xcf\x32\xce\xa8\x68\x60\x47\xeb\xd0\x97\xca\x9f\x7d\x52\x69\xe8\xf3\xee\x89\x9d\xaf\x3a\x0a\x7d\x8f\x47\x60\xd2\x5d\x30\xf3\xd2\x4e\x71\x0e\x75\xc2\xc8\x4d\xb1\xff\xfc\xe3\x49\x3b\xfb\x67\x8b\xca\x33\xc1\xf7\x8d\x11\x5c\xe9\x51\x2a\x55\x33\x81\x82\x85\xe1\x39\x39\xbb\x01\x8f\x92\x33\x6e\x01\x94\xba\x89\xcc\xdd\x74\xf0\x4b\xe3\x5c\x2a\x96\x26\x9f\x10\x33\xbd\x62\xa8\x21\xda\x60\x87\x19\xe5\x94\xc8\x11\x2b\x26\x74\xb9\x4c\x4b\xc7\x79\xca\x82\xdb\xc5\xba\x90\xac\x9b\x7c\x1b\x19\xe9\x17\xeb\xc6\xbb\xcf\x8f\x37\x9f\x6e\x8e\x15\xe2\x8b\x1f\xf9\x77\x67\xe8\xd4\xc7\xf7\x77\x37\x1f\xd3\xad\x1e\xf7\x51\x01\x7f\x07\x1b\x98\x46\xc3\xd8\xa0\xd3\x7a\x31\x73\x8a\xcc\xd2\xef\xfa\x45\xd3\x14\x77\x4b\x07\xaa\xbc\x35\x04\x36\x6e\xd4\x2e\x2d\x96\xd9\xe9\xd1\xb5\xee\xb0\x7d\x4e\xa4\x77\x80\x06\x27\x3c\x05\x55\x96\x9c\x9e\xaf\xf1\x99\xe5\x43\xde\xfc\xff\xf2\x69\x4f\x45\x03\xb4\x54\x11\xeb\x42\x17\xef\x81\xd9\xa5\x72\x89\xe0\xe0\xb4\x77\x5a\x5a\xb3\x08\xc1\x55\xd4\xc1\x35\x3f\xe7\xd3\x3e\x13\xaf\xa8\xd1\xc2\x71\xa3\x93\x55\x32\x3c\x93\x35\xca\xa7\xe4\xfb\x17\x85\x86\xe3\x62\x7d\xeb\xce\x76\x7f\x2c\x5d\xe3\x56\x09\x22\x7c\xe5\xf4\xe0\xbc\x13\x1b\xa5\xa9\xa8\x2d\x11\x5f\x7b\xbf\x4b\xf7\x00\x1d\xd4\xf1\xae\x1c\xd3\xf3\xe2\x98\x39\xb9\x94\x2d\x5d\x3e\x2d\xbb\x85\x9c\xf0\x26\x69\xb1\x94\x99\x39\xae\x66\xe0\x4c\xd8\xbb\x60\x02\xb3\x4d\x7c\x86\xd4\x33\xce\x6d\x6e\x5f\x34\x1f\x6f\x4f\x1d\xa1\xb7\x8e\xb8\xef\xaf\x2e\xc4\x26\x13\x87\xc6\xa7\x78\x19\x2f\x07\xf5\xbe\xb7\x63\x9a\xf4\x5e\xf9\x2e\xb7\x87\x2a\x1d\x5d\xe0\x2e\x30\x1f\x06\xd6\x72\x2d\x34\x53\x91\x19\x77\xcc\x25\x77\xcf\x78\x5d\xe7\xe3\x0b\xff\xf2\xaa\x57\xfe\x46\x93\xe4\x82\xcf\xfa\xdd\x97\xc7\x17\x9a\x46\xb4\x70\xba\x14\x5d\xb7\xc7\xd4\xe2\xdd\xc0\xc2\x10\x4c\xa4\x11\x4d\x5a\x73\x53\x79\xce\x77\x9c\xd8\xb2\x0a\x36\x94\x70\xda\x2c\x1b\x9f\x8e\xd1\x47\x4c\xa1\x74\x17\xe0\xab\x49\x93\xd6\x88\xe7\xa3\xad\x4a\x11\x8c\x0a\xd5\x69\x54\x0d\x88\xb1\x0c\xd5\xbc\x6a\xaa\x7e\x99\x53\xab\x80\xe1\xa5\x0b\xe8\x58\x61\x55\x6d\x09\x09\x4e\xde\x25\xfd\x33\x59\xf3\x7c\x8e\x5a\x9d\xa7\x1c\xfe\x1f\x2e\x38\xc8\x7f\xe3\x33\xfc\x81\x30\xd5\xfd\x6d\x94\x1b\x65\x4b\x93\x95\x5a\x4b\x0b\x3b\x2e\xf6\x92\xda\x0a\x06\xbe\xec\xea\xfd\x76\xe9\x9a\x74\xbf\x74\x3f\x63\x33\xb5\x9b\xbc\xcb\xe7\xc5\x88\x65\x2b\x38\x76\x98\x02\xed\x3c\x23\x98\x56\x4d\x79\xac\xad\x37\x02\xe8\x8b\xbb\x54\xa8\x9a\xb2\x3a\xd7\xc4\x28\xf6\x54\x4e\xfa\x18\x0f\xc9\xff\x9c\xfc\xc7\xa8\x66\x72\x1a\x86\xbd\x96\xbc\x77\x6f\x9d\xcf\xc0\xa7\x32\x76\x8e\xa3\x5b\xfb\xd5\x6a\xc8\xac\x4f\xdb\x61\x58\xb8\x5f\x4c\x6a\x0e\xfb\xac\x3c\x7e\xf7\x69\xb9\xec\x8f\xc7\x52\x7a\x69\x95\xe2\xab\xc4\xfb\x83\x70\xd0\x39\x9b\x76\x0a\x7b\x2c\x57\x95\x7e\x4e\xec\x73\xb2\x54\xe9\xce\x18\x6b\xcc\x73\x72\x7c\x4c\xc2\x26\x0c\x61\x96\x86\x4e\xa0\x58\x64\xca\xe1\x7e\x64\xe3\xd0\x4f\x78\x7b\x9a\xb7\x47\x8c\x32\x8f\x38\x8a\xb3\xa3\xc8\x4b\xe7\xf8\x1c\xd3\xaf\xef\x40\x7e\xf7\x70\x56\x36\x3b\x6e\x3e\xff\x04\xce\x96\xc3\xd7\xd6\xc1\x6b\xee\xbf\xda\x66\x85\x37\xc6\x21\xbc\xdf\x73\x45\x29\x64\x94\x84\x3e\x74\x15\x20\x80\xcc\x61\x0f\x01\x1a\x9c\x1e\x40\x35\xb6\x36\xc8\x40\x52\x0a\x10\xa6\x15\x28\xb6\x6a\xf7\x9c\x2c\x56\xec\xc3\x96\x82\x24\xf7\xa1\xd9\x6c\x80\x08\x78\xd8\x72\x4e\xeb\x2a\x8c\x8a\x47\xee\x68\x01\x1b\xd6\xc0\xca\xca\xb6\x36\xbc\xac\x95\x08\x93\xad\x18\xa1\x41\x2a\x6f\x5b\x2d\xb5\x13\x9e\x24\xab\xa4\x8b\xeb\x6a\x38\x3f\x89\xe7\xbd\xe2\xd2\x17\xff\x43\x03\xcf\x35\x6f\xbe\xfa\x06\x94\xb9\x7d\xd2\x3e\xe3\x87\x36\xb7\xfe\x49\x7b\x7f\xfc\x7b\x3e\x9c\xdf\xcc\x3e\x10\xdb\x05\xb6\x8c\x52\xa6\xc7\xed\x3a\x49\xd2\x94\x3e\xf3\xa8\x01\xf0\xdb\xcb\x7e\x79\x8d\x2d\xba\xb9\x3b\x83\x6d\xde\x34\xd9\xdf\xad\x1f\xbe\x8b\xad\x01\xdb\x94\x55\x56\x4b\x87\x05\x34\x18\x95\xd5\x82\x69\x5a\x85\xda\x80\x04\x30\x5d\x79\x28\x69\xe0\xc1\xb5\x10\xd9\x29\xee\x5d\x2b\x88\x30\x59\xf0\x5c\xfa\x92\x5a\x30\xba\x00\x43\x5f\x43\xea\xd1\x86\x20\x2a\xd2\x0d\x41\x12\x14\x01\x6d\x2e\xde\x6e\xf4\xbc\x4f\xfe\xd5\xcb\x73\xf5\x26\x3c\xbf\xdd\x2d\x6f\xff\xe8\x8b\xd9\x28\x38\x37\xb5\xe3\x38\x48\xd8\xaa\xce\x47\x8a\x97\x0d\x7a\xd5\x70\x71\x79\xa1\xea\xae\x5e\xc8\xbb\x27\xad\x54\xd1\x14\x6a\x1f\xb6\x5b\xb3\x4d\x8b\x34\x09\x6e\xbb\xf4\x5b\x9e\xb2\x37\x2f\xed\xd2\xe4\xe5\xa5\xb8\x2e\xdb\x67\xf2\x6e\x9b\xbb\x73\x1e\xf2\xf1\x32\x51\x3a\x15\xed\x17\x56\x79\xb2\x7a\xf8\xf8\x27\xe0\xee\x36\xd2\xb8\x22\xf0\xdf\x49\xa1\x8c\x13\x9a\x03\xd9\x07\xb1\xea\x0f\x1e\xd1\x4c\x84\xcd\xd3\x40\xb3\x09\x94\xcf\xc9\x31\x23\xf3\xa0\x0e\xd3\xc1\xc7\xce\x96\xa6\x4c\x6b\x86\x6a\x2b\x26\x30\x87\x82\x13\x1b\xb8\x6b\x05\x40\xa9\xdb\xed\x76\xbb\x58\x47\x1e\xe3\x93\xce\x9b\xd8\x03\xfa\xf7\x17\x1d\xeb\x9b\x37\x4d\x53\x70\x32\x8a\xfb\xdd\xe7\x93\xfc\xd3\xc9\x1c\xee\xd3\xed\x2a\x69\xc0\x14\x6a\xa0\x7d\xa8\x9b\x99\x1f\xcf\x9f\x13\x2e\x28\xd4\x55\xeb\x9d\x03\xd0\xe7\x4d\xe7\xc2\xb4\x14\x8c\xa5\xf3\xb2\x03\x36\xad\x97\x84\x73\x5b\xa1\x94\x3f\xcd\x79\x71\x18\xb3\x61\xb3\x79\xd1\x12\xee\xae\xd8\xc0\x09\xb8\x62\xe6\xbd\xa2\x8a\xaf\xf7\x99\xd8\x29\xa0\x2b\x13\xc6\xe3\x66\xee\x43\x45\x82\x11\x00\x91\x50\xa4\x65\xd8\xf8\x4b\x03\xe3\x78\x64\x55\x80\x79\x77\xd8\x6a\x17\x36\x00\x0d\xe6\x58\xf4\xea\x14\x8b\x30\xf2\xb0\xe1\xa1\x3d\xf9\x3f\x9e\x38\x77\xcd\x8a\x9f\xb5\x37\xff\xf1\xb8\xb7\x5d\xf8\x8a\x57\x51\xe0\xc7\x0f\xe9\xfa\x95\xbc\xb1\xbe\xb9\xb6\x04\x3e\x2e\xfe\x98\x99\xac\x1e\x3e\xca\x8c\x50\x43\x70\x46\xe7\x31\x9f\x41\xb9\x55\xdb\xe7\x64\x61\xae\x0f\x7b\x03\x0a\xb0\x73\xbb\x16\x20\xc0\x09\xd5\x7b\x6f\x11\xb5\xc4\x6d\x59\xe1\x4b\x1d\xfa\xbd\x71\x56\x84\x42\x82\x5e\x3c\x27\x04\xf0\xbc\xe5\x9c\x4a\x57\xab\x46\x37\x4a\x33\xe7\x8c\x46\x38\x6c\x64\x89\x09\x62\xdd\xc8\x18\xad\x82\x81\x15\x6d\xd1\xa4\x28\x05\x4d\x55\x04\xd5\x58\x0d\xea\xd2\x76\xe7\xcf\x45\xd6\x36\x9f\xce\x7e\xa8\x7f\xfb\x6f\xf9\x6c\x26\xab\xc7\xbb\x77\xe7\x56\xcc\xe3\xdd\x6d\x8a\x3c\x01\x3d\xac\x3d\xa9\x53\xb6\x98\x14\x2d\x9b\x78\x0c\x5f\x9d\xe7\x8a\x01\x92\xda\x50\x94\xe5\x25\x07\xce\x3b\x64\xa3\xfa\x94\x1b\x6c\x6f\x7b\xc7\xb3\x5a\x09\x07\x70\x3f\x94\x95\x3f\xeb\x4f\xf5\x97\x1e\x06\x5d\xb7\x2b\x72\xd1\x88\xb8\xea\x85\x9f\xdd\x1a\x6e\xef\x6e\x7f\xf8\x2d\xb8\x68\x10\x7d\x3c\x61\x06\x6e\xde\x02\xcc\xcf\xc8\xf2\x4d\xba\x3d\x6e\x7e\x65\x2a\xa7\x69\xf1\x69\xb3\x88\x09\x48\x50\xa1\xdd\x32\x2d\xb3\x95\xbd\x00\x35\x6a\x4a\xd8\x6d\x97\x26\x15\x87\x31\xc3\x4b\x9b\xf2\x05\x66\xe6\xd4\xac\xcc\x37\x4a\x39\xb1\xb3\xb3\xb2\xae\xb2\x5a\x18\x61\xed\xbe\xa2\x44\xd7\x40\x59\x65\x85\x15\x3b\x21\x76\xd1\xd3\x32\x8d\x3a\xc2\x49\xe4\xaf\xff\xf6\x95\xb5\x7e\xd6\x06\xfe\xf8\x1b\x70\xc1\x68\xbc\x64\xac\xa7\x67\xe9\x63\x46\x1b\x44\xd2\x51\x39\x23\xe8\xa2\xfa\xd9\x83\xed\xce\x84\xfd\x73\x02\x76\xa1\xca\xa3\x6e\xec\xb2\x4f\x5b\xff\x24\x3c\xa0\xf9\x16\x61\x6c\xb4\xe0\x04\x7b\xa9\x87\xc1\x48\x38\xd8\x69\xb2\x93\x3b\x28\x42\x32\x86\x92\x2c\x35\xb1\xd7\xe6\x2e\x99\xd8\xb7\x4c\xd5\x6b\xbd\xba\x74\x9b\x93\x50\x1f\x33\xb0\x26\x02\xea\x71\xd6\x34\x5c\x79\xb3\x60\x41\x3d\x11\xb9\x73\x8b\x77\x01\x83\xd1\xa5\x52\xa2\x5d\xc3\xfa\xb6\x19\xe8\xd8\x9c\x35\xcd\xc8\xba\xca\x6d\x8c\xb5\xbf\x3e\xa3\xc2\xff\x30\xd6\x7e\x77\x0a\xa7\xc7\x84\xf8\xf6\xfb\x6b\x42\x6f\x44\x2b\x56\x9c\xab\x0e\x76\x1a\x2d\xdb\xda\xb9\x31\x8a\x1b\x15\x69\xb9\xcc\x61\x70\xa1\xf3\x27\xc5\x74\x16\xba\xdc\x3e\x79\x29\x4b\x57\xca\x6d\x98\xb7\x27\xab\x01\x72\x0a\x9e\x06\xa7\xfa\x69\xc7\x9b\x5c\x04\x0e\xaa\x45\x80\x22\xce\x53\x8e\xb1\xa3\x4d\x3e\x24\x1f\x93\xff\xf8\xba\x86\x6e\x92\xd5\xfa\x23\xb8\xb9\xbf\x39\x86\x51\x70\xba\x16\xaf\x62\x52\xd7\x7f\x99\xd2\xc9\xa7\xbb\xa5\x02\x1c\xcc\x3c\xd4\x61\xeb\x43\x17\xa4\x48\x0b\x40\x96\x1a\x94\xbe\xac\xb4\x52\x9c\x0b\xa7\xe6\xbc\x70\x65\xe5\xad\x52\x9a\x08\xd5\xe7\x48\x6b\x1f\x54\x68\x6c\x54\xb3\x4f\xc0\x1c\x06\xeb\x3a\xc0\x80\x83\x50\x30\x26\xb5\xa0\x9d\x55\x3b\x80\x21\x63\xda\x69\x27\x95\x90\xfd\x69\xef\x62\xeb\x2e\xd7\x67\xcd\xed\x63\x76\xfb\x25\x5e\xcf\x6f\x27\xbe\xe0\xfe\xe6\x53\x3c\xde\x16\x81\xd9\xf5\xa5\xfe\x3e\x67\x78\x06\x84\x96\x1e\x52\x14\x64\x68\x54\xe6\x97\xdd\x76\x0b\xf4\x6e\x77\x30\x9c\x73\x0d\x0d\xc3\x61\x82\xd2\x38\x07\xca\xb0\x2f\x40\x15\xf6\x60\x08\xb6\xae\xa8\xc7\x1b\x82\xa9\xce\xd9\x42\xd3\x3a\xf2\x98\x65\x0a\x9f\x7a\xa9\x0a\x5f\x28\x90\x84\xf9\x39\x11\x80\x81\x63\xb5\xd0\xf7\x21\x19\xa2\x67\x34\x88\x9e\x60\x26\xdf\x45\xf7\x97\xb7\x01\xe4\x02\xec\x39\x56\x68\x77\x37\xc7\x07\x76\xf5\x10\xc7\x6d\xef\xba\x27\x9b\x93\xa7\x21\xa7\x4f\xfd\x0a\x1d\xb6\xd4\x79\x2d\x95\xee\x00\xe4\x0b\xdb\x06\x0f\x8a\x4d\x35\x87\x8e\xce\xa0\xcc\x77\x56\x6b\xa5\x95\x8d\x6a\x50\x1c\x71\xe2\x5b\xd0\x04\x41\x88\x63\x94\xa6\x89\x4d\x37\xd1\x2f\xee\xc4\x51\x38\xf1\xba\xeb\x53\x76\xb2\x3e\xed\x9d\xaf\xc3\xc4\xc7\xbb\xdf\x7d\xfe\xa7\xd3\x50\xe9\x92\x4c\xbf\xe0\x7e\xfb\x96\xa6\xc3\x52\x30\x07\xb4\x4f\xf5\x62\xfd\xa1\x00\x75\xb9\xc1\x3c\x24\x29\x0b\xf4\xe4\xce\x02\xf6\x4f\x12\x6c\x60\x19\x92\xb4\x29\x60\x0a\x57\x35\xd2\x0b\x56\xdc\x7b\x77\xdc\x6d\x9d\xa8\x49\x3a\x86\x9d\xb5\x36\x70\xc2\x28\x75\x27\x9c\x36\x59\xe3\x15\x8c\xfa\xcd\xa7\x09\xd2\xdb\xa6\xcc\xc3\xe7\xdf\x80\x0b\x87\xe6\x2e\x1a\x3c\xc5\x96\xed\x29\xb0\xc5\x05\xda\x7b\xb6\xc2\xaa\x65\x1a\x36\x94\x94\xf0\xa9\xa0\x4a\x6f\x37\xae\x82\xe9\x3e\xb0\x94\x2f\x2d\xa8\xdc\x21\x71\x00\x1d\xab\xca\xb0\xc3\x54\x34\x2b\x88\xec\x01\x87\xa6\xf2\x95\x68\xd3\x59\x70\xd1\x6b\x88\x90\x75\x36\xcc\xed\x71\xdf\x6b\x41\x61\x1d\x41\x52\x25\x17\xfe\x9e\xce\xc7\x17\xf5\xbb\xa8\xc0\xf1\xfe\xc5\xed\xe1\x98\xdd\xc7\xae\xeb\xeb\x04\x28\xd6\x76\xaf\x9d\xc2\xed\xce\x67\xc4\xcd\x33\xa0\xbf\xaf\x00\xde\x01\x13\x1d\xd4\xcf\x87\xa3\x27\x92\x25\xce\x4a\x50\x83\x8a\x45\xe3\x36\x62\x8f\x7f\x16\x6d\x6d\x1a\x3d\xe6\x4c\x30\x26\x6c\x9c\xa2\x1e\x6b\xa2\x9d\xa3\x17\x4f\xa9\x26\xef\x92\x2a\xa2\x4e\xff\xf3\x95\xb3\xc6\x2f\x6b\x97\xc7\x8e\x45\xf6\x25\x3a\xbe\x64\xd7\xd0\xc2\xd9\x9d\x59\xfa\x86\x48\xce\x22\x9c\x50\x01\x9d\xa2\x74\x0f\x37\x6e\xa7\x36\xcd\x14\x36\x14\xb0\xd6\x08\xcd\x95\xad\x96\xa1\xd5\xcc\x52\x15\x2a\xc7\x95\xb3\x79\x67\xdd\xc6\x2d\xfb\x33\xb6\x63\xe7\x80\x0a\x30\x6c\x06\xe7\xfc\xb8\xd3\xd6\x6e\x06\x50\x88\xb9\xdb\x81\x2a\xb0\x66\xa4\x63\x57\xa3\xe7\xa4\x63\x63\xdc\x23\x44\xec\xb1\xe8\xe4\x87\xe3\x7e\xfb\xb2\xb3\x5d\x49\xcc\x27\xef\x5f\xac\x78\xbf\xfb\xb0\xfe\xe9\x6c\xd0\xf3\xf9\xfd\x9d\x05\xda\x1d\x93\xb8\xd6\x48\x2e\x9d\x19\x04\x28\x6c\xf0\x99\x04\xd4\x03\x17\x06\x3f\xf3\x5d\xe3\xfb\x51\xce\x53\xd8\x64\x6e\xb7\xb3\xa8\xf1\xd6\xaa\x05\xa7\x76\x1e\x34\xa8\x80\xb0\xbb\x9d\x0d\xb6\x6b\x07\xa0\x0e\xdb\x74\x08\x6d\x6b\x36\xa0\xbb\xf4\xdf\xf1\xba\x5e\xe1\x38\x25\xbf\x44\xf2\xdb\x57\x99\x8e\x63\x4e\x70\xf3\x70\x77\x7b\xf7\xe1\x17\xfd\xc2\xbb\xc1\x49\x96\xf6\x10\xb5\x04\xa6\x8d\x7f\x82\xf9\x56\x19\x43\x25\xb4\x44\x1d\x94\x73\x99\x3b\xa8\x78\x14\x73\x10\x2f\x42\x1c\x94\x20\x26\x83\x9d\xf5\x7e\xe1\xa7\xf2\x99\x84\x7d\xc6\x76\x32\xf4\xf2\xa4\x15\xa1\xd7\x36\x47\x3f\x87\x79\x7f\x5d\x7f\xef\xfa\xcd\xd7\x71\x76\x2f\x66\xdf\x74\xe9\x73\xf4\x34\x39\x97\xd7\xa1\xd9\x2c\xc3\x6e\x19\x36\x71\xc6\x43\xd6\x4d\xde\x24\xff\xee\xa5\x62\x3d\x63\x97\x23\xd5\xe1\x9c\xf5\x5c\xa9\x6f\xbd\x8f\x31\xf5\xe6\xf1\xfe\xf1\x85\xaa\x77\x73\x42\x5b\x88\xa6\x1e\x41\x22\xf6\x63\xb3\x93\xa0\x5e\x34\xa9\x41\x15\x20\xf0\x85\x6c\x89\x28\x25\x21\x55\x5d\x3c\x27\xe5\xc6\x4e\x03\xe0\x15\xca\x9a\xd6\x49\xd7\x80\x64\x23\xb7\xfb\xbc\x41\x74\xdb\xb8\x66\x37\x7b\xb9\x03\x48\x48\xd7\x2d\x7e\x3c\xd6\x36\xc7\xec\x5c\x86\x59\x80\x12\x98\xd9\x31\x12\x4a\xa1\x8d\x13\x61\x67\x1a\xdb\xc7\x39\x49\xfa\x32\xa7\xfa\xe9\xa4\x96\x7e\x65\x4b\x78\xf7\x32\xce\x39\x83\xe2\x2e\x76\x1f\x6f\xa6\x0d\x17\xb5\xbd\x29\x6d\x61\x53\x16\x59\x71\x18\xcb\x2a\x83\x07\x4f\x72\x12\xb8\x07\x35\x0e\xa6\x5f\xda\x4d\x18\xc5\xd4\x04\x97\x26\xb4\x3c\xc6\x3c\xb4\x58\xa0\x80\xf2\x40\x84\x26\x06\xc5\xc5\xa6\x3a\xb8\x7c\x30\x25\x41\x16\x21\x2b\x6d\x87\x3d\x07\xf5\xd4\x18\x6d\x2c\xa9\xad\x58\xb4\xd6\xd6\x1c\x73\x13\x93\x64\xc9\xf4\x4c\xd7\x55\xde\x27\x65\xf2\x9b\xa8\xe7\xfc\x6d\x97\xea\xac\x41\xfd\x22\xfc\xf1\x92\x83\xde\xc4\xab\xbf\xae\x94\xa6\xb2\xb6\x94\x7f\xdd\xfb\xb4\xe6\x78\x23\xa8\x93\x20\x79\xf2\xa0\xac\x31\x68\xeb\x0a\xf4\x4b\x92\x8e\x87\xb6\x05\x53\x09\xf3\xfe\x89\x9f\xda\x56\xd9\xfe\x09\xae\x54\x2f\x22\x45\xdf\x5a\x42\xc2\x44\x99\x6d\x2d\x40\x16\xa3\xe4\x5d\x42\x9e\xe5\xba\x5f\xa1\xe4\xdf\xbf\x38\x72\xfe\xaf\xd7\x33\x87\x1f\x56\xeb\x87\x9b\xbb\xdb\xef\x7f\xb8\xfb\xdd\xe3\x95\xbf\xee\x71\xe9\x9f\xca\xb2\xd3\xcc\xe6\xa7\x87\xbb\x77\xd9\x37\x7d\x19\x9f\x72\x86\x7d\x8d\xb2\x2e\x14\x23\x30\x6a\x5c\x3a\x09\xaa\xd6\x97\x65\xe9\x2a\x5c\x07\x1d\xb4\x5d\x06\xce\x15\x30\x6d\x40\xa0\x03\xdc\x01\x65\x45\x30\x7a\x38\x6e\x6b\x29\x02\xc3\xa1\xbc\x9c\xe5\x96\x33\x48\x89\xeb\x5b\xab\x42\x25\x6a\x58\x14\x65\x3d\xb0\x1d\x86\x44\x5a\xb0\xc7\x48\x8f\x7e\xb2\x56\x2a\x13\x1a\x63\x4c\xb0\xc6\x9c\xfd\x9e\x9f\x6d\xd4\xdb\xf8\xf7\xf1\xaa\xbf\xe5\x15\x7c\xba\x96\x5a\xf9\xf2\xc3\x87\x4f\x6f\x21\xfb\x3f\xbe\xcb\x0b\x8d\x81\x07\x3d\xef\xdb\xa0\x52\xb9\xf8\x9d\x22\x1e\x63\x20\x7f\x5f\x82\x86\x70\x67\xf8\xb0\xb8\x54\x05\xd6\x79\x9e\x26\x45\x86\x4d\x18\x86\x15\x14\x68\xd6\x1e\x33\xd5\xba\xd0\x19\xcf\x14\x77\x4e\x72\x6e\x3c\x60\xae\x95\x02\xbb\xc1\xd5\x93\x3f\x7b\xbb\x36\x2b\x74\xce\x53\x3f\xc5\xa8\xfe\xcd\x60\xec\xca\x23\xf4\xef\x2e\x19\xf5\xb7\x5a\x0c\x97\x76\x74\x92\x76\x4d\xea\x17\x99\x55\xbf\xaf\x32\xb4\x30\xa0\xe4\x18\x46\x06\x92\xcc\x03\x04\x20\x3f\x6e\x36\xc1\x59\x44\xd2\xc6\x8c\x20\x01\x1b\x1a\xca\xd0\x85\x2e\xd4\x14\x38\x50\x35\xca\x29\x0e\xba\xda\xf7\x1b\xb5\xfc\xbf\x8c\xbd\x3d\x90\xdc\x38\x9b\x26\x48\x90\xcc\x2a\xce\xee\xcc\x7d\xac\xae\xd6\x27\xce\xce\xcf\xb2\x46\xad\x16\x67\xef\x62\x97\x37\x5a\x49\x8c\xbb\x98\x3d\x5c\xc4\xc5\x05\x8c\xdb\x08\x98\x30\x61\xc2\xa4\x09\x13\x26\x4c\x98\x30\x61\xd2\xa4\x49\x93\x26\x4d\x9a\x69\xd2\xa4\x49\x93\xad\x4a\xbe\x75\x91\x60\x66\xfd\xa8\xfb\x9b\x5d\x45\xa4\x94\x51\xd5\x5d\xc5\xe4\x0f\xf0\xbe\xcf\xfb\xfc\xd8\x3c\x6e\x95\xd2\x4a\x6b\x05\x33\x6b\x84\x26\x96\x3a\xd3\xb1\x8c\xe0\x4a\xb6\x35\xad\x2c\xd6\x0a\x37\x05\xa5\x8c\x95\x72\x10\x82\x32\x95\x5d\xf3\xd7\x4d\xdc\x04\x1f\x82\xff\xdb\x9f\xef\x9f\xee\x6f\x83\xe8\x95\x1f\xc8\xaf\xbb\x21\xc8\xbb\x67\xbb\x0f\xf4\x07\x72\xc4\x17\xfa\xce\xcd\x4c\xbb\x62\x16\xb0\x96\x9c\x53\x9c\x97\x8a\x13\x9d\x66\xb5\xc1\xaa\x56\xaa\x16\x61\xba\xb1\x4c\x1a\xce\x19\xcb\x08\xa3\x03\xd6\xca\xd4\x90\x84\xbd\x6e\xe2\x46\xe7\x5b\x05\x56\x23\x1d\xa5\x69\x72\x62\x79\x21\x58\x35\x2c\x15\xa9\x70\x85\xe3\x20\x5d\xa1\x86\x46\x09\x81\x2a\x64\x10\x2d\x20\xd3\x65\x01\x94\xd0\xcc\x66\x39\x12\xa5\xcb\xf2\x63\x2d\xb4\xb5\x4a\xec\x7e\xd9\xd5\xad\x8a\xdb\x67\xb7\x9c\xff\xe2\x39\x7f\x1f\x5e\xfb\x9c\x3f\xa3\x7e\xbb\xcf\xf9\x87\xc3\x0f\xb1\x30\xc3\x8d\x98\x50\x06\x73\xb7\x91\xa8\x3c\x8d\xce\x77\x5b\xb4\x81\x05\xa5\x53\x3c\x83\x73\xe0\xb5\x9e\x61\x82\x78\xdc\xea\x51\xf7\xda\xee\x09\x18\x56\xf7\x7a\xf4\x7f\xa0\xeb\xfb\x3e\xd8\x3d\x62\xf1\x6d\x19\xd7\xc1\xcf\x1e\x2b\x09\xd0\xef\x5d\x13\xef\x1f\xde\xb8\x07\x4d\x31\x4d\x58\x2b\x4c\xe6\x44\x95\x16\x90\x2b\xd0\x0c\x11\x06\x73\x4c\xcd\x69\x36\x26\xca\x4e\x73\x5c\x83\x68\x33\x9b\x95\xcc\x82\x50\x46\xa0\x7c\x3b\x6e\x86\xd0\x50\x02\xf7\x9a\xa9\x28\x50\x4f\xb5\xcf\xf0\xbd\x38\x4b\xdf\xbf\x76\x74\xfd\x41\x33\x75\x75\x0e\xba\x2e\x08\xcd\x4d\x7b\x5a\x43\xb3\xd5\xe1\xb8\x95\x9e\x4f\x5a\xad\x6b\x54\xfa\xec\xb5\x32\x1c\xb7\x3a\x34\xa7\x15\xa5\x97\x70\x80\x35\x9e\x75\x0d\x75\xed\x53\xca\x8c\xd4\x42\xd7\xc8\xd4\xa0\x8c\x31\xe7\xe3\xd0\x3e\xaf\xaa\x08\xfe\xe6\x15\x7f\xfe\x85\xad\xb0\x6f\x09\x97\x2f\x3c\x9b\x8d\x3e\xc4\x45\x95\x87\xd6\x3e\x06\x26\x1c\xb3\x62\xcb\x6f\x86\x53\x25\x4c\x5c\x99\x53\x65\xb4\xa5\x48\x8d\xdb\x80\xe6\x68\x38\x55\x87\x82\x32\xe8\x9b\x06\x61\x5c\x42\x69\xea\x7a\xb3\x84\xa2\x85\x12\xdd\xf6\x9b\x41\xc1\x33\x7e\x60\x0f\x55\xf0\x57\xc1\xdf\xbe\x1c\xc5\xbe\x9a\x44\x7f\xd1\xc8\xe9\xcb\x83\xf7\xf1\x6a\x7e\x3b\x9e\x8f\x61\x26\x39\x5a\xca\xa2\x29\xca\x30\x59\x47\x34\xe5\x55\x6c\xcc\xa9\xb0\xd6\x67\x4d\x55\x54\x18\x43\x30\x8c\xd2\x5c\x9c\x9c\x24\x87\x74\xd3\x9c\x87\x12\xe4\x1a\x5c\xfc\xff\xac\xcf\x3b\xf8\x5b\x8f\xe6\xfe\x5b\xc7\x70\x75\xb2\xba\xb9\x8d\xaf\x83\xe4\x3d\xb0\xcb\x5b\xb7\xc6\x69\x99\x87\xc3\x6f\x5d\x38\x66\xf9\x48\x4a\xd4\x93\xb2\x2d\x2b\x34\xfc\x56\xa2\xa1\xa8\x40\x84\xb8\xcc\x5b\x1c\x97\x40\x0a\x8d\x92\x45\x4c\xe0\x60\xdc\xc6\xf3\xf3\x23\x87\xd9\x42\x16\x3a\x31\x8d\x6d\x79\xc8\x09\xd3\x1a\x97\xb0\x70\xc1\x45\x45\xb1\xd6\xb8\x02\x4e\x70\x2a\x4d\x4b\x31\xb1\x8c\x9b\xca\x65\xb4\x2a\x7b\x59\x94\x4c\x5e\x7d\x17\xf1\xad\xf2\x6b\x61\x79\x49\xc1\xdb\xed\x02\x9e\x43\x96\xf6\x4e\xf5\xe1\x9d\x37\x9e\xf9\xfa\xed\x7d\xf8\xe1\x9f\x82\xe8\xe1\x22\x92\xf8\xf2\xe1\xee\x97\xfb\x5f\x3f\x1d\xde\xed\x55\xca\xad\xfa\xce\x9f\x02\xb5\x84\x3a\x2b\x2d\xce\xc3\x84\xf6\x63\x92\xa1\x0e\xea\xca\x55\x49\x95\x29\xaa\xeb\xa7\x00\x43\xa2\xeb\xa2\x6f\x48\x12\xe2\x32\x4b\x80\xa0\x89\xf8\x68\x6b\xa9\xa1\x01\x0c\x62\xb7\xfe\x99\x08\x2e\x19\x1f\x55\x91\x69\xa1\xbb\x41\xf0\x12\x06\x94\xa3\x00\x9a\xaa\x52\x82\xd0\x36\x3c\xe6\xd0\x88\x3a\xef\x40\xd7\xaa\xd2\x75\x70\xed\x75\x4c\xec\x82\xf7\x6f\xea\xdc\x6f\x6f\x0b\x5d\xf4\x3e\x3e\x5c\x91\x89\xe7\xec\x6b\x87\xb0\x07\x2b\x99\x22\xba\xe2\x56\xb8\x1a\x05\x1c\x8e\x37\xde\xe5\x45\x45\x29\xcc\x16\x5c\xc2\x6b\xc5\x05\xea\xa3\x7e\x9a\x8c\x2d\xb5\xa5\xaa\xde\x82\xd0\x4d\x7e\xa0\xca\x10\xd7\x24\x87\xd5\x6c\x55\x38\xc0\x08\x93\x14\x1c\x61\xa4\x11\xcd\x83\x4b\x1d\x68\x0f\xe9\x25\x6f\xfe\xbf\x5f\x5d\x48\xaf\x05\xd3\xeb\xac\xe7\xdd\x2a\xe7\x8d\xa6\xe6\x07\x58\xfb\x62\xe1\xf9\x3a\x9c\x77\x92\x86\xaf\x0d\xb0\xb0\xca\xf0\x76\x0c\x25\x2e\x6c\x5e\x45\xd5\x49\xe5\x45\x5c\x40\xed\x56\x7a\xd4\x9c\x73\x9b\x5b\x8e\xb7\x8a\xa1\x1a\x0d\x22\x75\x05\x23\xdb\x0c\x85\x89\x26\x52\x6d\x3d\xa1\x91\x35\x4c\x48\x71\x4a\x05\x36\x98\x23\x4e\x89\x52\x46\x67\x4c\x9b\x26\x75\x5a\x57\x95\x76\xc4\x31\xd5\x71\x91\x98\x44\x14\xd0\xe7\x19\x56\x55\x57\x96\xb8\x46\x13\x26\x04\x47\x15\x31\x44\x30\xc6\x05\xdb\x7d\x67\x1a\x9f\xeb\x22\x9f\x79\xdb\xff\xab\x67\x61\xbe\xbb\x40\x31\xef\x1e\x9e\x47\xdc\xbb\xff\xc7\xbb\x9f\xdf\xa4\x67\x86\x9f\x3e\x7c\xfe\xe9\xfd\xbf\xbc\xfb\x7a\x1f\x4d\xde\x38\x77\x45\xc1\x69\x74\x28\x78\x0a\xbc\xe8\xf3\xfc\xef\x31\x2a\x67\x62\x56\xb1\xe8\xf6\x48\x8f\x56\x88\x9c\x1e\x2b\x9d\x58\x1a\x4b\xf3\x14\x40\x01\xab\x39\x04\x7e\xce\xed\xe6\xcd\x9e\x7f\x46\xcc\x05\xdb\x1c\x71\x8d\x72\xcd\x28\xac\xe8\x7a\x54\xcd\x60\xa6\x64\x45\x7c\x9f\x7b\x33\xaf\xcf\x39\x77\x24\xff\xfd\x47\xde\xe5\x33\x95\xe1\xf7\x93\x06\xcf\xe3\x43\x57\xcd\xff\xd7\x3f\x16\xfd\xc7\x89\x25\xe1\x52\x15\xb6\xc0\x39\x2f\xca\x62\x63\x19\x09\x53\xc0\xe4\xdc\x2d\xb1\xc4\xe4\xb4\x02\x06\x5a\x66\xb9\x9c\x91\xdf\x8b\x1e\xf9\x6c\x87\x41\xd6\x99\xd4\x58\xf8\x48\xe1\xe2\x58\x1a\x39\xc7\xc7\xd2\x6e\xad\x95\x99\xcd\x1c\x72\x15\x83\x12\xd6\x22\xc5\xaa\x6c\xab\x12\x8b\xb0\xc9\x33\x3e\x43\xdb\x87\xe9\xf9\x33\x6b\x98\x8a\x5c\x96\x25\x68\x41\x53\x9d\x32\x54\x60\x93\xe7\x88\x9c\x3f\x6f\xeb\xb5\xdc\xad\xf7\xcd\xf9\xbc\x7b\x2a\x1f\x3c\x49\x6e\xe7\x79\xbf\x09\xab\x39\xaf\xeb\x77\x1f\x2f\x72\xa4\x8f\xbb\x09\xe8\x87\x2f\x0f\xc8\xc4\xf3\x0c\xd3\xec\xc4\x08\x13\x2a\x8f\x7c\x3c\x0a\x41\x69\x5a\x51\x0e\xc7\x99\xa0\x7a\x46\xf5\x89\xe8\xde\x72\xd7\xc1\xea\x0e\xc2\xda\xdf\xd6\xb8\x75\x35\x57\x98\x2b\x41\x65\xad\x25\x1f\x08\x29\x4c\x91\x8d\x8e\x1a\xa5\x11\xd6\x1d\x93\xb5\x62\xd9\x96\x86\xcb\xa9\xf2\x7a\xb5\x28\x4c\xbc\x6e\xb5\xf7\xe8\xf1\xb9\x5f\xf4\x0f\xf9\xfe\x28\xdd\x3d\x84\xaf\x93\xee\x3e\x7d\x78\x97\x22\xdf\x4b\xfa\xb1\xb0\x5f\x6e\x8f\x16\xcd\x54\xd5\xb4\x82\x11\xb9\x72\x71\x28\xad\x61\x6a\x5a\x58\x38\x0a\x9c\x23\x0c\x16\x63\x6b\x8b\x4a\x18\x57\x6c\x9a\x32\xce\x9d\x33\x92\x53\x4c\x9e\x02\x38\x1e\x19\x33\x42\xd4\xd4\x60\x66\x96\x12\x1c\x4c\xac\x41\x69\x17\xfa\x9b\x0b\x64\x2b\xfd\x68\xda\x6b\x8b\xf6\x2c\xa3\x9f\x83\xff\xe0\x6b\x97\x1d\x3b\xb8\x54\xef\xcf\xba\xf0\xf0\x42\xeb\x7b\xb8\x39\x9c\x37\x8b\x73\x4f\x1b\x7d\x7e\x15\xe2\xe4\x1f\xf4\x7d\x58\xd9\x6e\x1d\xa6\x14\x11\xeb\xf2\x70\xc6\x18\xb9\x4d\xb0\xd3\x2a\xc2\x1e\x4c\xd8\x90\x6a\x3b\xd7\x90\x50\xa2\xd1\xa2\x05\xd2\xd4\x51\x3b\xd2\xd4\xe6\xa4\x82\x23\xac\x0a\x71\xab\x84\x32\xa8\x46\x4d\x59\xea\x71\x2e\x4b\xc5\xc8\xb6\x42\xdd\x28\x13\x95\x84\x8a\x7e\xce\xb2\x19\x28\x1c\xf3\x9c\xb4\xe5\x5c\x95\x98\x21\x46\x85\x52\x34\x40\x91\x79\x12\xb7\x24\xee\x82\xbf\xbf\x4e\xdc\xde\x10\x5c\x77\x2e\xf8\xcd\xed\xa7\x9f\xe2\xd6\x66\x79\x58\xe1\xaa\x65\x32\x6f\x08\xcd\x72\x29\x80\x48\x64\x79\xcb\x74\xdd\xc7\x5d\x2e\xc4\x16\x0c\x36\x37\xb9\x68\xc2\x72\x5b\x40\x49\xc4\x51\x37\x37\x35\x4a\x9e\xfb\xe4\xc6\xeb\x4a\xff\x9f\xdd\x7d\x76\x7f\x8e\xde\xfd\xfe\x31\xfa\x78\x77\xf1\xf0\x3e\x7c\x7e\xb5\x6e\xbe\x5c\xfc\x8b\xb9\x73\x70\xff\x01\x5d\xa2\xd6\x15\x4a\xed\xb2\x4c\x99\x54\x44\xd4\x3c\xaf\x45\x39\x57\x28\x87\xe5\xd0\x32\xac\x2a\xb6\xb5\x43\x96\xd8\x24\x0d\xdd\x86\xd3\x2c\x14\xf9\xda\xa0\x5c\xc2\x32\x34\x4f\x01\x39\x1a\x85\xd5\xc8\x11\x13\x2d\xca\x2a\xd7\xe5\x50\x66\x59\xe4\x49\x47\x66\x29\x74\x9e\x81\xa9\x59\x62\x53\x86\xca\xd2\x96\x28\x45\x86\x72\xc2\x58\x2f\x75\xaa\x6a\x43\x09\x74\x3d\xc5\x9a\xd4\x02\x9b\x92\x08\x31\xb5\x0a\x65\x68\x00\x23\x85\x6a\xab\xe2\xaa\xc1\x54\x17\x0f\x98\xbb\xe0\xfd\x8e\x1f\xc6\x87\x4f\xf9\xe1\x77\x59\xb3\x57\x47\xc2\x37\x90\xf2\xc3\xcd\x40\x37\x73\xaa\xcb\x70\x09\x71\x23\x94\xd6\x90\x91\xd2\x16\x14\x0c\xc3\xb6\x64\x63\x94\xbb\x28\xdf\x08\xca\x51\xc3\x80\xc0\xe4\x60\x05\x22\x90\x45\xc9\x26\xe2\xa3\xa1\xa9\x11\xd5\xec\x48\xaf\x79\x4d\x6a\x5e\x6a\x47\xac\x01\xa7\xb5\x79\x0a\xe4\x0e\x28\x87\x19\x8c\xad\xf6\x45\xd8\xb9\x2e\xaf\xbd\xcf\xd0\x95\x55\xff\xf5\xca\x86\x78\xf7\x17\x6b\xd2\xab\x20\xf4\x87\xf2\xfc\xa6\xa5\x30\x80\x8e\x12\x18\x3c\x6f\x06\x9f\x96\xf0\x78\x2e\x87\x4e\x33\x62\x5e\x55\xd1\x47\x01\x1c\xa1\x2d\xc3\x11\xb5\x30\xb8\x5d\x02\x81\x46\x54\xc5\xab\x29\x32\xa9\x7b\x33\xf8\x54\x1a\x3d\x98\x5e\xd7\x69\x62\xb6\xb1\xef\xfb\x1e\x9a\x61\x18\x82\x00\x05\xf5\x13\x89\x78\xdc\xef\xfa\x8e\x3f\xa8\x08\x7e\xba\x7f\x30\xa8\x70\xe7\x25\x92\x09\xac\x4b\xe2\x88\xa9\x67\x0a\x73\x74\x9c\x67\xe3\x2a\xed\xa8\x92\xa7\x39\xd4\xbd\xab\x51\x72\xde\x1f\x0e\x11\xf3\xf3\x6e\xf3\x5a\x8b\x74\xad\x35\xbd\xca\xee\xe1\xee\x9f\xf7\xdd\x6c\x17\x10\xdc\x32\xb7\x61\x87\x5a\x07\xd4\x6b\x03\x5a\x94\x6e\xf8\xfa\x0e\x96\xa8\x79\x6c\x98\x88\xc5\x3c\x5f\x85\x00\x5b\xbe\x87\xab\x5c\xb3\x72\x4c\x2c\x82\x4f\x97\x1c\xf1\x00\xbd\xb2\xa5\x3a\xef\xa0\x6f\x37\xcc\x8b\xd7\xb4\x1f\x8c\xfe\xe5\x11\xf3\x6d\xc6\x24\x15\x79\x4d\xcb\x2c\xd9\xd6\xf0\xa8\x49\xed\x84\x55\xca\x52\x2d\x24\xab\xa9\xac\xab\x6d\xb4\x9c\x71\x2c\x8a\x9a\x54\xd0\xa6\xd2\xea\x97\xb1\x88\x80\x5e\x67\x26\x2b\x25\xe8\x3a\x83\x91\x92\xca\x10\x5e\x57\xb6\x20\xb5\xa5\x86\xd7\xcd\xa6\x0e\xd9\xe3\x20\x44\x62\xd3\x7a\x82\xae\xad\x06\x24\xc2\x0e\xda\x7e\x5b\x86\x20\x09\xa6\x27\x72\x9b\xc4\xd3\x45\x47\xfe\xda\xd9\xe7\x0f\xb8\xf1\xaf\x58\xf2\x2f\xf5\xfc\x1b\x17\xba\xb8\x30\x54\x48\x66\xb9\xd3\x61\x63\x28\x17\xd4\x32\xa3\x1f\x7b\xcb\x38\x23\x96\x2a\x7d\x70\xf6\xb1\x72\x3b\x3b\xae\x0d\xb3\xc7\xea\xfa\x6e\x9b\xe3\xa9\xd4\x5c\x88\xf3\x86\xe3\x4a\x2d\x38\xa7\xe7\xce\xa7\x52\xfc\xfc\x53\xa4\x06\x7a\xea\x39\x8f\xb0\x8f\xf5\x84\xb2\x6d\xdb\x9d\x33\xba\x67\x84\x1f\xfc\x0c\xea\xea\x18\xfd\x9c\xca\xf0\x43\x6a\xf6\x85\x66\x7b\xf7\xf0\xf1\xcb\xc3\xbb\x8f\x7b\x90\x65\xe5\x25\x23\xc8\x1d\x4a\x58\xa9\x62\x24\x67\xb4\xcc\x4f\x35\x28\xa7\x6b\x63\x43\x1c\xaa\x4d\xa1\x19\x5a\x10\x5a\xf4\x76\x88\x7b\x52\x6b\xc9\x12\x73\x22\x35\x4d\x4c\x92\x57\x91\xa1\x3e\x7d\xb2\x80\x44\x2f\x8b\xe2\xe7\x82\x73\xb7\xd8\x08\x0e\x28\x7d\xaa\x7c\xb6\xe8\xce\x8d\xca\x82\xff\xfc\x92\x27\xec\xb9\x7a\xfb\x48\xc2\xfb\x02\x7f\x42\x17\x73\xe0\xfc\x65\x6c\xfc\xf9\xdd\x2f\x28\x3b\x98\xef\xb5\x8d\xd9\x63\x73\x7e\x39\x1b\xe6\xdb\x84\xf2\x29\x83\x15\x1c\x39\x8c\x04\x66\x70\x4c\xa1\x94\xa7\x26\x57\x60\x56\x69\x51\x19\x77\x9b\x46\xb2\x86\xa6\x86\xc1\x68\x58\x30\xb6\x84\x90\x90\x6b\x81\x55\x9e\x63\x55\x74\x02\xb3\x30\xe9\xaa\x73\xcd\xd1\x5c\x32\x5f\xfe\xc1\x77\xb5\x6f\x30\x18\xcf\xa9\xbb\xfb\x70\x77\x4d\x9f\xf9\xf2\xf0\xe9\x62\x84\x70\xf7\x21\xaa\x91\xb6\x3e\x8b\x75\x01\xe9\x50\xc0\x9f\x82\xc6\x36\x30\x09\x54\x34\x60\xd0\x08\xd2\x41\x6d\xed\xba\x46\xc7\xae\x33\xa3\x81\x41\xb7\x1d\x12\x5b\x1b\x96\x70\xec\x4d\x83\x72\x33\x2e\x27\xdd\xc6\xc5\x96\x85\x2c\x40\x81\xf6\xb5\x5e\xbb\xeb\x19\xf6\xee\xd9\x63\xe3\xcf\xb3\xa3\x8f\xaf\x32\x35\x9e\xed\x20\xfd\x35\xdd\x33\xdf\x4d\x9c\x3d\x76\xf1\x84\xb2\x2d\x60\xb2\xe5\xa6\x76\x23\xca\x28\x94\x70\x64\x92\xb3\xdc\x67\x9e\x37\xc0\x2b\x34\x20\x01\xbc\xca\x55\xc5\xfa\x43\xf2\x38\x47\x56\x9b\x6d\x36\x92\x62\x21\x6b\x41\x05\x76\x72\x1d\x6a\x9a\x99\x2c\xab\x6c\x6b\x9c\xe9\x0c\xe3\x54\x2b\xb3\x6b\xc6\x93\x27\x7d\x6b\x62\xed\x9f\x99\xbf\x3d\x1f\xeb\x8b\x37\xfb\x0f\x7e\x0b\x0c\xd9\xac\x68\xca\x1c\x75\x8f\x6b\x14\x34\x42\xa2\xfa\x51\x86\xc2\x02\xd1\x65\x5b\xa8\x68\xf4\xf0\xb7\xc1\x15\x48\x38\x1a\xe3\xfd\x1e\x46\xe8\x4b\x44\xbd\xcd\xaa\xe7\x2a\x65\xb7\x32\x56\x7e\x6d\xfb\x2f\x2f\x8e\x5b\xaf\xb8\x18\xfe\x6e\xba\x7b\x40\x3b\x7c\xfa\x26\xb7\xf5\xd3\xd7\x6f\x1f\x1e\x6e\x6e\xdf\x7f\xbd\x8f\xda\xf3\xb5\x6a\x80\x21\x66\x21\x3b\x6f\x23\x72\x45\x33\x64\x8f\xf3\x52\x64\xb6\x44\x38\x31\x35\x17\x44\xda\xa3\x18\x95\x72\xb4\x1a\x50\x5d\x55\x1d\xcf\xa3\xe6\x78\x34\x4f\xc1\x56\x38\x17\x1e\x51\xb0\x31\x94\xa1\x59\xa9\x74\x01\xf2\x14\x60\x62\x08\x6d\xa4\x11\x8a\xd0\x69\x3c\x5a\xde\xa2\xfc\xa2\xc9\xb1\xb1\xf5\xb3\x84\x2c\xf8\x07\xdf\xd1\x7a\xa4\xe4\xa2\x20\x8a\xdf\x4a\x88\xbe\x7e\xfb\xf2\x80\xce\x9f\xe5\xed\xf2\xe9\x55\xeb\xf2\x36\x3f\xa5\x6d\x36\x58\x18\xa1\xc9\xad\x46\x05\xaa\xc1\x9c\x5f\x43\x03\x26\x1c\x79\x94\xb7\x5c\x2f\xf5\xac\xdb\x89\x1e\xad\x45\x89\x22\xa0\xca\xd8\x9a\x2d\xc9\x4d\x01\xf3\x5a\x96\x2e\x8b\x58\xd3\x40\xd6\x6d\x73\x96\x3b\x54\x9a\x3a\x07\x51\x4b\xa9\x95\x6a\xa9\xa5\xa6\xa7\xed\xbc\x06\x41\x18\xe5\x7e\x2f\xad\xfd\x5e\x12\x7c\x7c\x65\x03\xed\xc3\x96\xba\x68\x7e\x54\x31\x3d\x91\x88\x9f\x5c\x38\xcc\xb3\x39\x04\x66\xdc\x8e\xc8\x9e\xbb\xa1\xf3\x73\xd4\x3f\xf1\x48\xc4\x4d\xf0\x37\x9e\xb9\xfc\x56\x65\xf8\xf5\x59\x66\x38\xb5\x79\x85\x4a\x0b\xda\x0e\xb8\x7e\x49\xec\x2c\x04\x7f\x1c\x98\x8c\x99\x3c\xf7\x52\x1b\x3e\x6f\x39\xfe\xfa\xe3\xdb\xfa\x90\x07\xef\x2f\x3c\xc1\x37\x29\x75\xaf\x77\xf6\xbf\x68\xcb\x33\x5c\x19\x10\xed\x46\xa3\xe2\xb7\x3c\xca\x36\x1e\xba\x2d\xbf\x09\xa4\x62\x75\x6e\x89\x78\xec\xad\xf5\x43\xd8\xf3\xab\xe7\x5c\xd1\x5a\x48\x29\x6a\x0a\xe9\x66\xa8\x8f\x4a\x29\x96\x28\x3d\x72\x18\x7c\x4f\x26\x9e\x8a\x5b\x1b\xaf\xc1\xdf\x04\x1f\x7c\xf6\xc5\x5b\xec\xe9\xfc\xa9\x43\x74\x5e\x2e\x5e\x4d\xd3\xff\x40\xb8\xfc\xb2\x77\xc6\x79\x95\x87\x93\xfd\xae\x6d\x94\xa4\x05\x48\x9b\xe5\xa8\xa3\x5b\xc1\x43\x26\xa1\x2d\x13\xc1\x6b\x26\x30\x13\xeb\x21\x03\x5a\x36\x28\x25\x89\xcd\xab\x0a\x2c\xcc\x2c\x9c\xb8\xac\x70\x46\xaa\x22\x8b\x57\x2a\x60\x6c\x7a\x44\x08\x86\xbe\xc0\xd5\x46\x61\x31\x1d\x9a\x49\x42\x99\x16\x94\xe2\xfa\x98\x6e\x53\x91\x11\x53\x0d\x55\x85\x65\x38\x82\x69\x53\x93\xe2\x1d\xb7\x8d\x7b\xdf\xcb\xfc\xa7\x37\x3e\xe0\x17\x8a\xd3\x3e\xeb\xf2\x4d\xc3\x95\x87\xb9\x6f\x32\x0a\x1d\x9d\x37\x16\x74\x94\xaa\x5c\x54\x4f\x81\x33\x4b\x8d\xa8\x7b\x0a\x1c\x72\x50\x84\x4b\x6b\x85\x6d\x62\xac\x94\x96\xd0\x33\x66\xd2\xc2\x9d\x0c\xea\x3a\xa3\xbb\x75\x00\x87\x66\xb9\x49\x26\x95\xe6\x1e\x5f\x94\x7e\xce\xd9\x05\xef\x2e\xee\xd8\x5f\xff\x2f\xf4\x3e\xbc\xbd\xea\xea\x77\x9f\xc1\xf0\x70\xee\xf3\x3e\xbc\xee\x4f\xfe\xc9\x13\x03\xbc\x40\xf4\xcb\x75\x81\xf8\xbc\x27\x32\x22\xa6\x05\x37\xfd\x3c\xba\xc2\x9b\x0a\xb6\x8d\x75\x79\x53\x5b\x1e\x6b\x6b\x97\x92\xb5\x38\xb5\x19\xae\x60\xed\x19\x28\x3b\x03\x43\x8d\x41\x3d\xe0\xe5\x34\x67\xd0\x83\xaa\x90\x0d\x97\x34\x73\x25\xb4\x53\x89\x65\x8d\x95\x3d\x16\x99\x69\x51\x51\x3c\x05\x0d\x04\x14\xe6\x22\xaf\x4c\x31\x96\x25\x61\xde\x5c\x60\x42\xad\x69\x5b\x03\x74\x55\x9a\x5b\x7e\xe5\xb6\xdd\xb2\x78\x0a\x6e\xbd\x6f\xd0\xbf\xbc\x65\x25\x86\x6f\xca\xa8\xbd\x8f\x78\xfe\xda\x05\x54\x79\x78\x77\x21\x2b\xc6\xcb\xa9\x89\xa7\xb4\x36\x58\xe5\xb6\x22\x79\xf6\x98\x23\x59\xe5\x6d\x51\x86\x2a\x65\x8c\x88\xbc\x26\x39\xe4\x1c\x9b\x8a\x6f\xf2\x90\x7c\x5f\xe3\x09\xdc\xf1\x88\x38\xa4\xe7\xd5\xbf\xcb\x6c\xc6\xa7\x90\x73\x5e\x52\x0c\xb3\x49\x74\x22\x99\x60\x82\x43\xae\xf7\x19\x5b\xfb\xa4\x6f\x59\x4c\x83\x5b\xef\x9b\xfc\x0a\x44\xde\x9f\xb4\xeb\x7c\xfe\xba\xea\xef\x87\x95\x84\xeb\xd6\x87\x78\x3b\xc6\xeb\x36\x84\x64\xeb\x50\x5a\x54\x8a\x61\x84\x7f\x13\x31\xdd\x99\x94\x8f\x03\x4a\xf5\x51\xeb\xa3\x86\x65\x57\x70\x9d\x7f\x5f\x54\x3c\x55\xb7\x3a\x26\xbe\x47\x0d\xd0\x45\xf9\xec\xf7\xde\x20\xf2\x5d\xdd\x35\x26\x89\x20\x9d\xd8\x04\xad\x40\x18\xd2\x35\xb4\x0a\x83\xa9\x91\xca\x41\x45\xb9\xb7\x8d\x88\x52\xd3\x34\xc6\x00\x59\x0d\x0a\xce\x55\x3c\xac\x12\x05\x68\x44\x03\xe3\x84\xd3\x20\x0e\x5a\x3f\x3f\x4c\x2f\xf8\xf5\xff\xbe\x7b\xbd\x9e\x6f\xa4\xff\x86\x5e\xee\xa4\x0f\xe1\xb9\x97\x79\xbe\x18\x7f\x3a\x5f\xa3\xcf\x0f\xd7\x4e\xef\x66\xdc\x26\xd2\x8c\xa2\x48\x6c\x4a\x09\x34\xab\x51\x29\xac\xd0\x48\x44\xa7\x0c\xca\x30\xc0\x79\x93\x57\x25\x64\x68\x76\xde\x82\xac\xb2\x52\x48\x13\x17\x5b\x0f\x34\xcb\x33\xa2\xca\xa9\x3a\xdf\x2b\x13\xcc\x70\xe4\x96\xce\x63\x88\x6b\x59\x08\x66\xbc\xf4\x36\xa3\xb5\x94\x2c\x08\x7d\xbe\x72\x12\x4b\x8f\x2f\xf8\xaa\xc9\xf3\x4a\x9f\x49\x87\x0f\x37\xef\x5e\xe6\xfc\xfe\xa1\xfc\xfa\xd1\xa7\x02\x6d\x6d\xbc\x6e\x6b\x1e\x1e\x95\xe2\x85\xa3\x9b\x4b\xe6\xa1\xee\x7a\x0d\x03\x41\x58\x6c\x8b\x0d\xc7\x14\x58\xd4\x9f\x70\xd8\x9d\xef\x74\xb3\x8d\x9c\xdb\xbc\x44\x2a\x4d\x85\xd1\xa6\x9e\x99\xe6\xeb\xd6\x84\x13\x3e\xb6\xc1\x21\x18\xbd\xbf\x51\x1b\xbc\x7b\x55\x61\x5e\x1c\xc2\xdf\xd6\x97\xd1\x0f\xec\xa6\x4b\x9f\xd8\x86\xdc\xa2\xe0\x29\xa0\xb5\xef\x77\x8b\x6c\x73\xd4\x82\xb3\x7e\x9a\x7a\x7e\x45\x89\xe3\x86\xdb\x48\xa3\x02\x8e\x66\x4b\x7d\xe9\x91\x57\xe1\x80\x92\xc7\x8e\xf3\x98\x78\x62\x53\x85\xf2\xce\x75\xac\x6b\x02\xef\x39\xcf\x6e\xdb\x78\xf0\x0a\x84\xff\xe3\xca\x36\x7b\x21\xb9\xbc\x1e\xf5\x5e\xe4\x4e\x7f\x90\xc7\xf6\xeb\xa7\x8f\x77\x1f\xe2\xca\xe6\x45\x28\xb7\x0a\x53\x14\x38\x64\xa0\x46\x13\xe4\x3b\x1d\x8c\xe4\x9c\x4e\x08\x97\x6f\x13\xd7\xa6\x10\x93\x4d\x6e\x4d\x27\x75\x59\xa2\x60\x89\x87\x9c\x60\x2d\xa8\x94\xda\xea\x79\xd6\x56\x53\xa1\x29\xa3\x42\xd6\x14\xba\x4d\x54\xa5\xb5\x9c\x51\x2c\xc3\x3c\x08\x2e\x19\x6a\x2a\x56\xc1\x9f\x82\xdc\xd7\xc3\x6f\x53\xf4\x7f\x3a\x5c\x51\xbb\x3d\x43\xf5\xee\xc3\xc7\xf7\x97\x58\xfd\x73\x15\xfa\x93\x97\x9a\xb4\x9c\x48\x5a\x6c\x43\xc5\xb4\x3d\x8d\x8b\x9d\x67\x14\x64\x70\x04\x5b\xa1\x6c\x89\xa9\xc9\x1a\x24\x09\xd8\x46\x82\xac\x51\x35\xc7\x2a\xeb\x74\x3a\x70\x2a\xa4\xb5\x04\x65\x0c\x31\x68\x0c\xd0\xd2\x6b\xdf\xd0\x50\x67\xba\x86\xc6\x5a\x83\x2a\x58\x3a\x69\x10\x0d\x02\x14\x12\xef\x31\xa2\xfc\x5e\x7e\xb9\xde\xaf\xea\xe1\xe0\xfe\x21\x1c\xd0\xe4\xc2\x14\xf0\x11\x11\x06\xdd\xe8\x7a\x18\x04\xe2\x2d\xd4\x51\x7d\x6e\x27\x0d\xb0\xbe\x99\x51\x73\x9a\xc3\x19\xec\xac\x50\x8a\xea\xe0\x26\x70\x4f\xd5\x2d\x89\xcd\xb3\x5e\xe2\xde\xa3\x0c\x7b\x57\xf0\x43\x2a\xb0\x17\x9a\x9e\x97\xc2\x8f\x9f\xe2\xdd\x00\xc8\xeb\x70\x1e\x50\x70\x13\x7c\x0f\x9c\xe7\xc8\xb7\x61\xfa\x88\xaf\xef\xbe\xe3\x28\x48\x4d\x12\xa5\x89\x34\xea\x29\xc8\x50\xaa\xcb\x32\xd9\x6a\x0c\x35\xf4\x3c\xcc\xdd\x86\x63\xb3\xd5\x48\x2b\xa5\xc0\x07\x9c\xd7\x22\x2d\x0b\xb0\x43\x61\x0b\xd6\x9a\xa5\xd4\x64\x7a\xe6\xcf\xf5\x17\x2e\xf2\x25\x3b\xfb\x95\x3f\xf1\x35\xec\xea\x99\xdc\x4f\x0e\x7c\x33\x49\x1a\x89\xad\x68\x42\x4c\x37\xd1\xc9\x8d\xd5\x21\xd6\x1b\x89\x82\x2c\xd9\x5a\x13\x57\x8f\x83\x7f\xf5\x1b\xc6\xd8\xb4\xdc\x6a\x94\xc3\x6c\x8c\x68\x0d\xc6\xc8\x19\xe0\xe6\xc2\xa3\xac\x3c\xae\xf8\xff\x06\xff\xdf\xf9\xee\x38\xbc\x7b\xf8\xf5\xd3\xe7\x5d\x6a\x7b\xe9\x05\x5e\x8c\x67\xae\x2c\x9f\x8b\x92\xf8\x75\x11\x74\x73\xfb\xe9\xe3\x4b\x44\xd5\x7e\xf7\x1f\x09\x38\xb4\x66\x89\x4b\xb2\x30\xdf\x96\xa2\x14\x4c\x4b\xad\x68\x9a\x25\x36\xe5\xac\x6a\x69\x0b\x1d\x41\x55\xcf\xca\x6d\x69\x6d\xde\xf4\x58\x48\x91\xd7\xb2\x70\x6d\x85\x34\x08\x64\xb5\xab\x50\x13\x35\xa6\xae\xa5\x8a\x7b\x83\xfb\x6e\x3c\xb6\xa6\x57\xb5\xc1\xa3\x99\xa8\x2d\x8e\xc6\x6a\x2b\x8d\x74\x2d\x0a\xa6\xa2\x30\x55\x01\xab\x64\x85\x2b\x79\x57\xe4\x0d\x5d\x4d\x9b\xa5\x2e\xc7\xd4\x3b\x93\x3f\xcf\xd1\xe2\x21\x38\xbc\xf8\xff\x5d\x11\xa7\xcf\xef\x6e\x0e\x7f\xe4\xea\xb5\x0f\x2a\x5e\xa3\x51\x37\x8e\x6c\xf6\xa4\xcb\x70\x0a\x49\xc7\x78\xb3\xc0\x14\x05\x5b\x50\x0b\xab\x33\x69\xd9\x49\x46\x7a\x6c\x1f\x87\x38\x15\x50\x95\xb9\xcd\x4b\x68\xaa\xdc\xe6\x55\x3c\x28\x9e\x19\x5e\xda\xda\x72\x56\x98\x99\xd0\xdc\xe6\xf9\x60\x64\x85\xb5\x95\x54\x54\x35\x4d\x09\xaf\x38\xf5\x98\x2f\x22\x97\xec\x96\x7f\x7c\x4e\x2a\x7d\xb8\x7b\xf8\x47\xf4\x1f\xd1\xb3\x73\x17\x7a\xd8\x1f\xdc\x3b\x1f\x38\xbe\x1b\x77\x45\x53\x99\x87\xd5\x36\x15\x75\x55\xf7\x52\x1b\x6d\x07\xb6\x09\x58\x81\x20\x57\xc2\xf4\x14\x90\xb0\xca\x72\xb0\x7b\x98\xd9\x21\x20\x74\x2b\x4a\x5e\x60\xe3\x68\x5b\x57\x45\xeb\x50\x03\x52\x6b\x81\x69\xdc\x55\xe5\x6a\x2d\x4c\xde\xe0\xef\x80\xe8\x13\xb9\x69\x0e\xc9\xff\x50\x8f\x85\xfe\x40\x8f\x15\xb5\x2e\x64\x52\x32\x99\x5b\xca\x1f\x67\x17\x32\x20\x71\xf6\x38\xfb\x57\xa1\x9d\xab\xbb\x53\x61\xb4\xae\x9b\x43\x02\xf2\xa4\x19\x4f\x4d\x4a\x0c\x98\xb8\x82\xc9\x02\x76\x51\x4e\x1b\x21\xa4\xe4\x46\x28\x3f\xc7\x8b\xa2\xd2\xf3\x95\xe4\x73\x0f\xe0\x3b\xfc\x2f\x9f\xef\x3f\x9c\x5f\x0f\xd1\xc3\x3d\x7a\xb8\x7f\x88\x9a\x48\x88\xe9\xb1\x39\xe2\x71\xae\x16\xa4\x2b\xc4\x0a\x28\x50\x5d\x82\x8b\xe5\xa3\x31\x06\xf5\xc6\x2f\xc4\xe6\x94\xa3\xde\xe3\x7c\xea\xa2\x8f\x4e\x2f\x2e\x4c\xff\xf9\x79\xf6\xfc\xec\x8c\xf5\xcf\xe8\xe7\xdb\x1d\x89\xf1\xce\x58\xe1\xb9\x60\xfc\xe7\xdd\x15\xeb\xfc\x45\x75\x9b\x6c\x2a\x4c\xec\x63\x60\xd1\x92\x6c\x4d\xb8\x24\x28\xd9\x92\x43\x00\x86\x50\x98\x30\x0c\x78\x2e\x61\x88\x4c\x89\xf0\x63\x70\x08\x1e\x83\xd8\x99\xe6\x71\x25\x2c\xce\x28\x63\xb4\xd9\x32\x85\x71\x0b\x7d\xa9\xca\x5e\x17\xed\xc6\x64\x80\x02\x19\xe6\xb7\x3a\x5e\xcf\x1d\xd3\x4b\x46\x99\xdf\x19\x1f\x64\x54\x64\x85\x2b\xf3\xa8\xfa\xae\xe3\xe9\xbb\x7e\x0a\xe2\x8a\xe2\x92\x09\xfd\x14\x18\x64\x76\xce\xe8\xce\x41\x5f\x3d\x6e\x79\x4d\xa8\xf1\x71\xc2\x17\x10\x33\x3e\xdc\xfe\x82\x3e\xdc\x7d\xf8\x72\x73\x78\xb8\x7d\x53\x28\x7e\xbb\x4e\xf9\xdd\x28\x90\x44\xf9\xa6\xa2\x73\x81\xdb\x97\xa1\x0d\x2d\x81\x05\xfa\xa8\xda\x2c\x4a\x11\x67\x80\x61\x4a\x5c\x03\xc7\x38\x21\x48\x67\xba\xab\x9b\x7c\xa8\x19\xc9\x80\x51\x28\xc9\xb6\x0a\x74\xc4\x30\xa3\x85\x68\xde\x7a\xe4\x92\xe8\x3c\x95\xda\x12\xa7\xce\x1b\xf7\x6c\xd5\x02\x43\x93\x9a\x8c\xe8\x05\x84\x33\x0a\x15\xfe\xb9\x3d\x3f\x0b\x55\xf0\xd7\xc1\x4f\x17\xe4\xe4\xfd\xce\x4e\x41\xc1\x73\xc4\xc5\x61\x9f\x30\x5c\x2f\xd2\xbe\x60\xc6\x89\x4a\x53\xa4\x50\xc3\x40\x00\x03\x03\x15\x0b\x13\xe4\xaa\xbc\xc9\x2a\xa8\x62\x8a\x19\x22\xee\x71\x71\x51\x29\xc8\xa9\xa6\x71\xfa\xb8\x1c\x2a\x91\x26\xab\xb6\x1a\x95\x70\x6c\x4c\x9f\x32\x51\xd5\x6c\xd2\x35\xdf\x46\x42\xc3\x4a\x88\x6d\x3c\x7a\x5e\x40\x75\xdb\xc4\xb3\xbf\xff\xfe\xcb\x1f\xf1\x02\x7c\xa6\xb0\x77\xb9\x79\xe6\x33\xf9\xe6\x61\x3f\x99\xd1\x5a\x15\x51\x60\xbf\x4b\x13\x2e\x59\x01\x24\xee\x1e\xc9\x7c\xe3\xb6\x39\x23\x4d\x62\xd2\x34\xb5\x59\x59\x80\xe8\x08\x0c\xc5\xd6\x8a\x30\x29\xb7\x35\x9e\x29\x83\x66\x18\x10\xc3\x15\xd4\xc6\x1a\xe8\xca\x2c\x49\xd2\xdc\xb1\xae\x2a\x70\x8d\x6a\x28\x85\xa5\xe7\x3d\xf5\x7c\x7c\xda\xe7\x4b\xfd\x29\xf8\xfb\xd7\x75\xd4\xb5\x93\xbd\x7f\x23\xac\x7d\x13\xfc\xfb\x0b\x4a\x42\xe7\x3c\x6f\x22\xff\x2d\x8f\xf2\x8d\xaf\x36\x2d\xac\x51\x42\x2b\x23\x51\x15\x4d\x36\x2d\x9a\x46\x49\x4b\x32\x56\x49\x94\x21\x73\xee\xd4\xcd\x6c\xcc\x1c\xd9\x5c\x70\xed\xb4\xd1\xa3\x94\x28\x41\x65\x5e\x73\x69\xb5\x56\x75\x41\x2b\x39\xfb\xf9\xfb\x79\xcf\xb1\x41\x16\xfc\xe3\x2b\x4d\xd3\xbb\x0f\xd7\x49\xc6\x4b\x4c\xe5\x7b\xcf\x27\x7d\x31\x56\xf8\xe9\xe3\xe7\xbb\x0f\xb1\x76\x79\x19\x2a\x57\xf5\x3d\xca\x29\xf4\x7d\xb3\xf2\xd9\xd5\xa2\x28\xea\x09\x0b\x65\x2b\x90\x5b\xe9\x2a\x62\x28\xa5\x2b\xca\xad\x8d\x6d\x2e\x6b\x03\xe6\x68\x73\x8b\x9d\x11\x8a\x6b\xb9\x94\x45\xbd\xa8\x55\xb7\xa8\x40\xa6\x74\xee\x94\x85\x83\xe4\x16\x31\x71\xf2\x9e\x58\x7b\x6f\x68\x82\x77\xbb\xef\xea\xcd\xed\xdd\x2b\x17\x84\x2f\x0f\x5f\x0e\x9e\xc5\xf8\xf5\xdb\xc3\x27\xb4\xd3\x87\xfc\x1c\xe6\xe1\x39\x56\xf5\xd7\x4f\x37\xbd\x68\x46\xef\x39\xa4\x4e\x12\x79\xdf\x2d\xe8\x2b\xb4\x3c\x1e\x2b\xca\x4a\x68\x53\x54\x00\x0f\xc5\xf9\xfe\xce\x9d\x0d\x45\x88\xab\x6d\xdd\xe4\x24\x1b\xee\x04\xaf\x62\x53\x97\x39\xac\x06\x56\x63\x50\x62\x96\x5c\x95\x9b\x36\x4c\x0e\x12\x05\x5a\x9f\x3b\x92\x63\x9d\x58\x57\x33\x4d\xb8\x6c\x82\x2b\x1f\xca\xc6\xcd\x95\xf3\xbc\xab\x77\xfd\x71\x9f\xab\xbc\x9b\xdb\x4f\xf9\xc7\xeb\x91\xbe\x0a\x80\xdd\xb1\xf3\xfb\xf3\x07\xb9\x4d\xe8\xb0\x78\x71\xd5\x78\x4a\xed\xdc\x1d\x4b\x34\x3f\xaa\x90\x9e\x8b\x87\xac\xb3\xa1\x0e\x69\xb5\xcd\x1b\x9b\x84\x65\x9a\x8b\x4a\x55\x94\x63\x68\x12\x54\x82\x8a\x1b\x5d\x64\xab\x81\xc1\x84\x1c\xca\xb0\x4d\x13\x53\x19\x2b\x41\xcd\xd2\xba\x9a\x2a\xc2\x64\x5b\x19\xce\x51\xa6\x77\xbc\x76\xcf\xa7\x32\xf1\x10\xe4\xc1\xc7\x7d\x95\xbd\x68\x32\x7f\xc7\xa7\xf9\xf2\xb0\x57\x40\x3b\x6b\x7c\xff\xeb\xbc\xbf\x24\x87\x1a\x65\x30\x9f\x78\x85\x63\x61\x4f\x81\x11\xb5\x40\xc1\xb9\x29\x36\x64\xeb\xc3\x3a\x4d\x20\x08\x6d\x92\x86\x6c\x53\x59\x1e\x76\x27\x1a\x07\xa7\x20\x1e\x60\x36\x30\x13\xb2\x8d\x18\x23\x8b\x4b\xc3\x1b\xa3\x0d\x26\x04\x6b\x98\x09\xd6\xa7\x75\x7c\x75\x3e\xe7\xe0\xaf\xfe\x32\xdf\xe6\x0d\x17\xeb\xe1\xd7\x4f\x71\x80\x8b\xb0\xfb\xad\x09\x97\xa2\xb4\x55\x81\x9a\x9d\x6f\x93\x9f\xba\xf0\xb8\x15\x6e\x2b\xc2\xe3\xa9\x0b\xd3\xbc\x8c\x67\xa1\x8c\xe1\x0c\x34\x13\xa2\x2e\x39\x31\x83\x81\x16\x51\x33\x18\x8a\x83\xc3\xce\xc1\xbe\x78\x0b\x3c\xf3\x9f\xfe\x72\xaa\xf5\x8f\x51\xf0\x26\xca\x5d\x94\x9d\x66\x0f\x44\xd1\x53\xeb\x4e\x4d\xc4\x36\x1e\xba\xd3\x84\xb2\x9d\x56\x1f\xa6\x8f\xe4\xfa\x2e\x56\x4a\x19\xb6\x69\x69\xc6\xd1\xc8\x50\x7a\x41\xd6\x25\x68\x26\xda\x79\xb0\xf1\x7c\xe9\xc9\x9e\x8f\xe3\xf5\x2c\xee\xe3\x1b\x02\xd8\x14\x1e\x6d\x38\x6d\xe7\x76\x78\xc5\xdb\x0a\xab\x85\x09\xb0\x40\x0e\x25\xdb\x70\x68\xcc\x29\xb7\x36\x9a\x4e\x79\x4c\xad\x35\xb0\x32\x2b\x50\x09\x12\xf5\x30\xb4\xda\xac\xdb\xb2\x59\x8c\x43\x01\xc2\x1b\xad\x1c\x82\xe5\x89\xdc\xe6\x71\x1d\xdc\x5e\xd8\x8b\xff\xf1\x15\xa2\xb1\x37\x7f\x77\xaf\x15\xcf\x7e\xf6\x94\xdb\xef\xab\x89\x35\x4a\xbf\xaf\x28\x33\xda\x2d\xf5\x1c\xe6\x53\x27\xfa\x23\x1c\xcf\x7d\x68\x5c\x7f\x3f\x12\x7c\xc8\x37\x09\xd5\xb9\x3b\x45\x03\xea\xc8\xd0\x4a\xdb\xaa\x56\xf5\xfa\x34\x7b\xa3\xd8\x18\x05\x5e\x67\xc4\x7c\xff\xb0\x73\xa2\x2f\xca\xce\x68\x17\xdf\xfe\xab\x9f\x78\xc9\xf3\x16\x6e\xa3\xf1\x54\xd6\xee\x26\x70\x8f\x38\x66\x90\xa8\xe5\x14\x98\xb0\xd9\x98\x31\xe7\x8d\xcd\xe3\x1d\x61\xe1\xe7\xbd\x36\xb8\xf3\x95\xfe\xf9\x53\xec\xa8\xc3\x65\x86\x16\x7d\x7e\x76\x7a\x3c\x6f\x15\xb7\x85\x85\xa6\xdc\x24\x0b\x71\x05\xbd\x45\x93\x49\x2d\x6b\xaa\xd4\x66\xf5\x53\xe0\x68\xd4\x82\x5e\x36\x07\x52\x23\x16\x26\x0b\x92\xf3\x0c\x76\x5b\x30\x36\xe5\x20\x08\x0f\x82\xd8\x7b\xbf\x6a\xef\x17\xfc\x57\xfe\xec\x05\x5e\x11\xfc\x8a\xa0\x7f\x78\x7f\xbe\x7e\x87\xc4\x39\xd4\x4a\xe6\x88\xdc\x26\x43\xa5\x95\x51\xe0\x60\x3a\xcd\x24\x1c\x63\x79\x1a\xc3\x7e\x58\xc8\x3a\xa4\x25\x4c\x0b\x9d\xa6\x0a\x4a\x67\xd5\xf9\xe7\x1b\x9f\xe3\x61\x7e\xfc\xf9\xf7\xb7\xe1\xfe\xf3\x7f\x42\xfe\xe7\xc7\xa3\xb5\x68\x70\xb5\x13\x76\x6b\x5c\xad\xad\x8b\x32\x0d\xc3\x56\xf0\x70\x8a\xcd\xc9\x86\xab\x17\xe5\x16\x4b\x51\x42\x37\x51\x94\xc0\xc2\x80\x3a\xd3\x9c\x7b\x43\xf7\x44\x6f\xeb\x58\xef\x38\xef\xeb\x78\xc4\xbb\x0f\x77\x3e\xb3\x25\x1a\x6c\x19\xe1\x8d\x86\xf5\x66\x3c\x63\x1a\x33\xa1\xc7\x58\x97\xda\x74\xa6\x33\xe0\xa2\xa5\xad\xc5\x7c\x7e\xa6\x95\xc7\x7f\x74\x70\xef\x7d\x9c\x3f\x9f\x7f\x42\xb8\xa7\x33\x5c\x92\xc8\xde\x5f\xd1\x86\xcb\x5a\x1f\x3a\x63\xc6\xac\xd5\x4d\xda\x84\x29\x94\x16\x55\x2b\xb2\x76\x0f\x3d\x3f\x09\x24\x40\xc4\xfa\x7b\x1f\x26\x30\x4c\xb4\x43\xa9\x19\x50\x0b\x53\x85\x24\x68\xb3\x35\xc6\x84\xec\xb9\xf6\x8a\xa5\x9f\xfb\xbc\xf8\x2a\xbc\x1a\xc7\xee\x03\x9f\xf3\x9b\x38\x25\x6d\x77\x5e\x83\x07\xcb\x95\xb2\x76\xe5\x08\x3b\xe0\xa8\x3d\x37\x45\x43\x6c\x54\x91\x0f\xa6\x68\x9c\x76\x6a\x6b\x42\x3a\x77\x72\x42\x85\x69\xf3\x54\x97\x41\x10\x85\xf4\x09\xdf\x36\xb1\x0e\x7e\x0a\x7e\xd9\xd3\xa0\x7e\xfe\x3f\xd1\xbb\x87\x57\x21\x13\x5f\xa2\xab\xcd\xc4\x35\x47\xfe\x83\x6f\xf5\x6e\x30\x5e\x60\xe6\x0c\x64\x2a\xad\xb0\xcc\xc5\xcc\x1e\x25\x12\x14\xda\x09\x66\x30\x14\x91\x79\x60\x0a\x65\xa2\x3f\xd6\xb1\x86\x91\x69\xca\x8e\x7d\x87\x25\x6e\xa7\xcd\x8a\x49\x61\x62\x68\xad\xb0\x2d\x99\x6e\x2d\x17\xbe\x67\xf0\x98\xba\x8c\xa7\xd7\x33\xf3\xfb\x0b\x8d\xfb\x7f\x10\xff\xf1\x47\x4b\x1a\x1a\xf3\x5c\x91\xa2\x39\x1d\x43\x5d\x0b\xc2\x72\x89\x09\xa4\x0e\x32\x1b\xaa\xd3\x84\x2a\x9f\x35\xad\xd1\xf2\xa8\xaf\xef\xe2\xca\x98\xb2\xa0\x94\x69\x7d\x3a\xee\x34\x75\xe2\x63\x72\xc7\x68\xd6\xc0\x8d\x31\x97\x28\x93\x20\x0a\xeb\x27\xed\x67\x62\xd7\x59\xd3\x5f\xf4\xf6\x3e\x64\x38\x47\xc7\x47\x19\x06\x79\x89\x3a\x57\x2b\xd4\x7f\x1f\xc3\xbe\xd9\x26\x43\x1c\xd1\x71\x7b\x5d\xdb\x4b\x10\x7e\xd6\xa4\x10\x86\x05\xba\x0a\xd1\x7d\xef\x43\xde\x3b\xca\x1c\x72\x8f\xe9\x5f\x9a\xb9\x8f\x37\xb7\x6f\x90\xa5\x3f\x3a\x2f\xd7\xfd\xf0\xeb\x9e\x1c\xf1\xeb\xa7\x6f\xf1\xe1\x97\x1b\x2a\x9a\x6e\xea\xf9\xf9\x57\x68\xcb\xd3\x2c\xae\x1e\x65\xc9\x50\x6d\x42\x55\xd7\x98\xfb\xb3\x94\x1b\x10\x56\x68\x89\x88\x83\x2a\x2c\xf3\x6c\x18\x31\xca\x96\x71\xc6\xa8\x46\x18\xe5\x87\xbc\xa6\xa4\xc2\x9a\xd3\x22\xcf\x70\x65\x08\xe3\x1c\xea\xbd\x0d\x9b\x7c\xb6\x01\x41\x2d\x25\xd2\x75\x06\xe3\xb2\xd0\x65\x55\x16\xaa\x22\xcc\xf3\x74\xf5\xad\x8c\x8b\xe0\xdf\x07\xef\x77\xdd\xf0\xcb\xd3\x73\x78\xff\x5c\x62\xfe\xf4\x52\x62\x7a\xce\x58\x72\x58\x36\x16\x15\xbf\x25\x51\xb9\x31\x14\x58\x6c\x6a\x21\x04\xb6\x72\x8c\x16\x93\x66\xad\x12\x52\x91\x92\xc8\x26\x2e\xcc\x49\x19\x13\x29\x9c\x4f\x56\x9b\x46\xf5\x4d\x8d\x02\x24\x73\xc1\xad\xd1\x8d\x72\x8c\xd7\xcb\xde\xb7\x55\x9e\x9f\x9a\xfa\x24\xa8\x5d\x8d\xfe\xe2\xe9\xb9\xdb\xda\x1c\x5e\x07\xe3\xfd\x5b\x24\xf7\x48\xd9\xae\x43\x14\xd5\xd6\x8c\x83\xc4\x64\xeb\xb6\x16\x23\x1d\x0a\x84\x51\x22\x60\x86\x61\xeb\x4c\x07\x1e\x68\x9a\x6b\x4c\xc3\x51\xf5\x28\x41\xa6\x06\x0e\x03\x68\x48\x05\x1a\x10\x76\xba\x6f\x28\x6a\xb5\xed\xfb\xfa\x90\x57\x9d\x48\x4b\xc9\x4d\xaf\x30\x66\x89\x31\xab\xee\xf4\x60\x2a\xea\xac\x52\x98\x51\xa2\x8c\xa0\xc4\x30\x69\x89\x2d\x6b\xc2\x15\xd1\x7d\x29\x08\xe5\x5e\x93\x85\xbd\x5f\xd4\xeb\x2c\x80\xe0\x7f\x2a\x0b\xc0\x77\xe1\x57\x4c\x66\xd6\x25\x32\x68\xa0\xd3\x08\x6d\xe8\x36\xce\x54\x2d\x72\x25\xab\x4d\x86\x1a\xcc\xe4\x78\x48\xd3\xb0\x1b\x5a\x0b\xb3\xee\x56\x89\xd2\x38\x18\x47\xd9\x2d\x87\x84\x94\x4f\x81\x36\x44\xf0\xce\x80\xba\x18\x6b\x0b\xd3\x51\x55\xa9\x55\x0b\xa9\x36\xcb\x16\xad\x4d\x6b\x06\xd9\x5f\xb4\xc5\xf5\x13\xbd\x2d\xe3\x2e\xf8\xbb\x2b\xd2\xf2\xda\x1b\xe9\xeb\xbd\x3f\xe3\x17\x17\xb4\xc3\x2b\xf6\xe0\x05\x88\xdc\x2f\x19\x31\x69\x1e\x6a\x35\x73\x9d\x77\x94\xd3\x14\x3a\x90\x15\x6a\x91\x48\xb6\x9e\xf0\xba\x39\xe9\xd5\x2e\x8b\x55\x19\x8c\xa0\x73\x14\xac\x31\x11\x58\x57\x22\xee\x72\x4a\x4f\x3d\xd8\xdc\xe6\x0a\x05\xae\xb6\xca\xd9\x5e\x8b\xba\x53\x7e\x6d\x06\x56\x96\x46\x33\x87\xd1\x91\x09\x49\xa5\xf0\x7b\x03\xf6\x59\x46\xf7\x3b\xe3\xfe\xb9\xda\x7a\x76\x05\x8d\x1e\xae\x6a\x81\xdf\x03\x45\x5d\xb8\xba\x70\xde\xb2\x28\xb1\xdf\x95\x8d\x92\x2d\xa9\xa2\xea\xd8\x9c\xea\xb8\x9d\x61\x8e\x8a\xd3\xb1\xae\x39\xcb\x08\x17\xa7\x21\x56\x5a\x1b\x0e\xcd\x38\x22\xc6\xb7\x5c\x61\xa2\xad\xe0\xa5\x69\x76\x45\x80\x0e\x0e\x41\xe7\xf1\xd0\x2e\xf8\xf7\x17\xc5\xef\xaf\x57\x05\xd5\x6e\x90\xf1\xf1\xee\xc3\x97\x0f\x17\x6e\xc0\xe1\x3a\xb4\xd9\xdb\xca\x03\x55\xc5\x8a\x32\x06\xcb\x53\x70\x84\x23\x43\x06\xa8\x59\x9c\x5b\x96\x38\x25\x85\x29\x30\xd8\x68\x1a\xb6\x99\xa2\xbe\x39\xcd\x71\x47\xaa\x5e\x58\x39\x4f\x46\x1e\xf5\x29\x15\x36\xce\xb7\x24\x14\xb2\xd6\x85\xae\xa1\xaf\x41\x28\xeb\x1d\xef\x50\xb8\xf8\xbd\xc5\x06\xff\xf8\x8a\xb7\x70\x9d\x9e\x5c\xdd\x80\xbe\x3c\x7c\xfd\x57\xf4\x10\x29\x64\xbc\x5f\x7b\x82\x16\xc0\x12\x71\x06\x8d\xb3\xa0\x19\x92\x35\x28\xd4\x26\x50\x47\xfd\xf1\x68\xea\x0a\x1b\x68\xb5\xb3\x48\x41\x3f\xea\x23\x4a\x0d\xae\xea\xf3\x3e\xad\x9f\x68\x74\xde\xf3\xff\xec\x19\x78\xbb\x3b\xdd\x0f\xa3\xb9\x9b\x4b\x0c\x39\xb3\xb2\x2a\xcd\x71\x3e\xb6\x05\x4c\xd0\x14\xad\x6b\xda\x7c\x54\xa6\x46\x7b\x28\x44\x86\x9a\x70\x4c\x52\x4a\x4b\xb0\x6d\x5e\x4a\x5a\x2a\x3d\x14\xa9\x69\x51\x56\xac\x5b\xa2\x19\xb6\xbe\xd6\x0b\xec\x13\xbd\x35\xde\x4f\xee\x3f\x5d\x7c\xd1\xff\xc8\x4f\xee\xe0\xc7\x84\x87\x5f\xde\x1e\xcb\x7e\x11\x22\x7f\x44\x71\x10\x66\x76\x9a\xae\xa4\xd5\x6d\xde\x94\x93\xc6\xcc\xb0\xa0\x60\x28\xa0\x87\xba\xe8\xdb\xa6\xcb\x27\x63\x64\x48\x9b\xda\xf0\x96\x67\xd0\x81\xa8\x50\x13\x19\x94\xc3\x64\xb6\xac\x66\xb9\x2d\x58\x38\xe4\x69\x3e\x94\x60\x8f\x25\x96\x75\xa5\xf4\x58\x66\xba\x41\x69\xb1\x4e\x7e\x3c\x01\x52\xd7\xcc\xed\x78\x61\xa0\x9f\xf8\xad\xf4\xb3\xad\xdc\xdf\x2f\x1f\x7f\x3c\x67\x3f\x9a\xf9\xed\xe7\x4f\xa2\x4c\x98\x71\x9a\xba\x02\x06\x50\x45\xdf\x34\xcd\xee\xdc\x37\x45\x0c\x0c\x6a\x4e\x05\xb2\xd0\xaa\x4b\xc0\x86\x0d\x87\x5c\x57\x30\x77\xfb\x7c\x52\x75\x45\xaa\xed\x5a\x8c\xc2\x9c\x16\x63\xa2\x74\x33\x5a\xfa\x23\x8a\x83\xf3\xfd\x52\xc5\x22\xf8\xb3\xdf\xfb\xcf\x2b\xc0\xbb\xe8\xcf\xaf\x68\x25\x5f\xfe\xeb\xa7\x7b\xaf\x47\xfb\x37\x0c\xb6\xde\x45\xb2\x69\xb5\x29\x49\xce\x30\x26\xc7\x0e\x5a\x73\x43\x28\x21\x2a\xd7\x55\xb1\x2d\xc5\x54\xaf\x16\xad\x90\x9c\x5f\xb1\x30\xd0\x3b\xa7\x54\x66\xb3\xb2\xb2\x1a\xf1\xc7\xfa\x90\x27\x8f\x9a\xb2\x5c\x67\x25\xca\x61\x1d\xd4\x88\x26\x34\x81\x1b\xb7\xe3\x48\x3c\xfe\x4d\x6e\x85\x9f\xaf\x7f\xfa\x23\x04\xe7\xed\xda\xfa\xf5\x12\xf3\x10\x27\xb8\x08\x17\xfb\x5d\x98\x28\xcb\x4a\x48\x0f\xc1\x36\x45\xc9\x69\xe5\x4e\xd6\xb9\x94\xb4\xf4\x72\x9b\x2e\x5e\x09\x87\xd1\x39\x54\xe2\x0a\xb0\xe9\x0d\xcc\x35\x4b\x4d\x5a\x94\xab\xe9\x3d\xee\xbf\xf3\xa9\xfe\x7e\x9f\xba\xdd\x3f\xf8\xc0\x45\x0f\xc7\xbd\xe0\xff\x1f\xf6\x91\xdb\xe1\xf3\xcf\x37\x87\x4f\xff\x0d\x7d\xfc\x7c\xf7\xa1\x09\x4d\x99\xc2\x0a\xc7\x32\x34\xa1\xa6\x30\x43\x9b\xe4\x91\x37\x8a\x34\x74\x5b\xdb\xa5\xd9\xa6\x1a\x75\xcd\x36\xa1\xd9\x59\x58\xeb\xc9\x84\xf5\xf9\xda\x30\x91\x25\x56\xea\x2a\xaf\xb9\x69\x89\x95\x28\x9b\x1b\xa9\xec\xba\x2e\x5c\xe1\x6e\xd8\xfa\xe0\x79\x2e\x6e\xe2\xfe\xaa\x48\x7e\xfb\xac\xef\x07\xf5\x3c\x95\x78\x0e\x86\xde\x93\x71\x50\x19\x2a\x17\x9a\x4d\x14\x11\xdd\xa8\x0d\x2b\xb9\xb5\x0d\xee\xb6\x86\x85\x41\xb3\xc9\xf0\x88\x37\x85\x52\x92\xbb\x02\xc7\x58\x33\x21\xeb\x38\x6d\x5b\xa3\x8d\x32\x93\x35\x03\xc2\xe0\x5a\x6d\x17\x63\x3a\x5a\xd5\xba\x32\x75\x49\x2d\xab\xf9\x35\xe7\x91\xde\x8a\xb8\x0f\xfe\x36\xf8\xaf\xde\x17\xf8\xe1\xeb\xb7\xcf\x37\x6f\x13\xb8\x2e\x6e\x89\x0f\x5f\xbd\x29\xed\x2b\x99\x92\x8f\x6c\xf8\xe5\xfe\xe1\xe3\xc3\x7f\xfd\xf6\xf9\xd5\xff\xf3\xdf\xd0\x97\x87\xfd\x5b\x1f\x50\x12\xd2\x34\xb1\x49\x1a\xa5\x6c\xd4\x3a\x77\x86\x97\x1b\xb5\xdb\x88\xd1\xa4\xb6\x55\xa0\x2a\xb1\x48\x50\xc7\x79\x21\xeb\x2a\xcd\x96\xbc\xe9\x14\xc2\x05\x1c\x23\x87\x92\xc4\x26\x48\x8b\xd6\x7b\xd7\xd2\x3c\x83\x25\x6b\x5b\x85\xaa\x62\x89\x79\x51\x55\x05\xf4\x36\x37\x79\xa5\x60\x20\x06\xb7\x90\x95\x05\x83\xbc\x3b\xdf\x0c\x6c\xed\x17\x26\x0c\x4a\x4d\x51\x32\xc8\xda\xf3\xd7\x5c\x7b\xf9\xda\x33\x0e\x21\xe3\xe1\x45\xf7\x73\x45\x1f\xee\xde\xf8\x75\xef\x0f\xcc\xaf\x9f\xce\x1d\x69\x48\x94\x42\x1d\x2f\x9b\x8a\xa2\xf3\x8a\x7b\x84\xc2\x6e\x4b\x0d\x15\x43\x52\x02\x46\x33\xd4\xc8\x30\x11\x11\x48\xe3\x41\x35\xda\x14\xaa\x36\x30\xfa\x58\xff\xf3\x4a\xec\x66\x8d\x4a\x23\xc4\x56\xa3\x12\xc6\x0b\xfe\xda\x1e\x92\xe0\x4f\x41\x76\xf1\x2f\xf9\x41\x35\x8a\x3e\xa7\xb7\xfe\x0e\x45\x9f\x5f\xec\x58\x3e\xfc\xd3\xaf\x5f\xce\x4d\x96\x67\x9d\xac\xdf\x6d\xbc\x7c\x97\x4b\x84\xb3\x02\x98\xa3\x02\x56\x3a\xba\xc8\xda\x82\x88\x2a\x31\x19\xef\x1b\x0e\xc4\xda\x43\xc2\x98\x59\x0d\xd2\x06\x57\x5b\x09\x9d\x32\xdc\xe2\x09\x05\x80\xf3\x94\xb8\x6a\xac\x09\x47\xe3\x66\x82\xe7\x73\x63\x0e\x41\xf0\xf3\xce\xd7\x79\xe1\x45\x5f\x84\x2f\xdf\x1e\x3c\x2a\xfc\x47\x35\xd2\xd7\x6f\x0f\x3a\x24\x65\xe1\xb2\x3c\x9a\x1e\x87\xba\xb1\x94\xd7\xa8\x76\x90\x86\xc7\x88\xeb\x26\x0c\x20\xe0\xdc\xef\xd9\x74\xeb\x42\xa2\xc4\xa6\x62\x4e\x69\x81\x2b\xd3\xb5\xa7\x29\xb4\x04\x2b\x94\x2c\xda\x4a\x5e\x19\x98\x28\x49\x6d\x9a\xa1\xc4\x68\x4a\xce\x35\x7e\xc8\x9e\xa4\xe7\x93\xfd\x79\x4f\xc0\x7d\x8b\x20\x7a\x3c\xee\x66\x26\x33\xcc\x5e\x47\x9d\x7b\x34\xa6\x0b\xc9\x38\x95\x61\x16\x2b\x5d\x66\x60\x0c\x30\x63\x50\x63\x10\x4f\x13\x7d\xf1\x0a\x22\x9e\xe3\x78\xae\x09\xfe\xd3\xa5\x1f\xde\x81\xd3\xeb\x78\xce\xd7\xda\x17\xe0\xf4\xf3\x7e\x16\xee\x3e\xdf\x7d\xfd\x16\x2b\x8b\x43\x6d\xab\xb6\x41\xa9\x9c\xbb\x16\x26\x8e\xd2\xd6\xd4\x45\x21\x8f\xa4\xb6\xa6\x84\x7a\x1b\xad\xb5\x9d\x70\x46\xc7\x5d\xe5\x34\xa8\xd9\x28\xa3\xda\xae\x56\x75\xe3\x86\xaa\x64\xa8\x34\x53\x33\xa0\x12\xe1\xef\x2d\x5a\x29\xe1\x51\xb6\x95\x98\x5c\xe7\xcc\x87\x24\xf8\x9b\xe0\xd7\xdd\x99\xe4\x79\x19\xfd\xf6\xe7\xf7\xe8\x45\x3b\x1d\x1f\x2e\x6a\xb0\x6f\xbf\x7e\xba\xff\x67\xef\x0e\xfd\xf5\xdb\x2d\x31\xdf\xcf\xeb\x53\x5e\xb8\x2a\x3b\x05\x21\x15\x4d\x59\xc6\x29\x28\xd1\xa0\x0a\x65\x62\x85\x1a\x5a\xc8\x38\x1a\x8f\xe3\x3a\x42\x12\x36\x94\x4e\xe3\x91\xc5\x18\xda\x61\x40\x94\xd2\x42\x70\xa0\x63\x2a\x98\x59\x34\x63\xb6\x96\x4d\x65\x4b\x86\x2b\x94\x4b\x5e\x56\x72\xf0\x3d\x97\x7a\x22\xb7\x75\x2c\x82\x7c\x9f\xe7\x44\x0f\x3f\x0a\xa3\x9f\x5f\xf7\x0f\xea\x66\x39\x1d\x49\x84\x39\xe7\x32\x77\xb4\x3c\x5f\x0b\x67\xa1\xb3\xa1\xc2\xa7\xe5\xbc\xd3\x2c\x5b\xc5\xcf\xfb\x0a\x09\xd3\x4d\x84\xd6\xbf\xf2\x48\xee\xcf\x6c\x54\xfa\xeb\x84\x83\x28\xf8\x79\xef\x88\x6e\x7f\xbc\x03\x23\x15\x0d\xa7\x8a\xc6\xe2\xdc\x4a\x5b\x9d\x3b\x47\x36\x1e\x63\xbd\x98\x6d\x14\x3e\x73\x33\xcc\xf6\x75\x4f\x3c\x91\x43\x70\x23\x83\xfb\x1d\x2d\xff\xa3\x2c\xc5\x1d\x40\x7a\x59\x0d\xfc\xf6\xf9\x01\x3d\xdc\x3d\x68\x94\x58\x54\x7a\xa2\xb7\x83\xd1\xc2\x5a\x45\x73\x8f\x82\xa7\xc0\xc2\x54\xc2\xa2\x51\x50\xc0\x82\xf2\xe9\x5c\x06\xc0\x7c\x68\x87\x61\x18\x4c\xd7\x75\x1d\xcc\x06\x06\xe3\xcd\x2d\xf4\x52\x8f\xa8\x30\x57\x76\x76\xf0\x3c\xb3\xa6\x41\x16\xfc\xea\x57\x03\x0f\x5b\xdd\xbd\x0f\x6f\x6f\x3e\xec\xfc\xa8\x74\xdf\xc7\x7d\x1c\xd5\xc7\xb7\x49\x25\x37\xa6\xcc\xb2\x26\xa9\x72\xad\x2a\x60\x4a\xd7\xd3\x69\x0a\x3b\x98\x51\x50\xc2\x08\x92\x9c\xf7\xac\x58\xd4\xc4\x12\x11\xd3\x53\x42\x28\xca\x4a\x18\x39\x21\x75\x64\x41\xc0\x0a\xad\x56\x47\x74\x44\xc7\xca\x6c\x0d\xd3\xaa\x76\x45\x19\x2a\xdd\xcf\x78\xee\xae\xd7\xd9\xc4\xd3\xee\xa5\xfe\x2a\xce\x7b\xb7\x8c\xda\x5d\x05\x7e\xb0\x8c\x3a\x5c\x1d\xa3\xc2\x75\x6b\xa2\x2a\x2f\x1d\xce\xc3\xe3\x89\xb9\x06\x29\x64\xa9\xd0\x28\xef\x6c\x85\x61\xc6\x7a\xc4\xa9\x4b\x15\x8c\x93\x82\x23\x3b\x6f\x0b\x23\x05\x53\xa0\x2c\x72\xe7\xc6\x98\x72\x33\x88\x34\x27\x84\xf6\x13\x25\x38\x05\x9c\x67\x95\x2b\x8f\x9c\x50\x34\xa5\x90\xf7\xda\xa1\x3a\xd1\xf5\xd5\x1b\x2f\x8b\xcd\x8b\x07\xe8\xfd\xc3\x6b\x5a\xe9\xb3\xb7\x2e\xf2\x0f\xf3\xcd\x6b\x84\xd5\xa0\xac\x74\x05\xb2\x79\xaf\x94\xe5\xa2\x7d\x0a\x78\x3f\x18\x47\xf1\x82\xf2\x9a\xdb\x1c\x96\xea\x50\x58\xd0\xd6\x9e\xbb\x9d\x68\x18\xf2\x06\x72\x58\xb8\xa8\x39\x6f\xa5\xa6\x6d\xcd\x87\x09\x34\x26\x3d\xc2\x23\xb2\x8f\x9c\xf3\xd8\x9d\x68\x94\xbf\xe8\xaa\x6d\xf0\xf7\xbe\x83\x7e\x6e\x9d\xef\x2f\x8c\xb8\x6b\x90\xf7\xd7\x6f\x7e\x1c\xfe\xfc\xbd\x5f\xde\x7c\xef\xd7\x4f\x51\x59\x13\x93\x9d\xcb\x46\x57\xa0\x60\x1c\xc6\x7c\x71\xce\x1c\x3b\x83\x2b\xfb\x14\xc0\xd4\xf6\x24\x2e\x24\x31\x15\xf4\xe7\xff\x22\x19\x8f\x4b\x8e\x92\xc6\xd9\xe5\xe8\x70\xe5\x9e\x02\x38\xb6\x5d\x5e\xa0\xaa\x9f\x31\xc5\x75\x61\x7a\x54\x95\x99\x5d\x90\x2e\xc1\x1d\xd3\xac\xae\x8b\xed\x38\xe7\x44\x93\x7e\xc6\xe6\x77\xdf\xcf\x85\xff\x7e\x46\x09\xde\xf5\x10\xb7\x36\x9e\xbc\xd3\xdb\xfb\x17\x7f\x9a\xdf\x49\x4a\xbe\x3c\xec\xee\x30\x68\x32\x59\x8e\xa4\xf3\xc1\x5c\xc5\x46\x50\x81\x5a\x06\x15\x1c\x1d\xcc\x80\x05\xea\x51\xb6\x91\x28\x87\x92\x70\x35\xc6\x6d\x89\xf1\x34\x19\x58\x0d\x2c\xca\x35\x88\x6c\x6d\x58\xc1\xb1\xd1\x0e\x05\x06\x25\x35\xe3\x7d\x80\xc2\xf1\x49\x79\xec\xf1\x4f\xcf\x19\xd5\xcf\xbb\xe7\xa1\xc6\x05\x6a\x4f\x26\x22\xa7\xac\x09\x59\x51\xc5\x5a\x2a\xbb\xe5\x36\x92\x56\xb0\xdd\x93\xf6\x56\xc4\x3a\x48\xfd\xec\xfd\x59\x77\xf2\xac\xe4\x7c\x7d\x73\xdc\x1c\xe9\xd6\x9f\xd6\x83\xfe\x2e\x13\xa1\x8c\x14\x51\x1d\x96\xf6\x34\x5a\x1b\x95\xa7\x31\xd6\xba\xcc\x8c\x05\x05\xbd\xae\x85\x97\x6a\xb2\x6c\xd3\x5b\xcd\x78\x68\x81\xa1\xec\xc2\x93\x20\x9e\x27\x91\x06\x7f\xbe\x24\x11\xf9\x15\xfc\x15\x75\x68\xbf\x31\xd0\xe7\x9b\xdb\xe0\xda\xfe\x05\x3b\xcd\x3f\x1a\x6c\x56\x46\x01\x2b\x2d\x2e\xb7\x9a\xd6\x72\x80\xc4\xd6\x52\xda\xc8\xd9\x24\x45\x09\x52\x0c\xcc\x5c\x43\x26\x11\x47\xc9\x26\x94\x9d\xd5\x1c\x0f\xa5\xe0\x36\x99\x44\xa9\x6d\xa3\x25\x0a\x50\x60\x9c\xea\x2c\x0c\x92\x83\x72\xb6\x45\x1c\xba\xa3\xd2\x88\x69\x0e\x3d\xac\x6a\xf7\xea\x6d\x9f\xc8\x2d\x8b\xf5\xc5\xb5\xee\x52\xab\xde\x3d\xdc\xbd\x09\x8d\xfe\xe5\xa3\xc7\xec\x77\x38\x91\x85\xcc\x9d\x77\xdc\x71\xa8\x88\x1d\x4c\x5b\x56\x9b\xd8\xaa\x12\x29\xa4\xb6\xc6\x5d\xdc\x3a\x9b\xc8\x2e\xcb\x36\xc1\x9c\x66\x84\xe0\x71\x25\xde\x42\x39\xc9\x51\x6e\x97\x65\xf1\xfd\x69\xed\x33\x44\xfe\xe4\xa7\x11\x7f\x94\x64\xf6\xda\x59\x21\x0f\xcd\x3e\x4d\x4d\x7f\xc3\x51\xba\xd5\x59\xd8\xb8\x0b\x47\x38\x8d\x8a\x8d\xc5\xe9\x30\x78\xb3\xf0\x6d\xec\x3a\xd3\x59\xdb\xbd\xac\xb1\xad\x9f\x3d\x3c\xbc\x4c\x1e\xd0\xc3\x97\x7f\xd9\xb9\x91\xcf\x05\x39\xda\x2b\x40\x24\x0f\xe9\xf7\xc5\x46\xf3\x29\x03\x11\x95\xc9\x66\x0e\x66\x93\x49\x44\xb7\x72\x41\x33\xde\x06\x58\xcd\x46\x44\x28\xf5\x96\xc6\x2d\x30\xd5\x6c\x65\xa9\xb5\x6e\x52\xdd\x62\xc7\x51\xf6\x14\x48\xcd\xda\x1d\xaf\x26\x31\x8b\xe9\x35\x6f\xe8\x25\x1f\xe9\xe7\x3f\xbd\x38\x25\xde\x3f\x74\x91\x03\x92\x97\x68\x98\xb7\xb9\x0e\x83\x01\x74\x52\x32\x5a\x13\x4a\x28\x47\x99\x82\x2e\xa6\x86\x51\xb7\x75\xb3\x1e\xd1\x94\x24\x84\x09\x29\x38\xc5\xf5\x8a\x4a\x5f\x23\x61\xbf\xd6\xc8\x7f\x83\xf7\x65\xc2\xd4\x85\x18\xb2\x1e\x55\x0c\xc6\xc1\x0d\x30\x0a\x24\x1a\xc0\x11\x3f\xef\x58\x16\x54\xd7\x8c\xc8\x9e\xd6\xf0\x08\xe6\x28\x51\x8a\xc4\x25\xf7\xbe\x8e\xa5\x9f\xd9\x7c\x78\xe5\x1e\xf0\x92\xf0\xb2\x9f\xc9\x9b\x0f\xd7\x68\xb3\x73\x93\xf5\xe5\xe1\xdd\x79\x5f\x30\x37\xd3\xd6\xa1\xd9\x3e\x26\x06\xcd\x5b\x17\xfa\x90\x12\x48\xe3\x15\xe3\x45\xc2\x94\x40\xcb\x50\x9a\x40\x13\xaf\xd0\x62\x83\x63\x69\xc6\x53\xc9\x79\x34\x8e\xe3\x78\xa2\x63\x42\xc4\x71\x6d\xb4\x74\xcb\xd2\xe5\xf9\x5e\xa7\x8e\xfe\x3e\xad\x83\x74\xe7\xb9\x7e\xdd\x69\x3b\xbf\x7c\xdc\x55\xd9\xbf\xb3\x68\x41\x62\x45\x59\x05\x0b\x28\x8a\x04\x22\x0c\x46\xe8\xc3\x2a\xea\x38\xf3\x91\xae\x39\x54\x0e\xad\xd0\xe5\xd8\xd0\x8a\x47\x7d\x4a\x4c\x95\x3f\x05\x26\x24\x27\xc5\x59\x61\x0a\x1a\xf6\x8f\x2e\x5e\x5f\xed\xd5\x87\x2c\x38\x04\xff\xec\x9d\x78\x2e\x64\x89\x5f\xbf\x7c\xfe\xf9\xbd\xb7\x3e\xf2\xe0\xca\x3f\xa2\xcf\xff\x72\x7f\xc9\x7b\xba\xf0\xbc\xa2\xcb\x15\xd9\xef\xae\x1b\xcc\x2a\x55\xb1\xef\xc7\xc8\x25\x2e\x39\x2f\x8c\x19\x76\xd2\xb8\x0e\x77\x65\x59\xd8\xa2\x66\xc3\x71\x84\x85\xa2\xa2\xe3\xd9\x89\xa5\x48\x5a\xc4\xc0\x61\xa8\x19\x22\x18\xec\x21\x23\x8c\x50\xd2\xf2\xba\xe6\x06\x8c\x69\x26\x02\xc7\x4e\x68\x14\x90\xa3\x41\x55\x23\x8c\xb4\x03\x6a\x61\x47\x40\xa0\x9d\x74\xbb\xfa\xba\xed\x5c\xf3\x9a\x28\xd9\xf5\x1f\x5f\x1e\xd2\x9f\x3e\xff\x8b\xd7\xe4\x87\xd1\x2b\xaf\xbd\xb0\x87\x63\xcc\x24\x2d\x73\x5d\x39\xd7\xa5\x90\x22\x0d\xd2\x9d\x1b\x9a\xb0\xb6\x40\xc1\x0e\x25\x8c\x88\xa2\xe1\x5c\xfa\xd4\xc8\x78\xcc\x3f\xb0\x4f\xf8\x36\x8f\x17\x9f\x02\xb5\x73\x24\x5e\x11\x5f\xee\x7f\xcf\x90\xfe\xfa\x42\x91\x3e\xf0\xd3\x31\x9e\x53\xdb\x62\x95\x19\x42\x49\xfa\x58\x20\x5e\xe4\x4d\x5e\x84\x22\x15\x35\x26\x39\xab\x8a\x02\x52\x8e\x75\x25\xb6\x2e\x1e\x1f\xcb\xa8\x05\x02\x78\xcd\x55\xa6\x51\x11\x76\x3b\x2d\xba\x6f\x33\x95\x12\x51\x2b\x2a\xeb\x6d\xbc\x70\x75\xce\x35\x0c\x8f\x79\xf0\x2f\x97\x7c\xa6\x9b\x17\xb7\xc8\x5d\x61\xed\x6f\x54\xbf\x1d\xdf\x7c\xc8\x7f\xfd\xd7\x5d\x56\x7f\x77\x99\x26\xea\x30\x4b\x5d\x92\x86\x19\xa6\xba\xa6\x88\x6e\xa2\x37\x7c\x98\xe9\x60\x68\x66\x72\x82\x27\x58\x9c\x72\x74\x68\x60\x95\xe7\xdd\xcc\x48\x08\xa2\xba\x96\xb2\xa6\x94\x4a\x69\x40\xd8\xb6\x5e\x2d\xcb\x32\x89\x4a\x0c\x1d\xa7\x84\x27\x84\x28\x2e\xc2\x60\xd3\x30\x69\x14\x84\xe9\x8b\xe7\x4d\xdc\x04\x7f\xf2\x6a\xc0\xf8\xb2\x87\x5e\x40\xf5\xc3\xab\x8e\x27\xee\x80\x6f\xb2\x88\x2c\xaa\x1f\x9b\x43\x45\x1d\x2a\x50\x4a\xa0\x7d\x24\x07\xbd\xa9\xcb\x42\x68\xc3\x69\x28\x5d\x89\xb8\x91\xaa\xe6\xd2\x36\xf6\x5c\x83\x1a\x5f\x74\xa2\xd0\x3e\xd9\xdb\x3a\xe6\x7e\xff\xfc\x71\x4a\x67\xc3\xcc\x79\xb1\xd6\xfc\x78\x7e\x66\xe7\x70\x42\x0a\x94\xdd\x66\x6b\xc3\x6c\x5f\xcf\xfc\x7e\xf6\x0f\x6f\x55\x1d\x3f\x6e\xfe\x5f\x1e\x86\x70\x76\xe1\xba\x25\xe1\x71\x33\x28\x47\x3d\x03\x0c\xe3\x79\xd3\xaf\x04\xea\x50\xb6\x35\xe1\xb8\x65\x71\xe1\x9c\x5d\x0d\xf4\xd6\xb5\x48\x6c\x2e\x14\xd0\x8e\xa6\x43\xa5\x59\x9f\x79\x03\x69\x70\xe7\x27\x70\xfb\x71\xee\x30\xdc\xb7\xbb\xcf\x77\xdf\xd0\xe7\x5d\x83\xf6\x4c\x05\x0f\xf7\x46\x39\xe4\x5e\xa5\x6f\x74\x06\x35\x24\x95\xb3\x7d\x78\x2e\xdd\x8f\xe2\x29\x00\x43\x8c\xe3\x79\x62\x13\xa2\x96\x59\xc7\x29\xb4\x06\x44\x59\xa8\x46\xb9\x22\xca\xb7\xa4\x8c\x1a\x90\xdc\x28\x57\x03\xcf\xb3\x5c\xce\x25\xac\x0e\x63\xfe\x8c\x9b\x9c\x7b\xc6\xc3\xa5\x56\xbf\x3c\xff\x2f\x71\x30\x3f\xf8\xce\xef\x0b\x2f\xfa\xfa\xed\xe1\xcf\x87\x9b\x02\x67\x2e\xaf\x1e\x93\xb0\xcc\x52\xe7\x47\x4b\x0e\x47\x4a\xf6\x33\xaa\x15\x18\x58\x60\x04\x81\x91\x58\x57\xd1\xc2\x2c\x50\xab\x20\x88\xd3\x5e\x6c\x4c\xa2\x24\xee\x98\xa8\x04\x1b\x85\xc8\x38\xb3\x8d\x39\x6a\x46\x34\x51\x06\xdb\x92\x5b\x07\x4b\xaf\x51\x85\xe4\xd6\xd6\x8d\x51\x41\x14\xd0\xa7\xf2\x36\xf7\x5a\xe8\x4b\x35\x7c\xbe\xef\x7f\xcc\x16\xda\x2b\x9e\xfb\x87\x8f\xaf\x0a\x9e\x1a\x15\x89\x4b\x90\x28\x8b\xc6\x83\x33\x38\xcd\xa6\xcc\x39\x65\x4c\x06\xf3\x4d\xeb\xc0\x38\x87\x6a\x30\xd1\x20\xa4\x14\xa7\xa1\x71\xb9\xcd\xb9\x0d\x19\x30\x20\xae\x36\x48\x23\x39\x3e\x72\xe7\x62\x77\xb2\xe1\xf8\xc2\xfd\x38\x06\x07\xcf\xdb\xbf\xa6\x4d\x5e\x38\xb1\x17\x5b\x90\x9d\x14\x7b\x19\x1c\x3d\xdc\xa5\x87\x73\xc3\xb3\xf3\x67\x6f\x72\xc5\xb9\x90\xc8\x6d\x75\x49\x1a\x25\x6c\x43\xda\x32\xcf\x13\x93\x0a\x4e\x17\xfe\x14\x40\xc7\x51\x85\x72\x51\x6c\xf6\x29\xa8\xa7\x70\xca\x12\x9b\x64\xf1\x91\x70\x29\xc8\x68\x8e\x4e\x1b\x2f\x8a\x14\xa2\xe8\x75\xeb\xda\x73\x1f\x7e\x5c\xa0\x01\x31\xaa\x0e\x69\x64\xb4\xb1\x2a\x40\xde\xeb\x2b\x8d\xa5\xdf\xa7\x3f\x7b\x2a\xc4\xe7\xe7\xd7\x87\x2f\x0f\xd7\x7f\x8f\x36\xac\x36\x65\xd1\xec\xd0\xd1\x5a\x28\xc2\xd2\xda\xef\x1c\xb5\xc0\xc2\x0c\xcd\xd0\x78\x59\x0d\xdb\x8e\x78\x9b\x51\xb3\x59\xbf\x37\xfb\x9a\xd3\xc6\xce\xef\x58\xef\x6f\x7f\x42\xaf\xdc\x95\x7e\xba\xbf\xf5\xe6\x4a\x37\x1f\x2e\xc6\x29\xbf\xdc\x58\x3e\x13\x84\x19\x18\xd6\xf6\xaa\xae\x88\x31\xdc\x96\xcd\x91\x74\x23\xac\x72\x8a\xb2\xd8\x99\x7c\xab\xa0\x77\xa8\x8e\x8a\x34\x39\x91\xb2\x32\x12\x3f\x05\x30\x12\xc7\x08\x8d\x0b\xaf\x18\x81\x46\xa2\x12\x51\x34\x5f\x32\x76\xe8\x13\xb9\xd5\xb1\x0a\xfe\x9d\x47\x23\x5f\x65\xec\xfc\x72\x75\xee\x7b\x0b\xce\xef\x4e\xab\x85\x21\xcc\x71\xc1\x51\x82\x74\xb8\xb8\x73\x9d\xc0\xa4\x51\xb9\x36\x64\x4b\x51\x6e\xb8\xa3\x36\x56\xd4\x9a\x13\x0e\x8f\x52\x98\xa5\x3d\x1e\xed\x46\x24\x3b\xdf\x17\xa1\x21\xdd\xc8\xc7\xee\x92\xa5\xb6\x73\xb3\xff\xce\x63\xea\xff\x9b\x5f\x8f\x3f\x7f\xbd\x7f\x08\x6f\x3f\xbf\xfb\x70\xe3\xff\xba\xde\x9c\x0f\x5f\xef\x3f\x7c\xfc\xfa\xed\x21\xba\x54\xc6\x7b\x64\x8a\xb7\xbf\x11\x6b\x9e\x1e\x48\x92\x1e\xa7\x34\x3b\x2e\xd5\x2a\x5c\xde\x0b\x9a\x3d\xe2\xaa\x98\x0f\x6d\x9a\x9c\x92\x1c\x55\xc3\xc8\xc6\x31\x9c\xf3\xec\x71\xc9\x72\xc4\x50\xd6\xd1\x0e\xd6\xb0\x5f\x51\x02\xcb\x62\xfb\xc6\x4e\x99\xcb\xf0\x82\x52\xdb\xb5\x60\x11\xae\x84\xae\xf1\x56\x75\x6d\xdf\x20\x8c\x99\x62\xf8\x75\x6f\x5e\xbf\xa4\x03\xfc\xe0\x49\xfb\x0a\xaf\x5d\x6e\xca\xad\x8a\xf0\xa9\x6f\x4e\x5d\x44\x36\x8c\x02\x1f\x71\x13\x3b\xcb\x84\x91\x71\x6d\xb7\xc5\x42\x86\x66\x1b\xa6\xd8\x76\xac\x73\xa4\x3c\x1a\xd2\xee\xbf\xc7\x3c\x95\xb7\x2a\x66\xcf\x5a\xf0\xcf\x6f\x2b\xac\x6b\x8b\xe5\xc3\xe4\x8c\x43\x14\x5a\x77\x1a\x1c\x1c\x51\xe1\xa2\xea\x34\x5c\x5f\x31\x3b\xda\x13\x11\x3c\x6a\xed\xf1\x68\x61\x01\xee\x79\x3f\xe7\x1e\x84\xfb\x73\xff\xd7\xc1\x7f\xb8\x4c\x34\xfc\x32\x7d\x21\x7e\x7e\xfc\xfc\x5a\x10\xe2\x07\xf3\x17\x4a\x4b\xb4\x80\x85\x8a\x85\x01\x6a\x64\x9a\x21\x89\x7a\x0e\x14\x0a\xe7\xc3\x95\x95\x2e\xb2\x30\x6f\x95\xab\x9b\x53\x6b\xb8\x33\x4d\x34\xc2\xdc\x98\x0e\x09\x91\xa5\x8b\x72\xb6\xd8\xa8\x64\x89\x4b\x73\x1c\x26\xfe\xf6\x44\x78\x29\x4b\x68\x67\xb6\x5c\xb9\x1c\x7b\x5d\xfe\x4f\x3b\xfe\xb6\x7f\xce\x9b\xdf\x0f\xc2\xae\x01\x4f\xae\x44\xcc\x86\x6a\x53\x49\x1a\x55\x5b\x3a\x85\x98\x6d\xcd\xda\x6c\x92\x85\xc4\x6d\x34\x5c\x32\xe0\x94\xab\x2e\x96\x85\x59\x16\xeb\xa8\x85\xa1\x76\x06\x19\x30\xbd\x6d\x50\x66\x6b\x25\x59\xdd\x3c\xf7\x65\xee\x10\x04\xd9\xe5\x7e\x0c\xde\x38\xb5\xdd\xde\xbc\x99\x62\x7f\xfb\xfa\xed\xe1\xe7\x68\xff\x8e\xff\x3b\xa2\x26\x2f\x43\x67\x56\xc4\x90\x23\x90\x40\xcd\x17\x28\x09\x52\x28\xb3\x92\x73\x81\xda\xc4\xf4\xa3\x24\x9b\xcd\x91\x45\x82\x80\x02\x75\x0c\xeb\xb0\x20\x5b\xbb\x75\x87\x20\x2f\x4b\xd3\x2b\x5e\x59\xa2\x0b\xce\x2c\x61\x84\x97\x85\x6c\x24\x27\x82\xd0\x64\x3b\x62\x6a\x45\x25\x84\x76\x8e\x07\xc8\xcf\x11\x98\x9f\xff\x5c\x35\x33\x3f\x10\x77\x7e\x09\xa9\xcb\x8b\xb8\x3d\x61\x6f\x5a\xaa\x4f\xd2\x75\xa6\x53\x08\xc7\xa2\xc4\x95\xed\x4d\x6b\xa0\x8d\xa6\x41\xf1\xe5\xe5\xbe\x1e\x3c\xf6\xf9\xc1\xab\xa9\x2e\x67\xfc\x3a\x8e\xf8\x7c\xf1\x21\xf8\xfa\xaf\xe8\x9f\xd1\xbb\x9f\x6f\x1f\xee\x6e\x0c\x0a\xb6\x62\x0c\x53\xb6\xf5\x53\x79\xdc\x5a\x1e\xa6\xdd\x86\xe7\x90\xd9\xad\x41\xb6\x00\x1c\xb2\x0c\x0d\xd1\x0c\x85\x81\xa9\x6e\x2c\x72\xd0\x1e\x75\x3f\x19\x74\x9c\x26\x28\x18\xb3\x96\x53\x44\x2e\x5a\xb5\x73\xaf\xa2\x82\xbb\x9d\x7f\x1c\x46\x5f\x3f\xee\x4b\xa1\xdf\x04\x2e\xb9\x70\xaf\xab\xc7\x7b\x9f\x9b\xd3\x0c\xc3\x82\x32\xcc\x54\x57\x9b\xbc\x80\x16\x5a\x82\x82\x53\x11\x4a\xc0\x65\x98\x97\x4a\x37\x26\x9b\x44\x41\xf2\xad\x97\xa8\x81\x22\x56\x78\x4b\x60\xcc\xea\xc6\x51\x18\xc0\x31\x21\x74\x6a\x51\x1f\x1a\x28\x3a\x20\xc7\x5c\xe7\x0a\x05\x68\xf7\x79\x10\xcf\x7a\xf2\x1f\x78\x79\x2f\x0f\xfc\x5e\xdb\x78\x73\xee\xe3\xd6\xa3\x14\x39\x06\x05\xcc\xc8\x01\x77\x3e\x85\x7a\x00\x26\x90\x41\xd9\xd6\x47\xcd\x3c\x5b\xb0\xae\x99\xd0\x00\x81\x3d\x3f\xaa\x16\x2d\x80\x47\xdd\xa2\xdd\x6b\x4a\x3e\x51\xdf\x6f\xff\x9d\xd7\x47\x5f\xa3\xc2\xfe\x00\x1a\x42\x9f\xef\x3f\x47\x2f\x09\x9a\xdf\xbe\xee\xb6\x53\x3f\xdd\x7f\x88\x38\xc3\x3a\x87\x01\x9a\x62\x1e\x86\x63\x39\xbb\xf3\x9f\x66\x87\x7c\xa6\xbe\xc7\x88\xcc\xa9\x4b\x51\x93\xd4\x0d\xab\x33\xc5\x70\x5a\xc2\x9a\x59\xad\xd6\x7c\x42\xb6\x9f\xb0\x14\x85\xee\x50\x5e\x66\xba\x47\xba\x04\x6b\xb3\xaa\x96\xe5\x36\xce\x05\x75\x61\x8a\x52\x58\x4e\x0b\x2c\xb9\xcb\x49\x83\x56\xb0\x20\xad\x40\x49\x98\x05\x41\x88\xca\x27\x72\x5b\xc5\xf8\xc2\xe5\xfb\x61\xc2\x7f\xbe\x82\x11\x71\x11\x3d\xb5\xe1\xe8\x1e\x3b\x17\x66\xa0\x63\xf2\xd8\xc5\xd8\xda\xe3\x96\x32\x16\x2e\x10\x20\x71\xb9\xb7\x75\xcc\xf6\x1c\x98\xd7\x3b\xd0\x05\xe2\x7e\x25\x94\xdb\x7b\xf5\xdb\xdb\xa4\xae\x59\x5d\x38\x42\xb7\x3e\x49\x51\x86\x52\x79\x84\x45\x42\x5f\x23\x4d\xb6\xd5\x84\x5d\x7a\xea\x6f\xd3\xd3\x98\x86\xcb\x96\x73\x9e\xd9\x8c\x84\x65\x91\x99\x4e\x36\xb6\xd3\xb5\x5d\x4f\x73\xd4\xf0\xda\xda\xf1\x92\x61\x6a\xfd\xbe\xf8\xbf\xf8\x7d\xf1\xd9\x3f\xf6\x2e\x3a\xb7\x26\x9f\xdf\xf9\xd6\xf2\xdd\x5b\x21\x30\x9a\x66\xa3\xf8\xc1\xda\x47\x1b\x8b\xd3\x6c\x51\x87\x6a\x0e\x1c\x32\x3e\x20\x25\x33\x5b\x30\x02\x39\x0c\x3a\xec\x1a\xa8\x61\x64\x1d\x2a\x86\xb0\x84\x0a\x95\x6e\x58\x88\x50\x92\xb6\x79\x8e\x75\xd9\x57\x25\xb9\xf0\xda\x6c\x78\xbc\x15\x1e\xf7\xff\x01\xf3\xbf\x15\xee\x7b\xed\xa2\xb4\xa8\x34\x23\x71\x09\x4d\xdf\x23\x86\x2b\xce\x65\xf0\xda\xbb\xf1\xfe\xb5\x43\xc9\x6b\x9d\xfd\xf9\x5a\x88\x08\x3b\x9f\x1b\xce\xdc\x29\x75\x61\x75\xea\x51\xb3\xcb\x56\xba\xce\x3e\x05\xa7\x55\xd4\x51\x8a\x82\xd3\x8a\xea\x2b\x67\x5b\xc6\x47\x8f\x05\xbd\x99\x05\xbd\x66\x13\xdf\xfb\x9f\xac\x43\x8b\xb1\x2b\xab\xc8\x9d\x12\x21\xe2\xc2\x9d\x98\x35\x8e\xa2\x7a\xdc\xc6\x30\x89\x9a\x13\x8b\x46\x69\x4a\xc9\x6d\xc3\xb7\x4c\x88\x10\x0b\x6a\x3a\x94\x6f\x29\xa2\x17\x6f\x61\x7d\x6b\xe2\x20\xf8\x29\xc8\xae\x08\xc9\xa5\x17\xd9\x1f\x37\xcf\x33\xfa\x68\x6f\x86\x2d\x4d\xb3\x28\xfb\xed\x7c\xe7\x8c\xc0\xea\x90\xa0\xfc\x34\xc6\x0e\x95\xa8\xd0\x4f\x01\xb4\x71\x60\xf3\xfc\xb4\x5a\x1b\x0a\x58\x1a\x3d\xa1\xb2\x71\x53\x3d\x0c\x41\x88\xf2\x27\x79\xab\x62\xb1\x6b\xe4\xd1\x2b\x8d\xfc\x9e\x26\xf2\x5d\x1c\x82\xc7\xe0\xd0\xff\xe6\x5c\xcc\x1f\x5d\x2c\xec\xb4\xad\x47\x1b\x2f\x5b\x36\x79\xfd\x50\xfe\x84\x3d\x06\xf2\xd7\x17\x6f\xfa\xf7\x61\xe4\x89\x99\xe7\xfa\xfe\xda\x84\x5c\xbc\x76\x0f\x93\x2b\xcc\xdc\xd7\xfd\xd8\xc1\x20\x42\xfd\xa8\x1c\xca\x8e\xb9\xb7\xbd\x38\xd7\x8a\x4a\xb7\xb1\x4c\x81\xc1\x3c\xc2\xaa\x51\x32\xc0\x32\x18\xa4\xc2\xe5\x24\x18\xb7\x52\xd0\x68\x71\x93\x18\x86\xe7\x6b\x5b\xc6\xed\x85\xa9\xfb\x1c\x80\xf6\xcb\xbd\xb7\xe1\xbe\x79\xc9\xd4\xf5\xdd\x76\xc9\x70\xe4\x4e\x45\x45\x24\x0a\xac\xcb\xe3\x16\xbb\x41\xdb\xbc\xb1\x1a\x97\x8f\xca\x9b\x8c\x3a\x45\xb6\x11\xad\xb8\x94\x23\xaa\x4a\xba\x11\xe0\x26\xb3\x29\x47\xed\xb9\x58\xbd\x78\xd0\x0b\x8f\xf9\xdf\x5f\xfa\xf8\xf7\x3f\x26\x74\x7e\xfa\xe5\xb0\x9b\xcb\xe6\xdf\x5e\x29\xe3\xdf\xbf\x7b\xf8\x82\x56\x5b\xc6\x52\x98\x92\xe5\xb2\x2c\x8b\xc7\x51\x76\x35\x0a\x22\xb7\x15\x1a\x99\xb0\x20\x79\xe6\x0a\x8a\xb7\x1a\x92\xde\x85\x55\x3c\x95\x6c\x63\x4b\x6a\xd3\x06\x0d\xad\xaa\xfb\x16\xb2\xa9\xcc\xf3\xbc\x61\x63\x59\x50\x11\xae\xc6\x9f\x86\x20\xf6\x7a\x29\x1b\xf3\xd7\x7e\xca\x2f\xce\x8c\xcf\x7e\xca\xd6\x3d\xae\xce\xc5\xc9\xe3\xfa\xfc\xe2\xdf\x67\x21\x0e\x19\x34\xfd\x36\x0d\xdb\x71\xf4\x33\x79\xec\xbd\x99\x2f\x39\x6d\xf7\xbf\xd3\xc3\xbe\xf7\xe8\xe0\xdd\x83\xbc\x4d\xe1\x48\x65\xeb\xf2\xa6\xcd\xf3\xef\x5d\x1b\xb1\x53\xe3\x3d\x60\xe2\xd2\x9e\xa4\x2f\x71\x73\x1c\xf1\x61\xeb\xac\xc7\x7a\xa3\xc0\x3e\x39\x3f\xa7\xfc\xab\xe0\x4f\x3f\x78\x6c\x3c\xf3\x78\x2f\xec\xc7\x24\xec\xf3\xa2\xa9\xf2\xb0\xfd\xed\x88\x84\xa2\x8e\xca\x68\x68\xb9\x0a\x93\xdf\xf2\xb8\xd4\x91\xe5\xb4\x12\xca\x90\x05\x66\x82\xf2\x99\x54\xd0\xac\xd6\x7a\xa8\x2f\x88\x50\xf6\x44\x6e\xd6\x38\xbd\x78\x55\xfc\xde\x97\x18\x5d\x3e\xc2\xcd\x5a\xd7\x5c\xe5\x0d\x25\x8f\xdc\x21\x13\xba\x8d\x3b\x24\xc0\xc6\xe9\x29\x15\xe7\x75\x91\x46\xd5\xe3\x18\x0f\xd0\x6c\xe3\x3e\x23\x3f\xa0\xe0\x89\xdc\x06\xb1\xfd\x9f\xf0\x26\xf2\xff\xde\x06\xee\x11\xbb\xb0\x71\x1b\xbb\x70\xe0\xb3\x47\x7c\x7d\x17\x35\x8f\x4e\xca\x98\x2f\x0b\x30\xef\x57\x94\x6e\x64\xcf\xda\x0b\x5e\xf5\x04\xc7\x4b\x72\xcc\x3e\x0d\xf7\x96\x5d\x3f\x10\x36\x3f\x3c\x17\x24\x57\x26\xeb\xfe\xcb\x6f\xfa\xe3\xb1\x16\x5c\xe7\x0d\xc3\x8f\x8d\xeb\xfb\x50\xb9\x4d\xa1\x09\xf2\x50\xa1\xe3\x63\x73\x7d\x17\xe3\xd3\x6a\x1c\xe7\xa9\x49\xa8\x04\x87\xb8\x89\x12\x6b\xc1\x4c\xd3\xb4\x69\x6f\x0a\x98\x5c\xd6\x22\xe6\xfb\xfb\x9f\x7d\xaf\xfa\xe2\x09\xf1\xa2\xee\xd9\x2d\x21\xfe\xe5\x8f\x2d\x21\xd0\xd1\x64\x05\xea\xca\x2d\xa1\xa1\x24\x30\x50\xc1\x04\x63\x65\xa5\x50\x7a\xc8\x80\x97\xdd\x84\x13\x97\xe1\x12\x7a\x38\xf2\x70\x62\x96\xd0\x82\xf3\x32\x8f\xbb\x92\xb1\x53\x03\x47\x3d\x87\xd2\x32\xa1\x04\x25\x98\x23\x4c\x4f\x2e\xcf\xa8\xab\x8e\xb8\xc4\x75\x9c\x6c\xc7\x21\x75\x49\x7d\xa9\xdf\x5c\x8c\x83\xbf\xf3\x68\x9b\x5f\xa1\x3d\x7f\x23\x7c\x9d\x66\x74\x21\xb1\xbd\xea\x51\xd6\x50\xa6\x49\x9b\xa4\x61\x51\xaa\x4e\xca\x5c\x6b\x95\x55\x40\xcd\xc6\x78\x58\xcb\xad\x39\xac\x82\x38\x2c\xbe\x2f\x96\x69\xab\xa3\x9a\xd7\x35\xdf\x16\x90\x32\xb3\x39\x33\x61\xb2\x95\x83\x6b\x42\x2a\xfa\x89\x2c\x5d\x56\x8d\x0d\x69\x76\x4c\xd6\x3d\x35\xb7\x3c\x2e\xbd\x7e\xeb\xc2\xfd\xd9\xc7\xbf\x3b\xbe\x17\xa7\xb8\x08\x67\xf7\x5d\xb9\x28\xcf\xcb\xad\xbc\xe9\x7f\xc3\x71\x29\x14\x14\x88\x40\x8b\x26\x4e\x4f\xc4\xee\xe7\x9f\xdf\x9a\x78\x0e\xfe\xfa\x9a\x45\x12\x5c\x75\x69\xbf\x73\xb0\x7c\x8d\x2e\x46\xad\xcb\x32\xe4\xd0\x48\x01\x03\x81\x75\x9b\x49\xc8\x43\xbd\x61\x8c\xd2\x30\x50\xa9\x2b\x39\xdd\x5a\xd0\x32\x0e\x12\xae\xb8\xcc\xa5\xcc\xf3\x78\x2e\x8b\x1c\x16\x6d\x2c\x2a\x60\xb2\xa6\x05\x05\x45\xb1\x9f\xee\x0a\xcb\xd0\x80\xeb\x52\x97\x56\xaf\xe7\x78\x87\x9d\x75\xbe\x83\x73\x2f\x18\xfb\x8b\xa5\xe9\xdd\xc3\x61\x92\xb0\x82\xa5\x88\x3d\x4a\xd4\xdb\x78\x3c\xcd\x73\x98\x52\xe8\x40\x49\x98\x8c\xc2\xed\x91\x03\x8e\x2d\x5f\xa4\x52\xd0\xa3\x19\x32\x03\xb4\x6c\xab\xf3\x3e\x06\x09\xe6\xaa\xae\x45\x78\xe1\xa1\x39\xff\x7b\xcb\xe0\x36\xb8\xdb\xeb\xf4\xfd\xb4\x1e\x3e\xbf\x4b\xcf\x27\x25\xb8\xbb\xff\x7c\x55\xc5\x5d\xcf\xcb\x0d\xb7\x27\x66\xd1\x6a\x41\x01\xc1\xc8\x22\xd2\x5a\x62\xd7\xbc\x4c\x6c\x46\x31\xf4\x4f\x81\x8c\xcb\x93\x0d\x8f\x5b\x19\xf1\xd1\x42\x0d\x8c\x58\x8c\x18\x3a\x57\xc8\x26\xcf\x8b\xd2\x94\xc7\xaa\xc4\xec\x5a\xa3\xca\x58\x04\xff\xee\x92\x8e\x71\x77\xa9\x8d\xfe\xe0\x6a\xbc\x3c\x05\xb7\xf8\x7b\x73\xb4\x35\x8f\xeb\xad\xa7\xa8\x42\x35\x4b\x5d\xce\x30\x60\x60\x2a\x92\x42\x70\x91\x09\x91\x67\xb1\xb0\x50\x80\x84\x89\x75\x28\xef\xc3\x02\xca\xcd\xe5\x19\xb6\xd5\x80\x4b\x52\x47\x09\x88\x21\x6d\xd2\xf2\x79\x1f\xe4\x71\x15\xfc\x95\xef\x14\xf7\xe3\xf8\xe9\x6f\x91\xe7\x2d\xdd\xbe\x0a\x97\xbf\xbf\xdc\xf4\xb7\xfc\x3b\x1f\x4c\x8f\x2a\x24\xb3\xc4\xa6\x61\x9b\xe9\xf3\x65\xd7\x0c\xe3\x74\x3b\xd6\xd0\x08\x54\x32\x68\xe2\xca\x40\x05\x06\x26\x86\x72\xc4\xc3\x14\x28\x13\xfd\x36\xc2\x92\x9d\xf7\x24\x06\xf8\xa8\x3a\x74\xee\xbf\xa6\x4b\x5e\xf7\xc7\x1f\x9d\x6c\xde\x78\x80\xbc\xca\x8f\x9b\xc2\xee\xdc\x23\x14\x7e\xd3\x4d\x93\x5a\x13\x95\x5b\x5a\x94\xc9\x66\xdc\x46\xc2\xce\x9b\x6e\x90\x38\x6f\x1a\x6b\x8c\x02\xdd\x7b\x1d\xfb\xb6\x86\x89\x55\x5e\x23\x7c\xad\x4b\xfb\xe0\xe0\xd3\x9d\x2f\xc8\xd9\xbd\xaf\x80\xef\x3e\xec\x60\x48\x34\x0a\xac\xb1\xc8\xb6\xe4\xb6\x3c\x09\x87\x9a\x4b\x32\x5b\xdc\xd7\x9a\xaa\x1a\xb8\xb5\x27\x1d\x25\xcd\xa4\xd7\xe6\xb2\xbe\xd1\x5b\x1b\x1d\x83\xbf\xf1\x93\xcf\xcf\x77\xef\x9e\xdb\xec\x3b\xf4\xf9\xee\xe7\x7d\x99\x3b\x17\x35\x77\x87\xc4\x59\xc4\x6a\x18\xb5\x06\xc9\xc2\x60\x4b\x5c\x3a\x59\xa1\xda\x1a\x26\x83\xda\xe8\x08\xa2\x02\xd3\xb8\x16\x55\x30\xf5\x76\x41\x1c\x59\x58\x38\xad\x8d\x51\x35\x74\x47\x81\x2a\x34\xfa\xba\xb6\xbd\xe8\x66\xfe\xe9\x15\x7e\xf2\x7a\xbf\xdd\x45\x4f\x9f\x7c\xbc\xf3\xdd\x43\x7f\xa3\xc0\xdb\x73\x31\xe9\x4c\x6e\x5d\x91\x43\xbd\xc9\x3a\x64\x88\x9d\xc6\xd2\xd8\x12\x47\xea\x51\xc7\xd2\x82\xb1\x50\xd5\x3c\xb5\x69\x8e\xd1\xf9\x59\xd5\xcd\xaa\x51\x99\x2b\xe5\xfb\xab\x5d\xa3\xcb\x62\xe9\xcf\xdd\x65\xc6\x7b\xbe\x42\xef\xae\x28\x9b\x10\xdb\xbc\x55\x07\x01\x99\xdb\x72\x58\xe4\x1c\xae\xb1\xb4\x2c\x1d\xed\x56\x86\x63\x09\x0e\x86\x1a\x25\x28\x0f\xcb\xf4\x95\x86\x2d\x0d\xa2\x7d\x67\xdf\x79\x28\x97\xf0\xac\xf8\xfe\x3a\xd9\x7f\x40\xc9\x61\xf8\x5e\xb9\xdb\xf2\x94\x2f\x3d\xea\xc2\x80\x71\x83\x92\xc6\x56\x64\x93\x5b\x8d\x11\x39\x6e\x75\x9c\xda\xd5\x82\x93\x69\xcd\x18\x9b\x61\xe5\x82\x99\xc4\xf6\x28\xdf\xb1\x42\x7b\x6b\xe2\xcc\x57\xaa\xaf\x91\xf9\xcf\x77\x0f\xd1\xb0\xcf\x3e\x8b\x75\x44\xd2\x21\x1a\x67\xd0\xdb\x6d\xb1\x36\x1c\xb7\xf2\x9a\xb3\x60\x7c\xdd\xfe\x8f\x3b\xea\x7b\x01\x8f\xee\x3e\xef\x0b\x15\xda\x1f\x8f\x8f\x77\x0f\x3f\xdf\xd6\x51\x56\x6c\x36\x14\x2e\xe4\xd3\x96\xcd\x68\xc5\x5b\x0f\x8b\xdb\x2c\x0d\x93\x66\xcb\x0f\x16\x70\x1e\x96\xa6\xb3\xc3\x00\xb9\x85\xa1\x6e\x14\xea\xa1\x92\x8e\x21\x66\x11\xe9\x4c\x80\xbc\x3f\x4e\x19\x17\x3b\xae\xf9\x43\x5e\xef\x6e\xed\xf9\xf0\x6c\xf0\xf9\x4b\xc8\x9a\xf3\x53\x6f\x06\x1f\x04\xc3\xf3\x62\x32\x5b\xab\x42\xac\xce\xbd\x5b\x20\xd1\x54\x2f\x6a\x14\x28\x8f\x8b\xa2\xaa\x4e\x13\x8c\x99\xcb\x6a\x17\xa6\xdb\x04\x42\xa1\x1a\x0d\x20\xe1\x28\x51\x80\xaa\x56\xd7\xe3\xa5\x87\xc6\xb7\x36\xd6\xc1\xbf\x7b\x8b\x68\x5e\x6a\xf2\xe0\xb0\xdb\x37\x7d\xb9\x72\x53\x6e\x3f\x7d\xfd\x16\x5a\xc7\xb4\xad\x15\x43\x32\x2c\x1a\x84\x7b\x05\x2b\x68\xac\x50\x4e\x9b\xd4\x80\x9e\x74\xcb\xa4\x89\x75\xd9\x36\x27\x1c\xa5\x92\x5b\x54\x20\x0c\x65\xd7\x0a\x58\x3b\x60\x79\xc6\x6c\x35\xd5\x98\x23\x45\x6c\x41\x82\xe7\x7c\x14\x17\xb7\xc1\x3f\xf8\xf5\xe9\xe1\xcb\x33\x66\xf7\xee\xe1\x5d\x78\x78\x51\x45\xfc\x12\x7d\x78\xf8\xf3\xe1\x97\x6f\xa8\x0c\xf5\x69\x88\x2a\xeb\x95\x85\x95\x81\x09\x15\xc8\x61\xc8\xc0\x81\xd9\xa6\x02\x4d\xa8\x78\x0a\x3a\x85\xb2\x01\x25\xa8\xd0\xa1\x1d\xf4\x30\xe8\x41\xc2\xda\xb0\xd2\x55\xd6\x95\x36\xaf\x2d\x4a\x26\x69\x06\x8f\x65\xc9\x5b\x1b\x2d\x17\xff\xcf\xf3\x4e\xb1\xd7\x9b\x5e\x63\x73\x71\x0c\xfc\xfc\x7a\x4a\x72\x5e\xb3\xa3\xa5\x11\x8e\xbb\x70\xed\x95\xad\xfb\x47\xde\xf0\xda\x69\xa4\x2c\xe9\x26\x5e\x26\x2e\xa1\x16\x8e\x4f\x81\x8d\x96\xf9\x29\xe0\x28\x98\x53\x68\xe1\x7c\xda\x10\x4b\x2a\x28\x60\x38\xbf\xc5\x1b\xce\xf3\xa2\x9e\x4b\x58\x1b\x4c\x78\x10\x20\x5f\x3f\xa6\x3e\x4b\xe0\xf7\xfd\xfc\xd5\xf8\xe6\xfe\xd2\xcf\x7f\xfe\xf9\xf6\x36\x3d\x37\xf3\xb9\xa1\xc4\x37\xf3\xc9\x58\xf7\x23\x07\xcb\x90\xa9\x20\x71\x61\x93\xd8\x24\x1a\x4f\x58\xf0\xdc\xe5\x34\x4a\x48\xd5\x1c\xd5\xe8\xe6\x46\xb7\x48\x9c\x92\x58\x73\x29\xf9\x45\x23\x41\x6e\x9b\x98\xfb\x73\xe0\xef\xc7\xf3\xbd\xfe\xf1\x5c\x40\xfc\x15\x7a\x08\x6f\x7f\x5f\x19\x85\x9d\x19\x81\x0b\xa4\x22\x8c\x2a\x84\x0d\x8c\xd0\x9f\xd6\xb8\x49\x70\xd5\xcb\x26\xeb\x24\xcd\xaa\x6d\xe6\xdb\x24\xd0\xcc\xa0\x8f\x39\x7d\x0a\x06\xdd\x8d\x30\x29\x6d\x11\x86\xf3\xdd\x5b\x67\x2e\xa3\x0e\x65\x90\x0e\xba\x41\x3a\x08\x42\x94\x5e\x6a\x85\x1d\x65\xf7\x75\xc1\x75\x3e\xbd\xbb\x81\x04\xe7\x65\xef\xfd\x79\xe7\x08\x22\xf4\xee\xe1\xd7\x4f\x31\x72\xc7\xa5\x5a\xa0\xa5\xe1\x1c\x7a\xa4\x6a\x48\x8b\xd0\x6d\x9a\xa0\x42\x66\xb9\x4d\x04\x6f\x40\x8b\x4d\x84\x75\x9e\xc2\x84\x46\x28\x89\x31\x56\xf0\xb8\x2a\x8c\xae\xca\xce\x98\x09\x56\xe7\x0a\x58\x5b\xc4\x50\x89\xf4\xaa\xdb\xe2\x8a\x69\xf1\x58\x7a\x6c\xe5\xe1\xdd\x7e\x00\x17\xab\xe3\x37\x2d\xcf\x85\xda\xf5\xf5\xdb\x03\x2a\x0e\x47\x68\x60\xaa\x8a\x50\x52\xa5\x39\xde\x5a\xae\xfa\xb6\xe8\xfb\xa2\x38\x75\x91\x76\xa3\x96\x62\x9d\x1f\x79\x2c\xf5\x50\xe7\xb9\x69\x1a\x2a\x15\x10\xc5\x4b\x57\x16\x15\xb2\x96\x33\x5e\x62\xba\x63\x13\x8d\xf7\xe9\x1c\x7d\x9f\xf2\xcc\x09\xdf\x23\xbf\x1e\x76\x79\x69\x9c\xe3\x22\x54\xee\x51\x15\x46\x37\xa1\x29\xca\x70\x3a\x2f\xef\xf1\x28\xf5\xa6\x2b\x1f\x89\x8a\x32\xc4\x50\x5b\x33\x70\xb0\xf8\x75\x98\xfa\xf5\xf1\xde\xf3\xe0\x2f\xf5\xcf\xb5\x20\xff\xf0\x4f\xbf\x7e\x89\x7e\xb0\xfb\xbd\x79\x1b\x4e\xf1\x35\x6e\x5c\xce\x38\xc3\x85\xf7\x33\x81\xa9\xd2\xcc\x65\x6d\x2f\x84\xe0\x19\x15\xac\xed\xf0\x34\xb4\x7a\xe3\x11\xb3\x5d\x17\x67\x27\x52\x16\x09\x76\x64\xcd\x0a\xc6\xc3\x52\x57\x05\x28\x4a\x33\x97\xe5\xa8\xf2\x33\x6a\xab\x95\xb6\x8d\x2b\xf2\x97\xb5\xa0\x8e\x33\x9f\xba\x78\xc5\x33\xfc\x58\x34\x40\x7b\xf2\xe2\x47\x77\x33\x6e\xa4\xa8\x1c\x4c\x50\xd5\x61\x8d\xca\x93\x8b\x1d\xca\x56\x39\xc3\x1c\x67\x16\xe3\x13\x89\x52\x58\x7a\x85\x52\x24\xd6\x66\x54\xc7\xff\x9f\xb8\x7f\x07\x92\x25\x57\xf3\xc3\xf0\x44\x66\x3d\xf2\x72\x97\x64\xf6\x9c\xe9\x39\xc9\xc7\xbd\x8b\xbe\x3d\x67\x0e\x78\xf9\xdf\x20\xee\xf6\xed\x73\xc0\xc7\xee\xe2\x4f\x2e\x83\x58\x52\x0c\x82\xd4\x4a\x42\x88\x2b\x12\x5a\x31\x28\x84\x42\x21\xc1\x52\x40\xb2\x60\xc2\x84\x09\x33\xcd\x34\xd3\x4c\x33\xcd\x32\xcb\x2c\xb3\xcc\x32\xcb\xac\x3b\xa7\x12\xa5\x28\x64\x55\x77\x9d\x33\x33\x2b\xae\x1c\xcd\x44\x56\x75\x65\x56\x9f\xce\x07\xf0\xe1\x7b\xfc\xbe\xdf\xaf\xb9\xe0\x96\xfc\xcc\xa4\x3c\xd5\x57\x13\xfb\x7b\xf6\x26\x99\x3c\x90\x20\x98\xf7\x0f\xc0\x48\x29\x00\x73\x81\xa9\x06\x34\xb3\xea\xd3\x3e\xcc\xab\xef\xf7\x79\x66\x84\x07\x0c\x68\xd2\xb5\x47\x39\x53\x61\x84\x21\xf5\xe8\xf0\xd4\xe3\x30\xf5\xcf\x7e\xa6\xfb\x97\x94\x85\x52\x26\xf8\xc3\x9b\x0b\x8b\x51\x8e\x7c\x55\xcf\x10\xd7\x4e\x90\x23\x37\x35\x11\x16\x64\x39\x0e\x63\x67\x80\x5f\xbb\xaa\x2d\x9b\x7c\x10\x63\x98\x31\xc8\x98\xeb\x07\xee\xfd\xa6\x66\xc2\xec\xa3\x89\xeb\x8d\x75\xe7\x8b\x29\x19\x8d\xb6\x6d\x2e\x31\xc3\xa4\x8d\x35\x24\xae\xc5\x0b\x8a\x2b\x07\xb7\xa6\x72\x82\x60\x7f\xf5\xf6\xdb\x37\x33\xc8\x50\xbe\x8b\x8d\x8a\x03\xa0\x60\x4f\xc7\x7d\xf4\xd1\x45\x26\xc0\x0a\x90\x53\xd6\xc5\x4d\xa1\x10\x89\x43\xb7\x03\x48\xce\x06\xe3\x42\x5c\x9f\x2d\x65\xcb\xf7\x5b\x19\x64\xb7\x01\x32\x68\x19\x43\xdc\x74\x2b\x50\x5d\xfa\xa9\xfc\xac\xb9\xe9\xed\x7c\x7a\xf8\xa2\xb7\xf3\x31\x35\x27\xdd\x34\xb4\xcd\xbf\xfd\xf8\xf0\xcd\xbc\xa3\x49\x5c\x5b\x8c\xb6\x6a\xf7\x7a\x1f\x6a\x3b\x2f\xfb\x53\x06\x20\xe8\x49\xcc\x92\x06\x3f\x11\xa0\x05\x70\x00\x16\x64\x61\x2c\xc3\xac\x89\x5b\xe1\xb8\x18\x86\x81\x1b\xd6\xef\xc7\xca\xa9\xad\x91\x38\xe0\xc6\x91\x06\x73\x43\x94\xf3\x2f\xcf\x77\x97\xfd\x2c\xfb\xeb\x53\x8e\x69\xca\xb8\xbd\xff\x90\xd8\xda\x3e\xc3\x6a\x80\xde\xe3\x39\xf9\xde\x2a\xe3\xb7\xdd\x2c\x7c\x52\xc3\x9c\x62\x84\x6a\x47\xbc\xb6\xe5\x27\x39\xdb\x61\xe5\x1b\x27\xb6\xda\xe9\x38\xc4\x61\x8f\x62\x00\x35\x30\x2f\x35\x97\xf3\xfc\x79\x9c\xe2\xc6\xe4\x50\x2e\x5e\xf8\x35\x5e\x81\x9c\x8f\x93\x95\xf4\x79\x0f\xab\xb1\x99\xef\xc6\xba\x82\x85\x19\x15\x0b\x7b\x5e\x36\x95\x8f\xfd\xde\xab\x76\x0c\x2c\xaf\x9a\xd1\xe4\x5e\xdb\x10\x8c\xf1\x91\xc0\x9a\xf6\xf8\xa0\xa8\x04\x87\x71\xdf\x06\x07\x42\xfa\xbb\xab\xe4\xcf\xba\x84\x1b\xbc\xe6\x28\x9f\x52\x22\xe9\x0b\xa1\xc0\xa7\x89\xce\xbf\xe8\x42\xbe\x1d\x21\x58\x37\xa3\x57\x1b\x50\x89\x2a\xd4\xfc\xec\xad\xf7\x7e\x74\x0d\xd8\x8c\x75\xbe\x9b\xb9\xe0\x62\x5a\x9e\x37\x08\x0a\x8f\x57\x8c\x30\x01\x2a\xb0\x8e\x03\xd8\xb8\x29\xaf\xea\x92\xbe\x9f\xbe\x45\x97\x7d\xbd\xfc\xf1\x66\x2b\x40\x72\x7d\xf6\xb0\x74\x59\x16\x70\xa4\xab\x1c\x89\xb1\xdf\x86\xd4\x35\xee\x47\x91\x6f\xe0\xe8\x8b\xbe\xef\xbd\x28\x39\xf7\x71\xad\x1b\x0f\x9a\x68\xfa\xd0\x80\xda\x2b\x8d\x5e\x6a\xbd\x7e\x56\x4d\xf5\xc2\xcf\xba\xdc\x3e\x5b\x0d\x65\xa1\xb7\xdd\x91\xce\xda\x4d\xdc\x17\xf8\xb8\x96\x52\xab\x5a\x68\x71\xf4\x60\xdb\x5b\xed\x42\xe3\x55\x88\x81\x71\x14\x50\x62\xd9\xcf\x92\xbf\xe5\x5f\x70\x1b\x37\x9c\x35\x89\x2f\x01\x32\x98\xef\xbe\xdf\xce\x36\xdf\xbb\x78\x28\x20\x22\x33\x69\x4d\x18\x45\x28\x68\x50\x93\xd6\x21\xa8\x4f\x6a\xa9\x67\x65\xaa\x23\xdd\x28\x10\xe4\x2f\xf7\xfe\x01\xd4\x73\xfd\x49\x19\xb0\xce\x2b\x5b\x05\x64\xc4\x38\x8c\xdb\x61\x16\x3e\xa1\x59\x39\x76\xd1\xc2\x5a\xae\x48\xdc\x53\xc2\x74\x0e\x01\x49\x78\xd0\xb3\xbf\x5a\x4e\x5c\x3a\x9f\x63\x49\x0e\x79\xd7\xe4\xc3\x48\x0b\x76\xd8\x16\x64\xe4\x79\x4a\x3e\x85\x88\x9b\xe6\x1c\x1c\x00\xc0\x93\xaf\x40\x2e\x98\xb5\x2f\xa8\x72\xce\x4f\x05\xc8\x39\xfd\xa4\xaa\x79\x5d\x59\x1b\x7a\xb8\x72\x14\x57\xdf\xef\xc9\xcc\x7c\x92\x33\x12\xe1\x2a\xba\x35\xf4\x90\x6f\xc0\x6e\xb8\xda\xde\x90\xb8\xcf\xd2\x0c\x9a\x7f\x95\x3d\xfd\xc1\x9b\xb7\xf9\xc3\x2f\xb3\x62\xfe\xfe\xdd\x77\x77\x4f\x5f\xbd\xbd\x68\x8d\xb0\xea\xd8\x4b\x60\x8c\xc6\x21\x59\x10\x6c\x47\x08\xf3\x0d\x6a\x4a\x04\x48\xeb\xb4\x6f\x8a\x3a\x88\x53\x16\x07\x00\x51\x54\xc0\x02\xce\x02\x5b\x81\x32\x1e\x7a\x30\x48\xe3\x9c\xbc\xd6\x8c\x8a\x4d\x3a\xff\xaf\xe6\x1f\xce\xe6\xf2\x73\x1b\x96\x67\x3d\x50\x5b\x4c\x71\xe0\x71\x03\x6a\x30\xf0\x48\x62\x1b\xbb\x71\x2f\xc1\x1e\xe0\xd8\xac\x8a\x3e\xd2\x75\x30\x01\x94\x30\xc2\x53\xe6\x59\x23\xbb\x95\x0c\xac\xd9\x82\x4d\xc2\xbf\xc3\x99\x58\x86\x85\x4b\xbc\x73\x97\x2e\x85\x89\x3c\x38\xf1\x34\x4c\x7c\x2f\xaf\x3b\x8a\x9d\x87\x00\xb6\xa8\xf2\x35\xae\x98\x90\x2e\xe7\xb6\xac\x00\x71\xa8\xf6\x35\x66\x58\x2a\xbb\x70\x50\x5b\xa1\xb0\x53\x41\xaa\x7e\x57\x13\x62\xb5\xc3\x8d\xb3\x46\x35\x97\x9c\x9c\x98\xcb\xe4\xcb\x7e\x97\xfd\x2a\xfb\x93\xdb\x0e\x95\x97\xb2\xe3\xa5\x59\x6f\xf9\xf0\xdd\xfb\x37\xcf\x0f\xcb\xfb\xf9\xf3\xc3\xcf\xf3\x87\xe7\xe5\xdb\x9f\xd2\x8b\x9d\x55\x8c\xe4\x61\x94\xb9\x1c\x9b\xb4\xad\x7f\xbb\xa7\x54\x6e\x4d\xa8\x20\xe8\x20\x52\xe3\xbe\xca\xe1\xb8\xcd\xa1\x48\xc0\xf4\x1c\x8d\x9b\x59\x9f\x64\x64\xb7\x79\x1f\x3e\xb1\x00\xec\x5c\x52\x6e\x84\x16\x4a\x58\xe0\x29\xd6\x1d\xa8\x21\xc6\xb0\x8e\x07\x51\xd3\x95\x10\x4a\x88\x9d\x26\xb5\x48\x8a\x9b\x76\xf4\x10\xe6\xbc\x3e\x8f\x33\x72\x62\x8b\x21\x97\x13\xeb\xc4\x6b\xfc\x7e\x8d\xd8\xf3\x1a\x84\x26\x89\x96\xe9\x73\x7c\xee\x72\x13\x15\xd8\x25\xae\xdd\xb8\x03\xb5\xb5\xe7\xb9\xb7\xcb\xc3\xb2\x5c\xc8\x89\x3b\xe1\x07\x57\xf9\x70\xf7\x6d\xa1\x74\x3c\xc4\x3e\xaf\xc6\xfd\x6c\x9b\x64\x85\xf7\x79\xf7\xdb\x2d\x30\x0b\x69\x28\xdc\xfa\xdd\xce\xef\xc2\x51\x17\x0a\xa6\xb9\xbc\x3f\xd1\x65\x55\x34\x29\x9a\xbc\x7b\x49\x62\x5f\x6f\xd7\xc7\xe9\x4f\x00\x3f\xdb\x26\x25\xe2\x7d\xde\x35\x9f\x60\x03\xec\xc1\xc5\x5d\xec\xcf\x73\x2f\xee\x41\xe5\x41\x66\x3f\x1d\x38\x2f\xb6\x48\x38\x0e\xb7\x3e\x7b\xf1\x85\x43\xbe\x4f\xdc\xdd\xef\xcf\xbe\xc2\xd4\xa3\x3d\x7b\x9c\x34\xec\x7f\xa8\x1d\x9b\xb8\x8a\x3e\x14\xed\xe1\x94\xf1\xa2\x02\x4a\x37\xb1\x83\x3e\x27\x0d\xc2\xed\x4a\xae\x1a\xed\xd4\xe1\xe8\x1a\x88\x1b\xaf\xad\x97\x50\x12\x75\x00\x87\xba\x74\x48\x59\x44\x46\x92\x7b\x28\x79\x50\x5e\x07\xaf\xcc\x00\x32\x24\xb8\xb4\xc6\x4a\x8d\x18\x36\xfd\x4b\x3c\x1e\xf2\x6e\xb2\x8b\x53\x45\xe9\x9a\x1d\xbf\xed\x84\x53\x45\x86\xea\xa6\x82\xc0\x10\x66\x15\x03\x62\x44\xab\x3c\x23\x63\xb7\xa7\xdd\xe8\x19\xd8\x0d\xa3\x00\xad\xb2\xb5\x96\x52\x70\xeb\xc2\x9e\x34\x0c\xd8\xd8\x9a\xc0\x77\x59\xb6\x28\xfa\x54\x4f\x6c\x5e\x78\x46\xa6\xda\xc9\x05\xf1\xfb\xe6\xa6\xdb\xf7\xb6\xf3\x77\x26\xf2\x7e\x64\x49\x0e\xdd\xb9\xce\xb9\xae\x2b\x98\xeb\xbc\xef\xba\x59\x13\xb1\x1b\x22\x3d\xee\x8d\x29\xaa\x71\x07\xbc\x7b\xfd\x31\xcb\x7e\x96\xd9\x9c\x2c\xcd\xc2\xbe\xe4\xb0\x45\xf6\xe7\x99\xcc\xfe\x53\xf6\xbf\x4c\x5e\xd5\xd3\x8b\x34\xf5\xd3\xfd\xe3\x55\x0a\xfa\x1c\x89\xbe\xbd\x7f\x7a\x5e\x5e\x36\x70\x23\x55\xfa\x22\x16\xfd\xb0\x48\x2f\x57\x55\xc4\x17\x19\x84\xc7\x49\xa4\xac\x78\x7a\x7e\x7c\xb8\x7f\x7a\x9e\x7a\x1c\x66\x07\x03\x51\x5b\x43\x8b\x21\xc8\xe2\x61\xbb\xdd\x6c\x40\x7d\xdc\x63\x31\x88\xdd\xf9\xbf\xef\x9b\xd6\x01\x6e\xfb\xfe\x00\x58\xec\xcf\x66\xb8\x04\x43\xac\x74\x3c\x88\x95\x8c\x1b\x60\xcb\xd8\x03\x16\x57\x80\x6c\xdb\xdc\xc6\x4e\xf6\x3d\x20\x2b\x1b\xac\x34\x6e\x61\x21\x67\x84\x20\xc6\x8d\xd5\x46\x6b\x93\x43\xac\x56\xd2\xda\xbd\x31\x3b\xad\xf3\x35\x21\x84\x48\x8f\xf7\x28\x45\xc7\x42\x13\x26\x6a\x28\xd0\x1e\x7b\x42\x48\xdc\x61\x8c\x23\x47\x58\x11\x9c\x65\xf3\xdc\x9f\xd8\x72\x95\x7a\x70\xfe\x43\xf6\x17\xd9\x7f\x4e\xf7\xe9\x47\xfa\x70\x96\x89\x16\xf8\x37\xef\x9f\xbe\x7e\xfb\x74\x65\xb8\x98\xf0\xb5\x45\x0a\x5a\x12\x66\xec\x3c\x88\x93\x86\xc1\xe3\xfd\xd3\xdd\xf9\xee\x7e\xcc\x8b\x29\x39\xf8\xe6\xb1\x5a\xbe\xff\x70\xf7\xf8\xfc\xf4\xfc\x38\x7f\x7a\x7e\xbc\x7b\x7a\x7e\x7c\xf3\xfc\x78\x9f\xaf\x41\x19\x00\x49\x52\xaa\x3e\xae\x42\x3c\x94\x5a\xe4\xa6\x74\xa5\x28\x2b\x53\xd7\xf5\x29\x2b\x6b\x8c\x2c\xd5\x08\x95\x95\xab\x38\x15\x94\x10\x8d\xa3\x02\x5e\x1b\xe3\x25\xad\x62\xa9\x8d\x2c\x29\xd7\x9c\xec\x56\x60\xcf\x79\xdf\x73\x3e\x3f\x58\x6b\xad\x63\xcc\x9c\xbd\x78\xc0\x30\x42\x18\x63\x48\x98\x8d\xcd\x6a\xb5\xaf\xa3\x8c\xc3\x56\xa9\x7a\x6d\x7a\x2d\x25\x2f\x56\x36\x44\xdb\xf3\x0d\x10\x60\x17\xb3\xc8\xe3\xc0\x00\x01\x28\xfa\x20\x35\x20\xd6\xb2\x10\x45\x13\x49\x12\x17\xff\xdd\x64\x93\xdb\x99\xbd\xe0\xd7\xaf\x7a\x07\xff\x3c\xfb\xd3\xec\xdf\x64\xff\x39\xfb\x5f\x6f\xc6\xf7\x43\xba\x0d\xd3\x82\x70\xff\xf8\x9c\x3c\xfa\x74\x13\xde\x3c\x3d\x3f\x3e\xdd\x3f\x3d\xcf\x2f\xef\x9f\x31\x6f\xa7\xa5\xe3\x6f\x81\xb7\x4f\xcf\x8f\xe7\x61\x75\xff\x35\xb8\xab\xd2\x9e\x87\x17\x12\x9d\xd4\x8c\xb4\xfc\xe6\x7e\xf9\x9b\xf7\x40\xce\xe1\xf7\xdb\xa6\xd8\x1d\xeb\x2e\xcf\x56\xfb\x9e\x48\xc2\x99\xe6\x8c\x2b\xda\xee\x56\x86\xf3\x41\xc4\x5d\x7a\x25\x94\x60\x5e\x73\x88\x56\xa5\xd0\xc2\x0e\x43\xb9\x1a\x66\xcc\x68\x0d\xb6\x75\x5d\x96\xa6\xa4\x5c\x11\x8e\x0c\x9c\xd9\xd8\x6a\x1d\xd7\x91\x13\xc5\xb0\xc1\x72\xbb\x51\x48\x32\xae\x08\xa8\x28\xa5\x7b\xce\x39\xc8\xc6\x8c\xb1\xda\x54\xb0\xef\x83\x3a\x47\x34\x6c\x6f\x63\x63\xc8\xd9\x16\x6e\x63\xd7\x4a\x0f\x38\xe0\x23\x42\xd8\xc2\x56\x22\x92\x37\xb6\x5d\x55\x93\x4d\x5c\xe6\xdb\xb3\x4d\x5c\x98\xa4\x3d\xf7\x8f\xb2\x3f\xca\xfe\xe9\x85\xa9\xf3\x3a\xe0\xa6\xfe\xba\xf3\x44\x7c\xba\x4e\xc4\xe7\xb4\xbd\x4d\x22\x19\xaf\xb7\xe1\x0f\xc1\x64\xaa\x1e\x6f\x8b\x8f\x53\x99\x65\xc9\xc3\x71\x1f\xc0\xaa\x82\x01\x55\xe3\x7a\xe7\x0e\x7e\xbb\xf5\x07\xb7\x83\x85\x8f\x3b\xe3\x50\xe9\x6a\xb6\xed\xb9\x21\xb1\x55\x00\xd1\x6d\xc8\x45\x92\x6e\xbf\x6c\x8c\x72\xca\xe6\xbb\xbd\x36\x07\x42\x20\x63\x71\xa3\xb5\xd6\x56\x08\x21\xec\x48\x56\x14\x49\xe4\x39\x11\x87\xb8\x32\x56\x6c\xc0\x41\xc4\x3d\x8f\x3b\xb9\x47\x54\x32\x9c\xcd\x73\x77\xe2\xcb\x2e\xcd\xad\xff\x2a\xe3\xd9\x9f\x65\xe2\xc7\xe7\xd6\xfc\x65\x2a\x7d\x35\xe5\x22\x7e\x38\x93\x3e\x5c\x67\xd2\x79\x10\x9c\xef\xc7\xf5\xf6\xbc\xce\xa4\x1e\xa0\x00\x68\x00\x30\x6e\x43\x1c\x42\xdc\xcc\xda\x78\x28\x2b\x86\x2d\xb7\x04\x57\xb5\xab\x83\x66\x4c\x28\x12\x69\x9e\x05\xef\x3b\x04\x49\x35\xb6\xc6\x88\x7c\xe7\x44\x8d\x24\x45\x63\xa5\xd4\x7e\xaf\xd4\x65\xf6\x70\xae\xf5\xe0\x63\xbb\x1a\x76\x75\x34\x71\x1f\xf7\x4a\xc3\xd8\x1d\x9c\x92\xac\x68\x6d\x88\xbe\x61\x0c\xd4\xe0\x10\x13\x17\x96\xdd\x81\x43\x9e\x31\x86\x11\x65\x7c\xdc\x86\xa8\x6d\x54\x4d\x93\xcd\xf2\xc3\x49\xce\xe9\x42\x5f\x2a\x98\xe7\x15\xf0\xfa\x4c\xd3\xbd\x78\x7e\x7c\x73\x9e\x2f\xe7\xd1\x9e\xa0\x5d\x6f\x97\x29\x49\xf3\xf1\xbb\xf7\x45\xb5\x0a\xc3\xd0\xc5\xb2\x5b\x95\x79\x3d\xee\xc2\x6e\x57\x63\x44\x30\x74\x44\xd6\x87\xb8\xaa\x35\xc4\xf3\x75\xd3\xa4\x16\x93\x48\x22\x74\xeb\xc8\xad\xaf\xbc\x47\x03\xb2\x9a\x7b\xe8\x74\xb6\xc8\x58\x6e\x67\x6c\x21\x53\x2c\x37\x71\x2f\xff\x3a\x21\x4b\x2e\x73\xea\x7d\x02\x96\xdc\x8c\xb4\xcb\x59\x9d\xe7\x5f\xd2\xc5\xfa\x07\x13\xe1\x27\x50\x9d\x6e\x0a\xec\xcf\x5e\x51\x2c\x95\x0d\xd6\xda\x7e\x44\x4e\xed\x42\xe8\xb5\xe0\x42\x0d\x4a\x5a\x6e\xe7\x48\xc5\xa6\xd3\x61\xaa\xe2\x0c\x7c\xcb\x39\x9f\xd8\xf0\x95\xda\x61\x2a\x19\x61\x4c\x10\x49\xd2\x3c\x68\x4e\x62\xd9\x2e\x48\xe2\xed\xfe\x45\xf6\x6d\xf6\x9c\xfd\xc3\xec\x0f\x53\xdd\xf5\xcb\x2a\xf2\xd3\xdd\x9b\x0b\x00\xf6\xf9\x42\x74\x55\x3c\xdc\xfd\x02\x4c\x8c\x77\x93\x16\xd9\xfc\x72\x1f\x97\xb5\x14\x82\x70\xa8\x08\x1a\x77\x5e\x5a\x50\x8b\xe8\x9b\x26\x72\x8e\x3c\xe2\x14\x40\xba\x03\x12\x48\x16\x79\x94\xce\x2a\xc6\x7c\xee\x81\x88\xad\x36\x66\x41\xc6\x6e\x2c\x27\xc2\xfe\x5c\x1c\xb7\x45\xc8\x79\xdc\xc4\x0d\xd8\x44\xd4\x03\xe7\x5a\xdc\xfa\xb1\x3f\x36\x18\x37\x4d\xd3\x40\x94\xef\x49\x64\xf2\x90\x65\x59\x09\xce\x6b\x89\x9c\xbb\x0b\xaf\xeb\xaf\xb2\xe7\x64\x13\xff\xf5\x65\xe5\xbd\x2e\xbc\xb7\xff\xa7\xfc\xf0\x87\xf3\xfa\x79\xdd\x5e\xd3\xc6\x1f\xae\x36\xf1\x4b\x31\x82\x62\x6d\xab\x6a\x87\x34\xc6\x67\x27\xf1\x7c\xde\x69\x73\xc7\xd6\xd7\xb5\xe8\x40\x1b\x07\x40\xa7\x2d\x06\x8b\x88\xab\xa1\xe8\x66\xbd\x52\xc2\xc0\x1d\x39\xf2\xa6\x29\xba\x23\x3f\x6f\x73\x8b\x20\x42\x9c\x50\xcd\x14\x55\x4c\x21\xa0\x61\x6d\x5a\xcd\x58\x4b\x69\xc7\x58\x6e\x90\x52\xe3\x0e\x08\x04\x6d\x3f\xba\xb1\xe3\xbc\xb4\x14\x1f\xf2\xfd\x8a\xc7\xbd\xc8\xb2\xd9\xac\xcc\xc8\xb2\x59\xd8\xec\xef\x24\x65\x85\xdf\x9c\xc7\xf6\x0d\xfe\xfc\xea\x95\x3e\x4e\x96\x1f\x7c\x49\x7d\x74\xf1\xd3\x67\x72\x75\x0e\x11\x2a\xb0\x19\xf7\x38\xaf\xe2\x01\x90\x91\x82\x6c\xc5\xa5\x6c\x98\x2f\x32\x29\x08\x3b\x3f\xcc\xe8\x7d\x9e\x45\x0f\xf4\x7c\xc7\x19\xa4\xc4\x0a\xa3\xcf\xde\xb5\x50\x9d\x1b\x77\xa3\xe7\xa2\x74\x25\xa3\xa7\xac\x28\xb7\x52\x2a\x9e\xea\x96\xf3\x02\x9e\xd8\xb2\x49\x76\xe8\xe7\xd9\xdf\xcf\x48\x8a\x21\x3e\x73\x71\x92\x1d\x7a\x7c\xe5\x5e\xfd\x3d\x70\xeb\x87\x7e\xee\xa3\xde\x28\xe0\x17\x70\x17\x80\x0a\xfb\x7d\x88\x21\xec\x08\x18\x20\xb2\x94\x80\xf0\xe9\xb0\x0e\x58\x71\xc9\x38\xae\x28\xd6\x6d\xce\x7d\x55\x7b\xad\xa4\x26\x4c\x99\x91\x82\x5d\xa2\xb6\x08\xb1\x9e\xef\xfc\xf9\xbf\x10\x42\x88\x3b\x82\x05\xd7\x1e\xd6\x81\x09\xc3\xa9\x80\x0c\xc9\x00\x50\xcd\x88\x32\xd6\x48\xc5\xa4\x89\x8d\xb5\x3e\x36\x20\xc5\xcf\xb3\x02\x9f\x7d\xd8\x85\xcd\x7e\x96\x7d\x48\x2b\xc8\x8f\x73\x19\x3e\x3e\x7f\x49\x69\x93\xd4\x94\x52\xb0\x31\xad\x34\xb7\xf0\x95\xb9\xc2\x10\x0c\x9f\xf6\xe7\x20\x88\x9c\xbd\x37\x04\x3d\x84\xa0\x0e\x31\x80\x5e\x49\x44\x20\x47\x24\x6e\xc3\x26\x00\x1d\x57\xe7\xf3\x43\x45\x16\xc6\x55\x08\x39\x19\x57\x0b\xcb\x85\xf7\x94\xc4\x0d\xe3\x4c\x60\x8a\xf7\x2a\xec\x45\x7a\x2a\xfc\xec\xcd\xc5\x3d\xf0\x41\x1f\x28\x3e\xfa\xb1\x17\x32\xe7\xb1\x59\xa7\x6b\xc9\xc3\x49\xcd\xcf\xeb\xe1\xab\x8d\xbc\xae\x12\x93\x35\x4a\xfa\x2c\x89\x9f\xef\xc5\x46\xce\x92\x8d\xcc\xd7\x20\x4b\xcc\xf0\x9b\x71\x58\x9f\x32\x92\xd3\x71\x48\xfd\x16\x90\x40\x8d\x51\x23\x42\x1d\xbb\xa8\xea\x0e\xe2\xf9\xaa\xeb\xfc\xe0\xdc\x10\x49\x44\xa1\x8b\xca\x85\xca\x35\x78\x0b\x3d\xc3\xa1\xf2\xf6\x3a\x56\xfa\x85\x49\xfd\x91\xbf\xcc\xfe\x69\xf6\x2f\x6e\xd4\x62\x2e\x0e\xcc\x75\x75\x7d\x3b\x61\x6f\xcf\xd1\xcc\xdb\xa7\xbb\x2b\xad\xf6\x97\x0a\x83\x89\xcf\xeb\x7d\x32\x57\x06\x84\x00\xfa\xc8\x42\xb3\x97\x87\x26\x0e\x79\x3f\x34\xb2\xed\xdb\xa6\x06\x25\xc8\xce\xe1\xfd\x7e\x13\x0f\x1c\x28\x17\x10\x64\xc8\x53\x1a\xb4\x0c\x1b\xa6\x28\x81\x94\xe2\x61\x4f\x41\xbd\xe9\x8d\xc5\x6c\xbe\x6e\x5b\x1f\xc3\x6e\xeb\xac\xdb\x32\xe5\x6c\xa3\xd7\xb8\x1e\x84\x57\x9b\xb5\x71\x9d\x8c\x5d\x55\x49\xcd\xac\x10\xda\xb7\xb6\x4d\xec\x24\xc2\x58\x1d\x8c\x5d\x37\x52\x4c\xf3\x22\xf9\x20\xe7\xb9\xfb\xeb\xec\x63\xf6\x87\xd9\x3f\x9b\xae\xf5\x87\xca\x9d\xc5\xd3\x67\x79\x90\xb7\xcb\x87\xd4\x28\x9a\x18\xf1\x3f\x3e\x80\x29\xea\xbe\xa5\x84\x7e\xb8\x7f\x28\x04\x60\x04\x07\x84\xc1\x2a\x66\x35\xcc\x6d\xdc\xe9\xbd\xd6\x02\x6f\x6b\xd5\x30\x09\x2d\x23\xa4\x1c\x09\x0d\x08\x30\x3c\x1e\x08\x31\x4e\x75\x20\xa3\xe7\xa9\x8f\x09\xd8\x32\xbc\xb6\x4c\x28\x31\x06\x4e\x0c\xe6\x30\x6f\x47\x31\xc7\xa1\x87\x8d\xb7\x8c\xb8\x20\x1d\x61\xa7\x2c\xaa\x55\xed\x2a\xb5\x05\xb8\xf6\x1b\x8a\xb5\x6b\x9c\x8d\x07\xc1\x99\xcc\x3b\x6a\x99\xe0\x82\x4b\x26\xf9\xf7\x83\x4b\x58\xa2\xd5\x89\x2e\xcd\x5c\x5f\x7a\x0e\xfe\x45\xf6\x67\xb7\x55\xba\x73\x58\x33\x99\x83\xdb\xa9\x72\xe1\x60\xfa\x6c\x2d\x7a\xd5\xd7\xb9\xd4\x8d\xde\x7e\xbd\x2c\x6e\x6c\xc4\xb7\x05\xb2\x58\x04\x82\xc5\x7e\x9d\x2b\x7f\x38\x30\x4d\x31\x24\x94\x8e\x01\x64\x9c\x68\xcc\x8b\x52\x69\x84\x21\x43\x2c\xa2\xfd\x20\x87\x8d\xdf\xb2\x83\x8a\xda\xe7\xb2\x72\x95\xb5\x65\xdd\x7a\xe1\x1b\xb3\xa7\x40\xcf\x35\xe5\x3c\x22\x20\x51\x6d\x5c\x29\x84\x5d\x1b\x5e\xfa\x52\x74\x48\x48\x2a\x79\x74\xa3\x9e\xcc\x1e\xd8\x09\x6d\x8c\x6c\x90\x26\x6e\x64\x05\xa1\xbc\xa2\x34\xf6\x35\x41\x4c\x68\xc9\x34\xb5\x3c\x9b\xe5\x9b\x13\x5b\x76\x0b\x94\xf2\xf6\xef\x27\xed\x8a\xaa\x78\xff\xb7\xc1\xd9\x11\x98\x10\xa6\x77\xd3\x40\xfe\xea\xed\xf2\xbb\xe2\xe6\xba\x27\x2d\xd3\xf7\x1f\xde\x3c\x16\x87\xe0\x38\x2d\xd6\xcd\x28\xf3\x26\xee\x7d\x6d\xb9\x52\xc1\xf7\xa2\x77\x4c\x25\xed\x2f\x12\x3d\x20\x21\x88\x01\x37\x33\x18\x77\xe3\x2e\x0a\x0e\x4a\x60\x00\xcc\xf7\xe3\x01\x98\xdd\x3a\xee\x69\xf2\x08\xe2\x3a\x34\x3d\xc0\xd1\x6a\x51\xfb\x5a\xe4\x2b\x2d\x22\x69\xf4\x1a\xe8\x6c\x5e\x90\xcb\xf8\xfc\x5b\xd9\xef\xa5\xb5\x85\x5c\x54\x66\xdf\x5c\xca\x03\x6f\x7f\x01\xde\xbe\x28\x24\x7e\x4c\x8c\x13\x6f\xbe\x5c\x61\xae\x5e\xf1\x8c\x12\xaa\x76\x26\x40\x94\x97\xba\x51\x28\x68\x16\xd7\xfd\x2a\xae\xc8\xa1\x13\xb8\x66\x2e\xf0\x41\x4a\xca\xa1\x26\x78\x3c\x84\x90\x30\x63\xe5\x78\x98\x05\x82\xd5\x0a\x40\xc4\x98\xef\x2c\xaa\x60\x1d\xa8\xd2\xcc\x63\xc1\x76\x58\x08\x65\xc6\x7e\xcc\xb8\xa8\x5d\xcd\x64\x5c\x17\xed\x29\xb3\xd1\x99\x49\xb7\x8c\x26\x6d\x76\x9d\x15\xd9\xcf\x5f\x74\x05\x1f\xee\x1f\xde\xa6\x24\xf7\x2f\x2e\x0b\xe5\x37\x6f\x97\xdf\x16\x0f\xf7\x09\x12\x35\xff\xf2\xec\xaf\x4b\x7e\x5e\xce\xba\x4f\x9c\xc7\xdd\x7c\x37\x0e\xd4\x97\x0c\x5b\x4c\xfc\x40\xc6\x61\x1f\x3b\x40\xd0\x76\xc5\x66\x49\x28\x19\x2a\x42\x8e\x2e\x84\xc2\x1c\xdd\x79\x9b\x6b\xb3\x75\x8e\x72\xc2\x19\xc5\xa8\x0e\x14\x88\xbd\xd2\x82\x30\x31\x2a\x2e\x2a\x57\x31\x12\x0f\x05\xdd\xca\xb8\x12\x59\x96\x81\x22\x3b\x75\x73\xb5\x30\xa9\x66\xf9\xf8\xfc\x94\xb0\x6e\x13\x57\xd6\xd3\xfd\x63\xbe\xbc\x36\x09\x4d\x13\xa0\x18\x86\x4d\xdf\xfb\xbe\x5f\xaf\xa5\x32\x0e\x61\x2b\xa9\xaf\xca\x61\x8d\x75\x1e\x12\xbf\x49\x1d\x77\x3e\x0a\x1f\x7d\x5b\xe1\xc6\x92\x53\x16\x37\x94\x51\x52\xbb\x21\x71\x34\xf1\x59\x57\x0c\xd9\x43\xe2\x08\xfe\xa2\x3a\xfb\xc5\x2c\x7b\x7e\xba\xbf\x9d\x63\x1f\x66\x9d\x92\x54\x22\x4b\x71\xdc\x94\xa5\xd7\x42\x5a\x1e\xe4\x0a\xc5\x5d\x03\xd6\xc1\xf9\xaa\xb6\x42\x70\xc3\x95\xed\x0b\x79\xec\xa5\xaa\x9a\x8a\xe7\x0d\xaa\xb9\xb2\x8a\x6b\x6a\x44\x73\x34\xb3\x52\xca\xc8\x31\x42\x94\x5b\xc1\xac\xe4\x13\x2e\xc5\x17\x61\x69\x52\x6c\x76\xe1\x12\x7d\x5e\x4c\x32\x69\xcf\x0f\xef\x9e\xee\xa7\x64\xd8\x2b\x15\x0e\xfc\xee\x39\xdf\x36\xcd\x21\x6e\x30\xa0\xa0\x1a\xd7\x39\x06\xba\x01\xd5\x5e\xc4\x5d\x1c\xd8\xe0\x78\x15\xa0\xdb\xc4\x43\xb3\x30\x23\x69\x14\xf7\x42\x5a\xeb\x7b\xca\xad\xa4\x17\x44\x9d\x62\x32\xcb\x8b\xf2\xc4\x97\x7e\x61\x2e\x0c\xfc\x13\xc6\xe2\xe3\x37\xe7\x9b\x7d\x8b\xa4\x7b\x9c\x64\xef\xef\x9e\x1f\xde\x4c\x5d\x31\xe6\x1c\xf9\xe8\x52\x08\xea\x11\xad\x4c\x10\xa6\x76\x82\xd6\x64\xb5\xdd\xa8\x61\x88\x5b\x1c\xa8\x0c\x72\x8e\x00\x8f\x5d\x44\x68\x17\x0f\x74\xdd\x8d\x7e\x8f\x02\x14\xfb\x82\x8e\xdd\xd8\x06\x17\xf2\x12\xec\xf0\x29\xc3\x71\xb3\xe3\xdb\x29\x6f\xb7\x2f\xe4\x92\x2d\x4c\x8a\xf3\x7f\x71\x61\x80\x7d\x4a\x05\xbe\x69\xd8\x7e\xae\xd1\x98\x8b\xa6\x89\xc1\xfb\x7c\x55\x64\xca\x77\x1b\x16\x0f\xeb\x76\xc3\x7b\xa7\x98\x90\xce\xb3\xb1\x5f\x98\xe3\x21\xdf\x8c\x2a\x0f\x7a\x67\x38\x0e\x44\x2b\xec\x11\xe5\xca\x58\xa1\xa6\x5c\x61\x21\x4e\x7c\xd9\x2c\xa6\xba\xf9\xdb\x2c\x03\xc9\x0c\x5d\xe8\x07\xae\xf9\xfc\xc7\xbb\x87\x05\xec\x57\xae\x1f\xe2\x21\xd8\x9d\x5e\x0f\xa0\x6d\xc0\x10\x69\x13\xc5\x42\x46\xbe\x56\x6b\xb0\x62\x28\xd2\x53\xa6\x41\x3d\x76\x40\x47\x1f\x46\x9a\x0f\x19\xc8\x9a\xc2\x2e\xc5\xc2\xa5\x8c\xfc\x2d\x7b\xc8\x95\x52\x20\x65\xb7\xbe\x7b\x3f\xc3\x04\xe6\xeb\x63\xe5\x3c\x08\xa0\x47\xd8\x75\xad\xa5\xe7\x5b\xa5\xd0\xae\x1b\xf7\x05\x86\x68\xe1\xb8\x0c\xbd\xac\x29\x82\xd2\xf5\x8a\x51\x0e\xad\x1a\x02\x9d\x38\xe7\x64\xe1\x96\x7e\x61\xb3\xbf\x91\xbd\xc9\xfe\x7f\xa9\x36\x3c\x39\x97\x13\x0b\xc5\x1f\x26\x1e\xb4\xfb\x0b\x3f\xfa\xe2\x33\xc5\xcb\x2b\x3f\xfa\xc7\x87\xaf\xf3\xac\xaa\xcf\x6e\x31\x19\x2d\xa1\xda\xb8\x73\x10\x52\x28\x57\x56\x79\xa5\xb0\xf3\x1b\xb9\x69\x5d\xcf\x82\xe6\x14\x21\xd5\x48\xae\x35\x89\xcd\xa2\x42\x10\x11\x12\x65\xe0\xc2\x0f\xdb\xb8\xee\x15\xa0\x08\xd6\xd6\x1a\x42\x0c\x15\x1c\x6a\x88\x09\x45\x90\x07\x2c\x29\x97\xe5\x15\xfb\x5a\xa8\x05\x7d\xc1\xd9\x4e\xda\x08\x93\x9b\xf8\x74\xf7\xf8\xf6\x26\xb9\x50\x3c\x3d\x27\x7f\x31\x2d\x96\x13\xa0\xe0\xc3\xc7\xe7\x47\x93\xef\xb9\x1f\xb7\x5a\xee\x27\xd5\xcf\x69\xdb\x34\x2d\x58\x37\xce\x71\x5a\x6f\xe2\xa1\x56\xb2\x59\x50\xfb\x5b\x57\x38\x97\x2b\x6b\x63\xd0\xd1\xbb\xd1\x05\xe7\x82\xf1\x65\x65\x28\xf2\x55\xd9\x65\xf3\xcc\xe7\xdb\xe4\xb3\xff\x4e\x76\x97\xd8\xe4\xff\xff\x57\x85\xf1\x89\x78\x34\x11\x7d\x7e\x98\x5f\xc8\xef\xd2\xae\x77\xaf\x2d\x84\x0f\x93\xe7\xf8\xcd\xd3\xc3\xf2\xf1\xc2\x86\x9e\xbe\xb4\x28\x99\x54\x6b\x68\xa1\xb7\xc2\x7c\x32\xc6\x9e\x32\xb1\xcd\x35\x93\x6a\x85\x6c\x09\xb5\x10\x3c\x96\x86\x19\xcf\xa9\x00\xb0\x28\x3d\x58\x47\xec\x56\xa0\x44\xdb\xd1\x1b\x66\xe4\xa6\x76\x25\x64\x7e\x6e\x24\x57\xbe\xaf\xad\x50\x5a\x03\x41\x7b\x67\xb4\x92\x5c\xb9\xa1\xa6\x94\x70\xcd\x05\x55\x2a\x2a\x80\x09\x34\x81\x1b\x5d\x3a\xa7\x98\xd5\xfb\x4a\x31\x76\xe5\x48\xcf\xe1\xac\x4e\xfe\x6e\xfd\x39\xfb\xf6\x0b\x8b\xff\x34\x4e\x1e\xee\xde\x3d\xde\x2f\x9f\x3e\xde\x3f\x3d\x5b\x10\x92\x6a\x1f\x20\xc7\x2d\x10\x51\xad\x2a\xa5\x55\x51\x47\x32\x94\x2b\xdb\x2f\x30\x63\x46\x68\x2d\x46\xd7\x58\x69\x76\x43\x6c\x0e\x02\x3b\xe7\xa6\x79\x35\xe4\x74\x59\x2e\x74\xca\x01\xbc\xb9\x44\xa4\x77\x0f\x77\x0f\x1f\xc0\x24\x26\x7d\x1e\x7f\xbc\x15\x6a\x7d\xec\xc1\x5a\x47\x91\xd7\xe3\xae\xd4\xd4\x51\xbd\xd0\x78\x08\xa3\xc8\xdb\x61\x44\xc0\xe7\x95\xf3\x3c\x24\x4c\x60\x51\x27\x5f\x42\x67\x3f\xcf\xfe\x51\xf6\xef\x6e\xd9\x1c\xa7\xf9\xf4\x9b\xe9\xce\x5f\x89\x14\x5f\x8e\xfe\xc8\xc1\x8b\x60\xd7\xd3\x4b\x6c\xf5\x98\xcf\xdf\x7f\x78\xf3\x50\x6c\x04\xa5\xc4\x0d\x6b\x2d\xca\xda\xd0\xca\x96\xfd\x1a\x79\xab\x2d\x0c\xd2\x73\xb0\x4a\x47\xfb\x8d\x16\xf0\xcb\x83\xec\xd8\x83\xba\x0c\xe5\x36\x80\x2a\xee\xc3\x0e\xc5\x2d\x5d\xc3\xb8\x9f\xad\xab\x5a\x1a\x12\xfd\xba\xae\x31\x82\xc1\x23\x7c\x7e\x4a\x6e\x85\x6b\xdb\x82\x0a\xef\x5c\x55\x2b\x3d\x1d\x17\x3f\x3c\xbc\x3e\x2a\xa1\x94\x18\x06\x9f\xa8\x09\x09\xf1\x04\x90\xf3\xbd\x60\x39\x5c\xb6\x0b\x9e\xec\xd6\xcf\x6f\xec\xd6\xf2\xfd\x87\xdf\x03\xaf\xf7\x64\xb2\x31\x0b\xde\x76\xb6\x6f\x63\xf0\x62\xab\x87\xbd\x77\x76\xbd\x41\xd4\x59\x11\xaa\x3a\xae\x63\x87\xfa\x05\x8f\xb6\x55\x2b\x60\x29\x8c\xfe\xa0\x37\x18\xc5\xd6\x55\x44\x4a\x3a\xec\x19\x25\xb4\x32\x17\x2e\x56\x53\xc0\x25\x5e\xd8\x17\x2d\x99\xb7\xd7\xc8\xfb\x6a\x54\x2e\x14\x72\x1f\x1f\x2f\x12\x82\x09\x89\x0f\x82\xc7\x79\x1d\xd7\x15\x30\x51\x97\xd5\xa6\x57\xdd\xca\xc4\x1d\x03\x48\x45\x07\xba\xaa\x23\x44\xba\x82\xe4\xcd\x28\x3d\xb0\xd1\x2e\x2c\x54\xd6\x59\x58\x51\x61\x24\xd3\xcc\x70\x67\x1d\x45\x4a\x97\x63\xeb\x00\xcb\x66\xa0\x39\x0d\x0b\x5d\xb8\xec\xab\xec\x9b\xa4\x12\x9e\xa5\x94\xc5\x79\xba\xde\x27\xb1\xca\x3f\xb8\x55\xab\xfc\xf6\xe3\xf3\x03\xe8\x67\xa1\x95\xbc\x5e\x85\xa8\x23\xa9\xb9\xf0\x00\xe5\x38\x15\xaa\xd6\x80\x1c\xc6\x75\xe1\x5c\x2c\xcb\xca\xd7\x7d\x8b\xa1\x2f\x73\xae\x54\x1c\x64\x6c\xea\x9a\x67\xcb\x8c\x9f\xc8\xb2\x59\xb0\x4b\xdf\xc4\xcf\xb3\xe7\xec\x1f\x9f\x6d\x44\xb2\x59\x1f\x9e\xae\x7f\xf5\xf6\x8f\xbe\x7b\x7e\x98\xbf\x5d\xcc\x6f\xb5\x50\xc1\xdd\xe3\x5d\x22\x0f\x4e\xb4\xc1\x93\xd4\x5f\x28\xac\x44\xb0\x12\x21\x6e\x63\x5b\x5b\x03\xaa\xab\xbe\x64\xd2\x98\x64\x6a\x1f\xd7\xda\xb7\xc6\xfb\x66\x03\x2a\x1e\xeb\xb8\xf6\xf1\x10\xd7\x34\xdf\xc5\x52\x6d\x4e\x99\x3c\x7b\xba\xf2\x94\x45\x27\x80\x5b\x30\x3f\xee\x4b\x53\x6a\x81\xa1\xab\x72\xa1\x54\x6c\x4d\xf4\x48\xac\x34\x27\xa5\x51\xc6\x89\xa0\x2d\x6b\x1a\x40\xc7\x7d\x3e\x20\xe4\xf9\x4e\x3b\xa1\x14\xd4\x3b\xeb\xec\xa4\xbf\x2e\xf3\x66\x89\x17\xf4\xd2\x5f\x31\x55\x76\xa6\x2b\xfd\xf8\x13\x17\x7a\xed\xb8\x70\x45\x6f\x55\x6d\x43\x1c\xa2\xaf\x7b\x0f\xd0\xed\xb5\xe4\xfb\xdc\x8f\x3a\x09\xa8\x2d\xa8\x1b\x37\x95\xa9\x8c\x44\xe7\xd3\x3c\x5b\xe6\x46\xc7\x00\x25\x38\x8c\xd2\x81\x0b\x27\x9f\x2e\xd6\x4b\xbb\xf0\xd9\x5f\x4f\x1a\x7b\x7f\x03\x5c\x20\x3f\xc9\xf8\x4e\x7d\x40\xd3\x87\xb9\xd6\x5a\x19\xa0\x49\x53\xa3\xdd\xd6\x0d\xc7\xda\xee\x35\x70\xac\xa9\x71\x63\xa5\x9d\x43\xaf\xb8\x06\x25\xa0\x50\xcb\xbd\xd6\x7a\xd7\x05\x75\x00\x14\x2a\x29\xb5\xb5\xd9\x45\xeb\x90\x2f\x6d\xd1\xbf\x76\x7d\xbc\x7b\x3b\xbf\x7f\x7c\x4e\x14\xc2\x17\xcd\xc3\x8b\x42\xc2\xf3\xc3\xfd\x52\x57\x71\xd5\x7c\xaa\x6b\x40\xec\x5c\xbb\x23\x2e\xf0\x71\x7d\xdd\x3a\x5f\x0d\x3d\xf5\x55\x3e\x78\x3f\x5a\xb0\xf7\x51\xd9\xe8\x74\x48\xf3\x67\x96\x9d\xf0\x52\xbe\xac\x7b\x19\xb8\x7b\x6d\x1b\xbc\x2a\xd0\x2d\xd1\x68\xf2\xa1\x19\xb7\x4d\x92\xe2\xcb\xe1\xb8\x5d\xd0\x51\x1e\x8e\xbd\x0a\xcb\x6a\xdc\x03\xfb\x7d\x0b\xfa\xe4\xcf\xea\xa5\xce\xbb\xec\x17\x17\xb6\xec\xc7\x69\x55\xff\x42\x65\x74\x72\x32\xe6\x89\x5b\x60\x01\xb2\xf9\xfe\xd0\x18\x84\x87\xe1\x46\x5b\xd4\xe4\x2e\x6e\xe3\x06\xf7\x2a\x76\x40\x00\x05\x5a\x88\xc6\x2d\xcf\x3b\xd7\x58\x82\x61\xa5\x8d\xb2\x56\x19\x59\x97\x96\xf1\x50\x11\x84\x44\x96\x2d\x8b\x29\x97\x6a\x6e\xb4\x25\x7e\x9d\xd6\xcd\x97\x4c\xca\xdd\xe3\x8d\xbe\xc4\xe3\xdd\xd3\xf3\xc3\x9b\x4b\xd9\x0e\x5c\xdf\x2f\x11\xff\xdd\x2f\xc0\xc3\xd3\x94\x58\x3d\x0f\xad\x0c\x64\x0e\x64\xa7\xec\x70\x38\x5b\x53\x17\x77\xa0\x3e\x1c\x4e\x99\x33\x06\x64\x26\x4e\x6f\x23\xa1\xd0\xd5\xb4\x3c\x90\x01\xd4\x7b\x16\x57\xb1\x53\x5a\x6a\x39\xdf\x34\x8d\xb3\x23\xb5\x6e\xb3\x71\x36\x1f\x52\x56\xbc\x49\xe2\xd3\xf9\xce\xb7\xb8\xf3\xe3\x70\x5c\x73\x1a\x86\x55\xb0\x79\x9f\xcd\x33\x7e\xa2\x45\xb7\xb0\x97\xb1\xfe\xdd\xa5\x37\xff\xe3\x04\xc9\x5e\x5c\x81\x48\x53\xfa\xe1\x45\x3b\x6d\xca\xc9\xa4\x08\x7e\x6a\xd1\x19\xd6\xb0\x6a\x6b\x04\x58\xdc\x54\x35\xf0\x11\xab\x41\x05\xb1\x01\x08\x9f\x32\x97\x32\xa7\x29\x7b\x6a\xb5\xd0\xd6\x87\xdd\x2e\x6c\x36\xf3\xb5\x10\x90\xd3\xd1\x11\x6a\xfb\xa0\xb4\xb1\x06\x24\xb9\x8c\x98\x09\xad\x8c\x20\x9d\x8b\x3d\x60\x2e\x9b\x17\xfc\xc4\xd2\xbd\xfe\x9d\x0c\x5e\x6d\x0f\x98\x5c\x93\x84\xe1\xf9\x9c\x83\x70\xe2\x70\x79\x7c\xf7\x23\x3b\xaf\x1d\x31\x53\xb7\x9e\xf4\x70\x7b\xe0\x87\xed\x10\xb7\x1c\xe8\x03\x70\x8c\x09\x07\x1b\x82\xb4\xa3\x9d\x3b\x80\x0d\x68\xaf\x7b\xac\xa7\x83\x4f\x9c\x65\x4c\x72\x95\xab\xf3\x9b\x5c\x18\x8c\x0f\xd6\x07\x50\x9e\xb2\xce\xee\xa3\xff\xb4\xe3\x1c\x3a\x88\x01\x36\xd2\x6b\x0f\xbc\xfb\xb4\xe7\xbc\x76\x35\x06\xe4\xbc\xc7\x01\xc7\x8c\x55\xc1\x50\xad\xa5\xd5\x93\xaf\xd0\x9e\xe8\xb2\x4d\x79\xc5\x37\x49\x65\x74\x72\xac\x96\xef\xbf\x02\x09\xba\x9d\x98\xaf\xf2\xcb\x13\x98\x84\x1a\x2e\x99\xc6\x9f\x83\xa7\xfb\xc7\xf3\xca\x37\x6b\x1d\x42\x8e\x98\x16\x60\xd0\x8b\x31\x00\x1b\x37\x20\x63\x03\xef\xf1\x1e\x64\x0c\x11\x6d\x90\x2d\x6b\x20\xfa\x7d\xcf\x0d\x33\x0b\x8b\x7b\xf7\x3d\x99\x71\x25\x52\xd5\x20\x58\xbb\xfb\x44\xcf\xd7\xd0\x1d\x3c\xc8\x8c\x10\xc3\x16\x51\xe2\xb6\xd0\xc7\xbd\xf1\x17\xbb\x38\xf1\xec\xe2\x6c\x79\x19\xed\xff\x20\xf9\xd9\x97\xd9\xfb\xf6\x2f\x51\x55\xf9\x52\x23\x70\xa9\xc3\xf7\x24\xac\x72\xe5\x73\x3b\xda\x5c\x8f\x93\xea\xd1\x71\x28\x68\x82\x87\x84\x70\x76\x04\x73\x09\xd6\x9f\xd6\xd7\x9f\x66\x38\xee\x42\x00\xf5\x0a\x42\x43\xc7\x1d\xf1\xde\x7b\x92\xd7\x34\xee\x39\xe7\x71\xcf\x18\x7b\xe9\x9b\xf0\xc5\x3a\x31\x4f\x7f\xbc\xf2\x16\xde\x90\x17\xbe\x2e\xd7\x2f\x40\x9d\x8f\xef\x2e\xba\x80\x1f\x3e\x3e\x7c\x33\xb1\x4d\x7c\x53\x54\xa3\xc8\x2b\x4c\xe2\x21\x6f\xcb\xca\xc1\x2a\xef\xe2\x41\x82\xc3\x11\xb2\x62\x1f\x0d\xb5\xa0\x02\x50\xc7\x2e\xee\xe2\x3a\x66\x04\xa8\x5d\x54\xe1\xec\xc5\x21\x0a\x06\x0c\x47\x4f\x00\x0d\x74\xdc\x21\x34\x80\xad\x63\xd4\x55\x35\x46\x67\xef\x50\x39\xcd\x30\x35\x82\x28\xe4\x6a\xcc\x9c\xc3\x03\x65\x74\xec\xb0\xc4\xa8\xbe\xf4\xde\x9e\xed\xf0\x2f\x53\x8c\x7e\x89\x98\x6e\x62\xf3\xd7\xac\xd7\x14\x38\xdd\xe6\xc7\x67\x15\x82\xf9\x36\x86\xb2\xea\x3a\xd1\x76\x42\xe9\x7d\x3d\xfa\xca\x1a\xae\xad\xea\x35\x20\x55\xf4\xf9\xbe\x86\x63\x56\xd0\xa6\x40\xc7\x4d\x73\x1c\x8a\x9e\x31\x47\x11\x51\x4e\x13\x4e\xac\x72\x82\x48\x2b\xa9\x61\xc6\x34\x0e\xe3\x51\x59\xeb\xce\x91\xc5\x79\x8d\x38\x9f\x1b\x2f\x56\xaf\x4a\x3a\xe0\x16\xc6\xf1\xc3\x42\xcb\xb7\xa9\xc0\xf2\xfc\x70\x9f\x52\x2a\x30\x20\x08\x86\xea\xfc\x96\xcb\xd1\xe5\x68\xdc\xa4\xcd\x7d\xbf\x0b\x4c\x5a\x80\xf2\xc9\xc7\x4b\x5b\xb1\x22\x84\x62\x84\x29\xf3\xda\x59\x67\x3c\xc9\x7b\xce\xc4\xa1\xd1\x3a\x1e\xac\x3d\x65\x26\x71\xf9\x93\x65\x28\x86\xa4\x65\x56\x27\x1f\xe8\xed\xcd\x63\x9d\xdc\x8b\x87\x24\x9b\xf2\xee\x6d\xd2\xa0\x2c\x76\xba\x2a\x41\x03\x7a\x1e\x69\xc4\x31\x44\xc1\x13\xb9\xc5\x29\x8b\x2d\x03\x1c\x6c\x7d\x1c\x46\xcf\x72\x96\xc3\xb0\x19\xf7\x11\xd1\xfc\x50\x0c\xb2\x2c\x3b\xe9\xe4\x66\x6d\xac\xab\x65\x27\xac\x60\x71\xa7\x9d\xc4\xbc\x5d\xf3\x8b\x86\x1e\x68\x92\x0e\x05\xca\x1e\xb3\x7f\x95\xfd\xef\x9f\xb3\x0b\x7f\xa9\x6d\x7a\xd5\x38\x2a\x1e\x9e\x2f\xd8\x86\xf4\xcd\xa7\x29\xf7\xfe\xf5\xad\xbd\xfd\xcd\xc7\xc7\xe7\x27\xf0\xf9\x37\x3e\x5b\x53\x9e\x9f\x9e\xd3\xbf\x52\x78\x8a\x00\x22\xc8\x21\x04\xc4\xb8\x49\x93\x46\x8c\xad\x1f\xfb\x9c\xc5\x1a\xec\xc6\x1d\x40\x10\x8b\xb8\xeb\x6a\xa8\x49\xad\x10\x74\x10\xfa\xb8\x3d\xc4\x43\x09\x58\x6c\x50\xab\x05\x59\x81\xb2\xdc\xee\xf2\x3d\x86\xd7\xe3\xbb\xfd\x3e\xc9\xbb\x9e\x47\xc0\x7e\x9f\x7e\x7b\x8e\xb8\xe0\x02\x31\x62\xa8\xa4\x5a\x4a\x4d\xcf\xa3\x85\x1c\xbd\x22\x04\x52\xce\x38\xa2\x58\x31\x85\xa0\x36\x5a\x11\xa6\x21\x52\x80\xbe\xee\x67\x7a\xbb\xd5\x4c\x31\x45\x48\x96\x65\x7f\x2d\x6f\x52\x5d\xde\xdf\x58\x94\x8f\xd9\x7f\x4c\xf8\x19\x7d\xdb\xab\x3d\x0d\xfe\x34\xf6\x1f\xa6\x16\xfd\xbf\x75\x69\xaf\x5d\x4e\x65\xfa\x9f\x5f\x57\xd4\x84\x6e\x78\x9a\xf2\x45\xcf\x6f\xff\x06\xf8\xfb\xe0\x92\xbc\xfc\x32\xe6\xff\xf8\xdd\xf3\x9b\xf3\xbf\x59\xdc\xa4\xd2\x97\x3e\xae\x00\x3c\x9a\xa2\x85\x44\xc3\x2a\xee\xea\x92\x51\x1a\xbb\x95\x53\x02\x6c\x2b\xd8\x20\x88\x83\xeb\xfb\x1e\xd0\xe0\x9b\x71\x6b\x2a\x4c\x2a\x53\x12\x8b\xaa\x0a\x6c\x99\xa5\xa4\x67\xdb\xd0\xae\x45\xef\x38\x21\x44\xb6\xbc\xdc\x0b\x1a\x3b\x76\x50\x84\x08\x92\x1b\x46\x24\x66\x8b\xda\xc9\xd8\x71\xcd\x39\x45\xb8\xaa\x05\x23\x55\x4a\xd9\x1e\x80\x03\x75\xbe\x43\x10\x13\xba\x93\x52\xca\xcd\xf9\x45\x46\xec\xea\x0a\x62\x24\x09\x44\xca\x49\x58\xc1\x80\x85\xc0\x0e\x12\x46\x29\x56\x61\xa8\x61\x3c\xdf\xe1\x1c\x12\xc3\x38\xe7\x4c\x70\x21\x26\xec\x2b\x5d\x36\xc5\x70\xe1\xaa\xfb\x7c\x3c\x7e\xfd\x5a\x73\x38\x4f\x98\xc7\x1b\x79\xd4\xdb\x31\x9a\x6b\xc1\xc0\x4e\xe0\x06\x73\xd0\x8e\xd9\xd9\x81\x2d\x0b\x7a\xec\xca\xaa\xc0\xa3\x3f\x80\x35\x19\x87\xb8\xc3\xdd\xd9\xe0\x6d\xba\x71\x95\x87\xba\x3a\x1e\x26\x97\x6a\xcc\x40\x87\x48\x31\x70\x29\x38\x64\xa9\xde\x59\x57\x0a\x23\xe5\x90\x67\x87\x53\x46\x3d\xb6\x0a\x61\xc5\x15\x53\x18\x5f\xb0\xba\x26\xef\xcf\xd1\xf9\x8f\x9c\xd0\x74\xe2\x2f\x54\x8d\x33\x08\xdb\x51\x11\xb0\x1d\x46\x9d\x1f\xaa\x72\xf4\xb9\x1e\xcd\x7c\x18\x55\x6e\x46\x5b\x16\x74\x54\xab\xf3\xe9\xad\xfc\x29\x63\x01\x39\x07\x91\xe5\xce\x71\x8b\xa0\x33\x28\xe0\x64\xcf\xf0\xb2\xcd\xf7\x89\x05\xe5\xef\x25\xe5\xc1\xb7\xaf\x30\xf8\xa9\x39\xee\x42\x69\x7e\x7f\x33\x44\x26\xcf\x21\x0d\x9a\x59\xd6\xe0\xbc\x27\xda\x71\x14\x57\xe5\x70\xb6\x2b\xbc\xe5\x87\x41\x82\x2d\xb2\x5c\xea\x6e\xdc\x3b\xad\xb4\x55\xe9\x15\x0c\xb2\x5d\xe9\x4d\xbe\x87\xce\x59\xcb\x85\x80\x75\xb4\xa8\xe1\x00\xb7\x03\x72\x1a\x84\xd2\x0a\xd3\xed\x28\xb7\x8a\x6a\x26\xac\x66\x4e\x1c\x82\x69\x26\xbe\x9a\xbc\x59\x9a\x85\x48\x1e\x5a\x62\xf5\x02\x17\x5b\x90\x9c\xb4\x2b\xd2\x67\xba\x5b\x1f\xff\x1e\x58\x3e\x3c\xcf\x5f\xe4\xdd\xf0\x5c\xee\x76\x47\x0c\xe1\x4c\x7e\x82\xb6\x53\x07\xbf\x03\xac\xae\x62\x99\xc3\x2a\xda\x1c\x56\x79\x3f\xa2\xaa\xca\x0f\xc7\xae\x68\x8e\x72\x21\x56\x66\x8d\x61\x6c\xb7\x8a\x5a\x11\x2c\x42\x86\x31\x36\x60\xc8\x63\xa6\xb2\x84\xf9\xe5\xcb\x26\x5f\x65\xdf\x64\xd9\xbb\xa9\x19\x36\xf1\x48\x5d\xaa\x04\xe9\xe1\xa8\x68\xc7\xbd\x2a\x0c\x30\x23\x09\x5b\x01\x38\x28\x0d\x42\x45\xe9\xfa\x15\x58\xf1\xf1\x40\x1a\x1a\x24\xc0\x5a\x06\x77\x90\x18\x79\xaf\x04\x69\x59\xf6\x3b\x17\x1f\xa3\xcd\xde\x67\xff\x2c\xfb\xd7\xd9\xbf\xcd\xfe\x9b\xec\xdf\x67\xff\x63\xf6\x3f\x67\xff\x47\xf6\x7f\x65\xf6\x9a\x93\xba\x78\x40\x17\x99\xf9\xc9\x0c\xbc\xff\xac\xed\x03\xbc\xce\xf6\x4b\x01\xe3\x35\x57\xf2\xe6\x05\x51\x76\x5d\xb6\x96\x37\x3e\xe1\x94\x43\x48\xe5\x81\x09\x02\x74\xf7\x70\xf7\x61\xfe\xf4\x7c\x11\x52\x59\xd4\x4a\x21\xa3\x56\xb5\x13\x96\x1a\x23\x6d\x68\xb4\xae\xa1\x12\x44\x43\x8c\xa9\x44\xa8\xc6\x04\x1e\x05\xc3\xba\x2a\xd7\x5b\x68\xe4\x70\xfe\x2a\x33\x16\x23\x77\xfe\x6e\x05\xb7\x03\xc2\x9e\xc2\x61\xdc\x21\xb0\x89\x69\x0b\xac\x36\x15\x9d\xd7\x14\x1b\x48\xbf\xcf\x4c\xc5\x0c\x9d\xf5\xaa\x96\xc2\x1e\x2c\x38\xf0\x48\x0e\x87\xc8\x48\xad\x6b\x04\x54\x5d\x6a\x15\xa0\x0d\x07\xb4\x0a\xd5\x80\x62\x13\x2a\x4c\x09\xf6\x1d\x96\x75\x19\xb9\xa0\xa5\x29\x71\xbe\xf6\x1d\xc6\x88\xd6\xe9\xbb\x1e\x64\xe7\x2f\x4b\x89\x62\xf0\xe7\x6f\x03\xc1\x18\x12\xd2\x59\xa3\x0d\xef\x3b\xb4\xea\x2a\xd7\xe0\xd6\xa2\xfa\x94\x0d\xac\x5b\xc3\xc6\xe3\x80\x09\x18\x4e\x99\x0d\xad\x6c\x56\x68\x7d\x1e\x87\x65\xc2\x96\xca\xd4\xdf\x34\x75\xec\xff\x69\xf6\x6f\xd2\x33\xba\x41\x3b\x3e\xfd\x04\xe8\xe2\x71\x79\xff\xe6\xf9\xf1\x3e\xe1\x49\xde\xe6\xcb\x97\x2c\xf0\xe2\x46\x56\x63\xf9\xe1\xe3\x87\x37\x13\x06\xe6\x9b\xfb\xe5\x6f\x2e\x48\x98\x99\x0d\x35\x5a\x43\x64\x19\x39\xc4\xfe\x25\xdd\xc9\x47\xe4\x31\x56\x5b\xa0\x77\xd5\xe1\x70\x38\x44\xe2\xd6\x07\x50\xd7\xb5\x91\xd4\x56\xf5\x21\x6e\x61\xf0\xd6\xc1\x46\x79\xe6\x53\x1e\x05\x39\xc8\x38\x0e\xf5\xca\xd5\xdc\xf1\x59\x80\x52\x10\xcc\x85\x74\x9d\x6f\x5c\xeb\x79\x7e\x20\x58\x1f\xfa\x0e\xfa\xb8\x6e\x9a\xb8\x6e\x0b\x8c\x63\xbf\xc1\x08\x52\xdb\x10\x8c\x49\xad\x4d\x5b\x97\xce\xef\x50\xef\xcb\x4a\x8e\xda\xb5\xa8\xf1\x65\xdb\x57\x43\xa8\xd0\xd0\xd0\x36\xfb\x59\xa6\x4f\x64\x49\x66\xcd\x25\x73\x30\x21\x6c\xfe\x59\xba\x53\xa9\x2f\xed\x92\x91\xfb\xe1\x85\xbf\xbb\x12\xd3\xfe\x54\x59\x6a\xfe\x83\x3b\x93\x0f\x6e\x7d\xca\x1a\x8b\xa7\x4b\xde\xc7\xcd\xed\x25\x0b\x0e\xd8\x39\x24\xf7\x49\x69\x7b\xab\x24\xa6\x50\x60\x3a\x3a\x9f\xe4\xdd\xce\x5b\x1c\xbe\xbc\x29\x25\x8e\xcd\xb6\x86\x9c\xd8\x86\x62\x8c\xa1\x31\x5d\x5d\xf9\x70\xc0\x7d\x53\x56\x6a\x15\x83\xb6\xb1\x1b\xd9\x54\xcd\x62\x71\x57\xc8\xbd\x8a\xbd\x16\x26\xa0\x60\xaa\xd0\x56\x9d\xab\x50\xe7\x69\x48\x31\xc3\xf6\x44\x97\xf5\xac\x49\x8c\x18\x8f\xd7\x98\xe1\x8a\xfc\xb8\xc6\x98\x1f\x2f\x03\xe7\x1c\x1d\x5c\x5c\x9d\xe7\x37\xaf\x71\x45\xba\xf6\x2d\xf0\x35\x74\x14\x01\x4d\x50\x8b\x10\x58\xfd\x76\x15\x76\x35\xb2\x04\x9d\x97\x9d\xd5\x80\x61\x83\xd0\xb6\xf2\xc7\x2c\x84\xa4\x4e\x79\xde\x20\xac\x29\xa1\x94\x62\x0c\x63\xe5\x18\x21\x42\x6e\xb7\x89\x2d\x74\x1b\xc9\xa8\x39\xcf\xfd\x4e\xc5\x5e\x25\x8c\x60\x7a\x6e\x78\x36\xd5\xab\x7f\x3f\x79\x22\xff\x32\xe3\x9f\x75\xbe\xcf\x9f\xbe\x5e\x4e\xdd\x2a\x2f\x32\xfe\x49\x4a\xe4\x96\x40\x6d\x72\x27\x52\xed\xe6\xf2\xe5\x97\xc4\xe0\x87\xf7\xe9\xe0\x12\x7f\x6f\x5a\x2f\x68\x2e\x5d\x69\xa5\x08\x43\xb9\xe9\x64\xdb\xf3\x78\x90\xfb\xb6\x20\x9e\x4b\xce\x20\xe7\xb0\xfe\xb4\xd5\x98\x6b\x5e\x60\xe7\xc6\xb5\x2b\x25\x17\xa6\xd9\x36\xb2\xed\x55\xdc\x4b\x90\xb5\x3b\x4d\x84\x16\x33\xed\x23\x8e\x26\xf1\x0c\x55\xeb\x1c\xf5\x9c\x11\xae\x24\x2b\x4b\x2e\x8d\x16\x86\x1b\xb6\xea\x8f\x3a\x55\x7c\x21\x29\x28\xf2\x8a\x2a\x34\x12\xc0\x38\xc3\x44\x71\x22\x94\xb6\xcc\x73\xc3\xd6\x01\xf9\xa4\x77\xb8\x4c\xbe\x83\x99\x99\x1b\xaf\xec\x1f\x67\x7f\x7c\x55\x16\x7d\x45\x8a\x7c\xe6\xd7\x3e\x5d\x3b\x5f\x7f\x18\xf1\xbd\xbc\xc3\xf3\x0a\x0d\x78\x42\xe0\xf6\xa3\x2a\xb2\x31\x6b\xc6\x32\x3f\x8c\xb6\x89\x03\xa0\x1e\xf0\xd1\xf8\x73\x04\x90\x87\xbc\xfc\x24\xaf\x3f\x1d\xcb\xf3\x2f\x80\x3d\xe0\x33\x33\xee\x15\xe7\x56\x58\x66\x9b\xc6\x32\x2b\x2c\xe7\x0a\x50\x21\x44\xdc\x0a\x21\xc6\xbd\x10\x89\x53\xa9\x4c\x3d\x66\x13\x27\xf2\x14\xb1\xfc\x7e\xf6\x47\xd9\x9f\x64\xff\xf2\x92\xa1\xf9\x4c\x8f\xe8\xc3\xf3\xdd\xc3\xfc\x7e\xe2\x15\xb8\x20\xf4\x1e\xee\x1f\x5e\xe4\x90\x7f\x8c\x1c\x71\x22\xd5\x98\xf5\xa0\x69\x42\x10\x5a\x09\x28\x15\xaa\xa3\x3c\xae\x5b\xd7\x14\xc6\x26\xc6\xff\x2a\x67\x63\x5f\x48\x01\x03\xe4\xc7\x7d\xbe\x89\x2b\xa6\x31\xaa\x09\x41\x71\x9f\x0b\x41\x2d\xe1\x91\x1b\xc6\xad\x2a\xfc\x6e\xe7\xc7\xda\x88\xb3\x93\x49\xf3\x01\x6e\xa2\x8d\x1b\x0e\x30\x90\x79\x1d\xdd\xc1\xac\x9d\xea\x7a\xbc\xea\x3a\x17\x77\x92\x57\xbe\xa6\x20\x23\x36\x90\xc6\x22\xd4\x19\x36\xd5\x1d\x40\x56\xf0\x65\x79\xd1\xde\xfb\x79\xf6\x2a\x47\x9c\x56\xb4\x2f\x7f\x5a\x58\xcd\x84\xe2\xd2\x35\x6d\x24\x5a\x48\x25\x94\xeb\x86\x58\x6b\x2e\x25\x57\x36\x74\xb3\x4e\x60\x08\x91\x92\x5c\x32\x81\x20\x42\x4a\x71\xc1\x24\x42\xd3\xbe\x6c\x91\xd6\x03\x35\x13\x37\x18\xbc\x7f\x7c\x89\x0b\xff\x72\xfc\xdd\x35\x2c\x04\x4f\xf7\x1f\x2f\xfa\x8d\xc5\x54\x5e\x3d\xb8\x1a\x02\x28\x2d\x67\x00\x47\x9f\x90\x75\x2c\xf6\xc0\x1d\x87\x80\x88\x1a\xc0\xf0\x5a\xec\x1a\x55\x90\x82\x18\xcc\xc2\xca\x57\xcc\xb3\x19\x47\x92\x3b\xa1\x4c\xf0\xd6\xda\xe0\x45\x3e\x50\xaa\x0f\xad\xf7\xa7\xcc\xda\xb8\x0b\x85\x1a\xa8\xd4\x5c\xf2\x63\x36\x43\x28\xee\x37\x6c\x9b\x2d\x2f\x1c\x64\x2c\xfb\x59\x1a\x27\x7f\x2f\xfb\xfd\x64\xb3\x6f\xb4\xc1\xdf\xfd\xf8\x78\xf9\x6c\x84\xcc\x6f\x40\x5d\x06\x74\x35\x0a\xb8\x06\xf6\x88\x67\x15\x58\x37\xde\x0b\xad\x15\xd4\x1a\xd5\x11\x1f\x45\x01\x8f\xdb\x19\x75\x28\x20\x73\x64\xe7\x0f\x45\xdd\x44\x14\x42\xaa\x37\xb6\x94\x42\xce\x1d\x5f\xaf\x13\x93\x66\xdd\x40\x44\x72\x5f\x9b\xba\x1b\xd0\xaa\x13\x46\x46\x46\x13\xfb\xb2\x3d\xcf\xd3\xc3\x89\x2d\xf6\x33\x9f\x55\xd9\xb7\x17\x44\x20\xc9\xfe\x49\x96\xbd\xf9\xf6\xe3\xdb\xc5\xfc\xee\xdd\xd5\x35\x7a\x0f\x1e\x9f\x6f\x48\x3a\x92\x0e\xf9\x87\x1b\x1c\xda\x75\x92\x26\x3a\xef\x03\x10\x7b\xb5\x8f\x6b\x20\x88\xd2\xcc\xe2\xc3\x96\x15\xeb\x4d\x91\x09\x23\x4c\x6d\x24\x86\x65\xdc\x95\xa7\x4c\x6d\xf3\xd2\x7f\x6a\xbc\x4f\x3c\x3b\x1a\xec\x3f\x35\xd7\x9f\x62\x35\x83\x88\x69\x06\xe3\x41\x2a\xec\x7b\x62\x38\x61\xc0\xd8\xe8\x9b\xda\xd5\xe4\xbc\x64\x69\x17\xd7\x23\xa3\x34\xef\xcf\xcf\xc6\x46\x6f\x8c\x39\xc7\x00\x59\x97\xfa\x52\x1f\x5e\x3a\xe9\x6f\xea\x74\x5f\xd6\x8e\xf3\xcd\xd8\x15\x68\x5c\xe5\xa4\x39\x47\xbb\x05\x3a\x62\xdf\x80\x0e\xa8\xba\x76\x9d\xf6\x98\x8c\xfb\xd1\xa0\x75\x4e\xbd\x75\x5a\x3b\xeb\x9d\x80\xb8\xae\x84\x6b\x04\x23\x0c\x59\x95\x5d\xb4\x35\xd9\xcc\xcf\x26\xbc\xee\xdd\xc4\x7a\x76\xa3\x59\x79\xf9\xdb\xb7\xcf\x37\x6f\x30\x04\xcd\x31\x03\x6d\x0d\xe3\xb6\x10\xc7\x76\xda\x52\xce\x3a\x87\xe3\x76\x26\x29\x77\x0e\xe3\xd8\x5a\x65\x54\x24\x8c\x81\x55\x3c\xb8\x6c\x9e\x99\x93\x49\x7d\x9e\x53\x96\xfd\xf7\x26\xc4\xc3\x94\x94\xba\xf6\xcd\x7d\x9c\xb2\xec\x3f\x07\xb7\x35\xe0\xae\x29\xf3\xfd\x98\x95\x39\x07\xd5\x61\x07\xea\x3c\xab\xc6\x3a\xdf\xe7\xec\x48\x8a\xd5\xeb\x36\xdb\xb5\x4e\x1e\x5b\xe7\x0a\x21\x5d\x24\x42\xac\x45\xdc\x88\xb8\x96\xe7\xeb\x6c\x93\x4d\x87\xd9\x37\xd9\xef\x67\x7f\x9c\xfd\x49\xf2\xda\x52\xe1\xfb\xf9\x82\x30\x78\x89\x8f\xdf\xfd\xf8\x6e\xf0\xf8\xe5\xae\xf9\x39\x82\xfe\x89\x6f\xcf\xec\xd0\x48\x3a\xb6\x45\xc5\xb4\x55\xc2\x86\x76\xcd\x83\xd6\xf6\xd8\x0f\xad\xa4\x63\x53\xd4\x4c\x5b\x2d\x5c\xd3\x6c\xd2\xfe\x22\x90\xa2\x92\xce\xb6\x7c\xdd\xf8\x96\x3b\x6d\x40\x69\x78\x34\xec\xd3\xf0\x13\xbf\x60\x08\xa1\xdc\x29\x2f\x09\xb1\x9c\x0a\xec\x21\x42\x48\xff\xd8\xce\x58\x3b\xdd\x49\x0c\x03\x96\x14\xf9\x1a\x49\x48\x95\xa4\x98\x52\xee\xb4\x17\xd7\x6f\xd6\x18\xa1\xa4\xc3\x79\x8e\x41\x48\xf2\x59\x7e\xf5\xc3\x4a\xf1\xbb\xa7\xbb\x8b\xc5\x7a\xc9\xf4\x27\x16\xfa\x77\xcf\x0f\x6b\xe0\x1a\x10\xa2\x02\x9b\x4f\x6b\xd0\x47\x33\x6b\xc2\x6a\xc5\x9a\x36\x7c\x52\xc0\x4e\x47\x56\x75\xac\xc7\x0e\x82\x4d\xb4\xc5\x4a\x6b\xdf\x3a\xd7\x6e\xa2\x96\xbe\x71\x7c\x34\x79\xe5\x9c\x6b\xb0\x65\xd8\xa3\xee\xca\xc5\x17\x12\x1f\xc8\xef\xbd\xf2\x2c\x5e\xfb\xd7\x40\xc2\x0a\xbc\xf2\xce\xcc\x74\x48\xd2\xbd\x64\x5c\xa5\x52\xd3\xb1\xce\xb5\xf7\xa3\xcd\x6d\x62\x9c\xf1\xb3\xba\xf5\xc1\x77\x3e\x6e\x66\x30\x7c\xa2\x00\xfb\x2e\xd1\xb7\x67\x8b\xc4\x7d\xd5\xcd\x9a\x0c\x25\xdc\xd4\xd4\x21\x31\x75\x6a\x5d\x02\xee\xef\xde\xbf\x76\xeb\x26\x06\x89\x09\x24\x3d\x65\x22\xe7\x17\x29\xda\x87\x45\xf1\xc5\x82\xdf\xe6\x18\xc1\x00\x8b\x36\xd2\x35\x90\xc6\xaa\x71\xab\xd6\xa0\x92\x65\x53\x85\xe8\xe3\xca\x47\xdd\x48\xc5\x00\xef\x22\x03\x49\x1c\xc7\x79\x1d\xad\x1a\x80\x8f\x3a\x87\xc0\x1e\xe5\xf5\xa7\x19\x22\x94\x50\x6f\xb5\x27\x64\xdc\x72\x58\xd3\x16\x6f\x14\x63\x96\x9d\xff\x86\x17\x6d\x6f\x8c\x90\x36\xae\x5e\x24\xb7\xb3\x3c\x83\xa9\x77\xa6\xcc\xbe\x99\xd8\xc5\x1e\xef\x12\xa6\xee\xd5\xaa\x24\x70\xc3\xf4\xe1\xf1\x2b\xb0\xfc\xae\x78\xf9\x4a\x1e\x7c\xb7\x56\x87\x55\xdc\x02\x96\x24\x7b\x1a\xa3\x04\x40\xe9\xc3\xc1\x80\x4c\xaf\xec\xcb\x17\xba\x31\xe4\x3a\x0e\xad\x5d\x03\xeb\x37\x1b\x4f\x82\xf7\x1e\xec\x37\x1b\x1f\xd7\x71\xe7\x0e\x00\x8e\x32\xd7\x71\xd5\x9d\xbf\x90\x4d\x1a\xab\x2c\x71\xc5\x4d\x9c\x1d\x6f\xa7\xbc\xff\x6c\xfe\x1e\xce\x6f\xd2\x51\xd3\xeb\xdb\x87\xfb\xc5\xfc\x4b\x4c\xf1\xa4\xbb\xb5\xe8\xf9\xd8\x1c\x03\xce\x37\xb9\x0e\xc6\x3a\x3f\xee\x19\x6e\x10\x8b\x8e\x93\x86\xb0\x7a\x4e\x77\x71\x97\x6f\x8e\x7b\xa5\x9d\xa9\x95\x93\xc7\xbe\x60\xbb\xfe\xd3\x61\x66\x1d\xa9\x9c\x14\x5e\x18\xc1\xb8\x64\x8a\x63\xae\xa8\x14\xeb\xa0\xa4\x5f\x53\x86\x3c\xae\x7b\x4f\x39\x3b\xdf\xc3\x70\x52\x4b\x95\x7a\x7c\xff\xcb\x34\x3a\xdc\xa4\xf6\x52\xff\x96\x16\xe5\x68\xaa\x3c\x4c\x6d\xc0\xf0\xb7\xb8\xa8\x46\x55\x18\xef\x5d\xe3\x5c\x13\x91\xb5\xe9\x87\x89\xa7\x9f\x2c\xd5\x8c\xbf\x6a\x8f\x7c\x66\xf1\x67\x57\x8b\xff\x66\xfa\x1b\x55\xae\xbb\xc4\x85\x43\x8e\x28\x74\xc0\x83\x56\xa8\x00\xaa\xa1\x25\x74\xec\x47\x83\x0f\xc3\x38\x14\xd9\xe8\x0b\xb5\xdb\x85\x75\xd8\xf9\x9a\x08\xc6\xfa\x1d\x67\x4c\x40\xef\x40\x16\xd6\x19\xc8\xd8\x89\x2e\x79\x71\x48\x23\xe3\x2f\xe1\xc7\x78\x9c\x38\x8a\x6e\x58\x32\xf0\xbc\x89\xeb\x53\x56\x55\xb9\x97\xde\x29\x1a\x89\xb0\xce\x42\xe7\x10\xac\xe3\x7a\xdc\x6b\xb0\x03\xd9\xc8\x0b\x6c\xac\x52\x72\xb3\xfa\xd4\x16\x07\xdf\x8a\xb2\xf2\x21\x70\xa5\xa3\xd0\x12\x05\x08\x09\xb0\x31\xac\xdd\xb0\x0f\x14\x69\x84\x89\x48\x5c\x2e\x7a\xd9\x16\x9b\x5b\xae\xc3\x69\x59\xf8\x8c\xeb\x90\x03\x71\x18\x00\x6f\x5e\x97\x9e\x63\x5b\x6c\x8e\x38\x84\x62\x1d\xbb\x3e\x96\x5d\xac\xa6\xbe\x4b\x73\xd2\x4b\x37\x2b\x5f\x75\x98\xef\x3f\x53\x4f\xbb\x64\xa2\x57\x82\xe5\xbb\x31\xcb\x9b\x51\x16\xe4\xb0\x2f\xc8\x28\xf3\x66\xcc\xf2\x1d\xc2\xb3\x92\x2b\x7f\xb8\xc8\x07\xf8\x83\xc7\x53\x9f\xbb\x4e\xb9\xc5\xfd\xc4\xdd\xbc\xf8\x9c\xd4\xfc\x9b\x0b\x5e\xf1\xee\xea\x51\x7f\xbb\x50\x52\x69\x01\x84\x88\x5a\xf6\x2b\xab\x09\xf5\xad\x69\x10\x6e\xb7\x2c\x36\x3b\x3b\x14\x65\xb1\xf7\x75\x35\x0e\xa7\xac\x05\x28\x6f\xeb\x6a\x84\x84\x48\x41\x77\x71\xcf\x94\x92\x9c\x15\xb4\x3a\xc4\x10\x57\x0e\x64\xa0\x06\xae\xca\xb2\x59\xb6\x3e\xd1\xc5\xb6\xd8\x65\xf3\xb4\x9a\xfe\xf2\xca\x92\xf5\x45\x3c\x96\x10\x74\x2f\x04\x6d\x79\xd6\x18\x6d\xfc\xac\x0d\x32\xb4\x1e\xb5\x0d\x25\x11\x35\xcd\x51\x82\x9e\x31\xa5\x3a\x1d\x37\xc5\x8e\x4b\xab\x38\x3d\x1a\x23\xeb\xf6\xec\x7d\xad\x47\x0d\x36\xe3\x40\x85\xf4\x5e\xe5\x17\xae\x25\xbe\x54\x85\x48\xb5\x87\x89\xd9\xea\xf1\x85\xb1\xf4\xed\xf2\xdb\x77\x7e\xb1\x39\xee\x9a\xb8\x8b\x4c\x83\x03\x28\x47\x38\x0b\x00\x1f\x54\x3c\x9c\xfd\x85\x70\xf4\xf9\x26\x6e\x07\xb7\x06\x70\x67\x82\x6d\x27\x6e\x86\xe6\xc4\x16\xae\x18\x12\xa7\xe3\xb5\xbe\x3f\x31\x08\x4d\x39\xb6\xf3\xd5\xe5\x35\xe5\x16\xb0\x55\x40\xb8\xc0\x6d\xdc\x44\x37\x76\x7c\x56\x81\x6a\x84\x15\xb5\x5a\x6b\xd0\x12\x6c\xd7\x00\x73\x4a\x7d\xdc\x74\x5b\xd9\x3b\xb0\xa9\x89\x90\xd6\x4c\xda\xa6\x6c\x69\xe7\x2c\xd9\x9d\xbf\x33\xe9\xe9\x5d\x45\x8d\xc1\x17\xfc\xe6\x05\x52\x5d\xdc\x71\x50\xe5\x7c\xbf\xd6\xab\xdd\xd1\x2d\x92\x56\xd3\x71\xdb\x24\x5d\x4e\x3a\x67\xba\x11\x4e\x18\x69\xac\x13\x71\x1f\xe2\x2a\xc4\xb3\xb9\x98\xb4\xcd\x7e\xa7\x60\x67\xbf\x7a\x21\x13\x9e\xf1\x77\x5e\xaa\x46\xe7\x68\xf2\x9f\x66\x7f\x3a\xc5\x92\xd7\x51\x5d\xbc\xf0\x07\x27\x96\xae\x74\x06\x6f\x9f\xee\x1f\xdf\x3d\xdd\x3f\x26\x3f\xfb\x12\x91\xbd\xb4\xbb\x5f\xaa\xfa\xef\x3f\x3e\x2c\x96\x1f\x8a\x50\x84\xe3\xa5\x98\x68\x47\xdb\x15\xdb\x28\xc0\xda\xc6\xce\xc7\xde\x82\x55\x14\x7e\xbb\x05\xdb\xed\x76\xec\xce\x51\x64\xce\xcf\xaf\xe3\xaa\x70\x47\xa3\x66\x74\x6d\xb8\x85\x30\x86\xa8\xa0\xe6\x71\x57\x40\x4e\xe3\x40\xe9\x76\x21\x23\x02\x90\xc7\x03\x3f\x65\x9a\xc5\xd5\x2a\xb6\x40\xac\x00\x61\x07\x21\x04\x17\x42\x30\xc5\x8c\xd2\x0c\x43\x5c\x6b\xaa\x14\x45\x92\x54\x93\x3f\x99\xeb\x19\x5d\xb8\xdb\x2a\xe9\x9b\xa7\xfb\xa7\xd7\x7a\xe8\xf3\x97\xb5\xd2\x04\xc4\xba\x62\x03\xe6\x97\xf7\xad\xeb\xa2\x01\x2e\xa9\xac\x7b\xa0\x43\xea\x3a\xc2\x71\x7d\x5e\x0f\x3b\x77\x3c\xf8\xb6\x05\xb4\x8d\x75\x7a\x2b\xa8\xb0\x0a\x81\x80\xb5\x10\x1a\x47\x85\x94\x15\xeb\xdc\x10\x42\x06\x92\x4a\x2d\xd9\x2c\x13\x60\x3b\x63\x17\x0c\xdc\xdf\x9d\xd4\xfb\x7e\x02\x03\x57\x3c\xde\x3f\x3d\x3c\x3f\xde\xb7\xc0\xa6\xae\x68\x40\x8f\x5b\xc0\xa2\x5d\x55\x41\x87\xa2\xf2\x5d\x17\x87\x61\x51\x4b\x69\x12\x49\xa4\xec\xb4\x56\xdb\x5d\xb4\xa0\x6a\x9a\x26\xf9\x13\x36\xdf\x2c\xf9\x42\xa4\x2e\xec\xb7\x2f\x0a\xa8\xb7\xda\x80\x89\xc9\xb0\xca\xa7\x0c\xca\xf4\x7e\x5b\x9b\x2f\xfa\x10\xb5\x5f\xa0\x10\x75\x18\x7b\x3f\xc4\xbd\x3c\xb4\x85\xf6\xab\x78\x10\xfb\x76\x14\xc6\x28\xe5\x8b\xad\xb1\x5a\xf9\x85\x18\x3b\x30\x44\x9a\xf3\xeb\xfb\x3e\x6e\xe3\x4e\x18\xb6\xdb\x5d\x7f\x30\x5c\x2b\xad\x59\x7a\xcd\x66\xb9\x39\xd1\x39\x5c\x98\x8b\xcf\x8f\x2f\x31\xeb\xdd\xc3\xdd\xd3\x87\xe2\x5a\xb5\xbe\xa4\x32\x6f\x74\x51\x1f\x27\x28\xf0\x63\x2a\xb9\xb5\xbe\x82\xa0\x1c\x87\x06\xe2\x6b\x40\x3a\xc0\x6a\x1d\x3b\x40\xb9\xc6\xbc\x56\xb8\xae\xfa\x6a\xa5\x95\x50\xdb\xaa\x5a\x18\xc8\xe9\xe8\x73\x2d\x62\x9b\x20\x0e\x1b\xca\x9d\x8f\x3a\xd4\xb6\xa2\xdb\xb8\xef\x2c\x03\x19\x28\x1d\x39\xdb\xd7\xc5\xac\xca\xd4\xd2\xbd\xf4\xe7\x4c\x73\xe7\x45\x95\xeb\xfa\xbc\x3e\x5e\x46\xca\x9b\x89\x76\xe3\x25\x57\x36\x13\x80\x78\x80\xe2\x06\xa8\xa3\x03\x36\xae\xce\x43\x85\x04\x33\xae\x73\x31\xd6\x3e\x01\x31\x56\x91\x2c\x2a\xa5\x62\x9b\xa0\x2d\x4a\xa9\x71\x1b\x3b\x1d\xbb\xa2\xda\xea\x71\xad\xb3\xac\xc8\xfb\xd3\x76\xd6\xa7\x73\x48\x5c\xb9\x20\xe1\xd2\xaf\xdd\x8a\xcf\x4f\x20\x4d\xd4\x37\x4f\x77\x8f\x85\x09\x6d\xdb\x44\xd8\x0e\x03\xc0\xe7\x95\xa2\x6d\x17\x26\xee\xfc\xc1\xfb\x83\x1f\xc9\xd8\x88\xbc\x8f\x08\xf0\x6c\x91\xfb\x13\x59\xfa\xc4\x67\x71\x8b\x21\x98\xd8\x4c\xaa\x2b\x35\x54\x71\x9d\x17\x37\x1c\x0b\x5f\x22\x67\xe6\xe7\xf8\xba\x39\xf2\xce\xb7\xe0\x50\xa3\xbe\xa8\xe2\x70\xe9\xcb\xa3\xa0\x4d\x3d\x7a\x83\xef\x3a\x40\xbb\x58\xa5\xb7\x85\x13\xda\x8f\x61\x3c\x44\x23\x80\x07\x9b\x7c\xc5\x59\x94\x63\x19\x9c\xf7\xde\xbb\x00\x92\x58\x63\xdd\x75\x5d\x96\xcd\xf2\xf5\xa9\x99\xb5\xf3\x7d\x36\xbf\x8c\x90\x6c\xba\xda\xf3\x08\xbe\xbf\x7b\xba\x2b\x9e\xee\x1e\x67\x6d\xec\x3d\x60\xe7\x5f\xeb\xe7\xfb\xef\x79\xb3\xe0\x91\x9f\xef\x7a\x9a\xb2\x63\x05\x68\x36\x4f\x5a\xdf\xcd\x42\x67\x7f\x3b\xfb\x65\xf6\xab\x4b\x4f\xc2\x6b\x4f\xc5\xd7\xf9\xf2\x9b\x87\xa7\x17\xd0\xec\x77\x7f\x0c\x3e\x7c\x7c\x5c\x2c\xbf\x79\x97\xfa\x2f\xe7\xcb\xe2\x06\x1a\x55\x0c\x84\xc8\xb5\xf2\x55\x0d\x70\x43\x02\x10\x3d\x76\x51\x77\x26\xc8\x46\x51\xcf\x31\x5c\x41\x8c\x73\xe9\x3d\x28\x05\xbd\x08\xf6\x8c\xbb\x19\xe1\x44\xee\x81\x86\x94\x59\x12\x2d\xb1\xa1\xb3\xd2\x4a\x23\x4a\xaf\x0c\x63\x56\x47\x57\xf0\xb8\xd9\xeb\x58\x8e\xdc\x98\xbc\x4b\xca\x75\xcb\xbc\x3f\xaf\x13\x0b\x73\xe9\x35\x7f\xce\xfe\xeb\xec\xdf\x67\xff\x71\x8a\x40\xa6\x4e\xbe\xbb\x87\x1f\xa7\x05\xf9\xf8\x36\x95\x01\x92\xb5\xbe\xbf\x36\x5a\x7e\xd9\xcf\xf3\xfe\xfe\x5a\xb2\xba\x7b\xbc\x03\xdf\xbd\xff\xf8\xf8\x76\xb1\x4c\xfd\xe7\x28\x00\x12\x40\x1d\x22\xc2\x08\x34\x91\xbd\x00\xe8\x86\x4f\x7b\x08\x65\x27\x1c\xdc\xd5\x88\xc5\x0a\xec\x93\x61\x4c\x5b\xe1\x85\x44\xa4\xe6\x10\x9f\x32\xab\x04\x8d\x25\x84\xdc\xf2\xad\xcf\xf7\x94\x91\x03\xc3\x04\xed\xf7\x0b\xee\xba\xce\xc5\x03\xa1\x46\x28\xa1\xb8\x06\x06\x41\xd5\x6c\x21\x85\x08\xef\xc5\x20\x44\xcf\x79\x1b\x2b\x2e\xce\x33\x12\x08\xa1\x24\xdd\x0c\x75\x25\x85\x1a\x77\xb9\x8f\x1b\x82\x38\x66\xa4\x13\xe7\xb5\x2d\x6f\xd3\x73\x65\xd9\xcf\x12\x9a\x78\xea\xc9\xff\x83\x8c\xa4\x0c\xe3\x9f\xdd\xb2\x94\xbe\xfd\x2f\x18\xcb\xe0\xed\x17\x2e\xff\x75\x41\xfe\xdc\x3c\x2f\xdd\x91\x78\xe7\xf6\x45\x1d\xfb\x94\x0e\xf5\x47\x09\x6c\x62\x6e\x18\x5c\xdf\x03\x36\x8c\x87\xe9\xcd\x1b\x69\x69\x51\x32\xac\x11\x8d\x01\x43\x5b\x63\x20\x29\xb6\x90\x46\x02\x64\xea\xbd\x05\xed\x31\x03\xab\xd8\x2c\x98\x1b\xe5\xb8\x8e\x9c\x83\x2e\xcf\x8a\x72\x1d\x31\x33\xd4\x18\x6a\x18\xa8\x39\xe7\xa7\x8c\x73\x3e\xf6\x64\x4d\xb4\x14\x8a\x2a\x81\xb9\x44\x92\x23\x2e\x89\xe2\xa7\x4c\x08\xa3\x6d\x02\x32\x2d\x33\x71\xa2\xcb\x7e\x76\xb8\x68\x08\xbe\xcb\x78\xf6\xdf\x66\x7f\x9e\xe5\xbf\xc6\xe0\x8a\x23\xfb\x66\xbe\xfc\xf6\xfd\x2b\xa9\xc5\x04\x27\xbb\xbf\x6c\xe0\x0f\xfe\xf8\x1c\x02\x7d\xfb\x02\xdd\x5d\x2c\x6f\x43\x9e\xd9\xc3\xfb\x6f\xaf\x95\xbf\x44\x80\x7a\x95\xca\x56\x73\x3c\x42\x04\x67\x65\xd4\x3d\xa8\x45\xb4\xbb\x71\x7f\x88\x2b\x39\xac\x62\x93\xd7\x18\x45\xe3\x67\xd5\xa7\xfd\x75\x03\x03\xe3\x56\xc7\x73\xd8\x16\x76\x75\xad\x5b\x69\x11\x59\x0d\xc2\x32\x52\x33\x4e\xe3\x21\x1e\x6a\x90\x0d\xbb\xaa\x37\x9a\x32\xb0\x02\xd9\x5a\xae\xf7\xa3\x63\xc3\x9e\x6e\x66\x87\x71\x40\xb5\xe1\xa8\x51\xdd\xa0\x1c\xd6\x06\x42\xe0\xd9\x96\xae\x49\x44\x35\xe5\x0d\xa9\x70\x5d\x51\x65\x18\x26\xb0\x32\x53\x9e\x96\x57\x06\xb1\x8a\x63\x06\x11\x8c\x2b\x2a\xb4\x64\x5c\x0a\xe2\x60\x06\x72\x77\x62\x33\xba\x30\xd9\x5f\xbb\xed\x8d\xfb\xaa\x68\x1a\x44\x03\x82\xba\x5f\x18\x38\xb4\xdf\x8b\x99\x24\xc4\x80\xc4\x31\xb7\x98\x89\x4c\xa4\xbe\x95\xbf\xfa\xda\x70\xff\xf0\x3c\xb3\x80\xb8\x34\x71\xf8\x71\x05\xe4\xb4\x36\xe0\x20\x63\x95\x57\xa3\xf4\x40\xc6\x06\xd8\xf3\xd2\x1e\x87\xf3\xca\xa0\xb4\xd6\xe3\x3e\x06\x19\x6d\xc1\x76\x3a\x92\xc4\x4f\x3b\x2f\xaa\x93\x5e\x36\x0b\x9e\xfd\x2c\xfb\x36\xfb\xe3\xec\xcf\xb3\xff\xf3\x96\xaf\x14\x24\x69\xff\xe5\x6b\x65\xf6\xb5\xce\x35\xff\xe9\x43\x13\x9e\x7d\xb1\xbc\x79\xfe\xb7\xbf\xf7\x97\x1c\x2c\x2a\x5f\x6c\x8f\xb0\xd8\x7e\xf2\x05\xc5\x98\x19\xe7\x43\x55\x69\x02\x4d\xe5\x7b\xa8\xa4\x10\xb5\xa4\x1a\x8e\xab\xf3\x31\xef\xae\xc7\x42\xf7\x72\x0c\x83\x9e\x20\x04\x8d\x0d\xe7\x83\x14\x9a\xb2\xf2\x1d\x52\x52\x70\x28\xa9\x41\xe3\xea\x7a\xb4\xac\x35\xad\xf5\x67\x47\xc9\x82\x8f\x95\x1b\x6b\x3b\xdf\x94\x95\x41\xa7\xcc\x41\x04\xa1\x76\x88\xa3\x5a\x0b\x07\x2b\xad\x3a\x68\xd4\xf9\x58\x3c\xd8\x1f\x39\x16\x8e\xb8\xac\x08\x45\xfb\x00\x21\x3a\x1f\x44\xe8\xf5\x28\x32\x32\x1d\x3c\xf8\x1f\x3b\x18\xce\x6b\x95\x01\x72\xd9\x2e\x5c\xf6\x4d\xf6\x77\xb3\xa7\xec\x1f\xbd\xf2\xf9\x3d\xbd\xa6\x86\x92\x98\xf5\xd3\x79\x75\x79\x91\xba\xbe\x49\xd5\x2d\xdf\x7f\xf5\xe6\xc3\xc7\xc7\xe5\xd7\xdf\x14\x8d\xa9\x6a\x50\x13\xe6\x62\x06\xcc\xd9\xef\x8c\xae\xaa\xf5\x0a\x06\x46\x7a\x92\x73\x0b\x81\x62\x50\x71\x27\xb5\x90\x5e\x36\x92\x11\xa8\xcc\x86\xd6\x43\x49\x17\x0e\x52\x6a\x8c\x3a\x1e\xec\xda\x75\xb0\x16\x20\x6b\xa4\x71\x20\xa0\xe0\x63\xb7\x0f\xc6\xa8\x10\xa4\x51\xad\xeb\x28\x07\x65\xe4\xed\x1e\xd6\x87\xa9\x1f\xb9\x3b\xd1\x39\x79\xf1\xc7\x7e\xfd\xd3\xfe\xd8\xd7\xcb\x2f\x1d\xb2\x3f\x02\x6f\x26\x87\x6c\x08\x15\x04\xd9\xb8\xf1\x10\x4e\xac\xee\xf1\x30\xd4\xd5\x10\x57\x25\x20\x5c\x61\x0e\x35\xae\xaa\xb6\xee\xb5\xe4\xa5\x5a\x97\x3f\xee\x92\x71\x3a\xf9\x64\x7c\x9d\x7c\xb2\x03\xa8\x26\x97\x2c\x2b\xb3\x21\xf1\x40\x6f\x92\x46\x3a\x4b\x1c\x1b\x67\xfb\xf6\x17\x3f\xc2\xc0\x9f\x58\xf8\x3f\x83\x27\xfc\xe6\xb3\x01\xfb\x2e\xe1\x94\xee\x1e\xef\x3f\x6b\xce\x78\x7e\xfc\x78\xa5\x67\xb9\xa9\x30\xbd\x4b\xac\x2b\x4b\x66\xb4\x72\xb0\x13\x7c\xf4\x6e\x6c\x03\x90\x56\x5b\x3f\x68\x51\x56\x0a\xd7\xba\xec\xb7\xd0\x68\xa9\x6a\xcd\x1c\x05\x87\xde\x0e\x03\x83\x06\xd7\xa6\xea\xb7\xb5\x96\xbd\xe2\x7c\xcd\x47\x4e\xa0\x82\x34\x6e\x75\xc5\x14\x05\x25\x36\x70\xb6\xf9\x84\xa4\x80\x1e\xb2\x19\xfe\xc4\x67\xdd\xf7\x87\xb9\x8f\xa8\xea\xf1\x29\x5b\x43\x78\x1e\xf3\x0e\x41\x48\xa1\xd2\xbe\x2a\xb5\x5d\xa1\x0e\x86\x10\xc9\x50\xc9\x3a\x04\x88\x31\x86\xae\xac\x36\x7a\xbb\xdd\x46\xa8\x3d\xf4\xba\x82\xab\x06\x77\x4d\xe8\xca\xce\x9f\x63\x21\x93\x6f\x67\xe8\x33\x7c\xd7\xff\xab\x58\x68\x63\xfb\xa8\x40\xf8\x3c\x16\x3a\x1b\x31\x1b\x6d\x6f\xc6\x2c\xc5\x42\x5d\xac\xd2\x5b\xd1\x70\x2d\x11\xb0\x50\x51\xaa\x60\xb4\x48\x6a\x3e\xe4\x02\x63\x7c\x8d\x85\x7e\x37\x53\xf9\x26\xf1\xc1\x4c\xf9\xb7\x87\x54\x1d\x3c\xc7\xa5\xff\x2e\x13\xd9\x7f\xc8\xfe\xd3\x4b\x2e\xe1\xf6\x41\x3c\xbd\x76\x21\x3e\xc0\xef\x9e\x6f\x51\x23\x97\xc8\xe5\xe9\x96\x29\xe6\x79\xfa\xf8\xfc\x9b\x97\xcf\xb7\xff\x58\x7a\x2d\xda\xc6\x48\xeb\xf3\x9d\xf7\xca\xb4\x9f\xd6\x46\x5b\xe5\x00\xf4\xac\x3d\xf0\xd2\x57\x36\x76\xa7\xcc\x9e\xed\x13\x91\xc5\x4a\x31\x4d\x55\x24\x14\x6b\x4c\xc1\x60\xb9\x42\xa5\x2d\xf9\xe0\xd8\xb1\xb3\xdc\x97\xb6\xa4\x6b\xc7\xe6\x5a\x51\xc3\xe4\xd8\x9b\x9a\x69\x7a\x5c\xeb\x5a\x69\xb9\x30\x98\x69\x4e\x6a\x15\x94\xf7\x8c\xad\x8d\xf4\xbe\x83\x35\xd6\x38\x08\xca\x18\xe7\x94\x9f\x17\x74\x2a\xce\x8b\x3b\x96\x1c\x6d\x30\x14\xc8\x51\xc2\x36\x1d\x46\x25\xc5\x9a\x11\xb6\x51\x96\x58\x85\xa1\x33\xc4\xc8\xba\xf5\xc4\x67\x59\x51\x6c\xb2\x6c\x21\x0a\xf8\xa2\x15\x71\xbe\xaa\xf3\x1c\xb8\x59\xb8\xcf\xcf\x75\x7e\x5e\x79\x86\x9a\x5b\x9d\x57\x9c\x23\x02\x29\xc2\xd3\x0c\x05\x25\x28\xbd\x61\xc3\x06\xd0\x31\x08\x71\xbe\x24\x0c\x82\x52\x52\xa6\x9e\xf9\xf5\x89\xcd\xd5\xc2\xa6\x7f\x1f\xa5\x0a\x57\x06\x7e\x82\x3b\xe5\x07\xb0\x89\x6b\x72\x21\x3f\x48\xaf\xbd\x52\x76\x54\x4e\xee\xb5\x06\x4c\x4a\x44\xa1\x40\x24\x1e\xce\xee\xf2\x74\x22\xf3\x7e\xb5\x1a\x06\xb7\x73\x6e\xb7\xdb\x45\x78\x6c\xa6\x36\xef\x26\xfa\x59\x19\x77\x3e\x6a\x7b\x1e\xcf\x3a\xd7\x33\x98\xfa\x19\x5f\x50\xb0\x6f\xfe\x32\xe4\xf3\x17\x9e\x9e\x03\x2e\x35\xf8\x24\xf7\xcd\x44\xe7\x13\x2c\xbe\x03\x3c\x9a\xd5\x30\x00\x3e\x8c\xfb\xf4\xb6\x20\x9c\x5b\x16\x21\xb3\x42\x58\x06\xb6\x2c\xb9\x61\xf1\x5a\xdb\x9e\xe7\xab\x13\x5d\x0e\x8b\x90\x72\xf5\xf4\xc2\x65\x74\xbd\x27\x0f\xf9\x45\x9c\x60\x12\xa4\xfd\xe6\x42\x1d\x5a\x24\x23\x93\x17\x8f\x77\x1f\x2f\x3a\xf2\xe7\x13\x7d\x04\x1f\xef\x2e\xfc\x2e\x60\x82\x3e\x4d\xe1\x37\xdc\x35\xbb\x1d\x20\x65\x00\x3c\xf6\x65\x8d\x91\xa3\x1a\xc3\xb2\x74\x48\x73\x21\x0d\x73\x92\x56\x5b\x5b\xc7\x21\xda\xda\x9a\x1d\xc0\x3b\x00\x19\xcb\x07\x4e\x2c\xe6\x71\x63\x10\x34\x38\x56\x67\x0b\x44\xe6\xfd\x30\xb8\x0d\xc8\x00\x1d\x07\x1f\x7b\xdb\x6d\x71\xb4\x87\xd5\x8a\x44\x0f\x4a\x2f\x9c\xea\x41\x05\xba\xe3\x06\x3a\x41\x43\x55\x17\xca\x6f\x3e\xd1\xaa\x60\xb9\x74\x1d\x69\xc2\x58\xc3\x53\xd6\xa1\xf5\x7a\xb3\x81\xbb\x55\xb6\x2c\xf0\x89\x2c\xbb\x05\xbb\xe4\x95\xfe\x66\xf6\xf3\xec\x1f\x5e\xb1\x09\xb7\x59\xd2\x37\x4f\xd5\xb2\x9a\x5f\xe0\x62\x1f\xde\x3c\xdd\x4f\x7a\xaf\x17\xc6\x88\x6f\x6e\x26\xea\xa5\x0b\xc3\x16\xdd\x91\x87\x6b\x16\xe9\xbc\x69\x5f\x46\xa7\x0e\x74\x43\x3b\x5b\x1e\x82\x91\x32\x34\x5d\x23\x8c\x45\x92\xe3\xd2\xd5\x32\xf4\x2a\x72\x49\x2d\x91\x0b\x36\x66\x39\x4c\x2d\x53\x6b\x19\xb7\x71\x53\x45\xd8\x59\xb3\xd6\x9e\x31\x08\x70\x83\xb9\x56\x14\x11\xe9\x05\x3d\xc0\x1a\x71\x62\x19\x93\xf9\x5e\x69\x6e\x54\x56\xcc\xda\xc4\x83\x61\x2f\x56\x32\xbb\xe2\xd7\xce\x8b\xc4\xdd\xd5\x59\x9a\xa5\x6e\x9c\xbb\xa7\xe7\x17\x91\xb0\xf7\xe0\xe9\xee\xf1\xe9\xee\xe9\x6e\xb1\xd7\xdc\x55\x35\x63\x87\x83\xad\xa1\xe1\xc4\xc1\xb8\x8f\x43\x0d\xc8\x7e\xbf\xc5\x41\x79\xa9\x42\xc3\x4f\x99\x94\x7b\x35\xdf\x0c\x5b\x4a\x69\x5d\x0d\x63\x13\x0f\x15\xa5\xb8\x19\xa8\xc1\xc8\x43\x50\xe7\xb2\x85\xae\x01\x14\xc5\xad\xad\x48\x7b\xac\xd2\x40\x4d\xfc\x15\x4b\x10\x4e\x6c\xe9\xe6\x28\x69\x2f\x9f\xed\xe5\x7f\x97\xfd\x0f\xd9\xff\x74\xcb\xd7\x31\x05\x80\x8f\xef\xbe\xdc\x71\x9b\xd7\x39\xbb\xf8\xef\x7e\xc2\xc3\xbf\xe0\xa1\xbe\x3d\x3f\xa7\x3f\x02\x6f\x6e\x61\x16\x2b\x50\xa5\x99\xea\x85\x97\xad\x5c\x8f\xd5\xf5\xb3\x36\xb2\x91\xab\x79\x2d\x89\x26\x72\x34\x92\x18\x22\xf2\xda\xc7\x7d\x74\xb9\xc0\xc8\x6c\xac\xc3\xa4\x1f\x98\x94\xa2\x96\x02\x9d\xb2\xb8\x43\xeb\x55\xdb\xd5\xa0\xea\xbc\x6e\xb7\x6e\xbf\x6e\x65\xb7\x1a\x3b\xb1\xda\xb3\xf5\xac\xd7\xfa\x3c\x3d\x2b\x27\x95\x72\xf6\xf2\x21\x70\xa5\x1c\x91\x9a\x69\xc9\xd2\x6b\xdc\x90\xde\xe3\x1a\x72\xeb\x38\xc1\x75\xd5\x6a\x5e\xb9\x92\x9b\xba\xb4\x54\xd4\xa5\x11\x01\x29\x5e\xd5\x51\x70\x6d\x8c\x90\x46\x51\x97\xb4\x7b\xe6\x33\x95\xe1\xe4\xbb\xdf\xd8\x0f\xf0\x57\xb0\x1f\x67\xef\x3d\x00\x12\x57\x69\xf1\xa3\x71\x08\xc9\x78\x6c\x01\x8c\xab\xd6\x7b\x80\x42\xa4\xe9\x6d\xbe\x69\x1a\xaf\x47\x6c\xfc\x7a\xed\x4d\xbe\xd6\x51\x87\x10\x22\x6d\xdb\x36\xc5\x6a\xfc\xc4\x8a\xd5\x82\xde\x74\xb8\xfd\x2a\xd9\xd6\xbb\xa7\x2f\xc0\x2e\xcf\x4f\x9f\x95\x1e\x5e\x7b\x7f\x2e\x1a\x91\x4a\xc6\x96\x59\x46\x20\xe7\x38\x06\xed\x81\x8a\xe1\xb3\x6d\xe0\xd8\x21\x1e\x85\x93\x5a\xeb\x05\x3d\x4a\x1f\x33\x2d\xea\x06\x32\xb0\xf3\x45\x73\xca\x4c\xec\x54\xec\x55\xec\x74\x1c\x5c\x43\x5a\x8b\xd8\x29\x73\x2a\xe5\x11\x8b\x2c\xc5\xd9\x26\x71\x55\xfd\x2a\xfb\xb3\xec\xbf\xcf\xe4\x2d\x6b\xca\x0b\x69\xca\xc3\x0d\x02\x16\xdc\x94\xd0\xae\x13\xe9\xee\x73\x8a\x98\x57\xdc\xdd\xc7\x4b\x74\xf1\xfe\x76\xb8\x15\x1a\x18\x58\xf9\xaa\x06\x7d\x84\x24\x57\xa7\x4c\xb7\x7c\xdb\x9c\xb2\x70\xa0\x8d\xda\x01\x81\xea\xd8\x17\xd0\x24\xca\x94\x2d\xc3\x16\xb1\x7c\xa3\x98\xaf\x6a\xa5\x99\xa6\xa4\x66\x0c\xf6\x03\x6a\x83\x52\xb0\x53\x8e\xd9\x15\x21\x6e\x1d\x0f\x87\x35\xc5\x4d\x23\x9a\x26\x2a\xe5\xd7\xb2\x9f\x4b\x1b\xa0\x35\xde\x79\x47\x1b\x7d\x58\x7b\x27\x8d\xa7\x0c\xb4\xd4\x32\xc9\x24\x97\x5c\x8a\x63\x1d\x7a\x42\x70\x55\xc6\xad\xe4\xb5\xab\xe9\xbe\xae\x0c\xd7\x75\x65\x74\x8f\x9c\x82\x98\xe0\xb5\xab\xa1\x8e\x2d\xb5\xce\x33\x2d\x9c\xb4\x34\xe5\xa1\xf5\x89\xcd\x64\xe2\x41\x7b\x9b\xfd\xf3\xec\x5f\x65\xff\xf6\x87\x19\xdf\x0b\xff\xdd\xdd\xd4\x67\x32\xc5\x58\x7f\x13\xbc\x20\x14\x3f\xbb\x6d\x2f\x68\xc5\xc7\x5b\xf7\xf4\x4a\xb2\x03\xdc\xd1\x00\x15\x55\x31\xf8\x51\xfa\x21\xa7\x71\xaf\x95\x76\x84\x1a\x63\x56\xdb\x1e\x69\xc5\x6c\x0d\x37\xcc\x20\x04\x09\x41\xd1\xc3\x36\x68\x5d\x5b\x61\x73\x28\x85\x66\x2a\x2a\xad\x82\xb0\x8b\x52\x29\x2b\xac\x15\x71\xb3\xd7\x16\x64\x1b\x63\x58\x59\x63\x8c\x34\x37\x10\x33\xea\x5b\xce\x18\x8e\x3b\x25\xaa\x50\xb3\x1d\x56\x5c\x56\xa5\x52\x6a\xdc\xab\x20\x9c\xab\x79\x50\xf6\xa2\xcb\xa0\xf2\x6d\xd1\x2f\x42\xf6\xcb\x97\x5e\x95\xcf\x58\x0f\x5f\x69\x73\x3f\x26\xd6\x8d\x73\xa0\x91\x5a\x08\x1f\x73\xd8\xd4\x08\x10\xc1\x99\x84\x8a\x92\x16\xd7\x1a\x53\x5e\x7b\x67\x6b\xeb\xd6\x50\x00\xd7\x52\x83\x08\x5b\x04\x8c\xd0\xe8\xa5\x2a\x43\xa5\x34\xa6\x44\xf0\x8d\xe7\xc1\x7a\x40\x61\x6c\x06\x43\xce\xab\x75\x9e\x37\xa7\x30\xa7\x0b\x94\x7d\x9d\xfa\x14\x13\x3f\xd4\x67\xb8\xe5\xf7\x1f\x8a\xcb\xd2\x3d\xad\xcc\xef\xee\x1e\x0b\xdf\xe5\xe7\x35\x5f\x6a\x83\xd2\xad\x83\xfd\x1a\x29\xd6\xfb\xd5\x6a\x5b\xc7\x5d\x6c\x31\xa8\xfb\x79\xf0\x3e\xae\x7c\x45\x24\x27\xc3\x96\x28\x56\xbb\x76\x5c\x1d\x0e\x3e\xee\xa9\x55\xcc\xd3\x24\x18\x36\x07\xf6\x44\x97\x6a\x2e\xb2\xbf\x93\xfd\x3a\xfb\x8b\x4c\x65\xff\x5b\xb2\x39\x8f\xaf\x78\xbd\xcf\xfb\x4a\xc0\x4d\x80\xf5\xe6\x31\xd1\xd6\xfd\x21\x78\x04\x3f\x9e\x92\xf9\xf0\x6e\xf1\xf8\x7e\x1a\x35\x8b\xbf\x09\x26\x2d\xa2\x29\x87\x53\x5c\x07\xc9\xfc\xfd\xb7\x60\x07\xb2\xf5\xfa\x94\x81\x2c\x19\xed\xed\x16\x64\xa7\xcc\x9f\xb2\x7c\x97\x3b\x6e\xa8\x80\x92\x21\x58\x6e\xf6\x6a\x15\x80\x1c\x8c\x43\x68\xbb\xe5\x96\xe0\x9a\x52\x12\xf7\x71\x57\x29\xc0\xad\x81\x2b\xef\xeb\xdf\xc5\xdf\xfe\xee\x3f\x29\x49\xab\x84\x8d\x4d\xec\xc1\xf6\x80\x49\xb9\xed\xd5\xb0\x1e\xd7\xa2\x3d\x65\x1c\xc0\x42\x73\x2d\x8c\x10\x46\x68\x6e\x85\xc8\x61\xc4\x6d\xed\x6a\x01\x2a\x18\xf7\x9d\xf0\x1b\x38\x0a\xdf\x24\xc3\xdd\x49\x5e\x7b\x48\x7d\xe5\x6a\x5d\x0a\xee\x71\xfd\xd7\xd0\x2f\x4a\x54\x61\xca\xb7\xbc\x42\x18\xc7\x3d\x57\xd6\x08\xa1\x0c\x75\x34\x9b\x15\xe5\xa9\x99\xad\xfe\x1f\xf2\xc2\xab\xb8\xf6\x20\xf1\xd5\x35\x3f\x99\x17\x6e\x2e\x1c\x69\x3f\xbb\x58\xb6\xe4\xd7\xbe\xe2\x4a\x12\xa5\x7f\x71\x81\x52\xe6\x89\xd1\x74\x9e\xec\xed\xb4\x94\x4e\xb6\xaa\x68\xbc\x91\x92\x50\x0f\xaa\x7c\x13\x15\x04\x4e\x34\xc7\x03\x58\xeb\xb8\xc3\xcc\x69\xdc\x45\x6e\x2a\x6e\x58\x01\x39\xe5\x8c\xd5\x82\x71\xce\x17\x26\x06\xab\x9d\x12\xdf\xef\x17\x3b\x1f\x57\xee\x48\xbd\x2f\x86\x28\xa3\xa3\x39\xc9\xa5\xaf\xe3\x66\xcb\xd6\x0d\x15\x52\xd2\xb8\x61\x42\x29\xf6\xff\x59\xbf\xfd\x3c\xdf\x5e\xf2\xe7\x7f\x37\xcd\xe2\xa7\xd4\xcb\xf2\xc3\xfc\xf9\x2f\xdf\x5f\x53\x19\x1f\x3f\x7c\x7c\xbc\xe6\xcf\xbf\x79\xfb\x79\x02\xbd\x27\x44\x6d\xa6\x04\xba\xe3\x01\xc8\x1e\xbb\xb5\x57\xd6\x04\x19\x34\x0b\x8a\xac\x38\xce\x95\xf7\xde\x08\x16\xc6\x5d\x33\x89\xfd\x11\x46\xaf\xf9\x73\x1c\x1b\x69\x03\x86\xd2\xa8\x94\x41\x6f\xd6\xde\xea\xe8\x0b\x16\xd7\x46\x7f\x9e\x40\x9f\xb4\x20\xf2\x6d\xb1\x4a\x9c\x24\x5f\x7d\xc1\x47\xf2\x3c\xc1\xc8\xea\x1a\x79\x0c\x41\x35\x7a\x28\xac\xf1\x60\x15\xc9\x7c\x4b\x09\x62\x22\xf2\x3e\x88\x6e\x0b\xea\xb8\x69\x53\x5f\xe3\x50\x54\x89\x23\xa7\xca\x7e\x99\x58\xff\xae\xf7\x3a\xf9\x4a\xdf\xbe\x7b\x0f\x5e\xab\xa2\x09\x4c\x7e\x75\xb7\x6e\xf7\xcc\xf9\xce\x3b\x8c\xc7\xdd\xd8\x40\x80\x56\xce\x35\x40\x00\x13\xc0\xe0\xa4\xaf\xea\xb8\x89\x03\x6a\x8d\x13\xaa\xeb\x30\x19\xab\xeb\xce\x1e\xb6\xc6\x49\x79\xde\xb9\xe0\x4d\xcf\x29\xe1\xb5\xd6\x5b\xd4\xaa\x9a\xe8\x18\x7c\x47\x11\x62\x95\x56\x6b\xe4\x75\x8d\x19\x25\x37\x7b\x1a\x79\xde\x73\x8e\x13\xcb\x13\x5b\xb6\x45\x9b\xfa\x6c\x9e\xaf\xdc\x15\x67\x43\xf1\xe2\x09\x7e\xd6\xab\x7b\xb6\x29\xd3\x99\xdf\xae\x35\x33\xd9\x1a\xc1\x6c\xdc\xc5\x15\xd0\x2b\x69\x83\xf2\x35\xf2\x0d\x77\xc9\x52\xd0\xdd\xb6\xde\xf5\xb1\xab\x77\xde\x6b\x20\x1b\xa7\x5c\x88\xb5\x75\x3d\x0f\x79\x57\x56\x94\xf1\x83\xa9\x88\x26\x4d\x4f\x29\xae\xab\xb8\xba\xa0\x68\xab\xba\x61\x0a\x6a\xd9\x20\x1b\x33\xe5\x6d\xa3\x39\xed\xb4\x9d\xb4\x8a\x55\x11\x92\xbf\xf6\x4d\xf6\xdd\xcd\xea\x79\x43\xb0\xfb\xed\xc7\x87\x8b\x0c\xc9\x8b\x78\x42\xaa\x9a\x8a\xd8\xae\x83\xb4\x2e\x34\x2b\x01\xb2\x26\x36\xc5\x26\x10\xd7\x8b\xda\x23\x7f\xca\x36\x36\x51\x11\xd6\x52\x38\xc9\xf6\xfb\x96\x59\xd3\x02\x38\x1e\x50\x45\x0d\xe9\x95\x90\x59\x96\x17\x5d\xc1\x97\x2e\x71\x2e\x24\xc6\xfe\x2f\xe0\x75\x8f\x4f\xdf\xbc\xfd\xf0\xb1\x58\x17\x54\x37\xed\x96\x1f\x56\xed\x8e\xf4\xde\x53\xb1\x67\xc6\xf1\x05\xf3\x83\xe5\x34\x30\x27\x89\x43\x2c\x34\x4e\x2a\x7b\xb6\xbf\x85\x2d\xd4\xc2\x24\xb5\xd8\xa7\xfb\xc4\x35\xf5\x7c\x0e\x16\xd3\xeb\x5d\xca\xcc\xb4\xd6\x7b\xeb\xe3\x3e\xb8\x11\xb9\x26\xee\x17\xa8\x4f\xc4\xf7\x71\x75\x68\xcf\x9e\x66\x7b\xc8\x40\xa6\x0b\x55\x98\x85\xcd\x7e\x77\x1a\xd9\xd9\x95\xa2\x0a\x0c\x8c\x1b\x50\xad\x8c\x32\x6e\x25\x37\x73\x25\x85\x8c\x43\x6c\xf4\xd0\x6d\x83\xe9\x92\x5f\x82\x73\x94\x38\xed\x7f\x76\x41\xac\xf2\x5b\xbc\xe5\xfc\xe9\xfe\xe9\x95\x9c\x64\xb1\xbc\xf4\x03\x5c\xb2\xd8\x69\xb1\xbe\xe9\x41\x7f\x6d\x8c\xfc\x0c\x88\xfe\xdd\xfb\xf9\x8a\x40\xc0\x8e\x6b\x40\x6a\xf4\x89\x87\x0d\xf4\x70\xed\xa3\xa6\x4d\x8f\x6a\x5f\xc3\xfd\xd8\xe6\x72\xac\xa8\xd8\xaa\x43\xea\x96\x4c\xd0\xdb\x8e\x61\x27\xb0\xc7\x78\x13\xdd\xe4\x5c\xaf\x01\x8e\x7e\x85\xe8\xc2\x71\xe1\x1c\x25\xc8\x70\xad\xb9\xde\x0a\x8a\x31\x84\x30\x6e\x68\xdc\xe6\xbc\xd2\x98\xc6\x96\x47\xce\x73\x2e\x8d\x56\x58\x32\x67\x9d\xf7\xce\x3a\xc9\x27\x0d\xd3\x90\x37\x4b\x33\x87\x2f\xb1\xd3\x5f\x31\x6a\x9a\xad\x40\xe9\x41\x15\xf7\xfe\xff\x66\xed\x7f\x62\x1d\xe9\xd5\xf4\x30\xbc\x58\x2a\x1d\xd5\x1d\x8f\x3d\x75\x6e\xdf\xfe\x9a\xf3\xf3\x6f\xe6\xf2\xa0\xbb\xbf\xae\xb1\x67\xc6\xf4\x6d\x77\x37\xe3\x99\xf1\xa5\xe3\x64\x86\x1e\x3b\x36\xe1\x09\x12\xc6\x40\x02\x02\x01\x12\x02\xc6\x04\x04\x02\x04\x5c\x64\x41\x64\x13\x2e\xb9\xe4\xb2\x96\xb5\xd4\x52\xcb\x5a\xd6\xb2\x96\x5a\x6a\xa9\xa5\x96\xfa\xfa\xa8\x78\x82\x62\x49\x3a\x3a\xfd\x7d\xf7\x8e\x03\xe4\xf4\x57\x92\x8e\xa4\xee\x4f\xaa\xe2\x9f\xf7\x7d\xde\xe7\x7d\x1e\x65\xe5\x5a\xf4\x63\x75\xf9\x5d\x1b\xd9\xca\x7e\x59\x49\xac\x89\x18\x8d\x20\x06\x8b\xa2\x35\xc6\x44\x0d\x60\x10\x5a\x3b\x73\xfb\x0b\x9d\xf2\x17\x35\xdf\x66\xd9\xa2\xe0\x59\x9b\xae\xc5\x77\x49\x0f\xf6\xac\x53\x33\x17\x7a\x6f\xa4\x44\x5f\x9d\xf5\x2d\x8a\x83\xab\x90\x0d\x87\x03\x20\xa7\x01\xc8\x35\xc2\x46\xc3\x5c\x8e\x4d\x00\x38\x0e\x77\xa4\x56\x62\x4a\x4e\xdc\xd1\xb9\xa3\xe2\x72\x18\xfd\xb8\xf5\xc9\x57\xf6\x90\x8b\x55\x95\xae\xf9\xdf\x4f\x35\xd0\x33\xba\x3b\xeb\xe1\x2c\xa7\xbc\xfc\x7a\x29\xaf\x93\xeb\x6c\x46\x7e\xee\x0d\xb9\x7b\xfb\x01\x2d\x5c\x03\xe1\x02\xfe\xb0\xcb\x45\x1d\xab\xe2\xf8\x58\x16\x98\xf6\xfb\x90\xae\x69\x17\x83\xf7\x74\xb3\xf6\x4d\x3c\x0a\x50\x36\xd1\x0c\x10\x69\x52\x9b\x6e\xa8\xc1\xf6\xce\xd5\x18\x9d\xd8\x62\x43\x4e\x21\x6f\x2b\x03\x2b\xcf\x28\xc6\xb5\xc2\x4c\x2b\x12\x5a\xc5\x34\x66\x0a\x41\x46\xa9\x2b\x75\x96\x65\x3f\x4f\xf5\xac\xa6\xd8\x26\x4d\xa9\x5f\xbe\xe8\x50\xfd\xb3\xec\xd7\xd9\xbf\x4a\x15\xd1\xff\x39\xfb\x5f\xb3\xbf\xcd\xfe\xf7\x2b\xd3\xfe\x5c\xd9\x7c\xb7\x9c\xa6\xc3\xfb\x33\xaf\xf7\xfe\xe3\x97\x17\xc8\x04\x38\xeb\xe6\x7e\xf9\xe6\xfe\xcd\x8d\x02\xed\x55\x80\x7a\x8a\xce\x6f\x7a\x5b\x6f\xf9\x81\x39\x77\x65\xb5\x1d\xb4\x1f\x0f\x42\x70\x20\x80\x53\x86\xcb\xbc\x5d\xe0\xd8\x22\xc0\x46\xb6\x45\xb1\x1b\x40\x9b\xdc\xc9\xd3\xf1\xa8\xa7\x41\xa3\x18\xdb\x4d\xf7\x92\xb1\x43\xba\xe7\xbc\xe5\x1c\xd5\x48\xd6\xde\x78\xe3\xa6\x1f\x90\x79\xe3\x41\x63\x74\x2b\x1a\x10\x9c\x63\xce\x17\xdb\x1a\x96\xca\x69\x29\x18\xae\x9d\xf7\x94\x52\x7a\x74\xf2\xd4\x2e\x84\x8c\xad\x8e\x8d\x89\xc1\x00\x1f\x77\x42\xc9\xeb\xcd\x31\x32\xc6\x4b\x43\x48\xd7\x75\xdd\x21\xe7\x7b\x3d\xfd\xf4\xdc\x32\xcd\x04\x56\x46\x93\x84\xc7\xca\x27\xb6\x5a\x2f\xcb\xb4\x57\x7e\x97\xfd\xa3\xec\x4f\xb3\x8f\xd9\x5f\x67\xff\xfe\x7c\x86\xff\xd3\xb4\xf6\xde\x34\x14\xcc\xb2\xdc\x5f\x1e\x3e\x3d\xbc\xf9\x91\x90\xf9\xa7\x74\xba\xee\x3f\x7e\x7a\xfb\x1a\xdc\xbf\x10\xee\x9e\x57\xa8\x4f\xf7\xe0\xd3\xdb\xd7\xdf\x81\x87\xfb\x17\x19\xc0\x6d\x25\xd2\x2d\x4a\x14\x10\x5c\xd0\xaf\x78\x29\xbf\x96\xbe\x5b\xea\xaf\x3e\x14\xf4\xb1\xdb\x50\x4a\x04\x94\x35\xda\x42\xa1\xb5\xed\xfb\xbe\x5f\xba\x1a\x56\xa5\x2d\x99\x54\x8c\xb2\x52\x18\x01\x4a\xc7\x4e\xdb\xbc\xe4\x35\x34\x88\x70\x42\x35\x41\xcc\x5e\x70\xc6\xe9\x28\x5a\x8c\x31\xd6\x54\xb5\xbb\x78\x54\x64\x18\x3b\x4a\x2b\x5d\x21\x6e\x15\x6d\x7a\x80\x7a\x19\xf7\x82\x00\x11\x33\x4c\x54\xdd\x08\x4c\x39\xc1\x1b\xcf\x9a\x0e\xd4\x71\xd3\x1b\x04\xe0\xb8\x25\xac\x96\x4c\x32\x42\x08\x70\x74\xa0\x03\xbd\x9c\x47\x5e\x74\x57\x6c\xac\xce\x58\xf6\xef\xb2\xff\x70\xae\x54\xa8\xab\x56\x7c\x22\xe7\x4e\xf1\x25\xf8\xf5\x34\x72\xbf\x5c\x11\xa6\xe7\x1a\xc5\x0b\xfb\x82\x9f\x6c\xe8\xfb\xc5\xea\xf5\x9b\x73\xeb\xf5\x0b\x6c\x7b\xce\xbc\xe1\xb2\xff\x4a\x7c\x62\x2c\x6d\x00\x71\x00\x3f\x92\xde\x84\xee\x78\xac\xad\x64\x16\x3f\x65\x71\xa8\x83\x37\x36\x65\xc8\xb9\xb5\x10\x6d\x50\x6d\x18\x01\x55\x5c\x5f\x7b\xfc\xe4\x08\x3d\x82\x6a\x0b\xf8\xa1\x4c\x3d\x7e\x4e\x21\x57\x8b\xa8\x2d\x94\x4e\x02\xce\x6a\x57\xd3\xa2\x8b\xde\xa6\x71\x15\x61\x65\xf0\x10\x50\x4d\x94\x25\x82\x20\xcb\x75\x55\x1a\xd9\xd4\x26\xd4\x84\x20\x28\x28\xb7\xca\x68\x23\x1d\xce\x09\x84\x72\xdd\xa8\xb2\x14\x7b\xad\xb7\x92\x1a\x87\x9c\x29\x51\x63\x98\xb2\xda\x63\x6f\xb2\x6c\x95\x85\x27\xba\x72\xcb\x32\xfb\xd9\x95\x09\xf1\x57\x99\x79\xd1\x1b\xf2\xa2\xef\xf1\xc6\xe5\xe1\x7c\x9a\xa6\xc1\xf6\xdc\xf6\x78\xb7\xba\xee\xe0\x89\x4c\xfa\xf0\x71\xb6\x3c\x7a\x91\x9b\x26\x3d\xc6\xcf\x2f\x2b\x9d\x49\x19\xee\xf3\x97\x87\x06\x88\x0a\xf9\x1a\x02\x73\xf2\x05\xb7\x08\xef\xd2\xaf\xfb\x78\x98\x7e\x40\x39\x06\x57\x63\xd1\x01\x36\x4c\x3f\xe3\x5a\xd6\x44\x32\x42\x05\xa3\x94\x3a\x26\x18\x89\xb5\x07\x07\x17\xb7\x55\x05\x82\x92\x49\xc1\x92\xc6\x9e\x60\x21\x61\xa5\x04\xd1\x15\x5c\x77\x35\xc5\xde\x03\x51\x95\xb1\x2b\x0c\xc1\x35\xe5\xee\x58\x4b\x49\x69\xcd\xa4\x6f\x5d\xe7\x06\x2f\x16\x1d\x25\x76\x1f\xb7\x6d\x1b\x37\x5d\x17\xdb\x21\xdf\x63\x82\xa9\xc0\x35\x45\x02\xd5\x8c\x21\x8c\xd3\x35\x94\x35\x8a\x90\xf3\x44\xaa\x20\x9a\x41\x04\x21\xd5\x96\xe2\x9a\x41\xcb\x4d\xcc\x72\x87\xae\xf5\x35\xb2\x5a\x2f\x51\xf6\xc7\xa9\xef\xf7\x7f\xc8\xfe\xc7\xd4\xf9\xfb\xb7\x57\x25\xba\xbb\xd5\x15\xe1\x7e\xfd\xf6\x5c\x69\xb9\x5b\xdd\xcd\xa2\xfc\x17\xfc\xe7\xd3\xf2\xf9\xe1\xdb\x9f\xfa\x7b\x9f\xbf\xbc\x59\x7e\x58\x9e\xb1\xe2\xcb\x8c\x9f\xc5\x22\xde\xcf\xe2\x11\x1b\x08\xb5\x24\xa6\xaa\x8c\x3f\x1e\x01\xd9\x13\x8d\x4b\x5d\xd6\x64\xad\xb9\x44\x7b\xde\xc1\x1e\xf0\xb1\xd2\x68\xcf\x37\xa8\x07\xbc\x83\xe8\xf6\xed\x3b\x29\x71\xdc\xf1\x78\x58\xd6\x5f\xb7\x61\x71\x3c\x95\x97\x03\x40\x1e\xf7\x71\xc3\x00\xce\x8f\xa0\x06\x35\x8d\xfb\xb8\x2d\x28\x82\x54\x1a\x8c\x6a\x29\x15\xd7\x98\x54\x04\x29\x08\x09\xe7\x6b\xa2\x90\xd4\xbc\x3b\xdf\x23\x48\x85\xc6\x10\xa5\xb7\x69\x88\x84\x60\x62\x6c\xc0\x9a\xee\xe8\x8e\xf6\x92\x61\x07\x09\x22\x96\xa2\xc4\xbf\x6b\x52\x4f\xd3\x2e\xfb\xff\x65\x9f\xb3\x7f\x9d\xfd\x4d\xf6\xb7\xd9\xff\x9d\x65\xf3\x5c\xff\xfc\x93\x75\xf9\x2f\xd7\x34\xe1\x47\xaf\x4d\x39\xfc\xeb\x59\x9c\x30\x11\xe0\x7e\x1f\xbc\x7b\xff\x5c\xeb\x9f\xd7\x8f\x9f\xfa\x27\xa7\x57\x7e\x0f\x7c\xf9\xf1\x2b\x8b\x4e\xd7\x4a\x79\x4a\xca\x52\x60\x28\x2b\xd7\x20\x25\xb8\x80\x8a\x2a\x1c\x4b\x5d\xc1\xcb\x8b\xa4\xba\x7d\x51\xd6\xc5\x91\xf7\x4f\x19\x18\x82\x6f\x4b\x63\x24\x60\x5f\x49\x58\xf8\x93\x5e\xa8\x53\x06\xa4\xc2\x4a\x05\x5b\x56\xf2\xf2\x6f\xa6\xe2\x3e\x93\x08\x18\x8d\x15\xa5\xd6\x54\x02\x43\x55\xba\x30\xff\x8b\x9c\x28\x54\xd4\x15\xc5\xde\x94\x15\xac\x90\x54\x88\xa1\x4a\x52\x05\x4b\xc9\x2c\x92\xa4\x42\xe8\x37\xbd\xa6\x2c\x46\x7b\x37\x2b\xd6\xec\xd4\x26\x6f\x81\x82\xf5\x78\xb0\xe3\xda\xe6\x65\x45\xeb\x46\x43\x58\x21\xa1\x11\x45\x95\x64\xe7\xbf\xc5\x59\x45\x6b\x49\x75\x85\x5f\xbe\x62\x90\x9c\x72\x5d\xfd\x74\x48\xf8\x3a\xba\xf6\x56\x27\x45\x82\x99\x69\xf5\xf6\x8c\x4d\xdd\xad\x3e\x7c\x79\x3b\xeb\x88\x4f\xe1\xd3\xea\x66\x10\x2f\x6e\x54\x6e\xfe\xc1\xc5\x15\x39\x69\x47\xbf\xfb\xf2\x50\xb4\x0d\x01\x43\xd4\x55\x99\x23\xdf\x0a\xae\xec\x56\x5b\x6a\x76\x3e\x97\x65\x15\x15\xe0\x68\x97\x27\x85\xe1\xf9\xd8\x82\x23\x44\x9a\x62\xd0\x8f\xac\xca\x7d\xa5\xac\xb2\xd0\x49\x59\x8d\x83\xd8\x31\x50\xd2\xb8\x5d\xd6\x35\x89\x75\x05\x3b\x4e\xf8\x74\x2a\x05\x96\x03\xac\xc0\x16\x6f\xea\xa6\x6e\xea\xc8\x20\xe4\x84\x69\xb2\x36\x95\x2a\x99\xc6\xa6\x9e\xbd\xff\x72\xf2\x74\x58\x99\x62\x9f\xfd\x49\xf6\x3f\xdd\xf4\xb4\xcc\xcc\xfb\xd7\xef\xdf\x2c\x6f\xb5\x5e\xff\x02\xac\x3e\x7c\xf9\xf4\x70\x31\x24\x01\xb3\x1e\xce\x2f\xc1\x0b\xf1\xef\x7f\x0c\x3e\xcc\xc0\xee\x14\x31\xce\x12\x7c\x17\xbd\x9c\x42\xce\xed\x30\x0a\x61\x05\xab\xf1\x00\x5c\x19\x35\x59\x37\x75\x65\x2b\x7e\x8c\x3b\xb6\xa9\xfa\xa7\xcc\x38\x0d\x36\x4f\x59\x91\x45\x0e\x11\x45\x52\x32\xc9\x99\x96\xca\x58\xe5\x19\xe2\x8c\x6e\xe3\x9e\x82\xfa\x00\xfb\x78\x20\x20\x1b\x2a\xd8\x3b\xbe\x0d\x31\x14\x7b\xa4\x88\xe2\x8c\x23\x44\xa1\x84\xb0\xac\x28\xe1\x75\xcd\xca\xe9\x2b\xc7\x26\x0e\x3b\xbe\x07\x15\x08\x91\xab\xaa\xaa\x31\xc6\x5c\x61\xc4\xb8\x31\x12\x5b\x61\x4b\x8e\x34\x55\x44\xd7\x92\x48\xcc\xaa\x8a\x42\x79\x59\x0b\xf5\x93\x5e\x85\x62\x97\xbd\xcb\xfe\xfa\xbc\x7f\xff\xc7\x4c\x66\xff\xcb\x4d\x47\x67\x52\x80\x4a\x09\xc3\xe7\x4b\x3d\x6f\x96\x84\x49\x5a\x0c\xcb\x17\x15\x85\x17\x5e\x55\xe9\x7e\x8a\xa6\xc1\xb7\x94\xca\xdb\xdd\xfb\xe8\x2b\xd8\x3a\xe9\x02\xb3\x60\x3f\x24\x61\x61\x0d\xe3\x26\x1a\xb4\xf6\x53\x10\xd3\x4a\x0e\xaa\xa5\xa1\xb1\x49\xb1\xa5\x8a\x33\x51\xb8\x3b\x65\x60\x1d\x2d\xb0\x09\xfd\xd7\xc0\x37\x2d\x06\xe1\x29\xdb\xed\x80\xde\x8d\xeb\x74\x77\xaa\x2d\xa6\x9a\x46\x45\xb1\xad\x69\xb1\xc3\x08\x72\xa9\x15\x97\xca\x06\x17\x03\x84\x8e\xe1\x50\x41\x60\x5c\x90\xd4\xae\x83\xc1\xdc\xb2\x58\x52\xcb\xac\x65\x96\x82\x23\xb3\xac\x32\x63\x9f\x2a\xa2\x9c\x73\x56\x5b\x41\x14\x4b\xf5\xe9\x29\x06\x9a\xe3\xf6\x43\xf6\x7b\xe7\xac\x66\xee\x4c\xfd\xd3\xec\xaf\xb2\x7f\x93\xfd\xfb\xec\x6f\xae\x3a\x41\xdf\x5f\x82\xf5\xd5\xc3\xf7\x1f\x56\x77\xab\x8b\x9d\xc5\xfb\x6f\xee\x5f\x16\x96\x2f\x36\x2a\x73\x6f\xfa\x35\x8e\x5a\xec\x1a\x08\x41\x0f\x9c\xd8\xf6\xa7\xae\x3f\xf2\xdc\xc1\xdc\x74\xad\x43\x38\x66\xa0\x8f\xc4\xf6\x3d\x68\xd3\x83\xae\x03\xeb\xcb\x33\x48\xab\x24\x82\x4d\xe3\xe0\xe3\xd6\xc7\x6d\x08\xa9\xb4\xb3\x01\xb5\x07\xb8\x38\x10\x58\x05\x12\x30\x11\x82\x62\xa7\x15\x65\xbc\xaa\x86\x38\x28\x25\xaf\x37\xf1\x18\xe5\xdc\x8d\x0f\x2f\x31\x76\xd2\x8d\x49\xb9\xb6\x7b\xe2\xab\xb6\x18\x92\xba\xef\x1f\x24\xc7\xa5\x8b\x6e\xda\x87\x99\x86\x70\xf3\xf8\x4c\x3a\x5c\x7c\x9c\x6d\xb9\xae\xd5\xe3\x73\x04\x7d\x06\x1e\x16\x2f\x83\xc1\x79\xf0\xbd\xbf\x95\x36\xfa\xf4\x00\xbe\xdc\xbf\x5d\x34\x1e\x6b\x29\x85\x64\x52\x34\x11\x3f\xff\x12\x96\xdc\x70\x29\xcd\x57\x5d\x84\x2a\x94\x15\xd8\x44\x0e\x89\x60\x41\x5b\x4a\x10\x2a\x5d\x42\x45\x94\xa1\x56\x08\x14\x75\x0a\x20\x61\xdc\x4f\xa7\xc5\xba\x2a\x56\xe3\x11\x03\x91\x98\x20\x7b\x00\x53\x88\xd1\x80\xa3\xb5\xc5\x80\x04\xa1\x8a\x11\x41\xa4\x0e\xcf\x8f\x95\x95\x4a\x6a\xf9\x94\x01\xde\x79\x77\x58\xfb\x3d\x8e\x8d\x77\x5a\xc3\xbd\x5b\x2b\x6e\x85\xee\x81\x16\x5a\x18\xa1\x45\x59\x59\x02\x5d\x65\xb4\xd0\x52\x8b\x11\x57\x79\x97\xfd\x2c\x69\x18\x90\xa2\x3b\xe7\x26\x73\xb5\xec\xbf\xcc\xfe\x6d\xf6\xdf\xfd\x88\xf9\xf3\x66\x0a\x25\x3e\x3d\xbc\x06\xf7\x17\xd9\x86\x73\x33\xfc\xb5\xc0\xf7\x32\xb9\x9d\x4b\x7c\x3f\x16\x3f\x58\x11\x29\x6b\x56\xf3\x9a\x8e\x83\xbf\x68\xe7\xc5\x61\x5c\x9f\x6b\x2d\x9b\xc8\x0c\x18\x92\x5c\x2e\x68\xa2\xeb\x9c\x70\xde\xfb\x64\xd4\x1c\x62\x07\x42\xc4\x9d\x82\x48\x10\x84\xe3\x01\x34\x75\x0d\x15\xac\x54\xd1\x3d\x0a\xa9\x4a\x5f\xaa\x3c\x80\xdd\x86\xee\x09\x01\x32\xa2\x93\x5a\x9a\xe9\x97\xb8\xa7\xd3\xa4\x5c\x73\x6e\x24\x1b\x8e\x56\x5b\xae\x00\xa7\x71\xa8\x11\xa1\x74\xca\xf6\x6a\x5c\xfb\x2c\xf5\x7c\x8b\xd5\xba\xd8\x66\x3f\xcf\xde\x64\xf4\x1c\xab\x3d\x47\xc4\x6f\x53\x12\xff\xe9\xe3\x87\xb7\xcb\x8f\x9f\xbf\x3c\xbc\xff\xf8\xed\x4a\x34\xeb\x0f\x7d\xe3\xfb\xf9\xe9\x61\xf5\xcd\x2c\xbb\xb2\xd9\x1d\x60\x55\x15\x50\x05\x84\x81\x68\x77\xd2\x7d\xed\x00\xdb\x20\x18\xf7\xb9\xf5\x69\xbf\x52\xa3\xcf\xf9\xb8\x4e\x07\x1e\x07\xbc\x05\x88\x96\x1e\x32\x1c\x43\xec\x65\xae\xc7\x60\xa4\xe4\x0a\x79\x3a\x85\xbf\xfe\xa2\xba\x52\xc8\x24\xb5\xe4\x18\xb3\xd6\x7b\xc6\x76\xd8\xa8\xd8\x33\xc3\x0d\xd7\x08\x55\xd4\x92\x86\xd4\x44\xe4\x07\xd1\x8d\x86\xb3\xd2\x94\x94\x1c\x16\x68\x27\xe3\x20\xb2\xec\x67\x69\x9d\x09\xc5\xe1\xac\xc1\xfa\x87\xd9\x5f\x64\xff\xf2\x52\x67\x03\x0f\x9f\xcf\xa6\x0d\x09\xa7\x5e\x7d\xbc\xff\x06\x00\xb8\x29\xf9\x9e\x41\xff\x33\xea\xf3\xa2\xea\x7b\xb3\x20\x17\x04\x6c\x6a\x18\x7b\xc6\xe5\x46\x04\x84\x80\x66\x9b\xd3\xc1\x83\x43\xa2\x42\xa7\xe3\x71\x00\x32\xa4\x82\x3d\x8a\xbb\xd6\x48\x29\x83\x5b\xab\x83\x9e\xa6\x4e\xd3\x87\x00\xb0\xcf\x2b\xde\xf6\x6c\x0d\x86\x75\x43\xdb\x76\x21\x28\x63\x58\x9b\x06\x51\x6c\xfc\x88\xf2\x4a\xc4\x9d\x88\x3b\x9e\xef\x9d\x73\x3a\xb2\x5a\x2b\x27\x79\x0c\xc0\x77\xc6\x86\x01\x6c\x74\x14\x9b\xcd\x66\xdc\x68\xcd\x1c\x56\x54\x3a\x4d\xe7\xfe\x51\x9f\x7c\xfe\xbb\xec\x0f\xcf\xcc\xb8\xff\x36\xfb\x8f\x59\xf6\xea\xb9\xac\xf5\x63\x4f\xe6\xd4\x96\x75\x4d\x29\x7f\x12\xc4\xbb\x0a\xa6\x7d\xb9\x15\xf7\x4a\x3a\x7d\xdd\xbe\xe9\xba\x35\xec\xb9\x54\x12\x29\x55\x2b\x43\x82\xdd\xe7\xae\x80\x91\x00\x1f\x35\xd8\xed\x10\xda\x45\x05\xf6\x11\x86\x74\x7a\xcc\xba\x42\x3d\xe8\x13\xa5\x91\x85\x69\x99\xf5\xbe\x19\x8f\xa0\x44\x30\x06\xb8\x38\xd7\xcd\x1c\x8f\x3e\x69\x30\x48\x50\xd5\xa8\xa9\x6b\x40\x80\x89\x8e\x69\x61\x29\x36\xdc\xb5\xad\xe3\x86\x10\x2b\x34\x9b\x71\x92\x31\x3b\x73\xca\x56\xb3\xef\xe2\xb2\xcc\x96\xd9\x1f\x65\xff\x4d\xf6\x37\xd9\xff\x91\xfd\x9f\xd9\xff\x75\x65\x92\xfd\x78\xdf\x7e\xff\x13\xdb\xf6\x59\x2d\xf7\x0f\x41\x5a\x76\xf3\xeb\xaa\xfb\x61\xf5\x61\x8e\xb1\x5f\x9d\xf5\xa7\x6e\xdf\xf9\xe2\x8d\xcb\xf3\x1b\x1f\x6e\x06\xcf\xd2\x08\xc6\xb8\x38\x0d\xbe\x82\x9b\x20\x43\x7b\xdd\xd4\x01\x4c\x76\x2d\xa8\x0d\xcf\x9b\xfa\xa6\x1c\x0f\xb8\x6e\xac\x30\x4e\x50\x82\x60\x69\xab\xb6\xdb\xac\x7b\xb2\x09\x04\xad\x61\x53\x95\xae\xac\x94\x60\x9c\x89\x1c\x97\x11\x62\xec\x0d\xd7\xae\x52\x90\x20\x5b\xaf\xf5\xba\xdf\xd3\xdd\x86\xe1\xb8\xab\x8e\x35\x72\x75\x3d\x6e\x6e\x37\xfc\x65\x89\x99\xe0\xb8\xc6\x08\x0a\xad\x8d\x38\x6f\xfb\xf8\xe5\xae\x4f\x0d\xe5\x35\xa1\x92\x62\x5c\x71\x86\x9e\xb2\x40\x6a\x33\xe5\x95\x95\xa9\x28\xaf\x38\x8d\x14\x61\x49\x6a\x6c\x04\xc7\x4c\x48\xc1\x2a\xd2\xd6\x71\xdf\x08\x66\x09\xe3\x82\xd8\x5a\xc8\x5a\x8b\x17\xb1\xc1\x32\xf5\xed\xb5\xc5\x2e\x7b\x7b\xe6\x12\xfc\x74\x44\xf5\xa3\x2b\xb3\x9c\x63\xa7\x8f\x09\xfb\x4f\xe7\x3d\x99\x61\xdc\x5a\xcf\x7c\x3e\x13\x0b\xce\x14\xff\xb3\x67\xcd\x37\x11\xd5\xdf\x79\xf2\xf3\x75\x4e\xc6\x75\xbe\x77\x51\x41\x64\x98\x35\x46\x20\xcd\xf8\xce\x71\x25\x05\x92\x12\xc1\xae\xa1\xc7\x36\xca\x7c\x3d\xf6\x35\x27\x16\x8b\xe3\x8f\xa2\xa9\xdf\x72\x5a\x8d\x36\x11\xdb\xb6\x46\x52\x72\xc3\x39\xa4\x30\x98\xae\x57\x1c\x39\x04\x89\x37\xc4\x09\x79\xb0\x3a\xee\xb9\x64\xe2\x65\x60\xf5\xb3\x19\xa3\x2b\x76\xe7\x8a\xe5\xec\xa1\xa7\xd3\x28\xff\xc6\xc7\xe6\x6d\x72\x2b\xb8\x35\xad\x79\x3e\x0f\xff\xe4\xc5\x96\x79\xce\x27\x5f\x9d\x11\xbb\xe5\x4f\x14\x99\x6f\x15\xbf\x3e\x5f\x13\xd8\x37\xb7\x6c\x0d\x01\x2c\xae\x7c\x85\x40\x1f\x4b\x58\xe5\x62\x2f\x7a\xf6\x94\xe9\xd8\x87\x03\x75\xb2\x03\x8c\xc4\xcd\x02\x5b\xc6\x15\x1f\x37\xac\xb6\x35\xdd\x30\xc6\x2c\x74\xb8\xde\x57\xca\x1b\xbf\xdf\xef\xf7\x4b\xe8\x85\x45\x48\x5b\x66\x66\x85\x96\xb6\x43\xce\x74\x55\x67\x9c\x35\xca\x2a\xd3\x6d\xb7\x1b\x88\xb8\xb3\x5a\x87\x48\xa5\x69\x79\x58\xec\x8c\x43\x46\xd9\xba\xb6\x0a\x79\x36\xb4\xca\x52\x6e\x39\x50\x4c\x62\x41\x28\x65\x8c\x91\xea\x51\x9f\x15\x60\x51\x1c\xd6\xa4\x03\x3a\x1f\xa2\x3d\x8c\x9b\xed\x41\x59\x56\x63\x58\xb5\x82\x25\x11\x41\x58\x29\x4c\x2b\x2d\x75\xad\x48\x59\xb1\x3a\x08\x88\x10\x1c\x84\x16\x4a\xd5\x4c\x33\x8d\x67\x0d\x72\xfb\x44\x57\x6d\xb1\xcd\xfe\x5d\xf6\x37\xf3\xce\x7b\xcb\xa2\x5d\x7c\x7c\xf5\x32\x78\xfb\xf4\x5b\x82\xb7\xf7\x3f\x15\xbb\xfd\xea\x4a\x08\xb4\x79\x36\x85\x1e\x01\xd8\x68\xf3\xaa\x0a\x53\xa8\x26\x20\x66\xd4\x73\xcb\x69\x55\x05\x28\x98\xd7\x5c\x30\xc9\x38\x8a\xe6\x1a\xa9\x91\xd8\x03\x58\xc5\x6c\xdc\x62\x60\x52\x7f\xca\x14\xa5\x0d\x00\x47\x97\x97\x9c\xfa\x02\x29\xa6\x99\x5a\x68\x65\x95\xb2\x6a\x4a\x1e\xfc\xa1\x71\x03\x8e\xdb\x4d\x2b\x15\x1a\x5c\xcf\xa9\xe5\x72\x0a\xcc\x0c\x37\xcc\x4a\x68\x18\xf4\x95\xb5\xd3\xe6\x2c\x46\x5c\xe6\x3d\x18\xb8\xd0\x4a\x64\xd9\xef\xa4\xf3\xd1\x14\xbb\x14\xe1\x5e\x72\xa5\xd9\x5d\xf4\x3f\x5d\xb8\xf0\x3f\xe6\xbb\xbf\xf9\xee\xcd\xe7\x57\x97\x8d\xf8\x62\xcc\xfa\x70\x96\xb0\xbb\xaa\x73\x5d\x39\x45\xe7\xa5\xe0\xcf\xf2\x97\xbc\xe4\x6b\x0a\xb5\x7a\xf3\xf9\xcb\x52\x38\x58\x83\xc1\x22\x63\x7b\xdb\x38\xd3\xab\xde\x2a\x8e\xe5\x9a\x32\xc5\xd1\x53\xf6\x68\x80\x08\x40\x48\x19\xdb\x69\x0f\x82\x15\xe8\xa9\x55\x52\xe8\xcd\x10\x0f\x75\x6b\x76\x04\xb7\xa0\xac\x60\x3c\x00\x1d\x5b\x21\x7c\xdf\x03\xd9\x8f\xdb\xf9\xae\xdf\x6e\x81\xde\x45\x4e\x76\x86\x15\x3b\xac\x95\x8f\xed\xbe\xb1\x8d\x6d\x5b\xed\xd4\xa6\x19\xa8\x04\xa5\xdf\x86\x35\xc8\x00\x25\xa4\xb5\x2d\x89\x47\x54\x2b\xc3\x6a\x64\x09\x61\xd0\x95\x53\x20\x67\x6a\x04\x4a\xd2\x5a\x42\xc8\x91\x52\x1a\xa7\x07\xb1\x21\x94\x4c\x1b\xf9\xcf\x92\xd7\x68\x53\x0c\x59\x9d\xfd\x69\xf6\xcf\xb2\x3f\xcf\x68\xf6\x5f\xa5\x1d\xfd\x3f\xcc\x67\xf2\xa6\x4a\xb3\x5c\xbd\x3b\x07\xb2\x9f\xbf\xa9\xd2\xdc\x0a\x25\xa6\x48\xee\x61\xa6\x34\x7c\x9c\xa2\xbc\xf3\xfd\xcc\x35\xbd\xdb\xf0\xe1\xa8\x04\xf5\x18\x1f\xa2\x0f\x00\x92\xe8\x37\x61\x88\x9d\xda\xf7\x71\xbd\x87\xc8\xd2\xda\x0e\x3b\x0c\x8e\xa7\x10\xac\x72\x01\xb6\x4e\xf9\xe6\x2e\x1b\xcb\x50\xd4\x21\xd2\xd8\x03\xe2\x52\xc9\xe9\xfa\xe8\x64\xad\xea\x7c\x57\x0c\x1e\x55\xbd\xd0\x9c\x12\xcb\x91\x27\x9b\x61\x68\x84\xc5\xc2\xd6\x88\x33\xbe\xa9\x1c\xe5\xc6\x18\xb1\xe7\xda\x1a\x71\xf2\x24\xb7\xa3\x05\x47\xa5\xb6\x4a\x01\x2e\xe2\xe1\xa8\x0e\xd3\x9e\x2e\x9f\xe8\x6a\x9d\xe2\x9a\xe7\x35\xef\x7f\xfb\x86\x81\xf6\xcd\x72\xf7\xf9\xff\xc5\x7a\xf7\xf1\xfe\x57\x3f\xe9\x63\x76\xd9\x4c\xce\x92\x03\x0b\x01\x5c\x7d\x5e\xe1\x2a\x9c\x8b\x83\x9c\x17\xb8\x21\x1c\x69\xd0\x3b\xc0\x11\x8c\xeb\xbf\x73\x85\x5b\x04\x8f\x20\xab\x2d\x26\x3e\xb0\x6d\xcf\xce\x32\x63\xd5\x7a\x4b\xbc\xa9\x89\x26\x18\xa1\x45\x6b\x03\x72\xda\x49\xa7\x89\xe3\xbb\xce\x3a\xae\x1c\xc6\xc0\x52\x43\x24\x65\x8c\x33\xce\xf0\x6f\x5c\xd1\x42\x3c\x56\xd3\x5b\x08\x91\xd6\x73\x9d\xf8\x6a\x10\x13\x41\x4d\x8d\x19\x65\x9c\x57\x65\x56\xa6\x7d\xc4\x15\xc7\xec\x77\xb2\x3f\xbe\x19\x5f\xe2\x06\xe7\x7d\x78\xfd\xfe\x8a\x65\xfd\x01\x78\xa8\x5e\xf8\xf1\xe4\x8b\x0f\x3f\xbf\x4f\xbe\xbe\x57\x4b\xc1\xfb\xb9\x25\xf1\x59\x93\xff\xea\xc9\x7a\x26\x0e\x58\x26\x74\xc7\x5d\x05\x73\xff\x43\x09\x70\x05\x3d\xaa\x00\x8c\x0e\x88\x5a\x3a\x4a\x6b\xc1\x79\x85\x06\xb4\xb5\xfb\x61\x21\x9d\x07\xc2\x3b\xb7\x3e\x55\xbd\x03\xf0\x6a\xf8\x98\x8e\xd6\x6b\xdb\xc4\xbd\xf1\x1b\xd9\x2e\x8e\x9c\x6a\xd3\x22\x5c\x3b\xc6\x28\xe2\xc2\x6b\x12\xb3\xd8\x2b\xe4\x11\x73\x60\x1d\xcb\xd8\x2b\x60\x72\xa8\xb5\x52\x4a\xd9\x58\x5b\x0b\xb6\x09\xb4\x88\x7b\xb1\x63\xc2\x48\xa6\xa4\x62\x86\xcc\x31\xb4\x48\xe7\xa5\xcb\xbe\x4f\xfa\x2b\x7f\x99\x90\x9f\x17\x8c\xbd\x67\xee\xc1\xb3\x87\xda\xf9\xcf\xfb\x5b\x52\xfc\xc3\x4c\x8a\x5f\x26\xec\xe2\x59\xb6\x68\x3a\x2b\x1e\xa0\x26\x01\x0c\x65\x4c\x5e\xd0\x1b\x27\x8c\x6e\x64\x90\x7b\x9d\x16\xea\x23\x28\xe3\x6e\x41\xd7\x7e\xef\xbb\x0e\x64\xa7\x6a\xbf\x06\x74\xbf\xcf\x91\x1b\x77\xde\xcf\x16\xed\xe3\xae\x60\xc9\x1e\xdd\x3a\x6e\xb4\xd5\x22\x5a\xe0\x1b\x6b\xd6\xdb\xe9\x39\x11\x42\xd3\x24\x5d\x8f\xa6\x89\x7a\x64\x8c\x25\x89\xa7\xe8\x4d\x96\x95\xb3\xfe\x40\xb1\x4f\x3d\xe8\xef\xb2\x3a\xfb\x8b\xb3\x8f\xf1\x8f\x74\x45\xae\x4a\xac\x6f\x5e\x3e\x39\x6b\xcd\x7c\xeb\x1b\xf7\xe1\x46\x2d\xf0\xec\x21\x97\xe5\x4d\xc8\x77\x23\xca\xed\xd7\x90\xf3\x51\xaa\xbb\xa1\x66\xa6\x46\x3f\x0c\xdd\x32\x1b\x87\xbc\xfb\xe1\x38\xc5\x50\xc3\xdd\xf1\x87\x72\x51\xe7\xa2\xe9\x3a\x66\x38\x85\x5c\xa0\xb1\x25\x36\x1a\x6b\x81\x8b\x66\x41\x08\x51\x98\x15\x1b\x8c\x0d\xd6\x1a\x0f\x4a\xa4\x9a\x9b\xa4\x4a\xd1\x9d\x62\x18\x1b\x2b\x58\x65\x2b\xa2\x4c\x34\x84\x00\xb7\x95\xb0\x26\x2a\xf9\x12\xdd\x9d\xf5\x32\xbb\xec\x3e\x7b\x9b\x1c\xff\xfe\x4d\xfa\xae\xd3\x9c\x3e\xdb\xe3\xcf\xae\x8a\xef\x6f\x9e\x99\xbd\x68\xff\x73\xb4\xb5\x97\x67\x95\x28\xb0\xc3\xc8\x99\x71\x93\xef\x42\x3c\xc4\x9e\x1c\x11\x5e\x1c\x09\xb2\xf3\x53\xfb\x78\xc0\x0d\x24\x23\x69\x20\x04\xbe\x84\xbe\x86\xb9\xbf\x11\xe0\x0e\x5f\xd7\x81\x32\x0b\xca\x7c\x33\x5f\xdd\x74\x85\x11\xe3\x15\xb2\x6e\xdc\x7b\x86\x1d\xe2\x04\x33\x01\xe7\xdf\x29\x76\x90\x93\x78\x20\x08\xa2\xba\xc6\xd4\x71\x23\x0c\x77\x38\xaf\x08\x91\x6b\xc9\xf9\x20\x44\xcf\xcf\x38\x81\x2f\x8e\xd7\x3e\xc5\x5f\x67\x7f\xf9\x63\x06\xea\xf4\xf5\xa6\x61\xbc\x3c\xe3\x6a\x6f\x2e\x0a\x0f\x3f\x36\x72\x78\x48\xac\x88\xc4\xf5\x7d\xa7\x17\xb4\x59\xd0\x53\x97\x87\xaf\x30\x5f\x9f\xba\xfd\x92\x7d\xdd\xb8\x02\x3f\x0e\x4b\x17\xbe\xf2\xb0\x5d\x12\x6b\x35\x67\xec\x70\x48\x42\x31\xf5\x0f\x70\x81\x46\x9b\xdb\xb8\x8b\xbb\xca\x99\x63\x51\x13\x12\x89\xd1\x79\x59\x0c\x75\xad\x89\x94\x64\xd8\x4b\xdc\x1f\xbd\x3f\x06\x45\x99\xac\x31\x2c\x99\x26\xc6\x10\x4d\x2b\x83\x30\x41\x90\xa2\x72\xc6\xd4\xd8\xca\x2d\xab\xab\x5e\xd8\x5f\xbf\xe0\xaf\x9c\x0b\xd3\xcb\x1b\x66\xed\x77\x6f\xde\x5d\x2c\x50\x3e\xac\xbe\xfb\x86\xf2\xfe\xee\x7d\xe2\x71\xbd\x9f\x23\x8e\xf7\x0f\x8b\x23\x82\x0b\xf2\x03\xce\x0f\x15\x8c\x70\x99\x3d\x66\x61\x31\x9c\xf0\x52\x4c\x5f\xeb\xb0\xac\x46\xeb\x6a\x90\x0d\x52\x3b\x0b\xa0\x8e\x83\x75\xa5\xb5\x35\x43\x9c\xca\xd8\x8c\x07\x92\x57\xc0\xc0\xb8\x89\x8c\x81\x00\xd8\x94\x04\x6f\xe4\x00\x44\xd4\xcb\x8a\x30\x63\xea\xfa\xf8\x94\x29\xb2\x3d\x3a\x0f\xb2\xb5\xe6\x72\xfa\xe6\xd8\x51\xcb\x7b\x84\xa0\xd6\xa5\xad\x04\x0a\xc2\xf0\xa6\x76\xdc\x50\x0d\x2b\x41\x0c\xa4\x53\xdc\xc9\xd3\x5e\xb8\x3e\xfb\x57\xce\xf1\xc0\x73\xf3\xf7\xc7\xd9\x2c\xf8\x02\x6b\xdc\x86\x94\xe7\xe5\xf9\x33\x28\x96\xab\x77\x7f\x32\x6b\x8e\xe4\x42\x87\x59\xd9\x6f\x3a\x36\xa1\x8d\xed\xdc\xd5\x25\x80\x4f\xe0\x5e\xe2\xb4\x83\xc1\x1d\x1b\xb7\x5b\x70\xc0\x01\xa6\x71\x13\xbb\x58\xda\x63\x6c\x14\xa0\xc5\xda\x30\xa4\x9d\x77\xc9\xf5\x0e\xc8\xbc\xb2\xce\xc4\xca\x3b\xef\x82\x3f\xb5\xde\x2f\xaa\xfa\x04\x99\x0c\x86\x59\x65\x85\x9f\xe7\x63\x0f\xfc\x4a\x17\x9b\xec\x77\xae\xd8\x70\x7d\x89\x11\xd3\x06\xbe\x78\xc6\xaa\xae\x00\x14\xf8\xf4\xf0\xfa\x9c\x47\xc3\x69\x0f\x3e\x8e\x3d\x95\x66\x1d\x62\x0f\xb2\xa7\x0c\x90\x93\x4f\xa6\x47\x79\x35\x26\x36\x45\xc1\xd6\x5e\x86\x75\xb1\x99\x02\x65\xaf\xe4\x00\x32\xab\x62\xa7\xcc\xa2\xdc\xab\xd8\x4f\x0f\xd5\x20\xad\xf1\x32\xad\xf9\x24\x61\xd5\x6f\xce\xaa\x5b\x7f\x95\xfc\x8b\x2f\x1a\x19\x2f\x40\xa4\xbb\xd5\x7f\x26\x6c\xb4\xfc\x78\x5f\x2d\x3f\xbc\xfb\xfc\xe9\x9c\x84\x92\x10\x49\x00\x9e\xa0\xb8\xe7\x42\x75\x3c\xa1\x47\x35\xfe\x0a\xff\x6e\xb8\x48\xf8\x98\x49\x90\x0d\xfb\xa6\xd1\xbe\x5b\xe0\x51\xe5\x70\x3c\xe6\x4e\x08\x41\xb5\x5b\x23\x8a\x8d\xe2\x20\xfb\xad\x68\x91\x78\xca\xa2\x09\x96\xee\xd6\x4f\x99\x74\xc9\x71\xa6\xcc\x92\x77\x73\x31\x64\xaf\xb2\x8f\xd9\x5f\x25\x54\xfe\xbf\x3f\x2b\x0c\x5c\xe2\xf4\x59\xb2\x27\x29\x0a\xbd\xbf\xe0\x48\xf3\x53\x2f\x91\xa4\xf7\x53\x70\x79\xe3\x98\x3a\x5b\x59\xbd\xbd\xf1\xa5\x78\x21\x6e\x58\x04\x41\x6c\x59\x9a\xc0\xb7\x3d\x6b\xd7\x8c\x43\x74\x0a\xbb\xb0\xd9\x08\x0e\x85\x62\x72\xd6\xf1\x54\x9a\x80\x6a\x57\xe8\x1c\x97\x52\x23\x0a\x39\x42\xa8\x0c\xf0\x29\xe3\x43\x65\xf2\x2a\x8c\x75\x48\xd6\xe7\xa0\x05\x78\xac\x2f\x8f\xe2\xb0\xd8\x1a\x47\x60\x25\x28\x07\x07\xc8\x0c\x41\x71\x57\x13\x8c\xeb\xe3\xd1\xc7\x23\x44\xae\xae\x5f\xc0\x4b\x1c\x10\xc0\xa3\x19\xa0\x83\x6a\x17\xb5\xb4\x0c\xd4\x31\x9b\xf7\xcc\xa3\xd6\x3a\x36\x49\xc6\x2c\x2b\x53\x5c\x6e\x97\x55\xf6\x4f\xb2\x3f\x4f\x28\xe3\xbf\x3e\xab\x63\x27\x8d\xfc\xb4\xe7\xa7\xd5\xe5\x6c\x35\x7c\xad\x80\x3f\xe4\xab\xa4\xa9\xf1\xec\x7e\xf1\xfe\xe3\xf7\x1f\xae\x92\x71\xef\x3f\x7f\x79\xf8\x25\x78\xfd\xf1\xd3\xea\xc2\x2e\xba\xdc\x63\x60\xb6\xdb\x78\xdc\x80\x8a\xc7\x5d\x1f\x86\xd0\x6e\xc5\xb6\xd9\x03\x16\x05\xd2\xde\xe7\x2d\x0e\x18\x2d\x60\xd4\x14\x84\xaf\x6e\x87\xea\xe1\xec\x83\xed\x17\x75\x8d\xc6\x1d\x35\xc3\x30\x84\xfd\xb8\x1e\xc2\x7e\x51\xf1\xce\x75\x96\x06\xb9\x89\x43\x72\x54\x43\xad\x34\xdc\x1b\x16\x37\xfb\x69\x66\xeb\x9c\x70\x4c\x98\x57\xce\x11\x1c\x33\x6a\xb9\xc3\x44\x39\xce\x07\x4a\x29\xed\x59\x32\xf7\x28\xd3\x5c\x69\x13\x0e\xff\x5c\xd7\xf9\xd5\xd9\x09\xe6\xc7\xe5\x9c\xdf\x03\x97\xa5\xf8\xa2\xab\xfc\xea\xb9\xd8\xf1\xee\x0a\xc7\xcd\x9e\xd3\x8b\xa1\x85\x20\x80\xb5\x58\xaf\x4f\x75\xdb\x89\x5c\xc9\x05\xdc\x77\x98\x0b\x03\xd6\xf9\x7a\xe4\xa9\xba\x75\x62\xf3\x43\x1b\xad\x6f\x68\xe3\x94\xf7\x36\x28\x90\x2d\xda\x16\xa2\xae\xd1\xcd\x5a\x40\x49\xd4\xbe\xe8\x30\x6c\x84\xc7\x44\x69\x42\x5c\x13\x98\x44\x35\x22\xfb\x28\x6d\x63\xa7\x9b\x38\xd4\x92\x09\xa7\xb9\xe1\xc6\xf4\x35\xc6\xe9\x17\x01\x09\x4a\x1a\x98\xfe\x89\x2e\xaa\xa2\x4f\x0a\x3d\x17\x37\xd0\x97\x03\xff\xf3\x15\x43\x3d\xe3\xa0\x52\x9d\x81\x50\x58\xcd\x48\xe8\x22\xad\x4d\x09\xd1\xc4\x75\x74\x46\xd4\x01\x41\x0a\xe0\x8c\x69\xa6\xfe\x90\x7c\x9d\x95\x2b\x51\xf8\xec\xd5\x55\xb1\xe1\xc6\x07\xfe\xd9\x06\x7e\xee\xeb\x9f\x82\xc9\xfb\xf3\x89\xbc\x6b\xd7\x5a\x63\x86\x3c\x3b\x85\x26\x80\xed\x61\xec\xa7\x55\xbc\xef\x73\x32\xf6\x76\x4a\xc2\x0a\x1f\xd9\xb8\x15\xbc\xb4\x14\xd8\x71\x97\xb7\xa9\x6c\x81\xf9\x4e\xc7\x4d\xec\x95\xcc\xa6\xbc\xbd\x4d\x5c\xa5\xed\xd9\x7b\xf2\x1f\x66\xbf\xbc\x61\xd8\x65\xe0\x65\xe7\xed\xc5\x24\xea\x61\x79\x15\xc9\xfe\xe9\xf9\x9d\x67\x8a\x0b\x21\x0b\x62\x84\x54\x2a\x96\xcd\xa2\x0c\x5f\x5d\x58\x64\x91\x15\xe5\xe3\xd1\xe7\xfb\x11\x16\x2c\x3c\x36\xb3\xdc\x6a\x6e\xc0\xfe\xb1\xb9\x3c\x8a\xb0\xd8\xd6\x44\x11\x2c\x99\xa8\x05\x26\x43\x6c\xb7\x5b\x20\xfa\xb8\x31\x22\x1e\xc6\x50\xd7\xb9\xda\xc9\xa4\x8d\xa0\x54\xca\x97\xdd\x39\x3f\x7c\x9b\x7d\xf8\x51\x36\x93\x16\xeb\x5f\xa4\x7a\xfd\x43\xc2\x1f\xfe\x14\x5c\xc9\xbb\x67\x65\xb4\x69\xc9\x06\xc9\x77\xe6\xef\xc8\x66\x6e\x5d\x2a\x96\x36\x00\x26\x14\xde\x80\x0a\xb6\x61\xcd\xcd\xb6\x94\x5b\xd1\x2b\x4f\x6a\xef\x9c\xef\x7b\xc0\x14\x8c\x7b\xf2\xf5\x68\x3d\x20\xde\x18\x79\xda\x78\x0b\xaa\x84\xcb\x9c\x0f\xea\xb4\xd5\x0e\xf4\x9a\x5a\xaa\x0a\xec\xbd\x23\x2d\xf7\xc7\xd8\xef\x35\xf3\xb8\x29\xb5\xb4\x5c\xaf\x0f\x3c\xba\xb8\xe3\xa0\x9e\xb6\xd7\x68\x8f\xa3\x70\xed\x26\x6f\x43\x70\xce\x8e\xad\xb5\xb9\xd0\x3a\x06\x1b\xbd\x8d\x5b\xba\x51\x6a\xca\x34\x99\xb3\x09\x0b\xa7\x29\xc7\xfb\x83\xc4\xdb\x9f\xae\xe9\x9f\x65\xbf\x4e\x5a\x20\x67\x5d\x94\xab\x63\xc0\xea\x6c\xdc\xf5\x30\xc5\xbd\xef\x7f\xf5\xe5\x61\xb5\xb8\x2c\x57\x6f\xbe\xd1\x5e\x9d\x36\x64\xd0\x6d\xfc\x5a\x71\xb0\x06\xd4\xa0\x3a\xdf\x2a\xe0\x76\x82\xad\xd7\xb1\x69\x9e\x32\xb6\xc9\xcb\xca\x8d\xd2\xc8\x9c\x53\x4b\x69\xee\xbe\x2a\x5d\x6c\x1e\x59\x3a\xfa\x70\x92\x21\x2c\x9a\x93\x5c\x88\x28\x62\x1b\xf7\x02\x54\x80\x01\x83\x8c\xee\x29\x84\x9a\xda\xda\x28\x22\xa9\xc6\x96\xd2\x38\x50\x41\x85\x25\x8a\x2a\x16\xbb\x69\xd2\xac\x59\x76\xd6\x6e\x9c\xd7\xa1\xdf\x3d\x77\x24\xd3\x33\x86\xbc\xbc\xac\x2d\xbf\xdd\x0a\x29\xdd\xbf\xbf\x40\xcd\xf3\x5a\xfc\x76\x69\x7c\x05\x7b\x90\x89\x63\xef\xb6\x1a\xa0\xc7\x35\xe0\x21\x09\xdf\xe0\xb8\x03\x2a\x86\x90\x0a\x17\x03\x40\x71\xdd\x5f\x6a\x80\x0b\x98\xbb\xe3\xf4\x62\x13\x03\x50\x87\xa2\xc3\x08\xb6\xc6\xda\xb6\xb1\xba\xd5\x5a\x3b\x39\x6e\xa4\x3b\x1e\x9d\xcc\x99\x8c\x1b\x15\x37\xaa\x77\x9d\x8f\x1c\xac\x7d\x37\xd7\x2c\x64\xc2\xce\xba\xb3\x8b\xe0\x94\x91\xfd\x49\xf6\xaf\x2e\xfc\xdc\xe7\x4f\xf8\x31\x41\x60\x9f\x17\x1f\xbf\xbc\x7d\xf8\xc5\xea\xe1\x13\xf8\xf8\xf9\xcb\xdb\x87\xe9\xc1\xdd\xea\xe3\x27\x90\x56\xa9\x69\xd8\xfe\xc1\xec\x76\x3f\xed\x3a\xf7\x4b\xd8\xd6\x18\xec\x0f\x89\x49\x3d\xea\xde\xd0\xb8\x05\x88\x0e\x87\xf2\x08\x5c\x09\xd0\x28\x87\xaa\xdc\x03\x33\x8d\xcb\x06\x89\xdd\x23\xf4\x9d\xf7\x11\x01\x1d\xf6\x48\x19\x5b\x74\x98\xe0\xd1\x75\xc9\x7f\xc8\x71\x9d\x1b\x16\x3b\x4d\x88\x8e\x81\x50\x63\x9e\x32\xa1\xba\xbc\x8b\x03\x90\xb1\xf1\xcc\x8d\x3a\xcf\x62\x37\x48\x00\xc1\x7a\xc6\x49\x65\xd2\xff\xf6\x29\x5a\xfd\x97\xb3\x43\xdc\x4b\x9f\xe3\xab\xb2\xe9\x3c\xbc\x2e\xae\x4a\x2f\xed\x90\xdf\xce\x8e\xeb\x29\xcf\xaa\x96\xdb\x1d\x84\xad\xe5\xce\x13\xae\x0d\x8f\xfb\x05\x8e\xe5\x16\x60\xa1\x64\x38\xe9\x90\x38\x49\x7d\xac\x16\x24\x6e\x21\x0a\x8a\x1b\xcb\xa4\x69\xc5\x2e\x47\x4c\x2d\xa0\x91\xa3\x5b\xf8\x93\x2e\xbc\xc5\x48\x30\x2d\xa9\x64\xc2\x84\xe8\xac\xa5\x0d\xaa\x23\xa7\x0c\x34\xa4\xf6\xa2\xb5\xc0\x60\xcc\xa8\x16\x64\x1a\x83\x2e\x96\x92\x31\x19\xb3\xed\x39\xa7\x9c\xc6\x5f\x9f\x6a\xd1\xbf\xca\x3e\xcf\x5a\xad\x67\xef\x92\x5b\x9f\xe0\xbb\xab\xb3\xed\xfb\xe9\x5a\x9e\x03\xa8\xe4\x5e\xf8\xf1\xfe\xcb\xcb\x65\x74\x1a\x97\xc5\xae\xc1\xe0\xe0\xc3\x7a\xc7\xe2\x71\x7b\xd8\x93\xbe\xe3\x8c\x52\xb5\x97\x42\x39\x19\xdd\xe3\x90\xfb\xed\xe1\xe0\x34\x8c\x6d\x14\x50\x4d\xb3\x3e\x39\xa4\x2e\xfb\x10\x51\x93\xd4\x9f\x8b\x1e\x09\xdb\x68\x41\x3c\x37\x1e\x7b\x2c\x09\xc3\xb5\x71\x9c\x51\xae\xda\x58\x6f\x4d\x3c\xa0\xda\x19\x1e\xaa\x9c\x8f\x03\xca\xad\xeb\xc7\x66\xdc\x08\x91\xb3\x18\xce\x3e\xc8\x53\x9e\x61\x8b\xfd\x79\x2d\xcd\x6e\x31\xda\xfb\x8b\xc2\xfc\xc7\xcb\x7e\x30\x2b\x06\xae\xd2\xfe\x70\x97\xd4\xd9\x3e\x4e\x03\x74\x56\x0a\xb9\xa6\x21\x69\x8b\x58\x4e\xdb\x04\xcd\x95\xcf\xc3\x7a\x3d\xaa\xbc\x8e\xc2\x03\xd8\x34\x71\xef\x41\x3b\x6e\xfd\xb8\xab\xc0\xda\xc5\x35\x31\x5c\x8a\x50\x82\xcc\x45\x53\xe6\x70\x74\xb9\x39\xed\x17\x70\x0c\xf9\x31\xcf\x62\x96\x67\x45\x4b\x69\x6f\x86\xd8\xf1\x5e\xe9\xd3\x30\xf4\x80\x88\xa8\x81\x97\xb1\xef\x8d\xb0\x1c\x64\x40\x12\xac\x87\x69\xd1\xb0\xdc\x70\xce\x7b\xce\xe7\x9e\x20\x03\x86\x55\x53\xac\xb3\x7f\x3c\x7f\xb3\xb3\x13\xcf\xdb\x1f\xf1\x19\xa7\xaf\xf2\xeb\x29\x6e\x7b\x73\xb7\xfa\xf8\xf9\x2f\x40\x52\x40\x3c\xbf\x37\x49\x59\x7e\x7a\x9b\x90\xd7\xb7\x1f\xbe\xbc\x99\xdf\x50\xe0\x45\x15\x8f\x25\xc0\xad\x66\x1a\x95\xa6\xac\x49\x6b\x85\x59\x2b\x2b\x78\x3c\xd6\xd2\x42\x34\x54\xd1\x9d\x9a\xfc\xf8\x94\x55\xa0\x5e\xf7\xa8\xf1\x0c\xd9\xb8\x53\x5b\x7d\xa8\xa5\x25\x3d\x8c\x4d\xb1\xb6\x14\xd7\xa6\x14\x14\x31\x64\x11\xa2\xbc\xb2\x5c\x13\xc6\xb5\x47\x18\xd7\x98\x5a\x0b\x19\x35\x9e\x2b\x4e\xd8\xbe\xb7\x46\x6a\x15\x90\xa2\x0c\xce\x6b\xe3\xe6\x89\xae\x78\x31\x24\xbc\xe3\x8f\xb2\x7f\x92\xfd\x55\x62\x78\xdd\xd8\x20\xac\x3e\xbc\xfb\xf4\xfe\xc7\xcf\xdc\x88\x62\xcc\xd7\x3b\x7f\x29\x56\xfe\xee\xd5\x43\x5e\x3b\xa7\x44\xe8\x37\x56\x34\x8d\x0e\x02\xf0\x85\x98\x9e\xf1\xfd\xda\xc9\xd0\xaa\x86\x03\xf6\xd8\x19\xa8\x8d\x5a\x18\x3b\xdd\x9d\xf6\x60\xdd\xe4\xbb\xd2\xb5\x62\x03\x3b\x45\x69\x35\x76\xf5\xd8\x52\x70\xac\xa3\x28\x06\x8f\x88\xe2\x35\xa5\x86\x13\x41\xb4\x6a\x9a\xf4\x04\x26\xd7\x27\x18\xb2\x92\x72\x9d\x6e\x47\xab\x54\x74\x3d\x0a\x48\x76\xd1\x31\x47\xc0\x39\x2e\xa7\xab\x90\xf0\x9d\xd7\x29\x7a\xf9\xf5\xd5\xe9\xe3\xa5\x58\xc8\xfd\xd9\x55\xe0\x85\x84\xf2\xf4\xec\xe2\xe1\xf5\xb9\x0a\xf1\x12\x17\x59\xce\x9b\xfe\x95\x95\x0a\x6c\xbd\xde\xe1\xd2\x43\x19\x87\x78\x10\x79\x97\xa4\x23\x40\x5b\x77\xa0\xa4\xa5\x47\x2a\xb6\x71\x27\xf2\xde\x47\x01\xda\xaf\x01\x30\x9f\xe3\x90\xd4\xf3\x0f\xc7\x01\xec\xe3\x06\x6c\x73\x3c\x0e\xa5\x3e\xc6\x56\x01\xba\x40\x40\xce\x19\xf5\x66\xc1\x28\xaa\x20\xc1\x8a\x10\x09\x86\xe8\x8e\xd6\x92\xe9\x09\x22\xe7\x27\xec\x34\x11\x90\x94\x52\x5a\xe5\x9c\x52\x2a\xee\x85\x64\x0e\xb3\x9a\x79\x41\xd2\x39\x20\xa9\x4f\xe2\x1f\xde\x74\x49\x24\x1f\x80\x57\xdf\x7c\xaf\xd4\xc2\x73\x9e\x92\xcb\x99\x06\xf1\xd2\x1d\xe2\x86\x85\xbb\x05\xda\xe7\x34\x24\xf2\xcb\xe1\xb4\xc9\xed\x57\x99\xbb\x53\x0b\x76\xd1\xe7\x59\x4e\xc7\x2e\x1e\x93\x3b\xa8\x03\x87\x47\x77\x79\x74\xb2\xf2\x29\x8b\x9e\x83\xb0\xa8\x01\x06\x98\xc7\x21\xf6\x85\x65\x4c\x08\x6f\x9c\x1c\xd7\x39\x97\xce\x18\x33\xae\xa7\xe4\x6a\x0a\x58\xe2\x21\xb9\xc2\x10\xc4\x2c\xaf\xb3\x22\xd3\x4f\x66\xe5\x8a\x75\xe2\x8b\xcd\xb9\xc5\xb3\xb8\xf9\x45\x00\xf8\xcd\xdd\xea\x0a\xda\xbf\x4b\x49\xc7\x32\xad\xb7\xaf\x2e\x79\xc6\x8d\xd9\xd6\xa7\x87\x0f\xc0\x0a\xee\xf9\x78\xc8\x3b\x2a\xc1\xce\x4a\x4b\x98\x60\x9a\x2b\x29\xb9\x66\xc2\xb7\x34\xf6\xdb\xd1\xef\x63\x87\xd7\x8e\xf1\x50\x34\x8f\xb2\x59\xc8\x53\x13\x08\x06\x86\x96\x6d\x89\xc1\xf6\x07\x09\xf6\x74\x31\x30\xa5\xb4\x73\x9a\xdb\x35\x91\x22\xc1\x6e\x5c\x58\xa1\x05\xc3\x5e\xac\x29\x69\x99\xad\x09\xe7\xb1\x8b\xca\x86\xb8\x63\xc2\xd4\xa4\x94\xce\xc9\x67\x7c\xb9\x29\xfa\x73\xac\x3f\xe3\x0d\x49\x75\xfa\xee\xaa\xf1\x7d\xce\xa0\x66\x75\xb6\xe5\x07\xb4\x78\xf8\xf0\xb0\x98\xae\xd6\xb7\xda\x2a\x97\x30\xfc\x0e\xd1\x78\x88\x2d\x44\x8b\x4d\x24\x03\x40\xbc\x6b\x4f\x24\x74\x1a\x90\x21\x92\xdc\xd4\x70\x3c\xd4\xb9\xeb\x72\x6b\xa2\x0c\x79\x3b\x8a\x42\x4a\x85\x09\x12\x18\x3f\x42\x0f\xe4\x82\x9e\xba\x04\x2b\x17\xbd\x41\x10\xd7\x8e\x63\x8f\xf9\xae\x63\xd4\x70\xed\xea\xba\x72\x51\xf2\xa7\x8c\xee\xa3\x12\xbc\x74\x25\x3d\x46\x92\xb3\x4d\xec\xb5\x48\xf1\xf7\x1c\x67\x1e\xae\xbe\xb5\x17\xa7\x8f\x8f\x3f\xa1\x88\x76\x1d\x6d\xdf\x70\xbf\x6f\x50\xa9\x69\x7b\x48\x0a\x20\x0b\x76\xdc\x2f\xc8\xc5\x89\x52\x81\xfd\x23\x5a\xaa\xaf\x21\x14\xe4\xb1\xbf\x1c\x0b\x08\x24\x80\x2a\x1e\xe2\x3a\x4a\xd1\x46\xc2\x40\x53\xac\x29\x8d\x3b\x6c\x2d\x56\x8c\xb1\xa8\x47\x07\x3a\xba\xa7\x7b\xda\x61\xaa\x19\x56\x92\x51\x57\x67\x00\x74\x4f\xf2\x0e\xe7\xfa\xea\x35\xf0\xf6\xd6\x3f\xfa\x22\x34\x9d\x9c\xf1\x6b\x04\xc1\xd0\x23\xeb\x2c\x6f\xda\x2e\xf6\x12\x64\xeb\x6e\x23\x76\x3b\x83\x4e\x47\x70\xac\x60\xae\x09\x75\xce\x10\x66\x25\x55\xcc\x62\xce\xb0\x22\x9c\x2b\x57\x27\xbd\xb8\x45\x2e\xb2\x6c\xe9\xf3\xfa\xdc\x13\xf2\x42\x27\x25\x17\x0b\x72\xea\x43\xf2\x07\x9a\x8e\x7a\xdc\x02\x2e\x63\xaf\xe6\x5a\xe0\x14\x1b\xb6\xd7\x5e\x92\xe7\xd9\x9d\xbd\xfa\x26\xb5\x06\xdf\x84\xba\xdf\xfa\xbf\xec\xf2\x61\xc4\x2e\x69\xb3\x1e\xae\x0f\x4f\x74\xd9\x8d\x7a\xc1\x4f\xeb\xe6\xb4\x59\xb0\x51\x87\xb3\xdd\x4b\xf6\xa8\x2e\x8f\x8a\x36\x49\xb9\x4f\x37\x71\x18\x07\x61\x37\x1b\x2b\x00\x4f\x6e\x2f\x3c\x6d\xaa\x77\x09\x1b\x69\x8b\x21\xc3\xe7\x31\x9d\x3c\x5e\x5e\x3d\x9c\xa5\xeb\x6f\xea\x6b\xf7\x2f\x35\xd4\xef\x6f\x4b\x6c\x0f\xcb\x87\xef\x3f\xbc\xbd\xbb\x98\x2e\xfc\x12\x3c\x0b\x23\xfb\x7c\xc3\x7d\xbd\x10\x63\xc7\x82\xa0\x81\x31\xdd\x70\xa7\xc6\xa3\x6c\x38\x43\x52\xa8\xb1\x57\x86\x79\xcd\xb9\x30\x4a\x8b\xb1\xcf\xeb\xdc\x38\xb2\x55\xf1\xb8\x68\x4f\x62\x3a\x88\xea\xe2\x5e\x82\x6c\xb1\x3d\x1c\xf8\xf1\x50\x08\x83\x99\x13\x9c\x30\xce\x70\x8d\x3c\xaa\xa3\xe9\x94\x80\x1e\xb2\x16\x38\x52\x3b\x4c\x30\xd2\x98\x50\xb1\x55\xda\xc6\x41\xc4\x41\x1e\x85\x15\x6e\xda\x96\x9c\xa1\x49\x7f\x9b\xe5\xb6\xd8\x4e\xd7\xf3\x8a\x11\xbc\xbd\x7f\xab\xbb\xb0\xd9\x84\x6e\xa1\x53\x4d\xfd\xa4\x16\x21\xbb\xcb\x1a\xb0\x4d\xbd\x00\xcb\xec\xf7\xcf\x4a\xbc\xff\xf4\x9a\x5f\x7f\x8b\x9c\xbd\x7b\xf5\xf0\xfe\x47\xca\x57\x33\x31\x18\xf8\x60\xa4\xf5\x60\xb7\x90\xa5\xf1\x35\x47\x0a\x13\x5c\x0e\x2c\x6a\x09\x14\x8e\xeb\xf1\x68\x94\x52\xe6\xce\x70\xe4\x11\x3b\x6d\xb5\x54\xca\xc4\x41\x9b\xce\xf4\xc5\x8e\x70\x2d\x08\x8c\x6a\x8b\x3c\xd4\xfb\x18\xbc\xd1\xa0\x2a\x09\x35\x8c\x50\xeb\x90\xb3\x88\x19\x26\x39\xe7\xc1\x6a\x3b\xc7\x12\xeb\x14\x07\x76\xd9\xab\xd4\x1f\xff\x39\xfb\xf3\x59\xaf\xfa\xfe\xdc\x8a\x50\xad\x92\x0d\xe4\x3b\xf0\x30\xcb\x1d\x7d\x83\x88\xbe\xa8\xc1\xa6\x37\xdc\x1d\xf9\x3e\x6e\x73\xd6\x87\xbd\xb5\x14\x03\xf5\x68\x01\xf4\x20\x7b\xca\x5a\x23\xa4\xf2\xd2\x89\x20\xfa\x9c\x59\x42\x2d\x8f\x8a\x42\x87\xc8\xae\xc9\xdb\xd3\xa6\xe8\x1c\x47\xf1\xe8\xc7\x2a\x3f\x8c\xbb\x41\x2a\x40\x41\x03\x64\x1d\x1d\xf0\x51\xbb\xda\x68\xa3\x45\x5c\x03\xbf\x73\xda\xef\xc1\x01\xb7\x8a\x5a\xa3\x7d\xed\x75\xf5\xb8\xf3\x49\xd7\x7d\xe6\x6c\xac\xae\x4e\x4a\x1f\xe7\x75\x69\x79\x53\xda\x79\x1e\xab\xef\x16\x77\xab\x44\xad\x5d\x7d\xb8\x2e\xc8\xe7\x7d\xf3\x5c\xf3\x59\xb4\x7e\x51\xff\x20\xf2\xc3\x48\xef\x58\xdc\x27\xce\x1b\x1c\x03\xb3\x56\x69\x21\xc2\x20\xc6\x6e\xbf\xd9\x0c\xeb\x3a\x1e\x0f\x3c\x74\x0c\xf4\xbb\xb1\x07\x70\x0a\x53\xe3\xa1\x08\xc9\x73\xa9\x2c\xb6\xd2\xfb\xbd\x15\x4e\x39\xc1\x88\xb0\x04\x93\xba\xf5\x40\x5b\xd2\x10\xe2\x04\x11\x1d\x86\x81\xa6\x97\x85\x10\x07\x35\xef\x23\xfc\x89\xac\x7c\x31\x64\xcb\xf3\x75\xf9\xe7\xe7\x0c\x78\x9a\x30\x2f\xf8\xb0\xaf\x5f\xe8\x05\x7f\x7a\x9b\x6c\xb4\x7e\x1f\xcc\x6f\x5d\x9e\xe5\x83\x3f\xbd\x7d\xff\x66\x1a\x78\x77\x1b\xbf\x89\x9d\x04\x38\x5a\x29\x99\xaa\x35\xa3\xf1\xb8\xd9\x0c\xe3\x30\x6c\x36\xc7\xb5\x76\x77\xd0\x6d\xa6\xd8\x85\x8d\x32\x7a\xe7\xf6\xfb\xa2\xf7\x43\xb4\x0a\x98\x62\xe0\x83\xb5\x56\x3e\x7a\xad\xca\x50\xaa\x45\x27\xdd\xb4\xed\x39\x19\x69\xcc\xe2\xc1\xee\xc1\x21\xcf\xe2\x86\x1f\x1a\xdb\x76\x51\x51\xb0\x8d\xfb\x40\x78\xdc\x0d\xae\xbf\x7c\x27\x9a\x72\xaa\xcb\x1e\xf2\x47\xc9\xc7\xe8\xe1\xfe\xe1\xc7\xb2\xa5\xdf\xa8\x96\xce\x31\xcb\x8b\x7e\xfc\xcf\xef\xbf\xff\x00\xc4\x52\x9e\x0e\xb4\x40\x91\x6e\x40\xcd\xa3\xd9\x8f\x87\xc3\xac\x4a\xda\xe6\x90\x45\xd3\x14\xe8\x71\x77\x39\x40\x66\x9e\xb2\xb8\xd5\x80\x2f\xc8\xd6\xfb\xba\x8e\x2c\x42\x0c\xc8\xe0\x5a\x77\x04\x25\xe5\x45\x3f\x1a\xe2\x34\x09\x7a\xe8\x94\x25\xda\x11\xd0\xb3\x03\x3b\xb0\xc8\xc8\xd1\x2a\xcf\x9a\x0d\x25\x98\x56\x46\xef\x71\xc7\xab\x9a\x92\x79\x0e\xcd\xf9\xfd\x3e\xfb\xd9\x99\x03\xff\xcf\x6f\x7b\xd7\xc0\x79\x68\x25\x29\x90\x79\x08\xfe\x03\x90\x3a\xa4\xee\x96\x1f\x2e\xb2\x8b\x60\x79\x1d\x94\xef\xd7\xf9\x11\xa2\x96\xa0\xfc\xf8\x03\x03\xa6\xdd\x51\xb0\xde\x45\x7b\x3c\x2e\xe1\x34\x8b\x46\xc9\x86\x72\x68\xe1\x10\xf7\x0c\x2d\x0e\xa7\x6a\x3a\x72\x03\xca\xae\x61\xd6\x75\x1b\x1e\x79\xb4\x85\x9c\x6d\x7d\x4f\x6b\x82\x3c\x91\x3b\xbb\xdd\xda\x1d\x91\x3d\x65\x5e\x70\xb6\xa8\x45\xec\xe5\x53\x16\xb8\xb5\x12\x73\xe2\x5d\xd2\x87\xcc\x17\xbb\xf3\xf5\xa9\x2e\xae\x56\xd3\x52\x3e\x3b\x75\xae\x3e\xfc\xfc\x97\xe0\x6e\xf5\xf3\xe5\xd9\x0b\xbc\xd8\x86\x0a\xe6\x35\xc7\x8e\xa2\x28\x08\x75\x76\x1b\xca\x6a\x0d\x32\x35\x34\x26\x1e\x14\xf0\x45\x0f\x85\xf4\xd5\x4e\x72\x63\x1b\x4f\x01\xd2\x55\x6b\x63\xeb\xbb\x06\xd0\xe8\xe4\xec\x89\x32\xc7\xb5\xd3\xbe\xf2\xf3\x1b\xbc\xf9\xcf\x33\x76\xf5\xa5\xcd\x2f\x7a\xd5\x5f\xbe\x7b\xf3\xea\xdc\x14\x70\x7f\xd3\x12\xf0\xea\xcd\xdd\xf2\xf5\x0b\x65\x80\xfb\x8f\xaf\xdf\xbd\xbf\x5a\xc6\xac\x3e\xac\xd4\xb8\x05\xc3\x57\x5b\x39\x1f\xf2\xae\xaa\x9a\xba\x22\x71\xe3\xcf\x45\xb1\x2d\x60\x1e\x50\xa1\x76\xb1\xa3\xa1\x13\xd0\xd6\xee\x29\x3b\xd8\x00\xaa\xc7\xc1\x83\x75\xe4\xc0\xd7\xf1\x70\x60\x85\xf6\x36\xca\xe8\x9f\x32\x01\x08\x50\x79\x8d\x60\x52\x2e\xb1\xd6\xda\xb8\xf7\xd3\x4f\x6c\xb5\x26\x0c\x41\xcc\x89\xe3\x5c\x02\xdf\x10\xa5\xed\xa0\x1d\x27\xe2\xcc\xdf\x65\x2b\x57\xb4\xd9\x1f\x5e\x11\x85\xbf\xfc\x3b\xf9\xbb\xef\x6f\x30\xcb\x4b\xb7\xf8\xf2\x1b\x4c\x61\x1a\x41\xbf\x81\xab\xdb\x0c\x01\x94\x61\xbb\x05\xe8\xb1\x01\xe5\x00\x14\x28\xe3\x31\x97\x61\x0c\x21\xe4\x6a\x4c\xc7\xa2\xdf\xed\x7e\x03\x2d\x77\x37\x7d\xbd\x1b\x9e\x01\xe7\x2f\x79\x06\x64\xe5\x8a\x7d\x8a\xe2\x2f\x7e\x36\x7f\xf9\x2d\x9a\xf0\xfa\x3c\xbf\xef\x56\x17\xd3\xe8\x3f\x01\xe7\x29\x7e\xe1\x7b\x5d\x02\x98\xe5\xb7\xa9\x4a\xf2\xe2\x06\x2c\x97\x4d\xae\x37\x9b\xd1\xe7\x9b\x93\x44\x05\x8d\x8e\xeb\x9c\xaa\x18\xe2\x10\x87\x31\x70\x60\x40\x19\x25\xa3\xd1\x82\x03\x8e\x32\x6f\xc6\xa6\x6d\x13\x71\x3f\xd7\x60\xfb\xb8\xb9\x3e\x72\x09\x5a\x48\x9a\x23\x41\x8c\x6b\xdc\x15\x1b\x8c\x3b\xb3\xc1\x71\x4b\xad\xa4\xd2\x70\x2c\x91\x2f\x6b\x42\xa9\xa5\xa0\xc6\x1b\x43\x29\x4d\x0c\x2e\x39\x05\x9a\x15\x66\x14\x66\xcb\x4c\x3d\xc9\xc4\x85\xbb\xc4\x6a\xdf\x64\x61\xf7\xb7\xab\xd9\x19\xec\x7a\x01\x33\x7f\x93\x85\x6e\x01\xf4\x8b\x72\x2e\x75\xc9\xa8\x36\x20\xe3\x71\xbd\x1b\x87\x3e\x06\x01\x60\x13\x35\x90\x71\x0f\xda\x45\x79\x3a\x5e\x0e\x0c\x64\x33\x45\x1f\xf9\xfa\x2b\xca\x7d\x6c\x0a\x2b\xa5\x10\x2e\x66\xce\xd0\x46\xef\x07\xe7\xa4\x76\x79\x26\xa6\xa0\x66\x0a\x6d\xbc\x94\x4e\x79\xaf\xe6\x58\x75\x93\xa9\xb4\xe7\xdf\xea\x11\xbc\xfc\x48\xa9\x4a\x7b\x0e\x3b\x17\x1b\x0f\xe1\xd6\x83\x36\x8a\x3c\x7b\x24\x39\x89\x03\xa1\x76\x8d\xa6\x98\x2b\xe4\x66\x74\x45\x53\x93\xba\x6d\x9d\x77\xce\x33\x22\x7d\x44\x91\xd9\x75\xca\xf3\x48\x3a\x4f\x7f\x3f\x61\xb8\x7f\xfd\xec\x63\x9f\xa6\xf3\x2f\x2f\x5d\x69\x2f\xfa\x75\x53\x48\xfe\x11\x9c\x49\x5f\xf7\xbf\xf8\xee\x01\x7d\xb9\xe9\x61\x78\xfb\x3b\x60\xf5\xe1\x5f\x80\x2f\x6f\x57\x32\x7c\x15\x61\x81\x21\x6a\x30\x92\xc9\xea\x10\x58\xd4\x75\x5a\x9a\xb0\xe5\x6b\xb7\xd1\x5b\x5d\x47\xd8\x9c\x6c\x2e\xc6\x36\x2c\xea\x56\x01\x0c\x76\x04\x42\x87\x18\x19\x87\xa8\x7c\x28\xcd\x5a\x07\x5d\xf6\x85\x8a\x43\xd3\x00\x9c\x3a\x15\x7a\x69\xe5\x36\x58\xcd\x99\xc4\x1e\x11\x3d\xe5\x8f\x16\x94\xce\xba\xc8\x6a\x04\x91\x67\x1b\x8c\xa8\x04\xfb\xb8\x8b\x07\x6d\xd9\x61\x7f\xe6\x8b\xb2\x55\x28\x74\xe2\xf4\xfd\x17\xdf\xba\x48\xbd\xfe\xee\xcf\xc0\xea\x2d\x9a\x41\xc3\x57\x1f\x7f\xb1\xfa\xee\x4d\x12\x7d\xfb\x78\xff\x11\xa4\x7d\x79\x5a\x5b\xef\xcf\x9c\x93\x2c\xa4\x65\xa7\x8f\x64\xca\xcb\xdd\xa6\x23\x2e\xae\x63\xa3\xa8\x71\xc7\x32\x20\x1d\xc6\xed\xc6\xef\xc6\xda\xae\xa7\x70\x17\xad\x2d\x97\x81\x52\x0d\xca\x42\xaf\xbd\xf3\x1b\x37\x54\xad\x52\x56\x88\x35\x90\x56\x6b\x0c\x8e\xb3\x16\x79\xc7\xe3\xa1\x31\x1b\xcf\x94\x1c\x79\x8e\x30\x31\x5d\xea\xbd\xae\x57\x3a\xf1\x3a\x7f\x22\xaf\x7b\xfd\x63\x55\xf5\x6f\xf2\xba\x73\x08\x3f\xa3\x27\x24\xd7\xc9\x95\x28\x2d\x2a\xf5\x0f\xf5\xa2\x4a\xfd\x22\x1e\x2d\xc9\xd7\xbe\x29\xca\xc7\xe3\xe5\x18\xcc\x21\xb6\x02\xe0\x45\x09\x28\xc0\x24\x6e\x63\x5f\x6c\xea\xda\x52\x45\x8c\x21\x8a\xa6\x9c\xae\xa7\x07\x76\xa0\x9d\x14\xc4\xd6\xb4\xa6\x8e\xa1\xb3\x37\xae\x4d\x3d\xb7\x97\x9e\x33\x9c\xfa\x41\x6e\x15\xfe\xde\x9e\xdb\xec\xd1\xfb\x79\xc2\xbd\xf9\x66\x7d\x49\x06\xe7\x9f\x97\x97\xbf\x70\x9b\xae\x5c\x79\x4d\xeb\x26\xef\x47\x92\x7b\x21\xa8\x27\xa3\x19\x21\x04\x0e\x88\x51\xe5\x61\xe4\xeb\xf3\x32\x92\x3d\xca\xcb\x23\x0e\x51\x74\xbb\x47\xba\x44\x89\x60\xc1\xbd\x91\xd0\x18\xf6\x75\x07\x86\x60\x95\xf1\x85\xe7\xdc\xd0\x48\xa4\x22\x82\x94\xae\x14\xd3\xb7\x23\x84\xec\xa6\x03\x41\x5e\x0e\x84\x58\x2b\x79\xe5\x2a\xaa\x20\x13\x46\xd2\x59\xd3\x24\xcb\xfb\x55\x56\xb8\x6b\x7e\xf8\x63\x6d\x81\xec\x2e\xfb\x9a\xcd\x7a\x85\x3d\xa0\x1e\xe0\xc2\x45\xea\xd6\xd3\x4f\x8a\x89\xd9\x4a\x15\x7d\x8a\xb6\xfe\x79\xf6\x5f\x27\x05\xac\x0b\xe9\x7e\x76\x12\x78\x38\xb7\xd3\x7f\x9c\xfb\xb6\x8b\xe5\x87\x2f\xe7\xb0\xfe\x05\xa9\xf2\xfe\xed\xfd\xb3\x78\xfa\xe7\xdc\x79\x4a\xa6\x2d\x54\x68\xeb\x98\x43\xc0\xed\x0e\x87\xdd\x4e\x4b\x18\x5d\xdc\x72\xf5\x94\x59\xb5\x95\x9b\x3b\xc6\x19\x11\xb5\xaa\xeb\x5d\x38\x71\x5b\xd3\x40\xb0\xd8\x82\x2e\x8a\xb2\xca\xa1\xdf\x05\x1e\x3a\xcc\xfd\xce\x07\x37\x40\x64\x2d\x0d\x55\xd1\xb3\xc3\xda\x86\x70\x52\x42\x54\xa1\xc2\xf9\xe1\x91\x2f\x69\xec\xa8\x54\x63\x99\x13\x82\x4c\x9f\x9d\xd7\xe0\x50\xec\xcf\x5e\x8c\x74\xda\x49\x6f\x15\xf0\x6f\x79\x9e\x7f\x01\x1e\x5e\x4f\xeb\xc8\x33\x22\x78\xa1\xf5\x7d\x23\x8e\xff\x2a\xb9\xab\x01\xbe\xe4\x23\x44\x75\x51\x46\xba\x05\x25\xdf\x07\x21\x54\x40\x8d\x24\x23\x63\x40\x80\x8d\xac\x42\xdd\xc4\x32\x72\x17\xac\xec\x87\x68\x73\x8c\x51\xe4\xe1\x36\xd6\x74\xf9\x91\xe2\xf1\xa8\x8b\xfd\xd8\xd5\xc8\x5a\x1c\x98\xd4\x42\x54\xb6\x12\xf0\x58\x57\x58\xd3\xc0\x88\x04\x58\x60\x4b\xad\x45\x35\x08\x6c\x47\xb7\x24\x12\x8c\xc5\xb9\x66\xc4\x57\x61\x59\x65\xbf\x97\xa1\xec\x9f\xde\x78\x1b\xbf\x88\x81\xdf\x9f\x35\x91\xef\xae\x02\x54\x3f\x52\xa4\xfa\xb0\x4c\x75\xfb\x79\xe7\x3d\x77\xe0\x9f\x6f\xb3\xe9\x19\x6a\x85\x46\x28\xd2\x58\x21\x50\x0f\x56\x1b\xb0\x27\xc0\x6a\xe6\x20\x3a\xc4\x63\x6d\x84\xc5\x44\x1b\x34\x72\x4d\x4d\x59\xc5\x7d\xec\x91\x53\x96\x12\xd7\x30\x80\x02\x04\x06\xf4\x3c\xd2\x48\xe2\x26\x12\x9e\x6b\xa0\x45\x3c\xc4\x8a\xe5\x19\xd8\x8b\x18\x46\xc1\xf2\x4d\x4e\x44\xc4\xa7\x86\x2d\x4c\x71\x50\x96\xd6\x98\x56\x8a\xf9\x5a\x52\x4c\x0e\xda\x50\x82\x49\xa5\x98\xad\x39\xa9\x60\x5d\x0b\xc5\x60\x89\xa7\x37\x60\x41\x4a\x44\x1a\x5c\x29\x6a\x59\x08\xca\x19\x2a\xdb\x5a\x93\x4a\x6e\xa9\xe2\x4c\xc6\x03\xd7\x32\xed\x67\x24\xab\x56\xa1\x38\x66\x6f\xb2\xff\x7f\x46\x9e\x95\xd9\x13\x72\x58\x5c\x1b\x95\xdf\x25\x1f\xc5\x6f\x17\xb6\x6b\x2b\xd4\xc3\xa7\x87\xc2\x19\x84\x72\x28\x5c\xb7\xa3\x71\x38\xc4\x6d\x94\x04\xf0\xa3\xe6\x52\x33\x00\x81\x73\x3c\x42\x13\x6b\xd0\x07\xb0\x8b\x68\x5a\xa5\xf3\x6a\x3c\x24\x3f\xa6\xd4\x3d\x48\x8a\x23\x45\xd0\x08\x86\xa1\x41\x5c\x60\x0b\x09\x66\xa4\xd6\x6a\x83\x29\x8d\x6b\x21\x2c\x33\xdc\x0a\x61\xb9\x61\xf3\x18\x9e\xf6\x8c\x75\xf6\x7d\xf6\xc7\x67\x5f\x8b\x0c\xdc\x7c\xb4\x99\xf9\x9c\xdf\xfd\x63\xf0\xe1\xe3\xaf\xfe\x05\x98\xc7\xea\x0c\xb7\x81\x39\xe3\xfe\x09\x3d\x90\xbb\x6a\xcc\x12\xb6\xa6\xbf\xf6\xb0\xd8\x3c\xd6\x70\x29\x51\xb3\xdd\xa2\xb6\xe5\xa4\xfa\xea\x65\x5c\x03\x12\x80\x18\x5d\xc1\x15\xb5\x44\xed\x44\x1d\x6a\x3e\x6e\x1c\xb3\xce\x81\x8d\xa8\x1b\xc4\x8b\xf5\xf4\x11\xad\x30\x22\xba\x8d\x47\xce\x82\xc6\x76\x1d\xa8\x4e\x1b\x2e\x98\xe0\x58\x2a\x62\x24\xc2\x1b\xcb\xad\x53\x86\xb8\x14\x57\x80\x9c\xa7\xeb\xe0\x92\xcf\xde\xdc\x43\x3e\xe7\xda\xc9\x48\xe2\xbb\x17\xc4\xeb\x67\x36\xde\xbb\x2f\x1f\xe6\x0c\x29\x0f\xc5\x30\x1e\x08\x53\x74\x63\x5d\xbb\x07\xa8\xd7\xed\xba\x74\x8d\x50\xd0\x48\xca\xe2\x3e\x3a\x01\x3c\xa0\x10\xee\x63\xcf\x01\x3e\xd0\x8d\x93\xa0\xdc\x8e\xc7\xc2\x39\x8a\xb9\x51\x4e\x07\x69\x5b\xdb\x28\x8c\xd7\x1e\x06\xc8\x85\xd8\x18\xaf\x7a\x0e\x1b\xe5\x44\xc0\xb2\xb6\xd4\x25\xdf\x65\xb6\x32\x45\xf7\xff\xb9\xef\x32\x5c\xf6\xa3\x02\x2c\xfc\xd8\x77\x39\xc4\x7e\x3a\xeb\xfc\x19\x7e\xfb\x29\xdf\x65\x56\x74\xe3\xa0\x19\xf3\xc2\xd3\x29\xa1\xa0\x5e\x78\xc6\x34\xe0\xa9\x09\x9b\x31\x36\x0e\x67\x6d\xea\x45\xd2\x4c\x91\xcb\x2c\x79\xa3\xfc\x9b\xdb\x7c\x73\xf9\xe6\xa5\x84\xd9\x97\xef\xde\x7c\x5e\xfe\x16\x05\x94\x1b\x51\x9a\x54\xe5\xfb\xf2\x10\x16\x28\x45\x55\xf9\xe1\x07\x52\xac\xb5\x70\x5a\x8b\xd0\x1e\x5a\x6e\xad\x36\xbc\xdb\x74\x27\x11\x0a\x19\x46\x06\xe1\x82\xcb\xb9\xb5\x9a\x8c\x19\xc3\xdd\x50\x5b\x85\x1d\x8a\x43\x6c\x6b\xce\xa2\x0f\xb9\xc4\xe3\x50\x98\x94\x8d\xba\x92\x62\x82\x6a\x49\x08\x43\x0a\x22\x04\x65\x4d\x48\x99\xfa\x8b\x25\xa9\x23\x9d\xdb\xab\x41\xa5\x71\x89\x08\x36\x1e\x0b\x0c\x1d\x53\xb1\xce\x53\x9b\x75\xe2\x84\x92\xb4\x97\x95\xc9\x3b\xfc\xec\x1f\x7c\x91\x88\x79\xbd\xb8\x1d\x61\x9f\xfe\xd9\x87\x57\x09\x42\xff\xee\xcd\xc7\x2f\x6f\xe6\x66\xd9\xef\x3f\xdc\x26\x4d\x3d\x90\xcc\x51\x02\xfc\x49\xdc\x35\xeb\xd6\x58\xaa\x90\xe1\xb8\xee\x37\x71\x13\x4e\x5b\x86\x77\xa2\x11\xc7\xc7\xc3\x11\x93\x45\x15\x62\x16\xc2\xb4\xd7\x17\x88\x49\x2e\xfc\x10\xe2\xba\x6d\x9a\x06\xb6\x88\x73\x1f\x80\x7e\xd4\xcb\x7a\xa7\xec\x0e\xaf\xbd\x17\x2c\x8a\x71\xc3\x79\xce\xa2\xdf\x4f\x7b\x78\x9d\x67\x2b\x54\xb4\x67\xb7\xc1\xdf\x3f\xd7\x91\x1f\x66\x56\xd4\xec\x62\x7e\x7f\x16\xf7\x29\xd6\x0d\xce\xb3\xb1\x23\x15\xad\x5d\x17\xeb\xa6\x89\xa1\x69\x8a\x8d\x24\x9e\x88\xa2\xc5\xce\x1b\x24\xb0\xda\xef\xc6\x26\xc7\xe3\xe1\x28\xb5\x98\x16\xc1\x45\xd6\xe7\x6a\xe5\x52\xbd\xfa\x5d\xf6\x8f\xb2\x0c\x54\x53\x98\x7c\xff\x70\xff\x42\x83\xfb\xfe\xfd\x6d\x37\xf9\xb9\x13\xac\x58\xf7\x52\xd2\x9c\x56\x98\xc0\xd2\x55\x2c\x58\xfa\x88\x73\x1f\x8f\xce\xc0\x38\x44\x47\x40\xbd\x2f\x2a\xce\x38\xe3\x05\x8b\x5e\x2b\xda\x82\x2a\xfa\xba\xc2\x1e\x76\x8a\x08\x00\x95\xdd\x42\x64\x24\xf5\xf8\xc8\x29\x97\x82\x66\x45\xe2\x1d\x99\x62\x9b\x6a\x76\xbf\x7f\xa3\x46\x76\x25\x19\x9d\x3d\x27\xa6\x14\x7e\x8e\xda\xbe\x09\x36\xde\xce\xac\x0d\xd0\xb7\xa8\x06\x64\xdc\xe5\x24\x44\x19\xb6\x58\x27\x09\x84\xa6\x5f\x0c\x51\x02\x7b\x16\x99\xaf\x77\xa1\x0f\x53\xf2\x54\x6c\x11\xa7\xb1\xd2\xe3\x5a\xb8\x62\x27\x22\xef\xc7\x66\xbb\x5d\x20\xdf\x8f\x5b\x29\xab\x50\x71\xa0\x4f\xdb\x45\x3d\x36\xf9\xa1\xcf\xb2\x22\xef\x53\x4e\xbe\xcd\x7e\xf7\x8a\xd9\xce\xba\x05\xef\xde\x4f\x6b\xd3\xea\x52\x52\x7b\xa1\xd6\xfc\xf0\xe9\xed\xab\xdb\xae\xe1\x43\x53\x41\x90\x01\xc4\xe3\x3e\x1e\xda\xd8\x2b\xa0\x45\x1e\x9e\x32\xb0\x89\x8c\x3b\xce\xa0\x10\x64\xda\x20\x8e\xa5\xb1\x1b\xd9\xe4\x07\x67\xad\x0e\xc5\x16\x23\xd8\x2b\x6f\x76\x7d\x50\xfd\xd6\x36\x2e\x6e\x94\x44\x01\x71\x50\xbb\x26\x36\xb2\x35\x4e\x78\xdd\xa8\xe0\x12\xc6\xc4\x56\xbe\xe8\xae\x4a\xd2\x9f\xbf\x45\xce\xf2\x97\x86\x3f\xd7\x2e\xe8\x37\x77\xdf\x08\x87\x02\x57\x1c\x46\x42\x0a\x18\x49\x0b\x2a\x1e\xdb\x61\x3c\x1e\x63\xaf\xf6\xdb\x48\x72\x81\x50\xf4\x61\xd1\x9d\xe8\xe5\x00\x2c\x28\xb5\xdd\x13\xee\x3a\xe7\x6a\x14\x5d\x14\x75\x57\x74\x23\x66\x53\xae\x69\x76\x4f\x99\x73\xa2\x75\xa8\x06\x47\x11\xf7\xe9\x3f\x86\x5b\x5e\xd5\x98\x50\xd7\xd0\xba\x66\xd0\x9e\xbd\xff\xd5\x13\x5f\x35\x89\x17\xfc\x90\x32\xc2\x7f\x79\x66\xe2\x3e\x7b\xf2\x2c\xe7\x9d\xfa\xcb\x2d\xcf\x62\xf9\xe1\xf3\xab\x79\x2b\x79\xf8\x78\xff\xf6\x42\x6d\x7f\x51\x2b\xfb\x25\xb8\xd9\x02\x7b\x4f\x78\x20\x8c\x1f\x17\x95\x64\x94\x49\x50\xd9\x80\xf3\x72\xda\xd5\x59\x1c\x0e\xbb\xd8\xd3\x7d\x80\x95\x0e\x81\x9f\x2a\xe7\xf6\x60\x97\x1a\xbc\x99\xe5\x14\x4d\x17\x0a\x6d\x9c\xd9\x98\xf5\x02\xb6\xca\xcb\xb6\xd8\xd4\x4d\x38\x65\x8b\x4c\x32\x0f\xf0\x9a\xd0\x1a\x29\xdf\x21\x6e\xbd\x20\x28\x60\x21\xeb\x00\x41\x8d\x4a\x4e\x98\x3a\xb5\x80\x1a\xe3\x9e\x32\x2d\xaa\x06\xb2\x3d\x66\xde\x1a\xa5\x6d\x10\xc1\x4d\x63\x4d\xa7\x6b\xd8\xde\xb8\x2c\xfc\x86\x2c\xeb\x5b\x31\x8c\xab\xca\x41\xbe\xc9\xb3\x90\x97\xe3\x71\x4a\x0f\x73\xfa\x75\x97\xb3\x48\x40\x1f\xb3\x42\x1b\xc3\x35\xf2\x4c\x9e\x0e\xde\x2f\xaa\xd3\x61\x3a\x0a\xa2\xb5\x61\x9a\x39\xc7\x34\x8b\x38\x96\x42\x20\x5b\xd1\x6a\xc8\xc3\x86\xee\x13\xdf\x5c\x65\xbb\xc4\xdf\x41\x49\x7b\x2b\x03\x2f\x30\xa8\x67\xc7\xe9\x2b\x3c\x09\x1e\x5e\xe7\x09\xd5\x98\x66\x6d\xd1\x42\xce\xb5\x82\x42\xa3\x8d\x3f\x89\x62\x6d\x3d\xa5\x6b\xa7\x7c\xf0\x3b\x15\xc5\x23\xcd\x7d\x17\xb1\x00\xae\x89\x78\x53\x6c\x1f\xeb\x05\x29\x9f\x32\xce\xaa\x50\x41\x40\x28\x73\x81\x51\x46\xb9\xd3\x86\x49\x66\x5b\x60\x5c\x3c\x36\xc6\xae\xa3\x4e\x1a\x08\x36\xf1\x97\x5d\xf6\x3a\xcd\xcc\x2f\x29\x0a\xce\xc0\xcc\xf2\xba\x75\xa8\x79\xf5\xf0\xea\xfd\x4f\x3e\x7b\xeb\x2f\x72\x1b\xfb\x2e\xb2\xb1\xcf\xb7\xe3\x0e\xe5\x52\x35\x5c\x23\x23\x68\x5d\x8d\x46\x2e\xdb\xb1\xcb\x87\x71\x57\xe7\x46\x05\x61\x90\x13\x04\x97\xa3\x54\x27\xd3\x7a\x65\x9b\xc5\x76\x13\x94\x6f\xa3\x85\x4f\x59\x1c\x10\xe0\x85\x99\x1e\x75\x10\x88\x85\xb3\x36\x5a\x3b\xb6\x7b\x14\x90\x01\x6b\x60\x4b\x63\xa3\xb3\x63\xbb\x83\x01\x59\xd0\x02\x1b\x39\x15\x4a\x50\x35\xdf\x7a\xc5\x02\x93\xe9\x76\xd6\x40\x7d\xe2\x2b\x5e\xec\xb2\x7f\x9b\xf8\xc6\x6f\x5e\x18\xf0\x3c\xac\xce\x6c\x9b\xbb\xd5\xb4\x88\x3e\xbf\x72\x9f\xca\x14\xd3\x0b\x67\x19\xc7\xd7\x33\x76\xf3\x6e\x56\xf8\x9f\xb5\x53\xc1\xe7\x4f\xbf\xfa\xf4\xb0\xfa\xf8\x3a\xa7\x01\x15\xc1\xf6\xb2\x41\x03\x97\x6c\x24\x65\x09\x4a\x1f\x6b\xb5\xe3\x55\x55\xf4\xb6\x97\x01\x75\x42\xd2\x91\x01\xe6\x62\xa5\x62\x49\x80\xd2\xb1\xb1\x00\x47\x6f\xd7\x1c\x64\x4e\x5b\x0e\xe8\xfa\x28\x24\x07\x08\x58\x58\xc6\x81\xf1\x62\x87\x71\xa4\x5d\xed\x6b\x7d\xb4\x10\xd9\xa3\xa4\xa8\x82\x11\x77\xd8\x63\x03\x32\x0f\xf5\x7e\x53\x1b\xc8\x77\xaa\x55\xdc\x29\x8b\x2a\x53\xb3\x81\x62\xe7\x9f\x32\x4c\x38\xb1\xf3\xf7\x07\x7a\x15\x8a\x21\x79\xf8\xbd\x98\x17\x37\x4e\xa4\x69\x6a\x7c\x9f\xec\x48\xdf\x81\x32\x6f\x9a\x3c\x8c\x6a\xc1\xa3\xdc\xae\xb5\x90\x63\x33\x22\xd4\x6d\xc6\xe3\x82\x8e\xb2\x68\x6a\xc4\xc6\xd6\x74\xe0\x58\x48\xad\x9d\x75\xca\x1a\x46\x68\x6d\xb9\x71\x36\xba\xaa\xe2\x42\xa2\xf3\xba\x1a\x52\xdd\xee\xef\x65\x6f\xb3\x3f\x9b\x99\xce\xcf\xab\xc9\x43\xfa\x1c\xd3\x0a\xbb\x48\x42\x91\xc5\xd9\xa6\x18\x9c\x2b\x9f\xcf\xa8\xe6\xfb\xef\x93\x59\x6a\x02\xcb\x97\xad\x12\x46\x98\x53\xa3\xa8\xa1\x32\x2f\x9b\x45\x36\x0e\x07\xd0\xd0\xf1\x78\x44\x4d\x19\xfb\xa8\x15\xe0\x00\x8e\xdb\xfc\x78\xea\x73\x2f\x1b\xb6\xd8\x47\x48\x6c\x4e\x75\x5c\xc7\x6d\xec\xc7\x1d\x03\x1e\x64\xdb\xb5\x12\xe3\x61\xd1\x35\x2c\x62\x42\x8a\x1d\x33\x4c\x31\xce\x05\xe3\x7c\xb0\xa1\xf6\x0c\x94\x87\xc3\x41\x39\xea\xed\x78\xf0\x48\x3b\x23\x8d\x16\xc4\x60\x0f\x69\x0d\x85\x58\x53\x4d\x71\xf2\x25\xbd\xe0\xec\x0f\x57\x3f\xc8\x79\x9f\xfb\x70\x7f\xa9\x88\xbd\x59\xbd\x7b\xff\xe5\x8c\x99\xdf\xcf\x14\xef\x14\x5b\xbd\xfb\x70\xb7\x38\x13\xbb\x16\x07\x53\x41\xd0\x82\x4e\x6c\x63\xdd\x6d\x14\x75\x8c\x6f\x64\xb4\xd1\x88\x71\x0b\x4c\x1d\x8f\x7b\x6e\x0d\xce\x91\x07\x6b\xdc\xd4\x10\x34\xb1\x3b\xb4\x87\xb9\x42\x5b\x0c\x1c\x56\xbd\x6c\x68\xcc\x30\x93\x52\x48\xca\x43\x2f\xf5\x41\x79\x46\xe4\x82\x62\x14\xc2\x46\x11\x26\x8c\x35\x4f\x99\x10\x83\x4c\x71\x8d\x7a\x62\x45\x5d\xe8\x8b\xf7\xcd\xab\x5b\x0a\xef\x1c\x48\x24\x89\x8b\xe9\x8f\xf2\x01\xd8\x60\x6d\x88\x36\x78\x50\x27\x0b\x18\x1b\xed\xc2\xef\x76\xbb\x9d\x3f\x31\x21\x16\x9b\x78\x04\xe5\x48\x40\x9d\x6a\x0f\xfd\x13\x5f\x99\xc2\x64\x8b\x73\x64\xf6\x26\xfb\x83\x84\x93\x64\xc9\xcf\xf8\xfc\xcf\x83\x4f\x0f\x7f\x90\xcf\xd4\xe7\x5b\x4f\x86\x65\xc2\xed\x96\x30\x84\x88\x7c\xdc\x4c\x19\xe1\xe6\xd2\x69\xb3\x24\x56\x06\x6e\x23\xf2\xdc\x38\x9d\x87\xb0\x1d\x1b\x96\xc3\xc2\x9c\x86\xbc\x7f\x0c\x32\x14\x4d\x1c\x9a\xc6\xb6\x6d\xc4\x6d\xde\x34\x1d\xed\x43\x8d\xe3\x61\xcb\x86\x1d\x89\x34\x78\x33\x6b\x78\x89\x33\xa6\xf8\xbb\x29\xa2\x7b\x78\xfd\x8b\x14\xc7\xa6\x1d\xfe\xcd\xd5\x98\x61\x1a\x9a\x17\x9c\xf9\xf3\x19\xb9\x2d\x17\xbe\x3e\x3e\xc2\x05\x85\x70\x84\xca\xa1\x05\x8d\x75\x95\xb3\x08\x15\x68\x44\xe4\x5e\x44\xa4\x41\x2b\x22\xcc\x11\x8c\x5b\x42\x4d\x5b\x68\x5d\x59\xe7\x08\x8b\xfb\x9a\x3a\xeb\x1a\x19\x0c\xc8\xf6\xce\xa9\xc6\x11\x46\xb1\x9c\xce\x92\xcf\xeb\x55\x28\xec\x35\xc6\x4c\xc4\xeb\xe4\x65\x7b\xeb\xc8\x94\x2c\x8e\xaf\xee\x37\x73\x8c\xb9\xdc\x47\x1f\x8c\xcd\x3d\xc5\xa8\x74\x95\xd0\x56\x7c\xdd\xe5\xfe\x29\xdb\xc1\xb8\x8d\x01\x07\x7f\x28\x6a\x25\x85\xd4\x8b\x63\xb5\xed\x84\xdb\x84\x68\x31\x76\x68\xa3\x08\x01\x9d\x8d\xc7\xda\x52\xec\x2b\x08\x20\x67\x4a\x29\x9e\xc6\xf4\xe1\x89\xad\xaa\x82\x9f\x63\xcc\x7f\x94\x74\xe2\xef\x3f\xff\x1a\x3c\x07\x3b\xf7\x6f\xa6\xbc\x6c\x3a\xbe\x75\x0f\x5b\x6c\xc7\x35\xb4\x3b\x6b\x9b\xc6\xd7\x38\xee\x9e\x32\x16\x40\x17\x29\xe8\x16\xbd\x10\x84\xd6\x0a\xa3\xd8\x86\x82\x8f\x38\xea\x0a\x31\x2f\xc2\x56\x51\x22\x19\x2f\x36\x2e\x84\xb8\x6b\x1a\xd0\x9e\xac\x14\x28\x20\x96\xf7\x8f\x6e\x59\x9e\xb9\x79\xac\x90\x85\x39\x7b\x7e\xcc\x9d\x4f\x1f\x5f\x7a\x35\xa5\x34\xeb\x52\xf9\x5b\xdc\xe4\xf0\x39\x6d\x80\xd5\x1a\xb3\x5a\x61\x3e\x4e\xa3\x79\x9f\xeb\xd1\x4f\x07\x12\xdc\x32\xb9\x40\x4e\x70\x27\x0b\x13\xdd\x98\x09\x89\x5c\xc5\x44\xdc\x2e\xda\x78\x70\xd1\xda\xbc\x17\x5a\x2a\x25\x88\x13\x4c\xcd\x9c\x0d\xbe\x0a\xc5\x26\xb9\xf7\x5c\x6a\x34\x89\x09\xf3\x4c\x9c\xfa\xfe\x03\x78\xe9\xe4\xfd\x9b\xfc\x9d\xa6\x29\x91\x6b\x41\x41\x4f\xeb\xa6\x26\x39\x3a\x0e\x60\x8f\x49\x61\x1b\x6e\x94\x84\x52\x21\x34\x4a\x75\xd1\xd9\xa2\xe1\x7c\x32\x23\x5d\xb0\x29\x7f\xe1\x92\x4b\x42\x89\xf7\x04\xc7\xcd\x69\xaf\x39\xf4\x10\x91\x7c\x38\x1d\x85\xa8\x5c\xc9\x44\x1c\xa6\xc9\x69\xa2\xd7\x40\x8e\x7a\xce\x71\x67\x7c\x24\x64\xaf\xe6\x68\xe9\x05\xd3\xed\x2c\x10\xf6\xea\xa6\x47\xfc\x05\xc3\x78\x9a\xaf\x06\x1c\x9a\x1c\x36\xd3\xa7\x68\xc6\x7d\x13\x2b\x98\xaf\x19\x6d\x6a\xbc\x70\xa7\x32\x2c\x36\xcd\xa9\x6d\xda\x81\x01\x71\x98\xd2\x8b\x85\x38\xb5\x05\xd2\xda\x18\xd7\x34\x4d\x13\x8f\x42\x11\x46\x9d\x1b\x7b\x29\x41\x2b\xa9\xd7\x9b\x88\x86\x19\x9b\x9b\x3e\xd7\xf6\x8a\x99\xcf\xd1\x49\xc2\xfc\x67\x51\xe7\xfb\xb7\xb7\xbd\x79\xb7\xa7\x10\x7c\xac\xee\xa6\xcc\xec\x16\xb4\x59\xb4\x4d\x6e\x87\x61\xb4\xcd\x18\x72\x75\x1a\x16\x78\xba\x4f\x4c\xdf\x74\xec\x9b\xe6\x31\x6b\x44\xb0\x46\x00\xe3\x6b\xe7\x5c\xbe\x56\x24\x60\x55\x6c\xe5\x53\x66\x8f\x23\xcb\x37\xd6\xd8\x29\xf0\x34\xd1\x9b\x38\xcc\x2d\x98\x07\x6d\xd8\xd0\xa1\xe3\x96\x6d\x87\x6e\x8f\x0f\x9b\x34\x67\xf6\x4f\x74\x55\x16\xf6\x9a\x47\x3c\xf7\x82\x25\xa9\xac\x19\x41\xcd\x96\x1f\xde\xfd\xec\xa2\x26\x90\x1a\x3e\x76\x5a\x6a\xeb\xb5\x15\x40\xb7\x91\x2d\xbb\xd3\x1a\xe3\x05\x8b\xc3\x63\xc7\x16\x3b\x50\xc6\x5d\x3c\x80\xaa\x01\x30\xee\x4f\x21\xb5\x0a\x5a\xca\x8d\xe6\xa4\x76\xb2\x07\xc7\x58\x32\xe2\x22\xf7\xad\x04\x24\x37\xfb\xfd\x7e\x7f\xde\x93\xa6\x78\x38\x64\x7f\x98\xe1\xec\x53\xf6\xaf\xcf\x57\xf8\x63\x62\xdf\xfe\x44\x2d\xf4\x01\xbc\x48\x0a\xae\xf2\xec\x2f\xa2\xe8\x33\x5e\xe3\x40\x16\x0e\x87\x0d\xde\x73\x25\x18\x12\x9c\x68\x4d\x83\x7b\xca\xf2\xc3\xc2\xea\x66\x7d\x24\xb1\xdf\xf6\x71\x20\x87\xd6\x48\x79\x94\xc6\x8b\x51\x00\x39\x9b\xe9\x0c\x11\x87\x88\xc1\x10\x9b\xc5\x7a\xbf\x0f\x7b\xea\x53\x61\x14\x36\x48\x00\x84\x60\x40\x35\xa8\x00\x73\x5e\x12\x14\x6a\x9d\xaa\x13\x53\x20\xc7\xe5\xb8\x33\xc6\x19\xb7\xdf\x3b\x93\xbe\xdf\xf1\x49\xad\x78\x61\xb3\xd5\x19\xe1\x4b\x8e\xb5\xd3\xea\x78\xfd\xc4\xbf\x98\x46\x6e\xf2\xb2\xbf\x2e\xe1\x7f\x01\x1e\x6e\x75\x57\x56\xf5\x57\xb5\xec\x7e\x68\x01\x03\x7b\x3f\x9d\xc9\x32\x57\xe3\x16\xa0\xad\x8a\xbb\xd8\x87\xd8\x09\x00\x5d\x14\xd3\x42\x0e\x07\x0a\x3d\x24\x8b\xda\x61\x62\x48\x61\xdd\xe3\xd1\x2d\x61\xdc\x69\x6d\x3d\xc1\x56\x29\x1b\x4c\x50\x96\x6b\x4b\xa6\xf8\x80\x63\xce\x6a\x2c\x29\x65\x97\x6b\x11\x12\x37\xe3\x97\x57\xed\xf4\x1b\xc5\x93\xe7\xfc\xe4\xd2\x37\xb9\x7c\x73\x57\x2c\x3f\xfc\x31\x78\x73\xa9\xfd\x98\x91\xe4\x7d\x93\x77\x23\x4d\xf5\x1f\x76\x1c\x16\x6c\x74\x4b\xd5\x3c\xf6\x4d\x1e\x5a\x12\x4d\x84\x0c\xf4\x40\x1c\x80\x07\x8a\x46\x1b\xdd\x22\x70\x2b\xa5\xe5\x86\x3b\xc7\xe3\x2e\x0a\x50\xc7\x35\x18\x3a\xd8\xed\x49\x40\x6b\x4c\xa5\x53\x74\x5e\x0b\x7c\xfa\x7c\x9b\xec\x77\xb3\xb7\x89\x09\xf3\xdd\x9b\x6b\xb7\xd2\x87\x29\x5c\xce\xa7\x31\x9b\x7d\x79\xb8\x7b\x7b\x1d\xcf\xcb\x84\x7e\xbc\x50\x40\x7b\x26\x62\x15\x65\x8d\x16\xb0\xf9\xaa\x9b\x45\x89\xe3\xda\x63\xe0\x48\x1c\xa2\xb5\x40\x00\x84\xe3\x96\x96\x62\x0a\xb5\x30\xb1\xa0\x2a\x36\x51\x91\x0d\xc8\x68\xd9\x20\x8a\x63\x1b\xb7\x2a\xdf\x96\x52\x71\x09\xa5\x40\x55\xb1\x61\x2c\x6e\x7d\x0b\xa8\x8c\x03\x96\xb1\x8f\xa6\x73\x0e\xc0\x5e\x30\xae\x05\xc5\x58\x6e\x61\xac\xea\x8a\x18\xb2\x21\x88\xea\xbc\x8d\x7e\x0d\x03\x24\x59\xb6\x04\x38\xad\xd1\xfe\x5c\xdf\x79\x98\xcf\xfc\x33\x77\x70\x3a\xbd\xbf\x8d\xde\xb0\xfc\x00\xf0\xd2\x7f\xd5\x4d\xc1\x1f\xd7\xd3\xb1\x24\x32\x6e\x63\xcb\xed\x91\x57\x0e\xda\xb8\x39\x9a\x06\xd4\x8f\xa8\x49\x59\xe3\xb6\x8e\x7d\xdc\xf3\xc2\x8f\x0e\x18\x1d\x5b\x1d\x83\x11\x54\xd5\x10\xab\x3a\x48\x2a\xc0\xae\x23\x2e\xb8\x9d\xf6\x2c\xd5\x21\x8a\xc4\xfd\x0c\xc5\x3a\xc5\xc7\x73\x6d\xff\x56\x14\xe8\xe1\xfe\x37\x16\x56\x3e\xbd\x50\x2b\x7a\xf8\x46\x7b\xe3\xd3\x97\xd4\x62\x0e\x06\x35\x03\x5b\x9e\x4b\x23\xf4\x48\x04\xd0\xa0\x57\x55\x53\xaf\xc7\x63\xac\xbd\xf1\xf2\xd8\x46\x91\xb3\xba\x1e\x87\xdc\x52\x14\x20\x59\xe0\x93\x83\x75\x01\xa3\x69\x0e\x7c\xd3\x4a\x29\x03\x0a\x92\x6a\x4a\xc6\x8e\xb2\x62\xcd\x04\xe7\x9c\x33\x4d\x14\x3d\xf5\x71\x8b\x20\x31\x64\x2d\xa8\x06\x82\x53\x6b\xac\xab\xa9\x33\x1e\x5a\xed\x08\x76\x9e\x05\x66\x1b\x25\x4b\x5f\xaa\x40\x18\x23\xe7\xef\xcc\x56\xae\xb0\x19\x3a\x57\x97\x9e\xd7\xa5\x6f\x7a\x63\xcf\x02\x22\xf7\x0f\xef\x7f\x4b\x58\xea\x41\x19\x8e\x47\xa3\xb0\xf5\xd3\x56\x89\x94\xa6\x5a\xb3\xc6\xc5\x63\xde\xfb\x00\x36\x61\xb3\x09\x91\xa5\x88\xf5\xd2\x72\x14\xf6\x7b\x7f\x44\xb5\xc7\x38\x6e\xb4\x84\x01\xca\xc3\xbc\xee\xd4\xe7\x58\x96\x86\xb0\xe8\xe2\x1e\xc0\x51\x82\x73\xcf\x43\xe2\x1d\x87\xec\xed\x25\x83\xf9\xf9\xab\xd5\xf7\xf9\x22\x35\xf7\x5e\xc5\x81\xef\x57\xaf\xab\xfc\xc2\xe8\x7b\xb3\xfc\xd1\x12\xfb\xe9\x92\xf0\xbf\xbe\x3b\x32\x21\xeb\x83\x76\x0e\x49\xc9\x29\x37\x8a\x79\xa4\x3d\x75\xca\x3a\xad\xf2\x6a\x94\x30\x1e\xa5\x94\x02\x32\xc9\xa4\x22\xce\x78\x1d\xab\x7c\xe3\x9a\x22\x58\x58\x8d\x34\xb6\x6e\x0b\xb6\x60\x5b\x95\x27\x89\xea\x0d\xe9\xf7\xc4\x52\x42\x17\xc7\xea\x18\x75\xdc\x58\x25\x01\x05\x16\xb0\x3a\x22\xc7\x23\x67\x1c\x06\x88\x80\x84\x55\x53\xa1\xad\x52\xbe\xf1\x56\x4d\xd7\xc2\xa4\x3d\x42\x67\x1f\xce\x7e\x00\x19\xa8\x6e\x9a\x16\xee\x67\x7b\x9a\x6f\xe0\xee\x04\x64\xbf\x7d\x11\xc9\x9c\x25\x61\xce\xb3\x6a\x05\x85\xe1\x0a\x69\x8e\x61\x39\x1e\xf3\x9d\x67\xba\x51\x53\xe6\xc0\x9d\x32\x42\x73\xa3\xc9\x38\x84\x29\x45\x51\xb5\x66\x24\xae\x4b\x1b\xdc\xdc\xc6\xcd\xe3\xba\x98\x3e\x3f\xf4\x10\x9b\x98\x20\x52\xce\x88\x67\x52\x93\x50\x73\xed\x45\x90\xa6\x1d\xcd\x12\x3d\xf6\x5a\x95\x4d\xa9\xb7\x71\xb3\x21\x3d\x50\x79\x17\xd7\xdd\x78\xe8\xaf\x75\x9f\x90\xa2\xd6\x4b\x4f\xe8\xa5\x1f\xfe\xed\xfd\x95\x35\xf2\xe9\x25\x90\xf7\xe9\xe1\x35\x60\x4b\x1b\xfb\x69\x26\x37\x11\xe1\x68\x35\x20\x24\x96\x79\x15\x87\x70\x99\xff\xd3\xb1\xa8\x62\x5d\x84\xd3\xd1\xf8\xd8\x03\xd2\xd9\xc0\xa4\x37\x79\x2d\xe2\x36\xfd\xd7\x1a\x93\x5d\x31\x87\x50\x90\xec\xbb\xec\x8f\xbf\xf5\x5d\x39\x97\x79\x5f\x3d\x5c\xfa\xec\x12\xf3\xeb\xfe\xed\x7d\xbe\xfa\xf0\xee\xd5\xdb\x35\x60\x1e\xd4\x71\xdb\x39\xa9\x8d\xb7\xad\xda\xeb\x78\x58\x48\x80\xa6\x93\xb4\x6d\x41\x26\x86\x36\xf8\xad\x06\x59\xb3\x5f\x88\xdd\xce\x13\xa5\x9c\xe2\xa3\xcc\xfd\xb1\x71\x43\x1a\xc7\x3e\xba\xa6\x6d\x01\x1d\x65\xbe\x8e\xdb\x8d\xef\x80\xc8\xee\xce\x38\x67\x73\x65\x9a\xbf\x7f\x76\xff\x7c\x66\xd7\x7c\xcb\xa8\x79\x75\xd3\xd3\xb0\x01\x65\xb3\x40\x4d\x62\xd3\xe8\xe3\x00\x64\x3c\x82\x76\x81\x4e\xbb\xcb\x61\x59\xdc\xc7\x35\x01\x6c\x81\x01\x06\xd3\x59\x89\x43\x01\x67\x9d\xc1\xe0\x5c\xae\xf4\xb4\x2a\x46\x67\xe3\xde\x6b\x16\xa8\x24\xda\x3b\x72\xf1\xd7\x21\x29\x1f\xab\xb2\x5f\x9c\x75\xa3\xcf\x7b\x50\x62\xcb\x4c\x7f\x8a\x76\x2d\x72\xd2\x8c\x55\x03\x28\xd9\xe6\x87\xc4\x66\xad\x0a\x4d\x9a\xc7\x75\x08\x05\x57\x31\x03\xd5\x28\x40\x95\x2d\x52\xaf\xc0\x94\x93\xcf\x15\xa8\x5b\xd5\x8e\x8b\xbc\xfd\xc3\xeb\xef\xfe\x08\xac\xde\xa2\xf7\x17\xc7\xc6\x44\x1c\xb9\xf9\xb3\x3c\x67\xe6\x43\xbe\x6b\xd2\xff\x4c\x6d\xb7\x63\x98\xc5\xa5\x15\x80\x78\x7f\xd2\x71\x90\x1b\x09\x6a\xdc\x54\xb0\xd9\x8f\x4d\x2e\x4f\xfd\x82\x8c\x6d\x2e\x46\xb4\xb0\x49\xdd\x74\x28\xb4\x94\x5e\x0c\x6e\x2f\x9d\x86\xae\x33\xdc\x99\x1d\x64\x44\xd5\x80\x39\xe9\x98\x13\x3b\xc6\x52\x3e\x5e\xa4\x7d\x58\x17\xc3\x33\x86\xf9\xad\x76\xce\x6f\xc5\x30\xa7\x0f\xdf\x5f\x3e\xea\x7a\xe4\x8b\xfa\x07\xb4\x80\x49\x0d\x1b\xdd\x65\xc6\x0a\x8d\x02\x53\x8f\x5d\x48\x46\x10\xe9\x30\x42\x18\xae\xb9\x99\x6e\x22\x1e\x3b\x2e\xa0\xad\x28\xda\xe7\xfb\x9e\xc7\x3d\xcf\xb2\x7c\xa1\x9e\xcc\xca\xa7\x38\x0b\xdd\xc4\x58\x3f\x5d\x50\xf8\xf8\x7a\xa5\x4e\x61\xe1\x1f\xb7\x8b\x3d\xe7\x88\x20\x5e\x57\x6b\xef\x3d\x40\xbe\xb0\xe1\x84\xfc\xb2\x4c\x9d\x06\xa9\x0f\x02\x64\x53\xf6\x15\x51\x2e\xfd\xcc\x2f\xe6\xab\xb0\x84\x59\x91\x58\x3e\x49\xad\xeb\x85\x4c\xe4\x73\xa9\xe5\xfd\xb9\xec\xbc\xfc\xf0\xfe\x27\x05\x25\xe7\x77\xde\x9d\xdf\xf8\xfe\xe6\x9d\xc5\xa1\xe7\x4a\xe5\xb6\x3c\x1d\xb1\x6e\x83\xd0\xba\xc7\x88\x40\x07\x8d\xea\x9e\xb2\x68\xc6\x23\xcf\xe9\x51\xd2\x91\xc1\x5c\x10\xec\x28\xeb\x9d\x11\xc6\x2d\x74\x75\x5a\x53\xd5\x06\xa9\x4d\x2b\x30\x46\x0e\x6f\x37\x71\x1f\xf5\xb8\xe7\xc0\x01\xd4\x3a\x34\x56\x30\x77\x04\x5b\xc6\x97\x90\x4b\x5c\x73\x4f\x30\xc5\x54\xe3\x9a\x51\x53\x37\xda\xc9\xda\x92\x29\xd9\x77\x98\xf1\x5a\xf2\x48\x6a\xa2\x68\x2d\x3c\xc5\xa4\x66\x1a\xd7\x94\xc8\xfa\xe8\x24\xb2\xa8\x46\xaa\xa6\x7e\x7e\x5b\x76\x8d\x13\x9a\x42\x67\x7f\xef\x9a\x0d\xbd\x79\x6e\xd6\x05\x67\x81\x9d\x1b\x89\xa9\x4f\x0f\x67\x89\xa9\x94\x83\xce\x6b\x4e\xaa\x13\x2f\x65\x53\xf7\x20\x93\xc7\xce\x1f\x15\xc0\xa3\x25\x08\xc0\x88\x40\x28\xe5\x9a\xca\x4a\x51\x56\xe1\xa7\xac\x1a\xdc\xb6\x03\x12\xa1\x85\x6f\xbd\xf2\x0d\xc8\x06\xb5\x3b\x14\x1a\xd3\x6d\xe3\x9b\xdd\x76\xad\x77\xa0\x96\xca\x37\xe3\xba\xaf\x7c\xc9\x9b\x63\x34\x49\xba\x17\x98\xbd\xe7\x34\x42\xa1\xad\x13\xf1\x68\x82\x5b\x9b\x2c\x5b\xe4\xfe\x89\x27\x1c\xfc\x3e\xad\xc9\x19\x28\x2e\x3c\x8b\x57\x6f\xf2\xd5\xbb\xf7\xb7\xb5\xc3\xfb\x87\xe5\x01\x64\x8d\xc3\x2c\x92\xf1\x50\x83\xba\x6f\xd7\x6b\x50\x03\xc2\x15\x08\x61\x84\x21\xa4\xfe\x77\xb4\x3d\x72\x31\x25\xe9\x01\x50\x12\x8f\x16\x12\xc9\xc7\xfd\x18\x08\xc9\x55\x94\xa0\x9a\xf9\x3d\xf5\x93\x5c\xf9\x42\x65\xab\xec\x17\xd9\x43\xca\xcf\x2f\xd6\xe6\xcf\x53\x7e\xf5\x3d\xb8\x7f\x97\xf8\xc2\x49\xfa\xe5\x1a\x13\x7e\x39\x47\x85\x6f\xcf\x61\xe1\x0a\x86\x47\x1a\xf2\x61\x63\x25\x80\xad\x85\x70\xdf\x8a\xf5\x69\x00\xe5\x00\x8f\x71\xcd\x1a\x70\x58\x08\x19\x0f\xd1\x92\x46\x4a\x86\x2b\x8f\x5c\x1c\xf8\x46\x05\x40\x0b\x35\xee\x40\x88\x26\xaf\xa2\xd5\xc4\xea\x86\x21\x48\xb9\x95\x51\x3d\x65\x08\x7b\x82\x59\xae\x9d\x03\xa5\x95\xb4\xc5\xa8\xa4\x81\xed\x29\x17\x79\xe9\xf1\xb9\x37\x24\x24\x1c\x6d\x75\x46\xd2\x1e\xae\x51\xec\x37\x95\xf2\xfc\xbc\xb7\x4d\x3b\x1d\xc0\xcb\xf5\x57\x9e\xb8\x14\xb9\xc9\xcb\x47\x7b\x79\x14\x77\xe3\x81\x45\xae\x80\x26\xb1\x5c\xe1\x88\x9b\xc2\x8c\x1a\x38\x63\x4c\xf4\x5a\xeb\x58\xc6\xff\x87\xb1\xf7\x87\x72\x5c\xd7\xd3\xc4\x08\x90\x92\xb8\x6f\xd7\xfb\x58\xb7\x6f\xbd\xe6\x7a\x66\x67\x58\x53\xb7\x6f\xf3\xed\xcc\xac\x31\xdb\x5b\xdd\x1c\x8f\xdf\x2c\x6c\x1f\x9f\x85\xe7\xec\xfa\xe0\xd8\x09\xce\xb1\x8f\x0f\xbc\x0e\x8c\xc8\x07\x21\x42\x84\x08\x11\x22\x44\xc8\x90\x21\x43\x86\x0c\x15\x2a\x54\xa8\x50\xa1\x6e\x97\x88\xf2\x21\xa8\xaa\x52\x75\xdf\xe7\x99\xdb\x4d\x49\xa5\xd2\x6d\x51\x14\xf0\xfb\xfb\xfd\xbe\xaf\x63\xae\xd9\x79\x1f\x58\xf2\x52\xc3\xdd\x26\x7f\x1a\x7d\xe9\xbf\x49\xfe\xed\x4b\xb7\x71\xbd\x79\x15\x7c\xba\x7b\xb8\x5b\x06\x92\x3f\x83\xbb\xcf\xcf\xe7\xf3\xf9\xcb\xef\xc1\xe6\xee\x21\x95\x6d\x55\xa5\xf9\xb9\x97\x7b\xc8\x3c\x64\x53\xeb\x1f\x07\x50\xa2\x5e\x07\x07\x8b\x3a\x08\x70\xca\x43\x02\x1d\x38\x3e\x2a\xe0\x50\x19\x2a\xa8\x6b\x88\xb2\x6d\x83\xea\x89\x0b\x62\x8c\x9b\x13\x60\x47\x50\x03\x3d\x09\x5d\x83\x95\x0a\xba\x21\x5a\xbf\xd6\x31\x68\xf2\x3e\xf9\x29\x76\x18\x97\x33\x4a\x56\x9b\x9f\xe6\x2f\x7b\x4e\x5c\x40\x24\x53\xbb\xee\xdc\x7f\xb8\xfe\x21\xed\x3c\xdc\x4f\x15\x60\xe0\xc8\x02\x0a\x7b\x1f\x86\x40\x19\x4c\x00\x99\x6a\xb8\x0b\xd8\x15\xa5\x92\x92\x71\xa9\xe4\x29\x3d\xd8\xa2\x74\x46\x4a\x8d\x99\xec\x33\xaa\x5d\xb0\x61\x54\xad\x05\x45\x6c\x15\x1d\x8c\xf1\x00\x01\xe9\xfa\x8a\xe0\x86\x2a\xda\xb4\x4c\xf6\xa7\x8a\x60\xae\x94\xe2\x82\x4a\x97\x24\x6b\x90\x3c\x91\x4d\x9d\xb1\x64\x75\xa5\x5e\xfb\x32\xcf\xf2\xa6\x98\xb6\x8a\xc5\xd2\xbb\xe7\x42\x29\x2c\x24\x71\x8d\x04\x2e\xcb\x39\xa7\xb2\xd6\xb4\x39\xbb\x69\xef\x7d\x26\xa6\x0a\x92\x40\x41\x97\x31\xa1\xa8\x94\xf9\xb9\x10\x32\x77\xb9\x4c\x1b\x7a\x2e\x52\x37\x51\xd8\x85\xa3\x31\xda\xb9\xa5\xdf\x2f\x9e\x4c\xac\x37\xce\xfe\xf6\xbf\x4e\xaa\xe4\xe7\x24\x01\xf1\x6a\x3d\xb7\x68\xe3\x58\xe7\x73\x9a\x01\xae\x44\xe2\xd3\x6d\xe8\x02\xe1\x90\x02\x64\x8a\x12\x68\xb0\xe5\x81\x9c\x77\x69\x79\x3e\x04\x93\x6e\x5b\xee\x85\x02\xdd\x2f\x3d\x3c\xf2\xca\x57\x2c\x1c\xe2\x5d\xda\x3d\x25\x4e\xef\x40\x41\xca\xe2\xa0\xbc\x29\x5d\xc8\x8f\x87\xe6\xd8\x39\xc8\x9d\xaf\x5b\x9b\x3b\x8b\xbc\xbd\xcc\xbd\xe3\x88\x75\x99\xd7\xfc\xdd\x0b\x2a\xef\x2e\xbd\x2e\xcb\xde\xaf\xb3\xe7\xac\xfe\xcb\x1d\x90\xab\xea\xeb\xde\xa5\xc7\x73\xd1\xad\xec\xc4\xab\x94\x4d\x62\x04\x07\x3a\xed\xf6\x84\x04\x12\x46\x0e\xeb\x6e\x62\xf0\x54\xe6\x53\x97\x99\x40\x4c\x1b\x84\xd1\xb6\x25\x5e\x82\xca\xed\x0b\x57\xee\x2c\xc6\x97\xf8\x71\xf6\x77\xcf\xf8\xe3\xbf\x99\xbd\xf0\xed\x85\x5b\xf3\xa5\x77\xfd\x1a\x0c\x7f\x37\x05\xfa\xe3\xe6\xee\xc1\xac\x8f\xe7\x1d\xd4\x93\xa8\x18\x50\x90\xd5\x93\x0a\x78\x1f\x04\x06\xa8\x97\x8c\xe9\x8e\xd5\x93\x83\xfa\xbc\x07\x38\x6e\x4b\x03\xf6\x8f\xcb\x56\x35\x39\x38\x64\xda\x88\xc9\x2a\x2a\x72\x5f\x18\x81\x5c\xd5\x20\x2c\x59\x83\x19\x94\x22\xf8\x85\x54\x87\xe7\xc5\x12\x67\x82\xe4\x49\xc6\x3e\xde\x72\xa5\x2e\xfe\xf9\x65\x26\xe7\x45\xd8\xe7\x39\x72\xd8\x34\xb1\xe4\xe1\x41\x99\xb5\xd3\x1e\xec\x42\xbd\xaf\x1b\xcd\x70\xfb\x58\xc3\x24\x66\x48\x45\x66\xec\x39\xb7\xab\xf2\x64\xbc\xd9\x21\x44\x29\x37\x66\x67\x7c\x92\x45\x9e\x52\xf3\x92\x4f\xff\xc9\x37\xd9\xf4\x73\x3b\xff\x52\x9f\x03\x74\xc5\xbf\xfa\x97\x21\x91\x70\x5a\xa3\x09\xa5\xf8\x3c\xf8\x88\x11\xc0\x99\x9d\xb6\x60\x01\x51\x8f\x46\xdb\xb0\x05\xc8\xea\xc5\xdf\xa9\xb8\xa7\x79\x64\x74\xa8\xa3\xc5\x89\xa5\x9b\x0b\x40\xeb\x53\x0c\x98\x7f\x4a\x2f\xc3\x5e\x37\x77\xff\x1a\x80\x4f\x73\x64\xfd\xf1\xe6\x3e\x8d\xfd\x03\xb8\x07\x6d\x1e\x76\xa0\xf6\xa0\x1d\xa6\x61\x00\x4a\x05\x37\xe8\xd0\x1b\x20\x78\x50\x29\x0f\xc7\xb3\xf4\x8a\x73\xe5\xb7\xba\x20\x1a\xc3\xa4\x2a\xf7\xb6\xef\x03\xb3\xe1\x64\x5c\x07\xca\x70\xec\x65\x0f\x12\x0b\xca\x7d\x03\xf9\x41\x70\x63\xcf\x36\xab\xab\x70\xdc\x93\x43\x92\xac\x00\x7b\x22\xeb\x2e\x33\xff\x68\x2d\x1a\xfc\x4a\x2d\x3a\x6d\x3d\xe4\x4a\x31\x55\x39\xca\x1f\x0f\x1e\xd2\x40\xb3\xf2\xf1\x30\x1f\x95\x12\x86\xe9\x6c\x6b\x84\x92\x2a\x33\xa1\x3f\x8f\x8c\x17\xb6\x20\x2a\xb4\xe9\x29\x1c\x6c\x10\x06\x6e\x89\x10\x9c\x33\xaa\x89\xa0\x09\x80\xea\x89\x6e\x64\x66\x92\xf7\x2f\x4c\x60\xb7\xaf\x5f\xc6\xfd\x66\x76\x76\xe9\xc9\x96\x55\x5a\x4d\x34\x16\xbd\xd5\x64\x1c\xe2\x0d\x37\x20\xc9\x0c\x22\xd8\xf6\xb6\xb7\xc1\xa7\x47\x43\xa8\xd8\xc6\x3d\x68\x9e\xf4\x46\xa5\xbb\xc8\x6c\xf3\xd3\x82\x39\x7b\xce\x0e\xfe\x1c\xbc\x5a\x4f\x70\x6d\x4a\x41\xb9\x3a\x4e\x34\xad\x7e\x29\x52\x34\xf1\xa3\xc3\x56\x0a\x21\x88\x55\xdb\xf4\x68\x8b\xb2\xd3\x42\x19\x2a\x54\x9b\xee\xdc\x79\xe7\x5c\x5a\xa3\x6a\xfe\xea\x9d\xea\xbc\x3c\x02\x56\x33\x6a\x8c\xf5\x6a\xd0\x72\x17\x6d\xd4\x29\xf6\x20\xd8\x45\x4d\x06\x45\xdd\xd0\xa5\x4c\xf9\xfd\x75\xbe\xb9\x20\xdf\xe7\x4d\x39\xa7\x73\x71\x58\xfd\xe1\xee\xf6\xc3\xbc\x31\xc9\xaa\x1e\x8f\x55\x05\x4b\x29\x84\xae\x3b\x86\xa7\xbd\x9f\x0e\x7e\x76\xbb\xa2\x75\x9d\x3d\xe7\xab\x3a\x3e\x05\x4b\x38\x4c\xfb\x89\xc0\x32\x63\x42\xb3\xbc\x98\x4a\x21\x2a\x5f\x51\x16\xb9\xa1\xc6\xb4\x9d\xa3\x33\xd4\xe0\xd0\x48\x29\xe5\x31\x6a\x76\x5d\xae\xd7\x9c\x6f\xf8\xc8\xa8\xf7\xdf\xbc\xad\xa1\x45\x12\xd9\x68\xb9\x22\x62\xe8\xcb\xe7\x67\xd0\xfd\x5f\xc4\xb2\x59\x5c\xc6\x59\x51\x57\x69\xe2\xbe\x2a\x0b\x0f\x45\x19\x9a\xac\x7f\x24\x87\xb5\x9f\x0e\x25\x69\x73\x5b\x14\x85\x2b\x71\x1d\x54\x4f\xc2\x58\x4f\x9d\x80\x39\x9a\x4e\x99\xc7\x38\x74\xc3\x08\x58\x5d\x05\x6f\x8d\x09\x5b\x54\xe5\x79\x51\x39\x36\xa0\x12\x0b\xc0\x03\xe6\x8e\x82\x26\x62\x9d\x9f\xc8\x26\xc9\xca\xb8\x77\xe7\x28\xe2\xd5\xaa\x2e\xfc\xb6\x7f\x80\x77\xb7\x40\xad\xf2\xaf\x27\x9f\x8e\xe7\x46\xf9\x75\xe2\x1f\x71\x56\x86\xca\x6c\xcf\xb5\x84\x66\x52\xd2\x9e\x4e\xf3\x67\x05\x24\xda\xc8\xf1\xca\x73\xdd\xdd\xdc\xbd\xc1\x31\x2c\x04\xe4\xf3\x47\x5f\x5d\x9a\x44\xe9\x1e\x95\x10\x4f\x07\xb1\x1d\xd4\xfc\x2d\x0f\x6c\x92\xe1\x14\x30\xf0\x4b\x83\x08\x36\x65\x15\xdc\x32\x74\x95\x8d\x84\x4c\x58\x0b\xe3\xa8\x97\x4d\xd5\x39\xe0\x82\xd1\x96\x63\x9e\x19\x54\x1f\x8c\x99\x1d\x6d\x02\x62\xff\x52\x65\x3a\xf9\xd3\x2b\x2e\xbf\xab\x0c\xfb\xa7\x88\xe9\x5c\x7d\xfc\x29\x2b\x48\xdb\x03\x1d\xf4\x68\xb9\x56\xde\x1f\x39\xc0\x3e\x70\xd0\xcd\xa9\xea\x98\x69\x5d\x57\x83\xab\xbc\xb3\x4e\x4f\x3d\x6c\x76\x9d\xda\x81\xd2\xf9\xda\xd6\x8b\x3d\xb2\xd1\x1f\xf1\xe4\xcf\x9f\xfb\x3c\x7f\xac\x66\x75\xe1\x73\x9b\xf3\xb3\x6f\x8a\xa3\x37\xe0\xfe\xe6\xef\xe0\xcd\x7d\x0f\x12\x7f\x3a\x49\x51\x4a\x4d\x35\xe7\x95\xe0\x44\xea\x06\xd4\x4f\x49\x2a\xf1\x01\x50\x9a\xfb\x8a\x34\x81\x85\x56\xa6\xed\xb4\xdb\xef\xfd\xe1\x90\xea\xfd\xde\x1d\xca\xc2\x54\x65\xe8\x14\x2f\x7c\xc1\x41\x52\x16\xbe\x06\x79\x30\x61\xac\x0b\x6c\xf1\x80\x6b\x2c\xd3\xed\x64\xc0\x21\xb4\x80\x25\x2f\x3d\x00\x93\x75\xbf\x82\xbf\xca\xae\xf0\x57\x6f\xc0\xdc\xb1\x32\x72\x61\x6d\x78\xbf\xf9\xf9\x43\x7a\x30\x79\x01\x34\xe8\x58\x20\x81\x87\x31\x20\x01\x69\x97\x76\xc1\xc1\x71\x6a\xa8\x59\x70\x3d\x13\x86\x43\x60\xc2\x6c\xc3\x51\x81\x3a\x35\xa0\xd8\xab\xdd\x53\x92\x75\xb4\x28\xb6\xca\x99\xd3\xde\x99\x71\x6f\x7a\x7b\x94\xac\x74\x25\xd9\xd9\x3e\x58\x36\x48\xad\x8c\xb2\xc6\xcb\x24\x8d\xbc\xf6\x4d\x56\x27\x7f\x1a\x79\x9b\x17\x3b\x56\x6c\x5e\xcb\x51\x31\x97\xbb\xf4\x60\x57\xcf\x03\xc3\x9f\x9f\xe5\xc6\x2f\x60\xb1\xca\xe6\x25\x6c\x09\x3e\x70\x53\x0f\x94\xd3\x22\xf4\x41\x35\xa0\x03\x3c\x9f\x7a\xcc\xa4\x3d\xfb\x93\x3f\x1c\xdc\x02\xbe\xab\x40\x72\xca\x88\xc0\xa6\x11\x59\x5d\x37\x78\xaa\x07\x5f\xf9\x4a\x8e\x5a\x7a\x61\x74\xa7\x98\x74\x1c\x90\xd0\xbb\x60\x2b\x64\x25\xf1\x08\x38\xc6\x05\x15\x17\x9c\xa8\xb9\xf0\x76\x2f\xfd\xbf\xc8\xfe\x7b\xe1\x84\x9a\x03\xe4\xe7\x72\xe5\xb7\x97\x77\xf9\xf3\xf9\x4b\x7a\xd9\x19\x90\xdb\x23\x01\x0c\x14\xa2\xaa\xa0\xab\x11\x60\xfb\xbd\x0f\x91\xa7\xbd\x32\xa6\x99\xf6\xb0\x8a\xec\x2d\xc7\xb4\x42\xf5\xb8\x74\xae\xd2\x91\x13\x25\x77\xbc\x2a\x35\x46\xb3\x53\x18\x6a\xbb\x5c\xda\xa8\xc5\x6f\x11\x7e\x4a\x2e\xdb\x24\x49\xa3\x96\x1a\xce\x50\xf2\xaf\x93\x0f\xc9\xef\xaf\xaa\x0a\x1f\xae\xcb\x94\x9f\xff\x00\x22\x95\xfa\x87\xab\x5c\x6c\x0b\xd0\x42\xb6\x9b\x54\x61\xcf\xb4\x92\x95\x52\xa8\x0a\x7b\x0c\x78\xd8\xae\xa5\x0f\xa5\xf7\xe0\x10\xca\x94\x6f\xb7\x6e\x87\x1c\x0e\x3b\xc5\x8b\xb6\xac\xf0\x01\xb5\xe8\x78\x7a\xb4\x84\x64\xf2\xac\xe0\xf1\xb5\xe7\x98\x9e\x92\x32\xf6\x6c\x92\x45\xdd\xf2\xe1\x3d\x8c\x94\x31\xf3\x26\xf9\x71\x29\x25\xae\x5e\x45\xa1\x3e\xdc\x5c\xc6\x46\xd6\x16\x95\x65\x9b\x37\x95\xd1\x4d\x60\xda\xc8\xfd\x79\x0f\xfb\x70\xb0\x12\x85\x6d\x50\x04\x34\xe1\x94\x09\x49\x1c\x11\xe9\xe9\xcc\x29\x3d\xa1\xa8\x0f\xaa\x52\x1c\xf4\x21\x8c\x5a\x8f\xa0\x03\x3d\x72\xd3\xa1\xaa\x8d\x62\x1e\x43\xa2\xba\x2d\x8e\xf2\xd4\x71\x8f\x37\x9b\x2a\xab\x93\xdb\xe4\x4f\xa3\xbf\xb9\xcc\xdf\xc3\xf4\xaa\xfe\xf9\xf9\xcb\x3d\x88\xac\xeb\xeb\xeb\x84\xd5\x82\x12\xf9\x0a\xd8\xaa\x3f\x39\x2e\xf6\x5b\xbe\xeb\xac\x27\xf8\x00\x6a\xc1\x6d\x1d\x8e\xcd\x0a\xf9\x60\xbd\x07\x32\xd8\x54\xf6\xb5\x0d\xe4\x29\xe9\x24\x63\x3d\x33\xd4\x71\xd6\x8d\xa1\x6f\x70\x07\x8a\x0e\xe8\xc7\x8e\xd2\x8c\x9e\x1d\xdc\x3e\xef\x5f\x92\xf1\xe4\xc7\xcb\x44\xce\x65\x57\xc0\x57\x14\x56\xdc\x0d\x37\xd7\x50\x8a\xa3\x2f\x8b\x6c\x2f\x07\xe1\x4a\x27\x09\x2e\x1f\x85\xee\xe5\x29\xdd\x4f\xb5\x83\xbb\x69\x80\x38\xe3\x35\xaa\xcf\x7d\xe8\x0a\x57\x0c\xb0\x1b\xb5\xea\xf9\xc4\x65\x5a\x84\x93\xd6\x56\xeb\x24\x4b\x48\xe4\xc0\xa9\x93\x32\x2a\x46\xce\x2b\x3b\x96\xe0\xaf\xdf\xf8\x37\x20\xd6\x2a\xd3\x37\x7e\x38\xd2\x17\x3d\xbc\xb4\xb5\x6f\xb3\xf2\xe0\x41\x27\x3b\x2a\x2b\x45\x09\xce\xc3\xb1\xf0\x9d\x04\x55\xb1\x57\x8c\x09\x53\x3b\xde\x04\x83\xac\x91\xcc\xc6\xe6\xa0\x08\x2e\xa5\xbb\xdd\x54\x86\x43\xe9\x4b\x0f\xeb\xd0\x06\xed\xf5\x09\x26\x80\x9e\x2b\x2e\x0a\x5b\x88\xee\x34\xd2\x16\xe4\x03\x4c\x42\xdf\x87\xb2\x55\xb1\xd6\x3a\xc7\x8b\xf8\x79\xe2\x2e\x7b\xd6\x0e\x7b\x61\x58\x7a\xb8\x7b\xc8\x56\x1f\xab\x79\xff\xad\x47\x1a\x86\xa0\x52\x72\xee\xa1\x75\x8f\xda\x43\x73\xee\x53\x12\xb6\xa1\x43\xf0\x30\xed\x33\xfd\xa8\x33\xac\x51\xd5\x3a\x3f\xf5\x9c\x43\xe2\x9d\x2f\x72\x73\xe6\x73\x5c\x04\x32\xf4\x44\x36\x34\xdd\x47\x45\xeb\x5f\x87\x45\x6f\xc8\x30\x3a\x47\x55\x6d\x39\xc6\xc7\x5d\x20\x3e\xdd\xfb\x70\x68\xbd\x36\x95\xaf\x1a\x64\x2d\x20\xe7\x24\x73\x4b\x9d\xd8\x3c\xc9\x8d\xca\x58\x64\xa7\xf8\x8e\x43\xfa\xdb\x69\x46\x50\x41\xeb\x23\x1d\x70\xf1\x0b\x4e\x8b\x49\x16\xd0\xc5\xae\x60\x8a\x7e\x29\xd2\x6a\x12\xe9\x68\xad\x6d\xad\x6d\x43\x69\x8c\x1d\xac\x1d\xe6\xb4\x4e\xc7\x39\xa5\x7a\xe1\xbd\xf8\xf2\xe9\xc7\x57\x5e\xe6\x48\x48\x7a\xd5\x04\xbb\xaf\x2e\x8b\xfd\xe6\x0e\x82\xd9\x81\x7a\x98\x14\xbe\x80\x49\x43\x8c\x24\x80\x4d\xb2\x37\xc2\x85\x23\x1d\x1d\x2d\x6c\x65\x77\x61\x6f\x73\xed\xd8\xd8\x3e\x25\x2a\x60\x09\x9c\x08\x55\xca\x06\xc1\x70\xc3\x84\x70\x61\x8e\xe7\xfa\xb1\xa9\x4a\xde\x35\x27\x45\x18\xc6\x86\x71\x70\x98\x5c\x38\xda\x23\x38\x3d\xd7\xca\x49\xac\xd3\xac\x22\x76\x6a\x41\x9a\x7e\xa3\x0f\xf3\x2f\xc1\xfd\x5f\xfc\xf4\xcc\x33\xbc\xfa\xf8\x61\xa9\xe9\x7d\xfa\xdd\xfb\x28\x39\xb3\x2a\x08\x95\x98\x43\x57\x9c\x0f\x88\x8c\x9d\x6c\x87\x66\xdb\xd8\xdc\x15\xd6\xf2\x70\xd4\x81\x06\x46\x40\x0f\x14\x69\xa6\xa4\x84\x3b\x34\xed\x4b\x58\x16\xb9\xcf\x0b\x78\x2a\xa6\xb2\x2c\x33\x81\x88\xa4\x24\x48\xc7\x29\xa1\x4c\x71\x82\xf8\x1e\x0d\xce\x48\x43\x1d\x51\x9c\x33\x47\x1d\x72\x88\x09\x4e\xb1\x25\x14\x2f\xe7\xad\x36\x2e\xcb\x97\xaa\xd6\xbb\x4b\x76\x72\x73\x61\x73\x58\x4a\xd6\xf3\xfd\x1c\x86\x8a\x39\x19\x11\x1e\x68\x0f\x70\x18\x26\x1c\xdc\x0a\x7f\xad\xc2\x6e\x45\x83\x86\x87\xd3\x29\xf6\xf5\xab\xb0\x77\x41\x01\x33\x0d\x0e\xee\x8e\xc7\x63\xb2\xc4\x38\x71\x6d\xff\xd9\x4b\x6c\x3f\xa7\xc1\xb1\xbe\xb1\x44\x8e\x0f\xcf\x24\xbb\xb0\x74\x65\x95\xd1\xc9\x15\x29\x99\x2a\x50\xcd\x3e\xbb\x0c\x3b\x3d\x51\x06\xa9\x3b\x1f\x52\x52\xe4\x81\x32\x69\x8e\x19\x46\x0d\x72\x4f\x89\x0b\x27\xdd\xf6\x80\x07\xd7\x39\x0d\x4a\x27\xad\x66\x7c\x5c\x7c\x9b\x9a\x73\xbd\xf4\x70\xc1\xff\xc4\x1c\xf8\x0d\x7d\xe7\xdd\xfb\x8b\xa4\xb6\xda\x14\x61\x47\x55\xe7\xab\xb6\xab\xaa\xaf\x7d\x97\xb2\x73\x1b\xc7\x80\xd3\x83\x3b\x0f\x6a\xf6\x4a\x15\x4e\xcb\x6e\xda\x3a\xf0\xcc\x6b\x87\x36\x55\x86\x22\x1e\xf1\xe7\x24\x79\xf7\xe9\xcb\xa7\x2b\xb3\xf6\xe5\xf3\x32\x89\xfa\xf9\x87\x77\xf7\xd7\xce\x68\x38\xe4\x6d\x01\xa4\x70\x9c\xd7\x4a\xe2\xbc\xdc\x55\xce\x1b\xeb\xca\xfd\x9a\xbf\x1a\x58\x31\x8e\xe7\xfd\x53\x52\xba\x92\x3a\x38\xc7\x47\xca\x4b\x0d\x24\xc0\xdb\xc7\xde\xda\x8c\x9c\xf7\xd0\xcc\xdf\xdd\x52\x6b\xef\x92\x9b\xe4\xe3\xf5\xe4\xd7\xbb\xf7\xeb\xa5\x22\x79\xdd\x15\xb9\xbf\xb9\xd4\xd6\x56\xe4\x78\xd4\xb8\x99\xba\x49\xd4\x00\xef\x7d\xd7\x01\x03\xbc\x50\x8f\x23\x18\x3c\xa4\x1e\xd8\x20\xfd\xd4\x55\x41\x32\x40\xaa\x80\x33\xdb\x9f\x04\xc6\xb8\xd0\x1a\xe4\x68\x2f\x0a\xc4\xf9\xd4\x7a\xef\xfd\x32\xd8\x34\x8e\xd6\xed\x5e\xf7\x00\xca\xe8\xc5\x86\x2d\xe2\xe2\xb1\x4b\xf4\x7e\xbe\x34\x77\x97\xeb\xfe\xc3\xcd\x6c\xc3\x60\x81\x71\xda\x9e\xeb\x86\xa8\x93\xf3\x28\x1b\xfd\x9c\xb5\x56\xad\x93\xac\x79\x54\x11\xb8\x59\x73\x3c\x1d\xc1\xae\x69\xf4\x08\x6a\x24\xce\x7d\xd8\x15\x6d\x81\x01\x05\xed\x74\xd8\xc7\x1c\x1b\x6f\xda\xac\x49\xde\x27\x7f\xb6\xd8\xf8\x88\xf6\xd9\xdc\xbd\xed\xf8\x7d\xfe\x72\xff\x6e\xf1\x78\x1f\x62\x28\x03\xaf\x49\x7e\xe2\xcc\x97\x03\x09\xaa\x3c\x06\xba\xea\x39\x77\x98\x8e\x07\x7e\x68\x5d\xcf\xc8\x70\x52\xc2\xcc\xee\x0f\x2a\x9e\x16\x8e\xb5\x47\x76\xec\xc7\x70\xa2\xa0\xe8\x3c\x48\x14\x0e\x06\xa7\x5c\x8a\xaa\x0f\xfc\x44\xa8\x24\xb8\x9b\xfd\xa1\x12\xde\x87\x23\xa5\x1e\x14\xee\xe4\x6c\x15\x84\xea\x44\x27\xb7\x5b\x61\xc4\x76\xcf\xba\x79\x57\xcc\xfb\x42\x3d\x91\x0d\xcb\x50\xb4\xc3\xdf\xe7\xbc\x73\x24\x06\xa9\xaf\xea\xac\x3b\xe3\x14\x9f\x87\xd4\x9c\x95\xef\x7a\xa7\x01\xce\x50\xd3\x34\xb6\xb5\x9d\x0d\x63\xda\xed\x38\x3f\x3c\x73\x2d\xe2\x4c\x5d\x26\x5f\x2f\x3d\xc3\x6b\x0e\xb7\x4b\x35\xf1\xcb\x75\xe1\xf5\x0e\xa0\x55\x37\x69\xb8\x2f\x38\x33\xbe\xea\x54\x59\xe4\xd3\xce\x87\x53\x48\x18\x38\x6d\xa7\x81\x43\x35\xc9\x14\x81\xfd\xa3\x80\x65\xc8\x33\x15\x70\x17\x4c\x97\xbb\x1c\x8f\xd3\x08\x4e\x61\xe7\xad\x3d\x80\xa1\xeb\xba\x50\x76\xf3\x3a\x90\x4f\x68\x43\x32\x7c\xc1\x4a\xde\x7d\xfc\xfc\xe5\xa7\x0f\x0f\x9f\x6e\x23\xb8\xfa\xe6\xd7\x4e\x28\x9d\xd7\xc9\x3a\x2d\x82\xa4\xa4\x04\x08\xe4\x6e\x8e\x25\x9b\x30\x04\x0f\x0f\xb9\x30\xda\x95\xd6\xd6\x55\x39\x0d\x2e\x9c\x42\xce\xc0\x96\x83\xc3\xb8\x2b\x81\x11\xbb\x21\x2f\xbc\x2d\x91\x41\x55\x38\x85\xae\xcd\x4d\xde\xb4\x53\x0b\x69\xd8\x8d\xb6\x05\x14\x24\x45\x3e\xc7\x03\xee\x49\x6f\x64\x7a\xb8\x9a\x93\x7d\x2d\x49\xc6\x61\x34\xf9\x98\x67\xec\x4c\xd2\xfe\xeb\xb8\xde\xfd\x52\xa7\x87\xf3\x98\x36\xa1\x1b\x06\xb3\xdd\x86\xdc\xbd\xda\xb1\xe6\xd5\x52\x5e\x8c\xd8\xcd\x4b\xc9\x68\x29\xd6\xde\xc5\x6e\xdb\x6e\x1a\x41\x0e\x7c\x2c\xc8\x02\x1f\xb8\x8f\xea\xef\x43\xe0\x02\x38\x50\x4c\x43\x2a\xc7\xd1\x85\xde\xb5\x5b\xd0\x87\xca\x85\x03\x28\x1d\x18\x03\x1b\x4c\x0b\xe8\x85\x83\x71\xce\x7d\x70\xf2\x9b\xd8\xe7\xbc\x9a\x83\x78\x61\x37\x7d\x5b\x68\x5d\xf4\xe8\x6b\x4b\x98\xe7\x82\x83\x1c\x18\x78\x8c\x98\x2b\xa6\xac\xae\x8c\x25\x53\x01\x2a\xcb\x3d\x75\x19\x26\xd6\x9e\x25\xec\x15\xb7\x87\x76\x1c\xdd\x24\x23\x80\x89\x43\x41\xda\x91\x0f\x5d\x8c\x27\xbb\x27\xbc\x29\xb3\x24\x6a\x2e\x2e\x7b\xfa\xed\x1b\xc6\xaa\xea\x55\xea\xdd\xac\xf6\xcf\x68\x8b\xaf\x83\xc9\xc6\xc7\x06\x10\x9f\xb6\x7e\x72\x59\x72\x2e\x2f\xb4\x30\x48\xeb\xa9\xa5\xb0\x9a\x0e\x44\x0f\xc3\x25\xa6\x5e\x7a\x1c\x3f\xc6\x1a\xc9\x25\x42\xbc\x02\xb1\x3f\x47\x88\xdf\x0e\xfb\x47\xf0\xe6\xd1\x14\x65\x66\x84\xad\x71\x35\x47\x85\x8f\x83\x6e\xc5\x29\x6d\xa7\xda\x00\x0b\x6b\x52\x95\xbe\x66\xcd\x24\x43\x3e\x78\xd8\x64\x02\xd5\xf5\xe4\x0e\x85\xcb\x1d\xb0\xad\x94\x9d\x0f\xa8\x43\x55\x59\x59\xd6\xa3\x8a\x0a\xd8\xd9\xae\x5b\xe6\xe7\xdc\x46\xa5\xa7\xe4\x9f\x25\xbf\x8d\x13\x59\xaf\xf3\x73\xbf\x7b\xbf\x81\x11\xe4\x1b\x03\x9a\xcf\x20\x87\x7d\x59\xb7\x4d\x05\xbb\x5f\x76\x40\x68\xea\xa9\x4a\xc7\x8e\x1a\x98\xfc\x52\x65\xc8\xa4\x0d\x21\x88\x09\xd7\x6c\x4f\x04\x24\x23\x69\xc2\xe9\xe4\xdc\x29\x49\x52\x90\x3f\x91\x4d\x99\x15\x17\x64\x4f\x72\x1d\x90\xbf\x7b\x65\xbc\xfb\xdd\xfb\xcd\x73\xbd\x76\x53\xba\xc7\xda\xfb\x6c\xf7\x58\xef\x4e\x7b\x43\xa7\x3c\xed\x99\xf3\x0e\x07\x79\x08\x3b\x0e\x92\xbe\xef\xb3\xe2\xb1\x21\x24\x1b\xcf\x45\xca\xc3\x80\x67\x67\xa9\xbc\xc2\xc4\x74\xa6\x31\x88\x5c\x38\x69\x2e\xb5\x14\xfe\x82\x6c\xfe\x93\x2b\xf6\x85\x87\x4f\xb7\xe0\xee\xe6\xf7\x71\x87\x5c\xee\x37\x89\x7f\xc4\x1e\xb6\x7e\x62\x30\x9f\x4e\xb0\x85\xe5\x23\x7e\x7e\x94\x9a\xc7\x41\xca\x0c\xef\x76\x81\x2f\xea\xfa\xd3\xe5\x7e\x79\x2f\xf4\xd4\xac\xf7\xe9\xe1\xfa\xbd\x3e\x2c\xcb\x26\x12\x87\xbe\x94\xba\x6e\xef\x1e\xa2\x70\xe7\xd6\xaf\x3a\x1f\x0a\x0f\x6d\x28\xfc\x05\xe4\xb8\x9f\x7f\xd8\xc9\x54\x9f\xb5\x8c\xa4\x8b\xdb\xbe\xef\x7b\x33\xdf\xf4\x49\x02\x01\x8a\xbd\x77\x7c\xa9\x0b\x7d\x7a\x1b\x3d\xcf\x96\x30\x25\x3e\xa5\xe7\x0e\x6e\xfd\x63\xef\x61\x19\x4c\x46\x1e\xfb\x0c\x3b\xb7\x9b\x0a\xc6\xe0\x31\x24\x40\x5c\xf2\x4c\x9b\x1e\x92\x4d\x72\x13\xb3\x95\x67\x34\xdb\xa7\xdb\x22\x22\xc8\x6e\xde\x7d\x7a\x9e\x99\xbb\x2c\xc3\x35\xf7\x67\xe1\xc1\xc9\x05\x13\x30\x06\x1e\xe0\xce\x11\x77\xa4\x85\x2b\x48\x13\xe6\xa0\x72\xb6\x25\xb0\x9d\x78\x8a\x46\x1b\x6c\x90\xc4\x35\x00\x83\x26\xec\x43\x57\x55\xd8\xa2\xbe\x69\x30\x4b\x40\xd2\x3e\xe1\x0d\xca\xea\xb8\x16\xde\x64\x49\x51\x71\x07\x7c\x4c\xde\xdd\xc5\xdb\xc5\x35\xb0\xb6\xac\x32\x61\x47\xaa\x2a\x4f\x78\x55\xef\xed\xd4\x69\x88\x75\x38\xaa\x90\x28\xb0\x97\x07\xbd\x13\xa0\xca\xea\xba\x69\xce\xfb\xb0\x2d\x7d\x29\x3d\x2c\xa6\x7d\x10\x73\x30\x31\x06\x15\x76\x0a\x24\xa0\x69\xad\x1c\x63\x5e\x50\xc3\x7c\x23\x22\xde\x23\x01\xef\x37\x9f\xbe\xc1\xf7\xdd\x3f\xdc\x7d\xcc\xb4\xac\xf7\x41\x03\xbd\xe8\x3d\xa0\xb0\xb5\xa1\x43\x29\x6d\xb0\x51\x9c\x2b\x23\xc4\xa5\xae\x00\x12\xb8\xdd\xf0\xb5\x4a\xd2\x8b\xe5\xf8\x14\xf5\xcc\x96\x35\xfd\xd6\x3f\x47\xe4\xb0\x70\x0e\x6c\xa5\xf3\x74\x92\x29\x95\xad\x3f\xc8\x43\x3f\x1c\xe8\x68\x8d\x98\xb0\xf7\x6b\x75\x66\xd0\x6a\xae\xbc\x93\x4f\x89\xa1\x8d\x25\x5c\x35\xae\xa6\x5c\x83\x72\x2a\x92\x55\xe4\x8e\x92\x59\x9b\xfc\xdb\xe4\xef\x93\xff\x23\xf9\x2f\x89\xb8\x5a\x05\x9f\xfe\x71\x59\xff\x4f\x37\x77\xe9\xdd\xcd\xfd\x1b\xca\xe1\xd9\xdc\x7e\x4f\x69\xf6\x10\x63\x9a\xea\x5a\xa7\x39\x3b\xd9\x88\x66\x56\x92\xf3\x08\x70\x26\xc1\x12\x2c\x75\x59\x09\x81\x65\x51\xec\x4e\x15\x27\x07\x2b\x41\x69\x61\x31\x14\x92\x52\x4a\x1b\xc1\x5c\xbd\x0b\x5b\x62\x3c\x28\xc2\xd1\x49\x4e\x99\x91\xad\xd8\x8b\x13\x40\xca\x22\x40\x41\xae\x31\x91\x24\x70\x8a\x14\xa2\x59\x4b\x15\x0b\x24\x94\x94\x16\x3a\xc7\x00\x5b\x5a\xa0\xaa\xc2\x52\xe3\xba\xc2\xa5\xa4\x7e\x3a\x42\x1b\x11\x62\x98\x34\x8d\xa4\x0d\x6d\x18\x53\x40\xeb\xba\x0c\xad\xa9\x85\x34\x82\x86\x1a\x16\x47\xa7\x87\xbd\x01\xa4\xc8\xad\xaf\x35\xc3\x9c\x50\x4e\x58\xd4\x52\x9d\xe3\xc9\x6d\xe4\x14\xf8\xab\x88\xb8\xfd\xdb\x8b\x9a\xea\xff\xfc\x7d\x56\xb7\xba\x48\xcf\xff\x1d\x7c\xee\x31\x57\x3f\xff\x01\x2c\x80\x9b\x58\xb2\xbe\xf9\x31\x72\x51\x2f\x94\xf0\x0f\x77\xb7\xab\x67\x55\xde\x13\xe8\x0c\xd8\x06\x94\x92\x5f\xca\xb4\x0c\x34\xdb\x4d\x3b\xc8\xa6\x56\x1f\x99\xc1\x85\x41\x5d\x68\x74\x38\xf9\xc9\x43\x3e\xed\x60\x1d\x24\xac\x54\x0c\x4a\xc1\x18\x9a\xc0\x02\x4a\xd5\xf3\xa3\xac\xe3\x5c\x63\xad\xf1\x29\xec\x70\x20\x14\x4b\xdc\x61\x42\x30\xe8\x31\xa8\x7b\x42\xc8\x84\x1b\x78\x22\x24\x30\x42\x08\xf1\x8b\x84\x41\xf2\xcf\x63\x9d\x44\xc4\xcf\x79\xcd\x57\xf9\xc2\x98\xfa\xbd\x0a\xd2\x5b\x46\x8d\xd5\x1f\xe1\xae\x9c\x63\x6f\x40\x21\xf3\xb1\x3f\x51\x3e\x36\xb0\x98\x5a\xb9\xa6\xbf\x74\x0b\x07\xec\x1e\x30\x0f\xc8\xd7\x7e\xc5\xbf\x7a\x97\xa1\xc7\xed\xf3\x11\x79\x52\x6b\x12\x76\x61\x0c\x08\x85\x63\xe8\x10\x20\xf3\x87\x93\x98\x73\xbc\x0b\x7b\x39\x9f\x3a\x39\x4c\x47\xa0\x9a\x01\xf5\xb5\x2b\x1b\x85\x2b\x21\x50\xad\xcb\xa8\xa7\xd9\x6c\x7c\xe6\x2f\x9f\x61\x99\x99\x9c\xcf\x79\xe9\x71\x47\xaf\xf5\xe3\xe6\x4d\xdc\x15\x31\xe6\x5f\x16\xd4\x58\x8c\x80\xde\x0a\xf4\x5d\xbc\xcd\xc7\xcf\xe0\xf3\xbb\xbb\xcd\x0f\x60\x1f\x4e\xa0\xc4\xbe\xac\x00\x0b\xa6\x2c\x40\x3f\xf9\x1c\x9c\x72\xa1\x11\x2b\x45\x53\xd7\x79\xb0\xf5\x5e\x58\x91\x3f\x25\xc0\x03\x3a\xe7\x05\xc0\xd9\xb2\x82\x75\x5b\x08\x33\x88\xd6\xfa\xb0\xa7\xa0\xb4\x46\x10\xee\x00\x23\x79\xd8\x95\x12\xe6\xb0\x30\x08\xd5\xd3\x11\x21\x5d\x57\x4f\x89\x2d\x4c\x5e\xf3\x5e\x9a\xc6\x59\x0d\x5a\x4a\x15\x63\x60\x40\x9c\x99\xc0\x07\x23\x8c\x74\xad\x32\xc2\xb7\x07\x21\x0e\x21\xe9\x40\x83\xc3\x3e\x49\x72\x90\xc4\x3c\xa0\x4b\x6e\x93\x3f\x49\xea\xe4\x6f\x22\x17\xde\x82\x45\x7d\xbf\x5e\xbd\x45\x1d\xdd\xdc\xdd\xfc\x74\x69\x63\x7d\xfa\xe1\x15\x8f\x13\x49\x4f\xde\xaf\x57\x1f\x5f\x1f\x5c\x75\x8b\x2f\x30\x7c\xce\x4f\x61\x0b\x4e\x21\xcf\xda\xa8\xcf\xb4\x85\xc3\xd7\x06\xf0\xda\x48\xa6\x74\x96\xdb\x9c\x94\x65\x99\x9b\x82\xd3\xfd\xd7\x93\xdd\x77\xe5\x2e\xec\x31\xf4\xf6\xd4\x97\xfb\x30\x62\x80\xb4\x60\x52\x4d\x36\xde\xc1\x93\x12\x4c\xa8\xac\x13\xb4\xc6\x8a\x32\x49\xf5\x74\x00\x07\x34\xf5\x98\x4a\x81\x59\xd8\x9e\xb8\xa8\x46\x03\xc7\x69\x44\x48\xe3\x06\x43\x3b\x0d\x4d\xa3\x08\xc6\xd0\xc6\xd7\xc8\x78\x8b\x1b\x2a\x23\x19\x0c\x48\x7c\x6a\x37\x3c\xf2\xb0\x7e\xb7\x86\x81\x80\x8d\x8f\xbc\x0f\xd5\x2f\x38\x4d\xa6\x31\x33\x42\x44\xd9\xa1\x0b\x97\x7e\x97\x8e\x2f\x68\xc3\xff\x2e\xae\x9f\xfb\xdb\xeb\xd9\xf0\x3f\x80\xc8\x4c\xf9\xe5\xfe\xad\x84\xf2\xc5\xc2\xbe\xa8\xdf\x47\x4e\xf3\x74\x9b\xa2\xbe\xa4\xa4\x2e\x74\xc9\x4d\xcb\x15\x09\x96\x83\x06\x0f\x6e\xa1\xee\x5e\x8e\x33\x86\xc7\x70\x8c\x0a\x19\xaa\x0c\x3e\xb0\xaa\x69\xb4\x09\x5d\x3a\x4e\xc9\x50\x15\x48\x36\x9e\x12\xba\x0f\x07\xa5\xe9\x00\x4b\x11\xb6\x2c\xec\x18\xcc\xcd\xde\x84\x7d\x5d\x6b\xcd\x5c\x91\xc3\x66\xda\x57\xf0\x52\xff\xec\xa3\x36\xaa\x4b\x7e\x97\xfc\xeb\xe4\x53\x54\x06\x7f\x66\xfa\xb8\xf4\x0b\x16\xd9\xc9\x0b\x1f\xfb\xfa\x2d\x25\xc0\xc3\xbf\xff\xf8\x2e\x92\xd8\xdc\xbd\xa1\xff\x78\x59\x39\xcf\x1a\x40\x9f\x1e\xee\xb2\xc6\x96\x25\x14\xce\xef\x41\x8e\x43\x1b\x8e\x61\x1f\x0e\x68\x37\x52\xac\xd8\x81\x48\xed\x54\x28\xf3\x30\x3a\x2d\x45\xd5\x54\x04\xb1\xd6\x1d\x7c\x5a\xc0\x2e\x1c\x23\x75\x93\x0b\x02\xe6\x8f\x0c\xe6\xc1\x03\x1e\xb6\x35\x92\xa2\x51\x79\x71\x0a\xa7\xcc\xd5\x75\xa9\x05\x6e\x2a\x55\x33\x51\xa9\xaa\xa9\x10\x66\x9a\x34\xa8\xc1\xb9\xb5\x61\xdb\x7a\xa5\x0b\x57\x70\xef\x01\x7e\x74\xd9\x31\x14\x82\x29\xae\xb8\x9a\x6f\x08\x62\x52\x57\x55\xc9\x92\xcd\xa5\xdf\x43\x92\x7f\x99\xfc\x59\xb4\xe6\x2f\xb3\xd4\x2f\x9a\x6e\xd1\x7f\x7d\x6b\xd6\x3f\xdd\xfe\xb0\x9a\x93\x88\xd5\x6c\x1f\x3e\x5c\x5a\x7e\xb7\x7f\x6c\x96\x7a\x95\x1b\x04\x93\x86\x1a\x8c\x82\x98\xbf\xbd\xc7\x1d\x70\x76\xfe\x7c\x80\x9f\x7b\xc0\x82\xc8\x46\xab\x41\x2d\x77\x9a\x84\xad\x1c\xba\xfc\x31\xce\x1e\xb3\xb4\x0b\x8a\x4a\x8c\x2a\x42\x50\x10\xd6\x10\xa6\x05\x74\x14\x19\x84\x33\x82\x8c\xd6\xaa\x16\x5c\x31\x7c\xc0\x42\xe8\x46\xa9\x46\xed\x42\xdb\x99\xf6\x14\x4e\x46\x92\xd3\x8e\x69\x62\x0e\x82\x16\xb6\x20\x63\x55\x3b\x41\xa4\xe4\xb2\x51\x4b\xcf\x28\x25\x4f\x68\xd3\xa6\xbb\x37\xe8\xd9\x7f\xc2\x6a\x4e\xc7\xb4\xe9\x0b\xc4\x51\xa1\x4b\xe1\x0d\xd3\x38\x0c\x1c\x14\xcd\x68\x61\x39\x1d\x9e\x8f\x74\x77\x3e\x8d\x55\x51\x4b\xe4\x29\x66\x87\xb0\x53\x9a\x8d\xb0\x54\xa1\x17\x91\xb2\x37\x59\x47\xee\x0d\x99\xb1\xe4\xc7\x17\x06\x91\xff\xe1\x92\xbd\x7d\xf9\xfc\x70\x13\x85\xa1\x3e\x7f\x89\xea\x4a\x1f\xee\x9e\x65\x65\xe2\x2c\xee\xbf\xfb\x72\x73\xff\xfe\x22\x4b\x79\xf3\xe5\xe1\x1e\x44\x4c\xe2\xcd\x8f\xeb\xbf\x04\x1f\xff\xdd\xe7\x87\x55\x25\xda\xd1\xe4\x3a\xf4\xac\xc7\x94\x37\x87\x73\x03\x7b\xc1\xca\xa6\x31\xbb\x53\x89\x31\x3f\xee\xe2\x7f\x2b\x3c\x68\x30\x12\x2c\x2b\xd6\x64\x4c\x36\xd5\xe4\x51\x55\x82\x63\x28\x82\x3b\x68\xe5\xaa\xb2\x49\xeb\xaa\xd2\x53\x51\xe8\x22\x0f\xa7\x63\x5d\xb9\x3c\x6d\xba\x2e\x54\x5d\xc8\xab\x16\xa2\xc7\x2e\xdb\x4d\x39\xa3\x36\xaf\x23\x8f\x1f\x8a\x38\xd4\xbf\x4e\xfe\xe6\x2a\x2a\xf8\x15\x1e\xbf\xf5\xf3\xc8\xeb\xbc\xd9\xaa\xbf\x06\xff\x74\x1a\xbf\x75\xe4\xf1\x63\x16\x9a\xbe\x9f\x14\xdc\x9e\xe7\xac\xae\x0a\x8a\x48\x28\xc4\xd4\x84\xdd\x64\x31\x90\xa0\x08\xdc\x05\x09\x4b\x14\x10\xf4\x53\xdb\xb6\x36\x0e\xba\x33\x70\x7a\xec\x5e\x1e\xa9\x68\x61\x2c\x44\xd3\xc9\xf2\xa9\xad\xca\x31\xe3\x52\xb6\xda\xa3\xb0\x2f\x4b\x43\x1b\x21\x35\xab\x4c\xdd\x48\x83\x40\x85\xbc\x46\x08\xed\x11\x42\x41\x13\x42\x42\x5d\xe3\xaa\x28\x2f\x7c\x8c\x4d\xc4\x8a\x3c\xa3\x68\x5e\x14\xd7\x5e\x34\xd3\x9f\x7d\xea\x12\x4f\x3e\x63\xce\x3f\x3f\xa3\x6e\xdf\xd0\xdf\x2e\x4e\xc4\xb5\x65\x05\xc5\xa3\x5d\x99\xaf\x6a\xc5\x0a\x61\x59\x57\xd5\x55\xdd\x68\xd2\x34\xb8\x6e\xaa\xf2\x6b\x07\x93\x2a\xe8\x74\x7b\x46\xe9\xf6\xd1\x18\x21\xb4\x4e\x4b\x8e\x6d\xc3\xb6\xa2\xf2\x15\xcb\x6c\x45\x70\xa8\xa3\x22\x8a\x2b\x6d\x8e\x9b\x86\xb0\x32\x6f\x5c\x8a\xe9\x88\x71\x8b\xf1\x34\xd2\x96\x4b\xa9\xb8\xc4\x8a\xd7\x52\xd6\x4a\x44\x7e\x85\xf6\xa9\xd9\xf0\x6c\x7f\x15\xf5\xfc\x3e\xf6\xf9\xef\xbe\x7c\xba\x4c\xc8\x2d\xaa\x0e\xdf\xb0\xab\x5e\xf3\xb8\xbd\xdf\xfc\xfc\x01\xd4\xd0\x94\xae\x84\x72\x52\x05\xa4\xc7\x5f\xc8\x08\xcb\x62\xb2\xfb\xe5\x94\x5f\x8f\x5e\xed\xc2\x96\x83\x22\x2d\x01\x3a\x89\x63\xd8\x67\xc4\x39\x45\x26\x6a\x0c\xec\x48\x38\x91\x03\x3e\xe0\x03\x39\x30\x8e\x4d\x8d\x23\x37\xf1\x73\x6d\x75\xf6\x47\xa7\xe4\x4f\x2f\xbc\x5d\xef\x5f\xa7\x14\x7e\xfe\x76\x4c\xe1\xc3\xfb\xcd\x6d\xf1\xc3\xfb\x4d\x92\x3e\x6c\x6e\xae\x26\x19\xd6\xf7\xaf\xaf\x59\xfd\xf0\x6e\x03\x3f\xa6\x92\xfa\x1e\x21\x24\x49\xad\xf2\x9c\x2b\x2c\x08\x55\x18\x03\x97\x51\x2a\xb5\xd1\x4f\x49\xde\x71\x24\x69\xa3\x2a\xae\x31\x42\x5c\x2b\xc1\xc1\x30\x79\x5a\xc9\x9a\xa5\x27\x5d\x95\x53\x55\x94\xa2\xd1\x0e\x15\x65\x5d\xe3\xb4\x29\xb6\xc1\x85\xbd\xe4\x14\x94\x80\x81\xba\x2a\x75\xa1\xc2\x36\xb4\x73\xa8\x0f\xa9\x2d\xa6\x1c\xf1\xc6\x75\x48\x34\x08\xa7\x3c\xdf\x05\x17\xb6\x8a\x73\x50\x01\x06\x50\xe1\x9f\x92\xa7\xa4\x02\x45\xd4\xb8\x5d\xb0\xde\x4d\xe4\xa8\x9a\x57\xdb\x6b\x04\x73\xc5\x55\xf5\x2a\x29\x12\xeb\x96\x1f\x5e\x0b\x42\x5f\xae\xa8\x2f\xfe\xa8\xb9\xce\xf0\xec\xb7\x98\xd6\xc3\x11\x87\xed\xf1\x29\x39\xa1\xa1\xe7\xa4\xc1\x7c\x00\x42\xf1\xd0\x88\xa9\x34\x0d\xb1\x84\x51\x90\x9f\x8c\x39\x80\xd1\xcd\x19\x05\x91\x04\x97\x94\x56\xa1\x19\x95\x19\xc4\x16\x6e\xad\x51\xd2\x67\x4d\x85\x2a\x2d\x08\xaa\x0c\xa2\xb2\xd2\x15\x46\x0d\xaa\x85\xea\x1a\x8c\x8f\xb5\xd6\x67\x05\x07\x4e\xcc\x49\x9e\x8f\x00\x49\x69\xf6\x82\x55\xae\xc2\x63\x49\x5b\x21\x85\x12\x96\x69\x1d\x31\xae\x1c\xca\xb5\xc8\x64\x9c\x21\xba\x59\x10\x40\xb3\xfd\xb8\x4e\xb1\x96\xdb\x75\x4e\x42\x3e\xa1\x1a\x32\x58\x1b\x69\x85\x09\x82\x54\x7a\x8e\x9c\x79\xa3\x1a\x9e\x49\x45\x0b\x23\x48\x1b\x1b\xdc\xaa\x56\xbc\xa2\x1c\x33\xba\x60\x40\x9b\x8d\xcb\xd8\x0b\xf7\xf6\x97\xb7\x93\xae\xdf\x7a\xfb\x87\xbb\x9f\x3f\xa6\xdf\xbd\xff\x72\x0b\x5b\x49\x00\xe6\xc8\x23\x04\xba\x09\xc5\xa8\xaa\x8e\xbd\x2b\x03\xd5\x84\x40\x87\x70\x6f\xb4\x36\x3e\x3d\x09\xe2\x31\x87\xd8\x72\x47\xed\x54\xf2\xca\x57\x3c\x23\x9c\x0b\xd1\x30\x6c\x8c\xd1\xf1\xaf\x41\xe8\xbc\xa3\xa3\x54\xda\x68\x47\xbc\xc6\x91\x10\x84\x38\x87\x5a\x1b\x31\x44\x3e\x62\x2d\xc9\x05\xab\x52\x2f\x8a\x01\x6f\xb8\x9a\xfe\x00\xee\x9f\x29\x1e\x9e\x89\x73\x5e\x42\xb4\x9b\xbb\xb7\xb1\xff\xbc\xb5\x21\x69\xcb\x0a\x60\xb9\xcc\xe3\xd2\x62\x08\x8c\x00\xda\x86\x44\x9e\xea\x68\x52\x9f\x0f\xe8\x61\x17\x8a\x12\xe2\x42\x48\xdb\x56\xbd\x46\x55\x31\x75\x14\xec\xa6\x43\x46\x2a\x54\x9f\xab\x85\x96\xa9\x3f\x2a\xc3\x8c\x82\x06\x87\xbd\x08\x23\x0b\x5b\x0e\x51\x60\x2e\xa8\xb1\x70\x05\xdd\x83\xd6\x3d\x73\x34\xe1\x8d\xc8\x48\x8c\xd5\xef\x92\xbf\x7d\x65\xe1\x7e\xd6\xb2\x7e\x66\x50\x78\x43\x5b\x76\x35\x2b\xf6\xca\x12\xfb\xe5\xf7\x60\xbd\x59\x7d\xfe\x92\xb6\x16\xee\xa6\x61\x0b\x6c\x13\xea\x83\x0d\xfb\xe0\x05\x68\xc0\xec\xaf\x3b\x70\xd0\x84\x48\x3a\xe5\xb8\xb2\x15\x0e\x1d\x14\x0d\xf2\x55\x9d\xf6\x81\x37\x6a\x0e\x2a\xfb\x70\x08\xbb\x69\x4f\x80\x02\x49\x90\x5d\x28\xe1\x50\x57\x80\x19\x9c\x91\xa3\x51\xb5\x23\x5b\xef\x07\x66\x90\x36\x07\xca\x1a\xd1\x54\x98\xd6\xb4\x99\x0c\xc6\x55\x53\x5b\x41\x95\x62\x58\x20\x53\x36\xc4\xd4\x75\x83\xd8\x33\x6f\x9b\xc9\x50\xf2\xdb\xf8\x29\x17\xd4\xca\x37\x81\xd6\x5b\x79\xee\xb7\xbf\xfb\xb8\x00\x00\x47\x30\x2c\xea\x68\xf4\xeb\x01\xa2\x80\x43\x6f\x85\x8c\x74\xe6\x52\x3a\xd8\x80\xc3\x12\x4d\x8b\xaf\x1d\xa4\xa1\x1c\x85\x1e\xd4\x36\xf5\xd6\x9a\xce\x98\x6e\x64\x73\x48\xd8\x53\xae\x24\x0f\xa3\x52\xa6\x37\xa6\xdf\xd1\x70\x3c\xe8\x7d\xfc\x1e\x86\x58\x6b\x4a\x5e\xfa\xf2\x3f\x5f\xeb\xce\xfd\xee\x4a\x78\x2e\xfa\xba\x28\x84\xf2\xac\x36\xc1\xb7\x42\xd6\xb8\x62\x88\x7c\xed\xdd\x09\xee\x01\x3a\x5b\x88\xa7\x61\x8e\x6d\xcb\x54\x9e\xad\x85\x74\xea\xb2\x24\xe0\xe9\x82\xfb\x03\x76\x32\x69\x12\x6b\x24\x98\xef\xe7\x8b\xee\xb4\x7c\xc5\x25\xc9\x6c\x88\xe7\x11\x77\xe5\x5b\x25\xfd\x4b\xac\x7a\x61\x09\x58\x8a\xb0\x9b\xbb\xcf\x0f\x9f\xe2\x64\xec\xa5\xa3\x15\xe1\x40\x5d\x9a\x4c\x1c\xfa\xa8\x6f\x91\x26\x54\x6b\xda\x7c\x45\xe0\xa8\x05\x97\x2a\x50\xa0\x85\x10\x5e\x47\x7f\x5f\xa7\xc5\xb9\xb7\x13\xc1\x10\xf9\xa9\xca\x24\xc0\xa0\x50\x4f\x49\x18\xd3\x5a\x1b\x6b\x8d\x36\x4a\x13\xca\x8a\x86\xe8\x39\x02\xad\x25\x66\x58\x75\xad\x36\x61\x6c\x0c\xea\x2b\x26\x8d\x66\x4b\x7d\xbe\xd9\x54\x19\x89\x1a\xb4\x1f\x93\x04\x5c\xf4\xe4\x2e\x7a\x32\x91\x88\xef\xe6\xd2\x81\x9b\xbd\xea\xcd\x45\x31\x09\x74\x7b\x3d\xae\x0e\x2e\x2a\xa2\xa9\xd9\xc2\x26\x0e\x08\x07\xa4\x9b\x4e\x60\x70\xee\x91\xc1\xbe\x0b\x26\xb4\xb3\xa3\xa0\x10\x07\x09\x0a\x3b\xf9\x0e\xe4\xa0\x6e\x77\xbb\x36\xec\xc2\xa9\x0d\x8a\xc7\x9e\xdb\xee\x89\xac\x0f\x99\x4a\x7e\x1b\x7b\x2d\x17\x6f\x11\xc3\xfb\xc8\xe7\xf8\x5d\xfe\xbb\x54\x44\x7f\x4a\x71\x57\xd5\x50\x33\xe9\x39\x9e\xda\x3e\x1c\x05\x70\x20\x91\xc7\x10\xc1\x39\x99\x8d\x55\xd7\x02\x5a\xff\x28\x1d\xe0\x99\xaa\x51\x6d\x8c\x42\x82\x5b\x21\x7d\xab\x24\xd2\xc6\x59\x63\xed\xf9\x48\x29\xdc\xe3\xa5\xff\x77\x8c\xfd\xbf\x7c\x41\xe8\x2c\xe3\x8d\xdf\x11\xca\x5d\x4b\x7f\xdd\xdf\xdc\x7d\x88\x04\xc2\xa1\xc8\x54\x28\x0b\x78\xd0\xba\xa1\xb5\x6c\xc4\x64\xf3\x7c\xdf\xcb\x6e\x90\x47\x72\x62\xa1\x74\xb0\x0f\x43\xda\x9c\x47\xc8\x41\x1b\x98\x0c\x25\xe7\xe5\xbc\xb0\x9a\xa2\x64\xca\x68\xde\x62\x8b\xfb\xe9\x00\xdb\xd3\x62\x67\x40\xf9\x44\x37\x79\xa6\xae\x62\x9d\x2b\x2d\x92\x9b\x58\xcd\xbc\x79\xa3\x47\x72\x51\xc3\xb1\xb0\xf4\x90\x4c\x3d\x1c\x26\xec\x27\x09\xed\x74\x88\x5a\x93\xb0\x02\xdd\xe3\x10\x35\x6e\xa2\x54\x4a\x7a\x34\x66\x3e\x91\x66\x18\xc0\x28\x75\xd7\x75\x53\xdd\xb6\x6d\xb2\xf4\x89\xf0\xc6\x66\x5d\xe4\xf9\xbd\x7b\x51\x0d\xb8\xf0\x06\x2e\x94\xaa\x8b\xb4\xf6\xaf\x41\xd7\x3e\xdc\xc5\x44\xf5\x1e\x50\x70\xd8\x9e\x3d\x1c\x82\x02\xc6\xcf\xa7\x70\x6a\xad\xed\x80\x9a\xda\x1e\x0c\xfd\x1e\xba\x49\x08\xe9\x6c\xa1\x9c\x9c\x0a\x78\x04\x75\x28\xc3\x10\x1c\x19\x7a\x0b\x05\x57\x42\x59\xab\x04\xe3\x44\x2a\x6e\x05\xcf\x4d\x4f\x70\x65\xaa\xd2\xcf\x76\x5a\x2a\xb4\xf0\xc7\xc6\x1e\x93\x4b\x8f\xd1\xb3\x2c\x0c\x4f\x17\x4b\xb4\x7e\x4b\x98\x70\x7f\x19\xda\x5d\xe6\x21\x56\xeb\xcd\xa5\x79\xa8\x56\x25\xc8\xc3\xe9\x5c\x97\x4d\x66\xfd\xb9\xb1\x76\xe0\x20\x77\x3d\x28\xaa\x32\xe4\xb0\x2a\xc2\x00\x76\x05\x1c\xe6\xd0\x29\xcd\xcf\x36\x1d\xcf\x4d\x7a\x3c\xe8\x13\xc2\xa1\x26\x04\x08\xc5\x8c\x18\x74\x83\xe7\x0d\x7a\xc0\x8d\x9a\x16\xbc\x97\x8d\x78\x0f\x91\xfc\xee\x0a\x35\xf4\x3d\x07\xf5\x35\x61\x1f\xac\x5d\x59\x03\xea\xa1\x9a\x0c\x3c\xfd\x52\xa7\x38\x10\xca\xd5\x21\x3b\xfa\xc7\x9d\xf7\x59\xfd\xb8\xcb\x1a\x84\xd0\x30\x98\xd6\x98\x96\x61\xde\x4e\xc7\x69\xcb\x38\x6c\x42\x37\x24\x09\x00\x02\xec\xd7\xbb\xac\x4e\x6e\x7e\xad\x9b\xbe\xd2\x3b\xed\x2a\x34\x1d\xa7\x2e\xf6\xcd\xfd\x08\x28\x10\x18\xa7\xce\x0f\xac\x69\x9a\xd2\x18\x50\xa2\x9d\x29\x6a\x8c\x16\xfd\xd0\x8d\xca\xaa\x38\x71\xf6\x2a\x1f\x7c\x41\xe1\x2f\x76\xe0\xe6\xd3\x45\x4b\x0d\x52\xc2\x6d\x2f\x5c\x51\x66\x68\x32\x69\x79\x3e\x80\xad\xf7\x8f\xa5\x07\xbb\xf3\x36\x45\x69\xa2\x38\xeb\x0f\x4d\x5d\xbb\xa3\x0b\xfd\x21\xd4\x0c\x98\x23\x20\xee\x18\x31\x00\x72\xa3\xa2\xaf\xf9\xa7\x60\x6f\x10\xb4\x0e\xda\x49\xa6\xc5\x2f\x4d\x5a\x4d\xb2\x98\x0d\xe6\x30\xe1\xb4\xfa\xa5\x4c\xd1\xc4\xa3\xff\xf0\xc6\xf8\x50\x5a\x6b\x5a\x6b\xdb\x79\x5f\xef\x9f\x9a\x0d\xca\xca\xe4\x77\xd1\xca\x7d\x2a\x36\xc5\x6a\xa1\x90\xba\x59\x5a\xba\x9f\xbf\x7c\xfe\x15\x02\x95\xc2\xe7\x93\x17\xc0\xf1\x76\x4b\x01\x03\x0d\x0d\xfb\xb0\x6b\xfb\x3c\xab\x84\x60\xaa\xf6\xb4\x09\xd2\xc3\x43\xd8\x17\x01\x75\x46\x8e\x0d\x62\xd0\x56\xda\x88\x26\xd0\x9a\x94\x15\xb0\x93\xe6\xbc\x74\x05\x01\xc3\x59\x64\x28\xf6\xcc\x63\xdf\xaa\xca\xaa\xd8\xaf\x8a\x36\xf5\x19\xad\x72\xb3\x5c\xd3\xcb\x3d\x48\x3c\x2c\x26\xe3\xc1\x6e\xfe\xeb\x43\x0d\x91\xf7\x5f\x35\xf0\xc1\x80\x1d\xe8\xc3\x3e\xb2\x04\xd6\x21\x6f\x42\x0d\xd8\x34\x92\x24\xea\xb9\xe0\x8d\x4f\x7d\xfc\xce\xde\x6f\x7e\x58\x6d\x92\xf4\x22\x7e\xfc\xe5\x77\xef\x96\xb4\x62\x75\x5b\x80\x8f\x9f\xff\x15\xf8\x69\x5d\x71\xcf\x80\x60\x81\xf3\xae\xd7\xaa\xc1\xd6\x72\x8f\xc6\x9e\xcc\x11\x85\x3a\xc2\x21\xf5\xb6\x9c\x0e\xc7\x16\x94\x50\x97\xc5\xc4\x50\x2d\x05\xde\x3d\x25\xc4\xb0\x86\xa5\x49\x71\x08\x5d\xd8\xe9\x23\xc8\x81\xca\x13\x90\xf8\x27\xbc\xc1\x69\x3f\x5f\xe1\x77\x4b\xbd\xf6\x1b\xc3\x19\x53\xaf\x25\xc8\x8b\xaa\xd4\x0f\x77\x7e\xed\xa7\x22\x87\x5b\x25\xe3\xe5\xa4\x53\x9f\x97\xa0\xde\xf2\x31\x1c\xcd\x53\xa2\x80\x69\xa6\xa3\x87\xdb\xfc\x7c\x48\x7b\xcb\xf0\x24\xe7\xab\x59\x52\xb0\xc7\x48\x1a\xeb\xa4\x55\xca\x1e\xa7\x26\xa5\x98\x2d\xf6\xdb\x3e\xd1\x0d\x49\xb7\xc9\x9f\x2c\x0c\xe5\x9f\x1f\x3e\xad\xdf\xcc\xe4\xbd\x42\xe6\x5e\x49\xb7\x16\x7c\xc7\x7a\x13\x01\xe1\x10\xcc\x17\x2b\xcb\xf7\xb9\xcf\xc1\x50\x08\xcf\x75\x61\x78\x53\xd6\x79\xd8\x96\xce\x1a\x90\x57\xdb\x8e\x61\x5b\xe4\x61\x17\x5c\xbd\x1f\x87\xb1\x3a\x79\x6f\x86\x56\x53\x6a\x8f\xa1\x1f\xdb\xb2\x4a\x4b\x2a\x04\x9d\xea\x5d\xed\x6b\xec\x40\x1b\xba\xe0\x8d\xdc\x81\x63\xd8\xda\xae\xa9\x6b\xd1\x68\x7f\xac\x4b\xeb\x41\x89\x0e\xb6\x28\x85\x6a\x82\x09\xc7\xba\x69\x9a\xf8\x19\xc4\xa6\xcd\x8a\x8b\x2d\xfb\x06\x81\x1b\xfd\xd1\x6b\x1f\xf9\x95\x94\xe0\xa7\x77\xb7\x77\x0f\xb0\x9c\x77\xa0\x40\xb5\x25\xbc\x32\xb8\xaa\x1f\xf7\x3c\x25\x53\x6e\x81\x87\x14\xd5\xa5\xab\xdd\x24\x42\x32\x36\x54\x82\xdc\x40\x9e\x15\xa8\xae\xa6\xad\x51\x85\x2b\x2c\xd0\x3a\x50\x8b\xaa\xb2\x50\xcc\x11\x2a\x60\xdd\x34\x72\x0c\x27\xef\x97\x6b\x1b\x75\x74\xd2\x3e\x59\x2d\xdd\xbd\x08\x5e\xfe\xdd\xfb\xbb\xdb\x6c\xf5\xbb\xdf\x83\x4d\xf5\x57\xe0\xfe\x2f\x36\x1f\xff\x1e\xfc\x1d\x88\xc1\xef\xc7\x75\x4b\xa6\xe6\x3c\xe2\x94\x56\xb8\x86\x2c\xa0\xa0\x46\x58\x00\x5e\x4f\xa7\x30\x67\x8d\xf5\x41\x8e\x1a\x21\x60\x80\x78\xec\xa0\xc3\x69\x6f\x9b\xca\x55\x2d\xa1\xe6\x68\x71\x8b\x78\x2b\x3d\x56\x9d\x15\x73\x7e\x25\x9e\xc8\xda\xa5\xec\x65\xfa\x2e\xf9\x56\x1c\x62\x3e\xd6\xce\x9f\x0b\xef\x9f\x25\x43\xe2\xc1\x1e\x8f\x84\x64\x45\xd8\xdb\xc0\x4d\x10\x26\x01\x73\xbc\xb1\xc9\xd3\x7d\x72\xfb\x6b\x98\x95\xd8\x97\x6c\x7d\x59\x67\xc9\x19\xcf\x91\x60\xaa\xce\xc6\xbb\x5e\x83\x26\xdd\xd7\x84\x58\x6b\xbd\x7d\x4a\x52\xbc\xd5\xea\xb0\x5c\x17\x19\xd7\x9c\x4d\x8a\x68\x5b\xde\xaf\x2e\xe5\xf7\x9b\xd5\xc7\x0f\x37\x9f\x6e\x3e\xbc\xe9\x81\xde\x3d\x43\xaa\x52\x53\x04\x3f\xf8\x72\x08\x47\x12\x8e\x65\x1c\x92\x49\x85\xec\xa4\xa8\xb4\xa2\x45\x19\x86\xdc\xef\xe5\x60\xf3\x3d\x1c\x2c\x0e\x9a\x10\x2b\x28\x01\x5b\x64\x1b\x50\x87\xe3\x61\x4a\x9e\x92\xc2\x16\xd4\x83\x63\x50\xc1\x5a\x2d\x00\x8d\x98\x0b\x18\xb9\x1d\xda\x74\x88\x91\xfb\x82\x27\x8a\x91\x66\x9c\xd6\x59\x27\x11\xad\x06\x2e\x82\x54\xa7\x2a\xf7\x55\x8a\xa7\x64\x84\x92\x4d\xee\x44\x83\x08\x5b\x01\x9b\x6e\x6a\xb2\x83\x20\x1a\x4b\xe8\x74\x5b\x38\xed\x82\xd2\x9d\x07\xe3\x36\x74\xd8\x69\xe0\x40\xcf\x04\x8d\xfa\xcb\x20\xe9\x9e\xd4\xc6\x67\x75\x8c\xbf\x2f\xf3\xeb\x8b\x05\xbb\x7d\x03\xbf\xff\xc3\x22\xb0\x14\xcb\x94\xce\x47\x17\x31\x7a\x1f\x1a\xde\x01\x22\x0a\x57\x51\x12\x78\xd8\x99\xa9\xf3\xa0\x9b\x4a\x78\xc8\x6a\xe7\x83\x07\x49\xa8\x49\x57\x97\xd8\xa0\x01\x23\xc2\xf7\xc0\x3e\x25\x80\xfb\xcb\x5e\x57\xe9\x3e\x56\x48\xbf\x9b\x9f\x7f\x45\x8b\xcd\x6b\x03\xdc\xdc\xdd\x1c\x80\xf2\xe0\x14\xc3\x90\x39\x40\xf4\xd3\x89\x04\xcf\x40\x4e\x03\x01\xdb\x60\xb2\x22\xe4\x69\x35\x0c\xc3\x60\x9f\x92\xa8\x6d\xfb\x94\x74\x56\xb5\x51\xd8\x69\x3e\x62\x5d\xa7\x7b\x32\x1b\x95\x8d\x17\xad\xe9\x04\x44\x86\xf1\x8b\x36\xc0\xd5\x6c\x4e\x5a\x8a\xa7\x24\x92\x39\xc3\x0e\x50\x50\xe9\x70\x0c\xfd\xd9\xaf\x76\x13\x4f\xcb\x5f\x70\x9a\x4f\x22\x1b\xd5\x53\xa2\x8d\x1b\xfd\x4e\xef\x5d\x20\x7e\x61\x94\x8a\xfe\x01\x6f\xf2\xb4\x8d\xeb\xf3\x57\x53\x5f\x50\xae\xd4\x23\x29\x57\xa4\x70\xbd\xeb\xab\xd1\x48\x52\x7d\xf5\x34\xf3\x8f\x75\xda\x06\xdc\x85\x71\xa8\x5c\x89\x2d\xd8\x46\xcc\xcf\xee\x89\xae\x59\xba\x7f\x9e\xe7\xbf\x5d\x96\xc0\x4b\x18\x9b\xa4\x4d\x2b\xe0\x3e\x1c\xce\x05\x49\xfd\x69\x62\x74\xce\xf5\x35\xe3\x1e\x98\x74\xdf\x38\x3b\xb9\xb1\xb5\xe0\x44\xb5\x61\x5a\x12\xcc\x17\x4c\x04\x88\xb5\xb8\x3c\xf5\x0b\x96\x68\xc9\x67\x8a\xf5\xd5\x52\x87\x9b\xf5\x42\x58\x73\x80\x22\xf7\x79\x5a\xca\xce\xf9\xba\x6f\x69\x51\x4e\xba\x8e\xb3\x07\x80\x81\xa2\x9e\x3a\xb8\xe5\x52\xf2\x49\xec\x91\x47\x58\x00\x1f\xb6\x76\x30\x56\x81\xf2\xb0\xe0\x66\xf1\xa6\x4b\xf7\xd1\xa7\x5d\xde\x07\xde\xfc\xf8\x77\x60\x29\x85\xff\x25\xf8\x8b\x9f\x1f\xfe\xfd\xbb\xcb\x00\x0f\x28\x61\x5e\xf8\x02\xb2\x5a\x10\xd4\xe4\xbe\x90\x86\xf4\xa2\x0c\x94\x4e\x5e\x41\x44\x43\x09\x7b\xdd\x7a\x13\x64\x38\xd6\xdc\xa3\x9d\xa5\x7c\x0b\x48\xc8\x0f\x6e\x04\x7a\xd9\xcf\x3a\xe6\x73\x45\xb2\x4a\xfe\xab\x24\x01\x3f\x80\x4d\x92\x7e\x78\x0f\x93\xcd\xc7\xcf\xc9\x2a\xef\x40\x4f\x43\x35\x06\xe2\x59\x38\x9e\xf4\x09\x24\x59\x31\x95\x61\x68\xc1\x6c\xe8\xaa\x50\x85\xa2\x37\x03\x18\x92\x14\xe8\x79\x1f\xae\x50\x72\x9b\xfc\x55\x54\xfb\xb9\xa8\xe0\x2c\x34\x31\xb1\x58\xfe\xf9\xcb\xfd\xa5\x7d\x71\x7f\xe9\xd0\x3f\x6c\x5e\x3a\xf7\xab\x17\x5a\xc6\xd9\x2c\x3d\x13\x66\xac\x3e\x56\xe0\x70\xb0\xfb\x51\x60\x59\x21\x4b\x18\x33\x74\x84\x3d\xc8\x2d\xa8\xf7\xaa\x23\x83\xb0\x0d\xf5\x7c\x94\x3d\x2c\xc9\x29\x8c\xd0\x4d\xbb\x1e\xe8\x26\x88\x9d\xdb\x05\xc5\x80\xe9\x42\x05\x79\xc0\x08\x36\xd9\x28\x84\x61\x02\x37\xcd\x7e\x90\x44\x0a\x6b\x38\x37\x1a\x5b\xe1\xc2\xf1\x84\xe7\x00\xdc\x06\xa5\xab\xc2\x9a\x9e\x18\x02\x92\xe0\x80\xdc\x39\x63\x9c\x31\x85\x8d\x7c\xb7\x70\xce\xc1\xfb\xb5\xb9\xf0\x7c\x2c\xd5\xd8\x87\x97\x0a\xf3\x6c\x09\x93\xd5\xc7\xcf\xff\x61\xde\x7f\x77\x2f\x45\x1d\xf0\x46\x13\x2e\x79\x61\xea\xcf\x76\x6d\x85\x60\x12\x28\x25\x2c\x1c\x43\x42\x8e\xd4\x06\x09\xea\x66\x98\x33\xe2\x78\xf4\x46\x4b\xe9\xa6\xad\x56\x03\xeb\xe0\x9e\x87\x76\xb2\x04\x5a\x30\xf0\xa0\xa6\x84\xa4\xc5\x3a\x6a\x9f\xf8\x70\x44\x0d\x0f\x27\xa2\xeb\x0a\x01\x0e\x39\x0d\x43\xe4\x02\x3a\x4a\x27\x9d\x21\xa4\x93\x4a\xf4\x22\x6c\x99\x16\x58\x86\x41\xe8\x38\xc7\xf9\xcf\xa0\x7d\xe2\x9b\x7e\xad\xae\xfa\xea\x1f\xa2\xfa\xcd\x7f\xff\x46\x7d\xe3\x59\x82\xfb\x6d\x0f\x60\x61\xd3\x8c\x95\x8f\x0f\x9f\x6e\xde\x30\x1a\x5d\x2a\xe7\x35\x18\x2d\x4c\x42\x02\xfa\x73\x09\x7c\x68\x7a\x50\x84\x23\xf0\xa0\x9e\x9a\xe7\x47\x41\x0b\xae\x98\x0c\xd4\x96\xcc\x32\x90\xf8\x46\xb6\x38\x77\x05\x0f\x87\xad\x4a\x0b\x49\x1d\x96\xab\xa3\x31\xc6\x4e\x14\x76\x36\x30\x6b\x67\xcf\x66\x4c\xd8\x4a\xcf\x9d\xa9\x9f\x92\x3d\xdd\x8f\x41\x97\x15\x6e\xd1\x4e\x12\x0a\x3a\xdb\xb2\xa5\x76\x95\x25\xfc\x09\x67\x38\x7e\xbe\xf9\xd3\x7d\x79\xcb\x6d\xf1\xf0\x46\x0f\xff\xf6\x6e\xf5\x7e\xf5\xdd\x30\xd7\x65\x11\xfe\x24\x80\xf5\x73\x1e\x0b\xf8\xb9\x03\x34\xc8\xb4\xb3\x93\xb6\x03\x44\xd3\x16\x32\x1c\xb6\x73\x70\x3a\x5a\xae\xb4\xd5\x5b\x0e\x12\x1b\x2c\xb0\xe1\x84\x80\x5e\x27\x4a\x19\x69\x8c\x0c\xdd\x53\x62\x1c\x28\xf6\xb2\x56\xb5\x36\x15\xa3\x9a\x91\xb0\x07\xd8\x29\xa5\xbd\x51\xa5\x2e\x93\x97\x5c\xd4\x40\xb4\xcc\x97\x65\xb1\x4f\x13\x0d\xee\xcd\xfd\xcd\x73\xa5\x2d\xb2\xc0\xae\x2c\x0f\x3b\x9b\x56\xd3\x00\x0a\xc0\x59\x68\xc2\xd6\x85\x7d\xa0\x02\x54\xa0\x9e\xf6\x69\x31\x6e\x09\x34\x10\xc9\x46\x18\x81\xbc\x18\x42\x0f\xd8\x28\x4d\xa3\x0c\x2f\x72\x55\x26\xc9\x2a\xad\x9e\xc8\xc6\xaf\x55\xf2\x21\xf9\x43\x44\x8d\x44\x1c\xc2\xd2\x34\x8d\x75\x9b\x28\xc5\xff\xb6\x0b\xb7\xe8\xb9\xbd\xbb\x80\x43\xdf\x44\x66\x1f\x7f\x7e\xb8\xd6\x9c\x8f\xae\x0f\x03\x51\xe5\x36\x2f\x8f\x9c\x08\x5a\xe9\xd0\xd6\x5c\x35\x85\xae\xf8\xd0\x73\x24\x42\x4f\xf6\x22\xec\x4a\x0f\x2c\x60\x2c\xe8\x80\x31\x48\x40\x41\x51\x69\xca\xd9\x68\x39\x44\xd2\xc1\x4d\xda\xc7\x4e\xf8\x7c\xac\x7a\x2a\x4b\x4e\x28\x6b\x68\x65\x4c\x55\xd4\x04\x29\x82\x69\x7b\x64\x06\xd9\xe0\x58\x8d\x25\xae\xab\xb2\xc8\x0b\xd1\x18\x5c\x96\x7c\x3f\x71\xc6\xa0\x3f\xcc\xfb\x21\x49\x92\x3c\x65\x4f\x64\xa3\xd6\xfa\xa5\x76\xfd\x8c\x25\xf9\xbe\x86\x7d\xe9\x00\x7d\x1b\x7b\x81\x4f\x37\xf7\x9b\x9a\x04\x31\x75\x08\x1c\x40\x6b\x09\xb7\x32\x74\xac\xb1\x0d\xdd\x73\xec\x1a\x9e\x25\x2e\x70\xb7\xa8\xf0\xfa\xc0\x67\x57\xb7\xd6\xc6\x56\x56\x36\xa7\x96\x8c\xd6\x76\x4d\x67\x0a\xdb\xe1\xce\x04\x73\xce\xa5\x4c\x4f\x41\x9f\x26\x73\x84\xf9\xb9\x48\x92\x55\xa2\xa0\xde\x98\xb5\x89\x75\xaa\x17\x2c\xfc\xcf\x2f\xfa\xfe\x0b\x06\xfe\xfd\xa5\xbc\xa7\x52\x54\x96\x6d\x5d\xa6\xf5\xe9\xb8\x5d\xf1\xaf\xde\x66\xcd\xe3\xe8\xd2\xe2\x7c\x8c\x3c\xd8\xeb\xb2\xae\xea\xa6\x31\x74\xc2\x0a\x6c\x59\xd8\x0b\x9a\x5c\xb0\x6b\x0d\x5c\xe6\x77\x23\x66\xe6\xda\xef\x2e\xea\xd1\x70\x0c\x3a\x13\x0c\xec\x4b\xdd\x0a\x57\x0f\x02\xe3\x3c\x24\x2c\xd8\x6a\x1a\x05\x38\xc1\xc4\x1c\x83\xec\x4b\x5b\xf1\xdd\x71\x1a\xb4\x93\x49\xb2\x82\xf4\x89\xac\x92\xb5\xb8\xd4\x8b\x3f\x46\x6c\xc2\x7d\x94\x46\xba\xb2\xfb\x31\x09\xb9\xb2\x8b\x17\x3a\x95\x8b\x68\xd5\x8f\xaf\x1a\xd7\x37\xf7\x69\xd3\x1d\x0c\xc8\x07\x41\x34\x22\x86\x09\xa6\x73\x82\x64\x4d\xc0\x49\x62\xcc\x30\xab\x4b\x55\xd4\x81\x1c\xcc\x6c\x53\x72\x67\x24\x97\x64\x10\xa0\x38\x64\x58\xcf\x5b\x56\x4b\x4d\x24\x0f\x87\x93\x66\x54\x43\x2d\x0d\xd6\x0a\x61\xc3\x28\x9f\x92\x86\xd4\x04\x77\x6d\xab\xab\x8a\x6b\xa5\xd8\x68\x58\xbf\xf8\xfb\x2c\xe1\xd0\x6d\xf8\xda\x5c\xe9\xec\xbc\xbf\x0e\x9e\x2f\xa4\xfb\x9f\x16\x00\xc5\xc3\xdd\xc3\xfd\xab\x16\xf7\xea\xb9\x0b\xfc\x9c\x0e\x5e\xeb\xec\x1c\x2d\x02\xdb\x70\x8a\x13\x6e\x45\x38\x3a\x53\x04\x1d\x44\x6d\xb4\x0e\x03\xc0\x0e\x35\x5c\x3f\x25\xca\x8c\x7c\xbb\xb2\x5b\x0b\x0e\x04\x23\x56\xf1\xaa\xfe\x7a\x54\x0d\xd6\x98\xf0\xc3\xda\x54\x4c\x2b\x25\xa4\xcc\x0b\xd9\x94\x06\x94\xe1\x98\x03\xa6\x14\x42\x42\x68\xb2\xd3\xca\xb0\xa9\x48\xf5\xa4\x28\x2d\x4d\x89\xc0\x40\x38\x0d\x35\x20\x18\xc9\x3e\xd6\x92\x25\xf4\x1b\xb3\x76\xd7\xeb\x6b\x61\x74\x89\xdc\x2d\xdf\xac\xaf\xac\xa9\xcb\xb4\x38\x1d\x52\x5c\x94\x53\xbb\xb2\x5f\xa5\xcb\xf8\xa3\xef\xe0\x69\xce\xb4\x76\xa1\x5e\xbb\x86\x58\x5b\x57\xe1\x38\x51\x03\x3c\x5e\x56\x58\x92\xfc\x06\xba\x68\x5f\xf0\x55\x4d\xef\xbf\x8d\x8a\x72\xff\x90\xfc\x2f\xcf\x75\xab\x0b\xa4\xf4\x32\x33\x35\x3f\xf7\x0c\x62\x98\xef\x57\x97\x28\xe2\x2d\x87\xd5\xcb\x84\xc6\xfb\x6b\x30\x40\x9d\xa1\xd0\xc0\xc2\x06\x6d\x83\xb1\x30\x0f\x35\x8c\x48\xbd\xe9\x34\xdf\x96\xf3\x05\x87\x15\x68\xc2\x38\x15\x7b\x3d\x0c\x92\xb1\xa6\xd1\x54\xb1\x8e\x6f\x33\x65\xc3\xd1\xda\xe8\x95\x2e\xc7\x1a\x2b\x1e\xdc\x61\x8e\x8c\x77\x80\xf1\xb0\x15\x5c\x30\x21\xc4\xce\x5a\x4d\xa4\x54\x9c\x06\x04\xda\x6d\x27\x0f\x00\x1f\xcf\x44\x88\xb4\x3f\xaa\xe0\x54\x58\xf8\x04\xfe\x79\xfc\xec\x76\xad\x92\x77\x57\x3d\xf8\xff\x98\xfc\xe7\xe4\x7f\x4b\x44\xf2\xff\x3e\xfb\xd7\xb7\xdc\xa7\x51\xc0\xea\x85\x3d\x21\x5e\x9b\xc8\x51\x7d\xb9\x36\x0f\xf7\xb7\x1f\xef\x6f\x3f\xad\x1e\xee\x6f\x3f\xdc\x7e\xba\x78\xd9\x85\x5a\xf2\xcf\x01\x4c\x3f\xfe\xf0\xe5\x79\x42\xf8\xba\x42\xb9\xbc\x00\x1e\x40\x61\x41\x63\x17\x04\xe8\x68\xc3\x11\x94\x40\x9a\xae\xac\x44\x53\x93\xa0\x00\x35\xa3\x19\x0c\x20\xc1\xc2\x61\x34\xc3\x00\xe8\x18\xfa\x61\xf2\x92\x31\x2e\xb9\x62\x4c\xc8\x51\x53\xab\xed\x08\xb9\xed\x3a\x22\x71\x53\x12\x52\x4f\xde\x68\xce\x84\x9a\xfd\x9c\x52\xb1\xf7\x7d\xe4\xbc\xae\x30\x26\x8a\x4e\x7b\x2e\x84\x80\x35\x0d\x47\xc6\x18\x6b\xe9\xfc\x1f\xac\x31\x93\x1c\x1f\xe3\xed\x81\x86\x2e\x8c\x02\xd4\x8c\x52\x35\x72\x5a\xd8\x12\x77\x08\x53\xc5\xc9\x73\xbc\xe5\xd6\x32\xf9\xe1\xd2\x03\xfc\x2f\x97\x6b\xb7\x28\xe1\xff\xf6\x85\xe9\xf4\xef\xc1\x87\x5f\x79\xea\x5a\x1d\x7f\x5e\x30\xcf\x45\x8f\xf5\xea\x99\x41\xef\x7b\xe6\xbf\xe8\xdd\x6e\xef\x6f\xae\x83\xb6\x35\x36\x4d\xcd\x99\x2a\x24\x63\x94\x62\x21\x35\x9f\xba\xeb\xa7\x1a\x29\x35\x07\x5e\x15\x58\x36\xd3\x10\xef\x32\x66\xa6\xbd\xa0\x42\x0b\x46\xec\x29\xec\x4f\x3b\xa4\x24\x31\xcd\x91\x6a\x8a\x4b\xca\x9a\x71\x57\x8f\x7d\x38\x96\x5e\xcc\x5e\x9c\x77\x96\xbb\x2e\x94\x5c\x1d\xf1\x76\x2d\x55\x8d\x24\x6d\x08\xe1\x8a\x13\x4e\x04\xd9\x9d\xbe\x7b\xa6\xab\x9c\xc6\x5a\xc5\xdb\x80\xc2\xd0\x57\x92\xe4\x05\x26\xcd\xde\x55\x88\x36\xb6\x23\x06\x85\x1d\xa7\xb5\x45\xf8\x54\x95\x9a\xe9\x4a\x31\x33\x00\x72\x3e\x71\x2b\xed\x7c\x6a\xdc\x90\xe4\x5f\xa4\xcd\x53\xb3\xb1\x6b\xf6\x82\xf5\xfe\xcb\x6f\xd6\x6b\x02\x6e\xef\x6f\x3f\xdd\x44\x49\xda\x9b\x88\x75\x99\xa3\xc1\x87\xfb\x5b\x70\x77\xfb\xe3\x6f\xc1\x8f\xd7\xc8\xe0\xfb\x4f\xbf\x7b\xff\xe5\xf3\x97\x6b\x86\x8e\x17\x59\xe8\x67\x04\xd2\x1c\xc2\x75\xd3\x60\xb5\x06\x79\x38\x69\x0d\x7a\x58\x70\x4c\x18\xe1\x94\x72\x2e\x29\x45\x64\xa8\x9a\xa6\x2a\xcf\xea\x45\x90\xf0\xf9\x30\xb3\x6d\xc4\x3b\x58\x0d\x56\xda\x61\xcd\x34\x0f\x3d\xd7\x69\xbe\xe7\x8b\xdc\x33\x87\x42\x37\x5b\x95\x33\x64\xb0\x60\x58\x11\xe6\x76\x56\x72\xcc\x27\x31\xd5\x30\xa1\xe1\x44\xc2\x89\xec\x24\xc5\x06\x11\x42\xd4\xc2\x75\xb5\x86\xbb\x68\xa7\x74\xf2\x2e\xf9\x9f\x92\x7f\x48\xfe\xf7\xe4\xff\x4a\xfe\x9f\x5f\xdf\xa1\xcb\xb2\x58\xf4\xde\x5f\xc8\x09\x7f\x8e\x22\x87\xf7\xaf\x45\xe3\x1f\xd7\x9b\xbb\x9f\xd3\x2f\x3f\xbe\xbf\xbb\x5d\x7f\x5c\x08\x6d\xbf\x99\xfc\xb8\x6e\xf2\xa7\x05\x48\x1c\xa8\xdc\x6c\xa0\x5c\xd8\xbb\xa7\x24\x1d\xa8\xa6\x5a\x4c\x47\xd5\x32\x4e\x11\x62\xa8\x29\xeb\xa6\x61\xbc\x2a\x06\x2a\x98\x23\xa6\xc8\x41\xc9\x31\x70\xa6\x36\x39\x60\xe4\x50\xd6\xa8\x3a\xf7\x69\x1b\x34\x91\x51\x9e\xa4\x0a\x52\x69\xd9\x71\x0f\xf7\x56\x2a\xe9\xd6\xa5\x10\x42\x58\x21\x38\x9f\x06\x41\x0c\x55\xa4\x51\x42\x21\x8c\x6a\x56\x37\x25\x42\x35\xa7\xb8\xd1\x4c\xd8\xbe\xaa\x4a\x59\xee\xe8\x00\xf2\xaa\x2a\xb5\xd1\x18\x93\x66\x1a\x6c\x70\x82\x55\xb6\xc4\x80\x22\x32\xce\xff\xa4\x36\xca\x99\x45\x27\xea\xb0\xaa\x36\x66\x6d\x17\x86\x87\xef\xaf\x1a\x3c\xcc\x09\x1b\x8f\x10\x74\x1b\xbc\x0d\xa7\x75\xa1\x94\xd6\x4a\x4a\xa5\xe6\x1c\xb4\x7f\x62\x6b\x01\x17\x3f\x71\x51\x9a\x7a\xdb\xcb\x88\x75\x80\x31\x63\x53\x43\x78\xda\xbb\x73\xe7\xa4\x22\xa0\xee\xc6\x3e\x8e\x08\x60\x83\x71\xa8\xea\x1a\xc8\x06\x69\x21\x03\x6d\x97\xdc\x96\x3f\x89\xb5\x87\xfc\x8f\xfe\xbb\x91\x28\x05\xb0\x15\x39\xf7\x84\xa5\x07\x77\xa6\x5e\x5b\x32\x9b\xbe\x3d\x48\xd2\xee\x4c\x21\xb7\xb8\x09\x45\x5d\x03\x81\x91\x56\x2a\xd0\x2e\x49\x32\xa8\x9e\xe8\x8a\xac\xf5\xc5\x7f\xa2\x8b\xe2\xe6\xcd\xdd\x55\x2b\x3f\x7d\xb1\xe3\x3f\xbe\xd1\xb0\xb8\x87\xd1\x83\xa5\x83\x2b\xca\xc3\xb4\x77\x55\x13\x81\xf9\x65\x38\x74\x87\xa2\xf2\x75\x79\x08\x6d\x0e\x2a\xaa\x30\xab\x04\xae\xab\xbc\x43\x23\xdf\x95\x7e\xad\xab\xa6\x99\x63\x60\x12\x3a\x13\xb4\x09\x74\xd1\x60\xc2\x4d\x68\xda\xd2\x96\x0c\xe4\xa1\xef\x4c\x0f\xba\x24\x83\xfd\x13\x5e\xcd\x79\xcf\x72\x7e\x7f\x1d\xbd\xfb\x45\x31\x29\x36\x85\x3f\x3d\xdc\xa7\xb1\x9d\xf5\xe5\xfd\xe6\xda\x59\x6c\x3e\x7e\x78\xf8\xfc\xe5\x2e\x2b\x9a\x72\x9c\xc6\x6d\x89\x22\x32\xcb\xee\x76\x0e\x96\x8c\x8f\xd5\x81\x33\x84\xca\x1a\x35\x63\x03\x12\x4a\x42\xbb\x56\x5c\x1a\xc3\x48\x10\x41\xa8\x36\x68\x2b\x58\x8d\x0c\xde\x63\x92\x9b\xbc\xf4\xc8\x23\x87\x2f\xba\x87\x51\x6f\x7e\xe5\xa2\xa2\xdb\x7f\x4a\xe8\x85\x3d\xe3\xd3\x4b\x4c\xf8\x82\xd6\x7f\x78\x66\x34\xb8\x2a\x14\xbc\xfe\x72\xf3\xf1\xa7\x3f\xf6\x45\x66\xa8\x91\xea\x30\x2a\x46\x29\x35\xcc\x89\x5e\x9e\x40\x2d\x15\x02\x38\xdd\x35\x52\x83\xf2\x24\xf6\xc2\x45\x51\xb1\x41\x6d\x41\xb2\x43\x00\x3f\xb6\xab\xc3\x99\x63\x9a\x76\xee\xdc\x3b\x21\x09\xc8\x7d\x30\xc0\xa4\xe4\xdc\xaf\x9c\x2c\x0b\xa9\x70\xa3\x30\x0a\x07\x50\x48\x2e\xb8\x55\xac\xc8\x55\x55\xcb\xb2\xe0\xda\x68\x29\x74\x38\x81\xc2\x0a\xcd\xbd\xa6\x85\x2a\xcf\x3b\xd3\x34\x21\x47\x0d\xd0\x4d\xad\x85\x98\x17\x4c\x9a\xe1\x84\xad\x69\x5a\x5c\x66\xd9\x16\x06\xa3\x0b\x6a\x30\xc3\xb0\x98\x8e\xf6\x78\x3c\x1e\xd3\x62\x22\xc0\xb9\xc0\xfc\x6c\x93\x4e\x31\x7e\x10\xc9\x2a\x46\x68\x73\x2c\xfd\xe5\x85\xaf\xeb\xb9\xec\x77\x7b\x17\xb3\x92\x67\x3d\x94\x85\xc1\xf7\xe1\x19\x9d\x71\x95\xc5\xa6\x9d\x60\x9c\xf1\xac\x98\x86\x28\x52\x86\x27\x14\xa7\xdf\x03\x12\x9c\x73\x01\x4a\x21\x5b\xd1\x79\x70\xb2\xe0\x10\x84\x07\x05\x3b\xf6\xd6\x1f\x05\x48\x7c\xe0\x6b\xd1\x50\xc5\x71\xad\x75\x50\x5a\xa7\x66\x3a\x3a\x1f\x9f\xe9\xe8\xb6\x97\x5d\xd0\x9c\x9b\x9d\xf4\xfa\x10\x30\xe8\x76\xd6\x98\xc3\x9c\x07\x74\x4f\x78\xe3\xd7\x24\xe2\x39\x17\x2d\xe1\x67\xa6\xa8\x38\x63\xbd\xe8\xb5\xdf\xdf\xce\x16\x73\x3e\xcf\xa5\x13\x1f\xf5\xb5\xbf\xa5\xd9\x79\x8e\xf2\x36\xe2\xac\xd2\x2e\xd0\x06\xd3\xc6\x28\x22\x9a\x20\xad\xb0\xb5\x51\x44\xb6\xa6\x3d\xc1\xed\x84\xe0\x89\xf3\xba\xa9\x28\x42\xd3\xc9\xda\x38\xee\x94\x4f\xa7\x35\x31\xe1\xa0\x28\xaa\x1b\x32\x67\xa3\x18\x90\x43\x23\x71\x4d\x00\x0e\xc7\x69\x1b\x28\x05\x3d\x38\xa5\xf9\x5e\x4e\x76\x12\x0b\x3c\x06\x87\x63\x8a\xf7\x3c\x8c\x91\x23\x53\x40\x9d\x35\x6b\x9d\xfc\xf6\xc2\x9c\xf6\x5d\x1d\xe1\xdd\xfa\xa2\x9b\x00\x6e\x63\xc4\xfa\x60\x81\xb5\xb1\x63\x45\xce\x3b\x40\xe7\x2c\x89\x68\x91\x56\x93\x1c\x4d\xb7\x6e\x08\xd1\x4c\x29\x36\xa9\x39\x2c\xd2\xa7\x60\x40\x6e\xad\xb5\x71\x9f\xf8\xb8\x4f\x70\xd4\xc8\x59\xf8\x71\xdf\xd6\xcc\x6e\xae\x2a\x69\xdf\xed\x9e\x9b\x3f\xb6\x35\x7c\x2c\x99\xed\x64\x47\x3a\x65\xf5\xc0\x77\xb2\x9b\x10\x48\xec\x7e\xe0\xb1\xb2\xc6\x25\x6b\xd9\x6e\xd5\x9f\x1d\xa6\xa9\x71\xe7\x9d\xe7\x82\x82\xd2\x05\x0d\x4c\x5a\x9f\x77\xd9\xa8\x94\xf6\xd4\xca\x21\x8c\x00\xf5\x52\x29\xab\xa5\xd4\x8c\xe3\x06\x85\x13\x48\x2c\x95\xca\x06\xec\x70\x33\xed\x50\x03\x5c\x83\x8c\x52\xa1\xda\x2d\xfe\x41\x3e\x91\x15\x5a\xab\x38\x2b\xf8\x1c\xd1\x5f\x54\xee\x6f\xaf\x07\x07\x17\xe3\xb8\xc8\xde\xcf\x07\x3c\x6c\xfd\x6e\xd7\x75\x7d\xd8\x03\x44\x04\xe6\x25\x27\x45\xe9\x8b\x93\xdc\xe7\x7a\x3f\x0c\xdb\x55\xbb\xdd\x5a\x6f\x7b\xab\x42\xd2\x97\xb6\xe4\xa0\x09\xbc\x93\x1e\x74\xce\xf6\x76\xde\x47\x89\x81\x72\xe3\x62\x1c\x7e\xad\x0c\xb8\xf0\x35\x44\x0e\x51\x18\x85\xd5\x1e\x7e\xfa\x3d\x78\xad\x78\xdd\x5e\x31\xcf\x47\xc1\xd9\x4f\x0f\xf7\x77\xb7\x9f\x1e\x56\x97\xfb\x4d\x43\x9f\x92\xd0\x41\xbe\x75\xa7\xdc\x29\x82\x81\xfb\xca\x81\x5e\x52\x7e\x1e\xfc\x42\xe0\x22\x80\x8b\x80\x71\xdd\x6d\xb7\x40\x6c\xa7\x31\xde\xad\x95\xc6\x55\xab\x23\xa6\xde\x39\x4e\x0e\xa0\x3a\x55\x18\x1b\x12\xe6\x4d\xc5\x15\x05\x23\x39\x11\x42\x8e\x84\x90\x24\x4b\x3c\xdc\x6f\x5e\x7d\xcd\xcf\xaf\xd5\xc6\xab\x0a\xe3\x73\x4e\xfa\x61\xd1\x81\x5b\x90\xe1\xa8\x2d\x4a\xe0\xce\x3d\x48\xaa\x17\x3c\xf4\xb9\x81\x63\x38\xc4\x51\xbf\xba\x0c\x5d\x10\x08\xe0\x70\x02\x79\x38\xcc\xfe\x05\x4d\x15\xdc\xe3\xe0\x5c\xc0\x2d\x38\x98\xc1\x74\x48\xd3\xc6\xd6\x5b\x33\x2c\x3a\xd3\x1c\x9a\x8d\x59\xab\x88\x3e\xfa\xcb\x24\x59\x2e\xd8\x7a\xf3\xf1\xcb\x02\xfc\x89\x88\xb0\xe7\x50\x70\xfd\x42\xd0\x1c\x47\x23\xb3\x93\x03\x87\x0a\x1b\x1c\x06\x40\xa9\x64\xa0\xa8\xc3\xbe\xeb\x76\xb4\xd7\x46\x34\x4d\xa7\x77\x31\x00\xda\x71\x25\xf0\xea\xa4\xb5\xa2\xa4\x16\xad\x74\x0c\x15\xa6\x60\xbc\xd6\x75\xc3\xdc\x69\xe4\x3b\x50\x82\x22\xec\xda\xb0\x17\x98\xf0\x04\xa6\xf5\x93\xda\xb4\x6b\xfd\xdc\xa1\xd8\x3c\xd3\xb4\x25\xe9\x35\xb7\x30\x72\xd5\x1e\x54\x3c\x1c\x77\x7d\x38\x08\xc0\xda\xb4\x0e\x43\x94\x12\x1f\xc2\xb8\xd6\x35\x0d\xdd\xc9\x1c\x01\x0d\xee\x20\x00\x0e\xc4\x4d\xd6\x39\x28\x93\x34\x45\x4f\x64\xd3\xad\x55\xf2\xaf\x92\x3f\xbf\x28\xc9\xfc\xf8\xfe\xf3\xbb\xf7\x70\xf3\xc3\xfb\x0d\x4c\xaf\x93\xfc\x25\x9a\x8b\x03\xeb\x1f\x7f\x78\x77\xb7\xaa\x3d\x76\xca\xfa\xd1\x1c\xf4\xde\x50\xc5\x48\x49\x28\x09\x5b\xa3\x84\x36\x35\x70\x7d\xc7\x0f\x34\x9c\xd6\x2a\xe4\xd5\xb6\x07\x15\x09\x6e\x17\xdc\xd1\x83\x0a\xe8\xc9\x46\x0a\x03\xb6\xda\x09\xa7\xbd\x0c\xcc\xe0\xc9\x1f\x0c\x40\x60\x3b\xef\x27\x97\x88\x6c\xbf\x56\x49\x11\xcf\xe7\xcb\xfb\x4d\x6c\xc2\x6d\x3e\xde\x6c\x3e\x7e\x49\x99\xed\x8b\x91\x33\x6c\x5a\xd6\x96\xc3\x5a\x05\x84\x7c\x3d\x35\x54\x18\xab\x45\x5a\x56\xae\x8e\x75\xc6\x11\xb2\x0d\x59\xab\xa5\x6b\xf6\xc7\x25\x54\x0f\x70\xf4\xd1\xb2\x46\x90\xc6\x94\xfb\xa9\x84\x87\x18\x8d\x37\xab\xa3\x31\x56\x3b\x6d\xf7\xfb\xf9\x2e\x01\x89\x8b\xf3\xd6\x68\xe9\xc7\xc7\x5e\xe3\x6b\x2f\x0e\xae\x3e\xfe\x15\xb8\xd2\xb4\x81\x8d\xab\xea\x0c\x4f\xbe\x48\xcb\x89\x6c\x61\xc1\xa7\xdd\xd1\x4e\x9c\x81\x1a\x50\x31\x55\x69\x51\x06\x4e\x85\x39\x66\x08\x11\xec\xb4\x70\x4f\x09\xef\x0d\xe0\xa1\xf7\x0e\xf7\xc6\x71\x23\xa9\x88\xf5\x8c\x94\x3d\xa9\xf5\x2e\x3d\x25\x9f\x2e\x9a\xf5\xff\x31\x76\xc3\xe7\x78\xe1\x76\xbd\x89\x94\x59\xef\xde\xc7\x07\xd7\x83\x8c\xf3\xed\x9c\x34\x6e\x96\xee\xc4\x22\x6d\x33\xc7\xf1\xab\x67\x40\xff\xe7\x2f\x0f\xf7\x29\xdf\xd5\xe5\x09\xd8\xaa\xd6\x0d\x6f\x64\x5e\xec\x9a\xa2\x21\x8d\x2a\x6b\x22\x88\xc4\x2c\x2f\x58\x59\x94\x58\x5a\x5f\xe2\x26\x76\x9d\x0b\x52\x07\xe2\x9c\x73\x94\x38\x78\x6c\xb0\xe0\xa4\x11\x87\x03\x90\x25\x25\x22\x9c\x06\xa5\x11\x21\x4e\x70\x31\x98\xba\xa2\xa7\x3c\x97\x65\x67\x50\xad\x73\xc8\x54\xd3\x98\xbe\xad\x55\x18\x64\x70\x45\x29\x93\xe4\x37\x0b\x36\x31\x45\x57\x35\x94\x67\x3c\xff\x3f\xfc\x0a\x12\xfc\xd3\x97\xbb\xf7\xdf\x20\xc1\xa3\x4e\xda\x97\xf9\x37\x0f\xaf\xaf\xfe\x0c\xae\x5f\xf1\x70\x77\xfb\x39\x2b\x80\x2c\x6d\x09\x9a\xd0\x15\xa0\x56\x67\x23\x77\x45\x68\x8f\x71\x90\xef\xea\x08\xfb\x22\xb0\x40\x6a\x3b\xff\xf6\xfa\xff\x40\xd3\xf0\xed\x6b\x47\x38\x48\x29\x9a\xa9\x97\x12\x92\x66\x8c\x7f\xb6\xb8\x14\x4d\xa9\x72\xc8\x1a\x11\x7f\xb9\xcb\x81\x8d\xbf\x19\x10\xc9\x93\x0d\xdc\x3e\x35\x1b\xb7\x36\x6f\x10\xef\xff\xf9\xc5\xea\xbd\x61\xb8\x9b\xe3\xed\xcd\x35\x74\xf6\xba\xd3\x12\xeb\x59\xdf\x0c\xd1\xad\x2e\x43\x74\x1f\x33\xe9\x8b\x1a\xa2\x20\x8a\x1c\x1c\xdd\xb9\xb5\xe0\x58\x14\xa1\x1d\x6b\x06\xc5\xe4\x9e\x0f\xb0\xb3\x8a\x69\x13\x8e\x42\x58\xaa\x01\xae\x0a\x58\x4c\xa8\x80\x22\xe7\x4a\xe9\xd2\x28\x54\x16\x21\xc7\xe1\x20\x7a\x57\x86\x1e\x26\xd5\xda\x54\xa8\x9e\x54\x55\x3f\x25\xc6\x80\xa4\xae\xa0\xc1\x27\x1a\x4e\xf4\x29\xa1\x41\x61\x26\x38\x61\x54\x60\x89\x6a\x4c\x15\x0b\x47\x53\xe9\x0a\x89\x56\x71\xda\xb9\x05\xf3\x0f\xbb\x79\x0f\xc5\x7d\xf9\xf7\xb1\x56\xf6\x9f\x92\xff\x35\x61\x4b\xe4\xb7\xac\xdb\x05\xc0\x01\x37\x9f\xff\x03\x98\x6f\xbf\xfc\xfc\x71\xc9\x3e\xee\xff\x98\xe4\xe6\xfd\x55\x5a\x02\x96\x86\xcd\xa5\xbc\x7d\xbb\x29\x3e\x66\x0e\x97\xa6\x68\xfb\xda\x28\xa9\x2a\xcb\x1d\x37\x9c\x70\xdb\x0d\x9c\xe4\x25\x38\xb6\x65\x79\xd8\x81\x9c\xb1\xb2\xa8\xea\x12\x69\xa3\x0c\x48\x8e\x43\xc5\xe2\x84\x24\x0e\xc3\x24\x54\x81\x35\x01\x2d\xaa\x54\x89\x10\xd2\x65\x5a\xf7\x63\x6d\x9b\x4a\xb7\xa7\xb2\x30\x3b\x20\x50\xe8\xfa\xbc\x38\xa0\x80\x8f\x45\x85\x9b\x54\x22\xd2\x4c\xd4\x87\x92\xb1\xdc\xe4\x04\x90\x89\xc2\x6e\xda\xc1\xd6\xc3\x8e\x05\x6b\x03\x77\x53\x53\x85\xc3\x11\x9f\xf6\xed\xae\xde\x75\xc5\xee\x58\x80\x64\x4c\x92\x24\x07\x45\x2a\xd6\xa7\x35\xbf\xe2\x26\x5e\x56\x4a\xf2\x6d\xd5\xe1\xbb\x9f\x0b\xd8\x4e\xcc\x01\x15\xcc\xf3\x01\x3d\xec\x26\xfa\xe6\xa9\x35\x9f\x72\x58\xf2\xb0\x9d\xff\xc2\xea\xea\x87\x24\xcd\xca\x04\xad\x59\x9a\xbc\x89\xe3\x2f\xff\x7a\x56\x42\x3c\x0d\xee\xb9\x7c\x98\x26\x13\x02\xdd\xec\x48\x17\x4d\x52\xbc\x52\xeb\xe6\x05\x0f\x1e\xbb\x2c\xf3\xe6\xfb\x71\x73\x61\x94\xfb\x63\x03\x45\x70\x07\x9a\xba\x0e\x1e\xe6\xac\xe5\x4d\x53\x60\x6c\xfb\x1e\x21\x44\xf7\x51\x0f\xbe\xcb\x4e\x54\x18\x55\x7b\x73\x16\x79\xa1\xcb\x22\x9c\x0e\x75\xe1\xf2\x74\xbf\xdf\x4f\xdd\x61\xb2\xd5\x7e\x8e\xc5\xa3\x3e\xf2\x9a\xc6\x18\x62\x8e\x29\x67\xfb\x78\x73\x8d\x7d\xfd\x73\xb0\xba\x00\x09\x96\x15\x14\x8b\x14\xb7\xd7\x53\xd7\x5f\x1e\x2e\xfa\xad\x37\x77\x0f\xeb\xfb\x8f\x55\x7a\x89\x84\xd2\xed\x60\xfa\x2c\xb7\xb3\x5b\xa0\x38\x2c\x9a\x0a\x8e\xf1\x86\x96\xae\x09\x47\x56\xe4\x02\x55\x32\x2f\xc6\x53\xb9\x3f\xcd\x21\x71\x07\xa8\x6b\x6b\x60\x8e\xdb\x2d\x60\xdb\x6c\x08\x7a\xda\x07\x4e\x81\x07\x27\x78\x88\xc8\xd9\x5e\x15\xb1\x7b\x59\x10\x92\xcb\x06\xf0\xae\xa8\x4a\x24\x4d\x83\x50\x5d\xe9\x62\x98\x4e\x50\x49\xc0\x44\xae\x02\x89\x44\x98\x00\xaa\x27\xb6\x2a\xd6\xec\x32\xb7\xbe\xd0\xf4\x7d\xba\xbd\xbf\x80\x57\xa3\x3b\xbe\x7f\xf8\xf4\xf9\xe1\xe6\x3e\x4d\x5a\xe3\x9c\xf7\x79\xa1\x95\x24\x9c\x75\xea\x84\xba\x2e\x6f\x57\x51\xb2\xd9\x86\xd1\x52\x6a\x7b\x69\x4c\x18\xb6\x1c\x60\xd0\xdb\x22\x07\xd5\xa2\x75\x4a\xd2\xd3\xda\x5c\x7a\x89\xcf\xf3\xc7\xff\xff\x1d\xc5\xcb\xe3\xd5\xab\xe2\x9c\x04\x6a\x59\x6e\xf8\xbc\x07\x24\x98\x54\xda\xa9\x73\xdb\x08\x1b\x17\x26\xd4\x06\xf2\x50\xcf\x3f\xc5\xc2\x7a\x25\x84\x11\x4a\x89\x30\x84\xbd\x6f\xe7\xf8\x5d\x9c\x5b\x4c\x52\x7e\x10\x42\x09\x11\x06\xb1\xe0\x34\x7a\xd8\x65\x78\x4d\x9f\x19\xdb\xde\xc5\xea\xfd\xed\xdd\xc2\x62\xb5\xbe\xff\x8b\x9f\x3f\xde\x2d\xac\x91\x1f\x63\x21\xe5\xe3\xfd\x6d\x9f\x36\x61\x5f\x80\x3a\x9c\x4a\x56\x54\x85\xad\x0d\xee\x51\xd8\x6b\x59\x0f\x9e\xc4\x70\x11\x24\xc5\x71\x4d\x83\x95\x8a\x48\xd3\xec\x3a\xdb\xd5\xb5\xc2\x88\x42\xa6\x83\x8b\xfc\xa3\xab\x44\xc1\x63\xac\x9b\xfd\x36\xb9\x7b\x51\x44\xfa\x74\xfb\x86\x93\xf7\xc3\x65\x18\xe6\x4d\x8d\xf0\xf3\x97\x6b\x49\x46\xb0\x5d\x56\x4d\x1f\xa4\x0d\x06\x10\xc8\xe1\x81\x1b\xb7\x63\xfb\xce\x1f\xd1\x68\x2d\x6b\xf6\x58\x0a\xfc\x75\x54\x5c\x08\x09\x25\xc3\x0a\xf1\xb5\xa6\x56\x46\x47\x63\x4f\x76\x6b\x04\x6e\xa9\xd5\xd4\x60\xe1\xb6\x56\x2a\x13\x76\x64\x50\xdc\x38\x2e\xc8\xa2\xa7\x1c\x35\x60\xd2\x3e\xf9\xcd\x85\x5b\x76\xa9\x32\x64\xab\x9b\xfb\xb7\x74\xb2\x57\x3f\xfc\x90\xb6\xa7\x13\x4b\x0b\x20\xe4\x53\x12\x8e\x16\x22\x5f\x21\x37\xf2\xde\x71\x2f\x8e\x67\xe3\x6b\xd4\x59\xa9\xad\x76\xe2\x04\xb7\x65\x6e\x6b\xaa\x71\x79\x16\x69\x53\x29\x31\x3a\x6b\xc7\xde\xa9\x13\xe0\xb5\x14\xb6\xd3\x9d\xd9\x5b\x09\xf2\x39\xc7\xb3\x4f\x64\xad\xd2\xfc\x7b\x7c\xd7\x75\x43\x63\xad\xdc\x99\x38\x97\xf6\x67\xf2\x72\xe4\x67\x2c\x44\x3a\x1c\x58\xe8\x45\xf0\x72\xfe\x0e\x34\x10\x1b\xb5\x36\xc9\x9f\x24\x9f\x92\xbf\x4d\xfe\xcf\xe4\xff\x5e\xb2\x9b\x97\xf1\xab\x08\xfa\x5b\x2d\xa5\xc9\xcf\x5f\x3e\x7f\x78\x3b\x38\xbe\x79\x33\x62\x7b\xbf\x7a\x5d\xcd\xf7\xeb\xcd\x77\x92\xe9\x1f\xe3\xa3\xd5\x6c\xbc\x52\xa1\xc3\x29\x1c\x8e\x63\x23\x39\xd1\x45\x19\x7c\xa0\x95\x77\xe1\x54\x1e\x9c\xe6\x4e\x73\x05\xb1\x2b\x6b\xb0\xd7\xb5\x92\x9d\x70\x4a\x8f\x7c\xd4\x8c\x52\xd1\x0a\xc2\x68\x79\x7a\xa4\x40\xda\xb8\x15\x5c\x8b\x72\x17\xda\x39\x77\xb2\x31\x67\xea\x4c\xed\x81\x0b\x16\xd4\x20\x2f\xcb\xe0\xd7\x0c\xed\x54\x55\x33\xa4\x1c\x46\x35\xad\x25\x66\x95\xe4\xae\x96\x34\x2f\xa8\xac\x24\x37\x61\xdc\x59\xa5\xa5\x77\x42\x89\xd6\xf4\x4a\x1e\xf0\xd6\xfa\xfd\x1e\x21\xd1\x08\x9c\x8b\x46\x70\x2e\x1a\x41\x44\x73\x28\x23\x2e\x75\x9d\x30\x50\x6f\xfc\xda\x25\xff\x22\xf9\x39\xf9\x37\x71\xae\xe5\x7f\xfc\x86\xab\x74\x81\x82\x5f\xda\xae\x17\xe4\xdc\x02\x86\x98\x23\x44\xf0\x70\x77\xd5\x10\xbf\xf9\x30\x5b\xf3\x4f\x31\xd7\x4e\x74\x59\x00\x0d\x46\x1a\x70\xa8\xc3\x2e\x94\x14\x96\xa1\xce\x24\x39\x3b\xd0\x97\xa5\xa9\x4b\x30\x56\x35\xe8\x26\x0e\x8b\xaf\x0d\xd8\x4f\x2d\x3c\x8c\x23\x1c\x83\xc6\x78\x5b\x85\x16\x1d\xab\x30\x64\x6d\xd0\xe8\xdc\x66\xed\x23\x5b\x3b\x5c\xe4\xbc\x31\xc4\x69\xa9\x79\x30\x4c\xd6\x55\x8d\xb0\x40\x48\x91\x49\x42\x4b\x08\x09\x98\x20\xc4\x86\x5a\x17\xec\x29\x69\x59\x53\x85\x8e\x24\x9b\x44\x02\x1a\x7b\x50\xaf\x91\xd4\x35\x5f\xc2\x8b\x26\xc9\x95\xfe\xc8\x32\xef\xf9\x76\x12\xf2\xcd\x2c\xd5\xc2\x97\xc0\x0f\x87\xc9\xa7\xc5\x2f\x24\xcd\xa3\xc4\xdd\x22\x40\x72\x5a\x24\x02\x1f\x99\x96\x52\x9b\x55\xaf\x89\x25\x2a\x0c\xac\xf2\x15\x0d\x07\x52\xfa\x12\xaf\x4b\xce\x8f\xe6\xc8\xac\x65\x46\x18\x21\xc4\x51\x88\x50\xd0\x56\x48\xa9\xe3\x40\x12\x8d\xd3\x8f\x95\x90\x48\x2d\xb3\xb9\x23\x2c\x36\xf9\x9a\x5f\xfc\xfc\xdd\x65\x56\xe1\x5b\x0a\xc8\x1f\x5e\xb5\x80\xc0\xcd\x75\xb7\x7e\x93\x33\xc6\x6c\xed\x78\x33\x1d\x4a\x65\xdc\x4b\x51\x28\x6c\x43\xe5\xdc\xb3\xc2\xe7\x9a\x9f\xad\x10\x85\xcd\x85\xdc\x76\x14\x24\x73\xa6\x15\xb6\x3e\x10\x07\xcc\xb9\xe7\x69\x1b\xda\xed\xb4\xdd\x27\x69\xe2\xc1\x6e\xe3\xd6\x36\x59\x25\x7f\xfd\xca\x1c\xb8\x7a\xd5\xda\x79\x25\x24\xbe\x3e\xc7\x08\xdd\x78\xb8\x34\xe3\x56\xc2\x6b\x6e\xdc\xa3\x4f\x73\x9f\x16\xe7\xa3\xb1\x2d\x37\xd2\xee\x46\x1e\x4c\xb0\x54\x71\x56\x49\x51\x87\x3e\x28\x0c\x06\x40\xcf\xa7\x5d\xef\x84\xef\xd6\x16\x13\xc5\x70\x7b\x38\x38\x26\xb9\x54\xcc\x70\x45\xbc\x07\x28\x8c\x92\x95\xbe\x22\xde\x69\x6b\xdd\xb1\xc2\x4c\x8b\xa8\x01\x47\x21\xdd\xb4\x6b\x95\xfc\xcb\x0b\x63\xf8\x9c\x1f\x27\x71\x6c\x6b\xa9\xb2\x6e\xee\x66\x13\xf0\x42\xca\x7c\xf0\x35\x68\x81\xe7\x61\xeb\xcf\xfb\xed\x9e\x41\x9d\x43\xd9\x39\xe5\x42\x9b\xed\x1e\x6b\x3b\x9b\xa0\xb5\x42\x75\x38\x29\x2f\x84\x20\x8a\xb9\x93\xe6\x92\xf3\xa7\x24\x50\xe3\x97\x3a\x6f\x02\xdb\x8d\x5c\xab\xe4\x37\x91\x85\xaa\x7c\xc9\x04\x67\x2f\x0c\x2e\xd2\xf8\x17\xb0\xfe\xd6\xd7\x35\xa4\x93\x92\x52\xef\x43\xe9\x7d\xd0\xde\x67\x9d\x35\x5a\xfb\xb5\x6a\x8c\x70\xe1\xe0\x05\x10\xa0\x3d\xa3\x54\x9f\x0f\x00\x49\xa7\x9d\x4d\x60\x22\xc1\x61\xe3\xd6\x2e\x59\x45\xd6\xde\x7f\x84\xbb\xf1\x59\x8b\xe5\x0d\x79\x63\xb6\x25\x95\xad\x08\x3c\x15\xe7\x3d\x22\xfb\x5e\x74\x63\xbd\xc3\xcf\xe4\x8d\x3b\x19\x50\xd0\x04\xa2\x23\xab\xa7\xa2\x84\x43\x55\x4c\xa7\x12\x9c\xaa\xdc\x17\x65\x5a\x16\x53\x52\x54\x6b\x47\x18\xe2\x24\x68\xc7\x08\x26\x4c\x32\x52\xb3\xa1\x6e\xad\xe6\x86\x38\x4e\x05\xa6\x8e\x60\x82\x2c\x92\x4a\x09\x6c\xf1\xc2\xe3\x04\x12\x03\x8b\x8d\x5c\xeb\x05\xdf\xf7\xf0\x8d\x26\xdf\x7a\xf3\xd3\x87\x2b\xbb\x0d\x87\x69\x4c\xab\x79\x8f\x2f\xca\xc8\xf5\xb9\x70\x5b\x70\x04\xce\xf2\xe3\x28\x09\x9d\xb6\x13\xab\xf7\xe9\xd1\xf6\xb6\xef\x6d\x6f\x5b\x53\x21\x2e\xcc\xa0\x29\x26\xb5\x5e\x34\x0b\x05\x14\x97\xf5\xba\x4c\xb7\x5d\xe9\xbd\x5d\xf8\xb0\x2e\xcc\xcb\xb3\xd9\x83\xb5\xe3\x8e\xf9\x2c\xef\xb9\x04\xdd\x2f\x6d\x7a\x54\x93\x90\xc3\x1c\x9f\xb1\x54\x01\x04\x10\x0f\xdb\xb0\x5d\x5b\x1d\xf7\x6a\xd3\x1b\xe7\xba\xa0\x74\x6f\x9d\x18\xf9\xe0\x77\x22\xc6\x23\x47\x70\xda\xd0\x75\x75\x99\xe7\xff\x75\x5e\xbb\x57\x44\xd9\xc3\xdd\x06\x24\x91\xc4\xbd\x28\x94\x91\xaa\x32\x1c\x37\xc5\xe4\xfc\x44\x05\x24\x13\x4f\x31\x2c\x27\x12\x9a\x6a\x5d\x05\xea\xc2\xce\x17\xa6\x68\x74\x68\x01\x03\xbe\x6d\xdb\x80\x9d\x4b\x40\xc2\xa1\xd9\xc8\x75\x7d\xe9\x41\xcd\xb9\xdf\xed\x33\x6e\x2a\x32\xd6\x0d\x13\x5b\xed\x27\x43\xc1\x01\x30\x11\x7c\x30\x3e\x0c\x41\x4b\xd8\xac\xac\x73\xbc\x1e\x7b\xbb\x75\xa1\x86\xe5\x53\xf2\xff\x31\xf6\x3e\x41\x92\xe3\xf8\x7a\x18\xc1\xcc\xec\xe4\x4a\xcf\x5a\xd6\xf4\xf4\x34\xdf\x4a\xcf\x62\x6d\x4d\x4f\xe3\xad\xfe\x3c\xe8\xf5\xab\x6e\x84\x25\xad\xa0\x90\x5e\x18\x92\x42\x36\x14\xb6\x14\x08\xfb\x60\x44\xd8\x11\x46\x84\xc3\x0e\x1c\x7c\xc0\x11\x47\x1c\x71\x33\x8e\x8c\xf0\x85\x47\x1e\x79\xcc\x23\x8f\x79\xe4\x91\x47\x1e\x79\x4c\x6f\x27\x51\x0e\x82\x99\x59\x55\x3d\xb3\x4f\xaa\x1d\x66\xb1\x58\x53\xb3\x99\x24\xf0\xfb\xfb\xfd\xbe\xcf\x99\x21\x01\x89\x4b\x75\xfc\xef\x15\xcf\x13\x36\x3f\x63\x55\x06\xc5\x6e\x98\xd5\x26\x3b\x9f\xb8\x8e\x3c\xc5\x34\x5a\x42\xf6\x06\xfa\xde\x0f\x8a\xe7\x3e\xe7\xad\x5f\x79\xe5\xf9\x93\xdc\xe6\x6f\x74\xf2\x8f\x6e\xdd\xd5\xe7\x58\xe9\xfb\x58\x42\x8b\xcd\x98\x48\x74\x79\x45\x5b\xad\x61\x77\x1e\x2b\x69\xf7\xe0\xee\xcb\xfb\x25\x91\xbf\xc5\x08\x1f\x1e\xef\x41\xbf\x26\x2e\x0d\x17\x28\x1c\x8f\xf9\x50\x52\x0b\x4d\xc6\x7a\xcf\x4c\xee\x1a\x6a\x19\x40\xe0\x00\xf3\x99\xe7\xc2\x44\x05\xad\xcb\xf1\x46\x73\x2d\x35\x72\x54\x39\xa8\x21\x2a\x72\xc8\xa0\xa1\x98\x90\x42\x17\xf5\x0c\x83\x3e\xa1\x11\xf8\x0d\x9c\xf9\xdc\x65\xda\xea\x3c\xad\x7b\xb9\xe4\x41\x2d\xa6\x6b\x2d\x90\x3d\xb1\x1d\x7b\x63\x22\x6e\xff\x9f\xdc\x3a\x60\x3f\xef\x78\x7d\xb9\x74\xbc\xa2\x27\x7d\xd5\x21\x6b\xab\xbc\x3c\x85\x89\xa2\x2e\x54\x39\x40\x4c\x11\x56\x70\x52\x16\x59\x4b\x8f\x62\x2a\x1c\x28\x20\x92\x61\xaa\x20\x01\x38\x74\xcb\x71\x69\x82\x71\x69\x29\x0e\xac\x2e\x5c\xc1\xa6\x70\x70\xb6\x01\x95\x25\x98\xa6\x86\x86\xd6\x04\x63\x16\xbf\x51\x3d\xd1\x3d\xdf\xa0\x0b\xc2\xe5\x86\xf1\x7a\xae\x8e\xbf\x4c\x8a\x7f\xf1\xea\xa1\x2a\xf1\x92\xc3\xe5\xee\x40\x14\x98\x42\xbe\x1c\x5b\x74\xbd\xea\xbb\xe7\xab\x1b\x54\x52\x7c\x6e\x85\xd8\x50\x16\x4c\x1d\x50\x95\xf2\x6f\xaf\x44\xde\x1f\xba\xf7\x9b\xf2\x82\xa7\xfe\xb3\x38\xe3\xb6\xee\xbe\x4b\xed\x70\x65\x71\x8d\x9d\xe6\x17\x1c\x45\x6f\x6a\xd2\x85\x01\x83\xfc\xab\x18\x06\xd2\x1f\xab\x0d\x8e\xd4\x68\xd5\xb9\xdb\x2a\x00\x41\x89\xc3\x18\x86\x8b\x8a\x3d\x02\x64\x53\x1a\x81\x1c\x24\x90\x59\x0e\x03\x4a\xd9\xdc\xb8\x61\x00\x07\x28\xac\x40\x46\x33\x6c\xf1\xda\x1f\xe5\x4f\x78\x5f\x6f\xaa\xe4\xdd\x8a\x29\xbf\xce\x3c\xfd\xb0\xdb\xff\x78\x55\xf6\x01\x2f\xf8\x48\x5d\xea\x18\x75\x08\x6f\x7c\xc8\x7a\xc0\x78\x58\x0c\x7f\x7b\x0a\x54\x00\x7e\x0c\x39\x20\x60\x8c\xcc\xdc\x55\x28\xd2\x4e\x68\x24\xa8\xaf\x78\xe5\x40\x16\x26\x6f\x75\x1d\x0e\xe3\xe8\x97\xe5\x17\xed\x92\x79\x52\x7b\xb3\x15\x2f\x75\x3d\xde\xdd\xef\x2e\xae\xe8\xed\x37\x9a\xc6\x69\xbb\x24\xea\xa1\x5b\xdc\x90\xdf\xd4\x67\x2e\x05\x05\x9e\xa3\x06\xf2\x34\xfb\xff\x12\x30\x61\xba\x15\xce\xcc\x27\x37\x06\x61\xbd\xa9\xb0\x34\xce\x69\x99\xa4\x49\xf7\x84\xf7\x74\xcb\x92\xef\x2e\x71\xc3\xa7\xfb\x77\x31\x70\xbb\xff\x3b\x60\xff\xf1\xf7\xe0\x71\xb3\xc4\xca\x2b\x71\x5f\xd4\x6d\x5d\xe9\x7e\x3f\xec\x34\x02\x32\x18\xce\x83\xc8\xab\x41\xf5\xae\x03\x1a\x90\xa3\xfa\x5a\xef\xa0\xea\x40\xd2\x8b\x70\x0a\x87\xa0\xe7\x7e\xf1\x99\x70\x0a\xa7\x2d\x0b\x3d\x71\x8c\x1e\x9b\x9a\x18\x5c\x1d\xcf\x03\x65\x42\x3a\xdd\x48\xc6\xac\x14\x1e\xba\x82\xe3\xe5\xc6\xff\x3a\x2d\x9f\xe8\xbe\xd9\xc9\xe4\x57\xc9\x87\x84\x24\xff\x3a\xa1\xb1\x23\xfa\x9f\x2e\x3c\x68\xff\x57\xf2\x7f\x27\xff\x4f\xf2\xff\xbe\xea\xda\xbe\xaa\xfe\x2c\x37\xe6\x2f\xff\x05\x78\xbf\x12\xa3\x7d\xf8\xa3\xbf\xfb\xf8\xe1\x62\xb8\x96\x64\xf0\xcb\xa7\xc7\x87\x8f\x2f\x60\x8d\x2f\x21\x8e\x2f\xa1\x32\xbb\xbf\x79\xfe\x33\x82\x6c\xde\x3f\x5f\xdd\x8e\x65\xbe\xac\xee\xbc\x6c\x30\xe4\x79\x7d\x28\x05\xa3\xac\x90\x54\x61\x02\x4b\xa2\xb4\xe2\x2c\xcf\x37\xd3\x1f\xfb\x25\x87\x73\x71\xad\x17\x66\xc0\x04\x23\xeb\xba\xc7\xb9\xcc\x21\x82\x85\x28\xe0\xd6\xa1\xe7\x1f\xbe\x4e\x22\x47\x1c\x6e\x9a\xf8\x0d\x08\xc1\x4b\x54\x90\x12\x05\x92\xe5\x63\x45\xab\x51\x79\xec\x55\x68\x6c\x0a\x91\xca\x72\xa7\x60\x6d\xa8\x6e\x64\x83\xc6\x9d\x24\x8c\x73\xbc\xc4\x4a\x1a\x12\x94\x0b\xaa\xca\x5c\xca\xa6\xf4\x34\x57\xe5\x89\x67\x05\x2a\xe1\x37\xbf\xaa\x48\xae\xca\x49\x64\x05\x13\x0c\x73\x3c\x71\x52\x70\x56\x0a\x56\x70\x81\x24\x87\x2f\xce\xcb\x5c\x0b\xc8\x65\x7c\x6d\x42\x46\x68\x2e\x33\x04\x4c\x9e\x13\xae\x14\x13\x44\x12\x31\x0f\xa9\x61\x65\x51\x9c\x4a\x4a\xb8\x14\x4c\x11\xc9\x92\xe4\xcd\x76\x88\x9a\x8d\xe3\x0d\x89\xb7\x32\x87\x5e\xfa\x78\x8b\xbd\xfc\xf2\xaa\x8a\xf5\xf6\x15\x8d\x5d\xea\x9f\x92\xbc\x04\xc9\xdc\xd5\x65\x1e\x4e\x0d\x40\xe1\x78\x3d\x0a\x2e\x2c\xb3\x80\x68\xcd\xb4\xd9\x8e\x9a\x92\xb3\xd9\x18\x42\x83\x74\x41\x47\x08\xc1\x28\x25\x36\x88\x41\x6e\xc4\x92\x14\xfd\x0a\x8c\x4f\x64\x5f\xed\xd8\x0d\x13\xfb\x3f\x27\xff\x4b\xf2\xbf\x26\xff\x7b\xf2\x7f\x5e\xec\xfb\x05\xd2\xf0\xf0\xaa\x81\xb7\xf6\x1e\xc1\xe3\xc3\xbb\xb7\x8f\x0f\xef\xee\x96\xd4\x68\xed\x81\xae\x7d\xbe\x87\x5b\x3f\x2d\xf6\x02\xd6\x74\x29\xf2\xcb\x5c\xca\x5c\x8f\x0f\xbb\xc7\x87\x77\xb7\x7a\xd2\x1a\x21\x57\x06\xe2\xa6\x84\x9a\x20\x73\x68\x9a\xa6\x39\x86\xdc\x94\x05\x6f\x40\x52\x2d\x5f\x67\xa3\xcc\x61\x09\x76\xe3\xb8\x4a\x1e\xa6\x0c\xd0\x50\xf1\x30\xf1\x81\x3c\x25\x00\x9d\x4e\xa7\x93\x57\xa0\x39\x08\xad\x41\x66\x98\x33\x42\xdb\x1d\x83\x52\x12\xcc\xb8\xb2\xbd\x3d\xda\xd1\xca\x2d\x84\x85\xed\x82\xe9\xfb\x50\x1f\x8f\xc1\x8d\x9b\x83\x5e\xbe\x3a\x12\x1a\xaa\x61\x9e\xeb\x83\x31\x42\x68\xaa\x29\x60\xa4\xe3\x9c\x07\x2d\x84\x98\x0d\x15\x4a\x45\x3f\xf8\x27\x69\xf1\x44\xf6\x6e\x47\x93\x5f\x25\x6f\x6f\xfd\xc5\x7f\x93\xfc\xfb\xe4\x3f\xc4\x3b\xf7\x7f\xac\x77\x2e\x7e\xa8\x67\x09\xb0\x78\xf6\x37\xdd\xcd\xf7\x0f\xef\x3e\xdd\x5d\xef\xe6\xed\xaf\xae\x81\x3a\xb8\xbb\xff\x46\x42\xf8\xfd\xa5\xed\x9c\x3a\x8d\x30\x86\x0a\x51\x0a\xa0\xc6\x94\x40\x85\x18\x4f\x89\x29\x90\x2d\x4a\x85\xa1\x6b\x97\xdb\x77\x0c\x85\x2d\x4a\xd6\x9c\xfc\xf2\x15\x7a\x4d\xd8\xf2\x47\x4c\x44\x68\xc0\xc1\xc4\xda\xee\x69\x9e\xa8\xee\x69\xae\x0b\x15\x86\x5e\x1a\x6b\xec\x8e\x42\x41\x19\x25\x4a\x48\x05\x05\xa5\x8c\x68\x21\x14\x94\x82\x2c\x11\xf0\xf5\xae\x6e\x3a\x08\xcd\x49\x5c\xef\xe9\xb6\x44\x8c\x12\x8a\xa5\xe0\x11\xec\x27\xc3\x18\xac\x28\x4b\x48\x4a\x43\x09\x4f\x13\xb5\xbc\xa5\x78\x2f\xb3\x27\xb2\x37\xdb\xd3\xcf\x6a\xbb\x2f\x58\x0d\x5f\x33\xf9\x7d\xfb\xf3\x6e\x71\x19\x17\x9c\xf4\xeb\x8e\xd6\xdd\x62\xda\x1e\xef\xdf\x5d\x8f\xd4\xa7\xc5\x3c\x9a\x2b\xf8\x26\x1e\xa7\x9f\x5d\x9a\x9d\xcd\x72\x80\x4b\xb3\xe4\xec\x81\xc4\x11\x80\x26\xb0\x34\xff\x3a\x38\xa6\xbb\x34\x7b\x2e\x1c\x6f\x4f\xb3\x03\x2d\x9d\xe8\x48\xc0\xe1\x76\xda\xc2\xb2\x40\x08\x21\x43\x24\x95\xcb\x32\x6a\x98\x68\x18\x21\x0d\xa5\x0d\xa5\x49\xf2\xb7\x52\xf2\x44\xf7\xed\x8e\x27\xbb\x8b\x0a\xc9\x7f\x73\xab\xf9\xcb\x1b\x26\xfd\xe7\x9c\xff\x0f\xab\x60\xf7\xb5\x44\x73\x91\xf7\x78\x69\xdf\xd7\x4a\xc5\x45\xba\xf3\x65\x1a\x1f\x0d\xc8\x97\x4f\xaf\x80\xfd\x8f\xfb\x82\x86\x2e\x60\x08\x54\xd0\xde\x70\x0e\x71\x41\x51\x51\x38\x7f\x34\x5b\xe9\x20\x56\xa1\x05\xee\x2c\x80\x09\xc7\x34\xa1\x0d\xca\x55\x0e\x1b\x9c\xab\x1c\xa5\xa7\xf3\x74\x41\xe7\x7b\x40\x38\x65\x94\x83\x9e\x13\x8d\xf9\xcc\x14\x93\x42\x1d\x2c\xa3\x06\x65\x3a\xe7\x5d\xc7\x77\x5c\x93\xdc\xe6\x3a\xe8\xa6\x72\x36\xb7\x39\xa5\x95\x07\xd5\x1f\xda\xdd\x41\x20\x4a\x04\x15\xcb\x3f\x04\xe1\x12\xe3\x1c\xe3\x02\xa3\x40\x03\x95\x94\xb3\x60\x11\x11\x14\x51\xe3\xa8\x33\x84\xd6\x52\x49\x73\x28\x8a\x92\x97\x8e\xac\x31\xe9\xdf\x49\xcb\x27\xb6\x37\xbb\xf2\x67\xeb\xe7\xca\x20\xc3\x22\xc7\xdc\x8b\xaa\xfd\xbb\x6f\xfa\x04\xd7\x35\x74\x75\x86\x2f\x2b\x1f\xbb\x57\x9c\x26\x3f\xdd\x24\xd9\xee\x77\x91\x0e\x2b\x8d\x55\x53\x1d\x71\xdd\x97\x23\xcd\x7e\x76\x69\xf6\x92\x1b\x6e\xd2\x4e\x32\xc5\x15\xa0\x82\x73\x26\xe6\x4e\x32\x4e\x45\xa0\xc0\x17\x79\x95\xe7\x9b\x32\x8c\x54\x02\xc3\x9b\x30\x8d\x01\x51\x40\x87\xba\xb3\xe1\x90\x8e\x8a\x06\x0a\xe1\xae\x9c\x2d\x68\xf9\x53\xc2\x4e\x0c\x1c\x9e\xcf\x0f\x94\x61\x89\x30\xe5\x58\x22\x82\xb0\x24\x50\x40\x2c\x30\x6a\x20\x2c\x8a\x52\x1b\xae\x0c\x65\x0a\xda\x8c\x20\xe4\x6b\x22\x11\x4c\xfe\x36\xa8\x9f\xe8\xbe\xda\x89\x98\x1d\x5e\xf9\xd7\xfe\x4d\xf2\xdf\x27\xff\x31\xe2\x20\x6f\x0c\x15\x9f\x2e\xd4\xf0\x2b\xd2\xf1\xed\xa7\xc7\x87\xc5\xde\x80\xeb\xf7\x1f\xde\x7f\x5a\xe7\x46\x5e\xb0\x8b\x3d\xdc\x5d\xed\xfc\x2d\x86\xb9\x85\x1a\xb7\x06\xd4\x5f\x7d\x4c\x4f\x36\x2f\x40\x89\x50\x3d\x57\x79\xc6\xdb\x1e\x97\x07\x48\x90\x52\x93\x0a\xd5\xf2\x0a\x28\xc3\x9c\x23\x87\xa9\x0b\xd3\x34\x2d\xe9\x8b\x0b\x13\xc8\x87\x21\x4c\x0e\x12\xc9\xa1\x46\x2c\x24\x06\x53\xc3\xc1\x48\x0b\x5d\x10\x82\x34\xdc\x09\x08\xa1\xe2\x64\x86\xa9\xcd\x72\xdd\x1c\x28\x25\x2c\x1c\x9b\xa6\x09\xa8\xae\xeb\xf4\x64\xbc\x77\xc8\x49\x7b\xb0\xbd\x0d\x02\x54\xb6\xb7\x07\xab\xe4\xd7\x49\x7b\xe8\x75\x09\x8f\x8e\x56\xd6\xf9\xb2\xb2\xb9\xaf\xf2\x26\xe2\xba\x37\xdb\x21\xea\xef\xb4\xb1\x0f\xf0\x67\xcf\x7c\xc3\x9f\x62\xb7\xf9\xfe\xd7\xe0\xd3\xca\x62\xb5\x56\x7a\xf6\xcc\x85\xde\xb5\xe5\x98\xda\x70\x2a\xa5\xd1\xb5\xf2\xba\x59\xf5\x5d\xdd\x5c\xa4\x6a\xae\xd2\xbe\xb2\xb6\x1a\xc3\x12\xb6\x48\x09\xd0\x81\x6b\x65\x45\x12\x7b\x5d\xc7\xf8\x6c\x70\xf2\xfe\xa2\x5b\xbe\xc4\x8a\xff\x36\x62\xe7\xfe\x88\x46\xef\xc7\xf7\xfb\x9f\xc3\xe5\xe3\x23\xd8\xaf\xee\xe3\x95\xb1\x5c\x1f\x42\x7c\x20\x5b\x0c\xa8\x03\x3c\xd4\x71\xa1\xba\xb3\x06\x32\xe2\x42\x5a\x49\x1a\xef\x23\x56\xde\x51\xc1\x6b\xde\x34\x06\x8d\x80\xa7\xd3\x9c\xbb\x55\x6b\xf8\x72\xc8\xaa\xc6\x95\x3f\x09\xd3\xf0\x6a\x3b\x70\xae\xa8\xa4\x6a\x79\xe9\x34\x3a\x5a\xee\x8c\xd6\x62\x2e\x53\x57\x59\x39\x82\x32\xb7\x75\x61\xca\x79\x98\x15\x38\xd2\x13\x3b\xd1\x0e\x11\xc3\x90\xe2\x9c\x68\x18\x63\x91\x2a\xc6\xc8\x3c\xf9\x2e\xf9\x21\xf6\x35\x56\x1f\xf0\xef\x92\xff\x70\xe3\x67\xb8\xad\xcb\xfb\xcf\x5f\x5e\x31\x28\xdd\x20\x46\x77\xdf\x0e\x0e\x2c\xfe\xf4\xb6\x76\x5f\xec\xf0\x5d\x2d\xa5\x68\x85\x43\x00\x41\xdc\xcc\x1e\x94\xa4\x3c\x45\x20\xcf\xe5\x38\xd7\x93\x9d\xa6\x69\xaa\x17\xff\x6f\x55\x23\x27\xd5\x0e\x93\x13\x62\x54\xc0\x72\xe5\x59\x0d\xa4\x55\x42\x9a\xad\x34\x54\xda\xae\xe4\x4a\xd2\x73\xbb\xa1\x8c\x07\x25\x42\xa3\x43\xa5\x37\xc4\x39\x6b\x02\x2e\x8c\xb6\x5a\x84\x12\xf4\x5d\xbd\xa4\x12\xa0\x33\x01\xf5\x7d\x3f\x23\x61\x88\x21\x9c\x4a\x29\x69\xbc\x07\x11\x03\xb8\xc3\x2f\x7a\xff\x3f\x9b\x9e\xb8\xbb\x1d\x8f\x31\xcc\x8f\x53\x13\xd7\xef\xef\x9f\x45\x57\xbe\xf1\x86\x6f\x9e\xdd\xe1\x9f\x45\x75\x87\x6a\x6b\x43\x96\x0a\x17\xd0\xf2\x4f\x2a\x42\x22\x81\x0c\x3e\x95\xcb\xa7\x9f\xa3\x4c\x4e\xaa\x96\x05\x32\xd7\xba\x04\x34\x2f\x6c\x59\xa4\xd9\x7c\xba\xf1\x4e\x15\x5f\x8f\x0e\x22\xb1\xf8\x44\x1d\x91\x6f\x36\xe8\x1d\xd6\x2c\x58\x90\xc5\x4e\xf1\x04\x0c\x3b\x49\x29\xb1\x94\x32\x2f\x59\xac\x61\x2b\x26\xb9\xe4\x9a\x80\x01\x42\x59\x4b\xc6\x0e\x9c\x1f\x78\xac\x23\x76\x97\xb8\xf8\x57\xc9\x8f\x09\x89\x6b\xfe\xdd\xfd\xa5\x67\xb9\x7b\xbf\xff\xf9\x68\xe9\x65\x8d\xbf\xfc\x79\x15\xdc\xbd\xfd\xbb\x20\xee\x94\xd8\x1f\x8c\xb2\xbb\x7b\xfd\xb5\x3a\x9a\x43\xaa\x71\x55\x2b\x8a\x19\xc2\x86\x4a\x66\x79\xdb\xd7\x70\x4a\x95\x51\x98\x49\xe1\x0e\x8c\x43\x90\x0c\xb8\xeb\x3d\x13\x84\x87\x06\x0c\x5f\xe9\xd1\x8d\x0e\x98\xed\x68\x02\x0d\x24\x08\x01\x18\x68\x52\xdc\x44\xa9\x2a\xa4\x08\x9a\x0e\x9c\x0a\xa1\xb4\x28\x55\x19\xc4\x69\xb0\x50\x2e\x71\x78\x96\xeb\x82\x28\x24\xb5\x22\x8a\x86\xda\x1b\x13\x83\x75\x1f\x69\xd5\x92\x7d\x7c\xde\xf5\x0e\xc5\xc9\xb4\x3f\x4f\xfe\x71\xdc\xf3\x2c\xd6\x89\x2e\xef\xfa\xee\x7e\xe5\x38\x03\x17\x91\x8e\x97\x8d\x9c\xdf\x83\xc7\x9f\xbe\x7c\xfe\xf2\xf0\xc3\x65\xda\x28\xb2\x85\xbe\xbb\x7f\x1f\xeb\x1a\xd7\xf8\x72\x45\xd6\x6d\xcc\xb2\xd0\x4c\x48\x2a\x25\x3c\xb7\x1b\x09\xe5\x72\x01\x20\x5a\x60\x2a\x05\x23\x4c\x2b\x65\xa8\x2e\x72\x0b\xcf\x4e\x95\xd8\x32\x62\x41\xb9\x84\x3e\xee\x90\x66\x87\xba\xee\xe6\xe1\x58\xd7\xdb\xfe\x14\x3b\x77\x49\xf0\xa0\x26\x87\x46\x54\x81\x52\x36\x01\x09\x4f\x36\xb0\xa3\xb7\x5a\x3a\xa7\x84\xe8\xf3\x43\x59\x4f\x23\x40\x44\x88\xb3\x4b\xbd\x90\x95\xd5\x83\x31\x42\x1b\x63\x62\x9d\xf2\x4d\x5a\x2e\xb1\xdf\x4e\x25\xbf\x4e\xca\xcb\x04\xc2\xbf\xbd\xcc\x5c\xad\x0f\xfa\x61\x9d\xac\x7a\x46\xd9\xc7\xcb\xbb\x38\x76\xfb\x82\x69\xf0\xfd\xa5\x7f\xf1\xe1\xfe\x9b\x19\xac\x4d\xee\x20\x10\x47\x54\x1a\x44\x30\x11\xaa\xd9\x30\x41\x98\xae\xa8\xcb\x0b\xa0\x5b\x58\x1a\x14\x58\x10\x46\x21\xcd\xb1\xc9\x8b\x43\x4d\x2f\x03\x41\x69\x15\x7b\x7f\x94\x52\x5d\x1a\x0c\x77\x0a\x71\x43\x28\x56\x4c\x31\xde\x30\xc1\x84\x6f\x21\x82\x06\x53\x2c\xf5\x6c\xc2\x08\x91\xc4\xbe\xc5\x18\x73\x4c\xb7\x89\xd5\x7a\x32\x66\x3a\xa3\x2d\x9f\x73\xce\x0b\x1f\x1b\x50\xbf\x4a\xb3\x27\xb6\xaf\x76\xd9\x2b\xbf\xfb\xaf\xa2\xe7\x5d\x73\xad\x77\xdf\xdf\x7c\xee\xbb\x4f\x8b\xd3\xdd\x7c\xeb\x73\xff\xa8\xbb\x7d\x78\xbc\xbf\xce\x16\xc4\xfa\xd1\x26\xd3\x79\xde\xe3\x76\x6e\x8b\x02\x37\x07\x58\xf8\x25\xbf\x1d\x64\x68\x97\xd7\xd4\x38\x84\xeb\x70\x1a\xc7\x9b\x67\x9d\xa6\x13\x60\x34\x9c\x28\x36\x88\xaa\x22\x8c\xa1\xc2\x40\xed\x32\x58\x42\x59\x98\x59\xa4\x2c\x2f\x74\xd3\x50\x8a\x43\x65\xad\x0d\xd2\x7b\x9f\x8e\xc8\x29\xdb\xd9\x63\x6c\xf1\xdb\xa3\xed\xac\xb7\x42\x91\xc5\xa1\x1a\x4e\x3c\x4e\x76\x69\xf2\x44\xf7\x7e\xa7\x92\xcf\x17\x3b\xf6\x9f\x9e\x75\x1a\x2e\x2c\x4b\x6b\x8e\x18\x8b\x50\x6b\x10\xfb\xee\x86\x6c\xbb\xea\xee\x46\x04\x19\xb8\x64\x4f\x71\x5d\xdc\xaf\x46\x6c\x7f\x69\x00\xbc\xdf\xff\xf4\x21\x95\x80\x94\xa5\xc5\x25\xc8\x50\x69\x11\x20\xf3\x21\x4b\x93\x79\xca\x96\xa7\xd9\xf8\x91\x49\x3e\x27\xb5\x83\x63\x47\x3d\x07\xd8\x07\x0d\xc6\x3c\x0b\x0a\xd4\x59\x48\x80\x69\xf3\xc2\x94\xf9\x24\x58\x8f\x8f\x2b\x1a\xe8\x50\x59\x8c\x34\xc4\x2d\x1b\x43\xbd\x9d\x10\x84\x98\x12\x82\x98\x86\x85\x2e\x4b\x2d\x89\x2b\x71\x30\x07\x84\x35\xc7\x2c\x65\xc8\x70\xbd\x5c\x2f\xcb\xf9\x14\x2d\x1d\xe1\xec\x44\x2a\x4a\x3b\x88\x28\x23\x84\x30\x6d\x44\xe4\xdd\x3f\x3e\x91\x7d\xb3\x43\xc9\xf7\xc9\x5f\x27\xff\xdb\x6d\xb6\x69\xff\xee\xfb\x17\xd1\x79\x14\x20\x7d\x1f\xd7\xc4\x15\xe5\x7b\xf7\xc3\x3f\x05\xfb\x87\xdf\xae\x45\x98\xb7\x9f\xbe\xdf\xff\xf0\x3e\x0a\x62\x5f\xc4\x48\xd7\x1d\xb2\xac\x8d\x97\x0c\xf9\xcb\xda\x88\xd8\x3b\xe1\xda\x0a\x37\x83\xb2\x28\xb3\x99\x18\x2a\x91\xca\xd4\x4a\xcb\xe1\xc4\x4c\x59\x46\x12\x08\x44\x06\x52\x35\x8d\x80\x4c\xd7\x99\x29\x18\x09\x47\xa0\x26\x85\x31\x67\x01\xce\xbd\xc9\x72\x20\x8f\xc3\x94\x49\x2e\x28\x55\x07\x7e\xc2\xe3\x89\x42\x2c\xed\x0e\x79\xcc\x35\x27\x05\x46\x12\x56\x0c\x33\xc0\xb4\x95\x14\x1a\x58\x43\xca\x9f\x12\x1b\x8e\x99\x17\xae\x52\x6c\x04\x5d\xeb\x2c\x4e\x8d\xed\x68\x09\x09\x0b\xae\xc0\xd8\x78\x5b\x32\xae\x18\x69\x94\x76\x07\xeb\x29\x16\x66\xf1\x85\xd3\x13\xdd\x1f\x76\xfa\x05\x2e\xec\x5f\xde\x66\x96\x57\x6c\xd8\x76\x77\x9b\xcd\xf9\x31\xb2\xba\xee\x5f\x04\x3b\x6f\x63\xab\xeb\x65\x71\xeb\x32\x5a\x17\xc7\xeb\xae\xf8\xde\x65\x5f\x6d\x93\xaa\x28\x52\x17\x08\xa0\x00\x73\xef\x67\x68\x2b\x0a\x4c\x17\x38\xc0\xf0\xb8\x61\xe7\xe6\x7a\x4c\xc0\x6b\x85\x51\x3a\x70\x8e\x68\x21\x20\x1c\x4c\x6f\x06\xe7\x86\x01\x88\xde\x0c\x3b\x5d\xc2\x62\xf6\x9a\x58\x88\x71\x09\xa1\xa5\x3a\x95\x68\x24\x03\x1d\x48\xf0\x08\xc3\xe2\x18\x1c\x63\xb9\xc9\x69\xd3\x34\x4d\x97\xe6\x47\xbe\x7c\xc5\xfe\x34\xe8\x63\x2d\x26\x4f\x7e\xb8\xf4\x0b\x56\x76\xd1\x6b\xb4\x79\x9b\x37\x8a\x41\xd0\x1f\x8d\x78\xbe\xbc\x8a\x78\x76\x91\xc9\xf8\xf7\xe9\x25\x36\xe5\x36\x1c\xec\x91\xa2\x23\x22\xca\x63\x03\x01\x21\xe4\xeb\xd0\xbb\xae\xeb\x7b\x2b\x05\xa5\x4e\x38\xdd\xcb\x76\xe8\xb5\x10\x13\x07\x9d\x0d\x84\xd7\x0d\xee\x95\x54\x42\x6f\xf4\x2c\xd3\x72\x1e\x53\x47\x19\xc5\xdc\x79\xc4\x95\x20\x20\xb3\x8b\x41\xc0\x50\x49\x23\x68\x50\xa0\xf1\x56\x55\xdd\xf2\xb7\xb0\xef\x7b\x11\xa6\xc0\xbd\xc6\x55\xdb\x48\xab\xac\x4d\xb2\xf8\x39\xfd\xb6\x8f\xfd\xc9\xc5\x06\xe2\xe4\xbf\x4b\xfe\xc7\xe4\x7f\x5a\xfc\xfd\xcb\x32\xd2\xa7\x77\x97\x36\xef\x95\xac\xef\xf1\xe1\xfb\xe5\xa9\x81\xbb\xef\xff\x29\x78\xb7\xce\xa6\xc7\xed\xf1\xcf\xc1\xe6\x1b\x3d\xa9\xe7\x2d\xf1\x3c\x72\xc5\x0d\x33\x94\xca\xb9\x43\xdc\xd6\x69\xe5\x82\x01\x26\x28\xc9\x7b\xc6\x36\x08\x53\xc5\x98\xd5\x5a\xc0\xb4\x2c\x3c\x37\x52\x71\x61\x79\x45\x38\x91\x84\xb2\x32\x98\x00\x15\x97\x4a\x03\xce\xb1\x46\x7c\x43\x0f\xde\x7b\x6f\x8e\xa6\xad\x19\xa0\xc0\xa5\x3c\x28\x50\xf8\x59\x1d\x95\x38\xa6\x5d\x18\xb8\xe5\xac\xe7\x75\xcd\x95\xed\xe7\x26\x1c\x47\x4e\x2d\x13\x92\x1a\xc6\x4c\xc3\xbc\xd2\x4d\xf0\xb8\x15\x42\x19\xa5\xa9\x56\x31\x16\x88\x79\xc6\x8e\xc6\x19\x6a\x14\xe3\xff\x25\xfa\xbf\xe5\x63\x57\xb7\x78\x7f\x79\xcc\x17\x15\xcb\x0b\xd3\xec\x9b\xfd\xe6\xfe\x36\x2e\xbe\x06\x7d\x2f\x47\xf3\x37\x83\xc9\xf3\xb4\x82\x18\x94\x1d\x25\x52\xd9\xd0\x4b\x2f\x04\x1b\xb4\x51\x3d\x61\x53\x5a\x11\x38\xb7\x10\xe5\xa0\x26\x1a\x63\x70\xfc\x3a\xd0\x8d\x39\x9b\x78\xf8\x6a\xb6\x2e\xca\x39\xef\x28\x29\x72\x89\x90\x21\x44\x69\x6d\x94\x24\x34\xa8\x53\x38\x18\xdd\x81\x0e\x60\xa8\x0d\x45\x08\xa1\x60\x19\xa3\x5c\x63\x85\x25\x09\x15\xc6\x40\xc4\x10\x2f\xc9\x52\x17\x6b\x1f\x45\xf2\x2e\x72\x9e\x3f\x46\xe6\x89\xff\xf6\xba\xa3\xdf\xfd\x4c\x07\xe0\xc2\xf5\xbf\xff\x08\x3e\xfd\x06\xdc\xfa\x64\xe9\xed\xf2\xe6\x45\xb6\xfe\xfe\xc5\xf9\x96\xc9\x66\x88\x42\x8f\x34\xd6\x6a\x4c\x5a\x7c\x5d\xa2\xd2\x93\x37\xb2\x70\x07\xba\xf1\x3e\xc3\x79\x9e\xdb\x9c\x51\x66\x03\xf6\x4e\x15\xfe\x48\x3b\x41\x05\xe5\x29\xe4\x54\x50\x26\xe4\xe2\xe9\x83\x89\xd7\x76\x85\x22\x05\xd7\x52\x6a\x69\xe6\x26\x85\xe5\xac\x67\x57\x22\x83\x11\x49\xbb\xd0\x84\x41\x88\xf2\xa0\x97\xa0\x70\xf6\x10\x19\x8c\x49\xda\xc6\x89\x19\x81\xa8\xe6\xb8\xc2\x54\x73\xc2\xe2\x6b\x8c\x7d\xc8\x13\xd9\xcb\x1d\x4d\xde\xde\x2a\x5d\xff\x7e\xed\x0e\xbe\x9e\xa3\x7b\xbc\x7f\x4d\xda\xf6\x0c\xd0\x8b\x20\x9f\xc7\xab\xa6\xd5\xfd\xdd\xfd\x3b\xf0\x0d\x5f\xc7\xc6\x39\x20\x1d\xa0\xa1\x75\xc1\xbb\xc5\x45\x6f\x7a\xa9\x50\x64\x05\x0d\xb4\xcd\x73\xc9\xb0\xc9\x8a\xd0\x05\x5b\x34\x3e\x08\x97\xa2\x40\xb6\x28\xc0\x80\x63\x8c\xda\x01\x7a\x9e\xae\x67\x3b\x4a\x29\x5d\x9e\x2a\xb5\x67\x17\x04\xe7\x85\xcd\x09\x48\x6c\x5e\x16\x48\x6a\x02\x21\x2e\x6d\x96\xfb\x80\x53\xca\xd2\x72\x1e\x18\xa8\x38\xe7\xa1\x5f\x8d\xdb\xdf\x4a\xe9\x13\xd9\xdb\x5d\xf6\x22\xaf\xf9\x07\xb7\xe9\x8c\xbf\x71\x2e\xfc\x96\xd9\x3c\x2f\xe6\x57\x6c\x90\xa9\xdd\x1e\xe6\x29\x65\x2e\x90\x35\x8d\x99\x87\xf4\x14\x67\xbe\xfd\xf2\x9a\xca\xe5\x13\xcc\xd5\xf2\xba\xcd\xdd\xd9\xb9\x88\x40\x4a\x33\x20\xcf\xb7\xb3\xe0\x77\x99\x65\xa1\xed\x96\x1c\xa6\x07\x9c\x85\x49\x6b\x4d\x97\x63\x96\x90\xa4\xcd\x24\xe5\xaa\x89\x1f\xed\xf4\x5a\x33\x47\xc9\xaf\x2e\x31\xdc\xca\x9e\x72\xeb\xdc\x44\x6d\xfe\x75\x90\xfb\x6e\x1d\x89\xb8\xbf\xdb\x3c\xbc\xfb\xb4\xf9\xb4\x02\xcf\x2e\x11\xdc\xdd\xc3\xdd\x5a\x28\xb9\x14\xf1\x3e\xbe\xe1\xb0\x3c\xce\x6e\x2a\xca\x59\x65\xa0\x72\xb5\xc3\x52\x35\x69\xe1\x4e\x27\x5f\xd7\x1b\xe8\x20\xe9\xc2\x30\x4d\x6e\x1c\xc3\x08\x14\x1d\x48\x6e\x73\xbc\x43\x94\x5b\x8b\xf1\x3c\x60\x8a\x67\xac\x2c\x68\x5a\xa3\x7b\x30\x80\x31\x64\x40\x8d\xe7\x09\xd0\x94\x96\x8d\xb5\x9d\x5d\xb6\x82\xed\x6c\xe3\xad\x85\xde\x24\xab\x8f\xe5\xfb\x7a\x87\x6f\x39\xf7\x6f\xa3\x12\xfe\x5f\x45\xbb\x73\xb1\x27\x0f\xb7\x9e\xdc\xc3\xfd\xfb\xfb\x57\xa3\xbe\xbb\x6f\x0b\x3c\x1f\x3f\x7c\x5a\x49\xb1\x1e\x2f\x75\xea\xd4\x83\x13\xf4\x30\x4f\xf3\x63\x09\x01\xfb\xc3\x08\x48\x01\x8f\x40\x61\x40\xc9\x5c\x6c\xf3\xaf\x93\x4f\x87\xb9\x5c\x0e\xd0\xc0\xdc\xe6\x70\x3e\x19\xca\xad\xda\x0a\x23\xa5\xd4\x73\xe2\x91\x04\x09\x75\xb9\x0e\x4d\x27\xb7\x1d\x85\x18\x5b\x82\x9d\x23\x58\xeb\xd0\xcc\x13\x20\x2c\x8c\xac\x67\x14\x32\x5a\xa0\x4a\x52\xad\x98\xd2\x86\xf3\xaa\xcc\x11\x47\x8e\x11\x9a\xec\x2f\xcf\xac\x88\xb3\x75\xbf\x8b\xfa\x23\xbf\xbf\xc6\xdd\x1f\x3f\x7f\xb9\xe6\x5a\x9f\xee\xee\xd7\xfc\x23\xfd\x35\x78\x78\x0d\x97\xfb\xee\xed\xe7\x2f\x0f\x7f\x06\x7e\x00\xef\x5f\x64\x5a\xbb\xeb\x14\xc6\xd5\x11\xa5\x93\x62\x9e\xdb\xa3\xa1\x86\x99\x79\x4c\x6b\x53\x82\x1c\x17\x38\xcf\xa8\x94\x94\x50\xc9\x35\x23\x10\x49\x57\x97\x99\x2e\xcf\x4a\x13\xc7\x99\x03\x45\xac\xa7\x1c\x8a\x42\x12\x25\x8d\xd7\x66\x57\x90\xc1\x6b\x47\x42\x17\x0b\xd0\x38\xf0\x34\x2b\x27\x1b\x9a\x81\x34\xce\x68\x5f\x29\x65\xfa\x7a\xe0\x02\x14\x01\x35\x43\x96\xf5\x20\x27\xee\xac\xd3\x4a\x6a\x0f\x35\x0b\xbe\x84\xcb\x8d\x00\x06\x9f\x06\x5e\xf7\x6d\x92\xfc\x6d\xd0\xc5\xfa\x8a\x89\xf9\xc7\x6f\x6f\x9d\x8b\xbf\x4e\xfe\xdd\x73\xdd\xef\x65\x40\xb5\xfb\xe9\xe3\xfe\xcd\x7e\xf7\x92\x70\xf8\x35\x08\xeb\x19\xe7\xfa\xe1\xd3\x55\x97\xe9\xb2\x16\x3e\x5d\xa9\xd1\xd6\x55\x70\x29\xb9\x24\x22\x2f\x00\x02\x94\x36\xd5\xec\x0f\x15\x05\x75\x0a\xad\xe9\xb2\x3c\xad\x1d\xd3\x04\x15\x84\xe2\x20\x39\xc3\xb4\x94\xa8\x0c\xb5\x5b\x55\xc6\x41\xe2\xdc\x51\x71\x2e\x64\xa0\x56\x2a\x6d\x40\xe6\x18\x03\x19\xcb\x6d\x61\x43\x73\x14\x1b\x6b\xa8\xa5\x6a\x67\x78\x9e\x7b\x6a\x10\xe5\x8c\x23\x63\x38\xa1\x3a\xcb\xea\x90\x49\x9a\x2f\xd6\xea\x18\x20\x65\xb9\xce\x49\xd6\xa4\xa2\x21\x44\x10\x32\x05\x56\x23\x22\x29\xc6\xec\xa0\x94\xb1\x7d\x59\x20\x01\x3d\x27\x7c\xb2\x8e\xc5\x3d\xb2\xd6\xeb\x17\xbf\xfc\xeb\xcb\x2e\x29\x93\x1f\x93\xdf\x5d\x35\xda\xaf\x77\xed\xc3\xe5\xae\xbd\xbf\xff\x78\x6d\xda\xbc\xbf\x8e\x6e\x3e\xee\xdf\xbf\x64\x42\xbd\xc2\x39\xb6\x93\xcc\x33\x90\x00\xc1\xf8\x53\x32\x77\xb5\x65\xc0\x09\xa0\xba\x79\xd8\xf2\xaf\x75\xac\xcd\x55\x2b\xf1\x49\x03\x98\x5f\x02\x11\x0a\x0a\x37\x23\xef\xe3\x78\xce\x71\x46\x3b\xca\xb3\xcc\x70\x5b\x48\x82\x18\x34\x9a\xca\x30\x06\xa6\x8e\x39\xc6\x94\x60\x76\x3c\xe6\x84\x22\x86\xc2\x61\xee\x10\x4a\xf1\x91\x87\x91\xad\x3c\x50\xea\x89\xec\xf9\x76\x4a\x76\x11\x21\x7e\x45\xa9\xff\xc3\x38\xd9\x7c\xf7\x72\x04\xf3\x1b\xd2\xd0\xf7\xab\x20\xd1\xbb\xf7\xcf\xd2\x8c\x5b\x17\x94\xbb\xb1\xc8\x6d\x39\xa5\x44\x94\x0a\xc2\xc0\xdc\x15\x7b\xc2\xe6\x65\x1d\x8f\xa0\xd8\x4e\xf3\x78\x96\xbb\xa6\x17\xa1\x17\x80\x7c\x4d\x38\x2b\x6c\x8e\xd2\x63\x5a\xc4\x4b\x22\x0e\x1a\x3d\x25\xc6\x28\xe7\x92\x64\x97\x96\x4f\x3c\xda\xda\x5d\xf2\xa7\xd1\x5f\xfc\xf5\x0d\xfd\xf5\x69\x31\x9f\x57\x08\x47\x3c\x22\x4f\xcf\xed\xe7\x2f\xeb\xd6\xbe\x7b\x00\x11\xed\x7e\x05\xe9\x45\x94\xef\x97\x9f\x3e\x6e\x8f\xa4\xb4\x25\x06\xa4\x73\xae\x06\x8d\x31\xe6\x30\x4f\xe7\xa3\xf3\xe0\x50\x6b\xed\x8b\xe3\x09\x4b\xe9\x80\x07\x63\x28\xbc\x28\x73\x5b\x62\x86\x0d\x93\x95\x1c\x08\xe5\x3b\xa4\x1d\xf2\xfa\x6b\x92\x16\x16\x70\x6b\x43\x6d\xe7\xd1\x6c\x72\x20\xad\x0d\xde\x84\x8a\x2a\x2b\x5c\x09\x81\x07\xad\x71\xce\x98\xe2\xd8\xb8\x0a\xb7\x43\x23\x40\x72\xb4\x3a\xce\x7d\xe8\xa8\x0d\x3b\xbc\xea\x5d\x7c\xb8\xe8\x42\x5d\xba\x14\x5f\x22\x9e\xfa\xf2\xf3\xa7\x97\xac\xb4\xe9\x69\x33\x9e\x0b\x97\x76\x33\x06\x4d\x8a\xe7\xce\x47\x8e\xdf\xfa\x76\x0a\x9c\x03\xca\xb9\xaf\x93\x07\x7a\x3b\x04\x6b\x74\x68\x03\x37\x95\x5d\x5e\x96\x88\x65\x08\x94\x01\x39\x24\x97\xda\x04\xd9\xbb\x5d\x72\x7b\x2f\xcf\x7a\x5b\xc9\xcf\xde\xc7\x37\xd3\x92\xdf\xf2\x84\xa5\x2a\x85\x73\x6f\x41\x11\xc6\x34\x59\x62\x81\xd8\x5f\x9b\xcb\xad\x0c\x59\x6a\x67\xed\x97\xe4\x3a\xc0\x18\x99\x80\x01\xc8\x73\x7b\x3d\xdb\x25\xc1\x69\xa3\x97\x97\x65\xc9\x4a\x3b\x0c\x56\x02\xbe\x38\xdf\x56\x4a\x99\x24\x9b\x58\x33\xaa\x77\x24\xf9\x98\xfc\xfb\x15\xf7\x7c\x79\xae\xd7\xc7\xfb\xd3\xc7\x77\x3f\xcb\x0e\xee\x7f\xda\xec\x2e\x85\xe3\x17\xd3\x41\x6f\x97\x37\x7e\x29\x1d\x5e\x13\x86\x57\x8a\x8e\xd7\xa1\xb1\x9d\x62\x0c\x2a\xc2\x20\xe4\x58\x62\xc6\xb5\x10\x1c\x35\x1d\x67\xb5\xd6\x12\xb8\xd1\xce\x36\x45\xaa\x3a\x84\xaa\x04\x06\x69\x2d\x79\xe1\x88\x5c\xc5\x79\xfb\x25\xed\xe7\x5a\x11\x22\x49\x90\xa9\x34\x8a\xc1\x40\x52\x41\xb8\x33\xd2\x39\x3b\x40\xaf\xfb\x1d\xd1\x04\x73\x86\x51\x49\xa9\xa0\x18\x21\x83\x70\x8b\x0c\xa1\xb6\xb0\x96\x33\xe9\x2b\x90\x65\xba\x95\x41\x9a\x50\x37\xb9\x2d\x40\x06\x4c\x95\x97\x85\x46\x48\x53\x4c\x19\x3f\xc7\x1e\x90\xd6\x46\x50\x66\x04\x95\x44\x23\xca\x2f\xfb\x9c\xee\xd9\x37\xfb\x1c\x27\xff\x2c\x46\x2c\xff\x65\xfb\xfc\x5b\xe5\xf5\x3f\x05\xef\x6f\xc2\xeb\xaf\x77\x3e\xa3\x14\x8b\x52\x42\x18\xb8\xbb\xb6\x53\x39\x63\x84\x97\x82\xa0\xd0\x16\x5a\x19\x7b\x9d\x21\x8a\x86\x40\xed\xea\xab\x21\xc8\x18\x2f\x5c\x81\xd2\xee\x6a\x08\x8e\xf3\x91\xf3\xcc\x64\x22\xf3\x4a\x69\x90\x83\xac\xe3\x61\xe0\x30\x79\x93\xc2\x27\xba\xd7\x31\x76\xfe\x18\x11\xb9\xff\x34\xf9\x1f\x96\xd8\xf9\xfb\xfd\xcf\x29\x62\x7e\xe1\xda\xb7\x1c\x31\x2b\x72\xf8\xd3\x6b\xb4\xe2\x4a\xb6\xf8\x26\xb3\x19\x23\x42\xb9\xdc\x2c\xd9\x1f\xaf\x44\x6b\x66\x69\x33\x8e\x5f\x5f\x03\x47\x55\x08\xc9\x67\xa3\x0a\xae\xf8\x76\xb4\x5f\x3b\x57\x01\xe5\xd3\x32\x53\x96\xfa\xbc\x62\x10\x65\x41\xa3\x90\x53\xe0\x70\xa8\x76\x94\x92\x12\x29\x82\x08\x15\x52\x50\x49\x25\x3d\x4e\x3f\xbf\x54\x95\x4e\x21\xad\xe3\x6b\xa0\x61\xf4\x1e\x14\xe1\x68\x4c\x30\x5d\xe1\x0a\xd1\x07\xcb\x3d\x8e\x5a\xd7\xdb\x94\x45\x1f\x95\x5d\x74\xb5\xfe\xe3\x4d\x45\xea\x65\x10\xf3\xe6\x59\x57\xeb\xe3\xda\x5f\xfe\x07\xe0\xe3\xcb\xf6\xf2\xe2\xd2\x57\x06\xf4\xf5\xfb\xb5\xb8\x78\xa9\x3b\x7c\x7a\x7c\xd8\x95\xa6\x04\x9e\x08\x5b\x91\x63\xd3\x4c\xf8\x60\x31\x86\x84\xd7\x92\x09\x89\x42\x97\x9d\x8c\xe2\x42\x14\xb4\x2c\x4b\x63\x0e\x3e\x75\x69\xd6\x2e\xcb\xe0\x74\x02\xf2\xac\x80\xeb\xba\x16\x62\x29\x90\xce\x6d\xbb\xcb\x20\x95\x3a\x4a\x93\x50\x86\x5c\x81\x20\x42\x90\x3b\x4c\x10\x66\x79\x65\xc3\xb1\xf2\xce\xb9\x8c\x70\xe7\x00\xfd\x9a\xef\xf4\x3c\x2a\x6d\x94\x96\xd6\x4a\xad\x04\xe5\xa6\x81\x58\x27\x6f\xc0\xf4\xc4\xf6\xcd\x0e\x27\x7f\x79\xe9\x98\xad\x75\x93\x67\x6c\xdb\x0b\xe3\x70\x77\xff\x9a\x6a\xe0\x55\xbd\x60\xb7\x84\xb8\x6f\x6e\x60\xc5\x17\x51\x6d\x6a\x41\x0f\x4b\x5f\xe4\xe9\xb2\xad\x25\x45\x96\x50\xa1\x18\x63\x41\x31\x2b\x44\xa1\x24\x09\x8a\x32\x2a\x39\xa1\x9c\x53\x85\x83\x05\x0a\x8c\x5a\x50\x3c\xa5\x7e\x96\xcb\x21\x8c\x3b\xca\x76\x53\x1d\xb4\x53\xed\xb6\x21\x14\x21\x68\x19\xc1\x78\x09\x08\x4b\x5f\xa2\xc0\x9f\x12\xc9\x4b\x0f\xe9\x08\x3c\x2c\x0d\x42\x18\x09\x4c\x38\x19\xa4\xe6\xa1\xe2\xa1\x13\xe1\x24\x2a\x69\x99\xb3\x9e\x57\x36\xe6\xd3\xe8\x09\xed\xcd\xae\xf8\x63\x0a\x89\x2f\x7b\x86\xcf\xf0\x80\x55\x2a\xe2\xb5\xd5\xde\xbd\x7f\x66\xec\x49\x6b\x90\x54\xa0\x5c\x25\x11\xcd\x5c\x81\xf1\x6b\x03\x8e\xf3\x00\x48\x14\x0f\x2c\xc3\x70\xcd\x0b\xd9\x79\xbc\x9e\xcd\x4a\xb4\xe1\xc4\xa6\xb4\xea\x7b\xd6\x0f\xdb\x4a\xa9\x48\x84\x28\xe7\x36\xa5\xd2\x2a\xa5\xe6\x56\x08\x11\x0e\x52\xca\x93\xd4\xd4\x22\x81\x94\xd1\x78\xad\x0b\xe0\xa8\x8f\x78\x4c\xf6\xb1\xcb\xba\xf6\xef\xff\xfa\x65\xfd\xeb\xe1\x59\xe5\x75\xb1\xea\x8f\x1f\x2e\xdf\x77\x7f\xa4\x5f\xff\xc3\x8d\x8b\xfb\xc3\xe7\xa8\x42\xb2\x3c\xe2\x3d\xb1\x61\xb2\xc2\x86\x93\xdd\x50\x3d\xa9\x71\x36\x66\xd4\xc3\x06\x6a\xc1\xa4\x9a\x8f\x92\x33\x2e\x82\x04\x75\x59\x54\x79\xb9\x29\x42\x85\xd9\xa9\x17\x6d\x38\xf4\x01\x12\x40\xfb\xd0\x12\x14\x1a\x70\x2a\x4b\xe7\x38\xde\x1e\xe7\x13\x70\x41\xc5\xae\x58\xfc\x3e\x54\x27\xcf\x4d\x5b\x55\xa3\xe3\xba\x76\x44\x08\x49\x19\x22\x9c\xe2\x09\xa1\x1c\x42\xab\x28\xa1\x96\x71\x5d\x9a\x9c\x32\x4a\x61\x59\x42\xcc\x93\x37\xa9\x88\xb1\x39\x4e\x7e\x93\xa0\xe4\xf3\x05\x0f\xb2\xce\x0c\xbe\xee\x7c\x5e\x8b\x23\x9b\x5f\x16\xc6\x5b\xfb\xbb\x2f\xc8\x39\x1f\x6e\xe4\x9c\xab\xc9\xdb\x2a\xc0\x31\x0a\x13\x15\xa2\xe5\x16\x01\x86\xe8\x38\xa3\x94\x44\xb2\x80\x03\xd7\x4e\xc8\x02\x15\xa4\x24\xde\x54\x6e\xe3\x28\xd2\x90\xb6\x8e\x10\x0e\x33\x93\xd3\xa6\xe5\x29\xe7\x58\x61\x3e\x2b\x5d\x70\xcd\x37\x15\x11\x0c\x0b\x5d\x43\xae\x04\x9d\x3b\xad\x95\x00\x8d\x0e\x75\x5b\x6b\x95\x99\x4c\x56\x15\xd0\x7f\x18\x77\xee\x6c\x98\xa0\x82\xe5\x4f\x49\x59\x16\x12\x3a\x82\x19\xc8\x8d\x27\xce\x90\xb2\xf5\xc4\x2f\x36\x0c\x5d\xea\x9f\x6f\x63\x1c\xfa\x57\xbf\xcc\x2c\xf4\xfe\xaa\x61\xb6\x52\x0f\xec\x6e\x4d\x82\x6b\x4e\x9a\x4a\xc0\x1c\xe0\x6e\x9d\xee\xab\x5d\x68\xe4\x96\x84\x3c\xcb\x53\x3b\xf7\x07\xa0\x49\xc0\x83\x0d\x9c\x03\x6a\x03\x4b\xf3\x22\x0f\xd4\x6d\xca\xf3\xb0\x1c\x5b\xaf\xb5\x52\x46\x08\x21\xcc\x3c\x22\x64\x2d\xf2\x6c\x9a\xb8\xc7\xd6\x22\x04\x18\x0d\xd3\x25\x7e\xce\x63\xbc\xa4\xbe\xd1\x26\x5d\x7b\x39\xdf\x28\xae\xfd\x67\xb5\xd5\x5e\x2b\xe7\x5c\x27\x18\x3e\xdf\x60\x26\x15\xe8\x7d\x9a\x68\x1d\x92\x14\x7e\xa5\xe0\x14\xa0\x73\xeb\xde\xec\x81\x3c\x1f\x6e\x67\x6b\xeb\xfa\x04\xdc\x57\x0d\x5c\x51\x54\x79\xb6\x41\xe1\x44\x1c\xa8\x44\x18\xc7\xa7\x24\x48\x02\xca\x63\x5b\x51\x1c\x86\x74\x74\x2c\xc0\xa2\xd8\x15\x9c\x37\xa6\xa1\x8b\x57\xa6\x8d\xc1\x18\x4f\x18\xe3\x80\x97\x9d\xda\x97\xb0\x2c\x72\x2b\xa8\x56\x9c\x70\xac\x21\x44\x25\xc6\x1a\xd1\xb2\x88\xf5\xca\x3e\x6a\xe8\x0c\x31\xb2\xf8\x5d\x5c\xb7\xff\x2c\xaa\xe8\xdd\xe6\x4c\x3f\x5e\xea\x37\xdf\x50\x61\x3d\xb7\xaf\xc1\x1f\x29\xdf\x6d\xe0\xc1\xb5\xdb\xca\x9d\xed\x46\x9f\xeb\xe5\xf1\x81\x4e\x08\xca\x4b\x4d\x70\xa4\xb2\x73\xa0\x0a\x04\xe4\x9c\x72\xc2\xc0\x29\x7e\xc3\x9c\x71\xca\x43\xc3\x96\x1f\x36\x2a\x8c\x81\x86\x96\x03\x06\x5c\xca\x82\x9b\x54\x6f\xd8\xdc\x70\x5e\x98\x8c\x80\x66\xae\x53\x3e\x9b\x4d\xc2\x9e\x12\x88\x05\x29\x45\x7c\x95\x98\x08\x8a\x30\x22\x82\xa0\x64\x97\x8a\x27\xb2\xc7\xbb\xf2\x52\x17\xf9\xd7\x11\x87\x70\x61\xdc\x7f\xc1\x03\xfd\x18\xd1\xee\x5f\x1e\x3e\x5c\x68\x96\xc0\xcb\x81\xda\x5f\x00\xd3\x7e\xbf\xdf\xbc\x18\x38\xfc\x31\xd5\x5d\x66\x32\x50\x52\x0b\x51\x81\x31\xce\xf2\xa6\x3c\x8a\xb6\x68\xd3\x7e\x49\x3d\xf4\xe9\x04\x38\xe7\x25\x2a\x25\x0c\x2e\xcb\x3a\xc7\x5c\xc7\x1b\x3e\xa1\xd0\xba\x34\xcb\x4d\x66\x6c\x5e\x38\xc9\xa4\xe3\x15\x03\xf9\xb6\x41\x84\xa0\xe0\x6d\xa6\xb3\x82\xd4\x61\xb2\x4c\x1f\x75\x20\xb6\x0d\x68\x36\x8c\x65\x86\x80\x3e\x2f\xa8\x50\x72\xd9\x90\x42\xcd\x62\x53\xca\x02\xc2\xd0\xe4\x18\x23\xaa\x28\x11\x24\xea\xd6\xec\xd3\x22\xc6\x14\x28\xf9\x4d\xe4\xfe\xf8\x8b\xe8\x59\xff\xdd\x25\xb2\x58\xa5\x19\x2f\xb4\x9d\xfb\xeb\x67\xfc\xb0\xce\xcd\x45\xa2\x1f\x10\x1b\xd3\x97\x15\xf0\x47\xa8\xd0\x3e\x6c\x90\x2d\x00\xf6\xc1\x32\x40\x4c\x9f\x11\x44\x21\x2e\x39\x2d\x51\x59\xf2\x26\xad\xb2\x1c\xd4\x4c\xaa\x86\x86\xc2\x00\x44\xe0\x01\x86\x08\xb0\x0a\x87\xad\x0d\x09\x5b\x42\x6d\xa9\x70\xc8\x06\x59\x9f\xe8\xb0\x29\xfa\x56\x06\xb3\x43\x25\x33\xa1\xee\x74\x73\xca\xb2\x12\x32\x58\x22\xcc\xcb\x12\x16\xa2\x9e\x20\xd4\x5a\x49\x6a\x8f\xe0\x14\x7a\x42\x68\x38\x1a\x6f\xc3\x41\xb0\xd2\x96\x04\xc4\x48\x26\x6a\xaf\x98\x53\xb2\xbb\xe0\x3c\x71\xf2\x5d\xf2\xfe\x96\x0b\xc5\x02\xfb\xa5\x20\xf6\x31\x4e\x38\x6c\x16\xe3\xf3\x0b\x39\xd1\x9a\xe2\xf7\xb0\x4c\x51\x18\x0a\x08\xfc\x1f\x1a\x20\xc8\x94\xe6\x45\x99\x81\x1c\xe6\xc1\x86\x7a\x4b\x43\x91\x9a\xd9\xf8\xb9\x4a\x45\xc0\x7e\x53\x9c\xc7\xe5\xd8\x61\x4c\x35\xc6\x5a\x2b\x0d\x61\xe8\xc8\x92\xc1\x4f\xc2\x76\x9d\x15\x80\xb2\x30\xb0\x8b\xcf\x44\xfb\x7a\x3b\xdc\x26\x0b\x9e\x77\xe0\xfd\x85\x70\xf5\x4b\xcc\xda\x6e\xe7\xaf\xa4\x72\xaf\x73\x8f\x8b\x09\xbd\x48\x07\xc6\xd6\xf1\x4a\x55\x9d\xda\x14\xda\xf6\x88\xa6\x2e\x88\x94\xa5\xd8\x36\x1e\x8f\x3e\xb0\x40\x04\xe5\x8c\xa7\x0d\x67\x9c\x71\x6d\x62\x41\xc7\xb0\xe0\x82\xef\xc3\xc8\x41\x3d\xf0\x31\xf4\x04\xe4\xa0\x55\xe1\x10\x28\x05\x36\x2d\x6d\x70\x33\xa1\x69\xbd\x1d\xe6\x13\xc5\x50\x43\xdc\x99\x79\xe0\xa4\x50\x08\x1d\x4b\x48\x24\x45\x3c\xbe\x86\x11\x16\xb9\x61\x96\xb7\x96\x69\x2d\xa8\xa3\x92\x64\xbc\x95\x9a\x61\x12\x7a\x65\x64\xb2\xd6\x04\xd8\xbe\xde\x15\xc9\x9f\x44\xec\xf4\xef\xae\x3d\x92\x5f\x1c\xe8\xfd\xbc\xd2\x1f\x2c\x4b\xee\xd2\x20\xfb\xb0\x0e\x37\xac\xcd\xd4\x1f\x3f\x7e\xff\xdc\x4d\x7d\x63\x6c\x0e\x35\x17\x8c\x61\x26\x9b\x20\x6d\x56\x48\x26\x08\x85\x56\xb6\xa1\xd7\xb6\xe7\x47\x6b\x08\x77\x18\xf3\x63\x7a\x70\x00\x86\x9e\x6b\x8f\xe4\x29\x9c\x38\x23\xa6\xcd\x5c\xc1\xf5\xae\x28\x9d\x96\xc2\x6a\x6e\xa4\x38\x01\x54\x0a\xce\x99\xe1\xc4\xd7\x62\x02\x8c\x84\xa9\x5a\xe2\x02\x6b\xce\x53\xca\x09\xb6\x4d\x31\xd8\x30\x15\xde\xd8\xbc\x61\xac\x07\x07\x6f\x1a\x92\xec\xd3\xe4\x89\xef\x9b\x5d\x19\x2b\x75\x4b\x44\x77\x8b\x08\x56\x6f\xf8\x67\x60\x55\x3b\xd8\x7d\xfc\xf1\x6e\xc5\x2f\xde\x3e\xf0\x87\x57\x9f\x7e\xdd\x9f\xaf\xf4\xf0\xbf\x89\x08\x52\x95\x26\x3e\xa5\x73\xdb\x81\x81\x06\xdc\x57\x81\xf1\x94\x85\x64\xd3\xfb\xbc\x54\x42\x31\x81\xb1\x34\x73\xe1\x8a\x92\x12\xb5\xe4\x99\xb2\x4d\x33\x45\x0c\x56\xa3\xc3\x6a\x20\xb9\x2d\x09\x0e\x43\x2f\x36\xc4\x72\xc3\xec\x99\x6b\xa4\xb4\xda\x1e\x84\x70\x8e\x84\xa3\x71\x1a\x14\x53\x6d\x8f\x00\xb9\xa2\xc4\x98\x49\x2d\x19\x5d\x82\x86\x92\x12\x4c\x34\x81\x92\xca\x2a\x54\xda\x50\xa3\x51\x68\xcb\x82\x28\x78\x80\x90\x30\x80\x6c\x45\xbd\x83\xa4\xd1\xcc\xae\x7c\xec\x30\x6a\x30\x8e\x2f\x98\x9d\xfe\x3a\xda\xa4\xfb\x55\x34\x3e\x52\xf4\xfe\xf8\xe1\x99\xc5\xe0\xe5\x00\xd7\x9b\xab\x18\xca\x97\x9f\xd5\x2c\x5e\x22\x15\xd3\xc3\x56\xcc\xb5\x30\xde\x30\xe6\xc2\x29\xf4\x80\x82\x1c\x42\x5d\x09\x53\xc2\xa6\x61\x8a\x92\x82\x50\x3c\x3d\x25\xf0\xd0\x3a\x57\x34\x36\xd4\xeb\x54\x69\x0f\xf8\xf9\x78\x3d\x23\x87\x4a\xfa\x76\xb6\xd2\x0e\xac\xdd\x8e\x73\x2d\x48\x96\x23\x8c\x1b\x55\xc0\x12\x52\x5b\x31\x82\x8a\xbc\x95\x2c\xb7\x39\xb3\x45\x6e\x08\xcb\x33\x49\x25\x10\x5a\xeb\x50\x2f\xf1\x72\xc6\x84\x52\x94\x33\xcb\x0c\x4a\x36\xe0\x10\x71\x03\x45\x52\x26\xbf\x8b\x48\x99\xeb\xe4\xd5\x4b\xf9\x97\x87\x14\x44\xf9\x8d\xc7\x4f\xcb\xc7\x59\x83\x8a\x75\xf9\xdf\xbf\x7b\xf8\x7e\x79\xf9\xee\xfd\xfe\xa7\x4d\x1c\xd0\x8a\xb8\x8a\x98\xdc\x6d\x3c\x2a\x7d\xe8\x33\x50\x66\xcc\x60\x9a\x33\x0c\xf3\x22\xf3\x45\x98\xa4\xd5\x99\x1a\x8b\x32\x85\x16\x81\x71\x1e\x08\x55\xce\xc4\x69\xe7\x3e\x07\x70\xa4\x47\x79\x64\x72\x94\x27\xfa\x94\x80\x22\x5f\x76\xb1\xdd\x15\x42\x59\x25\x66\x36\x66\x2e\x67\x2d\xb0\xf3\x29\x0c\xda\x02\x0b\x26\xcb\x29\x84\xc6\x6a\xce\x1b\x5d\x12\x6c\x14\xb7\xe1\xa4\xb5\x01\x65\xe8\xb5\xd1\x20\xb1\x7c\x09\x35\xfc\xb5\x26\x45\x23\x1e\xec\x25\xae\x77\xb5\x71\xd7\x8e\xd1\xda\x84\x78\x7c\x78\x07\x5e\x74\xf3\xc1\x2f\x49\x22\xbf\xec\x54\xa4\x7a\x3b\x05\x09\xd8\xd7\xe5\xa9\xe9\xf4\x78\x08\xc7\xba\x06\xe8\x60\xdb\xb3\xdb\x0c\xe7\xf2\xb0\x23\xb3\xa7\x6b\x3d\x1a\xcd\xed\x66\x38\x54\xa2\x3e\xcc\xd2\xf8\x4a\xb7\xdb\xd1\x98\xa0\x81\x35\xc6\x98\x70\x72\xcb\x57\xa8\x8c\x30\xed\x5a\x64\xae\x4a\x2e\xf5\x62\x43\x0c\x93\x3c\x79\x13\xf1\x5d\xd5\x0e\x26\xbb\x5b\x94\xf8\x2f\x2f\x15\xcc\xbf\x78\x81\xd8\xb8\x0d\x66\x47\x13\xf5\xdd\xee\xe5\x64\xc5\x7d\xba\xb9\x6d\xe7\xb7\xd7\x54\xf5\x8d\xc0\xa5\x2d\xf1\xd1\x15\x65\x9a\xf5\x87\xc3\xe1\x00\xf2\xd9\xbb\x12\xaa\x0e\xd0\x6e\xf9\x9a\x11\xa8\x72\x26\x99\x45\x44\xd6\xa2\x15\x5c\x69\x4a\xca\x2c\x9c\x76\x90\x09\x24\x59\x06\x05\xb3\x9d\xad\x6d\x67\xdd\x46\x61\xc4\x41\x31\x74\xdd\x72\x27\x42\xd3\x6d\x68\x90\x61\x38\x74\xc4\x99\xd1\x19\x0f\x8a\xc6\x63\x21\x0f\xed\x5a\x6b\x28\x9e\xe4\xbe\xde\xd9\x4b\x94\x8e\x9f\x99\x7a\x96\xe8\xf5\xe1\xcd\xfe\xdd\x8f\x5f\x56\xa2\xf8\x4f\xcf\x12\x3e\xff\x1c\x44\x56\xcf\x17\x14\x66\xd1\x3d\xb2\xba\x84\x69\xf9\x94\x78\x40\x48\x30\x9d\x55\x1a\xe4\x83\x08\x53\x38\xb0\x23\x50\x65\x91\xbb\x42\x06\x1c\x0e\xba\xe6\x00\xb9\x09\x40\x78\x48\xbb\x19\x5f\x8f\x9d\x85\x8c\xcc\xb9\x40\x9e\x0e\x8a\x28\x44\x0d\x81\xc5\x12\xb4\x1a\xe6\x29\x91\x47\xea\x04\x4f\x27\x1e\x7a\xbe\x2a\x93\xaf\x36\xa4\xbc\xf8\xf5\x1f\x6e\xba\x8a\x2b\x8f\xc5\x2d\x0e\x7f\x56\xd9\x5d\x5c\xfb\x33\x95\x07\x78\xbc\x7f\xf7\x92\xc7\x35\xb5\x69\x96\x67\x75\x96\xa5\xc9\x3c\x14\xa0\x6f\xfe\xe0\x0e\xc0\x64\x79\xc8\x37\xdd\x0c\xd3\xfe\xf9\xa0\xb2\x3e\x89\x21\xad\xa7\x23\x19\x86\x6d\x87\x71\x89\x4a\xcb\xe7\xc4\x98\x4d\x82\x16\x3f\xc2\x15\xa5\x4f\x09\x79\x4a\x28\x75\x5c\x31\x8b\x38\x66\x56\x2c\xc9\x71\x1a\xfb\x36\x7e\x87\x92\x7f\xf2\x6a\x82\x74\x35\x64\xef\x3e\x7f\x79\xbf\x7b\x35\x1a\x12\x69\x8d\x3f\x3c\x46\xe4\xe4\xe7\xef\x1e\xef\xee\x37\x9f\x1e\x5f\xe2\x86\x1f\x36\xa7\x95\xee\xe8\x08\xa9\x46\xc5\x3c\x4e\x6d\x1e\xa8\x94\x23\xcd\x4c\xa6\x43\x37\x18\xa5\x0b\x90\x84\xa1\x72\x82\x00\x77\xb2\x1b\x37\x67\x1b\x7d\xb6\x9b\xe4\x2c\xed\x6e\x09\x11\x95\xe0\x04\x63\x53\x14\x1a\x95\x45\x0e\x39\x34\x0c\x13\x92\x67\xba\xb0\x01\x05\x1b\x7a\xd6\x82\xe4\x98\xe6\xe7\x66\xb0\xdc\x4a\x33\xae\x9c\x80\xd7\x1a\xd5\x5f\xbd\xec\xf6\xdf\xbd\x48\x6a\xef\x9e\x49\xe5\x3e\xbc\xd9\xbd\xa8\xcc\xc4\x5f\x7e\xde\x16\x52\x57\xb1\xda\x48\x3d\x10\x11\xac\x7c\x02\x3e\xe4\xa0\xf1\x87\x11\x14\x34\xb8\x30\x9c\xc2\x91\x8d\xad\x62\xd4\x76\x83\x39\x37\xa0\x0f\xf0\xb0\x9d\x14\x2a\xb4\xb5\x29\x9f\x6b\x6b\xad\x9d\xb9\x74\x5e\xe2\xd2\x21\xce\xa1\x2b\x21\xa6\x4a\x50\x2e\x9d\x4c\x75\xb1\xac\x0f\xf7\x44\xf7\x62\x57\x26\x77\xc9\x87\x17\x7a\xda\x17\x75\xf0\x9f\x9e\xf5\x8b\x3f\xef\x5e\xd6\x0c\x1f\xd2\xdd\xc7\xcf\x6f\x1f\x5e\xd4\x14\x5f\xf5\xa9\xb7\xa5\xac\xba\x63\x09\x95\x20\x26\x6f\x2a\x3a\x02\x9a\x56\x99\x94\x48\x16\x0a\x97\x65\xd6\x67\xe1\x24\xfb\xa2\x4e\xb9\x3f\xb7\x6e\x05\x66\x8f\x17\x89\xf6\x78\x16\xaa\x5d\xa9\x48\x19\x46\x4e\x09\xb2\x35\xc6\x1c\x33\x30\xc0\x2c\xa8\xbe\x74\xa5\x9c\x42\xe5\xa5\x01\xf9\x3c\xcc\xb9\x10\xe9\x14\x26\x6b\x6d\x50\xd6\xda\xd8\xb3\x3e\x3e\x89\x18\xcb\xff\xd7\x17\x2b\x84\xe2\x5a\xba\xf0\x0a\xbe\x9e\x2c\x5a\x6b\x9f\x71\xa7\x7e\xbe\x7e\x86\x58\x41\xb9\x7f\x7c\x7b\x1b\x3c\xbc\x4c\x22\x6e\xa6\x06\x96\x69\x1b\x0a\xea\x3b\x9c\xb9\x4c\x87\x71\x32\x75\xa0\x12\x8c\x2a\x08\x50\xa0\x06\x88\x2c\xf8\x34\x01\xfc\x5c\x03\x5c\x86\x1a\x4c\x59\x0e\x4c\x89\x91\xca\x8d\x2b\x09\xd4\x08\x62\x92\xe7\x3b\x84\x28\x9a\x49\x10\x45\x09\x25\xf2\x9c\x32\x40\xc2\xb1\x36\x07\x00\xd3\x03\x0b\x9e\x52\xe7\x02\xf3\x8c\xfa\x20\x22\x89\x71\xae\x78\x5d\x7a\x9c\x15\xb0\xb8\xf6\xe4\xfd\xa5\x0e\x76\x45\x14\x2d\x99\xca\x6b\xb9\xd4\xcb\x5c\xf2\x2a\xc0\x7b\x77\xff\x3e\x4e\x23\xfc\x17\xe3\x89\x76\xf1\x5f\xdf\x48\x8b\x4f\x8c\x11\x51\x0a\x8a\x42\x9f\x55\xca\xe4\x42\x56\x88\x2d\xf1\x60\x53\x9a\x62\x53\x63\xe5\x18\xb3\x5a\x49\x9c\x92\xa2\x96\x5e\x38\xa5\x5a\xd6\x4a\x41\x15\xe6\xb2\x0c\x3c\x54\xa5\x29\x77\x05\x54\x5f\xad\x10\x99\xcd\x04\xf0\x41\x9f\xd4\x01\x30\x9b\x22\x36\x1b\xd0\x08\xed\xb2\x4a\x00\x1a\x0e\x54\x53\x36\xf0\xa6\xe2\xd2\x0d\x73\x1d\x8e\xc3\xe2\x5b\x94\xe4\x9a\x4a\x5d\x31\x2f\x6d\x2d\xa5\xcd\xfd\x05\x43\xb6\xf8\x1b\xbb\x53\x71\xbe\xf6\x8a\xb2\x58\xee\xc3\x2d\xd4\x7f\xff\xc3\xfb\xfb\x78\x23\x7e\x0f\x1e\xef\xee\x7f\xfa\xb8\xbf\xa0\x67\xdf\xbe\xd0\xbc\xd8\xfa\x0a\x81\x12\x08\x1e\xaa\xd0\x4f\xe1\xa8\x40\x7d\xa2\x08\x34\x67\x99\xb5\x4e\x32\xd0\x97\x68\xda\x64\xe7\xd3\x26\x3b\xf8\xb9\xf6\x7e\xd9\x58\x3b\x05\x51\xc5\x9d\x6e\x0f\x52\x5b\xca\xc5\x3c\x84\x76\xe4\x7e\x6c\x40\x87\xd1\xc4\x79\x47\x69\xe8\x03\x22\x14\xf4\x61\xac\x62\xfe\x52\x46\xec\x73\x9e\xfc\xe6\xe2\x1b\xff\x51\xe4\xb3\x89\x6a\xc3\x6f\xf6\xdf\xed\xf6\x1f\xbf\xa5\x85\xbd\xf2\x57\x80\x6b\x89\xf6\x85\x53\x7f\xd9\x7e\xde\x56\x3e\xcb\x0f\xa0\x23\x95\x88\xea\xc9\x04\xcd\xd2\x1b\x91\x0a\x9b\x66\xb5\x62\x4f\xc9\xb5\x26\x7b\xa8\x3d\xa9\x9a\xad\xc3\x4d\x87\x3a\xd9\x34\xb4\x69\x42\x51\xf8\x16\x75\xbb\x9c\xb3\xe0\xbd\x21\x73\xc7\x97\x08\x8d\xd0\x70\x4a\x0f\xc8\x1e\xac\x3e\x34\xc1\xc9\xd0\xa8\xcd\xa1\xa4\x92\x96\x4c\xe2\x5c\xe7\x07\x24\xb4\xc6\x4c\x12\xa8\xe1\x12\xbb\xd0\x18\xbb\x1c\x5f\xf4\xf6\xfe\xf4\x52\xd5\x5c\xfb\x69\x9f\xee\x1e\xee\x2f\x90\x03\xf0\xe9\xee\xe1\x65\xb1\xf9\xfd\xf5\x93\xec\x3e\x7e\x4e\xdb\xad\xfe\x6a\xab\xa6\x01\xb4\x71\x87\x90\x55\xd5\xa4\xed\xc4\x0f\xe9\x1a\x93\xf0\xf1\x20\xbb\x21\x48\xd5\x86\x89\x9d\xb6\xc7\x79\xb2\xd7\x6e\x0c\x48\x02\x3d\xb7\x9b\x42\x54\xd2\x52\xcb\xb5\xb1\xa2\x36\xb5\x69\x8d\x14\x83\x76\x32\x49\xde\xa4\xc5\x93\xd8\x37\xbb\x24\xf9\xbb\x17\xdd\xfc\x7f\xb5\xf6\x51\x5e\xb1\xb5\x3e\x5c\x32\xda\xd8\x07\xf8\xf0\x9a\xd6\x3a\xf6\x53\xbe\x5c\x94\x06\x5f\x41\x41\xbe\x51\x07\x4a\xed\xe8\x8e\xc7\xae\xeb\x7b\xb7\xbc\xb1\xb6\x1d\x53\x97\x52\x61\x10\x2d\x28\x46\x65\xde\xe6\x4c\x6a\x41\x73\x5d\x4a\x6a\xb0\x4c\x95\xa2\x96\xa8\x33\x71\x54\x58\x05\x4a\x47\x4c\x4b\xa2\x71\x99\x7a\xbd\x6d\x18\xb3\xca\x68\xeb\x9c\xd5\x46\xd9\x79\xec\x0a\x5b\x68\x20\xc2\x30\x49\xc1\xfa\x69\x76\xd2\x50\xad\x72\x57\xb3\xca\x53\x34\x78\xda\xb8\xd0\x17\x25\x69\xd0\x20\x08\x4d\xb6\x11\x8b\x54\xef\xb2\xe4\xef\xc6\xaa\xd5\xef\xaf\xe8\xeb\xf5\x79\x5c\xaa\x39\x2b\x18\xe4\xf1\xfe\xf3\x87\xf7\xcf\x72\xbd\xb7\x84\x6a\xf9\x83\x5b\x1c\xfd\xdd\x96\x38\x84\x6d\x98\xb8\x19\xd0\x60\x3a\xdc\xdb\xc5\x39\x69\x06\x8c\x45\xc0\x62\xa2\x51\x19\x46\x42\x85\x9e\x5b\x8a\x2c\x24\x1b\xec\xb2\xdc\x1f\x59\x67\xd8\xa4\x0e\xd5\x2e\x43\x5a\xd8\x79\x02\x7e\x1e\x9f\x92\x5a\x9a\x43\x5a\x04\x99\xe6\xd6\xea\xf2\x68\x9c\x62\x9c\x79\xa5\x3a\x40\x98\xc4\x92\x05\x5e\x56\x26\xd4\xde\x7b\x50\x3c\x25\xad\x72\xe0\xd2\x17\x95\xb1\x76\xfa\x63\xf2\xbb\x88\x4a\xb8\xe9\xcc\xef\xaf\x6a\xb6\xd7\x7a\xe9\xe7\x7f\xb1\x6c\x9f\xcf\x37\x9d\x88\x6f\x05\x48\x53\x0f\x7a\x9f\xa2\xf9\x98\x37\x14\x79\x0e\xb2\x90\x35\xc0\xd0\x50\x1c\x7c\xd0\x7c\x70\x2c\x68\x30\x16\x01\xf6\x04\x19\x88\xc9\x55\x01\x5b\xfc\xa1\x4e\x45\x20\xdb\x5a\x4a\xa3\x08\xe6\x12\x39\xeb\x99\xd3\xa7\xde\x5b\xc6\xa9\xc5\x44\x15\x98\x52\x42\x66\x51\x55\x17\xd9\xd2\x64\x93\xca\x27\x1a\xe7\x3f\xdf\x5e\xd8\x1a\x7e\x09\x01\xf7\xac\x4b\x75\xe1\x81\x5c\x7b\xd0\x1b\xeb\x41\x13\xe9\xf7\x7c\x60\x3e\xb6\x1b\x87\x94\x54\x29\x9e\x3b\xd0\xfb\xf3\xc9\x81\x76\x3e\x80\x62\x31\x54\xdb\x25\x50\xb7\xde\x7b\x6f\x83\x6a\x5b\x5b\xcd\x15\x65\xa9\xac\xe6\x3e\xb6\xcf\x22\x5f\x1e\xdb\x8b\x6d\xf7\x9f\xd5\xda\x7e\xfb\xac\xf1\x77\xd5\xda\xee\xbc\x90\x4c\x42\x47\xf1\x99\xfb\xc6\x83\xea\x30\x47\x15\x92\x32\x75\xb3\xb2\xc0\x04\xb3\xed\xe6\x69\xe6\x17\x69\xcf\x69\x86\x1b\x99\xe6\x61\x7a\x4a\x96\xdf\x99\x60\x83\xd6\x7e\x89\x8f\x92\x27\xbc\xb7\xbb\x22\xb2\x05\x5e\x98\xd2\xdf\xdd\x7f\x7e\x5c\xde\xc6\xfe\x06\xf3\xbf\xbb\x71\xab\xfe\xf8\xe5\xfe\xee\xf3\x66\x94\xca\x0d\x03\x28\xa0\x2f\x81\x9a\xa6\x13\x70\x81\x34\xc0\xca\x80\x7d\x1b\xa4\x02\xa6\x0a\xbe\xd9\x1e\x15\x85\xb5\x19\x84\x48\xd5\xec\x84\x18\x6c\x63\xcf\x7d\x38\x99\xea\xb0\xb8\xd9\x83\xab\x87\x74\x82\xcf\xfd\xf5\x2c\x72\xa6\x5d\x74\xce\xd6\xba\xc9\x77\x60\xe5\x2e\xbc\x14\xdb\xaf\x02\xc9\xdf\x94\xe1\x2f\xe9\xa4\x5e\xfc\x35\x84\x66\x02\x32\x95\xa8\x3f\xd3\x94\x14\x79\x20\xd0\x95\x69\x19\xba\x1c\xd4\xc1\x4b\x50\xa8\x70\x32\x3c\x74\x02\x94\x34\x58\x50\xe5\x15\x24\x4a\xef\x32\xdc\xb9\xaf\xdd\x86\x22\x2c\x00\x04\xa5\x29\xad\x73\x94\x85\x0e\x11\xeb\x6c\x2b\xad\x19\x7a\xe7\x54\x63\x09\x23\x98\x9b\xe5\xbe\x91\x27\xb6\xaf\xb6\x4d\xf4\x1c\x97\xde\x4f\x0c\x50\xe2\x0e\xdd\x7f\x33\x47\x1b\x0b\x5d\x8b\x63\xbf\x46\x32\x51\xca\x61\xad\xc5\x7e\xb9\x4f\xbb\x2d\x09\x08\x61\x89\x5b\x2f\x99\xa4\x23\x3f\x09\x56\x5a\x8b\x45\x29\x19\xc6\xd9\x29\x78\x0a\x0c\xc8\xb3\x92\x0b\x64\x91\x32\xd4\x28\x6c\x88\x14\x25\x3c\x0e\x12\xd0\x31\xf0\x6d\xe3\x30\x32\x95\x6a\x94\xe6\xc1\xd9\xba\x06\x1e\xd5\x07\xef\xf3\xaa\x60\x54\x8a\xd1\x58\x73\x62\x94\x11\xc1\x04\x46\x16\x62\xca\x18\x61\x18\x5b\x66\x45\xb3\xe6\x57\xf9\x13\xd9\xb7\xbb\x2c\xf9\x93\xcb\x0c\xeb\x37\xd5\xad\xcb\x70\x57\xfa\xd2\x14\xc7\x82\x7b\x2c\x47\xae\x06\x6a\x55\x57\x7a\x93\xd9\xbc\xf0\xad\xa8\xad\xd0\xea\x10\x72\x5a\x82\x24\x08\xc0\x32\x6e\x08\x2b\x04\x86\x28\x3b\xe4\x83\x1e\x1c\x28\x21\x4e\x07\xaf\xa5\x75\xc5\x70\x50\x87\x7e\x97\x41\x42\x8e\xce\xb9\x43\x6f\xe4\x04\xa8\xd4\xae\x9b\xc5\x50\xb8\xe2\x08\x6c\x80\x61\x10\x00\x81\x16\xe4\x4e\xb0\xd9\x72\x65\x0c\x0f\x93\xae\x6c\x6b\x96\x35\x44\x62\x1f\x67\xf1\x2b\x8f\x31\x57\xbf\xc4\xfa\x71\xa5\xbc\x7b\x78\x7c\x25\xf5\x77\x9d\x02\xb9\x7e\xc0\x6f\x7a\x1f\x3f\xbc\xf1\xf4\x30\xa6\x30\xc8\xc3\x12\xe0\xb7\xbd\xeb\x42\x2f\x40\xde\x06\x91\xc2\xc0\x10\x18\xe7\x1a\x54\xb0\xf0\x30\xed\xc3\x80\xd5\x71\x54\xa7\xe3\x29\x50\x0a\xc4\xb1\xab\x39\x0d\x6d\x7a\xd0\x28\x78\x84\xec\x2e\x31\x45\xae\x8d\xc6\x4e\x1e\xa6\xe9\x28\x0d\xb5\x46\xe6\x6e\x2e\x31\x29\xb9\xa9\x24\x15\x5a\x31\x8b\x1d\x64\x14\x72\x7e\x64\x86\xe2\x72\x7d\x1e\xf2\x89\xed\xdd\xb6\x4b\xde\xc5\x4c\x11\x25\x09\xf8\xc5\xe6\xdb\x9f\x83\x77\x0f\xaf\x0c\xc6\x6e\xa5\x25\xfb\x74\xf7\xb0\xe5\x56\x0b\x81\x61\x8e\x31\xd2\xae\x77\x69\xbe\x29\x28\x77\x82\x95\x52\xd2\xf9\x08\x8e\xa1\x37\xc6\xfb\x6d\x67\x83\xe9\x1b\x29\x73\x57\x70\x37\x00\xfb\x35\xdf\x69\xfb\xf5\x28\x79\xee\x0b\xba\x2d\xda\xb9\x91\x69\x1b\x08\xc0\x97\xf7\x45\xf6\x6a\x97\xbc\xd4\x33\x7b\xf3\x37\x8d\xff\x7d\xb7\x7b\xbc\x7f\xb7\xe4\xb0\xab\x44\xa9\x2d\x4a\x00\x0b\x54\x61\x08\xaa\xc0\x81\x0a\x2e\x1e\xcd\x59\x78\x88\xd5\x21\x4d\x42\x1d\x73\x0f\x1e\xea\x5d\x02\x05\x63\x0c\x09\xe5\x5b\xd7\xda\xa3\x93\x1b\x4d\x89\x06\xc9\xb1\x6d\x43\xdb\xb6\xa1\x3e\x26\xbb\xf4\x10\x67\xb1\x93\xe4\xef\x25\xbf\x4d\x7e\x97\xfc\xe3\x98\x53\xc7\x95\x7b\x23\xa6\xfc\x3b\xe0\xe1\xb7\x9b\x48\x5a\xbe\xff\x78\xf7\xe3\xe6\xa7\xc7\x37\xfb\x77\xdf\xa2\xe2\xde\x1c\x54\xbf\xe4\x08\xa7\x40\x89\x2d\x49\x61\x0a\xc9\x87\x26\x20\x60\x61\x38\x8d\x34\xe5\x28\x3f\x1c\x37\xad\x9f\xa1\xf7\xd7\xf4\x7a\x97\xe8\x32\x67\xc4\x70\xe9\x91\x15\x80\xb4\x4c\xe3\x92\xa6\xac\x7c\x4a\x96\xbc\x54\x86\x62\x56\x84\xa4\x6e\x52\xa1\x89\x1c\x73\x29\x5d\x9e\x69\xc4\xa1\x5f\xa3\xcf\x7f\xb8\x76\x36\xee\x9e\x99\x2c\x3f\x7d\xfe\x72\x49\x83\x2e\xe9\x0f\xf8\xb4\x4a\xab\xc7\x1f\xb6\xa6\xc2\x29\x0a\x35\x38\x06\x54\xcd\x70\xd4\x2c\xf4\x40\xc2\x13\xc0\x59\x1e\x1a\x30\x64\x39\x60\xe7\x71\x40\x61\x02\x35\x02\x55\x28\x89\x00\xe5\xae\xc0\x62\xe6\x83\x0f\x13\xc8\xbd\xd4\x69\x8d\x43\x4b\x08\x21\x26\x28\xe7\x5c\x18\xf5\x8a\xc7\x7a\x93\xea\xa8\x4f\xdf\xbe\x88\x1f\xef\x6f\x73\xec\xdf\x74\x0f\x1f\x5f\xa8\xc1\xa6\xd3\xb6\xfc\x3a\xf8\x88\xbb\x6b\x01\x9e\xf3\xdb\x19\x0e\xdd\xae\x08\x7d\x15\x6c\x1e\x3a\x0d\xf2\x6d\x3b\x1b\xa0\x8d\x31\xc1\x29\xa5\x42\xe2\x5c\x28\xc1\x10\x27\x14\xd7\x3d\xcc\xf6\x7c\x97\x24\x7f\x11\x11\x15\x6b\x84\xf4\x0a\x4c\xf0\x8b\xbc\xc3\xcf\xaa\x68\x2f\x5d\xe7\x66\x09\x70\x13\x93\x17\x6a\x1d\xaf\x23\xe1\x00\x10\xe3\x25\x2a\x69\x09\x6b\x57\x39\x80\x42\x05\x44\x0b\xb1\xb2\xdb\xc4\x31\xc5\x59\xc9\x39\x9d\xac\xdd\x0e\x10\xe3\xc5\x5f\x5b\x13\x38\x8f\x73\x33\x20\x9b\xdb\x94\x06\x94\x32\x63\x2b\x86\xb9\x3f\x7e\x85\x8a\x97\x1e\xf2\x2d\x3c\xaf\xcf\x56\x3c\xc9\x58\x27\xfd\xe9\x82\xd1\xfc\xfd\xda\x13\x79\xc1\x75\x14\xc7\xcc\x5e\x17\x4d\xee\xef\x62\x8c\xb7\xfb\xf8\x8f\xc1\xc7\x87\xf5\xc3\xae\x45\xc5\xfb\xc7\xeb\xf7\xb4\x06\x2d\x82\xbe\x28\x53\x12\x5c\x03\x0a\xca\x69\x90\x58\x1c\x69\xee\x0a\x1d\xfa\xa3\x08\x5a\xb0\xa9\x0a\xed\xc6\x8a\x92\x41\xa5\xcc\x12\x32\x4d\x13\xb0\x20\x99\x2f\xdf\xb7\x86\x32\x8c\x90\xa9\x85\x2b\xd1\x3c\x69\x58\x60\x83\x5a\x4e\x78\x0d\x26\xe8\x85\x1f\x69\xc1\xb0\xe3\x4a\x3d\x25\x5a\xeb\xe0\x57\xcc\x79\x1a\x7b\x91\x8b\x5f\xfe\x4d\xf2\x39\x6a\x30\xff\x11\x83\xfa\x23\xb8\x7f\xbc\x42\xd8\x7e\xc6\x5f\xf6\xc6\xf3\x40\xd3\x6c\x79\xef\x90\x85\xea\xe0\xba\x30\x09\x90\x34\xa1\x02\x63\x68\x28\x38\xcc\x2e\x65\x4a\xcc\xc7\x4d\x66\xfc\x12\x46\x09\xce\x59\x41\x04\x9d\x9b\x5d\xa6\x91\xb2\x86\x78\xdd\x0d\xc7\x83\xd4\xdc\x58\x51\xda\xe2\x8c\x18\xc6\xc6\x71\x9a\xdb\x86\x50\x68\x61\xe1\x93\x4d\xca\x9f\xe8\x5e\x6c\xa7\xe4\xef\xbf\xb0\x4a\xaf\xe8\x79\xa3\x9a\xf7\xb2\xdd\xd7\xb5\x72\xc1\xca\x2f\x86\x72\x83\x6c\x5e\x00\x75\x18\xc6\x2c\xf7\x5a\x49\x29\x1b\x03\x60\x19\x26\x50\x30\x84\x8d\xdd\x4a\xdf\x7b\xdf\xf7\xdb\x09\x52\xea\xc2\xd1\x31\xaa\x9d\xb5\x72\xb0\x62\x02\xcc\x01\xa4\xb8\x38\xf0\xaf\x59\x55\xef\x92\x33\xde\xc4\xfa\x59\xcc\xc5\xea\xed\x98\xfc\xf0\x4a\x8d\xe2\xc5\xd0\xd4\x77\x6f\x1f\x3e\xac\xab\x7b\xad\x8e\xdf\x3d\xdc\xad\x95\x82\xd4\x0f\xbe\x6d\x25\x17\x08\x79\xa6\xd4\x91\xf7\xa9\xe8\x3c\xc8\x8e\xaa\x66\x56\x7b\xee\xe5\x41\xfa\xcd\x74\x3a\xb9\xe5\xd7\x04\xcf\x24\xf5\xad\x93\x20\x01\xdc\x9d\x4e\x2e\xe8\xb6\xaa\x00\x39\x8f\xe9\x29\x9c\x9a\x25\x1a\xba\xcc\x7e\xb0\x3d\xdf\xd6\x97\x9a\xf6\x5f\x24\x9f\x62\x0d\xf5\xd5\x8e\x4a\x57\x7e\xcb\x0b\x5f\xce\xdf\xf4\xbb\x77\xdb\x8e\x52\x2c\xa0\x82\x70\x2c\xa5\xb5\x6e\x18\x86\x61\x9b\x50\x8a\x79\x29\x20\x3c\x15\xcc\xaa\x38\xc7\xbe\xad\xbf\x0a\xce\x4a\x5b\xa0\x25\xe4\x1b\x18\x20\xc0\xa6\x24\xf8\x61\x3e\x0c\x60\xfc\x2a\x56\x00\x1e\x20\xa1\x3b\x32\x40\x81\xbe\xfe\x2e\x6a\x94\x44\x3e\x69\xba\x1d\x92\x5d\xf2\xfd\xad\x13\x1a\x11\x37\xaf\x3c\xde\xfb\x4f\xdf\xea\xa9\x46\x4a\xfe\x0f\xcb\x93\x75\x1c\x3a\xc8\x00\x4f\x47\xc1\x31\x87\x02\xe3\xb9\xa5\x36\x16\x4d\x34\x97\xd2\x0a\x2b\x5a\x39\x81\x62\x1e\xaa\x6a\x3b\x48\x83\x8c\xca\xbf\x6a\x25\x0b\x5f\xc8\xcd\x91\x1d\x1c\x35\x5a\x2b\x1e\x30\x98\x6a\xab\xeb\xde\x35\x5f\xfd\xca\x4b\x87\x2f\x75\x84\xdf\x5e\xad\xf8\x65\x5e\xea\xee\xd3\x45\x5f\xf8\xa2\x93\xbd\xd6\x73\x2f\xc0\xbf\x37\xfb\x87\xc5\xbc\x6f\x13\x57\x94\xa0\xc7\x04\x10\x1b\xb2\x0a\x18\x16\x68\xd3\x05\x25\x00\xaf\x83\xb4\xe0\x48\x51\x30\xca\xaa\x53\xda\x9f\x32\x58\xa1\x3c\x9c\x76\x79\x89\xb1\xd1\x3c\x70\x77\x60\x95\x02\x28\xb4\xcc\xd1\xa3\x03\xb5\x10\x9a\x49\x3f\x0b\x50\x78\xa3\xea\x30\x26\x6f\xe2\x7b\xab\x76\xc5\x65\x52\xe4\xcf\x93\x7f\xb4\x56\x9a\x97\xc5\xf6\xb2\xda\x79\xc1\x7c\x3c\xfc\x12\x9e\x36\xa2\x52\xd3\x23\xe8\xfd\x3a\x25\x60\xdb\x0e\x14\x3c\xb4\x4f\x49\x98\x82\x67\x00\xf7\x8d\x92\x60\x7c\x46\xd4\xae\x44\xd3\xf1\x6c\xe6\xaa\x3d\xc8\xad\x37\x66\x36\x42\xd6\x12\x43\x8f\xa5\x42\xbe\x24\xca\x1a\x71\xb1\xff\x8b\xa1\x29\x25\x63\xf2\x72\x2f\xf5\x2e\x49\xde\xc6\xe8\xed\x97\x35\x0b\x6f\x95\xa2\xd5\xa2\xbe\x08\x44\x2f\xb8\xc9\x54\x03\x58\x01\x5a\x01\x16\x9a\x2a\xb4\x55\xe8\x77\x49\x75\x66\x95\x01\x24\xcf\xaa\x2c\x07\x63\xa6\xad\x54\x85\x96\x34\x2f\x83\xd7\x01\x33\xa0\x65\x98\xb6\xda\x5a\x6b\x9d\x31\xc6\x34\xa1\x6b\xea\xc5\x2f\x30\x51\x32\x12\x68\x5f\xb8\x82\x81\x32\x68\xed\x04\xc8\xd7\xd9\xf9\xe9\x49\xec\xeb\xed\x94\x6c\x92\x5f\x5d\x98\x2e\xef\xa3\x42\xfd\x8d\x6e\xf4\x5a\x93\x48\x9f\x59\x1f\xde\x2f\xef\x70\x9d\xfa\xd8\xc9\xaa\x9a\x6b\x2b\xb9\x36\x5b\x68\x98\x67\x2a\x60\xc7\x84\xd3\x81\x5b\x25\xb4\xdd\x4a\x7b\x9a\x1b\x9e\xd2\x59\x6a\xd5\xb9\xe3\x76\x3a\x1f\x36\x25\x57\x4a\x73\x75\x18\xc8\xd8\x12\x14\xfa\x03\x1b\x38\xd7\xca\xf0\x81\x07\xda\xd8\x06\x60\x3e\x0d\xf2\x18\xf7\xcc\x5a\x03\xea\x22\xcb\xd7\x85\x15\xf3\xf1\xb9\xbb\x70\xff\xe5\xe1\xf1\x13\x78\xbc\xdf\x6f\xde\x45\x3c\xcc\x3f\x4f\xef\xdf\x6d\xc6\xd0\x6e\xab\x99\x16\x29\x1d\xfe\xd0\x00\x56\x0e\xa7\x94\x06\x52\x36\xd5\x36\xab\x66\xbc\x25\xd6\xba\xd0\x59\xdb\xd8\xd0\x35\xcd\x0c\x79\x0a\xe7\x81\xb9\xa6\x49\xd6\xdc\xcd\xec\x7d\x9c\x2f\xff\x7b\x91\xf9\xee\xca\x2d\x78\x55\x2c\x7a\xc9\x73\xfd\x2a\xa5\x48\x2b\x30\x56\x60\x0a\x79\xaa\xfe\x60\x53\x19\x0a\xeb\xf2\x42\x70\x83\x09\x11\xfa\xb8\xc9\x5c\x5e\x28\xa9\x29\x43\x4c\x55\xa0\xda\xc8\xb3\xf7\x93\xf7\xd3\xa6\x2e\xb5\xb2\x8d\xb1\xda\x6b\x05\x32\xc0\x4a\xab\x4c\x65\x8c\xb6\x4a\x9d\x92\x5d\x7c\x3e\x7e\x97\xc7\x67\xb3\xf2\xf1\xbc\x62\x31\x79\xa6\x29\xda\xff\xa2\x9a\xf4\xfa\xdc\x52\x93\xe6\x31\xa7\x4f\x93\xaf\x16\xf4\xf3\x94\x52\x21\x0d\xd3\x7d\x85\xcd\x81\x64\x75\xae\x43\xdf\x9b\x8d\xd0\xac\xa2\xfa\xcc\x3d\x15\x4e\x6e\x79\xdb\x46\x3f\x11\x24\xd7\x5a\xeb\x22\x98\xb2\x44\x1a\x35\x82\x72\xd0\xb4\x3d\x3d\x1e\x20\x7e\x4a\x6a\xd6\xc5\xfb\x56\x3c\xd1\x18\xeb\xfc\x49\xdc\x9f\x51\xef\xe5\x85\x8e\xeb\xcf\x24\xa2\x63\xe3\x74\x9d\x90\xf9\x74\xf7\xf0\xe6\xe0\x99\x8a\x4c\xa0\x24\x94\xb1\x0b\x1a\xc6\x4a\x0a\xc6\xbd\xac\xe5\xa4\xc2\x08\x90\x90\x18\x10\x70\xf4\x7e\x97\x7c\x45\xab\xca\xcb\xb6\x72\xa8\x73\x72\xb9\x55\x7c\x76\xa9\x1d\x5a\x33\x01\xe4\x9a\x2c\xf7\xa5\x3a\xb7\xd7\x18\x90\xed\xd9\x0e\x27\x9b\xdb\x6c\x46\xec\x9c\xec\x9f\xb9\x87\xef\xbf\xad\x90\x5e\x70\x55\xdf\x9a\x90\x37\x49\xcf\xfb\xf3\x31\x2d\x7c\x0a\xe7\x1e\x4c\x42\x10\x5e\x6a\x8c\x42\xed\xc3\xa1\x02\xc3\x3c\xf6\x17\x14\x19\x3f\x1f\xaf\x67\x3b\xac\x94\xb6\xc7\xa3\xd3\xe7\x8e\x8b\xc2\x15\x54\x47\x9a\xb9\x66\x33\xe9\xd8\x58\x08\x8b\xf9\x78\x81\x93\xb9\x8b\x38\x94\x15\x7d\xfa\x3c\xa3\xf8\xfe\xcd\x7e\x49\xb8\x5f\x6a\xff\x82\x4b\xba\x7d\x31\xd4\x37\x0b\xf8\x36\x92\x29\xef\x4e\xad\xb6\x25\x0a\x24\x64\xe8\x14\x19\x33\x0a\x80\x10\x16\xdd\x41\xd7\x43\x20\xda\x8d\x6a\x00\x50\x0b\x21\x25\xa0\x75\x05\x71\x2a\x4c\x3b\x82\x82\x84\x3a\x4c\x4f\x49\xa8\x14\x60\x4a\x55\x8d\xd8\x0e\x55\xc3\x08\x5e\x96\xe5\x09\x1d\x64\x81\x31\x0a\x47\x61\xb5\x35\x98\x78\xab\xd4\xec\x99\x24\x58\x57\x23\x24\xc4\x7a\xc5\x91\x27\xc6\x50\x4b\x80\xcc\x24\x13\x22\xd6\x85\xa6\x27\xb2\x47\xbb\xec\xc2\xa6\xfc\xdb\x58\x9b\xf9\xf4\x2d\x8a\xf8\xe1\xee\x1e\xbc\x20\x16\xbd\x91\xf5\x35\x15\x18\x94\xa2\x12\x5a\xca\xcf\x83\x03\x87\x70\xbc\x22\x0d\x37\x85\x55\x4a\x99\x19\x0a\x61\x98\xda\x65\x41\x9f\xcd\x5a\x20\xb2\xc1\x6f\x71\x24\xa2\x76\x9b\x9c\x79\x2e\xa5\x60\x5a\x28\xb1\xfa\x3a\x18\x6d\x4a\x73\x99\x43\xba\xd4\x3b\xee\x6e\x95\xb1\x8b\x8e\xfe\xdb\xfb\xbb\x7b\xb0\x8d\x2d\x4a\xbd\x3d\xce\x4b\x3a\x35\x55\xe7\xae\x02\x63\x1b\x0e\x02\x54\xed\x7c\x3a\x6c\xf0\xb9\x4b\x35\xc8\x06\xd5\x9f\xb6\x8d\xcb\xf3\xf9\x38\x6b\xc6\x52\x0b\x4c\xe3\xed\xe1\x78\xce\x41\x96\x7a\x77\xd0\x9d\x4d\x52\x30\xc6\xbd\x9c\xc5\xfe\xfb\xf3\x2e\x5e\x79\x0b\xa2\xc0\xea\xda\xf4\xbd\x72\xd9\xde\xff\xf6\xa7\x8f\xfb\x8f\x1f\xee\x1e\x52\xf0\x31\x79\x7b\xd9\xe6\xcb\xff\x9b\xdf\xe0\xf9\xd8\x7a\x7e\x18\xa7\x8e\x4f\x61\x00\x70\xe2\xe1\x14\xea\xdc\x4f\xc4\x65\x26\x74\x9d\xce\x3a\x06\x72\x9d\x05\xc4\x80\xcd\x9e\x92\x0d\x63\xc8\x42\xba\xcd\x4f\x27\x3b\x70\xa5\x8c\x50\xd2\x2a\x2f\x9d\x6a\x44\x67\x4b\xa2\x51\x23\x31\x21\x86\x6d\xca\x39\x09\xbd\x5d\xde\x35\x30\x94\x31\x46\x93\x5d\xda\x2d\x7b\x7b\x7b\x88\x15\xbd\x6b\x4e\xba\x06\x07\xbf\xb4\x73\xae\x9d\x9e\xb7\x97\xa6\xdd\x6d\xc8\x74\xda\x16\xcd\x11\x1c\xa5\x60\x0a\x7a\x8a\x83\x73\xa1\xf2\xa0\xc2\xd4\x32\xe2\xf4\x79\x54\x11\x7a\x39\x2d\x09\x74\xc8\x9f\xcf\xb7\x07\xe9\xe5\xb9\xe1\x22\x77\x39\x55\x71\x16\xaa\xd9\xe6\x18\x33\x8c\x09\x0b\x89\xf7\x3e\x30\xef\x7d\x02\x56\x5f\xb1\x2b\x56\x6c\xc3\xa5\xe3\x79\xa3\x89\xfe\xf4\x0c\x10\xfd\xc5\xc0\xfe\xf1\xfe\xf1\xcb\x4a\xb3\xf8\x90\x8e\x40\x51\x31\xf3\x34\x0f\x1d\xc0\x2e\x8e\x3c\x5b\xe5\x78\x94\xb8\x22\x14\x60\x13\x59\xf0\x04\x17\xa2\x60\x92\xce\x3a\xb5\xc7\x30\x8c\xa1\x27\x95\xb5\xa9\x47\xd4\x38\xa3\xb5\x71\xae\x45\xde\x18\x82\x9d\xe4\xcc\xd4\x84\x16\xb6\x28\x9c\xf1\xd6\x49\x4d\x48\x92\xc6\xfc\xd4\xee\xca\xe4\x6d\xdc\x11\x2b\xeb\xce\xfd\xbb\x24\x66\x20\xd1\xb1\xbc\x8d\x7e\xf6\x76\x6d\xf5\x36\x1b\x53\x71\x80\x4f\x56\xa4\x49\x18\xe6\x52\xa6\x16\x14\x01\x12\x0c\x6d\xe9\xc3\x89\x83\x0e\x08\xab\x00\x0f\xed\xb9\x92\x9b\x1c\x90\x50\x31\x4c\xa0\x45\x1b\xc3\xac\x19\xa9\x30\x41\x1a\x27\x00\x84\x84\x51\x3a\x8f\xca\x7a\x90\x51\x66\x43\x59\x39\x05\x0c\x2e\x28\x65\xec\xa2\x5b\xf6\x44\x23\x2e\x7e\x7d\xee\x8b\x2f\xfc\xe6\x79\x5f\x0d\xf9\xed\xd6\x6e\x6e\xb2\x2e\x9b\x8c\x51\xe1\xcb\x9a\xc2\xd9\x78\xca\xd5\x60\xc2\x04\x18\x2c\x6d\x5e\xa4\xfd\x79\x2c\xc9\x55\x9a\x7e\x83\xce\xc7\x95\xdf\xc5\x84\x26\x1d\x05\x53\x3d\x48\x9c\x10\x90\x32\xc7\x42\x6d\x83\xd6\x4b\x1c\x70\x78\x22\x7b\xba\xad\x92\xfc\xc6\xc9\xfe\x6d\x5d\x19\xdc\x44\xde\x1f\xef\xf7\x54\x29\xe9\xca\x96\xd3\x73\xe3\x41\x96\xca\xd9\x17\x8b\xff\x8b\x23\x35\xdb\xea\x2b\x65\x1c\x2e\xfb\x21\xfb\x8a\x76\x3c\x8c\xd6\x86\xcc\x4c\x31\xcf\x31\x4f\x3a\xda\x86\x5f\x47\x6e\xdd\x68\x50\x6f\xc3\x4c\x3f\xee\x5e\x6a\xa3\xc1\xa7\x24\x34\x3c\x35\xc3\x5c\x6c\x1a\x6e\xa7\x81\x86\xf1\xdc\x6d\x61\x80\x29\xfa\x5a\xa6\x45\xa0\x69\x6b\xb1\x95\x00\x3b\x5b\x49\xc2\xbc\xae\x97\x64\xcb\x01\x94\x24\x20\xe5\x4f\x66\x6f\xb7\x72\xe5\xdd\xbe\x88\xc8\x5c\x79\x96\xee\xef\xee\xd3\x6e\x6b\x42\x11\x19\xa2\xe0\x1f\x8e\x87\x0a\x64\x21\xdb\x4a\x1f\xac\x0f\x7c\x2d\xd9\x6c\xda\x8b\x46\x20\xdb\xab\xed\x94\xbc\xfb\x56\x69\xfd\xee\x61\xcd\x0c\x37\xad\x27\x9b\x65\x31\xd3\xb9\x5d\xee\x77\xb5\xc4\x6a\xd3\x76\x42\x95\xef\xfc\xe0\x16\x43\x59\x49\x71\x5a\xf3\x63\xb6\x17\xbb\x22\xf9\x55\x8c\x00\x6f\x45\xb0\xdd\xfb\xe4\x02\x07\x7b\xbb\xfa\xa3\x1f\xbf\x2c\xfb\xe4\xed\xaa\x8c\x91\xaa\x14\x96\xb0\xc2\x30\xcd\xbf\xe6\x1b\xe3\x82\x0d\x15\x40\x40\x60\xec\x2a\xe9\x4b\x18\xf2\x50\x50\x20\xc7\x53\x98\xe0\xd4\x38\xe3\xfb\x81\x6f\x39\x25\x98\x4b\xe7\x71\x48\xfa\x9c\x0a\x46\xfa\xa7\x84\x70\x26\x73\xd7\x0d\xa8\xb0\x1e\x94\x70\xf0\x05\x59\xed\x75\xc4\x6e\x2c\xb9\xf0\xdf\xbb\xa8\x00\xc5\x7b\x94\xee\x5f\x22\xb6\xde\xe5\xe0\xe3\xe7\xef\xee\x1e\x23\x74\xe0\x9a\x08\xa7\xa6\x76\x00\x67\x18\x59\xca\x73\x41\x51\x0e\xb3\x3a\x28\x51\x37\xd5\x76\x70\xbd\x73\x7d\xbf\x89\xa2\x7e\xe7\xaa\xd6\xa5\x2b\xd8\x31\xc5\x64\x46\x4f\x89\x56\xa0\x02\x3a\x07\xe5\x1f\x4e\x52\xed\xf2\xaf\xe3\xc6\xc5\xb5\xb1\xac\x41\xb9\xed\x2e\xda\x23\xcf\xad\x94\x48\x8b\x05\x96\x35\x91\xa4\x38\xba\x88\xaa\x4a\xe5\xd7\xd3\xe2\x1d\x36\xf4\x74\x9e\x8c\xde\x64\xa9\x9e\xdc\x9c\x01\x95\x6c\xe2\xdc\x28\xdb\x4e\xc9\x0f\xab\x2a\x66\xcc\xb5\xf2\x17\x1f\xe7\xee\x7e\x65\x14\xbe\xb6\x92\x37\xd6\x17\x70\xa3\x18\x39\x4a\x5f\x1e\x99\x2a\xd1\x79\xe2\x52\x35\x69\x1b\x0a\x1f\x45\x60\xb6\x53\xc9\xd8\x59\x75\x9e\x54\xc4\x74\xa9\x71\xc2\xd4\xa7\x90\xc9\x54\x04\x37\x25\x6b\x7d\x9f\xec\xab\xed\x29\x2a\x3e\xfd\x82\xc6\xdc\x8f\x2f\x81\x6c\x9d\x2b\xca\x4d\x12\x68\x9e\xe6\x21\x77\xc0\xf3\x60\x5b\x17\x32\x06\x46\x19\x8a\x34\x2b\x16\x23\x72\xd8\x9e\x20\x23\xfe\x60\x7d\xa8\x6d\x6d\x81\x0e\x6d\xeb\x6a\xc0\xbc\x3d\x38\x25\xc7\x18\xbb\xc3\x25\x96\xde\xfa\x97\x7a\x2d\x2b\x24\xe8\x25\x33\xef\x9b\x63\xf7\x07\x77\xac\xae\xdd\xe4\xe5\xd8\xfa\xaf\xda\xb9\xad\x0d\xfa\x34\xdb\xe5\x9f\x24\x4d\xd9\x13\xdf\xfb\x38\x83\xf7\x70\xe5\xf7\x7c\xbf\xac\xce\x74\xf7\xc3\x9f\x83\x7d\xf9\xe3\x4f\x0f\xbf\xdd\x7f\xfc\x3d\xf8\xf4\x97\xef\x7f\x5c\xe5\x47\xde\xf4\x2c\xb0\xd9\xa2\x34\x81\x14\x02\x5d\x07\xe4\x81\x03\x19\x0a\x2e\xf8\xae\x80\x07\xdd\x2a\x94\x17\xc0\xd5\xe7\x1e\xf4\x10\x6f\x27\x6b\x0a\xef\xb5\x31\x61\x38\xca\x1a\xdb\x83\x6e\x68\x56\x0f\x4e\x46\x5e\xb5\x18\x47\xfa\x1d\x4c\xfe\x24\xaa\x33\xfc\xfd\x6f\x34\x4f\xa2\x58\xdc\x8f\xbb\x88\xfa\x8d\xd8\xdf\x7f\x08\xb6\x63\x55\x94\x20\x03\x84\x87\x43\x18\x9f\x92\x30\x30\xd0\x00\x2c\x9e\x92\xa0\x39\xa8\x81\x93\xa1\x09\x19\x4f\xcb\xe5\xae\xda\x19\x2d\xd7\xfa\x1d\xc4\x65\xd9\x69\x6f\xc7\xd1\xd8\xa3\xd5\xa3\x31\xb1\x2c\xe6\x6d\x9b\xeb\x20\xb4\xe3\x63\x92\xa6\x2e\xda\x8e\x3e\xf2\x5f\x5d\x94\x9b\xae\xff\x7b\x77\x71\xc2\xcb\xe2\x04\x77\x0f\x77\xa9\x73\xfe\xe8\x4f\xbe\xef\xe7\xfe\xb8\x69\xbf\x36\x6e\x63\x4f\x9b\x95\xac\xf5\x52\x97\xf6\xf3\x31\x45\x33\x74\x1b\x19\x04\xa8\x42\xdc\x73\x29\xe8\x9f\xc4\xde\x6d\xc7\xe4\xee\x92\x0d\x7e\xb9\xfc\xd7\x97\x00\xe5\xe3\xe7\x2f\x57\xf2\x90\xd7\x43\x32\xa9\xf1\xc6\x1f\x8f\x5d\x11\xaa\x40\x4b\xce\xd2\xce\x37\x5e\x76\x63\xc9\x04\x5e\x82\xf2\xa6\x16\x9b\xf6\x6c\xf2\x6d\x15\x98\x9b\x5b\xe8\x18\xae\xb2\x7c\xdb\x06\x24\x8c\x75\x72\x3e\xc2\x82\x55\x78\x92\x4c\x45\xff\xe3\xe2\x6c\x44\x77\xa9\xf1\xac\x55\xa7\x8b\x7e\xeb\x65\xeb\x3d\x80\x88\x5f\xbc\xbb\x4f\x5d\x53\xa5\xb8\x3a\x1e\xab\xb9\xab\x1a\xc0\x62\xb2\x83\xe7\x6e\x33\x8c\xe3\x38\xfa\x73\x22\xc4\x36\x09\x3d\x80\xe7\x13\xa0\xcb\xe7\x1b\x22\x47\x60\x1e\xe3\x99\x67\x45\xce\x58\xac\x4e\x77\xcf\xfd\xb8\x8f\xd7\x68\xe6\xdd\x05\x09\xb6\x44\x85\xdb\xd6\x83\x11\x31\x85\xca\xd0\x02\x8f\xc2\xa9\x03\x05\x0d\x87\xbe\x0d\x93\x04\xd0\x18\x42\x95\x6c\x5b\x32\x93\x93\xb3\x72\xdd\x9f\xb2\xae\xad\x91\x8c\xd2\x70\x0a\xcd\x49\x12\xcf\xac\xe1\x8e\x71\x45\xa4\xae\x5c\xd5\x91\xa0\x43\xcf\x5b\x50\x74\x69\x19\x24\xc8\xa2\xbd\x51\x11\x5b\x90\xc5\xbc\xe5\x62\x25\x9e\x45\x5f\xef\xaf\xb0\xa3\xfb\xf2\x82\x49\x2e\x7f\x7a\xbc\x8b\x7c\x95\xef\xee\x37\xce\xe7\xc5\x06\x2a\x5f\x92\x52\x94\x18\xcd\xb8\x40\x69\x12\x38\x05\x05\xd0\x3c\xab\x4b\x4e\x02\x0e\x5a\x63\xdb\x81\x2a\x9c\x40\xb6\xcb\x10\xc6\x33\x3b\x15\x55\xd1\x80\x03\x66\x21\x0f\x23\x2c\xa8\xc5\x1d\x41\x54\xa7\x2d\x15\x53\xe8\x8f\xb1\x0e\xe8\x62\x0c\xbb\x4b\xfe\xf4\x36\x45\x7e\xdb\xcb\xcf\x7e\x6c\xdb\x0a\xe2\xb0\x08\x45\xca\x03\x03\x4d\x28\xb7\xd5\x3c\xc4\x1e\x37\xff\x43\xb3\xcb\x84\xe2\x52\x7e\xd5\x80\x78\x80\xbd\x0f\x9d\x0f\x87\x58\x87\x4a\x63\x5d\xaf\xde\xfa\xe4\x7d\x8c\x38\xd2\x77\xf9\x77\x9f\xfe\xf2\xcb\xfb\xf4\xe1\xb7\xe9\xdd\x5f\x7d\xb9\x32\x19\x82\xe7\x31\xf4\x2b\xb2\xe8\x4d\x9b\x43\x94\xe7\xb6\xb4\x5a\x67\xb3\xed\x6d\x97\x32\x43\x18\x27\x4e\x50\x6e\x0d\xe7\xca\x30\x8a\xb7\x3e\x74\x43\x68\x43\x3b\x96\xa1\x02\x04\x8c\xf5\x10\xf2\xe0\x42\x2d\x40\x06\x44\x6a\x42\x4f\x8f\x75\xdd\x90\x93\x91\xcc\xd7\x8d\x27\x5a\xbb\xf5\x7d\xe9\x27\x19\xfb\xca\x7f\x12\xab\x02\x97\xbd\x1f\x11\xff\x20\x62\xbf\x96\x87\x90\x5e\x1e\xc2\x8b\x6a\xce\x76\x34\x79\xb1\x58\x01\x16\x8e\x61\xe8\x43\x27\x40\x05\x9a\x00\x61\x0b\xb4\xc8\x2a\x24\x58\x10\x61\xe0\x9b\x6c\xb9\x25\xa2\x10\x02\x16\xbb\x82\x96\xe5\x64\x9d\x03\xf9\xa9\xd6\xd3\x92\xc2\xc1\x9c\xd7\xf8\x29\xc1\x90\xe8\xb4\x0a\x4d\x55\xfa\x12\x25\x69\x5a\x3e\xe1\xbd\xda\xea\xe4\x6f\x45\x9b\xf8\xee\x86\x56\x5c\x47\x71\xf3\x97\x0e\x65\x35\xf1\x7b\x75\x46\x93\x33\x62\x04\x79\x05\x6a\x51\x33\x5e\x4a\x41\xf3\x22\x4c\x45\xf0\x0a\xa0\x22\x9c\xb6\xda\x85\x22\xe8\x70\xe0\x2d\x80\xc7\x14\x07\x3c\x8e\xb3\x19\xf2\x2a\x27\x0a\xe8\xf9\xd4\xab\x16\xb4\x71\x1d\x2c\xfe\xe4\x90\x7c\x17\x3d\x72\x44\x7f\xbd\xd6\x07\xb8\x6c\xa3\x1b\xdf\xef\x0a\xb9\xc5\x64\x08\x27\xce\x83\xce\xb5\x13\x56\xd8\xcd\x50\x86\x61\x04\x05\x0b\x75\x18\xc7\x50\x31\x00\x3b\xa7\xb9\x1b\x06\x7c\x9e\xb6\x87\xd0\x33\xcb\xf8\xa1\xad\x89\x22\xd5\x38\x57\xe1\x78\x64\xa8\x22\x5a\xd1\x0a\x51\x6e\xb4\x97\x7a\xd5\xac\x4f\xa7\xd8\xbf\x1e\x2e\x3c\xf0\x3f\x7e\x78\xff\x66\xfb\x10\xa3\x97\x48\x79\xb4\xae\xa0\xcd\xfd\x95\x08\x69\xc9\x9d\xef\xd2\x29\x35\x80\x18\x15\xfa\x22\x2b\x40\x15\x34\x72\x28\x27\xb9\xe7\x95\x98\x48\x50\x8d\x83\xe3\x91\xa6\x79\x91\xfb\x76\xab\x72\x61\x20\xea\x2a\xf7\x94\x84\x93\xd3\x38\x18\xa0\x00\x9d\x4f\x98\x18\x49\xd9\x26\xa9\xda\x3c\x0b\x87\x64\x93\x8e\x4f\x6a\x5f\x6d\xd5\x85\x9d\x30\xce\x87\x7f\xff\xc3\xfd\x5f\x7e\x89\xb0\xfa\xeb\x02\xd9\xdd\xdf\xdd\x7f\xba\xbf\xbb\xdf\xe7\x67\x2d\x40\x39\x66\x5d\x51\xe6\xbe\x24\x68\x3e\x05\xb5\xa4\xb8\x03\x28\x7d\x64\xdb\x51\x33\x0b\x16\x96\x59\x9e\xa3\x81\x3f\x25\x04\x51\xb9\x65\x51\xee\x2b\x01\x69\x1d\xe3\x08\x9b\xfc\x36\xf2\xcc\xfc\xf8\x21\x8e\x93\xef\x7e\x06\x65\x4f\xde\x46\x58\xe5\xb6\x0c\x27\x02\x2a\x50\xcc\x72\xd3\x85\x21\xb4\xe9\x29\x53\x2d\x15\x99\x20\xac\xc0\x99\x3b\x04\xa1\x80\x6a\xdb\x2a\x0c\xe2\x94\x52\x67\x2b\x6b\x1a\x3d\xf3\x69\x49\xa8\x1b\x20\x03\x0c\x47\x0d\x72\x60\xc2\xb1\x33\xf5\x1a\xc3\xd2\xbd\xde\xca\xe4\x37\xcb\x0f\xbb\x8f\x9f\xbf\x7b\xfb\x78\x31\x02\x2f\xd7\xde\x96\xc3\x50\x9b\xa6\xcd\xc2\xb8\xed\xce\x63\xea\x54\xa3\x24\xb4\x9a\xe5\x65\x5a\x86\x6c\x30\x0a\x48\x40\x26\xef\xc3\x38\xeb\xa1\xf4\x25\x35\x40\xc5\x98\xc5\x3c\xd9\xbd\xdd\x8a\xe4\xd7\x6b\xbd\xe0\xd9\xba\x2c\xa1\xdd\x61\x33\x9d\x9b\x4d\x7d\xe6\x1b\xf5\x75\x3a\xa4\x38\x85\x3e\x28\x1f\x96\xd4\x6c\xf9\xdb\x2e\xce\xec\xd7\xc9\x7f\xb5\xd6\x32\x1f\x57\xc8\xc9\xa7\xbb\xfb\x37\x4d\x55\x9d\x8b\x58\x59\x15\x1b\xf1\x75\x34\x1b\x37\x67\x5b\xfa\xb5\x5d\xf1\xb5\x3c\xce\xc5\xe4\xf1\x33\xc5\x38\xe9\xfb\x74\xd5\x46\xde\xbf\xd9\xc6\x8e\xcb\xfe\xcd\xfe\x63\xb2\x2d\x3c\x44\x69\xa6\xe9\x09\xe4\x32\x9c\x4e\x56\x87\xc9\x93\xb4\x6d\x02\x13\xf8\xff\xa7\xec\x5f\x62\x25\xd7\xf5\xf5\x30\x9c\x54\xbd\x74\xce\xdf\x3e\x57\x7d\x7a\xf7\x6e\xd9\xfe\xdf\x6b\x2e\xaf\xdd\xbb\x79\xec\xeb\x7b\x99\xdb\xee\x6e\xc2\x76\x8e\x69\x38\x8e\x69\xf8\x11\x22\x89\x6d\x26\xb1\x63\x22\xd7\x86\x69\xc4\x89\x99\x04\x01\xe8\x51\x18\x20\x41\x88\x78\x10\x4e\x12\x08\xc8\x44\x40\x06\xd1\x50\x43\x0d\x35\xac\xa1\x86\x1a\xd6\xb0\x86\x35\xac\xbb\x7b\x89\x2b\x10\x55\xb5\x56\xad\xde\xfb\x38\x4e\x37\xea\xa1\x47\x75\x57\x89\x14\x7f\xaf\xef\xf7\x7d\xda\xc3\x72\x53\x10\x63\xaa\x22\xb6\x26\x9e\x42\x53\x43\xec\x75\x45\xea\x3e\x6b\x3a\x65\x34\x64\x8b\x8e\x88\x7e\xe4\xd9\x79\xcb\xc0\x9b\x64\x63\x17\xf0\xee\xee\xae\xc8\x9e\x53\xc1\xaf\x57\xd7\x4a\xcb\x32\x71\x3f\x7f\xbc\xcf\x48\x94\x19\x8b\xbe\x84\xbd\x69\x75\x40\x95\xe1\xac\x88\x98\x09\xef\x42\xe0\xac\xec\x8e\x65\xe5\xd7\xc7\x7d\x88\xe5\x61\x02\x71\x40\x01\x75\x99\xcc\xc0\x44\x9d\xb3\x75\x51\x5a\x4e\x3d\xda\x27\x6d\x9d\xea\x51\xef\xcc\xaa\x4a\xfd\xc2\x57\x1b\x7b\xd5\x5e\xbc\x84\x39\xb7\xca\x7a\x3b\x5d\xff\x60\xeb\x4d\x0f\x8b\x3f\xc2\xb0\xa8\x13\x9c\xf9\xfa\xa8\x62\x3d\x8e\x50\x1d\x26\x5e\x55\x59\x77\xd2\xb1\xd5\xb1\x53\x49\x47\x89\xef\x9a\xad\x07\xf7\x97\xee\xc6\x0b\x8e\xf2\xfb\xf7\xbf\x41\x1b\x28\xe5\x04\xdf\xdc\x7d\xff\x7e\xb7\xbd\x5f\xdd\x48\x2c\xad\xcb\x80\xa0\x83\xb5\xec\xdb\xe8\xb2\x7e\x62\x22\x08\x56\x0a\xc9\x27\x94\x1d\xa2\xda\x07\x9d\x99\xcc\xb5\xcd\x29\xcf\xa5\x3b\xc5\xde\x40\xb5\x22\x90\x41\xa0\x1f\x41\x1c\xb6\x5e\x14\xad\xa8\x30\x97\x36\xd4\x2a\x61\x11\x7d\xb0\x4c\x60\xdf\x39\x2e\x5c\x1e\xb9\xf4\xdc\x0a\x29\x8d\x31\xc9\xdf\x03\x73\x6c\x5e\xaf\x4c\xd2\x9c\xb9\x4f\xb6\x68\xfd\x76\xf7\xfd\x9f\xbf\xe8\xce\x5c\x92\x6e\x4f\xfe\xdf\xbb\x25\x19\xf7\x36\xf1\x79\xdf\x6d\x2c\x44\x27\x73\x8c\xa7\x09\xf8\x26\x8e\x12\xe6\xd0\x37\x84\xae\x8a\xea\x0c\x15\x34\x32\xaa\xa8\x62\x13\x73\x06\x5b\x88\x1b\xaf\xad\x81\x4e\xd4\x43\x7e\xb6\x13\x59\x19\xed\x5c\xd0\x86\x77\xd6\x6a\x86\x39\xab\x3b\xe7\x68\x25\x1a\xa7\x83\xd0\x52\x73\x6a\x7b\x69\x95\xf6\x00\x02\x0e\x87\x5d\xb7\xf5\x09\x67\xb5\xe4\xa1\x7f\x0b\x5e\x4a\x9a\xef\xee\xd6\x17\xc5\x88\xd4\xad\xf3\xdd\xeb\x94\x41\x7c\xbf\x61\xe3\x68\x19\x3f\x9d\xdd\x1a\x44\x36\x40\x34\x7f\x8f\x53\x04\xf1\x10\x07\x79\xee\xa2\xcf\x08\xa7\xc7\x33\x86\x78\x08\x75\x0b\x2d\xac\xdb\x2d\x6e\x4e\x56\x08\x54\x86\x10\x64\x5d\x9d\xce\x95\x77\x3e\x30\x56\xe4\x3e\xc0\x12\x9f\x5c\x41\x6b\x90\x81\xe3\xaa\xdc\xe1\xad\x4d\x78\xef\xa4\xce\xf3\xea\xdd\x0d\xbd\xec\x77\xbf\x82\x3f\x87\x5f\x55\x38\xee\x57\xdc\x9c\x63\x0f\x91\x70\x4e\x86\x12\x1d\x06\x0e\x15\x6c\x56\x34\x77\x15\x16\x48\x11\x46\xf3\x78\xcc\xe3\x68\x20\xc8\x0f\x5b\xeb\x34\x89\xde\x7a\xde\x1f\x18\x67\x86\xcb\x4c\xd1\x58\x3e\x82\xa2\x2e\x2a\x88\xa2\x3d\xd8\x21\x49\xe4\x80\x15\x18\x56\xe7\x5d\xb1\xd5\x69\xec\x5e\xcd\xdf\x26\x4b\x90\x9f\xd7\x4f\x7d\x7b\x5b\x17\x9a\xce\x0d\x53\x15\x64\x25\x42\x94\x8d\xa9\x74\xb3\xd5\x22\x76\xbd\x3d\x40\x30\x3e\x02\x79\x3e\xe4\xe3\x49\x9e\xc6\x8b\x06\xe6\x3a\xac\x8e\xcf\x7e\xe8\xd7\x5e\xe8\xc7\x0f\x9b\x4b\xd4\x0d\x69\x05\x5d\x68\xdb\x10\x5d\xb5\xdf\x67\x65\x22\x48\x74\xd0\xad\x0e\x5d\xdf\x87\x87\x36\x84\x95\x08\x61\x1f\x46\x00\x76\x60\x9f\xd5\x49\x23\x7d\xa9\xbb\xfc\x2e\x20\x09\x41\xfa\x23\x6d\xd4\x77\x6f\x9f\x43\x8c\x5f\xa5\xaa\xdb\x1f\x2c\x5e\xf8\x87\xef\xdf\xdf\x27\xd9\x9f\xd9\xbc\xdc\x7d\xbb\x9c\xb7\x87\x4d\x05\xab\xa8\x21\x7b\xe8\xa1\x8e\x72\x5b\xb0\x47\x10\x7b\x02\x09\xa4\x2c\x1e\x63\x4d\xa0\xf8\x82\x56\xac\xc9\x4b\xa3\xca\x68\x62\x89\x9d\x2d\xca\x10\x32\x34\x1d\x1a\xad\x8a\xfc\x11\x94\x9b\x74\xdb\x48\x0e\xf5\x16\x49\xe9\xb8\x73\x7c\xb4\x8d\x76\x52\xba\xce\x3a\x1d\x07\x84\x72\x8d\x4a\x9b\x13\x6c\x78\x3c\xe7\x18\xe1\x93\xec\xad\x9b\xef\x1d\xb8\x1a\xc0\x31\xe9\x27\xde\x5f\x63\xf5\x6b\x12\x6e\x01\x84\xbe\xf9\xe6\xed\x4d\xcc\xf0\xea\x6e\x0d\xea\x26\x7a\x68\xeb\xf9\x52\xf5\x75\xac\xcb\xa2\xa1\x79\x55\xd8\xb3\x15\xb1\x5b\x57\xb1\x82\x43\x38\x1e\x43\x24\xd0\x4e\xc7\x91\xe4\xc4\x93\x91\x33\x05\x73\xb0\x02\x3c\xe3\xbb\x31\x69\x35\x2e\x7a\xcf\x7f\x66\xf7\x66\xf1\x11\xd3\x4d\xfa\xea\x56\x8b\xf7\x05\xae\x2d\x65\xd2\xb6\xf7\xb7\xc0\xb6\xd4\xf4\xf1\xdd\xe7\x67\xbe\xb2\x25\x20\x58\x4a\x3c\x70\x4f\x68\xa7\x02\x74\xb0\x90\xcd\xe0\x11\x76\x1a\xfb\xbc\xd0\x46\x66\x78\xa5\xa3\x45\x25\xa7\xde\x28\x2e\x44\xab\x3a\x99\x17\xa5\x36\x54\x22\x25\x10\xe9\x4f\x0c\x16\x43\x91\x37\x3d\x1f\xaa\x12\x69\x2a\x64\x55\xc5\xe1\xe0\xa4\x15\x7e\x53\xe7\xfb\x58\x27\x38\x16\x2c\xa1\xc8\x85\xc7\xe5\xa4\x95\xe0\xa8\xeb\x31\xa3\x82\x89\x95\x75\xb8\x64\x82\x2a\xcd\xf0\x41\x1a\x0d\xf3\x5c\xeb\xaa\xca\x43\xc1\x39\xf1\xdc\xf1\x80\x90\xa1\x86\x6a\x84\x38\x2e\x0d\xb1\xa4\x1f\xd8\xbe\x03\x20\x5b\xe7\x10\xef\xfa\xad\xbe\x64\xef\xde\x5e\xc3\x87\xfb\x37\x2f\x1b\x19\x5f\xdd\xbd\xba\x46\x14\xef\x3f\xc1\xfb\x37\x1f\xd6\xa7\x40\x33\x2c\x0d\xe5\x65\x8b\xab\x91\xe6\xbe\x24\x38\x0e\x67\x01\x2b\x54\x96\x68\x36\x36\xa6\x86\xcc\xfb\xad\x26\x6e\xf2\x87\xc2\x9c\x71\xc1\x34\xa9\x29\x66\x3a\x3b\x44\x96\xd7\xb0\x71\x4a\x0e\xb1\xdb\xcf\x0b\x27\x85\x28\xe9\x29\xde\x2f\xdd\x04\x9f\x3e\x7e\xf8\x8a\xaf\x78\xb9\xd0\xf3\x5a\x75\xbf\x7b\xff\x69\x7d\xf6\x24\xe4\x21\x87\xe0\x11\xe4\x05\x14\xb1\x6e\x82\xb6\x9e\x3b\x13\x58\x6c\xa0\x29\xf2\x5e\x79\xb7\x2d\x48\xe5\x9b\xc6\xfb\xca\xf8\x76\xf4\xfb\x7a\x5f\xdb\xe6\xe4\x75\xbd\x17\xfb\xa5\x3f\x69\x33\x6e\xdd\xa5\xd2\xfe\x01\x7c\x06\x3c\xb1\xa3\x5e\xef\xac\xdd\xfb\xa7\x68\xe2\x6e\xf3\xf6\x05\x6f\xf0\x22\x20\xf7\xe1\xcd\xea\x26\xa1\xb8\xf9\x3a\xdb\xf8\xfa\x43\x22\x52\x4e\x94\x2e\x09\xe0\x7d\xbf\xea\x16\x62\x9e\x8a\x1b\x32\x8d\xde\x79\x58\x40\x5c\x0c\x4a\xe2\xdc\xe6\xac\xf3\x92\x97\xca\x8d\x73\x50\x5a\x3c\x0b\xa6\x0c\x5c\x94\x18\x31\x84\xa2\xb5\x15\x46\x12\x15\xa8\x2c\x14\x42\x5a\xeb\x6d\x12\x3f\x69\x98\x9a\xea\x98\x47\xcb\x61\x80\xfb\xac\x6d\x34\x29\x70\xa1\x90\xe5\x84\x95\x85\x2e\x15\x8f\xbd\x62\x8f\x40\x8a\x53\xe4\x17\x01\x25\x16\x8b\x4c\x3c\x02\x85\x19\xe7\x0c\x69\xdd\x75\x8b\xe6\x0e\x79\xa4\x97\xf5\xa6\x4c\x99\xb4\x67\x6d\x80\x7f\x00\xfe\x51\x62\x82\xfa\x6a\xe5\x79\x42\x6d\xbf\x7d\xb9\xf3\x6e\x73\x59\x00\x5f\x98\xef\x6b\xf3\xfe\xe6\x52\x25\xfe\x69\x25\xd4\xac\xca\x68\xc8\xc8\x34\xc0\xe3\x97\x1a\x1e\xa7\x7d\xb9\x01\x98\x6b\x5c\x7e\xa9\xaa\x95\x8d\x4d\x86\xbe\x88\x0c\x44\x53\x6f\xd0\x0f\x87\x4c\xc0\x2e\x38\xc7\x0c\xa7\x25\x17\x28\xf2\xe9\x38\x07\x91\x6e\x18\x32\x4d\x91\x41\x64\xda\x5b\xad\x8d\xcd\x86\x39\xdc\x14\xf0\x64\xb9\x63\x66\x1a\x44\x59\x95\x7c\x4b\x19\x33\x4c\x6b\x76\xd4\x4a\x08\x42\x98\x5e\x36\x24\x63\xa6\x91\xbc\x70\x25\x0b\x26\x56\xba\x2a\x29\x65\x94\x8e\xbc\xd1\xca\x3a\x5b\xb1\xda\x22\xe3\x84\x37\xcc\x39\x12\x16\x8e\xf9\x94\x0b\x37\x5b\x9b\x98\x1d\xff\x00\x7c\x02\xff\x31\xf8\x87\x40\x3d\x63\xad\x3f\x26\x11\xbf\xaf\x10\x83\xaf\xae\x9c\x3f\xef\x3f\xdf\x6d\xee\xbe\xd9\xbd\xb9\x7b\x73\x95\xd2\x79\x31\x9d\x16\xca\xad\xbb\x8f\x0b\x68\xfe\xfe\x15\xfc\xfe\xfd\xe7\xfb\xb7\xdb\xdd\xec\x7c\x65\x63\x05\xe5\x1c\x25\x47\x40\x31\xdc\x47\x94\xd6\xf6\xf9\x71\xf8\xd2\x61\xac\x7a\xe5\xd1\x99\xf3\xe9\x9c\xa1\xd8\xe6\xd7\x9c\xce\x6a\x50\x92\x50\x24\x31\x89\xc7\x60\x24\x26\xd3\x89\x8b\x20\xcf\x61\x55\x72\x41\xcf\x9c\x32\x32\xdf\x5d\x5b\xe1\xdb\xd6\xc7\x33\x65\x56\x6a\xa9\x85\x81\x16\x23\x5d\x1d\x11\xe3\xe4\x94\xe7\xbc\x97\xb2\x13\xa2\x89\x85\x90\xa5\x2b\x18\x94\x52\x2b\x8c\x0e\x7b\xa2\xa4\x9e\x8e\x59\x88\x23\xc5\x82\x70\xda\xca\xa4\x39\xeb\xe1\xb8\xab\xb7\x12\xfc\x0a\xfc\x1a\x08\xa0\xc0\xbf\x04\xff\xe3\xb5\xcb\xf4\xb2\x0a\xff\x14\x85\xc5\x85\x9a\x65\xe1\x46\xfb\x9a\x5b\xec\xee\x45\x8d\x3d\x71\x8c\xbd\x7b\x7b\x03\x3b\xfe\xf6\xed\xa7\xd7\x2f\xb7\xdf\xfd\xe8\x03\xd9\xb0\xae\x22\x80\xb4\xe6\x6d\xc3\x8b\x52\xeb\x74\x65\x44\xec\x43\xec\x83\xc0\xbd\x67\x02\x16\xd3\x79\xea\xe1\x29\xee\x4b\x68\xb1\xb5\x5a\x95\x81\x4b\x14\x3d\x83\x38\xd6\xab\x83\x44\x08\x21\x5e\x22\x82\x39\xc1\x42\x60\x04\x4f\x92\x52\x4e\xaf\xdb\x25\x42\x62\xde\xc6\xe4\xb2\x1d\xd5\x8f\x3e\xb2\x95\xbe\xa1\x8a\x48\x53\xe4\x53\xe0\xbc\x30\x05\xcd\xf0\x42\x41\xb8\x02\x85\xc1\x52\x93\xc6\x46\xe5\xa3\xed\xcb\x50\x42\x02\xab\x10\x47\x4c\x50\x89\x38\x2a\x71\xc9\x10\x62\xb4\x2c\x29\x16\xf3\xff\x73\xdd\x44\x8f\xe0\xe5\x0e\xf2\xa3\x4f\x2c\xfa\x2b\x25\xe0\xbb\xb0\x75\xc9\x07\xff\x8b\x17\x0e\x86\xfb\xed\xcb\xd6\xae\x4b\xbf\xca\x1c\x27\x5d\x74\xc6\xee\x5f\x7d\xf8\x7e\x61\x68\x78\x3d\x3b\xb6\xdf\xae\xe6\xdb\xfb\x48\x0a\xa8\x43\x49\x3a\xa5\xd2\x95\xa4\xc3\xec\xef\xf0\xba\x6d\x0f\xe1\x80\x50\x0d\x55\x89\x84\xa7\x45\x3c\xe1\x72\xbf\xdf\x3a\x2e\xbc\x50\x0f\x4c\xc8\xc2\x17\x7c\x55\x04\x1b\x66\x6b\x1f\x6c\x78\x90\x6b\xa2\x84\xa7\x34\x4a\xcd\xe5\x83\xf7\x60\x03\x24\x3c\xed\xea\xad\x02\x7f\x0e\xfc\x65\xf0\x77\xc0\x3f\x4a\x4a\x60\xeb\x17\x6d\x4c\xcf\x33\xe7\xa9\xfe\xbd\x84\x9d\x73\xd4\xb0\x79\x7b\x05\xa5\x5f\x72\x0e\xef\xbe\xde\xb1\x9c\xf1\xfd\xfb\xdd\xfb\xcf\xb7\x27\xa4\xcd\xb7\x9f\x36\x06\x96\xb0\xa4\x4a\x2a\x84\x11\xc3\x68\x1a\xab\xe9\x54\xcf\xb7\x0b\x3a\x31\xa5\xe1\xf0\x70\xdc\x1e\x1e\x86\xac\xf4\x7e\x3a\x08\x42\x8d\x70\x52\xb1\xc0\xb9\x14\x9c\x67\x3f\xda\x33\x85\xb4\x87\xf2\x8e\x85\x90\x4e\x39\x0a\xc2\x98\x10\x2d\xf3\x5e\x56\x7c\xb3\xa7\xca\xa2\xa9\x17\xb2\x70\x39\x87\xfb\xc9\x67\x76\xaa\xb3\xb6\xc8\x2d\x51\x0e\x95\x7b\xef\xf7\xb8\x1c\x29\xc6\x4c\x48\x82\x38\x43\x98\x22\x8c\xf1\xd7\x3b\xce\x94\x20\x26\x30\x16\x82\xf1\xe5\x04\x82\x91\xa0\x69\x93\xe3\x45\x27\x82\x6f\xd4\xd6\x5f\xfa\x32\xfe\x2c\xf8\xbd\xc4\x95\x9c\x96\xf1\xc5\x45\xba\xc8\x55\x3e\x71\xbb\xcf\x7e\xe5\xa5\x21\x1c\x3e\x8b\xcc\x2d\x66\xfb\x96\xe5\x6d\xfb\x24\x53\x9a\x79\x58\xb8\x8a\x50\x21\x19\x91\xb3\x63\xef\x6a\xe7\x1d\xcc\x53\x17\x25\xcc\xeb\x28\xd3\xcb\x80\x4b\x48\x23\xcb\x0b\x58\xe5\xca\x52\x5b\x7a\x86\x51\x1e\x47\xda\xaa\x11\x75\x90\x20\xb4\x39\x86\x40\x90\xc0\x94\x39\x39\x91\x4a\x6b\x9f\xf5\x32\xee\x95\x52\xb1\x33\xc6\xc4\x96\x72\xcb\x69\x3c\x55\xa5\x2b\xa9\xed\x8d\x73\x10\x5b\x82\x2e\x78\x0f\xbd\xab\xb7\x57\x5e\x3b\x7e\xe9\x61\xfc\x91\x94\xc7\xc7\xfb\x77\x3f\xb1\xef\x09\x49\xf3\xe9\xf5\xdb\x6c\xf3\x4d\xca\x5f\x7c\x7e\x3b\xff\xda\xcb\x72\xb2\xba\x85\x41\xd1\xac\xe8\xdb\x76\x98\xf6\x63\xdb\xf6\x53\x7d\xdd\x1a\x9a\xa6\xcb\x80\x53\x5a\xe9\xae\x3a\x0d\xfe\x1c\x5b\xad\xdb\x02\xe5\x15\xd2\xe7\xa3\xc9\x7d\xe0\x7d\xd5\x06\x2e\x82\x5e\x03\xcd\x3d\xd3\x5b\xee\x7b\x3f\x0f\xb5\xef\xfd\xd3\xbb\x89\x71\x65\xb5\x28\xa3\xaa\xa0\x60\x51\x75\x08\x11\xda\x93\x78\x32\x94\x31\xea\x84\x80\x7b\xf2\x08\x3a\x31\xb8\xba\x13\x5d\xbd\x60\xf8\xe4\x86\x6d\x35\x78\x9d\x3c\x1e\xf0\x52\x4f\x70\x19\xd8\x3f\x0d\x5f\x26\x18\x92\x82\xeb\x85\x63\x39\x95\xcc\x82\xf5\xc1\x57\x95\x0f\xde\xba\x80\x60\x90\x5e\x18\x64\x25\xc1\x79\xdc\x23\x0c\xd1\xc1\x95\x48\x54\x46\xeb\xcd\x90\x5a\x81\xfa\xde\xfb\x06\xab\x87\x2a\x36\x65\x55\x8e\xd9\x9e\xf3\x69\x90\x19\xc1\xd8\x8f\x53\x80\x0c\x80\x3c\x3b\x3f\x8a\x5d\xbd\xa5\x5f\xf1\x3c\x7d\x78\x66\x20\xb8\xed\x4a\x5a\x78\x14\xef\x5f\xa5\x49\x77\xff\xe6\xc3\xea\x6b\xae\xea\xf3\x7a\x8e\x16\x44\x6c\x21\xaf\x1e\x0e\x15\xe4\xb1\x85\x22\x86\xac\x0a\x10\xb7\x6d\x64\x5d\xd7\xfe\x18\xc3\x17\xfb\x2d\xf5\x5d\xa4\xcd\xc3\xa0\xf4\x8a\x36\x70\xdf\x3d\x8c\x2b\xfc\x30\x42\xd2\x75\x53\x53\xd7\x75\xe4\x21\xa4\x5c\xef\x7a\x55\x83\x7e\x67\xb7\xfa\xe9\xdb\x26\xaf\xf5\x22\x3b\x78\x77\x4b\x35\xf0\x6a\xf7\xfe\x97\x17\x05\xc7\xdf\xce\x3e\x7c\x5c\x77\x9e\x1d\x10\xa9\x19\x3a\x3c\x82\x71\x1c\x47\x98\x3f\x1c\x85\xd9\x43\x7b\x3a\x9d\x4e\x5b\x4d\xf6\x4a\x12\xed\xc2\x3c\xce\xa7\x6a\xa5\x9c\x84\x24\x9e\xf6\xfb\xd8\xf5\xbd\x3f\x9d\x52\x9d\x69\x5e\xff\xc2\xd6\x5c\x30\xeb\xbf\xff\x52\xbb\x6f\x73\xd1\xb7\x4c\xa4\x83\xb3\xcf\xb5\xb0\x0a\x2e\x62\xfa\xcb\xfb\xbb\x15\x5d\xf5\x0f\xac\xca\xc2\x64\xe6\x47\xec\x36\xf9\x43\x5f\xa2\x15\x15\xc2\x23\x87\xbd\x39\xcb\x41\x36\x55\x1c\xe5\xc9\x37\xda\xa9\xbd\x8d\xa7\xad\x89\x04\x22\x7a\x60\x47\x8b\x50\x3c\x08\xe1\x49\x75\xb0\x56\xfa\xc1\x58\xee\x04\xb3\xd2\x80\x54\x83\xb3\xeb\x7e\x8b\x13\x6e\x26\xf1\xe3\xa4\x8a\xd0\xa7\x4b\x49\xe8\xd5\x87\x57\x9f\x5f\xdd\x7f\x9e\x27\x51\x9d\x81\xe0\x9c\xe0\xe5\x23\x88\x7b\x8a\x71\xe0\x63\x35\x0c\x5b\x3c\xf9\x47\xe0\xa3\x2d\x91\x73\xaa\x2a\xf2\x6c\x3f\xe9\x62\xc5\x7d\x82\xf4\x82\xcd\x9a\x02\xb2\x73\x4f\xba\xfb\x0b\xee\xf9\x19\xa5\xf5\x82\x1b\xe8\xa7\x96\xa7\xb5\x80\x2c\x55\x5b\x92\xee\xb1\x8c\x4d\x95\x9c\xa1\x01\x92\xd8\xd7\x75\x0d\x69\x13\x51\x7a\xd9\x8c\x75\x1d\xcc\x44\x6c\x18\x86\x60\xb3\xc1\x44\x53\x55\x55\x64\x4d\xd3\x24\xbc\xd2\xf8\x68\x77\xed\x56\x3f\x7d\x8b\xbf\xf4\x55\xed\xe9\xc3\x12\xb6\xac\xee\x2e\x71\xcb\x87\x57\xf7\x9b\x9b\x3c\xd9\x53\xce\xee\xc2\xfe\xb8\x22\x55\x05\xbb\xaa\xae\xc7\x78\x76\xad\x3c\x54\x71\xef\x4f\xb2\x33\x8f\x60\x5f\x41\x02\xbb\xc8\xaf\x0f\x75\x0e\xc7\x23\xdc\x7f\x19\xe1\x70\xde\x1c\x12\x8e\x73\xb2\xa1\x95\x75\x80\xe5\xa9\xf6\x36\x84\xcc\x3b\x17\xad\x8b\xce\xc6\xbc\x69\x42\x1b\x42\xbb\xe8\xa3\xf7\x59\x58\xa3\xad\x4a\xd9\xf8\xfb\x6b\x9e\xf4\x42\x8d\x71\xb7\x5d\xa0\x77\xbb\x5f\xc0\x0b\x98\xf8\xa2\x67\x92\x77\x59\xf7\xd0\xad\x54\xb4\x04\xda\xfd\xe9\x11\xe4\x95\x13\xd6\xb3\x52\x32\xd9\xb2\x33\x2c\x34\x46\xda\x6c\x0e\x13\xb6\xab\xc1\x29\x6b\x4d\x9e\x33\xae\x15\x63\x25\x2d\x35\x97\xc6\x62\x9c\x6a\x75\x9b\xac\x7a\xe4\xbb\x7a\x6b\xc1\x6b\xf0\x39\xf1\x27\xf1\x9b\x6b\xf6\x8c\x7b\xbd\xdf\xbc\xc8\xfe\xbd\x30\xea\x4f\xd9\xbf\xd4\x9e\x7c\xdb\xcc\xbb\x02\xe7\x30\x0f\x2d\x8e\x63\x15\xfb\x70\xce\x40\x8d\x21\x80\x58\x6a\x1d\xcf\xf0\x18\x4b\xe1\x8c\x2c\x8d\x61\xa9\xfb\xe2\x24\x84\x86\x1a\x67\xd2\xf5\x3e\x98\x7a\xd4\xfb\xec\x5c\xd7\xc6\xf7\x9b\x7d\xdb\xb6\xad\xaf\xeb\xba\x16\x88\x0d\xa6\x22\xcc\x06\x1f\x95\x12\x28\x60\x06\xbd\x0f\x8a\x60\xdb\xd4\xbc\xa9\xa6\xbd\xdc\x3b\xaf\x6b\xdf\x99\x84\x0b\xcd\x40\xfb\xa8\x77\x72\xd5\x80\x5d\xaa\xd8\x3f\xa1\x77\xaf\xae\xfe\x05\x2a\x71\x25\x61\xd8\x89\xea\x87\x50\x9d\xd6\xc3\x74\xcc\xd8\xd4\x43\xce\x2c\xc5\x10\xfd\x91\xce\xce\x53\x9b\x89\xe9\xb8\x6a\x62\x38\x9c\xa0\x8b\x63\x68\x42\xaf\x29\x97\x21\xf4\xa9\x9d\x13\xac\xb3\xf1\x91\x25\x5f\xed\x8f\xa7\x8e\xe7\x05\x09\xf8\xb4\x42\x5e\xba\xd3\x2e\x02\x74\x5f\xa1\xda\x53\x95\xe7\xfd\xe7\xd4\x82\x73\x29\xc7\x6d\x04\x45\xf0\x18\x1e\x42\x80\xe7\x12\xc3\xa2\xab\x74\x68\x4e\xca\xef\xc5\x90\x09\x6e\xe7\xa8\x54\x62\x34\x44\x42\xa1\x6b\x62\x20\xbe\xd2\xb0\x9b\xec\x9a\xc4\x13\x44\x5b\x27\x65\x6c\xc6\x11\x4a\xce\x63\x97\x30\xba\x4a\x57\xc2\xaa\x87\x53\xd4\x4a\x94\x01\x31\xe8\xa2\x6f\x7c\x05\x81\x3d\xa3\x3d\xcc\x43\x88\x67\x0f\x36\x59\xfb\xc8\x77\xed\x96\x5d\xd6\xb1\xef\x2e\x58\xda\x27\x4e\xaf\xd5\x15\x5d\x72\xbf\x40\x17\xaf\x4d\x6b\xf7\x89\x69\x74\x25\x57\xe3\x03\xae\xb3\x66\x92\xf3\xe3\x04\xcf\x08\xd7\x0c\xc3\xa1\x65\x7d\x0f\x0b\x16\xc7\xd3\x29\x06\x0e\xf9\xd8\xfa\x00\xa9\x69\x6a\xb6\x65\x93\x86\x21\xdd\x1b\x25\x67\x44\x68\x7f\x6a\x2c\xaf\x78\x13\x74\x90\xae\x3e\x75\xce\xf6\x17\xfe\x8c\x8d\xdc\xda\x84\x20\x7a\xbb\x7b\xf5\xa3\x26\x86\xf9\xfb\x25\x58\x2a\xe0\x87\xd3\xc9\x2b\xcd\x58\x65\x1a\x7d\x76\x8f\x00\xe6\x52\x51\x88\xb7\x36\xb0\x58\x57\xa2\xae\x2b\x6f\x1f\xfa\x55\x71\xda\x3b\x58\x42\x5b\x41\x52\x94\x15\x01\x30\x2b\x1f\xf9\x86\x6c\xe9\x82\x56\xbe\x30\x69\xdf\x0c\x53\xb6\x7b\x0f\x5e\xdf\xbd\x7f\xbd\x48\xbf\x67\x6d\x66\x9d\xf7\xc2\xa5\x10\x97\x35\x27\x0d\x89\x8b\x67\x1c\x3c\xe5\xc7\x58\x6d\xa9\x8f\xb9\x7f\x18\xb5\x2c\x2b\xc4\x33\x11\xd5\xc9\x41\x0a\x2b\x0b\x5b\xd4\xed\xe1\x19\x00\xb8\x2d\x41\xbd\x13\x99\x02\x9b\xa7\x3c\x70\x65\x78\x45\x75\xa6\x9a\x81\xef\xbb\x94\x13\xad\xb2\xf3\x4e\x6c\x5d\xe2\x38\xfb\xd5\x33\xbe\x3f\x55\xbc\x6f\x7a\x3b\x53\x12\x68\xa1\x32\xbb\xf2\xb3\x08\x87\xc8\x7a\x90\xda\x70\x32\x9d\x95\x17\x02\xcd\x0e\x5e\xcc\x1b\xad\x20\xae\xea\x26\x9e\xf5\x79\x55\xf7\xbd\x6d\x0e\x5b\xc7\x29\xf3\x56\x0b\xce\x62\x65\x54\x51\x97\x98\x42\x56\x33\xd7\x1f\xc8\xc9\x69\xdf\xd8\xda\x35\xd5\xbc\x5e\x6d\xf2\x95\xdd\xd6\x1b\xf4\xfc\x9d\x37\x3e\x78\x67\x9a\x0d\x0a\x9d\x4a\xeb\x30\xdc\x50\x10\xb6\x5d\xc6\x6e\xce\xe9\x2a\x5d\xc9\x90\xb1\x66\xcf\x12\x91\xce\x06\xd4\x70\xbf\x53\x9b\x70\xf9\x5d\xbf\x7f\xed\xb7\x5d\x1c\xb7\xcd\xa7\x97\x52\x1f\x37\x19\x89\xb7\x57\x92\xb3\xa7\x45\xa6\x09\x56\x19\xcf\x59\x38\xc6\xc3\xbe\x41\xd8\x25\xf2\xf1\x38\xc4\x1a\xf7\xad\xaf\xca\x26\x96\x4e\x06\xe1\x37\xa3\xf7\xde\xd6\x5f\x7a\x1b\x46\x7b\x58\x37\x4d\xb0\xbe\xde\x04\x7c\x36\xa5\x90\x24\xee\x07\x84\x09\x61\xf5\x9e\x09\xce\x89\xb3\x6d\x59\xf8\x3d\x33\x7e\x5e\xa3\x44\xab\x8d\x8d\x27\xd9\x56\xb6\xb2\xca\x87\x7a\x36\x7c\xff\xbf\x84\x07\x9a\xe3\xe6\x3f\x76\x41\xb7\xfd\xd9\x27\x4e\xae\x3f\x4c\xf1\xcf\x82\x78\x4f\x71\xd9\xa7\x6b\xcb\xca\x22\x18\x9d\xcc\xd1\xe7\x79\x1c\x67\xf3\xfb\xe9\x33\x7c\x75\xff\x42\x01\x2b\x29\x1c\xc3\x1b\x56\xda\xcd\xb5\x72\xf1\xf6\xf9\x9e\xbb\xa9\x5c\x6c\xd7\xe3\x34\xae\x0f\xd3\x01\x85\x68\x55\x99\x54\x89\xbc\x8f\xce\x6a\xad\xfb\x81\x52\x83\xd0\xba\x18\x19\x2d\x73\x9b\x73\xe7\x98\xd3\x13\xb1\xcd\x23\xd0\xe7\xcc\x1c\x7b\xdd\x8d\xb1\xab\x4a\x04\xcf\xba\x81\xf9\x49\xc4\xea\x78\x8c\x1d\x83\xc5\xde\x22\xa9\x14\x44\x52\xda\xbc\x91\x91\x17\x9b\xc1\x7b\x3b\xa9\xac\xa6\x8f\x40\xc5\xa3\x8c\x27\x91\xa1\xa3\x7e\x04\xc4\x68\xee\x0a\x78\x8e\x38\x2f\x32\x19\x5d\x4f\xb0\x41\x35\x27\x3c\xd3\xaa\xef\xa7\x66\x9e\x5d\x5a\x0a\x63\xac\xc4\x08\x63\x13\x14\xc7\x15\x33\x8a\x7b\xc2\x35\xa6\xc4\x38\xa6\x89\x50\x45\xaa\xe5\xd1\x47\xb9\x1a\xb6\x12\x7c\x7b\xf5\x56\x6e\x2a\xa3\xa9\x11\xfd\x3e\xb3\x90\x74\x87\x5c\x59\x2e\x4b\xcd\x51\x81\x86\xae\xd9\xca\xa9\x89\xa7\x89\x1f\x70\x85\x89\x81\x87\xac\x80\x0b\xe7\x11\xa0\x8f\x6c\xa3\xb6\x0e\x7c\xfb\xc4\x9c\xf6\xb7\xaf\x39\xa0\x1b\x36\xa1\xe7\xac\xe2\x0b\xfa\xa6\xe7\xbc\x22\xfc\x37\xe7\x15\xbf\xbf\x26\x16\xb7\xd7\xcc\x62\x46\x92\x48\x6e\x56\x13\x66\x30\x7a\xb0\xce\x5b\xe8\xb2\xbc\x88\x4a\x4a\x08\xf2\x3c\x77\xb9\x89\x87\xbd\x69\x8b\xde\xc7\xfd\xaa\x7a\xd0\x7c\x05\x26\x10\x66\xd3\x98\xf5\x42\x26\x29\x08\x3c\xb9\x30\x4a\x84\x0c\x41\x94\x20\x5b\x22\xde\xb9\x76\xc9\x31\xce\xf7\x33\x59\xb2\x8c\x02\xfa\x25\xcb\x48\xf3\xb2\x40\x39\xc7\x86\x13\x86\xca\x97\x79\x46\x25\x44\xe1\x72\x06\xcb\x25\xcf\x48\x30\x61\x9c\x33\x4c\x48\xca\x34\xfe\x31\xa0\x1e\xf9\xda\x6d\xe5\x8f\xf4\x84\x67\x6f\x2a\xf9\xfd\xaf\x2f\x99\xc2\x27\xba\xcf\xd9\x32\x7c\xe5\xcd\xcd\x57\xe9\xf5\x73\x57\x87\x87\x7d\x64\xa1\xaa\xe0\xf2\xa6\xae\xa7\x90\x7a\x28\xc6\x11\xea\x39\x04\x9b\x5f\x1e\x86\x35\xfa\x72\x38\x54\xab\xaa\x9a\xaa\xad\x8c\x55\xea\xfe\xb3\x36\xf6\x53\x0b\xd5\x1c\x3e\x0e\x52\xca\xb8\x0f\xb1\x64\x70\x88\x84\xf9\x05\x5b\x8a\x1f\xf9\x26\xdf\xda\xc4\xc1\xfa\x2a\xf5\x26\x2f\x4b\x73\x62\xb8\xb9\xf8\x9a\x8b\xef\x7f\x03\xc0\x59\x28\x4b\x7f\xf9\x6a\xe1\xaf\xf4\x4d\x81\xfa\xe9\xd8\x22\xb1\x88\x1f\xc6\x53\x43\xc9\x10\x03\x54\xd2\x31\x89\x1c\xc5\xe8\x50\x1c\x8c\xd1\x16\x82\x12\x6d\x2d\xe2\x64\xf6\xcf\x79\x6c\x7c\x74\x2e\x9e\x98\xf4\x2e\xca\xa6\x0c\xa5\x3c\xc6\x43\x6f\x05\xcc\x61\xe1\x11\x4a\xbe\x95\x7c\x54\x9b\x79\xed\x2e\xc1\xef\x24\x6e\x8a\xdf\xff\xba\xd3\xed\x89\xda\xf9\xc3\xab\x5b\xa1\x7b\xf8\xcb\xd7\xbb\x6c\x95\x5a\x40\x36\x44\x08\x84\x10\x45\xa4\xb1\x9d\x85\xc4\xf6\x4e\x08\x25\x22\x11\xd4\x11\x91\xe1\xb2\x90\x45\x19\x4f\xaa\x28\xd4\x5a\x7c\xe9\xa5\xc8\x7d\xce\x56\xf5\x97\x7a\xad\xbe\x84\xf5\x29\xe5\x6b\x3b\xbe\x37\xd2\x3b\x17\x44\xe5\xa6\x3a\x9e\x62\x87\x20\x87\x79\x89\x62\x38\x93\xd9\x47\x0a\x19\xda\xb9\xad\x03\xbf\x0b\xfe\xe6\xcb\x2a\xd6\x9b\x25\x6e\xb9\xb9\x78\x57\xd7\xf9\xf2\x37\x11\x84\xdc\x7f\x9d\xb8\xbb\x64\x17\x7a\xc8\x52\x69\x28\xc5\x72\x26\x96\x79\x01\xf7\x32\x50\x59\x5a\x42\x51\xac\x78\x23\x07\x12\xcf\x70\x81\x86\xf7\x6b\xe1\x48\x86\x2c\xf6\xde\x2a\xe7\xaa\x83\x1a\x7c\x2f\x8d\x72\x28\x36\x4c\x9a\x66\x8b\x94\xf2\xc2\x09\x47\xf0\x23\xd0\xa5\x2e\x89\xac\x8c\xf5\xa3\x13\x4e\x1c\x70\xe5\x0e\xad\xd2\xd6\x6a\x27\x1c\xd3\x4e\x31\xe6\xdb\xda\x8a\xf3\xc2\x6f\xe1\x1e\xf9\xa6\xf8\x0d\xf1\xc9\x87\x25\x7b\x76\x95\x93\x7c\xf5\x61\x89\x4f\x6e\x95\x27\x33\x0f\x73\x07\xc1\x23\x38\x1e\x4f\x27\x77\x91\x62\x3e\x37\x4a\x1d\x54\xec\xe7\xe7\xd9\x41\xf5\x7e\x9a\x7d\xa8\x06\xca\x10\xb2\xb3\x8f\xb4\xeb\xba\x58\x76\x5d\x07\x56\x59\xfd\xa8\xd7\xd5\xd6\xa5\x5e\xa8\x3f\xf1\x34\x4b\xaf\x59\x9b\x79\xb6\x7e\x78\x75\xff\xfa\xd5\xfd\xab\x95\xaf\x10\xdd\xc7\x1a\x6a\x7f\x08\x15\x65\xc3\x70\x38\x6c\x1d\xd2\x62\xea\xf6\x53\xe1\xfa\x2d\xd3\xd3\x08\xe9\x97\xc4\x90\x05\x2e\x73\x4c\x6c\xc8\xd6\x82\x3c\x59\xa1\x05\x61\xfd\x9b\xb4\xd0\xe6\xdb\x37\x93\xb0\x34\x4e\x72\x58\x4c\x58\xcc\xd3\x23\x3d\xca\xf0\x08\x16\x31\x83\x8d\xab\xa5\x0e\xbe\x0e\x75\xa8\x27\xa9\x54\xd6\x44\x06\xc9\x82\xb1\x50\x8f\x72\xed\x36\xe7\xe5\xff\x78\xb3\xdd\xbd\xfa\xfc\x76\x77\x3b\x9f\x93\x39\xfb\xf4\xf9\x2e\x73\x19\xd0\x56\x95\x56\x4a\x46\x4b\x42\x39\xe7\xa8\x35\x32\x36\x9b\x73\x5d\xfb\x38\x92\xc0\x27\xcf\x79\x19\x4a\x94\x95\xa8\xac\x29\xec\xac\x05\x9b\xec\xfc\xc8\x77\x62\x4b\x9f\xd6\x9f\x5f\x2d\x38\x9c\xcd\xfd\xab\xbf\x94\xbd\xba\x87\x1f\x2e\xa9\xc3\xd7\x0b\xbe\x63\xf7\x0b\x78\x41\x76\xcc\xb3\x6f\x27\xbe\x1c\x33\x59\x55\xbe\xae\xa7\xb6\xae\x09\xd5\xb0\xf0\x01\xe1\x8c\x05\x71\x8a\xfb\x8e\x67\x6d\x1b\x01\x0d\xce\xb8\x2d\x9d\xea\x4c\x25\xdd\xce\xf9\xf1\xe5\x4c\xb0\x19\x61\x29\x18\xf3\x7c\x6f\xf7\x81\x34\x1e\x1e\xb8\x50\xce\xa4\xdf\x2c\x36\x73\x5c\xff\x7b\x4b\x36\xe1\xff\x43\x1b\xf8\x0a\x3b\x72\xd1\x82\x20\x71\x80\x48\xc9\xb2\x44\xa4\x24\x21\xd8\x00\xf3\x39\xbc\xf5\x94\x5a\xbf\x15\xb8\x3a\x1c\xc2\x29\x74\xd3\x5e\xc8\xdc\xe7\x1c\x86\x29\xcf\xce\x53\x93\x8d\x5d\x38\x59\x29\xfb\x79\x9c\xcd\x23\xdf\x85\xad\x06\xbf\x05\xde\x25\xae\xff\x5f\x03\x00\x53\xa1\xf3\xf5\xdb\xd5\xc5\x82\x6d\x16\x11\xb1\xd5\x4b\x24\xca\x4b\x0d\xa3\xeb\xca\xb2\x7a\xff\x69\x33\x8f\x8d\xb5\xb4\x22\x59\x41\xb5\xe5\xf8\x61\x7f\x86\xfe\x5c\xc0\x9c\x5b\x26\x90\x62\xa8\xcc\xe3\x81\x66\xe7\x20\x0c\x23\x88\x32\x0e\x95\xc6\x15\x56\x51\x07\x16\x8c\x59\x77\x0d\x17\x66\x84\x0d\x8a\x67\xef\x83\x50\x5a\x40\x52\x4d\x75\xdc\x4f\xed\x23\x28\xab\xd2\xc0\x2e\x53\xfc\xcb\xd9\xa8\xbc\xca\x55\x76\x8a\xc7\x38\x62\x48\x61\x51\xe2\x68\x1f\x81\x39\x03\xb0\x06\xfa\x91\xed\xaa\x15\x4f\x35\xff\x3f\x93\xbc\xc0\x97\x9c\xf6\x97\x9a\xe3\x37\xcf\x14\x19\xaf\xef\xde\x5d\x9a\xfb\x6e\x40\xd0\x2b\x2a\x88\x21\x62\x35\x70\x6c\x30\xff\xc1\x40\x5e\x84\x1c\x8a\x58\xe7\xfb\xd6\x84\x5a\xc6\xb3\x81\x94\xc4\xfd\xca\x40\x54\xc1\x26\x36\x02\x52\x11\x7b\x25\xe3\x28\x21\x22\xf1\xb8\xe2\x89\xa3\x9d\x08\xc5\xa4\x18\x6c\x55\xd9\x80\x91\xa9\xac\x37\x43\x63\x1b\x88\x53\xf7\x7e\x88\x87\x10\x6a\xc8\xe2\xd0\xf9\x0e\xe6\x00\x64\x59\xfd\x78\x5a\x77\x5b\x01\x36\x09\xed\x74\x21\x15\x7a\x75\x11\xc6\x5a\x39\xcd\x2a\xaa\x05\x94\x52\xcb\x60\xbb\xad\xf0\xb5\xac\x7d\xd4\x0f\x6d\x50\x6d\xad\x56\x0e\x2c\xff\x06\x5f\xb3\xad\x4b\xb3\x1e\xc0\x0f\xaf\x0a\xf8\x1e\xbc\x4a\xc4\x01\x6d\x88\xa3\x85\xc5\x39\x84\xad\xfb\x32\x46\x14\x07\x05\x0b\x58\xaf\x8a\x2f\x03\x58\xad\xc0\xa3\xd8\x35\x29\xde\x5c\x7a\xb3\x9e\x43\xcd\xcf\xdf\xbe\xbd\xae\x70\x2f\x59\x39\x96\x7c\x82\xae\xa7\xbc\x86\x15\x22\x0d\xc3\x93\xcd\xc6\xa4\x10\x27\x6d\xb0\xc8\x7b\x3e\x61\x58\x06\x55\xc9\xb0\x69\xa3\x39\x9f\x61\x90\x8c\x2a\x33\x1d\x4f\xa7\x6a\xc2\x56\xa1\x06\xab\xac\xd5\xed\x20\xf7\x1d\x80\x1b\xb2\xa1\xdb\x6a\xeb\x6f\x7c\xfd\xde\x8b\x8a\xfb\xad\x37\x5e\x26\xad\x63\xb8\xc9\xd7\xc7\x6d\xbb\xb5\x37\xe7\x84\x10\x82\xad\xb7\xd6\x36\xa6\x0e\xc9\x97\xf6\x29\xee\xb4\x4f\xda\xc0\x1f\x93\x62\xae\x00\x7f\x1f\xfc\xd7\xe0\xbf\x7b\xc2\xbe\x5f\xcd\xfb\x02\x15\x4f\x42\xba\xab\x8f\xf7\x6f\xde\x2e\x79\xbc\xc5\xaf\x7e\xf3\xf9\xed\x26\xb9\xd5\x9f\x67\xe7\xf1\x85\x5b\x3d\xaf\xec\xb7\xb1\xc3\x15\x0f\xf4\xed\x8f\xbd\xea\x4f\x9f\xb7\xa0\xc6\x18\xd2\xe9\x54\xe4\x26\x36\x26\x2f\xa6\x01\x52\x84\x3d\xc5\x10\x10\xb3\xe8\x7e\x6a\xce\x59\x1e\x43\x41\x34\xcd\x74\x52\xbc\x29\x73\x93\x33\x6f\xa9\x51\x6a\x12\xda\xf7\x6a\x58\x49\xe7\xb4\x09\xd1\x9a\xb2\x84\x81\xdb\xfe\x84\x63\x77\x18\xe3\x48\x21\x68\x05\x93\x4a\xc2\x52\x49\xad\xd9\xd6\x12\x4a\x1c\xc6\x73\xf0\x8c\xb1\xa3\x04\x33\xc1\x63\xa9\x54\x27\xa5\x12\x22\xcb\x07\xb3\x2f\x8c\xb7\x05\x3c\x44\x5e\x64\x65\x94\x8e\x20\x85\x2a\x46\x39\x2c\xf7\x53\xcd\x6b\xa9\x95\x16\x46\x1b\xcd\x04\x2a\x9d\x97\x2c\xaf\x0b\xab\x49\x40\x9c\x73\x46\x54\xc3\x15\x65\xc9\x27\xfe\x19\x30\x59\x91\xf0\x5d\xbf\x7d\xe9\x1c\x27\x29\x6a\xd1\xe0\x5f\x5d\x99\x40\x16\x84\xf8\xc7\x6b\x69\x7d\xbb\x50\x98\xce\xb6\xea\xd3\xc7\xfb\xbb\x6f\x76\xf3\xe5\xfe\xf4\xf9\xfe\x6e\xb7\x48\x33\x27\x3b\x73\x23\x50\x7e\xe1\xb8\x59\xbd\x54\x62\x79\xf7\xfd\xa2\xcb\xfb\xe9\xf5\xa7\xcf\x77\xbb\x79\x10\xfe\xc2\x0d\xa5\xe2\xfb\x4d\x51\x53\x58\xc5\x9a\xa8\x96\xba\x5c\x9f\x5b\x6d\x0f\x1a\xe6\xfa\x7c\xc2\x61\x9f\x0f\x50\xe5\xfb\xe9\x50\x17\x79\x07\x79\x71\x7c\x38\x30\xdf\x40\x16\xcf\xb0\x10\xc6\x3b\xdf\xc8\x6e\x36\xce\x2a\x9e\x30\x94\xa6\x42\xd0\x70\x2b\xb9\x90\xae\x19\x04\x44\xda\x30\x12\xc6\xb2\x36\x2c\x1e\xd8\xc6\x12\xa4\x73\xeb\x93\x66\x2f\xa2\x14\x6d\x3d\xe6\xd3\x29\xee\x51\x89\x39\x76\x8c\xb1\x43\x6d\xb4\x6f\xb2\x82\xc6\x23\x25\x84\xea\x78\xc0\x44\x4a\x58\x99\xb2\x10\xda\x18\xc1\x94\xd6\x4c\x53\xa1\x79\x61\x23\x2e\x88\x55\x02\x61\x43\xa8\x64\x73\x80\xc3\x98\x45\xf1\x44\x19\x53\x5c\xa1\xa2\xc0\x85\x64\x0e\x49\x92\x17\x0c\x00\x90\x03\x9d\x75\x3b\x93\x62\xfa\xa5\x2f\xfe\x6f\x80\xbf\x05\xfe\x83\xc4\x3f\x37\x7b\x06\x3f\x4a\x58\x7f\xb8\x54\xa4\x37\x37\x33\xfd\xdf\xfa\x44\xeb\x4a\xb4\x47\xd8\x72\x32\x3e\x82\x61\x18\x86\xf3\x54\x94\xc8\xf4\x50\x8c\xe3\x38\x66\xfa\x7a\x98\x0e\x4f\x87\x8b\x42\x37\x90\xcf\x87\xb7\x0e\x73\x46\x88\x10\xca\x1a\xa3\xac\xf2\x59\x8e\x90\xec\x5b\x63\x06\xa5\xac\x52\xd9\xe1\xeb\xe3\xa0\x28\x45\xdf\x5d\x8f\x83\x9f\xaf\xca\x14\x23\xb3\x27\x9b\xfe\x67\x12\xa2\xe3\x6f\x03\x01\xfe\xe9\x95\x0d\xf0\x86\xbd\xf8\xed\xf6\xb7\xe0\xa7\x5b\xec\x4f\x2a\xf3\xbd\x0c\x8d\x3f\xbc\xf9\x04\xbf\x6e\x68\xbb\xa6\xa7\x7e\xf2\xec\x15\x4d\xbc\x30\x5d\x07\x59\xf0\xd5\xc3\xb9\xa2\xb4\x70\xae\xc4\x4e\x62\x97\xe7\xe3\x11\xab\x55\x90\xbe\x55\x0a\xe7\xae\x90\x4d\xcd\xbd\x8b\x8d\x90\x84\x23\x45\xcb\xab\x5f\x34\x3f\x56\x4a\xfa\x5e\xea\xf9\x34\xd1\x55\xdc\xfb\x2d\x8b\xdc\xb7\xf3\x9f\xd8\x12\xcb\x8b\xbc\xe4\x14\x87\x0e\x13\x54\x16\x46\x19\x2d\xb9\x60\xc4\xa3\xbd\x60\x12\xd6\x81\xc4\xfd\x44\x16\x13\x2f\xe2\x61\x65\x1f\x81\x8d\x8d\x36\x46\x31\x3b\x9f\xd5\x2b\x26\xe1\xb1\x49\xbe\xd6\x16\x34\x19\xdf\x99\xad\x79\x52\x4b\xff\x7e\xd1\xb5\x79\x75\xa9\xba\x7c\xfb\x76\xf7\x7e\xbd\x49\x54\xb7\x77\xef\x97\xdc\xf5\xfd\xe6\xc3\xc7\xfb\xb7\xf7\x6f\x3e\x7f\x0f\x6f\x0a\xf2\xa9\xd6\x97\x5a\x3a\x8b\xb8\x5f\x81\xb8\x87\x96\x08\x6a\x49\xf4\x91\x96\xb0\x8e\x0e\xba\x06\x1e\x22\x62\xc7\x23\xb4\x87\x43\xd3\x1c\xd1\x0f\x32\xd3\x91\x15\xf0\x58\x68\x6b\x7c\x79\x26\xa4\x88\x80\xc3\x26\xe2\x4d\xd2\x0b\xe5\xb1\x35\x86\x6b\x54\xfa\x5c\x43\xd1\x9b\xe9\xa4\xb5\x1e\x55\x8e\x57\x65\x54\x36\x1e\xab\xdc\x51\x03\x6d\xca\x17\x41\xff\x48\x77\x3e\xe3\x8b\xdf\xbb\xbb\x8d\x2d\x2e\x15\x81\x94\xd0\x6e\x02\x81\xb2\x4e\xc1\xb2\x9f\x6c\x3d\xe1\x6c\x8c\x94\x0a\xdb\x67\x1c\x4b\xe7\x42\x15\xc6\x31\x54\x8c\x2a\x0f\xc0\x0a\xfa\xc4\x79\x21\xc1\x9b\xa4\x93\x73\xf5\xe5\xef\x5f\x32\x6f\xbc\xbb\x64\xfd\x5f\xee\xfd\xcd\xdf\x61\x5d\xc3\x3c\x40\x7c\x74\x2d\x6f\x5c\x08\x8d\xda\x9b\x66\x22\x10\x84\xc3\xa0\xb9\x41\x24\x18\x25\x6b\x35\x42\xe0\x29\xa4\x75\xea\xca\x6b\x26\x59\x4f\x24\x1b\xa2\x66\xc2\x74\xeb\x7d\x08\xae\x16\x5e\x76\xb1\x87\x62\xd0\xd6\xd6\xce\x7b\x67\x0c\x63\x34\x9e\x21\x68\x99\xb1\x5d\x44\x58\xf7\x7d\xa8\xc3\x30\x84\x9a\x27\xb6\xef\x35\xd0\x99\x4e\x39\xf8\xdf\x4a\x4c\x01\xbf\xfe\x09\x24\xe1\xb5\x82\xf1\x22\xe3\xf7\xf6\xe2\x23\x3d\xf7\x23\x5f\x74\x71\xfb\x0b\xfd\x04\xf4\x0f\x02\xfa\xd8\xad\x6a\x78\xae\xda\x56\x39\x67\x90\x75\x14\xc7\xbc\xd1\xcc\x53\xfd\x50\x42\x9d\x74\x53\xf6\x43\x11\x49\x2c\xc9\x30\xc4\x6a\x5b\x2a\xe5\x95\xf7\x0a\xed\xe7\x80\xdb\xca\xb2\x46\x98\xc2\x5e\x1a\x27\x9c\xe1\x42\x78\x5b\x22\x27\x51\x95\x17\x1e\x64\x40\x3e\xf2\x5d\xbd\x92\x17\xc6\x8c\xc5\x43\x5e\x8c\xf0\x95\x3c\xef\xdd\xe2\x0e\xbf\xf4\x9e\xaf\xf1\x56\x3a\x82\x3d\x69\xaa\xe3\xf1\x80\x9d\xaf\xba\x81\xc1\xfd\x91\x30\xeb\x57\x9d\x27\xf5\xc2\x2d\x6f\xa3\xaf\xa2\x80\xed\x81\x30\x1b\x56\x0c\xd7\x87\x43\xe8\x88\xc7\x28\x76\x10\x13\x5c\xc9\x83\x96\xaa\x83\x20\x1d\x38\x86\x38\x42\x1c\x8e\x5a\xaa\x7d\x8a\x5b\x56\xa7\xac\xdf\xc9\xad\x5d\xb0\xe1\xbb\x17\x20\xf7\x25\xf5\x9e\xbe\xc6\xfa\x50\xa1\x0c\xb8\x3d\xd3\xa5\xa7\x1a\x61\x1b\x62\x27\x61\x69\x2b\xa1\x75\xbd\xb5\xc8\x4c\xfd\x11\x79\x24\x0c\x14\xb1\xda\xbb\x1a\x16\x5e\xea\x1a\x00\x08\x7c\x76\x58\xfb\x14\x5f\x3e\xf3\xbd\xdd\xce\xba\x0b\x3d\xd1\xba\x64\x4d\x0b\x7d\xb4\x7d\x50\xd6\xd6\xe1\x24\xcf\x36\x76\xb0\x8d\x35\x81\xfb\xad\xb5\xa8\xa8\x83\x52\x5e\x8b\x78\x86\x74\x08\x3e\x34\x21\x20\x5f\x2e\xdc\xb6\x4d\xe2\x8a\xbc\xe5\xfb\xf8\x74\x61\xfb\x58\x90\xcd\xcb\x5c\x58\x6f\x9e\xb0\xce\xbb\x04\xb0\xf8\xe9\xa9\x2e\x42\xc8\x7a\x76\x8c\x67\x02\xf3\x2f\x87\xf3\x89\x1e\x4f\x2b\x07\x01\x04\xf4\xfc\x08\xa2\x67\xa7\x78\xa2\xb0\xcc\x7d\x81\x20\x4a\xf2\x08\x59\x98\x4c\x35\x89\xac\x8d\x96\x0a\xbb\x5f\x9f\xa6\x23\x6c\x1d\xc7\x0e\x13\xcc\x1d\x47\x06\xcb\xa0\xb0\xb1\x8a\x78\xd2\x60\x8c\x9b\x26\x84\x70\x3e\x87\x20\xa8\x0a\x4b\x1d\x26\x13\x3b\xb3\x0d\xe0\xf7\x2e\x3e\x7e\x72\xe6\xbe\xfb\xbc\x74\x20\xcf\x81\xf0\x73\xb6\x37\xf9\xb0\x9f\x3e\x5f\x81\xd0\xdf\xbf\x87\x49\xf7\xfb\xbb\x75\x49\xcb\x55\xfe\x80\x99\x82\x68\x8f\xca\xe0\x5d\xd6\x55\x67\x27\x3d\xa1\x91\x4f\x27\xdc\xd4\x51\x54\xab\x5c\xf0\x78\x8c\x43\xe9\xe4\x34\x66\xe7\x12\xc1\x03\x21\xf1\xe4\x02\x54\xdb\xc0\x45\xe0\xb4\x20\x65\x49\xbc\x8e\xdd\xde\x07\x21\x38\xc5\x4e\xa8\x01\x0a\xc6\x68\x69\x98\x08\x94\x4c\x80\x60\xc9\xd2\x75\xcf\x56\x24\xc5\x5d\x1e\xfc\xf1\x14\x8d\xbe\xa8\xe7\xac\xae\xfd\xe8\x5f\x97\xc3\x3e\x7d\xbe\xdb\x08\x82\xe0\x50\x4d\x45\x05\x5b\x84\xdb\xac\x35\x01\x8e\x11\x1b\x2d\x45\xc9\xa4\x8a\x25\x3c\x7a\x1d\xc1\xd6\x4b\x1d\xc3\x38\x42\xc3\xf9\x74\xac\xea\x80\xab\x88\xb9\x40\x15\x42\xb0\xab\xac\xb5\xe9\xda\x55\x59\xb5\x53\x5b\x9b\x98\x54\x00\x9c\x63\xa2\x85\xa9\xfd\x89\xd7\xf8\xf3\xdd\xd5\xf7\x87\x24\xd3\x45\x9d\x17\x99\x9b\x54\x09\x1d\x94\x2c\xfa\xe8\x87\x58\x4b\xd8\xf9\x69\xdc\x92\xd4\x0a\x70\x66\x8c\x31\x8f\x85\xf6\x8e\x77\x45\x28\xfb\x68\xe2\x58\xf7\x90\x2f\xdc\x1b\x6d\xb2\xd9\xe1\x89\x3f\xec\xdf\x4f\x8a\x0b\x77\x1f\x9f\x52\xa4\x8b\xeb\xfd\xea\xee\xcd\xb3\x0f\xf2\xa2\xc7\x3c\x65\x3f\x97\x5b\x7c\xf5\x53\x78\x94\x03\xf4\x51\x7a\xef\xe0\x58\xe2\x9a\x96\xb0\x8d\x21\x14\xa5\x47\x85\x8f\x12\x5a\x29\x29\x43\x8a\xd0\x73\x38\x3a\xa8\xa3\x45\xab\xf2\xe1\xd8\xcf\xf6\xe9\x3c\x85\xf4\xb2\xea\x7c\xac\xa6\x53\xb4\x02\x06\x78\xcc\x06\xce\x88\x54\x51\x7b\x8c\x08\x65\x5e\x4d\x74\x21\x1d\x20\xa7\xd3\x23\x58\x59\x05\x2b\xff\x90\xd8\x7e\xbc\x73\x0e\xfc\x3c\xe9\xad\xb5\x5b\x07\x7e\x07\x7c\x02\x7f\x07\x18\xf0\x3f\x81\xff\x15\xfc\x6f\xe0\x7f\x07\xff\x27\xf8\xbf\x9f\x18\xbb\x16\x87\xea\x5a\x3c\x7e\x96\x02\xdc\xbc\xa0\xd0\xba\x7a\xbb\x1f\xef\x37\xd7\xb7\xf3\x99\xcf\x67\xbc\x9d\xc7\x25\x9d\xfa\xf9\xee\xcd\x87\x57\x0b\xf8\xf4\xe3\x2e\x5d\xb6\x8f\x1f\x16\x51\xb7\xb7\xdb\x1f\xf1\x6d\x3f\xab\x4a\x5f\xf0\x98\x7f\x1a\xce\x0b\xd5\xbb\x37\x9f\xde\xbd\xdd\xbc\x4f\x7d\xcb\x6b\xa5\xf2\x02\x82\xd0\x34\x4c\x47\x66\x68\xdb\x62\x84\x18\x8b\xa4\x36\xc6\x70\xc2\x4a\x64\x28\xe5\x86\xd7\x6b\x67\x08\xe5\x1a\xd9\xda\xd4\xb5\xe6\x9c\xf8\x30\x15\xa8\xa4\x18\xa3\xb8\xd7\x47\x44\x31\xaa\x4a\x44\x28\x2a\xcc\xc4\x7c\x66\x24\xe5\x8c\x71\xca\xb9\xa0\x9c\x71\x41\x25\xe7\x19\x15\x6a\xa0\xcd\x44\x71\x49\xd9\xaa\x95\x7e\x14\x87\xbd\xac\xe2\xc8\x21\x7e\xa8\x0a\x38\xe0\xa9\x63\x2e\xcb\xb7\xae\x24\x48\x6a\xb9\x77\xe3\xe8\xf6\x52\x27\x00\x5d\x08\x9a\x48\x29\x19\x3d\x34\x8a\x68\xd5\xe5\xed\xf9\xac\xb8\x70\x4e\x57\x95\x2e\x8d\x56\xea\x14\x4f\x4d\x89\x08\x46\x48\xc5\x1a\x13\x4c\xda\x92\x60\x52\x16\x2a\x72\xe8\x60\x6e\x89\x90\x94\x09\xce\x38\x95\x84\x32\xca\x29\xe3\x85\x74\xca\x31\x84\x10\x15\x5a\xb5\xda\x69\xad\xe3\x49\x38\x55\xda\x9c\x58\xc4\x21\xa3\xf3\xad\x03\x7e\x91\xf9\x47\xbd\xab\xb6\xf2\x45\x2e\xfb\x59\x7d\xfd\x6f\x80\xbf\x07\xfe\x8b\x67\x0d\xf6\x17\xf2\x5c\x5f\x69\xb0\xef\xbe\xca\x7d\x3f\xe7\xc0\x9f\xb9\x05\xfe\x34\xbc\x0c\xe5\x37\x3f\x12\xa3\x59\x81\x35\x8d\x38\x23\xf3\xc4\x8f\xd2\x67\x24\xe2\xac\x81\x79\x3c\x4f\x07\x58\xc4\x53\x86\x66\x43\x37\xb5\x90\xc5\xbe\x86\x26\x06\xe3\x3d\xa4\xb3\x6d\x36\xce\x41\x32\xbb\x5d\xc6\xfb\x07\xb3\xb6\x11\x64\xec\x87\x53\x46\x23\x1a\x75\x51\x4a\x2e\xb9\xd0\x94\xd6\x2b\x60\xd2\x16\x13\x5c\x92\xb0\x95\x56\x46\x0f\xf3\x68\x60\x88\x67\x68\x65\x3c\xcd\xb3\x42\x6b\x2d\xe3\x7c\xb5\x9e\x9e\xe2\x68\x63\xed\x3d\x54\x05\x99\x6f\x1e\x45\x49\xce\x4b\xcd\x03\xc5\x65\xda\x62\x48\xcf\x31\xcb\x1a\x56\xc0\x27\x8e\x8e\x37\x09\x57\xf1\xb7\x6e\x32\xa8\xf3\x24\x7d\x9a\xfc\xef\x5e\xfa\x62\x97\xbd\x4b\x27\xd7\xf3\xdf\x77\x1f\x5e\x12\x74\xc2\x1e\x22\x3b\x5f\x8c\xa0\x45\x63\x65\x50\x3d\x3f\x64\x07\x58\x58\xc8\x0e\xba\xd1\xb5\xb6\xca\xeb\x4e\x0e\x8f\xc0\xfb\x84\x15\x60\xb0\x8f\x18\x8e\x90\x84\x24\x3f\x78\x8e\x79\x86\xa6\x43\x58\x1f\x28\x35\x88\x51\xa3\x9b\xd1\x29\x63\xb5\xa1\xd4\x28\xe1\xac\x8f\xc7\x93\x55\x5a\x9a\xd8\x4c\x46\x6b\x69\x84\x66\x4c\x4b\x23\xb5\x00\x3f\x4b\x5a\xc4\xdd\xd6\x5f\x3c\xed\x65\xcd\xfb\x4f\xc1\x7f\xbe\xcc\x8c\x0b\x5b\xd9\x8b\x8a\x24\x7a\xf7\xf1\xee\xf3\x15\xdf\x94\x6e\xf7\x57\xb3\xdf\x7d\x0d\x5b\x92\x17\x76\xff\xf9\x92\x3e\x7e\x77\x3d\x61\x49\x8e\xef\xbe\x3e\xbe\x2a\x60\x1b\x60\x17\x79\xf0\x45\x6e\x35\xf7\x25\x8a\x7c\xea\x10\x2c\x61\x71\x95\x91\x6e\x21\x8e\xed\xc1\x1f\x8f\xb2\x28\x8d\xa0\xb6\x28\x0f\xf1\x5c\x3a\x73\x70\x4a\x1d\xf5\x97\xfa\xe0\x0f\x07\x82\x91\x63\xa5\x2f\xc6\x78\x2a\xbd\x4d\x47\xd4\x36\x77\x2e\x4a\x9f\x17\x45\x41\x6d\x45\x19\x65\x45\x55\x04\x57\xd7\xf5\x54\x86\x10\x59\x5f\x60\x4c\x7c\x4d\x29\xa5\xd8\x17\xe5\x60\x87\x61\xb0\xd6\x46\xd6\xe7\x85\x40\x21\x60\x49\x9e\xf6\x2f\xf6\x70\x0f\xf2\x6d\xbd\xea\x92\xaf\xfa\xa2\x1a\x9d\x26\xf9\xc2\x89\x93\x30\x34\xcf\x9c\xcd\xeb\xca\x15\x05\xac\xa5\xa3\x14\xc7\x91\x09\xed\x55\x65\xb8\x32\x4d\x03\xdb\xbe\xef\x21\x9b\xc4\xaa\x23\x18\x69\x2d\x14\x26\x5a\x88\x10\x4f\x25\x16\xb8\x30\x6a\xfe\xa3\x63\x0e\x36\x40\x81\x2e\xe9\x7d\xfd\x56\xe2\x58\xfa\xab\x73\xb4\xfc\x23\x2f\x39\x2d\xd7\x29\x6f\x91\xfa\x46\xbf\xff\xf8\x6a\x11\x69\x7b\x5a\x59\xdf\x7e\xfa\x78\x7f\x8b\x6f\xff\xca\x77\x7e\x37\xbb\xce\x2c\x24\x18\x92\x7d\x30\xd0\xc7\x7e\xa5\x47\x0f\x59\x59\xe0\xc2\x95\xb5\x90\x7d\x21\x85\x32\xa2\xd6\x35\x53\x4a\xfa\x7c\x9c\x84\xb4\x8d\xa8\xb2\x22\x18\x69\x5c\x44\xb0\x4c\xd2\x58\x4d\x28\xa3\x8f\xa4\x84\x2e\x1e\xd7\x5e\xce\x8b\x95\x53\xa4\x69\x22\xb1\x6e\x8f\xe3\x10\xce\x90\x07\x23\x84\x31\x83\xd1\x66\xe0\x4c\x09\x2e\x03\x97\xd4\x22\x46\x88\x66\xd4\x85\x60\x6d\x91\x5b\x8c\x42\xe1\x00\xd8\x00\x0f\xf7\x09\xc7\xfe\xab\x27\x55\x0e\x00\x97\x0b\x9d\x18\xb9\xef\xaf\x50\xc8\xd4\x30\x79\x11\x02\x7f\x75\x1d\x8e\xd7\x77\xaf\xee\xde\x5e\xab\x97\xf3\x9a\xe5\x8f\x47\x88\xb2\x3d\xcc\xf7\xfb\xfd\x7e\x84\x46\x55\x3f\xf0\x4a\xb5\xce\x58\x7f\xec\x61\x1b\x05\x9d\x17\xa2\x1c\x92\x38\x18\x21\xd6\x4d\xb0\x7e\x85\x1f\x46\x6f\x83\xa9\xdd\xc3\x21\x76\xfd\x1e\x8a\xec\x40\x84\xe5\xd8\x9a\x68\xb2\x56\x68\x11\xab\x44\xe2\xbc\x4e\x3c\x7a\xed\xd6\x80\x7f\x07\xfc\x7d\xf0\x0f\xd3\x5d\x74\xcb\xab\xff\x42\x92\xf6\x45\x0a\xbd\xb8\x30\x39\xcf\xab\xeb\xcd\x27\x5e\x42\x9d\xe7\x93\x5e\x5d\x60\x9f\x4f\x43\x99\xbd\xcf\x9a\xbe\xda\xef\x47\x2f\x18\x2e\x4c\xc1\x8a\x42\x4a\x49\x39\xa1\x25\xa5\x05\x3b\x9a\xb1\x3e\xf7\x59\xd8\xfb\x71\x3c\x57\x94\x53\x92\x76\xef\x4d\x57\x9f\xf7\x13\xb7\x05\x35\x74\x7d\xa2\x85\x2d\xf0\xc6\x1f\x8f\x7e\xf4\x9d\x14\x5a\xa1\xe0\xcb\xc2\xd5\x76\xda\x6b\x9e\xfb\x42\xac\x6c\x3c\xc6\x3c\x76\x0a\x22\xd8\xc3\xd2\x8f\xcb\xb9\x0f\xfa\x7a\xf8\x38\x9d\x62\x23\x21\x83\xc3\xd1\x8f\xb1\x40\xfb\x96\xb6\xf5\xe1\x84\x20\x18\x67\x3f\xce\xc3\x61\x67\xb7\x14\xfc\x05\xa0\xe7\xd9\xfb\xe6\xee\xda\xd4\xb4\x38\x13\xff\xa6\x9e\xa6\x0b\x48\xf0\xdd\xcd\x87\xde\xfe\xbf\x7e\x68\xf9\x4c\xbb\x42\xb1\x65\x0c\x1b\xa1\x94\xef\xac\x94\x2a\xd7\x1a\x4b\xa4\x18\x42\xdd\x89\xc3\x62\xc8\x8b\xb6\x67\x43\x53\xa2\x3c\x28\xd5\x85\x78\x58\xe9\xdb\xcf\xe4\xed\xf2\x21\x45\x24\x92\xa2\x44\xed\x99\xc1\x7c\xc8\x8b\xa6\x17\x87\xba\x44\x95\x92\x6d\x88\x87\x2d\x0d\xb3\xb7\x20\xac\x64\x85\xb7\xce\x08\x42\xeb\xba\x08\xa5\x92\xa8\x56\x5e\xee\x29\xa9\x84\xe3\x15\xc6\x06\x5b\xe6\xc2\xf3\xc9\xce\x3d\x9f\x2c\x04\x7d\x3e\x59\x84\x74\x32\xb7\x00\xfc\x0c\x28\x78\xda\x55\x5b\x07\x7e\x06\x7e\xfb\xa2\xd8\xf0\x57\xc1\x5f\x07\x7f\x33\xa1\xa1\x93\x07\x9a\x44\xbf\x2e\x53\xfe\xc6\xee\xfe\xf2\xc7\xda\xd8\x9f\x7e\x09\x6f\x74\xb0\xdf\xdd\x68\x04\xcf\xf7\xc6\x3a\x47\xc5\x79\xaa\xc7\x02\xc5\xdc\x31\xa2\x94\xcb\x0b\xaf\xa5\x92\x3c\x98\xca\xae\xf7\x2e\x67\x54\x69\x57\x38\xa3\xa4\xe4\x95\xa9\xdc\x0f\xce\x96\xc2\x8a\xf5\xe8\x4a\xe1\xe4\xe4\x66\x93\x74\x7d\xf8\xf3\x79\xeb\x84\xb2\x96\xb3\x22\xb6\x84\x1b\xcd\x15\xd3\xce\x58\xb5\xaf\xb4\x87\x2e\xcb\xfb\x90\xf6\xd6\xcf\x3b\x03\x2c\xd1\xa1\x67\x7d\x9f\x9e\xa9\x11\x46\xc4\xbd\x4e\x58\xcb\x35\xc4\x8f\x7c\x3b\x66\x8b\x6e\xfe\xc2\xcd\x72\x55\xa6\xbf\xd1\x30\x81\xcd\xba\xfd\x22\xc2\xca\x3f\xd8\x75\x1d\xbe\xd8\xaa\x5a\xfb\x2f\x36\x3b\x44\x3f\xc7\x3d\x91\x32\x06\xf7\x8f\xc0\x02\xb0\x5e\x05\xc0\xb6\xdd\x4a\x24\x6e\xd3\x85\x55\xed\x89\x95\xf0\x26\x8d\x76\x8b\xea\xdb\x14\x46\x28\x61\x44\x60\xa4\xcc\x5d\xce\xbc\xe7\xb5\x2d\x4b\x8b\xb2\x96\x95\x16\xb1\x95\x30\x4e\x57\xd6\x45\x43\xb1\xc3\xad\xa0\x12\xca\xe2\xe8\x50\xd5\x57\x2d\xee\x02\xc8\x41\x9d\xa9\x5d\xb5\xa5\x4f\x18\x83\x27\xb5\xfd\xd7\x77\x4f\x55\xd8\x5f\xc1\x37\x1f\x3e\xce\xa3\xb2\x9b\x03\x87\x4b\xa1\x76\x1e\x24\xf8\xf1\x3e\x71\x78\xbf\xfe\x78\xff\xa6\x59\x81\x87\x33\xcc\x8f\xc7\x47\x00\xc3\x10\x05\x6c\x87\x61\x6d\xe3\x70\x3e\x43\xfe\x50\x43\x9b\x98\x2b\x0e\x87\x2d\x7d\xc0\xa1\x81\xb3\x63\x7c\x0e\xbe\x69\xb2\x3a\xd8\xa8\xea\xb0\x1a\xe3\xd9\xda\x78\x0c\x91\xd7\x35\x80\xab\xee\xf1\xb8\xed\x57\x4d\x8a\xb2\xae\x18\xb7\x1f\x09\xe1\xcc\x01\xe9\x86\xe1\x12\xb2\xa6\x14\x5a\x09\xad\xdd\x5e\x76\xc6\x39\xe9\x1c\x2d\x22\x87\x65\x81\x56\x8d\xd4\xb6\x09\x52\x3b\xa3\x82\xb0\xc2\x2a\xae\x99\xd2\xc6\x0a\x0e\xc0\x6a\x75\x78\x3c\x6e\xf5\xca\x3e\xf7\x6e\xff\x66\x99\xf9\xad\x16\x82\x70\x24\x08\x89\x43\x2e\x8d\x74\xb3\x75\x99\x1f\x2b\x3b\x51\xa5\x4a\x5f\x2a\xd5\x55\x26\x40\x0e\xf9\xd1\xc4\xc6\x02\xb0\x05\x1a\xe6\xbb\x2a\xe5\x93\x5e\x83\xbb\x8b\x52\xe0\xc5\x5a\x5e\x6a\x42\x77\xaf\xee\x52\x3b\xd3\x87\x67\x7d\xcc\x6b\xf2\xf4\xdb\xaf\xb2\xa7\xef\x2e\x8a\x2d\x16\x9e\x6b\x38\xd6\x19\x88\xe0\xe1\x18\xf3\xb5\x89\xb3\x1d\x0b\x8d\xe7\xc7\x10\x5b\x28\x36\x42\xb5\x43\xc9\x15\xcd\x3d\x52\x4d\x25\x43\xf5\xa0\xe1\x21\xa2\xd0\xf7\x9b\xb3\x73\xce\x85\xc4\x8e\x50\x55\xdd\xc3\xa9\x92\xa4\xe2\xbc\xa9\xa4\xd3\x6c\x44\x25\x73\xa4\x97\x5c\x65\x72\x60\x74\xf2\x1e\x6a\xb0\x05\x16\x1e\x77\xd5\xd6\x27\x24\xe5\xef\x3e\x29\x1d\xbe\x7d\xee\x03\xbd\xc6\xbe\xcb\xbd\xfc\xfa\xc3\x9b\x9b\x45\x71\x5e\x06\x3f\xbe\x5b\x76\x3d\xdf\xf7\xdf\x7d\xbc\xd5\xbf\x5f\x1d\xaa\x9c\x32\x71\xe8\x6c\x68\x0e\xb0\xe4\x53\x15\x8f\xe7\x08\xd4\x4a\x45\x62\xad\xd7\x41\x04\xa7\x54\xd5\xe3\xda\xa8\x10\x6c\x23\x21\x5f\xc9\xe0\xb4\xaa\xf6\xc5\xa9\x51\xfd\x5e\x7a\x09\xd1\x97\xce\x23\xe5\xd4\x4a\xfb\x52\x39\xb9\xf5\x85\x91\xa8\xe4\x5e\x69\x8e\x51\xc5\xeb\x96\x06\x01\x0b\xea\xb8\xe2\xd1\x56\x98\x1a\x41\x0b\xce\x9c\x64\x4e\x38\xbf\x6f\x6b\xcc\xac\xa0\x85\x14\x5e\x0b\x45\xad\xed\x04\x0a\x9a\x4b\x85\xac\xe4\x7c\xe9\x89\x36\xe0\x94\xea\x34\xbf\x0b\xfe\xda\x1c\x85\x7f\x8d\xce\xf8\xe6\x65\x53\xc7\x55\xda\x70\xf9\x9b\x88\xc5\xee\x6f\x24\xf4\x3e\x7f\xff\x7e\xf7\xfe\x97\x17\x19\xfc\x1a\xfa\x2a\xc1\x33\x54\xac\xa0\x9b\x0e\x79\x06\x4a\x6d\xa4\x2e\x0d\xa7\xb8\x88\x4e\x8c\xf2\x8c\xe2\x19\xd6\xb1\x81\x2a\xda\xb5\xf7\x24\x2b\x2c\xea\xfc\xc1\xf4\x95\x1b\xec\xc1\x49\x81\x5c\x2d\x85\x0a\x28\x0e\xe5\xe6\x54\x55\xc1\x78\x15\x28\x8e\x4d\x9b\x87\x5c\xd4\xf1\xe8\x6d\x80\x2e\x28\x6f\x20\xa6\x95\x8f\x7d\x3c\xd4\x3e\xf8\xb6\xf1\x3e\xd4\xbe\x65\x02\x16\x66\x08\xc7\x63\xe2\x55\xd8\x00\x05\xc7\xdd\x52\x27\xfc\x65\xd2\x36\xfd\x6b\x4b\x47\xfa\xd2\xb7\xff\x34\x8a\x2f\x3a\xcb\x36\x4f\x69\xc6\xef\x2e\x41\x45\xd2\x36\x45\xdf\x2d\x92\x81\xe9\xd4\xac\x08\x75\x3c\x28\x98\x67\x3a\x14\x58\x2b\xae\xb4\x70\x06\x82\x4c\x84\x02\x55\x8e\x85\xc0\xb4\x39\x3c\xd0\xc0\x4d\xa5\xb8\x82\x64\xc5\xab\xd9\x1f\xaf\x0e\x7b\x52\xc5\x3a\x56\x86\x7b\x7d\x2c\xab\x1c\xa9\xb0\xb5\xe2\x58\xb9\xd0\x23\x25\x29\xaf\x24\xb3\xda\xf4\x30\x47\x52\x08\x53\x39\x69\xa4\xe9\x94\x30\x7a\x1a\x61\xcd\xb1\xeb\x73\x1f\xba\xb2\x32\xd6\x4b\x1f\x20\x2d\x9c\xd2\x04\x80\xcd\x9a\x00\xbd\x13\x5b\xf6\x82\xd9\x74\xa9\x92\x7d\x78\x91\x45\xb9\x62\x0a\x9e\x98\x19\x2f\x49\x7e\x78\x79\x5d\xb3\xec\xa4\x7d\x59\x1c\xa5\xc4\x04\x09\x84\x7b\xdf\x7b\x68\x94\xd6\x82\x29\x31\xf5\xb6\xef\x21\xef\xfb\xd8\x2d\xaf\x5b\x66\x82\x29\xca\x07\xc9\x45\x61\x0b\xd6\x27\x00\x44\xb5\x26\x92\x0b\x42\x99\x9c\xfa\xba\xae\x23\xe9\xba\x0e\x80\x2c\x6b\x1f\xdd\x2e\x64\x47\xf0\xb3\x94\xb9\x7f\xe6\x94\xbb\x42\xdc\x92\xcf\xfd\xfd\xfb\x15\x80\x5d\x81\x02\x29\xe1\xf1\x4b\x07\x91\x64\x07\x4e\x6b\xc6\xa1\xfa\x82\xa0\xa6\x3c\x33\x18\x63\xca\x3c\xde\x9f\xc6\x23\x39\xb4\xde\x0f\x0b\x6e\x05\x38\x30\xee\xec\xd6\xa6\xfa\xd7\xef\x27\xed\xab\xc4\x0e\xf6\xa2\x67\xe0\x06\x98\x7d\x01\x56\x24\xd5\x8c\x8f\x97\xcc\xf7\xbb\x45\xb9\x7f\xf7\xfe\xd3\x76\xe0\xb1\x8f\x76\x85\x1e\x0e\x59\x3d\xa9\xac\x99\xe4\x0a\xff\x51\xb9\x42\x13\xcf\xba\x49\x67\xd5\xc3\xb0\x22\x93\xc1\xd9\x71\x1a\xe6\x05\xec\xc8\x88\xc1\x2c\x43\x59\x1e\x4f\x96\x71\xcd\xb7\xd6\x95\x85\x0c\x32\xe6\xd2\xc9\x10\xa4\x93\xf0\x2c\x83\x28\xdc\xc3\xf1\x54\x70\xce\x38\x17\xa7\x53\xc9\x24\x91\x04\x40\x20\x21\x81\xed\x56\x80\xdd\x52\xad\x9f\x1d\x52\x58\x56\xa3\xeb\xb7\x62\xea\x23\x8d\x47\x05\x73\x68\x97\x5c\x5a\x78\xe4\x3b\xbb\x35\xe0\x2d\xf8\x3d\xf0\xd7\xc1\xdf\x4f\x71\xe5\xcb\x2c\xf4\xa7\x44\x5f\x99\xd8\xcf\x16\xe4\xfd\x2f\xb2\xfb\xf7\xa9\x83\xe9\xd2\x1f\xf2\xee\xeb\xbd\x4b\x4c\xfd\x75\x0d\xec\x6a\x32\xd6\x27\x5f\xc0\xbd\xb0\xc2\x94\x56\xe0\x22\x8f\xb5\x8e\x86\x41\xac\x63\x05\x9b\x58\xf4\x16\xe6\x05\x61\x75\x29\x58\xbe\xc8\x9c\x8a\x11\x35\x99\xea\xbe\xda\x7f\x14\x1d\x6a\xe0\xa0\x14\xd7\xc8\x33\x3a\x89\x10\xb2\x76\x12\xf3\x63\x6b\x0a\x19\x4f\xa6\x34\x25\x31\x07\xea\x88\x36\x11\x73\x7e\x70\x58\x97\xc8\x1d\xb4\x11\x5e\x3f\x6d\x1e\xb5\x11\x21\x36\x93\x5b\xda\x08\x69\x3c\xaf\xf0\x41\xc5\x51\x82\x6c\x85\x20\xdf\xf1\x94\x97\xff\x9d\xcb\x35\xd9\xfd\x88\x27\xeb\xda\xe0\xb4\x2e\x2a\x94\xf5\x14\x07\xe9\x70\xc7\x31\x9e\x1a\x44\x60\x3f\x9d\x8b\xd2\xd4\xfe\x78\xdc\x5a\xe4\x1e\xf6\x7d\x55\xd6\xe5\x21\x73\x52\x4c\x2d\x3c\xa0\xd2\x0d\x4b\x2b\x13\x58\x01\x0d\x8b\xe4\x3f\xfe\x29\xf0\x17\x52\x1f\xe5\x25\x72\xbd\x11\x60\xfc\x78\x25\x48\x5f\x50\x01\xf7\x2f\x55\xf0\xb6\x97\x85\xf3\xf5\x1d\xec\x02\x26\xd0\x33\xb1\x9f\xf2\x4c\x27\xba\xb2\x0a\x5a\xc5\x62\xcf\xb5\x3d\xae\x42\x28\x49\x46\x3d\xaa\xaa\x83\xde\x37\xd5\x41\x8d\xc1\xa9\xb2\x34\x1d\xd5\xde\x95\xb1\xd9\x3a\xac\x84\x37\x6a\x02\xbe\xf3\xad\xd7\xda\x08\xb5\x3f\xa3\xe0\x43\x6c\x46\x67\x9d\xa9\x6a\xed\x54\xe5\x5b\x8c\x34\xcc\xc3\x10\x7a\x08\xc0\x26\x3b\x3c\xfa\x5d\xbd\x25\x97\x3a\xea\x9b\x14\x7d\xdf\xe0\xf2\xe1\xa5\x8d\xe1\xfb\xf7\xab\xaf\xef\x50\xb5\xda\x3f\xd0\xfa\xda\x57\x04\x29\x43\xb0\xfb\x72\x80\x3d\x22\xd6\xf0\x56\xf1\x56\x48\xa8\xbe\x30\x28\xa8\xdc\x92\x89\xc0\xba\x89\xac\x8a\x8d\xd0\x21\x70\x16\xdb\x76\xdc\x8f\x64\x9c\xed\x76\x98\xef\xdb\x36\xab\x76\x7e\x2b\x6e\xf0\xa1\x00\x3e\xdf\xb2\x8b\xf7\x79\xf3\xbd\x76\x76\xca\xb3\x6e\xe2\xab\xfc\x41\x87\x0c\x4f\xe3\x03\x49\x15\xbe\x6b\xc3\xf3\x56\x04\x1f\xad\x0f\xab\x6e\x3a\x78\x68\x1f\x1a\x78\x1e\xa6\xfd\x08\x2e\x63\x56\xee\x96\xba\xca\x95\x81\xe6\x2e\x83\xef\xbf\x7b\xfd\xac\x2c\x7f\x1d\x21\xf0\xee\x09\x29\x74\x03\x0a\xba\xd0\x9c\x9d\x03\x85\x0d\x9f\xbc\xca\x72\x1d\x87\xa2\x74\x5a\xab\x79\x6a\x6a\xad\x6d\x89\x35\x04\x59\x05\x71\x5e\xe5\xd0\xc7\x96\x43\xae\xe3\xc9\xe9\xe8\x38\xf4\x24\x1e\x33\xaf\xa4\xe3\x6a\x6b\x71\xf5\xd0\xc4\x2e\x9c\xb2\x80\x10\x57\x46\x32\x82\x95\xb5\x4e\x22\x6c\x60\x99\x37\xc7\x43\x1b\xa2\x3a\xfb\x03\xb4\xd1\x0e\xee\x00\xfb\xac\x50\x4e\x25\x9c\x2a\x08\x8f\x62\xe7\x56\x12\xbc\x7e\x42\xba\x67\xf3\x8d\xfd\xe9\xd5\x25\x34\xd9\xfd\xf2\xed\xee\xbb\x6b\x9c\xb2\x7b\x86\x3a\x7d\xfa\xfc\xe9\x36\x52\xd9\x38\x19\x07\x31\x48\x51\xe5\x8d\xb2\x7e\xe8\x8f\x22\x9e\xbe\x9c\xaa\xdc\x09\xeb\x87\xbc\x0d\xc6\x7a\x1d\x4f\xe2\xa0\x58\x46\x3c\x37\xd6\x4d\xc8\x33\x6b\x2d\xcc\xe3\xa9\xf2\xba\xaf\x60\xbb\xf7\xda\xaa\xda\xc6\x93\xa9\xaa\x95\x74\x8a\x0b\xed\x14\x45\x49\x47\xe2\xe8\xbd\x19\x03\xcc\xf1\xc1\xa8\x60\xf1\xde\xc9\xb0\xd4\xa2\x35\x54\xbb\x66\x8b\x2e\x28\xf7\xdf\x06\x64\xfe\x0d\xaf\xef\x12\xab\xe0\xee\xcd\xfd\xc7\xf5\xe6\xfd\xe7\x9b\x56\xaa\xd9\x9b\x84\x89\x80\xe9\xe6\x06\x5a\xdd\x7f\xf8\xe5\xdb\x4f\xaf\xed\xaa\x71\xaa\xb4\x75\x1c\x63\x53\x56\x1e\x96\x57\xe9\x9d\x7d\x13\x43\xd6\xae\xf2\x56\x55\xa3\x18\x9b\x76\x14\x63\x55\x2b\xb2\xe7\xde\xf1\x2d\x0a\x13\x2e\x1c\xda\x37\x94\x54\xc5\x8a\xb7\x6d\x44\x4d\xcc\x4b\x14\xb2\xde\xe0\x48\x6c\xa3\x6a\xdd\xf7\xaa\x92\x6d\xc2\x7f\xf4\x3d\x2c\x00\xc8\xe0\xf9\xf1\xb8\x39\xaf\x5c\xaa\x96\x81\xeb\xf5\xdd\x7c\xb3\x4b\xe4\xd0\x6f\xe6\x45\xf7\x97\x17\x5f\xb0\xab\x8b\xce\xf8\x7d\x3c\xe7\x30\xef\xd4\x7e\xb4\x8f\xc0\xc0\xbc\x8b\x47\x27\x95\x51\x2b\xd7\x58\xa5\x65\x6b\xf2\xa2\x0a\xbe\x75\x79\x63\xad\x81\x74\xe4\x83\x51\x0e\x64\xc0\x40\x9b\xfc\xed\xdf\x06\x7f\x70\xe3\xa1\x25\x1e\x93\x9b\x35\x7a\xf3\xfe\xdd\xab\xbb\xab\x8d\x9b\xcd\xfa\xcf\xe1\x1c\x8b\xfe\x09\xf8\x5d\x0d\xc9\x52\xe7\xc4\x65\xd5\x70\x63\x14\xd2\x86\xc6\x91\x42\x15\x87\xad\x91\x71\x1f\xe5\xaa\x98\xc3\x94\xaa\xb0\xde\x79\x0b\x8f\x9b\x70\x3c\x86\x23\xf3\x04\xc7\xd1\x4a\x54\x21\x75\x60\x15\x83\x05\xe4\x81\xa0\x53\x98\xaa\x4c\x3f\x82\x78\xd6\x5a\x43\x04\x25\x4c\x3d\xb6\x19\x70\x59\x9e\x6c\xee\x37\xe0\x3b\x00\x5e\x2f\xbc\x5a\xf7\xaf\xee\x9f\xbb\xcb\x9e\x90\x75\xd7\x84\xf6\xb1\x86\x65\x5d\x8f\x85\x54\xae\x2e\xaa\x2c\x8f\x3c\xab\x60\x5b\xc3\x26\x4a\x68\x1f\x1c\xd4\x51\x6c\x65\x3c\x41\xf2\x65\x0f\x65\x5b\x33\x2d\x87\x10\x6a\x88\xe2\xa1\x8a\xae\xaa\xa0\x5b\x6c\xfd\x23\xd9\xd1\x95\xb8\x44\x98\xdf\x27\x56\xc4\xdd\xdd\xcf\xe1\x2f\xe0\x6f\xc1\xf7\xdf\x7d\xfe\x35\xbc\x68\xaa\xdd\x2a\xb3\xbf\x5b\x9a\xa5\x96\x56\x96\xb2\xdc\xd0\x9c\x72\xa5\x0e\x25\x2c\x73\xc2\xf2\x1f\x7a\x59\x17\xeb\x21\x52\xc5\x3c\x55\x0f\xb6\xe2\x36\xd8\x55\x29\x48\x8d\x45\x27\x70\x8d\x79\xa6\x4d\x3c\xc7\x83\x22\x79\x5e\xe5\x79\x11\x4e\xf0\x58\xb2\x10\x87\x54\xc5\x66\x74\xac\x64\x55\xdb\x8a\x56\x0e\xf9\x96\xb6\x49\xe7\x03\x18\x48\x52\xad\x60\xc1\x44\x2d\x6a\x95\x89\x99\xf3\xd9\x14\x2d\x6c\x27\xe9\xe9\x57\xf0\x9b\xab\x1c\x52\xd2\x47\x2e\x37\xfe\x7c\x7e\xa0\x84\xad\xc3\x0f\x67\x57\xe9\x63\x1d\x8f\xb0\xc6\x68\xea\x32\x5b\xe4\x31\xcf\x42\x91\xe9\x49\x97\x28\x1b\x1e\xdc\x6a\x7c\xc0\x5b\x19\x8f\x55\x3c\x72\x1a\x11\xb4\x92\x05\x15\x2a\xc6\xaa\x45\x11\xe9\xc8\x98\x9b\xca\x7e\xe9\x11\x54\x10\xaf\xc8\xd6\xcd\xd1\x79\x92\xe0\x5b\xf8\x3c\x6f\x67\xd7\x92\xfa\xf9\xf4\xf9\xd5\x9d\x83\xb8\x19\x86\x7d\x69\x8c\x0a\x94\x22\xca\x18\x72\x15\x69\xab\x38\x6e\xe8\x3c\xc7\x42\x3c\x33\x47\x50\x3c\x59\x95\xd7\x39\xa6\x1d\x46\x01\x11\x98\x70\xe0\x43\xd6\xed\x48\xea\xbb\xf8\x93\xf3\xff\xf4\xe9\xda\x9e\xff\x24\xb1\xf4\xe9\xf3\x1d\xbc\xdb\xdd\x0d\xb0\x2e\xe2\x61\x63\xe2\x19\xea\x58\xd5\xd3\x20\x62\xcf\x4e\x34\xba\xb5\x9c\xce\x45\x56\xae\x0f\xca\x55\xd5\xa1\x8a\x16\xfa\xd8\x50\x4f\x07\x68\x0f\x20\x03\x32\xad\x23\x1e\xfc\xfc\xca\x9e\xbb\x78\xee\x60\xf3\xea\xfe\x55\xb6\x79\x0f\x92\xd1\x58\x90\x9d\x70\x07\x32\x54\x25\x87\x5c\x43\xb2\x6a\x42\x17\x3b\x0d\x55\x1d\x75\x06\x42\x86\x23\xeb\xa0\x74\x89\x1f\xac\xa9\x1f\x4c\x36\x18\xe6\x21\xde\x3f\x9c\xb3\x73\xf4\x27\x07\x01\x14\x29\x0f\x1b\xe2\xe1\x11\x54\xb0\x5c\xfa\x83\xcb\xc7\xfd\xce\x27\x7e\xa9\xc5\x76\x01\x78\x83\x02\x9c\xc7\x34\x51\x70\xde\xbd\xb9\x5b\x6b\xcd\x02\xd5\x99\x6e\xa5\x86\xe4\x01\x67\xb9\x9e\xfa\x95\x7c\x68\x9a\xb5\xf9\x12\xb6\x3a\xd4\xb2\xae\x04\x19\xeb\xaa\xda\x4f\xa8\x8a\xa2\x4a\xdc\xab\x14\xba\x1d\xdd\xda\x64\x1b\x2f\xdd\x25\x0b\xcb\xe9\xa2\xd8\x58\xaf\x8a\x87\x53\x56\xfd\x60\x33\x11\xc5\x9a\x7f\xe9\xb6\x76\xac\xe2\x79\x72\x99\x8b\x25\x14\xcb\x58\xdb\xac\x49\x78\xca\x3f\x75\xf5\x51\x16\x0a\xf1\xaf\xec\xdd\x77\x2b\x59\x63\x92\x9d\x63\xfb\xc5\xf2\x35\x85\x68\xaa\xad\xf0\xc2\x95\x4a\xf3\xc0\x0d\x17\x16\xb6\x5b\x4f\x08\x09\xd3\xb1\x69\x1c\xac\xa4\xe4\xd6\x94\x54\x1b\x69\x0c\x46\x36\x71\x50\x43\xbc\x62\xdb\xfd\x56\x26\xd4\xe9\x8d\x97\x0d\xf5\xba\xfb\x52\x6e\xc2\x0f\x6a\x7d\xfe\xc2\x37\xa8\xae\x1e\x8e\x75\x03\x20\xe8\x37\x66\xc7\xb6\x39\x58\x2d\xd9\xcb\x7e\xeb\xfe\xc8\x6d\xf3\xf9\xb7\xff\x02\x1e\x1f\x69\xf2\xaf\x7e\x07\x7c\x00\x7f\x33\x31\xd3\xfc\x97\xe0\xbf\x01\xff\x0a\xfc\x0f\xe0\x7f\x06\xff\x1a\x04\xf0\x7f\x80\xff\xeb\xdf\xbe\xb6\x9a\x2a\x4a\x17\xc4\xce\xe6\x59\x4b\xe7\xc3\x33\xa2\xe7\xaa\xd8\xbb\x00\x5a\x3f\xff\xe6\x12\xea\x85\x3d\xf0\x05\xaa\xf8\x62\x53\x9f\x24\x51\x2e\x91\x63\x22\xf1\x7f\xbf\xc6\x26\x2f\x60\x1e\xda\x96\xd9\x58\x5a\xde\x75\xac\x44\x9c\x46\x5a\x5b\xad\x0d\xc7\x96\x29\x61\x84\x59\x37\x16\x53\x21\x49\xe8\x6c\x55\x69\x21\x88\xf5\x5f\xac\x83\x27\x54\x12\x84\x3b\x91\xea\x95\xa9\x16\xc7\xb9\xe0\x44\x08\x9a\x49\x29\x47\xd6\x3c\x58\x03\x0f\x66\x62\x59\x81\x0a\x82\xca\x38\xe2\xf9\x03\xab\x41\x55\x07\x71\x9a\x5a\x42\x4b\xb4\x92\xaa\x89\x83\x80\xf4\x21\xf7\xf0\x18\x4b\x48\x8e\x45\x3c\xc7\x40\xb7\xae\xc4\x48\x1b\xd5\xb9\x71\x74\x9d\x32\x04\x49\x8e\x43\x30\x65\x50\xf2\x08\x41\x90\x5a\x75\x55\x3c\xc3\x5c\x52\x29\x8d\x0d\xc1\x6a\xa5\xe5\x23\x88\xa7\xa6\x86\xb9\x41\x88\x20\x84\xb1\x10\x7c\xfe\x4e\x82\x09\xc2\x19\x49\xc5\x54\x65\x94\xa7\x32\xce\x5e\x99\x80\xae\x44\x14\x61\x84\x30\x25\x58\xeb\x4e\x3a\xed\x18\xc5\xa8\x33\xf1\x2c\x9c\x1a\xa8\x75\x88\x18\x42\x68\xaa\xaf\xc2\xc3\x23\xdb\xb5\x5b\x9f\x6c\xec\xef\x81\x0f\xe0\xaf\x24\x24\xe3\x3f\x00\xff\x19\xf8\xc7\xe0\x0f\xc1\x3f\x03\xff\xd5\x33\x7a\xf7\x45\x9b\xc8\xee\xfd\xa7\x25\x0f\xf1\xee\xdb\xb7\x49\x1c\xeb\x92\xc2\xbd\xff\xf8\xe1\xfd\xeb\x0f\x9f\xef\xbf\xdd\xdc\x3d\x77\x62\x6f\xee\x5e\xbd\xd0\xe3\x7d\x82\xfb\xdd\x78\x9a\xf3\xe3\x56\x9f\x7e\x23\x5d\x51\xc0\x56\x6b\xd1\xd0\xd1\xd6\x15\x31\x46\x09\x55\x19\xc1\x25\x8f\xfb\xe9\x80\x8a\x91\x95\xa8\x9e\x54\x53\x20\x3e\x12\xc9\x49\x5d\x66\x45\x96\xef\x21\x7b\x38\x41\xd6\x4e\x20\xe3\xe3\xf9\x1c\xe2\x11\x96\x87\x70\x4d\xbb\x65\x20\xdb\x4f\x34\x24\x03\x78\x79\x70\x6e\x5a\xd6\x43\x5d\x79\xe5\xc2\xd6\x63\x8c\x94\xe6\xa8\xf4\x84\x8a\xd2\x96\x98\x33\xe5\x28\xc7\x94\xed\x85\xf0\x5a\x78\xaf\xa4\x77\x91\x75\x72\xaf\xb9\xb5\x9c\x4c\xd6\xf8\x71\xf4\x06\xda\x2a\x6a\xbf\x9f\x04\x3c\x8a\x78\x16\xf1\xcc\xf7\x4a\x12\x4b\x18\xe1\x46\xcc\x17\xfb\x67\x70\x9f\xfa\x58\xae\x58\x4a\x7c\xc3\x01\xf5\x75\x2c\x70\x85\xd5\x3e\x63\x6b\x13\x8b\xe9\xa7\xcf\xcb\x2d\xf0\xf1\xc5\xc1\x3f\xf8\x2b\x30\x1d\xfb\x4a\xc7\xf8\xd6\x00\xa3\x39\xac\xf6\x30\xa4\x7a\xb2\xc9\x28\x2a\x54\x6e\x1d\x92\x5c\x88\x52\x10\x8d\x18\x41\xa8\xb4\xda\x10\x9a\xc7\x16\x23\x95\xfb\x80\xb5\xe0\x7c\x3e\x88\x29\x46\xcc\x5a\xc7\x58\x5e\xc0\x9e\x62\x83\x69\x04\x96\x12\xcb\xe0\x11\xa7\x2b\x34\x3f\xa3\x2d\x9b\x5a\x28\x7d\xac\xec\xc3\x49\x3b\x8c\x11\x29\xb4\x6a\xca\x42\xb9\x03\x6a\x5d\x9e\x0b\x89\x62\xe7\x8b\x92\x62\xed\x30\x2a\x49\xa1\x75\x53\xe6\xf3\xd1\xde\xe4\x2d\x8a\x8d\xcf\x11\x46\x47\xa5\x99\x96\x84\xb6\x96\x56\xde\x78\x1a\x0c\xb2\x81\x04\x7b\x99\xab\x22\xe1\x3e\x7e\x06\xee\x6f\xea\x07\xff\x11\xf8\x4f\xc0\x3f\x06\xff\x34\xad\x57\xff\xcb\x6d\x35\x01\xfe\x15\xb8\xc0\x92\x3f\x3f\xd5\x10\x2f\x97\x6c\xb3\xe0\x96\x7e\xea\xc8\xc5\x60\x5e\x2b\x6d\x2f\x78\xb4\x6e\xab\x0e\x37\xfb\xaf\x22\xc4\x49\xae\x6b\x31\x85\xdf\x7d\xbe\x5b\x9f\x09\x72\x91\xd6\x25\xca\x72\x25\x8c\xa9\x04\x2b\x14\x2e\x55\x51\x75\x48\x29\x21\x4a\xcd\x0c\x79\xc8\x35\x46\xd6\x79\x5f\x28\x8c\xf4\x7c\x48\x2b\x21\x4b\xcd\x2c\x85\xe5\xc2\x60\x18\x5d\x9e\xf0\x04\x21\x64\x3d\x2f\x54\x49\x1f\x5a\x56\xa8\x92\x64\xb5\x2a\x91\xc6\x0f\x3a\xbd\xac\x1b\x5c\x9a\x02\x3f\x74\xa4\xd0\x05\x71\x99\xa8\x32\x19\xf1\x00\x89\x88\xed\xa1\x1a\x63\xd0\x50\x1e\x22\xde\x3a\x21\xb5\x66\xec\x11\x14\x0e\x0f\x55\x59\x12\xac\x3d\xe6\x04\x69\xe9\xca\x42\xdb\x0e\xd5\xb2\x60\x0c\x1f\x3c\xf9\xf1\x11\xaf\xb9\x16\x71\x14\x8e\x19\x8b\x9c\x29\xd3\x73\x8e\x5a\x47\x83\x4f\xcf\xce\x04\x5c\x19\x94\x9e\x63\x30\xc6\x8f\xba\x0e\x10\xc5\x1c\x9e\xe3\xb9\x71\x7e\x04\xbf\xc8\xc0\x23\xb9\x8c\xe1\xbb\xcb\x08\x2e\xeb\xcd\x3f\x02\x7f\x08\xfe\x39\xf8\x97\xe0\xbf\x07\xff\xfa\x76\x0c\x37\x9f\x6e\x87\xea\xe5\xc4\xbf\x8e\xe2\x2d\xdc\xf8\xeb\x71\xdc\x5d\xb0\x3b\x97\xd1\x7c\xfb\x75\x27\xf2\xed\x5d\xb2\xc0\x6e\x7f\x01\x9f\xf3\x3a\x49\x4f\xfe\x8c\xcb\x90\xc6\x31\x2a\x46\x30\x32\x95\x6b\x0a\x41\x90\xca\xbb\x01\x59\x2d\x65\x69\x85\xa1\x2b\x25\x09\x32\xd6\xfb\x3c\x97\x04\xc9\x22\xaf\x3b\xa4\x25\x17\xa5\x62\x86\x4c\xfa\x3a\x94\x92\xce\xa3\xd4\x5d\x06\x74\x6a\x55\x41\x14\x86\x39\x2e\x6d\x41\x56\x44\x96\x48\x61\xe8\xd2\x28\x33\x52\xea\x92\x3c\x80\x75\xf7\x80\xd1\x5a\x22\xe7\xea\xbe\x18\x2b\x82\xcb\x2f\xc1\xae\xba\x2f\xe3\xd6\xf1\x79\x28\xe9\x29\x2f\x08\xc1\x07\x45\x08\x5a\x6e\x3b\xa4\xe6\x11\x33\xba\x45\xde\xce\x63\x39\x78\x52\x16\xf8\xf6\x98\x36\x1d\xaa\xe6\xd1\xe4\xd6\x22\x6f\x8a\x78\x90\x46\x14\xc1\x61\xe3\x6d\x1a\x41\x14\x34\x35\xc6\x18\xe4\x74\xae\x1d\xf6\x3a\x8e\x71\x6f\xce\xa1\x70\x39\xd6\x50\x48\x50\xc0\xf6\x91\xef\xf4\x56\xa5\xde\xcd\xd7\x09\x79\x71\x7f\x83\x84\x57\xe0\x9f\x00\x0d\xfe\x45\xb2\x1d\x57\xd0\xd9\xab\xf7\x4b\xfe\xf1\x56\x69\xfd\xfe\xfd\x8b\x6a\xfe\xab\x9b\x6e\xc5\xb7\xdf\x5f\x00\xd2\x17\x0c\xca\x2d\xce\x7c\xf5\xed\xdb\xdd\x92\x64\x5a\x0a\x4a\xbb\xb7\x97\x83\xf3\x58\xdf\xbf\xf9\x94\x9d\x7a\xd7\x6c\xf2\xea\x01\xaf\xc6\x07\xdf\x34\xb8\xa9\x57\x03\x69\x47\x34\x44\xe7\x9c\xc4\xcd\x88\x07\x38\x0e\x03\xde\x0f\x53\xb5\x06\x53\x59\x14\x2b\x21\x0d\x53\x88\xa0\xbc\x88\x5d\x34\x25\xb4\xb1\x2d\x72\x69\xb9\xf3\x75\x0d\x51\xeb\x6a\xcb\x30\xa3\xa8\x28\xa3\x84\x22\x92\x3d\x23\xe3\x08\xe5\x58\x16\x05\x19\xf4\x06\x45\x3c\x9d\x22\x52\xd0\x67\xf9\xaa\x8c\xfd\x68\x6c\x89\x05\x2a\xa4\x42\xa5\x2c\x8b\x78\xa8\x25\x45\xba\x44\x25\x56\x18\xa9\x78\xc0\x68\x1a\xf6\x48\xe7\x39\x2a\x69\x69\x0b\xbd\xcf\x73\x23\xac\x9c\x2f\xba\x99\xb8\x94\x38\x0f\xb0\x16\x8f\x00\x02\x21\x1a\x21\xc4\xa9\x2c\x90\xca\xc1\x1f\xcb\xc0\x23\xdb\xa9\xad\xba\xc1\x43\x5d\xaf\xf9\x3f\x4b\x2b\xe0\x4f\x62\xa1\x5e\x7f\x85\x85\xda\xbc\x60\x28\xfa\x09\x8e\x97\xfb\x8f\xf7\x9b\x8f\xf7\x6f\x56\x57\xe0\xdf\x4f\x54\xb8\x5e\x5f\xc0\x81\x6f\xbe\xc9\xdc\xda\xc7\x3c\x13\x3e\xd2\x10\x89\xcf\x64\x04\x49\x52\x28\x53\x50\xc4\x76\x4a\xb9\xa2\xe5\xfd\x43\xe7\xdc\xd9\x39\xd7\x25\x50\x4c\x1e\xcf\x2e\x76\x90\xcf\x16\xba\x77\xf0\x7c\x56\xf3\x95\xae\xb3\x23\x63\x54\x95\x0a\xe3\x78\x44\x95\xe9\x13\xb0\x28\x87\x45\x3c\x6f\x95\x15\xd1\xc2\x32\xc5\x25\x27\xe8\x44\x3c\x6a\xad\x85\xd6\xda\xce\x51\x97\x6a\x65\x3c\x48\xdd\x34\x5a\x42\x24\x5b\x29\x65\xac\x84\x10\xf0\xf0\x10\x18\x9f\x4d\xd4\x78\xa8\x75\x03\x2d\x74\xf1\xd4\x44\xde\x30\x0a\x7e\xb6\xe2\x8f\x61\xdb\xac\x8e\x4f\xfd\x0d\xcf\x08\xb3\xa7\xee\x86\xdb\x6e\xe9\xdb\xeb\x74\x85\x45\x6e\xae\xb0\x48\x39\xdf\xe2\x36\x01\xbf\x5c\x74\xce\xfb\xe9\x98\x9d\x63\xbf\x28\xa5\xd7\x50\xc5\xbd\x6f\x5b\x48\xba\x58\xa6\x97\xd5\x31\x9e\xa5\x12\xf3\xd3\x23\x88\x9c\xeb\xba\xd6\x1c\x16\x9c\xf3\xb3\x10\x02\xac\x13\x66\xb8\xd9\x06\xf0\x1e\xfc\xbb\x89\x93\xed\x82\xbb\x7d\xf5\x95\x2f\x7d\xc1\x29\x2f\x4a\x09\x09\xdd\x09\x7f\xd2\xe7\xde\x7c\x8d\xda\x4a\x0c\x3a\xcf\xe9\xd3\xf5\x81\xe3\x8c\x7c\x91\x46\xfa\xd6\xb4\x4e\x50\x46\x99\x11\x8a\x35\x5e\xf1\x4c\x60\x92\x21\x23\x82\x6a\x84\x1f\xcc\xa9\x96\x95\x0c\xb1\x77\x73\x00\x99\x72\x81\xf3\x6f\x9c\x2a\xc8\x9c\x4b\xf9\xa0\x44\xfe\xb3\x0d\x52\xfb\x98\xeb\xca\x2a\x65\x39\x53\x82\xc6\x3d\x2c\x82\xe1\x34\x82\x68\xc4\x09\x1a\x58\x64\x7b\xc1\xa6\x6e\xfe\x47\xda\xa0\x5c\x33\x9f\xe9\x9d\xa9\x8e\xc2\x29\xab\x6d\x97\x9d\xf8\xc3\xbe\xb7\xca\x2a\xb0\x82\xe7\x47\xb1\x1e\x93\xed\xf8\x93\x89\xe7\xe6\x46\x29\xe7\x46\x97\x20\x91\x11\x5e\x92\x23\xbb\x97\x4d\x9e\xdb\xdd\x15\x06\xb6\x9c\x9a\xaa\x33\x9f\xef\xb2\x1c\x82\xb2\xb4\x94\xc0\x7c\xe2\xb0\x52\x88\x10\x22\x05\x27\x9c\x52\xc5\x09\x89\x9d\x87\xd6\x1d\x10\x64\x4a\x31\x59\x1a\xca\x0f\x84\x70\x9e\x17\x9a\x94\xba\xb0\x1e\x13\xe2\x1d\x44\x45\x3c\x6d\x0e\x18\x49\x2e\x2d\x65\x9c\x33\xaa\x8c\x40\x92\x70\x25\x31\xa1\x51\xc3\x30\x9d\xfd\x14\xb8\x28\x6d\x41\xe1\xd8\x99\x02\x53\x82\x42\x8b\x35\x2d\xac\xed\x27\xb3\xca\x3d\xf8\x59\x86\x1f\x97\x5c\xd4\x1f\xbf\x28\x42\xfe\x79\xf0\x01\xfc\x63\xf0\x4f\xc0\x3f\x5f\x32\x60\x57\x43\xf7\x6b\xf8\x72\xeb\x85\x6f\x72\xf3\x9c\x50\x05\x6f\x2f\x48\xe3\xdd\xe2\x92\xdf\x5f\xc2\xe5\xa4\xd8\x99\xea\xc7\xdf\x25\xcc\x36\xfc\xf0\xf1\xfe\xdb\xcd\x87\x4f\x9f\xef\x57\xd2\x23\x65\xb9\x15\xa2\x36\xad\xcb\xbc\x2f\x4d\xc5\x2b\xcd\x2b\xd3\xd8\x87\xbd\xa1\xdc\x08\x78\xb0\x98\x1a\x9a\xf5\x96\x30\xc3\x22\x9f\xb7\x58\xa6\x43\x04\xac\x80\x14\x0a\x1e\xdb\xd8\x39\x97\xf1\x03\x1c\x0d\x26\xd0\xfc\xd0\x40\xc5\x1c\x6c\x8e\x55\x8d\xa1\x3e\x45\x14\x32\xa0\x2a\x0c\x81\xc3\x68\xbf\xb5\x27\x6f\x99\xe7\xd6\x2a\x2d\x4f\xb0\x3c\xfa\xc0\x02\x0f\x69\x6b\xc0\xbd\x63\x55\xc0\x9d\x63\xc1\xe1\xc6\x32\x6f\x70\xeb\x58\x88\x65\x6c\x46\x5c\x34\xc2\xa9\xde\x50\x2b\xad\xe4\xd6\xd6\x56\x6a\x41\xbd\x1d\x46\x28\x1f\x54\x2d\xc4\xa2\xa9\xb5\x83\xc7\x84\x03\x17\xe0\xff\x0f\x18\xf8\xf7\x52\x07\xd3\xbf\x00\xff\xed\xc2\x13\xb3\xf0\x3d\x5c\x5a\x3e\x97\x92\xcd\x7c\xd3\x24\xb4\xce\x7d\x3a\x76\x4b\x9c\x7c\xc9\xd4\xa4\xd0\x37\xe5\x53\x9e\x49\x25\x5e\x2f\x4b\xee\xcb\x19\xf7\xe1\xb2\x60\x2c\xce\xcc\xdd\xb7\x6f\x33\x96\xe9\x43\x5e\x9c\xaa\x80\xac\xa1\x39\x89\x27\x7d\x26\x7b\x6b\x50\x3c\x65\x55\x66\x86\xe2\xd0\x16\x04\x97\xb9\x29\x98\x36\x8c\x0f\xea\x40\x1f\x81\xab\x8b\x3c\x8e\x93\xd9\x80\x2f\xc0\xae\x8e\x0f\x65\xc8\x86\x89\x54\xf1\xe8\xd6\x83\x54\x84\x95\x12\xb3\x43\x49\xea\x38\x86\x38\x36\x25\x86\x8a\x94\x71\x4f\xd1\x56\x68\xc9\x75\xcb\x35\x23\x0c\x82\xbd\x93\xda\x8f\xa6\xd6\xda\x9b\x16\xe5\x48\x62\xcb\x29\x57\x5e\x4b\x5d\x0d\x8a\x8a\xa9\xb1\x2c\x1e\xb4\x88\x21\xf2\x0c\x45\xcd\x78\xa9\x0b\x02\x4b\xc1\xe7\x55\x95\x11\x33\xc7\x9d\xf3\xf5\xcc\xb3\xe2\x51\xae\x0f\x5b\x03\x7e\x06\x5e\x5f\xfa\xe0\xe8\xb3\xda\x76\x9a\x97\xcf\xf8\xd9\x9b\x77\xcf\x68\x97\xbb\x1b\x36\xe4\x27\xca\x94\xd4\xae\x1f\x1c\x61\x9c\x18\x26\x05\x2c\x1d\x65\x9c\x58\x2a\x05\xc4\x96\x32\x8a\x0d\x15\x32\xe2\x0c\x4f\xe3\x82\xa4\x38\x4c\x67\xe6\x5a\x9a\xdb\x82\x92\xd3\xa8\x9d\x77\x6e\x6b\x88\x91\x4a\xb3\x60\x8d\x23\x5a\xa4\x77\x7a\x7e\x27\x25\x73\xda\x44\xb3\x50\x53\x44\xd2\xa1\x92\x2a\xd4\x10\xcc\x44\xd6\x99\xd3\xe9\x74\x02\x3f\xcf\xf8\xa3\x4d\x1c\xda\xaf\x2f\x95\x5d\x0a\x7e\x9d\xf0\xf3\x7f\x17\xfc\x87\xbf\x41\x51\x36\xe5\x43\x3e\x2d\x4d\xed\x49\xa5\xe0\xd2\xc9\x37\xfb\x24\x57\xa0\xcb\x85\x17\xe2\x2a\xc3\x74\xa9\xff\xce\x8f\xcc\x40\x5a\x41\x53\x41\x16\xfb\x2a\x86\x2a\xee\xb3\xfd\xf1\x60\xa8\xcf\x4b\x88\x62\x47\x10\xd1\x87\xe3\x24\x43\xd3\x40\x1f\x6d\xd3\xac\x48\xe5\xb4\x0f\x50\x8a\x1f\x3a\x5d\x77\x1d\x14\x5d\x97\x8a\xc3\x85\xd6\x5a\x7b\xad\x95\x0a\xd6\x0e\x03\x04\x98\x73\xe7\x99\x10\xdc\xda\x15\x3e\xd9\xd8\x98\xd8\x5a\x7b\x10\xc6\x3b\x15\x9b\x58\x87\x30\x1b\xe9\xc3\xfc\x07\x14\xf0\x9c\xd6\x1d\xfe\x93\xdc\x21\xcf\x78\xeb\xbf\xf5\x9b\x74\xdc\x5f\xfd\x88\x75\xe1\xf5\x4f\xec\xfb\x9a\xe7\x38\x6b\xd6\xec\x4b\x5f\x27\xc0\x66\x0f\xd9\x04\xae\xef\xbe\x9c\x32\x31\xb5\x4e\xeb\xa3\x8e\xed\xfc\x7c\x4e\xdb\xc6\xcc\xdb\xf3\xf3\x17\x97\xe1\x7a\x9e\x06\x99\xfb\x41\x65\x6e\x1a\xb7\x7c\x3a\x40\x66\x8c\x89\xbd\xd6\x3a\x0e\xd3\x00\xb9\x9b\xcd\xae\x73\x0e\xf2\xdb\xad\x68\x9d\x4b\x5a\xbd\x09\xeb\x78\x7a\x74\x5b\xb7\x2e\x2e\xbf\xf3\xc2\x62\x34\x1b\xfa\x5b\x98\xe3\x9b\x17\x64\x31\x1f\x3e\xed\x2e\xbc\x80\xab\xbb\x37\xdf\x2c\x86\x64\x6d\xfd\x7c\xd3\xc5\x13\xa5\x52\x08\x2e\x24\x97\x3e\x50\x99\x80\x8a\x28\x8e\x7b\xe2\x60\x9f\x50\xcf\x6c\x80\xbc\xb2\xb2\x25\xfd\xba\x40\x04\x47\x6a\x11\xa6\x52\x31\xc2\xb8\xf6\xba\x55\x0c\x59\xcc\x61\x05\xf7\xec\xc4\xcf\x22\x9e\x84\x3c\x72\x95\x70\x99\x3f\x4f\x7a\x6c\xf5\x96\xdd\x8c\xcd\x5f\xbc\x74\x77\xfc\xdd\x67\xbf\xef\xe3\xa2\x43\xf5\xc2\xef\x7b\x73\xc5\xc0\xff\x84\x7e\xf8\xa7\xd7\xf7\xef\x2e\xc9\xb8\x5b\xd1\x89\xcc\xaf\x87\xe9\x30\x2f\xe8\x38\x44\x16\x32\x31\x1d\xd2\x7c\xc9\xc4\x3c\x0f\x61\x1b\xc5\xe4\xe7\x77\xd5\xc1\x8f\x63\xd0\xf3\xef\x35\x8d\x3c\xd9\x71\x03\x42\x6c\x42\xb8\x16\x08\x53\x91\x90\x59\x15\xc7\x26\x6a\x58\x35\x10\xab\x38\x18\x63\xe6\xa1\x3a\x86\xe0\x98\x35\x56\xcb\x88\xe0\xb0\xaf\xcd\x00\xcb\xd3\x03\xd7\x7a\xd5\x9d\x6c\xac\x6c\x4c\x24\xd0\xbb\x0c\x64\xcd\xae\xde\x7a\xf0\x1d\xf8\x73\xa9\x92\xf8\x97\xc1\xdf\x4b\x9c\xe2\xdb\xdd\xdd\x37\xf3\xfa\x3c\x3f\x9e\x7a\xc2\x92\x34\xf1\xe7\x4b\x6a\xe4\xee\xcd\x6e\x76\x7d\x3e\x7c\xda\xbd\xff\x7c\xbf\xdb\xa4\xf7\xf7\x73\x8c\xb0\x83\xdb\xa7\x53\x5e\xc2\xc4\x5e\x27\xc5\xea\x73\x81\x33\x92\x2b\x55\x30\x81\x2c\x65\x73\x1c\x95\x4f\x23\x96\xa6\xa4\xd4\x51\x5f\x14\xf0\xdc\xf6\x18\xb3\x26\x1f\x39\x0b\x05\x34\x1d\x46\xbc\xed\x31\x21\xa1\xc8\xf6\x65\xa9\x0c\x71\x45\x09\x1d\x25\x5a\x7a\xe1\xff\x1f\xea\xfe\x1f\x46\x72\x5d\xdf\x0f\xc4\x45\xa9\xaa\x5a\xf6\xf5\xb3\xd5\x67\xee\x9c\xd1\xbd\xf6\xf5\x63\xbf\x3e\x73\x47\xb6\xdf\xbb\x97\x76\x7b\xe6\xf0\xf9\xf7\xf3\x83\xb0\xcf\x5e\xd0\x0b\x63\x41\x60\xbd\x00\xbd\x7f\x00\x3a\xd8\x5d\x62\xb1\xc0\x32\x64\xc8\x90\x21\x43\x86\x0a\x15\x2a\x54\xa8\x50\xa1\x42\x85\x15\x56\x58\xa1\xee\x4c\x89\xb5\x10\x55\xd5\x5d\x3d\x33\xc7\x30\x16\x4e\xb6\xcf\xa9\xea\xaa\xea\x9e\x46\x95\x24\xf2\xfb\xef\xf3\x47\x70\xc3\xad\x28\x11\x24\x04\x6e\xdb\x1c\x19\xbe\xbc\x90\xf1\xb4\x38\xf0\x0a\x1b\x6d\x0b\x98\xcb\xa6\x40\x05\xc6\xac\xd0\xbc\x28\x30\x42\x85\x01\x39\x82\xaa\x1f\x97\x85\xdc\x57\x9c\x18\xa2\x24\x13\x4c\x09\x10\x69\x29\xf5\xaa\x1f\x32\x9d\xcd\x4e\x27\xc7\xa0\x2f\x5b\x44\x7f\xf9\xe2\xd0\x7d\x19\xea\xbe\x26\xb2\x5d\xe5\x1b\xaf\x00\x8c\xa7\x8f\x77\xeb\x00\x2d\x05\x4a\x5f\xb5\x5e\xf6\x15\xd1\xad\x56\x2d\x3b\x08\x7f\x04\xc4\x9b\x7a\x18\x24\xca\x69\x8e\x00\xea\x25\xcd\x11\x41\x49\x4d\x88\x62\x9e\xe6\x25\x97\x9c\xf8\x3d\x28\x9d\x90\x4a\x81\x86\x79\xbe\x87\x98\x14\xa4\x2c\xf7\xfb\x22\xa7\x18\x05\x3e\xec\xaf\xc0\x14\x38\x49\x3a\xfa\x43\xf4\x2f\x2f\xfc\xe1\xff\x10\xb1\xa0\xe5\xfd\xbf\x47\xff\xd7\xed\x7b\x4e\x9e\x7e\x0c\xcd\x94\x37\x9f\xde\xbc\x8b\x93\x17\x0e\xfb\x7a\x7a\xe2\x64\x85\x8a\x5f\x0b\xf6\x6f\xa4\x64\xbf\xe1\x2a\x7d\x7c\xfc\xdd\xf2\xf8\x16\x01\x19\x13\x50\x56\x41\x33\x5e\xa7\x36\x05\xcc\x37\x69\xc1\xa0\x45\x35\x2c\xb2\xb4\xca\x38\x61\x94\x50\xa1\x58\x09\x4f\x4b\x4a\xdf\x6d\xaa\x12\xd9\x02\x7f\xe9\x13\xe4\xea\x7a\x7f\xa2\x87\xba\x6e\x6c\xd7\x01\xd2\xcf\xc7\xf0\xcd\xf5\x7d\xaf\x95\x54\xd2\x80\x46\x0b\x26\xd5\x2e\x95\xcb\xf1\x10\x5d\xad\x7a\x9f\x4d\x00\x42\xcf\xbc\xdb\x2b\x09\x8f\xe6\xa0\x24\xaf\x6b\x80\x63\xa5\xd4\x41\xea\xd2\x48\x9f\xce\x93\x50\x42\x29\xa1\x04\xc0\xcb\xfe\xd5\x5f\xee\xf6\xc2\x4f\x44\x53\x41\x39\x61\x52\x06\x4c\xd9\x9f\x81\xe9\x8c\xee\xdc\x8e\x47\xbf\x0a\x9e\xc5\x8f\x17\x84\xe0\xdf\x5e\x2a\xc1\xff\x31\xfa\x9f\x57\xdd\xad\x35\xb3\x0b\x5d\xd6\xe7\xc7\xdb\x9b\xbe\xd5\x92\xae\x7c\x85\xd3\x79\xfc\x7a\x67\x4f\x3e\x3e\xfc\x0e\x3c\x7c\x7c\xb8\xbb\xb5\x06\x3e\xc4\xc2\x76\xc7\x02\xa4\x83\x2f\x66\x19\x73\xd3\x1f\x0a\x10\x8d\xbe\x88\x8f\x9a\x97\x4c\xcd\xce\xb0\x92\xea\x6c\x23\xa6\x20\x9d\xe2\x3e\x73\xa0\xfc\x1e\xc0\xbd\x0d\xb4\xd6\x3d\x10\xa7\xf6\xfa\x68\x5a\xe7\xc7\x44\x36\x47\xbe\x8f\x87\x63\x2d\x9a\xe3\x8e\xcf\xa3\x21\xa5\xc6\xb4\xd2\xcf\x8f\x72\x88\x38\x2a\x58\xb8\xf7\xce\x47\x5c\x31\xad\x99\xe2\x00\x2d\x95\xde\x71\xb9\x1b\x38\x1f\xd8\x81\x49\x6a\x10\xa3\x4c\x88\x90\xab\xfc\x9d\x38\x3d\x17\x77\x75\x72\xfc\x2a\xa6\xfd\xf3\xe8\xe7\xf5\x38\xfd\xbf\x39\x06\x71\xb3\xa1\x63\xf8\x70\xfa\x33\x07\xda\xf7\x00\x8f\x36\x5c\x52\x3d\x10\x17\x1b\xea\x1e\x88\x71\x6d\xfb\x94\xb2\x3e\xf2\x31\xae\xfb\x8e\x76\x7d\x72\x9c\x27\x26\xb9\xd6\x5c\x32\x80\x39\xe7\x7e\x7f\x91\xc8\x1a\xf8\xc4\x44\x69\x0a\x5a\x10\xcd\x8a\x90\x67\x81\xe6\x4c\xb6\x6a\x67\x9e\x35\xea\xfe\x51\x04\xa3\x3f\x04\x2e\xf9\x55\x4a\x27\x94\x76\xdf\x21\x38\x5d\xe5\x65\xd6\xdf\x78\xff\xeb\xf5\xd9\x6a\xc0\xe1\xda\x3d\x05\xd8\xb8\x2c\xdf\xb7\xbc\xf5\x0c\x8c\xbe\xa8\x97\x33\x62\xca\x12\x44\xcb\x9e\x6d\x08\xf1\x15\xc9\x91\x34\xd8\xa4\x99\xe4\x9c\x02\x59\x96\xd2\x94\x1a\x52\x22\xd0\xb6\x9e\x9c\x39\x80\x08\xc1\x5c\x57\xaa\xae\xb4\xf1\x58\x8d\x6a\xb9\x9b\x45\x83\x09\x1b\x41\x5e\xe0\x82\x30\x45\xd3\xcc\xf2\xf0\xd4\x10\xaa\xc9\x12\xc7\xea\x33\x0e\x18\x94\x6b\xae\xf1\x57\x81\x11\xf2\x6f\x5f\x3a\xe1\xaf\x34\x05\xae\xb8\x8a\xeb\x1e\x1d\xaf\xed\xa4\xb7\x0f\xf7\x6f\xff\x06\xbc\x7f\xba\xe5\x54\x83\xe7\xbe\xd2\xf2\xaf\x6e\xff\xd1\xdf\x80\xb5\xd3\x14\xd3\xcd\xf1\x4b\x66\xc7\x11\x88\x83\x99\x66\x6e\x32\x4e\x84\x70\x92\x73\x2e\x79\x57\xe6\xd6\x54\xdb\xf2\x0b\x6d\x75\x5c\x99\x52\x10\x02\x29\x81\xf9\xa9\xd6\x08\xa9\x32\xd6\xd6\x7a\x6c\x32\x2b\xa8\x72\x8a\x99\x8a\x0c\xbc\xd3\x83\x46\x58\x95\x3b\xea\xa5\xaa\x96\xaf\x79\xe4\xa4\x24\x58\x2d\x55\x12\x23\x8a\x30\xdf\x9e\x23\x0a\x10\x60\x71\xa6\x3c\x42\xa4\x6d\x4f\x4a\xb2\xcc\x66\x79\x99\x30\x68\x45\xa1\xd2\x19\x03\x22\x19\xc3\x84\x10\x26\x64\xa9\xa9\x22\xbd\x81\x96\x17\x41\x7f\x25\xce\xcf\x34\x69\x76\x30\x78\xcd\x86\xe8\xfe\x82\x3d\x0b\xf3\xe4\xc7\x38\x07\xe6\x08\x22\x2a\x31\xcb\x59\x99\xc3\xf4\x1c\x1d\xa7\x1d\x9c\x7b\x5f\xcf\x6e\xcc\x6c\xa6\x41\x1d\x4b\x00\xa3\xbf\x13\x8b\x80\x67\x53\xd1\xaf\x2f\xb5\xe5\xba\x73\x2c\xfb\x46\xf4\x0d\x82\x25\x14\x96\x5f\xa3\x70\x5f\xd7\x9a\xe0\x39\x75\xf8\x16\xc5\x9e\x58\x93\x32\x2c\x44\x95\x2a\xc1\x18\x27\x46\x3a\x19\x4b\xcd\x90\x14\x55\xa6\x05\x67\x8c\x18\x61\xe5\xa9\x37\x45\xa1\x51\x6c\x74\xf8\x46\xdd\x09\xb9\x63\x82\x4f\x7d\x15\xa7\xf3\x94\x64\x6e\x4e\x9d\x8b\xa7\x39\xdd\x29\x5a\x62\x4c\x25\xcd\x73\xca\x95\xa4\x92\x4a\x32\x4e\x16\x63\x2a\x18\xa2\x5c\x09\x16\x5e\x51\xd0\xb0\x42\x8a\x70\xef\xa9\x77\xfb\x03\x90\x47\x6f\x94\xf1\xce\x63\x8c\x41\xef\x27\xb3\x72\xb2\xc7\x33\xdd\x92\xa0\xc9\xb4\xec\x0b\x7f\x1b\x7a\xd1\xdf\xba\xfc\x5f\x12\xfd\xc0\xbf\xb9\x74\xa3\xaf\x33\x85\xaf\xf0\x21\xcf\xdd\xe7\x5b\x20\x44\x9c\x81\xd2\x04\x74\x48\x36\x33\x90\xf9\x2e\x3e\x1a\x9f\x99\x06\xd4\x9e\x31\x56\x96\xa5\xae\x86\xda\x20\x2e\x89\xc4\x6d\xc9\x30\xce\x31\x2e\xce\x11\x54\x92\xb3\x5c\x11\x55\x82\x54\x52\xca\x84\xb7\x82\x69\xaa\x76\x29\xe7\x8a\x29\xc5\xfc\xfe\xa0\xd4\xa1\x97\x53\x9a\x95\x04\xb5\x06\x42\x8a\x5c\x8d\x74\xe1\x47\x46\x32\x95\x91\x23\x14\x25\xcf\x52\xc1\x5c\xa1\x3c\x27\x9c\x0b\x02\x89\x26\x9c\x06\x4c\x10\x8d\x0f\x41\x7b\xe8\x77\xd1\xbf\xba\xa0\xb3\xe9\xf3\x7c\xf7\x17\xf4\xe0\x82\x58\xdc\xc3\xdd\x8b\x5e\xc9\xe3\xc7\x35\xd9\x5a\x31\x7e\x1f\x7e\x7e\x5c\x4a\x9e\x1f\xdf\xbd\x09\x8c\xd9\x0f\x8f\x77\x4f\x1f\xb6\xd8\xe6\x30\x8e\x04\xd4\xce\x70\xeb\xec\xc0\x5b\xdd\x52\x29\x24\xf4\x35\x11\xbc\x3e\x19\x9d\xc5\x66\x46\x28\xb6\x4a\x95\xa5\x9e\x15\x34\x0e\xa2\x52\x76\xae\x63\xd8\x1d\xfb\x7d\x51\xd8\x73\x84\x50\xc1\xeb\xac\x23\x3b\x5d\x94\x58\xb7\x96\x09\xa9\x98\x20\x1a\x53\xce\x51\x29\x2d\x67\xc2\x8d\x45\x21\xcb\x51\x72\x59\x14\x83\x6c\x30\x62\xd6\x0f\x04\x0a\x91\xc3\x73\xc4\x73\x94\x73\x8e\xa3\x28\x06\xd5\xb9\x0c\x75\xeb\x3f\x8a\xfe\xea\x17\xd8\xfe\x8f\x6b\xcb\x19\xbe\xb9\x98\x16\xae\x9c\xa5\x4f\xf7\x1f\x37\x84\x0a\x0d\x72\x7f\x74\x82\x51\x6e\x84\xe5\x8d\x38\x02\xc4\x05\x02\xd9\xa1\x28\x04\xd5\xb2\x6f\x75\xb3\x93\xa6\xc8\x3a\xcd\xb5\x16\xdc\xb7\x80\xd4\x5c\xa9\x46\xd7\x59\x6a\x4f\xc4\x53\x88\x38\x17\x1c\xd4\xc4\xf7\xfe\xc0\x0e\x20\xeb\xaf\x5e\xcb\x32\x68\x48\xfc\x2e\xfa\x18\xfd\xc7\x1b\x6d\xcb\x8b\x81\xe4\xcb\x09\x79\xb7\xbb\x7b\x7a\x7f\x61\x32\x5c\x46\xb2\x7f\x04\x97\xb9\xf9\xea\x49\xfb\xf6\x2b\x3b\x94\x8f\xaf\xfe\x4b\x98\x59\xf5\x50\x7a\x5f\x20\x60\x2b\x5f\xa5\x14\x73\x54\xc2\x42\x5b\xaa\xb3\x94\xc4\x90\x31\x8e\x7d\x19\x73\xa2\xb4\x22\xa2\x94\xa6\x21\x95\xa4\xd4\xf7\xb6\x5a\x27\xa7\xd2\xdb\x30\x4b\x3c\x7e\x2e\xe3\x2c\xd8\xa2\x54\x80\x7b\x05\xcc\x4e\x51\xc5\xa5\x37\x5a\x09\x90\xa7\x84\x08\x82\x31\xa6\xf5\x88\x20\x84\x9c\x72\x6d\x74\xaf\x19\x36\x18\x31\x8e\x14\xa2\x94\x7b\x7c\xaa\x12\xee\x94\x52\x5a\x09\x63\x84\xd2\x81\x34\xff\x2b\xd0\x9c\x59\xc8\x17\xd7\x4a\xf4\xaa\xb4\xf3\x57\xcf\x4c\x82\x2b\xaf\xf3\xf2\xf9\xae\x11\xe3\x39\x31\x7c\x35\x57\x06\x0f\xf7\x3f\x6e\xfe\x09\xb8\x7b\x58\x71\xe5\x3f\xdf\xbf\x52\x91\x4a\x46\x40\x5d\xf0\xbd\xaf\x4f\x08\x58\xdf\xb8\xa5\xac\xee\x4f\x88\x97\x16\x71\xd0\x26\xe8\x34\xd8\x5b\x52\xd0\xac\x01\xa2\x20\x02\x1a\x54\xc4\x67\xfe\x78\x8e\x98\x52\x7c\xaa\x93\x88\x9a\x9a\x58\xd0\x38\x47\x5d\xb5\xc3\x84\xf8\xb6\x54\xaa\x54\x8c\xb1\xd4\x38\xea\x8c\xd7\x73\x09\x8e\xcc\x1f\xa9\x9f\x28\x68\x4e\x07\x4e\x9d\xd0\x4a\x9a\x3a\xae\xe7\xa3\xe0\xa5\x46\x0c\x09\xad\x70\xa8\x7b\xd2\x90\x33\xab\xe8\xb7\xa1\xea\x21\xd1\x7f\x8c\xfe\xd7\xe8\x3f\x2d\xd7\x46\x30\x6e\x79\x91\x19\xbf\xe2\x2f\x7e\x7e\x7c\xff\x36\xf9\xe1\xa6\x58\xfd\x97\xc9\x9b\xc7\xfb\x2b\xc8\x22\x79\xb8\xff\xc7\xe0\xe1\xe9\xee\xe1\x2f\x7e\xff\x21\xf9\xfd\x72\x10\xde\xbf\x6a\xeb\xbf\x7d\x91\xe1\xd9\x8c\x2d\xcc\xf5\x52\xcf\x0a\x08\x8c\xeb\xe6\xfd\x58\x97\x94\x49\xa2\xfd\x64\x0d\x63\xa8\xc8\x30\x2a\xac\x6b\x6c\xcc\x4b\x68\x61\x89\x40\x56\x36\x20\xdf\x13\x3f\xb6\x4d\x39\x62\x74\x30\x49\xc5\x18\x44\x90\x40\xec\x8f\x5a\x5f\xd5\x39\xb7\x7b\x42\x73\x6d\x4a\xb1\x6c\x61\x82\x0a\xa5\xf7\x7a\xee\xfd\xe1\x68\x96\x54\x5c\x0f\x00\xc7\xc5\x9f\xec\x6e\x6a\x85\x46\x5a\x7a\x3e\xa7\x92\x56\xd2\xfa\x03\xa5\x5d\x6c\xc4\x2c\x57\x65\x00\x38\x25\xe4\x1c\x29\xdf\x88\xa0\xa1\x18\x0f\x97\x9e\xcd\xef\x43\x05\xf4\xaf\x5e\x62\xd9\xab\xb8\xf5\x5f\x16\xca\x76\xa9\x49\x39\xe1\xaa\x4e\x2b\xcd\xb4\x21\x5a\xd6\x72\x96\x86\x62\x2e\x6c\xa6\x25\xe7\xa2\xd4\xd2\x4a\x30\xa8\x9c\x49\x3a\xdb\xf0\x6d\x33\xda\x53\x64\x77\x8a\x13\x54\x4a\x5e\xa6\x94\x49\x4e\x58\x29\x48\xb7\x57\x05\x56\x04\x63\xc2\x14\x27\x9c\x08\xd2\x37\x50\x0b\x2c\x38\xb4\x0a\x2b\x4f\xfd\x50\x37\x00\x07\x6e\x58\x7d\x2e\x43\xef\xf7\xcd\x05\x7f\xf1\xdd\x7e\xd3\xbb\xf5\xf9\x85\x3a\xfa\xf1\xe1\x3e\x4c\x72\xee\x1f\xef\x2f\xe6\x21\x4b\x7e\xb0\x2a\x72\x84\x6d\x79\x1d\xf4\xdc\x3f\xec\xde\x3e\x3c\x43\xa5\x43\x56\xbb\x7d\xfb\xf0\x31\x86\xa0\xb4\xa0\x0f\x59\xb9\xf5\x38\x34\xf4\x47\x0b\x8e\xce\xf9\x0c\x54\x7e\xd0\x8d\xb5\xb5\x06\x85\xe7\xd6\x8b\x0c\x60\x3d\x60\x29\x9a\xd4\x3a\xed\x0f\x29\xb0\xbe\x00\xe3\x5c\xc5\xdc\x17\xb1\x58\x6b\xfd\x1d\x64\x8c\x31\x43\x29\x63\x9a\x90\x5e\xf5\x5e\x52\x90\x35\xf5\x49\x80\x6c\x02\x8c\x79\x0c\x7a\xee\x9b\x63\xcd\x45\x05\xea\x43\x5d\xfb\xa9\x28\x80\x55\x54\x11\x42\xba\xb5\x57\xbb\x89\xa3\x73\xb9\x31\x3b\x1d\xbd\xbb\xf0\x2b\x5e\xf3\x4f\x9f\x56\x4c\x49\x20\x90\xfe\x92\x8e\x54\x0c\xf7\xd5\xe1\xd0\xb6\xe3\x6c\x40\xd4\xf7\xfb\x18\x53\x56\x20\x48\x8a\xc2\x1f\x8c\x09\x9a\x8e\xb9\x3f\xec\x52\xa5\x0c\x37\xcb\xbe\x63\xf8\xdc\x9d\x5a\xbe\xa4\x65\x44\xfb\x26\x99\xfc\x51\x7b\x19\xf0\xb3\x7f\x17\x34\x01\x23\x73\xdd\x8b\xfe\x18\x7d\x0a\x1d\x97\xff\x21\xfa\x3f\xa3\xff\xfb\x3a\x93\x09\xfb\x50\x90\xa4\x7d\xee\x70\xbe\xbb\x7b\x7a\xfb\xeb\xdd\xdd\x0b\x7d\xf9\x59\x39\x6d\x09\xb0\xc9\x2b\xa6\xc8\x85\x34\x76\xd1\x97\x7e\xbb\x0d\x12\xb7\x6f\x1e\xee\x5f\xb9\xa3\xfd\xfe\xcd\xe3\xee\xed\xbb\xcd\x1e\xc1\x58\x7c\x31\x9b\xe8\x8b\xd4\xb1\xcc\xa1\xa7\x1b\xfd\x45\xdb\x84\x9f\x2a\x50\x4a\x58\x95\x90\x90\x92\x5a\xc8\x09\xe1\xb8\x60\x3a\x2f\x51\x4e\x20\x84\x03\xc6\x88\xe5\x1c\xc2\x2a\xe3\xca\x08\xe7\x9c\x4b\x78\xb6\xac\xe6\x14\xf0\x3c\xcf\x52\x91\x12\x42\x28\xc6\x22\x95\x3b\x4d\x98\x54\x62\x2f\x4b\x34\x1f\x7d\xab\xb8\x9f\x52\x2b\xd3\xa1\xc4\x12\x19\x2a\x88\x44\x48\x49\x49\x3d\x17\x4a\xd0\x0c\xb4\x33\x2a\x97\x9c\x03\xba\xd6\x32\x0b\x08\x28\x0f\xca\xd7\x0a\x97\x7e\x72\x5c\x80\x14\x98\x19\x43\xac\xf3\x86\xa3\x62\x8f\x81\x10\xcb\x99\xbe\x8b\xf3\xd0\xcf\xd2\x97\x9a\x0c\x45\xff\x3e\xfa\x4f\xd1\xff\x71\x7b\xb6\x9f\xb5\x5d\x57\x57\xa4\x4b\x79\x7f\x7f\xa1\x0e\xbf\x80\xe9\x1e\xee\xbf\xb5\xb9\x5a\xf1\x94\x4b\x35\xf4\xed\x8b\xdb\x0b\x2c\xb5\x73\x5d\x57\x37\x6d\x6b\xbb\xae\x69\x3a\xb7\xdf\xef\xf7\x49\xa6\xb3\xac\x19\x68\xdb\x57\x2d\x03\x59\x03\x30\xa7\x48\x16\x4b\x4a\x2f\x72\x81\x20\x17\xd8\xca\x06\x68\x80\xaf\xaf\x50\x86\x35\x6f\x7c\x45\x96\x5f\xdb\xee\xab\xca\xd4\x33\x6e\x8c\x77\x40\x98\x26\xee\x6b\x8f\x9d\x27\x2e\x11\x24\x87\xb5\x30\xbc\xef\x94\xee\x7c\xe3\x27\xac\x6c\x69\xd4\x69\xa4\x34\x37\x39\x5a\x0a\x00\x23\x0c\x68\xf4\x97\xee\xf2\x4a\xc9\x89\xe6\x0a\xb4\x54\xd9\xd2\xaa\x68\x03\xfa\x33\xdd\x1c\x03\x87\xfc\x0f\x17\x16\xc4\xd5\x4d\x6a\xdd\x10\x5e\xcb\x4b\x85\xa5\xbe\x22\xb2\x56\x1b\xa9\x57\x3d\x90\x44\x22\x08\x22\x06\x61\x7d\x8e\x0e\x07\xaa\x68\x09\x29\x41\xd0\x4f\x20\xf5\x43\x0b\x11\x99\x60\x21\x29\xca\xf6\x42\x09\x25\x74\x9c\x33\xac\x11\xdb\x29\xca\x4c\xa7\x4d\x67\xe6\x41\xd0\xcc\x64\x10\xc7\xa9\xe9\x4c\xed\x4c\x89\xe7\xae\xb1\xa7\x86\x1c\x0c\xaf\x1a\x5b\xd1\xda\x2e\x7b\x5a\x73\x2e\x83\xc6\xf3\x9a\x63\xff\xf5\x57\xf9\xf5\xd3\x73\x7e\x7d\x7f\x9d\xe3\x5d\x35\x29\x5e\xcb\x2f\x2d\xa7\x39\x4e\x01\x5a\x6b\xec\x7c\x96\x07\x3f\xc4\xd3\x73\x22\x0d\x8e\x58\x9b\xa5\x1c\x6f\x34\x13\xd2\xe8\x96\x4f\xc6\xef\x01\x96\x0a\x01\xba\xcb\x84\x50\x4c\x4a\xe6\xf7\x93\x36\x20\xda\x0b\x2c\xf3\xcc\x29\xc4\x97\x2d\xd9\xd7\x80\x18\xa5\x4c\xaf\x4c\x96\xea\x7c\x89\x27\xd9\x99\x6d\x87\x9d\x8c\x8a\xe8\xbf\x7b\xee\xa7\xbc\xdb\xdd\xdd\x3f\x93\x48\x1f\x3f\xde\x96\x60\x8f\xf1\xdd\x87\xb7\x17\xc3\xd5\x4f\xe0\xdd\xa5\x65\xbc\xb2\x5d\x9f\x4d\x5a\x1e\x9e\x67\x6d\xc1\x66\xe3\x55\xfe\x21\x4b\xa5\x29\xcd\xa1\x42\x45\x99\x4b\x30\x12\x51\xa0\x1c\x17\x30\x4f\x15\x14\x48\xa5\xa9\xb0\xa4\x02\x85\x80\x63\x58\x40\xa0\xf0\x63\x63\x73\xaf\x7d\x91\x8f\xcd\x92\x62\xee\x09\x29\x00\xca\x40\xaf\x35\x03\x58\x15\x44\x62\x4f\x09\xd2\xa8\xdc\x49\x89\xa1\xaf\x20\x62\xa4\x10\x5a\xd7\xda\x17\x4d\x66\x32\x06\x0a\x7f\x74\x18\x16\x30\x2b\x11\x8d\x61\x36\x8f\x04\x72\xa9\x20\x94\xca\xf8\x29\xcb\x55\x89\x4c\x96\x83\xdc\x28\x52\x40\xa3\x35\x2d\x89\xcf\x0b\x46\x70\x49\x98\xc0\xc1\xab\xf7\x2e\x86\x97\xf5\xfb\x67\x11\x7e\x9e\xaa\xd1\x5b\x95\xa5\xb0\x1f\x06\x09\x83\xd5\xaf\xf1\xe1\xc7\xed\x92\x4f\xaf\x61\x36\x8c\x1d\x3f\x5e\x14\x88\xc2\x91\x01\x0f\xab\x22\x4f\x72\xb1\x1c\xba\x5a\x0f\x6d\x8e\x45\x1e\x63\x77\xc2\x2e\xce\xf3\x3c\xce\xca\xa6\x33\x38\x37\x78\xf2\x74\x0f\x72\x2a\xed\x8c\x2c\x46\x02\xe0\xde\xcb\x7e\x39\x8c\xb0\x6b\x3b\x04\x46\x5f\xc7\xfb\x3d\xb1\xaa\xb9\x68\x70\x40\xbf\xf7\xf4\xe5\xf1\x4e\x97\xd4\x1f\x8d\x9c\x70\xe1\x47\x9d\x67\x3d\xa3\x48\x99\x9a\x1b\x34\x2b\xc6\x62\x9d\x67\x86\xd7\x06\x21\x54\xd2\x2e\x4b\x35\x9c\x73\x57\x36\xbd\xf6\x56\x6b\xed\xed\x25\x4f\x1d\xcf\x32\x68\x8f\xfc\x36\x68\x84\xff\x1c\xfd\xbb\xe0\x7c\xf5\xbf\x5c\x10\x30\x6b\x85\x11\x7a\x14\x1f\xc2\xf0\x20\xbe\x4c\xe5\x83\xc4\xf9\x55\x02\x0e\xbc\xfd\xf5\xff\x0f\xbc\x0d\x7b\xfc\xe3\xdb\x5f\xdf\x7d\xf8\xf4\xaf\x41\xf2\x1a\x6e\xf9\xfb\x0f\x8f\x4f\xcb\x85\xb7\xfd\x6a\x8e\xb4\xaa\x2a\x2f\xb7\x04\xdb\x34\xdf\x0b\x07\x19\x3e\x47\xa9\x30\x2c\x35\xb6\x2a\xf0\x92\xea\x6b\x0c\x55\x8e\x92\xa9\xa4\x8a\xb2\x51\x69\x81\x62\x43\x84\x32\x65\x6d\xed\x92\xd9\x73\x52\xee\x31\x21\xe8\xd4\xa3\xe5\x17\x37\x91\xf9\x2c\x8c\x5b\xc7\x4a\x80\x76\xdd\xce\xa0\xa2\x48\x4f\xb5\x2e\x0d\x07\x91\xdf\x0f\x74\xdf\x59\x50\x31\x9f\x82\xbc\x28\x19\xa6\x14\xe4\x23\x33\x8c\x1a\xaa\x34\x2f\xd9\xe8\x33\xd1\x08\x82\x0c\x16\x1c\x59\x48\xb8\x65\x84\xb0\x9c\x70\xcc\x98\x2f\x3d\xb1\x41\x2d\x25\x34\xcf\xc2\x2d\xf0\xec\xb2\x73\x79\xa7\x77\x36\x82\xa1\xbf\xff\xdf\x04\x07\xb1\x08\xac\xc9\x4c\xf6\x8a\x55\x16\x74\x4c\x1f\xef\x83\x48\x36\xb8\xad\x6e\x56\x06\xf1\xdb\x0b\x0f\xe1\x8f\xdf\xb0\x11\x3e\xdc\x69\x39\x63\x9e\x28\x6e\xe9\x12\x27\x8b\xe2\x64\x99\x92\x20\x32\xb5\x8a\x11\xaa\x51\xee\xf3\x78\x0a\xac\xca\x0a\xf4\x27\xbc\xb7\xb2\xed\x00\x02\x25\xc3\x1a\x53\x4d\xb1\x41\xc4\x0b\x5d\x2a\x6d\x80\xc0\xb9\xcd\xd0\x76\xf2\xf5\xbc\x97\xf3\xd4\xe7\x36\x97\x80\x12\x2c\xa5\x8d\x21\x60\x02\x11\x3a\x2f\xa5\x8c\x32\xa6\x45\x54\x32\x28\xd4\x7c\x94\x1a\x6b\x91\x4b\x8b\xad\xcc\xc9\x60\x69\xd5\x3a\x57\xd4\x81\xbb\x10\xfa\x32\x72\x93\x5e\xba\x7c\x17\xd7\x96\xfb\xf7\x37\xd8\xb6\x37\x2f\xc5\xcc\xeb\x29\x73\x2c\x62\xe2\x09\x48\x61\xa1\x14\xb3\x39\x1c\x5a\xf2\x8c\x77\x4d\x0e\x7e\x6f\x62\x4c\x08\xd5\xd0\xe2\x62\x93\xce\xd4\x37\xcb\x32\x6e\xc7\xa0\x10\x45\x93\xd2\x78\x61\x41\xfa\x65\xd8\x74\xa7\x86\xb2\xdc\xe6\x4b\xc2\x15\xc3\x73\xb9\x89\x76\x38\xf4\x9c\xbe\x5b\x54\x6c\x22\xe7\x38\x2b\x8b\xac\xc4\x85\xab\x7a\xbb\xc3\xdf\x4d\xe4\xa3\x68\x07\xfa\x33\xd9\x90\x67\xee\xdb\x3f\xb8\xf0\x79\x2e\xf3\xc1\xab\xa9\xc6\xab\x06\x7d\xbe\x94\x59\x6e\x08\x5f\xc4\x50\xae\x38\xa8\x28\xb2\xa8\xdc\xa1\xcf\x87\xc4\x1e\x67\x33\xcd\x6e\xef\x19\xd9\x2b\x69\xaa\xaa\x2d\xbb\x2a\xba\x8b\xe8\x99\xdc\xb9\x64\x88\xb6\xc1\x2b\x14\x47\x7f\x1b\xf4\x87\xaf\x2c\x81\x97\x4c\xfa\x6b\xc9\xb7\x17\xa0\xd4\xc7\x8b\xd9\xd7\xc5\x4a\xf5\x05\x53\xf2\xfe\x76\x2d\x5e\xea\x85\xcc\x19\xa9\x6c\x5c\x3b\x30\x84\xb0\xe4\x87\xb8\x64\x1c\x53\x28\x70\xe1\x99\xf3\xd2\xc5\x85\x1f\x96\x52\x3b\x16\x1e\x81\xe1\xf3\xb1\xb6\xd2\x56\x89\x63\xa5\x44\x05\xa1\x02\xa2\xb8\xe1\x58\x66\x39\xc6\x8c\xe1\x1c\x7e\x19\x35\x6f\x4c\x93\x0c\x25\x55\xac\x94\x84\x10\xdd\x95\xf3\xc4\x56\x55\x71\x31\x1f\xe2\x7c\xee\xe2\xae\xec\xb4\x26\x45\x49\x8d\x28\x5b\xd7\x20\x49\x30\xa7\x84\x61\xd7\x20\x8c\x29\xe2\x25\x43\x45\x41\x8f\xa3\x18\xa2\x28\x4e\x8a\x28\xdf\xd9\xc4\xbc\x28\xd7\x5f\x27\x43\x97\x8f\x1b\xd2\xa7\x8f\x0f\xdb\x43\xa9\x2d\x50\xde\x80\x68\xe6\x20\x5f\x92\x97\x23\x02\x2c\x60\x97\x12\x23\x61\x2e\x8c\xf0\x16\x48\x61\x18\xd4\xf9\x4c\xf4\x92\x17\x1f\xce\x38\xcc\xe5\xfe\xec\xab\x59\xf1\xc7\xd0\x9f\x7e\xfb\x1c\x02\x96\x85\x7a\x8b\x02\xfc\x27\xe0\xe3\xc3\xdb\x77\xff\x19\xec\xf7\x9d\xb6\x5f\x26\x1b\x53\x58\xd4\x08\xce\x63\x6b\xdb\x8d\x5e\x7b\x0c\xd0\x1b\x96\x34\x27\x6a\xaf\x7c\xc8\xe5\x56\xcb\x66\xe2\xfb\x38\x1a\x3b\x3c\xf4\xdb\xc3\x51\x88\x23\xc6\x88\xb0\x59\xfb\xbd\x2f\x7d\xc3\x00\x05\x2e\x66\xde\x4d\xc6\x98\x76\x26\xe0\x48\xfd\x81\xfb\x23\xdd\x53\x49\x0d\xa2\x88\x68\x86\xa2\xbb\xb8\x38\xd3\xc0\x57\x7c\xa9\x23\xff\x43\xe8\x48\x5f\xb4\x09\x5e\xda\xa2\x9f\xbe\x15\x27\xf8\xf4\xf1\x7b\xb5\xe4\xf6\xe9\x66\x8e\xfc\xd3\x6d\x7e\x0a\xd6\xd6\xce\xcf\x0f\xdb\x83\x65\x84\xab\x2a\xad\xe4\x52\x13\x2b\x7a\x98\xe5\xcb\x2b\x52\x97\x96\x1e\x40\x67\x72\xaa\xe9\xac\x4d\x4e\x15\xd9\x66\xee\xcb\xe0\x62\xe9\x0a\xac\xa9\x62\xb6\xef\x89\x6f\x3b\xca\x19\x85\x8c\x21\x9f\x82\xa1\xf2\x06\x01\xa8\xfd\xb8\x53\x5d\xc9\x94\xa4\x59\x2e\xb8\x92\xcc\x50\x55\x4f\xdd\xfa\x52\x21\xb8\x52\x4c\x73\x55\x4f\x02\x36\x9a\x28\x1b\xee\x7d\xe4\xf5\xf1\x08\xf4\x7e\xc0\x58\x6a\x6e\x44\x4d\xac\x3d\xf8\x89\x53\x64\x30\x05\xad\xf1\x9d\xd4\x74\x1f\x45\xd1\x16\x4c\x17\xcd\xef\xc7\x88\x5e\x66\x79\xb7\x0a\xa2\xb7\xa0\x9a\x57\xf6\x67\xe0\xda\xae\x78\xb7\xbb\x7b\xb1\x6c\xbb\x2a\x7d\xaf\x70\x90\x67\x8b\xbd\xdb\x86\x72\xa8\xec\x6a\x03\xb9\xad\xeb\xce\x08\x28\x38\x29\xf1\x20\xbb\xa2\x06\xd8\x15\x88\xb3\x58\x1f\x35\x44\x82\x23\x9d\xe5\xd4\x1e\x8f\x20\x1f\x11\x86\xa9\x58\xb6\x46\x41\x30\x72\x5c\x43\x1d\xa7\xd5\x69\xb4\x36\x29\x56\x23\xc2\x1d\x83\xb2\x69\x74\xab\x47\x24\x71\x41\x00\x9a\x2a\xa5\x2b\xdd\x52\x2c\xa5\x3f\xb6\x04\x33\xdb\x14\x18\x87\x5f\x31\x04\x4a\x58\x41\x44\x58\x73\x30\x42\x3a\xcf\x4e\x7b\xce\x93\x40\x97\x0b\x1c\xa2\x04\x0c\x67\xb2\x8d\x76\x26\xe4\xbb\xff\xf2\x3b\xdd\xe4\xab\xce\xe3\xbb\xbb\x6f\x06\xf1\xd7\xce\xe3\xa7\x18\x81\x62\x35\x1e\x48\x67\x01\x22\x3f\xc6\x83\xf1\xc4\x80\x09\xe9\x69\xaa\x24\x63\xdc\xc8\x96\x1f\xf5\x11\xa4\x18\x17\xfd\xf6\xe8\xdc\x12\x6a\x94\x6f\x7c\xdf\x75\x00\x9f\x23\x51\x54\xa6\x10\x42\x09\xe6\x0d\x10\x4e\x29\xdb\x1b\x9d\x66\x2a\x0f\xe7\xed\x78\xa6\xc1\xe7\xec\xdf\x85\xec\xf6\x7f\x5b\xbd\x8e\x2e\x72\xec\x3f\x5f\xc9\xd3\xcf\x94\x83\x57\xb2\x68\xa1\xa7\xf0\x70\xf3\xd3\x1b\x49\xb4\x15\x4c\x70\xcb\xd4\x79\xff\x74\xff\xeb\x1b\x23\x9e\x8b\x0c\x4d\x4c\x41\x81\x89\x11\x18\x30\x8a\x2b\x4c\x40\xb9\xd7\x52\x2a\x54\xa8\x76\x74\x2a\x87\x92\x2d\x7b\xe2\xde\x4f\xd0\x19\xeb\x8a\x46\xcd\x07\xa5\x96\x9f\xeb\x6e\x74\xba\x5c\x7e\x0c\xf7\xfe\x08\x9d\x75\x0e\xd6\xea\x10\x2b\x59\xca\x52\xc4\x5c\x2d\x17\xf8\x5c\x5a\x0c\x60\x81\x53\x97\x59\xaf\x15\xdd\x6b\x2a\x94\xdc\x3a\xce\x90\x5c\xfe\x8a\xa0\xe6\x1c\x89\x1c\x11\x52\xf8\xa6\x87\x05\x46\xd8\xd6\x08\x21\x82\xa4\xee\x8a\x4c\x06\xa7\x90\xcb\xcf\xeb\x0e\x16\x62\xf9\x31\xbf\xf9\xe9\x49\x72\x41\x24\xc3\xcd\x50\xf6\x2d\xf6\x35\x86\x45\x83\x46\x85\x19\x10\x68\xb4\x65\xb3\xea\xfc\x1c\xcf\x72\xab\x76\x32\xfa\x55\x74\x1f\xbd\x8b\xf0\xc5\x91\xff\x69\xcd\xdc\x92\x9b\xd4\x24\x79\xb7\xd6\x6f\x81\x72\x7a\x77\x81\x3c\x5f\x4a\xb7\x60\x48\x14\x4f\x96\xd9\x6e\x4e\x3b\x5b\x22\x8d\x70\x12\x19\x54\x6a\x22\x6c\x51\x18\x3f\x80\xd4\x4f\x80\x66\xbe\xf6\x02\x02\x1c\xaa\xb7\xb1\x29\x90\x2e\x91\x22\xc1\x5d\x72\xf0\xc8\x5a\x60\xd4\x92\x74\xc0\xc2\x09\x22\x3d\x45\x92\xdb\xc6\x0e\xd8\x12\xec\x8a\x83\x6d\xac\x60\x58\x06\x3c\x4c\x12\x47\x67\xb2\xb1\xcf\x35\xf9\xf7\x6a\xf1\xab\xc2\xcf\x33\x8b\x27\xce\x0f\x6e\x9a\xfa\xe1\x70\xb0\x4b\xb0\x1b\xc7\x83\xbb\xa6\x1f\xbf\x58\x0e\x07\x4c\xde\x10\xf6\x0f\xfd\x1c\x39\xfe\x43\xf4\x3f\x85\x3d\xe4\xe1\x7e\xc5\xad\x5e\x55\x93\xd7\x0e\xfd\x4f\x1f\x2e\x3a\x0b\xe0\x9a\x08\x7d\x7c\x78\xfb\xe6\x66\xea\x72\x77\xe1\x7b\xbc\xe4\x4c\x37\x59\xcb\x2d\xe8\x3f\xce\x41\xda\xf7\x2e\x66\x6e\x58\x0e\xa0\xa9\x46\xe2\xf7\xbd\x37\xb5\x1f\x38\x88\xb4\xef\x41\x15\xb3\xb9\xbe\xde\xf6\x1e\xc1\xb1\xb5\x2e\x3f\x3a\x23\xcd\x51\xbb\x71\xdf\x0d\x45\xc1\x9b\x8a\x97\xa5\xab\xa9\xc2\x08\x96\x04\x01\xd6\xd7\xa2\xee\xe6\xa3\xaa\x06\xd1\x27\x03\x18\x35\x63\x8c\x69\x5f\x18\x53\x3a\x75\x18\x8c\x92\x32\x4e\x99\x3f\x50\x7f\x24\x64\xce\xa1\x2c\x45\x9e\x49\x5e\x15\x8a\x42\x81\x7a\x99\x41\x98\x73\x69\x55\x89\xf3\xec\x28\x69\xe6\x72\xe2\x84\x51\x96\x0b\x66\xb9\x21\x61\x16\xa8\x37\xd3\x9d\x08\x31\xea\xbb\xdd\xc1\x58\x03\x54\x01\x18\xda\xd9\xce\xef\x2b\x3f\xec\x52\x29\xa5\x34\xc6\x68\xbd\xe4\x99\xf9\xd9\x6d\xd2\xed\xf1\x19\xe5\x15\x5c\x27\x1e\x97\x0d\xf6\x69\xb5\xe6\x5a\x6e\x9b\xd4\x75\xce\x75\xe1\x6b\x7b\xfc\xd3\x28\xab\x1d\x5b\x2a\xa7\x19\x01\x38\xe7\x00\x47\x77\xa0\xbb\xf8\x4e\xae\x5a\x76\xab\xca\xec\xbf\x5f\xae\x97\x1f\xde\x3c\xbc\x7d\xf8\xe1\x5d\xd8\x1e\x5e\xb4\x88\x92\x0b\x7a\xe3\x42\x7c\x7d\xbc\x5f\x39\xe7\x1f\x1f\x62\x70\x4b\x3b\x4f\x2e\xcd\xb3\x0b\x21\xc0\xb8\x34\x5b\x2e\xa3\x3c\x2b\xb1\xe1\x12\x17\x59\x96\x9a\x9c\x12\x49\xb9\x22\x96\x97\x79\x27\x73\x52\xda\x95\x8c\x2e\x92\x26\x9b\xd9\x2d\x1f\x5d\xc5\x62\x76\x16\x10\xdf\x26\x7b\x8e\x0d\x66\x3b\xe5\xeb\x73\x64\xfc\xc1\x56\x7d\xe9\xab\xe1\xa8\x74\x7e\xb4\x20\xd2\xdc\x2a\x07\x22\xa0\x67\x99\x99\x2c\xf5\x03\xc8\x11\x74\x59\xbc\x37\x20\x9d\x0f\xc6\x0b\xe3\xcb\x2c\x37\x9b\xc1\x97\xa6\xc5\xb6\xa2\x95\x8d\xa2\x6d\xb2\x8f\xd0\x9d\xda\x95\x81\x17\xbd\xfa\x3b\x47\xe0\xfe\xe9\xeb\xd4\xf2\xe9\x1e\x04\x4e\x6c\x40\xa1\x5c\x86\xdb\x77\x39\x17\xbc\xa4\x50\xe2\x72\x36\x56\x81\xda\xf8\x25\xeb\x3a\x38\x97\x81\xca\x73\x5d\x55\xbb\x72\xae\x4f\x13\x0b\xa2\x1b\xb1\x38\x4d\x89\x59\x2e\x45\x30\x58\xdf\xf5\x9e\x78\x22\x0e\xab\x9e\xe3\x21\xa2\xa1\xf7\xfd\x97\xd1\x3f\x7f\x15\x6d\x1e\x5f\x76\x95\x1b\xc8\xfa\xba\xb1\x04\xe0\xef\x03\x78\xfa\xf9\xe1\xc7\x0d\x04\x64\x9d\x7d\x58\x5b\xc0\xd1\xab\x30\xa9\x34\x5e\xb9\x70\x18\x5b\x40\xbc\x1a\xa9\x01\xda\xb7\x00\x0f\xd4\x1b\xb4\xdd\x07\x97\x62\x49\x94\x51\x5a\x77\x9d\xd6\xca\xa8\xd6\x58\x8f\x5a\x16\xfd\x1d\xd0\x9d\xd9\x9d\x09\x7e\x22\x2f\xf8\xc9\xff\x3e\xac\xec\xe8\x52\x96\xad\x5c\xa9\xe7\x0b\xe4\xe7\xd7\xe8\x9e\x25\x4f\xfc\xf4\x1b\x10\xb2\xf0\x2b\x09\xeb\xcd\x73\x30\xb9\x5e\x50\x4b\x30\xb9\xad\xef\x76\x55\xf0\x8d\x19\x1d\xb0\x5e\xa5\x88\x20\x4b\x0c\x86\x28\xd7\x90\x51\xc6\x4a\x22\x05\xa5\xf9\x3c\xb4\xa6\x8e\x5b\x0f\x41\xed\x59\x0a\xac\x97\xda\xda\x03\x2f\x75\xc9\xce\x91\x2b\xd5\x50\xa6\x2e\x53\x7e\x1c\x55\x22\x14\x76\x58\x9e\x90\xa5\xc2\xea\x9d\x29\x09\xa1\x65\xd1\xbb\xb1\x71\x35\xf4\x87\xd1\x35\x45\x2b\x5b\x4e\xa4\xd0\x20\x05\xd0\x3b\xbf\xf7\x13\xef\x41\x14\x47\x93\x61\x5e\xa8\xda\x93\x65\xc7\x55\x99\xaf\x60\x8e\x35\x6a\x38\x21\x40\x35\x23\x1a\x9b\x0c\x1d\x6b\xda\x5d\x62\x04\x0d\xb9\x42\xf1\xdc\xcf\xbb\x71\xe7\x7c\xfa\xb6\x50\x59\x76\xc5\xb5\xa5\x17\xac\x3b\x7e\xbc\x1e\x81\x78\xd9\xd3\x08\x88\x32\xe8\x50\x06\x52\x9a\x97\x8d\x1f\x97\x30\x56\x52\x82\x21\x29\xf3\x69\xf2\xfb\x16\x16\x14\x14\xb4\x28\x0e\x05\xc8\x29\xd2\x05\xf1\x4b\x30\x95\x72\xdb\x53\x0a\x39\x37\x7a\xd0\xbd\xf1\x91\xa6\x99\xcb\x18\xd8\x9b\x5e\xb7\xce\x37\xb6\xab\x66\xa8\x0d\xb5\xa6\x44\xe7\xc8\xb0\x2a\xda\x01\x79\x26\x5b\xb8\x43\x81\xf5\xf3\x17\x97\x5c\x79\xb9\xf2\x5f\x48\x25\x4b\x98\xbb\xdb\xdd\xad\x19\x7f\x12\x2e\xfe\xfb\xc7\xdd\xbb\xa7\xfb\xd7\x65\x5e\xcf\x2d\xb7\x8c\xa9\x59\x21\x48\x6c\x17\x1f\x5c\xf0\xe3\x45\x8a\xa7\x13\xe7\x5a\x73\xa1\x35\x50\x1c\x6b\xc4\x37\xd4\x4f\xe3\x38\x8e\xc6\x1f\x4c\x2f\x1c\x03\x35\x38\xc4\x47\x0f\x01\x1b\x4e\x03\xc8\xad\x01\xb9\x47\xe5\x41\x4b\x53\x2f\xeb\xd3\x45\xd1\x5d\x8c\xce\xe8\xae\xda\xd1\x1b\xdc\xcf\x1f\xa3\x7f\xf3\x9f\x47\x4a\xbe\xbb\x7c\x7f\x7f\xc1\xcc\x6f\xb6\x1f\x7e\xda\x2e\x67\x64\x77\xf7\xee\xee\xa7\xf7\x2f\x12\x72\xb1\xd9\x38\x9f\xc6\xa5\x5b\x2a\xbd\xd2\xc5\x6c\x9e\x34\xa0\xbe\x89\xd9\xaa\xbc\x89\x7d\x3f\xaf\x22\xfe\x7b\x9e\x81\x0c\x30\xea\x5b\xdf\xfb\xc9\xb7\x14\x58\x80\x70\x01\x4c\x65\x6a\xee\x8f\x5e\x94\x43\xad\xe4\xa9\x03\x47\x58\xec\xa8\xa5\xbe\x1a\x03\x67\x15\x88\x20\x1b\x28\xa8\xe0\x82\x90\xcc\x71\x23\xfa\x5e\x6a\x8d\x85\x32\xad\xa0\xc6\x4a\x8d\x4a\xae\x2d\xa7\x51\x14\x47\xd5\x99\xde\x89\xd8\x46\xbf\x5d\xa3\xf6\xdb\x1b\x91\xc9\x9f\xc0\xb7\x75\xc7\x9b\x87\xa4\x77\x25\xe9\x8c\x34\xed\x41\x57\xd4\x53\x3f\x11\xc9\x29\xe4\x0c\xcf\x36\x8e\x3a\x8f\x11\x10\x95\x6f\x62\x6b\x48\xb9\x64\x56\xcc\x96\x45\xe5\x40\xee\xf7\x92\xe5\x0e\x32\x30\x18\xaf\xb4\x11\x81\x9c\x9f\xc4\xc5\xd9\xdd\xd9\xa4\x8b\x7e\x15\xe5\xab\xb6\xcd\x77\x54\x95\x77\x17\xeb\xcf\xe7\x27\xb1\xdd\x34\xf3\x14\xb3\xcf\x2e\x96\xf3\xd4\xda\xac\x50\x4c\x50\x4a\xa4\xdc\x27\xa9\xcd\x73\x2d\x04\xe3\x98\x28\x93\x74\xf6\x34\x59\x9b\xa4\x04\x2a\x21\x84\x55\xdc\x48\x79\x00\x45\xae\xb8\x94\x56\x73\xc3\x65\xb5\xe2\x21\xa3\xc0\x99\x79\x99\x29\x94\x57\x3f\xe4\xef\x7a\xc5\x3d\xe7\x30\xaf\xde\x56\xf2\xb0\x26\x1d\xf7\x97\x81\x5a\x9c\x1d\x83\x87\xc8\xf0\x92\xe2\x1c\xab\xe7\x0e\x0b\xb2\x79\xe6\x7a\xd6\x3a\xd5\xc8\x89\xc7\x68\x5c\x85\x0b\x0e\x20\xef\x7f\x79\x1a\x20\x0b\x8c\x06\x6b\xdc\xb0\x77\x72\xef\x5b\xe3\x87\x20\xfa\x61\x01\x8a\x36\xa0\xbd\xcc\x7d\xff\x10\xfd\x8b\xe8\xd3\x8a\xcc\x79\xfb\xec\x74\xf9\xf3\xc3\xdb\xf7\xab\xc3\xe5\xcd\x68\x68\x75\x12\x09\x04\xa0\x8f\xf7\xcf\x51\x74\x59\x78\xbb\x2b\x33\xf5\xc3\x55\xa4\xea\xd3\xc7\x87\x8d\x74\x41\x73\x59\x15\xa5\x28\x7d\x0e\x78\xe6\x2d\x31\x35\xca\x74\xc6\xa7\x49\xfa\x43\x0e\x90\xaf\x7b\x27\x19\x38\x76\x09\x3e\xf5\xc1\x07\x73\x48\x5a\x2f\xd2\x38\xf3\xa5\x05\x18\xfb\xaa\x11\x9e\x96\x40\x30\xcf\xc0\x98\x79\xb9\x53\x4c\x32\x45\x59\x29\x38\x52\x45\x0a\x73\x88\xa1\xc0\x88\xe4\x50\x16\x72\x6e\x3d\xf2\x86\x8d\x80\x4d\xb1\x99\x47\xdf\x49\xe1\x0f\x1a\x15\x4a\x16\xa6\xec\xc6\x42\x43\xad\x0a\x14\x25\x89\x89\xd0\x2e\x4f\xa2\x4b\xaf\xe8\xb5\x77\xb1\x09\x36\x06\x21\x5a\x71\x5f\x25\xd1\x8c\x40\xe3\x7c\x59\x47\x11\x48\xc8\xb9\xde\xd9\x24\x5b\x3d\x47\x5f\x94\xad\x6f\xa6\x08\x09\x03\x65\x80\x30\xf7\x95\x50\xc6\x2a\xc5\x6b\xe5\x8f\xb1\x53\x4a\x63\x5d\x29\x23\xbc\x04\x4d\xcd\x94\x1a\xd6\xeb\x79\xda\xe4\x3b\x19\x9c\x29\xdf\x5e\x3d\xff\xae\x7e\x7f\x6f\xee\x1f\xef\x97\x5b\x3c\xb9\x1c\x0d\x76\xb0\x1a\x35\xc3\x30\xec\x64\xa1\xc4\xe7\x3d\x6f\xb6\x52\xcd\x81\x69\x3d\xef\x81\xf3\x22\x8a\x62\xb0\x3f\x93\x4d\xba\x93\xd1\x36\xca\x96\xbf\xb6\x6c\xd9\x4b\x4e\x14\xbd\x09\xe9\x50\x02\x9d\x1a\x65\x9f\x96\x48\x80\xdc\x98\x52\x56\x3b\x89\xbc\x1b\xe5\xe1\x74\x24\xc5\x12\x64\x4a\x52\xd7\xa7\x72\xe5\x5e\xd0\xff\xaa\xbe\xfe\x74\x4b\x3d\x0d\xad\x1f\xe1\x4e\xdc\x01\x15\x30\x8b\x34\x49\x7b\xc0\xc7\xd1\x67\x87\xc3\x7e\x49\x08\xe2\x02\xa8\x13\xbf\x3e\xf2\xe6\xbf\xd8\xd7\x7f\x17\x47\xe7\x72\x0b\x77\xea\x79\x1f\x7e\x1f\xb4\x59\xbe\x0a\x17\xc1\xcd\xfd\xd6\x64\xf7\xc7\x17\xb7\xed\x38\x93\xd5\xe4\xa4\x14\xa7\x83\x96\x20\x9b\xc2\x17\x48\x39\x36\x88\xf7\x86\x1b\xa9\xb7\xe6\x78\x3c\x1e\xed\xc9\x59\x9b\x88\xbe\x9f\x8f\xdd\x7c\x18\xbc\xd6\x96\x5a\x4d\xd8\x20\x8d\xba\xcc\xa2\xb2\x1d\x0e\x18\xca\x9f\x82\xe3\xda\xc3\x15\x46\x73\x31\xd4\x5f\xce\xc5\xc7\xcd\xf6\xc3\xbf\xb8\xd5\x43\x7a\xff\xf1\x01\xec\x81\xc1\x85\x57\x31\x46\x78\xb2\xa4\xcc\x08\xb5\xe7\xc8\x4f\x88\x32\x05\xd2\xab\xbf\xd0\x72\xdb\x4c\x54\x18\x25\x99\x39\x89\x34\xd3\x79\xe6\xa7\x63\x91\xbb\x34\xd9\xef\xf7\x73\x73\x98\x1d\x1c\xd7\x19\x77\x7a\x26\x9b\x69\xa7\xa3\xdf\x3e\x9f\xbb\x17\x56\xda\xc7\x67\x62\xdb\x5a\xce\xbc\xf9\xa5\x31\xf7\x06\x33\xac\xe1\x7e\x2a\x24\xdd\x83\x12\x16\x06\x43\x90\x7b\x83\x99\x36\x30\x3f\x30\x16\x78\x41\xd0\x77\xc6\x84\xb1\x59\xe9\xbb\x6d\xe6\x1a\x2c\x50\xa6\x79\xa3\x69\x59\x50\xa1\xad\xcc\x20\x42\x5e\x9e\x6a\x4a\x73\x9d\x97\xda\xb7\x9b\xe8\xda\xd0\x58\xea\xc1\x43\x98\x39\x2e\xd5\xc2\xe3\x4b\x15\x7b\xff\xb4\x2a\x52\xbf\x59\x25\x66\x6e\x5c\xf7\x3f\x3e\xc5\xc4\x68\xab\xdc\xcc\xb2\x18\xce\xfb\xc1\x1f\xe2\xce\x1f\xa6\x09\x14\x33\x04\xc5\xf1\xb8\xcb\x7c\x17\x66\x76\xa5\x2f\x8d\xf5\x93\x31\xc6\xd4\xd6\xd6\x26\x60\xf2\xaa\xf3\xaa\x2d\xfb\x63\x40\x27\xfe\x75\xf4\xef\x2e\x68\xe6\xdb\x34\x28\x8b\xef\x3e\xfc\x0d\xf8\x7a\xb6\x1b\x5e\xfe\xf4\xc3\x9b\xab\x42\xf8\xda\x88\xbb\xbd\xbe\x9e\xee\x9f\x9e\x2d\xe6\x36\xdb\x8b\x75\xf3\xe6\x18\x6b\x4a\x50\x09\x49\x8e\xa4\xaa\xa4\xb4\xc7\x19\x2e\x2f\x15\x04\x12\x58\x48\x59\x0b\xad\xd2\x29\xc9\x35\x26\x8a\xce\x54\x2d\xdf\x92\x83\xdb\xef\xa7\xd3\x51\x1a\x33\x43\x77\x38\xf4\xb9\x6f\xbd\x42\xca\x12\xbc\xc3\xb3\x60\x34\xb3\x19\x02\x47\xdf\xfb\xbd\x14\xe5\x11\x20\xfb\xf5\x8b\x14\xa4\x20\xa5\xc5\xe8\xca\xa6\x0e\xf7\x1e\x1e\x8d\xaf\xac\x0d\x76\x2d\xe3\xd1\x4c\xd8\x08\x62\xf3\x18\xcf\x87\x34\x5b\xd7\x11\x3f\x97\x77\x6c\x47\xc2\xce\xf8\x9b\xe8\x1f\x47\x7f\x1d\xfd\xeb\x5b\x4f\xfc\xfb\x87\x77\x4f\x01\x18\x14\x3e\xed\xcf\x8f\x0f\xab\xb4\xd1\xfd\xab\x2a\xe0\xc3\xcf\xef\xee\x9e\xd6\x42\x60\xb9\xf4\xef\x98\x3d\x15\xd6\x26\xe3\xa9\x30\x6d\x66\x32\xc0\xcc\xc9\xf6\xd0\x81\x22\xcb\x41\x36\x0f\x49\xe4\xa7\xd0\x89\x0a\x31\xad\x45\x4c\xa1\x31\x6c\xbf\xce\x80\xa3\xcf\x76\x64\x9a\x18\xbb\x4b\xff\x34\x6e\x2b\xc5\x61\xb9\x97\x52\x62\x2c\xfd\xe0\x07\x2e\x8d\x54\x4a\x68\x44\x8c\xe4\x82\x45\xd1\x16\xc8\x80\x6f\x29\xa3\xbf\x1b\xfd\xfd\xa8\x88\xfe\x36\x20\x5c\xee\xaf\xac\xd5\x90\x26\x6e\x97\xb5\xb8\xbc\xd3\xdb\x0b\xfe\xe3\xc3\xc7\xc0\xb3\x5b\x79\x7a\xb7\xb0\x89\x8f\x4f\x1f\x57\x51\xed\x65\x9d\xbc\xbb\xbb\xfd\x59\x10\xc5\xfd\xf9\x21\x3e\x1c\x8d\x16\x9b\x63\x75\x2a\x93\xee\x34\x24\xd2\xd4\xa0\xf7\x05\x63\x94\x64\x98\x62\x0f\xc1\x7e\x98\x1d\x38\xc4\x90\xf1\xe1\x28\x38\x29\x73\x4c\xd8\xf1\xc8\xa9\x77\x73\x1d\xa7\x8c\x33\x9a\xb5\x9c\x97\x24\x43\x84\x1e\x72\x2b\xad\x6f\x36\x9d\xe7\xf3\xe8\x29\x9d\x80\x03\x79\x12\x79\x0d\x22\x3d\x68\x8c\x15\x2d\x71\xaa\xd2\xac\x54\x98\x78\x64\x18\x55\x1d\x29\x73\x93\xe7\xb5\x42\x25\x91\x9a\xd1\x2c\x95\xb0\x2b\xcb\x4c\xa5\x59\x05\x75\x9a\x31\x19\x6d\xe3\xfc\xbc\xd6\x70\x6f\xa3\x7f\x76\x71\x2f\x78\xee\xbb\xbc\xee\x0f\xae\x4a\x92\xdf\x78\x62\xdd\xff\x7a\xf7\xcf\xc0\x87\xeb\xe6\x00\x3e\x3e\xfc\x2e\x7e\xf8\x18\x8b\xbd\x1d\x06\xcd\x59\x49\x2c\x55\xc2\xca\x26\x56\xa3\x05\xf9\x5e\x56\xc4\x09\xcb\xad\xe8\x78\x15\x23\xce\xea\xa2\x2f\x4e\x47\x97\xd4\xa7\x63\x92\x6d\x87\xba\x76\x8c\x29\x8a\xbd\x01\x5c\x4b\x29\x7b\x57\xd7\x6e\xe0\x56\x76\x5e\x03\x59\x69\x51\xb5\x73\x37\xe7\x9c\x3b\xca\x7c\x97\xd4\xe7\x28\xf4\x1e\xa3\x08\x80\x2e\xcc\x79\xf4\xea\xf1\xbf\xfb\x8e\xc9\xff\xe3\xc7\xa7\xfb\xbb\x0f\x3f\x25\x53\xc9\x78\xdb\x2a\x2a\x10\x72\x54\xf1\x9e\xef\xf7\xb6\x04\xd1\x4e\xdb\x02\xfa\xca\xf2\xca\x59\x2d\x4e\x43\x92\x1e\x5a\x05\x20\x90\x16\x20\xe4\x50\xc8\x33\xd7\x7d\x53\x3d\xf7\xa7\x5e\xb8\x2e\x8f\x6f\x5f\x7c\xa9\x1e\x82\x0f\xf0\xb5\x3f\x85\x40\xe4\xc2\xa8\x31\x0a\xd7\xb2\xf3\x03\x40\xe7\x68\x3a\x47\xd5\x35\x97\x58\x3e\xb6\x35\x33\x6a\xec\xf2\xdc\x36\xf1\x60\x3c\xb7\x9e\x54\x6b\x4f\x2c\x76\x21\x1f\xbb\x46\xae\x6b\x97\xf4\x21\xdc\x3d\xb7\xa6\xae\xe2\x62\xb7\xb3\xfd\xd8\x80\x63\x91\x99\x2c\x8f\xf3\xb9\xc9\x61\x7c\xf0\xad\xeb\xa9\x3f\xb4\xbe\x6b\x7d\x5b\x8e\xce\xb7\xa0\x2f\xa0\xa7\xc9\xa8\x59\xe0\xfe\x8b\x52\x63\xbe\xd5\xd2\xe4\x4a\x18\x8c\x8d\xc2\x4e\xec\xf7\x46\x73\x63\x30\x06\xba\x94\x98\x2f\xe5\xe8\x4a\x6c\xdd\xc5\x68\xc9\xfb\x83\xb6\xd8\x12\xd1\xd6\x8a\xfb\x8a\xe3\x0d\x7a\x8a\x2f\x30\x99\x35\xf9\x0b\x7d\xf5\xab\x28\xf4\xd7\xdd\xf5\x04\xda\x2c\x07\x66\xbf\x14\xb5\x43\x56\x3b\x6e\x2c\x9f\x08\x88\xa8\x6f\x81\x48\x05\x2e\xb9\x8a\x2b\x70\xf0\xb9\xed\x7b\x90\xda\x39\xb3\x36\x3e\xce\xd9\x72\xdb\x69\x88\xb1\xe6\xd4\xe0\x60\xb0\xe8\x84\x66\xbd\x21\x82\x95\x42\xc3\x99\x18\x50\xcf\xe5\xa9\x95\x32\x21\x7e\xac\x3c\x0a\x39\x1b\x8d\xf0\x4e\x27\xd1\xda\xcb\xfa\x16\xaf\x9a\xf0\x24\xb4\x62\xfc\x01\x90\xd3\x00\x68\x00\x6d\x75\x49\x64\x9c\x71\x66\xb9\x5b\xfe\x46\x7e\xde\xef\x74\xd2\x84\x6b\xee\x95\xe6\xf7\xf6\x95\xe6\xf7\x87\x6d\x5a\xe4\x00\xdb\x9c\x69\xc5\xb4\xae\xfc\xc4\x0f\xb6\xaa\x58\x5d\xe3\xdc\x47\x80\xa2\xa4\x21\xcc\xd4\x9a\x72\x23\x68\xc5\x0d\xd5\xbc\x54\x25\x63\xca\xc8\xb5\x9f\xdb\x5f\x6a\xf5\xd5\xab\xfc\x0f\xb7\xec\xf3\x67\xec\xfb\xbb\xdd\xab\x2d\x68\x49\xca\xaf\xf9\xc5\xdb\x38\x03\x79\x5e\x38\x0c\x41\x3a\x23\x12\xd3\xb9\xa9\xc2\x27\x9b\x32\x57\x2f\x67\x33\x2f\x19\xf2\x0d\x04\x52\x72\x5f\xc4\x95\x72\xdb\x03\xc6\x88\x52\xa3\x3c\xd7\xd5\x9c\x29\x98\x1f\x56\xcb\xe5\x06\xb9\x42\x13\xa2\xad\xe4\x70\xcd\x07\xf3\x80\x4f\xb3\xcf\xac\x4d\x74\x51\x16\x0a\xd7\xc1\x26\xb8\x7a\xae\x08\x9a\x77\x0f\x1f\x76\xcf\xf8\xb4\x57\x8e\x4f\xa1\x38\x08\x54\xa1\xdb\x17\x57\xce\xd0\xbb\x5b\xed\xad\x48\xe4\x10\x40\xc0\x59\x5d\xcd\xb5\x6e\x28\xe8\x21\x90\x3d\xf5\x36\x69\x4f\xa4\x8a\xf5\xac\xfd\x3e\x2e\x09\xe1\x0e\x36\x65\x31\xfa\xa9\x04\xf8\xe0\x69\x6c\x5e\x5e\x6c\x0f\x25\xc8\x7b\x4f\xb9\xe6\x9c\xcb\xb9\x31\x42\x70\xb5\xb3\x32\xcf\x2b\x6e\x31\xc1\x65\x59\xea\x46\xca\xd2\x1f\x7c\xab\x98\xef\x67\xba\x02\xa2\x14\xa7\x96\x8b\x49\x2f\xcf\xa1\x81\xc8\x50\x62\x19\x3b\x14\x98\x48\x8a\x39\xa6\x92\x86\xfc\x38\x06\xd3\xb9\xdb\xa0\x1d\xbd\xcc\x99\xdf\xc5\xc1\xd6\x64\xfb\xe1\xd3\x9b\x95\x02\x13\xdf\x7d\xfa\xf9\x4d\xd0\xa5\x4e\x2a\x5b\x77\x8d\x2d\x0e\x7e\x5f\x18\xad\x14\x74\xc2\x52\xc7\x68\x0b\xf7\xfe\x88\x01\xdc\x66\xd8\xd3\x73\x84\x90\xe2\x58\x37\x20\x85\x99\x1d\x81\x28\x7c\x3f\x66\xe9\xa9\xb1\xb4\xac\x70\x14\xa5\xa0\x3f\xe3\x30\x4f\x79\xf3\xcc\x94\x7d\x85\x52\xfe\x8a\x2f\xfc\xf4\x36\xa8\x12\xbe\xbd\x19\x39\x07\x35\x89\x6b\xae\x1e\x00\x1d\x6b\x8a\x73\x0b\x5e\x88\x39\xc8\x1c\x70\x41\x6d\xc1\x79\xe1\xfc\x31\x86\x0e\x8c\x55\xe5\x8b\xe0\xad\x37\x1f\xe2\xdc\x33\x50\xbb\x6b\xaa\x07\xa4\x73\x27\x68\x85\x93\x4a\x00\xa8\xa1\x52\x2a\x2e\x28\xb2\x05\xdd\x86\x9c\xcb\x68\xad\x35\x55\xe7\xc8\x86\x15\x6c\xb9\x95\xf6\x1c\x49\x5f\x71\x3f\xcc\x2c\xae\x7c\x7f\x8e\xa4\x24\x87\x43\x11\xcc\x0c\xea\xbe\xe8\xab\xab\x67\x39\xbe\xab\x76\x32\x7a\x13\xfd\xc3\xe8\xdf\x04\x97\xdf\xef\x7f\xd2\xe7\x59\xd7\x6e\xfb\xd3\x0d\x92\xe1\x36\x69\xbb\x6d\xdf\xbf\x7f\xb5\x71\x6a\x90\x55\x80\x05\x6e\x70\xe5\xeb\xca\x1f\x37\x7b\x77\x2a\x5d\x52\xd8\x83\x6f\x00\x05\x79\x49\x74\x23\x0d\x2c\x9c\x23\x9c\x12\x48\x29\xf4\x59\x31\x74\xda\xc0\x4e\x59\xa6\x40\xe4\x7b\xd6\xee\x49\x97\xe4\x43\x25\x9a\x76\x3b\x3a\xe7\x9c\xad\xaa\xba\x1e\x7c\x33\x84\xfd\x04\x8f\x0d\x2c\x28\xa1\xed\x40\x4b\x9c\x67\xbe\x55\x34\x73\x39\x03\x19\xd2\x5c\xe7\x99\x91\x75\x61\x29\x9c\x27\x65\x98\x2b\x35\xd7\xc6\x89\x28\xba\x0b\x9a\x69\x6e\xa7\xa3\x1f\x03\xe6\xe7\x0f\x17\xee\xdd\x77\x54\xd2\x7e\xff\x22\x93\xf6\x76\xb7\x16\x7d\xf7\xcf\x35\xdf\x37\x38\x8e\x25\x51\xdb\xbe\x7d\xf8\xb8\x39\xd8\x1c\x82\x03\x77\x76\x24\x87\xa6\xde\xf3\xd1\x8a\x82\xc9\x96\x11\xa5\xa8\x37\xa9\xcf\x9c\xea\x64\xc3\x05\x48\xb5\x29\x45\xb5\x49\x7d\x61\xe3\x89\x51\xc2\x0b\x59\x62\x5f\x80\x71\xb9\xed\x34\x22\xa5\x6d\x14\x45\x06\x4b\x49\x14\x61\x1c\x0b\x36\x52\xc1\xb8\x4e\x33\x40\x90\xb7\x83\xdc\x9f\x8e\x62\x2d\x2f\xab\xfa\x84\x01\xf4\x63\x52\xcd\x25\xe7\x99\xc9\x78\x9c\x49\x23\x65\x94\x44\xe5\x99\x6d\xa2\x9d\x8a\x7e\x8c\xfe\x18\xfd\x75\x14\x5d\xb4\xfa\xb7\x37\x04\xfe\x87\xbf\xf8\xfd\xc7\xed\xc5\xbc\xe3\x2b\x24\xe6\xa7\x8f\xab\x96\xec\x87\x4f\x6f\x1e\x07\x77\xec\xf9\xe4\xf7\xa4\x3c\x92\xd4\x66\xb4\xf4\x43\x2b\x00\xb4\x8e\x2b\xd3\xf5\x56\x68\xb7\x2c\x62\x48\x68\x01\xbd\x02\xc4\x69\x66\x69\x1b\x66\xd8\x9a\x97\x0e\xe6\xd8\xa0\x0e\x15\x25\x1d\xcf\x11\xe3\x5c\x0b\xdb\xaa\x5a\xf9\x41\xf1\xac\xce\x0b\x1c\x0b\x57\xfa\xc6\x68\x07\xa2\xa0\xf9\x10\xf0\xa5\xe6\xc6\xbb\xf6\x1f\x46\x45\x60\x78\x5f\x82\xdf\xc3\xa5\x90\x09\xfb\xdc\xfb\x77\xbb\x7f\x00\xee\x5f\xe1\x4a\x7f\x78\xf5\x24\x56\x9b\xf1\x4b\x51\x8d\x23\x10\x83\xeb\xe7\xb1\x6e\x58\xcc\x40\x21\x84\xe8\x2b\x50\xbb\xbc\x90\x96\x2b\x4e\x98\x70\x33\x77\x39\x52\x42\x52\x26\xa4\xe8\x77\xe5\xdc\x9a\xc0\x6b\x0f\xb7\x39\xcb\x33\x5b\x48\x85\xf2\xe2\x24\x12\x0c\xb5\xec\x9d\x35\x5d\xa3\x25\x88\x00\x87\x2a\x7c\x26\x3d\x1a\x09\xb2\x4b\xed\xbc\x7c\x06\x14\xbd\x09\xb9\xc7\xea\x9c\xf2\x3a\x5a\x86\x5a\xec\xfe\x01\xdc\x3d\xc4\x6b\x1a\xf8\xe9\xcd\xc3\x9b\xa7\xbb\x5f\x86\x41\xc5\x6a\x1b\xcd\x03\xd8\x7b\x18\x97\x9f\x87\xce\x82\x74\xee\x41\x81\x36\x59\xe1\xea\x36\xef\x04\xc9\xbf\x0c\x75\x0d\x13\xe5\x6b\x8a\x25\xa6\x8e\x61\x8d\x89\xcf\x2d\x54\x46\x02\xbd\xec\xc5\x74\x87\xcc\x12\x82\xd7\x0f\x56\x9f\x06\xed\xf1\xc1\x19\x90\x81\x91\x2b\xdf\x73\x81\x15\x83\xd2\x62\xab\x60\xbe\x6f\x71\xdd\x55\x75\xd1\xba\x65\xef\x40\x67\xb2\xd9\x3f\xe7\x6f\x17\x95\xd6\x9b\xfe\xdc\x6d\x0e\xf7\x1d\xeb\xc1\xb8\x04\xa9\x05\xa9\x5f\xea\xff\xe8\x1c\x85\x36\xdb\x52\x78\xfb\xc9\x49\x09\x22\xe1\xd7\x6f\xdb\xae\x6d\x9d\x9d\x73\xeb\x96\xbd\xd0\xd9\xf8\x60\x3d\x6e\xdb\xa0\xbc\x13\x3c\x8e\x40\x1b\xb4\xf8\x74\xf4\xf7\x2e\xc7\x35\xfa\x0a\x51\x7c\xc1\x6f\x7e\xe5\x0c\xf9\x98\x84\x45\x7c\xc1\x6d\x32\x9b\xe5\xb5\xe1\xc6\xba\x8e\x80\xb4\x04\x7d\xb5\xbc\x33\x22\x51\x01\x4b\x0c\x97\xb7\x66\xb1\xa1\x42\xab\x98\xb0\x52\x63\xba\xd3\x05\x82\xaa\x52\x95\x3a\x38\x7d\xf0\xa3\xd9\xdb\xb9\x11\x2c\xb7\x59\x19\x63\xbb\xf7\x08\xf9\x43\x47\xf6\x7b\xd7\x96\x6d\x15\x25\xe0\x70\x26\x9b\xc3\xcd\x2c\xf6\xfb\xc7\xe9\xf1\x55\xae\x9b\x81\x3c\x4c\x5f\x0f\x07\x90\xf9\x63\xf8\xf8\xc7\xa3\x3f\x34\x57\x2e\xfe\x2f\x4f\x64\xb7\x71\x71\xd6\x77\x75\xd0\x9e\x79\x13\xfd\x26\xfa\x27\x01\xad\xfb\xda\x31\x73\x75\x73\xd8\xbc\xbb\xfb\xfd\xfb\xed\x57\xc8\x86\xe4\xab\xe7\x9b\x43\x09\xe3\xd2\x7e\x99\x5c\x8c\xf2\x22\xe5\x83\x6f\x29\x20\x71\x01\xd2\xbd\x1c\xce\xd1\xac\xc1\x10\x2c\x35\x63\xfc\x25\x8b\x0b\x8f\xd2\xc0\x3c\xf0\x59\xac\x3e\xeb\x58\xf9\x62\xa7\x08\xf3\x4d\x3f\x00\x86\xb1\x1f\x44\xc3\x35\x17\x4c\x2a\xcd\xf6\x5a\x9b\xc6\x98\xc6\xe7\x5a\x9b\xca\x98\x2a\x5a\xe7\x9a\x38\xd4\x50\x3f\x46\x7f\x19\xfd\xb7\xc1\x55\xe8\x7b\x5a\x07\xbf\x54\x42\x05\x9b\xf3\x4b\xea\xf8\xfe\x62\x24\xbf\xa6\xf3\x20\x90\xdf\x7e\x7c\xae\xa6\x48\x69\x99\x14\x95\x68\xbf\x53\x4d\x0d\x35\x8a\x0f\x13\x95\x87\x41\x34\x7e\xbf\x14\x88\xa0\xec\xeb\x9e\x11\xdf\x02\x0b\x41\xaa\x88\xd7\x18\xbb\x6d\x3d\x0c\x16\x0a\xa1\x79\xe9\x1d\x20\x4e\x89\x6a\xb2\xc3\x60\x27\xe9\xd4\xe0\x15\x10\x8d\x93\xdd\x71\x6e\x32\x61\x07\x4d\x99\xe5\xd2\x21\x97\xf1\xb2\xd4\xca\x96\x1e\xf2\x46\xd0\x22\x70\x83\x8f\x67\x1c\x7a\xdd\xdb\x0b\xca\xe0\xe9\xea\x15\x03\xde\x6d\xb6\x1f\xe0\xf6\x1b\xa5\xc2\xe0\xf9\x19\xfc\xd5\x5e\x2c\x62\x1e\xff\x3e\x08\xf3\x80\x5b\x2c\xd6\x6e\xa4\x1e\xce\x04\xc5\x25\x38\x38\xca\xac\xf4\x16\x43\x0b\xb1\xef\x42\xcb\xad\xd8\x20\xdf\x91\xb2\xc9\xf3\xd4\xa4\x72\x6a\x65\x55\x4e\xe7\x88\x00\x25\xfc\xd1\x25\xd1\x1c\x5d\x6f\x3b\x6d\x78\x66\x15\xaa\x24\x55\x94\x2b\xa4\x38\x64\x9c\x72\x36\x9c\x9a\x43\x0e\x21\xac\x8a\x51\x94\x14\xe4\xc3\x00\x0d\x04\x79\xcc\xb9\x6f\x97\xff\xa3\x04\x1c\x2f\x3a\x2c\xcb\xf9\xfc\xff\x5f\xfb\x4e\xdf\x2a\x57\x84\xcd\xef\xed\xe3\x0f\xaf\x5e\xfd\x46\x66\xe4\xe6\xe4\x71\x21\xac\xee\x2e\x27\x4f\xd4\x97\x93\xd7\xf3\x7a\xb6\x60\xaa\x42\x57\x5c\x7e\x56\xb1\xf2\xe9\x56\x85\x1d\x06\x69\xa5\x25\x9b\x27\x30\xb6\x46\xd6\x00\xdb\x75\xdf\x19\xad\xd5\xc7\xf9\x08\x8e\x43\x2d\x0f\x20\x3f\xb9\x61\x70\xa3\x73\x63\x14\x6d\x83\x6e\x57\xb3\x23\xa1\x22\xfb\xeb\xa0\x54\x19\x81\xb5\x2d\x7b\x03\x06\x4b\x1e\xdf\x5e\xf9\x85\xf7\x59\xf2\xe1\xb7\xe0\x37\x60\xfb\xf0\xf6\xe1\x17\x6d\x21\xee\xf8\x97\x7e\x83\x7d\xce\x39\x86\x06\x16\x42\x61\x0f\x3b\x23\x58\x51\x59\xe2\x8e\x56\x0b\x00\x13\x7c\xea\x13\x25\x44\xb0\x5f\x25\xb3\xb6\x76\xc9\xc7\x97\xdb\x8e\x18\x7f\x50\xb2\x28\x4b\x52\xa2\x3c\xb3\x25\x20\x47\x08\x65\x59\x10\x50\xfa\xe3\x3c\x7a\xca\x40\x04\x1c\xc8\x92\x68\x54\xb3\x9d\xc5\xea\xf6\x50\xfa\x63\x52\xee\xb9\xef\x79\xc0\x1e\x44\x21\x0f\x28\xd7\x1e\xfb\x12\x73\xb2\xf8\xd9\x89\xf9\x4d\x78\x21\x8e\xc0\xd1\x0f\xa0\x34\x15\xe3\xb9\xe0\x34\x87\xb9\xef\x00\xf2\x61\x9c\xed\xbb\xb9\xf3\xc7\xc2\x16\x44\x02\x1d\x53\x40\x96\x5c\xca\x86\xf8\x56\x84\x9e\xd0\x35\xbe\xfd\xed\x37\x7d\x21\xf0\x9f\x03\x6d\xbe\xd2\x06\xbe\xd5\xe5\xcc\x8e\xd6\xf0\x4d\x57\x9d\x54\x62\x4e\xf5\x86\xf8\x14\x0c\x9c\x97\x0c\x2a\x8c\x7d\xb7\x9c\x43\xd0\xfa\x32\x9e\xca\x42\xc2\xd2\xbb\xf0\x2d\xc6\xb7\xcf\x36\xda\x57\xf3\xc1\x4b\x36\x01\x05\xb2\x78\xf4\x0c\x40\x77\x8e\x8c\x9e\x53\xc6\x73\x9b\x93\x98\x9e\x8e\x49\x76\x1a\x92\x56\xfb\x9a\xb0\x92\x11\x1c\xee\xf7\x84\x97\x8c\xe2\x70\x1f\x45\x51\x92\xd4\x67\x76\xd7\x86\x78\x93\x7f\x1d\x6d\xae\x79\x46\x78\xfc\x66\xd5\x6f\x0f\x2e\x38\x7f\xf1\xd3\xe5\xa5\x5f\xdf\xfd\xf8\x6e\x27\x5d\x8e\x83\xbe\x0f\x66\xb2\xf7\xc6\x65\x90\x94\x82\x96\x5c\xb6\x53\xd8\xf1\x85\x72\x98\x1f\xfd\x91\x23\x6e\xba\xd4\xe6\x54\xee\x34\xec\x1b\xe9\x8c\x95\x4e\x49\x50\x00\x07\x6b\x47\x98\x56\x9d\x93\x80\x2c\x85\x8d\xf3\x2e\xaf\x5d\xd3\x1b\x06\xd2\x18\xf6\x55\x47\xa3\x95\xff\x40\xee\xda\x9d\x8a\xb2\xe8\xc7\xe8\x31\xf0\xa2\x9f\x63\xcf\xb3\xbc\xe9\x36\x88\xf0\xdf\xad\x05\xe6\x3a\x27\x7d\xf7\x74\xff\xa2\x99\xf3\xfe\xb5\xaf\xdd\xf6\xc3\x4f\x7f\x75\xd1\xa2\xd5\x71\xe4\x62\x34\x0f\x6e\xf4\x83\x00\x78\xf4\x3c\xc1\x20\x1a\xc4\x70\xac\xab\x2c\x07\x25\x20\xcc\xb7\xbe\x3e\x47\xbe\xa2\x60\x74\x8e\x33\x6c\x09\xe9\x2b\x3e\xf8\x91\x28\xc1\xa0\xe0\x45\x3e\xf9\xbe\x04\x62\x09\xb7\x94\x29\xca\x43\xff\xc6\x3b\x90\x9d\x23\x6b\xf4\x9e\x08\xa3\x2b\x39\xa0\x2c\x6b\x99\x15\x63\xaf\x4d\xc3\x7d\x5b\x70\x49\x14\x15\xd2\xd6\xa6\x09\x04\x7c\x88\xb5\x91\x4e\x99\x9e\x70\xce\x57\x9d\xb0\x25\x3f\x09\x7a\xc8\x7f\x16\xfd\x26\xfa\xa7\xd1\x1f\x2f\x58\xf4\xaf\xe3\xe0\xd3\x73\xc7\xfb\x09\x3c\xdc\x1a\x34\xc5\x17\x9f\x04\x70\x0b\x03\xb9\x4d\x1a\x36\x3d\x2d\xe2\xb2\x3a\x91\x0a\x4c\x05\xae\xed\x7e\x0f\xb2\x59\x4c\xa0\x89\x71\x56\xd1\x86\x56\xb2\x1a\xca\x83\x51\xa8\x1c\x20\xa1\xf9\xa9\xb7\x44\x62\x0c\xcb\x12\xb7\x9a\x32\x2d\x63\xc8\xb0\x46\x34\x18\x4f\xb7\xed\x00\x38\x2d\x3d\xb3\xa6\xd1\x1a\x50\x5f\xf8\xbe\x5d\xb2\xc9\x51\x6a\x3d\x82\x1c\x28\x3f\x8d\x3d\xc8\xbd\x9e\x8f\x92\xe6\x16\x32\xd0\x17\xfe\xd0\x96\xfb\xc1\x75\x65\xdb\x2c\x7b\xd5\x3e\xcc\x1a\xdd\xc5\x95\xfc\xd3\x33\xab\x68\xf5\x1e\x79\x15\xef\xef\x5f\x6d\x5f\x4b\xba\x7c\xd9\xc0\xd6\xe6\xd2\x12\x2e\x37\x3d\x59\x02\x7a\x14\xa7\x10\x69\x33\xf8\x83\x00\x45\xec\x40\x7e\x10\x47\x7f\x9c\xdb\xa4\xf7\xa6\xe4\x46\x28\x69\x4d\x8f\x3d\x1e\xcb\x52\x2d\xe5\xf7\x40\xa5\x66\xc0\x76\xbe\xb3\x71\x35\xf3\x9d\x63\xdc\x18\x52\xfa\x81\x75\x52\x69\x2b\x2b\x55\xab\xa3\x2f\xb4\xa0\x92\x4b\x2a\xb1\xd3\x60\xc0\x05\xf5\x23\x2e\xb5\x20\x14\x60\x84\xac\xb6\xa6\x8f\x36\x60\x3a\xd3\x90\xc3\xbc\x8b\xfe\xea\x52\x83\x7f\x9d\x07\xdc\x5d\x43\xc7\x9a\x08\x7c\x15\x3a\xae\x18\x93\x78\x15\x25\x0b\x26\x0f\x7f\x03\xde\x5c\x18\x63\x6a\xb2\x5d\x67\x38\x2f\x89\x2d\xa8\x16\xce\x76\xb1\x1e\x1c\x80\x7b\x51\x11\x2b\x1d\x55\xa2\x61\x35\xa0\x39\x87\x59\xea\x52\x6a\x1a\xe6\x51\x5a\xf7\xa2\x33\x29\xc8\x2b\xc5\x8d\xdb\xba\xfd\xde\x22\x29\x0c\xa7\xbe\x02\x9a\x55\x56\x56\x00\xdb\xfd\xde\xfa\x83\xb6\xe6\xe8\x25\xa0\x8d\x93\x3d\x88\x66\x39\xb7\x28\xc7\x43\xee\x27\x59\x0a\xb0\xf7\xa3\x3f\x72\xc5\x26\xc0\x8f\xc2\x28\x2b\xaf\x73\x24\x76\xe1\xe0\xfc\xd3\xe8\x0f\x17\xce\xc4\xf5\x32\xfd\xf9\xc7\x3f\xbf\xcc\x3b\x1e\xe2\x6f\x29\xfd\xcb\xa5\xbb\x72\x88\xef\x2f\x29\xc1\xa5\x96\x83\x4b\x56\xb0\x9a\x5b\xdc\x3f\xde\x29\x77\x2a\x5c\x8c\x60\x51\xe3\x62\x79\x9f\x20\x85\xa6\x2c\x25\x2e\x55\x45\x9c\x6c\x24\xa5\x65\xee\x1b\x31\x97\x4b\xf2\x46\x63\x29\x49\xdb\xa6\x2e\xcf\x32\x93\xe3\xc2\x73\x3f\x0a\x91\x2a\x27\xb5\x52\xdb\xce\x77\x4d\x03\x4a\x8a\x31\x13\x7b\x6b\x8c\x3f\x36\x84\x4a\x4a\x04\x31\x98\x37\x94\x50\x2e\x0d\x80\xb6\xb2\xb3\x2b\x60\x9a\x66\x45\x4d\x07\x5c\x94\x32\xb6\x5e\xf9\xde\x28\x0e\x0a\x40\xa2\x4d\xcc\xce\xf6\xc2\xf7\xfd\x87\x17\x3f\x96\xef\x77\x1f\x42\x80\x48\x9e\x79\xaf\xcf\x9a\x48\x97\x88\x11\xb3\xd0\x5f\x70\x40\x06\xdd\xb5\xca\xd7\x5b\xb8\x7c\xd8\x2c\x2e\x83\x32\xb8\x4b\xa4\x37\xa0\xf1\x34\x26\x9f\x0f\x49\x47\x90\x29\xc8\x52\x58\xb4\xad\xad\x2a\xe7\x0e\x3e\x40\x45\x81\xfe\x32\x80\xd4\x8c\xd6\x8e\xc6\x4f\x06\x68\x42\x29\x5d\xb1\x7a\xe9\x99\x6c\x68\xa8\x75\x82\xd3\xff\xc7\xf5\xb6\xfa\x3f\x5c\x6f\x8f\xf7\x8f\x71\x7a\xe8\xfb\x71\x34\x7d\xdf\xb6\xe3\x68\x0e\x31\x04\xc8\x2e\x65\x4e\x48\x34\x26\xeb\x07\x3b\xb7\xf1\xc5\xdb\x1d\x87\x59\x41\x19\xdd\x85\x2c\xfd\xcf\x2f\x15\xd4\x15\x6e\xfe\xb2\x5e\x3f\x80\xef\xa0\x8e\xdf\x04\x47\x1f\x77\xc2\x0e\x0c\x7c\xf0\x35\x05\x2c\x86\x20\x1d\xe5\x30\xcd\x76\x03\x3d\x8a\xcb\x2f\x51\x8c\x7c\xb9\x29\xdc\x69\x72\x2e\x49\x4f\xd3\xae\xf4\x43\x55\x03\xdc\x89\x46\x28\xa9\x99\x56\x9a\xfb\xa3\x19\x8c\x19\x7c\x31\xf7\x84\xc4\xd8\x57\xe3\x12\x37\x92\xf4\x82\x07\x5f\xfb\xe4\x6b\x07\xf2\x9b\x5e\xf9\xef\x3f\x3c\x5c\xa7\x9c\x5f\xf5\xca\xc1\xd3\xfd\xf7\x45\xd7\x2e\x92\x8b\x1f\xd6\xa8\x6e\x01\x43\x85\x2d\x0a\xd0\xf8\x02\x16\xb1\xf5\x07\xd1\x91\x43\xe5\xf7\x6a\x90\x56\x0c\x00\x15\xc8\x8f\x49\xaa\x19\x13\x6c\x6e\x45\x69\xb0\x00\xda\xe5\x19\xc3\x86\x50\x67\x64\xd5\x92\x15\x2a\x5f\xb4\x03\x9e\xfa\x8e\x94\x12\xd3\xcd\x54\x8f\xb0\x77\x56\x50\x6b\xa8\x95\x53\x5f\x2b\xa5\x2d\x91\xe0\x48\x2a\xc6\x85\x14\x8a\x2a\x71\x6a\xbc\x4d\x33\xa1\xa8\x66\x5c\xe8\x4a\x55\x92\xe5\x36\x67\x5c\x52\xcb\xc4\xa1\xe4\x2c\xc4\xfa\x4d\x5c\x3c\xf3\xb8\x57\xaf\xdf\xe5\xec\x07\x17\x83\xd5\x1c\xe3\xb6\x5e\xfa\xda\x99\xfa\xa7\xf7\x1f\x1f\xde\xaf\x17\xf0\xdb\x78\x74\xa0\x58\xfe\xf7\xe5\xc5\x32\xbc\x2c\xc0\xe8\x96\xc2\xbd\x72\x59\xae\x2c\x37\x05\x9a\xf7\x73\x87\x00\x02\xc8\x17\x49\xeb\x5b\xe7\xfb\x5d\xe9\x0f\x01\x78\x94\x7a\x59\x5b\x5b\xfb\x5c\x4a\x0f\xeb\x34\xcf\x73\xea\x6a\x4a\x09\xcf\x5d\x0a\x5b\x33\x5c\x3c\xa1\x93\xa4\x5f\xf6\xcc\x04\x3e\x3b\x88\x5e\x63\xfd\x6d\xba\xf5\xe7\xe0\x26\x86\x41\xc0\x2d\x10\xde\x95\x72\x95\x34\xf3\x95\xd5\xdc\xe8\x2a\xd6\x92\x5a\x22\x62\x67\x8c\xf1\xa9\x64\x59\x95\x13\xb0\x17\x85\xef\x2b\xd1\xee\xfb\x63\x39\xf5\xff\x75\xb9\x45\xcb\xfe\xa7\xc2\x7a\x48\x22\x18\x54\x72\x43\x6f\x04\xbc\x06\xac\x7f\x47\x41\xff\x97\xe4\xf5\xbf\x29\x1d\xec\x66\xff\x05\x82\x03\x47\x26\x4b\x0f\x7e\x2a\x6a\xa7\x0d\xac\xa5\xa5\x56\xd0\x12\xdb\x61\xaf\x25\x4a\x72\x5a\x98\x34\xeb\x8f\x85\xd3\xce\xc1\x4a\x04\xa5\x36\x5c\xd8\x76\x30\x12\x7d\xe9\x63\x18\x6c\x37\x63\xf1\x59\xc5\x7a\xde\xef\x4a\x3b\xb7\xa6\x42\xa8\xa0\x48\x9b\x11\xe5\xc6\x4d\x45\xe7\xb2\x9c\x0b\xe4\xed\x00\x0b\xce\xda\x11\x11\x52\x42\x6d\x97\x9f\x9a\x7d\xd1\xaa\x2c\x67\x1c\x7b\x37\xe6\xd0\xce\x93\x31\x61\xbf\x59\xeb\xde\xf2\xc2\x59\xf9\xd7\xaf\x33\xb5\x5b\x0c\x08\x78\xf5\x69\xdf\xff\xfc\x2e\xba\x69\xc8\x6e\x6f\x7b\x75\xaf\x60\xd2\x2a\xce\x5c\x18\x47\x93\x95\x7b\x39\x1f\x63\x32\x4d\x45\xdf\x55\x75\x7e\xa8\x96\x6a\xa8\x38\x5a\xaf\x43\x3b\x96\x14\xd8\x54\xc2\x2e\x6b\x8f\x19\x4a\x73\xca\x50\x01\xc8\xd0\xc8\xba\xf3\x39\xeb\x27\x32\x6e\xc7\xaa\xb2\xce\xb7\x6d\x03\x4a\x77\xca\x61\x66\x85\xcc\x52\x25\xea\x42\xf3\xac\x26\x7e\x72\x79\x51\xe2\xb2\x1d\x09\x63\xc8\x3b\xc9\xa0\x85\x10\x2f\x45\x71\x25\xb9\x32\xcc\x90\x28\x4a\x62\x1a\x74\xc7\x51\xe8\xe8\x7d\x3d\xfd\x0e\xbb\xcc\xab\x2d\xe4\x85\x39\xf8\xf1\x7b\xd6\xca\x77\xc2\x9d\x32\x6b\x93\xe3\x29\x93\x09\xf6\x35\xc2\xa2\xd0\x82\x0b\xeb\x14\xe7\x4c\xcb\x02\xc1\x12\x23\x74\x71\x59\xce\x6d\x4f\xda\x3a\xcf\xb5\x64\x5d\xe5\xfb\x1d\xfa\x53\x4e\xe9\xee\xf0\xa7\xe3\x56\x2b\x53\x22\x2e\xa8\xe6\x8e\x5b\x6b\x8c\xcc\xce\x51\x97\xd9\x4c\xb5\xa3\xd2\x66\xc2\x45\x23\x14\x6f\x61\x2e\x91\x0a\x23\xc5\x80\x2f\x12\x1b\xbc\x53\x01\x5d\xf4\x9b\x2b\xbe\x68\x3d\x69\x2b\xc6\x28\x79\xba\x7f\x5c\x31\x46\x15\x2c\x0e\xde\x00\x65\x0f\xce\x16\x70\xbf\x0f\x6e\x79\x9c\xce\x4d\x3b\xa7\xaa\xdd\x95\x62\x1e\x01\xfa\x12\x06\x03\xd1\x85\x83\x22\xb6\x79\xe0\x1e\xfc\x83\xb0\x9e\x6f\x30\x1b\xcb\x26\xbc\xfd\x5a\xd8\x26\x2e\x2d\xb7\xcc\xce\x0e\xc5\x6e\x16\x71\x89\x90\x60\x56\x36\xad\xa9\xb7\x07\x1f\xc6\x7d\x80\xfb\x5c\x5b\x39\x1f\x0a\xcc\xa4\xe4\x71\x44\x43\x36\x32\x82\x68\x1f\x70\xac\x65\xe8\x43\xfc\xbd\xe8\x87\x28\xff\xba\x6b\xf4\xe1\xb9\x01\xb9\xfd\xf0\xd3\xf6\xdd\xdd\x0f\x6f\xee\xa2\x64\x79\x0b\xcf\x3a\xcc\xf7\x77\x6f\x57\xe8\xc6\x6f\xc0\x4f\x9b\x23\xca\x63\x54\x9d\x70\x15\x43\x04\x58\xdb\xa8\x6a\xf0\xbd\x76\x7e\xe2\x20\x4a\x2a\x7a\xc0\x93\x3a\x47\xc4\xef\x05\x2b\x15\x2f\x0d\xb4\x0d\x19\x84\x36\x92\xc7\xf5\x4e\x53\xe1\xdb\xae\x01\xd8\xf8\x6e\x89\x53\x8a\x92\xc1\x28\xd3\x18\x38\x4f\xbe\xb7\x80\xc5\x1c\xce\xb8\x40\x35\xee\x8f\xa5\x25\x25\x49\x50\xd6\xfa\xd6\x1f\x85\xa4\x20\x02\x08\xa4\x45\xd8\xbf\x97\x1a\xc0\xed\xf0\x85\x8b\xb9\x54\xef\xf7\x0f\xf7\xb7\xca\xd1\xf7\xef\xee\x9f\xee\x93\xfb\xa7\xfb\x37\x81\x2a\x13\xae\xbb\x1b\x74\x72\xc8\x1c\x63\xf0\x21\x7a\xf3\xf0\xe1\xcd\xbb\xe4\xe9\xd3\x9b\x87\x0d\xf6\xc6\xca\x02\x69\x49\x2c\xac\xc7\xd2\x1e\x0e\x87\x29\xee\xc6\x34\x07\x91\x3f\x66\x29\x4b\x61\x01\x53\x93\x53\x29\x09\xf3\x07\x03\x64\x79\x8e\x90\xd5\xb2\x82\xa9\xaf\x77\xf8\x54\x7a\x4c\x88\x60\xb8\x3b\x62\x21\x39\xd9\xa5\xc6\xef\x01\xf4\xdc\x1f\x41\x06\x8e\xc6\x8f\x7b\x4b\xc9\xbc\x2f\x32\xdc\xa3\x89\x97\x1c\x70\x7f\xf0\x93\x02\x08\x1c\x15\xe8\x90\x37\x23\x40\xff\x5f\xe9\x7b\x0e\x81\x83\x92\x46\x77\xa1\xab\xb5\xb2\x80\xef\x1f\xef\xdf\x3c\x65\x21\x2b\xfd\x2d\x58\x01\xe1\x1b\x6d\x7c\x63\x26\x53\xd6\x86\x2b\x87\x47\x4a\x25\xe1\xbb\xf4\x0b\xda\x90\x2f\xcd\x66\xf4\xfd\x6c\xbc\xf6\x03\x57\x0c\x64\x80\x7b\xcd\xb5\xd4\x7a\xc9\xa1\x8a\xb3\xbe\x73\xbb\xe2\x32\x17\x58\x35\x14\x5f\x3b\xb0\x5c\x47\x03\x4b\x2c\xb9\xed\x9c\xb7\x1b\xf1\xc5\x55\x57\xea\x98\x1f\x96\xfa\xd4\x81\xe1\xb3\xdd\xb4\x96\x57\xd2\x9c\xa4\xa2\x96\xa8\x5d\x71\x3a\x82\xa1\xf1\x59\xf3\xa5\xbd\x9a\x6e\xda\xf8\x48\xf7\x9d\x68\xfb\x6e\xa4\x43\xf7\xcc\xf9\xb5\x3b\x1d\x3e\xe5\xef\x56\xfc\xde\x75\xa6\x7c\xb5\x8e\xbd\x65\x45\xae\xfe\x14\xb7\x76\xc1\x6f\x42\x84\x8a\xa3\x1c\x56\x08\xc6\x99\xd7\xb6\x73\xbe\xb2\x96\x09\xa3\x12\x5b\x69\xa1\xed\x89\x6f\xc4\x49\xe6\xc9\x94\x2a\x23\x06\xb8\x57\x45\x91\x9e\x22\x9c\x98\x13\xde\xee\x03\x4b\xd2\x04\x96\x50\x01\x46\x8e\x3a\x4d\x9c\xe5\x4a\x19\xe6\x6b\xaf\x8d\xef\x6b\x58\xc1\x52\x03\xa3\xc3\xbe\x32\x85\x75\xa1\x42\xd6\xfd\x74\x83\x4a\xfd\x96\x62\x10\x1a\x36\xbb\xbb\x87\x57\x5c\x7f\xb0\x14\x88\x75\x15\x67\xf3\x11\xf4\x1e\x87\x19\xf8\x12\x5c\x82\x80\x54\x06\x8e\xf3\x7e\x73\x3c\x1d\x0a\x9c\x14\xd5\xac\x2a\x69\xc5\x92\xfa\x0c\x40\xc5\x66\x56\x3b\xa5\x8c\x36\xc6\xac\x4c\x16\x73\xea\x0d\xa3\x73\x23\x04\xb0\x8a\xea\x76\x9a\xa7\x31\xcc\xe5\xe4\x73\x3f\xf4\xcf\x6f\x50\x91\x4b\x89\x97\xac\x30\xf9\x77\x37\xc7\xef\xcd\x43\x40\x42\x3f\x7e\x8f\x4e\xbf\xcb\x9b\xbd\xea\x07\x8f\x74\x73\xe4\x53\x9e\xa0\x54\x69\xcc\xa1\xc2\x08\x65\xbe\x29\xbd\x16\x80\xe1\x26\x69\xaa\xcf\xb8\x72\x4b\x51\xd3\xf7\x80\x75\xdd\x4e\x9f\x23\x23\x35\x28\x08\x3b\x47\x4e\x36\x83\x27\x87\xcc\x66\x72\xa9\xc1\x9d\x51\x20\x9f\x1b\x1f\x59\xbb\x64\x03\x01\x71\x19\x6e\xa1\xe7\x22\x43\x1d\x6e\x83\x5f\xef\x3f\x0d\xc8\xdf\xe8\x95\x27\xe8\xc3\xad\x27\xe8\x2f\xea\xde\x6c\xd3\x12\x82\xe9\x0b\x07\x07\x58\x70\x8a\x41\x51\xc2\x1a\x62\x50\x7e\x1e\x80\x44\x38\x69\x95\xe2\x1a\xd6\x54\xcc\x51\x55\x3d\x37\x69\x2d\x97\xce\x51\xe2\x1b\x21\x85\xc4\x94\x86\x27\xec\xd4\x53\x96\x9b\x9c\x68\xdf\x27\xbd\x9f\xb4\xd7\x01\xe3\x33\x9e\xe9\x46\xed\xd4\xea\xf8\xba\x62\x7c\x7e\x07\x9e\xde\x3e\xc6\x60\x29\x9f\x3f\x3e\x7d\x0a\xb0\xac\xfb\xbb\x0f\x3f\x6d\x10\x61\xa2\x6d\xbb\x81\x9c\x23\x33\xe1\xf1\x90\x0e\x43\x8d\x40\xba\x53\xb6\x80\xde\x99\x3d\x73\x5e\x9e\x23\x31\x01\xe4\x50\xb1\x37\x00\xaf\x18\x1f\x00\x8e\x67\xb2\x81\xa1\x8e\x78\xee\xfb\x7e\xe5\x97\xf7\xac\xe4\x12\x47\x43\x65\x8c\xcb\x29\xa7\x82\x11\x48\x19\xa2\x0c\x2b\x31\x6c\x8b\x25\x05\x76\x5e\x53\x5b\xa2\xb9\xd7\x1c\x56\x90\x83\x1e\xc1\x1a\x21\xd0\x5f\x7a\x5c\x55\xc0\x5c\x2d\xc7\x7b\xf5\x27\xbd\xf1\xf1\x79\x7f\xff\x78\xbf\x02\xa6\xdf\xac\x45\xf2\xeb\x2d\x71\xfb\x6a\x30\x1f\xe3\x2a\x26\x1e\x4e\x20\x62\x7e\x3a\x47\x55\xeb\x7b\x01\xf0\xe0\x73\xb3\x64\x16\x76\x5b\xcc\x3d\x33\x8c\x62\x29\xcb\xb9\x01\xa9\x31\x83\xee\x13\xd1\x55\xd2\xb5\xdb\xa3\x31\xae\x13\x4e\x1d\x7d\x0d\xc8\x60\x8d\xea\x3d\x74\xce\x79\x2e\x19\x74\x90\x00\x43\x49\xd7\x6a\x57\xdb\x4e\x0f\x26\xda\xc4\xf0\x5c\x6d\xe0\xf6\x18\x6d\x2f\x48\x94\x25\x36\xbd\x7d\xbc\x5f\xf6\xc8\xb7\x4b\x50\x7a\xba\x7f\xdc\x40\xef\x1c\x10\x81\x3c\xbf\x3d\x7e\xa6\xd5\x8e\x7a\x7a\x71\xd3\x03\x70\x86\x00\x85\xbd\x67\xed\x93\xac\x73\xc5\x3f\x7e\xbf\x86\x0e\x1e\xa1\xaf\x44\x65\xb6\xf7\xd7\x3a\x32\x16\x80\x54\x80\x07\x77\x8f\xca\x57\x95\x6f\xf3\x6d\x34\x30\x1d\x34\x33\x11\x3c\xc9\x78\xf0\x85\x0b\x68\x84\x6d\xd3\xf7\x5d\xe7\x96\x3b\x3f\xb9\x93\x93\x34\xb5\x29\xc4\x49\x39\x78\xc8\x62\xec\xeb\x61\xc5\x6d\xec\xcf\x6c\x73\xd8\x89\xe8\x4d\xb8\xfa\x9f\x5e\xb8\x4c\xeb\xbb\xf9\xf8\xf8\x26\x40\x69\x3e\xfd\xfc\x95\x33\xe7\xee\x6e\x45\xda\xc4\x68\x72\x81\x10\x59\x38\x4f\x1c\x28\x26\x14\x43\x2e\x9d\xca\x4d\xc5\x54\x81\x72\x5c\x22\x63\x21\xc0\x82\x7a\xbb\xed\xab\xca\x36\x47\x21\x8e\x8d\x47\x95\x12\x38\xcf\x2d\xcc\xfd\xc8\xca\xd4\xa5\xf0\x98\x67\x15\x74\x94\xad\x1c\xab\x2c\xae\xee\xc4\x0e\x5f\x7c\x01\xdf\xbe\x76\xcb\xbd\xa3\x27\x9e\x94\xa7\x2e\x69\xbf\xd4\x55\x5c\xcf\x6c\x87\xad\xf4\x52\xd9\xc4\xcd\x41\x68\x72\x17\x37\xe7\xf2\x4e\x85\x1e\xcd\x8b\x8e\xdd\x57\x1d\x45\xf0\x8a\x8e\xf2\xf4\x16\x7c\xa5\x41\xbb\x4d\xcb\x22\x4e\xdd\x49\x56\x71\x5a\xa0\xf8\x50\x85\x52\xcf\x82\xde\x79\x14\x66\xb0\x03\x20\xa7\xc3\xf5\x51\xc8\x84\xec\x7e\x0f\x24\xc1\x73\x7f\x92\xc2\x33\x50\xab\xa4\x3a\x1c\x7c\xd3\xf7\xfd\x7c\xe8\xfb\xeb\x1a\x70\x3b\xfe\x3c\x3f\xfa\xf4\x32\x39\x8a\x7f\xc1\xe3\xea\xd7\x77\x5f\x9b\xf4\x06\x42\xc1\xee\x48\x3d\x9c\x29\x8a\x31\xe8\x1d\x97\x26\x58\x1d\x19\xc4\xfc\x51\x51\x43\x54\x0e\x8e\x61\xb4\x92\xa6\x31\x99\x27\x07\x6a\xea\x59\x67\x7c\xc6\xc0\x20\x3c\x8c\xb3\xcc\x67\x3b\x6e\x69\xee\x04\xf2\x53\x43\x07\xa7\x0c\x35\xaa\x08\x44\x3b\xaf\x8c\x31\x22\x2d\x91\xf1\x07\x5e\x69\x40\x7c\x57\x59\x07\x52\xc3\xcc\xb2\x6f\xf2\x67\x9d\xc0\xb7\x17\xc7\x8c\x67\xe7\xc6\xeb\x6c\xfc\x76\xb1\x82\x9b\x0e\xc9\x66\xaa\xc0\xe0\x51\x9c\x7e\xee\x0e\x15\xc8\x40\x67\xab\xbd\x18\xe7\xac\xaf\x64\xdd\x81\x06\x1d\xfc\x9e\x80\x32\xce\x41\x34\xca\x71\xda\xe9\xc9\xf9\xc1\xda\x25\x7c\x75\xbc\x93\xca\x28\x61\x4d\x25\x7d\xe3\x1a\x53\xd9\xca\x74\x66\x70\x01\x1f\x03\xcc\xb9\xbc\x13\xc1\x5f\xfc\x57\xc1\x15\xe9\x8f\xab\xcf\x38\xf8\xf0\xc3\x7d\x88\x2f\xd7\x3e\xc0\xcf\xd7\x96\x64\x7c\x17\xec\x8e\x6f\x8e\x7a\xac\x2a\x3f\x99\xe3\x86\x56\xd5\xc9\x00\x16\x78\x0b\xc2\x72\x4b\xb4\x75\x23\x07\x51\xe5\xc7\xb8\x75\x94\x5a\x31\x4f\x9c\x38\xcc\x77\xf4\x54\xcd\x9d\xb7\x02\x70\x70\x48\xf8\x34\x6d\x8a\x78\x9c\x0b\x5b\x95\xdd\x9e\xf6\xcd\x2c\x63\xe1\x8f\xad\xde\x03\x11\x8f\x85\x9f\x1a\x34\x76\xdd\x9e\x1c\xdb\x25\x0f\x21\x21\xf6\xc8\x30\xf5\xfd\xf3\xd7\x47\x30\x4c\x58\xc2\x51\xbc\x7d\x77\x7f\x0e\x76\x9b\xed\x87\xbf\x04\x9b\xc9\x05\x1d\xc8\xc3\x3c\xd6\x73\x7b\x74\x20\xf3\xa2\xe2\xd6\xda\x44\xd7\xc2\xf2\x1a\xe9\xce\x23\x2f\x29\xb0\xa0\xd9\xc9\xc1\x9d\x23\xe7\x21\xd8\x3b\x30\xfa\xc2\x1f\xf0\x39\x6a\x58\xd3\x37\x03\x1b\xda\x5e\xf6\x47\xe6\xd8\x7e\x59\x6f\x71\x7e\x56\x77\x3a\xbc\x9f\x95\xcb\xf4\xd5\xae\x14\x30\x52\x2f\xfc\xa2\xa7\xfb\xa7\xc4\x56\x40\x54\x80\xf8\xb6\xf2\xae\xf2\x3d\xc0\xa0\xa8\xc2\x70\xb9\xf8\xec\x40\x5a\x4d\x3b\xb9\xdf\xef\xdd\x38\x8e\xa3\xf3\xb5\x57\x6e\x9e\x9c\x5b\x32\xb8\xb0\xbe\x23\x7c\x26\x77\x75\x52\x45\x7f\x11\xfd\xdb\x70\xa6\xd6\x0a\xf2\x1f\x83\x25\x6d\xb8\xdd\xf6\xd7\x74\xe1\xe3\xc3\xfb\xd7\x8d\xaa\x6f\x7e\x65\x09\xc4\xc8\x61\x4d\x8c\x74\x4a\x0b\x3a\xb9\x52\xd1\x12\x32\x06\x8d\x3f\x52\x90\xcb\x16\xe4\xa7\xc9\xe5\x39\x5f\xd2\x64\x5a\x0a\x26\x4a\x59\x62\x48\x49\xae\xfc\x48\x41\x2a\xce\x11\xd0\x49\x75\x8e\x04\x17\xcc\x32\xa7\xcb\xaa\x05\x85\xe7\x82\xe5\x21\x26\xf8\xb1\x51\x0d\xc8\xd4\xc1\xf7\x69\x26\x35\xb3\xbc\xa4\x4a\x31\xaf\x25\x0d\xbf\x30\xfa\xa6\x57\x35\x48\x83\x87\x3d\x88\x79\x4c\x83\xaf\xe9\xc5\xb5\xf5\xb5\x76\x15\x58\x3e\x53\xf0\x86\x0d\xc8\xd0\xa4\x75\x39\x4a\x90\x70\x44\x40\x49\x31\xca\x68\xeb\x85\x04\xa2\xeb\x9c\x1f\xc4\x64\x6a\x2e\xe5\x52\x7f\x52\x3a\xeb\x43\xee\xf2\xe0\x6b\xe0\x0f\x62\x02\xca\xf7\x9d\xa8\x0f\x92\x8a\x2a\x02\xf1\x52\x13\xda\x84\xac\x9a\xc5\xeb\xf9\xfb\x61\xbb\x1c\xcf\xc7\xcb\x31\x4a\x04\x70\x15\xe8\xbd\xae\x41\x44\xa7\xba\x72\xfe\x28\x40\x66\xfd\x18\x9b\xae\x33\xfe\x60\xaa\x0a\xa0\xb9\x89\x97\x3f\xab\x3a\x90\x46\xc9\x86\x5d\xea\xcc\x5f\x5d\xea\x82\x77\x77\x21\xb3\x8b\xef\x3e\xfc\xb0\x56\x04\x49\x98\x45\x6d\x5b\x07\xeb\x41\xb4\x4e\x57\xea\x40\x87\x5a\xd6\x7d\x0a\x10\x88\xa4\x9f\xfc\xb8\xd3\x85\xf0\xfb\xc1\xf5\x20\xf3\xfb\x4e\x01\xe8\xa1\xaa\x4c\xab\xbd\xad\x46\x73\xac\xc3\x7e\x4d\xcf\xf4\x4e\xdf\xe8\xd5\xbc\xb9\xa9\x0f\xbe\xf2\xbd\xf8\x78\x59\x23\xbb\x80\xd7\x4b\xa2\x4d\x74\x8a\x56\xe9\x86\x16\xe4\x33\x7a\x7e\xc4\x7c\xb5\x2d\xfc\x58\xf9\x2a\x6b\x7b\xd5\x54\x3b\x74\x3a\x82\xbe\xeb\x3a\x1f\x75\x5d\x37\x2b\xe7\x66\x15\x9b\xc9\x8f\x52\xf3\xc3\x92\x6b\x77\xe7\x72\x53\xee\xc8\xb3\x47\xfb\x2b\xa6\xc3\x2a\x81\x7d\x65\x6c\x6f\x4a\x42\x88\x28\x34\x2a\x0e\xb9\x52\xda\xee\xf7\xfb\xfd\x8e\xfc\xa9\x65\x2c\x10\x0e\x26\xaf\x7d\xcb\x00\x05\x4d\xd2\x78\x0c\xd0\xe9\x70\xf1\xaa\x0d\x98\x56\xb1\x93\x61\x7f\xba\x68\x71\x3c\x7c\x4f\x20\xe7\xf1\x5a\x8d\xac\xfa\xe8\xa1\x37\xd4\x9a\x1c\xca\xc0\xad\x0e\x18\xea\x92\xf3\xbc\x80\x18\xe2\xc6\x56\x16\x20\xef\x80\x68\x4a\xa2\x9a\x1d\x2d\x28\xd9\xef\xed\xd1\xb6\x73\x4f\x57\x21\x1b\x3b\xa7\xf1\x34\xd7\xf1\xd8\xda\xa3\x62\x6c\x0c\xb5\x10\x0c\x98\xc2\xab\x26\xf8\x57\xf5\x58\x72\xc9\xc1\x7e\xbc\x86\x9d\x0b\xd2\x3a\xee\x82\x7f\xc8\x35\x93\xed\x37\x6e\x3e\x64\xb1\x99\xf7\x0e\x38\xe6\x69\x47\xe6\x03\x03\x3d\xf1\x69\x5c\x64\xa9\x87\x3b\x3a\x97\x81\x6a\x6d\x3c\x73\x8d\x1b\x59\xad\x00\xf6\x53\x6b\x6d\xef\x28\x5f\x73\x10\x7d\x26\x5b\xba\x2b\x2e\xfc\xa0\xb7\xbf\x5e\x15\x4a\xbe\x77\x34\xe2\x1b\x7a\x6b\x3c\xa5\xa3\x9d\x28\xcd\x20\x44\x30\x5b\x36\x6a\xd4\x89\x7d\x3c\x5a\x4f\x41\xb3\xc9\x1d\x2a\xda\x76\x36\x8c\xa7\x36\x25\xa0\x3f\x35\x09\x9d\x19\x98\xfc\x78\x54\x20\x8b\x45\x2c\xe6\x23\xd0\xc7\xb0\x56\xd1\x59\xdd\xd5\xf1\xb8\x3a\x10\xdf\x3f\xdc\xbf\xc4\xb2\x87\x04\x3b\x10\xb9\x30\x90\x28\x3f\x1b\x90\xc6\x78\x1e\xe3\x7e\xb2\xbe\x73\x41\x7b\x24\x56\xc1\x1b\xae\x0c\x47\xf0\x9f\x7f\xdd\x1b\xbb\x3d\xb9\x2f\x1b\xc0\xcf\xcf\x6c\xc8\x8f\x4f\x1f\x1f\xee\xb8\x3b\x11\xe7\x92\xf6\x44\x96\xb5\x18\xcc\xbd\xa8\x6f\x80\xe1\x02\x92\x9c\x22\x98\xa5\xab\xa1\xea\xe1\xe0\x8f\xbb\xf2\x4f\x91\x52\x77\xd1\xe7\x74\x2b\x7a\xe7\xb4\x31\xd6\xef\xeb\xcc\x64\xa5\xf6\x18\xf4\xda\x1a\x13\x81\x78\xa9\x19\x6d\x42\x57\x8c\xf7\xcf\xdf\x58\xfc\x27\x06\xd0\xcc\xa6\x60\xf4\x42\x00\x25\x7c\x6d\x90\xc7\x0c\x54\xc8\x77\x31\x9b\x8c\xb4\xbe\x6f\x4d\x0f\xa8\x6f\x47\xdb\x06\x99\xd4\x28\x89\x49\x04\x37\x78\xbb\xbf\xac\xce\x67\x05\x83\x6b\x0e\xbc\xc1\x76\xb0\x80\x0f\xc3\x76\xff\x59\xa9\x66\xdb\xcd\xcd\x52\x6f\x9a\xe5\x5c\x84\xf8\xa2\x03\xe6\x40\x45\x7f\x16\x62\xdd\x15\x48\xb0\xea\x14\xbd\xbb\x7b\x7a\xb1\x50\xbf\x10\x40\xc3\xc0\xe2\x4e\x54\x27\x56\xc5\x10\x22\x87\x0b\x4f\x5c\x39\x56\xa1\x8a\x2d\xe6\xb1\x9a\xbb\xb8\xf4\x87\x92\x9a\x76\xeb\x3c\x0b\x8b\xbe\xe6\x14\x09\xe5\x0f\xa8\x03\xd0\xef\x97\x73\xb4\x46\xbe\xd2\x08\x71\x8c\x92\x18\x9d\xc9\xb6\xde\xad\x7a\xfe\xbf\x7f\x3e\xd7\x8f\xaf\xe1\xa0\x59\xf2\xe1\x87\xfb\x8f\x8f\xef\xef\x1f\xee\xd7\x0d\x2e\x46\x36\x96\x4a\xad\xeb\xbd\x40\xbe\xd5\x4e\xdb\x58\xfa\xb6\x26\x50\x15\x65\x12\x25\xf9\xe9\x60\x66\xc3\x68\x6e\x21\x8a\x45\x19\xe2\x2c\x88\xc0\x21\x0b\xe4\xc9\x38\xad\x87\x62\xa8\xc3\x75\x46\xee\x9a\x4d\x7f\xd1\x94\x5f\x4d\xbb\xaf\xfe\xa5\xa1\x73\x15\x57\x71\x5e\xc5\xc8\xe3\x1e\x14\xcc\x0f\x43\xd5\xfb\x46\x02\xd6\x7b\x9a\xd8\x25\xcf\x74\xbe\xec\xeb\x03\xe8\x4f\x43\x52\x78\x76\x8e\x2c\x88\x40\xe8\x6d\xc6\x41\x43\x84\xee\x54\xa8\x50\xae\x3e\xe1\x77\x1f\x7e\xf8\xf9\xe9\xfe\x31\x41\x15\x22\x4e\xd2\xe1\x68\xed\x4e\xa1\xae\xfb\xac\x37\x59\x5f\x01\x9b\x7d\x91\x17\x8c\x09\xdd\x90\x4b\xac\xba\xd6\x7e\x9f\x7e\xa9\xf8\xcb\x7a\xd7\x75\x82\xe5\x4b\xd9\x2a\x78\xce\x45\x4a\x29\x96\xa2\xbf\x56\x7f\x12\x21\x4d\xf0\xdc\x2a\x0a\x5d\xc1\xc0\xbe\x80\xae\x40\x20\xf0\x3b\xd9\x19\xdf\xf1\x1d\x8c\xee\xc2\x19\x78\x5e\x2b\xe0\xee\x05\xd4\xf2\xe9\x87\xfb\x0b\x90\x72\xd9\x7e\x78\x75\xe2\xcb\xfb\x4c\x22\x77\x28\x09\xe2\x44\x93\xe2\x74\x24\x55\x1e\xef\xbf\xb0\x44\x9c\xdc\x0e\x7a\x75\x9c\x80\x9d\xab\x71\x16\xfe\x90\x55\x59\x68\x2a\xc6\x7d\xef\xe6\xc6\x05\x1d\xff\x88\x6f\x86\x1d\x8d\x7e\x7b\x45\xa5\xbf\x88\xe7\xbc\x09\x40\x8f\xf0\xe2\x26\xb5\xdd\x54\x69\xaa\x79\x69\xe0\x7e\x1d\x39\x58\xd8\x29\x27\x5b\xc9\x36\x0d\x9e\x0f\xbe\x29\x50\x57\xb6\xfb\x92\x52\xa4\xf7\x80\xa2\xbc\x02\x39\x18\x0a\x4f\xfd\x94\xe5\xeb\xde\x6e\xcf\x74\x33\x3c\xcf\x1e\x9f\xee\x1f\xfe\xee\xd5\xd7\xf4\xe7\x1f\xae\x54\xb9\xfb\x8f\x8f\xb1\x32\x0e\xe0\x54\xda\x92\x67\xa2\xc4\x19\xaa\xf6\x3d\x6f\x3a\xb3\x85\x4b\x5d\xf7\xa5\xf2\x6d\x66\x53\x06\xb2\x24\x9b\xdb\xb9\xa9\x94\x8b\x33\x70\x2c\x22\x10\xc3\x48\x6c\x6c\xc0\x88\x44\x97\x6c\xec\xda\x54\xfe\xf8\x14\x0f\xd5\x72\xd1\x4b\x51\xda\x4e\x34\xcd\x4e\xcd\x83\x9d\x0d\xe5\xc6\x28\x19\xef\x6d\xb8\x46\xfa\xb3\xbb\x13\xdb\x26\xba\xbb\xae\xe0\xeb\x4e\xb5\xfc\xad\x3b\x51\x9f\x9a\xba\x4e\xe8\xa9\x59\xf6\xf5\x6d\xf3\xa7\x83\x52\xbb\xfc\x4b\xb4\xe1\xbe\xa8\xc2\xbf\xe7\xc1\x0b\x38\x0b\xa8\xde\x08\x3c\x64\x3f\x3c\x2b\x49\xc4\x81\x00\xfd\x74\x5d\xbf\xb1\x4a\x46\x5c\x96\x99\xcb\x25\xd7\x98\x9f\xfa\x1c\xa0\x0a\x20\x3f\x54\x7e\xd8\x65\x73\x3a\xa7\x87\x62\x6f\x5b\xc0\x93\xe3\xdc\x83\xa3\xcf\xdc\xa9\x4e\x96\xc2\x0f\x6c\x68\x22\xb7\xf5\x36\x8b\xb6\x57\x0d\xb9\xcd\x60\xa8\xa1\x7a\x9b\x55\x0d\x6d\x02\xee\x30\x1a\xce\x78\x3b\x6e\xc4\x8b\x56\xf1\x9b\x57\x3b\xed\x0b\x9b\x05\x7c\x2d\xb6\xfd\xee\x62\x22\x35\xc5\xd0\x3e\xf7\xc4\xd0\xe7\x29\x26\x41\x57\x79\xbf\x11\x52\x72\x03\x6b\xc6\x4f\x93\xd6\x49\x7a\x9a\xc2\x6d\x6f\x82\x73\xab\x58\xee\x3c\xf5\x29\xa1\x99\x4a\x71\x31\xc6\xa6\x2e\xf7\x38\xe4\xb3\xee\x5c\x6e\x8f\x89\x8a\x9e\x22\x1c\x45\xef\x3f\xae\x53\xd7\xcb\xc0\x75\xa5\xfd\xbd\x0d\xbe\x49\xdf\x85\xea\x6c\x02\x18\xfa\xd3\xcf\x0f\x49\xe4\x35\xa3\x9c\x70\xd2\x24\x2c\x4b\x67\x1e\x77\xd9\x69\x4c\x7a\x3a\x19\x46\xa8\xd3\xe2\xe0\x27\xc2\x09\xc9\xcb\xff\x87\xb3\xb7\x07\x92\x24\xd7\xf3\xc3\x12\x59\x5f\x79\x77\xe4\x7b\x39\x3b\xdb\x3b\xc9\x8f\xc7\xcb\x7e\xbd\xb3\x83\x77\xbc\x23\x71\xaf\xd9\xd3\x60\xdc\x17\x48\x05\x75\x08\x49\x54\x80\xbc\x23\x05\x4a\x0a\x0a\x41\x89\x0a\x48\x86\x02\x0e\x23\x10\x21\x83\x88\x90\x21\x98\x30\x61\xa6\x99\x66\x9a\x69\xa6\x59\x66\x9a\x65\xa6\x99\x66\x99\x15\x3b\x9d\x68\x45\x22\xab\x7a\x6a\x7a\x67\x29\x4a\xbd\x5b\x5f\x59\xdd\xbb\x05\x14\x80\xff\xd7\xef\xff\xfb\xb1\x22\x0f\x87\x13\x05\x1a\xd8\x86\x93\xd0\x1e\x0c\x22\x92\x21\x6e\x21\xd4\x5c\x2b\x7c\xb4\x48\x31\x42\xb5\xe3\x4c\xb1\xc2\x15\x05\x86\x96\x7a\xa1\x08\x17\xf1\xf3\xda\x67\xb2\xa9\x56\x66\xb1\xb9\x6f\xaf\xd5\x8b\xbe\xe0\x3f\xbe\x8b\x96\x7f\x29\x68\xdd\x3e\xdc\x36\x69\xb6\xe4\x12\xeb\x30\x0a\x8f\x32\x9b\xcb\xa1\xa6\x3d\x09\x9e\x03\x44\x7a\xe0\xa6\x13\x48\xd2\x6e\x22\xab\x42\xca\xd9\x39\x6e\x30\x12\xd0\x33\xcc\x86\x70\xd4\x9a\x75\xc0\xf0\x50\x9b\x64\x9d\x54\xcf\x76\xd3\xad\xb2\xcf\xdc\x84\x6f\x3f\x47\x17\xbf\x01\x6f\xee\xdf\x5c\xab\xd6\x1e\xd7\x32\xb4\xa0\xf9\x71\x00\x55\x68\xc0\x50\x4f\x27\x06\x2d\x64\xeb\xcc\x52\x6e\xe5\x2a\xb3\x93\xb3\x36\x55\x93\x4b\x95\x8a\x87\x2d\x44\x83\xa7\x4d\x92\xac\x92\xe6\x19\x6f\xea\x95\x4f\xfe\x46\x54\xb2\xfa\x8c\xd4\x88\x86\xe7\xf6\xa5\x4e\xbe\xd9\xfd\x10\xf1\x54\x8f\xef\x3f\x3e\xfe\x06\x2c\x15\xad\x0d\xae\xa6\xbc\x02\x07\xe4\xcb\x62\x22\xc0\x70\x0f\x61\xba\x0f\x3d\x14\xc0\x89\x2a\x9c\xc2\x31\x78\x06\x70\x17\x7a\x8a\x42\x0f\x0e\x10\x1a\x23\xe0\x2a\x0f\x47\xe7\x41\xc1\x11\xa1\xa1\xae\x73\x4e\x62\x1f\x19\xe3\x06\xd9\x92\x71\xce\x30\x2a\x21\x51\xf3\x3a\xf6\xcf\x74\x53\xad\x58\xf4\x76\x7f\xbd\x7c\x0f\x5f\xd6\x10\x37\x0f\x77\x37\xe0\xf6\xe1\x9a\x9b\xed\xf6\xe6\xdb\x3f\x01\x0f\x7e\x93\x05\x01\x98\x7b\xaa\xe7\x28\x55\xa4\x87\x26\xd4\x2b\xde\x51\xda\x14\x07\xea\xf3\x7d\xea\xa1\x5f\x31\x5b\x4f\x10\xe3\xf4\x50\xd7\x75\x3d\x0d\x8a\x90\xba\xb7\x86\x59\x03\xcf\x35\xab\xe4\x99\x6e\xcc\xaa\x88\x36\xfd\xef\x7d\xdd\x77\xf9\x5c\xb7\xbd\xdd\x18\xf7\x54\xb9\xc8\x79\x4d\x41\x61\x00\x9e\x7d\x20\xa5\x0c\xeb\x78\x8f\x9f\x67\x2b\x88\x18\x5b\xf5\x53\x96\x6a\x27\x84\x96\x96\x2b\xe5\xa4\x16\xf6\xbc\x3f\xcc\xa6\x5a\x65\xe7\xb3\xe3\xc2\x8b\xb0\x74\x6e\x7c\xbf\xb9\xc6\x34\x8b\x7d\x10\x3c\x4d\xc6\xc9\xac\x24\xc2\xfd\x9e\x3c\x27\x4f\xfb\xd5\x10\xe8\x19\xb5\x2c\xc1\x41\x20\x8b\x9c\xd6\x08\x62\x66\x95\x36\xde\x5a\x3f\xcf\xe7\xbc\xa6\x87\x55\x9d\xbc\x8b\x3d\x22\x7f\x70\xd5\x1d\xb2\xd9\x7d\x1f\x2b\xfd\x4b\x15\xf2\xfb\xcd\x02\x30\x7e\xbb\x7e\xb7\xfb\xfe\xc3\x02\xa6\x4b\x91\xcd\x8b\x14\x09\xd3\x02\x4a\x42\x35\x86\x63\x70\x0c\xd0\x83\x15\x94\x4b\x90\x01\x6d\x58\x40\x59\x2e\x73\x90\xcd\x41\xf4\xa9\x05\x23\x60\x2c\xb4\xa1\x5c\xd5\x05\x82\xca\x0b\x0c\x2d\x12\x96\x58\xc4\x29\xc1\x58\xfa\x3d\x13\x79\xc6\x42\x07\x89\xa1\x10\x53\xa9\x25\x4d\x36\xc9\xe9\x99\x6e\xe8\x8a\x5e\xe9\xfd\x9d\x77\xdf\xe2\x10\xbd\x8e\x76\x4e\x60\x70\x60\x08\xa5\x0b\xa5\x8d\x70\xf2\x11\xb0\xa7\xfd\xe5\x59\xda\x6b\x3d\xe9\xe7\x04\x24\xc0\x18\x63\x82\xd5\x5a\x27\xab\xc4\x3d\xb3\xcd\x61\x45\xcf\x39\xf9\x38\x0b\x1f\xbe\x8f\x59\x84\x15\xf8\xa2\x96\xb1\x6c\xee\xb4\x50\xf5\x28\x41\x92\xee\x9b\x5e\xf7\xdd\x34\xa4\xa7\x4c\x69\x24\x0a\x85\x20\xcc\xc2\x40\x42\xad\x00\x22\xd5\x8a\xb2\x93\x55\x55\x3b\x6a\x65\x41\x12\xf6\x41\x0d\xb9\xcb\xc5\x29\xd4\xce\xca\x53\x02\x92\xee\x59\x6e\x60\xba\x8f\x1e\x48\x54\xb9\xbd\xe0\x2f\xd6\xce\xfb\x27\xe4\x01\xad\x00\x4b\xf3\x89\xd3\x94\x07\x92\x9a\xc9\x2c\xb9\x00\xf7\x8c\xd7\x22\x95\x67\xf6\x89\xfb\xc5\x50\xc6\xac\x4d\xe7\xcd\x41\x35\x26\x4d\xaa\x2a\x95\xc1\x87\xce\x1a\x0e\x72\x40\x9f\x8e\x49\xfc\xff\xb1\x95\x48\x4d\xb2\x5b\xfe\x6a\xf3\xe1\xfb\x6f\xd2\xae\xea\x43\xa5\x00\xe9\x52\x13\xaa\xd0\x5a\x13\xc9\x52\xfe\x66\x3a\x26\x76\x47\xb7\x3e\xf9\xc5\x8b\xa2\xd3\xf7\xe7\x1c\xf4\x9f\x9e\x79\x94\xd3\x3f\x46\x60\xf7\xe1\xfb\xc7\xf3\x9a\x99\x43\xa1\xed\xee\xf6\xe3\xe3\x4b\x3a\xf0\xf2\xf8\x85\x88\xf9\xcd\xee\x1f\x7d\xf8\x2c\xa5\xfd\x12\x3c\x49\xc4\x40\x69\x55\x51\x00\x0b\x21\x48\x9e\xc4\xc0\x29\xe8\x60\x19\x48\x4c\x96\x5a\x90\x4f\xf2\xe5\x19\x54\x84\x08\x92\x72\x5c\x98\x02\x3a\x68\x8a\xd4\x92\xc2\x14\x64\xc2\x2b\xf8\x74\xb0\x69\x39\x0d\xf3\x6d\x03\x73\x69\x1d\x29\x4a\x85\x51\x80\x29\x21\x10\xe1\x30\x9c\xa5\x8b\x7b\x22\x30\x27\x84\x32\xc4\x69\x4e\x59\xc1\x69\xce\x68\xc9\x68\x1d\x32\x80\x69\x38\xb1\xe4\x77\xe3\x1c\xf0\x57\x73\x00\xcf\x9c\x51\xff\xb9\xa3\xbf\x68\xaf\xfe\xff\x1a\xe9\x53\xbb\x2e\x3e\x8d\xf2\x3f\x7f\x54\xe1\xa4\xf0\xcb\x00\x92\x24\xc9\x56\x59\xa2\x76\x2c\xd6\xef\x2e\xb9\xc7\x4b\xc5\x69\x39\xca\xcf\x26\x64\x36\xbc\xab\xd9\xf7\xbd\x64\x20\x5f\xf2\x68\x6f\xaf\x3e\xfc\xa6\xa9\x31\x01\x28\x34\xc0\x7d\x6a\x01\x3c\xa5\x05\x3e\x38\x47\x71\xe1\x0a\x9c\x3a\x0d\xb9\xe6\x13\x65\x48\x43\x26\xa2\x93\x7f\x11\x23\xd9\x1a\xa4\x98\x0d\x7b\x6b\x01\xb6\x7a\xda\x03\x0c\x34\x13\x48\xb2\xe0\x88\x62\x8c\x71\xc6\x29\x67\x51\xae\x51\xb9\xa0\x6d\xb2\x49\x4f\x09\x8e\xf9\xa0\x5f\x27\x3f\xc4\x5a\xd3\x3f\x8a\xd9\xf6\x2f\x38\xf7\x6e\xee\xdf\x2c\x88\xad\x4b\xb4\xfd\x18\xe9\xf6\x76\x97\x02\xe9\x92\x6e\x61\xf5\x38\x3a\x00\xdd\xe9\xe4\x83\xce\x72\x70\x9c\x46\x19\x6a\x0e\x32\x11\x6a\xe0\xcb\xe0\x52\x11\x0e\xcd\x62\x0c\x27\x07\x9a\xce\x4b\xd7\x6c\x32\x6b\x85\x10\xc2\xda\xa9\xa5\xd8\x86\x41\x78\x52\x5b\x93\x52\x6b\x8f\x32\x74\x62\x3a\x72\xa5\x34\x4f\x56\xa9\x49\xe8\xce\x6c\xe5\x0b\xaf\x78\xa4\x00\x48\x77\xdf\xee\xbe\xdb\x3c\xbc\x68\x40\x5c\xdd\x5e\x74\x31\x2e\xe8\xdc\x9b\xef\xee\x77\x8b\xe4\xcb\xa5\x17\xf8\xed\xdd\x87\xb7\x77\x9b\x9b\xfb\x87\xdd\xcd\xfd\xc3\x2a\x03\x52\x89\x3e\x23\xd4\x2f\x5d\x44\xfb\xfd\x7e\x7f\x3a\xed\xf7\x16\x64\x42\x84\xd3\x38\xce\x6e\xac\x50\x45\x30\xa1\x89\x7a\x53\x84\x60\x0d\x21\x81\x7d\x1e\x95\x02\x8c\xd9\x26\xba\xf3\xe1\xb4\x2f\x1a\x93\xef\x2d\xd7\xdc\x28\x23\x8d\x73\xa3\x39\x72\xcd\x6d\x9f\x45\xf2\x62\xcd\x95\x1e\x50\xc5\x3d\xc8\x15\x60\x50\xca\x51\xa9\xe4\x77\x56\x59\x62\x76\xf5\x17\x79\xa6\xbf\x95\xfc\xfe\x05\xd1\xf8\xe6\x27\xbd\x4f\xab\x57\xcc\x9a\xd7\x70\x83\x85\x56\x6b\xd5\xac\xf8\x53\x1d\xd5\xcd\xfa\x69\x1f\x1f\x46\x8e\x2d\x62\xa0\xb5\xcc\x52\x33\x9d\x1c\xe2\x16\x65\xae\xe0\x43\xc7\x5b\x5b\x2a\xab\xb6\x68\x4a\x40\xdb\x75\x5d\xc8\xdb\xb6\x0d\x5e\x59\xe2\x54\x56\xb5\xac\xad\x71\x30\x65\x89\x0d\xec\x38\xe1\x40\x94\x87\x96\xb6\xf1\x8c\x94\xcf\x64\xe7\x57\x65\xf2\x3e\xe6\x4b\x7f\x42\x46\xb4\xfb\xf0\xfe\x61\xf7\xe1\xf1\x61\xf7\xa1\x9c\x5d\xa6\x48\x57\x04\xb6\xd7\xaf\xe6\xdb\x39\x5c\xd8\x7c\x78\xff\xb0\xf9\xf0\x7e\x87\xf2\x20\x90\x93\x38\xb7\x85\xe8\x06\x7d\x2a\x40\x3e\xe4\xc7\x23\x04\x0a\x48\x5a\xef\x01\xc9\x43\xf3\x94\x19\xbf\x5c\xf0\x2d\x28\xf3\xd0\x03\x95\x07\xd3\x78\x38\xf6\x34\x0c\x05\xc0\xcf\x49\x01\x0a\xc0\x34\x76\x65\x8e\x24\xf6\x9c\x0a\x5f\xea\xf8\x8f\xc8\xb5\xd0\xb0\x10\x48\x23\x05\x48\x9e\xcd\xaf\x72\x01\x35\xd4\x48\xa3\x3d\xc6\x86\x63\x06\x92\x52\x43\x55\x6a\x98\x6c\x56\x28\xe9\x76\x34\x6a\x8d\xff\x32\xf2\x9c\xdd\xbe\xaa\xc7\x9e\xfd\xc1\x78\xe1\xac\x6a\xfc\xe6\x76\x83\x60\x09\xaa\x27\x0a\x54\x01\x0b\x5a\xda\x92\xa4\x59\x8d\x08\xc8\x3f\x8d\xa9\xa4\x53\x3f\x1f\x36\x91\x79\x69\x6b\x98\x98\x37\x77\x38\x48\x8d\xb4\x2c\xb1\x52\xce\xf9\xc0\xa6\x83\x5d\xf8\xb4\x56\x38\x61\x3b\xb3\xd5\x2f\xec\x6a\x97\x88\x66\xe1\x38\x5f\x7f\x99\x77\x3e\xb7\x6a\xbf\x39\xef\xcb\xf3\xee\x14\xa0\xaa\x22\x58\x50\xcb\xfa\x00\xb2\x39\x14\x63\x52\x89\x52\x2a\xd4\xf6\x04\x24\xfb\x20\xd2\xa3\x16\x52\xa8\x50\x44\x98\xe4\x86\xcc\x81\xbd\x0b\x47\x2a\xb5\xe1\xd0\x19\x6f\x55\x38\x69\x5e\x56\x50\x8c\x46\x7a\xe5\x40\x0f\x5a\xc2\x8c\x24\x81\x2a\xc3\x8c\x5a\x62\xcd\xec\x59\xec\x54\xda\x47\xd6\xf2\x77\xeb\xcd\xcd\xf7\xf3\xf7\xfb\xfd\xfb\xf9\xe9\xb7\xdf\xdd\x97\x0b\x63\x5f\xf9\xc3\x9f\x81\xf5\xf9\xdb\x7e\xd8\x7c\xf8\x7e\x9b\xe3\x30\x86\x3d\x60\x20\x2b\x26\x07\x3c\x20\x45\xf0\x41\x8b\x03\xa0\x3c\x77\xb9\x0b\x22\x74\x3e\x1c\xc3\xa1\x48\x59\xc8\x8b\x34\x0b\x18\xa5\x2e\xed\x55\x59\x88\xb2\x34\x44\x40\x68\x60\xc9\xcb\x02\x09\x64\x39\x25\xba\xc8\x0d\x9c\xbf\x50\x51\x9a\x62\xa9\xdb\xed\x93\x71\x87\xb7\xfc\x9c\x25\xba\xbf\xf0\x5e\x2f\x04\x59\xeb\xde\x83\x3e\x20\x20\x9f\x4e\x20\x53\xe0\x10\xe0\x96\x8f\x2e\xec\x27\x92\x76\x53\x0f\xaa\x64\x73\x5e\xe7\xfb\xd8\x7d\x07\x93\x3f\x8a\xdf\xc3\xea\xac\x37\xfb\x0b\xf0\x52\x15\x5d\xf0\xac\xb7\x6f\xef\x1e\xee\xff\x4e\x34\x51\xdb\x9b\xdb\xc7\xd5\xec\xd5\xdd\x7d\x7c\xbc\xdd\x6d\xfb\xac\xef\x73\x6d\x33\xa5\x55\x95\xd7\x0a\xe2\xa9\x17\x95\x9a\xd7\x03\x6c\x3a\xa4\xc0\x18\x50\xaa\x32\x30\x66\x45\x1e\xb2\xbc\xa8\xcb\x22\x14\xc5\x6a\x1f\x2a\x3f\x98\xda\x16\xb6\xe0\xac\x36\x9a\x4a\x20\x22\xf7\xd5\x41\x8b\xc3\xd4\x0c\x96\x33\x37\x44\xdf\x39\x91\xcf\x72\x57\xa5\x3c\x62\x59\xbe\x8f\xf9\xf6\x17\xe3\x73\x91\xa3\xb8\x30\xe2\x7c\xe6\x38\xeb\x9e\xc6\x6d\xf7\x74\x5c\xd1\xd3\x7e\xc5\xd3\xd2\x12\x6f\xa4\x9e\x4f\xab\xfe\x89\xdb\xa2\x5c\x5e\x49\xdd\x83\xde\xda\x50\x5a\x0b\xf6\x50\x11\x66\x04\x11\x54\xf8\x16\x22\x44\xb9\x11\x4c\x32\xe1\x63\x1c\x2c\x9f\xc9\x3a\xdb\x9a\xe4\x26\xae\x57\x7c\x51\x3e\x98\xcf\xe1\xf3\xf9\x3c\xcf\xfc\xc7\x4b\x64\xfe\x8a\x9b\xeb\x0b\x18\xf0\x5e\x29\xb3\xdf\xa7\xd9\xe1\x30\x02\xf3\xb4\xaf\x0f\xc0\xc5\x81\xb7\x46\x48\xe5\x6d\x2b\xf7\x2e\x74\x69\xef\x30\xd1\x24\x64\x14\x19\x44\xb7\xc6\x50\x58\x99\xaa\x32\x95\x9d\x60\xda\xa0\x4f\x0d\xa0\xa1\xb5\x99\xe0\x56\xb0\xe0\x80\x69\xb5\x93\x1d\x68\x91\x15\x54\x72\x21\x89\x8e\xb5\xdd\x5d\xa2\x9e\xe9\x9a\x7c\xd1\x8f\x7a\x9f\x3c\xbe\x8a\x42\xaf\xd0\x2d\x5f\xeb\x49\x7d\x7b\x85\xae\x76\xc0\x38\x50\x05\x11\x93\xe2\x3e\x48\x17\x04\xa8\x82\x07\x32\x98\xfa\xfa\x58\xb6\x6e\x3a\x38\x97\xc2\xe9\xb0\xcd\xa5\xb4\x72\xda\x0b\xab\x94\x15\x29\x96\xa1\x95\x72\xb9\x9b\x9a\xa9\xe7\x3c\x45\xa1\xd9\xc7\xef\xd9\x3c\x93\x35\x8c\xb5\xce\xc8\x28\xfc\xf6\x67\xb8\xa5\x37\xef\xce\x88\xb4\xb3\x29\x9f\x77\xe3\x5d\xdc\x76\xb7\x8b\xf8\x84\x01\xb6\x8a\x62\xbf\xe5\x94\x01\x1c\xf4\xca\xbb\xc9\x39\xc0\x1d\x02\x55\x28\x31\x69\xdd\xe9\x04\xb2\x3c\x8c\x2e\xa8\x02\xd4\xa1\x81\x8c\xd4\xc7\xcd\x50\x55\x46\x1a\x23\x43\xf7\x9c\x58\x0f\xf2\xae\x54\x56\x30\x63\x8c\x2a\x4c\x39\xf4\xd0\x42\x63\xa9\x58\xb4\x15\x13\xfa\x4c\xd7\x6a\x8b\xa2\x6f\x77\xfb\x82\x35\x7b\xcd\x11\xf9\x9a\x22\xf2\xdb\xcd\x2b\x8a\x48\x20\xbd\xf3\xce\xda\xf6\xe9\x50\x32\x67\x57\xd2\x4d\x5d\x4a\xa6\xa6\xf6\x00\x7a\xaf\xad\xd0\xc6\x80\x2e\x9e\x5e\x6b\x16\x4e\xb3\x01\xb7\x61\xb4\xc3\xc8\x41\x05\x8e\x3f\x21\x88\xa4\x83\xd1\xa6\x5e\x08\x5c\xd7\x89\x78\x66\xeb\x22\xf2\x36\x2c\x0c\x9c\xc9\xdb\xeb\xb2\xde\xd9\x6b\x78\xf3\x35\x34\xf4\xe6\x8a\x79\xf3\xd4\x54\x86\x55\xc2\x39\xab\xac\xab\xf7\x72\x6f\x7d\x05\xa4\x03\x28\xf4\x5c\x53\x5c\x12\xca\x83\x4f\xdb\x58\x08\x0f\xd8\x63\xa7\xd5\x96\x08\x69\x4d\x59\x7b\xa1\xb5\x91\x4e\x6a\xa9\x24\x9b\xe4\x38\xba\xc9\x28\x31\x1f\xb7\x29\xe7\xfb\x81\x0d\x7b\x52\x86\xf6\xa0\xda\xcb\x3e\x27\xab\x21\x6a\x04\xde\x46\x8e\xc5\xf9\x80\xbd\x7d\x73\xfb\xed\xee\x4b\x50\x53\xd4\x92\xfa\xfe\xc2\xab\xbb\x72\x2c\x9c\x42\x95\xa2\x69\x9f\xa5\x2c\x33\x16\xab\xd2\x12\x8c\xb2\x40\x73\x69\x34\xa8\xc3\x71\x5e\xa8\xf3\x6d\xab\x2d\x29\xf9\x44\x29\x09\x74\x28\xab\x72\xf6\x95\xf7\x27\x79\x5a\x39\x30\x94\xd3\xc9\x06\x1e\xeb\x0c\x89\x7a\x56\x2b\x1d\xf1\x39\x77\x31\x83\x7e\x56\x4c\xbf\x48\xe9\x7e\x7c\xbc\x39\xb3\x6b\x3d\x46\xb5\xf4\xd5\xc5\x69\xec\x7c\x51\x82\x32\x94\x60\x88\xec\xa4\xd6\x06\x17\x1c\xe4\x4e\x87\x53\x0b\x69\xac\x25\xd1\xd0\x6e\x35\xc2\x28\x48\x19\x64\x6d\xba\xa2\x74\x02\xfb\x1c\x74\x81\x15\x69\xb6\xf2\x34\x54\x6e\x52\x7e\xc9\x19\x98\x67\xb5\xab\x36\x26\xf9\x3b\xc9\xe3\x85\x7f\xe1\xa7\xad\xbd\x0f\xf7\x0f\x31\xa3\xb5\xf9\x29\x9d\xd2\x59\x57\x08\xdc\x5c\x0a\xc9\x4b\xb9\x65\x97\x11\xeb\x01\x3e\x7a\xcf\xbd\x75\xb2\x92\xbd\x68\x4f\x3d\x06\x3c\x70\x12\x4e\xc7\xa3\x95\x9c\x32\x27\x34\xaf\xd9\x1e\x24\x52\x60\x40\xc1\x98\xca\x1f\x13\x00\x1d\x60\x0e\x8c\x1b\x63\xca\xbc\xb2\x9d\xf4\x66\x1f\x2c\xe0\x8d\x55\x7e\x6f\x6d\xe1\x0a\x64\x90\xb7\x52\x6a\x41\x43\x03\x70\xad\xac\x6f\xac\xcd\x72\x57\x7c\x12\x8d\x5d\x82\xea\xbd\xb3\xf3\xd8\xfc\xb3\xde\xf9\x8d\x88\x3c\x68\x7f\xf6\xb3\x9c\x86\xef\x6f\xbf\xd6\xe4\x7c\xfb\xf6\xd5\x88\xc0\x1e\x14\x7e\x9e\xf2\x4a\x72\xce\x3d\xf3\x62\x2f\x9f\x93\x55\x06\x4a\x7f\x3a\x79\x35\x5f\x53\x4e\x1c\xe4\x73\x82\x52\xff\x63\x02\xf2\x0a\x14\x55\x8a\xd6\x55\xd7\xc5\x46\x65\xc9\x83\x07\xdc\x5b\x53\xb7\xee\xfa\x92\x68\xb4\xa9\xdb\xa7\xa6\x75\x8b\x76\xc4\x50\xd9\xd9\x16\xf0\x67\xb6\xab\xd7\x26\xf9\xa3\xe4\xcf\x23\x3f\x48\x02\xce\x8c\xd0\xdb\x5f\x82\x6f\x5f\x28\x7f\x17\x4a\xe8\x1f\x16\xca\xdf\xf9\x14\xf8\x70\xff\xee\x7e\x49\x85\xfd\xa4\xf7\xe0\x4a\x1a\xc2\x05\x58\x20\xc5\x1d\x37\x54\x41\x96\x99\x5c\x8a\x4a\xbb\x8e\xf6\x8e\x16\x4f\xaa\xb1\x7e\x0d\x33\x9f\x75\x58\x12\xf2\x63\xb3\xca\x43\x4f\x35\xa7\xa5\x10\x30\xb4\xd4\x95\xdc\xf2\x54\xc5\x26\xe6\xd5\xc9\x85\xd6\x57\x47\x74\x6a\x25\xac\xbb\x62\xef\x40\xe2\xa4\xd5\xfe\x08\x6c\x18\x82\x09\x5e\x82\x02\x48\xd0\x48\x49\x28\x66\xe1\x68\xa7\x6e\xa9\xbf\xa7\xd0\x14\x7d\x83\xab\x2e\xb2\x0b\x26\xab\x84\x3f\xe3\x5d\xbd\xb6\xc9\x3f\x8c\xe3\x9d\x47\xfb\xdd\xef\x83\xaf\x0f\x37\xbd\x1e\xee\xb7\xef\xee\x7f\xf8\xf0\xb8\x8c\xf7\xe3\xe3\xbb\x74\x11\x8a\x5a\x46\x3b\x8f\x33\xcf\x4b\x25\x96\x81\xd2\xcc\x2e\x03\x6d\xd9\x97\x03\x6d\x8b\x52\xeb\x1f\xbb\x55\x1e\xf6\x82\xb8\x31\x14\xec\x60\x42\xc7\x5c\x29\x2c\x5f\x9d\xdc\x28\xdd\xe7\x21\xf6\xf6\x3c\x44\x90\x03\xf9\xe5\x18\x11\x2e\x4b\xe6\xc2\xd1\x05\x2f\x0d\x0a\xa4\xd1\x5c\x80\xa3\x28\xba\x0a\x47\x7d\x9a\xe4\xf4\x4c\x77\xd9\x3a\x39\x47\xba\x7f\xff\xb3\x47\xfa\x6a\xe5\x5d\xb3\x4d\xbc\xe4\x5d\xc0\x00\xfa\x0a\xf4\x41\x0d\x9d\x68\xf7\x55\x7d\x10\x63\x15\x6c\x27\xb8\x66\x6a\x45\x8d\x10\x4a\x02\x5a\x55\x3f\xba\x6a\xdd\xa7\x91\xbc\xc6\x2a\x67\x2b\x13\x2a\x20\x5a\xa9\xb5\x07\x0d\x11\x82\xf3\x88\xf0\x65\xe5\x27\x2f\xd6\xd9\x93\x8d\x9f\xab\x79\xa6\x3b\xbb\x22\xc9\x2a\x7a\xea\xdf\x2d\xd9\x9e\x17\x62\xe4\x08\x39\x4f\x36\x1f\xfe\x10\xac\xf6\xde\xa7\x6c\xb4\xce\x0c\x4f\x9d\x69\xc3\x49\x82\x7c\x8d\x64\xc0\x4f\x8e\xa7\x79\x8a\x56\x64\xea\xd2\x7c\x7f\xe0\xc3\x9e\xb0\x30\x54\xa6\x95\x26\x18\xed\x62\x79\x3a\xf9\x9d\xe8\xdf\xf8\x58\x8f\xff\x4d\xf2\x67\xc9\xbf\x48\xfe\x5d\xf2\xbf\x26\xff\x21\xf9\x3f\x93\xff\x38\xdb\xe1\x97\xf6\xdd\x97\xe6\xba\xf7\xb7\x5f\x5a\x91\xe5\x2a\xb8\xdd\xee\xae\x2f\xfe\xf4\x37\x97\x6b\xe0\x8b\xdc\xeb\xc7\xff\x44\xf2\x75\x3e\xe5\x4d\x9a\x15\x16\x21\xae\xb8\xc6\x82\x5a\xc6\x29\x85\xc1\xa6\x45\x9a\x14\x8e\x13\x49\x98\x72\x58\x71\xca\x24\x63\xbc\x08\x7e\x1a\xd3\xac\xd4\x9a\x13\x2a\x0c\x91\x8c\x30\x5e\xd3\xf2\xfc\xfb\x96\x53\x49\x98\x74\x58\xb2\x5a\xb4\x3c\x0f\x7e\x3a\xac\x61\xf0\x00\xb9\x89\x39\x40\xb2\xe0\x53\xc2\xc3\x3e\x6d\x2a\x42\x24\x6c\x89\x2e\xab\x34\x87\x7a\x81\x38\x6f\xa9\x57\x25\xe4\x02\x97\x2a\x2f\x19\x81\x08\x61\xe1\x14\xc2\x04\x63\x32\x5f\x82\x25\x2e\xe7\xb3\xbd\xae\x04\x67\x08\x61\xa8\x8a\x12\x42\xc2\x11\x16\x5e\x2e\xbf\x06\xe3\x5f\x72\x8c\x42\xa3\xf9\x84\x08\x49\x7b\x18\xf5\xdd\x1d\x41\x48\xf5\xa5\x2a\x24\x2b\x55\x20\x34\x49\xb2\x84\x3d\xf3\x88\x45\xfd\xe5\x39\x87\xf4\xc7\x91\x83\xfe\x5f\x5e\x61\xda\xcf\xbc\x57\x9b\x1f\x3e\x6c\x7f\xf9\x33\xc4\x57\x91\x28\xf0\xa7\xc4\x57\x1f\x5f\x89\xe5\xa7\xb5\xcc\x8b\x43\x8b\x19\x9b\x8f\x01\x06\x28\xd8\x2b\x4d\x64\x9b\x76\x13\x89\x1e\xdf\x73\x02\x6a\x4a\x30\x2b\x78\x09\xb5\xc7\x9d\x0d\x03\x18\x41\x75\xb9\x64\x35\xae\x5d\x18\x83\x64\x58\x21\x9e\x72\x3e\x3f\x6c\x35\xcf\x73\xa1\x2d\x46\x9c\x60\x68\xb5\x24\x08\x91\x7d\x68\x94\x0a\x87\xa9\xa4\x34\xd7\x19\x3c\x58\xaa\x45\xdd\x99\xcb\xeb\xce\x60\xcd\xaa\x03\x64\x92\x08\x4e\xe2\xfd\x39\x7f\xbf\x66\x2f\x3c\x70\x7f\xb8\xf4\x2c\x7c\xfb\x0b\xf0\x4b\xf0\xe1\xf1\xb7\x1f\x3f\xa3\x16\x62\xbd\x7f\x31\x0a\x57\x14\x38\xa9\x01\x7d\x49\x88\x2d\x5d\x5e\x38\x6b\x8c\x99\xbd\x41\xd0\x3f\x1d\x8c\x01\x89\xb1\x6e\x53\x86\xd3\xa7\x11\x31\x98\x65\x2e\x83\x25\xe0\xd1\x61\x28\xc0\x38\x1d\xd6\x5d\x2a\x7b\xf7\x34\x46\x87\x32\xde\xe6\xfd\x12\x75\x50\x68\xf4\xad\x2e\x2c\xb5\xff\x24\xf9\xcb\x8b\xce\xf8\x67\x27\xf0\x26\x96\xee\x1f\xee\xde\xbd\x16\xaf\x7f\xb7\x3b\xeb\x5f\xdc\xdc\x5e\x2b\x7f\xde\xdc\xbd\xd9\x7d\xf8\xb8\x79\xb8\xdb\xfe\x0a\xbc\x7b\xb8\xfb\xd5\xec\x83\xa7\xa8\xb6\x9d\xad\x2a\xdb\xd9\x1a\xcd\x87\x87\x94\xf3\xb1\x46\x42\xa7\x84\x08\xc6\x94\xae\x28\x4c\x59\x1c\x9f\x93\xc3\xfc\x33\x8d\x86\x8a\x1a\x90\x36\xeb\xba\xae\xdb\x66\x52\x6a\xad\x17\xa5\x06\xad\xbd\x9e\xef\xc2\x50\x48\x54\x42\x4c\x94\xd2\x5a\x2b\xa3\x53\xc1\x65\xcb\x55\x96\x89\xa3\xd6\xa3\x4a\x7e\x91\x56\xcf\x62\xe7\xb6\xfc\x6a\x7c\x1f\x5e\xd8\xbf\xfe\x24\xf9\xcb\xe4\xaf\x16\x25\x8b\x0b\x4f\xcb\x15\x5b\xc1\x99\x61\x7c\x77\x7e\xdc\xbc\x1a\xf9\xcb\x0c\x7c\xc1\xa0\xfd\x73\x51\x5c\xb2\xc6\x01\xa6\xc8\x06\x3e\xff\x9b\xa2\x00\x53\x1f\xb9\xc7\x0f\xa0\x0c\x43\x3e\x3f\x4d\xc9\x3c\x15\xd3\xec\xbf\xd4\x4a\x6b\x00\x2f\x4f\xca\x39\x48\xd1\x5a\x3f\xc9\xb5\x0e\x79\x0a\x3f\xe5\x29\x0a\xf9\xd1\x40\x46\x04\xa6\x44\x61\x9f\x0e\x3a\xcf\x05\x8b\x4a\xb6\xd8\x6d\xb9\xa6\xc1\x80\x2c\x68\x60\xc3\x09\x18\x1a\xc6\x48\x4f\x2e\x25\x0e\xb5\xb4\xf2\xe5\x2e\xec\x75\x70\xd6\x02\x95\x61\x82\x88\x24\x88\x22\x45\x2a\x5c\x16\x98\x48\x82\x09\x52\x91\xa7\xed\x77\x22\x06\xb9\xda\xda\xc8\x91\xf1\xcf\xa2\xb6\xf1\xbf\x4f\xfe\x63\xf2\x7f\x25\xff\xf7\x3c\x73\x1f\xde\xce\x61\xcc\x2e\x06\x09\x67\x73\xba\x8c\xfb\xee\xbb\x73\xbd\x32\xa6\x94\x7e\xf8\xb0\xdd\x7c\x6e\xec\xba\x7d\xb8\x7d\xbf\xbb\x7d\x04\xdb\xdd\xc2\x3c\xb5\x80\x77\xee\x6e\x7e\xfb\xb9\xd4\xfe\xdb\xc7\x87\xbb\x79\x7e\xe7\x25\xf8\xf8\xf9\xfd\x2b\x95\x9b\xeb\xdf\xd8\x66\x53\x85\x5b\x07\x53\x69\x86\x90\xe4\x39\x2a\xd0\xd2\x1b\xe6\x59\xed\x8b\x4c\x4a\xc4\xcb\x6a\x69\xc0\xcc\x72\x1f\x2a\x0c\x98\xcf\xf3\xfa\xc0\xfa\x31\xd0\xf4\x14\x14\x4a\x0b\x18\x8e\x72\xf6\x41\xca\x89\x8c\x66\x1c\x11\xca\xe3\x09\x79\x08\x43\xe9\xf5\x68\x85\x18\xc4\x61\xb0\xc3\x80\x60\x96\x49\x04\x55\x36\xbf\x55\x38\x3d\x18\x21\x46\xb1\x29\x38\x28\x30\x16\x07\x9d\xe5\xb0\xc4\x88\x49\x54\x7a\x69\xf5\x80\xb1\x31\x99\xa5\x85\xdb\x67\xa5\xa1\x0a\xab\x3c\xa3\x48\x96\x54\x1f\x08\x99\x28\x45\x19\x26\xe1\xc0\x79\xf0\x32\x83\x48\x68\x4c\x71\xe6\x32\x2d\xbd\xf7\x72\xb9\x5a\xe4\xf3\x65\x58\xbe\x5c\x4f\x92\x6f\x52\xf9\x05\x0e\xeb\x97\x3f\xb3\xbe\xff\x97\xe4\x7f\x4f\xd4\x97\x98\xb8\x97\x92\xc4\x39\x73\x79\x7f\x8e\x90\xe7\xc7\xb7\x5f\xb9\xb6\x1c\xb2\x9b\xab\x06\xcc\xed\xee\xe3\xfb\x4b\x4f\xe2\xcf\x28\xb7\xac\xca\xd5\xe1\x09\x9a\x48\xe6\xd9\x00\x38\xc1\xcb\xb3\xa7\x32\x65\x53\xa3\xe7\xcd\x19\xea\xf9\xbe\x4d\xe5\xe4\x8d\x31\x47\x1d\xfc\x7c\x3f\xf5\xe3\xa9\xec\xaa\xe7\xa4\x68\xa4\x21\x42\x0b\x4e\xdd\xe9\x70\x02\x19\x53\x8e\x9b\xb2\x0c\x07\xaa\x08\x2a\x08\x2d\x01\xea\xf7\xac\xef\x43\xa9\xfc\x20\xf6\x11\x3b\x9f\x50\x4a\x07\x8c\xf1\x21\x20\x90\x73\xce\x9f\xe7\x0b\xa0\xbc\x7e\x35\x89\x22\x13\x84\x97\x8a\xa8\x92\xe1\x2c\x27\x04\x8d\x2c\x47\x02\xb9\x1a\x13\x54\xf6\x82\x15\xae\x24\x16\x72\xa7\x30\x67\x9a\x1a\xbc\x70\xe9\x5d\x7a\xa6\xdf\x9e\xd7\xff\xff\xf6\x33\xaa\xcf\x11\xc3\xf1\x70\xff\xdd\xcd\x72\x2c\xee\xee\x6f\xee\xbe\x79\xf7\xf1\xed\xbb\x74\xf5\xdd\xfd\xe3\xc3\xbb\x74\x91\xd0\x78\x9c\x8f\x8c\x8b\x58\xcf\x67\x6f\x33\x4a\x94\x7e\x7c\x1b\x31\xf4\x17\x8e\xed\xb7\x0f\x77\x37\xa9\x03\xc8\x03\x12\x81\x5e\x11\xa2\xd4\xe7\x4a\xa4\xd6\x64\xb2\x84\x12\x43\x4c\x8e\x59\xc1\x90\x61\x16\xc1\xcc\xe6\x46\x50\x4c\x24\x0a\x02\xb4\xda\x5a\x0f\x4b\x92\x4f\x27\xa7\x74\x46\x8a\x5a\xfa\x0c\x83\xa4\x4f\x33\xc6\xf6\x7b\xc6\x36\x27\x63\x8c\xb1\x94\x2a\x35\x86\x11\x50\x0e\x11\x84\x14\x21\x6c\x82\x3e\xf4\x20\x2f\x82\x0c\xdd\x51\xe8\x39\xba\x95\x4c\xb0\x55\x6d\x5c\xb0\x35\x24\x14\x24\x29\x0d\x49\xe0\xa1\xa5\x00\x01\x18\xda\x81\xef\x41\x66\x0d\x71\x41\xfa\xc0\xea\x3a\xf9\x9d\x54\x9f\xb9\x9e\x36\xc9\xef\x25\x7f\xf1\xa2\x3b\xfa\x3f\x47\xbd\xcd\x2f\xfc\xcf\x9b\x33\xa4\x71\x77\x85\xc7\x78\xf3\xdb\x98\x41\xbd\x7b\xd8\x9e\x15\x68\x2e\xff\xfc\xf0\x21\x76\x3c\x3c\xde\x7e\xb7\xba\x66\xfe\xbe\xbd\xf9\xf6\x6b\x4a\x9c\x2b\x4b\x91\x81\x74\x55\x6b\x4a\x25\x9b\x3a\xa7\x1d\x68\xc2\x40\x40\x11\x8a\x08\xd1\x43\x93\x81\x65\x81\x90\x1b\xc3\xa9\x30\x2c\x85\x51\xda\x22\x07\x49\x89\x8e\xa0\x46\xa0\x44\x41\xc2\x21\x56\xa3\x2e\xb7\x7d\x9a\x0b\x4c\x2d\x55\x4a\x78\xa8\x99\x40\xb8\x2b\x09\x29\xb7\x9a\x70\xca\x28\x25\x12\x73\x42\xc7\x71\xd4\x56\x09\x2d\xd5\x74\xca\x64\x9e\xb5\x1e\x95\x2e\x4b\xb9\x92\x5a\x28\x4a\xf4\x73\x62\xc9\x54\xea\x50\xeb\xe0\x4b\x09\x98\xce\x07\x4a\xb1\xc5\x42\x50\x8d\xb9\xed\x94\x94\x2a\xd9\xa5\xe2\x99\xee\xd4\x56\xc7\xcc\xc7\x6f\x93\x8f\xc9\x5f\x26\xff\x7d\xf2\x6f\x3f\xa3\xad\x1f\xee\xdf\xdc\xbe\x08\x5b\xbf\x4c\xdd\xd2\x41\xbc\xbb\xff\xf0\x78\xbb\xb9\xfd\x76\x0e\xb6\x1f\x6e\x6f\x36\xf3\xed\x35\x35\x0f\xb8\x34\x1b\xdf\x9e\x77\xf4\x4d\xf4\xbd\xd2\xc3\x1c\x47\x02\xec\x43\x82\x21\xd8\x87\xf2\x92\x7a\x00\xc3\xa7\x16\x42\xd1\x09\x5b\x9e\x28\x9d\x4e\x69\x19\x9a\xec\xc2\x59\xb6\xea\x05\x47\xb8\xe4\x10\x3d\x19\x07\x70\x09\x59\xc5\x25\x44\x80\x69\x56\x59\x0e\xd1\x74\xb4\x73\x70\xbb\x65\xb6\x69\x6c\x38\x61\xa2\xb9\xe4\x92\x29\xa0\x61\x29\xfd\x58\x12\x8a\x8e\x59\x46\x3b\xce\x5b\xc6\xea\x90\x33\x5e\x98\x9c\x00\x3e\x8d\xa9\x0b\xae\x88\x16\x0e\x41\x22\x98\x10\x65\x79\xe0\xfc\xcc\xdd\xb0\xdb\x6f\x4d\xd4\xdb\xbf\x64\x32\x97\x6c\x66\xb4\x18\x6f\x2e\x4c\x6c\xd7\x15\xa8\xe8\x57\xc5\xd2\x76\xa4\xde\x8e\x15\x8f\xdd\xcb\xf4\xbd\xa2\xb4\x5e\xa4\xde\xa2\x16\xec\xc7\xd5\x51\x28\xdb\x75\xfb\x3d\x48\x8c\x3a\x46\x5a\x89\xe3\xa9\xae\x9b\xa6\x03\x84\x87\xde\xf5\xec\x54\x07\xaa\xf6\xa0\x6b\x20\xc8\x41\x46\x62\xca\x26\x85\xd3\x81\x2a\xc1\x0b\x29\xe1\xb4\x4f\x71\x40\x04\xf3\x43\x75\x22\xcd\xd6\x48\x52\x0a\xad\xb5\x39\x9d\x00\x04\x83\xd2\x3a\x70\x33\xbb\x32\x6a\xc2\xba\x62\x5e\x83\xbc\xb6\x24\xd3\x48\x95\x4c\x0b\x6d\x05\xcd\x6d\x8e\x95\x16\x0a\x15\x5a\xd4\x3a\xad\x60\xf2\x7b\xa9\x3a\xf7\xfb\xbd\x3d\xab\x3c\xfd\x59\xf4\xe1\xfe\x79\xf2\x57\x89\x4c\xfe\x8f\x9f\x61\xdd\x88\xf3\xf3\xe2\xb9\x9d\xdb\x99\x1f\xce\xda\xf4\xe0\xe1\xee\xe6\xc3\xdd\xcd\xfd\x1c\xce\xbc\x9f\x6d\xc0\xc2\x4a\x76\xee\x29\x48\x57\x1f\xbe\x79\xbc\x24\x34\xae\x67\x6b\xf9\x85\xf4\x08\x72\x07\x70\x4c\xac\xb9\x58\xa6\x00\x05\x50\xb6\x29\x4a\x89\x11\x09\x1a\x30\xbb\xb7\x9d\x05\x34\xb8\xb4\xdb\xdb\xae\x03\x6c\x1f\xda\x6e\x6a\x25\x13\x5c\x28\xc1\x04\x13\x4a\x53\x67\xdc\x29\x15\xae\x69\xa8\x22\xb8\xa0\x14\x4e\x95\xd3\x52\x48\xbd\x8d\x44\xd6\x56\x4a\x63\x8e\x42\xc0\x92\x10\xaa\xd9\x34\x08\x29\x65\x0a\x59\x38\xce\x2e\x62\xcd\xe6\x9f\xb4\xc0\x4c\x71\x3c\x10\xae\x04\x19\x59\x68\xc2\x5e\x02\xc8\x19\xd3\x7b\xc1\x72\x57\x90\x06\x11\xa6\x05\x4d\x92\xdf\x4b\x17\x7e\x2b\x71\x65\x47\x67\x2b\x3a\xdb\xd0\x85\x33\xf4\x2b\x5a\x34\x3f\xf1\x10\xaf\x14\xba\xde\xff\xcc\xf3\x74\x58\xab\x90\xa5\xc8\x05\xe1\x82\xf0\x29\x0e\x45\xda\x44\x47\x30\x86\xd3\xc5\xbc\x8d\x52\x0e\x62\x5f\x67\xd4\xa5\xd5\x69\x63\xd4\xbc\x20\xd2\x6a\x79\xbd\x15\x56\x06\x7b\x9a\x9d\xfa\x13\xd0\x32\xb4\x5a\xeb\xb8\x84\x9e\xac\x10\x2b\x3d\xa9\x34\xb3\x5f\x7d\xba\xf0\xd0\xe8\xb3\x66\xc9\xdb\xe4\xbf\x4b\xfe\x87\xc8\xec\xfe\x35\x2b\x76\xfb\xb9\x46\x1b\x0f\xd8\x78\x42\xcf\x31\xc9\x4d\x64\x31\x9c\xe7\xe0\xdb\xd8\x35\x1a\x83\xdc\xb7\x0f\xe7\xf7\x6f\x5e\x38\x5c\xce\x3e\xc6\xcd\xed\x43\x3a\x80\xcc\x01\x6d\x01\x0c\x07\x1b\xac\x0b\x27\x05\xbc\x03\xf5\xbc\xd4\x01\x7d\x4e\x8c\x71\x4e\xd9\x53\x68\x5d\xa8\x32\x90\x9b\x1a\x0a\xe9\x32\xab\xcd\x09\xb0\xf9\xcc\x89\x7c\xb9\x32\x85\x20\x0f\x47\x90\x6f\xcb\xf9\xeb\xb5\x8c\x71\x6e\x28\xdd\xeb\x7d\x50\x0c\xe4\x4d\xfd\x24\x41\x7e\x02\x9c\x07\x0c\xf6\x08\x85\xe6\x58\x0b\x59\x81\x7a\xac\xeb\x70\x62\xc0\x69\xa6\x29\xa5\x5d\xe4\xe2\x4e\xe3\x7e\x69\xb7\x3a\xe6\x07\xbe\x3c\x35\x96\x28\x6b\x3e\x35\xce\xaf\x5e\x9d\x1a\x77\x5f\x10\xa3\xdc\xbf\xf9\xf8\xf6\x0a\x8c\x7f\x41\x68\xaf\x4e\x52\xda\xb6\x6d\xdb\xa3\x13\x83\xeb\xfb\xfe\x38\xbf\xe8\x00\xe3\x47\x5e\xab\x4e\x4d\x47\xb1\x57\x35\x6f\xb1\x27\xc7\x2a\x0e\xab\x09\xac\x0a\x0c\x34\xc7\xad\x54\xb8\xd4\xd6\x58\x1d\x99\x81\x35\x18\xa4\x55\x21\x33\xd6\x5a\x67\x9e\x0e\xb6\x72\x76\x7f\x3c\xb5\xda\x36\x36\x1d\xcb\x4f\xed\x6c\xbc\x67\x1f\x3f\xb3\x36\xd9\x24\x1c\x9c\x62\x8f\xd5\xe2\x03\x46\x5e\x97\xb7\xf7\x51\xd3\xfb\xdc\x34\xb0\xdd\x2d\x2f\x96\x2c\xf0\xd9\x4e\x7c\xd6\xd6\xf9\xa9\xaa\xd5\x4b\xb3\xf0\xfd\x0f\x1f\xee\x36\xf7\x1f\x1f\x6f\xbf\x73\xae\x85\x99\xcb\xcb\xa3\x0b\x8c\xda\x3d\xcc\x6d\x5e\x82\x64\x6a\x53\x31\xe5\x10\xe1\x03\x3f\x8d\x51\x36\xba\x0f\x28\x6d\x01\x2b\x4a\x0f\x0b\x20\x0c\x44\xa7\xa0\x17\xb5\xbb\xd9\x56\xd8\x13\xc4\x0a\x08\x07\x8b\xd0\xe3\x2d\xb6\x5c\x67\x8a\xdb\x93\x26\x84\x94\x18\x86\x81\x86\x31\x65\x79\xa6\x90\x08\x8e\x07\xc2\x57\x05\xc1\x90\x31\xab\x85\xb5\x76\x1c\xad\xb5\x5a\x1c\xa4\x92\x49\x92\xfc\x6e\x9a\x3c\xb3\x0d\x8b\x7d\x7b\x9f\x77\xef\x6f\x5e\xf4\x6d\x23\x97\x74\x04\xa8\xdc\xbf\xb9\x05\xb1\x7d\xe6\x27\x7e\xef\xcf\x31\xb0\xd6\x88\xed\xb9\x43\xa0\xc4\xb4\x9d\x6a\x90\x30\xbc\x87\x0c\x4b\x39\x8a\xd0\xce\xf7\x92\x22\x85\x08\xa1\xb3\x9d\x0a\x9d\x26\x54\x71\x80\x70\x61\x72\xb4\x26\xc8\x8e\x20\x81\x46\x4b\xfe\xd4\xae\x28\x93\x4c\x86\x6a\x0e\x6b\xf7\xe3\x38\x06\xe1\x1b\xdc\xb9\xbc\x6e\x60\x57\xe5\x70\xf4\xa4\xad\x9a\x06\xee\xeb\xb8\x47\xd9\x33\xdb\xd0\xad\xbe\x1a\xc3\x7c\x4a\xdf\x2d\xba\x0a\xf7\xaf\x5a\x3d\xcf\x0b\x74\xf6\x8a\xee\x7f\xf8\xf0\x36\x0a\x8e\x5d\x57\x66\x56\x23\x2c\x06\x5a\x40\x3f\xec\xf7\x4c\x11\x5c\x12\x02\xcb\x71\x3c\xd9\x02\x92\x43\x51\x4a\x02\xf3\x16\xd6\x8a\x0b\x29\xd3\x9c\x62\x8d\xe8\x56\x33\x6e\x5b\x6b\x3b\x3b\xf5\x92\xcd\xdf\x2f\x4e\xb3\x39\x68\xf7\x96\xe0\xa9\xf3\xb5\x9f\x28\x1d\xad\xa8\x1a\x57\xd3\x28\x8b\x9d\xac\x13\x0e\x86\x9d\xdf\xda\x73\x5e\xe3\x7f\xbc\x56\xa4\x5c\xd6\xdf\x7c\x4e\x5e\x96\x5c\xdc\x26\x2f\xf2\x90\x3f\xa1\x03\xf9\xee\x4b\x4e\xba\xdd\x87\xef\x1f\x5f\x9c\xba\xe5\xef\xd7\xc9\xd1\x1d\x0e\xda\x2b\x23\xd4\x18\xb4\x07\x6e\xd2\x4c\xd0\x53\x1d\x3c\x40\x47\x90\x5d\x9a\xb6\x3f\xd9\x55\x11\xf6\x10\x31\x2c\xa9\xe0\xda\x4a\xce\x62\x69\x85\x14\x8c\x60\xd2\x8c\x14\x64\xfb\xb2\xd9\x93\xd1\x17\x45\xe6\x25\x1f\x7c\xe8\xb6\x88\x73\x6d\x4c\x83\x9c\xb2\x72\xea\x40\x5f\x96\x92\x09\x6b\xa6\x46\x85\xda\xac\xb8\x45\x90\x2b\xca\x89\xa6\xf3\x71\xcc\x09\xe9\x7c\xee\x72\x21\xc8\x5e\x59\x35\xc8\x86\x2a\xe1\xcb\x42\x22\xc5\x6c\xb2\x49\xed\x33\x5d\x9b\x33\xc6\xfe\x4d\x44\x28\x24\xe0\xc5\xee\xbe\x3b\x2b\x99\x5d\x5b\x8e\xd4\xb6\x08\x1b\x46\x7c\xc8\xe0\x7c\x30\x44\xa1\x41\x50\xfb\xca\xfb\xaa\xda\x38\x4a\xb9\x34\xae\x72\xce\xb5\x93\x52\x2e\x6d\x82\x04\x59\xb2\x4b\xf1\xb9\x4f\xfa\x97\xc9\xef\x47\x8d\xba\x3f\x4f\xfe\x69\xf2\x57\x0b\x9f\xe5\x39\x8f\xbd\xf4\x4d\x7c\x56\xfd\xbd\x9d\x17\xce\xe6\x82\xdd\xbf\x6e\x9c\x39\x13\xc9\x9f\x13\x1c\xab\xef\xde\xcd\x51\xdf\xb7\xbb\x45\x8c\xe5\x87\x0f\xbb\xea\x53\xe7\x5d\xa4\x8b\xf5\xa8\x9c\x86\xde\xf7\x7d\x33\x9d\xba\x3e\x25\x27\x3f\xbb\xbf\x8c\x16\x94\xc1\x93\x22\xd0\x16\x64\x3a\xa4\x49\x48\xfc\xe1\x40\x19\xe2\x38\xb7\x58\xe6\x61\x0c\x75\x51\x21\xb2\x19\xfc\xe4\xa7\x53\x50\x1c\x38\x30\xa4\x3d\x46\x88\xb2\xb0\xd7\xda\xce\x33\x8b\xa2\xc5\x78\xaa\x24\x2f\x5d\xc9\x57\xd8\xd6\x1d\xea\xab\x2c\xe6\x7d\x3a\xad\x33\xab\x60\xe9\x0a\x43\xb1\x2b\x24\x8f\xfc\xfa\x55\xf4\x83\x4c\x9c\x83\x7f\x98\xfc\x69\x8c\x36\xfe\x3a\xe1\xb1\x03\xed\x52\x6f\x5a\x64\x15\x5e\xbd\xde\xbc\xee\xdb\xbf\x6e\x24\xba\x00\xc2\x5f\xf7\xf0\x47\x35\x7f\xea\x4a\x20\x3c\x86\x16\x51\x56\x72\xad\x53\xed\x4b\xe0\x7a\x58\x5a\x84\x29\x14\x42\x85\x9a\x42\x50\x94\x45\x55\x40\x20\x3e\x11\x50\x40\xb4\x82\x8e\xf0\x28\xf8\x57\x06\x1d\xfb\xb1\x38\x0e\xa3\x5b\xda\xd1\x8a\x30\xa6\xb9\x73\x5b\x03\xb5\x26\x84\xcd\x5e\x8e\x38\x0c\xa5\xd1\x94\x32\xa5\x94\x95\x4d\xc3\xd5\x1c\x72\x50\xad\x29\x09\xd5\xd3\x5e\xb2\xc2\x16\x3c\x1d\x9f\x0e\xf3\xda\x26\x36\x34\xab\xfd\x73\x62\x82\xd3\x80\x4d\x3c\x49\xb6\xa9\x8d\xdc\x43\x32\xce\xcb\x3f\x7d\xc9\xee\x2d\xda\x13\x5f\xe4\xab\xae\xc1\xbb\xe7\x4a\xd6\x15\x2d\xd8\x17\x24\x11\x51\x81\xfd\xe3\xe3\xdd\x0d\x78\xb8\x8d\xb7\x95\x77\x59\x0e\xe0\x80\xa1\x81\x04\x61\xab\x53\xee\xf2\x0c\x88\x70\xa2\xd8\x10\x81\xb0\xd1\xd3\x71\x8e\x61\x73\x04\x3d\x97\xa0\x08\xd4\xda\x54\xfa\xa9\xab\xa4\x21\x80\x8e\x41\x00\x1b\xba\x14\x32\x7a\x04\x22\x56\x8f\xbb\xad\x44\x08\x1a\xc6\x98\xe4\x5a\xb0\xfd\x29\xbe\xe2\x4c\x49\xc1\x59\x13\x2a\x29\x39\xc2\xc8\x08\x2b\xc8\x44\x09\x4d\x19\x84\x46\xcc\xb6\x12\x33\x3b\x8d\x7a\x0e\xb1\x6c\x92\xac\x52\xf2\xcc\x63\x3f\xe2\x3f\x4e\xfe\x6d\xf2\x1f\x2e\xf8\xa0\x37\xd7\xb2\x13\xd1\x38\xdc\x5d\xd5\x67\x1f\x3f\x3e\xc6\x4c\xc8\xec\xfc\xdf\xbc\x6c\x20\x70\x16\xeb\xbb\x1c\x55\x1f\x6e\xbe\xfd\x13\x70\xf3\x92\xed\xff\x73\xf0\x70\xfb\xc3\xef\x81\xd7\xdc\xf2\xcb\xff\x64\x23\x60\x09\xc6\x4f\x03\xa7\x08\x49\x08\x09\x0c\x07\xd0\xf2\x66\x38\x16\xa0\xc8\xa4\xc6\xa4\x20\x84\x64\x79\x1e\x7a\x7a\x68\xcb\x82\x36\xa6\x49\xb3\xa2\x04\x0c\xb1\x52\x62\x89\x08\x95\x8c\x52\x21\x30\xe4\x8a\x31\x95\x49\x0e\x4b\x90\xd7\xa2\x00\x7b\x44\xf9\x7c\x4d\x7a\x28\x29\xa5\x94\x33\x54\x86\xc3\xd6\x30\x61\x43\x06\x11\x82\xa4\x84\x94\x69\xdd\xdb\xe0\x74\x68\xea\xdc\x64\x25\xae\x80\xb4\x28\xcf\x18\x0b\x49\xd0\x0c\x38\xd0\xa7\x7b\x42\x42\x2f\x09\x62\x94\x10\x28\x98\x40\x04\x19\xa8\xb1\x26\xc4\x8d\x44\x20\x59\x37\x20\x79\x72\x5a\x73\x4c\x34\x25\x0c\x9b\x12\x23\x28\x20\x22\x34\x59\x25\x02\x24\xbb\x6a\x0d\x93\xdf\x44\x64\x68\x02\x5e\x58\x9c\x5e\xe0\xa1\xdf\xbd\x7b\x73\x7f\x73\x8e\x31\x77\xb7\xe5\xfb\x0f\xbf\x8e\x8e\xc8\x99\xb8\x79\x8e\xe5\x81\xdc\x13\x90\x75\x92\x61\x2c\x41\x61\x4d\x81\xc0\x89\x4b\x37\xda\x83\x67\xd6\x83\x13\x7c\x4e\x02\x0b\xa7\x36\x37\xd5\xba\xff\xb1\x03\x4a\xf1\x20\x8b\x5c\xf1\x75\xf9\x69\x00\xa7\xd2\x14\x18\xc2\xb2\x10\xb2\x2a\x10\xe2\x8c\xe4\x19\x28\x10\x22\x82\x94\x5a\x97\x45\x64\xbc\x19\x11\xc9\x73\x14\x66\x9f\x7f\x9b\x1e\xcf\x39\x9d\x5f\x26\xb7\xe7\x7c\xd9\x7f\xf3\xd3\x7d\xb1\xb9\xdb\xbd\xc4\xc8\xcb\xe5\xcd\xed\x15\xcd\x50\xfc\xa5\xb7\x17\x2d\xb4\xbb\x57\x52\x01\xab\xd6\x15\x39\x60\x07\x0c\x2d\xa6\x0c\x6b\x9f\xb6\x25\x2c\xa9\xae\x88\xcd\x0b\xc0\x7b\x5c\x5a\xf4\x54\xa7\x49\x70\x4a\x14\xa5\xe6\xf3\xe5\xda\x53\x37\x8e\xe3\xb8\xc2\x83\x05\x47\x4a\x88\x28\x25\x44\x5b\x0d\x31\x36\x8c\x11\x23\x1a\x2a\x7a\xcc\x31\x13\xdd\x21\x5e\xe3\xc4\xd4\x13\x0a\x1e\x22\x4a\x71\x37\x62\x46\x39\x66\x2b\x5d\x05\x52\x83\xe2\x93\xd9\x64\x4f\x8a\xf1\xc2\x15\x28\x49\xd6\xab\x53\x02\xb7\x74\x55\xbc\xe4\x0d\x13\xf0\x22\x42\xb8\x3c\xae\xf3\xb4\x98\x46\x0b\xb2\x70\xaa\x52\x36\x35\x26\xea\xf2\x16\xa1\x53\x22\x8c\xc1\x2f\x58\xb2\x2c\x3d\x3e\xcb\x9d\x3f\x6b\x4b\x7c\xa9\x6d\xf7\xb5\x3e\xf0\x73\x9b\xde\xe6\x73\x69\xe7\x8b\x1c\xfa\x3a\xa9\x00\x77\xb3\x2b\xec\xa2\x84\x04\xc8\x57\xee\xa9\x5c\x8d\x9f\x2c\xe0\xa9\x9a\x9c\x03\x73\xf0\x76\x04\x36\x68\xed\x1c\x88\xea\x76\xc6\xda\xad\xf2\xde\x47\x79\x0c\x1b\x7a\xf7\x69\x70\x1b\x72\x0a\xad\xd4\xa1\x0b\x4a\x76\x72\xbe\x4b\x92\x64\xb7\x3a\x25\xf3\xfe\xa7\x67\xd5\x9d\x3f\x4d\x48\xf2\xcf\x16\x06\xb6\x98\x19\xb8\xbd\x7c\xb1\x1f\xce\xa4\xdb\x1f\x1f\xce\xca\xb5\x6f\xae\x08\x10\x2f\xad\x15\xab\xb3\xcb\x18\xdd\xc7\xdb\x0f\x77\xdb\xf9\x2c\x59\xe7\x2b\x1b\x4e\xa7\x20\xf3\x1c\xec\x3b\x25\xb4\x08\xa6\xb4\x3d\xf6\x05\x0f\xfd\x91\x12\x4a\x6a\x3e\x02\x9c\xe7\xa1\x03\x49\x18\xd3\x44\x9e\xb4\x3e\x49\x23\x03\x05\x82\xb7\xe5\xf0\x9c\x80\x64\x4b\x8d\x0c\x02\x96\x56\x29\x6a\x9f\x13\x0a\x33\xa4\xb0\xe3\x98\x83\x12\x41\xc9\x8d\x2d\x21\xa8\xa4\x94\x32\x0c\x7e\xfe\x99\x5a\x81\x6a\x96\x24\xbb\xb4\x7f\xc6\xd1\xf7\xba\xf6\x7d\xff\xf9\x0b\xde\xe3\x0b\xfe\x8a\xdb\x37\xf7\x1f\x77\x57\x0c\xe2\xd7\x3e\x6f\xd4\x4f\x7d\xc5\x5c\xb4\xdd\x7c\xf8\x73\x10\x85\x79\xd6\xaa\xca\x61\x8a\x82\xcc\x33\x70\xf4\x4f\xb5\x03\xc7\x3c\x0f\xf5\x1e\xf2\x54\x4e\xfe\x72\x03\x07\xa7\xb9\xb1\xe1\x28\xa5\x63\x06\x90\x32\x4f\xf3\x09\xe5\xa9\xcc\x84\xd6\xa6\xb0\x1a\x15\x79\xc8\x48\x18\x65\xeb\x8b\xd0\xa6\x49\xb9\xb5\x25\x82\x93\x2e\xe1\x7c\x5a\x83\x04\x96\xa9\x25\x27\x16\x4e\xec\x39\x61\x41\x13\x2e\x05\xe5\x4c\x12\x85\x20\x61\x9a\x87\xa3\x2d\x4d\x89\x64\xad\x05\x6b\xbc\x96\xb1\x3e\x31\x3e\xab\x58\xe3\xf9\x32\x03\xbe\x78\xce\x71\x9c\x2f\x44\x20\x2f\x18\xac\xc7\x0b\x36\xec\x8c\xec\xbe\x39\xdf\xae\x21\x0c\xab\x11\xf0\x40\xd6\xf9\x27\xbe\xae\x03\x89\x0d\xb6\xfe\x89\x00\x1f\x6a\x17\x59\x84\x26\xbe\x22\x4f\xdd\x42\x19\x78\xbe\x71\x6a\x2a\xe2\xc0\xbe\xb2\xd8\xf9\x8d\xc3\x3f\x62\xb7\x1d\x1d\x0e\x07\xac\x35\x96\x8c\xb1\x20\x26\x07\x5a\x3a\x92\x81\xec\x25\x43\x0a\x12\x88\x0d\x45\xcb\x9e\x1a\x63\x4e\x7f\x89\x63\x16\x74\xde\xbf\x4c\xfe\xf5\x59\x91\xf9\xea\x3b\x5c\x6a\xf7\xbb\x28\xe3\x71\xd1\xee\x8e\xda\x1e\x8b\xc1\xf9\x02\x96\xf5\xb3\xe4\x95\x8f\x97\x10\x1d\x13\x0c\xf6\xee\xa9\x73\x60\x28\x4b\x4d\xa8\x20\xcc\xdb\x43\x27\xba\x53\x01\x2b\x91\x9b\x92\xa0\x30\x34\x85\xf1\xb8\x31\x46\x31\x21\xc4\x4a\x47\xed\xab\xa7\x03\xa8\x1d\xe8\x02\x99\x0d\xbf\xe6\xd8\x16\x79\x28\x43\x86\x40\x0e\x92\xc0\x17\x6f\xa6\x06\x68\xb6\x43\xc1\x8d\x23\x50\x08\x86\x23\xa6\x82\x31\x18\x3a\x3d\x7f\xbf\x36\x43\xaa\x6c\x4a\x88\xf0\x1c\x45\x81\x92\x58\xc6\xb9\x94\x9a\x69\x1d\x12\x21\x82\xf5\x59\x5e\xe4\x58\x5b\x82\x31\x29\x5c\x96\x57\xda\xda\x05\xb7\x06\xba\x98\xc7\xb0\xc9\xef\x26\x7f\x90\x90\xe4\x5f\x24\xff\x2a\xf9\x37\x2f\x78\xfe\x25\xa9\x7c\x71\xb2\xaf\x3b\x45\xdf\xbe\xf0\xe5\x6e\xee\x3f\x3e\xdc\x7f\x1b\xe3\xdc\xcf\xb6\xfa\x6e\x75\xfb\xaa\xb5\xf7\x52\xef\xdc\x40\x5f\x94\x69\x36\x75\x54\xcb\x7a\xf2\x5d\x41\x1c\x2d\x5d\x38\x65\xa0\x10\x16\xd3\x92\x63\x84\x32\x97\x1b\xa3\x8c\x66\xa9\x1f\x33\x93\x1d\x9f\x93\xd6\x32\xd3\xd0\x8e\xb4\x64\x6f\x56\x25\xa3\x1a\xc3\x82\x60\x34\x75\xd1\xb3\x37\x55\xb5\xb5\xa5\x10\xae\x71\xea\x98\x39\x03\x7d\xe5\xc6\xa7\x36\x8c\x85\x2b\xaa\xb4\x0e\x2a\x90\xc6\xd4\x60\x4c\x05\xc3\x8c\x61\x5d\x10\xa1\x05\x93\x44\x63\x1d\xf6\x76\xea\x96\x64\x60\x0a\x45\x10\xd6\xcd\xeb\x87\x3e\xab\xc8\x89\xfd\xb7\xbf\xe8\xd2\xc0\xd7\xec\xae\xdf\x2d\x2a\x53\x71\x4b\x44\x3f\x6e\x73\x3b\xfb\xc0\xab\x6b\x23\x70\x75\x30\xa7\x2d\x10\xa8\xf4\x45\x91\x56\xa1\xd5\x20\xa7\x14\x3f\xb9\x35\xfc\x44\x18\x05\x89\x09\x47\x90\xa4\x95\xa3\x27\x56\xa4\xfd\x84\xec\x1c\xf7\x1f\x80\x0f\xd2\x5a\x0b\x62\xba\xd8\x19\xb3\xe9\xb9\xc0\x14\xdb\x9a\xb8\xa2\xc0\x4f\xc8\xae\x39\x74\xb2\x39\x49\xe7\x42\x17\x85\xa3\xc6\x20\x75\xad\xe7\xbb\x64\x97\xb6\xa9\xdd\xd9\x88\xe7\xfe\x9b\x67\xbe\xb5\xbb\x05\xaf\x1c\xc3\xf7\xc8\xb7\x78\xa5\x3b\x7a\x29\x37\x5d\x3d\x5f\x1f\x7d\x0e\x87\xe9\xe4\xca\xe2\x70\x38\x1c\x02\xb7\x52\x28\xb3\x66\x86\x5b\xae\x4a\x23\xa5\x54\x53\x5d\x28\x87\xab\xad\x29\x09\x7b\x1a\x56\x25\x0d\xf2\x30\xf5\x87\xb4\xd4\xb5\x6a\x0c\x23\x75\x25\x5c\x68\x75\x6d\x3a\x4b\xad\xd7\x5e\x45\xde\x2f\xb6\xab\xb7\xf6\x8c\xfb\x5f\x18\x3c\xbf\x7b\xf7\x12\xdb\xbe\xee\x22\x8d\x51\xc4\xd9\xf1\xf9\x10\x3d\x9c\xcb\x96\xdc\x44\x96\xf8\x45\xe7\xf7\xa2\x1c\xb5\x46\x82\x1c\x18\xf2\x10\x9d\x42\x31\xcf\x62\x9a\x7f\x32\x60\x88\xec\xc6\x05\x28\x11\x05\xcc\xe4\x45\x9a\x13\xae\x30\x0c\x1c\x69\xe1\x42\x15\x93\xa1\xa9\x77\x79\x37\xef\x25\x2f\xc3\x20\x0e\x6d\x60\xca\xb7\xb2\xdd\x1a\xa5\x95\xc1\x92\x59\xe3\xb4\x73\xda\x19\x4b\xd9\x53\x0b\x31\xb2\x4a\x70\x4c\xa4\x96\x95\xa3\x42\x49\xaa\x19\x3d\x70\xa7\xbb\x9e\x6b\xdc\x53\xb9\xd7\xd2\xc5\x33\x35\x79\x66\x9b\x71\x4b\xbe\xa8\x2d\x2e\x9d\x4f\x2f\x76\x73\xfe\x16\x7e\x6a\x12\xbf\xc2\xc2\x75\x7d\xa8\xa6\x76\xc5\x9f\x93\xc3\xd3\x38\x9c\xc0\x41\x0c\x42\x0c\xc2\xb0\xc9\xcd\xeb\x87\xad\x78\xa8\x98\xc5\xb8\xa4\x73\x64\xe3\x94\xb1\xb2\x4a\x8d\xa1\x86\xea\x2d\x31\x3e\x60\xb0\x9f\x0d\x5f\x68\x22\x3e\x20\x50\xad\x6d\x70\x92\xe7\xbe\xa0\x80\x73\x32\x18\xe1\x6b\xdf\xd0\xba\x4a\xd6\x89\x4c\xe9\xce\x6d\x5d\xf2\xab\xe4\x8f\x93\x7f\x7e\xc9\xf3\x5d\xc9\xce\x5d\x61\x80\x96\xe3\xe2\xa7\x58\x87\xdf\x07\xdb\x9b\xeb\x88\xe0\x21\x06\x41\x4b\x3d\x60\xf6\xf8\x36\x51\x84\xef\xa4\xb0\xa9\x9d\x72\xde\x76\xaa\xb1\x15\xe7\x4c\xa2\x30\x60\xad\xaa\x4f\xcd\x50\x0d\xfe\x70\xf0\x43\x35\x34\x26\x4b\x55\xc6\x2d\xe1\xb9\x20\x30\x2f\xa7\xb1\x2c\x40\x17\xca\x12\x0a\x53\x0f\xc3\xd6\x41\x4a\x5c\xdf\x68\x63\x9c\xb6\x4a\x0b\x23\x14\xc2\xce\x3b\xa7\xfb\x3a\x66\x3c\x85\xa0\x94\xc0\x22\x0f\x49\x97\x9b\x0c\xbb\x13\x2d\xc2\xe1\x04\x4b\x69\x42\xcf\x93\xcd\xba\x4c\xd8\x8e\x6f\x71\xec\x4d\xb9\xe0\x4e\xdf\xdc\xbf\x84\xae\x4b\xb5\xe7\xfe\xcd\xd2\x03\x0e\xe6\xb0\xfe\xbc\xc5\x77\x09\xe7\x1c\x93\xd2\xa1\xe9\x60\x25\xf0\x3c\xf8\xa8\x48\xe3\x33\xa0\x82\x93\xde\x6f\xf1\xd4\x4c\x09\x65\x99\xc6\xa9\x7c\x3a\xae\xec\xec\x15\x82\xbe\x0e\x87\x36\x88\x40\xe4\x31\x49\x92\x4d\x22\x53\xb6\xc6\x5b\x79\xed\x09\xbe\x9d\x67\xf4\x05\x8d\xfd\xf0\x1a\xa9\x1d\x33\x92\x17\x8c\xf6\xe6\xfc\xd8\xd9\x2e\x22\xb1\xf7\x00\x07\x0d\xac\x9d\x3f\x43\x4c\x85\xd6\x81\xef\xcd\xd3\xe8\x9b\x06\xe0\x2e\x64\xf1\x61\x95\x53\x29\x31\x68\xb0\x22\x44\xe1\xc0\xb0\x94\xb4\x4b\x2d\x21\x64\x20\x64\xd1\x98\x4b\xd0\xea\x78\xd6\xec\xfc\xc3\x24\x01\x37\x77\x0f\x2f\x90\xd2\x0b\x87\xdc\x0f\xef\x7f\x72\x35\x9a\x84\xcd\xa9\xd2\x9d\x1c\xcd\x09\xa0\x0a\xa8\xd0\x49\x90\xc8\xee\x29\xf1\xba\x55\xa3\x3e\x02\xe4\x81\x0e\x76\xf0\xdc\xae\xc7\xfe\xe8\x8d\x32\x95\x55\xca\x7a\x61\x84\x3d\x7c\x7e\x9d\x09\x6e\x64\xf4\xd1\x54\xd4\x54\x5d\x78\x64\x97\x6f\xe8\x1f\xc7\xbd\x74\xf7\xe6\xb7\x8f\xef\x76\x11\xf9\xfd\xf1\xfe\xcd\xdd\xbb\x8b\xb6\xf2\xe3\xc3\xdd\x45\x01\xeb\x6b\xaa\x8b\x69\x9f\x56\x12\xc1\x42\xd9\xa0\x8a\xb2\xa4\x87\xe5\x27\x4d\x66\x93\x6c\xba\xee\x69\x5c\x8b\x50\x02\x17\x54\x9a\x7d\x22\x29\x0c\x0c\x34\x21\xdf\x12\x3d\xb5\x99\xce\xb5\x40\x36\x4b\x8d\x73\xc1\xd8\x60\x73\x9d\xd2\xa7\xd6\xa5\xf0\x69\x6f\xbd\xed\xac\xed\xac\x8f\xfc\xd8\x7c\x43\xb7\xf6\x1c\x29\xfc\x83\x25\x8f\x32\xef\xfb\xd5\x0b\xdf\xcb\x85\x07\xf3\xe6\xda\x6b\x8c\x55\xec\x37\x0f\x77\x2b\xeb\x21\xc8\xa6\xa6\x2e\x2f\x5a\x77\x1d\xc8\xf2\xc2\x97\x39\x80\x41\x00\x99\x0b\x81\x59\xc1\x10\x84\xd9\x01\xef\xf5\xa9\xde\xda\xd2\x4e\x32\xf5\xe1\x68\x83\xb6\x41\x40\x88\x08\xb1\x3a\xc8\x2e\x77\xb9\x1c\xc2\xd0\x89\x11\x30\x32\xc7\x6e\x07\x70\x88\x5c\x6d\x17\x4e\xb4\xbb\x85\x1d\xe7\x95\x9e\xce\x39\xa7\x0b\x5e\x58\xe5\x1f\x22\x8e\xe7\x32\x87\xbb\x84\x04\x39\xd5\x10\x8c\xc0\x58\x4c\x0d\x0b\x0d\x99\x6d\x6a\x4f\x0a\x93\x63\xa0\x83\x59\xb9\x60\xd3\xfc\x93\x00\xa7\xc0\x57\xfd\x13\x3e\x53\x8a\xf6\x5b\xa3\x49\xae\x19\x9c\x77\x65\x49\x08\xa4\x24\xc7\xf3\x7d\x94\xe2\x53\xaa\x0e\x58\x52\x49\x93\xdf\x49\xf7\xcf\x64\xa7\x5e\xb4\xcd\x96\x93\xf4\x45\x4f\xeb\x73\x57\xe1\xdb\x97\x0c\xe0\xd9\xba\xbd\x7a\xbd\x92\x2b\xf3\x64\xaa\x94\x2c\x89\x91\xde\x8d\xde\xcf\x41\xe2\x3a\xf7\x27\xe7\x4e\xa7\xd3\x69\x4b\x26\x02\x6a\x17\x98\x0f\xf2\x89\x08\xb1\xea\x82\x3f\x4c\xed\x08\x8e\x4f\x58\xca\xd5\x3e\xb8\x61\x6a\x87\xc8\xcb\xe2\x9e\xe9\x86\x7f\x45\x9b\xf5\xcc\x7a\xfe\x55\xbd\xaa\x0a\x64\x11\x99\x3c\x3e\x27\x00\x85\xde\x47\x79\xfd\x63\x38\x35\x17\x38\xf8\x66\xdf\x34\xb6\x9d\x60\x6b\xc3\x01\x40\xdb\xa6\x87\x36\x14\x4d\x58\xfa\xc6\x7f\x27\x35\xcf\x30\xd6\x5c\x7e\x19\xd9\xf0\xbf\xf4\xd1\xef\x3f\x57\xa0\xe6\x63\x2a\x16\xaa\x6f\x2f\x5d\x40\x0f\x3f\x65\x73\xba\xe2\x86\x4b\xbb\x63\x05\x5c\xfc\x64\x13\x3e\xae\xca\xa0\x82\x5e\xef\xa7\x03\xe8\x3e\x8d\xa0\x9b\x4e\x43\x94\xff\xef\x00\x9c\x8a\x97\x67\x2d\xaf\x42\x47\x40\x96\x32\x90\x0c\xf4\x78\xdc\x1c\xa3\xcc\xe2\x3c\x22\x63\x4c\x6f\xe5\x24\xd2\x4a\x06\x67\x8c\x09\xca\x5a\x1b\xf6\x52\x31\x87\x04\xe1\x5e\xc5\xb5\x77\x7a\xa9\xb7\x2e\xfd\x08\x7f\x1a\x7d\xcf\xfb\x6f\x77\x4b\xd3\xd7\xc5\xc0\xfc\x39\x78\xb9\xb6\xfd\xec\x64\x7e\xf3\xfe\x5a\xf6\xfa\x73\xfb\xfc\xb7\xe7\xc0\x73\x91\xb3\xb8\x59\x34\x07\x16\x1e\xa7\xc4\x64\x04\x4a\x6e\xad\xe2\x42\x62\xa5\xb4\x98\x06\x9d\xe1\x52\x32\x9d\x29\xce\xe9\x7c\xf0\x29\x01\x8c\x81\x50\xa3\xe9\x14\x1f\xd6\xd4\x3f\x35\xae\x4d\x07\x54\x96\x3e\x63\x4e\x93\x70\x3c\x1c\x7c\x18\x40\x59\x6d\xb5\xe6\x08\x33\x49\x0b\xa1\x95\xe2\x9a\x0b\x76\x02\x50\x09\x8c\x99\x64\x59\xc6\x84\x64\x64\xbe\x08\x92\xba\x6c\x0d\xf4\x3e\xde\x07\x14\xba\xb6\x03\x34\x8c\xd3\x9e\x20\x0f\x3b\x45\x24\xe8\x3b\x1b\x2a\x20\x6c\x97\x24\xeb\x44\x80\x63\x8c\x5f\xbe\x8f\xdd\xaa\x7f\x75\x5e\x59\x9f\x6b\x00\xe7\x34\xe2\xec\x79\x7e\x7c\x7c\xb8\x5f\xea\x00\x71\x89\x6d\x77\x6f\xce\xc2\xac\xdf\x5d\x17\x37\xfe\xd1\x17\x34\xe0\x4b\x26\x6d\x55\x01\xe8\xc7\x91\xb5\x56\x72\x05\xf2\xc0\x39\x04\xf5\x53\x67\xa9\x50\x96\xb2\x80\x81\x0b\x87\x3e\x2d\x43\x51\x16\x69\x39\x0d\x81\x18\xa1\x9d\x35\x44\x43\x2d\x31\x2e\xfc\x81\x9e\x7c\x5e\xba\x8a\x55\x96\x2a\x2b\xa8\xd8\x42\xce\x8d\x75\x8e\x4b\x61\x69\x31\x75\x80\x62\x0d\x09\x83\xd8\xda\xa9\xe1\x79\x1e\x8e\x7c\xe5\xa9\x14\x7d\xa8\xeb\x2a\xaf\x0b\xc6\x15\xdf\x4b\xab\x7b\x84\x05\x33\x44\x70\x4a\x09\x63\x49\xf2\x37\x12\x9c\x26\xbb\xe6\x7c\x26\x2d\x7d\xc6\x7f\x14\xb9\xee\xff\x2a\xf9\x37\xc9\xff\x94\xfc\xfb\x9f\xa0\x5e\xae\x9b\xee\x1e\xae\x5b\x02\xdf\x5f\x22\xbc\x97\x74\xc4\xbc\x2a\xc0\xab\x5e\xd2\x2f\xfe\x6b\xd7\x15\x9f\xda\x2a\xa9\x4c\x80\xc6\x18\xed\x01\x71\xac\x01\x39\xcb\x7c\x6e\x83\x0f\x27\xbb\xa6\x5e\x38\xee\x9f\xa0\x98\xa3\xb8\x75\x26\xa9\x21\x52\xbb\x02\xd9\xd2\x66\xbc\x37\xfc\xc9\xcc\x2f\x60\x66\x33\x36\x1a\x9e\x16\x04\x59\x88\xa7\xc6\x14\xdc\xf0\x95\xb7\x05\x37\x6c\x55\x30\x6c\x31\xdb\x1a\xca\x8d\xa2\x39\xdd\x6b\x65\xdc\x58\x94\xd8\xa2\x56\x32\x0a\x0a\x5b\xf1\xca\x85\x83\x54\x4c\x4b\xac\x34\x33\x4a\x86\x43\x59\x20\x0e\x3d\x23\x6c\x5e\x44\x65\x51\x72\x68\xe3\x0b\xc6\x89\xa4\x45\xd9\x38\xe2\x6d\xd9\x7a\xea\x9d\xa9\x71\x15\xb9\x8c\x53\x1f\x75\x34\x5c\xf2\x5f\x27\x2c\xf9\xd7\x4b\x3c\xff\x59\x74\xff\xf6\x66\xbb\x59\x9c\xec\xcd\x17\x92\x37\x77\xdb\x5d\x24\xa2\xfd\xf0\x70\x21\xd4\xff\xfe\xfd\x39\x19\xb9\xde\xbc\x2c\xa8\xef\xde\x7d\x1f\x81\xf0\xdf\x3f\xde\xae\x8b\xd0\x81\x63\x89\x2c\x23\x69\x32\xe1\xa2\x4c\x15\x7b\x4e\x78\x09\x41\xab\x43\x85\x89\xa4\x56\x48\x63\x59\xa8\xf6\x59\x8e\xd9\x09\x76\x0d\xb3\x16\x1d\x7c\xd5\x94\x20\x07\x19\x44\xda\x51\x20\x9b\xe7\x24\x1c\x4a\xef\x20\xa6\x9c\x0c\x7b\x02\x88\x99\x9a\x1e\x23\x50\xea\x40\x36\xd2\xc0\x52\x30\x6e\x10\x54\x5a\x15\xb0\x54\xb5\x16\x54\x48\x66\xb9\x42\xb6\x06\x32\x63\xf4\x39\x91\x4a\x12\x3a\x0a\xec\x85\x29\xf2\x2a\xc3\x04\xa3\xd2\x52\x4d\x0b\x9f\x15\x18\xc3\xd2\x50\xc3\xa9\x08\x90\x50\xc6\x93\x04\xac\xea\x84\x6e\x7d\x3a\xbe\x68\x33\x7f\xa1\xf0\xff\x70\xbb\xea\xd2\x7d\x18\x4e\x27\x80\xa6\x1c\xa0\xd3\x29\x8c\xe9\xa8\xbd\x71\xc6\x38\xe3\x17\x6e\x6b\xb2\x11\x5b\x9c\xfc\xed\xe4\xef\xc5\x3e\xf3\x18\x2b\xbe\x30\xcf\xbc\xf9\xf8\xf8\x6e\xf7\x26\xba\x47\x8f\x5f\xba\x26\xa9\x07\x14\xc1\xe0\xd2\x82\xf7\x0a\xa3\x5c\xbb\x61\x40\x4e\x8c\x8b\x17\xb2\x3e\x31\x69\x35\xf2\xf6\x49\xe6\x99\x29\xc3\xf1\x08\x0b\x9f\xad\x86\x61\x98\x9a\x71\xf2\x65\xd4\x21\x49\x87\xf3\x39\x9a\x27\xbf\x8e\xf5\xaa\xff\xf2\xcb\xec\xeb\xdd\x55\xfa\xf5\xed\x55\xfa\xf5\xdd\xee\x36\xdf\x7d\x76\xcb\xdf\x9c\x0f\x95\x78\x9e\x3e\xdc\xde\x44\xc7\x64\x6f\xf3\x02\xe0\x06\x16\xb6\x84\x10\x73\xed\xd3\x3d\x42\x25\x39\x27\x5e\x49\x8b\x4a\x0b\x27\xe6\xcb\x55\x41\x50\xcb\x6d\xd9\x52\x5a\x94\x13\xcb\x50\x8a\x27\x5d\x94\xd2\xa7\x49\xec\x06\xf4\x5b\x0d\x29\x35\x52\x12\xaf\x2b\x23\x46\xa8\x08\x17\x03\x48\xe6\x8b\x4a\x93\xda\x94\xe2\x69\xec\xaa\xc2\x15\xcc\xa7\xaa\x60\x93\x4c\x51\x59\xaa\x26\x58\xad\xc3\xd1\x2e\x79\x1d\xf3\xac\x63\xfd\x61\xb6\xb7\xff\x20\xf9\x78\x1e\xeb\x7f\x75\xcd\x23\xbe\xdd\x7d\x7c\x7f\x95\xa1\xf9\xf8\x78\xd6\x17\xbe\x66\xd6\x79\x00\xf7\xdf\x2e\x66\xe5\x2b\x44\xd8\x69\x9b\x16\x79\xe1\xca\x22\x4d\x26\x27\xd5\x09\x24\x10\xe9\x5a\xd9\x12\x05\x15\x08\x6c\x4c\x30\x60\x70\x0e\x08\x87\x49\x99\x99\xd9\x22\xb0\x89\x79\x66\xa4\x20\xab\xde\xfc\x38\xda\xca\x39\x50\x54\x15\x40\xce\x6d\x8e\x08\x21\xc2\xac\x65\x59\x09\x21\x35\x9e\x61\x84\x73\xcd\x5d\x50\xb3\x77\x3e\x90\x42\x42\xc7\x28\x07\x59\xd7\x11\x85\x6c\x68\x42\xe1\x5c\x14\x20\x38\x43\xc1\x00\x4f\xd2\x75\x9d\xe0\x68\xf3\xff\x20\x41\x0b\x93\xd6\xdf\x03\x8b\x66\xd3\xdd\xaf\x5f\x54\xb8\x2e\x74\x54\xb7\x3f\x3c\xdc\x7f\x3b\xcf\xc4\x37\xef\x3e\x2e\x09\xae\xed\x68\xa0\xcb\x50\x9e\xa1\x5c\x63\x37\xaf\x77\x69\x18\x2b\x2d\x46\x98\x2b\x01\xb2\xcc\x65\x20\x0f\xa7\x0c\x31\x42\x4a\x5b\x92\xd5\xa1\x08\xfb\xe7\x04\x0a\xce\x51\x38\x7a\x25\x84\xb3\x20\x07\xcd\x14\xf1\xe1\x4a\xac\xfa\xb6\xef\x5b\x13\x0e\xc7\x76\x05\x85\x42\x5a\xcc\xeb\x3f\x89\xd8\x66\x1c\xb9\x7e\xff\x32\xf9\x77\x91\xc1\x71\x77\xa1\x2f\xfe\x42\x26\x3c\x1a\xad\x8f\x8f\xb7\xe9\x2e\x8a\x00\xde\xbe\xf9\x10\x05\xef\x1e\xce\xf5\xa3\xd7\xd0\x31\x70\xff\x22\x2a\xfe\x0a\x27\x75\xb7\x62\x79\x5a\x30\xc1\x48\x51\x33\x4a\x69\x8e\x29\x3e\x14\x46\x31\x12\x34\xd2\x56\xb1\x75\xbb\x48\xe1\x75\xa0\xdf\x4f\xd5\x8a\x48\x03\x64\xe0\x9c\xc7\x5f\x65\x01\x81\x7e\xe4\x24\xb4\x60\x60\xa2\xef\x19\xe5\x2c\x27\x1c\x8f\xeb\x7d\x10\xd6\x6a\x46\xb3\x3c\x53\x65\x47\x70\xa1\xf2\xbc\x2a\x4d\x96\x73\x84\x43\x73\x62\x20\x01\x1a\x14\xe9\x31\xb8\x93\x09\x04\x72\x65\x30\xd6\x82\xe0\x5c\xe7\x39\x9b\x4e\x84\x10\xa9\x05\xd3\xed\xf2\x97\xf5\xc2\x11\xd7\x3e\x93\x5d\x9f\x36\x31\xae\x4c\xc0\xbb\x6f\x97\x42\x7d\xba\x1c\xb4\xe9\xe6\xc3\xf7\x4b\x4b\xf0\xa6\xf0\x25\x64\x06\x7b\xa9\xcd\x41\x87\xba\x69\x82\x16\x29\x0f\x8d\x65\xd2\x99\xb4\x29\xac\x16\x6c\xdf\xa1\x30\xd6\x92\x38\x03\x8a\xd0\x72\x67\x52\x88\x4e\x35\xdd\x47\xae\xc0\xe8\x93\x9a\xe4\x9b\x33\x0f\xef\xf9\x3c\xbf\x2a\xa3\xbd\xfd\xba\xb4\xe4\x59\x23\xea\xa4\x15\x41\x0e\xf3\x4e\x71\xae\x9d\xf0\x52\xeb\xa2\x77\x87\x43\x67\x85\xd2\x8e\x1b\xd1\xc9\x0e\x1c\x31\x54\x25\xde\x72\x26\xa4\x2a\xbd\xed\x8c\xe4\x5e\x49\x63\x24\x7f\x8a\x14\x12\x96\x2b\x65\x15\x0f\x09\x38\xb6\x95\x3e\x80\x1c\x78\x26\x88\x60\xd1\x0e\xc9\xe8\xdb\xe4\xc9\x6d\xf4\x59\x7f\x7a\x4e\xbd\x3a\xa6\xae\x34\x02\xae\x3a\x04\xe6\xdb\xaa\x9e\xcf\x20\xda\xc2\xd2\x96\x18\x52\xae\xab\x74\x40\x94\x9d\xcf\x26\xb1\x27\xc8\xe2\x27\x05\x0e\x10\x7a\x82\xc0\x10\x92\x88\xa5\xc1\x3f\x9e\x52\x14\x33\x42\x68\x6b\x20\x25\xcb\xf1\xd3\x1a\x31\xe6\x8d\x14\x07\x90\x41\x42\x8c\x36\xa4\x09\x0d\x45\x94\x4b\x17\x0e\x2e\xec\x5d\x44\xe2\xc1\x85\x8f\xb1\x7d\xa6\x91\x4b\xfc\xef\x27\xbf\x8d\x0a\x64\xaf\x91\x5f\x57\xcc\x47\xef\xd7\x57\x8e\xd7\x5d\xac\x13\x7c\x7c\xbc\xdd\x82\x57\xa4\x69\xd7\x62\x02\x69\x3f\x87\x08\x36\x26\x7e\x5d\xd0\x2c\x2f\x53\xe3\xab\x1e\x24\x34\x74\xcf\xc9\x73\x72\x44\x5d\xcb\x09\x26\xaa\x16\x30\x9c\x80\x94\xd6\xab\x50\x64\xa1\x07\x6d\xd4\x4a\x9a\xe3\xd6\xd9\x63\xf3\xd3\x31\xcd\x23\xda\x94\x6e\x73\x29\xa5\xb4\xd6\xb2\x1c\x23\x63\x39\x85\x0e\x4b\x05\x6d\x49\x11\xc1\x50\xe9\xca\x87\x86\x13\xca\xb3\x90\x48\x69\xb9\xe5\xb6\xae\xe7\x87\xd8\xdb\x48\x76\x7e\x05\x93\xef\xa2\x17\xf6\xc7\x57\x5d\xd8\xaf\x3b\x33\x5f\x65\x7c\xcf\xcc\xe9\xf7\x0f\x77\x1a\xe4\x31\xb0\xa8\xb5\x10\xc2\x73\x2d\xf6\x22\x9c\xd2\xc3\x9a\x7a\xa6\x8c\x2a\x8d\xc6\x4f\xc7\x54\x06\xe3\xdc\xf1\x98\x3a\xef\x1d\x51\xca\x48\x1e\x4a\xd0\x7a\xa3\xdb\xe3\xd1\x4d\xfe\x5c\x9c\x27\x3a\x08\x0e\x4e\x61\x8c\xda\xca\x3e\xd5\xbb\x76\x2b\x93\xcd\xd9\x47\xbc\x7f\xf1\x0c\x6f\x97\x4c\xe6\x0b\x69\xc1\xe3\xc7\x37\x91\xf3\xf7\x9b\xb7\x5f\x24\xd1\x96\x08\x77\x35\x7b\xee\x42\x01\x99\x36\x99\xa4\x12\xc2\x9c\x1b\x48\x72\x82\x50\x0e\x4d\x19\x9c\xa8\xeb\x3c\x9c\x98\x64\x5a\xea\xe0\x95\x90\x42\x02\x28\xa5\x97\x7e\x2b\x31\xd7\x82\xd0\xd0\x6b\xe5\x04\x3d\xd5\xb9\xcf\x69\x0b\xf4\xd4\xb4\x9a\x81\x12\x94\x92\x39\xa3\xb4\xc2\xdc\x48\xd2\xb0\xae\x96\x75\x92\x6c\xd6\x79\x42\x77\xec\xac\x97\xfa\x87\xe7\x3a\xef\x52\xd9\xfd\xa2\x2b\xeb\xa5\x7d\xe9\x52\xfa\x8e\xc9\xb2\x39\xa8\x3d\x3f\xae\x8b\x55\xa1\x5d\x9e\x83\x4c\x8a\x12\x95\xb4\x24\xbd\xeb\x1c\x60\x62\x3e\x7f\x38\x9d\xda\x08\x0a\xed\xfb\xd0\x2c\x8f\x5b\xaa\xbc\xcc\xb3\x27\xc8\x58\x6e\x32\xd2\x46\x13\xe3\xd6\x92\x60\x81\x31\x65\xd3\xbe\x69\x9a\xc8\x8a\x92\xac\x13\x96\xe6\x67\xbd\x80\xbf\x9f\xfc\x45\xf2\x2f\x93\xe4\xed\x39\xab\xf7\xe5\xa9\xf1\xfe\xf6\x2c\x2f\xfc\xf6\xfa\xea\xea\xdd\x4f\x2b\xf7\x6f\x5f\x5f\x7b\xf7\xd1\xf7\xfe\xb0\x37\x5c\x23\xe2\xb1\x52\x3d\xed\xd7\x14\x24\x1e\x64\xa7\x5a\x69\x2a\x3d\x37\xb2\x13\x03\xd3\x4c\x2c\x58\x56\xcb\xb4\x14\x92\x29\xc9\x73\x43\x19\x25\x9c\x52\x55\xb3\x86\x53\x2a\x1c\xd9\xb8\x71\x74\x75\x47\xb5\x9c\x06\xd0\x38\x27\x47\x90\xcf\x97\x86\xe7\x84\x36\xf5\x34\xa4\x59\x5f\xab\x01\xe4\x40\x12\x29\x19\xd3\x92\x49\x1e\x83\x0e\x46\x19\x0f\x38\x3e\x53\x9c\x49\x65\x84\xa0\x58\x18\x9a\xec\xa2\xae\xd9\xec\x6f\xfc\x6e\xf2\xeb\x68\xd7\xfe\x2c\xf9\x27\x0b\x03\x4c\xba\x5b\x86\xfa\xcd\xd7\x24\xf0\xb7\x2f\x1a\xf8\xdb\xcd\xfd\x9b\xbb\xf7\x17\xd9\xfb\x45\xab\xfc\xe1\xcd\xc3\xed\xaf\xd2\xdb\x87\x95\x70\x98\x5b\x88\xd9\x21\xe5\x26\x2f\x80\xe7\xda\xd6\x64\x5f\xb9\x03\x6a\x34\x41\x10\xaa\x86\x51\x2e\x49\xe8\xf3\xc0\x9d\x4b\xc7\xd0\xb8\x54\x0a\x21\x4a\x46\xcb\xd0\x00\xb6\x35\x30\x9c\x4e\x3f\x1e\x57\x8d\xe4\x0e\xec\xc1\x00\x09\xb6\xad\xe2\xc8\x62\x25\xa8\xc6\x8c\x50\x8c\xf8\x40\x25\x93\x1a\x66\x9f\x08\x0b\xcd\xaa\x7e\x1a\x39\xb3\x05\x04\x27\xad\xb5\x94\x49\xb2\x49\x54\x8a\x76\x76\x6b\x93\x2c\xf9\x1b\x49\x9e\xfc\xc1\x32\xbe\x57\x25\x82\xf7\x1f\xff\x62\x1e\xf3\x67\x05\xa3\x45\x5b\xeb\xed\xbb\x74\xb3\xbc\xf3\xf1\x2b\x6f\xad\xf6\x15\xee\xa7\x93\x2f\xe1\x30\x0c\x43\x4a\x39\x65\xae\xea\x7a\x64\x28\xb2\x65\x3b\xc0\x79\x63\x94\x96\x39\xf6\xe3\x30\xbf\x55\x77\x5a\x5c\xbd\xa7\x55\x7c\x6f\x6b\xa1\x7e\x72\x2b\x45\x03\x1d\xa6\x66\xe8\xb3\xbc\x45\xc1\x1e\x89\xc5\x4d\x4f\x2c\x85\xa6\x3a\xc2\xdc\x36\xa0\x80\xcf\x89\x8b\x6f\x9a\xb1\x2c\xbf\xf6\xee\x3c\x56\x91\xa2\x88\x53\xf8\xbb\x51\xf7\x73\xf6\x1e\xbf\xe0\x94\xb8\xd2\x05\x7a\x3c\x8b\xba\xbc\xb9\x7b\xc5\xf5\x73\x17\x45\xd6\xee\xae\xc5\xa3\x1b\x50\xc4\x92\x3b\x20\xa1\xc9\xf2\xde\x0b\x5f\xfb\x9a\x83\x9c\x84\x03\x20\x61\x5c\xe5\x2b\xde\x17\x50\xe2\x5c\x17\xb2\xb6\xd4\xe1\x70\x10\x47\xb4\x77\x29\x9e\xf6\x97\xdb\x66\xf0\xde\x54\xae\x2c\x85\xb0\x8a\xf7\xc2\x56\x7b\x57\x81\x64\x22\xfb\x32\xc7\x1a\xd5\x8c\xb0\xe1\x28\x0d\xf1\xe0\xc8\xc2\x89\x85\x63\xc4\xec\xab\x67\xbe\x49\xb6\x3c\xf9\xbb\x57\xdc\xb1\xf7\x37\x77\xdf\x2e\xe3\x88\x34\xe1\x51\x84\x31\x3d\x7a\xe7\x7d\xd3\xe6\xc6\x68\x2a\x58\xad\x8f\x65\xdd\xf8\x4d\x06\x58\x68\x66\xdb\xc6\x98\x6b\x95\xb5\x61\x7f\x10\x80\x82\xc6\x2d\xbc\xc3\x59\xf4\x59\xdc\xd6\xbe\xd4\x90\x2e\x68\xd0\x4b\x45\xfc\xcd\xed\x67\xae\x83\x25\x0d\x73\x61\x3b\xb9\x7b\x38\x77\x46\x6f\x3e\xf3\xdf\x7d\x58\x37\x4d\x8e\xc0\xf1\x89\x81\x1c\x55\xa9\x9e\x6c\xbc\xf5\xd6\x58\xe5\x9e\x68\x4a\x5c\x9a\x4d\x27\x37\x75\x8d\x73\xd4\x3b\x60\xe1\xfe\x84\x41\x9e\x96\x63\xc5\xdd\xb0\xb5\x10\x93\x49\xa6\x5e\x04\x17\x93\x9a\x35\xb3\x6c\x36\x12\x29\x99\xba\xd9\x70\xf4\x48\x68\x89\x9c\xe6\xd4\x52\x84\x99\x61\x24\xc6\x46\xe4\x99\xed\xba\xad\x4e\x3e\x9c\x95\x96\xff\xd5\x65\xae\xd2\x37\xf9\x37\x2f\xca\xa7\xe9\xdf\x02\x77\xf9\xee\x3c\x6b\x1f\xdf\xce\xa7\xd3\xdb\xbb\xd7\x18\xbf\xb7\x5f\x68\x37\x9e\xdf\xfb\x18\xd1\x7c\xef\x1f\xee\xd6\xa7\xda\x1c\xb3\x3c\xcf\xf2\x4c\xe7\x0c\x33\x26\x0b\x21\xb3\x02\x57\xaa\xc6\x8c\x0b\x91\xd7\x93\x3d\x54\x87\xc3\x71\xd2\xa7\x83\x56\x4c\x49\x05\x8c\x12\x8a\xab\x50\x8d\x6e\x18\x8c\x28\xc2\x10\xaa\x02\xe4\xe3\xa6\x00\x22\x54\x81\x85\x3e\x0c\x61\x68\xbb\x32\xb4\x35\x28\x40\x97\xb2\x70\x18\x3b\x03\xcb\x50\x1f\xd4\x11\xd4\x5e\x4b\x0b\x08\x28\xf7\x7b\x5b\x5b\x5b\x87\x8a\xb4\xb5\xf4\x95\xf2\xca\xfb\xa0\xfb\xde\x75\x10\x5a\xcd\x1c\x39\xc6\xde\xab\xc4\xa4\xf0\x8c\xd3\xf9\x18\x75\x7e\xff\xfa\x27\x9c\x2a\xbf\x59\x72\x88\x2f\xa2\xb0\x8b\x62\xfa\xeb\x83\xfb\xf1\xee\x5a\x62\xe2\x45\x18\xff\x32\x15\xb7\x1d\x20\x4b\xb1\x41\x3f\x19\xa0\x43\xb7\x72\x7b\x07\xca\x3c\xcf\x51\x66\xca\x9a\x73\x97\x95\x8c\xcd\x26\xc7\x09\x4b\x38\xe7\x26\xdf\x4f\x84\x2b\xc7\x6c\x9a\x49\x29\x84\x0e\x09\x20\x91\xb3\xb6\x71\x79\x30\x01\x16\xc0\x84\x6e\x5b\x08\xa1\xe6\x9f\xbe\x0f\xd0\x68\x63\xca\x60\xfd\x09\xb0\xda\x30\xa1\x28\xa9\xa4\x14\x0d\xa3\x42\xb4\x8a\x72\x2c\x21\x45\x54\x50\xda\x54\x95\xd2\x79\x21\x09\x34\x65\xd4\xc2\x3a\x01\xbc\x33\x51\xdb\x24\x4f\xfe\xee\x99\x11\xee\xd2\x95\x70\x01\xa7\x7c\xbb\x7b\xe9\x3d\x4f\x77\x1f\xc0\xd2\x78\xfe\x71\x61\x62\x4d\x4f\x6b\x1b\x0c\xc0\x4f\x39\x28\x83\x4b\xb5\xce\xc2\x98\xf6\x35\xa5\xa6\x6c\x49\x0a\xa1\x99\x90\x2a\x6c\xda\x4f\x68\x8b\x9d\x7f\x82\xab\x83\xf7\x5e\xc1\xa9\xd6\x84\xf4\x61\x34\x0c\xd0\x1a\xf6\xe1\x24\xea\x89\xca\x64\x73\xc6\x5a\x5e\x70\xad\x1f\x2f\xc8\xa9\x57\x35\xda\x28\xbb\x16\xe1\xa5\xd7\xd9\xcd\x74\xf7\x21\x79\x7b\x77\x91\x5c\x03\xf7\x0b\xc8\xf0\xe6\x4b\xa2\x34\xe6\xf3\xe2\x38\x1d\x4d\x99\x1f\x8f\xc7\x23\xe8\x53\xdd\x66\xc5\xa1\x29\xf3\xc2\x16\x84\x4b\x22\x7b\x03\x30\x19\x90\x36\xc2\xce\x5e\xe4\x54\xbb\xda\xca\xee\x50\x52\x89\x73\x53\xf2\xb6\xe2\x5b\x5d\x2a\x36\xc1\xf4\xa0\x82\x68\x02\x6c\xd3\x2c\xea\xaf\x4d\x18\x91\x3d\x3a\x09\x2c\x00\x0d\x87\x83\x02\x08\x9c\x34\xe8\x60\x30\x07\x80\xa6\x64\x94\x46\xb6\x9a\x95\x39\x56\xd8\x73\xc2\x17\x9e\x1c\x0d\x86\x58\x47\xfa\x8c\x30\xf9\x8b\xff\x6f\xec\x43\xe0\xdd\x76\x13\xfb\xa2\xef\xce\x7a\x7e\x0f\x6f\xbe\x37\xa0\x72\xb1\xab\x4a\x84\x0a\xd8\xa0\x5d\xf4\xef\x2d\xd0\x41\xb4\xe3\x08\x74\x3f\x2d\x0f\xab\x96\x1f\x43\x9b\xe2\xce\x8d\x5e\x69\x20\xb7\x25\xe7\x56\x84\x9c\x19\xe7\x0c\x03\x47\x11\x86\x48\x7c\xc8\x18\x4b\xb9\xa1\x79\x67\x27\x9f\xca\x2c\xec\xc3\x49\x8c\x27\x70\x88\xbd\x1f\x9b\x75\x99\xa0\x57\x63\xb8\x56\xa1\xfc\x7f\x1d\xc1\x9a\x00\x1e\xd5\x0b\xa3\x7c\x4d\x84\xf2\xcf\x1f\xb5\x03\x24\xd4\x75\xd3\x00\x5a\x87\x3c\x3e\x44\x05\x49\x35\x21\xed\xfa\xde\xe9\xb4\x57\x41\x79\xef\x03\xa9\xeb\xfa\x9c\xd3\xa3\xd1\x3f\xf9\xfd\xe4\x1f\xcf\xb6\xec\x1c\x29\xbd\xe4\x88\x7f\xc2\xc8\x7c\x7f\x73\x95\xdd\xbb\xd2\x9b\x7d\x00\xb7\x37\x91\x8c\xe3\x76\x95\x03\x58\x12\x4f\xca\x91\x40\x0f\x11\xc8\x43\x71\xae\x7c\x19\x30\xc4\x58\xa2\x04\x83\x87\x58\x50\x2b\x84\xeb\x58\x18\x1a\x26\x05\x2f\xb8\x44\xd3\x09\xb4\x36\x1c\xf8\x49\x85\x71\x63\xa5\x2c\xb5\x36\x1a\x4b\x6e\xad\x75\xf1\xdf\xc9\x37\x04\x2b\xc5\x2a\xa1\x59\xe5\xc6\x93\xe6\xb9\xcf\x39\xd8\xbb\xd0\x35\xc6\x0d\x31\x87\x86\x63\xde\x77\xc9\xa0\xfd\xf6\xc5\xce\x5c\x00\xb5\xdf\xaf\xee\x3e\xd3\x33\x5e\x19\x9f\xd5\x67\xb1\xf6\xdb\x75\x53\xcd\xfe\x4d\xa0\x65\x91\xf2\xd0\xd6\x03\x0f\x43\xd7\x34\xa1\x11\x20\xaf\xc2\x00\x34\x09\x35\xc8\x51\x9d\x9a\xc9\xcc\xb7\x3c\x7a\x9c\xe1\xe4\x9f\x93\xad\x29\x09\x9e\x04\x21\xae\x17\x95\x07\x38\x1c\x5a\xe3\x7a\x67\xd2\x8a\x85\xca\x06\xe5\x9e\xec\xe9\x14\xab\x32\x67\xbb\xd2\xc4\x9e\xcc\xef\x93\xff\x36\xf9\xeb\x88\x2e\x5a\xea\x29\xb3\x3f\xf8\x53\x0a\xf7\xc8\xe0\xfe\xf1\x31\x8a\xf3\xbc\xc8\xaf\xbe\x28\x2c\x5e\xff\xe6\x45\xc5\x15\x5c\x71\x2e\xed\x12\x31\x86\x8a\x03\xf5\xc4\xd3\x4c\x68\x46\x0a\xc6\x39\x13\xbc\xa0\x12\xd7\xa5\xe2\x8a\x07\x9f\x9e\xbc\x94\x52\x51\xec\x86\xa1\x6e\x4a\xa8\x15\x35\x48\x4a\x2a\x31\x2e\x08\x2d\xc3\x11\x36\xde\x5a\xe8\xc1\x41\x0a\x4b\x65\x10\x46\x39\xe9\xb6\x5a\x69\x62\x48\xe6\x6a\x1b\xea\x12\x3a\x04\x27\x47\x59\x51\x95\x65\x9a\x93\xaa\x2c\xc1\x60\x34\x41\xbd\x2e\x4a\x29\x61\x10\x55\x81\x29\xa1\x4d\xc7\x74\x99\x4f\x87\xa5\xfb\x0b\x1c\x4b\xad\x9b\x32\x57\x76\x12\xd5\x20\xfb\x9e\x90\x30\x3a\xb9\xac\x51\xfe\x8c\x22\xbe\xe8\x97\xc9\xfb\xe4\xbf\xf8\x29\x8e\x7e\x73\xd6\x54\x3b\x67\xe2\xce\x52\x6a\x9b\xdb\x9b\xd5\x7d\xba\xfb\x6e\x73\xbb\xbb\x2d\xbf\x80\xff\xde\x7d\x78\x7b\xb7\xf3\x9f\x7a\x6b\x4d\x9a\x17\xa5\x47\x05\x70\x42\xea\x61\xd8\x4f\x43\xdb\xf7\x15\x06\xe5\xc4\x80\xa8\x9a\x5c\x49\xc0\x80\xc0\xe1\x10\xac\xa1\x82\x09\x42\xa0\x2a\x20\x2c\xda\xbc\xd9\x6f\x0e\x66\x32\xd3\xb8\x28\xf5\x1c\xd3\x03\xc5\x88\x89\x83\x84\x65\xe8\x6d\x68\xad\x05\xd4\x82\xbc\x34\x65\x2e\x23\xd3\xae\xce\x9c\x53\x5c\x73\x65\x3b\xa4\x85\xed\x75\x74\x90\xd6\xa9\x78\xa6\x1b\x78\xce\x47\x5e\x31\x43\xbd\x92\xc7\x79\x8c\x82\x42\x2f\x67\x79\xac\x42\xee\xe7\x45\x9a\x48\x81\x69\x29\x11\xa9\x42\x43\x41\x69\x83\xb5\x1a\xc6\x53\xfa\x78\xdc\x9a\x52\xf2\x1f\x29\x63\xb1\x73\x93\x86\xde\x3b\x33\xd8\x95\x57\x81\xee\xa7\x53\x1b\xb0\x4d\xd2\x95\x7c\x26\xd1\xb7\xf9\xbd\xc8\xd6\xf8\x6e\x17\x05\x67\xd2\xcd\x87\xe4\xcc\x3a\x77\xf7\xa2\x40\x33\x1b\x8a\xdb\x8d\xf0\xf0\x00\x12\x7e\x1c\xdb\x70\x62\x40\xf4\x00\x79\xc0\x46\x0f\x12\x7e\x6a\xbc\xd9\x2b\x50\xb8\x30\x6c\x35\xa2\xe1\xe8\x7d\x05\x60\x38\xb6\x16\xe4\x21\x5b\x58\x12\x6d\x53\x77\x40\x4f\x59\x2a\x9e\x93\xde\x81\x0c\xc8\xc8\xf1\x0d\xc6\x9d\xd8\xda\xe4\x76\xc9\x0e\x2c\x1d\x02\xbf\x02\x9f\xdd\xe9\xdd\x2f\xc0\x4b\xab\x4a\x5c\xd6\x57\x7a\x62\xb1\x0a\xd9\x3b\x02\xfc\x11\x14\x61\x9f\x65\x8d\x91\xd6\x21\x6c\x18\x3f\xf2\xd0\x00\x23\x28\xd3\xdd\x0a\xa6\xed\x53\xb3\x22\x13\x4f\xc5\x54\x81\xfd\xd6\xc2\xca\x55\xd4\x15\xb9\x92\x4e\x0b\x4c\x25\xb2\xae\x75\xa3\x64\xa2\x9b\x06\xe7\x56\x83\xad\x82\x04\xb9\xb5\x31\x7f\x41\xd7\xc5\x56\x45\x0e\xb9\xbf\x33\x9f\x29\x3f\xc7\x22\xb7\xe8\xde\x7d\x35\xb7\x61\x80\x5e\xf8\xe3\xc4\xd3\x7c\x48\xdb\x95\xf7\x93\xf3\xfb\xb4\x9c\x06\x03\x68\x54\x84\xdb\x3b\xa1\x4d\x65\x7a\x71\xaa\x42\xbf\x19\xad\xb5\x91\x39\xae\x0d\xa3\x6b\x00\x0e\x27\xdb\x18\xe3\x4a\x29\xad\xe4\xa1\x05\xd2\x29\xad\xe7\xfd\xb1\x8b\x3d\x05\x62\x8b\x93\xdf\x8d\xcc\xc0\xbf\x89\xb3\xf8\x98\x24\x60\xde\x25\x4b\x7a\x74\x75\x7b\x73\x49\x5a\xdc\xbf\xb9\x7d\xad\x84\x78\xfb\x72\x08\x2e\x35\xab\xd3\xe0\x34\x5f\x67\x7e\x42\x69\x9f\x19\xc6\x24\x0b\xfb\x0a\x50\xce\x09\x2f\x35\x2e\x02\xf4\x00\x3a\x70\x08\x70\xbe\x41\x82\x15\x26\x6b\x19\x9a\x69\x0c\x8c\x83\x04\x18\x50\xa6\xc7\x80\x00\x69\x5a\x26\x89\xa0\xf4\x39\x79\x6a\x96\x55\xe8\x42\xb5\x3a\x85\xa3\x0d\xd2\xa7\x16\x73\xce\xe8\xa2\xdf\x42\xd7\x76\xab\xa2\xc6\xc3\x05\x2a\xf8\x6d\xba\xbb\x9e\xc1\xe4\xed\x6d\xda\xd6\x88\x2a\x49\xb8\xc0\x8a\x0b\x84\x1d\x63\x02\x14\x26\x1c\x37\x52\x08\x6a\xac\xc9\x9e\x13\x35\x5b\x0c\xc1\x9e\xda\x15\x34\x42\x02\x0e\x5c\x92\xac\xd7\x38\xb1\x5b\xb6\xee\x5e\xe1\xac\x2f\xb8\x9b\xdb\x37\xb7\x6b\x0e\xfa\x80\xec\x7e\x5f\x2f\x78\xeb\xe4\x39\x59\x77\x81\xa8\x21\x14\xa1\x54\x20\x49\xd2\x44\xa5\xd5\x4e\x6f\x75\xf2\x5d\xf2\x87\x3f\x93\xbf\x7a\x7b\xfb\xfe\x9a\x74\xfd\x85\x31\xad\x01\xc2\xcf\x7e\xe8\x42\xc5\x68\x1a\xb5\xaf\xc2\x61\x25\xe6\x2f\x5d\x87\xaa\xda\x8b\xca\x54\xb2\x52\x7b\x71\xda\xd4\x7d\xef\xf0\x6c\xe9\x64\x90\xa0\x3f\xb5\xaa\x01\x78\xb6\xdb\x87\xda\xba\x2e\x10\x70\x38\x34\x6a\x7f\x5c\x38\x18\x53\x1b\x31\x17\x5f\xc1\xe6\xdd\x7e\xc9\x20\xf7\x75\x6c\xde\xf7\xab\x7d\x95\x61\x80\x27\x7a\x40\x3a\x0a\x92\xb9\xa0\xa6\xb1\xb2\xca\xfa\x2d\x31\xba\x53\xf3\x07\x55\x75\xfb\x54\x17\xfb\x23\x01\xd9\xd6\xc0\x42\x3e\xf5\x2b\x44\x82\xec\xa7\x61\x9f\x42\x55\x99\xda\x70\x5a\x7b\x65\x43\x13\x05\xa1\xb8\xf3\xaa\x96\x31\x66\xf2\x11\x13\x4a\x5e\xe6\xfc\x1f\x5c\x66\xfd\x33\x81\x0e\x78\x8d\x71\x7e\xfc\xf8\x70\x7b\x11\x03\xfb\xe1\xc3\x0a\xae\xf1\xa7\x7d\xe5\x3d\x98\xb7\x6a\xa8\x50\x09\x8e\x13\xca\x53\x9b\xf3\x4e\xba\xa2\x92\x34\x47\xd3\x49\x86\x5e\x02\x05\xc3\x09\x1c\xca\x72\x4b\xa6\xc6\x5e\xf0\x2d\x80\x84\x9c\x09\x5f\x05\xd4\x94\x55\x89\x45\x13\xea\xc6\xf5\x60\xf0\x14\x27\x20\x91\xb3\xcf\x9c\x1e\xe6\x53\xef\xed\x05\x18\x78\xa6\x3f\x9e\x0d\x46\x24\x40\xfe\x7e\xc9\x37\xbd\xb9\xdd\x6f\x0d\xe6\x16\x97\xd3\x00\xea\xc0\x5d\x07\x06\x12\x44\x50\x41\xef\x85\x33\xa0\x44\x75\x01\x87\xfd\x94\xa4\x07\x6b\x0d\x63\x62\xef\xf6\x59\x23\xad\x37\xe6\x08\x08\xd4\xd2\x95\x69\xb6\xac\x73\xb6\xa1\x5b\x1c\x7d\xbd\x97\x5e\x97\xc8\x4b\xf1\x6d\x5c\x29\x5f\xf4\x12\xa6\x91\x83\x22\x4e\x04\xb3\x8c\x06\x9c\x5a\x61\x20\x44\x07\x61\x51\xa9\x98\x24\xa4\xa4\x04\x16\xb2\xd2\x07\x79\x00\xd2\xb8\x8d\x12\x94\x5b\xe3\x14\x44\xd8\xa0\x13\xd4\xfa\xc9\x6a\x5e\xf8\xa2\x24\xa9\x08\xed\x73\xa2\x00\x01\xd6\x19\x91\x24\x09\x58\x8d\x11\xdb\xa9\x63\x0f\xdc\xbb\x6b\x30\xde\xe6\xaa\x4f\x26\xe2\x21\x3b\x87\x52\xe6\xa0\x6c\xac\x70\xad\x7f\x4e\xc4\xe0\xa4\x26\xce\x70\x18\x3c\xa1\xb3\xf5\x2f\xad\x9b\xcf\x2e\x6b\x64\x24\x5e\xc3\x58\x63\xa2\xbd\x62\xa2\x59\xf8\x3a\xd0\x33\xdd\x34\x5b\x15\x6b\xf1\xdf\xc5\x88\x29\xb9\x56\xc6\x03\x71\x7f\x47\xc9\x9b\x65\xb1\xbe\x7d\x37\x0f\x7e\x65\x9d\x3e\xc8\x0e\x58\x25\x84\x94\xa1\x67\x58\x00\xe4\x34\x31\x0e\x38\x2d\x84\x54\xa3\x11\xb5\xad\xb7\x0a\x06\xdb\xcb\xc3\x49\x18\xed\xe4\x93\xe1\x50\x81\x02\x10\x52\x37\x4f\x64\xbd\x97\x46\x7b\x19\x1c\x0f\x43\x54\xc3\x5e\xfa\xae\x4d\xe4\x59\x2a\xcf\x5a\xd5\xbf\x3a\x23\xbf\x62\x75\xf5\xcd\x52\x5d\xbd\xc8\x84\xbd\x89\x92\x39\x26\xdd\x73\x52\x70\xdf\x8f\xa5\x10\xa7\x61\x18\x06\x2d\x87\x6d\xe9\x3e\x75\xb9\x2d\x83\x03\x0c\xc1\x2a\x5b\xd7\xcf\x09\x48\x26\x0e\xca\x29\xc9\x0b\x80\x13\x10\xeb\x28\x59\xe4\x97\xba\xd4\x28\xde\xdc\xdc\xbf\xcc\xf4\x12\x79\xcd\x0e\xcb\x76\xf7\xe1\x9b\x15\xb6\x45\x09\x78\xdb\xed\xb3\xdc\x29\xc5\x25\x6f\x0d\xc8\x50\x3f\x40\x84\xb4\xde\x1a\x68\x8d\x0f\x7b\xe6\x09\xe9\x4e\xf6\x50\x87\xae\x97\x80\x80\xda\x03\xeb\x94\x00\xe5\x3c\xcf\xab\xf2\x99\xee\xd8\x16\xbf\xec\xb9\xdf\x2c\x8c\x56\x9b\xbb\x37\x7f\x92\x2e\x95\xc9\x37\x9f\x0b\x23\xdf\xee\x7e\x11\x75\x4b\xde\xde\xc6\x8f\xb3\x63\x4f\x79\x4a\x9c\xb3\xde\x4f\x7b\xef\x11\x96\x27\xe7\x4a\x98\x42\xc3\xc7\x70\x68\x68\xea\xab\x50\x62\xab\xa5\xde\xe2\xa9\x4a\x85\x0d\x4d\x44\xe1\xb3\x4f\x27\x04\x55\x07\x10\x23\xc4\xd2\xbd\xde\x3b\x54\x3b\x70\xa0\x4c\x18\x35\xfb\x6e\xf9\x33\xdb\x5c\x78\x47\x6e\xcf\xdf\xfb\x37\x6f\xef\xbf\x79\xbb\x4b\xc1\x6d\x7a\x55\x3a\xbe\xc8\xea\xad\x84\xd1\xb5\xec\x8e\xb6\x1c\xd4\x18\x4c\x0a\x33\x08\x2d\x13\xb9\xa2\x65\x5e\x66\x0e\x86\x9e\x83\x04\x9a\xad\x86\x81\x8e\x1c\x40\x40\x42\x1b\x5a\x05\x66\x03\x54\x76\x1e\x5a\x48\xea\x94\x4d\x3c\x1c\xf5\x98\xf2\x88\x3b\x14\xab\x22\xae\xf5\xef\x92\x3f\xfa\x4f\xd4\x1e\xbe\x7a\xb9\x06\x62\x76\x62\x0e\x95\x16\x82\x57\xa6\xd1\x7d\x13\xf6\x2b\x05\x48\x44\x1c\x8e\x8d\xf4\xde\x0b\xa3\x3a\x19\xc6\x4d\x5f\xd7\x8b\x79\x66\xc1\x03\xd3\x79\x63\x4f\xae\xae\x1d\x32\xc6\x39\x19\x6a\x10\xb9\x01\x5c\x02\x12\x01\x0e\xbb\x6a\x7d\x8c\x78\xaf\xf9\xbb\xf8\xe1\xc3\xe3\x7a\x33\xaf\x88\xd7\xd2\x0e\x0b\x13\xdb\x2a\x73\x7e\xbf\x6a\xf7\x1d\x01\x0e\x48\x6a\x6d\xae\x34\x57\xa5\xe6\x08\x65\x81\xeb\xa9\x65\xe0\xa4\x82\xb3\x15\x07\x66\x7d\xa4\x52\x32\xa2\x55\xed\x29\x09\x43\x9d\xd9\x8c\xb9\xb0\xa7\x16\x77\x02\x63\x2b\xcf\x39\x4c\xb5\x33\x5b\xfe\x82\x7f\x7c\x88\x67\xe0\xdd\x9b\xc7\x9b\xdd\xcd\xdd\xc3\xfa\xff\xa1\xec\x6f\x62\x24\xe7\xf1\x34\x31\x5c\x94\xe2\x43\x3d\x33\xff\xff\x2a\xbb\xde\xea\x52\x8f\x77\x76\x98\x93\x6f\xbd\xa5\x19\xef\x7a\x38\x5d\x53\x95\xdc\x9d\xf5\x0e\x07\xb3\x36\xb8\x1e\xc3\xe6\xc2\x30\x4c\x7b\x60\x9b\x36\x0c\x9b\x80\x61\x9b\x17\x1b\x84\x0d\x18\x84\x4f\x3c\xf2\xc8\xa3\x8e\x3a\xea\xa8\xa3\x8e\x3a\xea\x18\xc7\x38\xc6\x31\x8e\xea\xae\x14\xc3\x10\x15\x91\x95\x59\xef\xdb\xed\xdd\xea\x8e\xfc\x50\xe4\x9b\xa9\x0f\xf2\xf7\xf9\xfc\x9e\x67\xfb\xe1\x57\x8f\x77\x0f\xdb\x97\x84\x2e\xb7\xd1\xbc\xef\xd2\x57\x65\x1c\x9b\x35\xca\x18\x1f\x78\x38\x17\x94\x6b\x50\x2e\x89\xf3\xed\x95\xc1\xae\x16\x78\x6e\xb3\xc4\x52\xa3\xb4\x54\xcd\xc8\x06\xdb\xf4\x3b\xee\xe6\xbe\x70\x85\x92\x55\xee\xf2\x54\x19\x13\x9c\x0e\x0e\x0a\x20\xb5\xb5\xad\x53\x65\xe8\x84\xd2\x4a\xa9\x86\xd5\xc4\x3a\x1b\x6d\x08\x8f\xfe\x64\xe5\x0e\xfb\xa3\x38\x39\xf9\x5b\xf5\xfd\xb2\x8f\x77\x0f\x6f\xbf\x03\xaf\xe9\x55\xbe\x39\xf7\x0f\x3f\x7c\x58\xb2\x7f\xf0\xf9\xf1\xe1\x17\x9b\x4e\x70\xc4\x2a\x8e\xf1\x50\x0a\xab\x7c\xdf\xe7\x43\x9f\x4d\x8c\x12\x05\x35\xaa\xc2\x08\x4e\x1c\x51\x29\x38\xa5\x5c\x48\x26\x50\x51\x39\x50\x63\xd8\xc3\x1d\xff\x75\x2f\x65\xe1\x0b\x01\xc6\xa0\x43\xc7\x41\x9b\xe6\x59\x1e\xca\x18\xe5\xf1\x9e\x65\x3a\x60\xbe\xe4\xa8\x08\xc0\xb9\x13\x2c\x48\x6d\xa5\x11\xda\x70\x29\xeb\xc9\xb7\x4f\x6c\x9f\x7f\x29\xea\xe9\xb4\x72\xc4\xa7\x38\x3b\xec\x54\x8c\xe2\x12\xb0\xb6\x2c\x57\x21\xb5\x5f\x82\x37\xeb\xed\x2f\x21\xaa\x49\x05\xf2\xb9\x83\xc6\xd6\x1e\x34\x41\x6c\xc7\x28\x49\x1e\x92\x71\x10\x07\x90\x03\x1e\xec\x79\x2c\x16\x3b\xd7\x5c\xc8\xbe\x8b\xda\x8f\xff\xee\x35\x22\x7c\xa1\xfe\x18\xe7\xd8\xef\x5f\x6a\x5c\x7d\xbe\xdd\xc4\x38\xbd\x7e\x35\xc5\xeb\x2d\x2b\x7d\xa1\x6b\x69\x24\x35\xca\x07\x89\xe0\x21\xd4\x00\xe7\xc2\x60\x5a\x30\x5c\x15\x55\x53\xf4\xa6\x53\x53\x89\x52\xef\x94\xd4\xb6\x38\x74\xb2\x3f\xec\x4c\xc5\xc2\x78\xf0\xc3\x92\x1c\x8f\x1a\x40\x60\x6c\xed\xc2\xe1\xe9\x18\x4e\x85\x2f\xe8\x01\x9c\xe7\x36\x58\x09\x4c\x8a\x80\x74\x56\x3d\x8d\xdf\xe8\x4a\xee\x53\x79\x11\xfb\x36\xf6\xe7\x7e\x3f\x7a\x8e\x2a\xc1\xc9\xbf\x78\xad\x4f\xbe\x7d\x99\x07\x6f\xb6\xb7\xac\xf7\x7e\x75\x31\x3f\x09\xd4\xda\x95\x7d\xa7\x87\x2e\x58\xcb\x27\x35\x82\xc4\x59\x7f\x9a\x30\x31\x5e\x78\x14\xba\xe0\xaa\x01\xc4\x8c\x58\x07\xe1\xb8\x72\x16\x14\x8e\x18\x45\x4a\x0f\x4d\x7f\xd0\xe9\xa4\xa8\xa3\x72\x27\x83\x6e\xc4\x00\x0c\x81\xc1\x4d\xea\x80\xaa\xd0\xba\x12\x09\x41\xfa\x33\xd5\xa4\xd0\x5d\x68\x94\x51\x4e\xa3\x30\x1e\xd8\x74\x0e\x14\x96\xd4\x93\x41\x32\x01\xfa\xfe\x48\x4e\x5d\x92\xa6\x75\xac\x57\xd0\xab\xa2\xdd\x0d\x35\xb5\xec\xfe\xc5\x52\x3d\xff\xef\x6e\x1d\xcb\x5f\x2f\x78\x37\x38\x63\xcd\xd1\x86\xda\xf8\x40\x18\x28\x00\xac\x82\x4a\xcf\x33\x4e\x87\xb9\xcc\x5c\xf0\x79\x81\x88\x99\x99\x53\x46\x99\xb4\xa7\x93\xab\x8d\x3d\x02\x1e\xa8\xf3\x1c\x68\xa0\xed\xe0\x06\xfb\x34\x72\x66\x95\x6f\xe9\x25\xb1\xca\x27\x69\x62\x62\x4c\xd4\xc7\x1d\xb6\xec\xae\x5f\x3c\xd7\xb6\x7f\xf8\xb4\x2c\x94\x38\xad\xb3\xde\xc0\x6d\x53\x59\x81\xf3\xba\x50\x87\x83\x9c\xdb\xa2\x3f\xe9\x53\x0d\x58\xe7\x55\xdd\xa6\xfd\xac\x51\xc9\x8e\x30\x9c\x1d\x95\x69\x19\xba\x30\x4a\x2b\x40\x0e\x6c\x98\x94\xb3\x8d\x4a\x40\xc2\xd3\x7e\xc3\x77\x72\x8d\x3f\x76\xfb\x9f\x30\xbd\x2b\xdb\x0f\xcc\x7a\xe6\xda\x25\x73\x3a\xd5\xc2\x34\xde\x1f\xe5\xc1\x87\x1e\xb4\x4d\x87\x80\xdd\x49\x07\x4b\xef\x4a\xa1\x96\xa4\x68\x02\xea\x68\xad\xea\x9c\x2d\x72\x9f\x80\xc4\x5f\xc8\xce\x66\x28\xea\xf5\x45\x9f\x97\x6c\x3f\x7c\x0f\xee\xbf\xb6\x68\x32\xe9\x28\xcb\xaa\xd0\x7d\xa9\xe9\xa6\x00\xe5\xd3\x54\x72\x6e\xd9\xb2\x3f\x81\xc9\x10\xa5\xd4\x86\xa2\x6e\x15\x50\x25\xe3\x4b\x96\x41\x6c\x9d\x6c\x52\x17\xf7\x95\xbe\xa2\x9d\xff\xf1\x4d\x89\x70\x7d\xed\x23\x83\xea\xb2\x3e\xbf\xcf\xc0\xc3\xa7\x97\xc2\xb1\x8b\x51\xff\x17\x60\x33\x39\x80\xea\x2f\x07\x0f\xd0\xe0\x9b\x70\x54\xa0\x4c\x4d\x7d\x16\x61\xea\x42\xdb\x67\x52\xb7\xd2\x42\x2f\x19\x2e\x82\xcb\x03\x55\x63\xbb\xd3\x41\x03\x14\x08\xe8\xc3\xd8\x57\xa1\xe9\x74\xbf\xa4\x28\xae\x1e\x01\x9e\x07\x3b\x8f\xc7\xd2\x95\x06\xe8\x40\x46\x2d\x4f\x2b\xbe\xe0\x74\x61\x7b\x9d\x25\xc9\x77\x71\x02\xe9\xb9\xb6\xf8\xcd\x2c\xc8\xd7\x20\x2c\xa3\xa0\x5b\xcc\x09\x67\x92\x11\x48\x19\x0e\xb4\x37\xae\x56\x6d\x7a\xac\x85\xe1\x75\x1a\xc5\x16\x68\x0c\x28\x39\xf0\x8c\x85\xc9\xcb\x6e\xe8\x0e\xec\xd0\x2d\x7f\xaf\xba\xb0\x6d\xbe\xc3\xb1\xee\x56\x25\x49\xbc\xf2\xfd\x4b\xcd\xdc\xc8\x4d\xf3\xf0\xe9\xe3\xe7\xc7\x87\x4f\x4b\x38\x92\x7d\xfc\xfc\xe9\x61\x97\x11\x97\x72\x54\x39\x84\x2b\x4a\x2b\x98\x1f\x78\xad\x1d\x95\xb6\xcc\x9d\x73\x4d\x03\xfb\xbc\xc9\xb7\xb5\xff\xcd\xe1\xdc\x95\x75\x29\x81\x08\xea\x2c\xce\xa0\xca\x7d\xd3\x7a\x40\x9f\x06\xdf\x77\x51\x03\xb1\xb9\x90\x6d\x12\x71\xc0\x91\xcd\xf6\xee\x2b\x7b\x5b\x4c\x37\x36\xa2\xae\x65\x79\x10\x5d\xae\x81\x0a\xa3\xab\x77\x7a\x1a\xd3\x61\x3e\x34\xc6\x82\xc1\x4f\x69\x3d\x4f\xf1\xf7\xc8\x0b\xde\x7e\xab\xa3\x1f\xfb\x61\x1f\xdf\xde\x5f\x7f\xe5\x72\xe2\x4b\xd8\x96\x25\x5d\x3d\x0c\x5d\x5f\x9e\xc2\x24\x7b\xdb\xf1\xfe\x54\x1e\x0e\xdd\x55\x48\xf1\x92\x58\xab\x7d\xa8\x0f\x72\x00\xb9\x37\xc6\x82\x1b\x0f\xf8\xde\x65\x75\xf2\x07\xc9\x2f\x6f\xf9\xda\xf3\x72\x7c\xf5\xcd\x33\xeb\xff\xb5\xc6\xb0\xed\xeb\x02\x36\x8d\xd1\x5e\xb4\x0a\xc0\x27\x52\x17\x65\x1d\xbf\x6d\x34\x28\xeb\xb4\xab\xd3\x6e\xa6\x19\x99\x8e\x19\x99\x69\x56\x43\x46\xb5\x8b\x33\x2c\x6a\x00\x39\x64\x54\x79\x6d\x8c\x35\x6a\x08\xf5\x92\xe5\xba\xc6\xb9\x66\xe5\x0b\x51\x51\x6f\xd4\x26\x7f\xf0\xac\x9c\xf1\x6e\xb7\xaa\x6a\x6d\xb6\x1f\xbe\x7f\x77\x13\x77\xde\xbc\xdb\x7f\xff\x52\xf7\xee\x6a\x4b\xb7\xef\x96\x9f\xca\x4e\x6d\x09\x01\x05\x27\x1e\x68\xa0\xa1\x0f\x98\xa5\xf2\x50\x2b\xc5\x3c\x13\xa0\x18\x65\x38\x07\x23\x7d\x94\xd2\xa0\x28\x38\x2e\x2c\x93\x40\xa0\x4b\x12\x3a\x0a\x64\x66\x71\x51\x68\xee\x79\xd7\x68\xef\x54\x18\xa0\xb4\xcc\x70\xa1\x7c\xb3\x04\xb8\xa5\x2f\x2b\x0c\xc6\xc5\x09\x73\x6f\x8d\xac\xc5\x72\x2f\x9b\xd4\x47\x4d\x9e\x9f\x45\xbd\xb0\xe4\x16\xe0\x7e\xff\xf8\xfe\x39\xca\x5d\xd3\xc9\x78\x57\xaf\xe0\x24\xe3\x7d\x3f\x52\x90\x8f\xa0\x53\xea\xac\xfd\x12\xe3\x0e\x73\xcb\xd3\xbc\x0d\x04\x49\x2e\xf8\xd3\x89\x61\x8b\xd8\x4e\x3f\x41\x50\x29\xee\x85\x29\x85\xec\x40\x05\x19\x35\x01\x3a\xab\x81\x24\x54\x28\x09\x46\xdb\x90\x95\x73\x25\x4b\x3a\x70\xde\xd3\x1d\x4f\xde\x26\x7f\x96\xfc\x4d\x92\x80\xcd\xf6\x96\xe0\x5d\xa5\xe9\x7e\xf5\x3e\x6a\xa0\xdc\x8e\x5e\x1f\xf3\xaf\x1e\x3f\xbc\xff\xc5\xcb\x5c\xf0\x7a\xf4\x87\x0f\x29\x04\x18\xe4\xad\x7c\x4a\xb6\x89\x6e\x80\xe4\x87\x70\x0e\x63\x80\xf8\x08\x50\xd3\xf6\x9d\x67\x64\x6e\xb2\x9c\xca\x9a\x09\xd5\x1e\xb0\xd7\xa7\xac\xeb\x3c\xc7\x73\x93\x15\x4c\x32\xb6\x1e\xae\x95\xd2\xdb\xb6\xc2\x64\x89\xc1\x18\x37\x14\x8b\xd2\xe2\x12\x06\x8c\x09\x61\x56\x5b\xce\x35\x41\xa2\xf0\x15\x97\xb7\x23\xa8\xd2\x04\xcb\xc2\x57\xa8\x8a\x9c\xf1\x3a\xe5\x7b\x18\xed\xdd\x3f\x58\xf7\xd7\xdb\xe7\x5e\xd7\x33\x63\xbe\xae\xb3\xfc\x69\x4a\xed\x6f\x0e\x69\x12\xea\xec\xf4\x54\x2e\xaf\x9d\x96\x2e\x12\x1d\x87\xb3\x0e\xc6\x24\x59\x3a\x46\x3c\x84\x8e\x8a\xfe\x7f\x1e\xe7\xa2\xbe\xc1\xfc\x2c\xb1\xc9\xe3\x5a\xc3\xfd\xf9\x9b\xab\x2a\x43\x54\xb4\x5b\x2b\x81\xa5\x73\x42\x30\x03\x2d\x25\x73\x5f\xb5\xb6\x81\xe3\x51\xa8\x41\x78\x94\x95\x4f\x0d\x42\x2a\xc5\xf3\x70\x74\xc2\x71\xb7\xe1\x73\xed\x43\x2f\x44\x61\x0b\x01\xca\x30\x9e\x19\xc8\x07\x9f\x56\x56\x81\x04\x28\xd8\x3a\x4d\xe7\x1a\x1c\x90\x6b\x78\xe3\x12\x90\xea\xcb\xb4\x39\x6d\xd5\xaa\xef\x9a\x66\xbf\x78\xd9\xcb\x8d\x0f\x29\x1d\x41\x57\x30\xc9\x2d\xc6\xaa\x11\xad\xd0\xde\x48\x51\xe5\xe1\xb8\x55\x01\x86\xa1\xef\x89\xd5\x97\xa4\xb6\x0d\x40\x87\x01\x5b\x7f\x3e\x2e\xfb\x2b\xcb\x2f\xc3\xde\xc5\x18\x66\x9d\xdf\x7b\x81\x3d\xbf\x69\xe1\xbc\x8d\x7a\xcd\x1b\xae\xa8\x23\x2a\x55\x2d\x97\x00\x3f\x95\x69\x21\xe7\x2e\x93\x4f\xbe\xd9\xd8\x2f\x7a\x27\x5d\xcd\x6b\xcf\xd0\xa1\xf6\x7e\x98\xa1\x0f\xcc\x47\xcd\x16\x7c\x21\x51\xf7\xe6\xcd\x8a\x19\x7e\xa1\x48\x75\x9d\xfa\x5f\xac\xf1\x37\x6c\x83\x19\x06\x79\x0d\xf2\x7a\x9a\xea\xb0\xfc\x1f\x14\xa7\xec\xc8\x98\xac\x61\x47\x50\xa0\xf5\xb6\x19\xc7\x61\xf0\xe3\x78\x38\x84\xc4\xcf\x84\x73\xe8\x21\x4a\x8b\xa7\x38\x1f\x0d\x92\xc5\x07\xba\x4d\xb9\xdc\xab\x5b\x46\x95\x6c\xf7\xdf\x83\xbb\x87\xbb\x24\xee\xb9\xf3\x62\x91\xc6\x79\x00\x39\x68\x78\x40\xe1\x58\x87\x29\x70\x09\xec\x34\x1f\x33\x18\xd5\xaf\xba\xe6\x0c\x0e\x4f\x87\x2c\x0f\x7c\xb2\x07\x60\x16\xfb\xeb\x2f\x28\x72\xbf\x3d\x6b\x35\xbc\xbd\xff\x6e\xff\xda\x89\x82\x0f\x9f\x7f\xfe\xe6\xe1\xda\x02\xf8\x7e\x37\x89\x60\x42\x91\xd5\xf3\x39\x07\x9d\x70\x2c\x66\x46\xcb\x43\x29\xc3\xa8\xbc\xcd\xcf\x07\xdd\xa6\x70\x27\x3c\x2e\x26\xef\xcc\x2c\xa7\xc2\x17\x2d\xe8\x42\x1e\x0e\xc6\x81\x26\xcd\xc3\x14\x8a\xc0\x14\xb0\xa0\xc9\x70\xbe\xea\xbf\xbb\x0b\xdb\x92\xa8\xcd\x12\xeb\x23\xbf\x07\xb2\x25\x5b\xff\xba\x45\x7f\x9e\x75\x35\x06\x10\x9e\xce\x1a\x38\xe4\x10\x62\x44\x22\x8c\x90\xea\x77\x06\x9d\xe7\x76\x56\x61\x34\xe0\x94\x15\xad\x63\x42\x33\x22\xb9\x02\x4d\x92\xa6\xcd\x85\xef\xeb\x9d\x48\x8a\x25\x17\xbd\x5d\xe1\xdb\x6b\xa1\xf6\x7b\xf0\xdc\x36\xdf\xed\x77\xf7\x70\x09\xbb\xbe\x26\x85\xbb\xa3\x0c\x75\x40\x99\x7d\xd2\x93\xd6\x02\x4c\xa0\x0c\x0a\x0f\x3d\xca\x9b\x92\x54\xe1\x18\x06\x99\x8e\xb9\xd4\x94\x96\x8c\x56\xe5\x4e\x38\x51\x7a\x3b\xce\x63\x80\x12\xe4\xc0\x83\x3c\x35\xc5\xd3\x69\x96\x55\x41\x3d\x3e\x10\x44\x55\x46\x03\x3b\x94\xae\x60\x57\x3f\xa0\xa2\xfe\xfc\xfe\x79\xa7\x5f\xa1\x92\x2f\xa1\x2a\x3b\x01\xd0\x74\x04\xb4\x5e\xd6\xe5\xf3\x8b\x3e\xf5\xde\x67\x24\x9c\x6c\xe0\x3e\x08\x13\x6b\x4c\x43\x62\xf6\x62\x2b\x63\x36\xf3\x6e\x7f\xdb\x51\xb1\xda\x13\x6b\x1e\x9b\xb3\x45\x40\x15\xae\xb7\xd2\xd5\x6e\xd4\xe0\x80\x27\x26\x5c\xbf\x95\xa8\x0e\x87\x4b\xd2\xd4\x7e\x74\x5d\xa7\x80\x01\xae\x73\x1c\xe4\x09\x48\x64\xea\xf7\x64\x47\xa3\xef\xbc\x7f\xbb\xdb\x3e\xd7\xee\x5e\x82\xde\x92\xd8\x43\xfb\xf4\x0c\x7a\x03\x78\x4b\x8f\xa1\x4f\x8f\xca\x1b\xcd\x42\xc5\x1d\x67\xa5\x10\x24\x0f\x63\xc8\x25\xe8\x40\x31\x8b\x74\x10\xda\x28\x71\x6e\xbf\x0c\x3b\x6a\x8d\xb4\xad\x17\x4a\x9f\xd7\x91\xd6\x43\x38\x37\x56\x77\x16\x23\x8e\x09\xe5\x49\x96\xd4\x69\xbf\x17\x91\xdf\x28\xee\xe8\x37\xf7\xaf\xe6\xa6\xee\xb7\x91\xb9\xf1\xfe\x6d\x0d\x48\x9d\x15\x11\x87\xf0\xa5\x0d\x3d\x38\x66\xc5\xd3\x79\x79\x6d\x87\xae\xeb\x3a\x3f\xbb\x54\x35\x4d\xa8\x9a\x26\x01\x69\x7b\xa1\x71\x1f\xff\xf1\xd5\x97\xad\x5a\xbc\x31\xea\xfe\xf8\xdd\xfe\xe3\xdd\xf3\xdc\xe6\xdd\xfd\xae\xaf\x97\x7d\x7b\x49\xe0\x41\x19\x59\x17\xe7\xc0\x40\x1b\xc5\xb5\x41\xbe\x81\x5f\xce\xe0\x38\xf3\xb4\x09\xc7\xa3\xd1\x40\x81\xfe\xd4\xa4\xc2\x4f\x93\x9f\xeb\x65\xef\xf2\x0b\xdb\xd5\xa9\x7e\xb9\x77\x37\xd7\xbd\xbb\x96\x1d\xa6\xb4\xf0\x60\x08\x35\xc8\x81\xe3\x81\x5f\x12\x7f\x0c\x5e\x02\x7e\x0c\x12\x9c\x9c\xb3\x27\xd1\x3a\x50\x04\x0a\xba\x4b\xe2\xad\x3d\x26\x29\x38\x5f\xc8\x76\x02\xc7\x98\xa7\x2d\xde\x6f\xff\xfd\xfb\x35\x84\xc8\x30\xa8\x00\x63\xa1\x0e\x83\x4b\x13\xd0\x8b\x40\x42\x09\x8e\xd8\xb9\x9a\x4a\xd3\xdb\x6e\x9d\x2d\x39\x2e\x31\xc8\x8e\x5c\xa7\xe5\xaf\x7e\xe1\x5b\xdf\xb0\xc4\x75\xd7\x0e\xdf\x9b\xab\x2c\xd5\x6e\xb2\xd6\x7b\xa5\x08\xaf\x34\xa1\xf3\x50\xd7\xb5\x73\xf5\x0d\x13\xb5\x23\x21\xf7\xa1\xf5\x81\x0a\xb1\x2c\x73\xe0\x66\x93\x1a\x0f\x58\x54\x14\x03\xe2\xa9\x5b\x75\xfd\xb3\x4d\x95\x76\x7b\xba\x63\x37\x4d\xcf\xd7\xca\xc3\xcb\x12\xfb\x14\xc5\x87\x97\x67\xb0\xa7\x8c\x13\x0e\x05\xc6\x41\x94\xdc\x28\xfb\xac\x05\xc3\x66\x24\x64\xe1\x0a\x49\x6a\xcf\x0e\x13\xd0\x93\x0a\xb5\x8e\x7b\x4b\xa7\xcd\x9e\xed\x6c\xf2\x26\xf6\xfa\xd1\x33\xf3\xd1\xe3\x8a\x78\xb9\x8b\x95\xde\xf7\x3f\xfa\xab\x6b\xe2\x9f\xdd\x7f\xba\xff\x0e\x9c\x38\x01\x6c\x1e\xe0\xf9\x50\x85\x2e\x9c\xa8\x05\x0c\xe1\xed\x99\xb2\x6b\x9d\x22\x21\xd4\xd6\x1e\x1c\x42\x55\x80\x53\x80\x3b\x2b\xb4\x0f\xac\x20\xc4\x0a\xca\xc1\xe4\x09\xae\xe6\x84\xf1\xc2\x15\x48\x76\x4a\x0c\xa0\x00\x2a\x9c\x4d\xb0\xe6\x3a\x9f\x2b\x53\xb6\xf7\x3b\x9c\xfc\x51\xf2\xb7\xab\x96\xed\x77\xfb\xb5\x30\x1a\x35\xaa\xd7\xa5\xf1\xe1\xf1\xdd\xfe\xe3\xe3\x8d\x6b\xf3\xe1\x75\x72\x7d\xfd\xa1\x87\xf8\x43\x9f\x3f\xdd\x8f\x59\x1e\x86\x02\xb0\xa1\xab\x6a\x4b\x73\x1c\x34\x07\x14\x85\x09\x31\x8d\xfa\x22\xf4\xd9\x92\x7c\x8d\x05\x50\xe7\xa2\xc4\x30\xb7\x25\x33\x8a\x14\x28\x28\x0e\x30\x99\x10\x33\xb8\x2d\x42\xbd\xc3\xd6\x48\x13\x26\xa6\x39\x66\x40\x85\xa1\xb7\xf5\xa8\x46\x6c\x4f\xd6\x9e\x4c\x38\xc1\x02\x69\xd4\x32\x22\x00\x0a\x87\xde\xba\xf8\x9e\xbc\x6a\x93\xea\x54\x47\x6c\xcc\x3f\x4c\xfe\xea\xeb\x6a\x5f\xdc\xee\x6b\xa0\xde\xe7\x4f\xcf\x15\xc0\xef\x1e\xbe\xbb\xb2\x33\x7c\xbf\x56\xc3\xef\x23\xe9\xcc\x00\xb0\x03\x30\x1c\x73\xc0\x82\x2f\x86\x5a\xf8\x5a\x9d\x23\x44\xaf\x07\xb2\x08\x43\x66\x22\xba\x3b\x1c\xf2\x1c\xe8\xd0\x4a\x90\xb3\x70\xd6\x22\x9c\xd8\x89\x85\x23\xe0\x45\x1e\x22\x44\xcf\x7a\x5b\x71\xa5\x95\xe8\xa5\xd5\xbd\xa5\xcc\x7a\x6f\x0b\x4a\x6c\xcb\x9c\x38\xf7\xca\x08\x67\x29\x8b\x75\xba\x29\x3d\xee\x93\x9d\xbb\xaa\x1c\xfe\x51\xac\x17\x3e\xb3\xa3\x2d\x8b\xff\x87\x0f\xd9\x73\x64\xf4\xfe\xee\xfe\x6e\x85\x54\xa5\x56\x33\xc0\x24\x6d\x18\x03\xcd\xaf\x27\xe0\x08\x8f\xbc\xb7\x13\x27\x16\xf3\x94\xa5\x65\x18\x3d\x15\x46\xec\x8c\xd2\xda\x20\xc5\x67\x9a\x76\x9c\xce\x08\x34\x54\x1a\x62\xa5\x09\x1c\x34\x14\x35\x8a\x9a\x78\x1e\x59\xbe\x4f\xae\xf3\xa2\x2b\xfb\xc0\x4f\x9c\xc7\xeb\xb9\xd0\xd4\x2e\x8f\x5a\xd2\x86\x32\x50\xbf\x38\x87\x74\x48\xcb\x2f\xf0\xf6\xd5\x4e\x4b\xad\x14\x92\x74\x56\xa9\x63\x34\x08\x63\x4c\x30\xc6\x98\x35\x2f\x19\x52\xb4\x47\xd9\xf8\xb5\x6f\xf7\x66\xa5\xc6\x88\x7f\x61\x31\xb7\xc3\x4e\xfe\xda\xd7\xb1\xd9\x33\x02\xe5\x00\xcf\xc6\x20\xac\x5b\xfe\x2d\xe7\x6d\xaf\x3d\xb2\x17\xe7\xfd\x12\x25\x74\x15\xc5\x7e\x75\xde\x36\x83\x75\x86\x9e\xc6\xb4\xfb\x4d\x92\x36\x4f\x47\x90\x2f\xb9\x52\xda\xa5\xf0\x4b\x75\xfb\x6a\x57\x28\xe5\xc4\x0d\x47\x68\x6d\xd0\xf1\x8c\xf3\x44\xa6\xee\x3a\x8b\xfa\x9a\xfd\xe6\x95\x77\xf8\x8a\x11\xbb\x7f\xbb\x7d\x71\x2d\xe0\xc5\xd7\x32\x95\x1e\x60\x1f\x5b\xd5\x87\x5f\x9f\xc1\x38\xfb\x0d\x0e\x43\xa8\xe2\xa5\x1e\x00\xf6\x80\x7c\x29\x5f\x7c\xb3\xcb\x95\x52\xca\xa9\xd9\xa6\x7a\xf9\x6a\x8a\x20\xb7\xe0\xe3\xa7\xb8\x0f\xe8\x85\xee\x59\x36\x5e\xb3\xf3\x8f\xbb\xfd\x7d\x91\xde\xbf\x1c\xdb\x7a\xb1\x1d\x62\xfa\x19\x4f\x36\x15\x0d\xe1\x9b\x63\x73\x49\xa8\xac\x3c\xa9\x2b\x32\x77\x25\x3c\xf4\xaa\x3b\xaa\x46\x01\x28\x43\xa9\xbd\x01\xda\xfa\xec\xf8\xc5\x66\xa3\x12\x33\x0f\xe7\xc2\x17\xc2\x81\x1a\x23\xca\xb5\x24\x82\x29\xe3\x05\x37\x6d\xe8\x4e\x2e\xc6\x8e\x75\xda\xee\xe1\x8b\xbe\xc8\x37\xd1\xdd\xf7\x6f\xae\xd5\xef\xe5\x3c\x52\xec\x21\xde\x34\xaa\x95\x0e\x7a\xc5\x51\x1e\x26\x1e\x88\x06\x56\x84\xc9\x84\x52\x83\x4e\x87\x49\x59\x0d\xca\x9d\x81\x9c\xcf\xa7\xb1\xf4\xa5\x05\x38\xd4\xe1\xac\x4e\xa0\x0c\xfd\x49\xf7\x67\x23\x54\xbf\xf6\x7e\xe8\x85\x6c\xd1\x33\x56\xee\x2f\x7e\xaa\x63\xfa\x26\x56\x46\x5f\x45\x9d\x9f\x1e\xd2\xfd\x87\x7f\x01\xae\xfd\x38\xe7\x4b\x08\x8a\xb9\x6d\x20\x8e\x5c\xfa\x28\x8c\x03\x2c\xcf\xc1\xe6\x80\x51\x45\x58\xa9\x70\x51\xf4\xe5\x51\x6a\x9e\x3b\x90\x17\xe5\x4e\x43\x46\x16\x57\xcf\x23\xc5\xb8\x0e\x07\xc2\x2c\x23\x41\xf9\xd2\x14\x4b\x70\xd1\x1a\x36\x81\xdc\xe2\x2a\xee\x7b\x7d\x21\x7b\x9b\x1d\xaf\xd5\x79\x1c\x19\x02\x23\xcd\xd9\x57\x96\xb3\xbb\xa8\xfa\xb4\xbf\xf2\xfa\xbe\x5f\x75\x90\x6e\xa8\x9f\x65\x5f\xae\xe2\x00\xbf\x7a\x04\x6f\xb3\x17\x14\x9e\x9f\xfe\x32\xf6\x19\x1f\xee\xb6\x30\x30\xaf\x89\x96\xc4\x16\x65\x7b\x24\x47\xa4\x30\x9a\x16\xfb\x06\xe0\xdc\x59\x17\x34\x99\x64\x38\x40\x2d\x85\x2c\x1d\x77\x4c\x59\x52\x39\x7b\x10\x6c\xab\xbc\x93\x92\xa0\x82\x10\xe2\x35\x9a\x5c\x26\x66\x7b\x49\x60\x25\xb1\x6b\x31\xae\x10\xc2\xd9\x18\xbb\x41\x5a\x4f\x4a\xe5\x28\x54\xb5\x95\x3d\xb4\x4c\x16\xb9\x36\x23\x6a\x54\x4e\x39\x9a\x7c\x91\x56\x26\xb4\xb5\x13\x32\x37\x85\x50\xf5\x49\x3d\xa1\x0d\x4f\x92\x5d\x32\x66\xc5\xbe\xb8\xf2\x3f\xaf\xec\x0c\x7f\xfa\x53\x1e\xf9\x97\xe0\xdd\xd5\x37\xbe\xfd\xee\xe5\xfc\xfe\xbe\xe0\x7c\x59\x2d\x02\xcf\xc7\xca\xca\x26\xca\xfe\xe6\x69\x31\x4f\x4f\x22\x65\x73\xeb\x6e\x0f\x6d\x27\x66\xc1\x79\x61\x4b\x0e\xad\x50\x16\x40\x50\x4d\x2a\x34\xaa\xc0\xc0\xcd\x1c\x58\x1f\x84\x4f\x92\x2d\x58\x72\x1d\xbd\x75\xc9\xbf\x93\x7c\xfa\x8a\xdf\xdf\xff\xb8\xd3\x7f\xd5\x46\x7b\xff\x2e\x92\x18\x7f\x5b\xcc\xdc\x7f\xf8\x1e\xbc\x50\x3d\x8c\xb1\xf4\x48\x96\x20\xfe\x3c\x38\x6e\xac\xd5\xad\x3c\xda\x03\x48\xa4\x44\x00\x07\x41\xa6\xf3\xf1\xcc\x19\x37\xc2\xa9\x83\x0c\x67\x80\x4e\x08\x90\xec\xe0\x9f\x8c\xf7\x99\x79\x32\xcb\x6b\xeb\x14\x92\xda\x1a\x63\x65\x68\x01\xed\x94\xb1\xbd\x66\x79\xa1\x21\xd2\x95\xd4\x4e\x13\x1c\x5a\x80\xad\x94\xb6\xd1\x1c\x9a\xf2\xa9\x5d\x72\xb9\xb4\xbf\x24\xcb\x42\x5c\xf1\x94\x6d\xda\xed\xfd\xce\x5f\xf7\xc4\x9f\x26\x9f\xd6\x2b\xbc\xed\x8b\xfd\x95\x8f\x0b\x5c\xe7\x7c\x63\x48\x1a\x9d\x7c\xe4\x30\xbe\x07\x6f\xdf\xc7\x10\x66\xb1\x18\xef\x6f\x53\x92\xbb\x7d\x2c\x1b\x83\x43\x5d\x96\x40\x3d\x4d\x13\xb4\x71\x26\xf1\x14\xca\x74\xc8\x68\xe8\xf3\x02\x98\xc0\xe5\x24\x7a\x3e\x55\xdc\xc2\xaa\x2f\xf3\x60\x67\x9a\xa2\x2a\xd4\xa1\xa7\x2e\xe5\x69\xe5\x30\xab\x72\x53\xc0\xb2\xb3\x64\xe7\x21\x82\x01\x83\x01\x9f\xc8\x89\x02\x62\x2d\x37\x97\xa4\x96\xb6\x55\x23\x64\x8c\xdb\xf9\x60\x85\x46\x90\x02\x8a\xa5\xad\x71\xc9\x2b\x5d\x41\xc4\xd7\x7d\xef\x2f\x64\x9b\x3f\xe3\xd0\xd1\x95\xc7\x37\x92\x29\x67\xcf\x68\x90\xeb\xa8\xe1\xee\xd5\xac\xe1\x6e\xff\x21\xce\x1a\x66\x1d\x86\xe3\xdc\x8f\x25\x52\xe0\x1c\x0a\xdf\xf7\x75\x0a\xb9\x54\xaa\xd4\x46\x70\x84\xca\x0a\x61\xc6\xd1\x81\x93\xd0\xec\xac\xd4\xd6\x0a\x16\x44\x90\xba\x09\xda\x49\x8e\x4a\x68\x2b\x78\x20\x34\xb7\x79\xe9\xcb\xc2\xa1\x66\xe5\x45\xd9\xa7\x28\x11\x7b\xb6\x13\x57\x3f\xf7\x67\x57\x75\x81\x57\x9c\x14\x7f\x0c\xd6\x3e\xe1\x8f\xf4\x05\x6e\xe2\x3e\x51\x53\xe0\x8f\xc0\xfd\xa7\xfb\xb4\xdf\x90\x2f\xbd\xbf\x25\x1a\xd8\x95\x15\x28\x4b\xe8\x11\x04\x36\xb0\x67\xc9\xa1\xf1\x89\x3a\xcb\x26\x30\xdc\x86\x44\x43\xb3\x13\xf3\x00\x38\x0f\x07\x7e\x42\x08\x55\x15\xc2\x54\x09\x2d\x94\x34\x28\x45\xc2\x36\xb5\x10\x07\x21\x0e\x72\x59\x33\x51\xaf\x6e\x8b\xae\x38\xcb\xe7\x09\xa4\xbb\xfb\x67\x66\xab\x6f\x28\x4a\x3f\x3f\x7e\x25\xd8\xb8\x8f\xbc\xdd\x37\x80\x0a\xdb\x92\x19\xb3\x6c\x0a\x4b\x48\xca\xb5\xae\x9f\x5c\x6d\x2c\x03\x49\x17\x4c\x5a\x62\x14\x88\xdb\xc0\x2f\xc7\xe5\xe5\x32\x48\xc9\x7c\x16\x34\x53\x4f\x6e\x79\x6d\xd1\x7c\x12\xda\x72\x8f\x49\x28\x38\x07\x13\x23\xc6\x58\x8d\x10\x20\x22\x1c\xc4\x7c\xc4\x98\x4f\x32\x0c\x62\xb1\xab\x6d\xda\xec\xfd\x8e\x5f\xfb\xfe\x7f\xbe\xa2\x86\xef\xee\xef\xde\xbf\x10\xb2\x79\xf3\x8a\x09\xf9\xe5\x62\x5f\xd7\xfa\x37\xeb\xbb\x4d\xcf\x73\x0d\x74\x55\x69\x2f\x34\x84\xe7\x30\x50\x17\x25\x72\xc7\x80\xd2\x31\x23\xb7\x75\x2e\x26\xd1\xf1\xa9\x12\x86\x74\x65\x1e\x1c\xe8\xbf\xae\x6c\x43\x77\x7c\x3e\x5d\x12\x5e\x41\x6a\x1c\x45\x15\xc5\x24\xad\x59\x38\xf1\x6f\xd6\x78\xcd\x6d\x10\xaf\xd7\xf5\x62\x9b\xf8\xde\x6d\x65\xec\x6d\xaf\x7a\x03\xbf\x53\xf7\xf0\x47\x87\x1f\xbe\xb5\x49\x60\x00\xd0\x81\xe4\x92\x44\x8d\x43\xa7\xac\x18\xd4\xaa\x7b\x18\x8f\xd6\x8a\x0b\xee\xb4\x15\xa3\x9c\xd2\xdc\x3d\x79\xe7\x6e\x45\x80\x4d\xdf\x34\x91\x63\x87\xd3\x30\x00\xe4\xa5\xb1\xb5\x7d\x79\x88\x34\xd2\x38\x1f\x92\x19\x32\x96\x1e\xc3\xd9\x06\x13\xe3\xcb\x2e\x15\x11\x0b\xfd\x2e\x7a\xbb\x7f\x1e\xeb\xa7\xef\xbe\x25\x88\x5a\xab\x2e\xeb\x50\x14\xb8\x8b\x54\xcd\xff\x08\x7c\xfc\xd5\xe3\xbb\xe5\x39\x7c\xb8\xbf\x69\x63\xbf\x5b\x42\xa9\x1f\x3e\x3c\xbc\xdd\x16\x0e\xa5\x85\x44\xde\xf4\xa2\x75\xad\xa7\x83\x10\xac\x42\xaa\xe7\x4c\xa9\x2a\xf4\xa1\x5f\x32\x0f\x14\xce\x85\x2e\x61\xe1\x2a\x4b\x07\x14\x0e\x5e\x97\xf5\x48\x5d\x5a\x85\x63\x91\x9f\x77\x1a\x59\x73\xe8\x05\x33\x5c\x3b\xa4\x89\x14\x9a\x62\x0e\x0a\xee\x95\x6d\x41\x12\x9c\x95\xc4\x3a\x7c\xe8\xdc\x09\x61\x43\x08\xc9\x6a\x59\xd7\x41\x11\x6a\xa3\xf6\x68\xaa\xf7\x78\xe7\x9f\x73\xda\xb5\xde\xf7\xdd\x8b\xec\x63\x7b\xcb\x3e\x56\x2a\xe4\x2b\x1c\x0d\x2c\x01\x46\x9a\x84\x21\x07\x32\xd8\x62\x68\x94\x6b\x54\x18\x28\xa0\x34\x58\xe0\x73\xcf\x84\xe8\x32\x9c\x8e\x33\xaa\x81\x0b\x6a\xe7\x21\xc6\x4e\x30\x8b\xb8\x36\x5a\xb4\xca\xa8\x83\x65\x82\x53\x65\xd0\x2c\x2d\x30\xab\x0e\x6a\xec\x3b\xfc\x32\x81\x6b\x27\x78\x65\xe0\x4a\x7f\xcb\x1d\xde\xdd\x68\x8e\xee\xd6\xfc\xf4\xf1\xee\xe3\xdd\xe7\xc7\xbb\xfb\xcd\x68\x8b\x32\x25\xba\x30\xc8\x0d\xb2\xf3\xf5\x41\x1c\x9c\x96\x10\xc9\x96\x4b\x6b\xcb\xe0\xe0\x97\x43\x56\x85\x21\x0e\x6b\xba\x32\xe8\x50\x96\xde\x52\x12\xea\xac\xae\x08\xb1\x75\x38\x21\xc9\xcd\xb2\x67\x0d\x35\xda\x13\xcc\x40\x42\x7b\xd3\x1c\x09\xa8\xec\x68\xc3\x09\x56\x56\x31\x5f\xa6\x45\xc8\xf3\x22\x5d\x35\x67\xe9\xbe\xde\xa0\xe4\xfb\x9b\xd2\x30\xf8\x31\x8d\xed\x2f\x3e\xde\xef\x1f\xe0\xfb\x17\xc2\x56\xb7\x0b\x79\xb1\xbe\xc1\xa1\x2e\x4a\xd0\x12\x69\x8f\x7e\xf4\xdc\x5a\xd3\x00\x88\xce\xb3\x0a\xa7\x53\x68\x09\x80\x83\xa4\x4c\xc8\x93\x15\x86\x93\x50\x17\x1b\x5f\x3f\x91\xba\xce\xfa\x27\xb2\x41\x55\x05\xb5\x15\x55\x09\xce\x9a\x31\xc3\xc8\x39\x77\xc6\x13\x57\x09\x42\x19\xd1\x1e\x72\x4c\x65\x11\x8a\x90\x70\x9e\x26\x61\x6c\x57\xdf\xda\x5c\xe8\x9e\xa7\xe7\x6b\x06\x73\xcb\x9e\xbe\xdd\x73\xdf\x7c\x9f\x35\x75\x20\x75\x0d\xfa\xd8\xf3\x23\xbb\xa2\x0e\x55\x5d\xdf\x10\x97\xe9\xf9\x89\x33\x96\x35\xa1\x1e\xe6\xc3\x08\x5e\x7d\x17\x6b\x97\xe6\x42\x37\xe7\xb8\x9f\x9e\x7b\x58\xcf\x9b\x7e\xbf\x8b\x23\x5d\x69\x3b\xf8\xbe\x37\x42\x61\xec\x73\x44\x75\x4b\xfa\x6d\x24\x19\xf3\xaa\x6d\xbc\xd3\x4f\x28\x2b\x61\xe3\x25\xa0\xa0\x5f\x39\xc5\x2e\x74\xef\x37\x8b\xff\xfc\xc3\xd8\x6d\xf9\xb3\xc5\x76\xde\x1c\xd2\xbb\xfb\xbb\xd7\xf5\xe5\x65\x51\xbf\x59\xa1\xec\xf1\x0f\xcb\x8c\xc0\xaa\x46\x30\xa3\xd3\x78\xda\x8a\xb9\x67\x46\x0b\x68\x34\x9a\x8d\xdb\xe0\x2f\x83\x14\xfd\x62\xef\x50\x76\x9e\x5a\xdd\x4d\x59\xc7\x09\x16\xca\xb1\x20\xc3\xa8\x78\x59\x43\x0a\x4a\x6b\x43\xaf\x3a\x61\xa5\x37\xce\x34\x36\xe6\x34\x78\x5f\x67\xcd\x95\x2b\xe3\x61\x15\xf1\xbd\x22\x83\x5f\x72\x90\xac\xc4\x06\xdb\x0f\xd9\x62\xce\xdd\xb9\x38\xa8\x7e\x47\x7e\x23\xb6\xfd\xcc\x85\xd6\xd4\x0a\xee\x8f\x78\xae\xa7\x63\x67\x61\x77\x49\xa8\xdb\x1c\xbf\xc0\x88\xc8\x35\x2d\xa8\x41\x6d\x43\x6f\x2d\x97\x92\x69\x46\xa0\x67\x60\x0c\x2d\x44\x8e\x20\x9a\x55\x51\xbb\xd5\x64\xec\x3a\x0f\xf4\x0f\xa2\xd6\x67\xac\x9d\xdc\xa6\xcc\x17\x9f\xf8\x72\xd4\xe9\xb0\x63\x21\x49\xf9\xaf\x93\x94\x84\x32\x35\x00\x87\x21\x4b\xea\x25\x5c\xf8\x22\x97\x40\xdb\xee\xb0\x0b\xd8\xb9\x58\xcb\x1b\x10\xee\x0c\x73\xd6\x58\xee\xcc\xaa\x19\x9e\x8e\xb1\x46\x93\x25\xdf\xad\x71\xf1\xf2\xb7\xd6\x81\x80\x97\x08\x88\x1f\x1d\xb8\x7f\x7b\xdf\xed\xfc\xaf\xe5\xc6\x19\x29\xda\x0e\x53\xdd\x48\x83\xc2\x21\x74\x55\x33\x97\x46\xca\xae\x27\x2f\x8f\x85\x69\x8f\xa6\x71\x87\x5d\x51\x1d\x45\x5e\x71\x4a\x9b\x9e\x09\x5c\x68\x0d\x92\xea\x24\x0b\xc4\xd8\x72\x84\xe3\x52\x9b\x30\xba\x6b\x6f\xb3\xd9\xbb\xb4\xbd\xf6\xc5\x93\xc7\x1b\xd0\xf3\xfe\xed\x2b\x14\xaa\x4a\x4d\x7d\xae\x53\x35\x1d\x01\x8c\x8d\x9a\xad\x70\xaa\x91\x0e\xdf\xe6\xf9\x5c\x7a\x1a\x8e\xec\x30\x50\x36\xf6\x32\xea\x38\x83\xac\xb8\xd0\xbd\xc8\xd6\x35\x1d\x1d\xd9\x37\x7d\xf5\xef\xdf\xdc\x67\x3d\xc8\x7d\x9a\xa8\x5a\x79\x58\x6b\x82\xf3\x50\x17\x01\x29\xe0\x61\x98\xd2\x76\x18\x66\x7f\x2e\xea\xc2\x80\x76\x3e\x8f\xba\x05\xcb\x2f\x4e\x01\xbd\xd0\xed\x10\x2d\xe4\xef\x5f\x75\x50\xaf\xc4\x1e\xdb\xaa\xae\x67\x5a\xdb\x51\xb5\x1a\x98\x79\x48\xf1\x74\xe2\x06\x77\xcb\x75\xa6\x24\xfa\xab\x3f\x4c\x60\x9c\xfc\x5a\xf1\x74\xe9\xfe\x17\x7f\x0a\x5e\xdb\xa0\xef\xaf\xee\xea\xe3\xdb\xcd\xba\xfd\xc0\xd1\xe5\x25\xe8\x2c\x9b\x52\x1a\x2d\x8f\x09\xe3\x31\x0c\x18\xc0\x5e\x51\xc2\x0c\xa8\x08\xd7\x9a\x84\x26\x6d\x6a\x50\x0c\xa2\xeb\xeb\x9d\x86\x94\xd8\x22\x1c\xb9\xad\xbb\x8e\x3b\xe2\x99\x64\x4c\x4f\xcc\x70\xd3\x03\xd4\xb4\xb5\xa9\x6d\x10\x4b\x5e\x6d\x2e\x38\xea\xba\xbe\x5f\x57\xc5\xcb\xcc\x3a\x82\x7b\xbe\x49\xad\x1f\xef\xcd\x3e\xff\x22\x60\xb5\xd1\xee\x14\xf3\x7b\x53\x55\x93\x0e\x48\x83\x56\x5d\x92\x58\xf2\x25\x5d\x98\x4c\xad\x40\xe1\x02\xcf\x88\xc7\x68\x3e\x1e\x61\x0d\xa9\x04\x65\xf0\x61\xd2\x27\x50\x84\xae\xb3\xee\xa4\xb9\xb5\x7d\x92\x26\xfe\x42\xf6\x2a\x3d\x25\x59\xe4\xa8\xb8\xd6\xda\x76\xfb\xef\x97\x18\x6b\x73\xe3\xbc\x7d\x5c\x82\x3e\xf6\x9b\xb6\xdb\x1d\xbe\x1c\xeb\x1a\xd4\xe0\xb4\x5c\x7c\x52\x7b\x4c\x66\x33\x5b\x02\x4a\x1f\xf2\xf4\xe4\xac\x3f\xa8\x82\x11\xcc\xda\x91\x33\xaa\x0a\xe7\xbb\x24\x4d\x74\xa6\x22\x9e\xef\x27\x2a\xef\x5f\xf7\x5c\x07\x7c\x9d\x16\x35\x68\x02\x07\xa7\xe9\x0c\x0e\x41\xa6\x38\x2d\xe6\xf3\xb6\x19\xc7\x71\xf4\x61\xf2\x7e\x55\x11\x8b\xf5\x91\xfe\x82\xf7\x38\x83\xc9\x1f\xac\x88\x94\xcd\xf6\xee\xf3\x9a\xd5\x7c\xff\xea\x26\xde\xdf\x3d\xdc\x65\x94\x85\x53\x38\x9e\x41\x81\xc3\x39\x38\x0e\xd8\xb6\x62\x4d\x9c\x56\x22\x79\x19\x60\x9d\x41\xcb\xaa\xc0\x11\xb7\x92\x8a\xd4\x96\xf3\x61\x28\x7d\x49\x24\x80\x73\x92\xad\xfd\x62\x60\x93\x7c\x73\xda\x90\x64\x1b\x33\x92\xd8\x69\x79\xb8\x03\xeb\x5c\xf7\xe6\x34\x63\x9f\x0e\xf3\x98\xa2\x0d\x79\x92\xf5\x06\x07\x7d\x3e\xfb\xd3\x29\x01\xa0\xb8\x68\xd0\x6e\xa7\x24\xbb\xae\xd6\xa2\xae\xb7\xd3\xaf\xcd\x55\xd7\x77\xc8\xba\x67\x4c\xf8\x87\x9f\x44\x83\xbf\xdb\x6d\x5f\x0c\xf7\xc1\x1f\x3e\xdd\x7d\x7c\xfb\x19\x0c\x35\x44\x80\xcf\x64\x40\xfc\x19\xc2\xd7\xcb\x63\x18\x50\x53\xe3\xc2\x97\x6a\x0a\x47\xe6\xa7\x9d\x81\x92\xcd\x30\x3d\xca\x20\xda\x80\x9a\x20\x8d\x62\x16\x95\xb0\x46\x47\x4c\x74\x9a\x8f\x24\x49\xd2\x8c\x46\x4c\x13\xbc\x22\x1c\x62\x0c\x7d\xff\xf6\xe1\xed\xb2\x00\x93\x37\xf7\x1f\xde\xc4\xbc\xf1\xcd\x3d\xf8\x78\xb7\xc6\xd2\xe9\x1a\x4b\x67\xa7\xac\x0e\x5d\x51\x02\x39\x39\x1d\x88\x06\xd2\x87\x0e\x39\x8f\xc9\x19\x16\x81\xa6\x49\x5d\x91\x2a\x77\x45\x05\x1b\x4b\x76\xd0\x87\x71\xf4\xf9\x7c\x0a\xd2\x02\x0e\x46\x07\x5a\xd8\xf7\x03\xc0\x4f\xe3\x7c\xa2\x74\xaa\xc2\x48\x31\x95\x4b\xee\x77\x8e\xf3\x91\x2a\xf9\x59\xf2\x57\x51\x8d\x6b\x8d\x2e\x63\x0d\x61\x7b\x7f\x9d\x1a\x5a\xd3\xbe\x7f\x03\xed\xa1\xbb\x97\xfc\xb6\x89\x83\xe9\xf9\x69\xe4\xd2\xf4\xa9\x01\x05\xff\x62\x85\x61\x82\x0a\xad\x8d\xe9\x14\x6d\x4d\xdf\xb7\x43\xac\x47\x0e\xb5\x6c\xba\x30\xac\xfa\x88\x0a\x71\xdb\x2a\x31\x1e\x9f\xac\xb5\x59\x89\xb8\x22\x95\xd6\xad\x6e\x23\xc5\x66\x9f\xe6\xb5\x76\xf3\xb1\xd5\xad\x6e\x9e\x34\x97\xc6\x70\xc1\x8d\x70\x38\xd9\xa4\xc7\x38\x33\xb6\x3c\xe3\xff\x20\xf9\xbb\xe4\xbf\x7e\x79\x2d\xb7\xd9\x89\x1b\x0f\xee\xb3\x90\xcb\x76\xff\xe1\x5b\x15\x97\xcf\x8f\xaf\xe8\xdc\xee\x3f\xac\x20\xa0\xfb\xbb\x7f\x04\xfe\x14\xec\xef\xff\x24\x1e\x7f\xbc\x7b\xc8\xce\x0e\x65\xe4\xc9\x50\xa9\x3b\x50\xd4\x88\x68\x46\x04\xae\x3c\x42\x3e\x1c\xaa\x8a\x56\x9c\x72\xa6\x41\x2e\xac\x10\x88\x41\x4e\xcb\xd2\x9e\xf1\xb9\x29\x7c\x4b\x7a\x5b\x94\x8a\xb1\x4e\x85\xa9\x67\x58\x63\x46\x01\x24\x03\x40\xa0\x22\xc1\x1d\x06\x2a\x95\x38\xba\x9d\x41\xde\x35\x5a\x9c\x42\xcb\x08\x97\x46\xca\x4a\x50\x8d\x2a\xc2\x30\x13\x12\x9f\x75\x5d\x19\x53\x1a\x48\x28\x51\x4c\x32\x47\x34\x96\x44\x95\x25\x85\x92\x4a\x27\x24\x95\x22\x9c\xe7\x91\x13\x2f\x94\x52\xde\x81\x61\xd9\x5f\xbf\x97\x95\x17\xba\x6f\xb6\xf4\x59\xe7\x78\xcd\x52\x57\xce\xf9\x1f\x69\x1d\xbf\xbb\x5f\x62\xf1\x2b\xef\xf2\xb5\x9c\xfe\xf6\xfe\xd3\xfe\x15\x2f\xe0\xad\xfd\xb3\x65\xbe\x28\xce\x67\xaa\x75\x48\x94\x15\x40\x11\xc0\x05\x27\x91\x93\x12\xc5\x16\x81\xc5\x50\x42\x04\x34\x28\xbc\x84\x95\x44\x20\x71\xf3\xe8\x5c\x8a\x96\x1d\x3d\x8f\x5b\x8a\x8a\xd2\x53\x53\x11\x82\x30\x96\x9e\x63\x82\xa7\x40\xd4\xb1\x44\x84\x10\xcc\x8e\x47\x08\x19\x46\x24\xf4\xf3\x09\xa1\xb4\x1c\x58\x98\x58\x92\x6c\x33\x12\xaf\xa9\x7a\x56\x14\xfd\xeb\xeb\x9c\xef\xb5\x59\xf1\x55\xfd\xfa\x56\x74\xba\x2e\x88\x4f\xdb\x0f\xf0\x7d\x5c\xde\x9f\xc1\x8b\x39\xd2\xed\xc7\x4f\x0f\x3b\xee\x20\x6c\x43\x6f\x40\x41\xc3\xd9\x03\xe3\xe7\xda\x03\x53\x9f\x79\xe7\xc3\xb9\x2f\xa1\xc2\x15\x0b\xa7\xe5\x62\x34\xad\x7b\x8e\x42\x72\x3a\x01\x7d\x9a\xeb\xf8\xe9\xb4\x61\x15\x23\x9a\x43\x87\xed\x61\x66\x8c\xa7\x1d\x48\x1c\x57\x58\x68\x82\x30\xe3\x43\x61\x99\xa9\x8a\x03\x9f\x4b\xad\x75\xa8\x95\x52\xc9\xcf\x32\x7e\xa1\xfb\x6e\x9b\xfc\x56\x3e\xe3\xaf\x53\xd4\x6f\x6f\xe7\xfb\x92\xcf\xf8\x15\xb5\xd3\x2b\x92\xf8\x36\x6b\xc3\x11\xe4\x4f\x0a\x14\xe1\x94\x16\x3a\x4c\xd6\x82\x5c\x1b\x33\x57\x19\x7a\x1a\xe5\xa6\x08\xcb\xe2\xc2\x25\xc5\x55\xa8\x0e\xda\x58\x55\xa7\x8d\x37\xc2\xf8\x6d\x62\x64\x50\xc0\x45\x52\xff\x53\xbd\xfc\x0b\xb5\xe1\xe6\x24\x59\x69\x0b\x32\x56\xb4\x91\x52\x19\x61\x94\x13\x49\xb2\xcb\xca\xa8\x5f\x7f\x78\x3e\xff\xf7\x71\xaa\xe3\xe3\x57\xec\xc5\x6d\x1a\x71\xfb\x53\x0c\xff\xdb\x0f\x9f\x33\xe7\x3d\xd0\xde\xfb\xfe\xcb\x38\x78\x80\x6e\x32\x49\xf1\x25\x0f\x8d\x6a\x87\x70\x16\x3e\x9c\xe8\xb4\xd1\x9c\x0b\xe1\x66\xe9\x5c\xea\x8d\x09\xda\x04\x65\x43\x2f\xb4\x5d\x4e\xd7\x0b\x4f\x63\x8d\x2b\x53\x4b\x8e\x17\xf1\x2b\x3f\xc4\x2a\x52\x02\xee\x23\xb1\xfa\xeb\x6e\xd7\x6f\x27\x56\xdf\x60\x00\x73\x17\x1b\x5c\xe5\xa9\xe1\xcd\x49\x9d\x28\xc8\xf9\x69\xd8\x40\x47\x15\x25\x25\x63\x70\xce\x25\x98\x42\xee\x0e\x87\xcd\x48\x39\xa7\x06\x61\x62\x18\x95\x58\x13\x1d\x1a\x3b\x5f\x39\xa0\x53\x6e\x82\xb0\x3e\xd6\x28\xb2\xe9\x42\xf7\x6a\xd3\x3e\xef\xc4\xea\x8a\x98\xfc\x6d\x63\x68\xe0\x25\x33\x80\xa8\x01\x57\x0a\x51\x28\x10\x9b\x07\x07\xe4\xe1\x99\xf4\x82\x79\x26\xac\x9a\x27\x4a\x0d\x66\x9b\x36\x98\xa7\x6e\x65\xa5\xf1\xa1\xc9\x8e\x61\xb2\x41\xb9\x74\x44\x8d\x62\x46\x30\x25\xa4\x4c\x40\x46\x2e\x64\xdf\x6c\x86\x98\x85\xbd\xc8\xc7\x7f\xbe\xbd\xa2\x6e\xdf\x7c\x4d\xc7\x37\xb5\x87\x55\xca\x83\xcb\xc1\x10\x38\x07\x82\x87\xde\xe8\xa8\xd0\xc2\x82\x04\x6d\x5e\x53\x69\xc6\xcd\x80\x18\x75\x5e\xbb\xd0\xd6\x75\x0d\x68\xe8\x1b\xdb\x00\xe1\xb4\xd7\x52\x1c\x16\x5f\x1f\xe7\x32\xfc\x66\xed\x39\x3c\x24\x09\xb8\x89\xd8\xc4\xb1\xbc\x37\xaf\x3d\xf2\x9f\xac\x1e\x79\x63\x8f\x76\xcc\x44\x33\x1f\x53\x28\xc4\x18\x8e\x48\x39\x56\x38\xa8\x4f\x83\xf2\xa7\x74\x28\x02\x09\x4c\x00\x01\x5a\xd0\x07\x06\xaa\x3a\x9c\xb4\xe1\x3d\x2c\x89\xc0\x5e\x30\x91\x8a\x13\x8d\xd8\x20\x7e\x21\xd7\x39\xb1\x3f\x7b\xe9\x2b\xb2\xaf\xdd\xa8\x97\x20\xfa\x1b\x5b\xd0\xa7\xfb\x0d\x75\x28\x1d\x9e\xce\x84\x9a\x9a\x02\xe7\xa3\xf2\x95\x96\x02\x62\xc8\xaa\xea\xe0\x07\x0f\x44\x50\x3b\x83\x8c\x53\x4c\xb4\xa1\xab\x6b\xd7\xcd\x9e\xf1\xc2\x16\x14\xb4\x4f\x63\x86\x66\x9b\xe5\xdd\x12\xbb\xcb\x0b\x8f\xd7\xff\x7e\xd5\xa2\x89\xa6\xe8\xfd\xbb\xed\xf2\xfa\xda\x3f\x8e\x22\x1f\xdb\x0f\xef\x3f\x6d\x3f\xbc\xdf\x8c\x67\xba\x58\x1c\xd1\x0d\xa0\x2b\x02\x4e\x61\x31\x8f\x48\x0c\x24\x77\xb9\x0e\xc7\x4e\x85\xb6\x04\x32\x8c\x25\xa0\x99\x42\x16\x6b\x4d\x90\xc7\x1e\xb7\xd8\xe1\x4b\x02\x4b\xd2\x56\x27\x45\x38\x80\x95\xab\xda\xca\x55\x49\x96\xe9\xf8\xdc\xd5\x35\x7b\xfd\x5d\xb8\xb3\x17\x60\xb3\xbc\xae\x19\xa5\x1a\x1a\x5c\x05\x06\xbd\x73\xa5\xaf\x3d\x68\x03\x3b\x51\xe8\x20\xdd\xa8\xd9\xfb\xa0\x57\x41\x17\xa0\xc2\x30\x71\x90\x1c\x56\xed\x8d\x23\xb1\x0d\x6a\x6c\xb2\x5e\x3f\xd9\xbb\x8d\x8b\x88\x9a\x15\xf1\x13\x6f\xf2\xdb\x1b\x82\xe9\xc4\xc3\x21\xd8\xf4\x7c\xae\x43\xdd\x6b\x0f\xda\x8d\xb3\xaa\x1c\xdd\x5c\xa5\x07\x1e\x9a\x30\x4a\x90\x83\x32\x25\x45\x02\xb2\x3a\xd6\x42\xaa\x88\x51\xb8\x7f\x66\xb5\xfb\x11\xb4\x37\xab\x41\xef\xd5\x3c\xa6\x67\xd3\x2c\x8f\x8e\x73\xa3\x4a\x61\x70\x20\x29\x56\x46\x5b\xdf\x38\xe8\x03\xa6\x14\x39\x54\x82\x58\xab\x48\x37\xf9\x85\xed\x49\x66\x6e\x18\x8e\x68\x52\x23\x86\x63\x9b\x80\x64\xd4\x87\x13\x05\x3d\x40\x32\x1c\x02\xcf\x4c\x3d\xd8\xa3\x0f\xac\x1e\xfd\xa1\x4e\xb6\x89\xbd\x88\xcd\xb4\xe3\xc9\x1f\x26\x9f\x13\x92\xfc\x7d\xf2\x7f\x24\x09\xf8\xfc\xd7\x6b\x1e\xfa\x0d\xb1\xcf\x92\x8b\xdf\xc4\xab\x7f\xe2\xbd\xf7\x1f\x6f\x24\x6d\xd7\x5f\xb0\xfe\xcc\x5f\x7e\xf3\x0b\xd6\xb7\xfe\xf2\xc7\xff\x3d\x38\x50\x84\xb4\x71\x14\x17\x12\x15\xaa\xb0\x35\x54\x52\x88\x52\x10\x85\x80\x27\xa8\x84\xca\x58\x46\x0b\x89\x4a\x5d\xf8\xf6\xf9\xcd\xea\xc9\xfb\xac\x7b\xa2\x99\xfe\x72\x06\x8c\xe0\xe5\x77\x98\x42\x56\xa5\xce\x6d\x5d\x69\xc1\x05\xbc\xfe\x0a\x8c\xb4\xb5\x3a\x97\xd5\xf2\xdb\x3d\x54\x82\x8b\x92\x61\x05\xb7\x22\x2f\x78\x75\x36\x79\x89\xa1\xb6\x95\xa8\x4a\x29\x3d\x2c\x95\x6c\xa0\xa3\x79\x81\xaa\xea\x64\x8b\x12\x57\xda\x55\xa2\x82\xcf\xef\x19\x3f\x97\x6e\x2e\x5d\xaa\xf3\x92\xa3\xa3\x83\x04\x6a\x07\x51\x55\x15\x52\xd4\x55\xa1\x44\x0d\x1d\x59\xde\x3a\x59\x08\xe1\xf2\x1e\x7f\xf1\x96\x5a\xf1\xa7\xf2\xa2\x37\xc9\x0e\x3f\xb3\x91\x3c\xc4\x99\x97\x8f\x77\x37\x76\x99\xcf\x8f\x77\xab\x5c\xe8\xfd\xdd\x12\xd0\x3e\xde\xdd\x67\x77\x1f\xef\xc0\x92\xce\xc8\x09\xb8\x4b\x32\x4d\x52\x94\xc1\x84\x0a\xd6\xf6\x3c\x5d\x12\xe0\xa6\x33\x05\x89\x54\xa1\x52\xe9\x31\xe3\xf3\xa9\x9b\xa7\xb1\x28\x9d\xa4\x6d\x51\x82\x22\xcd\xbb\xb4\x7c\x6a\xa6\x60\x72\xa0\xb3\xe1\xab\x24\xf3\x8a\x0f\x34\x17\xba\xe7\x59\x93\xfc\xfc\x2b\xca\x2d\xa2\x99\xd6\x25\xbf\x95\x3c\xc8\xf9\xb4\xa5\xa1\xa8\x67\x52\x9d\xf4\x39\xa5\x59\x63\x65\xd1\xf8\xc5\xe2\x85\xd3\x25\x51\x20\x01\x10\xb0\x3c\xf9\x59\x22\x2e\x62\x5f\x6f\xc8\x75\xb2\xf9\x53\xf2\x4f\x63\x0f\xee\x5f\xdd\x74\x75\xbe\xea\x0c\xc7\xb8\xe1\x95\x4a\xe8\x35\x22\xfa\x78\xf7\x79\xc9\x09\x6f\x1a\x7f\x8f\x91\xd5\x7b\x4d\x16\xdf\xbd\x50\x9c\x49\x4b\xa6\xa2\xde\x13\xa8\xd2\x01\xc0\xe3\xf1\x78\x3c\x03\xa5\xec\x6f\x90\x55\x0d\x90\x60\x0c\x88\x00\x11\xea\x02\x90\xd0\xb3\xba\x4e\x1b\xc0\xa6\x1e\x50\x93\xf9\x27\x79\x7b\x6d\x08\x47\x10\x72\xc6\x09\x38\x87\x82\x70\xc6\x99\x0c\xf9\x25\xf1\x1e\x24\xa0\x85\x01\x01\x8f\x28\x1a\x28\x0e\x5d\x40\x52\x82\xb1\x21\x07\x3c\xc4\x99\xd4\xf4\x90\x8d\x11\xab\xf2\xb5\xb6\xf6\x10\x01\xc4\xaf\xe5\xcb\x2c\x60\xb0\x72\x04\x02\xe6\xa0\x04\x89\xd4\xa6\x3e\x8b\xa3\xb3\x5e\x39\xc3\xe1\x7c\xd8\x8e\x04\x23\xc6\x6d\x63\x3b\x25\x84\x65\x86\x28\x4e\x39\x65\x11\x96\x97\xec\x12\x79\x21\xbb\x31\x83\xcf\x35\xc9\x15\x59\xf2\xb1\x88\x50\x33\x70\xe5\xb8\xdf\x5f\x9f\xd8\xf6\x45\xbe\x03\x68\xad\x6a\x65\xc4\xe6\x54\xd7\x4f\x2c\xcb\x9f\x26\x9a\xf9\x60\x7c\x30\xe9\x49\x33\x4b\x74\x28\x1c\xb5\xd6\x64\x30\xa0\xe0\x6a\xa3\x00\x07\xf6\x89\x65\x8d\xd5\x76\x3e\xa5\x25\x75\x35\xab\x3d\xc5\xa3\x67\x3e\x49\x93\xfa\x42\x76\x2a\x83\xd7\x79\xa7\x6b\xbc\xb4\x0e\x3c\xad\x8f\xe5\x3b\xa0\xeb\xac\xab\xeb\x27\x48\xac\x3d\xb8\x6c\x78\xa2\x19\xd4\xfa\x09\x02\x75\x74\xf2\x04\x68\x7d\x24\x6c\xc5\x8a\xb0\x0b\xdb\xd7\x99\x4b\x7e\x96\xdc\x27\xff\x5e\x64\x85\x7c\x66\x89\x78\xc6\x7c\x2c\xb6\xec\xc3\xdd\xc3\xdd\x55\x76\x67\xfb\x92\x4d\xee\xfd\xcb\x6f\xf6\xfa\x37\x49\xab\xfd\x31\xe5\x2e\x55\xb3\x03\x08\xf4\x34\xb0\xc9\x85\x63\x70\x14\x74\x00\xce\xcd\x06\xe9\xbc\x10\x8c\x33\x86\x88\xac\x9f\x06\x9d\x17\x0c\x33\x4c\x30\x17\x6d\xe6\x6c\x98\x82\x0f\x1d\x07\x39\x60\xc0\x85\x49\x08\x7b\x1c\x98\x13\x4d\x18\x01\x6c\x99\x51\xdd\xa9\x28\x51\x85\x89\x24\x18\x57\x92\x4b\x58\xc1\x0a\x49\x54\x51\xcc\xd5\x0d\x93\xbf\x11\x91\x73\xe0\x36\xbb\x75\xf3\xd7\xd7\x18\x1f\xdc\xdf\x6d\x57\x5f\x7a\xf7\xba\x11\xfd\xfd\xe3\xab\x00\x2a\x85\xab\xef\x6e\xdc\xcc\x1c\x70\xc1\x82\x3a\xb4\x18\x58\xc0\x88\xb6\xc0\x84\x7a\xf4\xc2\x79\xe7\x8f\x02\x14\x3e\xb8\xf4\xbc\x0e\xfc\xe7\x0c\x1b\xc4\x76\x8a\x59\x1b\x86\xae\x89\xa4\xed\x18\x39\x48\x0d\x2c\x42\xeb\x9c\xb5\xb5\x09\x08\xf4\x83\x36\x76\x00\x3d\x35\x4c\xf0\x8a\x72\xc2\xd9\xba\xc6\xcc\x85\x6c\xec\xce\x3e\xf7\xef\xff\x49\xf2\x77\xd7\x5a\xcd\x6f\x55\xba\x7e\xf3\x4d\x6e\x92\xfd\x94\x06\x56\x1c\xb4\xff\x74\xff\xc3\x07\x03\x3a\xd7\x94\x50\x21\xe8\x02\x01\xd2\x1e\xdd\xd1\x01\x15\xe8\xe1\x78\x04\xea\x38\xb7\xf1\xd3\xb1\x80\x25\xf0\xb3\x2f\xd2\x32\x37\xbe\xa2\x25\xaf\x28\xc9\x83\xa0\xbd\x3c\xc3\x70\x06\x63\x51\x6e\x27\x63\x10\x42\x94\x6a\x3e\x1b\xad\x94\x49\x2d\x0f\xa3\x10\x22\x1c\x96\x0f\x7d\x14\x3d\x38\x36\xa5\x2d\xa9\x39\x1b\xe7\x00\xb1\x55\xb5\x72\x61\xe9\x14\x47\x8d\xcb\x65\x07\x2d\xd9\xd8\xdf\xde\xfa\x56\x3f\xea\xaa\x5c\x9b\x11\xef\x5f\x60\x80\xd6\xfc\xf3\xd6\x85\x7b\x79\xfd\xdb\xc2\x21\x30\x29\x64\xec\x20\x3a\x6f\x06\xd1\x1b\x49\xab\x4a\xd4\x9c\x4b\x59\x85\xf1\x8b\x04\xde\xc5\x91\x7d\x1a\xce\x56\x71\xa9\x9c\x3d\xf2\xae\x9e\x80\x08\x72\x18\x47\x20\xba\x9d\x81\x8d\x0d\x47\xab\xb8\x11\x46\x2f\x06\x40\x1a\x8c\xd4\x81\x7b\x6d\xfb\x83\x52\x5a\x05\xcd\xa5\x92\xec\x04\xaa\x46\x6a\x6a\x81\x55\xc1\x78\xef\x57\x7e\xa5\x0b\xd9\x90\x9d\x4a\x8a\xeb\xb4\xf6\x5f\x25\x7f\x13\x3b\xa5\xab\x63\xbe\x0a\x74\x5c\xc9\xd9\x56\xc3\x70\x77\x95\x76\xf8\xfc\xf8\xee\x05\x97\xe1\x3a\x4a\xfe\xf9\xf1\xe1\x3e\xea\x34\x3a\x50\x3b\x60\x82\x71\xb6\x93\x83\x0f\x4d\x4f\x2a\x53\xe1\x74\xd0\x94\x49\xc6\xb1\x46\x7c\x76\x00\xc3\xd2\x23\x20\x85\xb5\x4a\xc8\xa6\x09\x27\x34\x7a\xe3\x05\x3d\x01\x87\x49\xaf\xe9\x16\x02\x16\x5a\x1b\xdc\xd4\x6b\x23\x07\xd0\x09\x4d\xb4\xc4\xd8\x52\x41\x83\x10\x92\x2a\x11\x14\x21\x85\xb2\xa3\x63\xd4\x71\xe1\xb8\x25\x92\x52\xa3\x25\x13\xc6\x47\x5f\x29\x2e\x7c\xb3\xd6\x0f\xaf\xda\x28\x3f\x42\xcc\x3f\xfc\x31\x78\x25\x55\xb5\xd2\x5a\x5f\x9f\xd6\x9b\x8f\x77\x0f\xfa\x54\x83\xa4\x3e\x9d\xea\x4b\x52\x9f\xce\xae\x4a\xa5\x6a\x23\xf2\x9c\xa2\x62\x9e\x20\x06\x43\x68\x7c\x85\x58\x67\xbb\x6e\x7b\x58\xb2\x49\xdf\xb6\x4a\x79\x24\x9f\x5c\xe8\x0a\x5f\x9c\xd3\x9a\xd1\xf9\x68\x53\x89\x2b\x7b\x9c\x6b\x50\xdc\xfc\x38\xde\x90\x9d\xb9\xfa\xba\xd8\x51\xbf\xe1\xec\xe2\x76\xf8\xee\xf5\x7e\x88\xb0\xa4\x25\x08\xfc\xe1\x5a\x3b\x4c\xcb\xd0\x81\xbc\x82\x2d\xac\x96\x08\x19\x96\x80\xce\x5d\x0e\xa6\x5c\x69\x24\x4a\x85\xab\x2a\x0f\x0e\x1e\x95\x51\xf9\x25\x01\xe7\x12\xc0\x90\xa4\x49\x56\xa4\xad\x10\x88\x91\x99\x51\x6e\x29\x09\x4d\x5b\xd8\x82\xb5\xe1\xe4\x1c\x3d\x4e\x96\x47\xd8\x6f\x5c\x1e\x6b\x3f\x6e\x53\xed\xaa\xaf\x3c\xe5\x6f\xee\xdf\xae\x50\xd1\x5f\xad\x43\xf4\xb1\x61\xf8\xf0\xaa\xe7\x7f\xf7\xfe\xd3\xfd\x98\x3a\x0a\x0a\x53\xa1\x52\xd5\x61\x0c\x75\xe9\x5d\x9a\xa3\x32\x94\xdd\x33\x2a\xc1\x04\xb3\xab\x0c\x6a\xdd\xd3\x21\x77\x45\x18\x41\x89\xa0\x2f\x32\xe3\x84\x9a\x8f\xfd\x7c\x1e\xe6\x03\x6a\x22\x1f\xc7\x85\x6c\xf0\x4e\x25\x3f\x8f\x0c\x8c\xb1\xd0\xf5\x6a\xd3\x65\xf7\x71\x29\xde\xc7\xe5\xf8\x0d\x93\xd2\xbf\x0f\x96\x3c\xe3\x6a\x4d\x1e\xe3\x4c\xda\xfd\xf1\xd8\x79\xcf\xcf\x4e\x73\xdf\x8e\x67\xd2\x76\xae\xc1\xc0\x08\x4b\x16\x9b\xc2\x40\xa7\x6c\x5f\x97\xed\xc0\x05\x63\x25\x61\x2c\x28\x08\x5a\xc9\x43\x27\x14\xc3\x98\x77\x25\x0a\xe3\x8e\x33\xce\xa5\xae\x19\x37\x4a\x6a\x6e\xb1\xa0\x24\xe4\x23\xb5\x4e\x7b\x25\x20\x74\x55\x15\x26\x4a\x0b\x57\x94\x07\x52\x2f\x8b\xd2\x2a\x83\xa8\x85\x3c\xd9\x66\x45\x02\xf7\x7e\x27\x92\xdf\x8f\xbd\xe2\x6b\x2d\xe4\xab\x3a\x4a\xa4\x91\xfc\x56\xe3\xff\xd3\xfd\xa7\x87\xe5\xd9\xbf\xbf\x7f\xfb\xf0\x36\x76\xb8\x3e\x3f\x7e\x7a\x58\xf7\x65\xe6\x33\xfb\xa4\xd2\x69\x86\xe9\x71\x2e\x40\x97\x56\x75\xdf\x13\xc5\x79\x29\x05\x7c\x1a\x32\x3c\x59\x50\x86\xd3\xcc\xc1\xa9\xf1\xe5\xe1\x92\x60\x25\xbb\x93\x16\x42\xea\x9d\x98\x8f\x96\x69\x16\x60\xd0\xc2\xb5\x92\x95\x1e\x12\xef\x84\xf6\xda\x68\xa8\x28\xb2\x45\xe9\xe6\x33\xe5\x5a\xb2\xc8\xf1\xc8\x23\x76\xdb\xc4\xce\xfd\x7f\x95\xfc\x37\xc9\x7f\x9f\xfc\x9f\xc9\xff\x9d\xfc\x3f\x57\x6b\xb8\x7f\xd5\x8d\xfb\xe1\xc3\xee\xe1\xb5\xa6\xf4\x66\xfb\x01\x82\xbf\x5c\x7b\xe1\x1f\x6e\x68\xa9\xc7\xfb\x0f\xef\x97\xe7\xb3\x72\x24\xc6\x28\xf6\x2b\x46\xe3\x57\x8f\x9f\x1e\x1e\xaf\x42\x57\xef\x6f\x3f\xf0\x5b\xde\xcf\x0e\xba\x4c\x85\x02\x7c\x6e\x79\x55\x1b\x2e\x84\xb7\xb4\xf1\x65\x59\x08\x81\x38\x14\xb4\x84\x8b\xaf\xae\x00\x01\xb8\x18\x42\x87\x01\x6f\xca\xf6\x40\x8f\x2e\x88\x74\x84\x73\x5f\xa5\x35\x9c\xa7\xa2\x04\xf8\x68\x8e\x47\x8c\x4b\x81\x2b\x91\x17\x63\x38\x43\xa5\x8e\x96\xf3\x83\xf8\x32\x1e\xcc\xf1\xa8\x96\x77\x64\x5e\x9c\xc3\x50\x7a\x77\x30\xcb\x3b\x3b\x53\x22\x79\x92\x94\x55\x4c\x56\xb0\xa1\x46\x8f\x39\x21\xc6\xe4\xa6\x20\x04\x0f\x48\x83\x24\x2f\x3d\xe7\xd2\x94\x12\x0b\xcc\x24\xe1\x05\x81\xf0\x89\x68\x1d\x1a\xb7\xa4\x0c\x52\x57\x10\xa2\xc2\xe4\xb5\xb4\xd6\x4a\xa5\x42\x63\xe3\x61\x54\x2d\x87\x0b\xbf\x1c\x4e\x7e\x96\x92\x38\x1f\xbf\x72\x62\xff\xf3\x84\x24\xff\x32\xa1\xc9\xff\x96\xfc\xef\xc9\xff\xf5\x13\xfc\xd8\x2f\x25\x97\xbf\xbb\x56\xc1\xbf\x12\xa4\xad\x92\xfa\x7f\x0d\xe2\xfe\x7d\x78\x29\xc8\xb8\x96\xaf\xbe\x05\x47\x7d\x7e\xbc\x42\x0e\x6f\xd9\xde\x4b\xc7\x90\xd5\x76\x49\x16\x6a\x08\x6d\x85\x4b\x49\x45\x93\x2a\x03\x81\xec\x50\x65\x31\xc5\x98\x28\x37\xfb\xac\x9b\x0f\x45\x99\x25\xa1\xb3\x07\x12\x4e\x6d\xf0\xdd\x89\x59\x0f\x27\x20\xca\x72\x72\xa9\x9f\xe5\xf3\x4b\x28\x6a\x4a\x38\x50\x89\xaa\x12\x63\xd8\x76\xd0\x1a\x57\x7a\xa1\xb0\x50\x46\x99\x69\x6c\x2b\xdc\xd6\xb8\x69\x02\xa4\xa6\x26\x76\x67\x20\x84\x0a\x56\x94\x52\x89\xa4\xf4\x15\x91\xb0\x62\x8c\xe6\x1c\x73\x7b\x9a\x0f\xb0\xd4\x8e\x69\x7d\x3c\x68\x45\x6c\xa9\x61\x09\x0c\x3b\xd2\x03\x9d\x8f\xda\x61\x8c\x2a\xbb\x2a\xfb\x09\x58\x48\x4c\x0b\x41\x35\xa4\x34\x17\x95\xb2\xb0\x42\x97\xa4\x42\x86\x56\x52\x08\xac\xab\x64\x93\xe2\x0b\xdd\x96\x3b\xfd\xac\x6c\x7a\xd5\x5d\xbf\x79\x96\xb8\x4c\x3f\x5e\x0b\x4e\x2f\x84\x0e\x63\xc1\xe9\xd3\x95\xd6\xeb\xab\x8c\xdb\x12\x0a\xa4\x5c\xd9\xc6\x58\x6b\xa7\x69\xba\x24\x39\x40\x61\x68\x9d\x70\x35\x6b\x78\xcd\x8e\x20\x2f\x4e\xa7\xf3\xd9\x2b\x50\x37\x42\x29\x90\xa8\x6d\x94\x23\x35\x27\x11\x8c\xd4\x18\x6b\x6d\x95\x57\x8d\x36\xda\x2d\xdf\x49\x60\xc4\x49\x29\x15\xa0\x73\xee\xca\xf3\x9e\xec\x74\x92\x27\x7f\xb8\x6a\xb0\x5e\xdb\xf9\xd7\xc0\x38\xb6\x00\xd6\x9c\xe3\x7e\x1d\x6e\x7e\xf8\x86\x9a\xec\x61\xf7\x92\x80\xee\x0a\x2d\xbd\x7f\x7c\x48\x29\x28\xb0\xc6\x08\x24\x33\x05\xb5\x80\x18\x55\x8c\x12\x44\x24\xc2\x04\xa3\x2a\x34\x06\x70\x7d\x2a\x72\x80\x39\xa3\x0c\x2a\x82\x46\x84\x08\x29\x0a\x41\x4a\x51\x28\x5d\x55\x50\x1a\x90\x14\xc7\xed\xc8\x19\x15\xb6\xc2\x8c\x11\xca\x0d\xab\xb8\x61\x64\x89\xb2\x03\x03\xed\x7c\xc4\x78\x6e\xf8\x5a\x71\xea\x5b\x91\x57\x08\x42\xe5\x20\xc5\xa5\x56\xed\x2c\xb3\x42\xad\xd8\x3f\x7c\xe5\x38\x7c\x9f\xfc\x55\xf2\x77\xc9\xdf\xbf\x50\x9d\x5e\x6e\xfb\x8d\x91\xfa\xc3\xdd\xb7\x0a\xd3\x5f\x81\x9d\x2f\x78\xab\xb7\xdf\x90\xae\x83\x95\x73\xee\xd9\x52\x6f\x11\x86\x60\xfa\x72\xe0\xcc\x78\x6b\x15\x45\x84\x59\xcc\xb0\xb7\x2e\x2d\xca\x2a\x4d\x0c\xd5\xdc\x51\xdd\x99\xde\x50\xcb\x55\x18\x6c\xa4\x70\x44\x61\x8c\x81\xcd\x7c\x00\xd0\xda\x28\xe3\x74\x06\x45\x38\xae\xd2\xd1\x85\xf0\x5a\x4a\x4d\x89\xd0\xe1\x70\x52\x92\xa0\x90\x04\xc5\x80\x07\x87\x74\xa0\x78\xae\x43\x0f\x90\x37\xc2\x34\x5a\x08\x6d\x8d\xb2\x23\x37\x42\x4b\xdd\xa5\x67\xf6\xd4\xf7\x5a\x68\xb1\xf2\xf1\x8a\x0b\xdd\xab\x38\xcb\x79\xcb\xa6\xff\xc3\xe4\xbf\x8c\x7d\xa4\x6b\x17\xf5\xd3\xc7\xbb\xdf\x8e\x36\xbc\x5b\x61\x4a\x6f\xef\xdf\xae\x80\xc3\xb7\xdb\x6f\xe7\x73\xc0\x4d\x9f\xf9\x86\xa9\x7b\x1b\x9b\x2a\xe9\xc1\x03\xee\x01\xf6\x5f\x1a\x6f\x8a\x1c\x14\x45\x6e\xca\x12\x8c\x51\x23\x28\x72\x4f\x81\xf1\x4b\x07\x91\xe8\xc0\x29\xd4\x91\x83\x53\x84\x3a\x1b\x05\x47\x18\xf2\x0a\x3d\x19\x07\x30\x65\x35\x57\x08\x01\x86\x31\xab\x0d\xaf\xd0\x7c\x8e\x5c\x5d\x3b\x66\xdb\xd6\x86\xa9\x84\xb0\x84\x65\x55\x61\xcd\x14\xd5\x4c\x01\x8d\xa0\xac\x0b\xd6\x51\x3a\x30\xd6\x86\x82\xf1\x48\x85\xc7\xe7\x53\xea\x82\xab\x04\x13\x14\x55\xb0\x94\x4c\x08\x08\x0f\x9c\x27\xbf\x7f\xe5\x63\x58\x75\x5f\x7f\x99\xfc\x79\x82\x93\xbf\xb9\x72\x33\x8a\xe4\x7f\xfc\x8a\xdc\x89\x97\xf7\xc7\x2f\x51\x0d\xcb\x3d\x7b\xcd\x95\x79\x77\x7f\xf7\x19\x5c\x3b\x8b\x1f\x5e\x7c\x51\xbc\xfb\xc5\xc7\x5f\x45\x62\xdc\xf4\xa5\xc4\xd0\xf6\xa5\xdc\x10\x71\xcb\x15\x8f\x25\xd4\x04\x1b\xc7\x0d\xb3\x97\x44\xeb\x65\xeb\xf3\x66\x8c\x2a\xd0\x70\x65\x5e\x4f\x93\x2f\xfd\x74\x49\xbc\x11\xa5\xed\x29\x18\xbd\x93\xa5\x1b\x29\xe8\x2c\x2c\x0a\x58\x28\x68\x84\x9c\x1b\x82\x54\x45\xd2\x8a\x56\xaa\x22\xa1\x26\x95\x82\x24\xad\xe2\xa7\xed\x29\x74\xc3\x08\x58\x05\x19\xe1\x9e\x71\x26\x38\xc6\x9a\x70\xa2\x05\x2e\xa9\x5c\x72\x41\x15\x4a\x30\xc0\x79\x9c\xc7\xc5\xdc\x61\x92\xfa\x79\x40\x48\x53\x42\x52\x1f\xa6\x4e\x76\x30\x44\x79\x06\xc2\x08\x23\x24\x7e\x6c\x28\x23\x8c\x92\xf8\x31\xb9\x6a\x58\xd2\xc8\xe1\xf8\xf3\xe4\x17\xcf\x71\xe3\xc7\xe4\x5f\x25\xff\x4b\xcc\xd4\x63\xbd\xef\xba\xf1\xe2\x8d\x5d\xf3\xc2\x3f\x7a\xd5\xfe\xb9\x41\xfc\x96\x0d\xf8\xf8\x93\x44\xb5\x6f\x96\x1d\x7b\xc5\xd4\xad\xeb\x2f\xfe\xa7\x1f\x9e\x15\x57\xdf\xed\x7f\xd8\x9b\x60\x01\x7d\x2a\x4e\x7a\x04\x67\x64\x70\x95\xf7\x6e\x88\x1a\xc2\xae\x9b\xa5\x91\xb0\xf5\xc4\x80\x04\x3b\xaf\x79\xdb\x55\x5c\x55\x85\x2e\x58\xdf\x71\xee\xda\x70\x14\xa0\x6c\x82\x05\x25\x21\x5c\xb0\x4a\x39\x85\x05\xd1\x84\x82\x24\xd4\xfe\x44\x8f\xdb\xb3\x95\x61\x60\xf3\x21\xe4\x02\xb4\x69\x91\x6a\xc2\x29\x3b\x4b\x29\xe5\x92\x52\x0a\x11\xa4\x81\x50\x22\x48\x80\x20\xb2\xe1\x10\x0b\x56\x96\xb0\x28\x25\xb4\x14\x93\xf9\x18\x46\x80\x5b\xa5\xb9\xb1\x04\x71\xc2\xd1\x38\x22\xca\x28\x43\xd6\x60\xc7\x92\x64\x17\x63\xad\x76\x67\x93\xff\x5f\x54\xd2\xfc\xcf\x93\xbf\x4f\xfe\xdb\x6f\x56\xe5\xbb\xed\x4b\xaf\x73\xd5\x20\x8a\x02\xf9\x5f\x09\xce\x1e\x56\x46\xcc\x37\xef\x22\xbd\xd9\xa7\x67\x8c\x7a\x74\x43\xdb\xeb\x8d\xcf\x22\x4c\x37\xbb\xff\x74\xbf\x6f\xdc\x97\xc9\xa6\xa4\x28\x3d\x2c\xe7\xe1\xe0\xce\x36\x56\xc9\x6c\x18\xd5\xa0\x74\x68\x57\x9d\x43\x90\x54\x87\x59\x0b\x36\x92\xb3\xb0\x88\xb8\x60\x99\xe4\x27\x17\x46\xa0\xc6\xf1\x90\xf2\xf3\xf9\x6c\xc0\x84\x50\x18\x2a\x91\x92\xb9\xdf\x4e\xe1\xd0\x76\x00\xe1\x0a\x11\x76\xa4\x74\xc9\xc1\x15\xd3\x52\x18\x76\x10\x5a\x15\xb6\x51\xcc\x30\x90\x20\xcd\x4a\x80\x47\x8c\xb4\xb4\x9a\x29\xce\x39\xef\x59\x18\x11\xc6\xe1\xa8\x93\x6d\x2a\x2f\xe4\xba\x67\xff\xb3\xe4\xbf\x48\xfe\x3e\xf9\x9f\x56\x75\xc9\x38\xfa\xfc\xdb\xee\xc8\xc3\xd5\x38\xbd\xd2\xaa\xba\xa2\xbf\xa3\x54\xd5\xf7\x8f\x0f\xbf\xe3\xbe\x2c\xa6\x31\x82\x98\x99\x7b\x72\x0e\x4c\x45\xe9\xab\x62\x3e\xf6\xee\xec\xfa\xbe\xeb\x00\x9b\xf4\x28\x38\x09\x35\x66\x1c\x2b\x22\x94\x27\xc1\xb4\x4c\x38\x5d\x0d\x0d\x8d\xcc\x85\x7e\xa2\x54\x9c\x4c\x38\x01\xda\x75\x7d\x4a\xce\xe7\xf3\x00\xf2\x02\xda\x0a\x82\xd2\xf0\x30\xb2\xed\xe9\xa4\xd4\x09\x23\x44\xd9\x99\x31\xc6\xb4\xd4\xc2\x48\xa9\x11\x12\x92\xd3\x38\x85\x88\xbc\x06\x5e\xb0\xae\x42\x9a\x21\xda\xa2\x4a\xeb\x1a\xa3\x4a\x2b\xb3\x98\x7f\x29\xe5\x41\x04\x81\x51\x45\x18\x97\x32\x49\x7e\x0f\x9c\xae\xf7\x6a\xed\xbc\xfe\x79\xf2\x29\xd6\x51\xff\x75\x22\x93\xff\xf5\xe6\x17\xa3\x0d\x8b\xb7\xee\xa6\x47\x0f\x56\x8e\xba\x17\xe9\xd5\x9a\x36\xbd\xf9\xfc\xf8\xb0\xdb\x67\xaf\x04\x27\xae\x93\x19\xd7\x70\x66\xbb\x8e\xaf\xde\xdf\x7d\xf7\x92\x01\xff\x87\x37\x0f\xbb\xb7\xbf\x78\xb7\x4d\xaa\x32\xe5\x5f\xda\xec\xf8\xc5\xe9\x94\x97\x65\xe0\x1b\xf1\xa5\x76\x19\x79\xea\x01\x52\xd0\x73\xc5\x20\x66\x0e\x4a\x4a\x25\x86\x4c\x97\xb4\x2a\x29\x84\x0d\x46\x88\x95\x1c\x42\x5f\x72\xa5\x95\x73\xce\x65\xb4\x34\x9c\x21\xc0\xcb\xb2\xc8\x65\x4e\x28\x65\x18\x8b\x1c\xa3\x9d\x21\xcc\x0a\x7d\xb0\xb8\x9a\xcf\xa1\xd3\x22\x4c\xb9\x53\x64\xa0\x0a\x56\x9e\x0b\xaa\x11\xd2\x4a\xb1\x20\xa5\x92\x0c\x34\x33\x22\xb4\xd0\x05\xf4\xbd\xe5\x0e\x50\x40\x4e\x3a\x34\x5a\x87\xb3\x13\x12\xe4\xc0\xce\x18\x62\x53\xb6\x02\x55\x47\x0c\xa4\x64\x55\x95\xfc\x2c\x72\xdc\xeb\x1d\x7f\x9e\x9b\x5e\x3b\xc2\x51\x1b\xe0\x85\xa8\xe0\x73\x9b\xf5\xa5\x3e\xef\x4a\xf0\xf4\x32\x3b\xda\xbf\x5d\x97\x60\x0c\x3c\x96\x9b\xbf\xd7\xf6\x49\x78\x9f\xd5\x4f\x82\x65\xc9\x9c\x18\xce\x47\xa1\xf8\xcc\x33\xfe\xd4\x90\xf4\x18\xfa\xb2\x6c\x48\xa5\x09\xe5\x8c\xf7\xa7\x1c\x76\xa5\x33\x48\xf3\xce\x9e\x2d\x18\x03\xda\xf1\xe9\x4c\xd9\xbe\xfc\x75\xbf\xed\x58\x68\x64\x14\x58\x0c\xbd\xa4\x61\x2c\x0b\x89\x30\x25\x15\xa1\x72\xb0\x79\xd9\x2c\xfe\x90\xb4\xcb\x7a\x95\x22\xd9\xa5\x3a\xda\x6c\x93\xbc\x49\xfe\x36\xa1\xcf\xba\x79\xdf\x2a\xd5\x3c\xdc\x12\x83\xb7\x57\x43\x12\x77\xc7\x55\xd0\xf7\xe1\x36\x8f\x74\xff\xf6\xbb\x25\x28\xc8\x1e\xdf\xdd\xbf\xdd\x45\xca\x0b\xf0\x3b\xa5\x89\x3d\xa8\xe2\x98\x2e\x09\x7d\x1c\xe0\x3d\x6c\xa0\xb0\xac\xd1\xf3\x64\x3b\x2e\x39\x46\x1c\x63\xaa\x19\x46\xb0\xe8\xb9\x16\x2d\xb7\x79\x01\x4a\x41\x80\xab\x91\x2d\x40\xcd\xc2\xb1\xa2\xa4\x7a\x32\xd9\x31\x2c\x76\x85\x42\x21\xaa\xa0\x84\x55\xa3\xec\xb3\xa2\xd1\xda\xb4\xbb\x72\xd9\x21\x4e\x4a\x21\x66\xcf\x89\xe5\x96\x51\xab\x34\x26\x18\x0a\x84\x29\x17\x55\x45\xb0\xe1\xd2\xf6\x10\x96\xaa\x3c\xb0\x01\x24\x10\x9b\xda\x0b\x2e\xf8\xdc\xbb\xe0\x25\x87\xae\x24\x80\x55\xb4\x37\x5a\x3b\x63\xb5\x8f\x3a\x63\x9b\xa8\xcf\x62\x76\x36\xf2\x3a\x7d\x4e\xfe\xd9\x0b\x7d\xb1\x87\xdd\xfe\xe3\xb7\x51\xd3\xc7\x1f\x3e\x3c\x6c\x3f\x7e\x7e\xbc\xff\x45\xf6\x6c\xa6\x56\x51\xe7\x37\x1f\x3f\x3d\x6c\x0a\xc0\x4a\x68\x49\x05\xa4\x2b\xab\x81\x71\xc2\xa0\xc2\xe5\x7c\xf4\x23\x44\x1e\x18\x87\xf2\x70\xae\x4c\x6d\xeb\xda\x07\xea\x6b\xd3\xf7\xdb\x53\x55\x31\xca\x9d\xe4\x4f\x9c\xb3\xc2\x16\x24\x4b\x9e\xc4\xa6\x92\xbc\xb7\x98\x07\x23\x84\x91\xc1\x02\x2d\x83\xf3\x49\x92\xfc\x5e\xaa\x2e\x38\xf2\x72\xdc\x3a\x2c\xeb\x9c\xd3\x7f\x9c\xfc\x0f\xc9\xff\xbc\xc4\x86\xb1\x42\xf9\x10\xed\xe0\x7a\x82\x6b\x46\xb3\xce\x7b\xbc\x92\x86\x7a\x8c\xa7\xfc\xf1\x5a\xc7\xfd\xf8\x92\x75\x7d\x05\x24\x5d\xd3\xd1\xaf\x6c\x00\x9f\xdf\xfc\x90\xed\x3f\xfc\xfc\xcd\xe7\x37\x0f\x7f\xf2\xee\xe7\xa9\x39\xa0\x09\x94\x13\xc6\x93\x3d\x53\x7a\x06\x55\x18\x2a\x80\x98\xf4\x8c\x2a\x3b\x62\x2f\x85\x52\xae\x53\x6a\x8a\xf3\x8d\x93\x0a\x3a\x8a\xa5\x85\x23\xac\x28\xe1\x18\x18\x0f\x2b\xc0\x08\x54\xdc\x58\x41\xb8\x95\xb5\xa0\x08\x09\x3b\xe0\xb2\xc9\x73\x08\x7a\x09\xb8\x3c\xea\x23\xe7\x47\x7d\x94\xcb\x86\xf0\x52\x68\x4c\x04\x31\x15\xc1\xa8\xdd\xe4\x52\xca\xd0\x49\x29\xe7\x61\xd9\x29\x90\x20\x58\x71\xb1\x25\xd0\x3b\x17\x92\xd0\x1d\x3a\xe3\x9b\xce\x5a\x0f\x92\x33\x90\x5c\x82\x72\x36\x67\x40\x71\x98\xa2\x9e\x6b\xbf\x69\x9f\xb9\x82\x93\x9b\xc6\xc3\x0d\x0d\xf2\x55\x4b\xf6\xee\x21\x75\xbd\x1b\xc7\x36\x14\x6d\x0f\x8e\xa6\xb7\xb6\xef\xb7\x7a\x9a\x5c\x38\x2d\x17\x34\x77\x33\x31\x75\x7a\x0c\x14\xe0\x24\x8f\x1c\xff\x6e\x67\x93\xff\x7f\xf2\x47\xc9\x3f\x49\xfe\x59\xf2\x77\xc9\x7f\x1a\xbd\xdd\xb5\xe2\xfc\xa2\x8f\xf1\xea\xdb\xed\x0b\x2e\xf7\x68\xd1\x5f\x2e\xbd\x67\x59\x99\xaf\x6b\x71\xb5\xfe\xe0\xe3\xdd\x43\x66\x2d\x04\xe4\x84\x90\x60\x1c\x53\xe5\xd2\x7a\xf9\xfe\x48\x89\x90\x0a\x53\xe5\x83\xe2\xf8\xc8\x91\x23\x10\xf0\x2f\x05\x20\xb0\xca\xa0\xa7\x92\x51\xc8\x18\x9a\xfb\x4b\xe2\x53\xc4\x79\x45\x20\x41\xe8\x92\x2c\x61\x3a\x48\x40\xee\xfd\xce\x56\xc2\x42\xa4\x39\x51\x8c\x77\xe7\x4a\x58\x84\xb5\xa4\x92\xf3\xee\xc4\xb8\x64\x8c\x17\xce\xa1\x2a\x0c\x4f\x2b\xbb\xbb\x40\x61\xcc\xfa\x39\x17\x22\xb7\xb9\x48\xa9\xb1\x1a\x8c\x73\xbd\xc4\x42\x4d\x8c\x85\x74\xf2\xf3\xe4\xfb\xeb\x9a\xfd\x4f\xbe\xa9\x76\xac\xc4\xd1\x57\xdd\xc2\xc7\x17\xba\x85\xf7\xdf\xcc\x53\x3e\x6b\xfd\x3e\x7c\x73\x4b\x32\x67\x8b\x12\xf0\x23\xa9\x2c\x66\x39\x2a\x50\xa5\xeb\xf4\x54\x21\x48\x75\xcd\x96\xb7\xe4\x01\x55\x16\x3d\xe9\xb4\x0c\x5a\x4b\xa2\x25\x75\x45\xd9\x35\x24\x0a\x01\x67\xf2\x6c\xd3\x9c\x5e\x99\x04\x77\xba\xc2\xd8\x30\x46\x8c\x90\x90\x56\xa2\xaf\x38\x66\xa2\x3d\xc5\xa3\x9c\x98\x66\x46\xc1\x21\xe4\x70\x7f\xc2\x8c\x72\xcc\x32\x5d\x07\xd2\x80\xf2\x8b\xd9\xe6\x4f\x6a\xc5\x19\x5c\x63\xc0\x7a\xa7\x93\x7f\x9c\xfc\x45\x42\xa2\x7a\xe1\x7f\xf7\x95\x39\xf9\x8a\xfe\x8b\x06\xe4\x9b\x4a\xc3\x3a\xe7\x7e\xf7\xf1\x2a\x50\x91\xdd\x04\x2a\xd6\x24\xf7\x7e\xd5\xa8\x58\xdc\xfd\xdb\xec\xe7\x2f\xb9\x68\x8b\x0f\x6f\x96\xdb\x92\xaa\xae\xc2\x86\x22\x41\x2a\x0b\x51\x7f\x1c\xc3\x90\x03\x16\x26\xa3\xa5\xb6\xf4\x2c\x0e\x38\x1c\x00\xcd\xc3\x61\x0a\x13\xe8\x49\x7e\x04\x07\x82\x31\x2b\x25\x25\xa5\x04\x1e\xc2\x75\x7c\x61\xe3\x6b\x2f\x64\x45\x4a\x86\xca\xb2\x6e\x46\xb7\xad\x69\xe4\x53\x52\x98\x53\x2b\xe7\x82\x60\x2b\xb5\xf2\xb2\x93\x86\x7b\x8b\x49\xba\xc4\xcf\xac\x0c\x4c\x20\xa4\x6a\x26\x90\x60\x50\x85\x82\x65\xde\x85\x3c\x4c\x61\xf2\x75\xe9\x20\xe7\x20\x99\xd2\xf2\xd7\xcd\xee\x98\x24\x9b\x4c\x5c\xa6\xdd\x98\x0d\xc9\xbb\xe4\x1f\xc6\xf9\x9b\xe4\x77\xca\x2c\xdd\x02\x9d\x0d\x33\xf9\xe2\x3c\xa4\xea\xf1\xa1\xae\xcf\xa8\xb7\x14\x21\x2c\xbc\xa5\x8c\xe3\x80\x53\x39\x7b\xbb\xe4\xe9\xd9\x00\x21\x54\x8a\x55\x95\xae\x18\x43\x1a\x62\x4c\x70\x25\x65\xc5\x2a\x4c\x82\x0a\x4e\xaf\xfc\x03\x69\x72\xe1\x9b\x55\x03\xeb\x53\xcc\xb1\xaf\x59\xcb\xcb\x19\xb2\x98\x6d\xaf\x14\x63\x0f\x5f\x4f\xef\xcd\xc3\xa7\xfb\xd5\x7d\xa6\xc6\x7b\x4b\xea\x9e\xeb\x2a\xb7\x25\x82\x43\xcd\x98\x59\x16\x65\x97\x1f\x4e\xb9\xe4\x82\x50\x7c\x94\x67\x74\x06\x51\x5e\x50\xaa\x9d\xee\x10\xd3\x1c\x73\x82\x14\xec\xab\x8a\x8a\xae\x22\xc8\x6a\xe1\x30\x57\x4b\x7c\x1e\x6d\x97\x3b\x70\xc6\x9a\x24\x01\x71\x46\x45\xa5\xed\xca\xcb\x7b\xcb\x62\xbf\xc1\xd9\x5d\x93\xda\xed\x07\xb8\xe5\xd4\xb5\x69\x39\x9f\xb2\xe2\xe9\xcc\x8d\x12\xa5\xd2\xf8\xe9\x94\x95\x73\x9b\xb2\xd0\x56\xc0\xa6\xad\x2e\x0b\xa1\xb9\x91\x2b\xb9\x3f\x33\x5c\xb3\x62\xb9\x21\xbf\x97\x34\x59\x12\xb5\xa2\x7e\xf6\xac\xbd\x7e\xd3\xa8\x7f\x7c\x89\x4f\xfa\xf0\x82\xe1\xfd\xdd\xdb\x8f\x9f\xd6\x49\xe7\x8f\x37\xca\xb1\x6f\x22\xa9\x4d\x6f\x61\x2a\x66\x49\xb8\xf1\x3e\x0c\x51\x49\x09\x3d\x1d\xdc\xe1\x00\x4e\xa1\x3c\x64\xd6\x69\xa1\x4c\x18\x32\xf6\xd4\x3a\x29\x4f\x52\xcb\x9d\x45\xd4\x1a\x41\xbb\xda\xe8\xd0\x1a\x93\x51\xa3\xf5\x49\xa9\xa3\x31\x40\x61\x22\x28\x72\xc1\xa8\x88\x03\x4c\x16\x5b\x53\x5d\xf8\x16\x47\x7d\xd4\xb5\x27\xf6\x4f\x23\xfa\xf2\x9b\x9e\xd8\xc3\x9b\x1f\x91\x6d\xef\x7f\xb4\xec\xde\x2f\xa1\xf3\x1a\x39\xa7\x06\xe4\xb1\x0c\x6f\x05\x17\x4e\x1c\x05\x41\xba\x22\x29\xb1\x98\x6a\x1a\xbb\xcb\x7c\x74\x65\x01\x10\x95\x82\x71\xaa\xdc\x11\xb5\x3a\x4c\xb6\x9f\x1a\x8e\x47\x84\xb7\x08\xd0\xd0\xd9\x20\x4f\x8e\x6a\x55\x83\x9a\x2b\xac\x04\xaa\x0c\x27\x22\x08\xaa\xa4\x66\x53\x81\x91\xe9\x2d\x26\x86\x10\xc7\x35\xd5\xf6\x64\x82\xd1\x56\xac\x98\xc1\xc5\x96\x6c\xd5\x55\x3f\xfb\x1f\xc7\xb9\xd8\x57\x35\xcb\x35\x0f\x8f\xdd\xb0\x17\x6c\x7e\x57\x08\xd9\x4a\xe7\x9d\xf2\xd6\xb5\xce\x7b\xd7\xba\xb6\xb1\x10\xf4\x18\xda\xd8\x0a\xab\x60\x11\x7c\x85\xb4\x44\xc0\x04\x63\x95\xda\x8e\x75\xdd\x34\x91\x9f\xa1\x41\xfc\xc9\xf6\xbe\x70\xc5\x21\x3d\x32\x42\xfd\x25\x59\x76\x96\x88\x7d\x55\x97\xba\x8d\xdc\xc9\x67\xfe\x84\xd8\xa3\x7b\xfb\xf1\xab\x1a\xca\xa7\x6f\x95\x52\x62\x07\xef\xb9\x7f\x7a\xfd\x7c\x32\x43\x10\xa0\x0e\x03\xc0\x41\x03\xbb\x22\x2b\x69\xe8\x40\x1b\xd8\x68\x9e\x8e\xae\xeb\x00\x19\xe6\x29\x7e\xca\x18\x15\xb2\x02\x1e\x29\x8c\x15\x0a\xb2\x92\x82\xf6\xa9\xc0\x18\x0f\x08\xa1\x95\xc7\x9a\x5e\xb5\xdc\x7e\xff\x7a\x5e\x11\x7f\xfb\x95\x11\xea\xfd\xb3\xc2\xf6\xda\xab\xf9\x29\xed\xf6\x28\x71\xb8\x22\x2b\x56\xea\xe7\xd2\x22\x5f\x73\xe7\x94\x15\x87\xa7\x06\xe4\xf5\xf9\x3c\x9c\x4e\xa7\xa8\xe9\x3e\x1c\xc3\xd4\x45\xa9\xf4\x2a\x1c\xd2\x32\x4d\xfa\xa8\x32\x72\x3a\x35\x3b\x43\xf5\x59\x79\x7d\x3e\x38\x0d\x0a\xdd\x34\xb6\x9b\x51\x67\x97\x4b\xb5\x5d\x3a\x76\x01\x36\x01\xb5\xbd\x0b\x67\x37\x8f\x29\x72\xa0\x48\x92\x7d\xf4\x1b\xdd\x0e\x47\x4e\xc8\x7f\xf4\xec\x33\x13\x70\xf7\xe3\x78\xf4\x0e\xac\x63\x3b\x8b\x4b\x5c\xb1\x05\x2f\xa0\xe1\x11\x19\xfe\xfe\xba\x07\xf7\x15\x97\x12\x33\x28\x31\x9f\x3b\x2b\x80\xb5\x41\x2f\xde\x7e\x89\x9c\x24\x36\x44\x80\x82\x1e\x81\x00\x92\x06\x36\x9d\xf8\x28\x0e\x3a\x95\x40\x06\x6f\xa4\xdc\xe1\xb9\x8b\x94\x34\xb6\xa0\xa9\x78\x3a\x65\x2e\xa5\x73\x07\x86\x26\x1c\x5b\x20\x5c\xcb\x1a\x3f\xfb\x99\x0b\x5a\x4b\x7d\x76\x6d\x8a\xcb\x20\xe5\x18\xd7\xad\xbe\x90\x6d\xf5\xcc\xe3\x80\x7e\x3b\x8f\xc3\xdb\x1f\xd3\x38\xdc\x45\x82\xdb\xac\xf1\x65\x05\x8a\xb9\x6b\x20\xbe\xdd\xe4\xbe\x2a\xc7\xd0\x00\xca\x14\x66\xa5\x42\x45\xd9\x17\xa3\x14\x42\x4f\x05\xfc\x49\x0e\x07\xb7\x52\x38\xb0\xf1\x2b\x85\x43\x5c\x2b\x69\x76\x4e\x58\x9c\x11\xfa\x27\x91\x4f\xf1\xab\x5e\xc4\x43\xc4\x6b\xff\x94\x66\xe7\x72\x4e\x0f\xab\xc6\xce\xe7\xc7\xfb\x4d\x05\x48\x14\x3d\x06\xce\x95\xe8\x10\x4c\x64\xfb\x30\xc1\xac\x42\x3f\x1d\xa0\x41\x8f\x10\x45\x6d\x2c\x80\xc6\xaa\x0a\x2e\xb2\xcb\x38\x2b\xb8\xb6\xda\x98\xbe\x37\x46\x5b\x2d\xb8\x75\x01\x11\x9d\x24\x79\xe4\x2d\xf5\x3b\x9b\xfc\x41\xf2\xf3\xa4\x8c\x13\xdb\xb7\x3e\xc5\x2f\xde\x3d\xe3\x4a\x3e\xac\xc0\xbf\xd5\x86\xad\x62\x16\x77\xcf\xb0\x93\xf5\x47\x3e\x3d\x93\xb0\xdc\x48\x4b\xb6\x08\x41\x70\xf6\x4f\xd6\xa7\x39\x01\x08\x24\x07\x79\x98\xc2\xa8\xba\x49\x9c\x18\xa8\x5d\x44\xa0\x9c\x7c\x68\x5d\x68\x3d\x38\x05\xb1\xaa\xdd\xd5\xa0\x98\x8b\x48\x23\x7e\x04\x6c\x67\x19\x0f\x27\xe7\x01\xd4\xe1\x28\xac\x72\x92\xf1\xc5\x62\xf5\xce\x05\x25\xe7\x33\x9f\x26\x91\x96\x31\x7d\x9d\xf9\x2a\x5f\x94\x64\xa9\xbe\x0c\x9b\x6e\x27\xbf\xc6\xdb\xd7\x79\xc7\xab\xde\xda\xab\x78\x5b\x1f\xfd\x30\x74\x21\x69\x8f\x69\xe9\x0e\xd6\x1e\x0e\xdb\x64\xb9\xc5\xee\xe0\xdc\x21\xc0\x99\x51\x91\x0e\xa1\x02\x34\xc9\x52\x72\x71\x91\xff\xed\x4f\x92\x2a\x22\xa9\xa3\x8b\x8e\xbb\x7a\x55\x28\xbb\x5b\x21\x66\xab\x4a\x40\xb4\x01\x2f\xa5\xdd\xb2\x23\x97\xa0\x6d\xc7\xb1\x2f\xc3\x39\x34\x25\x28\x0e\x07\x5f\xc2\x65\xaf\xda\xca\x1b\xa1\x89\xc5\x4c\xb3\x20\x18\x36\x98\x6e\x6d\x23\xed\xd9\x86\x04\x39\x86\x3d\x4a\xa1\x3d\xb3\xb2\x14\x67\x00\xab\xe5\x59\xba\x39\x41\x8d\x26\x56\xfb\x0e\x77\xfe\x6a\xb3\xd9\x4e\x25\xbf\xbc\x72\x05\xbc\xd6\xae\x7e\x09\xa9\x7c\x00\xdf\x82\xac\x6f\x53\x0c\x29\x07\xb8\xac\x3c\x2a\x01\x0c\x1a\x53\x6d\x89\x12\xd8\xc0\xf1\x54\x71\x32\xa6\x0d\x17\x71\x4b\xa3\x55\xb5\x36\x9a\xd0\x61\xdb\x32\x82\xb8\xb4\x5e\xe7\x95\x45\xcd\x80\x25\x2e\xac\xec\xe7\xe9\xe9\x2c\x44\xe9\x4b\xa6\x83\xcf\x0e\x93\x0e\x76\xcd\x81\x53\x75\x21\x5b\xb5\xc3\x2f\xb4\x6d\x7e\x8b\x9e\xf9\xaf\xbe\x15\x34\x6f\x00\x45\x30\xf8\xb4\x14\xa3\x44\xb8\xd0\xfe\x70\xc4\x8c\xf0\xd3\x18\xff\xfd\x7f\x2b\x9a\xef\x52\x7a\xe1\xd1\x3e\xfc\x18\x9f\xff\x4d\x46\xf6\xee\xa5\xa6\xce\x4b\xdc\x94\x14\xee\xe8\x38\x17\x33\x52\xe2\x7c\x8c\xff\x98\x15\x56\x18\x60\x29\x55\x84\x6f\xfd\x72\xc8\x3d\x75\xce\x65\xb4\xef\x43\xd2\xcf\x53\x1f\x34\x1f\xb5\xb6\x35\xd7\x4a\xeb\x95\xb7\x7c\xd5\xf7\x59\xce\xe3\xa7\x3c\xec\x75\x9d\x46\x49\xd6\x6f\x9f\xd5\xcd\x69\xa4\x4a\x3b\xeb\xac\xf5\x33\x72\x1a\xe4\x8b\x27\x93\x32\x22\xe2\x69\x18\xac\x7d\x7e\x3e\xdd\x30\xf4\x7d\x64\xc5\x3a\x9d\x02\x7c\xaa\x19\xcf\x6d\x4e\xeb\xe0\x36\x79\x38\xb9\xa0\x4c\x02\xb2\x2e\xc1\x3b\x9d\x25\x57\x8d\xfa\x87\x1f\x69\xd4\x8f\xa9\x9b\x8e\x47\x50\xcc\x04\x94\xc7\xe3\x25\xc9\x12\xeb\xad\xb7\xcb\x87\x15\xd7\x95\xe2\x7d\xbd\xf3\x49\x9e\xdc\x5f\xaf\xe7\x3f\xba\xd5\x0d\x3f\xdd\x5f\x29\x2d\x7f\x3c\xb7\x7f\x1b\xc6\x7e\x7f\x8d\xb3\xf7\xf7\x6f\xf7\x8f\xef\xb6\x6f\x7f\x0c\xc9\x48\x6d\x55\x02\xf3\x44\x81\x43\x19\xb1\xb0\x02\x67\x57\x6a\x7b\x90\xbd\xb7\xa3\xe8\x8d\x60\x25\x54\x03\x66\x52\x94\xe1\x5c\x7c\x39\xa5\xc3\x8c\x0d\x18\x02\xee\xb2\xa2\x39\x16\xa1\x96\x92\xb1\x92\x70\x11\x44\x09\x3a\x23\xe6\x6e\xe7\x09\xd5\x9a\x97\x48\x70\x73\x68\x04\xb3\x5c\x1b\x66\xa8\x14\xba\x2a\xd9\x51\x1b\xa1\x6b\xa8\xc3\x24\xf1\xa8\x58\xa1\x0a\x46\x48\x61\x8a\x02\x17\xaa\x28\xae\x38\xaf\x94\x5f\xd8\xd6\x46\x5c\xe6\x9f\x5c\xd5\x2b\xd3\xbf\x40\xaf\x9e\xd6\x3e\xfd\xb0\x4a\x24\xc5\xec\xf1\xe3\x2f\xc1\xe3\x2f\xde\xdd\x3d\x80\xc7\xcf\x8f\xef\x3e\x3d\xbc\x1a\x67\xc0\x94\x55\xa8\x24\x55\x59\x55\x4b\x48\x86\x2c\xc0\x06\xa3\xca\x85\x11\xc1\x9c\xb7\x29\x5c\xc2\x66\x1d\x0a\x8e\x0c\x62\x1b\xf2\xa5\xa5\xac\x54\x39\xee\x0b\x50\x9e\x9e\xce\x19\x0b\xcd\xb9\x0c\x66\x73\x4e\xf1\x3c\x84\x33\xac\x3b\x30\xcc\xa7\x83\xa5\x70\xf1\x4c\x5d\x2d\x1b\xef\x5b\xd6\xd6\xc9\xaa\xcb\x6a\x36\x70\x67\x5f\x6a\xcc\xfd\xdb\xa8\xe4\x59\x60\x23\x5e\x2b\x1a\x68\x1d\xac\x8b\xd1\x54\x0b\x58\xd0\x43\xdf\x03\xd6\xcf\xe7\xf8\x69\x87\x59\x44\x8b\x30\xc5\x98\x62\xe0\xc8\xc2\x99\x73\x1e\xce\x42\x5c\x7b\x8e\x4d\xac\x2d\xa1\x2b\x0f\xc2\xb2\x66\x1e\xaf\x7e\xe7\xd6\x02\xbf\xbb\x02\x10\xd6\xbe\xf3\xd5\x15\x45\x71\x8a\xd7\x7e\xe6\x5a\x42\x7a\xf3\xfe\xc3\x6e\xbf\xec\x8e\x8d\x92\x8c\x62\x71\xd0\x53\x36\xcd\x75\x59\xa5\x84\xdb\xf1\x4c\x8d\x9b\x7b\xef\x31\xc8\xcb\x25\xb8\x06\x0d\x80\x33\x7e\xfe\xaa\xce\x0b\x53\x7b\x26\xc2\x58\xd9\xa6\x4c\xc9\xdc\xa7\x09\xa2\xb4\x32\x75\x97\xb2\xb9\xc5\x58\x5b\x81\xa1\x2b\x42\x22\x38\x38\x97\xae\xcc\x8c\xd6\x3a\x34\x52\xca\x80\x8a\x9c\x13\x2a\x03\x67\x05\xae\x42\xbf\x72\x4a\x25\xeb\x5c\x16\xbe\xe6\x33\xff\x72\x45\xee\xec\x9e\x49\xe4\xee\x37\xdb\x1f\x51\xa0\x80\xdd\xc3\x07\xf8\xfe\xdd\xf6\x77\xe4\x5a\xc0\x6e\xf3\x19\x97\x30\x3b\x06\x69\x00\x63\x81\xeb\x79\x08\x53\x68\x25\x48\xda\xe0\x53\x82\x60\x50\xee\xc6\xb4\x0b\x5a\xe3\x20\xa0\x80\xe1\x30\x81\x73\x28\x96\x4c\x95\x2a\xc6\x4a\xc1\xe1\x12\xb5\x84\x02\x9c\xb7\x78\x9e\xaa\xca\x8a\xca\xf1\x7e\x90\x96\x0a\x5b\x55\x00\xf3\x70\xe2\xb3\xcf\x35\x52\xcb\x13\xd4\x95\xa4\x4b\xce\x56\x68\xa6\x6e\xf6\x0b\xfe\x6e\x9d\xc2\x57\x71\xee\x37\xb5\xbf\x54\x82\x3c\xce\xc4\xad\x05\xa0\x4b\xe2\xc2\x09\x94\xe7\x73\x98\x6a\x29\x27\x1d\xdc\xf2\x71\x3b\xb4\xad\xb5\x73\xee\x5c\x68\x00\x77\x2e\x9d\x6c\xc0\x5d\xd7\x85\xb2\xeb\xba\xa8\x39\xda\x5d\x35\x47\xff\x32\xf9\x67\xc9\x5f\x27\xff\xfa\xc7\x0a\x5c\xef\xbf\x6a\x8e\x3e\x4b\x8e\x7e\xb7\x7f\xf6\x83\x1f\x1e\xdf\x7d\x7e\x56\x1c\xfd\x37\x15\x1c\xed\x1d\xa8\x8a\x1c\x97\xa6\xec\x18\xaf\x21\xa3\x42\x70\x23\x0c\x69\xb9\x2e\xf2\xfe\x59\x6d\x74\xe0\xbf\x4d\x6c\x14\x51\xaa\xa9\x31\x14\xd6\x75\xa0\x8c\x35\x30\x9c\x74\x07\x2a\xab\x10\x56\xac\x65\x82\x7b\x21\x08\x13\x82\x92\x4a\x96\x88\x0b\x8c\x8d\x31\x8a\xe7\x85\x44\xd0\x94\x51\xa7\x27\x2d\x2f\x7c\x73\xd8\xf1\x97\xb1\xcd\xdd\x73\x9d\xe0\xab\x84\x4c\x5a\xb7\xae\x69\xfa\xa1\xb0\x56\x71\xc5\x3b\x0d\xf2\xaa\x1f\xda\xaf\xfa\xbc\xb5\xeb\x94\xb3\xa1\x1b\x05\x20\xa0\x73\x00\x27\x19\xa8\xe3\xba\xe5\x51\x9f\xfb\x59\x83\xfe\xb5\x3a\xf7\xe3\xc3\x2d\xab\xb9\xe2\x55\xaf\x89\xee\x55\x41\xf3\x77\xd5\x09\x36\xf5\xf2\xe8\xab\xa3\x6e\x69\x6d\x9d\x6d\xc5\x20\xeb\x19\x81\xc4\x1d\x7b\x41\x14\x44\x8e\x6b\x5e\x8b\xc3\xe6\x48\xcf\xe1\x10\x19\x01\xeb\x59\x30\xa7\x45\xa9\x35\x9b\x59\xda\xce\xcb\xd1\x53\x95\xb2\xcd\xc1\x18\xa3\xa9\xa5\x4d\x38\x02\xdc\x0b\x2d\x8d\xd1\xda\x70\x41\x10\x3e\x9d\x2c\x57\xca\x05\xa3\x61\x21\x8d\xd0\x5a\xb0\xd2\x41\x22\xb4\x30\xa2\xd0\x6b\x1c\x52\x5f\xf0\x7e\x89\x43\x56\xde\x9f\xbf\x5d\xf7\xe7\xdd\xe3\x0f\x2f\xcb\x7f\xab\xde\xcf\x4d\x24\xf5\x3e\xd6\xe8\x3f\xfe\xe2\xa5\x52\x6a\xac\x25\x7e\xff\x66\xf9\xb9\x8f\x9f\xdf\xdc\xa7\x35\x38\x86\x76\xd5\x48\xb4\x45\x59\x3b\xea\xba\xae\xeb\x40\x9b\xaa\x31\x2f\xa7\x70\xce\x0b\x5e\xe4\x39\x2a\x6c\x8e\x9c\x22\x04\x5b\x26\x41\xc5\x46\xc7\xca\x3c\x4c\x3b\xfc\x84\x03\xd7\x94\xe2\x66\xc4\x18\x39\xc1\x36\x06\x14\x33\x05\x30\x85\x2e\xf4\x67\xcf\xd9\x7c\x40\x39\xad\xd1\xa8\x08\x03\xb6\x31\x03\x31\x53\x8a\xd2\x32\x98\x33\xb8\xf2\x46\xb9\x0b\x8f\x35\xfb\xaf\x7b\xf3\x2f\x56\x0d\xcf\x7f\x0b\x25\xd4\xd7\x73\xbf\xf0\x3a\xf6\xbb\xa1\xff\x2f\x6b\xff\x0e\x24\xb9\xae\xe7\x07\xc2\x04\x99\x0f\xde\xab\x79\xb0\x4e\x9f\x3a\xcd\x7b\x47\x9a\x8b\x52\x77\x9f\xc6\xe8\x35\xd4\xf4\xed\x6e\x7c\x9a\x90\x84\x4f\xb1\xb1\x01\xc5\x6a\x62\xa1\x9d\xdd\x08\x38\xab\xc5\x86\x0c\x61\xad\x85\x09\x13\x26\x4c\x98\x30\x69\xd2\xa4\x49\x93\x26\x4d\x9a\x69\xa6\x99\x26\x4d\xea\x74\x12\xb5\x91\x60\x66\x75\x55\x9f\x73\xaf\x56\x11\x5b\x15\xac\xcc\xce\xac\x73\x8a\x49\xe2\xf1\x7f\xfc\x1e\x80\x7d\x63\x2f\xea\x80\x8a\x61\x46\xdb\x34\x0d\x20\x4d\x28\xe3\xc3\xd9\x30\x68\x21\xcb\x01\x24\x47\xc0\x00\xa3\x41\x06\x69\x39\x97\xbd\xfd\x23\xce\xa3\xe9\xc9\x35\x55\xeb\x96\xfe\x3c\x32\xe2\x7b\x29\xbc\x49\xbb\x1b\x56\x87\x6c\xf9\xce\x24\xdf\x3d\x73\xe3\x8f\xa5\xb2\x67\x01\xc5\xcd\x46\xfe\x05\x14\x69\xfb\xcc\xea\x32\xcb\xb5\x24\x95\xc5\xac\x55\x94\x29\x2b\x9c\x50\x06\x8e\xb6\xef\x89\xa2\xb8\xa4\x0c\x8d\xe0\x24\x89\xc6\x22\x34\x8a\x49\xa5\x76\x9c\x0b\xa5\xa0\x77\xbd\x91\xcc\x29\x79\x99\x85\x0b\x39\x9d\xdc\x22\xd6\xe1\x94\x5a\xd9\xf4\xb4\x6f\x28\x79\x4c\xac\xa8\xe3\x98\xaa\xf6\x7a\x47\x9e\x76\xb4\x04\x3c\xc7\x7d\x3c\x25\x78\xe9\xfe\xed\xbb\xeb\x30\x8b\x32\x1c\x1f\x56\x1f\xa6\xcb\xb1\xc9\x83\x4f\x8b\xa8\x1c\x4b\x37\x65\x20\x97\x28\x26\x45\x0b\xd6\x16\x20\x40\xad\x1d\x6c\x8d\xaa\x20\x02\x42\x6d\xca\xea\x7a\x69\xbd\x07\x28\x72\x46\x9d\xeb\x52\xbe\x34\x9d\x73\x3e\xcc\xa6\x24\x0d\xe9\x27\xc6\x28\x2b\x8d\xdb\x24\xb1\xc2\x11\x8f\xc8\x09\xa5\x8f\x62\xdf\xa4\x28\x72\xba\xee\xa2\xe2\xe2\x33\x98\xc9\x7a\xb5\x3e\x7f\x78\xde\x9d\xfd\xb8\xe5\x5a\x4a\xa9\xc0\xd1\x30\x47\xcd\x62\x3d\x65\x4e\x1c\x3d\x71\xb8\x70\xa5\x98\x1c\x4d\x11\x95\x46\xb3\xa2\x1d\xf8\xd0\x95\x55\x98\x3b\x36\xb6\xa1\xa7\x48\xa2\x86\x51\xf1\xd5\xf7\xbb\xde\x55\x4f\x1e\x43\x5f\x7d\xbf\x2f\x5b\xfb\xa7\x0f\xaf\xaf\x56\x43\xdf\x3a\x0d\x3d\x8f\x95\x2e\x89\xe8\xbb\xf7\x51\x46\x26\x4b\x36\xce\x13\x5a\xf8\x3a\xe8\x80\xcb\xb6\x06\x55\x5c\x32\x6e\xc7\xa8\xeb\x49\x9e\xce\xf3\xb1\x15\xfd\x21\x1d\x40\x39\x88\x2e\xcc\x87\x6a\x0c\x13\x01\x70\x57\xb9\x45\xe7\xba\xe0\x0c\x96\x36\x4f\x3b\x6b\x83\xb4\x41\x40\x15\x5a\xae\xa5\x12\x82\x0a\xad\xe8\x24\xbd\xf3\x5a\x5b\xa3\xbc\xba\xae\x1b\x6c\x2b\x76\xf6\x49\xb9\x27\x01\xe9\x2a\x4a\xbf\xb6\x10\xee\x1f\xb6\xcf\xb2\xcb\x4d\xae\x9d\x18\x85\x83\xb5\x51\x72\x4d\xd5\xc1\xe0\x4f\xde\x9f\x4e\x5b\x16\x8e\x9d\x01\x18\x70\xa4\xdb\x41\x75\x93\x3b\x9e\x67\x63\xb2\x3c\xe4\x40\xde\xf4\x8d\xb6\xd5\xb5\xaa\xf4\x1f\xbf\xe9\xb1\x5e\xbf\x7f\x78\xbd\x7f\xfb\xee\xe1\x86\x6e\xb9\x62\xcd\x9e\x08\xb3\xff\xad\xc5\x18\x70\x80\x3d\xf0\xb1\x9f\x7a\xd9\xa7\x52\x14\xec\xb1\xe3\x8f\x49\x98\x17\xdb\x85\x86\x5f\x62\x0a\x9d\xe6\x51\x18\x71\x00\xe3\x4d\xd2\x38\xc5\x34\xb4\x91\xb8\x7e\x5c\x20\x73\x82\x97\x52\xd2\x05\xa5\x87\x48\xd3\x1a\x11\xd0\x9b\x23\x63\x8c\x29\xa1\xb9\x36\x95\x13\xc7\xc1\x68\xae\x35\xd7\x42\x88\x30\xf2\x30\x69\x28\x14\xd3\x32\x36\x21\x2f\x39\xaf\xe2\xb9\xbe\x7a\xdf\xfa\xe8\x09\xf7\x8f\x93\xff\x29\xf9\x8f\x6b\x27\x2b\x42\x81\x5f\x7f\xe3\x79\x1b\x2d\x6f\x57\x96\xe3\x27\xf0\xad\xc4\x65\xba\x7d\xd6\xc5\x79\xde\xb6\x79\xe6\x2f\xb7\xcf\x59\x98\x82\xaa\x00\x09\x71\x2b\xe7\x97\x04\x81\x74\xf0\x20\x59\x68\xc0\x89\x49\x0e\x7c\x38\xa2\xa1\xf3\x35\xec\xb4\x13\xe6\x48\x89\x9b\xc3\xa9\xaf\x89\xd6\xd4\x40\xc4\x38\xd5\x04\x97\x94\x56\xa3\xd5\x4e\xb9\x54\x0a\x61\xa9\xd8\x29\x2b\x4b\xb7\xb8\x5a\x2d\x92\xd2\xd2\x95\x30\x45\xac\x16\xc0\x34\xb5\xab\x87\x76\xaa\x42\x5f\x19\x77\x80\x85\xd5\x03\x6a\x24\x14\x02\x07\x7b\x80\x48\xd1\xfe\x48\x05\x2f\x8b\x65\x5c\x57\x17\x50\xd3\x30\x79\xd9\x1e\xea\xa3\x1c\xa3\x7e\xc1\x2e\xfa\x32\xfb\xab\x6f\xda\x6f\x92\x87\xe4\xaf\x92\xff\xdf\x75\xee\xfe\xf5\x3a\x83\x9f\x30\x3f\xf1\x5a\xbc\xba\xca\x85\x6f\x3f\xa4\xc9\xf6\xfd\xdb\xe4\x6f\xc1\x4b\x65\xe6\x6d\x49\x4a\x0f\xf1\x41\x12\x4b\xe4\xa6\xf2\xe7\xde\xa7\xbd\x20\x2d\xe3\xcc\x87\xca\x01\xec\x50\x38\x44\x78\x13\xc8\xbd\x25\x54\x55\x85\x2d\xf9\xd0\xf1\x9d\x8e\x3c\xd6\xc2\x78\xea\x4c\x18\x83\x3b\x4d\x40\x77\x03\xee\x5c\xe8\x16\x99\x16\xcb\x29\xad\x4f\xc1\x04\xcd\x1d\x01\x34\x1c\x20\x44\x0e\xf5\x9c\xf0\x64\x93\x0d\x09\xde\xf5\x5b\x94\xdc\x7f\xed\xc1\xfc\xac\x05\x73\xc9\x0d\xff\x32\x56\xbc\x6e\x32\x8c\x1b\x6f\x20\xb0\xd4\x28\xcf\x3b\x65\x6a\x5e\xab\x0a\x11\x69\x05\xe2\xb9\xc0\xe1\xa4\xc1\x29\x94\xf6\x70\xd8\x22\x24\xb4\x35\xb4\xb2\x94\x0b\xaa\x29\x25\x84\xb1\x16\x53\xce\xc4\x72\x0c\x95\x3e\xac\x1c\x9d\x43\x7a\xd8\xb8\xa7\x3a\xc0\x43\xac\x42\xbc\xe0\x9e\xaf\x17\x71\x7b\x85\x38\x3f\x57\xf7\x48\xa5\x03\x9e\x73\xe9\x61\x2d\xf1\x22\x1d\x70\x8f\xc9\x0d\x87\x4c\x88\xc2\x34\x3d\x3a\x82\x1d\xdd\xe9\xc7\x24\x94\x5c\x14\xb6\x60\x63\xea\x3b\x72\x22\x69\x41\x18\x67\x94\x62\x49\x22\x41\x2d\x4b\x6c\xda\x6d\xfa\x9d\xb9\xf2\xa1\x6e\xde\x4e\xdf\xb2\x81\xae\x88\xa3\xb5\xbc\xf6\xe1\xe3\x00\x7c\x40\xe0\xb0\x0a\x81\xd9\x50\x4f\x0d\x6f\xbb\xba\x1e\xc5\xdc\x05\xeb\x22\xe1\xb2\x99\xb7\x82\x69\xce\x35\x0b\xbd\x14\x5a\xf1\xe9\x60\xb8\xe6\x5e\x4a\x29\x2f\xb9\x09\x4f\xa7\xbd\xd9\x89\xb8\x0a\xff\x55\xf4\x1c\xb8\xd5\xb1\xde\xdc\x3d\x7c\xbf\x7f\xff\xe9\x86\x6d\x7a\xb8\xbf\x4a\x1e\xde\xe4\x23\xde\x5c\xd6\x8f\x6c\xc8\x5c\x7b\x38\xb8\xc7\x64\xd2\x87\x79\xee\x53\xf6\x98\x7c\x31\xe9\x10\x6c\xc5\xc0\xb0\x1c\x61\x25\x1b\xde\x83\xe4\x92\x5d\xed\x84\x1d\xa2\x78\xcc\x5c\x0b\xd3\xd9\x61\x18\x06\xc0\xac\xd3\x01\x03\x52\x55\xaa\x39\x2c\xcd\x21\xe6\xd3\x5d\xec\x5f\x56\xc9\x77\xc9\xeb\xa8\x74\xf9\xaf\x56\x2d\xff\xfd\x0f\xdb\xcb\xe8\xbe\xca\x27\xbd\x89\xd0\xac\x57\x77\x97\x10\xfd\xab\x90\x15\x7c\x77\xb7\x96\x20\x3f\xdc\xdf\x72\xc2\xac\xcc\x8e\xba\x69\x41\xc9\xfa\xc1\x9d\xc2\xc0\x41\x39\xf4\x5c\x81\x82\xb7\xb5\x38\x05\xe1\x2d\x44\x4e\x62\x0f\x03\x5b\xba\x12\x20\x90\x84\xc9\x83\xc6\x07\x1e\x6b\x90\x0d\xc8\x77\x95\x19\x35\x25\xae\x62\xc4\x60\x8b\x99\xed\x9c\x10\x6e\x51\x21\x99\x8b\x9c\x51\xd4\x8c\x58\x91\xdc\x17\x20\xd1\xa9\xf6\x3e\xb8\xe3\xf1\x78\xd9\x0c\xd0\x23\xdf\xcc\x51\xa7\x36\x56\x9f\xef\xae\x8e\xf2\x45\xf6\xfe\xd3\x77\xbf\x01\x6f\x37\x35\xeb\x27\xd0\x29\xdf\x39\x43\x09\xa8\x76\xc2\x52\x14\xb4\x3b\xe7\xd9\xbc\xa0\x70\x12\x16\xb4\x29\x02\x03\x4a\x92\x2c\x9d\x23\x86\xc8\xc7\x11\xfa\xe1\xa6\x8b\xfc\x8c\x80\xf4\xcc\xa8\xed\xf2\xaf\x0f\x9f\xd6\x56\xd3\x9a\x13\xac\x2a\x5b\x9b\xa6\xad\xaa\x34\x67\x2d\x11\xe5\x25\xa7\x28\x96\x2e\xe3\x85\x32\xd8\x40\x87\x2b\x54\x9e\xdb\x96\xf4\x04\x3a\x88\x03\x75\xad\xab\xfd\x79\xde\xf9\x8a\xd3\x40\xc3\x5c\xd8\x42\x02\xb2\xf8\x45\x3d\x26\xa5\x2f\x0d\x38\x66\x4e\x86\x51\xbb\xca\xeb\xf3\x31\x4c\x31\x16\x2c\x82\x8c\x6b\x53\x7f\xd5\xa0\xf9\xaa\x70\xfd\xfb\xdb\x9e\x15\x23\x9f\xdd\xfe\xc3\xe5\x56\xbe\x5d\xb5\x9e\xae\x55\xed\x9f\xa5\xf2\x97\xdb\x9b\x31\xd0\x44\xd7\x29\x50\xcb\x31\x6f\x40\x4e\x87\x30\xe4\x61\x0c\x7d\x05\xf0\x38\x72\x0f\xa6\xc0\xfd\xf5\x3e\x5d\xc2\xe3\xdb\xb3\x5a\xb6\xad\xdc\x4e\xce\x2d\x89\x35\x27\x7f\xb9\x79\x36\xb7\xc8\x41\x51\x0f\xce\x82\xa1\x6d\xdb\x00\x9b\xa6\x59\x9a\x56\xca\x36\xea\xbf\xe2\x7d\xbb\x43\x57\x8d\xd5\x77\x2f\xd5\x55\x63\x5d\x32\xb6\xf2\x6e\x49\xfb\xcd\x25\x7e\x83\x33\x78\x3e\xfa\x9b\x74\xed\x72\x4a\xab\x0a\x2e\xb3\x4f\x21\x03\x73\xe0\xee\x92\x3e\x6b\x93\x9f\x82\xac\x00\xad\x03\xde\xa1\x85\x82\xfa\x12\x5e\x2c\x88\xb3\xb4\x5f\x46\xd7\xb8\x93\xf4\x1e\xb0\xd0\x39\x7b\x59\x95\xb6\xf1\x5e\xd7\x3b\xf5\x84\x83\x5d\x35\xc4\xb6\x4f\xea\xe0\x6f\xee\x6e\x5d\xae\xdd\xfe\x3d\x04\xd7\x8d\xfe\xf6\xb8\x2f\xd9\xe1\x31\x49\x8b\x65\xba\x44\x8c\x2e\x40\x70\x5c\xe6\x34\x1f\x4f\x55\x9a\x84\x3a\x86\x7e\x87\xcb\x16\x1f\xd0\xd7\xe7\x3b\x65\x61\xd9\x3a\x7f\x3e\x06\x0b\x74\x06\xbd\x6b\x8a\xdc\x9d\xd5\x25\xc9\x4e\xfa\xb5\x8e\x91\x45\xbf\x40\xb7\x33\xc9\x3f\xbc\xea\x55\x3e\xc4\xbd\x36\x72\x4c\x5f\xda\xe7\x47\x4d\xb3\xaf\x74\xe1\x74\x04\xa6\xaa\x7c\x8d\xc1\x01\x38\xd2\x8d\x55\x95\xea\x50\xfb\x23\x0f\xa7\xb6\xad\xc3\x24\x27\x19\x46\x50\xd6\xd2\x5b\x23\x41\xdf\x34\x1b\xaf\x6d\x59\x78\xc4\x2c\x82\xde\xf8\x49\x37\x1d\xe0\xa1\x1f\x5c\xd7\x07\x1f\x54\xe8\xad\xb9\xec\x44\xe2\xdc\xc7\xf3\x12\x31\x56\xd0\xb1\xf3\xfa\x2f\xbe\x76\x5d\xef\xbf\xdf\xff\xf0\x6a\x9f\xbe\x4f\xb7\xef\x93\xbb\x1b\x08\xed\x1b\x09\xa3\x77\x77\x6f\x36\x12\xc0\xfa\x92\x06\xe7\x7d\x67\x4c\x2d\x1e\x13\x0e\x68\x38\x86\x49\xd0\x1a\xf3\x02\x50\x3a\x02\x0c\x2a\x1a\xec\xe1\xc0\x8c\x15\x20\x6f\x36\x03\x68\x03\xf3\x10\xe3\x39\xf4\x16\x24\x73\x68\x47\x0f\x20\xa8\x61\x9a\x37\x03\x3d\xd4\xcb\x78\x3e\x48\x5a\x4b\xad\xa4\xab\xd3\x26\xea\x8a\xb3\x88\xc9\x58\xfd\xd6\x3e\xac\xd9\xfa\x37\x12\x13\xb7\x73\xbc\x86\xe0\x2f\xce\xf4\xc7\xcb\xa9\xee\x8a\x7a\x9a\x98\x94\x02\x4a\x59\x45\x8a\x03\x11\xd4\x13\x9e\x52\x5e\xb9\x4a\x84\x0a\x30\x3a\x02\x02\x30\x0d\xe6\x78\xa4\xd6\x56\x15\x28\xa2\x3d\x9c\x3f\x8f\x9a\xc3\x1a\x89\x2c\xf7\x80\xae\xe7\x78\x18\xa6\x6a\xee\xd1\xf5\x4c\xa5\x62\xe4\x72\xaa\xc9\x26\x61\xa9\x8b\xe7\xba\xe6\x04\x0f\xcf\xfd\x88\x9e\x1a\x18\xb7\x79\x10\xf5\xe2\xde\x3d\x64\xbd\xa0\x1e\x8b\xb4\xf3\xd2\x78\x7f\xc6\x9a\xd6\x44\x75\xbb\x63\xa0\x23\x28\x59\xa8\x8f\xa1\x9c\x83\x95\xa0\x00\x49\xa8\x76\x5a\x7b\xea\x2c\xc1\x83\x65\xb5\x36\x35\xf5\x36\x0c\xae\xe7\xb5\x07\x30\x9c\x6a\x2b\xc6\x55\xaf\x26\x79\x14\x51\xc7\x6d\xc5\xda\x7f\xf8\x63\xe8\xfa\xec\xe1\x1e\xfc\x19\xb8\xff\xfe\x87\x87\x6b\x50\xf3\x4f\x01\xfc\xf1\xe3\xef\x3f\x83\x87\x3d\x76\xe7\xb9\x06\x23\xaa\x1c\x41\x62\x68\x54\xdd\x87\xd1\xeb\xc1\x0d\x2c\xc3\x81\x74\x88\x81\xdc\x18\x5e\x36\xa5\x9d\xbb\x30\xb4\x0d\x68\x97\xc3\x56\x85\xf6\xb2\x3b\x69\x51\x69\x37\x99\xda\xb4\x5a\xe2\xd1\x71\x17\x26\x15\x3a\x53\x95\xb0\xa4\x87\xea\x54\x4b\x89\xf5\x25\xdb\x4e\x13\x99\xaa\xd8\xfb\xbd\xac\x79\xdf\xe8\xf9\xaf\x57\xea\x79\x6c\x7e\x99\xa6\x27\x60\x7d\x9a\xfb\x28\xa5\x76\x0c\x6c\x00\xb9\x08\x63\x98\x97\xf9\x10\x6a\x09\xca\xcb\x8e\x3e\x05\x9d\xc2\x34\x5f\xe6\xed\xa1\x69\x9a\xc6\xf5\xce\x8a\xda\xcd\x93\xb3\xc2\xbb\x38\x2b\x37\x69\xff\x38\xec\xed\xff\x2b\xef\x28\xa8\xa9\xa3\x2a\xad\x5b\xa1\x00\xfb\x72\x48\xb1\x5a\x6c\x56\x9f\x45\xbb\x19\xbe\xe0\x3f\xe0\x1d\x95\xc5\x38\xbc\xd9\xe9\x17\xba\xb0\x69\xf6\xc3\xe6\x61\x0f\xdf\xbe\xdf\x3f\xd3\x85\x7d\xf5\xdd\xab\x37\xfb\xef\xbf\x03\x31\x57\x7c\x2a\x8a\x44\x1b\xa6\x4f\xbf\x01\x59\xe1\xf3\x02\x54\x65\xa3\x80\x04\x03\x0c\x34\x28\x23\xa9\xe0\x1d\xc7\x08\x41\xdd\x76\x02\x36\x55\x95\x51\x78\x49\xc0\x98\x56\x58\x8f\xaa\xdd\x69\x68\xd4\xd2\x04\xd6\xf9\xba\x6e\x5b\xc9\x4d\x73\xb4\x47\xce\x15\xe8\x96\x13\x80\xc0\x9d\x60\x38\x66\xf2\x8b\x25\xb8\x45\xa3\xc2\x62\x53\x04\x1a\x92\x30\xeb\x63\x9a\x80\xab\x5f\x5f\xe2\x36\x73\x8c\xab\xae\x57\x26\x62\x67\xe2\x09\x47\x5b\xd0\x4b\x8e\x90\x5d\x3e\xc3\x46\x31\xec\xf2\x62\x98\xaa\xb6\x76\x35\xec\xb5\xd3\xad\x96\x08\xfa\xe1\xe0\x54\x09\x53\xd9\xf4\x04\x21\x56\xe9\x13\x50\xb8\xb4\xa0\x04\x63\x15\xe8\x54\x40\x21\xaa\x65\x0a\x47\x54\x31\x9a\xa4\x59\x72\xc5\x5e\xfd\xe9\xaa\x22\x73\x35\xe9\x89\x01\xca\xab\x37\xf7\x05\x78\x9f\xfc\x06\xbc\x40\x3b\x7f\xdc\x93\x7a\xc1\x35\xf0\x65\xd5\xe0\x12\x4f\x97\x05\x05\xa5\x15\xa6\x28\xf7\xb9\xe8\x2c\xd9\xba\x50\xc6\x12\xfb\x49\x08\xa4\xf4\xd2\xe9\x50\x05\x2a\x81\x00\x3d\x28\xce\x9a\x92\xba\x1a\x34\x51\x49\x9a\xc9\x47\xbc\xaf\x77\x2c\x81\x71\xff\x8a\x11\x5c\xba\x7b\x1e\x22\x3c\xc3\x54\x7e\xfe\x71\xfb\xe9\xf3\xc3\x77\x1b\xc1\xeb\xac\xc9\xa5\x96\xba\xd4\x1a\x15\xe5\xe2\x33\x8a\x46\xdb\xf3\xc1\xfb\x51\x1e\x6d\x07\xa0\x45\x41\xb2\x2c\x3f\xd3\x7d\x12\xf8\x50\xfa\xb2\x02\xc5\x72\x0c\x2c\x1c\x0c\x6b\x84\xaf\xa5\x13\x6e\x64\x87\x39\x4c\x09\xc8\x70\xc2\xb7\xc5\x8e\x24\x7f\x72\x8d\x79\xae\x9c\x8c\x4f\x9b\x03\x36\x83\xb3\x55\x7f\x20\xc7\x1d\x71\x8c\x7c\x99\x2b\x6a\x39\xe7\x9b\x09\x27\xc9\x06\xb4\x8f\x64\x4f\x32\x9a\x7c\xff\xb5\x0e\xf0\x7c\x6d\x8c\x80\xfb\xbb\x87\x77\x2f\x5f\xdc\xc6\x17\x9f\x13\x63\xd2\x24\xa5\x8c\x72\x0b\x3d\xae\xc6\x89\x00\x74\x08\x2c\xad\xd3\xfa\xf6\xda\xe9\x92\xef\xd3\x69\x99\x97\x41\x71\xc1\x65\x56\x5c\x12\x51\x95\xd1\x73\xbd\x3a\xdf\x80\xc4\x6b\x6b\x3d\x80\xee\xf2\x4a\x14\xee\x49\x9c\xb6\xc6\x03\x88\x98\x54\x8a\x49\x2e\x95\xbe\xc4\xec\x00\x1c\xa2\x2f\x62\x17\xef\x74\xec\x70\x7d\x25\x0b\x24\xd9\xd7\xcf\x7e\x53\x38\x7f\xbf\x51\x82\xa4\xd5\xe2\x99\x6c\xac\x72\x75\x3d\xa9\x00\x4f\xc8\x76\x1e\x4d\x23\x95\x4a\x02\xda\x06\x91\x16\x22\xeb\xb8\x70\xb5\x22\xca\x48\x62\xb5\x03\x05\x18\x89\x09\x06\x63\xcb\x09\x03\x8a\x56\xc6\x0f\x4e\xac\x7b\x72\xf9\x58\xed\x79\x46\xae\xb5\xcb\x04\xfc\x8c\x6f\x75\xeb\xa8\x71\xad\x31\x43\x8a\xf0\x2f\x93\x07\x22\xe5\x4b\x13\x1b\xb7\x19\x39\xb7\x42\x14\xbe\x60\xa9\x3f\xbb\x4d\x12\xc6\x50\xd8\xe3\x8a\x4d\xbb\xec\xab\x34\xb3\x57\xaf\xaf\x67\xf2\x71\x97\x85\xed\x12\x6e\x6c\x6c\x6a\xfc\xd9\xd5\xc0\xbb\xb4\xff\xd2\x65\xea\xec\x52\xd9\x2d\x35\xe7\xa9\x00\x07\x6f\x97\x61\xbe\xac\x51\xc5\x23\x8b\xda\x99\xe5\x53\x9e\xf7\x6d\x27\xf3\xf6\xfd\xea\xda\xea\x8c\x71\x0c\x96\xb2\x22\x90\x57\xf4\x31\x71\x93\x9b\xbc\x9f\x26\x60\x2e\x07\x48\x1e\x93\x0c\x9e\x4f\x5c\x14\xae\xa0\xa7\x48\x74\xf2\x40\x06\x9e\x75\xc1\x4c\x97\xaf\xab\x5f\xd1\x23\xcd\xa6\xdd\xaa\xf1\x77\x55\x99\x89\x0a\x33\x31\xfa\xbe\x5c\x98\xef\xb3\x9a\x85\x39\x34\x69\xb9\x1c\x72\x6b\x09\x05\x4d\x98\x80\x09\x76\x47\x2d\xab\x8e\x8b\x0b\x22\xcc\xca\x80\x26\x85\xa0\x47\xe7\x1a\x90\xf6\x72\xdf\xfb\x47\xba\xb7\x19\x8f\xd7\xfb\x49\x41\x2d\x2a\x84\xed\xf6\x71\x4c\x7e\xfa\xfc\x90\xc2\xb4\xcc\xeb\x3c\x15\xcb\xd1\x80\x89\x07\x58\x23\xdb\x85\x91\x03\xe4\x0d\x0c\x49\xea\xb9\x94\xdc\x07\xdf\xd6\x3d\x30\xad\x69\xa4\x13\x7e\xf5\x20\xf9\x55\x62\x1e\xc9\x16\x6d\xe8\x37\x3e\x31\x51\xe5\xe3\xd5\x8d\xe7\xfd\xb5\x27\xfb\xe6\xdb\xc8\x39\xbb\x0a\xfd\xef\x9f\xed\xd7\x63\x76\x1a\xe7\x19\x90\x2f\x1c\xc0\xe3\x71\x8c\x46\x44\xa0\x05\xe5\x82\x6f\xcf\xc6\x15\xe1\x82\x54\x37\xc8\x53\x9a\xd4\x96\x3b\xbf\xa1\xcb\x49\x1a\xa6\x35\x33\x12\x90\xa8\x79\xc1\x39\x0f\x83\x94\x23\x3b\x11\xc7\x04\x17\x84\x2b\x49\x93\x0c\x90\x47\xbe\x39\x6d\xda\xa4\xbc\x79\x6d\x3e\x51\x02\x5f\x46\x38\xcf\x4f\x2a\x1d\x5d\xcc\x1b\x4c\x68\x98\x14\xbc\xe4\x82\x04\x0a\x5c\x6d\x84\x52\x3a\x15\x82\x18\xcc\x37\x6d\x63\x3b\xb7\x1c\x24\x2b\x6c\xc1\xd3\xc4\xcd\x64\xb6\xd2\x77\xce\x53\xef\x92\x34\x99\x93\x63\x56\x67\x4d\x8c\xdb\xaf\xfe\x3f\x77\x0f\x73\xda\x2c\xbc\x06\x32\xf8\xac\x59\xb0\x07\x51\x97\x00\x00\x0c\x44\xd6\x64\x97\xbd\x72\x55\xaf\x7a\x07\x1a\x50\x9e\xf4\x14\xe6\x4c\x36\x47\x33\x35\x09\x00\x3a\x45\x9b\x22\xed\xa3\x7e\xea\xc3\xfd\x03\xd0\x31\xa3\xef\x7d\x92\xfc\x3a\x51\xa0\xdc\xd7\x3b\x99\x54\x57\x75\xa1\x95\x5f\xf5\x7f\x26\xff\x25\xb2\xd4\x62\x14\xfc\xe9\x56\x74\xfa\xf1\x97\xaa\x4e\x6b\xe2\xbc\x8d\x94\xe8\xb7\xef\xee\x3e\x7c\x7b\x75\x3e\xbc\x50\x1b\xba\xff\xe6\x72\x3d\x8f\xbf\xf6\x90\x74\x23\x57\x56\x72\x66\x8e\xe1\x30\xb6\x10\x1a\xc5\x6c\x09\x85\x20\x2a\xd6\xa2\x60\xdd\xa0\xb6\x09\x47\x68\xc4\x5c\x81\x6e\x99\x65\xa8\xa9\x22\x55\x49\x28\x0a\x52\xba\x5b\x05\xef\x76\x60\x2d\xb5\x34\xdb\x49\x51\x43\x54\xe0\x5a\x29\x69\xc2\x29\xca\x6e\xec\xa4\x41\xd0\xb0\xbc\x60\xa2\x0a\x53\x0f\x51\x85\xb0\x6f\x09\xc5\x45\x19\xec\xb5\x44\xc5\x60\xa1\xa5\x85\x86\x29\x68\x11\x5e\xa8\x09\x87\xeb\x3b\x85\x49\xbb\x9e\xcd\x74\xa2\x13\x9d\x69\x27\x85\xb1\xd6\x31\x6f\x49\x7c\x6e\x84\xa4\x2a\x7a\x15\xec\x13\x06\x6c\xec\xe3\xfd\x83\xa8\xe4\xfe\x2f\x63\x0f\xf8\x7f\x8d\x63\xe9\xc3\xc7\x48\x77\xb8\xff\x70\x05\x10\xfc\x01\x01\x95\x37\x3b\x10\xdd\x95\x7f\x07\x76\xfb\x6b\x83\xea\xdd\x4d\x14\xf2\x5b\x20\x83\x34\xd6\x2d\xcc\xd9\x94\xb8\x12\x02\xcf\x91\x94\x5e\x1a\x29\x1d\xf3\x8c\xd3\xbc\x90\x86\x13\x4e\xcb\x63\xfe\x65\x32\xf6\x31\x11\x20\xb1\xa6\x62\x86\x63\x31\x03\x98\xb2\xa5\x45\x69\x13\xa6\x69\x8a\x73\x08\x4e\x53\x98\x77\x7a\x6a\xc2\x09\xc0\x76\x42\x52\x9a\x70\x38\x18\x65\x84\xad\x99\xe1\xce\x36\x65\x29\x8f\xaa\xb3\x7d\x07\x81\xa3\x61\xee\xf4\xe8\xa9\x54\x8b\x03\x03\xaf\xf4\xa1\x53\x4c\x0b\xad\xb4\x56\x2b\x0f\x77\x9b\xf2\x47\xbe\xed\x76\x2a\x41\xc9\xbf\xbf\xf2\x4b\x6f\xfb\xe9\x55\xe5\xe9\xa5\x75\xf4\x9b\x74\xff\xfe\x7e\xff\xe3\xc7\xb8\xd7\x82\xab\xa0\xd7\xfa\x61\x2f\xbb\xcf\x95\xb0\xbd\x5e\x82\xbb\x4f\xe0\xe1\xc7\xf7\xbb\xe7\xa5\xf4\xcc\x13\xa9\x08\x29\x4a\x55\x95\xb8\xe0\xa0\xa5\xb2\xac\xca\x0a\x95\x65\x2e\x4a\x81\x75\x2e\x35\xf5\xa9\x2c\x42\x13\x38\xec\xeb\x70\x04\x70\xd0\xd5\x25\x65\xcb\x8b\xde\x73\x1a\x81\x87\x75\x50\xc0\x48\xc5\x40\x69\x10\xd6\x38\x18\x5c\x59\x88\x77\x4a\x61\x18\x6a\x88\x04\x45\x52\xeb\xc6\x04\xd4\x5e\xa6\x32\x40\x8f\x49\x83\x21\x2a\x0b\x5c\xb1\x14\x16\x3f\x95\x9a\x54\xb6\x28\x41\x69\x35\x21\xd6\x1c\x68\x51\x08\xa3\x31\xd7\x36\xcc\x45\x6a\x18\xe1\x01\x21\x4e\x31\xa1\x5c\x62\xc5\x93\x4d\x2a\x80\xda\xf3\x78\x8d\xfe\x59\x82\xa3\x27\xcd\x57\x9d\x96\x6f\x57\x9e\x5b\x24\xb6\xde\xff\xed\xc3\xfd\x55\x9f\x66\x1d\x41\xef\x5e\x48\x83\x10\x0f\x66\x3f\x4d\xa1\x4b\xf1\x15\xba\x88\x83\xf4\x41\xd7\x29\x0a\xdd\x38\xa6\x2e\xe4\x60\xce\x35\x53\x65\xa9\x38\xc3\xb0\x0a\x4c\x31\x55\x42\x4c\x38\x27\x10\xed\x14\xe7\xdc\x1e\xe4\x72\x58\x37\x28\x60\x97\x63\x0a\x97\x2e\x1d\xe4\xc1\x5a\x11\x8c\x6f\x31\xa9\x0c\xa7\x94\x60\xd4\x0c\x15\x25\x94\x72\xc6\x09\x8e\xda\x3a\xc0\xc6\x9c\xe7\x5d\xf2\x4f\xa3\x16\xf1\xdf\x25\x7f\x7f\xeb\xec\xde\x3d\xdc\xbf\x79\x02\x07\xbe\xdb\xaf\x6d\xe9\x67\xc8\xc0\x57\x91\x20\xf4\xee\xe1\xee\x9b\xcc\xf2\xd3\xc7\xbb\x87\xe7\xc8\xa5\x6b\x92\xd9\x7a\xeb\x41\xa2\xe9\x21\xb0\x88\x23\xac\xf3\x40\x97\x19\x82\x36\xb6\xf2\xd8\x04\x71\x03\xb0\x98\x11\x0c\x1a\xa5\x2d\xe8\xbc\xf7\xc2\xc4\xd4\x13\xa3\x40\x6b\x57\x61\x8d\x17\x58\x41\x03\xab\x4d\x27\xa9\x25\x72\xa7\x2f\x03\x23\x1c\x5d\xed\x84\x11\x50\xe3\xaa\x2e\xa5\x11\x8e\x53\x17\x46\xc6\xe8\x14\x1b\xfc\x8b\x56\xa2\xa8\x4b\x84\x53\x01\x64\x25\x09\xa1\x84\xb0\x8a\x92\x60\x6d\x8d\x6b\x93\x64\x29\x03\x2c\xf2\xca\xfe\x59\x52\xc5\x6e\xc7\x13\x1e\xea\x19\x2e\xea\x59\x96\xf1\xaf\xc1\x9b\xfb\x87\x8f\x57\x96\xc2\xf6\xe3\x9b\xfb\x6d\x04\x22\xbe\x6c\x75\x7c\xbd\xff\xf7\x6f\x3e\xa6\xac\x35\xca\x58\x23\xec\xe9\x54\x29\x68\x72\xd6\x29\x2a\x82\x56\x65\x23\x6d\xd9\xa4\x8d\x4d\x8f\x3e\x50\x70\xb8\xde\x7e\x1a\x3a\x17\x26\x07\xea\xa0\xec\x6a\xa5\xa6\x94\xd6\x56\x56\x98\x21\x4b\x31\x71\xd3\xd4\x28\xce\x94\xb5\xb6\x9b\x8d\x9b\x57\xc4\x2a\x8f\x17\xf2\x08\xbc\x33\x73\xc4\x81\x50\xd0\xc7\xf5\xed\x3e\xf9\x31\xf9\x9f\x93\xff\xed\x2b\xfb\xe7\xbb\x67\x1d\xf5\x57\x6f\xde\xdd\xda\x97\x4f\x2f\x3c\xb3\x85\x8e\x7e\xa6\x9f\xdf\xdc\x7d\xab\xb1\x11\xf9\x98\xeb\xaa\xb8\x45\xa3\x3f\x8e\xb2\x61\x9a\x7b\xa5\x65\xeb\xfa\x2f\xec\xe0\x0f\x07\xcf\x98\xf4\x72\xcc\x60\x85\x48\x15\x7c\x9a\x73\x05\x41\x82\xb0\xa2\x9a\x70\x52\x41\x42\xa0\x6a\xc4\x41\x9f\x40\x42\xd8\x40\xa0\x86\x78\x6b\xa7\xc9\x86\xa1\xae\xed\x78\x19\xc3\x27\xa7\x7a\x20\x2f\xaf\x9d\x7b\x70\x68\x8d\x3a\x00\x36\x54\x98\x12\xad\x8c\xaa\x94\x60\xd0\x06\x2e\x59\x69\x4b\x7e\x6c\x9c\x68\x46\xcd\xf9\x49\x2a\xaa\xe4\x25\xae\x01\xe6\x91\xef\xfd\x56\x3e\x69\x7e\xfd\x3e\xf9\x57\x09\x49\xfe\x97\x84\x5f\x75\x8a\xff\xa0\xa2\xc0\xf6\xa6\x26\xf0\xf1\xe1\x3e\xae\x82\xeb\x95\x79\xd1\xaa\xfc\x70\xa5\x7a\x3f\x89\x85\xae\x43\x3e\x9b\x6c\x51\x9e\x4a\x64\x28\x06\x2c\x34\x37\x20\x2f\x10\x67\x86\x10\x6b\x40\xbb\x5a\x7d\xc5\x82\x58\x6d\x2b\x6a\x51\xc5\x86\x14\x33\xa6\x89\x48\x9b\x98\x32\x9f\x07\x4f\xcc\x51\xe4\x45\xee\x72\x1b\xea\xa3\x1e\x8c\xd0\xda\x6c\x19\xc2\xb8\x42\x9c\x4a\x73\x59\xb7\xb5\x49\x13\x5c\xd9\x43\x1d\x69\x02\x93\xd6\x99\x42\xc6\x2e\x30\x2d\x70\x65\x8f\xe7\x89\x69\x2e\x25\xf2\x0d\x6f\x6a\x3c\xc1\xb2\x84\x85\x44\xad\xa0\x14\x14\x74\x54\xd2\x44\x4d\x44\xd0\x66\xd3\xce\xc4\xec\xe7\xf5\xfe\x87\xd7\x71\xd9\x7e\x3e\x8f\x57\x15\x9c\x77\x3f\x3e\x17\xc3\x59\xd9\x94\x57\x4f\xf8\x4a\x0c\xb8\x52\xcc\xba\x56\x49\x2c\xa1\xe4\x10\xe5\x53\xe8\x09\x10\x20\xc9\x8b\x31\x9c\x18\x28\x0f\xb8\x1b\x88\xd1\x08\x2b\x82\xdb\x0a\x8f\x63\x09\xd4\xce\x48\x46\x08\x92\xa4\xf2\xe1\xe8\x7d\xe9\x20\xa3\x45\xe9\x99\xa1\x0d\x82\x96\x5b\x62\x30\xae\x4c\x09\xab\x8a\x60\x82\x29\xa5\xc8\x46\x7e\x00\xd8\x18\x00\xf7\x22\xd6\x07\xd6\x55\xea\x6b\xc6\xf9\xf9\xd3\xdd\x9b\x5f\x83\xe8\x26\xb2\x69\x3b\x07\x64\x2e\x0c\x13\x85\xa2\xa8\x80\x87\x42\x6b\x75\xc8\xdb\xad\x00\x65\x38\x9d\x4f\x73\x69\x4b\xda\x83\x29\xf8\x20\x1a\x0d\x8a\x14\xad\x5c\x76\xb5\x5f\x7b\x33\x37\xbe\xe1\xbf\xff\x65\x7e\xe9\xf6\x89\x95\xf2\xb5\xb3\xfe\xb5\xdb\xfe\xd4\xe3\xfc\x99\x07\x25\x40\x0e\xc8\x88\xea\x71\xc1\xbb\x70\xd8\x50\x3a\xce\x29\x5a\x0e\xd1\xa2\xe9\x18\x60\x4a\x7e\x1a\x52\x11\x6b\xbb\x08\x1c\x96\x21\xc5\x01\xa3\x34\x09\xed\xcd\x5b\xf1\x3c\xdd\x9e\xad\xeb\x82\xe5\x5c\x4a\x69\x60\xc1\x0c\x5d\x0e\xdc\x72\x63\xb8\xe5\x29\xa2\x86\x16\x66\x69\x2e\x21\xf4\x10\x3b\x2f\x97\xbc\x88\x3c\x92\x88\x9d\xfa\xff\xc4\x6b\x10\x91\x27\xaf\x41\x54\x1e\x82\xcf\x01\x67\x0a\xf3\x52\xe1\xa2\x1c\xca\xa3\x12\x3a\x37\x20\x29\xff\xb8\xd7\xe0\x0a\x54\xc7\x27\x50\xad\x5e\x83\xbb\x84\x82\x3a\xd6\x33\x7e\x9b\xfc\x2e\xea\x31\xfc\x5d\x5c\x91\x6f\x51\xd8\xeb\xbf\x04\xbf\x64\x0f\xf4\xee\x17\x39\x22\xbb\xfd\xf3\xc1\xb1\x92\x44\x6e\x9c\xe7\x6d\x8c\xc2\x26\x59\x3a\x51\x4a\xca\xea\xda\x76\xb2\x37\x02\x57\x95\xea\x14\x96\xaa\xfc\xaf\xc7\xd9\x9d\xdc\x34\xb9\x93\x9b\x5b\x9b\x17\xa9\xcf\x59\x4d\x58\x21\x70\x55\xc0\x7c\xe9\x88\x10\x0e\x5f\x6e\x99\xeb\xfb\x9d\xae\x38\xb3\xe1\x70\xe0\x25\x86\x9e\x39\xcb\x2c\x33\xae\x67\x98\x83\x1c\x9d\xea\xe6\x38\x6a\xad\xb5\xb9\xfc\x50\xa8\x84\xcb\xe9\x58\x98\x1c\x4b\xc0\x04\x93\xc6\x85\x56\x5e\x75\x30\x0d\x20\x7b\xb5\x73\xc9\x9f\x5c\x31\x1c\xbf\x4f\xf0\xb7\x58\xf8\x6f\x9a\xf0\xcf\xf1\xfa\xdf\x9a\x91\x6e\x0a\x54\x66\xd0\xff\x44\x7c\x06\xab\x65\x48\x55\x1d\xfd\x4c\xf8\xd2\x64\xe8\x7c\xa8\xcf\x73\x96\x2f\x6d\xca\x16\x07\xb7\xfc\xa7\x66\xf5\x9e\xb0\x20\xb7\xa0\xd8\x39\x42\xc3\xa1\x6e\x40\xc5\x43\x4f\xa9\x61\x9a\x6b\x84\x34\xd7\x2c\x94\xc1\x1a\xb3\x3a\xa2\x6e\xaf\xfa\x42\xe6\xb9\x07\x0f\x78\x52\x53\xbc\x9c\xf5\x0b\x40\xcc\xe7\x0f\x77\x6f\x9e\x97\x50\x53\x3b\xa3\xca\x30\x7c\x5a\x14\x4e\xf3\x81\x28\x5c\x41\x4a\x60\xeb\xe6\x19\x54\x0c\xab\x8a\x85\xce\x50\x66\xe4\xd6\x53\xca\xa5\x71\xf5\x72\x58\x06\xc5\xa2\x9c\x37\xb4\xa0\x0c\xd0\x7a\x5a\xdb\x0a\x1d\x1c\x6d\xa2\xbf\xf7\xe3\xb8\x6b\x32\x76\xad\xbd\xfd\x0c\xf7\xfb\xf9\xba\xad\xfd\xf8\x7e\x9b\x93\x0a\x54\x06\x53\x2d\xb9\x92\xb6\x23\xb5\x54\x46\x68\x89\x61\x20\x20\x2f\x51\xc6\x08\x37\x5e\x33\xa1\x04\xf3\x4c\x53\xcd\x89\xb8\x84\x81\x06\xc1\x24\xc9\x32\xf7\x78\xda\xb1\xac\x88\xf9\xf2\x3f\xfc\xc3\x4e\x90\x71\xf3\xdf\x31\x42\xb0\x80\x12\xa1\xd0\x41\xa9\xac\xb9\xa1\xa3\xb3\x62\x31\xec\xb2\x75\x55\x95\x13\x4a\x03\x08\xe0\x51\x84\x5e\xc2\x95\xaf\x8d\xc1\x69\x4f\x9f\xfc\x01\xef\x7f\x69\xae\x46\x4d\x7a\xde\x96\x08\x98\xf3\x74\xac\xf4\xcd\x8f\xe9\x72\xec\x2c\x62\xf8\x5c\x64\x93\x08\xaa\x09\xb8\x09\xa4\x5e\xc7\x18\x03\x22\xce\xaf\xcb\x99\x7f\xfe\x6f\xa8\x44\x7e\xf7\xfa\xbb\x95\x17\x1f\x09\x9c\x77\x7f\xf3\xf9\xfe\x2b\x48\xe6\x67\x62\x7a\xdb\xd2\x91\x14\x6a\xe8\xf5\xc8\xba\xc6\x8f\xf2\x60\x25\xa9\x88\x1a\x25\xd1\xa6\xfc\x89\xa5\x1d\x44\x93\xe6\xac\xb1\xa1\x0e\x35\x6c\x9b\x94\x43\xb8\x1c\x5b\xd0\x06\x76\x3b\x76\xba\xea\x6d\x68\x0f\x46\x78\x5e\x7b\x6e\xb9\xab\x47\x46\x39\x40\x55\x98\xea\x7e\x02\x4c\x51\x6c\x97\x63\x6e\x8a\xa1\x8f\xc8\x19\x6e\x2b\x12\xbc\x0a\x8d\x0a\x1e\x8a\x24\xc9\x52\x79\xd5\x75\x29\x92\x87\x9f\xb1\x6f\xe3\xd6\xfe\xe6\x67\xd4\xdb\x9f\x2b\x8f\xff\x6b\xf0\x70\x1f\xeb\x2b\x57\x07\xf2\x57\x1f\xaf\xb1\x5c\xc6\x5d\x51\x02\x39\x61\xe8\x10\x29\x98\x94\x75\x86\x09\x66\xc6\xd3\x4b\x26\x21\xba\x0a\x3a\x78\xe6\x69\xe2\xa2\x37\x6f\x22\x44\x2c\x28\x55\xc1\x9f\x00\x63\xe1\xd0\xbb\x63\x98\x39\x10\xc7\xd0\x3a\x70\x0c\xc9\xce\x42\x82\x8d\xd0\x95\xd3\x5e\xe9\xa6\x34\x5c\x36\x07\x84\x2b\x23\x75\xe5\x4f\xc6\x58\x1b\x86\x35\xa6\xb7\x36\x74\xba\xb6\x20\x09\x18\x8c\x61\x32\xb6\x01\x95\x0d\x1e\xcc\x36\xd9\x25\x16\xa0\x18\xbf\xfe\x2a\x79\xb8\x2a\xed\xff\xfb\xaf\x18\xf8\xcb\x74\xfb\x23\x77\xf7\x86\x80\xcf\x1e\xee\xf7\x9f\xfe\x10\x04\xbe\x2a\x81\x3e\x53\xe0\x4a\x98\x55\x7f\xf4\x2e\x9b\xf4\xb0\x20\x07\xba\x40\xfb\xac\xf0\x5a\x96\xc1\x69\x45\x69\x89\x99\x0c\xaa\x04\x8d\x95\x4b\xbb\x33\x94\x5b\x8b\x31\xfa\xa3\xf7\xba\x08\x83\x14\x61\xb6\xa2\xc8\x0d\xd4\x84\x96\xb6\x2c\x19\xb4\x65\x81\x49\xc4\x51\x18\xd0\x5d\xc7\xf1\x3f\x4a\xfe\x26\xf9\xb7\xc9\x7f\xf8\x8a\xc1\xbd\x7b\x0e\x18\x7d\x75\xf7\x70\xe3\x68\x3e\xab\x9c\xfd\x78\xd5\xd6\x7f\xf7\x07\x25\x77\x5b\x60\x3d\x30\xc1\x0c\xb5\x30\xd6\xbb\x81\x4e\x6d\xd0\xbb\x9c\x22\x85\x68\x48\x00\xce\x5d\x0e\x54\x68\x19\x80\xf2\x24\x71\x98\x14\x40\x30\x8c\xe7\x83\xc9\x0b\x4a\x58\x85\x2b\x2a\x5c\xaa\x4c\x5e\x4a\xc6\x09\x45\x95\xd4\xdb\xd9\x18\x17\x84\xae\xb5\x15\xa1\x05\x7c\x34\xd6\x82\x1c\x68\x90\x33\x41\x05\x3b\x9a\xda\x5b\x17\xd4\x64\x46\x40\xc3\xf1\xa4\x4e\xc0\x9b\x92\x12\xc2\x25\xc5\x8a\xf3\xf6\x58\x32\xc2\x84\xe2\x94\x11\x51\x47\x4e\xd7\x08\xba\x18\x0b\xfd\x76\x75\x2e\x7e\xc1\x89\xfc\xbc\x59\x8b\xd5\xd7\x5a\xc5\xfe\xc7\xf7\x9b\xa3\xc3\x29\xc2\xa8\x11\x0e\xf6\xac\x42\x79\xe8\x1f\x13\x0a\xfc\x1c\x30\x53\xb2\x33\xc6\x60\xad\x77\x1a\xfa\x05\xb7\xee\x12\x52\x8f\x0d\xb3\xda\x02\xea\xa5\xec\x6a\x88\x2d\x85\x91\x43\xe3\xb6\xed\x93\xf7\xf6\x3f\x79\xc1\x25\x7b\xbe\x0d\x3d\x44\x0d\xcc\xab\xa8\x7a\x74\xec\xfb\xf1\x7d\xea\x00\xf6\xb1\xb5\x50\x2c\x1c\x24\x61\x40\x69\xb7\xd0\xfa\x72\x99\x73\x8a\x09\xc6\xa5\x87\x88\xd1\x32\xf0\xd0\xd1\x63\x45\x23\x0e\xbb\xb6\xb6\x0e\x3c\x30\x5b\x87\xbe\xe9\xf3\xa2\x69\xa0\x33\x65\x61\x35\x76\xa8\x8b\x3e\x5f\x9b\x02\x1c\xf7\x36\x6a\x1c\xac\x1d\xa9\xe7\xae\x17\x0f\x77\x2b\x96\xe4\xe3\xc3\xfd\xa6\x30\x1e\x48\x2f\xc4\x22\x4d\x6a\x62\x05\xd7\x6f\xf5\x3c\xcf\xb3\xbb\x6c\x86\xd3\x34\x05\x3d\xcf\xb1\x2e\xd4\x46\x8f\x82\x6d\xf2\x0f\x92\xbf\x88\xf8\x87\xcf\x51\xc1\xf9\x79\x55\xec\xf5\xaa\x20\xf2\xfe\xaa\xda\xf9\xee\x2b\xef\xf2\xed\xbb\xd7\xfb\xef\xb6\xb7\xe7\xd7\xab\x91\x8e\xa3\xe5\xa6\x0b\x07\x6b\xbc\x69\xb2\x93\xab\xc0\x89\x61\x4d\x50\xd0\x98\x18\xb7\xd4\x16\x9f\x1a\xde\x4c\xcd\xc4\x01\xcc\x4e\x1e\x1a\x80\xc4\x6c\xc5\x20\x40\xf5\xe5\x90\xba\x45\x5d\x72\x3b\xb7\x33\x4c\x1b\xcd\x15\x3d\x19\xe5\x9a\xaa\xd6\x45\xcb\x18\x17\x5a\x88\x91\x50\xaa\xbd\x6d\x4c\xe7\x4d\x83\x8b\x21\x1c\x6b\x53\x9f\x0e\x5e\x1f\xdc\xe5\xda\x25\xd1\x0f\x1c\xd8\xfd\xca\xfd\x5e\x6b\xbc\xff\x3c\xf9\x37\xc9\xff\x10\xf9\x32\x0f\xdf\x02\x58\x2f\x39\xfc\xf6\xc9\x17\xe2\xfd\xc3\xfd\xc3\xf6\xe1\xfe\xe1\x8a\x83\xfc\x76\xad\x7c\x2e\xc9\xbd\x91\x60\xae\xeb\x9a\x1b\xad\xa0\xd6\xb8\x0c\xf9\x92\x28\x27\x33\xe6\x96\x43\x8a\x02\x4e\xd9\xd2\x66\x9a\x13\x87\xf9\x79\x4c\x0f\xe1\x48\x55\x55\x95\x04\xa3\x70\x48\x39\x27\xba\xe2\x41\x49\x2a\x18\xdf\x9a\x79\xb6\x8b\x52\x1c\x7a\x84\xaa\x54\xc1\x31\xd4\x61\x5a\x15\xac\xa7\x50\x1f\xc5\xa8\x55\xdd\x91\xde\x5b\x1d\x26\xce\x72\x9b\xe3\x19\x1a\x47\x9d\xad\xa8\xe7\x42\x24\xbf\x02\xea\x91\xed\x9b\x0c\x3f\xf9\xb5\xbf\x4a\x7e\x93\xfc\xee\xa9\xdb\xf3\x33\x04\xc8\xf6\x97\xd2\xbb\x4b\x72\x07\x7f\xfc\xf8\x7e\x0d\x59\xf0\x66\xf8\x82\xe3\xba\x90\x16\xc0\x9e\xe5\xed\x59\x28\x8c\x14\x42\xa5\xc6\x68\x23\xdc\xf9\x58\x4b\x35\xd1\xc2\x95\x26\xf4\x61\x56\xbd\x96\x5e\xb8\x0c\x2f\x27\x40\x79\xf4\xb3\xe5\x7c\xc2\x4c\x72\x4c\x75\x23\xbc\xa3\x23\x2c\x2b\x81\x3c\x23\xec\xc4\x1a\xa9\x65\xb2\x4d\x04\xa8\x63\xee\xbe\x4d\xbe\x4b\x7e\x97\xfc\x93\xc8\xe2\x58\x0d\x0c\x9f\xad\x52\x6f\xc1\xf3\x25\x6b\xfb\x94\xa9\xbe\x7d\x77\x75\x56\xfd\x5b\xb0\x7f\x03\xdf\xbe\xff\x7e\x15\xd7\xba\xfc\x6e\x5a\xb8\x3a\x1c\x05\x28\x52\xe1\x0a\x24\x05\x15\x92\x19\x05\x92\x94\xb9\x02\x7a\x43\x9c\xa5\x52\x1d\xcf\xd8\x51\xe5\x05\x15\xa0\xca\xa8\xbf\xac\xe7\xfe\x38\x54\x3e\x34\xc1\x6b\x29\xe5\xa9\xf4\x39\x14\x6e\xa7\xd9\x5c\x9b\xa6\x87\x92\x13\xe6\x05\x31\x52\x8d\xa0\x80\x82\x09\xe5\x2d\x57\x42\x0d\x92\x29\xbd\xf4\xa0\x63\xc8\x0c\x85\x73\x63\xe9\x8d\xce\x3d\xb3\x35\x20\x85\x91\x12\x5f\xb5\xf9\x01\xdf\xeb\x9d\xbe\x44\x22\xaf\xbe\x0d\x70\x1f\x3e\x3e\xff\x7e\xf9\xde\x87\xbb\x97\xef\x5e\xbf\x1b\xc0\x5d\x84\x9a\xc0\x70\xbc\xac\x36\xe9\xaa\xe0\x77\xc9\x55\xda\x1b\x8c\xfc\xf2\x96\x0c\xbe\xfb\x09\x6d\xc9\x4f\xc7\x2d\xfc\xa9\x03\x65\x94\xfb\xbd\xfc\x56\xb3\x83\x9c\x5b\xae\xb9\x95\x32\x3e\xdc\xfe\xb5\x1c\x0c\x33\xcc\xc6\x17\x93\x4d\xa2\xc0\x21\xe2\x40\xfe\x3a\xa1\xb1\x66\xfa\x5c\x4f\x3c\x16\xce\x9e\xcb\xcc\xde\x7d\xe3\x78\x75\x59\x9c\xc1\x1f\xad\x2e\x5f\xe7\x55\x0b\xac\xf3\xb0\xd2\x04\xc9\x36\xb8\x0a\x32\xe4\x98\x30\xc2\x09\xcf\x8c\x60\x50\x70\x0c\xdd\xa0\x40\xd1\x05\xbd\x61\xb6\x28\xd3\x5c\x21\x63\x06\x32\x3a\xdd\x8a\x46\x71\x5e\x42\x65\x25\xd5\x02\x86\xc3\x39\xa1\x95\x41\x6c\xdb\xf5\x3d\xc1\x94\x50\xec\x46\x08\xa5\xa8\xac\xd0\x9a\x7b\x17\x26\xc9\x2f\x6b\x70\xd5\x19\xa5\x9d\xbb\xcc\x35\xc8\x85\x0b\x87\x4e\x12\x4f\xad\x61\x86\x6a\x59\xe3\x4a\x1e\x69\x63\xfd\x81\x48\x8d\x63\xa9\x25\xc9\xb2\x63\xd2\xec\xc5\xce\x5c\xd1\xd5\x97\xdd\xe8\xc3\x0b\x0f\xbc\x37\xab\x52\xfa\xda\x2f\xd9\x18\x07\x9d\x8f\xf9\x23\x3d\x37\x40\xf7\x18\x2b\x09\xd3\x76\x61\x71\x6e\xed\x28\xac\xe7\xd9\x85\xc9\x39\x50\x58\x29\xfb\xa5\x59\x46\x0b\x60\x12\x71\xba\x34\xf2\x28\xff\x3b\xf8\x3f\xcf\xf9\x05\x29\x03\x70\x6d\x46\x25\x8f\x11\x24\xe8\x2e\x77\x7c\x9e\xc3\xb1\x55\x0a\x24\x3a\xd8\xf8\xf0\x87\x19\x40\x6d\xdb\xae\x9a\xe4\xa0\x8e\xb5\x82\xaf\xe7\xf1\x6f\xff\xfb\xd8\x6c\x57\x84\x55\xec\x43\xde\x9c\x57\x0c\xf0\x3e\xf6\x47\x44\xa8\x81\x0d\xda\x47\x86\xdb\x65\xe5\x97\xdd\xf1\x08\xf4\xb8\xac\x0f\x59\xc7\x63\xb5\xb8\xf7\xc7\x56\x59\xa0\x76\xa5\x10\x56\x2c\x27\x66\xbd\xb7\x2c\x2d\x45\x18\x29\xa5\x61\xa2\x94\xa6\xd6\xd2\x62\xb4\x8b\x4a\x5d\x11\xea\x70\x12\x20\x01\x25\x98\xf2\x24\xd9\x27\x51\xbb\x6f\x5b\x5e\xfb\xa4\xff\x3c\xf9\xf0\xa4\x22\xf1\x95\x2d\x96\x3d\xb1\xc5\x9e\x91\xc5\x3e\xfc\x01\x64\xf3\xb5\xde\x2b\xb6\xd5\xa2\x50\x95\x8d\x81\x35\x80\xd0\x60\x0f\x51\x17\xa5\x91\xa0\xe8\x83\x48\xb9\x0c\x65\xbd\x49\xce\xc9\xe5\x00\xbc\xa6\x3a\x6a\x76\xc0\xc9\xd4\x8d\x1e\xd2\xc6\x0a\x4f\x2d\x18\x2e\x03\xdc\x6e\xcb\xe5\x50\x21\xdb\x12\xcf\x41\x75\x72\x56\x38\xcb\x01\x15\xe1\x20\x42\x12\xb0\x62\xd0\x23\x0a\x30\x7d\x4c\xbc\x6a\x9a\x66\xa4\x43\x07\xeb\x9e\xf6\x4d\x5c\x57\x2c\x38\xed\xe5\xce\xc6\x68\x78\xc5\xa7\x3c\x35\xcc\x9e\x2c\xb6\x37\x4f\x08\xee\xdb\x9b\xc9\x2f\xbe\x79\x55\xee\x7b\xf8\xb4\x65\x2d\xe4\xe0\x18\x1a\xe1\xb5\xe0\xd4\xcd\xe1\x00\x1c\x84\x5a\x10\x53\x16\x61\x0c\x35\xea\x5b\xeb\xcb\xce\x2c\x48\x3a\x2d\x18\x73\x8f\x49\x38\xfe\xf2\xaf\x04\x03\xc6\x8a\x78\x86\xc0\x91\xed\x2c\xa6\xc2\x75\xa6\x80\x5c\xe0\x30\x8e\x94\x62\xdc\x0c\x98\x60\x82\x8c\x6a\x50\xa1\xcc\xd8\xeb\xf5\xcd\x61\xf8\x85\x37\x1d\xa7\x58\xaa\xe8\x85\x2e\xc1\xaa\xcd\xb4\x76\xbf\x3f\x25\x74\x75\x26\x59\xfb\xd1\x3f\xf7\x2f\x88\xcd\xe9\x9b\xf1\xef\xf7\x7f\x0b\xee\xd7\x1a\xf7\x2a\xe5\x9e\x7d\x0b\x90\x7e\xf3\x21\x02\x25\x2d\x89\x8d\x6c\xb6\x34\x79\xaa\x73\x69\x2a\x5e\x4a\x8c\x60\x1e\x60\x21\xb4\x02\x4d\x38\xad\x86\xb1\x01\x6f\x31\xee\x8e\x8c\x4d\xf9\x28\x24\xcd\x75\x56\x48\xef\x06\x76\x6c\xeb\x91\x76\xd6\x30\x72\xa0\xda\x92\x9d\x55\xb8\xc4\xcb\x91\x3f\x26\xae\x34\x25\x96\x75\x23\xeb\xd4\x00\x56\x06\xc5\xc2\x91\xa7\x45\x98\x98\x65\xbc\x0b\xbd\x90\xc4\x9f\x96\x5e\x1e\x34\xab\x3c\xd5\xa2\xb2\x88\xac\x3a\xb3\x97\x18\x47\x81\x76\xcf\x77\x22\xd9\x3e\x43\x83\x7e\x7c\x16\xbd\x3d\xdc\xef\xb6\x71\x85\xb8\xcc\xcd\x27\xa8\xcc\xa7\xcf\x0f\x97\x08\x31\xc6\x39\x1f\x1f\xee\xdf\xad\x78\xd0\xcb\x58\xbe\xfa\x8c\x34\x56\xba\x3a\x2d\x36\xb0\x0d\x73\x9a\xd4\xc1\xd5\xa1\xad\x41\xcb\x38\x57\xa2\xb3\xe7\x21\x1b\xe2\x4b\x80\xa5\x45\x70\xa1\x00\xec\x5c\x35\x4e\xf8\x06\x68\xa3\x46\x7f\xd8\x09\xc2\x8c\x20\x52\x6b\x71\x6e\x40\x31\xcf\x61\xca\x78\x85\x78\x55\x61\x16\xb0\x94\x52\x1e\x2f\x3f\x24\xb0\x94\x6b\x49\xc3\x89\x8f\x83\xea\x92\x64\x03\xf8\xa3\xdc\xd7\x80\x5f\x63\xd1\x87\x6f\xf8\x32\x1f\x5e\xfa\x55\xad\x25\xe8\x5d\x67\x45\xcd\x4c\x40\x11\x6a\xf2\x98\x38\x5a\x1f\x69\x5e\x17\x26\xf4\xb3\xe9\x0d\x73\xd6\x01\xde\x8c\x6c\xe8\x2b\x22\x94\xa4\x3c\x4c\x25\x24\xbe\x1a\x14\x65\xa0\xe2\x6d\x13\xd3\x8b\x64\x93\x68\xe0\x22\x16\xeb\x5f\x26\x7f\x1f\xd5\xf6\x2e\x63\x68\xff\x34\x4b\x7e\xb9\xe7\x7c\x6d\x0f\x5c\x75\xb8\xdf\x82\xd7\x5f\xc9\x12\x2f\x45\xef\x3f\x7f\xfa\x78\x77\xf9\xa5\xe7\x51\xf5\xae\x95\x61\x6e\x95\xd4\x86\xf3\xcb\xb4\x99\x4f\x53\x55\x19\x2f\x2c\x44\xd6\x33\xcd\xd9\x65\xaf\x3a\x9c\xd0\xb1\xf3\x0d\xac\xf5\x81\xa5\xe8\x9c\x08\x41\x43\x9e\xb6\xa6\x31\xb2\xd4\x96\x39\x46\x21\x17\xb0\x2c\x26\xe8\xf5\x36\x71\xd6\x28\xbf\xcc\xae\xee\x74\xbf\xd3\x8a\x15\x9e\xe4\x05\xe5\x28\x1c\x6c\x09\x71\xc5\x5c\xcb\x30\x2e\x8b\x30\x89\xcb\xce\x47\x8f\x65\xa1\x99\x29\x73\xc5\x74\x69\x48\x98\x72\x2e\x9d\xe9\x5d\x59\x94\x0e\x96\xe1\x72\x06\x0e\xe6\x05\x04\x0c\xd5\x45\x19\x7a\xe1\x84\x31\x98\x3a\x26\x79\x9c\x77\x5d\xc4\xab\xfe\x79\xf2\x8f\x93\xdf\x5f\x5d\x81\x7e\xce\x0c\xbd\xff\x3a\xc5\xfe\x0c\xac\x73\xec\xcd\xc7\x6f\x66\xd9\xeb\xd8\x59\x7b\xd2\x6a\xbc\x7f\x90\xa0\xae\xa3\x19\x27\x3c\xcf\x80\x06\xb1\xa3\x58\xd7\x9c\x9d\x72\xae\x84\x20\x79\xc9\xd2\x91\x1b\x37\x54\x73\x5b\x0f\xb4\xb3\x6a\x12\x24\xf4\x34\xd4\x7e\xa9\x3d\x4d\xe7\x25\xdf\x9e\xbc\x77\xda\x39\x3d\xcf\xdc\x72\xd6\xb4\x1e\x2b\x6c\x0f\x8b\xb0\xb2\x93\x04\x39\xa4\x25\x32\x88\xc8\x92\x09\xd9\x84\x43\x5d\x03\x14\xa2\x5d\x58\xf4\xef\xe6\x7b\x93\x8d\xc9\x5f\xde\xaa\x0a\x2f\x8c\x7c\x3f\x3e\xdc\x7c\xea\x7e\x7c\xbf\xa5\x08\x82\x69\x81\x30\x75\xdc\x29\x5f\xd4\x0a\x15\x70\x39\x89\x4b\xc4\xc9\xab\x30\xa6\x45\x09\xb3\x91\x4b\xd7\x04\xdc\x22\x87\x90\x1c\x42\xdf\xda\x01\x1c\x1c\x23\xab\x9f\x34\x50\x71\xed\xaa\x9e\xbc\x31\xef\x1f\xbe\x7b\x1d\x4d\x59\xff\x12\x3c\xf5\xe0\xae\x97\x29\x7b\xb8\x2b\x56\x93\xed\xdf\xbf\xff\xf0\xc3\x35\xf2\xba\xc9\x58\x46\x14\x92\x58\x66\x44\x2d\xb5\xc6\xf1\x0a\x42\xe8\x73\x25\xa4\x67\xd2\x5a\x69\xaa\xf3\xc1\x3b\x97\xb5\x79\x9d\xcf\x15\x91\x8a\xfd\x74\x48\x0f\x0b\x42\xd1\xf1\xf9\x12\x24\x6e\x47\x17\xc6\x76\xe8\x50\x38\x8e\xaa\x72\x0e\x4d\xed\xa0\xa4\x34\x66\x06\x2a\xd8\x30\x4c\x7c\x06\x08\x74\x9c\x71\x86\x2b\xc6\x45\x98\xac\xbe\xe6\x5a\xdb\xe4\x00\xda\x18\x1b\x96\xc9\x5f\xc6\x6e\xc2\xbf\x7b\x56\xc5\xfe\xe5\x68\x0f\xac\x7e\x50\x97\x4f\xb9\x52\x86\xdf\x3f\xdc\x10\x5d\xaf\x2f\xeb\xd1\x8f\xef\xdf\xdc\x6f\x93\x6b\x80\xa7\xd5\x48\x46\xa7\x1a\x51\x4b\x45\x9e\x05\x78\x61\x08\x87\x02\xe0\x70\x84\xaa\x44\x85\xab\x2c\x1d\xab\x30\x3b\x85\xfa\x96\xba\x34\x0f\xa7\x22\x3f\xec\x74\x0c\xea\xfa\x5a\x50\x4f\x8d\xbe\x04\x75\x4e\xc7\xa0\xae\x76\xee\x08\x60\x90\xde\xa8\xba\xc7\xe1\x38\x75\xe1\x54\x11\x23\x09\xdb\x54\xc6\xfb\xc0\x28\xf3\xc9\x3e\xd1\xa0\xdf\xdb\x6b\x7e\xfc\xe7\xb1\xfa\xf0\x2f\xaf\x58\xcd\xed\x53\x24\x70\x95\x6d\x7f\xd9\x39\xfb\xd6\xe8\x71\x45\x9b\xa4\xa5\xed\xc2\xcc\x8f\x69\xe9\x8d\x32\x0e\x8c\xa9\x5a\xdc\x42\x2c\x13\x8e\x31\x3e\x81\xde\x69\xa5\x2d\x38\xa5\xc7\x63\x8c\x78\xa5\xac\x42\xdd\x1b\x39\xb8\x61\x67\xe8\xc1\x59\xd9\x32\x69\x0d\x2f\x1d\xa5\x5a\x2d\x0d\x18\x28\xb1\x1e\x14\x54\x58\xcd\x72\x1f\xb8\x12\x45\x53\x32\x60\x39\x3f\x8e\x72\x58\xb1\x5a\x06\x74\x7b\xb4\x25\x31\x5e\x4d\x5e\x3d\xdc\x34\x09\x9f\xf8\x26\x6f\x3f\x47\x80\x7b\x9d\x52\x46\x1a\x84\x33\x79\x2e\x38\xce\x8e\x5f\xb8\xb2\x11\x2d\x4b\xc1\x21\x33\x67\xb3\x71\x9c\x23\x42\x1d\x47\x01\x03\x4c\x89\xb6\x3e\x90\x76\xad\x8d\xef\xeb\x9d\xbb\x7a\x4c\xc2\x9b\xcb\xeb\xb3\xbe\xca\x5a\x9b\xd9\xde\x3d\xdc\x6d\x57\xab\x94\x6f\xfc\xf3\x5e\xb4\x93\x33\xe3\x8a\x32\x73\xca\x33\x0d\x1b\x82\xab\x73\x4b\x85\x6c\xd2\xe3\xc2\x53\x18\x24\xf0\xe7\x3e\xed\x6b\x73\xee\x37\xa8\x1e\xd3\x62\x99\xb8\x10\xac\xa4\x9c\x2e\x64\xe7\x60\x55\x2d\x6a\x2a\x4c\xd1\x82\x51\x50\xad\xeb\x50\x82\x53\x4f\xa9\xa4\xf4\x7c\xe4\x94\x59\xaf\x44\xe1\x1c\xa1\x85\x2d\x4a\x9d\x6c\x12\x01\x64\xac\x27\xbe\xbf\xaa\x6f\x26\xaf\x1e\xae\x97\xe7\x7a\x89\x62\x68\x18\x35\x98\x6e\x32\x7e\x6b\x80\x08\x9e\x14\x9a\x2f\xc1\xc4\x98\x36\xd0\xe7\x45\x56\x9e\x7b\x94\xe5\xe7\x16\xc2\x0d\x0a\xb5\x03\xb9\x56\xe2\x0b\x9b\xd9\xa9\x09\x35\x98\x10\x0a\x02\x4c\x68\xb1\xc0\x67\x18\xa1\xc5\x54\x32\xb3\x67\x7d\x39\x76\x50\x14\x15\xb4\x5c\x63\x64\xad\x76\x94\x06\x0b\x9c\xd1\xca\x58\x84\x35\x5f\xa6\x0a\x55\x8f\x89\x08\xe3\x65\x77\x64\x69\xb2\x2f\x22\x26\xff\x99\x0b\xcc\x75\xe5\x7d\x56\x0f\x7c\xfb\xea\xe1\x39\xd1\xe2\x72\x58\x20\x22\x32\xd1\x3b\xcd\x84\xd3\x9d\x04\xb9\x09\x6d\xa6\xb3\xe2\x3c\xb9\x1b\xd1\xe2\x72\x6c\xdd\xe9\xe4\xa8\xef\xb4\x35\x21\x4f\xf3\x43\x6b\x8e\x00\x02\xf4\x65\x4a\x0f\x4d\xa8\x9a\x80\xeb\x64\x93\xce\x8f\x7a\xaf\x77\x55\xb2\x8f\x3a\x3d\xbf\x5f\x71\x8c\x97\x84\xe0\x29\x4b\xf9\x7e\xbd\x88\x9b\x17\x32\x88\xff\x1a\xbc\x30\xe5\xdf\xf3\x33\xce\x4e\x5f\x0c\x48\xae\x2a\x00\x39\xf0\x81\xe6\x39\x48\x3a\xd1\x0f\xf2\xc8\x27\x16\x3a\xa0\x8a\xd0\xa7\xc6\x62\x62\x68\xc0\x04\xda\x92\xec\x2a\xf7\x93\x74\xbb\x2e\x98\xae\xb3\x33\x21\xae\xc8\x6b\x6f\x7b\x3b\x7a\xdb\x0c\x8e\x90\x19\x23\x27\x88\x12\x42\x57\x26\x6a\x9b\x01\x09\xc4\x4e\x66\xc3\xb3\x1a\xc9\x2f\xd6\x46\x80\xdc\x26\x5f\x92\x98\x94\xa4\x08\xf8\x33\xb9\x3d\xcb\x86\xc5\x03\xa5\x94\x0a\x75\xec\x0a\x25\x49\x96\x68\x30\xed\xf5\xce\x26\xdb\xe4\x37\x57\xa5\xc3\x88\xd9\xff\x9a\x19\x7d\x8c\x9d\xdb\xbb\x87\x37\x5f\x2b\x16\x29\xb3\x7d\x38\x28\x50\x02\xb7\xb9\xcc\x25\x1b\x34\x98\xbe\xe0\xd8\x97\xaa\x06\xc7\xac\xe7\x54\x02\xba\xb3\xb4\xf5\xca\x42\x77\xf0\xe1\xe0\x5c\x54\x96\xf0\x4c\x9b\xa5\x03\x23\x45\x76\x88\xfb\x95\x7b\x24\x1b\xbd\xa3\xb1\x6b\xf2\x70\xf7\x90\xbd\xa0\x2a\x45\x5c\xb2\x03\xc7\x70\x2c\x01\xa9\x9c\xa5\xa4\x94\x55\xc5\x61\xe8\x31\x28\x42\xb7\xa3\x4b\x1b\x86\xc5\x87\x53\xee\xf3\x1e\xf8\x94\x83\x6a\xc5\xdb\x27\x7b\xbd\x53\xc9\x5f\x44\x85\xb2\xab\x90\xfb\x6a\x73\x73\xfd\x08\xef\xd6\x1c\xf7\x25\x53\x2a\xfa\xdc\x5f\xb6\xc7\x48\x53\x79\xb5\xfe\x46\x61\x4b\xe5\x86\xa1\xaf\x94\x71\xce\x53\xa0\x6a\x44\x8c\xca\xb4\x2b\xca\xb4\xd7\x0d\x15\xc8\x11\x56\x20\x85\x03\x96\xa0\x41\x42\x85\x89\x1f\x84\xa2\x5c\xd6\x3b\x58\xf1\xc3\xc1\xcd\x95\xad\x60\xf0\x00\x43\x54\x33\x80\x8c\x64\x3d\xc0\x88\x90\x85\x45\xba\x14\xb3\xa0\x5d\xc6\x83\x19\x40\x1f\xba\x5e\x79\x90\x28\x26\xd6\x1a\x20\x7b\x14\xfb\x3a\x5b\xf9\xd7\xbf\x4d\xfe\xc9\xd5\xe7\xf8\xdf\xbd\x8c\x2b\xb7\x2f\x19\xd8\xab\x31\xfa\xe7\xaf\xff\x5e\x53\xbe\x9f\x25\x7e\xdb\x41\x13\x45\xd4\x79\x52\x97\x87\xac\x70\x84\xa3\xdc\xe5\xbc\x33\xec\xac\x3d\x11\x45\x91\xbb\x9c\xf5\x86\xa7\xa3\x2d\xb9\x61\x67\x1f\x1f\x76\x42\x10\x43\xc4\x92\x10\x6c\x11\xcd\x90\xf1\xd4\x1b\x1a\x7f\xda\x65\xc0\x55\x5b\x1d\x04\xe6\xa9\x5c\x06\x5c\xc2\xa6\x1a\x25\x61\x69\x02\xc3\x71\xa6\xf3\xbc\x3e\xf4\xf5\x80\x87\x1a\x4b\x83\x8d\x4c\x76\x49\x0b\xf0\x5e\xc6\xba\xf8\x8d\xcf\xf4\xd7\x2f\x72\xf3\x37\xb7\xe4\xee\xdd\x8d\x6e\xf5\x0d\xa0\xf5\xfd\xc3\xfd\xa7\x3e\x3d\xd5\x97\xc0\x29\x15\x95\x13\x0e\x91\x45\x9d\x4f\x65\x3a\x2f\x75\x2a\x96\x12\x94\x60\x0c\x55\xaa\x40\xff\x65\xbc\x3d\xcb\x55\xe8\x4e\xbb\x5c\x29\x2b\x17\x67\x1d\xa7\x14\x43\x0f\x4d\xaa\x64\xf4\x99\x5e\x7f\x34\x42\xe7\x71\x8c\x26\x8f\x7c\x33\xee\xd8\x8a\x14\xde\x6d\x6f\x5c\xbd\x5f\x83\xfd\x95\xac\xa7\x79\xff\x98\x00\xc3\xbd\xcb\x29\x53\x98\x02\xbc\x63\x96\xc0\x2b\x5f\x2f\xe0\xa0\xbc\x30\xa0\x4b\x11\x18\x60\x02\xd2\x43\x5a\xed\xd9\xce\xaf\x9d\x80\x17\xfb\xcc\xab\x37\x29\x78\xff\xdd\xab\xd5\xed\x3e\x0e\xc0\x6c\xf0\x05\xcc\xa0\x30\x98\x42\x8e\x11\xca\x3d\x0e\xb3\x3e\x62\x4d\xc3\xa8\x41\x4e\x15\x13\xaa\xd9\x79\xc8\xd8\xc2\xe6\xd2\x97\x3a\x2d\x02\x09\xad\x06\x08\xa8\xa0\x2e\xbf\x93\x00\xda\x28\x35\x26\x20\xcd\x1f\xc9\xe6\x10\xd7\xdd\xaf\x5a\x67\xb7\xf5\x76\x95\x03\x49\xdb\xb6\xae\x6b\x2d\x24\xc6\x35\x73\x1a\x24\xbc\xdd\x4c\x97\xf9\xed\x6c\x5d\x5b\x23\xcf\x34\x2b\x42\x3f\x2b\xd0\xa4\xab\x56\x5d\xac\x7d\xda\x2d\x4d\xbe\x5f\x31\x0a\xfb\x87\xfb\x35\xc2\x7c\xd6\xaa\x79\xb8\x25\x3e\xbb\xfd\xee\x01\xfe\xf8\xf1\xee\xd9\x07\x06\x27\x8b\x41\xd7\x2f\x8a\xa4\xb8\x09\x0e\x8a\x88\x1b\x26\x6c\xd8\xcc\xc1\x55\xdd\x4c\x72\x5f\x52\x14\xda\x70\x14\xa9\x63\x86\xe9\x52\xf3\x0a\x6e\x29\x65\x26\xf0\x93\xed\x00\x83\x84\x2a\x46\x70\x65\x2c\x0c\x15\x2a\x88\xc1\x5d\x85\xb0\x4a\x45\xe8\x6c\x69\x21\x4d\xd2\xb4\x4f\x51\xac\x77\x5d\xd6\xcc\xc8\x00\xbb\xad\x6e\x9f\x2f\xeb\x4b\x0f\xac\x4b\xed\xa2\xd3\xf2\xcb\xe8\xb3\x64\x49\x36\x26\x4d\x6a\x7b\x58\x1a\xbb\xea\x20\x24\x1c\x9c\xf6\xf5\x4e\x24\x65\xdc\x25\xfe\xd5\x1f\x41\x30\x83\x87\xf4\x99\x5b\xf6\x2d\x5d\xcd\x9e\xa5\x4d\x60\x76\xb1\xab\x52\x07\x43\x24\x67\x90\x73\x14\x14\xd0\x69\x95\x4e\x70\x70\x47\xdd\xd7\xfd\x4c\x41\xe1\x8c\xd0\x5c\xdb\x72\xe9\x1a\xcd\x2c\x55\xa1\x74\x42\x3a\xbb\x13\xc6\x19\x17\xbc\x62\x85\x2b\xf8\x65\xbf\x81\x41\xcd\x46\x39\xed\x1b\x61\xb9\xf3\x07\x3e\xb8\x7e\x0c\xbd\x76\xd4\x19\x8c\x7b\x43\xfd\xf5\x3e\xa5\x30\xae\x89\x3f\xbc\x50\x72\x7a\x76\xf7\x3f\xbd\x7a\x78\x6e\x30\xbc\xa6\x3b\xbf\x01\x6f\x3d\xa0\xb1\x0c\xdb\x3b\xa1\x8c\x37\xb5\x18\x4d\x38\xed\x04\x0b\xa7\x60\xd3\x7e\xac\x43\x5b\x70\x69\x04\x07\xfd\xd6\x1d\x8f\x8e\x44\xe1\xc0\x00\xc1\xfc\x98\x58\xd3\x02\x04\xb8\x23\xb0\xbf\xe4\xd9\xd3\x38\x72\xc9\x66\x00\x41\x82\x2e\xd7\x15\xf8\x24\xdf\xe9\x88\xb9\x5e\x75\x51\xaf\xeb\xda\xfe\xc3\xb3\x01\x13\xd7\xb0\x75\xc5\x5a\xe5\x39\x46\xa7\x94\x72\xc2\x55\x4c\x57\x85\x2f\x31\x3a\x74\x3c\xed\x35\xf1\x58\x9f\xc7\x1a\x63\x4f\x33\x69\xac\x6e\xac\x0b\x1c\x41\xdc\x54\x47\x8c\xa8\x00\x87\xe1\x84\xe7\x01\x16\x61\x68\xd0\x90\x6c\x13\x91\x26\x7b\xbb\x73\xc9\x9f\x25\xbf\x89\xee\xfe\x7f\x73\x8b\xf9\xf7\x6f\x3e\x3f\x7c\x7f\xab\xd7\xaf\xbb\x45\xb2\x7d\x5e\x44\x7b\x8e\x8d\xdd\x24\x0e\x56\x59\xe9\x5b\xbf\x30\xa9\x2d\x48\x82\xf5\x84\x7a\x2a\x2c\x80\x19\xf3\x44\x13\x0c\x19\x85\xe1\x68\xac\xd3\x4d\x3a\x75\x5e\xfa\x76\xe7\x90\x60\x76\x9a\xf2\x5a\xc9\x13\x80\xd8\xe9\x73\x97\x0a\x29\x38\x40\x34\x14\x8a\x17\x75\x49\x01\xa4\x27\xab\xbc\x37\x8d\xe9\xcd\x65\x0d\xa2\x8f\x74\x4b\x23\xbf\x72\xc5\xfa\x3e\x9f\xbb\x91\xb1\x74\x89\x90\xf6\xef\xdf\x6e\x26\xa2\xd4\xe9\x64\x95\xa4\xb4\x96\xb5\x38\x99\xa8\x06\x8a\x01\xde\x19\x87\x60\xa8\x1d\x6f\xbc\x73\xea\xdc\x65\xd5\x3c\x6a\x50\x02\xed\x40\x55\xf9\x2a\xc9\x12\x9e\x56\x91\xa7\xf6\x36\x62\xef\xe2\xdf\xf9\x16\x62\xb6\x0e\xeb\x67\x20\x8d\x77\x1f\x8a\xab\x05\x41\xc4\xfb\xbc\xcd\x2e\xf1\xc3\x77\xeb\xae\x93\x1e\x1d\xb7\xca\x3a\x22\x91\x12\x84\xe4\xdd\x4c\x40\xd1\x97\xe5\x68\x45\xd3\x50\x69\x05\x55\x69\xed\x61\xe5\xa4\x77\x35\x23\x96\xb1\x70\xec\x78\xa8\x15\x28\x87\x30\x78\xc2\x9d\xd8\x19\xc6\x45\x13\xe6\x61\x40\x75\x65\x74\x55\xd5\xcc\xf0\x8e\x95\xba\x32\x58\x12\x42\x31\xa5\x38\x4c\x1d\xad\x3b\x36\x3b\x8e\x25\xf4\x1e\x54\xa7\xce\x68\xa0\x00\xac\xc2\xa9\x63\x87\xe4\x3a\x87\xed\xde\xef\x5c\xf2\xf6\x89\x43\xf4\x7a\xb7\xdf\x6c\xa3\xf5\xc0\x2f\x6b\x5f\x5c\x3e\xeb\xfe\xe1\xc7\xf7\xbb\x6c\x8d\x89\x22\x2b\x20\x9b\x5c\x51\x02\x07\x5a\x7e\x18\x43\x9d\x4e\x4b\xc1\x5c\x2c\x75\xb0\x05\xa7\x43\x70\x47\x2f\x53\x5e\xa5\xa7\x43\x37\xd4\xe6\x18\x46\x09\x68\x26\x41\x35\xeb\x29\x1c\x77\x8e\x15\x79\x2f\x3c\xe6\xda\xba\xe3\xea\x75\x3f\x38\x2b\x45\x65\x7b\xcf\xa4\x09\x09\x1b\x8d\x31\xde\xb4\xf6\x72\xcf\xb3\x2c\x7f\x5c\x75\x40\x7f\x95\xfc\xa3\x55\x01\xf1\xc7\x97\x26\x5b\xdf\xdc\x88\xbb\xd5\xb5\xf8\x21\xcb\xc1\x1c\x19\x8d\x60\xfa\xa2\xd3\x93\xe5\x52\x09\x47\x98\xd0\xc6\x29\x5b\x1b\xab\x18\xc8\xeb\xfa\x6c\x7c\x7a\xda\x0a\x23\x2b\xe3\x9d\xa8\xe6\x43\x3f\x90\xda\xb5\x9e\x75\x87\xe3\x80\xeb\xb6\x83\x5f\x34\xcf\x4e\xe7\xab\x56\xa6\x7c\xa4\x5b\xb9\xcb\x93\x7d\x72\x17\xfb\xb6\x57\xcc\x2c\xf8\x50\xc4\x6d\xf0\xb7\x60\x85\x4c\x6f\x89\x8b\xea\x02\x16\xb7\x56\x68\x8f\x0f\x96\x5b\x6a\x76\xf9\x97\x6a\x43\xbf\xb4\x9b\x43\x18\x16\x1b\x4c\x18\x85\xe6\xa0\x04\x2c\x98\xa6\x63\x5d\x9b\x64\x29\x8b\xbc\x66\x9c\xfc\x3a\x29\x62\x1c\xba\x3a\xf0\xfe\x16\xfc\x06\x5c\x8b\x7b\x0f\x9f\x56\xe6\xee\x77\xe0\x09\x11\xb0\xd7\x67\x72\x70\x8a\x67\x8d\x20\x16\x8b\xa5\x05\x34\xf7\xc0\x07\xa3\x00\x71\xb3\xe0\xc1\x4a\xd0\x5c\xe2\x44\xec\x17\xb9\x1c\x82\xe0\x20\x01\x0e\x94\xe9\x1c\x66\x6d\x99\x55\x61\x10\x00\x05\xed\x97\xf1\x31\xb1\x33\xa8\x03\x39\xd8\x29\x25\x49\x92\xa6\x55\x22\x37\xe3\x76\x4c\xb2\x95\xc9\x73\xff\xf0\x2a\xe2\x86\xd3\x97\xa6\x65\x69\x0f\x0e\x01\x09\x9f\x92\xc7\x44\xd9\xba\x29\x2b\xc7\xa0\x2b\x8e\x53\x65\xb7\xa3\x0d\xd8\xb9\xc0\x87\x82\x68\x0d\x4f\x33\x12\xa4\x74\xc7\xcb\x5a\x4c\x40\xb3\x97\x3b\x93\xfc\xfa\x16\x01\x5c\x97\x99\x77\x0f\x4f\x1f\xf1\x2b\x9c\xe5\x01\xcc\x35\xa3\x35\xe5\x06\x20\x80\xc0\xec\x53\x18\xca\x16\x08\x1d\x4e\x9d\x6f\xc3\x24\x00\xad\x03\xd9\x19\xdc\xd9\x73\x9d\x2a\x21\x24\xc0\x66\x55\x4b\x1b\xc3\x6c\x67\x80\x96\x36\x25\xa1\xed\xf5\x0c\xd8\xaa\x6b\xd1\xa7\xf9\x9e\x3c\xe1\x02\xfe\x22\xf9\xdd\xcb\x6e\xc8\x2f\x85\x59\x7d\x7a\x72\x59\x7e\x9e\x53\xf5\xd3\xf3\xa0\x4a\x80\xf1\x1a\x54\x09\x30\x6e\x4f\xce\x39\x7b\x99\x07\x36\x70\x77\xf9\xe8\xce\xb9\x24\x01\x49\x9b\x96\x7b\xb6\x83\x71\x85\x5f\xb3\xe6\x87\x6f\xcc\xe0\x9e\x20\xd8\x77\x6f\xee\x32\x8a\x8a\xa5\xda\xd5\xe7\x63\x09\xb3\x84\x51\x66\xa0\xc3\x28\x34\x2e\x1c\x5d\x38\xfa\x4d\xa7\xa4\x73\x4a\x86\xe2\x4a\xca\xa3\x37\x4c\xd2\x32\xa5\xf5\x5a\x0b\x4d\x93\x3d\x8a\x78\x93\x6b\x76\x09\x7e\xd1\x59\xf6\xe3\xc3\xab\x58\x55\xff\x01\xdc\x42\x81\xa4\xae\x80\x93\xd6\x1b\xa1\xda\x3e\x0c\x78\x6e\x5c\x2b\xd8\x0c\x2e\xfb\x68\x38\x51\xa2\x52\x73\x89\x14\x1c\x10\xa1\xde\xe9\xc2\xf8\xa9\xa5\xd4\x52\xde\x6b\x2b\x3c\xa1\x4d\xed\x43\xde\x74\x5e\x21\xd0\x5f\xf2\xd1\x39\xc9\x12\x99\xc2\x7d\xbb\x23\x49\x79\x55\x11\xbd\x7b\x21\xdf\x7e\xf7\x70\xf7\x7d\x1a\xab\x62\xb1\x51\x7f\x95\x87\x7d\xd8\xfe\x70\xbf\xff\xfd\xfb\x9d\x22\x18\xe6\x75\x8e\xab\xda\xd0\x60\x8c\x53\xd3\x79\x48\xfb\x70\x9c\xcb\x30\x06\x87\x01\x0e\xd3\xa6\x21\x35\xda\x91\xf3\x91\x92\xa1\x3a\x32\x42\x55\xda\x86\x6e\x0c\xb3\xd4\x0d\x30\xc0\xe4\x6e\x39\x12\xab\x58\x4d\x52\xda\x8e\x53\x31\xf7\x31\x16\x58\x31\x48\xbf\x8e\x35\xea\xaf\xe3\xef\xf5\x2a\x1a\xf0\xee\xaa\x27\x70\xed\x06\x3e\xa4\xb9\xe7\xac\xc6\x54\x03\x78\x4a\xc9\x78\xaa\x52\x98\x42\x36\x85\x43\x2a\x17\x9f\x96\x5f\x14\x38\x2d\xfd\xce\x54\x9d\x59\x8a\x14\x51\x22\x40\xe1\xc7\x32\x77\xc6\x12\x78\x70\x8f\x89\x73\xe0\xea\x4f\x0b\x86\xa8\x5d\x70\x7f\x55\xe7\xba\x29\xa0\xbf\x40\x32\x3c\x01\xda\xbf\x4f\x9f\x6e\xd8\x65\xcf\x59\x1b\xac\xd9\x21\x45\xf5\x65\x74\x0b\x25\x18\xe4\xa2\x2a\x97\x4b\xa0\xa6\x78\xb5\x0c\xe9\xc9\x12\xa3\xb4\xd4\x7d\x98\x19\xc8\x1b\x63\x33\x2f\xa9\x27\x72\xab\x56\x72\x41\xaf\x45\xd9\x40\x84\xd3\x92\x28\x6d\x5b\xa7\xca\xd0\x4a\xe7\xb5\xb7\x47\xe1\xf9\xe0\x0c\xd1\x8e\x7a\x7d\x39\x57\xe0\x53\xb2\x93\x11\xa7\xf5\xa7\x37\x8d\x8e\x38\x35\xa2\x17\xfc\x75\xad\x43\x9d\xd4\x40\x7e\xa9\xd2\xd6\x2c\x32\xab\xcf\x42\x68\xe6\xa9\xde\x19\x3c\xb8\x85\xa5\x6d\xbf\x40\xe0\xd2\x52\x5b\x6e\x74\xac\x63\xa5\x79\xac\xc5\xfd\x3a\x62\x45\x9f\x21\x00\xbe\xc6\xc3\x9f\xb7\x77\x6f\xee\xb6\x77\xdf\xff\xf0\x70\xc9\xe1\x9e\xc5\xcc\xfb\xf7\x9f\x3f\x7e\xb8\x7f\x77\xf7\xe1\x3e\xc5\x8e\x4a\xcf\x04\x03\xd5\x96\x31\x41\x2e\x11\x30\x2c\xf3\x30\xd5\x8f\x89\x04\xa8\xcf\xdb\xa2\x2c\x5c\x89\x51\xc0\x41\x3a\x85\xbc\x07\x49\xbd\x33\xc8\xd9\xf3\x90\x5a\x4e\xfd\xa4\x02\x19\x8a\xba\x60\x23\x09\x14\x78\x12\x0c\x82\x79\x5e\xa0\x86\x8d\x18\x51\x09\x2c\x34\x68\x1e\x09\x80\x97\xf1\xab\x52\x1c\xbd\x68\xbe\x4b\xfe\x22\xf9\xab\xdb\x3a\xb1\xae\x80\x37\x93\xf7\x0f\xc5\x7e\x77\x09\x16\xb7\xf7\xeb\x98\x5e\xc3\xb7\x2e\x3d\x78\x70\xd0\x8e\x37\x56\x80\xe2\x3c\xfb\x05\x01\xe4\x99\x9a\xd9\xc1\x6f\x6b\x29\x27\x5d\x13\x2b\xb7\x76\x1c\x19\x51\x94\x0b\xbf\xd0\xb4\x43\xe1\xa8\x2c\x71\xb8\x3b\xf8\x82\x49\xe0\x83\x45\xe5\x1a\xbf\x2a\x30\xec\x2e\x63\xf6\x87\x35\x02\x8a\xf3\xf9\x99\xc7\xed\x65\xe0\x26\xfb\x87\xcb\x7c\x4e\xeb\x9a\xa6\x9a\x10\xd0\xfe\xd4\x6e\xba\x2f\x6c\xd3\x7e\x71\x52\x72\x60\xf3\xb4\xa2\x78\x39\x5d\xd6\x4a\x69\x39\x5b\x4a\xd7\x58\x4f\x18\x75\x20\x6f\xd9\xea\x35\x97\xa6\x63\x5a\xec\xe5\x8e\x24\xf7\x51\xb3\xeb\x86\x52\x7b\x31\x42\x5f\x5f\x09\x8a\xe9\x1c\x81\xb8\x4c\x79\x0b\x9d\x47\xe5\x92\xcf\xeb\x70\x93\x87\x83\x0b\x85\x16\xb8\xc6\x08\x83\x81\x18\xcf\xbd\x49\xd2\xd4\x3c\xaa\xcd\xbc\x53\x11\x07\x97\x80\x0f\xaf\xae\x7c\xf9\x67\x1b\xf9\x77\xaf\xde\xbc\xfa\xe1\xf5\x25\x01\x74\x1d\xb1\x25\x04\xb0\xac\x05\xb7\x98\x98\x96\x36\x4a\x1b\x4a\x7c\x47\xa9\xca\xdd\xb6\x04\x1c\xd6\x7e\x69\x83\x13\x52\x30\x7a\x30\xc6\x0c\x46\x02\x08\xf0\x72\x20\x14\x50\x20\xaf\x3c\xd7\x14\x45\xbc\xd5\x9f\xc6\xeb\xf6\xe1\xee\xfb\x88\x95\x8c\xb2\x17\xe0\xc3\xfd\xf7\x5f\xb5\x20\xef\x36\x87\x7a\x06\xa5\x0a\x9d\x51\xa1\xe1\xa0\x59\x8a\xba\xe8\xac\x50\x5e\xce\x16\x98\x9d\x0a\xa7\x2a\x60\xd7\x8c\x00\x87\x61\xf4\x20\x01\x0a\x90\x99\x73\x7d\x89\x26\xc3\xa1\xbb\xfc\xed\x66\xfd\x9b\x36\x8e\x19\xbd\x5e\xc3\x58\xaf\xfd\xca\x82\x7d\x73\xdd\xd4\xe2\xdf\x9d\x52\x57\xe6\xbe\xcc\x8a\xa5\x3d\x80\x81\x2c\xd3\x4c\xda\xa5\x16\x69\xd9\x2e\x75\xda\x37\x4e\xb9\x7a\x2b\xb5\x2f\xac\xf6\xc1\xe8\xda\xa7\xc9\x32\x5b\xa7\x81\x0d\x1d\x13\x56\xf3\x04\x24\x63\x5a\xed\x8b\x9d\xbf\xec\x61\x11\x55\x97\xbe\x48\xa5\x93\xf8\xf3\x6d\x4c\xa5\xdf\xa6\xa2\x26\x1b\xa6\x1a\xa6\xa0\x66\xac\x2a\x66\x1e\x94\x01\x42\x9c\x64\xa8\x0c\xa8\xe5\x51\x3b\x03\x8a\x9d\x87\x3e\x96\x66\xea\xd2\x81\x53\xa0\xa1\x35\x00\x02\x19\x54\x38\x98\x19\x90\x5a\xe9\x7e\xf5\xd8\xe7\xdb\x31\x83\xb1\x6e\xf6\xbb\xc8\xa9\x7f\xca\x5d\xa2\x45\xe3\xbf\x01\x9f\x5f\xa7\xbb\x87\x37\xb1\xd3\xf7\xb5\xf8\x92\x55\x9a\x3a\x2a\x87\x1a\x16\x84\x73\x5c\xe5\x1e\xda\x30\x11\xc3\x06\xcf\xa4\xd3\x9b\xdc\x72\xcb\x6c\x06\xeb\x9e\x0c\xde\x2d\x33\xcd\xf3\x3c\x27\x1d\x09\x27\xca\x24\x98\xab\x70\x18\xd9\x34\x74\x23\x1b\x57\xcd\x43\x30\x3e\xea\x7d\xbb\x19\xff\x70\x0e\x95\xee\x77\x0f\x97\x1c\xea\xbb\x57\xfb\x34\xdb\xbe\x4e\xb3\xf7\xdf\x6d\xaa\xb1\x51\x6d\x2f\x6b\x62\x07\x96\x37\x05\x25\x61\x3c\xda\x8c\x7b\x51\x0b\x77\x26\x0d\xa5\x8d\xd8\x8c\xf5\xc1\x4e\xcd\xf1\xdc\x97\x90\x4e\x55\x38\x12\x42\x79\x46\x43\x1f\x0c\x05\x16\xe0\x1c\x05\x15\x26\x0c\x68\xb2\x49\xcc\xa3\xdb\x9c\x36\x97\xc8\xe2\xfb\x2b\xbe\x71\xfd\xac\xdf\x54\xa6\x9e\xc9\x06\xa6\xa3\xa2\x96\x4a\x55\x4b\x01\xf3\xba\xe0\x7d\xcb\xd3\x2a\x42\xf1\x17\xed\xa0\x74\x6a\x93\x98\x9a\xd4\x36\x1c\x96\x91\x56\xa6\xea\x39\x95\x29\x6a\x7a\xd6\x37\x04\x86\xd3\x89\x9d\x92\x64\x0b\xa6\x47\xbc\xef\x77\xe2\x5a\x0f\xfd\xb7\xc9\x7f\xfa\x05\x65\x9e\x08\x2f\x7c\xa2\x85\xac\xd3\xf9\xf2\xf3\xb9\x63\xf1\x33\x97\x9b\xed\x87\xfb\x67\x38\xa0\x17\x6e\xc5\x97\x1c\x20\x6d\x36\xe4\x4b\x6f\x33\x74\x3e\x5c\x8e\x30\x82\x06\xc1\x60\x1c\x70\x01\x39\x40\x1d\xe0\x2e\x94\xa0\x73\x0b\xc4\x19\x09\x47\x33\xca\xc7\xc4\x87\x0a\x21\x46\x25\x65\x46\x0a\x57\x87\x63\x5a\x3b\xce\x2a\x5d\x55\x4d\xc3\xe6\x99\x4a\x8c\x4b\x42\xe1\x1c\x06\x0c\x04\xc8\x77\x22\x14\xa0\xa2\x61\x66\x4b\x8e\x50\x47\x75\xcf\xa4\x64\xbd\xa6\x1d\xd3\x8c\x1a\xe3\x2b\x88\xa9\xa4\x54\x56\x86\x18\xdc\x97\x94\x52\x5a\x11\x61\x1c\x93\x9c\x96\xa6\xc4\x58\x30\xcb\xf8\xca\x91\x61\xdb\x2a\x72\x66\x57\xa4\xcf\xbb\xcb\x0a\x0e\x3e\xdc\x3f\xa9\x3e\xdd\x3f\x65\x14\x37\x6a\xd5\xf6\xa9\x8f\xf9\xf1\x21\xe5\xde\x39\x7b\x59\xb7\xcb\x02\xd6\xa8\x00\xf9\x82\x51\xdc\xf3\xe3\xe1\x43\xbf\x6a\x02\xee\xe0\x1c\x4b\x1a\x49\x50\x1d\xc6\x88\x32\xcb\x34\x37\x7c\x99\x18\x4b\x8b\x30\xb4\x91\xcf\x02\x1f\xf9\x56\xc7\x73\xf9\xdb\xc8\x5d\x7c\x3a\x8f\x8f\x1f\xee\xae\xad\x8a\xbf\xb9\x41\x50\xff\x08\x3f\xfa\xaa\x2e\xf6\x9c\x9a\xa0\xbd\x76\xda\x2f\x2c\x4f\xfb\xd0\x32\xa5\x38\x26\xa6\x9f\x07\x5f\x94\x4a\x50\x53\x94\x9c\xd3\x95\xf5\x8c\x7c\x83\x6a\x2f\x75\x69\xf9\x21\xe5\x18\x29\x84\x03\xd3\x84\x6a\xbe\x2b\xa2\x48\xd5\x1c\xb4\xb2\x8e\x17\x15\xa9\x06\x5b\x42\x08\x2b\xed\x31\xae\xca\x3c\xd4\x9c\x16\xa6\xc0\xa0\x2a\x0b\xc5\x55\x91\x2b\xe1\x16\xc9\x64\x25\x19\x42\x8d\x22\xab\x66\x3d\x38\x3d\x8a\xe8\x89\xbc\xf2\x00\xfe\xfa\x97\x78\x00\xd9\xcd\x27\xf9\x05\x6d\xe7\xf3\x9b\x58\x80\x79\x93\xb1\xba\x84\x20\x5f\x7c\x87\xd8\x4d\x8b\x73\x00\xb0\xf2\x08\x82\x22\xc8\x02\x68\xae\x09\x2b\x39\x41\x65\x3e\x91\x56\x8d\x65\xbb\xd3\x10\xe3\xc5\xa4\x86\x86\xce\x04\x63\x02\xe7\x15\x66\x8e\x90\x20\x9a\xd2\x95\xf4\x14\x46\xef\x3a\x60\x2f\xf7\x40\x3c\xd2\xed\xca\xc7\xfa\x05\xed\xff\x77\x3f\xfe\x51\xed\xff\x27\x3d\x79\x01\xd0\xaa\xfd\x8f\x83\x24\x1c\x94\x10\x29\x49\x0c\x1c\x67\xc4\xd9\x98\xd6\x8c\x11\x0e\x05\xa9\x42\xe3\x56\x02\x3f\x0f\xcd\xb6\xa7\xa4\xe2\xc2\x36\x0e\x33\x5a\xf9\x1e\x73\x0c\xb5\x19\x43\x72\x1e\x85\x28\x6c\x21\x64\xe8\xb3\x63\x38\xb9\x20\xed\x25\xd7\xc4\x8f\xa7\xcd\x1c\xc7\xca\x9f\x27\x6f\x9e\x18\xae\x71\xc4\x5e\xce\x75\xb5\x15\x7f\x49\xda\x4e\x95\x53\x4e\xba\x45\x97\x69\x12\x92\xfe\x31\x49\xdd\x63\x72\x3a\x81\x62\x61\xa0\x38\x1e\x77\x45\xe8\xa3\x54\x18\x09\xc4\xba\x30\x5b\x6b\x6d\xe3\x5c\x6c\x9a\xa7\x29\x7b\x9c\xb6\xf9\x4e\x25\xff\x20\xee\x22\xcf\xfe\xda\x2f\x91\xc3\x53\xe3\x84\xe7\x7e\xb1\x30\x6d\xc2\x7c\x3a\x81\x64\x61\xa0\x3c\x9d\xc2\xbc\x2b\x82\x04\x73\xc8\x81\x5f\x8e\xb5\x1d\xed\x6c\xed\x6c\xc7\x24\x03\xf3\xa3\xdc\x8a\xf8\xff\xff\xf3\x5f\xfa\x0b\xdb\xbb\xb5\x73\x1c\xa1\x65\x9f\xee\x3e\xa6\xc2\xc9\x5a\xb8\x45\xc7\xf6\x76\x4a\x8c\x14\x8d\xaa\x47\xd3\x6e\x4f\xc1\x5e\x3e\x1e\xd0\xcb\x2c\x9d\x0a\x89\x11\x5a\x4b\x70\x20\xe1\x10\x4e\x62\x04\xc5\xb8\x62\x00\xfa\x4b\xee\x1a\xfd\x86\x6e\x4a\x52\xd7\xde\xf4\x9b\x8f\x1f\x32\xea\xa7\x89\x73\x62\x1a\x61\xed\x4e\x2f\xa3\x5b\x1c\x93\xd6\x19\x99\x9e\x5c\x92\x65\x1d\x30\x7b\xbd\x81\x4f\x1c\xa1\x75\x4e\xde\x74\x68\x6f\x3d\xe2\x9b\x8e\xe6\xf3\x89\xb8\x39\x8d\x84\xa8\xf6\x04\x58\xc5\xa5\x94\x10\xf6\xce\x37\xd0\x5a\xa9\x4a\xc5\x34\x06\xc4\x9b\xca\xb9\xd0\x51\xdb\x10\x9f\x39\x88\x70\x65\x55\x55\x51\x61\x58\x85\x60\x98\x40\x52\xe6\x02\xd3\x22\xe7\x58\x20\x1a\xba\x8a\x28\x86\x84\x60\x95\x82\x09\x48\x9a\xf4\xb8\xe7\xd9\x9c\xec\xbf\x2a\x3d\xed\xb9\xff\xc9\xf8\x6c\x0e\x27\xef\x41\x99\x64\xc9\xf8\xc8\xf6\x2e\x53\xc9\x3f\xbe\x32\xbe\xd7\x1e\xfe\x3e\x92\xe4\xd6\xd3\x8f\x96\x6e\x57\xd7\xf4\x58\xc5\xbb\x3a\x2b\xaf\x9b\xe5\xc7\xa7\x1e\xca\xfd\xd7\x8b\x96\x41\x5b\x94\xc0\x1c\x8a\x39\xcc\x79\xad\xb9\x36\x18\x29\x4a\x4f\x68\x06\x79\x4e\x10\x56\x2a\xe5\xbe\x31\xb2\x39\x21\xae\x2a\x97\xf3\xb1\x51\x5f\xac\x9f\x67\x2d\x4b\xd7\xd1\x4c\x55\x55\x65\x3a\x5b\x41\x29\x8d\xe2\x04\x73\xa4\xed\x68\x99\xe4\x84\x3b\x1b\xa6\x28\x87\x1b\x3a\x58\x56\xbe\x1a\x04\xe1\x59\x79\x34\x41\x43\xe4\x70\x45\xa3\xf6\xe3\x23\xd9\xfb\x4c\xc6\x7d\xf5\xc7\xe8\xa6\xf8\xdd\x75\x83\xda\xee\x93\xec\x79\x60\x7a\xab\x92\x6e\xb6\xef\xdf\x66\xb5\x2b\x75\xd3\x08\xab\xdb\x16\x94\x26\xc0\x99\x69\xc9\xa1\x14\x10\x86\x2a\x6a\xf3\x82\x19\x06\x1f\x8e\x0c\x74\x19\x2f\x1e\x93\x56\x1b\x69\x95\x37\x35\x28\x80\x5f\x46\xcd\x4b\x5f\x42\x92\x5a\x65\xb8\xd1\x9d\x9f\x74\x53\xaf\xb1\xdd\xe1\x91\xee\xeb\x4c\x5c\x63\x9e\x0f\x77\x57\xd8\xec\x66\xbb\x7f\xfb\x42\x5f\xe6\x72\x16\xef\xae\x71\xc0\x58\x63\x72\xac\x8d\x1f\x01\x04\x09\x0f\x4d\x30\x5c\x47\xb2\x78\x0c\x27\x30\xa8\x01\x5f\xda\xa1\x56\x75\x97\x89\xd0\x54\x48\x77\xb2\xd3\x0d\xaf\x2d\x28\xc3\xa8\x44\xe1\x0b\x01\x92\xde\xd7\x75\x07\x0a\xa1\x8d\xe5\xc9\x3e\xed\xa2\xae\x9b\x4d\xfe\x2c\xf9\x8b\x27\xfe\xdd\xd5\x4d\xe2\xd3\xe7\xd7\x2f\x2c\x0b\xff\x29\x78\xbf\x5e\xa0\x97\xa4\xa1\xaf\x7e\x26\x51\x55\xf9\xa1\xb8\xfc\x62\x04\xda\x5d\xe5\xfb\x20\x27\xa0\xa8\x60\x4d\x01\xfa\xc2\x00\x44\x38\xab\x1c\x91\x16\x56\x88\x95\x41\x09\x8e\x30\x64\xa8\x5a\x91\xaf\xd1\x70\x7d\x4a\x4b\xe7\x16\xb4\xb1\xc2\x76\x70\xa8\x50\x1e\x18\x0d\x15\x07\x86\x05\xb1\xb3\x42\x09\x55\xd5\xd6\x12\x1c\xfa\xa5\x56\xcc\xe7\x10\xa7\x68\x71\x9c\x15\xa6\xa0\xf8\x98\xce\x47\x1e\x8e\x1c\xe4\xa1\x08\xa7\x20\x6b\xc7\xc6\x50\x73\x47\x4e\x2b\xd6\xe6\x91\x6c\xc8\xce\x5e\xd5\x84\xab\x9f\x63\x95\x6e\xb3\x62\xc5\xfc\xbc\xc0\x0e\xae\x68\xd0\x08\x4b\xf2\x41\x82\x6a\x49\x40\x15\x44\x36\xba\x85\xbb\x31\x45\xcb\x41\xa7\xc7\x65\x2c\x53\x09\x95\x92\xa2\xb0\x94\x96\x8b\x65\x29\x5c\xda\x5d\xa1\xb5\xe5\xd6\xf2\xd0\x3f\x26\xd6\x81\xbc\xd7\x2c\xd4\x22\x1c\xeb\xc2\x96\x03\x60\x32\xe2\x89\x93\xc7\x2a\xf2\xb8\x56\x57\xf8\x04\xbc\x4e\xf7\x6f\xbf\x6e\x27\xb1\xa4\xf4\x1c\xa6\xf9\xf6\x73\xac\x31\x6d\xa3\x0d\xd8\x5f\x81\xbb\x87\xbb\x4d\xef\x9d\x07\x05\x40\x84\xd9\x5e\x3b\x52\xd7\xb1\xa2\x53\x22\x64\x35\xf3\x25\x0c\x7c\x99\x4a\x50\x9c\x22\xc4\x96\x57\x33\x8a\x04\x48\x0f\xe0\xce\x56\x61\x32\x45\xc5\x38\xeb\x0f\x5c\x95\x45\xbb\x34\xe1\x04\x19\x21\xc3\x89\x72\x4a\x90\x2f\x0b\x80\x52\x5e\x43\xe7\xcf\x57\x33\x9a\xd5\x63\x09\x3d\x92\x7d\xb7\xd3\x91\x85\xf5\x55\x43\xe1\xe1\x3e\x16\x1d\xde\x5e\x8b\x0e\x59\xc4\x04\x5f\xde\x7b\xf5\xe9\xf3\xc3\x0f\x5b\xe4\xa7\x3a\x28\xe0\x4c\xd7\xcc\x3c\xcc\xc3\x29\x8c\x0c\x54\x43\x27\x25\x70\xc1\xb8\x49\xd7\x3c\x14\x7c\xa7\xe3\x1e\x70\x38\xaa\x30\xb4\x86\x36\xbc\xe9\x98\xa7\xbe\x03\x85\x3b\xa6\x28\xc8\x73\xed\x87\xf1\x32\x97\xfc\xe3\x61\x63\xb2\x3c\xc9\x92\x5f\x5d\xee\xe7\xfd\xc3\x3a\x79\xe7\xac\x38\x4f\x99\xbc\x7c\xea\x19\xa7\x65\x96\xfb\xc9\x7b\x1d\xeb\x12\x20\x19\x40\xb7\x21\x29\x4b\xb2\xf5\xbf\x18\x32\x7d\xb6\x69\xd4\x63\x4b\x13\x93\xae\xd8\xfc\xef\x93\xb7\xd1\xf5\xec\x72\xe6\x6f\xee\xde\x3c\x2d\x7a\x1f\x1f\x6e\x15\xc6\x5b\x69\x67\x72\x00\x39\x77\x2c\x99\xd4\x75\xe1\xd3\x22\xd0\xd4\x81\xd6\xc7\xab\x6f\xce\x06\xc8\xc0\x76\x62\x06\xc5\x19\x02\x5c\xd7\x58\xb0\xc1\xe9\x38\xda\x5d\x70\xce\x01\xb5\x72\x02\x6c\x7a\xda\xeb\x5d\x99\xbc\x5a\xcf\xe9\x5b\x36\xc0\xbc\x83\x0b\xbe\x6c\x65\x19\xfa\xaf\x45\x86\x16\x97\xaa\x85\xee\x4a\xdf\xd4\x9d\xf7\x5d\xbd\xe2\x7f\x7d\x3a\x45\xbd\x8e\xdf\xde\x70\x6b\xbb\x97\xea\xe7\x2b\xaa\x77\x03\x09\x4a\xc7\x73\xe2\x2c\xf0\xa0\xd7\x76\x34\x1e\x55\xcb\xb0\xd8\x6a\xac\x43\x92\x55\xb0\xda\x29\xa1\xfc\x2c\x0a\x6a\x59\x77\xe4\x94\x32\x68\xed\xc9\x5f\xb2\xfb\x14\xe0\x74\xdc\xf3\x1d\x89\x3e\xf2\x09\xb8\x7b\xb8\xff\xfe\x87\x07\xf8\xf9\x89\x37\x12\xa1\x5b\x3b\xf7\x85\x7a\xd0\xa7\x10\xc3\xd2\x23\xb3\x98\xe5\x30\xd6\x1b\xb8\x23\xcb\x6c\x11\x2c\x73\xc7\x1b\xca\x44\xda\xfb\x71\x8c\xe7\x7d\xcc\xdc\x1e\xed\x4c\xdc\x6b\x7f\x78\x75\x1d\xe0\xaf\xe2\x0c\x78\xbf\x65\xd3\xc9\x52\xba\xd4\x0b\x47\x80\x9e\xea\x71\x04\x2d\x38\x0e\xdb\x71\x08\x93\xe4\x8c\x95\xb6\x03\xea\x12\x29\x15\x64\x48\x12\x90\xf1\x64\xde\xcb\x9d\xba\xf6\x99\xf7\xb7\x1b\x15\xc7\xe6\x25\x81\xdd\x4d\xaa\x1d\x23\xa7\xdc\x9e\x69\x3d\x0f\x47\x9a\x92\x9d\x32\x15\x0a\xd2\x07\xe4\xb3\xee\x7c\xcc\x26\x58\x7a\x9c\xfc\x19\xf0\x8f\x72\xdf\x6c\xab\xa7\x1a\xef\x57\xa7\xc4\xbf\x4b\xfe\x3e\xf9\xcf\xc9\xff\x95\xfc\xdf\x97\xf8\xef\xf3\x87\xfd\x75\xbd\xb8\x7b\xf8\xfc\xe4\xc0\x71\x75\x98\x5e\x5d\xe8\xbe\xf1\x39\x02\x0f\xf7\xd1\x89\x2e\xc6\x45\xeb\x16\xf9\xf9\xaa\x03\xbc\x2a\x4c\x7f\x78\xa9\x1e\xfd\x22\x44\xa0\xa0\x2a\x5c\x01\x48\x68\x0b\x40\x16\x04\xf2\x22\x1c\x1d\xe7\x3d\x53\xec\x0b\x4c\x45\x65\x03\xa5\xb8\x3f\xc5\x2f\xd0\x64\xf0\x7c\x5c\x0c\x68\xbc\x31\x94\x14\xdd\x54\xb6\xce\xf9\x0d\xa7\x44\x55\xb4\x35\x90\x48\x98\xeb\x82\xb6\x9e\xa6\x15\xab\x0c\x62\x4b\xa3\x0b\xaa\xc8\x66\x90\x52\xf3\x50\x81\x91\x07\x1a\x25\xbf\x80\x35\x3f\x1d\xd2\xc6\xa4\x89\x88\x70\xf4\x41\x86\xc9\x48\xa5\xa4\x2a\x72\x59\x95\xba\xd4\x52\x15\x54\xf2\xe8\x0c\x84\x0a\x28\xa0\xa3\x98\x82\xca\xd6\x55\x6d\x30\xea\x6b\xdc\x24\xc9\x9f\x00\xfb\x88\xf7\x76\x5b\xc5\x7c\xf3\xcf\x63\x15\xe7\x4d\xf4\x8c\xff\x3f\x92\xff\x9c\xfc\x97\xe8\x75\xbc\x5e\x9b\x87\xfd\x93\x1a\xda\xfa\xf8\x9c\xad\x74\x2b\xad\x5e\xcd\x3c\x9f\x5f\xaa\x2b\x11\xe1\xdd\x1a\xab\x5d\xd1\x92\x51\xcd\x32\xd2\xe4\xa3\x72\x57\xd4\x76\x8e\xf7\xe7\x14\xa3\xc3\x31\xf5\x8b\x94\x2e\x0c\x76\x4b\x6c\xa8\x6d\xe0\x15\x94\x65\x95\x61\x0c\x25\xac\xe2\x44\x56\xc1\xb4\x86\x37\x47\x24\x1d\x2d\x0c\xd4\x63\x2b\x83\x8a\xc3\x08\xa1\x43\x4f\xa4\xb6\x3a\xc5\x85\x29\x0b\x3a\xdb\x30\xc7\xa5\xd5\xcd\xf6\xb8\xad\xb4\xd6\x24\xcc\x75\x1f\xdd\xed\x3a\x00\x35\xc6\x84\x60\x1c\x7f\xd6\x9a\x85\xd1\x21\x22\x2e\xc1\x5b\x81\x68\x65\x08\x61\x80\x31\x5d\x73\x45\x2b\x0a\xda\x70\x1a\xd9\xe9\x12\x4d\x54\x08\x55\x03\x63\x8c\x0d\xfc\xf2\x95\xfc\x09\x88\x9e\x3e\x5b\x91\xfc\x2a\x79\x95\xfc\xa3\x27\xf5\x86\xbf\x4b\xfe\xe3\xd3\x75\xbc\x25\xe0\x5f\x79\x9e\xdf\x3c\xbb\x51\xd7\xdf\xdc\x7f\x3d\x2e\x57\x3a\xb6\xd8\x3f\xbe\xb9\x7f\xf5\xf1\xcd\xfd\x3a\x5a\xaf\x94\xd9\x97\x14\xb1\xbb\x87\x3b\xf0\xe6\xfe\xc3\xbb\x37\xf7\x1f\x52\x21\x30\x61\x84\x4b\xa5\x01\x15\x98\xe0\x8a\x33\xa1\x01\xe1\x15\x26\x98\x73\xa5\x01\x37\x10\xb5\x25\x72\x18\x9a\xb1\x6d\xdb\xf6\x14\x12\x57\x94\xaa\x06\xa5\xbb\x7c\x9d\x49\x6a\x17\x1d\x1d\x22\x4b\xd8\x1d\x70\xee\x4a\x11\xc6\x30\x89\xf4\x18\x44\xd3\x00\xe8\xfd\x56\x50\x46\x30\x15\x5a\x29\x4a\x29\xae\x08\x57\x52\xf0\xcb\x33\xcc\xa5\x90\x1c\x69\xa9\x38\x92\xd6\x1c\x2e\xdf\x56\x67\x03\x82\x7c\x0a\xa7\xc3\x21\x34\xf1\x48\x6d\xe8\xa5\x5a\xb8\x46\x39\xe4\x95\xa1\x98\xa7\x45\xb0\x20\xf7\xde\x27\x7f\x02\xfc\x23\xd9\x1f\xb6\xfc\xc9\x2f\xe1\xaf\xaf\x2c\xc8\xff\x7f\xd4\xc6\xff\xdf\x57\x25\xba\xd7\x5f\x27\xfa\xa7\x5f\x98\xe9\x5f\xb1\x51\xdf\xf8\xa9\x3d\x7c\x53\x4f\x5a\x87\xea\x73\xcd\xa0\x8d\x00\xb8\xa8\x4b\xc0\x83\x83\x40\x9e\x67\x90\x17\x79\x38\x19\xce\x0f\x4c\xf3\x9f\xe6\x94\xd2\xaa\x84\xc8\x76\x3d\xd6\x64\x6c\xe2\x57\x26\x18\x51\x98\xd6\x16\x51\x85\x0a\x53\xf0\xbe\x61\xb5\x2e\xa9\xa6\x59\xc2\xb1\xc6\x6c\x73\x20\x04\x0a\xab\x42\x92\x26\x18\x87\x72\x9d\xc6\x8d\x3d\xbb\xc2\x16\x79\x18\x40\x59\xc1\xba\xc8\xfa\xe3\x71\xe9\x4f\x4b\x5b\x1e\xb8\xe6\x5a\x15\xa1\x81\x25\xd2\xb0\x65\x98\x01\x0d\xe7\x91\x1c\x86\xba\xc3\x43\xc4\x40\xfc\x29\x50\x8f\x74\xef\xb6\x55\xf2\xa7\x71\x07\x58\x11\x47\x28\xf9\x17\xc9\xff\x98\xfc\x87\xa8\x34\xf3\x9f\x9e\x2a\xcb\x1f\x56\xb8\xe4\xeb\x0f\x9f\x3e\xbf\xc9\x7e\x4e\x06\xfa\x8a\xfd\x7b\x96\x20\x7e\x55\x90\xfa\xf8\x02\xf1\xf1\xee\x2a\xbc\x7f\xbf\xff\xfd\xfb\xb4\x36\x10\x70\x4c\x9a\xc5\x96\xbc\xcd\x0f\x14\xcf\xc8\x98\xc8\x65\x8a\x0f\xe9\x21\xda\xb7\x86\x91\x56\xf6\xff\xa1\xec\x6d\x62\x25\xd7\xf5\xfc\x30\x51\xa5\x3a\xa5\x99\x0c\x66\xd4\xb7\x5f\xbf\x96\x3f\xc6\xc3\x33\x7d\xef\x6b\x39\xb1\x3d\xc4\x9c\xe9\x6e\xda\xf1\xb3\x89\x89\x33\x60\x62\x23\x21\x0c\xc4\xa0\x13\x20\x20\x90\xc0\xe1\x92\xc8\x8a\x4b\x2e\xb9\xe4\x92\x4b\x2d\xb5\xd4\x52\x4b\x2d\x6b\xa9\xa5\x96\x5a\xd6\xb2\x96\x9a\xdb\x25\x56\x20\xaa\xea\xf4\x39\x7d\xef\xd8\xf1\x3d\xd0\xb9\xd5\x75\x1a\x7d\xaa\x54\xe4\x9f\xff\x8f\xdf\x47\x45\x48\xda\x84\xf3\xe9\xb4\x6e\x3f\xbf\x6e\xcc\x71\xbc\x26\x8c\x23\x0b\xd9\x32\x69\x44\x2c\x4b\x13\x5a\xea\x92\x30\x64\xe0\x1e\x55\x54\x53\xb2\x90\x54\x95\xa6\xee\x30\x0d\xbc\xae\xeb\xc0\xbc\xf7\xe9\x8c\xac\x20\x4a\x70\x4d\x94\x3c\x9b\xce\x1e\x5d\xd0\xc0\xba\xa3\xed\x16\xa1\x0c\x72\x2a\xaf\x7a\x43\xbd\x31\xa6\x72\x26\xb7\xae\xa8\xd7\x5c\xe3\x0f\x41\x7d\xc5\x07\xbd\xcf\x7f\xb1\xae\xfe\x7d\xf2\x1f\x63\xa7\x6d\xc3\x66\x7d\xf9\xf0\xfe\x66\x60\x7b\xd7\x51\x88\xbd\xb7\x5f\xfb\xe9\xbb\xe7\x9f\x7e\xb9\xb9\xf5\xee\x0f\x37\xa5\xef\x9f\x3e\x7f\x79\xdc\xdf\xc6\x71\x73\x2a\x08\x42\x82\x49\xe8\xa1\xb4\x5c\x52\x6d\xee\xad\x84\xf5\x4a\x49\x6a\x24\x67\x42\x99\xaa\xa9\xb8\xe6\x82\x38\x17\x55\xaa\x6e\xd7\x85\x83\x19\x35\xe5\x0e\x86\x33\x33\x60\x50\x61\x9a\xaf\x49\xa8\x08\xc0\x53\x50\x5a\x04\xbd\xc3\x35\x0b\x08\xe3\x7a\x9f\x2f\x06\x56\x92\xe1\xaa\xd4\x54\x22\x02\x7a\x76\x4d\xd8\x4c\xc1\xb0\x18\x44\xa4\x20\x18\x2a\x22\x11\x06\x3d\x3b\x93\x99\x05\x46\x61\x65\x2c\xd7\x86\x13\x09\x6d\x8e\x38\xe7\x1d\x93\x04\xc7\x19\xc5\x1f\x80\xf6\x5a\x1d\xdc\x5e\x3d\xa3\x33\xdf\xc7\xda\xe4\x2f\xb7\x69\xcf\x66\x72\xb7\xbf\x8d\x1a\xef\xa0\x77\x70\x97\xa0\x7b\xc5\xd1\x7d\xb9\xb9\x5a\x98\x9a\x9f\x6d\x2a\x8a\x50\x44\x42\xeb\xce\x5f\xa4\x59\x83\xbe\x5b\x23\x4e\x50\x99\xfb\xaa\xf4\xbe\x5b\x04\x37\x51\xc0\x8f\x2c\x06\x30\x55\x9f\xc4\xb0\x23\x53\x2b\xfa\x61\xaf\x98\xd6\x70\x5c\x9c\x06\x86\x84\x99\xf3\x20\x0c\xd6\xad\x60\xb9\x2b\x88\x2f\x99\x17\x96\xe8\x58\x86\x26\xc9\x03\x70\x57\x72\xa8\xf7\x2a\xc9\x93\x3f\xba\xe9\x86\x46\x7d\xf6\xe7\x36\xe1\xfd\xe5\xbf\xdb\x5e\xfe\x86\x18\xda\x44\x8c\xd7\xf0\x71\x97\x31\xde\x7f\x84\x60\x4a\x65\xe5\x61\x99\xfa\x9f\xb9\xcc\xfc\x57\xe9\xd6\x5c\x55\xa5\x6e\x51\x1a\xd4\x41\xec\x2a\x12\xe6\xd0\xa7\x4d\xa8\x7a\x80\x58\xa8\xc3\xd9\xcd\xa1\x96\x00\x0e\x01\xa5\xf5\x72\xae\x52\xb9\x4f\x68\x85\xb1\xc1\x4b\xab\x81\x24\x67\x4e\x42\xad\xcb\x82\x1a\x86\x3c\xef\xc3\x11\xa0\x46\x58\xc4\x0d\xcd\x55\x92\xe4\xc0\x5e\xe9\xc1\xec\xf1\xb3\x2f\xf4\x5a\x13\xfe\xbb\xe4\x3f\xdd\x76\xf5\xe1\xe9\x65\xfd\x17\x75\x67\xb6\xd1\xeb\xc3\x7d\xa7\x3f\xec\x5e\x38\x90\xbd\xfb\xf2\xee\xe9\xd3\xdb\xef\xb5\x75\xd6\x85\xfc\x0d\x50\xfa\x62\xd7\xc7\x56\xe4\xd1\x40\x50\xf0\x8e\x52\xaa\xa0\x41\x95\x32\xba\x74\xca\x15\x05\x3f\xc2\x1e\x57\x7d\x55\x2a\x75\x8e\xe0\xc2\xb3\x6a\xd2\x86\x49\xcc\x4a\x46\xca\x72\x40\x3d\xaf\xcb\x56\xab\x52\xba\x69\x5a\x0f\xe0\xc8\x74\x74\x10\x2a\xbe\xc7\x15\xd5\xf6\x42\xb6\x61\xf7\xf9\x74\x0a\x73\xa7\x7b\x50\x83\xb2\x2c\xcc\xd1\x13\x4a\x83\x6b\xdb\x36\x10\x4f\xa9\xf7\xe9\x31\x58\x5f\xd8\x82\x1c\xc3\xa4\x95\x38\x06\x06\x85\x31\xa6\xb1\xa1\x07\xc4\x36\x14\x73\x9b\x1c\x36\x8d\xd2\x3d\x4c\xfe\x24\xe6\x85\x7f\xf1\xcc\x99\x7f\x7c\xc5\x02\x7d\xfc\x33\xf0\xcd\x39\xe9\x05\x67\xfe\x33\x78\xee\x11\x7f\x5b\xc7\x69\x9e\x32\x9f\xd2\xa5\x4b\xfd\xcf\x38\xf5\x4b\x7b\x36\x45\x71\x64\x42\x60\xaa\xfc\x8e\x18\xa8\x39\x93\x12\x61\xed\x00\x77\x17\xec\xdc\xee\x78\xc1\x36\xed\x17\x12\xfd\x5d\xb3\x23\xe7\x36\xd4\xc6\x00\x51\x56\xb0\x94\x8a\x60\x8a\xb8\x52\x15\x41\x48\x91\x0a\x23\xae\x82\x5c\x2a\x84\xd2\x71\x99\x40\x43\xc3\x24\x23\x96\xe1\x00\xc4\x95\x1d\xec\xbe\x4c\xfe\x20\xc6\xf4\x75\xb7\xfd\x8b\xe4\x5f\x3d\x6b\xdb\x3c\xbe\x7b\x04\xe9\x8d\x18\xbf\x5b\x93\xb3\xf7\xcf\x16\xba\x9b\x8b\xf2\x5a\x9f\xdc\x47\x33\x2f\x0d\x79\x8e\xa7\xb2\xaa\x31\x04\xc9\x22\x96\xa9\xe8\x4c\x9b\x4a\xbf\x16\x8f\x69\x57\x43\xda\x85\x01\x94\xe1\xe4\xcf\xe7\x30\x01\x4f\xae\x09\x29\x6d\x89\x95\xeb\x9c\xeb\xba\xcc\x60\x84\x28\xb3\x61\x0a\x32\x78\x01\x08\x70\xa0\x0f\x05\x90\x93\xaa\x9c\xb3\x9d\x0d\x0e\x28\xdb\x59\xd3\x6b\x53\x39\x15\xcc\x82\x8c\x4d\xc7\x80\x01\x59\x63\x6e\xf4\x6e\xd9\x93\xa8\x4b\x5b\xde\xba\x70\xe8\xd9\x6b\xf7\x1b\x66\x29\xc2\x93\xde\x3f\xfe\xee\xe3\xc3\x66\x68\xbe\x46\xda\xa7\xdf\xde\x96\xe6\xc7\xcf\x5f\x9e\xd6\x77\xfa\xe9\xed\x73\x53\x60\x0b\xcd\x59\xad\x8a\x1c\x20\xa0\x58\xed\x96\xa2\x75\x0c\xb4\x1c\x8c\x46\xcb\x50\x64\xc3\x57\xe4\xdb\x8a\x72\xdf\x31\x44\x6b\xaf\x31\x43\x0c\x13\xda\x72\xbf\x24\x3e\x02\x23\xd7\x6b\x4f\x78\x9e\x3b\x6e\x2b\x1c\x7d\x0f\x35\xc7\x84\x4c\x81\x69\x4a\x30\x65\x55\xdf\x23\x4a\xa1\x20\x7d\x70\xcb\x11\xe3\x14\x1f\x59\x38\xb1\x75\x6f\xae\x39\x8a\xd9\x93\x17\x1c\xdc\x3b\xd7\xef\x17\x7e\x45\xcf\x0e\x06\x91\xdf\xb7\xfb\x1e\xdd\xfe\x8c\xc6\xfa\xf1\xa7\x34\x07\x85\x07\x9d\x8f\xbd\x72\xb3\xf0\xb4\xfa\x5a\xa5\x70\xf1\x00\x87\xf3\x4e\x04\x1a\xa1\xab\x69\x09\xdc\x85\xdf\x1f\x2d\x85\x6c\x42\x4d\x00\x4a\x1b\x50\xcc\xf4\x9a\x84\x39\x1b\xa4\x54\xca\x1a\x2b\x96\x26\xe5\x22\x8a\x26\x85\x4a\x4a\x19\x3a\x29\xe5\x35\x51\x8a\x39\x22\x88\xf0\x2a\x7a\xa7\xed\x40\x7f\x25\x87\x66\x4f\x92\x2a\x61\xc9\xff\xf3\xcd\x65\xec\xb7\xaf\x26\x47\xcf\xc4\xb1\x77\xbf\x39\x7c\xfc\xfc\x7b\xf0\xb8\x11\x1a\x0f\x4f\xdf\xd3\x3a\xdf\x3e\x7e\xba\x79\xb7\x3c\xd3\x1b\xbf\x69\xfa\xbd\x1c\x0e\xef\x49\x55\x71\xa6\x98\x2c\x09\x67\x0a\x4b\x69\x84\x12\xe8\x38\x71\xde\x19\xad\x81\x3f\xf9\x45\xa4\x4c\xb5\xc7\x60\x2b\xe0\x91\x36\x4a\x94\x9e\x22\x0a\x03\x13\x40\x9c\x09\x65\x46\x60\x2a\x19\xd1\x24\xb0\xd4\x5a\xc3\x70\x28\x53\x4b\xb9\x77\xca\xd7\xfe\x84\x1a\x2d\xf5\x7e\xdd\x72\x9c\x73\x0c\x2b\x24\x04\x21\xb8\x32\x08\x77\xc8\x10\x6a\x4b\x67\x38\x93\xde\xcf\x85\x6e\x55\x90\x26\xd4\x4d\x61\x4b\xd1\x00\x53\x17\xb0\xd4\x08\x61\x42\x31\x65\xfc\x22\x11\x61\x5c\x6b\xcb\xd7\xdf\xc8\x14\xd1\x88\xa2\x2a\xf9\x6f\x80\x8b\x79\x7f\x75\xf3\xba\xfc\xe9\xd6\x2f\xfa\x92\xfc\x3e\xf9\x1f\xbe\xf1\x7e\x3f\xbc\x79\x61\xb0\xfb\xe9\xe9\xd3\x2d\xe2\xdc\xbf\xfe\xde\x4b\x1b\x34\xf0\x2a\xc1\x7a\xa1\xf4\x3d\xd8\x12\x66\xc8\xb5\xed\xf8\x73\x35\xd4\x35\xc2\x6a\xd8\x35\x8d\x6b\x5c\x5d\xd7\x00\x35\x0d\xc0\x4d\x73\x19\x3c\x57\xde\x66\xad\x52\x96\x9b\xb3\xa4\x9e\xf0\x6b\x12\x3d\x13\xf6\x55\x45\x88\x0d\xb3\xbd\x26\xd6\x82\xc4\xd6\x04\xf3\x31\x34\xb1\x34\xba\x5d\x9b\x51\xf9\x76\x05\x86\x7a\xcb\xbc\xd3\xb5\xf4\x8e\x68\x4f\xbc\x41\x1b\x92\xe4\x00\x86\xc8\xdb\xae\x6e\xda\x37\x38\xf9\x57\xc9\x5f\x27\x7f\xf3\x8d\x5f\xf6\x6a\xfa\x7f\x93\x48\x7b\xfb\xe1\x3b\x97\xa1\x0d\x1a\xf5\x32\xef\x7c\x7b\xf3\xcf\xdf\xb7\xb6\x80\xc0\xb0\x42\x09\x2f\xb5\x90\x5e\x36\x92\x61\xa8\x0c\xc7\x94\x16\xc7\x35\xba\x62\xc1\xa9\x80\x86\xa0\x90\x38\xc0\x81\x34\x52\x0a\xb5\xcc\x02\x6b\x2c\x46\xa0\x82\xd3\x5a\xef\xab\x4a\x49\x1b\x4c\x38\x35\xce\x9a\xa6\x55\x4e\x1f\x9b\x23\xe3\x00\xcb\x73\x73\x04\x39\x30\x41\x5d\x0c\x17\xa5\x2b\x69\x3a\x5e\x48\x46\x01\x67\x9e\x73\x25\xa5\xa1\x5a\x2d\xe7\xe5\xa4\x41\xd4\x84\x03\xc7\x2b\x3b\xd0\x7d\x75\xdb\xe7\x5b\x15\xf2\x8d\xf5\xff\xf4\xe6\xc3\x2f\xb8\xf6\xdf\xe8\xcc\x2f\xde\x70\x7a\x58\x83\xf6\xdb\x38\x31\xfb\xf4\xf8\xee\x37\x60\x04\xa5\x5f\x83\xee\x7c\xde\xda\x4f\xc7\x75\x8f\x83\x24\x9c\xda\x7b\xda\x97\xf5\x9c\x63\x0a\x19\xc2\xe1\x04\x85\x33\xf5\xfa\x31\xe5\xa0\x08\x73\x56\x5b\x6b\xf5\xe2\x8c\x1d\x47\x6b\x52\xa5\x83\x5b\x4f\xe1\xb4\xfb\xca\xa4\x2a\x7c\xa1\x40\x19\xfa\x89\x03\x0a\x5c\xca\x83\x3d\x2f\xf5\xd9\xa3\x64\x1f\x75\xe7\xdd\x1e\x26\x1f\x92\xa7\x9b\xde\xea\x0b\xcf\xfe\xc7\xbb\x60\xee\x1d\xb4\xf5\xe9\xb6\x8f\x7f\xdc\x74\x88\x7f\xf3\xac\x37\xf3\xfe\xe9\x4f\xc1\x0f\xef\x0f\xbf\xdb\x45\x98\xc5\xcb\xe4\x6e\x47\x1c\x6a\x9c\xb0\xb5\x66\x60\x38\xae\x6f\x4c\xcb\x32\x1c\x83\x2e\x01\x0b\x27\x50\x76\x10\x32\x50\xa4\xb5\x2f\x21\xa8\xb9\x43\x30\xf4\x4c\xca\xc6\x3a\x75\xa6\x47\xc3\x8f\x02\xc0\x60\x2c\x26\x9a\x06\x46\x90\xa9\xc8\x1e\x22\xc2\xb5\xd2\xdc\x12\xdb\x98\x60\x8b\xd2\x30\xec\x11\x70\xa6\x61\x45\xa9\xfb\x0e\x2a\x65\xc9\x09\x69\xdd\x5b\x39\x9b\x23\x0d\xae\xa9\x2d\x40\xe1\xdc\x5a\x90\x00\xd3\x55\x56\x10\xc9\x94\xc5\x4e\xde\xcf\x57\x7a\x68\xf6\xe5\x33\x52\xf0\xaf\x6e\xd8\xe0\x97\xba\x3d\x77\x37\xec\x17\x44\xad\x97\x8a\x09\xcf\x3c\x89\x97\x2b\x18\xf4\xd2\x81\xd2\x49\xa9\x2f\x83\x91\x73\x74\xd8\xbd\x5d\x99\x62\xc7\x6b\x02\xe6\xc6\xf5\x39\x13\x9a\x31\x40\xbe\xce\x5a\x7b\x51\x83\x49\x60\x83\x79\x66\x5d\x44\x1a\x2a\x6b\x53\x67\x6d\x50\x2e\x28\xb3\xab\x0c\x85\x93\xbd\x98\x9d\x09\x32\xb4\x56\x2a\xc0\x41\x0b\x14\xbc\x24\xb4\x53\x4a\x69\xa1\xa8\x12\xc9\x7a\x16\xf5\x57\x75\x70\xfb\x97\x1a\xea\xff\x38\xf9\x8b\xbb\x9a\xc2\xf7\xdd\xcb\x5f\x28\xa8\xbf\x28\xed\xde\x7f\xd7\x83\x4f\x71\xd6\x2d\xa7\x68\x2a\xb8\xe6\xec\x72\x39\xa5\xe5\x72\x76\xbf\xd4\xa0\x51\xc7\x46\xb4\xc7\x25\xee\xb5\xa3\x06\x2c\x2a\x2d\xa5\xf5\xcf\x28\xf5\xa1\xdd\xd3\x90\x10\x4d\xb5\xa6\x9a\x00\x42\x29\x0d\x33\xa5\x74\xe9\xb8\xd4\x9a\x0b\x5a\x73\x29\x65\xd7\x19\x65\x6d\xec\xbf\x3e\x00\x1f\xb5\x53\xab\xd8\xf7\xdd\x26\xbb\xff\xe6\x86\xae\xfb\xde\x45\xe6\x7b\x01\xa8\x67\x37\x99\xbb\x0c\xd4\x36\xee\xfb\xb2\x89\x44\xff\xee\x63\x76\x06\xc6\x3b\x47\xd5\xa6\x10\x14\xcc\xa5\x07\x2c\x1a\xe2\x80\x72\xa9\x00\x0c\xed\xee\xcc\x2a\x07\xd9\xa5\x4f\x4f\x4b\xe9\xc0\x31\x60\x44\xb1\xad\x2a\x57\xa2\xae\x8c\x76\xb6\x46\x21\xbc\x3b\x03\x1c\x8e\xf6\xd2\x29\x5e\x7a\xc8\x77\x15\xc0\xc6\x18\x6d\x8c\x0e\x7d\x7d\x44\x43\x9d\x07\x65\x5c\x38\x6a\x53\x28\x87\x39\x87\x86\x21\x97\x17\xd1\x04\xfa\x0f\x62\xbf\x48\x66\xa7\x5f\xd3\xbc\xff\xff\xf3\x89\x81\x9b\xa6\xd4\x61\xe3\xbc\x46\x1c\x77\x5a\x65\xc7\x70\x8a\x4d\x30\xf7\x33\x05\x3a\x8c\xa0\xba\x26\xbf\xa6\x16\x74\x5e\x6b\xe5\xa0\x21\x3b\x85\x13\x9d\xd3\x23\xa8\x06\xde\x87\x53\x76\x5a\x3a\x63\x8d\xb5\xc6\x1a\x20\xd6\x64\xa1\x17\x42\x04\x6f\x4c\x98\x8d\xa9\x95\x66\x0e\x69\xa6\xcc\xa6\x5f\x9e\xc7\xde\xc3\x5a\x9b\xfc\xf0\x82\xf5\xf8\x2f\xe3\xa9\xb7\xa5\x3c\xb7\x2c\x75\x33\x03\xd9\x54\x31\x63\x03\xeb\xf1\xde\xa4\x79\xfa\xb5\x8e\xe1\x4f\xb7\x0e\x6c\xa4\xb4\x1c\x78\x60\x40\x7f\x75\x79\x6b\xdb\x14\xc3\xca\x10\x92\x4f\x6e\x9e\x67\x60\x27\x37\x85\xc6\xd5\xdc\xda\x19\x72\x8d\x0b\x0b\x55\xd7\x88\x20\x6a\x5b\x36\x13\x75\x80\x66\xde\xba\xb0\xd6\x93\x23\x03\x18\x98\x14\x57\x90\x53\x1e\x4e\xeb\x46\xdb\xc6\xe5\x36\xf4\x03\x63\xd4\x08\x06\x4b\x22\x71\xcd\x28\x1f\x4e\x08\x1b\x4a\x48\x8a\x94\x5e\xf3\xa2\x63\xcc\x5d\x61\x3c\xd5\xff\xfd\xaf\x68\x33\xc7\x3a\xf7\xc5\xcb\xff\x3d\x88\x2d\xd2\xdf\x7c\x13\x67\x8e\xe9\xea\xe3\xf7\xd8\x83\x67\x71\xe6\x37\x60\x6e\x8c\x35\x8d\xd5\x76\x3d\x79\x4b\x44\xaa\xc2\x94\xd4\x1b\xa6\x03\xb3\x67\x79\x2c\x9a\x74\x6c\x76\x45\x04\xe1\x48\x81\x30\xe4\x15\x09\xa3\x0b\xb3\x03\x3e\x50\x97\xf9\x4d\x10\xd3\x5a\x53\x97\x25\xe2\xc8\x50\x42\xbb\x35\xea\x8c\x96\xcb\xba\xae\xeb\x31\xb4\x83\x0d\x35\x8f\xee\xf7\x7d\x40\x60\x08\x16\xcc\x76\x00\x2c\x39\xc4\x1c\xb6\xdd\xe7\x51\x83\xfe\x25\x1b\xef\xf1\xcd\x2d\x81\x8b\x03\x96\xfb\x38\xf4\xa7\xd8\xd7\x88\x27\xc2\x97\x4f\x37\xd0\xe0\x2d\xec\xc7\x31\xcf\x36\xec\xf9\xe9\x7d\xb2\xff\xf8\x63\x76\x4c\xa5\x33\x35\x3b\xd9\x50\x2d\x28\xe5\xd0\x16\x05\x10\x40\xf3\x60\x82\x0f\xa7\xe0\x39\xe0\x43\x3b\x33\x40\xdb\x80\xfb\x0a\xba\x02\xed\x58\x55\xda\xb2\x82\x3c\x9c\x03\x27\xa0\x07\x0d\x0b\xc7\xa5\x26\xa9\x04\x67\x11\xd4\xe5\x4c\x77\xe5\x3e\x5f\xec\xa4\x88\x16\x46\xe9\x50\x96\x55\x5e\x74\xc2\x99\xf1\xa8\x8d\x52\x9d\x13\x46\x79\x05\xa9\xa8\x38\xab\x08\x47\x9c\x2e\x67\xe1\x98\x14\x85\x98\xa8\x62\x50\x5e\x13\x66\xf8\x86\x31\x63\x87\x7a\x0f\x93\x3f\x4a\xfe\x3c\xf9\x94\xfc\xdb\x17\xfd\xd9\x78\xdc\xbd\xdb\xfd\xf6\x5b\xfb\xe2\xd3\x5f\x7d\x7c\xfb\x21\x7a\x8b\x7c\x13\x62\x79\x8a\xa2\x94\x8f\x77\x51\x97\x57\x8a\x2d\x8f\x7b\xe1\xca\xe2\x74\xe6\xa7\x73\x37\x31\x40\xc3\xec\x8c\x10\x15\x81\x0c\x57\xce\x1f\x5d\x8a\x41\x43\xd1\x72\x02\xa4\xaa\x14\x25\x67\x84\xbb\xcb\x40\x77\xdd\x32\x33\x71\x1c\x21\x34\x92\xb9\xa2\x0c\x5d\xf0\xc8\xa9\x6b\xb2\x87\xa8\x2c\x5b\xee\xe4\xd0\x69\xdb\x18\x17\xfa\xb6\xd5\x2a\x77\x39\x6f\x6a\x20\xbe\x26\x7b\xbb\x30\x42\x0c\xaa\x18\x15\x86\x10\xc3\x8d\xe5\x05\xc4\x15\xb6\x0d\x41\x15\x2a\x0c\xab\xb7\x5e\x4e\x7d\x25\x07\xbb\xc7\xaf\x22\xce\x5f\xdc\xd4\x59\xb6\x20\x7a\x6f\x00\x3c\xde\x8e\xfe\xff\xfe\x59\x9b\xec\xfb\xf8\x73\x9f\x48\x3f\x6c\xb3\xc5\x57\xfd\xae\x43\x4a\xc1\xd9\xa7\x48\xa9\x65\x48\xd9\xcf\xe7\xb4\x0a\x45\xd3\x44\x84\x39\x98\x81\xbb\xe8\xe7\x47\x14\xb8\xa0\xd2\x0a\x74\x5f\x4b\xd0\x97\x65\x0d\x77\x3a\x4c\xc4\x8f\x27\x19\xa6\x39\x4c\x81\x10\x40\xa6\x60\x19\x09\xdd\x0e\x79\xbe\x9c\xf1\x3e\xc1\xb8\xd3\xed\x1a\xe4\x08\x69\x35\xc6\xf8\x84\x31\x0e\x94\x31\x16\xa6\x0a\x96\xc8\x08\x8a\x88\xe2\x98\x63\x03\x11\xc5\x58\x23\x8a\x93\x3d\xe8\xae\xe4\xa0\xf7\x22\xc9\x6f\xef\xfc\x6f\xbe\x29\x54\x7e\xdc\xbf\xfa\xb4\x3f\xaf\x1f\x77\xf4\x0e\xfd\x26\x4d\x79\x97\x0f\x79\xf7\x5a\x67\x24\xca\x53\xee\x0c\x2c\x01\xba\x9c\x01\x41\x99\xf1\x8d\xd2\x88\x97\x82\x20\xd4\xd7\xe1\xe4\x2e\xe7\x0d\x5c\x2f\x83\x6f\xd3\xc1\xf8\xc6\x96\x75\x23\x38\xa3\x25\x61\xa4\x6e\x4a\x20\x94\x08\xc5\x5e\x60\x6a\x2d\x23\x36\x98\x71\x72\xbe\xf0\x25\xa3\xc3\x00\xfc\xcf\xe3\xbe\x3d\x87\x46\xcb\xd0\x5b\xce\x60\x51\x6a\x58\xd6\x94\x16\xae\x28\x75\x59\x58\x68\x11\x5e\x63\x14\xbb\xe2\x43\x1d\xf3\xf1\x7f\x14\xf1\x02\xbf\xa2\xf3\xb0\xbb\xe9\x6d\xbe\x7d\x7c\xf8\x96\xb8\x6e\x1f\xf6\xab\xca\xed\x06\xda\xba\xf7\x7c\xf7\xc4\x57\x08\x9c\x75\x25\x4c\xab\x9c\xd1\x47\x73\xd2\x46\x40\xdd\x50\xae\x49\x19\x4e\xf9\xc5\x82\xc4\x03\x18\xa6\x69\x02\x45\xa8\x0b\xa0\x73\xa9\x90\x2c\x15\x29\x61\x3e\xb3\x49\xcc\x68\x04\xd5\x30\x5c\x93\x7d\x85\xac\xb4\x01\x0d\xf5\x1a\xed\x6a\xad\x4c\x33\x80\x1c\x71\x50\xb8\x38\x89\x61\x25\x20\x4a\x59\x6d\xb5\xb5\xc1\xf6\xd0\x42\x31\x84\xbe\x36\x0d\xe8\xd7\x27\x93\x24\x4b\xf3\x35\x16\x67\xc7\x5b\x0f\xef\xaf\xe3\xbc\xf3\xcd\x0b\xbf\xdb\x9b\x50\xc5\xbb\xc7\x4f\x6f\xa3\xf8\xee\x53\xfc\x76\x03\x6c\xa6\x37\x76\x42\x24\x85\x3e\x7e\x7c\xfb\xfe\xe1\xf0\xf4\xf9\xcb\x63\x26\x02\xb1\x5a\x68\xcb\x4d\x59\x35\x13\xdd\x54\xc1\xd0\x9c\xb6\x7d\x5e\x9e\xe6\xbc\xa0\x15\x2c\x73\x5d\xc0\x42\x2b\xa2\x06\x09\x4a\x16\xe6\x8a\xb9\x0a\x36\x30\x0f\x75\x76\x5c\x92\x40\x09\x75\xb4\x1d\x29\x25\x4a\x90\x3d\x32\x7d\x1f\x8e\xc7\x23\xe8\xec\xd4\x5a\x84\x02\xc3\xe8\x08\xaf\x09\x42\x98\x83\x2a\x9c\x3b\x05\x12\xa0\x34\xa0\xd0\xba\x76\x5a\xf3\xd1\xe8\x7f\xb8\xc7\x37\x8c\xdd\x8f\xc9\x97\xe4\x5f\x46\x1f\x90\x5f\x20\xed\xee\x8a\x2d\x9f\x1e\xef\x3a\x49\x9f\xc0\x87\x97\xb4\x82\x17\xe2\x2d\xdb\xd9\xba\xff\x5e\x25\x3e\x1d\xea\xa2\x04\x70\x71\x6d\x89\x63\xce\xc3\x42\xbb\x9b\xd6\xa4\x54\x30\x02\x46\xa4\x1c\x63\xc1\xb3\xd4\x19\x2a\x7b\xd6\x59\x7b\x44\x8d\xd6\x23\x47\xe1\x8c\x2e\xb4\x3e\x0f\xe4\x14\x4e\x90\x78\x92\xe7\xb9\xcf\x55\x38\xd7\x62\x8f\x21\xc3\x8b\x4b\x15\x0b\x9d\x0a\xb5\x06\x74\x68\x89\xc2\xf5\x1c\x7a\x6e\x18\x0f\xd6\xda\x22\xcc\x9c\x73\xcf\x8c\xe1\x96\xaa\xba\xd2\xce\x9b\x1e\x73\xc3\xb0\x81\x45\x01\x73\x81\x6a\x46\xe8\x7a\x2f\x50\x9c\x67\xb8\x17\xf9\xd0\xef\x37\x87\xfa\x7b\x47\x65\xc3\x97\xbd\x12\x08\x8f\xf5\xd6\x37\xe1\xe9\xdd\xcb\xda\xf9\x96\x9e\xbf\x3b\xfc\xd5\x47\x80\xc0\xd1\x01\xea\xc1\xf1\x92\xc0\xcc\x7c\xe5\x30\xeb\xa4\xc7\x14\x71\x8a\xd1\xd7\xca\x86\x26\x5a\x8e\xf3\xf5\xaf\xe0\x89\x20\x57\x61\xb3\xee\x35\xba\x9c\x1d\xe5\x56\x82\x96\x38\x92\x75\xe3\x38\x8e\x81\x6a\x2b\x83\x68\x0b\x5f\x88\x01\x9c\x6d\x1c\x00\x5d\x46\xae\xb0\xe4\xa5\x75\x95\xb7\xc5\x5a\x3e\x3b\xe3\xeb\xb2\xb5\x49\x92\x82\xe8\x25\xb9\x47\x37\x6f\xd0\x6f\xfa\xed\x2f\x34\x04\x6f\x5e\xa1\xbf\xbd\x9f\xb3\x3f\xdd\x9c\x42\xdf\x7c\x06\xeb\x27\xba\x73\xd2\x75\x9b\xe1\xa7\x07\x36\x96\x15\x3d\x18\x97\x29\x2d\xcd\x79\x04\x10\x07\x1f\xa6\x30\x04\x25\x81\x04\xc9\xd1\xd5\x29\x59\xfa\x09\x8c\xa3\x59\x88\xdb\x23\xc5\x2a\x65\xd5\xfa\x9c\xb6\xca\x2e\x46\xeb\x46\x93\xca\x23\xad\xb1\xaf\xa8\xaa\xad\x4e\x39\xfa\xda\x70\xad\x37\xad\xf6\x75\xaf\xe9\x3d\xba\x4d\x49\x9e\xee\x7b\xed\x77\x2f\x36\xdb\xd3\xc7\x2f\xef\xf7\xb7\x0d\x07\x7e\x71\x60\xae\x11\x34\xb3\x01\x7a\x53\x21\xe3\x84\x87\x55\x77\xa6\x33\xf2\xe4\x9a\x6c\xeb\x6e\x67\xea\x5a\x49\x4e\x0a\xce\x68\xdd\x84\xa3\xcf\x9a\x25\x0f\x8a\x50\x4e\xf1\x30\x53\xc1\x25\xa7\xd9\xcc\x91\x75\x4d\x13\x86\xa6\x01\x67\x17\xd8\xd4\x69\x5d\x3a\xa8\xea\x13\xe8\xbe\x26\x7b\x17\x6b\x05\x1e\x7b\x57\xf2\xa6\xd8\x43\x92\x7f\x93\xd0\x67\xd4\x54\x54\x0b\xb9\x07\xbb\xf5\xd6\x7e\xbc\x75\x5d\xee\x2e\x65\x2f\xbf\x3e\x82\x4f\x1f\xfe\x34\xdd\x52\xbb\xfd\x2d\xc5\xdb\x61\xc9\x41\x49\x51\x83\x30\x70\xa1\x00\xaa\xef\xc3\xb9\x07\x90\x85\xf1\xe8\x07\xdf\xcd\x02\x54\x4d\x38\x01\x1e\x6d\x85\x7a\x40\x82\x01\x54\xa5\xc5\x30\xf8\x69\xe9\x06\x3f\xed\xa3\x9c\x28\xa2\xc8\xea\xd9\xce\x47\x51\xdb\x29\xf0\x34\x5f\x66\x60\x47\x6d\xec\xd1\x2a\xbb\x86\x3d\x1e\x1a\xad\xad\x52\x4a\xcd\xeb\xb7\x24\xd9\x83\x26\xee\x85\xe4\xb5\xab\xec\x4d\x23\xe6\xf0\x6a\xa9\xdc\xf9\xab\x1b\xe2\xe1\xe5\x54\x6a\x5d\x39\x60\xde\x93\xc5\xe5\x45\x8a\x97\x12\xa7\x93\x6e\x7b\xc0\xaa\x20\xc2\x18\xc6\x20\x31\xa0\x27\xcd\x9d\x10\x63\x77\x4d\x40\x57\x2c\xa7\xd3\x4e\x5d\xdc\xfd\x02\x63\xa7\x96\xa3\xde\x27\xa6\xaa\x16\x81\x8d\xa6\x38\xb7\xb9\xe2\x6b\x31\x44\xb8\xa8\x34\xf3\x69\xcd\xc2\x99\xac\x5f\x21\xc1\x6c\xeb\x61\xa7\xe8\xca\x0e\x78\x8f\x92\xb7\x2f\xba\xf1\x6b\x35\x1a\xbd\x79\x5e\x2f\x24\xf0\xbd\xb1\x4f\xc4\xea\x3e\x63\xb6\xef\x79\x47\x74\x91\x4c\x11\x48\x3a\xd5\x4d\x5a\x55\xeb\x49\x6f\xf2\xa2\x6f\x68\x2a\xd3\x9a\x1b\x2a\xa1\x62\xa8\xca\x27\xd4\xa9\xa6\x6a\x53\xe9\x2f\xda\xb9\x5b\x8f\x54\x5d\xf4\xfd\x51\x70\x59\x57\x31\x4d\xab\xd0\x55\x88\x11\xec\x5a\x0c\x4b\x8e\x59\x8a\x03\x6e\x4b\x5b\x0a\x90\x87\xae\xd7\xf5\x79\x39\x2d\x25\x21\xe9\x29\x9c\x6d\x34\xc8\xb7\x36\x79\x00\xd3\x95\x1e\xda\xac\xbf\x9d\x41\xff\xdd\x4d\x59\xe9\xf1\xc5\xe6\x58\xdf\xd2\x73\x03\xe8\xfb\x78\xfd\x7b\x00\x7e\x5d\x6c\x0b\x4c\x29\x0d\xcc\x4a\x58\x79\x59\xd5\x45\x73\xa4\xfe\xde\x3b\xd8\x15\xb9\xd0\x42\x32\x30\x61\x53\x73\x16\x2c\x4f\x1b\xae\xf4\xc8\x4f\xda\x8f\xa8\x33\xf6\x24\x50\x38\xa1\xac\x5f\x8a\xa0\x09\x66\x0c\xf6\x7d\x25\x04\xa3\xbb\xae\x0d\xb0\x05\xa8\xad\xb1\xc2\x7e\x08\xe3\x1a\x8e\x87\xa5\xb3\x76\x70\x82\x79\xa1\x2d\xb3\x54\x35\x58\x1b\x1f\xeb\xb9\xf6\x4a\x0f\x2c\x9b\x9f\xa7\x64\xff\x30\xe2\x33\xff\xc9\xc6\xb1\xf9\xc6\x15\xff\x4e\xbf\x06\x3c\xbd\xf9\xf0\xb2\x01\xf4\xd0\xae\xd5\x3c\x87\x42\xe2\xaf\x34\x6d\x16\xee\xa3\x70\xd8\xed\x4a\x8f\xde\x2f\xa5\x15\x4a\x6b\x30\x4b\xea\xb1\xc8\xe6\xaf\x48\xf3\xb2\x86\x22\x33\x5f\xa7\xf4\xd4\x84\xaa\x09\x55\x9d\xb6\x17\x8c\x68\xc3\x95\xd0\xda\x11\xa7\x13\x10\x6b\x66\x9d\xcd\xd1\x8b\x77\x8d\xa0\x71\x4f\x7f\x8e\xe4\xac\xc3\x8b\x28\x7a\x67\x03\xfd\xf8\xe5\xf1\xcd\xe7\x5d\x23\xad\x3f\x9f\x01\xcf\x7d\x0e\x74\xec\x73\x9e\x41\x1b\xca\x01\x78\x11\x60\xdd\x87\x8a\x83\xc1\x05\xd6\x67\x93\x22\x70\xb2\x23\xac\xd2\x69\x81\x15\x1c\xed\x68\x2f\x5d\x98\x95\x6f\x41\x15\xa6\xd6\xd6\xd3\x0e\xc1\x88\x89\xaf\xe3\x7c\xa6\x88\xf3\xd0\x3f\xdf\x58\xcc\x2f\xfb\xfd\xb7\x1e\xff\x7a\x47\xde\xac\xaf\x67\x2d\x9c\xfe\x00\x3c\xfe\x29\x78\x04\x27\x80\x3c\xe8\x63\x6f\x7f\x29\xc2\xb0\xb3\x81\xf4\xc4\xda\x63\x86\x83\x05\x09\x10\x3c\x90\x70\x02\xcd\x92\xec\x92\xcc\xad\x55\x9d\x9b\x67\xad\xf5\x22\x4f\x9d\x98\x00\x3c\x07\xd6\xb0\xc6\x82\x12\x54\x9b\x76\xed\x36\xdb\x74\xd9\xf9\x59\x5d\x78\x63\x64\xc6\x73\xe5\x0e\x8b\x7b\xf3\xb8\xc6\xee\xfd\x0b\xaa\xca\xcb\xee\x32\x18\x00\xf1\x60\xf4\x6b\x4e\x7e\x99\x43\xbf\x6b\x43\x95\x4e\xb5\xf4\xbc\xbe\x68\xab\xb5\x71\x3b\x24\xab\x16\x8a\x81\xc3\xb6\x64\xbb\xd3\xbd\x5b\xec\x62\x25\xb9\x06\xbc\xfe\x78\x3c\xf1\xd3\x40\x58\x38\xd7\xba\x6b\xfb\x1e\x0d\x1d\xec\x8f\x68\xec\xb6\xd7\x58\x5f\xc5\xa1\xdd\xa3\xe4\xbf\x7d\x11\xa1\xa3\x9b\xf2\xfb\xbb\x8d\xf2\xef\x3e\xbe\xd9\xca\xe8\xc8\x31\xfa\x63\xf0\x18\xb7\xca\xcd\x78\xfd\x71\x7f\x23\xe8\x45\x69\xa7\xd7\x96\x26\x09\xe8\xd6\x1c\xa2\x4a\xc7\xe0\xa7\x13\x97\x22\x50\xda\x0a\xce\x61\xee\xa1\x09\x03\xef\x55\xc0\x0c\xf3\x7e\x0c\x47\x40\x40\xee\x40\x25\x45\x18\xa4\x8d\x59\x5e\x0f\xe0\x02\xef\x8f\x32\x2d\x38\xc5\xd8\x1e\xd7\x94\x60\x19\x08\x82\x79\x4e\x3d\x3d\x51\xca\x75\x9a\x13\xa8\xec\x38\x38\x27\x94\x09\x75\x0c\x07\x91\x07\xbc\x07\xa7\x78\x4e\xe6\xb1\x8f\xb3\x55\x16\xbf\x98\xfe\xdc\x1d\x70\x5f\xc4\xb4\x8d\x76\x40\x40\xe9\x81\xd9\xf6\xb9\xfa\x59\x01\x15\x4e\xa0\x8d\x4d\x9a\xf1\xd5\x7c\x2a\x8b\x65\xfc\x36\x8a\xeb\x02\x5b\x20\xa5\xe9\x14\x66\x1d\xa2\xe0\xd1\x1a\x93\xc8\x41\xee\xf1\xed\xac\x5e\x57\xe4\x3f\x79\xce\x1e\x9f\xe7\xb9\x4f\xf1\x74\xd8\xbd\xa8\xdf\xfe\x31\x78\x38\x3c\x7e\x8a\xdf\x76\x53\x53\xc2\xb4\x09\x1a\xcc\x21\xf7\x4b\x3e\x76\x22\x34\xa0\xda\xd8\x0e\x27\x20\x2e\x1d\x28\xab\x22\xb4\x60\xca\x21\x70\x01\x51\x05\xf2\x3d\x46\xb8\x5a\xca\x7e\x9b\xeb\x32\x95\x9e\x42\xb4\x19\xaf\xa8\xe0\xac\x09\x83\xa6\x7d\xb2\x8b\x31\xc5\xee\xcb\xe4\x7d\xf2\xd3\xc6\xce\xb8\xcd\x63\x93\x17\xf6\x06\x60\x9b\xcb\x6e\x43\xa6\xbb\x86\xd1\x73\x80\x4c\xcb\x14\xbb\x94\x2f\x0d\x28\x81\xe3\xc1\x4d\x6e\x0e\x9d\x00\x1e\xe4\xcb\xb1\x77\x05\x54\x5c\x30\xc6\x94\x9a\x76\xc2\x15\xa5\x51\x52\x48\xcc\x55\x97\xa9\xa6\x71\x81\x87\xc6\xd6\x1e\x14\xcb\x29\xcd\xc3\xd9\xba\x7a\x4d\x02\x11\x14\x9c\x72\xc3\x69\x6e\x95\x9c\x40\x0e\x39\x13\xda\x1a\x21\xb8\xec\xd6\xcf\xf4\x18\xfb\xc3\x30\xf9\x93\xc8\xf6\x7b\x7a\x39\x47\x7e\x6e\x32\xbe\xe8\xbb\x3d\xc6\x65\xfc\x8b\xd3\xf8\xc7\xf7\xbf\xfd\x33\x10\xc9\x9b\x1c\xcc\x2e\x85\xcb\x94\xba\x9f\x75\x2a\x43\x0e\x12\xe1\xc3\xcc\xe6\xf4\x04\x8a\xb3\x9a\xc2\x1c\x1a\x07\xab\x54\x37\xe3\x0c\x78\x15\x58\x18\xc2\x39\xd4\x14\xe0\x49\x32\x26\x0c\xe0\x4c\x98\xe2\x68\x97\x13\x8c\x83\x1d\x6f\xad\x0f\x83\x5a\x83\xb7\xa6\x52\x2b\x56\xe1\xca\xb6\x46\xe4\xbe\xf0\x1a\xbb\x8a\x53\x41\xb0\xe8\x88\xa2\xb9\xd4\x30\xd9\x83\xf9\xca\x0f\x34\x9b\x62\x8c\xf8\x31\x22\xcb\x63\x1e\xf1\xcd\xe0\x74\x8d\x58\x1f\xde\x81\xc7\x4f\xaf\xa6\x7b\x1f\x6e\x5b\x32\x1e\xbe\x60\xde\xb3\x40\x80\xf6\x97\xa8\x91\xcc\x77\xc9\x31\xd8\x5d\x2b\x1b\x71\x9c\xf4\xf1\x94\x0e\x95\xaa\xe0\x85\xed\xda\x0b\xcb\x26\xe7\xbf\xd6\x94\x66\xc2\x7b\xef\x17\x63\x28\x1f\xd8\x60\x85\x74\xac\xad\xca\xfc\xb4\x24\x91\x5b\x94\x02\xb5\xd6\x3d\xd9\x9c\xfc\xf6\x9e\x13\xbf\x84\xf1\x7e\xda\x64\xf0\xb6\xb9\xe1\xc7\xf5\x25\xbc\x8b\x4a\x34\xfb\xc7\xc3\x23\x7c\x56\x2f\xec\x94\x69\xd6\x1d\x03\xd8\xe5\xb4\xe9\x6b\x2b\x43\x80\xba\x34\x08\x53\x18\xa6\x22\x26\xc9\x73\x98\x41\x51\x5a\x07\xce\x60\xc6\x81\x2c\xa7\x5e\x39\xe1\x84\x40\xd9\xac\x2b\x18\x06\x1b\x7a\x6b\x01\xb1\xa0\x2c\x0b\x07\x17\xe5\xa5\x19\x34\xc0\xce\x86\x3e\xf8\xc9\xe4\xbe\x31\xc2\x72\x65\x8f\x49\x0a\xe8\x95\xc5\x7e\xe0\x3e\xf9\xe7\x77\x4e\xe0\xfe\x39\x92\xbd\xf9\x31\x96\x5c\x3f\x7e\x79\x9f\xed\xdf\xc5\x36\xd8\x6f\x9f\xe0\x97\xc8\xc1\x78\x84\xbf\xfb\xb8\xff\xf8\xd3\x9b\x8d\xc1\xf9\xb8\x37\x1c\x5b\xc4\x2f\x13\xc0\x45\xee\xf3\x62\xd7\x2d\x25\xa8\x8e\xfc\x14\x6a\xa0\x4e\x3c\x4c\x41\x01\x0f\x2a\x1e\x86\x40\x50\x0b\xca\x0a\xf9\xc2\x06\x77\x4d\x6c\x11\xce\x74\x5d\x11\x6b\xa2\x2f\x78\x98\xf6\x90\x4b\x26\xf9\x68\x6c\x61\xb4\x0b\x67\x51\x8b\x5e\x6a\x73\x14\xb3\xe6\x6a\x16\x61\x36\x45\x85\x1d\x9a\x34\xc1\x48\x93\x5d\xb9\xd8\xa0\x2c\x10\x69\xf4\x79\xd9\x83\x3a\xe6\x98\xd5\x7f\x4e\xcf\xfa\xbb\xc9\xd6\xeb\x3e\xd0\x9c\x8a\x3a\x72\xe7\x8a\xe5\x9c\xfa\x45\xd6\x0b\x4d\xbb\xe5\x9c\x16\x4b\x3d\xc5\x50\x06\x81\xbe\x75\x9e\x21\xd0\xd9\xc0\xb9\xd5\x0b\xd7\x76\x9a\xac\x4e\x1b\x1d\xf4\x73\x6e\xb5\x03\xfd\x15\x1f\xdc\x3e\x4f\xfe\xd1\x2d\xab\xba\xfb\xc2\xbd\x16\x6e\xdd\x64\x5b\xdf\x7c\xf8\xe9\xdb\x96\x7c\x5d\xff\x6e\x08\xf7\xe8\xff\x00\xc6\xa3\x6b\x9a\xba\xe4\x82\x0a\x46\x21\x63\xa8\x26\x4a\x1d\x53\x7a\x13\x00\x02\xb8\xe1\xee\xc8\x86\xa6\x9b\xe9\xb9\xae\x39\x5d\x4f\xe6\x89\x1a\x4b\xb2\x62\x9e\x5d\x18\x91\xad\x60\x10\x5b\x7a\x02\x08\xaa\x61\x09\xf8\xb1\xeb\xdc\x49\xc2\xd0\x4a\x45\x3d\xf3\x35\x73\xd4\x74\x20\xb1\xa7\xe0\x7a\xe7\xfa\xcd\x7b\xb5\x8b\xd8\x00\x14\xd5\xda\x9e\x1b\x2e\x2f\x54\x1e\x7f\x4d\x64\xf1\x53\x14\x60\x8c\x62\x0e\x1f\x6e\x9a\x86\x9f\x1e\x53\xbe\x1e\x11\x22\xd4\x27\xa7\x9c\x90\x40\x04\xc8\x38\xa8\x7d\x97\x56\xcb\x28\x85\xe4\x25\x13\x6c\xa9\x53\xe1\x74\x30\x53\xe8\x58\xeb\x7a\xd0\x2b\xbe\x94\x69\x12\x4c\x36\x08\x61\xbd\xeb\x90\x37\x96\x11\xa7\x44\x6e\x47\x4a\x4b\x57\x96\xbd\xe5\x94\x1a\xa5\x31\x31\x94\x5a\x9f\x24\x3b\x60\xaf\xea\xe0\xb3\x39\xf9\x93\xe4\x1f\x46\x56\xe5\x77\xc0\xfa\x97\x51\xf9\x87\x57\x7f\x48\xcb\xb4\xac\x53\xb6\xb4\xe9\xf1\x6f\xcf\x69\xb3\x9c\x76\x93\x2f\x60\xad\x34\xd7\xc4\xe9\xf3\x92\xb8\xbc\xd4\x42\x53\x8e\xbd\x3a\x81\x7a\xc7\x2f\x8d\xbf\x26\xde\x83\x64\xd7\x41\x25\x9b\xce\x34\xae\xa9\x35\x28\x00\x87\x82\x37\x8d\xf1\xb6\x69\x15\xc8\x93\x0c\xd8\xd8\x1b\xd9\x72\xad\x9f\xbe\xf9\x7d\xdc\x51\x3d\x6f\x62\xae\x05\x1e\xdf\x3d\xec\x5f\x86\xdf\x0f\xd1\x9a\x1a\x4c\x6b\xba\x75\x8a\x2d\x9d\xcb\x29\x0c\xbb\x36\x94\xc1\x66\x8d\xbd\x26\x23\xd0\x28\xe0\x70\x0a\x63\x30\x02\xc8\xb9\xf3\x12\x20\xdf\x0c\x26\xd3\x6b\xd0\x8a\xd8\xa2\xf5\xb0\x3d\xeb\xa3\xe3\x45\x5d\x78\x4d\x1c\xe2\x7a\x68\x98\x74\x31\x76\xad\x67\x84\xca\xe6\x5f\xe8\x9d\x7c\xb9\xeb\x9d\xbc\x3f\xfc\x6e\xf7\xac\x42\xb5\xc3\x8e\x48\x8f\x08\x03\xc9\x09\x08\x0f\x7c\x68\xdd\x99\x8f\xde\x9b\xa3\x1c\x5d\x38\x65\x73\xd5\x77\x5f\xcf\x3b\xc8\x88\x03\x38\x5f\x5f\xb0\x0f\xaa\x6f\x8e\x40\xae\x29\x40\x68\x47\x3b\x81\xd8\x47\x68\xaf\xf8\xa0\xb2\x63\xb2\x8f\xac\x94\xbb\x46\xf4\xd6\xe6\xf9\xf2\x6d\x08\xf1\xb0\xed\x91\x14\x7c\xfc\xfc\x43\x1c\x83\xbd\xdf\xc5\xc1\xee\xfe\xcc\xaa\xba\xa2\x80\xaa\x21\xcc\xc4\xfa\x02\xe6\x75\x21\xe7\x93\x51\x86\xb7\xde\xd3\x20\x55\x73\x2e\x42\x07\xd6\x37\xbd\x13\xcb\x30\x64\x47\xa9\xb1\x91\x21\x37\xa7\xda\x94\xb0\xac\x6a\x34\x4a\xca\x38\xc6\x96\xae\x65\xec\x31\x28\xd3\x82\xb1\x77\x00\xe5\x61\x74\x41\xb8\x4d\x6b\x22\xf6\x5b\x61\xbc\x3f\xbf\xfb\xe5\x1d\xfa\x85\xd9\xc7\xfb\x1b\x95\xdc\x13\xe9\x29\xe3\xa0\x9c\x52\xe9\xce\x67\xae\x9d\x81\xd6\xa1\x6a\xf1\x67\xc3\x1d\x33\x7b\x88\x8e\xc7\xaf\xd3\x2e\xd7\xa2\x06\x9a\xac\xd9\xa7\x5f\xf2\xbb\x08\xc6\x20\xfa\x91\x8f\x6b\x9c\xb6\x57\x7e\xa8\xb3\x29\xf9\x21\x56\x0b\x4f\x6f\x3e\x7f\xb9\xfd\xd6\xdb\x1c\x30\x3e\xf5\x3e\xdd\xbf\x86\x00\xa7\xc8\x71\xe6\x4f\xa7\xa9\x0c\x26\x20\xc8\x59\x3a\xfb\x41\xb9\x3a\x0c\x15\x57\xb4\xf0\xd0\xf4\xad\xdc\xcd\x17\x92\x97\x99\x0d\xdc\x2f\x03\x72\x82\xd6\x45\x9e\xf5\x21\x69\x1a\x76\x4d\xfa\x50\x56\x25\x6f\xf0\xac\x98\xba\xdf\x07\xbf\x2f\xa3\x12\xfa\xf3\xea\x8d\x2f\xe4\x65\x9d\xb2\x29\x70\xde\x9b\x58\xe0\xdd\x5a\xcf\xa4\x08\x9c\xeb\x14\x76\x5d\x80\x0d\x18\x79\x28\x8e\x6d\x40\x1c\x78\x1f\x24\x18\xcb\xa5\x4f\x49\x28\xd2\x38\x87\x2d\x80\xcb\x74\x5d\x87\xe3\x7a\x60\x4d\xaa\x59\x0f\xe8\x6e\xf0\xed\xd9\x52\x5a\xd9\x35\x27\x3b\x56\x94\x76\x37\x9f\x5d\xf2\x30\x67\xcd\x0b\x34\xe7\x33\xf7\x70\x7d\x69\xe0\xc6\x5e\x5a\x8b\xbc\xa8\xc3\x3f\xd7\x97\xba\x06\x73\x1d\xf2\x18\x2f\x67\x20\x2f\xf5\xfd\x51\xf0\xbb\xe1\xab\x32\x26\x73\xe3\x18\x68\xf4\xb4\x58\x13\xea\x68\x39\x99\x24\x69\x8a\xe3\x8c\xf3\x7c\x53\xf5\xbc\xef\xd8\xdb\x2f\x5b\xff\xf5\x2c\xaf\xd3\x7e\x21\xa9\xac\x2f\xb2\x06\x43\x18\x76\xfe\x22\xb3\xf3\xec\xaf\xc9\x65\x54\x6a\x57\x2d\x71\xd5\xaf\xeb\x7e\xad\x21\xd6\x9a\x6b\xcb\x5e\x5e\x7b\x0d\xbd\xb9\xc9\xe6\xde\xa8\x2f\x2f\x14\x46\xa2\xe9\xc3\xbb\xc7\x4f\xbb\xb2\xc6\x3b\x8d\x2b\x47\x65\xe5\x09\xac\x2e\x13\x41\x29\x5f\x66\x05\x10\x48\x8a\x09\x96\xa5\x87\x14\x2f\xc7\x20\x3c\xc2\x6a\xd6\x40\xed\x8b\xca\x2e\xae\x36\x65\x5d\x36\xa0\x57\x38\x94\xe1\xbc\x49\x8a\x74\x7c\xc4\x15\x95\xe9\x80\x91\x9e\xc2\x38\x8e\x71\xbd\xcf\xd7\xfa\xe0\x33\x9a\xec\x63\xd6\x98\x6c\xd2\x04\xe0\xf1\x87\xb7\xef\xd3\x75\xe7\xbd\x8d\x7f\xce\x8c\x43\x6d\x65\x43\xb9\x23\xbd\x6d\x4c\x07\x9a\x9f\xc5\xb9\x66\x35\xab\x33\x1a\xba\xd0\x21\x20\x01\xba\x94\xe0\x98\x56\x78\x39\x07\xee\xb3\x22\x8c\xc1\x61\xa0\x00\x8a\x9a\x8d\xf4\xa0\xf6\x79\x54\x44\x78\xa9\x18\xfc\x2d\x35\xbd\x21\x37\x1f\xd7\xaa\x29\x2d\x81\xc6\xc8\xc3\x2a\x3d\x5f\x3a\xe5\x40\xed\xa3\xa8\x11\x5d\x3a\xbf\xa8\xd4\x2d\x35\xac\x4d\x38\x65\x54\x08\xc8\xa9\x6b\xed\xe9\xe4\x4e\x7e\xfd\xe8\xfc\xc9\x9b\xe8\xfb\x6e\xd6\xdc\x20\xab\x23\x5f\xf9\xf1\x9b\xc8\xd1\xbb\xc7\xd7\xaa\xef\x37\x85\xd1\xc7\xb4\x00\x33\xcc\x03\xca\xfc\x32\xe5\x30\xf5\xa1\xc2\xaa\xc6\xb9\xcf\xd5\x35\xe9\x0d\x75\xcb\xc8\xc1\xc9\x84\x2a\x3d\xd9\xda\xb9\xda\xba\xe5\x5c\x42\xd2\xa0\x49\x51\x9e\x92\xa5\xe9\x7c\x0d\xc6\x24\x01\x69\x11\xfb\x10\x6d\x64\x63\xc6\xc8\xbe\xb9\xc0\xae\x05\xcc\x6b\x69\xc2\x3b\xb8\x2c\x95\x99\x3c\x5e\x93\xb2\x48\x21\xe1\x0d\x43\x81\x71\xad\x25\x54\x9a\x2e\x43\xca\xb4\x53\x9c\x77\xf5\xc5\x67\xad\x6b\x4d\x51\xda\xb6\x46\xce\x2e\xa7\x18\x34\x04\x38\x3b\x1e\x05\xb4\x65\x3c\xb7\xe7\x2b\x3b\xa8\x6c\xd8\xf4\x71\x36\x20\x70\x54\xeb\xbf\x39\x64\x3c\x48\x11\xd4\x32\x67\x24\x88\x3a\x24\xbd\xf6\x29\xce\x06\x27\xca\xd9\x2f\x65\x7a\x62\xa1\x0e\x47\x05\x72\x00\x53\x55\x6c\x79\xc0\x78\x25\x07\x95\x99\xa8\x4a\x74\xe7\x3e\xbd\x0c\x7c\xc9\x5a\xff\x3c\x7e\x7c\xfb\x7e\x5d\xc1\x29\xcd\xe6\xd0\x01\x1d\x2c\x97\x11\x9d\x00\xcb\x70\x0c\x95\x02\x33\xa8\x96\x23\xb1\x5e\xa6\xf0\x72\xce\x8c\x0b\xad\x0b\x5b\xd0\x83\x04\xc8\x70\xec\x6c\x07\x4a\x03\x10\x3e\x6d\x7a\x58\x5b\xfe\x21\xb2\x73\xd4\x1d\xfb\xb6\x40\xd2\x78\x4a\x7e\xbc\x9d\x92\x5f\x7e\xfb\x7e\xad\xb7\xb7\x34\x23\x56\x59\x7a\xb1\x69\xd1\x85\x79\x06\x98\x06\x35\x87\x53\x70\x0c\xd0\x73\xaf\xa5\x1f\x2d\xb7\xe8\xc2\xc0\xb8\x1c\xb3\xea\x78\x74\x93\x0a\xc7\x5a\x60\xc7\x8c\xa3\x1e\x4b\xed\x64\xab\x19\x71\xd4\x4d\xf1\xf7\xf7\x57\x7e\x50\xd9\x78\xd3\xc0\xdd\x8e\xc4\x7b\xc9\x17\x33\xe0\xb4\x4c\x61\x9d\xb2\x90\x8c\x40\x89\xd0\x9e\xea\x63\xe8\x24\xe0\x63\xa8\x76\x75\x94\x43\x0e\x64\x6c\x26\x70\xbc\x9c\x76\x79\x90\xd7\xc4\x81\x04\xb4\xf1\xbd\xed\xec\x55\x1e\xf0\xfe\x94\xfc\xf1\xfa\x6f\x3f\x6b\xeb\x7e\xf9\xe1\xcd\xe3\xce\xee\xda\xdc\xb5\x42\x97\x56\xb0\x92\x5c\xe6\xfd\xe9\x6b\x12\x4c\x51\x17\x16\xa8\x1d\x4b\xd2\x9d\x8f\x1c\x49\x1b\xdd\x0c\x22\xf2\x69\xbd\x1f\xe9\xe1\x63\xb2\xbb\x7f\x3a\x1f\xb6\xc6\xd6\x5e\xd4\xd5\x00\x0a\x71\x4d\x06\x7f\x52\x00\xfb\xf4\x14\x86\xf5\xa3\xf1\xd1\xa7\x67\x7a\xb0\x15\x9b\x3b\xdb\xce\xd7\xa4\x55\x20\x09\xb5\x0b\x83\x5b\xda\x94\xb9\x75\xaf\x26\xea\x4a\x76\xf5\x03\x4c\x7e\xb3\xf1\x07\x8b\x98\xed\x45\xdd\x96\x35\xd8\xbf\x79\xb4\xbb\x22\x1c\x73\x40\x43\x8b\xd6\xf7\x5d\x56\xe1\x08\x48\x1e\x8e\x0f\xd0\x07\x5c\x08\xbf\xf8\x70\x36\xe7\x34\xf7\x1e\xd4\x49\xf2\xb0\xab\xae\x34\xfa\x31\xfd\x71\xf2\x78\xeb\xa6\xfe\xbb\xbb\x6f\xe2\x37\x03\xa6\x0f\x7f\xfe\xee\x17\xee\x82\xdf\xb7\xed\xdf\xde\x39\x6f\x91\x09\xf7\xd2\x48\xe5\x64\x21\xa8\x3a\x54\x59\x44\x30\xd5\x36\x6d\x60\x8e\x98\xf6\xd8\x16\x25\xa0\x3d\x82\xb6\xba\x1c\xc1\x1c\x6a\xc9\x61\xa9\xf9\xfa\x74\x6d\x99\x1f\x86\x61\xd8\x25\xbd\x05\x23\xa5\x98\x41\x01\xab\x07\x5d\x29\xc3\x18\x31\xc2\x0b\x31\xe0\x5c\x0b\xd1\x8f\x15\xc6\x86\x71\x62\x9a\x05\x05\x5f\xa1\x48\x89\xc3\x8c\x72\xcc\x76\xba\x0e\xa4\x01\xe5\x57\xb3\xcf\x2f\x8a\xf1\xd2\x95\x68\xeb\x21\xbb\xa8\x61\xae\xa3\xc2\xc0\x5f\x45\x0c\xf4\x5f\x27\xff\xe1\x59\x47\xef\x19\x5a\x72\xaf\x13\xde\xc5\xbc\xf0\xd3\x87\xfd\xd3\x2f\x51\x42\x1f\xde\x7f\x43\x05\x3d\x7d\xfa\xb0\xfb\xed\xfb\xbf\x7c\x69\x0e\x17\x91\x8a\xf5\xa5\xa8\x8d\x4b\xf3\x12\xfa\xaa\x0c\x45\xe7\xfa\xde\x07\x5c\x77\x69\x71\x72\x84\x50\x41\x09\xa4\xac\x3a\x29\x5c\x9a\x12\x85\x7c\x8d\xa6\xae\x6d\x31\xa9\x20\x44\x85\x2d\x20\xaa\xca\x6b\x12\x8e\x25\x25\x15\xda\x4f\x7e\xf1\xcb\x1c\x14\x03\x0e\x9c\xd6\xb3\x02\x51\x16\x8e\x5a\x5b\xad\xb5\x46\xeb\x19\x69\x2f\xeb\x9d\x74\x90\xef\xb0\x6d\xfa\x88\x17\xd2\xda\x87\x5e\xeb\xdc\xc9\x8a\xf3\x22\x37\x14\xdf\x00\x43\xbb\x44\x24\xf2\xd0\xef\xab\x5b\x57\x36\x76\x9c\xef\x16\x39\x1f\x1f\xef\x14\x85\x17\x96\x98\xc0\x65\xd3\x52\x92\x0c\x07\xde\x02\xac\x83\x1f\x96\x7e\x0c\x1d\x03\x54\x04\x9d\x16\x08\x86\xd6\xaf\xc5\xfa\x7a\xed\xab\xa5\x13\xd6\x68\xd7\x0d\x53\xab\x3b\x61\x11\x02\x42\x84\xa3\x88\xbf\xb7\x39\xf8\xbd\xb8\xe1\x5b\xa3\xf2\x51\x4c\xbb\xef\x9d\xbb\x1f\xc1\xcd\xa0\xe7\x6e\xe1\xe2\x53\x86\x60\xf0\x99\x58\x8e\xb0\xda\x75\x81\x9d\x66\x11\x86\x30\x06\x1a\xce\xc1\x33\x50\xb5\x41\x80\x61\x87\x2e\xf1\x4a\xa7\x0a\xad\x85\x0c\xaa\xbc\xe7\xb5\x05\xf9\xdc\x38\x67\x52\x2c\xc2\xc8\x6e\x5a\xde\x73\x5c\x03\x7f\xb1\xf5\x61\xde\x3e\x7e\x7a\xfa\xcd\xe1\xef\x00\xe0\x6c\x02\x74\x37\x04\xce\xc3\x86\xc4\x78\x46\xe0\x7c\x78\xe3\x40\x59\xe7\xb5\x9b\x5c\x1b\x1b\xb0\x15\x11\x30\xb7\x45\x55\xb5\x0d\x6f\x43\xd2\x56\xe1\xc8\x27\x7c\x4d\x76\xfd\xb4\x9b\xeb\x9f\x65\xbd\x6f\x86\x1a\x0d\xf1\x3f\x5f\xc3\x12\xda\xaa\x45\x15\x61\x43\x38\x02\x3c\x6b\xcd\xeb\xc8\x9b\x73\xe3\x09\x98\x4d\x47\x40\xa7\x2c\xf2\x7d\x61\xf2\xf9\x35\x97\x7d\x3b\xa8\x5f\xd6\x75\xbf\x07\x8f\xbf\xc4\x98\xac\xb1\xa7\x03\xd2\xaf\x51\x06\xb0\x50\xe7\x05\xe8\x42\x21\xc3\x59\x36\xf2\x04\x68\x99\x87\x13\x40\xc1\x3f\xf8\xe3\x60\xb4\x64\x85\x14\xfc\x3c\x06\xe3\x1f\x12\xa5\x9c\x74\x18\xb9\x5e\x19\xa2\x1c\xc2\x8e\x54\xb3\x0d\x67\x6f\xa4\xcc\x5d\xc1\xa4\x07\xf0\x32\xec\xba\x04\x80\x62\x97\x3c\x9c\xa3\x8e\x55\x72\xc3\x33\xbe\xf2\x8e\x7e\xf3\xe3\x8e\xa9\x53\x18\xc1\x29\x94\x59\x1d\x92\x34\x59\xa6\xb4\xff\x19\x02\xf6\xa0\x35\xad\x5a\xdb\xf7\xb6\xf5\x97\x71\x97\x57\x9b\x06\x69\xb7\x23\x07\xf7\xb0\xf1\xf4\xb6\xee\xc1\x2f\x58\x89\x6b\x64\xdd\xff\xea\xb3\xd9\x11\xf5\x33\xc9\x3d\x54\xa1\x0b\xa3\x48\x87\x68\x38\xf5\xf3\xb9\x7a\xfd\xac\x5b\x9f\xcd\x8c\xaa\x8a\x4a\x60\xcf\x88\x4a\x65\xa8\x00\x1f\x7f\xf9\xcc\xfd\xec\x93\x87\x32\xad\x23\x23\xfa\xf1\x46\x89\x7e\x29\xd5\xfc\xe9\x31\x85\xbb\xf9\x82\x25\x70\xa0\x53\x85\xaf\x38\x5d\xe6\x00\xdb\xdd\xf1\x52\xa7\x75\xe0\x7d\x55\x10\x8b\x7b\x52\x11\x05\xa4\xdf\xf0\xf1\x65\xd6\x3e\x4c\xd1\x0f\xf7\xed\xe6\x2f\xf6\x9f\x63\x73\xa6\x95\xa6\x5c\x32\x65\x9b\x36\xd5\x9a\x72\xc1\x94\xad\xdb\x54\xad\x0f\xf9\xfa\xec\x83\x15\x94\x60\xa2\x8d\x32\xf2\xf9\x91\x10\x14\xc7\x47\x7a\xdd\x77\x57\x76\x68\x52\x7f\xd3\x46\x48\x7e\xc1\x40\x7e\x2a\xd6\xca\xf2\x87\x38\x7c\x51\x75\xc5\x69\x55\x78\x28\x7c\x27\x2f\xb8\xe9\x4e\xac\x73\x60\xaa\xeb\xd4\x2f\x2d\x2c\x69\x47\xce\x92\xc9\x54\x04\x15\x3a\xe9\x18\x28\x00\xbb\x9c\x93\x3c\xf5\x57\xba\x9f\xa3\x76\xf6\x3f\x4b\xfe\x32\xf9\x9c\xfc\x8b\xe4\x7f\xbe\x31\x06\xef\x2b\xf7\x96\x75\x6d\xd1\xf6\x69\xff\xfe\xf0\x1d\xd6\x6d\x53\xf0\xdb\xbd\x70\x3c\xd9\xdf\xa2\xee\x1d\xe2\xfd\x76\x6b\x7a\xdc\x8c\xb1\xbf\xdc\x04\x0f\x4d\x04\x38\xd7\x10\x49\x58\x2c\x67\x6a\xe8\x0c\x58\x3e\x96\x84\xe3\x5c\x95\xdc\x5b\xca\x0a\xa1\x87\x14\x2f\xc7\x32\xcd\x97\x59\xc7\xb1\x77\xcf\x58\x59\x41\x51\x05\xab\x9d\x45\x50\x94\x90\x28\x29\x69\x55\xb2\xb2\x7a\xd0\x58\x52\xc9\x05\xc1\x78\xa9\x97\x39\x38\x0a\x2c\x38\xa6\x6d\x27\xcb\xaa\xcc\x21\xae\x04\xc6\xa4\x2a\x44\xc1\x69\x18\x14\x0e\x33\xe7\xe7\x40\x29\xcd\x15\x06\x28\x94\x29\x0b\x13\x63\x90\x62\xde\x75\x33\xc6\x15\x41\x49\xf2\x87\x09\x8f\xd8\x7e\xf4\xec\x4d\xf0\xe9\xe6\xcb\xbe\x79\x11\xdd\xde\xf0\x1d\x68\x1a\x31\x8f\x77\x8a\xc3\xbd\x6b\xf5\xee\xc3\xa7\x75\xdb\x3f\x3d\x5b\xac\x81\xdb\x5c\xf6\xcd\x4f\x9f\x1e\xb7\xd3\xfb\xe1\xef\xb0\x63\xc9\x58\x3a\x2e\x95\x05\xc7\x80\x2f\xf9\xf3\xc3\x87\xfc\xe7\x3c\x2d\xca\x22\xe0\x54\xc1\xb2\x36\xaa\x24\xd4\xcd\x61\x2a\x09\x36\xce\x59\xf0\xcd\xf0\xbf\x0a\x63\x3a\x59\x04\x1a\x5a\x69\x5b\xd3\xd6\xdb\x86\xd5\x9a\x51\x58\xc9\x96\xad\x49\x7f\x98\xf7\x28\xf4\x4a\xa8\xf5\x5b\x98\xcd\x54\x42\x25\x21\xd4\x41\x17\xba\xc8\x9d\xa9\x4a\x9b\x83\x23\x09\x6d\x98\x39\x48\x00\x01\xe3\x32\xd1\x99\x5c\x13\x88\xd2\x16\x29\x3d\x76\x82\x78\xaa\x1d\xb1\x58\x09\x83\x10\x3b\x0b\x2b\x4c\x9b\xe4\x3b\x78\xc5\xd1\x43\xe7\x8f\x6f\xa8\xd0\xbf\x4e\xfe\x26\xf9\x3f\x93\xff\x3b\xf6\x2b\x9e\x5e\x28\x99\x1c\xde\x1f\xee\x23\xaa\xa7\xc3\x3d\x2d\x79\x66\x41\x6f\x8b\xe6\xb6\x70\xd6\x73\xfd\xd3\xd3\xef\x3e\x7e\x78\xff\xf4\xe5\xc3\xfd\xc6\xed\xef\x4a\x9a\x3f\x6d\x81\x75\x93\x3e\xcd\x5a\x84\x5a\x58\x5a\x0c\xe8\x57\x0f\x58\x01\xb9\x85\x4d\x38\x02\x1a\x90\xcb\xdb\xb6\xef\x81\x3a\x16\x85\x2d\x8b\x89\x41\x58\x4f\xc3\x60\xfb\x7e\xb2\x25\x64\x33\x21\x6d\x68\x3d\x4a\xe5\x80\x05\x60\xdc\x9f\xa7\xd0\x53\x90\xd4\xe1\x44\xf1\x0c\x28\x9c\x14\x0e\x4d\x85\x1e\x2c\x61\x94\x56\xd2\x98\x0a\x4e\x90\x87\x46\x84\x76\x97\x9f\xcc\x72\x34\x29\xac\x20\xc2\x44\x29\xae\x95\xea\x3a\xa5\xb4\xe2\xc7\xe3\x42\x0b\x66\x14\x93\x86\x50\x51\x99\x12\x51\x46\x0d\x0a\x1d\xe1\x28\x6a\x86\x67\xe8\x4a\x0e\x36\xeb\x6f\xeb\xec\xe3\x6b\xc5\xb7\x3f\x03\x0f\x87\x77\xf7\x8c\xe6\xc3\xe6\xf1\xf0\x65\xbd\x1f\x87\x8f\x9f\x33\x91\x4e\x0b\x74\xa0\x0f\x64\xbd\x46\x42\xd9\xd9\x79\xef\xce\xe5\xc0\x7d\xe1\x6b\x85\xc6\xac\x5f\xce\x80\xb0\x70\xe2\x67\x55\x95\x7e\x5d\x16\x26\x68\x60\xcf\xde\x4a\x6f\x24\x34\xd5\xa6\x9f\xcb\x63\x6d\x59\xde\xba\xc0\x4f\x11\x7f\xb4\xa5\xc3\x1b\x7f\xff\x5d\xb6\xff\xf8\x97\x5f\xde\x3c\xbd\xf9\x1c\x27\x8b\x9f\xbf\xbc\xff\x93\x67\xd3\xb6\x17\x9a\x95\xe0\xdd\x2f\xd0\xae\x77\x9a\x4b\x44\xbb\x7e\xda\xc9\x65\x4a\xe1\x1c\x37\x74\x15\x54\xd0\x15\xc5\x36\x8a\xf5\xc1\xd2\xa3\x33\x70\x41\x01\x1f\x64\x5a\xef\xe0\x65\x4c\xeb\xc5\xa4\x66\x91\x3b\x6b\xc3\x09\x30\xc6\x2b\x0c\x39\xac\x8e\xb6\x77\x80\x85\xc9\x66\x3e\x34\x3c\x34\xd2\x18\x64\x29\x72\x6b\x3a\x3d\xe4\xc0\xec\x72\x42\x10\x9b\xd4\x32\xea\x54\x84\x5c\x33\xc5\x42\x75\xd6\x2e\x0c\x8c\xe5\x26\x27\x3e\x1a\xc3\xd5\x60\x74\x66\x5e\xf3\xcc\xfa\xca\xa3\x6e\xca\x3f\x89\x3a\x12\x9b\xfa\xc1\xff\xfb\x3a\x0a\x7e\xf9\xf0\xee\xcb\x1a\xfd\xbe\x0f\x7e\x1f\x5e\xc4\xc6\xcd\x26\x6a\xb7\xa9\x2e\xa5\x77\x93\xa8\x74\x77\xf8\xf8\x65\xf7\xf4\x0f\xee\x92\xcf\xdf\x42\xe5\x3d\x09\x3d\xfc\xeb\x6d\x9a\xf4\x65\x8d\x8c\x9b\xa0\x8b\x84\x48\x56\x43\x5b\xf4\x9c\xc2\x5c\xe7\xd4\x7b\xb2\x46\x44\xa1\xf9\xb4\xab\x8b\x53\x5e\xa0\xca\x10\x5d\x16\xb0\x54\x85\x67\x08\x13\xc2\xf1\x1a\x07\x65\x61\x73\xc3\x98\xa0\xfc\x72\x4a\xd1\x32\x14\x69\x12\x92\xa8\x9c\x5c\xe0\x98\xa6\x1a\x54\x90\x72\x0e\x23\x5a\x03\xc1\x83\xa6\x9a\x6b\xbe\x2e\xc7\x52\x96\x08\x43\x0a\x35\xc1\x94\xe6\xb2\xb0\xcb\x31\x94\x6b\xba\xa6\x40\x97\xba\xd1\xa2\x30\x0e\xed\xb4\x06\x83\xde\x49\x05\x83\xaf\x39\x35\xca\x00\x0c\xda\xc2\x16\x29\x59\x26\x50\x73\xc5\xa4\x5a\x90\xa2\xa1\x93\x3a\xcc\x8c\xe7\x92\x54\x32\xcf\x15\x41\xa6\xc8\x29\x8e\xba\x3a\xe7\xd8\x53\x68\x93\x3f\x89\xd3\xea\x64\x8b\x87\x87\x3b\x22\xfa\xe9\xfd\x53\x71\x28\xf6\x1f\xff\x55\xba\xe5\xeb\x7b\x11\x8e\x3b\x19\x24\x04\xcc\x07\xe5\x07\xea\xf3\x50\xd1\xa6\xc5\x5d\xef\x95\xeb\x32\x64\x4c\xbd\xe4\xb1\x6c\x9d\x4f\xe1\x9c\x07\xee\x35\xa9\xdb\x91\x29\xad\xd6\xfc\xf1\x90\xe8\x2b\x3d\xf0\x7d\xf3\xcc\xce\xfa\x9b\xe4\xdf\x25\xec\x36\x1d\xbd\xd3\x29\x5f\x7e\xc5\x96\xd1\xfe\xd3\xe3\xbb\xe7\xeb\x75\x19\x71\xf8\xf8\xe6\x71\x03\x46\xaf\x6b\x7a\x1f\xff\x95\x38\x1f\x9b\x1c\xac\x40\x8f\xb0\x61\x38\x6d\x17\x19\x79\xa3\xeb\xd5\xfc\x5c\x20\xac\x4f\x69\xbd\xcc\xeb\x51\xb6\x5e\x7b\xa1\x14\xa2\x50\x20\x7a\xf2\x92\x5f\xda\xaa\x12\x8a\x9f\x5d\x4a\x31\x49\x3b\x82\x97\x31\x65\x4b\xbb\xf7\x88\x12\x4a\x08\x57\x86\x68\xaa\x99\x01\x47\x84\x78\xaf\x09\xe9\x29\x3d\x32\x76\x0c\x90\xf1\xd2\x96\x14\x10\x2b\x79\x38\x9f\x61\x29\x09\x5d\xce\xa9\xd5\x18\x63\x1c\x06\x16\xfd\x56\xf8\x95\x1c\xda\x6c\x4c\xf6\x37\x66\xda\xa7\xa8\x9e\xf0\x7f\x3d\xfb\xad\x6c\x62\x61\xfb\x3b\xa8\xf9\xf5\xdd\xf8\x10\x47\x2d\x6f\xb7\x3b\xf1\xa7\xf1\x6d\xbe\xdf\xdf\xdc\xd0\xbe\xe5\x01\xdf\x20\xa6\x5f\x76\x4f\x6f\x5f\xf9\xe9\x59\x29\x0c\x93\x97\xd2\x33\x22\x86\x70\x02\xb0\x28\x6d\x55\x9e\x42\x13\x59\x0a\xeb\x25\x97\xc4\x49\x7c\x3a\xf3\x3b\xf1\xec\x9a\xec\xcf\x45\x60\x10\x89\x75\x81\x31\x0c\xcb\xdc\x96\x82\x79\xa1\x2c\xf5\x92\x95\x6d\xd9\x15\xae\x58\x46\x6f\xa4\xb1\x81\x28\xdb\xb1\x26\x1b\xb9\x16\x4a\x91\x30\x20\x24\x6b\x51\xc1\x0a\x63\xcb\x2d\xb7\xc2\xc0\x74\x86\x9a\xa8\x20\x39\x9f\x38\x3f\x89\x1d\x76\xe8\x9a\x38\xd7\x91\x30\xd7\xb5\x10\xf0\x68\x07\x49\x0d\x97\x27\x50\x95\xae\x04\x26\x38\x20\x85\x36\x5e\x52\xde\x4b\x2d\xa2\x6f\xf5\x7a\x9e\x65\x43\xf2\x07\xc9\x3f\x8b\x7e\xd5\xff\x4b\xf2\xef\x93\xff\x7d\xcb\x93\xee\xb7\xed\xce\x97\xfc\xe1\x17\xde\x02\x9f\xbf\x79\x0b\x80\xa7\x68\x01\xff\xf4\xee\xc3\xdf\x07\x37\xee\xd4\x0f\x6f\x3f\x7c\x0b\x0c\xeb\xd7\xdb\x4d\x62\xe5\xf7\xe9\x87\x77\xa9\x9a\xcb\xca\xa1\x72\x5e\x74\xa8\x29\x66\x58\x51\x69\xb4\xc2\xa2\x92\xbc\x42\x85\x36\xb4\x93\x45\x29\x39\xe5\x8a\xf0\x4c\x8e\xb9\xcd\xe7\x33\x34\x56\x74\x14\xb5\x6a\x2a\x06\x30\x53\xa4\x2a\x7a\x81\x6b\x14\x58\x17\x5e\xed\xd2\xc4\x4d\x59\xc1\x68\xc5\xa5\x05\x98\x0a\xce\xb8\x92\xd7\x24\xf0\x61\x80\xbe\xb2\xd6\xea\xa3\x30\x6e\xa4\x44\x20\x83\xa4\x14\xa1\x6f\xc6\xb1\xb1\x61\x0a\xc7\xda\x8c\xa0\x0c\xf3\x59\x81\x22\x4d\xc0\x91\x2b\x22\x45\x98\x0c\xb7\xcb\xc4\xc1\x1c\x72\xae\x9b\xe6\xe6\xbf\x74\x25\x87\x26\x9b\x93\x77\xc9\xdf\x24\xff\x29\xaa\x36\xfd\xf8\x02\x8a\x7a\xeb\x1a\x82\x35\xae\xde\x1b\x7b\x1b\xea\xfc\x6e\x17\x1d\x91\x33\xef\x7f\x73\xf8\xed\xfb\x97\x4d\xbe\xdb\xa9\x1f\x21\xcb\xdf\xfc\x48\x1e\x9f\x75\xef\x46\x07\xca\x23\x3f\x87\x8e\xf1\x91\x15\xa6\xd4\x61\x1c\xe4\x8e\xee\x4a\xd3\x12\x80\x2b\x6a\x11\x9c\xd7\x25\xa7\xdb\x1a\xa9\x70\x0e\x27\x81\xb5\x1c\x6d\x49\x44\x58\xcb\x00\xa7\x29\x35\x62\xa9\x97\xd2\x40\x70\x9a\x73\x40\x42\x93\x7b\x2d\x94\x56\x67\x06\x20\x0e\x1d\x10\x45\x5d\x21\x25\xb3\x59\x43\x24\x31\x24\x10\x62\x01\x1b\x46\x38\xa8\x4c\x23\x89\x96\xb2\x62\x6c\xb6\x61\x2e\x9d\xd2\x56\x99\x0e\x88\xbc\x15\x02\xa5\xcc\x08\xb1\x46\x69\x19\xfa\x8a\x1b\x4e\x0d\x62\x52\x4b\x56\x4b\xab\x5b\x43\x39\x25\xdc\xac\x67\xb0\x88\x38\x8e\xe2\x39\x56\xfd\xf5\x7f\x4d\x9c\xda\x92\xaa\xd7\x72\x70\xd1\xf8\x18\xb4\xbe\x84\xe0\x5c\x94\xbe\x2a\x53\xbb\xc8\x54\x44\x0f\xa1\x3a\x3d\xfe\xed\x99\x52\x79\xba\x8d\x6b\xe3\x75\x4a\x25\xa0\xa9\x13\x9c\x6b\xe8\x19\x0c\xed\x62\xc2\x50\xef\x0b\x48\xf0\xc6\x00\x67\x86\x1a\x66\xc0\x99\x22\xd5\x1a\xc6\x8e\x94\x0e\x8c\x0d\xd3\x14\x7a\xc1\x73\x97\x53\x3f\x4d\xc1\xaf\x71\x57\x5e\xe9\xa1\xcf\xc6\x9b\x8a\xdd\xa6\x87\xf3\x6f\xd7\x1d\x53\xbc\x8f\x8d\x83\x8d\x56\xfc\xf4\x97\xaf\x42\xc8\xc7\xc7\x37\xeb\x29\xfb\xe1\xd3\x96\x6c\x7c\xf8\xf4\xf8\xbb\x7b\x92\xf1\xe6\xf3\x97\x4f\x8f\xbb\x7b\xce\xbd\x1d\x0e\xd4\x17\xc0\x05\x53\x20\x46\xac\xd4\xa4\xc2\xd0\x42\xc9\x95\xf4\x47\x7a\x36\xa4\x0a\xde\x16\xde\x05\x1f\x1c\xa2\x44\x66\x43\x71\xc1\xe0\x1c\x8a\xf5\x9a\xe7\x50\xd8\x5d\xb2\x24\x0e\x4c\x01\xee\x05\x85\x0e\xd2\x6c\xbc\x26\x47\x6b\x3a\xa5\xc9\x60\xeb\x01\x8d\xe6\x6c\xb8\x51\xa6\x9f\x43\x5e\x68\xd8\x37\xa8\x74\x79\x4a\xed\x10\x88\x0c\x9d\x0c\x75\x01\x59\x56\x04\x63\x95\x91\x16\x45\xe2\xda\x3e\x6a\x09\xba\xac\x8f\x48\xac\x3b\xe6\x71\xfd\xf0\x3e\xdc\x81\xa8\xcf\x3d\xfa\x75\x65\xaf\xef\xf0\xe3\x5a\x22\x3d\xfe\xf6\x19\xaf\x73\xeb\x56\x7c\x43\x7d\xef\x3d\x86\x40\x69\x84\x41\x11\x04\xe0\xa1\xf1\x51\x33\x44\x82\xbc\x22\x06\xf0\xb2\x92\xd1\x4b\x00\x5f\xfa\xa6\xc2\x60\x3d\x02\x50\x1d\x94\xef\x88\x88\x8d\x04\x17\x54\xd6\x73\x69\x6b\xe3\x7a\x1b\x8e\x00\xdb\xde\x79\x6b\x29\x59\x06\xeb\x2d\x38\x56\x94\x04\xd4\x2c\x03\x93\x59\xcf\x83\xe8\x2f\xdd\x90\xec\x93\x0d\x9b\xa1\x92\x3f\x8c\xae\xaf\xbf\x8f\x9f\xdd\xd6\x77\xfb\xfc\xc3\xa7\x48\xf8\x7c\x7c\xf7\x9b\x87\x67\x3e\xe8\xb7\xa8\x1f\xc7\x5b\x9f\x9e\xde\xdc\xfa\x1d\x6f\x9e\x36\x9b\xf4\xcf\xfb\xa7\x3f\x05\x3f\xdc\x33\xf6\x37\x07\xfa\xb3\x68\x9c\x20\x19\xb1\x65\x01\x1c\xa9\x0c\x86\x61\xc4\x44\xcb\xc5\x63\xa8\x21\x06\xbd\xaf\x2a\x17\x8e\xca\x5c\x13\x14\x4e\x7c\x42\x93\x51\xe1\x0c\x1a\x04\x4e\x46\x82\x52\x0e\x46\x86\x13\x07\x2e\x53\x2e\xac\x89\xe4\xc0\x7b\x50\x8c\x69\xd5\x22\x4a\x55\x7e\x64\x95\x32\xce\x90\x13\x28\x28\xc3\x9c\xe0\x4a\x30\x1d\x8e\xa7\x50\x4f\xce\x08\x07\xc4\x09\x60\x2d\x67\xcf\xae\x89\x37\x76\x1a\xbd\x39\x82\x2a\x49\xf6\xa9\x07\xe6\xa0\x1e\x5c\xd4\x91\xd8\x34\x18\x13\xf0\xf4\x3c\x6a\xf9\xf8\xf9\x5f\x83\x0f\xfb\x97\xb8\xae\x5f\xd3\x5f\x5c\x7f\xb4\x43\x27\xe2\x8a\x32\x6d\x2f\x73\x33\x70\x2f\x4b\x03\x92\xb4\x0b\x13\xa8\x2f\x15\x68\xc2\xbc\xcb\x85\x60\x12\x5a\x8a\x96\xce\xfb\x7b\xb6\xf0\x80\x04\x84\xd0\xf6\x5a\x08\x59\x50\xc5\x94\x62\x73\xa8\x18\x2b\x6c\x49\x8a\x2e\x15\x0d\x1e\x6e\x1e\x55\x1a\x74\x07\x9d\x75\xc9\x63\x64\x7c\x6c\xea\xb1\xbf\x89\x04\xde\x8d\x3d\xf7\x69\x6b\x80\x7d\xf8\xf8\xe5\xfd\xe1\xe9\xf3\xa7\x9f\xd6\xef\xbf\x7f\xf1\xf7\x1e\xbf\xcb\x65\x6f\x82\x7a\x1f\xd3\x22\xd4\xbb\x24\x9c\x73\x80\x5a\xab\x60\x57\xd3\x4a\x85\x91\xcf\x6c\x44\x54\xc3\xa6\x48\xb5\xae\xba\x7c\x2d\x78\xc2\x18\xf3\x6d\xc6\xaa\x5c\xe5\xcc\x1b\x9e\xc3\x96\x8b\x23\x1f\x51\x86\xac\x85\x08\x59\x8f\x90\xe4\x98\x9c\x27\xa7\x95\x55\x76\x0d\x21\x39\xa6\x15\x64\xd6\x32\x58\x19\x89\x4b\x01\x0d\x23\x14\xe7\x48\x57\x9a\x49\x95\x3c\xc4\xb8\xd1\xec\x93\x88\xfc\x5f\x77\x4f\x8c\x1a\x6f\xef\x6c\xa3\x57\x86\xf6\xaf\xc1\x13\x6f\x5e\xc9\x0d\xac\x09\xcd\x87\x67\x27\xc8\x3f\xdb\x94\xae\x6f\xfa\xec\x1c\x21\x8b\x77\x79\x28\xa4\x56\xd4\x32\xae\x1b\xd6\xd8\x40\x44\xc3\x28\x14\x5c\x2e\x27\xed\x88\x33\x9c\x73\x2d\x1d\x0e\x15\xe8\x53\x6b\xf1\x59\x8c\x3b\x72\xe9\xd7\x0b\xca\x21\x9c\x04\xc8\xb3\x72\x18\x4c\x73\xca\x14\x61\x48\x38\x85\x31\xa3\x0c\x23\x68\x2b\x1c\xec\x59\xf1\xd2\x97\x74\x04\x6b\xf2\x8b\x31\x86\x0a\x11\x81\x07\x29\x4d\x18\x79\x38\xb1\x33\xf7\xd2\x50\x2b\x9d\xb4\xf6\xa6\x85\xc9\xb3\x3c\x1b\x22\x1f\xad\x4a\xfe\xd9\x77\x7c\xb4\xdd\xaf\x32\xb3\x5f\x72\x8f\x53\xea\xca\xa2\xf7\xa2\x69\xfb\x81\x03\xea\x52\x75\x8e\x28\x02\x5b\x06\x1f\x68\x09\x44\x18\x00\x9a\x52\x64\x10\x35\x2c\x14\x1c\x1b\x4c\xb3\xa1\x2a\x4b\x61\xb4\x93\xb5\xb4\xfe\x9a\x58\x67\x82\x2f\x4a\x47\x90\xaf\x80\x31\x2e\x1c\x91\xe1\x54\x30\x65\xb0\x55\xc9\x2e\x6d\xaf\x32\xe6\x92\xef\x92\x3f\xdd\x94\x3b\x5e\xc1\xde\x36\xb6\xff\xad\x7b\xb1\xde\xfb\xd7\x07\xd6\xbd\x42\xbc\x0f\x28\x9e\x3e\x3d\x66\xd4\xa2\x54\x78\x3f\x82\x7c\xad\x2c\xce\xe1\x14\x4e\x68\x3a\x32\xa2\xc5\x28\x84\xf5\x2a\xc0\x3c\x67\x69\x7d\x4d\x40\x1d\x44\xb4\x64\x9c\xbf\xca\x34\x0f\x35\x10\x61\xac\x2a\xa5\x2a\x53\xe4\xa7\x30\x67\x63\xc5\x8c\xa4\x18\x1a\xc4\x15\x34\x10\x57\x88\x09\xc7\x30\xc2\x24\x0f\xb5\x16\x5a\x6a\xa9\xd7\x6f\x04\x71\x65\x20\x84\x22\xee\xa1\xe3\xf5\x9c\xd6\x19\x8c\x55\x77\x9c\x82\xdf\xa5\x52\xd2\x1b\xd8\x32\x83\x97\x5c\x35\x19\x5a\x92\x54\x27\x0f\xb1\x96\xb0\xd9\x98\xfc\xe6\xd9\x1d\x98\x3c\x77\x51\x63\x85\xfb\xcc\x0a\xdf\xff\x57\x18\xf1\x1f\x2a\x36\x87\x36\xe5\x9d\x0b\xe7\x1b\x37\xdc\xfd\x2c\x80\x89\xd0\xf5\x48\x95\x90\xc1\xbb\xc8\x2e\x68\x01\x0b\xa6\xef\x7b\xc0\xfa\xe5\x1c\xff\x97\x8d\x96\x55\xa3\xbd\x0c\x3b\x14\x5c\x18\xb4\x90\x80\x00\x0f\x78\x95\x33\x66\xe5\xa2\xa5\x3d\x1e\xad\x4c\xad\x0c\xce\x18\x13\x8c\x8d\xcb\x2d\xd9\x27\x51\x07\x20\x73\xcf\xb8\xaf\xdf\xdf\x79\xc7\x6f\x1e\xdf\xbd\x64\x33\xde\x2c\x0a\x37\x1e\xdc\x1d\xfb\xb5\xfe\xbd\x6f\xa4\xb1\xb7\x9b\x0a\x78\xbd\x23\xa1\x06\x4d\xe0\x67\x08\xad\xe1\x0e\x96\x41\x84\xa4\x04\xd3\xf6\xd2\x23\x02\x92\xde\x44\x4e\xcb\x9f\xcb\x14\x05\x03\x7c\xae\xb4\x34\xa5\x36\x15\x2c\x82\x02\x36\x88\xcc\x05\x21\x03\xeb\xcb\x0a\x12\xdb\x10\x8c\x49\xe5\xab\x23\x68\xa5\xa9\x17\xda\x34\x4d\xea\x02\x1a\x02\x9a\xa0\x87\x12\x20\x30\x1c\xe3\xac\x4d\x1f\xec\x3e\x8f\x2c\x95\x6f\x5a\xb9\xcf\x5e\xb1\xcf\x27\xef\x6d\xf9\x6d\x23\xb8\x2f\xb7\x77\xf5\xbb\x8f\x69\x4f\x10\xf0\x18\x36\x04\x0c\x17\x5b\xec\xf0\xa5\x2e\x8b\x2c\xff\xda\x56\x28\xab\x96\x73\xea\x7e\x66\xa9\x09\xe5\x38\x32\xc0\x8e\x21\x49\x59\x59\x04\x98\xe6\x70\xf1\xa0\x86\xd5\x3e\xa1\x9c\x33\xac\xdc\x1a\xe0\x1c\xa5\xae\x75\xae\x9d\x98\xb5\x80\x38\x8c\xad\x72\x08\xad\x39\x31\xbf\xea\xdd\x39\xd3\x77\xcc\xc5\xdb\x97\x5a\x03\xdb\x81\x1f\x75\xfd\xd6\x2f\xee\x1d\xd0\x4e\x4a\x17\xac\xf3\xa0\x8a\x87\xb8\x0e\x76\x37\xd4\x75\xd3\xf8\x0b\xd1\x7a\xd7\x87\xf3\x26\x03\x9e\x6c\xff\x36\x3d\xf8\xcc\x26\xfb\xe4\x1f\x46\x74\xc4\x0d\x95\x78\x9b\x8a\xbd\x70\x54\xfb\xfc\x36\x4a\x39\x7e\x07\xb3\x7c\xdc\x53\x86\x1d\x62\x5f\x47\x00\xeb\xd3\xc9\x4a\x49\x68\xcd\x6a\x75\x16\xe1\x9c\x9e\x76\xa7\xc0\xe2\x4a\x9c\xbe\xda\x34\x89\xc4\x71\x91\x59\x2e\x89\x62\xa7\xf3\xd9\x11\xab\x9d\xe2\x8b\x49\x79\x6d\xe5\x08\xca\xda\x85\x93\x0b\xbd\x73\x80\x38\x70\xf3\x39\xe1\x57\x74\x68\xb2\x31\xf9\x1f\xe3\x59\x15\xfd\xb4\xdf\x6e\x15\xe4\x76\xfe\xec\x6e\x8d\x92\xc7\x37\x4f\x5f\x3e\x6c\xfd\x80\x97\xc6\x46\x3f\xdd\x68\x89\x3f\x7c\x8a\x10\x95\xa7\x38\xf3\x3b\xbc\xff\xfc\xe5\xa0\x03\x2c\x98\x64\x5e\xd5\x82\x54\xd0\x42\xc1\x8c\x35\x47\x36\x1a\x53\x5c\x9a\x13\x3d\xa7\x53\x68\x08\xa8\xa1\x27\x98\x63\xde\x5e\x13\x7e\xb6\x61\xc4\x55\x03\x1b\x2b\xf9\x6e\xf2\x1d\x31\x04\x7f\x9d\xe9\x49\xac\x87\x56\x68\xc6\x0e\x24\x38\x34\xd3\x70\x46\x93\x03\x89\xd7\xda\x35\x80\x03\x15\x44\x63\x4c\x33\xd6\x25\x34\x55\x65\xa9\xc1\x5c\x71\x1e\xba\x99\xb5\xa0\x38\xa6\x85\xb5\x8c\x53\xb1\x70\xc5\x98\x4a\xf2\xc4\x5d\xf1\x01\x66\x36\xb2\xf9\xde\xdd\x26\x67\x1f\x93\x7f\xfa\x9a\x47\xf1\xf9\xbf\x4c\xa4\xb0\x9e\x7b\x25\xa0\x54\x04\xfd\x4c\x77\xf4\xd2\xf9\xb4\x8c\xf2\x0b\xf1\xda\xd5\x75\x7d\xa9\x9d\xad\x4d\x93\x96\x11\xaf\x9f\xd9\xaf\xcd\x0d\x09\x95\x95\x17\x98\x76\x3e\x70\x17\xb8\x4b\xe9\xa5\xc3\xb4\xe6\x9a\x4b\xa1\xb9\x96\x49\x3c\x67\xc9\xa1\xca\x50\x7c\x85\x7f\x3f\xf6\xff\xbf\x44\x27\xa7\x87\xc3\xfe\xe3\x97\x35\x53\xf8\xa6\x56\x12\x3b\x77\xaf\x85\xa6\xbf\xfb\xe1\xce\x13\x7c\x4d\xe0\x04\x83\xa9\xa4\x75\xee\xbe\x64\xf7\xf5\x7a\x8a\x56\x86\xe3\x40\xa0\xb1\x8d\xdb\x4c\xad\x02\xcb\xd0\x25\xe7\xaa\xc8\xeb\xbc\xe0\x6d\x98\x8f\x0c\x20\xc0\xd3\x22\xb4\x6d\x28\x1b\x9d\xf2\x4b\xae\x54\x5e\xe7\xaa\x0d\xf3\xc0\x00\x06\x2c\x2d\xb7\x9f\x99\xe8\x7b\x77\xa5\x07\x9d\xc9\x9b\x3b\xc8\x5f\xfd\xba\xd3\xf2\xe7\xb7\x8f\xe0\x87\xf7\x87\x1f\x77\x91\xf2\xf0\x03\x78\x56\x6a\x5e\x97\xde\x7a\x56\xd5\x00\x46\xaf\x9b\x46\x49\xce\xbd\xf0\x6a\x54\xd7\x64\xdf\xe2\xb3\x0e\x33\x09\xbd\x33\xbd\x19\xd3\xc2\x0a\x5f\xc2\xd0\xae\xeb\xa8\xac\x5d\xdb\x0e\x67\x84\x76\x76\x9a\xbc\xd4\xda\x09\xbe\xd8\xd4\x0f\xad\x9d\xa2\x35\xa9\xad\x6d\x0f\x3a\x58\x05\x3d\x4a\x90\x04\x38\xcc\x94\x51\x9e\xfb\x19\x18\x14\x4c\x5f\x60\x71\x9b\x69\x5e\xd1\xc1\x67\x53\xf2\x0f\x92\x4f\x9b\x2f\xf7\x86\x33\x89\x04\xfb\xad\xf8\xf9\xf1\xa7\x9b\xe0\xdc\xee\x9e\x79\x3e\x93\x02\x7f\xbc\x39\x36\x83\x4d\x58\xf0\xc1\xd2\x30\x06\xb7\xc3\x4b\x0d\x72\x60\x58\xa8\xc2\xd1\x85\x73\x20\x02\x30\x50\x2e\xed\xae\x5c\x6a\x94\x76\xb6\xae\xaa\xdd\x18\x3a\x5e\xa7\x50\x87\x2e\x4c\xc1\x2f\x3d\x03\x13\xa8\xc2\x79\x52\x3c\xe0\x94\x12\x40\x3b\xbe\x34\x08\x0f\xd9\x64\xca\x42\x39\x85\xbd\x1a\x4e\x63\x1b\x67\x8a\xb2\x70\x4b\x0d\x31\x72\x56\x7a\xa3\x98\x45\xb6\xa2\xb4\x62\xd4\xd1\x20\xa9\x46\xa8\x8a\x3a\xea\xe4\x00\x33\x91\x14\x91\x7f\xf0\xbd\xd8\xcf\x7e\x6b\xfe\x6f\x00\xa2\xc7\x4f\xb1\x8d\x1c\x1f\x3d\xfe\xee\xe3\x01\x2a\xc9\x0d\xac\x19\xf9\x79\xae\x53\x28\x48\x2f\x88\x2f\x04\x28\x42\x09\x12\x77\x41\xf5\x7a\x3b\x01\xc4\x24\x13\x5f\x1b\x21\x4a\x5f\xb2\x5d\xfd\x55\xed\x61\x2f\x15\xb7\xac\xd4\x36\xf8\x73\x30\xc0\xce\x40\x5a\x8a\x93\x7d\x22\xaf\xd5\xa1\xce\xf4\x0b\x9e\x7b\xf2\xf6\x96\x44\xbd\x7b\xfa\xae\x10\x8b\x8a\x69\x9f\x3e\xec\x63\x83\xfa\xf1\xdd\x9b\x1b\x5f\x63\x7c\x60\x33\x50\xc1\x9d\x17\xb8\x43\x97\xa1\xbe\x9c\x77\xc5\x82\x4e\xeb\x29\x3c\x65\x5d\x68\xeb\xcd\xcc\x02\x9c\xd6\x43\x3a\xd3\xf6\xe8\x1a\xe7\xdd\x1a\x99\x9d\x77\x8d\x3b\xc6\xff\xc2\xb1\x69\x9a\x64\x17\xf7\xdb\xfa\x7a\x8a\xe4\xc3\xa6\x27\xfe\xba\x80\xfa\x61\x7f\x13\xeb\x7e\x73\x07\x24\xbc\xf9\xf0\xd3\xd3\xc3\xe1\x19\x23\xf8\x43\x26\xd6\x72\xc2\x2a\x6a\x04\x5a\xce\x94\xdb\xfa\x62\x67\x0f\x92\x6b\x62\x34\x8c\xde\x69\xb5\x9d\x33\x59\xe7\xf0\x04\x08\x0b\xfd\x51\x07\xc3\x01\x1a\x33\x8d\x09\xb1\xc5\xac\x98\xf5\x9d\x67\x20\x8f\x8c\x17\x17\x64\x85\x9c\x91\x75\x55\x81\xa3\xe8\x6d\xe8\x4d\xed\x01\x0c\x73\x63\x35\xe0\xc9\x0e\xc0\x35\x0f\xcf\x86\x88\x36\xf8\x71\x3b\x57\xdf\xbc\x48\xbf\x7f\x04\x8f\x6f\x7e\x5a\x5f\xe8\x9b\xc7\x28\xff\x1b\x49\xa0\xbb\x13\x82\x29\x5a\x46\x35\x1e\x8d\x75\xae\x1e\xf8\xc2\xc2\x39\x20\xd0\x55\x61\x0c\x33\x4b\x79\x01\x83\xce\x8a\xaf\xe7\xac\xc8\x06\xca\x16\x62\x85\xf5\xac\x56\x18\xb6\x0e\xd4\xc1\x1a\x23\x09\xcf\x2c\x42\x67\x6b\xc3\xc9\xda\x24\x4d\xd4\x95\xdd\x7a\x6f\x3f\xae\x9f\xe0\xb3\x5b\xe4\xb7\x73\xfe\xfb\x9a\x7a\x4e\x5b\x58\xd5\xb8\x4c\xfb\xbf\x3d\x01\x4f\x20\x38\x0b\x54\x4b\x70\xba\x1c\xd3\x7e\x21\xf5\x42\xd2\xfe\xd2\x81\x01\xe2\xac\xa4\xb4\xe2\xc2\x43\xad\xb5\xc1\xbd\x1f\x7c\x98\x00\xf4\x83\x97\x51\xdf\x24\xdb\x95\x6b\xbe\xf7\x80\x6e\x71\x3c\xa2\xe0\x76\xf1\xd4\x7e\xfb\xe1\xd3\xe3\x97\x0f\xfb\xc7\x2f\x8f\xbb\xc7\xb7\x77\xae\xd5\xdd\xa9\xb2\xd9\x19\xd6\x7e\x75\x67\x72\x06\x05\x9e\x01\x07\xb2\x0c\xad\x05\x0e\x06\xeb\x41\xe9\xfd\xa5\xf1\xa0\x78\x40\x97\xd1\x39\x50\xb8\x79\x9e\x17\x09\x8a\x00\x97\x09\x1c\x17\x49\x53\x16\xf0\x7a\x66\xd6\x57\x7c\xa8\xb3\xe6\x9b\x8a\xd8\xbb\xc7\xdf\x7d\x7c\xfa\xed\xeb\xe6\xc9\xe7\x2f\xef\xd3\xf5\xf8\xdc\xe0\x5c\x8f\xef\x7e\x7a\xbf\x7f\xa1\x63\x70\x93\x28\xd8\x22\xc9\xad\xfa\xd9\x75\xca\xd5\xa0\x2f\x0b\x9f\xc3\x14\x2e\x33\xc4\x56\x29\xdb\x28\x96\x93\xc2\x31\xef\xeb\x31\x4c\x14\x90\x9e\x56\xa1\x02\xa4\x08\x2d\xbf\x3b\x81\xb5\x2d\x04\x26\x50\xd0\x85\x33\x07\xcd\xce\x79\x61\xb9\xcf\x1a\x83\x60\xdf\x0e\x43\xeb\x3a\xa7\xbc\xe8\xf5\x28\x0d\x0e\x2d\x80\x86\x5b\xa1\xdb\x79\x40\x0e\xcf\x5a\x14\x4d\x59\xe1\x0e\x96\x1e\x9f\x5c\x5d\x39\x44\xb5\x63\x4e\x47\x9d\xf5\xab\x39\xd8\x54\x6e\x2e\xc6\xdf\x71\x6c\x44\xca\xea\x54\x2d\x6e\x87\xff\x36\xd9\x55\x4b\x0b\xdc\x38\xba\xb3\x73\xe7\x64\x97\x9c\xaf\xd5\xa1\xcc\x50\xd4\xf4\xfc\xfb\xb1\xaf\x74\x48\xf7\xb7\x81\xf8\x36\x90\x7a\xb3\x91\xa7\x1f\xd3\xba\x56\x2a\x9c\xf8\xb9\x0f\xaa\xae\xd3\x3e\x6d\x16\xb6\x63\xf5\x65\xde\xe5\x0b\xcf\xd0\x62\xcf\xd7\xa4\xf6\x16\x74\xe0\xb8\x60\x50\x82\xc2\x7f\x75\xc6\xdf\x73\x97\x35\xe7\x97\x59\x95\xfc\x61\xfc\x2d\xdf\x3a\x20\xe0\xbb\x95\x77\x90\x3f\xd3\xda\x73\x02\xaa\x6c\x58\xc6\x54\x2f\xb6\x5e\x9a\x94\x2f\x73\x56\xf9\x40\x83\x0d\x67\xd1\x80\xfc\x98\x26\x61\x5c\x17\x1a\x05\x9d\x1f\x92\x04\x80\x63\x32\x3e\xc0\x3d\x8f\x33\xfe\x17\x8c\xe5\x37\xcf\x0c\xbe\x2d\x40\xa6\x47\x49\x41\x22\x50\x8d\x38\x48\x42\x05\x0a\x77\x81\x0e\x94\x6b\x78\xc4\x6c\xcf\xac\xb3\x1e\x29\x63\x97\x16\x8c\x4b\x9d\x8a\x50\xa5\xcc\x4a\x91\xa4\xc9\x74\xa5\x07\x98\x15\x49\x11\xd1\x94\xbf\x88\xc9\xf7\x22\xf3\xf0\xa2\x7a\x3e\x40\xad\xb9\xaa\x3c\x63\x5f\x8b\x26\x53\x4a\x7a\xef\x64\x5d\x37\xba\xe3\xdd\xd4\xf5\x6a\xe8\xeb\xac\xb8\x14\x42\x96\xbe\x60\x3b\xf4\x75\xc8\x8e\x67\x61\x8d\x54\x46\x2b\xcd\x99\x63\x8d\x12\x4a\x6a\x1b\xb1\x18\xd5\x55\x1c\xcc\x6e\x8c\x8e\xa3\xf7\x4f\xe5\xcd\x77\x80\x8c\xfd\xf0\x95\xef\x69\x1d\x01\x19\x29\x71\x45\x8d\x14\x5f\x74\x80\x5d\x4a\x40\xe2\x17\x29\x83\xaf\x4a\xde\xe3\x99\x12\xaa\x23\x71\x05\x24\xa7\x2b\x7e\xe8\x33\x1a\x7d\x5b\xbf\x15\xca\x49\xf4\x9f\x7b\x97\x46\x54\xe5\x2e\x2f\x89\xd6\x46\x68\xa9\x0c\x10\x6d\x0d\xab\x9d\xec\x17\xb9\x4c\x62\xd7\x03\x9a\x9e\x11\xd3\x5e\x5b\xab\x98\x06\x39\x70\x90\x33\x1b\x4c\x40\xca\xf7\xe9\x5a\x1e\x26\x05\x90\x57\x74\x30\xd9\xfc\x22\x8b\xfb\xe9\x79\x8a\xf2\xcf\x6f\x0a\x7f\xff\x6b\xf2\xbf\xbd\xd4\x0d\x7e\xdc\x94\x81\x5f\x73\xb0\x6f\x79\xde\xdf\xf5\xe7\x97\x39\xdf\x4f\x2f\x4b\x7a\x96\x55\xc7\xa6\x46\xd3\x54\x06\x07\xfb\xa9\xea\xeb\x70\x32\x77\x9f\xae\xf5\x02\xa7\xb4\x5e\x84\x89\x0e\x18\xb7\xeb\xa2\x52\xbf\xc8\x57\x4f\xed\x38\x53\x8e\x39\xa0\xad\xe2\xd2\x5e\x30\x55\x96\x7b\xa0\x9c\xe2\xca\x64\xf3\x32\x97\x48\x90\x8a\x10\x0a\x55\x09\x81\x46\x1d\xea\x71\x68\x97\x13\xd0\x74\xc0\x03\x01\xe6\xf9\x61\xc3\x38\xe6\x98\x61\x22\x28\x12\x2f\x1e\x27\xc9\x1f\x45\x2d\x28\xb1\xcf\x93\xfd\xcd\x5d\xf2\xef\xc5\xa9\xff\x36\x2b\xf9\x0f\xc9\xff\xb1\xd5\xc9\x1f\x3f\xff\xb4\x3f\xfc\xd3\x75\x8b\x7e\xbc\x29\x5e\xee\x0f\x3f\x46\xfd\xe0\x67\xc7\xf8\xf7\x7f\xf9\x79\x6b\x82\xbe\x3f\xbc\x28\x3f\xb7\x21\xc1\x97\x58\x31\x3f\xde\x04\xbe\xb7\x62\xf4\xf0\xf1\xc3\xbb\xcf\x0f\x23\x1a\xae\x09\x3c\x5f\x4a\xd0\xa3\xc0\x52\x64\xad\x42\xa7\x30\x55\xa0\x4c\x39\x48\x40\x8e\xae\xc9\x7c\x39\xef\x8b\x0b\x2a\xcb\x8c\x09\xcb\x6d\x39\x57\xd5\xd2\x80\x3e\x22\x21\xd8\x72\x2e\xd3\x24\x06\x37\xc7\x84\xe8\x85\x73\xa7\x13\x50\x20\xb1\xf3\x05\xc7\x81\x6c\x07\x08\xaa\x4e\x6e\x9f\x0b\x58\xf2\x12\x22\x0e\x79\x18\x9d\x40\xa5\x2c\x60\x01\x05\x2c\x58\x98\x60\xb9\x8c\x43\xa1\x72\x17\x35\x89\x0d\x46\xb8\xb2\x25\x05\x39\xc1\x95\x26\x4c\xc4\xff\x96\x96\x10\x72\xac\x48\x9e\x44\xcd\x5a\x72\xb0\xd9\x94\xfc\x51\xec\x73\xfd\x4f\x71\xfa\xfc\x1f\xd7\x28\xf3\x61\xcb\x44\x62\xa1\xf3\x82\x26\xfb\x5f\xdd\xfb\x5a\x57\xd7\xe1\xa5\xb4\x37\x73\x5f\x8f\x36\xc5\x50\x23\xb8\x70\x70\xc2\x95\x81\x65\x4a\x43\x43\x19\x43\x0a\x63\x2e\x88\x12\xc1\x50\x19\xbd\xc5\x60\x60\x5c\x10\xce\x10\x15\x0c\x6b\x12\x1a\xa0\x52\xc8\xe9\x50\xc5\x55\xb7\x5e\x85\x74\x47\x3e\xa6\xd3\xd4\xe3\x61\xc8\xc4\x6c\xed\x8c\x18\xa6\x61\xc6\xa4\xaa\x2a\x8d\x11\x42\x14\xc1\xaa\xd4\x15\x0a\xde\x6d\x7e\x63\x1a\x88\x0a\xea\x12\xa2\x8a\x20\x8c\xb1\x23\xac\x0a\x27\x32\xd3\x81\x38\x26\x19\x47\xd4\x70\x94\x3c\xec\x68\xcc\x97\xfa\x5b\x7f\x62\xeb\xb6\xac\x6b\xe8\x4f\xc0\x1d\xf1\xfa\xee\x3e\x87\xfd\xf4\xf8\xe5\xf0\x11\xee\x1e\x3f\x7e\xd8\xbd\xee\xc8\x6e\x31\xee\xfd\x0d\xf3\xf9\xd0\xd3\x76\x82\x69\x79\xd2\x35\xe5\x74\x31\x84\x89\x46\x9d\x01\x87\x33\x02\x46\x02\x8e\x4f\x2c\x12\xd4\x5b\x21\x30\x83\x0a\xe1\x85\xbb\x19\x0c\x01\xe9\x69\xca\x7a\x0d\x4b\x6e\x04\xb2\x15\x6e\x3c\xaa\x24\x93\x86\x15\x36\x28\xba\xd6\x94\x81\x30\x56\x98\x82\x80\x2a\xc0\x94\xb7\xe1\x24\x78\x9c\x75\xfb\x2b\x3a\xe8\x4c\x24\x8f\xc9\x3f\x8f\x73\x80\xa7\x77\x77\x30\xd4\xc6\x79\x7e\xf7\xe1\xfe\x0e\x6e\x73\xc4\xdd\x6b\x60\xcb\xe7\xd7\xc0\x96\x3d\xb6\x58\x60\x5d\xa1\x36\x8c\x6a\xc0\xb3\xb5\xa6\x13\xd6\xcc\x7d\x85\x15\xc7\x15\xf6\x28\x2d\xfa\x8a\x81\x82\xeb\xae\x0b\x23\x1d\xdd\x35\xa1\xe8\x04\x30\xec\x38\xbc\x26\x55\x95\x89\x29\x92\xb0\xac\x46\x16\x0f\xdd\xb1\x57\x06\x3b\x4b\x29\x95\x2a\xe8\x82\x5b\xcb\xa5\x21\x54\x22\x5b\x62\xc6\xb9\xc5\xc1\x11\x45\xd0\x96\x0b\xb1\x38\xd3\x1b\x93\xdf\x45\x35\xbe\xbf\xba\x75\xff\x36\xe2\xc5\xc3\xdd\x89\xf8\xc7\xbb\x13\xf1\x6d\x40\x1e\xab\xb0\x9b\x49\xdc\x06\x6a\x2a\x1d\x4c\x8f\x4b\x02\xe1\x2e\x59\xce\x25\x4c\x4b\x66\xba\x89\x84\xd3\xe9\x18\xce\xf8\xe8\x39\x45\x15\x73\xca\x12\x6e\xeb\xfb\xb4\xbc\x90\xce\xd1\x40\xb3\x11\x12\x85\xab\x50\xe0\x4a\x1a\x8e\xa0\x45\x9c\x57\xae\xac\x10\xae\x4a\x25\x1a\x70\x24\x52\x87\x4e\x86\x49\x04\x46\x31\x11\x49\x9e\x96\x57\x72\xc0\x59\x9f\xfc\x71\xf2\x43\xc4\xcd\xfe\xf9\xb3\x47\xdc\xf3\x49\xbb\x9e\xaf\x1f\x77\x8f\x77\xfe\xd1\x4f\x6f\x1e\xdf\x6c\x1b\x06\x7c\xa7\x32\xbc\x33\x04\x03\x42\x2b\x07\x2b\x40\x7f\x9e\x00\x62\x14\xf4\x81\xf4\x92\x48\xa2\xd2\x04\x34\x83\x61\x42\x70\x20\xea\x8b\xaf\xeb\x9d\xbc\xf8\xf5\xca\x7a\xca\x29\x47\x04\x2d\xe7\xb4\x10\x21\x07\xb0\xa2\x8c\x30\xa2\xd6\x4c\x13\x12\x89\x39\x0e\x76\x31\x8c\xa5\x66\xe4\x61\xe4\x9b\x8f\x0f\x8b\xf5\xe1\x9a\x13\x55\x77\x1f\x9f\xe7\xbc\xe8\x69\x7f\xab\x74\xe3\xac\x74\xbb\xd3\x6f\x63\x58\xc8\x4a\xe7\xa2\xe6\x22\xf0\x17\xac\x01\x8a\xe4\x6d\xae\x66\x74\x0c\xc7\x89\x21\xaa\x1a\xe8\x0a\xc8\x4c\x96\x87\x0e\x34\xce\x3a\x6b\x87\xd6\xf4\xb9\xa3\x4c\x09\x35\x01\x04\x8d\x56\x65\x92\xe4\x20\xe2\x91\xf6\xd5\x33\x2a\x70\xd3\x77\xfd\x15\x95\xb0\x87\xef\x05\xef\xb7\xa6\xda\x7f\x51\x3c\x6c\x2b\x5d\xd3\xe8\xfc\x5d\x35\xcd\x32\xa6\xec\x32\x17\xe5\xce\x5f\x13\xea\x40\xad\xc2\xe9\x14\x4e\x81\x52\x50\x0e\xeb\x47\x3a\x80\xba\x0a\x6d\x0a\x43\x3e\xcf\xfe\xa6\x1d\xe6\x2f\xea\xf9\x11\xb9\xab\x88\x05\xdc\xf0\x65\x2c\x8b\x3a\x6b\x8c\x69\x74\x83\xc3\x11\x96\x96\x13\xa1\x19\x66\xd8\xc2\x0a\x4b\x8b\x01\xc6\x8d\x46\x08\x8d\x08\xa1\xc0\x19\x63\xa1\xac\x48\x59\x96\x1b\xce\x73\x88\xdc\x13\x73\x7b\xe7\xb7\xda\xfc\x35\x6b\xe3\xd3\x9b\xc7\x77\x5f\x5e\x77\x48\x6f\x9c\x81\x4f\xd9\xe3\x47\x78\x7f\x97\x0f\x33\x09\xa7\xd0\x44\xe5\x4c\x6b\x74\x1c\xf6\x88\x50\x8e\x95\x14\x44\x17\xb7\xb6\xbc\x0d\xd8\xa7\x62\x5d\x1d\x61\x0e\x63\x95\xba\xc0\x80\x0e\x36\x2d\x80\xcb\x8c\x2e\x72\x19\xac\x0a\x8c\x45\xe9\x3e\x50\xb8\x12\x21\x61\x70\x05\x11\xb4\xa5\x5f\x83\x8d\x02\x5a\xe4\x3a\xa0\x5b\x5f\x37\x8b\x3a\xe8\x4d\x46\x92\x7d\x8c\x9b\xb7\x39\xc2\xc7\xcf\xfb\x08\x97\xbe\x7b\xf4\xbd\xbb\xe9\x0f\xae\xe7\x2c\x78\xf3\xe1\xcd\x37\x76\xde\xe7\x5d\xa2\xd4\x91\x77\x20\x57\xce\xdb\xd6\xd5\x75\xc0\x7e\x97\x5f\xa4\x4a\x87\x76\x61\x1a\x11\x47\x10\x3f\x65\x84\x1c\x9d\x36\xcd\xf9\xbc\xf9\x4f\x85\xa3\x0d\x39\x98\x17\x6b\x77\xc9\x4d\xe7\x23\x27\x5c\x2c\x38\xad\x08\xd4\x6d\x92\x46\x3e\x8a\xcb\x58\xf2\x0f\xee\xd5\xef\xba\x88\x7e\xb3\x86\xc2\x35\x6d\x5f\x0b\xaa\xbf\x8a\x96\x3b\x9f\x7f\x7a\xff\x72\x52\x7a\x03\xfe\x7d\xde\xd1\x16\xe1\x69\xc8\xcf\xd7\x04\x87\x49\xcf\xe8\x04\x92\x7c\x3a\xe2\xf4\xd4\x54\x28\x02\x47\x70\x38\xd6\xf3\x7c\x9a\x50\xc6\x90\xe2\xae\x83\xd0\x87\xb6\xd1\x06\x24\x1e\x21\xef\xb4\x59\x9f\x9d\x7d\x28\xc1\xc9\xcf\x6b\xed\x91\x45\xdd\x2d\x99\xc1\x88\x5c\xfe\x8b\xd8\x3d\xfe\x55\xd9\xbf\xfd\xe3\xf7\x64\xc5\x3b\x48\x63\xbd\x77\x59\xde\x38\x29\x2a\x0c\x19\xc2\x6d\x3b\xba\x14\xed\x88\x66\x4a\x70\x28\x44\x05\x97\xa3\xb1\xa0\xb7\x6d\x06\x5d\x38\xd6\x5e\x9b\xdc\xaf\xf1\x0c\xf0\xaf\x6d\x36\x96\xf6\x62\x15\xcf\x7d\x01\xf1\x8e\x2f\x44\xa5\xf5\x62\xa9\x59\xcb\xf3\x88\x63\xce\x74\xd2\x1f\xfc\x03\xda\x5c\x9b\x6f\x84\xe1\xef\x18\x50\x9f\xd6\xa0\x7a\x4a\x9d\xb2\xa0\x0c\x27\x29\x39\x2f\x29\xe7\xc1\x03\x69\x65\x28\x1f\x90\xef\x6a\xe3\x02\x8c\x9a\x71\x10\xf4\x6e\x70\x37\x3e\xdd\xf9\xca\x0e\x3c\x13\xc9\x1f\xdc\x7c\x7e\x6f\x90\xcc\xdd\x6b\xd5\xa4\x57\x85\x75\x66\x70\x95\xe2\xaf\x49\x5a\xc0\x8a\xe3\x0a\x30\x5c\xad\x37\x5f\x2d\x26\x25\x4b\xef\x97\x31\x5d\x6b\x34\x0a\x51\x26\x28\x77\x0e\xe3\x70\xe2\x52\x08\x4c\x89\xeb\x36\x91\x88\xce\x51\x92\xec\xd3\xb5\xae\x26\xbb\xe3\xdf\xcd\x41\x7c\x1d\x2e\x0e\xa4\xbe\x94\x75\x4a\xea\xa5\x07\x75\x10\x29\x01\xcd\xa5\xbc\x3f\xda\xc1\x4b\x25\xe5\x6e\x6c\x9a\xe0\x87\x61\x58\xfa\x69\x9a\xb6\xf7\xe7\x0e\x75\xb6\xe9\x72\xdf\x7d\x59\xbf\x29\xa2\xdc\xd6\xfe\xa7\xa7\x35\xf7\x4c\xfb\x7a\xac\x41\x51\xaf\x77\x70\x69\xc7\x2c\xff\xca\x87\x61\x57\x85\x33\x28\x76\xf3\x79\xa3\x35\x86\xc9\x47\x3b\xfe\xce\xa7\x93\xf7\xe1\x14\x3d\x29\xe1\x95\x1e\x78\x96\xff\x7f\x94\xfd\x3d\xac\xe4\x3a\x9f\x1f\x08\x8b\x52\x7d\xc8\x8f\xe1\x77\xd4\xd3\xb7\x9f\xd6\xbc\xf6\xcc\xe8\x4c\xdf\xbe\xcd\x59\xaf\xd7\x04\x7a\xbb\x5b\x6b\xef\x78\x68\x78\x0d\x13\x5e\xec\x9a\x06\xf6\x83\x06\x76\x01\x86\x04\x16\x58\x30\x64\xc8\x90\x21\x43\x86\x0a\x15\x2a\x54\xa8\xb0\x42\x85\x0a\x15\x2a\xac\x50\xb7\x4f\x89\x67\x21\xaa\xea\x9c\x3a\x7d\xef\xb3\xf6\xe2\xb6\xea\xa8\x8e\xea\x9e\xaa\x92\x28\xf2\xff\xf1\xfb\xb8\xe2\xb3\xef\x32\xb6\xad\x1a\xf0\xee\xc3\xf6\x2c\xe6\x15\x10\xeb\xbf\x65\x06\x4d\x55\x5d\xd2\xaa\x02\xf5\x32\x27\xce\x0f\x9b\x77\x9d\x2f\x3d\x07\x78\xe9\x19\x8d\xa1\xef\x40\x15\x45\xf1\x95\x03\x57\x04\x9c\xdc\x6f\x5c\x0c\xc0\x4b\xb5\xa1\x00\xb8\x0a\x40\x2a\x75\x91\x40\xf9\x2e\xb1\x55\xf5\xc8\xdd\x2e\x4d\xe0\x3c\x5b\x3f\x5a\x0b\x0a\x50\x3c\x5a\xb9\x8b\x2e\x36\x8a\xc1\x18\xf8\xc3\x26\x9c\xf7\x67\x66\xd6\xbd\x12\xc4\xdb\xf5\xef\x8f\x31\x75\x71\xbd\xb0\xb8\x74\x17\xea\xe2\x6c\x69\x86\x40\x16\x21\xeb\x5b\xd9\x69\x11\x9c\xc7\x6e\x5a\xe4\x9a\x25\x27\xe1\x3e\x22\x3b\x14\xe2\xfe\xab\xd7\xd9\xed\xef\xfd\xf2\x09\x84\x12\xd6\xc7\xf7\x21\x3b\xdf\xd5\xa4\x88\xcb\xea\x82\x6c\x9c\xc3\x12\x9c\x31\xc8\x95\xef\x89\x2f\x1d\xf7\xb5\x6a\x9a\x1d\xe2\xd2\xdb\x69\x04\x82\x11\x0f\x3d\x6b\xcd\x00\xa6\xa2\xf0\x79\xaf\x25\x88\xb6\xf3\x82\x8e\x2a\xb1\x51\xb2\x9d\x97\x77\x0f\x5b\x4f\xfb\xc5\x9d\x6f\xd3\xe0\x8c\x9b\x5d\xfe\x38\x81\xdc\x93\xbd\x58\x32\x57\x03\x0e\xd6\xe4\x67\xae\x1c\x2c\x7d\xba\xf4\xe8\x9c\x58\xe7\x9d\x73\xc1\x6a\x8f\x73\xda\xcf\x8c\x10\x9a\x5b\x17\x25\x80\xad\xb9\x4c\x62\xaf\x75\x9f\x08\xdc\x3b\x70\x3f\xdb\x85\x00\x76\x48\x65\x25\xab\xa2\x56\xb8\xcc\xbe\xdb\x31\x51\x17\x13\x1a\xf9\x89\xbd\x8c\x7e\xc8\x5c\x56\xc7\xda\x2d\xa3\x05\xeb\x78\xe4\x4f\xf4\xd8\xec\xd2\xe8\x2f\x02\x7b\xf3\xf3\xbb\x1b\x5e\x2c\x70\xe2\xee\xc5\x95\xde\x6d\x64\xca\x5d\x59\x11\x7a\x32\xce\x4d\x3d\x48\x99\x97\x67\x2a\xad\x2a\x8c\x29\x97\x26\xce\x1b\x2f\x18\x90\xd6\x9b\x5d\x5a\x1b\xed\x6a\xda\x35\x4f\x91\x75\x13\xa8\x97\x51\xb1\xd4\xa5\x3c\xee\x9c\xc7\xb3\x1a\x01\x0f\x5c\x3c\x71\xac\x77\xe9\xc6\xc3\xde\xed\x43\x99\x28\x94\x8a\xfe\xf8\xf9\x96\x86\xff\xcd\x2f\x7f\x07\xd6\xa5\x6c\xdb\x7e\x3e\x18\xe2\x47\xdf\xc5\x3a\x5b\x64\x3c\x65\x4b\x4a\x0d\xa0\x22\x73\x39\xa3\x9e\xcf\xca\x47\x79\x9c\x7b\x9e\x83\xd6\xcb\x32\x56\xbb\x54\xc3\xc2\x60\x8b\x2b\x66\x59\x57\x14\xd4\xc0\x8e\x94\x84\xf7\xd8\x92\x0a\x59\x64\x0a\x83\xd6\xfb\x65\x7e\x52\xc7\x2a\x71\x81\x97\xf1\xf9\xcd\xcf\x1f\xdf\xef\x02\xfd\xba\xb8\x3a\x7a\x17\xbf\x7c\x89\x67\x07\x7a\x60\x85\x27\xcb\x59\x9d\x80\x72\x45\x85\x24\xf7\xc8\x37\x26\x71\xbe\x96\xd6\x56\xd2\xb7\xb0\xa0\x67\xe4\x07\x52\x52\x1e\x6a\x0c\xee\x89\x1d\xeb\xa4\x8f\xfe\x6a\xfd\xbb\x3f\x1d\x83\xd8\x56\xa8\x8d\x1d\xfe\x29\xf8\x9b\x5f\x3e\x25\x0f\xdb\x29\xfd\xf2\xf0\x35\xb1\x55\x1a\xa7\x39\x85\x65\x5a\x67\x4a\x13\xc1\xd2\xd4\xbb\x62\x39\x33\xd0\x41\xdf\x00\x96\x26\xbd\x12\x8b\x16\x72\x40\xfe\x5c\x13\x1d\xc3\x65\x9a\x6c\x07\x1a\x17\xb4\xc3\xff\x10\x4f\x91\x39\xba\x83\x88\xfe\x70\xe7\xb6\x84\xee\xf2\x93\x1b\x4e\x04\x84\xda\xf6\xbb\x0f\xef\x3e\xbf\xf9\x90\x7c\x78\xf7\xf9\xb8\xc6\x41\xef\x3e\x7f\xb9\x6a\xdd\x5f\xf5\xc5\xdf\xde\x09\xff\x1f\x82\x29\x6b\xe6\x4f\x08\x4b\xe9\xa7\xd3\x52\xc5\xb4\x75\x4e\xd9\xf5\x16\xf6\xa3\x8d\xa9\x66\x9c\xeb\x99\x3f\x52\xb1\xfe\x2e\x37\x06\x64\x55\x75\x10\xb9\xa0\xc6\x30\x5e\x79\xae\x93\x52\x49\xdf\x82\x56\x2a\xce\x7b\x63\xb8\x54\x5c\x2b\xef\x3c\x35\x26\xb4\x5e\x9e\xc9\x01\x81\x47\xe9\x40\x79\x14\xfb\x29\x70\x5d\x7f\xa7\x2d\x98\x74\x89\xf6\xf6\x1a\x51\x22\x10\xbc\x42\xbc\xdd\x4f\xce\x37\xd6\x73\xe7\x40\x65\x01\xdd\x78\xc2\xf8\xa8\xe2\x31\xf8\xd8\xee\xa2\xfd\xf1\xe7\xe8\x23\x18\x00\x8d\xbb\xa0\xd7\xb3\x14\xbe\x89\x47\xb3\x34\xc8\xa1\x58\xd9\xe0\x33\x2f\x76\x6d\xf0\x0e\x7e\x13\xbd\x0f\x3a\x2a\xcf\x5e\x95\x5f\x5e\x59\x02\x80\x5b\xcb\xe0\x16\xff\xfe\xfc\xed\xb8\x45\x5c\x5b\xdd\xfe\x97\x4f\xa0\xae\x8c\x03\xe9\x25\x02\x65\xac\x2c\x61\x9a\x2f\x11\x2b\x75\xc9\x00\xc2\xe8\x5c\xc2\x0a\xa1\xb3\x2f\x83\x42\x4c\x36\x66\x1e\x2e\xfd\x1a\x26\xae\x11\x0a\x9d\x51\x79\x90\x41\xc3\x0a\x59\x0b\x1c\x6a\x35\xb1\x5a\xd9\xd2\x49\x9f\x4a\xb3\xc5\x0b\x27\x7b\x2a\x0a\xcd\x49\x8d\x06\x7b\xb2\x21\xad\x8b\xf6\x91\x06\xcd\x51\x1f\x4c\x58\xb9\xfe\x69\x60\x63\xde\xf7\x9d\x37\x59\x8a\xff\x76\xeb\x2d\x83\x4d\x57\xe7\xca\x4b\x0b\xd9\xd1\xdf\x82\x3b\x59\x9d\xb8\x25\x25\xe0\x08\xd5\x2c\x2e\x17\x09\x86\xef\x02\x74\xe9\x62\xe2\x14\xa2\x18\x8d\x9e\xec\x04\x2e\x27\x79\x2e\xfd\x4c\xdb\xd2\xcf\x09\x2c\x6d\x89\x1f\xdd\x4e\x3c\xba\x83\xa1\x9c\x72\xa4\xad\xb8\xf4\x09\x4a\xf9\xba\xe0\x3a\x21\x3c\x2e\x53\xcc\xe4\x89\x29\x2c\x68\x91\xa7\x7a\x19\x45\x14\xef\xf2\xa8\x3d\x9a\xc0\xfb\xfa\xc7\xbf\xa7\xa3\xfe\x22\xc1\xb0\xcb\xc1\xb9\x1a\x47\x2a\xad\x2e\xac\x29\x72\x9f\x19\xcb\x0d\xb3\xfb\x7c\x8d\xb7\xdd\x92\x2a\x56\x54\xb0\xc0\x71\x2f\xbb\x81\x0e\x5d\x14\x03\x14\xd7\x47\x72\x28\xaf\x6b\xca\x9d\x07\xe5\xad\xc0\x17\x4c\x28\xf5\x23\x0d\x26\x94\xa8\xc8\x5d\xc1\xca\xc5\x2e\xfd\xa9\xda\x65\x87\x72\x39\x3b\x54\xe4\x99\x65\x35\x2a\xa8\x88\x07\xb7\xae\xe0\xeb\xb8\x2a\x92\xf2\xd0\x1c\xca\x80\xce\x78\x86\x4f\x7c\x79\x00\x64\xd7\x3d\xa2\xbd\xfa\x2e\x77\xd3\x23\xde\x47\xb5\x5d\x22\xdb\x44\x69\xd4\x3e\xa1\x23\xde\xf3\xe8\xaf\xee\x74\xc6\xfe\xfd\x33\xda\xfb\x3a\x84\x9e\x1b\xef\x5f\x9e\x3d\x8e\x3e\xde\x04\x22\xbf\x7e\x7b\x17\x86\x57\xd0\xbe\x7d\xfb\x43\x7b\xf6\xaf\xc1\xee\x56\xb2\xfa\xb8\x13\x3a\x4b\xe3\xcc\x4f\x6b\xb0\xde\x99\xcb\xa8\x4f\x5e\x03\xdd\x42\xc4\xc4\xa5\xdb\x2c\xce\x9c\xf1\x27\x5f\x97\xa0\x98\x26\x7f\xd6\xfb\xec\xfb\xd9\x25\xd3\x25\xbf\x6d\x3d\x7d\x8a\x7c\x4f\x40\x96\x94\x00\x82\xac\xf4\xa3\x1f\xf7\xbc\xc8\x72\xc1\x85\x66\x6d\xc7\xb5\xe0\xa8\xe0\xb8\x50\x4c\xf0\x2c\x17\x25\x52\x85\x14\xcc\xa3\x85\x81\x91\xfa\x99\xf9\x33\x1b\x04\x45\xa6\x28\x21\xd6\x04\x46\x87\xa8\x5e\xd7\x98\x3d\x8d\xde\x46\x79\xf4\x6f\xa2\xff\x25\x62\xd1\xff\xf1\x82\x3e\x0c\xdf\xfa\x19\x71\xf8\xed\xe1\x8f\xe0\x35\x42\xe5\xf6\xdf\x4f\x7f\xfc\x97\xf1\x8b\x08\x5b\x08\x32\x8f\x3f\x8a\x97\xdf\x92\xe2\xb8\xc4\x05\xa0\x22\x2f\x87\x4b\x75\x86\x48\x03\x5c\x40\x61\xb1\x9f\x60\x4c\x83\x64\xd7\x1a\x18\xc6\xe5\x72\x0a\x5b\xb1\x8c\xc8\xd5\x98\x95\xa9\x29\x94\xb7\xb4\xe6\xeb\x61\xcb\x28\x91\x85\x24\xa5\x27\xd6\x82\x36\x14\xe1\xc8\x9e\x62\x6a\x4a\xa9\x35\xa3\xa6\x44\x5e\xd4\x14\x50\x26\xb9\x6f\xb9\xe2\x92\x29\x88\xf2\x14\x99\xb2\xa3\x84\x26\x44\x8c\x0b\xe5\x3c\x35\x29\x47\x7e\x4a\x82\x19\x55\xd0\x30\xfd\x07\x91\x7a\x2a\x8f\x6c\x2f\xa3\x87\xa0\x6a\xbe\xe9\x82\x6e\xae\x78\xd7\x11\x71\xad\xa6\x7d\xfb\xf4\xed\x35\x59\xf8\xd5\xa0\xf8\xf8\x32\x26\xae\xed\xf9\xfd\x6f\x46\xc6\xe1\xd5\xc8\xc8\xe3\x02\x95\x04\x29\xc4\x58\x59\x3a\x2c\x10\xcc\x50\x59\xd4\x18\x33\xbd\xc0\x98\x3d\x45\xc3\x00\x32\xdf\x7a\x5b\x02\x36\x0c\x7d\x52\x48\xca\x38\x5f\xf2\x3d\xff\x5e\x55\xbb\xe2\x71\xbc\x6d\x67\xd1\xaf\x59\xb0\x8e\x7b\x40\x00\xc1\xbe\xf3\xa7\xbd\xcc\x11\x14\xb4\xe4\xa2\xd4\x12\x42\xe2\x27\x8a\x33\x99\x21\x90\xae\xbf\x63\x82\x0b\x5e\x48\x04\xd7\xb1\xc2\x4d\x59\x31\xc6\xa7\x30\x60\x9e\x22\xf2\x14\x91\x5e\x92\xd2\x15\x25\x2c\x2d\x29\x6e\x58\xed\x32\x68\xfe\xbc\x8d\xfe\x6d\x60\x05\x5c\x25\xf9\x7f\xba\xe7\x1a\x6e\x27\xea\x06\xd5\x7e\xf3\x23\x54\xfb\xed\xe7\x9f\x8e\x7f\x05\x3e\x5f\xb1\xda\x2f\x50\xed\x9f\x9e\xc5\xfd\x6e\x48\xed\x6f\xe1\xcc\x02\x66\xbb\x06\x9f\x26\x55\xa3\xcc\x64\x62\x6e\x58\xac\xe3\x41\xe8\x35\xa5\x20\x5c\x23\xd8\xae\x6b\x94\xa8\x1d\x12\xfe\xec\x67\x5e\x32\xdb\xa7\x36\x47\x22\xf5\x06\x60\x26\x98\x21\xd8\x67\x8b\x31\x05\xe8\xa6\x0c\x50\xef\x2a\x23\xa5\x52\x93\x04\x39\xf1\x2d\x90\x59\x05\x4b\xa9\x77\x73\x85\x98\x66\x25\x2e\x30\x54\x18\x33\x50\x08\xc3\x73\x28\x2d\x67\x25\x7e\x8a\xac\x9f\x72\x27\xa5\x15\xac\x07\x55\x65\x28\x8d\xa5\x2d\x91\xc4\x25\xf6\x03\x22\x96\x12\xcb\xa5\x51\xac\xe3\x46\x36\xd6\xe1\x92\xd9\x30\xf7\x8b\xa0\x97\x95\x3d\xf7\x95\xff\xfe\x95\xd2\xde\x1f\xaf\xaa\x3f\x5b\x13\x60\x9b\xb2\xbe\x26\xf7\xb5\xff\x6d\xa5\xfb\xf0\xe6\x45\x68\xfb\x61\x37\x57\x05\x04\x9d\xd7\x71\xe4\xb5\x1b\xd8\xb9\xb6\x6e\xe0\x9d\xf5\x35\x18\xbc\x05\x39\x6a\x9f\x21\xdb\x7c\xa9\x2e\x83\x1d\xaa\xaa\xca\x07\xd1\xa5\x0e\x9c\xbc\xdb\x67\x08\xa1\x45\x30\xd3\xb1\xca\x80\xc8\x4b\x60\xce\x46\x8b\x93\x61\xb1\x23\x7e\x26\xeb\x7f\xa0\xf3\x23\xb0\xdf\x75\x8c\xd6\x50\x80\x03\x6a\x9a\xe8\xb8\x61\x7c\xf7\xf0\x99\xdf\xf8\xf6\xba\x96\x5d\x0b\xa6\x0f\x2f\x5e\x9a\x0f\x20\xa8\xe2\x87\x95\xed\x8f\xcf\x5e\xed\x3f\x83\x9b\x2e\xfa\xa7\x80\x5f\x11\xfb\xe2\xfb\x68\xcf\x67\xa0\x67\x3b\x7f\x6f\x0f\xf5\xaf\x0c\xf0\xd6\x70\x20\x00\xf4\x6a\x9f\x2e\x3d\xab\x6b\x69\x8c\x69\x41\x4a\x16\xf1\x14\x19\xd7\xd5\x70\x1e\x49\x32\x5e\x8a\x3d\xf4\x46\x6d\xa6\x0c\x8d\x5e\x6c\x59\x28\xac\x00\xf1\xad\x64\x8c\x51\x8e\x09\xb4\x06\x30\x52\x76\x10\x29\x82\x68\x0c\xf9\xb6\x16\xcb\x27\x12\xbc\x79\xfe\xf2\x7a\x3d\xfe\x87\xff\x02\xcc\xfc\xe1\xf8\x5f\x80\x9a\x6f\x6d\x9e\x81\x36\xcb\x1d\xcc\xc2\xec\x25\x16\x17\xb6\xf6\x7b\x8a\x4a\x31\xc4\xf5\x72\x4e\xd3\xa0\xea\x57\x2c\x63\x17\x4b\x40\x62\xcd\x39\x95\x85\x25\xd0\xb7\x8b\xf1\x9d\xdb\x17\x05\x42\x25\x2a\x30\x51\x5c\x51\x25\x14\xa8\x4a\x24\x5b\xcc\xb3\x94\x9c\x28\x1d\x85\x18\xc7\xd1\x77\x8c\x65\x26\x0b\xc8\x79\x1b\xf4\x32\xc3\x18\x6b\xf6\x30\xb8\x31\xfc\x8b\xe8\x5f\x85\x55\x2c\xba\xf9\x4b\xfe\x7f\x6c\x03\x3c\xe3\xe7\xdf\x87\x2b\xb8\x85\x55\x1c\x8c\xbc\x42\xb1\xf5\xeb\x2a\xcf\x8d\x10\xa6\xa2\x56\xf9\x88\x2a\x4e\x0b\x21\xe0\x72\x56\x9a\x18\x49\x08\x5f\x6f\x36\x5f\x81\x32\xee\x2a\x6d\x85\x9f\x13\x7d\xd1\xeb\xa6\x9b\xb3\x00\x51\xd2\x9d\x27\x7a\x3e\xef\x2a\x53\x52\xcd\x08\x21\x94\x96\x08\x5a\x88\x3d\x3e\x4b\x9a\x05\x00\x6c\x87\xa0\x41\x08\x43\x51\x52\x8a\x27\xa1\xa5\xaf\xb9\xef\x84\x9f\x69\x27\x94\x52\xd8\x58\x47\xa2\x43\xb8\x8e\x6e\x1f\x45\x6f\x9f\xfb\x6b\x7f\xff\x83\x92\xe6\xb5\x29\xf2\xfe\xe1\xcd\xc3\x2b\x32\xf9\xdf\x81\xab\xb9\xfd\xfd\x94\xbc\xa9\x9d\x02\x09\x0a\x07\x6a\xb7\xb9\x8d\x32\xe7\xc7\x6c\x9f\x7a\x85\xeb\x9e\xa4\x36\xd5\x7e\xf0\xb3\x7e\x8a\xf4\x32\x10\xd0\x1a\xdf\xbb\x75\x1c\x3e\x6f\x27\xc9\x38\x15\x3b\x1b\x8c\xd4\xa4\x94\xd2\x2d\xb0\xc9\xb3\xb2\x81\xbd\xc0\xe5\xe0\x47\x64\xb3\x26\x8e\xb8\x1f\xa9\x9f\xe8\x58\x40\x81\x8a\xdb\x98\x64\x47\xb4\x4f\x5f\xf9\x69\xfc\x0e\xd7\xfe\x70\x2f\x62\xfe\xe6\xda\xe3\x7a\xf3\x33\xf8\x1d\xf9\xf2\xd0\xba\x17\x62\xf0\xf3\xba\x3a\xee\xf2\x10\xb6\x16\xb1\xbe\x40\x88\x76\xad\x6c\xb9\x29\x5a\x4a\xd1\x23\xab\x24\x9f\xeb\x16\xa0\x64\x8d\x82\x11\xed\x49\x69\x21\x59\x7a\x8b\xa5\x95\xa0\x23\xb9\xcb\xf1\x3e\x95\xb8\x90\x5a\x4a\x2d\xcd\x62\x4b\xe4\x61\x9b\xd9\x5c\x81\x54\x21\x2d\xeb\x98\x16\x17\xc5\x24\x95\xbc\xd4\x0e\x57\x3a\x43\xbd\x65\xb6\xae\x2a\xd4\x54\xeb\x9a\x2a\x9f\x8a\xc0\x51\xf9\x18\xfd\xb3\x70\x95\xfe\xd5\x35\xc6\xfa\xdf\xa2\xe8\xe3\x21\xa0\xc2\x3e\xff\xf2\xe9\xdb\xd5\x31\x6a\x8d\xdc\x93\x87\x77\xc7\xcf\xd9\x3d\xea\xed\xd3\xd7\x6f\xfb\x3f\xbe\x0f\x94\xb3\xf5\x32\xbd\x7b\xf8\x06\x7e\x3a\x3e\x7c\xfb\x53\xfe\xb2\xa0\xc7\xce\x9c\x7b\x88\x89\x45\x71\x1d\x63\x4c\x99\x21\xac\xe2\x20\xe2\xbd\xa8\x98\xc9\x1b\x52\xa2\x85\x02\x44\x04\xf6\x0c\x43\x5f\x02\x04\x29\xf2\x23\x86\x43\x22\xca\x0b\xcf\x76\x19\x63\x38\x77\x59\x79\x39\x59\xcc\x0c\x8f\x4f\x24\x73\x59\x69\x91\x83\xe3\xd4\x73\x90\x03\x09\x18\x2e\x61\x6a\x21\x33\x69\x06\x35\xf7\xb3\x56\x9e\xd7\x85\x29\xf8\x10\x9b\x42\x09\x44\x19\x64\xb4\x28\x30\xa9\xb5\x7e\x8a\x70\xa9\xfc\xc4\x39\x14\x3c\x2f\x3b\x4d\x9c\xd5\x1a\x1a\x95\x99\x2a\x6b\x82\x7f\xd1\x31\xa2\xc1\x5f\x24\xba\x76\x1c\x6e\x55\xf4\x08\xbc\xdf\xbf\xc8\x00\x06\xdb\xc3\x6b\xa5\x64\x9b\x5f\x6f\xe6\x22\x5f\x82\x2a\xd0\x97\xc3\xfe\xe7\x4f\xef\xf6\x37\xf9\xd8\xeb\xcf\x03\x26\x4b\x3d\x51\xe8\x60\x09\xdc\xd2\x00\x0a\x30\xe3\xdc\x5e\xa2\x8a\x11\x01\x34\x40\x4b\x05\x24\x44\x9a\xa0\xf3\x32\xa1\xb8\x5e\x66\x50\xd7\xf1\xd9\x4f\xd5\x72\x02\xb5\x67\x71\x09\x4e\xbe\xbc\xdf\xdf\x47\x16\x9d\x38\x47\x14\x1b\x47\x5c\x0e\x17\x87\x71\x2c\x8b\x4c\x53\x6b\x4a\x54\x12\xd6\xe5\xba\x58\xd0\xa8\x84\x66\xc3\xac\x94\xf2\x95\xda\x74\xe2\x0f\x11\x0d\x78\x7d\x7c\xc5\x58\xdd\xe2\xed\xdf\xf8\x1f\x6e\x4a\x25\xe0\x59\xa9\xe4\xcb\xb3\x2a\xee\x9b\x0d\x59\xfc\xf9\x37\xc5\xcd\xbf\x06\x77\x89\x20\x07\xb9\x03\xa3\x0d\x52\xb9\xa9\x9f\xc1\x79\x99\x47\xc0\xa9\x17\x4f\x91\x17\xb3\x37\x02\xe0\xde\x23\x30\xf9\x33\xc8\x82\x8a\xee\xe8\x8b\x75\x9b\x80\x71\xc0\x78\x45\x0d\x2e\x0b\x4a\xb0\x57\x95\xb0\x83\x38\xc5\x53\xdb\x92\xae\xdb\x8d\x9c\x73\x6e\x84\xda\x66\x40\x90\xce\xc6\x70\xb7\x3e\x0f\x4e\x89\x1e\xd5\xb5\xf1\x3d\x0b\xfc\x0b\x90\x13\x5a\x4b\x43\x2d\xb1\xba\x22\x5b\x7c\xb9\xc5\x02\xfb\x2b\x12\xf1\x76\xad\xff\xdd\x0b\xbb\x72\x0d\xa7\xc1\x8b\xee\xc5\xa7\xfb\xe4\xf6\x56\x03\xb8\xb3\x2e\x00\x3f\x4a\x42\x26\xbd\x91\x5c\x1a\x3f\x39\xda\x36\xb4\x5c\x6f\x54\xdf\xfa\x51\xb7\x4a\xd5\xa2\xde\x67\xd6\x28\x5d\x81\xe8\x34\x4f\xcd\xa6\x23\x5c\x83\xcc\x02\xf8\xfd\xbc\xef\x16\x4d\xb4\xd5\x85\x73\x68\x61\xfb\x0c\x53\xc9\x30\x6a\x8b\x02\x52\xa4\x09\xa6\x2d\x6b\x84\x54\x5a\x04\xbb\x8d\xde\x9f\x8d\x01\x59\x10\x3a\x37\xc6\x6b\xa3\x05\x2b\x1c\x24\xe2\x16\x47\x6f\x3e\x4f\x2f\xf5\xda\xdb\x1c\x1d\x81\x0d\x69\x1d\x82\xbb\xf7\xc7\x60\xbd\xff\x6d\xff\x70\x7c\xf8\xf8\x70\x7c\xd8\x87\x60\xe1\xf8\xf3\xc7\x6f\x0f\xef\x0f\xbf\x99\xa1\x0f\x26\x07\x99\x1f\xf3\xc7\x0c\xfa\x19\xe4\x50\x67\xc0\x64\x2e\x03\x3a\x5b\x3a\xaf\x33\xa0\xe3\xd2\x8b\x0c\xb8\xc7\x7a\x0f\x9f\xa2\xf3\x88\xfd\xe8\x87\x72\x19\xc5\xe6\xa7\x7b\xf6\x9d\x4b\xe6\x4b\x7a\xdb\xf6\x65\xab\xba\x4e\xb5\x92\x10\x42\x3a\x4a\x69\xb3\x94\xa8\xb4\xbc\xe4\x54\x60\x8d\x48\x1c\x51\x3f\x31\x3f\xb1\xe8\x10\xf1\xd0\x5f\xeb\x83\xb6\xf9\xe6\x5f\xb8\x79\x8b\xad\x09\xfc\x1f\xdf\x07\xcf\xa3\x2f\x9b\xff\xd1\x1a\xd2\x6f\x69\xdf\x97\x10\xe2\xff\x9e\xe7\xd1\xc7\x3b\xcf\x23\xc0\x62\x5e\x42\x9e\x15\xb0\xec\x7b\x9f\xc5\xc6\x55\x2d\x50\x80\x33\xaf\x3d\xf2\xc6\x97\x14\x30\x20\x47\x3f\x63\xb0\x7e\x7b\xd4\xa2\xdc\xe4\x28\x91\xc1\xf6\x88\x30\x3f\xae\xe1\xfe\x00\x4e\xcc\xdb\xa5\x27\x31\x8e\x29\xf3\xfc\x72\xa6\x09\xdc\xf5\x1e\xe5\x05\xcd\xb2\x4c\x92\x0a\xeb\xa5\x9b\x24\xad\x89\xe3\x20\xea\xa5\xa1\xae\x71\x6b\xd2\x48\x73\x4c\x11\xc3\x90\xac\x8f\xbe\xe4\x0d\x97\x22\xe3\xa3\x94\x8a\x72\xdf\x70\x2d\x6f\x5c\x7f\x7c\x24\x41\xe3\xec\x63\xf4\xb7\xe1\x4a\x46\x6f\xb7\x0a\xf9\xab\xb8\x74\xf3\x71\xde\x46\xe9\xb7\x0f\x5f\x3e\x6f\x1a\x3f\xf7\x2a\xd6\xb3\x3d\x59\x5b\x65\x13\xef\x32\x03\x1a\x5f\xc7\x2a\xc1\x9e\x43\x60\xfb\xc7\x7e\x82\xcd\xb0\x5e\xd9\x02\x50\x3f\xc6\x85\x5b\xce\x2e\x88\xc4\xee\x8a\x01\x98\xef\x2a\x2e\x3d\xb5\x46\x00\x6a\x5a\x30\x1b\xeb\x4f\xc6\x34\xc6\xfa\xb2\xf1\x64\x99\x28\x8d\x73\xdf\xb5\x37\x9c\x32\xd9\x4d\x51\x7a\x45\x22\x5e\xd5\x8b\xaf\xd1\xdd\xc7\xdf\x09\xa7\x3f\x06\x8a\xfd\x1d\x93\xf6\xe1\x5d\x42\x81\x21\x9a\x20\xd0\x5d\xd2\xa5\xbe\xc5\xcf\x6d\x16\xe2\xe7\xb8\x4e\xd8\xa5\x4e\x13\x7a\x69\x84\x4d\xac\x5d\xec\x8e\x10\x46\x58\xd0\x1c\x30\xdf\xab\xb8\xf0\x7c\x8d\x99\xb1\xa9\x2b\xad\xf4\x32\x88\x38\x5f\xce\xdc\x54\x55\x74\xe5\xc9\x99\xdd\x29\xfa\x87\xd1\x43\xf4\xb7\xd1\xbf\x0c\x8c\x90\x3b\x3d\x84\xfd\xf3\x07\xfc\xe9\x10\x9c\x00\x3e\x6c\xac\xb1\xed\x1c\xde\xbc\x00\xf6\x5b\xe7\xfc\xe7\xab\x17\x40\xc2\x13\x7a\x69\xe3\x76\x31\xb1\x5a\xf0\xa2\x6c\x6f\xad\xa3\x52\x72\x62\x40\xed\xab\x83\xb1\x97\x93\x05\x11\x8b\x67\x6e\x5a\x90\x95\xbe\x1b\x4e\xbe\x43\x20\x6a\xf8\x28\xb1\xaf\xc9\xee\xb4\x8c\x6b\xc8\x99\xfa\x33\x30\xdf\x4d\x5c\xce\x23\x53\xb8\xed\x74\x43\x36\xf7\x4f\xdf\x69\xad\x19\x29\x1c\xd4\x02\x5b\x48\x59\x4e\x08\xbd\xcb\x6f\xe0\x9d\xdf\xfe\x8b\xe7\xc4\x35\x9b\xfb\xff\x81\x17\xa3\xd7\xab\x7c\xe5\x35\xc1\xfb\xfc\xe6\x5e\x82\x6a\xeb\x26\xfc\xf2\xe9\xe1\x00\xd4\x3e\x5a\x6c\x96\xc5\xeb\x5b\xdb\x7a\xa2\x9d\xc8\x94\xc1\x26\xb7\xb4\x44\xa9\x67\x74\x99\x19\xa8\x84\x9f\x5c\xcb\x40\x51\x79\x31\x81\x2e\x4f\x7d\xe1\x92\xd3\xa5\xbc\x6d\x32\x81\xa4\x5c\x3a\xb4\x87\x1a\x16\x4b\x65\x38\x31\x84\xcc\xae\x30\x05\xb1\xfe\x4c\x1d\xac\x10\x43\x1a\x0b\x13\xf3\x02\xfa\x89\xfa\x91\xf9\x89\xf8\x01\x22\x14\xa5\x91\x0c\x3e\xe6\xf4\x19\xbb\xf5\xaf\x03\xe2\x86\x3e\x5f\xad\xcd\x37\xf9\xf7\xba\xdb\xbb\x3b\x3f\x96\xaf\xaf\x79\x30\xbf\xdb\xd6\x4e\x22\x9f\xc7\x76\x69\xfb\x3e\x26\x55\xcc\x86\x61\xa9\xe3\xea\x72\x2a\x8a\x5d\xe1\x05\xd3\x20\x05\x50\xfa\xda\x0f\xbe\x5f\x2a\x02\x2c\xc8\x86\x8e\x11\x8f\x63\x72\x5a\x63\xbb\x98\x81\xd3\xe3\xf8\xbc\xe7\x02\x75\xbb\x8a\xb3\x65\xaa\xc4\xd2\x41\xd8\x82\x1a\x94\xe5\x49\x9f\x20\x3c\xe9\x53\xe9\x4f\x08\x1a\x49\x10\x56\x57\xfb\x76\x94\x63\x62\x92\x0c\x63\x1c\x1c\x16\x3d\x26\x84\x2c\x7d\xc9\x50\x91\x87\xb8\x84\x3d\xd1\xe0\x43\xf3\x87\xe8\xcf\xc2\xbd\x74\xf3\x00\x5d\x27\xea\xe4\xdb\x9a\xe4\x7f\x5c\xb3\x87\xad\x0b\xbb\xd5\xcd\x6f\xe8\xba\x17\xb3\xec\xf5\xee\x7a\x78\xad\xf3\xf1\xe5\xe3\x0b\xa2\xeb\xe3\x7e\x6e\x47\xbc\xb8\x59\x97\x60\xc6\xbe\x2a\x69\x59\x3e\xce\x36\xcd\x80\x3c\x2f\x27\x16\xa7\xbd\x1f\x53\x52\x72\x54\xe6\x45\x09\x39\x44\x08\xf1\x19\xf0\x58\x2f\xfa\xbc\xf0\xfd\x79\x21\x6b\x22\x92\x73\x81\xfc\xc4\xce\x7e\x20\x20\x4a\x1c\x48\x41\xc4\x9e\x22\x3f\x27\x4c\x53\xdb\xc7\xa8\x14\x5a\x29\x8a\x31\x9d\x0a\x98\x1b\xcf\x47\x75\x02\x38\x43\x25\x2b\x51\x91\x43\xc4\x4b\x04\x0b\x59\xfb\x93\xf1\x83\xb5\xfe\x24\x68\x66\x33\x3c\xa9\x5a\x58\x5a\xd1\xd6\x74\x3c\xf0\xee\xe4\xd5\x97\xe7\x86\xeb\xfb\x21\x76\x79\x51\x59\x4b\x82\xca\xe5\xdf\x83\x8d\x3b\xf4\xe6\x2e\x28\x0b\xb9\x2f\x07\xd8\x02\xbd\x49\xa3\xc2\x65\x2e\x92\x74\x61\x7d\x9c\x95\x4b\x35\xa7\xa7\xc5\x31\x30\xb4\xd9\x52\xc7\x03\xcc\x96\x16\x14\xbe\x03\x3d\xd0\x5e\xfb\xe9\x36\xba\x77\x23\xa5\x94\x6a\xb5\xb4\xdc\xd4\xa8\xc2\xa0\xf4\x13\x77\xd8\x66\x06\xa1\x98\xac\x31\x57\x48\x9b\xa2\x28\xf0\xf0\xca\xe0\xd3\xf1\x0f\xa3\xb7\x9b\xa6\xec\x9d\xfe\xca\x33\x6c\xe5\x07\x44\xce\x96\x13\x26\x65\x42\x2e\x4d\x7c\x0a\x02\xa0\x78\x97\xdb\x8b\x71\x7d\x3c\x0b\xdb\xcf\xc4\x0f\xe7\xd6\x8f\xa8\x77\x82\x10\xe1\x2c\x5d\xba\xdd\xbc\x4e\x23\x92\xfb\xc8\xcf\xd6\x81\xac\x57\x4e\x60\x68\x10\xe7\xd8\x40\x5c\x52\x29\x30\x13\x61\x0e\x2c\x8f\xcd\x1e\x47\x6f\x9f\x63\xdd\xdf\xcd\xdc\xc2\x14\xf2\x53\x68\xf7\x04\x09\x80\xbf\x03\x0f\x87\xf5\xbe\xfa\x61\xca\x00\x1a\x40\x0b\xaa\xad\xe9\xe1\xb9\xf5\x43\xbe\x2f\xbd\xa5\x00\xd1\xdc\xe5\xd6\x2b\x47\x7c\x97\xf9\xb3\xaf\x24\x20\x53\xe1\x6b\xb7\x8b\x2e\xd1\xf3\x76\x0e\xe7\x91\x73\xc6\xcc\xa5\xb3\x18\x2b\xd8\x08\xcc\x3a\xdb\x20\x03\x05\x8b\x99\xf0\xcd\x56\x21\x4c\x22\xfa\x84\x03\x47\xfd\x9f\x5c\x3d\xa6\x36\x67\x9a\x3b\x87\xa3\xe3\x9b\x4d\x65\xeb\x2f\xc0\xcf\x1f\xdf\x1f\xff\xfc\xed\x31\x4a\x9e\x5f\xf1\xe3\x0b\xc0\x1f\xdf\x1e\xe3\x4f\x89\xa0\xb6\xa1\x18\x4b\x5a\xca\x2c\x55\x16\x2b\x22\x25\x65\x40\xef\x20\xa5\xe5\x24\x9e\x22\xcc\x31\xc2\x92\x22\x95\x09\x85\x2d\x22\x12\x41\xe0\x16\xad\xa8\xa2\x72\x37\xe8\x12\x5e\x4a\x08\x0d\x72\x0d\x82\x90\x62\xbc\xcb\x33\x3f\x7b\xe1\x6b\xcb\x39\x20\xc0\x01\x8e\x98\xc9\x16\xe4\x85\x01\x7d\x3c\xe7\x97\xa2\x80\x0d\xaa\xfb\x92\x11\x8c\x77\xf8\xf9\xc5\x12\x20\x50\x01\x0e\x9f\xa2\xd9\x8f\x25\x40\xe7\xe8\x18\xad\xe3\xc6\xec\xf9\x0f\x1e\xb1\xcf\x95\x85\x6d\x8a\x5f\x27\xf1\xd7\x17\xe4\xc7\x12\x27\x60\xb1\xc8\xea\x2c\xc6\x4b\x5d\xc4\x25\x28\x7e\x85\x67\x30\x16\x4b\x3b\x24\xd5\x85\xdf\x6f\xad\x1c\x7d\xc7\x01\x4c\x22\x50\x00\xb8\x06\x70\xd3\x6e\x52\x90\x6a\x7e\x19\xb4\x4e\x20\xf7\xfd\x9a\x3a\x6f\xff\x46\x26\x89\x41\x14\x32\xcb\xca\x90\x67\xe2\xa3\xde\xd3\x67\xbf\xf8\x7f\x17\xfd\x8f\xd1\x7f\x08\xea\x3c\xa1\x77\x08\xde\x47\xfb\xcf\x2f\x3d\x86\x0d\x70\x76\x25\xbe\xdd\x7b\x4a\xbf\x09\x30\x93\x57\x14\xed\x75\xaa\x0f\x38\x83\xfd\x6f\xbc\x85\x2c\xe8\x01\x96\xbe\xf1\xad\x02\x04\xe7\x99\xcd\x31\xf4\xd8\x8b\xe2\x74\xc6\xf3\x09\x50\xc1\x05\x93\x5e\x29\xa9\xa4\xd9\xe3\x8a\x1b\xe6\x4e\x6d\x2b\x55\x50\x4b\x60\x8f\xce\x35\x4d\xac\xab\x45\x81\xc9\xe7\xb1\x01\xe3\xa3\xbb\xed\xf9\x62\x9f\xf9\xd6\x80\x88\xfb\x99\x67\xb9\xa4\xb6\x28\x60\x09\x35\x2c\x41\x85\xa8\xa0\x14\x11\xc7\x04\x27\xd2\x50\xa3\x3c\xf2\xa5\x61\x34\x94\x85\xd0\x3c\x1b\x70\x22\x64\xba\x79\xb7\x5f\x35\x6d\x78\x88\x39\xde\x04\xd7\x91\x8f\xc1\x31\xee\xd5\x3c\x70\xc5\x7b\x6e\x27\xe4\x3a\x27\x1c\xdf\xc7\x49\xa8\x6b\xbf\x8a\x38\x3e\x7d\xf8\xbc\x4e\x0d\x09\x4c\xf8\xa5\x89\xbb\x45\xc5\x66\x41\xbe\x12\x4c\x30\x49\x9c\x92\xca\x1e\x6a\x77\xa1\xb6\xd6\xaa\xb7\x03\x98\x12\xba\x06\x1d\x69\xe9\xdb\x71\xf6\x1d\x06\x79\x67\x38\x1e\xb8\x51\xf4\x16\x75\x48\xc2\xb4\xc4\x27\x26\x8d\xe1\xdd\x16\x6f\x38\xe6\xcf\x4f\x91\x3c\x9f\xa4\x61\x65\xee\x0a\xa1\x32\x97\xae\xa9\x38\xc6\xfc\x25\x26\x75\xfb\xec\xff\xdd\x45\xff\xa6\x38\xf9\xfb\x59\xe4\x9b\x30\x3a\x8f\xd7\x31\x0a\x90\x03\xd5\x26\xf2\x6f\xbc\x8a\x91\x2f\xcf\x13\xf3\x27\x3f\xf8\xfc\xe4\x35\x03\xd8\x7a\x16\xa7\x81\x52\xdb\x83\x53\x20\x18\xaf\x1b\x01\x05\xf6\x27\x7f\xea\xe3\x22\x4e\xcb\x65\x5e\xa6\x9d\x53\x4a\x29\x63\x8c\x36\x8e\x39\x03\xa2\xd1\x59\xa9\x8c\x0e\xa9\x92\xd4\xbe\x21\xc2\x2a\xd2\x96\xc2\x49\xb4\x7d\x17\x1e\xae\xcf\x1c\x7a\xc4\x7f\x15\xa1\xb0\xaa\xbc\xe8\x9f\xff\xe9\xe9\xfa\x4e\x9a\x77\xbb\x28\x71\x66\x09\xaf\x28\xa3\x00\x02\x95\xe8\x8b\x8d\xc7\x85\xc5\xf5\x92\xed\x88\xbd\x14\xf6\x94\x08\x6e\x4f\x6b\x00\xd8\x9c\x9f\x22\xdf\x60\x00\x4f\x56\xe0\x41\x1a\xcd\x76\x33\x6c\xea\xc7\x3e\xa1\x9c\x59\x50\x82\x62\xbb\x34\x3e\xdb\xae\xc7\x20\x0d\x43\xc5\xcb\x75\x10\xe5\x76\x1d\xe2\x48\x5f\x71\xb7\x3f\x05\x9c\xe4\x73\x56\x10\x98\x4a\x6f\xae\x69\xc1\xcb\x25\x79\xad\x72\x1f\x8e\x66\xae\x77\xae\xe6\x46\xb4\x35\x98\xbc\x8b\x35\xd0\x21\x03\x07\xbd\x77\xf5\x44\xe7\xc6\x99\x49\xf4\xd6\xf7\xa0\xf6\x7a\x47\x66\x20\xbf\x9b\x18\x4d\x13\xd3\x12\x94\xb6\x05\x45\xdf\xdb\xde\xfa\xb3\xaa\x2a\x80\x17\x17\x73\x3f\x35\xc6\x82\xc8\xf6\xe1\xf3\x89\x70\x6e\xdb\xe8\x6d\x54\xae\x59\xcb\x6f\xc3\xff\x6b\xd6\x72\x5f\x49\x78\x89\x5c\x82\xc4\xe6\xc3\xb7\x87\xde\x0e\xce\xa9\x74\x94\x6d\x5a\x83\xd6\xbb\x58\xed\x72\x4f\x33\xd0\x08\x11\x70\x7a\xa5\x1f\xb3\x5a\x72\xae\xb1\x52\x5d\xfe\x14\x39\x50\x67\x1e\xee\x4a\x3f\x82\xea\xbb\x8d\x33\xef\x2a\xa5\x41\x66\x1d\x18\x6d\x7d\x19\xaf\x2e\xf2\x4a\xa8\xca\x58\x55\x49\x5e\x83\xf4\x52\x27\xe3\x55\x0f\x07\x47\xa7\x63\xb5\x47\x37\x1e\xda\xab\x71\x7d\x8d\x36\x7f\x18\xd7\x9b\xf9\xe6\x6d\x41\x14\x00\x56\xc0\x56\x00\xf9\xfe\x7c\x8e\x0b\x6f\xfb\x8e\xf9\xd9\xcf\x0b\xa9\x7d\x2f\x40\xa4\x7c\x17\xe7\xe7\xb3\x1f\xc0\x29\xe8\xa7\x59\x2f\x77\x03\x63\x8c\x19\x6d\x94\x71\xd4\x29\x90\x4e\xce\xa8\xf5\x59\x60\x81\xab\xed\x73\x6d\x1a\x1f\xa7\xc0\x6c\xf8\xd7\xaf\xf4\xce\xee\x25\x09\x43\x47\xe7\xcb\xe7\xed\xbc\xbe\xfb\xf0\x3b\x2a\xeb\x57\x37\xf4\x37\x1f\x76\x83\x0b\x88\x26\x4d\xad\xe0\x8a\x8b\xfa\xc4\x7b\x23\xa5\x1e\x44\xb9\x4c\xed\x45\xc5\x6c\xa9\x5d\x02\x1d\x07\x10\x44\xe9\x39\x2b\x32\x57\x10\xb4\x9c\xbc\xb0\x2e\x55\x8d\xb4\xfa\xb4\x3b\x19\xab\xad\xb3\x94\x69\xce\xcd\xfa\xc0\x28\x73\x5c\x58\x40\x6d\x67\x17\x07\x8b\x34\xcd\x8b\x9e\x4d\x25\x22\x22\xb6\xde\xf8\xda\x6a\x0e\x4a\x40\x36\x3d\x52\x09\xce\x47\x13\xfc\x59\x6e\x5e\x58\xdb\x4c\x78\x5d\x33\xee\x11\x2f\x5b\x5b\x2a\xb9\x2f\xb1\x36\x4a\x2b\x69\xa7\x6a\x0d\xb2\x95\xaf\x3c\x41\x04\x70\x5d\x38\xc8\x99\x27\x3d\xcf\x4f\x03\x01\x69\x3f\x1a\x21\xb4\xda\x6b\xcb\x1d\xb5\xfb\x02\x73\xc5\x39\xf4\xce\x81\x52\xfa\xda\x65\xa5\x85\x7d\x09\x8b\x12\x23\x5b\x12\xc0\xe8\x49\x48\x2d\xea\x8e\x75\x4d\x74\x8c\xcc\x53\x79\x64\xbb\xf6\xae\x96\xf2\xb0\x29\xfe\xbd\x7b\xf6\xdd\xfd\x8d\xc7\xca\xfb\x97\xc6\x33\x70\xbb\x66\x39\xc7\xe2\x7b\x1b\xd3\xe5\xcc\x42\x9e\x40\xc0\xe9\xf1\x7c\xdb\xbb\x8c\xea\x29\xf2\x4e\x00\x9a\x40\x90\x03\xcc\x7c\xeb\x87\x5d\x6b\xdc\x92\xc6\xb3\xf3\xa8\xae\x6b\x0f\xd7\x87\x86\x1b\x66\xb1\x28\x95\x73\x38\xe8\x4f\x90\x50\xaf\x7c\x77\x45\x78\x47\xe0\x21\x88\x55\xad\x57\x3d\xbc\xf3\xe1\xaa\xf2\xfb\x43\x95\xee\x26\x66\x07\x64\x4c\xd2\x2a\x8d\xcb\xa5\xce\x80\x00\x9c\x7a\xe7\x6d\xe5\x11\x8b\x0b\xb6\xcc\x7e\x3e\x96\x7e\x60\x46\x8b\xc2\x68\xfc\xdd\x4e\x09\xb9\xb4\x41\x11\x60\xd7\x40\x08\xa1\x2e\x4a\xa1\x25\x91\xd4\x50\xe9\x2b\xbb\x9c\x04\xcb\x5c\x4e\xe2\x42\x7a\x6e\xd5\x3a\xa7\x56\xe1\xf3\xc1\x10\x0b\xfc\xf3\xa0\x06\x7d\xd3\x9f\xd8\x94\xff\x6f\xee\x17\xf7\x82\xf4\x6f\x8e\x9f\x7e\xde\x87\xa4\x2c\x79\xb6\xbb\xda\xaa\xcc\xf1\xa9\x82\xb1\x26\x1c\x38\x9f\x13\x37\x43\x94\x56\x99\xf1\xd5\xd9\x14\x76\xa9\x55\x5c\x18\x4f\xb4\x06\x32\x46\x82\x2c\x53\x6e\x52\x20\x8a\xcc\x8b\xb8\x4c\x0b\x30\x48\xa7\xb8\xb6\x7b\x58\x96\x9a\x91\xe5\xec\x6d\x1e\x42\xb0\x51\x11\x0a\x2a\x5f\x4f\xba\x03\x11\xb0\x54\x8c\x8a\xb0\x42\x7b\x2d\xb5\x96\x67\xcf\xd6\x45\xf1\x3a\x46\xd9\xfa\x5d\x76\x63\x94\x5f\xfd\x4d\x5f\xee\xbc\x1f\xe1\x9d\x21\x17\x7b\xb8\x3a\xbc\xee\x8f\xbf\xfc\x73\x70\xbd\x29\xef\xdd\xdc\xc0\xbc\x81\x74\x2a\xaf\xb1\x60\x14\x72\x06\xbd\x04\x2a\x49\x09\x0f\x02\xf8\xa7\x86\x3a\x90\x4a\x23\x6d\xdd\xb3\xd1\x29\xea\x67\x45\x0d\x91\x3e\xb7\x4c\x5a\xb3\x1b\x1b\x77\x72\x3e\xd2\x3c\x6b\x72\x01\x7a\xa7\xfb\x6a\x18\x9d\xcb\x3d\x91\x43\x6d\xb9\x6a\xc6\xda\xb4\xa7\x76\x9a\xab\x13\x39\x35\x10\x3d\x45\x0d\x3d\xdd\xe6\x8f\x75\xcd\xde\x2a\x05\xf7\xfc\xbd\xeb\xac\xf6\xee\xe1\xdd\x1f\xff\x16\x1c\x3f\x14\x1f\xc3\xad\x16\xda\x56\x6f\x5e\x39\x6e\xee\x03\x2c\xea\xe1\x0b\xe0\x31\xb6\xa1\xbf\x66\xdb\x76\x91\x71\xb7\xe0\x09\x08\x90\xa3\xe9\x62\x7d\xcf\x1b\x0e\x20\x72\x19\xac\x86\x20\x08\x19\x25\x51\xf8\xd9\xc5\x7d\xc8\x8f\xa3\x5d\x2d\x84\xe1\x93\x3e\x4b\x6d\x72\xdb\x6b\xa6\xed\x9c\x53\x22\x20\xe0\x5a\x6a\xa1\xf9\x28\xc4\x24\xe5\xb5\xbe\x61\xf6\xeb\x88\xda\xa2\xa7\x7f\xb6\x61\xe2\x3e\x15\xaf\x58\x58\xdb\x6c\x70\xfd\x3e\xa1\x08\xf8\xe6\x43\x90\xea\xff\xf8\x70\x88\xa8\x2f\x16\x82\x62\x1c\xf3\x4a\x6a\xeb\x7c\xc1\x4a\x57\x52\xaf\x05\x75\x44\x76\x49\x5e\x25\xf9\xc2\x41\x06\x1a\xe6\xb1\x1f\x2b\x3f\xf9\x52\x80\x1e\xe4\x0b\xd9\x47\x86\xe7\xd6\xa0\xd1\xd1\xc6\x09\x4d\x94\xcc\x4c\x45\x9c\xf5\xce\x5a\x3b\xeb\xaa\x02\xa5\x4f\xc1\xe8\xa7\x4a\x57\xe7\x30\x47\xc7\xc3\x13\x39\xcc\x3b\x7d\x9d\x2d\xa2\xeb\xea\x76\x45\x57\xbe\xc4\xe9\xf1\xb0\x2b\x3c\x29\xc1\xe4\x16\x68\x81\x2c\x3d\xae\xe3\x61\x81\xeb\xb6\xd3\xb6\xb9\xa4\xc6\x24\x73\xb3\x8c\xe3\xd2\x4c\x57\xbd\x19\x74\xb4\x57\x4f\xb0\x4d\x89\xf1\xe6\x76\xb0\x35\x40\x7f\x0e\x0e\x20\xeb\x57\xff\x67\x81\xb9\xf5\xf3\xbe\x55\x5e\xfa\x68\x57\x7a\x13\xa3\x79\x00\x2e\x46\x5e\x06\x70\xbb\x03\x19\x88\xa8\x9f\xfd\xd9\x47\xfa\xec\x1b\x09\xca\xdd\xa8\x19\x72\x76\xcd\xbc\xe3\x1e\x2d\x11\x80\x3e\xa7\x8d\xed\xb8\xe0\xad\x72\xec\x9a\x77\xd7\xbb\x21\xcc\x80\x1f\x36\x67\xd3\x57\x79\xf7\xb3\x43\xfe\x3e\x48\xa6\x64\xeb\xc9\x8f\xbe\x3d\xab\x20\x6f\x33\xf8\x17\x80\x81\xa8\x80\xac\x82\xbb\x64\x5a\x5d\x74\x05\x52\xef\xe2\x74\x7d\x5e\x56\xde\xf8\x14\x83\x11\xa0\xc1\x71\x31\xd3\xcc\xe5\x14\xfb\x76\x16\x3b\xec\x9c\x73\xb6\x5e\xaa\xe0\x88\xc1\xd7\xe9\x50\x79\xe7\x6b\xe8\x20\x48\x0b\x3f\x16\x05\x75\xe8\x84\x11\xa6\x21\xe6\xb0\x81\x03\xea\xae\xee\x7e\x1f\xe2\x8d\x01\x7a\x3d\x57\xf7\x9c\xe8\x0f\x6f\xb6\x6e\x78\xf2\xf0\xee\x21\xee\xda\xbc\xb7\x9a\xef\xf3\x47\xbd\x2f\x16\x43\xa5\xa2\x96\x1a\x37\xe2\x65\x7c\x8a\x9a\xd6\xe4\xcd\x4c\x58\xd2\x5f\x10\xe8\xbd\xf5\x13\xeb\x00\x1c\xe2\xd2\x78\x6a\x25\xa7\x92\x49\xc6\x4b\x67\xc0\xe0\x71\x5e\x38\x04\x69\x32\xd8\x28\x02\x21\x3e\xd3\x3b\x17\xd0\xea\x9b\x12\xde\xcf\xcf\x38\xd2\xe3\x1f\x5f\xb1\x7f\x43\x41\xfa\x97\x4f\xd1\x56\xba\xda\x54\x05\x80\xdc\x17\x4b\x27\x5c\x09\xa2\x93\x34\x46\x83\x42\xfa\xc1\xaa\xc2\x1a\xd1\xc1\xd6\xa1\xd2\x9b\x65\xa6\x31\x02\x3a\xcb\x7d\xe5\x29\x05\x27\x40\x20\xf2\x93\x3f\x8b\xd0\xc6\xcf\x76\xce\x12\x53\x8b\x5a\x73\xe2\xeb\xce\x8e\x40\x23\x69\xc6\x29\x6f\x0a\x6b\x99\x9f\x9c\x73\x00\x52\xe4\x67\x69\xcc\x84\x90\xa3\x96\xd6\x51\xb4\x07\xec\x89\x1c\x9a\xdd\x7c\xf5\x15\xfd\x9b\x2b\xb3\xe5\xe1\x47\x64\xd1\x73\x41\xe5\xed\x5d\x37\x30\xa9\xab\x58\x68\xc5\x14\xac\x28\x7f\x9c\xaa\x98\x7a\xba\xcb\x1f\xa7\x75\xa3\x9c\x69\x2a\x76\x99\x91\x4a\xa8\xdd\xec\x9b\x8b\xe0\x3c\x73\x19\xb5\x5e\xef\xb8\x3f\x35\xbe\x68\xe2\x33\x15\x7c\x0d\x24\x14\xe1\x34\x4a\x40\x13\xeb\x03\xd9\x0d\x57\xdc\xc3\x2b\xb5\x5d\xd0\xec\xdc\xa3\x08\x0e\x55\xeb\xb6\x1b\x96\x1a\xac\x89\x17\xbf\x8d\x03\x75\xf5\xe3\x7d\xc5\x56\x7e\xf7\x03\x86\xfa\xf6\xdf\xfa\x57\x81\x8a\xcb\xea\x86\x20\x48\xe0\x65\x88\xb1\x7d\x9c\xab\x98\x5d\xc6\xa4\x08\x90\x8e\x93\xde\xa5\x8f\xf3\xce\x09\x11\x8c\x80\xd5\xd2\x50\x16\x33\x65\x94\x91\x97\x62\x8c\x92\x48\x87\xde\x78\x16\xfd\x83\xe8\xcf\x7e\x83\xd6\xbf\x9e\xa4\xdf\xc0\xf5\xbf\xee\x20\x2a\x62\xf7\xeb\x14\x77\x79\xd1\xe2\xbc\xca\x70\x12\xb5\x05\x8d\x8b\x4b\x17\x4f\x4b\x5e\x2d\x59\x7c\xbe\x9c\x76\x18\xef\x33\x26\x9d\xa3\xc4\xb7\x42\x42\xc5\x8b\x92\x2b\x37\x6d\x54\xf8\xc9\xa9\x75\xae\xd0\xc1\xeb\xaa\x7e\xe6\xbf\x06\xfc\xe0\xfa\x4d\x0f\xcf\x53\x51\x98\xdf\x6f\xe2\xf6\xeb\x5a\x7b\x7c\xf8\x12\xb6\x70\x06\xf6\xd9\x34\x5d\x78\x09\x77\xa2\xba\xd0\x4a\x55\x02\xa4\xd5\x19\x60\x98\x2f\x73\x0c\xb3\xd4\x9b\x38\xcb\x62\xbd\x70\x14\xf7\x97\x3a\x58\x08\xd6\x7e\xb2\xfe\x2c\xe0\x32\x51\x0a\xb4\xa0\x56\x0d\x06\x13\x4b\x88\xb5\x7e\x34\x66\x29\xda\x68\x07\xf0\x13\x3e\x74\x3b\x15\xae\xe3\xe6\x31\x74\x0b\x46\xee\x7a\x14\xa0\xdf\xd1\xc7\xa6\x4a\xb2\xcb\x79\x47\xab\xc7\xae\xaa\x76\xf8\xb1\xdb\xa9\x65\x72\xd3\x32\x2f\x42\xca\xd8\x79\x39\xaf\x63\x94\x3e\xd1\xc3\x29\xd4\xd5\x5e\x78\x09\x57\xcf\xf1\xf5\xc4\xde\xe2\xb2\x37\x57\x9d\x08\x40\x63\x11\xf8\xe9\xd5\xe2\x2c\x18\x3c\x8c\xd5\xfa\x58\x79\xb8\xcb\xc7\xf1\xd2\x7a\x0d\x34\x38\x77\x5d\xb7\x4c\xa7\xd3\xe9\x14\x5d\xf3\x17\x1e\xc6\xd0\x9d\x7f\xd7\x9d\x7f\x60\xb0\xa4\x7a\xf7\x3a\x9a\x79\xb1\xf2\x8a\xde\x3e\xec\x91\x24\x06\xcb\x0b\x8c\xd3\x22\xad\xb3\x3c\xe9\x16\xd6\xdb\xaa\xf3\xdd\x2d\x8c\xb1\xbe\x9e\x8d\x6d\xf8\x5c\x3b\xbb\xcc\x02\x9c\x8c\x2f\xf6\xd1\x9a\xd7\x88\xd9\x56\x99\x33\xce\x67\xee\x5c\xfa\xa6\x87\x6b\xe0\xd2\xa1\x59\x11\x46\xb0\x65\x2c\xe6\x4b\xeb\x8d\x01\x18\xcc\x01\x7f\xb9\xf5\xfd\x76\xed\xe6\xc3\xf3\x32\xda\xff\x12\xdc\xda\xb9\x3f\x98\x57\x3d\x00\xb2\x9e\x91\x2b\xee\x2f\xc9\x96\x6c\x88\x4b\xb6\x9c\xfc\xdc\x2f\x2d\x8b\x51\xb3\xe0\x24\x4b\x83\xd2\x9d\xdb\x41\x6b\x9d\x75\x02\xba\x33\xaf\x15\xc0\xfe\x5c\x3b\x77\x72\x59\x2e\x9c\x5d\xc7\x9c\x09\x5a\x5b\xfd\x75\x75\x0a\xda\x0f\x5f\xbf\x7c\x7d\xf3\x39\x3b\x86\x98\x74\x7b\x67\x70\x57\xe5\x00\xbb\xf7\x47\x60\x12\x4b\xd2\x3a\x45\xb1\x5b\xf2\x61\xd1\x0c\xcc\xe3\x65\x00\xa7\xb1\x93\xed\xc0\xc7\x56\xb6\xfd\x0e\x03\x78\x16\xcb\x04\x46\xd7\x65\xc0\x78\x92\xd5\xba\xf2\x4d\xed\xf4\x98\x10\x61\x94\xe1\x36\x3c\xfa\xac\xb2\x1a\x94\xe1\x9a\x35\x4f\xe6\xc8\x76\x79\xf8\x2c\xbf\x8b\x94\xbe\x4a\xb8\xae\xb1\xf9\xbc\x7e\xfd\x24\xff\x95\xc5\xe7\x00\x7b\x9c\x93\xd6\x48\xa9\xf4\x2e\x77\x7e\x70\x1b\x6c\xda\x01\xe8\x53\xba\x66\xe9\xdb\x98\x08\xb5\xae\xdd\x39\x7a\x1f\x66\xf5\x75\x28\xc4\x11\xf8\xf4\x73\xf4\xf6\xe1\x8e\xd9\xfe\xf1\xd9\x75\x29\xbe\xda\x18\xbc\x80\x2a\xe2\xa8\x2a\x20\x70\xa5\xef\xbc\xd2\x80\x03\x84\xfc\x84\xa8\x16\x52\xc8\xbc\x30\x20\xda\x8d\x5e\xa0\xd3\x88\xd3\xaa\x90\xfe\xe4\x7b\x11\x0f\x5c\x13\x9a\x53\x8a\xb2\xdd\x19\x71\xea\xf1\x72\x7e\x8a\x4c\xbf\xe6\x3d\x42\x33\xae\x05\x81\x50\x80\xb2\xb8\xf4\x81\x79\xef\xcf\x92\xa8\x64\xf2\xf9\x94\xbb\x9c\xaf\xf7\x4a\xf9\x44\x0e\xa7\xdd\xf4\xbb\x1c\x9e\x37\x9f\xdf\xfc\xc6\x47\xec\x54\x3d\x36\x55\x2c\xab\xc5\x86\x35\x57\x82\xf1\xb1\xb9\xed\xf9\x22\x99\x1e\xb9\x10\xbb\x0a\x44\x4f\x91\x2f\x83\x25\x2f\xba\xcc\x9b\x48\xf0\xc6\xcb\xd3\x61\xfd\xb0\xd7\xf7\xbb\x69\x93\xdf\xf9\xe9\xbe\x79\x38\x94\x8f\xe3\xce\xb9\x4b\xe4\x5c\x62\x2f\x32\x54\x83\xad\x8f\xda\x45\x71\xb1\x27\xde\x8e\x17\x0c\xd2\x6d\x6c\xe1\xa3\xd8\xb1\x28\x09\x68\xe8\xab\x33\xd3\xfe\x47\x67\xa6\x87\x7d\xe0\xac\x5c\x9b\xf5\x61\x5d\xf0\xe3\x61\xb8\x9c\xa9\x0a\x4c\x8c\xa2\xb8\x0c\xa0\x52\xed\x53\x24\xa6\x9d\x1a\x8d\xd5\xe3\x8e\xb9\xc9\x2d\xc3\xd5\x98\x29\x8e\x38\xf7\x53\x6b\xdd\xd4\x9f\xd9\x79\xd8\xae\xf5\x1c\xf4\x4c\xea\x28\x0b\x6c\x8c\x3f\x7f\x1b\x58\xee\xd1\xdb\xf7\x71\xb2\x2e\xd2\x9b\xad\xcb\x8b\xb4\xda\x16\xe0\x1d\xea\x8a\x38\xe4\xb5\xd7\x10\xa4\xa3\x3b\x8f\x00\x02\x88\xc9\x23\x8e\x89\x47\x05\x98\xb0\xad\xac\xc9\x4f\x1c\xf3\xc2\xe7\x04\x9c\x3c\x05\xbd\x9f\x7d\x8b\x1a\x56\xe8\x38\x8a\x2b\xba\x10\xaf\x20\x71\x3a\x9e\x3d\xea\x3d\x1e\x52\x97\x99\x19\x0c\xa7\xed\x3e\x97\x41\xb3\x54\x85\xd1\xfd\x7e\xb7\x7f\xf6\x6a\xba\xd1\x26\xbe\x1c\xf6\x9f\x8a\x43\xc6\xfc\xec\x4f\x89\xb8\x9c\xeb\x58\xa8\xa5\x39\x55\x8b\x64\xb1\x13\x97\x39\xc9\x67\x7f\x46\x31\xdf\x29\x57\x16\x7e\x76\xbe\x59\xe3\x02\xe9\xdd\x68\x07\x80\xdc\x9c\xa7\x2e\xc4\x9c\xf6\x89\x1d\xd5\xce\x05\x8d\x80\xcd\x25\xed\x59\xfa\x78\xff\x3e\xda\x7f\x8a\x40\xf4\xf6\x18\x83\x1d\x24\xb0\x86\x78\xc9\x0f\xc3\xaf\x30\x2e\x9d\x1f\x7c\x6f\x80\x48\x38\x20\x43\xd3\xfb\x6e\xe7\x84\x2e\x8d\xf0\x27\x27\x99\x97\x93\x02\x39\x80\x7e\xf2\x2d\x05\x0c\x64\xeb\xf7\x09\xb9\xec\xee\xb4\xbe\xc3\xdb\x2b\xc3\x29\xba\xc5\xf0\xe0\x53\x04\x1e\xda\xf8\x5c\x25\xd1\x22\x00\x04\x27\xe6\xa1\x1f\x2a\x7f\xde\x82\xf4\x68\xd1\x89\xdd\xec\xa7\xd8\xa9\x3e\x83\xd3\xa5\x49\x4a\xcf\xfc\x6c\x41\x04\x5c\xa8\x8f\xad\xf3\x92\xdc\x70\xf4\xb7\xbf\xfe\xc3\xb8\x09\xdf\x4a\xef\x4c\xb5\x0e\x6d\xba\x09\xa8\x14\xf9\xa3\x02\x83\xe1\x35\x35\x89\x5c\x87\xb9\x5b\xc8\xcd\xb5\xd0\xaa\x76\xa4\xe1\x62\x80\xe8\x14\xb8\x71\x26\xca\x36\xdf\xa8\x57\xf9\xe0\xe9\xa0\x16\xc8\x0d\x67\x85\x90\x64\x89\x12\xe3\x16\xa4\x59\x56\xe7\x34\x6e\xd7\x15\xa5\x8f\xb3\xa3\xde\xeb\x2b\x6f\xe9\x73\x54\xde\x61\x53\x83\x68\xff\x4d\x0f\x13\xbc\x7f\x78\xf7\xe1\x19\x11\xff\xe1\x85\x4e\xf1\xac\x47\xfb\x01\x9c\x6d\x5e\x00\xbc\xf4\x31\x5d\xe0\x08\x35\xa8\x3d\x03\x27\x5f\xee\x14\x02\xb4\x26\xa0\xf0\x72\x93\xa2\x6d\x00\xf5\xe6\x5c\x40\x07\x44\x96\x41\x59\xe4\xd3\x5e\x17\x25\xf2\x27\xe6\xfb\xb8\xc3\xfe\x2c\x7c\xc6\x63\x2e\x54\xad\x84\x92\x6b\x94\xc6\xa8\x2a\x72\x5f\x53\x16\xea\xbe\x71\x79\xac\x0e\xfa\x8a\xde\xfc\xf7\xd1\x7f\xd8\xb0\x08\x57\x89\xc8\xcf\xef\x1e\x0e\xc7\xeb\x93\xeb\xb7\xd8\x60\x72\xcf\xf1\xda\x15\x09\xf0\xe1\x85\x23\x72\xff\x75\xf6\x9f\xbf\x3d\xfc\xd1\xda\x16\x66\x26\xcb\xcf\xd6\x13\xc4\x34\xcc\x4c\x9e\x9f\x97\x21\xc6\x0b\x42\x08\xf7\x7c\x9e\x43\xd1\xaa\xf1\x34\xee\x82\xc7\x6b\x06\x98\x86\xf0\x1c\x4c\x78\x9a\x4d\x6c\xd7\x9c\x21\x12\x80\x19\xec\x47\x74\x28\x35\x55\x99\xa0\x7a\x66\x25\xc6\x45\x09\xfd\x58\xfa\x29\x2e\xd2\x4c\x41\xe6\x5b\xe6\x29\x8d\x67\x09\x09\xd5\x9a\x19\x63\xba\xce\x18\x23\xc5\x30\x88\xf5\xfe\x27\x4f\xe8\xe8\x12\x74\xe5\x5d\xbe\x0b\xc6\x72\x5f\x83\x94\xda\xcd\x3b\xe4\xdd\x8f\x18\xa0\xa3\xfb\x75\x6c\xb4\xeb\x62\x5d\x99\xcb\xbc\x43\xdd\x79\x4d\x8f\x95\xd2\x3a\x17\x46\x2d\x3a\x41\x7a\xf2\x8d\xef\xf9\x0c\x20\x10\x4b\x27\x51\x69\x1c\xa3\x85\x6e\x36\xda\x67\xc8\x1b\x4c\xec\x8e\xe2\x60\x02\x36\xe9\xc6\x52\xda\x8a\x78\xfb\x8f\x77\xbc\xb9\x6f\x37\x45\xaa\xdb\xb1\x8d\x54\x77\x7f\xec\x8a\x51\x7b\xf8\xba\xa7\x4d\x41\xc1\xe0\x6b\x66\x15\xa3\xc4\x9e\xfd\x08\x54\xa9\x38\xd6\x79\xe6\x07\xef\x60\x53\x6b\x93\x37\x6a\x29\xb9\x79\x79\x41\x5e\xac\xaf\x80\x77\x2f\xd0\xde\x80\x13\xc4\x8e\x42\x30\xd2\x83\x29\x4b\x6a\x0c\x4f\x73\x42\xca\x73\x85\x58\x69\xea\x12\x21\x54\x68\xa6\xf2\x4c\x0a\x67\xd9\xed\x10\x82\xeb\x31\xfe\x72\xc8\x10\x8c\xd8\xa6\xbd\x00\xd4\x55\x13\xf1\xff\x1f\x7d\x89\xfe\xe3\x95\x3f\xfb\xe3\x89\xdd\xe8\xb3\xe0\x4f\x79\xf1\x7e\x7b\x08\xbd\x92\xcd\xf8\xe1\xe5\xd0\xfe\xd3\xc7\xf5\x7f\x8b\x6d\x32\xda\x3a\x2e\x17\x4b\x29\xc6\x19\xc2\x68\x61\x71\x2d\xe5\x82\xe3\x3c\x6e\xa4\x59\x27\x11\x2e\x28\xcd\x31\x63\xde\x02\xd9\x78\xb8\x64\xb1\x16\x7a\xc8\x26\xce\x09\xc9\x4a\x42\x7d\x9f\x03\x42\x89\xe7\x3b\x63\x70\xa9\x54\x59\x66\x32\xcb\xb9\xc2\x05\xf4\xa9\xa6\x24\x57\x35\xc6\xb9\xca\x32\xa7\x38\x97\x9a\xe0\xbc\x50\xb0\xc5\x65\x2e\xb3\xcc\x42\x03\x55\x01\x6f\xf3\x9d\x4b\xda\x1b\x4f\x78\xff\x27\x78\xc2\xa0\xdd\xa9\xe1\x29\x4a\xf0\xa5\x13\x42\x8a\x9c\x49\xbe\x66\x39\x7d\x75\x31\x49\x5b\x69\x55\x3a\x6f\x09\xcd\x5d\x5e\x00\xea\x4c\x38\x8f\x20\x32\x49\x74\x94\x07\xb5\xae\xb9\x6f\xef\xb2\xf3\x5b\xa6\x63\x12\x58\x25\xc5\x65\x4c\xb2\xea\xbb\xaa\x92\xfc\x32\xec\x4f\x4d\xe3\x2a\x2f\xe7\x19\xd8\x6a\xab\x77\x4d\xbb\xe8\x98\x1e\xcc\x73\xcd\xe5\x4f\x56\x5c\x0e\x2d\x5d\xec\x45\xa3\x78\x8a\x95\xd5\x4e\x57\xcb\xc4\x89\x2b\x85\xaf\x39\x76\x25\x3b\x18\x63\x0a\x47\xc9\x20\x95\x22\xd2\x10\xad\x0b\xae\x89\x12\x9b\x8e\x14\x3e\xaa\x9d\xfc\xcf\x9e\x03\xbb\x3b\x4d\x7e\x5a\x3f\xb2\x14\x4d\x9d\xdb\x96\x5c\xa6\x24\x3f\x77\x17\x1c\x0c\xe3\x49\xe5\x11\xa1\x85\x2b\x0a\xd0\x54\x55\x00\x39\xa6\xf1\x3a\x27\xeb\x83\x8a\xfe\x61\x04\xaf\x9a\xd0\xff\x36\xfa\x4f\xd1\xff\xb9\xd5\xed\xb6\xaa\xc5\x9b\x87\xbf\x06\xc7\xcf\x7f\x12\x74\x1e\xc8\x24\xbf\x67\x28\xb1\x26\x16\xe0\xd9\xb3\xef\xc6\x60\x7d\xb7\x99\xd4\x21\x07\x4a\x0b\xf2\xea\x71\x72\xa6\xe8\xb3\x5c\x95\x08\xd4\x9e\xdc\xd4\x15\x41\x77\x89\x0a\xc8\x6a\xd0\xae\xe1\xd2\xb6\x25\x86\xf1\xa2\x2c\x28\x84\x97\x93\x05\xb0\xc8\x99\x21\x12\x42\x80\x11\xa2\x46\xb1\xa2\xf0\xa9\x9e\xa6\x03\x35\x4d\x63\xfc\x9c\x17\x38\xcb\x28\xc2\x8a\x09\x26\xa8\x04\xb2\x28\x84\xcb\x58\xc7\x58\x4b\x69\xed\x33\xca\x72\x9d\x61\xc0\x96\x29\xb6\xde\x64\x19\xa7\x9c\x20\x58\xe4\x9c\x70\x9e\x17\x3d\x0b\xf1\xeb\x3f\x88\xcb\x27\x1c\x3c\xda\xfe\xf5\x55\xc5\xe6\x3f\x46\xff\x6b\xf4\x9f\xa2\xff\x2b\x92\x57\xe5\xb2\xcf\x9b\x49\x42\xf8\x8e\xb7\x27\x1f\xde\xbd\x6c\xd7\x04\xf2\xdb\x8f\xbf\xfb\xe9\x43\xc0\xeb\x7f\x78\xf7\xf0\xe5\xc3\xbb\x7d\x70\xf6\xfb\xf2\x01\x5c\x9f\x27\x3f\x5a\xee\x6f\x9e\xcf\x09\xd2\x05\xaa\xb0\x2a\x11\x57\xa5\x2a\x60\x85\x25\x46\x5c\x0b\x21\x44\xe5\xb1\xc9\x73\x9e\x0b\x29\xa5\xac\x3c\x31\x29\xe4\x55\x62\xac\xcf\x6c\xac\xad\x5d\xb4\xb5\x49\xb6\x3e\x73\x3b\xa1\xe7\x13\x28\x4a\xef\x9e\x22\x7f\xf6\x35\x07\x78\xaa\x95\x02\xb9\xae\x47\x7d\x50\x90\x91\x54\x53\xa6\xa8\x71\x90\x92\x6c\xdd\x55\x52\x69\x25\x34\x8d\xa7\x22\xa7\xf9\xed\xc9\x98\x42\xea\xce\xeb\xdb\xcd\x5a\x6b\x5f\xad\x9f\xe2\x29\x12\xad\xc1\xd0\x41\x2d\x4a\x5b\x10\xd5\x3a\x26\xcc\xc6\x2d\xb5\x6b\x1e\x70\xc0\x77\xfd\xf9\x7f\xf1\xac\xa2\x74\xe7\xd8\x1f\xd8\xeb\x57\xae\xf6\xbb\x00\x77\xdb\xdf\x7e\x7e\xfe\x3d\xcd\xd7\x0f\x1f\x7f\xd0\x32\x09\x90\x5b\xb4\x4b\x3d\x89\x23\xe3\x8d\xf1\xd6\x80\xd9\x97\x06\xa4\x7e\x8e\xa3\x40\x83\xef\x00\xf1\x6d\x8c\xd7\xc7\x05\x77\xa6\x69\x04\x65\x08\x19\xaa\xf8\x89\x77\x3b\x1a\xd4\xf9\x02\xde\xf4\xba\x1d\xb0\xe2\x7e\xa8\x3d\x05\x4d\x0d\x20\xf7\x27\x29\x25\x55\x4a\x9d\xac\x35\x54\x0a\xc5\x88\xc7\xa0\x6a\xac\x1c\x40\x3e\x5f\xb0\x10\x49\x37\x6b\x6f\x95\xb7\x7a\x1b\x43\xcd\x13\x3e\xd6\x07\xfc\xcc\x45\x79\x51\xd9\x7a\xe6\xa3\x7c\x7e\xe6\xa3\x6c\x1e\x84\x81\x5c\xff\xee\xc5\x06\xf1\x9a\x13\xfe\xf0\xea\xc4\xac\xa9\xbf\x52\x6a\xe2\x42\x5c\x4e\x71\x9a\xa5\x1e\x26\xad\xb9\x90\xa4\xf7\x69\x16\x23\x9f\x9f\x40\x4e\x7d\xdb\x59\x4f\x28\x70\xd2\x43\x00\x93\xfc\x32\x29\xad\x27\x2e\xc5\x01\xfb\x2e\x8c\x18\xf9\x28\x31\x89\x07\x50\x7a\xea\x73\x65\x54\x4d\x2a\x3d\xf9\x0e\x9a\xfc\x9c\x64\xb7\xd7\x44\x51\x74\x88\xcd\x13\xdd\xb7\x07\x11\xbd\x89\x3e\x06\xcd\xdb\x80\x8e\x0f\x1d\xe0\xab\xb2\x72\xc0\x8e\x7c\x7d\x7f\x97\xc1\xbd\x0d\x1d\xcc\x6f\x1f\xde\xbe\x3f\x5e\xa5\x81\x82\x32\xf0\xc7\xab\x16\xe4\xd6\x13\x3c\x7e\xfa\xfa\xee\xe1\x97\x4f\x87\xb7\xf7\x2d\xab\x9a\x08\xc1\xf2\x42\xe0\x42\xa4\x94\x13\x33\x82\x8a\xf0\x1c\xe6\xb0\xc8\xf3\x94\x16\x8c\x91\x8c\x65\x22\x6b\x1c\x2f\x8a\x66\x9e\x41\x94\xfb\xce\xcb\xbc\x09\x42\x95\xad\x84\x33\x50\x42\x92\x59\x17\x48\x21\x5f\xa3\x42\xe7\xe8\x20\x64\x99\xfb\x0a\x31\x52\x98\xba\xc8\x4b\x48\xe3\x62\x3d\x6b\x4d\x66\x32\x0e\x0a\x3f\x5b\xae\x5b\xcf\x49\xc1\x94\x2a\x72\xa1\x8c\x9f\xa1\xc2\xc8\x64\x39\xc8\x8d\xc2\xd8\x68\xc3\x30\xf5\x05\x64\xa4\xc4\x84\x89\x52\xb2\xe7\x79\xb4\x3e\xac\xf1\xe9\x3d\x06\xef\x7f\xba\x57\x0c\x08\x9c\xd9\x67\x8c\xfc\x26\x94\x74\x83\xc8\x5f\x31\x86\xcf\x00\xf9\xb7\x0f\xbf\x7c\xda\x7f\xfe\x72\x48\x6e\x33\xc3\xf5\xe7\x9e\x15\x39\x98\xdd\xa5\x71\x60\xcc\x72\xd0\x63\xdf\xaa\x32\x37\x79\x71\xf2\xa6\x9f\x28\x71\x8b\x75\x58\x80\xbc\xf6\xae\x46\x12\x15\x95\x3f\x21\x50\x31\x10\x49\xeb\xf5\x99\x07\x02\xd3\xf9\xec\xf5\xf6\xf3\xa0\x31\xf5\x67\x23\xe7\x12\xfa\x41\xa1\x13\xa3\x08\x97\xa6\xe6\x16\x2e\x86\xb1\x58\x15\x46\x54\x86\x96\x98\xb4\x85\x2e\x16\x48\xcd\xd0\x4b\x5f\xad\xb7\xbb\xdd\x40\xf2\xbb\xb8\x0e\x63\x5b\x47\xbf\x44\xff\x7d\xf4\x3f\x07\x67\xad\xb0\x4a\xbc\xd9\x7c\xbc\x7e\x73\xc7\xc6\x37\x6f\xd3\xb7\xd7\x83\xf7\x77\xf3\xb7\x0f\xc9\x55\xbf\xf6\x25\x68\xdb\x5a\x98\x7b\x89\x0a\x30\x5c\x72\x8e\x54\x65\xb4\xde\x6e\x58\xcc\x60\x26\x8c\x02\x73\x5e\x74\xce\xb4\x8e\x2a\x4a\xa8\x29\x09\x53\x58\xa5\xd6\xba\xee\x04\xa1\x16\xd4\x66\xb9\xef\x7d\x0b\x27\x63\x98\xd5\xf6\xa0\x19\xb7\x8b\x36\x95\x71\xce\x14\x94\xa8\x72\x5d\x5e\xa0\x13\xc8\x33\xdf\x50\x60\xc0\x18\x9f\x08\xf6\xb9\x73\xe6\x2c\x34\x71\x7e\x02\x85\xe5\xa2\xee\x7d\x8a\x7c\xef\x72\xca\x69\xd9\x9f\x31\x25\xbc\xd0\x0d\xc0\x68\x70\x24\xf8\x28\xc6\x71\xf5\xc4\x77\x7d\x3c\x46\xef\x6f\x2e\x8a\x5b\x6f\xeb\xb9\xdf\xfc\x69\x3d\x27\x6f\xbf\x7e\xfb\x70\x38\x26\xcc\xe6\x19\xc8\x74\x41\x31\x2b\x19\x57\x4c\xd2\x8e\x32\xe3\x08\xac\x8b\x22\x1e\x33\x82\x4d\xf6\x14\x15\x65\xa9\x31\x51\x54\x13\xa6\x3b\xe3\x2b\x21\x29\x8e\xe2\x78\x7e\x32\xfb\xfc\xa0\x6f\xef\x93\x7c\x8e\x93\x75\x28\xdd\x74\x0e\xff\xfc\xed\x87\x2f\x9f\xbf\xbe\x0d\xf7\x5d\x72\x32\x68\xc8\x24\xa5\x9a\x53\x4c\xb9\xe2\x4c\x60\xa4\x4c\xc1\x68\xc6\x50\x79\xd0\x85\x6f\x97\x93\xb7\x5c\x70\xeb\x04\xd5\x6a\x94\x1c\x14\xa0\xb4\xcd\x05\x4d\xa0\xf6\xfd\x1c\x45\x7f\x00\x2e\x60\xab\xaa\x68\x7f\x55\x05\xf8\xe5\xea\x5f\xf0\xbf\x07\x9f\xa0\xad\xce\xf7\xf9\xd6\x51\x0d\xb0\x89\x6d\x6e\xbe\x95\x2c\xdf\xfd\x9e\x99\xc4\x8d\xa5\x96\x5c\x11\x5a\xa1\x1c\x74\x5b\xef\xb6\x8e\xe6\xba\xe6\x1d\x06\x0c\x65\x81\x3d\x1f\x53\x93\x02\xe4\xcf\x74\x14\xb5\x80\x83\x9c\x8a\x61\x29\x62\xb5\x18\x13\xb4\x92\xb8\xaf\xe2\x82\x10\xcc\x73\x01\xa1\x27\x36\x26\x1b\xdb\xb6\x05\x4d\xe9\x8a\x44\xf8\x01\xd7\xc3\x59\x2e\x67\x3f\x7b\x4e\x00\xea\x4f\x15\x25\xbe\x8b\x23\x08\x5d\xd5\xd2\x7d\x85\x29\x26\xa4\xe6\x5a\x09\xe3\x5b\xab\x34\xc8\x86\x56\xd6\xa0\x04\xc2\xd7\x03\xac\x51\xe3\x05\xc6\x99\xcc\x8a\xbc\x8b\x91\x81\xd0\x22\xe4\x2b\x96\x63\xa3\x79\x49\x74\x23\xb0\x81\x65\x09\x09\x29\x61\x01\x09\x0f\x7e\xf4\xdd\x13\x3d\xba\x83\xbe\xce\x92\x22\xfa\xbf\xd7\xf9\xfe\x9a\x60\x5c\x7d\x8c\xaf\xc9\xc8\xfd\xa8\x0f\x57\xf1\x55\xaa\xb2\x1e\xfd\xcd\xc1\xab\xb7\xd2\xc7\x9b\xd5\xd5\x4f\x9f\x5f\x55\x56\xb7\xfb\x26\x49\x41\x04\x91\x2b\x21\xc8\x31\xac\x20\x02\xe9\x89\x0b\xc6\x0b\xa8\xab\x46\xb2\x2c\x97\x18\xc9\x2c\x6d\x47\xa8\xa5\xd4\x85\x11\x1e\x73\xce\xd8\x76\x98\xa3\xf5\x68\x9a\xad\x47\x95\x5a\x8f\x9e\xe2\x92\x22\x05\x69\x0c\xd7\x90\x95\x2e\x95\xcb\xd2\x6c\x28\x8a\xd4\xa5\xda\xf7\x92\xf6\x16\x53\xc3\xf6\x8e\xd3\x52\x2a\xa9\x90\xa0\x76\x92\x39\x24\x04\xf9\xee\x54\x40\x84\x4a\x5b\x23\x88\x08\x94\xba\x83\x99\x34\xe7\xdb\xd1\xb6\x2b\x20\xff\xf1\xe0\xc5\x72\x41\x84\xc8\x9b\x1e\x9f\xda\xd2\xd7\x28\xcd\x61\x85\x7a\x51\x32\x20\xd0\x60\x49\x7d\x9d\x7f\x68\x98\x7f\xfe\x26\xcc\x40\xff\x29\x8a\x40\x7c\x67\x9f\x7c\x23\xc5\xdf\xcd\x42\x5f\x0e\xc7\xe4\xcd\xd7\x6f\x1f\x7f\x7f\xfe\xd9\xce\xf7\xfe\xeb\xb7\xdf\xe4\x8d\xef\x0f\x49\x97\x1a\x63\xc0\x98\x15\x16\xe6\x60\xbc\xa0\xda\x68\xcd\x09\x41\xc8\xa0\x12\x53\x04\xb8\x33\x8d\x26\x92\x30\x62\x10\xe3\x1a\xcb\x49\x73\xce\xcd\xf9\x29\x9a\x4e\x58\x49\xb2\xce\x44\xad\x57\xb0\xb2\xc6\x16\xa3\x35\x32\x6e\x7c\xee\x0d\x03\x0e\x8c\xf1\x80\x10\xc4\xc4\x76\xd6\x9a\x82\x60\x59\x22\x3f\xce\x86\x81\xd6\x4f\xa2\x59\xa7\xaa\x5e\x18\xe6\x9e\x22\x90\x6a\x21\x4d\x7b\x99\xd3\x8c\x0b\xe4\x87\xba\x80\xaa\x74\x1d\x2e\x4b\x02\x35\xd3\x79\xaa\x75\x0f\x83\x97\xf8\x21\x3e\x3d\xc9\xa3\x0d\xf9\x4d\xf9\xcc\x11\xff\x5d\xf4\xea\xfe\xfd\xfe\x47\xbe\xfc\x0b\x95\xef\x2a\xb2\x5b\xfc\x08\x09\x8f\xcf\x20\x0d\x4a\xf8\xd0\x0f\xd6\x77\xd6\xcf\xc9\x19\x7b\x11\x6c\x88\x6a\xcf\x42\xcd\x21\x7d\x2c\x63\x18\x0c\x1c\x09\x68\x97\x39\x4e\x3d\x87\x60\xf0\x7d\x10\x1e\x6a\x41\xb6\x94\xb7\xbd\x43\xba\x86\x18\x86\x31\x21\x84\x46\x54\x93\x65\x60\x86\x1a\x43\x0d\x8b\x21\xd1\x24\xd3\x4b\xcd\x39\xf7\x27\x21\xc4\x7a\xdd\x87\x10\x97\xbb\x6b\x2c\x49\x5e\x31\x95\xdf\x3d\xdc\xc3\xf8\xdf\x3c\x7c\x3d\xde\x3a\xf1\xaf\x34\x86\xdf\x1f\x7f\x4e\x0e\xc7\x77\xa1\x0f\x77\x43\xf9\x3f\xfc\xf2\x69\x27\x5c\x9a\x83\x71\xc9\x82\x2a\x90\x4b\x99\x82\x2c\xe7\x10\xe6\xe9\x45\x82\xa8\x30\xa1\x07\xc0\xfc\x8c\xf2\x38\xf7\x14\x96\x04\xaa\x92\x8a\x5a\x7a\x67\x99\x03\x51\xd1\xd5\x84\x30\x0c\xa0\xf1\x12\xf4\x59\x71\x70\x05\x82\x3e\x27\x92\xf6\x62\xcd\x6d\x71\xc2\x71\x4b\x48\x43\xc8\x52\x31\x6e\x82\x9e\x1f\x45\x0c\x6b\x07\xa4\xa0\xb5\x90\x1c\x93\xbe\xc8\x2d\x16\x86\x6c\x98\x0a\x30\x5d\xfd\xd1\xff\x69\xc0\xdb\xfd\xcb\x17\x86\xff\xe7\x37\x1f\xae\x85\xf3\x17\xf7\xe1\x0f\xc1\x88\xfd\xc3\x9b\x87\xaf\x1b\x23\x3d\x54\xbc\x1e\xd6\xd7\x6e\x6d\xc7\x44\xd9\x1c\x02\x88\xcb\xa1\xa2\xed\xc4\xd3\x2c\xb5\xa9\xf1\xce\xcf\x36\xe5\x01\x5b\x43\x06\x50\x10\x7c\xc2\x8c\xbb\x8c\xe7\xa9\x06\x59\x9a\x59\x85\x72\x95\xc3\x83\x2a\x38\x35\x86\x2f\x9d\x87\x79\x91\xc3\x4c\xc2\x4e\x10\x1a\xa7\x9e\xf9\x59\x9e\x01\x8d\xb1\xd0\x9a\x89\x76\xc9\x6c\xd3\x58\x80\x97\xc1\x54\xb0\x36\xd1\x2e\x36\x4f\x78\xaf\x0e\x2a\x28\xa8\xbe\x09\x3c\x97\xab\x44\xe1\x4b\xe5\x2e\x79\xbe\x67\x7f\xba\x67\x8f\x7e\xbb\x02\xe0\x92\x71\xcd\xde\xa3\xa5\xab\x60\x79\x13\xae\x1a\x40\x16\x1c\xcd\x41\xe6\x79\x0a\x18\x55\x98\x15\x9c\x14\x45\x3a\x14\x95\x6a\x32\x7b\x50\x05\xc5\x8b\x8d\x25\xf3\x8d\xf4\x4e\x7a\x4a\x4a\x48\xb8\x25\xa5\x17\x2e\xb7\x39\xee\xfd\xdc\x88\x0a\x74\x1b\x17\x0c\x0c\xc7\xfa\x20\x9e\xeb\xfe\x7f\x79\x45\x11\x7f\x79\xc6\x26\x3c\xdc\x70\x09\xcf\x9c\xf7\x0d\x3f\x70\x7d\x5c\x57\xaf\xfd\x7d\x73\x17\xed\x98\x2f\x0b\xe0\x2e\x0c\x88\xc2\xe7\x73\x70\x73\xbc\x6e\x1e\xea\xc1\x0f\x0c\x64\x20\xd7\x67\xdf\x32\x00\x41\x6a\xfc\xec\x6b\x06\xca\x5d\x39\x75\xa2\x1d\xfd\xa8\xaa\x91\xf7\x07\x61\xc9\x42\xe3\x86\xf8\x33\x99\xf1\x4c\xe2\x96\x9c\xb4\x16\x35\xe9\xc3\xe3\xd9\x68\x99\x61\x26\x58\x29\x18\x2d\xd5\xa6\x7f\x33\x3c\x0d\x87\x26\x29\x37\x9f\xe8\xdf\x71\x10\xf8\xf6\x21\x19\x00\x34\xeb\x49\xac\x0c\xe7\xc2\xac\x21\x00\x9b\xe2\xda\x5a\x5d\x72\xa5\x05\xf5\x06\x54\x2d\xd3\xba\x0b\x7a\x9f\xdd\x53\x7d\x28\x93\x0d\x5f\xfd\x4f\x5e\xa9\x2d\xff\x1d\x08\xf4\xde\xbf\x00\xb7\x14\xec\xdd\xa1\x24\x04\xe2\x82\x14\x85\x9f\x33\x2e\xb9\xb9\xb9\x1f\x26\x7c\x89\x28\xcd\x4d\x8e\x4c\xe7\xa4\x03\x0c\xb0\x59\x79\xa7\xca\x2b\xb6\x34\xce\x43\xae\xfd\x8f\x9f\x63\xe8\x57\x4e\xe3\xaf\x9d\xf1\x82\xd6\xf0\x87\x1f\x3c\x9b\x6f\x99\xc6\x5d\x32\xd8\x80\xcc\x05\x47\x56\xec\x9b\xec\xe4\xb8\xab\xc5\x7a\xd2\x4b\x3f\x82\xd2\x9f\x93\x3c\x61\x7d\x86\x28\x4a\x4d\xce\x9d\xa5\xa6\x9c\x58\x8b\x7a\x17\xc0\x1f\xd7\x6d\x3f\x3a\x67\x6a\x4b\xb8\x30\x8a\x77\xda\xd4\xbd\xad\x41\xb4\xa0\x06\x66\x48\x94\x8e\x60\xd6\xfb\x59\x28\xd2\xc4\x29\xf1\x33\xf5\x13\x8d\x62\x50\x3d\x95\x47\x1e\xd3\xe8\x2f\x82\x72\xd3\x4b\x84\xf3\x0c\x4d\x7e\x71\x3a\x38\x26\x83\x2d\x93\xcc\x9f\xb1\x18\x67\xe1\xcf\xd3\xbc\x4c\x14\xd8\x79\x68\x08\xf6\x0d\xa8\x11\x28\x24\xf6\x02\xc7\x34\xd7\x66\xcd\x3e\x14\x27\x06\xd9\x8c\xe1\x82\x52\x43\xbc\x26\xeb\x94\x18\x81\xa8\x8b\xc5\x0e\x1e\x68\xd0\xb4\xdf\x00\x8d\xc7\x9b\xa0\xec\x4d\x8b\xf5\xdb\x87\x3b\xa1\x8b\x1d\xf4\xaa\x04\xfc\x94\x81\xe8\x24\x39\x97\x8a\xb4\xa4\x42\xa7\x39\xe3\x08\x0a\x4e\x9a\xb8\xbb\x34\x07\x6a\x98\x96\xa6\x24\x4a\xd0\x2a\x57\x99\x34\xb2\x84\x4c\xa8\x05\x9a\x64\x8a\x8e\xf1\xe9\x89\x1f\xab\x03\x89\x8e\x57\x1f\x90\xbf\xbb\xaa\xba\x5f\x1b\x89\x9b\x99\xda\xd6\x56\xdd\x5c\xeb\x6f\xc2\x34\x5b\xf8\x92\x6c\x64\xe8\x1f\x1d\xc0\xef\xee\xa1\x23\xbb\x88\xc4\x3d\xf6\x40\x9b\x2c\x03\x93\x9f\x01\xf5\x86\xfb\x89\xf5\xdc\x8f\x80\x3b\x58\x4a\x09\xea\x4a\x33\xe3\x44\x30\x01\x19\x5d\xa9\x6c\x99\xda\x54\x9c\x7b\x15\x0f\x8a\x18\xa2\x96\xc8\x14\xd2\xa8\x03\xb1\x97\x93\xdd\x31\x87\x8a\x5c\xc9\x42\xb5\x4a\x13\xa1\x2c\x41\x4c\x78\x8d\xa9\xe4\xd8\xbb\xf5\x3c\xf0\xd2\xab\xbc\x40\x06\xb5\x9c\x50\x50\xd9\x9a\x56\xb6\x2c\x86\x8e\xb4\x61\x5d\x65\x4f\x64\x5f\x1e\xee\xb5\x25\xfe\xeb\x2b\xd2\xe2\x9a\x9b\x83\x97\x9f\x9f\xdf\xbd\xca\x84\xff\x00\x8e\xeb\xec\x1c\x9f\x63\xb2\xb4\x5a\x88\x41\xfa\x36\x3c\x16\xad\x01\x05\x53\x98\xe6\x94\xc2\x3c\xab\x32\xdb\x08\x50\x64\xcd\x01\x5e\x66\xd0\x75\x5d\xe7\xd3\xf5\x21\x32\x66\x19\xcf\xb9\xc9\x29\x68\x9f\x22\x3f\x28\xd1\x02\x1d\x45\x49\xac\x9e\xe8\xbe\x0e\x75\xbc\x3f\x8b\x8a\x67\xd5\xa9\xa0\x3c\xb5\x5e\x80\xfd\x15\xbd\xb3\x99\x75\x7f\x7d\xf3\x25\x9e\x0d\xb5\xd4\x2c\x5d\x1a\xe3\xa5\x03\x13\x2a\x05\xb3\xd2\x9e\x74\xbb\x9f\xbc\x03\xb3\x4f\x81\xf0\x99\xb6\x7c\x19\x11\x66\x5a\xf2\x38\xa5\xfe\xe4\x47\x3e\x82\x7c\x0c\xeb\x6f\x79\x8d\x2d\x36\x5e\xcc\xab\x77\x7c\x56\xb9\x7f\xf3\xf0\xee\x3e\x94\xfa\xf9\x63\xb0\xa1\x0a\x42\x88\x57\xbd\xeb\x44\xb9\x73\x35\x39\xaf\xc1\xf9\xd1\x81\xc1\xab\xa4\xf5\x4c\x49\xac\x0d\x33\x05\xf4\xc8\xe7\x08\x64\x20\x9b\x1d\xb0\xd6\xab\x79\x06\x06\xe4\x07\xec\x83\x2f\x05\x48\xbd\xb0\xd6\x5a\x4f\x3d\x1c\xd3\x9c\xd2\xba\xa3\x94\xd0\xc2\x66\xf9\x2c\x62\xcc\xb9\x6f\xae\xd8\x84\x7d\x12\x3d\x95\x61\x6e\xd9\x90\xb3\xff\x66\x53\x9d\xf8\xfa\x6c\x7e\x77\xe3\xff\xdd\x2c\xa8\x1f\x82\xd2\xcb\x5d\x29\x62\xcb\x52\x3e\xfc\xe8\xdd\xb3\xbf\xf2\xe2\x28\x30\x6b\x18\x9c\x83\xc1\x67\x79\x11\x73\x3f\xe9\x86\x9d\xeb\x41\x4f\xd2\xca\x1e\x94\x05\xf4\x55\xc2\x34\x63\x92\x2f\x86\x63\x53\xf2\x1c\xe4\xd8\x95\x71\xd6\x94\xa4\xa9\xb8\xee\x2b\xdf\x91\xc9\xfa\x11\xa3\x21\x8e\x28\x7a\x8a\x10\x94\xfb\xdc\x9d\xf2\xd6\x1a\x8a\x8d\x40\x95\xe8\x5b\xa3\x98\x34\xb9\x02\x3d\x55\x44\x10\xc6\x25\x95\xfc\x12\x35\x59\x65\x6b\x49\x88\xa1\x6c\x9d\x17\xb8\x90\x62\xa4\x96\x61\x18\x1d\x12\x1a\x7c\x1e\x74\xf4\x8f\xee\x34\xde\x7f\x54\x31\x7c\x55\x78\xfb\xad\x46\xe5\x5e\x94\x05\x38\xb9\xcb\xec\x40\x9b\xc3\xd8\x3a\x3f\xaf\xff\x40\xe5\x3c\x0f\x84\xf5\x0a\xa4\x0b\xbb\xed\x1d\x34\x15\xde\x8e\x23\x90\xa4\x5c\xea\x8b\x2b\xbd\x01\x8a\x24\xaa\xef\x7d\xd3\x75\xdd\x72\x5e\x2f\xc9\x21\xea\x62\x72\xcc\x0e\x2c\xa0\x5b\xf2\x67\x0f\xa1\x2b\x34\xee\xc3\xf5\xe7\xfe\xf3\xbb\x6c\xff\xe9\x5f\x81\x6f\x1f\x6f\x3b\xf7\x49\xcf\x31\x72\xde\xb8\xca\x79\x53\xed\xb8\xf5\x92\xb7\x55\x7a\x69\x8d\x57\xeb\xce\x2e\x97\x42\x30\xbd\x40\x21\x05\xd7\x07\xb6\xa0\x18\x2f\x6d\x3c\xdc\x7e\x9e\x07\xcf\x2a\x41\xa6\x53\x77\xdb\xf1\x3d\x11\x42\x08\x82\xa9\x08\xc5\xdf\x24\x46\x31\x3d\xae\x31\xcb\x7a\xd6\xfe\x9b\x28\x02\x61\x29\xda\x32\xb3\xb0\xf3\xfe\xaf\x40\x98\xd0\xb7\xb4\x3b\xac\x3d\x9b\x71\xd0\xdb\x35\xc4\xdc\x0d\x0e\xcc\xb0\xb4\xb0\xf0\xcd\x1a\x9a\x70\x64\x38\xf4\x7d\x53\xf5\xac\xd1\x46\x95\xb8\xd1\xa3\x03\xc8\xf7\x03\xd7\x0a\xef\xcf\xc6\x28\x4a\x61\x59\x36\xaa\x16\x45\x96\xa5\x26\xe3\x0c\x99\x02\xf3\xda\xcf\x27\x3e\x02\x08\x72\xdf\x37\x6b\x9e\xc5\xc4\xa6\x4f\x20\x63\x7c\x34\x87\x32\xfa\xf3\xa0\xd7\xf7\xd7\x1b\x1b\xe3\xed\x7a\x19\xbf\x3e\x5b\x8d\x7e\xfd\xf6\xe6\xc3\xfe\xde\x67\x14\x3c\xdc\x97\x24\x7e\x49\x36\x36\x86\x49\x2a\x89\x51\x6e\x9c\xef\xbd\xcb\x19\x31\xa0\xb8\x95\xe2\xfb\xda\x9b\xb8\x49\x22\x38\xe8\x86\xb5\x4e\x4d\xdc\xf4\x96\x95\x03\xd6\x06\x1e\x4a\xbb\x0c\x59\xaa\x0a\x2b\x4b\x64\xd3\x2c\x36\x6a\x5d\xcf\xd7\xd9\x93\xc5\xa5\xb7\x67\x49\x2a\xea\x14\xb3\xd0\x74\x20\xeb\x6d\xd5\xad\xb1\xc9\xbc\xc6\x26\xbb\x61\xd3\x4a\xfc\xb1\x42\x14\xaa\x17\xfb\xc2\x9e\xcf\x4e\x08\x42\x2d\x15\xb2\x66\xfd\xbc\x1b\x26\xad\xda\xc6\x56\x7a\x69\x63\x35\xd7\x12\xa4\x80\xe8\xed\xde\xce\x43\x2e\xb0\xd5\x57\x37\xb5\x82\x2b\x5a\xea\xcd\xc3\x7e\x9d\x8d\x82\x14\xef\xed\x96\x7e\x86\x3d\xec\x02\xbe\x49\x03\xe1\x9d\xe7\x2e\x49\x69\xff\xa8\x92\x0c\xe5\x4b\x06\xa0\xaa\x9e\x22\xd6\xc7\xb8\x6d\x54\xd5\x1f\xf0\xd2\x6b\x80\xf2\xa5\x97\x78\xb0\x56\x3a\x5f\xf0\xc9\x5a\x79\x32\x9d\x6e\xdb\x28\x06\xe4\x49\xed\xfa\x5d\x19\xe2\xc5\x1b\xa3\xf8\xdd\xfd\x4c\xf1\xcb\xb6\xf8\xae\x1f\x20\xcc\x17\xa0\x4f\x22\xdf\x14\x05\xb0\xd2\x31\xc2\x88\x6c\xfd\x80\xa6\x5a\x6a\x52\x76\x33\xcc\xfd\x19\x68\x43\xfd\x88\xd0\xae\xd4\x82\xd9\x73\x85\x89\x22\xd4\x71\x43\x34\xa6\xc6\x58\xce\x17\x65\x6b\xc5\x02\xd6\x15\x1f\xab\x04\x05\x24\xd1\x7f\xb7\x31\xb4\x6f\xb5\x85\xf8\x35\xd5\xe1\xc3\xfe\xfd\xfa\xe6\x21\x16\xf9\xe9\xf5\xb1\x7b\x25\xf6\x3f\xee\x52\x10\xc1\xc2\xe6\x05\x98\x1d\x96\x4a\x5a\x26\xda\x33\x9d\xac\xb6\xf2\x04\xb2\x4e\xa0\xa7\x08\x5e\x84\x43\xc0\x59\x2a\x05\xe3\xb6\x19\xe9\xc9\x68\x47\xca\x1e\x64\x45\x23\x89\x1f\x51\x29\x62\xc9\x79\x41\xa9\x7d\x8a\x34\xa1\x82\x52\x8b\x0c\xe2\x8c\x4c\x9d\x94\x9d\x00\x6d\x66\x65\xe6\x7b\x86\x89\xa6\xd4\x11\x57\x72\x42\x8c\xb2\x74\x99\x75\x2d\x29\x8a\x92\x48\xc6\xf6\x68\x0f\x26\xfa\x43\x54\x04\x34\x49\xf0\xb6\x0b\x44\x23\xf0\x1b\x41\x8d\x17\x60\x02\x90\x94\x53\x40\x6c\x45\x4d\x05\x54\x7c\x0e\xba\xb7\x4c\x59\x5d\x18\x0b\x8b\x25\x03\xb9\x24\xb6\x94\x3b\x43\xca\x6a\x04\x11\x72\x6e\x11\x09\xa9\x2a\xe7\xa1\x62\x99\xcb\x0a\x0c\x1a\xaa\x2c\x35\xc1\xbf\xa5\x4e\xf0\x91\x1f\x44\xc0\xe4\x04\xeb\xd7\xcd\xda\xe9\x79\x75\x4b\xab\x38\xaa\xc0\xb9\x5a\x64\x92\xff\x4a\x92\x68\xe1\x87\x74\x04\xd8\x77\xa3\x37\xad\x73\x6d\x14\xc5\x49\x1b\xb5\x47\x77\x20\xd1\x5f\x84\x55\xf9\x7d\x72\x77\x5d\x6e\x71\xe0\xb5\x5a\xb7\x9e\xfb\x7d\x51\xe1\x38\xb7\xc4\x58\x6d\x84\xee\xfc\x99\x82\xc2\xda\x9a\x94\xa7\x33\xec\x64\xe9\xe7\xb2\x14\x07\x52\x3c\x45\xce\xcb\x93\xd4\x5c\x89\x13\x31\xb4\x92\xa2\x3b\x39\x7b\x99\x1a\x80\xdb\x8a\x04\x6f\xf4\x2a\x66\x47\xbe\xbb\x8f\x51\xb6\xbe\x4b\xf4\xf6\x87\x1e\xc2\xb7\x1f\x9e\x57\x49\x79\x39\x69\x21\x46\xa9\xe4\x29\xc1\x97\xce\x84\x7d\xb1\x83\xc1\x2d\x60\x1c\x47\x75\xdb\x59\x73\x26\xfd\x44\x0e\xc3\x3e\x0a\x77\xdd\x2f\xd1\x7f\xf5\x5a\x0f\xe6\x4f\x4b\x55\xfd\xfc\x2c\x55\xf5\x97\xf1\xc3\x97\x3b\x41\xfa\xd7\xac\x45\xa7\x4a\x50\x64\xc8\x95\x19\x18\x97\x79\xc3\xc3\xfb\x28\x66\xdf\x3b\x4e\x19\x10\xe0\xec\x6d\x01\x37\x61\xbd\x24\xb2\x8f\xd2\x5d\x39\xe5\xe0\xfc\x28\x6f\x7b\x3e\xdb\x47\x84\x94\x30\x2f\xb1\x22\x92\x48\xaa\x80\xc1\x50\x9e\x04\x29\xf2\xac\x25\x44\x52\xfa\x14\x2d\x5d\x59\xc6\xf8\x44\xe9\x1a\xbe\x53\xba\xf5\x76\xdd\x13\x3e\x46\x3b\x1e\xd6\xa6\xcf\x3f\x6a\x79\xbe\x79\xe6\x67\x6d\xc0\xd4\xc3\xa6\xe9\xbd\xce\x60\x6f\xee\xb1\x7b\xfb\xc0\x4c\x8c\x9d\x3d\x59\x5f\x27\xd8\x37\xb6\x73\xae\xb3\x80\x5e\xda\x14\x30\x3b\x22\xa1\xea\x35\x8e\x93\x5c\xa6\x5a\x4a\xa9\x01\xd4\xbc\xd1\xf5\x0e\xfb\x33\x48\xbd\x12\x02\x18\x3f\x03\xf4\x7d\x04\x95\x97\x71\xc6\x20\x5a\xce\xc0\xce\x35\x07\x08\xb4\xc0\x12\xa6\x38\x76\x84\x1b\x49\x27\xe6\xa7\xa7\x48\xcc\x6b\x2e\x55\x3f\xd1\xa3\xd8\xc3\xe0\x7d\xb7\x79\xcd\xfe\x49\xed\xb0\x0f\xbf\x07\x10\x78\xbe\x4a\x2f\x17\x69\x63\x97\xc8\x35\x0c\x4f\x73\xe8\x50\x11\x47\xcb\xf9\xe6\x3a\x1d\xd3\x29\x68\xd1\xe8\x40\x6e\xc7\x8f\x6c\x57\x5f\x58\x59\x2a\x50\xc4\x91\xb7\xf0\xea\xd7\xa2\x25\xe7\x5c\xee\x53\x94\x67\xb0\x40\x25\x36\x4c\x31\xc5\x8c\x30\xcd\x46\x61\x77\x46\x80\x0e\x41\xd6\x52\x56\x16\x3d\x63\x8a\x31\x1f\x61\x2a\x19\x89\xa2\x23\x10\x4f\xfc\x88\x77\xfc\xc7\x11\xfd\x9c\x6b\xdc\x10\xb2\xd7\x11\xfd\xf1\xfa\xf3\x98\x7f\x9f\xf6\xf8\x3b\x04\x2e\x49\x2f\xb3\x05\x93\xcf\x01\x05\xa3\x2f\x4c\xdf\x2f\xf9\x75\x67\xc7\xcd\x25\x33\xfb\x68\xf4\x4a\x1b\xdf\x78\xa3\xb4\x5e\x1f\xa2\x28\x06\x10\x34\x87\xf9\x60\xa3\x7f\x14\xe2\xdc\x50\xb7\xb8\x42\xf8\xbf\xbe\xbd\xf9\x5c\x3c\xdc\x7c\x2e\xbe\x1c\x3e\x7c\x2a\x3e\x86\x6e\xf0\xbd\x21\x46\xd2\x36\x79\x11\x9f\xaa\x47\x59\xc5\xb4\xac\xac\x3d\xd1\xce\xf8\xb6\xcd\x0b\x89\x21\xad\x9a\x02\x54\xa0\x22\xcd\xc0\x51\xa1\xf3\xa2\xf3\xba\x6b\xca\xf6\x60\x61\x59\x3e\xb6\x49\x7b\x21\x3b\xa2\x2e\xea\x34\x55\x5c\x52\x63\x20\x24\x84\x36\xa9\x2a\x55\x9e\xb5\x5b\xd3\x86\x4a\xa5\xa2\x68\x7f\xf7\x59\x37\x6e\x31\xfa\xf1\x13\xdf\x74\xb1\x9f\x95\xfc\x7e\x10\xa5\x0d\x46\x5a\xf7\x9f\xd5\x13\xd0\x55\xeb\x3d\x56\xe9\x51\x8c\xc2\x77\x09\x51\x84\x08\xba\xf4\x04\x69\x48\xe2\xc6\x68\x29\xdd\xeb\x8f\xba\xd4\xa0\xf0\xa3\xf1\x15\x80\xad\x96\x5a\x03\x47\x04\x66\x84\xd2\x75\xf3\x8e\xaf\xbf\x0b\x31\x0c\x28\x9f\xf0\xa1\x4b\xdc\xb5\xae\xf0\x73\x40\x21\xfc\xb6\xba\xf0\xda\xad\xf1\x1e\x1a\xf9\xe5\xe1\xd0\x31\xc6\x0c\xb4\x1c\x79\x52\x28\x53\xd9\x50\x7d\xac\x3d\x0b\x30\x6b\x6b\x43\xf2\x9f\xf9\x73\xe2\x2e\x46\x88\xd4\x65\x42\xf7\x2d\x05\x29\x28\xc1\xc9\x0f\x95\x2f\x2b\x0e\xc6\x4b\x45\x54\x62\x7d\xdb\xf9\xa8\x0d\xf7\x7e\xfb\x84\x0f\xed\x8e\x46\xef\x9e\x63\xe6\xd7\xd0\x86\x67\xab\xac\xd7\xbe\x5e\x6f\xaf\x63\xf0\xd0\x32\xc6\x74\x61\x68\xf9\x38\x75\x56\x50\x80\x40\x1e\xb0\x77\xc0\x5e\x24\x90\x7e\x4a\xe3\x61\x81\x1a\x0c\x1e\xee\xe8\x63\xb3\x69\x7c\x26\x95\x87\x5e\xfb\x9e\x35\xa0\x38\xc5\xc5\x53\x44\xa9\x12\x5a\x8b\x00\x7d\x35\xdb\xf9\xca\x9f\xf0\xa1\x4f\xc6\xeb\xf9\xda\xe6\xdc\xff\xdc\xf9\x0a\x72\x2c\xdb\x4d\x7c\xe8\x19\xe3\xb6\x70\xac\xf4\x65\xa1\x6c\xfd\xac\x4a\xea\x4f\x5e\x38\xe0\x9e\x22\x10\x25\xe3\x85\x08\x99\xb9\x4c\x9a\xa9\x65\x20\x03\x04\x9c\x7d\xd7\xf8\xbc\x91\x71\x7e\xa9\x54\x32\x78\x3b\x4d\x66\x9d\xff\xf7\xd1\x08\xa6\x63\x7e\x87\x7f\xf9\xfa\xa7\x11\x30\x57\x9b\xca\x87\x4f\x5f\xff\x1e\xdc\x38\x53\xa1\x72\x19\xed\x7f\xfe\xf8\xcb\xa7\xc3\x89\x2e\xe6\x22\x51\x3c\xc7\xca\x48\xad\x8c\xc7\xa4\xb0\x05\xf6\x01\xb3\x82\x77\xec\xa4\x2d\x44\x8b\x5d\x6c\xde\x9e\x58\xdb\x15\x20\x6b\xac\xe9\xa6\xc6\x48\xe3\x8d\x17\x31\x04\x45\x89\x0f\xc6\xca\xbc\x92\xa4\x61\x92\x53\x26\x90\x60\x99\x50\x48\x0b\xaf\xeb\x13\xc5\x98\x5b\x44\x61\x9e\x4a\xdd\xa3\x5a\x64\x39\x65\xdc\x9f\x55\x86\x31\x0e\xfc\xe0\xb8\x0c\xf1\xfe\x4f\xa1\x82\xb2\xad\xf8\x1f\xde\x7c\xb8\xda\x87\x6f\xfa\x3b\x37\x99\xfd\xab\x58\x7d\x54\x81\xc8\xb9\x36\xe3\x4a\x77\x59\x13\x47\x9e\xc7\x1a\xb4\x2e\x0c\x41\x75\xd1\x40\x7a\x72\xe0\x33\xc8\x1e\x4f\x40\x57\x15\x91\xf4\x64\x37\x70\x81\xf5\xc1\x4b\x34\xba\xe1\x7b\xf4\xce\x85\xb8\xf5\xf5\x52\x79\x78\x96\x7e\xdf\x3a\x11\x61\x5e\xd6\x97\x28\xe9\x2e\x78\xdd\xf6\xd1\xa3\x91\x1c\xd4\xa0\x2b\x89\x99\x9d\x93\x4b\xbb\x48\x58\x29\x8f\x81\xd8\x39\xab\xb4\xd1\xca\x36\x34\x45\x08\xb1\xaa\x65\x9a\xe4\x46\x34\x36\x49\x37\x8e\x6c\x1d\xbb\x63\x19\x6a\xb2\x7f\xb5\x7d\xe3\x37\x57\xb2\xc3\xc7\xab\xf1\xca\x2b\x95\x94\xeb\xfc\xaf\x9d\xeb\x7a\x02\xd2\x1e\xb4\x52\x9e\x95\x2b\x60\x0c\x4f\x4b\xc3\xe2\xb4\xf1\x18\x51\xc2\xc9\x12\xd1\xd2\x20\x7a\x50\x97\x02\x40\xc9\x1c\xd7\x39\x17\x2d\x80\x05\x25\xda\x17\xd6\x28\x20\x70\x89\x05\x01\xad\xa9\x71\x6d\x37\xec\xb0\x79\x52\x47\xb3\xb3\xd1\x9f\x85\x19\xfd\x87\xbb\x2a\xf9\xd1\x3d\x6f\x00\xbd\x0d\xd8\xea\xe8\x57\x1b\x8f\x1e\x55\xb1\xb4\xb1\x59\x54\x42\x7f\x8d\x92\x62\xb1\xc9\xb9\xaa\x82\x59\xf1\x32\x3b\x67\x3b\x6b\xbb\x0d\x9f\x8c\x0f\xe7\x5d\x11\xfd\x31\x70\x5c\xde\xef\xf6\x6b\x42\xf4\xf5\xcb\xe7\xec\x98\xad\xb1\xd8\xe1\xf8\xe9\xcd\xcf\xfb\x6d\xa6\x7c\xb9\xd7\x93\x9a\xfa\xc9\x8f\xae\x49\xab\x74\x69\x05\xa8\x48\x75\x62\x80\xad\x37\x41\x15\x37\x94\x52\x5b\xb8\x12\xed\x0a\xcb\x90\x67\x05\x2e\xd2\xb3\x1f\x53\x5f\xd6\x5a\x0d\x25\x64\xb1\xc9\xeb\x0b\xd9\xd1\x45\x32\x56\xb8\x02\xad\xf9\x0a\x10\x4f\x2c\xe0\xf7\x5e\x7c\xd7\xae\xca\xd2\x37\xfd\x90\x20\xfc\xf8\x27\xb2\xf1\x83\x5c\x7a\x76\x02\x50\xa4\x55\x56\x79\xe5\x07\xe7\x45\x15\x97\xd5\x72\x5a\xd7\xd8\xb8\x04\xf6\x52\xde\xf6\x92\x76\x49\x6d\x51\x90\xa6\x1c\x15\xa5\x27\x95\xc8\xbe\xf7\xa7\x2a\x18\x9f\x38\x17\xbc\x32\xc8\x93\x3a\xa2\x64\x8e\x8e\x01\x5d\x76\x57\xb5\x7b\x69\x7f\x6d\x02\x2b\x87\xe6\x11\xed\xe9\xf7\x7c\x57\x6b\xdb\x0e\x27\x31\x8c\x4f\x91\x1f\xe8\x7c\xee\x07\x7e\x1e\xba\x64\x76\x97\xda\xee\x74\x47\x9c\xd5\x56\xd7\xa6\x36\x5a\x38\xc5\xa5\x54\x36\x0a\x3c\x9f\xf2\x40\x93\x2c\x4a\xc2\xda\x1d\x5d\x85\xe1\xd7\xf3\xfe\x26\x78\x03\x6f\xe6\x11\x5e\x33\x50\x82\x73\x55\x25\xd9\xa5\x4c\x4e\xde\x7a\x73\xb6\x27\x90\x01\x7a\xb9\x8e\x93\xe0\xf9\x97\xd0\xab\xd6\xf7\xef\x24\x02\x37\x7d\xcc\x5d\x5f\x81\xc6\x53\xa6\x95\x28\xa4\x82\xf0\x92\x25\xe7\xc5\x6a\x56\x53\x95\xd0\xde\x79\xb4\x05\xfc\x25\x68\xdc\xe8\x3a\xd2\x55\x9b\x2e\x77\xf4\x44\x8e\x69\xd2\x5e\xb9\x53\xb7\x95\xf2\x01\x44\x71\x5b\xc5\xcd\x42\xab\x85\xc4\xc1\xa0\xc3\x2d\xa7\xb8\xdc\x30\xe6\xe3\x13\x39\xa8\xa4\x0e\xfe\x10\x0f\x5f\xbf\xbc\xbf\x6f\x5f\x7c\xfb\xfa\xe6\x2a\xd1\x0f\x64\x9c\x66\x55\x16\x73\xd5\x11\x0a\x05\xe3\x59\xe1\x91\x5d\x7a\x0e\xce\xc6\x07\x58\x65\xae\xc4\x62\xc6\xcc\x65\x58\x01\xb9\x74\xd6\x1a\xd0\xae\x6b\x11\x0f\xb8\xec\x31\xfa\x43\xf4\x37\x57\x55\x93\x3b\xc5\x85\x6b\x3a\xb7\xdb\xbf\x72\xa8\x8a\xc0\x96\x50\x6c\x3d\x9f\x38\x77\x84\x57\x8c\x53\x80\x62\x59\xc1\xd8\x8e\x0d\x48\x41\xca\x7c\x3f\x0f\x4f\x11\x9b\x9b\xc6\x94\xa5\x00\x29\xd0\x93\x5a\x46\x4c\x8c\x90\x9c\x0b\xb9\x1b\xd1\xa9\xbb\xc0\xb8\xd3\xa2\x02\x0a\x54\x50\x49\xb4\x4c\x4d\x4d\x9d\x6c\x3a\x5e\x51\xe7\x5a\x52\x4a\x00\x7d\x34\x03\xed\xe4\x00\x14\x15\x5a\x6d\xd8\x4a\xfe\x84\x0f\x22\xa9\x43\x8e\x1f\x66\x92\xc0\xd8\x7b\xb8\xf7\xfd\xcf\x2d\x21\x09\xf5\xa7\xc7\x13\x49\x26\x90\x5e\xc6\x34\xd3\xcc\x52\x6d\x6a\x0a\x86\xa4\x26\x92\xb9\xe5\xdc\xd4\x1a\xb8\x2c\xd5\x86\x19\xcd\x4a\x57\xdd\x34\x64\xdd\xce\x46\x69\xf4\xd3\x55\xa9\xf3\xef\x43\xdd\x63\x8b\x67\xde\xbf\x9a\x38\x6e\xca\xdf\x3f\x44\xb7\xfb\xbb\x20\x62\x1b\x2f\xe2\x18\x21\xa2\x50\xf1\x6b\xd5\xec\xcb\x65\x8a\xa7\x5f\x5d\x7c\x5e\x64\x73\x44\x7e\x00\xd1\x53\x84\x25\xc5\x39\x65\xf9\x32\xc4\xf0\xbb\x4d\x22\xb7\x19\x81\xfb\x2e\x1e\x58\xa9\x11\xdb\x59\xa9\x14\xa1\x94\x28\xa6\x14\xf3\x93\xe1\x66\xe0\x24\x35\x19\xee\x0c\xa7\xcb\x48\x49\x9c\xfb\xb6\xc3\x94\x93\x60\x95\x1c\x25\x91\x7d\x52\xc1\xa3\x67\xbd\xf7\x3e\xbd\x54\xbf\xde\xde\xb5\x62\xbf\x3c\x63\xc1\xdf\x5c\x99\x20\xef\x1e\x8e\xdc\x7d\x97\xae\xdb\x43\x6f\x40\xe7\x71\xcc\x7e\x85\x31\x09\x4d\x56\x13\x67\x20\x5d\x7f\xe7\xe7\xf5\xf9\xae\xf0\x12\x44\x7e\x5e\x97\x75\xa3\xbc\xd0\xd6\x6a\xe0\xd4\x22\x41\xa6\x40\xea\x67\x15\x78\x7f\xea\xa8\x92\x29\x7a\x1f\x6a\x17\xe1\xac\xfc\xf0\xd6\x6f\x3e\xbc\xd9\x04\xb0\x37\x67\x99\x23\x77\xbe\x0c\x3e\x4e\xea\xd7\x3c\xe6\xde\x02\xe5\xb1\x8b\xc7\x20\x17\x3f\x78\x03\x44\x32\x79\x35\x37\x3e\x6f\xad\x6d\xc1\xd4\xac\xef\x7f\x29\x00\x39\xad\x27\xeb\xb4\x8e\xe7\xea\x49\x1f\x65\x22\x5e\xf8\xb9\x1f\xaf\xcb\xe9\xa6\x6a\xf7\xe5\xe1\xc3\x33\xef\x68\xeb\x01\xec\x51\x8c\x7f\x45\x31\xf4\xd6\x1d\xa4\xf5\xd6\xfa\x0e\xe0\x05\xb3\xff\x87\xb2\xb7\x07\x92\x1c\xd9\xf3\xc3\x90\x40\x55\x35\x1e\xef\x78\x0f\xbd\xb3\xbd\x83\x13\xf9\xee\xb2\xaf\x77\xa6\x41\xde\x85\x2e\xf9\xe6\x66\x26\x19\x17\x77\x4c\x92\x22\x99\x0c\x2a\xa4\x8c\x90\x14\x4c\x4a\xa2\x94\x22\x43\x52\x4a\x32\x98\x86\x14\x91\x66\xca\x4b\x43\x46\x9a\x69\xc2\x84\x09\x13\x66\x99\x65\xc2\x84\x59\x66\x99\x30\xf1\xde\x34\xb2\x15\x48\x54\x75\xd7\xcc\xee\xe3\x47\xcf\x56\x57\x55\xf7\xce\x14\x3e\xf2\xe3\xff\xf1\xfb\x40\x75\xc5\x37\x27\xcf\xb8\x95\x85\x73\xe9\xfe\x04\x4c\x70\xc3\x4c\x40\xef\x5a\xd4\xba\x0a\xed\x35\x75\xeb\xb5\x36\xcf\xec\xc6\x65\x26\xb9\x89\xaa\x32\x2f\x7c\x9e\xeb\xce\x43\x24\xdd\xae\x6c\xdc\xef\x6e\x78\xfd\x5b\x5b\x67\x7d\x8d\xed\x11\xe7\x75\x6e\xc2\xe1\x68\x02\xaf\xc3\x14\x9c\x02\xf2\x98\x2d\x1f\x74\x04\x3a\x8c\x73\x0f\x4b\x62\xf1\x41\x10\x91\x8a\xd0\x84\x5a\x3a\x11\xbd\xeb\x01\x98\x9e\xf9\x4d\x95\xf2\xe8\x0f\xfa\xe1\x2e\x8a\x29\xde\x7d\xff\xc3\xfd\xaf\x3f\xff\x35\x88\x4c\xa7\x07\xf8\xfe\x23\x98\x6a\x30\x81\x86\x06\x32\x0f\x1a\xe0\xb6\xad\x71\xe1\xd1\x21\x94\x26\x1c\xdb\x94\x1f\x89\x76\x9a\x39\x54\xe5\xb9\xa8\x49\x38\x31\x2e\xd6\xf3\x91\xcf\xf8\xa6\xcc\x5c\xf2\x37\xa2\x03\x5c\x12\x6d\xcb\x3f\xfd\xe1\xca\x33\xbd\xfd\x3b\xe9\xed\xfd\x4e\x7f\xa1\xc5\xa0\xba\xed\x54\xcf\x53\x9a\x7f\xa1\x69\x31\x8f\x40\x84\xfa\x60\x5b\xe0\x80\x9b\x49\x5a\x2d\xd1\x5e\xf2\xfb\xa9\x7e\xa6\x37\x75\xac\x73\x5c\xb0\x99\x17\x45\xa2\xff\x2d\xf9\x3f\x93\x7f\xf7\x9f\x82\xcf\x3c\x63\x2d\xa2\x35\xc8\xfa\xea\x05\x46\xf0\xf0\xf1\x61\xfb\xf1\xe1\x2e\x3b\xab\x6f\x5f\x62\xd6\xb7\xbf\xfe\x2b\xf0\xb0\x36\x10\xdf\x7c\xf8\xf8\x70\xfb\xe1\xe3\xc3\x5d\xda\x6f\x64\x28\x52\xee\x02\x8e\x1e\xef\x38\x94\x2a\x82\x36\x31\x90\xc1\xcf\x2c\x0e\xfb\x48\xb1\x9a\x13\x6d\x06\xa3\x75\x33\x4d\xc7\xa3\x09\x03\x88\xe7\xd4\x6a\xd0\x0f\xcc\x18\x90\xe8\xf4\x48\x29\x16\xd0\x55\x53\x29\x95\x36\xe3\x38\x8e\x3b\x69\x59\x18\xda\x60\x81\xde\x03\xcc\xc2\x28\xa5\xa4\x52\x4a\x85\x31\x21\xaa\x25\xe1\xc0\x54\xd3\x28\x06\x30\x69\x29\xa5\xc1\x4a\x29\xc1\xf0\xe4\x28\x2b\x4c\x5e\xed\x87\x5a\xb5\x40\x03\x1d\x4e\x3e\x08\x4f\x92\xdf\x03\x53\xc4\xf9\x90\xe4\x17\x67\x37\xfc\x3f\x3d\x6b\x1f\xfc\xe3\xe4\x9f\xaf\x9e\x97\x31\x5d\xf8\xee\x0f\xc1\xdb\x9f\x01\x58\x2c\x31\xdd\x59\x78\xf3\xee\xfe\xe3\xd9\xa0\xef\x2b\xa1\xe0\x57\xc9\xe4\xed\x37\x71\xd0\x8d\xfb\xe2\x1b\x5b\x8f\x59\x1b\x54\x54\xf8\xe9\xbf\x9c\x40\x17\x33\x6d\xe5\xa2\x7d\x36\xaa\x04\xc4\x40\x81\xc4\x08\x8c\x39\x99\x3b\x4d\xa9\x62\x99\xa7\xc8\x20\xa2\x70\xe9\x0a\x7c\xa8\x0a\x9b\x57\x61\x02\xfb\x35\x19\x18\xbf\x88\x14\x06\xb2\x23\x76\x96\xf3\x10\x38\x03\x2d\x98\xd2\xa9\x0f\x84\x2b\xa6\x35\x53\x5c\x1d\x4b\xbc\x7c\xb1\xe3\xb1\xc4\x0c\x31\x34\x73\xaa\xa9\xa4\x4c\x28\xac\x39\x5e\xb5\x83\x19\xab\x38\x1b\x29\xd5\xca\xac\xda\x9c\x20\xe1\x89\x4e\xe1\x8e\x25\xb7\x17\x75\x9b\xbb\x0b\xa9\xfc\xf3\xed\x83\xf4\xd6\x39\x8c\xab\x66\xa0\x8d\xdf\xf8\xe5\x50\xec\x5c\x97\xd0\x1a\x59\xd3\xb4\x4d\x92\x5f\x64\x87\x04\x46\xbc\xfe\x2f\xaf\x46\xea\x5a\x9b\x79\xe1\xb2\x5e\xae\xcc\x45\xe3\x1d\xfc\xd4\xce\xe0\xb5\xa7\x33\x01\xb6\x9a\x0a\xba\x27\x0e\x4c\x68\x7d\xd7\x01\xb6\x9f\x65\x56\x3d\x0d\x75\x6c\x81\x9d\x1f\x8a\xd9\x96\x38\xd0\x78\xcf\xbc\xdf\x61\x42\x42\x47\x8c\x21\x86\x31\x16\xf0\x4c\xc0\xc8\xc3\xc8\xc2\xc4\x4e\x92\x2f\x29\x71\xc5\x8d\x40\xc9\xef\xa5\xcb\xbe\xad\x77\xf2\x5c\x83\x7b\x75\x6b\xff\x90\xfc\xc3\x15\x89\xf3\x7a\x6c\xd9\xcf\xcc\xb0\xb7\xdf\xce\xb0\xb3\x4a\xcd\x6b\x36\xb0\x7d\xff\xb8\xa4\x08\xe9\xb0\x41\x5f\x7a\x9f\x25\x51\x3c\x22\x39\x6c\x5c\x48\x52\xec\x83\x70\x41\xfa\x14\x85\x24\x96\x41\x53\x1c\xd1\xcf\x34\x06\x87\xdd\xf2\x7d\x16\x1b\xfc\xe5\x60\xb6\xe5\x5e\x51\x4d\x02\x09\x49\x65\x45\x68\xb2\x11\xa1\xe0\x08\x01\x70\x27\x43\x09\x2a\xfa\x9c\xb0\xe7\x44\x2d\xab\x77\x68\x00\x3f\x00\x42\x26\x21\x04\x91\x52\x12\x45\xb5\x50\x94\xe1\xc2\x60\xce\x51\xc5\x50\x9e\xa4\x99\x48\xca\x9d\xc9\xa6\x33\x0f\xf0\x8c\x55\x59\x8e\x37\x22\x14\xb3\x33\x56\xfe\x2e\x62\xdd\xa3\x07\xde\xfd\xed\xfd\x86\x9b\xa2\x00\x9d\x6a\x08\x5f\x26\x20\x24\xb2\x91\xb5\x12\xc2\x74\x1d\xe8\xfb\xbe\x07\x6c\x86\xd9\x14\xfb\xb6\x42\x22\xac\x2a\xcc\xea\x70\x82\x58\x22\x28\x94\x10\x8a\xab\x79\x4c\x92\x5f\x24\x02\x24\x37\xcd\x8e\xc5\x9c\x66\xcd\x8e\xd1\x19\x8b\x7b\x35\x0f\xc1\x05\xad\xf8\x10\xd1\x8a\xe9\x4f\xd0\x8a\x17\x15\xe3\x9f\x62\x16\x97\x24\xfa\xc6\xfc\xe6\xa4\x9d\xda\x24\x43\xee\x72\x50\x0d\xac\x57\x7b\x5e\x0e\xea\x50\xf6\x73\xb2\x04\x89\xf6\x52\x82\xd8\x18\x8e\x35\xe2\x81\x72\x81\x59\x29\x11\x0e\x85\x4d\x75\x28\xc0\xb8\x63\x36\x14\x41\x84\x03\x03\x04\x98\x94\x04\xa4\xbd\xd7\x36\xe8\xda\x34\x40\x86\xd3\x51\xed\x81\x58\x6e\xd2\x84\x0f\x78\x60\x9c\x70\x16\x5c\xa8\x08\x29\x64\x81\xcb\x2e\xe5\x0d\x21\x3c\x02\x84\x7e\x91\x70\xd0\xc7\x5e\xec\x2f\x93\xfb\xf3\x19\x7f\x4a\xfe\x71\xf4\x03\x79\x51\x5f\xb9\x74\xfb\xde\xdd\xa7\xd9\x15\x20\xf5\x22\xc6\xb5\x5d\x6d\xe7\x5f\x35\xca\x23\x54\xfb\x31\x7a\x10\xff\xb8\x7d\xff\xb8\xfb\x65\x34\xf4\x81\xab\x18\x4b\xe7\x66\xee\x80\x49\x55\xda\xc2\xbd\x69\x65\x63\xcc\x89\x1e\x8d\xa2\x90\x0e\x48\x29\xf8\xdb\x29\x4a\xc3\x95\x46\x32\xa9\x42\x22\xa4\xa5\x1a\x18\x0d\x4f\x03\x11\x33\x6d\x28\xa8\xc0\xa8\x34\xa1\x78\x09\xd0\x77\x9a\x08\xfa\x9c\x38\x0f\x72\x17\x54\x38\xd5\xc6\xea\xa6\xd6\x56\xd5\x87\xa6\x1b\xbb\xc3\x71\x2f\x0b\x42\x39\xc3\x9c\x49\x22\x30\xc1\x90\x3b\x49\x4e\x07\xa6\x54\x49\x2a\x8c\x06\x15\xb1\x23\x16\xb8\x1b\xb5\xe5\x2f\x77\xfd\x9f\x5d\x90\xc8\x5f\x97\x3a\x6f\x5f\xe9\x28\x6f\x56\x00\xea\xaf\x96\x33\x8b\x16\x6e\x3f\xae\x40\xbf\xf3\xff\x71\x56\x81\xfa\xf4\xf9\xd3\xf6\x50\x95\x80\x05\x13\x29\xbb\x34\x74\xc0\x3f\x75\x9e\xc8\x83\x30\xb0\x04\x79\x51\x16\x2b\x16\x69\x79\x04\x6b\x48\xc8\x09\xc8\x75\x7b\x80\x5a\x1e\xcb\x56\x1b\x6e\x38\x65\xcc\x74\x83\xd7\xc5\x96\x13\x6a\xa8\x66\x9a\x19\x98\xe6\x84\xd5\x87\x0a\x21\x5c\x85\x81\xd2\x03\x63\x07\x36\x94\xc1\x3b\x4d\x35\x2c\x15\x93\x50\xeb\x3d\x6c\x64\x5e\x70\x89\xa6\xba\x84\x70\xb9\xd7\x14\x34\x37\x36\xe2\xef\x97\xf5\xef\x43\xf2\x39\xf9\xe7\x11\x77\xfd\xdf\x2f\xe3\xfb\xfb\xbf\x04\x77\x2f\x38\x98\xbf\x06\x1f\xc1\x5d\x71\x8e\x0a\x1e\xef\xef\xee\xc1\xf5\x0e\x1d\x31\x80\x1f\x1f\xde\x7e\xf8\xf8\xb0\x3d\x2b\xf5\xbe\x36\x84\xb6\x9f\x3e\xdf\xff\xb0\x5d\x37\x9e\x38\x1e\x76\x07\xa2\x6b\xce\x4f\xf9\x5e\x08\xf2\xd4\x76\xca\x67\xd8\x47\x67\xcf\x42\x1a\x67\x8d\xe9\xe6\xca\xca\x93\x73\x29\xa4\xe9\xc4\xbc\x69\xd8\xde\xd7\x3d\xdf\x5b\x03\x12\x45\x83\x23\x73\xcf\x28\xa3\xec\xa0\x84\xe6\x66\x27\x27\x6e\x19\x6f\xc2\x89\x2b\x64\xfb\x60\x74\xe0\x83\xee\x80\x07\x75\x70\x93\x8e\x3b\xb2\x5c\x0d\x33\x6c\x61\x75\x6b\x48\xe5\xb1\x14\xc8\x56\x54\x57\x4c\x6b\x8f\x98\x60\x84\x52\x43\x25\x4b\x40\x22\x41\x9d\x8d\x3b\x73\xa9\xce\x5e\xf0\x7d\xd7\x79\xe1\xb9\xd9\x12\x9f\x1e\xaf\xad\x24\xce\xb9\x48\xc2\x29\x43\x90\x52\x66\x9d\x57\x0a\x4b\x28\x39\xac\x86\x70\x62\x80\x4c\x79\x71\x08\x27\x02\xf2\x1e\xf6\x03\x31\x06\x61\xc9\x10\x63\x10\xb5\x07\x02\xc8\xce\x28\x58\x52\x56\x41\x49\x89\x7b\x4e\xda\xae\xb4\xa5\x14\x96\x1b\xee\x10\x74\x5c\x33\x5b\x31\x62\x60\x45\x08\x21\x0c\x56\x8c\x62\x64\x48\xb2\x01\xc3\x33\xdf\x56\x2f\x78\xb8\xbf\xf7\x9f\x82\x87\x8b\x40\x9a\xef\x3e\x3f\x64\xae\x2e\x21\x80\xb3\xde\x57\x7c\x89\x8b\x96\x47\x0b\xca\x12\x3a\x54\x82\x24\x88\x1c\x58\xa6\x99\x86\x86\x57\x65\x1e\xa6\xea\x39\x51\xde\xe6\x6e\xa7\x2b\x4a\x66\x9b\x6a\x1e\x9a\xd8\xac\xa5\x04\x43\xca\x2c\x23\x41\x79\xe8\x20\x3d\x4c\x4b\xf0\x93\x4c\xab\xdf\x03\x38\x6d\xc4\x0b\x87\x35\x3a\x89\xbe\xb9\x18\x4c\x5d\xc0\xa1\x5f\x9b\x2d\x45\xcc\xcb\x9b\xf3\xfe\xbb\x3d\x3f\xef\xdd\x21\xae\x88\xcb\x41\x2a\xe0\x7c\x6c\x2e\x2f\x6b\x49\x1b\xd8\xc1\x3d\x75\xb6\xef\x81\xec\xe6\x63\x7c\x4a\x07\x65\x0c\x02\x47\xac\x39\xd7\x38\x40\x64\x8c\x1a\xd3\x81\x10\x32\xd2\x15\x13\x99\x65\xfd\xf3\x71\x47\xb2\xe4\xec\xc9\x9e\xac\x45\xce\x97\x92\x30\x09\xd0\xad\x6b\x15\x0b\x6d\x96\xcc\x54\x66\x30\x9c\x5c\x10\x3e\x49\xb6\x69\x13\xb9\x1a\x3a\x79\x93\x7c\x7c\xe9\x55\xfd\xac\x1b\x47\x7c\x7f\x05\x12\x79\x21\x6b\x9c\x0d\x70\x96\x79\x72\x77\x51\x75\x49\xf7\x20\xf1\xc0\xbb\xb5\xba\x27\xfd\x73\xa2\x00\xf7\x80\x51\x62\x6d\x03\xf8\x7c\x64\x5d\xda\xd7\xb3\xf2\x86\x9d\x86\x80\xc0\x31\x34\x69\xa5\x44\x98\x9e\x93\xd4\x45\xd1\x5a\xb5\x3d\xb9\xe5\x4b\x29\xa5\x7a\x29\x19\x26\xd4\x1a\x87\xe5\x5c\x0a\x91\x2a\xa2\x85\x71\x75\xcd\x58\x3d\x1f\x6c\xd0\xab\xd7\x69\x22\x00\x4d\x8f\x71\x1c\xfd\xf2\xec\xbd\x18\x3b\xe9\x2b\xfc\x1b\x18\xaf\x19\x47\xc4\x77\x0e\x23\x47\x77\xfa\xc4\xb9\xa1\xf8\x49\x66\x23\x3c\xd5\x68\x9f\x80\xa4\x01\x2c\xed\x76\x24\x32\xd6\x7f\xd6\x21\x36\xed\x9c\xe1\x82\x54\x05\xc1\xd0\xfa\xa3\xdf\x11\x1b\xba\xbd\x57\xb2\x70\x25\xb7\x07\x40\xbf\xf8\x4d\xd4\x73\xda\xa6\x2c\x15\x71\xef\xbd\xe8\xd3\xbd\xa8\x80\xbc\xbb\xff\xfe\xe6\x2c\xaf\xfd\xa7\xe0\x31\x16\x45\x56\x19\xb3\x87\xed\x95\xac\xe9\xcd\x19\x33\xa9\x05\x97\x0a\x88\xb4\xc9\x0d\x33\x15\xca\xa5\xa1\x50\xd2\x1c\xfa\x32\x58\x09\x44\x31\x05\x65\x14\x57\x06\x8c\x0a\x51\xc5\x06\xc1\xb4\x34\x3b\x46\x85\x52\x14\xef\x5d\xdd\x61\xc1\x46\x63\xa9\x03\xed\xec\x3b\x5d\xa7\x39\xa6\x52\x69\x56\x56\x9d\xa1\x5a\xd0\xd6\x2b\x97\xac\x75\x15\x7d\x53\x6f\x71\x54\xed\x81\xab\xf6\xfa\x59\x13\xf9\xed\xcd\x8f\x8f\xf7\x97\x8a\xeb\x95\x86\xef\x9b\x6f\x0b\x91\x7c\xcb\xe6\x92\x64\x53\xb0\xdd\x49\x84\xc3\x34\x1f\x9f\x93\x70\xe0\x63\x13\x7c\x0a\x51\x15\x58\x7d\x11\xf3\x29\x41\x5d\x47\x5b\x8a\xf6\xb7\x65\xea\x83\xd8\xe2\xb9\x16\x5e\x90\xda\xec\x07\x65\xb9\xf4\x08\x01\xa9\x42\x2b\x67\xa1\x54\x1c\x06\x91\xeb\xeb\x9f\xdd\x8d\xdb\xc2\xe4\x2e\xf9\xb3\xa8\x83\xfa\x61\x3d\x80\xaf\xa1\x9c\xef\x7e\x8e\x1b\x17\x61\x90\x5f\x1d\xed\xa6\x1e\x3d\x80\xcf\x89\x39\xf0\x5a\x79\xa1\x65\x23\xba\x99\x4e\xfe\x74\x72\x52\x50\xe6\xb9\x16\x5e\xec\x71\x5a\xfa\x14\xcd\x7d\xda\xfd\xb6\x48\xeb\xf9\xb4\x59\x8e\xa5\x97\x5e\x36\xe1\x00\x58\x2b\x8d\xed\xbc\x31\x2e\x57\xca\x48\x16\x1c\xb0\x07\xa5\x5c\x3f\x9b\xb6\x75\xbd\xf7\x7d\xb2\x4b\x34\xa8\x63\x3c\xf2\xb7\xae\x9d\xa4\xde\x7c\xbb\x4e\xbc\x66\x86\x2f\xab\x05\xb8\x3c\xaf\x8e\x32\xb1\xb7\x7a\xb7\x86\x6c\x3f\x9a\x65\xd5\x58\x72\x9c\x65\xa5\x73\x41\xad\x0d\xc5\xb8\x9e\x74\xc3\x00\x54\x3f\xef\xe3\x53\xb6\xe7\xe3\x92\x29\xee\xfd\xb1\x55\x16\xa8\x5d\x29\x84\x95\xf3\xc8\xac\xf7\x96\xa5\x85\x0c\xfd\x92\xd4\x8d\x8c\xb1\xd4\x58\x5a\xf4\x6e\xd6\xa9\xcd\x43\x1d\x4e\x02\x24\xa0\x04\x63\xbe\xe4\xee\xe4\x59\xdf\x18\xd0\xc4\x59\xf5\xed\x4d\x6f\x53\x16\xb1\x23\xe9\xf1\x37\xfb\x74\x3f\xb7\xa0\x74\xd1\x72\xdc\x25\x37\xa9\x7f\x36\x91\xf3\xbf\xae\xeb\x97\x0a\xef\x0b\x02\xf4\xf1\xd3\x8b\xa8\xe0\xcf\xd8\x64\x66\x9d\x47\x19\x7f\xe2\x4c\xea\x7d\x99\xf1\xa7\x26\xe2\x50\x33\xa8\x7e\x3b\x19\xdf\x34\xa0\xf2\x1e\x54\x75\xbd\x33\xd0\x3a\x23\x54\x7b\x0a\x85\x3d\x86\x64\x9e\x9c\x4b\xf3\x79\x7a\x21\xcf\xae\xfe\x25\xa9\x7b\xa6\xf1\x3e\x2c\x77\xe1\xd5\xad\xe7\xc5\x24\xf0\xee\xe1\x2c\x7b\xff\x63\x74\x11\x5d\xbb\x0b\x0f\x2b\x8e\xf1\xda\xb6\xf5\x4a\x8e\xef\x9c\x38\x25\x27\x0f\x72\x3f\x4d\x00\x85\x93\x3b\xb0\xe7\xa4\x7d\x4e\xfc\x73\x22\x0f\x36\x8c\xa0\x3c\x01\x03\xf2\x30\x41\x4f\x25\x67\xa5\x10\x65\x9a\x6b\xe6\x88\x9e\x8d\xe3\xce\xf9\xd4\x08\xe2\x30\xdf\x36\x4b\x58\x6f\xc3\xe8\x0e\xdc\x59\x50\x85\x63\x6b\x75\x7f\xee\xd6\xcd\xfb\xb9\x92\xbc\x74\x05\x01\xa7\x7e\xc4\xd3\xa1\x42\xe1\x78\x60\xfd\x18\xc5\x8a\x93\x24\x4b\x39\x38\xde\xb8\x1d\x8b\xb9\xd5\xdf\x7a\x55\x47\xca\xe2\x1d\xba\xfb\x2a\xcb\x4e\xc7\x25\xcd\x71\x59\xf1\x34\x1e\xd3\x7c\xee\xb7\xc5\xdc\xc6\x01\xce\x7f\x7b\x48\xd9\x3c\xed\x58\xd0\x56\xcf\x8d\x72\x4e\x59\xed\xdc\x59\x17\x4a\xdf\xd8\x17\xcd\xde\x6f\xfd\x9a\x2e\x8a\xbd\xff\x11\xbe\x2f\x2f\xa3\x46\x83\xca\x2d\x63\xb8\x0a\x43\x8c\x24\xc7\x50\x8c\x80\xf0\xa0\xc2\x18\xba\x21\x48\x0e\x78\x13\x30\x38\x9d\x6d\x4c\xbb\x8b\xdc\xe9\x09\x08\x17\xe9\x4d\xa7\xdf\x0c\x69\x1b\xea\x4d\xb3\x44\x47\x56\x5b\xed\x3a\xea\x0d\x28\xa7\xda\x1a\xe7\xb4\xd5\x5a\x07\xab\x43\x5e\xd7\xd6\x3b\x77\xe6\xa4\x1d\x62\x6d\x07\x25\x37\x31\x03\x3a\x27\x98\x6f\xce\x68\xe4\xd5\xa6\x77\x25\x6c\x5d\x87\x4b\xab\xbe\xda\x9b\x25\x36\x5a\x09\x9d\xdf\x84\x4b\x9f\xef\x6f\xa4\x7f\xf2\x7e\x48\x8f\xe1\x04\x11\x45\xb5\x15\x4c\x8a\x41\xf7\xaa\x28\x2b\xad\xd1\x92\xfb\x57\xd5\xb2\x14\x52\xa0\xa6\xa2\x60\x8c\x18\xa4\x14\x35\xa2\xac\x34\x2c\x05\x2b\xe0\x61\x89\x9e\x7c\x98\x76\x28\x98\xf1\x39\x01\x2e\xec\x1d\x42\xca\x8a\x5a\x4a\x1e\xcc\xc1\x4f\xc0\xe5\xc5\xf0\x9c\x34\x4d\x5e\x17\x82\xd7\x61\x34\xd6\x03\x64\x2b\x4e\x2d\xd5\x0c\x5b\x4c\x31\xa2\x15\xa2\x02\x57\x9e\x1a\xb5\x8f\x7c\x20\x0a\x4e\x67\xcd\x8d\x2a\xf9\xcf\xa3\xf6\xde\xdb\x68\x73\xf0\xfe\xf1\x77\x54\x82\x97\x0c\xe7\xed\xfd\xfb\xc7\xdd\x75\x1f\x7c\xd3\xfa\x32\x07\x25\x10\xcc\xe8\x30\xa6\xe5\x7c\x62\x3a\x8e\x65\x14\x83\xde\xa6\x91\xc0\x95\x60\x74\x46\x3f\x27\xc6\x38\x55\x67\xb0\xab\x95\x6f\x77\x06\x15\xc5\x5e\x39\x44\xa8\xb3\x47\x19\x6d\xc2\xf6\xd6\x55\x4c\xb5\x8a\x09\x35\x8f\xb4\x95\x52\x6b\x61\x8c\x8d\x75\xbc\x4d\x7a\x7a\xd6\x31\x16\x59\x77\xcc\xbf\x3c\xe3\xb7\xbe\xff\x0a\x95\x9a\x3d\xec\x5e\xb7\xa2\xeb\xc3\xfc\x76\x81\xcf\x04\xd0\x30\xf7\x10\xb4\x01\x17\x30\x65\xe1\x64\x3b\x36\xfa\x41\x87\x41\x1d\x4c\x98\x80\x80\x45\x68\x32\x6c\xa5\x92\x6a\x76\x92\x58\x2c\xe3\xb0\x44\xa1\x07\x87\x2f\x03\xe8\xc3\xb0\xe9\xbb\xb1\x3c\xb6\x96\x53\xb7\x67\x4b\x34\x33\x1d\xb4\xeb\x1c\xe5\x69\xc2\x1a\x21\xb4\x92\x86\x19\xf9\xa5\x3e\x9d\xec\xe4\xdc\xb4\xcc\x95\x1e\xec\x6f\x6c\xac\xeb\xdc\x25\x7f\xb8\xae\xf5\xb7\xf7\xb7\x57\x8c\xb6\xed\xe3\xab\xa6\xc9\xf9\xbc\xbe\x06\x7c\xdf\x46\xa3\xfc\xfb\xc7\xcf\x6f\x6f\x3e\x7c\xfa\x78\xdf\xa7\xfb\x79\x68\x5d\x59\x79\x5d\xd5\x79\x79\x08\x13\xf1\x97\xe9\x90\xba\x4c\x84\x7d\x5e\x02\x1d\x8e\x25\xa2\x65\x6e\x0b\xea\x3d\x33\x61\x94\x93\x09\xc7\x8a\x1b\x72\x84\x41\xef\xd8\x2c\xc2\x01\x61\x8c\xab\xb6\x43\x04\x33\x4a\x33\x64\x83\x31\x40\xdb\x46\xd9\xd0\x56\x10\xb9\xaa\xe7\x54\x00\x18\x4e\x7b\xd3\x82\x5c\x9f\xca\xbd\x6a\x12\x90\x9a\x67\x76\x63\xb3\x3e\xd6\x89\x2f\xf1\x77\xfa\xda\xd0\xf9\xfc\xe2\xb9\xfc\xfe\x71\xcb\x2a\x08\xc6\xb9\x2c\x53\x97\x53\xaf\x7c\x51\x2b\x94\xc3\x7c\x3e\xca\x70\x14\x40\x54\xa1\x4f\xcb\xb2\xca\x7a\x2e\x1d\x67\x81\x74\xd0\x42\x24\x0f\xa1\x6b\xed\x01\x1c\x1d\x23\x31\x0e\xa9\x81\xba\x51\xd9\xfe\x5a\x43\xe2\xca\x6f\xe2\xac\x53\xb9\x89\xd6\xd5\x66\x08\x3d\x07\xf9\x97\x1a\x24\x20\x67\x61\x0a\x53\xd6\x81\x06\x94\x3c\x8c\x41\x85\x63\x15\x86\x60\x30\xf0\xd9\x5e\x32\xac\x2b\x54\x51\xc3\x2b\x4b\x95\x51\x4c\x2a\xc1\x2c\x8d\xde\xee\x66\x89\x29\x32\x7a\xf1\x46\xbe\xec\xc9\x1f\x3f\x9c\x3d\xdd\x87\x8d\x0f\x09\x38\x04\x9c\xc2\xdf\x8e\x07\x07\x92\x90\x64\xd4\x4e\x2e\x9c\x9c\x03\x53\xc8\xd3\x55\xfb\x02\xe4\xe0\x74\x43\x76\x34\x29\xa2\xf2\xe1\xda\xc5\xbc\x32\x19\xd8\x3e\x46\x73\xdc\xed\xdd\xfd\xc7\x77\xdf\x76\x55\x37\xc9\xdc\x0c\x9d\xb0\x4e\x3a\x08\xc7\xd0\xd1\xfa\x8c\xe2\xa2\xc1\xb9\xd4\x33\xca\x3d\x6c\x48\xb5\xa3\xb3\x0e\x3d\x22\x82\xb8\x06\xa3\x8a\x53\xba\x29\x9d\x94\xa3\xd6\xe3\x13\xda\x88\x19\x32\x5e\xb8\x02\x25\x69\xc2\xd3\x22\x72\xa4\x7e\x48\xfe\xec\x2a\xd6\xb8\xc4\x43\xab\x86\xf7\xbb\xf3\x8f\xbf\x52\xf6\x7e\x70\x40\xc6\x09\x70\xb0\x42\x19\x67\x3a\xd9\xbb\x30\x64\x06\x50\x0f\x4c\xe8\xdd\x91\x0f\xce\xdb\xa3\x3c\xb9\x71\x6b\xa6\xc9\x41\xbf\xa4\x88\xf3\x29\x2d\x9f\x93\xda\x76\xa0\x72\xd3\xe4\x42\xe7\x9b\x0e\x90\xb9\x4d\x79\xd8\x1f\xec\x1e\xd0\x65\x8f\xaa\x13\xb8\xd1\xdb\xe3\x19\xaf\x14\x57\xdf\x87\x25\x4b\xf9\x70\xfb\x70\xfb\xe1\xf6\x61\xa3\x7d\xe3\x7d\xd3\x34\xcd\xf6\xf8\x5b\x23\x9b\xed\x7e\x3e\x80\xe6\x29\x07\xfb\x24\x4d\xc5\x33\x8b\xba\x1c\x45\xcc\x6a\xef\xce\x80\x93\x0b\xaf\x31\x7b\x7b\x51\xd4\x59\xc6\xe7\xf7\x67\x4e\xc7\xd7\x92\x20\xef\x1f\x6f\xcc\x13\x3e\x38\xc5\xc0\x54\xc2\x1a\x95\xfb\x46\x89\xd9\x67\x50\xd7\x08\x82\x82\x55\x9e\x54\x03\x93\x5a\x96\x4a\xa1\xe0\x40\xa3\xcc\xf6\xe0\xe6\x3a\xe4\xc1\xf0\x13\x90\x20\x4f\x3b\x8a\x11\x13\x21\x57\x5c\x5b\xd3\x1a\x58\xd9\xbc\x63\x95\x52\xf3\x49\x71\xe8\x2b\x0e\x26\x27\x62\x3e\x06\x52\x9f\x16\xb1\x36\xfb\xfd\x95\xda\xea\xc3\xed\x7d\xc4\x4e\x2c\xe1\xdb\xee\xc0\x42\x17\x48\x26\xc2\xa9\x0e\xbc\x90\xc6\x68\x99\xe6\x3b\x6d\x71\xd9\xbb\xb9\x4f\xd1\x69\xe4\x82\x83\x02\x60\x50\x94\xc9\x26\x91\xe0\x70\x83\x77\x26\xd9\x26\x65\xf2\x70\xf6\x1f\x5f\xe6\xc4\xed\x4b\x8d\x23\xfe\xdb\x7f\x0d\x3e\xbe\x36\x43\x7f\xdc\x2e\x5b\xd4\xcb\x95\xd9\xbe\x62\xb3\x53\xae\x86\x70\x64\xa0\xd8\x38\xd2\x4f\x9c\x87\xa1\x90\x46\x6a\x1e\x5a\xc3\xac\x57\x5c\x00\x91\xe6\xda\xd5\x25\x26\x33\xc9\x9c\x3a\x3a\x00\xab\xd0\x4d\x87\x91\x1f\x6a\xcd\x77\x86\x4f\xc6\xea\x3a\x4c\xcc\x32\xde\x36\x35\x56\xd8\xf5\x61\xa2\x4a\xcd\x0d\x38\xb1\xca\x74\x83\x26\xb4\xac\xa8\xd5\x8d\x46\xb9\xcb\x25\xab\x6c\x89\xd8\x8a\x23\x1f\x9f\xe9\x8d\x8f\x39\xda\xaf\x56\x75\xcd\x4b\x5e\xff\xd2\x67\xbf\xda\x62\xdf\x7e\x88\x9b\xf4\x87\xdb\xfb\x74\x4c\x4b\x88\x1d\xa9\xc0\xf8\x85\x67\x85\x13\x5a\x71\x47\x98\xb2\xb6\xb6\xc6\x1b\x23\xc5\x58\xd7\x4f\xd6\xa7\xc7\x2d\x75\x0a\xd9\xc6\x61\x3c\x0e\x6d\x47\x9c\x6d\x1c\xeb\x0e\x87\x16\xdb\xba\x2d\xbe\x78\x95\x4d\x4f\x2e\x49\x13\x0d\xc6\xf3\x5e\xf3\xcf\xce\xfa\x5e\x4b\xce\x10\xab\xb1\xd7\x7b\xff\x36\xba\x84\x45\xfc\x4b\x54\x6b\x5c\xd7\xe8\xc7\xdb\x87\x9f\x6a\xa7\x3f\x7c\xfc\xe0\x41\xe5\x4f\xa7\x7d\x29\x15\xd5\x82\x43\x21\xaa\x32\x9c\x50\xeb\xc3\x90\x9d\x3c\xe0\x55\x45\xa0\x2d\x95\x50\x2a\xdf\xe7\x44\x72\x45\x99\xdc\xcb\x56\x72\x2e\x5c\x95\x4f\xd3\x56\x83\xe4\x39\x71\x2d\x32\x55\x39\x2a\x5e\xba\x12\xe2\x9a\x38\x58\x0d\xc0\x0d\xf3\xa4\xf5\x04\x4f\xae\x1e\x81\xee\x6b\x26\x34\x27\x5e\x28\x5e\x13\xac\x45\xd4\x52\x4c\x13\x16\xfd\xf1\x8b\xe4\xbb\xe4\x4f\x5e\xe7\xfd\xed\xa7\xcf\x17\x71\x89\xcb\x9c\xbf\x20\x76\x3c\xa0\x35\xa0\xa1\x6b\x9b\x32\xe8\x00\x71\xbf\x0f\x5d\x56\x2f\x3f\x64\xa1\x05\xf6\x89\x01\x1b\xba\x14\x1d\x8f\x3e\xec\x61\x65\x14\xf7\xb0\x02\xc2\x2f\xef\xa5\xf7\xc0\x27\x49\x96\x74\x69\x79\xe3\x77\x2a\x29\x92\x3f\xb9\xa8\x1a\xfe\x78\x2d\x34\x05\x7e\xa2\x62\x70\xfd\x93\x55\xd6\x00\x35\x5e\x02\x0c\xa8\xb1\xfb\xbd\x21\x34\x14\xf3\xa1\x9a\xd2\xba\x96\xf2\x30\x20\x62\x9d\xf0\x51\xb6\xa0\x41\x7e\x16\xb5\xd5\xed\x1e\x22\x23\xa8\x2b\xc3\x10\xda\xaa\xdf\x29\xd4\x93\x22\xba\xb8\x1b\x4a\x69\x69\xf5\x73\x82\xc2\xa8\x73\x24\x28\x69\x0f\x14\x55\xa4\xb4\x35\x28\x50\x18\x55\x89\x39\xc3\xcd\x9e\x50\x0e\xad\x8f\x73\x55\x24\x6e\x33\xee\x4c\x8c\x9b\xcf\x8a\x1d\x9f\xde\x44\xe8\xfd\x72\x98\xff\x00\xbc\x4d\xb3\xe5\x60\x37\x82\x63\x07\x0f\x63\xd5\x7a\xe7\x61\xa7\xbd\xee\x8c\x60\x6e\xdf\x1b\x55\xc2\x54\xd6\x7b\x22\x25\x36\x27\x20\x71\x69\x41\x09\x7a\x14\xe8\x58\xc0\x03\x0e\x49\x38\x56\x98\x90\x98\xbf\x26\xa9\x8b\xeb\x42\x76\xc6\x6a\x2e\x99\xce\x4f\xf0\xe7\xab\x81\xcf\xbb\x0f\xb7\x0f\xa9\xae\x6b\x50\x65\xb8\xe1\xf5\xa4\xc6\xae\x1b\xf9\x50\x5b\x65\xa4\x33\x6c\x36\xb3\xa8\xeb\x9d\x7e\x2a\xb3\xce\xc2\xd0\x09\xc9\xbc\x30\x8e\x3a\xa2\x4d\x23\x1a\xed\x0e\xe6\xc9\xc6\xfd\x74\x4a\xf1\x0d\xda\xa1\x24\x4b\xfe\x66\xf2\x36\xb9\x5f\xd5\xe6\x5e\xe6\xda\xa7\x77\x3f\xf3\x6a\xda\xe1\xdf\x1c\xb2\xca\x69\x57\x2b\xaf\xf7\x5d\x2a\x9d\xd4\x8d\xf2\x66\x5f\x3f\x59\x27\xad\x97\x5e\x75\xcd\x0e\x79\x8c\x3a\xdb\xec\xd9\x78\x68\x0e\xa8\x35\x75\xcb\x86\xae\xd9\xa3\xd6\x36\x1d\x3b\x1d\x9a\xb5\x26\xe3\x53\x7a\x63\x76\x30\xb9\x5d\xd9\x97\x77\xe9\xf6\xca\x67\x2b\x7b\xb8\xff\xe1\xed\x8f\x9f\x01\xdb\xa2\x36\x1c\x01\x04\x2d\x09\x30\x34\xa1\x0d\x54\x82\x06\xa0\xa1\x6e\x00\xf7\x3d\x28\xdd\x0e\xfa\x70\xea\x0c\x6d\x48\xdf\x32\x47\x5d\x0b\xca\x93\x6b\x23\x9f\xe9\x0f\x80\x4c\xe8\xce\x6c\x6d\x92\x27\x3f\x5e\x69\x13\xfd\xcb\xe4\x5f\x27\xff\x36\xf9\x3f\x92\x7f\x97\xfc\x3f\xc9\xff\xb7\x5c\xed\x55\x90\xe8\x7e\xbb\xdc\xd5\xdd\xcd\x79\x04\xfe\xc5\x95\x8c\xc0\xdb\xdd\xf6\xd7\x97\x4a\xf7\xab\x80\xcb\xeb\x2f\xcf\xf1\xc1\xdb\x33\x96\x76\x7b\x2d\x3a\x70\x55\x20\xbe\x7e\x7d\x73\xd9\x7d\x37\xab\xda\xcb\xed\x9a\x20\x65\x95\x83\x0a\x16\x3e\xf0\xe7\x04\x41\x24\xb5\x54\x45\xce\xab\x52\xe4\xda\x41\xc1\x28\x2d\x39\x56\x55\x3a\xa1\x0a\x96\x52\x69\x82\x8b\x9c\x23\x28\x0a\xe3\x4a\xb6\xfc\x96\x61\x85\xe6\xfa\x52\xe8\x2c\x96\x49\xcc\xbd\x4f\xeb\xb2\xe0\x45\x39\xe7\x55\xc1\x8b\x2a\x2b\x61\x29\x0a\x28\x45\x85\x18\x9a\x6b\x58\x88\xa2\x94\x1c\x61\x86\xf3\x14\xfa\x25\x8e\x07\xb0\xe7\x87\xde\xfb\xb0\x27\x00\xba\x40\xb7\x05\x87\x98\x70\x94\xe7\x1c\x9e\x04\x5c\xfe\xbe\x84\x25\xac\x4a\xc1\x4c\x59\x48\xe1\x2b\xc5\x72\x8c\xab\x5e\xe7\x65\x59\x56\x5c\x57\xa4\x2a\x38\xd3\x65\x2e\xb8\x87\x86\x30\x44\xf1\x73\xc2\x04\x22\x0c\x32\x52\x12\x56\x32\x52\x10\x0e\x39\x2d\x91\xc0\x14\x93\xe5\xe7\xcb\x6b\x44\xb1\xa7\xd4\x14\x9c\x19\xc1\x0e\xa0\x68\x84\x59\xf9\x2b\x39\xb0\x09\xde\xc9\x2d\xbf\xc2\xea\xbf\x4f\xfe\xee\xef\x72\xab\x7e\x1b\xdd\xdb\xe2\xaa\xfd\xb8\x42\x8f\x1f\x96\x0d\xef\x32\xbc\xdf\x2d\x73\x09\x8c\x1b\xf8\xe5\xe8\x96\xa9\x54\x9b\xee\xa9\xdc\xf4\x5f\x90\x5c\x42\x2e\xca\x8e\xb0\xf5\x94\x33\xd6\xfa\xbe\x4e\xf7\x33\xc9\x72\x83\x31\xa7\x6c\x0c\x1e\x75\x8e\x6d\x79\x68\x94\x5e\xbe\xc2\xd1\xe0\xd0\x11\xe4\xa8\xc6\x15\x33\xa8\x54\x58\x68\x7e\x64\x18\x55\x95\xf6\x5a\xc6\x09\xbe\x03\x75\x42\x76\x6c\x2b\x5f\x8e\xfd\xe3\xea\x90\xf5\xed\x71\xbf\xe6\x29\x3f\x15\x33\xbc\x7f\xff\xb8\x66\xc8\x9f\xef\x7f\x78\x0b\x86\x0d\xf9\xb2\x77\x5d\x07\x48\x6b\xda\xa7\x06\x98\x3a\x96\x34\x4e\x61\x2a\xe1\x14\x78\x9a\xcf\x2b\xa0\x21\x70\x90\xc0\xea\x39\x01\x53\x30\x29\x46\xa1\xab\xca\xad\x0c\x4e\x1b\x13\xe5\xa8\x08\x91\x54\x51\x24\xa5\xd2\x5a\x49\x49\xb0\xa2\xa1\xd7\x98\x24\xc9\x2f\x80\x49\xd0\xce\x6c\xcd\x7f\x54\x1f\xf9\x05\x7d\x77\xfb\x15\xef\xfb\xba\x8f\x9c\x26\xa0\x8d\x58\xb3\x14\x7d\x49\x52\x14\x58\xb4\xf7\x02\x7b\x00\x9f\xa2\x8d\xa7\x5f\xae\xf3\xe5\xd1\xd0\x6e\xc0\xfb\x14\x1d\x5a\xb4\xdf\x6f\x09\x21\xe1\x44\xa4\x24\x82\x31\x16\xd4\xdc\x82\x86\x0c\x78\x20\x7b\x81\xa1\x2c\x51\x59\xa9\xd5\x77\xf9\x06\xb8\x84\xec\xd4\x56\xbf\x28\xb0\xfc\xdd\xe4\xcf\x93\x7f\x71\x5d\x9b\xba\xbd\xf4\x85\xe1\xe7\x35\xd5\xba\x90\x29\x2e\x56\x50\x37\xef\x1f\xef\xef\xb6\xe7\xca\xcf\x57\x69\x70\x3c\x8b\xcf\xf7\xa0\x4d\xf3\xc8\x9f\x00\x7b\x44\x2a\x8d\x02\x9f\x07\x08\x8a\x29\x60\x70\x98\xa7\x3e\xa2\x97\x7b\x50\xcd\xf9\xe5\x55\x99\xe7\xcf\xc9\x4c\x32\xee\xc7\x91\x69\x4e\x4b\xc1\x51\x28\x70\x65\x2a\x4a\xc2\x69\x8b\x09\x51\x24\x50\xca\xa9\xc4\x85\xc9\x09\xe8\xc8\x89\x10\x72\x24\x84\x1c\x8a\x1c\xef\x29\xd5\x86\xd3\xd2\x94\x58\x52\x4a\x39\x43\x49\xb2\x05\x36\x91\x3b\xb5\x65\x57\x77\x26\x8e\xa6\x4b\x96\x72\x7b\x85\x9a\xc8\xee\x5f\x2d\x3a\xd2\x32\x3b\x04\x95\xc2\xf9\x08\x8e\x5f\x1a\x70\x5c\x22\xca\x20\x7c\xea\x67\x49\xb2\xea\x69\x10\xa9\x9a\x5d\x54\x8a\xd9\xb2\xd0\x51\xc5\x66\x99\x7a\xb6\x84\x2c\x5f\x26\xd0\xb1\x70\x92\x6c\xc5\x57\xbb\x44\xef\xf4\x56\x26\x7f\x18\x3d\x2f\x57\xa5\xae\xf4\xef\xa1\xeb\x11\x7c\x8d\xc6\xfd\x78\x0f\xde\x2d\xd7\x6e\x77\xb3\x7d\xa9\xe7\x9d\x95\x9a\x3e\x7c\x7c\x48\x4b\xe0\xeb\x98\xb8\x4e\xe1\xa4\x98\xc1\xa1\x0d\x0a\x19\x19\x5a\x30\x06\x09\x10\x68\x20\xa4\x61\x10\x22\x1d\xf5\x97\x52\xae\x13\xb6\x06\xd0\xb9\x6d\xc1\xb9\x16\x5a\x5b\x2a\x11\x34\x54\x6a\x11\x6c\x55\x41\xc4\xe9\x3e\xd4\xab\xe4\xcd\x99\x82\x93\xe4\xa0\x4d\xf0\x8e\x7e\xb5\x7e\xbc\xbd\x70\xd1\x6e\x5f\xae\xd4\x65\xf4\x7e\x8b\x82\x48\x79\xc6\x9e\x5a\x97\xa2\xb9\x3f\x6d\xf2\x2f\x93\x4b\x8f\x33\xbc\x3c\xf6\xfc\x70\xa2\x7d\x9a\x9f\x06\xdc\x1f\xb7\x3c\x74\x86\x86\x69\xa6\xe0\x44\x27\xfa\x9c\xd0\x41\x61\x68\xca\xaa\x44\x86\x94\xc9\x06\xd8\x84\xee\x44\x9c\x57\xbf\x4a\xee\x57\x2d\xf5\x9f\xa2\xe3\x6f\x5e\x88\x07\xeb\xb2\xb5\x6e\xc0\x71\xd5\x9a\x40\x17\xd3\xc0\xb4\xf8\x42\xd3\x3c\xd0\x32\x3b\xce\x27\xea\x6c\x43\x87\x7d\x18\x7d\xda\xce\x2c\x2b\x98\xe5\x5c\x35\x27\x8d\x09\xdd\x22\xc6\xac\xb0\x56\x84\x21\xd4\x24\x28\x00\x05\xb1\xd4\x58\x76\x52\x8c\x32\xd5\x35\x1c\x55\x55\x92\x01\x91\xc8\x9d\xdb\xaa\x88\x13\xfc\x27\x2f\x0c\xb9\x17\x7a\xc6\x0b\xf9\xf7\x8c\xc1\xfd\x7c\x05\xc2\xfd\x78\x7f\xa1\x77\xc4\xda\x4b\xc4\x5b\xac\x0d\x74\x30\x80\x06\x2d\xe1\xaa\x62\xc8\x23\x72\x9a\x7b\x9c\xd6\xa1\x6f\x3b\xe6\xcc\x3c\x55\x47\x90\x94\x30\xf7\xa5\x0c\x4d\x38\xc8\xb4\x08\x95\xae\xd9\xde\x86\x09\xa8\xaa\x0c\x36\x2b\x08\x0e\x13\x42\x02\x57\x1a\xe2\x8d\x91\xb6\x54\x52\x68\x24\xa8\x91\xda\x50\x4b\x64\x38\x31\x58\x94\xa5\xc4\x8e\x22\x71\x14\x58\x71\xad\xad\xc6\x28\xb4\x88\x10\x94\xd6\x98\xd0\x18\x62\x25\x5b\xd0\x26\x64\xc7\xb7\x2e\xf9\x65\xf2\xfd\xa5\x47\x07\xee\xd7\xae\xd5\x99\xf8\xf8\x70\xbf\xbb\x59\x17\xb1\xbb\x2b\x65\xdc\xc7\x15\xd4\x7e\xa9\x9b\xa6\x08\x40\xe8\xf2\x02\xf4\xf5\x17\x0e\x10\x2c\x4f\xc0\x94\x10\x34\x4f\x53\x76\x08\x7d\x64\xf0\xd8\xa0\x7d\xc8\x11\x51\x29\x0f\x89\x4f\xeb\x59\x14\x40\x87\xfd\xb6\x92\xb0\x82\x47\xad\x11\xc6\x48\x86\x21\xf4\xc4\x08\x6d\x8c\x92\x86\x28\x1e\xca\xd5\x7f\x0b\xd4\x09\xdf\x89\x2d\x3f\x7b\x17\xbd\x8e\x8d\xdf\x21\x70\xbb\x6a\x3c\x7c\xfa\x7c\xff\xc3\xd5\xc8\xe8\x2b\xdc\x07\x06\xc6\x50\xd4\x91\x78\x24\xda\x0a\x1d\xd2\x22\x50\xa0\x40\x85\xaa\x50\xa1\xcd\x28\xa5\x91\x56\x71\x67\xec\xe1\x60\x8d\x93\xc2\xca\x40\x85\x14\x51\x6b\x3b\x11\x3b\xbb\xd5\xc9\x5f\x25\xff\xe8\x45\x35\xe6\x05\x56\xf3\xfe\xf1\xfb\xab\x36\xeb\xed\x35\x20\xfb\xe3\xed\x65\x1c\xac\x63\x21\x0e\x20\x70\xff\x78\xbf\x5b\x87\xc3\x36\xf7\x88\x82\x7c\xee\x50\xda\x1e\x79\xa3\x34\x67\x92\x89\x52\x08\x58\xe4\x41\xa3\x3d\x48\x70\xe1\xa1\x0a\x6d\x18\xb8\x50\xbc\xd3\x61\x04\x1a\x07\x0b\x9a\x6a\x19\x44\x52\x04\x9c\x42\x1a\x4c\xe5\x30\x56\x88\x6c\x05\x92\xdc\x0a\xab\x84\x11\xea\xa8\x4a\x5d\x56\x2c\x9c\x60\x81\x96\xf1\x80\x39\x40\x9c\x1a\x6d\xad\xb0\xda\x95\x46\xa9\xb9\x93\x38\x75\x98\x71\x4a\x92\x1d\x50\xe7\xd8\xf0\x0f\xa2\x32\x01\x4a\xfe\x62\x55\x4b\x8e\x2e\x3b\x8f\x77\xab\xa3\xed\x76\x09\xbe\xbf\x12\xe5\x7a\xb8\x8b\xe5\x89\x8f\x0f\xb7\x0f\xb7\x6f\xae\x36\xef\x6c\xf0\x68\x02\x94\x38\x3b\x7b\x69\x24\x70\x60\xaf\x94\xe4\x59\x22\x44\x85\x4a\x0a\x51\x63\x5b\x5b\x7b\xbf\x2c\x5e\xad\x6d\xb6\x16\x91\x3d\x33\x10\x33\x8a\xb1\xec\x14\x11\x12\x0f\x73\xc3\xd8\xb2\x05\xe8\x69\x9a\xa6\xb0\x4f\xa7\xd0\xd7\xcb\xd7\x5a\x47\xaa\x13\xbd\x53\x5b\x74\xae\x1f\xfe\xea\x45\x6d\x25\x0e\xde\xf5\x92\x83\x0b\xaf\x2b\xa2\xff\x37\x6c\x6e\x4b\x70\xec\xbf\x20\x80\xaa\x30\x02\x5c\x86\x1a\x78\xe0\x82\x0f\x26\x1b\x9e\x2a\x9f\x36\x33\xdf\x22\x2f\xc3\xd1\x39\xe7\x64\xd0\x2e\xd8\xc0\x6c\xbd\xce\x97\x3a\x61\x71\x9d\x7a\xff\xe2\x6a\xbe\x8e\xc6\x33\x83\xeb\x6b\x4c\xf9\xea\xab\x78\x76\x9f\xf8\x89\x7d\x55\x9d\xe6\x6e\x80\x95\xa2\xb8\x99\x07\x30\x08\x81\x08\xe4\x08\x85\xbd\x0b\xbd\x5f\xb6\xcd\x21\xd6\x56\xf7\x80\xcc\xc9\xe5\xd5\xe6\x64\x6d\xc4\x1a\x38\x39\x43\x2e\x0a\x57\x50\x74\x3c\x86\x31\xab\x65\xf0\x4a\xa9\x60\x8d\x31\x49\x02\x80\x4b\xc4\x4e\x6c\xe1\xea\x20\x13\x2b\xf6\x7f\x0c\x56\x68\xc3\xdd\x37\x83\xf5\xaf\xc0\xd9\xc4\xf7\x15\x01\xbe\x2c\x57\xfb\x8d\x9c\xc7\x0a\x31\x8c\x5a\xa7\xea\x21\x9f\x5a\xe1\x6b\xab\x19\x83\x4b\x50\x1c\xc6\xb0\x67\x40\x82\x2a\x56\x58\xe9\x78\xac\x70\x6d\x44\xbf\x0f\x7c\x0b\x1d\xaa\x30\xa5\xdc\xab\x46\x16\x65\x53\x5b\x6f\xc6\xb6\xaa\x2b\xe7\xf2\xd1\x18\x37\x61\xd4\x48\xc3\x9b\xaa\x52\xd8\x10\xb7\xcc\x2b\x97\xd0\x1d\xda\x9a\xe8\x63\x5d\x9d\xd7\xd8\x9b\x6f\xec\xea\x56\x1b\x94\xd5\xab\xee\xc5\x5c\x76\x02\x14\x16\x1e\xa6\x74\xd6\x34\xe5\x9c\x63\x5a\x2d\xc7\x86\x3d\x97\xea\x50\x3f\x27\x40\x80\x43\x38\x5b\xf9\x13\x02\x85\x53\x73\xa5\x64\xee\x73\x59\x85\x3e\x1d\x04\x15\x16\x14\xc1\x9a\xb0\x5c\xb3\x0c\xd8\x44\xed\xcc\x56\xc7\x4a\x2a\xbc\x8c\xfa\x1f\xa3\xc3\xe7\xf6\xa2\x38\x72\xa9\x10\xc5\xb7\xa3\x83\x13\xa8\x78\x18\xc3\xa9\x0f\x2d\x07\x0c\x60\xbc\xc4\x24\x56\xab\x86\xcf\x24\xd3\x66\x2f\xc5\x30\x6e\x35\x83\x47\xe5\x0d\x48\x8e\xad\xad\x11\x93\x95\x64\x61\xd9\x65\xa4\x31\x9d\xe1\xea\xb0\xf2\x13\x40\x93\xd4\x3b\xb1\x95\xc9\xef\x47\x36\xcf\xdb\xdd\xeb\xc7\x67\xab\x4a\xec\xf6\x55\xb2\x66\x59\x56\xb2\xc9\x14\xc5\x04\x0a\x1e\xa6\xe7\xa4\x0f\x83\x00\xce\xf9\xe3\x5e\x9c\xc2\x89\xfa\x03\x2d\x3c\xd4\xe1\xf8\x9c\xe8\xad\xa4\x25\x1c\xf4\x72\x00\x53\x63\xc6\xb0\xf7\x5c\x19\xc3\x35\x84\xa4\x41\x47\x49\x44\x92\x01\x9f\xd8\x9d\xde\x8a\x58\x47\xbe\xbf\xf4\xde\xd7\x75\xed\xe6\x8f\xc0\x1f\x83\x1f\xdf\xbc\x4d\xc1\xab\x3d\xe6\x8f\xd9\x06\x29\xea\x88\xac\x35\xf7\x54\x0b\xe2\x99\x07\x79\xed\xeb\x70\x1a\x00\x52\xe1\x34\x8e\xa1\xa7\xa0\x38\x84\x69\xbf\x15\xae\xa5\x4d\x5d\x1f\xe8\xbe\x35\x6a\x4f\xcc\x09\xb4\x38\x90\xe7\xc4\x28\xab\xeb\x4e\xf9\x25\x65\x85\x49\x0a\x4c\xe2\x76\x7c\x2b\x93\xbf\x71\xc1\xfe\x9d\x4b\x73\xe0\xc3\x0a\xf5\xfc\xa6\xee\x1f\x07\x6a\x56\x5a\x22\x3c\xa1\x02\xe4\x40\xd7\x07\x25\xf7\xc7\x92\x18\x5a\x58\x68\xf6\x5e\x20\x42\x05\xdf\xca\xaa\xf6\x4f\x36\x6d\x29\x16\x13\xc0\x01\x1b\xad\x3a\x1d\x0c\x2c\x59\x83\x8f\x8a\x09\xc0\xcb\x52\x57\x28\xd6\x1c\xea\xe7\x71\x47\xb7\x28\x5e\x87\x37\xab\x13\x41\xfa\xb8\x42\xbc\x2e\x18\xfb\xcd\x30\xf8\xda\x1e\x42\xef\xeb\x30\x2a\x90\xa4\x43\x1d\x48\xbd\x45\xcf\x49\x18\x08\x40\x23\x41\x41\x1d\xd5\x18\xf6\x33\x4f\x8b\xf9\x98\x76\xcb\xbd\xf5\x71\x3e\x92\x24\x5f\x39\x4a\x97\x22\xde\xed\xf7\x1f\x7e\xfd\xe9\xe3\xe5\x8c\xee\xd3\x68\x86\x7e\x0b\x7a\x30\x30\x47\x2a\xd0\x7d\x39\x64\x8a\xa0\xca\xe6\xdc\x59\x1a\x54\x6e\xad\x70\x6c\x63\x7c\xc5\xa5\x77\xf3\x84\x49\x5b\xf5\x86\x08\xe0\x43\x37\x22\x43\x06\x20\x12\x00\xa6\xc4\xc7\x71\xf4\x6e\xad\x99\x7c\xbc\x52\x3a\x8a\x36\x70\xcb\xea\x18\x51\xf9\xe7\xf2\xd6\x87\x2d\xf4\xfe\x54\xb1\x1e\x17\xbe\x30\xe1\xb8\xe7\xc1\xfa\x63\x10\xa0\x8e\x46\x50\xa7\xac\x0b\x8c\x8e\x10\x62\x89\x6a\x4e\x38\x80\x40\x0c\x80\xfa\xb6\xf5\x21\x9e\xdb\x3e\xe9\x76\x78\xcb\x92\xef\x57\x16\xcb\xb7\x14\xfb\x57\x86\xfd\x3e\x6d\x6b\x50\x85\x81\x69\xa3\xa0\x36\x64\x66\xa0\x70\xdc\x31\xbb\x51\xc7\xa3\x9f\x5b\xcd\xcb\x1a\x8a\xb4\xaa\x9a\x03\x3f\xb4\x71\x4e\xf4\x49\xbd\xab\xb6\xe2\x8c\xbc\x3f\xaf\x0c\x5f\xd1\xe0\xdf\xbd\x59\xf5\x1e\x3f\x7f\xfa\x0c\x7a\xc0\x11\xf4\x24\xe5\x07\xaa\x0f\x9d\xf0\x53\x17\x5a\x0a\xf2\x26\xec\x9b\x30\x80\x1e\x53\x23\x0b\x8d\x37\x5a\xab\x62\xf0\xe1\xd0\x48\xe9\x94\xae\xb1\x2b\x8d\x03\xba\x33\x08\x17\xab\xbf\x18\x88\x9f\x8b\xb7\xd5\xd9\xeb\xe6\x5a\x83\xfe\xab\x13\x03\x3d\x38\x79\x3d\xab\x8c\xbb\x16\x9c\x42\x29\xa5\x14\x25\x93\x22\x94\x19\xb1\x4a\x5a\xef\x0d\x76\xc1\x50\x0a\x1d\x2c\x81\x5c\xe7\xb9\x06\xf9\x8e\x6c\x4f\x51\x71\x22\x01\x1f\x56\xab\x64\x70\xb7\x7b\xf8\x93\xc7\xf7\x1f\x6f\x57\x56\x41\xba\xf7\xdd\xc0\x5a\x9f\x19\xca\x0e\x15\xf1\x48\xb2\xed\x69\xf6\xa1\x74\xce\x80\x26\x48\x57\xc0\x4a\x66\xed\x93\x82\x30\x1e\x6f\x97\x1c\x76\x68\x4b\x92\x3f\x58\x66\x4e\x7a\x93\x2c\xc3\x36\xb6\x9a\x3e\x65\x9d\xcf\x2b\x80\x07\x79\x1a\x5d\xd8\x4b\x90\x58\xb9\x25\x79\x18\x9b\x30\x86\xc9\x01\x74\x0a\xdd\x51\x77\x20\xd9\x2f\xb9\x62\xc4\xf3\xbb\x58\xdf\xfb\xf3\xe4\x5f\x25\xff\x36\xf9\xdf\x93\xff\x3b\xf9\x7f\x5f\xb4\x36\x2e\x8f\x35\xd4\x5a\x01\xb8\x1f\xde\x5d\x01\xcc\x3e\x3e\x14\xab\x40\xd8\x55\xce\xfe\x5a\xad\xfb\xfa\xcd\xaa\xf1\xba\x3d\xd7\xac\x97\xc9\x70\xc5\x1e\x5b\x91\xa4\x57\x6f\x32\xed\xc6\x71\x1c\xa7\xc9\x3d\x27\x20\x39\x9d\x4e\x27\xd0\xa6\x94\x69\x8c\x20\x25\x10\x36\x9d\x70\x45\xad\xa2\xa5\x70\xca\x82\xce\x0b\xc9\x39\xe5\x15\x61\x0a\x86\x29\x2f\x28\x61\x98\x20\x22\x2c\x0a\xaa\x71\x53\x5a\x38\xf7\x65\x72\x99\x7e\xb2\x99\x9e\xa5\x28\x4a\x46\x18\xa1\x88\xb0\x16\x78\x91\x17\x82\x71\x4a\x11\x66\x6e\x67\xa8\xa2\x92\x2a\x29\xe3\x13\x0c\xc2\x17\xa6\x64\x53\xd8\x5b\xa1\xa6\xb0\x44\x6a\x1a\x96\x28\xba\x57\x23\xc6\x64\x05\x2b\xcc\x71\x85\x11\x67\x42\xd7\x75\xfb\x74\xa8\xb2\xe2\xb8\x64\x6d\xac\x2c\x11\x82\x15\x47\x10\x55\x4c\xc8\x72\x49\xc9\x04\xaa\x70\xc5\x44\xb2\x03\xa7\x67\xb1\xa1\x57\x3a\xcf\x77\x17\x64\xc2\xa5\xe3\xb3\x3c\xae\x3d\x39\x53\x0a\xf6\x81\xb8\x18\x0a\xd5\xcc\x50\xa1\x25\x60\x82\x3a\x24\x76\xe4\xb7\x53\x66\x40\x32\x5b\x90\xcc\x06\xe4\x01\x93\x93\x96\xb6\x76\x35\x6b\x5c\x92\xfc\x7e\x0a\xcf\x9a\x80\x6f\xce\x98\xdf\x35\x8e\xf9\x6f\x92\x7f\x95\xfc\xcf\xc9\xff\x9a\xfc\x5f\x3f\x8f\x68\xfb\x63\x70\x96\x0d\xbc\xbf\xbd\x79\xfc\xf4\xf6\xd3\xe7\x87\x9b\x9f\x48\x56\x9d\xb1\xd9\xdf\x7d\xa5\xb2\xfd\xf1\x43\x0c\x1a\x7f\x8e\x97\x70\x77\xf3\x17\x8f\xa9\x06\xa4\x06\x34\x22\xee\x5c\xe8\xea\xb0\xef\x6c\x09\xca\xaa\xaa\xe7\x7d\xc5\xea\x13\x82\x2d\x85\x8c\xf5\x3c\x0c\xcb\xf7\xb4\x23\x52\x8e\xbd\x70\x3c\x6e\x3f\xd2\xb2\xf6\x24\x05\x06\xd5\x93\xd4\x88\x58\x9e\x4a\x02\x75\x49\x10\x2e\x54\x81\x50\x65\xe0\x76\xb4\xd6\x5a\xa7\x94\xd6\xb2\x22\x92\x91\x59\x82\x13\x56\x47\x49\xa8\x0d\xa3\xf7\x3e\x70\xef\x7d\x3a\x98\xaa\x1c\x5d\x38\xb8\xc6\x4e\xb3\x4b\xe5\xd1\xdb\x0e\x20\x77\x28\x0b\x8b\x9e\x70\x75\x70\xb4\xf6\xca\x55\x4e\x17\xd6\xc3\xda\x16\xae\x2d\x0e\x3a\xd9\xa5\xe2\x19\x9f\xaf\x25\x4a\xfe\xbb\xc8\x79\x31\xbf\x03\x11\x78\xc1\x59\x5d\xd2\x85\xcf\x0f\x91\xbd\xb0\x4c\xa5\x33\x08\xeb\xdc\x32\xd9\x3d\xfc\xc9\xfb\xdb\x87\x35\xc4\x78\x2d\x72\x7f\x7e\x00\x97\x7f\x21\x36\x28\xde\x7d\x7c\x78\x73\x56\xf9\x7e\x65\xfa\x9e\x59\x97\xf7\xa9\x02\xcc\x01\x75\xd6\xd7\x74\x2e\xb4\x64\x70\x87\x03\x48\x04\xc6\x8c\x4b\x34\x61\x66\x59\x6d\x41\x31\xa4\xd6\x9b\x7d\x91\x97\x85\x28\x34\xa5\x2c\x2f\x18\x2b\x4b\xcc\x95\x42\x18\x73\x58\x16\x7e\x76\xbd\xdd\xef\xbb\x32\x8c\xa1\x2d\x01\xec\xd1\x92\xe8\xdb\x6d\x39\x27\x95\x04\x09\x28\xcb\x52\x1b\x6e\x4b\x18\x54\xc0\x50\xf3\xd0\xec\x10\xa5\x94\x5a\x21\x38\x6f\x09\x91\x4c\xc1\x4a\x32\x5c\x55\x94\x70\xae\x58\xa5\x54\xd0\xd6\xfa\x72\xea\xc0\xd0\x48\x23\x2a\xa8\x85\x14\x9e\x62\x5e\x56\x36\x0c\x42\x68\x91\x4b\x58\x98\x5c\x86\x51\x11\x8d\x64\x0e\x8b\x12\x0b\x45\x2b\x58\x15\x8a\xc8\xe4\xf7\x52\xff\xcc\xce\xfa\x61\xd7\x7a\xd9\xff\x3a\xf9\x5f\x7e\xf7\xe8\x5d\xd9\x33\x5f\xa5\x2c\x6b\x25\xe6\xdd\xb7\xe1\xf9\xa5\xe4\x95\x3d\x3e\xdc\x9d\x2b\x7a\x0f\x97\x2b\x0b\xdf\xbd\x56\xf5\xb2\xf7\x8f\x0f\x77\x9f\xd2\x06\x54\x1e\xf0\x48\xe6\x73\xa1\xf1\x61\x30\xd9\x10\x78\x5a\x09\xce\x54\x69\x29\xae\x89\x2e\x96\x60\xb9\x04\x28\x28\x9b\x96\x81\x99\x18\xcb\xb7\xa0\x9a\xab\xcb\x2b\x5f\xea\xb9\x01\xbd\x03\x3d\x66\xc4\x16\x65\x40\x73\x0b\x01\x04\x65\x40\x36\xa2\xc6\x07\x40\x4b\x58\x4e\x91\x3f\x42\x88\x8a\x04\x9a\x20\x70\xd8\x53\x5a\xc8\x9c\xb4\x1e\x91\x0a\x9a\x82\x04\x0f\x06\x0c\x12\x8c\x71\x8f\x31\x0e\xae\xc2\xa1\xb3\x36\x74\x52\x63\x84\x48\x61\x0b\xa5\xa4\x94\x61\xa8\x2a\x99\xaf\xfa\xf2\xe2\xec\x51\x50\x26\x7f\x9c\xfc\x97\x09\x4b\xfe\xdb\x84\x27\xff\x63\xf2\x6f\x12\x79\xc9\x6f\x1f\x76\xbf\x04\xdf\x5f\x0d\xc5\x65\xf2\x2f\x61\xf0\xc3\xee\xdd\x37\x5e\xcd\xbb\x9b\xfb\x2b\xd4\xf4\xfd\x45\x0d\x6d\x35\x6d\x7e\xf3\x53\x32\x4d\x84\x29\xc4\xfc\xb7\xd7\x45\x09\x8c\x28\x10\xea\xb9\xe6\x11\x01\x4d\x70\x29\x35\x23\x94\x16\x7d\xfe\xe4\x41\x11\xa1\xb1\xa7\x13\x48\x42\x9d\x17\x40\x12\x0d\x71\x41\x21\x2c\xc2\x44\x1c\x6b\xab\x03\x80\xd3\x14\x46\xb3\x29\xbe\x8c\x2e\x3d\xcd\xe5\xe5\xd1\xc9\x43\x38\x71\x90\xa4\x08\x24\x13\x19\x4f\x3b\x0d\x09\xd6\x56\x72\x28\x35\xe1\x9c\x68\xc4\xa9\x28\x79\x1d\x3f\xb7\x38\x12\xa2\xb1\x24\xba\x82\x2d\xcd\x45\x5e\x56\x86\x2b\xe5\x35\x91\x78\xa6\xb3\x00\x47\xf6\x9c\xd0\xe7\x84\x0d\x4c\x33\x83\x24\x8a\x5c\x9d\x5d\xf4\xad\x6d\x36\xf5\x8b\x46\xda\x3f\x89\xd5\xd5\xbb\x0b\x27\xe4\xe6\xc3\xab\xaa\xd6\xf6\xf1\xf3\x0b\x2c\xf1\x92\xc6\xdc\xbe\xfb\x78\x0f\xde\xfe\x54\x75\x69\x77\xf3\xf8\xdd\x7a\xa9\x6f\xd4\x6f\xf3\x34\x47\x01\xa7\x8a\x34\x1a\xe3\xd2\xd6\xf3\x04\xb5\x71\xce\x82\xe6\xc2\x1f\x58\x1e\xe9\xe0\x10\x68\x78\x65\x5c\x4b\x3b\xef\x6b\xd6\x6a\x46\x60\xa5\x1a\x4e\x38\xaf\xa6\x4d\xed\xc2\x91\x19\x25\x4c\x28\x8a\x5c\xc3\xce\x33\x57\xa4\x84\x05\x19\xf6\x7c\xe5\x92\xcc\x4a\x84\xbd\x08\x6d\xc5\x32\x82\xbc\x0d\xd3\xd1\x72\xcf\xeb\x96\x5a\xe6\xa5\x27\x98\x83\x52\xd4\xda\x9e\x92\x24\x8b\xde\xc3\x22\x13\xc9\x5d\xac\xd9\x45\x9c\xe2\xd7\x35\xbb\x88\x23\xbe\xf6\x1c\x3c\x59\x08\x44\xbd\xba\xe0\xfd\x86\x64\x45\x60\x15\x52\x7a\x9b\xf8\x2f\x83\xf7\x9b\xea\xcb\x90\x71\x44\xb4\x36\xda\x18\x8d\x11\x57\x81\x06\x82\x96\x04\x6e\xb2\x49\x96\x16\xcf\x64\x33\x46\xae\xca\xaa\xd3\x75\xc5\x46\xb8\xfd\x70\xfb\xe1\x26\xa6\x09\x69\x12\x2d\x17\xcf\x1a\xd6\x8d\x69\xdb\xfd\xec\x98\x11\xc8\x12\x64\x4c\xe8\x4f\x14\x14\x0e\xd7\x06\x72\x23\x76\x7a\x30\x27\x1b\x99\xb0\x6d\xe0\xca\x92\xd0\x04\x6b\x4d\x7d\x04\x75\xd9\xb7\xa4\x4d\x36\x29\x7e\x66\xdb\x72\xa7\xaf\x74\x7c\xa2\x4b\x47\x76\x8e\x84\xae\x83\xc1\x73\x38\xf4\xfe\x31\x7e\x8b\xda\xb9\x3f\x5c\x33\x51\xb3\xae\x2a\x47\x4a\xdc\x69\x18\x98\xa2\x18\x52\x42\xc7\x71\xb2\x65\x45\x8f\x25\x94\x14\xc2\x03\x04\x90\x61\x8d\x58\xd8\x6b\x2e\xa4\xdc\x69\xc6\x6d\xd8\xbb\xce\xce\xbd\x64\x85\x2d\x78\x9a\xdb\xce\x35\xde\x12\x3c\xef\x55\xef\x66\xec\x1a\xda\x38\x4a\x47\xcb\xd7\xfe\x61\xa6\x92\x64\xa7\xb2\x2e\xf9\x83\xa8\xca\xf0\xf6\x85\x3e\xf5\xef\x61\x4f\x21\x03\xc1\x41\xd5\x98\xa2\xd0\x57\x42\x18\x56\x2b\x26\x74\xdb\x82\xfd\xe1\x70\x00\x6c\x46\x59\x57\x11\x2d\x98\xa8\x2a\x21\xa8\x0f\x27\x88\x38\x2a\xb9\x10\x42\x70\x3d\x4f\x2b\x5e\x54\x3d\xf3\x6d\xbf\x53\xd1\xdb\xe1\x9f\x26\xff\x22\xf6\x13\xff\x03\xde\x0e\xb7\x3f\xf5\x76\xf8\xba\xff\x7e\x36\x77\xf8\xf1\xee\x5b\x88\x5d\xd6\x50\xa5\x78\x09\x35\x86\xaa\xa0\x82\xba\xd3\x6a\xee\x00\x11\x2c\x4b\x5a\x08\xc1\x0a\x51\xca\xa2\xab\x05\xac\xf6\x20\x0f\x93\x37\x65\x68\x02\x2f\xbb\x7a\x99\x27\x7b\x53\x81\x1c\x38\xa5\x38\x28\x75\x85\x15\x0a\x0e\x57\x06\xe2\x9d\x52\x18\x86\x06\x33\x06\x7d\x57\xe1\xaf\xfc\x1d\x18\x40\x61\xaa\x85\xdd\x07\x41\xa1\x50\x17\x7f\x87\xa2\xfc\xca\xe0\x41\x6b\x46\x78\xa8\xbe\x32\x78\x58\x62\x6a\xf2\x13\x2d\xed\xff\xfa\xeb\xfe\xcb\xc5\x37\x08\x9c\xc5\xb4\x6f\x1e\xe0\xe3\xc5\xfe\xe6\x87\xb7\xb7\x17\xe1\xd5\x75\x2b\x02\xdf\x40\x9e\xdf\xde\xef\x6e\xde\xbd\x7f\x4c\x4f\xe0\xe4\xa3\x9e\x52\xe9\x9f\xa4\x4f\xcb\x50\x66\xe6\x39\x59\x02\xab\xb4\xaa\x4e\xb3\x72\x88\x68\x5f\xda\xbc\xe0\xc7\x76\x8f\x6a\x3b\x64\x84\x6b\x66\xe0\x6c\x96\xfb\x7c\x98\x4f\xf1\x29\x0f\x93\xd6\xe0\x58\xc2\x5d\x29\x84\x11\x61\x74\x1e\x94\xe2\xcb\x00\x8d\x51\xd6\x71\xa6\xfc\xa1\x22\x58\x96\x80\x95\xb9\xa6\x2a\xcd\xe7\xc9\x38\x82\x53\xce\x39\x5f\xf6\x6f\xd1\x0b\x82\x20\x4c\x32\x30\x3e\xb3\x4d\xb7\x53\x2f\x5a\x42\xaf\xfc\xa1\xaf\xe7\xcd\x6a\x93\xff\x26\xee\x15\x6f\xde\xa6\x37\x8f\xdf\x9d\x43\x5c\x72\x72\xc7\xe3\xe4\x31\xa7\xa4\xa4\x04\xa2\x42\x1b\xa9\x55\xbe\x07\xf9\x29\x57\x05\x56\x38\x15\x65\x2e\xf3\x72\xeb\x87\xc1\x0d\xee\x49\x4a\x56\xda\x92\x67\x6a\x9e\x02\xf3\xdc\x03\x0b\x06\x37\x04\x5c\x86\xe3\x84\x41\x32\x36\x4d\xd9\xc6\x3a\xde\x2f\xb2\x29\xa1\x37\xf2\x2a\xde\x5e\xd9\xe4\xe7\xea\xf2\xed\xfd\xe7\x0f\xb7\x0f\x17\x49\xd2\x88\x3b\xb8\x9a\xc7\xd7\x1d\x90\x4d\x99\xa1\xa7\xde\x09\x31\x70\xc3\x43\xe7\x3d\xc0\x42\x4a\xae\x43\xad\x94\x65\x46\x29\x59\x33\x93\xc6\xb4\x50\xef\xc8\xbc\xb7\x17\x43\x22\x80\x42\xf9\xa4\x33\x21\xad\x72\x96\xf0\x56\x18\x7e\xe4\xad\xb6\xac\x51\xb5\x8a\xfa\x1a\x59\xda\x6e\xaa\x1b\xb3\x33\xc9\xef\x27\xdf\x45\x1e\xf8\x25\x98\x59\xe6\xd3\xb5\x44\xce\x8d\x71\x4f\xa2\x06\x13\x31\x04\x87\x91\x37\x47\x7a\x4a\x93\x43\x8b\xf7\xfb\xed\x69\xd2\x7a\x22\x9c\xf0\x46\x18\x2c\xa9\xc4\xdc\x08\x9c\x24\x9b\x94\x3f\xb3\x2d\xdc\x99\xb3\x46\xf5\x5f\x2e\x77\xe7\x5c\xc1\x3c\x57\xd4\xbf\xba\x49\xab\x38\xc6\xb9\xb6\x0e\x7e\xb2\xb2\xa5\xf5\xa9\x80\x1e\x96\x23\xad\x50\xf3\x9c\x4c\x13\xd3\x04\x57\x94\x56\x70\xc9\xd5\xc2\xd4\x40\x44\x40\x49\x2a\x78\x44\xcb\x93\xaa\x70\xa8\x2d\x16\x5a\x6c\xf7\x8c\x56\x5c\xda\xc1\xd8\xd6\x86\x5c\x8b\xa2\x29\x2b\x0c\x7a\xdb\xda\xae\x0e\x4d\xd3\x36\x33\x13\x9a\x6a\x59\x55\x47\x27\x6c\x02\x52\xf2\xec\x37\x87\x9d\x89\x3a\xd2\x67\x14\xd2\x59\x4b\xed\x22\x52\xbb\xca\xac\xa5\x04\xe4\xe6\x74\xe2\x6e\xc9\x0e\x4c\xc3\x27\x27\xc3\xb4\x55\xa0\x08\xa3\x9b\x49\x5a\xce\x22\x34\x98\x28\xc1\x38\x68\xd2\x7a\x3e\xa5\xfb\x15\x53\xcb\xcf\x9e\x56\x7f\x1e\x39\x90\xec\xca\x83\x7e\x5d\x47\x6f\xbf\xbf\x39\x33\x3d\xbf\x7f\x31\xd8\x59\x31\x0a\xab\x74\x52\xd4\xc3\xff\xfe\x87\xbf\x04\x7f\x0d\xce\xf5\x96\xbf\x02\x37\x8f\x9f\xa3\x18\xcb\x1a\x0f\x6c\x9a\xd5\x14\x17\x55\x58\xc2\xe2\xc9\x42\xd0\x14\xc1\x67\x75\x60\x39\x18\x03\xad\x01\xae\x42\x73\xd0\xe1\xc0\x40\x21\x82\x29\x91\x55\xe0\x08\x0e\x79\xb0\x95\xb6\xa6\x28\x74\x41\x43\x77\xe2\xfb\xa2\xaf\xc3\x90\x25\x73\x62\xc1\x14\xf2\x9d\xe6\x9a\x69\xce\x58\x55\xcd\xfb\xa1\x67\x5a\x57\x95\xf6\xb9\x2b\xc6\x01\x9a\xc2\x7b\xcf\x80\x06\x5d\xea\x0e\xb2\x2c\x61\x91\x43\x46\x14\x46\x0c\x15\x32\xa7\x38\xec\x43\x17\xa5\x37\x92\x4d\x4a\x9e\x49\xdc\xef\x56\x0e\xc2\x9f\xff\x1c\xb7\xec\xcd\xb9\xce\x7d\x9d\xf5\x47\xce\xe0\xb2\x8c\x3d\x66\xb5\x87\x10\xc0\xd9\xb5\x88\x5d\x58\x54\xfb\xaa\x3c\x06\x07\x38\x53\x98\x43\x8d\x8b\xb2\x2f\x7b\xa5\x84\x01\x39\xba\x52\x59\x5f\x19\x65\x03\x61\xd6\x05\xe5\x4b\x53\xb0\x3e\x8c\xad\x61\x13\xc8\xad\x4c\x92\x6d\xaa\x9e\x75\xcc\xb5\xfe\x20\x81\xc9\x9f\x25\x7f\x3f\xf9\xa7\xe7\x1d\xee\xe1\x45\x7d\x77\x7d\xbb\xd6\x2e\x6f\x22\x7e\x10\x5c\xe1\xb7\xfe\x18\xbc\xd6\x13\xbe\x03\x5f\x15\x17\x8c\x47\x80\xf5\xcc\x20\x5c\x51\x2d\xea\xd4\x5b\x08\xd4\x1e\x23\x83\x29\xc1\x05\x86\xd2\xce\x72\x63\x42\x9e\x92\xdf\xee\x53\x19\x8a\xd6\x16\x50\x33\xce\x98\x45\x6a\xc8\xe0\xe5\x9d\xe0\x6a\xd8\x69\xe8\xed\x91\xd5\xae\xd1\x72\x0f\x70\x59\x5b\xa5\x58\xed\x6c\xc5\x91\x1c\x82\x76\x4f\x47\xe7\x32\x48\xa1\x16\x56\x1b\xa7\xa6\x98\x46\x21\xa8\x85\x31\xc6\xa9\x03\x97\x53\xf4\xae\x4b\xcb\x1b\x9f\x0d\xc9\xef\x45\x64\xda\x0b\x2f\x41\x66\x74\x66\xbb\x64\x66\x19\x9d\xfa\xb4\xa9\x9d\xab\xdd\x8a\x5d\x7f\x26\x5b\xbe\xab\x5e\x10\x09\xb1\x56\xb6\x16\xad\x2e\xe1\x67\xf4\xaf\x78\xfc\xf5\xe7\xdb\xc8\xdc\xbc\x5d\x1e\x9f\x3f\x3e\xa4\x1a\x88\xaa\x0a\x66\x19\x8f\x83\xc6\xb8\x30\xee\x74\x42\x94\x8a\x31\x36\x89\x8f\x9b\x89\x0a\xab\x25\xb3\x4f\xb2\xc8\x0d\x0c\xe3\x88\x0a\x9f\x67\xc7\x68\x99\x3f\x7b\x38\xac\xfc\x2d\xfc\xcc\xb7\xc5\x4e\x24\xbf\x88\x28\x83\x1f\xa3\xb2\xd8\xfd\xa5\x27\xf2\x76\xc9\xb1\xae\x57\xfc\xcf\xdf\x88\x74\xa4\x1a\xe4\x10\x7b\x02\x4f\xb3\xc2\x69\x79\xa0\x8a\xe0\x92\x52\x74\x88\xde\x5b\x80\x31\xac\x50\xec\x20\x73\x2d\xb7\x8e\x53\x24\x94\x75\xf3\x30\x1f\x24\x2f\x3d\xa4\x29\xb4\xa0\x0c\xa5\x36\xc4\x68\x5c\x9d\x3c\x59\xb5\xb6\xcd\xb3\x8c\xfa\x99\x6f\xe2\xca\xbe\xac\x72\xff\xf0\x45\x8f\xe2\x6b\x85\x94\x2b\x8d\x92\x55\xf5\xe6\xe1\x77\xa8\x8a\x2f\x11\x4b\x7a\xdc\xa8\x10\xeb\x98\xc0\x7c\xe1\x40\x45\xd2\x45\x03\x46\xbb\xfc\xc8\x2e\xef\x88\xa2\x86\xc8\x7d\x4d\x8c\xae\xf2\x3a\x97\xc3\xd1\xa4\xa3\x66\x8e\xaa\xa7\xbd\x27\xcc\x8b\x1d\x75\x75\xa0\x8d\x73\x35\xd8\xd7\x73\x02\xaa\x6e\x89\xde\xf7\xa1\x32\x9e\x79\x1b\x74\x09\x71\x87\x8e\x8a\x32\xd0\xee\x8f\xf4\x78\x28\x51\x18\x5b\xd6\x27\xbb\x14\x3e\xeb\xb8\x6e\x5f\x30\x0e\xeb\x8e\xf5\xa2\x9f\xbd\xac\x86\x31\x1e\x7e\xbd\xc7\x1f\x3e\x7e\x5d\x37\xd2\xdc\xf5\x8e\x73\x31\x33\xc1\x4f\x7d\xfc\xa2\x5a\xd5\xa2\x06\x8e\x51\x49\xf9\x56\xc4\x6c\xa2\x0c\x27\x37\x17\xd6\xa6\xa3\xf7\x01\x37\x01\xd5\xa1\x65\x47\xab\xbc\x61\x52\x2a\x99\x24\x79\x4a\xce\x75\xa4\xef\x92\x2a\xfa\xd4\x2c\xb9\xe3\xff\x94\xfc\x9b\x78\x3c\x9f\x6f\xd7\xbd\xfe\x12\xcd\x81\x8b\xcf\xdd\x57\x97\x75\xbb\x06\xa8\xf7\x57\x7a\x1e\x71\x87\x5b\x0e\xf7\x36\x96\x8d\xde\x2e\xc3\x78\x97\x5d\x89\x7b\xde\x7d\xff\xee\xee\xfe\x63\xda\x5b\x6d\xfb\x5e\xf1\x68\xa9\x09\x11\x4c\x9d\x6b\x3c\xdf\x0f\x90\x6b\x5c\x58\x28\x0e\x8d\x08\x9d\x86\x60\xac\x2a\x80\x19\x15\x1e\x8e\x55\x68\x7d\xd8\xc3\x4e\x0d\x18\x71\x50\x61\xd0\x54\x30\x28\x7c\xf1\x11\x61\x4f\x23\xa8\xd6\x57\xdb\x29\x28\x08\xc6\xd6\x7a\x08\x8d\x24\x26\xcf\xd3\x6a\x24\x5c\x0b\xaa\x61\x41\x14\xae\x05\xe5\x92\x22\x41\xab\xb9\x62\xac\xb0\x79\x25\xc6\xd1\x1b\xe5\x00\xde\xa3\x52\xed\x25\xc2\x34\x9c\xb4\xd6\xc1\xd9\xaa\x24\xd6\xc6\x39\x52\x3e\x93\x1b\x1b\xb5\x3e\xfe\xe6\x8b\xa3\xca\x59\x55\xe0\xfe\x36\xbb\xbf\xbb\xff\xe3\x25\xfc\xbb\x2a\x54\xc4\x12\xf3\xdd\xa7\x0f\x57\x64\x88\x4f\x9f\x2f\x05\x8b\xdb\xd5\x59\xe5\x1c\x03\x66\x6e\xb4\xa7\x0d\xf3\x4f\x43\x56\x09\x1a\x0c\x50\xc1\x81\x46\x4a\x4c\x4b\x47\xc3\xa9\xaa\x8a\x42\xe2\x4a\xe5\xc5\x10\xa6\xd2\xaa\x30\x38\x10\x8d\xd8\x83\xaf\x40\x1b\x4e\xd3\x04\xec\x69\xd3\x05\x33\x1f\x83\x60\xa0\x06\x63\x7a\x0a\x1a\x14\xbe\xd1\x50\x86\x5a\x84\x9c\xd2\x5c\x61\xc0\x7d\x5e\x41\x64\x3d\x5e\x42\x3c\x93\x17\x4d\x48\x52\x23\x80\x10\x85\x0e\xf4\xe2\xeb\xc5\x9f\xeb\xed\xab\xd6\xc6\xdf\xb9\x8a\x74\x3f\x7c\xad\x74\x98\xc5\xaa\x7d\xc4\x0f\x2e\xa3\xe4\xf3\xfb\xc7\xd4\x80\x2a\x0a\x5b\x4f\xb3\x02\x49\x18\x50\xaa\x67\xeb\x01\x0d\x5d\x49\x2b\x89\x2b\x5f\x55\x8c\x94\xa1\x0b\x12\x76\x15\xd9\x0e\x75\x6d\xbd\xb5\x3e\xa8\x50\xb9\x2e\x08\xe3\x4b\x57\x23\x2d\x8a\xd2\x49\xea\x61\x34\xd1\xdb\xa5\x36\xee\xe9\x28\x79\xf3\x92\xc5\xfd\x83\x57\xf6\xc2\xdd\x85\xbd\xf0\xe1\xf6\xfe\xcd\xb5\xc7\xf4\x9b\xfb\x37\x1f\x6e\xee\xef\xae\x35\x54\xde\x5d\xcf\xa3\x71\xa3\x42\x09\x6c\xd0\x69\xfe\x45\x38\x77\x0c\xc5\x58\x64\x0d\x74\x9e\x72\x28\x19\xa5\xc5\x13\x61\x4d\x91\xb1\x30\x90\x4a\x57\x58\x13\x64\x2a\x12\xa8\x2d\xb9\xe3\x40\x91\xc2\x16\x64\x87\xac\xb5\xde\xad\xe2\x8e\xcd\xd3\x41\x07\x74\x2c\x7c\xa1\x01\x04\x3d\x37\xe1\x28\x24\xd6\xbc\x50\x0e\x3b\x0d\xcb\x63\x87\x9b\x7d\xdd\x54\x9d\x5f\xfd\xa1\xc8\x4d\xbd\x13\x2f\x98\x9d\x7f\xf8\xb5\xcf\xc8\x59\xb2\x31\xb6\xbe\xdf\x6e\xcf\x6c\xad\x3f\x02\x17\x44\xf6\xe3\xd9\x2b\x6b\xfb\xb8\x16\x0e\xd7\x1c\x2d\x3d\x6c\xfc\x3c\x21\xd0\x3f\x11\xc0\x50\x28\xb2\x7a\x16\xe9\xf9\x91\x99\x62\xee\x30\x76\x5a\x28\x03\x3d\xac\xa0\x2d\x05\x77\xa7\x30\x84\x03\x06\x78\xc4\x34\x98\x12\xd0\x0a\xda\x0a\x1f\x21\x54\xa4\xda\x09\xab\x9f\xfa\x0c\x2d\x9b\xba\xd6\x52\x86\x56\x87\xd6\x52\x8a\x08\x91\x04\x97\xa4\xae\xbc\x6a\x25\x31\x98\x61\x81\x6d\x45\x59\x25\x68\x59\x41\x82\x71\xc4\xe1\x4a\x70\x8c\xb8\xf7\x5f\x9e\x75\x71\x92\x6f\xf9\x4a\x6f\xee\x6f\x1f\x22\xfe\x22\x62\x00\x3f\xbf\xe0\x3d\x74\x86\xa3\x0c\x71\x3a\xfc\xa6\x49\x8f\x4f\x87\xfd\xd6\x4c\x25\x4c\x8b\xa9\x4f\x8b\xb2\x7a\x4e\xfc\x86\x7d\x69\x01\x07\x2d\x2c\xe6\xf1\x9c\xe3\x18\x23\xc2\x21\x38\x8a\x9d\x23\xc4\xa8\xe0\x08\x21\xc9\x26\x55\x91\xff\x66\xcf\x7b\xea\xdf\xff\xc6\x27\xe8\xda\x8d\xfc\xda\x27\xe8\x7c\x9c\x31\x32\xbc\xbd\x00\x58\x37\xac\x2e\xca\xb4\x78\xea\xb3\xd3\x53\x99\x4d\x05\x57\x90\x94\xac\xac\xca\xfc\xa9\x00\x05\xf4\xeb\x65\x7e\x6a\x41\xe3\x80\x0a\xa7\x06\x20\x15\xc6\xd6\x75\x61\x94\xa0\xaa\xc3\x7e\x67\x21\x46\xf3\x89\x2b\x16\x74\x53\xe8\x82\x8d\x59\x43\x3a\x21\x0e\x42\xcc\xb9\x94\xb6\xf1\xb6\x8d\x2c\xf9\xc9\x19\x77\x48\x40\x56\x3c\xd3\xcd\xb2\x36\xff\x7e\x5c\x8d\x3f\x7d\xbe\x3d\x0b\x34\x66\x85\x61\xc4\x39\xa1\xf1\x0e\x7e\x61\x55\xb5\xe9\xa6\x1e\x1c\x31\xa2\x49\x96\x56\xcf\x74\x5b\xec\xf4\x19\x25\x78\x35\x6b\x6f\xbf\x75\xce\xbc\xfd\xf0\x31\x36\x26\x96\x59\xb3\xec\xdd\x71\x9b\x1e\xc7\x5a\x72\xce\xad\x34\xaa\xb5\xfd\x18\xa6\x5a\xca\x51\x6e\x9b\xbe\xb7\xc3\x7c\xa4\xc6\x18\xcd\x43\x99\x16\xbd\x53\x0d\x28\x53\x38\xcc\x76\xad\x5b\x25\xc9\x36\x9b\x12\x14\xef\xf7\x2b\xef\xf7\x3a\x3f\xfe\x0f\xb2\x7e\x37\x25\x90\x3e\xae\x79\x4b\xc8\x69\x82\xf1\x41\x03\x1b\x3a\x40\x83\x6f\x57\x69\x9e\x31\x3e\x2d\x4b\x86\x53\x33\xd2\xae\xef\x9d\x4e\x7b\x15\x94\xf7\x3e\x90\xa6\x69\x22\xbe\x1d\x3d\xd3\x2d\xdc\xe9\xa8\x24\x7b\x95\xaf\xde\x7d\x13\xf1\xae\xb5\x8b\x37\x1f\x2f\xf5\xcd\x87\xb4\x1e\xfd\x34\xf5\xfd\x31\x34\x80\x13\x45\x05\x94\xb4\x2c\xf7\x70\x54\xa7\xbc\x06\xc5\xf1\x38\xc6\x4f\x6e\x5c\xed\xda\x90\xf4\xa5\x2b\x05\xa0\x41\x76\xaa\x01\xc3\xf2\xc3\x26\xd9\x6e\x50\xa2\x6e\xe4\x8e\x9e\x95\x6c\x51\xc4\x6e\xfc\x70\xc5\xd6\xf9\xf0\x55\xfd\xfa\x22\x1f\x1d\xfd\x10\xbf\xba\x18\xdb\x5c\x30\x4e\x43\x92\xb6\x5c\x43\x38\x0a\x01\x51\xc5\x20\xda\xfb\xd6\x03\x26\x54\xd9\xb6\x80\xee\xe7\x29\x3e\x6d\x5d\x85\x08\xb5\x46\x8b\xb2\x78\xe2\x9c\xe7\x36\xa7\x3e\xa6\xa7\xcd\x86\xe2\x2a\x88\xb6\x6d\x03\x5c\xae\x4e\xf4\x61\xba\x69\x77\x26\xf9\xcf\x12\x98\x7c\x8a\x0a\x31\xaf\x8a\x19\x11\xa5\x7e\x51\xca\x78\xd5\x04\x3e\x4b\xb5\xae\x62\xa0\x9f\xef\xff\x24\x86\xdc\x6f\x56\x05\xd7\x17\x89\xd0\x35\x10\xdf\x54\xa6\x42\x4c\x0a\xac\x09\x05\x05\x28\x58\x38\x84\x71\x1f\x9c\x00\x78\xcf\x29\x57\x62\x4c\xab\xe1\xc0\xfa\x21\x60\x4f\x00\x1c\x04\xac\x40\xdd\xcf\x84\xa4\x7c\x1f\x4c\x51\x54\xa5\x29\xb5\xd0\x14\xb4\x23\xc7\x80\x9c\x9e\x3a\x92\x8e\x7d\x68\x71\xb5\xfc\x66\x67\x38\xae\x18\x21\x8c\x31\xa2\x91\x65\xd6\x30\x4b\x39\xa6\x0c\x2b\xeb\x59\x6d\x1a\xf6\x34\x50\xad\x06\x5a\x55\x26\x1c\xa4\xc7\x7d\x81\x10\xc3\x01\x56\x95\x76\x83\x44\x36\x58\xe3\x19\x28\x60\xfc\xf1\x1a\xf3\xba\x58\xd7\x59\x62\xb1\x3f\x7a\x41\x4a\xdd\x9f\x75\x52\xd6\xf1\xfa\xb0\x76\xce\x2e\x48\x86\xef\x3e\xdf\x7f\x9b\x55\xbf\x3d\x17\x1b\xd2\x11\x60\x3f\x79\x40\xc2\xde\x4f\x3e\x1c\xf6\xae\xc2\x0e\x63\x76\x98\x32\xa2\x99\x66\x34\x0a\x85\xcc\x7d\x0e\xda\xc0\xac\xf7\xdb\x43\xd7\xb5\xed\xda\xfe\xab\x9c\xfd\x72\x4a\x47\x4e\x1d\x40\x83\x7b\xd2\x8a\x17\xae\x80\x38\x93\xdd\x7c\x32\xa0\x8c\x7b\xb2\x8f\xb1\x87\x4e\xde\x24\x7f\x9d\xfc\x17\xab\x83\xc9\xcf\x54\x9f\xae\xe1\xfb\x37\x17\x79\xdd\x17\xfb\xc0\xeb\x23\x7f\x77\x1d\xbd\x4f\xe0\x18\x0b\x4f\xd1\x5d\xd4\x81\x53\x80\x69\x7e\x3c\x56\x5d\x63\x7d\xd9\x3b\x2b\xfc\xa4\xa4\x0b\x4d\x18\x00\x04\x90\x19\x27\x3c\xac\x8c\x61\x9a\x11\xc8\x28\x82\x00\xed\xbd\x72\x6d\xa0\xbc\x3b\xd2\x75\x86\xfa\xd0\x75\x2d\x20\xfe\xa9\x84\x85\x93\xaa\xc8\xb5\x6c\x2a\x23\x8a\x65\x5c\x4f\xbe\xac\x34\x69\x8f\x94\xb3\xb2\x08\x5e\x71\xe8\x60\x85\x26\xe5\x75\xad\x84\xb6\xdc\xd2\x64\x13\x6b\x6e\x3e\x9e\xef\x65\x26\x7d\x38\x5b\xe3\x5e\xa9\xf0\x67\x17\xc4\xf6\x37\x46\x33\xf7\xef\xd6\x42\xcb\x5d\x56\x7a\x90\x7b\x50\xd4\x81\xa5\xf0\x0b\x49\xf3\x20\x4a\xd0\x39\x70\x08\xd8\xd9\x4a\x3b\x6e\xab\x2a\x24\xf3\x09\x45\x87\x0d\x9a\xe9\xd0\xbb\x30\x5c\x79\xcc\x44\x35\x86\x50\x19\x13\x8a\x26\x2f\x11\xf3\x0d\x63\x84\x97\x3e\x87\x9d\x3d\x63\x70\x77\x89\x7d\xa6\x9b\x72\x47\x63\x2d\x0a\x5e\x74\xac\xdf\xbc\x70\xfd\xaf\x13\xa7\xab\x3f\xcb\xfa\x7b\x11\x00\x68\x32\xf4\xd4\xd7\x51\xb5\xbe\xe7\x1c\x22\x48\x97\x0b\x6c\x8c\x72\x4e\xa9\xd1\x18\x90\x18\xb3\xa3\xa1\x70\x7d\x80\x4f\x25\xe3\x85\x2d\x28\x50\x71\x89\xcc\xc1\x34\xef\x37\x2e\xe0\x18\x84\xc4\x47\xd4\x6e\x79\xe6\x9b\x7c\x67\x92\x5f\xc6\x3c\xe3\xe1\xe7\x76\xe0\xd7\xca\xfe\xdd\x95\x26\xe6\xed\xbd\x06\xca\x2f\x71\x11\xe0\x4f\x07\x40\x83\xcb\x8c\x9f\x6b\xb7\x4f\x8b\x79\x4c\x8d\x0f\xcc\xfb\x65\x0c\x6f\x27\x6b\x9d\xb2\x56\x05\x1f\xba\x7d\x0f\x78\x18\x8d\x9e\x85\x10\x69\x1d\xd8\xb2\x27\xec\x92\x3e\xb5\x37\xe8\x7c\x5d\x2e\x71\xce\x0b\x2e\xf9\xf2\xfc\xee\xf2\xbe\xdd\xf8\x2f\xb2\xce\xf8\x53\x13\x4c\xda\xcd\x34\x1e\x43\x96\xa7\xfb\x99\x78\xe0\x83\xdc\xd1\x40\x6d\x13\xcc\xf2\xfd\x02\xe8\x5b\x7b\x18\x6c\xc3\x93\x1f\xe2\xae\xb7\xee\xf0\xff\xfe\x26\x46\x4a\x5d\x09\x01\x8e\x3e\x47\xe9\xf1\x37\x2c\xc3\x41\x51\xa6\xba\x8d\x73\x4f\xc8\xfb\xac\x7f\x42\x1b\x5e\x91\x25\xb4\x6b\xad\x6d\x39\xe1\x7e\x9e\xe6\x3d\x63\x29\x09\x3e\xea\x5e\xf7\x40\xdc\xf0\x9d\x89\xcc\xd7\xbf\x7d\xde\x6b\x97\xcf\x2d\xd2\x97\xed\xe5\x7e\x75\x47\x5f\xd7\x86\xed\xed\xe5\xd2\x6e\x0a\x5f\xc2\xf4\x24\x6b\xe9\xe1\x81\x13\x34\x0b\x26\x65\x37\x97\xcb\xb5\xf5\xa7\xd3\xc6\x04\xe9\xdc\xb2\x17\xef\x0c\x24\xe4\xa9\x0d\x3d\x74\x70\x48\xad\x66\xba\x46\x4f\xc8\xa5\xad\x9b\x4f\x32\x35\x41\x81\x7c\xad\xf7\x1c\x9e\xcd\x96\xbc\xd4\x7b\x1e\x7f\x56\x4b\xe8\x67\x53\xb7\xcc\xd7\x45\x09\x8a\xb9\xa9\x21\xba\x0c\x1d\xe5\x3b\xa3\xba\x11\x12\x8b\x73\x9f\xcb\xb1\xe6\x3b\x0d\x19\x9d\x61\x7a\xe4\x41\xb5\x01\x35\x41\x9f\x84\x33\xb5\x6a\xaa\x12\xd7\x68\x90\x94\x27\xbb\x84\x3d\xe3\x1b\x94\x75\x57\xc8\x87\xfb\x38\x5f\x0b\x70\x56\xf8\x8d\x8f\x2b\x11\x89\xf3\xe6\x32\xf8\xa0\x39\xa0\x9b\x83\x73\xb3\xf1\xfe\x69\xf0\x54\x78\x99\x5a\x49\x6a\xc2\xd3\x93\x66\x35\x55\x59\x17\xaa\x20\xc2\xe4\x07\x80\xc1\xf0\xc5\x6e\xc4\x97\x7d\xe6\x50\x18\x3b\x36\xec\xbb\x23\x3d\x75\xa4\x1d\xe8\xb1\x4d\x92\x9b\x34\x8f\xbe\x54\xe6\x85\x3d\xb0\x6a\x31\x9e\xd5\xbc\xef\xce\x22\xf8\x1f\x5f\xfe\xbc\x79\xad\x1e\x3c\xbc\xa0\x78\x5e\x8e\x32\x7d\xdc\xec\x3d\x68\x9c\x0b\xdc\xc7\x44\xab\x04\xa7\x60\x81\xf6\x17\x4d\x79\x40\xbc\x7f\x92\x4e\xb6\xca\x2a\x90\x98\x82\x1b\x9e\x16\x0c\x5a\x48\x77\xa6\x09\x07\x17\xfa\x27\x9e\xc5\xd0\xc0\x85\x43\x13\xaa\x3a\xe8\xa7\x2e\x23\xc1\x84\xbd\x55\x02\x94\x00\xc1\x70\x9a\xe8\x74\xea\x27\x04\x92\x3e\xc9\xd2\x3e\x72\x45\x4d\xec\x8f\xbd\xbf\x54\x05\x5e\x73\x1c\xb0\xd2\xf4\xd6\xdd\xf6\xbc\x1c\x3e\x7c\xbc\xcf\xb4\x1f\xa3\xee\x7d\x9a\x7f\xc1\x0d\xa8\x99\x56\xbd\xf4\x15\xaa\x8d\xd0\xb3\xae\x97\xfc\xff\x49\x6d\xc7\xc0\x52\xd2\xbb\xe3\x72\xa9\x5b\xa7\x40\x01\x54\x65\x8d\x69\x74\x9d\x26\x4f\xa7\xac\x7c\xca\x59\xd4\x69\x94\x99\x39\xeb\xb7\x24\x6f\xce\xf5\x9f\x6b\xa4\xd9\x45\x10\x49\x82\x0e\x53\xab\xc8\x30\xe7\xe9\x54\xa7\xe3\x5c\x0c\x04\xb7\x18\x83\x76\x1a\x36\xc5\xb2\xdd\x5b\x80\x5d\x5d\xbb\x70\x30\x06\x69\xee\x56\xee\x39\x8f\xfd\x84\x3f\x7a\x39\xb7\x87\x0b\x30\x70\xf7\xa7\xe0\x71\xdd\x51\xa3\x20\x64\x5a\x0f\xbe\x69\x08\x81\x8c\x09\x67\x20\x82\x1a\xb5\xf8\x34\x6c\xa2\xcc\x89\x0f\x1a\x55\x8e\xe0\x90\x6b\xd1\xe4\x15\x06\x4a\x34\x0a\x1c\x57\x2e\xb2\x7c\x66\x1b\x11\x63\xe0\xd7\xcf\x38\x7f\xc4\xcb\x2a\x7c\x13\x9d\x91\x52\xdd\x7a\xad\x6d\xc9\x18\x93\x04\x43\x42\x91\xc5\x92\xb7\xdb\x7c\x09\x43\x5d\xd0\xd4\xe1\x6a\x1e\x22\xa4\x8d\x83\x3d\xf1\x55\x05\xfa\xf5\x33\xd8\x73\xbb\x65\xd1\x1b\xea\xd2\x63\xbf\xbd\xb4\x45\xce\x89\xf0\x6d\x0c\xd9\x63\x4d\x2a\x96\x27\xb1\x2d\x20\xd0\xcd\xe9\xd4\x75\x9a\xc3\xa0\xc3\xc0\xb4\xc7\x28\x9c\x40\x29\x11\xd5\x6e\xa7\x2b\xc6\x6c\xe8\xdd\x60\xc3\x01\x42\xe7\x88\x2f\xd3\x76\xd6\x79\x91\x1e\x1c\x40\x4e\x8a\xe3\xaa\x05\x9d\xf5\xe7\xbc\x7c\x65\x54\xde\x9e\x35\xde\x56\x52\xf1\x6d\xe4\x7a\x5c\xad\xe4\x80\xf3\x9a\x03\x0a\x51\x8d\x21\x28\xeb\x80\xc1\xa1\xf5\xe1\xe4\x3d\x28\xc3\x29\x83\xe1\x14\xd8\x11\x1d\x41\x97\x11\xc9\xb1\xb2\x73\x0d\xfa\xb0\x0f\xdd\xd3\xa4\x6c\x06\xe7\x11\xd8\xf5\x7c\xf9\x33\x8d\x9e\xd3\x7f\xfb\xdc\x11\xfc\x39\xd7\xa6\xdb\x9b\xc7\x1f\x37\x7b\x2a\x54\xdf\x1b\x21\x31\xf1\xdc\x89\x5e\x8d\x53\x8b\x41\xb9\x33\xae\x82\xa1\xf1\xbc\xae\x9d\x5d\x26\x01\x1c\x0f\x1a\x14\xc0\x78\x50\x21\xbf\xe6\x8b\x2a\xcd\x23\x3f\xf9\x0f\x92\x37\xd1\xeb\x34\x01\xe7\x73\x3a\x1b\x4c\x2e\xa7\x73\x07\xbe\x01\x0f\x5e\xe0\xce\xb1\xcb\x9e\x56\x25\xf4\xb8\x04\xf9\x5c\x17\x56\x3b\x07\xf6\x81\x64\xd2\xa3\xb4\x94\xc8\xf9\x3d\x1d\xda\x36\x9c\xc8\xe4\x39\x46\x58\x36\x86\x4a\x85\xb6\x07\x4a\x2a\xce\xe7\x76\xdf\xca\x0e\x20\xa0\xc2\x12\x78\xa6\xcb\x0d\x08\x63\xad\x90\x23\x56\x61\x57\x09\xed\x29\x56\x7d\x75\x30\x6a\x48\x92\x34\x35\x89\xde\xda\xb4\x8d\xfb\xda\x8b\xdb\x54\x6a\xb2\xfc\x69\xf2\xb1\x35\xd0\xce\x07\x0b\xa2\x17\x67\xba\x4f\xc5\xcd\xb2\x3e\xc3\xcb\x1e\x71\x6d\x8d\x0f\x1e\x93\x37\x0f\x51\x7e\x67\x1d\x26\x93\x2b\xab\x74\x12\x8e\x8a\x52\x52\x84\x72\x5a\x07\x23\x01\x6d\x1a\x1b\x06\x35\x5a\xc7\xa5\x3c\x2c\x2b\x32\x9b\xdd\xa9\xf0\xa5\x01\x5d\xe0\xe1\x28\x40\x02\x64\x18\x0e\xb2\x3e\x29\x2a\x9a\x75\x5f\x10\xcf\xe4\xa6\x8b\xbd\xa7\x3f\x4b\x7e\xbd\x72\x00\xce\x72\x2f\xe9\xcd\xe3\x77\xb1\x09\x7e\x7f\x7b\xff\x37\xc0\x8b\xb2\xc5\x9b\x87\xd5\x3c\x79\xb5\xaa\x5f\x25\x46\xd6\xeb\x9c\xfb\xbc\xb0\x8d\xb4\x4a\x18\xd5\x04\x42\xe0\xb2\x0e\xd2\x5c\x1a\xcc\x4a\x4e\x50\x5e\xe5\x5d\x79\x30\x07\x03\x0a\x88\xd3\xae\x36\xca\xf8\x7c\x3c\xa8\xc3\x69\x67\x2a\x54\x85\x61\xf0\x07\x90\x87\xa1\xd5\x00\x02\x63\x6b\x17\x86\xa7\xc3\x73\x52\xf8\x82\x0d\xe0\x34\x37\xc1\x49\x60\x52\x04\xa4\xb3\xea\xa9\xd7\xb5\xed\x4c\x70\xf5\x60\xc7\x26\x49\x36\x60\x7c\xa6\xdb\x7a\x57\xc5\xfd\x6d\x75\x2a\xb8\x2b\xc0\x6b\xc5\xed\x4d\x5c\x3a\x56\xb5\xa8\xdb\x0f\x1f\x3f\xfc\x0a\xdc\x2e\x33\x3c\x63\xcf\x89\xe8\xd3\x83\x5b\x52\xea\x86\xb3\xca\x52\x37\x58\x54\x6c\xca\x7a\xb6\xa1\xd3\xa0\x48\x75\xaa\xe6\x11\x98\x31\x98\xd9\x70\xde\x66\x6c\xe6\x19\xee\x3a\x37\x8f\x14\x1c\x56\x9d\xe5\xfe\x59\xdc\xb4\x69\xfb\x1a\x5b\x44\x0d\xe7\xc8\x0b\xd9\xdd\xec\x22\x14\xf7\xc3\xed\x8f\xef\xae\x26\xdc\xae\x97\xe1\x10\x1c\x31\x00\xeb\xd2\x43\x41\x83\x1c\xa5\x07\x78\xd6\x3e\xec\x7d\xcc\x0e\x52\x67\xbd\xec\x2b\xc8\xf6\x68\xa4\x98\x8a\xb4\x09\xa3\xd4\x33\x62\x2a\x5d\x22\x70\x9e\xa4\x69\x1b\x63\x5f\x93\xfc\xf9\x1a\xf7\xde\x7d\x65\x0a\x71\x96\x6b\x7c\xf1\x12\x5d\x21\xf5\xaf\xbb\x5a\xc4\xb8\x6f\x0e\x3e\x22\xe7\x5d\x50\x69\x3e\x2b\x58\xa5\x58\xb8\xc3\x44\xc3\xf1\x34\x85\x9a\x00\x32\x68\xa1\xb8\x18\x96\x0c\xfb\x14\x77\x37\x06\x5a\xad\x9c\xa1\x3b\x33\x38\x6b\xbd\xa3\xc4\x1e\x8c\x24\x9e\xfa\x9a\xd6\x48\x49\x67\xb0\xf1\x20\x77\xde\x5a\xf7\x54\x39\x29\xdd\xca\xdf\x88\x7b\xd6\xb6\xfc\x36\xeb\xbf\x3d\x2b\x4c\xbd\xe6\x26\xe7\x3f\x6b\x19\xf8\x5c\x0a\x4e\x21\x38\xd6\x29\xde\xef\xe7\x43\x2a\xfc\x53\xe5\xd2\x24\xc0\x33\x81\x0f\xa6\x66\x35\x0e\x7a\xe2\xd9\xf0\x54\x6d\x06\x42\xc2\xe8\xc3\xa0\xe7\x8e\xb1\x94\x6a\xe7\xbd\x31\x66\x59\xcc\xe6\x64\x58\x8f\x85\x2e\xd7\x6d\x5b\x25\x59\xf2\xab\xb3\xb3\xc2\x59\x39\xf7\xda\xf5\xf9\xfe\xd2\x68\xbc\xff\x2a\x28\xe4\x1b\xf6\xa5\x0d\xe3\x2e\x9f\x0d\xb7\x82\x18\xca\xec\x40\x67\xd7\x85\xa1\x75\xd5\xe9\x40\xc3\xb0\x35\xf5\x93\xaf\xeb\x4c\x3e\xf9\x6d\xa5\xb5\x51\x94\x32\xca\x08\x42\xd6\x01\x16\xf6\x08\x1b\x86\x18\xb0\xf3\x38\x7b\x21\x52\x19\xcc\x94\x24\x60\xc3\x13\x17\x7b\x18\x77\xaf\x9e\x02\xbf\x02\x3f\x44\x74\xef\xcd\x63\x72\xfb\xf1\x7e\x23\x40\x15\x95\x88\xf7\x9d\x31\x5e\x8c\x1c\xa0\x30\x6c\xfa\x65\xa3\x73\x5c\x8d\xa1\x35\x20\x99\x42\xdb\x7b\x00\x41\xbd\x6a\x4a\xd8\xe7\xf6\xc6\xee\x54\xd4\x3b\x89\x1e\x3f\x69\x44\x86\x6c\x57\x26\xff\xa7\xc8\xe4\xff\xfc\xe9\xdd\xcf\xfe\x78\xb9\x24\x1b\x57\x1f\xe2\x69\x85\x23\xaa\x9d\x71\xb0\xd5\x4e\x36\x8a\xe1\xd4\xf9\x9f\xfc\x42\xb4\x8a\x3d\xe5\x9b\xd3\x97\x72\x9b\xe3\x79\xf9\x0d\xd2\x02\xdb\x1e\x90\xaa\xf4\x13\xa8\x51\xb0\xa7\xa2\x30\xf6\xe7\x7f\xe7\xa7\xa2\x78\xa2\x7e\x9d\x4f\x3a\x45\xd1\xaf\xfd\x6f\x27\x0f\x91\x21\x18\xf7\xce\xef\xd3\x9b\x3f\x02\x9b\xbf\x03\x6e\x1e\xe0\x55\xfd\xe1\xc7\xb8\xa4\xdf\xef\xc0\x87\x95\x49\x7e\xfb\x90\x56\xbe\xac\x80\x73\xcc\x58\x80\x41\x01\x2a\x34\xcd\x32\x0c\x43\xe8\x09\x28\x3a\xc9\x08\xd3\x00\x52\xae\x34\x0d\x87\x3c\xf5\x35\x28\x8e\xaa\x3b\xd4\x3b\x03\x19\x73\x65\x38\x0a\x5a\x15\xbe\x6d\x99\x27\x96\x49\x46\xd4\xc8\x0d\x33\xfb\x02\xb0\xa1\x71\xd6\x9a\xb0\x72\x38\xd2\x22\xf6\xc1\x74\x52\xae\x11\xc4\x1a\xef\x5c\xeb\xe6\xbe\x5f\xf6\xbb\x37\x6f\xbf\x7b\xf3\x90\xa6\xb5\xaf\x4a\xbf\x24\x13\xb0\x93\xdc\x12\x6a\x47\x31\x69\xa5\x08\xd6\x8d\x31\xb0\xc1\xdb\xbc\xdd\xc3\xb6\x9e\x4f\xc1\x4a\x2d\x38\x1f\x6b\x5b\x1f\xb5\x04\x05\x80\x21\x31\x00\x01\x16\x4e\x49\x9a\xe5\xcf\xe2\xac\x49\xf9\x67\xe7\xa8\xe5\xa2\xcf\xb1\x02\x06\x1e\xde\xdc\xdf\x25\xbb\xd8\x95\x5e\xe3\xf7\x3f\x05\xf0\xfd\xc7\xbf\xf8\x04\xee\xb3\x7c\xaa\x01\xa9\xa7\xa9\x0e\xfb\x7a\x22\x59\x1d\xf2\x41\x9d\xf0\x91\xe7\xfb\xd2\x4d\x26\x34\x7d\x0f\x9a\x59\x6d\x65\x6c\xc3\x15\x61\xf4\xd3\x34\x8e\x61\x6f\x83\x3a\x22\x8c\x44\x4d\x06\xab\x1d\x3d\x01\xb1\x9c\xbb\x7d\x26\x37\x28\xa5\x31\x8e\x4f\xc0\xd5\xb2\x76\x83\x5e\x86\x7e\x4a\xe7\xc4\xd8\x2c\x0f\x25\xe0\xcb\xdf\x69\x80\xda\x91\x8d\xfc\x66\x2f\x6c\x32\xff\x24\xeb\x94\xcf\xcd\x46\xce\xb9\x8f\x0b\xea\xdf\x3c\xaf\x15\xee\x9c\x37\xc1\xe4\xfd\xd9\x9f\x6c\xd5\x9b\xff\x97\xc9\xff\xb0\x7a\x68\x44\x75\xe6\xfb\xb3\x34\xd9\xb2\x37\xfe\xc7\xab\x33\x83\x8b\x8b\xc0\x6d\x74\x3d\xba\x7b\x5c\x16\x80\xbb\xfb\x8f\xdb\x8f\xf7\x77\x9b\x06\xe4\xb9\x2b\x00\x7e\x4e\xc4\x81\x0c\xb2\x1a\x54\x5f\x4d\x33\x5f\x8e\x52\xc5\xd2\xa3\x0a\x6e\x23\x29\x52\x15\x0d\x90\x31\xc2\x0a\x89\x61\x20\x26\x25\xd1\x60\xc1\xbb\x6d\xe2\x02\x73\x29\x09\xcc\x05\x11\xf5\x08\xeb\xe5\xcd\xa6\x56\xc6\x28\xfd\x9c\x50\x2f\x40\xb1\xaf\x95\x39\x02\x19\xda\x03\x6a\xd0\x9e\x50\x42\x49\x18\x42\x8d\x70\xc9\x8a\x2a\x37\x60\x6f\x21\x64\x10\xce\x39\x4e\xd1\xdc\xe3\xe7\x04\x24\xa0\xe2\x9c\x73\x49\x69\x54\x38\xbd\x01\xc7\x67\x7a\xc3\xb7\xfe\x2b\xbc\xd1\x7f\xb5\xee\x04\x5f\xa3\x62\x3f\xde\xdf\x7c\x83\x8b\xfd\xf8\x0a\x76\xfd\xf5\xe7\xdf\xc5\x5c\xcb\x1e\xee\x3e\xbf\x7f\xcc\xa8\x5f\x12\x7d\x15\x9c\x5f\xfe\xf3\x40\x1e\x37\x3c\x54\xa9\x54\x92\x0a\x68\x08\xed\x05\x31\x05\x8c\xbd\x9a\x7d\x17\xb0\x4f\x45\x28\x57\xcd\xf4\x13\x20\x4f\xc3\xe5\x95\xed\x9a\xb2\xdc\x7a\x42\x88\x8d\xc0\xe1\x69\xee\x45\x40\x3c\x72\xfe\x40\xa5\x0d\xc5\x88\x95\xae\xf4\x21\x49\xad\x00\x4c\x08\x11\xfa\xe5\x1b\xb6\xb0\x2a\x23\xbf\xbd\x7d\xa6\x37\xcd\x56\x47\x47\x8f\x25\x56\xf9\xeb\xe4\x1f\x45\x6c\xc0\x87\xdb\xaf\xc9\x1a\xd1\x8c\xe5\xec\x6f\x99\xfd\x04\x69\xf9\xdd\xdb\x4f\x6f\xbe\x16\x48\x3b\x57\xe6\x26\x0f\x90\x14\x98\x41\x89\x71\xc0\x1e\xa0\xb4\x31\x05\x04\x8e\x41\x25\x1a\xe6\xa5\x6a\x44\xab\x38\x2a\xa1\x72\x0a\x72\x52\xce\x4b\x04\x2b\xe4\x3c\x0a\xa2\xb1\x18\x97\x4d\x5b\x33\xb6\xd5\xa1\x7c\x32\x5c\x94\xb6\xa0\x69\xff\xc4\x36\x04\x9c\x2a\xad\x5d\x90\xe1\xd4\x59\xa7\x0e\x7b\x63\xcc\xb1\x1f\x28\xe1\x80\x96\xcf\xc9\xd8\x03\x08\x28\x6d\x04\x57\x4a\x69\xaa\xf5\x3c\x44\x2b\xd1\x24\x07\x51\x9b\x71\xcb\xce\x75\x91\x77\xc9\x9f\x25\x9f\x2e\x4a\xb4\xaf\x5c\xed\x9b\xb3\x76\xfa\x0f\xf7\x1f\x5e\xc0\x64\x57\xd1\xee\xfd\xee\xdd\x59\xf0\xf5\xee\x61\xfb\x6a\xa1\x78\x9f\xb2\x4d\xfd\x45\xb8\xcc\x3c\x99\xe5\x51\xda\xbc\x00\x1d\x73\x3d\xd8\x8f\xd5\x61\xee\x4f\xed\x51\xf6\x35\x41\x28\xd2\x33\xb9\x26\x61\x9f\xa7\xad\xeb\x2c\x57\xda\x01\xee\x9e\x9c\x73\x99\x7a\x72\x5b\x16\x2a\x50\xb2\x89\x0e\xb0\x2c\x95\x14\xc4\x2a\x41\x15\xa6\x15\xc2\x95\xb0\x15\x41\x94\x14\x7b\x41\x89\xa1\xc4\x4f\x41\x23\x04\xec\x51\x26\xc9\x0e\xc8\x67\x76\xe3\xb6\xf2\x6a\x8e\xff\xfd\x2b\xa4\xcf\x57\xd4\x9b\x8b\xb4\xc8\xfd\x0b\xbf\xe8\x87\xb7\x67\x3d\x92\x73\xd3\xf9\xfd\xe3\xa6\x05\xb5\x6b\x5b\x26\x25\x2f\x85\x20\x41\xcc\x65\xda\xcf\xa8\x4a\xcd\x6c\x1c\xe0\xa1\x49\x8f\x9c\x38\xcc\x66\xc5\x09\xc6\xa4\xaa\x4b\x7a\x28\x83\x09\x15\xd4\x12\xd1\x0d\x06\x28\xf4\xee\x49\x47\xbf\x1f\x91\x09\x20\x5d\x33\x1f\x1d\x48\x8a\x6e\x20\xc7\x2e\x08\x5b\xe7\xae\xc1\xdc\x42\xcb\x71\x9d\x17\x46\x25\xc9\x36\xde\x9f\x7a\xab\xce\x68\xe0\xbf\xb7\x72\x44\x57\x11\xe0\x4b\x00\x76\xd6\x74\x81\xef\x2e\xf6\xea\xb7\x91\x23\x7e\x05\x90\x06\x91\xbc\x7c\xdc\xaa\x99\xe4\xff\x3f\x6b\xff\x12\x2b\xb9\x8e\xa7\x89\xe1\xa2\x14\x0f\x75\xa3\xa7\x5b\xe7\xe6\xcd\x4a\x55\xe3\x3f\xff\xd6\xa9\xbc\x59\x29\x60\xc6\x33\x9c\xce\x3a\x99\x44\xf7\x54\x0f\x3d\xb6\x61\xfa\x4d\xc0\xf6\x98\xc6\x8c\x3d\x34\xe0\x05\x17\xb6\x41\xc0\x06\x4c\xc0\x0b\x73\xc9\x25\x97\x5c\x6a\xa9\xa5\x96\x5a\x6a\xa9\xa5\x96\xb1\xd4\x32\x96\x5a\x46\xdd\x0c\x31\x0c\x51\x11\x27\xe3\xe4\xcd\x5b\x55\xd3\xf6\xb9\x57\x27\xe2\x3c\xf2\xf0\x21\x8a\xfc\x3d\xbe\xdf\xf7\x65\x31\x9d\xf3\xa2\x48\x0a\x55\x1d\x41\x46\x7c\xe5\x0f\xfe\xe0\x4b\x0c\x22\xc0\x2b\xad\x04\x3b\xd6\x23\x70\x79\x3a\x8f\x20\x4a\xe8\xb9\xb9\x5d\x60\x6a\xc4\xac\xda\xad\xd4\x25\x9c\x31\x2c\x94\x61\xa8\xb0\x90\x89\xc2\x50\xcc\x19\x54\xbc\x8f\x3b\x58\xfa\x91\x06\x0d\x02\x32\xf7\x84\xc9\xd5\x16\xe2\x17\xb4\x77\x5b\x19\x6d\xa3\xb7\xd1\x6f\xc2\xda\x7a\x0e\xf8\x7e\x78\xfd\x98\xed\x57\x90\xd5\x76\x4d\x06\x3d\x7c\xf8\xb8\x74\x39\x14\xec\xdc\x28\xc5\x02\x1e\xea\xcd\x87\x87\xef\x57\xa7\x61\xfb\xfe\x87\x87\xd8\xa0\xc2\x14\x08\x58\x57\x92\xd6\x9f\x32\xe1\xfc\x91\xf8\x8e\x4d\xb4\xb7\x2c\xf3\x47\x20\x08\x18\x6c\x96\x83\x9a\x42\x85\x0a\x3f\x40\x6c\x8c\x72\x7d\x4b\x47\x29\x7c\xcb\x80\xdd\x4a\x26\xa0\x64\x65\x61\xa4\xf5\x42\x00\xe9\x53\x5f\x37\xca\x80\x14\x1c\x7d\xc5\x41\x65\x8d\xc9\x8d\x36\x59\xcb\x28\x5f\x6c\x4e\x50\xf4\x97\xa8\xf4\x5c\xd7\x15\xa0\xfe\x30\x98\x29\x14\x61\xa5\xa0\xbf\xb0\x3d\xdd\x66\x21\xea\xf5\xfa\xca\xb5\xba\xea\x48\x7f\xb8\x0f\x73\x7f\xad\x01\x11\xf4\xa6\xee\x36\x89\x5d\x53\x51\x21\x45\x21\x65\x91\x7d\x36\x71\x3d\x33\x07\x74\x30\x88\xc3\x15\xd7\xce\xcd\x4a\x99\x96\x57\xa0\x6d\x9c\xb0\xf5\x36\xfb\x5c\x28\x5e\xd4\x65\x81\x37\xee\xf3\x14\x1f\x6a\x8f\x9c\xc7\x55\xcc\xcf\x35\xe7\x8e\x1b\xaa\xb9\x56\x86\xdf\xd6\x91\xd9\x9a\x6b\xff\xde\xae\x16\x69\xa8\x80\xfb\x6a\x63\x7b\xa6\x18\xbe\x8b\x91\xc5\x04\x98\x32\x73\x30\xd6\x3e\xa3\x22\xd4\xdb\xc1\xf9\xf8\xfc\x60\x43\x5d\x8f\x72\x4a\xaa\xb6\xb1\xae\xdf\x1c\x18\x2b\xcd\xf9\xe4\x89\x62\x45\x55\x72\x60\xc1\x50\xfb\xbc\xf5\x9a\xf9\x43\xad\xfa\xce\x0e\xb2\x0b\xda\x86\x61\xaf\xad\x9e\xf7\x9e\xf7\x3f\x51\xa2\xd8\x6d\xbf\xc5\x94\xf9\xf1\xd3\x63\x5c\x6e\x86\xcf\xd0\x2d\x07\xfb\x72\xb9\xcd\xe1\xe8\xc7\x65\xc2\xa4\x54\x32\xe7\x8a\xcf\x3c\xae\x5a\x77\x36\x5b\x3a\x1b\xa0\x85\xaf\xa5\xaf\x2a\x46\xa0\xad\x31\x29\x4d\x99\x5b\xab\xe1\xaa\x81\xe6\x2e\x66\xef\xb6\xf0\xdb\x3c\x1f\xaf\xef\xe3\x73\x2f\x8e\xad\x98\x05\x04\xd7\x4a\x4f\x1c\xc5\xed\x7c\x8c\x73\x9f\x56\xcb\x2e\x00\x8e\x40\x9c\x9b\xdb\xbb\x2d\x3c\x0f\x75\x90\x80\xb3\x35\x18\x83\xf0\x78\xdb\xb6\x6b\xfd\x77\x7f\xc1\xfb\x62\x4b\xa3\x3f\x0b\x3b\xd4\xaf\x42\xbd\xf2\x0b\xc6\xdb\x67\xf9\xf1\x10\x14\xfc\xd3\xc0\x33\xf7\xdd\xd5\x13\x36\x8e\x48\x46\x0a\x46\x91\x27\xce\x2b\x97\x70\xe7\xe6\xde\xe2\xc1\x71\xdb\xa0\xa3\x92\x4a\x98\x2d\xfd\x71\x08\x38\x48\xbe\x39\x9c\xa3\x44\x9e\x5d\x72\x22\x67\x98\x44\xf3\xc1\xf7\xfe\x48\x35\x99\x40\xe1\x0f\xc2\x2a\x6b\xa2\x18\x74\x17\xbd\x77\xdb\x28\x68\x4d\x86\x5d\x26\xfe\x49\x31\xd0\xab\xaf\x68\xcc\xe2\x7c\x5b\xcc\xd8\x49\x80\x00\xc5\xd4\x06\x69\x44\x0f\x7d\x04\x7b\xe7\x79\x19\x67\x55\x9c\xce\xa7\xb8\xfe\xb1\x8c\xed\x3c\x6d\x23\x77\x89\x78\x06\x29\x61\xfd\xc8\x08\xa1\xb9\xd5\xa7\x99\x54\x95\xbb\x44\xce\x81\x50\xcf\xd8\x5e\xdc\x5e\x6f\xc9\xb7\xf5\xf7\xc0\x8b\xb6\x9f\x1e\x63\xb8\xb4\x50\xce\x87\x58\xfd\x68\x62\x3e\x4f\xcb\x97\xc5\x3c\xc6\xd5\x8f\x28\x36\xcb\x97\x9b\xba\xaa\xdc\xe0\xdc\xe0\x91\x72\xfe\xe4\x1c\x48\x57\xbd\x39\x77\x71\x7b\xb6\x4d\x43\x8c\x38\x9c\xee\xf7\x7f\xf7\xaa\x10\x99\x57\x21\xcf\x50\xfd\x88\x97\x85\x0f\x26\x30\x54\xdc\x70\xb7\x4d\xbd\x70\x33\x73\x2e\xae\x9d\x9f\xaa\x8e\xb6\xf5\x5a\xe7\x79\xb8\xc0\xbd\xde\xb4\x6b\xe5\x6a\xd8\xa3\xbf\x44\xe1\x5f\x3d\x5e\x91\xc9\x8f\x71\xb1\xe5\xe7\x21\xcd\xe2\x4e\xd6\xaa\x2e\x1a\x45\x50\x36\x0f\xe5\x61\xd0\xdd\x54\x78\xb5\x69\x9d\x91\x73\xe9\x4f\xb9\x5b\xda\xf7\x9d\x57\x4e\x6a\xe0\x62\x11\xda\x38\x5e\xf0\x3e\xdd\xc2\x95\x9d\xe0\xe3\xa7\x0f\xa1\x91\x7b\x91\xb7\xe7\x66\x18\xd0\x59\x5a\xa5\x59\x6c\xa1\xd2\x82\x97\x4a\xd1\xac\xf0\x69\x79\x9c\xf4\x61\x2c\xbd\x4d\x8e\xae\x69\xdc\x2c\xbd\xd0\x45\x55\x88\x3a\xe6\x5e\x7b\xd4\x48\x0b\xaa\xc5\x9c\x8e\x36\xd1\x78\x11\x1b\xbc\x33\xd7\x78\x7e\xf9\xad\x78\xfe\x2d\x0e\xf1\xd7\x9f\xbe\x94\x04\x7f\x78\xfd\x43\x8c\x9a\x12\x03\x7d\x1e\x8f\xc4\x3d\x2b\xf3\x42\xee\x0f\xde\xd1\xea\x58\x96\xa9\xcb\x8c\xef\x4e\xd6\x01\xb8\x33\x25\xa5\x73\x1e\x1f\x85\x17\xd5\xb2\x7f\x29\xed\x44\x97\x17\x45\xd9\xc2\x49\x11\x16\xab\x49\x44\x49\x3c\x46\x32\xc4\x82\xbf\x8f\xfe\x32\xc4\xd1\xdf\xec\x1f\x5f\x07\xfe\xd6\x2c\x90\x2f\x06\x2c\xc1\x76\x15\x35\x7f\x59\xe8\x1f\x12\x0d\x4f\xb7\xbe\x6d\xa8\x83\x71\x24\x00\x3e\x37\x56\x53\x84\x30\x9f\x40\x8f\x4a\xaf\x0a\x12\x9f\x08\x81\xb4\x60\x45\xe9\x47\x24\x0e\xc8\xa6\xd2\x1f\x7a\xb9\x53\x85\x10\x95\xf6\xc2\xbb\x13\xad\xa6\x16\x18\x54\xf2\x5e\x62\x02\xd9\x25\xf2\x76\x25\xfe\xec\x7d\x9e\xe7\x05\x83\x86\x60\x12\xd7\x51\x04\xe2\xc5\x8f\x2a\x63\xb9\xde\xa7\x87\xef\x7f\xf1\x78\x8b\xd4\x14\xa1\x68\xfa\xcb\x43\xbe\x45\xb3\x64\x80\x81\x56\x64\x55\xc9\xf0\x3c\x79\x64\x92\x81\x73\x66\x0a\xcb\x10\x38\x78\x5e\xe6\xac\x46\x47\x8c\x88\x8c\x99\x1f\x84\xc8\x5d\x1e\xd6\x42\xd4\x47\x51\x32\xee\x74\x94\xad\xac\x94\x61\x0d\x07\x75\xaf\xf7\x0f\x3f\x24\x35\x9a\xbc\x8a\xd1\xdc\x83\x14\x64\x28\x40\x52\x80\xd9\x69\x87\xb1\x87\x6e\x6e\x31\x37\x92\xd3\x6d\x05\x23\x10\x4d\x51\x96\x8c\x3b\x19\xf0\x1d\xab\x1a\xe5\xf5\x6f\x68\xee\x47\x3f\x8c\x27\x7c\x89\x7c\xc5\x00\xdf\x49\x27\xe1\xe7\x1a\x89\x4a\x31\xb1\x65\x45\xb4\x8b\xa3\xa8\xde\xa7\xdb\xfc\xf7\xe5\xd5\x1e\xae\x79\xb5\x87\xc7\xb8\x4d\xd4\xd9\x54\x31\x99\x5b\x5f\x2f\x9b\x67\x05\xa2\x4b\x14\x07\xef\xc3\x2d\x6f\xb7\xb9\x2f\xcc\xe0\xcb\x79\x32\x20\x32\xe1\x73\xb4\x05\x63\x04\xf7\x64\x7b\xc3\xd7\xff\x70\xc3\xd5\x7f\x39\x29\x9e\x95\x11\x02\xf3\x58\xc0\x23\xbd\xfb\xf8\xe9\x71\x5d\x0f\xbf\x88\xd1\x46\x7d\x36\x2e\x21\xe7\x76\xb9\x26\x20\xca\x2a\xcd\x12\x7a\x89\x0a\xd3\x37\xbc\xf1\xc7\x4b\xe4\x19\x07\x70\xf0\x0e\x23\x7f\x8c\x4f\x75\x39\x9f\x8a\xa2\xdb\xe2\x79\x04\x84\xfa\x89\xf8\x86\x66\x45\x61\x0d\x87\xc8\x12\x26\x4a\x9b\x43\x46\x69\x43\x04\x2c\xcb\xd5\xc6\xb1\xd1\xb2\x6f\x99\xc0\x7d\xb3\x58\x9b\xf1\x3f\x83\x77\x8c\xcf\x2b\xd5\xc9\xd3\xbb\xdd\x3e\xb9\x21\xb7\x65\x5d\xe4\x80\x02\xca\x8c\x39\x4f\xc6\xb1\x38\x8a\xa1\x6f\xad\x1d\x36\xe5\xe7\x43\x15\x1f\xe7\x7c\x6b\x60\x51\x9c\xa4\x43\x84\x33\x4a\xec\xa9\x4d\x47\xc3\xfd\x38\x4f\xee\xb8\xc6\xc2\xb3\x88\xec\xf3\xc0\x75\x71\xe5\x75\xff\x7e\xfd\xb4\x79\x73\xc5\x4f\x2c\x33\x74\xad\x9e\x4b\xb0\x83\x49\xea\x49\x16\xc3\xb9\xc9\x00\x3b\x09\x3f\xf9\xd1\x2d\xb7\xd5\xc8\xf9\x14\xc3\xdc\x9f\x88\xd0\xc3\x56\x23\xe5\x6a\xe5\x8a\xb2\x69\xec\x50\x1d\xb4\x35\x20\x75\xb2\x31\x42\x0c\x6b\x7d\xfe\xb0\x2f\xb7\x63\xe0\x94\x8f\xae\xaa\x75\x9f\x3e\x3e\xbc\xc9\xae\xd8\xd6\x6b\xee\x6a\xd3\xbb\x82\xd8\xbc\x70\x48\x74\x4e\xf8\xd2\x35\x3d\xad\xec\x76\x3c\xe7\x45\x5e\x42\x50\xc0\x4b\x54\x61\xcc\x37\xf9\xac\x7c\xe6\x8c\x06\x5d\xf4\x67\xc0\x44\x7c\x0f\xef\x38\xdc\x6e\x67\xf2\x3f\x7f\x46\x38\x7e\xc5\x7e\xf6\xf5\xd7\xdb\x9f\x51\x16\x0f\x65\xc6\xdb\x55\x67\x27\x5c\x60\x8c\xd5\xbc\xd2\x57\xdd\xae\x98\xc6\x62\x76\x26\x9c\xdb\xd7\x6b\x26\x8b\xc7\x42\xb3\xdc\x94\x59\x8c\xe7\x21\x9c\x06\xcb\x85\x3f\x47\x94\xb5\x71\xbe\x32\x41\x2f\xd7\x56\xcc\x03\x30\x78\x40\x03\x06\xf6\xf9\x6d\x5b\x16\x05\x2c\x4b\x44\x24\xe2\x98\x13\x01\x4a\x6a\x6a\x86\x50\x85\x71\x1d\x04\x44\xf6\xc0\x45\x70\xcf\xb7\xab\xde\xec\x97\x0a\xd4\x5b\x2e\xe7\x19\x8c\xfe\xee\x0e\x8c\x7e\x63\xef\xbf\x79\xdf\x37\x42\xa0\xa7\xb7\x2f\xe6\x62\x19\x6a\xaa\x16\x97\xab\xc5\x1a\x62\x0b\x91\x34\xb3\x92\x19\x68\x9a\xa2\x30\x10\x39\x88\x84\x2e\x37\xe6\x12\x01\xe7\x85\xf3\x96\x9e\xa8\xc5\xbe\x02\xd5\xc9\x26\xfc\x5c\xdd\xae\x98\xfb\x7a\x6b\xcb\x3c\x57\x88\x12\x4c\x20\x55\xba\x84\xaa\xc8\xd7\x2f\xe4\x38\xd7\x44\xf7\xbd\x66\xa6\x2c\x35\x01\x35\x1a\xd0\x01\x9f\x08\x89\xfe\x04\xd4\x91\xd8\x93\x67\xfb\xee\x2f\xee\x94\xc7\xa2\x9f\x64\xdc\xbf\xc2\x65\xfd\x84\xe0\xe6\x18\xdf\x2a\x5e\x62\xb8\xec\x1f\x06\x20\xdf\xcf\xd9\x46\xfa\x2c\xb6\xb3\x74\xb3\x89\x95\xcf\x83\x1b\x06\x26\xc0\xaf\x06\xd8\x04\xf8\x96\xfa\x41\x30\xb9\x7c\xf2\xc7\x79\x14\x9a\x31\x2d\x00\xb9\xb9\xfe\xcb\x3d\x30\x11\xd9\x93\xad\xba\x53\xea\xfa\x18\x98\x7e\xd7\x48\xe5\xfe\xc3\xb7\x56\xd4\xeb\xb7\x60\x59\x47\xb7\xeb\x2e\x47\xb1\x9a\xf4\x89\x2e\x21\x3d\x70\x47\xc7\x02\x3a\x54\x00\xe1\x4d\x60\xdb\x5f\x2e\x7d\xee\x2d\x68\xaf\xfc\xfa\xa5\x3f\x78\xa4\x25\x57\x3a\xd5\x82\xad\xb2\xfb\x95\x6d\x12\x01\x4b\x7d\x04\x11\xac\x08\x86\x8c\x9b\x5a\x57\xba\x32\x2c\x29\xea\xda\x8f\x55\xb5\x5c\x9b\x9c\x48\x29\xc9\x25\xa2\x42\x29\x7a\x62\xa7\xa3\x18\x83\x6d\xd3\x47\x72\x4f\xb7\xfc\x6a\x43\x85\xc4\xec\x97\xff\xde\x7d\x78\x39\x8c\x44\x56\x55\x90\xc4\xb1\x40\x7a\x01\x1c\xd0\x81\x43\x30\x90\x1d\x76\x1e\x57\x5b\xfe\x39\x1b\xdc\x68\x47\x5b\xd7\x76\x79\x39\x5c\xf9\x65\xe4\xde\x6c\x65\xf4\xab\xe8\xb7\xd7\xd8\xe4\xba\x03\x7f\xa9\x2b\xdf\xed\x1f\xde\x3e\x85\xa2\xe8\x67\x69\x90\xc7\x40\x51\xf2\x4c\xba\xf2\x76\xf5\xf9\x40\xdb\x17\x99\x29\x40\xe9\x1b\x4c\x9d\xa9\xaa\x26\xe7\xc2\xf8\x23\x02\xd4\x8f\x05\x23\x55\xdc\x1a\x03\x50\x91\x65\xa9\x49\x89\x54\xb0\x4a\xfd\x28\x4e\xa9\xde\xf4\x94\x15\x46\x37\xba\xef\x8d\x81\xaa\x2c\xfc\x69\xc4\x86\x34\x46\x37\xe5\x38\x9e\x03\x56\xb6\xa1\x98\xc7\xdd\x6c\x26\x31\xc6\xc5\x62\xa3\x45\x6c\x5f\x6c\xf1\xd7\xfc\xd0\x7f\xfa\xcc\x0f\xad\xa8\x37\x3e\x4d\x7a\x2f\xad\xa7\xa9\x0c\xfc\xd0\x74\x8b\x0d\xcc\x27\x3b\x8b\xd8\xf9\xc9\x4f\x52\x70\x50\x02\x01\x50\x1e\xec\xf8\xf4\xd2\xed\xe8\xe6\x10\xbd\x8a\x7e\xf5\xbc\xbe\xef\xd4\x2d\x6e\x91\xd3\xed\x9b\x97\xc7\xc1\x2a\x67\x76\x5d\xff\xae\xb7\xc0\xda\x71\xb4\x5e\xda\x3e\xce\x2c\x04\x39\x80\x54\xf0\x39\x12\x92\x81\x03\x98\xac\xd3\xb6\x4a\xcc\x59\x85\xe3\x73\xc3\xb4\xd6\x3a\x08\x53\x95\x10\x36\xcc\x14\x90\x10\x54\xea\xb6\x26\x92\xb3\xd1\x0b\x1d\xe2\xdc\xdb\xa8\xbb\x54\xbb\x74\x73\x7c\xc6\x42\xfe\xf6\x66\xc5\xdd\x19\x49\x57\xe1\x88\x0f\x77\x76\xdd\xc3\xf3\x33\x99\xbd\x80\xa6\x3e\x3d\xc6\xac\xca\x0b\x90\x72\x41\x78\xae\x31\xee\xbc\xc6\x00\x75\x9e\x18\x0b\xd1\x5d\x41\xda\x10\x67\xa0\xf7\x1d\xe0\xdc\x21\x9a\x53\x4c\xca\xcc\x57\xcb\x33\xbb\x39\x16\x08\x7e\x1e\x29\xcd\x75\x86\xa7\xb1\xd1\xaa\x95\xb1\x22\x7e\x14\xbe\x97\xbe\x93\x71\xe9\x71\xe7\x69\x93\x99\x8c\x9f\x40\xd7\x45\x5b\xa0\x2e\xdd\xf6\xb0\x99\xfe\x68\x9e\xac\x87\x67\x78\xc5\x4f\xb6\x11\x05\x26\xd7\xe5\xd0\xa0\x42\xfb\x12\x1c\xa4\x08\xf8\x26\xe2\x3b\xe7\x1b\x07\x8e\x3e\xab\x7e\x1a\x54\xdc\x20\xe7\x28\x2e\xa9\xd0\x6a\xc6\x2b\xaa\x11\xf9\x63\x48\x5b\x6b\xe5\xad\x94\xd2\x57\x52\xae\xda\x92\x20\xbd\xf4\xdb\x76\x63\x83\x57\xf1\xe6\x2a\x37\xfc\xea\x26\x3b\xb4\xdb\xbf\x8f\x92\xc2\xd1\x98\xfa\xe3\x1c\xd1\xb8\x3d\xf9\x94\x4a\x6a\x31\xe7\x52\x02\xb1\xb1\x65\x25\x67\x3c\xb8\x3a\x86\xa9\x30\x96\x69\xcd\xa9\x02\xd9\xaa\xcd\xce\xf6\xfd\x56\xac\x3c\x42\xdb\xef\x5e\x7d\x88\x93\xcd\x76\xff\x03\x08\xa8\xc7\x1f\x12\xd0\xd5\x20\x63\x69\x95\x2a\xc0\x62\x45\xe6\xce\xab\xd1\x17\x32\x4e\x1b\x3f\x1d\x37\x95\x3f\x8d\x20\x07\xce\x97\x7e\x38\x19\xa7\x41\xea\x49\x67\x3a\xa0\x7b\x80\xa3\x38\xea\x2e\x66\xdb\x6f\x75\xb4\x5d\x11\xbe\x31\x78\xbf\x7c\x8e\xc0\xfb\x28\x51\x55\x3d\x37\x3c\x4e\x63\x5e\x11\x4f\xbd\xd0\x49\xb4\xd5\x73\xe9\x8d\x05\x30\x36\x3e\x9b\xa1\x1f\x4c\x9c\x05\xfe\xd8\x48\x5c\xc8\x46\xef\xf4\x9d\x9e\xf8\xb5\xce\xf9\xd5\xb3\xe2\xdb\x8d\xb7\xe2\xe9\x9a\x91\xdb\x3e\xbd\x7d\xfd\x75\x5c\xe4\x5e\x00\x50\x30\x57\xd9\xde\x56\x95\xcf\xab\x24\x3a\x0b\x16\x1f\x7b\x5f\xae\x8f\x01\x9b\xeb\xdb\x05\x46\xc5\xb9\x90\xfe\x28\x75\x23\xaa\xed\x51\x4a\xe7\x9c\xb3\xc3\xe0\x27\x03\x1c\x63\xcc\xab\xf3\x14\x97\xdc\x0f\xcc\x1f\xd8\x91\x50\x2d\xb0\x60\x82\x18\xb8\xde\x33\xb4\x2b\x40\x1f\xea\x22\xd7\x98\xc8\x3d\x1e\x7b\x45\x9b\x82\x01\x88\x2c\x75\x59\x4c\x52\x6d\x58\x9d\xb7\x1c\xc2\xd4\x23\xeb\x31\x03\xdc\xf8\x11\x20\x4c\x33\xed\xfb\x26\x33\x29\x36\x7e\xa4\x06\xd7\x51\x94\x24\x22\x68\xb2\xea\xc0\x84\x89\x9e\xcf\x94\xe7\xd4\xe9\x0d\x3a\xf0\x2a\x60\x5f\x43\xc6\x61\xf7\xfa\x5b\x22\x0f\x9b\xe5\xb8\x6e\xb9\xc9\x72\x70\x12\xae\x69\xd8\x50\xd7\x97\x08\xf6\x96\xe7\x39\x53\x9a\xce\x14\x14\xa9\x4b\x41\x9f\x72\x47\x45\xae\x28\x4c\x8b\xd4\x0f\xc8\x2b\x06\x58\xe1\x4f\x1b\x85\x11\x1f\x00\x2d\x28\xb5\x07\xcb\xa1\x25\x52\x51\x83\x39\x03\x39\xd4\x5c\xdb\x39\x25\x94\x92\xf9\xd8\xe7\x55\x8e\xd5\xc9\xcb\x5e\x37\x01\x36\xb0\xac\xbd\x18\x25\x7c\xc5\xca\x3c\xe3\xf6\x5e\xb2\xb5\xdf\xc8\xda\x2d\x28\xab\x00\xdf\xce\xb5\xa1\x2b\x0d\x3b\xbe\x44\xb0\xb2\xfe\xb0\x75\x87\x83\xeb\x90\x2e\xf3\x56\xb2\xd2\x96\x4c\x42\x9b\x17\x87\x65\xdd\xa8\x0b\xdd\x9a\x9d\x0e\x1a\x68\xff\x5d\xf4\xaf\xa3\x7f\x1b\xfd\x9f\xd1\xff\x15\xfd\xdf\x81\xdb\xea\xd5\xcd\xd1\xdb\x7f\x49\x9c\xfe\x84\x71\xae\x78\x77\x93\xd4\xdb\xaf\xb2\x30\x4f\x8f\xef\xf6\x8f\x9f\x56\xd0\xf5\xc3\xdb\xd7\x5f\x28\xa5\x43\x2a\xe2\xed\xa7\x2b\xc9\xcc\xa7\x2f\xbf\xf0\xcd\x9f\x27\xdd\xdc\x41\xad\xb2\x58\x48\x40\xe6\x03\xc6\xa4\x36\xbc\x72\x6d\xcb\x5c\xc5\x79\x0e\x73\x54\x16\xb9\x9f\xbc\x29\x01\x01\x24\xcd\x1a\x5f\x21\x40\xab\xa2\xb4\x3d\x03\x51\xef\xd3\x24\xf3\xa2\x88\xb3\xe2\xcc\x8f\xfa\x78\x84\x45\x9a\x72\x82\x64\xd1\xfb\x63\xae\xc5\xd1\x70\x3e\x8a\x6e\xf9\x49\x59\xe6\x82\x40\x51\x0c\x7e\xca\x95\x3c\x6a\x21\x8e\x7c\x5b\x30\x90\xa2\x92\x1f\x54\x51\x52\x48\x05\x41\x58\x59\x43\xb5\x4e\x75\x46\x70\xda\x96\x66\xc8\x73\x8b\x25\x52\x59\x86\xa0\x2c\xb1\x3a\x60\x7c\x2e\x08\xf1\x46\xa6\x59\x96\x42\x2e\x21\xa5\xa9\x49\x8d\xb2\xd6\xca\xeb\xf7\xf3\x97\xdf\x5e\xeb\x23\x2e\x64\xab\x77\x36\xfa\x75\xf4\xcf\xa3\xff\x3c\xfa\x37\x37\xb5\x91\x87\xc0\xab\xbf\x3e\xb1\x57\x88\xcd\x72\x70\x5d\x19\x27\x56\xac\xf8\xfd\x0f\x6f\x6a\x5f\x5f\x19\x18\x20\x94\x90\xdd\x81\x02\x20\x2a\xc0\xe9\xf3\x81\x51\x5d\x49\x27\x09\xc4\x10\x4a\x42\x90\x30\x3c\xce\x8b\xb2\xef\x64\xdf\x68\xc6\x28\x91\x54\x31\x4b\x14\x09\xa6\x5e\x38\x56\xa8\x6f\xcc\x7c\x00\x85\x31\xc1\x92\x9a\x40\xe6\xc7\x9d\x65\xc2\xf8\x8c\x3b\xc5\xb9\x22\x98\x13\xe4\x87\x93\x65\x18\xfa\xc8\x4b\x0a\x2c\x18\xe3\x9e\x62\x2f\x38\x57\x4a\x6a\xcd\xfd\x11\xe0\x5a\x73\x5d\x7b\x44\x35\x57\x42\xb5\xf1\x44\xce\x7d\xa7\xb8\xe2\xd1\x2e\x92\x17\xb6\x4d\x03\xf7\xc0\xaf\xa3\xff\x28\x54\xa2\xfd\xab\x1b\xf7\xc0\x33\x76\xf9\xfd\xc3\xc7\x77\x2f\xf3\x5c\x2b\xf9\x40\x72\x55\x2b\x5d\xb9\x07\x82\x23\xfe\xee\xca\x3c\xb0\xfb\x96\xba\x4f\x4c\x69\x53\xf7\x5c\x49\x2c\xb3\xd4\x76\xe4\x00\x58\x5c\x10\x02\x59\xc1\x8b\xd2\xe5\x86\x89\x4c\xe5\x2e\x1f\x7b\x6e\x8e\x21\xc5\x57\xe7\xbe\x98\xdb\x1c\x1c\x17\x43\xed\x20\x0d\x05\x75\x06\x1a\xa5\x4a\x50\x98\x12\x6a\x34\x9f\x28\x34\x10\xef\xa4\xa6\xa5\xef\xa5\x21\xae\xc6\x79\xc1\x09\x8b\xd3\xbc\xf0\x88\xd0\x5c\xe7\x10\x40\x7f\x90\x92\xf7\x5e\xc0\x5c\x59\xc9\xb9\xb2\x7e\x84\x86\x40\x0b\x01\xb4\x0a\x63\xa4\x5b\x45\x71\x39\x4f\xa5\x24\x84\x10\x2e\x03\xf5\xc0\x75\x9d\x64\x1b\x15\xfd\x59\x94\x05\x1f\x37\x5a\x2d\x87\xc5\xcd\x7d\xb3\xff\xf5\xf6\x05\x74\xf7\xe9\x31\xae\x7b\x7f\xe4\x40\x77\x26\xcb\x40\x79\x60\x87\xb9\x5b\x9c\xae\x78\x74\xf3\xd1\x05\x0e\xf4\xc4\x0e\x46\x0f\x13\xcd\x33\x5d\xe9\x9a\x1b\x35\xd7\x5c\xc4\xdc\xdb\xe3\xca\x5f\xcf\x2e\x68\x6f\x93\x28\xfa\x93\x60\xc7\x5e\xb5\x47\x9e\x1e\xc0\x8b\xed\xf9\xcf\xc1\xf6\xfd\x0f\x1f\x3f\x3d\xee\xed\x8f\xf0\xa8\x07\x90\x6f\x8e\x99\x76\xbc\x2d\x06\x81\x50\x36\xf7\xd9\xb0\xf8\xb8\xa8\x4b\xbd\x4d\x22\xeb\x4f\xfe\xe8\x4f\x7c\x98\x80\xf3\x47\x4f\x8e\x45\x55\xa8\xd3\x38\x72\x43\xd6\x9a\x8d\xc8\x5c\xd0\x86\xef\xc8\x55\xfd\x66\xff\x10\x5c\xea\x00\x8e\x0a\xbe\xf4\xc3\xf6\xfd\x0f\x9b\x94\xd4\x5d\x0a\xb4\x57\xd8\x0b\x05\x24\xf2\x1c\x34\xa9\xb7\x08\x1c\x76\xc4\xc0\xd2\x2b\x8c\xdc\x6c\xfc\xa8\x40\x14\x17\x8e\x60\x40\xb1\x43\xd1\x26\x92\x91\x0b\xfc\x38\xab\xba\xce\x87\x9b\xf6\xc5\x8a\xc4\xb8\xaf\x0a\x03\x6f\xbe\xc9\x44\xbb\x18\x3b\x1f\x65\xac\xed\xe4\x62\x77\x1a\x00\x32\xd4\x12\xb3\x4d\x2d\x33\x42\x5e\x22\x57\xe2\xc1\x4b\xd0\x7a\xe2\x42\x92\x58\x8e\x88\x18\x49\x2c\xdb\x0c\x37\x1d\x60\x1b\x67\xca\x32\xab\x29\x35\x5a\x48\x8f\x91\xa0\xb6\x31\x5d\x67\x1a\x4b\x29\x55\x4a\x5c\x79\x50\xed\xce\xed\x50\xf4\x5d\xf4\x8b\xe8\x2f\x83\x7a\xe2\x72\x5a\x3d\x03\x23\x9f\x1e\x3e\x7e\x0a\x54\xce\x01\x4f\x7c\x2b\x2a\xf9\xfe\x45\x16\x14\xf4\x9b\xac\x3b\x71\xae\x72\x88\x58\x57\x9d\x0f\x25\xd0\x7e\x31\x59\xe3\x86\x51\x02\xbd\x8d\xa3\x46\x70\x49\xb9\xd0\xcc\x32\x26\x76\xa8\xd2\xea\xac\x09\x71\x69\x9e\xb4\x9c\xf9\x61\xce\x2c\x18\x18\xe3\x8b\x89\x8b\x7c\x63\x9c\x34\xda\x0a\x2d\xb5\x52\x51\xe0\x77\x34\x3b\xbd\x2b\x6f\x2c\x0b\xaf\x77\xdb\x2b\xab\xe5\x0a\xd1\xb8\x7b\x38\x37\xcb\x89\xb0\x74\x79\x75\xcf\x80\xdd\x4c\x93\x1f\x8f\x35\x1f\xfc\x08\xe0\x81\x0f\x07\x46\x39\xcf\x08\x87\x7e\x1c\x29\x90\xe3\xb1\x3d\x17\xaa\x73\xa2\x6a\x76\x65\xed\xcc\x40\x8d\xb6\xb2\xa8\x9c\xae\x94\x3f\x11\x9a\x56\x59\x01\xd0\x41\x56\x75\x03\xac\x14\xfe\xa8\x2a\xdd\xe8\x28\x02\x71\x15\x37\x7b\xb9\xa3\x81\x89\xef\xcd\x4a\xf0\x77\x97\x43\xd8\xed\xdf\x17\xbb\x86\xf6\xc7\xc0\x0e\x3e\x7d\xee\x40\x33\x4f\x71\xd6\x0e\x10\x8c\x3b\x6a\xca\xfc\x60\x47\x6b\x47\x3b\x64\xe9\x8a\x67\x8a\xb3\x4b\xb5\xd5\x9b\x2e\x4a\xae\xd1\x90\x15\x43\x74\xf7\x88\x05\x7b\x3c\x4b\xe4\xd9\x26\xa5\xf5\xc8\xda\x1b\x45\xe9\xa6\xb3\xed\xb9\xa4\x34\x39\x78\x3d\xcd\x6e\x5a\x39\xc5\x4f\x17\x16\xea\xf1\xbf\xaa\xf7\xfd\x62\x97\xdd\xea\x7d\xb7\x3f\x57\xef\x5b\x08\x77\x72\x42\x88\xf3\xa4\x05\x88\x4e\xe1\x83\x18\xe9\xb8\x5d\xac\x2c\x49\xf9\xd6\x8d\xe3\x38\xda\x73\x6b\x6d\x42\xba\xce\x47\xdd\x7c\xea\xbc\x62\x83\x52\xa6\x62\x4a\x2a\x15\x6d\x23\x73\xe1\xfb\x72\xcb\xef\xf4\xe9\xa3\xab\xd2\xe2\x5d\xc6\x25\xa4\x37\xb3\xfb\xc8\xf6\x35\xb9\xf9\xc3\xcf\x55\x51\x26\x95\x1c\xfd\xb8\x6c\x94\xc9\x10\x44\x19\x45\x0c\xcf\xa4\x2c\x37\xad\x6a\x89\x2c\x2b\x4c\xf3\xe2\x33\x37\x42\x8c\xb5\x03\x24\x6e\x39\x36\x88\x37\x0c\x39\x48\xe7\xa3\x91\x52\x1b\xd0\xd1\xa2\x2a\xc8\x96\x2b\x52\x08\x23\xa5\x91\x76\x56\x08\xfa\x28\x58\x45\x0c\x44\x12\x19\xd6\xc5\xbc\x3c\x73\x65\xa8\x51\xa5\x76\xa4\xd2\x90\x1e\x8d\xac\xaa\xba\x86\x5d\xb5\xec\x21\x49\x1b\xa1\xdd\xb8\x45\xab\xf7\x7d\x5d\x05\xdf\x54\x1a\x79\xfa\xb0\x39\xba\x10\x80\xc2\x9a\x49\x21\xb9\xb2\x03\xef\x9c\x54\x52\x2a\x55\xf8\xac\xdb\x22\x63\x9d\x2a\x2f\x11\x5b\xbe\xa3\xb4\xd4\x5c\x49\x41\xd9\xf2\x2c\x84\x7b\x1a\xb9\x0b\xde\x8b\xe7\xf8\xeb\x0d\xef\x7e\x67\x51\xaf\x67\x79\x00\x52\xde\x29\x78\x81\x7a\xd3\x7e\x26\xd5\xca\x59\x78\x36\xa0\x87\x79\x92\xfd\x0e\x26\x59\x5e\x80\x0a\x40\x90\x11\x3f\xfa\xd1\x47\xfc\x12\xf9\x9e\x82\x7c\x9b\xcf\x08\x34\xc6\x33\xe7\x7b\x42\xad\x45\xd0\x8f\xb2\x72\x9d\xd0\xaa\x53\x8e\xad\x76\x62\xbb\x31\x7b\x1c\x34\xfe\xa2\x5b\xea\x6a\x8f\xeb\x1f\xfb\x7a\x07\x3d\x0b\xe5\x79\xeb\x1e\x5b\x5d\xc8\xde\x6c\xa6\xe8\x3f\x7c\xe6\x13\x7e\x13\x4e\x91\xef\xb6\xfb\x1f\x92\xdd\xfe\x4e\xfc\xf5\xe3\xd3\x6f\xde\x2f\x1e\x14\x58\x26\xee\x27\xf3\x77\x35\xfa\x1e\x81\xda\xa6\xf3\x01\x42\x85\x41\x7e\x10\xae\x73\x00\x2b\xdf\x56\x45\x89\xb4\x62\xb6\x74\xaa\x2c\x53\xaf\x7d\x4a\x63\x04\x54\x5e\x5a\x57\x16\xa6\x28\x9b\x8e\xf4\x15\x84\x1a\xc1\xca\x95\xe8\xe4\x1d\x05\x87\xe3\x7c\xda\x4c\x16\x96\xaa\x92\xad\xd4\xdc\xcb\xde\x9e\x40\x93\x65\xdd\xd8\x75\x45\x5d\x4a\xc9\x99\x6f\x6a\xd7\x00\xca\x89\x62\x98\x50\x42\x28\x36\x88\x22\x4c\x31\x61\x0a\x21\xc7\xb4\x6c\x96\x31\xba\x0b\xda\xcb\xad\x7d\xae\x03\x09\xe9\xa0\x2f\xd9\xac\x1b\xfa\xff\x4a\xe9\x9e\x98\x1a\x91\x78\x3a\xb7\xca\x02\xb3\x66\xb4\x4e\x73\x5a\x9d\xbb\x04\xcf\x75\x59\x2d\xfe\x85\x61\x5b\x5b\x18\xe9\x1a\x3d\x4d\xae\x0f\x65\x00\xae\x77\xa6\x76\x26\x9c\x95\xe6\xc2\x76\xa7\x6b\x1e\x33\x02\xfb\x2f\x68\xda\x8f\xaf\x1e\x83\x0d\x1d\xf2\x79\xb2\xd8\xd4\x65\x35\xe8\xae\x38\x2a\xc1\xb3\xcf\x5c\xd4\xc5\x26\xfd\xdd\x69\x5b\xfc\x38\x26\xfd\x71\x36\x7e\x2a\xaa\x72\x00\x26\x3e\x66\x9d\x9b\x87\xa0\xd3\x13\xd9\x0b\xdd\x37\x1b\x1e\x22\xbe\x6b\x3e\xe5\xd5\x9b\xe5\x08\x5e\x33\x19\xf1\xf6\xfd\xc7\xef\x9e\x1e\xb6\x6d\xa9\x04\xca\xea\x4c\x8d\xbd\x98\x0f\xa3\x3f\xa9\xe3\x61\xc3\x3f\x9f\x60\xc1\x40\x54\xf8\xa1\x22\x32\xa9\x3c\x3f\xf9\xda\x18\x09\xc8\x09\x1c\x96\x3d\x33\x8a\xcc\x76\xda\x8c\x61\x77\x0b\x16\xfe\x3d\x1d\xeb\xaf\xdf\xc7\xf6\xd0\xd5\xc2\xa9\xa6\xae\xa4\xab\x7a\x3f\x49\x90\xb5\xfd\x61\x53\xd5\xfd\xe1\x50\xfa\xd3\xa9\xed\x75\xdf\x1c\x3b\x75\x18\x87\x7a\x99\x07\x99\xa0\xbd\xdc\x9c\x02\xe7\xee\xb3\x7e\xdd\x9b\xfd\xaf\xdf\xc5\xc6\x1d\xbd\xe3\x00\x25\x2d\x80\xa3\x1e\xfd\x61\x73\xa2\x9d\xb6\xdc\xd9\x5a\x77\x6e\x19\xa7\x0e\x58\x18\x1e\x72\xe3\x6f\xae\xb9\xcf\xe8\xd5\xb5\x5c\xed\x9a\xe3\x8a\x57\xac\xed\x6e\x1f\xdc\xb2\xed\xfb\x1f\x12\x52\x8d\x23\x68\xc0\x41\x28\x03\x8a\xd6\x61\xa2\x35\x32\x43\x51\xa6\x55\xaa\x7d\x3f\x6a\x67\xe9\x3c\x09\x70\xa0\x8b\x9b\x40\xb7\x1c\x7a\x57\x65\x44\x49\xe6\x4f\xfe\xc0\x84\xc8\xb3\x39\x28\xbd\x8c\xc8\x9f\x34\xe6\x71\x9b\xa5\xb3\x39\xd9\x21\x8e\x32\xdd\x45\x51\xf4\xa7\xa0\x0f\x3a\xd1\xfc\x39\x8e\xfa\xcf\x42\xa4\xf8\xef\xa2\x7f\x15\xfd\x0f\xdf\x88\xa4\xbe\x7e\x7c\xb8\xd2\x75\xec\xd7\x82\x83\x9f\x70\xc5\xdd\x76\xf7\x8f\x9f\x9e\xde\xbe\x80\xb1\x07\x96\x93\xc0\xcb\x77\x25\x8b\xdb\x6d\xa6\x98\xce\x8d\x06\xc4\xb7\xe7\x7e\x79\x1b\xa2\x98\x9b\xfa\x33\x07\x3a\xcb\x7d\x0d\x26\xa8\x28\xcd\xb8\xf3\x2a\x67\x4c\x5a\x09\x54\xdb\xb6\x2d\x67\x6d\x9c\x2f\xc3\xc5\x05\x97\x7a\xb1\x42\x18\x21\x9a\xa3\x12\x0a\x21\x20\xc6\x79\x93\xee\xb8\x37\x5a\x29\x6f\xb5\xf2\x9d\xf1\x87\x12\x2a\xc9\x95\xcf\x32\x59\x74\x8e\xda\x34\xa6\xd4\x73\xdf\x51\x40\x81\x8a\xf1\x2c\xa4\x6f\xa4\xaf\xb3\x9c\x25\xa8\xac\x95\x9f\x02\x97\x9c\x53\xb4\xd4\xb4\x12\x56\x52\x90\xe1\x4a\xd9\x03\x8c\xfe\x2c\x46\xa1\x76\xe5\x4b\xad\xd7\x3f\x7a\x46\xf5\xad\xaa\x44\x3f\xd5\x85\x09\x22\xfb\xf1\xfe\x5b\xca\x43\x01\xa5\x72\xa3\x33\x7a\x51\xc2\xbb\x3a\x3c\xdb\xa7\xb7\xaf\x5f\x3d\xbd\x7d\xbd\xcc\xe8\xbb\xbb\x00\xf0\xf5\xc4\x34\x9b\xfe\x33\x32\xc7\x23\x10\xa3\x19\xcf\x88\x62\x04\x4d\xd3\x0f\x79\x26\x71\xa9\xb3\x76\x28\x8d\x96\x32\x57\x54\x93\x38\x35\x79\x51\x97\xa5\x24\xd8\xf6\x4d\xd3\x34\x87\x79\x32\x65\xc9\x5b\x50\xd6\xcb\x87\xef\x48\xae\x33\xe2\x1b\x9d\x12\x85\x40\x59\xe6\x2a\x83\x3b\xe2\x89\x5e\x66\xbc\x9d\x79\x9a\x73\x01\x7d\xd5\x23\x04\x91\xa9\x11\x27\xa5\x32\x3d\xcc\x95\x39\x96\xfd\xb1\xa4\x14\x22\x4a\x85\xa9\x75\xab\x1a\x43\x93\x02\x95\x7c\x3a\xd4\xb5\xef\xdb\xd6\x1f\x1a\x52\xd7\x45\x53\xa5\xc5\x58\x11\xd7\xba\xb6\x68\x43\xfc\x70\x99\xcb\x15\x27\xfb\x26\xc4\x74\x9e\x02\xdf\xc1\x7f\x10\xfd\x27\xd1\x7f\x15\xfd\xb7\xd1\xbf\x8e\xfe\xa7\x6b\x44\xe3\xd3\x9b\x7b\x30\x78\x58\x44\x9f\x82\xc3\x1e\xa0\x0b\xdf\xc0\x53\x2c\xeb\xf3\xcd\x7a\x82\xbf\x7e\x7c\xda\x3f\x5b\xbd\x2f\xab\xb2\xae\xe7\xfa\xa1\x84\xf2\xc0\x4c\x96\xc7\xca\x55\xfd\xb8\x38\x78\xa7\x09\xb6\x0d\x2b\x32\x69\x9c\x3c\xa7\xc6\x00\x98\x0c\x9e\x05\xad\xc8\xe8\xb3\x8c\xa3\x60\x06\x89\x50\xbe\xa6\x51\x29\x0a\x04\x14\xc8\x0d\x47\x98\x91\x59\x2a\x4a\x25\x8f\x3b\x0c\x4d\x89\x41\xcd\x90\x81\xd4\x97\xa8\x34\x25\xda\x66\x65\x41\xab\xbe\x84\x85\x51\x14\x15\x1a\x52\x51\xa8\x02\xc1\x3a\x27\x88\x50\xf8\xe3\x98\x54\x1e\x63\x4d\xb5\xa6\x1a\xab\x21\x0b\xc2\x4a\x64\x18\x32\x44\x21\x85\x33\x27\x8e\x0b\x21\xa4\xc6\x46\x22\xa9\xb1\x15\x25\x93\x58\xb2\x68\x1b\x67\x17\xb2\x61\x3b\x79\xa7\xc7\xfc\x85\x25\xeb\xf1\xcd\x95\x7c\x75\x7b\xa7\xcc\x18\x67\x23\xc2\x9a\x91\x6e\x6e\x21\x38\xfa\x3c\x5d\xf3\xe8\xae\x77\xae\xef\xb7\x96\x60\xc6\xb5\xad\xac\xb5\xed\x2c\x85\x89\x1b\x2f\x40\x1a\xfd\x49\x9c\x07\x7e\x0a\x1d\xfd\x65\xc8\x23\xfd\x67\x77\x5a\x5c\xf7\x98\xcd\x35\xc3\x5b\xbc\xbb\x41\x37\x17\xdb\xfd\x71\xbd\x8d\x1f\x92\x0f\xaf\xbf\xdf\x7f\xc8\xbe\x62\xdf\xfc\xe5\xd2\xdb\x57\x8f\x9f\x02\x96\xec\x1f\x02\x70\x03\xc9\xfd\xc4\x12\x7b\xbd\xff\xcd\xfb\xa4\x0e\x62\x96\xa5\x3f\x30\x46\x3c\x9c\x25\x04\x1a\x18\xef\xec\xe2\xb2\x23\x02\x61\x8c\xa0\x24\x86\x30\x49\x0d\x6a\x84\x43\xbc\xd0\x08\x95\x67\x95\xb7\xb2\x33\x25\x12\xb1\x81\x33\x89\xbb\x22\x9f\x53\x60\x61\x61\x72\x08\x06\x98\xe9\xac\xa4\x65\x66\xb2\xc2\xd7\x8a\x50\x2d\x00\x45\xb6\xdc\x69\xce\x98\xa5\x69\xa6\x69\x6e\x4b\x21\x84\xf5\x98\xf2\x02\x0a\x4d\x34\xf5\x27\x59\x28\x2f\xeb\xdc\xe4\xec\x70\xa8\x55\x05\x34\x50\x84\x78\x61\xbc\xc4\x04\x93\xf8\x44\x38\x14\xe4\xac\x29\x2b\x39\x4b\xa5\x2c\xb5\xc8\xca\x46\x11\x23\x95\xcd\xea\x55\x1b\x17\x8c\x17\x1a\x70\xd8\xab\x92\xef\xdf\xdc\x78\x1b\x03\x1b\xd2\xb7\x88\x1b\x1f\xbf\x22\x6e\xbc\x37\xa1\x13\x5b\x66\x13\xcd\xcb\x6a\x3a\x1c\x98\x24\x38\xc7\x84\x9c\x4e\xfe\xe4\x8a\x92\x4c\x59\x4e\x69\x91\x0f\xa5\x53\x42\x08\x15\xe7\x1c\x6b\xc4\x77\x8a\x70\xeb\x2a\xdb\xda\xf9\x70\x65\x6e\x8c\x6c\x6b\x6b\x6b\x31\x9a\x3b\x57\xd9\x99\x90\xa3\xe1\x55\x63\x2b\x5a\xb9\xc0\x37\x7e\xc1\x9b\x43\x52\x06\xd4\xf8\xef\xe3\xd7\x5a\x4c\x66\x98\x4f\x5e\x02\x49\x15\x66\x85\x46\x79\x7e\xcc\x8f\x42\x09\x0b\x8a\xbc\x48\xca\x6f\xd2\x67\xa1\x32\x5a\xf9\x33\x03\x4e\xfc\x75\xf4\x8f\xa3\xff\x62\xb5\xf7\xae\x24\xad\x77\x41\xa1\x77\x3f\xf9\x6e\x80\x89\x06\x77\xf2\xfd\xa7\xd5\x10\xfa\xc5\x87\xc7\xfd\x63\xb1\xee\x1a\x6b\x41\xe1\xc3\x63\x72\x74\xcc\xf0\x8e\xb7\x07\x77\x1c\x35\x67\x24\xa6\x8e\x6b\xde\xf1\x6e\x74\xc7\x63\xad\x39\xff\x5c\x6d\x1a\x88\x35\xf6\xcd\xe2\xd6\x9a\x06\x20\xe8\x4f\x9e\xfb\x03\x27\x4a\x0d\xca\x41\x24\xeb\xf9\xb8\x31\xbe\x05\x79\xa5\x79\x33\xd8\x61\xb0\x9c\x69\x1e\xe8\x88\x9e\xbf\x53\x48\x61\xa4\x3f\x19\xce\xa9\x18\xed\x25\xca\xac\x34\xd6\xa8\x13\x90\xd4\xc8\xba\x88\x79\xe0\xf1\x9f\x2e\x6c\xab\x82\xdf\xb4\x9c\xbc\x2f\x3c\xa6\x9b\x56\xc9\x5f\x81\xfd\x63\xb6\xbf\xe3\x7b\xd9\xed\x1f\xaf\x0f\xf3\x32\xae\xe5\x79\xe6\x55\xe5\x5c\x5d\x3b\x57\x55\xda\x14\xa0\x87\xa5\xa6\xa2\x90\x74\x31\x4e\x4d\x09\x01\x37\xc6\x16\xac\xe6\xc6\x6c\xc3\xf6\x6f\xab\x4a\x6b\x5b\xf2\xb3\xed\x5c\x66\xb3\x21\x3e\x50\x3a\x2b\xcc\x62\x0a\xf5\x61\x16\x00\x07\x0c\x40\xbd\x3c\xef\xa0\x5b\x63\xd7\x0f\x5f\xa1\x94\x57\x1b\xfc\x6d\x5c\xc7\x51\x1f\x67\x64\x59\x6e\x94\x16\xa3\x4f\x07\x07\xba\x90\xc2\x40\x9c\x66\x36\xc7\xa0\x0c\x5f\x65\xab\xc6\xd7\x74\xad\x01\x78\xb8\xae\xf7\x5b\x14\xec\x2a\x9d\x70\xab\xdc\xfa\xe1\xe1\x46\xd2\xfd\x15\xa3\xc7\xd3\x87\xa7\xfd\xfb\x1f\xd6\x63\xf0\x61\xdd\x22\x7e\x0f\x05\xd6\x76\x34\x14\x1b\xa5\x79\xc7\x7a\x46\x46\x06\xa0\xb7\x58\xc8\x71\x74\x92\x53\x66\x95\xe6\x75\x7d\x9c\x2a\x04\x72\x60\x4d\x4e\x15\x51\x4c\x32\x39\x3a\x64\x34\xce\x6d\x21\x0f\xa3\x8a\x4f\x8a\x5a\xa2\xce\x9d\x63\xd2\x99\x9d\xf2\x42\x48\xda\x48\xdf\x39\xdb\x82\xfc\x12\xb5\xe6\x04\x14\x90\xba\xc8\x5b\x5b\x28\x61\x04\xf3\x14\xd8\x46\x28\x05\x32\x6b\x0b\x53\xda\xe2\xd0\xe1\x6e\x4e\xb9\x94\x5a\x50\xcf\x8b\x1c\x71\x6c\x19\xe5\x40\x37\x3d\x1e\x6a\x84\x56\xce\xac\x24\x39\x44\x74\x97\x25\xd9\xd5\xb6\x08\x4a\xc3\x57\x7e\x9c\x5d\x36\xf7\xa0\x5e\xe6\x31\xc9\x66\x1c\x77\x7e\x74\x4e\x3b\xb7\xd8\xa4\x80\x86\xb8\xcf\x3f\x8e\xfe\xfb\x28\x02\x41\xd8\xe6\x1a\xd3\xb9\x3a\x03\x2f\xd4\x6f\xee\xe7\xf2\xdd\x1f\xf8\xe5\x87\xfb\x5f\xde\xea\xc6\x02\xec\x2b\xc0\x57\xf5\x7d\x42\x48\x8e\x72\x98\x95\xed\x54\x33\x57\x1b\xeb\x58\x3f\xc3\xd6\x02\xe2\x1d\x10\xfa\xf6\x3b\x05\x0c\xbf\xd3\x68\xba\xb8\xc0\x15\x3f\x24\x6e\xf0\x03\x68\xb5\xd1\xda\x68\x7f\x24\x24\x53\x69\xa1\x8f\x56\x6b\x2b\x16\xbf\xda\x10\xc9\x26\xf7\x8d\x5f\xf1\x27\x21\x14\xa7\xde\x00\xdb\x48\xe5\x42\x6e\x74\xba\xf0\x10\x4f\xfd\x29\x97\xdb\xe3\x1f\xc3\xe5\x06\x41\x9e\x97\x0e\x16\x20\x9d\x11\x89\x61\x8f\x05\x21\x39\x65\xc5\xb8\x0a\xf4\x6b\x0a\x55\x49\xbd\x34\x84\x69\xb1\x75\x9c\x96\x42\x5a\x37\xf7\xf3\x24\x59\x5e\x15\x04\x9c\x0c\x28\x7d\x24\x0d\xd6\x0a\x96\x07\x4b\xea\x95\x3b\x8b\xee\xe5\x95\x3b\xeb\x7d\xf4\x2f\xa3\xff\xf1\x9e\x3b\xeb\xfd\x5a\xa7\x15\x5c\xb6\xaf\xa1\xa7\x9f\x1e\xc3\xd6\xf5\xb5\x70\xdd\xb2\xe0\x3f\x3d\xbe\x0b\x3f\x5a\xcc\xed\xbb\x1f\x2d\x9b\xdf\xd3\xa7\xc7\x84\x54\xd6\x6e\x8c\x3d\xd7\x09\x9b\xd3\x84\x48\x0d\xb0\x57\x9c\x53\x9a\x61\xba\x2c\xc6\xa6\x9f\x1b\x30\x80\x81\xf0\x61\x10\x1c\xe1\xac\xc4\x62\x9a\xa4\x3f\xce\x47\xd0\x53\x61\xb3\x8a\x52\x82\x72\x48\x48\x9b\x2f\x66\xf2\xb4\x69\x3d\x9f\x47\xcf\x18\xa8\xc1\x29\x3e\x79\x75\x12\x07\x83\x90\x12\x08\x65\x2a\xcf\xe9\x32\x2d\xd0\x10\x9c\xab\x1a\xe3\x5c\x65\x99\x53\x8c\x49\x43\x70\x96\xcb\xa2\xc1\x38\x53\x69\x66\x0a\x9d\x66\x41\x70\x6e\x17\x67\x17\xbe\x39\xed\xf0\x1f\x8e\x0d\xfd\x2c\x17\x1c\xa4\x6e\x74\x8c\x89\x39\x97\xf4\xb8\xf2\xfd\x61\xc5\x14\x57\x40\x32\xa8\x21\xdd\xaa\xbe\xef\x7b\x7b\xae\xad\x4d\x58\xd7\xcd\xa7\x6e\x9e\x7a\xaf\x49\x27\xa5\x32\xca\x52\xab\x97\x7b\x53\x5c\xd8\xb6\xdc\x89\x80\xf3\xbb\x69\xf8\xfc\x5c\xed\xc5\xd7\xd5\x15\x09\xb3\xa0\x90\xa2\x44\x05\x2d\xa9\x47\x06\x40\x40\x35\xe3\x9c\xf9\x32\x94\x4f\x8c\x00\xfa\x41\x70\xbe\x13\x73\xfb\x79\x62\x81\xb9\x22\x91\x9f\xdb\x4d\x0f\x4e\x64\xb2\xac\x71\xae\x21\x4d\x35\xb3\x79\x90\x80\xac\x5c\xc4\x65\xd0\xb0\x58\xfc\xea\x77\xcf\xf1\xaa\x6f\xf2\x7d\x81\xfd\x63\xbc\xfb\x47\xe0\xfd\x1f\xc1\xf6\xe5\x36\xe3\x3c\x82\xc1\xc3\x18\xfd\x38\x0c\xee\x34\x1f\x40\x51\x26\x53\x69\xeb\x26\xef\x18\xc9\x3f\x1f\xeb\xba\x48\x84\x6f\x28\x94\x88\x58\x8a\x0c\x24\xbe\xb4\xa5\x30\x1c\x68\x9a\x9b\x9c\xec\xa0\xd5\xcf\x64\x5f\xd5\x79\x90\xbe\x1c\x9d\x06\x39\x38\x70\xed\x07\x2e\x90\xe4\xc5\x37\xa8\xbe\xa2\x4d\x1c\x85\xf1\xd8\x68\x7b\xb5\x0e\xaf\x58\xfc\xed\xeb\xc7\xef\x5e\x2d\x6e\x7d\xf2\xdd\x8d\xd7\x6b\x2d\x78\x8a\x93\xb5\x5e\xe2\xaa\x36\xf0\xe2\x3e\xdc\x12\x41\x4f\x1f\x5e\xdf\xdf\x8e\x5d\x47\x10\x47\x04\xe4\xbe\x49\x4b\x8a\x0c\xd7\x38\x2f\x72\x95\x53\x42\x19\x17\xb2\xe2\x2c\x9f\xed\x60\xa7\x09\x14\x13\xe2\x04\x17\x84\x94\xfe\x64\xad\x49\xd2\xd4\xcd\x5c\x65\x44\x11\x70\xc0\x85\xce\xd1\xce\x62\xc2\x28\x6e\xac\xef\xbd\x1d\x41\x9e\xfb\xd4\x9f\x2e\x51\x57\x4e\x06\x94\x8d\xe1\xfd\xb4\x2c\x7f\x5f\x80\x4a\xeb\xca\xcc\xdd\xca\xd9\x1b\xe7\x3e\xf7\x8e\x01\x0d\xfa\xb8\x56\x6a\x3a\xd7\xc5\xd8\xe1\xae\xb3\xed\x32\x0b\x9b\x38\xbd\xc8\xcd\x69\x27\xa2\x3f\x09\xe8\xdf\xf2\x9e\x5d\x72\x7b\xa7\x1f\xfb\x45\x3f\x64\x7b\x13\x9a\x8e\x29\xc8\x0b\x18\xb8\x25\x19\xe8\x25\xe7\x5c\x0c\x46\x29\x65\x80\xb5\x88\x30\x2a\x31\x31\x97\x88\x1d\x8d\xd6\x62\x44\x5b\xa6\x04\xd4\xd6\x41\x2a\x94\x66\x84\x4e\x46\x56\x1d\x6a\x0d\xe3\x86\xd1\x63\xa5\xab\x51\x09\xd9\xa9\xc0\xff\xb3\x9c\xe3\x22\x9c\xb9\xeb\xf3\xf7\xcf\xd6\xea\xbb\xd5\xb3\xba\x01\x1a\xae\x30\xa3\x9b\xb7\xf0\xe6\x6b\xb1\x86\x4d\xe7\xa8\x24\x35\x16\x20\x75\x67\x61\xe3\xdc\x0f\x1c\x5b\xc4\x4d\x3c\xcd\x59\xbf\x31\x9f\x15\xe0\x15\x57\x01\x11\x8a\x4d\xa3\x5c\x01\xbd\xf2\x04\x76\xcb\x91\x69\x07\x54\x6b\x8f\x01\xf4\x3d\xe8\x01\x53\x86\x18\x35\x57\xb6\xb7\x05\xec\x54\x86\x18\xa3\x87\x89\x51\x4a\x73\xa3\xa3\x24\x4e\x63\x18\xf8\x2d\xfe\x32\xfa\x55\xa8\x14\xbc\xd5\x4f\xfe\x4c\x89\xd0\xdb\xfd\x6e\xfb\xb0\xec\x21\x4b\x5f\x13\x65\xf3\x02\x50\xc3\x3a\xd0\x8c\xb0\xf1\xf9\x54\x8d\xb8\xb3\x14\x21\x28\x4f\x08\x53\x85\x8e\x79\x1e\x8f\xce\x75\x96\xab\x9d\x2e\x48\xd0\x9b\x66\xb2\xaa\x9c\x34\x42\x51\x06\xa1\x18\xa5\x24\xb6\x85\x65\xe6\xeb\xf8\x30\x68\xad\x55\xa8\xeb\x8c\x49\x58\xdf\x3c\x7a\x7d\xc5\xba\x7c\x53\xee\xe9\x0b\xa7\xe4\xc3\x5a\xdd\xf3\x21\xb9\x49\xf2\x6f\xf7\x3f\x04\x49\xfe\x90\x74\xdf\x22\x67\xb5\x6a\x87\x92\x09\x9c\x99\x5c\x35\x8d\x98\x85\x63\xae\xef\xbb\xdc\x8f\xbe\x2a\x8a\x02\xc6\xa5\x8b\xa1\x27\x1d\x28\x99\x1f\x0e\xae\xf7\xa3\x00\x79\xed\xc5\x8e\xfb\x03\x65\x72\xf1\x41\x8a\x8c\x36\x68\x12\x84\xc7\xc5\xdc\xe7\xf1\x30\x5a\xdf\x41\xcb\x90\x4b\xfd\xd4\xb6\xd6\x4f\xa6\x6e\x00\x9b\x87\xb8\xf4\x6d\xab\x1b\x90\x45\x00\x9c\x2e\x64\x63\x77\x6a\x55\xf5\xb9\x56\x60\xbe\xe4\x39\x88\xe1\xd1\xdd\x08\x0e\x90\x92\x07\x3c\x6e\x8e\xc0\x7a\x69\x9b\xa6\xb2\x56\x9e\x75\xc2\xfa\x56\x02\x0a\xd4\xe2\x13\x4c\x17\xb2\x19\xae\x5c\x14\xd7\x82\xfb\x3b\x70\xfa\x7d\xbd\x7d\x52\xe3\xa2\xf7\x06\x50\xae\xc8\x62\x9f\x16\x65\xda\x66\xa3\x1a\x1c\x20\x05\xd9\x29\x57\x59\x7f\x3a\x0f\x01\x9f\x6e\x63\x3d\xd7\xde\x08\x60\x62\x0c\x90\x0d\x14\x89\xd1\x6e\x69\x6b\xdf\x3c\xe7\x8f\x6e\x88\x9d\x87\xc7\xe7\x9b\x10\xbf\x2d\x7e\xfd\xf4\xb0\x7d\xfb\xf0\xb7\xf1\xc3\xdb\x77\x2f\x33\xa9\xa1\x23\x37\xa1\x9a\xbd\xf0\x29\x74\x35\x4c\x5d\x86\xe8\xe8\x4f\x0c\x44\x42\x58\x21\x7c\xc6\x38\xa2\x05\x43\x68\x48\xb5\x33\x6e\x18\x86\x61\x87\xce\x68\xee\xca\x0c\x8f\xe8\xa0\x4b\x2c\x77\xa5\x9d\x59\x5c\xdb\xdf\x1d\xb9\xc8\x6c\x26\x40\xe7\xd1\x25\x42\x20\x05\x53\xd2\x79\x08\xf0\xf9\x08\x68\x78\xf6\xa2\xeb\x1e\xbf\xd8\x74\x79\x38\x75\x9e\xab\x47\x17\xc3\xf5\xcd\xcb\xa5\x73\x25\x67\x59\x4c\xfa\x26\x99\xce\x59\x1d\xd7\x33\x8b\x45\x95\xa5\x05\x2a\x53\x9b\x33\x63\xe8\x0c\x2b\x59\x2b\x2d\x01\xaf\xaa\x1d\x9c\xb1\x03\x76\x96\x33\x2a\xd3\x94\xb4\xf8\x28\x88\x88\x0f\x9e\x7a\xeb\x94\x00\x04\xa8\xf3\x61\xad\xf7\x85\xa1\x1f\x2a\xfa\x8b\x50\x49\xbd\xe6\xe0\x9f\x93\xed\x21\x1b\xf9\xee\xcd\xf6\x1a\x89\x7c\x5a\x66\xf1\x57\xcb\x2c\xbe\x7f\x17\x84\xcd\x36\x27\x5a\xc6\xd1\x39\xaa\x5d\x05\xc6\x02\xc5\x8c\xd4\x0d\x68\x32\x8f\x4b\x56\x15\x85\x4d\x91\xe8\x1b\xe9\xeb\x1c\x48\xe3\x10\xa8\x77\x8a\x49\x37\xd7\x3e\xf5\x9a\x03\x0d\x86\xb8\xa5\xc4\x1b\x8b\x4a\xdf\x94\xb6\xf4\x45\x91\x17\x70\x84\x07\x03\x31\x03\xa7\xdc\x16\x00\x15\xb9\xc3\x6b\x5e\x0a\x06\xfe\xaf\x35\xe7\xf0\xb8\xee\x9f\xeb\x8e\xb4\x7f\xa9\xa9\x75\xab\xa1\xfe\xf8\xe9\x11\x04\x97\xe8\x17\xf1\xb4\xc9\x3f\x1f\xe9\xa6\xfd\x4c\x24\xa8\xca\xc2\xa1\x24\x3b\x31\x7b\x3a\xf2\xce\xf7\x47\x0f\x09\x10\xc7\xfe\x28\xa8\xaf\xe3\xc1\x32\x4f\x31\x69\x76\xb9\x1b\xdd\x72\x58\x57\xce\x1f\x6a\x29\xad\x32\x2d\xb2\xb9\xa5\xb4\xa9\xbd\xb4\x20\xaa\x24\x8e\xe2\xd8\x45\xd9\xde\xec\x50\x88\xae\x84\xb9\xbb\xed\x99\xbf\x7e\x1f\xca\xcc\x4f\x0c\x82\xbe\x3a\x0f\x15\x38\x42\xec\xc9\x66\xfa\x9c\xed\x90\xad\xe7\x0e\xd4\x1e\xc7\xcc\xa8\x1f\x6b\xb7\xdc\x03\x74\xd5\x30\xf9\xd3\x50\x8f\xb4\xdb\xbf\x8f\x56\xb4\xce\xf6\xc3\xf7\xfb\xc7\x78\x7f\x9f\x8f\x8a\xa3\x1b\xc4\x3a\xe9\x85\x55\x20\x57\xae\xc4\x89\x39\xb7\x55\x1a\x8b\x14\xe3\x56\xd8\xbc\x12\x24\x47\x1e\x17\xfe\xe8\x47\x06\x46\xe8\x2b\x20\xd2\xcd\xd0\x18\x01\x0a\xc0\xa0\x12\x4e\x39\x3d\x17\x56\xe5\xae\xa0\x2d\x68\x7d\xe3\x85\xb6\x87\x38\x72\xeb\x7e\x16\xb9\x0b\xdd\xe3\x8d\xbe\xe6\x8c\xd7\x8c\xf1\x35\x7f\x70\x6f\x59\xb8\x24\xab\xd6\x94\xc1\x04\xac\xa6\x96\xe8\x4d\x6a\x89\x32\x02\xd8\x65\xef\x77\x9e\x81\x3a\x36\x55\xc7\xba\x9a\xa2\x43\x43\x42\xac\x5c\x5d\xd0\xde\x24\x2a\xfa\x07\x21\x97\xff\xe1\xe1\xfb\xb0\xfb\xc5\xdb\xf7\xd1\x03\xf8\xf0\xfa\x8a\x59\x0b\xd4\x00\x9b\xb1\x3a\x81\x4c\xfa\x4e\x4b\x5f\x33\x50\xcf\x69\x95\x75\x86\x4b\x27\x26\x03\x64\xa2\xfc\x11\x7a\x6c\xeb\x00\xfc\x1b\x1c\x88\x80\x00\xf8\xc4\xa8\x72\xd6\x28\x7f\x68\x25\xc8\x41\xb5\x62\xd6\x55\xc4\x36\x76\x87\xd7\x5a\x83\xdd\xfe\x46\x80\xf0\xc3\x86\x21\x3b\xba\x0a\x0e\x27\x02\xa2\x1d\xb6\x14\x7f\x3e\x41\x62\x18\x63\x9b\x09\x45\x71\x4c\x2f\x62\x6f\x77\x22\xda\xae\xd9\xd5\x18\xbc\x8f\xde\xbd\x89\x40\x38\xff\xbe\x7b\x15\xe4\x77\xa2\x8d\xab\x46\x6f\x1d\x50\x71\x56\x2d\x06\x03\xc0\x80\x63\xea\x6a\x59\x63\x4f\x7c\x06\x41\xbf\x13\x68\xd6\x1e\x33\x30\x4c\xf0\x7c\xf0\x4d\xc1\x6a\x47\x7c\xef\x0d\x39\xc8\xc2\x01\xb7\xe6\xb1\xd8\x85\x26\xdd\x4e\x07\xfd\xb3\x0f\x0f\xb7\x79\x48\x96\x69\x99\xaa\xa2\xb3\x5c\x56\xea\x64\x80\xdb\x69\x9f\x1f\x7a\xdb\x58\x67\x7c\xe9\x47\x09\x4e\xf1\xb8\xec\xb5\xdd\x85\xed\xed\xb6\x08\x75\x19\x4b\x47\x7f\xb9\xee\x22\xdf\xfd\xe2\xcd\x3e\xda\x54\x95\x47\x2a\x16\x75\x89\xbb\x53\x25\x3d\x8c\xd9\xf2\x6f\x35\x70\x31\x03\xd4\x37\x52\x34\x7e\x3c\xd0\x1a\x14\xd7\x9c\x5a\x14\xed\x51\x54\x47\x49\x14\x7d\x7a\x7c\xfd\xd8\xee\xf4\xef\x74\x80\x2a\x04\xbc\x9d\x0c\x7c\x17\x5f\xe3\xe5\x9f\x77\xaf\x37\x77\xe8\xea\xe7\x7c\xe0\xe3\xeb\x47\x90\x6f\x87\x1f\xa1\xdb\x54\x9f\xb9\x49\xec\x59\x9a\x58\xcf\xda\x57\x5b\xf8\xe3\x50\x6d\xa2\x73\xb4\x5c\x5e\xec\xe1\x69\xd8\xe6\xb3\xd0\xc0\x21\x7f\x90\xc4\x53\x9f\x02\x48\xfd\x89\xfa\xc9\x2e\x6b\x93\x87\x7c\x49\x11\xfd\x55\xf4\x4f\xa2\xbf\xbd\x62\xc3\x56\xec\xef\x9d\x0f\xf4\xf1\xb7\x6b\x84\xf8\xe9\xf1\xba\x83\x5d\xf5\xe2\x7f\x78\x77\x15\xa5\x4c\x3e\xfd\xe2\xcd\xc7\x06\xd0\x6a\x39\x55\x0f\x54\x04\x83\xb0\xc8\xaa\x06\x0e\x8d\x6f\x62\x6d\xb8\x03\xb8\x3c\x0e\xb4\x77\x7c\xd9\xba\xb9\xb2\x1d\x10\x6a\x56\x95\x2b\xb8\xdd\x38\x63\x8c\x81\x1a\x6a\x49\x33\x9b\xe5\x18\x16\xb9\xc9\xcb\x6a\x9e\x88\x10\xfe\xc4\x14\x81\xf4\x24\x91\xee\x3b\xcd\x70\xcd\xcd\x00\xba\x52\x08\x16\xb0\xb1\xe2\x42\xf6\x72\x53\x5d\xab\x36\xff\x6a\xad\x7a\xbb\xf7\x35\x3e\x3e\xbd\xc8\xa3\xee\x7f\xfd\xef\x81\x55\xbd\x91\x6f\xb3\x79\xa4\xc2\xaa\xc2\x98\x22\x9b\x9b\x2a\x39\x9c\xcb\x70\x99\xd3\xa4\x0f\xfe\x38\x53\xdb\xfa\x8a\x03\xb4\xa9\x66\xe4\x91\x64\xb9\xcd\x0b\x04\x6a\x50\x5b\xcf\x4c\xe0\x94\x39\x0c\x94\x5e\xa2\x46\xd7\x2b\xe7\x50\x98\xcb\x28\xdc\xcb\xbf\x58\xab\x33\x6f\x9c\x7d\x57\x0a\x81\x87\xaf\x84\x17\x5f\x7f\xbf\x6c\xaf\x1f\x7f\x0b\x40\xb5\xe9\x3f\x23\x9b\x54\x67\xbe\x8d\xec\x8f\xbd\xdb\xd4\x90\x55\x24\x73\xa9\xbd\x44\x1d\xf3\x70\xf2\x0d\x07\xa4\xdd\x46\x5e\x1b\xe9\x2b\xaf\xa7\x4b\x04\xac\x9f\x3c\x29\x0b\x6c\x50\xa3\x88\x04\x14\x8f\x07\xe4\x60\xd5\xac\x9c\x3d\x61\x6e\xc4\x46\x47\xd9\xd5\x13\xfb\x6a\x66\x9e\xd6\x05\xf6\x2a\x4c\x47\x30\xfb\xdf\x01\xbe\xcd\xe7\xc3\x75\x52\xe0\x75\x4e\xae\xd3\x80\x93\x71\x9a\xf4\xe0\x8f\x1b\x3d\x3b\x1f\xad\xda\x8c\xe0\xe0\x00\x9a\x8f\xd4\x8f\xbd\xee\xa7\xf6\x64\xa6\x69\xdd\xf3\xf4\x05\xef\xd5\x66\x0a\x73\xf1\x42\x3d\xfc\xf5\xe6\xe7\x2a\x42\x81\xde\xe2\x1f\xbb\xb0\x78\x8f\x5b\xe3\x4f\xbe\x4d\xd2\xf3\x49\x0a\x21\x72\x2a\xf9\xb9\x49\xe8\xd8\x7e\x1e\x36\x93\x67\x4e\x7b\xd3\x70\x86\xdc\x81\xd0\xdc\xe5\x45\xeb\xcc\xaa\x5f\xbd\x8f\xc4\x85\x6e\xdc\x4e\x87\xdc\xe1\xb2\xdb\xfe\xcb\x2b\xd7\x41\x88\x95\x6f\xbf\xd6\x9c\x7b\xff\x92\xe1\x32\xa4\x90\xa2\xfd\x17\xa8\xe1\x3d\xcd\xd7\xfd\x56\xbd\x29\x89\x37\xf3\x11\x82\x16\x18\x8d\x85\x12\x7e\xc4\xb9\xc9\xc8\x44\x91\x82\x0c\xd4\x5d\x5f\xb6\xce\xba\xa2\xd5\x56\x70\xa5\x18\x71\x97\xe8\x38\x8c\x45\x69\x38\x71\x85\x90\xcc\x60\x9c\x13\x8a\x81\x5a\xf6\x79\x39\x77\x8e\x0a\x23\x77\xda\xf0\xcc\x0a\x58\x49\x22\x19\xe7\xa5\x64\x29\x97\x44\xf0\x73\x9d\x67\x8a\xa9\x3c\x95\x72\x84\x0d\xcd\x0a\x26\xa0\xaf\x4c\x8e\x28\xc1\xed\x80\x55\x9e\x79\x28\x68\xe6\x72\x0c\x88\x6b\x69\x53\x41\xb8\x86\x49\xa2\x6d\x54\xc7\x7c\xcf\x77\xf6\xb9\x2e\xe2\x9f\xdc\xf0\x9f\xeb\x10\x3f\x7c\x21\xfc\x7c\x26\xfd\xfc\x0a\x6f\x5d\x27\x69\x0d\x46\x8c\xa9\xe2\xb0\x39\x9f\x62\x57\xf9\xb4\xf6\x69\x1d\x57\xe7\x13\xc8\x02\xeb\x61\x05\x4e\x9f\xc5\xed\xdd\x76\x32\xa6\x2c\x18\x44\x48\xf3\x99\xd6\xd6\xd6\x71\xc3\x7d\xcf\x18\xf3\x47\x4a\x69\xb4\x8d\xc7\x0b\xde\xcb\x70\x3e\x67\xd7\xaa\xfe\x2f\xf9\xf5\xf7\xd1\x55\x5a\xf7\xca\xbc\x01\xde\x3e\x7c\x58\x56\xed\x46\x54\x05\x8a\xbb\xf3\x49\x39\x05\x32\x60\x14\x71\x44\x1e\xaa\x64\xa8\x3c\x9f\x26\x50\x5d\xa2\x9d\x2a\xac\x76\x47\x27\x01\x0c\xac\x9f\xea\xf3\xb1\x49\xaa\x33\xed\x62\x16\xa0\x54\x38\x3c\x13\xec\x42\x92\x29\xc4\xbc\xff\x66\xe5\x48\x78\xf5\x78\xcd\x7c\xdd\x55\xe6\x7c\x7a\xfb\xac\xce\xf7\xac\xec\xbe\x06\x83\x1f\xd7\x60\xf0\x97\x52\x9d\x65\xc6\x14\x28\x8a\xc2\x66\x39\x30\x15\xe3\x52\xd7\x4c\x0f\xc4\xb0\xae\x76\x46\xeb\x9c\x53\x8b\xf0\xe0\x1b\xc6\x40\x53\x79\x63\x29\xe9\x8d\xef\x01\x76\x22\x04\xef\x94\x37\xdb\x23\xa6\x10\x42\x4b\x98\xb4\xba\x97\x9a\x8a\x49\x6b\x6d\x85\x29\x25\x33\x0c\xcd\x29\xa5\xb1\x2c\x34\x15\xc6\xce\xd4\x78\x1e\xf6\x6d\x75\x21\x7b\x9a\x14\x57\xbd\x96\xb0\xbe\xef\x98\x59\xef\x9f\xae\x50\xf4\xbb\xbb\x12\xef\xfe\xf0\xf1\x79\x19\x6f\xdf\x7f\xdc\xc2\xca\xd7\x9e\x81\x0a\x70\x63\x8e\xce\x42\x34\x9d\x88\x94\xbc\x10\x12\xfa\x83\xef\xcb\xd3\x34\x1c\x72\x90\x35\xce\x54\xa0\xac\x40\x36\x75\xb2\x3f\xce\x9c\x1f\xfd\x48\x4e\xf1\x88\x07\x97\x17\x9c\xba\x9a\x22\x54\x64\x9d\x64\x99\x4d\xa9\xcd\x72\x43\x44\x9e\x2a\x56\x41\x8d\xb3\xc2\x23\x26\x8d\x61\x42\x29\x62\xd1\x72\xe6\x25\xd1\x05\xed\xab\x9d\xbe\x72\xe4\xfe\x54\x01\xe9\xaa\x1f\xb7\x92\x23\xbc\xdd\xdd\x6b\xbb\x06\x05\xb9\xb5\x88\xe1\xe9\xed\xd3\xdf\xc6\x4f\x6f\x1f\x97\xa5\xfa\xe1\xfa\x7a\x5b\xba\x6b\xd1\x60\xc2\x81\x0b\xa4\xf7\x9e\x81\x61\x1e\xf3\x22\xae\x46\xc8\xdb\x9a\xbb\x69\xf0\x1a\x83\xac\xf6\x35\xc1\x13\x20\xd8\xd7\xa0\xf5\x82\xf3\xea\x74\x02\x06\xe4\x33\xbf\xbe\xc2\x50\xde\xd3\x02\xec\x3b\x51\x7a\x53\x96\xd5\xae\xe0\xfc\x68\x46\xea\x2d\x82\xc6\x70\x84\x0d\xa1\xa2\x34\x05\x14\x94\x1a\x01\x24\x1d\x0d\xe7\xdc\x77\x8c\xb1\xf9\xa0\xb5\x9e\x39\x56\x28\x14\x18\xfe\x79\xc4\x01\x0a\x71\x9b\x57\xd1\x2f\xa3\x7f\x12\x7d\x88\xfe\xc5\x33\x4f\xcd\xbf\x0d\xca\xaa\xff\x6b\xf4\xbf\x5f\x7d\x86\x55\x73\xe7\xaa\x5c\xff\xac\x1d\xb6\x8a\x23\x3c\x23\x68\xbe\x78\xe6\xdb\xc7\x75\xc6\x96\x49\xd9\xfe\xb4\x0a\x6b\x25\xba\xf9\xaa\xce\xee\x5e\xb5\x28\x2e\xcb\x0c\x10\x51\x14\xed\x79\x38\xe6\xa5\x03\x30\x2b\xb8\x29\xd3\x53\x19\x9f\x64\x11\x67\x98\x4d\x70\x6c\xdb\x13\x74\xca\x20\x44\x07\xa5\x85\x22\x3e\x8d\xa3\x0e\xb8\x33\x01\xae\x3d\x17\x71\xb5\x2a\x4b\xd9\xb0\xa6\x27\xb3\x72\x6d\x79\x11\x0f\x49\x76\x9e\x4c\xa0\xa2\xbd\x5e\x1c\xbb\x1a\x1f\x81\x6c\x1a\x58\xd7\x3b\x8b\xb0\xa4\x48\x29\x82\x65\x59\xfa\x96\x97\x04\x14\x05\x64\x18\xe6\x32\x83\x30\x97\x69\x86\x8a\x9c\x70\x88\xb2\x1c\x9e\x78\xc9\x79\x99\x79\x42\x54\xdb\x2a\x02\x72\x74\xc4\xc2\x63\x80\x61\x55\x56\xa5\x61\xb8\x10\x65\x59\x22\x81\x16\xc3\x2b\x8d\xe5\x72\x06\x3d\x73\x88\xff\xcf\x91\x88\xfe\x97\x48\x46\xff\xc7\x17\x2e\xa2\xeb\xf3\xfb\x74\x4f\x2c\xbe\x7c\xb9\x5d\x4f\xaa\x55\x16\xed\x3a\xb7\xb7\x55\xf9\xac\x9b\xfe\x26\x00\x9d\x56\x2a\xd4\xd5\x1a\xfa\x74\x13\xc1\x0d\xaf\x9f\x3e\x3c\x05\x10\x5e\xf2\xf4\xf8\x0f\x97\x23\x6e\xaf\xcc\xb9\xb0\x31\xf4\x04\xb4\xf3\x29\x4e\x6d\x9c\xcd\xd3\xb2\x2f\x2d\x06\xf7\xfa\x19\x83\x4a\x83\x94\x80\xaa\x07\x85\x1f\xa7\x09\xc8\x79\x20\x22\x83\xa5\x2c\xa1\xb4\xd0\x93\x16\x21\x46\x0b\xab\x89\x95\x0c\x94\xcb\xbf\x45\xc3\xe0\x27\x90\x59\xd5\xb6\x60\x6c\x5b\xe8\x4f\x20\xf5\xa7\x0d\xf7\xc7\xba\x01\x05\x02\x29\xe6\x08\x71\xec\x4f\xa8\x42\x08\x79\x73\xc2\xf8\x74\xc2\x02\x73\x2c\x04\x4a\x31\x26\xb8\x2c\x73\x8d\x41\x89\x4a\x9d\x17\x02\x15\x58\xd0\x52\x71\x1b\x7e\x63\xf9\xb7\xc8\x6b\x8c\x2b\x1c\x45\xbb\x18\x5d\x58\xf0\xab\x56\x2b\xf5\xaf\x02\x73\xf4\x4f\xea\xfb\x6f\x3c\xc5\x37\x8c\x63\x90\xe8\x78\x7b\x0b\x50\x7e\x8d\xa6\xfc\xf8\xb8\xec\xb8\x1f\x63\x1a\x33\x1b\x8b\xd9\x81\xe9\xb3\x01\xa7\xb9\x56\x1b\xf4\xb9\x77\x49\x34\x47\x1b\x64\x3f\x77\x16\x8c\x7e\x4a\x3a\xc1\x19\x2b\x0b\xdf\x05\x51\x5f\xf6\xe3\xb2\xb3\x17\x60\x1c\x0e\x45\x13\x1b\x79\x60\xec\xb4\x83\x84\x18\xa2\x14\xf1\x27\x3f\x4a\x72\xf2\x5d\xd7\x01\xec\x7b\xa5\xb8\x14\x10\x16\x5c\x51\x6b\xa9\x62\x59\x2a\x91\xe4\x28\x5b\xe3\x4d\xf9\x05\xed\x6d\x5c\x5d\xab\x06\x97\xbd\xf4\x2e\x26\xf7\xad\xcd\xf4\xed\xcd\x5c\xb8\x0f\x99\x6e\xad\xf5\xa7\x09\xa4\x20\x87\x48\xb5\xca\x94\xb0\xed\xa8\xc4\x30\xc7\x04\xfa\xd1\x1f\xca\xa9\xb7\x2e\x6f\x2b\xe9\x4c\xdf\x79\x27\xdd\xc0\xbb\xa4\x18\x7a\x3a\x0c\xb1\x2d\x47\x9e\x97\x10\x22\x53\x63\x8c\x8a\x6c\xe2\x34\xb7\x05\xee\x8b\x4c\x62\x96\x51\x26\x10\x81\x59\xe1\x39\xd5\x54\x23\x5e\x72\x2d\x50\x94\x82\x31\xf8\xf0\x2e\xfa\xcd\xf3\x1e\xba\x2a\x76\x5e\xe3\x0e\x77\x3b\xe9\x4b\x76\xab\xa7\x3b\xe2\xda\xbb\x4a\x80\xeb\xc3\xb0\x7d\xfd\xe1\x69\xff\xfa\xc3\xd3\xd7\x76\xc0\x16\xe2\x02\x9c\x7c\x06\x2c\xe7\x5e\x82\x56\x2a\x44\x0a\x81\xa8\x1f\xad\x3f\x39\x50\x05\x86\x93\xb2\xb3\x6d\x4c\x8a\x52\xfa\x12\x1c\xbc\x8e\xb3\xd3\xe9\x34\xcb\xc0\x16\xe6\x40\x31\x93\xdb\xbb\x9d\xc3\xcc\xd2\x51\x8d\x74\x66\x2b\xfd\x34\x9a\x26\x7f\x4a\x28\x35\xec\x30\x1f\xbd\x60\xc0\x81\x29\x1e\x11\xf4\x2d\xf5\x03\x33\x86\xb1\x81\xb1\x79\x0c\x9b\xab\x10\x22\x8a\xfe\x41\x84\x2f\x24\xe9\x76\xf2\xb9\x5e\xfb\xc6\x95\xbd\xf2\x3d\xfd\xa7\x21\x32\x7e\x8b\xff\xde\x15\xec\xed\xb7\x1f\x1e\xc2\xd3\xf9\xee\xab\xd7\x1b\xeb\xc0\x3d\xa7\xf6\x5a\x44\x12\x0a\x49\x5e\x87\xf9\x03\x47\x9b\x67\x07\xc7\x20\xf2\x84\x31\x06\x4a\x20\x99\x24\x04\x94\xc7\x23\x2f\x4b\x6f\xef\x5f\xe2\x96\x90\x12\x66\x82\x2b\xae\x35\xe7\x07\xae\x38\x47\x79\xb6\x93\x65\x51\xe8\x4a\x21\x48\x11\xc5\x72\xd4\x8c\x70\x3c\x79\xcd\x7b\xf6\xfc\xc9\xab\xb9\x21\x24\x85\x57\x76\xe0\x26\x3e\xfa\x43\xb3\x7c\xf8\x71\x48\xf1\xe2\xe4\xee\x13\x7a\xd1\xfb\x6a\x57\x5e\x7d\xc7\x17\x9e\xe3\xb3\xc7\x73\x4d\xf9\xdc\xc8\xc1\x97\x6b\x93\x86\x70\x42\xd8\x7a\x3a\x8f\xe3\x8a\x7f\x6e\xa4\x93\x72\x92\xf2\xa8\xd4\xae\x3c\xf7\xe0\xd8\xcd\xc7\xde\xe7\x73\x63\x6d\x4c\xe7\xe6\xf6\xab\x20\x68\x82\x27\xfa\xef\xd9\x2e\x8c\x87\x19\xba\x95\xe8\xcc\xf3\x58\xb3\xcf\xa3\x70\x42\x1c\x39\x1f\x85\xf8\xc3\xed\x82\xc3\x45\xef\xdd\x1f\xdf\xee\x8d\x29\x3a\x3e\x25\xfd\x19\x55\xb1\x99\xd5\x72\x25\x5a\xff\x88\x7b\xd7\xb6\x80\xac\xd7\x1f\x68\x19\x44\xe8\x42\x63\xb7\xcb\xd6\xd8\x4d\xb0\x04\x57\xa6\xd5\x75\x65\x85\x40\xae\x8c\x4b\x3f\xe5\x05\x28\x72\x2f\x05\x60\x45\x0d\x29\xa6\x10\x61\x6e\xb0\xdd\x65\xb6\xb2\x33\x9a\x7b\x0e\xa6\xb8\x68\x11\x91\x18\xd5\x1c\x48\xd0\x5f\xff\xf6\xb4\xcb\xa3\xfc\x9b\x7f\x7b\x8d\x12\xeb\x58\xfa\x21\x2f\x01\x2d\x3c\x93\x40\x94\x03\x12\x94\x61\x56\x94\xa2\xa6\xcd\x2e\x77\x95\x99\xe1\xdc\x0b\x70\x8c\x8b\x06\x63\x8d\x11\xa5\x02\x08\xd0\x47\xeb\xdf\x4f\xb2\x3f\xf8\xf7\xad\x6f\xf2\x12\xc8\xc2\x23\x09\x4c\x39\xfd\xcc\xdf\x9f\xe2\xfc\xab\xbf\xbf\x49\xec\x85\xec\xf9\xae\x0c\x77\xe4\xca\x21\xfc\x85\xe7\xef\xd5\xb3\x15\xfd\xf0\xf8\xf0\xe1\x29\xac\x82\x3d\xb7\x33\xb5\x36\x6e\x66\x8a\x0e\xe6\x78\x6c\x7c\x51\x1f\xda\x61\xd8\x95\xbf\x2b\x84\xd8\x8d\x3f\xe6\x5b\xe6\x87\xe3\xd1\x8c\xf3\x18\x17\xe3\xac\x41\xb1\xb4\xa3\xff\x3e\xed\x60\x6b\xe3\x6e\xc6\x68\x34\xd3\xd4\xfa\xb4\x1d\xdb\x71\x7c\x6e\xa7\xd8\xd2\x9f\xb4\x13\x47\xe6\x82\xf7\x75\x3c\xad\x91\x84\x35\x4b\xf3\xf0\xfd\xdf\x82\xbf\xfe\x17\xe0\xcd\x9f\x83\xfd\x8a\x97\x4d\x3e\x7e\x7a\xb3\xd9\xbf\x7f\x75\x8d\xde\x99\xdd\xf4\x19\x97\x09\xa7\x48\x14\x69\x95\x49\xc3\x2d\x9f\x73\x31\x0c\xb9\xef\x27\xdc\x7b\x99\x30\xab\xb8\x32\xf1\x64\xac\x97\x5c\x4b\xd8\xe9\x94\x1b\x10\x79\x57\x62\xc3\x0b\x19\xb7\xbe\x21\x5c\x0a\x12\xed\xa2\xf1\x42\xf6\x70\x73\x8c\xb6\x21\xb3\xfd\xff\xbb\x46\xb2\x43\x18\xf4\xcd\xf3\x1a\x7f\x91\x48\x5d\xbe\x0d\x9e\x1e\x5f\x27\xcd\xdc\xbb\xe7\xa7\x6b\xdb\x32\xc6\x74\xb9\xf8\x0f\xad\x05\xed\x62\x74\x78\xb2\x39\xce\xcd\xb9\xd9\x56\x93\xf4\xad\x00\xfc\x73\x29\x78\x6a\x53\x1e\xf3\x98\x86\x6f\x89\xd5\x87\x6e\x13\x1c\x74\x6e\x16\x1f\xfa\x57\x51\x19\xfd\xfb\xd1\x7f\x1c\xf0\x41\xf7\x59\xd0\x37\xf7\xa6\xf9\x4b\x25\xe8\x40\xf1\xf3\xb5\x34\x49\x38\x72\xf6\x77\xc7\x25\xc0\x0c\x49\xc8\xe2\x53\xc8\xc0\x81\xce\x40\x70\x94\xa5\x32\x15\x69\x9d\x6e\x78\x25\x18\x46\xbc\x22\x54\x8a\xc2\x8f\xe7\xa3\x02\x8a\xd1\x50\xe8\x5b\x1c\xd5\x25\xb2\xc0\x1a\x51\x62\x8e\x81\x43\x85\xc8\xe1\xce\x10\x8a\x29\xc1\x58\x20\x86\x71\x29\x75\xab\x51\x69\x20\x63\x48\x97\x18\x73\xc4\x6b\x21\x28\xb7\x20\x3b\x7a\x45\x69\xaa\x53\x3c\x05\xd2\x07\x1a\x97\x55\x61\x38\x12\x82\x89\x22\x94\x48\x45\x49\x4c\xaf\x31\xfc\xf5\x14\x79\xe1\x95\x04\x93\x31\x9c\x08\x37\xb9\x95\xf5\x30\x0d\xf9\xbd\xe0\x3b\xbe\xba\xfe\xf8\xf1\xf5\xe3\xc3\x0b\x92\xda\xed\xeb\xc7\xa7\xa4\x00\x9d\x01\x9d\x58\x8c\x56\x76\x89\xb4\xb6\x56\x6b\x10\xf9\xda\xf8\x3a\x03\x99\xae\x4b\xc3\xdb\x54\x2b\x13\x8c\x69\x04\xfa\x60\x31\xe3\x98\xac\x34\x03\xbb\x4c\x88\xa3\x9e\x7c\xc9\x00\xec\xfb\xcf\x47\x80\xfd\x00\x2a\xb1\x2c\x60\xe1\x39\x80\x9d\x16\x0d\x98\x40\xd4\x0d\xbe\xa7\xe0\xa0\xa5\x16\x42\x1c\xa5\x8c\xf6\xc9\x9a\x03\xc7\x77\x31\xc6\xc7\x95\xad\xeb\xf5\x9d\xf2\xdd\xcb\x1a\xde\x57\x2f\x20\x6f\x49\xe5\x15\x18\x3f\x77\xa0\xf3\x26\xa9\xce\xdc\xc6\x7a\xd6\xb7\x4b\xa9\x6a\x14\x43\x5c\x0e\x95\x68\xba\x1d\x36\xcb\xb8\xbc\x3c\xdb\x58\x2a\x6f\xb5\xb7\xca\x8f\xdc\x72\x4b\x14\x53\xda\xf0\x28\xda\xc7\x5d\xd0\x52\xfa\xbd\xfd\xf9\x5a\x22\xfc\x55\xf0\x59\xaf\xfd\x81\x9b\xd4\xe3\x38\xff\xcc\xc0\xe4\x59\x9a\x9c\xce\xa9\x8b\xfb\x19\xdd\x2e\xab\x9a\x4b\x24\x8e\x31\x1b\x3b\xd9\x8d\x5f\xf7\x28\x08\x4b\xde\x7a\x24\x8d\x09\x18\xc1\x7d\x12\xfd\xe1\x3e\xfd\xde\x39\x12\xc9\xe0\x39\x38\x7d\xb6\xe0\xe0\x65\x32\x9c\xa1\x8b\xef\x14\xb3\xb4\xae\x27\x31\xc4\xe4\xd0\xc8\xb6\xff\x23\x7a\xb4\x4b\xca\x10\x27\xc1\xd7\xc8\xf0\x0d\x49\x71\x7d\x98\x5e\x5d\x7b\xf5\x2a\x7c\x7d\xf7\xb4\x3d\x5c\x39\x4a\xf7\xd2\x9d\x8f\x6e\xbc\x1d\x7b\xa5\x4d\x38\xe3\x58\x94\x12\xa3\x79\x08\xac\x67\x70\x87\x67\x11\xe7\xf3\x31\x76\xfe\xa4\x8c\x3a\x1f\xbd\x4b\x4e\xe7\xc3\x4a\x4f\x24\xe2\xd4\x68\x63\xa2\x6d\x52\x07\xec\x3a\xba\xab\x09\x7f\xe6\x57\x0b\x38\xb2\x87\xb7\x0f\xf1\x33\x6b\xf4\x4f\x95\x98\x92\xdc\x77\x8b\x4f\xa8\x0e\xf4\x60\xad\x1e\xc4\x41\xf9\x03\xb0\xbe\x75\x4d\x03\x70\xed\xf3\xf0\xb2\x43\xe7\xa3\x35\xbe\xab\x5d\x0b\xe4\xec\x62\xea\xdb\xc1\xf4\x00\x19\x0b\xfa\xbe\xef\xe7\x53\xd7\x75\xd1\x36\x09\x31\xd6\xbf\x6f\x5f\x92\x63\x82\x7c\x03\x2a\xdf\x9b\x81\x1e\x9c\xb5\x07\x71\xd4\x7e\x00\xce\xd7\xae\xeb\x00\x6d\x97\x56\x00\x6d\x43\x5f\xac\xef\x2a\x57\x03\x31\x37\x31\xf6\x5d\x6f\x3a\x10\x8a\xb3\xee\xfa\xb2\xac\x97\xf6\x67\xfa\xf2\x22\x07\xfd\xcd\xbe\xd8\xc4\x79\x0d\x0e\xbe\x72\x20\xa2\x7e\x6a\x6c\xe5\x8f\x1c\xa4\x95\x37\xe0\xe8\x95\x9b\x26\xa0\x8f\xf3\xfa\xf2\xa5\x3f\x2d\xd0\xb3\x89\xa5\xaf\x0e\xdf\xe8\x0f\xfd\x7f\x73\x9f\x92\x21\x61\xbe\x02\xb5\xef\xed\x48\xa7\xca\xda\x49\x9c\x8c\x6f\x40\xeb\x9d\x1b\x06\xc0\xfb\xf9\x10\x5e\xbe\xf4\xa5\x01\x72\xae\x62\xe6\x9b\xe5\x3e\xc1\x17\x7d\x49\x12\x75\x91\x7b\xb7\x2b\xae\x7c\x8a\x11\x78\x4c\x82\x61\xf6\xea\xed\x72\x81\xc7\x57\x8f\xc9\x72\x0d\x89\x62\xf5\xe7\xb1\x41\xdd\x80\x0e\x00\x03\x59\x7a\xa7\x80\x29\xbd\xd9\x15\xbf\x3b\x3a\x17\x57\x2e\x26\x73\x1b\x93\x1f\x75\x1c\xf4\x59\x92\xe8\x42\xf7\x7c\xa7\x43\x95\xd4\x5f\xdd\x38\xf0\x5f\x82\x36\xdf\x7f\x07\xbe\x08\xa4\x14\xae\x28\xe3\x89\xc0\x8a\xeb\xc2\x70\x8c\xf2\x59\x21\x2b\xbb\x98\x78\xe1\x02\x5d\xd5\x4e\x43\xa5\x3e\x57\xa7\xb6\xa8\x8b\x63\x32\x56\x9d\x04\xa5\xef\x66\xac\x12\x34\xf7\xa0\x8e\xa2\x24\x92\x71\x1e\xf0\xf3\xdf\x5d\x63\x6d\x1f\xb2\xfd\x97\x10\x40\x28\x9d\x79\x2e\x15\x7c\x51\x46\x1d\xbc\xa9\xf7\x3f\x6c\x57\x88\xa4\xb4\xb9\x53\xd2\x76\xd5\x44\x2f\x51\x45\xfd\x24\x0f\x8d\x2f\xb0\x75\xcb\xde\x5e\x6b\x26\x44\xa5\x3a\x7e\x74\xbe\x01\xc2\x4f\x08\x98\x18\x1a\xcc\x15\xdf\x69\x3f\xb5\xa2\x31\x95\x3a\xa9\xca\x81\xc2\x1f\x6b\x63\x80\x01\xad\x86\x45\x67\x90\x92\x5a\x31\xdf\x01\xd9\x5a\xe5\x0e\xa6\x82\x06\x16\xf0\x12\xb5\xa4\x0b\xf9\xe8\x3e\x60\x7c\x65\xf4\x4f\xa3\x0f\xab\x42\xfe\x1d\x1a\xec\xaa\x70\xfa\x53\x75\xba\xb0\xd3\xbd\x7d\xfa\x00\x9e\xde\xbe\x4e\x5c\x60\x6f\xe8\x7b\x9f\x57\x49\xee\xe9\xe2\xd6\xd5\x20\x0b\x2b\xb6\xf1\x07\x01\xf2\xce\x3b\x30\x78\x6b\x4c\x6c\xfb\x5d\xd9\x9c\x4e\xa7\x93\x09\xe4\x4b\xd0\xd6\x66\x14\xce\x9c\x16\x3b\x7a\xb2\x5a\x8f\xa6\x8e\xb9\xf1\xf5\x30\x84\x7a\x27\x7c\xa1\xf1\xb8\x93\x21\x3b\xf1\x8c\xf2\x78\x91\xb3\x4c\x82\xfa\x37\x10\x0e\x97\x8a\x99\xc2\x08\xc1\x18\x69\x34\x28\x5b\x53\x22\x8d\x76\xd2\xe7\x5c\xf2\xd6\xd2\xae\x6e\x1b\xd7\x39\x3f\x0c\x02\xa8\x18\x82\x06\xfa\xfa\x48\x82\xd6\x55\x1c\x91\x0b\x8f\x4f\x01\xfb\xfb\xcb\x2f\xed\x64\xdf\x68\xc6\x72\x28\x85\x43\x8a\x09\x4c\x98\xd6\xa0\x68\x4c\x89\x14\xda\x29\x9f\x49\x4d\x3b\xe3\xc7\xc9\x59\x5b\x69\x7f\x68\x04\xa8\x63\x09\xe0\xd2\x0c\x5e\xf3\x7c\x9b\xf8\x78\xb5\x1b\xde\x7e\x8b\x41\xe6\xe1\x59\xb7\xee\xe6\x7c\xaf\xb6\xc3\x76\x31\xdd\x6e\x44\xca\xd1\xc1\x82\xca\x1d\x0e\xfe\x08\x1a\x4f\xe3\x74\x3e\xb9\xf9\x14\xa7\xa1\xf0\xf7\x78\x48\x52\xcf\x2d\xc8\x97\x1f\x82\x62\x3b\xba\xe5\x63\xf1\xbe\x0b\xe7\x7c\x07\xb0\x73\x60\xb4\xa0\x70\xce\xcd\x76\x08\x53\x1c\xed\x22\x13\xb3\x80\xf1\xf9\xee\x8a\xe1\xf8\x9b\xe8\xef\x9e\x59\x73\x82\xfd\xb2\xac\xd4\xa7\x87\x1f\xde\xfd\x11\xe2\x7a\xdb\xeb\xeb\xbe\x64\x97\xc8\xb7\x31\x6b\x9d\x9f\x32\x29\x05\x90\x3f\x2a\x60\xd6\x98\xdf\x95\x8a\xcb\x04\xf3\x6a\x79\xab\xda\x61\x00\xec\x30\x0f\xe1\x65\xa7\x35\xc9\x7a\xbd\x8c\x6a\xac\x79\xd3\x00\x9b\xa6\x18\x6b\xe2\x4b\xa2\x84\x50\x04\x1c\x88\x3f\x51\x4a\x4f\x81\xbb\x7a\x17\x89\x6b\xff\xbf\xe8\x00\xfe\xdd\xbd\xf2\xd4\x1f\x56\x02\xbc\x1f\x6b\xbc\x8e\x55\x03\xf7\xa5\xaf\xca\x1b\xe3\x29\x68\x42\x5f\x45\xbf\x74\x72\x08\x5b\x1d\x1b\x92\xf6\xcb\x38\x4f\xa9\x95\x0a\xc8\x1d\xa4\x54\x53\x5f\xd2\xa5\xb3\x14\x1c\xa8\x9f\x28\xa5\x97\x88\x31\x16\x23\xcd\xf2\x26\x8c\xcc\x8f\x47\x7e\x18\x41\x1d\x34\x95\x92\xa4\xb8\xea\xf0\xdc\x6a\x46\x6e\x75\x69\xdf\xbd\xba\x2a\x8c\xdd\xfb\x32\x9b\xa1\x6a\x3a\x00\x01\x26\xcc\xb6\xda\x15\xa5\xe7\x1e\x41\x10\xc5\x27\x37\x57\x55\x15\xf3\xb9\xda\x69\xe8\x49\x93\x21\xa3\xf0\x25\xf2\x03\xe6\x94\xe6\xf6\x38\x0f\xe7\x56\xeb\x84\xcc\xc3\x9a\x03\x5f\xf6\x60\x12\xe6\xee\xe7\xda\xfd\x78\xdf\xee\x36\xaa\x9a\x1a\x64\xa0\x20\xd4\x34\xca\x16\xa5\xb7\x9e\xc3\x63\xdc\xb9\x79\x74\x2e\x2e\xe6\x71\x69\x16\xd7\x5f\x9a\x65\x8c\xe6\x76\x9c\x87\x73\xa7\x75\x82\xe7\x01\x54\x51\xb2\xc9\xae\x6d\xde\xd8\x05\x82\x48\xc0\x97\xfc\xfe\xcb\x26\x99\x33\xee\x30\x21\x6c\x2c\xb3\xd0\xf7\xbe\x86\x5d\xac\xaa\x5b\x11\xf4\x4e\x97\x9e\x76\x5f\xda\xab\xc9\x32\xca\xfe\xae\xb9\x28\x49\xda\x6f\xb4\xf7\xee\xe7\xda\x2b\x5d\xe5\x4e\x20\xc5\x44\x57\xd2\x62\x5f\x7b\x0d\x0f\x71\xe5\x7c\x56\x55\x60\xf2\xd9\xd7\x03\x5c\x1a\x7c\x39\xbe\xcd\x26\x0a\xb8\x63\x14\xed\xc3\xae\xf5\xd2\x0f\x5d\x09\xb1\x1e\xb2\xe4\x3d\x58\x7c\xc6\x07\xf0\xf1\x97\xe0\xed\x5e\xba\xb9\xb5\x36\x26\x9c\x60\x51\x31\x70\x2c\xd1\xdc\x4a\xb9\x43\xbf\xcb\xad\xdd\x1d\x7f\x44\x80\x13\x92\x10\xef\x3c\xf1\x47\x92\x4c\xe7\x23\x4c\xc8\x59\x8f\x00\x01\x11\x6d\x02\xf7\x8c\xf8\x77\x6a\x4f\xb8\x19\x3a\x17\x0f\x8e\x10\xd3\xb3\x18\x41\x31\x43\x6b\xbf\xd1\x1e\xf6\xd3\x73\x7b\x62\x02\x38\xb4\x57\x5c\xe8\x9e\xfd\x3b\xb5\xc7\xdc\xf9\xe4\x5c\x92\x36\x84\xb8\x03\x8b\x19\xd4\xe7\x53\x55\xfd\x81\xf6\xf8\x11\x50\x20\xa2\x24\x9e\x2e\x64\xcf\x42\xbd\xf1\xaa\x90\xf0\xad\xd6\xbe\xfb\x25\x78\x1b\xbc\xf0\x87\xa5\xb1\xce\xda\x04\x77\x84\xd6\xb5\xb6\x75\xac\xa1\xdd\xc1\xe7\xa6\x28\x21\x09\xf3\x76\x99\x4a\x11\x10\x2c\xf2\x7c\x80\x09\x8b\x92\xe0\x6f\x2c\x67\xf8\x9f\x46\x7f\x1e\xaa\xab\x9f\xf3\x8d\xdf\xad\x85\x5b\x71\x60\x40\xbd\xd6\xc4\x3e\xfc\xe6\xd3\x63\x32\xb9\x12\xc6\xc7\xf3\x40\x84\xea\x8b\xa4\x38\x8f\x26\xa9\xb2\x2c\x87\x85\xce\x24\xe5\x3c\x9d\xa3\x9d\x46\x82\x39\xa3\x18\x48\x4f\xd6\xf9\xc3\x50\xd7\xa0\x2c\x2f\x51\xd5\x83\xb2\xea\x02\x1e\x2c\x59\x6b\x6c\x44\xf4\x8b\x2b\x3e\x67\xb5\x0d\xa3\xe4\xed\x0d\x35\xb3\x1c\xb3\xc1\x40\x48\xfa\x2a\x49\x3d\xd3\x80\x53\xcf\x4d\xaf\x35\xae\x07\xd1\xb6\xb1\x31\x7d\xaf\x8e\x3b\x31\x43\x37\x9f\x06\x07\xd2\x58\xcc\x11\x65\x5a\x49\x91\x30\x17\x57\xd4\x37\x9d\x98\x16\x7f\x21\x0b\x75\x63\x36\xda\x3e\x33\x8d\x3f\x3d\x63\x83\x9f\x75\x0e\x9f\xa5\xa4\x7f\x2f\xc9\xd6\x4e\x71\xac\x90\x98\x33\x30\x19\x70\xf2\x29\x18\xa4\x84\xa4\xb0\xd4\xf7\xc6\xf7\xcb\x79\x9f\xb5\x01\xb8\xdc\x01\x34\xa7\xb7\x77\x3b\xcb\x38\xe1\x74\x00\xa9\x3f\x59\xf7\xb9\x63\x2c\x35\xa4\x0f\xbb\x2b\xdb\x9c\x9c\x8f\x0e\x87\xc3\xdc\x1f\x0e\x01\x2b\xb7\x4b\x70\xe0\x55\x5a\xfa\x7b\xcf\x0a\xf6\xed\xfe\xfe\x21\x56\xb0\x9d\x15\x58\x61\x3e\x17\xcb\x19\x78\xf4\x39\x68\x84\x84\xa8\x60\x25\xf1\x47\xeb\x27\x07\x6a\x5f\x0c\x21\x98\x5a\x81\x7c\x26\xb7\x77\xdf\xe8\xb1\x4d\x49\xbf\x32\x6d\xbc\xec\xf2\x72\x16\x99\xbd\xdd\x99\x67\x1e\xfa\xff\x32\xc4\xda\xbf\x66\x62\x7b\xbc\x55\x4b\x5d\xa9\xd8\xd6\x12\x49\xf0\xfa\xfb\xbf\x05\xaf\xdf\xfe\xea\xd7\xbf\x05\x8f\xaf\xbf\xdf\xbf\xff\xf8\x5b\x90\x5c\xab\x2d\xdf\xdd\xea\xe1\xb7\x1f\x3f\x5d\x89\xb3\xe2\xdc\x65\x05\x80\x8c\x61\x9e\x73\x84\xbc\xce\x8d\xd5\x99\x32\x43\xc1\x81\xf6\xba\x43\xa5\x2c\xd1\x66\x44\xb6\x61\xd4\x0f\x46\x29\x18\x9f\xa8\x54\x92\xfb\x53\x3d\x90\x5a\x49\x45\x41\xc9\xf1\xdc\xce\x27\x58\xaa\x02\xee\x0c\x2c\x8b\x99\x30\x9e\x99\x8c\x55\x63\x4d\x5b\xad\x80\x82\x9e\x4d\x39\x26\x88\x60\x90\xb7\x44\x11\x2a\x32\xab\x19\x15\xc6\x73\x61\x18\xc2\xc2\xf2\xd2\xe4\x10\x96\x42\x21\x5a\x62\x8c\x02\xc8\x22\x89\xdd\x85\xec\xe9\xae\x78\x56\x0d\xbb\x17\xa1\xba\x52\x5d\xdd\x6f\xbb\x71\xbb\x71\xba\x09\x34\xc9\x1c\x65\x3e\x45\x5e\x71\x40\xa1\xaf\x36\xb2\x9a\xa3\xaa\x4a\xa2\x39\xda\x15\x73\x3d\xe5\x55\x5e\x01\xe9\xf3\xde\x54\xc0\xcc\xe9\xb9\x55\x2a\x21\x73\x0f\xaa\x68\x9f\x90\x10\xff\x43\xc1\x17\x7e\xb8\x5a\x32\xf8\x65\x14\x70\x7b\x5d\x39\xb7\xda\xb5\x8f\x9f\xde\xc4\x7f\x11\xa2\x64\x6f\x76\x6f\x7f\xf5\xfe\x06\x85\x7f\x73\x2d\x1c\x5e\x5d\xf7\x3d\x37\xe7\x49\xeb\x24\x3b\x4f\xb1\x43\x05\x2f\xe0\x7c\x04\x5a\x0d\x43\x9a\xc1\x42\x62\x9e\xe6\x79\x2e\x32\xc9\x4a\x44\x98\x24\x65\x16\x64\xad\x7d\x2b\xa4\x1c\x72\xdb\xc0\x6e\x87\x7e\x97\x09\xb1\x9b\x7e\x8c\xb6\xb2\x44\x08\x61\xe8\xba\x4e\x4f\x4e\xbb\xcc\x8f\x7d\xe6\x74\x71\x72\x82\x10\xed\x40\x09\x90\xf6\x52\x36\xbe\x92\x82\x68\x12\x6d\x13\x74\xd5\xcb\x2f\xae\xeb\xff\x37\xab\x9f\xb4\x78\xf6\x5f\x80\xfc\xcb\x28\xee\x80\xfc\x57\xd8\xca\xb5\x5a\x62\x2d\x8e\x4f\x48\x8c\x52\x97\x02\xed\x4d\x56\x08\x66\xb4\xc3\x28\xcf\x52\x93\x57\x5a\x54\x1d\x9d\x2c\xce\xe7\x2e\x71\x0c\x1a\x48\xe7\x0c\x8c\xbe\x70\x75\x0d\x78\x7e\xf2\x43\x01\xe8\x96\x04\x51\x03\xdf\xfb\x76\x00\x39\xf6\x8b\xcd\x33\x58\x9b\x7b\x0c\x48\x6f\x5c\x73\x00\x0a\x1c\x40\xcb\x04\x15\x6c\x3e\xce\x07\x0b\x52\x0f\x8d\x65\x35\x8b\xa2\x6d\xc2\x43\xcc\x44\x85\x48\xc9\x3f\xba\xfa\x47\x8f\xc9\x87\x5f\xac\x4e\xe7\xd2\xf9\x65\x10\xeb\xbe\xfa\xfb\x07\xc1\x63\x9a\xda\x14\x30\xdf\xa4\x39\xc3\x46\x5a\x04\x8b\xd4\xe4\x0c\x2b\x5a\x75\xe4\xa4\x61\x3e\x37\xc9\x5a\x2c\x34\x97\xa0\xf3\xd8\x3a\x07\x48\x3e\xfa\x31\x07\x70\x19\x44\x65\xad\x37\x87\x7e\xc2\x5e\x5c\x22\xdf\x81\x22\xf7\x63\x05\xd8\x60\x5d\x3f\x82\x2c\x2e\x96\x31\x10\xc1\xe6\xf1\x36\x06\xc3\x2b\xb6\xd8\x98\xfc\x42\x82\xe6\xe5\xab\x6b\x55\xfe\x6f\xa3\xff\xfa\x66\x63\xbe\xd4\x47\x79\xf5\x5c\x27\xfd\x2d\x3a\xd1\x10\x27\xba\x92\xd3\x26\xf7\x3a\xcd\x57\x2b\xef\xd3\x3b\x03\x60\xd0\x8f\x4d\xfd\xc9\x2d\xff\x0f\xa2\x28\x68\x45\x74\x96\x81\x28\xcf\x35\x2c\x41\xed\xe9\x4d\x3a\x06\xb4\x9f\x27\xd0\x7d\x61\x18\x2d\x0e\x83\xa6\x73\x9a\x1c\x98\xeb\x1a\x76\x3c\x5e\x22\x5f\x33\x10\x75\x97\x68\x97\x73\xce\xb9\x61\x8c\x31\x9f\x95\x85\xa9\xdb\xb2\x2c\x8a\x12\x61\x6c\x98\xe6\x9a\xe9\xd8\xb2\x91\xf3\x03\x63\xde\x41\x84\xb0\x51\x82\x41\xac\x28\xe6\xd0\xe4\x70\x79\xa6\xff\x22\xd4\xdb\xeb\x1d\x0f\x51\xe7\x57\xcf\xfa\x02\x34\xfa\x6f\x22\x16\xfd\x9b\x88\x87\xec\xf9\xff\xf6\x93\x1a\xab\xfb\x88\xf0\x87\x87\xb7\xef\xef\xd3\xa1\x8f\x0f\x8f\xf7\xf2\x74\x2b\xe2\xf5\x17\x6f\x56\xb3\xec\xd3\xd3\xe3\x53\xd8\x26\x5f\x94\xf0\xef\x3f\x3c\xed\xaf\x5f\xbf\xfe\xf5\xfb\xb7\xaf\x3f\x26\xa2\xd1\xd5\xa6\xb6\x67\x95\x98\xf3\xe4\x6c\x61\x5d\xc2\xa0\xeb\x8a\xd6\x37\x4a\x91\xc2\x36\x45\x0d\xaa\xa6\x2d\x9b\x66\x3e\x24\x76\x56\x45\x7c\x14\x06\x92\x5c\x94\x10\x7a\x03\x20\x2c\x73\x96\xf9\xd1\x57\x79\x6b\xfd\x01\x12\x8d\xa5\x36\x06\x44\x56\x99\xd9\xc2\xb1\x69\x1a\x50\xb6\x79\x6e\xf8\xb6\xf0\xe5\x3c\xf9\x82\x01\x17\x47\x49\xee\xbb\x83\x54\x45\x49\x8a\x8c\xb1\x32\xa7\x79\xee\x47\x47\x51\xc1\xf3\xb2\x28\x19\xcc\xb9\x3f\xe2\xb9\x1f\x32\x9d\x39\xb0\x18\x8b\x98\xc0\x02\x15\x32\xcd\x44\x0d\x95\x36\x4c\x2c\x1f\xde\x60\x7c\xa4\x94\x4e\x65\xc1\xd3\x28\xda\x2f\xfe\xee\x46\xef\xcc\x15\x53\xff\xff\x8f\x7e\x15\xfd\xd3\xc0\x51\xfb\x5c\xa3\x12\xe4\xeb\x77\xfb\xf7\x3f\xdc\xc8\x0d\xde\xdd\xed\x55\xcf\xa1\x76\x70\xff\x45\x4c\x4c\x9a\x4d\x3d\xef\x47\xc1\xc1\xe0\x23\x26\x05\xa0\x20\x5b\xdc\x1b\x63\xcc\x6c\xae\x6f\x52\x9b\x2e\x56\x0b\x21\x48\xaa\x36\xce\x6c\x5a\x18\xce\x19\xc7\x5c\xb6\x3b\x53\x16\xb9\x6d\x55\x67\x0c\x33\x8b\x91\x3a\x78\xe3\x53\x33\xe9\xe5\x93\x17\x05\x25\x4c\x48\x8e\x2b\x2b\x47\x50\x96\x82\x33\xa9\x24\x31\x52\x1e\xa2\xdb\x98\xe4\xff\xe7\x63\xb2\xd9\xfd\x98\xb8\xf8\xb9\x31\xe5\x92\x2d\x63\x52\xb2\x8d\x53\x9b\x16\x82\x72\x4c\x5e\x8e\xc9\xd2\x30\xa6\x83\xd7\x2f\xc7\x44\xe5\x3a\xa6\x23\x28\x4a\xc1\x09\x93\x14\xbd\x18\x13\xfa\x7b\x8d\xe9\xe1\xe7\xc7\x54\xd8\x34\x1b\x3b\xde\x0d\x8c\x83\xd6\xe7\x54\x08\x80\x40\x0a\x8c\x57\x46\xa9\xb9\x5a\xde\x68\xad\x6d\x9a\x2d\x83\xc0\x84\xc9\x0a\x4c\xcb\x90\x08\xc7\x18\x51\x55\xdf\x86\xd4\xda\xeb\x6d\xfa\xc9\x90\x98\x90\x8c\x74\xf2\x7a\x9b\x96\x21\x41\xbd\x0e\x29\x8a\x83\x5f\x26\xb7\xd3\xd5\x0e\xbd\x13\x6a\xfc\xee\xd5\xdb\xab\xdc\xc0\xdb\x55\x2e\x64\xd3\xc4\x5d\xaa\x2c\xe1\x99\x20\x28\x43\x69\x9b\x36\x27\x31\x34\xe9\x31\xd3\x39\x53\x74\x3b\xfd\x38\x78\x9b\xdb\x5c\x03\x9e\x54\x33\x9e\xab\x93\x6a\x63\x1c\xd7\xfe\x54\xf8\xf1\x44\x4e\x2b\xfe\x93\x5d\xe8\x86\xed\x74\xf4\x7e\xd5\x94\x7b\xb7\xca\x0a\x3e\xdc\x78\xf4\x5e\xdd\xcf\x65\xc8\xab\x7c\x7f\x95\xa1\xfd\xf8\xe9\xed\xe3\xfe\xc3\x53\x4c\xf9\xc8\x0e\xcc\x1f\x01\x1b\x08\x15\x00\xba\x3a\xcb\x8f\x83\x6a\x0e\x5c\x80\xb1\x01\xa5\xaf\xd2\xc6\x09\xed\x4d\x95\xa5\x2d\xa0\x59\xdd\x1f\xad\xb5\x20\x8d\xd3\x9a\x61\x28\x07\x00\xcb\xb2\xb0\x8d\xee\x8c\xe1\xa6\x9e\x4f\x59\xa6\x2a\x65\x41\xcd\xdd\xe9\x14\x25\x9b\xa0\x2b\x14\x38\x31\xfe\x71\xf4\xd7\x2f\x18\x30\xbe\x8f\x37\x4b\x07\x1f\x43\x7f\x92\x5b\xf4\xe6\x3e\xe5\xb6\x5a\x74\xdb\xbc\x28\x45\x43\x6d\x96\x03\xdb\xf9\xa9\x21\xc0\x59\x3f\x42\x42\x38\x1e\xc1\xc9\x1a\x83\x39\x63\x39\x63\xa5\x4f\x5b\x49\x0c\x96\x9b\xb6\x2c\x45\x7b\x2a\x20\x92\xd0\x37\x03\xd2\x0a\x18\x8a\x88\x22\x1e\x1d\x8f\x66\x3e\x4a\x96\xdb\x8c\x81\x89\x5b\x47\x2b\x1b\xf4\x7b\x57\xfb\xf8\x75\x40\xa6\x84\x3e\xfe\xf0\xea\x0b\x21\xed\x2a\x9e\x7f\xc3\xdf\xbc\xe8\xe1\x15\x43\x39\x11\x22\x40\xae\x1d\x8c\xb1\x3f\xcd\x25\x8b\xdd\xe8\xcb\x14\x51\x2a\xa8\x37\x49\x19\x98\xfb\x99\xd6\xaa\xd0\x9a\x9e\x0f\x00\xae\x45\x07\x07\x04\x45\x03\xd2\x82\x6b\x1f\x39\x63\x80\x26\x88\x68\xea\xe1\x38\xda\xf9\xa4\x78\x5e\xe5\x1c\x8c\xcc\x3a\x1a\x68\x8b\xa2\x38\xe8\xde\x2f\x36\xc0\xa7\x6b\xb5\xd6\x9a\xfc\x5a\xa3\x79\x2b\xa1\xdb\x0f\x9f\xee\x35\x26\x56\xfe\x9d\xdd\x2a\x9b\xfb\x3a\x03\xef\xa3\x87\xa7\xb7\xab\x4d\x90\xa4\x95\x4b\xf0\xec\xac\x94\xd5\x70\xa8\xe4\x72\xfe\x15\xc7\xe5\x3c\xb7\xb8\x6a\x03\x21\x8f\xf5\xd3\x64\x20\xc4\x84\x61\x3f\x68\x90\x57\x09\x52\xc4\x60\xb5\x39\x80\xca\x73\xeb\x3b\xe9\xd8\xa0\x8d\x6e\xd8\xc1\x29\xdb\xb3\xa9\x4e\x57\x25\x8a\x4b\xc4\x09\xcd\x33\x59\x14\x49\x57\xce\x91\x2f\x04\x18\xe2\xba\x8c\xf3\xc0\x03\x16\x6d\xff\x1f\xde\xfe\x1e\xc8\x72\x1d\xcb\x13\xc3\x09\xf2\x7e\x70\x66\x63\x66\x99\xaf\x5e\x55\xf1\xff\x5f\x4d\x37\xb3\xb3\xeb\x15\x7b\x67\x77\x85\xdd\xdc\xaa\x42\x44\xc7\x6c\x60\x24\xad\x02\xbb\xab\x0f\x28\x42\x11\x82\x0c\x85\x60\xc2\x84\x09\x13\x26\x4c\x98\x30\x69\xd2\xa4\x49\x93\x26\x4d\x9a\x34\x69\x5e\xf3\x9a\xb7\x5f\x5e\x22\x15\x04\xef\xcd\xca\xac\xaa\xf7\xd1\xbd\x1a\xbd\x7c\xec\xbc\x99\xd9\x8f\x38\x07\x9f\xe7\xe0\x9c\xf3\xfb\xc5\xa7\x8b\x3d\x76\xcd\x95\xc5\x17\xeb\xfe\xdb\xd8\xe1\x5f\xe2\xd1\xbf\x7a\xca\x23\x7b\xba\x04\x5e\xcc\x9a\xa3\xce\x72\x10\xe5\xa5\x81\x05\x50\x5e\x3d\xc1\xd5\x2f\x8e\x2c\xa5\x0d\xb0\x17\xf6\xe7\xcc\x1f\x1b\x2f\xc1\xc1\x82\xc1\xcb\xfe\x40\xfa\xc9\x8e\xfe\x48\x41\xb9\x93\x25\xc6\x04\x41\xca\xb5\xd2\x4a\x69\x8d\x63\xa4\xec\xd1\x2a\x75\x52\xea\xa4\xb5\x97\x9a\x73\x3d\x69\x2d\x4e\x5e\x01\x7b\x30\xda\x45\xdb\x24\xff\xb6\x2e\x3f\x81\x83\xfe\xeb\x74\xd9\xa4\x3a\xcb\x0f\x45\x71\x55\x65\x31\x52\x84\x77\xc0\x9d\x47\x4b\x48\x05\xf4\x63\xb4\xcc\xa8\xe5\x69\x3d\x5f\x55\x11\xfd\x44\xfa\xc1\x76\xfe\xf0\x6d\x55\x30\xd7\x07\xf7\xb5\x2a\x81\x1a\x7b\x58\x54\x89\xb6\xa1\x7e\xf7\x2b\x5d\x7e\x72\x58\x76\x3f\xa9\xcb\x66\x59\x2e\xd7\x71\xe1\x06\x02\x98\x15\xae\x2c\x40\xeb\x8b\x00\x97\x5e\x7b\x06\x0e\x67\xe8\x20\xa4\x3d\x18\x7c\x13\xc0\xa3\xa9\x6f\x26\x5f\xc4\xd8\xc5\xd0\x17\x20\x3d\xd1\x83\x3f\xb8\xa3\xaf\x28\x10\x3b\x59\x2a\x8c\x20\x65\x46\x69\x69\xa4\xc1\x31\xc1\xd0\x1e\x2a\xa5\x8e\x52\x9e\xa4\xf4\xdc\x32\x66\x27\x69\x04\x88\xbc\x04\x76\xb2\x8b\x3e\xfb\xb8\x0c\x7c\xac\x38\xac\xeb\x7f\x17\xfd\x63\xf4\x9f\xa2\xff\x39\xe4\x2a\xdd\xbe\xbe\xfb\x7e\x7f\xff\xfa\xc2\xe0\xfb\xfe\xd3\xdb\xfd\xfd\xa7\xbb\x77\xb7\xaf\xef\xf6\xf7\xaf\x6f\x57\x78\xd2\xcb\x2f\xc1\x7d\x00\xef\x7d\x0f\xee\x5f\x7f\x7f\xa1\x46\xb9\xfb\xdd\x0f\x1f\xde\x7e\x89\x2b\xa8\x62\xd4\x65\xfd\x54\x3e\x46\xea\x00\xbb\x92\x2a\x24\xb3\x63\x6c\x63\x3c\x66\xc7\xc7\xa8\x3c\xc8\xbe\xec\x0a\xaa\x90\xc8\x26\x3f\x18\x56\x08\x86\x63\xad\xb2\x22\xd7\x19\x16\x14\x55\xd5\x9c\x57\x81\xc7\x62\x79\x76\x58\x19\xa1\xfd\xd8\xf3\xea\xa8\xda\xdc\x1d\x95\x3a\x6a\x3f\x74\xd7\x1f\x3d\x19\xa0\xc0\x90\x80\x72\x80\x25\x83\x06\x23\x76\x98\x53\xce\xe3\x93\x3f\x69\xaf\x4c\xa8\xc5\xae\xc3\x5e\x81\xa3\x37\x11\x8e\xc8\xc5\xbe\x7c\xa6\xf9\x55\xc9\x5d\xd0\x72\xbf\x62\x51\xac\x3f\x87\xd4\xdf\xd0\x17\xcb\xf3\xfd\xfd\xf3\x8a\xbe\x77\x97\xfe\xf8\x0a\x58\x71\x8a\xd3\x26\xeb\xc7\x62\x92\x5d\xb9\xe8\x9f\x17\x32\x1b\x13\x99\x23\x23\xbb\xb2\x0d\xbf\xe0\x59\x3a\xc6\xe5\x90\x4d\xc7\x8c\xa7\x69\x91\x67\xa9\xca\x30\x13\x78\x1e\x14\x2b\x38\x43\xf1\xa9\x9a\x71\x55\xc5\xdd\x8c\x97\x27\xf4\x82\xf2\x7d\xcb\xdd\x49\x74\x39\x25\xc7\x79\x80\x56\x72\x07\xa2\xf0\xa3\x30\x4a\x1d\x15\x1b\x8b\xb4\xe0\xa1\x0f\x8e\x6b\xaf\xd4\xcf\xba\x42\xaf\xf7\xb3\xfd\x53\xad\xe0\xdb\xe8\x5f\x7c\xe6\x73\xbd\x72\x18\x3d\xf7\x6d\x93\x1e\xb8\x2a\x10\x55\xb0\x40\x8b\x20\x12\x53\xf9\xc8\xb9\x38\xf2\xd1\x56\x2c\x9b\x87\x5d\x79\xb8\x67\x7d\x3e\x5a\x9b\x64\x3e\x03\x7c\xc5\xae\x26\x7b\xf7\x2b\xdb\x10\xa0\xab\xc0\xe0\x21\x30\x67\x0e\x94\xc7\xc9\xe0\xe6\xd1\xb9\xb8\x9c\xc7\xad\x5c\x9d\x96\xb5\x0d\x73\x3e\x18\x93\xe4\x3e\x5d\xdb\xc8\xfe\x0c\x3d\x32\x70\x0c\x77\xad\xa0\x3e\xe7\xa0\xf2\xd9\x26\x73\x73\xe5\x5c\xcc\xe7\xea\xe7\xda\x88\xd5\xaf\xd7\x63\x99\xf5\x01\x60\x1f\x1c\x1e\x1c\x98\xe6\x7e\xe3\xaa\x99\x54\x55\xdc\xce\xe4\x67\xdb\x70\x7f\x46\x1b\x2e\x2e\xab\xc0\xcc\x33\x3d\x34\x60\x98\xc7\x8d\xae\x66\x56\x55\x71\x3d\xb3\x9f\x69\x63\x1b\xf2\x30\x5c\xb0\x8b\xfe\x3e\xc4\xe4\x3e\x5d\x71\xf0\x03\xb5\xc2\xf2\xe6\xcf\xb8\xb8\x21\xc3\x24\x06\xcb\x59\xff\xea\xfe\xe6\x0f\xe0\x02\x34\x0b\xd6\xd4\x93\x24\x61\xa0\x58\x4c\x9e\xc5\x3f\x94\x19\x63\x08\xe7\x18\xe5\x45\x3a\xda\x0a\xf9\x8e\x81\x0c\xfa\x81\x1e\xfd\x04\x1a\x6b\xad\x9f\xac\x55\xc5\xb6\x9a\xa6\x71\x9c\x27\x7f\xf4\xb2\xcd\x4c\x8a\x0f\x81\x0e\x41\xfa\x93\x19\x01\x8a\xe1\x75\xfb\x06\xd1\xcc\xaf\xa7\x52\x74\xc1\x0f\xec\x13\xb2\x63\xa1\x1e\x2e\x54\x5e\xdf\xdc\x7d\xd8\x6d\xdf\x07\x62\x7a\x50\x5b\x6d\x97\xd3\x0a\x5b\x82\x77\xec\x47\x01\x37\xf8\xc7\x91\x51\x42\xb6\xc5\x03\xce\xf2\xd5\xc7\xae\x37\x68\xa7\x9e\x62\xd3\x7f\x1f\xfd\xdb\x0b\xa6\xfc\xed\x67\x6c\x8a\x0b\xc3\xf3\xfd\xcd\xdd\xf6\x39\x87\xc1\xb3\x7a\x7e\x61\x1d\x30\x4e\x29\x33\xc3\x58\x9d\x0f\xc2\x59\x50\x2e\xa6\xf3\xd3\x73\xe0\xd8\x40\x3e\x5a\x2c\x8c\x5c\x43\x64\x76\xa6\xd6\x97\x36\x16\x36\x6e\xac\x5d\x2c\x04\x6e\x7d\xab\x1d\xb5\x86\xa0\x46\x51\x15\xe2\x64\x6d\x0c\xf7\x7a\x87\x9e\x72\x3f\xfe\x65\x88\xdf\x7d\x0e\x31\x3d\x6d\x29\xaf\x3e\xdc\xbd\x06\xcb\x44\x78\x89\x06\xba\xfd\xf8\xe9\xf6\xbb\x4d\x74\x75\xd7\xcf\x6d\x08\x2e\xc7\xf9\x7c\x38\x9d\x12\x84\x92\xa8\x61\xaa\x93\x9d\x76\x1d\x6d\x4d\x05\x32\x4d\xbc\x46\x3b\x64\x2a\xcf\x9c\x5b\xfe\xbb\xca\x63\xe7\x89\x73\x71\x6f\x65\xe1\xb9\xe4\xc2\x08\xe9\x88\x23\xaa\xa7\xf5\xd1\x1f\x17\x19\x93\x62\x5f\xed\xc8\x4f\xcb\xf8\x94\x21\xf6\xe1\xf6\x5b\x32\xbe\xfd\xf8\xe9\xf6\xcd\x45\xc6\x09\x14\x57\x19\xcb\x79\x5c\x26\x6c\xc2\x68\x3c\x5a\xca\x8f\xa4\x6b\xdd\x40\x3a\x63\x4f\x12\x7b\x87\x77\x44\x33\xdf\x31\x13\x9f\x46\xe6\x47\xee\x47\xc6\xc0\x64\x44\xee\x47\x4a\xa9\x21\x5a\x63\x83\xb8\x43\xb2\xaa\xd7\x7e\x3c\xec\xcd\xb3\x1c\x9a\x3f\x44\xff\xe6\x17\x64\xfc\xaa\x1b\x7f\x46\x44\x42\x92\x48\x38\xd5\xf1\x41\xd5\x03\xe9\x6c\x05\x52\x4b\xbc\x40\x3b\xac\x95\x77\x4a\x27\xec\xa4\xbc\xd3\xde\x2a\x15\x13\x23\x16\xa7\x9d\x6a\xce\x82\x88\x0d\xd5\x81\xb3\x70\x91\x51\xed\xf5\x33\x19\xff\x3e\x58\xd7\xbf\x7a\xac\xff\x0d\x78\x2e\xe5\x57\x83\x8d\xf1\x65\xb0\x7b\xe5\x3a\xda\x18\x41\x40\x61\xc2\x68\x63\x6b\xbc\x34\x36\xe9\xfc\xc1\x78\x61\x17\x27\x36\xb6\xcb\x68\x6b\xce\x99\x15\x42\x63\x87\x84\xab\x07\x37\x4e\xc1\x0f\x95\xf1\xba\x1f\x25\x17\x94\x8b\x6b\x3e\xd2\xfd\xcd\xc5\x5a\x7e\xf7\x0c\x82\xe9\x8a\x5b\xb8\xf8\x06\x97\x22\xb5\xae\xaa\xce\x95\xd3\xc2\xd8\x6d\xe5\x84\x65\x6e\x16\x8e\x1a\x6b\xe6\xda\x29\xa1\xed\x76\xe2\xbe\x99\x1d\x8b\xcd\xf9\x28\xfb\xa3\x38\xed\xd4\x5c\xc5\x3c\xd0\x4d\xa6\xe3\x89\x9e\x46\x82\xfc\xa1\x67\x3d\x0a\x59\x5b\x5a\xf9\x91\x5a\xd1\x8a\xc9\xca\xea\x22\x5f\xfb\x5f\x25\x5f\xef\xdc\xd9\xad\xf2\xb9\x4a\x18\x56\xcd\xd2\x52\x6b\xec\x5c\x3d\xc9\xd7\xce\x96\xc5\xfa\x7c\xba\xca\x37\xc5\x05\x15\x5a\xd1\xbc\x9b\xc8\xd8\x61\xf8\x18\x35\xac\x59\xec\x49\x49\x85\x78\x8c\x88\x66\xb5\xe8\x95\x34\x17\xf9\x8e\xbf\x4e\xbe\xdd\x5f\x28\x1f\xf3\xdd\x22\x9f\x3d\x1f\x2e\xf2\xf9\x28\x8e\x08\xd7\x92\xe4\x75\x4f\xfb\x06\xa3\xa9\xa2\x55\x49\x98\x16\xa4\x90\xfe\x40\x8d\xd0\xa2\x95\xc2\xac\x3e\x32\x7c\x24\xdb\x22\xec\x89\xbf\x0d\x9e\xd3\xa5\xf2\xe7\x05\x64\x40\xa8\xff\x09\xdc\xaf\x6f\xf7\x6f\x03\x33\xcf\xd5\xd2\x7d\xf7\x36\x10\xf3\x7c\xb8\xfd\x10\xf2\x0e\xe3\x13\xcc\xc0\x50\x95\x14\xc0\x73\x69\x8d\x06\x18\xe1\x0a\x74\x79\x09\x52\x08\x3d\x47\xa5\xb4\xd0\xba\xc0\x5d\xb4\x6c\xec\x28\x3b\x37\x39\x30\xcb\xf4\xed\xcb\x52\xcb\x9d\x62\xcc\x2a\x6d\x3c\xf4\xc6\x8f\x14\x94\x40\xc4\xb9\x56\x96\xe0\xf9\xc8\x9d\xd2\x07\x28\x9b\x46\xf7\xa6\xcd\x2d\x75\x45\x6f\x7a\x8a\x49\x1b\xc5\xdb\xe8\x91\xec\xe1\x6e\xc5\x93\xff\x82\xf9\xf2\xfe\xe6\x6e\x67\x2b\x6e\x25\x2b\xa4\xa2\x5e\x56\xd5\x4e\xfd\xa9\x52\x2c\xaf\x72\xb2\x95\x0f\x2a\xe4\x66\xf0\x47\xb9\x31\xbb\x22\x7a\x1d\xfd\xb0\xe6\xdb\x5e\xe2\xc5\x6f\xae\x31\xea\x57\x81\x9f\xf0\x02\xc2\xbf\x7a\xba\x3a\x39\xfa\xc2\xe8\xe9\x88\xb0\x75\xbc\xca\x0b\xdf\x78\x03\x5b\xe3\xeb\xe4\x50\x78\x3c\x8f\x18\xb4\x8b\xff\x50\x01\xed\xf5\xae\x70\xbe\xb5\x39\x52\x02\x1f\xfd\x81\x50\x4a\x73\x57\x03\xfc\x90\x5b\x46\x6a\x08\x72\x7b\x3c\xda\xc7\x95\x67\x47\x3e\xe2\x6d\xb4\x53\x2f\xce\xe6\x6f\x9e\xcc\xaf\x9e\x9f\xcc\x97\xac\x83\xcf\xf9\xe6\xe1\xe9\x9d\x5b\x4f\x66\x95\x71\x51\xe2\x1c\x95\x65\x91\x8d\xb6\x2a\xbc\x63\xa0\x2c\xc3\xd5\xed\xd2\xf9\xce\x39\x50\x5a\x3b\xbb\x5a\x83\xdc\xb9\x9d\x9a\xa6\x69\x3e\xf8\xa3\x27\x63\xea\x52\x06\xb2\x70\x40\x8b\x70\x40\xe3\xe5\x80\x5e\x0e\xb9\x17\x27\xf4\x9a\xbb\x58\x3c\xd9\x2e\x79\xf4\xfb\xe8\x1f\xa2\xff\x18\xf0\x3d\xbf\xaa\xce\x09\x31\xa7\xf7\x1f\x3f\xdd\xbe\x7d\xf9\xcb\xbb\x2f\xf1\xb0\xc2\x1f\x3e\x63\x59\x7e\xb8\xbb\x5c\x29\x70\x50\xbb\x80\x50\x6e\x83\x8d\xc8\xe0\x86\x97\x48\xe5\xf9\x99\x88\x24\xf5\x07\x70\x08\x19\xa2\xb5\xda\x28\xad\x35\x91\xb0\xc8\x21\x2a\x17\x97\xf7\xec\xc0\x60\xac\x31\xd6\x82\x23\x2c\x64\x01\x77\x25\xa5\x8a\x6a\x4d\xfd\xa4\x28\x23\x25\x62\x92\x4a\x49\xfd\x41\x51\x7d\xe2\x34\xb5\x19\x9e\x34\xa5\xf3\xc8\x58\x5c\xfa\x7a\x28\x28\x87\x9c\x2c\xfe\x93\x7d\xb2\x37\xff\x49\x75\x8d\x27\x30\x05\x03\x1b\xf4\x0f\x27\x50\xfb\x02\x6d\xc6\x92\xa8\xa2\x78\x18\x64\xc2\x7d\x17\xc3\x07\x1c\x47\x5e\x9a\x6d\xe4\x9c\x23\x1a\x96\x39\x86\x68\x71\xf4\xce\x65\x9c\x9a\xd6\x98\xb6\x8d\x4b\x5c\xca\x12\xff\xe5\xba\x76\xff\x1f\x8d\x6b\x0a\x7a\x17\xe2\xa6\xed\xb9\x00\xd6\x23\xb4\xa9\x4b\xac\x8a\xfc\x1c\xa9\x04\xfa\x31\xce\x1e\x24\x38\x78\x6b\x36\x63\x55\x55\x44\xc1\x32\x47\x08\x7a\x0b\xe4\x99\x81\xa3\xa9\x8d\xa9\xeb\x38\x87\xa5\x2c\xd1\x5f\xaa\x6b\x12\xb1\x47\x9c\x0c\x3b\x15\xfd\x4d\xf4\x43\x60\x5e\x0e\x08\x20\x6b\xa1\xde\x0f\xef\x5f\xbd\x4d\x3e\x83\x1c\x5f\xd0\x9c\x5e\xdd\x7d\xb8\xff\xf8\xea\xe3\xa7\xbb\xdd\xfe\x4d\x9c\xe2\x02\x10\xe7\x23\x0b\x48\x81\x70\xc5\xc0\x50\x15\x5c\x09\xce\x74\xed\x8f\xe4\x68\x4d\xa5\xda\x03\xaa\x68\x31\x40\x24\x76\x4a\x39\xdf\xf4\x3d\xa0\x5a\x78\x92\xf9\xc1\xfa\xa1\x13\xd2\x08\xd9\x51\x87\x2b\x21\x01\xb2\xd5\x8c\xdd\xc9\x0a\x12\x7c\xb5\xe6\x11\x87\x39\xf7\x37\x51\x19\xac\xae\x2f\x64\xdb\xed\x5f\x08\xb7\x22\xa6\xdc\x7d\xb8\xfd\xf8\x6a\x05\x4d\xd9\x56\xa8\x04\xca\xcd\xda\x02\x5b\xc0\xd2\x95\x65\x9c\xb9\x52\x55\x96\xab\xb6\xf3\x3d\x05\x45\x6d\x5b\x02\x27\x90\xa1\x9e\x97\xfe\x08\xa1\xfa\x2c\xa2\x12\x9e\x66\xb5\xb1\xbe\xef\xb4\x31\xda\xf5\xab\x88\x95\xb3\xd5\x0c\x1d\x48\x6d\xc0\x7f\x5b\x7c\x3d\x1c\xe6\xca\xdf\x04\x94\xd3\x3f\x57\xc6\xad\x42\x25\xa8\xdc\x4c\x1c\xa8\x0a\x98\x57\x25\x8c\x59\x0b\x55\x5b\x09\x3d\xf6\xbe\xa1\x00\x36\x75\x47\xd0\x08\x52\x3c\x89\xc2\x8f\x10\xae\x12\x76\xdd\x33\x09\x87\x4e\x1b\x1b\x24\x24\x2e\x48\x58\x2f\x12\x46\x56\x2c\xf2\xa5\x4f\xf2\x7d\x73\x7c\xbf\x92\x6f\xad\xf6\xbd\xc0\xce\x6c\x25\x2a\x40\x5b\xcd\x79\x05\xfa\xa2\x4c\x2b\x08\x63\xd1\x41\xdd\xb7\xc2\x1e\x26\xaf\x29\x60\x9d\xb7\x14\x1d\x40\x09\x72\x59\xfa\x1e\x21\xfb\x2d\xf9\x5a\x6d\xad\x71\x3d\x73\xa4\x1a\x2a\x67\x03\x79\xfb\x65\x8c\xe3\xe3\x9f\x2b\xdf\xab\xe7\x23\xcc\x51\x01\x3a\x77\x3e\x39\x30\xe4\x30\xc8\xa7\x3a\xa4\x87\x56\xd8\xd3\xc1\x2b\x02\x58\xef\xad\x39\x01\x84\x27\x59\xfa\x16\x62\xf7\x4b\xe2\x01\xf4\xd4\x7b\xf4\x52\x97\xb0\xde\xb3\xfe\x4d\xf4\xfe\x17\xc6\xf7\x33\x7f\xea\x87\xdb\x8f\xd7\x0e\x4c\x09\x04\xa7\xea\xac\xab\x38\x2f\x51\x5e\x41\x1c\x8f\x13\x72\xc7\x41\x34\xfe\xe0\x4f\x1e\x51\x60\x8f\x9e\x72\xe2\x47\x20\x08\x88\x0c\xf2\x02\xe3\x66\xa7\x94\xf5\x75\xd7\x01\x26\x5f\x4a\x59\x0d\x41\x4a\x57\xd9\x7a\x2e\x2f\xb3\x30\x4e\xdc\x05\x53\xf6\xef\x02\x6a\xfe\x67\x0f\xfa\xc5\xc2\x4d\xee\x82\x3f\xbd\x58\x35\xc9\x08\x8c\x0b\x9e\x1b\xd3\x4d\x75\xa0\xc7\xb6\x7f\x8c\xe8\xb1\x6d\x44\x09\xb8\x57\x60\xb0\xc2\x43\xb2\xc5\x00\xf9\xde\xf8\xd6\xfa\x7e\xb4\xac\xe2\x4d\xc7\x2a\x52\x8f\x00\x59\x40\xce\xb6\x9d\x8e\x51\xb4\x8b\xf3\x90\x2f\xaf\x83\x55\xff\xaf\x2e\xd5\xe5\x11\x58\xaf\x09\x6f\xae\x36\xd5\xab\x2f\x2b\x68\xee\x6e\x5e\xd6\xfb\x5d\xa3\x91\x9b\xb6\x44\x15\x2e\xc1\xe9\x1c\xb5\xa6\xaa\x12\x71\x76\x9b\x9c\x73\x84\x0b\x0e\xa1\xd1\x8b\xcb\xbb\x78\xdf\x99\xd5\x66\x5b\x33\x0a\xb9\xf2\x99\x3f\x78\xec\x85\x00\x04\xd4\x49\xea\xab\xc1\x47\xe7\x89\xb1\xc5\xd1\x06\xe9\x4a\x37\x07\x72\x5f\x24\xa3\xb7\x01\x5b\x31\xda\xc5\x4d\xa8\x51\xd6\xd1\xdf\x46\xdf\x3d\xb3\x3a\xfe\x4c\x91\xaf\x69\xbd\xdb\x08\x3b\x58\x80\xf6\xac\x1b\xed\x5c\x7c\x98\xf3\xc4\x31\x16\xd2\x60\x4a\xa9\x85\x11\xd6\x0a\x71\x14\x5a\x6e\xeb\xfa\x2a\x2f\xf1\x82\x03\x0c\x9a\xab\xbc\xe3\x5a\x8e\xf9\x6d\x79\xff\x3a\x61\x8f\x64\x6f\x76\xec\x19\xd7\xfa\x55\xea\x3f\x5e\x2b\x25\x2e\x60\x27\x97\x02\xeb\x57\xf7\xaf\xef\xde\xdd\xbf\xbe\xdb\x5e\xbf\x7f\xbe\xa2\xbb\x26\xf0\xac\xf5\xd6\x55\xd2\x78\x01\x06\xeb\xbb\xe5\x5f\x30\x78\xa5\xa6\x09\xf4\x87\x83\x47\xe3\x08\xfa\xe3\x71\xd9\x3f\xe5\x9a\xb4\x0d\x2c\x88\x66\x79\xfd\xf4\x18\xed\x98\x11\xbe\xeb\xe6\x63\x9c\x75\x00\x0b\xef\x94\xd2\x4a\x29\x25\xcf\x9d\x10\x09\xf6\x43\x5d\xd7\x1e\x36\x4d\x13\x45\xd1\x5f\x07\x5b\x49\xff\xc5\x3a\xbc\xe4\x6f\x79\xa9\x03\x4f\x8e\x9e\x80\x83\xf5\xf5\xf2\x2f\x38\x78\xa6\x8f\x47\x70\x38\x9d\x7c\x71\x38\x80\x29\x08\x6c\x96\x2d\xd6\x7d\x9d\x8a\xe4\x0f\xab\x16\xa1\x38\xbc\xbd\x68\xb1\xfe\x73\xee\x38\x7f\xd2\xa2\xae\xeb\xe8\xaf\x63\xf3\x67\xeb\x70\xfb\xfa\xf6\xdd\x8a\x8b\x7a\xfb\x73\x3a\xc4\xfd\xc6\xcc\xa7\x18\x59\xcf\x9c\x17\x36\x2e\x7d\x1e\x70\x5a\x63\xb4\x88\x38\x87\x4c\xa9\x78\xc5\x45\xe8\xdc\xb9\x75\xee\xc2\x92\xcf\xcf\xed\xf5\x93\xaf\x7e\x9d\x26\xd7\xf1\x88\xfe\xa2\xf1\xb8\x18\x3a\x3f\x3b\xa7\xf0\x26\xf3\x30\x8e\xac\xb7\xd6\x57\x16\x1c\x3d\x5d\xc6\xe3\x14\xc6\x21\xf5\x27\x9f\x1d\x0e\x89\xad\xe6\xc2\xda\x40\x6d\xd2\x00\x38\x17\xd7\x4f\x7e\xf8\xf5\xe3\x91\xc4\x26\xd8\x07\xec\x92\x41\xb2\xe2\x9d\x86\xe7\xf5\xdd\xcd\xf7\xfb\xdd\xfe\x7d\x58\xb7\xa1\xda\xfa\xe6\xc3\xb7\x7e\xf5\xee\x92\xdb\x16\x37\x0c\x4c\x0a\x1c\x08\x41\xc5\x50\x68\xd4\x69\xa7\xd5\xfa\xb1\xd5\x4e\x33\x50\xb7\x49\xde\x25\x22\x3e\xce\xd9\xf2\xd8\x99\x08\x94\xa7\x86\xc7\xd6\xf8\xdc\x8f\x08\x64\xe0\xc4\xbe\xf9\xcb\x50\x61\xbf\x3c\x97\xba\x53\xb3\xd3\xd1\x9b\x28\x7a\xf5\x0d\x6c\xc2\x8f\xaf\xee\xd4\xa0\xbb\x4e\x10\x56\x42\xcd\x88\x6c\x48\xbb\x8d\x16\x7f\xca\x66\x9c\x6b\x82\x1f\xea\xa4\x3b\x08\x79\x5a\x31\x56\x97\xf7\x91\xb8\x5d\xb1\x0e\xbf\x7a\x5f\xbc\x96\xc8\x1e\x4c\xd3\x68\x16\x20\x33\xb8\x6a\xf0\xf2\x3e\xe5\x8d\x35\xce\x19\x25\xce\x28\x99\xfc\x58\x2b\x50\x02\x15\x45\x9b\xd8\x3c\xd2\x7d\x1b\x78\xeb\xd7\x5c\xaf\xe8\x19\x07\xce\xda\xab\xb7\x6f\xde\xde\x3f\x47\x62\xb8\x26\x54\x06\x24\x86\xbb\x9b\xbb\x0f\x7f\x04\x57\x32\x4a\x51\xe6\xe0\xf8\x20\xe2\x28\x2f\x7c\x97\x68\x6b\xbd\x2b\x51\xda\x38\xd1\x34\x66\x64\x1e\x2a\xc6\x2b\x5d\x8e\x2d\xd1\x5c\x80\x62\x3c\x19\xe3\x62\x3a\x37\xcb\xb3\x33\x94\x19\x83\x91\xb7\xfe\x68\xfc\xc9\x31\xee\x94\xe3\x56\xb8\x09\x1c\x38\xf1\x06\x22\xcd\x10\x05\x92\x96\x46\x74\x20\x35\xc6\xcb\x80\x81\x5b\x5d\x7c\x94\x5f\x73\xcf\x7b\xfb\xc2\x9b\xfc\xfa\x9e\x37\x02\x85\x6d\x6c\x88\x46\x55\x99\x10\x08\x17\x04\x96\x65\xf6\x18\xd9\x16\xf9\x46\x03\x84\x7c\x47\x41\xb4\x4c\xdb\xc6\x36\xbe\x6b\xac\x2e\xb6\xf5\x30\x0c\xc3\x3c\x86\x9b\xde\xd4\xa6\x74\x98\x65\x6c\xbd\x7c\x8c\xc4\x01\xe0\x18\x7d\xfb\xa6\x77\xcd\x55\xaf\x03\x7e\x52\x11\x70\x9e\x03\x0f\xf9\xfe\xf6\xf5\xf7\x6f\x3f\xe3\x86\x5f\x8e\xa2\xb7\xff\xee\xc3\xcd\xed\x8a\x18\xfa\xfe\xbb\x57\xb7\x1b\x02\xf2\x13\xf1\x27\x7f\x12\x31\x46\x95\x50\x6a\xa8\x3a\x3e\x54\x94\x50\x5d\x74\xd0\x33\x0a\x9a\xb6\xe3\x13\xf7\x87\x9d\xc6\xdc\x49\x7c\x1c\xd2\xde\x74\x62\xac\xbd\xe8\x9a\x23\x18\x66\x49\x59\x6e\xd2\x72\x23\x8f\x16\xce\xdd\x64\x41\x06\x9a\x28\x89\xdb\x47\x1a\xe2\x7f\x6f\xa2\xff\x26\x58\x15\x37\xf7\x97\x02\xab\x78\x1b\x38\xdd\xd6\xb5\x06\xee\x3f\x7e\xb8\xb9\xbb\xbd\xf9\x7e\x7f\x7b\xb3\x2f\x94\x4f\x7b\x40\x98\xef\x46\xe7\xad\x06\x4e\xfa\x52\x01\xeb\xbc\x3c\x64\x27\x60\x53\x90\x6e\xd1\x6c\xad\x57\x5d\x35\x02\xe7\xf5\x51\x80\x0c\x48\x1b\x4b\x80\x7d\x37\x5b\x42\x96\xde\x26\x04\x4c\x51\x04\x92\x2b\x1e\xe9\x85\x6f\xf8\x8a\xdd\xf7\x3a\x03\x81\x35\xe7\xf7\xfb\x88\xfb\xc9\xeb\x78\xf0\x27\xeb\x7b\x7f\x92\x9a\x83\x7a\xc7\x0d\xcf\x7c\x65\x1f\x86\x0d\x34\x3e\xf5\x4c\x1c\x80\x9c\xe2\x53\xf0\xd7\x41\x88\xcf\xda\x90\x37\x77\x99\xd9\xdf\x3f\xe3\xfb\xf9\xf4\xf1\xca\x66\xbc\x42\xfc\x6f\x35\x85\xc0\xce\x2a\x8d\xcb\x54\x38\x61\x32\xcb\x51\x06\xbd\xca\x9b\x46\x36\xd5\x11\x8c\x25\xd9\x29\xd7\x39\xab\xce\xc3\x63\x94\xbb\x9c\x8e\x60\xf2\x95\xe7\xb5\x71\xe0\x10\x23\x57\x99\x28\x02\xb1\xbe\xf8\x30\xbf\xd0\xe6\xab\xb5\x4d\xc9\x4a\x50\xcd\x34\x8d\x65\xaa\x5b\x61\x33\x27\x48\x0e\x3d\x2e\xc6\x83\xec\x4e\xe9\x01\x1c\xe1\x53\xa3\x07\x7f\xc8\xeb\x5c\x1c\x41\x80\x13\x6a\x8c\x06\x6d\x6c\x96\x46\x93\xc8\x3d\x9e\xe2\x69\x3b\x5d\xea\x99\xa3\xb5\x32\x0b\xdc\xdc\xde\xbc\xbe\xb9\xbd\x89\x27\x4f\x1d\x68\x16\x2b\x63\x3b\xfd\x78\x18\xb6\x87\xb9\x05\xad\x27\xd6\x53\xd0\xac\xfc\x81\x36\x4a\x93\x6a\x97\x46\xfb\x10\x91\xb9\x84\x08\x5e\xb2\x0c\xad\xd9\xb3\x49\x35\x9b\x58\x9d\x8f\xa0\x94\x9c\x22\x43\x85\x60\x8a\x50\xae\x94\x95\xd2\xec\x52\xfb\x50\xd8\x5d\xe4\x0f\x55\xdd\xb4\xf0\x31\x1a\xdb\x4e\xd6\xae\xad\xe9\x30\x8d\xfd\xd2\x8e\x48\x4e\x21\xb7\x77\xe5\xdb\x0e\x44\xd8\x9f\xf1\xa0\xbe\xfa\xb9\x73\x18\x1c\xfd\x44\x70\x15\x68\x7f\xcd\x31\xb1\x21\xc9\xa2\x26\xc8\x12\xa6\x10\xd5\xd5\xce\x40\x67\xb9\x64\xce\x0e\x42\x9c\x40\x09\xad\xe5\x9c\x59\xa3\x38\x1f\x96\xf6\x36\x65\x68\xef\x6f\x3f\xb7\x17\x5e\x1f\x5f\x12\x87\xbe\xd5\xde\x41\x57\x98\x89\xb6\x34\xc7\xa4\x72\x79\x11\x23\xdf\x60\x64\x31\x33\xc4\x98\xc3\xce\x40\xed\x1a\x66\xb4\x3f\xa6\x62\x02\x39\xc4\xd8\x51\xc6\x8c\xb2\x3a\x50\x8a\x47\xbb\x4b\x5d\xb3\x0e\xb1\x97\xe5\x94\x5a\x59\xea\x5f\x02\x5f\xdd\x7c\x0e\xab\xaf\xc6\xe7\x15\x39\xea\xf6\xf5\x6e\xff\x6e\xb7\xbf\xfd\xf8\xe9\x5a\x0f\x7b\x3d\x75\xdf\xde\x7e\xb8\xdd\xdb\x0e\x41\x8d\xe5\x24\xa5\x64\xb8\x03\x75\x51\x58\x54\x02\x73\x2e\x26\xdd\xe7\x05\x02\xa9\xb2\x59\x11\xa3\x12\xce\x1d\xc4\x71\x84\xca\xf9\x94\x94\xe7\x31\x3c\x85\xf1\x91\xb5\x21\x94\x19\x69\x42\x88\x14\x96\x72\x44\xfc\x09\x43\x48\x98\x46\x1e\x7a\x26\x00\x07\x0d\x68\xf3\xcc\xf6\x23\x2c\x0b\x4d\xb0\x21\x18\x93\x39\x93\x4c\x72\x4f\x08\x01\xed\x49\x47\xbb\x58\xff\x53\xea\xd8\x2e\x3a\x8a\x89\x4b\x41\x51\x03\x6c\x5e\x58\x94\x03\x7d\x26\x83\xe9\xcb\x55\xc7\x3c\x8f\x8b\x12\xce\x23\x86\xe0\x88\x4a\x9f\x26\xe9\xf9\xb4\x3e\xd6\x2f\x56\xc6\xe4\x8b\x5f\xd2\xb1\xcb\xf3\xcf\x3a\x32\xf8\x95\x8e\x20\x81\x97\x75\xbc\x72\x68\x5f\x33\x6d\x56\xfc\x83\xfb\x9b\xfb\x00\x41\x14\x3c\xac\xd7\x21\xff\x74\xfb\xc4\xe7\xb3\x68\xfd\xe9\x3f\x80\x4f\xb7\x89\x06\xc6\x4b\x27\xa5\x50\x75\x7d\xb2\xa7\xa6\xe9\x00\xf3\x12\x38\x39\x38\x90\x12\x3f\x8d\xfd\x89\x4f\x95\x13\x52\xb7\xa2\xe4\x70\x4e\x63\x5e\xc5\x63\x49\x14\x2e\x1a\x53\x2f\x9e\x45\x6d\x2a\x3b\x67\x95\x9e\x6a\x0c\x6b\xa4\x24\x72\x25\x51\x4a\x56\x82\x14\x92\xae\x38\xa1\xd3\xc5\x5f\xfd\xf7\x5f\xc9\x19\x6c\xa3\x6f\xca\xb9\x7d\x46\xad\x97\x10\x50\x7b\x5a\x4b\x29\x75\xd7\x81\xdc\x80\xbc\xeb\x06\x20\x3c\x05\xad\x9a\x1c\x80\xd4\xf7\x87\xd1\x1f\xc5\xa9\xa9\x85\xd4\x43\x2f\xcf\xe3\xaf\x12\x53\x6a\xe9\xa4\x6a\xc2\x9a\x18\x2f\xfb\xf0\xab\x67\x15\x66\x57\x16\x8e\xb5\x02\xe1\x92\xfb\xfb\x2c\xfa\xfb\x87\xc0\x18\xb1\x78\xb0\xcb\x39\x3e\x82\xd4\x01\x1d\xdc\x12\xe7\xb5\xf3\xa7\x8d\x70\x73\xe9\xdc\x05\x3a\xac\x98\xcb\xeb\x27\x3f\x6d\xd5\xf5\xdc\xb5\xc7\xe3\xf1\xe8\xdb\x87\x5a\xca\x0d\xf3\x34\x18\x9d\xc5\x8c\xd6\xef\xd1\x26\x72\x51\x11\x57\xdb\x2b\x0e\xc4\xcd\x75\xe7\xbc\x82\x2a\x2f\x4f\x5c\x79\x63\xed\x21\xfc\xb3\x3d\xfc\x38\xb8\x6d\xef\x25\xc8\x66\x01\xd2\xe5\x4c\x5f\x31\x20\xab\x28\x8f\xfb\xaf\xdf\x73\xdd\x81\x83\x06\x81\x65\xc9\xad\xc8\x51\xcb\xb3\xbc\xac\xda\x0e\x5e\x2d\x3f\x98\xe5\x77\x9f\xdf\x27\x1e\xc9\x06\xed\xd0\x05\x6f\xf3\xef\xc2\x9d\xfd\xdd\x4d\x80\xe7\xbe\xbb\xd9\x04\x8a\xb2\x80\x32\xb9\x7c\xbd\xbb\xb9\xd5\x89\xe1\x2a\x27\xa4\xf2\x83\x6f\x0a\xab\x40\xfe\x94\xde\x2c\xbd\xdd\x21\xf7\x30\x66\x36\x4b\xbd\x00\x1a\x96\x55\xb6\x09\x29\x44\x8b\x67\x37\x17\x30\xf4\x03\x7f\x24\xc9\xb0\x83\x01\xc3\x32\x54\x78\x5d\xda\xfb\x76\x73\x22\xe1\xce\xe4\x95\x7d\x8c\xfc\x54\x68\x05\xb2\x6b\xf2\xf4\xf2\xec\xa0\x7d\x18\x73\x5b\x78\x01\x14\x2c\xbe\x6e\x6c\xd1\x2f\x49\x2f\x38\xd2\x6b\x7b\x7f\xb7\xe6\xa6\xdc\x7c\x7a\xfd\x8d\xf6\x3e\xbe\xfb\x70\x9b\xa0\x0d\x6b\x9a\xc6\xf9\xcc\xf7\x79\x25\x41\x76\x05\x39\x5b\x5a\x8c\x96\x16\x87\xdc\xe5\x5e\x02\x45\x32\x97\x6d\x6c\x18\xe5\x62\x19\xe9\xbc\x1c\xd6\x73\x87\xed\xf1\x0e\xad\xdc\xa0\x17\x84\x96\x9b\xdb\xd5\x88\xbd\x5d\x56\xcd\xb0\x93\x0f\x27\x88\x93\xe3\x03\x31\x95\x04\xb4\xf7\x14\x0c\x89\x3e\xeb\x1d\xb2\x04\x7b\x04\x4a\x4e\x8c\xee\x3d\xae\x03\xb6\x1e\x79\x44\xe1\xfe\xe5\x9a\xc9\xfe\x8f\xe1\xc6\x98\x7e\x8d\xad\xf7\x12\x5a\xef\xe3\x0a\xf1\xfc\xe1\xf6\xe3\x17\xe0\x7a\xcf\x0a\x29\xbf\x00\xd7\xab\x97\x49\x6f\x38\xf7\x0a\x34\xf3\x54\xc4\x62\x40\xb4\x71\xdc\x4c\x8d\xaf\xc9\xb1\x32\x15\x86\x8f\x11\x20\x79\xe6\x83\x85\xc5\xb9\x3b\x1c\x80\x3e\xce\x76\xfd\xb6\x82\x42\x2d\x7e\x6f\xc7\x90\xef\x8b\x42\xed\x0a\xc6\x26\x33\x71\xef\xb8\xb1\x4f\xc8\x7a\x19\x86\x90\x31\x03\x21\x10\x7c\x32\x8c\xb1\x00\x25\x39\x8f\x42\x88\x59\x11\x89\x61\x11\xf6\x1a\xf6\x48\x36\xf9\x4e\xae\x9c\x5c\x8b\x1d\xf3\xfb\x35\x59\x7f\x77\xf7\xfe\xbb\x57\x6f\xe3\xfd\x9a\x78\x98\x7c\xfc\x94\x38\x95\x69\xa7\x41\x94\x2b\x5d\x50\x42\x48\xae\x88\x11\xb4\x28\x11\x52\x46\x63\x9c\x94\xbe\xf4\x7a\x31\xe6\x2b\x94\xc9\xaa\x4d\x05\x80\x80\x96\x8b\x15\xed\x6a\xe4\xe9\x63\x94\x17\xd1\x66\x43\xc2\x5d\xa1\xb9\x78\xac\x6b\xdd\xd2\xb2\x67\x7c\x0e\x5e\x2d\xbe\xc8\xfd\x0f\xef\x5f\x05\xe8\xa8\xfb\x0f\xe0\x75\xf2\xdd\x0b\x52\xcc\x24\x44\x91\x36\xc7\x32\xb7\x8f\x11\x86\x79\xc1\x29\x52\x69\xc6\x25\x92\x79\x49\xb4\xd6\x31\xd3\x9a\xb2\xb2\xc8\x60\x99\xe7\xc6\x54\x7a\x67\x94\x3e\x4f\x73\x05\x91\x51\xf0\xe0\x47\x48\x09\x67\x78\x97\x4a\xee\x9b\x71\x5c\x9e\x98\xa9\x79\xf0\xc7\x83\xb5\xa9\xce\x18\xeb\x01\x8a\x8b\x3f\x55\xbb\x71\x9d\xdb\x65\xc0\x0b\xfb\xaf\x93\x79\xb1\x7c\x37\x39\xca\x1b\x5f\x09\x5a\x20\x25\xa9\xc9\x33\xd3\xe0\x3a\x87\x70\x18\x86\xf8\x54\xd5\x42\xe2\x32\xc3\xa8\x2c\x9b\xfa\x31\xb2\x3b\x23\xf5\x79\x98\x2b\x8c\x95\x44\x07\x3f\x61\x4a\x39\x23\xbb\x54\x30\xdf\xf4\xfd\xf2\xc4\xdc\xcc\x47\x3f\x1d\xad\x49\x6d\x46\xe9\x22\x74\xf6\xa7\x26\x08\xbd\x89\xa7\x5f\x2f\xf3\xed\x87\x30\x3d\xbf\x2d\x73\x72\x40\x45\xe7\xa5\x14\x25\xd4\x92\xd8\x2c\x77\x2d\xee\x8b\x32\x5b\xf7\xe3\x24\xfb\x29\xb1\x11\x09\x62\x1f\x08\x23\xdf\x16\x7b\xe9\xeb\x2f\xc5\x8e\xf6\x31\xbf\xe4\xf9\xac\xbb\xee\xdb\xe8\xb7\xd1\xfb\x70\x1b\xf9\xf6\x5a\x76\x78\x8d\x14\x5e\xe8\x4f\x2e\xde\xff\xf6\x3e\x20\x92\x47\x9f\x9e\xc8\x96\x76\xfb\xc0\xd2\xb9\xed\x2d\x06\xd2\x73\xcc\x54\xed\xab\x35\x9f\x27\x11\x12\x6b\xcc\x7b\x37\xb7\x16\x50\x57\xfa\xc1\x0f\x14\xe4\x20\xad\x1c\x64\x16\x66\x26\x47\xe5\xd4\xf1\x9d\x86\xbd\x6e\x14\x03\x29\x80\x33\x8a\xcd\x5c\x1d\x02\xac\xac\x3f\xcd\x22\xce\xe6\x43\x5c\x1d\xbc\xf5\x86\x18\x0c\x60\xee\xc7\xa2\x80\xaa\x6c\xcb\x12\xb3\x65\x5d\x91\x47\xba\x37\xbb\x72\xad\x99\x4c\xc2\xde\x70\x31\xc2\x9f\x23\x2c\x47\xe0\x7d\x04\x6e\xdf\x27\x9d\xab\xc1\x38\xdb\x0d\xf6\x03\xe0\xbe\x62\x96\x90\x82\x50\x54\xfa\xa3\xa7\x1a\x48\x50\x78\x02\xb7\xb0\xf0\x0e\x1c\x9c\xf3\xb9\x9b\xf3\x90\x4f\x5c\xe0\xb8\x9d\x4f\x3e\xb0\x9f\x4c\x21\x76\x1f\xdb\xb0\x8f\xf1\x0b\x8e\xc5\xbf\x8e\xfe\xf7\xe8\xff\x8c\xfe\xef\x2b\x4a\xfd\xcd\x95\xb0\xfe\xd3\x9b\xb7\x1f\x82\xdd\xfc\x69\x39\xa3\xef\x6f\x6e\x3f\xbd\xc0\xb8\x7c\x7b\x1f\x72\x8e\x2f\xf9\x91\xef\x3f\xd3\x1b\x6e\xd6\xf0\xc7\x6a\x15\x7d\x78\xb5\x58\x1b\x6b\x7e\x51\x3c\x6d\xec\x3c\x14\xe0\x50\xf1\xb2\xe0\x4c\xca\x22\xf3\x94\x53\xca\x0b\x2f\x9c\x01\xb4\xf0\x78\x8a\xdb\x99\x5c\x1f\x68\x4b\xd9\x96\x26\x15\x3d\x61\x28\x66\x54\x76\x13\xf1\xe3\xc1\x1f\xbd\xc5\xa0\x1c\x24\x13\x94\x4f\xa6\x10\xd2\x28\x32\x0b\xc1\x34\xd3\x3b\x6e\xc8\x7c\x3a\x96\x90\x4b\xc6\xf2\x1c\x53\x4e\x51\x29\x0f\x71\x4a\x1e\x23\x72\xc4\x07\x7c\x54\x79\x56\x90\x52\xa3\x94\x6a\x49\x61\xe9\x20\x97\xb0\xca\x31\x66\xb4\xd4\xa2\x2d\x4a\xdf\x11\x84\x08\x18\x88\xa5\x82\x45\x71\xc4\x93\x6e\xef\x76\x2e\x7a\xbb\x56\x40\xaf\x76\xec\x66\xbb\xff\x7d\x08\x03\xbc\x7b\x46\xe1\x11\xb7\x26\x2f\x12\xe1\x06\x90\x01\x4d\x3c\xf4\xd6\x5b\x9f\x33\x50\x81\x52\x73\x65\xd8\xe9\x20\xc6\xc9\xec\x1c\x29\x0a\x6d\x18\xca\x2b\x28\x05\xb4\x25\xc2\x8c\x51\xa3\x0a\x4a\x30\x0b\x9c\xee\x78\x9f\xee\x56\x5c\xe9\x08\xbc\xce\xe2\xfd\xfb\xe8\xff\x77\x65\x84\xba\x59\x26\x49\x9c\x55\xb5\x04\x79\xac\xf3\xd2\xc1\x3c\x56\xd5\x43\xbd\x61\x09\xc4\x7e\xb1\xe7\x0c\x48\x63\x11\x0b\x4e\x90\x50\xb3\x05\xa3\xef\x16\x1d\x62\xb1\x77\x3b\x14\xfd\xed\xf2\xce\xf5\x1c\xbc\xb9\xbb\x09\xbc\xc1\xb7\xdb\xa0\x4b\xb3\xab\xe6\x3c\xcb\x2b\x3f\x7a\x26\xe3\x12\x14\x73\xba\x51\x40\x80\x54\xfb\x93\xaf\x76\xc8\x15\xf9\x1c\xc5\xd4\x1f\x1b\x33\x01\xac\xfa\x49\x9f\x02\x06\xc2\x36\x49\x43\xae\xbf\x7a\xc1\xdb\xf8\xec\x36\xe9\xa5\xa5\x1f\x2a\x09\x21\x2e\xe2\xe8\x41\x81\xb1\x80\x7e\x4c\xba\x33\x0e\x4f\xeb\x66\xeb\x5c\x2c\x67\xbb\x53\x42\x3b\xc7\x99\xcf\x6c\x65\xab\x99\x09\x11\xd7\x9e\x05\xb8\x89\x28\x8e\x54\x12\xed\xf9\x0e\x7e\xeb\x4c\x7f\x15\xce\xf4\x7e\xe7\xce\x19\xc4\x49\xfb\x50\xd5\x83\x00\xa6\xf3\x69\x0c\x93\xe2\x3c\xed\xa0\x63\xcc\xe7\x00\x55\xd2\x8c\x20\x9b\x4f\x7d\x14\x25\x91\x88\x87\x3d\x0c\x3c\x2d\xbf\x89\x7e\x17\x10\x8b\x3f\xdc\x7f\xbf\x7f\x51\x75\xb9\x8b\xc3\xcb\xdf\x5d\x40\xe3\x2b\x90\xa7\x2e\x05\x8d\x74\x54\x16\x8a\xd2\x32\xf3\x53\x56\xb7\x72\x59\xe0\xc7\xe4\x14\xbb\x59\x84\x2c\xf4\xed\x44\x18\x23\xf3\x61\x2c\x6c\x6e\xc0\xb2\xcf\x29\xd9\x02\xea\x66\x6a\x81\x59\x31\xcd\xe3\x61\x4f\x77\x3a\xe4\xa8\xdc\x85\xec\x99\x27\x96\x98\x2f\x4d\x87\x57\xc1\x30\xb8\xe2\xd6\xc7\x99\x2b\x72\x60\x2d\xd7\x8a\xc9\xb6\xf3\x63\x39\x39\xe3\x38\xf5\x47\xc0\x6b\x4b\xfc\x48\x48\x7c\x78\x02\x04\xdc\xe9\x0c\x63\x93\xfb\x23\xc3\x44\x53\x6a\x4a\x53\x30\x84\xac\x71\x1e\x85\xad\x8b\xcf\xda\x00\x19\xb0\x58\x8e\x7b\x73\xe1\x32\xfd\x74\xd9\x4f\xbf\x8f\xf7\xdf\x96\xe5\xdd\x13\xb1\x7d\xbc\x7f\xfb\x1b\xf0\xec\xb6\x20\x8e\x2a\x0c\x8c\xa1\x07\x2e\xea\xc1\x1f\xca\xc9\xea\x8a\x93\xc7\x08\xd0\xd6\x60\x3f\x20\x92\x20\xe6\x2c\x99\xeb\x24\x5d\x3c\x1a\x2d\xc8\x54\xdb\x86\xd7\x4a\x8a\x9d\xce\xb4\xce\x1f\x23\x2c\x0d\x5e\x04\xcd\x19\x42\x5a\x59\x2f\x94\x15\x74\xac\xb4\x69\xac\x2a\xfc\xc8\x61\x56\x16\x16\x85\xf5\x43\x59\xbb\xe2\xc8\xf4\x01\xf7\x38\x8f\x7e\xb3\xe2\x8c\x7e\xd9\x91\xff\xfe\xdd\x4f\x08\xff\xe6\x4b\xd1\xad\xe6\x4a\x72\x51\xf5\x4b\xbf\x5a\x3f\x05\xd9\x49\x6b\x88\x1f\x31\x4e\x20\x77\x26\xc8\xee\x84\x3a\x90\x43\x6d\x5b\xd1\x68\x25\x77\x3a\x33\x26\x7f\x8c\x38\xc4\x96\x52\xbb\xf4\x71\x2a\x8d\x76\x9e\xa8\x5a\xd2\x63\x6d\x6d\xeb\x74\xe1\x07\x49\xb0\xc3\x4a\x61\x07\x99\xe8\x82\xdc\x28\xf4\x79\x1e\xfd\xf6\xe9\x0c\xfb\xe9\x09\xf0\x06\x7c\x16\xfc\x9f\x83\xaf\x25\x37\x5c\x5f\x25\x3f\x5a\x53\xaf\x92\x77\x06\x2f\x92\xcb\xb8\xa7\xce\xd2\xb9\x4a\x52\x8d\xa9\x9a\xc8\xd1\xda\x46\xb4\xda\x2c\xbd\x5e\x9b\xc2\x8f\x82\x10\xcb\x58\x05\x6d\x21\x09\x75\xd6\xf9\xdc\x76\x86\x23\x40\xbb\xb6\x3e\x2c\x1d\x3f\x09\x21\x70\x45\x75\x48\xa6\xb3\x63\x98\xc3\x09\x0f\x73\xf8\xed\x25\xf7\x34\xba\x20\x29\xff\xf2\x0c\x86\x40\x53\xad\x44\x98\x24\x43\x31\x59\xed\x18\xf5\x27\xc0\x1b\x43\x7c\x8f\xf1\x3a\x81\x2d\xa8\x3d\xdb\xe9\x8c\xeb\x5e\x40\x68\x30\x56\x85\xce\x09\x84\x52\x5a\x6f\xb8\xe1\x18\xa0\xb9\x37\xc1\xc1\x58\xd6\xd3\x29\xc8\x92\x5f\xaa\x19\x2e\xbd\xb9\xfb\x6a\x06\x7f\xfc\x4a\x18\x0c\x9c\x61\xcb\x84\x9d\xfc\xa1\x3c\x58\x5d\xb1\xa5\xeb\x58\x69\x35\xfd\x2c\xcc\x75\x35\x69\x93\x9d\xe8\x8b\x19\xea\x88\xcf\x45\x25\x28\x60\xb3\xb3\x80\x2c\xe3\x9a\xe0\x60\xa3\x2c\xb2\x7c\xf8\x89\x5e\xb9\xbb\x48\xb2\x7f\x03\x3e\xff\xf1\x39\xff\x7d\x1c\x55\x08\x18\x62\x2f\xbd\x74\x28\x47\xa3\x1c\x23\x27\x40\x4b\xb3\x0c\xaa\x92\x31\x8c\x0f\xc2\xaa\x13\x39\x35\xb6\x47\x95\x94\x44\x50\xad\xc8\x3c\xec\x74\x26\x75\x6b\x96\x3e\x23\xba\x30\x6b\x9f\x39\xec\xb1\xd0\x55\x01\xac\x1d\x34\x41\x16\x0b\x86\x0d\x24\x42\x08\xcd\x43\x5e\x5f\x0c\xf2\x47\xbc\x3b\x24\x28\xd4\xe5\x5d\x2a\xb7\xc2\x85\x6c\x20\xae\x79\x51\x07\xb5\xdb\x6f\xde\xee\x7f\xb8\x7d\x56\x88\xf7\xfb\xa4\x55\x1d\x3f\x08\x4f\xaa\xb8\xce\x53\x97\xc5\x3a\xdc\xa8\x73\x88\xe6\x29\x4b\x41\x31\xb0\xc1\x9f\x6c\x56\xf6\x96\xda\x5e\xb6\x0c\x60\xd0\x2b\xaa\x85\x3c\x1f\x92\xaa\x84\x39\x9e\x4b\xce\x33\x97\xd1\xb8\xcc\x33\x2a\xb4\xcc\x08\x26\x4c\x71\x2a\x88\x92\x6b\x5e\x9f\x4c\xf2\xaf\xfa\xf5\xfb\x6f\x74\xec\x75\x84\x7f\xaa\x5f\x97\xc5\x42\xa5\xbc\x6e\x51\x46\xaf\xfd\xda\x1a\xe4\x47\x84\xe3\x2a\x3e\x08\xe7\x26\x72\xe8\x96\x6e\x55\x8a\x08\x2e\x2f\xdd\xaa\x4c\x76\x24\x68\xe9\x57\x53\x98\x9c\x42\x2c\x95\xf3\x52\x1a\x4e\x80\xb2\x63\x60\xa3\xd3\x7c\xe9\x56\x29\xa5\x63\xca\xae\x31\x9c\x80\xad\x16\x47\xd7\x53\x6b\x7f\x89\x51\x6c\x42\x8c\xe2\xd5\xad\xdc\x17\x0f\x29\xda\xe8\xc2\xf5\xdd\x21\x07\x51\x2b\x69\xfe\xc0\xa4\x57\x71\x64\xf5\x63\x54\x67\x3a\xc5\x1c\x44\x6b\x6d\x03\x0d\xd8\x68\x79\x58\x73\x81\xff\x21\x7b\x0a\x78\x7c\xfa\xee\xe6\xee\xaf\x01\x78\xff\xf1\xbb\x9b\x2b\x7e\xde\x77\xaf\xf6\xf1\xfb\x64\x8a\x47\xa4\x2c\x42\x05\x21\x22\x2f\xab\xb4\x7d\x8c\xe4\xd8\xfb\x23\xd1\xa5\xd4\x2a\xa1\x24\xb7\x39\xda\xe5\x67\x32\xd7\x4d\x6a\x53\x03\x8a\x4d\x34\x17\xb3\x7b\x8c\x74\x17\xd3\xb8\xf5\x63\x71\x1c\xf0\xd0\x3f\x46\x8f\x51\x09\xf2\x63\x14\xc5\x71\x79\x39\xfb\x7f\xb7\x72\x1c\x7d\x5c\x8c\xc4\x64\x75\x1c\x9e\x09\xf4\x6a\x25\x02\x8a\x02\x1b\xc6\x62\x06\x1e\x00\x49\x2b\xd0\xa4\x5c\x10\x8b\x48\x6e\x6a\x69\xf3\x4a\xb2\x1c\xa7\xfe\x98\xfa\x71\x85\x17\x49\x7d\x0b\x2b\x6a\x9d\xde\x96\x7a\xf0\x8d\x2f\xcb\xc9\x1f\xf1\xd8\xcc\xf6\x04\x2b\x68\xc0\x62\x21\x76\xb3\x73\xda\xc5\x79\x9c\x3d\x46\xc8\x4f\x07\x3a\x45\x4f\xbc\x25\x76\x73\x8c\xb6\x17\x9c\x0e\xbc\x62\xd7\xbc\xff\xf8\xee\x85\x9f\xfe\xfa\x05\x62\xd4\xb3\xaf\x27\x48\xc9\x77\xeb\xd5\xcb\x32\xb5\xe3\x48\xdb\x13\x3f\x80\x06\x38\x07\x5a\x29\x3d\x09\x40\xd9\x70\x1e\xdc\x3c\xc5\x85\x87\x60\x08\x58\x1c\x19\x38\x7a\x11\xc3\xf5\xae\xe9\xa1\xd3\x88\x3b\xc9\x38\x40\x9b\x23\xf1\xc7\x56\x37\x9a\xd2\xa3\x39\x0a\x2d\xcd\xe2\x1b\x19\xa9\x97\x8f\x32\x94\x34\x69\x22\xe5\x79\x8c\xb5\x44\xea\xf0\x4c\x8f\xfe\x0b\x3d\xb6\xdf\xd6\xe3\x8a\xd3\xf4\xcb\x7a\x98\xc7\x88\x9f\x40\xf5\x97\x2a\xd2\x13\x7f\x6a\x54\xab\x08\x39\x9a\x03\xd7\xc2\x9c\x4e\x46\xe8\xe5\x83\x10\xe2\x28\x84\x26\x42\x9e\x8f\xb1\x94\x50\xad\xf5\xb1\x11\x0d\x5c\x6d\x32\x7a\xb3\x5a\x15\xbb\xfd\xcd\x33\xbe\xcc\x0f\xf7\x41\xae\x40\x29\x7a\x1f\x27\xa1\x8e\x71\x7f\x5b\x3c\x5f\xb0\xaf\xee\xde\xbf\xba\xdd\x60\xcc\x78\xd7\xb5\x3e\x6a\xbb\x8e\x50\x04\xa2\x19\x02\xa7\xc4\x94\xcb\xa9\xa9\x5a\xe4\x27\xdf\x3b\x2a\x99\x24\x14\xaa\xb2\x84\xf9\x94\x1e\x1e\xa3\x9d\x34\x65\xee\xc9\xe5\x82\xd8\x02\x9b\xa7\x06\x66\xe6\xd8\x79\xe8\xa7\xd2\x66\xed\xe0\xa4\x56\x95\x1b\x90\x11\x35\x48\x0d\x68\xa2\x4d\xb8\xcb\xaf\x9e\xe2\x8b\xf4\x8a\x35\x76\x73\x41\x1a\x7b\xd1\xdf\xeb\x3d\xeb\x05\x96\xfe\xf6\xea\xdb\x5f\x84\x5e\x53\xf0\xef\xe3\xe4\x37\xe0\x0f\xe0\x89\xc5\xf9\xd3\x0f\xc9\xc6\x4e\x16\x20\xc6\x7c\x0f\x88\x6f\x43\xa8\xd6\x8f\xa0\x3c\x9d\xc6\xd1\xf7\x00\x4d\x40\xd6\x75\x7d\xe6\x05\x84\xf9\x98\x1d\x8e\xc0\x2a\x39\x66\x0a\x1f\x41\x06\x5a\xe4\xb5\x3f\xfa\xa3\xa0\x82\x29\xc2\xca\xed\xe4\x9c\x3f\x1a\x7f\x74\xda\xea\x61\xd0\x56\x3b\x6d\x8d\xb5\xd6\x1f\xac\xf5\xae\xd5\x35\xc8\x14\x18\xb4\xf2\xa7\xde\x97\x7e\x94\xd2\x09\x65\xa5\x52\x75\x73\xb9\x97\x5b\xe6\x59\x3c\x3c\xc7\x56\x7b\xf5\x1c\xc9\xee\xee\xf5\xfd\xcd\x4a\xe3\x7d\x17\xd8\xbb\x57\x76\xd3\xbb\xed\x87\xbb\xd7\xc9\x25\x3f\x46\x32\x53\x6b\xc6\x42\x22\x8b\x3d\x1e\xc7\xd1\x32\x60\x6a\x42\xe9\xc4\xb6\x63\x55\x55\x95\xf1\x53\xe5\x61\x6d\x7c\x0b\x88\xa9\xc1\x50\x81\xa2\xae\xeb\x79\xf9\x0f\xa2\x38\x2e\x42\x7f\xcb\xe8\xfb\x70\x9b\x1d\xa8\x8f\xb6\x4f\xc5\x41\xf7\x97\x32\x95\x8f\xaf\x6e\xdf\x83\x15\xf5\xe1\x36\x4e\xde\xdc\xbe\x98\x25\xdb\x71\xc4\x80\x82\x9c\xac\xb9\x07\x20\x9a\xe5\xc9\x1f\x41\x36\x43\x08\x71\xe1\xa7\x0c\x94\x7e\x00\xa3\xd3\xa0\xc8\x4d\x05\x54\x7f\xc4\xde\x78\xd6\x49\xc7\x1c\x67\x68\xab\x0b\x5b\x32\x8b\x3d\xb5\xbe\x74\x0e\x8c\xd6\x5b\xc3\xab\x30\x1f\xec\x32\x59\x88\x9f\xfa\xac\x3b\xd4\xca\xe8\xca\x75\x2b\xf6\x1f\x09\xd8\x7f\xaf\xd7\x53\xe8\xab\x39\xfd\x6c\x4a\x7f\x21\xeb\x65\x46\x83\xdb\x7d\x41\xb8\x3c\x1c\x86\xb9\x1f\xa6\xa9\x41\x20\x3f\x4f\xa0\x37\xf2\x98\x29\x07\x70\x3b\x20\xdf\x78\x53\x33\xcd\x0d\xa5\x48\x95\x10\x16\xa7\x0c\x44\x7e\xda\x49\x5b\xbc\x98\xd2\x85\x81\xa9\x3d\xb5\x1e\xfb\xb1\xcb\xda\xa9\x52\x5a\xd7\xb6\x47\x57\x05\xae\x58\x49\xab\xbc\x6f\x56\xeb\xf8\x67\xd7\xe0\xb7\x05\x7e\x75\xbb\x87\x98\x8b\x61\xe8\xe7\x43\xd7\xf7\x94\x22\x90\xcd\x29\xa8\x95\x3c\x64\xd2\x00\x58\xf7\xc8\xf7\xbe\xae\x99\x62\x8a\x5e\xd6\xe0\x21\x3b\xf9\xe3\x57\x02\x3f\xad\xc1\x2f\x24\xd6\xbc\x02\x91\x01\x6d\x14\xb0\xb2\x9e\xaf\xc1\xff\xf5\x27\xd7\xe0\x75\xfd\x7d\x73\x0d\x7e\x7a\xb9\x06\x03\x93\xfa\x75\x09\x6e\xd3\xc6\x82\x88\xd2\xcb\x8c\x81\x7e\xb0\xa7\x53\xdf\x37\xcd\xb2\x2f\x37\x00\x2b\xa5\xe6\x3c\x2f\x8a\xbc\x4f\xfb\x1e\x70\xc1\xbb\x4c\xa0\x7e\x04\x72\xd1\x52\x1a\xc2\xa9\xc0\xb8\xf8\x85\xd5\xe7\x54\x75\x92\xd7\xc5\x07\x17\x83\xcd\x4d\x56\x2a\x53\x37\x97\x3b\xff\x30\x2e\x9f\xf5\xfc\x5f\xfe\x5f\xd0\xf3\x4d\xd8\x6a\x9e\x76\x9a\x53\x6b\x40\x46\xe9\xa5\x12\x1a\xfb\xce\x9c\x4e\xc3\xd0\x34\xfe\x04\xd2\x16\x60\xad\xf5\x1c\xe5\x45\x99\xb5\xd9\x30\x01\x2d\x79\x9b\x71\x06\x34\xd0\xc8\xb7\x5e\x5a\xcc\x18\xc7\xe4\x97\x36\x99\x5a\xd5\xa7\x67\x7b\xcc\x30\xba\xc1\x08\xa5\xaa\x36\xe0\x8b\x87\xb8\xe1\xaf\xd1\xf1\xd7\xef\xa7\x5f\xe8\x58\x0f\x16\x94\x9c\xfb\x31\x80\x65\x09\xef\x42\x2c\xe0\x78\x1c\x86\x65\x57\x1d\x00\x77\xce\x9d\x5d\x51\x96\xf9\x90\x4d\x13\xd0\x4a\x0c\x99\xe4\xa0\x07\x35\xf2\xd6\xc3\x8a\x0a\xba\x1c\x1b\xbf\xa0\x65\xa3\x6b\x90\x3e\xdf\x4a\xa7\x30\x98\xd7\x8d\x74\x13\xf2\x52\xdc\x3f\xa5\x9e\x6d\x6f\x41\x21\x84\x0f\x44\xcd\x80\xfb\x2a\x14\xb8\x4f\x53\xdf\x2f\xfa\xf6\x80\x2d\x7a\x36\x45\x51\xe6\x7d\x36\x8e\x40\x49\xd1\x67\x82\x2f\x36\x0b\xf2\x95\x47\x76\xd5\xf3\x17\x47\x53\xd7\x20\xfa\x5a\x4f\x5d\xb5\xe1\x12\x66\x03\xfa\x3f\x43\xcf\x17\xb4\x2d\x5f\xea\x79\xfb\xa4\xe7\xf6\xf9\xd2\xdc\xa0\x93\x05\xd4\x98\x80\xd6\xea\x56\xe4\x81\x06\x50\x7f\x00\xf9\xe9\xe4\x6b\xc0\x4e\xc0\x74\x5d\x77\x8e\x4a\x84\xcb\x63\x7a\x7c\x8c\x80\x53\xf2\x98\x1b\x0d\x4e\x60\x42\x9e\xcd\xc7\x86\x69\xa6\x29\x47\xab\xaa\xd6\x9f\x16\x0d\xfb\xde\x2c\xaa\x2e\x9a\x5a\x3f\x19\xe3\xab\xc1\x36\x00\x06\x55\x1f\xa3\x61\x3e\xf9\x53\x9f\x2e\xba\x6a\xe9\x5a\x50\x06\xfc\x85\x6b\xdd\xea\xdf\x05\xc6\xe1\xb7\xfb\x17\x57\xb3\xfb\xf7\x9f\xc2\xe6\x19\x52\xb2\x6e\xc0\xdb\xdd\xf6\x66\x45\xc3\xbc\xbb\x04\xbf\x7f\xbf\x71\x45\x4b\x04\xc5\x05\x25\x79\x6e\xf1\xd0\x75\xae\xeb\x92\x82\x0f\xfe\x04\x8e\x55\xd5\x8c\xb2\x01\x30\x21\x46\xce\x9d\x64\x99\xcb\x72\x0c\x06\x5c\x53\x30\x58\xc0\x7c\x6d\xbd\x4c\xb8\x55\xb9\x1f\xed\x43\xb7\xc1\xb5\xcf\x3d\x15\xc0\x80\x3a\x3e\x64\xd1\x36\x3e\x3e\xf2\x70\xe7\xb1\xe2\x00\xff\x8b\xe0\xb1\x05\xc4\xb4\x70\x76\xde\xdc\x7f\xdc\x06\xe4\xa4\x0f\x4f\xbc\xc8\x37\xab\x1d\xf2\xbb\xc5\x1d\xfa\x21\x20\x44\x6c\xab\x2a\x2f\x40\xe9\xa3\xb8\x98\xc9\x58\x80\xd4\xbb\xd0\xe7\xda\x6b\x8f\x14\x17\x42\x16\x20\xc7\x3d\x20\x20\x27\xde\x8d\x03\xa1\x0c\x22\xc6\xf4\x4e\x97\x82\xf9\xa8\xf5\xe9\xa6\x91\xa7\xc3\x4c\x0e\xc9\xc8\x8d\xb2\x62\x9e\xe6\x94\xe2\x9a\x4b\x25\x19\x21\x34\xd6\x81\xbb\xf9\xa5\x9c\xff\xe6\xcf\x93\x73\x11\xd3\xba\xbc\x00\x70\x3e\xc6\x70\x46\x53\x01\xb2\x95\xdd\x0b\x38\x2f\x7c\xae\x39\x97\x2a\x07\x25\x19\x00\x03\x90\x78\x35\x4d\x84\x71\x88\x3a\xfb\x0d\x29\x17\x6f\xd9\xc9\x79\x78\x26\xa5\x8b\xf5\x8a\xb5\x31\x5c\xc6\xfa\xaf\x3f\x33\x36\x07\xc0\xb9\x9b\x6b\x01\x48\x10\xf8\xcd\x1f\xc1\xfe\x6e\x35\xe5\xbe\x7b\x75\xff\xfd\xfe\xcd\xdb\x9b\xdb\x4d\x64\xf3\x22\xc9\xcf\x8e\x0a\x3d\x26\x95\x60\x12\xa3\xc7\x90\x82\x67\xfa\x16\x69\xdf\xfb\x56\x22\x6e\x86\xd4\x16\x42\xf9\x66\xa7\x20\xa5\xb6\x92\xfc\xe4\x07\x53\x51\x8e\xa8\xaf\x8d\xe7\x79\x65\x5c\xa7\x19\xc8\xe3\x6c\x6a\x6b\x98\x90\x28\x4e\x8a\x47\x1c\xf2\xb3\xfe\xd9\x33\x99\x7e\xb7\x02\xbe\x2c\x42\x7d\xba\xfb\x52\xa6\x8f\x2b\xfc\xcb\xcd\xed\x86\xda\xbc\x88\x0f\xe7\x29\x25\x4c\x35\x45\x42\x11\xa9\xc4\x61\x91\x49\x37\x0d\x52\x7e\xf4\xbd\xc0\x52\x0c\xb9\xcd\x0a\xaa\xfd\x61\xa7\x20\x23\x8b\x50\x07\x3f\x19\xa5\x60\xbb\xcc\xbf\x45\x26\xdb\x18\x73\x8a\xd3\xec\xd0\x18\x92\xd0\x28\x4e\x4e\x17\x99\x5e\xad\x15\x7f\xd7\x2a\xe3\x4b\x34\x7f\x05\x5d\x4c\x3e\x7b\xdd\x71\xf2\xe9\xbb\xb7\xdf\x6d\x6a\x0b\x32\xdb\x34\xd6\x1f\x6d\xd3\xc4\xd0\xc8\xa6\x6d\xd9\x50\xbb\x03\x1b\x6d\x6f\xb5\xab\x9a\x9d\x1a\xc7\x71\x35\x22\x3d\xe1\x5e\xf9\x53\xc7\x9d\x6e\x1b\x63\x4d\x0d\x32\x20\xb9\x67\xdd\x7a\x6e\x26\x49\xfa\x58\x87\x58\xf2\xdf\x84\xcc\xd6\x90\x03\xf1\xfa\x76\x71\x72\x62\xf0\x3e\x02\x8b\xcf\x9b\x80\xdb\xd7\xb7\xdb\xd2\xa7\x1b\xea\x19\x72\xf6\x31\x92\x80\x80\xb1\x6d\xa4\x1b\x66\xb5\x61\x0f\xf5\xb6\xb2\xd6\x3e\x34\x49\xe1\x27\x7f\x90\x80\x83\xdc\x1f\xbd\x51\x80\x03\x7a\x8e\x56\x9c\xd7\x78\xb8\xb4\xf3\xcf\x43\x4c\xfe\xd2\x4e\xf0\xa6\xe2\xdd\xfe\x45\x4b\xd9\x7c\xdc\x68\x8f\xf3\xd2\x3a\xa7\x14\xa0\xe0\xd4\xb5\xaa\x1a\x66\xba\xb1\x0f\x72\x69\x0a\xd3\x87\x26\x29\x1f\xa3\x4e\x2f\x7f\x2d\xfc\xd1\x5b\xfd\xac\xad\x4d\xd4\x3c\xca\x3d\x4f\xdc\x13\x5f\x69\xf4\x15\x2f\x69\xbb\xbc\xab\x4a\xe8\xb9\x59\x1e\xcf\x76\xcd\x9f\x68\xe2\xe6\x08\xf4\x8b\x79\xed\xa1\x5b\xef\xc8\xc3\x9d\xa2\x8a\x8a\xe8\xfe\x19\x9e\xef\x05\x01\xfa\x25\xef\xe8\xbb\x0f\xb7\x17\x10\xdf\xdb\x67\x80\xc5\x35\x40\x21\xc5\xc2\xea\xdc\x54\xcc\x60\x5c\x10\x8c\x4a\x5b\x21\x20\x7c\xbf\x63\xdc\x0f\x5e\xc5\x93\x3f\x39\xdf\xe5\x4a\x49\xd0\x6e\xeb\x61\xb0\x5d\x5e\x98\xb2\x68\x25\x4d\x6d\x5a\x20\x59\xe4\x16\x4f\x80\x5a\x96\x4d\xd6\x23\xd0\x4f\x83\x68\x7b\xd0\xa7\x97\x7b\xfc\x58\x07\x19\x7f\x13\x6a\xd5\x9f\xc9\xb8\x7d\x21\xe2\xf6\xa7\x25\xac\x16\xd7\xd4\x9a\xdc\x0f\x7c\x91\x10\x13\x54\xfa\xe1\xa7\x25\x6c\xbb\xce\x36\x45\x6e\x70\x2d\x58\xe6\xf2\x02\x71\xe8\x60\x0f\xb0\x25\xd9\x60\xbd\x04\x76\xe8\x44\xd3\x82\xe6\x49\xbe\x2e\xc8\xf7\xdb\xe8\xdf\x3d\x93\xef\xdd\x97\x5d\xb8\xbd\x30\xb7\xfe\xa4\x80\x20\xcf\x6d\xc5\x34\x46\x05\x46\x70\x11\xb0\x6d\xbe\x10\xb0\xcd\xac\xd4\xa0\xdd\xf6\x4d\x63\x1d\x34\x45\x6e\x05\xcb\x6c\x56\x20\x52\xba\x2c\x6f\x00\xb4\x38\x6b\x03\xdc\x73\x5f\x09\x57\x03\x97\xae\x71\x90\x75\x8c\xbf\x0b\xd8\xe3\x5f\xb7\xbf\xfd\xe9\x61\x5f\x65\xde\xa7\xec\x22\xc3\xd1\xf8\x26\xd3\x52\x82\xf6\xc7\xe9\x32\xf0\xce\xe4\x2e\x0c\x7c\x8e\x31\x2e\x7c\x0f\xbb\xda\xf7\x3b\x65\x70\x66\xcd\xe2\xa0\xd6\x4e\x68\x0b\x44\x8a\x8d\x31\x26\xcb\x75\x91\x09\x1e\x84\x86\x65\x61\xb2\xdc\x5d\x63\x35\xf9\x65\x8c\xef\x5f\xf4\xe1\xf6\xa7\x66\xe1\xf7\xfb\x6f\xcf\x43\x50\xe4\xbe\xa7\x36\x88\xf3\x79\x1e\xf2\xa0\x40\x1a\x1f\x16\x0d\x5c\x29\xa4\x01\xed\xe2\x6e\x1a\x53\x6a\x28\x05\xcd\x4c\x5e\x42\x94\x67\xb6\x74\x20\x37\x28\x53\x59\x66\x03\x96\xb7\xe2\x75\x0b\xa2\x34\xe4\x28\x4d\x8f\x64\x2f\x77\x34\xd4\x88\xbc\xf9\xcc\x09\xf3\x82\x05\xe6\xd5\xfd\x87\xbb\x50\xae\xbe\x92\x43\x5c\x5c\xe0\xbd\x64\x0c\xf1\x82\x63\xe8\xad\x1b\xc7\x71\xf4\x83\xaf\xac\x5d\x3e\xed\xe8\x9f\x46\x21\x52\x9b\x8a\xa4\x88\x27\x3f\x56\x1e\x56\x55\x4c\xe7\xf2\x61\xdc\x47\x7e\x72\x1e\xb9\x28\xda\x82\xe8\x11\xed\xfa\xb8\xff\x76\xec\x6c\xfb\x8d\x2c\xb9\x4d\x9e\x67\xb1\xf9\x11\xc5\x36\x4b\x7d\xb4\xcd\x7f\x3c\x84\xa7\xac\xce\x91\x73\x9b\xe8\x1c\xc5\x3d\x84\x52\xe6\xf9\xc4\x08\x23\xbe\x2f\x21\xc0\x2d\x8f\x96\xb6\xe0\x23\xde\x75\x09\x8c\xd2\x50\x4d\xbc\xe2\x39\xdf\x5e\x32\xf5\xde\x5e\xe8\xc9\x9f\x37\x05\x68\xcc\xca\xaa\xcc\x63\xfe\xa3\x2d\xb6\xd9\x8f\xc7\x74\x5b\xfc\x38\x6d\x99\x7b\xa8\x9c\xdb\xf0\x87\x2a\x6e\x09\x44\x58\x61\x4e\x04\xf6\x16\x63\x20\x7b\x16\x38\x8f\xf1\xbe\xd9\x96\xd1\x5f\x45\xef\xa3\xff\xf4\x2c\x26\xff\xf1\xdd\x9b\xb5\x99\x67\x91\xb5\x40\x66\xbf\x66\xc4\x82\xcb\x11\xfb\x93\xc7\xd9\xdd\x86\x3b\x18\xb7\x73\x44\x84\xea\xe6\x23\x2a\x40\xe4\xcd\x72\x26\x68\xc2\x0b\x41\xcb\x32\x9d\x70\x6d\x0e\xd9\x08\x60\x5e\xc6\x43\x92\x0b\x26\x30\x1a\x81\xf4\x56\x37\x0d\xd4\x7e\xf0\x3d\xc7\x82\xf7\xcb\x2c\x65\xea\xb4\x2d\xa1\xb2\x4e\xb0\x69\xe2\xca\x1e\xe6\xea\x90\xb9\x4c\x81\xda\x97\xfe\xc4\x00\x8f\x2b\xcb\x89\xd7\xa6\xa6\x02\x31\x3f\x1a\x7f\xc8\x9d\x94\x46\xea\x01\xd8\xac\x31\x12\xc5\x55\xe0\xb6\xbb\xe2\x1e\xff\xcb\xe8\x7f\x7a\x61\x31\x80\x37\x6f\x83\x31\xfc\x9c\x3d\xe1\x42\xdd\x7f\xf7\xe1\x3e\xa8\xfb\xfd\xaa\xee\xf2\x7f\x0b\xea\xfe\xee\xc2\x18\x15\x52\x6f\x6f\xee\xb6\xb0\xca\x4b\x70\x9c\x47\xc2\x74\xe3\x35\x2e\xed\x09\x44\xb0\x94\x88\x14\x14\x15\x45\x2a\xf2\x56\x77\xb2\x2b\x50\x4c\x62\xce\x2d\x2c\xd4\xe9\xc4\xa4\x86\x74\x98\x28\x24\xbc\xca\x6c\x56\x42\xd2\xee\x34\xe4\xcc\x56\x5a\x9c\x40\xa1\x96\x33\xf0\x3c\x34\x26\x73\x69\x13\x9b\xd9\x7a\xc3\x41\x1d\x73\x90\x59\x25\x7c\x66\xca\x0e\x32\xb6\x18\x22\x28\xab\x84\x5e\x36\xa5\x2c\x2e\x32\x3f\xf4\x02\x25\x22\x8a\x12\x50\x5f\xf4\xfd\xab\xa8\x0c\xdc\x3d\x9f\xf3\x2d\x16\x75\x6f\x6f\x6e\xb3\xf8\xa7\xb4\xfd\x72\x70\xbf\xd4\x36\xad\x70\x9c\xcd\x0d\x15\xba\xf7\x8c\x14\xcd\xb2\x71\x32\x8d\x69\xce\x50\x59\xa4\x2a\x1f\xd4\xa0\x86\x12\xc7\x2a\xb6\x25\xb1\xa8\x30\x8b\x37\xcb\x95\x45\x6c\x3a\x32\x44\x79\x93\xdb\x14\x41\x3e\xec\x34\x6c\x6d\xad\x04\x88\x40\xbe\xea\x3b\xfa\x2e\xab\xb2\x3e\x96\xb3\xf3\xfa\x85\xbe\x4a\x06\x7d\xad\xc7\x59\x25\x95\x95\x06\x44\x71\xb9\xe8\xcb\x48\xd0\x37\xe2\x49\x1a\xf2\x63\x16\x7d\xff\xc7\xe7\x73\x79\xfb\x94\xe4\xfa\x7c\x3e\x7f\x5a\xfe\xf6\x1f\xc0\xa7\xbb\x40\xe0\x74\x7b\x49\x33\xbe\xe4\x5d\xde\x7e\xb8\xfd\xb8\x82\x09\x6c\xa8\xca\xe2\x6a\xce\x21\x92\xea\x2c\x00\xcd\x4b\x8b\x72\x90\x7b\x96\x01\x43\x35\xa6\x05\xc7\x28\xcb\xfc\xb1\xe8\xa5\x14\xf9\xb8\x81\xba\x88\x0b\x3f\x64\xc0\xfa\x56\x4d\xd0\x1f\x0c\xf1\x07\x7e\x24\x5e\x83\x26\x6d\x4b\x44\xc5\xce\x94\x50\x12\x88\x65\x1e\x10\xb3\xa4\xf6\x07\x99\xaa\x14\x8a\xc9\x72\x32\x1e\x50\x81\x85\x90\xbc\xd0\xa8\x72\x05\xcf\x85\x84\x08\x16\x8c\xac\xf1\x14\xfa\x88\xf6\x76\x33\x44\xbf\x8d\xfe\x65\x58\xaf\xd7\xdc\xf5\xec\x19\x93\xff\xb3\x75\xba\xaa\xf6\xfd\xa2\xc7\x6f\x41\x98\xee\x7f\x07\xae\x14\x17\x4f\xfc\x16\x2b\x66\x42\x01\x73\x90\x79\x9a\x02\x2d\x2a\x8c\x4b\x46\x49\x96\x1f\x51\x65\xc7\xb4\x01\x78\xb1\x4c\x6d\x11\x9b\xb9\x64\x44\x35\xcb\x19\x12\x63\x6f\x40\xe5\x35\x03\x58\xfa\x83\x96\x7e\x60\xa0\x64\x8b\x92\x1a\x53\x51\x6d\x06\x2a\xac\x14\xb3\x1e\x0b\x57\x10\x09\x94\x47\x8f\x11\x07\x3c\x96\x96\xe0\xac\xe4\x36\xb5\x98\x37\xaa\x84\xa5\x31\xd0\xf6\xda\x98\xc3\xe8\x8c\x6b\x6c\x4b\xb1\x58\x31\xa1\xe2\x36\xcc\xdf\xc5\xbe\xff\x43\x44\x5e\xe0\x94\xbf\x5b\xb1\xdb\xc2\x01\xf5\x79\x12\xdf\xdc\x5d\x00\xd2\xb7\x81\x91\x2b\xa0\x68\x7d\x77\x8d\x75\x85\xfa\xd4\x55\xd5\xad\x33\x45\x09\x3a\x9f\x41\xa2\xaa\xd9\x75\x25\xb2\xa4\xb4\xfe\x00\x20\x53\x90\x14\x02\x16\x45\xe5\x94\x65\xf1\x64\x21\x40\x6d\x7a\x3a\xa0\x96\xd6\x84\x1e\x09\x48\xcb\x23\x88\x52\x04\x91\x52\x3b\x55\x6a\x69\xac\xe4\x20\xcd\xb4\x80\xda\xd9\xe3\xb9\xf3\x53\x66\xb3\x26\x76\xb3\xf1\x8a\x03\x13\x17\x40\x22\x68\x8c\x53\xc6\xb7\xd6\xda\xd3\xd1\xaa\x1a\x60\x23\x2b\x4e\x59\xf3\xf2\xcc\xfd\xb7\xbf\xee\xcc\xfd\xf3\x4f\xdc\x17\x26\xc3\xcf\x1d\xb8\x2e\x1c\xb7\x8d\xe3\xa6\x02\x32\xbd\x70\x66\x3c\xe2\xbd\x49\x60\xf4\xe6\x92\x13\x5c\x86\x6a\xe0\xab\x37\x78\xbd\x36\x08\xbe\xd6\x47\x70\xfb\xf1\xd3\xe2\x07\x7e\x00\xb7\x9f\xfe\xb0\xcc\xb6\x0f\x60\xe9\xf0\x24\x75\x79\x91\x48\x9f\xc7\x6e\x16\xee\x0c\xc1\x89\x40\xcf\x80\x84\xfe\x08\x9a\x2c\xf5\x28\xa6\x59\x5c\x3e\x38\xc0\xa1\x97\x71\x91\xe5\xb1\xf4\x59\x5b\xc2\x04\x96\xb0\xf4\xa5\x30\x75\x6d\x20\x02\x23\x7e\x8c\x60\xc9\x98\x3f\xb2\x12\x32\x3f\x09\x04\xa3\x24\xb2\x49\x14\xe2\xf1\xff\x2a\xfa\x8f\xd1\x7f\x79\xce\x86\xb1\x7e\xed\x6f\x9f\xf9\xff\xb7\xfb\x27\x2a\x9a\xf0\xf5\xee\xed\xee\x6b\xe6\xb6\xa7\xfc\xa0\xdb\x0e\xe0\x80\x9a\x11\xae\xfc\xa5\xcf\x33\xd0\x31\x8b\x58\xae\x20\xce\xbd\x4d\xa9\x65\x3d\xf2\x27\x20\xfd\x04\x0a\xdf\x6d\xa8\xce\xb3\x38\xd7\x85\xd1\x0d\x6f\x8c\x1b\x79\x6f\x39\x29\x0a\x59\x33\x26\x65\xe1\xeb\x1d\x22\x44\x41\x05\x15\xea\x59\x2e\xb2\xbc\xcc\x24\x51\xdc\x2d\xbf\x6a\x4b\x04\x4d\x6b\x29\x56\x44\x08\xac\x21\xa3\x02\x96\xac\x27\x86\x0b\x13\x6d\x22\x02\x8e\xfb\x66\xa7\x03\x9f\x27\x0c\x77\xee\x9f\xd1\x98\xd7\xec\xd5\x75\x41\xdf\x3e\xed\x5c\x97\xc4\xd5\x50\xe0\xb8\xbd\x24\x80\xc5\xd2\x81\x63\xc8\xba\x07\xf4\x3c\xa0\x4d\xe6\x55\x0b\x22\xe2\xab\x69\x6e\x4f\xbe\xe3\x53\xe3\xeb\xb8\x28\x0b\x4f\x01\xf2\x05\x98\x62\xe3\x33\x70\x3c\x4f\x8b\xf1\xb0\x3c\x3b\x4d\x08\xd1\xc4\x13\xa4\x68\x69\x79\xdd\x08\x45\x98\xca\x0b\xd0\x12\xad\x49\x43\x0e\x64\xf1\xf3\x6c\xc0\xe9\x5c\x31\xb0\xff\xe1\x19\x86\xf7\xa5\x48\xe5\x09\xa7\xee\x4b\xfc\xeb\xfb\x4b\xa1\xd7\x25\x6e\x11\xb8\x99\xee\x12\x1b\x67\x99\xcb\x00\xf2\x43\x96\x13\xa4\xb9\x42\x45\x96\xa5\x26\x23\x98\x0b\x65\x49\x23\x60\x39\x1f\x92\x92\x52\x85\xd8\x4c\x99\x66\x86\x31\xc3\x53\x21\x59\x4a\xb7\xf9\x7a\xe3\x26\xda\x00\x83\x7d\x3a\x21\x07\x27\x07\x50\xa3\x4c\xdd\x83\x3c\xce\x41\x4f\x15\x93\xe2\xdc\x5e\x93\xa2\x4d\x80\xba\xa7\x27\xd9\x03\x19\x45\x9b\x44\x5d\xf2\x16\x5f\x3d\xd5\x5f\xbe\x79\x7b\xad\xb2\x7b\x8a\x5e\x83\xcb\xe1\xf1\x25\x36\xff\x05\xf9\xfe\xc9\x1f\xdc\xe4\x53\x57\x2b\x21\x54\xa5\x59\xd5\xd7\xfe\x44\x5b\x6b\x1d\xc8\x6c\x11\xa3\xd9\xe2\x58\x72\x8e\x69\x21\x51\xe9\x71\x85\xb0\xa8\xd9\x04\x0a\x7c\xa5\xde\xdc\x11\x4c\xb9\x90\x6c\x19\x01\xce\x18\x55\x18\x23\xe8\xc7\x42\x58\x75\x3e\x32\x9e\x9b\x8c\x30\xdf\xc7\x27\x8a\x65\xdb\xda\xf9\xa8\xbc\xd6\x57\x9b\xfe\xb8\xaf\x76\x34\xfa\x17\x81\x01\x2b\x1c\x78\x1f\x6e\x6f\x9e\x03\x25\xde\xdc\x5e\xb0\x53\x57\xe7\x63\xc5\x97\xd9\x88\xdc\x71\x8e\x63\x4b\xcb\xcc\x66\x94\x6b\xe6\x75\x6a\x2d\xd2\x0f\x2e\x1e\xfc\x50\xa9\xdc\x5b\x3f\x91\xc5\x03\xdf\x8c\x86\x4b\xdc\x9e\x3c\x2b\x4b\x56\x5a\x0a\x31\xe0\xb2\xa4\x9a\x80\xca\x4c\x65\x69\x14\xb2\x08\x44\x2b\x9f\x24\xd9\xab\xf8\x74\xa9\x2b\xba\xbf\x79\x11\x01\x7d\x77\xff\x12\xbb\x32\x3e\x1a\x13\x2a\x34\x8f\x71\x36\x57\x31\x07\xc6\xc5\x6c\xae\x43\x4e\xb9\x98\x9d\x8b\x4f\x67\xea\x8c\xd2\x5a\x3b\xa7\x95\xd6\x66\x71\x62\xfe\x59\xd2\x5c\x6a\x5e\xb6\x01\x1b\xff\x6d\xe0\xae\xfc\x10\xfd\x31\xfa\xc7\x4b\xce\xe4\xa2\x5f\xb1\x0d\x91\xf6\xf7\x2b\x96\xda\x8a\x75\x74\xe1\xfd\x5f\x11\x40\xf6\x97\x5c\xc9\x2b\xa4\xe2\x73\x2c\xef\x67\xe8\xb8\x2f\x26\xc2\xa7\x8f\x9f\x6e\x5f\xbf\xd9\xe7\xd4\xd7\x3e\x87\xc0\x02\xa2\x11\x51\xf4\x44\xa0\x86\xb8\xa2\x50\x41\x92\x60\x33\x5b\x0d\x06\x5a\xca\x92\x54\xba\x20\x02\xa5\x32\x67\xb5\x65\x4e\x23\xac\x68\x92\xad\x88\xee\x27\x4c\x58\x2b\x6c\x96\x83\x8e\x0a\xd7\xe0\xa9\xe9\xfc\x09\x1f\x2a\x7e\xe0\xd8\x1b\xb6\xd3\xb6\x48\xb5\x29\x15\xc5\x8c\x10\x8a\x18\x86\x81\xf0\xb1\x79\x8c\xb4\x3a\x55\x94\x11\x4e\xcb\x26\xcf\x21\x2e\x15\x46\xb4\x2d\x5b\x85\xad\x51\x0e\x3a\x35\x5b\x0c\xb9\x19\x0a\x58\x4a\x27\x48\x69\xa1\x50\xc8\x96\x94\xa4\x54\xa6\x22\x8c\x91\x7e\x24\x7b\x1d\x0f\x51\xb2\xde\xd2\xac\x66\xd1\xfe\x45\x85\xe6\xa7\x5b\xc0\x17\xe7\x62\xda\x47\x0f\xa8\x48\x4e\x85\xb2\xb6\xc9\x3b\x8b\xca\xec\x1c\x11\x2f\xe2\x41\x0b\x2b\xfc\xa9\xca\x4d\x06\xc5\x61\x99\x87\x7f\x0d\x4e\x8f\x7c\xdf\x5c\x78\x34\x97\x71\xb9\x0b\xf8\xf8\x7f\x8c\xfe\xcb\xca\x4c\xfc\x79\x54\xde\x3d\x1b\x95\xf5\xf6\x66\x85\x70\xd9\x7e\xa6\x90\xbc\x7d\x81\x58\xf5\x6c\xac\x6e\x7f\xf7\xc3\x87\x24\xbc\x65\x77\x22\x9e\xce\x0e\xc6\x11\x68\x2c\x66\x86\xf9\x1a\x67\x36\x43\x2d\xca\x75\x8e\x80\xf2\x64\x93\x7b\x14\x67\x0f\x1c\x9c\x3c\xda\xe4\x0f\xc7\x44\x9d\xab\x84\x9f\x35\x18\x34\xe7\x42\xc6\x5c\x53\x43\xf5\x4c\x2c\xd5\x0d\xce\x4c\x2e\xfc\xe9\x28\x1b\x29\x1d\x77\x3b\xa3\x59\x6e\x29\x54\x94\xb2\x9c\x90\xa5\xff\x08\x2e\x29\xf6\x47\xa5\xa8\x52\xed\x7c\x92\x5c\x51\x8f\x31\x91\x0c\x31\xd7\xd0\xba\xc2\x53\x51\x40\x51\x56\x14\x53\x90\x92\x4e\x4a\x15\x6d\xe2\xc5\xf7\x6a\x77\x26\xfa\x63\xf4\xdf\x05\xbe\xea\x08\xbc\x20\x3b\xf8\xf0\x99\xec\x20\xf9\x21\xb9\xbd\xb9\xff\xf4\x76\x7f\x1f\xef\x9f\x67\xc7\x5c\x0c\x9e\x65\x93\x05\x2b\xf4\xcb\xb5\xe3\x5e\xdf\xee\x95\x3f\x64\x39\x2d\x2d\x6a\x60\x99\x95\x3a\xab\x2d\xd6\x35\x1b\x0d\xcc\xd2\xb9\xa9\x90\x81\xa7\x5c\x4b\x5d\x14\xb2\xc2\x1d\x62\x9c\x28\x63\x75\x7c\x48\x5d\xea\x29\xc9\x6d\xb1\x58\xef\x82\x32\x2e\x66\x08\x46\x5f\x6e\x85\xf5\xdc\x9f\x7a\x90\x65\x5e\xf8\xde\x4f\x52\x15\x5e\x01\x54\x6b\x5d\xf7\xc0\x76\x00\x7b\x54\x17\xc6\x1f\x3b\xce\x8a\x52\x13\x45\x19\xa3\x9d\x2f\xbd\x61\x40\x82\x2e\x0e\xb7\x2b\xe7\x52\x5a\x46\xcb\x4d\x8b\xa9\x64\xd8\x33\x13\xb8\xe9\xa7\x4b\xbc\xe9\x6f\xa2\x7f\x15\x7d\x0a\xfc\xdd\xff\x5b\xf4\x7f\x44\xff\xd7\x33\x6e\xfa\x60\xed\x6d\x2f\xd9\x96\xcf\xca\xa2\x2e\xdf\xee\x2e\x3e\xdc\x3e\x4a\xee\xdf\xde\xbe\xde\xbd\x0f\x49\xcc\x97\x02\xff\x17\x77\x03\xcf\x99\xfe\xf7\xd2\x9d\x87\x0a\x4c\x59\x6e\x8b\xdc\x0b\x93\xe5\x20\x9d\x7c\x4b\x25\x47\x98\x61\x94\x21\x4c\x18\x42\x45\xd6\x08\xc1\xea\x04\x32\xc3\xbd\xa4\x26\x03\x1c\x9f\x0a\x08\xcb\x79\x0a\xb7\xee\x53\x52\x7b\x4e\x04\xa7\xb9\xe0\xb9\xb7\x52\xf2\x8e\x36\xb1\x69\x2c\xb7\xf5\x76\x7c\x8c\x84\x00\x51\xa8\x6b\x6b\x0a\x58\x0a\xe2\xc5\x28\x09\xc5\x90\x41\x9c\x12\x04\x59\x09\x09\x71\x84\x5b\x3f\x2a\xa6\x00\x8c\x53\xae\xea\x9a\x13\xc2\xbd\x31\xda\xf8\x5e\x90\xdc\xe4\x18\x14\x10\x77\x4a\x68\x2d\x9d\xac\xd5\x8a\x01\xca\x7e\xc6\xb7\xbb\xbb\xb9\xff\x69\xdf\xee\x97\x3c\x59\x61\x11\xe8\x7c\x8a\xa9\xaa\xbd\xc5\x85\x3d\x1d\xb9\x2e\x50\x8e\x4a\x58\xa6\x3c\x6b\x54\x23\xba\x12\xc5\x79\x4c\x98\x2e\x0b\x75\x38\x50\xa1\x20\xe9\x06\x06\x31\x73\x99\x4e\x57\x37\xb6\xec\xac\x0b\x69\xf6\xa5\xa9\x16\xb7\xae\xf6\xc7\xcc\x66\x75\x5c\x2f\x6e\x1d\x03\x55\x2c\x41\x6a\x8d\x98\x4f\xaa\xec\x4b\x1e\x48\xd2\x60\x6e\x95\xb5\x42\x82\x28\xce\x33\x7f\xe8\x34\x4e\x64\xd8\x93\xd8\xa3\x8c\xd7\x7b\xfe\xdf\xbe\xf0\xda\x5f\xad\xb3\x63\x51\xe4\x19\x81\x50\xa9\xf3\x02\xe4\x3e\x20\xe1\x29\x06\x94\xeb\x3a\x8a\x73\x61\x70\xdb\xee\x54\x29\x84\xb5\x4a\x4c\x5e\x1b\xe3\x47\xe7\x51\x09\x0d\xc1\x38\xc6\x2e\xda\xc4\xfd\x23\xdb\xab\x9d\x88\xde\x46\xbf\x09\xd8\xca\x21\xcb\xff\xf9\xcd\xf8\x0f\xc1\xad\xba\xff\xf8\xea\xbb\x57\x77\xf1\xfe\x0d\x78\x82\x8e\xba\xb9\x4b\x16\x5f\x21\x4d\x2d\x25\x02\x11\xdd\xf2\x81\x0b\x4b\x91\x6d\x0a\x29\x72\x8b\x08\x4d\xb4\x1d\xad\x1d\xc7\x9d\xc8\x7c\x33\xd7\xbe\xe2\xdc\x32\x3e\x58\x5d\x37\xd2\x00\x08\x4a\xd3\x9e\x53\x50\x00\xe7\xdb\x09\x27\xed\x9f\x5a\xeb\x76\xf4\xc7\x61\x53\x47\x9b\xb8\x78\x14\x7b\xbe\x13\x21\xe7\xf4\x52\x93\xf7\xf1\xd3\x0b\xd1\xfe\x03\x58\x65\xbb\x5d\x86\xf0\xbb\x57\x2f\xd0\x59\x0b\x10\x95\x85\xc3\x00\xe6\xb5\x60\x82\x08\xd7\x11\x2e\xa4\x76\x9c\x4c\x40\x13\xc2\xa8\xca\x93\xdc\x3e\x46\x2b\x9a\xc8\x36\x6b\xea\xcc\xb7\x73\xe7\x2d\x17\x8e\x8b\x83\x32\x58\x3a\xa9\x00\x5a\x8c\xdc\x09\x13\x90\x01\x07\xd8\x9f\x5a\x63\x83\x7c\x55\xb4\x8f\xcd\x23\xde\x0e\xa1\x26\xfd\x5f\x5f\x6a\xad\xfe\x73\x58\xbd\xd7\x13\xfd\xfb\x35\x18\xb3\xee\x55\xf7\xdb\xb7\xfb\xe7\x40\xcd\xff\x00\xf6\xef\x3f\x7d\xb8\x7f\x9d\x84\x8b\xad\x9b\xdb\x4f\x01\x93\xeb\xc5\x7d\xde\xd2\xc3\x3f\xbc\xff\x74\x81\x38\x58\x23\x17\x77\x49\xaf\x43\xe9\x9c\x21\x3c\xcf\x7c\xca\x14\x3d\x02\x92\x4e\x5c\x15\x32\x25\xad\x21\x24\x63\xb2\x8b\xe1\x3c\xe4\xe0\xe4\xd3\xb5\xd6\xb0\xa6\x34\x2f\x96\xa9\xec\x9d\x34\x65\x96\xf3\xa2\xc8\x33\x91\xe7\x50\x0a\xb6\x53\x98\x31\x96\xd7\x08\xe3\xb9\xf6\x99\x57\x04\x68\xd0\xc5\x75\xcd\x20\x2c\x20\x29\x14\x86\x10\xa5\x2c\xe3\xc4\xf7\x8c\x3e\x46\x8c\x1e\x3d\x25\x24\x93\x29\x02\xd0\x67\x31\xf5\x27\x04\x4b\x4b\x48\x81\x21\x6b\xdb\x28\xda\x5c\x30\xd4\x97\x33\xef\x7f\x88\xfe\x73\xc8\x4b\x0a\xe3\xf5\x76\xf1\x4a\xaf\x6c\x30\x97\x72\x8c\xab\x35\x1c\x2c\xe0\xfb\x15\xaa\xec\x05\xca\xcd\x65\xa3\xff\x70\xff\x1a\x3c\x33\x46\xf6\x39\x81\x0c\xd1\xe9\x94\x66\xb0\xb0\x44\x95\x79\x6e\x52\x4a\x04\xc4\x44\x2a\x0a\xb3\xf9\x64\x6d\xd7\x4d\x0d\xa6\x18\x16\x18\x15\xbd\xd1\x3a\xb6\x76\x76\x2a\x43\x02\x82\x0a\xe6\x3a\x2b\x76\x06\x13\x4e\x49\x6d\x7c\x75\xea\xa6\xdc\x43\xdf\xf9\xe9\x40\x07\x75\x30\x92\xf7\x07\x20\x63\xec\x33\xb0\xec\xf3\x6a\x6e\x05\xcd\x4d\xce\xe2\xc2\x17\xde\x50\xa0\x41\x1f\x37\x87\xc3\xb9\xce\x0f\x1d\xea\x3b\xdb\x96\xad\xbb\xd6\x57\xad\xb6\xf3\x3f\x0f\x0c\x2a\xbf\x7d\x42\x0b\xb8\xbb\x24\x09\x05\xba\x88\x57\xcf\xd0\x30\x77\xad\xf2\x83\xd7\xf1\x30\x82\xe2\xa1\xb3\xa0\xf6\xc7\xc5\x7e\x4f\xb5\x1b\xe5\x14\xd3\x4e\x39\xd9\xee\xb4\xa1\xa5\x3f\x58\x5f\x5a\xbb\x49\xcb\x87\x01\x8c\xb3\x64\xfe\x64\x55\xd3\x75\x23\x1f\xfb\xf5\x8e\x44\x5f\xb0\x61\xdf\x04\x6c\xdd\x08\xfc\x2d\x58\x56\xc8\xcd\x17\x66\x6f\x30\x3a\x3e\x7e\xba\x54\xf1\x5c\xa4\xd8\xd8\x8c\x09\xc1\x71\xec\x48\x91\xb9\x8c\x72\xc3\xe6\xbc\xf4\x07\x5f\x11\x67\xfc\x14\x0f\xfe\xa0\x96\xbf\xd9\x02\x6f\xdb\x63\x4f\x24\xe9\x40\xee\x53\x88\x45\xd9\x70\x84\x41\xe3\x47\x63\xb8\x2d\x21\xa8\x9c\xf3\xb6\x3c\x29\x0b\x9d\x0a\x39\x75\x28\x31\x81\xab\xf5\xef\xaf\x7b\x58\x60\x2e\xb8\x7a\x9f\x6b\x91\xde\x53\x66\xee\x67\x6a\x03\x30\xd8\xa2\x04\xc4\x77\x5e\x42\xa0\x86\x63\x01\x11\x94\x25\xa2\x1c\xa4\x1d\x24\x08\x0a\x88\x10\xe1\xa0\xa8\x2c\x02\xb9\xef\xbc\x80\x40\x8f\x3b\x5d\x60\x6c\xe6\xa3\xd6\x0e\x28\x58\x42\x28\x10\xc4\xa2\x3d\x1f\x31\x45\x48\x20\x84\xa0\x18\x00\x29\x94\x99\x45\x65\x3a\x70\xfc\x5c\xcf\xda\x07\x7f\x67\xad\x97\xfc\xb6\xbf\xf3\x4d\x47\x27\x38\x9d\x97\x33\x28\xb9\x46\xc0\xd8\xd0\x3a\x25\xb8\xd4\x92\xd9\xca\xf9\x96\x0e\xb5\x71\x09\xe7\x82\xb0\x42\x61\xe4\xf3\x0a\x11\x79\x62\xbe\x03\xa6\x58\xfc\xa0\x72\xae\x4a\x98\x07\xe4\xbd\x83\xcf\x77\x9a\x32\xc2\x14\xc1\x84\x6a\xc9\x28\x33\x88\x60\x3c\xa7\xe7\x63\x88\x5c\x10\xe6\x87\x24\x42\x48\x34\x95\xa5\xa4\x50\x16\xe3\x65\x62\x08\x1b\x78\x17\xcd\xbe\xda\xa1\x10\x97\x5b\xb1\xab\x43\xda\x78\x12\x6c\xc7\xd7\x4f\x5c\x99\x8b\x94\x1b\x94\xe4\xe7\x43\xb5\x18\x38\x7a\xd9\xe0\x92\xc2\x77\xc1\x1d\x34\x67\x09\x84\x9f\x76\x28\x24\x88\x9f\xd3\xc9\xda\xc9\xfa\x93\xb5\x20\xbd\xe4\xf4\x9a\xc0\xbd\xfc\x33\x6d\x3c\x41\x0f\xb6\x89\x3a\x9b\x40\xde\x5b\x01\xe5\x79\x32\x79\x1e\x82\xf6\xfd\x43\x07\x46\x6f\x2e\x6d\x3c\x9c\x8e\xd6\x1e\xed\xc9\xda\x53\xb8\xfb\xfa\x89\xf7\xbf\x7c\xf7\x87\x15\x69\xa9\x3d\x93\x2a\x56\xb3\x39\x6d\x84\xcf\x57\xba\xd4\x87\x32\x86\x81\xfe\xbe\x58\xdf\x4f\x67\x69\x4f\x76\x6d\x62\x59\x23\x8f\x76\x43\x2e\xef\xff\x4d\x14\xbd\xfa\x96\xfc\x1f\x3f\xbd\xbe\xf0\x13\xf5\x09\x39\xb7\x2e\xce\xe7\x83\x03\xd4\x9b\xa4\xf6\x62\xd1\x60\xe8\x3c\xf2\xb0\x1c\x7a\xdf\xec\xd0\x5c\x59\x80\xcf\x64\x39\xe5\xec\x58\x94\x4e\xe0\x3a\x2f\x8e\x2b\xae\x29\xdf\xb8\x10\xfb\xfa\xd2\x87\xde\x2c\x73\xe7\xdd\x4b\x8e\xfc\xcf\x90\x5e\x5f\xcc\xac\xfd\x3d\xe0\x5d\x6d\x99\x61\xca\x29\x6e\x1b\x7f\x6a\x78\xd3\xfa\x13\x90\x0e\x70\xce\x02\x21\x3e\x1c\x5c\x63\x31\x96\xbd\xf6\x27\xc0\xca\xc2\x42\x70\x9a\x3b\xd3\xed\x18\xa6\x8c\x11\xbe\xcc\x23\xc9\x1c\xd6\x44\xc8\xb9\x30\x9e\x30\x9e\xda\x94\x80\x7c\x96\xb1\x9d\x4f\xe0\x48\x90\x6c\x46\xcb\x78\xe1\xec\x14\xea\x8d\x1e\xc9\x66\xc5\x51\xfb\xfd\x62\x11\x5c\xef\x97\xae\xf3\xe7\x67\x38\x51\x5a\x20\xaa\x30\xcc\xf5\x39\x02\xad\x77\x24\xae\xab\xb6\xa5\x26\x40\xc0\xa2\x99\x1d\x38\x76\x98\x6d\x9b\x61\x70\xfe\xe4\x1c\x48\x67\xd5\x34\xce\x17\x92\xe7\x75\x41\x41\x47\xb5\x23\x95\x8e\x22\x10\xe9\xc7\x6e\x93\xed\xf4\xca\x5b\xba\x3a\x9e\xb7\x2f\x9d\xe7\xf5\x2e\x3b\x8a\xa3\xaa\x80\x40\x73\x01\xd2\x2a\xd4\xe4\x89\xd8\xcd\x18\xd4\x9a\xf8\xc9\xd4\x14\xa4\x3b\x0d\x29\xd1\xa7\xfa\x5c\x72\x37\xda\xc9\xf5\x43\x6f\x2d\x08\xb5\xd7\x8f\x6e\x53\xef\x44\xf4\xb7\x17\x6e\xc6\x30\x46\x17\xb3\x6a\x71\xd5\xd7\xc1\x08\x3c\x02\x6d\xa5\x15\xab\x1a\xad\x71\x35\x0a\x3f\x55\x95\x34\xa8\x36\x7e\x00\x70\x27\x3c\xc6\x4c\x0b\x72\x66\x98\x68\xc1\xc5\x8e\xfd\x09\x02\x2a\x68\xcd\x55\xcc\x5d\xc0\x30\x79\xb4\x1b\xbb\x83\x17\x9e\xe3\x6b\x74\xfe\x7a\xef\xb0\x28\xb1\x6e\xc4\xb1\xf6\x38\x69\x7c\x5b\x96\x7d\x0d\xbd\x9c\x4f\x18\xd4\xb6\x51\x80\x01\x57\x0b\xc3\xeb\xad\x73\x4e\xb0\x87\xae\x84\x46\x33\x47\x13\x38\xb5\x0a\x30\x38\x1c\xc8\x34\x44\x6b\xad\xfc\x66\xdc\xd1\x68\x1b\xb8\xbb\xfe\xdb\xeb\xd9\x7b\x73\x7f\xb3\x18\xba\xe0\xc2\xbf\x72\xf3\x36\xbe\x18\x21\x41\xbd\x35\x3b\xe0\xdd\xdb\xc5\x5e\x8e\xb1\x90\xcb\x4c\x6b\x65\x55\xf9\xb1\xc0\x32\x2b\xaa\x14\xf2\xda\x0a\x65\x69\xe7\x62\xc3\x90\x83\x74\x86\x0e\x33\xcb\x76\xd4\xf6\xa2\x6d\x7c\x3d\x57\x40\xc7\x0c\x9d\x5b\x2f\xda\x32\x2f\x11\xc8\xe0\x63\x54\x61\x2c\x4a\x23\x2a\x33\xc4\x83\x6f\xbd\xc4\xc0\x01\x8c\xa0\x47\x7e\xa0\x40\x46\x17\x1b\x77\xda\xa0\x9d\x88\x6e\xa2\x37\xcf\xce\xca\xcb\x02\xbc\xf9\x7d\xb2\xf4\x7d\x52\x19\x6f\xfd\x18\xd7\xe3\xe8\xa9\xcf\x09\x25\x40\x4f\x95\xf5\xc3\x4e\x18\x99\x3f\x46\x6e\x46\xb0\xe2\xa4\x4a\xb3\x2d\x82\x3f\x36\x59\x1e\x1f\xa2\x75\x0e\xcb\x8d\xdb\xc9\xaf\xb8\x6f\xaf\xb8\xc2\xd1\x4b\x7b\xd1\xb6\x2d\x88\x00\x24\xcc\xf4\xca\x15\xa5\x57\x5e\x61\x90\xc7\xba\xf2\x79\x55\x85\x9d\x59\x22\x4f\xba\x0c\x29\xc9\x4e\xfe\xc0\x18\xa1\xa9\x03\xd9\xdc\x9d\x27\xe7\x92\xc2\x67\x80\x45\x97\x76\xe9\xc6\x86\xf3\x24\x70\x08\x04\x2c\xac\xdb\xeb\x1d\x5f\x68\xf0\x09\x40\x40\xb8\x0a\xd4\x55\x5d\x57\x9e\x55\x0e\xa0\x40\x3f\x52\x7b\xb6\xcd\xc3\x0a\x12\xde\xd9\x1f\x7b\x8c\xb7\x68\x39\x1a\x1e\x2a\x70\xb8\xdc\x55\xe0\xbd\x8e\x51\xc8\x51\xfa\xbc\x32\x9f\xdf\x9b\x5f\xc8\x7f\xf4\x66\x0a\x37\xb9\x54\x5a\x5d\x18\x5b\xe4\x0f\x05\x38\x56\x4a\xaa\x1a\x74\x4a\x59\x3f\x29\x96\xbb\xbc\xc0\xa7\x4c\x2a\x69\x65\x14\x25\x1b\x73\xc9\x2d\xfa\xab\x70\x83\xf4\xbc\x46\x32\x98\xa0\xb7\x37\x4f\xa5\x08\xcb\x73\x45\xcc\x3e\xc1\x12\xc0\x39\x05\x45\x01\x01\xa9\x10\x19\x7d\x00\x4f\x73\xe1\x8a\x78\x04\x8e\xfa\x23\xce\x4d\x81\x76\x4a\x6a\x6b\x05\xf5\x06\x75\x8b\x5d\x61\x3c\x06\x9d\x01\x85\x69\x06\x5d\x95\xee\xc2\x89\x31\x7c\x21\xc3\x53\x14\x6b\xf5\x84\xbf\x2d\x43\x72\x02\xb2\x40\x15\x29\x00\x3f\xeb\x58\x57\x25\x07\xa9\xa7\xc0\x79\xe1\x42\x4f\xea\xb8\xe0\x3e\x58\x30\x64\x6b\x04\x83\x52\x5b\x88\xaa\xd6\xfa\xc3\x45\x88\xdc\x0e\x95\x72\x30\x08\x91\x24\xf5\x5f\x24\xc3\x00\xf4\x22\x43\x09\xe4\x99\xc5\x55\x8d\x38\xc8\x3d\x5a\xce\x25\x17\x12\xc1\x64\x8c\xb8\x37\xa4\x74\x25\xfe\x2c\x43\x5b\x3d\x97\xa1\x6b\x9e\x64\x08\xf7\x03\x4d\xc8\x5f\xfc\x87\xe8\xbf\xbf\x78\x3f\xab\xa9\x71\xf9\x9f\xb5\x00\xfa\x4a\x36\x7a\x1b\x18\x47\x3f\xdd\xbe\xba\x7d\x7d\xb7\xa6\x28\xc4\x97\x48\xd7\xc7\x7f\x00\x57\x6e\x25\x0a\x78\x96\xba\x0c\x9c\xe6\x43\x9a\xc5\xe9\x3c\x94\x59\x3c\xf6\xcc\xca\x46\x7a\xa6\x3b\xa6\x79\x07\xb2\x32\x1f\x4e\x85\x6f\xc7\x98\x1e\x52\xd0\xfa\x52\x79\x49\x01\x09\x39\x8e\xe9\x08\xda\xa9\x95\xcd\xb0\x3d\x62\x92\x4b\x43\xb0\x16\xb9\x91\xdc\xb8\x6e\xaa\x95\xb6\x06\x63\x6d\x66\xaa\x59\x51\x18\x7f\x68\xad\x69\x4d\x51\x30\xdf\xe8\x4a\xb7\x2a\xda\xc4\x24\xe0\xc1\x98\xe8\x55\x40\xe6\x7c\xce\xa8\x76\xa9\xc7\xfe\xb4\xd9\x7e\xfc\x49\x5b\x6b\xbd\x7f\xbc\xdd\x5f\x09\x04\x76\x9a\x73\x5e\x3b\xde\x8d\xbe\xf5\x3d\x03\xc5\xd0\x8d\x18\x40\xb0\xac\x4b\xa5\x82\xb9\xc5\xe6\xc1\x71\x61\x47\xe7\x7b\x60\x88\xc9\xf2\xf8\x78\xee\x69\x28\x24\x59\x9e\x9d\x91\x14\x63\x62\x39\x35\xa5\x81\x04\x23\x4d\x18\x3d\x4f\x73\xb6\x16\x78\x49\x5f\x25\x91\x12\x6c\x3c\x5a\x87\x20\xb4\xe6\x24\x7d\x2d\xa3\x34\x96\x81\x03\x5a\x46\x7f\x15\xbd\x8a\xfe\xee\x05\xd7\xee\x55\x9f\x8f\xef\xbe\xf1\xe9\xd5\x33\x72\x9a\x6d\xc8\x96\xba\xa0\x14\x6a\x2b\xb4\x66\x56\xb8\x2a\xce\xad\x30\x9a\x5b\x51\x2d\x1f\xb9\x32\xc2\xca\xda\x1d\xdc\xb9\xaa\xaa\x0b\xba\xa2\xf2\xc6\xe7\x9f\x3f\xef\x24\xec\xad\xab\xe9\xd8\xb4\x23\xec\x9d\xad\xe8\x50\x77\x23\xec\xdc\xfa\xbb\x59\x9d\xb1\x10\x49\xe7\xdd\x13\x8f\x6d\x9a\x5c\x31\x92\xfe\x52\xf9\x03\x20\xc8\x6d\x00\x06\x59\xe4\xdf\x60\x4b\x99\xa4\x96\x69\x09\x2a\x43\xa5\x66\x96\x3b\x03\x1a\x43\x79\xf8\xa8\x0f\x6e\x56\xce\x9d\x4e\x40\x2f\x07\xfe\xfa\xdd\x9f\x76\x1a\x0d\xce\x55\xa4\x6f\xba\x03\xea\x17\x79\x87\xe7\x9f\x66\x75\x46\x52\x26\xfd\x33\xc9\x17\x1f\x0b\x07\x8c\x57\x14\x65\xd1\xff\x3f\x2a\x02\x6f\xc3\x97\x7e\xf3\x76\xdd\xac\x9e\x16\xe6\x35\xf0\xbf\x82\x48\xfe\xf0\x7e\x2f\x05\xa7\xbc\x34\x04\xcd\x91\x8b\x1b\x87\xb0\x9d\x35\xe0\xd8\x9f\x30\x34\xe1\xf4\x2a\x8f\x1e\x03\x3b\x1f\x28\xc8\x8a\x62\x87\xfe\x34\x71\x91\x57\x39\xdd\x8a\x3f\xb9\xdd\xa9\x2f\x6b\x6d\x4c\xe5\x84\xc2\x5a\x78\xc6\xb8\xf1\x07\x03\x2a\x43\x50\xa8\x35\x37\x8f\x6c\x5f\xed\xe0\x25\x3f\xee\x36\xe4\x91\x3e\xcf\x90\x5b\x2c\x8c\x17\xf7\xec\x37\xf7\xaf\x3f\xae\x71\x80\x8b\xe5\x91\x98\xa4\x3e\x33\xb7\x98\xb6\xcb\x93\xe4\xdc\x8d\x39\xe4\x28\x33\x85\xa8\x0d\xb5\xd5\x79\xb0\x6b\xfe\x53\x31\xb4\x64\xb7\x6c\xbd\x7d\xe5\xcb\xc6\xe7\x8a\x53\xdf\x94\x19\xeb\xd1\x49\x11\x1e\x9f\x4e\xa8\x9d\x8c\x57\x2b\x44\x61\x04\x22\xf3\x88\xf6\x32\xa1\x51\xf1\xec\x9e\xe2\x29\x07\xfa\xba\xc8\x2e\xfb\x4b\x32\xb8\x65\x89\x24\xe9\xf9\xe4\xce\x6d\x42\xe6\xa6\x50\xdc\x3b\x70\xe4\x0e\x27\xdd\xc3\xc0\x38\xd0\x71\x2a\xb5\x30\xc7\xa3\x11\x9a\x32\x63\x0a\x61\x38\x89\xa2\x38\xf8\xc1\x72\x97\x5e\x70\x1b\xd7\x04\xda\xe7\xa6\xee\xeb\xef\x9f\x9c\xbe\xef\x6e\x3e\x3c\xfd\x18\xaf\x3f\x06\x24\x8c\x5b\x70\x73\x77\x93\x94\x1b\xe2\x7b\x50\x72\x46\x78\xa9\x49\x69\x73\x86\x59\x09\x4b\x6a\xea\x36\xa5\x88\xe5\x65\x41\x97\xa1\x00\xc8\xb7\xb1\x69\x77\xa9\xf5\xe3\x43\xc3\x59\x6e\x73\x92\x54\x65\x53\x69\xad\xb5\x38\x39\x01\x30\x18\x4a\x4e\x09\xa3\x8a\x20\x7f\xa8\x05\x48\x81\xe1\x0f\x66\x9b\x5e\xc3\x60\x17\xbe\x7c\xba\x77\x3b\xfe\xc4\x13\xb1\x8c\xd5\x97\x97\xa9\x1f\x42\x1d\x7f\xb1\x7d\xe6\xc5\xef\x23\xda\x8c\x60\xf0\x90\x30\x46\x0b\xc6\x0a\x4f\x40\x5b\x35\x10\xd4\x80\x39\xcc\x0c\x9b\x5b\x86\x1d\x62\x3b\x6e\x60\x31\x23\x3b\x1f\x15\xcb\xab\x82\x83\x83\x8d\x9b\x2c\x75\x03\xf2\xc7\x96\x8c\x4d\x3b\x91\xc5\x9b\x07\x91\x7a\xc4\x1b\xb6\x53\xd1\xef\x97\x13\x7e\xc5\x75\xbe\x8d\xf7\xcf\xf3\xfb\x2e\x24\x66\x9f\x6e\x6e\xdf\x7f\x7c\x75\xeb\x00\xa1\xae\x28\xc1\x38\x1f\x85\x06\x65\x15\xaa\x28\xd2\xc2\xba\xea\xe0\x4f\x05\x28\x8e\x1e\x97\x56\xfa\xd3\x56\x81\xa8\x50\xc2\x3d\x46\xdd\xe9\xe4\x4e\xd0\x14\xb9\xc7\xa0\x2a\x8b\xaa\x28\x40\xe6\xba\xb5\x76\x33\x0e\x98\x4b\xe3\x0e\x46\x7f\x15\x18\xd9\x9f\xd8\x28\xc0\x0b\x02\x84\x40\xec\xf7\xfe\x26\x19\xe6\xc6\x38\x1b\x8f\xa9\xa0\x10\xe6\x08\xe5\x59\x36\x74\x2e\x6f\x1f\x23\xb2\x83\x76\x96\xf3\xc1\x53\x06\x1a\x70\x8c\x8f\xbe\x9f\x75\xbd\xec\xac\xa0\x7d\x18\x09\xb5\x82\xd1\x6d\x1e\xc5\x09\x09\x78\x66\x28\xfa\xab\x70\xda\x7e\x6e\xef\x39\xc0\xc1\xcd\x8b\x80\xc7\xcd\x5e\x9f\x47\xe5\x64\x22\xa8\xc6\x2c\x67\xb8\x2c\x52\x3f\x16\x64\x24\x69\x95\x1a\xdf\x3b\xb1\x43\xd5\xb9\xf2\xb9\x3f\x22\x90\x82\x63\xd2\x7b\x3e\xb7\x63\x66\x33\x01\xec\x19\x15\x39\xaa\xd1\xc4\x31\xdf\xd8\x2b\x7f\xa1\x0d\xfa\xfe\x7c\xfb\x45\xb8\x48\x59\xdb\x37\x67\xde\xdb\x2e\x69\xd7\xdc\x2e\x02\x8b\xcc\xd7\x25\x01\x39\xad\x32\xe7\xab\x4a\xee\xa0\x9b\xe5\x3c\x05\xd4\x4b\x70\x8a\x4f\x5e\xac\xed\x4b\x60\x96\xf6\xa9\x45\xa3\x40\x62\x69\x7f\x13\x38\xf0\x9b\x1d\x0e\xed\xff\x63\x88\x0d\x3d\xc9\xb0\xbd\x22\xa6\xbd\x79\xbb\x7f\xff\x39\xc2\x7a\xff\x61\xff\xfe\x23\xb8\x7c\xbf\xa2\xaa\xbd\x80\x6f\x7d\xbd\x5e\x39\xad\xe1\xe5\xdb\xd7\x7b\x7d\x36\xd6\xe8\x38\x43\x18\x4b\x49\x11\xc1\xaa\x44\x54\x20\x6d\x39\x6c\x81\x90\x86\xc3\xd6\x21\x8c\x2b\x45\x38\xc6\x54\x61\xc8\x44\x01\xd4\xb9\x74\xb6\x72\x00\xee\xb0\x9d\xeb\xf9\xe0\x53\x01\xaa\x38\x8d\x0f\xad\x2c\xf2\x4a\x65\x94\x08\xe1\x5b\x10\x31\xc2\x4d\xad\x54\xa1\x0b\x6f\xc3\x37\x1a\xfe\xde\x51\x4d\x9c\xef\x40\xa6\x90\x14\x73\xb3\xb8\x5d\xd6\x4b\x70\xac\xf5\xca\xff\x8e\x02\x96\x34\xfd\x7f\x48\x7b\x7b\xe8\x48\x76\x3d\x3f\xac\x50\xc5\x6e\xd6\x3e\xf9\xbc\x2d\xde\xb9\xbc\x53\xcf\x67\xb5\x02\x1f\xef\xbd\x83\xdd\x95\x9e\xe0\xe5\xce\x0c\xb4\xcf\xd6\xc2\xf6\xae\x04\x49\x96\x05\x49\x96\x04\x59\xfe\x80\xad\x63\x1b\x81\x8f\x0f\x42\x84\x08\x11\x22\x44\x58\x61\x85\x15\x56\x58\x61\x85\x1d\x76\xd8\x61\x87\x1d\xf6\x7b\xc3\x02\x7d\x0a\xd5\x4d\x36\xe7\x7e\xbd\xdd\xe5\x65\x91\xbc\x3d\x3d\x43\xe0\x8f\x2a\xe0\xff\xf1\xfb\xff\x7e\x17\xbc\xbf\x7f\xf5\x13\xfc\xcb\x17\x1c\xc6\xeb\xeb\xef\x8d\x9f\xd3\xf6\xf1\xf1\xae\xb0\xf3\x92\x83\x6d\x88\xc3\xfc\x09\xb6\x51\x9b\xc3\x01\x6c\x0f\x87\x69\x07\x48\x1c\x73\x98\x88\x3e\xcd\x15\x8d\x65\x59\xe5\x99\x58\x42\x69\xd8\xba\xe0\x42\x00\x06\x46\xbe\xe6\x5e\xc5\xa1\x8f\x08\x6c\x13\xfb\x6f\x67\x8c\x11\xc6\x18\x6d\x29\x8d\x98\xf3\xca\x56\x0c\xc0\x78\xae\x57\xd7\xb9\xb6\xd9\x2a\x6b\xf3\xe3\xb5\x58\xbb\x4b\x36\xb9\x37\x17\xb8\x85\xcb\x1d\x77\x9e\xd9\xdb\x73\x07\xec\xe9\xfb\x3e\x1f\x42\x3e\x4e\x24\x57\x53\x28\xea\xc7\x7d\x98\xb2\x22\x9b\xda\x5c\x4c\xf4\x08\xc6\x48\x72\x09\x36\x9f\x36\xe7\x9f\xd6\x94\x31\x4d\x23\x27\x86\x10\x43\x40\x47\xf7\x8c\xb1\x03\xe7\x7c\xd1\x04\x21\x09\x4b\x24\x9e\xb1\xda\x6f\x4e\x8c\xe8\x27\xb1\xda\x67\xd9\xe5\x53\x16\xfa\x25\x49\x91\x15\xf7\x27\xe9\xce\xeb\x77\x8b\x4e\xe7\xfd\xc7\x13\x45\xf7\x23\x77\xde\x83\xca\x59\xf7\xe8\xae\xc8\xa7\x51\x15\x21\x76\x98\x2a\x2e\xa5\x94\xd6\xc4\x5d\x43\x08\x0f\x06\x6d\x3a\xc6\x05\xdd\xab\x8d\x9f\x0f\xb1\xb5\x88\xc4\x6c\xe6\x8f\xc8\xac\x8e\x8a\x33\xcc\x15\x27\x52\x3a\x50\x01\x2a\xf8\x61\x3e\xa3\x28\xdf\x63\xe8\xb8\xb3\x4d\xf6\x7b\xf9\xfe\x49\x5c\x0f\x29\x8f\x7c\xce\xaf\xff\x45\xf6\xaf\xb2\x7f\x97\xfd\xa7\x73\x54\xfb\xe6\xed\xba\x98\xe3\xd9\x8b\x5c\xf2\xb7\xc5\xdd\x4d\x75\xfd\xee\x43\xca\x19\x7f\xf9\x36\x61\xdb\x3e\x7c\x73\xb2\x7c\x92\x1c\x3e\x55\xba\x5f\x9f\xc0\xe0\x42\x05\xe8\x3a\x63\xd0\x20\x6a\x2c\xb1\xb8\x86\x95\xad\x39\x63\x1c\x53\x29\x29\xab\x23\xb6\x5a\xe4\xd2\x97\xa0\x8e\xfb\x12\x92\xc9\x9c\x03\x35\xab\x54\x2f\xa9\xa5\x62\xf4\x44\x3a\x52\x86\x52\x1d\x06\x95\xef\x04\x0a\x88\x3f\x1e\x3c\x13\x5e\xaf\x1d\xa1\x9c\xd2\xe8\xeb\xc3\x53\xd6\x76\x68\x50\x03\xa3\x52\xea\x03\xa0\xb1\x8b\x7a\x63\x3b\xe0\x80\x1b\x95\xf4\xdb\xc6\x35\x4e\x47\x65\xda\x68\x8d\x27\x41\xa3\xd8\xc0\x1a\x3b\xdc\x49\xca\x81\xe9\xb7\x64\xdf\x97\xf8\xd0\xf2\xe1\xa4\x27\x67\xd6\x3a\x7b\x73\x62\x7b\xfb\xa7\xa7\x4e\xa7\x87\x67\xe5\xf2\x54\x39\x98\xd7\x77\xfd\x9a\x32\xe6\x94\x83\x5d\xdc\xeb\x65\x91\xcf\x5e\x4a\x91\x98\x0f\x0b\xb9\x0b\xc7\x45\xac\xfc\x18\x76\xbc\x50\xd3\x0e\x91\x7c\xc7\x3d\x61\x35\x27\x18\x96\x4f\x19\x34\x52\x48\x49\x10\x93\x8e\xc6\x0d\xe3\xbc\x97\x3e\xe4\x64\x1a\xe7\xcb\x7a\xe0\xa7\xdd\xba\x12\x42\x4a\x67\x8c\x31\xcd\x34\x52\x32\xed\xb7\xb5\xaf\x35\xd0\x94\x4b\xad\x38\xc7\x44\x19\x4b\xb0\x55\x06\x08\x15\x7b\x35\x6d\xe2\x2e\xed\x0f\x65\xe2\x9a\x6f\x13\xb6\xf1\x4d\x62\x7b\xf9\x75\xf6\x17\xd9\x7f\x9f\x66\xf8\xa3\x7e\x2a\x38\x3d\x67\x97\xfb\xe1\x02\x80\x3a\xd3\xfb\x9f\x29\xed\xae\xa8\x23\x8c\x61\x4b\x95\x04\xde\x53\x46\xe7\x1f\x15\xb0\x8e\x90\xf4\xaa\x98\x68\xd1\x44\x0d\xc6\x18\xc2\x8e\xef\x9b\x10\x76\x6a\xdf\xc4\x0e\xb4\xd1\x85\xdd\x0e\x98\xe3\xe4\xd3\xb7\xb5\xc3\x5a\x30\xce\x8c\x34\x06\x2b\xce\x18\xd3\x52\x5b\x2c\x39\xe7\xcc\x28\x1d\xc3\xe4\x94\xdb\xa8\x60\x0f\xd1\x00\xbd\x75\xd6\x6e\x9d\x02\xc6\x39\x17\xe7\x2f\x59\x9e\xe9\x27\x7a\xed\x72\x98\xf6\x8d\xec\x3c\x83\xdb\xaf\x5e\x5a\xb2\xbf\xfe\xf8\x36\xb5\xcc\xcc\x33\x01\x6e\x85\x26\x97\x37\x93\x1c\x00\x04\x1a\xc5\x7e\xda\x44\x67\xec\x48\x41\xa9\x3c\x76\xbb\x69\x17\x8a\xe3\x63\x99\xc3\xb8\x65\x86\x27\x2e\x15\xe2\xe8\x86\x70\x56\x83\x32\x71\x46\xb9\xd9\xd7\xc9\xf9\xf7\xfe\xbe\x77\x67\xb8\xc7\x57\xab\xd3\xef\x53\x2b\x3a\xb5\x79\x98\xd4\x00\x4a\x60\x71\xec\x1e\x59\xc7\x94\x19\xa4\xaf\x6a\x0d\xe8\xd4\xfa\x2b\xf8\x69\x97\xf3\xd8\x71\xc3\x4b\xef\x39\x51\x6a\x64\x18\xf2\x1a\x54\x46\xce\x3e\xa1\x7a\xb2\xd7\x61\xad\xb2\x37\x89\x0d\xe2\x42\xf7\xef\xdc\x91\xb3\x60\x37\x97\x38\x3b\xdd\x7d\x6a\xd3\x00\xda\xec\x76\x4d\x1c\x9a\x8d\x77\x60\x07\x51\x20\x10\xb8\xa9\xca\xc7\xc7\x66\x95\x40\xec\x61\xbf\xdf\xef\xa7\x3e\x68\x89\xb4\x0b\x93\x0a\x49\xf7\x4b\x3c\xd1\x2b\x9e\xea\x0e\x67\x15\x88\x7f\xf6\xaa\x36\x77\x59\x9a\xbb\x5b\xbd\x5d\xa5\xd2\xdc\xc7\xd7\xa5\x39\xf0\x93\xa5\xb9\xaf\x5e\xd7\xe6\xc0\xd6\x27\xe0\xdc\x9e\xeb\xba\x9a\xac\x70\x02\x20\x10\xaa\xb8\xb5\x8e\x96\xa6\xe4\x87\xa0\x74\x65\x6d\x3c\xe6\xbb\x09\x92\x79\x53\xb4\x73\xfc\x96\x23\xce\x11\x86\x1c\xc1\x08\x6d\x47\xaa\x5a\xc1\x1a\xa2\x5a\x55\x35\x71\xd6\xae\x2d\x55\x4c\xb5\x14\xe3\xa9\x89\xd5\x1c\x89\x1b\xb0\xcd\xbb\x56\x91\x12\x55\x12\x1a\x86\x69\x5d\xa9\x5a\xb2\x38\x48\xba\xd4\xe7\xe4\x7c\x32\x95\x14\xd4\xb1\xca\xf9\x53\x86\x11\xa6\x8c\x51\x48\xb0\xea\xfb\x2c\x5f\xb5\xa7\xbc\xc2\x17\x59\x7d\xd2\x6a\x7e\xb8\xbd\x4f\x29\xc0\x05\x40\x7b\x82\x06\xb5\x8d\xeb\x3c\xf4\x46\xd6\x58\x2a\x53\x37\xa0\x25\x48\x21\x7a\xc5\x73\x34\x6d\x5d\x2c\xa7\x83\x06\x0e\xd4\x51\xc5\x83\x00\x6d\x6e\xc1\xd1\x7a\xe4\x4d\xe2\xb6\xc8\xed\x13\x49\xd8\x86\x3f\xca\xfe\x65\xf6\xef\xb2\xff\x35\xfb\xcf\xa9\x63\xfe\xc3\xc7\x45\xbf\xec\xe1\x2c\x4a\x74\x59\x0f\xbd\x7f\x76\x6c\x56\x2f\x3f\xde\x7f\xf7\x2f\x7d\x38\xcb\xbc\x9e\x42\xbd\x44\xdb\xf1\xc5\x49\x90\xdb\x41\x43\x91\x85\xdc\x36\xcd\xc6\xd6\xa8\xd6\x25\xd1\x82\xb2\xba\x51\xae\x14\xbb\x69\x4f\xeb\x4e\xf9\x5a\x6e\x2d\xb4\x0c\x99\x7a\x7e\xdf\x68\x31\x4a\x22\xaf\xfb\x44\x89\x35\x36\x28\x6e\xe2\x8e\x82\xf2\xb8\xdd\x6e\x4c\x7f\x58\x09\x0e\x9b\x00\x55\xd3\x58\xad\x5b\x52\x73\x68\x09\xe1\xe3\xc6\x0b\xeb\xb4\xde\x8d\x5e\xa8\xa0\xf5\xc5\x7b\x7a\x08\x15\x47\x84\x4f\x1e\xec\x63\x95\x9b\xa1\x8a\x7d\x0c\x2c\x10\x00\xa5\x6d\x75\xd3\x64\xab\xc4\x6d\xb7\xd8\xe7\x5f\x65\xff\x21\xfb\x3f\x33\xf5\x83\xf6\xf9\xf8\x76\xbe\xf3\x7e\xd0\x3e\xe7\xe7\xf4\x47\x2c\xf4\x50\x5d\xaf\xaf\x56\xef\xbe\xfe\x70\x82\x79\xad\x1a\x68\x18\x34\x70\x3e\xc6\x3b\x55\xa1\xaa\x54\xb3\x91\x48\xed\x95\xae\xd4\x3e\x66\xac\x76\x5a\x57\x7c\xab\xab\xda\x30\x68\xeb\x92\x39\xef\x7b\x83\x21\x14\x82\xe4\x9b\x30\xd9\x00\x5c\xa8\x51\x3c\xc6\x9d\x04\xe4\x08\x50\xdb\x6a\x3f\x9e\x0c\xa5\xdb\xd6\x9c\x0c\xa5\x38\xe1\xe3\xe8\xa5\x4e\x86\x72\x52\x5b\xad\x11\x9a\xdf\x44\x48\x7a\x57\x57\xcf\x8e\x33\x11\x53\x48\xa6\xd2\x7d\x1c\xa9\x1d\x99\xa5\xdb\x66\x34\x5e\x7b\x9f\x65\x60\xb5\xf4\xf1\xa2\x94\x21\xbe\x2d\xbe\xb8\x6c\x6d\xad\xde\x25\x06\xcd\x6b\xef\xbc\x14\x88\xd6\x8c\xd4\x55\x08\xbd\x5b\x23\x1f\xcb\x78\x8c\xc7\xd0\xd4\x1e\x0a\x01\xca\x43\x5e\xff\xa6\x5d\xef\xb2\xec\xaa\x98\x6d\xef\xd7\xfa\xc4\xc8\xf8\x0f\x5e\x45\xc2\x17\xf5\xa5\xc4\xf7\x7b\xba\xc7\x16\x56\xf4\xd3\x3d\x86\x43\xf2\x61\x75\xf4\xa0\x7f\x44\xc0\xc5\x16\x88\xe8\x81\x06\x87\x10\xcb\x00\x94\x47\xc7\x03\xdf\x6d\xfb\x6d\x2f\xba\x61\xad\x9d\x73\xce\xa4\x4f\xf7\xb8\x9f\xb6\xa0\x8d\x34\xa7\xdb\x3a\x6e\xe2\x48\x1d\x06\x25\x56\xc1\x36\x2a\xe5\xc2\xd9\x15\x5a\xeb\x45\xe9\xfd\x02\xd1\x7b\x56\x51\x78\x15\x3f\x2f\x92\xe9\xcb\x91\x96\x02\xd1\x01\x90\xb0\xf4\x5b\x8f\x41\x29\xc6\xb9\x64\x04\x52\x86\x6d\x3c\xd8\x84\x02\x30\x71\x2c\x5d\x2d\xad\x58\xb9\xfd\xde\x6f\x7c\xdf\x06\xef\x4d\x2c\x8d\xac\x5b\x28\x0b\xee\xa6\x2e\x7a\x05\x44\x9e\x39\xbf\x89\x08\xc6\xfd\x81\x1e\xe7\x58\x90\x3d\xf1\x62\xff\x37\x18\xd7\x4d\x1a\x57\x0f\xea\x90\x54\x64\x88\x37\x52\x11\x32\x07\x17\x90\x31\x28\xe3\xde\x26\x85\x99\xf9\x87\x5a\x3c\x0f\x6b\xef\xbd\x33\x32\x52\xc3\xcb\x50\xfd\xf0\xb0\xb2\xbc\x38\x24\x4d\x80\xd3\xb8\xc0\x5f\x77\x5c\x57\xf2\x65\x60\x5e\x49\xc6\xa9\x64\xf3\xc0\x90\x5a\x06\x76\x00\xe2\xf5\xc0\xb6\x21\x38\xab\x22\xfe\x89\x81\xad\x33\xfe\xc4\x72\xb7\x46\xcf\x3e\xf7\x29\x4f\x7f\x73\xb7\x30\x37\x2f\x6d\x59\xc5\x05\x9c\xc1\x82\x6d\x44\xbe\x4f\x1f\xd8\x71\xa9\x04\x10\x02\x1b\x2c\xd6\xe8\x53\x59\x68\x90\x4d\xee\x38\x85\x43\x94\xf4\xe8\x64\xe8\x7c\xcb\x5a\x9f\x15\x99\x2a\x4c\xc2\x47\x7f\x93\xfd\x71\xf6\x6f\x5e\xaf\x4c\x4a\x7f\xbd\x6a\x6f\x7f\x48\x3a\x92\xb3\xff\xf3\xe1\xe3\xdd\x52\x79\x7c\x76\x9d\xbf\x7d\x37\xef\x23\xf3\x48\xbe\x3c\x23\xec\xde\xa6\xed\x65\x04\xc4\x25\x18\xb8\x6d\x6a\x68\xe3\x66\xbe\xe7\x5d\xd4\xc0\xc7\x36\xd4\x70\x0e\xe5\xc6\xe3\x1e\x97\xb1\x2b\xac\x03\x08\x42\x58\xd9\x4a\x30\x25\xca\xa6\xac\x83\x20\x54\x6a\x69\x28\xe7\xc2\x54\x65\xdf\xaf\x19\x21\x8a\x2a\x8c\x14\xd5\x9c\xeb\xe5\xa7\xa7\x8c\x55\x80\x99\xe8\x28\x35\xc8\x4a\xdd\x1c\xb4\x90\x1a\xc3\x5a\x51\x45\x25\x46\x82\x50\xe6\xd2\x5c\xab\xe7\xb9\xfe\xeb\xdf\x75\xae\xe0\x7b\xe7\x7a\x93\xe6\x7a\xf2\x7a\xff\x3a\x53\x05\xd9\x0e\x95\xb1\x4f\x73\xad\x6b\x54\xdb\x5a\x70\xc9\xe7\xb9\x7a\xa1\x4a\xdc\x48\x47\xb8\x38\xcd\x95\x52\xaa\xb9\xc1\x58\x73\x23\xa5\xe1\x9a\x20\xc3\xe3\x96\x42\xa0\x5d\x54\x82\x7b\x18\xb4\x1d\x40\x65\x95\x54\xac\xd6\x52\x0a\x8b\x91\xa4\x4c\xa4\xb9\xe6\x32\xcd\xf5\x5d\xf6\x3f\xcc\xeb\xfa\xf9\x04\xde\xdf\x2c\xe0\x89\x57\x5c\x61\xf7\xef\x1f\xbe\xf9\x71\x9b\x5c\x98\xe4\xab\x55\xe5\x01\x3c\x4f\x41\xc8\x50\x42\xc6\x84\x22\x8d\xb4\x94\x0b\x41\xc9\x3c\x85\x4f\x3d\x20\x3e\x69\x85\x9a\xa6\xc2\x2e\x6e\x17\xc2\x8a\x64\x91\x86\x9e\x0c\xb2\xc5\x65\xec\xeb\xb5\xed\x23\xd2\x6a\x84\x83\xf5\x3b\xc0\x5b\x43\x89\x16\x41\x49\xd9\x50\x2c\x21\x12\xda\x09\x21\x8c\x36\x84\x19\x6d\x8d\xb1\xda\x58\xa3\x63\x90\x90\x9e\xea\x65\xec\xba\xbd\xda\xa5\x4a\xf3\xbf\x7d\xbd\xb6\x3f\xbe\xb4\x5f\x25\x89\x9d\xd9\x34\x6f\xde\xe6\xf3\x21\xf9\x0b\x70\x32\xcd\xcf\xe7\xfd\xfa\xcd\x62\x9b\xf7\x69\x75\xf1\xa2\x7b\x6a\x02\x3b\x4d\x25\x24\xb5\xe8\xae\x85\xc8\x03\x17\x37\xa0\xea\x71\x1d\x7b\x54\xb0\x00\xe6\xb0\xaf\x72\x95\x24\x5a\x34\x25\xe4\x4c\x4a\x2a\xb9\x6e\x98\x90\x92\x92\xaa\xeb\xae\x58\x08\xb6\x75\xa3\x6b\xdc\x66\xe3\x1a\xa7\xa4\x6b\x63\xa9\xa4\xcc\x9b\x78\x98\x5c\xdf\x01\x0e\xe3\xb6\xdd\xe5\x25\x28\x0f\xfd\x3c\xf5\x36\x70\x1d\x40\x25\x99\xc2\xd8\x35\xfe\x54\x27\xcc\xc7\xb4\xce\xdf\x7e\x67\x9d\xf3\x8b\x65\x3e\x01\xdd\xde\x9f\x6f\xd4\x9f\x58\xe6\x6f\xbf\xb3\xce\xe9\xb1\xac\x83\x3a\x2d\x33\xc1\xcc\x4b\xa1\xda\xe5\x46\xbd\x5c\x65\x58\xdb\x57\xab\xfc\x72\xdf\xa7\x65\x86\x6b\xdb\x44\x2e\x44\x8b\xe2\xde\x0d\x00\x39\x8d\x89\x42\xc8\x0b\x49\x7c\x25\x25\xe5\xc2\x71\xce\x8d\x30\xbc\xb6\xdc\x2a\x65\xb9\x25\xd8\x88\x38\xca\x12\x2f\xf3\x05\xed\xf3\x33\xfc\x3f\xfd\xad\x9e\xe1\xe2\xe6\xfe\xcb\xcb\xd8\xf5\xe5\x21\xb8\x58\x68\x04\x5f\xaf\x74\x53\x9f\x56\xba\x1c\xe6\x95\x2e\xac\x07\xb8\xae\xeb\xca\xd5\x9c\x49\x51\x36\xf3\x42\x13\x5c\x92\xa0\x1c\x15\x42\x92\xf4\x14\xac\x4b\x63\xac\xb3\x8a\x5a\xe3\xdb\xd6\x1b\x2b\xb8\x75\x91\x0b\x9e\x67\xdb\x69\xe7\xec\x11\xed\x5d\x03\x4a\xe0\x07\xcf\x98\x26\xa8\x6e\xac\x32\x73\x54\x0f\x91\x74\xfe\x84\x2f\xca\xf9\x75\xb3\xf6\x19\x7d\xc6\xc3\xdd\x3e\x27\x5a\xe6\x29\xad\x9f\x93\x17\xef\x5e\xdc\x90\xcb\x0a\xd8\x29\xa1\xf1\xee\xe1\xed\x12\x74\x5c\x83\x74\xea\x5f\x42\x7a\x23\x84\x54\x31\xab\xac\x22\xa8\xf2\xd8\x39\x6f\x1a\xda\x68\x85\xa2\x48\x85\xa2\x21\x1a\x66\x08\xae\x29\xc5\xd1\xb6\xca\x15\xc7\x2a\x54\x47\x42\x04\x67\xf8\xb7\xfd\x6c\xb1\x5e\x09\x2d\x4c\x5e\x73\xc6\x99\x58\x1d\xec\xa8\x4d\xa0\x1b\xeb\x03\x39\x8c\x92\x19\x26\xda\x23\x53\x54\x0f\x9c\x96\xba\x24\x6d\xdc\xb7\xc6\x03\x0e\x98\x73\x08\x0a\x44\x68\xf4\x87\xe8\xa9\xa1\x8a\x72\x4c\x24\x45\x4b\x2f\x9b\x3b\xf5\xb2\x7d\x99\xe1\xc4\xe8\xf4\x70\xf3\xe5\x75\x6a\x89\xf9\xe2\xed\x1c\x6f\xac\xde\x7d\xf8\xe2\x0d\x78\x7b\xfd\xb9\xf6\x54\xc2\x9b\x26\x72\xaa\x74\x56\xaf\x76\xbe\x54\xc4\xa9\x56\x8e\xaa\x13\xfc\x29\x33\x5d\x5f\xc6\x2d\xdd\x75\x9d\x95\x8a\x50\x4f\xe7\x1b\xba\xeb\x1c\x01\x15\x60\xc9\xc9\x59\xcf\x9e\x8d\x1e\x36\x3a\x1e\x36\x31\x3b\xcc\x6b\x14\xa2\x38\x9a\x36\x87\x79\x09\xb6\x96\xc7\xd1\x07\x67\x9d\x91\x8f\xdb\x7c\xd7\x07\x03\x32\xa0\x3d\xa8\xa1\x47\x47\x14\xfb\x23\xdf\xa7\xbe\xeb\xc3\x93\xb9\x76\x6b\x95\xf0\xfb\x6f\x9f\xab\x02\x17\xd9\xa2\xd5\x05\x2a\x06\x3c\xdc\xdc\xa7\x01\x7f\xb1\x20\x2a\xae\xb0\xa6\x96\xea\xbc\xf3\x52\x69\x35\xa1\x2b\x18\x7b\xa0\x3e\x29\x60\xe2\x0e\xf4\xce\x81\x31\x50\xea\xf9\x84\x58\xed\x20\x5b\x2b\xe3\xb9\xb3\x9c\xb7\x4a\xe9\x83\xff\xd4\x7a\x7f\x25\x3e\xb5\x57\xa2\x47\xd1\x1d\x11\x20\xb3\x77\x17\x07\x04\x78\xe2\x7c\xb9\x2a\xaa\xa4\xb3\x68\xb3\xdf\xcb\x7e\x91\xfd\xe9\x92\xd5\x7b\xae\x52\x9f\x23\xd3\x53\xf5\xbe\x58\xaa\x3a\x17\x6c\xff\x8b\xf4\xe7\x1f\x81\xf5\xf5\xdb\x0f\x1f\x0b\x07\x1a\x88\x5b\x0a\x81\x7b\x84\xa0\xe4\xb4\xe7\xb8\x21\x14\xc0\x4f\x23\x28\x31\xed\x00\x65\x0d\xc9\xd5\x86\xd8\xc4\xee\xbf\x8b\x81\x01\x34\xb8\x96\xd1\xa7\x0c\x74\x18\xef\x0d\x5a\x75\x82\x12\xa9\x3d\x76\x6d\x68\x50\x30\xde\x5b\x3d\xf5\xa1\x72\x6e\xeb\x84\x74\x4a\x3b\xe2\xb0\x60\xd4\x18\xc9\xb4\xea\xb2\xac\x28\x16\x7e\x74\x9d\x74\x37\xee\xce\x5e\xf8\x73\x61\x3d\xc5\xa5\x60\x89\xee\xb2\x05\xfc\xb9\x12\x8b\xd2\x5c\x1b\x49\x13\x71\x1f\x5a\xd0\x06\x1f\x71\x74\x0c\x08\xd0\x4c\x7d\xe0\x26\xb8\xb5\xde\x84\xa7\x2c\x44\x08\x76\x61\xf6\xab\xe2\x8e\xc4\x2e\x4a\xd3\x28\x20\x01\x21\xc7\x56\xb4\x89\x9f\xd3\xbd\xc2\x4a\xe6\xeb\xef\xc3\x4a\xae\x7e\x57\xac\x24\x85\xd1\xc6\x2d\x6b\xfc\x82\x95\x0c\xb9\x39\x61\x25\xe3\x71\xcb\x0d\xdf\x00\x74\x09\x96\x3c\x7a\x85\x43\x0d\x01\x0d\x21\x6e\x61\xbf\x60\x25\xe7\x31\xa1\xeb\x66\x4d\x9f\xc7\xf4\xb3\xef\xc5\x6f\x7e\x73\x2a\x13\x9e\x46\xb6\x3a\x8d\xa9\x94\xa7\x31\xd5\xf5\x3c\x26\xcf\x7f\x6b\xd3\x48\x4c\x9d\xc4\xbc\xe7\x91\x5d\x8d\xcb\xa0\xba\xb8\x79\xca\x84\x11\x07\x20\xa6\x0e\x93\x80\x46\x4d\x68\x5e\xba\x10\x0d\x84\xa7\xa1\x35\xca\x75\xb8\xf3\xd9\x82\x91\xa2\xd7\xa1\x90\x3f\x98\x27\xfa\xfa\x4c\xe5\xf2\x9c\x27\xea\x72\x3b\xd9\x1e\xd4\x40\xe3\x38\x3c\xda\x46\x6f\x24\xe0\xa4\xa9\x90\x3a\x4e\x5d\xb8\x2a\x3f\x1d\x0b\x19\xa9\xf5\xae\x0a\x1b\xa7\xe6\x0d\xb4\xe6\xdc\x42\xe0\x7c\x93\xea\xbb\x8b\x1e\xcb\xdf\xcf\x70\x46\x52\x2d\xe4\x99\xe7\xef\x85\xef\xef\x94\x3b\x38\xc7\xc6\x73\x9c\xb6\x04\xc5\xab\xf7\xf7\xb7\x67\x86\x80\xef\x55\xcc\x9c\x8f\x9d\x82\x5a\xcf\x9d\x70\xdc\xf6\x3d\xaa\x2a\x8d\xa5\xa2\x3c\x06\x5e\x59\x2d\x4b\x93\x53\x91\x8b\xf0\x78\xf0\xc5\x28\x25\xc4\x88\x23\x34\x86\x21\x00\x11\x56\xdd\x78\xfa\x70\x0d\x83\x1a\x7a\xc9\xc4\x98\xa8\x9e\x1a\xe1\xfa\xc4\xae\xd0\x0f\x03\x60\xb1\x89\x54\x88\xca\x26\x88\x5d\x9f\xb3\x08\x73\xe5\xfd\x89\x47\x2d\xfc\x8e\x73\x3b\xe7\x45\xfe\xba\x73\xab\xbc\x93\x4e\x39\xee\xfa\x1e\xd5\x95\x2e\xb1\x54\x8c\x47\x27\x4b\xa7\x65\xe5\x72\xa5\x72\xed\x1f\x87\x50\x1c\xa5\xc2\x04\x0a\x8c\xb7\x61\x13\x80\xfa\xe1\xc9\x1d\x5a\x61\x87\xef\x4c\xce\x55\xaf\x27\xb7\xf4\xdd\xa5\x1c\x66\x9f\x58\x96\xbf\x9b\xc3\xfc\x39\xf8\xfc\x6e\x31\x2b\x3c\x75\xb9\x9f\x74\x0f\xca\x25\x8b\x39\x46\x67\x8c\x90\x0c\x64\x2a\xd4\xa8\xdd\x4d\xfd\x92\xc7\xec\xa3\x95\x4e\x97\x8e\x0b\x49\xa0\x67\x20\x23\x94\xe8\x0a\x70\xe3\xb2\x0c\x64\xfc\x49\x14\x59\xe2\x92\x39\x61\x05\xef\x8b\x87\xe7\xed\x6e\x11\x1f\x7c\xee\x83\x06\xf5\x7c\x87\xb3\xb6\xda\xee\xaa\xb2\x31\x5a\x2a\xda\xdb\x03\x3c\x82\xb2\x22\x84\x69\xbb\x36\x48\xeb\x10\x4d\x10\xbc\x6d\x42\xeb\xe2\x76\xa7\x01\x04\x9b\xd0\x6d\x5b\x63\x0e\x89\xf3\x74\x53\x64\xd7\x64\xed\x2f\xea\x56\xd9\x73\x47\xe4\xc2\x56\xb8\xcc\xef\xfd\xdd\xed\xea\xe2\x2a\x8e\xbe\xca\xfb\x09\x55\x39\x1a\x7f\x13\x86\x1c\x96\x13\x2c\xb2\xbc\x7e\x44\xc5\xf6\xe5\x5a\xfb\x8a\x6a\x32\x6d\x94\xca\x31\xd1\xb1\xa7\xd4\xa5\x4f\x4b\xc8\xa2\x8b\x40\x53\x4e\xfc\xef\x65\x5f\x9f\xb2\xe1\xff\x22\x79\x15\xf3\x8d\x71\xd9\xd4\x3b\x3b\x53\xa7\xac\xf1\xdd\xed\xfa\xfa\xfe\xc3\xc7\xbb\xeb\x62\x69\x9c\x7d\xd1\x40\x38\xf7\xfe\x2e\x99\xff\xb3\x6a\x42\xd2\xe5\xbd\x56\x3e\xb6\x65\xe9\x8d\x30\x4e\x06\xb1\x23\x71\xe3\x61\x2d\x41\xed\x1d\xcc\x4b\x84\x66\x37\x8a\x2b\x5d\x6c\xa6\x0e\xe5\x8a\x75\xed\x0e\xc5\x66\x1b\x0f\xb1\x87\xbb\xad\x64\x8c\x8a\xce\x6e\x7d\xde\x4d\xfc\x7c\x01\xdd\xe8\xe9\xa0\x57\x2c\xee\xda\xaa\x84\x58\x11\x44\xa1\x46\xa4\x1b\xaa\x4a\xf9\x0d\xa4\x9a\x62\x8c\x65\x6c\x26\x43\xb4\xe2\xb0\x74\x55\x92\x03\xc4\x84\x12\x68\xb8\x01\x1b\x7a\x60\x07\x16\x6b\x7c\xaa\x6f\xe5\x0b\xc7\xd3\x62\x8b\x7f\x9c\xfd\x77\xd9\x3f\xc9\xfe\x79\x62\x61\x9c\x6d\xf1\xe5\x77\x6d\xf1\xe1\x27\x6c\xf1\x83\xa6\x30\x2e\x0e\xa5\xd5\xdc\x18\xe1\xc4\x48\xe2\xde\x57\x95\x3c\x3a\x07\xc1\x1e\xa2\x01\xc1\x68\x94\x2e\xc2\xb4\x45\x39\x65\x4d\xd8\xa0\xd8\x0f\x4f\x59\xdc\xc0\xcd\x18\x28\x91\xad\x1e\xfd\x19\xcc\x31\x5f\x80\x37\x22\x22\xf1\x5d\x3b\xf4\xe5\x8f\xdb\x41\xe3\xcf\xcc\xc0\x12\x6f\xd9\xd2\x47\x56\x67\x7f\x94\xfd\x2a\xfb\xb3\x84\xb8\x58\xd0\xb9\x77\x9f\x21\x74\xdf\x3f\x80\xbb\xbc\x48\x02\x8e\xa9\x42\x9c\x17\xf7\x0f\x5f\xbc\x99\x3d\xb0\x17\x28\x43\xd1\x85\x71\x04\xf5\x91\x29\xc6\x20\xe7\x38\x1e\xf6\xc0\xe5\x14\x35\xd2\x73\xa7\x4c\x23\x06\x65\x28\xea\x11\x17\xf5\x23\x73\x94\x6b\x96\xd7\x02\x5b\xcc\xd6\xe6\xe8\xe2\xde\x3d\x6e\x8c\xa8\x9a\x5a\x16\xa5\xcb\xf1\xc4\x23\x8d\xfb\xa6\x09\x20\x3b\x06\xdb\x03\x04\x6c\xce\xa3\x88\x23\xc0\xa0\x9b\x6a\x16\x87\x56\x8d\xfb\xd0\xb1\xb6\x59\xb0\x7f\xf8\xd4\x3f\xf1\x77\xb2\xdb\x54\x89\x7f\xee\x8f\xbe\xb9\x5b\xdd\xbe\x88\x21\xbf\xe6\x44\x2e\x36\xfe\xe8\x0f\xe1\x51\x16\xe3\x63\x63\x9d\xd9\xe5\xdb\xb8\x9b\x83\xf9\x10\x7b\xc0\xe2\x6e\x8d\xe3\x31\x39\x0e\x59\x34\xd6\x47\x16\x7d\xdc\x09\x80\x00\xcf\xcb\xb8\xf3\x3b\x1f\x19\xe8\xfd\x2e\xf9\xab\xed\xe7\xbf\xff\xa4\x53\xf6\xea\xf7\x83\xcf\x7f\xbf\x0c\x00\xce\x9f\x9f\x8e\x57\xe4\x91\xb5\xbe\x01\x55\x51\x2e\x14\x8f\x21\xc9\x5c\x8d\x6b\x7c\x9c\x07\x74\x8c\xc6\x2d\x03\xd8\x2f\x03\xc8\xe2\xce\xed\x97\x01\xec\xb3\x6c\x95\xea\x5d\xdd\xda\x64\xbf\x78\x56\xc0\x9d\xc7\x70\x81\x1d\x2f\x2e\x16\x14\x2c\xc2\x9b\x1f\x3e\xde\x83\x0b\x5c\x59\x92\x3b\xe5\x1e\x22\xab\xb4\x0e\x7a\xe4\x07\xcf\x0d\xc5\x90\x31\x12\x29\xb0\x63\xc3\x37\xe2\x50\x34\x61\xda\x84\xf0\x0c\x83\x33\x1b\x4a\x84\xd7\x41\x36\x2a\x04\x50\xc6\x8d\xe2\x65\xa8\x68\x9e\x39\x12\x7b\x6b\xfc\x71\x32\x27\x1d\xe5\x6d\x13\x49\x93\x70\x4e\xf0\x34\xd6\x3a\xfb\x65\xf6\xc7\xd9\xaf\xb2\x3f\x4d\x63\x7d\xfb\x22\xc8\xfa\x7d\x43\xbd\xfb\xce\x50\x91\xe7\x41\x2b\xdd\xb4\x0d\x7f\xca\x5a\xe6\x08\xa9\x19\xa5\x11\x02\x3f\x36\x7c\x2b\xe2\xb1\xd8\x86\xa9\x09\x21\x97\x53\x33\x5f\x6b\x33\x3a\x39\x0f\xb5\xe7\x21\x80\x3a\x0e\x4a\x94\xa1\x62\xcb\x50\xb5\x0e\xfb\xef\x0c\x35\x5b\xe5\x38\x71\x91\xcf\x76\xbd\x1c\xeb\xd9\xae\xab\xef\x0c\x76\x81\x4e\x7e\x3e\xd6\xab\xbe\x41\xb4\x0f\xca\x0f\x1e\x64\x3c\x76\x83\x0c\x82\xd7\x52\x8a\x69\x04\x5b\x17\x7b\x01\x6a\x1d\xc7\x2b\x17\xa6\x32\x84\xfc\x38\x95\xf3\xb5\x36\x03\x63\x22\x68\x2f\x1b\xd5\x34\xa0\x8e\xa3\x96\x55\x5b\xf3\x3c\xf3\xb1\x1f\x4c\x73\x98\xd4\x79\xbc\x21\xd2\xb0\xe8\x95\x0c\x27\x3f\xe1\x6f\x7b\x1f\xc8\x50\x43\x23\x94\x74\xde\xb1\xad\xe5\x86\xd0\x9a\x31\x1c\x3d\xa0\xad\x65\x0d\xeb\x0b\xee\xa7\xa3\xf7\x79\x39\x1d\xe7\x6b\x6d\xb6\x64\xb9\x0f\x7a\x1e\x3c\x28\xe3\x4e\xcf\x0f\x33\x03\x47\x47\xe2\xa0\xb5\x7f\x31\xee\xa6\x5d\x8c\x0b\x72\xf3\xc4\x56\x70\x6d\x52\xe7\x60\xf2\x42\x16\xca\xd0\x53\x3d\xe2\x34\xce\xc5\x4b\xb9\x80\xb0\x14\x03\x73\x9b\xed\xd6\x6f\x36\x1b\x46\xab\xba\xae\x11\x93\x5c\x08\xaf\xac\xec\xf2\x06\x54\x51\xe7\xf5\xd1\x0d\x83\x3b\x46\xc1\x68\xa9\x11\x28\x23\xb5\xd6\x6e\x62\x99\xe3\x43\x6b\xc6\xf9\x77\x5f\x9d\x31\xb2\x7f\xf2\x3b\xfd\xee\xe7\x5a\xf0\xba\xa6\x6e\x1c\x47\xbf\xdb\x6d\x29\xab\x6a\x08\x11\x0f\x5a\x72\xe1\xa5\x91\x5d\x2e\x01\x8f\x3c\x27\x9f\xff\x76\x3d\xf4\xae\xf5\xd3\x21\x87\x3b\xab\xbb\xe5\xfc\x71\x4f\xfc\xba\x5d\xd3\x13\x53\xc2\x7c\x1a\xff\xb3\xec\x5f\x3e\x23\x58\xee\x5e\x44\x3c\x6f\xee\x6e\xbf\xfc\xea\x01\x7e\x5c\xe4\x9c\xee\xe0\xb7\xef\xd3\x40\xfe\x02\xdc\xbf\xbf\x5b\x68\x2b\x66\xe7\x0e\x5c\x62\x32\xd6\xd7\x77\x4b\x2f\x78\x7e\xb8\xb2\x31\xcc\x31\x44\x55\xe7\x36\x8e\x6e\xe4\x4a\x4e\x23\xd9\x01\x5c\xa3\xd2\xd7\x8c\x44\x1f\x07\x25\xb5\x36\xa2\x39\x02\x41\x62\x00\x38\x86\xdc\x37\x71\xdb\x34\x00\x35\x2e\x44\x48\x30\x18\x30\x8e\x4d\x52\xaa\xa0\xce\x46\x8a\x91\x6f\x59\x43\x78\xdc\x09\x58\x43\x68\x71\x47\x30\x95\xc0\x4a\x6e\x85\x68\xbc\x00\x83\xb5\xd6\xc6\xb1\x9b\x3f\xa6\x1d\x63\x94\x47\x11\x16\x1d\xd1\x33\x87\xec\x57\xc9\x93\xfd\x6f\xb3\x7f\x9a\x66\xfd\x70\xfb\xb9\x86\xf4\xc7\xfb\xf7\x0f\x77\xa7\xf5\x78\xfd\xfa\xb9\xc9\xfe\x07\xfb\x94\x8b\xd6\x0d\x83\xe1\x3c\xa9\xc0\x69\xa7\xfa\x0d\x30\xa3\xdb\xf4\x26\x48\x2d\x1c\x37\xaa\x15\x21\xb2\xc2\x3d\x1a\x73\xa5\x23\xe4\x8e\x51\x28\x38\x89\xd5\x68\x8d\x33\xa1\x80\x41\x78\xee\xd7\xa6\x77\x84\x33\xc3\x70\xdc\x80\xca\x4a\xed\xb6\xae\xef\x5d\x67\xbd\x6d\x63\x00\x2c\x58\xdd\x0c\xd3\xe8\x9c\x8f\xad\x12\x75\x80\x0c\x50\xcc\x77\x4e\x87\x36\x74\xa2\x6b\x12\xdf\x21\xb9\xa6\x79\x9d\x98\xd7\xfe\xcb\xc5\xaf\x4d\x3c\xb2\xf3\x84\x66\xb7\x01\x7e\x33\x2f\xe1\x02\xde\x29\x92\x0e\xd5\x07\x80\x73\x1f\x72\xa3\x8d\xd2\x74\xb2\x8f\x23\x02\x01\x98\x49\x27\x81\xd3\x3c\x80\x3d\xaa\x21\x8e\x6c\x07\xb6\x94\x46\x2f\x94\xe6\xb8\x0a\x65\x92\xab\x8f\x6d\x5d\x13\x5b\xce\x36\x1e\x12\x56\x5a\x65\x55\xf6\xed\xe9\xee\xfa\x77\x4b\xee\xe1\x44\x38\x96\x5f\xcf\xce\xdb\xc2\xf5\x77\xa9\x13\x76\xf3\x70\xfb\x1a\x42\x7d\x7f\x41\x07\x97\xa0\x83\xa7\x62\xf7\x92\x66\x7c\xb8\xf9\x70\xd5\x4b\xea\xe0\x76\x8f\x9d\x0c\x52\x5a\x0b\x51\xbe\x57\xcd\x4e\x2a\x5c\xfa\x1a\xa1\xb1\x11\xa1\x89\x46\x0a\x4c\x90\xc0\xe8\xe8\xfd\xf1\x78\x3c\x16\xad\x6a\x77\x52\xe0\x32\x54\x98\x35\x2d\x0f\xed\xaa\xeb\x46\xaa\x58\xed\x1a\x40\x71\xdc\xdb\x0a\x73\xe6\x8c\xe1\x3d\x23\x1d\x3a\x60\xcc\x64\x6e\x0f\x34\xc2\x47\xb2\xa0\xab\x9b\x68\xae\x5c\x1c\xba\x58\x77\xc1\x5a\x19\x8f\x8c\xed\xf1\x26\x60\xa6\xf2\xfd\x53\xc6\x12\x0f\x4f\x5e\x5f\xfb\xb5\xcf\xaa\xec\x8f\xb3\x3f\x4f\x1e\xde\xff\xb2\x78\xf8\x1f\x3e\xa6\x4c\x58\xc2\x8d\x7f\xf8\xe6\xed\x7a\x75\xfb\xe5\xc3\x57\xbf\xce\x4f\xf8\xc0\xef\x31\xc3\xc7\x33\x65\xdc\xcd\x42\x81\xb3\xba\xfd\xf2\xab\x5f\xe7\xff\x18\x2c\xcf\xe3\xf3\x5f\x38\xba\x60\x8e\xa3\xb4\x4e\xda\xba\x8e\x5d\x34\x68\x58\x29\xb3\x8f\x7d\x55\x1a\x8b\x04\xa9\x1c\x74\xd1\x61\x45\xfc\x21\x66\x42\x08\x5b\x5b\x81\xcb\xb3\x78\x6d\x12\xb0\x95\xf3\xdb\xb1\x6a\x09\xc7\x95\xab\x31\x8f\x0d\x0d\xdc\x1f\xd6\x1e\x07\x52\xd5\x92\xd8\x40\x20\xc2\x95\x91\x56\x1a\x5e\xd1\x12\x31\x6a\x31\xe5\x40\x07\x1a\x37\xb1\x14\xb2\xb2\x25\xdf\xe6\x5d\xcf\x9e\x32\xe6\xa4\xe1\x18\xc1\x12\x2b\xea\x31\x64\x1c\xf8\x86\xcc\x76\x01\xe5\xb3\x5d\x96\x7d\xe7\x64\x97\xaf\x97\x64\xe8\xf5\xef\x6c\x97\x05\x61\xff\xbd\x86\xb9\xfc\x0b\x07\xef\x3d\x28\x37\x98\x58\x27\x1d\x8e\x7d\x32\x8c\xb4\xfb\x38\x54\x25\xec\xa8\xc4\x95\x87\x26\x1a\xac\x68\xb3\x5f\x0c\x03\x1d\x27\xb1\x0c\x01\x1c\x63\x39\x5f\x2b\x61\xf7\xb1\x47\xba\x21\x9c\x94\x1e\xba\xd8\xd1\x20\xc2\x6c\x96\x41\xd5\x90\x53\xd2\x0c\x54\xd1\xda\xb8\x4e\x35\x9a\xd0\x12\x1b\xda\x51\x26\xc0\x6e\x2b\xa2\x9f\x8c\x94\x95\xab\x24\x8a\x87\x82\xed\x55\xec\xb5\x52\x4e\x08\x5c\x97\x24\xd0\x1d\x65\x22\x2f\xf7\x2c\xd9\x45\x9f\xec\xf2\x27\x89\x51\xe1\x2f\xb3\xff\xed\x7c\xbf\x7c\x9f\x5d\xc0\x9f\xbe\xff\x51\xcb\x7c\xf7\x96\x79\xf8\xd3\x8f\xa7\x47\xed\x95\x6d\xec\xf1\x6f\x6f\x1a\xac\xb4\x4a\xa6\x21\xfc\xc5\x36\x9d\xa8\x21\x25\xc4\x77\x54\x60\x68\x4d\x90\x41\x20\x56\x96\x48\x52\xcf\x98\x00\x5d\xcf\x62\x37\x75\x8b\x71\xaa\x63\x51\x6d\x44\xdc\x48\x29\x0d\xa7\x18\x96\xc4\xd2\x61\x8e\x95\xc0\x76\x24\x0b\x77\xf0\xf1\xb4\x6f\x7f\x99\x6a\xa6\x67\x4e\x81\x73\xd2\x35\x69\x0e\xdd\xbd\x5f\xa4\x9b\xd6\xd7\xb7\x9f\x6f\xcf\x57\x36\x54\x75\xde\x4c\x98\x70\x0f\xa1\xee\x55\x3c\x00\x0a\x21\x60\x9a\x47\x9c\x7b\x65\x01\x8e\x1b\x29\x94\xac\xb9\x62\xb1\x5f\x1b\x28\x45\xe8\xba\x4f\x4d\xc1\x30\x32\x00\x02\x12\xf4\x63\xdd\x2b\xe5\x1b\x6f\x95\x8f\x9c\xb3\xba\x81\x35\x98\x0f\x95\x9f\xe7\x5d\x1a\x9b\x4c\x3c\x93\x6f\x12\xf7\xe3\x2f\x33\x94\xfd\xdb\xec\x3f\x64\xff\x29\xfb\xdf\xb3\xff\x9c\xfd\x3f\xd9\xff\x3b\x9f\xf2\x27\xd0\xce\xcd\xbb\xbb\xdb\x8b\xf3\xe2\x1f\x80\x87\x9b\xfb\x4b\xc2\x9a\x55\x8a\xee\x5e\xd0\x6e\x4b\x62\xf1\xbc\x65\x7c\x93\x16\xf5\x94\x56\xf9\x78\xd2\x87\x78\xb8\xc0\x85\x5d\x7f\xfb\xee\xfe\xb6\xd8\x76\x26\x5c\x71\xff\xb8\x29\x30\xc6\xbe\x87\xed\x64\xbd\x43\xf1\x00\xa4\x73\x14\xf9\x0e\xb6\xc0\xb7\x1d\x6a\xdb\xe9\x58\xe8\xc9\xc2\x7c\x10\x1a\xd1\x5a\x20\x04\x63\x03\x6a\x8c\x6a\x59\x96\x73\x44\x5c\x03\x1c\xf7\xa0\xee\x21\xe2\x12\x0a\xa7\xf5\xc1\x5a\x3d\x35\xe9\x74\xae\xab\x52\xaf\x50\x84\xd3\x21\x42\x01\x7c\x5e\x16\x75\x1c\x37\xca\x2a\x58\xcb\x0a\x55\x88\x63\x1a\x77\x8d\x20\xb5\xac\x61\x8d\x24\x82\x32\xee\xe8\x34\x8e\xa5\xa9\x3c\x08\x3c\x1e\x19\x25\x75\x85\xa0\xad\x38\x28\x39\xac\x25\xa5\x42\xcf\x1f\x53\x60\x8c\x6d\xeb\x9a\x9e\xeb\x4d\xd9\x75\x58\xfb\xb4\x5f\xfc\x93\xf3\xea\x27\xd5\xf1\x67\x85\xe8\xaf\x5e\xc9\x66\x2e\x87\xdb\x73\x6b\xce\xd5\xa9\x9d\xe8\xe3\xdd\xbb\x6f\x3e\xde\x5d\xcf\x81\xf1\x2f\xaf\xbf\xca\x95\xaf\xca\x02\xb9\xbc\x8e\x7b\xea\x9d\x04\x5e\x47\xaf\x11\x2c\xb5\xe1\x0e\x3a\x8d\x71\x19\xd5\xb4\x41\x60\x07\xf6\x25\x7e\xca\xa6\x1d\xc9\xb3\x03\xac\xe3\x31\x8e\x02\xa8\xc3\x84\xaf\x0c\x7a\x3c\xa2\xc2\xc0\x09\xc3\x9c\x6f\xda\x69\x2c\x4b\xbf\xf6\xb0\xaa\xcc\x5e\x33\x41\xad\x70\x66\xac\x2a\x44\xac\x2d\x5d\x45\x29\xac\xb7\xd8\x1d\x6a\xd8\x70\xcd\x6c\x55\x0a\xa2\x11\xd1\x54\x96\x94\x46\xc2\x54\x99\xce\x0d\xfb\x44\xaf\xdb\xa2\x4e\x77\x11\x3c\xe1\x22\xcf\xe7\xf6\xdd\xed\xe5\xe1\xf1\xa7\x1f\xdf\x3f\x43\x61\xbf\x79\x79\xc3\xcb\x6e\x71\xf9\x86\x2b\x04\x68\xca\x41\x2b\x89\xb4\xa0\xb6\xaa\xe3\x18\x15\xec\xda\x38\xf8\xae\x03\x6c\xfc\xcd\xe6\xf9\x0d\x55\x3d\xbf\x03\x7d\xf6\x86\xdc\x3b\x17\xd9\x58\xd5\x9c\x84\x8e\x50\xc2\x2a\x57\x6f\xcd\x38\x8e\xe6\xf4\x3a\x42\xf3\x1f\x98\xe7\xd7\xcf\x7a\x52\x2e\x61\x8a\xff\xe0\xa4\x62\x74\xea\x87\x5d\x70\x9b\x49\x1b\x71\x7d\x6a\xab\x7f\xbe\xff\xdf\xce\xaf\x14\x5d\xa8\xaa\xa2\xa2\x73\xcc\x1e\x8f\x35\x06\x30\x69\x7b\xc7\x5d\x13\xf7\x12\x6c\xd8\x91\x5b\xd9\x4d\x7d\x1f\x54\xe8\xc0\x50\x6f\xe3\x91\x80\x7a\xed\x10\xaa\x9d\x51\x82\x32\xc1\x85\x09\x41\x7a\xe6\x14\xc8\xac\x90\x4d\xcb\x95\x91\xec\xe0\x8c\x6c\x79\xf6\x7b\x39\x49\x1a\x9d\xee\x54\x19\x59\x22\x95\x8f\xa7\x7e\xb5\xb7\xe7\x21\xde\xbf\x28\x7b\xbf\x1a\xe2\x92\xd5\xbf\xbe\xe8\x8d\xb9\x59\x0a\x5b\xab\x77\x5f\x9f\x72\xed\x1b\x0f\x73\xca\x67\x07\x69\x28\x6b\x0e\x24\x8f\x5b\xa3\xe6\xe8\x5d\x13\xc7\xb5\x6c\x23\x6c\x9d\xf4\x2d\x70\x75\x33\x92\x2d\xbc\xaa\x3f\xed\x43\xbe\x9f\xea\xf3\xe5\x45\x88\x03\x05\x55\xae\xf7\x1b\xba\xdb\xac\x1d\xe2\xd6\x1a\x2e\x38\xc1\xa3\x70\x62\xec\x94\x31\xa0\x76\x52\xb6\x9d\x30\xda\xf0\x78\xb0\x4e\x35\x62\xff\xb8\xcd\xa9\x8e\x9d\x8a\xbd\x7a\xca\xa4\x60\x0e\x31\x44\x82\xc0\x59\x56\x66\xee\x09\x5d\xab\xd5\x8b\x2e\xe9\x43\x42\x26\xff\xd5\xe7\xab\x72\x7a\xa4\x52\x9f\xe7\xbb\xaf\x4f\x64\x3d\x17\xf3\x2c\x2e\x96\x09\x2c\x73\x4e\x0b\x59\xf4\xae\xac\xf2\x03\x95\x86\xe0\x78\x2c\x6b\x05\x06\x1e\xb5\xb3\xfb\xfc\xf8\xdb\x03\xb0\x14\x8c\x74\x4f\x8d\x6c\x62\x57\xec\x1f\xeb\xf3\x75\xe8\x82\xf2\x1d\xe8\xea\xcd\x53\x46\x40\x0d\x14\xdf\x47\x4d\x40\x93\x8f\x80\x80\x9a\xc6\x6d\xdc\xae\x24\x82\xb5\xd1\x82\x13\x4a\xb0\xe7\x4e\xb4\x5e\x4c\x2c\xef\x85\x3a\x2a\x21\xed\x24\xe7\xad\x24\x1e\xf9\x95\xe0\x52\x2b\xb6\xb5\x8a\x79\xf6\xa8\x25\x45\x06\x22\x88\x3c\x4b\x3a\x3c\xbf\x57\xc0\xd3\x9a\xff\x61\xaa\xd8\xcf\xb1\xf4\x87\xec\xcf\x33\xfa\xb2\xa7\x5c\x2c\xfa\x99\x84\xf2\x3a\x55\xe4\x7f\x6c\xd9\x57\xe7\xa2\xda\xea\xdd\x87\x15\xf6\x65\x05\xf6\x44\x68\x82\x5c\x59\x51\x50\xf3\x83\xd4\x83\x04\x18\x49\x5c\x61\x24\x4d\xf4\x6e\xf6\x00\x00\x85\xb6\x25\x3d\x9e\xa3\x80\x85\x27\xed\x74\x81\x43\xdf\xd2\xae\x8b\x9d\x30\xf1\x48\xb7\xf3\x1d\x8d\x4e\x0b\x4f\x06\xe1\x64\xdb\x8a\x79\xe1\x25\xa4\x48\x36\xfd\x0f\x2d\xfd\x11\xd3\x20\x89\x4a\xeb\x9f\xce\xcf\x15\x3f\xe5\x87\x4e\x7d\xdc\xa7\xae\xde\xcf\xbb\xe0\xf3\x77\x2b\x01\x88\x37\x86\x49\xce\x20\x17\x28\x8e\x9a\x13\x8b\xf9\xd5\x76\x0e\xbf\xc2\xa7\x9d\x15\x75\x53\xcb\xe2\x38\x6c\x8e\x04\x64\x63\xfa\xb7\xc3\xf3\xd9\xfc\x63\xff\xf6\xb7\xef\x56\x3d\xc8\x3c\xe7\x5c\x72\x56\x33\x4e\x9e\x32\x2e\xb0\x49\xff\x76\x13\xa5\xff\x74\xe2\x2a\xb9\x82\xfd\xb0\x23\xfb\x7e\xe9\x03\x10\x4f\x2a\xfd\xdb\x6f\xb2\x5f\x65\x1f\x9e\x33\xa5\xdf\x8b\xc2\x7d\x7b\x51\x97\x7f\xf6\xb0\x4f\xe0\xe9\x85\x7d\x6b\x0d\x4e\x39\xee\x37\x0f\x37\xf7\xe7\xab\x10\x1b\x07\xb4\x3b\x1c\x5c\xf4\x6e\xe3\x01\xf3\x40\xc6\x06\x8c\x47\xa5\x34\x84\xb1\x8d\x16\xb5\x26\xb6\xa0\x8f\xfd\x61\x18\x11\xa6\xbd\xca\x4b\xf9\x69\x34\x5e\xa9\xa3\x10\x3b\xa5\x56\xc7\x39\xde\x74\xf3\x97\x8d\xb5\xce\x38\xe5\x34\x46\xa4\xb2\xcc\x39\x13\x69\x55\x13\x8c\x6d\x3c\x46\xe9\xdc\x3c\xd3\x45\xf2\x2b\x69\xe5\x17\xa9\xae\xd2\xad\x6d\xf6\x55\xf6\xab\xec\xff\xf8\x21\x0e\x9e\xbb\xeb\x87\xdb\xc4\xdc\xfe\xd5\x67\x3c\x3c\xc5\x1c\x8b\x7e\xf5\xf7\xc0\x0b\x43\xc3\xeb\x93\x30\xdd\xd0\x97\x4c\x99\x1f\xef\x57\x75\x48\xd2\x0e\x43\xc2\xfa\x22\xe5\x14\x68\x88\x3b\x96\x4f\x19\xd2\x0e\xb9\x52\x6c\x7b\xa5\x6b\x17\x0a\x14\x1d\x44\x75\xe2\xb6\xc4\xd8\x69\x43\x70\x29\x25\x22\x88\xd1\xba\x6a\x46\xba\xef\x4a\x3f\xd0\x21\x94\x95\x91\xc2\x9b\xe3\xda\x72\xa3\x35\xf4\x0c\xe3\x69\x88\x28\x06\x0e\x34\xe8\x72\xd7\x31\x64\x70\x55\xd7\x44\x22\xcf\x30\x45\xb5\xa9\x63\xe7\x20\x26\x82\x69\x83\xd1\x46\x58\x7d\x80\x94\x86\xa6\xf2\xb5\x10\x46\x68\xd1\x12\x9b\x0e\xc8\x5a\x40\x8d\x79\x56\xe4\xea\x94\x2b\x79\x73\x42\xd0\xdf\xbd\x7f\xe1\xd3\x5c\xd6\xfe\xee\xed\x73\xdf\xc0\x89\xdf\x61\xe9\xc0\x59\xb0\xf4\x29\x4b\x76\xea\x3a\x5b\x80\x74\xf7\xab\xf7\x77\xb7\x79\x00\x24\x00\xd6\x00\x1e\xbb\x26\xf6\x21\x8e\xb5\x0d\x9d\x07\xd0\x6f\x36\xd3\xd0\x15\x34\xf2\xbc\x8e\x7a\x00\x95\x88\xdb\x6d\xd8\xc6\x9d\x04\xf5\x2e\xca\x3c\x8b\xda\x16\x26\xee\x56\x07\xe7\x9c\xb3\x42\x08\xb1\xd7\x7a\x0e\x82\x5d\x3c\x82\x32\x06\x6b\x5d\xcb\x1b\x93\x1a\xb9\xdd\x4e\x5b\xd1\x3b\x0b\xf6\x21\x9c\x34\x0f\x0e\x7f\x8d\xf9\x3c\x7c\xff\x7c\x4e\xe9\x88\x8b\xf9\xdc\xdf\x16\x75\x02\x06\x2e\x04\xf3\x71\x1f\xe2\xbe\xd6\xc1\xf9\xa3\xef\xba\x69\xef\xf2\x5d\x74\x60\x1b\x43\x03\x32\xf1\x94\xf5\x61\x38\x4a\x50\xf6\xd1\x83\x31\x06\x5d\xd4\xc7\xe5\x26\xb6\x52\x4a\x79\x78\x3d\x19\x67\xe7\xc9\xec\xa3\x06\x7a\xd4\x56\x76\xd6\xbd\xcc\xa5\xc8\x9e\x39\x37\x7f\x95\xfd\xe5\x92\x49\x79\xdd\xbd\xf1\xfe\xa1\xb8\x5b\x2a\xfa\x27\x06\xe0\xb4\x1c\xf7\x4b\x9e\xb2\xb8\x68\xf7\x38\xd3\x88\x7e\xbc\xbf\xc2\xe1\x90\x1a\x01\x9b\x43\x38\x1c\x36\x40\x60\xd8\xd4\x10\x64\xd8\x60\x28\x63\x63\x40\xcd\x63\x63\x58\x88\x3d\x03\x99\x8a\xc7\x7a\xdf\xec\x1a\x50\xc6\x63\x73\xc0\xbd\x6d\xd0\x76\x6d\x87\x61\x70\x6d\xdb\xb6\x89\x31\x84\x30\x22\x11\x65\x6e\xe0\xce\x00\x18\x0f\xc6\xa9\x10\x51\xd7\x75\x5d\x4a\x60\xc7\x5d\xa7\xc2\x26\xbb\xca\xb7\xa7\x7d\x6c\xa9\x8b\xfd\xa3\xd7\xbc\xb9\x17\x94\x8a\x6f\xee\x6e\x1e\x3e\x5c\x9f\xb4\xff\xce\xf8\xcd\x2f\x56\xd7\xdf\x16\xcf\xab\x72\xd5\x77\xb0\x06\xfb\x29\x2b\xec\xa3\x2d\x4c\xa5\x2c\x24\x90\x43\x84\xaa\xc7\x70\x20\x49\x87\x39\xd7\x8f\x1b\x20\x1c\x10\x71\x9e\x2c\x3f\x76\xce\xef\x14\xa8\x5c\xdc\xaf\x0d\x21\x75\x44\x4c\xf1\x28\xfb\xca\x57\x1c\x64\x05\x57\x5b\xc6\x3a\xc6\x26\x2a\xa5\x7b\xca\x6c\xf0\xa0\x8a\x04\xf4\xc7\x60\xba\x43\xb6\x4e\xbc\xf0\x6d\x1e\x12\x63\xc4\xdd\x29\xe3\x70\x42\x2a\x5d\xb8\x85\xdf\x71\x1c\x3f\xfe\x94\x67\xd9\x03\x9a\x60\x56\x94\xd6\x95\x96\x27\xc7\x51\xc3\xcd\xb8\xf8\x85\xb4\x3b\xfc\x84\x63\x99\x23\xad\xa3\xf1\x65\x55\x43\x6c\x3d\x21\x84\x56\xb6\x6e\x4c\x08\x41\x19\x13\x6d\x28\x2b\x8a\x4d\x20\x04\x93\xca\x56\xad\xf1\xa9\x20\xbb\x4e\x7d\x95\xf3\x5a\xbc\xcd\xfe\x2c\x79\x29\x7f\x99\x76\xfd\xcf\xd8\x82\xcf\x78\xe7\x37\x77\x89\x3b\x7a\xbe\xe6\xbd\xf1\x4c\x1f\x9c\x92\x78\x1f\xde\xde\x7d\xfb\xee\xfe\xee\xab\xb7\x0f\x1f\xde\x17\x1f\xef\xbe\x7a\x7b\xff\xed\xbb\xfb\xf5\x75\x11\x80\x0b\x89\xb6\xc2\x46\x0b\x76\x9f\x3a\xb0\x8d\x0d\x90\xd1\xe0\x42\x95\xda\x54\x52\x55\x52\x61\x59\x6b\x02\xe1\x94\xc1\x4a\xa8\xca\x02\x48\xb9\x05\x90\x91\xa6\xac\xcb\x78\xa0\xc8\x11\xda\x95\xd5\xba\x52\xca\xcd\xcf\xcb\xfc\x65\x6a\x82\x77\xad\x0d\xa6\x72\x25\xa5\x3e\x38\xef\x05\xe7\x42\xf0\x88\xda\xf9\x9b\xe0\x0b\xdf\x56\x76\xe2\x92\xfc\xc7\xcf\x99\xd7\x1f\xe2\x92\xcc\x5f\xa8\x24\xbf\xba\x84\xba\x7e\x78\x66\x93\xfc\xf6\xfd\x42\x27\x79\x7d\x41\x26\x69\x9f\xb2\x12\x52\xe8\x49\x83\x50\x55\xdb\x2a\x18\xaa\x83\x18\x0d\xae\xa6\xbd\x47\x16\xee\x2a\x83\x91\x86\xb5\x93\xb4\x21\x5c\x22\xa8\x84\xe3\x79\x5b\xba\x32\x1a\x52\x1b\x9a\x4b\xc9\x05\x97\x53\x3a\xb1\x56\xd2\x25\xb5\x18\x90\x55\x51\xc4\x4d\xdc\xda\xc4\x25\x89\x1b\x6b\xbb\x0d\x30\x79\xb9\x50\x49\x1e\x37\x18\x73\x08\x4b\x4b\x12\x99\xa4\x50\x11\x45\xc7\x81\x01\x43\x1e\x7c\x88\xdb\x47\x6c\x5c\x7b\xe5\x29\x57\x82\x46\xee\xb2\x2c\x03\x45\xfd\xc4\xae\x8e\x89\x2b\x70\xe9\x59\x5e\x02\xfa\x2b\x19\x88\xf4\x08\xa9\xed\xda\xc0\xc3\xf6\xb7\xfd\x15\x26\xd8\x00\x9c\x7c\x99\x2b\x9f\x6a\xa7\x24\xfb\x2f\x12\x47\xee\x7c\x56\x2e\x3d\xf3\x1f\xef\x12\x0d\x57\x12\xed\x7c\xae\x15\xbe\x30\xa6\xaf\xaa\xbc\xac\x9b\xa9\x02\x7d\x55\x46\x5f\x07\x08\x86\xc3\xbc\x1d\x88\x2d\x1b\xb5\xdc\x89\x3d\x8d\x3b\x30\xc7\x64\x46\xae\x89\x41\x83\xf7\xd2\x44\x8d\xb5\x3f\x84\xb8\x55\x5e\x83\x6a\xdf\xb8\xf6\x18\x0e\x92\xcb\x26\x4b\x5c\xd6\xe5\xeb\xd8\x66\xd1\xca\xfd\x3c\xb6\xb9\x7b\x15\x38\x2c\xb1\x0d\x2e\x6a\x4e\x2c\x85\x71\x57\x62\x80\x40\x46\xe7\xd0\xa6\x9d\xe3\x83\x03\x7e\xca\x88\x56\xcd\xd4\x2e\xb1\xcd\x38\xc7\x36\x10\xc0\xb5\x43\xd6\x56\x1d\xe7\x42\x5a\x29\xad\x0f\xb2\xc7\x56\x02\x69\x94\xee\x76\xa6\xd1\xcd\xec\x5a\x36\x32\xa8\x25\xee\xf2\x85\xba\xe6\x6b\x9f\x14\x6c\xff\xe8\x47\xe2\xae\x2f\xbf\x33\xb8\xb6\xa9\xea\xa2\xc2\xc2\xd2\x3a\x6e\x4b\x34\x07\x5e\xb3\x17\x3e\x07\x5e\x02\xec\xf0\x81\x73\x1d\xa6\xee\x65\x70\x87\x1a\xc0\xb5\x87\x04\x3b\x63\x39\x17\x8a\x0b\xe3\xbd\x70\xd8\x31\x50\x97\x8a\x1b\xdf\x4b\x6b\x9c\x8c\x7b\x67\x79\xe0\x59\x96\x17\xfd\x93\x39\x9d\x19\x9f\xf5\x53\x9d\xda\x16\xee\x57\xcf\x9d\x54\x0b\xed\x41\xd1\x8f\x01\xa0\xd0\xf7\x21\x6e\xc3\x98\xd7\x14\x02\x35\xa1\xbc\x7f\xec\x35\x18\x21\x5e\xb5\xdb\xed\x76\xeb\x9f\xb2\xd4\x2e\x90\x6d\xb5\x0b\x93\x0c\x05\x09\x4a\xa6\x33\x6a\x48\xb8\x03\x96\xad\xb2\x2f\x13\x9f\xce\xc2\x1a\xf4\x50\x15\xcf\x98\xb2\x37\x5f\x9c\x29\x94\xde\xad\xb2\xa0\xbc\xf4\x60\x1f\x6c\x67\xbc\x70\x26\xee\x39\xc0\x56\x4e\x22\x68\x51\xdb\x8e\xad\x59\x3c\xc4\x9e\x00\x0e\x4a\xfc\xa8\xe3\x66\x77\xe4\xe3\xb0\xef\xfd\x08\x34\x40\xb9\xf9\xa4\xb9\xf0\x56\xf3\xac\xb8\x3a\x26\xae\x8d\x73\x8f\xf0\x6b\xb6\x87\x13\xc7\xe7\x82\xac\xbf\xb9\xbf\xd6\x8c\x12\x09\x15\x42\x7d\xd9\xba\xce\xf5\x7d\xdf\xaf\xf9\x6f\x46\x2e\x2a\x5f\x61\xb0\x8b\x74\x8e\x8e\x4a\x70\x2c\xc6\x08\x81\x78\x1c\x17\xce\x9e\xbc\x10\x27\xad\xa8\xaf\x92\x7e\xd5\xa9\x27\xea\xb9\x92\xb1\x00\x48\xbe\x79\x69\x95\x4a\x47\xd4\xf2\x6a\xe1\x7a\xef\xbd\xe2\x0a\x21\x4f\xa8\x0e\xa4\xc9\xcb\xe0\x3b\x2f\xac\xe0\xdc\x73\x21\x03\x37\x57\x07\xe0\xa2\x71\xa1\x69\xac\x91\x8f\x22\xdf\xc6\x71\x54\xa0\xc9\x99\x05\x3e\x6a\x37\x0d\x4f\x59\xdb\x02\xf3\xd8\x16\x3c\xb6\xa3\x05\x32\xaf\xb2\xbc\xd8\x9e\x6a\x96\x7f\x90\x9e\x8a\x87\x0f\xef\xcf\x28\xd8\x17\xe2\x88\xf9\xfc\xff\xf0\xe6\x3e\x11\x28\x9e\x0a\xd2\xc5\xfe\x50\x7a\xc0\x2a\x0c\xab\xd2\x95\xcc\x3a\xd6\xd5\x71\xcb\x77\xf5\xbe\x04\x26\x29\xa6\x85\xe8\x56\x5e\xd9\xfd\xd4\xa2\x1a\x0f\xf5\x41\x51\x01\xf6\x11\x6e\xfc\x3c\x84\x44\x85\xe0\x63\x09\x8e\xa9\x6e\x4a\x12\x16\x8b\xa6\xce\xe1\x6f\x52\xad\xe7\xa2\x3b\x7b\xe9\xcc\x4e\x75\xab\xbb\xf7\x4b\xe9\xe1\xfe\xb6\xba\x7e\xf7\xe1\xbf\x01\xf7\xf3\x48\x7f\x0d\x6e\x52\xf9\x8a\xac\x44\xc4\x40\xfb\x47\x1b\x80\x8e\x34\x3f\xb6\x31\x14\x96\xe2\x46\xb6\x1b\xd3\x6f\xf3\x06\x0b\xf1\x68\xe7\x23\x7e\x4d\xfd\xf0\x5b\xa1\xd4\xaa\x1d\x86\x61\x78\xb4\x5d\x29\x14\x70\x63\xdc\x77\x32\x6c\xc6\x18\x20\x04\xed\xa7\x5d\xb3\xe0\x6a\xe5\x13\xbb\x6a\xd7\xfa\xe4\x67\xfc\xf9\x8f\xf9\x19\x77\xdf\xf1\x33\x5e\x57\xa9\xee\xf2\xaa\xad\x21\x68\x26\x9c\x44\xab\x44\x29\x35\x62\xb5\x80\xa8\xae\x1e\x1b\x00\x51\x7b\x6a\x68\x2d\x01\x0b\x80\xc4\x71\xf4\xd2\xd8\x60\xbc\xde\xb8\xb8\x5d\x6b\x44\x70\xcc\x98\x66\x91\x77\x0b\x6d\x6d\x61\xd8\x20\xc4\xc0\xf9\x84\x94\x72\xd0\x5a\xe7\x54\xec\x01\xef\xb4\x71\x9b\x2c\x2b\x33\xf9\x44\xae\xb6\x6b\x9b\x7d\x9d\xfd\xf3\xec\x7f\xcc\xfe\x4d\xf6\xef\xb3\xff\x39\x93\xd9\xff\x7d\xd6\x32\xff\xac\xa1\x6b\xe9\xc2\xfe\x6b\x37\x80\x7d\x16\x61\x5f\x16\xd7\x40\x06\xa1\x94\xf8\xd4\x63\x18\xa4\x82\x4a\x50\x0c\x83\x72\xd0\x1f\x72\x49\xa0\x12\xa2\xd6\xa3\xac\xa1\x64\x48\x95\x15\x71\x5d\xb7\xf5\x84\x40\x2d\xe9\x54\x16\xfe\x51\xfb\xc5\xf9\x5a\xae\x86\x77\x1b\x36\xe4\xa8\x0b\xb2\xe9\x56\x96\x20\x66\x03\x24\xc4\x7b\xad\x4d\xa0\x8a\x61\x7a\x1c\xac\x12\xd6\xe8\xfd\x60\xa4\xb0\xc6\x52\xcc\x74\x80\x08\x19\xa3\xad\x69\x61\xad\x08\xa2\x62\xc2\x79\x26\xe3\x76\xfe\xdc\x2b\xc3\x1c\x56\x89\x56\x2d\xfb\x79\xc6\x9f\xf8\x8a\xad\x65\xea\xa9\xf9\xfd\x93\xa2\xf8\x87\xe4\x9f\xfd\x65\xe2\x90\xfe\x8f\xd9\xff\xb7\x28\x96\x7f\x73\xd2\x57\x7b\xde\x04\x6f\xee\x6f\x56\x17\xbc\xd9\x60\x29\xcc\xce\xcf\xee\x2f\x16\xbc\xec\xdf\x03\x8b\x87\x7d\x7b\xfd\xf0\xfe\xfe\xf6\xcb\x6f\xce\x89\xe0\x93\x15\x13\x77\xc2\xc7\x87\xb3\x40\xd5\x05\x14\x73\x48\x15\x1f\x9a\xd7\xd3\x9e\xba\xbd\xbb\xa2\xee\xe0\xe2\x88\x6a\x55\xa3\xbc\x9f\xbf\xc1\x04\x3a\x21\x8f\x1c\x4a\xa3\xc1\xa6\xac\x7c\x5d\x95\x9d\xeb\xca\xbe\x03\xa4\x73\xed\xe4\x9c\x46\x43\x4b\x1d\xa8\xe1\xbc\x85\xb8\x41\x38\xe8\x4b\xb1\xf5\x62\x2d\xad\xb5\x3c\xda\xc4\xe3\x61\xa3\x07\x59\x3c\x02\xd3\x51\x8e\x38\x45\x94\x61\x4e\xe3\xd1\xa8\x38\x07\xd3\x1c\x40\xa0\x80\xab\x6b\x8c\xf1\x4e\x29\xa5\xb6\x8a\xd4\x7c\xfe\x21\xe2\x80\x90\x66\x88\x81\x4e\xea\x8d\x46\x4c\x31\x22\x30\x51\xa8\xe5\x24\xe9\xaa\xfc\x2c\x63\x4f\x64\x85\x4e\x7c\xa5\xe8\xd9\xa2\xff\x3c\xe3\xd9\xbf\x3f\xe9\x2b\x3f\xfb\x8a\xef\x53\xb4\xb7\xba\xb4\xc4\x73\xfb\xfc\xc3\xcd\x09\x5e\xf5\x3e\x51\x50\xdd\xdc\x7d\x7c\xb8\xb9\xbf\x84\x49\x9f\xe9\xcd\x6f\xaf\xff\xec\x9d\x3a\x86\xf9\x31\x82\x71\x37\xb9\x63\xbe\x8d\x3d\x18\x1c\xa3\x42\x5a\x84\xea\xd2\x54\x54\x6b\x3a\x71\xe7\x28\x25\x8a\x37\x4d\xa2\x9b\xb6\xc6\x80\x83\xe1\x8e\x9a\xa9\x34\x58\x3a\x9d\xb7\xac\xf6\x35\x0d\x34\xe0\x39\x7c\xf4\xde\x1f\x0e\x5a\xeb\x71\xc0\x54\x73\x7a\x20\xc8\xe0\x8e\x51\x95\xf3\xa9\x34\xb0\xb6\x10\x6e\x9d\x9b\xb0\x01\xbb\x49\xb5\x23\x1b\x7b\x4c\xf7\x41\xb4\x7d\xd7\xa3\xb1\x2d\xbb\xbe\xde\xa4\x38\x6c\x7e\x2e\xd1\x55\xb3\xf6\xd9\x17\xdf\xcd\x66\x26\xbe\xbe\x93\x77\x3f\xdf\x17\x1f\x56\xaf\xd9\x27\x16\xed\x06\xf0\xd9\x43\x77\x69\x84\x3c\x93\xbe\xe7\x14\x6b\x4e\x4c\x55\x5b\xcb\xb6\x00\xe7\x15\x67\x98\xcd\x31\x8d\xa9\x5b\xa6\x2b\x13\x51\xd1\x3c\xca\x90\xab\xe9\xf9\x02\x9b\x4d\x47\x87\xf1\x29\xa3\xfd\x48\x36\x6b\xaf\x39\x8c\xbb\x79\x65\xdb\x91\x51\x2a\x08\x03\x47\x54\x46\xce\x59\x65\x2b\x04\x60\x74\xc2\x32\x50\xc6\xec\xb1\xcb\x85\x8e\x6d\xfa\x3c\x10\x1e\x14\x35\x46\x61\x8f\xb2\xeb\x4c\x3f\xd1\xab\x21\x61\xaf\xcf\xf8\xc5\xff\xfa\x25\xd2\xf9\x2c\x86\xfe\x8c\x2b\xe2\xcd\x82\x33\x4c\x18\x99\x53\x3e\xe4\xeb\x8f\xf7\xb7\xf7\x37\x89\xe2\xf2\x4e\x83\x2c\x80\xac\x01\x75\xdc\x37\x4f\x59\x78\xca\x68\x31\x3e\x92\xc6\x5a\x50\x5a\x67\xc7\x10\x03\xa2\xa0\xdf\xc7\x4a\xf5\x8e\xcf\x77\x23\xc8\xcc\x21\x00\xa6\xb8\xe1\xd1\xaf\x33\xad\xb5\x76\x4a\x49\xe9\x23\x37\xf3\x29\x30\x44\x1d\x37\x1d\x67\x36\x3a\xef\x30\x95\x02\x41\x13\xda\x0e\xe0\x28\x85\xe4\x7a\x59\x37\xf5\x44\x56\xd5\x1a\x27\xe5\xce\x5f\x64\x7f\x98\x7d\xc8\xfe\x65\xf6\x6f\xb3\xff\x98\xf6\x84\xfb\x9b\x0f\x0f\x6f\xaf\x17\x00\xe0\xc7\x9b\xfb\xb7\x67\x6d\xf0\xf9\x6e\x5d\xc6\xfc\x3e\x01\x68\x2e\x09\xaf\xdf\x9c\x42\xd0\x54\x5d\x7f\x41\xdd\x2c\xa9\xcb\xb4\x91\x7e\xed\x72\x89\x61\x5d\x31\x3f\x6c\x6b\x46\x12\xb3\x85\x96\x1b\xb0\xd5\x8a\xc0\xd8\x83\xbd\xc4\x7c\xfe\x10\x96\x28\xa6\x14\x0c\x4d\x4f\xc1\x1e\x10\x19\x7a\xa7\x84\xe4\x42\x4b\xd9\x4d\xad\xb4\x5e\x86\xbd\x6c\xf6\x02\x64\x6b\xec\x63\x59\xea\x4a\x73\x04\x6d\x99\x73\xa5\x62\xaf\x63\xa8\x2b\x09\x14\x57\xd6\x39\x57\xc6\x03\x17\xd2\x48\xa1\x99\xa5\x52\x8a\xc7\x2a\x8a\x7c\x40\xc8\x73\xa7\x38\x69\x38\x57\x52\x31\x2e\x4d\x07\x98\x0c\x42\x2a\xac\x77\xc6\xba\xec\x2a\x13\x27\x8c\xce\xa2\x42\xf0\x57\xcf\xc8\xba\x05\xe2\x78\xa9\xf3\xf0\x2a\xc3\xb3\xfc\xf7\xaa\xd3\xfd\x39\x6a\x9c\xdf\x9e\x67\x61\x3e\xd3\x3f\x19\xa0\xf2\x60\xa5\xd2\xe6\x71\x23\xa9\x25\x2a\x57\x61\x88\xf3\xd6\xd4\x44\x0d\x0e\x51\x81\x10\x09\xc8\x20\xb6\x0c\x1f\x29\x6c\x6a\x72\x3c\x11\xb6\x66\x91\x6f\x7a\xd5\xad\xcd\x22\x95\xea\x1c\x50\xac\x11\x52\x69\x6d\xb8\xd5\xbf\xf5\xb1\x49\x64\x09\xbe\x73\xde\x78\x87\x51\x0a\x02\x31\x66\xe9\x7f\x8d\x37\x0b\x5e\x2a\x33\x4f\x3c\x71\xf8\xce\xcf\xec\x72\x26\x64\x9f\x75\xe8\xbf\x68\xc6\x3c\x77\x40\x24\xb1\xab\xbb\x0b\x1f\xe6\xb2\xcf\xfa\xee\xf6\xcb\x5f\x83\xd9\x5d\xb8\x73\x7b\x4c\x8c\xa0\x07\x86\x3c\xc2\xc7\x38\x3b\x00\xba\x02\x87\x88\x37\x9d\xee\x36\x2a\x6e\x15\xc0\x2c\x6a\x30\x56\x51\x02\x1c\xdb\x1c\x89\x78\xcc\x7d\xc3\x98\x84\x8e\x73\x68\xc0\x01\x99\x44\xb4\xaa\x57\x2d\xa5\x4c\x2a\xad\xb0\x64\x5e\x4e\xa5\xf1\xda\xe9\x46\x37\xd2\x09\xe3\x09\xcd\x8f\x52\x4a\x19\x39\x27\x54\x76\x5c\x61\x45\xa1\x8c\x15\xcf\x56\x19\x7f\x62\x57\xcd\x5a\x64\x7f\x27\xab\x13\x17\xca\xaf\x97\x8e\xd2\x67\x2e\xdc\xbb\xc5\x4b\x58\xbd\xfb\xf8\xfe\xfe\x9b\xbb\x9b\x53\xfb\xf8\x45\x25\x7b\x8e\xde\xe6\xa7\x78\xd9\x8f\x0e\x05\x7b\xec\xf3\x6e\xb2\xb9\x9d\xb8\x04\xdb\x26\x54\xdb\xa7\x0c\xf6\x4d\x5e\x83\x8d\xef\x7b\xae\x39\x85\x42\xa0\x29\x2b\xb2\xd6\x6e\x36\x91\x49\x1a\xb0\x58\x8b\xa9\x77\xd2\xc8\xe9\xe0\x7c\x6d\x09\xf2\xb0\x75\x91\x6a\xbf\x37\xa2\x6c\x2b\x3e\x7a\xed\xba\xa9\x55\x46\x18\x9d\xfd\x9d\x8c\x3d\xd1\x74\xcf\x2d\x55\x92\x3f\xbd\x60\xef\x98\x9f\xcd\x0c\x2c\x7d\x5e\x4b\xde\x6a\xbe\x11\x7f\x9e\xdf\xbf\x4b\x4a\x1b\xb7\x69\x83\x49\x40\xdc\xe7\xd3\x78\x76\x74\xee\xe7\xe0\xbc\xf8\x31\xaf\x66\x13\x7b\xc0\x7c\xeb\x53\x27\xa7\x2b\x09\x1d\x2b\xc5\x60\x19\x8f\x3e\xee\xcd\x56\x58\xd1\x73\xd0\xb6\xbe\x8b\x43\x57\xd6\x2d\xac\x42\x45\x8b\xfe\x91\x85\x79\x6d\xce\x97\x32\xdd\x51\xee\x72\xb8\xd9\xd0\x71\x58\x09\x69\x18\x63\x2c\x76\xa2\xd3\x50\x43\xd2\xf7\x5e\x1a\x42\x01\x93\x69\xa9\x36\x02\x23\x84\x45\x0c\x13\x05\x47\x1e\x0f\xf3\xe7\x4e\x28\xe6\x10\x47\xcc\x71\x9c\x65\xeb\xd4\xd7\xdd\xaf\x71\xf2\xa0\xff\x24\xfb\xaf\xd2\x89\x92\xbd\xb9\xcc\xbf\x9c\x9e\x45\x70\x7d\x97\xaf\xff\x04\xbc\x4b\x3e\xeb\x9b\x87\xeb\xbb\x5b\x70\xa1\x0a\x72\x71\x90\xbe\x73\x57\x30\xd2\x94\x7f\x1e\x3f\x0d\xde\x0f\xe9\xe1\x2a\x38\x74\x2e\xd4\x0d\x23\xf5\xa3\xf3\x2d\xcc\x37\xf1\x48\x90\x46\x44\x10\x64\x21\x89\xd6\x43\xe6\x18\x90\xa8\x72\x25\x5e\x63\x6f\x5d\xf0\x3e\x49\x91\x37\x8f\x1b\x13\xf1\x2e\x18\x00\xc1\x56\xda\xb8\x91\x8a\x18\x01\xb5\x27\xde\xc0\x7a\xd7\x93\x76\x68\x5a\xd4\x35\x8b\x36\x96\x7e\x62\x57\xc3\xda\x67\xdf\x3c\xf3\xf2\xa4\xf9\x9c\x5a\x8f\xd6\xd7\x1f\x3e\xa6\x0e\xaf\x57\x08\x9d\x8f\xeb\xd7\xe0\xcf\x0b\x16\x96\xd5\xc3\xfb\x7b\x03\x06\xdc\x20\x08\xc6\x69\x9c\x1f\x7d\x46\x9b\xfd\x71\x7f\x94\xd6\x09\x57\xc3\xa8\x22\x46\x9b\xde\x5a\xe4\x75\x6c\x8b\x67\x2a\x41\x7f\x4c\x4c\x82\xfe\x78\x5c\xed\x0d\xe6\xc2\x05\x59\x41\xca\x71\xdc\x79\x48\x2c\xef\x46\x4e\xa9\x80\x46\xb8\xba\xd4\xb2\x9d\xe0\xe3\xa8\x54\x41\xe2\xce\x7b\x1f\x79\xca\xbc\x16\x99\x7d\x62\x57\x76\xad\x4f\x35\xac\x74\xca\x9f\x22\xe6\xcb\xba\xcb\xed\xb9\x1c\x9c\x4e\x90\x17\xe2\xcf\xf5\xf5\x3b\x58\x9c\x4b\xc3\x19\xef\x93\x8e\x23\x18\x94\x46\x14\x0a\x4c\xe3\x96\x57\xb5\xa5\xb5\xab\x86\x5d\xdd\xc7\x63\x00\x4d\xf4\x40\x77\x23\x06\xc3\x7e\xb3\x01\x6a\xbb\xd6\x0e\x43\x17\x6b\x3f\xe9\x05\x12\x05\xb6\xbb\x8a\x10\xd8\x76\x48\x11\x14\x20\xc8\x26\x5a\x70\x0f\xf6\xa6\x2a\xfd\xd4\x8f\xe3\x98\x72\xc5\xed\x0a\xaf\xcb\xac\xca\xbe\x4c\x0c\x1e\x37\x77\x37\x29\x31\xf9\xc5\x9b\x34\xc0\x9b\xb7\x37\x0f\x37\xc5\xcd\xc3\xcd\x2a\x8b\xde\x28\x4c\xad\xa6\x06\x86\x81\xfa\xdd\x6e\xb7\x2e\x1f\xd5\xb4\x27\x24\x38\xf2\x94\xc5\x0d\xf1\x82\xd1\x35\x74\x73\xbc\x1f\xcd\xfc\x35\xcb\x73\x93\xb8\xfb\x4c\xf6\x26\x69\x8c\xce\x7e\xcf\xc7\x0f\x37\x0f\x55\xe2\x40\x78\x73\xfd\xee\xe6\xeb\xd5\xe2\x5c\xbf\x58\xe8\xca\x99\x61\xdf\x56\x81\xee\x5b\x79\x94\x1b\x06\xaa\xa2\x3a\x86\x1c\x71\x46\xe7\x60\x1c\xaf\x8d\x55\xf8\xd1\x53\x95\xdb\x49\x44\x1f\x7b\x65\x03\xa8\x18\xbf\xe2\xc4\xff\x66\xb3\x1e\x3e\x61\x21\xaa\x50\x2d\x79\xa9\xd9\xd7\x2f\xec\x5a\x65\x7f\x70\xd6\x5c\xfb\x6e\xbc\x76\xff\xfe\xee\xfd\xf5\x3b\xf8\xe6\xfe\xb9\x6f\x6b\x71\xd6\xf3\x03\x53\x76\x76\x3d\x5a\x23\x84\x0e\x32\xa8\x46\xef\x01\x39\x10\x80\x6d\x57\x2a\xa5\x24\x03\x5b\xc6\xa0\x35\x6c\xad\x1c\xaa\x3b\x87\xa4\x75\x5a\xc4\x03\x60\xbd\xb5\x7a\xeb\x42\xe5\x3f\x8d\xb1\x3d\x62\x4b\xe7\xd5\xcc\x30\xd2\x8a\xb2\x94\x6b\x0c\x27\x4e\xc3\x2a\xfb\xe5\x49\x27\xe3\x73\x3b\x5c\x2e\xc5\xb7\x2f\x6b\x71\xfb\xf0\x7e\xbd\x73\x1e\xb4\x8c\x41\x0c\x49\x85\x62\x88\x9d\xe2\x90\x58\x49\x5c\x59\xd9\x96\xfa\x71\x1c\x57\x26\x99\x02\x2d\xb9\x8a\xab\xe1\x51\x4d\x07\xfc\xbc\x50\x8c\x72\xc6\xd6\xf5\x52\x4c\xd0\xc7\x63\x96\xa7\xfe\x39\xb3\x36\xd9\x6d\xf6\xed\xb3\x7f\xfa\xb2\x50\x8b\x8b\xfa\x9d\x95\x3a\xea\x30\x30\x52\x7b\xd2\x7b\x31\x32\x2e\xd9\x2e\xf7\x6d\x00\x1b\xc6\x30\x85\x0c\xa2\xb5\x31\x1a\x3f\x7a\x88\x54\x6e\x26\x1d\x55\x1c\x95\x09\x00\x22\x34\x2f\x96\xfb\xcd\xf8\x6a\xb1\x16\xde\xba\xc5\x26\x4b\x35\xfc\xc7\x6d\x72\x32\xc9\xdd\x0d\xb8\xbd\x7b\xbf\xde\x8d\x01\x1c\x18\xc3\xbc\xe6\x10\x45\x1c\xb5\xd3\x98\x59\xcb\x1d\x6a\x36\xd4\x2f\x49\xa8\xef\x31\xca\xeb\xbb\xf7\x95\x4d\xae\x12\xdf\xd9\x5f\x7b\x3c\xe7\x25\xea\x1c\x18\x19\x43\x14\xb2\x1a\x45\x19\x9d\x95\x98\x58\xc5\x2c\xf2\x3d\xf3\xfb\xfd\xfe\x27\x07\x33\x3f\x4a\xcf\x83\x49\x78\xab\xed\x69\x8d\xbe\x4c\xdd\x04\x9f\xaf\xd1\xf7\x3f\x4c\x83\xe9\xb6\x9c\xc0\xc0\x36\x8d\xdc\xc9\x81\x81\x2c\xdf\x6c\x43\x5e\x72\x46\x38\x14\x08\x9d\x9e\x26\x08\x65\xee\x26\x33\x2f\x91\xb6\x1e\xd4\xdf\xf3\x38\x15\xa9\x2f\xea\xb8\x56\x29\x5e\xfe\xfb\x3f\xf4\x34\xcd\xe7\x70\xda\xca\xde\xe6\xe0\xdd\x87\xe7\x14\x5e\xa1\xb8\x0d\x80\xc7\x6e\xf4\x52\xf9\xc6\x8c\x6a\xb4\x71\x0f\x8c\x6f\x30\x50\x5d\x43\xe2\x41\xee\x01\x3b\xa7\xf3\x94\x47\x75\xeb\xe1\xfc\x38\xc9\xb8\x5f\x18\xae\x06\xef\xab\x32\x3c\xaa\x3a\x96\x4f\x99\x3d\x02\x17\x2b\x4c\x3c\x4f\xcf\x53\xe2\x3b\x29\x36\x69\x6c\xbf\xfa\xb1\xe7\x7c\x1e\x19\x78\x56\xba\xb9\xad\x8a\x77\x1f\x6e\xde\x17\x35\xd3\x1e\xe0\xb8\xe9\xad\x14\xd6\x9b\xa0\x5a\x73\x04\xdc\x78\x0c\x28\xe0\x08\x09\x66\xf5\xbe\x77\xed\x5a\x59\x5c\x77\x1e\x4a\xe3\xd3\xb0\xc4\xc6\x58\xbd\x59\x86\x25\x23\xc1\x84\x3b\x2b\xc1\x96\xc7\x4d\xdc\xcb\x1d\x28\x37\xcb\xfe\x73\x55\xa5\x71\xfd\xe0\xfe\x73\xb6\xd8\xc5\x06\xf4\xd3\x26\x0b\xfb\xd2\x58\x65\x79\x5e\x0d\xb0\x71\x3f\x66\xb1\x4f\x9b\x79\x07\x72\x74\x07\xe4\x74\x94\xcb\x06\xb4\xca\xdb\x27\x75\x3d\xa4\xba\xda\xdd\xd9\x8b\x00\x77\x67\xe2\xb6\x67\x82\xfc\xd7\x6a\x61\xff\x10\xfc\x08\xd3\x5d\x11\xc0\xc8\x70\xd4\xd2\xaa\x83\xf1\x10\x81\x1d\x21\xa0\x7c\x94\x45\x99\xc0\x33\x25\x08\x46\x4a\xa9\xb7\x81\x5a\x4f\x4a\x5f\xc9\xc3\x41\xe5\x7b\x2b\x1c\xb3\x8f\x8d\xaf\xb9\x17\x57\x2d\x97\x92\xab\xb0\x41\x94\x18\xc5\x27\xe4\x3a\x1b\x26\xcd\xa5\x31\x9c\xc6\x01\xd5\x48\xe3\x86\x53\x01\x64\x68\x79\xdb\x60\xb8\xeb\x79\x37\xef\x1b\x36\xe5\x36\x6d\xb6\x4a\xfa\x95\xff\xfa\x45\x23\xe6\xee\x8b\x37\x67\x8d\x98\xa5\x7a\xf3\x3b\x69\xc4\x7c\xf8\x3e\x91\x98\x8a\x11\x41\xf8\x2e\x1e\xca\x9a\x20\xcf\x2c\x42\x55\xe9\x2a\x6f\x08\x13\xca\x0a\x52\x4e\xdd\xe0\xc7\xf1\x30\x50\x9e\xf4\x43\xe1\xb1\x71\x82\xe6\x5b\x3f\x59\x53\x71\xcd\xc0\x88\x92\x4c\x8c\xa5\x54\x30\xd6\xfa\xe8\xe3\x71\x73\xa8\x23\x8f\x5d\xdc\x69\x0d\xa3\x3b\x06\x2d\x87\x1d\xd0\x39\x8b\xf5\x77\x84\x62\xea\xe8\xf9\x1e\x48\x90\x2d\x4a\x31\x70\x37\xd0\xe1\xac\x14\xb3\x68\x2e\x75\xa9\x77\xfb\xf7\xb3\xdb\x05\x9b\x76\xee\xdd\xbe\x74\x68\xdf\xce\x4e\xc7\xf5\x57\x17\x3d\x35\xd7\xcf\xf2\x04\x0b\xc9\xe7\x33\x12\xfc\x5d\x81\x40\x5b\xa3\x80\x21\x38\x7c\x1a\xb6\xd6\xf4\xba\xcd\x37\xde\x69\xd3\x54\xde\x6b\xee\x30\x36\x42\x6b\xab\x07\x1e\x4d\xa8\x39\x37\x0a\xf5\x0d\xd3\x42\xee\xc6\x1d\xda\xf8\xe0\xec\x66\x63\x56\x03\xa7\x58\x28\x5f\xb1\xae\xd5\xbe\xb1\xad\x6e\x9b\xd1\x8d\xda\xc0\xce\x0a\xa5\xad\xe8\x51\xa3\xf3\xbe\xb4\x32\x2a\x8c\xad\x24\x1c\x28\x89\xad\x06\x59\x65\x3d\x40\x38\x1e\x54\x8d\x13\x77\xdf\x15\x38\xbe\x9a\xe3\x5f\x7d\xce\xa2\x7e\x9e\xe3\xed\x09\x70\x71\x31\xc9\xf5\xfd\xab\x59\x7e\xfd\xe6\x12\xf0\x9e\x9b\x1c\x42\xdc\x12\x94\x57\x9f\x6a\x50\x5b\xbf\xd5\x9b\x02\x36\x8d\xf1\x7d\xd7\x6a\x8c\x3b\xcc\x9c\x36\xde\xbb\x1d\x8f\xa4\xab\x6a\x21\xbc\x45\x9b\x9e\x07\x2b\x01\xda\x5b\x87\x0e\x4d\xe3\xc3\xfe\x48\xd9\x6a\xe0\x84\xbc\x4c\xd6\x34\xb6\x69\x06\x37\x6a\x4a\x60\xeb\xe5\x69\xb6\x26\xef\x4a\xa3\xe2\x7c\x14\xcc\xb3\xd5\x96\x5a\x0b\x60\x55\xa6\xe9\x3e\x65\xa6\x46\x8c\x2e\x5c\xa6\xa9\x4f\xfa\x99\xf7\xf9\xf7\xb3\x37\x69\xff\x48\xbc\x3f\xaf\x39\x07\xc1\xdd\xed\xdd\xe5\x74\x5f\x74\xbc\x8a\xbe\xd0\x8f\x3e\x24\xdf\x70\x1a\xd2\xb7\xc7\xed\x55\x15\x25\xa4\x8a\x3a\x61\x75\xe0\xd1\xfa\x3e\x38\xb4\x1d\xb8\x59\xe3\xc7\x3d\xd8\x0c\xc3\x30\x1d\xc7\x71\x8c\xd4\x3b\x25\xa4\xb4\xdc\xb0\x66\xc8\xcb\x69\x4f\xa9\xd3\x8c\xe7\x2e\xcb\x8b\xe6\xc9\x5f\xdb\x35\xc9\xae\x53\x0f\xf7\xc9\xc5\x05\xaf\xfa\x63\x5e\x3a\x88\xaf\xcd\x63\x5f\xf0\x47\x58\x0c\x52\xd6\x35\xe4\x38\x78\xef\x01\xf4\x6b\xe2\x7f\x6b\xfc\xba\x8d\x68\x32\x42\x94\x8e\x82\xdd\xa3\x2f\xf4\xc4\x0b\x72\x48\x5a\x3a\x3f\x4b\x5c\x94\xdd\x05\xdf\xe8\xc2\xf2\x4e\x4f\xba\x76\xa7\x4c\xd2\x37\xa7\xef\x69\x1c\xa7\xf4\xcb\xf5\xfc\x54\xa7\xc4\xe2\x39\x4f\x73\x7b\x6a\xb6\x3b\xa7\x6b\x3e\xbe\xbf\x4f\xa5\xc1\xfb\xd7\x99\x9a\xb3\x6e\xed\xfd\x2a\x80\x5d\x84\xe6\x70\x98\xd4\xfc\x83\xdd\xed\x8a\xf0\x28\x41\x5d\x57\x4f\x19\x70\x48\x10\x52\x41\x64\x7d\x53\x31\xc6\x2c\x05\xdc\xa4\x0f\x60\x75\x0d\x32\x04\x19\x97\x54\x72\xc9\x99\x66\xa8\xae\x25\x55\x10\xa1\x4a\xaf\x45\x0c\xda\xa9\xd8\x68\x1b\x7b\x13\x47\x8c\xb5\xac\x85\x8a\x65\xa5\xaa\x72\xd3\x60\x64\xab\x5c\x8a\x68\x62\xcb\x01\x02\x21\xa7\x93\xb2\xb1\x35\xb1\x81\xaa\xc0\xa8\x53\x71\xb7\x0d\xdc\x0b\xdf\x52\xc3\x3b\x61\x05\x3b\xd4\x5e\x0f\x29\x67\x71\x9d\x99\x27\x75\xed\x57\x32\xab\xb2\xdb\x67\xfe\xf5\x7f\xb4\xe8\xdd\x9f\xa5\xee\xdf\xdf\x7d\xfb\xee\x6e\x75\xf7\xf1\xee\xab\xe7\x5e\xea\x57\xf5\xfa\xa5\xe9\x04\x9c\xbf\x67\x79\x4b\x9d\xc9\x9b\x38\x50\xb0\xff\x0d\x04\xbb\x1a\xc7\x6d\x8e\x40\x4b\xa7\x2d\x8e\x74\xc5\xa7\x36\xef\x26\x5e\xd0\xe3\xbe\x20\x93\xc8\xdb\xa9\x6d\x40\x1f\x59\x2e\xc0\xf0\x69\x7f\xfe\xe9\x6a\xa4\x22\x38\xe3\x1c\x25\xc6\xd0\xa7\x2c\x96\xdc\x72\x6b\xb9\xe5\x00\x73\xce\xe3\x91\x31\x96\x65\xeb\x84\x27\xf2\x49\x23\xe1\x0f\x32\x98\xb0\x80\x34\xed\xe3\x29\x83\xf8\xed\x3b\xf0\x65\x92\x6b\xb9\xbf\x5d\xce\xcc\x5f\x80\xbb\x9b\xe2\xfe\xe6\xa1\x78\x95\x19\x7e\x38\x09\xd9\xdd\xdf\xdc\xbf\x4f\xca\xa8\x1f\xd6\x0a\xd5\xfb\xc9\x1f\x6a\x38\x0d\x25\x90\xd6\x3a\x22\x55\x07\x46\x37\x0c\xca\x5a\x30\x32\x68\x11\x05\x21\x10\x12\x0e\xe3\x18\xc6\x71\x0f\x28\x5b\x1b\xed\xbc\xd7\x62\x52\x4e\x3d\xb6\xbe\xcb\xcd\xc6\xeb\x43\x4e\x72\x3c\x39\x70\x88\xe1\x91\x81\x3e\xf7\xae\x41\x8d\x43\xb8\xf7\x3e\x1e\x7d\x84\x60\xe7\x41\xe9\xbb\x84\x25\xda\x9e\x78\x4a\xbe\xca\xfe\xc1\xa9\x7f\xf8\x85\x67\xf9\xa5\xab\xe9\xee\xfb\x5f\x3e\x0b\xc7\x2f\x85\xb1\xaf\x1e\xee\xae\xef\xe1\xb7\xa7\x26\x9d\xa5\xd7\xfd\x4a\x3b\xa6\x64\xc3\xdb\x79\x1a\x9a\x0b\x9c\x97\x8e\x2b\xd9\x88\x76\x74\x9b\x8d\x57\x92\x3d\x92\x2b\x82\x99\x45\x30\x6e\x81\x8c\x8d\x0e\xa0\xc4\xdb\xd8\x1c\x05\x13\xa6\x97\x1e\x62\x61\x22\xb9\x32\xb1\x03\xd0\x6a\xd9\xcc\x7f\xcd\x95\x9c\x5b\x16\xf7\x00\x7a\x2b\xbb\xed\xfc\x0a\x15\xc2\x89\xa7\xcc\x4a\xc5\x09\xd9\xbb\x78\xac\xbc\x34\x5e\xea\x11\x78\xe6\x8d\x43\xb9\xca\xae\x53\x8f\xab\x5f\xab\x53\x7e\x7b\xc1\xae\xfe\x8b\x67\x54\xc8\x3c\xa9\xbb\xa4\x57\x72\x42\x4b\xe5\x69\xf1\x1e\x6e\x6e\x5f\x7c\x8b\xe5\x6e\xbb\xbd\x7b\x7f\xc9\x62\xf6\xca\xb3\x10\x20\x78\xd0\x68\x1d\x25\x20\xde\xc7\xd1\xc7\x0d\xf4\xca\x7b\x80\x92\x38\x53\x0d\xf6\x51\xe5\x28\x55\x37\x2a\xa5\x19\x97\x3c\x2a\x86\x0c\xa2\x39\xa7\xd0\x41\x12\xad\x21\xcc\xf0\x75\xa6\xd4\xd1\x1f\x22\x03\xea\xb1\xca\xb3\x58\x81\x43\x6c\x1a\xdd\x82\x2d\xc8\xe2\x41\x80\xde\x29\xaf\xb5\x7e\xca\x94\x8a\x81\x38\x26\xb8\x10\x8a\x29\x11\x99\xef\x70\xef\x11\x1a\x1c\x0d\x59\xf6\xb3\xdc\xa4\x5e\x2a\xfa\xbc\x2f\xdd\x65\x1f\x52\xdf\xfc\xbf\xca\xfe\xaf\xef\x61\x43\xbe\xe8\x17\x59\x04\xc0\xbe\xf9\xbc\xe2\xf1\xbd\x4d\x34\x6f\x5e\x5a\x45\xae\x6f\xbf\xc3\xf0\x9f\x37\x57\xed\x27\xe1\x37\x1b\x20\x46\xbb\x7d\xf4\x9e\x51\xdf\x40\x6c\x15\xb1\x65\x75\x8c\x07\xa4\xaf\x6a\xd1\x6c\x8d\x21\x95\xad\xc5\xa6\x15\xae\x8d\x4a\x8a\xa4\x8e\x8c\xe3\xe0\x17\x9a\x26\x1a\x87\xe2\x28\xdb\x1d\xe4\xf3\xfb\x2a\xb9\x69\x85\x6f\xd7\x34\x32\x97\xda\xf4\x62\x87\x1d\x2b\x6b\x46\x90\xef\x11\x46\xb0\xd2\x52\x2b\x49\x39\xc5\x0e\x0e\x82\x0a\xd0\x78\x14\x37\x13\xe6\xa2\x74\x25\xe3\x71\x57\x98\xa7\xcc\xc4\x56\x69\x2d\x99\x86\x70\x7e\x9b\xa4\x02\xec\xdb\x39\xbe\xfb\x59\xbe\xff\xcc\x6e\xbf\xcc\x3e\xa6\x7a\x1b\x4f\xb5\xca\xef\xda\xed\xf7\xc1\x85\xe1\xae\x7f\x17\xc3\x7d\xde\x9c\xf6\xdd\x5e\xb6\xa2\xbc\xe2\x9f\xba\xd0\x75\x80\x34\xae\x7f\x1c\x03\x21\xa5\x31\x35\x32\x12\xd9\xb2\xdc\xec\x90\x2c\x06\xe1\x07\xa5\x70\x69\x2b\xd1\x37\xdc\xf9\xe8\x84\x40\x04\x0a\x04\x0f\xde\x1f\x0e\x87\x43\xa1\xa5\xdf\x2c\xef\xc0\x68\x7e\x4b\x78\x65\x33\xc3\xaa\xb2\xa6\x34\x19\x0d\xd6\xdf\x63\x34\x1c\xc7\xef\x37\x1a\x35\xe9\x5d\x04\x9d\x8d\xf6\xb3\x2c\x3c\xb1\x6b\xbb\x82\xcf\x36\x83\x97\x36\x5b\x14\xc7\x96\x27\x68\xde\x28\x7f\xa0\x97\x2d\xc9\x34\xa5\xc6\x24\x98\x8c\xf0\xf5\x4f\xf7\x25\xbd\x30\xe3\x3f\xdc\x7e\x3d\xae\xe5\x6f\x9a\x70\xd2\x08\x51\x1e\xf0\x4f\xb5\x67\x7c\xdc\x32\xe3\x84\xab\xab\xd8\x44\x03\x9b\xd5\x40\xf7\xb1\x67\x7e\x53\xa3\xd2\xd5\x3a\xee\x9f\x32\x1d\x40\x3d\xf5\x52\x11\x0a\x25\xa6\x11\x86\x74\xa8\xce\xd7\x2a\xb0\x7d\xec\x98\x19\x69\xe5\x6b\x1d\x77\xfb\xf9\xad\x2b\x18\xc3\x72\x8e\x3e\x65\x58\xd2\xb2\x66\xd4\x38\x02\x21\x2a\x35\x53\x86\x22\x04\xeb\x1a\x4a\xd4\x70\x22\x00\xd3\x75\x3c\x4e\x43\x62\x4d\xa7\xd5\x36\xdf\x6f\x45\xdc\x09\x63\x29\x62\x10\xa6\xa2\x24\x15\xc0\xb9\x3a\xd5\xf6\x93\xfe\x7e\x66\x9e\x75\x93\x4f\xf2\x58\xdf\x7c\x27\x13\xba\xee\x1c\xf7\xdc\xc4\x5e\xd2\x40\xc4\xe3\xc1\x2a\xad\x4d\x8e\x38\x6c\x20\x33\x29\x13\xcd\xa4\xa1\x46\x12\xe6\xb8\x12\x5c\x69\x6c\xd5\xbc\x46\x99\xbd\xb6\x6b\x75\xb1\x1f\xfc\xe4\x1a\x7d\xfb\x7d\x8b\xf4\xca\xe8\x7f\xb3\x35\xe2\xb1\x03\x07\x20\x1a\xc0\x3e\xd5\x9e\xb3\x71\x83\xb0\xf1\xd2\x57\x75\x6c\xa3\x3d\x2f\x92\x56\x23\xad\xd2\x1a\x1d\xcd\xbc\x44\xa3\x52\x98\xa5\x25\x42\x21\xd1\x1c\x25\xad\x62\xc7\x0e\xb1\x67\xae\x63\x69\x89\x0e\xc7\x79\x89\xd6\x2a\xfa\x65\x89\xe2\x11\x29\x5a\x41\x8c\xa8\x0d\x14\x21\x5c\x69\xa6\x97\x35\xc2\x0a\x35\xf3\x7d\xce\x0c\x8c\xfb\x69\xe4\xbc\xb4\x25\xa9\xb7\xf9\x6e\x2b\xe2\x9e\x5b\xc3\xe6\x25\x42\x06\xa7\x25\x0a\x01\x9e\xfd\x5d\x7e\xed\x52\xfe\x69\xe1\xb9\x9f\x3d\x98\x05\x83\xf1\xb3\x33\x7a\xf0\xe3\x17\x0b\x6c\xab\x78\xf6\xfc\xcf\x9e\xcd\x22\xf4\xf5\x76\xd1\x8e\xa9\x51\x7e\x2c\xb5\x63\xb2\xd6\x0c\x57\xa8\x9c\x24\xa1\x3a\x30\x80\x6a\xe8\x10\x04\xf5\x84\x70\x6e\x26\x57\xe6\x76\xb2\x79\x6a\x58\x4f\xba\x37\x06\x33\xfe\x29\x8b\x4d\xe5\x4a\x05\x50\xd1\x09\x26\x86\xd8\x31\x82\x98\xb4\xca\x68\xa3\x62\x63\xc0\x76\xaf\xb3\x75\x8e\x9e\xe8\xb5\x4c\x79\x98\x3f\x4c\xd9\xbb\x05\xc9\x72\x66\x04\xb9\x18\xef\xcd\xea\x47\x86\x5a\x50\x26\xcc\x56\x78\x56\x0c\xa5\x6b\x98\xac\x14\xe3\x35\xf9\xb4\x07\xb6\x86\x1e\xd7\x40\x3f\xea\x24\xac\x58\x16\xf0\x71\x57\xc0\x49\x2f\x5d\xa1\x2b\xa8\x98\x1c\xf6\x38\x7c\x2a\xa3\xab\x7d\x3d\x80\x36\xdf\x6f\x19\xc6\xdf\x1d\x67\xf7\xc4\xae\xd5\xdf\x7e\x9c\x1d\xe5\xba\x67\x9e\x16\xaa\x34\x81\xca\x4a\x51\x5a\x91\x47\x0e\x64\x0d\x2d\x86\x80\x3e\x8e\x24\x1f\x27\x52\xe6\x9b\x09\xe7\xdb\xa9\xf3\x1e\x0c\x91\xae\xa0\xe2\x62\xb3\x8c\xd3\x57\xbe\xb4\x80\x17\x7a\x4b\x09\x62\xe2\xf5\x38\xaf\x0a\x96\x30\xbe\xea\xb9\x07\xe6\x19\x71\xff\x82\x0b\xba\xad\x66\xcf\xe1\x8b\x5f\x80\xaf\xbf\x79\x7b\xb5\xba\xbd\x2b\x2e\x9b\x3d\xda\x04\x17\x07\xb5\x8f\xca\x83\x2c\xf6\x8c\x5b\x4a\x73\x08\x38\x8f\x6d\xc4\x80\x69\x10\x52\xd1\x30\x5d\x2b\xe5\x5c\xfb\x29\x28\x75\xa5\x5a\x3a\x6d\x22\xea\xa4\x07\x5d\x4e\xc0\x16\x12\x47\xea\x6e\x6a\xda\x88\x4f\x74\x04\x59\x91\x72\x80\xfd\xda\x24\xf5\xfb\x7f\xfa\xc3\xba\x59\xb7\x77\x7f\x17\x7c\x26\x92\xf5\xfe\xec\xdc\x9d\xbe\xdc\x81\x24\xaf\x75\xd2\xce\x6a\x00\xaf\x4a\x5f\x81\x21\xa2\xb2\x06\xbb\xe9\x58\xd7\x79\xe8\xb8\xd3\x9c\xc6\x23\x68\x22\x55\x31\x70\x80\x64\xec\x81\x2e\x0f\x4c\x0a\x2b\xba\x23\xaa\xfa\x5d\x5d\xc6\xb1\x28\x09\x8a\x1a\x11\xd0\x6e\x5b\xd5\x0e\xab\x3d\x63\xb5\xb1\x8c\x1a\x89\x9c\x96\x8e\x73\x25\x98\x8d\xfb\xde\xf9\xde\x22\x28\x84\x14\xc6\x3a\x47\x99\xa1\x6c\x4a\x75\xe4\x88\x6d\x6b\x7a\x9b\xe5\x99\x2f\x36\xe9\x1e\xf9\xfd\x14\xcb\x3d\xbc\x96\x44\xfc\xe6\x15\xb2\xf7\xf6\x3e\x3f\x78\x9f\x78\x33\xb6\x39\x9a\xc6\x9c\x80\x53\x9f\x4c\x3d\xed\x73\x35\x85\xb0\x36\x93\x20\x46\x1a\x61\x38\x37\xdc\x48\x43\x53\x3d\x55\xcf\x3e\xe2\x55\xf6\xbb\x6a\x58\x80\xcf\x22\x91\xa6\x28\x9b\xf9\x41\xc8\xdd\x64\x0a\xf6\xd8\x37\x8f\x63\x41\x26\x93\xbb\xc7\x23\x80\x60\x1f\xeb\xdc\x81\xfd\x27\x7f\xfe\xa9\x08\x4a\x59\x3e\x1d\xb8\xf7\xde\xf3\xbc\xe2\x71\x2b\x84\x88\x87\x39\xd0\x58\xa7\xde\x0e\xb5\x66\xa7\xfe\xfb\xa5\xdf\xe8\x19\x05\xf8\xf6\x04\xbd\xb8\x00\x01\x16\x3f\x06\x10\x54\x8c\x12\x81\x3c\xea\x2a\xee\xa5\x9f\x8f\xff\x23\xa3\x44\xd6\x12\xa1\xae\x14\x5e\x84\xf9\xa5\x35\xfb\x4d\xcb\x79\xe5\x4a\x94\x97\x11\x1f\x09\xa8\xc1\xbe\x18\x23\x06\xf4\x71\x07\x78\x2e\x2f\xfe\x94\xc6\xe3\x19\x50\x78\xfa\xe3\x85\x33\xad\x40\x09\x77\x9d\x98\xa1\x5e\xa1\x2a\xce\x9d\x07\x77\xcf\x55\xf6\x64\xb1\x0d\x70\x21\xaf\x16\xfe\xf8\x43\xa4\x1b\x50\xb2\xe8\x0f\xb1\x1e\xa2\xa4\x80\x36\x91\x80\x6d\x34\x39\xcc\xab\x53\x97\x8c\xf6\x06\x7b\xb9\xdd\x6a\xcb\xcd\xec\x02\x67\x45\x41\x9f\x78\x8a\xc7\xce\x99\x87\x65\x7f\xb8\xb9\xbb\x3d\xb3\xe6\xcc\x11\xe3\x2d\xf8\x39\xb8\xfd\xf2\xab\x5f\x83\xe5\x2c\xfa\x13\xf0\xcb\x6f\xdf\xff\xd9\x47\x70\xb7\xa2\x90\x04\x8a\x80\x9c\x60\xf0\x3e\xa9\xb6\x92\xdc\xc4\xd6\x40\xda\x08\x49\x4a\x5f\xea\xde\xed\x9c\x01\x2c\xea\x95\xd1\x12\x6b\x3f\x1d\xc7\x58\xc5\x20\x80\x06\x63\x1e\xa2\xdb\x4f\x7b\x15\x5b\x83\x6b\x82\x45\x8f\x76\x5e\x5b\x62\x92\x39\xb2\xa2\x80\x4f\x32\x8d\xad\xca\xbe\x4c\xd9\xde\xcb\xb1\x7d\xf8\xe2\xfd\xcd\x4f\x0c\x8e\xa0\x34\x38\x3d\xd5\x9d\x97\x2c\xe4\x7c\xea\xe6\xd1\x75\x06\xb1\x46\x08\x7a\x39\x3a\x95\x46\x67\xdc\x3c\x3a\x14\xbd\xd8\x02\x71\xfc\x6c\x74\x7c\x40\x3b\xaf\xdc\x32\xba\x25\xf6\xfb\x9b\xdb\xad\x46\x38\x30\x08\xcc\xe3\xb6\xf5\x4d\x2a\x24\xb3\xbc\x8d\xc1\x23\xde\x29\x45\x2b\x5f\x9a\x31\xec\x1a\x0b\x54\xa4\x2b\xa3\x05\x99\x47\xb6\x89\x30\x3a\x91\x10\xdd\xcd\x69\x64\x9d\x45\x90\x22\x3e\xa0\x6d\x38\x8f\x6c\xf6\x83\xd8\x13\xcb\xc7\xb5\x3d\xf5\x23\x7c\xb3\xa0\xa3\x2f\xef\xef\x7c\xe9\x5e\x49\xf5\xe3\x0b\xd4\x11\x6f\x30\x28\x95\xc4\xb3\x0f\x4c\xda\xbd\x00\x99\x8b\x1e\x85\x25\xe0\x5a\xae\xb5\x85\xee\xb7\xf8\x54\x76\xc4\x71\xd3\xb8\x71\xef\x0b\x1b\x87\x2e\xe2\x26\xd2\x66\xe1\xcd\xc9\xe6\x33\x5e\x64\x3f\xcb\x7e\x9e\x7d\x99\xfd\x49\xea\xf1\xbb\x39\xad\xd9\xd2\x82\x7d\x02\xd7\xbd\x22\xa7\x79\x77\x66\xdb\x5a\x9d\x80\x89\x9f\x09\x8d\x2d\x21\x62\xe3\x04\xbd\xf2\xcd\x63\x53\xc8\xa9\x6c\x02\xf6\x01\x38\xc7\x88\x20\x8e\x31\xc1\xf1\x30\xb8\x76\x83\xf7\x43\x3c\xb8\xaa\xea\x17\xdd\xa0\x21\xd2\x14\xb8\xc7\x23\xc2\xc6\x5c\x6d\xe3\x3e\xd2\xd8\xf1\x11\xd0\x7d\xae\xa2\x3d\x9a\xb6\xc6\x0a\xd7\x52\xd5\x35\xe3\x8c\x93\xf9\x5d\xcc\x71\x8a\x2c\xa4\x3b\x82\xa0\x31\xd6\xbb\x61\x70\x9e\x12\xe6\xb2\xd3\xde\xd2\xad\x5d\xf6\xf3\xec\xef\xa6\x73\x6c\xc9\xc0\xbc\x7d\x3e\x24\x96\x18\xe6\xd5\xff\x82\xb7\xa9\xb5\x33\x01\xbf\x97\x63\xf7\x45\x45\x74\x5d\x3a\x08\xd0\x96\x62\x4b\x38\xa6\xda\x45\xe4\x20\xa8\xb7\x14\x19\xcc\x09\x53\x0e\xb8\x00\x8f\xa0\x14\x4f\x59\x3c\xee\xe2\x81\x03\x2b\x12\x27\xd8\x2e\x4c\xdb\xa6\xc9\xd1\xb4\x5d\x3b\xa4\x9c\x54\xcc\x6a\xcd\xc5\xb0\x85\xca\x49\x9d\xfe\x47\x37\x4f\x19\xc6\xa3\xf4\x7a\xb7\xf7\x6e\x73\x70\x6e\x0a\x42\xe4\x2a\x9a\x45\xb3\x6b\xe1\x64\x59\xe6\xf2\x87\x29\xb6\xff\x98\x74\x87\x3f\x9f\xcb\xfa\xb3\xc9\x5c\xc0\xd8\x3f\x9f\xcd\x6a\xe7\x21\x60\x07\x86\x1d\x15\x84\xd9\x30\x1d\x43\x55\x03\x32\xbf\x40\x24\x13\xb2\x01\x63\xa8\x2b\x50\x03\x28\xe2\x2e\x6e\xb7\x71\xe4\xa0\x31\xf9\x30\xd1\x02\x85\x29\x84\x04\x5e\x4b\x13\x12\x8a\x5b\xa5\xb8\xec\x76\x90\x60\x27\x15\x5f\x66\x14\x8f\xb8\xae\xd3\x94\xb6\xe1\xf3\x29\xfd\x5e\xbe\x7b\x92\x29\x27\xf3\x82\x51\xfb\xa3\xec\x1f\x66\xef\x97\x4c\xf2\x19\x34\x72\x93\x6e\xaa\x9b\xbb\x17\x0a\x96\xe7\xb3\xe8\xbb\x11\xc3\x67\xb5\x90\x42\x82\xc6\xa7\x56\xc2\x31\x12\x1f\x09\x18\xa3\xf4\xe9\xf1\x68\x40\x35\xa1\x04\x8d\x18\x01\x89\x5e\x71\xc3\x54\x8e\x05\xf1\x84\x3f\x8e\x1e\xd3\xc0\x40\xe6\xb1\xd5\xac\xf2\xd0\x0c\x1b\xbd\x3a\x38\x17\xb5\x8f\x52\x29\xd0\x78\x67\xad\x9d\x78\x82\x19\x08\x69\x8c\x24\xdd\x86\x6e\x5b\x82\x8f\x2d\x1f\xfb\xd8\xc1\x9a\x5a\xd2\x49\x26\xe7\x38\x27\x83\x39\x5d\xed\xb3\x55\x62\x3d\xb8\x49\xd5\xfc\x44\xee\x78\x7f\x73\x7b\xf3\x70\x53\x3c\xdc\xdc\xe7\x34\x6e\x1c\x40\xcd\xfc\xb1\xda\xff\x76\x13\x56\x63\x34\xa0\x8c\xc7\x54\x6a\x9c\x24\xa8\xb2\x7c\x85\x4e\xf9\xab\xbf\x9b\xfd\xf2\x05\xbf\x7e\xf3\x90\x17\x2f\xa9\xd2\x5f\x81\x77\x29\xc7\xf6\x66\x7e\x50\x57\x72\xeb\x37\x9b\x11\x36\xc2\x4a\xcb\xa5\x97\x5e\x73\x5c\xa3\xcd\xb6\x87\x54\xd4\x2b\x0d\x12\x66\x26\x44\x19\xb7\xda\x58\xad\xad\x74\x3c\x74\x63\xef\x81\x8a\xe5\xa1\xe9\x76\xd9\x75\xbe\x4d\xfc\xfb\x2e\x8d\xfc\x8f\x2f\x58\x80\xde\x9e\x9a\x9e\x3f\x24\xa8\xce\x33\xeb\xde\x97\xeb\x57\x79\xdb\x8f\x6f\x3f\x7c\x2c\x3e\x2b\x51\x9d\x82\xfe\xe2\x82\x8e\xee\xaa\x6f\x21\xca\xf1\x63\x05\x6a\xdc\xe6\xfd\xc4\x0e\x98\x6a\x43\x2d\x04\x98\x21\x4a\x24\x21\xda\x11\x2d\x30\xe1\x06\x41\x22\xa9\x23\x72\x1b\xb0\x68\x71\xe5\x6a\x82\x0f\x83\xec\x1d\xd1\xce\x16\x83\x24\x0e\xcb\xb5\x83\x9c\x3c\xc2\x62\xc7\x1f\x45\xbe\x89\x47\xc9\x69\x33\x20\xa1\xcb\x06\x63\xa2\x28\xe6\xd8\xd5\x04\x41\xc9\x29\x9b\xbc\x76\xcc\xea\x32\x1a\x58\x53\x87\x46\x82\x28\x07\x0d\x7b\xca\x5a\x31\x6c\xfb\x2d\x1b\x87\x2c\xbb\x4e\x1c\x68\x7e\xcd\x2e\xee\xd1\x77\xe9\xa9\xfb\x1d\x15\xcc\x16\xc6\xc8\x17\xa8\xfa\xc7\xbb\x8f\xf7\x85\x2f\x42\x74\x60\xe3\x62\xef\x63\xe3\xc0\x3e\x6a\x71\x3c\xe6\xe5\x6e\x37\x8d\x00\xc5\x6d\x4e\x40\x1d\xf7\x93\x2b\x36\x8f\x58\x5c\xe9\x09\xa2\xbc\xab\xa5\xf6\x7d\x3d\x7a\x04\xab\x09\xf2\xc3\x9a\x59\x19\xf7\x61\x8e\x0a\x03\xa8\x65\xec\x4f\xba\x65\xd2\x68\xa3\xe3\x36\xd4\xb6\x22\xf6\x30\xef\x19\xfb\xc4\x1d\x68\x4f\x19\x5c\x94\xfd\x79\xf6\x17\x67\xd5\xdf\xcb\xff\x96\x5a\xd3\xdb\xeb\x87\x6f\xdf\xbd\x79\x7f\x77\x0b\x4e\xd7\x0b\x7b\xe2\x49\x25\xff\xfe\x21\xdd\x5c\x2d\x86\x40\x46\x9b\x50\x58\xf3\xe5\x1f\x29\x46\xaa\x55\x16\x1f\x6b\x48\x5f\x8e\xa0\xb6\xe8\x44\x97\xc4\x0f\x37\x9b\x38\xa0\x63\x13\xcc\xff\xcf\xdc\xff\x04\x49\x8e\xb3\xe9\x61\x38\x41\x66\x66\x71\x56\x5a\x89\x3d\x35\x3d\xcd\x5d\xad\xb4\x2c\xd5\xf4\x34\xf6\xb7\xbb\x12\xf6\xeb\xed\x2e\xfc\xb4\x21\x09\x92\x42\x36\x2c\x47\x68\x11\x72\x58\x81\xb0\x1c\x0e\x5a\x11\x8e\x80\xc3\xe1\x30\x7c\xc3\x11\x47\x1c\x71\xc4\x91\x47\x1e\x79\xcc\x23\x8f\x3c\xf2\xc8\x23\x8f\x3c\xf2\x98\x3b\x9d\x44\x39\x08\x66\x56\x57\xf5\xf4\xcc\xf7\xad\xa5\x83\x7b\x3e\x56\x65\x56\xd5\x57\xf5\x02\x04\x81\xf7\xcf\xf3\x3e\x0f\x3d\x95\x55\xc5\x0f\x9a\x09\x2d\x8d\x32\x4a\xc7\x10\x63\xd1\x03\x0c\x2d\x25\xde\x48\xf9\x18\x29\xb5\x5e\xb3\xea\x14\x2a\x5c\x21\x44\x61\x73\x22\x5b\x2d\x4a\xb3\xf5\x3a\x17\x97\x9e\xb7\x97\xfb\xc6\xb3\xae\xb7\x2b\x43\xe7\x87\x17\x40\xb2\x57\x5f\x90\x6a\x27\x1c\xd4\xd5\xba\x33\x00\xad\x3e\x19\x0d\x4a\xcf\x87\xe7\x2d\xe6\xeb\x55\xaa\x6a\x2a\x7b\x30\x4d\x1d\x1d\xfa\xd5\x33\x33\xe6\x4c\x8d\x49\x8e\xc6\xeb\x00\xbb\xad\xa4\xaf\x85\x9f\x4a\xc3\x0d\x51\x84\x57\x2a\xe0\xae\xd3\xc0\x2b\xed\x42\xfd\x73\xeb\xa2\xff\xcd\x05\x7b\x7d\xa9\x83\xde\xbc\x7f\xf5\xf1\xf6\x4d\xbc\x7f\xf6\x58\x6c\xcf\xcd\xf3\x84\xeb\xed\xb3\x2e\x6c\x70\xb9\x76\xad\x51\xa5\x32\xc8\x8e\x47\x33\xf9\x3e\xd3\x41\x8a\x0c\xe3\xe9\x94\x4b\x45\x2b\xd5\x98\x42\x1a\x99\xb8\x92\x58\x5c\x1e\xc5\xa7\x52\x38\xad\x41\xa6\x14\x48\x8d\x39\xe8\x52\x2a\xc3\xb5\xc7\x2d\xa8\xa8\x4f\xc7\x1c\x35\x68\xc0\x88\x52\xac\x59\x09\x46\x38\x77\xb4\xd3\xb6\x21\x47\xbb\xf0\x2b\x6d\x5c\xf0\x58\xc3\xb5\xfa\x52\xfd\x23\x0b\x9c\x55\xdf\x47\x7f\x7e\x45\x4d\xdf\xfd\x5e\x60\x7d\x7d\xc6\x66\xff\xf1\x42\x4f\x79\x69\x55\x7a\xb7\x2e\xac\x57\xf7\x1f\xde\x5f\xef\xd0\xb5\xd3\xf8\xd2\xdc\x3a\x9a\x2c\x07\x39\xec\x67\x09\x34\xac\x8a\x9c\x60\x8e\x71\x5e\xa8\x63\xdc\x3b\x63\xea\xda\x3d\x46\x58\x2a\xea\x4e\xa7\xf3\x11\xcc\x0e\x8c\x5e\x35\xa1\x3b\xb7\x71\xcd\x63\x24\x41\xd6\x78\x79\x10\x05\xa1\xbe\xf3\xb6\x51\x13\x90\x0c\x62\x22\x30\x84\x50\x76\x00\x35\xd6\x8f\x01\x00\x25\x41\x8a\x8f\xa0\xb0\x67\x7b\x3c\xda\x59\x34\x16\xa4\x21\x51\x7d\xaa\xac\x3d\x45\x87\xa0\xc7\xac\x9e\xb0\xf2\xff\x3c\x74\x1c\x7e\xf6\x16\x5f\x3d\xf7\x16\x9f\x27\x82\x36\x05\xf9\xfb\xb7\x5f\xf9\xe2\xa5\xa1\xff\x42\xd8\x91\x17\xb0\xc6\x05\x70\x67\x6b\xac\x76\xf1\xb0\xc0\x02\x58\x46\x89\x28\x24\x82\xca\xe0\xc6\x9c\x40\x0b\x2a\x46\xa9\x2a\x34\x86\x52\x91\x5a\xfb\x13\x67\x58\x21\xee\x8f\xe1\xd3\x7e\x20\x08\xd3\xd2\x67\xfe\xe4\x53\x2f\x39\x30\x60\x8c\x5b\x5f\xf5\x1e\x9e\x0d\xe7\xb9\xcb\xd1\x91\x51\xc3\x38\xd0\xf6\xfa\x85\x9e\x53\xc3\x4b\x50\xd2\x52\x51\x29\x88\x50\x54\x89\xe0\xfb\x9d\x1e\xe9\x8d\xbe\xec\xef\xaf\xa2\x3f\x08\x88\xa7\x67\x49\x87\x0b\xc3\xed\x93\xbf\xf0\x05\x66\x2e\xc9\xc1\x31\xcf\x1d\xcc\x41\xff\xa9\x2f\x13\x7d\xd6\xc1\x6d\x4f\xa4\x3b\x57\xb6\x8b\x67\x3f\x52\x25\x78\x2e\x24\xf4\xdd\x7e\x22\x08\x51\x6e\xb9\x17\xda\x7a\xeb\xd5\x69\x02\xca\x8f\xda\x57\x62\x35\x91\x00\xba\xc6\x10\x26\xe8\xf6\xe8\xa0\xc8\xfd\xa7\x97\xb8\x3e\xd9\x42\xfa\xe7\xe7\xdc\x26\x2a\x7b\x7b\x07\x42\x49\x79\xd3\xfb\x4b\x8e\x20\xcd\x52\x97\xc5\xf9\x32\x64\x39\x98\xf3\xce\xf4\xb2\x75\x75\x47\x7b\x2d\x08\x53\x62\x26\x8f\x11\xe0\x39\x76\x26\x4f\x39\x36\x88\xef\xb3\xa6\xcd\x7c\x65\xad\xf6\xd8\x9f\x14\x37\xdc\x54\xcc\x72\x65\xec\xdc\x1a\x60\x63\xe1\x4b\xde\x36\xfd\x29\x51\xa5\x64\xb2\x8c\xa2\xdf\x4b\x36\x6d\xeb\xeb\xfa\xd8\x70\x91\xeb\x1a\xf9\xeb\xc0\xdb\xf6\xdb\x7a\x29\x3e\x3c\xef\xa5\xf8\x5d\x5b\x29\x12\x7a\xb2\xa0\x30\xeb\x69\xbd\x74\xa7\xb8\xf6\x23\xd0\x06\xa3\x92\xcb\x22\xcf\x54\x86\xb9\x20\x4b\x63\x8c\xc0\x9c\x3a\xd7\xad\x7b\xb1\xe2\x1c\x1c\xd7\xb3\x90\x2f\x52\x21\xa1\x65\xcc\x48\x66\x32\x2c\x89\x83\x2f\x3a\x29\x1a\x44\x25\xa7\x27\x8c\xe4\x53\x27\x85\x44\x5f\x6b\xa4\x18\x1d\x7b\x6a\xa4\x68\xb3\xd0\x48\x91\x24\xd1\xa3\x0c\xdc\xf4\xaf\xa3\xb7\x41\x55\xfa\xee\xca\x46\xff\xbc\x6d\x7d\xff\xfe\x65\x45\xf3\xd5\x17\xef\x13\x06\x04\x84\x36\x2f\xe2\xdc\xd7\x0a\x64\xcc\x37\x4a\x56\xbe\xa3\x20\x92\x7e\x04\x4d\x68\xd1\x07\xed\x39\x07\x76\x75\x85\x5c\x20\x9c\x18\x3f\x55\x60\xf2\x2d\x20\xfb\xa6\x94\x98\x51\xd3\x32\xa7\x00\xf2\x9d\xb5\xb2\xeb\x1a\xe3\x8c\x71\xc6\x43\xa7\x3b\x63\xba\x75\xcf\x4a\xd8\xc5\xd6\xef\xa2\x1f\xa2\xbf\x7c\x96\x2f\x7a\x32\xf5\xe3\x17\xa6\xae\x6e\xd4\x97\xa6\x3a\x40\x61\x61\x11\x98\x7d\x2b\x41\xc4\x7c\x2f\x85\xf5\x03\x1d\xa5\x3f\x01\xb3\xc5\x5d\xd5\xb9\x04\x62\x9a\x5c\x38\x12\xdb\x4f\x33\x38\xfa\x11\x14\xc1\x4c\x77\xb5\xb2\x77\x5f\xb7\x32\x8a\x76\x71\x11\xf6\x56\x13\xa5\x17\x45\xbb\x27\x75\xfe\x77\xe0\x2e\xec\xa5\x2f\x40\x05\x2f\x11\x14\x0f\xab\x33\xf2\x57\x57\xfa\x99\x7d\x86\x8b\x38\xff\x94\xc5\x05\xf1\x55\xd2\x36\x8d\xd7\x98\x74\xb5\x68\x5b\x73\x62\x3e\x32\x42\x1d\x1d\x9c\x7b\xaa\xb8\x00\x68\xf0\xd3\xea\xca\x5f\xd0\xd1\x07\xc3\xb8\x31\xca\x5b\x3f\x1b\x7f\x3a\x12\xe1\x54\xc5\xad\x70\x23\x98\x25\xf7\x0e\x07\xa1\x69\xc0\x69\x61\x44\xb7\x9e\x29\x5e\xae\x73\xbc\xcb\x2e\x38\xb8\x8d\x25\x68\x3b\x17\x5e\x68\xeb\xbe\x7c\xf7\xfe\xe3\xed\x53\x0f\xf6\x9e\x54\x69\x01\x04\x33\x88\xe6\x14\x17\x30\xf5\x32\xd6\xcc\x52\x51\x48\x06\x61\xba\xa8\x36\x33\x0c\x69\xc8\xfc\x10\xcb\xc5\x1e\x14\x46\x7c\xe9\x87\xdc\xe6\x02\xe8\x85\x2c\xdd\x14\xc4\x26\x6d\x32\x22\x3f\x49\x4d\xb5\x38\x6b\x1b\x85\x9e\x08\x9e\x9c\x42\x6f\xfc\x1a\x5b\xbf\x8f\xa2\xdb\xbb\x1f\x3f\x5c\x3a\x3c\xbf\x7f\x82\x1f\xc5\xc9\xb5\x87\xe7\xee\xf5\xdd\xed\xfb\x57\x1f\x1f\x2e\xce\x75\xa0\xe0\x7f\xe0\x71\x9e\xba\xd3\x29\x83\x79\x96\x65\x32\xd3\x0c\x96\xf9\x32\x25\x04\xe7\x3a\x47\x8b\x02\xce\x8b\x54\x43\x68\x84\x30\xc5\x63\xe4\xfb\x9c\xee\xba\x6e\xf2\xcc\x2e\xa3\x6f\x8e\x4a\x16\x5e\x3b\x50\x24\x10\xcc\xd2\x40\x23\x53\xb3\x8c\xe7\x31\x4b\x93\xda\xcf\xda\x67\xd8\x4a\x5a\x65\xc1\xd6\x36\x99\x0f\x32\x68\x49\xfd\xf1\xa6\xc3\xf5\xe3\x87\xf7\xdf\xbd\x79\xff\xfa\xfe\x0f\xc1\x45\x32\xe6\xc9\xd2\xfd\x66\xe9\x05\x51\xb1\x7f\xb7\x5a\xfc\x20\xc1\x9c\x9a\x74\x18\xd2\x22\x2b\x32\x0d\x0d\x2b\x33\x9f\x25\x39\x81\xa6\xa0\x4b\x03\xa4\xb7\x47\x25\xa5\xc9\x27\x3f\xe4\x54\xb1\x5d\xd7\x8d\x63\x67\x3d\xf5\xa4\x87\xbe\x01\x2a\xae\xe3\x48\x39\xe4\x74\x6a\xbc\xf6\xb3\xf2\x04\xe9\x92\xda\x2c\x89\x96\x22\x8b\xa2\x08\x80\xee\x11\xdf\xf0\x03\x0b\x0a\x19\xcf\xba\x4b\x2e\xfc\xcd\x57\x78\xc9\x5d\x80\x05\x6c\x39\xbb\x57\x71\x65\x47\xe7\x4d\x62\xbd\x74\x27\xe7\x4e\x0e\xd8\xb3\x4c\x81\x74\x13\xb1\x7a\x38\x30\x4f\x41\xbd\x74\x55\x15\x63\xcf\xc1\xf1\x34\xc5\xe5\xd2\xc6\x7d\xc3\xf9\x82\x62\xe2\xed\x24\x40\x19\xa7\x51\x14\x87\xfc\xbe\x0d\x3e\xdf\x6f\xbe\xce\x04\xb2\xbf\x80\xd3\x3f\xe7\xd0\x3f\xde\x86\xdc\xef\x6d\x00\x59\xc4\x0a\x64\x15\x68\xb6\xb6\x25\xcf\x2a\x3f\xc7\x35\x2a\xe2\xec\x3c\xa7\x59\xdc\xe5\xd6\x96\xaa\xd0\x9c\xd2\x6c\xe9\x85\x6f\x05\x50\xc8\x37\x31\xc9\xe1\xc6\x99\x6f\xa7\x69\x9a\xaa\x52\x38\x59\x2e\xa7\xc7\x28\xaf\x72\x07\x88\x2f\x47\x7b\x8a\xb9\x63\x24\x8a\x2f\x9a\x06\x3a\xba\xdd\x98\x7c\x7f\xce\xba\xb3\xd9\xf7\xdd\xcd\x8b\xbe\xd5\x4d\x1f\x65\x53\xf0\x10\xa3\x03\xd0\xcd\xb3\xf3\x83\x1b\x63\x8c\x0b\x60\x17\x97\xc5\x59\xae\x35\x2b\x0b\x49\x09\xc9\xbc\x26\x7e\x96\x95\x5b\x37\x9b\xb1\x08\xb6\xf5\xbd\xed\xfb\xbe\xb7\x42\x59\x59\x2e\xf3\x9c\xd9\x6c\xdd\x7f\xd4\xac\x2c\x50\x80\xdb\xf2\xd2\xff\xac\xc3\xde\x72\x9d\xbf\x5f\xb4\xef\x8b\xe9\xbb\x59\xcd\xdb\x5a\xcb\xab\xc9\x81\xcc\x0d\x83\xf3\xb3\x9b\x62\x82\x72\xa0\x96\x2a\x8b\x61\x66\x0d\x2d\x0b\x41\x18\x4d\xbd\x42\x27\x5d\xa9\xec\x04\xc6\xeb\xc4\x99\x61\x18\x47\x2d\x8d\x19\x7d\xfa\x18\x65\x36\xab\x00\xf5\x62\x14\x06\x94\xc0\x18\x19\xfa\xce\xc1\xe9\xe2\x77\xfd\x7e\xf4\x47\x21\x77\xb8\xba\x5b\x97\x2a\xc3\xba\x43\x5c\xd5\xd1\xc1\xbb\xe8\xf6\x0e\x7c\x7f\xbb\x95\xe8\xa2\x00\x17\x7b\xfb\xe3\xbb\x7d\x46\x72\x30\x57\x67\x5b\xc5\x69\x01\x3d\x04\x92\xad\x11\x65\xbb\x64\x83\xef\x14\xc8\x5a\xdf\x25\x63\x25\xaa\x22\xf7\xd6\x3b\x02\x52\xe7\x9a\x66\x06\x19\xa6\x07\x2d\xb4\x37\xd3\x04\x94\xa0\x8b\x04\x59\xa1\xa5\x5b\x3a\x3f\x48\x90\x81\xd1\xeb\xd5\x83\xe1\x4c\xa6\x0e\xe4\xa0\x22\x9e\x75\x39\x97\x72\xb5\xf7\x18\x72\xe7\x53\xd0\x39\xda\xaa\x37\xcf\xc3\xa4\x1f\x1e\x02\xa4\x20\xba\x5d\xfd\xde\xc3\xcd\xf5\x60\x0c\x34\xf3\xdb\xe3\xbb\xa3\x79\x91\x44\xaa\xe9\x46\xe2\xc7\xf1\xe4\x5b\x06\x60\xef\xa4\xf5\x27\x01\x84\xf1\x15\x32\x16\x61\x90\xae\xc1\x0f\x8c\xe7\xe5\x54\x95\xcb\x2c\x81\x14\x42\x71\x1d\x4f\x8c\xca\xd1\x94\xd8\x51\x63\x89\x43\x42\x56\xa7\x4e\x02\x04\xb4\x01\xa8\xd0\xba\xea\x8a\xa3\x75\xcb\x28\x8d\x4d\x6a\x26\x95\x94\x9f\x75\x7a\xd6\xb3\xe5\xc7\xd0\xa1\xb2\xd9\xfc\x45\x4b\x5c\x7c\xf3\x64\xf4\xfb\x00\xc6\x7b\x61\xf4\x3e\x2b\x8a\x58\xd5\x65\xd5\xb2\xa1\x69\x4f\x7c\xae\x75\x69\x26\x05\x84\xf2\x3d\x32\x0e\x91\x1e\x15\x55\x01\x63\xe6\xa9\xa6\xbe\xe4\x20\x97\x42\x95\x3a\x99\xb5\x90\xb9\xaf\x84\x66\x15\xaf\x6a\x56\x51\x63\x7a\xdf\x9f\x14\x70\xe0\x64\x81\x29\x9a\x7a\x04\x39\x7c\x8c\xfa\x6a\xc1\xb6\x6d\x77\x95\x74\xca\xd9\xa7\x75\xe1\x82\x46\xfe\x16\xdf\xdd\xdc\xbd\x8e\x5f\xe8\xdb\xc4\xcf\xa7\xf9\xf6\x67\xd3\xdc\x92\xb8\x51\x75\x33\xd0\x53\xdf\xfb\x89\x83\xec\x68\xa5\xf3\xb3\x04\x6e\x9d\xe4\xca\x11\x0a\x52\x0c\x5d\x81\x62\xe3\x0b\xcb\x7d\x2e\x00\xd2\x5a\x49\x9b\xcc\xa3\xf2\x7d\xf3\x64\xb2\xb6\x9b\xc9\x36\x8e\x36\x93\x07\x90\xc1\x53\x57\x2d\xc8\x76\xdd\xae\x5e\x2d\x76\x51\xb2\x8b\x02\x36\x1d\x85\x8a\xf3\x1f\x5c\x34\x0a\x2e\x99\x36\xf0\x5d\x20\x13\x78\xb3\xd9\x7f\x23\xed\xd2\x58\xbb\xba\xcb\x00\x0a\x5a\x1e\x33\x97\x42\x5b\x4a\x7a\x40\x7f\x93\x2b\x75\x98\x7e\xca\xf7\xe5\xb9\xcf\x7d\x6f\x34\x60\x71\x97\xf9\x71\x98\xc7\x6a\x8e\x92\x68\x5d\x7b\x74\x57\x86\xbf\xf1\x87\x2f\xff\xc6\xfe\xcd\xe1\x66\xf7\x34\x3b\x1f\x6f\x68\xf5\x53\x53\x55\x7b\xf6\x53\x13\xeb\x3a\x85\xa0\xe8\xc4\x30\x39\x3f\x4a\x10\x99\x72\x57\xfe\x34\x51\xba\xcf\x3f\x75\x49\x45\xd2\x4e\x56\x95\x6d\xcd\x60\xb5\x6e\x74\x58\x2f\x76\xfd\x3b\x01\x4f\xf8\x77\xb6\x1e\x94\x67\x63\x09\x0b\x65\x1b\x4a\x7c\x43\xab\xb3\xa9\xaa\x44\x9d\x0d\x68\x64\x2d\x00\x2a\x5c\x86\x26\x27\xdc\x01\xff\x4d\x26\xe5\x61\xfe\x29\xdf\xb3\x25\xf3\x43\xa3\x01\x8d\xab\xcc\x4f\xfd\x69\xdd\x4a\xa2\x18\x9c\x1e\xc9\x8d\x39\xc0\xe8\xf7\x9e\x69\xf2\x7f\x0c\x88\xc0\xdb\xf7\xc9\x5d\xf6\xb4\x51\x3e\x7c\x7c\x15\x62\xcc\x6f\x6f\xef\x6f\xcc\x39\x3a\x39\x23\x40\x34\x65\x55\x06\x46\x24\x75\xc9\xa1\x94\x24\x2b\x7c\x97\x3b\xa3\x4f\xc5\x78\x80\x6e\x91\xcb\xe4\xcb\xf2\x04\x2c\x48\xe3\x79\x3b\xfd\x96\xca\x13\x95\x57\x39\x73\xb1\xf6\xd2\xe3\x46\x02\x1c\x97\x51\x04\x2e\x98\x46\x14\xb8\x27\xee\xb2\x6f\xdf\xff\xe6\x76\x13\x1c\x8f\x5f\x7d\x56\x2b\xba\x7b\x75\x9f\x90\x84\x21\x08\x53\x97\x09\x26\x11\xf7\x7d\x90\xcd\x5e\x03\xcb\xe9\x80\xce\xd3\x79\x5d\xc7\xa7\xba\x01\x72\x87\x96\xde\x9d\x75\xa2\x5d\xbc\x6e\x0f\x89\x0e\xdc\x13\x28\xfa\xa3\x6b\x35\xef\xd5\xf6\x47\xd6\x01\xc6\xc9\xab\xbb\x2b\x40\x2e\x31\xfd\x90\xa0\x02\xe6\xa9\xcb\x4a\x2a\x64\xea\x87\x71\x74\x7d\x22\x62\xe4\xce\xcd\xba\x7b\x81\x1c\xfa\x53\x05\x48\xcc\xe2\xe3\xfa\x37\x64\x62\x37\x7e\xf6\xa7\xdf\x7f\x97\xdd\xfe\xd2\x00\xee\x62\x97\xb4\x28\x47\x38\x73\xb9\xe4\x06\x95\x3e\x34\x87\x55\xbe\x07\xc8\xcf\x07\x74\xd6\x9e\xf9\x53\x18\x44\x0b\xd4\x2e\x7f\x36\x08\x10\xdb\x50\xdf\xc9\xb7\x39\x7a\x7d\x97\x84\x2b\x8b\xef\x9e\xc8\x57\xb7\xb8\x38\x9e\x77\x68\x39\xd2\x24\x3a\x0f\x34\x1e\x1b\x7f\xaa\x8f\x68\xa8\x1b\x75\x3e\x49\xdf\x01\x4e\x7d\x7b\xc8\xd7\x13\xc4\xcf\x4b\xe5\x4f\x79\x5d\x34\x40\x83\x7a\x5d\x0e\x51\x12\xb5\xb1\xbd\x91\x87\x32\x7a\x17\xfd\xff\x83\xde\xc9\xfd\x25\xff\xbb\xd5\x74\x5f\xbf\x7f\x7d\x77\x78\xfd\x79\xc3\xba\xbf\xf2\xd5\xbc\x7d\xfd\xdd\x5f\x81\xd7\xa1\xb5\xf3\x2e\x80\xf5\x1f\x92\x6b\xd3\xef\xcb\x8c\x64\x9c\x1e\xe3\xe3\xf9\x98\x94\x5e\x66\x39\x50\xdd\xfc\x18\xa5\x4e\x33\x65\x4a\xcb\x8f\x68\x06\x99\x2c\x0a\x21\x76\x3d\x72\x47\x4a\xfd\x94\x36\x9c\x93\x34\x6d\x1c\x45\xcb\x29\x3e\x12\x66\x64\x69\x4c\x33\xb2\x46\x2b\xb5\x1f\x17\xae\x93\x5a\x43\x24\x85\x4c\x53\x4c\x05\x27\x25\x11\x94\x49\x01\x0b\x26\xfa\x8a\x19\xce\x58\x8f\x39\x5c\xcf\x14\x84\x09\xd1\x4a\x32\x8c\x25\xc5\x25\x52\x05\x86\xc5\xb5\xfe\xc3\x76\x45\xe8\xd3\x7e\x7f\xc9\xe7\x5f\x7c\xfc\xe7\xe2\x77\x17\x75\xaf\x75\x1e\xbe\x84\xa4\x6d\x54\xeb\x17\xf5\x19\x90\x8f\x47\x2d\x4a\x5e\x76\x5c\x99\xbe\x6c\xd8\xd8\xd8\x4a\x00\x84\x5c\x01\xfa\x65\x2e\x50\x4c\x78\x89\x68\x51\xe2\xc2\x4b\xab\x4c\xcb\xc6\x78\x0e\x5a\x80\xf2\x20\x19\x67\x5c\x30\xa2\x35\x67\x02\x62\x4d\x19\x25\xbe\x50\x88\x5a\x4a\x96\x94\x07\x64\x94\xf0\x6d\x3c\x2b\xd1\x3a\x2f\xb5\x9e\x95\x8a\xd2\xe0\x57\x6c\x79\xe9\x0d\x29\xf0\x4f\x43\xef\xea\xbf\xda\x22\x80\xf7\xd7\x64\xc2\x97\xa9\xc6\x6f\xf7\x1f\xee\x5f\xdf\x5e\xae\x9b\x17\x51\xef\xe7\x7e\xc8\x9d\xb3\x05\x9c\x72\x64\x71\x01\x52\x3f\xac\x4f\x5b\xb8\xc8\xb9\x42\x88\xb6\x40\xce\xeb\xbf\xca\x60\x66\xcb\x04\x53\x6c\x20\xe5\xa8\xb0\x39\x12\x30\xb7\x19\x3c\x28\x24\x95\x2a\x91\xb2\xb6\xd6\xb5\x6e\x4c\xcc\x39\x35\x40\x74\x75\xed\x87\xba\xf6\x7d\xd3\x74\x68\xaa\xd8\xb1\xa9\x7b\xd2\x1d\x8b\xaa\x43\x7d\xb5\x7e\xec\xea\x28\x4e\xd8\x25\xdf\xfe\x3f\x05\x7e\xe9\xd0\x21\x72\xb8\x42\xd8\x2f\x9c\x49\x81\x41\xf0\xdd\x53\xb2\xe7\xc7\xfb\x17\xfc\x81\xf1\x85\xc5\xf8\x1a\x47\x1e\x6e\xde\x3d\xdc\xbd\x7e\x78\xf3\x25\x70\xf0\xfe\xf5\xc3\x3e\x6a\x92\xd4\xeb\xbc\x20\x85\x60\x25\x44\xb8\x61\x0d\xcb\x8a\x42\xb9\x42\x60\xdb\xe2\xa1\xca\x52\xe1\x88\xd5\x59\x4a\x39\x31\x6c\x4e\xa5\x91\x80\x6e\x95\x8d\xb1\xc0\x0a\xf9\xe3\x98\xcd\x05\x75\x45\xaa\x52\x3e\xb8\xb2\x69\x92\x63\x7e\xd4\x45\x41\x18\x15\x02\xc1\xc7\x88\xaf\xd1\x67\x96\x95\xca\x09\xa3\x50\x55\x2a\x71\xc4\x86\x49\xa6\xb3\x8c\x20\x45\xa9\x27\xbe\x62\x40\x04\x9d\x6f\x26\x95\x50\x9c\xd3\x52\x14\xaa\xc8\xf2\x1c\x32\xa8\x09\xa2\x20\xb7\xf9\xa5\xe7\x89\xfc\xe2\xdc\x04\xe9\x8a\x30\x35\x7f\x0a\xde\xad\x03\xbd\xcc\xce\xbb\x67\x1f\xef\xb2\x2f\xe6\xe6\xbb\x30\x37\x6f\xdf\xec\xd7\x27\xf9\x19\x86\xea\xfe\xf5\xc3\xae\x1d\x13\xe9\x79\x01\x29\x54\x65\x49\x28\xef\xd9\x50\x16\xb9\x92\xa4\x40\x08\xc1\x6a\x24\xa7\x26\x33\x35\xa9\x4d\xc1\x38\xb3\x81\x3e\x49\x03\x69\xc1\xe0\x61\x9c\x53\x5d\x78\x03\xd2\xd4\xcf\x88\x34\x28\xd5\x69\xf9\x18\x55\xe5\x38\x26\x5d\xd6\x6b\xb8\xce\x8e\x94\x18\xcd\x6b\x68\x5e\x64\x42\x6a\xe3\x52\x4a\x60\x1d\x66\x47\x73\xc9\x74\x41\x90\x26\xd4\x43\x7f\x7c\x9a\x1c\x61\x4a\x55\x58\x5a\xf2\x5c\xe5\x05\x2c\xae\x73\xa3\xd6\x18\x69\x3b\xd3\xd6\x38\xe5\x7f\x89\xfe\x73\x14\x81\xfd\xaf\xcf\xcd\x87\xbf\x7c\x72\x18\x9f\xcd\x4e\x7c\xad\xbe\x3e\x5b\x3a\x1f\x9f\xcf\xcf\x87\xeb\xfc\xdc\xbd\x7e\xbb\x63\x7e\xda\x45\x1e\x42\xc4\x50\xad\x4b\xce\xd9\x48\x67\x81\x0a\x6d\x58\x41\x10\x21\xe9\xe8\x7b\x02\xf8\x90\x66\xcd\xc4\xc6\x23\x92\x8a\xb7\xca\xd7\xe9\x51\x0b\x06\x6a\x1b\xf4\x61\x24\xc4\xba\xc8\x3c\x06\x3c\xf5\x15\xa1\x33\xd6\xa9\xf4\x7d\x23\xfc\x04\xf2\xa4\xcd\x5b\x0d\x0b\x4a\xa9\x94\x04\xcd\xdc\x0a\x80\xf3\x32\xcc\x14\xc1\xb0\x38\x96\x4a\x1e\x8b\xdc\x70\x4d\x15\xa4\x4f\x73\x35\x00\x3a\x5f\xe7\x8a\x73\x8a\x50\x59\xa8\x22\x87\xeb\x42\xa2\xeb\x64\x99\x7c\xd3\xb9\x5a\xfd\x3b\x12\xfd\xde\x13\x06\xe5\x2f\xc2\xce\xb1\x79\x02\x7f\x08\x56\x4f\xe0\xe7\x24\xa9\xf7\x4f\xb2\xfd\xef\x03\x03\xd6\x86\x4c\x7e\xf8\xf8\xf0\x26\xd9\x82\xe1\x1f\xdf\xdd\xd8\x73\x61\x2d\xc3\x71\x73\x32\x8c\x11\x46\x70\x41\x68\x7e\xf2\x39\x68\x3d\xc9\xd6\x90\x7d\x5d\x24\x47\x02\x35\xc4\xde\xc1\x8c\xa0\xcc\x91\x72\x8d\x8c\x8b\x32\x2f\x0e\xc4\x2e\x62\x19\x3d\xe3\x20\x02\x1a\x14\x49\xb4\x9c\x00\xf2\xbd\x39\x0b\xc9\x33\x9b\xf1\x44\x81\xd2\xd4\xcb\x64\x40\xca\xeb\x16\x77\x95\x77\xb6\xce\x5a\x87\x1e\xa3\x42\x97\xd8\x65\x95\x09\xda\x21\xf4\xc2\xad\xf4\xcd\x05\xeb\xb5\xd5\xd0\xae\xe3\x0b\x3a\x43\x5f\xe1\x80\xfd\xc5\xe1\x1d\x6e\xb6\x8c\xc4\x3a\xbe\x4f\xa3\xb3\x36\xee\x41\x66\x29\x25\x3c\x08\x6e\xe7\x7e\xf6\x6b\xdc\x52\xe4\xa0\xf6\xdc\x1a\x03\x5a\x0a\x35\x24\x5e\xa2\x9c\xa0\xc2\x16\x85\xc8\x1f\x23\xdf\xe5\x22\x87\xdb\x10\x07\xcf\x39\xa8\xe3\x28\x3e\x6d\x03\xb4\x67\x29\x79\xe6\x32\x9e\xac\x71\x48\xbd\x4c\x16\x44\xbc\xea\xb6\x01\x56\xa9\xed\x50\x55\x16\x9a\x93\x6d\x80\x71\xc4\x1e\xcb\xb8\x3e\xe4\x81\x91\x23\xba\xbd\x90\x12\x7c\xce\x48\x7c\x7c\x78\x75\xbf\x0e\xa2\x8a\xd3\xca\x18\x93\xcf\x7e\x20\xcc\x42\x38\xda\x71\x3c\xe4\x8b\x9e\xad\x57\xc8\x2a\x5e\x67\x71\xb7\x88\x34\x4b\xb0\x05\x62\xf5\x3d\xc7\x0b\x57\xe6\x9f\x87\x2e\xb8\xe7\x75\x9d\xbb\x37\x41\xe3\xf2\x0b\x79\xa6\x35\x3e\xbd\xff\x70\xf7\xee\xee\x5a\xf1\x09\x1a\xd8\xdf\xc7\x53\x9c\xda\x38\x5b\x66\x50\x7b\x86\x40\xdd\x14\x08\xd0\x65\x02\xbd\x47\xa1\x16\xbc\xcc\x00\xe7\x45\x0b\x46\xe4\x15\xa8\x97\xd3\x1c\xb7\x0b\x19\x67\x54\x78\x0d\x0f\xa9\x52\x46\x7a\x29\x0d\x63\xc6\x84\x42\xac\x31\x86\x53\x23\x81\x95\xde\xe8\xa5\x64\x2c\x60\x4b\xc4\x23\x0e\x1a\xe5\x30\xfa\xeb\xe8\xff\x5a\x4f\xbd\x7d\x78\x4e\xc3\xb3\xfa\xfd\x5f\xc5\x1f\x1f\x9e\xd4\x07\xfe\x39\xd8\xbf\x7b\xfb\x61\xbb\x42\xc3\xd3\xc6\x3d\xb2\x9e\x08\x6f\xdf\xec\x5f\x9c\x0a\x81\xb3\xf6\xc3\xcd\xbb\x07\x70\xfd\x89\x87\x37\xfb\x0b\x5d\xd1\x87\xcb\xb7\x82\xf2\xdb\xc1\x11\x5f\xc4\x51\xba\x9c\x62\x9e\x2e\x15\xd2\x06\xb1\x34\x4f\x4d\x2e\x7c\x47\xeb\xd2\x57\x39\x50\xfe\x94\x83\xc2\x0f\x08\x9c\x26\xc6\x10\x58\x03\x4b\x6d\xe7\xf4\x14\xb6\xc5\x9c\x10\x98\xaa\x8c\x19\xcb\xfb\x6c\xec\xf2\xd1\xb7\x58\xd9\x31\x9b\x4f\x99\x3f\x55\x3a\xaf\x47\xda\x66\xfd\x31\xeb\x08\x45\x00\x1e\xa4\x26\x25\x91\x44\x32\x45\x31\xcc\xd3\xac\x60\xd8\x12\xc2\x18\x52\x48\x40\x55\x88\x42\xc3\x73\x9a\xa5\xaa\x20\x02\xe6\xdb\x57\x24\x34\x45\x06\x39\xd2\x8c\x30\x97\xcb\x7c\x3d\x53\x40\x2e\x8b\xa2\x0c\xdf\x56\x45\x03\x91\x26\x98\x9c\x72\xb5\x7e\x2f\x2f\xd3\x4c\x17\x17\x4e\xf4\x47\x78\xa3\x77\x4d\x74\x1f\xfd\xeb\xe8\x7f\x7f\x31\xb7\xdf\x7d\x7f\x57\x5c\xd1\xd3\x2f\xe6\x15\xec\x2f\xd3\x7a\xbd\x09\x97\x49\xdb\xbe\xfd\xe7\xe0\xf9\xb7\xbe\x9c\xf1\xb7\x4f\xd3\xba\xef\xf1\x72\x8a\xcb\x74\x71\x49\x96\x9d\xa7\x12\xa4\x80\x90\x54\xe5\xdc\x4b\xaf\xcd\x42\xd7\x05\x7b\xca\xe2\x7c\xe9\x61\xec\x7c\xe4\x4f\x08\x18\xc0\x90\xab\x41\x99\x79\x0b\x5c\xe6\x79\x98\x3b\xe2\x87\x0c\x60\x7f\xca\x40\xbe\x87\xb8\x6e\x81\x49\xbd\x04\x6d\xe6\x11\x21\x0e\xa7\x26\x2b\xe7\xb6\x9c\x33\x10\xf5\xd9\x28\x24\x04\x66\xd7\x08\x84\xb0\xc0\x88\x0a\x56\x64\x39\x21\x02\x62\x96\x53\x49\x10\x12\x08\x41\x95\x2f\x59\xa1\x72\x22\xf2\x02\x43\x89\x30\x52\x48\x42\xa4\x31\x26\x4d\xa1\x0a\x02\x25\x9c\x44\x91\x63\x24\x31\xc6\x0a\x17\x45\x5e\x50\x28\x19\x61\x78\xfd\x3f\x15\xb2\xc0\x69\xa6\xf2\x8d\xe3\x3b\xba\x68\xca\x5d\x77\xa6\x0d\x75\x17\x38\x82\xc0\xdd\x5f\xbe\x7b\xff\xfd\xeb\x0b\xbb\xca\xeb\xbb\x2f\x92\xa5\x57\x34\xea\x9b\xaf\xf1\x7b\xff\xd3\xad\x41\x33\x89\xe2\x21\xb5\x69\x99\x43\x85\x20\xf6\x43\x86\x61\x91\x67\x3a\xb7\x02\xcb\x6c\x81\x0a\x4c\x3e\x2f\xe3\x6a\x29\x61\x5c\x2e\xd5\x53\xe3\x43\xb8\x90\x51\x44\xeb\x96\x28\x83\xcd\xbe\x67\x8c\xb1\x50\xf2\x32\x0b\xf1\x62\x32\xa6\xf0\xfc\x08\x54\xd2\x09\xc5\x75\xe0\x13\xe3\x7e\xe4\x7e\xe2\x33\xa2\x86\x61\xa5\x4a\x68\x61\xf4\x4d\xdc\x5d\xc6\x77\xad\x7b\xff\x59\xc8\xa9\xff\xb3\xd0\xc1\x14\x32\x5f\xd7\xd1\x65\x7f\xfb\xd1\xc5\x5d\x7c\xb2\x32\x87\x12\x23\xe4\x7b\x0a\x61\x9e\xeb\xac\x92\x58\xe6\x4b\xaa\xe2\xc8\x47\xe5\xba\x93\xc0\x58\x2d\x66\x43\x7f\x5f\x2f\x62\x34\xd1\xa6\x23\xda\x62\xbb\xef\xab\xea\x32\x30\xe5\xc9\x29\x0c\xac\x05\x2a\x69\x7f\x36\x30\x4c\x3e\x0f\x2c\xd4\xed\xca\x4b\x1d\xea\x2f\x2e\xba\x07\xff\x36\xc4\x4a\xd9\xaf\xb9\x0d\x61\xa9\x5f\x1d\xab\xb0\xbd\x5c\x29\xbe\xdf\x3c\x1b\xe4\xae\x9a\x3b\x23\x19\xb0\xd5\x7a\x8e\xc4\x78\xf3\x0b\x38\x20\x99\x6f\x88\x39\xb2\x34\x4d\x4d\xaa\xfc\x30\xaa\x26\xef\x62\xad\x3f\xcd\xd6\x5e\xdb\x07\xd6\x6b\x77\x5c\x3a\x5f\xf8\x8a\x8d\x80\x9e\x62\x0b\x48\x69\xb8\x2e\x4b\x8a\xb1\x81\x0a\xe2\x22\xcf\x8b\x8c\x43\xc7\x09\x61\xb9\xce\xbd\x5a\x98\xd6\x71\x33\x05\x32\xf6\x46\x06\xdf\xd2\x5d\xfa\x86\xff\x34\x54\x97\x5f\x20\x7b\x3f\x4b\x6d\x6d\xb9\x88\x4b\x10\xf8\xb0\x51\x9a\x6e\x48\xde\xad\xdc\x16\x5a\x9c\x2e\x80\xd9\x24\x03\x4d\xa8\x0c\x66\xcb\x90\xe5\x71\xb6\x74\x28\x1e\xfc\x28\x3b\x89\xa0\x5b\x9c\x95\xbc\x55\x13\xc0\xd8\x4f\x80\xe4\x99\x17\x09\xa3\xd8\xd7\x84\x4b\x2e\x4c\x3d\xcf\xb1\xd8\xe8\x32\xf7\x27\x42\x73\x69\x28\xd1\xca\x1c\x2b\x0d\xd1\x52\x72\x1e\xbb\x52\xd7\xad\x51\x9a\xd0\x05\x96\x52\x0b\x88\x25\x43\xd6\x34\x8d\x69\x36\xac\x42\xb4\xc6\x11\xed\x5e\x5e\xb8\x3c\xfe\xe8\xc2\x38\xf6\x0c\x63\x77\x29\x2f\x07\xa4\xdd\x53\xc9\xf5\xee\xf5\xba\xc3\x3d\x6b\x10\x79\x73\xed\x54\xa8\x5a\x2b\x68\xdc\xe7\xb9\x2b\xf2\xb8\xb3\x3f\x9d\xf6\xe9\x27\xb7\x73\x9f\x84\x4d\xd4\xd9\xec\xc4\x27\x6a\x81\x05\x27\x01\x73\x5d\xd8\xc5\xfa\xa8\xb1\xa0\xab\x40\x9b\x18\xdf\x79\xe6\x6b\xde\x01\x3c\xc6\x2c\x94\x63\xfd\x71\x10\xad\x1f\x05\xf3\x27\x7f\x14\x30\x4f\x73\x41\x0d\x21\x1c\x8c\x42\x29\xa5\x2e\xfa\x67\x9b\x06\xf5\xdf\x0f\xd8\xdc\x7f\xf4\xd4\xc3\xf8\x95\xaa\xf8\xeb\x1f\xef\x2f\x8d\x15\x77\x49\xd0\x42\x7b\x26\x85\x76\xf7\x0a\xdc\xbf\x7e\xff\xf6\xfe\xf5\xfb\x7d\x94\x17\x15\xcc\x41\x7d\x56\x8d\xad\x5d\x7c\xf2\x65\xdd\x04\x4c\x59\x88\x67\x28\x3a\x81\x82\xa4\xb6\xc0\xc8\x5b\xdf\x88\xa4\xf4\xe9\x30\x00\x31\x0c\xfb\x9e\x10\xc4\x4a\xaf\xbc\x5b\x66\x2f\x39\xb0\x60\x8c\x3b\x3f\xbb\x34\xf5\xd6\x57\x4a\x2e\xd8\xc1\x14\x49\xe4\x10\xc4\x3c\xc6\x5e\x83\xbc\x69\x9a\xe8\x06\x74\x17\xee\xf8\x2f\xef\xc1\xf3\x31\x7c\xfc\x5c\xda\x7f\x1a\xc1\xdd\x17\x23\xb8\xe0\x7a\x76\x4d\x81\x2a\x0c\xc1\xf8\x69\xea\xad\xe4\x2e\x31\x67\x15\xc0\xd0\x16\x9c\x7c\xca\x09\x28\x40\xc9\x32\x5b\x50\xec\x99\x37\x2a\x19\x96\x7e\xf5\xa4\x41\xb5\x7e\xdc\x1f\x19\x45\x5c\x7a\xed\xd7\x83\x43\xf1\x09\x48\x90\xc6\x47\x7f\x32\xbe\xf9\x95\x41\x84\x7b\x91\x86\x98\xf4\xf3\x38\xae\x48\xe9\x2f\xc7\xf1\xe6\x6b\xe3\xb8\x2c\xa4\xcb\x30\xee\x5f\xbf\xdf\xb5\x39\x74\xb8\x00\xc3\x39\xef\x8d\xe4\x36\xa1\xe7\xa3\x48\xd8\xb9\x71\x71\xb1\x8c\x84\x80\x0c\x50\x9a\xb9\x42\xf9\xd2\x5b\x95\x74\xcb\xb0\x7a\x41\xc0\x9c\x4e\x61\x0c\xa5\xf0\xc6\xdb\x75\x0c\x6c\x1b\x43\x7b\x52\xbe\xf1\xb5\x92\x0b\xb2\x30\xc3\x02\x3b\x86\x45\x8c\xbd\x04\x45\x18\xc1\x86\x1d\xb1\x81\xdf\xe0\x61\x63\x28\x7b\xc6\x68\xb9\x55\x22\x02\xe1\xe5\x7a\xbd\xfd\x95\xef\x81\x27\x2c\xfc\xba\x11\xc4\x63\xef\xda\xb6\x69\xda\xd6\x8d\x63\xd3\xf4\xb1\xe9\x6d\xd7\x35\x4d\x10\xff\x6b\x9a\x7e\xa9\x92\xe6\x2c\x13\x7b\x2e\x77\xd8\x9d\xd9\x7e\xb2\xd6\xac\xff\x9c\x0b\x9f\x5e\xbc\xfb\xa9\xad\x8c\xb3\xe7\xf1\xa2\xa7\xa3\x1e\xf1\x8d\xd9\x75\x57\x7b\x6f\xbf\x60\xd5\x7e\xfd\x0c\x97\xff\xf6\x57\xbe\x07\x9e\x6c\x5d\xff\x53\x80\x6f\x75\x6c\xe4\xfb\xf5\xb3\xf3\x35\xe0\x21\x05\x57\x27\xed\x2f\x7f\x6f\xc9\x76\xd3\x4f\xd3\xbe\x71\x3f\x0d\x7b\xf8\x29\xdf\x29\xc6\x14\xd7\x4c\x0b\xa1\x99\xe6\x2f\xdf\x9d\x87\xf5\x50\x21\xba\x7c\x1a\xc3\xe9\xff\x93\x63\xa8\x38\x57\xa5\x2a\x95\x94\xe1\xd3\x8b\x77\xe7\xa3\xd4\x8b\xa0\x4a\x46\x49\xe8\x43\xfa\xaf\xbe\x6e\x12\xd9\xd8\xba\x76\xae\xae\xed\xf1\x68\x6d\x13\xe3\xc6\x55\x95\xb5\x55\xe5\xc2\xfb\x65\x4e\xd0\x79\x4a\xf2\xf3\x98\x1c\xdd\xb9\xff\xdd\xd7\xcd\x3e\xd1\x17\xcc\xdd\xef\x87\xac\xd8\xbb\x80\x39\xff\x5c\xd0\x7a\xf8\xfe\x8f\xe3\xc3\xfe\x75\x78\x17\x4e\xe0\x1f\x92\xbb\x57\x2f\x68\x24\x6f\xa4\x5d\x3d\x07\x55\x40\x8b\x0b\x2d\x47\x3f\xc5\xbc\x01\xe9\x39\xab\x01\xa9\x41\xee\x27\x20\x8f\x4e\x99\xda\x4f\xca\x0d\xa2\xdb\x5b\xdf\xd7\x35\x40\x82\x23\xa9\x07\xcd\xa0\x33\xbe\x5b\xa3\x43\xb8\xa4\x00\xfb\x5c\x18\x6d\x85\x2c\x2b\x61\xd8\x66\x1f\x7f\x64\x21\xbe\xfa\x65\xfb\x76\x37\xbf\x6e\x9f\x5b\xb0\x03\x4d\x01\x2b\x9c\x73\xed\x4f\x53\xac\x7b\x00\x3f\x75\x1d\x28\x4c\xb0\x8f\x77\x2d\x6f\x7b\x3f\x2b\xdb\x89\x66\x6f\x7d\xdd\xf7\x80\x0b\x86\x85\x19\x34\xcf\x2b\xeb\x7b\x6b\xe3\xae\x58\x72\x80\x7c\x41\xad\x71\x4c\x94\xae\xb4\x74\xb3\x2f\x0b\x39\x94\x97\xf6\xbd\xac\x09\x86\x7e\xa3\x97\x06\xbe\x7a\x2e\x0d\xc6\x51\x01\x7a\x77\x1e\x1c\xe8\x73\x08\x8c\xf6\xc7\xc7\x28\xae\x7a\xc0\x3e\x99\x16\x88\x1e\x60\xdf\x49\x3b\x88\x36\x66\x75\xcd\x9a\xe6\xa0\xa5\xf6\x75\x37\x00\x21\x98\x17\x4a\xe6\x66\xb3\xb0\x41\x4b\x01\x90\xcf\x79\x2d\x2d\xb3\xd4\xd9\x9a\xad\xfe\x97\x7a\x24\x37\xfa\x77\xb0\xef\xee\x6a\x5f\xe0\x88\x78\x6e\x5f\x84\x8b\x38\x77\x67\xea\x62\x58\x20\xd0\xae\x87\xc1\x31\xc9\x1f\x23\xa0\x7e\x3a\x4d\xa0\x0a\x94\xb0\x1a\xea\xe6\x24\xc7\x58\xf5\x3d\xef\x86\x83\x16\xc6\xbb\x61\x06\x5a\x70\x5f\x6a\x71\x35\xf1\x88\xc2\x24\xe6\x65\x25\x1d\x33\x17\x13\xa3\x34\xae\xd7\xe7\xfe\x40\x2e\x3c\x15\x6f\xa2\x7f\x10\x74\x66\xff\x62\x7d\x7a\x6e\xef\x92\xf7\xaf\xef\x93\xbb\xdb\xfb\xb7\x0f\xf7\x37\x6f\x6f\xde\x3f\x80\x87\xfb\x9b\xbb\xf7\x41\x5d\x36\xb4\x84\xef\xdf\xc4\xd1\xfe\xdd\x0f\xd1\x96\x7e\x88\x7b\x57\x24\x2e\xd7\xa6\x38\xf3\xc2\x24\x36\x9b\x32\xef\xd2\x31\x07\x34\x9b\x33\x6f\xa7\x74\x4c\xf2\x6a\x29\x2b\xd0\x57\xd0\xb7\xfe\x48\x01\x04\x29\xc8\xbb\x4e\x35\xd3\xbe\x00\x85\x1f\x8d\x1f\x00\x34\x6e\xfd\xe7\x49\x55\x55\x9e\x2e\x0d\xe8\x3c\x8c\xcb\x3e\xf7\xbd\x3f\xd2\x0a\x83\xb4\x94\x56\x3b\x1b\x45\xdf\x84\xde\x24\xb9\x9b\x9f\xe1\x3b\xff\xf5\xa5\x77\xf3\xab\xb8\xdb\x37\xcf\xf0\xb6\x6f\x2f\xdc\x23\x77\x5f\x49\x3c\x5f\x78\x0a\xf6\x1f\xee\xbe\xbb\x79\xbd\xff\x70\xf7\x0f\xd7\x0d\x01\x44\xfb\x79\x29\x93\xc2\x2d\xaa\x5a\x94\x4b\x8a\x85\xc9\xd5\x95\x4d\xd0\x7a\x98\x9f\xfb\xcf\xaf\x97\xcc\xa5\x29\x68\x8b\xd5\xf1\x3a\x2e\x3c\x66\x4b\x13\xae\xfa\x27\x6d\x11\x56\x43\x3c\x2c\x7d\x16\x93\xa5\x5d\xaf\xdd\xac\xa8\xaf\xe7\xf5\xc4\x3c\x81\x92\x4e\x9c\x73\x5c\x96\x65\x0e\xf3\x8c\x20\x8c\x15\x93\x4c\x32\x85\x40\x8d\xa0\xae\x28\xcb\x52\xdc\x32\xd6\x86\xe7\xf3\x9b\x48\xac\xe3\xdf\xe7\xcf\xc6\xff\x6f\x3e\x8f\xff\xc3\xcf\x66\x60\xff\xb5\xf1\x7f\x2d\xf3\xbe\x4d\xc0\x0f\xfb\x0f\x77\xf7\x4f\xe3\x4f\x9a\x05\x1d\xc8\x52\x24\xc8\x2e\xa5\x5d\xa4\x4d\x8a\xa5\x5d\xc3\xb3\x04\xaf\x43\x3f\x77\x9f\x5f\x2f\xd2\xe4\x19\x90\x79\x61\x71\x11\x9b\x25\xb4\x10\x85\xab\xfa\xe9\xe8\x68\x29\x00\x8c\xed\x72\x4a\xe3\x6c\x99\xd7\x6b\x57\x29\x45\xfc\xd0\xac\x5e\x4f\x03\x60\x2d\x85\x40\x42\x88\x14\x16\x10\x41\x44\xe8\x3a\x07\x8a\x29\x08\x26\x8c\x65\x2d\xd6\xe1\xb3\x8e\x45\x51\x1a\xf8\x99\xf2\xb0\xdf\x6f\xb1\xdb\x3f\x79\x8a\xdc\xde\x7c\x77\xb3\x7b\x73\xf3\xee\x2b\x45\x90\x6f\x93\xbb\x1f\xdf\x1d\xae\x2d\x88\xcf\x69\x82\xf6\xcf\x09\x7a\x53\x8b\x41\x74\xe4\xa4\xe4\x98\x15\x62\xf5\x31\x0d\x11\x73\x7b\x8c\x73\xe7\x58\x19\xd8\xfd\xd6\x6b\x92\x9c\x97\xe5\xd2\x28\xce\xb9\x88\xb5\x16\x5c\x48\xef\xb0\x32\xc8\x1c\x54\x31\x54\x75\xad\xc8\xd9\x31\x96\xe9\x94\xb4\x5e\x25\x53\x21\x35\x20\x1e\x5a\x61\xbc\x31\x5e\xd8\x9d\x25\x92\x30\x4a\x09\x15\x0c\x57\xa4\x2c\x4b\xc2\x24\x87\x0a\xad\xcf\xe6\xa6\xd3\x63\xa3\x7d\x74\x1b\xfd\x41\x40\x3b\x5e\xb1\xc1\x9b\xd9\x6f\xbe\xbb\xf9\xf6\x2a\xa7\x76\xc1\x0b\x3f\x1f\xc4\xed\x4b\x3e\xb1\x7f\x0e\xae\xc4\x21\x37\x88\xb8\x06\xd5\x9e\xda\xa2\x01\xb5\xf0\xb6\xd5\x9e\x48\x20\x40\xea\x45\xa5\xb9\x76\x49\x59\x1b\xa1\xab\x65\x22\xd6\xe1\xca\xb9\x44\x73\xce\x35\x34\x1c\x5f\xd6\x32\x3b\x58\x4d\x0b\x05\x49\x6e\x4a\x3f\x59\xed\x4e\x73\x25\xf5\xfa\x3c\x13\x26\x18\x36\xb4\x94\x82\x12\x49\x0b\x5d\x7c\x6a\xbc\xdc\xe1\xb3\x2d\xcb\xdc\xe4\x65\x15\xe7\xca\xd8\xe8\x1b\x30\x87\xd8\x14\x47\xdf\x3c\xab\x08\x91\x8d\xaf\xf5\x59\xde\xf3\xfd\xc7\x0f\x9f\x99\xf6\xe3\xe4\xdd\xb7\x17\x5e\xe5\x0b\x4d\xc0\x45\x9f\xe3\xcb\xdb\xbc\xae\xd9\xf8\xee\xc3\x8d\xfe\xe4\x2a\x63\x93\xcc\xa5\xba\xad\x8a\xa6\x14\x14\x6a\x59\x65\x6e\xe9\xd6\xe0\xdb\x04\x3a\x00\x8e\x0b\x95\x23\x5f\x95\x3c\x74\xba\xa3\xc7\xc8\x82\xa0\x7c\x70\xc0\x5b\xea\xb3\xe4\xa0\x0a\xa9\xcf\xaa\xe9\xbd\x0e\x68\x2d\xdd\x02\xe5\x03\xa2\x18\xc7\x25\x98\x97\x09\x10\xee\x27\x06\xa0\x30\xd0\xc8\xa5\x5f\x20\x63\xb9\xce\x08\xf7\x43\xa2\x67\x75\x89\x91\xf6\x89\x0c\x31\xab\x09\x9d\xec\x7f\x18\xf2\x29\x11\x88\x6f\xde\xfd\x70\xfb\x66\xbb\x8f\x57\xcc\xd6\x16\x90\xdf\x6e\x2a\x45\xeb\x6d\x7b\xb5\xd7\xc7\x59\x00\x5c\xbb\x62\x00\x39\x7f\x8c\x26\x8e\x0d\xe4\x7e\x4e\xa0\xa9\x94\xe6\x4b\x65\x5d\x22\xdd\xd2\xee\xad\x9f\x6b\x39\x03\x56\x30\x7f\x72\xae\x92\xa5\x60\x42\xcc\x72\x30\x4c\xea\xb3\x2e\x63\xb7\x48\x6e\x00\xf4\x43\x14\xc5\x89\x0c\xf5\x66\x16\x9e\x9d\x2b\x17\xd0\xa5\x04\xf1\xdd\xf7\x6f\x6e\xa2\x67\x7c\x44\x97\x3c\xfb\xed\xba\x7a\xcc\x52\xc4\xa3\x9f\x32\x48\x89\xe4\x5a\x0b\xe1\x07\x24\x04\xcf\x75\x4d\x58\x6d\x4b\x32\xad\x0f\xfb\x81\xd9\x65\xb2\x47\x43\x25\xb7\x65\x7e\x52\x1a\xd0\xd8\x9e\x07\x08\x0d\xc6\x34\x31\xcb\xb0\xa5\xcd\x0d\x80\x49\xea\x8f\xe6\xd2\x1b\x68\x6e\xdc\xfe\x14\x90\x04\x6f\xb7\x3d\xfc\x82\x1c\xbb\xdb\xbf\xf9\x8c\x41\xf9\x16\x3c\x7f\x93\x94\xbb\xcc\x13\x30\x7d\xaa\xc0\xe0\x59\x82\x6c\x86\x38\x97\x98\x60\x22\x9b\xc5\x98\x0c\xf1\x52\x21\x8a\xa8\x6c\xf6\x27\xfb\xd3\xd1\xb9\x3d\x15\xc5\x63\xd4\xd7\xbd\xb4\xa6\xd6\x02\x18\x70\x7a\xf1\x5e\x07\x1c\x54\x1a\xee\x15\xbc\xdc\xa5\x17\x73\xf3\xc5\xd4\x5c\xfa\x4a\xd7\x99\x29\xcf\x5d\x52\xfa\x3a\x87\x82\xa8\xd2\x8a\x86\x79\xc7\xac\x91\xb9\xed\x89\x48\xb5\x33\x73\xdc\x2c\xec\x00\xd7\x99\xa9\x65\x29\x4b\x27\x46\x6b\x41\x1e\xdb\x25\xc3\xd8\x30\x42\x12\xbe\x9c\xbc\x64\xa0\x06\x73\x3c\xf9\x2d\x37\xb0\x8b\xe7\x4b\x1d\x6d\x9d\x97\x7f\xb4\xa1\xea\x5e\x07\xa1\x87\x0f\xef\x37\x34\xc7\xf7\xfb\x9b\x1f\xc0\xba\x0b\xbc\xb9\x82\x25\x37\x89\xfd\xa4\xac\x40\xe6\x40\xee\xce\x29\xe8\x74\x9a\x9d\x40\xc1\xfd\xc9\x4f\x9d\x9f\x4a\xa0\x27\x5a\xb8\x80\xfb\x6c\xe6\x56\x1f\xab\x05\x1e\xf2\x13\xe0\xbe\x3e\x79\x95\xd1\x3c\x1b\x95\x55\x20\x1a\x9c\x1e\xa4\xd4\xd8\x0a\xdf\x1b\xdf\x54\xca\x8e\xc1\xa6\xfa\xb7\xd9\xb4\xfb\x25\x9b\x0a\x07\xb0\x05\xa8\xfa\xd4\x83\x49\x67\x19\x88\xd6\xa7\x67\xf4\xc3\xe4\x47\x0e\xdc\x4c\xa0\x83\xd8\xd7\xc9\x71\x6c\x55\x5d\x2d\xf9\x67\xa3\xf2\xcd\x28\x0d\xa2\xc9\xa8\x41\x48\x8d\x8d\x7c\x66\xd4\x2e\xbe\xd6\x62\xff\x4e\x40\x72\xfe\xf8\xa5\x4d\x9f\x4d\xda\x5f\x4d\x8a\xb6\x42\xda\x18\x78\xe8\x99\xfb\x54\xc5\xa9\x2e\x40\x01\x08\xf3\xad\xef\x26\xdf\x70\x70\x04\x11\x85\x55\x41\xbd\xde\x45\xfe\x34\xa8\xb6\x39\x4f\xcf\x27\x0a\x4d\x32\x98\x54\xa9\xa9\x7c\x9a\xa7\x63\xa5\xcc\x18\x7a\xf1\xe4\x33\xdd\x8c\xf5\x94\x7e\xbf\x31\xec\x84\xfa\xc7\xcd\xeb\xfb\x0f\xfb\x77\x0f\xaf\xee\xf7\xd7\xdc\xda\xdb\xa0\x06\x79\x61\xc2\x7a\x09\x4a\x00\x3f\xc3\x61\x3d\x84\x9f\x8c\xc7\x9d\xaa\xfa\x74\x70\xe7\x63\xde\x58\x00\x43\x43\xf7\xe5\xea\x38\x83\x85\x77\x71\xc6\x10\x25\x25\xc1\xb6\xa5\x8d\x64\x65\x8c\x62\xaa\xa8\x34\xa4\xd2\xca\x31\x53\x72\xaa\x31\xe7\xc8\x97\x07\x62\x97\x63\x66\x32\xad\xb0\x49\x63\x2d\xa5\x77\xca\x2b\x28\x96\x16\x13\xc6\x8d\xc8\x06\x42\xa8\x24\xa4\xa6\x0e\x1b\x4a\x40\x2e\x72\x3f\x52\x86\x0c\x2e\x05\x76\x90\x95\x0e\x2b\x2e\xed\x3a\x6e\x1c\xd6\xc7\xe7\x71\xff\xd3\xad\x5b\xef\x97\xc7\x0d\x42\xfd\xf3\xe6\x79\x57\xd8\xdd\xfe\x32\x17\x5f\xe0\xcf\xf4\x6e\x38\x4e\xd9\xc9\x9e\x69\x3e\x56\x00\x3f\xef\xc3\xf1\x75\x8c\xb3\x92\x51\x6e\xf5\x40\x5b\x21\x14\x1f\x50\xe6\x65\x52\x40\x21\x0a\xcf\x62\x51\x34\xf2\x28\x2a\x2d\x2d\xd3\xdc\xc0\x03\x31\x4b\xf3\x34\x60\xa3\xf5\x7a\x2a\x4b\x28\xbd\x1c\x2b\x84\x65\x59\x97\x86\x6a\x82\xca\x92\x73\xa8\x84\x58\x03\x92\x8e\x61\x89\x79\x49\x2c\x22\x41\x5a\x2b\xba\x09\x7b\x45\x75\xa0\xcf\x94\x02\xfe\x2a\x74\x4f\xad\x9b\xc6\xe7\x38\xf3\x65\x29\x6a\x8b\x35\xdf\xbf\x7e\xff\x15\xf6\xae\x0b\x93\x4e\x42\x76\x99\xc7\x8d\xeb\x7b\xe5\x49\x9c\x2e\x27\x1b\x68\x8f\x38\xaf\xaa\xaa\xf1\x9b\x70\x02\x68\xc0\x1a\x7b\x5c\x5f\x6d\x12\x62\x07\xba\x98\x5a\x29\x5b\x59\x6d\xfd\x0c\x32\xab\xd7\x97\xba\x06\x4a\x4a\xe9\x6b\x21\xc4\x82\xaa\xaa\x0a\xdc\x1d\x69\xb8\x4f\xf8\xe9\x3e\xfd\xc5\xc6\x94\xf0\x5b\xef\xd3\x17\xab\xf0\xeb\x77\x2a\xa1\xbb\xdc\x1e\xb3\xce\x9e\xa7\xfc\xa8\x41\xb6\xfa\x88\xd7\xcb\x0f\x60\xca\x18\xc1\x1c\x61\xd9\xd0\x8a\xf3\x92\x73\x5a\xe4\xfe\x18\x1f\x73\x5e\xe6\xde\xc4\x30\xaf\xb9\x2d\x8d\x28\x0d\x53\x5c\x16\x07\xac\x7f\xe1\x5e\xcd\x0e\x21\x89\x60\x15\x6e\x16\xe6\x10\x21\x05\x55\xa9\x8c\xf1\x43\x4f\xb1\x44\x9c\x13\x8b\xa8\xb1\x51\xb4\x07\xf0\xb1\xbc\xb1\xfb\x34\xf4\xb2\xfc\x71\xf4\x67\x4f\x5a\xa5\xa1\x4f\x11\x84\x93\xe6\xe6\x4a\xf6\x74\x19\x1d\x78\xfd\x43\xa8\x55\x86\x84\x79\xa0\xb0\xf8\xee\x2b\x82\xe1\x3f\x24\xb2\x2e\xf2\xa4\xf8\x09\xc6\x11\xf4\x6a\xe7\x3e\x89\xa4\x67\x75\x8b\x9b\xba\xf3\x3d\xad\x9d\xb3\xf8\x34\xb5\xe7\x1a\xa4\x7d\x7e\xf2\x0d\xad\xc0\x9c\xf0\xd2\xcf\x5e\x13\x67\x11\x83\x99\xcd\x8d\xef\xd8\x51\x56\x80\xee\x53\x04\xe1\xc2\xe3\x9a\x2c\x15\x70\xb9\xa0\x58\x61\x44\x90\xce\x0b\x98\x4b\x44\xf0\x92\xb5\x39\xb4\x10\xd2\x38\x93\x66\xd6\x0c\x09\x54\xa4\x48\x92\x16\x33\x0e\x6a\x75\xc9\xff\x57\x97\xfa\xe8\xb5\x6a\xfe\xb0\x31\x88\x7c\x7b\xfb\xcb\x8e\xff\xb5\xa1\xef\xd2\xa7\xf8\xb4\x62\x13\x49\x28\x1d\x85\x2b\x20\x80\x10\x59\x0a\x01\xf3\xe6\xa9\x14\x63\xce\xce\x82\xe1\xd2\xe3\x47\xfd\x71\x76\xab\x63\xef\x96\x21\x86\x3b\xca\x89\x03\x19\x80\x88\x33\xce\x90\x90\x46\x19\xad\xb5\x61\xf1\xa8\x94\x3f\x69\xfd\x18\x69\xdf\x28\xeb\x35\xd0\x36\xda\x87\x67\xe9\xbf\x96\xcd\x2d\xc2\xac\xe3\x2e\x87\x20\x2d\xa0\x25\x6b\x88\xde\x3c\x89\x85\x96\xe7\xc9\x6d\x8d\x17\xdb\xd5\x05\x82\x23\xb7\x2e\xce\x1d\xa6\x7f\x0b\x9b\x93\x04\x3d\xda\x1b\x7b\x80\xd1\x4d\xf4\x26\x9c\x84\x97\x86\xe4\xfd\xfb\x57\xcf\xb2\x4a\x1f\xde\x5f\x18\x39\xde\x6f\x82\x6a\xaf\xef\x6f\xf4\x99\x26\xed\xa7\x1a\x34\xce\x4d\x53\xdf\x4f\x13\xc8\x03\xdb\xf1\x34\x85\xae\xdb\x03\xb4\x3f\x19\x7b\x70\xdd\xa7\xac\x77\xa3\x1d\x6d\x5d\xdb\xf5\xd3\x10\x45\x49\x34\x3f\x8a\x9b\x72\xa7\xbf\xfa\x37\x7f\x85\x05\xe4\x86\xfd\x84\xf6\xe3\xdf\xd8\x58\xb8\x8d\x53\xa5\x0a\xfd\x99\x1a\xe0\x8d\xdf\xa9\xf1\x0c\xcc\x3e\x73\x3b\x6d\xcf\xa9\xdd\xe7\xed\x59\x18\xa3\xc2\xf8\xc3\x27\xb3\xe1\xef\xc6\x80\xbf\x7b\x1b\x3d\x44\xff\xfe\x6b\xf8\xbb\xfb\xff\x12\xf4\x1d\x38\xd5\x17\xf4\x1d\xcf\x32\x60\xba\xf9\xa4\x15\x93\x9a\x39\xee\xd8\x09\x40\x93\x17\x25\xdb\x4d\xc8\xd4\x94\xfa\x31\x6b\x78\x49\xd2\xbc\x71\xec\x09\x7b\xc7\xad\xad\x27\x56\x29\x21\xf6\xd3\xe2\x54\xc2\x15\x2c\x44\x29\x30\x2d\x19\xe1\xb8\xc4\x54\x94\xb0\xa0\xbc\x37\x4c\x33\x86\x8f\x98\x43\x61\x96\x09\x22\x8c\xa5\x10\x24\x74\xff\x72\xa8\x73\x58\xe4\xab\x7b\x9e\x3f\xe2\x9b\xf2\x6f\xd9\xcb\x30\xb8\xce\xf9\x2a\xe1\xde\xba\xc1\xb9\xc1\x01\x79\xae\x53\xc0\x5d\x8f\xac\x6e\x7f\x5b\x2f\x83\x9b\x2f\xbd\x0c\x49\xa8\xa9\x54\x07\xfe\x54\x87\xb8\x32\x10\x5f\x9b\x7c\xae\xba\xa5\x5f\xa8\x74\x84\xff\xf6\xef\x8a\x6b\x59\xf2\x30\xb0\x6e\x5e\xdd\x01\x70\x5c\xb7\xff\x06\x14\xcc\x8f\xad\x3b\xfa\x5e\x00\x54\xfb\x11\xb8\x50\x95\x5b\x57\x03\x01\xad\x77\x10\x74\x4f\x9a\xba\x07\x6e\x8a\x6c\xdd\x49\x67\xe3\x4f\x7d\xe9\xf4\xec\x0b\x30\x9f\x6a\x6d\x07\xa3\x43\x66\x53\x66\xe6\x7c\xda\xba\x7b\x56\x9b\xf3\x60\xb3\x8a\xfe\x24\xfa\xf7\xd1\xff\x19\x6c\x7e\x09\x74\xf8\xcd\x57\x70\x0e\x87\x9b\x77\x3f\x80\x5f\x28\xb6\x3f\x5c\x70\x0c\x3f\xbc\x7d\x73\xf3\xfa\xed\x86\x86\xd8\x07\x98\xc3\xe7\xaa\xfd\xab\xcb\x8f\x1d\x0c\x99\xfc\x29\x4e\xb3\x65\x8a\x61\xb6\x74\xa8\x96\x88\xa0\xc0\x68\xd6\xd1\xa6\xf4\x36\x03\xda\x77\x39\x60\x75\x83\xe2\x3c\xb6\xa9\x3f\x81\x2c\xf3\x63\x4e\x28\x4c\x55\x1e\xc0\x0d\xf9\xd4\xe5\xe3\x88\x00\x05\x39\x3e\x9d\x5b\x21\xb6\x97\x8f\xd1\x9c\xad\x51\x61\xea\x4f\xb5\xce\xeb\x89\xb6\xf9\x70\xcc\xfb\x83\x92\xb0\x10\x44\x92\x92\x28\x42\x60\x0e\x4b\xec\x30\xa5\x25\x92\xa8\x84\x0a\x8a\x3c\xd3\xf0\xd3\xa8\x0a\x09\x55\xb1\xc1\x1b\x0c\x25\xcc\x15\x01\xc2\x50\x94\x50\x43\x26\x89\x64\xeb\x8f\xad\x2f\x2e\x48\x87\xe3\x86\x74\x00\xe9\xf6\x73\xf9\xea\x4f\xb1\x30\xaf\x2c\x54\x74\xb6\x4e\xe1\x7f\x7b\xa9\x0e\xae\x71\xd9\x7a\x7c\x5d\x98\x36\x42\xdd\xe6\x39\x75\xf0\xfe\x2a\x2f\xfe\x15\x02\x8e\xf0\x64\x26\x55\x67\x04\xdb\x95\xde\xba\xea\x88\x86\x06\xc8\x73\x9f\xa0\x12\x2b\x8b\xec\x22\x8c\x42\x46\xc7\xd2\x19\xe4\xac\x47\x3a\xcd\xaa\x2d\x6d\x5f\x7b\xee\x3c\x05\xc7\x11\x22\xa5\x77\x95\x37\xcb\xe4\xe9\x16\xd2\x15\xf1\xc9\x33\x8f\x28\x85\x0a\x52\x90\x81\xc2\xb6\x25\x83\xaa\x40\x05\x54\xb8\x30\x08\x2b\x06\x0d\x44\xd0\x39\xd3\xd8\xd3\xc9\x36\x9c\xf0\x2a\xda\xc7\x4d\xf0\x45\xec\x85\x2b\x0f\x6e\x3c\xe5\x37\xd1\xea\xb5\xc7\xfb\x77\xd1\xc6\x4a\xf1\x1c\xe1\xf5\xea\xfe\x15\xd8\xa2\xe4\x0f\xc9\xab\xf7\xaf\x76\x73\x95\x81\x14\x14\xeb\xa1\x3a\x9f\x7c\xcf\x80\x45\x31\x5a\xfa\x84\x71\x8e\x29\x14\x38\x1f\x9c\x27\x0e\x8c\x55\x5d\x1f\x2c\x82\xbe\xad\xea\x1a\x94\xfe\xd8\x59\x50\x8c\xae\x5a\x8e\x42\x64\x55\xca\x80\x3d\xdb\x5d\xb4\xe4\x4d\xe2\xce\x2d\x8f\xb9\xc7\xa0\x8b\x22\x10\x55\x8f\xe4\x46\x24\x34\xa8\x2c\x3e\x3d\x8b\xaf\xef\xbe\x94\x57\x09\x9c\xe0\xf7\xef\x8a\xbd\xa4\x55\xbb\x3a\xa5\x49\x76\x9e\xb9\xd5\xb2\x30\x86\x9e\xa7\x24\x5f\x5d\xd5\xa6\x43\xa0\x49\xa8\xce\x33\x65\x94\x75\x82\x17\x0e\x52\x6d\x95\x11\xa9\x59\x63\x99\xe9\x82\x97\xbd\xbf\xe4\xb5\x36\xfe\x8e\xbb\x8b\xae\xdd\x0b\x20\xd8\xc6\x54\xb5\xee\x00\xb7\xaf\xee\x0f\x37\xd7\x14\xd0\x1a\x6e\xed\x23\x47\xe2\x62\xa9\x73\x08\xf0\x7a\x30\x33\xc6\x34\x74\x18\xfa\xa8\x60\xb4\x9e\xd7\xb3\x5b\x75\x3d\xa5\x71\xa7\x58\x45\xc5\x62\xac\x36\xda\x1d\x54\x31\x39\xce\x7c\x69\x96\xd3\x46\x20\x0f\xe6\xd5\xc8\xda\x2d\x05\x48\xad\x1a\xbb\x91\xce\x2d\xe1\x7e\xaa\x64\x1b\xed\xe2\x26\xf0\x3f\xfc\xcc\xd6\x5f\x32\x75\x63\xfa\xfd\x99\xad\xbb\xd1\x91\x98\x2e\x9a\x00\xba\x06\x57\x8c\x71\x5b\x54\x18\x2d\x63\xc1\xe9\x11\x44\xb0\xf0\x47\xa0\x87\x89\xb2\xf8\xa4\x78\xc5\xe4\x22\xac\x31\xa6\x0e\xc6\xd6\x3f\xb3\x95\xf1\xab\xb1\xed\x74\x35\x56\xb5\x1b\x17\x7f\x75\xa9\x6b\xfc\xde\x75\x57\x0d\x13\xfb\xee\x07\xf0\xac\xf5\x70\xff\xea\xfe\xd5\x4d\xa0\xa3\x78\xf8\x17\xe0\xe1\x4d\x7c\xd8\xfc\xbc\x9b\xad\x87\x6e\x5d\x6c\x85\x83\x28\xc9\xce\x4e\x19\x01\xa2\xc4\x71\x41\x28\xa4\x34\x2f\xb2\xc7\xc8\x0d\xb4\x37\x46\xc1\xd4\x41\xeb\x05\x1f\xb4\x83\xad\x1b\xdc\x41\x17\x52\xb8\x56\xca\xd9\xb7\x4b\x37\x65\x55\x26\x01\xa6\x4b\x17\xa7\x78\x19\x71\x91\xa6\xbc\x22\x8f\x11\x67\x3c\x46\xd0\x60\xc0\xfd\x40\x00\xf3\x6b\x1c\x09\xe2\xe2\xa2\x4b\x79\x17\x32\xf3\xef\x93\xd5\x43\xff\xee\xfb\xf7\xc5\xc3\xc7\x0f\x4f\xa5\xe7\xfb\x20\x26\xf0\xed\xed\x7d\xdc\xe9\xcc\x66\x20\x67\xec\x08\x0a\x88\x6c\xc6\xa8\xaf\xfc\x6c\x71\x6e\xd7\x83\x3c\x57\xbb\x09\x58\x2f\xed\xa7\x63\x91\x43\x64\xb7\xd6\xfe\x9d\x5a\xa6\x65\x18\xc4\x31\xce\xc0\x14\xfc\x47\x11\xe6\xe9\x39\x36\x26\x02\x3f\x83\x21\x5e\x18\x7b\x03\xe9\xfa\xdd\xab\x3f\x01\xa1\x72\xfc\xea\x6e\xbd\x6e\x32\x63\x94\xa4\xa2\xd0\x94\x2d\x64\x7d\xd6\xea\xca\xf3\x80\xcd\xae\x41\xbe\x90\xeb\x2b\x3f\xed\xeb\x33\x77\xbe\xbe\x72\x10\xad\xd1\xab\x4b\xea\xbe\xf7\x70\xf3\x31\xcf\x73\xe0\x60\xc1\x5b\xbd\xd5\x3d\x9e\x62\xbb\x1f\x2f\x5c\x29\x17\xa6\x94\x2b\xb1\x57\x6c\xbd\xb3\xa1\xd7\x6d\x3f\xfe\x34\xf5\xfb\x69\x39\x82\xf6\xd3\x09\x84\x7b\xff\xf7\x22\xf1\x48\x77\xd3\xa1\x7c\xe2\x59\xf8\xd7\x17\xf6\xd7\xff\x31\xfa\x4f\xd1\xff\x1a\xfd\x6f\xd1\xff\x11\xfd\xdf\x5b\xe4\x16\xfa\x52\x2f\xf8\xdb\xad\x39\x22\x44\xa7\xeb\x79\x15\x28\xff\x2f\xc2\x81\xaf\xee\x5e\x7d\x77\xf3\xf1\x21\x80\x4d\xd7\xc0\xed\xaa\x32\x0e\xee\x0f\x37\xef\x6f\x2e\x91\xdc\xcd\x8f\xef\x1e\xee\x5f\x70\xd2\xbf\x7d\xff\xea\xfe\xdd\x73\xce\x5c\x9b\xa0\xa5\xca\xd2\xd8\x32\xc9\x73\x56\x14\x85\x6f\x41\x0a\x61\x2e\xb2\x93\xef\x32\x50\x3c\x46\x79\x8e\x0a\xa2\xc4\x2e\x3f\xcb\xac\x44\x34\xee\xcf\xa7\x24\x5d\x2a\xa5\x26\x2d\x95\x67\x36\xcf\xdb\xaa\xaa\x40\x5e\xe5\x59\x8a\x6b\xa0\xa0\x69\x8a\x7a\xa9\xb4\x2e\xb4\x06\x44\x6b\x82\x4c\x55\x38\xa0\xab\xaa\xa8\xaa\xa4\xf1\x7d\x91\x2f\xd3\xa4\x52\x05\x1a\xe2\x67\x4a\x31\x42\x85\x28\xca\x36\x4f\xb1\x1f\x67\x0e\x6c\x9c\x26\xb9\x6f\x3d\xec\x06\x21\x13\x29\x96\x72\x53\x3a\x72\x30\xaf\x09\x21\x73\x9e\x15\x7c\x37\x32\x5c\xf0\x1c\xe6\x90\xc1\x9c\xf8\xc1\x71\x54\xf0\x1c\x15\x90\xa3\x7c\xcb\x5d\xb9\x4b\x4e\xe6\xef\x45\x7f\x10\xfd\x69\xf4\x9f\xb6\xe7\x6d\xb7\x0f\xb4\x7b\xeb\xb1\xbe\xff\xfe\xcd\xfb\xd5\xf5\x7b\xbf\x1d\x51\x4f\x7e\x60\x88\xbc\xf6\xef\x03\xff\xf0\xcb\x7e\x86\x0f\xaf\xee\xbe\x60\xe1\x7c\x08\x4e\xd8\xc7\x87\xbb\xdd\xc9\x66\x19\x28\x40\xc1\x84\x58\x8a\x23\x07\x35\x88\x60\xde\xd6\x46\x56\x73\x5e\x80\x48\x61\xee\x38\xe7\x95\xa0\x52\xb4\x54\x49\xbe\x54\x36\x6e\xac\xd7\x79\x11\x17\x42\x60\x0e\x15\xc1\x1e\x13\x66\x9b\xa2\x10\x8a\xca\x2c\xf7\x93\x9f\x49\xd3\x3b\xd0\x14\xb9\x2f\x0f\x0a\x65\xf9\x2c\x2d\x22\x14\x4b\x3b\xe4\x8c\x49\xad\x25\xc6\x27\x42\x88\x2c\x29\xe6\xb0\x84\xb4\x2c\x31\x21\x45\x08\x8d\x28\x41\x1e\x6e\x6c\xb1\x00\x49\x9e\x41\x58\x6c\x9c\x9b\x24\x35\xbd\x8f\x62\x8d\x71\xf4\x4d\x4c\x1e\x79\xe8\xb9\xdb\x3f\x71\x7f\xff\xcb\xcb\x8a\xbc\x64\xf5\x43\x13\xd5\xfb\xdf\x6c\x6e\xd1\x67\x1d\x84\x6c\x63\xd3\xfe\xf1\x42\x96\xf1\xe6\xe3\xdb\x27\x48\xf0\x87\xfb\xdb\x2b\x7f\xc8\x0b\xba\xd1\xe7\xe5\xd9\x43\x4b\xa1\x2e\x88\xd5\x4c\xe3\xa2\xc8\x75\xce\x29\xe7\x84\x96\x82\xb2\x6c\x99\x5a\x59\xc5\x55\xea\x00\xf5\x6d\x0a\xe9\x02\xd7\x0d\x23\x0d\x12\x8c\x5a\x77\x25\xd1\x84\x8f\x0e\xcb\x23\x4e\x5d\x2a\xfd\xd4\xcb\xa4\x90\xc8\x21\x71\xae\x2d\x97\x46\x1f\x0c\x21\x8c\x12\x6f\x73\x3f\x0d\x75\x03\x5b\xd1\x31\x52\x96\x72\xf5\x06\x7c\xed\x45\xaf\x1b\x60\x81\x15\x65\x67\xbb\xce\x36\x46\x7a\xa1\x6a\x2f\xb4\xc5\x56\xa5\xbe\x2a\x72\x64\x50\x53\x12\x06\xd4\x71\xc0\xd3\x31\x45\x73\xcd\xda\x75\x3d\x1d\x83\x06\xb0\xba\x54\xbc\xfe\xd5\xe6\x95\x6f\xca\x6e\x97\xba\xea\x05\xb1\x77\x05\x49\x25\x6f\x6e\xc2\x91\xbc\x45\x5d\x2f\x08\x87\x37\xf2\x81\x77\xbb\xa9\x92\x1c\x3a\x84\x3b\x77\x6e\x5d\x07\xb1\xa1\x58\x3d\x46\x71\xbd\x70\x0b\x8c\x57\x27\x8b\xc1\x69\xa1\x3b\x76\x5a\x83\x33\x6a\x04\x2f\xa4\x44\x7c\xf2\x56\x00\xdc\xfa\x1a\x1d\x94\x9f\x95\x42\x92\xf9\xa6\xeb\x00\x2b\x29\x11\x7a\xf6\x95\x92\x1e\x42\xd5\x18\xd3\x98\xc7\xa8\x64\xb9\xc9\x57\xf7\xd4\x6a\x59\xab\x0d\xa7\xc3\x43\x7d\x47\xbd\xe0\x0c\xfa\x6f\x5f\xe0\x98\x9f\x38\x34\x6f\xbf\xae\x1e\xb0\x35\x8b\x04\x55\x92\x40\x36\xfe\xee\x2a\x01\xf2\xfd\x9b\x57\x77\xf1\x04\x46\x17\xa4\x49\xa1\x3b\x97\x2e\xce\x7c\xe1\x12\x76\x6e\x02\xf3\xf4\xb0\xf4\xe1\xd3\xd9\xec\x6a\x48\x14\xf6\x6e\x8d\xfd\x74\x0b\x32\x38\x2d\xa5\x64\x4a\x9e\x90\xc9\x20\x39\xfa\xe8\x90\x97\xa5\x2e\xfd\x6c\x03\x85\x50\xbb\x9c\x00\xe1\x9c\xfb\x61\xdd\x0c\x66\xcd\x18\xe1\xb5\x32\x99\xe9\x24\x97\xf5\x5c\x70\x2e\x20\x70\xeb\x39\xbb\x1f\x03\x1e\x23\x8d\x92\xe8\xbb\xa7\x6e\xb0\x97\x10\xfd\x43\x06\xa4\xb7\x05\xa8\x04\x11\x14\x17\x8c\xe5\xf5\x21\xb5\xde\xb8\x73\x25\x69\x6a\x33\x9a\xd0\x28\xde\xeb\xdf\xfa\x7b\xf6\x35\xe8\x3d\x82\x71\xe6\xa8\x0e\x82\x75\x68\xbc\xfe\x1e\xc1\x9e\x7e\x4f\x19\x9e\xb3\xf5\xf7\xdc\xbe\xf8\x3d\xdb\x2e\xff\xe1\xd5\xdd\x3e\x10\x51\xa2\x98\x18\x66\x74\xbe\xae\xdf\xf1\x90\x3a\x6f\xdd\xb9\x11\xdc\xa5\x2c\x41\x61\x5c\x79\xc8\x51\xfc\x8a\x3d\x77\x7b\xbe\xce\x3b\x89\xf5\x40\x0d\x25\x39\x63\xd8\xcf\x97\xdf\xe4\x56\x83\xd2\xd5\xa0\xf0\xbb\xcc\xa3\xbe\x11\xfb\x3e\xf4\x4f\x06\x74\xc5\xfd\xe5\x2c\xbb\x11\xb6\xb5\xb6\x6d\xf7\xfd\xdf\x1c\xad\x3b\xb0\x9f\xfa\x5d\x15\x25\x91\x8c\xab\x1b\x7b\x30\xd1\xdf\x8d\xbe\x0d\x3d\x76\x6f\x0e\x9b\x83\x1c\xed\xdf\x5d\xca\xf0\xfb\xbb\xd7\xdf\xdd\xdc\x7f\x7c\xb8\x4b\xda\x3a\xcb\x80\x02\x7d\xe9\x89\x97\xfe\xe8\x21\x8b\x19\xa0\xa4\x70\x05\xf6\x6c\x97\xaa\x86\xa1\x73\x75\x30\x28\xcf\xfc\xec\x5c\x03\x90\x1f\x5a\x0b\x22\xc4\x05\x96\xe5\xac\xd0\xa4\xcd\x86\x6f\x4a\x60\xf8\x9b\xfb\xe8\x1f\x86\x4a\xd1\x25\xa0\xd8\x7f\xbf\x7b\x8a\xd5\x7e\x78\xb7\x7f\xf7\x36\x3c\x78\x9f\x55\xe7\x7f\xd8\x6b\x55\x72\x21\xd7\x80\xac\x61\x20\x92\x10\xa6\x26\x13\x65\xed\xab\xd2\xcb\x1c\x48\x98\xbb\x1c\x2e\xb5\xa5\xb2\x12\xac\x04\xf8\x60\x10\x11\x04\x2b\xc3\xb4\xa5\xba\x68\xcd\xd8\x62\x83\x74\x9d\x05\xce\x0f\xa9\x96\x13\xd0\x0c\xa9\x3e\x8a\xbe\x89\xfb\x0b\xde\xf0\xf7\x9f\xed\x99\xff\xf6\x69\xcf\x7c\x86\xb1\x48\xbe\x44\x2b\x85\x54\xdf\xe7\x48\xf9\xf6\x39\x6f\xf9\x73\xa6\xb8\xf7\x5b\x2c\x7a\x6d\xa2\xd9\x4e\xeb\x7d\x89\x0a\xd0\xd9\xf3\x68\x41\x9f\xc3\x11\x40\x1b\x22\x65\xee\xc3\x02\x04\xee\x4c\x82\xc0\x65\x17\xc0\x4c\x43\x6e\x6d\xc8\xbe\x7a\xc3\xd9\xea\xd6\x15\x9c\x49\x52\x2e\xca\x15\xb4\xc3\x26\x95\x7e\xae\xca\xa3\xc1\xcc\xf0\x83\xa6\xdc\x8f\x55\x0d\x20\x41\xde\x05\x06\x56\xaa\x98\xb7\x40\x86\x17\x0b\xb4\xeb\x3f\x3f\x11\x26\x4b\x0a\x65\xc5\xad\xa1\x73\x9e\x11\x05\x9b\x92\x90\x13\x3c\xea\xa0\xff\x7f\x13\x89\x47\xb2\xcb\xf6\xd1\x97\x9c\x57\xb7\x5f\xe1\xbc\xba\x74\x03\x6e\xf0\x86\x0f\x77\xaf\x9f\x07\x8d\x06\x94\x2e\x54\xb8\x31\x3f\xf3\x12\x14\xbe\x8a\x2b\x8f\xc2\x18\x2f\x57\x66\x94\x95\x16\xcc\xb6\x34\xdc\xee\x8e\x94\x1a\xbe\xa4\xc6\xc4\x27\xee\x7b\xc6\x8e\xeb\xff\x1e\x23\x4a\x1d\x55\x54\x50\xc6\x4a\x56\xb2\x28\xfa\x26\xf0\xa4\xe9\xb0\xe7\x6d\x1d\xe6\x1b\x32\xf9\xbf\x0b\x7c\x71\xef\xbf\x0b\xb8\xdc\xbf\x0f\xae\xe9\xa0\x7f\x01\xc0\xfb\x0b\x54\xf7\xf3\x97\xde\xbe\xb9\xd0\x17\xbe\xfb\x78\x45\x23\xfd\x9c\x83\xe8\xc3\xdd\x2e\x33\x29\x86\x82\xe9\x54\xf0\x92\x50\x22\x85\xe2\x71\x6e\x32\x0a\x65\xe9\xb4\x14\xac\xc4\x42\x4a\xbe\x70\x45\x35\x8e\x73\x0d\x0b\x85\xe2\xcc\x9d\x27\xd7\x3d\x81\x4c\xe3\xca\x2d\x95\x73\x71\xb9\x54\x07\x45\x08\x42\x4c\x50\x42\x4b\x55\x32\xc9\x04\xeb\x41\x5a\x43\xc4\x39\xcd\x69\xa9\x25\x95\xac\x64\xa3\x2e\x46\x28\xcb\xc2\x70\x28\x3d\xf7\x6e\x9c\x80\x9c\xbd\x51\xc6\x3b\x8f\xf1\xba\x2e\x4e\xa1\xa6\x97\x06\x5c\xfd\xef\x5a\xdb\xff\xf6\x6f\x57\xdb\xd7\x15\x72\x5e\xd9\xa2\x06\x42\xf8\xb6\x52\x5e\x4b\x40\x46\x6f\x9d\x2a\xa5\x4d\x72\xab\x85\xb4\x9e\x62\x5b\xa3\x5a\xb9\x04\x97\x9c\x8a\xe0\xf7\x44\xe1\xac\x88\x9e\x4a\xfb\x56\x3c\x46\xc6\xb8\x71\x74\x52\x01\x08\x52\xca\x4a\x86\x0d\x2b\xa5\xa4\x4c\x72\xa8\xe1\xa7\xca\xeb\xcf\xa5\x7d\x1b\x17\xda\xd8\x28\xda\x05\xdc\x58\xfd\x2c\x87\x1b\xd0\x28\x97\x53\xfa\xc2\x19\xfc\xfd\x67\x41\xfd\x8f\x0f\x2f\x56\x62\x62\x81\xf3\xcd\xa9\xc8\xea\xac\x58\x5f\x81\xa3\x6f\xcc\x49\x4e\xd6\xd9\x41\x0c\xda\x8f\xf1\xb4\x9c\xe2\x74\xbb\xc0\x68\x13\xc9\x58\x41\xf1\xd9\x5a\x5b\x3b\xd3\xf4\x9e\x82\xd6\x9f\xac\xd1\x7d\x62\x95\x3a\x69\x3d\xab\xd5\xa6\xe2\x91\xdf\xd4\x07\xf3\x85\x4d\x77\x2f\x6c\xda\x3f\x17\xf6\x7a\x61\x13\x04\x83\xaf\x40\x0a\xf3\xba\x28\xc0\xd1\x3b\x30\x7b\x6d\x41\xaa\x4e\xae\xb2\x93\x18\x2a\x6f\x13\x1a\x74\xe1\xc3\xb5\x59\xc5\xe1\x66\x55\x75\xb1\xaa\x9a\xad\x95\xc3\x67\xa3\x76\x09\x09\xf8\x35\x1b\xdd\x5e\xd4\x71\xc2\xbd\xbf\x3a\xb5\x3f\xac\x1e\xee\xee\xcd\xc7\xdb\x2f\xd1\x0d\x57\xdd\xb1\x0b\xe4\xfd\xe6\xcd\x53\x9a\xaf\x2c\x85\xd5\xdc\x1d\xfd\xe0\x4f\x0c\xa4\xc7\xba\x25\x20\x1a\xec\x28\x04\x66\x50\x62\xe2\xb1\xc3\xc4\x34\xca\xcf\x80\xc3\xc2\xa2\x18\x2f\x86\x65\x81\xd9\xae\xf3\xf8\x60\x65\x49\x09\xd5\x25\xd3\x50\x61\x4a\x88\xa2\x25\x3f\x8f\x4b\xb6\x45\x65\xd2\x57\xf1\x48\x29\x6f\x07\xcb\x18\x16\xd6\x9c\xa4\xaf\x65\xa8\xdb\x67\x17\x4e\x93\xdf\x8f\xfe\xc1\x57\x30\x6e\x77\xb7\xc1\xce\x0d\xbd\xb1\xbf\x68\x37\x3d\x5c\xe9\x39\xbe\xdd\x0b\x02\x41\xe5\x16\xe8\x40\x0b\x91\xd7\x20\x43\x0e\xc6\x7a\x29\xf5\xa0\x5a\x75\x8a\x89\x35\xee\x38\x60\x62\x6c\x69\xf3\xc2\x8f\x7e\x20\xc3\x46\xc8\x31\xcf\x40\x09\xb6\x08\x90\xe6\xb3\x59\x8e\xfe\x28\x41\x11\x47\x25\xf6\xf2\x94\x33\x29\xd9\xc9\x4f\x8c\x31\x91\x39\x10\x62\x91\x04\x64\x31\xbf\x51\x07\x18\xfa\xd0\xfe\xe1\x16\x37\x06\xf8\xfc\x0f\x0f\xcf\xf0\xdb\xab\xdf\xf8\x7e\x8d\xff\xa6\x9f\xba\x0a\xf4\x00\x67\x20\x83\x45\x5e\x41\x4e\x16\xb1\xb4\x7d\xec\x7c\x0a\x4e\xa1\x5f\xec\x00\x97\xa1\x45\x45\x9a\x66\x85\xe3\x2d\x82\x4c\x24\xb9\xf1\x13\xc8\x23\x10\x35\x8f\xf8\x86\x1e\xe4\x1a\x9f\xde\x5e\xa2\x98\x57\xc1\x43\x6d\x5c\xac\x6c\x5c\x3a\xf7\x53\xb4\x6b\x3f\xa9\x03\xfe\x9b\x6e\xe7\x7e\x12\x22\x4a\xe2\x36\xf0\x15\xea\xe8\x8f\xa2\x87\xeb\x4e\xf0\x9c\x05\xef\x29\xcf\x1b\x84\xf0\xae\x7c\x21\x17\x3a\xbd\xb7\x97\x06\xd1\x8f\x0f\x7f\x12\x1f\x6e\xf6\xbf\xf9\x78\x18\x69\x37\xad\xcb\xb6\x02\x29\xf5\xe3\xd1\x59\x3f\x97\x20\x93\xbe\x06\xc3\xb1\x43\x60\x58\x5a\xc0\x61\x5e\xe5\x45\x7c\x9c\x90\x1e\xbb\xb2\xf1\xd3\xe8\x0d\x03\xa8\xa9\x8e\x0c\xfb\x53\x02\xbd\xc5\x18\xc0\xd4\x1c\xb4\x42\xc5\xd1\x76\xc2\x6a\x90\x7b\x07\xc4\xa9\x36\xae\xb6\x4d\x9e\xba\x73\x44\x69\xb6\x6e\x26\x9a\x31\x5b\x0a\x83\x0d\x62\x18\x4b\xc1\x09\x57\x51\x04\xe2\xf1\x11\x07\x8c\xeb\xea\x37\x3c\x35\x5d\xbc\xba\xfb\xf8\xe1\xd5\xfb\x57\x9b\x2e\xd0\xfb\x0f\x81\xb7\x75\xdd\xed\x92\x8d\x87\x27\x29\x8e\x5a\x48\xd7\x75\x20\x4f\x5d\x0a\x48\xdb\x8e\x40\x79\xd6\x80\xb2\xf4\xda\x1a\xef\x4a\x50\x0a\xaf\xf6\x1a\x73\xc5\xe0\x64\x7d\x47\x48\x62\xcf\x92\x10\x80\xed\x6c\xcf\xd0\x1b\xe7\x06\x20\x7d\x3d\x99\x09\x04\x7d\xca\xc0\x05\x5f\x1d\x8a\xe8\x26\xfa\xfd\xe8\x36\xe8\x41\x5e\x96\xe8\x0b\xcd\xeb\xbb\x2d\xbf\x1f\x1a\xb7\x2f\xbb\xd3\xed\xdd\x8d\x70\x0b\x72\xa0\x94\x76\xe4\x1d\xa8\xbb\xba\x6c\xda\x65\x02\x47\x07\x2a\x7f\xac\x27\x3e\x36\xae\x1a\xc5\xe4\x7c\x73\x28\xbc\x3a\xcd\x40\xfb\xb9\x9c\x8d\x95\x83\x6d\xf5\x60\x7d\xb1\x86\x0d\xd6\x0f\xa6\x72\x80\x2e\x3a\xd6\x7e\x38\x9a\x26\x2c\xca\xfd\x2e\x7b\x14\x37\xd5\x41\x5e\xf2\x9d\x68\xe3\x1d\xfb\xec\xb1\x7c\xa1\x09\x12\xca\x29\x77\xe0\x19\xdf\xe3\xf5\xda\x19\x90\x99\xe0\x8b\x30\x5f\x0a\xd6\x0e\x5c\x8a\xb2\xcc\x0b\xdf\xfb\x1e\x1b\x3e\x01\xe2\xe7\x78\x20\x67\xc9\x0d\x63\x1d\x63\x1d\xe7\xfb\xe3\xf1\xa8\x8f\x66\x28\x33\xac\xa8\x69\x04\x46\x2c\xd5\xe6\x68\x8e\xe7\x6e\x99\x8d\x09\x1d\x91\x4f\xe4\xfb\xab\xaf\x8a\x1f\x71\xe0\xd3\xff\x36\x30\x7d\x5c\x5a\x6e\xbf\xbd\xbd\x89\x93\x40\x5a\x72\x81\x63\xed\x55\x65\xe7\x01\xf6\x52\x53\x5c\xc9\x2e\xaf\x40\x8b\x0b\x93\xe3\x1d\x8f\x8b\x65\xb4\x8b\xf5\xd2\x82\x75\xd7\x81\x27\x09\x70\x3c\xc6\xb9\xae\x50\xad\xa3\x7d\x62\x1e\xe9\x4d\xfb\xe4\xdb\xde\x87\x9a\xcb\x86\x8f\x3a\xac\x87\xe1\x8f\xbf\x06\x90\x32\xf5\xa9\x04\xc4\xb9\x2c\x9f\x41\xc4\xe7\x89\x21\x0b\xa9\x9f\x13\x64\x6a\xad\xf9\x52\x5b\x97\x94\x6e\xe9\x03\x40\x4a\x9c\x00\x2b\x20\x5c\x23\x1a\xa7\x4b\xc9\x65\x40\x48\x71\xf1\x0c\x21\x55\x84\xb4\x5b\xb4\xbb\x60\xca\x4d\xf4\xfb\xd1\x9f\x04\x3f\xf3\x25\x02\xfa\xcd\x25\xe1\xfb\x55\x3c\xfc\x73\x6f\xe4\x46\x85\x1d\xae\xca\x0b\x0b\x73\xbf\x55\x4f\x95\x0b\x54\xd6\xc2\x07\xdd\x8e\x90\x4c\xf7\x4d\xa2\xdc\x52\xbb\x40\xcd\xbf\x3f\xf9\x59\x6b\x90\x61\x04\x29\x5d\x5a\x65\x84\x08\x35\xb8\xf5\x93\x57\x4b\xcd\x79\xcc\xbd\x09\x7a\x6b\xc9\xce\x86\x33\x57\x86\xca\x00\x7a\x89\x7d\x7f\x11\x29\x5d\x53\x84\x1f\xee\x3e\xdc\xdf\xbe\x59\xef\xdb\xdb\x70\x07\xf7\xd1\x6c\xc6\xf1\x64\xd7\xa8\xbd\xa0\xb4\xc0\x99\x52\x52\xc9\xac\x05\xe9\x9c\x89\x5c\x96\x22\x16\x38\x53\x19\xda\xbb\x61\xb0\x83\x3d\x8b\x4d\xe0\x30\x91\xcb\xec\xb9\x5b\x23\x65\x30\xda\xc1\xe7\xb9\x1f\x67\x04\xa2\x93\xef\x7c\x5b\x00\x0e\xe0\xc6\x49\xcd\x2e\x75\xdd\x6f\x9e\x14\xce\xfe\xc3\x67\xde\xba\x1f\xdf\xdd\x5e\x6b\xbc\xd7\x7e\xbb\xfb\x67\xe8\xfc\x50\xe3\xdd\x38\x20\x02\xea\x6f\x3d\x43\xfe\x25\x78\xb3\xd1\x89\x86\xb5\x70\x95\xd8\xfa\xf8\xb0\x87\x30\x8f\xd1\xa7\x28\x2e\xb2\x02\xe7\x39\xab\x88\xc9\x61\x5f\x20\x49\x71\xd3\x37\x4d\xd3\x0c\x4b\x6b\x41\x19\x54\xfa\x7d\xad\x6d\x5d\xb2\xcc\x14\xd3\xc0\x01\x62\xb6\x82\x5a\x49\x55\xb8\xd2\x72\xcd\xc8\x41\x53\x66\x2d\x86\x67\x0b\x0b\x05\x52\x00\x91\x14\x8c\xd2\x52\xdb\xa3\xe9\x4c\x6f\x45\x52\x1d\x8f\x6b\xc8\xef\xeb\x3e\x29\x90\x77\x53\x51\x54\xb9\x57\xbe\xa2\xb6\x04\x05\x2a\x94\x9b\x8b\xcc\x34\xa0\x80\xa7\x3a\xcd\xb6\xfa\x98\x7b\x14\xff\xe5\x7c\x88\xf1\x0c\x2c\x0a\x7c\x88\xc4\x1b\x0d\x10\xf3\x46\xab\xda\x57\x14\xe4\xda\xb7\x60\xd8\x98\x05\xa7\x4f\xdd\x56\xe0\x76\x40\x7b\x1d\x67\x9f\x68\x9c\xf9\x0a\x94\x17\x3e\x44\x7b\x64\x4e\x01\xe8\x7b\x6b\x65\xdb\x36\xc6\x59\xeb\x8c\x87\xd6\x74\xd6\x76\x26\x8a\xd2\xc0\xbb\x5d\x05\x5d\xb7\xdb\x0b\x4a\x73\xd3\xf0\xfb\xec\xa7\x04\x3f\xfc\xcb\x57\xe0\xb7\xb7\x46\x25\x8d\x24\x81\x72\xc2\x18\x30\x0a\x4c\xc3\x4b\x0b\x66\x41\x2e\x2f\xcf\x4d\xd2\x9d\xb1\x8d\xab\xa5\xc4\x0c\x60\x20\x79\xe6\x0a\x46\x3c\xf1\xa5\xde\xd1\xc5\xfa\x16\x10\xd0\xaf\x1f\x0f\x8a\x73\x4a\x98\x30\xd2\x94\x9c\x11\x42\x85\x96\x5a\x70\x46\xb7\x57\xde\xac\x73\x73\x1e\x5b\x98\x51\x8b\x5b\x8c\xb0\x88\x1b\x8f\x00\x1f\x86\x21\xba\x70\xb9\xba\x83\x7a\xf2\xc3\x49\xa8\xab\xbd\xd9\xed\xdf\x15\xfb\x67\x49\xa5\xbb\x8f\xef\x9e\x31\x8e\x24\xcf\xfb\x0d\x5f\x12\x1f\x87\x95\x78\x1f\xc8\x59\x0e\x33\xf3\x62\x69\x30\x98\x80\x74\x18\x77\xee\x3c\xba\x78\x62\x27\x54\xd8\x1c\xf7\xb8\x70\x39\xc2\x00\x16\xb9\x85\x31\x5e\xd6\x9b\x29\x4a\x57\x9d\x90\xef\x87\xde\x4f\x64\x6e\xc4\xea\x6a\xb7\x66\x06\x92\x6a\x4b\x0f\xca\xf2\xcc\x0a\xec\x94\xef\x9b\x06\xa0\x5a\x95\x0a\xa9\xb2\x28\x05\x12\xe5\xd2\xb1\xb2\xb0\x96\x10\x73\x54\x2c\x73\xe1\xe7\xe0\xba\x52\x85\x68\x00\xf4\x27\x55\x86\xf0\xf0\xa2\xd5\xf7\x7c\xbc\xff\x26\x20\x6e\xbf\x32\xde\xb7\x5f\x8e\xf7\xf0\x6c\xc0\xfb\xeb\x80\xdf\xfd\x13\xf0\x62\xc8\x23\xf3\x6c\x71\x08\x9c\x80\xa9\x30\xe9\xdd\xb9\x72\x49\xce\xfd\x8c\x73\x5b\xa0\x01\xe7\x2e\xc7\x08\xa0\x22\x77\x59\x1e\xf3\x45\x16\x45\xac\xca\xaa\x05\x11\xf2\xcd\x38\xfa\x91\x9c\x8e\xb4\xc0\x50\x1a\x3d\x55\x33\x10\xdc\x58\xf6\x95\x71\x4b\x24\x39\x5c\xc7\xcd\x97\x9e\x95\x05\x23\x96\x62\x73\x94\x2c\xab\x72\x13\x06\x4e\x0a\x8a\x6b\x25\x5b\x80\xfd\x49\x73\x66\xa2\x43\xc0\xca\xbb\x1d\x8f\xfe\x7e\xf4\xdd\x33\x85\xc5\x67\xb9\xe8\xc3\xcd\xbb\x1f\x6e\xee\x7e\x7c\x77\xf8\x52\xbc\x69\xa3\x0d\xdc\x54\xdd\x9e\x94\xa0\x92\x93\xcb\x32\x60\x81\x2b\xad\xfd\x74\xaa\x1b\x16\x2b\x93\xb0\x7e\xea\x92\x51\xca\x00\x19\x67\xbe\xb5\x7e\xb4\xbe\x77\x2e\xb4\x38\xb5\xa0\xb0\x80\xec\x38\x4a\xb3\x8a\xba\x02\x95\x02\x23\x53\x55\x54\x29\xdf\x2d\x53\xc9\x53\x9b\x52\x36\x4d\xd3\xe4\x87\xb8\x0f\xda\xf4\xd6\x46\xbb\x58\x06\xde\x00\x7d\x79\xfe\xfe\xe2\x09\xad\x74\x69\x72\x7d\xda\x32\x3e\xdc\x3d\x6c\x4c\xeb\x17\xfe\xea\x4b\xad\xf7\xd5\xfd\xab\xfb\x5d\x55\x15\x30\x4e\x3d\x46\xb1\xf0\x4d\x3d\x71\x3f\x74\x75\xe3\x8f\x1c\xe4\xd6\x1f\x81\xc3\xde\x81\x1c\x35\xb1\x5b\xc4\x7a\xa5\xb3\x03\xb9\x9f\xdc\x7c\xd0\x05\xc1\x4b\xa9\x6d\x5f\x56\x0e\x60\x7f\x3c\xea\x7a\xb0\x3a\xae\x98\xaf\x8c\x97\xf6\x6c\x4e\xa7\xd0\xb1\x11\x45\xbb\x1d\x0b\xdc\x7c\x30\xfa\x7b\xc1\x3b\x08\x0c\x53\x2f\x32\x62\x6f\x9e\x74\x89\x82\xb7\xc2\x12\xc8\x28\x77\x45\x4d\xe0\x22\x8b\x10\xca\x9d\x7c\x6d\x6d\xd7\x1d\xe0\xdf\xf4\x5b\x21\x6f\x6f\x06\x33\x2c\xb6\x8c\x7b\x5f\x00\x1e\x25\x7b\x12\xfc\x03\x7e\xd1\x02\x8b\xc0\x9b\x78\x1f\xd4\x60\xb7\x8f\xe0\xdd\x0f\x87\xd9\xb6\xfe\x54\x8e\xa3\x3a\xfa\x99\x9f\x3a\x3b\xf8\x63\x09\xb2\x03\x67\x7e\xaa\xac\xf6\x63\xe9\x8f\xad\x6d\x1e\x23\xe6\x8d\x3f\xd9\x36\xda\xc5\xe8\x52\x67\xfd\xf3\xa0\x80\xf8\xdf\xbf\xf0\xbe\xee\x0f\x37\xef\xbf\xde\xe6\xf6\xe1\x7d\x60\x92\xf8\x70\x07\xde\x7f\xe6\x91\xbb\xbd\x7b\xf5\x8f\xc0\x9f\x80\x9b\xbb\x4d\xf3\xf1\xe1\xd5\xfd\x0e\x01\xb6\x75\x76\x2b\x9b\xc3\xfe\x82\x98\x52\xde\xb8\xd0\x3f\xd0\x02\xe2\x75\x57\x40\x0d\xb4\x6f\x00\xea\x0b\xe8\x2b\xb8\xb4\xaa\x94\xa5\xce\x40\x4a\x47\x20\x81\x64\x9e\x3e\x46\x13\x2f\x85\x18\xe4\x7e\x74\xce\x58\x23\x98\xd2\x5a\xeb\xb6\x5d\x3f\xaa\x92\x1b\xeb\x11\x51\x3c\x86\x5a\x4b\xa7\x7c\x76\xee\x28\xa9\xb8\x94\xa2\xd2\xf1\x31\xda\xc5\x38\xe4\x3d\x55\xf4\x7d\x50\xff\xfe\xeb\x4b\x7d\xf6\xf0\x44\x91\x77\xdd\xb7\x82\x7c\xea\xdd\xe1\xea\x0b\x7f\x99\x37\xbb\xb9\xfb\xc7\x3f\xbe\xbb\xf9\x71\x1d\xd8\x87\xbb\x57\xdf\x3f\xcb\xa1\xed\x53\x8b\x40\xcd\x54\xdd\xf0\xa1\x69\x1f\x23\x3a\x55\xeb\xfe\x5b\x0e\x82\x0b\x41\x7c\x93\xfa\x94\x23\x07\x39\xa8\x00\xde\x9a\xf8\xaf\x49\xb3\x8a\x78\x76\x9a\x58\x8f\xf0\xe8\x00\x54\x80\x84\xc4\xd9\x04\x72\xdf\x1d\x54\x21\x64\x2d\x18\x74\x54\x48\xac\x30\x23\x94\x20\x51\x63\x4e\xb9\xc8\x8e\xb6\x46\x8d\x59\x58\x59\xea\x75\x2e\xfa\xaa\x94\x3d\xa3\x3a\x3e\xda\x73\x6f\xfb\x75\x5a\xa2\x5d\x5c\x3d\x8d\xfb\x8f\xa2\x7f\x1c\x90\x4a\xcf\xc7\x7d\xf3\xc5\xb8\x7f\xc7\x61\xef\x9f\x0d\x1b\x3a\x04\x2c\x13\xae\xe2\x9d\x6b\x26\x36\x38\x86\x31\x2d\x5b\x49\xcb\x12\xfb\xc1\x23\x02\x2d\xa4\x40\xaf\x4f\xfe\x3a\xe0\xe8\x31\x0a\x65\x4c\x45\xbc\x1a\x07\xda\x22\xdc\x1b\x90\x49\x50\xf8\x0e\xe0\xc7\x08\x44\x7e\xfc\xfa\xa0\x2b\xc8\x29\x13\xf5\xaf\x8c\xd9\xa4\xdb\xa0\xa3\x8d\x6f\x85\xc5\x5d\xd0\x0e\xfb\xc3\xe0\xa7\x5f\xb8\xa5\xb7\x71\xc7\x37\xef\xa2\x57\x41\x58\xe1\x5b\x50\x5a\x02\x25\xd7\xb9\xe2\x25\xa5\xa4\x52\x20\x6a\x0c\x22\x8a\x1c\x94\x2f\x84\xe2\x47\x2b\x6b\x57\x39\xe3\x94\x3f\x8e\x25\xd0\x31\x06\x35\xf2\xf5\x44\x40\x11\x6a\x7b\xf2\x91\x87\xb3\xe4\xcf\xa3\xdf\x44\x38\xfa\x77\xff\xaf\x9e\x9d\xeb\x01\x73\x7d\x74\xde\x1d\xb6\xa9\xde\x31\x80\x2e\x8f\x8e\xc9\x50\xb7\x51\xd0\x01\xe9\xed\x06\x59\xeb\x01\xf2\x36\x3c\x3a\xc2\xf7\x00\xb6\x38\xf3\xb5\x2f\x08\xb4\x05\x4d\x41\x4e\x47\xc0\x00\xa7\xbe\xf4\xc2\xf0\x12\xe1\x56\x5f\x9e\x1c\xa2\x94\x51\xdb\x93\xa3\xcc\xe5\xc9\x51\x04\xf4\xba\x46\xb5\x5e\x86\x73\xcf\x88\x6b\x45\x19\x66\x75\xab\x5f\xf6\x17\x3e\xd4\x35\x36\xfb\x18\x78\xde\x7f\xb7\x31\x5e\x87\x78\x1d\xe1\xed\xfb\xcb\x08\xff\xf1\x8f\x4f\x43\xac\x03\x38\xdf\x4f\x80\x48\x94\x35\xbe\xdd\x58\xcb\x7c\xeb\xd6\xf5\x10\x84\x11\x8e\x0d\x91\x80\xae\x2f\x2b\xe2\x07\xcf\xc2\x82\xca\x4e\xb4\x03\x18\x40\xea\x6d\xdf\xd3\xf5\x1c\x79\xda\x19\x5c\xf1\x7c\x67\x38\xae\xc3\x3b\x82\xc9\x36\xa8\xb1\x4b\xbb\x8e\xae\x2a\xa5\x14\x8c\xad\xc3\x3b\xc4\xd7\xfe\xc9\x6f\x9e\x62\xcf\xff\xe1\x85\x4f\xfe\xe6\x97\xbc\xf1\x40\xcd\xf6\x33\x97\xfc\xe1\xe3\x43\xf0\xc9\x37\x77\xfc\xe1\xb3\x54\xf7\xc7\xdd\x80\x8b\xb8\xfc\xa9\x8a\x59\x51\xf4\x86\xf5\x10\x49\x4a\xda\xa9\xeb\xba\x6e\x5c\x6a\x9b\xe7\xa2\x05\xe1\xec\x9b\x7c\xa5\xab\x46\xf2\x3c\xd3\xbc\x73\xb4\x2d\x6d\x05\x8d\x56\x26\xaf\x84\x2d\x0d\xa7\xe8\xea\x93\xfb\x19\x8e\x2f\x7d\x71\x0b\x0b\x06\x32\x7f\x7a\xe1\x92\x9b\xbe\x80\x84\x12\x7f\xf4\xad\x36\xf5\xbc\xba\xe4\xd3\xc5\x25\x7f\x8c\xaa\x34\xe3\x6b\x0c\x0e\x4e\xe1\x1e\xaf\x67\xec\x5f\x46\xff\x2c\x62\xd1\x7f\x0c\x9d\x03\xdb\x68\xb7\x8c\xc4\xb3\x2d\x63\x75\x92\x36\x2c\xfe\xcf\x40\xd0\x5b\x2a\x61\x7f\x49\x22\x04\x6d\xa0\xa7\xb4\xcd\x65\x9d\xd7\x7a\x18\x7a\xeb\x73\x0c\x9c\xf6\x4d\xce\x08\xc7\x14\xc1\xb2\x62\x26\xcb\x4b\x60\x62\xae\xc9\x20\x4a\xd9\x8c\x74\xb4\x52\x4a\x51\x72\xe4\x19\x88\x34\x2f\x45\x79\xe6\x31\x74\xb1\xf4\xd1\x09\xe4\xcc\xcf\x7e\x74\xa3\xef\x38\xe0\x47\x8f\x41\x46\x89\xc4\xec\xa0\x4b\xa3\xb4\xaf\x8e\xda\x81\x14\x06\x82\x18\x0c\x45\x35\x16\x08\x81\x48\xe4\x7e\x62\xb3\x50\xaa\xa6\x96\x18\x51\x32\x56\x4a\xb3\x10\xaa\x68\xc9\x3a\x90\xf9\xd9\xb6\xd2\xc8\xd9\x6b\x20\x06\xa5\x6d\x03\x2c\xe1\x9c\xb1\x28\x89\xf8\x23\x89\xa3\x67\xe7\xee\xb6\xa0\xb7\xed\xf2\x4d\x9c\xbc\xfb\x16\x44\x56\x2a\x69\xb1\xd3\x52\x5b\x90\x6a\x5e\x9b\xfa\xc0\xa5\x52\x56\x79\x55\x6a\x6d\x85\x67\xdc\x5b\x5f\x0b\x40\xa3\x5d\xe0\x59\xa8\x83\x5e\xe4\x3f\x88\xee\x36\x9e\xe1\x2d\x97\xf0\xfa\xfb\x37\x37\x97\xbc\xcb\xb7\xb7\xf7\x20\xa4\x61\xde\x6e\x7f\xe1\xdb\xdb\x9b\x90\x2e\xbc\x7d\x13\x27\xa1\x09\x00\xce\xae\xef\x9d\x2c\x6b\x57\x6a\xd9\x8b\x61\xe7\xd0\x51\x76\xc8\x0f\xb6\x38\x4a\x07\x6a\xc3\x2d\xf4\xb3\xef\x61\x67\x9d\x6b\xfb\x91\xd0\x7d\x1a\xf6\x8f\xa1\x3d\x5a\x80\xcf\x3a\xa9\x7c\xdd\x5b\xb0\xba\xe7\xfd\x32\x8f\xea\xb4\xae\x4e\x9f\x7b\x27\x01\x5b\x5a\xdf\x7a\x4d\x6b\x9e\x5b\xc0\xe2\x06\x2d\xa5\x1f\x33\x3a\xb6\x9b\x9e\x7d\xfd\x33\xfb\x03\x11\xfc\x97\x23\x78\x6e\xff\x1f\x83\xcd\xec\x87\xeb\x38\xe2\xb1\xeb\x5d\xdb\xae\xc1\xbc\x13\x52\x1c\x77\xe5\x66\x7e\x63\x51\xab\x8e\xbd\x75\xc7\x61\xc2\x54\x87\x51\x4c\xbe\x43\xdd\x4e\x86\x82\x8c\x3b\xd5\xb5\x03\xe9\xb9\x49\x2a\x5f\xb5\x1a\x14\xc9\xf0\xd9\xf8\xc8\x37\x12\x50\x85\x16\xe6\xe7\x8c\x8d\x47\x1c\x46\xd1\x94\xb9\x05\x3c\x8a\x83\xde\x73\x13\xce\xc3\x3f\x7b\x39\xe7\xd7\x54\xfc\xb7\xb7\xf7\x6f\xaf\x69\x9d\xcf\x29\xb0\x6f\x6f\xef\x13\x78\xb4\x55\x25\xb8\x80\xc8\x32\x25\x1b\x6e\xe2\xbc\x35\x83\x2b\x0d\x57\xdc\x94\x42\x56\x5c\x5f\xa6\xd7\x55\x95\x51\xe2\xcc\x93\xd6\xbb\xd9\x02\x14\x47\x9b\xdd\x4b\x7f\x6a\x46\x50\x9d\x51\xd2\x79\x3e\x58\x40\x03\x5f\x77\x32\x3e\x8a\x50\x0f\xfa\x26\xf4\xeb\x3c\x21\xbc\xf7\x6f\x22\xf0\xf1\xed\xe7\xf9\x8a\x9e\x29\xff\x7f\x4c\x46\xa0\x0b\x5c\x11\x08\xe4\xb9\x8c\xb5\xf5\xa3\x9f\x46\x10\x41\x6c\x25\xb5\xc8\x37\xbe\x21\x20\xaf\x8e\x1d\xac\x64\xa5\x54\x55\x91\xbd\x2d\x39\x12\xda\xf6\x78\x61\x8f\x51\xce\xac\x26\x7e\xf6\x47\x72\x14\x99\x03\x19\x40\x38\xb7\x0d\x90\xeb\xe4\xe7\x54\x6f\x67\x68\x95\x54\x37\x3c\xe8\xf9\xbc\x0b\xd5\xb3\xcb\x7f\x9f\xb7\xfb\xb7\x5f\xf9\x5a\x05\x48\x38\xc6\xfb\x24\xf3\xc7\x40\xf5\x4f\xce\x53\x52\xad\x61\x08\x48\x9f\x7d\x95\x9e\xa7\x1d\x52\x1b\x39\x80\xb2\xf6\xe9\x55\x14\x47\xfc\x91\xde\x98\xa4\x89\xfe\xee\xb5\xba\x1b\x44\xb9\x76\xfb\x77\x3f\x3c\x4d\x4e\x14\x36\x94\x5d\xa4\xf3\x1c\x94\x60\x40\x3e\xf2\xda\x5b\x5f\xa0\x18\xf9\x36\x56\x08\x19\x46\x63\xe8\x4f\x5e\x49\x80\x87\x4f\x36\x69\x78\x9e\xd5\xa2\x32\xfd\xac\x9c\xf5\xa7\x20\x0b\x61\xfc\x58\xe9\x00\x88\x8b\x9f\x70\x08\xaf\x43\x5d\xe4\xd9\xba\xf8\xca\xb2\xb8\x7d\xbe\x2c\xe2\xa1\xb3\x4d\xa3\x78\x29\xad\x50\xa2\x15\x75\x4c\x3a\x37\x1d\x45\xc5\x0d\x77\xa5\x92\x47\x51\x5d\x56\x45\x55\x39\x33\x9c\xcb\xa4\xf3\x4d\x6b\x01\x04\xc7\xcb\xa2\x18\x1e\xa3\x66\x06\xe6\x8c\x93\xc6\xab\x71\x7d\xd8\x82\x86\x59\x1c\xb8\xb3\x7f\xd9\xa6\xe4\xc9\xa6\xbb\x9f\xd9\x44\x27\xd7\x75\xa6\x2c\x8d\x93\x4e\x4e\xb2\x8b\xf5\x54\x81\x74\x90\x2d\xaf\x44\x25\x9d\x1c\xe4\xf1\xd9\x52\x9d\xcf\x34\x71\x9e\xf8\xd9\x02\x13\xd3\x8b\x55\xa3\x3f\x35\x27\xd0\x9c\xd3\x64\xf6\xec\x74\x5d\xab\x11\x79\xa4\x7b\x76\xd1\x86\x8f\x6e\x7f\xfd\xf9\xf9\xe2\xcb\xed\x36\x51\x02\x61\x2b\xa4\x0c\x33\xd5\xba\xba\x36\x52\x50\xea\xb8\x96\x5d\x59\xed\xa3\x35\x32\xb0\x75\x65\xad\x2a\xcf\x22\xb1\x5e\x77\x06\xd0\x38\x0b\x1a\xb7\x76\x18\x7a\x73\x74\x67\x9b\x58\xef\x46\x03\xd8\x6a\xd2\xc5\xa6\x22\xcc\xd3\x9f\xbd\xb4\xe9\xb7\x9a\x54\x75\x2e\x98\x24\x1c\x13\xb2\xe6\x55\x4c\x6a\x77\x3c\x5a\x29\x28\x0b\x5f\x29\xcd\xc5\x22\x57\x55\xf6\x74\xa6\x89\xf6\x6e\x58\xef\x50\xba\x19\x74\x9c\x06\xdb\xd5\x67\x79\xf9\x3a\x89\xf3\x75\x2d\xe1\x5f\xdf\x63\x92\x5f\x59\x4c\x5d\x67\x8f\x47\x55\x0a\x8c\x2d\xb7\xb2\x15\x2e\x66\xbd\xbd\xac\x26\x5b\xea\xcf\xab\xc9\xd6\x95\x33\xaa\x3c\x97\x49\xbb\xdd\x39\x11\x53\xfb\x79\x3d\x9d\x80\x3e\xe3\xa4\xf5\x72\x7a\x5a\x4f\x60\xa7\x2f\x5a\x50\xaf\x43\x64\xba\x65\xf9\x9f\xff\xf9\xbb\xd5\x1b\x5b\xdd\xf4\x49\xf5\xa5\x11\x96\x69\xd1\x4a\x7f\xba\xac\x94\xf0\x7b\x3b\x20\xce\x2a\xa1\x7e\xe8\xaf\xd3\x1f\xfd\xdd\x18\x85\x7c\x0a\x7d\xd2\x8f\xfe\xff\x45\xff\x2e\xfa\xf7\xd1\x7f\x88\xfe\x63\xf4\x3f\x47\xff\x39\x12\x5f\xd1\x46\x0f\x7e\x52\x7c\xb3\xa5\xf5\xdf\x3d\xb9\x4a\x0f\x6f\x0e\x6f\x7f\x39\xff\x79\x61\x24\xf8\xec\x71\x6d\xd1\xca\xcd\x73\xb6\xb1\x3a\xc8\xca\x0f\x03\xe0\x83\x19\xce\x9c\x62\x8c\xec\xf1\xd8\x16\x12\x43\x9d\xd5\x3d\x34\x4a\xc8\x5c\x31\x45\xc0\x6c\xf2\xa2\x82\x50\x51\x6c\xda\xba\xae\xeb\xde\x47\xa6\x80\x65\x03\x8a\x20\x2e\xe7\x7b\x92\xab\x9c\x60\x98\xab\xbc\x68\x74\xce\x34\x3b\x50\x4f\xf5\x71\xfd\xb7\x94\x69\x5e\x0a\xe4\x5d\x8b\x05\x36\x35\x2e\x29\x54\xa6\x43\xb9\x32\x13\x6c\x47\xc8\x18\xc2\x8c\x09\x53\xeb\xa3\x6a\x0c\x4b\x72\x04\xcb\xb1\xab\x6b\xdf\x1d\x8f\x7e\x68\x68\x5d\x17\x4d\x95\xb9\x63\x71\x74\x79\x3e\x3a\x6a\x03\x07\xc5\x7a\x6f\xd8\xa5\x6f\xf3\x3e\xfa\xf3\xe8\x9f\x45\xff\x4d\xc8\x0f\x5f\x48\x58\x42\xad\xff\x09\xe1\xfe\xe1\x2a\x35\x79\x25\xbd\xbc\xf8\xab\x37\x6f\x9e\x85\x76\x6f\xdf\x3c\x53\x99\xba\x7b\x4a\x86\xdc\x1d\x5a\x2f\x63\xe8\x5c\x83\x87\xf3\x31\xce\x4c\x75\x24\x53\xe3\x55\xdc\x08\x81\xcb\x72\xe9\xca\x12\x71\x1e\xd3\x3c\x03\xa7\x4f\x32\x8e\xb2\x6c\x30\x59\x21\x19\xe7\x9c\xf2\xb2\x8a\x6b\x83\xc2\x1b\xc2\x4a\x7b\x6e\x63\xe4\x62\xb8\x0c\x6e\xe9\x77\xa7\xde\x2c\xaa\xe6\x4c\x73\x50\x2f\xba\x2a\xb9\xe1\xa2\x43\x05\x96\xb8\x90\x39\x96\xa8\xf0\x47\x82\x8d\x81\xff\x0f\x6d\xff\x0f\x24\xc9\x8e\xe7\x87\xe1\x89\xcc\xae\xea\xbc\xdb\xbd\xdb\xec\x37\xfb\xde\xe4\x91\xc7\x5b\x34\xfb\xcd\x0e\x78\xf1\x23\x0f\xbf\xed\x9b\x19\xf0\xcf\x91\x20\xc5\x3f\x50\x90\x92\xc0\xa0\x18\x02\x25\x45\x08\x86\x42\x42\x48\x86\x10\x21\x07\x26\x4c\x98\x30\x61\xa6\x99\x66\x9a\x69\xa6\x99\x66\x99\x65\xa6\x59\x66\x99\xc5\xd7\x95\x68\x45\x21\xab\x7a\xaa\xe7\xcd\xdb\x5d\x9e\x4e\xbd\x9b\x55\xdd\x55\xf3\xaa\x12\xff\xbf\x7f\x3e\xdf\xcf\x07\xee\x21\xc6\x98\x29\x86\x25\x55\xa6\x85\x92\x52\xcd\x09\x27\x4a\xc7\xad\x52\x7e\x09\xa7\x64\xeb\xc4\xc3\xef\xcf\xfb\xdf\x5f\x64\x34\xfb\xd7\xd9\xbf\x4b\xb9\x87\xbb\x8b\x32\xf1\x39\xbe\xff\xdd\xdb\xdb\x37\xe7\xdf\x2f\x8b\x6c\xf9\x17\xe0\xcc\x84\xf6\x2a\x0a\x73\x0d\xf1\xb8\xa9\x3c\xa5\xc6\xaa\x71\xeb\x37\x1b\xcd\x79\xe8\xfd\x34\x98\x20\xb5\xf4\xc2\xe8\x51\xb5\x11\x16\xdd\x91\x9b\x9b\x10\x4b\xee\x18\x85\x82\xd3\xf9\x30\x59\xe7\x75\x53\x90\x46\x7a\xd1\xdc\xd8\xd8\x83\xd2\x08\x6d\xb7\xae\xef\x1d\x14\x5c\x83\xa1\xef\x5d\xef\xbd\xeb\x63\x00\xd8\x19\x1d\xc6\x79\x74\xee\x64\xfb\x89\x3a\x40\x06\x28\xe2\x93\x53\x4d\xd3\x74\xa2\x6f\x96\x98\x64\x79\x8e\x49\xfe\x32\xf1\x0b\xfe\xb3\xec\x5f\xa5\x38\xcc\x4b\xfb\x4e\x6d\x2a\x96\x46\xdf\xff\xf5\x9a\x5a\x50\xbf\xdb\x59\x21\xac\x1f\x75\x6b\x86\x2d\xe8\x36\x7e\xbf\x71\x8d\xb4\xca\x4b\x7f\x3a\x11\x62\x56\xec\x8f\x95\xbd\xd9\xcf\x93\xf0\x9c\xd5\x42\xf0\x79\x3c\xd8\xd0\xe8\xbe\x90\x9d\xf6\xaa\x5b\x9b\xde\x11\x46\x8d\x5e\x9c\x75\xed\x47\xb7\xb4\xd4\xf7\xd1\x03\x1a\x96\x96\x7a\xeb\x63\xab\xf9\xd7\x5a\x9a\x67\xea\x99\xdf\x34\xa9\x3e\x19\x5e\xf6\xea\xa5\xa2\x08\xbc\xcc\xd5\xef\x53\xb2\x3c\x39\x1d\xbb\xb0\x0f\x87\x70\xe4\x80\x50\x2d\x35\x57\x5c\x6a\x50\xb9\x80\x73\xb2\x9b\xa5\xc8\xe5\x66\x5d\x47\x91\x22\x67\xed\x3c\xc6\x46\x72\x65\x84\x54\x4c\x4f\x40\x21\xe3\x66\xdb\xbb\x36\xcf\xce\xb5\xec\x3c\xe9\x44\xff\x6c\x41\x8f\xbf\x64\xa3\x5f\x7f\xef\xfa\xf2\xc5\x85\x0f\x20\x0b\xa0\x0a\x47\x04\x28\x33\x4a\x0b\x2d\xa4\x06\xd0\x85\x0a\xe6\x7c\x37\x13\x91\xdb\xed\x17\x5f\x2e\xa4\x91\x42\x31\xbd\x03\x12\x51\xf2\xf2\xed\x37\x99\x78\xe6\xc5\x78\x8d\x05\x79\xf3\x93\x58\x90\x1f\xe3\x2e\x34\x90\x71\xbb\xa9\xab\xb6\xaa\x81\x8e\x1b\xa0\xe2\xd0\x59\x69\xac\x57\x9d\x6c\x4d\x3c\xe4\x8b\x56\xe7\x72\x4d\xbe\x50\x5c\x20\x4a\x8f\xc1\x7b\xa3\x9d\x53\xd1\x82\x66\x63\x9d\xee\x13\xe8\xc2\x98\xc3\x62\xdb\xad\x64\x5a\x5b\x59\xf6\xcb\x33\x4b\xfd\xc3\xdd\x63\x42\x01\x2e\xec\xfa\x77\x8f\x77\x0f\xe0\xee\xf1\x37\x1f\x3f\xdc\xad\x64\x8e\xb7\x1b\xce\x88\xe5\x76\xb3\x05\x02\xc2\x6a\x9d\xb9\xb8\x3b\x1a\xce\xf7\x37\xfe\x28\x6e\x30\xa8\xa3\x3c\x4e\x15\xca\x77\xd9\x39\xcf\x4c\x13\xc7\xc3\x3f\x39\x73\xd1\x64\xe0\x74\xce\x9d\x76\xfc\xe2\x9b\x0b\x7f\x64\xf1\x82\xe0\x3d\xf5\xc3\xed\xe3\x2b\x57\xf2\xe3\xa7\x87\x17\xda\xeb\x3b\xf0\xf1\xd3\xc3\x45\x76\x3c\xcd\x72\x3b\x95\x15\xa9\x3d\xf6\x10\x55\x95\xa9\x9c\x21\xd2\x8b\x5e\xe3\x32\x56\xa6\xae\x1c\xda\x56\x9a\x9b\xaa\x16\x96\x3a\xca\x04\x84\x42\x39\x95\x6b\x17\x3d\xa9\x74\x0d\x73\x2a\xb8\xe4\x7c\xee\x80\x8b\x66\x25\x5d\xf4\xcf\x59\xbf\xab\xa2\x88\x9b\xb8\xb1\x16\x46\x03\x50\xb0\xb6\xdf\x00\x99\xd7\x91\x70\x01\x5d\xdc\x8f\x92\xc3\x5a\x9f\xdc\x44\xc1\x85\x8a\x30\x7a\x0e\x2c\xe8\xf3\x24\xba\x75\x24\xc6\x0a\x7e\x63\x09\xd3\x82\x44\xb9\x60\xd0\x5c\x81\x93\x5e\xdc\x2a\xfb\x83\xec\x17\x67\x2f\xe9\xfd\xc5\x6f\x7c\xf7\x85\x8a\xd9\x05\xd5\x74\x73\x66\x64\x7d\xff\x11\x84\xd6\x49\xdf\x14\x4d\x08\xa0\x0b\xd2\x8a\x30\x0f\x46\x06\xed\x67\x13\xac\x32\x7e\xd5\xcb\xb8\x99\x0f\x2c\x47\xc7\xad\xea\x27\xbd\x5f\x3b\xca\x8d\x64\x3c\x7a\x20\x7c\xcb\x1a\xcf\x68\x17\x94\x2b\xa9\xd0\x82\x56\x7a\x4b\x0c\xaf\x65\xaf\x8d\xc9\x6e\x32\xf9\x4c\x0b\xbf\x16\xe9\xa4\xf9\xcb\x45\x17\x77\x41\x59\x5c\x21\x6b\x16\x80\xc5\xd2\xe9\x8f\x9f\xde\xde\xde\xbf\x0e\x95\x7e\xfc\xf4\x70\xe6\xea\x2e\x08\xb3\x49\x29\xc8\x3b\xab\x3a\x17\x27\x20\x6c\x40\x80\x83\x4a\x52\x4b\x64\x2c\xf7\x28\x40\x20\xaa\xd3\x58\x50\xd1\xc5\x03\x9d\x1a\xd7\x52\xd4\x02\x8e\xb0\x51\xbc\x5e\x0b\x0b\xeb\xe0\x22\x07\x78\x6b\xb4\x9d\x9c\xab\x4a\x17\x89\x32\xdc\xe8\x28\x55\x25\x0e\x03\x46\x16\x93\xc0\x2d\xd5\x8c\x27\x8a\x4c\x62\x4c\x06\x32\x9d\xd6\xb4\x4d\x7a\x27\x1f\xbe\x60\xf2\x4c\xe5\xca\x7f\x06\x1e\x3f\xd3\xf9\xad\xd2\xb1\x79\x66\x55\x29\x82\x2f\xf0\x71\x53\x60\x44\x0d\xac\x67\x03\xe0\x54\x1d\xe2\xae\xc4\x03\xc0\xa6\x76\xb0\x89\x26\x8e\x3c\xaa\x7a\xda\xc4\xb2\xf1\x7e\xe5\xf7\x54\x53\xc3\x18\x83\x48\x41\xa8\x11\xac\xca\x8a\x51\x85\xb0\x80\xba\xaa\xf5\xdc\xc6\x2a\x5a\x01\x0c\x18\xf3\x36\xcb\x8a\x8c\x3d\xf3\x42\xad\x75\xf6\x5d\xf6\x0f\x12\x8e\xe5\xf5\xed\x9d\xef\xe2\x11\x7c\x41\x71\xbf\x54\xfb\x3d\x7e\xfb\xe6\x21\xbf\x7d\xff\x4f\xc1\xdd\xfd\x99\x61\x03\xd8\x45\x3f\x94\x20\x22\x61\x1d\x8d\x32\x72\x0b\x68\x35\x42\x46\xeb\x52\x57\xc4\x05\x46\x2a\x66\x84\x2d\x1d\x27\x08\x58\x8c\x30\x57\x7c\xad\x95\xb1\x86\x31\x8c\xf1\xbc\x8d\x34\x36\x0c\x28\x10\x72\x13\xf7\x1a\x71\x58\xd7\x0c\x5a\x42\x98\xaa\x74\x15\xec\x3c\xc4\x9a\x2b\x32\x00\x19\x4b\x88\x24\x63\x89\x5f\x09\x9c\xf6\xae\xd4\xc7\x7f\xf9\xa3\x36\x9c\xba\x38\xd5\x2a\xbe\x70\x6f\xbe\x3f\x35\x60\x7d\xfb\xfe\xdd\x87\x17\x7a\xc5\xfb\xc2\x87\xa5\xa3\x31\x37\x18\x2e\x1d\x3d\xef\xf1\x08\x28\x45\xb5\x83\x21\xea\xe7\xac\x22\x74\xdc\xd4\xa0\x8b\xd5\xe0\x25\xcf\xdd\xda\x32\x23\xad\x38\x0d\xb4\x86\xc8\x52\x88\xaa\xb2\x64\xc4\xa0\x92\x51\x52\x57\x06\x9d\xee\x16\x26\x39\x73\x0e\xb2\xdc\x67\xd9\xaa\xc8\xce\x3c\xaf\xf8\x9c\x9f\xfd\x97\x17\x9e\xd7\x2f\xc9\xf3\xff\x4b\x69\x5e\xa7\xd1\x3b\x07\xb4\x07\x5d\xe4\x79\xc9\x6d\x5d\x45\x07\x60\x15\x37\xc4\x34\x34\x91\xbc\xaa\xb8\xdf\x68\x5f\xb7\x39\xd7\x47\x61\x16\xa5\x81\xf3\x95\x48\x5e\x51\x0c\x1c\x68\xd0\x5d\x48\x5e\x61\xf3\x75\x92\xd7\x2a\xda\x2f\x49\x5e\x57\x79\x9b\xea\x8f\x5c\xf6\x8b\xa4\xf3\xf8\xff\xcf\xfe\xea\x6a\x1c\x16\xa5\xf3\xc7\x8b\x2d\xff\x85\x41\x70\xad\x14\xf1\x82\xbc\xfa\xf6\x61\x95\x79\x30\x44\x9a\x97\x4f\xd5\xd6\xef\xe3\x00\x6a\x07\xe0\x73\xd6\x1a\x91\xe4\x4e\x85\x57\x53\xae\x34\x17\x52\x46\xca\x89\xc6\x62\xe3\x0b\x1a\xc2\x71\xf0\x6b\x67\x5c\x70\x29\x7f\x33\xa7\xcc\x85\x3d\xf9\xeb\x3a\x36\x80\x77\xca\xca\x0d\x18\xa9\x17\x5c\x29\xa5\xa9\x56\xe4\x48\x8a\xf1\x89\x49\x99\xe5\x99\x7f\x66\x45\x48\x67\xef\xdf\x7a\x7d\xe6\x27\x22\xce\xef\x13\x53\xfb\xa9\xaf\x4f\xde\x68\x68\x8e\x87\x32\xdf\xcd\x13\x40\x3b\x18\xf7\xd1\xb3\xbc\x9e\xfb\x75\x15\x6d\x22\x4d\xb0\xf3\x6e\x88\x75\xec\x28\x0f\x92\xf3\x9c\x0f\x27\x9b\xa2\x7d\x66\x37\xe4\x6b\x9f\x9f\x28\x0d\xbe\x7f\x77\xf9\xfc\xae\xd9\x34\xdb\xe6\x68\xca\x42\xcf\x06\x68\x00\xeb\x38\x44\xca\x72\x37\xe3\xdf\xf2\x05\xb7\x39\x3d\xdb\xa1\x7f\x90\x7d\x93\xf2\x28\xbf\x79\x51\xa7\x4d\xf3\xe5\xd7\xef\xc1\x69\xb6\x9f\xe6\x59\x82\xe1\xbc\x6c\xec\x9f\x65\x5d\x93\xd6\xf4\x87\xfb\x8f\xd7\xe0\xf6\xb5\xc4\xf5\x6e\x0e\xbb\x1a\xcd\xcd\xa0\xdb\xbc\x8e\x1a\x64\x80\x25\xdc\x29\x08\x81\x10\xbf\x1b\xc7\x30\x8e\x13\x20\x34\x4a\xa7\x9d\xd3\x7a\x6d\xb4\xf3\x5e\x8b\xc4\xca\xb4\x35\x87\x1c\xe5\x78\x76\x60\x1f\x03\x50\x5b\xd7\xa0\xc6\x21\xdc\x7b\x1f\x0f\x49\x18\xde\x83\xd2\x77\x71\x38\xb6\xbe\x2b\xcc\x3c\x80\x3e\xbb\x05\xc3\x4f\xb6\xe5\xec\x41\x80\xfc\xdc\x96\xe2\xfe\xee\xfe\xdd\x55\x5b\xee\xaf\xda\x72\xff\x65\x5b\x30\x81\xa0\x9c\x29\x80\x10\xcd\xac\xec\x75\x93\x53\x1f\x27\x00\x81\x14\xc8\x22\x01\xa6\x40\x59\x17\x77\xbb\x5d\xd8\xed\xe2\x1e\x18\x1e\xab\x85\x14\xf2\xaa\x45\x63\xdc\xe9\x43\x8e\x2f\x2d\xf2\xbf\x57\x7b\xa6\xdf\x3a\x36\xf7\x57\x63\x53\x3c\xdc\x3d\xfe\x54\x7b\x7e\x34\x36\x1c\xc1\xc3\xac\x40\x09\xd1\xac\x46\xd3\xe7\x99\xdf\xed\x80\xe3\xc8\x21\x06\x86\x40\x49\x13\x0f\xd3\x14\xb6\xdb\x03\x10\x3c\x22\xaf\xbd\x7f\x35\x38\x9b\x38\x5d\x0f\xce\x4f\x35\xa5\x3f\x86\xa6\x29\xd4\x3c\x82\xd3\x99\x51\xe0\x84\xb3\xe2\xd9\x2a\xfb\x65\xc2\x66\x26\x50\xd2\xbb\xc7\xaa\x48\x40\xd1\x64\x97\x7e\x73\x49\x65\xbd\xbf\x69\x1a\xe5\x55\xc8\xeb\xa0\x3b\xa7\x8d\x77\xf1\xc0\x01\x34\x72\xce\x82\xd1\x34\x8c\x72\xcd\xe3\x2e\xf6\xf4\x74\x12\xe3\xa3\x8f\xd3\x26\x1e\xec\xa1\x8f\x87\xce\x0f\xa7\xb9\x9f\x9b\x27\x29\x94\x75\x4e\x25\x4c\xce\x90\xbe\x9b\x7d\xf5\xbb\xf3\x1f\x7d\x37\x0f\x2a\x48\x9f\xb3\x46\xf7\x41\xbb\xe0\xe3\xc0\x01\xb3\xea\xd8\x35\xce\xd1\x6e\xab\xd6\x2c\xc5\x16\x01\x07\x25\x39\xf6\x71\x3b\xc5\x9d\x05\xe5\x18\x77\x83\x1f\xd3\x97\xeb\x27\xc1\x85\xb1\x5a\x65\xd9\x2a\xd5\x23\x92\x73\xae\xee\xcf\x53\x8e\xe9\x9a\x7b\xf5\xc5\x22\xb9\x7f\x73\x01\x62\xdc\x3d\x56\x09\x4e\x9b\xf2\x12\x6f\x2e\x2e\xf0\xed\xaf\xdf\x6f\x01\x09\x0b\x1b\x07\x15\x9a\xa1\xe3\x1e\xb8\x38\x2a\x2d\x84\x54\x12\xf4\x95\x2f\x81\x8c\x8e\x47\x21\x81\xe2\x51\xd9\xf4\x46\x6e\x8c\x56\xca\xaf\xba\x71\xb4\xad\x69\x1d\x37\xd2\xb6\x31\x10\xa6\x04\x89\x9a\x01\x17\xbd\x74\x31\xb4\xd6\x83\x0c\x78\xc2\xb5\xa4\x51\x29\xab\xac\x3d\x9d\xf3\x4d\x11\x6e\x45\xb2\xf3\xde\x24\x1d\xb3\x97\x09\x76\xff\x1a\x45\xf2\xfe\x26\x13\xa8\x81\x3c\x37\x3d\x0f\xa0\x09\x3f\x98\x70\x23\xc3\x51\x28\xea\x89\x5a\x3b\xed\x89\xb7\x35\xf1\x7e\x01\x4f\xb6\x21\x41\xf2\xb2\x9b\x8c\x3f\xb3\x7c\x73\xa5\xa9\x9e\xb4\x23\x3e\x53\x92\x9d\x3a\xe7\xee\xe1\xc2\x05\x77\xba\x42\x5e\x4a\x8a\xa1\x96\x94\x2d\x11\xac\xa4\xfc\xb3\x5f\xb3\x27\x15\x15\xc2\x4a\x33\x9a\xc3\xb8\xdb\x29\x65\x81\x2d\xe8\x76\x1e\x77\xf3\x30\x65\xa7\x71\x70\xcf\xec\x06\x27\x5c\xcc\xcf\xb2\xbb\xec\xdf\x64\xff\xf3\x35\x2a\xe6\xa5\x94\x7e\x89\xce\xa4\x24\xf2\x4f\x55\x24\xfe\xe5\x99\xf7\x22\x09\x5a\x27\x16\x23\xf0\x99\xe7\xe2\x33\xbf\x51\x31\xb1\xe8\xe7\x03\x02\x2d\x10\x1e\x53\x4b\x9f\x33\x82\x1c\xc4\xb1\x37\x90\x58\x82\x54\xbe\x0d\x0e\x10\x21\x20\x86\x0c\xa2\xb8\xe3\x48\xca\xaa\xd6\x14\x9a\xaa\x1d\xa1\xa4\xa3\x07\xaa\xe1\x83\x14\xb3\x06\x98\xf3\x54\x1e\xbd\xc5\x54\x08\x21\x1b\xa4\x19\xe5\x6b\x63\x79\xed\x04\xb6\x82\x49\xc2\x04\x11\xac\x13\x94\x30\x89\x8c\xe1\x47\xc7\x79\x65\x4a\x9a\x4f\x2d\x2c\x11\x42\xc8\x7a\x84\x20\xaa\x14\xf7\x47\x7e\x83\xb8\xd2\x84\x1d\x47\x84\x31\x31\x46\x32\x2a\x19\xc7\x1a\x12\x84\xb2\x73\x8d\x09\xbf\xc9\xce\x9a\x6f\xbf\x48\xd8\xb0\x87\x6b\x44\xed\x9b\x2b\x4a\xfc\x37\x2f\x7b\xeb\xb5\x60\x79\xb1\x0f\xf3\x18\x58\xbe\x4d\x98\xc8\xc5\x5c\x38\xc0\x1a\xa8\xa3\x07\xb2\xaa\x99\x52\x1b\xd6\x81\xd1\x19\x65\xdc\x9a\x3c\x67\xc6\x80\x2c\x8e\xb3\x02\xce\x45\xe3\xe2\x86\x4b\xe7\x18\x89\xbd\x0e\xc6\x8b\xa0\xbd\x6d\xcc\x69\x3e\xb6\x85\x4f\xf3\xf1\x8f\xce\xf3\xf1\xcc\x52\xba\x80\x97\xae\x6b\x7b\x6e\x45\xf8\xc1\x35\x37\xde\xb2\x96\xf2\x79\x90\x34\x10\x11\xbb\xf4\xb4\xe2\x91\x2e\x78\x9d\x26\x10\xaf\x01\x51\x86\x19\x4d\xa4\x66\xa7\xf5\x7a\x93\xb1\x67\x79\x23\xd7\x3a\x5b\x5d\x31\xba\x2e\xe9\xdd\x6f\xde\xbc\xcd\xc1\xdd\x2f\x93\x41\x9b\xdf\xae\x1f\xce\x06\xe1\xc7\x4f\x45\xca\x00\x2d\x30\x4b\xb0\x39\x1d\x65\x0d\x0e\x9d\xf5\x4d\x9c\xb8\x42\xa5\x2f\x31\x1a\xbd\x50\x46\x0d\xae\xf7\x50\x38\x9e\xef\x35\xf3\x54\xad\xb5\x1f\xf5\xd0\x47\x1b\x4b\x60\xf2\xb2\x9e\xe5\x7c\x88\x5b\x42\x0f\x28\x4e\x94\x52\x21\x83\x91\x9b\x7d\xde\xd7\xd1\xc6\x11\x03\xbc\x8d\x53\xec\x28\x90\xa0\xce\x6e\x32\xf5\x2c\x6f\xca\x35\x4e\x27\xc3\xdf\xca\xfe\x6c\x61\x69\xb9\x5a\x3d\x09\x34\x73\x65\xeb\x01\x1d\xf2\x4d\x67\x15\xea\x1b\xa6\x50\xdc\xb2\x1d\xfc\x0c\xfe\x8d\x0a\x74\x37\xf6\xc9\xc6\x96\x50\x6b\x38\x07\xdb\x58\x2b\x2f\x6e\xfc\x38\xef\x87\x79\x3f\xa6\x7d\x4c\xde\x88\xc4\xff\x7e\xf2\xf7\xfe\x7c\x51\xa6\x5d\x6c\xb3\x0b\x87\xdf\x75\x15\xcb\xfd\xe3\xb9\xa7\x16\x75\xab\x84\x47\xf8\xe8\x81\x5b\xb8\x25\xe8\x71\x00\x2a\x1a\x30\x2a\x66\x89\x06\x1b\xc9\x1c\x51\x91\x7b\x21\x71\x69\x4b\x36\x7a\xd1\x5a\x4c\x2d\x5b\xe9\x94\xb7\x8c\x8d\xf7\x40\xce\x7b\xdf\xb0\x10\x54\xb7\xa5\x9b\x3e\x32\x42\x46\xb4\xb3\x54\x80\x09\xc5\x69\x60\x53\xf2\x4b\xe4\x0d\x4d\x3c\x05\x97\x48\xc4\x12\x63\xba\x80\xdb\x5e\xf6\xad\xab\x6d\xf7\xdc\x3d\x23\x28\xc3\x30\x6c\x82\x36\x01\x64\xd1\x6c\xc0\x21\x44\x17\x38\x63\xdd\x26\x06\xa0\xe3\xe1\x00\x4c\x74\xa7\x6b\xd5\x0f\x83\xdb\x6d\x37\xa2\x6d\x5d\x77\xe4\xd6\x16\x98\x20\x2b\x3b\xb7\x3b\xfa\x71\x9e\x36\x19\xc8\xe4\xf3\x78\x43\xd6\xf5\x69\xcd\x24\xb5\xf4\x04\x7c\xbd\x44\x62\x4e\x77\x73\xb3\x7a\xff\xee\xee\xcc\x6f\xf8\xe6\x5c\xcd\xd9\x14\x2a\x7a\x53\xb9\x12\x6a\xe6\x20\x26\x94\x0f\x6d\x1d\x75\xac\x20\x70\x1a\x22\xcc\xb4\xaf\x5d\x09\x05\x8d\xcd\xba\xf6\x47\x0f\x08\x08\x75\xe7\xbb\x0d\x71\x66\x68\xf8\x0e\x13\xef\x65\xc3\x01\xc5\x46\x4f\xbd\x02\x16\xec\x61\xdf\x86\xa6\xe0\xa9\xc6\xef\x74\x0e\x65\x6b\x99\xfd\x9d\xec\x31\xfb\x47\x57\xfc\x16\xe9\xb6\xbe\xfd\xc2\x37\x2e\x96\x2d\xf0\x73\xb1\x76\x02\xa6\xbf\xf9\xf8\xe9\xe4\x17\x17\x96\xfb\x0e\xa8\x18\xb6\x41\x59\xe7\x83\xd7\xc3\xc9\x33\xd6\xbe\xc1\x40\x93\x80\x80\x11\x76\x94\xc2\x75\x7b\x36\xba\x3d\x23\x1b\x50\x75\x86\xc5\x03\xc1\x62\x2d\x3d\x84\xce\xd7\x4a\x7a\x2d\xf6\x00\x6d\x8d\xb1\xa3\x37\x55\xe9\x8f\x9b\x4a\xab\xc9\x49\x4f\x99\xa3\x1e\x0b\x65\x8d\x8b\x46\x05\xc5\xd1\xe2\xab\xa9\x93\x2d\x94\x8b\xec\x21\xcb\xde\x2d\x3a\xd7\x1f\x5e\x92\x89\x17\xde\xc6\x44\xff\x97\x74\x5d\xde\xe7\xb8\x9d\x28\xd8\x6e\x66\x5b\x90\x1a\x59\x02\x8b\xea\x78\x10\xda\x09\xaf\xd4\x00\x32\x34\xb7\x71\x68\x05\xa0\x28\x32\x2e\x30\xf2\x54\x59\x42\x30\xe7\x56\x53\xca\x38\xc7\xbc\xf4\x15\x68\x55\xdd\x33\x2b\x78\xfa\xfe\x82\x27\x2c\xc5\xaf\x2f\xf6\xe4\xf9\x4b\xff\x0c\xbc\x5d\xbe\xf5\x2c\x30\xf3\xf9\xde\x6e\x32\x02\x8b\xfa\xb8\x37\x5e\x31\xcf\x65\xaf\x35\x9f\x6d\x3c\xb4\xa6\xf7\x68\xbf\xe1\xbe\x91\xc0\x4e\xf3\x50\x20\x88\xd6\x96\x71\x17\x38\x57\x5c\x51\x52\x95\x81\x81\xd1\x93\x16\x63\xcb\x30\x6f\x28\x71\xd6\x39\x82\xaf\xfb\xc1\x9d\xee\xe3\x47\xfd\xf0\x67\xe0\x57\xe0\x8b\x9e\x58\xdf\x5e\xba\x62\x3b\x9b\x82\x22\x1c\x18\xca\xf7\xc7\x3d\x24\x88\x9f\x3a\x43\x0f\xa0\x44\x73\x13\x47\x3a\x00\x8a\x76\x1b\xae\x09\x72\xcc\x38\x4a\x30\x17\x0e\x11\x78\xea\x0d\x41\x59\xe5\x2b\x30\x62\xb9\xe1\x96\x20\x9e\x65\x39\x30\xb9\xbe\x85\x6b\x9b\xc1\xd4\x23\x6f\xaf\x45\xbe\x3f\xbd\x12\xf9\x4e\xb0\xc5\x85\x23\xb2\x50\x1d\xca\x25\xb7\x4c\x40\xc5\x50\x5d\x1e\xc5\xaa\x12\x8d\xb0\xd0\x49\x0a\xcb\x1f\x0e\x60\x80\x75\xe3\xb4\x0b\x6b\x4b\x79\x1c\x6c\xe5\x2a\x62\xa3\x8b\x3b\x5d\x3b\x88\x45\x6e\xc8\x9e\x70\x27\xd9\xa9\x1f\xe8\xc9\x27\x2e\x68\xf6\xfd\xb9\x1f\xde\x7d\x65\x3e\xbc\xbd\xcd\xc0\xfa\xf6\x2e\xf9\x48\x60\x17\x1a\x9d\x67\x20\x9b\x59\x7e\xa8\x61\xc0\xb0\x60\x33\x15\xda\x49\xa7\x6d\x7b\x30\xf3\x2e\x1e\x9a\x09\x4c\x38\xf6\x71\xc7\x07\x4a\x5c\xe8\x3c\xc1\x98\x71\xef\x34\x37\xca\x30\xab\x02\x28\xc1\x26\x98\xb8\xb5\x4e\x90\x97\x18\x02\xb9\x75\xeb\x90\xfd\xe2\x9a\xd7\x76\xb9\x93\x5b\xf7\x43\x36\xe8\xa6\x80\x35\x6c\x70\xbd\xae\xed\xdc\xcd\x3c\x36\x16\xc0\xbc\xcd\x03\x42\x98\xa4\x1a\xe1\x3f\x2e\x60\xc2\xe9\x88\x97\x1c\xd3\xc5\x1e\x5a\xbc\xe2\x4f\xd9\x7f\x9b\xfd\xc7\x25\xcf\x74\x6d\x0b\x7d\xf9\xf7\xb5\x30\xcd\xbb\x57\x35\x2f\x09\xca\xfc\xb0\xbe\x52\xcc\x7d\xf7\xe9\x61\x75\x5e\xcc\x0c\x4c\x11\xba\x6d\xfa\x01\xed\xc9\x4d\x3c\xff\x11\x3b\xce\x05\xe7\xad\x61\x52\xca\x5c\x18\x9e\x4a\x78\x25\x17\x42\x1e\x1b\x40\x49\xc0\xb9\xdf\x50\xd1\x06\xe9\xb6\x43\xf4\x0c\x94\x5d\x1c\xd5\x21\x3f\x59\x96\x6d\x0d\xed\x5a\x1c\x77\x39\x91\x71\x50\x71\x50\x39\xbe\xfa\xe3\x80\x53\x4a\x84\x59\xae\xb9\x60\xee\x34\xeb\x99\xd2\x9a\x3f\x67\xae\x32\xce\x4b\x4a\x3d\x17\x06\xf9\x8a\xa9\xb6\x67\xfa\x64\x96\x14\x99\x78\x6e\x72\xbf\xd6\x09\x7b\xfa\x39\xba\x7e\x3a\xef\x96\xbe\x3e\x93\x23\x25\xa1\xb1\xd3\x3b\x76\xb0\xc3\x00\x61\x59\x59\x58\xda\x61\xaa\x8d\x1e\x1c\x21\x3d\x5d\xa5\xd3\xff\x78\x88\xb2\xac\xb4\xaa\xb7\x13\x94\x9c\x04\x58\x83\xd1\x81\x43\x2c\xc1\x21\xf1\xce\x5f\xf4\xf7\x7f\x9e\x55\x59\x9d\x50\x53\x2f\x2e\xe4\xa5\x14\xf5\x0c\x1c\x7e\xf3\xe1\x4b\x65\xbf\xf7\xdf\x7d\x26\x0c\xfa\xf8\xe1\xd4\xdf\xef\xae\xe5\xfd\x7e\xf3\xe9\x37\x9f\x3e\x3e\x7e\xfa\xcd\x3f\x03\x2b\x49\xc1\xe6\x69\x04\x63\x55\xc7\xa1\x50\xc7\x10\x72\x32\x8f\x05\x77\xc7\x2e\x8c\xf9\x3e\x6e\xaa\x92\xa1\x4e\x29\x1d\x42\xc3\x5d\x57\x1a\x0f\x11\x14\xac\x46\xbb\x38\x50\x40\x41\x5d\x6d\xe2\x8e\x03\x38\x55\xd0\x6e\x64\x9d\x7e\x70\x55\xfb\xb5\x0b\xde\x13\x1c\x87\x38\x18\x1e\xf7\x3b\xad\x77\x71\x30\xa6\x2c\xb9\xe6\x52\x68\x1a\x84\xe7\x3d\x84\xad\x29\x5d\x49\x99\x65\x8e\x04\x0c\xd5\xe9\x08\x86\x90\x61\x5d\x96\x65\x55\xe2\x93\xcf\x26\x52\x2d\xaf\xcb\xfe\x20\xfb\xdb\x0b\x72\xf6\x33\x7a\xe3\x1a\x64\x79\xb2\x82\x2f\x4c\x1e\xbf\x85\xc8\xe3\xb3\xd9\xfc\xf1\xd3\x7d\x21\x40\x5b\xc3\x86\xd4\x60\x7c\xda\xe6\xad\xc6\x42\x70\x25\x84\x97\x42\xaa\x46\x0c\x62\x1e\x42\x6e\x43\xd4\x08\x1c\xa4\x3c\x53\x74\x6b\x4c\x8d\xad\x6a\xcf\xa0\x2f\xab\x61\x83\x29\x1e\x02\x48\x31\xab\xd5\x2e\xe9\xd8\x78\x48\x19\xa3\x54\xf3\x44\xd0\x45\xa5\xd2\xb4\x8c\x06\xb8\x79\x67\xe7\x5e\xca\xca\x97\x1c\x78\xa7\x2a\x4c\x30\x0a\x03\xa6\x84\xd6\x4e\x85\xd9\x16\x15\xa5\x59\xb6\x2a\xd8\xb3\x4e\xfe\xf6\x65\x0d\xbe\x5b\xb2\x54\xa7\x99\xf6\xe1\xf1\xee\x45\x0e\xea\xd3\x62\xf7\x2e\xb1\xfd\xd3\xac\x78\x5f\x74\x61\x17\xf6\xe1\x28\xc9\x4d\xfd\xb4\x13\x2f\x63\x09\x39\xde\x91\xba\xe3\xfb\xa7\x1e\xd4\x72\x5d\xed\x00\x8f\xdd\x2e\x3a\xeb\x4d\x84\x7e\x88\x5a\x5b\xa3\x49\xe7\x7d\x48\x75\x96\x69\x6f\x5f\xeb\x17\x05\xd8\x74\x46\xff\x88\x63\xe9\xdb\xeb\x1e\xfd\x74\xf7\xa2\xea\xbb\x44\xb5\x2f\x8c\x34\x15\xeb\x77\xc0\x45\x03\xb6\x5a\x11\x06\x15\x66\x71\x10\x75\x6d\x39\x74\x65\xb5\xd9\xc3\x4d\x9c\x02\xe8\xa3\x05\xb6\xdf\x60\xb0\x49\xa4\x84\x76\xbf\xd6\x0e\x43\x17\x6b\x3f\xeb\x33\x57\xcf\x76\xaa\x28\x86\x6d\x87\x08\x26\x28\x40\x90\xcd\xb4\xe0\x1e\xec\x4e\x87\xf6\xdc\x8f\xe3\x98\xad\x0b\xf7\x2c\x6f\xbb\x35\x7d\x61\xfa\xfe\xfb\x09\xc7\x7e\x7f\xb6\x0d\xbf\x94\x39\x4d\xb7\x9b\xea\x47\xd2\xbd\x5e\xf8\x50\xef\x3f\x14\x63\x81\x63\x0b\x7c\xd4\x48\x05\x51\x59\x64\xb7\xbd\x3a\x78\xe0\x62\x9f\xca\x31\xe9\xe1\x00\x1c\xc8\x66\xb3\x3c\xaf\x69\x64\x61\xae\x76\xb0\x62\x0e\x8f\x92\x09\x90\xc9\x82\x07\x33\x1e\x0f\x5d\xd7\xc5\x24\x97\x03\xf2\xc3\x33\xbd\x55\xff\x65\xfc\x7e\x85\xf2\x8d\x8f\x9b\x7c\x1b\x07\xdf\x85\xd0\x79\x40\x67\x54\x02\xe4\x1b\xc4\x8d\x3e\xf3\xfb\x6d\xda\x36\xc7\x89\xdf\xef\x90\x8b\x79\xc8\xc7\x4e\x88\x99\xe4\x34\xda\x49\x02\x93\xa3\x2c\x03\x49\xbf\xa2\x5f\xa3\x33\x7f\xe3\xe5\x7f\x5f\x67\x99\x3e\x13\xbd\xdd\x8a\xe3\x3e\x9f\x66\x58\xa0\xb8\xa9\xb1\x67\x42\xb4\xb4\xd7\x71\x94\xc6\xc8\xda\xf5\x8c\x77\x4e\xb2\x35\xf2\x83\x1b\x7d\x13\xa4\x32\x56\x6c\xda\xd3\x89\x12\xe6\xf2\x64\x2f\x50\x5a\xc8\x79\x8a\x8a\x27\xc9\x4a\x94\xef\x4f\xf7\xa1\xd3\x3a\x2e\x4f\x67\xe5\xc2\x66\xf1\x6a\x3e\x7d\x5e\xc9\xc9\xfd\xbe\x7f\x73\x5f\xe8\x9b\x2a\xb2\x0a\xb4\x52\x72\x85\x3c\xc3\x71\x07\x83\x55\x52\x33\xab\x47\xf4\x9c\x05\xd0\x54\x11\xaf\x4b\x1f\xf7\x4f\xad\x94\x30\x40\x5e\x34\x63\xbb\x35\x43\xd8\x04\xb9\x03\xee\x49\xaf\x20\xa8\xd2\x9c\x5e\x74\xa3\x78\xf2\xbb\x7f\xf5\x12\x7b\x49\xf0\xe4\xb7\xdf\xbc\x4d\x88\xaf\x04\x45\x4b\xfe\x4a\x5e\xac\xf9\xc6\x59\xbb\x89\x7b\xd7\xf4\x7a\xd0\xd2\x1a\xe1\xb4\xdb\x6e\xe5\x6e\x18\xe3\x81\x1d\xc6\x46\x2d\xb1\x1f\x0e\x28\x40\x94\x45\xb3\x91\x20\x9b\xe2\x66\xda\x82\x9a\xc6\x76\x1f\x77\xb6\x69\x40\x19\x0f\xad\x6f\x41\x09\x32\xb0\xf0\x70\x64\x49\xf7\xbe\xd8\x25\x76\xbd\x0c\x5c\x48\x73\xf2\x75\x9a\x94\xf7\x77\xbf\xcc\x6f\xdf\x7f\xff\x27\xe0\xec\xc2\x8c\xd8\x08\x5c\x36\x95\xdc\x6c\xd5\x1c\x86\x83\x01\x1e\xb8\x4e\x79\xd9\x15\xbb\x23\xc7\x35\x1b\xe1\x73\x66\x99\x2c\x58\x74\x53\xdc\x58\x37\x80\x16\x74\xb1\xdf\x1e\xf8\x7e\x7b\xfa\xbe\x3f\xcc\xc7\xb3\xfe\xeb\x85\x5b\xeb\x5f\x9f\x71\x23\xff\x6b\xf6\x7f\x2c\x8c\xa7\x69\xf7\xf8\x1a\x18\xe4\xcd\x87\x87\x6f\xdf\x9e\x2f\xf0\x02\x49\xfd\x5d\xff\xf2\xcd\xc3\x67\xa2\xcd\xa5\xba\xfc\x74\xc2\x7f\xf7\x76\x65\xab\x52\x06\xaa\xa9\xab\xa1\x46\xb5\x72\xc6\x18\xd3\xcc\xfb\xbd\x3e\xfd\xcc\xac\xaa\x64\x43\x74\x8d\x5c\x85\x34\xae\x95\x5f\xde\x3e\x2c\xac\xf6\xb5\x2f\x36\xa2\x6d\xb6\xe2\x30\x3c\x67\xb1\x43\xa0\xda\x76\x80\x06\x1e\x4b\xd9\xde\xf4\x75\xc5\x86\x09\xb6\x8c\x22\x2e\xb5\x57\x5e\x06\x95\x0b\xef\x0f\xde\x1f\x42\x00\x87\xba\x62\xe3\x16\x0a\xfe\xf5\xf7\x63\x6b\xf5\x60\x08\x6a\xa8\xb2\xd0\xd5\xc2\x62\x61\xad\x58\xb4\xb0\xc5\x33\xcb\x87\xb5\x49\x7e\xed\xf7\xd9\x9f\x27\xfb\xf2\xf1\x3c\x67\xdf\xfe\xe6\xc3\x42\xc9\xfe\x26\x61\x32\x3f\x16\x8f\x77\x0f\x6f\xaf\x01\xab\x21\xe0\x81\x32\x22\xa0\x87\xbb\x52\x5b\x55\x4a\xd9\x40\xb2\xdb\x39\x0c\x4d\x8d\x15\x81\xa6\x26\x6b\x03\x37\x3f\x28\xce\x2a\x5b\xa2\xdc\x2f\x29\x4f\x05\x82\xcf\xa5\x99\x11\xd8\x22\x1f\x58\xe3\xe6\xbe\xe9\x68\xdb\x64\x7f\x54\xd4\x09\x0f\xea\xb3\x3f\x3e\xeb\x6d\xc1\x73\x15\xe6\xc7\xec\x9f\x24\x45\x83\x7f\x77\x61\x99\x5b\x78\x86\x6f\xdf\x7f\xbf\x58\x57\x6f\xbf\xd8\xe0\x5e\x11\x84\x7d\xf7\xed\xed\x5f\x9e\xc3\x15\xab\x17\x9a\x8b\x73\x5e\xc6\xf9\xba\x06\x1d\x44\x20\x3b\x32\x7c\x5a\xca\x1e\xc1\xe8\x2b\x51\xed\xf7\xc0\x81\x72\xd6\xe7\xe7\xda\x70\x6e\x64\x11\x18\xb1\x88\x47\x89\x7c\x0d\x02\xaa\x5d\x85\x80\x09\xf3\x26\x84\xa4\xea\x8b\xe7\xcd\xda\x23\x04\x0d\xc1\x73\x0f\x76\xd0\xb4\x0d\x26\x35\xdf\x49\x29\xe3\x28\xa5\x7c\xce\x98\x13\x4a\x48\xa1\x99\x92\x4c\xeb\xca\xc8\x5a\x6a\xa4\xe5\x7e\x76\x94\xe6\x66\x92\x71\x23\x12\x0f\xb6\x38\xc7\xa3\x7f\x91\xfd\xe9\xb9\x5a\xf6\x1f\xa6\x9c\xcd\x05\x7e\x73\x8e\x03\xfc\x0a\xbc\xc2\xe9\x5c\xfd\x71\x1d\x41\xba\xf0\x58\x15\x1e\xf8\x00\xda\x28\xc0\xf6\x64\x0b\x45\xdd\x9b\x1a\x72\xcc\x31\xc6\x44\xbb\xfc\x74\xe2\x2b\xce\x39\xc3\x54\x19\x50\x36\xb3\xf3\x3e\x37\xb3\xa3\x79\x16\x33\x3f\x4d\xeb\xcc\x18\x17\xa1\xb5\x60\x82\x88\x11\x4a\x8d\x20\x82\xf2\x30\x20\x42\x38\x33\x92\x09\x26\x7c\x2c\x8f\x0d\xe7\x85\x9c\x4d\x5e\xca\xd8\xab\x54\x47\x51\x14\xfb\x67\x96\x70\x13\xcb\x69\xbf\xb0\xf3\x9c\x4e\x81\x54\x77\xfc\x78\x07\x1e\xef\x1e\x4e\xcf\xb7\x2a\x6c\x9b\xad\x07\xaa\x89\x6e\xbb\x05\x66\xbb\x2a\x8f\xac\x9d\x79\xde\xb5\x45\x0f\x74\xf4\xf3\x92\x5e\xd9\x2d\xf1\x23\x56\x9c\xfc\xc4\x9f\x67\x7f\x7a\xd6\x5d\xb8\xea\x80\xef\x8b\x2b\x8a\xce\x0f\xf7\x1f\x1e\xae\x3b\x04\xec\x7d\x5d\x35\x5e\x3a\x1f\x46\x05\x2a\xbb\xf7\x4b\x41\xc9\x9c\x01\xb2\xcf\xf5\x39\x0a\x12\x9b\xb5\x45\x08\x29\xe7\x82\x9a\xac\xda\xc4\xa1\x6d\xdd\xe0\xdc\x10\xd9\x2c\x8d\xc9\x9b\x28\x00\x3c\xf9\x25\x80\xa6\xba\xb2\xbf\x7a\x39\x7b\x3e\x9c\x4c\x99\x97\x74\xe1\xdd\x2b\x3a\xd9\xd3\xab\xa9\xca\xf1\x3e\xe5\xc0\xef\x3f\x5c\x8a\x4a\xee\xbf\x05\x26\x65\x67\x3b\xd7\xc6\x8d\x4b\xbf\x62\xd0\xa6\xfa\x8c\x4d\xe2\x5b\xde\x99\xd8\xb8\xbd\x89\xbb\x66\xce\x42\xdc\x99\xbd\x8d\x8d\x19\x9d\x71\x2d\x60\x37\x83\xb1\xea\x70\x00\x04\x6c\x85\xb5\x91\x69\x6b\xad\xf6\x73\xe5\x9d\xf1\xfd\x76\x6a\x8d\xf5\x3e\xef\x10\x33\x14\x2a\x7b\xf6\xa7\xb2\xe9\x8b\xfb\x5e\x0e\xed\xff\x2f\xee\x3b\xb8\xc3\x72\xdf\x3e\x4e\xe6\x60\x63\x78\xb9\xef\xc6\x3a\x93\x90\xbc\x12\xec\x84\xf3\x11\x59\xe7\x9c\xf5\xc7\xad\x0f\xce\x8f\xbb\x7d\x6f\x5c\xeb\xf3\x1d\xe2\x86\x21\xed\x4e\xb6\x23\x3e\xeb\x25\xfc\xde\x5c\x8a\xe7\xc9\x75\x7a\x3e\x5d\xb7\x44\x6b\xa5\x98\x84\x96\xb2\xd9\x07\xad\x81\xf5\xd1\xed\x76\xc0\x1c\x66\x9f\x9e\x0e\xab\x70\x34\x3e\x3a\x21\x6b\x5f\x33\x70\x32\x3a\xa8\x2f\xdc\x34\x45\xba\x90\x27\xce\xd9\x0b\x89\x62\x9e\xe9\x67\x56\xa0\xb5\x3e\xc7\x06\xdf\xae\x6f\xef\x96\xae\x3c\x73\xa8\x25\x93\x31\xcd\xc8\xfb\xbb\xfb\x7c\x62\xd6\x9f\x9a\xbb\x0b\x71\xf4\x49\xde\x4f\x29\x02\x44\x38\x7d\xde\x5a\x3b\x54\xc7\xde\xc7\xee\x38\x3a\x57\x10\xc0\x3d\x40\x75\xe5\xd1\x0f\x0c\x24\x7e\xfc\x9f\x27\xae\x9b\xaf\xf9\xaf\x8b\x26\xe9\x7f\xfd\x7b\xf8\xae\x6f\x6f\x1f\x7f\xab\x50\xd3\x67\xa6\x16\x7a\xf2\x57\xfd\x90\x7e\x40\x12\x5a\x0c\xa9\xd6\x7b\x33\x6f\x3d\xdc\x41\x8b\x11\x68\xa2\x4a\x45\xf7\xa7\xab\x3d\xfa\x50\x43\xee\xc1\xf0\x32\xf4\x9b\xb5\x98\x61\x5e\xaa\x38\xe8\xb8\x11\x79\x3d\xd7\x79\x95\xfe\x18\xe5\x84\x24\x96\x94\x3b\x6d\xb4\x51\x8e\xe5\x19\x46\x6e\x67\xb5\xde\x69\x3d\xa9\x34\x3f\x41\x56\xb8\xdb\x2c\xf1\xd3\xa5\x5c\xf5\x87\x33\xdb\xd2\xf2\x98\x72\xec\xf7\xa7\x1e\xda\x34\x60\x08\x73\x9b\xd7\xe1\x87\xcc\xe7\x70\x6e\xd6\xa4\xdb\xef\xbb\x38\x9e\x2e\x40\xba\xfd\x69\xaf\x38\xd9\x46\xa6\xc8\x12\xcf\xd8\xdf\x3a\x79\xb5\x5f\x05\xba\xad\xde\x26\x1f\xf2\xe6\xed\xed\xaf\xdf\x01\xbe\x92\x3f\x34\xe3\x7a\x7f\xdc\x0a\xc7\x69\xcd\x05\x3b\x6e\xc0\x4e\xb5\xb1\x65\x00\x15\x03\xa8\x26\xb3\x7d\xce\x8a\xcc\x7b\x1f\x9b\x85\x93\x0e\x30\xa2\x3b\x1b\x64\x6b\x5b\xdb\xd9\x2c\xfb\x83\xa4\xdb\xef\xd7\xf4\xf7\xd5\xd5\xba\x14\x75\x7f\x7b\xa5\x2b\xf5\xf8\x13\xba\x52\xcb\x70\xad\xff\x0e\x78\x19\x30\x51\x6c\xa2\xca\xb3\x10\x4f\x67\x7e\x03\x0e\x51\xe6\x12\xd4\x71\x17\xcb\xb4\xc0\xaa\xb8\xcf\xb3\xd3\x63\xac\x7d\x55\x6e\xab\xda\xa3\x3a\xf9\x2d\xd7\x23\x48\x64\x0b\xfa\xb8\x2d\x5f\x46\x90\x5a\x11\x53\x64\x56\x6d\x00\x17\x71\xab\xa4\x62\x4a\x29\x84\x10\x44\x08\x11\xea\xb4\x51\x56\x39\x91\x23\x2c\x7b\xa5\xcb\x52\x4e\x4a\xed\x54\xf6\x87\xb9\x7f\x5e\xe2\x78\x17\x76\xd0\x93\x5d\xc6\xcf\x68\xde\xc5\xe3\x3a\xb3\x82\xad\x6f\xcf\xb6\xe1\xe7\x10\xf2\xfb\xbb\x87\x6f\xcf\x01\x9e\x97\xd6\xdf\xdd\x7f\xfb\x11\x7c\x48\xfa\x82\x09\xb7\x7b\x81\x01\xbf\xb9\x82\x40\x5d\x97\x5a\xaf\x0f\xda\xf6\x90\x31\xe8\x2a\x08\x9b\x96\xc7\xed\xe1\x60\x55\xed\x7b\x2a\x8d\xd3\x79\x0d\x03\xaa\x40\x1b\x87\x53\x33\xf5\x73\xd6\x85\x71\x1c\x81\xec\x7c\xa0\x02\x7b\xcc\x67\xe5\x29\xf1\x2c\x97\x0c\x79\x4c\x34\x41\x1e\xe2\xa2\x12\x86\x11\x58\x43\x87\x7a\x84\x28\x07\x5d\x30\x3d\x84\x16\x21\x9a\xd7\x32\x66\x51\xf3\x45\x23\xd5\x60\x26\xbd\x8b\xb6\xc3\x79\xe6\x9c\x73\xcf\x99\x3d\xfd\x1c\xbd\x0d\x22\x38\x4a\x3b\xc3\xbc\xd1\x8e\x79\x8d\xb5\xa3\x5e\x67\x49\x3f\x59\x26\xbc\xdb\xdd\x15\xdf\xd8\xc2\xc5\xb6\xc4\x41\x1f\x6e\xcf\x81\x91\x87\x0f\xf7\xef\x17\xbd\x75\x70\x95\x1f\x02\x17\x8c\xc6\x2b\xae\xb5\x57\xf8\x30\x09\x6b\x30\xb4\x14\x94\x4f\x01\x20\x84\x03\x68\x30\x9e\x50\x1d\x1d\x8e\x5d\xe1\x8e\x26\x5c\xb4\x3f\x00\x3e\x59\x29\x6a\x13\xb0\xec\x49\xa8\x54\xdc\xf7\x3a\xdf\x69\xa1\x85\x39\x6e\x3d\xe1\x5e\xac\x1d\xe3\xae\x77\x4e\x0a\xa7\xa2\x10\x52\xc4\x61\x4e\x2c\x59\xbd\x8a\x7b\x26\x8d\xe6\x34\xee\x61\x4d\x25\x6e\x05\xe3\x80\xf8\x60\xba\x40\xf1\xc6\xf1\x26\xcb\xd6\x09\xa7\xdc\xbc\xaa\x97\xfb\xf7\xaf\xeb\xe5\x7e\x1a\xbe\x7d\xfb\xfe\x9b\xd5\x57\x28\x2c\x4e\x5e\xcd\xa7\x2f\x18\x2c\x3e\xae\x08\xaa\x73\xf4\x04\xf3\xaa\xae\x3b\x0b\xd1\x00\x91\x62\xb8\x1d\xdb\xb6\x6d\x87\x79\xef\xa1\x6a\x00\x4e\x58\xec\xd8\x3a\xdb\x72\x0e\xad\x8d\x07\xd6\x31\xe3\x91\x31\x5a\xd7\x5e\x38\x66\x19\x41\x57\xc5\x72\x56\xbe\xae\x96\x33\x27\xb3\xf1\x75\xad\x5c\xbb\xab\xa1\xa7\xf3\x76\xfa\xa2\x50\x6e\xdf\x55\x65\xb2\xef\x12\x3f\x51\x93\xb0\x8d\x34\x31\xb6\xfd\xfb\xec\x3f\x66\xff\xe9\xd2\x03\x17\xa5\xec\xc5\x1d\xf9\xf6\xa2\x74\xf0\x02\xd5\x7d\xb8\xc6\x2e\x9f\x45\x93\x4e\x9d\xb6\xac\x8d\xbb\x6f\x1f\x3f\x3c\x7c\x58\x9d\x17\xc7\xcb\xb3\xc7\x35\x68\x8f\x62\x93\x68\x53\x3a\x5c\x87\x1a\x6e\xe3\x06\x94\x42\x6c\x4c\xc7\x1b\xed\xb5\x67\x4a\x39\xa9\x9b\x6d\x6d\x5c\x52\x71\x1c\xb5\xdf\x6e\x03\x40\xda\x9b\xe8\xb4\x37\x69\xcc\x3b\x82\x11\xe5\x8c\x61\x82\x9c\x39\xb8\xc3\x56\x34\x7a\x1b\xdd\xc9\x46\x04\xbc\xd5\x4e\x6f\x9c\x8e\x32\x76\x1c\x34\x60\xca\xb7\x84\xcc\xc2\x18\x13\x7b\x94\x90\x27\x5a\x1f\x4e\x0f\xd9\x82\x6d\xa3\x39\x7d\xc9\x49\x67\xe0\x15\xb9\xca\x59\x0a\xea\xc2\x44\x4c\x39\x47\x18\x12\x88\x7d\xc5\xac\x58\x20\x1f\xec\x3f\x0f\x42\x96\xae\x14\x60\x8a\x32\x6e\x38\x18\xc0\xbe\x28\x23\x02\xfc\xb8\x5d\x7c\xd1\x85\x4f\x6b\x58\xbb\x0c\x65\xff\xcd\x99\x43\xff\xf6\x0b\x0e\xfd\x0f\x3f\xe2\xd0\x5f\xbd\xff\x1e\x24\xfd\xff\xdb\xdf\x45\xa3\xbf\x5e\xfe\xd5\xe9\x3a\xe7\x24\x2e\x6f\x27\x52\xd8\x91\x6c\x76\x60\x53\x45\x98\xd7\xe5\x3c\x61\x6b\x10\x45\xae\x92\x71\x62\x8d\x8c\xa1\x06\x36\x0e\x35\x10\x71\x87\xc1\x16\xec\xc8\xb4\xab\x0e\x89\x15\xbf\xc6\x0c\x55\xa6\x16\xce\x71\x5f\x35\xae\x0a\x16\x81\x32\x36\x44\xe9\xae\xec\xc7\x6a\xab\x04\x6a\x1c\xed\xaa\xa1\xad\x7a\x4a\xf0\x61\xed\x34\x86\x8a\x18\x62\xa8\x61\x08\xd5\x90\x13\x4b\x18\x63\xc8\x60\x83\x0c\x52\xd0\xa2\xe3\xa0\xa9\xc6\x16\x6b\x62\xb1\x81\x15\x52\x38\x70\x2a\x4c\x6d\xa0\x4a\x97\x85\x44\xc3\x5a\x21\x83\x34\x32\xd8\x23\xa4\x19\x66\x63\xfa\x8f\x0d\x52\x65\x65\x61\xea\x4b\x9e\x62\x66\x17\x04\xfd\x17\xe5\xdd\xeb\xb4\x0c\xd7\xab\xef\xcf\x41\xb3\xf7\xeb\xdb\xeb\x11\x7d\x59\x9e\x9f\x05\x6e\xaf\xb6\xa6\xe2\xb4\x95\x82\x3e\xb2\x94\xfb\xdb\xce\x81\x0b\xa7\x75\xd8\x9c\x8e\xad\x09\x21\x67\x84\xc7\xc6\x72\x43\x71\x4d\x19\x8e\x1c\xf5\xad\x75\xd0\x88\xd8\x83\x7d\x34\xc0\x45\x5e\x54\xad\xd3\xce\x47\x68\x6c\x2b\xfd\x6a\xe7\x9c\x53\x4e\x3b\x4b\xcb\x5a\x93\x4d\x83\x30\xc1\xd4\x77\x54\xd6\x30\xf6\x92\x57\xbe\xa6\xa0\xa6\x4e\x38\x58\x59\x6e\x9d\x76\xea\xa9\xd5\x27\x97\x9d\x49\x2f\x1d\xcb\xb2\x55\x7e\x78\xe1\xd9\x79\x93\xfd\x83\xec\x43\x8a\x13\xbe\xca\xc1\x27\x19\xc4\x6f\x16\x7f\xf4\x97\xb7\x57\x64\x8b\xe7\x6a\xf8\x6f\xde\x7e\xf7\xf6\xe3\x9b\xfb\xf5\xe2\x34\xaf\x1c\x81\xa0\x7d\x9a\xc0\x58\xa3\xde\x63\xee\x35\x9f\x80\x0f\x55\x0d\x2c\x21\x58\xfa\x8e\x0d\xc1\xb5\xbc\x35\x9c\x41\xa8\x7a\xca\x84\xa3\xf1\x00\x29\xa5\x92\xd0\xb5\x55\xda\x7b\xc1\x62\x87\xbb\xee\x69\x2a\xaa\x36\x00\x06\x18\x62\x54\xc3\x6e\x63\x86\x46\x7a\xd1\x75\xc2\x8b\xe0\x3a\x8c\x34\x80\x61\x70\x13\xe0\xaa\xa6\x5c\x4b\xba\x60\xd7\x17\x6c\xe3\x57\x75\xd8\xbe\xf9\x49\x1d\x36\x7e\x9c\x0a\x1a\xbb\x1a\x39\x22\xa4\xd3\x8d\x8e\xa3\xd0\x4a\x12\xd7\x4a\x5d\x36\xae\x99\x72\x3f\xeb\x35\xf2\xf3\xde\x3b\x27\xb9\x31\x2c\x1e\x9c\x05\x30\x77\x73\x4d\x99\xd1\x52\x15\x74\x89\x92\x75\xe0\x90\xef\x17\x21\xb6\x75\xa6\x81\x48\xbe\xc7\x5d\xf6\x5d\xf6\x4f\xb3\xff\x2e\xfb\x0f\xd9\xff\x90\x65\x6f\x2e\x51\xef\x87\x14\xec\x7d\x7c\xff\xb0\x4a\x75\xed\x2f\xfe\xc8\x2b\x0b\xe8\x2c\x77\x7e\x11\xd9\xfe\x70\x7f\xfb\x05\xdb\xc8\x8b\x93\xef\x00\xab\xea\xd3\x61\x2f\x0c\x99\x8e\x7a\x44\x0e\xd0\x11\x56\x71\xca\x6d\xc8\x9b\x59\xe6\x6a\xf6\x2f\xda\xa2\x78\xde\xe0\x2d\xa8\x59\xe9\xa1\x89\x4d\x1c\x4f\xef\x06\x2d\x25\x57\xd0\x53\x1c\x49\xd3\x5c\x60\xf2\xab\x3d\xc6\x98\x2e\x04\x12\x96\x52\x90\x71\x23\xe2\x96\x29\xa6\x99\xaa\x61\x85\x0d\x6e\x18\x16\x79\x4f\xbb\xb9\x67\xac\x34\x25\x85\xdb\x7c\x3b\xf2\xb8\x4b\xb5\xd2\xb9\x3c\x6b\x2c\x5f\xac\xf8\x7f\xfe\x19\x93\x79\xe1\x55\x05\xaf\x19\x55\x5f\x85\x34\xbf\x2f\xbe\x9a\x0a\x1d\x42\x4a\xae\x8c\x4f\x13\x18\x62\x09\x0e\x71\x1b\x02\x40\xe1\x64\x12\xa2\x2a\xcf\x22\xc2\x9c\x21\xc7\x98\xea\x4c\x34\x41\xaa\x26\x69\x70\x68\xa1\x40\x3d\x46\x93\x57\x15\x5c\x1b\xe7\x5c\xac\xc0\xde\xb9\x39\x24\xeb\x3f\x3a\xc6\xbd\x92\x9c\x73\xc5\x04\x75\x0d\x70\x8a\xed\x30\x76\x94\xd0\x1d\x85\x56\x76\x9e\xa4\x39\x76\x0b\x76\x67\x6d\x8d\x85\xbb\xe4\x27\xd4\x35\x7e\xac\xab\xf1\xf6\xf5\xef\x3f\xa5\xae\xc1\xb7\x5e\x8b\x9b\x2e\xea\x00\xfc\xd1\x15\x46\x11\x17\x70\x98\xb1\x77\xc4\x79\x80\x48\xe8\x51\x97\x97\x4d\x20\x4d\x13\x6b\x57\x57\x7d\x48\xf6\xed\x26\xe2\xa4\xcb\x72\xc0\xe4\xac\xaf\x31\x5d\x24\x13\xcf\xfa\x1a\x60\xf3\x85\xb2\x86\x95\xec\xf4\xfb\x57\xf5\x35\x7c\x56\xe4\xf0\xd9\x5e\xc5\x67\x5e\xea\xe0\x2e\x71\x99\x6b\x14\xc2\xab\xb0\xc4\x37\xf9\x00\x36\x21\x71\x6e\xca\x1f\x36\x39\x89\x38\xf8\x9a\x6a\xa5\xb9\xe0\xca\x80\xb2\x20\xa1\xc6\x46\x69\x2e\x99\x34\x7b\xb0\xbd\x69\x9e\xe4\x99\xf8\xe6\xa6\x85\x9b\xd6\x05\xeb\x4d\x63\x0d\x20\xa0\x81\x43\xeb\x5a\xdb\xe8\xc6\x19\x40\xb3\x22\x6f\x9f\x6d\xaa\xfd\xf9\x3d\xee\xe9\x9b\x57\xf7\x54\x60\xd0\x24\xe2\xb4\x1c\x3d\x91\xbc\x8c\xd2\x86\x9a\x48\xa1\x29\x63\x42\x4f\xf9\xc1\x57\x58\x49\xcd\x18\x15\x7a\xf3\xa3\x5b\xea\x6c\xb0\x4e\x07\xa3\x01\xbd\xdc\xd2\xe9\x0e\x35\xa0\xa7\xf3\xb7\xfc\x6b\xdf\x93\x03\xf6\x12\xab\xea\xc1\x36\x5a\xed\x2a\x2c\xb9\x21\x84\x72\x3d\xe6\xbd\xaf\x90\xe2\x9a\x30\xc2\x4c\x7f\xb9\xa7\xd1\x7b\x40\x6e\x5a\x38\xb6\xae\xb1\x4e\x7b\xab\x01\x01\x2d\x1c\x1a\xdf\x5a\xaf\x83\xd5\x27\xab\xe0\xb6\x40\x67\x4d\xff\x3f\x48\xa8\xa3\xc7\x64\x63\xff\xdb\x57\xd6\xe7\xb9\xae\xf0\x8b\x84\xda\x55\x69\xe1\x4b\xc6\xf7\xfa\x08\xbb\x2a\x8d\x5b\x19\x0c\x41\xf7\xb4\x07\x03\x44\x35\x23\x04\xbb\xb6\x33\xb2\xaa\x2c\x43\xae\xac\xfb\x1d\xb2\x5a\xaa\x5a\x73\x4b\xc1\x46\x51\x25\xe5\xb1\x57\xd4\x10\x55\x0c\x9a\x19\xaa\x67\x23\xb9\x51\x56\x82\xed\x59\x49\x0b\xad\x2d\x97\xde\x33\x32\xeb\xb2\x12\x0a\xc7\xbe\x83\x10\x41\xe4\x5b\xcc\x08\x45\xc6\xb4\x75\xa5\xfd\x0e\x0d\x23\x4f\xc9\x03\x6d\x99\x35\x71\x70\x0d\x0b\xbe\x66\xc1\x29\x1b\x3b\xa5\x7c\xd4\x4b\x1c\x21\x4f\x1c\x8e\x61\xed\xb3\xc7\xc4\x16\x7c\xf1\xb1\xce\x47\xf8\x02\xde\x79\x95\x50\x4c\x21\x9f\x04\x43\x3c\x1f\xe2\x6f\xde\x5e\xaf\xd2\x8b\x16\x5f\xea\x07\x06\x7a\x1c\x60\x0d\x0e\xf3\xc4\x84\xd7\xcc\x0b\x01\x7c\x88\xde\x10\x67\xaa\x4a\x5b\x6e\x6a\xbc\x8f\x13\xd2\x2a\x1e\x42\x5e\x41\xd8\x8d\xb5\x11\xd1\x0e\xae\xde\x78\x60\xa3\x05\x43\xa4\x3e\x22\xb0\x8d\x3b\x84\xb5\x59\x67\x12\x33\xe6\x25\x29\x2b\x85\x9d\x8e\xfd\x68\x50\x55\x57\x35\x35\x8e\x11\x42\xa0\xe5\x7a\x04\x0c\x23\x58\x69\x26\x8f\x7b\x44\x94\x72\x3e\x91\x87\x3a\x4f\xb1\xd0\x59\x76\x53\xa0\xc4\xaf\x72\x1a\xf3\x0b\x5f\xd5\x4b\x86\xf5\xed\x45\x03\xea\x2a\x59\xb4\xbe\x7d\x39\x0c\x97\x42\x8b\x87\x0f\xff\x18\x9c\x4f\x93\x02\x81\x5d\x8d\x1a\x0c\xc1\xe6\x29\xf8\x82\x3b\x17\x3b\x42\xad\x52\xd6\xea\x56\xc5\x36\x50\x56\x3a\x8d\x86\x96\x29\xb9\xf5\xf1\xe0\x5c\xc8\xe1\x3c\x9d\xae\xd5\x96\x92\x93\x63\x28\x93\x06\x94\xd7\xdc\x6a\xc7\x9c\x76\xa0\x04\x41\xf2\x38\x20\xec\x18\x11\x00\x32\x6b\x46\x50\xba\x24\x05\xb5\x2a\xea\x67\x9d\x78\x53\x7e\x9d\x6a\xfa\x7e\x93\x7d\x7c\xc1\x14\x2d\xb8\xf0\xc7\x2b\x3e\xbb\xc7\x0b\x0e\x79\x49\x51\x2e\xce\xc2\x9f\xbc\x84\x57\x33\xde\x4f\x60\xdb\xf6\x7d\x88\x04\xb8\xa3\x02\x26\xd2\x30\x4d\x0d\x18\xbb\x01\x83\x01\xd4\x4d\x08\xa7\x85\xdd\xac\x8d\x87\xf5\xc6\xc5\x8d\x8f\x53\x98\xbc\x9f\x02\x80\x1e\x60\x37\x56\xa5\x9f\x5f\x82\x03\x91\x2f\xe2\x56\x4b\xbd\x56\x48\xb1\x29\x97\xfd\xed\x17\xf6\xcd\xcb\xa4\xba\x56\x98\xf8\xb8\x9c\x53\x3f\x52\x1a\xbe\xb8\xb1\xab\x86\x20\xe0\xe7\x83\x94\xc3\x16\x21\x63\x8c\x41\x30\x76\xd1\xa3\x46\xc7\x1e\x8c\x10\xe7\xb5\x10\x94\x43\x4d\xe0\x7c\x08\xe1\x42\x5f\xbc\x76\x42\xd9\x56\x54\x90\x20\xe1\x7a\x49\x08\xa9\xac\xec\x2c\xa7\xc7\xfd\xb1\x97\xa2\xf6\x35\x33\xb1\xbb\xc9\xe2\x14\x22\x0f\x49\xaf\x91\x25\x1d\x18\xfd\x0a\x03\xb2\xb0\x3d\x9e\xd1\x6c\xe7\x3a\x8e\xcf\x9a\x8d\xf7\x1f\x4e\x3b\xd6\xea\x05\x7b\xe9\x43\x00\x21\x38\xd7\x3d\xf5\x9b\x00\xf0\x35\xca\xaf\x52\x2e\x6e\xe9\x3e\x2f\xc7\x56\x75\xc3\xca\xee\xf7\xfb\xbd\x3f\x7a\xef\x0b\x3d\x8e\xf3\x6e\x9c\xa7\x31\x3a\xdd\x18\x2f\xbc\xf2\xae\x31\xd9\x4d\x21\xcf\xf6\xe6\x2f\xce\x71\xcd\x1f\x57\x68\xfc\x64\x9f\xd1\x05\xec\x37\x3c\x8d\xc1\xf7\x60\x2f\x44\x8a\x6e\xc2\xb9\x0f\x2f\x92\xe1\x6b\xdb\xd8\xde\x39\xa0\xa3\x8f\xbb\xa3\x11\xa2\x76\x35\xf7\xd1\xdd\xb0\xb8\x69\x23\x6e\x17\x7f\x09\x27\xad\x5e\x93\xbd\xcd\xbe\x5f\x32\xcb\xe7\x3d\xed\x9b\x33\x71\x6e\xe2\x10\xfd\x22\xef\x70\xbd\x6f\x7f\x2c\xdc\xe9\x2c\xe9\x22\xdf\x00\x24\x9e\xb3\x26\xf4\x7b\x0e\xf0\x18\xa5\x73\x25\x94\x4c\x12\x8a\x89\xf6\xb9\xf3\x15\xd4\x42\x32\x8e\xb1\x76\xab\x66\xbb\x0d\xf3\x10\x55\xd3\xb4\x00\xcd\x2e\xd7\x71\x1f\x9a\x0e\xf0\x5c\x08\xa8\x95\x30\x46\x72\x2d\xd5\x04\x2a\x68\x95\x34\x46\x09\xc9\xd4\x26\xcd\xb9\xfa\xbc\x97\x7f\x97\xa2\xc1\xe9\x8e\x8b\xc7\x37\xa9\x22\xfd\xbb\x4b\x8d\xe0\xfb\xbc\xb8\xf8\x1a\xf7\xdf\xde\xbf\x49\xf5\xf2\x77\x09\x19\x98\x04\x88\x0a\x9d\xf3\xaa\x29\x01\x89\x63\x45\x11\xac\x6a\x5f\x37\x9a\x28\x38\x77\x85\x97\xc4\x11\x31\xc3\xd3\x86\x34\x9d\xc6\xb9\x8e\xdb\x18\x88\xf6\xea\x26\x41\x58\x7c\x14\xd1\x6d\x82\x47\x91\xb6\x00\xe7\xdb\x1c\x1a\xc7\x9d\xa9\x7d\x64\x71\xf2\xb1\xc1\x4e\xb1\xa6\xca\x0f\x33\xaa\x33\x90\xce\x9d\x93\xcd\xf0\xe1\xc7\xbe\xd3\x95\x54\xf4\xf7\xc5\xc3\xfa\xf6\xb2\xf9\x2c\xa9\xe2\x8b\xc3\x54\x78\x60\x9a\x04\xf2\x3d\x39\x49\x63\x54\x08\x1b\xa9\x8c\x6b\x2c\x8f\xde\xd6\x84\x38\x83\xc6\x96\x0b\xa6\xb6\x3e\x8e\xa0\x8b\x1d\xe0\xd1\xad\xa6\x10\x42\xe3\x1a\xdf\x3a\xaa\xad\x66\xf5\xc4\xc3\x3e\x6f\x8d\x8a\x19\xa1\xd6\x30\x0e\x3a\x8d\x5d\x0b\x6a\xdf\xb8\x26\xcb\x8a\x7c\x77\xe6\x1d\xf8\x65\xe2\xa2\xca\xc0\x63\x92\xe5\x59\xb2\xc7\x89\x9f\xf6\xe3\x37\x6f\x52\x98\xfb\x9a\x8e\x20\xe1\x2b\x4f\x7b\x4f\x52\x2b\x48\x18\xd4\x75\xe6\x4a\x41\x9c\x0e\x72\x50\x3d\x93\x3b\xdd\x0e\x65\xdc\x52\x21\x9d\x33\x5c\x62\xe2\x08\x57\x81\x6f\xb6\x5c\x10\x50\x02\xea\x6a\xe1\xc4\xda\xc4\x52\xcb\x6e\x54\x71\xbf\x9d\x0f\xfb\x00\x20\xd0\x51\xec\x4c\x93\xa3\xbc\x04\x5b\x9b\xe2\xe3\xad\x35\x4e\xf1\xe3\x21\x9f\xfa\x60\x40\x09\x94\x07\xb0\xae\x3c\x3a\xa0\xd8\x1f\xf8\xee\x82\x2f\x59\xb4\x2f\x2f\x4a\xb2\x5f\xe7\x02\x7e\xd9\x91\xbe\x4e\x05\x5c\x1c\x00\x59\x96\xd6\x38\x1f\x84\x1a\x36\xdc\x58\xa3\x79\xec\xa2\xc3\xc1\xc4\x01\x34\x71\x2c\xa8\x7c\xea\x82\x17\x62\x27\xe5\x4e\xa9\xd5\xa6\xeb\x42\xeb\x3b\x55\x21\x29\x5c\xaf\x34\x85\x5e\x0f\xbe\x3d\x6e\xe7\x9d\x73\x49\x3b\x30\x9d\xc3\x97\xb3\x78\x55\x34\x5f\x60\x61\xde\xff\x4e\x2c\xcc\xfa\xf6\x5c\x31\x54\x6c\xc3\x36\x4c\xe1\x68\x71\xb1\x3b\xd6\xbc\xe0\xc7\x2e\x9c\xbe\x02\x32\xbc\xc5\xb0\xab\xc9\x74\xac\x26\x44\xbe\x0a\x87\x51\x96\x50\xed\x3d\x67\xcb\x3d\x2c\x75\xe3\x8b\x96\xeb\x5f\x26\x5f\xe4\x45\xcb\xb5\xb8\x5f\x74\xa8\x5f\xb3\x34\xbd\x79\x61\x43\xbb\x02\x9d\x2c\x5b\xd6\xa5\xbe\xe3\xd0\xd6\x35\xe8\x8f\x06\x20\xd8\xa5\xb0\xe2\x20\x09\x0d\x92\x71\xa9\x85\xe0\x94\x33\x29\xa0\x0f\x5a\x35\x1b\xa1\xeb\xd2\x97\x62\xf0\x22\x26\xea\x88\xc9\x68\x1a\x06\xb9\x36\x88\xc3\xb9\xca\xf7\x6c\xe6\x60\x82\x9c\x12\xad\x18\x65\xd4\x22\x8c\x91\xc4\x24\x66\xf1\x40\x95\xb5\x62\x83\x91\xc5\x3d\xa7\x22\x6f\x27\x17\x7b\xc2\x8d\x52\x2a\x2b\x0b\x7e\x6e\xd7\xc2\x53\x7e\xff\x82\xf3\x4b\x15\x09\x5f\xb8\x90\x8f\xdf\x7e\x9f\x0a\xaf\x16\xc9\xfb\x24\xe5\x90\x8c\xd5\x6b\xef\x64\xbd\x65\x71\x8c\x5c\x0c\x80\xf2\x32\x54\x21\x9a\x38\x39\x0f\x2c\x50\xb3\xc8\xd1\xe7\x8a\xbd\x68\x7d\xe1\x9e\x76\x00\xe9\xb0\x91\x43\x5e\xf7\x41\x35\xed\xda\x18\x81\x61\x5d\x13\x85\xbd\xa0\x14\x10\x83\xa2\x9c\xb3\x22\x9b\x94\xd2\x52\xc6\x51\x81\x61\xae\x2c\x12\x86\x5b\x2a\xb9\xb2\x96\x9f\xc6\x06\x9e\xf7\x8d\x9f\x5d\x9d\xff\x8b\x1a\x77\x9a\x1f\xbf\x02\x3f\x99\x22\x38\x2d\xca\xbf\x77\xf2\xf4\xcf\x92\xae\x45\xeb\x41\x16\xf6\xe1\xc8\xbd\xc3\x7b\x88\x2c\x25\x80\xc5\xb0\xe4\xb2\xe2\x08\xec\x71\x1b\x6a\x68\x06\x10\x96\x74\xc1\xe9\x5a\xd7\xdb\xd3\x7b\xdb\x18\x10\x6a\x28\x15\xd2\x9c\x9c\x0e\xd7\x3a\x9d\x4f\x08\x09\x50\xb6\x71\x6a\x9a\xb8\x69\x53\xde\x1a\x26\x4e\x5e\xfc\x32\x97\x51\xf6\xf7\x97\xfc\xe2\xc3\xb7\x8f\x77\x29\x82\x7b\x97\xb2\x51\xa7\xb9\xfc\xe1\xe1\x5b\x70\x9f\x17\x9f\x0d\xec\xbc\x78\x78\x3c\xed\x84\xd7\x2b\x35\x91\x03\x4a\xeb\xbc\x3b\x2d\x1f\x07\xca\x78\xb0\x16\x0c\xe0\x50\x7b\xa1\xa5\x62\xd2\x30\x2b\x0c\x82\x0d\x64\xb4\x3e\x3a\xe0\x97\x28\xd2\xe1\xc9\x81\x5d\xd4\x6b\xec\x86\xc8\x07\x77\x43\x63\x3f\xc4\xaa\x8b\xd5\x30\x14\x7d\xa4\x71\x13\x8c\xd5\x3e\x48\xab\x1a\x50\x02\x79\x18\xc6\xfd\x93\xb3\xd6\xb5\x21\xb4\x59\x56\x16\xe4\x99\xdf\x9a\xb5\xc9\x7e\xfe\x82\x42\xb8\xe8\xf1\x5d\x31\xf2\xbf\x2f\x3e\x3b\xeb\x0f\x3f\x92\x14\xba\xf6\x69\x0d\xaa\xc0\x18\xe6\xcc\x83\x11\x8f\xb9\x8b\x07\x60\x8f\x1a\xd8\x7d\xb9\xdb\x01\xb3\x9b\x9b\xf4\x14\x6b\xe9\x76\x62\x02\xfb\xbe\xe3\xfd\xb0\x36\x9c\xc7\x76\xdc\x00\x69\xa3\xb6\x76\x46\xf9\xd6\x46\xd6\xf7\x7d\x44\x6d\xdb\xc6\x56\x07\xe9\xa4\x61\xde\x37\x3c\xfb\x59\x21\xcf\xb1\x9d\xa5\xdf\xeb\x2b\x7c\xd8\x63\xb2\x76\x6f\x1f\xbf\x7d\xb8\xbd\x4f\xe2\x86\x6f\x6f\x1f\x3f\x3d\xde\x3e\x7e\xba\x7d\x58\xdf\x3e\xde\x7f\xfc\xf4\xf0\x8b\xeb\x2c\xc2\xd9\xc6\x79\xb9\xf5\x5b\x0d\x99\x80\xc7\x00\xa5\xa9\x7d\x35\x54\xbe\x1c\x2b\x38\x96\xd5\x26\x86\xaa\x1c\xaa\xa6\xb0\x47\x1b\x5e\x82\x27\x7c\xee\xb4\xec\xb6\xac\xcf\xab\x4d\xab\x9b\x61\x8d\x36\x6e\x9a\xdc\x46\x4b\x29\xe5\x8e\x10\x42\xf4\xe6\x38\xe5\x44\xc5\x41\xc6\x41\x3d\x67\x46\x10\x8f\x18\xe5\x56\xd0\xa4\xe5\x51\x25\x6e\x79\xf7\x52\x6b\xf1\x77\xb3\x5f\x67\xff\x24\xe5\x35\x5f\x92\x40\x5f\xc6\xbb\x5f\xe5\x82\x8a\x97\x4d\xe9\x1a\x0a\x57\x5c\xce\xd3\x93\x59\xb7\x6a\x70\x0d\x42\xdc\x00\x78\xec\x2a\xe3\x2c\xe8\x6a\x34\x38\x7f\x9a\x5c\xb5\xf3\x6e\xef\x35\x13\xaa\xad\x19\xaa\x4b\x5b\x71\x15\xc4\x4e\x50\xe4\x0d\xf3\xfd\xc9\xc6\x74\x9b\x58\x47\x18\x1b\x0e\x3c\xd8\xe6\x23\xa7\xb1\x4e\xfc\xd7\xcd\x82\xe4\x55\xcf\x19\x13\xca\xb1\x16\x56\x50\xe3\x86\x51\x01\xca\xe7\x0c\x42\xcd\x30\xcb\xbb\xd1\x9d\xd6\x08\x3b\xf3\xdc\xfc\x4d\x6b\x9c\xeb\x62\x8a\xbc\x0d\x7d\x2f\xa3\x04\x63\x24\x3e\x72\xd0\x45\x2d\xbc\x0f\x4d\x94\x21\x51\x22\x06\x50\xcf\xfc\xe5\xb7\xbe\x69\x00\x6e\xd7\x6c\xf6\xdd\x8f\x35\xce\x3b\xa0\x8d\x31\xb1\xd1\x5a\xcf\x68\xd1\x38\xbf\x49\xe3\xb3\xf8\xf3\x6f\xb3\x5f\xa5\x8a\xf9\x2f\xd6\x2a\x38\x27\x34\xc1\x63\x95\x2f\xaa\x33\x77\xaf\x87\x82\x82\xa1\x01\xdb\x88\x80\x3b\x9e\xec\x18\x7a\x83\xc2\x5c\x79\x50\x06\xbf\x53\xbd\x07\x3c\xd4\x94\xa2\xd2\xd7\xc2\x07\xb1\x1a\xfa\x3e\x49\x37\x45\x18\xcd\xe1\x39\x03\x3e\x1e\x62\x1b\xb7\xd6\x8a\x03\xc0\xf3\x06\x55\x34\x90\x51\x32\x91\x2d\xba\x24\xf4\x5c\xc3\x59\x9f\xf9\x7d\x5f\x7c\xbc\x17\x7b\xf5\xf6\x8f\xc1\x97\x16\xeb\x35\xa5\x4d\x21\x41\x07\x89\xa7\x08\x0c\x4f\xfb\xde\x97\xb5\x12\x8a\x72\x52\x53\x64\x36\x39\xf6\x25\xb4\x5a\x9f\xbc\x0f\xd3\xcd\x10\xec\x1a\xb0\x8b\x75\x13\xeb\x55\x23\x19\x96\xc6\x63\x28\x85\xb4\x46\x09\x0b\x25\xd6\x07\x40\xa0\x92\x3a\x58\xa7\xad\x54\xdb\x98\xb5\xad\x4f\xa8\xe7\x2c\xfb\xc3\x54\x8f\xdd\xa5\x7a\xbf\x9f\xa5\x7c\xdf\x43\xf6\x17\x29\xc2\xfc\x6f\x53\x1e\xec\xcb\x6a\xb9\xbf\xb8\xd0\x56\x7c\x78\xe9\xe9\xd5\x15\x3c\xe3\xb7\x69\x2d\x2d\xb5\x62\xeb\x03\x8d\x6a\x6e\x31\xd8\x83\x8d\x92\x56\xb8\xd8\xe3\xca\x97\x78\x22\xb5\xaf\x30\xb0\xd1\x15\x3e\x5a\xb0\x7f\xea\xc0\x18\xc5\xc9\x96\x28\xf8\x71\x5b\xa0\x63\x97\x67\x9c\x4b\xa6\x72\x22\x84\x61\x6a\x96\x9e\xd8\x1e\xfb\x52\xc5\xc3\x56\x6f\x7d\x32\xd9\x9c\x11\x95\x65\xcc\x50\xc9\x6a\xc6\x91\x60\x35\x63\x88\xb3\xb8\x35\x46\x18\xd3\xc7\xcc\x70\xcd\xa3\x64\x52\x49\x59\xe9\x20\xbc\x65\x5b\x58\x61\x89\x03\xa7\x0c\x64\xb0\x0b\xcc\x67\x59\x5e\x34\x7f\x1d\xfe\xba\x16\x34\x10\x07\x0a\x81\x3f\xa2\xbc\xf3\x71\x8c\x9b\x03\xa8\x31\x71\x96\x7b\x1c\x7d\xf4\x14\xa0\x7e\xdc\xe2\xce\x36\xd6\xb6\x1d\xbb\xe2\xaf\x13\xf1\xf0\x05\x7f\x5d\x0d\xd0\x85\xbf\xae\x75\x35\x33\x17\x7d\xa1\xd3\xde\xca\x5e\x71\x2a\xfd\x9b\x84\x54\xbf\xe2\x54\x7a\x77\xcd\xaf\x74\x35\x1e\xc5\x8f\xe7\xe0\x8f\xb1\x5a\xd7\xa4\x4a\x63\x6c\xc0\xde\xfb\x8e\x6c\xa3\x8a\x36\xaf\xbc\xef\xe8\x04\x7a\x6d\x88\xd2\xf3\x4e\x6b\xa2\x14\x04\xdb\xaa\x0e\xb0\x06\x9b\xa7\xae\xf7\x55\xad\xb9\xe0\xe2\x64\x57\xe7\x9d\xaf\x6a\x23\xa5\x50\x84\x4b\x37\x67\x60\xef\x93\x50\x44\xac\x6e\xf6\x93\x99\x5b\xcb\xb0\x25\x74\x32\xb3\x6d\x29\xb1\x04\x64\x35\xd2\xa8\x32\xe9\x31\x56\x18\x62\xc2\x4c\x0d\x31\xa2\x42\x0b\x22\x98\x36\x2d\xc4\x98\x49\xad\x88\xa0\xda\xc4\x49\xa9\x85\xa4\xba\xcc\x71\x5a\x6b\xfc\x2b\x7d\x72\xee\x84\xef\x3f\x7d\xb8\x7f\x77\xf5\xfb\xea\xab\x7d\xb2\x7a\xfb\xfb\xf4\xc9\xcd\x94\x2b\xdf\x6f\x09\x28\x87\x88\x66\x93\x33\xdf\x4f\x04\x94\x63\x64\xf9\x41\x6b\xac\xd5\x6c\x53\xf7\xe0\x9c\x56\x55\x80\x55\x4e\x7e\x98\x00\xf2\x35\x14\x4c\x32\xce\xa5\xec\xf3\xbd\xaf\x2b\x2b\x84\x52\x54\xc8\x70\x54\xb9\x08\xb9\x9e\x7d\x98\xdb\x35\x9f\xc5\xc0\x99\xa3\x7c\xb2\xb3\x75\x92\x39\x26\xf6\x08\x62\x8d\x6b\x03\xa9\x26\x30\x52\x04\x11\x21\x0e\x42\x82\x29\x3b\xf5\x0b\xd5\xa6\x81\x18\x53\x7e\xfe\x23\x4e\x52\x2e\x6c\x53\xeb\x7c\x48\x1a\x24\x26\x7b\x93\x7d\xb8\xc2\xe4\x5c\xc5\x14\xce\xb5\x0c\x0f\x6f\xbf\xf0\x46\xbe\x8c\x90\xbc\xf6\x47\x2e\xd0\xa5\xa2\xde\x05\x60\xc2\x21\x95\xcc\xed\x14\xb0\x3e\x39\x12\xfb\xb9\x95\x6c\x9a\x20\x34\xce\x69\x4c\xa2\x8f\x12\x79\x9d\x92\xb2\xb6\x68\xcc\x13\x0a\x8d\x31\xa0\xb4\x16\x54\xc6\xac\x4b\xad\xb5\xf6\xd6\x6a\x3d\x6a\xed\x8c\x0b\xa4\x82\xb0\xe6\x3a\x68\x4a\x48\xed\xb8\x77\x66\x96\x51\xfb\xe5\xb3\xcb\x44\xb8\x78\x00\x65\xb6\xe0\x68\x42\x2e\x56\xfb\x17\xf4\xd1\x2b\x9d\xbd\xbb\x4b\xb6\x56\xf8\xce\xfb\x2e\xfd\xac\xf6\x3f\x64\xac\x59\x8b\xc8\x00\x9e\x21\x40\x73\x0d\xf0\xf9\x73\xdc\xef\xfc\x1c\x17\x36\xe1\x8c\x39\xba\xfa\x1c\x34\x23\x00\x67\x08\x70\x76\x7b\xe6\xbb\xf2\xd9\x37\xd9\xbf\xc9\xfe\x5d\xf6\xbf\x67\xff\x67\xf6\x7f\x65\xff\xf7\xe2\xbb\x7c\xc1\x29\xfb\xee\x2c\x98\x93\xae\xfb\xe5\xe5\x93\xd7\x7d\x9a\x72\xf7\x1f\x1e\xce\x27\xec\xc3\x87\x6b\xe4\xd6\x47\xf0\xf8\xeb\xf7\xeb\xd5\xfd\xdd\xc3\x17\x59\xe0\x87\x3f\x06\xab\xf7\xdf\x7f\x7a\xb8\xb6\x9a\x56\x9c\x41\xa4\x05\x21\x4c\x52\x46\x08\xa5\x9c\xe1\xe8\xa4\xf6\xbb\xdd\x6e\x07\x30\xe1\x14\x13\xea\x30\x66\x9c\x10\x02\xd0\xa9\x51\x3b\xa0\x84\x7f\xea\x1b\xd3\x01\xbc\xc7\x98\x44\x52\xf4\x07\xa4\x0c\xab\x1c\x34\x43\xaf\xc6\x6a\x88\x7b\x0d\xba\x6a\xeb\x2f\x94\xf2\xa7\x6b\xed\x05\x42\x5c\x12\x44\xb0\x44\x08\x41\x0e\x31\xa9\x15\xae\xa9\x11\x46\x70\x84\x11\xe4\x82\x60\xc1\x31\xa1\xc2\x9c\x9c\x89\xd9\xc7\x6d\xdf\x03\x94\x13\x38\xb7\x18\xe1\xed\x2c\x0c\xac\x99\x27\x83\x64\xc2\xdb\x80\x3d\xb1\x60\xc7\x9e\x33\x1e\x0f\x3c\xcb\xb2\x3f\x4a\x5c\x7c\x3e\xd5\xe6\xfe\xec\x0a\x8f\xf2\x3e\xfb\xab\x33\x56\xe1\x7f\xfa\xe9\x53\xea\xf6\x4b\x96\xbe\x4b\x34\xed\xaa\x54\xe7\xee\xfe\xfd\xdd\xfd\xdd\xbb\x97\x44\xf1\xfb\xbb\xb7\xdf\xde\x7f\x58\x9d\x0e\xb6\xe5\x33\x2a\x36\x1f\xe6\x0a\xe7\x1a\x6c\x9c\xd2\xda\x44\x2d\x88\x25\xfc\x20\x88\xc5\x82\xdf\xec\x9f\xaa\x66\x9a\x80\x9e\xfc\x36\x4a\x20\x82\x73\xc2\x2a\x59\x4b\x85\x51\x6c\x49\xac\x41\x86\x90\xb1\xc2\xd2\x6e\xc7\x9a\x44\x7d\xcd\x81\x10\xc4\x10\xb1\xd6\x16\x55\xce\x70\xcd\x14\x23\x94\x73\xce\x68\x7a\x6c\x62\x48\x38\x6c\x13\x95\x73\x2e\x66\x5a\xd4\x01\x42\x02\xa6\x6d\xac\xe2\xc4\x09\x26\xa1\x27\x86\x11\x5a\x68\xcd\x79\x2f\x84\x76\xc4\xab\xc4\xb9\x76\xf2\x79\x42\x5a\xf3\x8f\xc9\x92\xfb\xaf\x3e\x2b\x8f\x9e\xd7\xf8\x59\xf8\xe0\xf5\x9a\xff\xfe\xdd\x6f\x8b\x40\x5c\x56\x7c\x6e\x40\x15\xc0\xb0\xe8\x08\x44\x1a\xe2\xde\x80\x3e\x80\x4d\xc4\x39\x9d\x99\x92\xa0\x04\x90\x99\x10\xb4\x8e\x34\x96\xa8\x77\x91\xe7\x3c\xb2\x9b\xda\xff\xe0\xda\xd0\xb6\x80\x24\x1b\xaf\x7d\x59\xf5\xd6\x2e\xab\xde\xf2\x0a\x52\xae\x1b\x6d\x69\x65\x7f\xcb\x9a\xff\x43\x30\x9c\xf5\xde\x5e\xdb\x2a\xff\xea\x27\x6c\x95\xf7\xef\x7e\xb7\xad\xf2\x17\xe0\xf1\xf3\x82\x3a\xf9\xde\xd7\x15\xed\xeb\x0d\x8b\x64\x56\x28\x87\x79\xa5\x54\x10\x21\xda\x93\x95\x42\x9e\x33\x5a\xf9\x8a\x80\x36\x56\x37\x36\x96\xb9\xf8\x61\xcc\x59\xc4\x37\xe2\xa9\x2f\xba\xa3\x2e\xfc\x91\x82\xdd\xc9\xd1\xd0\xbb\x40\xc3\x86\x54\xae\x32\x71\xf7\x9c\xe9\xde\x28\x27\xfd\x8d\x0a\xc2\x0a\xbf\x76\x96\xd7\x8e\x32\xcb\x14\xaf\xce\xd6\x0a\xc5\x9c\xc5\x49\x6b\x61\xcc\x70\xb6\x56\xf8\x69\x77\x67\x74\x82\x35\x96\x28\x08\xca\x41\xc9\xb6\xc6\xd8\xc6\x37\xbc\x09\xd9\x79\xdc\xf9\x79\xdc\x97\x3c\xd2\x3f\x4e\xfd\xf1\xb8\xe4\x64\xd7\x2f\x32\x8b\x1f\x3f\xbc\xbb\xbc\x76\x7b\xf5\xda\x55\xf5\xe0\x95\xba\xd1\x22\x3f\xbc\xba\xfd\xfe\xfd\x0b\xdd\xf5\x6a\xef\x19\xd1\xda\x97\x5e\x09\x65\x98\x16\xdb\x39\x9c\x5f\x29\x83\x12\x5a\x9f\x5e\x02\xad\xab\x98\xa5\x73\xf0\x15\x75\xe4\x66\x0c\x47\x14\x30\x38\x84\x9c\xc4\xba\x07\xca\xc4\xcd\x18\xa6\x38\x69\x60\xa6\x08\xd7\xa6\xa7\xdc\x29\x56\x57\x4a\x1a\xcd\x2d\xb7\xcd\x61\xb8\x7a\x49\x89\xf4\x92\x82\x9d\xe5\xda\xa7\xc7\x79\x17\x77\xce\x03\x18\xbb\xa6\x71\x43\xe7\xfa\x6d\xac\x41\xb7\x71\xb6\xdd\xa4\x5c\x76\xf5\x93\x31\x8a\xfb\x73\x8c\xe2\xfe\xb7\xc4\x28\x56\xf7\x9f\x63\x14\xf9\x10\x80\x0c\x40\x84\x27\x1b\x2c\x01\x0a\x11\xcb\x19\xe8\x22\x4d\xa9\xdc\xd3\x35\x1d\x33\x4f\xa8\x99\x72\x74\x7e\xc1\x45\xf3\xd3\x51\x8a\x82\x09\x26\x40\x05\xaf\xc2\x14\x59\x91\xce\x8d\x76\x6d\xb2\x7f\x9c\xfd\xf3\x65\xb5\x5e\xa9\xd0\xa4\x87\x05\x6c\xf5\xed\xfd\xdf\x01\x67\x86\x90\xa4\x13\xf8\x57\xe0\xfe\xc3\x67\xd1\xc0\xe5\x01\xfc\xfa\xfd\xfd\xfa\x16\x24\xd0\x68\xae\xc0\x50\x56\x4d\x95\x8b\xd9\x55\x75\xae\x67\x59\xc3\x42\xec\x55\x6f\x8c\x88\x21\x47\x73\xeb\x23\x11\xc0\xb8\x28\xc0\xae\x8c\x93\x34\x32\xa8\xe7\x0c\x48\x5a\xc6\x3d\xa0\x75\x15\x65\xb1\xa3\x64\x3e\x60\x9a\x67\xa0\xde\x99\x29\x1e\x56\x7b\x46\x6b\xed\x29\x71\x1c\x7b\x25\xbc\x10\x46\x50\x1f\xf7\x9d\xb7\x9d\x87\x50\x48\x25\xad\xb5\x5e\x42\x47\xe8\x2c\x19\x63\x2c\x22\xd3\xda\xce\x64\x19\xb8\x59\xe2\x7a\x24\xd5\x03\x5d\x70\x64\xaf\x73\x76\x97\x93\xef\xfe\xa6\xcf\x87\xb8\x3f\x24\x65\x66\x80\xe3\xa6\x39\x99\x34\xfb\xfd\x7e\x1f\xf7\x6b\x12\x76\x7e\xe7\x76\x21\x56\x60\x1f\x76\x6e\xe7\x77\xd9\x3a\xef\x9e\x65\xc2\xb6\xfe\x8e\x5a\xb4\x44\x8b\x75\x7f\x55\x8b\xf6\x85\xff\x5a\x64\x45\x1b\xf5\xc9\x25\xc4\x76\x54\xb5\x45\x3e\xee\xb7\x3a\x8e\xa7\x4d\xce\xba\xdc\xcf\x7a\x01\x5d\x6f\x5e\xb4\xeb\x37\x80\xae\x69\xa4\x6e\x2e\x27\x58\x73\x8b\x7b\xcd\xe4\x41\x16\xc2\xb9\x7e\xce\x5e\x0a\xd2\x12\xce\x8e\x3c\xfb\x5b\x97\x34\xd3\x7f\x79\x15\xc9\xf9\xa2\x86\x24\xbb\x3d\x8d\xe3\xfa\xcb\x1b\x3b\x75\xd8\x0d\x6a\x10\xc9\x4b\xc6\x01\x7f\x6a\x19\x07\x82\x82\x4e\xb0\xa8\x04\x4b\xfc\x30\x13\x60\xc7\xed\xe5\xb7\xa7\x7e\x45\x7f\x18\xd6\x06\x0b\x6e\xb5\x3a\x76\xf9\x44\x1c\xa8\x0f\x4a\xe9\xc8\xc6\x71\x9c\x37\xd3\x34\xcd\x43\xaa\x3f\x4c\xeb\xc5\xad\x6d\xf6\x67\x09\x59\x94\x5d\x78\x4d\x2e\xf8\x97\xa5\xae\x7c\x11\x22\x7c\xf8\xf5\xfb\x37\xe7\x44\xd4\x5d\x4a\xb0\x7e\xfa\xf8\x36\x95\xd1\xfd\xb2\x70\x76\x33\xf2\xa3\xc9\x51\x0d\x1b\x04\x73\xb6\xe3\x9b\x0e\x08\x1c\x4d\x3c\xec\xe2\xc8\x41\x35\x94\xad\x46\x21\x57\x21\xcc\x9a\xee\x54\x47\xb1\xcb\xcd\x1c\xca\x15\xf5\x4a\x37\x8e\x10\xcc\x84\x1b\x2d\xad\x9a\x4a\x6b\xec\x21\xd3\x2e\x96\x5a\x1f\x39\x30\x7b\xeb\x44\xab\xcb\x01\x97\x2c\x5b\xe5\xf0\xd9\x25\xbc\xe6\xe7\x38\xea\xe7\x35\x73\xfb\x22\x84\x7b\x5a\x0d\x57\x16\x51\x5a\xce\x2e\x87\x55\xd9\xd4\x79\x3d\x6f\x10\xd8\xb7\x3f\xd8\x11\x98\xba\x8a\x19\xc8\xf2\xcd\x8c\xaf\xaf\xd5\x56\x70\xe8\x7c\xf3\xa4\x9c\xbb\x09\x9c\x47\xdc\x46\xd2\x9c\xfe\x4f\x9b\x2c\x2b\x6e\xda\x94\xc3\x25\xe7\xd8\xd0\xe7\xca\xb2\x3f\xce\x1f\xce\x92\x58\x0f\x77\x8f\xa7\x6b\x45\x71\xdb\x92\x32\xd4\x44\x6c\xe3\x5e\xe6\x7d\x94\xd6\x82\xd2\x98\x5c\xcf\x03\xaa\xf9\x96\x4c\x16\x51\xb3\x46\x47\x52\x90\x59\xe4\xed\x2c\x4e\x7b\x18\x7f\x6e\x6e\xdd\x95\xcd\xf3\x0f\x7e\xcb\xe9\xf6\x76\xbd\xba\xae\xc3\x39\xe7\x5b\x6f\x33\x1e\xeb\x99\xe1\x9c\xe6\x65\x10\x3a\xd8\x48\x14\x0b\x44\xc6\xbd\xe6\x81\xaa\x1b\xc4\xa7\xb8\x4f\x18\xdb\xf2\x49\x83\xdd\x3c\xe4\x74\x33\xe1\xbc\x5a\x6b\xa7\x6b\xaf\xc9\xe8\x79\x23\x4d\x60\xde\x21\xd7\xd2\xc6\xc7\x8d\x47\xf5\x3e\x9c\x21\x3c\xbb\xaa\x0c\x59\x96\xdf\xb0\x54\x03\xaa\x52\xce\x2b\x5b\x42\xd4\xdf\xac\x5e\xe1\xb7\x3e\x3c\x82\x94\x81\xb9\xd9\x84\x1c\xc6\x2d\x07\x99\x88\xdb\x93\xfb\x4d\x6c\x27\x9d\x03\x5b\xaf\x5b\xd7\xad\xd5\x8c\xfc\xbc\xdb\x07\x50\xe6\x61\xae\x09\x33\x4a\xc8\x82\xfa\xbc\xc3\xb1\xdb\x89\x5d\x96\xe5\x79\x78\xa6\xb7\x7a\x8d\x2f\x55\x16\xaf\x4c\xb8\xf5\x97\xe5\x8c\x1f\x3f\xa4\x58\xe8\x2f\x6f\x4f\x9b\xc0\xad\x76\x2e\x55\x13\x13\x1a\x4d\x59\x8f\x5e\x79\x2f\x1b\x7d\xc0\xd1\x35\x39\x2a\x23\x2b\xf6\x51\x96\x51\xe4\xdd\xcc\x0b\x78\x9c\xa4\x2c\x43\x89\x50\x2e\x39\x73\x2e\x34\xa6\x53\x3e\x80\xfa\xd8\x17\x13\x4b\x10\x2c\xc9\x00\x05\xe4\xb4\x76\xf0\x33\xb9\xd5\x6b\x9b\xbd\xc9\xfe\x76\x3a\x67\xbe\x62\x69\x7d\x3e\x51\x3f\x7e\x78\xfb\xcb\x2b\xc6\x84\x4f\x1f\xef\xce\x7c\x4f\xb9\x07\x65\x03\x16\xce\xc9\x26\xda\x26\x1e\x6e\xa6\xe6\xa8\x1a\x0c\x9a\xb2\x29\xc1\x4e\x06\x63\x90\x77\xa4\xac\x63\x63\x62\x2d\x41\x63\xa2\x5d\xb9\xc3\xe1\x70\xf0\xd3\x34\x4d\x71\x1b\xfb\x61\x00\xa7\xbd\x40\x56\x82\xcf\x9b\xa1\x0a\x15\x91\x00\xc7\xca\x7a\x0d\xf4\xa2\x79\x02\xaf\xe2\x65\xef\x7f\x22\x5e\xb6\x40\xa2\xbe\x88\x93\x81\xc7\x2a\x5f\xbd\xff\xf8\x4d\xae\xf3\xaa\x39\x39\xf1\x60\xfb\x34\x80\x71\xde\xdf\x8c\xfe\xa8\x43\xbe\x09\x48\x08\x5c\x05\x28\xbb\x4e\x45\xeb\xc7\xb8\x57\x87\x2e\x05\xcc\x46\xef\xc7\x08\xa3\x06\x59\x3c\x80\x10\x0f\xf3\x1e\xd6\xd4\x92\x41\x30\x99\xe3\xd8\xc6\x51\x7b\x91\x4c\xbb\xac\xc8\xc9\xf9\xfe\x2e\x5a\x87\x57\x77\xf7\x0a\x8e\xfb\x6d\x05\xde\x67\x77\x67\x99\xef\x34\xb7\xde\x2d\x8c\x5e\x1d\xd8\x37\x60\x1f\xab\x9c\x47\xc9\xb5\xe0\x50\x08\x32\x44\xeb\x80\x8e\x22\xe7\xb1\xc2\x0e\x3a\xe7\x6e\x88\x22\x0d\x91\x2b\xb7\x4f\x44\xbc\x1b\x2b\xaa\xa6\x56\x45\xe9\xe7\x6d\x6c\x14\xa0\x60\xf2\xe1\x30\x4f\xf0\x39\xdb\xd0\xed\xb8\x8d\x07\x02\xaa\xed\x69\xfe\xc1\x67\x92\xf2\x78\xab\x54\x51\x9b\x56\xe3\x67\xf2\x7e\xf0\xdd\xdf\x03\xb7\xf0\xfb\x5f\x3f\xfc\xdd\xa4\x66\xfd\xf8\x9b\xb7\xdf\x83\xfb\xdb\x4a\x44\x38\x0b\x92\x93\x79\x93\x63\x48\x03\x43\x60\x88\x9b\x48\x02\x68\x41\x89\xa2\x89\x61\x53\xd7\xa4\xb5\xa3\xc1\x55\x05\x5a\x50\x1f\xe9\xda\x06\x0b\x9b\xf9\xe0\x34\x76\x4d\x4a\xde\xca\x96\x38\x32\xd8\x51\x94\x07\x60\xb3\x9f\xe7\xf6\x47\xdc\xe4\x4b\x15\xc7\x7f\x9f\xfd\x8f\x99\xcc\xfe\xb7\xaf\x71\x93\xff\x33\xf0\x42\x4d\xfe\x25\x80\x68\x29\xc1\xf9\x6b\x31\x93\x4f\x37\xe6\xc9\xf9\x71\x04\x6c\xb4\xe3\xd1\x53\x22\x5d\xd3\x77\x50\x13\x68\xca\xaa\xe9\x91\xd1\x52\x42\xcd\x2c\x05\x1b\x87\x1b\x61\x28\xb1\x7d\xd3\x34\xcd\x18\x6b\x57\x43\xd5\x00\xb4\xf0\x92\x4f\xa4\xb6\x15\x41\xb0\x32\x15\x6c\x4d\x45\x2c\x7d\xcd\x4b\x3e\xe2\xd8\x0c\x38\xd1\x92\x63\x44\x91\x71\x03\xba\xf0\x92\x37\xea\x9a\x95\xbc\x42\x3f\xc9\x4a\x5e\xc1\x4d\x60\x2e\xcb\x32\xb0\xca\x9e\xf9\xed\xb0\xb6\x69\xdf\xbe\x7d\xff\xfd\xa7\xb7\xb7\xd7\xca\x18\x8b\xec\xdd\x87\xc7\x75\xd5\x11\x00\xf7\x6c\x3a\x6c\x94\x17\x86\x7b\xa2\x55\x90\xdb\xfd\xca\xe0\x40\x94\xe7\xb1\x0b\x11\x0f\xcd\x00\xc8\x71\x93\xef\x76\x83\x3b\x80\x36\x24\xee\xf8\xee\x45\x7f\xe7\x8f\xb2\xbb\xf3\x29\xb5\xe8\xb5\x9f\x3c\x95\x57\xfa\x98\x3f\x1a\xa9\x93\xa7\x75\x9d\xac\xb9\xc2\x74\xfd\xea\x0b\xba\x99\x77\xd7\xf0\xcb\x15\xc4\x75\x5e\x3d\x71\xb0\xaf\x61\x6c\x6e\xca\xa7\x83\x6f\x1a\x00\x5b\xdb\x44\x1c\x42\xae\x68\xbb\xc7\xd3\xb1\x1d\x7a\xd2\x77\xf9\x66\x1c\xc8\xd0\xc7\x91\x76\x07\xbc\xdb\x71\xa1\x1b\x87\xb6\x03\x13\x9c\x03\x02\x1a\xca\x15\xb1\x5c\xe9\x46\xc7\xa6\x5d\x5b\x2e\x9c\xa3\x24\xf6\xd1\x99\x04\x75\x8f\xe3\xc9\xca\x35\x18\xda\x8a\x40\x62\x29\x32\x88\x59\x8e\xa5\xa6\xd0\x55\x4a\x33\xb2\xc7\xd8\x70\xc2\x0f\xa8\x76\xdc\x1a\xc1\x18\x97\x8c\x33\xd7\x03\x96\x95\x79\x38\xdb\xba\x3f\xcf\xfe\x7e\xf6\x0f\x53\x25\xce\x7f\xc8\xfe\x53\xf6\xbf\xa4\xac\xdc\xb2\x5d\x9e\x66\xe3\x6a\x81\x31\xe7\xab\xcf\x2a\x3c\xe7\xa7\x87\x73\xd0\x3c\x35\x3a\xad\xbc\xf5\xbb\x25\x4d\xf7\xed\xfd\xea\xb7\x71\x85\xdf\xaa\x70\xec\x02\xd8\x63\x8f\xea\x28\x5c\x55\x83\x72\x8a\x41\x58\x75\x72\xbc\x49\x45\x18\xe5\x94\xa0\xba\x17\x35\xc3\x62\x28\x88\x6c\x78\x94\xca\x94\x15\xd0\x34\x1e\x20\x21\x68\x1e\x40\x88\x2a\x6e\x8b\x4d\x64\x4c\x49\x51\x2b\x55\x47\x6b\x8c\x1e\xc5\x90\xb7\x7d\x90\x4d\xbb\xda\x1c\xb4\x3e\x18\xcc\x45\x0b\x31\x52\x34\xca\xc9\x30\x41\xb0\xc0\xb4\x64\x14\x09\x84\x19\x53\x35\x85\xd2\xc7\x8d\x16\x6e\x9f\x63\x88\x91\x69\x1a\x21\x84\x88\xce\x59\x17\xc7\x73\xf1\x16\xc4\x74\x30\xca\x5a\x1d\x74\x6b\xb2\x9b\xfc\xa2\xad\xf3\xc7\xd9\x9f\x64\xff\xbf\x85\xc5\xee\x95\xc4\xe1\xea\xbb\xb7\x8f\xa7\x95\xfd\xf8\xeb\xf7\xa7\x56\x7f\x11\x6f\xba\xd0\x74\xfc\x34\xbd\xdd\x45\x87\xf8\x74\x02\x7c\xba\x5f\x65\x0d\x3c\x39\xf3\x5c\x89\x99\x08\x21\x80\x07\x19\xaa\x86\xe0\xb5\xdf\x56\xf5\xde\x10\x11\x04\x17\x41\x32\xa9\x84\x64\x46\xf1\xb9\xf7\xb9\xf7\xd1\xd5\x75\x5e\x29\x49\x05\x34\x84\x44\x46\x79\x68\x6a\x28\x35\xd3\x55\x1d\x0f\xf1\x40\x15\x1b\x03\x68\x71\xd4\x6b\x83\xd1\xce\x78\x4c\x28\xa1\xd8\x6f\x6b\xce\xa5\xb3\x8a\x90\x03\xa5\x54\x4b\x46\x04\x92\x88\x11\x24\x09\xa5\x30\xe9\xe9\x31\x8a\x23\xe2\xa2\x74\x25\x03\x58\xc9\x0a\x21\x48\x6d\xa0\x08\xd1\xd2\x69\x19\xb3\xdc\xea\xe4\x07\xef\x92\xef\xf7\x79\x6f\x3c\xe7\x85\x7e\xbc\xca\xae\x0b\x4a\xdf\xbd\xc2\xbf\xdc\x3d\x14\xf8\x06\x3f\x6d\x42\xd3\x00\xd2\xb8\x66\x6e\x42\x88\x16\xd8\x74\x1f\x0d\x90\x00\x9d\xd9\xcc\xe2\x00\x54\x0c\x61\xcd\x62\xe6\x17\x95\x2b\xf1\x84\x01\x74\xbd\x1b\x5d\x08\x6e\xe3\x3a\x17\xa7\xec\xe6\x66\xd1\xce\xd0\xe7\x5d\xe0\x5f\x9c\xec\xa4\xcf\xd4\x64\x67\xe7\xee\xe1\x52\x43\xf3\x8a\xe5\xf6\xfd\x9b\xc7\x8f\x1f\x5e\x91\x2c\x25\x16\xe5\x8f\x6f\x1e\x6e\xc2\x86\x20\x8f\x30\x10\xd1\x62\x70\x18\xb8\x95\x8d\x9c\x84\xd6\x9c\x72\x4f\xda\x5c\x78\x2c\x2c\x8f\x88\x61\x8b\x18\xef\x2b\x5f\x81\x9a\x19\xc2\x6a\x4e\x60\x5d\x35\x6c\x27\x07\xda\xde\xec\xbb\x4d\x3d\x36\x26\x18\x25\x8c\xeb\x06\x27\x95\x35\x01\x0c\xd8\x2b\x2e\xb5\xd0\x54\xa9\x23\x11\xb2\x6a\xe7\xc3\xa6\xb2\xa5\x04\x36\xda\x83\x1d\x52\xa9\xe9\xb9\x6e\xca\x26\x1b\x75\xd1\x1c\x7d\x4c\xc8\xd5\xdf\xa1\x39\xfa\xe6\xed\xed\x7d\x0e\xde\x7f\xff\xe6\xe1\x3a\xbe\xbe\x14\x59\xdd\x2d\x9a\xcb\x2f\x1c\xb3\xb7\x90\x45\x3a\x5b\x94\x57\x20\x04\xc6\xb7\xfe\x68\x7d\x01\x65\x1c\x18\x74\x90\x6d\x19\xb4\x88\x19\x8f\x40\x46\x22\x12\xc0\xb1\x86\x32\x2a\x08\x85\x50\xf7\xf9\x2e\x6e\xa1\xb3\x98\x76\xcf\x19\xc8\x9c\xf7\x5d\xe7\xd6\xda\xf2\xca\x6b\xd4\x98\xe7\xcc\x5a\x90\x35\x46\x68\xac\x65\xc5\x25\x56\x3c\x1a\x6c\x66\x12\xf7\x66\xcc\x6b\x47\xb9\x64\x04\x23\x71\x98\x0f\x06\xa0\xda\x5a\x20\x5d\xdb\xba\xd8\xb8\xd8\x2d\xb6\xd4\x74\xce\xc9\x2f\xd1\xc8\x7f\xb1\xb0\x8c\x2c\x68\x98\x4b\xc4\x76\xa9\x9b\xba\xbd\xa8\xe6\x9e\x06\x3c\xc9\x0a\x7d\x21\xde\xfc\x57\xe0\x2c\xf5\xf9\xfe\xe6\xd0\x68\x86\x3d\xc6\x63\x38\x6e\x43\x02\x60\x62\x7d\xc8\xc3\xac\x92\x32\xcb\xde\xc3\x1a\xec\x66\x71\x83\x77\xfb\x3d\xb7\x52\x40\xad\xb0\xd8\xc6\xa0\x00\x1c\x62\x8f\xd7\x26\xee\x8d\xc1\x9a\xc7\x6e\x1c\x01\x97\x8c\x2a\xbb\x8f\x8d\xd1\x11\x21\x42\x3b\xe7\x3a\xf7\x9c\x2d\xdb\xcb\x2e\x1e\xbc\x3d\x6d\x2c\xc9\x2f\xf5\x67\x9c\xfc\x1f\x25\x4f\x63\x99\xa5\xff\xf2\x8c\x93\xff\xe6\xff\x2d\x4c\x7e\xdb\xfb\xee\x06\xc7\x26\x80\x84\x2e\x91\xc4\x38\xe4\x66\x67\x35\x36\x16\x64\xc4\x05\xdc\x80\xd1\x5b\xec\x5d\x64\xb6\xac\xfc\xa2\x71\xec\xa3\x0e\x51\x82\x66\x44\x58\xab\x84\x92\xdf\x46\x21\x40\x9b\x67\x7f\x0d\x8c\x7c\xc8\x8a\x82\x9e\x6d\xcb\x37\x0b\x47\xe0\xd7\xb2\x20\x77\x2f\xf6\xe6\x65\xe2\x7e\xb8\x3f\x35\xbe\xa0\xfb\x00\x68\xca\x73\x0c\x61\x0f\xb6\x0d\x98\x22\x04\x3a\xcc\x5d\x00\x3a\x22\x90\xe5\x7c\x4e\xc6\x6e\xdf\x87\x64\x8c\xab\xed\x36\xec\x67\x26\x55\x3e\xec\x67\x96\xfc\x84\x84\x0d\xf4\x6b\x9d\xfd\x65\xe2\xf2\xce\x16\x9f\xed\xb7\x71\xfc\x9c\xa9\xdd\x5f\x91\xfc\x9c\x63\x01\xb7\x15\xdf\x3c\x67\xa0\x8d\x22\xcf\xb4\x26\x1c\x69\x22\xa2\xd7\xb0\xb6\x12\xba\xb2\x9a\xe2\xae\x36\x3a\xf6\x01\x4c\x51\x80\x76\xb3\xc3\x79\x16\xa7\x4b\x9e\xfd\xab\x54\x3f\x84\x24\xaa\x1f\x42\x51\xa8\xea\xc3\x8f\xa8\x7e\xd2\x5a\x5f\x70\x78\x3f\xcb\xfe\x34\xbb\x4f\xe8\x93\x7f\xb4\xcc\xf9\x53\x3f\x9d\x7a\xf2\x15\x7a\xe6\x4d\x5e\x3c\x3c\x7e\xf3\xe6\x9b\x37\xe0\xf1\xaa\x7d\xc5\xd9\x56\x4f\x69\xb7\x21\x8c\x23\x28\xe7\x30\x02\x9b\x73\xd8\x70\xaf\x8d\xd0\x8d\x0c\xce\x60\x32\x42\x2e\xeb\xb9\x0c\x4c\x24\x1b\x1e\x76\x96\x28\xab\xf3\x8a\x63\x87\xd8\xda\x3c\x67\x2e\xee\xbd\xcf\xf1\x5c\x46\x3e\x6e\x5c\xd7\x6f\x9c\xf3\xa0\x04\x36\xf7\xb1\x8a\x1b\x00\xf3\x6c\x0e\x73\x66\x38\x0c\x48\xe4\x82\xc5\x69\xe4\xd3\xe4\x5b\x7e\x32\xd0\x56\x2f\xba\x58\x75\xf6\xf7\x7e\xd4\x92\xd7\x85\xfb\x3f\xd9\xac\x6b\xd2\x53\xd9\x6c\x36\xa0\xde\x31\x29\x44\x2d\x04\x8a\xbb\x09\x98\xbc\x81\xbd\xec\x74\x50\x6e\x54\x63\xf0\x98\x4f\x48\x19\x78\xac\x2d\x97\x5a\xe6\xb5\x20\x0e\xf3\x4b\x43\x8e\x1b\x2d\x6a\x5f\x8b\xa2\x5a\x9a\x24\xc6\xad\x1b\x86\xc9\xbb\x00\x2a\xe0\x72\x13\xb3\x38\x02\x98\xd7\x33\xa1\x7b\x23\xbd\x7e\x69\x07\xfa\x1b\x68\xc7\xd5\x88\xf0\x30\x4d\x00\xee\x98\x94\x1c\x0a\x89\xe2\xb4\x03\x36\x6f\xe1\xa0\x3a\xdd\x28\xb7\x91\x43\xe3\x28\xdb\x62\x65\xeb\x63\xe9\xa8\xb5\xee\xd4\x0e\x8f\x5e\xb5\xe3\xd4\xe1\x4b\x3b\xb2\x28\x3f\xb7\xa3\x04\x2a\x6f\x52\x3b\x48\x9e\xcd\xd5\xab\x01\x59\x25\xbe\xeb\xd3\xf9\xf8\x27\xd9\x9f\x9f\x91\x07\x67\xb4\xf1\xeb\xf5\xf1\xf1\xc3\xb2\x22\x7f\x67\x43\xce\xea\x9b\x22\xee\xb8\x52\x12\x2a\x05\x61\xec\x41\x06\x86\xaf\xb7\xe6\xa9\x71\x44\x3a\x9d\x73\xc5\x3c\x91\x6b\xbd\x73\x71\xba\x34\x06\x92\xdf\xa7\x35\xdb\x81\x4f\xfb\x6e\xe4\x63\x9f\xce\x45\xf4\x37\xbd\x56\x96\x91\x99\xe5\x4f\x0f\x48\x17\x2e\xc3\xd6\x7e\x6d\x68\x7e\x47\x13\xc2\x9c\x2d\x43\xf7\xe5\x5a\x59\x83\x21\xe9\x28\xeb\xd4\x96\x87\x33\xf7\xcd\xd5\xe8\x7c\xb8\x07\x0f\x1f\x5e\xe3\xe6\xde\x7e\xf3\xe6\xfe\x9b\xb7\xdf\xdd\xff\x64\x6b\xca\x26\x45\x75\xd9\x5c\x83\x2c\xaf\x45\xde\x56\x83\x6a\x54\x90\x72\xab\xb6\xa6\x39\x98\x2a\x6e\x20\x2e\x67\xee\x99\x52\x02\x2a\x49\x3a\xcb\xbd\x6d\x72\xa2\x99\xa3\x6a\xad\x77\x3e\xee\xbc\x07\xad\x3b\x4e\x51\x0d\xa3\xed\xfa\xae\x4f\xda\x26\x01\xb0\x1c\xc6\xe1\x80\x7f\xd4\x9c\x76\xe0\x43\x97\x72\x03\xf5\x33\xbd\x75\x6b\x74\x8e\xdb\xfd\x6a\xc1\x3f\x27\x08\x76\x2a\xa1\x4c\xdb\xee\xdd\xc3\x9b\x14\x3b\x4a\x52\x15\x77\xf7\xe0\xdb\xe2\x9b\xa4\x23\xf3\x3e\x4d\xc2\xaa\x78\x73\xb2\x92\x73\x92\x6f\x85\xa8\x09\x09\xbb\xe7\x0c\x12\xc2\xa7\x4b\xa6\xca\x9b\x78\xb8\x51\x4d\xab\xb5\x80\x02\x42\xd4\x35\x3b\xbf\x46\xee\x69\x5b\xbb\xba\x8a\x12\x18\x82\x9b\xaa\xbc\x49\xb0\xc6\x99\x02\x34\xd7\x35\x04\x59\x31\xf8\x98\xc5\x7d\x3c\x38\x1f\x4a\xca\x40\x06\xb2\x1c\xfe\xe7\x7e\xbd\x59\xec\x8d\xe1\x99\xdd\x8e\x6b\x7d\xae\x0c\xf8\x97\xe7\x88\xe7\x4b\x86\x60\xc9\x54\xde\x9f\x8d\xc8\xfb\x8f\x9f\xee\xaf\x89\x08\xc0\x7d\xfa\xa7\x57\x56\xe4\x12\x77\x7a\x28\x08\x70\xac\xf6\x35\x01\xfb\x79\x8b\x48\x3e\x3e\x67\x66\xd0\x7b\x1f\xbd\xeb\xb4\x93\x1d\x80\x0c\xc6\x3e\x48\xea\xa8\x2c\x78\xc3\x95\x53\x33\x01\x35\x0c\x65\x05\xbc\x0a\xdc\x40\x2b\x08\xaa\xe2\x4e\xc6\x46\x82\x5a\xed\x57\x59\xdf\xc3\xae\xf1\x42\x04\x25\x5c\xe8\x86\xe6\x64\x51\x6a\x0a\x26\x65\xb8\x3e\x59\x37\x8a\xeb\x23\x1d\x2b\x29\xe6\xc3\x58\x87\x5a\x01\x1a\xdb\xbd\xed\x13\x6d\x58\xb6\xca\x37\x89\x4f\xc5\x9f\x19\x18\xff\x34\x31\x31\xbf\x5d\xdf\x7e\xb3\xba\xfd\x1e\xe4\xab\xf7\xd9\xa9\xad\x45\x22\xea\x79\xf8\x50\xdc\x3d\xde\xbd\x7b\x15\x19\xba\x7b\xb8\x5b\x95\x4d\x59\x1d\x00\x14\x71\xf7\x9c\x6d\x63\xcf\x80\x27\x79\x35\xef\xb5\x07\x9b\xd0\xb6\x45\x26\x38\xa1\x48\xe1\x7a\x13\xd6\x1e\xd7\x55\x1c\xda\xa6\x07\x22\x8e\x5b\x07\xe0\xce\x1f\x6d\x5f\x84\xe3\x20\x73\x71\x32\x32\xdc\xdc\x49\x55\x85\x92\x83\xe6\xe8\x6e\xb2\x2c\xcf\xe4\xe9\xfe\x8a\x4d\xf6\xf3\x14\x3d\xb8\xd6\x71\x5c\x25\x67\xf4\x9c\x8f\x79\x7f\x53\xba\x1a\x02\x07\x46\x19\x79\xa4\x71\x88\x58\xe5\x06\x54\x9c\x81\xb6\x99\xec\x60\x8e\x0a\x1c\x64\xb1\xe1\x75\x3d\xaa\xc6\x1c\xa6\x60\xb7\x46\x68\x77\xd8\xc8\xae\xf3\xe7\x78\x5d\x9b\x6c\x16\x98\xdd\x26\xe6\xeb\x2b\x26\x6e\xf0\x8a\xe7\xf3\xee\x12\x75\x5d\x54\xef\x16\x61\x5b\x15\xe6\x2c\x00\xe6\xdd\x56\x0f\x60\x37\xb6\xaa\x1b\xe7\x0d\x68\x1b\xb0\x89\x6a\x00\x95\x38\xf4\xcd\x18\x27\x09\xc8\x18\x9b\x35\x5c\x18\xda\xe3\x81\x6f\x07\xf3\xff\xf0\xf6\x3f\x41\x92\xeb\x78\x7e\x18\x4e\x90\x99\x59\x9c\x95\x46\x62\xbf\x9e\x7e\xc5\x95\xb4\x23\xd4\xf4\x7b\xaf\xb9\xbf\xdd\x95\xa0\xed\xed\x6e\xfc\x24\x8d\x87\x21\xc9\x32\xa4\xb0\x36\x10\x76\x84\x0d\x87\xc3\x0e\x44\x58\x07\x84\xc3\xe1\xc0\xc9\x81\x23\x8e\x38\xe2\x88\x23\x8f\x3c\xf2\xc8\x23\x8f\x3c\xf2\xc8\x63\x1e\x79\xcc\x23\x77\xaa\x88\x72\x10\xcc\xac\xca\xea\xee\x37\xf3\x76\x77\xc2\xf3\x9a\x4c\x66\x66\xf7\xf0\x0b\x24\xf8\xc5\xf7\xef\xe7\xd3\x34\xa6\x35\x83\xf1\x68\x7d\x4a\xad\x6f\x6d\x5d\x03\xb4\xb4\xb1\xf0\x43\x6b\x5a\x80\x36\xd9\x36\x4c\xa8\x9f\x2e\xdb\x77\x57\xb2\xb1\xe0\x89\x0b\xeb\x26\x35\xc6\xd1\xd4\xca\x6e\x5c\x1c\x18\x5d\x9c\x7a\xda\x81\x82\xf9\x69\x70\x83\x1f\x05\x20\xbd\x57\xbf\x53\xb8\xce\xd5\x0d\xe0\x8b\x8e\xa5\xef\xda\xb3\x63\x92\x84\x18\x43\x15\xe2\x74\xef\x42\xbd\xef\x66\xa3\x5e\x7a\x31\x02\xf8\x5c\x20\x6d\xda\xc2\x9b\x4f\xac\x4d\xcf\x2c\x1b\x1b\x87\xc2\xe6\x68\x1d\x1a\xc6\x24\x91\x0f\x5d\xac\x52\x97\x02\xeb\x55\x0e\x05\x34\xa8\xc1\x28\xcf\x53\x93\x33\xaa\xb8\xe9\xca\x51\x93\x7c\xd1\xa9\xb0\xca\x4a\x69\x75\x36\xf1\x36\xe3\x07\x4d\x25\xe3\xfc\xb4\xba\x8a\xd6\x67\xc3\x09\xf0\xdc\x47\xfe\xf8\x18\x29\x99\x9f\x1c\x80\xb5\x32\xb6\x03\x3c\x2e\x7c\x76\x01\x3e\xb1\xab\xcd\xe6\xf3\x5e\x35\xc0\x44\x7f\x14\xcb\x33\x06\xd9\x9f\x3d\xe1\x6e\x6d\x75\x3c\xff\x65\xcb\x77\x3f\x65\x8e\xce\x69\xae\x7f\x03\xb6\x61\xfd\x19\xb8\x4a\x74\x85\x36\x88\xdb\x1f\x49\x2b\xbd\x7c\xdd\xe1\x2a\x87\xc0\xc1\x02\x10\x5f\x82\xc9\xe7\x58\x1b\x0c\x53\x9b\xab\x89\xd4\x7c\xcb\x83\xd1\x02\x73\x50\xa4\xa0\x2e\xa0\x77\x24\x0f\x7b\x6d\x13\x0a\x6a\x2e\x57\xd1\x39\x33\x46\x1f\x8e\x97\xab\x83\x45\x45\xa1\x4a\xbc\x8c\x7c\x19\x28\xca\x0b\x56\x3a\x44\xa8\x61\xb1\xe1\x60\x82\xb9\xa8\x1d\xc6\xc4\xcf\x42\x08\xdf\x0b\x21\x96\xe3\x7a\xd5\x6d\xf0\x0c\xd1\xcf\x62\xf6\xc8\xc2\x9e\xfa\x9c\xf7\x7f\xc6\x23\xf9\x91\xda\x8f\xd7\x5f\xc9\xf4\xbf\xba\xce\x04\xbe\xc0\x23\x39\x34\xd4\xcb\xa5\x47\x60\x04\xad\xa5\xc2\x2a\xdf\xd2\xdc\xe5\x64\x62\xd0\x42\x9a\x25\xd3\x03\x4c\xc8\x43\x9f\xe0\x87\x06\x0c\xeb\xaf\x2a\xa6\xaa\xd4\x55\x99\xd9\x5c\x3c\x46\x27\x99\x30\x41\x6c\xc9\x1f\x98\xcd\x85\x15\x07\x65\x78\x66\x05\xea\x0c\x75\x54\x2b\x64\x55\xa6\x74\x61\x94\x1f\x17\xad\x8d\x91\xcb\xb1\x64\x4a\x90\xc2\x4f\x10\x62\x53\x74\xbc\x64\x00\xb9\x86\x35\x15\x2d\xc6\x86\xb4\x4f\xfc\x15\xe2\x1c\xcb\xf8\xa7\xe7\x28\xc6\xea\x8f\xdc\x65\xf1\x67\x8a\xfc\x2e\x09\x90\x29\x55\x4c\x96\x76\xda\x45\xaa\x61\xab\x66\xa6\x38\xf3\x14\x7b\x44\x80\x46\x7e\x3e\x90\x45\xae\x4e\x18\x59\xb8\x9f\x61\x05\x2d\x38\x2e\xda\x5a\x1d\x87\x1a\xd0\x2d\xf6\xfe\x8c\xe5\xf4\x57\x67\xce\x21\x16\xfd\xef\x97\x3b\x87\x1a\xba\x33\x08\xee\xdd\xab\x2d\xe5\xfc\x26\x10\xc2\x6c\x55\xce\xa1\xbc\xee\xd3\x13\x56\x0e\xb8\x00\x3d\x7d\xfa\xf0\x36\x10\xf4\xbf\x8d\x3f\x67\xe8\x0f\x98\x04\x9f\xde\xc6\xfd\xaa\xa0\x43\x39\x3d\x38\xad\x97\x3a\xd4\xfb\x37\xf7\x47\x40\xf2\xcc\x8f\xa0\x43\x82\x14\x79\x5e\x20\x53\xb5\x39\x21\x4e\x1b\xc0\x43\xe4\xb8\x02\x93\x82\x00\x92\x9c\x73\x45\x14\x63\x8a\x68\x52\x14\x69\x26\x24\x2d\x0a\x9c\xa9\x03\x0b\x95\x34\xeb\xc9\xb7\xda\x8f\x05\x52\x42\x28\x9f\xa5\xa9\xcc\xd2\xde\x15\x85\xc9\x62\x4a\xbd\xf0\x2d\x05\x04\xe8\x18\x2f\x52\xfa\x46\xf9\x0a\xf2\x84\xa2\x56\xf9\x79\xb2\xd4\x51\xe7\xa8\x62\x15\x57\x45\x41\x41\x2e\x0c\x77\x81\x5f\x37\x71\xa1\x6e\x16\x46\xff\x34\x78\x94\x77\x6f\xee\xe2\x75\x94\x6f\xde\x26\x87\xf8\xe6\x5d\xf4\x7a\x0b\x6a\xdc\x7d\x7c\x7d\x07\xde\xbf\xe0\x0f\xf8\x90\x4c\x49\xe5\xdb\x14\x02\x31\x1b\x46\x06\x2b\x00\x55\xbe\x42\xd6\x95\x18\x44\x45\xea\x71\x1c\x55\x45\x59\xa4\x36\x2b\x60\x6d\xca\x03\x74\x7e\x18\x5c\xea\xa7\xd6\x77\x46\x01\x0e\x3a\x0b\x1a\xd8\x75\x3d\xc0\x0f\xc3\x32\x11\x32\x17\x7e\x20\x98\x6c\x58\x55\x09\xd9\x75\x37\xf2\x60\xa2\x3f\xba\x68\x88\x60\x17\xec\x72\x9b\x67\xf1\xe9\xa1\xc7\x44\xba\x83\x41\x08\x19\x41\x58\x13\xed\x02\x27\x65\x75\x90\x51\x16\xd8\x5d\xff\xdd\xf9\x5f\x6d\x94\xef\xdb\xcf\x15\x02\xaf\xdf\x82\xab\xd0\x4c\x00\xbd\x7a\xbf\x19\xe4\x9b\xdb\xfc\x52\xc9\x27\xbd\xc9\x72\x50\xc0\xf1\x24\x6b\x5e\x12\x58\x88\x66\x2c\xf3\x9a\xd0\x58\x1a\x6b\xab\x6a\xb5\x4a\xf5\x6a\x2f\x3d\x38\x70\xb4\x60\xf6\xa2\x05\x29\xf3\x73\x67\x07\x3f\x08\x80\x5b\xef\x0e\x32\x27\xc4\x8f\xde\xd6\x8a\x2b\x8c\x31\xe2\xa7\x93\xb2\x16\x83\x53\x6b\xfd\xac\x03\x15\x4f\xd9\x81\xd4\x3e\x98\xbe\xb7\xfe\xa4\x6a\x07\xca\xe5\x14\xa7\xfe\x58\x9b\x0a\x04\x7b\x22\xe0\xdf\x17\xc1\xef\xbf\x3d\xa3\xfb\x44\x1b\xaf\xe6\x73\x6d\xfb\x87\xf7\x1f\xde\xee\xdf\x7f\x78\xfb\xa3\x1d\x8d\xb6\x76\x53\xd5\x34\xc3\x43\x39\xd4\xa0\x9c\x26\x70\x12\x9c\xf2\xc2\x10\xe4\x49\x55\x85\x16\x8f\xd6\x93\x7d\xdb\x75\x5d\x67\x47\x6b\xc7\x71\xf4\xc5\x43\x17\xdc\x6b\x22\x7d\xbd\x4b\xfd\x64\xbc\x30\x51\xe0\xa9\xa3\x3b\x1c\xec\xe9\x3f\x0e\xb6\xdc\x39\x67\xba\xd9\xd2\xb7\xef\xaf\xbd\x9d\x8b\x76\x5a\xf7\x21\x30\x6d\x95\x63\xea\xc1\x00\x8e\x2a\x66\x28\x85\x94\xa1\x02\x30\x45\x0d\x51\x9e\x1a\xa9\x95\x39\x48\x3f\x3b\x3f\x3b\x37\x2d\x4c\x0b\xd8\x14\x45\x19\xa3\xe1\x44\x4f\x03\x21\xbe\xab\x65\xbf\xc5\x7b\x58\xf8\xbd\x6d\x94\x45\x1f\xa3\xff\x14\xfd\xd7\x48\x44\xff\x57\x24\x5f\x22\x16\x06\x70\xe7\x97\x55\x8a\x3f\x5a\x96\x78\xfb\xe2\xb1\xfe\xf4\xed\x6d\xe0\x74\xfd\xb2\x48\xf1\xe6\x8b\x22\x45\x41\x60\x81\x31\xc5\xb8\xe4\x58\xab\xd2\x60\x6f\x85\xd4\xc3\x30\x0c\x09\x6b\xdb\xb6\x1d\x01\x63\xf6\x21\xb2\xd2\xc5\x11\x29\x31\xa2\x18\x13\x81\x29\x46\x68\x7d\xb7\x1c\x13\x7b\x82\x42\xe3\x5c\x43\xd5\x36\xac\x4f\xdb\x59\x02\x97\x8d\x36\x96\xcb\xd3\x71\xb0\x14\x15\x05\x62\xb8\x40\x98\x53\x42\x29\x42\x12\xc3\x52\x08\xc1\xf9\x7a\xd2\x8b\xf1\x63\xd7\x81\x22\x2e\xa1\x3f\xd1\xb2\x28\x18\x2a\x30\x62\x45\x01\x73\x06\x0b\xe4\xe1\x22\x0c\xcc\x50\x40\xa9\xa1\xb5\x71\xc8\x60\x0b\x8e\xd4\xcf\xd4\x9f\x58\xc8\xf7\x1c\xff\xd6\xf9\xb8\x90\x8e\xfb\xf8\x87\xc8\xc7\x5d\x87\xe1\x12\xb8\x2b\xef\x3b\xd3\xb6\x00\xb7\xa6\x79\x68\x15\xd7\xb6\xe5\xb4\x90\x08\xca\x34\x73\x4d\xc8\xc7\xe5\x82\x48\x0c\x1a\x83\x2c\x51\x18\xcb\xda\x06\xa6\x53\x6c\xf2\x5c\x38\x90\x6d\x19\x9e\x09\x67\x32\xc3\x7e\x54\x19\x52\x08\xa4\x45\x26\x33\x78\x95\x91\x63\x70\x40\xbe\x19\x73\x28\x91\xad\xd6\x1f\x63\x63\x0a\x96\x76\x82\xfd\xe7\x19\xb9\xb4\x80\x7c\x1a\x5e\x64\xe4\x5a\x97\xc2\x63\x55\xba\x2e\xe4\xe5\xa2\x9f\xc7\xa7\x33\x36\xdb\x3f\x7e\xaa\xec\xbc\xf4\xa2\xac\x73\xc8\xce\xd9\x8e\x17\x91\xf2\x77\x57\x3d\x5c\xb7\x57\x3d\x5c\xdf\x9f\x67\xfa\xfd\x53\xbd\xe7\x6a\x16\xbd\x58\x88\x87\xa7\x62\xd9\x37\xe7\x63\x6f\x4d\x06\x64\x53\xe4\x12\x62\x56\x42\x41\x49\x65\x8d\x5d\x66\x2d\xc4\xba\x27\x29\x05\x02\x12\x8b\xc0\xd8\x21\x86\x1f\x64\x52\xf9\x59\x72\x98\x9a\x94\xb6\x0d\x75\xb9\x97\x14\xd0\x75\xd9\xe9\x45\x5f\x8e\x83\x86\xc4\x60\x52\x0a\x66\x11\x53\xad\x92\x7e\x90\x32\x9e\x27\xe9\xfb\x60\xd6\x4c\xbe\xda\xb6\x30\xdf\x2d\x82\x95\x90\x23\x5b\x62\x66\x46\xa6\xb0\x06\x03\x99\xc9\x89\x44\x51\xf4\x73\x30\x9e\xe7\x26\xbb\x42\x98\x44\x61\x77\xfe\x1f\xa3\xff\x39\xfa\x5f\x43\xe6\xec\xf6\xf0\xf7\x99\x9c\xaf\xd5\x12\xbf\xe8\xc0\xda\x23\x93\x66\x60\x38\xa1\x42\x62\x2a\x29\xe6\x92\x1d\xdb\xba\x5b\xac\x71\x0e\x30\x5f\xd7\x75\x9c\xc7\xd5\xc2\x25\x63\x0d\xe7\xf4\xbe\xde\x51\xdf\x21\x61\x51\x6a\x32\x36\xf5\xfc\x98\x1d\xfd\xc4\x40\x97\xfb\xe9\x4c\x50\xb9\x1d\x07\x0d\x57\x93\x90\x94\x82\xbb\xdf\x33\x47\xed\xa2\x14\xcc\x0b\x81\x0c\xc1\xa4\x92\x0e\xa9\x52\x83\x8e\x3d\x46\xf4\x31\xda\x6a\x84\xd5\x23\x3a\xf7\xab\x7f\xbe\x86\x36\x34\xb3\xff\x2d\x8a\xc0\xdb\x33\xfc\xf2\x79\xb2\xc0\xdf\x63\x9a\xe2\xa7\x59\x7a\x5a\x44\xc7\x12\x63\xa9\x0a\x9d\x81\x7e\xc6\x88\x71\x5f\xf5\x46\xdb\x65\xd2\x5a\xaf\x86\xb1\x31\x60\x0a\xe8\x3d\x84\x54\x84\x91\xfb\x39\x99\xfd\x50\x30\x5d\xa4\x36\x15\x43\x2d\x1c\xf6\x8c\x00\x51\xf8\xd9\xc6\xe3\x52\x5c\x8e\x7d\xad\x09\xb3\x6d\x81\x15\xc2\x42\x81\x54\x2a\x3f\x28\x99\x44\x93\xf2\xad\xf4\xad\x52\xb3\xb7\x62\x9b\xa4\x66\xb1\x0e\x66\x50\x14\x15\xc1\xb4\xf7\x63\x69\x50\x03\x5a\x7a\x5e\x4a\x11\x88\x28\xe8\x2f\x18\xab\xaf\x9f\x01\x53\xef\x7e\x22\x4c\xec\xfe\x0c\xb7\xfa\xdd\xa7\x3b\x5a\x9d\x6a\x59\x0f\x21\x03\xb6\x1e\x9d\xee\xbd\xd3\xa1\x11\x5c\x00\xe5\x47\x50\xac\x9b\xb3\xef\xc0\x50\xf9\xd2\x82\x0c\x7b\xdb\x2c\xda\x78\xc7\x40\xae\x3c\x4d\x5c\x6c\x60\x29\xcb\x9c\x6b\xae\xf9\x38\x82\x1c\x0c\x52\x0b\x2f\xd7\xf7\x4a\x2f\x44\x6b\x6c\xc8\x3c\x2a\x43\x74\x14\x1d\x82\x6d\xda\x1e\x54\xf4\xf3\xe8\xbf\x89\xfe\xdb\x27\xcc\xc6\x4b\x90\xfe\x87\xeb\x84\xf1\xcd\xdd\x0f\xc9\xfb\xdb\x27\x44\xec\x2d\x39\x1a\x3d\xe7\x9a\x9e\xf4\xed\xfe\xdb\x7f\xbe\xba\x4a\xe0\x77\xa6\x8c\xb9\x7b\x10\x0e\x9c\x32\x18\x72\xc6\x36\xcb\x41\xee\x58\x5c\x4c\xa5\xc9\x80\xc1\x4c\x55\x5c\x8b\x85\x9a\x86\x82\x89\xf4\x19\xc6\x04\xe1\x3c\xc3\x88\x60\x9c\x67\xbc\x8f\x3b\x88\xb3\xb4\x84\x0f\x78\xc7\x7c\x4a\x84\xa0\x50\x8a\xdc\xe3\x5a\xeb\x23\x1b\x92\xb4\x77\xa2\x6a\xf6\xe3\x63\x24\x04\x88\x02\x91\x41\x03\x51\x21\x0a\x7f\x2c\x4f\x80\x52\xe5\x8c\xe4\x8a\x72\x82\x85\x50\x20\x02\x30\x2b\x10\x45\x05\xcc\x10\x62\x25\xca\x32\x51\x65\x8c\xe4\x9c\x2d\xca\xf8\xe1\x9c\x35\xce\xcb\xb2\x53\x4a\x5a\xe5\x02\xe4\x67\x74\x13\x57\xc1\x4f\x17\xe7\x1c\xdd\x73\x7f\xdf\xe6\x9f\x7f\x85\x49\xeb\xf5\x57\xf6\xee\xf8\x8b\xfe\x82\xdd\x14\xd0\x08\xe2\x93\x7b\x70\x2e\x3e\x0a\xea\x08\x5f\x68\xf8\x4c\x26\xa9\x83\x8c\xa3\x4c\xe7\xa2\x6a\xb8\x2b\xbd\xa0\x80\xa3\xda\x6e\x60\xc9\xdb\x71\x10\x01\x9c\x20\xd4\x12\x44\x8f\x11\x30\x75\x8f\x1a\x0b\x98\xd4\x54\x4b\x9f\x2e\xf0\x18\x30\xab\x1a\x46\xf8\xec\x1d\x77\x78\x8e\x33\xe6\x8f\xeb\x9f\xcd\x86\xd1\xe7\xde\xcc\x9f\x5d\x61\x72\x93\x97\x9d\x5a\xf1\xcd\x33\xf8\xdb\xf3\x06\x7b\xf3\xe9\xe3\xf7\xd7\xa1\xb1\xeb\x70\xc5\xfb\xe7\x52\xd4\x78\x8c\xd3\x0d\x58\xe5\x78\x2f\xe2\x56\x57\xf5\x90\x66\x0a\x23\x0d\xfb\x13\x34\x8a\xcb\x5c\x53\x5d\x32\x5b\x2c\x23\xa1\x1a\xb3\x5d\xaa\x85\x94\xea\x61\x52\x4a\x4b\x9b\x74\x42\x68\x2a\x3d\x0d\x1e\x59\xb5\x8c\x71\xb1\xef\x69\x89\x98\xb0\x1d\x7a\x8c\x5c\x59\x40\xec\x5a\x6c\xcb\x42\x8a\xaa\xc8\xb4\xec\x8b\x8a\x43\xdc\x51\xc9\x85\x20\xa4\xe6\x42\x3e\x46\x64\xd0\xc2\x2a\x61\xb9\xd1\xfe\xa4\xad\x17\xc0\xd9\x10\x23\xd3\xe7\xf8\xc6\xcf\xa3\xfc\x62\xd3\x7e\xf9\x34\x9c\x61\x10\x3e\x5d\xf3\x5f\xbd\xbf\x28\xf6\x57\x77\x37\x55\xf5\x20\x5d\x9c\xe7\x85\xc3\xb9\x2f\x0d\x26\xb6\x2c\xe9\x69\x4e\x52\xdf\x22\x40\xac\xe7\x76\x42\x7e\xa8\x2f\x3d\xe4\xfb\xd6\xcf\xba\x05\x25\x25\x88\xc9\xa9\x70\xf6\xbe\x4f\x30\x25\x16\xc0\x93\x69\xee\x67\x29\x77\x69\xb3\x8c\xf3\x22\x40\x7e\xe6\xc7\x21\xb1\x3d\xa8\xc0\xee\x77\x89\xa9\x84\x18\xeb\xd5\xc3\x76\xa6\x6e\x51\x9d\xeb\xba\x75\xc9\x94\x8c\x92\x82\xd1\x9c\x32\xac\x44\xb7\x2f\x40\xa8\xb1\x91\xcc\x96\x78\xe9\x15\xcb\x5c\xc6\x41\x87\x8a\x1a\x61\x30\x46\xa1\xbf\x69\xab\xf3\xfe\x3e\x54\xfb\x3e\xa1\x92\xff\xf0\x0c\x20\xf4\xe9\xe3\xa7\xdb\x68\xff\xa2\xb9\x61\x8b\xd0\x5d\x55\xb9\x5f\xe2\x1f\x77\xfb\x50\xf0\x1d\xc3\x3c\xaf\x50\x0e\xe6\xc5\x72\x21\x35\x25\xd6\x9f\x56\x3f\x05\x40\x6a\x34\xb3\xa5\x2f\x7d\x04\xa7\xde\xda\xa2\x56\x9e\xed\x84\x5b\x0a\xe7\x02\xf2\x4c\x0b\xe0\x52\x5c\xae\xfc\x71\x3f\x94\x08\x53\x66\x2c\xcb\xf2\x92\x22\x3f\x18\x58\x2a\x56\xf7\x54\xb1\x5c\x32\x93\xa7\x92\x57\x0b\x7a\x18\xa4\x4c\x90\x3f\x5a\x6b\x3d\x75\xce\xad\xe3\x92\xa1\x96\x1f\x3f\xd5\x0e\xfd\x8b\x0d\x31\xe2\x2a\x4a\x1d\xfc\xec\xa7\xee\xa4\x4f\xaf\xde\x7e\xd9\xbb\xfe\xcd\xeb\x6f\x5e\xc7\xeb\xb3\xa8\x20\x25\xae\x3f\x42\xca\xe7\x63\xf8\x1f\x68\x63\x0a\x1d\xb5\x54\x49\x6e\x79\x4b\x34\x2a\xfb\x82\xb2\xec\x80\xed\x7d\x55\xb8\x3c\xf3\x15\x40\xa8\xa8\xb2\xdd\xb0\xaa\xf1\x25\x07\xf8\x61\x46\x20\x4b\xd0\x62\x3d\xef\x2b\x27\xc7\xce\xe8\x66\x00\x34\x2e\xbc\xf2\x33\x28\x40\xe8\x3d\x09\x7d\xea\xed\x53\x4d\xec\x2f\xa3\x7f\x19\x7a\xd4\xef\x2e\x01\x82\x9f\x2a\xf8\xed\x37\xaf\x13\x12\x5b\x8d\x10\x2c\x4b\xdb\x74\x90\x96\xc3\xd6\xbf\x05\x64\x9c\x43\x83\x0d\xe3\x8c\x29\x66\x89\x44\xa8\x2d\x30\x4d\x83\xe4\x59\xfe\x52\xf4\x11\x14\x4b\x06\xca\x8b\xe8\xce\xd3\xba\x75\xa2\x6f\xb4\xae\x46\x40\x63\xe4\xf9\x08\x18\x80\xd1\x21\x1e\x42\x8e\xe3\xef\x2d\xf7\x3a\xe1\x43\x3c\xda\x12\x41\x42\x6c\x37\x40\xca\xa6\xad\x5f\x0c\x54\x31\xca\x1d\xd5\x74\xf5\x37\x78\x4d\x14\x46\x6d\x41\x68\xfe\x53\xe4\xae\x7d\xd9\x55\x4e\x0e\x9d\xd6\xf5\xf8\xd9\x94\x47\x71\xc8\xdd\xd7\x07\x13\xfd\xb3\x2b\x24\xa6\xb0\x57\x27\x4f\x3d\x1b\x17\xfc\xa5\xbb\xe4\x2e\xbe\xa2\xe7\x7a\xbd\x79\xf8\xdf\x7c\x7a\x7b\x98\xc8\x30\x83\xd9\xeb\x1a\x40\xe2\x87\xde\xd5\xfe\xc8\x41\x66\xbc\x8d\xa3\xfe\x58\x80\x93\x8f\x92\x41\x80\x2c\xd7\x35\xa6\x50\x94\xa4\xcc\xfc\x28\x3c\xcb\x5c\xad\x9c\xce\x87\x83\xd1\x28\xef\x6c\x2f\xac\x01\x99\x77\x40\xcd\xb5\xb1\x95\x6d\xf2\xd4\x3d\x28\x7f\xf2\xaa\x49\x6d\xc6\x7a\x90\xf9\xa3\xef\x95\xe6\x20\x9d\x42\x7c\xab\x7f\x34\x37\xee\x10\x45\xff\x20\xf4\x48\x87\x08\xca\xa5\x86\x79\xff\xe3\x58\x6c\xe9\x4e\xf8\x1c\xcc\xf7\x3c\x4e\x3d\x4c\xa4\xcb\xb0\x10\xb2\x64\x98\xca\x76\x61\x36\x2b\x38\x5f\x25\x64\xb2\x3b\x44\xee\xb7\xad\x73\x7b\x22\xe0\xa9\x6f\x8e\xb2\xaa\x1a\x27\x80\x8c\x23\x38\x75\xd5\x28\xad\x1d\x6a\x01\x6c\x94\xc4\x2a\xe8\x53\x15\x98\x1f\x7f\x7d\x85\xda\xb3\x45\x8a\xbf\xfd\x32\x52\x7c\xe1\x90\xff\x5a\xbc\x38\xee\xe2\x3a\xad\x52\x60\xbd\xcc\x0b\x01\x0d\x6a\xcb\x4b\xa0\x58\x33\xd3\x91\x51\xd3\x6c\xa1\x3b\xc8\x98\x26\xfc\x81\x3a\x6b\xad\x10\xd6\x65\x27\xde\xe6\x76\x1f\xba\x0b\x9c\x4f\xfb\x73\xa8\x78\x9c\xb7\x48\x71\x5e\x29\x63\x5b\xc0\x63\x04\x06\x22\xb9\x60\x0f\x55\xa8\x41\xe2\xbe\x72\x21\x60\x5c\x74\xba\x02\x6a\x5b\x13\xfd\x19\x93\x7e\xff\xcc\xde\x9a\x7c\x03\xa2\xd7\xb7\x31\x08\x56\x5c\x58\x16\x51\xb2\x3b\x59\x54\x21\x53\x31\x80\x40\x56\xd6\xc4\xf7\x1d\x40\xcc\x8f\xc7\xd1\xf7\x12\xa0\xd1\xb7\xe2\xa0\xc6\x11\x9d\x06\x7f\xf2\x85\x97\x80\xc4\x24\x5b\xb8\xb7\x43\x55\xb9\xf9\xd8\xb8\xfa\x08\xaa\x38\xf0\xf4\xed\xf7\x97\x18\xd2\x56\xf3\xf8\xc7\x81\x6f\xf7\x89\x4b\x3a\x39\xdb\x98\xfb\x6b\x3a\xe2\x0a\xc1\x66\x99\x3a\x08\xf1\x13\xbb\x78\xad\x5b\x63\xda\xf6\x20\xa5\xb6\x56\x30\x9f\x59\x67\xeb\x85\x2b\x1d\xd7\x9e\x81\x22\xda\xb8\x63\x93\x34\xf4\x2a\xfc\x2a\x60\x90\x85\x35\xff\x84\xce\xfc\xea\xfd\x15\x0c\xd9\x06\x88\xfa\xea\xed\xab\xd7\x67\xd4\x31\x50\x1a\x88\x5a\x88\x75\x09\x69\x20\x3c\xb1\x5e\x5a\x24\x6a\xb0\xe1\x61\x1f\x74\x51\x3b\x23\x0b\x5d\x69\x7f\xd4\x7e\x5c\xcf\x62\x47\x38\x05\xcc\x57\xab\x46\x5f\x65\xf0\xa3\xe7\x67\x8c\xb1\xdd\x10\xf6\x9f\x9f\x2e\xcb\xeb\x2b\x59\xf6\xfd\xd7\x64\x91\xcd\x1c\xfa\xfe\x7e\x5c\x14\xe1\xed\x67\xa2\xec\xa3\x80\xd5\x15\x8f\xd7\x73\xff\xfa\x0a\x51\xee\x79\xee\x2f\x38\xa4\x3c\x29\xb2\xcc\xc1\x3c\xe1\x73\x3f\xec\xab\xdf\xf2\xbd\xfb\xad\xd8\xd7\xd5\xbd\xad\xaa\x9d\xbc\xb7\xb1\x28\x72\x84\x4a\x89\x79\xc9\xb1\xef\x30\x06\x65\x7d\xe6\xd3\x09\xf9\xaf\xb8\x88\x6e\x43\xbd\xff\xc6\x30\xb7\x7f\xca\x81\x7d\x7f\x0e\x17\x7e\xbb\xff\xee\x53\x9c\xd9\x62\x67\x9c\xf4\x27\x80\x80\x45\x4b\xef\x9d\xaf\x3d\xa2\x40\x82\xbc\x35\x25\x15\x27\xd9\x83\x1c\x20\x1d\x17\x90\xe8\x4a\xe2\xb4\xca\xa4\x28\xaa\x1c\x31\x8e\x0b\x61\x90\xa1\x4c\x87\x18\x1e\x7b\x2c\x6f\x9a\xb8\x7a\xe2\x65\xfb\x67\xeb\xf8\x7e\xc7\xf0\x58\xa2\x0a\x55\xe4\x09\x9d\xeb\xf1\x79\x74\xee\x5e\x39\xb7\x33\xf7\x2a\xc6\x04\x22\x2c\x30\xc3\x0c\xfb\x9e\x10\x80\x5d\xc0\xfb\x88\x70\x92\x05\x5e\xfa\x8b\xa7\xfd\x1f\x9e\xd0\xf1\x5f\x20\xdf\x3f\x45\xc4\xde\xdc\xbd\x3a\xc7\x64\x6e\x3f\xbc\xfd\x93\x78\x83\x59\x79\xff\xa3\x7f\x6d\x63\x33\x88\xef\x3e\xec\x5a\x9d\xe5\x43\x06\x2d\xcc\x01\xf4\x43\xd8\x93\x8b\x87\x1e\xca\x06\xf0\x79\x9e\xe7\x7b\xba\x7e\x8f\xbe\xf8\xba\x06\xf2\x31\x0a\xe6\x72\x74\x50\x05\x42\x18\x17\x84\x2a\xa6\xb8\x64\x12\x58\xc4\x06\xc5\xd8\xc8\x57\x3f\x3c\xae\x0a\x84\xe4\xcb\x6f\x7b\x79\xf9\x36\x8a\xfe\x61\xd4\xc7\xe3\x0d\x3d\xd0\x1f\xe5\x1e\x8c\xae\x71\x58\xde\x9c\x2b\xa1\xae\xdf\x5f\xf7\xd0\x5f\xf7\x0f\xee\xca\xd5\x6d\xb5\x97\xa8\xe8\x7a\x3c\x64\x5f\x7c\xb4\x1b\xac\x66\xca\x3c\x4c\x82\x31\xca\x63\x29\x85\x65\xf6\xe1\x14\x5e\x0e\x74\x51\xa0\x5f\x3d\xfb\x99\x80\xe1\xf9\x7a\xc0\x25\x27\x88\x17\x98\xe3\x82\x13\x86\x05\x2a\xc3\x39\xe0\x6d\xa4\x01\x3f\x4f\x45\x6f\x42\xd6\xe2\x45\x7e\xfc\x1c\x18\x09\xe5\xad\xb7\x4f\x71\xdf\x2f\xc8\x61\x57\xdd\xfe\xfe\xaf\xc2\x76\xf9\xe4\xea\x24\x0a\x20\x84\x2c\x2c\xe2\xd2\x9f\x44\x2f\x26\x33\x3a\x7f\x22\xad\x1e\x8e\xb5\xad\xaa\x54\x09\x5d\x12\x90\x7a\xd6\xc7\xd8\x2d\x47\xe7\xa8\x92\xe9\xe4\x1d\x30\x35\x7a\xc2\x59\x6c\x98\x44\x94\x18\xab\x55\x3b\x4c\x56\x73\x77\x34\x46\x56\x61\x97\xd2\x76\xc9\x29\x8d\x29\xd5\x08\xa7\x46\x57\x4b\x69\x7d\xe0\x15\x89\x42\x8d\x52\x02\x7f\xfa\x33\xcd\x12\x1c\x2c\x89\xc4\xbc\x58\xf5\xf6\x5e\x3a\xb7\xb3\xf7\x32\xae\x82\x3d\x25\x09\x27\x9c\xf8\x06\x63\x40\x1b\xba\xd5\x71\xf6\xa1\xfe\xaf\x8c\xbe\x8d\x7e\x13\xfd\x77\x17\xfc\xe3\xd5\xfe\xf9\xc5\xcd\xfb\x37\x61\x5b\xfb\xf4\xf6\x5d\x28\x6d\xfc\xf4\x76\x63\xa6\x3a\xbf\x0d\xb5\x06\x6f\xde\x1e\x02\xa0\xcf\xfb\x37\xbf\xb8\xbd\xea\x19\xf9\xfe\xfd\x9b\x50\xaa\xbe\x7f\xb6\xb4\xb7\x29\x8d\xe2\xa8\xc9\xaa\x06\x8e\xb2\x2d\x5a\x48\x54\x0e\x79\xd6\x27\xb4\xd4\xb2\x85\x4d\x78\xcf\xb2\x74\x88\xf3\x2e\xcd\xba\x3e\x63\x19\xcc\xd2\x54\x67\x25\x15\x64\x39\x29\x02\x19\xc5\xf1\xe8\x16\xea\x5c\xdc\x2c\x74\x3d\x0e\xa5\xd6\x42\xf9\xa1\xe3\xd5\x49\x74\x39\x25\xd3\xd2\x55\x8a\x57\x73\x78\x23\x56\xd5\x2e\x14\x1b\x60\x9a\x73\x64\x56\x27\x67\x40\xa2\x44\xa4\x5e\x52\xce\xe3\xd9\xcf\xda\x2b\x13\x45\xd1\x3f\x08\xbe\x72\x73\xd0\x57\xbd\x79\x7f\x7e\xf6\x2c\xff\x5d\xf0\x2d\x83\xb6\x7b\x75\x85\xc5\xf8\xe1\xfd\x87\x73\xcb\xec\xe5\xbf\xa0\xdb\x9f\x40\xdb\x7e\x84\x0b\x22\x69\x2d\x4a\x30\x55\xca\xdd\x2b\xab\x14\x2c\xa4\x8b\x27\xe6\xb8\x65\x01\xb7\x6d\x66\x6c\x16\xa5\xc1\xe2\x61\x30\x4c\x2a\x19\x4f\x25\x34\x90\xd4\x25\x74\x79\x79\xd0\x85\xb5\xde\x5a\x6f\xac\x05\xca\xce\x18\xb1\xa3\xc7\x40\x7a\x7b\x39\x96\x27\xca\x62\xa0\x96\xd6\x35\xb4\x76\x94\x1c\x95\xd4\x75\xd5\xa2\xce\x15\xe1\x1c\x70\xaf\x59\x02\x83\x1f\xb9\xd5\xee\x5e\xe9\xba\x2b\xda\xd0\x9b\x77\x1f\x7f\x03\x2e\x5a\xfd\xf6\xe3\xa7\xbb\xef\xaf\xb3\x27\x6f\x37\xd4\xa3\x7f\x0e\x5e\x54\x97\x6c\xd0\xab\x17\xa2\xa7\x7d\x66\xb3\x3c\x8e\x24\x56\xae\x29\x87\xa6\x6a\x09\x23\x86\x94\x45\xc1\x1d\xa3\x42\x22\x3f\xdc\xf3\xc9\x4c\x7a\x9e\xf5\x64\x26\xa5\xd2\x2c\x76\x44\xc0\x02\x12\x98\x67\x4b\x87\x39\x37\x74\x55\x19\xba\x69\x0e\x7a\x5d\xc1\x9d\x26\x48\x23\xa1\x90\xca\x8b\xb2\xa4\x18\xc9\x96\x72\xc2\x5d\x47\x08\xa5\x82\x52\x8c\x8b\x02\x42\xaf\x6c\x2a\x53\x76\xe4\x9c\x19\xe5\x27\x26\xb6\xfa\x92\x39\xf4\x8f\xab\x08\x46\xbf\x3e\xe7\xd1\xb7\x5a\xd0\x75\x34\x61\xb9\x9f\x7b\xa5\x7f\x71\xa9\xc7\xfe\xf8\xe1\xed\xf7\x2f\xfe\xc2\xb3\xd5\xbf\x55\x6b\x7f\xbe\xbe\x71\xb5\x6a\x86\x6e\x48\xa5\x10\x84\x49\xc6\x5c\x51\x77\x69\x15\xa3\xc6\xb6\x5d\x3a\x0f\xa4\xa2\x8e\x97\x15\x35\xa8\xea\xb2\x06\x34\x6e\xa9\xdd\x13\xd7\xc5\x7e\xac\xaa\x75\x90\x3a\xcb\x28\x57\x9c\x64\x75\x69\x94\xd3\x94\xea\xaa\xd2\x19\x21\xda\x96\x96\x36\x15\xd7\x6c\xd5\x16\xf2\xc1\x32\x96\x48\xdf\xb6\x3e\xea\xb6\x67\xf9\x14\x7c\x19\x13\xfd\x2c\x30\x76\x6f\x59\x88\xcf\x18\x3c\x9f\x59\xef\xaf\x6a\x60\xcf\x3b\xd5\x4b\x44\xef\x57\xdf\x3f\x01\x3f\x7e\x7a\x6a\xcf\x7d\x62\x78\xc9\xc0\x98\x41\x57\xe4\xe0\x78\x5f\x01\xc7\xeb\x99\x1d\xe3\xa8\x6d\x48\xdb\x2e\xee\xe4\x40\xea\xe6\xb9\x5f\x8d\x7e\x89\x4a\x8a\x0c\x63\xc2\x61\x6f\x6b\x2e\x40\x54\x74\x0d\xe1\x94\xcf\x8d\xd7\x20\xeb\xba\x53\x6c\xb7\xca\xa9\xfd\x1c\xf8\x1c\x4c\x46\x05\xd1\x05\x45\x5c\x49\x3c\x08\x21\x84\x51\x5a\x19\x49\x29\xa5\x92\xf0\xd2\x2a\x30\xb0\xd2\x9f\x98\x22\x98\x82\x0c\x41\x4d\xd5\xfa\x37\x94\x52\xb3\x0a\xeb\x7a\xc3\x7e\xfd\x65\xf4\xf6\x29\x5a\x7e\x61\x2d\x79\xff\xa2\x44\x39\x58\xa7\x6f\x03\xcc\xf2\xfb\x4f\x77\xdf\xee\x43\x37\xfc\xab\xbb\x57\xef\x42\x37\xc9\x96\xec\xde\x77\x28\x07\x52\xd3\xc9\x6b\xc0\x7c\x6d\x83\xd5\xad\x8f\xb0\x14\x80\x65\x10\x3b\xe2\x7b\xfc\x50\xe4\x4e\xb9\x78\x38\xa3\x5c\xc5\xf9\x32\xa9\x40\x58\x63\x30\xd6\x46\x71\xa9\xb5\xe4\x8a\x94\x1a\x16\xbe\x31\xa5\xec\x5b\xee\x3a\x50\xf8\x6a\x12\x9d\x6f\x65\x58\x9b\xab\xdc\x69\xb0\x27\xd7\x5d\x78\xeb\x5b\xff\xd7\x17\xb9\x0f\xbf\x43\xf0\x8f\xd7\x92\x27\x2f\x24\x2f\x20\x90\x1a\x16\xc7\x17\xa2\x8f\x10\x49\xc0\xf2\x1c\xd5\x45\xfe\x15\xd9\xe1\x72\xd4\xab\x89\x79\xd0\x18\x6b\x5a\x2a\xa1\x9d\xd3\x42\x11\xa2\x0b\xe8\x6b\x42\x88\x3a\xf5\xbc\x39\x02\xe2\x35\x88\x4c\xef\xad\x0e\x73\x1e\xf7\x61\xce\xff\x2e\xb2\xc7\x5f\x93\xbd\x2f\xf2\xb3\xec\x66\x8b\x03\x9d\x65\xc7\x02\xd0\x2c\x47\x55\x01\x83\xec\x99\xd3\x2e\x1e\x36\x1f\x48\xc6\xc5\x32\x1a\x90\xfb\xe9\x60\x70\x69\x18\xd5\xa1\x6a\x9f\x6b\x46\x4d\x51\x78\x4d\x19\x35\x8f\xd1\x91\x77\x33\xe0\x5e\x80\xdc\x8d\x5e\x6a\x73\x9e\xfb\xb8\xfe\x7b\xc9\xff\xc7\xe0\x0f\x2b\x7f\xb9\xca\x6f\xa4\x6e\x1a\x2d\xd7\x2b\x54\x78\x45\x19\xb3\x8f\xd1\xc4\x7b\x10\x01\xb1\x7a\x00\x6e\xf2\xc2\xd8\xb3\xfc\xfa\xff\x4b\xf9\xb1\xfb\x7d\xf2\x13\xb3\x2a\x5e\xd3\xb6\x46\xad\x57\x08\x79\xce\x38\xb7\x7e\x9a\xd8\x08\x32\xa0\x3c\x01\xa8\x3e\x79\xae\xab\xb3\xfc\x45\x90\xff\x4f\x7e\xf2\x33\xfb\x24\x7d\xf2\x2c\x3d\x78\x21\xbd\xa2\x5f\x11\x9e\xa1\x20\x7b\x57\xfe\xb8\xec\x84\x9a\x51\x3b\x3d\x0c\xda\x69\x29\x8c\xf4\x48\x48\x51\xf9\xd1\x9f\xf8\x04\x0a\xe0\x3c\x02\xa4\x7b\x8c\x7c\x69\xda\xb3\xec\xe4\xef\x3e\xf7\xc9\xdf\x6e\xee\x59\xfe\xfb\xe7\x9e\x50\x2d\x84\xb6\xba\xef\xb5\xd5\x92\xeb\x12\xf9\x52\x08\xe1\xfc\xf8\x18\xf1\x23\x80\xc0\x7a\x0c\xca\x76\xf6\xc4\xd4\x51\xf4\xb3\x04\x9d\x71\xa2\xb2\x27\x5c\x82\x1f\xa2\x3f\x0f\x56\x4f\x04\x82\x40\xcf\xa6\xf2\xdd\x85\x67\x7b\xfd\x2f\xf4\xdc\xbd\x80\x7b\xfb\x0c\x5e\x6f\x83\xa2\xef\x40\x06\x7d\x05\x74\xa8\x1a\xad\x3d\x82\xa0\x7f\xb0\x56\x88\x93\x30\xf2\xe1\x98\x9c\x1e\xb2\x38\x62\x58\x21\x06\x3a\x21\x04\x57\xcb\xc9\x20\xc5\x71\x66\xa1\xac\x3b\x59\x6b\x4c\x14\xdd\xd5\xda\x76\x90\x52\xab\x7d\xb6\x65\x0c\xc2\xe1\x73\x9b\x0b\x4d\x94\x82\xb6\x95\x6d\x0b\xfd\x00\x73\x2c\x70\x45\x09\x07\xb8\x98\x1c\x69\x36\xfc\x4c\x76\xd3\x06\x7e\x8f\xeb\x5e\xcc\x80\x72\x78\x35\xb2\x50\xd1\xf4\xfa\x0c\x4e\x1e\x86\xf7\xa2\x03\x33\x98\xc1\x9f\x0f\x50\x83\x16\x56\x59\x0a\x6a\x5f\x22\xd0\x3f\x10\x40\xf3\xcc\xf3\x36\x60\x5b\x59\xed\x07\x51\xea\x92\x83\x29\x58\x73\x4b\x66\x72\x6a\xe8\xc9\x15\x44\xa1\xd4\xe4\xac\x6f\xd8\xbe\x0b\x83\x6a\x57\x4f\x81\xb3\xa5\xb9\xe0\x9c\x82\xcc\x23\x65\xa8\xd1\xa8\x3f\xd1\x69\x28\xa1\x9f\x26\x72\x9a\xbc\x81\x10\xdb\x62\x60\x25\x8b\xa2\x5d\xd4\xee\xf8\x4d\x7e\xe0\x01\x17\xf4\x97\x1b\xcb\xef\xab\xb7\x1f\x82\x1f\x7e\x7b\x06\x3c\x0b\x6f\x56\x67\x6d\x63\x1d\x5d\xcf\xbb\x22\x3e\x19\x3f\xf9\xa6\x00\x02\xc0\x74\x71\x0f\x36\x9e\xcc\x63\xe4\x47\x04\x08\xc8\x96\x6a\x27\xb0\x29\x16\x85\x4c\x71\xe0\x1e\x4a\x82\x15\x2e\x33\xab\x3c\xa4\x18\xe9\x02\xd5\x79\x49\x32\x8a\xd3\x92\x64\x04\x07\x1c\x2e\xbb\x23\x37\xf9\x41\x3c\xe1\xaf\x3d\x61\xd1\x9d\xef\xfe\x7c\x7d\x8d\xbb\x96\x2e\x4d\x7c\xaa\xfc\xc9\x77\x05\xe0\x3b\xbb\x34\xf1\xe4\xb6\x77\xec\xbe\xaf\x55\x29\xab\xa4\xae\x15\x11\xd5\xbe\xac\xcc\x32\x69\x8a\x35\x7e\xbe\xea\x73\xc4\x0b\xc8\xc3\x79\x95\x41\x3f\x96\x37\x30\x29\xa2\x5f\x9c\xfb\x6c\xa3\xd7\x77\xd7\xe5\x3c\xe1\xee\xaf\xd6\x39\xf9\xf2\xc3\xeb\x25\xdc\x25\x11\x25\xa2\x86\x1d\x29\xd6\x29\x2a\x81\x01\x70\x71\x09\x4d\xb2\xab\x8f\xeb\xf5\xe3\x62\x31\x8b\xd0\x54\x13\x9d\x8c\xdb\x4b\xf1\xd0\x52\x9a\x9b\x1c\x0d\x46\x3a\xad\x01\xb2\xeb\x07\x99\xc9\xd0\x60\x84\x53\x0a\x60\x24\x35\xd5\x8a\x84\x73\xc0\xd2\x27\x01\x0f\xe4\xd2\x3f\xf7\xf1\x27\x74\xcf\x9d\xb1\x39\xde\x84\x5a\xba\xef\x2e\x45\x37\x37\x29\xf5\x7c\xa9\x30\x98\x81\xaa\x4a\x76\x72\x0f\x7d\x15\x0f\xd2\x1f\x29\x32\x88\x0e\x14\xd9\x82\x0c\xd2\x38\xba\xb4\x49\x24\xaa\x6e\xa6\x7e\xe8\xba\x99\x1d\x2b\xcb\x0e\xca\xb2\xdc\x2a\xdc\x39\xdf\x35\x0d\x28\x87\x4a\x5a\x62\x55\x21\x0d\x31\xea\xa1\xab\x84\x69\x9c\xf5\xb3\xe3\xc8\x95\x5a\xaf\x2b\x59\xe9\xcd\x96\x1e\x7f\x97\xfc\x77\xbf\x57\xfe\x73\x28\xf2\x22\x7f\xb9\x28\x14\xe7\xc0\xd6\x94\x83\xb4\x7a\xb0\x55\x3c\x2b\xdf\x33\xec\x10\x3d\x52\xec\x10\x19\x65\xe5\xf8\x62\x12\x2c\xeb\x1e\x44\xc4\xb7\xfd\xf0\x18\xf1\xa9\x76\xfc\xab\x43\x30\xfa\x32\x04\x27\x75\x53\xb9\xc7\xe8\x32\x04\x8b\xb9\xd2\xa1\xa7\x56\x06\x7c\xe0\x2d\x06\xf2\x4f\x5f\xc6\x3c\x92\xcf\xd8\x6d\x13\x9e\xf4\x0f\xd8\x5d\x60\xcf\x1a\xd0\x58\xd0\x7b\x1c\xc3\x7b\x18\x23\x4f\x0f\xe8\xa1\x01\xd3\xb0\x8c\xfd\x62\xc6\xd1\xfa\xc1\x5a\x80\xa2\x7d\xd4\x01\x77\xc3\x03\x26\xdc\xb7\x67\x5e\xe3\xe8\xf5\x15\xbe\xcf\x59\xed\x5c\x03\x95\x6c\x05\x61\x5d\x92\x67\x69\x95\xc5\xc7\x87\x39\xcb\x63\x76\x3f\x00\x9c\xa7\x4b\x16\xa3\x24\x7d\x98\x2f\x87\xcf\xec\x7e\xf8\x9b\xea\x50\x60\x04\x89\x41\x68\x41\xf1\x80\x0b\x3f\x12\x3f\x13\x7f\xa2\xa0\x5f\x32\x1d\xfd\x2c\xce\x1f\x45\xc8\x93\xbd\x7a\x42\x4c\x79\x17\x90\x90\xff\xfd\x16\x25\x09\xc8\x41\xb7\xcf\x0a\xfe\x1a\x2d\xed\xa7\x28\xf8\x78\x04\x2c\xcf\x7c\x09\x8e\x79\x56\xc3\x18\x2e\x2d\x8a\xf1\xd6\x3e\x8b\x6a\x5d\x3f\xc0\xdd\x78\x5f\xc4\x8c\x97\x1a\xf3\xb8\x50\x5a\x49\xbb\x48\x57\x3a\x4b\x72\x07\xf5\x74\xd2\xa3\x25\xcc\x88\x5d\x83\x4b\xcb\x39\xac\xac\xf2\x91\x39\x05\xb0\x9f\xdc\x66\x42\x51\x25\x0b\xd3\xaa\xb6\x46\x7e\x84\x39\xe6\xd8\x72\xca\x01\x42\xc7\xa0\xde\xa3\x34\xa6\x5f\xd5\xef\xe5\xa6\xdf\x5f\x4e\xf4\xef\xd6\xef\xcf\xe3\x3b\xdc\x1c\xee\x7e\xf5\xc3\x87\xb8\x8d\x21\xac\x61\x1c\x2d\xc7\x1c\xc6\xf0\xbe\x01\x06\xe6\x3e\x1a\xd6\x45\x56\xdb\xda\x6b\x4d\x0c\x51\x31\xd6\xcc\x52\xfd\x60\x2d\x54\x56\x81\xbc\x42\xac\x2e\x53\x9b\x63\xf4\x18\xf5\x7c\xd5\xf1\x95\xe5\x6c\x19\xe3\x22\xe8\xf8\x27\x40\x33\x8f\x43\x12\xbc\xe8\x27\x76\xd6\xf1\x74\x9a\xbc\x2b\x20\x36\x45\x8f\x0b\xc2\xa3\x38\x26\x21\xc6\x9c\x46\xaf\x83\x5e\xbd\x74\x7b\xc4\xe0\x5d\xf4\xfa\x8c\xf8\x74\xa9\x2d\xfd\x47\x71\xf8\x49\x68\xd2\x78\x9e\xe6\x71\xba\x1c\x85\x8f\x14\x18\xb9\xb7\xc0\xc0\xd4\x5b\x30\x55\x52\xa2\xcc\x65\x88\xb6\x2d\x3b\xa4\xee\xd8\x56\x8b\xf5\xda\x00\x1e\xa7\x55\x7b\x5c\xe8\x52\x11\xd4\xa0\x56\x14\x44\x44\x51\x1c\x89\x73\x4c\xed\x2f\xa2\xf7\xeb\xaa\x7d\xea\x8e\x3c\x73\x1a\x7c\xf3\xfa\x36\x4e\x7e\x09\xde\xff\xe5\xeb\x97\xd9\x91\xd0\x51\x1d\x66\xb5\x05\x9d\x03\x9d\x2f\x63\x68\x53\x30\x78\x94\x61\x5d\x58\xdc\x41\x0e\xf3\xdc\x42\x5e\x4a\x2d\x14\x77\x5c\xe4\xf7\x28\xce\x7c\xb9\x3f\x31\xac\x31\x3b\xa4\x52\x6a\xb1\x3a\x2c\xc6\x17\xfe\x04\x72\x40\xa0\xa7\xbe\x66\x16\xe4\xe5\xec\x40\xe6\x34\x6f\x1a\x90\xc7\xda\x88\x93\x34\xa5\x15\xd1\x3f\x8c\x79\xe8\x45\xd6\xe7\x18\xf1\x66\xc7\xfc\xea\x8c\x93\xfd\x1f\xae\xf9\x1c\x7f\x0c\x72\x61\xff\x05\xe4\xc2\xfe\xdd\x77\xbf\x13\x72\x61\x77\xc4\x30\x46\xf7\x69\x9c\x97\xde\xec\xca\xfb\xce\xd5\x35\x40\x8d\x6e\x3c\xb2\x36\x56\x65\xe3\xe7\xe2\xf4\x20\xfb\x1e\x77\x5d\x3c\x0f\x63\xd9\xf7\xbe\xc3\xad\x9f\x31\x88\x66\xca\x55\x63\x8b\xa9\x27\x9c\x13\x40\x41\x4d\x98\x2c\x35\x13\xb2\x16\xde\xb4\x1b\xe8\x82\xfa\xe9\x98\x0b\xe5\xf4\x8c\xb9\xc0\xd4\x4b\xcc\x85\x43\xe0\xf6\xaa\x5f\xe0\x51\xfc\xe6\x33\xce\x99\x97\x13\xf2\x93\xb8\xbd\xe2\x36\x4e\x33\x58\x15\x39\x98\xef\x29\xdd\xe5\xf7\x93\xb3\x16\x40\x67\xab\xc0\xed\x95\xf9\x0c\x31\x8a\x0c\x61\xaa\x55\x9e\x59\x21\x6a\x93\x37\x27\x22\x19\x07\x59\xef\x59\x8c\xb3\x7c\x3f\x94\x18\x33\x66\x95\xcf\xcc\xd6\x3f\xaf\x48\x69\x05\x27\x6c\xa3\xf6\xaa\x81\xe2\xf4\xb8\x51\x7b\x1d\x31\x54\xbc\xb5\x08\x45\xbb\x90\xaf\xab\x43\x9c\xee\x4f\x02\xd6\xd7\x93\xad\xfd\x8c\x53\x75\x31\xb2\x03\x2f\xe9\x15\xd9\xf6\x3e\x2b\xf3\x38\x72\xaa\x3f\x02\x5c\xfa\xc6\x9f\x66\xdf\x52\x80\x86\xce\xaa\x38\xcd\x91\xad\xe5\xd2\xa9\xd8\xd8\xc5\x38\x17\xab\xc5\x1c\x34\x57\xf6\x58\xa9\xd2\x91\xda\x31\x47\x64\x75\xb4\x8c\x2e\x95\x6a\xea\xe5\xf8\x30\x0b\x91\xa4\xcb\x09\xe8\x0d\xbf\x26\x3a\xc7\x96\xde\x44\x7f\x1e\xe2\x4a\xd7\xcc\x98\x21\xca\xb2\xae\xac\xef\xbf\xf8\x34\x04\x9c\x40\xe8\x1d\xfa\xb4\xf9\x0a\xdf\xbe\xbf\xbb\xb9\x83\xdb\xee\xbe\xb1\x52\xbd\xba\x4b\x26\xc7\x0c\xef\x78\x3b\xba\xf9\xa4\x39\x23\x31\x75\x5c\xf3\x8e\x77\x47\x37\xcf\xb5\xe6\xfc\xbe\xda\x35\xa8\xd4\xa5\x6f\x40\xed\x99\x69\x00\x46\x7e\xf6\xdc\x8f\x9c\x49\x3d\x48\x57\x14\xb2\x5e\xa6\x9d\xf1\x15\x40\x95\xe6\xcd\x60\x87\xc1\x72\xa6\x39\xf4\xfd\xd5\x27\x30\xb8\x3c\xb3\xe1\x9c\x8a\xa3\x9d\x33\x27\x4d\xc5\x65\x07\x1c\x35\xa2\x86\x31\xdb\xc6\xca\xaf\xc6\xfa\xd7\x7f\xa7\xb1\x7e\xdc\x06\xfb\x6a\x1d\xec\xdb\xcf\x06\xbb\x2b\x1c\x95\xbc\x61\xdd\xe8\xc6\x51\x33\x56\xc6\xc8\xb1\xf5\x83\xba\x77\xc7\xa3\x53\x9c\xdd\x9f\x76\x02\x95\xba\xc8\xfc\x08\xb4\xd7\xaa\x06\x10\x9d\xbc\xf2\x13\x23\x52\x1d\x91\xcb\x90\xa8\x02\x36\x63\x0d\x72\x73\x35\x58\x06\xfd\x70\xf5\xc9\xd5\x60\x11\x3e\xda\xc7\x28\xb3\xd2\x5a\xa5\x4e\x80\x42\xab\xeb\x22\xe6\x81\x1f\x30\x3a\xe3\x26\x6d\x7b\xe7\x9f\x45\xff\xf2\x5a\x1f\x9e\xb1\x93\x42\x29\xd5\xe1\x42\x8b\x1b\xea\x49\xbe\xbd\xbd\xfb\x78\x71\x49\x75\x52\x54\x09\x7e\xe8\xe3\xfe\x6f\x8e\x71\xfb\x30\x02\xdb\xee\x71\x5d\xa0\x38\x9d\x47\x30\xa3\x72\x97\xde\xcf\x09\x5d\x54\x01\xc1\xa9\x78\xc8\xf6\xe6\xb7\xca\xed\xd8\x7d\x7d\x28\x28\x55\xa5\x52\xe5\xd2\x03\xe2\x5b\x54\x18\x53\x54\x7c\x28\x50\xf1\x18\xf9\x56\xf1\x80\x15\x76\xc1\x3b\xbc\xd4\x3c\x7e\x86\x77\x78\xf8\xc9\x80\x87\x49\xe4\x00\x76\x80\xb8\xfb\xd6\x18\x08\x01\x2b\x90\xa6\x25\xb0\x9e\x3e\x05\x95\x87\x07\xec\x50\x29\x87\x38\xf5\x4f\x39\xe8\x6b\xc4\x43\x46\x3e\x83\x3c\xa4\xf4\x05\xe4\x61\x72\xd6\x47\x32\x2a\x03\x6e\xe7\xd7\xb8\x3b\x3f\xad\xea\x66\xff\xdd\x05\x93\x75\xff\xfb\xb9\x3b\xff\xe2\x0c\x49\x34\x80\x93\x03\x27\x9f\x81\xc6\xd3\x38\x5f\x08\x93\xb5\x26\xa5\x3b\xfa\x16\x94\x20\x45\xd8\x38\x61\x4b\x3f\x52\x43\x70\x4e\x68\xe9\x33\x34\x76\xae\x82\x96\x7b\x13\x97\x81\x4a\x31\x4b\xf8\x50\x4b\xef\x96\x59\x55\x47\xde\x3f\x91\x77\x2a\x92\x42\x84\x71\x5f\x5f\xd8\x3b\x45\x79\x4d\xde\xc9\xf5\x4b\xf2\xce\x13\x61\x2e\x70\x77\x1e\x12\xf4\x07\xc1\x24\x91\xc9\xfc\x90\x06\x1d\xab\xad\x5b\x3a\xb7\x45\x05\x26\x90\xfb\x01\x20\x90\x6f\xb8\x09\x85\x1f\x43\xc4\xe0\xf7\x61\x92\x9c\xf1\x08\xd6\x35\xfd\x6d\xf4\x17\xc1\x12\xbc\xee\xf9\xb8\x44\xfb\xdf\x1e\x2e\xb1\xef\x57\xe7\x70\xff\xbb\xd7\xb7\xab\x6b\x92\x6c\x48\x1d\x57\x7d\x87\xc1\xd5\x9f\x6d\x96\x83\x28\x6f\x07\xa1\x19\xc2\x94\x3b\x56\xe2\x22\x37\x10\xe8\xde\x49\x69\x8c\x3b\x16\xcc\x94\xa2\x1f\xbd\x05\xad\x03\xbd\xd7\x35\x88\xe8\x5c\x3b\x77\x14\xa7\x83\x82\x84\xf8\xde\x9b\x5a\x0a\x49\xa9\x92\x13\x27\x54\x5a\x3a\xb4\xad\xf1\x9d\x9d\x67\x0d\x52\x38\x82\xf2\x41\xd9\xb6\xb5\x7e\x32\xce\x81\xd4\x23\xd0\xcf\x4e\xbb\x28\x4a\x22\xfd\x48\x6f\xe4\xce\x9e\xed\xbf\x4b\x97\xf2\x75\x75\xe7\x05\x2c\xf3\xa9\x71\xf6\x9a\x64\x3d\x99\xaa\x98\x2f\x15\x53\x94\x40\x4a\xc9\xa2\xa0\x53\x9e\xc5\x19\x2e\x6a\x88\x92\xe9\xbe\x13\x1a\xb4\x5e\x99\xc6\xd7\x1c\x90\x64\x06\x69\xed\x2a\x3f\xc7\x63\x67\x7d\xa5\x78\x56\xe7\x1c\x60\xa7\x2a\xc7\x39\x64\xc4\x55\x7a\x20\xa7\x5a\xd7\x6d\xd3\xb3\xbe\xb9\xe4\xce\x65\x52\x87\x5c\x6b\xf4\xfa\x6c\x97\x6e\x7b\xd3\xb6\xaf\xae\x6b\xa2\x3a\x0c\xf7\x27\xae\x76\xb4\x7e\x40\xb5\x36\x14\xa8\xde\x47\xa0\x4b\x86\x07\x94\xd4\x4e\xc9\x05\x72\x11\x97\x8c\xd8\x7e\x5c\x0a\xc0\xa2\x08\x00\xf6\x58\x1e\xea\x78\x8a\x7e\xbe\x75\x93\x6c\xcd\x19\xeb\xd3\x9f\x34\x15\x68\xea\xfa\x9e\x39\xd0\xc5\xd3\x22\x80\x5d\xb8\x8c\x91\x97\x1b\xef\x9e\x78\x24\x01\xe3\xfe\x4d\xa8\x13\xf9\xf8\xfa\x36\xb9\x7b\xf3\xa2\xbb\xec\xd5\x5d\xf8\xa4\xcf\x60\x9d\xc7\xf3\x12\x15\x49\x64\x7a\xa1\x91\x53\x9c\x3e\x4c\x28\xee\x96\x72\x17\x39\x70\xcc\xfd\xc9\x79\xb3\x14\xfe\x98\xbb\xbc\x8f\x23\x3f\xbb\x75\xbc\xeb\x3e\xad\xe3\x28\xb0\xdc\x3f\xeb\xcb\xeb\x26\x9b\xcd\xd6\x52\xbb\x93\x5b\x95\x38\xd5\x9c\x42\x21\xf0\x7d\x06\x5a\x23\xb9\x32\x00\xf7\xbd\xa9\x24\x83\x0e\x12\x53\x94\x54\xf1\xd5\xa8\x8f\xaa\x7d\x71\x23\x0e\x26\x8c\xf7\x82\x1a\xb5\x69\x0a\xe1\x7e\x2b\x5c\x92\xe5\xd0\x61\x78\x48\x8f\x9c\x8d\x01\x47\x3e\xfc\x9b\xec\x27\xfd\x9b\x59\xa9\xf9\xf2\x6f\xe4\x23\xb9\x71\xc9\xb8\x7a\x86\xaf\xef\x3e\x6c\x7e\xeb\x19\x6a\xf1\x7a\x51\xc9\x04\x9d\xba\x87\x68\x77\x3a\xfa\x29\xa1\x0f\x0d\x63\x4a\xe6\x5c\xa1\x87\x21\x8e\xb8\x92\xb6\xaa\x4c\xe6\xbc\xa1\x2c\xaf\x73\x08\xd8\x39\xde\xfc\xc8\xe2\xf9\xc9\xf7\xfc\xc7\xd1\xeb\xe8\xcf\x42\xcc\xe2\xee\xf5\xb9\xf2\x1c\x3c\xbd\x7e\x7a\xff\xe6\xaa\x70\xeb\x02\x00\x64\x63\xb6\xd4\x86\xf3\x89\xfb\x36\x9c\xa1\x4b\x2d\x20\xa9\x50\x25\xcd\x29\x41\x79\xd6\xe4\x9d\xaa\x72\x7b\x40\x0f\x27\xd0\x77\x5d\xe7\xa3\xae\xeb\x96\x93\xd6\xcb\x7c\xca\x5c\x46\x80\xf1\xac\xe7\x0d\xe0\x51\x74\xd8\xb5\x8f\xec\x46\xbf\x90\xe7\xcf\xcf\xfe\xf0\x57\xe4\xf9\xc5\xcd\x57\x04\xda\xc3\x98\x2c\xad\x61\xec\xc8\x7c\x1f\xce\xb0\x4a\x6d\x0a\x68\xca\x14\xa5\x39\xa3\x45\x9e\x75\xf9\x51\x75\x5f\x11\x89\x60\x1f\xcd\x99\xcb\x14\x60\xcf\x32\x25\x51\x88\x2f\xa0\xe8\xf5\x53\x55\xc2\xaf\xcf\xc8\xb1\x2f\x98\xe8\x5e\xdd\x81\x55\x9e\x3f\x03\xef\x42\x43\xe4\xeb\xf7\x37\x77\x6f\xc0\x55\xcc\xe1\x9a\x23\x33\x21\x3b\xe4\x71\xe0\x75\x1c\xef\x5d\xe5\x3a\x8f\x40\x5a\x24\x1c\x1a\x53\xe5\x35\xc1\xf9\x83\x72\x55\x1e\x1f\xfd\x09\x17\x0a\x62\x8e\x91\x81\xd8\x4b\x03\xa9\x61\x80\x05\xe8\xe7\x03\x32\x56\xaf\x7a\x18\xfb\x1e\xd4\x0f\xbd\xf2\xe8\xe8\x14\x80\x60\xe4\xda\x0f\x5c\x60\xc9\xa1\xb4\xd8\x2a\x98\x1f\x5b\x5c\x77\x55\x5d\x34\xd5\xfa\xbc\xed\xba\x33\xef\x63\x1a\xaa\xdd\x9e\xfc\x91\xdb\x38\x09\xad\x40\xaf\xcf\xb0\x2f\xd7\x94\x12\x87\xa2\x2c\x40\xb4\x10\x90\x53\x90\xb9\xf1\x54\x3b\xae\x25\xb1\x59\x7e\xf4\x27\x54\x3b\xad\x0b\x4d\x2d\x15\x9c\x95\x07\x2d\x8d\xb5\xad\x8f\xd0\xa2\x7d\x05\x8b\xb9\x3c\xf9\xb1\xa4\xb4\x2c\xcc\x04\x44\x91\xb9\x1e\x50\xe4\xbb\x2a\xcd\xea\x75\x6e\xb3\x47\x7a\xc3\x0e\xc5\xd7\x7f\xef\x17\xd4\x41\xef\xd7\x6d\xe1\xf3\x7e\xd3\x0f\x77\x7f\x95\xd4\x89\x7d\x90\x01\xf9\x7c\x5a\xea\xf0\xe2\x71\x95\x81\x53\x5a\x35\xa5\xca\x0d\xa1\x24\xf3\x0d\xf7\x92\x01\x4e\x7c\x05\xd4\xa1\x78\x98\x41\xd7\xb6\xad\xcf\xeb\xba\xf6\xab\x9b\xef\x8f\xb9\xcd\x2a\xc0\x7c\x64\xad\x02\xc6\xe2\x4b\xed\x70\xb0\x2d\xff\x22\x30\x43\x7f\xf3\xfa\xa9\x61\xfb\xf5\xed\xba\xec\x9e\x1c\xcd\x0b\x3e\xd1\xba\x43\x6d\xcf\xb2\xf1\x45\x46\x38\x71\xd2\x52\x9c\xc1\xdc\x42\x41\x95\x52\x35\xeb\xa5\x82\x0f\xd2\x5a\xb3\x83\x75\x17\x4c\x9a\xbd\xb6\x5e\xf8\x6a\x04\x08\x7b\xe6\x4f\xfe\x44\x41\x8a\x7c\x5f\x03\x54\x1b\x5d\xf7\xa0\x8d\xa3\xa5\xf5\xb9\x37\x0c\x48\x30\xc4\xd5\x3c\x93\x92\x71\x1d\x6a\xa0\x54\xcc\x43\x9d\xd0\x9b\x80\x31\x7c\x7b\x73\xf7\x66\x9b\x94\xe7\x9c\xf9\x77\x17\x58\x82\xdb\xd0\x4a\xf8\x92\xda\x2b\xce\x1d\x02\x72\x5c\x06\x0e\xe6\xde\x8f\x10\xd3\x92\x53\x8a\xb1\x04\xd9\xde\x52\x4a\x35\xec\x0b\x2f\x50\x0d\xa2\x32\x75\xb9\xf4\xb5\x3f\xb1\x83\x41\xdc\x2d\x6d\x6b\x2c\x98\x10\x41\xa5\x22\x08\x15\x62\xec\x7c\x4d\x59\x6a\x53\x54\x2f\x73\x91\x63\x81\x1d\xc3\x32\xee\x22\x90\x8c\x8f\xf6\x86\xed\xeb\xa0\xef\xb6\xd0\x52\x48\x40\xbc\xba\x4b\xe6\xb8\x5b\x8a\x44\x55\x0b\x8c\x8f\x4b\x99\x50\xd0\xb9\xbf\x99\x8c\x8b\xd3\x28\x8a\x7e\x1e\xa9\x38\x0b\x1c\x06\x3f\x8b\xbe\x8f\xfe\x5d\xf4\x1f\xa3\xff\x1c\xfd\x75\xf4\x3f\x84\x2e\xe0\xff\x1a\xfd\x9f\x91\x8c\xfe\x9f\xeb\xba\x3e\xf0\xb2\x7d\xed\x75\xa8\xae\xdf\xc8\x6a\xcf\x11\xa3\xaf\x7e\xb7\x71\x1f\x5e\x1a\x4d\x3e\x3d\xf5\xb2\x7d\xe5\x7c\x5d\x58\x94\x17\xf9\x69\xd1\xa7\x1c\x26\x86\x22\x91\x65\xdd\xb4\x01\x4c\x1a\xa6\x08\x97\x18\x9b\xba\x91\xa2\xb8\xef\x29\x92\x69\xd6\x4f\x50\x09\xce\x73\x43\x75\xf8\x52\x07\xce\xdb\x1c\xa4\x01\xbc\x69\x3d\x26\x9f\xeb\xe3\x31\xb1\x04\xc9\x82\xdc\xf7\xe1\x65\x47\xca\x42\x16\xf8\x7e\xc0\x85\x84\xe5\x2e\x95\xb0\x90\xe8\x5e\xa9\xa2\x90\xe8\x60\x19\x97\x92\x94\x1e\x29\x5b\x16\x90\x14\x52\xd6\x45\x26\x1d\x88\x8a\x51\x43\x2e\x0b\xdf\x34\xb0\x20\xe5\x17\xdf\x0e\xe6\xe9\xdb\x02\xb6\x82\x0b\xe2\x1b\x29\x33\x26\x4a\xce\xcb\x70\x86\x4c\x94\x82\x95\xe1\x5c\x14\x92\x62\xc6\xc2\x39\xfa\x79\x6c\x7f\x84\xfb\xe0\xdf\xfe\x21\xb8\x0f\xce\xd4\x07\x1f\x3f\xfd\x38\xf7\x41\x4e\x36\x10\x61\x02\x6a\xcd\x85\x90\xde\x30\xa4\x10\x9d\x28\x56\x05\x2b\x77\xee\x5e\xd8\x61\x00\xac\x37\xbd\x37\x00\x5b\xad\xa9\x12\x14\x72\x4e\x7d\x5f\xfa\x52\x4b\x58\x28\x45\x0d\xaa\xc7\xd2\x6e\x44\xad\x80\x12\xac\x0b\x72\xa6\x3e\x20\x8a\x70\x8a\x09\x25\xf4\x7c\xae\xbf\x46\x7d\xc0\xce\xcc\x07\x45\xf1\xe3\xd4\x07\xd1\x21\xd2\x71\x11\xb0\x78\xb7\xf8\xcf\x2f\xa3\x7f\x13\x38\x60\x5e\x3d\x55\x6c\x04\x48\xb6\xdb\x9b\xf3\x00\x93\x1f\xde\xbd\x7d\xf3\x11\xdc\xc6\x4f\x0e\xc5\x73\x87\xc8\xb6\x4e\x3f\x82\x37\xc9\xb7\x6f\xae\x3a\x72\xff\xea\x8c\x90\xb8\x4f\x19\x41\x2a\xcb\xdb\xa6\xec\x33\x68\xcb\x63\x40\x3e\xc8\x8b\x1c\xb6\xda\x53\x85\x3d\x29\x07\xad\x2d\x54\x42\xc8\x5c\x53\x45\xb8\xc3\x45\xe8\xc5\x84\x7b\x6c\x9d\x54\x18\x65\x25\x46\xa8\x91\x68\xb2\xfb\xd3\x72\xd4\x01\xfd\x1a\x95\x09\x42\x08\x59\xc5\xf9\xc0\xb9\x6f\x31\xee\x0a\x60\x73\x8f\x5a\xc5\xaa\x22\x17\xb2\x82\xa9\x34\x23\xec\x45\xc6\x38\xf2\x53\x97\x43\x02\x46\xe9\x4f\x4e\x49\x99\xe9\x1c\x63\x61\x5b\xf1\x20\x77\xd1\x16\x9f\x17\x8f\x2a\xd4\x82\xfc\xfc\xdc\x1b\xf1\x5f\x5e\x32\xc6\xfd\xf0\x2e\x79\xd9\x09\x7d\xae\x00\xb9\xf9\x2e\xb9\x3b\xec\x5f\x94\x7c\x9c\x5b\xf9\x93\xcb\xdf\xdd\x7c\xde\xb7\xbb\x13\xca\x63\xec\x1e\x98\x05\x53\x0e\x4f\xd6\xcd\xce\x06\x38\x58\x7f\x74\x03\xf5\x53\xeb\x27\xe7\x27\x76\x94\xfe\x04\x48\xd7\x59\x50\xcc\xf3\x3c\xb7\x47\x37\x4d\x71\x74\x2f\xc1\x7c\x3c\x18\xca\xbc\x5d\x37\x8f\x12\x7b\x26\xa5\x10\x46\x19\x6d\x6b\x5a\x19\x90\xcd\x95\xd1\xd6\x6a\xb3\xae\x06\xad\x7d\x66\xad\xad\xac\x5d\xf7\xd2\x9f\x25\x28\xc4\x26\x2f\x78\x05\x97\x7a\xad\x7f\x7d\xe1\x2e\xbb\x44\xf1\x43\x4d\xf9\xfa\x9b\x5f\xc0\x09\x6e\xaf\x51\x09\xee\xce\x88\x04\x6f\xce\x69\x94\x8d\xf1\x2f\x69\x12\xf6\x50\xbb\xb8\x58\xc6\xf5\xf0\xd3\x8e\x2e\x53\x99\x33\xdb\xf5\x90\xb1\x29\x90\xd0\x77\x40\x82\x29\x97\x54\x71\x41\xa9\x66\x9a\x09\x88\xbb\x1c\xa1\xec\xc0\x96\x16\x70\xee\x3b\xe1\x3b\xbb\x98\x4c\xe7\x53\x5f\x40\x9b\xc5\xbd\x73\x9e\x5b\xcf\xa0\x06\x8d\x6f\x27\xc5\x15\x53\xa9\xa2\x9a\x9a\xf6\x64\x35\x6f\xa2\x3f\x8a\x75\xc0\x17\x2e\xbf\x5a\x93\xf9\xa5\xbf\xf8\x19\x4f\x1e\xd8\xdd\xde\x7c\xf7\x17\x5b\x20\x33\xee\x76\xab\xd1\x3f\x0c\x80\x77\xb6\x7f\xc0\x01\xcd\x32\x89\x96\xe8\x72\xc4\x11\x48\x4f\xe5\x63\xf4\x18\xf9\x99\x8d\x8f\x11\x9d\x0e\xa5\x87\x76\xe3\xd7\x67\x0f\x26\x96\xca\x3b\xe9\x2b\xe9\x27\xc2\x9d\x22\x4a\x49\xe2\x50\x14\xdd\x04\x3c\x12\x16\x62\x0d\x9b\x1e\xda\x38\x46\x5e\xc4\x1b\xf6\x2f\xb1\x0d\x43\x71\xc1\xeb\xcb\x0a\xfa\x5d\xdf\x65\x0e\xa0\xf5\xcf\xfd\xb8\x23\x8c\x96\x0c\x72\x8c\xe7\x94\x59\x11\x80\xae\xa7\xf5\xa3\x82\x97\xe1\x23\x6e\xd7\x8f\x0e\xd9\x09\x30\x5f\x9f\xbc\x96\x0f\x85\x14\x99\xcb\x64\xe5\xc7\x1a\x77\x80\xc4\xce\x77\xad\x8f\x3a\xd0\xbf\xf8\xa6\x05\xf4\xf2\xcd\x56\x2f\x65\x1e\xc9\x8d\x3a\x98\x28\x8f\xfe\x55\xf4\x9f\x43\x3f\xed\xff\xf1\x84\x26\xff\x8f\xc0\x73\xb7\xc4\xf6\x40\x24\xef\x3f\xbd\x3f\xbc\x79\x7f\xd5\x46\x71\x2e\x8f\xfc\xfe\xcb\x2f\xb6\xc0\xd7\xd6\x62\x77\x35\xe8\x57\x5b\x1d\xf0\x9b\x04\x01\x97\xa7\x26\x03\x43\x2a\x14\x71\x79\x4d\x21\x4c\xd7\x49\x6f\xca\x89\xfb\x4e\xf7\x99\x4e\xe7\x8c\x51\x5c\xe6\x24\x34\x10\xd0\x96\x68\x5a\xc7\x4f\x5f\xac\x66\x7e\xb9\x7e\x41\x7a\xa2\x69\xe5\x2b\x97\x1c\x85\xa0\x02\xda\xb2\x3c\x17\x46\xe6\xa8\xcc\xf8\x64\xa0\xcc\x11\x6d\xb1\x2a\xa8\x6f\x08\x2c\xfc\xd1\x65\x32\x45\xee\x31\x62\x82\xd4\xaa\x84\xd0\x8f\x36\x93\x19\x76\x13\x97\xb8\x7a\x90\x8f\x51\x52\x2c\x9a\xb2\xcc\x64\x04\x01\x12\xb4\xd1\xaa\x4f\x54\xe8\x4b\x22\xe7\x6a\xf7\x4b\x57\x52\xc8\x1a\xdd\x9c\x5b\x2e\xbf\x7b\xb7\xdb\xc2\xaf\xdb\xe8\x5f\xdd\xbd\x6c\x25\x0e\xe9\xbf\xb8\xdf\xd5\xcb\x08\xc1\xb4\x70\x14\xb7\xc2\x76\x23\xf5\xe3\xc9\xcf\x81\x1e\x6d\xd4\x8c\x71\x31\x8a\x0a\x08\xe8\xe1\x69\x75\x31\x2f\x07\xeb\x94\x63\x07\x62\xc5\x43\xcf\x8c\xe1\xb8\x70\x88\x0b\xe4\xf2\x92\x70\x46\x64\xd5\x25\x58\xf8\x46\xf8\x56\xf8\x5a\xf9\xc2\xe6\xa5\x88\xe2\xf8\x74\x85\xfb\x18\x56\xe9\x4b\xcc\xc7\x0d\x9c\x7e\x4b\xa5\x06\xc1\x93\x4f\xdf\xdc\x7e\x4c\xe6\x0a\x90\x6a\x9e\x2b\xdf\x56\xc7\x63\x4c\x8d\x6c\x4e\x33\xf3\xa7\x63\xef\x3b\x06\x70\xdb\x1b\xad\xda\xfa\xa0\xc6\x71\x0c\xf0\xeb\xd6\x13\xee\xeb\xd3\x24\x9d\x9d\x8e\x95\xad\x86\x13\x28\xb9\x1f\xa6\x39\x7a\xe2\x29\x6c\x0e\x2a\x64\xff\xfe\x7f\x2f\x6b\x93\x9f\x1a\xb7\x7f\x1c\xba\xeb\xe3\x57\xb1\xbb\x3e\xbd\x4d\x04\x50\x04\x5a\x18\xb0\xbb\x58\x5c\x8d\xdc\x89\x4e\x79\xad\x9c\x94\xb4\x03\x05\xc6\xbe\x73\xac\x34\x98\x27\x65\x45\xb9\x11\x4b\x01\xb2\x3c\xfd\x0a\x74\x57\xcd\x41\x2a\x8e\xfb\xa8\xed\x60\x53\xdb\xd6\x72\xa6\x6d\x5d\x59\x21\xb8\xa5\xe2\x25\x72\x57\xce\x45\xc6\x99\xcf\xbb\x00\xdd\x95\xfb\xee\xa8\xeb\x39\x8a\x6e\x22\xfa\x48\xf6\xc5\x97\x7a\xe1\xf5\x1f\x40\x2f\xcc\x0e\xc0\xf5\xcf\xfd\xbc\x43\x94\x21\x0a\x29\xc6\x53\xc6\xed\x46\x66\x35\x33\x8a\x49\xc1\x10\x3e\x86\x8f\xd6\x9f\xe3\x4a\x2d\xdc\x9f\xb8\x48\x6d\x2a\x7a\x3f\xd5\xb8\x01\x2c\x76\xbe\xed\x96\xb9\x03\xc3\xf3\x37\xa7\xe6\xac\x16\xc2\x37\x51\x12\xea\x80\xc5\x41\x9e\xbb\x65\x7f\x1c\xab\xf3\x1a\x38\xf9\x47\xa0\x3a\x0f\x13\x39\xfa\x79\xcb\x81\x29\x55\xd2\x42\x61\xee\x95\xc4\x5a\x42\x93\x66\x8f\x91\x1f\xa1\x51\xbe\x72\x60\xf6\x04\xb4\xc7\x19\xc5\xd0\xf7\xa1\x87\xb0\x03\xc5\xd7\xa0\x3a\x73\xf1\xbb\x91\x3a\xd7\xe7\xb4\x7e\xb4\xe7\xd8\xde\xb6\x83\xdc\x85\x4c\xe8\xfb\xe7\x42\x97\xaf\x25\x9c\xe3\x21\x2e\xf3\x2a\x07\x47\x9f\xe6\xc0\x3c\x74\x20\xcf\x97\x11\xd8\x38\x5b\x4e\x97\xc3\x93\x6a\x47\xee\xf3\xfd\x58\x55\xd6\xde\x4f\xbb\xdc\xfa\x32\x50\x62\xa0\x3a\x2e\x1f\x52\x1b\x45\x71\x8c\xbf\xec\x3d\xda\x5f\xfa\x8e\x76\x5b\xdf\xd1\xfb\x6f\x40\xb4\xab\x1c\x6e\x90\x8d\xad\xa3\xbe\x9e\x40\x29\x7c\xbf\x6a\x00\x49\xc0\xd6\xd0\xce\x41\x09\xd0\x41\x0d\x47\x74\xea\x8f\x70\xd1\xde\x4c\xb5\x69\xe6\xb9\xb6\xf5\x04\xea\x18\xf9\xc8\x5b\x80\xa2\x38\xc4\x92\xcd\x21\x8f\x6e\x22\xb8\x65\x21\x02\x56\xed\x96\xc6\xdd\xdc\xc5\xc0\xc6\x91\xc5\x37\xef\xbe\xfb\x63\x70\x53\x54\x0f\x43\x95\x98\xac\x44\x30\xad\x32\x56\x1b\xea\xeb\xa6\x53\x80\x1c\x72\x9f\x03\xea\x6b\x70\xf2\xf4\x7e\x40\x39\x05\x39\xf4\xad\x25\x22\xe9\x3c\xf7\xb3\x6f\x8c\x1e\xc1\x11\x1c\xa3\x68\x17\x17\x8f\xe8\xa6\x3e\xef\xd3\x70\xeb\x5c\xdb\x90\x99\xf6\xe7\x0e\xfa\x00\x85\xf3\xf6\xe2\x29\x7f\xfc\xf4\xa7\xe0\x70\x73\xf7\x2a\x99\xb7\x36\x88\xc6\x53\x0f\x6d\x32\x9a\x65\x76\x40\x73\xcf\xea\x75\x22\x05\x70\xca\xe7\x71\x9e\xa7\x1e\xc6\x3a\xcd\x81\x3c\x94\xcb\x60\x41\x96\x2e\xa3\x97\xd6\x9f\x44\x6b\x41\xe5\x75\x65\x34\xc8\xad\x32\x46\x81\x75\xbe\xc5\x63\x11\x62\x78\xaf\x36\x5f\x34\xbe\xd9\x82\xe6\xaf\xb7\x75\xf9\x5d\x72\x05\x11\x18\xa4\x7a\x62\x0f\xda\x8a\xb4\x77\xc2\x39\x07\x20\xc0\x94\x99\xa3\xb3\x08\x7b\xe2\xd3\x02\x44\xa9\x83\x79\x3c\x79\x91\xe6\x71\xb9\x9c\x6a\x20\x4a\xaf\x3b\xeb\x2d\x07\x8a\xfb\x34\x86\xb9\x3f\x51\x6e\xc6\x83\x42\x7e\x56\x59\xc1\xd9\xba\xcc\xd7\x4d\x3b\x33\xce\x77\x08\x63\x6b\xa4\xf1\x83\x70\x12\x70\x7f\xac\x4c\x35\x1b\x69\x04\x15\x55\x14\xed\xc1\xf8\x94\xaf\xf8\xd3\x73\xe7\xee\x4f\xe5\x67\xfa\x9c\x9e\x49\x3b\xa0\xd6\x3f\xf7\xc4\xba\x12\x68\x84\x35\x23\x60\xf0\xf0\xd2\x51\x16\x47\xf7\x7d\xc5\xf5\x10\x13\x2f\x80\xdb\x8e\xab\x5c\x05\x72\x04\x33\xae\xac\x33\x95\x75\x4e\x24\x85\x16\x20\x2a\x9c\x1f\xab\xca\x8f\xee\x89\x9b\xa9\x0a\x31\xd2\x73\x94\xfc\xe6\xee\x8f\xc0\x3e\xb4\x4d\x5e\x91\x45\xde\xbd\x08\x92\x3f\xa1\x59\xbf\x88\x92\x3f\x81\x23\x25\xc4\x21\x00\x8b\xc9\x9f\xe4\xdc\x17\x2d\xa1\x58\xa0\x12\x61\x31\xc6\x39\xa0\xb6\xaa\xfa\xde\xfa\xba\x30\x06\xe1\xd1\x37\x83\x4f\x63\xea\x62\xb1\xcc\x23\xa0\xd4\xb7\xa7\x0d\x19\xaf\x3c\x28\x68\x7d\xef\x6d\xa3\x0c\x48\x3b\x51\x62\x59\xa2\x12\xab\xa3\x69\x5b\xeb\xfb\x10\x2c\x87\x50\x29\x80\x1f\xf4\x16\x2d\xd7\x95\x03\xd8\x47\xe0\xe4\xa7\xca\xd4\xd1\xc6\x5d\xb2\xee\xe7\x32\x2a\xa3\xff\x18\xfd\xf7\x5f\xcd\xc3\xfc\x06\x5c\xa7\x61\x5e\x76\x6f\x7f\x3d\x0f\x73\xd9\xb7\xe2\x2a\x8e\x5c\x1c\xf9\x28\xe8\xbe\x62\x41\x4c\x36\xc6\xb8\xd9\x77\x80\x80\x0c\x61\x53\x09\x5b\xba\x8a\xe9\x73\x1e\x26\x42\xc7\xa7\x3c\x0c\xf1\x08\x0c\x3e\x4a\xd4\xd0\xc8\xba\x5f\x4e\xaa\x9e\xf8\xb0\x9f\x8c\xb1\xdc\x48\x2b\x68\x0a\x05\x1e\xaa\xa7\x34\x4c\x91\x7f\x99\x87\x51\x56\x1a\x7e\xdf\x48\x61\x94\x22\xdc\x72\x43\xa2\xc3\x99\x37\x43\x06\x8d\xb8\xea\xf6\xcb\xa8\x43\x41\xc8\x53\xb7\xd0\x33\xdf\xd9\xc7\xd7\x97\x3e\xcf\xab\x2a\xf9\x55\xc5\x80\xb7\x6f\xde\x83\xdb\x9b\xf7\x61\x25\x5c\xa7\x4b\x76\xd4\x5b\x30\xbb\x52\xd1\x9a\xaf\xdb\xa3\x76\x20\x95\x7e\x0e\x79\x02\x31\x61\x9a\xdb\x9c\x02\xc9\x01\x74\xd6\xb6\x6d\x40\x95\x77\x6e\x41\x26\x9b\xf3\xd9\xcf\xf4\x24\x29\xa5\xa2\x66\x94\x14\x59\xb5\x73\xa1\xf8\xd3\x3a\x64\x85\x91\xdc\x98\xca\x37\x80\x75\xd2\xd0\x98\x28\x85\x8c\xfc\xed\x0c\x56\x1f\xf9\x68\x02\x28\xbd\x38\x82\x53\x4e\xbd\xf3\x4a\x4b\xd9\x12\xcc\x79\x5b\xe2\x52\x8a\xd0\xdf\xfc\x3c\xee\x7f\x15\x7d\x3a\x77\x3d\x7c\x3e\xee\x75\xa8\x17\xfa\x8b\x0b\x52\xfb\xfb\x17\x20\x60\x61\x88\x5f\x9f\x8d\x90\x68\x1d\x2d\xe6\xa4\xa6\x0c\x44\xde\xd9\x59\x9e\x2a\x6b\x4f\x72\xc4\xab\x91\x42\xa0\xc9\x4e\xf9\x34\xd3\x41\x12\x02\x0b\xee\x18\x29\x8b\xd4\x80\x94\x82\xcc\x1a\x53\x6f\xb5\xe9\x5a\x5f\x06\x5d\x21\x2b\xc3\xa0\x9d\x6f\x01\x69\xa4\x21\x71\x29\x25\xd2\xf2\xe1\x69\x90\xa2\xa1\x25\x2e\x78\x4b\x4a\xa2\xa5\x1f\x81\x31\xc6\xce\xc6\x77\xa0\x04\x7a\x35\xbc\x92\x04\x3d\xea\x1b\x77\x48\xcf\x35\x0f\x61\xc4\xc9\xfb\x37\x6f\x93\xd5\x0a\xbc\x7b\xfd\xf6\xc3\xfb\xbb\xd7\x77\x09\x78\x7d\x97\xec\x06\x3f\x26\x15\xd6\x06\x75\xf7\x0e\x14\x78\x9a\xc1\x58\xf8\x1e\x81\x08\xf9\x0e\xef\xa5\x5b\x4a\xb7\x08\xe7\x62\x17\xbc\xc2\x87\x21\x76\x8b\xd8\xf2\xe0\xa7\x47\x79\x53\x1d\xa2\x9f\x70\x0f\xe5\x4f\x49\x8f\x8c\x43\xc7\x7b\x0a\x52\x3c\xcd\x71\x8e\xbc\xc5\x00\x63\xaf\xf1\x9e\x57\x0b\x74\x8b\x76\x2e\xd6\x2e\x2e\x97\xee\x61\x8a\xf5\xa2\x37\xac\x4d\xf7\x88\x43\xbe\xf4\x9f\x44\xbf\x3a\xb3\xd9\x9d\x9f\xd4\xc3\xcd\x77\xd7\xf4\x0d\xef\x43\x81\xd3\xba\xd5\x7d\xfc\xe6\xa9\x2c\xe8\xb0\x41\xce\x05\xc2\x56\x06\x5a\x07\xba\xe5\x24\x34\x88\xe6\xb2\x54\xad\xb2\xb0\xf0\xdc\x13\x2c\x9d\xf2\x0d\xab\x4c\x27\x2b\x15\xb3\x2a\x2f\x61\xaa\x33\x08\x9d\x2a\x7d\xef\xdc\xbe\x1a\x06\xd7\xdb\x2c\x67\x94\xf4\x47\x46\x48\x99\x57\x76\x5c\x7a\xcf\x7c\x65\x95\x00\x08\x98\x45\x94\xb8\x86\xc7\x12\x95\x22\x6e\x1f\x86\x20\x37\x3f\xdb\x02\xff\x24\x78\x0b\x2f\xe5\xfe\xfe\x33\xb9\xbf\x26\x2f\xd8\x96\xdf\x37\x49\x0e\x7a\x07\xe6\x65\x10\x16\xa4\x20\x2a\xa9\xee\xf4\x2a\x38\xf5\x18\xab\x4a\x79\x1b\xcf\x16\x3e\x49\xbc\x9a\xbd\xce\xf7\x36\x75\x8d\xaa\xec\xbe\xe9\x7b\x3b\x54\x19\x62\x94\xf6\x13\x23\x25\x85\x55\x35\x2d\xdd\x42\x4a\xdc\xc2\xa9\x44\x25\x8b\x87\x87\x53\x12\x79\xe7\xb5\xd5\x7a\xe3\x36\xd8\x81\x21\xcc\xb9\x8a\xfe\x38\x2a\x42\x35\xfa\x93\xec\xf1\x4b\xd9\x5f\xa0\xfb\x6d\x92\xdf\x6e\x52\x07\xc2\x4c\x1b\xe7\x2e\xc6\x0b\x34\x1a\x60\xc0\x70\x69\x6a\xb9\x4a\xbe\x6e\xb2\x9d\xf1\x4d\x02\x6b\x4c\x8a\xcc\x41\xee\x0c\x5b\x68\x95\x56\x8d\xaa\x0c\x60\x75\xbd\x77\xab\x5b\x31\xab\x14\x5f\x04\x2f\x73\x63\x41\xba\xb4\x8b\x2c\xd9\x09\xfb\x51\x53\x11\xd7\xb9\xaf\xbc\x36\x5a\x83\x12\xe0\x87\x53\x94\x24\xc3\x13\xf6\xf4\xab\xe8\x36\xec\x57\xaf\xde\xbe\xda\xbf\xfb\xfe\xa9\xde\x6d\x7b\xb6\x6f\xaa\x6c\xae\x96\x53\x1e\x17\xd5\x32\x35\x56\xba\x3a\xed\x2a\x59\xb5\xb1\x74\x68\xa9\xe2\x52\x38\xb9\xa3\xf7\x43\x52\xa9\xca\xb4\xca\x3b\x5d\x05\x0e\xbf\x7f\x90\xa4\x8f\x2a\xe4\x30\xae\xe3\x13\x17\xb4\xa5\xdf\x9c\x67\x29\xf4\x15\x3d\x67\x12\xde\x5f\x65\x13\x2e\x55\x85\xb7\xe7\xaa\x88\xd7\xdf\xde\x3e\xf9\x42\x1f\xee\x7e\x78\x97\x94\x00\x9b\xca\x80\xf2\x7e\x0c\xb8\xb3\x95\x69\x1e\xe6\xcb\x05\xde\x99\x7b\x45\x93\xf1\xa1\xb0\x71\xbb\x10\x0d\x33\x90\xa3\xc2\x41\x04\xca\x7b\x09\xa2\x2c\x3f\xa4\x4a\x29\xb5\x28\x10\xfa\xb9\xb5\x37\xdb\xcb\x6a\xe5\x19\x23\xfc\xc4\x38\xd1\x88\x95\xc6\x10\xb2\xe9\x87\xcd\x0e\xf9\x87\x51\x16\xaa\xeb\x36\x9c\xe1\x1f\x56\x1b\x29\x4a\x36\x63\xf9\xda\xe0\x5f\x75\xdd\xbe\x34\x69\x36\x82\x94\x4f\x53\xe3\x4f\x12\xb0\xd0\xe6\xd9\x25\x96\x50\x44\x20\x85\x85\xaf\x9d\x9f\x0f\xaa\x80\xd0\x37\x6d\xd5\x04\x60\x61\x09\xa0\x9f\x6d\xed\x29\x63\x99\xcb\x10\x48\x97\x22\x1e\xa3\x24\x9e\xcf\xb6\xc5\x67\xf7\x7f\xc2\x39\xfe\xda\xfd\x73\x97\xe6\x33\xc8\xf9\xec\xe7\xce\x4f\x12\xc8\x22\xce\x97\xe9\x98\x74\x84\x22\x06\x39\x2c\x7c\xe3\x7c\x77\x50\x68\x15\xa0\xa9\x6a\xc0\x7d\xd7\x4b\x50\xcc\xb6\xff\xe2\xfe\xf5\xf9\xfe\xeb\x6f\xf9\xab\xb0\x56\xa2\x6b\x98\xe5\xfd\x97\xb7\xdf\xcd\xae\x00\x19\x28\xb8\x3f\xfa\x79\xf4\xa3\x04\x3a\x5b\xef\xef\xe7\x5d\x4a\x28\xe6\x85\x2c\x0a\xaf\x9c\x6f\x0e\x0a\x11\x5f\x35\x55\xbf\x3a\x62\x83\x04\xe8\xf8\xc5\xfd\xf7\xf1\x1c\xec\x0f\x1d\xdd\x3c\x55\xeb\x3d\x3d\x65\xeb\xfa\x78\x71\xf7\x00\x7c\x7a\xc5\xf5\xb5\xe9\xb2\xe3\xfd\x20\x12\xe6\x6b\xa6\x04\x0b\x41\xe7\x2a\x28\x68\xe6\x54\x2b\xeb\x24\x77\xa4\xa2\x76\xdf\xf6\xbd\x73\x4b\xbf\x8c\x5b\x8e\x3e\x8e\x2c\xc8\x97\x53\xe1\xdb\x46\xb6\xa7\xf1\x31\xc2\x20\x1d\x83\xdf\xd4\x3d\xb2\x30\x1f\x37\x4f\x55\xa4\x3f\x22\xcf\xc7\xcf\x04\x0a\x99\x45\xbc\x0a\x74\xba\xef\x68\x62\xbc\x39\xb3\x8f\x15\xb9\x37\xa1\xb7\x8f\x58\x6b\x4d\x93\x60\xc7\x1d\xb3\xe1\xd9\xae\x97\xce\xa7\x92\x67\x55\x5e\x60\x30\x58\x00\x7d\x44\x7d\xdf\xa8\xe1\x38\x4c\x6c\x1a\x37\xac\x72\x1a\x62\xff\x7f\xdb\xf9\x59\xc5\x89\x65\x0c\x5d\xcc\x7e\x7b\xb2\xc9\xe0\x05\x95\x01\x1c\x1e\x79\x59\xaf\xdb\x0a\xb3\x55\xa3\xba\x44\x75\xda\xc9\x6e\xef\xc6\xd1\x55\x4b\xeb\xb3\x73\x0d\x43\xef\x40\xbe\x0a\x73\xaa\x64\xdb\x77\x47\x76\xec\xa3\x34\xe2\x8f\x64\xd7\x1e\xd4\xb9\xbe\xe8\xc2\x2c\xfc\xd7\x4f\x79\xfd\x4b\xa7\xfb\xdd\x75\xf3\xe8\x6a\x1d\x6d\x51\x8d\x4f\x77\x67\x7e\xcf\x7f\x13\x7f\x9e\x5e\x3c\xbf\x7e\xfc\x74\x77\xb8\xf9\x76\x04\xc2\x02\x25\xa5\x37\x40\xfb\x12\xc7\x45\x8d\x94\x33\xcc\x0c\x8d\x3f\x95\xb5\x9e\x09\x1e\x00\x2a\xfd\x00\xb4\x77\x4a\xd9\x71\x04\x62\x5a\x9a\xed\xc5\x9d\x4e\x40\x9f\x7c\xa7\xb0\x1f\x8a\x42\x1c\x20\x63\x47\x75\xe4\xde\x29\xab\x39\x42\xba\x24\xac\x34\x45\x41\x18\xb3\x0a\x08\x7e\x54\x42\x08\xdf\x0a\x21\x96\x5e\x6b\xbd\x88\x92\x63\x04\xb7\x3a\x92\xf2\xa6\xda\xe7\xd1\x0f\x01\x6f\xec\xa5\x5d\xfc\x19\x93\xe8\xed\xe1\x99\x30\xf9\x0c\xc6\xfc\x19\x18\xc2\x77\x5b\xdb\xec\x01\x44\x71\x53\xad\x76\x43\xb2\x2e\x3e\x7a\xc4\xa9\x4d\xa5\xef\x1b\xee\x33\x34\xfa\x81\x1e\x7b\x8f\x12\xb4\xd0\x58\x18\x54\xc6\x4e\xf5\x20\x02\x3d\xf1\xa9\xef\x7c\xed\x0b\x02\x2c\xc8\x2b\x69\x25\x03\x35\x72\x5d\x2f\x97\x2a\xdd\x39\xad\x8d\x32\x04\xe6\x05\x41\xaa\xc4\x44\x15\x1d\xd7\xa5\x31\xca\x57\x14\x97\xb2\x11\x14\x3b\xa2\x4d\x59\x17\x94\x32\x56\xc8\x8e\x0b\x42\x75\x1a\x6c\xa3\xec\xbc\x37\x7f\x17\xfd\xdb\xad\x0e\xfc\x7a\x8c\xeb\x0a\x7f\xc6\x4b\x3c\x07\xa6\x9e\x47\x78\x15\x2e\xbb\x1e\x61\xe2\x80\x0e\x75\x1c\xe0\xe8\x07\xc2\x32\x97\xd2\xda\xf0\xa3\x76\x52\xf3\x13\x18\xbc\x06\xcc\x40\x0c\x1a\xa6\xba\x89\xf8\xd3\x38\xf9\x9e\x00\xd8\x71\x5a\x52\x01\x32\xc2\xa5\x2c\xbd\x4b\xf7\x7d\xd3\xd8\xc6\x1a\x8c\x58\x70\xcf\xda\x49\x0b\x65\x6c\xb3\x4c\x90\x51\xd3\x69\x59\x3a\x62\x1d\xa9\xb0\x64\x8a\x20\xd9\x52\xc5\xb9\xcd\xce\x78\x32\x65\xd0\xe7\xeb\x98\xfe\xc3\x1f\x64\x4c\x37\x87\x84\x03\xbb\x0d\x6a\xf2\xcd\xaa\xbf\x52\xd2\x38\x3e\xda\x46\x5a\x39\x81\xa3\x97\x80\xba\x02\x83\x8e\x99\x61\x26\xfe\x38\x4d\xbe\x25\xa0\xe8\x39\xa3\x4c\x80\x82\x32\x2d\x89\x37\xe9\x97\xa3\x9a\x8d\xd0\xee\xab\xa3\x92\x04\xcb\x9e\x29\xc6\x6d\x1a\x30\xf1\x13\x30\x3c\x96\x21\x86\xf9\x7d\xf4\xeb\x2f\xc7\xf5\xed\xf5\xc0\xee\xe2\x9b\xcf\x97\xe3\xb7\x97\xe5\xf8\xf2\xc7\x8a\x3b\x30\x38\x30\xfa\x22\x26\x5e\x17\x25\xcf\xab\x94\x76\xf5\xea\xab\xb7\xab\x49\x75\x8c\xb1\x47\x40\xd7\x98\xc4\x29\xaf\x66\xb0\x6a\x73\x3f\xf9\xd1\x0b\x02\xe4\xac\x38\x97\x12\x08\x22\x9d\xa3\x1e\xe5\xe7\xc1\x39\x98\x23\x8e\x2b\x4a\x58\xff\x18\x59\x61\x2a\xdb\xf8\xa8\xe0\xcc\x74\x5a\x94\x15\x71\xd5\xf9\x47\x2b\x55\xcf\xd7\xe1\x65\xeb\xb3\x66\x1e\x65\x72\x0a\xdc\x58\x1b\x8f\xeb\x73\x3a\xf2\x52\x7e\xbc\xa9\x91\xe0\x74\x5c\xa2\x56\x49\xbb\xb4\x4e\x31\xce\x19\x13\xa5\x64\x8c\x31\x69\x4f\x7e\x20\x05\x04\xb0\xf2\x47\x50\x87\x96\x38\xb6\xd7\x0f\x8d\x2f\x71\xc9\x08\xc7\x84\x32\x2e\x4a\xca\x75\x65\x55\x9d\x66\x7b\x7a\x3a\x79\x37\x2c\xc7\x3e\x4a\xe2\x31\xe4\x92\xf4\x39\x8b\xb4\xca\x70\xb9\xfb\x13\x93\xe9\x6e\xff\xee\xa5\x08\x87\x93\x67\x98\xd6\x56\x54\xb5\x06\xa9\xf1\xb8\x99\xfa\x0a\x3d\x46\xbe\x23\x0c\x98\xca\xcb\xd8\x2e\xe1\xd8\xdb\x87\xc1\x4a\xaa\x95\x26\xab\xaf\x1e\xc5\x70\xe9\x4a\xa2\xb5\xa8\xb2\x7d\x75\x3a\xf9\xae\x5d\xa6\x61\xf3\x25\xd8\x63\x19\x70\x0e\xbf\x2e\xc7\xdd\x8f\xc9\x91\x12\x36\xd6\xb2\xeb\x2d\x28\x8c\x8f\x06\x3f\xcd\x5d\xe1\x27\x6f\x09\x05\xbd\xf3\xe5\xa5\x59\x64\xef\x1e\x06\x27\xa9\xd1\x9a\x34\xd2\x82\x28\x2e\x96\x8e\x50\x63\x64\x95\xef\xab\xe3\xd1\x77\xcd\xb2\x6e\x3b\xd1\xcf\xe3\x39\xc8\x61\xa3\x9f\x45\xaf\xcf\xbf\xcb\xc7\xe8\x37\xd1\x7f\x3a\x23\x2f\x8a\xe8\xff\xbe\xc2\x0a\x0e\xc9\xf9\xcf\xaf\x9e\xe2\x61\xcf\xd0\xc0\xdb\x6f\x0a\xde\x07\x08\xb3\x77\x9f\xc0\x19\x7f\x72\xbd\xca\xbe\x09\x4b\x38\x7e\xfb\xab\x33\xa4\xd6\xb6\x83\xdd\x5e\x5d\x1f\x1a\x59\x12\x5a\x72\xa1\xcd\xe2\x64\x59\x92\x92\x4b\x6d\x41\xf3\x74\xe9\x8b\xe4\xf4\x90\xd9\xc0\xde\x4b\xa8\x22\x04\x49\x65\x6b\x3c\x30\x86\xac\x59\x8e\xb6\x2a\xaa\x01\x53\xe0\xac\xe1\x45\x73\x2c\x11\x30\x36\xcf\xb3\x4c\x66\x9a\x73\x1d\x52\xff\x7e\xc4\x85\x84\x98\x87\x73\x9c\x96\x48\x16\xe5\xc1\x32\x8a\x11\x16\x82\x6b\xc1\x68\x59\x94\xfc\xc5\x95\x77\xcb\x20\x00\xcf\x59\x99\x43\x81\x51\x59\xf0\x32\x87\xac\x40\x5e\x2d\x0d\x52\x04\x99\x2c\x56\x4b\x05\x0b\x45\xb1\x49\x63\xed\x47\x3f\x12\x02\x57\x57\x15\x10\x42\x4b\x4a\x70\x38\x37\x25\x2d\x69\x59\x86\x73\xc0\x62\xb7\x8f\x3c\xe0\x32\xfc\xd1\xb9\x67\xe8\x57\xd1\x0f\x57\x7d\xa5\xcf\x88\xde\x21\x68\x76\xb7\xa1\x98\x26\x6f\xdf\xbc\xbf\x79\x73\xf7\x01\xbc\x79\xff\x61\x7f\xf7\xe6\xab\xf4\xfd\xfb\xd9\xe5\x10\x40\xdf\xa0\x52\x29\x3f\xf5\x8b\x8e\x65\x6b\x8c\x71\x1b\x80\x9d\x03\xa1\x59\x03\x68\xf9\xdb\x93\x71\x55\x05\x02\xb0\x5d\x5d\x1f\x74\x6e\x95\xd5\x4c\x36\x4b\x6b\x77\x99\x75\x9e\xc7\xd8\x19\x6b\xfd\xd4\xb6\xb9\xf5\xb3\xcf\xed\x06\xee\x48\x7d\xb3\x1d\xd1\x99\xab\x5f\x04\xbd\xf5\x77\x1d\xc7\x9f\x82\x1f\x19\x87\x5a\xc7\x61\x3c\x41\x44\x2a\x3f\x9e\x96\x22\xee\x46\xe7\x4c\xdf\xf7\x80\xfb\xaa\x07\x01\x4f\x1e\xb4\xf6\xb7\x45\xed\xfa\x1e\xb0\xae\x03\xb4\xef\x0f\x2a\x0f\xbc\xbf\xbc\x5f\xfa\x75\x1c\x95\x17\x31\xae\xb4\x73\xeb\x38\xac\x1f\x3d\xb4\x36\x54\x86\x3c\x0f\xe3\x67\xd1\xaa\x7b\xf1\x3e\x8b\xfe\x51\xe8\xe0\xda\x9e\xcc\x7f\x1f\xfd\x75\xf4\xbf\xbc\x60\x20\x5e\xcd\xe3\xdb\xbb\x0f\x77\xfb\x0f\x77\x6f\x40\x30\x95\x6f\xcf\x30\x39\xb7\xcf\x6d\x33\x77\x1b\xb2\xc4\x9b\x0b\x2e\x5b\x48\x88\x9d\x0b\x97\xc2\x60\xdf\x6f\xe5\x07\xef\x3f\xdc\x60\x46\x71\xc8\x73\x2c\x6d\x75\xd1\x66\xde\x2d\xbd\xb5\x97\x77\x02\x9c\x2c\x98\x7d\x0a\x5a\x4f\xa6\x9a\x9a\xd6\xd6\x7e\xe4\x20\xeb\x7c\x0d\x5a\x9f\x75\xb6\xc0\xbc\x44\xa5\xf4\x03\xe8\xca\x82\x96\x0c\xe3\x6a\x9f\xdd\xe7\x52\xa6\x55\x2a\xe3\x09\x0c\x6d\x39\x11\x02\xb8\x2f\x1e\xd2\x7d\x78\x33\x2b\x25\xb1\x97\x79\x49\x15\x2d\x47\x00\x8d\x50\x44\x01\x8b\x7d\x85\x71\x49\xca\xa2\xeb\x0a\x4c\x28\x2a\xba\x28\xfa\x59\xe8\xfd\x13\x07\x1a\xed\x43\x57\xc9\xf3\xbc\xb0\x4d\x87\xbf\x7d\x75\x49\xb4\x7f\x3e\x4b\xef\x3f\xbc\x7d\xfd\xe1\xed\x9b\xfd\x17\xf3\xf2\xd4\x2b\xb0\xcd\xcb\x87\x9b\x30\x33\xab\x75\xb8\x21\xd5\xbe\x7f\xb5\x6b\x7d\x63\x43\x92\x7a\x17\x3d\xb9\x3b\xad\x0d\x98\xd4\x15\x28\x74\x28\x30\xc9\xfc\xa9\x33\x54\x58\xcd\x1c\xef\xd9\x11\x64\x7e\xac\x4c\x09\x21\x81\xb9\x01\x69\x9e\x53\x4c\xec\x81\x2e\xe3\x3d\xbc\x49\x8f\xc2\xf7\x02\x90\xbf\xa9\x28\xcb\x6c\x86\x76\x30\x2e\xc2\x47\xa2\xd7\xeb\xbe\x5d\x40\x22\x04\x23\x7e\x04\x48\x49\xa9\x0d\x18\x89\xa7\x38\xa7\x25\x44\x65\x25\x0b\x88\x38\xce\x02\xcc\x7c\x04\x02\x06\x97\x05\xa7\x2d\x06\x74\xe1\xe4\x79\x4a\x03\x5c\xd8\xf9\xc9\x5e\x2d\x26\x4b\x13\xb8\xd8\x1e\x4c\x78\xe9\x4f\xb8\x5b\x14\x8d\x8b\x66\x91\xf1\x94\xa7\x8b\x03\x27\x85\x0b\xa3\x91\x45\x20\xf3\xc7\xc2\xe4\xb5\x29\x70\xb4\xdb\xc1\x50\xab\x2b\x43\x24\xe5\x2f\xa3\xff\xff\x05\xeb\xef\x65\x56\xea\xd7\x20\xd4\xf0\x7c\x0a\x58\x34\xcf\xc9\xa8\xe4\x6c\x63\x27\x9f\xde\x7d\xba\x7d\xf5\xf6\x26\x25\xb6\x09\xd5\x8b\x92\xb3\xc0\x85\x83\x29\x6c\x47\xd8\x0c\x16\x70\x3f\x82\xc2\xd6\x08\xa8\x66\x55\x00\x75\x4d\x91\xe0\xd3\x41\x9a\x02\x3a\x5f\x54\x8b\x64\xeb\x4c\x91\x12\x6a\x82\x1c\x04\xe9\x82\x13\x52\x81\x51\x67\xa9\x5d\xcd\xf0\xf1\xa1\xce\x04\x9a\x02\x40\x5a\x12\xc9\xc4\x04\x5e\xf9\x9f\x9f\xf9\x9c\xdf\xbf\xfa\x45\x30\x44\x42\xc9\x35\x78\xff\xe6\xb2\xc3\xff\xf0\xee\x6c\x56\x7f\x46\xcc\x91\x64\xce\xf7\xbe\x2c\x63\x5a\xce\x7e\xc2\x80\x80\x0c\x60\x3b\x77\xb0\x3b\x1e\x3b\x3c\x0c\xb4\x1a\x48\x9a\xa5\x26\x55\xbe\x9b\xcd\xc3\x78\xb4\xd4\xf4\x07\xed\x87\xee\x58\x98\xa2\x25\x85\x29\x08\x48\x5b\xca\x0c\x2d\x71\xa9\x19\x36\x30\xcf\x60\xca\x90\xa3\x84\xc4\x10\x95\x8a\xe0\x4b\x5d\xb6\x4d\xf2\xe8\x57\x21\x47\xfc\x32\xe9\x70\x6e\x81\x7a\x77\xf7\xe6\xfb\xdb\xdd\xcd\xbb\x50\x43\x17\x08\xf2\x0f\xcd\xbd\xdd\xe1\xfb\x7e\x57\xde\x77\x7b\xea\x07\x82\x4b\xdb\x72\x0f\x67\x1f\x01\x57\xf8\x69\xa6\xbe\x03\x65\xc2\x29\x21\x28\xc9\x05\xe1\x84\x11\x8d\x70\x81\xa0\xd6\xc7\x96\x6b\x52\xd0\x59\x83\x79\x31\x38\x87\x68\xc3\x56\x53\x3b\x7c\x63\x0f\x36\xfa\x93\xe0\xe9\x7d\x7b\x7b\x8e\x33\x7d\x7f\xbb\xff\x25\x78\xff\x97\x5b\xd3\xe5\x77\xef\xf6\xef\xbe\xdf\x82\xec\xaf\x42\x4d\xcb\x77\xc9\x5c\x52\x50\x32\xce\x24\x2f\x41\x9a\x7a\x28\x47\x8c\xa1\xcd\x25\x17\xbe\xad\x3c\xca\x81\x2c\x91\xef\x0d\xd1\x8e\x96\x0c\xa0\x83\x16\x34\x47\x90\x17\x88\x66\x1a\x12\xaa\x0b\xcd\x8d\x29\xd6\x4b\x44\x19\xf5\xfd\x11\xe5\x4a\x6f\xf3\x42\x93\xfe\x92\x3b\xbf\x66\x4d\xb8\xa0\x1d\x85\x74\xfe\xed\xb9\x88\x26\xbe\x09\x36\xa6\x6c\x5c\xe7\xda\xd6\x75\xae\x69\x2b\x4b\xb1\x25\x82\x53\x4d\x48\x3b\x53\x00\x75\xd5\xee\xab\x71\x1c\x47\x1b\x7a\xdc\x27\x90\x7b\xdd\x76\xed\x09\xfb\xe3\xd1\x58\xad\xa5\x9f\x4d\xe5\x4e\xc1\x20\x8a\x13\x73\xb6\xe7\x5f\x87\xf9\xf8\x7a\xee\xfe\x05\x08\xe7\xa7\x5f\x82\xdb\x6f\x76\xcc\x01\x64\x8f\x47\xeb\x07\x37\x0c\x31\x37\xba\xeb\x7b\x36\x76\xcd\xcc\xa6\xea\x58\x69\x6a\x4c\xff\x59\xea\x5e\xf9\x53\xcb\x9d\xee\x5a\x63\x4d\x05\x72\x20\x79\x7f\x6a\x41\x1e\x45\xbb\x28\xd4\xc8\x27\xfc\x25\xc6\xdf\xdd\x8f\x36\xd3\x7c\x77\x81\x79\x5b\xed\xb3\x38\xb7\xeb\x3e\x45\x34\xc1\x71\xb3\x88\x98\x2c\x6d\x38\xda\xdf\x5a\xc7\x18\x07\x28\x76\x1b\x44\xd8\x7a\x24\xac\xc0\x08\x73\x42\x0d\xd7\x42\x73\x43\x62\x42\x4b\x33\x6a\xce\x27\x21\x8e\x7c\x95\x85\x3c\x92\x5d\x7a\x90\xc1\x22\xfb\xd3\x0b\x33\xd6\x16\x89\xbf\x00\xfc\x86\x7a\xad\xfd\xab\x2d\x06\xfc\xc7\xe0\xbb\xe4\x2a\xcf\x9b\xb4\xd4\xd8\x79\x3e\x3a\x3f\xda\xe3\x3c\xfb\xa9\x24\x0a\x63\x30\xea\xd0\x35\x72\x3e\x0e\x52\xe7\xd9\x68\x9a\x7b\x27\xd5\x4e\x36\xa6\x87\xde\x2c\x8d\x47\xad\x70\xa0\x8e\x09\x38\xc2\x07\x56\x79\x62\x3d\x6e\x82\xde\x5b\xe7\xc7\xc4\x51\xd0\x7b\x57\xe4\x3a\xf0\x87\x0f\xaf\xee\xde\xfc\x22\x50\xa1\xff\x1a\xec\x66\xdc\x3b\x92\x55\x99\xf1\x27\x7f\x52\x3e\x6f\x67\x76\x32\x71\xe4\xcb\x02\x62\x09\x3b\x46\x04\x60\xe5\x71\xc0\x06\x55\x6d\x1d\x45\xd1\x4d\x52\x9c\x7b\x66\x7e\x16\xfd\xc9\x53\x15\xea\xff\x14\x9e\xce\x73\xd5\xef\xed\x57\x70\xa8\x6e\xbf\xc8\xd2\xbf\x7d\xf3\x02\x03\xfa\xc3\x59\x31\x7e\x5e\xe4\x7c\x63\x1f\xac\x34\xb2\xad\x75\x6b\xba\xce\xb4\xba\xce\xe3\xa3\x1f\x80\x20\x65\xc9\x73\x51\x14\x47\x94\x65\x0c\x17\x22\x73\x6d\x4e\xcb\xde\x02\xe6\x47\xbb\x9a\x47\x95\x2f\xc3\xcb\x81\x98\x85\x2f\xa3\x67\x14\xb4\xe0\x94\x44\x73\x59\x96\xa5\x5e\x4f\x62\x39\xb1\x65\x24\x24\xd3\x19\x04\xae\x4d\x11\x2c\xa4\x41\x34\x70\xa4\x8f\x4b\x1f\xb7\x0c\x60\xce\xb9\x3f\x72\xce\x37\x2c\xcd\xec\x91\x86\x9c\xee\x73\x84\x35\xb0\x07\xbe\x7a\x1b\xc4\x7f\xbb\xfe\xce\xc9\x19\x62\xec\xf2\x7a\x48\xcd\xc9\x08\xc3\xdd\xcc\xc3\x82\x99\xc2\xf9\xa0\xbc\xbb\x9f\xf4\x32\xc6\x85\xdd\x15\x67\xa8\xed\x68\x39\xbf\xae\x3a\x7a\x0f\xcf\xbd\x94\xff\x38\xd4\xa6\x3c\x61\x61\x05\xab\xeb\x2e\xf4\xf9\x7c\x59\x33\xba\x59\xe6\xfb\xf2\xe8\x86\xe1\xb4\xfe\xbf\x1d\x21\x10\xce\x18\x22\x09\xc9\x29\x83\xde\x59\x4e\x34\x16\xab\x5b\x61\x1e\x23\x63\x40\xb4\xd4\x5a\xdb\x65\x52\x2c\xaf\x21\x05\x33\x31\x15\xa9\x4c\x14\x25\x49\x1b\x30\x83\x55\xb4\x8f\xfe\x3c\xfa\xcb\x67\xae\xae\x8d\x37\xec\xd5\x93\x13\xf8\x43\xf2\x39\x70\xf4\xeb\x8b\x1c\x87\x8a\x22\x8d\xc8\x62\x57\x47\xdd\x7a\x99\x0b\x62\x95\xac\x7a\xd1\xd7\x54\x71\x06\x39\x27\xda\xc9\xd9\x7a\x69\x45\x69\x4a\x7e\x50\x42\x12\xc9\x4f\xeb\x0e\x68\xbd\x82\xae\x61\x47\x7b\x6a\x6d\x0f\x32\x1f\x29\x96\x57\x90\x81\x7e\xb0\x7a\x02\x39\xd0\xa6\x6a\x69\x53\x45\x49\x22\x82\x9c\x3a\x20\xa3\xfc\x65\xc8\xf8\xff\x4e\x09\x03\x01\xd0\xab\x0b\x50\xec\x19\xf5\x0d\xa8\x0a\x54\x9e\x43\x49\xac\x52\x75\x2f\x86\x86\x8a\x20\x20\x72\x9d\x04\xb0\xf6\x26\x9e\xc2\x58\x3c\x0c\x92\xee\x31\x20\xbe\xb5\x5e\xa1\xba\x61\x93\x9d\x5e\xca\xd8\x3e\x46\x8d\x06\x19\x28\x81\x05\x43\x18\xd2\x32\x6f\xd2\x46\x21\xb6\x4c\x83\xee\xdc\x6f\xdd\xdb\x9f\xcd\xeb\xb7\xbf\x5b\xec\xf3\xc4\x72\x56\x1a\xcc\x16\x09\x9a\x60\x84\xa6\xa9\xa2\x56\xeb\x66\xe4\xc7\x86\x2b\xc9\xa0\x10\xb4\x9d\x04\x20\x9d\xa7\x56\x12\x53\xca\xcf\xa6\x36\xcb\xab\xa7\xb9\xcd\x97\xf9\x2c\xf7\xd1\x4f\x9d\x06\x10\x50\x20\xcd\x45\x5e\x10\xe9\x80\xbd\x89\xb7\x5a\x95\x0f\xd7\x0d\xa2\x5f\xe9\x86\x4d\xda\x25\x3b\xe8\x92\xaa\x22\x5f\xc6\xd5\x0a\x76\x3d\x38\x62\xcf\xbc\xf0\xba\x63\x4e\x8e\xd2\x66\xb0\xef\xf7\xb5\x35\x9c\xd0\xa2\x30\x46\xa6\x8e\xca\xda\xca\x1e\x94\x90\x12\x59\x84\x18\x58\xf1\x48\x6f\xf8\x41\x9f\xed\xfa\x4d\xb3\x67\x37\x57\x85\x56\x6f\x02\xfa\x70\x60\x53\x5d\x1f\xb2\x1d\x76\x79\x11\x0f\x25\xaa\x99\x86\x86\xe3\x32\x5b\x1c\x15\xaa\x89\xb1\xd7\xce\x4d\xd3\x41\x23\xa5\xee\xab\xb9\x85\x35\x9c\x92\x63\xda\x39\x09\x72\x3f\x2c\xa5\x4a\xf0\xd2\x83\xfa\xb2\xa7\xe6\x07\x12\xfd\x22\x3c\xd5\x2f\x17\x75\x7c\x13\x78\xb3\x9e\x0c\xe2\x8f\x49\xce\x18\xe6\x90\x97\xc8\xb8\x8c\x39\x09\x1a\x3f\x19\xc1\x08\xad\x0e\xe4\x6f\x8e\x5c\xe4\x36\x17\xa0\xe3\xd4\xb7\x03\x06\x29\x98\x93\xee\xc1\xc4\xd3\x48\x85\x24\x78\x39\xd2\xf3\xfd\xe2\xe3\xef\xb9\xdf\xdb\xcb\xfd\xe2\x23\x63\x88\x14\x14\x61\xa5\x72\xe2\x38\x30\x27\xc5\x39\x2e\xf5\xd5\xed\x5a\x4e\xc2\xed\x32\x70\x4a\xba\x07\x15\xcf\xeb\xed\x4a\xbc\x04\x92\x89\x24\xd9\x6a\x0a\xd4\x73\x0f\xde\x17\x75\x53\xef\x3e\xbe\x7e\xfb\xdc\x83\x17\xdf\xdc\x3d\x73\xb7\xc6\xef\xf6\xc4\x02\xed\x35\x61\x01\x06\xbe\xf0\x02\x1a\x3e\x83\xa2\x80\xeb\x4e\x3a\x2f\x23\x57\x20\xf5\x27\x23\x7a\x5e\xc7\x8d\x53\x42\xdb\x1d\xf5\xd6\x2c\xad\xa4\x99\xcd\x58\x0c\xcd\x08\xa0\xd5\x16\x2a\x65\xfd\x71\xf4\x33\xf1\x53\xaf\xdb\x53\x77\xd2\x20\x6d\x23\x10\x35\x09\xbd\x29\x0f\x26\xc8\xb6\xed\xe1\xa1\xd5\xf4\x3a\xac\x7b\xd9\x2a\x9e\xeb\x77\x6e\x43\x03\xed\xbe\xa2\x18\xe4\x8b\xe8\x2c\x6f\x1e\x23\x2e\x4e\x24\x35\x99\xf2\xdd\xa4\x52\x65\x69\xe7\x1a\xe5\x21\x05\x56\xf9\x28\x2e\xb6\x3a\xbb\x23\x44\x07\x45\x98\x69\x09\x95\x82\xe5\x19\x52\x45\xcd\xcb\x12\x42\x53\x14\x93\x57\xd2\x30\x90\x1b\xca\x73\x4a\x20\x8c\x92\x04\x9f\xfd\xe5\x9f\x47\xaf\xa3\x7f\xb1\xce\xdd\xeb\xf7\xc9\x3a\x45\xc9\xbb\x6f\x5e\xbf\xbd\xb0\xa7\xc7\x37\xaf\x5e\xf0\xd9\x6c\x20\xfa\xef\x5f\x7d\x4c\xc8\x9c\xb9\x2c\xd6\x8b\x2a\x4e\xfa\x08\x4f\x49\x16\x60\x87\x26\x6d\x47\x2d\x51\xea\x32\x3e\x34\xa2\xd2\xbc\xed\x9d\xdd\x4d\xab\xa6\xb4\x8b\xf4\x9d\x00\x38\x46\xff\x2f\x6b\xff\x13\x24\x39\x8e\xef\x87\xe1\x04\x99\x99\xc5\xf7\xf4\xa4\x65\x4d\x4f\x6f\x53\xbf\xf7\xa4\x45\xa9\x66\xb6\x21\xe9\x27\x1b\x56\xbf\xee\x86\xa5\xb7\x6b\x28\x64\x87\x60\xe9\xf0\x20\xd9\xb2\x20\x3b\x1c\x82\x23\xec\x08\x84\x7d\xc1\x11\x47\x1c\x71\xc4\x11\x47\x1e\x79\xe4\x91\xc7\x3c\xf2\xc8\x63\x1e\xf3\x98\xc7\x3c\x72\xa7\x92\x28\x07\x91\x99\xd5\x59\x3d\x33\xbb\xab\x67\x4d\x37\x93\x59\xac\x9e\x2a\x24\x08\x02\x5f\x7c\xbf\x9f\x3f\x60\xd2\x8e\x3b\x3d\xb7\x2c\x8e\x53\x3c\x12\x32\xe2\x49\x51\x1e\x5a\x6e\xfd\x2e\xd7\x91\xf5\xcb\xbd\x65\xcf\xed\x9d\xdf\xe0\xd4\xbe\x77\x97\xe7\xf4\xe1\xee\xfe\x31\x4d\x1b\xe0\x9b\x37\x77\x79\x91\x14\x43\x58\x44\xab\x2a\x1a\xea\xc3\x4e\x03\x04\xc6\xae\xd1\x7e\x3b\x87\x15\x7c\xda\xaf\x5b\xe7\x9a\xa7\xbe\xa8\xe2\x38\x19\xc0\x01\x8c\x87\xe8\x34\x90\x40\x3c\x4d\x21\xcb\x0a\x20\x9f\xd9\xc6\x17\xec\x82\xe1\xcf\x7e\xd6\x93\x6b\xe3\x8d\xd1\x0e\xf5\x52\x9d\xb2\xa6\x59\x65\xa7\x6c\x39\x0a\x76\xea\xa5\xa8\x7d\xcd\x74\xec\x57\x59\xdc\xfb\x28\x5d\xca\xa1\xb2\x67\xb6\xe9\x8a\xf0\x87\x7f\x6e\x67\x8c\x69\xd0\xa8\xc4\xd3\xae\x69\x56\xe8\x69\xb7\x1c\x45\x38\x19\x29\xeb\x50\x73\x13\xc3\x8a\xc7\x31\x44\x1a\xd2\xbc\x65\x56\xf5\x05\x6b\x77\xe1\x9b\x9e\xb1\xf1\x89\x7d\x39\x36\x79\x37\xf3\x02\x4e\x07\x40\x1a\x60\x37\x26\xf8\x26\x04\x20\x63\x93\xd6\xde\x54\x67\xd0\xab\xf2\xca\x28\xff\x1a\x7f\xf3\x4a\x36\xec\xcb\x9f\x84\x2b\x5c\xbf\x7d\xf8\x08\x54\x0e\x43\x4e\x40\x1d\x0f\xf3\x90\xdb\xd9\x16\xe8\xb4\x0b\x09\xe0\xdd\xe6\x62\x89\x2a\x4f\x53\x51\xce\xfb\xbc\x3f\x27\x0d\x8a\x4e\x88\xc1\x0e\x52\x4b\xd3\xf7\x66\x39\x71\xcb\x39\x1f\x39\xcf\x56\x59\xbb\xc4\x1c\x39\x7a\x89\x39\xb2\xef\xdf\xad\xdf\x3e\x7e\x5c\xbf\xff\x3e\x85\x96\x0f\xf7\xe0\xaa\xfb\xfb\xf1\xe1\xed\x9d\xae\xe2\xd0\x3c\xd5\x35\x20\xfb\x0d\x7b\xce\x4e\xf8\xd6\xd7\x87\xda\x52\x49\x64\x4b\xd0\x6a\x1d\x2d\xa0\xf4\x40\xf7\x84\xbf\x68\xf4\xea\xec\x2f\xb2\xff\x36\xfb\x97\x49\x93\xe3\xd3\x0b\x5d\x68\x89\xd1\xfe\xf2\x15\x5d\x68\xfd\xfb\xbe\xf9\xe6\x43\x4a\x32\x7c\xb8\xff\x70\x51\x61\xff\x36\x6d\x3f\x1e\x8a\x41\x50\x4a\x5c\xbf\xd3\x02\x1a\x5a\xd9\xb2\x1f\x91\xb7\xda\xc2\x20\x3d\x07\xbb\x9f\xff\x26\x13\x36\x8e\xde\x77\x27\xe5\x5a\x37\xec\x19\xc0\x28\xee\x57\x63\x55\x2b\x4d\xa2\x1f\xeb\x5a\xc0\xe0\x11\xc6\x04\x26\xaf\x2b\xdb\x82\x0a\xef\xc2\xef\xfd\xf6\x78\x9a\xa2\x8e\xba\x60\x71\x48\x7b\x1d\x12\x77\xd3\x73\x86\x3c\x1e\xb3\x3f\x2d\x48\xe2\x36\xda\xf4\x2c\x9d\xe7\xca\x6b\x55\xed\x7f\xfe\x11\x43\xf5\xe2\x5d\xf9\x2a\xd7\xff\xf1\x96\x20\xb5\x7e\x49\x92\x7d\x4c\x04\x87\xe5\x00\x5f\x73\x6d\xef\x74\x98\xab\x00\xfa\xaa\xf6\xb0\xa6\x82\x0a\xc6\x7b\x87\xa5\x86\xb6\xe4\x7d\x2f\x73\x23\x84\xe4\x6a\x96\x86\x33\x2d\x8a\x20\x9f\x7a\xed\xb5\x3e\x6a\x3d\x69\x3d\xf3\x62\x1f\x35\x33\x92\xd5\x52\xa2\xc8\xd6\x87\xc9\x98\x89\x60\xcc\x78\x4f\x98\xe2\x14\x0f\x75\x8d\x19\xb2\x8c\xb0\x51\x1a\x65\x0d\x64\x9e\x0b\x39\xc5\xc1\xda\x25\x1a\x38\x33\x0b\xa4\x1d\x24\xaf\x3d\xa4\x5d\xd2\x0d\x13\xcf\x2c\x3f\x6e\xf0\xe5\x99\x4c\x0a\xc7\xc9\xe3\xe2\x27\x1c\x17\x3e\x7d\xbe\x7f\x54\xb9\x13\xb4\x16\xbe\x1b\x88\x60\xfb\xe5\x07\x4a\xb9\xdd\x60\x77\xca\x2a\x0b\x23\x06\x81\x90\x50\xaf\x5c\xb2\x55\x96\xa0\x9a\x51\x0d\x41\x99\xbd\x8c\xed\xed\x4f\x8d\xed\x87\x97\xb1\x9d\x90\xb0\xaf\xc7\xf6\x73\xb6\x51\x5f\x0f\x6e\xed\x4b\x67\xb1\xab\xf2\xcc\xb9\x88\x80\xe3\x71\x2f\xe2\x81\xa9\xa4\x83\xf6\xcc\xee\x54\xde\x7d\xf9\x3d\xc9\x43\xe2\xe6\x41\x5a\x5f\x77\x63\xdf\x7f\x7c\x00\x78\xdd\x04\x00\xab\x38\xfa\xa7\xac\x06\xd0\x02\x58\x88\x53\x7b\x3d\xf2\xce\x44\x5c\xb9\xb2\x09\xc8\x56\xe0\xc8\x79\x3c\xf2\x38\x42\xb6\xec\x8d\xea\x17\x7f\xdb\xbf\x95\xfd\x45\xf6\xdf\x24\x1c\xdb\xbf\xcb\x32\xf0\xcd\x12\xce\x7d\xff\x2e\xbf\x08\xd7\x7c\xfa\xfc\x0a\xa6\x72\x3b\xe3\x9d\x17\x8d\xaf\xe4\xd0\x2e\x17\x6f\x05\x9f\x36\xa4\xdd\x8a\x7e\x8c\x83\xf3\x71\x92\x20\x9b\xbc\x71\x7d\xc3\xad\xe5\xbe\xae\xe3\x14\x47\xd4\x1e\xc1\xc4\x18\x51\x50\x23\xe4\x1a\x3a\x86\x18\xe6\x71\xb9\x44\xe5\xcd\xa5\xfc\x40\xa0\xaf\x49\x14\xe9\xb4\xb1\xcf\x99\xf5\x16\x60\xc1\xe2\xb4\x35\x03\xc3\x83\xa9\x6a\x4d\x42\x4f\x29\x46\xb5\x75\xb1\x39\xed\xcf\xca\x69\x5b\x41\x03\x63\x00\xbb\xaf\x2f\x08\xa1\xb1\x96\x28\xbd\x66\xd9\xdf\x2e\xfc\x05\xe3\xf6\x63\x9e\xdc\xd5\x89\xef\x8f\xe7\xc9\x7d\xf8\xf1\x9e\xe7\xf1\xfd\xfd\xc3\xfd\x6b\x9a\xdc\x87\x8f\x77\x6f\x3f\x5c\x69\x72\x98\x45\x33\x8f\x18\x8c\x80\x1a\x46\x15\x3b\xf3\x87\x71\x87\x91\x86\x84\x16\xbb\x13\x72\x21\x80\x3a\x58\x1f\xc7\xc9\x4b\xc9\x65\x12\x19\x20\x13\x8c\xae\xaf\xa1\x11\xc4\x42\xd7\x52\x77\x38\x1c\x00\xc6\xcb\xff\xba\xd1\x06\xdf\x12\xe4\x04\x3b\xbf\x76\xb1\xd1\x67\x58\x8b\xf4\xde\xcc\x47\x25\x12\xa8\xf0\x38\xc6\x3a\xee\xf8\x99\x1f\xa7\x29\xa1\x85\x56\x42\x6c\x6f\xf9\x71\x85\x78\xe6\x77\xdb\x54\xd7\xf9\xe3\xb4\x81\x6f\x99\x61\x1f\x7e\xa4\x0d\xfc\xf9\x27\xb5\x81\xcf\xde\x84\x45\x03\x9a\x7a\x99\x67\x40\x77\xaa\x81\x94\x61\x27\x06\x30\xb6\x81\x36\xed\xbc\xdb\xb9\xa3\xdb\xed\xba\xee\x18\x1d\x26\x0c\x5b\x2e\x64\xc0\xb1\x6d\x18\x3b\xa0\xbe\xa1\x5a\xc8\x7d\x1f\x3d\xa8\xbb\x6e\x97\xf3\xe3\xf1\xb8\x3e\x26\x73\x2c\x5b\x31\xcd\x0d\xe1\x58\x69\x43\xf6\x5a\x6b\x6d\xac\x71\xc6\x08\x2e\xb8\xe6\x8a\x5a\x0b\x06\x86\xe3\x28\x34\x27\x0c\x60\x0a\x0d\x73\xc6\x99\xa5\xab\x9e\x33\x97\x65\x7f\x52\x88\x67\x79\xd7\x6d\x5c\x56\xbe\x8c\x8f\x65\xde\xfd\x97\xd9\xff\x78\xc3\xc6\x2e\x7e\xf9\xee\xc3\x45\x0d\x2d\xe1\x91\x6e\xb9\x64\xaf\x94\xd0\xde\x7e\xfb\x61\x19\x19\x5f\xec\x96\x2f\x6a\x68\x6b\x8f\x6b\x60\x4e\x06\x28\x8c\x70\xdd\x61\x18\x18\xa8\x4f\x25\xc8\x6a\x68\x0a\x7e\xea\x7c\x8e\xe7\x71\x39\x00\xa7\x50\x23\x02\x76\x9c\x58\x2c\xe6\xd1\xa3\x8a\x69\x54\x97\xae\x56\x5b\xe2\x78\xef\x2a\xee\x79\x12\xf3\xb4\xea\x39\x13\x4a\x28\xec\xad\xe5\x2c\xfa\x79\x0b\xa4\x8c\xbd\x8e\xc7\xc4\x1e\x2d\x43\xc7\xbb\xc0\x0e\xac\x2c\xb1\x22\x3d\x66\x1c\xd4\x70\xdb\xf2\x26\xcb\x40\xd1\x3e\x9b\xe4\xd3\xfd\xe6\x8b\xbf\xca\xfd\x0d\x73\x7e\x55\x15\xe6\x52\xed\x10\xa7\xba\x0b\x5d\xd4\x1b\x18\xe6\x7d\x98\x69\x08\xc5\xe1\x54\xaf\x93\xa7\xc8\xba\x50\x17\xbc\xc0\x17\x65\xf4\x0c\xdc\x7f\x9d\x18\xb8\x7f\xbc\x7f\xfc\x78\xc6\x87\x82\x8b\xd0\xda\xb5\x66\x73\x47\xb4\x56\x8a\x2e\x0b\x2f\x99\xb7\x41\x4a\xa0\x7c\x6c\xc6\x11\xc8\xfd\xbc\x4d\xa7\xfd\x3a\x9c\x8c\x8f\x4e\xc8\x25\x7e\x03\x62\xde\xe6\xd4\x17\x6e\xbf\x8f\xc9\x14\x05\x90\x8b\xad\x34\x49\xb9\xc1\xe6\xe2\x09\xf7\x36\xcd\xb3\x1f\xbe\xfd\x05\xf8\xf6\x3c\x3c\xbf\x01\x77\x59\x91\x83\xf7\x9f\xbe\x39\xef\x2b\xd6\x3a\x94\x65\xe5\xb8\x33\x83\x01\xb5\x7b\xce\x94\x88\x41\x4d\xbb\xb8\xf7\xd0\x39\xb3\x31\xc7\xfd\xb6\x64\xed\x56\x1f\xfb\x58\xc6\x9d\x05\x18\xec\x23\x8d\x9d\xdd\xe5\x01\x38\x14\x0f\x47\x3a\x65\x79\xe1\x93\x46\xbe\xb9\xe8\xb0\xdd\x3f\xde\x5f\xdc\x73\xde\xa4\x8c\xd2\x9b\x0f\xc5\xfd\x57\xda\x78\x77\x2a\xc4\x03\xda\x6e\x6d\xb7\x85\xbb\x06\xd8\x2a\x54\xa1\xc6\x14\x56\xbe\x16\xde\x89\x35\x8c\x1c\xc0\x79\x9c\xb7\x7b\x3d\xe4\x10\x4c\x71\x04\x5b\x20\x62\x3b\x0f\x33\x47\x35\xe9\xe8\x4e\xf1\x8b\x9f\x6f\xfb\xec\xee\xda\x0d\x3f\xc7\x98\xaf\xef\xe0\x7a\x08\xa9\x53\xd8\x29\xeb\x9a\x71\xc3\xe7\xc1\x9f\xbc\xf7\xab\xe9\xa9\x4c\x38\xc6\xf3\xda\x57\xf4\xbf\x3f\xae\xbb\x5d\xfb\x3a\xff\x04\x6b\x80\x8e\x1b\x15\x0f\x27\x52\x90\x64\x79\x9d\x8e\xce\x57\xdb\x9e\xfa\x2a\xdf\x7a\x3f\x1b\x30\x2d\xb1\x75\x74\xca\x5f\xd7\xf2\x15\xbb\xf1\x50\xba\xae\xe5\xc9\x3e\x29\x31\x64\xee\x1f\x41\x22\x9f\xdc\x3f\xdc\x7f\x7f\xff\xa0\x8b\x5d\xeb\xa0\xe0\x4d\xdc\xc7\x8e\x08\xee\x01\xbe\x8a\x09\x25\x41\x21\x12\x9e\x26\xe8\x92\xac\x60\x20\xa4\x2d\xab\x55\xf2\xbe\x98\x35\xc8\x66\x4c\xc1\x4b\x4c\xdf\x83\xe3\x85\x2d\xf9\xe2\x81\xf6\xee\x1a\xca\xf7\xcd\xd3\xd8\x34\x2b\xfc\x34\x2e\x07\x38\xce\x82\xb1\xbc\x9d\x4c\x0c\xcb\xa0\xbe\x4b\xde\xc0\x22\xc5\xee\x75\xf6\xdd\x45\x0f\xfe\xaf\x7f\xac\xec\x54\x5c\xb3\x11\xef\x1e\x5e\xa8\xaf\xcb\xc5\xc7\xd7\x8b\xc4\x6f\x40\xfa\xc6\x9b\xb7\x89\x83\xf2\x9b\xfc\xf1\xed\x79\xaa\xb0\x57\x00\x09\x3f\x0d\x80\x47\x5d\x15\x5b\x4c\x14\xac\x4f\x3b\x99\xdb\x1d\xf0\x27\x0d\x54\x3c\xaa\xe2\xa8\x19\xa3\x8a\xe0\x9a\xd2\x2a\x6e\x01\x9d\x6b\x6b\x80\xb5\x0e\x6c\x53\x49\x3a\xe9\x40\x09\x63\x44\x3c\x18\xc1\x38\x42\xc2\x70\x63\x78\x3c\x1a\x6e\xe2\x51\xb2\xca\xd5\x74\x32\x7c\x9e\x78\x9e\xc5\x8c\x9b\x61\x68\xd8\x12\xe4\x65\x65\xca\x1b\xd7\x37\xde\xde\x6f\xd2\x8e\xe3\xf3\x59\x6f\xe4\xb5\xd3\xe5\x19\x59\xf6\x4a\xef\xed\xd3\xe7\xc7\xe4\xf9\xfd\x25\x65\xf4\xde\x17\xf2\xd4\x04\x29\x8f\x3c\x88\x19\x15\xee\x64\x50\x41\x23\x21\x54\x49\xd8\x78\x46\xb1\x6c\xdc\x10\x52\x11\x96\x78\x8a\x25\xa1\x52\xc8\x61\xb7\x11\x11\xbb\x73\x24\xc8\x9d\x8a\x4a\xf3\x03\x82\x86\x61\xee\x09\xb4\x7a\x67\x43\xec\x35\x65\x92\x61\xa1\xf4\xa1\x39\x8f\x5f\x75\xd1\x82\xf8\x45\x06\x33\x9c\xfd\xeb\x9f\xb8\x3b\xd7\x55\xea\x0c\x27\xb8\x51\xeb\xbf\x58\x3b\x17\x69\x54\xbc\xfd\xf6\x97\x0f\x37\x1a\x0c\xcb\xe6\xfe\x53\x0f\x50\x48\xcc\x6d\x76\x1a\x01\x8f\x3b\xe6\x96\x4d\x65\xdd\xed\x6b\xef\xc0\x68\x7c\x08\x3e\x0a\x67\x0e\x87\xc2\x8e\x0d\x60\xc0\xe8\xba\x81\x6d\x44\x91\x0f\x01\xc7\x03\x1b\x37\x99\x31\xce\x38\x67\x22\xd7\xda\x35\x50\x33\xec\xeb\xad\x35\x26\xf9\x18\xcd\x7b\xe7\x8e\x08\x12\x8d\x5b\xc9\x24\x80\xd1\x25\x3d\xa8\x22\xe9\xf5\xf4\x05\xbe\xa8\xf1\x9d\xf3\x4e\x2f\x6a\xa9\x2f\x18\x97\xb1\x43\x28\x77\xe1\x69\x0c\x39\xc2\x91\x5e\x87\x71\x81\x31\xc1\xa7\x56\xca\x42\xb0\x68\xdb\x88\xda\x65\x8e\x58\xc1\x34\x3f\xcb\x34\x3b\x6d\xee\xde\x7f\x73\x66\xa0\x5c\xb2\x2f\x89\xfd\xf3\xee\x82\x6c\x4d\xcb\xd9\xba\x26\xd4\x06\xe2\x6b\xa8\x9a\xa5\x0b\x4a\xc0\xe2\xa4\x7a\xd1\x1b\x1d\x0f\x02\xd4\x2c\x6e\x01\x5f\xd9\xd6\x28\x00\x01\x45\x56\x27\x54\x7e\x1c\x30\x4e\x16\x70\x3b\xd0\x46\x35\x39\x50\x01\xeb\xc1\xb2\x6f\x5f\x55\xcf\xfc\x4e\x6f\x74\xd2\xfa\xf9\xfb\xd7\x5c\xda\x55\x48\xe8\x9b\x37\xe7\x3a\xff\x4b\x26\x6d\x0d\x1d\x44\x79\xa5\x1d\x93\x50\x31\x82\xab\x48\xa9\x54\x3d\x70\x71\xb4\xb6\x6d\x37\x1a\x19\xfd\x24\xa3\x87\x2d\x04\x75\xd1\x3b\xad\xa6\x68\x67\x66\x8a\x65\xdd\x6c\x97\xdf\x87\x52\x0c\xac\x52\xbc\x07\xaf\xb1\xef\xfb\x65\xc6\xff\xa6\xf8\xa2\x57\xf2\xf9\xd3\xfd\xe3\xb2\x16\xbc\x79\x5c\x36\xdf\x26\xf8\x83\x53\xc1\xb4\x2c\xf7\xa5\xf2\x84\x57\x82\xe0\x0a\x0f\xe8\x39\x93\x03\x0a\x1b\x15\x65\x27\x47\xd0\x60\x14\xf5\x41\x82\x2c\x9a\xd3\xf6\x39\x83\x1e\xb2\x31\xaf\x66\x1e\x8f\x76\x9f\xcb\xac\xc8\x4c\x01\xef\xdc\xc6\x25\x6d\xc9\xb3\xd2\xf7\xdd\x4b\x3e\xeb\xba\x6d\x4f\xcf\xc9\xe7\x87\x77\x5f\x90\x66\xe7\x3f\xd7\x6c\xf0\x15\xa5\xa9\x04\x06\x3d\x27\x2d\xa1\x60\x98\xeb\xbc\x9d\x45\x41\xf6\x9a\x5b\xee\xc4\x13\x12\x4a\x29\xc5\x0e\x05\x99\x4d\xee\x66\x0c\x7a\x42\x01\xa3\xb5\xab\x19\x38\x30\x6c\x31\xdd\x38\x88\x09\x65\x4b\xc4\xc8\x24\x57\x42\x72\x2d\x09\xb1\x5c\x72\xa1\xb8\x64\x06\xd6\xf3\xc8\x18\xe2\x0c\x12\x4e\x18\xcd\x8a\x4c\x3d\xd3\xa2\x4a\x79\xe1\xbf\x95\xaa\x9d\xb7\xbb\xc8\xcb\x94\xf6\xed\x39\x2f\x97\xf2\x74\x1f\x3e\x9d\x03\x3b\x50\x51\x64\x31\xc9\x33\xcb\xa5\x92\x11\xe7\x72\xdf\xf7\x25\x28\xe3\x9e\x8e\x3a\xd0\xdd\xb1\xea\xfb\xfd\xc6\x68\x47\xbd\x26\xb4\x15\x42\x1d\xfd\xd1\x5b\x15\xa2\x1f\x4c\x03\x60\x50\xd6\x1f\xb3\xcb\xef\x47\x97\xdf\xff\xeb\x3f\xfc\xfb\x1f\x92\x74\xe0\x03\x40\x14\x39\x74\xfe\xf5\x5a\xc5\x2a\x0f\xd3\x7e\x5f\x81\x2a\xee\xf9\x4e\x77\xf4\x08\xca\x6a\xb7\x7b\xce\xbe\x6a\xc0\xc1\x3b\x15\xa2\xdb\xa6\x06\x1c\xfd\x21\xf9\xea\xe4\x3e\x61\x8e\x6f\x9c\x8e\xae\xbe\x3a\x5f\xdd\xc2\x97\x5b\xf6\xe6\x26\x2e\xbe\x7d\x1d\x41\x83\x68\xc3\x31\xb0\x02\x37\x08\x83\x6e\xae\xf3\x7e\x66\x05\xf9\x5d\x59\xa0\x04\xfe\x42\xd2\x69\x63\xdc\xaa\xa2\x28\x20\x92\x1b\xc3\x3c\x55\xa7\x03\xad\x9b\x9a\x5e\xc4\x2f\x05\x27\x14\x3b\x6e\xb8\x5b\x5e\x22\xe7\x9a\x69\xc6\xcf\x88\x20\x26\x38\xe7\x8c\x31\xcc\x53\x6e\x35\x0b\xcf\xf8\xae\xcd\xb7\x17\x1e\x71\x76\x45\xf8\xa5\x44\x79\x22\x98\x6d\x56\x77\xef\xbf\x7b\xf3\x78\xf7\x77\xc0\x17\x4f\xd3\x24\x70\x56\xec\x9b\xaa\xce\xb7\x44\x3b\x8e\x62\x3f\x80\x81\x47\x3e\x88\xe7\x6c\x14\x79\x09\x2d\xad\x19\xd2\xdd\xbc\xed\xbc\x76\x0d\x68\xeb\x7d\x3c\x42\x80\xf2\x2d\xc2\xd8\x38\x2b\xb8\xa0\xd1\xa3\x86\x02\xd2\xf4\xd8\x69\xe0\x05\x24\xc8\xf8\xc0\x95\xd1\xfc\x39\xf3\x5e\x36\x32\xcb\xb2\xbf\x55\xc8\x14\x6b\xfe\x97\xe4\x06\x7c\x78\xc5\x0d\x68\x92\x3f\x39\xa8\x4f\x74\x39\x2d\xef\x67\x71\x79\x73\xea\x56\xd9\x29\xc3\x85\x3f\xe9\xe4\xfa\x6e\x10\xdc\x21\x18\x2a\x02\xe0\xd3\x08\xca\x1a\x6d\x92\xc7\xdb\xec\xc0\x45\x50\xf5\x72\x6a\x8c\x8c\xde\x9a\xb8\x17\x92\x5a\x4c\xc4\x99\x1a\x90\xad\x13\x6f\xdc\x5c\x3c\x56\xcf\x98\x8b\x9f\xf7\x58\xfd\xfe\x95\x94\xdb\x87\x4f\x57\xab\xdc\xfb\x87\x3b\x13\x4e\xfb\x00\x76\x10\x05\x02\xa3\x70\x88\x04\x88\xc4\x16\x54\xb9\x8f\x53\x55\x83\xca\xc7\xad\xdf\xd6\xd5\xd4\x5c\xbd\x94\xd7\xdb\x78\xb4\x3d\x60\xc9\x2c\xf6\x88\x9c\x7b\xea\x8a\x9a\x92\xe4\xb3\x2a\xc4\xd9\x68\x55\x88\xab\xd3\xea\xa6\x40\x69\x4f\x43\x2f\x38\xbd\x33\x9f\x32\xf1\x51\xdf\xfe\xd8\xb5\x3a\x35\xfe\x63\xea\xdb\xe2\x8b\xef\x69\x3a\x17\xaa\xd0\x31\x39\x74\x61\xd3\x89\xda\x22\x7f\x18\x75\x3c\x78\xd0\xc6\x10\x72\x3e\x77\x2c\x2d\x94\x1d\x40\x33\xba\xbe\xdb\xd0\x48\xdd\x5c\xee\x61\xcd\x1c\xde\x2a\x26\x27\x59\x88\x65\xdd\xcb\xba\xae\x8b\x75\xd7\x75\xd9\x2a\xf9\x53\x9a\x8d\xc9\xde\x65\xbf\x4a\xaa\xd3\x19\xf8\x92\xc9\x7c\x95\xed\x5c\x5f\xb8\xbb\xeb\x77\x79\xb6\x7e\xff\x5d\xf6\x6e\x75\x56\x89\x07\x63\xd2\x9d\x64\xa0\x6f\xc0\x70\x96\xee\xca\xb3\x27\x5f\x0c\x61\xde\x05\xa0\x03\x8a\x7d\xec\x09\x40\xa0\xda\x81\x6c\x54\xfb\x63\xb1\x37\x4e\xbb\xa6\x71\xda\x19\x27\xe7\x00\xf6\xb1\xca\xcd\xae\x8c\xdb\xd8\x31\x4f\x40\xad\x95\xb3\x41\x65\xeb\xa4\x81\xd5\x6c\x74\xaa\xff\x5c\xd5\xc5\x6e\x50\xb3\x67\x38\xf0\x8d\xf5\xd1\x35\x41\xfb\x95\x61\xf4\x17\xd0\xfd\xca\x84\xaa\x06\x07\xe9\x3b\x50\xb1\x38\x0e\xbb\x65\x2d\xad\xba\x9e\x32\xb9\x53\xca\x58\x1e\x4d\x1c\x40\x1b\x40\x88\x8a\x2b\x46\x21\x63\x24\x8a\xde\x7a\xaf\xdb\x7c\x08\xc2\x0a\xbf\xd1\x88\x60\xbb\x77\x92\x04\x66\x3d\xb5\x54\xf7\x8c\xa8\x91\x1a\xa1\x9b\xb9\xf4\xde\x45\x6a\x44\x1d\x6a\x01\x1a\xc9\xe2\x14\x54\x3f\x6c\x47\x3e\x6e\xb3\x6c\x55\x88\x94\x53\xa4\x3f\xa7\x67\x7e\x55\x92\x3c\xab\x4c\x16\xbb\x82\x9d\xfa\x90\xd7\xf3\x61\x39\x86\xa2\x8d\x7a\xe9\xe0\x90\xc8\x97\x76\x43\x67\x0c\x9a\x36\x92\x26\x32\x3f\x26\xea\x6c\x18\xb3\xbc\xa0\x29\x1e\xd3\x5f\xf9\x8d\xde\xe2\xb7\x92\xdf\xe8\xe3\x7b\x08\x1e\x3f\x3e\xdc\xbd\x72\x1c\xfd\xfc\xf0\xb6\x02\xef\xbf\xbb\xbf\xcb\x58\x3b\x82\x26\x1e\xcc\x4e\xef\x7c\x08\x7b\xd9\xbb\x65\x48\xb5\x3d\x06\x5d\x3c\x86\xa2\xa2\x20\xab\x8d\x97\x1e\x76\x92\x90\x2a\x1e\x68\x1c\xe3\xc1\x82\x72\xa3\x1d\xac\x47\xef\xad\x6d\xb6\xb1\x07\x6c\xe7\xac\x6a\xfd\xb6\xf2\x4f\x47\x77\x8c\xb2\x87\x2d\x96\xe3\x44\xa2\x7e\xce\xd4\x1e\xb0\x2c\xcf\x77\xcf\x38\xdd\xe3\x3f\x4f\x1c\xae\xaf\xdb\x7b\x05\xef\xaf\xdf\xc3\x25\x4c\xbc\x7b\x25\xe0\xf1\xf9\x71\xd9\xe2\x7d\xb7\xd9\x89\x7e\x04\xbb\xe8\xda\xa3\x98\xda\xa6\x79\xce\xd4\xa1\x8f\x5b\xd0\xc6\x06\x83\x6e\xd7\xe6\x07\x72\x84\x26\x50\x81\x0c\x23\xa4\x9a\xc8\x54\x1e\x3b\x09\xe4\x46\x07\x58\x0d\x6e\x2b\x5a\x3b\x2d\xcf\xf6\xce\x3a\xd5\xb9\x7e\x69\xab\x9f\xa2\xee\xab\x16\x8a\x61\x8a\x63\xf4\xc4\xeb\x34\xe7\x8c\xcf\xf8\xae\xdb\xe0\xcb\xac\xf9\x4f\xae\xfa\x1a\x6f\x53\x44\xfe\x65\x44\x5e\xd0\xd1\x67\xfc\x60\x7a\x7e\x97\x39\xf4\xd3\x6f\xc0\x3f\x04\x6f\xbf\xbd\x7b\xf8\x58\x88\x15\x8a\x18\x84\x28\x6a\xb2\x03\x8e\x45\x73\x08\x71\xcb\x41\x6d\xbd\xd2\xc2\xe3\x2a\x6a\xd0\x44\xba\x4d\x28\x80\x30\xcd\x7a\x2a\x97\x37\x25\xc8\x36\xd8\x77\xa7\xa9\x37\x86\x36\xdc\x6e\x69\x20\x6e\xd9\xb4\x4b\xe1\x8a\xb2\x8b\x55\xdf\xf7\xb1\x44\x48\x29\x84\xfa\xb4\x2f\x95\xcf\xec\x8e\x6c\x6c\xf2\xfa\x7c\x97\x1e\x9b\x17\x95\xb1\xf3\xf1\xe9\xf3\x43\x5a\x8a\x56\xbd\xa7\x60\xa7\x0c\x20\x61\xd9\x4a\xce\x65\x3e\x9d\x06\x70\xf0\x2c\x36\x8a\x71\xb5\xdf\x58\x1c\xec\xd4\x3e\x75\xca\x83\xda\x83\x3a\x0c\x63\x2f\xb8\x3a\x26\x0d\xf2\x63\x11\x36\x26\x3d\xa3\x19\x78\x97\xad\xcf\x20\xe8\x57\x22\x79\x6f\xde\x25\xaa\x7b\x16\x9e\xb3\x78\x98\x06\x14\x87\x68\xf0\xd8\xb7\x2d\xda\xbb\x60\x86\xc6\xf0\x6d\x1d\xfb\xa8\x28\xe8\xd6\x84\x44\x3c\x61\x62\x15\x71\x2d\xc8\x60\x15\xf6\xc0\xe2\xd8\xef\xcb\xca\x9c\x9c\x57\xfc\xec\x73\x59\xe4\xfb\xa4\x51\x6b\x92\x1b\xde\x7f\xbc\xf1\x08\x7b\xf8\xf5\x59\xfe\xfc\x97\x6f\xce\xc8\xa7\x0f\x9f\x7f\x03\xde\xe5\x8f\xff\xe0\xc5\x07\xf8\x26\x63\xf6\xf8\xf6\x82\xd8\x3e\xc7\x50\x2f\xc7\xc3\xc7\x47\xb0\x6c\x87\xcf\xb0\x00\x7c\x0c\xd3\x04\x48\x15\x4a\x50\xc7\x63\x59\x63\xe4\x98\x86\xb0\xf4\xb5\x91\x94\x4b\xe1\x38\xad\x77\x6d\xdb\xb6\x7d\x2f\x78\x15\x87\x68\xc9\x7e\xbb\xed\xba\xae\x1b\x00\x3a\x82\x9a\xb1\x7c\x2b\x89\xc5\x72\xdd\x6f\xb7\x2e\xec\x40\x19\xa1\xdb\xc7\xa1\x19\x71\x74\x87\x5d\xc9\x14\x8c\xfd\xde\x28\xe3\x1b\xc0\xc1\xd0\x18\x63\xb4\x31\x55\x6d\x24\xf3\xc8\x99\x60\xac\x69\x5c\x78\xe2\x55\x61\xf3\xda\x78\xe6\xec\x79\x3f\x2f\xf3\xed\x46\x26\xce\xf0\x79\xde\xbe\xca\x14\xde\xfa\xa9\x5f\x6f\xc0\x59\xc2\xe4\x12\x27\xbd\xbd\xfb\xcb\xf7\x79\xed\xdb\xc1\x48\xa8\x31\x32\x75\x3f\x22\xa3\xb5\xae\x83\xf4\xd2\x73\xca\x3c\x81\x06\xd2\xd8\xdb\x8a\x1a\x02\x30\xf6\x70\xed\x70\xac\xe2\x01\xe1\x96\x0c\x13\x09\x82\xd8\x76\x82\x95\xdd\x03\x83\x62\x3b\x96\x55\x73\x6a\xdb\x01\x0d\x2d\x9c\x46\xba\xdb\x6e\xc7\x6a\xdf\x65\xab\x55\x9d\xe6\x6f\x93\xfd\xd3\x8c\x64\xbf\x4d\xcc\x88\x17\x3f\xde\x2f\xbe\x3b\xdf\xde\x5d\x45\xad\xae\x6e\xc8\x9f\x6f\x8c\x78\x3e\xbc\x59\x96\xeb\x5f\xde\xba\xc0\xaf\xa9\x63\x7e\xef\x20\x5c\x66\x18\x1c\x87\x12\x98\x38\xe8\x91\x3e\x67\x46\xc5\xa3\x00\x19\x8d\x3b\xc0\xab\xb8\x07\x30\x0e\x5d\x0d\xed\x51\x19\x54\x4f\x10\x38\x47\xa8\xa6\x73\xcf\x91\xc2\x6c\x63\xce\x38\x5d\x27\x98\x73\x16\x21\xe2\x76\x34\x08\x90\x1d\xb5\x33\xbd\x73\xd6\x39\xce\x5d\xdc\x71\xce\x72\x82\x1b\x43\x9d\x31\x8e\x3a\x93\x65\xd9\x9f\xe4\xdb\x67\xf2\xc2\xcb\xfb\x12\x47\xfd\x55\xca\x53\xfe\x11\x31\xd4\x9b\x1b\xd9\xe0\x73\x92\xf6\xf1\x52\xe9\xbf\x66\x6f\x97\xf9\xa3\xa0\x00\x7b\xef\x01\x79\x3a\xf8\xa6\x59\xde\xb7\x73\x79\x79\xb3\x3d\xd1\x42\x9d\x42\x31\xce\x6c\x80\x8d\xa7\xbe\xd4\xde\x14\x83\x95\x46\x06\x15\xbd\x74\x35\x53\x9b\x52\x6b\xad\xe7\x1e\xc8\xe5\xac\x63\x7b\x3e\x6d\x2d\x37\xd2\xc6\x40\x35\x45\x0c\xf4\x71\xb7\xe3\x20\x03\x10\xf4\x73\x43\x25\x65\xd8\x78\x40\x20\x67\xe4\xec\xd9\x49\xee\xcc\x86\x64\xef\x33\x92\xfd\x9b\xec\xaf\x97\x4f\x77\x99\xda\x12\x00\xe4\x12\xdb\x3e\xde\x56\xb1\xce\x33\x36\xf8\x3a\xeb\xb8\x5e\x46\xe5\xfd\xc3\xfd\x55\xc1\xed\xac\x6d\xf6\x58\x30\xd0\xb6\x5c\x4b\xab\x67\x51\x18\xdb\x02\xc3\xb4\xe6\xf8\xc8\x0d\x41\x35\xa1\xb8\x8b\xa3\xdc\x0d\xb1\x59\x21\x63\x30\x87\x8a\x88\x19\x86\xbc\x91\x52\x96\xb1\x2e\x2b\x66\x88\x81\x14\x10\x42\x9b\xdd\x6e\x9d\x31\x89\x09\x61\x46\x6b\x61\x1b\x2b\xa4\xea\x04\xaf\x5c\x45\x4c\xd0\x96\xe8\xe8\x4f\x23\x17\xcb\xd6\x2c\x37\xa7\x6d\x31\x36\xd2\x8a\x32\xee\x00\x2a\x4b\xa9\x0c\x5b\xfe\x8b\x2a\x9c\xeb\xbe\xe6\x99\xdd\xd1\xbc\x7b\x99\xe3\xdf\xad\xd6\xdf\x5f\x4a\x35\xeb\xcb\x87\xbd\xd8\xd3\xa4\xa7\xec\xbb\xe5\x13\x7d\xf7\xf9\x9f\x82\x2f\xc6\x04\x9f\xd6\xb8\x89\xdb\x28\xf3\xc1\xb9\x63\x92\xed\x40\x4c\x6b\x09\x77\x38\xee\xe2\x80\xf6\x63\xb7\xad\x01\x1d\x83\xdb\x82\x4c\x62\x50\x1f\xb7\x7a\x38\xcc\x52\x1e\xe2\x9e\x4d\xb9\xa2\x8d\x45\x82\x87\x96\x53\x0c\x9d\x16\xa5\xe7\xb2\x2e\x2d\xe1\x55\xa9\x85\x43\x92\x95\x55\x34\x4c\x38\xc5\xb4\x15\xc4\xa3\x2c\xbb\x2b\x68\xca\x7f\x9e\x3d\x04\xce\xdc\xc8\x7f\x91\xfd\xab\x2f\x4a\x46\x57\xbe\xc7\xe6\xee\x05\x8e\xf9\xfe\xf3\xbb\x5b\x21\xa3\xa4\x42\xfe\xf6\x96\x19\x78\xe6\x23\x81\x4f\x9f\x1f\xee\x7e\x59\x70\x50\x61\xd4\x41\x94\xe3\x53\xe6\xf3\xfd\x0c\x73\xac\x28\x6b\xa5\x94\x8d\x65\x4a\x37\x6c\x3f\xf4\x41\x85\x2e\x6a\xad\x83\x6c\x76\x0d\x44\x60\x10\xae\x3d\xea\x69\x3b\xc6\x3d\x3d\xb4\x4a\x10\xa2\x40\x06\xb0\xa3\xd1\x20\xb5\x3e\x32\x86\x31\x9e\xa5\x05\x4d\xc9\x09\x96\x8a\x12\x81\x14\xa4\x54\xc9\xc8\x85\xb2\x56\x48\xee\xb8\xe6\x04\x32\xe2\x3a\xcd\x88\x67\xca\x90\x06\x32\x26\x30\x34\x21\x1e\xb9\x43\x2a\xf9\x0f\xab\x67\x59\x4c\x37\xb5\xa5\x7f\xf6\xf3\xb5\xa4\x5f\x81\xbb\x97\x47\x2f\x39\x84\xae\xd6\xef\xef\x3f\xdc\x27\xfe\xd2\xc3\xc7\xc4\x3b\x2b\x1a\x16\x9b\x58\x61\x10\x80\x76\x5c\x38\x1d\x8f\x14\x5b\xc4\x5a\x86\x2d\xe2\xbd\x83\xe0\x18\x0f\x40\xc4\xb6\xf3\x3e\x8e\xf1\xc8\x42\x15\x62\x00\xca\x61\x6a\xfc\x46\x5b\x53\x07\x87\x47\xcf\x1a\xa3\x0c\x35\x1a\x4a\xc5\xb5\x1c\x91\x70\x3b\x1f\x1b\xbc\x8b\xb5\x65\x88\x03\x17\xbb\xaa\x06\xd6\xef\x04\x93\x21\xc5\xba\x67\x1d\xc9\xdf\xa3\x11\xff\xf6\xe7\x55\x57\x3e\xbd\xd2\x88\xd7\x49\x90\xa9\x0a\xa7\xd2\xfb\xaa\x06\x35\x44\x96\x12\xc0\xe2\x39\x15\xbd\x1c\xf6\xb4\x0b\xd4\x76\xa0\x7f\xb1\xb3\x3a\x6e\xaa\xab\xec\x0a\xc4\x8c\x56\x2f\xc2\x2b\xae\xf5\xaa\x60\x52\x1c\xd9\x59\x77\x65\x4c\xda\x24\xab\xfa\xe2\x6b\xff\x67\xd9\x9f\x27\x7d\x98\x9f\xf4\x83\x7f\xfb\xed\x32\xb1\xbd\xb9\x60\xda\xfe\x39\xb8\x7b\xfc\x07\x67\xe7\xce\x6f\xde\x7c\xf8\xf6\xee\x97\xef\x36\xce\x57\xc4\x48\xc5\x05\xe5\x6a\x88\x8d\xaf\x6a\x46\x14\x44\x92\xe8\x7e\xe7\x97\xf8\x87\x6b\x47\xf8\x78\x14\x14\x3a\x5b\xfa\x8a\xe8\x8d\x83\x63\xa7\xbc\x31\xc2\x19\x05\x18\x70\xc8\x3b\x26\x2c\xc1\x65\xf9\x9c\x49\x05\x44\x64\x71\xf2\x31\xd4\xad\x6b\xea\x03\x13\xa0\xca\xf1\xd8\xb6\x22\xcb\xf2\x55\xf9\x92\xab\x44\x3f\xce\xd4\x9f\x17\xa4\x97\x56\x7e\x69\xe4\x7a\xf0\xa9\x8f\xd0\x69\x27\x82\x2d\xd3\x17\xc2\x38\xc2\x77\x13\x87\xdc\xf9\xd2\x57\x58\x6f\x4c\x9c\x5c\x3c\x3a\x07\x8e\xb1\xda\x4f\x2e\xb6\x75\xe3\x9b\x7e\x59\x51\xf2\x6a\x1b\xbc\xca\xb2\xbb\xbc\xbf\x70\xff\xff\x3c\xfb\x75\xba\xcb\x34\x21\x67\xcf\xb1\x59\xc2\x47\xbc\xb9\x32\x73\x5f\x9e\x52\xf0\xee\x4a\x7e\x2c\x40\x5a\x08\x13\xef\xfb\x47\x5b\x9c\x34\xcc\xc1\x1d\x28\x06\x0f\x41\x79\x38\x0a\x80\x74\x53\x96\x18\x71\x08\x31\xe3\x35\x84\xb5\xec\x73\x5d\x01\xcd\x95\x6a\x58\x94\x1a\x64\x04\xb5\x75\xa4\x4b\x7b\x9f\xb3\x62\x8a\x9c\x19\xc9\xa0\x54\x30\x8a\xad\x0e\x03\xeb\xf3\x1e\x50\x15\xc7\x8d\x81\xc2\xa2\x58\xf7\xf6\x00\x64\x5d\x21\x24\x51\x4d\x99\x44\x35\x84\x6a\x07\x32\x62\xbb\xe0\x94\x9b\x72\x19\x3b\x21\x65\xa4\xce\xfb\xc8\xb5\xa8\x1b\xc8\x40\x10\x62\xd4\x46\x77\x71\x6f\x40\xc2\xd0\xdf\x15\xe2\x99\xa4\x1c\xc4\x9b\x57\x35\xbe\x17\x27\xa0\xbb\x87\x0b\x54\xe2\xe1\xf3\x03\x38\xbb\x71\x5f\x07\xfa\xdd\xcd\x64\x55\x48\xb0\xaf\x9b\x1a\xb4\x91\xd6\xc0\xca\xa7\x03\x07\xac\x8e\xa4\xc0\x67\x49\xc8\xf3\x21\xda\x96\xb7\x5d\xdc\x99\x66\x2f\xb6\xeb\xa3\xaf\x8d\xb3\x27\xe6\x5c\xd1\xdb\x68\x97\x28\x4b\x1f\x96\xc6\x51\xeb\x02\xd5\xd2\x09\xcb\xb2\x55\xd2\xb4\xee\x37\x2c\xe9\x09\xfd\xf7\xa9\x2a\xfd\x65\xc1\xbb\x21\x4d\x17\xd7\xab\xdf\xde\x18\xf1\x7e\x4e\x99\xa7\xdb\xeb\xd7\xcb\xd7\x9d\xe9\x75\x63\x93\x34\x4d\x1f\x56\xf5\xd0\x5a\x3e\xb3\xc2\x48\xeb\x0d\x6f\xfa\x31\x4e\xac\xf7\x3b\x65\x24\x46\xb1\x05\x07\x8e\x08\xe6\x98\x6a\x47\x15\x63\x3c\x57\x5a\x92\xcb\x75\xbe\xcc\xbd\x96\x0a\x4a\xf9\x3c\x82\x6e\xd9\x7a\x77\xdb\x9d\x38\x8c\x4d\x88\x47\xb9\xf7\xf1\xb0\x6e\x11\x21\xdc\x48\xc7\x09\x31\x9c\x0a\xe4\x2b\x44\x23\x42\x88\x32\x23\xcb\x86\xd4\x50\x23\x28\x90\x81\x18\xd6\x1a\x61\xca\xd3\x55\x84\x95\xe4\xc8\x56\x18\xd6\x31\x68\xed\x1a\xe9\xed\x3e\x6a\xd0\x3f\x67\xde\xea\xf6\xac\x97\x87\x53\x5c\x60\xb2\xb7\xd9\x3f\xcc\xfe\xbb\xa4\xe1\xfa\x4a\x01\xef\xf3\xa7\xfb\x94\x4e\x5e\xbf\xfb\xf6\xee\xc3\x72\x2b\xcf\xd6\xde\xf7\x1f\xde\x7e\xf8\x54\xfc\xe4\xbf\x7c\xf7\xe1\xc7\xff\x72\x45\x43\x55\xe7\x83\x6e\x88\x80\x86\xd0\x1a\xce\x86\x1b\xd9\x81\xcc\xd6\xde\xc5\x5e\xc6\x49\x6d\x55\xe7\x34\xac\x2d\x84\xb9\x36\x3d\x55\xd0\x13\x51\xa3\x79\x59\x38\x86\xde\x56\xce\xc5\x91\xc6\xbd\x3c\x90\xd1\xd9\x7a\x63\x20\x82\x73\x73\xa8\x5d\xcd\x0d\xd0\x4a\x68\xab\x6b\x2d\x5d\x9c\x7a\xa3\xb8\x01\x99\x55\x91\x52\x58\xcf\xed\x31\xe1\xc8\x80\x22\xd8\xb2\x60\xa5\x8f\xc7\x51\x5b\xae\x41\x66\x13\xfe\x7b\xb5\x6a\x9f\x79\x7a\x8e\x8b\x54\xa9\xff\x65\x9a\x4b\x1e\xcf\xf8\xba\xef\xdf\xe5\xc5\x32\x01\xe6\xd9\xb2\x33\x2d\xbd\x07\x48\x20\x87\x58\x0c\x96\x50\xcb\xc1\xce\xda\xb8\x3b\x30\x10\x36\xe6\xa9\x2f\x78\x3c\xc4\x0e\x03\x01\xea\x1a\x47\x1b\x27\x06\x48\xf4\x34\xf6\x31\x38\xb7\x4f\xb1\xc8\x0b\x0e\xe9\xef\xbd\xe0\xaf\x3f\x9d\xfd\x7d\x3e\x5f\x3c\x75\x7e\x05\xbe\xd8\xcc\xbd\xb9\xf8\x5e\x9f\x7b\xf5\x9b\xf3\x40\x5c\x71\xd5\x06\x32\x23\x30\x40\xd8\x60\x08\xba\x96\xb4\xdb\x11\xc5\x61\xec\x27\x36\x06\x6d\x51\x00\xdb\x10\x22\xc2\xad\xd6\xc2\x83\x21\xd2\x35\xf5\x52\x7b\x9f\xca\xfa\xbe\x77\xa4\x6a\x2a\xa5\xb0\x43\x94\x6c\x63\xa9\xf5\x89\x03\x73\xb4\x4e\x80\xb2\xea\x09\x3d\xd7\x9f\xd1\x8b\xae\xdc\x79\x0d\xfe\x27\x5f\xd6\xe0\xfc\xab\x35\x18\x9c\x11\x89\x09\xbb\xf9\xc5\xa3\x62\x73\xe4\xd1\xcf\x07\x0c\x3a\xe0\x1a\xe5\x7c\x88\x7b\x46\x1c\xe6\x3b\xc5\x3c\x95\x39\x0e\x61\x12\x00\x99\xd8\x03\x1f\x40\x1f\xdb\x06\x64\x62\xda\x98\xc0\x6b\xef\x48\x3c\xf6\x7c\xd7\xda\x40\xbd\xab\x7c\xcb\xda\x30\x57\x33\xcf\x45\xec\x5b\x3f\x02\x9e\x04\xb6\x9a\xa6\xed\x13\x4e\x9c\xdd\xa9\x0d\xc9\xfe\x22\x21\xc5\xbf\xe6\x08\xa6\x8a\xcc\xe5\xf5\xf1\xfe\xcd\x39\x78\xfa\x70\x05\x5c\xdf\x29\x21\x85\x46\x81\xa3\xb8\x17\x76\x1e\x8d\x8c\x63\x08\xc0\x52\x1c\x30\xe9\x66\xbc\x25\xc8\x20\xb2\x21\xbf\x1b\xa5\xac\x7d\xc5\x0b\x3b\xb7\x60\x3f\xb7\xb9\x88\x30\x17\x4f\x61\x73\x8c\x59\x52\x4e\x02\x9a\x48\x4d\x94\xcc\x56\x85\x4e\xf9\x37\x92\x55\xd9\xff\x2f\x55\xd0\xbe\x6e\xd1\xe3\x7d\x32\x1b\x7c\xbb\xec\xd6\xdf\x5f\xd1\xea\x1f\x2e\x40\x81\x84\x40\xbb\x33\x4a\x32\x89\x1c\x23\x73\xed\x73\x1f\x08\xb1\x73\x03\x18\x9d\x28\x72\x90\x80\x92\xc0\x43\xe4\xc0\xce\x13\x03\x59\x0d\x37\x24\x21\x85\x9b\x9a\xaf\xd5\xef\xc2\x66\x1a\x50\x6b\x9d\x6b\x82\x32\xd4\xaa\x28\x84\x74\xf1\xe0\x40\xe3\x92\x75\x64\x56\x5c\xf2\x49\xee\xe2\xb4\xbe\xec\x00\xde\x2c\x13\x75\xf1\xca\x81\x2a\x2f\xbe\xc2\x29\x7d\x97\xe2\x29\x70\xf7\xf0\xf9\x22\x41\x9e\xc5\x8c\x34\xbe\xce\x71\x07\x70\xd4\x88\x0a\x62\x85\x91\x8d\x3e\x2e\xd3\x2e\x83\x8c\xf3\x6d\xcb\x40\xd6\x45\x98\xdb\x78\x20\x60\xa0\xb3\xd5\x5c\x09\xbd\x92\x06\x74\x84\xf9\xc8\x7d\xe7\xb4\x16\xad\xee\xbc\x07\x25\x68\xe6\xdd\x32\x61\x95\x72\x1b\x78\x30\x06\x78\x0f\x3a\xef\x67\x25\x95\xb6\x32\x03\xf9\xf0\xcc\xd7\x75\xca\x4b\x5c\x76\x9d\x6f\x1f\xef\x6f\xd2\x60\xdf\xbc\x79\x2c\xb2\x2e\x74\x9d\x11\x0a\x93\x40\x98\x6a\x58\xb7\x2e\x81\x8e\x3e\x3c\x67\x6d\xe3\xad\x3a\x8d\x85\x1c\x5a\x07\x30\x30\x59\x51\xf0\xc4\xf9\x80\xa9\x2a\xf1\x31\xe5\x7d\xae\x45\xd8\x0b\x38\xfb\x2b\xfa\xc3\xe7\xfb\xab\x50\xe8\x7f\xfd\xc5\xf3\xa3\x38\x16\xa5\x6f\x25\x53\x26\x34\x46\x0a\xc9\x19\xa5\x35\xa6\xc4\x69\xb6\xb5\xde\xcc\x9d\x52\x5c\x08\xd5\xfa\xa2\xf2\xfe\x24\x37\x30\x04\xd7\x53\x65\x35\x67\xce\x39\xa7\xe3\x9e\xb2\xda\xd5\x10\xc0\x4e\x7a\xdf\x80\xce\xe8\x38\x0a\xa3\xad\x10\x4f\xd3\xaa\xfc\x61\x32\x29\x37\x72\xb8\xe8\x11\x7c\xca\xfe\x59\xf6\xdb\xf3\xec\xfc\xf7\x93\x2c\xd8\xeb\x3f\x2f\x76\x71\x6f\x1f\xef\x2f\x48\xfe\x25\xf8\x81\xdf\xbd\xbf\x4b\xa1\xc7\xdb\x0f\x1f\x8b\xe5\xd8\xfb\xaa\xa6\xb6\x4c\xee\xf5\xcb\x9e\x39\x00\x15\x19\xe8\x93\x3a\x01\x70\x4a\x45\x03\x7c\xd4\x76\x68\xb1\x89\x43\xdc\x4a\x86\xb8\x1e\xc1\x71\x9a\x26\x30\x42\x29\x84\x04\x3b\xe7\x5d\x70\x7e\xf9\x0c\x3e\xee\x5d\x3c\xb4\x6e\x07\xbd\xb5\x96\x4a\x7d\x28\xfa\x10\xe2\xde\xfb\x33\x96\xa2\x7c\xe6\x6b\xfc\xfa\xbe\xbd\xfd\xea\xbe\xd1\xce\x87\xa0\x18\xc7\xd8\x53\xaa\x5a\xda\xad\x26\x60\xa3\xf5\xfb\x10\x8c\x91\xa7\x50\xe0\xd1\x2a\x40\x40\xc8\xb2\x3f\xbb\xf0\x94\x6c\x72\xc0\xfc\x7b\xd9\xc3\xc5\xb9\xf8\x3f\x64\xff\x5b\xf6\x7f\x64\xff\x57\xf6\xff\xfc\x34\x6f\x6d\xfd\x37\x63\xc8\xbe\xfd\x8a\x21\xfb\x78\xa1\xc8\xbf\xfd\xf0\xf1\xee\x22\x91\xef\x81\xf4\xd3\xe4\x63\xe3\x0f\x07\x90\xa5\x79\x7e\xbf\xdf\x17\x23\x65\x98\xd5\xbc\x46\xd1\x26\x2d\xe5\x79\x07\xc8\x99\x2e\x5b\xc7\x83\x97\x8c\x49\xcb\xbd\x68\xe9\x16\x54\x71\x68\x42\xe0\xb0\x62\x15\x04\x55\x23\x58\x0d\x19\xdc\x58\x29\x96\xe7\x88\x52\x7b\x88\xe8\xe9\xb0\x3e\x6e\x45\x9c\x04\xa8\x7f\x08\x94\x55\xa6\x82\x85\x05\xbb\x74\x49\xec\x38\x57\x2c\x6a\x48\xb8\x62\x64\x07\x2a\xa7\xa4\x36\xc0\xb3\xe8\x07\x48\x18\x64\x84\x0e\x03\xac\x39\x46\xf8\x7c\x3f\x68\x9a\xd7\xd9\x4f\x30\x2f\x6f\xe1\x66\x8f\x17\xb5\x80\x04\x2f\xba\xe3\x33\xcb\xf5\xec\x73\x35\x87\x22\x8b\x0c\x51\x25\xb4\xd1\xaa\xe3\x51\xdb\x6d\xeb\xea\xf6\x48\xfb\xed\x86\x79\xe7\x82\x6b\xbc\xb3\xdc\x18\xcb\x82\xf2\x87\x1c\xcd\x9e\x52\xc7\x39\xcb\x47\x5f\xc8\x2c\x03\xa0\x2c\xd0\x5d\x95\xea\x13\xe7\xfd\x50\x8a\x0f\xaf\xbb\xa2\xf3\x2b\x28\x9b\xbc\x9e\x5d\x03\x76\x0d\x18\x9a\x39\xe4\x55\xf3\xbb\x69\x25\x02\x28\x81\xd8\x2e\x1d\x38\xc6\x10\xa7\x2e\xf6\xe7\xbd\x3d\xbf\x73\xab\x90\xfd\xe2\xaa\xda\xfd\x35\x96\xe4\xeb\x12\xc2\xa7\x8f\x57\xc8\x25\x28\xf3\xae\xc9\xfd\xac\x0b\x3c\x1d\x0b\x3a\x73\xb2\x0a\xa9\x2e\x64\xc6\xe0\xea\xd0\x08\xfe\xa4\x00\x32\xd6\x29\xbf\xc2\x4a\xf9\xe0\x7d\x88\x44\x6b\x1f\x47\x2d\x60\x83\x10\x04\x35\x94\x56\x19\x9d\x15\xd9\xe1\x59\xde\xf9\x55\xf5\x82\x8d\xb9\xcc\xe8\x57\x37\xb2\x3b\xf2\x03\xdf\x94\xbf\x13\x60\x57\xb8\x93\x69\x72\x36\xf7\xab\x2a\x9c\x6c\x58\x75\xb1\x9f\x0f\xe1\x90\x65\x79\x96\xb4\xb1\x57\xd9\x55\xd9\xee\xba\x28\xdc\xbf\x78\x80\xdc\x3f\x80\xfb\x87\x7b\x50\x6e\x60\x6c\x40\x17\x79\x33\x37\x34\x2a\x05\x04\x8d\x0a\x74\x71\x5c\xc1\xb9\x5b\x65\x21\xf6\x61\xde\xe6\x34\xea\xce\x06\x80\xce\x46\x55\x2c\xa6\x1c\x72\xd6\x3e\xbb\x3b\x5d\x1c\x53\x1b\xd3\xde\xf3\xbc\x6b\x5a\x16\x9e\x15\x21\x75\x7e\xf8\x61\xbf\xda\xfd\xe0\xe2\x54\xc0\x1a\x17\x47\xa5\xc2\x1c\x42\x91\x05\xce\xcf\xbc\x6b\xfb\x4c\xee\x6c\x31\x2c\xff\xff\x9b\x9b\x16\x2e\x6d\x3b\x6c\xc8\x8c\x0a\x72\x1a\x9a\xd3\xae\x40\x33\x2d\x86\x10\xc7\x30\x8f\x39\x0e\xcb\x6e\x01\x64\xfe\x59\xdc\xe1\xe2\x78\x76\x27\xfa\xf4\xf1\xdd\xb7\x5f\x39\x9d\x64\xe9\x63\x1e\x73\x53\xb5\x65\x51\xc3\xbe\xb7\x2d\xec\x8c\xd6\xf5\xec\x48\x94\x71\xa7\x73\xe2\xe6\xa6\x40\x52\xd5\x92\xcf\x3a\x6e\xeb\xb6\x1a\x41\x1f\x87\xc8\x59\xe3\xf3\x14\xb7\x6c\x53\xbc\xef\xb2\x6f\xb2\x77\x2f\x7a\xc2\x0f\x2f\xc1\xd5\xc5\x47\xe3\x71\xfd\xe1\xf3\xe3\x2f\x8b\x73\x01\xec\x86\xdd\xf1\xf1\xfe\x31\xe5\xcf\x3f\x7f\xba\xf2\x38\x57\x14\x50\xe8\x61\x05\x98\xab\xeb\xc3\xc9\x8d\x55\xed\x00\xf3\x64\x82\xb6\xc9\x8f\x5b\x24\x51\x69\x2a\xde\x6a\x6a\x4b\x3b\xe8\x96\xd1\x0a\x8c\xa9\xa0\x83\xd7\xa3\x47\x5c\x59\x4f\x9d\xd3\x72\x1c\xd5\x29\x3d\x43\xf1\x40\x70\x07\x0f\x92\x72\xc0\x86\x41\x18\x2c\x79\x9e\xd9\xe8\x6d\xaa\x95\x3f\xd3\xe2\x90\xda\x5e\x5f\x3c\xd9\xb3\x37\x3f\xd5\xf6\x4f\x5f\x1a\x7f\x7d\x4c\x53\xb3\xaf\x8d\xf6\x80\x42\x87\xbe\x6e\x73\x0d\x27\x68\xda\xfc\xd0\x1a\x55\xfb\x8e\xd9\xd2\x59\x3d\xc1\x9f\x6e\x2e\x73\xd7\xf6\x4e\x94\x2e\xf3\x15\x30\xfb\x91\x6a\x95\xbb\x73\x5b\x57\x09\xff\xbb\xdd\xb8\xec\x4f\xb2\xbf\x9b\xdc\x0e\x6e\xfd\x2d\xaf\x75\xe4\x4b\x8b\x8b\x1f\xf7\xf2\x59\xe6\xf2\xd3\xc7\x84\x74\x5a\x61\x00\x11\xb6\x9c\x00\x76\x3a\x6c\x19\x6a\x30\x6a\x10\x1e\x4f\xbe\x87\xb8\xce\xb7\x01\x4b\x54\xba\x8a\xf7\x96\xba\xd2\x8d\xba\x67\xd4\x7a\xd0\x44\xb9\x1e\x31\x16\x5c\xb9\x5a\x2a\xa9\x90\x60\xce\x51\x12\x9b\x88\xa3\xa6\xa4\x43\x7b\x45\x05\xd8\x3e\x67\xcf\x99\x32\xd4\xa8\xd1\x6d\x2f\xb8\x39\xba\xca\x2e\xed\x4e\x55\xe6\x37\x3f\xdb\xee\x37\xaf\xbb\x78\x69\xf3\x6f\xc1\xf2\x18\x86\xd4\x5e\x46\x7f\xa2\xbd\xda\xe5\x5b\xef\x75\x1d\x46\xea\x4a\x15\xb4\x95\xd5\xcf\x35\xf5\x34\x2e\xfd\x1e\x1b\xc6\x9c\x16\x0c\xec\xe2\xf4\x9c\x29\xcd\xf6\x40\x6e\xb3\x55\x5a\xf3\xb7\xc9\xe3\xfe\x5c\xd1\x4f\x59\x85\x33\xbe\xef\x66\xf5\x5a\x9e\x18\x90\x12\x1e\x9f\x6e\x99\xc7\xab\x5d\x47\x40\x27\x94\x94\x52\x48\x0b\x5b\x0e\xe3\x36\x96\x14\x0c\x00\xcf\xdc\x1e\x90\xbe\x55\x99\xde\x38\xec\x4e\x07\xa5\x8d\x8c\x48\x4a\x14\x10\x07\x28\x1e\x0f\x7e\x0b\x4a\x57\x04\x11\x55\x17\x61\x1b\x71\x73\xf6\x30\xab\x2e\x1a\x76\x2f\xfa\xc7\x67\xf5\xa0\x8b\xfe\xf1\xa7\x8b\xfe\xf1\xb7\x2f\xfa\xc7\x9b\x17\xfd\xe3\x94\x8c\x5b\xed\x1b\x6b\xf7\x13\x61\xbe\xd3\x0d\x44\x31\x44\x8d\x46\xb8\xec\x0c\x55\xec\x2a\xb0\x8b\xc2\x02\xc6\x63\xdf\x88\x28\x44\xaa\xa5\x81\xae\x1e\x98\x50\x3e\x49\x1f\xdb\x0a\x29\x41\x77\x71\x62\x82\x91\xda\x87\xd8\x43\x4a\xbc\xd5\x21\x4e\xb2\x31\x00\x1d\x3b\xd7\xec\x83\x72\x9a\x1b\x7f\xe6\xf8\xbb\xa2\x4f\xb8\x82\x37\x17\x7d\xec\xab\x56\xc4\xc5\x33\x72\x19\x9d\x9f\x3e\x3f\xfc\xb2\x38\x52\x94\x0f\x71\xc4\x04\x1c\x7f\x57\x81\x03\xa6\x71\x9f\x0f\x10\x33\x30\x10\x38\x5b\xb2\xb1\x42\x79\x27\xbd\x37\xda\x73\x3a\x4f\x56\xe9\xf3\x7c\xc8\x9e\x59\xbe\xbb\xd4\xe4\xae\xb9\xe3\x9f\x08\x72\x3e\x7e\x00\x5a\x48\x02\xea\x23\x95\x6a\xb7\x33\x42\x12\xe2\x99\xd6\x1d\x1f\xa7\xb5\x82\xb5\xa7\xd6\x61\x14\xb7\x9e\x36\x61\x89\x55\x43\x81\xa6\xc1\x01\x04\x74\xfa\x1c\x7f\x3b\x69\x07\xf6\x1b\x9f\x90\xe4\x7f\xf7\x82\x3e\xb8\x7a\x74\xfd\x0f\x17\x85\xd9\x4b\x2d\xfd\xe1\x9c\x98\xff\x6e\xfd\xe9\xf3\xc3\xe6\x17\xe0\x2b\xe4\x01\x78\x95\x43\x3d\xdb\xd4\x27\xf9\x9f\xaf\xd0\x9c\x2b\xee\x6b\x08\x46\x88\x00\x7c\xda\xd5\x95\x00\x08\xf4\x08\x46\x4d\x48\x95\xb8\xeb\x5b\x40\xe6\xf2\xfa\xee\x34\x18\x21\x8d\xce\x93\xf5\x06\xea\x90\xab\xf3\x5e\x51\x47\xa4\x09\x57\x67\xd7\xe4\xee\xea\x11\x82\x86\xe0\xb9\x03\xbb\xaa\xb4\x6d\xc0\x84\xe0\x83\x10\x22\x8e\x52\xca\xe7\x8c\x79\x2e\xa5\x12\x1a\x1b\x01\x95\xae\x8c\xa8\x53\xb2\x75\x98\x2d\xa5\xb9\x3d\x88\xb8\x13\x59\xf6\x27\x45\xb8\xd4\x6b\x5e\xa3\x5e\x2e\xf5\xdb\x8f\x97\xcd\xd4\x79\xfd\xbf\xf2\x0c\xbe\x76\xef\xb8\xc5\x18\x15\x13\x10\x89\x25\x06\xfa\xa7\x69\xd9\x8a\xfa\x61\x00\x72\x98\x69\x42\x5d\x5e\xe1\xe3\xcb\xa1\x74\x18\x64\x0f\xda\x64\x31\xbc\xa9\xa5\x8c\xad\x74\x4e\x1a\xa5\xd4\xbc\x9f\xcb\xbc\x56\x71\x48\x7f\x27\x61\x84\x23\x92\x48\xa7\xd2\x7e\xfa\x4f\x72\xf3\x93\x35\xa6\xdf\xbe\xf8\x71\xfe\x67\xd4\x98\x3e\x7d\x29\x32\xfd\x16\x7c\xbc\x7f\x5d\x65\x82\x80\xf8\xc6\x01\xf6\x34\xf8\xb6\x05\xa4\x71\xdd\xe9\x78\x79\x33\x9c\xe0\x12\x7c\x14\xc7\x99\x28\x81\x9a\xc0\x7c\xe5\xbd\xa4\xc5\xc1\x2a\x2d\x1a\x15\xad\xf4\x35\xd5\x7f\xa0\xce\x04\xa1\xa6\x88\x83\x2e\x1e\xf6\x22\xec\x5a\xd0\xcd\x2d\x55\xe7\x3a\x13\x85\x9c\xd3\x2c\xbb\xcb\xf7\x17\x5e\xe5\x9b\x97\x75\x8c\x64\x7f\x75\xb3\x42\x7c\x71\x6d\x7d\x5c\x7f\x7e\xf8\xe5\xbb\xf5\xe5\x86\xbd\x02\x81\x7d\x0d\x98\x41\x60\x07\x91\x27\x10\x0c\x01\x21\x50\x3f\x29\x50\x23\xe2\xf3\x2d\x8d\x04\xa3\x18\x8a\x63\xe4\x49\x5e\xad\x7c\x62\x79\x9d\xd6\x34\x11\x52\x9e\xb7\x05\xf5\x4c\xaf\xef\xd6\xfb\x44\xa2\xb2\xcb\x14\xcc\x79\xd3\x70\x7e\x9c\x83\xb5\xc6\x39\x63\x2d\x50\xc6\x98\xd8\x18\x93\x30\xf8\x65\xbe\x4f\xb9\x4d\xf3\x0a\x57\xf5\x31\x45\x14\xe9\x6e\x7d\xf1\xe6\x49\x71\xec\xb9\xe1\x89\x73\xf4\x35\xda\xe7\xd6\xee\xba\x60\x63\x00\x30\x1c\x0e\x00\xcd\x13\x68\x4f\x08\x84\x58\x81\x7a\x04\x0a\xc0\xb8\xbf\x80\x04\x40\x35\x8b\x97\x77\x3b\xe9\xe3\x9e\x4e\x39\xde\x6e\xc5\x76\xbb\x1e\xba\xae\xeb\x5c\xef\xec\x5c\xe7\x07\xeb\xfa\xbe\x9f\xb3\xbe\xef\x23\x6a\x9a\x26\x76\x4a\x73\x47\x14\xd1\xde\xd1\x84\x53\xad\x2e\x9a\x9f\x7f\x7e\x99\x9f\xbe\x7f\xb7\xbe\xbf\xa2\x53\xcf\x79\x9b\x6f\x96\xe7\x62\xed\x9c\x27\xc0\x03\xce\xe2\x00\x78\xdc\x9b\x41\x06\xd3\xe8\xa0\x47\x1d\x07\xa0\xd7\x16\xd6\x81\x28\xcf\x63\x17\x22\x1f\xbb\x1e\x88\x53\x5f\xf0\xd8\x0e\x0e\xd4\x20\x84\xb3\xb7\xcb\x3e\x69\xf8\xba\xec\x3e\xfb\x07\x17\x8d\xf3\x7f\x77\x9e\x95\x3e\xdd\xaa\x26\x7f\x5a\xbf\xdb\xfc\x02\xdc\x96\xb6\xbf\x7f\xf9\x27\xbf\x02\xb7\xc0\x8b\xbf\xbc\xa4\xcc\x97\x2f\xd6\x09\x73\xf0\xf0\x6e\x59\xf1\x56\x5d\x60\x66\xdc\x23\xa2\x1b\x65\x20\x8a\x6d\xb4\xa8\x03\x3b\x4b\x68\xc9\x05\x52\x82\x58\xd8\x0d\xc8\xcc\x07\x4b\xa9\x52\x35\x34\x0c\x89\xb2\x9a\x00\x15\x71\x98\xba\xd8\x51\xc0\x5c\xd9\x0f\x48\x81\xbd\xdd\xc6\x96\x03\x01\x94\x8e\x53\xac\x39\x38\x00\x1f\xe2\x30\x53\x9e\x87\x8d\x43\xda\x56\x90\x60\x1a\x7a\x46\x09\xae\x8c\x1c\x90\xe5\x55\x05\x39\x76\x2d\xd1\xb8\x32\xc2\xa3\x96\x95\x88\x11\x64\x3d\xac\x2a\xa7\x9c\x69\x1a\x69\x85\xad\x21\xa9\x8c\x8a\x9a\x36\x4a\x69\x48\xf7\x41\x37\x24\x6e\x5d\x1a\x58\x20\x93\xcb\x5c\x90\xb3\x74\x4f\xde\xad\x92\xc1\x65\x12\xb1\x3c\x23\xf7\xbf\xfb\xfe\x82\x90\xd9\x0c\x2c\x6e\xa3\x2d\xf0\xdc\x80\x0a\x68\x1e\x49\x1c\x9a\x78\x88\x58\x01\x07\xe0\x6c\x0b\x34\x5b\x9c\x1f\x72\x66\xea\x4a\x3b\x43\x83\xde\x47\x97\x14\xcb\x99\x75\xaa\xf2\xe9\x77\x91\x67\x56\xb0\xa4\xb5\x97\xee\xc4\xab\xa5\xe9\x7a\xf3\xef\xef\xde\x7f\x57\x64\xcc\xfa\xed\xd6\x6b\xc5\x78\x50\x41\xed\x74\x3c\x00\x32\x11\x20\x37\xd6\x11\x1c\xc7\xc0\x82\x3f\xaf\x4c\x3c\x4e\x3b\x0b\x6a\x60\x02\xc8\x68\xa0\xd7\x1c\xf2\x12\x17\xfc\xb1\x58\xa8\xbe\xd0\x27\xdf\xe4\x64\x1e\x96\x63\x2c\x76\x51\x80\x43\xac\x9b\x58\x83\x43\xd4\x3f\x8d\x85\x2a\x0a\x7d\xe1\x43\xff\xe2\x8b\xf6\xf7\xb2\x9a\xdf\x3f\xde\x17\x9b\xd7\x8c\x68\x11\x79\xb1\x8b\xae\x46\xbe\x61\x5a\x03\x08\xb6\x6d\xd0\xae\x9f\xc3\xaa\x7e\x3a\xac\x5b\xe7\xb8\x78\xda\x16\x65\x1c\xb5\x35\x40\x2c\x7b\xca\x2b\x2b\xfa\x78\xc9\x5b\x8c\x17\xdf\xa5\xb3\xc7\xeb\xd9\xdf\x35\xfd\xd9\xf4\x4d\x33\xd7\xcd\xd8\xec\x56\xe3\x0f\xc6\xac\xab\x27\xb7\x81\xbf\xdb\x5f\x63\x81\x66\xe3\x96\xb6\x5d\x74\xc6\x3e\xbc\xfd\xf6\xa2\xd6\x73\x8e\x04\xbe\x7b\xf3\x60\xba\x0a\x7a\x54\x6f\x2d\x31\x42\x11\xe2\x39\x13\x20\x6b\xa2\x5f\x5b\xad\xb0\xf1\xbe\x8c\xbd\xd1\xca\x2b\x7e\x1a\xf3\xbd\xa2\xf6\x98\x5f\xe2\x0c\x5a\xe0\xe4\x9b\x74\x8d\x58\x3f\x5c\x2b\x18\x2f\x3f\xda\x82\x12\x93\xc0\xf0\x41\x6a\x27\x15\xe7\xc1\x68\x09\xf8\x3e\x96\x6b\x27\x05\x33\x2e\x1c\x3a\x21\x9d\xe0\x27\x5b\xd4\x9e\xf9\x03\x98\xae\xcf\x2d\xbd\x68\x57\xdc\xa0\x74\x2f\x68\x99\x9f\x45\xe9\xde\x7f\x1d\x47\x5c\xa2\x89\x55\x10\xa8\x41\xdc\xe5\x50\x91\x8e\x49\x80\xa3\x48\x36\xd6\xfd\xd3\x01\xf4\x09\x5a\x28\xc2\x32\xc4\x8a\x56\x91\x16\x4b\x43\x1b\x6c\x71\x53\x6d\x8c\x76\xc4\xeb\xb8\x6f\x5a\x12\x4c\x38\x84\x29\x84\x29\x1c\x4e\x16\x4f\x2d\x1f\xba\x76\x24\xbb\x16\xf6\xdb\x7a\xd7\x54\xfd\x50\xef\x9b\x25\x16\x35\xcf\xec\x4e\x6f\xe8\x45\x27\xe8\x55\x56\xe7\x4b\x11\xe7\x4d\x1a\x75\x7f\xf9\x39\x4d\xd1\x9b\xb7\xcb\xb0\xbc\xd3\xda\x20\x02\x39\xe6\xf1\x00\x5b\xa3\xb4\xe1\x5e\xed\x61\x3c\x04\xb0\x2d\x63\x5b\xc0\x38\x94\xb1\x07\xc7\x58\x15\xe8\xb4\x97\xb2\x0c\x25\xcf\x55\x6f\x8c\x77\xaa\x55\xae\x05\xe8\xd4\x15\x7b\x2e\x96\x0d\x92\xe0\x80\x9c\xf5\xf7\xf2\xa4\xd1\x16\x36\x2a\xc5\x67\x37\x9e\x43\xaf\x5c\x87\xb3\x37\xc9\x75\xb8\x20\x40\xc3\xba\xa9\x61\xce\x67\x47\x74\x3e\x84\x98\x05\x69\x05\xc0\x26\xf6\x40\xe7\x59\xcc\xd6\x59\xbb\xad\xba\x25\x18\x39\x29\x6b\xf3\xc9\x69\x0b\x30\x30\x4f\xcb\x6d\xfb\xd3\xe4\x53\xd8\xde\x70\x4c\xce\x8e\x73\xff\x22\xfb\x8f\xd9\x7f\xfa\xe2\x5d\xf6\xfd\xe5\x9c\xb2\x11\x97\x3a\xd6\xdd\x87\x0b\x4f\xe8\xc5\xa2\xed\x6d\x55\xbc\xff\xf4\xcd\xc7\x7b\x70\x6b\xd5\xf6\x2e\xe9\x0a\x17\xb7\xb5\xb0\x25\x92\x3d\x7b\x12\xac\xc5\xd2\x40\x3b\x4d\x33\x01\x53\x2c\xed\x34\x15\xfb\x13\x02\xa8\x2e\x97\x55\x16\x09\x42\x2a\x88\xbc\x6f\xa1\x60\xce\x32\x0c\x54\x8a\x21\x34\x68\x4c\x0d\x10\xa9\xa4\x90\x4c\x72\x6e\x99\x63\x08\xd6\x95\x12\x0a\x61\x54\xb9\x8d\x48\x5e\x84\xcb\x4b\xec\x6d\xdc\x21\x6c\x54\x25\x4c\xac\x2a\x5d\x95\xcb\xaa\xef\xaa\x9c\xf3\x28\xe3\x96\x0f\xa0\x3e\xe4\x64\xd6\x3a\x76\x26\xb6\xb5\x2c\x08\x6a\xcd\x3e\x4e\x5e\x04\x11\x82\x30\xb2\x53\x8e\x52\x0e\x30\x6a\x6d\x68\xb3\x6c\x95\x9b\xc4\x85\xa7\xc9\x67\xf3\x5f\x24\x2e\xfc\x8b\xb2\xd1\xfa\xaa\xea\x94\x40\x2d\x37\x0e\xfa\xcb\xe2\x73\x39\x7f\xbe\xfc\x9b\x57\xae\x0d\x6f\xbf\x10\xfb\x3e\xbc\x7d\x78\x7b\x67\x4f\x74\xeb\xba\x1c\x13\xca\xac\x15\x94\x71\x83\x19\x37\xc4\x06\x8d\x07\xe0\xd2\xa9\x21\x94\x75\x8e\x2b\x2a\xa9\xa9\xb5\xb0\x15\x08\x4f\xfb\xd6\xf7\x01\xf0\x0d\xf5\x73\x3b\xef\x62\x25\x41\x9b\x57\xf9\xa1\x5f\x06\x88\x29\x39\x57\x3a\x76\xa0\x92\x5c\xba\xd6\x18\x68\x61\xf4\xe9\xc4\xd3\xf7\x7b\x61\xa5\x8f\x1d\x80\xcc\x68\x33\x37\x83\xf7\xc0\x47\x0d\x8e\xad\x3d\x3f\xdb\x5d\xca\x97\xd2\xec\xef\x65\xff\x2a\x61\x7e\xfe\xa7\xec\x3f\x9c\x33\x7f\x3f\x21\xe7\x74\xe9\x8f\x37\x3f\xe1\xbd\xf4\x4f\xff\x58\x59\x27\xbc\x73\x47\x3f\x0c\xfe\xe8\x76\xce\xd9\xa9\x58\x1e\x24\x2f\x04\x66\x50\x12\x1c\x8f\x18\xd5\x95\xa4\x58\x57\xfd\xbe\x96\xfc\xe0\x80\x8e\x5b\xd7\xf7\x80\x6c\x63\x99\x4e\x1b\xea\x34\xa5\x94\x9a\xe5\x25\xb2\xb3\xc2\x53\x9b\x67\x45\x16\x61\xcc\xf4\x3c\x71\x5e\xd9\x92\x02\xb5\x2d\x31\xc2\xc6\x63\x86\xa0\x2d\xab\x71\xde\xe7\x41\x03\xac\x94\x4a\x7b\x89\xe4\x87\xb0\xbf\x78\x91\x9d\xa3\xed\x7f\x7f\x13\xb7\x2d\x33\xd9\x8d\x86\xd7\xfa\xb2\x46\xbd\xb9\x02\x6a\xdf\x26\x6f\xd9\x2f\x04\xac\xbb\xaf\x6c\x29\xaf\x72\xd3\x67\x0b\x33\x38\x25\x23\xbd\x32\x4e\xc7\x70\x9a\xc2\x61\x02\xc9\x7b\xb3\x59\xb6\x3c\xad\x1d\x44\xdf\xc6\x7e\xc5\xe7\xb1\x2a\x15\xf1\x5a\x70\x2e\x3a\xd5\x2a\x58\x4b\x45\x35\x32\xb2\xae\xcb\x38\x2d\x51\x89\x05\x59\x59\x8f\xf1\xc0\x40\xb5\x87\xeb\xa3\x73\xce\x59\x1b\x9b\xfd\x1e\x48\x6b\x6d\x0c\x26\xf6\x9c\x1a\xc4\xad\x2d\x4b\x61\xb9\x56\x0c\xf7\x8d\xed\xf7\xb5\xb2\xce\xd7\x1e\x32\x86\x71\x2f\xac\xe8\x21\x71\xc2\x32\x8b\x92\x37\xd5\xd5\xfb\xe7\x27\x71\x28\x6f\xae\x22\x3f\x3f\x83\x45\x01\xb7\x38\x14\x9c\xb2\x89\xa8\x79\xda\x63\x42\xd8\x36\x6d\x10\x31\x4c\x99\x10\x1b\xe5\x0b\x9d\xb0\x3f\xe9\x06\xec\xcf\xf0\xfa\xe5\xf8\x62\x00\x34\xef\x38\x75\x07\x50\x62\x4a\x29\x11\xc2\xb8\xd6\x36\xae\x75\xba\x38\xb6\x71\x7f\xc5\xa2\xac\xf3\xe1\xa5\xcd\xff\xe8\xa2\x5f\xfa\x23\xec\xcc\xcf\x2b\xc2\xbd\x86\xce\xa8\x00\xaa\x00\xea\x70\xaa\x9c\x83\x08\x60\x6e\x19\x01\x2a\xda\x6b\x4e\x14\x84\x53\x13\x10\x36\x03\x18\xe3\x78\x36\x4c\x8d\xe3\x8d\x63\x11\x12\xcc\x0a\xf9\xa5\xa1\x9c\x60\x71\x20\x2f\xad\xbd\xcb\x61\xaa\x3f\xfe\xf1\xfe\x8c\x0f\x17\xaf\xb5\x2b\x0b\xf4\xf7\x7c\x2f\x1f\x02\xe0\xcb\xdf\xa7\x00\x26\x2e\x98\x44\x9a\xe1\x78\x2c\x95\xd7\xfe\x8a\xf2\x59\xb1\x9f\xf9\xc6\xff\x37\xab\xc6\xbb\xe4\x61\xf3\x9f\xf3\xb9\xbe\xf2\x90\x03\xbf\xcf\x7b\x4e\xa4\x9b\x52\x85\x53\x0d\xb6\x57\x37\xb9\xb1\xe4\x5e\xf8\x71\x1c\xc7\xa2\x13\xfc\x2c\x8a\xf4\xe5\xda\x4f\x7e\x9a\xb1\xb9\x38\xcc\xfd\xe8\xd3\xbc\xfe\x4e\xf2\xaa\xdd\xe6\xc3\x1d\xdd\xb0\x57\x5e\x9f\xd9\x35\x3b\x7f\x3d\x7f\x7f\xfd\x7a\xbb\x72\x4f\x26\x14\xfc\xd4\x81\x29\x3f\xce\x95\x07\x63\xc4\x4f\xfb\x97\xb7\x1b\x16\xb5\xb3\x31\x2c\xaf\x6e\x79\x49\x31\x30\x7c\x46\x97\xf9\xe6\x57\x97\x6a\xf4\x1f\xe2\x5e\x7c\xc8\xd7\xef\x7f\x0b\xce\xe5\x88\x82\x82\x21\x51\xc3\x35\xf0\xed\x59\x18\x38\x5a\x70\x78\x6a\x8b\xb1\x99\x87\x06\xa8\xa6\x9a\xf7\x7c\xda\x83\x7a\xd8\x9a\x6e\x5f\x0c\xc6\x19\xd7\x75\xce\x38\xe3\xe5\x3c\x80\x36\xb2\x9c\x4d\x73\x20\xae\x9e\xb0\xf6\x36\xf8\x2c\xcb\x33\x5e\xd4\x49\x6b\xfb\x6d\x42\x1b\xa4\x80\xe4\x5c\x4d\xf8\x12\x21\xad\xbf\x36\xcc\xbe\x9d\xfb\x41\x1b\xea\x1a\x0c\xfd\xec\x69\x8e\x42\x34\x48\x30\xc5\x04\xc4\xe6\xb0\x46\x51\xa1\x1e\x60\x5a\x7a\xa8\xa3\x8b\x47\x99\x6f\x39\x13\x1e\x36\x14\x6d\x2c\x41\xd0\x47\xec\x82\x04\x92\x10\x66\x38\x85\x50\x6c\xab\xd8\xa1\x0a\x32\x62\x19\x5d\x42\x9c\x1d\x17\xb5\xaf\xf1\x45\xd7\x70\x28\xf0\xc6\xbe\x70\x19\x97\xc0\xf9\xc3\xfd\x2b\x35\x9e\xb3\xc7\xe7\x37\xc0\xf9\x1a\x01\xa4\xf1\x78\xde\x2e\x2c\x5b\xfd\x1a\xd4\x8a\x6c\xa5\xe3\xc3\xc6\x22\xce\x6d\x19\x77\xfa\x84\x45\xd8\xf9\x7d\x18\xc6\x65\x51\x5c\xfa\x42\x3c\xb3\x62\xbb\xd1\x97\x7c\x6a\x22\x6b\x7e\x7b\xa9\xef\xe5\xb7\xe8\x9e\x33\x26\xf6\xed\x65\x35\xfc\x70\xff\x08\xf6\x1e\x60\xee\x11\x0c\x00\x41\xa3\x84\x6e\xec\x96\xf5\x5a\x6b\x23\x04\xad\xa3\xd2\x5e\x05\xe7\xd6\x7a\xd9\xb2\x3b\xb2\x87\xda\x46\x13\xc3\xde\x5a\xb3\xdf\x6a\xa7\x3b\x67\xb9\x50\xbe\x27\x11\x46\x2f\x80\x06\x43\x1e\xe6\x03\x70\xc9\x7b\x3d\x97\x89\xdf\x81\x2e\x7b\xc1\x17\x06\xd6\xb2\x23\x04\xf7\x8f\x29\xc5\xfb\x82\x10\xf9\xf0\x71\xb5\x6c\x0c\x3b\x1e\x87\x68\x8f\x8c\x74\x84\x02\x37\x4b\x80\x40\x2b\x22\x8a\x63\x13\x77\x91\x2a\xd0\x4f\xb3\x03\x1a\x22\xcb\xc8\x31\xee\x62\x8f\xf3\x71\xa3\x3d\xac\x26\xad\xb1\xe4\x7e\x10\xad\x07\x75\x6c\x80\x88\x93\x77\xb6\xf7\x69\x32\x3e\x56\xa5\x3f\x73\x80\x59\x6e\x93\xf6\xde\x2f\x92\x4e\xcc\x5f\xbc\x64\x0e\x92\xd7\xc2\xaf\xdf\xbf\x7d\x48\x4e\x0b\xeb\xcb\xc3\x92\xd3\x61\x27\x72\x05\xaa\xb6\x2a\x41\x00\xa3\xd8\x8f\x27\x5f\xd0\xfd\xd6\xef\x9f\xb3\xd5\xf1\xa9\x0a\xc5\xf6\x44\x57\x7b\xc1\xfd\x78\x20\x65\xb9\xb3\x81\x09\xed\x94\x51\xe6\x10\x95\x37\xe7\x3c\xaa\xc9\xdb\x3b\xbb\xb1\x49\x93\xfe\xbb\x4f\x9f\xdf\x65\xeb\x1b\xdb\x9f\x87\xf7\xdf\x7d\x7f\x5d\x9a\x2f\x13\xff\x26\x97\x40\x87\xc1\x46\x1e\x59\xee\x00\xe7\xd2\x1d\x82\x47\x68\x26\x33\xae\x41\x05\xd0\xb8\xab\xc7\x66\x6e\x0b\x49\x1b\x0c\xf3\xe9\x54\xd9\x95\xaa\x91\x17\x71\xd4\x15\xe1\x8c\xb7\x83\x20\x58\x34\xd4\xd4\x95\x51\xde\x2b\xcc\xf8\xb9\x66\xbd\x06\xb8\x70\x9b\xc3\xab\xb9\xe2\xba\x9b\x7d\x9d\xd5\xc1\xeb\xfe\x07\xd6\x2c\x1b\xd7\xdc\x81\xe9\xc9\x5e\xdf\x6d\xd8\x4c\x41\xeb\x9c\x8b\xca\xda\x14\x87\xfd\x69\xde\x27\x7d\x40\x7b\xe3\xe5\xf1\x6f\xb2\x7f\x9b\xfd\x87\xec\x7f\x4f\xfe\xb7\x4b\x74\x79\x51\x1b\xba\xf8\x31\xdd\x3f\x5c\x09\x0d\x29\xd7\x77\x19\x8c\x37\xab\xf4\xfd\xc3\xdb\x4f\xc5\x39\x6e\x4b\x12\x20\x2f\x99\xc2\x5b\x23\xf7\x1b\x94\xce\x66\xd2\xb6\x83\x8c\x42\x57\x41\x18\x5a\x1e\x0f\x87\x83\x91\xb5\xed\x29\xb5\xde\x82\x63\x55\x37\xb0\x02\xcd\xd9\x0d\x53\x4d\x6d\x68\x9a\x06\x90\xd6\x7b\x22\x88\xc3\x62\xb6\x8e\x12\xc7\x72\xc6\xb0\x47\x54\x13\xe4\x20\x2e\x2a\x61\x18\x81\x35\x74\xa8\x47\x88\x72\xd0\x05\xd3\x43\x68\x11\xa2\x79\x2d\x63\x16\x35\x07\x1e\xec\xf3\x81\x12\xcc\x85\xf3\xd1\x76\x04\x4c\xde\x7b\xff\x9c\xd8\x81\xf6\xe4\x5d\xe0\xc1\x51\xd2\x59\x1a\x8c\xf6\x34\x68\xa4\x2f\xf4\x9c\xec\xcf\x72\x7e\xe9\xb3\xdb\x2c\xef\x6f\x5f\xf5\xdb\x97\xbe\x78\xe9\x9f\x37\x3f\xd5\x27\x3f\xd1\xbf\x1f\xde\x7e\xfa\xfe\x3c\x29\x9f\xfb\x78\xfd\x33\xfd\xb6\x36\xa8\x02\xdb\xd8\x01\x72\x42\xad\x6b\xf2\xaa\xaa\xbb\x3e\xf4\x7d\x0f\x78\x1f\x1a\xa2\xfd\x16\x31\x01\x5d\x85\x60\xdb\x0a\x6f\x66\x92\x70\xae\x4e\xd5\x7e\xa0\x05\x11\xc4\x63\x39\x0b\xcf\xa8\x63\xb9\xe6\x38\x20\x66\x28\xf2\x90\x6c\x2c\x93\xde\x45\x2b\xe7\x29\x1a\x0e\x02\xd8\x2d\xdd\x14\xf5\x12\xf4\x5d\x7a\x27\x8e\xe7\xee\x45\xf6\xd2\xbd\xce\x13\xa1\xaf\x3d\x2c\x6c\x10\xc1\x51\xda\x19\xe6\x8d\x76\xcc\x6b\x9c\xc8\xb8\xd9\x9f\x81\x43\xf2\xe8\x7c\xdd\x6f\xbf\xc9\xfe\x75\xc6\x2f\x8e\x02\x7f\x83\x7e\x7b\x29\xdd\xfd\xd1\xdd\x86\xf1\x32\x39\x7b\x20\x9e\x86\xe0\x7d\xce\x6b\x38\x24\x05\x60\xa0\x77\xa1\x67\xba\xd9\x21\xae\x61\xe9\x2a\xbe\xed\x84\xf7\xa7\x69\x99\x91\x0e\x41\xd7\x61\x47\x0b\xa5\xa9\xa7\x6a\x86\x41\x30\x2f\x73\x2f\x68\x20\xdc\x73\xec\x31\x7d\xd5\x6d\x62\x99\x6e\x7e\xdc\x6d\x83\xd0\x1c\xc3\x9a\x68\xd4\x89\xa5\xd7\x02\x91\xda\xf4\x4b\x37\xfe\x9e\x5e\xcb\xb2\x22\xf3\xcf\x53\x1e\x36\xfa\x56\x27\x20\x89\xc0\x26\x92\xe9\x9b\xfb\xc7\xfb\xe5\x00\xaa\x81\x78\xef\x0f\xde\xe1\xed\xe1\x70\xd8\x68\x64\xe5\x0f\x7b\xd9\xad\xb5\x9e\x13\x70\x66\xde\x83\x10\x55\x96\xb0\xa7\x67\x4c\xf5\xf9\x0e\x7c\xb8\x2a\x0f\x3c\x7c\xf1\xff\x7b\xbc\x71\x21\xbe\xa9\xe1\xbd\xa0\x16\x1e\xef\x1f\x56\xdb\xb6\x46\xe0\x10\x79\x0d\x73\x11\x8f\xb6\xe7\xc7\x30\xb9\x49\x74\xf2\x08\x04\xaa\xe3\x30\x61\x9f\xcb\xb9\x59\x0e\x0a\x70\x1a\x7d\x3e\x8e\x1b\x07\x19\x99\x05\x27\xce\xb3\x60\x8f\x7b\x6b\x95\x71\x94\xe5\x2d\x8f\xc1\x47\xe5\x4f\xed\x38\xba\xa4\xee\x72\xd6\xf5\x68\x0b\xf2\x07\xf4\x11\xb2\xa6\x46\x05\x6b\x9e\x46\x0f\x14\x7a\xce\x5e\xf4\x11\x08\xa6\xf4\x34\x70\x51\x50\x12\x9b\x10\x49\xd2\x43\x05\xaa\x60\x1b\x77\xe1\x2f\xdc\xbf\x7c\xf2\xdb\x9f\x47\x9a\x1a\xe6\x87\x1f\xf6\xc0\xa3\xb8\x2f\xa6\x53\xb9\x1c\x1b\x0b\x29\x99\x65\xde\xf0\xd8\xda\x68\xec\x05\x73\x60\xee\x6c\xae\xcf\xf3\xf0\xc7\xb4\x3d\xbb\xcd\x46\x81\x3a\xf7\x73\xb5\x71\x73\x99\xec\x7e\xc8\xef\xb2\x02\xcd\x3a\xcd\x5d\xad\x5b\x5e\x52\x7b\xf2\xc3\x1f\x68\x0f\x0b\x15\xca\xf7\x3f\xec\x41\x83\xe2\xae\x38\x9c\xea\xe5\xd8\x58\xc8\xe8\x5c\xe5\x47\x1e\x9d\x3f\x6b\x10\x5e\xf5\x24\xdc\x1f\xe8\x2f\xd7\xd7\x28\xef\x9b\xa7\x7d\x03\x0e\x28\xfa\x15\x7c\xda\x2f\x47\xe1\x10\xa3\x27\x25\x44\x11\x48\xd4\xdb\xf9\xd8\xa7\xb1\xd7\x3e\x87\xc2\x27\xfe\xf3\x8f\x7e\xe6\x32\x2e\xce\x42\x2e\x60\xdb\x54\x04\x98\x10\xa9\x1f\xb1\x4e\x31\xe2\x36\xd2\x8d\x45\xda\xfc\x20\x98\x59\xef\xec\x5c\x81\xfd\x53\x0f\x76\xa9\x9d\x32\x77\x1b\x97\xf4\xa7\xbe\xfa\xcc\xd7\x71\x96\x4f\x1d\xc6\x05\xfd\x61\x07\x10\x1d\x8a\xe3\xa9\x5a\x8e\x8d\xc7\x82\x9d\x86\x82\xc8\xc8\xb6\xf3\xd4\x9f\xf3\xa1\x2e\xed\xa5\xd1\x59\x8b\xf7\x9c\x79\xbc\xf2\x85\xbe\xb0\x01\xce\xa2\xb1\x17\x9c\xfd\xfd\x35\x68\xf9\xf4\xf9\xa1\x38\x16\xd4\x06\x82\x11\xc0\x98\x6b\x0c\x8f\xcb\x46\x51\x87\x40\xe4\x73\x16\x8f\x12\x71\xdf\x57\xb6\xa6\x3a\xf2\xbc\x6a\x3a\xa9\xa5\x12\xb3\xdb\x20\xdd\x19\x88\xb1\xb3\x8a\x33\x1e\x5b\x17\x15\x0c\xce\x77\x46\x82\x32\xaf\x0f\xbd\xe7\x05\x75\x46\x2a\x42\x84\xbc\xc4\x90\xe4\x2e\xe4\x34\xe5\x6c\x5f\x30\x33\xcb\x53\xb4\x46\xf3\x91\x46\xa6\x80\xc3\xf3\x74\x87\x23\x6e\x40\x1b\x4b\xe3\x65\xb2\x03\x6d\xaf\x5a\x5d\x62\x83\x6e\xd6\xfc\xff\xff\x65\xd5\xff\xda\x38\xeb\xc3\x57\xa8\x95\xab\x6a\x69\x71\x28\xc4\x29\xf9\x5f\xc8\x61\xde\xa5\x53\xe4\x4d\x05\xc6\xd2\xb7\xc4\xd4\x96\x31\x5a\xc5\x41\xc4\x20\x01\xa5\x71\x07\x68\xb9\x41\xa7\x09\x0c\x89\xe6\xb9\xbc\x78\x1b\xb3\x78\xac\x43\xe5\x01\x8f\x99\xf7\x1a\x78\x4f\xcf\x71\x2b\x29\x76\x69\x5f\xf1\x4f\xb2\xec\xcd\x15\xa3\x90\xdc\x6f\xcf\x5a\xa5\x1f\x97\x18\xf5\xcb\xc5\x8b\x2c\xd4\xe3\xc7\x0f\x9f\x8c\x66\xd0\x63\x62\xa4\x54\x55\x6b\x42\xd5\xb6\x2e\x77\x1e\xe3\xc6\x3a\x17\x9c\x73\x8a\xad\x61\xd7\xe2\xd6\xfa\x48\x7d\x84\x71\x27\x41\x0d\xbc\x07\x5b\xb0\xc7\x4d\xba\x38\x97\xf9\xe4\xc1\xd6\x77\x57\xfc\x8f\xbc\xb3\x60\x97\x72\xdc\x2f\x4f\xe1\x25\x1f\xfd\x12\xa9\xf7\x9b\xe6\x34\xe5\xdd\xcc\x81\x87\xd0\x72\xb2\xfb\x5d\x56\xe0\xe5\xa9\x9e\x4b\xb0\xf3\xc2\x1b\x58\x13\x4c\x9d\x33\x5e\x9c\x71\x4f\xfc\xce\x82\x3e\xd5\x0b\xaf\x3f\xf5\xf1\xdd\x4d\xae\x19\xfc\xfa\xfd\xe3\xdb\xf3\x0f\x6d\x27\x0e\x70\x12\x7c\x48\x3f\x6e\xb5\x83\xf8\x08\x7a\xc7\xbd\xf6\x5e\x7b\x1e\x3b\x42\x74\x96\xfd\x9d\xfc\x98\x72\xda\xe2\xd5\x7e\xef\xcf\x6f\xf2\xdb\x7f\x9d\xf2\x41\x97\xfb\x7b\x7f\xdd\xb5\x7e\xf5\xf5\xfa\xbc\xa0\xbd\xbb\x16\xa9\x5e\x44\x1e\x1e\xce\x41\xfa\x8d\xf1\xda\x77\x9f\xbf\xff\xfc\x90\x2a\xee\x77\x45\x0d\xa6\x58\xba\x43\xfa\x0f\x6c\xf3\x2c\x66\xfe\xfc\x45\x0c\x92\x09\x2e\x5a\xc3\xa5\x54\xb9\xd1\x5c\x0b\x05\xa8\x12\x42\xa8\x93\x01\x9c\x86\x1a\xe6\xdd\x9e\x8a\x2e\x48\x77\x18\xa2\x61\xa0\xde\xc6\x5e\xc7\x29\xb7\x92\xc4\x00\xe1\x46\x9c\x0e\x39\x91\x71\xab\xe2\x56\xe5\xf8\xe6\x8b\x09\x53\xcd\x09\x67\x96\x6b\x2e\x98\xe3\x8a\x2b\xa6\xb4\xe6\xcf\x99\xab\x28\x71\x5e\x52\xea\xb9\x30\xc8\x57\x4c\xb5\x3d\xd3\x04\x9d\x79\xb7\x2c\x71\x3a\xd5\x0b\x1f\xff\x22\x6f\x9f\xe4\xcf\xef\x3f\x5c\xbf\xba\x92\x69\xcf\x85\x90\x94\xf5\xbc\xa6\x44\xc1\xea\x25\x00\xf8\xae\x10\x6d\xbb\x77\x66\xb4\xe3\x38\x1e\xbb\xae\xeb\x46\x20\xe5\x0f\x7b\xde\x68\x63\xec\x00\x3a\x90\x8d\x7a\x37\x45\x1f\xc6\xa3\x05\xd9\xaa\x9e\xdc\x11\x1c\x63\x95\xab\x5c\x74\xae\x9d\xe1\xd1\x4d\x16\x64\xee\xc9\x39\xb7\x62\x78\x89\x94\x8e\xf6\x34\xea\xe0\x5a\xa3\xf9\x68\xd2\x72\x90\xc6\xa0\xba\xb3\x39\xfb\x89\x31\x78\x33\x66\x86\x8d\x9c\x61\x6e\x66\x07\x68\x5d\x37\xa8\x06\x2c\xad\x0b\x2e\x37\x33\xcc\x99\xb7\xbe\x23\x88\x2c\x31\x7f\xe7\x6d\xb6\x5a\x35\x89\x7f\x6c\xb3\x3a\xe9\x26\xfc\xe3\x9b\x5d\xe8\x57\x29\xf0\x4f\x57\x7f\xb9\xcb\xec\xfc\xe6\xe1\xfe\x61\x6d\x7d\x55\x03\xed\x98\x0b\xbc\xf3\x6e\x8b\x5b\x4d\x71\x5d\x2b\xab\x28\x93\xe4\x39\x2b\x81\xf3\x09\x5a\x8e\xe3\xb8\xb1\x90\x73\x5f\xc5\xa3\xd0\xa4\x61\xd6\x70\xcb\x14\x57\x08\xaa\x81\x1b\xe9\x3c\x9c\xd9\x9c\x29\x5d\x94\xf3\x04\x4c\x06\xb2\xe6\x59\xde\xb9\x1c\xdd\x3c\x19\x0f\x6f\x1f\xbe\x7a\xdc\x76\x1b\x35\xc3\xbc\x99\x25\x08\xdc\x31\xb2\xfb\x5d\x7d\x79\x3c\xaa\x1c\x05\xed\x1b\xce\x96\xcf\xd9\x78\x9d\x81\x15\xbd\xe4\x44\xe1\x8d\xa6\x7a\x92\x7f\x49\x1b\xdf\x6f\xde\xdc\x5d\xd4\x2b\x97\x05\x62\x65\x01\x4c\x4e\x45\x40\x46\xe5\xec\x76\x47\xa8\xf3\x2a\xd0\x78\x88\x5b\xd4\x9a\x74\x7d\xbf\x16\xcb\xbf\xf0\x51\xfa\xc8\xbb\x7a\x89\xe6\xe3\x3e\xb6\x74\x10\xd0\xef\x40\xf0\xe0\x8c\x1b\xca\x9a\xc2\xdc\xc9\x0d\xbd\x78\x5b\xfc\x44\x3d\xe9\xfb\x9f\xb8\xb6\x2d\xea\xd8\x27\x8c\x09\x3d\x8d\x40\x24\xff\x8a\xa1\x70\x3f\x75\x75\x43\xbd\xf7\x2e\xfd\xf5\x2f\xef\xb2\x55\xa6\x9f\xe9\x5d\x9f\x2f\xf3\xd5\xaf\x2e\x08\xd1\x0f\xf7\xdf\x81\x77\xd9\xfa\x22\x4f\x95\x3f\xc0\x33\x2f\xf2\xf3\x95\xee\x79\xe3\xe9\x28\x9b\xbc\x04\x42\x47\x3b\xf7\x15\xa8\x00\x96\x75\x03\x45\x88\x43\xdc\xfb\x6a\xdc\x33\x50\x1e\x00\xb2\x4a\x0b\x13\xa1\x17\x3a\xb8\xb5\x0b\xde\xd8\x2e\xc7\xd1\x1f\x13\xb7\x61\xc2\xac\xc1\xad\x41\x84\x72\x16\xb8\xc8\x29\x57\x5a\x31\x48\xe2\xb1\xe3\x23\x0e\x83\x1d\xb6\x4b\xdf\xe4\x87\x3b\xb1\xc1\xff\xf9\x7d\xd3\xa5\x8c\x25\x7b\xd5\x37\xd5\xa5\x6f\xd8\x69\xb8\x5c\x1d\x37\xd8\x6f\xfd\xce\xfb\x9d\xdf\xfa\x97\x77\xc9\xdf\x42\x14\xc3\x06\x25\x4f\xfd\x7f\x94\xfd\x57\x49\x9f\x2c\x81\xc7\x5f\x55\xac\x52\x2d\xe4\x02\xe1\x7a\xd8\xbc\xfd\xf0\xb1\xd8\xdc\x9d\x01\x35\x5d\xbe\x15\x22\x72\x08\xf3\x2c\xc4\x6d\x80\xd8\x58\xee\x7a\xf8\x9c\x81\xb2\x1c\x80\x2c\xc7\x7d\x59\x4d\x71\x4c\x39\x60\x14\x5b\x1f\x1b\xc5\x66\xac\x74\x5e\x53\x6c\xfd\xe8\x47\x2f\x95\x92\x43\x6c\xb5\x1c\x4f\x35\x60\x67\x4d\x06\x7e\x17\x36\xe2\xc2\x3b\xf9\xc7\x5f\x3c\x0a\xd2\x8d\xf9\xe6\xfb\x2f\x55\xc9\x65\xfe\xcd\x6f\xe6\xdf\x5f\xbf\x3f\x1b\xff\xff\xf2\xdd\xa7\x37\x6b\x64\x60\x03\x4d\xce\x1b\xa9\xbd\x9d\x6b\x85\x5b\x2c\x6b\xa0\x11\x0c\x24\x77\x7b\xdc\x8c\xbd\x0e\xd3\x21\x7a\x06\xc8\x10\x3a\xc9\xe2\x00\xf6\x94\x5a\xeb\xf0\x46\x8c\x3b\x7c\x18\x6a\x1c\xb7\x3b\x0e\xb2\xa6\xdf\x93\x43\x3f\x7b\xa5\xaa\x6d\x88\x63\xaf\x4d\xb0\xae\x65\x9e\x58\xce\xfb\xae\x33\x84\x7a\x50\x65\x25\x68\x2e\x7a\xa8\x8f\x17\x4d\x98\x65\x9f\xff\xd7\xd9\xff\xfd\x32\x8f\xdc\x7d\x78\x6d\x93\xf1\xf8\xf1\x42\x12\x4f\x53\x4a\x4a\x6d\xbd\xb9\x28\xc3\x2d\x91\xc6\xdb\x6f\x3f\x2f\xfb\xaf\x2f\xd4\xaa\x4f\x6f\x1e\xcf\x12\x4d\x49\x68\xec\xb5\x21\xf8\x95\xe9\x9a\xef\x6c\x55\x83\x8c\x0f\x94\x31\x0d\x2d\x81\xda\x5a\x68\x4c\xa8\x2a\xb9\xdd\x61\xd8\x50\x8c\xb5\x3e\xea\x18\x8c\x3e\xea\x6d\x6e\x85\x25\xac\xe6\x04\xc3\xb2\x85\x83\xf0\xb0\x37\xa6\xac\xad\xef\xfb\xdd\xce\xc7\x2d\xa0\x6d\x8d\xac\xda\x68\x44\x88\xae\xdb\x27\x76\x16\x84\x05\x6c\xbf\x8f\xfb\x03\x03\x0c\x38\xb0\xab\x2b\xb9\x6b\x84\x34\x34\xfa\xdd\x6e\x37\x0f\x3b\x8f\xfa\xdd\xae\xb0\x91\x74\xb5\xaf\x05\x28\xcf\x86\xd5\xd5\x3c\x41\xc1\xda\xd6\x4f\x2e\x1a\xe0\xdc\x24\xb9\x4c\x78\xcc\xe2\x70\x99\x8f\xd6\x89\x8f\xf2\x57\x17\x96\xd1\x77\x17\xa5\xd8\x1f\xb1\x30\xae\x84\xf3\xb3\x56\xf5\x3a\x71\xf1\x6e\x9e\xd8\xcd\x51\xc4\x43\xec\x18\x40\x80\x0a\xec\xca\xaa\xe3\xcb\x16\x9a\x73\xec\x3c\x6a\x83\xb1\xb0\x51\x9e\x27\x4b\x39\x3f\xc6\xe3\xd0\xd6\x28\x52\xcf\xbd\xf3\xb9\x53\x38\x60\xb1\x31\x46\x33\x47\x66\xd3\x0d\x94\x62\x38\x4f\x17\xe6\xe3\xae\xae\xac\x69\x60\xe5\xc2\x84\x07\x57\xd6\x42\x92\x38\x8e\x35\x62\x2c\x4a\x1c\xa7\x5e\xf4\xfb\xe1\x88\xa7\x21\xd5\x2f\x74\xca\x9d\xdb\x14\x75\x5c\xb5\x3b\xcf\xcb\xd3\xcb\x86\xfb\xcd\x8f\x72\xff\x37\x9a\xe8\xeb\xb2\x46\x0d\x81\xa0\x3d\x99\xbd\xdf\x85\xfc\x30\xd7\x85\xd2\x9a\x09\x68\x28\x8f\x75\x08\xc9\xfc\xed\x10\xeb\xf5\xc0\x96\xe0\x37\xc2\x63\x84\x11\x2b\x60\xc1\x90\x8f\xb1\xdb\x46\x74\xea\x65\x32\x8e\xb2\x31\xac\xaa\x78\xb4\x51\xbb\xb3\xcf\x36\xcb\xfb\x4d\xf7\x82\xd3\xf8\xc5\x6b\x9c\x46\xaa\x48\xb0\xb5\xfa\x21\xbc\x28\xb1\x2f\xc7\x86\x9e\x4c\x6e\x4c\x0c\x3a\x36\x3a\x03\x99\x7b\xa6\x77\x26\x0f\x09\x83\xf1\xee\xa5\x14\xf3\xcd\x8b\xfb\xd6\x39\x1c\x6e\x5a\x08\x0c\xb3\x8c\x00\x38\xd3\x6d\x9e\xc9\x79\xbb\x2f\xdb\xd9\xb1\xbc\x6c\x66\x93\x8f\x75\xee\x6b\x2f\x04\x97\xe1\x39\x93\x9d\x07\x36\x1a\xdd\x08\x90\x05\x9e\x65\x7f\xfb\x85\x3f\xfd\x5f\x42\x5f\xf8\xa7\x3c\x55\xde\x27\xe3\xcb\x5b\x7d\xe1\xb3\xc8\xfb\x45\x5f\xb8\x66\x91\xcf\x1e\xe7\x25\xd0\x96\x73\x25\xe2\x96\x21\x03\xd9\xb0\xbc\x52\xb6\xec\x7b\x7d\xd7\x01\xd2\xba\x36\x76\xa0\xf2\x5a\x33\xc3\x39\x14\x82\xc6\x23\x8e\x4a\x4b\x62\x24\xb5\x28\x6c\xa9\x07\x65\x9c\x40\x09\x28\x41\x06\x92\x8d\xb6\xe8\x56\x64\x98\x5f\x5e\xdb\x54\xf9\x36\xc6\x44\xe5\x9c\x8b\x99\x16\x75\x80\x02\xec\x77\xb1\x8a\x7b\x84\xd4\x17\x91\x61\xcd\x79\xff\x45\x64\x78\x93\x5f\xe3\x96\x37\x17\x04\xe4\x3f\x4f\xb5\xed\x0f\xdf\xde\x2d\x8f\xc9\x2f\xc0\x4b\xf0\xf2\x0d\xf8\xb0\xf9\xea\xda\x6f\xc1\xf7\x37\x91\xed\x97\x78\xe6\x42\x6d\x5d\xdf\x7d\x77\xd1\xec\xf9\xee\xf3\x43\x31\xda\x52\x12\xad\xdb\xca\x2a\xc5\x15\x0f\xaa\x75\x39\x73\x65\xa5\xa9\x36\x7d\xd5\x58\xb9\x74\x81\x76\x6a\xce\x4c\xcd\x35\xcf\x85\x81\x5a\xab\x9c\xf9\x93\xf7\x35\xd8\xfb\x3c\x8b\xbc\x05\xd8\xc4\xa9\xf5\xc3\x73\x26\x01\xda\x46\xb9\xb1\x92\x13\x2a\x14\x53\x5c\x1a\xc5\x8d\x54\x02\x64\x00\x1b\xb9\x5c\xe4\x58\x18\x63\x85\x13\x42\x4e\x16\x79\x43\x8c\x81\xc1\x12\x1b\x69\x3c\xba\x94\xbf\x0e\xc1\xf5\xad\xeb\xc7\x08\xc1\x76\xe7\x4d\xb7\xac\x69\xe6\x99\xac\xaa\x84\x3d\x7c\x77\xd1\xe6\x3a\x87\xaa\xd7\x8f\xbd\x7e\xff\xe9\xf3\xa7\xef\xdf\x15\xef\xaf\x7d\x74\x77\xcb\x03\x4e\xdf\xc9\xeb\x60\xa4\xf2\xdb\x6a\xec\x74\xe8\x54\xdc\xf1\xa3\x62\xf1\x18\xb8\x07\xa2\x29\x8d\x50\xbe\x2f\xab\x71\x09\xac\x74\x3c\xf0\x83\x14\x71\xf2\xdc\x6f\xcc\x73\xc6\xb5\x71\x8a\xb9\xd6\xb5\x66\xef\x9c\x1e\xc2\xb1\x8e\x0d\x8c\x4d\x30\x54\x1a\x23\x30\xf4\x5b\xbb\x35\x5b\xeb\x55\x17\x0e\x75\xec\xe1\x99\x7f\x9a\x5d\xbc\xef\x97\x36\x9f\x9d\x09\xbe\xba\x7f\xeb\xa4\xae\x5b\xbc\x4f\x72\x1c\xdf\xdc\x5f\x5b\xfe\xf6\x9b\x77\x77\xbf\x5e\xae\xaf\x9b\x50\x5a\xa9\xc2\xb9\xc9\xad\x8e\x7b\x7e\xe8\xe3\x31\x08\x07\x1a\x15\x47\x7e\xe8\x43\x69\xa4\x74\xdb\x76\xcf\xf7\xb1\x4e\xad\xf5\xfa\x75\x6b\x15\x10\x20\x5b\x9a\x7b\x22\x47\xe7\x15\x60\xe0\xda\xec\x32\x1e\x55\xe3\xf2\x70\x69\x30\xc8\x54\xa1\xef\x42\x8a\x57\xbe\x8a\x56\x12\xcf\xf2\x61\xd8\xf8\xd3\xb4\x44\xde\x05\x9b\x46\xa0\x02\x60\x73\xbd\xc1\xde\x2e\x71\x59\x0a\x58\x9a\xac\xc8\x34\x28\xef\xec\x86\x66\x0f\xe7\xc8\xe3\x92\x53\xb8\x56\xdc\xb3\xe2\x35\xce\xfd\xd3\xe7\x87\x97\xc2\xd5\xf2\x2b\x41\xb3\xea\x7d\x4b\x58\x1f\x54\xd7\xf9\xc9\x44\x39\xd4\x15\x17\xd6\xd6\xca\xd1\xa1\x3d\xb1\x7d\xbe\xdd\x2d\x33\x62\xdb\xcf\x47\xbc\x81\xbf\xdb\x6f\x68\xc7\xb9\x95\xaa\xd5\x9d\x6c\x9d\x07\x15\x18\xca\x72\xde\x32\x5a\xf9\xba\xce\xb5\x14\x7b\x1f\x79\x6b\x3d\x60\xb3\x0a\xd9\x9f\xe5\x2a\xad\x4b\x7f\x98\x67\x76\xf1\x8c\x38\xfb\x46\xac\x5f\x59\x51\xfe\x8c\x5f\xe5\xdf\x80\x67\x56\x34\x1e\x34\xfe\xec\xf2\x23\x7d\x1c\x00\x01\x55\x94\xfe\x4b\x15\x58\x31\x4a\x05\x54\x08\x45\x6a\xaf\x65\xf7\xb9\x01\xca\x02\x1d\x3d\xe0\xb1\x6b\x0d\x17\xc6\xaa\x56\xf6\xe2\x08\x78\x0c\x61\x1c\x35\x86\x02\x22\x80\x47\x2b\x6b\x24\xd0\xc6\x0a\xce\x1d\x63\x8c\xb9\xe3\x85\x73\xc6\x27\x0e\xea\x1f\x9a\xb3\x95\x56\x61\xc0\x6e\xb9\xc2\x7b\x84\x0c\x89\x1a\x52\xa6\x19\x39\x02\xe2\x95\x96\x67\xdb\xca\x6d\x8d\x29\xa2\x84\x6c\xb7\x10\x52\xbc\xec\x30\xff\x2c\x27\x17\xed\xfc\xd7\xfd\xf8\xbf\x64\xff\x6b\x26\xb3\xff\x33\xc5\x47\xbf\xb7\x1f\xef\x7f\xba\x1f\xc1\x57\xfd\xf8\x5a\x10\xed\x67\xbb\x51\x36\xa0\x6b\x96\xee\x68\x22\x6f\xe2\x0e\x20\x50\x47\xe6\xdc\x55\x46\x63\xd5\x33\x4a\x35\xb4\x08\xc5\xda\x5d\xe1\x0c\xb3\x01\xc1\xa4\x52\xac\x8a\xdb\xa0\x99\xb2\xc6\x0d\x72\x6b\x9e\x33\x60\xa2\x6a\xa6\xc9\x62\x28\x6b\x04\xe8\x21\xbc\xea\x47\x4a\xdd\x31\xc2\xa7\xe3\xfa\xd8\xb3\xe7\x8c\x03\xf8\xd2\x91\x1a\xec\xd3\x25\x3e\x50\x6a\x48\x54\x94\x69\x4e\xe3\x04\x58\xa3\x95\xd4\x20\x90\x18\x86\x9a\x50\xc4\x08\x19\x06\x08\x19\x3e\xef\xd5\xff\x4e\xea\xcb\x3f\x2e\xa7\x71\xbb\x9e\x7f\xf5\xf5\xcf\xe5\x34\xd6\x17\xc5\x86\xf3\x74\xf8\xfd\x39\xa5\xb1\x44\xd4\xe9\xb1\xcc\x6d\x8e\xe7\xf1\x65\xc0\x2d\x47\x5e\xe6\x68\xde\x5d\xd6\xb7\xf3\x11\xb5\x16\x42\xa8\x5e\x4b\x23\x6d\x3e\x68\x61\x85\x05\xcc\x2a\xa1\xcd\xa9\x02\x81\x04\x5c\x94\x71\xa4\x72\xdc\x8a\x36\x1e\xf7\x11\x32\xa0\x76\xd1\x73\xbc\x84\xdf\xa2\x69\x24\xfd\xfd\x09\x0e\x41\x58\x4a\x70\x70\x66\xb9\xe2\x82\x09\xad\xd9\x5e\x55\xc2\x7b\x49\xa9\xe3\xc2\x61\x57\x49\x25\xb8\x42\x98\xa7\x1a\xd2\x9f\x80\xe3\x33\xbd\xec\x3b\xaf\x31\xc4\xbf\xcc\x58\x8a\x21\xae\x5a\x6f\x8f\x1f\x53\x9e\xfd\xac\xd5\xb8\x5c\xfb\xfe\xa2\xc9\xb1\x9c\x13\xd6\xe4\x67\x64\x5a\x52\xed\xfc\xe3\xc3\xdd\x17\xff\x41\xbf\xd2\xb1\xca\x79\x88\x2c\x44\x1e\x72\x16\xeb\xbc\x5f\x86\xdb\xdc\x2f\x0f\x64\xce\x2e\xef\x59\xec\x99\xab\x2a\x50\xd5\xd0\x13\x08\xc6\x88\x40\x17\x79\x3a\xa6\xa7\x63\xc0\x44\xee\xf2\x32\xfa\x2a\x8d\x3a\x1b\xed\x86\x5a\x11\xbb\x31\x06\xa0\x46\xc0\x45\xdc\x29\xa9\x98\x56\xba\x46\x08\x22\x84\x08\x75\xda\x28\xab\x9c\xc8\x39\x46\xb2\x57\xba\x16\x7b\xa5\x0e\x2a\xcb\xee\x40\x77\xf1\xf5\xfb\xd3\xec\xef\x7f\x85\x00\xbb\x4f\xb0\xbf\x8b\xb1\xdf\x57\x94\xd9\x1f\x1b\xfb\x3d\x7c\x65\xec\xf7\x70\x8b\x00\x7b\xb8\x64\x47\x1f\x3e\xde\xf9\x27\x33\x78\xcd\xb7\x83\x03\xde\x8d\xa3\x8b\xda\x0d\xa2\xf0\xd1\x80\x3d\x63\xdc\xd7\x81\xa0\xd8\x99\xaa\x96\x0c\x2b\xb8\x9b\x6a\x29\xe3\xe8\xc1\x36\xf1\x64\x81\x05\xd9\x6c\xcf\xe7\x0d\xf3\xb3\x9a\x77\x51\x8a\x09\x78\x50\xe7\x53\x32\xf8\x4b\xc2\x4e\x26\x66\x7a\x3e\x5c\x0c\xfe\x7c\x5f\xa3\x64\xf0\x27\x28\x4a\x38\xb0\x31\x6f\x35\x20\x42\x2c\xdd\xa4\x92\x9e\x50\x5e\x27\xcd\x05\x77\xc9\x83\xff\xdd\x74\xef\x2f\xb9\xa2\x5f\xbf\x7f\xc1\x80\x5c\x3e\xfb\xbb\x57\xe0\xaf\x44\x61\xfa\xbd\xe8\xaf\x73\x7f\x3c\xac\x46\x54\xe7\xe2\x87\x31\xa7\x75\x15\xcd\xaa\x7c\x9a\x42\xbe\x9b\xd1\xaa\x0a\x4f\xbb\xb0\x2f\x86\x79\xaa\x4a\x83\xa7\x41\xb8\x96\x83\x52\xc5\xa3\x84\xb0\x54\x8a\x39\xe8\x14\x44\x65\x3c\x46\x4b\x40\x0b\xaa\xaa\x3a\xc4\x2d\x05\xe8\x58\xc3\x76\x2f\x76\xfb\x78\xdc\x38\xc6\xbd\x27\x38\x6e\xe3\xd6\xf0\x78\x3c\x68\x7d\xe8\x4d\x59\x09\xc7\xad\x94\x6c\x67\x5d\x03\xca\xb2\x22\xd4\xfb\xca\x55\x84\x42\xd4\x09\x23\x7b\x5a\x79\xa9\x85\x87\xb5\xa4\x1a\xc9\xec\x3c\x16\xe8\x5d\xb3\x71\xd9\x5f\x65\x34\x31\x86\xfe\x6d\xf6\xef\x93\xd6\xde\x65\x70\x9f\xb3\xb8\x37\x78\xdf\xb4\xbd\xbc\x4e\xad\x8f\xb7\xc8\xc8\xe4\x91\x75\x53\x36\x7c\xb8\x7f\xfb\xf0\xf1\xf1\xe3\xfa\x12\x71\xbf\x9c\x11\xae\xf2\xea\xa9\x03\x59\x8d\x3d\x85\x7b\x8a\x3c\x44\xa0\x8c\x1e\x10\xad\xa7\x30\xf2\xd1\xf9\xc6\xab\x46\x75\xd6\x0d\xf1\x00\x07\x77\xc8\x61\x85\x0e\x4d\xb2\x2b\xdd\x02\xde\xf8\x36\xa2\xc6\xb7\x4b\x1f\xb8\x8e\x60\x44\x39\x5b\xe6\x43\x67\x26\xf7\x9c\x8d\xa2\xb1\x87\xa8\x92\x2d\xb3\x1b\xad\x53\xa3\xd7\x51\xc6\x4e\x80\x00\xf6\xf9\x8e\x90\x59\x2c\x21\x75\x8f\xb4\x73\x5a\x27\x63\x1d\xad\xb3\x3c\xa7\x17\x6f\x81\xff\x74\xae\xbd\xaf\xdf\x7e\xfb\xcf\xc1\x8d\x1b\xee\x6f\x40\x82\xe4\xbf\x42\x00\x16\x69\x0c\xfc\x63\xf0\x7e\x19\x02\x49\x16\xed\xe5\xd6\x5f\x47\xc0\xa5\x92\x7a\x7f\x45\xfa\x5c\x84\x82\xbf\x7f\xfb\xfd\xc7\x8d\x28\x63\x47\x58\xc7\xca\xaa\xb4\x95\x8a\xfb\x56\xc5\xa9\xd8\x45\x82\x30\xc7\xc1\x4a\xc1\xf9\xc8\x0e\x12\x43\x63\x39\x24\x84\x90\x5d\xdc\x53\x40\x77\x55\xd5\xec\xf8\xae\xad\x2b\xa5\x45\x67\x62\xdf\xdb\x0e\x04\x9f\x24\x44\x05\x22\x16\x56\x91\x47\x05\xca\x95\x32\xb0\x46\x25\x2c\x19\xb2\x0c\x33\x5c\x0d\x16\x41\xca\x99\xd6\x14\x1f\x85\xd7\x00\xd7\x52\x5b\x17\x4a\xca\x48\x2f\x8d\xee\x71\xe9\x84\x65\xa6\xaa\x19\xb6\x94\x45\x12\x5b\x0e\x14\x68\x73\x0b\xb8\x72\xd2\x08\xc1\x30\x96\xf2\xff\xa5\xed\x5f\x62\x25\xc7\xf5\x3c\x31\x58\x54\x3c\x8e\x6e\xdf\xe9\x6e\x9d\xca\xca\x4a\x4d\x3f\xe6\xea\x4c\x56\x55\x72\xbe\x79\x11\x37\x27\x33\x39\xdd\x5f\x4f\x73\x3e\xcc\x7c\x20\xbc\x18\xd3\x86\x61\x10\x30\x60\x73\x65\xd0\x80\x01\xd3\x06\x0c\x73\xc9\x25\x97\x5c\x72\xa9\xa5\x96\x5a\x6a\xa9\xa5\x96\xb1\xd4\x32\x96\xb1\xd4\x52\xb7\x32\xc4\x63\x88\x8a\x38\x27\x4e\x56\x65\x75\xf7\x8c\x9d\x89\xd0\x89\x13\x81\xaa\xa4\x28\x89\xfc\x3f\x7e\x0f\x5b\xc4\x35\x74\x1b\xf7\x1d\x1f\xb1\x60\x4b\x26\xf6\x1f\x9f\x74\xff\xd6\x28\xe7\xb6\x2e\xfe\x0b\xaa\xce\xdb\x25\x46\x7d\xca\x23\x6e\x85\xb9\xb7\xb9\x77\x1e\x34\x9f\x13\xe0\xd2\xc3\x92\x40\xe8\xb3\x8b\x16\x6a\x80\x30\x0c\x0a\x04\x6b\x08\x41\x31\x1f\xc1\x31\x94\x29\x0e\x14\x24\x27\x76\x0a\x07\x77\x0a\x07\x06\x48\x13\x58\x0a\x03\x02\x87\x79\x02\xb0\x44\x7b\x1d\xb1\xe5\xd6\x5a\xa0\x68\xcd\x85\x92\x4a\x33\x23\x03\xa3\x1c\x0b\x4c\xca\x28\x3f\x3c\x08\x2b\x40\x11\x34\xd0\x27\x63\x6d\x13\x3f\x8b\xc4\xf8\x4d\x5a\x3e\xf2\xa8\x5b\xfa\x63\xf2\x1f\x23\x27\xeb\xcd\x3e\xde\x04\xaf\x63\x75\xfb\x75\xa4\x67\xc4\x33\xf8\xf0\x74\x1e\xab\xd3\xf3\xb3\x21\xe5\xf7\x3f\x7c\x21\x9c\xf7\xfd\xa7\x55\xe0\x63\x7f\xa0\xc7\x30\xa5\x7c\xae\x01\x9b\xc4\x38\x81\x1c\x08\x16\xfa\xd0\x4f\xc1\x71\xe0\x4f\x43\x38\x72\xc0\xab\x90\xa4\xfc\x70\x44\x69\x86\x3d\xe3\x58\x63\xd6\x2d\x51\xc2\x63\x42\x25\x21\x25\xa5\xf0\x18\x46\x0a\xe8\x38\x30\x2a\xa8\x58\x12\xc9\x42\xdb\xd2\x5a\xe3\x75\x57\x4b\x2b\x86\x83\x55\x55\x3f\x0c\xc6\xf8\xda\xaa\x3c\xb3\x67\x19\xea\x42\x29\xa2\x04\xe3\xde\x09\xa5\xa2\x8c\x2d\xb3\xd2\x69\xd3\x13\x26\x39\x4b\x92\x1d\x98\x1e\xc9\x9d\xdd\x8b\xe4\x8f\x92\x3f\x79\xe2\x4b\x2f\x3b\xc3\x9f\x81\xe5\x5e\xde\x2c\xb1\xf6\x53\xb5\xe9\x4a\x8e\x7d\x2e\x0f\xde\x5d\xe6\xe2\x2d\x58\x6d\x78\x5f\x6f\x58\xef\x24\xdf\x6a\x7f\x6e\x37\x74\xc6\x93\x1f\x47\x6b\x95\xe5\xf2\x18\xbc\x16\xe0\xe0\x02\x72\x35\x06\xf0\x10\x08\xa0\x53\xda\xae\xe4\xe3\x6d\x13\xec\x3c\x04\xba\x64\x7f\x0e\x94\x9b\x24\x30\x00\xab\x70\x92\xd2\x1a\xdd\x42\xaf\xac\xc0\x33\x23\x34\x85\x44\x29\x6b\xcd\xcc\x9d\x1b\x8d\x49\x92\xdd\x56\x44\x9f\x6e\x73\x41\x2a\xfd\xd3\xab\x12\xd8\x97\xa5\x95\x87\xa7\xd6\xfa\xad\x00\x7a\xe3\x00\xe4\x8c\xb0\x52\xe1\x22\x08\x0f\x0a\x03\xaa\x20\x96\x17\xa7\x54\x11\x9e\x3a\x87\xa9\xa1\x7b\x13\x8a\xcf\x92\x8b\xc2\xe5\x74\x0a\x70\xc7\x82\x19\xe7\xea\xb4\xa9\x85\x13\xc6\x30\x54\x2b\xba\x8c\x05\xd4\x8f\xc3\x2e\xbf\xe8\x71\xaf\xf5\xe6\x04\xbc\x79\xea\x1f\x7c\x1f\x27\xf3\xcd\xee\xdd\x0f\xdf\xbc\x7a\x93\xfe\x16\x44\xff\xc5\xa8\xb6\xf2\x6e\x63\x0c\x6a\x9c\xb4\x55\xd3\x2a\x50\xc2\xc8\x63\x43\xf9\x4c\x0a\xd0\x4a\xec\x29\x3f\xa0\xdc\xe6\x48\xe0\xc2\x16\x78\x6f\x96\xa5\x50\xb7\xf6\xe8\xe5\x14\x06\x3b\x23\xa7\x1d\x03\x0c\x30\x14\xea\xc7\x24\xd5\xe3\x04\x41\x76\xca\x4f\xcb\x8f\xe3\x92\xaf\xa5\xf9\x23\xdb\x16\x7b\x18\xfb\xca\x0f\xcb\x54\xdc\xf6\x2f\x5f\x3d\xdc\x3f\xa4\x04\xf4\x61\x28\x01\x47\xd6\x30\x52\x48\x84\x58\xb1\xac\x09\x79\x38\xec\xe1\x5c\x87\x76\x3e\x84\x29\x77\x79\x03\x64\x2a\x23\x97\x7f\xcb\x2e\x3a\x12\x3f\xfe\x1d\x3a\x12\x37\x32\x12\x3c\x24\x51\x51\xba\x0f\x38\xc5\xa1\x2b\x20\xc1\x8a\x73\xe6\x58\xe8\xb9\x19\x0a\xdb\x52\xa1\x9e\x54\x24\xb4\x24\x42\x2b\x52\x2b\x37\xa6\xe5\xec\xf5\xb3\x88\x44\xba\x6d\x1f\x55\xac\x79\xfc\x76\x9d\xe1\x95\x71\x1c\x1b\xcf\x0f\xaf\xc1\x9f\x80\xd7\xdf\x7e\xb7\xac\xe7\x1f\xae\x3e\x41\xff\xe6\x13\x78\xd8\x55\x36\x2f\x40\x15\x90\xa0\xca\x23\x70\x0c\x83\x28\xb1\xa6\xb8\xa8\x73\xee\x74\x63\x24\x28\xc3\xb8\x37\xa5\x92\x3e\x1b\x95\x04\x49\x18\xf5\x3c\x36\x14\x96\x05\x31\xa8\x51\x5c\xb1\x36\xcd\x62\xae\xbe\x9c\x37\x79\xf2\xe5\x49\xd6\x7e\xff\xfd\xdb\xc8\x01\xfc\xfd\x2d\xd1\xed\x87\xfb\x38\xb9\x9b\x8b\x33\xcf\x96\x01\xfc\x98\xa4\x6e\x5a\x52\x0d\x46\x4b\x64\x14\x73\x79\x11\xda\xa0\x4b\x60\x43\xdf\x2f\xb9\x1a\xae\x6b\x40\xea\x4d\x65\x97\x45\xde\xce\x2e\x4c\x19\x23\xb8\xe9\x09\xc1\xa8\xf4\x05\x28\x36\x06\x64\xe7\x64\x4d\x4e\x92\x24\x05\xc3\xc5\xa3\x7a\x97\xe4\x2b\x1f\xfb\xdd\xc7\x95\x66\x12\xe5\xd2\x37\x85\xd7\x83\xea\x08\x92\xa0\x70\x96\xaa\x6a\xaf\x50\x70\x07\x75\x3c\x4f\x14\x1a\x90\x00\x4a\xeb\xfa\x4c\x92\x74\xe3\x2f\x5a\x76\xbf\xa8\xa5\xf7\xe6\x56\x4b\xef\xb6\xc7\xbf\xd3\x3e\xa6\x9b\xfa\xac\xa4\x37\x59\xfc\x45\xba\x0a\xcb\x29\x9c\x38\x62\xae\xce\x7c\x41\xf4\x5e\x87\xc9\x85\xc9\xb9\x55\x4c\xcf\x85\xae\x68\x9c\x6b\xad\x00\x59\x9a\x74\x95\xe5\xc9\xfe\x92\x27\xda\xe8\xcf\xf7\x2f\x93\xf7\xc9\xbf\x8d\x6a\x97\x2f\x14\xe0\x2f\x50\xfc\xf7\xf7\xdf\xbf\x7a\x93\xec\x56\x54\xd2\xfe\x6e\xff\xe4\x20\xba\xb9\xd9\x89\x5e\x5d\x39\x5b\xf1\x75\xa7\xfd\x19\xfb\x34\x2f\x4a\x8f\x4a\xc5\xb9\xa4\xb2\xad\x00\xee\xd4\x63\x12\xaa\x5c\x9f\x48\xe6\x4a\x82\xc3\xd0\xf2\xdc\xd7\x74\xa8\x6a\x2d\x84\x94\x5b\x24\xa9\x21\x2a\xf3\xfe\xcc\x3c\x20\x1e\x90\xdd\x10\xdc\xe9\x04\x14\xc5\x88\x89\x96\x29\xa9\x14\x09\xb6\x03\x99\x08\x55\x53\x30\x0d\x3b\x0c\x21\xa2\xc8\x50\x0a\x34\xed\x95\xb0\xd4\x37\xac\xa9\x66\x1f\x12\x02\xba\xd0\xaf\xc8\xa0\x65\x4f\xcd\x2f\xda\x85\xff\x22\x41\x09\x5e\x6b\x76\x57\x42\xc6\x0d\x31\xe3\xdb\x67\x03\xc2\xbf\x01\x11\x33\xbc\x86\x60\xbb\x0f\x6f\x5f\xef\x2e\x93\xf3\x33\x81\xa9\x35\x34\x7f\xff\x3a\xcd\x0f\xce\x59\x6f\x8d\x3d\x1e\x31\x2a\x55\x46\xb4\x62\x26\x70\x97\xd7\xca\xe6\x87\x4d\xee\xd3\xc9\x7f\x9e\xdc\xb6\x56\x0a\xb3\x52\x62\x16\x06\x1f\x8e\x1e\xb4\x7e\xd7\xf4\x97\x3f\xb6\xa2\xa5\x2a\x2b\x46\x79\x1f\x6a\xc0\xa7\x8a\x9b\x6e\x18\x86\x21\xb4\x5d\x07\x68\xa8\x02\xe1\x3c\xb7\x39\x05\xc5\xdc\xa6\x34\x94\xa9\x74\x2e\x49\xb6\xe0\xf4\x88\x23\xee\x78\xf5\x71\xff\xfd\x17\xd8\xa7\xa7\x52\xf1\xaa\x0f\x7c\x03\x49\x79\x75\x0b\x7d\xa2\x55\x01\x53\x12\xf2\xb2\x48\xeb\x60\x7a\x90\xf0\xd0\x0e\x87\x3e\xd4\x02\x20\x1f\x3c\x38\x90\xa0\x00\x46\x87\x74\x9c\xf3\xe5\x95\x83\x3c\xde\x82\x3e\x3e\xcb\x04\xcf\x82\x10\x37\xf0\xca\x03\x1c\x0e\xb5\x71\xbd\x33\x69\x15\x01\x50\xca\x9e\xdd\x34\xd9\x30\x00\xb8\xf2\x17\x87\x8b\xb6\xf1\x3f\xba\x64\xd3\x71\xbc\xab\x87\xcb\xdd\xbb\xef\xef\x2e\x4e\x44\x2f\xa6\x7a\xd9\xf7\x6e\xef\xb9\x9d\x75\x59\xde\x9e\x78\xdf\xbb\x83\x04\x79\x06\xaa\x58\x44\x20\x8a\xe0\x82\xd2\x32\x6a\x8a\x96\x4a\x55\xc2\xa5\x4c\x2b\x25\xed\x5e\x97\x10\x86\xa1\xf6\x15\x40\xe1\xd4\xa8\x69\xb4\x27\x3b\x1f\x25\xcb\x5d\x41\xd3\xcc\x9e\x02\xe1\xa3\x33\xba\xf7\xbd\xee\xbb\x95\xcf\xa3\x62\x2e\xa3\x93\x1f\x2f\xcc\x88\x55\x11\xea\x29\x45\xbd\x74\x46\x9e\xd1\xb3\xef\xae\xaa\xb6\x51\xc6\xf7\xa9\xc4\x7b\x05\xb2\x3e\xec\x96\xbc\x55\xa5\xb4\x28\x2b\x54\xa6\xc5\x2c\xa5\x32\x86\xd3\x2a\x9c\xc2\x11\x94\x00\x21\x64\x9d\x70\x24\x14\xf3\xb1\x9c\x0e\xde\xc3\xc6\x04\xb2\xad\xfd\x79\x5a\xdb\xd9\xe0\x00\xf0\x79\xba\xbe\x0b\xfd\xee\x40\x10\x66\xdc\x3a\x9e\x17\x84\xe1\x30\x98\x82\x10\xcc\xeb\x9e\x69\x5e\x28\x6e\x8b\x4c\x89\x6a\x46\xe7\x83\x52\x1b\x14\x8e\xce\xb9\xc0\x7c\x24\x10\xa7\x5b\x1d\xe3\xcc\x3c\x79\x1d\x31\xc7\x2b\xab\x7a\x99\xf0\x6b\xfa\x11\xf5\x6f\xe2\xdc\x6f\xf5\xa6\x0c\x2d\x28\xa5\x80\xc8\xc5\x62\x70\x0b\x06\x5c\x90\x7d\xee\xc3\x78\xb6\x8c\xe7\x61\xdc\xba\x33\xdf\xc6\x42\xd9\x9c\x64\x34\x8d\xf3\x97\x6e\xab\x8b\x96\xd6\xe5\x1a\xef\xbe\x7b\xfd\xc3\x9b\xdd\x65\xcb\x7a\xf3\x4f\xc0\xfb\x1f\x3f\xbc\x49\xdf\xfe\xd3\xcd\x25\xb2\xbf\x7b\xf7\x69\x73\xf7\xee\xd3\x8f\xf7\xef\xff\xfc\xd2\x5b\x80\x79\x38\x66\x80\xe6\xa1\xcd\x4a\x82\xad\x50\xa8\x80\x79\xe6\xa1\x14\xc6\xd6\xbc\x37\xb8\x38\x14\x43\xee\x8a\x3a\xab\xb2\x8a\x12\x8d\xe9\x2e\x77\xc4\x29\xee\xb8\x33\xca\x90\x93\xd7\x08\x3b\x4b\x82\x06\xa5\xe5\x5e\xda\xe6\x40\x1c\x01\x09\xf4\xb0\x07\x49\xe0\xc0\x73\xc5\xa5\x88\x9c\x05\xf2\x48\xb7\xcb\x3e\xb7\x5e\xe5\xff\xdf\x45\x5d\xf4\x46\xa5\xe4\x49\xec\xeb\x97\x93\xb4\xab\x4b\x60\x4c\x73\x3f\xbc\xfd\xcb\xf4\xd2\x0f\xb9\xf6\x45\x6a\x86\x2b\x41\x1c\x26\x53\x68\xc0\x92\x89\x9f\x1a\x2b\xa4\xb2\xce\x72\x27\x0f\xaa\x3b\x84\x09\x64\x7d\x3f\x81\x04\x13\x60\x9d\xb3\x36\x08\x67\xed\x5e\x2f\xd1\x35\x63\xd8\xba\x70\x72\x61\xc0\x46\x1b\xc9\x83\x8e\x60\x0b\x57\x59\xd3\x1c\x6d\xe5\x9c\x75\x96\xd2\xc0\x2f\x2d\xf9\x70\xac\xaa\x2a\x62\x01\xf6\x60\x7c\xd4\x77\xe6\xe2\x25\xf4\xe6\xa2\x78\xfe\xa5\x33\xcd\xba\xfb\x2c\x57\xfc\xfd\xfd\xdb\xdd\xaa\xc2\x18\xf9\xbd\x1b\xe3\x98\x61\x6e\x43\xac\x36\xca\x9d\xdd\xf6\x18\x24\x68\x7f\x52\xe0\x14\x6a\x30\x76\x5d\xca\x3c\xe7\x4e\x9d\xb5\x2c\x2d\x94\x7b\xa9\x1d\xb3\x86\xb1\x5a\x4a\x35\xba\xcf\xb5\x73\x5b\xfe\xb9\xde\xf2\x16\x06\xfd\x98\x40\x40\x97\xa5\x21\x74\x10\xb0\x65\x25\x00\x60\x7a\xe4\xdb\x7a\x2f\x57\x8d\xfd\xaf\x48\x79\x44\xba\xed\x96\x11\xa9\xc7\xd1\x49\x49\xa9\x63\x5a\xf4\xe2\x74\xe2\x02\x03\xb8\x97\x06\x96\xa1\x73\x95\x36\x4e\x89\xf3\x71\x93\xf4\xb5\x5e\x62\x7e\x07\xca\x22\x77\x70\xbd\x0f\x65\xf4\x11\x31\xc9\x1f\x25\xf8\x29\x86\x89\x6d\x98\xe7\x8e\xef\x87\xbb\xfb\xb7\xf7\x77\xf7\xd1\xf7\xf0\xd3\xbf\x03\x31\x3b\x8d\x18\xdc\xbb\x77\x9f\x3e\xbc\x7f\xfd\xe9\xfe\xfd\xfd\x8e\xbb\x02\x82\xd3\x7c\x22\x4a\x54\xa9\x26\xac\x84\x65\x09\xf3\x5c\x5b\x59\x64\xa5\x94\xbc\xcc\x5d\xe9\x42\x8f\x04\x81\x90\x39\x69\x97\x10\x47\xb8\xca\xaa\x53\x68\xe7\xd3\x29\xf3\x59\x7f\x80\x73\x93\x96\xe5\xec\x69\x96\x65\xc4\x93\x13\xa5\x3c\x55\xb9\x29\x4f\x2d\x04\x3a\xca\x46\x25\x69\x3a\x3e\xca\x18\x1f\xfc\x66\x1d\xef\xcf\x87\xfb\xe9\xe3\xab\xcb\x78\xbf\x7b\xff\x70\xf5\x69\x7c\x1a\xef\xfd\x3a\xde\x2d\xf5\x24\x3d\x9c\x8f\xca\xca\x61\xa3\x99\x44\xa4\xc4\xa8\xcc\x8a\xec\xe0\xfb\x92\x82\x84\x1b\x96\xfb\xb2\x9a\x47\xac\x99\x84\xce\xf7\x7e\xaf\x61\xeb\x7b\xad\x8e\xe1\x38\x1f\x4e\x59\x95\x21\x09\x72\x3c\xb7\x29\x44\x73\x87\xcb\x8c\x78\x7a\x10\x4c\xa4\xa2\xb0\x10\x14\x23\x02\x32\x74\xcb\x78\x57\x5c\xd3\xcf\xe6\xf7\xfb\x17\x03\xde\x5d\x07\xbc\xce\x6f\xba\xbf\x19\xef\xfd\xf2\xda\x9c\x3c\xc4\x1b\x7c\x56\x95\x96\xa0\xd8\xb4\x5c\x51\x56\x52\x56\xe6\x45\x16\x46\x7f\x62\x47\xe7\x0d\xca\x3d\xac\x03\x93\x47\xd3\xc0\xc1\x9f\xfc\xde\x94\x5a\xf8\x81\xab\x29\xb4\x73\x3b\xe4\x55\x8e\x35\x48\xd8\xdc\xa7\x39\x99\x8f\xb8\xcc\x32\x5e\x91\xc7\x84\x33\x9e\x22\x68\x31\xe0\x61\xa0\x80\x86\xe3\x8a\x93\x91\x8f\x64\x4b\x23\x0e\xe9\x9f\x3e\xf5\xae\xee\xbe\x50\x24\xfc\xf8\x01\x3c\x5c\xa4\x98\xdf\xa6\xcc\x69\xa2\x65\xdd\x3a\xad\x0c\x93\xb1\x09\x59\x94\x81\x03\xd5\x39\xd1\xd3\xc3\xde\xcc\x83\xd2\xa2\xb1\xe3\xb1\x3a\xb5\x33\xd6\xbc\xf0\x79\x41\xb6\xcc\xaa\xb9\xeb\x1c\x28\x41\x17\xff\x5d\xf6\x48\x36\x87\x7f\xc8\xbf\x5b\x78\xc9\xa4\xb1\x4e\x49\xce\x99\x8a\xee\xaa\xb0\x08\x02\xe8\xd6\xc8\x03\x3e\xee\xcd\xdc\x4b\xa7\x5b\xd9\xd4\xbe\x36\x33\x8a\x26\x2a\x10\x6f\x99\xd6\x73\xd7\x69\xc0\x22\x30\xe8\x2e\x11\x8f\x74\x8b\xf7\x26\xea\x75\xdd\x68\x85\x3c\xa9\x32\xbd\xbd\xd5\xec\x7a\xf8\x0e\x5c\xa5\x42\x7e\x78\xb3\x44\xd8\x17\xad\x90\x2f\x20\x9a\x06\xf0\xbc\x74\xa8\x00\xae\x86\xd3\x19\x8d\x45\x59\x01\xd5\xc2\x70\x2a\xc3\x61\x83\x43\x13\x9b\x22\xa6\x08\x32\x64\x18\x44\xad\xef\xd0\xd8\x5b\xdc\xe6\xee\x14\x55\x42\x6c\x63\x2d\xe7\x4d\xc3\x43\x37\x37\xc2\x1a\x6c\x28\xb6\xc8\x59\x11\x09\xcd\x57\xa1\x90\x7d\xc2\x1e\xf1\xd6\xed\x6d\x92\x27\x0f\xd1\x17\xe1\xbf\x8a\x15\xc6\x37\x5f\x38\x02\xef\x6e\x3f\x58\x9e\x9d\xbb\x37\xfb\xbb\xed\x53\xad\xfd\xc7\x0f\xcf\xd8\x86\x77\x9f\xbe\x7b\x75\x51\xbd\xd8\x3f\xa9\x5e\x80\xd1\x71\xee\x2b\xa6\x34\xd3\x79\x1e\xc6\x70\x28\x1d\xf0\x16\x12\x4a\x4b\x49\x91\xc9\x33\x5f\x97\xcc\xc9\x2c\x07\x79\xc7\xdb\x30\xd5\x61\x20\x20\xb3\x99\xaf\x20\x27\x96\x60\xca\x90\xc6\xd8\x54\xa1\x67\x00\x02\xa2\xc7\xc0\x39\xa8\x81\xa8\xc2\x69\x76\x2c\xa5\x7b\x0b\x2b\x96\x43\x41\x8c\x27\x25\xc4\x85\x92\x07\x28\x74\x5e\x70\x64\x6b\x8c\x31\xca\x35\x6f\x60\x5e\x28\xa7\x2b\x5d\x0b\xc3\x4c\x59\xa2\x5c\xcb\x03\xac\x59\x56\x5a\xa8\x83\xf8\x25\xb9\x8b\x64\x9b\x98\x94\xdc\xa9\xbd\x7f\xaa\xbf\xfe\x52\xf5\xf5\x12\x9a\x6c\x33\x52\x6e\xb2\x3f\x94\x1b\x58\xa2\x90\xed\xf2\x9f\xc6\xd5\x15\x55\xfa\x9f\x88\xdf\x7b\xca\xac\xc5\x28\xb4\xa1\xd1\x22\x0c\xa1\xeb\x3a\x40\x56\x4c\xa0\xda\xba\x18\x17\xfd\xa2\x2f\xbc\x4f\x0f\x33\x8a\xbe\xf0\xca\x03\xbe\xd7\xc2\x2a\xe7\x40\xb9\x3e\x73\xcb\x7f\x4b\xbe\xea\x29\xdf\x54\x69\x35\x8b\x0d\x99\x8e\x80\x54\x40\xec\xb5\xb5\xce\xfb\x8b\x9c\x5e\xb2\x49\xd8\x23\xdd\xba\xbd\xba\xf5\x33\x7a\x82\xe6\xfc\x0c\x46\x79\xff\x0b\x30\xca\xdb\x7d\x0f\x08\xc9\xb8\x52\x5a\x57\x86\x75\x66\x18\xba\xda\x18\xe7\x6a\x80\xe9\xe7\x8e\xaa\xb4\xe8\x2a\xe5\xdb\xd0\x79\xdf\xe8\x76\xaf\x14\x43\x83\x9d\xec\x63\xcc\xaa\xd3\x3c\xad\x0f\xfa\x38\x2b\x90\xd8\xc9\x82\xcc\x7e\x96\xd6\x6e\x31\xfe\xe9\x64\x6a\xd3\x6a\x45\x4f\x5a\xd9\x64\x93\xd0\x47\xbc\xed\xf7\x36\xf9\x97\xc9\x7f\x8a\x6e\xc4\xcf\xb6\x1d\xb1\x5a\xf9\xe9\xcd\xdd\xeb\x6f\x6f\x3d\xac\xa2\xc5\xe3\x85\x18\xfe\xb0\x79\xb8\xdf\xad\x44\xb0\xfb\xe7\x18\xe4\xb6\xd2\xb2\x92\x8f\x52\xec\xa3\xac\xdc\x28\x54\x99\x87\x7a\xcc\x26\x63\x51\x66\x72\x3e\x74\xbc\x2a\xda\xa3\xb1\x1a\xe8\x23\x10\x8f\x09\x02\x16\x30\xec\x6b\x8c\x4b\x07\x51\x1d\x1c\x95\x0c\x17\x8c\xe5\xa1\x3a\xa0\x42\x15\x68\x6f\xb9\xd6\x1a\x79\x8e\xb0\x29\x75\x89\x10\x14\xa5\xa7\x98\xd2\x42\x17\x6e\x3e\x04\x1c\x1c\x03\x0a\xd4\xa9\xf9\x3c\x80\xa4\x34\x25\x56\x65\x11\x46\xa3\x91\xe2\xa6\xe3\x34\x37\x39\xae\x01\x23\x0c\xf2\xa8\x87\x13\xaf\x57\xb1\xb7\xd1\x1f\xed\x96\xe1\xbd\xbf\xbb\xee\x11\xab\x12\xd3\x2d\x58\xeb\x65\x60\xf5\xf0\xf1\xd3\x45\x04\x3c\xef\xaa\x4a\x2b\x69\xb5\x14\xc6\x31\x66\x8a\x12\x4c\xf3\x01\xd1\xde\x01\x22\x78\x09\x4b\x52\xa2\xc6\x55\x0e\x21\xee\xc4\x00\x0a\x58\x4c\xb4\xea\x8c\xdb\x33\xca\xa5\x12\x42\x52\x66\x25\x47\x25\x64\xc4\x4a\x55\x55\x01\x72\x91\xbb\x9c\x02\x34\xe3\xb4\x9f\xfb\xb4\x20\xc8\x36\xad\x65\x5c\x19\xac\x08\x49\x92\xed\x76\x78\xa4\x77\xc3\x1e\x3d\x69\x80\x25\xb1\xbc\xf5\x92\xa3\x73\x45\x8a\xdd\x22\x99\x65\x9a\xc8\x6c\x09\x55\x75\x4e\x85\x20\x94\x0c\xb4\x41\xec\x82\x4b\xde\xa3\xcf\x2e\xb0\x32\x87\x1d\x3a\x0a\xc2\xc1\x21\xc0\xca\x58\xa0\x36\x65\x37\x4f\xfd\x3c\xf6\xab\x86\xd5\xf0\xe8\xee\xfc\xbe\xf8\x99\xd7\xdc\xfb\x24\xf9\xe1\xa9\xbf\xf8\xec\x79\xfc\xea\x4b\x15\x8a\x2f\x7e\x4f\x87\x34\x0b\x39\x18\x43\xb6\xb5\x21\x49\xb3\x79\x4a\xe1\x67\x82\x81\x0c\x5e\x19\x93\x8a\xe5\x8d\x36\xe6\xdc\x7e\xf9\x49\x99\x1a\x97\x0a\x6b\xe7\xca\xcd\xc6\xed\xaa\x20\x65\x2f\x97\xc3\xac\x82\x90\x07\xb9\x1c\x92\x64\x97\xda\x58\x1b\x7c\xf6\x50\xfe\xf7\x97\x48\xe0\x97\xfa\x79\xf7\x6b\x33\xef\x35\xb8\xbc\x36\x6b\xf1\xe0\xc5\x6d\x10\xfd\x96\x37\xce\xe6\x05\xc8\xf3\xd2\xc1\x12\xb4\x01\x83\x88\x68\x0b\x1a\x9c\x3e\xb7\x4c\xd4\x60\x78\x26\xbe\x0f\x60\xa8\xc1\x48\x24\x23\x05\xe3\x79\x17\x60\xed\xf7\xb2\xa4\xab\xd7\x9c\xd5\xf1\x6f\x9a\x68\x75\x64\x5a\x3f\x26\xd7\x57\xc4\x6c\x12\xb1\x24\x81\x04\xc0\xd8\x6b\xcd\xa3\xd6\x7e\x6a\x63\xed\xc9\x24\x7f\x76\xa9\x90\xfc\xed\x53\xad\xfa\xee\x21\x05\xef\x92\x57\x6f\xaf\x6a\x05\x57\xe7\x86\xdd\x5a\xa6\x7f\xfb\x94\xc8\xbe\xba\xb8\x20\x7d\x8d\x25\xb8\xe9\x6c\x24\xf5\x07\xa2\x81\x85\x4d\xc9\x30\x43\x18\x51\x22\x30\x2a\x72\x7d\x04\x83\xb7\x20\x39\x91\x51\xb6\x9c\x4d\x0a\x94\xc8\x82\x8e\x21\x03\x99\x16\xb4\xc2\xfc\x7c\xf2\x94\x7b\x99\xf6\x04\xf9\x92\x38\x9c\x57\x39\xdc\x1b\x28\xf8\xec\x43\x2e\x41\x05\x7a\x86\x90\x46\x50\x60\x2c\x31\x2c\x4b\x0e\x38\x06\x55\x10\x2e\xd8\xc1\x76\x00\x87\xb6\x51\x1d\xa8\xd3\x5c\x1a\xaa\xd5\x67\xdc\x0c\xf4\xd8\x60\x34\xd5\xac\xf3\xbe\x23\x9d\x47\x4d\x83\xba\x3a\xd9\x6e\xd9\x45\xc7\xfa\x2f\x22\xca\xe7\xc3\xb2\x92\xdd\xe8\xad\x3c\xf9\x06\x5f\xea\x25\x5f\x85\xda\x6d\xbb\xb6\xcc\x5d\x9e\x03\x13\x68\x59\x82\xc3\x04\xd0\x5c\x02\xd8\x52\x89\x9d\x30\x69\xcd\x45\xac\x8c\xa0\xd0\x3a\x77\xd5\x0c\xd8\x27\x84\x42\x0c\x2d\x41\xda\x69\xed\x38\xd1\xb2\x9a\xeb\xf3\x24\x64\x5e\xe5\x8c\x87\x66\x33\x84\xc9\x04\xed\x92\x64\x1f\xfd\x07\x96\x38\xf4\x9a\xeb\xfc\x2e\x8e\xf5\x76\xf6\xa3\x36\xf9\x5a\xe6\x7a\xe6\xa3\x3f\x63\xb0\x2e\x2a\x5d\xdf\x7f\x7a\xd8\x74\x5a\x4a\xa9\x36\xca\x70\x23\x74\xd0\x1e\x8c\xfe\xdc\x7a\x30\x86\x21\x3d\xcd\x85\x07\x6d\xa0\xa1\x02\x27\x9f\x26\x41\xd4\x20\xe1\x8f\x49\xe3\xab\x49\x82\xc4\x07\xb3\x37\x94\x6b\x45\x05\x33\x54\x31\x16\x86\x60\x4f\x23\x30\x61\x0a\xcc\x56\x81\x48\x69\x4f\x32\x92\x82\x4b\x70\x0a\x63\x65\xfc\x31\xf9\x4d\xac\x35\xd4\x4f\x58\xc1\xeb\x53\xf4\xd7\x09\x79\x89\x32\x00\xab\xf1\x51\x14\x94\xd9\xbd\xfb\x74\xff\x76\x77\x2b\x24\xb3\x9c\xda\x4b\x14\xfd\x9b\xa8\x5f\x0a\x37\xd3\x39\xab\xd2\x76\xa6\xcb\x2b\x74\xbb\x62\x36\xaa\xb0\x7e\x0c\x53\xe9\x34\xc8\xa6\xf8\x07\x9c\x70\x8a\x2d\x12\x96\x3a\x29\x94\x30\x5c\xb4\x0c\x1e\xcb\x3d\x99\x0f\x80\xc9\xd0\x89\x70\xb0\xb3\xce\x4d\x31\x74\xb0\x74\x79\x7a\xa8\xe2\xdd\xc4\x4a\x0b\x90\xb5\x45\x68\xa9\xa1\x8e\x39\x23\xac\x54\x0d\x72\xae\x4a\x92\xdf\xa6\x6b\x1f\x14\xc6\x3a\xfd\xb7\xc9\x3f\xbe\xd4\xa8\xfe\x3f\x4f\xfe\xb2\x77\xef\x5f\xbf\xbd\x8b\x4e\xa8\x9f\xde\xdc\x3d\x7c\x7a\xff\xed\xdd\xc3\xa7\xbb\x87\xfd\xdd\x3f\x03\x1f\x3f\xbd\xfd\xd3\x5f\x93\x12\xbc\xe3\xa5\xd0\xe5\xb9\x84\xc6\x97\x2e\x07\x49\x1e\x0f\xf0\x31\xc9\x72\x90\x05\x91\x67\x53\x5e\x2d\xe7\xed\xd3\x3e\x2e\xf1\xf1\xe5\xc5\x61\x62\xc7\x94\x8d\x07\xd5\x9f\xf6\xf0\x60\x8f\x47\x7b\x50\x42\x20\x24\x4e\x18\x63\xac\x0e\xe7\x63\x8a\xe3\xc9\x76\xf2\x31\xd1\x1c\x3b\x48\x09\x33\x9c\x24\xbf\x8d\x3c\x97\xeb\xb9\xbc\x4a\x8a\x1b\x5f\xca\xf7\x51\x95\xf5\xc5\xb9\xbc\xff\xf4\xfe\xee\xfd\xa7\xbb\xb7\xfb\xbb\xf7\x0f\x7f\xe7\xa9\x88\x92\xab\xf2\x4c\xa1\xb6\xd0\xe6\x63\xee\xf2\x31\x87\xa7\x3c\x1b\x83\xce\xb3\x53\x5e\x6d\x0e\x67\xe4\x97\xd8\xe8\xfa\x72\xa2\x1f\xe9\x21\xc5\xa7\x4e\xb5\xc3\xcd\x69\x88\xaf\x9e\x45\xc9\xd6\xb3\x48\x92\x3d\x98\x2e\x78\xcf\x7f\xfc\x42\x83\xea\xab\xea\x53\xe0\xda\x6f\xbc\x59\xc5\x9e\x35\xa8\xd2\x3a\x6d\x24\xa9\xb1\x02\x74\x3e\x81\x2e\x90\x94\x7c\x4e\xd2\xf2\x22\x15\x40\x19\x74\x90\x6d\x8c\xc6\x15\x16\x67\xe1\xb9\xf4\x66\x93\x89\x8a\xd6\xd8\xa3\x5d\xe9\x3a\x6c\x9d\x9b\xdc\x14\x0f\xe0\xa0\x0c\xb2\xf2\xa7\x43\xdd\xe3\x43\x0d\xd1\xc9\xb3\xc6\xd5\x4d\xd1\xbb\xa2\xe9\xf2\xbe\x4a\x92\x7d\xca\xfe\x1f\x1d\xfb\x98\x1a\x81\x1b\x2c\x01\x0e\x19\xa8\x03\x4f\xcb\xcf\x14\x4c\x51\xa9\x1d\x03\xc4\x50\x05\xd9\x46\x49\x54\x21\x7e\xf6\x8e\x0a\xaf\xd2\x13\xaf\xa8\xc7\xbe\xdc\x95\xbe\xc5\xce\xde\x8c\x5d\x1a\xfc\xab\x63\x07\x9b\xe2\xb2\xa7\xc0\x24\x01\x4f\x2a\x47\xf7\xef\x3f\x7e\xb8\x7f\x7f\xff\x6d\xec\xf3\xc5\x02\xd2\xfd\x0a\xef\x5d\x11\x78\x1b\x55\x29\x25\x4d\x5d\x8f\x59\x95\x83\xb2\xaa\x3a\x20\x82\xac\x00\x13\xc1\x5b\x1b\x2a\x0e\xb8\x0c\x7e\x67\x30\xd7\x0c\x9e\x5c\xe8\x09\xd9\xb8\xb3\x22\x04\x60\x37\xba\x33\x0c\xbe\x76\x07\xa0\x42\x7d\xb2\xa7\xd5\x47\x06\x6c\xc7\x8b\xdf\xc4\x9b\x24\xd9\xbd\xbd\x7f\xa2\xb5\x45\xc1\xf8\x58\xf7\xf9\xf0\x6e\x5f\x3b\xa2\x55\x47\xaa\xde\x1d\x3c\xf2\x8a\xa3\xac\xdb\xd4\xa1\x0d\xa3\x02\x1a\x8c\x76\xd9\x85\x6d\xa0\x81\x29\x90\x80\x3c\xcf\x63\x9d\x7d\x88\x7c\x02\x1d\xf5\x7e\x7f\x1f\x9f\x88\x9b\xdc\xe3\x25\xe2\x01\xfc\xb8\x2a\x0c\xac\xd4\x82\x1b\x6a\x17\x58\xb1\x00\x3b\x89\x0a\xd0\x7d\x3e\x81\xb6\x80\x41\x82\x1c\x22\x4b\xca\x91\xa0\x0a\x11\x50\x7e\x6e\x40\xe5\x1b\x4e\xc2\x04\x18\xa9\x70\x6a\x3a\xaa\xdb\x4a\xb8\xe3\x10\x24\x07\x38\x2d\x42\x83\xb1\xd5\x7a\xaf\xb9\xb2\x96\x93\xb9\xd2\x12\x6a\x67\x2d\x32\xc2\xce\x39\x21\xd6\xb8\x2a\x77\xee\xe8\x18\xb7\x5c\x7a\x54\x15\x60\x54\x0c\x21\xb9\xf2\x2f\xab\xa7\x7e\xc1\x8d\xc6\xf9\x0b\x91\x95\xfb\x1b\x4d\xc7\xef\x5f\xdd\x5f\x98\x01\xdb\x02\x30\x1f\x13\x5e\x25\x38\x44\x90\x41\x38\xb4\x23\x3f\x18\x5f\x1d\x38\xc8\xdb\x58\x1b\x6f\x76\x4d\xdf\xbb\x36\x70\xce\x33\x97\xd1\x31\x74\xc1\xd8\xca\x83\x6c\x6e\x53\x12\x8e\xce\x75\x40\x02\x1a\xf2\xd4\xb4\x49\x92\x26\x24\xea\x68\x98\x55\xe3\xe4\xd5\x57\x46\x13\xc7\xf1\xf1\x69\x1c\xeb\xed\xee\x00\xf1\x80\x87\x1a\xf0\xeb\x60\x3a\xef\x6a\x3e\x56\xce\x03\x18\xba\x54\x47\xd1\xd8\x5d\x1b\x47\x23\xe2\x68\xc8\xf8\x59\xa6\x30\x1c\x8d\xed\x01\x07\x32\x64\xa9\x6d\xcf\x9d\x5e\x16\xf5\x25\xc6\x3b\x5d\xf4\xbe\xff\x38\x79\x95\xfc\xc5\xa5\x23\x17\x45\x55\x96\x8b\x9a\xec\xee\xbe\xbf\xa2\xdb\x2e\x78\x8c\x57\xaf\x63\x1c\xf7\x37\xe0\xfe\xe1\x7e\x87\xfa\x70\x92\xc3\x49\xfa\x3c\x4a\x46\x88\x30\x86\x93\x20\x1e\xf3\xd0\x6f\x9c\xef\x8c\x93\x33\x73\x7e\x73\x70\x33\xdf\xb9\x30\xd6\xca\x4d\x6d\x89\x60\x98\x6c\xe5\xac\x50\x5c\xc9\x51\x0d\x96\x4b\x73\x36\x22\xf5\xb3\xe2\x16\xc0\x30\x2c\xd7\x6b\x57\x3e\x56\x17\x8d\xda\x67\xbf\x8a\x8b\x9b\xcb\xae\x1c\xfd\x34\xf5\xf3\xe1\x30\x6e\x49\x8a\xe7\xde\x9f\x9d\xf7\x1b\x95\xac\x9a\x76\x6b\x1f\xe2\xd5\x8a\x03\x7e\xfd\x84\x51\x7b\x7d\xd1\x4e\x04\x0f\x1f\xae\xfe\x45\x3f\xeb\x48\xec\x90\x8f\x98\xb1\xd6\xcf\xc8\x83\x26\xa2\xc7\x28\xe8\x94\x08\x28\xb5\xd2\x2e\x49\x19\xe3\x42\x14\x4c\xa2\x40\xf6\xba\x71\x4d\xe8\x9b\x06\xe0\xc6\x7d\x3e\x6a\x21\xac\xb7\x1a\xba\xd0\x53\x9a\xbb\xbc\x04\xc5\x32\x1e\x74\x79\x7e\xd6\xf1\x3c\x5f\xeb\xa7\x11\xbd\xfa\xc5\x91\x7c\x88\xa3\xdc\x08\xe0\x57\x17\xe1\xa1\x9a\xf3\x0a\xb4\x41\x56\x69\xad\x97\x00\x25\x11\x82\xb3\x82\x70\xb6\x2c\xca\x5a\x86\x72\xd7\x37\xcb\x78\x8e\xde\x83\xb2\x09\xc8\x1b\x85\x7d\x18\x28\x2b\x7c\x51\x82\xcc\x5b\xce\x23\x4e\x63\x8c\x3d\x02\x94\x7c\x17\xfd\x55\x62\x97\x60\x7f\xf7\x1c\x41\x5d\x94\x10\x97\xd4\xe3\x12\xd0\x92\x6d\x19\x68\x9e\x03\xe7\x67\xeb\x81\x39\xf4\x12\xc8\x3a\x90\x3e\x56\xab\xa7\xa1\x53\xcd\xb0\x47\xae\x28\x67\x74\x6e\x8c\xd9\x30\x30\x4c\xd6\x8c\x80\xfc\xd4\x82\x26\x9d\xaa\x5e\x1f\xfc\xb2\xc6\xfb\x47\x7a\x27\xa2\x47\xd0\x6f\xa3\xfe\xe4\x9f\x27\x0f\x17\x9f\xa0\xf7\xf7\x39\x78\x97\xdc\x2f\xef\x37\xab\x67\xd0\xd5\x39\xe8\xee\xdd\x37\xfb\xde\xfb\xf3\xe0\xa2\x99\x2e\x70\xce\x29\x94\x99\xac\x4c\x73\x9c\x9b\x1c\xce\x85\xca\xb1\xc2\x7b\x3d\x1d\xee\x8a\xb3\x98\x8f\xa1\x96\x80\x80\xc3\x46\xff\x81\xed\xca\x30\x86\x11\x02\x08\xb2\x3c\x4c\xeb\xbb\x24\x2b\xc2\x71\xc2\x60\x99\x87\xee\x91\xdd\xc9\x4b\x6c\xf6\xbb\xab\x92\xd1\xfd\xc3\x26\xae\x5e\x37\xac\xa1\x0b\x3f\x79\xd3\x6c\xcc\xd9\x44\x67\xe9\x23\x28\xf3\x2a\x4f\x89\x6e\xb8\x2e\x8d\x60\x38\x0f\x94\x07\x46\x81\x60\x61\xda\x93\x59\x3b\x20\xe7\xbc\x2d\xaa\xd9\x4e\x65\x55\x3a\xd0\xcc\x5d\xe5\x1c\x58\xf5\xd3\xcd\xa3\xbd\xd3\x9b\x5b\xfe\xc8\xfd\xc3\xfd\xc5\xd9\x2b\x5e\x0c\xff\xd3\x61\xeb\xce\xf9\x66\xfc\xc9\xee\xa7\x3f\x64\x1b\x32\xb3\xb4\x09\x27\xe7\xac\xb5\xc1\xf8\x25\x8f\xf1\x17\x6f\x43\x1c\x91\x68\xff\xe1\x19\x8f\x79\xab\xce\xf6\xa4\xac\x1b\xfb\xa0\x2f\xa3\xf7\x65\x67\x78\x78\xea\x6f\xc4\x1e\xd6\xfd\x4b\xd9\xdd\xb5\xaf\x75\x88\xfc\xc5\x68\x93\x37\x8e\x80\xcf\x3d\x38\x28\x25\x15\x93\xa5\xa3\x74\xce\xbd\x31\xa0\x9d\x47\x80\xfa\x3e\x1c\x41\x1b\x99\x8e\x65\x38\x0e\xf1\x4d\x03\xc8\x9c\x5f\xdf\x85\x6e\x9f\x68\x6d\x8c\x55\xcb\xdf\xf9\x60\xe4\x4a\xaf\xa1\x61\x00\xd0\xa4\x28\x7e\xac\x54\xf0\x6a\x36\xde\xfb\xc0\xdc\x45\x4b\x26\x45\x8f\x74\xc7\xa3\x1f\xf2\xb3\x92\xfb\x2d\x00\xfc\x59\x15\x75\x09\x99\x1f\x6e\x39\x60\xcb\xcf\xd4\x82\xc4\x46\x78\x6d\xf2\x98\x2c\xc9\x87\x5d\x16\xcf\x71\x7c\x4c\xbc\x94\xa3\x0e\xf1\xb8\xeb\xeb\xda\xda\x39\xb3\x36\xf6\x18\x6d\x3a\xd9\x40\xab\xaa\x0a\xb0\x69\x9a\x64\x93\xa8\x0d\x7d\xf2\x72\xfa\xdd\x8a\x6d\x7a\xf7\xfd\x0f\x11\xd3\xf4\x3b\x10\x45\x7d\x96\xdf\xde\x5d\x5a\x86\x1f\x53\x6b\x4e\xa1\x95\x00\x6e\x2c\xc0\x00\xf2\x30\x84\x9e\x3b\x6d\x81\x06\x86\x85\x2c\x34\x61\x9c\x0f\x0c\x74\xa0\x70\x4a\xdb\xba\xda\x6b\x31\x58\xa7\x3a\xde\xb8\x5e\x28\x2a\x99\xc6\x8e\x3b\x27\x1d\x93\x8c\x73\xc1\xd8\xb2\x0f\xd7\x17\x9e\xca\x0f\xd7\x8a\xc1\xad\x5a\xf9\xa5\xe2\x94\x5e\xaa\x17\x71\xf9\x8e\xe0\xa2\xbb\x87\x8f\x9f\x1e\xf6\xaf\x1e\xee\xff\xd9\x72\x9b\x6d\xe5\xb2\x16\x9c\x18\x07\x3c\x1c\x98\x84\x99\xcb\x21\xad\x2b\xda\xe6\x81\xaa\xa1\xc9\x5b\x26\x41\x5e\x00\x2b\x68\x30\x22\xbb\xea\x27\xef\x4d\x49\x88\xb5\x62\xf6\x01\x51\x76\x84\x27\x0b\x89\x4c\x93\x50\x1c\xb4\x9a\x86\x14\x12\x39\x74\x52\xfb\xf9\xb4\xc2\xc0\x13\x90\xa8\xc7\x7e\xc3\xf6\x66\x79\xc2\x5f\x5d\xd7\xee\x17\x1c\xd9\x95\x92\x11\x23\xe7\xb7\x3e\xda\x09\x17\xe1\xa4\x55\x55\x43\x64\x15\xf2\x59\x7e\x7a\x4c\x90\x15\x8f\x09\x28\xc6\x1d\x5f\xf6\x84\x88\xdb\xb7\xbe\x60\xce\x2c\x0f\xf6\x11\x72\x2a\xe0\xb2\xad\xae\x04\xd9\xdf\x44\xdf\x76\xfb\x02\xa7\xfc\xef\x2f\x78\xdd\x5f\xc5\x29\xbf\xbe\xe2\x95\xdf\xec\xef\xde\x7f\xdd\x4d\xf2\xc3\xc3\xb7\x6f\x9f\x60\xca\x9b\x72\x9b\x04\x96\x16\x2e\x68\x17\x8c\x4f\x8b\x40\xd2\x68\x4e\x33\x8f\xd7\x47\x20\xcd\x97\xdf\xc3\x92\x19\x8f\xc8\xc1\x12\x54\x81\x3f\x15\x3a\xfa\x33\xf7\x44\x76\xa0\x0f\x5d\xf6\x94\x13\xff\x22\x44\x59\xa9\x12\xc2\x92\x41\x4c\xac\x34\x2b\x42\x99\x12\xd1\x48\x99\x89\x53\x04\x28\xdf\xc5\x75\xd5\xed\x69\xf2\x9b\xe4\x2f\x2f\xeb\xc0\x7f\x97\xf0\x5b\x75\xce\xbf\x2f\x3c\xf9\x59\x63\xfa\xef\x92\xa8\x84\xde\xba\xc6\x2f\x09\x62\x5d\xdb\x70\xb0\x1e\x47\x95\xca\x8a\x52\xa2\x0a\x0d\x61\x18\x61\x91\xe7\x82\x40\x99\xe5\x75\x57\x30\x32\x38\x20\x43\x6f\x97\x9d\xb2\x0b\x59\xfc\xb1\xc2\x93\x0f\x41\x30\xd0\x80\x69\x93\x44\x74\xb2\x59\x0e\xea\x25\x3a\x39\xcb\x50\x84\x27\x43\x88\xbf\x82\x4f\xfe\xa3\x78\xed\x97\xf5\x70\xad\x64\xfc\x75\xf2\xef\x2f\x8a\xfe\xab\x13\xf6\x45\x3e\xee\xfd\x55\xd8\xfe\x4f\xc0\xb3\xc3\xfb\x32\x19\x4f\x82\xff\x4b\x74\xf3\xc3\xb5\xb7\xfb\xe1\xed\xeb\x6f\xef\xde\x7e\xfc\x1b\xf0\xf6\xee\x36\xc3\xfb\x1d\x78\x56\x22\xdf\xa2\x65\x2d\x71\x6d\x24\x88\x00\x9f\x71\x4e\x58\xce\x30\x2c\xb3\x70\x72\x13\x6d\x37\xf6\x0c\x4b\xc8\x07\x11\x4e\x02\x34\xad\xeb\x42\xd3\x66\x3e\x6f\x0a\x7e\xcd\xda\x97\x97\x51\x6d\x98\xc4\x98\xa2\xe3\x40\x0e\x87\x9d\x10\x11\xa3\x1d\x1a\xde\xa9\x4c\x66\x05\x6e\x5b\x2d\x67\x98\x36\x79\x6e\xa8\x00\x74\xc9\x07\x45\x38\xf0\x7c\xb9\x33\x72\x3e\x0f\x3c\x0c\x22\x1c\xf9\x89\x4b\x6a\x21\x83\xd4\x32\x94\x24\x9b\xc4\x26\x65\x0a\x77\xc7\xe7\x5d\x66\xd5\xe1\x01\xf7\x6f\xef\x5f\xdf\xbf\xbf\x4f\xa1\x33\x0e\xe4\xc6\xec\x8e\x3f\x69\xdd\xec\xba\xb9\x59\xe2\x0c\x1b\x18\x68\xe2\x3e\x65\x1f\xd5\x9d\x49\xdd\xcb\x7d\x6a\x77\xb3\x4f\x55\x3f\xf5\x5b\x7f\x4e\xb6\xc9\xba\x4f\xa5\x6e\xee\x52\x32\x70\x6e\x39\x0f\x07\x77\xf1\xa1\xa5\x77\x6e\x5b\xde\xd6\x39\xd7\x3e\xc5\xcd\xe2\xfd\xfa\x22\x51\x77\x75\xe3\x5a\xc6\xf8\x85\x4e\xd8\x9d\xac\x66\x9b\x92\xb9\x4b\xf9\x5c\x6f\xc8\xb9\xab\x22\x38\xb2\x4e\xf9\xf2\x4f\xce\xa6\x02\x3c\x56\xf0\x25\xe8\x3f\x1f\xae\xef\xb6\x65\x38\x56\x5c\x93\x50\x52\xeb\xbd\xa5\xe0\x48\x34\xaf\x40\x39\xb7\x94\x46\xf2\x08\x5b\xfb\x0f\xf6\x71\x4a\xf9\xee\x98\xec\x62\x77\x65\x39\xcb\xdb\x59\xe2\xa1\x73\x80\x34\xcd\xee\xf8\xd3\xe9\xb0\x3b\x5d\x27\x89\x82\x76\xed\x41\xfb\x0b\xf7\xf6\x1f\x3f\xeb\x3d\x3f\xd7\x6f\xaf\x77\xcd\xee\x20\xb0\xc1\xa2\x4f\xa7\x30\x44\xf2\xc7\x4a\xbb\x3f\x00\x14\xfa\xbd\x56\x96\x59\x15\x0e\x91\xf3\x50\x7a\x0f\x8e\x1e\xb4\xcb\x9e\xf3\x48\xef\xe8\x36\xbb\x28\x78\x26\xcf\xc8\xe0\xb8\x92\x3e\xbb\xfe\x3f\x5c\x44\xcf\x3f\xc5\x42\xc4\x9a\x96\xc5\x20\xf7\x21\xed\x50\x99\x26\x14\xbb\x12\x82\x64\xd6\xe9\x94\x19\x4f\x6d\xe1\x19\xc1\xd9\x5c\x57\x61\x0a\x58\x81\x76\x9a\x8f\x34\x95\x33\x02\xa6\x28\x53\x08\xa6\x90\xcd\x0a\x8c\xa1\xdc\x66\x54\x30\x4e\x31\x0c\xd6\x84\xbe\x2d\x6d\xc9\x7c\x10\x40\x0d\xd6\x2a\x0f\x8c\x36\x04\x07\xa7\x83\x35\x51\x4f\x82\xdc\x99\x8d\x4c\x7e\x5c\xf9\x6c\x4b\xda\x7b\xbb\xb4\xdc\x76\xe9\xe2\x12\xfc\xe9\xc1\xdc\x25\xe7\x21\x4b\x1b\xa9\xb8\x2e\x2b\x46\xe6\x43\x9e\x01\x34\xf0\x3e\x0c\x3a\x1c\x14\x70\x38\x64\x3e\x6d\xf2\x73\xb7\x91\x96\x91\xb9\x11\xbc\x70\x05\x05\x35\x2c\x95\x35\x56\x79\xad\xed\x30\xeb\x4d\x1e\x35\x1a\xfb\x47\x7c\x07\x37\x2e\x79\x1d\xd1\x94\xef\xef\xf3\xe5\x5f\xda\xdf\xbd\xbb\xff\xfe\x87\x37\xdb\xdd\xfd\xc7\x4f\x1f\x3e\xfe\x0c\xe4\x95\x8e\x6e\xae\x05\xa8\x79\x73\x60\x80\x03\xc4\xc2\x31\x0c\x75\x9b\x6d\xb1\x58\x3d\x0d\xd1\xb2\xb4\xeb\x30\x05\xe1\x8d\xec\x09\xe2\x29\x2d\x84\x61\x30\x58\x48\xb3\x0c\xd8\xb9\x5d\x93\x3d\x60\xcf\xed\xe6\x18\x7b\xc0\xe6\xd1\xdc\xb9\x4d\x11\x73\xe5\x1b\x5f\x9c\xdd\x0d\xaa\x7b\xb9\x40\x63\x3a\x44\x20\x5d\xda\xfc\xa1\x07\x58\xd3\xb4\x14\xb4\x61\x1c\x0c\xd3\x08\x5a\x2c\x52\x49\x30\xe6\xdc\xa1\xee\xd0\xf6\xa8\x73\xde\x57\x3e\xb9\xf6\x5e\xee\xe8\xa6\x5c\x63\xa0\xd7\xfb\xbb\x37\xd7\xa4\xec\x85\x3b\xd7\xdb\xe4\xa2\x81\x7f\x15\x0f\x02\x70\x57\x8d\x87\x2c\xc5\x54\x5b\x8e\x03\x12\x4e\x89\x52\x49\x82\xe2\x96\x25\x41\x0f\xf2\x99\x6d\xa8\x50\xdc\xea\xa6\xfe\x6c\x37\xa5\xb6\x2c\x33\x95\xa7\x4a\x87\x4e\xf0\xd2\x96\x25\x06\x45\x38\xd4\xd6\xf6\x16\x42\x09\x31\xa6\x49\xb2\x05\xc9\x56\xdf\x25\x37\x3a\x7f\xc9\x97\x3a\xa0\x5b\x9e\xd6\x33\x8f\xe9\xf3\x39\x5f\xde\x3a\xa0\x83\xdd\xd3\x80\x5c\xe3\x96\xc3\x9a\x9b\xb7\x17\xac\xdb\x2f\xd7\x50\xde\xff\x62\x0d\x65\x9b\x18\xae\x98\x30\xa6\xc9\x7c\x76\x34\xc6\x03\x14\x6a\xbb\xe4\xa0\xbd\x32\x61\x14\x00\xd2\x30\xc4\x12\x0a\x45\xbf\x54\x42\x71\x95\x1f\x00\x0f\xcd\x10\x4b\x28\x4b\xcc\x42\xb6\x76\x6f\xa2\x12\xfa\xfa\x2f\xdc\xff\xea\x50\xf6\x77\xdb\x57\x77\x3f\xa6\xdc\x86\x89\x03\xc2\x43\xe5\xa4\x12\xca\xfb\x53\xe6\xb3\xc9\xb9\x06\xd0\xc0\xb3\x1c\x24\x93\xee\x40\x16\xc6\xd6\x8e\x00\x6e\xaa\xaf\x55\x74\xca\xf2\x10\x26\x73\x8a\x6b\x26\xd9\xfa\x3d\xbd\xa8\x20\x7c\x48\xfe\x2a\xaa\x4a\x3c\x45\x23\x17\xd8\xd2\xf3\xba\x19\x5b\xfb\xd7\xca\xd8\x4b\xd6\xf6\xa7\x87\xef\xf4\x66\x0a\x3c\x56\x2f\x6a\x03\x51\x1b\x04\x38\x85\xc2\x47\xae\x94\x6b\x21\x71\xa0\x5f\x73\x5c\x57\x55\xa0\xac\x8c\x0f\x25\xc8\x58\xa0\x64\xb9\x44\x56\x6b\xab\x98\x35\xf6\x74\xb2\xc6\x0a\xb1\xfc\x6e\x0e\xcb\x9f\xcf\x63\x27\x96\xb5\x93\x3f\x92\xad\xdc\xdb\xe4\xf7\x17\x14\xdd\x0b\x64\xd5\xe5\xef\xf2\xc9\x15\x82\x10\x05\x38\x6f\x24\x5d\xa3\xf5\xe9\x15\x51\xf7\x00\x34\x86\x03\x29\x7d\x09\x0f\x41\xc7\x22\x47\x1d\xb8\xc2\x85\x23\xcd\xe7\xb1\x2b\xa0\x87\x85\x88\x23\xf7\x40\x06\xd1\x97\x70\x53\xf8\x79\xf0\x3e\x85\xf3\xb0\xb7\x5c\x71\x89\x29\x89\x94\x84\xa3\x62\x4c\x39\x47\x09\xe2\xe2\x18\x3f\xa1\xe4\x73\x32\x4f\x8c\xa5\x59\x38\x34\x11\x73\x20\x1f\xe9\xb6\xda\xab\xe4\x9f\xc4\x9a\xc7\xaa\xfd\x1e\x63\xea\xd8\xfd\x58\x81\x1b\x0f\x1f\xae\xa2\x99\x11\x01\x58\x82\x28\x38\xf7\xe6\xe7\x94\xca\xb7\xf7\xbb\x4b\x4f\x6e\x33\x91\xba\xcf\xcb\x34\x3b\x49\xae\x4b\x38\x37\x94\xaa\x4e\x87\x01\x98\x32\xf7\x0d\x04\x15\x40\x98\xb4\x90\x66\x91\xd0\x66\x04\x8f\xed\x11\x38\x6b\x0f\x12\xd0\x06\x6a\xda\x76\xaf\x0c\x2a\x28\xb1\x4a\x53\x84\xc2\xe9\x88\x91\x96\xce\x62\x92\x67\x6e\x9e\x96\xd8\xe0\x28\x43\x3f\xfb\x68\xe6\x4f\x40\x37\x9b\x4d\x36\x86\x5a\xda\x15\x17\x95\x5c\xea\x80\x7f\x11\x71\x28\x0f\xaf\xdf\xa6\x57\x0d\xfa\x8b\x35\xdb\xc5\xca\xfb\xcd\xfe\xd5\xc3\xdd\x37\x6f\xbe\xd9\xa9\x34\x61\xb0\xb1\x83\x6e\x5c\x59\x66\x59\xa7\xd4\xa9\x52\xbc\x80\xa6\x67\xbe\x38\x85\x03\xe6\x4a\xef\xa0\x0f\x65\x70\x5d\xe5\xfd\x01\xc1\xa2\x23\xce\x8e\xdd\x48\x89\x58\x82\x37\xe4\xc3\xb1\x09\xc3\x01\xe4\xcb\x9e\x2f\x1e\x87\x88\x47\xf9\x07\x63\xf8\x53\x61\xf1\xa1\x55\x4d\xdf\x76\x1a\x10\x96\x96\xf3\x31\xf5\xf9\xb9\x2b\xd2\x4c\xa2\x8a\xb2\x13\xc9\x5d\x81\x0d\x2b\x5c\xc1\xf7\x86\x31\xd7\xe9\xde\x1d\xad\x9c\xc2\xe0\x66\xec\xb5\xa7\x80\x03\x8e\x42\x15\xa6\x54\xad\xe0\xfd\x2c\xfe\x18\x2e\x6b\x27\xdf\xea\xbd\x89\x7d\xeb\xf7\x9f\x9e\x55\x85\x6f\x89\x19\x6f\xd7\x8c\x6a\x55\x66\xfc\xc2\xc1\x75\xd9\x44\x3e\xad\xdd\x30\xc0\x54\x13\x12\x20\xc3\x09\x14\x7e\x1c\xb5\xd3\x56\x28\x3b\x51\x06\x0a\x65\xbb\xaa\x68\x3b\xa5\x18\x2b\x08\xe7\x5d\x5f\x9e\x3a\x2d\x8e\x4d\xcb\x8d\xd9\xc8\xc6\x36\x4b\xc8\xdc\xd4\x2d\x75\xd6\x72\xee\x8c\x12\x10\x3a\x04\x1f\x93\xb5\x4e\xd3\xc1\xb2\x2a\xcb\x03\xe7\xde\x1a\x1e\xf5\x09\x12\x9e\x1e\x63\x6c\x5b\x24\xff\x24\xf9\xfd\x4b\xa7\xaa\xb7\xfb\xaf\x68\x2b\xfd\xf0\x0b\xda\xf4\x91\x88\x99\xef\xff\x39\x78\xf7\xfe\xf7\x57\x97\xe9\xcb\x3d\xbb\xcb\x7c\x5e\xa4\x89\xc4\xc6\x37\x64\xa8\x3b\x4f\x1b\x4d\x49\x09\xa5\x17\x54\x4a\x1c\x0e\x9f\xc5\xc9\x0d\x6e\x1c\xdd\xe0\x4e\x46\x67\x79\xea\x99\x22\x05\x2f\x8a\xb9\x43\x52\x18\xbe\xdc\xb8\xb6\xae\xf7\x06\x52\xa2\x3b\x4f\xb1\xc3\xca\x42\x83\x38\xe1\x04\xaa\x83\x90\x54\x56\x43\x64\x1e\x72\x4e\x08\x82\x65\x19\xb8\xd7\x14\x64\x52\xf2\x25\xf6\x11\x72\xc5\xe6\xd2\x8b\x37\xe9\xbf\x7e\xe2\x59\xfe\x0f\x37\x08\x8b\x0b\x1f\x2c\x5e\x9c\xa7\x7e\xfd\xc3\x15\x63\xf1\x70\x83\xb1\x78\xd8\xdf\x3d\xfc\x09\x58\x4f\xf5\xd3\xc3\x93\x83\xda\xa7\x9f\x25\x33\x5b\xef\x63\xdb\x5c\x60\x2e\x31\x0c\x45\xef\x8b\xa6\x67\xe2\x44\x72\x53\xc8\xd0\x1f\xc5\x50\x8c\xe1\xe8\xac\x01\x87\x61\xc3\x83\xc9\x72\x30\xe5\x52\x0f\xc5\x80\x60\x16\xb4\x09\x35\x03\xc9\x72\x1f\xa8\x22\x0f\xad\x1b\x06\x20\x86\xb9\x8f\x3f\xf6\x86\x2a\xa6\xb9\x20\x98\xa8\xa2\xd4\x65\x51\x96\x25\x81\x9a\x10\x56\x16\xba\x30\x73\x13\xb2\xe0\x38\x30\xa0\x4d\xab\xb9\x09\x05\x42\x93\xd5\x98\x1f\x98\x45\x52\x23\x04\xd0\x92\x04\x4c\x9c\xf3\x64\x9b\xd2\xe8\xbd\xa0\x93\x6f\x9f\xd6\xa9\x8b\x7e\xcf\xc3\x77\x6f\xee\xbe\x7f\x77\x71\x09\x7f\xf3\x92\x67\xf4\xf0\x05\xcf\x28\xba\xe2\xbc\x7d\xd2\x46\x3f\x81\x68\x9e\x92\xda\xd0\x99\x93\x0c\x93\x7f\x4c\x9a\xd0\x91\x93\x99\xc6\xc1\x75\x5d\xe1\xb4\x61\x1c\xe0\x90\xf7\x65\x6a\xfd\x6c\xfd\x91\x81\x1c\xc0\xa0\x40\x37\xe0\xab\x1f\xd9\xae\xe1\x0a\x79\xeb\x8c\x6e\x0f\x27\x67\xa4\x3b\x5a\xab\x2a\x21\x09\x25\xc6\xe4\x73\xc1\x58\x2a\x84\xe1\x95\xa9\x66\x6a\x83\x32\x49\xba\x3d\xc6\xfa\xac\xb8\x30\x8d\x2e\xd0\xe1\xf4\xee\x9b\x78\x3d\x97\xb8\x76\x85\x0e\xa7\x11\x36\xbc\x79\x82\x0d\x9b\x3c\x54\x2b\x60\x58\x13\x94\xe7\x99\x2d\x18\xd5\x4c\x39\x5a\x4b\x9c\xab\xc2\xe4\x99\xcf\xbc\x20\x06\x8b\x6d\xeb\xd8\xf1\xd8\x1c\x48\x70\xc7\x70\x72\xbe\x08\x63\x05\x8a\x4a\xd9\xaa\x05\x09\x30\xa5\x2b\x47\x00\x43\x06\x1a\xed\x88\x33\x11\x17\xd0\x5d\x72\xe8\x5b\x5c\xc6\x5f\xff\x72\xdd\x60\x89\x6f\x7f\x78\xff\xfa\xed\xee\x86\xe7\xbc\xfa\xf4\xdf\xc6\xe4\x9f\x1e\x36\x64\x73\x0a\x02\x8c\x76\x05\xcb\xa7\x45\xa0\x02\x64\x61\x4a\xd1\x34\xcd\x11\x63\x9f\xca\x58\x32\xe0\xdb\xf2\xf3\x51\x6e\x0f\xe7\xa1\x4c\x4f\x85\xd4\x55\x57\x0c\x1e\xa2\xec\x7c\xe2\x61\xdc\x53\x23\xc2\xc9\x07\x08\x06\x0f\x0a\x11\x5a\xad\x35\xd7\x5a\x0b\xad\xb4\x0a\x83\x2f\x4c\x4e\xf4\x18\xeb\xe5\x3c\xd6\x75\x8b\x35\x0a\x7b\x29\x63\xb8\x53\x69\xde\x0d\x83\x1b\x86\x6e\x5f\xb8\xb9\x75\x67\xbf\x91\x2e\xa5\xb1\x1e\x6c\x2e\xbc\x95\x1f\x23\x1e\xe2\xf9\xce\x7a\x46\x02\xc4\x0b\xf0\x70\x05\xef\xc4\x57\x9c\x86\xbf\x5c\xe6\xe7\xca\x41\xf8\x70\xc1\x45\x6c\x32\xb0\x5c\x8b\x3c\x2d\xe6\x3e\x2b\x52\x34\xd7\x45\xb9\x49\x0e\xc2\xab\x4e\x05\x68\x07\xee\xe5\x01\x20\x72\x02\x45\x19\xfc\x98\xea\x70\x02\xc7\x79\xd2\x81\x33\xc0\x65\x70\xa0\xe9\x41\x3b\x1d\x54\x7f\xda\x8d\x94\x14\xca\xc5\xa2\x80\x93\xc2\xfa\xf6\x54\x6b\xeb\x9c\x31\x66\x16\x96\x13\x17\xc6\xd6\xd9\xc6\xf9\xd0\x98\xca\xb4\x3a\x89\x5e\x0d\x3a\x62\xd8\x76\xbf\x84\x8a\x7e\x91\x94\x7d\xbc\xa0\xa2\xef\xae\xa8\xe8\x6d\xa1\xa8\x25\x2a\xed\xad\x94\x40\x04\x07\xcc\xe7\x12\xd4\xa1\x4d\x69\x1d\x4e\xce\x81\x93\xa7\xc4\xf1\x39\xa1\x85\x2d\xd9\x5e\x5f\x40\xd1\xad\xb9\x20\xa2\x5d\xfb\x93\x88\x98\x68\x3b\x41\x80\x97\xc4\x2e\xf4\x10\x30\x50\xc6\x1a\x26\xfc\x2f\xd4\x33\xda\x8e\x25\xac\x30\x04\xdd\x99\x4c\xf6\x58\x6d\xca\xf3\x71\xe3\xb5\xa2\xa2\x34\x84\xcf\xa3\xf7\x57\x2b\xca\x1b\x3d\xa3\x22\x60\x09\x14\x18\x7e\x5d\xcf\x68\x13\xd7\x96\x25\x87\x7d\xf2\x98\xfb\x15\x1b\xec\xab\xd7\xc5\xaa\x4d\xfa\xfc\x37\x26\xeb\xaf\x1f\x3e\xa4\x47\x70\xf2\xcb\xc6\x0d\x1a\x6b\x03\x5b\x72\x65\x3f\xf4\xc8\x07\x17\x9c\xa2\x46\x9d\xa0\xcb\x0b\xe5\x23\x43\xb0\x04\xc7\x20\x81\x0f\x45\x6a\xd6\xa2\x59\xf4\xeb\xb8\xba\x61\x1f\x0b\x67\x4d\x6d\xd4\x08\x50\x29\xb8\x47\xe0\x64\xbc\xf5\xd6\x85\x93\xf7\xe1\xb8\xfa\xa5\x6d\x22\x0f\xd9\xec\x71\xf2\x47\xc9\x9f\xc5\xb8\xfd\x99\x93\xff\x55\x1b\xe3\xcb\x1d\x70\xa7\xce\x78\x70\x8a\x83\x04\xd0\xb5\x7c\x53\x9d\x19\x30\xa1\xcd\x00\x73\x91\x1c\xe6\xcf\x04\xf8\xd0\xec\xf1\x4a\xa3\xe7\x91\x46\x5f\xa6\x53\x90\xdd\xaa\x00\x37\x57\x5d\xe7\xc2\xe8\xdc\x12\xf7\x6c\x22\x26\x42\x45\x9d\x8e\x3f\x5f\xfd\xd0\x3f\xfc\x4c\x97\x63\xf7\x14\xec\x7e\xfc\xf0\xfe\xdb\xdb\x2e\xc3\xd5\xa1\x38\x1d\x41\x16\x5b\x7c\x79\x18\x7d\xe8\x5c\x98\xb6\xc6\x9f\xbd\x67\xa0\xcc\x7c\x96\x96\xb2\xe2\x02\x2a\x85\x61\xd0\x28\x28\x01\x44\x19\xa6\x5d\xdb\xf7\x7d\xef\xea\xba\x69\x4e\x41\x4f\x23\x30\xa1\x90\x5a\xcb\xb9\x3b\xe4\x3e\x57\x40\x07\x7a\x30\x2d\x60\xc9\x26\xad\x2e\xb1\xe1\x77\xc9\x5f\x44\x67\xfd\xa7\x5d\x64\x55\xa5\x5f\xa3\xdd\x7f\xb6\x2a\x36\x80\x9f\x2d\x6a\xaf\x1e\xd2\x0e\xb4\x08\x7a\x92\xb2\x50\x59\x90\x29\x29\x66\x2e\x14\x3f\xb9\x50\xa7\x85\xb0\x29\xd3\x72\xd6\xdb\xee\x7c\x44\xe9\x00\xeb\x5e\xb9\xa2\x52\x52\x14\x73\xc9\x1f\x93\x5d\x2d\x14\xf6\xee\x20\x2d\xa6\x52\x52\x6c\x4c\x57\x69\xd9\xcc\x8d\xab\x83\x39\x64\x2e\x93\x6b\xed\xd8\x3c\xb2\x8d\xda\xab\xd5\x6f\x6d\xb7\x96\x29\x97\x31\xa6\xe0\xaa\xaa\x78\xf1\x5b\x83\x34\x1c\x41\x11\x4e\x19\x80\xe1\x80\x1f\x13\x73\xc2\x61\x00\x28\x8c\x20\x1f\x31\x90\x7b\xe5\x58\x38\xb8\xc7\xa4\x2c\x5d\xe0\x61\x92\xd3\x72\x65\x89\x03\x39\xf2\x28\x49\x23\xb6\x6d\x89\x07\xef\xe3\x3e\xf4\x04\x32\x7e\xf5\x26\xbd\xfb\xfe\x87\x1f\xdf\x81\xf7\xf7\xcb\x25\xba\x08\x3c\x5e\x2d\xa4\xdf\xee\x69\xab\xab\x12\x05\x15\x08\x1c\xeb\xaa\xae\x40\x0e\x4a\x4c\x67\x36\x55\x19\xc0\xd5\x72\xdd\xaa\xd0\x15\x41\x71\x40\xe0\xb8\xab\xba\x23\xa5\x84\x16\xa6\x05\x12\x85\xda\xe4\x98\xd3\xb9\x00\x74\x62\x80\x86\xd6\xcf\x2a\x75\x01\xf5\xae\x06\x22\x49\x92\x3f\x4e\x24\x10\x77\x3e\xea\x0d\xff\xf0\x54\xc3\xbc\x6a\xb5\xff\x2f\xc9\xff\x96\xfc\x9f\x6b\x8e\xb5\x26\x53\xcf\xd2\x54\x9f\xae\xcf\x65\xd4\x74\xbb\xfb\xf8\x29\x3a\x92\xde\x7e\x95\x5e\xf4\xde\xe2\x77\xcf\x90\xbd\x15\x4d\xb8\xae\x90\x3f\x3f\xde\x28\x9c\x6c\x0b\x58\x8c\xb3\x19\x73\x18\x46\x86\x54\x96\xf7\xa7\x52\x2b\x21\x0b\xcb\x0c\x95\x8a\x60\x53\xb7\x46\xa2\x5d\xc2\x90\x2c\xbb\x13\xd4\x4a\x88\xd2\x72\x4d\x25\xc1\x18\xdb\xba\xd5\x0a\x9d\x25\x38\xc6\xa7\xbe\x5c\x72\x50\x73\x3c\x86\x91\x94\xb2\x24\xbb\x8c\x22\x05\xe9\xe7\x1c\x43\xb5\xfc\x46\xa0\x82\xf8\xa7\x5e\x23\xa4\xf0\xb6\x53\x25\x54\x68\xef\x84\xd2\x9a\xd3\x90\xd8\x8a\x40\xc8\x90\xb2\x1d\x2a\x74\x0d\x4a\x38\xfa\x52\x59\x14\xec\x01\x22\x41\x6c\x45\xd8\xf2\x65\x0b\xd7\x2f\x1f\x13\x9b\x15\xcb\xd7\xfe\x08\x91\xe8\x94\x54\x62\x49\x94\x72\x69\x88\x56\x44\x59\x6c\x54\x29\x35\x51\x92\xc6\x23\x84\xb5\x22\xc6\x40\xc3\xf1\x12\x90\xfe\x36\x15\x17\x9d\x83\x3f\xbe\xa0\x9b\x56\xbe\xd8\x7f\x4a\xfe\xdb\x84\x27\xff\xe3\xc5\xd7\xee\xa2\xe6\xf1\x61\x89\x0a\xd6\x82\xc1\xb7\xdf\xfd\x75\x7a\xc3\xde\xd8\xfd\x92\xf3\xc1\xed\xea\x70\x59\xa2\xa2\x87\x52\xd4\xee\xfb\x61\xbb\xba\xaa\x3a\xd7\x38\x72\xf2\xc1\x01\x05\xb0\xeb\x1b\x76\x98\x0a\xa2\x11\x29\x33\x5d\xd0\x30\x20\x45\xe7\x7a\x4b\x3f\xb7\x2b\xb0\x6e\x00\xec\x3c\x3c\xbd\x2b\x40\xe1\x80\x8c\x18\x6d\xc0\x7f\x5a\x95\x2c\x6b\x20\x83\xcf\x58\x98\xc2\xa9\x00\x79\x4a\x40\x72\x94\x87\x69\xaf\x43\x4e\x70\xa9\x11\x62\x5a\x7a\x44\x14\x45\x10\x16\x90\x62\x45\x08\x6d\xe7\x69\xad\xb5\x47\x93\xd9\x2e\xc6\xf0\x4a\x6b\xa5\x54\x98\xb8\x21\x16\xf3\x28\x92\x9b\xec\xd3\x36\xfa\x59\xbb\x27\x94\xdb\x5f\x5d\x10\xc2\xbf\x00\x13\xbd\xd8\x25\xbd\xba\x50\xde\x57\xb4\xe8\x2a\x89\xfd\xfd\x55\x14\xe4\x6d\xa4\x41\xef\x0c\x2a\x41\x15\xe8\x55\xc8\x05\x74\x9f\x0f\x84\xd5\xd1\x38\xa9\x2c\x4a\x74\xf1\x20\x5a\x9e\xa5\xcd\xc8\xbb\x76\x24\xa1\x1f\xa7\x50\x41\x50\xb6\xb5\x66\x20\xd1\x75\x23\xf6\x96\x09\x63\x4c\x04\x8b\x66\xcc\x8d\x20\x81\x8c\x50\x1c\x8c\x31\xd3\x13\x6e\xb4\xd5\xa8\xac\xa0\x54\xa5\x2b\x88\x6a\x2d\x17\x4b\xac\xea\x1e\x79\x5c\x2f\x7f\x13\xeb\x8a\xcf\xf5\xbc\x37\x29\xb8\xba\x36\xaf\x8b\xc6\xcd\x53\xb6\xad\x01\x2a\x91\xc5\x25\x28\xe7\x12\x4c\xee\xf8\x98\x74\x35\xc2\xda\x72\x8f\x1e\x93\x30\xc0\xba\xb6\xae\xb4\xc2\x31\xa3\x38\xdd\x59\xc9\x91\x32\xae\xc5\xb3\x0d\x55\x09\x8d\xc1\x63\x38\xd2\x9a\x42\x33\x02\x09\x73\xdf\x03\x0e\x43\xdf\x66\x79\x95\x6c\xd3\xe9\x91\xdc\xc9\x3d\x4e\xf2\xd8\xbb\x47\x5f\x7a\xf6\xc5\x88\x61\x4d\x65\xef\x1f\xde\x3c\x09\x4a\x5c\x4d\xe6\x3f\x3c\xfc\xf8\xee\x4e\x4a\xc9\x14\xf4\x94\x9c\x5b\xe7\xc0\x40\xb1\x27\x64\x38\xb7\x23\x43\x16\x52\x50\x10\x04\x92\x50\x82\x66\xee\x38\x80\x25\xdc\xe3\x3f\x1c\x85\x2c\xaa\x82\x6d\xf8\xe7\x7a\x3f\xcd\xa7\xaa\x81\xb5\x01\x96\x49\x4d\x8c\x0c\x9c\x0b\x1b\x4e\x16\x54\x96\x2e\x6b\x37\x4b\xb3\xbb\x66\x2f\xaf\x5e\x2c\xf7\x3f\xf3\x62\xd9\xde\x56\x26\x1f\xee\xa3\x17\x8b\x65\x61\x08\x7e\x10\xa4\xa5\x0c\xe8\x59\x01\x04\x5a\x1e\x60\xe8\xab\x70\x0c\x48\x82\x0e\xe4\xb3\x01\x14\x11\x2b\x28\x48\xc2\x21\xd4\x28\xed\xf7\xd2\x95\x79\xe8\x8d\xc5\x4a\xf8\x5e\xd4\x0e\xe4\xa1\x06\x74\xf2\xd6\x76\x9e\x51\xa6\x34\x40\x79\xe6\x92\x5d\x72\x02\x62\x3f\xee\xc9\x13\x42\xf1\xf7\x17\xdc\x7a\x44\x80\xec\x5e\xea\x1c\xbc\x7e\x62\x4b\x6f\x2e\x0f\xe4\x53\x27\x7c\xf0\x66\x68\x3f\xcb\xdd\x71\x0c\xc7\x14\x0b\x81\x39\xd4\x18\x85\xa4\x9a\x27\x9f\x12\xa5\xfa\x98\x47\xd6\x69\x12\x92\x99\x3f\xbf\xdf\x39\x44\x28\x75\xca\x89\x99\x0a\x99\x55\x19\xcb\x0f\x87\xe3\x46\xc0\x32\xc6\xf2\xc1\x5e\xfc\x4d\xd2\x0d\x7e\x94\x51\x3f\xe3\xb7\x17\xfe\xd0\x13\xf7\x1a\xc4\x06\xef\xaa\xb6\xbb\xbf\xdb\xaf\x06\x43\x1f\x1e\xb6\xd3\x6a\xcb\xb5\xc4\x0a\x64\x73\x38\x4f\x14\xe4\x80\xb1\xac\x82\x14\x07\x11\xac\xde\x64\xe7\x7e\xaf\x02\x06\x7a\x9e\xd2\x24\xb8\x70\x0a\x49\xa8\x61\x4e\x3c\xee\x09\x22\x2a\xcd\xc6\x24\x01\x1b\xf2\xe8\xee\xd8\xae\x5e\x35\xdf\xe3\xe6\xfa\x76\x6d\xc7\x6c\xcc\x06\x9e\xbb\xcd\xa9\x5e\xb2\x85\xf3\xb0\x61\xa0\xf3\x7f\x38\x59\x9f\x66\x17\xad\x78\xbf\x35\x17\xdf\xee\x95\x32\x0b\xbe\xbf\x75\x32\x4f\x5e\xad\x65\xa6\x14\x90\x63\xc5\x58\x15\xfa\x60\x41\x39\x12\xea\x6a\xb5\xec\xa0\x75\x10\x08\xe4\xe3\x70\x82\x53\x5d\xf9\x8d\xc8\xa1\xab\xc9\x2c\x82\x46\x44\x4b\x3a\x85\x81\x4a\xa1\xb0\x05\x05\xa8\x49\xd9\x00\x94\x26\x28\xe4\x49\x9a\x48\xd0\x47\x9e\x7b\x11\xa3\xac\x8b\xc6\x74\x12\x41\x2b\xcf\xe5\x90\x6f\x7e\x78\xb8\x42\xfa\x9f\xa6\xec\x39\xda\x02\x47\x9f\x17\xa0\x99\x42\x33\xc8\x34\xe9\x43\x8f\x90\x60\x82\x71\x4c\xe5\xb4\x2b\x82\x86\xf5\x44\xb2\xaa\xa0\x28\x34\xe1\xc4\xd3\x9e\x39\xca\xa0\x10\xb0\xd8\x5b\x84\x71\x85\x02\x0c\x03\xf3\x75\x4a\x39\x25\x4c\x73\x42\x88\x02\x09\x9a\x5d\x59\x90\x0a\x0f\x18\x11\xbd\x29\x02\xae\xf2\x2a\x5f\x7b\x4c\xa9\xfb\xaa\xef\xea\x5d\xfa\xc2\x77\x75\x3b\xce\xa7\x6d\x1d\x60\x09\x3d\xf2\x93\x06\x3c\x2d\xfa\x5e\xd7\xa7\x19\x6d\x0f\x9f\xd1\xae\x72\x8e\xd2\xcf\xcd\x06\xb1\xc7\x64\x32\x20\xa2\xdb\x83\x33\x40\x00\x76\x4e\xfc\xca\x33\x6c\x62\x8c\x27\x63\x8c\x77\xd1\x21\xf8\x66\x77\x97\x6c\x9e\x7d\xf8\x3f\xbc\x8f\x32\x07\xdf\x6f\x74\xb5\xe1\xf3\x54\x81\x8a\x85\xcc\x37\xde\x92\xe6\x24\xfb\x3e\xed\xdc\x70\xd2\x20\xdb\xcb\x19\xf9\x90\x0c\x1e\x64\xa9\x9c\x13\x2a\x8c\x56\x72\xc3\x7d\x5a\xb1\xd0\x74\x72\xbc\xac\x47\x7e\x4f\x92\x3f\xbb\x20\x80\xe3\x1d\xb4\x76\xbf\xee\x7f\x78\xa1\xe3\xb0\xea\x87\x6c\x1e\xd6\xdb\x79\x7b\x0c\xd5\x46\x04\x0f\xea\xc0\x41\xc6\x8c\xe3\xae\x28\x03\x9b\xa7\x25\x34\x90\xc0\x47\x53\x5b\x12\x51\x1b\x31\xa4\xda\xa2\x25\xb9\xa9\xe7\x3a\x4c\x85\x66\x4d\xcf\x28\xa1\xa8\x82\xa0\x48\x39\xc0\xe3\x39\xbf\x00\x0f\x2e\x31\xd4\x32\x26\x1b\xd7\xec\xff\x9c\x18\xea\xe3\xaf\x05\x51\x7f\x0b\xfe\x0b\x62\xa8\x04\x95\xd3\x6c\xc6\x02\x86\xe9\xe7\x31\x14\x41\x3f\x0b\xa2\x8c\x12\xf2\x1a\x44\xa9\xaf\xc6\x50\x31\x78\xfa\x3b\x62\x28\x88\x15\xd9\x5b\x21\x8d\x61\x34\x24\xae\xa2\x08\x72\xa4\xec\x21\xc6\x50\x10\x4e\x3e\x2b\xb4\x41\xc1\x1c\x20\x92\xc4\x55\x94\x73\xa4\x5c\x7f\xf9\xf6\x31\x71\x59\x31\xa1\x60\x07\x88\x64\xa7\x85\x16\xa1\x92\x2e\x57\x86\x18\x45\xe2\xb1\xb8\x89\xa1\x10\x6c\x34\xb1\x36\x1e\x97\x7b\x3f\xe2\xf7\xeb\xbf\x2f\xbf\xeb\xc2\xed\xfa\x2a\xbf\x6b\x4b\x24\x17\x5a\x1b\xd3\x18\x71\x30\xe3\x78\xe8\x9c\xab\xaa\x16\x50\xf2\xd9\x50\x9b\xb2\x43\xad\xaa\x3e\x18\x57\xf7\xaa\xdf\x2b\xc9\x7f\x89\xdf\x35\x59\x90\x18\x90\x5f\xf8\x5d\xe8\xa7\xf1\x96\xdf\xb5\xdf\x64\x11\x67\xa3\x93\x57\x09\x8c\x78\xf6\xff\x6f\xf4\xe0\xbe\xc4\x76\xcf\x2b\xcc\xbf\x03\xcf\xfa\xa7\xaf\xff\xde\x82\xb0\x4f\x5e\xc3\x9f\x1e\xb6\xd0\x50\x24\x85\xcb\x72\x25\x04\x63\xd4\x28\xaf\xd3\xdc\x64\x0c\x2b\x55\x65\x4e\x09\x21\xb1\x92\x9a\xcf\xc4\x14\x5c\xb1\xb4\x34\x85\x50\x3c\x2d\xdc\x79\x72\x25\xa8\xa2\xe4\x9b\x03\xa5\x3e\x7a\x57\x0f\x12\x14\x75\xb0\x7b\x5d\x61\xc4\x24\x25\x88\x0a\x23\x99\xe6\x92\x4f\x00\x29\x81\x89\x10\xac\x28\x62\x0c\x6d\x04\x97\x63\x5f\x5a\x4d\x14\x2c\xbd\x25\x51\x0d\xd6\x98\x65\xfb\xac\x6b\xd3\x35\xb6\xe9\x02\x06\xcd\xc1\xea\xe6\x90\x24\xc9\x7e\x83\x2f\xb8\xa3\x6f\x22\x5a\xf5\xf7\xc9\x5f\x45\xa4\xd9\x3a\x1f\x2f\xe5\x71\xd7\xd9\xf8\xf6\xb9\x26\xfd\xcd\x3f\x60\x36\xa8\x21\x50\x71\x97\x4b\x2e\x09\x23\x5a\x39\x95\x26\x26\x67\x48\x89\x2a\x33\x4a\x70\x81\xa5\x5c\xd2\x4d\x53\x30\x45\xd3\x5c\xc7\x39\xc9\xdd\x5c\xb8\x12\x38\x07\xea\xe0\x2d\xc8\xf5\xc1\xb9\xea\x20\x40\x56\x05\xbf\x37\x15\xc2\x5c\x30\x45\x85\x16\x71\x2e\x40\x02\xd0\x01\x11\x2e\x69\x59\x70\xbd\xcc\x05\xe7\x1c\x24\xdd\x75\x32\xae\xd2\xb8\xf6\x79\x32\xea\x2e\x90\xa7\xc9\xd8\x26\xfa\x91\xde\x99\x5d\x92\xfc\x3e\xc1\x91\xa7\x7a\xa3\xe3\xf5\x42\xb1\xeb\xc6\x8b\xfc\xa5\x62\x57\x2c\x20\x7e\xfc\xf4\xf0\xdd\xad\xe8\x57\x3a\xb9\xd1\xa7\x2c\x34\x0c\x88\xb9\x4c\xed\xac\x37\xc9\xdc\x03\x0e\x4a\x16\xaa\xa0\x7c\xe8\x83\xe0\xa0\x3a\xcc\x43\x7a\x8a\x65\x57\x02\x54\x89\x42\x97\xa2\x2c\x2d\x48\x3e\x33\xb8\xa9\xac\x90\x4a\x7d\x16\x82\x3a\x2c\x77\xc9\x8a\x41\xb2\xda\x32\xc3\xad\xc3\x96\x1f\x42\x0f\x60\x2b\x8c\x94\x96\x1b\x66\x09\xb6\x8f\x09\x2f\x31\x18\xa8\xa6\x92\x72\x2e\x28\xe7\xc9\x26\x71\x60\xba\x93\x7b\x9b\xfc\x90\xfc\xdb\x2b\x2f\xea\xe7\xe8\xfb\x0f\x2b\xb3\xf3\x62\xad\x73\x1f\x2f\xef\x6d\x1b\xe2\xd3\x77\x6f\x2e\x45\xa2\xeb\x67\xef\x3e\xbd\xf9\x98\x7a\x55\x75\x57\x7f\xd0\x6d\x1d\x06\x00\xe3\x28\x0f\xa0\xb3\xfe\x27\xee\xed\x31\xad\x04\x22\x84\x70\x4a\xb5\x20\x8c\x53\x46\x05\xa7\xf8\xc5\x67\x9e\xb6\x74\x6f\x35\x43\xcc\x18\x63\xad\xd1\xc6\xda\xf3\x18\xba\xb6\x05\x24\xed\x11\xa5\x04\x43\x24\x30\xe2\x50\x94\x14\x96\x02\x62\x12\x1a\x86\xe3\x87\x90\x41\x51\x12\x26\x04\x59\x71\x85\xee\xc2\x6d\xbb\x6a\x43\xd0\xa8\x20\x73\x71\x9a\x7c\x72\xb8\x7d\xd8\xbf\x04\x83\x5e\xf8\x61\x6b\x27\xed\x52\x13\x5d\xf2\x97\xbb\x2b\x82\x32\xde\x0c\x1b\x5c\x2f\x27\xe7\x01\xaa\x96\xad\xa9\x9f\x1d\x42\x1b\x2c\x1c\xe1\xa5\xa0\x08\x65\xa1\x87\x4e\x73\x6d\x50\x41\x90\xf0\x34\xb4\x42\xf1\xa3\xaa\x53\x15\x0e\x75\x5a\xcf\xb1\x69\x6e\x2c\x38\xce\x7e\x97\x18\x27\xa5\x94\xce\xcc\x0d\xc1\xf3\xf1\x50\xb8\x42\x01\x45\x29\x57\x92\x92\x12\x97\x52\x59\x4e\xac\xb1\x29\x33\xe6\xa4\x42\xa5\xe6\x36\x8c\x26\xd9\xc5\x75\xd7\xec\x55\xf2\xea\x82\x12\xfd\xff\x7f\xe1\xde\x7b\x83\x04\xfb\xc5\x73\xdc\xdf\x9c\xe1\xab\x97\x67\x47\x4e\xab\x29\x6c\x38\xf9\x30\xfa\x13\xdf\xd8\xb9\x2b\x71\x3a\x31\x47\x68\xc9\x31\x2e\xf3\xb0\x6c\x6d\x5c\x2a\xa2\x44\x85\x43\xcf\x38\xef\xa5\xf7\x29\x8f\x98\x9d\xda\x58\xe0\xe7\xe3\x3e\x17\x22\x36\x95\xb5\xae\xe6\x9e\xe0\x79\x3a\xad\x27\x47\x98\x50\x92\x49\x26\x8d\x26\xd8\x2a\x0d\xb8\x0c\xad\x9c\x0f\xe1\x68\x92\xed\xc5\xb7\xfb\xef\xa7\xfb\xb3\xc4\xf6\xff\x00\xdd\x9f\xb7\x57\xdd\x1f\xd7\x3a\xe5\xb4\x13\xae\xeb\x50\x99\x6b\xac\x34\x15\x41\xaa\xdc\x69\x55\xb4\x69\xa7\xd3\xc6\x9d\x45\xb5\x65\x52\x62\x52\x0a\x44\x1e\x13\x3f\x39\x60\x6f\x54\x7f\x9c\xa3\x50\x94\x56\x32\xde\x86\x06\xb0\x53\x2d\xcc\xf2\xdd\x31\xb4\x6d\x1b\x55\x7f\xe8\x85\xa9\x9a\xcd\x5d\x4a\x02\x5c\x55\x7f\x92\x64\x07\xca\x47\x72\xe7\xb6\x57\xdc\xd5\x43\xf2\x2f\xbf\xe0\x8a\xbd\xd9\xee\x9e\x1d\xe5\x62\x64\xfb\xfe\xf5\xf7\x17\x47\xb9\xc8\xe9\x07\x68\xe7\x7e\x52\xd5\x96\x7d\x6e\x96\xd7\x0e\xf3\x30\x84\x9a\xda\x91\xe7\xb6\xd0\xa1\x79\x4c\x54\x05\xe0\xe7\xa2\x5a\x62\x2a\x70\x84\xa1\x0b\x27\xb6\x75\xb3\x05\x5a\x85\x5a\x05\x6f\x38\x51\x65\x89\x14\xac\x04\xe1\x60\xec\xb0\xf5\xf6\x24\x1d\x45\x7c\xd9\xcf\x57\xde\xa0\x4b\xfe\xfc\xc2\xd2\x79\xf3\x33\x43\xd4\xa7\x5e\xef\xcf\x75\xe3\x3f\x7e\xb8\x5f\xf5\x73\xdf\x6d\x8f\x1e\xa5\x79\x3f\x17\x34\xf5\x6d\xa0\xb9\xa0\x9c\xb2\xb2\x24\x88\x12\x52\x42\x05\xf2\x30\xa5\x63\xd5\x75\xc2\x0a\x5e\x72\x41\xe0\x9c\x83\x42\x53\x43\xd5\xde\x41\xe9\xe6\xa9\xf2\x0a\x54\x39\xa1\x92\x12\x58\x22\xc2\x09\x2e\x4b\x75\x9a\xf3\xd3\xc9\x07\x62\x64\xd1\x94\x90\x00\x4f\xac\xa7\xce\xae\xfe\xe5\x22\xe6\x57\xff\x3c\x41\x11\x23\xf8\x12\x3f\xfb\x05\xfd\x37\xd6\xfa\xa2\x1b\xd9\xfa\x08\x6c\x1e\x2e\x75\xd1\xfb\xcd\x05\xf9\xe7\x8a\x12\xf4\x94\x02\x15\x3c\x62\x06\xe7\x2e\x97\xc7\x8e\x97\x2c\x60\x03\x1a\x36\xba\x34\xe7\x24\x18\x69\xd4\x88\x40\x56\x64\x61\x00\x5d\x56\x00\x5d\x46\x7d\xc6\xbd\x82\x08\x19\x23\xe7\x36\x24\xb0\x44\x16\x76\x82\x8a\x14\x85\x72\x92\x27\x60\x45\x5a\x4b\x6d\x98\xf2\x33\xb2\x55\x65\x01\x9c\x27\x65\x98\x89\x5a\x92\xfb\x44\x3c\xd2\xcd\x18\x79\x11\xaf\x92\x37\xc9\xbb\x15\x55\xf7\xea\x8b\x5a\xd2\xab\x0b\xfe\xe6\xd5\x0d\x22\xe3\x4b\xb8\x85\x02\xca\x03\x1d\x2c\x20\xe7\x23\xa0\xc1\xe1\x4d\x76\x9e\xdc\x12\x57\xd2\xb2\x38\x95\x85\x2b\x8a\xf6\xac\xda\xbc\x48\x0f\x3e\xe4\xde\x83\x31\xe4\xfb\x42\x08\x2b\x8d\x91\xa1\x09\xda\xd8\x70\x24\x64\xa5\x72\x5a\xb8\xdc\x47\x05\xe7\xe0\x14\x26\x9b\x24\xfb\x6d\x1e\x79\x9b\x5f\x8c\xf3\xcb\xb2\xfc\xdf\x67\x9c\xdb\xf2\xff\xc5\x81\xa6\x9b\xe1\xc2\x87\xf8\xf3\x95\x05\xf0\xfa\xe1\xee\x22\x57\xf3\x4b\x94\x88\x6d\xb1\xe1\xa1\x45\x63\x23\x7d\x05\x88\x0b\xd8\x83\xc2\x56\x02\x94\x3e\xd8\x7e\x89\x32\xf7\xc8\x29\x56\x79\x57\x9b\xc0\xcf\xad\x36\x1b\x06\x7c\xab\xf5\x29\xd2\x21\xda\x24\xf9\x93\x88\x55\xfd\x75\x0d\xea\xff\xfe\x3f\x5f\x83\x1a\x3c\x71\xaf\x76\xb7\xae\x2e\x17\x5f\xad\xef\xd2\x6e\x79\xe6\xa3\xc3\xe1\xd3\xeb\x94\x96\xf3\xd1\xbe\x10\xa1\xb6\x82\x73\x2e\x6a\xc5\x95\x50\x69\xa3\x85\xe6\x1a\x50\x2d\xb8\x54\x67\x02\x24\xf5\x38\x3d\x4e\x44\x00\x29\xaa\x69\x08\x8c\x02\xdc\x57\x2d\x41\x61\x4c\x6b\x49\x82\x2c\x61\xf5\x9f\xe7\xb2\xa5\x9d\xe3\xe6\xea\xb1\x85\x11\x63\x0d\x95\x08\xc2\xe4\x37\x89\x05\xcb\x5e\xc6\xe3\x5c\xfd\x65\xec\xeb\x5d\xf9\xdb\x09\x78\xc6\x46\x3d\x45\x27\x9f\x1e\xae\xab\xcc\x92\x79\xae\xfe\x16\xb7\x01\xd7\xed\x11\xe4\xbb\xe3\xcc\x53\x37\xab\x0d\xfa\x43\xbe\x29\x67\x97\xaa\x59\x46\x82\x0d\xc8\x48\x69\x4b\x9c\x16\x69\x1e\x46\x83\x88\xa1\x67\x62\x94\x56\x66\x9b\x50\xe4\x10\x09\x02\x17\x55\x8e\xb6\xdc\x32\xc3\xcc\x9e\xcf\xa3\xd0\xdc\x5a\xae\x85\x01\x79\xc1\x05\x92\x9c\x84\x11\xe4\x05\x92\x8c\xb2\x39\x61\x96\xc6\x6d\x8d\x48\x86\x85\x84\x52\x40\xa1\xa9\x12\x49\xba\x4b\x1e\x65\xdc\xd3\xfe\x28\x79\xfb\x42\xcb\xe8\xd5\xc3\x6b\xb0\xff\x45\x35\xc6\xd6\xe7\x05\xd0\x41\x62\xa1\x0c\x06\x6d\xd0\x10\x1b\x02\xcb\x3a\x17\x46\xb5\x4a\x02\xf4\x98\xec\x75\xa1\xa5\x1b\x2a\x39\x3d\x26\x6a\x66\x14\xc3\x02\x79\xd4\x0b\xb1\x2a\x31\x26\x49\x16\x3d\x42\xe4\xd3\x33\xfa\xe7\x17\xe7\xae\x7f\xbd\x62\x7d\x6f\xc9\x7d\xaf\xd6\x06\xd6\x5f\xa6\x6b\x74\xf4\xea\xe6\xf1\x5c\x6e\xc7\x3b\xf9\xb9\x06\x19\xc4\x9e\xe0\x89\xa0\x2a\x67\x22\xb4\x6e\xd9\xf7\x1c\xa0\xc2\xcf\xd4\xfb\x2b\xd8\x79\xe7\x67\x92\x76\x8c\x52\xa9\x85\xc1\x48\x87\x53\x84\x67\x45\x81\x2b\x7d\x1e\x94\xda\xc0\x70\xb2\x41\x46\xfc\x70\x2a\x23\xee\xc1\x46\xed\xfb\xab\xb6\xea\x93\xae\xcd\x13\x9c\xf2\xed\x6e\x0d\xa9\x97\x3b\xe1\xdb\x6b\xcd\xe7\x76\x21\x7f\x0a\x5f\x12\xd0\xe7\x85\x2f\x0b\x30\x1e\x8b\x02\xb0\xcf\x08\x90\x02\x45\x5b\xb5\xa2\x08\x0e\x06\xbf\x39\x85\x51\x1a\x98\xb9\x1c\xc3\x43\xc3\x1a\x1a\x28\x07\x92\x8d\xcf\xe3\x3f\xe1\xe5\xce\xb4\x9a\x38\x27\x78\xcb\xa4\x08\xdd\x2c\x27\xca\x2c\x1c\x30\xa2\x02\xc0\x60\xa4\x27\x20\x07\x4e\x07\xab\x93\x3f\x4e\x58\x2a\xee\x56\x0f\xc9\x1f\x2f\xae\xc5\xff\x75\xc4\xa5\xff\x4f\xd1\x05\xe1\x7f\x4f\xfe\xaf\x5f\xa9\x47\x7c\xfa\x59\x3d\xe2\xeb\x5f\xfe\x17\x74\x75\x8a\xf2\xd2\xd5\xe9\xc6\x52\x49\x2e\x62\x45\x82\x63\x84\xb1\xa9\x1a\xc5\xcb\x58\x91\xc8\xb3\xfe\x04\x95\xe4\xbc\xb4\x5c\x13\x41\x10\x46\xb6\x6a\xa4\x28\xbf\xde\xd7\xc1\x50\x95\xf8\x67\x35\x09\x4c\x25\xdd\xf6\x97\xbe\x0e\x65\x4a\x61\x14\xb4\x54\xa4\x28\x70\xa9\xb8\x29\x72\x6d\xfa\xb2\x91\x59\xce\x04\x0a\x53\x55\x94\x88\x7c\xed\xdb\xd1\x17\x25\x6a\x24\x95\x28\x1c\x24\x2f\x18\x27\x9c\x91\x78\x84\x8c\x11\x46\x69\x3c\x22\xe8\x04\x51\x12\x0a\x82\x69\x72\xa9\x5d\xb2\x4d\xb6\x2f\xae\x5e\xe9\x3f\x33\x49\xba\x7f\x22\x08\xa6\xd5\x92\x75\x73\x4e\x0b\xcc\xa9\xe0\x58\x6b\xa7\x43\x99\x5a\x53\x6d\x8c\x25\x78\x96\x8c\x66\x3e\x2b\x52\x5c\xc2\x0a\x22\xc0\xeb\xda\xfa\xa1\xed\x93\xbb\xb8\xce\xfb\x8b\x56\xf8\x2d\x2f\x63\xed\x88\xbc\xbf\x79\xb8\x9e\xf9\x5a\xbf\xac\x15\xfe\xf6\x0b\xad\xf0\x28\x0d\xf0\x73\xa9\x70\x05\x0b\xd0\x9f\xd1\xa9\x28\x1d\x2c\x5a\x54\xba\xa2\x3c\x86\x1e\xe4\x9c\x0f\xa6\x61\xb5\xb2\xc6\x09\x25\xbc\x50\xf5\x98\x1b\x6b\xc1\x29\x2f\x0e\xc6\x8d\xa3\x07\xd0\x58\xb3\xec\x92\x26\x2a\xa5\xd7\x2f\x55\xc2\xa7\x81\x57\x7a\x08\x26\xae\x88\xac\x93\xda\x0e\x56\x05\x15\x2a\x06\xaa\x5b\x91\x70\xf7\x42\x23\x7c\xb7\x51\x17\xcd\xeb\x2c\xf9\x47\xc9\xef\x92\x7f\xf3\xa4\x1d\xb2\xd6\x02\xef\x23\xe1\xe6\x45\xda\xf8\xe6\xe3\xe6\x6a\x8a\x78\x23\xa0\xf3\x61\x85\x7f\x5d\x8a\x97\xdb\x63\x9d\x41\xd0\x9f\x19\xc0\x55\x6a\x66\x03\x06\x89\x29\xa7\x82\x71\xa1\xb9\x60\x94\xd1\x8e\x41\x57\x6b\x59\x1f\x85\x82\x99\xcb\x44\xef\xc4\x3c\x45\xd7\x14\x63\xb0\x3f\x88\xbd\x86\x05\x8f\x62\x97\x1e\x1c\x4b\x46\x30\xc6\x92\x12\x4a\x0c\x44\x08\x0a\x89\xe7\x3e\x8c\x44\x19\xc3\x0f\xa8\xb4\xa8\xe1\x84\xa7\xf5\xd1\x86\x86\x30\x2d\xa5\x4c\x76\x9b\xfc\xb1\x7a\xe1\xab\xf4\xaf\xbe\xee\xa3\x14\xef\xad\x97\x5c\x80\xfd\xdd\xbb\xf2\xae\xa4\x41\xcc\x0d\x02\x27\xd0\x7b\x26\x9d\x0a\x5a\x51\x4b\xe5\x61\xd9\x5a\xe5\xc6\xb3\xee\xb8\x84\x30\xa0\x3d\xe7\xc0\x87\x1c\x8c\x55\x87\x40\xb7\x57\x46\x17\x4e\xa1\x83\x63\x95\x30\x9e\x7a\x0b\x4d\x45\xbd\x0b\x07\x07\x8b\x70\x72\x61\xf2\x1e\x64\x0e\xe4\x79\xe6\x57\xde\x36\xb9\xab\x2e\xd8\xec\xdf\x25\xdf\x3f\x33\x1c\x77\xb1\xaf\x70\xd1\xc6\x78\x72\x9b\xba\x84\xb7\x5b\xbf\x4c\x6b\x44\x40\x04\xee\x37\xb9\x0a\xb0\x03\x25\x0f\xfd\x60\x83\x57\x40\xca\xa0\x40\x57\x64\xc1\xa6\x79\x56\x00\xb8\xa7\x73\x6f\x01\x2c\xe6\x21\x28\x37\xe9\xa6\x06\x3c\x78\x67\x0d\xc8\x9d\x76\x4e\x83\x6c\xed\x6d\xe4\x11\x63\x64\x92\xdd\x85\x3f\xbe\xcc\xcd\xfb\x57\xef\x37\x4f\x17\x36\x56\x93\x76\xeb\xf1\x62\x33\xbe\x5e\xfd\xf5\x71\xbc\xb8\xb4\xee\x59\xc4\xe8\xcc\x95\xcf\x7d\x96\x1e\x02\xa9\xb5\xa8\x8e\xa3\x13\x43\x98\x0e\x07\x7e\x08\x47\x42\x1d\xac\x32\x3d\xb4\x92\x10\x26\x85\x29\x47\x73\xcc\xdd\xde\x18\xc7\x9c\x09\xf5\xaa\x94\x72\xa2\x5a\x56\xcc\xcb\x4a\x0e\xd2\xf1\x56\xf6\xa6\x28\x88\x44\x3d\x25\xb4\xc8\x35\x2c\x37\xdd\xd9\x07\x29\x81\xdd\xe4\x91\x07\x43\xef\x7c\x3a\x5c\x76\xc8\xf2\x1a\xc3\x5e\x74\xfd\x97\x0b\xff\xc3\x12\x71\xac\x7d\xdd\x57\x3f\xbe\x7b\x78\x0d\xf2\xb4\xaa\x52\x5b\x48\xa5\x11\x9a\xe5\xd9\x94\xa0\x01\x7a\x16\x2b\xd4\xb0\x06\x53\x86\x71\x50\x29\x6c\x9a\xa0\xa5\xd6\x04\xd3\xcc\xe5\x6e\x49\x84\x83\xc7\xc8\x26\x9b\xe5\x7f\xb0\x9f\xbe\xf4\x32\x5e\xcb\xea\xb7\x7e\xcb\x75\x51\xa4\xe3\x4f\xd3\x8e\xfd\x54\xa4\x49\x19\xf4\x56\x7d\x76\xdb\xe6\x33\xdb\x1b\x48\x50\xb0\x22\xb8\x0d\xa5\xa1\x97\x73\x2f\x62\x1f\x62\x3b\x3d\xf2\x88\x51\xf9\x55\x8f\xe4\xdd\xa9\x2d\x31\x80\x2e\xd4\xae\x46\x74\x25\x9b\x87\x7a\x6f\xa0\x51\x7f\x18\xbb\x6e\x9f\xdb\x19\x81\xf6\x73\x0f\xc6\x8b\x3e\xc0\xea\xf3\xf3\xa7\x4f\x7a\xce\xcf\x11\x7e\xac\x8e\x7d\xdd\xa5\x2d\xf1\xc0\x07\x99\x26\x9f\x49\xeb\x87\xb4\x10\x9c\xa9\xd2\x51\x38\x0b\xff\xa4\x8b\xb1\x37\x95\x69\x9c\x03\x32\xf8\x70\x3c\x6b\xce\x0b\x5b\x30\x17\xec\x96\x86\x43\x1d\x50\x9d\x3c\x69\x14\xb8\x8b\x46\xc1\xbf\x89\x51\xc2\x57\x35\x0a\xee\xae\x4c\x8c\x17\xd6\xb3\x37\xd6\x87\x9f\x76\x02\x16\xe0\xf0\xb9\x05\x7d\x5e\x06\x0c\x20\xc4\x8e\xc2\x89\xa0\x1a\x63\x80\x3e\xcb\x12\x68\x58\x56\x65\x91\xba\x8e\xaa\xb6\x12\x6e\x68\x97\xb5\x30\x6b\xda\x81\xd3\x70\x00\x47\x42\xea\x4a\xe1\xbd\xe6\xca\x39\x46\x6f\x65\x0a\xdc\x81\xb1\x9c\x52\x77\x72\x8c\x59\x26\x1d\x72\xb9\x64\xd4\x1a\xc5\x30\x51\x7d\xb2\x49\xfb\x1b\x0c\xd1\xa7\x9b\x7a\xcd\x0d\x73\xef\x06\x43\xf4\xe9\xfd\x6d\xe1\xe6\xd3\xc7\xfb\x87\x7d\x54\x2e\x78\xd8\xe4\x47\x07\xb8\x9f\x26\x1f\x6a\x77\xdc\x0a\x7f\x3e\x78\x06\x58\x9e\x55\x59\x0e\x6a\xdd\x11\x0c\x19\x93\x39\x0c\x03\x3c\x9e\x0c\xf0\x38\xf4\x5f\x05\x11\x1d\x0e\x99\xcf\x08\x07\xe4\x18\x0e\x5a\xf6\x20\xfa\x0d\xd7\x8f\x24\x72\xc3\xbe\x49\xde\x24\x49\x14\xa8\x49\x77\x4f\x24\xd8\xbf\x05\xdf\xef\xbe\x5f\xe2\xb1\x4a\xee\x94\x0f\x03\x28\x80\xc1\x01\x85\x26\xb8\x50\x40\x50\x1c\x8e\x61\x04\x1d\x40\xee\xac\x0e\x60\xf2\x36\x8c\x15\x43\x1e\x39\x0f\x5d\x81\x88\x67\xae\x1f\x93\x64\x9b\xc8\x47\xbe\xed\x63\x3f\xf4\x8a\x22\xbf\x01\x70\xbd\x79\xff\x42\x54\xf1\xd6\x72\x34\xaf\x22\x24\xa0\x3a\x2b\xc0\x68\xcd\xb5\x51\xa5\xd1\x65\x19\x26\x43\xbd\xad\xd3\xc1\x72\x4b\xed\x5e\x1d\x7d\x18\xbd\xef\xe7\x44\xf1\xd2\xc3\x12\xa7\x9c\x86\x63\xcf\x8e\x53\xdb\xb3\xbe\x5d\x3d\xfa\xd2\x15\x73\xbb\xc6\x08\x9f\x22\x05\x24\x8f\x9a\x0c\x77\xef\xee\x3f\xa6\x1a\xdb\xc1\x66\xfe\x78\x20\x13\xee\xc8\xb8\xd7\x96\xe0\x33\xa6\x26\xf2\x11\x42\x19\x38\xf5\x1c\x40\xc9\xb6\x35\x8a\xb5\xe3\x54\xdf\xe9\xbd\x4a\x36\xc9\x6f\x92\x3f\x4d\xbe\xbb\x70\xdf\xaf\x31\x59\x94\x2a\x4c\x76\xef\xfe\x05\xd8\x0c\x4b\x06\x7b\xea\xd5\xe1\x38\x27\xce\x87\xa3\x04\xd9\xe6\x24\x03\x3c\x1b\x96\xe6\x29\xd9\xab\xf9\x04\x9a\xea\x60\x8f\x15\x63\x53\xe3\x2a\xac\x83\x51\x96\x1d\x63\x5c\x23\xb7\x78\x77\x4c\xfe\xec\x89\x87\xf5\x24\x54\xbf\xdc\x1e\x29\x78\xf7\xf1\x9b\x57\x6f\xdd\xa6\x9e\xc7\x0c\x9c\x32\x55\x11\x96\x73\x82\x73\x14\xda\x22\x74\xdc\x9b\x6c\xda\x1d\x7d\x5f\x9d\x8f\x51\xad\x5e\x0c\xa0\x9f\x75\xa8\x5d\x9b\x26\xa9\x8f\xfe\xfe\x74\x97\x45\xad\x88\x55\x31\xea\x85\xba\x38\xb8\x22\xea\x5f\xe2\x3d\x6e\x94\x17\xa2\x38\xf5\xf2\xd8\x9f\x7b\x0f\x86\xbc\xa8\x60\x3e\x1f\x81\x5d\x12\x85\x48\x31\x07\x2e\xa8\xe8\xcc\xe8\xfc\xac\x3d\x70\x21\x03\x53\xd0\x2e\xb5\xb3\xde\x4d\x6b\x97\x02\x23\x48\xe9\xdc\x29\x27\x44\x2c\xd1\xe9\xb9\xe2\x2c\xe5\xcb\x9b\xec\x14\xf9\x7c\xe2\x91\x6e\xa7\xd8\x97\xfe\x17\x51\xa1\xf8\x92\x2b\xdc\x3e\xeb\x9f\x2e\xfd\xff\x1f\xdf\x6d\x2e\x8a\x12\x2b\x1e\xfe\x9b\x18\xf5\xa5\x15\x2a\xd3\xac\xc7\xaa\x6d\xd8\xe1\x30\x86\x8a\x02\x74\xe8\x5a\x71\x18\x38\x9a\x13\xd0\x95\xe5\xd1\xa7\x49\x55\xcd\x27\x54\x4b\xc5\x62\xaa\xb8\x37\x94\x3b\x27\xb9\xb2\x46\x54\xd8\x22\xc9\x88\xc2\x82\x49\x47\xd0\xb9\x56\xea\xcc\x80\x9e\x8c\xe5\x20\x29\x3a\x9c\x6c\xc0\x70\xa9\x8d\xfc\xd5\xa5\x2e\xfb\x02\x73\xfb\x04\xb9\xfd\x02\x61\xfb\xf1\x6f\xc0\x2d\x1f\x65\x3d\x80\x88\xcc\x8d\x16\xd2\x3f\xa4\x18\x1c\xf2\xac\xca\x53\x39\xeb\xbc\x48\xcd\xcc\xf0\x46\x8e\xb2\x33\x82\x05\x99\xe2\xd9\xbb\x80\x04\x30\x2e\x30\x30\x65\xa1\xe1\x52\x78\x15\x26\xa0\x70\x16\x4e\x80\x15\x79\x60\xdb\x8c\xa2\xf9\x88\x48\x9a\x83\x62\xd4\xc7\x30\x5e\x41\xb8\xd8\x1a\x27\xb9\xa3\x54\x30\xe2\xc2\xd8\x38\xd3\xb8\xb2\x64\x94\x33\x63\x8c\x13\xa5\xc5\x64\x16\x91\xb6\x0a\x75\x6d\x1a\x9d\x6c\xb7\xfa\x91\xdc\x75\x7b\xfc\xeb\x3a\x7b\xf9\x8b\xfc\x2c\x6e\x0a\x79\x8a\x74\x5e\xa2\x22\x57\x05\x95\x8a\xe2\x30\x48\x90\x64\xca\xdf\x16\x2d\xf6\xf8\x33\x0f\x16\xe6\xa4\x46\x47\x41\x05\x70\xc1\x1d\x75\x07\x8a\x0d\xeb\xe7\xe1\x30\x1f\x0e\xc9\x26\x85\x91\x0f\xae\x9f\x15\xbe\x7f\x05\xd7\xba\xd6\xf3\x7f\x15\xd9\xda\x82\xb1\x4a\x8b\xf9\x04\x5a\x6b\x03\x05\x87\x80\xdc\xf1\x80\xaa\x88\x6c\xc5\x39\xc5\xfa\x04\x5d\x56\x2a\x1f\x0d\x55\xc6\x34\x8f\x36\x0d\x79\xea\xa2\x95\x30\xfc\x12\xdb\x6a\x8c\x80\x02\xab\x13\xc0\xa5\x14\x16\x81\x93\x75\xcf\xe8\x56\xe7\x92\x24\x4d\xf5\x23\x8e\xfb\x6a\xf4\xac\x07\x2f\x3d\xeb\xc1\xbb\x6f\x56\xee\xfc\xd5\xb3\x7e\xc5\x28\x5e\x3d\xeb\xd3\xce\x49\xec\x30\xed\xaa\xaa\x5a\x16\xbe\xa9\x88\x3a\xd4\x1b\xe7\x30\x19\xc7\x25\x16\xf6\x5d\xd7\xd5\x72\x57\x36\x0d\xbe\x75\xae\x2f\x81\xfd\x8a\x73\xfd\x36\xa9\x37\xfc\xce\xee\x65\x72\x9f\xbc\x4b\xfe\x6d\xec\x01\xbe\xfe\xf6\xaf\xc1\xeb\x58\x60\x7f\x88\xbd\xcf\x0f\xe0\xb2\x3e\x5f\xf5\xe3\x96\xdb\xf8\x87\xfd\xe6\xed\xfd\xfb\x77\xff\x0e\xfc\xed\xb2\x4f\xac\x72\x72\xcf\xf8\x9b\x97\xfc\x95\x06\xf9\x96\xd0\x70\xcc\x5b\x26\xe8\x8c\xd3\xe2\xdc\x6c\x44\x64\xd1\x99\x03\x48\x7a\x25\x68\x98\x50\xd5\x68\x4a\x65\x51\x9e\x40\x69\xcb\x92\xd3\xf4\xd8\x7a\x8e\xe6\x31\x6d\x09\x73\x86\x57\x75\x35\x50\xaf\xa4\xdc\x4b\xc9\x34\xa3\x85\x43\xbc\x64\x7a\xf6\x2a\x3d\xc8\xa2\x90\x54\x96\x90\x2b\x02\xda\x90\xd1\x02\xe6\x85\xa4\x65\x41\xd1\x63\x52\x22\x88\xa5\x64\x04\x21\x49\x31\x2d\x55\x5e\x96\x79\x5c\x4f\xdc\xe6\x78\xc7\x23\x66\xf6\xcf\x62\xbe\xf8\xfe\xf5\xfa\xb4\xbe\x58\xfb\xde\xef\x2e\x85\xcc\x4d\x5d\x81\x84\x62\x2f\x81\xf0\x3f\x49\x0f\x14\xc2\x5a\xb0\x53\x40\x11\xa7\xb7\x81\xe7\x61\xaf\x3b\x2e\xa0\x0b\xd5\xf1\x08\x04\x46\x8c\xc9\x43\x98\xc4\x92\x98\x66\x91\x93\x26\xf6\x2c\xb9\x4b\xfe\x34\x79\x73\xa9\x09\xfe\x87\xd8\x89\x7b\x12\x70\x5f\x7f\xee\xde\xc7\x8d\xe8\x1b\x70\xf9\xb9\xbb\xad\x68\x5d\xbd\x9d\xbf\x58\xf4\xde\x5e\x0c\x99\x52\xa2\x0f\x7a\xd3\xa8\x41\x85\x46\x73\x25\x25\x03\x93\xe2\x4a\x08\x1e\x2a\x41\x19\xe5\x29\x16\x8c\x51\x7e\x9e\x00\x86\x85\x43\x69\x52\x95\xbc\x76\xdc\xf4\x4d\xe8\x18\x48\x9c\xab\xcd\x08\x1c\x42\x46\x8b\x72\xcf\x66\x92\xb2\xb9\x49\xbb\xeb\xcf\x63\xd0\x61\xd0\x4c\x80\x02\x88\xa0\xc3\x41\x2d\x6f\x2b\xc2\x39\x27\x3c\x1e\xc3\x40\x49\xae\xad\x55\x98\x68\x42\x0d\x71\x90\x22\xd4\x51\x5c\x42\x21\x93\x34\x11\x1b\x7c\x57\xed\xab\xe4\xd5\xaa\x2f\xff\xdc\x5d\xb8\xde\x29\x2b\xb4\xe7\x05\x1a\xea\x26\x81\x07\xa3\x45\xa0\xe9\x66\x45\x53\x52\x07\x0f\x8d\x24\x14\x63\xd6\xef\xb2\xa0\x50\x07\x32\x92\xf9\x82\xa0\x50\x85\xa3\x4c\x7b\xc6\xb8\x2f\x6a\x0c\xf7\x15\x25\x26\xe8\xc1\x35\xa0\x84\x4a\x53\x82\xa0\xd1\x79\xf0\x65\x8e\x24\xf6\x68\x95\xbb\x18\xa3\x66\x2a\x5c\xee\x89\xea\x91\x6c\xd1\x5e\x47\x0e\xcb\xbf\x4a\x92\x57\xef\x5f\xc5\xe5\x3b\xbd\xbb\x34\x83\x5f\x36\x3c\xde\x7d\x7c\xf5\xf6\xd6\x1b\xbd\x99\x88\x43\xa0\x09\x90\xcb\xc1\x83\x2c\x4c\x4c\xf0\xa8\x3a\x5d\x04\x5f\x6a\x7e\x48\x8f\x82\x58\xcc\x03\xb1\xd4\x68\xbb\x93\x20\x2f\x47\x17\x8e\xc3\x92\x94\xd9\xb9\xd5\x3c\xf7\x79\x49\xd2\xd2\x0e\xa0\x9c\x8b\xee\x88\x4f\x2d\x82\x8f\x49\x25\xda\x24\xf9\xe3\x84\x6f\xb2\xb8\xee\xfd\x26\x79\xfb\xa4\x79\xff\x9f\xa2\xdf\xaf\x48\xfe\xe7\xe4\x7f\x4d\xfe\x8f\xaf\xd4\x9b\x2e\x15\xa5\x4f\xeb\xf1\x06\xfc\x72\x5b\x6a\xda\xbf\x2c\x35\xbd\xfe\x07\x95\x9a\x8e\xb3\x1b\xf3\x22\x1c\x18\x96\xb1\xd4\x24\x65\x57\x7a\xae\x99\x74\x18\x2b\x5f\x1f\xe0\xf6\x24\x90\x28\xfb\x13\x54\xa2\x2e\x2d\x57\x54\x30\x8c\x91\xae\x2b\xc5\xcb\xb3\xbc\x7a\x36\x83\x63\x28\xcd\xe9\x14\x4e\x14\x4b\xc8\xb6\x47\x8e\x04\x62\x9f\x0b\x0a\x25\x24\xdb\x23\x45\x02\xd2\x9f\x4e\x0a\x13\x49\xb7\x9d\x82\x48\xe2\xbd\x46\x44\x08\x58\x86\x93\x90\xb8\x28\x70\x29\xa9\x28\xa5\xa8\xa1\x61\x39\xa1\xa8\x37\x08\x23\x69\x30\x43\xf1\x0b\x25\x2a\x68\x58\x96\x13\x82\x06\x55\x14\xc8\x70\xcc\xd1\xc8\x49\x41\x18\x66\x04\x33\x8e\x39\x2b\x09\xc3\x94\x62\xca\x30\xa3\xb0\x34\x0c\x0b\x5e\x0a\x8a\x69\x92\xfc\x49\x8c\x3f\xd0\xaf\xd4\xf7\xff\x9b\x84\xaf\x8c\xde\x5b\x75\x59\xf0\xe5\xef\x5f\xad\xef\xff\xec\xd9\xfe\x18\x93\x97\xb7\x97\x0a\x7f\xb3\x64\x54\xc6\xc7\x3f\x80\x2f\x01\x95\x59\xfd\xfc\x43\x4f\x31\xc3\xc4\x49\x2a\xb8\x48\x73\x49\x38\x63\xa0\xa0\x48\x95\x74\x86\x20\x2b\x0b\x07\xd3\xcc\x63\xa6\x25\x97\xae\x0e\x07\x7a\xf4\xc6\x63\xd8\xa5\x09\x45\x61\x2c\x4a\xb5\xe7\xe7\x31\x85\xea\xff\x66\xed\xed\x81\x64\xc7\xb5\x34\x31\x82\xcc\x1f\xee\xce\xcf\x63\xf5\xed\x7a\x97\xef\x8d\x46\x0f\xf5\xaa\xbb\x8b\x33\xbb\xab\x45\x4c\xcd\xbd\x85\xd8\x89\x9d\x85\xb4\x52\x04\x56\x21\x03\x21\x29\x24\x28\x42\x06\x2c\x09\x26\x4c\x98\x30\x61\xc2\x84\x49\x93\x26\x4d\x9a\x34\xd3\x4c\x33\x4d\x9a\x69\xa6\xc9\xee\x2a\xa2\x14\x04\x33\xeb\x66\xdd\xee\xf7\xde\x68\x76\xfa\x36\x2b\x7f\x2a\x2b\x93\x64\x12\xc0\x39\xdf\xf9\xce\xf7\x85\x6e\xfe\x3f\xad\xae\x1e\xbc\x26\x88\x09\x8e\x69\x34\x65\xe6\xc4\x52\xce\x85\x90\x44\x8a\x30\x10\x52\x28\xeb\x05\x26\x96\x52\x59\xd9\x82\x62\xcc\x59\x47\x15\xae\xe6\x44\x31\xc1\xa9\xde\x76\x1b\x9d\xfc\xc7\xa8\x13\xb3\x20\x01\x5f\xd0\xfc\xc7\xdb\xc7\x4f\x6f\x6e\x70\x37\x5f\xf1\x0f\xde\xb5\xbe\xdd\x09\x77\x6a\x64\x73\xb8\x90\x81\x41\x63\x0f\xc1\x9b\xd8\xc7\xa1\x80\x59\x48\x07\x00\x85\x1e\xf4\x2e\x74\x7a\xc4\xa1\x6e\xa7\xdc\x87\x86\x1d\xea\xd0\x66\xc7\x14\x97\x44\xe2\x92\x29\x2e\x79\xd3\x9c\x40\xcd\xa4\x09\x0d\x53\x4c\x0a\x3d\xb5\x9a\x40\x8b\x5b\x2f\x14\xe2\x49\x96\xf9\xd8\xbf\xa6\x92\xdf\x45\x04\x37\x01\x8f\x3f\x73\xfd\x7b\xaf\x55\xf8\x71\x7b\xfb\x98\x3d\x7e\x88\xbd\x7a\x51\x2c\x39\xa2\x1b\xe9\xfd\xef\x2f\xcb\xde\xfd\xed\x82\x79\xbd\xeb\x36\x7d\x8a\xc2\x4c\xdb\x87\xb3\xfa\x5a\xd6\x0e\xb0\xb2\xa4\x32\x18\xd6\x15\x02\x45\xd0\xe7\x9e\x95\x0a\xd4\x73\xf8\x1c\x24\xd0\x5c\xef\x0a\x5b\x80\x2a\x0c\x79\xa9\x24\x91\x55\x55\x14\xa6\xb4\x8a\x0a\xca\x84\x80\xe5\xde\x17\x8c\x53\xce\x08\x64\xac\x92\xb2\x3c\x0e\x83\x65\x20\x4f\x09\x47\x0a\xb1\x75\x4b\x08\xe1\x52\x08\xc4\x88\x95\x56\xda\xf9\x47\x28\x24\xd2\x73\xc0\x65\x89\x71\x44\x69\xc9\x68\x19\x4e\x9e\x57\x8a\x08\xd3\xa8\x52\x97\x45\x2d\x59\x61\x0b\x2e\xca\xc2\x56\xd6\x32\xa8\x10\x66\x82\x70\x16\x71\x56\xbd\x1a\xb7\x66\xe3\x63\x4f\xda\x1b\x13\x7c\xb1\xd3\x58\xe5\xb0\xcc\xc8\x4f\x6c\x75\xf8\xc9\xf5\x59\x59\x94\x1b\x8f\xb0\x21\xba\x33\xb0\x8c\xeb\xae\xcf\xd0\x99\x8b\x82\xe3\x0a\xf8\xc7\x49\x28\xe7\x4b\xe7\xc3\xc5\x88\xe4\x4b\x54\xf1\x0b\x38\x23\xa8\x01\x0c\xc3\xaa\x7d\x2b\x79\x0d\xa0\xb5\xee\x27\xe6\xcc\x50\x8b\xba\x03\xd0\x49\xce\x09\x43\xc4\x50\xc6\x8c\x44\x94\x53\x0a\x14\x81\x88\x12\xca\x38\xb7\x88\x11\x4c\x70\x47\xd7\x90\xca\x79\x9e\x91\x54\x4d\xa7\x05\x7f\x03\x27\x48\x04\x81\x44\x02\x02\x2b\x84\x48\x55\x11\x86\x2a\x02\x59\x59\xc1\x72\xc7\x60\x59\x56\x14\xc1\xaa\x62\x25\x2c\x4a\x4a\xa2\x97\xc5\xbf\x4e\xc4\x2b\x59\x25\x1b\xf6\x8b\x73\x46\xb2\xa8\x40\xdf\xdc\x3f\x9e\xe9\x72\x3f\xab\x0d\x5e\x4d\xb6\x3a\x33\x2f\xc6\x49\x39\x0a\xa7\x26\x96\xc1\x97\xa1\x7e\x03\xe7\xe7\xcd\x7b\x23\xb5\x0b\x83\xd4\xb5\xf0\x1b\x36\x9d\xec\x97\xb0\x3a\x94\x2f\x6d\xca\x23\x05\xa0\x51\xf3\xa2\xa4\x25\x93\xdc\x72\x4b\x62\x6c\xc2\x5e\xc5\x0a\x6e\xf4\x9b\x92\xcb\x7b\xf5\xe4\xdb\xbb\xed\x65\xff\xce\xff\xbe\xc8\xf5\x7d\x7a\x8c\x69\xcb\x87\xc7\x9b\xfb\xb7\xed\x17\xd4\x93\x6f\xb7\x7f\xff\x00\xa0\x2d\xca\x94\x4f\xba\xc2\x4c\x31\xc5\xb4\xd6\xfc\xc5\x48\x6b\x4b\x28\xac\x65\xac\x8f\xff\x3b\x8a\x75\x45\xa7\xbd\x21\x54\xb3\xb4\x20\x50\x43\xcc\x90\x2d\x37\x1a\x52\x6a\xf9\xdb\x70\x8f\x9b\x0d\xad\xb5\x80\xd9\x5d\x05\x65\xff\x62\xe2\xb8\x89\xdb\x74\xd2\x16\x7b\x05\xd1\x50\xd3\xb6\x76\x6d\xd5\xb9\xa2\x6e\x8a\xce\x25\x67\x4f\x02\xba\x2a\xce\xfe\x4b\xd5\x9b\xb2\xed\x42\xa7\xbf\x62\x9a\x44\xe7\xb2\x73\xe7\xf1\xc3\x87\xfb\x9b\xc7\x8f\x57\x0a\xd2\xdf\x9f\x81\x89\xdb\x6d\xf1\x90\xd6\x55\x01\xf0\x44\xac\xad\xad\xb5\x81\x59\x63\x14\xb0\xe8\x58\xd7\x2d\x29\x05\x44\x88\x14\xaa\xc0\x61\xa7\x4a\xac\x31\xa8\xa0\x2e\x36\x86\x71\x1b\xfa\x61\x18\x06\x13\x2a\x70\x68\x43\x11\x24\x03\x0e\x1c\xd2\x9d\x9d\x50\x68\x6a\xd7\xc2\xd6\xe7\xc3\x50\x8d\x87\xbc\x08\xc7\x91\x1c\x4f\xc7\xb1\x00\xc5\x3e\xc9\xa3\x9e\x45\xb9\x91\x57\x1d\xad\x67\x45\xdb\x0f\x8f\xb7\xdf\x3d\x9d\x59\x24\xf0\xdc\x43\xfd\xf0\xfb\x1f\x3e\x7d\xfc\xfa\xba\x8a\xa1\xcc\x15\xaa\xfd\xd0\x3b\x50\x9d\x44\xd8\x85\xbe\xf2\x20\x97\x91\x4e\x62\x0f\x05\x46\x6d\x8a\xa7\x9d\x03\x65\x54\xde\x8e\x5b\x70\x2e\xed\x5e\x3a\x50\x32\xd7\x52\x0f\xda\x5a\x4b\xe5\x36\x52\x23\x2a\x79\x55\xc1\xa2\x14\xd8\x90\x9c\x92\xc3\xcb\x98\x22\x1e\xf6\x22\xf4\x12\x0c\x2f\x27\x5b\x2a\x45\x2d\x8a\x45\x61\xba\xf4\xbf\xbf\x92\x6c\xdc\xd8\x37\xbc\xfd\x53\xf2\x5f\xce\x88\xfb\x77\xbf\x03\x57\x6a\xbb\x57\x9a\xb0\x5f\x1c\x9b\xae\x4b\x64\xb1\x3a\xfe\x18\x2f\xd5\x2b\x82\x53\x66\x65\x38\x4e\x3d\x49\xe1\xc9\x31\x6e\x65\x18\x31\xb4\x10\x37\x14\xd9\x8a\xa6\xad\xa2\xb6\x2c\x43\x1f\x6a\xd8\x78\x6b\xca\x4e\x5a\xa3\xa4\xe1\xc4\xef\x4f\x75\x53\x96\xd3\x0e\xc8\xc2\xe5\x40\x07\x59\x1c\x1b\x5e\x1f\xd4\x4e\x8e\x2c\xec\x36\x56\x32\x62\x91\x41\x9d\x66\x56\x70\x89\x14\xcb\x63\xb1\x37\xe4\xae\xc1\x04\xd1\x52\x72\x53\xe6\xda\xd5\xa8\xe6\x39\xe4\x12\x85\x9d\x87\x08\xc1\xa0\xe6\xf9\x45\x68\x6b\x94\xe7\x4e\xd4\x8b\xff\x03\x7f\x65\xd9\x6e\xa3\x93\xbb\xe4\x87\xb3\xef\xd2\xe5\xe8\xe6\x1c\xea\xf1\xe6\xcd\x25\x30\x5d\xcf\xc1\xe6\xcd\xdd\xe7\xa7\x39\x63\x9c\x23\xfe\xc7\x9b\x65\xac\x01\x4b\x84\x6c\xb8\x2b\x21\x10\x98\x1c\x77\xbe\x72\x9a\x96\x3c\x1c\xd5\x20\x47\xa0\x29\x0e\xde\x94\x79\x0d\x50\x5e\xec\x28\x89\x15\x3b\xae\x98\xac\x0f\x15\xc6\x56\x89\xa9\x9d\x46\x61\x04\x61\xa9\x0e\xc5\x68\xf7\xc0\xa5\x4c\xa8\x49\xb9\xda\x7b\x80\xa6\x93\xd4\x58\xab\xc5\x0b\xe2\xd5\x66\xc3\xfa\x94\xfc\xed\x82\x41\xdd\x7c\x73\xcd\x05\xbc\xfd\x3c\x5f\x79\x0f\x9f\x9f\x6e\xb6\x6f\x32\x14\x31\xe7\xae\xb3\x24\xec\x55\x69\x72\xc8\x88\x84\xa8\x22\xcc\x1b\x18\x9a\xc0\x60\xd7\xb0\x0a\x55\x48\xe9\xc2\xe4\x90\xe3\xd0\xaf\x4f\xee\xc5\x01\x01\x9a\xf2\xd8\x3b\x6b\x9d\xea\x3d\x1d\xaa\xca\x59\xde\xc2\x0a\x18\xad\xc5\xa1\x95\xa0\x49\x73\x38\xee\x95\xcc\x50\x92\x27\x22\xdd\xc7\x5a\xdc\x9f\x27\x0f\xc9\xbf\x7d\xe7\x05\x75\x9e\xbb\x62\xfe\xff\xfd\x3b\x5c\x78\x7b\xa5\x96\xb1\xc8\x2a\xac\x1f\x9f\xee\xa2\x1a\xf4\xe3\xed\xdd\xd3\xfd\xf7\x4f\xf7\xdb\xfb\xa7\xfb\x5f\x81\xc7\xa7\xfb\xbb\xed\xe3\x13\x70\xf3\xd4\xa5\x27\x84\x4b\x82\xf4\x21\xdb\x47\x3d\x25\x5f\x59\x77\x10\xfb\x5a\x54\x82\xd0\x5a\x72\x5a\x14\xba\x66\x54\x4a\xf8\x13\x6d\x60\xda\x43\xeb\x0a\xfe\xb2\x2f\x5d\xba\xcf\x6d\xa1\x0b\x9f\x97\xb6\x70\x20\x2f\x7c\xbe\xb1\x15\x84\x8a\x94\x08\x0a\xe3\x2b\x4a\x4d\xed\x15\x33\xc2\xcc\x69\xab\xae\x38\x53\xb0\xe4\x9d\x30\x42\xea\xee\x70\xd0\x5c\xef\xb5\x10\x42\xec\x79\xd4\xf9\x4c\x13\x95\xf5\xd1\xb3\xf9\x76\xf1\x8e\x3b\xe7\x51\x4f\x57\x4d\x12\x9f\xbf\xbf\xfb\x8a\x49\x76\xe5\x45\xf1\x09\x8c\xba\x02\xbe\x9d\x0c\x49\xab\x3a\xd4\xc5\xbc\x1f\x15\xc2\x94\x1d\xd6\xc5\x9c\x4a\x9d\x70\xee\x4b\x15\xfa\x70\x10\xb1\xa0\xaf\x4b\x83\xaa\x8d\xa5\xd8\x84\x46\x39\x7a\x2a\x8b\xaa\x92\x08\xa1\x4a\xeb\x7c\x84\x05\xa4\xc8\x60\x2c\x80\xdb\x11\x52\xc8\xa2\x8a\x6b\xbc\xcc\x58\xd4\x7b\xf8\xb7\xd1\xf3\xe5\x1d\x8b\xe9\x76\xc1\x11\xae\x12\xa9\xbb\x0b\xf6\xb5\xfc\xfb\xfe\xe3\x1f\x53\xc0\xf0\x40\xba\x28\x7b\x83\xc3\x0e\x88\x50\xe4\x05\x38\x72\x87\x79\xa1\x10\x81\x41\xb0\x9a\xed\xf1\x6b\x02\x5c\xf4\x19\xf0\x2b\x61\xaa\xb4\x50\xd0\xd8\x4e\x76\xde\x1f\xc4\xde\x72\x0a\x2b\xd5\x08\xae\x14\x0c\xcd\x06\x53\xaa\xb0\x44\xaa\x2c\x3a\x5a\xf0\x02\x42\x41\x24\xd3\x0a\x49\xdc\x56\x42\xd7\x86\x12\x43\xa5\x20\x1a\x51\x2a\xaa\x8a\x75\xc4\x30\x11\xbd\x5b\xfe\x55\xe6\xfe\x65\x3d\x1f\x32\x07\x9a\xd8\x37\xcd\xb3\x21\xf0\x68\x79\xbe\x7f\x1e\x21\x20\xa1\x57\x42\x80\xf1\x7c\x67\xaa\xbe\x7e\x06\xa6\xce\xa6\xdc\xda\xa9\xb1\x93\xfa\x83\x9e\x0f\x69\x22\xb3\x36\xe2\x1d\xbf\x7d\xf3\x7d\xba\x32\xd4\x5a\x2c\x07\xef\x2f\x69\xc9\x02\xa2\x45\xac\xf2\xfe\x0d\x9a\xfc\xb4\xb9\x7f\x80\xab\xce\x14\x30\x65\x66\x4f\x04\xb4\x58\xd2\xda\x85\xbd\x00\xb9\xd9\x61\x2c\x5c\x18\xa9\x8d\xde\x77\xad\x66\x52\x39\xb3\xe3\x7b\x1d\xf6\xc0\x3a\x5f\x01\xb1\xd1\x25\xc6\x41\xd7\x85\x29\xc4\x2e\x9c\x9c\xd2\x1d\x41\x5c\xb5\xa6\x2c\x84\xce\x09\xd5\x94\x74\x7b\x23\x34\xd7\x9a\x17\xfa\xec\xf9\x94\x99\xf3\x3e\x3f\xfd\x93\xf6\xf9\x97\x77\xf9\x34\x0f\xe0\x5c\xd6\x54\x41\x4f\x08\x32\x36\xec\x19\x48\x54\x47\x99\x6c\xc2\x61\xd9\xe5\xd1\x49\x2e\xa4\xb3\x3b\x76\x30\xe1\x00\x94\xb1\x08\xb0\x8d\x86\x08\x05\xd2\x16\xb6\x90\x63\xd8\x37\xda\x1e\x18\x11\xa6\xd3\xb0\xd0\x86\x10\xcd\xc8\xe1\x54\x4b\x25\x8d\x91\xb9\x59\xf6\xb7\x88\xfb\xfb\x9b\xa5\x87\xe9\x5d\x27\xf8\x3f\x65\x77\xd7\x0f\x70\x75\xf0\x30\xcd\xed\x8e\xc8\xd2\x62\x4d\xac\x0b\x1d\x07\xa5\xa9\x99\x50\x4d\x38\x2e\x3b\x3b\xd4\x2a\xee\x6c\xcf\x47\x19\xf6\x40\x85\x71\xd9\x59\x3e\x9d\x0e\xa5\x2d\xa3\x70\x75\xa3\xdd\x49\x33\x69\x0f\x06\x96\xce\x70\x66\x04\xed\xf7\x9d\x32\xd6\x19\x53\xd8\x64\x95\xb5\xaf\xcb\x18\xcd\x93\xf2\xbd\xfe\xf7\x43\xf6\x15\x69\x2f\xfb\xc5\xd2\xda\xf7\x9f\xdf\x90\xa7\x75\x8b\x4a\xa0\x5f\x24\x30\x84\x50\x78\x20\xb0\x86\x74\x78\x81\x27\x88\x3d\x28\x11\x74\x10\xa6\x55\x57\xc8\xda\x71\xd3\xb7\x61\x27\x40\x51\x87\x8e\xe0\x01\x98\xaa\x32\x8a\x97\x1b\xc3\x95\x73\x3e\xf4\xce\xd9\x1a\x4b\xeb\x9c\xd5\x93\x91\xa2\x90\xcc\x1e\x2c\x13\x56\x28\x8f\x6d\xa5\xbc\x52\x82\x60\x22\xba\x24\xc9\xb2\x7d\xec\xbd\xc2\x51\xdf\xfa\xe3\xa5\xf7\x6a\xbb\xa8\x6b\x7f\xf3\xa5\xf3\x6a\xad\x83\xcd\x54\x68\x2b\x6f\x9d\x3e\x82\xce\x39\xa5\x9b\xe9\x94\xf9\x17\xb9\xae\xbd\xb7\xcf\x4d\xba\x0f\x87\x83\x06\x18\xb0\x70\x0a\x4e\x01\x0e\xd8\xf3\xe8\xa3\x7e\x99\x7b\xa5\x5b\x76\xee\x85\x7b\x63\x95\xde\x7f\xba\x0a\xa6\xce\x3c\xd2\xd5\xa1\x2e\x21\xe8\xa4\x04\x55\x33\xe5\xe9\x18\xfd\x0b\x20\x68\x2c\x0d\xbd\xf0\xfa\xb0\x31\x98\x52\x33\x36\xcf\x2d\xf3\x00\x3a\x00\xfd\x6e\xb7\xf7\x7a\x4c\xd2\xd5\xfe\xac\x23\xfd\x6d\xf2\xdb\x88\xa5\x2f\x21\xf6\x35\x83\x79\x89\x3c\x57\x7b\x60\xeb\xba\x66\x5c\x4b\xa8\x54\x15\xb4\x55\xcc\x11\xbd\x3a\x80\x3a\x88\xfa\xf9\x18\x7d\xc4\x78\x36\x76\xfb\x23\x3b\x46\x5f\x9a\x2c\x3b\xbd\xfa\x6d\xb3\x41\xc9\x5f\x46\x17\xe8\xeb\xfe\xb4\xf7\xed\x69\xeb\x3a\x98\x4c\x84\x5d\x59\x7a\xeb\x15\x48\x40\x6b\x8d\x52\x7e\x3a\x64\xee\x45\xad\x6b\xe7\x08\x7b\x6e\xd3\x5d\x38\xec\x35\x10\xa0\x0a\xc7\x60\x15\x10\x80\x3f\x1f\xa3\x3f\x65\xe4\x5a\xba\xa8\x51\xff\x73\x4c\xfb\x22\x58\xff\x86\x69\x5f\x09\x98\x7c\x7a\xfc\xbc\x4a\x34\x85\x0e\x21\x25\x84\x28\x7a\xdd\x14\x6d\xeb\x52\x63\x2b\xd4\xd5\xbb\x9d\xd3\x5a\x0b\xbc\xae\x9a\x26\x22\xd7\xd4\x85\x6a\x9e\x6e\x4a\xe0\x1c\xe8\xce\x70\x36\x3d\xc3\xd9\x9d\x6b\xe2\xbe\x98\x7f\xfe\xbe\x64\x8d\x65\xc8\x22\x32\x7f\x6c\xb1\x37\x5d\xb9\xdb\x35\xe9\xce\x21\xb2\x6f\x87\xc1\x39\xe7\x14\xbd\xde\x17\x14\x2f\x65\xe0\xff\xd0\xbe\x64\xd9\x10\x35\xd8\x4d\xf2\xe7\xc9\x37\x97\x6b\xe8\x62\x38\x93\x9c\xfb\x78\xef\x6e\xbf\xcd\x16\x4a\xe0\xda\xb8\xa2\x1c\x4e\xfc\xb8\x6f\xf6\x0c\xc0\x03\x29\x7d\x49\xc2\x31\xcb\x35\xf7\xf2\xc0\xa6\x7a\x63\x2a\x8c\x42\xdd\xf8\x6e\x4e\x74\x0e\x16\xf0\xa3\x75\xa8\xb6\xc1\x3a\x16\xc6\xbe\x76\x07\xc0\x96\xb8\xd2\x66\x62\x2b\x37\xee\xcd\xf3\xe2\x8f\xb8\xfb\x6c\xce\xf6\x3e\x97\x0d\x0c\x73\x28\x79\x28\xa1\xc5\x30\x35\x13\x4f\x55\x64\x4e\xba\xf4\xf0\x53\x4e\xa8\x18\x52\x1f\x92\x34\x59\xb6\x8d\x85\x18\xe1\x0a\x51\xaa\xa9\x64\x92\x6a\xd0\x10\x24\x3d\xa7\xb4\x63\xac\xa5\x74\x89\x05\x5e\xe9\xaa\x8a\x7d\x7b\x7f\x9d\xfc\x2f\xef\xd4\x13\x7f\xa1\xbf\x64\x7d\xf1\x25\xfe\x5a\x68\xf2\x22\x62\xbb\xbc\x38\x42\xe6\x9f\x9f\xee\x34\x30\x25\xac\x51\x09\xcc\x0b\x4b\x99\x42\x8c\x12\x41\xa8\x62\x8c\x71\xca\x18\x8f\x4d\x71\x29\x76\xc1\x43\xd0\x73\x81\x48\x25\x70\x15\x1a\x84\x85\x2a\x4a\x4b\xa0\x2d\x9a\x0e\xe1\xaa\x71\x40\x14\x79\xe8\xd6\x47\x82\x10\xe5\x0e\x12\xca\x08\x91\x8c\x88\x4a\x21\x82\x91\xc0\x84\xe6\x41\x03\x3b\x1d\xcd\xd4\x09\x51\xb8\x9c\x01\x67\x65\x81\x30\xaa\xfc\xae\x52\xb8\xb4\xd2\x4f\x26\x2b\x08\x59\xce\x3f\x7b\xa5\xd9\xb8\xd1\xc9\x9f\x25\xdf\x25\x7f\x1b\xfb\xb9\xdf\x2b\xa5\xfd\xb2\x65\xee\x35\x96\x9c\xe6\x35\xda\x3b\xe5\x1b\x7b\x94\xa0\x62\x69\xd5\xcf\x11\x0f\xd5\x9c\x95\x42\x54\xc1\x02\xbd\x4f\x4b\xc9\x1c\x15\x41\x1a\x29\xb5\x99\xa7\x7f\x5d\xeb\x46\xee\xbc\xda\xbd\x26\x6e\x70\x53\xab\x58\xe9\x21\x4d\xb1\x1b\x02\xec\x0e\x64\xe8\x2a\xfa\x9a\x38\x39\x5f\x9b\xab\x95\x3d\xfb\x75\x5f\x62\x97\x79\x76\xb8\x7f\xf3\xeb\x7e\xba\x36\xc9\xfd\xca\xae\x7b\x07\xf2\x43\x8a\xf7\x20\x0f\xa3\x2a\xa1\xe6\xc4\xc1\x70\x0a\x3d\x6c\x7d\x18\xfb\x39\x49\x44\x5a\x83\x5c\xff\x82\x57\xb7\x46\xd0\x17\xf9\xd7\x5e\xdd\xff\xfa\xcd\x0b\xe8\x2f\xcf\x6e\xf5\x0b\xe3\x64\xf1\x3c\x7c\xc7\xe7\x7f\x53\xbe\xce\x7e\x26\xbc\x70\xfb\x26\xc3\xf2\xf1\xa2\xae\x23\x3d\xac\xc0\x0e\x56\xa0\x7c\x81\x15\x05\x49\x05\xfa\xaa\x0c\xaa\x82\x31\x9b\x6d\x40\x31\xd1\xcb\xbd\x17\xb3\x92\xcf\x3e\x1b\xfd\x54\x7b\x9f\x8a\xa9\x9e\xb7\x8d\xa9\x50\xa5\x30\x9a\x0e\xe0\x08\x8d\xef\x10\xaa\xc2\x51\x08\x11\x0e\x3c\x6a\xe1\xb2\xc9\x50\x9a\x9a\x03\x0f\x3b\x99\x2c\x9e\x0b\x5f\x78\xad\x6f\xba\x3b\xbf\xc0\x6b\x7d\x3c\xf3\x5a\xef\x6f\xbe\x7d\xfc\xbb\xa7\x3f\x42\x6c\x55\xa0\x29\x4b\x5f\x41\x50\xf7\x65\x09\xd0\xb3\x03\xb0\xa8\x5a\x60\x07\x58\x84\xae\x0a\x4d\xe6\x4f\x5c\x15\x45\x6e\x0b\x54\x75\x35\x73\x24\x0a\x94\xd0\xc1\xa7\x72\x8a\xdb\xf9\x9a\xb6\x8a\x5a\x2b\x78\xa7\xa8\x08\xfd\xa4\xc2\x89\x54\xc8\x56\x03\xae\x08\x07\x24\x68\xe9\x09\x28\x81\xb1\x21\x36\xad\x67\x99\x38\x6b\xa8\x7c\x48\xfe\x2a\xf9\xfb\xeb\x4e\x9c\x2f\xb2\x73\x5f\xf8\x2a\x73\xee\xfd\x8e\xad\x72\x16\xd6\x17\xa3\x1f\xfd\xe9\xe4\x47\x3f\xae\x4a\x3f\x21\x5f\x01\x5c\xf8\x02\x78\x33\xa0\xaa\x22\xc4\xc0\x2a\x9c\x50\xe8\x0c\x40\x55\x18\xde\x13\x55\x4e\x47\x60\x42\x39\x0c\xd3\x7e\x57\x7a\x88\x05\xa0\x81\x0f\xaa\x07\x7c\xe1\x9d\xd9\x57\x19\x6b\xa8\x7f\x16\x79\xd5\x5f\x7a\xea\x1f\xdf\x7a\xea\x9f\xde\x37\xd5\xaf\x0b\x0f\x12\xff\x42\xfd\x29\xe8\xac\x9e\x20\x05\x09\x28\x60\x95\x37\x25\x43\xc1\x05\xab\xd3\xe3\x94\x6c\x4c\x40\x40\xc5\xa6\x7a\x1f\x86\xa5\xa9\x1e\xe2\x9a\x0c\xb1\xab\x3e\x39\x2d\x6b\x6a\xff\xea\x62\xdc\x71\x51\x46\x3d\x87\xf8\xe0\x8c\xe6\x6d\xed\xcb\x90\x55\x2f\x08\x90\xf9\xe2\xf7\xc7\xe3\x06\xfb\x9f\xac\xdf\x34\x01\x4e\x85\x03\xfb\x98\x3b\xd0\x7f\xe1\xdc\x81\x82\x7d\xa0\xa0\x0b\x64\x55\x06\xbc\x38\x0c\x3e\xb7\x68\x5e\x25\x94\x94\x69\x09\x78\x68\xb4\x94\x53\xf2\xf5\x33\x55\x6a\xdf\x72\x07\xed\xff\x50\xee\xb0\x4a\x8f\xaf\xec\xec\x81\xff\x0f\x67\x0f\xcf\xaf\xb9\x60\xb7\x77\xdf\x2c\x7a\x6f\x6f\x30\xf8\xd9\x29\x3a\x7b\xd3\xef\x9b\xaf\x9f\x1f\x1e\x9e\x3e\xae\xe7\xf9\x6f\x7e\x6d\x9c\x5a\xee\x17\xb0\x67\x4d\x6c\x44\xef\xba\xe7\xa3\x73\x5d\x4a\xc2\x29\x2f\x08\x36\xcc\xa0\xaa\x28\x6c\xe9\x14\x53\x96\x36\x0a\x15\xa1\x30\x56\xa7\xda\xb1\xa2\x94\xf4\x65\x00\xb5\x29\x0b\xe3\x42\x47\x3c\xf3\x50\x16\x58\xa2\x8d\x56\x56\x5b\x1b\xd1\xaa\x93\x0d\xa7\xda\xb4\x55\x38\xec\x0e\x4a\x95\xc1\x82\xc4\x0a\xa3\x9b\xf9\xf2\xe2\xa1\x0e\x27\x06\x0a\xc0\xc0\x49\x88\xb2\xa4\x7a\x30\x07\x42\xab\x00\x77\x52\x1a\xb0\x27\xc5\xbe\xa9\xea\x38\xae\xc7\x73\x4f\xe1\x65\x3d\xfd\x1f\x96\x59\xe9\xf1\x8f\xae\xa8\x7f\xda\x30\x6f\x70\x45\x79\x2a\xa0\xab\x4a\x60\x83\xba\x30\xf2\x40\xfb\x02\x61\x25\x3c\x68\xa3\xc5\x5d\xdc\xf6\xa0\x75\x60\x47\x14\x25\x25\x63\xb0\x09\xcc\xb9\x9f\x19\xe6\x81\x11\x23\x35\xf0\x3f\xed\x98\xb7\xc9\xf2\xa8\xaf\xa5\x93\xbf\x7b\xe3\x2f\xff\xdf\x7f\x40\x8f\xf1\xf6\x9a\xd8\x71\xd1\xcb\xbc\xb6\xbd\xbc\xfb\x76\x7b\x97\x6e\xfe\x0d\x88\xce\x04\x4b\xd1\x26\xea\xc8\x7d\x2d\xc8\x38\xda\x68\xd9\x94\x54\x44\x42\x18\x9c\x93\xa5\x71\xc4\xfa\x2a\x57\x39\x3f\x1c\x14\x63\xa5\xe0\x83\x37\x1e\x70\x9b\x1e\xc2\x50\x00\x5e\x72\x69\x4a\x87\x8a\x3d\x0f\x3b\x7a\x64\x61\x00\xb4\x08\x07\x57\xd7\xa0\xac\x03\x8d\x37\x1b\x1d\x9b\x4c\x18\x41\x95\x28\x4a\x55\x16\x65\x59\x40\x0a\x35\x41\x04\x15\xb9\xca\x0b\x35\x75\x01\x06\xcb\x80\x01\x6d\xea\xa7\x43\x80\xf3\x14\xee\x4c\x5e\xb9\x91\x29\x5c\x4b\x0e\xca\x79\x42\x3f\x71\xce\x93\x7f\x9d\xa1\x38\x7f\x9b\xb3\xdf\xee\x7f\x78\xf3\xe0\xf8\x5f\x23\xc3\xfb\x8f\xe8\xcd\xdf\x7f\xd1\x9b\x5f\x1a\x2b\xff\x09\x72\xf3\x6f\x10\xe7\xaa\x0e\x03\x80\xce\x2e\xa2\x3e\xb2\xa0\x1c\x93\x82\x60\x58\xe4\x83\xeb\x99\xcf\xca\x17\x8f\x44\xcf\x47\x0e\xac\x75\x2e\x0c\x36\xf7\x85\x2d\x59\x4a\xa7\xee\xb2\x71\x55\x1f\xc4\x0e\x9c\xfa\x8e\xb4\xed\x95\xd4\xfc\x4e\x9e\xa5\xe6\x8d\x98\xaa\xb4\x29\x7f\x51\x69\x7e\x3f\x2f\x68\xe1\xf8\x95\xd2\xfc\x7c\x9d\xf0\xc8\x35\x26\xc9\x6d\xf2\x1f\x92\xff\xfe\xac\xb8\x10\x55\x08\xe7\xe0\x39\x8d\x47\xfa\x10\xe3\xeb\xa7\xfb\xe5\xd2\x98\x1f\xce\x8f\x3e\x9d\x5f\xb3\x7d\xbc\xfd\xf6\xe3\xe3\xdf\x5d\x58\xbf\xdf\x3f\xde\x3e\x7d\xdc\x3e\xac\xbf\x6a\x33\xc9\x2c\xe8\x5d\x61\x5d\xd5\xaa\xba\xf4\x10\xe9\xa2\xa4\x45\x93\x1e\xb1\x50\x1e\x7a\x88\x75\x45\x8a\x16\x1c\xea\xa2\x6e\x0a\x96\x97\x85\x29\x30\x15\x24\x60\x45\x61\x8d\x53\xeb\xa7\xd6\x47\x03\x97\x79\xdb\x10\x73\xd4\x61\xd7\x89\xfa\x24\xfb\x92\xd1\xe3\xe4\xad\x14\xf5\x28\xfb\xd2\x1f\x8d\x39\x6a\xbe\x87\xb9\x46\x96\x10\x76\xda\x55\x52\xd1\x66\xca\x85\x48\xc7\x68\x4c\x68\xa3\x8f\x8b\xda\x9a\xf4\x94\x64\x91\x4b\xfb\x57\x0b\xda\x79\xee\xa6\x5d\xd6\xef\xb3\x13\xe1\xbc\x86\x9b\x6d\xf2\x63\xd2\xac\xdb\x70\xaa\x4a\x70\xfa\xb1\x00\xa7\x12\x85\xd1\xad\xdc\xf3\x9c\x1f\xed\xca\x6a\x6a\x51\x7a\x32\x34\x68\x85\x9c\xe3\xd4\xea\x20\x2a\x4d\x93\xcb\xe7\x64\x73\x84\x5c\x44\xaf\xbd\xcb\xe7\x5c\xe2\x84\x87\xfb\xf8\x31\x9f\x9f\xee\x3e\x1e\x36\xe2\xc7\x5a\xac\xed\x30\x47\xe6\x3f\x26\xe0\x48\x4e\x7e\xc5\x9f\x9b\x0c\xc3\x72\xb2\x24\x4b\xac\x0c\x86\x31\x63\x6a\x63\x82\x60\xac\x9e\xdf\xd5\xbc\xb2\xec\x70\xc5\xe9\xfb\xf5\xc7\x2b\x6a\x4b\xf6\x27\xf8\x7c\x97\x1e\xbe\x94\x60\x08\x88\x9b\xf6\x1e\x28\x58\x0d\xa0\x8c\xf0\x4e\x0c\x9a\x70\xd8\x81\xc2\x05\xe9\x41\x19\xe7\xad\x58\x1e\x88\xc4\xdf\x8d\x65\x3c\x6a\x2b\x96\x04\x07\x26\xa5\x95\x5a\x5a\x39\x49\xa5\x52\x1f\x1f\xbc\xc0\xa8\x9f\xb8\x79\xf3\xed\xfc\xfb\x2b\xc7\x9b\x2f\x6a\xd3\x5f\x58\x5d\xbf\xd4\x3f\xf1\xae\x64\xf8\x4b\x2e\xfe\xab\x52\xf0\x96\x57\x4d\x45\x01\x09\x06\x60\x29\x47\x37\xf0\x9d\xf3\xb5\x37\x9d\xdc\xfb\x03\x28\xe6\xf8\x33\xce\x8a\x35\xa0\x0a\xf4\x75\xed\xeb\x50\xd5\xbe\xde\x18\x69\x8d\xc4\x54\xda\x3a\x1c\x5c\x38\x1c\x95\xd7\xa7\x40\xe6\x91\x06\x9a\xbd\xb5\xe6\x64\x1a\xd7\x98\xda\xfa\x40\xea\xda\x34\x4d\xd3\x84\xdd\xfc\x33\xae\x95\xf3\x98\x29\x92\x2c\x66\xf4\x67\x27\xa6\xec\x67\x86\x54\x57\x56\x48\x59\x9f\x91\x97\x5e\xae\x60\xc0\xb2\x21\x18\x32\x2a\x03\xcb\x98\x17\x9e\xfb\xe9\xe0\x8c\x37\xf5\xa6\xf0\x61\xef\x5f\x84\x12\x65\x03\x59\x66\x76\xe1\x10\x5a\x0e\x18\xa8\x58\x8c\x8c\x40\x11\xcf\x67\xff\x8a\x23\x47\xe4\x2f\x62\x2c\xf1\x14\x1d\x33\xbe\x62\x73\xae\xe7\xb3\x1a\xf9\xf8\x77\x37\x0b\x00\xf5\x74\xf7\xf1\x2c\x36\xbf\x7d\xf8\xee\xe9\xd3\x2f\xf8\x1e\x6e\x95\x7f\xa9\x3d\x38\x15\xa5\x83\x65\xc0\x59\x12\x76\xfb\x5a\x1c\xc3\x1e\x8c\x61\xec\x5b\x72\xd8\xe3\xd0\xb1\x76\x14\xbb\xe6\x35\x61\x18\x54\xa7\xb0\x47\xd7\x56\x18\x95\x52\x0d\xf7\xeb\x63\xe8\x76\x7b\xc0\x70\x85\x08\xdb\xeb\x96\x50\xa9\xe8\x94\x10\x6e\x35\x91\xc4\x70\x8b\x44\xea\x0a\x53\xd1\xc3\xb4\x97\x61\x27\xc3\x5e\x64\x84\x30\x26\xc8\xbc\x06\xe3\xb8\x06\xdb\xd8\x77\x52\x24\x65\xac\x16\x5d\x10\xab\x37\x7b\xd0\x33\x9b\xfa\x0c\x06\x5d\xdb\x18\x5f\x01\xce\x7f\xff\x10\xe5\xaa\x22\x8c\xf5\xfd\x92\x7e\xae\xcb\xaa\x4c\x8b\x67\x9a\x16\x28\x98\x37\x03\xc7\xec\xe0\x5f\x84\x07\xbb\x30\x66\x2c\x48\xa8\xab\x9d\x52\xee\xd0\xef\x58\xd3\x48\x89\x38\x14\x14\x56\x79\xd8\x05\x45\x40\x0b\x68\x39\x86\x96\x02\x0a\x72\x08\x9b\x03\x3f\xc5\x9e\x1b\xa7\x42\x17\x7a\xcd\xc2\xe9\xa8\xd4\x31\xf4\x5a\x97\x52\x09\xc9\xad\xa8\xb9\x63\xde\x98\x79\x65\xa6\x25\xdc\x0b\x2d\x0e\xb4\x16\x9a\xf9\x12\x4a\xa2\xf0\xe2\x2b\x7c\xf1\x83\xfa\xe6\xcc\x52\xfb\x7d\xf2\xc3\x59\xad\xee\x9c\x15\x2d\x6d\x37\x0b\x08\xf5\xdd\xcd\x3f\x25\x27\x42\xb6\xc2\xe0\x48\x01\x7b\x3e\xa4\xa8\x2a\x03\x12\x9a\x01\x18\x47\x73\x07\xf0\x54\x5c\xee\xbd\x94\xab\xe1\x19\xae\xb8\x9f\x94\xf7\xa9\x9b\xd4\xbc\x6d\x0c\x42\x58\xe9\xe9\x94\x16\x18\x53\x6c\x4c\x20\x73\x26\x34\xc4\x9c\xc8\xb0\x69\x8e\x2d\xdd\xfe\x9c\x0e\x25\x79\x6a\x5f\xd1\x56\xc7\x58\x79\xe1\xbd\xcd\xd9\xf0\x7f\x8e\xdf\xdc\x15\xe7\x6d\xe1\xbd\xdd\x14\xdb\x87\xcf\x9f\xce\x1e\x0f\x37\xbf\x03\x57\xb4\xb7\x37\xd1\xe3\x5f\x7f\xf1\x84\x7f\x88\xb4\xfe\xf5\xe7\xa7\x2d\xb3\xe1\x64\x89\x1d\x6d\x06\xf5\xa8\x4e\x53\xa3\xc3\x49\x81\xbc\xb7\x12\xb3\xb4\x63\x4c\x50\xf1\x82\x80\x46\x75\x51\xa6\xfb\xd7\x84\x88\x5d\xcb\xeb\xd7\x64\x1f\x04\x05\x68\xe7\x5b\x19\xf6\x60\x80\x15\x28\x24\xde\xe0\xa9\x48\xd5\x54\xa7\xc3\xe5\xf6\x18\x76\x61\xd7\xf3\x66\x9c\x4f\x4b\x68\x0e\xbc\x07\xe5\x49\x4b\x46\x09\xe6\x82\xf3\x70\x52\x05\x42\xd6\x4b\x4a\x2d\xe7\xa6\xb2\x05\xc7\xa8\x23\x88\x33\x3d\xc7\x8d\xab\x3a\xe6\x51\xd7\x7d\x98\x4b\xb6\x72\x1f\x4d\x78\x62\x23\x7a\xb6\x38\xa5\xdd\xcf\x81\xd2\x7a\xde\x76\x0e\x40\x6f\x9d\xf3\xa0\x72\xce\x01\x68\x6d\x18\x96\xdb\x8d\x0e\xf5\xf3\xa0\xa7\x43\x5a\xd9\x15\x0a\x6a\x29\xef\x4f\x7a\x1c\xc7\x04\xc4\xb5\xda\x46\xee\xda\x95\xa2\xdd\xfb\xb8\xf3\x4d\x0b\xe1\xe6\x2e\xe3\xe0\x08\xb1\x27\x15\xa8\x03\x01\x5e\x29\x88\x20\x85\xec\x35\xf1\xa3\x07\x2e\x54\x6b\xad\x04\xd2\xd6\xbf\x26\x53\xce\xa3\xc0\x6c\x4a\x9e\x4f\xab\xe2\xa5\xc9\x8e\x20\x62\xf3\x3a\x1d\xe3\xe7\x15\x11\x3b\x78\xbc\x79\x5a\x18\x3d\x37\x51\xab\xe0\x09\x3c\xde\xbc\x15\xa3\x2f\x6a\x5d\xbf\xff\xe1\x13\xc0\xbe\xf6\x31\xcc\x29\xca\xa0\x42\x81\xfb\x8c\x7a\x90\x0f\x22\x8c\xa1\xa7\x7a\x47\x73\x5f\x52\x1c\x8e\x47\xb5\x3e\x4d\x7d\x91\x76\x27\x17\x0e\xa5\x21\xc8\x17\x73\x54\x48\xb8\x15\xf4\x00\xa1\x70\xd5\x91\x20\x2a\x92\x24\x4d\xfb\x57\x1e\xf1\xd3\x3f\x5b\xd4\xe9\xa2\xb5\x21\x48\xd7\x0f\x09\xf8\x39\x9f\xf0\x8b\xea\xe9\xba\xb4\x10\x24\xa0\xe4\x61\x0c\xe3\x2e\x74\x02\x78\xd0\x04\x56\x79\xc0\x44\xee\x21\x23\x41\xbc\x26\x3c\x1d\x72\xa6\xb8\x84\x4a\xc0\x62\xa3\x19\x09\xae\xf7\x3d\x30\xa1\x1b\x35\x10\xd3\x69\xa2\x55\x49\x1b\x74\x24\x88\xe8\x4c\x06\x76\x28\xeb\x92\x5f\x38\x06\xf0\x9f\xcd\x31\xb8\xff\xff\xc1\x31\xe8\x28\x94\x90\xfc\x73\x38\x06\xbb\x11\x8e\xbb\x5f\xa2\x18\x2c\x1e\x0a\xd9\x78\xce\xff\xdf\xdc\xd9\x3e\xfc\x02\x0a\xf0\xd6\xcf\x7f\xc6\x86\xce\xbe\x7f\xf7\xb2\xf3\x83\xdf\xed\xfc\xe0\xbb\x4c\xfa\xe9\xe4\x7d\xdf\x03\xd6\x4f\xa7\x78\xd3\xaf\xdd\xe9\x74\x3a\xb9\x71\x3c\x9d\x42\xff\x6c\xad\x5d\xe9\xc0\x16\x46\xf5\x04\x17\x82\x47\xc4\xd1\xe6\xbc\x2b\xcf\xf2\x37\xf6\x4c\xf2\x45\x3f\xe0\x26\xc6\x64\xf3\xa4\xbf\xcd\xfd\x73\xe9\xdc\xea\xf8\x5c\x8e\xe9\x38\xe5\x0e\x0c\x01\x66\xf9\x0b\xa1\x34\xeb\xa7\x32\xe5\x22\x28\x6b\xe2\xfb\x1d\x56\xc7\x2d\xda\x88\x3f\xe2\x6b\x42\xdf\x0c\xa3\x9f\xc7\xf4\x30\x55\x51\xca\x6c\x23\x82\xb5\xca\xcc\x3f\x22\xfe\xb0\x86\xe7\x1e\xc8\xdf\xc4\xf5\xfd\xf1\xc3\x52\x1d\x79\x33\x64\x88\x70\xe6\x37\x1f\xee\xc1\xe7\x0f\xf3\x93\x6b\xa1\x90\x2d\x0b\x80\x09\x54\x9c\x6b\x42\xb9\xd5\xb5\xe0\x0a\x57\x1c\xe4\x14\x5a\x84\xc8\x6a\x04\x06\x76\x8d\x9b\xf4\x6b\x62\x3d\xd7\xca\x69\x69\x5a\x67\x00\x02\x74\xca\x8f\x69\x11\xba\x30\xb2\x88\xdb\xe9\xf8\xd9\xff\xf5\xfe\xde\xa7\xa6\x2c\x7c\x51\x02\x19\x24\x84\xa0\x1d\x40\x3e\x71\x50\xd4\x54\x10\xcb\x65\x6a\x05\xc7\x14\x0a\x5c\x85\x83\xf7\xcb\x37\x13\x0e\x57\xfe\xde\xd6\x5a\xcb\x89\x11\xf5\xd4\xbc\x0c\xcb\x04\x21\x43\x77\xf6\xf7\xb6\xb1\x16\xf6\x4a\x52\x13\x71\xf8\xd8\x8d\x9b\x3d\xc6\xd3\x13\xcf\xce\x7f\x02\x3f\x2c\x40\xfc\xe7\x0f\xdf\x7c\xb8\x4f\xb7\xbf\x06\xc4\xe2\x53\x69\x08\x36\x44\x18\x4e\x31\x17\x8a\x10\xe3\x21\x67\xa5\x42\x84\x6c\x74\x19\xea\x89\x87\x8e\x73\x2e\x5b\xa3\x19\x9f\x4f\x4d\x09\xb0\xeb\x9e\x47\x90\x80\x3e\xec\x47\xba\xf4\xff\xd2\xad\x07\xa7\x45\x8b\xef\x76\x13\x63\x9d\x6f\xe7\xe4\x74\x39\xfc\xc5\x7b\x13\xd4\xab\xee\x10\xc6\x0c\xbe\xec\x95\xdc\x17\x4c\x89\x17\x9f\xc9\xc6\xbd\x78\x70\xb2\x94\x5a\x43\xa8\xcb\x4b\x69\x59\x55\xcd\xc7\xe1\x5f\xe9\x56\x65\xf9\xb9\x3e\xf3\xf8\x0b\xc8\xed\x42\xd2\x5e\xb3\x1a\x98\x60\x84\xe3\x0c\x4a\xc1\x9e\xe9\xaa\x7b\x19\x3a\x2f\xeb\x36\xcb\x7b\x17\x84\x12\x45\x53\x32\x60\xdc\x49\x28\x63\x97\x5a\x7e\x7c\xef\x54\xff\x33\xdf\xdb\xc9\xba\x49\xb5\x77\x61\xa7\x44\x51\x17\x0c\x94\xee\xc0\xa4\xd1\x0b\x47\x4f\x9c\x7b\xe7\x2e\x5e\x7d\xf3\xb0\xf9\xf6\xd7\x77\xf0\x1f\xc1\xd3\xc7\xf4\x3c\x21\xde\xdf\x14\x60\x9e\x7d\xee\xd5\xb1\x06\xad\xb7\x80\x02\x54\xa3\xa2\x2e\x94\x08\x28\x88\x9d\x09\x47\x33\x1e\xe7\x8b\x33\x18\xf7\xbc\x83\x10\x8a\x1a\x85\x91\x10\x4e\x57\x2a\x34\x53\x1b\x9c\x04\x2c\xcd\x17\x5c\x2e\xf6\xe8\x6c\x7d\xf4\xac\xfb\x8b\x88\xdc\x5e\x70\x82\x9b\x39\xfe\x9d\x53\xde\xdb\xa7\x8f\xeb\xdb\xef\x3f\xce\xcb\xc2\xdd\xdf\x3d\x7d\xfe\x82\xd2\xfd\x47\xb0\x7e\xf8\xfe\xd3\xf6\xe1\xe9\x53\x14\x98\x51\xc6\xe9\xcc\xd4\x73\x72\x4b\x89\x36\x63\x11\x46\x40\x8a\xd0\x4a\x40\x8f\xc5\xa1\x28\x0b\x0f\x09\x9a\x4e\x81\xd5\xe1\x58\x02\x74\x28\x4f\x5c\x60\x40\x56\x3a\x34\xd3\x3e\x70\x0e\x9a\x34\xc9\x92\x80\x00\xed\x3b\x8d\xab\x16\x59\x54\x63\x8b\x3b\x04\xf3\xbc\x44\x35\x3f\xe0\x8a\xaa\xdd\xfc\x6c\x65\x91\x2f\x0b\x43\x92\xc5\xd3\x75\xf1\xa9\xb8\xf9\xa2\x30\x7f\xd1\x8e\xfe\x7c\xd6\x8e\xbe\xb9\x54\xe8\xbe\x48\x47\xdb\x5a\x7a\x58\x05\x17\x64\x35\xd4\x75\xed\x47\x90\x20\x3c\xc9\xb1\x06\x45\x7d\x3c\xd6\xe1\x08\x43\xc7\x41\x02\x2f\xb2\xd1\xa4\xb4\x2d\x10\x28\xb4\xa6\xc0\x2c\xca\x46\x9f\xa5\x6e\xa3\x6c\x74\xd5\x9f\x65\xa3\xcf\x7d\x83\xfe\xaa\xd7\xe5\x17\x1a\x59\x3e\xfd\xe9\xfe\x97\x4b\xaf\x4b\xb6\x73\x39\xe4\x3a\x58\xa0\x17\xa3\x20\xa0\x02\x01\xbd\x5f\x5a\xb3\x94\x0a\x0a\xd4\x41\xd8\x5d\x8b\x4c\xe8\x43\x27\x70\x49\x91\x3a\x80\xc5\x61\x33\x01\x7b\x28\xb8\xc1\xe0\xb0\xb4\xb4\xd8\xab\xc6\x97\x03\x74\xc6\xaa\x8a\x63\x75\xca\xda\x4b\xa7\xcb\x32\x07\xd0\xad\x59\xcd\xf3\xe4\xdf\xbc\x31\x3d\xaf\xd9\x9e\xe7\xeb\x03\x3c\xbe\xff\xc5\x56\x4d\x2a\xad\xa6\x43\xaa\x7f\xb2\x29\x9f\xc6\x34\x9f\x98\x73\x2e\x23\x4d\x34\x8f\xa9\x7f\xc2\xa9\x99\x9f\x5d\x69\xeb\xac\x33\xc6\x59\x17\x60\x90\x61\xcf\x01\x01\x32\x45\x13\x14\xb6\xb5\xb6\xb5\x17\x9d\xc2\xfa\x67\x5a\xf2\xbf\x05\xbf\x01\x71\x41\xfb\xf2\xc1\xf7\x3f\xd3\x92\xf7\x2f\x6d\x6f\x25\x1b\xc7\xb3\xdc\xf2\xcb\x11\xa0\xb1\x02\x70\x69\xfe\x91\x2f\x06\xd8\x30\x6c\xb0\x9d\xe4\x34\x04\xc6\x40\x02\x6c\x54\x92\x37\xde\xdb\xd1\xda\x71\x32\x6d\x6b\xc3\xd1\x5a\x50\x26\x6f\x1e\xbd\x6a\x83\xe2\xf8\x78\xf8\x7a\x7c\x80\x2f\x24\xcb\xbb\x45\x3f\xf1\xd3\x72\x7b\xb7\x2a\xbc\x75\xd9\xc9\x4d\x28\xdd\x4f\xc6\xd5\xae\x71\x61\xd7\x3b\x37\x09\xd7\x87\xfd\x8a\x85\x7e\x3a\x2c\x86\x8b\xa7\x74\x0c\x10\xf0\x7d\x38\x84\x0e\xf4\x81\x00\x1a\x50\x60\x80\x4c\x03\x03\xf3\x53\xed\x32\x4e\xc9\x2b\xce\x8e\x9b\xf2\x4f\xee\xc7\xfd\xbb\xfd\xb8\x07\x58\x59\x99\x11\x37\x0d\x29\x0c\xa5\x15\x56\xd8\xa3\xb2\x36\x14\x56\x1d\x57\x24\xf4\xd3\x10\x38\x03\x1d\x38\xa6\xa7\x50\x01\x7e\x08\xfb\x70\x8c\xea\xce\x65\x90\x01\xcf\x7b\xc1\xc1\x2e\xf4\x60\x77\x9e\x2b\xb2\x21\xae\x0f\xf7\xc9\xbf\xff\xc2\x11\xba\xb9\xa4\xfa\x8b\x49\x76\x9c\x35\x2e\xeb\xc6\x72\xfd\x2f\xf7\x0d\xe0\x7e\x1e\x34\x9d\x15\x4a\x79\xe7\xd9\xbe\x09\x8d\xd2\x79\x81\x11\xc7\x15\xe1\x2a\x25\x3a\x2f\xc9\xfc\x00\x0b\xb5\x76\xc7\xa3\x9b\xd4\xae\xb7\x9d\x9b\xea\xb4\x0a\xa3\xf5\x0d\x30\xa9\xa0\x50\x2b\x21\x4c\x63\x24\x3f\x82\xab\x07\xa7\x4b\xdf\x4e\xb6\xdf\x98\xe4\x5f\x25\x1f\x92\xbf\x8e\xc8\xef\x65\xcd\xbd\xa4\x95\x9f\x1f\xde\xee\xbd\xe9\xe5\x7d\x7e\x93\x51\xb9\x02\x41\xe7\xd8\x3e\x25\x86\x72\x46\x2c\x91\x6a\x6f\x28\x13\xc4\x52\x25\x53\x63\x18\xe7\xc4\x52\xa9\x77\x2e\xe4\xce\x75\x1d\xa0\x6d\xc8\xe3\x4d\xbb\x31\x78\x5f\x37\x3d\x3d\xee\xfa\xe1\x7c\xaf\xdf\x1d\xf1\x7e\x8e\xfc\x86\x6e\x37\x99\x17\xc6\x55\xb6\x0b\x7e\x18\x86\xa9\x1b\x86\xe1\xac\x83\x41\x57\xc9\x46\x44\xe5\xd6\x8b\x2e\xe7\x62\x09\xbc\x78\x9e\x5c\x14\x63\x97\x26\xa3\xf9\x09\xd0\x19\xa3\x0e\x07\x70\xec\xfb\x3d\x90\x1d\xe7\xc4\xd4\xd2\xe8\x5a\x1b\xdd\xd6\x1b\xa1\x25\x3c\xb8\x71\x74\x83\x7b\xd1\x21\xc1\x54\x4b\x29\x53\x11\xea\xd0\x5b\x23\x40\x09\x50\x46\x71\xec\xed\x25\xab\x3c\x72\xe8\x7f\x48\x3e\xc5\xea\xd7\x05\x75\xfa\xf8\xed\xf6\xf1\xf6\xdb\x2c\x7e\xa9\x3f\x3c\x6c\xe7\xe5\x3f\xe2\x50\xd1\x7a\xe9\xd7\x60\x59\xf6\x1e\x16\xcc\x79\x0e\x85\xe7\xf5\x2f\xb5\x55\x09\x88\x9b\x76\x2c\xdf\x69\xee\xa4\xe5\x15\x22\xd2\x96\x1c\xc8\x02\x72\x54\xf0\xb2\x42\xa0\x00\x82\x50\x88\x04\x2b\x55\x4d\x0e\x0c\xe6\xd5\x46\x09\x15\x0e\xad\x29\x31\x51\x2e\x88\xd0\x8f\xea\x04\x72\x04\xbd\x04\x15\xd0\x00\x73\xfa\x3c\xf6\x75\xa3\x4b\x70\x9a\x08\xa3\xc5\x01\x13\x2b\x18\x5d\xc1\xa9\xc9\x23\x6f\x7b\x9d\xe0\x2b\x2d\xae\x8b\xaf\xc7\x65\x8c\x9c\x25\xae\xe7\x91\xf2\xe1\x0f\x05\x57\x40\xd4\xb6\x06\xa4\xac\x6a\x04\x41\xe5\x43\x0e\x46\xc5\x79\x45\x20\xaf\x70\x38\x18\x73\x09\xa8\x56\x79\x18\x42\x1e\x2c\x05\x06\x1c\xd2\x96\x62\xc4\x44\x20\x80\xf4\x61\xff\xe2\x19\x2b\x4d\x41\xea\xe0\x56\xd1\x34\x82\x2f\x3a\xc0\x89\xce\xaa\xb8\x46\xad\xcf\x58\xd9\x99\x6f\x7d\x7b\xf7\xc3\xc3\x63\xcc\x30\x2e\xa8\xc7\xe3\xdf\x2d\xb0\xfd\xc3\xfd\x39\x22\xbd\x5b\x56\xde\x2f\xbb\x3c\x2f\xb9\x0b\xed\xe8\xbb\x0d\x26\xc8\x54\x2c\x50\x54\x77\x60\xa8\x0a\x5f\x54\x29\x99\x8e\xb0\x92\x9c\x71\x29\x30\x2b\xa3\xee\x41\x9d\xbb\x13\x3b\x34\x18\x4e\xcb\x7a\x4c\xb4\xe4\x91\x8d\x22\x4a\xd0\xc5\xd6\xc8\x03\x02\xcd\x9c\x7c\x10\xce\x90\x2a\x0b\xa1\xad\x53\x9a\x61\x84\x25\x46\xc2\x21\x2b\x5a\x8a\x34\xc6\x92\x09\xa8\x21\x13\xb4\xb0\x25\xa9\xa0\x81\x52\x33\x68\xca\xf9\xda\x4d\xf2\x4c\x6d\x70\xf2\x67\x49\x02\xb2\xa7\xe4\xc3\x36\xcd\xd2\xec\xe1\x1b\xe0\x9c\x01\xd5\xce\x4b\xc3\x5b\x33\xac\x2c\xd0\x78\x62\x2f\x7b\x02\x76\xc0\x4f\x63\xf0\x0a\x1c\x92\xe8\xf9\x93\xbc\xb2\x75\x13\x63\xf3\x6b\x45\xa9\xc8\xc6\xba\x28\x4a\xa5\x57\xa2\x88\x37\x8f\xdb\xdb\xbb\x4f\xeb\x79\x79\xbc\x52\xf8\xb8\x30\xd8\x6f\xb7\x7f\xff\x90\xb9\x1a\x81\x2a\x24\xd1\x1b\xc9\x14\xd2\x20\x0e\x15\x42\xb0\x98\x5c\x8f\x22\x17\x51\x95\xa4\x94\x25\xc1\xa4\x54\x05\x09\x7b\x03\x2b\x83\x00\xac\x74\xb9\xd1\x50\x4f\x9d\x34\x62\x1a\x86\xd2\x95\x06\xe8\x55\xae\xa5\x1c\x94\x9a\x2a\xe3\xab\xda\xe4\x75\x03\xdb\x3a\x87\xa7\xa6\xda\x75\x4d\x5f\xec\x23\xef\x28\x21\xaf\x14\x8c\xb1\xd7\x6b\xe9\x51\xbf\xbf\xd9\x3e\x7c\x03\xa4\xc3\xd8\x11\xbd\xdb\x68\x34\xd4\x3f\x99\x15\xd2\x22\x06\x0a\x0b\xc7\xa2\xd8\xc8\x88\xb2\x44\xc4\xfa\xdc\xae\x76\x5e\xc8\xae\xb3\x26\x09\x54\x13\xfb\xb1\xc9\xcb\x08\x60\x70\x19\xa9\x03\xaf\xeb\x39\xcd\x59\xcb\x79\xa5\xf7\x0b\x74\x3b\xd9\x97\x93\x35\x59\x1e\x72\x20\x2f\x9f\x91\x2d\x35\xc0\x7f\xc2\x67\xb0\x3a\x56\xb2\xd0\x54\x82\x32\xb4\xe9\xc9\x07\x57\xd7\xf3\xb9\x5a\x4b\x50\x84\x93\x5b\x20\x8d\xc9\xbe\x1c\xad\xcd\xca\x90\x9c\x3f\x83\xbc\xaa\x6c\xc1\x2f\x3f\xc4\x18\xfe\x8c\x12\x2d\x63\xee\x43\x84\x4c\xef\x3f\xce\x57\x43\x66\x6d\x28\x2d\xa8\x20\xf2\x08\x0a\xc3\x1d\x33\x83\xd3\xb5\x69\xd7\x7a\x0e\xfa\x42\x0b\x0e\x8a\x63\x6d\x43\x1d\x92\xa9\xa6\xa9\x06\x27\x34\xf1\xa0\x25\xe8\x17\xee\x18\xd9\xba\x8d\xfc\x63\x9f\xf3\x10\x3f\x67\x2b\xdc\xb4\x77\x80\xc1\xaa\x46\x25\xaf\xbd\xf5\xfe\xe0\x6d\x67\xf7\x6b\x1d\x4a\xc0\x42\x03\x4e\x51\xe7\x3f\xc8\x09\x86\x4e\x03\x95\x0e\x04\x4d\x2c\x70\x09\x8e\x09\x48\xec\x4a\x6e\xc5\xc6\x9e\x5d\x64\xdf\x29\x56\x7c\x01\x65\xc1\x4e\x31\xc0\x08\xb7\x86\xef\x24\x6a\x31\x05\xc8\xff\xc4\x3d\xc0\x98\x6e\xb4\x54\x94\x32\xa9\xb5\xc2\x82\x85\x7d\xd3\x02\x4c\xa2\xd6\xd1\x36\x91\xaf\x78\x6b\x57\xd5\x39\x43\xff\x9b\xe4\xdf\x5f\xa9\x1f\xfe\xfc\x42\x7f\xba\xbb\xb9\xfb\xbc\x3e\x5f\xe9\x7f\x48\x33\x2d\x2b\xea\xbc\x4c\x87\x67\xb3\xf6\x3f\xc9\x35\x2f\x94\x2f\x71\x49\x4a\x82\xca\x9f\x1a\x50\x97\xe1\x98\x0d\x2f\x30\x1b\x9e\x99\x11\x42\xeb\x15\x64\xd8\x60\x36\x9d\x68\xe9\x4b\x02\x46\x52\x5a\x48\x56\x55\x05\x61\xa0\x44\x91\xd0\xd7\x85\xcd\x71\x93\x95\xc8\x13\xd2\x10\x32\x1d\x69\x23\x95\x94\xca\x62\x2b\x91\xd1\x95\x55\x95\xd6\xd5\xa2\x7f\x98\x25\x22\x43\x67\x3f\xbc\xbf\x8e\x18\xd6\x45\xca\xe6\xe1\xe2\xf3\xf6\x78\x13\x9b\xe4\xe6\x74\x37\x6a\xda\x7c\xda\xe8\x63\x10\x2d\x40\x2c\xd8\x63\x90\xfb\x00\x29\x40\xbb\xc0\x76\x29\x2e\x0b\x57\x4c\xfd\x88\xab\xd0\xa4\x05\x44\x69\xbe\xc9\x5f\x13\xa3\x88\x53\xfb\xbd\xb5\x5c\x1b\x90\x60\x02\xf9\x6b\x82\x29\xc5\x8b\x4e\x7f\x22\x5e\x7d\x26\xa3\x3e\xf4\xc7\xab\xab\xfb\xf1\x4d\x2c\x30\xd6\x43\x04\xa0\x31\x1b\x1e\x7d\xa8\x3d\x48\x42\x37\x00\x11\xea\x75\x01\x64\xf0\x2e\xb8\x97\x91\xf5\x99\x06\xea\x45\x02\x7f\x19\x33\x7e\x53\x45\xbc\xe1\xaf\xce\x1d\x3f\x51\x26\xe9\xf6\x2e\x7b\x6f\xc1\x73\xdf\xa5\x7e\x92\x71\xd4\x9c\x32\x14\x2a\x0a\x4e\x95\x75\x94\x41\x49\x28\x29\xa6\x51\x36\x9b\x6a\x1a\x1c\x48\xa6\x83\x0b\x63\xa0\x87\xa2\x2e\xe4\x08\xce\x6b\x82\x7a\x25\xd9\x71\x63\x92\x62\xc1\xc0\xd2\x2f\x74\xa9\x39\x7d\xc9\xae\x7b\x77\xee\x17\xc8\xe9\xf3\xcd\xa7\x7b\xe0\x6a\xad\xfb\x3d\xc2\xda\x2b\x4b\xe7\x90\xb1\xaa\xdb\xda\x1d\x5c\xdb\xba\xc3\x81\xd7\xf5\xc6\xa0\xd0\xb8\x92\x32\x86\xfb\x91\xd4\x02\xda\x7e\x12\x97\x4e\x10\x3b\xe9\xd4\x56\xc1\xbc\x26\x76\x07\x50\x75\x8e\xf7\x59\xd6\x6e\x44\xb2\x8e\xdf\x60\x54\x4f\xfa\x38\xaf\x49\x29\x98\x33\x92\xdf\xff\x77\xe0\xfe\xf7\xbf\x02\x0f\x9f\x9f\x16\x45\x86\x1f\x1e\x32\xc1\xc2\x2e\x60\x0c\x34\x41\x25\xc8\xeb\xd7\x84\x1f\x4c\xd5\x35\xa2\x28\x90\x32\x8e\x88\x81\x4d\xfb\x79\x1d\xdd\x08\xe7\xca\xba\xf3\xde\x06\x12\x8e\xb6\x21\x9e\x78\xd3\x60\x0e\xc4\xe0\x9d\xbe\xe4\x9e\xd9\x6e\x53\x44\x9c\xfc\xbb\x98\xf3\xde\xfd\x8c\x49\xb9\x10\x00\xbf\xbf\xb9\x3b\x37\x4f\x08\x9f\x32\x63\x28\x65\x16\x7a\x5c\x85\x7d\xe1\xac\x2d\x7c\xca\xc3\xde\x32\xa2\x30\xcf\xaa\x08\x07\x4d\x8a\xf3\xd2\x97\x28\xd5\xa1\x0a\x8e\x01\x0b\x54\xd4\xbc\x05\x63\x7b\xc0\xfb\x2e\xb9\x8a\xb9\xaa\xe4\xbf\x9d\xbf\xe7\xf4\xa6\xf8\xe6\x42\x84\x48\x6f\x8a\x0f\xef\x98\x86\x26\xed\x8b\xa2\x28\x4b\x53\x59\x26\x8a\xb1\xef\x7d\xd7\xd5\xf3\xd7\x1b\x78\x18\x5f\x13\xa5\x50\xb0\x20\x07\x3b\x20\xc0\x7e\xea\xdc\x8b\xcb\x54\x34\x75\x4b\xb3\xfd\x99\xdb\xf8\xdb\x45\xd3\xf2\xf3\xa7\xf8\x86\x67\xdd\xa7\xe8\x06\x90\x6e\x1f\x92\x0f\x77\xdf\xdf\xdc\xdf\xdc\xae\x12\x50\xe5\x73\xee\x22\x65\xd0\x1a\x14\xfa\x35\xd1\xfc\x64\x41\x4e\xc2\x31\xb5\xbb\xf4\x88\xd1\xd9\x23\x6b\xea\x7d\x90\x07\x0f\x0a\xe0\x03\x1b\x25\x80\xc0\x78\xd0\x86\x4e\x9e\x71\x84\xac\xdd\xa8\xc8\x5f\x8c\x3c\xa6\x34\xfb\xb0\xfd\xe1\x21\x5d\x3f\xfc\x23\xb8\xa8\x42\xc7\x2f\x33\x2d\x68\x05\x90\x86\xa2\x33\x84\xfa\x30\x4a\xdf\x72\x57\x1b\xad\x49\x39\x47\x0b\x15\xde\xa8\xba\xf3\xc1\x84\x63\xe8\xb5\xd1\x61\xe8\xac\x3a\x36\xc3\x81\xfb\xee\x00\x0a\x5f\xdb\x85\x57\xdf\x44\x0c\x01\x5f\xf5\xcc\xfd\xe6\xd2\x31\x07\xbe\xee\x98\x7b\xbc\xb9\xcf\xae\x34\x62\x3e\x5c\x01\xa7\xd9\x90\xd9\x17\xed\xb5\x1e\x95\x51\xc1\x79\xdf\x58\xe3\x74\x9d\x12\x63\x8c\x74\xd2\x5a\x2b\xeb\xd0\x38\xe3\x4d\xb3\xc1\x53\x7b\xd5\x3f\x16\x92\x67\xb7\x22\xec\x35\xb1\xb2\xed\x5d\xcf\x9b\x26\xf8\xe6\x28\x0f\x3b\x46\xc3\xc1\xab\x36\x49\x13\x97\x89\xad\xd9\x98\xe4\xb7\x0b\xda\xfe\x25\x8d\xfc\xd2\xa6\xb4\x34\x89\xfe\xf0\xf0\x74\xb7\xd9\x7e\x07\x60\x6a\x5d\xda\x4e\x2c\xa3\x41\xd4\x46\x11\x32\xed\x26\x53\x75\x2e\x94\x59\x39\xe9\x95\xa8\x20\x9e\x06\xcd\x80\xda\x14\x4a\x69\xa5\x85\x32\x04\xd3\x52\x53\xad\x55\x68\x60\x41\x4c\x55\x24\x20\x51\xab\x36\x7e\xff\xbf\xfa\xb9\xe2\x2a\x48\x52\xef\xd3\x7e\x22\x99\x18\x87\xac\x9a\xe4\xa6\x90\xd2\x08\x63\x44\x02\x12\x9e\xe2\xa8\xd5\xff\xe7\xcb\xfa\x10\x21\xf2\x64\xfd\x90\x64\xa3\x87\x10\x08\x30\xb2\xe9\x14\xba\x30\x4c\x7b\x9e\xba\x8d\xc2\x8c\x4c\xe3\xde\x9f\xc0\x29\x94\xa3\x8d\x58\xec\x3a\x6b\x5e\x59\xe4\xb2\xfe\x45\xc4\x22\xfe\xc7\xe4\x7f\x3b\x7b\xc1\x2c\x39\xc4\x6f\xc0\x77\xdb\x05\x19\xbe\xbb\xfd\x36\x22\x8f\xb7\x4f\x1f\xb7\xb7\xdf\x7e\xfc\x07\xb0\xd0\x47\xfe\x0d\x88\x86\x9e\x67\xb8\xfb\x31\x7b\xfa\x74\xff\xe1\x63\xb1\xb4\x0f\x5e\xcb\xc2\x6d\xd1\x3c\x25\x08\xc2\x14\x21\x60\x40\x66\x1c\x41\xc5\x38\x2c\x5a\x9b\xbb\xb2\x22\x65\x91\xab\x02\xfb\x8a\x63\x69\xb5\x3d\x08\x29\xb9\x72\xd2\xf4\x1a\xc2\x22\x17\x05\x66\x9c\x6c\x4c\x34\xf3\x9e\x0e\xa1\xea\xb9\x07\x6d\x8a\xc1\x50\xd5\x44\x6a\x19\xe9\xff\x75\x29\x4b\x8a\xf2\x92\x23\x5b\x61\x2a\x8a\x2e\xa8\xb0\xa3\x00\x03\x95\x56\x61\x57\x74\x53\x5f\x06\x56\x2b\x07\x78\x10\x08\xab\xaa\xe1\x84\x2d\xeb\xad\x58\xe5\x91\xdb\x57\xbe\x55\x57\xff\xd3\x17\x1d\x9a\x33\x57\x3e\xf6\xc0\x7e\x78\x7c\xba\xff\xf5\x9b\x80\xe9\xa5\x35\xea\x5c\x55\xff\x8a\x18\x93\x62\x54\x02\xe1\x72\x38\xbc\xc8\x53\x01\x2d\x60\x10\x62\x8f\x4e\x65\xd8\x65\x55\x68\xe7\x14\xb7\xa9\x8b\xa0\x02\x43\xfd\x2e\x5e\x9e\x5d\xcc\x10\xbb\x90\xc4\x9b\x8d\x65\xdc\x20\x65\x2d\xa7\x86\xe2\x20\x6a\x16\x0e\x93\x13\x56\x15\xd0\xb2\xd2\xe7\x85\xb1\x02\x28\x63\x4c\xf0\x5a\xeb\x38\x9e\x5d\xc6\x36\x79\xf2\xeb\xc8\x38\x58\x26\xa6\x65\x0f\x1f\x63\xc3\xed\xcd\x5d\x93\xea\xbe\xeb\x0e\x65\xe8\x82\x86\x15\x72\x84\x84\x61\x93\xbb\x50\xd9\xc9\x11\xab\x79\x9d\xaf\xf2\x17\x98\x17\xeb\x64\xe1\x12\xd1\x2d\xdf\xf0\xe4\x2f\x63\x95\x72\xe1\x6e\x7e\xed\x5f\x34\x1f\xf4\x87\x4f\xf7\xb7\xd9\xe2\x65\x74\x6e\x86\xdf\x72\xce\x2b\x0c\x71\x85\x83\xb7\xc3\x30\x0c\x87\xe0\xbd\x3f\x1c\x0e\x87\x0d\xff\xb1\x13\xb2\x70\x85\xcc\x6c\xea\xc2\xd1\x05\x6d\x6d\x9a\x4f\xfa\xd9\x6e\x93\x39\x7c\xd4\x36\xce\xb9\x7c\x85\xb6\x4d\xec\x85\x4a\x3e\xbc\x39\xb1\xcf\x41\xc3\xf7\xe7\xa0\xc1\xa6\x84\xa2\x1a\xc2\xec\x10\xe4\x0e\x24\x3c\x34\xaf\x49\x28\x4e\xa1\x55\x20\x69\x83\xd9\x94\x18\x43\x04\x9d\xa6\xde\xee\xf7\x46\x4b\x75\x99\xcb\xf1\xb6\x4e\xf3\x9f\xbf\x6f\xb6\x74\x71\xdc\xc9\x0c\x96\x73\xb0\x94\x89\x09\xed\xd3\x82\x4f\xcd\x98\x37\x93\xa1\x69\xd2\x4c\x04\x68\xc2\x20\xc6\xbe\x65\x8d\x06\x28\xec\xa4\xa7\xfd\xf9\x7d\xd3\x21\xea\xc1\x7e\x7b\x7e\xdf\xed\x62\xe2\xf2\x5d\x16\xad\xdd\x3f\xdc\xd5\x69\x43\x90\xa7\x99\x9c\x0e\x7b\xe0\x44\x20\xe3\xf1\x35\x09\x50\x00\x7f\x98\x76\xeb\x56\x48\xec\x7c\x38\xe9\xa6\x05\x26\xb8\x9d\x6d\x16\x1d\x3e\x90\x98\x0c\x6d\xcd\x86\x5e\xbc\x7e\xae\xba\xd4\xe9\xea\x08\xd8\x8f\xc9\xba\x78\x49\x56\xc9\x73\xb7\xa1\x93\xf1\xbe\xf6\xed\x65\x7f\x9a\x18\x73\xbd\x3b\xce\x6f\xde\x8e\x73\xde\x21\x4f\x50\x5d\x55\x99\x9e\xf6\x07\x60\x79\x20\xe3\x69\x9c\x77\xc8\x1c\xa7\xfd\xba\x91\x0a\x73\xea\x43\x6f\xeb\x1e\x34\xc1\x1c\x5c\x0b\xca\x24\xd9\xa4\xf8\x95\x6d\xfb\x88\x9b\xfc\x2a\xb9\x8d\xbe\x6a\xff\xc7\x7b\x9f\xad\x58\x7a\x5f\xa0\xed\x77\xba\xfc\x4b\xf9\xe2\x4b\xdd\xfe\xbb\xec\x7e\xb3\xbd\xc0\x15\x8b\xa3\xc4\xa7\x05\xc8\xb8\x5b\x7f\xba\xfb\x6b\x70\xf7\xe9\x2e\x6d\xd2\xb2\x28\x5d\x55\xa6\xe5\x73\x05\x76\x72\x17\x4e\x1c\x24\x29\xdc\xef\xe8\x6e\x3f\x71\x50\x3a\x80\x63\x0b\xeb\xf1\x08\x70\xa8\x30\x95\xd4\x4a\x65\x3a\x1c\xc4\x2e\xe7\xa2\xb1\xd5\xd0\xd3\xd6\x0a\x00\xc7\x20\x00\x39\x1e\xc3\x31\x1d\xc2\x0e\xe0\xb0\xdb\x24\x08\x22\x42\x5c\xc1\x14\x35\x88\x21\xa1\x15\xde\x4b\x29\xa5\xd5\x46\x5b\xc5\x19\x67\x8a\x2a\x6c\x0d\x38\x50\x1c\x76\x08\x19\x86\x18\xc0\xac\x32\xc4\xce\x2f\xd1\x5a\x8f\x3a\x7e\x3f\x69\x12\x71\xdc\x7f\xff\xe5\x3c\xbf\x55\x68\x17\x85\xc4\xeb\x7e\xbd\x87\xb3\x36\x22\x98\x97\x72\x97\x16\xb0\xa8\x8b\x32\x25\x15\xf6\x0c\x03\x38\xe1\xb1\x15\xa7\x70\x64\xfb\x5e\x96\x1e\xd5\x61\x0c\x83\xcf\x77\xcc\x9b\x63\x1d\xe4\x3c\xd6\x03\x5c\x5b\x65\x4a\x25\x39\xa3\xca\xf8\xd0\x2b\xab\x7a\x55\xc2\x92\x19\xd2\x4b\x26\x88\xa9\x30\x30\x01\x85\xc1\x82\x12\xb0\x04\xac\xe8\x2b\xdd\xa2\xf8\x7d\xc5\x5c\xe8\xf1\x66\xf5\x71\xfb\xc3\xea\x58\xd7\x80\x9f\xd4\x31\xe3\xcf\xa7\x2d\x9e\x9a\xf1\x54\x8f\xe7\xdc\x23\xf1\x67\x6d\xc0\x32\xf9\x2e\x3a\x17\xc7\x8e\xf1\xaf\xd5\xca\xb7\x17\x2e\xe1\xc7\xf7\x4f\xde\x2f\x52\xfe\x57\xd8\xc9\xfc\x8b\x4b\x3d\x6f\x29\x79\x74\xe9\xe8\xb2\xe2\xe5\x94\xf6\x3f\x95\xa9\x9f\x72\xbc\x39\x21\x6a\x10\xfc\xb1\x1b\x56\xa7\x69\x48\xfb\x1f\x87\x74\x3f\xf5\xe3\x16\x8d\xfb\xfd\x99\x17\x8f\xa6\x3a\x15\x3f\x71\x93\xda\x49\xeb\x39\xc9\xcd\x72\x86\x15\x62\x1b\x42\x88\xc1\x4a\xe1\x83\x92\x82\x62\x82\xe5\xfc\x60\x50\x4c\x59\x4e\x4b\x5d\x60\xa5\x18\x0d\xad\xd2\x15\xa5\x24\xb6\x2d\x24\x9b\x4c\x9c\x6b\x7c\x1f\xde\xe6\xfa\xff\xfc\xcb\xca\x7d\x1f\x2f\x07\x74\xc1\xe1\x2f\x2c\xaa\xc7\x05\x71\x5b\x2f\xa5\xd2\xdb\x9b\xf3\x8c\x9f\x89\xbd\x07\xdc\x0f\x83\x0f\x8d\xdf\xa3\xec\xa0\x9c\xd3\x81\x81\x7d\x40\x3e\xb2\x78\xb5\xf0\x5e\xa5\x87\xc6\x37\x4d\x03\x48\xb3\x3e\x46\xa1\x0f\x6b\xad\xed\x6c\x1f\xb7\xd7\x39\xb7\x8c\x77\xe3\x7f\xa1\xef\xba\x6e\xe1\xe9\xe2\xc8\x3f\x5f\xba\x60\xd9\x99\x9d\x7c\x29\x12\x2c\x05\x82\x2b\x52\x4c\xf6\x73\x2b\xf4\xf8\xe2\xdb\x6b\xa8\x2b\x9b\x77\x79\x5e\xb0\x96\xee\x59\xff\x62\x01\x0f\x23\xc8\x1d\xa0\x9c\x87\xa1\x42\x14\x69\xca\x99\x95\x3b\x4d\x39\xc1\x90\x90\xca\xd7\xf2\xd8\x45\x01\x86\xa6\xb5\x0d\x38\x14\xa5\xaf\xca\xa2\x6d\xdb\x69\xa7\x38\x17\x72\x7d\xb2\x41\x3a\x23\x44\x38\xd9\x30\x68\x4e\x39\x71\x4c\x4b\xd3\x82\x32\xf4\x67\xdd\x09\xc3\x95\xa9\x8f\xa6\x96\xd3\x29\x48\x06\x3c\x38\xa5\x03\x46\x88\xb2\xa0\x9c\x0b\xc7\xba\x0e\x0d\xa2\x8a\xe3\x18\x33\xb2\xb3\xff\xe9\xaf\xde\x31\xaa\xff\xdd\x17\x65\xfa\x9b\xb7\xcb\xef\xe9\xb2\xfe\xfe\x11\xe5\xf5\xac\x9d\x03\x60\x17\x14\x18\x9e\x5b\x70\x08\xa6\x1e\x06\xa0\x4f\x53\x92\xf9\x17\x59\x5f\xdc\x2e\x62\x06\xe0\xf7\x07\xb2\xdf\x9d\x54\x73\x14\xfb\x0d\xe4\x3c\xd4\xc2\x5a\xa1\xa5\x94\xd3\x61\xca\xd3\x52\x86\x3d\x0f\x7b\x7e\x42\xcc\x31\xac\xb9\x64\x0e\x9d\xb5\xec\x68\xdc\xdf\xff\x26\x62\xb4\x4b\x72\xf6\xc6\xa8\x06\x5f\x3a\xa8\xb7\x3f\x7c\x98\x53\xd0\xf5\xcd\xe3\xcd\xf7\x20\xb1\x3b\x07\x48\xe8\x81\x7c\x29\x6b\x20\x09\x53\x2d\x75\x10\xcd\x43\x7a\xef\xdc\x04\x5d\xca\xd6\x43\x40\xa9\x1c\xed\xd1\xda\x69\x9e\xa2\x40\x0e\x70\x65\x94\x34\x52\x81\xee\x45\x58\x91\xe9\xa9\x9a\x73\x89\x94\xc4\xba\x48\x95\xfc\x7a\xce\x4c\xc1\x9b\x99\x60\x54\x13\x5c\xa4\x63\x6f\xee\xc1\xcd\x5d\xb1\xcd\x8a\x15\x7f\x4d\xe6\xf9\xb0\x0e\x1d\x09\x52\x02\x89\xc3\x1e\x90\xfc\x98\x76\x61\x9f\x6f\x2a\x3f\xd5\xfe\xa5\xcd\xd8\xd4\x85\xd1\x1e\xc1\xe0\x1d\xd8\xcf\x23\x31\x54\x76\x5e\x63\xa2\xee\xd3\x9c\x9b\x26\x60\x95\xac\xb7\x3f\x7c\x97\x3c\x44\x41\xc4\xa7\x1f\x1e\x32\x04\xf2\xb4\x02\x84\xfb\x70\x0c\x07\x1d\x86\xe9\x40\xc1\x9c\x95\x30\xba\x31\x7a\x1a\x61\x5d\x46\x7b\x6c\xdd\x58\x39\x74\x18\x26\x51\xbf\x91\x6e\x71\xd6\x2c\x5a\x88\x9f\x3f\x7d\xbc\x16\x43\xfc\xfc\xe1\x2e\x5d\x56\xd2\x7d\xda\x16\x75\x91\x95\xa5\x77\xcd\x01\x0e\x35\xa3\xc5\x64\x49\x10\x61\x27\x53\xea\x26\x95\x1e\x84\x2a\x05\x9f\x7c\x38\xc0\xa6\xec\x80\x0b\xa7\xa0\x88\xb7\xa0\x9f\x3f\xc3\xbf\xb2\x6d\x95\xd1\xa8\x11\x79\xf7\xe9\xae\x48\xbf\x7a\xff\xf4\x38\xed\x37\xca\xb4\xba\x81\xad\xe6\xa4\x98\x0a\x32\x87\xcf\x3c\x4d\xd2\xce\x4d\x28\x9c\x2a\x5f\xf9\x14\x06\x1d\x14\x73\x76\x59\x6b\x4f\xd9\x71\x5b\x44\x9e\xca\x3b\x17\xc0\xac\xad\x53\x58\xff\x38\xd4\x29\xdc\xe8\x90\x83\x48\xae\x0a\x76\xc9\xeb\xe9\x2b\x89\xb1\xd5\xbf\x8a\x2b\xfb\x5b\x95\xe6\xe1\xee\xf6\x0e\xe8\xc6\xba\x8d\xa9\x7f\xea\xd7\x64\x5d\x85\x62\x3a\x85\x52\x02\x97\x26\x19\x0c\xfb\x7e\xe9\x93\x48\xe6\x71\x91\xc4\xda\xd7\x5f\xce\x73\xc1\xd9\x43\xf9\xee\x26\xfa\xb5\xed\x06\xaf\xc5\xfa\x50\x3f\xcb\x95\x5f\x25\xe3\x9c\x7e\x8a\x71\xa9\x60\x4d\x3b\x50\x87\x38\xd7\x03\x70\x78\x65\xab\x53\xcc\x39\x97\xeb\xf4\x4a\x7a\xf2\x9b\x4b\x05\xe1\xc3\x7d\xaa\x5b\x0f\x50\x2e\x0d\x15\x85\xa4\x28\xaf\xfc\xbe\x13\xbe\xcd\xdb\x05\x1b\x79\x76\xa1\x2d\x5d\xa1\x01\x49\x87\xa9\x9f\xda\x5a\xdb\x34\x4f\xab\x24\x49\x57\x62\x8e\xb5\x22\x5e\xfb\xbb\xe8\x0c\xfc\xcd\x87\x2f\x3a\xc1\x0f\x69\xb6\x7d\xf8\x3e\xcd\x1e\x8b\x8f\x4b\x6e\xb7\xb5\x45\x90\x90\xe3\xaa\x2c\xea\x42\x70\xc9\x35\x1a\x4b\x90\x97\xb9\x2f\xdb\xc5\x24\xde\x3a\x1a\xaa\xb0\xeb\x94\xae\x0e\x7e\x0f\xca\x54\x57\xae\x02\x39\xa0\xa1\x1f\xc1\x68\x1c\x8d\xd6\xf0\xc9\x3a\xeb\xa3\xdf\x09\x4d\x1e\x92\xcf\xc9\xff\x94\xfc\xef\xc9\xff\x73\x1e\x05\x0b\xa9\x7f\xfb\x9e\xaf\xbf\xfc\x7b\x98\x43\xb6\xc7\x9b\x3b\xf0\x71\x7b\xe9\x44\x9b\x5f\xfb\xfd\x17\x61\x9a\xa7\x87\xa7\x8f\xbf\xf0\xdb\xf7\x3a\x35\xab\x24\x53\xc1\x8e\x94\x72\xad\x09\x65\x88\x40\x81\x8a\xa3\x1e\x2d\x31\x54\x89\x63\x30\xa9\x9d\x17\x29\x54\x96\xa4\x82\x94\x94\x45\xe8\x69\x09\x09\x29\xca\xb2\x24\x84\x60\x04\xcc\xd7\xbf\x27\x25\xac\x4a\x5c\x16\x25\x24\x15\x84\x15\x41\x1b\xea\x5e\x13\x52\x29\x62\xe5\xb3\x63\xbc\xb0\x05\x5d\xc1\x67\xbc\xda\x3d\x17\xeb\x82\x49\xc3\x2c\x48\x02\xab\xba\x9a\x68\x52\x61\xca\x7d\x55\x21\x59\x49\xd6\x60\x4c\x08\x22\xbe\xae\x44\xd0\xd7\xbf\x46\x15\x87\x92\x31\x8e\x31\xc6\x08\x33\xc6\x28\x12\xb1\x56\x42\x5e\xe9\xca\x6e\x68\xf2\xb7\xc9\x7f\x48\xfe\x4b\xf2\x7f\x25\xff\xef\x59\x1f\xe2\xee\xe7\xe7\xf1\xee\x8c\xb3\xfe\xfe\xf6\x2c\x72\x31\x9f\xca\xb7\x92\x5e\xb4\x93\x7a\x3b\x5b\x97\x73\xf9\xf3\x5f\x7f\xdc\x3e\x9c\xcd\xa7\x6c\xb6\x0b\x1c\x14\x94\x71\x6b\x19\x67\xd1\xb3\x07\xbe\x26\xe6\x35\xb1\x39\x77\x4c\x21\x0c\x92\x20\xd2\x1d\x85\xb0\x82\x04\x95\x90\xce\xbb\x5d\x04\xc7\x20\x84\x15\x2d\x4a\x1c\x9f\x00\xcd\xcf\x5e\x10\xcf\x37\x42\x74\x3e\xbf\xf8\xcb\xb9\xb4\xcf\x2d\x9f\x97\x27\xb2\xaa\xce\xe7\x32\xc9\xa5\x34\x8c\x92\x78\x36\x25\xa3\x3c\x9e\x30\xef\x11\xc7\xa8\x92\x8c\x31\x82\xb1\x24\xde\xa3\xf9\x74\x5e\x7e\x4f\xdc\xfc\x7b\x08\x25\xab\x89\x92\x84\x32\x1f\xcf\xe5\x66\xd5\xbd\xe2\xb3\x27\xdb\xaf\xcf\x38\xd6\xdf\x9e\x35\x1e\xa2\xf5\xeb\xcd\xdd\xe7\xa5\x81\xfc\x7a\xe1\xca\xae\xc0\xdc\x75\xef\x10\x28\x31\xae\xa7\x1e\x24\x04\x75\x98\x72\x8d\x17\x17\xf6\x65\x2b\x8d\xf0\xca\x01\x67\x98\x66\x66\x63\xa0\xd5\x8a\xbf\xc0\x6c\xe0\x92\x53\xe9\xa6\xbe\x09\xb8\x09\xa4\x0e\x3d\x75\x56\x69\xad\x1d\x75\x73\xce\x48\x5f\x59\x5a\x9d\xb9\x85\x1f\x37\xdb\x6f\x6e\xbe\xcc\x88\x4b\xe0\xf0\xe1\xba\x8b\x13\xb4\x1a\x71\xa5\x4d\x45\x2b\x46\x31\x92\x9a\xd5\x06\x96\x9c\x70\x2e\x08\x33\x18\x6d\x34\xb5\x3e\x34\xa1\x08\xbb\xd0\xe7\x4d\x79\x3a\x35\x27\xeb\x6b\x40\x0e\x48\x63\x2d\xac\xd7\x84\xc9\x79\xfe\x5a\x1d\xcf\xbd\xd1\x91\x87\x0f\x1e\x3f\xdf\x3c\x16\xdb\xc7\xdb\xfb\x08\xd0\xa7\x71\x91\x3c\x37\x4d\xae\xcb\x43\x6e\xf3\x71\x80\x83\x6c\x11\xe1\x5c\x1d\xcb\x7d\x9a\x50\x6c\x2a\xba\x62\xa7\x79\xed\x3a\xb9\x49\x85\xc6\x02\x08\xc4\x6b\x72\x72\x0a\x88\xb4\x4e\xa9\xb6\xc4\x9a\x8b\xd6\x40\x15\x3f\x6b\x1d\x3f\xeb\x9c\x9b\x7c\x7e\xfa\xf8\xed\x9b\xcf\xed\x66\xf1\x7d\x5b\xd7\x4e\x2b\x65\x9e\x45\x7a\x9a\xe7\x9d\x0c\x4f\x25\x28\xd2\x84\x4c\x5d\x38\xd2\x20\x42\x27\xd2\x62\x3f\x89\x8d\x46\x44\x53\xe4\xb8\x28\x38\x73\x47\xe2\x05\xa0\xf6\x84\x1c\x1b\x16\x6d\x6b\x1a\xe7\x1f\xf6\x86\x70\x2d\x68\xca\xa5\xa2\xf2\x78\xf3\x5d\x8c\x50\xae\xbe\xdc\x4d\xa7\x83\x09\x65\xe6\xc2\x09\xb0\x9f\x76\xbb\xb4\x0c\x16\x0c\x01\x16\xb6\x1d\xd5\x90\xee\x8f\x3b\xdd\x0f\x1b\x66\x79\x15\x46\x17\x88\xf7\xd9\x01\x3d\x8f\xa0\x9f\x8c\x1a\xbc\xd7\x7b\xdf\x9b\x9d\x5b\xd6\x22\x36\x5f\x67\x19\x7c\x73\x25\xf9\xe1\xe1\xe9\x9b\xf5\xf6\x87\x87\x6b\x48\xfa\xac\x20\x3f\x27\x5d\x69\x5b\x8b\x3e\x13\x5e\xba\x1e\xec\x98\xb7\x85\xb6\x58\x97\x86\xa2\x2a\x0f\x88\x4d\x9e\xa7\x90\x85\x9d\x71\x06\xd4\x59\x51\xd5\x4e\x75\x24\x1c\x74\x8d\x68\x68\xfb\xd2\x15\x6a\x08\x52\x38\x0a\x20\x65\x44\xb7\x49\x02\xd2\xf2\x95\xae\xf8\x06\x46\xad\xf2\x88\x87\x5f\xaf\xe0\xb1\xef\x80\x82\x63\xe8\x20\x70\xc8\x5a\xc6\x4a\x8d\x11\x83\x41\x12\x40\x42\xbb\x81\x53\x1b\xfa\xa9\x0f\x63\xe9\xca\x0e\xa8\x54\x00\x94\x24\xab\x15\x8b\xf1\x0c\x8a\xdd\x14\x65\xf4\x48\xbd\x8b\xc8\xc6\xf6\xe6\xfe\x66\xb3\x7e\x78\xba\xb9\x07\x67\x21\xf4\x9b\xef\x6f\xee\x56\x32\x43\x8a\x43\xed\x4f\xe1\x88\xad\x02\xf9\xf5\x28\xd9\x20\xf7\x92\x14\x16\x06\x02\x3c\x42\x4d\xb1\x92\x91\x68\xab\x40\x32\x11\x04\x92\x78\x0e\xb3\x63\x82\x63\x1d\xf6\xf7\x57\xce\x2e\x67\x99\xc8\xeb\x2c\x60\xe9\x55\xf8\xbc\x46\xae\xac\xc0\x71\x3a\x31\x39\x2c\xe2\x25\x26\x18\x17\x05\x3f\x1c\x54\x7c\x0f\x92\x6a\x63\xa0\x92\xf6\xd8\xcc\xb9\xaa\x19\xed\x9c\x82\xda\xd1\x36\x83\xd5\x67\xbe\xed\x71\x2b\x36\x70\xe1\x41\x7e\x58\xd8\x7e\x6f\x1e\x46\x73\x94\xb2\xdb\xf8\x97\x1c\x93\x6c\xf7\x5c\xb7\x3b\x09\x4c\x1f\x8a\xb4\xca\xd0\xcb\x7e\x03\xbd\x10\x01\x02\x54\x6b\x33\x80\x6a\x3a\xee\x93\x24\x4b\x6d\x1c\x5b\x24\xf9\xe6\xac\x7f\x7a\xf3\xed\x3f\x80\xdb\xbb\xdf\xff\xf0\x69\x5e\xe1\xb7\x0f\xff\x08\x6e\xae\x4b\x7a\x1b\x4d\x86\x30\x72\x11\x78\x61\x6b\xe5\x55\x26\xeb\x49\xd7\xf5\x9c\x69\x6d\x48\x80\xc2\x0b\x01\x4c\x38\xbc\x26\xc2\xf0\x23\x10\x2f\xfe\x45\x1b\x93\xd9\xc9\xc6\x3a\x18\x07\x3e\xae\xf1\xb7\x5f\x2a\x2b\xc9\xd9\x39\x7a\x0e\xa7\xc0\x5d\x9d\x15\x75\x56\x4c\x35\x48\x40\xcd\x03\x0e\xfb\x3a\x1c\x03\x52\xa0\x01\xc9\x54\xaf\xc5\x62\x49\x57\xd7\xcd\x01\xf4\x2f\x43\x56\x05\x76\xb4\x7b\x30\x27\x6a\xe0\xcc\x91\x82\x67\xce\xdf\xdd\x75\x7c\x32\x87\x6b\xe0\x21\xf9\x0d\xb8\xcb\xf0\x4a\x4c\x22\xe5\xb9\x76\xa6\x29\x3b\x53\x15\x55\x1e\x58\x15\xac\x05\x2e\x0c\x1b\xe8\x83\x79\x51\x61\x28\x9b\x92\xee\x52\x31\xe9\xc0\x25\xd8\xa5\x35\x88\x3a\x24\x20\x1d\xcf\xde\xa1\xbf\xf9\xe2\x4c\xbc\x3d\xc3\xed\x9b\x08\xb8\xcf\x3f\x57\xd2\x17\x10\x1c\x35\x31\xa0\x32\xe1\xa4\x3b\xe6\x7b\x9a\xaa\x3a\x78\xee\x0c\xc8\x37\x1a\x3a\xeb\xca\xa0\x6d\xa0\x47\x0f\x72\xa0\x5f\x13\xde\x18\x0f\xfa\xac\x18\x3b\x05\x78\xc4\x71\x58\xec\xcb\xfb\xd5\x75\x9f\xfc\x12\x97\x9b\x0c\x43\xe4\x49\x95\x95\x3f\x99\xd5\xe9\x27\x79\x58\x77\xb1\xf9\xcf\x85\xde\x83\x43\xfc\xdb\xe4\x0f\xff\x2d\x82\x55\x4d\xe0\x97\xbf\xf5\x9c\x61\xa9\x5d\x70\x3e\xcd\x23\x3e\x71\x3a\xf3\xd4\x7f\x56\xd7\x35\x19\xaa\xb3\xea\xe5\x90\x76\x3f\x25\x69\xf3\xb2\x5f\xeb\xa5\x48\xdc\x78\x0f\xf8\x1c\xd2\x57\xd1\x6b\xa8\x8c\xca\xe7\xbf\x14\x1b\xde\xdc\xaf\x9a\xb4\xcf\xb5\x9b\x23\x43\x42\x0a\x7c\xb2\x8d\xf5\xb6\xde\x94\x3f\xf5\xc1\x94\x75\x69\x00\xcf\xda\x29\x9f\xba\x51\xee\x52\x9c\xee\x93\x2c\x1b\x00\xde\xda\x15\x8c\xda\x60\xbf\xbb\x66\x39\x3c\x7c\xbe\xd6\x54\x39\x37\x1c\xde\x6f\x98\x6d\xb9\xab\x5f\x13\x65\x3a\xde\x97\xa9\x92\x12\x92\x92\x55\xb0\xcc\x87\xea\x35\xe1\xfb\x4a\xaf\xa0\xa2\x8a\x78\x46\x3d\x93\xbc\x0d\x43\x5d\x9a\x92\xd8\x93\xd0\xc4\x27\x59\xa2\x80\xc8\xba\x55\x19\x3f\xef\xee\xfd\xe7\xad\x2f\xb6\xa6\xd7\x5a\x2d\xf7\xa0\x64\x54\x12\x9e\x5a\x45\xa9\xe4\x93\x05\xcc\x02\x16\x46\x27\x99\xd6\x56\xb6\xbc\x91\xa7\x55\x49\xf8\x1c\x26\xcd\xaf\xa3\xed\xf1\xa8\x19\x55\x82\x0e\xa3\xe5\x92\xcb\xf9\x9c\xaf\xf0\x9f\xc0\xec\xca\xe7\xd3\xaa\x78\x6e\x37\x34\x28\x63\x98\x62\x17\xac\xaf\xf8\xf2\x77\x8b\x14\xc9\xb9\x02\xe0\x56\xc9\x73\x77\x85\xf7\x8d\x9d\x9f\x84\xf7\xdd\xb2\xbe\x99\xac\x8c\xd7\xc7\x5f\x26\xdf\xcc\x7f\xf9\xb0\x90\x96\xb3\xf8\xc7\x60\x7b\xf7\xb4\xe6\x2f\x0e\x1d\x7c\x59\x64\x66\x07\x76\x3f\x26\x2b\x37\xb5\x2c\x83\x74\x45\x0d\x68\x61\x85\xe2\x92\x02\x7a\xef\x23\x07\x45\x47\xee\xff\xf2\x5e\x57\x6f\xf4\x74\xf7\xf0\xfd\xd3\xdd\x36\xe5\xf3\xfb\x34\x1d\xd8\x8f\xa7\x95\x47\x2f\x06\x65\x23\x7d\xe9\xc8\x46\xc3\xaa\x72\xc1\x39\x27\x75\x11\x7b\xcd\x41\x62\x5e\xf1\xd6\x00\x3e\xcf\x0d\x4f\x57\x58\xe0\x85\x5f\xf9\x74\x67\xc0\xe8\xc1\x58\x83\x43\xa8\xea\xe9\x44\x03\x23\x80\x92\x80\x47\x21\x38\x77\x91\x47\x33\x56\x0e\x46\xfd\x1d\x15\xcf\xa9\x8b\x3e\x18\xc9\x87\x79\x6f\xa2\x80\x6f\x64\xb5\xdd\x3d\xdd\xa9\xd5\x0e\xbe\xc8\xaa\x76\x30\xeb\x1c\x68\xc7\x13\xd8\x65\x02\xbd\xd4\xab\x8e\x08\x80\x4b\xa2\xc3\x68\x00\x3a\xe7\x4e\xf6\x15\xc7\x5a\x4b\xf4\xdb\xfe\x70\xf7\xc3\xa7\xc7\x6f\xe7\x11\x15\xd3\x93\x0f\x1f\xd3\xfb\xdf\x27\xd9\x59\xa2\xd1\xae\x8a\xbc\xce\x53\x32\xed\x2a\xaf\x28\x2a\x5d\xd5\xea\xe0\xf1\xf3\x71\xed\x9c\x12\xda\xae\x93\x76\xb7\x6b\xfd\x34\x84\x76\x04\x65\x15\x68\x5a\xa7\x0e\x9c\x98\xd4\x9a\xbd\xf9\x16\x6d\x7d\xe6\x97\xca\xf3\xe7\x4f\x8f\xdf\x6e\x2f\xa3\xf0\xc2\x32\xbd\x93\xe0\x54\xd4\x79\x9a\xd4\x60\x0c\x79\x3d\x1d\x49\x10\x04\x10\x12\x60\x4a\x7c\xdf\x7b\xc0\x43\xe3\xa7\x26\xe5\x21\x61\x9e\x82\x05\xc7\x06\xfd\x2b\xdd\xc8\x34\x8f\xda\x2f\x8f\xb7\x77\x5f\xd3\x95\xe2\x96\x75\x3e\x2d\x85\x40\x04\x72\x84\x82\x89\x85\xed\x31\xcd\x75\x38\x71\x9e\xbb\x9c\xca\x48\xeb\xf1\xf3\x3c\x0e\xcc\x2b\xdd\x34\xe9\x31\xbe\xdf\x2f\x05\xf6\xf3\x77\xb7\x69\xa4\xa4\xa2\xb2\x84\x04\xe2\x83\xf0\x29\xf6\x29\x0b\xe4\x2c\x9b\x91\x47\xa3\xdb\x53\x5a\x7b\xff\xf6\x7e\xcd\x57\xef\x77\xb5\x73\xf1\xfd\xb4\xa6\x1c\x6a\xc2\x03\xad\x83\xf4\x29\x9a\x4f\x81\x13\x22\xf7\x39\xeb\x22\x15\x91\xa5\xa4\x9d\xe3\x0a\x50\xbe\x92\xcd\x29\xeb\xfe\xf8\xfe\x9d\xa4\xe0\xaa\xf2\x0c\x4f\x63\x1d\x12\x9f\xfa\x3a\x3d\x4e\x2d\x17\x85\x2f\x28\xf0\x2f\xc7\xac\x9c\x4c\x56\xec\xf7\x0b\x9f\x6d\xeb\x33\x78\xf6\xa7\xbb\xbf\xa0\x49\xef\x51\xce\xf5\x12\x84\xaf\x1f\xbe\xfb\x3e\x7a\x65\x80\x12\x90\x3a\xad\x7c\x44\x6a\x86\x71\x0f\x4e\xf3\x6d\x5a\x4d\x87\x4a\x8f\xa1\x91\x80\x64\x04\x10\x50\xd2\x70\x08\xfb\xd4\x47\x22\x6d\xeb\x5c\xdb\xb6\xa1\x16\xb5\x74\xcc\x72\xe5\x2d\x4b\x92\x74\x7d\x88\xfa\x31\x3a\xf9\x66\xf9\x06\x97\x12\xfe\x37\x17\x4a\xd4\x5b\xf0\x7b\xb0\xba\x55\xa5\x95\xbc\xaa\x98\x52\xb9\x05\x9a\x54\x02\xe1\x95\x4e\x93\x90\xd8\x49\xcc\xcb\x1c\x4a\x8b\x69\x0c\x3d\x07\xbb\xd4\x82\xa3\x32\x67\xde\x05\x48\x4e\x6b\xb9\x85\x0b\x2e\xf1\xe1\x7c\x6c\xf3\x76\x72\x29\xaa\x53\xec\x7f\xdc\x6f\xa8\xf4\x5e\x1d\x17\xbf\xfb\x85\x8f\xfc\xa6\x6d\xf1\x47\xb8\xc7\x9b\x3f\xa1\xbc\x9f\x55\xa0\x5f\xec\xf8\x6a\xad\x83\x00\x6d\x60\x6e\xd7\x23\x17\x9a\xd0\x48\xaa\xd5\xbe\x8a\x2c\xfc\x60\x80\x09\x04\xf4\xcb\x6d\xca\x97\x8e\xf8\x9f\xeb\xee\x7b\x1b\x55\xf7\x05\x77\xf8\xe7\xaa\xfb\x73\x9e\xaa\x5e\x75\x76\x3c\xf3\x3b\xce\xce\x05\xd7\x1d\x2d\x17\x51\xd3\xd8\xc1\x72\x73\xdd\x9d\x6c\x6a\xdf\xf9\xba\x1e\x5e\x6c\x5b\x03\xdc\x75\xa0\x9f\x0e\xce\x01\x1f\x83\x37\xb9\x36\xe3\x38\x8e\xee\x35\x71\x67\xfb\xc5\x90\xbc\x8c\x2a\xd3\xa1\xef\x42\xde\x27\x7f\x9e\xd0\x57\xba\x32\x1b\x9b\xfc\xea\x9d\xb6\xc9\xbf\x7d\x73\xb0\x8f\xf3\xe7\x6a\xf1\x85\x88\xd1\xf6\x7a\xce\xa5\xd6\x5f\x49\x3c\xbc\x49\x3f\x5c\x0f\x93\xfb\xab\x0e\xba\x4b\x5d\xf1\x31\xd6\x14\x7d\x09\x01\xdc\x71\x2a\xa6\x83\x10\x0c\x08\xd0\x9b\x9a\xb1\x85\xb8\x21\x18\x4b\x63\x52\x28\x19\x0b\xec\xf2\x4c\xc9\x68\x85\x4b\x5a\x95\x8d\xb1\xc6\x59\xeb\x1c\x28\xac\x69\x36\xb6\x42\xd0\x36\x8a\x10\x89\x29\x31\x07\xc7\x19\x67\xc7\x60\x64\x2b\xdf\x7e\x04\x3d\x75\x94\x15\x3a\xc7\xfe\x4d\xb1\xa0\x4d\x87\x70\xac\xe7\xff\xe6\x18\x21\xce\x6f\x1b\x13\x33\xab\xf9\x10\xbf\xff\x18\x33\x9d\xa8\x85\x74\x56\xec\xfa\x70\xff\xe9\x6e\xdd\x1a\x8b\x81\x04\x88\x84\x11\xa0\xd7\x44\xb7\xc2\x49\xc7\x9c\x6c\xe5\x08\xaa\xb5\x85\xa5\x43\xca\xb2\xd0\xf8\x40\xfa\xb6\x07\xf2\xa5\xce\x70\x18\x0e\x76\x0e\x1b\x7d\xb2\x49\xd4\x2b\xdf\xb6\xd9\x10\xf3\xe7\x7f\x8c\x7e\x7c\xff\xe7\x55\x34\x74\xa9\xd2\x3e\xdc\xaf\x1f\x9f\xee\xbe\x7f\x13\xa0\x7e\xd7\x08\xfd\x45\x3c\xf5\x2c\x1d\xb2\x7d\x37\x31\x9d\x5b\x29\xe7\x91\x6f\x01\x2b\x0a\x53\x95\x80\x9b\x12\x1e\x5f\xe6\x0b\x16\x90\x1d\x0e\x87\xd4\xda\x68\xf6\x2c\x27\xf7\x86\x15\xe3\x69\x87\x0f\x00\xd2\xdc\x42\x15\x7c\xd8\x89\x54\x4d\xde\x70\xc1\x64\x69\x09\x0e\x95\x73\xf3\xfa\x36\x6f\x99\x81\x65\x55\x61\x45\xb0\x9a\x33\xf0\x5d\x25\x79\x18\xb1\xc4\x92\x88\x02\xe6\x95\x44\x96\x22\x96\x2a\x32\xaf\x85\x24\x97\x39\x86\x7d\xea\x3b\x3a\xd2\xf9\xf8\xd3\x53\xd4\x2f\xf8\x26\xf9\x98\xfc\xa7\x8b\x33\xdd\x2f\x1e\xff\xe7\x2f\x27\xe0\xf6\xbf\xe6\x04\x94\xba\x2a\x81\x34\x65\x39\xbc\xa8\x1d\x9c\x4f\x00\x2c\xc2\x31\x35\x2e\x1a\x3d\xcd\x67\xe0\xdc\x97\x9f\xa2\x69\x8f\xf7\xa0\xa4\xb9\x83\x3a\xd4\x61\x2f\xe7\x33\xa0\xc5\x2f\x9c\x81\x0d\x8c\x67\x40\x54\x50\x4a\x4a\x61\xd5\x22\x8e\x0e\x15\x43\xac\x62\x79\x51\x54\x14\x09\x04\x09\x18\x2a\x1d\x34\xc6\x39\xcf\x51\xee\xc0\x68\x51\x17\x7b\xc6\x22\xae\x67\xe2\x38\xff\x9b\xe4\x3f\x2e\xe3\xeb\x9d\x0e\x5f\xd4\x6b\xfb\xf8\xf8\xed\xf6\xf1\x53\xb4\x01\x5f\x2c\x2c\x6e\x1e\x6f\x1f\x3f\x2f\x92\x25\xef\x5f\xbe\xbe\x7a\xe5\xe7\xa7\xe5\x75\x2b\xeb\x61\x6a\x84\x45\x14\x4a\x54\xa1\x69\x8f\x94\xb0\x27\x5b\x4a\x17\x06\x7a\x94\x44\x42\x54\x5b\x56\x52\xc2\x45\xc3\x1d\x4a\x91\xf2\x98\x55\x06\x61\x1c\xa8\xcd\x85\x0d\x23\x1e\x45\x87\x1b\xcb\x8a\x8d\xae\xc8\x54\x2f\xaa\x7d\x4e\x08\x65\xb4\x99\x7f\xdf\x1a\x09\x19\xc4\x20\x31\x62\x62\x14\x4b\xd9\x54\x6c\xaa\x87\xd2\x97\x35\xb0\xd8\x08\x17\x4e\xbd\xd2\x4c\xce\x2f\x48\x56\xd9\xfe\x95\xc7\xfc\x64\x59\xa5\xfe\xe6\x8c\x19\x7d\x9b\xbe\x33\x8a\xf8\x22\xa2\x79\xc6\x52\xa3\xb9\xcc\x3a\xf7\x08\x38\x43\xbb\x8e\xef\x9b\x3e\x8c\x04\x24\x35\xa7\x98\xc8\x5e\x31\x21\x51\xd8\xa3\xbe\x25\x7d\x47\x00\x1d\xf8\x21\xec\x37\x1a\x36\xb6\x0c\xbd\xa8\x89\x97\x75\xc7\x3d\x69\xa4\x16\x54\x8e\xd0\x6b\xbb\x9b\x20\xd7\xce\xb1\xc6\xf6\xa6\x73\x49\xba\xca\x23\xc6\x21\x93\xc5\x91\xf1\xcc\x1e\xfa\x02\x86\xa6\xd9\x42\x97\xf8\xfc\xcd\x87\xbb\x6f\xd6\x3b\x52\x01\x21\xab\xd6\x1c\xd4\xce\xd8\x5e\xf4\xa6\xa7\x1a\x68\x88\xfb\x52\xc1\x60\xf1\x46\xba\x26\x06\x51\x4d\x6b\xeb\xba\xb3\xd6\xec\x00\x4b\x91\x77\xfa\xd9\x41\x60\x41\x15\x68\x92\x6c\x40\xf2\x4a\xb7\x7d\xda\xbf\x69\xb5\xfc\xbb\xa8\xab\x7b\x19\xea\xdf\xfe\xfa\xee\xed\xea\x5e\xae\xe6\x18\xb5\x7e\xba\xbb\x08\x4a\xad\x2f\xcd\xd3\x78\x5d\x4d\xfd\x3c\x8e\x35\x28\x01\x66\xb9\x29\x4c\x30\xc1\xb6\x21\x77\xa9\x9d\x5a\x9f\x8d\x2f\x39\x99\x83\xb1\xd4\xa5\xe5\x33\xbf\xdc\x4b\xfb\x91\x04\x91\x97\x45\x25\x2b\xcb\x08\x42\x14\x1c\x09\xa7\x41\x13\x42\x0e\x34\x16\x17\xb7\x91\x53\xd5\x6c\xd0\x1b\xc3\xe9\xf2\xad\x9d\x4b\x8a\x1f\xae\x6a\x53\x1f\xde\x1c\xcf\xae\x81\xbe\xac\xf6\x21\x77\x24\xf5\x93\xf4\x0b\x05\x39\xb8\x03\x2a\x41\xf5\x32\x00\x5e\x42\x2a\x44\x47\x3c\x68\xad\x16\xc6\x6c\xd0\xa8\xf5\x18\xf6\x93\x04\xc6\x07\xe9\xc2\x8e\x71\x3b\x87\x67\x9d\x6c\x94\xe5\xb5\xf2\xba\x89\x79\x6e\x9e\xed\xa3\x06\x3e\x49\x7e\x7b\x75\xee\x3e\x45\xf6\xf4\x39\x25\xbc\x14\xa9\x17\x77\x98\x08\x41\x82\xa8\x62\xf5\xeb\x0f\xb7\x8f\x9f\xd6\x9f\xee\x6f\xc1\xf9\xf6\xc3\xa7\xfb\xdb\xef\x6f\x1f\x3f\x6d\x79\x38\xcd\x6b\x8c\x22\x65\x6e\x4b\xfe\x9a\x50\x2f\x22\xca\x72\x02\x47\x8e\x73\x6f\x42\x65\xc1\xe0\x42\xe9\xbd\x07\x27\xb7\x21\x81\xb6\x2f\xa7\x91\x68\xdc\x51\xc2\x0e\x59\xd9\x81\xee\x47\xb7\x1e\x7f\xa2\x38\x5f\x8f\xfb\xf9\xbf\x20\x8f\xc7\xe3\x30\x84\xee\x70\xd8\xf7\x7d\x12\xe7\x7d\xba\x75\x19\x4d\x7e\x9b\x7c\xf7\xcb\x0e\xc2\x1f\xdf\x8b\x46\x3c\x9d\xc5\xfd\xe7\xaf\xfa\x31\x82\xfa\xe7\xf2\xe6\x3b\x07\x61\xbc\xd6\x53\x1d\x75\x00\xc8\x4f\xb9\x90\x52\x4b\x72\xcc\x48\x74\xf1\xb7\xf5\x01\x56\x92\x22\x19\xaa\x54\x0b\x52\x19\xd2\x4f\x08\x43\x57\xe2\x55\x2e\xb0\x43\x3c\xec\x08\x74\x10\x67\x34\x28\xa2\xa8\xc6\x86\x2a\xc2\x34\x55\x44\x55\x15\xa1\xb4\x6d\x09\x47\xb2\x9d\x04\x13\x48\xb2\x8a\x09\x22\x19\x62\x12\x49\x1e\xe7\x30\x1b\x7d\x15\x75\xf2\x17\xc9\x5f\x25\xbf\xbf\xb0\x8c\xae\xd4\x3b\x3e\x6e\x1f\x53\x70\xee\xa4\x58\xc6\xf4\xfd\xe6\xfb\xb3\x09\xd3\x45\x6b\xe5\x5d\xeb\xf7\xba\x41\x25\xb0\x6e\x52\x0e\x58\x08\x77\xb6\x38\xe2\xa0\x78\x2f\x30\x42\x52\xcc\x3f\x73\x5e\xa6\x44\xe7\x44\x96\xb6\xa0\xad\xc7\xc0\x30\x5a\x40\x08\x4b\xb4\xd1\x42\x85\xc1\xd7\xa0\xe2\x34\x14\x50\xbc\xb4\xa1\xd7\x1e\x14\xb8\x52\x72\x94\x55\xd5\xb4\xc6\xbc\xec\xaa\x82\x28\xd4\x51\x24\xb3\x61\xda\x73\x9e\x9b\x9c\x25\xdb\x6c\x38\xc7\x8b\x5f\xaa\xb2\x7f\x13\x5d\x88\xaf\xe3\xc6\x48\xec\xfd\x74\x07\x16\x17\x62\xb0\xdc\xbd\x5d\x5f\xa5\xe0\xab\x02\xf0\xc5\x28\x1c\xc9\x17\xaa\x41\x11\x9a\xd4\x06\x0e\x9a\xab\xcd\x7a\x23\x95\x0b\x7b\xad\xb5\x76\xeb\xa3\x73\x56\xbf\x30\x6b\xb3\x56\x07\xa7\x94\x56\x67\xf9\x7b\x55\x0b\xad\x1d\x97\xac\x96\x0b\xd7\x67\x7b\xbe\x76\x5c\x1c\x85\x7f\xca\x7f\xfa\xab\xcb\x66\x33\x5f\x37\x7f\xc8\x7f\xfa\xea\xea\x19\x87\xb7\xcb\x66\xa8\xde\x5d\x36\xb0\xda\x3d\x13\xcd\xb8\x96\xeb\x1d\xc3\x16\xd1\x50\x53\x68\x21\x09\x3d\x86\xb6\x24\x99\x0b\x82\x29\xae\x35\x57\x4c\x61\x44\x39\xef\x7b\x26\x10\xc5\xfd\x84\xa8\xa6\x92\x72\x21\x89\x12\x48\xa8\x4a\x09\xc8\x55\xa5\x78\x8c\xe9\x9b\xec\xb4\x65\x67\xde\xf9\xcd\xd2\xf2\x73\x0e\x02\xae\x28\xe8\x5b\xe6\x7f\x72\x35\xa0\x15\x71\x0c\x01\x04\x89\xa7\xd5\x4e\x90\x96\xd1\xb5\x09\x6e\x78\x4d\x80\x13\xbc\x92\x5a\x71\xa4\xac\xb1\x48\x8b\x0b\xc7\x77\xa5\x36\x32\xf9\x7e\xd1\x6b\xbf\x56\xb2\x7d\x93\x38\x7c\xba\x52\xe0\xdd\x3e\xc0\x8b\xff\xeb\xf2\xaa\xaf\x39\x07\x71\x97\x9e\xb2\x3d\xf5\x1d\xa8\x43\xdb\x7b\x5e\xb7\x87\x9e\xef\x0e\xdd\xc8\x00\x6c\xed\x51\xec\x4d\x38\x80\xc6\x35\x08\x98\xd2\x49\x2e\xb8\x70\x5a\x18\x47\x04\x25\x90\x32\xd8\xf4\xd8\x6a\xca\x24\x67\xd5\x46\xda\xaa\xf4\x46\x6a\xe5\x64\x27\x8d\xf6\xb2\xd7\xd2\xef\x9b\xc6\x28\x69\x8c\x2d\x72\xf7\xe2\xc3\x9e\x4a\xcd\x08\x13\xda\xf0\x33\xdb\x40\x73\x6a\x10\xe6\x9c\x32\x55\x2c\x75\x57\x96\x1d\xe3\x31\xfe\xcf\xff\x82\xc7\xf8\xf9\x29\xa3\xd4\xcc\xa9\xfa\xd0\x38\x61\x5c\xdf\xb0\xb6\x6f\x06\x06\x0a\xa7\x7b\x3e\x88\x70\x02\x42\x5b\x04\x68\xee\x28\x32\x94\x29\x21\x84\xa2\x9c\xe0\x12\x93\xca\xb5\x58\x09\x4c\x25\xa5\x65\x79\x3e\x4a\xa1\xb5\x15\x8d\x34\xca\xcb\xde\xc8\xa6\x97\xb5\xd2\xc6\x5e\x8e\xf2\xc0\x38\x13\x44\x48\x6d\xc5\x7e\x39\x4a\xaf\xb8\xc5\x58\x0a\xc6\x75\x59\xbc\xf9\x52\xa1\x8d\x7e\xa7\x41\x17\xbb\x08\xde\xf5\xfa\x9f\x9b\x22\x6f\xce\x9c\x96\xf5\xe3\xa7\xfb\xec\x2b\x16\xe3\xf5\x28\xa8\x5b\xbf\xab\x9b\x66\x08\x12\xf0\x97\x0e\xf0\x20\x8f\x2d\xa0\xbb\x5d\xd3\xf7\x80\xf7\xd3\x31\xde\x04\x26\xd4\x89\xec\x41\xeb\x3d\xab\xfd\x7a\xd7\xb6\x6d\x6b\x3b\x6b\x27\x98\x0e\xd6\x76\x5d\x37\x15\x4d\xd3\x04\xd8\x75\x5d\x68\xe4\xbc\xe3\x0a\x4b\x6b\xa2\x2e\x4a\xba\x22\xaf\xfe\x5c\xab\xf9\xcd\x05\xad\xcb\xae\xf4\xf2\x2e\xc5\xb1\x75\x27\x89\xc5\x72\x9f\x15\x61\x17\x69\xeb\xfc\xa5\x01\x22\x66\x41\xbb\x8d\x56\x96\x19\x1d\xf6\x3e\x20\x17\x90\xf7\x60\xef\xc0\x3e\xd9\xac\x60\xd4\x5c\x51\xef\xbd\x3a\xae\x79\x3f\x97\x4c\xf1\xe3\x1f\x28\xc2\xad\xa4\xf0\x00\x7a\xce\xf5\x4b\xe3\xc4\x78\x5d\x58\x80\x52\x1d\x48\x03\x76\x5e\x4b\x63\xd7\x26\x8a\x20\xbc\x38\xe7\x32\xb5\xdb\x4d\xc7\xdd\x34\xec\x82\x51\xb5\x72\xb4\x56\xce\xd4\x3a\x7e\x47\xfc\x95\xae\xca\x8d\x7d\xa7\x01\xf3\x98\x90\x4b\x3c\x75\xfb\xb8\xd0\xda\xaf\x7d\xa4\x6f\x6f\xae\x48\xd2\xd9\xb9\xa9\x6e\x8e\x5c\x6f\xd7\x37\x57\x0f\x52\x8d\x4b\xc0\x4e\xa7\x09\xe7\xca\x28\x20\xca\xaa\x93\x56\x08\x71\x94\x56\x62\x4e\xa1\xd5\xd4\xd6\xa1\xa4\x18\x6a\x45\xac\xdf\x58\x2e\x6d\x33\x8d\x01\x07\xc3\x80\x01\xc7\x74\xc7\x48\x20\x51\xfc\x48\x9f\x0d\x57\x46\x90\xbf\x1c\x47\x58\x29\x8a\x68\x5a\xef\x4d\xfe\x9a\x40\xa8\x08\xa2\x69\xb3\x8f\x75\xb6\x3c\x11\xaf\x78\xab\x37\xee\x1d\x53\xe7\xef\xe3\x38\x3b\x87\x68\x57\xe4\xa3\xdf\x81\xb3\x3f\xfd\x45\xd2\x66\x3e\xf5\xeb\x65\xed\xf8\xee\xe9\xe3\x66\xfd\x00\xae\x34\x46\xfe\x12\xc4\xf2\xc5\xe3\xed\x77\x5b\x3d\x1d\xc1\xfe\x27\xea\x8d\x49\xf7\x45\xe9\xab\x42\x07\xef\xa2\xda\x53\x0d\x4e\x40\x3a\x40\x9e\x89\x05\xbb\x80\x41\xbe\x2b\x4f\xa1\x27\xeb\x92\xbd\x26\xe1\x80\xc5\x9e\x16\x3a\x57\xe1\xb0\xe3\x16\x24\x9b\xd2\xf2\xd0\x76\xd3\x31\x72\x30\xd3\x24\x3d\x56\x10\x61\x32\x70\xce\xf9\x21\xca\xa8\x8d\x44\x59\x58\x49\x5c\x61\xa0\x15\x82\x15\x2c\x20\xad\x14\xc5\x14\x94\xa2\x8a\x31\x55\x1d\x63\x60\x1b\x55\x8b\x2e\x08\xc0\xbf\x8b\x7a\x20\xf3\x6c\xb1\x5e\xd4\x80\xbf\x5b\x0c\x22\xbf\xca\xf5\xaf\x99\x03\xef\x1e\xac\x45\x5d\x94\x7b\x90\x88\xb1\xef\x8e\x0c\xe0\x02\xf8\x20\x4f\xc0\x05\x65\x8d\x01\xf2\x7c\x27\x60\x5b\x42\xce\x14\xa6\x98\x2a\x9f\x42\x5b\x40\x2d\x24\xe3\xf3\xa3\x8d\x45\x10\x9e\x5a\xd7\x81\x3c\x9c\x1a\x37\x0e\x76\x0e\xc4\x76\x76\xfe\x11\x6c\xc5\xe7\xd9\x51\x32\x2d\xf8\x0e\x54\x15\xa7\xd2\x59\x23\x8c\xe0\xc7\x0b\x96\xc2\x57\x49\x1c\x7f\x8b\x77\xc7\x3f\xfc\x61\xaf\xec\xdf\x81\x6f\x2f\xf6\x49\x37\x9f\x9f\xa2\xd0\xf2\x66\xfd\x70\xf3\x78\xf3\x74\xf3\x26\x53\x91\x35\x2c\xd4\x21\x47\xa0\x06\xc2\xd1\x68\xd6\x41\x91\xa9\x68\xcf\x2a\x53\x51\x6d\xf3\x14\x87\xd8\x68\xc3\xa9\x73\xa7\xb0\x23\x2e\x4a\xe5\x37\x05\xb6\x6c\xa3\xad\x2a\x9d\x46\x7b\x47\x1b\x2d\x0d\x56\xea\xff\x63\xed\xed\x81\x24\xc7\xf5\xfc\x40\x82\xcc\xcc\xe2\x5b\xed\xea\xb1\xa6\xa7\xa7\xf9\x74\x5a\x2d\x4a\xfd\x66\x9a\x6f\x4f\xab\x80\xd4\xdb\xdd\x88\x90\x76\x05\x69\xef\x03\xf7\x11\x12\x22\xee\x2e\x02\x21\x19\x42\xc4\xc5\x45\xe0\x8c\x8b\x80\x09\x13\x26\x4c\x98\x30\x69\xd2\xa4\x49\x93\x26\x4d\x9a\x69\xa6\x49\x33\xcd\xd4\xab\x24\xea\x82\x60\x66\x55\x56\x4f\xcf\xdb\xdd\x88\xad\x1a\x26\xb3\x2a\xbb\x86\x5f\xc0\x1f\xff\xaf\xdf\xef\x57\x09\xc9\xa4\x3c\xa0\xb2\xb4\x07\x17\x5c\x51\x4e\xf3\xc9\x51\x44\x40\x1b\x5a\x08\x9c\x3b\x70\x45\x9b\x15\x73\xd4\x3c\x91\xbb\x22\x3b\x45\x9c\xe0\x05\x5f\x50\xdc\x62\x03\x2f\xbd\x9a\x2f\xbf\xbb\x52\x12\xbd\x7d\xd8\x36\xe7\x66\xd3\x73\x43\x25\x54\xac\x2a\xf3\x47\x02\x38\x46\x2d\xc2\xa9\x63\x86\x8a\xa8\x3f\x18\x0a\x41\x1c\x16\xb3\xd9\x74\x8f\x34\x3d\x84\x36\xf0\xa6\xb4\x25\x03\x49\x4a\x18\x43\x04\x85\x49\x97\x06\x22\x4c\x39\xe7\x2c\x60\xbb\x9c\x53\xf7\x44\xef\xaa\xcc\x3d\x9f\xd3\xbb\xaf\xd4\x12\x6e\x4f\x31\xa2\xba\xde\x3c\x9f\x53\xc6\x3d\x84\xa9\xe7\xb6\x22\x90\x22\x04\xcf\x66\x9b\x08\x87\x68\xc9\x10\x86\xf9\x63\x02\x1c\x16\xb4\xb4\x90\xcc\x51\x4e\x3a\x73\x15\xc3\x27\x59\x98\x12\xb2\x70\x0a\xb6\x2e\x4d\xc1\x06\x70\xd2\x4f\x09\x17\x95\x60\x81\xea\xb8\xde\xfb\xac\xbf\xe2\xa2\x7e\x5c\xa1\x50\x9f\x9e\x8b\x44\xf7\xef\xff\x0a\xdc\x3f\xdc\x03\x52\x03\x18\x1a\xc0\xd7\x29\x56\xd6\x41\xf2\x3e\xd3\x40\xb8\xc5\x6f\x73\xa1\x3e\x9f\x58\xe4\x86\xbb\xe2\x95\x7c\x56\xff\x22\xd6\xea\xe3\x8a\xb5\x52\x80\xd5\x80\x84\xfe\xe8\x43\xe3\x4f\xa1\x3d\x02\x1e\x9a\xb5\x9d\xc8\x07\x7f\x81\x5a\xc9\xb3\x02\x75\x92\x24\xff\x38\x21\x4f\x6c\x83\x2f\xba\xe8\xbf\xbe\x44\xc2\x9f\x6f\x34\x41\x44\xf2\xff\xad\x71\xe0\x8f\x2b\x2d\xd6\xab\xef\x57\x3a\x8b\x6f\x1f\xa2\x51\xbd\x7b\xe9\x81\x7c\xbb\xda\xd5\x3f\x05\x37\x49\xb6\xbb\x8f\x6f\x9f\x45\xed\xbf\x7c\xfe\xf4\xee\xfb\xc8\xe0\xfb\xe1\xed\x2b\x03\x0b\xda\xc0\x02\x5c\x5e\x33\x6b\x1a\x8b\x4c\x6b\xd2\x01\x16\xac\x80\x41\x56\xcb\x2e\x2b\xc2\x74\x9a\x93\x92\x6a\x0e\x6c\x9e\xcb\xb2\x30\xcb\x17\x48\x8c\x51\x93\x15\x8c\x29\x87\x68\x9e\x1b\xe2\x15\x3d\x71\x56\x39\x43\xcc\xb8\xa3\x5a\x6b\x1e\x74\x5c\x56\xec\x75\xef\xa9\x80\x82\xc2\xf8\x1a\x0e\x5a\x85\x3e\x0c\x47\x0e\x4a\xc0\x81\x2d\x8b\x12\xc2\x49\x29\xa5\xf6\x72\xf9\x3a\xe9\x8a\x48\x8a\x38\x2a\xa1\x44\x9e\x61\x5a\xfb\x18\xcf\x50\xd0\x8a\xf8\x8c\xfe\x38\xf6\xf5\x54\x3b\xf5\x87\xf3\x96\x3f\xfc\x83\xe4\x2d\x3f\x5e\xf3\x96\x95\x2b\xca\x63\xc3\x31\x09\x39\x97\x02\x70\xe0\x95\x91\x08\x50\x90\x3c\x25\x82\x90\xa0\x96\x25\x46\x62\xbc\x72\x5f\x09\x42\xb2\x9c\xb1\xb2\x2a\x71\x09\xb5\x95\x46\x5b\xab\xf5\x49\x5a\xbd\x53\x08\x96\xc6\x1b\x8c\x39\x66\x44\xef\x0d\xa7\xba\x9a\x82\x16\xbd\x7c\x7e\x09\x76\x6e\x28\xcd\xbf\xca\x5a\x1e\xc3\xbe\x89\x44\x7e\x51\xa3\xc8\x2d\x6b\x55\x06\xe3\x9a\xfb\xe7\x09\x4a\x3e\xc7\xac\xf7\x2d\xc2\xf2\x86\x03\xf4\xca\xa6\xf7\x07\x81\x96\x59\xe3\xf2\x22\x95\x8f\x3c\x42\x2c\x55\x21\x6c\xc5\x4a\x51\x21\x58\x04\x87\xa1\x81\x48\x9c\xab\x14\xc1\x40\x36\xe5\xe3\xb4\x29\x1f\xb9\xe2\x5a\x68\xd0\x91\xd2\x97\x18\x1c\x48\x65\x21\xce\x20\x84\x30\x58\xc4\xf1\x41\x15\x2a\x87\x9c\x10\xc6\x08\x49\x3d\xb2\x08\x59\x8c\x03\xa1\x12\x2f\xe1\x02\x43\x9c\x41\x42\x09\x23\xc9\x1f\xc5\x3c\x74\xb5\x33\x37\xd8\x95\xbf\xb9\x74\xe6\xff\xe7\x9f\x73\xbf\x46\xec\xce\x12\x38\xfe\xe5\x97\x75\x60\xff\x15\x88\xda\x75\xb7\xc4\xaf\xd7\x27\xb7\xbd\xec\xdf\x5c\x40\x24\x0f\x6f\x3f\xdf\x7d\x7a\xff\xf6\xba\x81\x7e\x8d\xdd\x86\x0a\x29\x58\x84\xe1\x50\x1c\x2b\xae\x73\x4d\xdb\x46\xa8\xc2\x78\x61\x39\x80\x22\xd5\xf3\xf2\xf0\xa6\x08\x53\x99\x4c\x5f\x86\x3a\xf0\xb2\x84\x69\x5b\x78\x2a\x99\xa0\x3b\x43\x15\x53\x82\x51\x84\x04\xd2\x28\x87\x25\xcc\x71\xa5\x08\xa6\xb0\xd4\xa5\x9e\xdb\x50\x2e\x6e\x89\x05\x5d\x5a\xcf\x7d\xc0\xa0\x60\x8c\x9d\x18\x63\x01\x6a\x8a\x6c\x0e\xe8\x31\x2f\x5d\x5d\xb4\x5d\xde\x0f\x8b\x1f\x82\x22\xc6\x9f\x26\xff\xe8\x62\x2b\xfe\xfd\x65\x64\x2f\xf6\xe8\x52\xe6\x8d\xbc\x50\xcf\xef\xdf\xdd\x3c\xc6\x37\xef\xee\x3e\x5e\xb9\x7f\x3f\x5e\xda\xbf\x97\xf7\xef\x2f\xec\xbf\xef\xdf\xbe\xbb\x98\x0b\x03\x1a\xa7\x0d\x6e\x6c\x98\xc0\x08\x6a\x2f\x34\xf6\x3a\x9c\x24\xa9\x14\xc4\xc1\x93\x4a\x56\xc4\x5a\xb8\x87\x16\x96\x20\x09\xd3\xe2\x13\x82\x64\x36\xbe\x2c\xa4\x07\x7a\x5a\xbe\x76\x74\xd6\x9e\x53\x43\xf9\xd1\xcc\x64\x20\xd8\x10\x72\x44\x84\x11\x46\x31\xe5\x84\xd3\xc0\xa0\x52\x15\x65\x46\x69\xad\x8d\xd1\xa9\x2f\x4b\x59\x3b\xa5\x8e\x5a\x9f\xcc\xca\x49\x2f\x22\x27\x99\xbe\x70\x7a\xfd\xa7\x6f\xf3\x79\xbd\xd0\x05\x46\xbd\xea\xdb\x66\xf1\x9b\xa0\xe6\xf3\x5f\x81\x9b\x9c\xe2\x97\x8b\xe2\x96\xdc\xdb\x93\x1d\x47\x7b\xb2\xfb\xac\xf6\x73\xe7\xfb\x34\x09\xc9\x31\xeb\x03\xa1\x95\xa0\x82\x49\xa5\x18\xe7\xca\x40\x02\x29\x46\x28\x26\x1b\xab\x31\xcf\xdb\x23\x39\xf6\xd0\x37\xa4\x75\xa1\xde\x95\x8b\x5b\x65\x97\x38\xbe\x0d\xcd\x38\x02\x7e\xd4\xc2\x70\x85\xb9\x10\x84\x44\xa9\xaa\xce\x15\xae\x64\x0c\x37\xd2\xf0\x01\xc1\x86\x69\xda\x22\x83\x0d\x96\x49\xf2\x47\x09\x7b\x62\xf1\x3a\xff\x24\x79\x73\xc9\x37\x5c\x47\xfb\xff\xf9\x75\x1e\xe5\xcd\xea\xa7\x7c\x7c\x7b\x49\x9c\xac\x26\xfc\x56\xe4\x74\x7b\x71\xf6\x97\xb1\xfe\xee\xb2\x65\x31\xfd\x7d\xa3\xa8\x94\xf2\xaa\x00\xca\xcd\xd6\x01\x5b\x94\x35\xa3\x7c\x39\xc7\x12\xab\xd2\xb0\xce\xb1\xb4\xa2\x4c\x10\x3e\xb7\x9a\x31\xc1\x33\x44\xcf\x98\x5a\x29\x27\x21\x0e\x42\xec\x83\xcc\x74\xe8\x99\xa6\xb4\x5c\xe2\x57\x4d\x59\x38\x59\x0b\x72\x8c\xc2\x54\x11\x41\x11\x1c\xcb\x02\x12\xa4\x30\x26\x1d\x15\x42\x72\x4c\x2d\xe3\xe2\x14\xf6\x5a\x83\x2a\xec\x97\xc8\xa9\x9d\x4f\xd6\x8e\x2b\xcf\xf3\x85\xbf\x6d\x93\xef\xc8\x33\x86\xf2\xd3\xe2\x6f\x5e\x59\xc4\xaf\xd6\xf6\x06\x41\xb8\x56\x06\xd6\xb7\x57\x52\xa1\x88\x65\xfb\xf4\x00\x3e\x7e\x79\xf8\x41\x67\xea\xec\x9c\x52\x27\x69\xd5\x4c\x01\x75\x91\xb2\xc8\x5a\x08\x5d\xe8\xd6\x05\x59\x03\x1b\x3a\x07\x2b\xbb\xec\x41\x35\x92\xd0\x56\x3b\x12\x88\x3a\x2c\x5f\xa1\xe2\xdc\x18\x23\xb9\x31\xee\x70\x70\xeb\xbb\x40\xfa\xc8\x73\xf4\xab\x04\x3f\xc9\xc8\x97\xf7\xdd\xab\x3c\xd1\xbf\x4b\xfe\xc7\xaf\xf0\x75\x57\x78\xdd\xe7\x2f\xab\x05\x7a\xad\x94\xb8\xbe\x7e\x7c\x9d\x06\x5b\x23\xb3\x54\xe2\x02\x30\x0d\xab\xc3\x99\x1f\xa8\x06\xba\x84\x65\x5b\xc1\xd0\x1f\xd2\xe3\x5c\xf8\x48\x95\xb3\x6c\x05\x43\xba\x62\xc0\x53\xa4\x11\x0d\xc8\x42\xa2\x91\xcd\xf9\xe8\x59\x63\x30\xd1\x74\x67\x18\xb3\x9c\x59\xdb\x58\x42\x02\x63\x3c\xd8\xd9\x03\xa5\x83\xd7\xe1\xc0\x05\x95\x9c\x08\x8d\xb4\x28\xc2\x04\x0b\xa8\x90\x5f\x22\x01\x84\x06\x4b\xea\x55\xf3\x8e\x66\x68\x67\x2e\xd9\xd5\x3f\x88\xd8\xff\x72\xb7\xe6\x45\x1e\xee\x3f\x7e\xbe\x7b\x5e\x4e\x5e\xb0\xae\xef\x57\x5d\x45\xd6\x94\x10\xa0\x80\xc1\x21\xc0\x34\xcf\xa5\x86\xb4\xe4\x10\xe7\x10\x22\x5e\x16\xc5\x7c\x72\x65\x19\xdb\xcd\x70\xa8\x64\x59\x4a\x08\x04\x2e\x79\x89\x60\x29\x8b\x9d\x81\x8c\xcc\xad\xd6\x3a\xe4\xfb\xc2\xe6\xb2\xa8\x4d\x45\x68\xb3\xc1\x7c\xd4\x7a\xd2\xfa\x3c\xc1\xa7\xa4\xc1\xc3\x50\x37\x65\xe7\x9b\xbe\x38\xd8\x75\x5d\xec\x9f\xd0\x5d\x93\xf1\x3f\x70\x1d\xdf\x5c\x17\xb7\x0f\x6b\x28\x07\x7e\x16\x25\x64\x83\x2b\x60\xea\x1f\xc9\xb6\xf9\x3d\xdf\xb2\x57\xcb\x22\xa9\x4c\x85\xc5\x99\xa4\x55\x50\x9b\xea\x71\xbf\xa9\x1e\x2b\x43\xb9\xe2\xe9\x89\x54\x0e\xa2\x28\x94\x82\x33\x0e\x2b\x18\x34\xe6\x64\xd2\x85\xce\xa1\x58\x16\x45\x8a\xd3\xce\x63\x47\x48\xa8\x88\x26\x82\x70\xca\x97\x29\xc5\x38\x12\xfc\xf2\x3c\x36\xc9\x8e\x44\x46\xd5\xab\xa7\x18\xe7\xc9\xe2\xf4\x3f\xb7\xb8\x7e\x5a\x6b\x28\x3f\x46\xd4\xe2\xc7\xb7\x1f\xef\xdf\xbf\x7d\x06\x3e\xaf\x79\xe5\x57\xd3\xea\x92\x22\x69\x32\x32\xef\xcb\x2a\x35\xca\x91\x48\x15\x8b\x65\x5e\x4c\x61\x42\xa0\x38\x9d\xdc\xf1\x28\x8a\x52\x12\x54\x16\x73\x87\x09\x37\x54\xdb\xc5\x1e\x58\x11\x0e\x4a\x85\x93\xd6\x3b\x12\x0a\x82\xcf\x75\x18\x4b\x57\x90\x12\x55\x15\x45\x0e\x76\x40\x2b\x15\x6c\x5d\x54\x15\x92\xc6\xa7\x92\x62\xad\x5d\x4c\x24\x1c\xcf\x89\xb5\xf6\xca\x0d\x41\x37\x65\xe4\x31\xff\x57\xc9\xbf\x7d\x41\x03\xbd\x79\xd1\xb4\x8d\xf3\x7d\xb9\x92\x6f\x21\xb1\xee\x1f\x3e\x7f\x7a\xd8\x7e\x7a\xff\xfd\x5d\xf6\xf0\x29\x2e\xfe\xef\x77\x77\x51\x16\xfe\xd3\xf6\xf3\x97\xf7\x97\xb2\xc4\xdd\x4f\x1f\xe4\xa9\x42\x9a\x21\x2d\x88\x91\x87\x30\x4d\xba\x6d\xa9\xc6\xb8\x24\x14\x46\x05\x8d\x11\x24\x79\x18\xd2\x9c\xe5\xc7\x14\x09\x4a\x64\xd5\x81\xb1\xc2\xf3\x48\x0b\x1e\x0b\x82\x0c\x1b\xc4\xb6\x8e\x51\xa6\xb4\x32\xac\xd6\x76\x2e\xa5\x6d\x25\x2f\x5c\x4e\xbc\x95\xe9\x44\xa8\xb5\x94\x04\xce\x30\xd6\x13\x06\x90\x55\xba\xc6\x32\x24\x22\x54\x42\x52\x29\x9e\x35\x3d\xe5\xce\x24\x7f\x71\x79\x92\x64\x7d\x8e\x57\x44\xe3\xbb\x55\x3a\xf6\xc3\xfd\xfb\xd7\x5d\xfd\x37\xe9\xc7\x07\xb0\x2c\x66\xd9\x37\xd2\x39\x1e\x50\x58\xfa\xa2\x04\x3e\x4c\x8e\x58\x8c\x94\xa6\x47\xa6\x28\x82\x94\xc1\x13\xa1\x54\x30\x42\x39\xc5\x3c\x1c\xd3\x4e\x1b\xca\x8a\x55\xd7\x24\xd4\x5c\x49\x2f\x6c\x2a\x19\xd7\x44\x6c\x3b\x21\x11\xa3\xb6\x96\x94\x61\xaf\x64\x48\x82\x91\x3c\x32\x67\x48\xd0\x10\x6c\xb9\xc4\x48\x55\xa8\x0d\xa3\x77\x8d\x79\x4a\x6c\xd0\x36\x74\x7c\xb4\x46\xf6\xc2\x71\xa3\xd7\x3a\xc7\x06\x47\x2c\xfe\xe2\x91\x5e\x11\xc8\xef\x76\x77\x91\xf9\x71\x65\xce\x7a\x78\x26\xc8\xfe\xfc\xe5\xee\x03\xcc\x1e\x3e\xbc\xdf\x2d\xd7\xf5\xb3\x86\x98\x77\x57\xf5\x08\x4d\x7d\x5f\x94\xe0\xd4\x70\x66\x2b\x38\xef\x11\x96\x4e\x0c\xa0\x28\x8b\x11\x01\xa6\x41\x2d\x0e\xa8\x00\x65\x98\x52\xc8\x45\x6c\x12\x40\xf3\xde\xed\x81\x0b\x4a\x35\xcd\x4e\x19\x54\x52\x6c\xb5\x61\x84\x84\x11\x24\xa8\x52\xc2\x58\x84\x0b\x17\x72\xcb\xc3\xde\x84\x76\xf6\x8c\x15\x26\x27\xa0\x9f\x75\x96\x1f\x42\x2b\xcd\x45\x7b\x16\x47\x9e\xa5\x7f\xd0\xfc\xa3\xad\xfd\xe0\xda\x76\x1f\x2c\x60\xe7\x11\xd0\x60\x86\x1a\xe0\x61\xf9\x5d\x84\x4d\xaf\x3b\x2a\xd4\x9e\xf4\xa0\xf5\x96\x39\xbf\xed\xbb\xae\xeb\x4c\xaf\xdd\x0c\xd3\x83\xd3\x7d\xdf\xcf\x49\xdf\xf7\xa1\x6c\xdb\x36\x34\x52\x33\x4b\x24\xd6\x36\x4a\xe6\x46\x9e\x1a\xb6\x61\x3b\x9d\xfc\x4d\xf2\x3f\xdf\xe0\x1e\xa3\x13\x78\xff\xf0\x29\x16\x89\x3f\x7d\xbc\x04\x38\x1f\xd7\xf4\xfb\xee\x6d\xfc\x45\xec\x8a\xb9\x7e\x7e\xa3\x7e\xfd\x3b\xb0\x84\x94\x6f\x3f\x7e\xea\x80\x30\x40\x51\x1a\x1c\xc8\xf7\x86\x1b\xc3\xcc\x18\x4e\xe6\x29\xc9\x47\x23\x4a\x22\x79\xae\x99\x19\x41\x12\x3c\x90\x71\xd1\xaa\xc1\x61\xbf\xdf\xef\x0a\x29\x27\x33\x05\xc8\x01\x1a\xc6\xc7\x03\xa0\x61\x00\xb5\x8c\x4c\xcd\x28\x08\x80\x7b\x2b\x7b\x30\x81\x7c\x1c\xc3\xc0\xc0\x41\x2b\x23\xa5\x9c\x94\x4a\x56\x5f\x98\x67\x5d\x1c\x57\xb7\x16\xfd\xdf\xc7\x3a\xf2\xc5\x66\x3c\x63\x1c\xd7\xe7\xf1\xfe\xfe\xe2\xe7\xbe\xb9\x6c\xdb\x5f\x60\x4f\x02\xa5\x43\x07\x08\x5d\x55\x8e\xd3\x30\x0c\xc3\x34\x37\x0e\xa9\x1a\xac\x7e\x41\x0a\xab\x42\x17\x90\x61\x68\x4a\x14\x6a\x43\x98\xe1\x80\x61\x07\x77\x02\xf6\x91\x59\xc7\xd6\xcb\xb7\x23\xe9\x9e\xcb\xa9\xad\xeb\xb0\x5f\xb7\x3d\x97\x95\xe2\xc5\x2a\xef\x5b\x1d\x6b\xda\x35\x4d\x57\xc4\x06\xf7\x3c\x21\x4f\x64\x83\x77\x3e\xf9\xcb\x67\x56\xf9\x55\xe7\xe2\x45\xad\xfa\xe3\xd7\x1a\x4c\x7f\x05\xa2\x03\xfc\x0c\xde\xbc\xc9\x43\xbe\x59\x8d\xc2\xa7\xed\xe5\x11\x81\xaf\x21\xfc\x6d\x55\xc6\x66\xaf\x9c\x90\x70\x02\x25\xe7\x05\x84\x08\x42\x6b\xad\x05\x45\xec\x09\x1a\x94\x91\xa0\x29\x21\x5b\x56\xe2\xa7\x04\x58\xa5\x54\x30\xcb\xc7\x36\xc8\xb8\xdb\x79\xca\x8d\xdc\xab\xbd\x98\x05\x63\x85\xce\x09\x3d\x9d\xc2\x31\xa3\x42\xc9\xfd\x3c\x05\xc9\x40\x03\x0e\xe9\x81\xa0\xd0\xc8\xd0\x4b\xa5\xa4\xdc\x4b\x39\xef\x97\xe5\xbb\xd1\x5a\x5f\x73\xc5\x28\xda\xc1\xb5\x6e\xfb\x35\x32\xf7\x7a\xd5\x2b\x32\xf7\x45\x69\xfe\xc7\xc5\x5c\x7c\x59\xaf\xf2\xfd\xa7\x7f\x93\x7e\x35\xb9\xae\xfb\xcf\x5f\x1e\xee\x7e\xe8\x00\xf5\x80\x70\x1e\x7a\x20\x03\x46\x60\xa0\x46\x09\x21\xeb\x31\x1c\xe0\xde\x86\x93\xec\x40\x82\x9e\x12\x20\x43\x27\x84\x5f\x26\x5b\x1b\xf2\xb8\x9b\xa7\x71\x04\x72\x7c\x4a\x0c\x0e\x0d\xd1\xbb\x52\xca\x83\x3e\x88\x50\x6b\xd5\x88\x0a\x39\x42\x25\xb4\x05\x11\x8d\xd1\x40\x88\x83\x16\x42\x84\x3e\x22\x29\x95\x52\xb3\xe4\x42\x56\xc9\xdd\x25\x1f\x4e\x9f\x15\x73\x2e\x56\xf0\x4d\x2c\x4f\xdf\x5a\x8c\x9f\x21\x71\xa3\xee\xfc\xd7\xfc\x0b\xd7\xbd\xcb\x78\xa8\xb5\xb3\x56\x06\xb7\xf6\xe6\x2b\xe0\x82\x15\xd6\x3a\x1b\xbc\x1f\x47\x20\x86\x79\x1f\x77\x01\x5a\x0b\x4a\xbd\xa3\xb3\x6b\x8d\xb1\x8d\xb5\x4b\x70\x57\xda\xc5\x2b\x34\xa6\x05\x4b\x10\x16\x6a\xad\xf5\x0c\x63\x26\x61\x77\xd1\x01\xff\x0a\x4b\xfc\xad\xf8\xeb\xef\x8b\x25\x56\xbd\x9b\xdc\x30\xb8\xc9\xf5\x28\xc3\x62\x39\xfb\x18\x6d\xdb\xe8\x8f\xd7\xc2\x39\x96\x32\xbd\x44\x53\x20\xd1\x2b\x90\xd8\x38\xe7\x7d\x6f\x07\xdb\x5b\xef\xa2\xf0\x88\xb7\xbd\x1d\xe2\x57\xe8\xfa\xbe\x8f\x39\xfa\x25\x7e\xa0\x37\x9a\xe5\x17\x75\xa2\x37\x97\x3e\x8a\xfb\x08\xc0\x7f\xff\x36\x7b\x15\x4f\xdc\xbf\x0a\x21\xae\xde\xb9\xcc\xea\x30\x81\xe4\x6c\x4f\xe1\x04\x4e\xe2\x28\xc4\x51\x38\x39\xb3\x0c\x86\x7e\x39\x57\x1f\xef\x74\xe7\xc1\x31\x14\xcb\xb6\xa3\x46\x2d\xbf\x52\xcb\x1c\x59\x7b\xc8\x82\x9d\x47\x65\x4f\x27\xab\x00\x13\x61\x14\x49\x1c\x07\x38\x72\x9e\xfd\x93\xe4\xa7\xe4\x5f\x24\xff\x3a\xc1\x91\x95\xe4\xa2\xa0\x7c\x09\xda\x63\xa6\xf2\x05\xee\x7c\x13\xcc\xdf\x26\xfc\xe2\x6a\xff\xdb\x0b\x29\xc1\xbb\x74\xfb\xe1\xb7\x29\xdb\x8f\xec\xd8\x6b\x29\xa9\x5b\x9e\x6d\x5d\x96\x32\xcf\xc7\x5a\xf9\x16\xd4\x4e\xa8\xe5\xb7\xc7\xd0\x56\xa5\x29\xaa\x94\x55\xa5\x2e\xab\x9c\xd7\x27\x06\x72\x90\xf3\x31\x8c\x0c\x10\x80\xf9\x31\x10\x0a\xc6\xac\x3c\x48\x63\xf6\x8e\x53\x4b\x0c\xc8\xcd\xcc\xca\x82\x15\xb9\x75\xaa\xce\xf6\x33\x69\x19\xb6\x48\x1d\x31\x97\x95\xe4\x55\x7c\x9d\xb1\x1c\xa5\x32\xb9\x38\x1a\x6d\x99\x0c\x46\x9a\x67\xbf\x8e\x65\xfb\x9f\xd7\xd3\xdf\x7c\xa3\x9e\x7e\x0b\x11\x7b\x8e\x91\x2e\xf8\x66\x03\x78\x1d\x23\xb8\x92\x9e\x1d\x07\x65\x68\xf6\xaf\x8a\xe9\xcb\xc6\x8c\x94\x42\x1d\x9c\x76\xda\xed\x72\xa5\xac\x59\xeb\xe9\x26\x38\x15\xea\xab\x9a\xfc\x91\x2f\x41\xbd\xa4\xad\x50\x32\xc9\xb3\x21\xf2\x13\xe1\x0b\xf7\xde\x8f\x51\xd3\xfa\x4b\xf2\x57\xaf\xb8\x5f\xbf\xa2\xdf\x03\xeb\xfa\xf1\xa7\xe9\xc7\x4f\x6f\x5e\xb1\x9f\xdf\x48\x80\xab\x30\x3e\xd7\x97\x58\xb1\xf8\x89\x55\x4f\x31\x2a\x67\x08\x22\x91\x78\x8f\xa1\x84\x84\xd0\x52\x97\x24\x74\x3a\x47\x06\x83\x02\x17\xba\x40\x3b\x6c\x1b\xdb\x58\x3f\xdb\x13\xf4\xa5\x05\xdd\xa6\x08\x63\xd3\x2c\x9b\xf5\x3e\x38\x53\x57\x8d\xa9\x6b\xd8\xf8\x1c\xee\x7b\xda\x35\x91\x8f\x2f\xfa\x94\xcb\x1a\x9f\xef\xec\xab\x1c\xf2\x8b\x36\xc9\xea\x3e\x47\x52\xa7\xb7\x5f\x8b\x93\xbc\x79\x7f\x9d\xae\xeb\xf6\xd3\xb7\xd4\x49\x80\x25\x95\x59\xdc\x5f\xb4\x0f\x87\x23\xa5\x47\xaf\x04\xe3\x46\x19\x26\x65\xad\xea\xf6\x70\x68\x9a\xa1\xaf\x10\x60\x4a\x19\x19\x1a\x65\xe4\x4e\x0b\x25\x35\x63\xc4\xba\x30\xd9\xb0\x67\x5a\x59\xcd\x83\x4e\xf5\x6c\x81\x6e\xb4\x75\x20\x37\x8d\xf5\xc6\x59\x4a\x03\x77\xce\x78\xef\x7d\x38\x3c\xe7\x33\x2f\xbc\x77\xfa\x6f\xaf\x6d\x6e\xbf\x35\x72\xb6\x1f\x3e\x67\x93\xf3\x80\xd6\xd6\xba\x33\xf7\x0e\x54\x57\xea\xe2\xb8\xf1\xda\x4a\xeb\x27\xa9\xc2\x89\x8c\x5b\x7b\x3c\x4e\x53\x7d\xae\xeb\x3a\x13\x5d\x37\x9f\xba\xf9\xd8\x07\x25\x9d\xa9\x95\x50\x46\x3b\x76\xe1\x0b\x65\x3b\x95\xfc\x2a\xf9\x3e\xf9\xef\x23\x63\xf4\xab\x6e\xa7\xf5\x7e\x7e\x77\x81\xc3\x3f\x77\xb4\x5d\xa0\x86\x5f\x3e\xbf\x79\xd6\xf4\xfe\x21\x6d\x10\x04\xfc\xcc\x41\x03\x2b\x6f\x2b\xec\x61\xc5\x3a\x50\x14\xa5\x74\xb4\x2e\x01\xd5\x44\x70\xe5\x6c\x4b\x5b\xc5\x3d\x47\xfb\xbc\xe0\x94\x63\x5c\x89\x9d\x92\xda\x5a\xc1\x82\xab\x6a\xff\xb8\x4f\x0f\x04\x7b\x80\x02\xaf\x2a\x05\x4a\xd0\x40\xa3\xaa\x50\x59\xa9\xe5\x30\x29\x27\xf7\x02\x8e\xa0\xaa\x2a\xc6\x25\x23\x8a\x5f\x6a\x61\x59\xbf\xa3\xf1\x9e\x5e\x94\x14\x7f\xb9\xaf\xf8\xb5\xee\x91\xf5\xae\x73\x4d\x33\x9c\xdb\xd6\x83\xaa\xeb\xc0\xe0\x82\x76\x0e\xac\xd6\x5b\x6f\xd5\x7e\xbf\xdf\xdb\x70\x5c\x1c\x84\x70\x04\xc5\x7c\x3a\x7b\x69\x33\x1b\xfa\x2e\x14\x6d\x92\x45\x9d\xc9\xc3\x4e\x27\x7f\x1e\x55\x41\x6e\x46\xe7\xfd\x6b\xf2\xbf\xe7\x91\x19\xcd\x42\x1c\x91\x1f\x3f\xbd\x07\x77\x1f\x3f\x01\x26\xa9\x94\xc4\x62\xea\x43\x0f\x54\x21\x44\x85\x21\x46\x55\x95\x1f\xbc\xea\xc4\x24\xc2\x09\x83\x22\x8c\x1d\x61\xa0\x6e\x9a\x70\x28\xfc\x4e\x3a\x6f\x5b\xea\x44\x28\x4e\x01\x8d\x85\x2b\xdc\x69\xd6\xa0\x9b\x6a\x7d\x00\x49\x9a\x1f\xac\x52\x73\x77\x08\xfe\x74\x4a\x92\x4d\x56\x5f\x78\xa3\x5e\x18\x19\xde\xdd\x45\xb0\xe1\x2f\xa8\x60\x2e\x16\x3a\x79\xfb\x00\x76\xcb\xb8\x4b\x2f\x6c\x5e\x5b\xee\x8a\x03\x48\x04\xa5\x07\xc0\x42\xcb\x74\x55\x95\x08\xa3\xd0\x02\xd6\x51\x2a\x01\x04\xfb\x70\x92\xc0\x2a\xe6\xa8\x0c\xd8\x57\xda\xea\x9d\xa9\xaa\xd0\x35\x0e\x51\x71\x74\x73\x2f\x59\xee\x72\x92\x56\xee\x28\x28\x51\x20\xef\x01\x1d\xe7\x72\x3c\x11\x90\x8c\xa8\x0a\xa7\x03\x3d\x44\x5c\xf8\x78\xe1\x00\x2f\x22\xf2\x63\xcd\x6c\x5c\x99\xf4\xde\xbc\x5b\x95\x48\xdf\xdc\xd8\xa8\x3f\x03\xbb\xdb\x5e\xcb\xaf\x05\xcb\x77\x8d\x61\x16\x85\x3e\xf8\xaa\xd1\x8e\x9b\xfd\x54\x61\xe4\xb5\xd4\x36\x34\x91\xd4\xb6\x77\x65\x09\x9c\x61\x75\x47\xf6\x6d\x33\x91\xd1\x31\x8a\x89\x1c\x97\xe7\x82\xc3\xb8\x83\xfd\x81\x1a\x52\x1a\x0b\x4a\x34\xba\x12\x71\x16\xb4\xf6\xaa\x56\x8c\xf4\x8d\xf4\x04\x52\x6c\xcb\xb0\xe7\x8a\x78\xea\x1c\xf5\x58\x09\xc3\x88\x1a\x91\x93\xba\x4f\xee\x62\x2f\xcb\x18\xf1\xfb\xaf\xd5\x28\x7e\x9e\x75\x7a\xb7\xf2\xa1\x7e\x7e\x45\x88\xfa\x95\x3d\x8e\x2e\xfd\x50\x17\x25\x60\xf3\x18\x3b\x9b\x55\xa1\x4c\x25\xa0\xc7\x55\x39\xbb\x11\xf2\xb5\x31\x9e\xe1\x4a\x42\x84\x71\x29\x4a\x1c\x0e\xba\xa0\x8a\x80\xbc\x52\xe5\x4e\x43\x8a\xe7\x46\x1a\x35\x9f\xc6\xc2\xe6\x0a\xf0\x0d\x62\xa3\x52\x07\xa5\xe6\x42\xbb\xca\x29\x53\xc3\xda\x14\x70\x6c\x71\xdb\xd6\x7d\xbe\xbf\xe0\x73\xf5\x13\xbb\xd4\x21\xff\xd5\x4b\xbd\xe2\x56\xb5\x2a\x32\xa5\x7e\xc5\x6e\x1b\xfb\x73\xde\xee\xee\xde\x7e\x06\xfb\x55\xba\x8a\xd9\x79\xb4\x80\x87\x11\x20\xd0\x97\x75\x4b\x29\xa5\x25\xa6\x28\xf4\x10\x08\x4e\x42\x07\x26\x26\xda\x9d\x6e\x5d\x1b\x86\xa6\x01\xb8\x75\xe7\xd2\x55\x30\xec\x29\x2d\x5d\x09\x8f\xa8\x46\x56\x0a\xeb\xad\x42\xe5\x32\xff\x9b\x27\x9a\xd9\x4b\xdd\x71\xad\x93\x5d\x78\x1e\x5f\x85\xdc\xaf\xf9\x81\x63\x5f\x69\x74\xd4\x52\xc4\x39\x62\x50\x22\x18\xa8\x73\xa0\x8b\x04\x30\x74\x47\x43\xe1\xc6\x50\x9c\xa9\x10\x85\x2f\x98\x0f\x7a\x63\xc2\xd0\x84\xaa\xb9\xe2\x85\x22\x17\xeb\x87\x8b\x0e\xe1\x0a\x0c\x79\xfb\xfd\x8b\x4c\xce\x87\x95\x08\xf0\xd3\xc3\xe7\x98\xbc\xf9\xf0\x1d\x48\x7c\x5e\x18\x7f\x38\xe4\x00\x86\x21\x2f\xbc\x33\xc2\xe8\x51\x83\x92\x85\x16\xa8\xa2\x86\xc8\x8b\x5d\x5e\x2a\x09\x44\xa8\xfd\x5e\x08\x8f\x50\xb3\x97\x4d\x1d\xfa\xde\x80\x12\x48\x2f\xc4\xbe\x71\x38\x4a\x77\x25\xdb\xc4\x3d\xd1\xcc\x45\x9e\xde\xab\x8f\x18\x7b\xcd\xae\xc2\x36\xb7\x8a\x20\xcb\x3e\x73\xae\xf1\xb5\x73\x75\x0d\x70\x13\x60\xdc\xed\xf0\x63\x5e\xcf\x32\xf5\xfd\xb6\x0c\x97\xb4\xc9\x79\x58\x59\xf8\x16\x7f\x27\x72\x01\xba\x6f\x8d\xdd\x5f\xe2\xf2\xfd\xfc\xb7\x91\xf9\x6e\xa6\x1a\xc5\x2c\x44\x32\x27\x59\x52\x28\x87\x54\x69\x2a\x5a\x95\x73\xd2\x43\xba\xba\xa0\x15\xa9\x64\x85\x31\x29\x4d\x81\x43\x6b\xaa\xca\x62\x40\x90\xa9\x76\x1a\xda\xb9\x56\x46\x85\x7c\x2c\x6d\xc1\x81\xdc\x60\x3e\x1a\x73\x34\x66\x2e\x94\x45\x56\x16\xde\x55\x8d\x2d\xe1\xa9\xae\x86\xbe\x19\xf2\xfd\x05\x7b\x22\x9f\x68\xd6\x45\xfc\xc3\xb2\x42\x54\x51\x99\x7a\x9d\x7f\xbb\xbb\xeb\x3a\x11\xd1\x49\xb1\xc3\xfc\xf3\x4b\x76\xe3\xf3\x97\xf7\x0f\xdf\x2f\x66\x7a\x5f\xc3\x6a\xb9\x41\xc8\x74\x7e\x9a\x7c\x40\xa8\xa3\xc7\xa9\x32\x75\x0d\xaa\x3a\x60\x5b\xe4\x35\xa8\x8a\x76\x67\x90\x60\xe7\xa3\x37\x7d\x1f\xa7\xa1\x97\x6d\x56\xa8\xc0\xfa\xbe\x9f\x8f\x42\x4a\x31\x5c\x7c\x1b\xb2\x41\x3b\x76\x79\x6e\x6b\x14\x95\x80\xf7\x97\x3e\xa2\x1b\x93\xfc\x1b\xf0\xfe\xfe\xed\xf2\x14\xff\xd0\x67\xad\x2b\xb8\xe6\xc0\x13\x82\x28\x64\xb0\x72\x2e\x4d\x5c\xc1\x15\x7b\xf5\x2b\x18\x74\x68\x38\x90\xc0\x67\xdd\x7f\x6b\x18\x2f\x5c\x81\x36\x1a\xe0\x30\xd8\x48\x6b\x07\x83\x0c\xdd\x2f\x7f\x9e\xac\xf9\x5a\xb9\x29\xa3\x0e\xe7\x4b\xf4\x77\xc1\x1f\x2e\x66\xea\xfe\xe1\x5a\x7d\xbf\xc8\x30\x7e\x7a\x58\xee\x65\xd4\x1d\x7d\xbf\xfb\x59\xce\xe8\xe4\x8a\x12\xf8\xd1\x4a\x19\x0e\x4e\x95\x7e\xa0\x61\x8f\x58\xa3\xf7\xa0\x84\xbe\x77\x7b\x69\x99\x10\xde\x83\xca\x05\x1a\x77\x3b\x8d\x28\x75\xbe\x26\x33\x3b\x62\x6c\x29\xa5\x80\xa5\x1a\xd9\xc5\xbb\x9f\x07\xef\x9b\xa6\x0f\x74\x09\x57\x70\xf4\xb8\x96\xf5\x99\x5d\x9e\x3b\x4c\x7e\x7a\xce\x48\xde\x08\x8f\xa7\x17\x77\x31\xfa\x06\xf7\x6f\x57\x8b\x6b\x41\xcb\x49\x4d\x59\x6f\x9b\xc6\x8f\x70\x50\x35\xf4\xb5\x03\xc7\xc1\x32\xec\x10\xdd\x16\x6d\x8f\x3a\xeb\x03\xf5\x33\x4a\xc7\x50\x4c\x7a\x04\xce\x5f\x6c\x47\xaf\xb3\x4e\x59\x62\x55\x92\xa4\xa9\x89\x7c\x50\x38\x29\xa3\x9f\x97\xde\x17\x3f\xdc\x92\x92\x3e\xcb\x2f\xc4\x2a\x5f\x9a\x7d\xf7\xe6\x2e\x8b\xae\x56\xfa\x61\x37\x14\x18\xe6\xa5\x81\x46\x99\x62\xee\x26\x33\x02\xc8\x29\x2c\x3d\xa2\x82\x59\x25\xad\x1e\x98\xd0\x3b\x3c\x0f\x81\x84\x7e\x92\x0a\x05\x07\x20\x18\x81\x06\xc7\xf3\x18\x58\x50\x02\x50\xe0\xb3\x3e\xb8\xa6\x6d\xc7\x3c\xd4\x4f\xc9\x53\x12\x26\x02\xdc\xd4\x09\x50\x2c\x81\xd2\x71\x9d\x1b\xe2\x89\xa6\x3a\xfa\x80\x7f\x92\xdc\xc7\xc8\x21\xfa\x31\x2b\x9d\x62\x76\x99\xe5\xdb\xfb\x18\x20\x47\xab\x02\x34\x82\xed\x3c\xf5\x65\x85\x41\x1d\x44\xdc\x1a\xd3\x19\xd3\x75\x3b\xa5\x8c\x73\x92\x87\xc2\x79\xd7\xcc\x42\x9b\x74\x89\x65\xaa\x24\xd9\xa6\x63\xc4\x70\xab\xe4\x8f\x93\xdf\x24\xff\x35\xf9\xbf\x93\xff\xf7\xa6\x83\x21\xda\x87\x57\xdd\x56\x0f\xe9\xfd\xc7\x37\x0f\x57\x55\xdb\x5f\x83\x97\x92\x52\x76\x85\x2e\xbc\xbd\xcd\x89\xad\x24\x8f\x5f\x3e\xbd\x72\xfd\xc1\x97\xfb\x0b\x44\x2f\xd3\x36\x2f\x19\x11\x15\x42\x54\x3a\xa0\x75\x5e\x30\xc2\x11\x42\x44\xda\x90\x67\xb0\xb0\x39\x28\xc2\x29\x2f\x71\x65\xa8\xca\x2b\x58\x14\xb6\x60\x94\x53\xae\x88\x11\xb8\x38\x75\x4b\x64\xde\x63\x5c\x86\x43\xa8\xd1\x30\x0c\x5d\xd7\x75\x03\xa0\x42\xa4\x53\x2c\x90\xec\x54\xc9\x29\x26\x8a\x54\x46\x88\x61\x82\x9c\x52\x2e\x19\x52\x42\x0c\xa1\x07\x09\x40\xf3\x68\xc2\xa9\xf7\xfb\x2a\x34\x53\x7e\xd0\x0a\x1e\x3d\xc8\x9d\xd4\xa6\x03\x02\x50\xad\xa4\x56\xca\xe4\x85\x66\xd8\xc2\x5a\x1b\xad\x94\x3e\xb7\x45\x46\x52\x6c\x6b\xdc\xd8\xa8\x83\x3b\xc4\xde\x48\xfb\xfc\xac\xfe\xe3\xad\xc7\xfe\x33\x11\xbe\x65\xf7\xf0\xfd\xfb\x4b\x0d\xf9\xfd\xc5\x53\x7f\x55\x46\x7e\x11\xe2\xbb\x38\x4d\x5b\x5c\x15\xe0\xf4\xd8\x82\xbe\x28\x83\xcb\xda\x33\xf3\xa9\x99\x4d\xd6\xf8\xb3\x77\x40\x77\x59\x11\x44\x6e\x90\x16\x12\xd3\x5c\xf4\xa2\x53\xb0\x10\x02\x4b\x28\x79\x59\x86\x63\xa8\x09\x70\xa0\x80\x53\x18\x28\x40\x47\x58\xd5\x03\xdf\xaf\x4a\x7c\x18\x7f\x2d\xc5\x97\x73\x49\x14\x27\xa4\xf3\xba\x1d\x0b\xc6\x9c\xcf\x6d\xce\x58\xd9\x72\x2d\x3a\xde\x48\xc3\x6a\x58\x2a\xaa\x71\x92\x24\x7f\x94\x9e\x9e\x54\xc4\xb0\x5d\x7b\x30\xd7\x7e\x90\xff\x29\xaa\xc3\xde\x76\xb4\xbf\xbf\x38\x8b\xff\xfa\xcb\x05\xc0\xf1\x95\xd9\xb9\xff\xe9\xc3\xfb\xb7\x9f\xef\x2e\xa5\xe7\xfb\x5b\x7d\xdd\x4f\xb7\xeb\x55\x16\xa5\x59\xfa\x40\x80\xa9\x18\x52\x24\xc8\x50\xc1\xd3\x3e\x86\x06\x64\x3c\x1e\x81\x9d\x66\x17\x77\x45\xd9\xeb\x9e\x73\x4d\xe4\xe0\xb1\xf0\x28\x77\xb9\x3c\xf6\x2a\xed\x35\x35\x44\x9f\x4f\xae\xa4\x8e\xee\x12\x63\xac\x99\x3b\xeb\x88\xa3\xb9\x2b\x74\x4a\x4d\xf0\x52\xca\xd0\x2d\x2f\x43\x55\xc9\x7c\xe0\x86\x6b\xb5\xb8\x42\x65\xa5\x50\xcd\x08\x03\xbc\x1d\x68\xdf\x56\x70\xdf\xd1\x15\x47\x9e\xad\x3c\x1b\x3a\xb9\x8f\x7e\xd8\x33\xd7\xf4\x9b\xab\x56\xce\x8a\xa1\x8a\x75\x97\xef\x9f\xe9\x24\x2f\x14\xde\x0f\x9f\xbf\x6c\x93\xda\x98\xfd\x84\x89\xaf\x55\x0d\xab\xd0\x06\x53\x0d\x39\x61\xca\x11\x5f\x94\x29\x0f\x7d\x01\xba\x20\x2d\x40\x2c\x8c\x5e\x04\xc3\x81\xa2\xc1\x01\x57\xe4\x3b\x8d\xc2\x51\x17\x95\xe4\xf4\x10\x8e\x84\x33\x52\x5a\x3f\x7b\xc9\xa4\x9f\x2a\x4c\x9c\x55\xee\x29\x51\x5e\x03\x38\xb5\xb6\x3e\x38\x65\x97\xf3\x15\x4f\x24\x72\x1b\xbc\x8d\x2a\x0e\xf1\xc4\x56\x44\xf5\x8d\x22\x7f\xec\xe7\xbe\xf9\x68\xb5\x04\x5b\xea\x21\x02\xdd\x30\x63\x92\xea\x36\x68\x4a\xb0\xc4\x0c\x21\x09\x60\x29\xa8\x00\xbc\x31\x05\x04\xfe\x30\xe7\x24\xed\xba\xe0\x31\xa4\x58\x92\x9d\xae\x28\x89\x78\x16\x05\x34\x21\x54\x32\x5a\x95\xaa\x39\xe7\x0c\x9a\xf1\x48\x2b\xe8\xe6\xa1\xab\x2d\x18\x48\x49\x59\xc4\x7b\x6c\x23\x06\xa1\xde\xa0\x67\x6d\xcb\x7f\xfa\x4a\xdb\xf2\xc5\x04\x5e\x83\xc7\x4d\x59\x95\x19\x3d\x8d\x19\x46\xf3\x61\x4b\x7f\xdf\xc5\x0d\xd7\x67\x58\xd7\xd9\xe1\x0c\x37\xcb\x3a\xe5\x78\xe8\x34\x37\x3c\x10\x4a\x41\xff\x94\x98\x17\x5f\xe4\x10\xb9\x1e\x9f\xed\xed\x0b\x5f\xc4\xbb\x9f\x1d\xec\xfe\x41\x02\x5e\x56\x1e\x41\xa0\xcf\x56\x44\x58\xdf\xb2\xf9\x3a\xb4\x75\xbd\xf8\x6a\x5b\x17\x13\xf5\xbe\x76\xb5\xab\x67\x26\x65\xda\x06\x06\xca\xcb\xb1\x36\xe8\xef\x77\x2c\xb7\x1e\xcb\x9d\x31\xc9\xe0\xf9\x10\xb7\xbc\x0e\xac\xae\x41\x1b\xd8\x2f\x1e\x6b\x97\xd0\x27\x92\xe1\xc8\xc7\x52\x5d\xf4\x9b\xf1\xf5\x79\x2f\x1e\xf2\xd7\x74\x5e\xcb\xca\xfb\x1b\xb0\x84\x69\x91\x53\xe9\xda\xcc\x04\xae\x7b\x6d\x8b\x12\x40\x4c\x3a\x4a\x30\x87\xa2\xaa\x94\x15\xb9\x70\xb2\xe2\xe3\x88\x51\x47\x11\x16\x62\x52\xa1\x59\x5e\x77\x66\x79\xf2\x5a\x3c\x52\xc6\x4b\x5b\x20\xc0\x22\x2d\x41\x37\xa0\x11\x98\x54\x57\xe2\xd0\x72\xa1\xc9\x2a\xd2\xd2\x47\x91\x96\x4d\xec\xc7\xa2\x3b\x73\xc3\x24\xfc\x22\xe2\xf6\x70\x23\x2d\xfe\xf3\xf6\xa2\xe8\xd6\xaf\x44\x50\x97\xec\x59\xcc\x07\x03\x68\xcb\x22\x55\xc1\x97\x10\x9c\xe6\x3d\x1f\xca\xa8\x2c\x9e\x84\xe3\x34\x4d\x13\x28\x66\xed\xab\x4a\xb5\x26\x1c\x01\x85\x65\x87\x88\xf6\xa0\x8e\x55\x98\x9d\x41\x15\xb2\x92\xfb\x81\x90\x8a\x71\xeb\x8c\x33\xce\xd2\x74\xc0\x48\xee\x01\xf2\x5c\x72\x2a\xfc\x59\x39\x17\x8e\x71\x4b\x92\x4d\xe4\x0c\x75\x3b\xf4\x9c\xeb\x4b\x62\x84\xf3\x7d\x5c\x27\x77\x77\xb1\x93\xe6\xea\xdf\xdc\xe6\x22\x37\x2e\xad\x6b\x88\x4b\x97\x57\xa5\xd7\x84\x54\x93\xe8\x4a\xfb\x0c\x62\x5b\xb6\x1d\x7a\x34\xc1\x12\x54\x57\x7b\x84\xe8\xb2\xc0\xb3\xce\x3a\xc0\x32\xd4\xcf\xc7\x61\x9e\x86\xa8\xa5\x54\x47\xce\x47\x91\xfc\x94\xfc\xc7\xc8\xdd\xf6\xdc\xaa\x74\xcd\xf7\x7e\x78\xfb\xfd\xbf\x01\x6f\xd7\xf2\x75\x7a\xf7\xe1\xaf\xc1\xa7\x87\xdf\x66\xbf\x03\x6f\xd3\xbb\x58\x00\xb9\x6d\xf4\x5d\x9e\xfe\xa7\x5b\xa0\xc6\x43\xfc\xdf\x2d\xb1\xe3\xf7\xaf\xd9\xdb\xb6\x7d\x51\xf1\x42\x53\x8e\x4a\x4e\x04\x16\x5c\x09\x5e\x69\xc7\x68\x93\x5b\x8e\x11\xe0\x61\xa2\xf3\x90\xe6\xf6\x08\xca\xa7\xa4\x02\x48\x2a\xca\x4b\xce\xab\xa2\x0c\xad\x38\x1e\x60\xc5\x8d\xc0\x54\x11\x42\x51\xf0\x29\xd7\x8a\x54\x41\xa6\x58\x20\xa5\x94\x94\xa6\xe5\xb5\x92\x6a\x27\x18\x15\x90\x28\x4a\x0a\x26\x99\x12\x18\x2b\x74\x40\x9a\x90\x2e\x4c\x5c\x22\xbb\x1f\x01\x33\x61\xb2\x01\xb7\x41\xf4\xb9\xcb\x11\x28\x41\xdf\xca\x32\x97\x98\x50\x42\x11\x65\xe2\xd1\x13\xc6\xa5\xd1\xc5\x40\xb8\xd0\x92\x2b\xae\x19\x67\xe4\xc2\x67\xb3\xc6\x55\x9f\x5e\xf3\x88\xdf\x70\xef\x7e\xff\x0d\xf2\xdd\x38\xf0\xd6\xef\x4c\x5c\x3d\x4e\x17\x14\x98\x02\x87\xd8\x48\x69\x5c\x6b\x58\xb0\xae\x24\xd8\xe9\x6a\xe8\xa8\x64\x62\x72\xa1\x05\x63\x2c\x88\xab\xed\xc1\x7b\x5f\xdb\xda\xb5\x96\x2a\xa3\x68\x31\x31\x7f\x4c\x1b\x23\x42\x82\x89\xd1\x94\x81\x4e\x61\xdb\x82\xc2\xd5\xb6\x5e\xfc\x8d\xe9\xc9\x46\x2c\xef\x1f\xc7\x6c\x0c\xbc\xea\x19\x45\xdc\xf8\x12\xe0\x2e\xee\xe1\xbb\x98\x26\x02\x0f\xdf\xbd\x79\x97\x46\xa2\x8f\xf8\xf3\xb6\xac\x0b\x38\x9d\xf8\x69\xdf\x4f\x0c\x10\x9c\x26\x21\x39\xb0\xb2\x2e\x69\x60\x69\xed\x58\x23\x35\x60\x8f\x12\x40\x0e\x6b\xc8\x76\x1a\xa1\x2a\xf4\xb5\x6f\x97\x78\xa3\xf7\x00\x85\xc1\xcb\xe9\x88\x40\x32\xcd\x0c\x08\xc0\x71\x70\xe1\x58\x67\x70\xf9\x5d\x7e\x58\xf3\x44\x3c\xf2\x4d\xad\x3d\x56\x0f\xc9\xbf\x5c\xfb\xc7\x9f\x7b\x92\x62\x36\x62\x5d\xdc\xd3\x75\x36\x7c\x7c\xfb\x79\xc5\x5c\x5f\xee\x69\x36\x66\xf2\xec\x7d\x4a\xe6\x3e\x6e\xa3\x70\x7d\x81\x18\x2a\x2c\x14\xde\x30\x67\xe7\xc2\x81\x3c\x9c\xac\xae\x86\x86\xee\xd0\x9c\x83\xa1\x0e\x55\x1b\x4a\x2d\x68\x68\x60\xc9\x46\xfc\x94\x28\x2a\xd2\xd3\x11\x75\x07\x1b\x0c\x42\x86\x63\xb6\x6a\xef\x1e\x9e\xe8\x9d\x7d\xd6\x4b\xfe\x3e\x29\xaf\x78\xf0\xd7\xaa\xc9\xb7\x3d\xba\x1f\xff\x30\x15\xf3\xee\xd7\xe0\x6d\x3c\xf1\x17\xe4\xd3\xa5\x28\xb5\x32\x31\x6f\x71\x55\x82\xe9\xb1\x01\x03\x0a\xcd\xe2\xb9\x98\xae\x03\x35\x18\x03\xb2\x7d\x3f\xd3\xa3\x03\x65\xbc\x9e\xc3\x01\xc0\x00\x2b\xa1\x89\x92\x42\x7a\x19\x8c\xc5\x98\x1f\xaa\xb6\x26\x8c\xf0\x7d\xbf\x84\x12\x7d\x7f\x4c\xfd\xca\x57\xb0\xb3\x88\x58\x4b\xc2\x14\x93\xe0\xcb\x4b\x68\x08\x21\x44\x49\x25\xb5\xe4\x8c\x70\x81\x08\x36\x0e\x08\x0c\xf1\x40\x35\xa9\xd8\x50\x15\x8a\x18\x2d\x95\x94\x52\xee\x65\xd4\x05\xea\x23\x16\xd1\x5c\x72\xb4\x24\xf9\x9b\xe4\x3f\x27\xff\xf5\x9a\x3f\x59\xaf\x75\xf1\x54\x56\xb6\xb0\x0b\xcf\xf4\xfd\xc7\xcf\xcf\x64\xe5\xcf\x89\xe7\x2b\xb1\xc5\xaa\x5e\xf8\x6b\xf0\x25\x96\x91\x6e\x3f\x4b\xef\xfe\x1d\x58\x3e\xf9\xfc\xe5\xc3\x6e\x5b\xb8\x02\x5a\x0d\x4e\x41\xb6\x20\xe7\xe1\xd4\xb9\x3e\x4c\x1c\x54\x4d\x50\xe0\xb8\x78\xad\x42\x08\x71\xc4\x50\x15\x52\x43\xc1\x28\x83\x8a\x18\xa4\x10\x84\x85\xa6\x8c\xe0\x22\x53\xd7\x0f\x39\x63\x50\x51\x43\x04\x43\x8a\x52\x5a\xc2\xa2\xdc\x19\x48\xe8\xb9\xf7\x6e\x92\xcd\x72\x73\x11\x18\x4f\xde\xf9\xc1\xf9\x8c\xc0\x60\xf6\xf3\x38\x0a\x53\x57\xb4\x2a\xa5\x9f\x60\xae\x3b\x80\xaa\x53\x97\xe7\x94\x56\xc7\xda\x41\xc4\xbe\xfe\x30\x1c\xeb\xc2\x2d\x9f\x15\x05\xaa\x92\x67\x3d\x73\x95\xfc\x3a\xf9\xb3\x04\xc5\x1a\xc8\xd7\xca\x03\x37\x55\xd7\x65\x38\xfc\x78\xfd\x39\x02\x74\xbe\x7c\x7a\xbf\x8a\x9f\xdf\xfa\xb9\xf7\x17\x7a\xf1\xcc\x00\xe3\xa3\x42\xdc\xf8\x38\x81\x36\x18\x70\x6a\x5c\xd7\x1d\xe6\x6e\xdf\xcc\x5d\xed\xfa\xbe\x2d\x0f\xe1\x88\x86\xba\xdc\xa8\xd0\x40\xcc\xaa\xc2\x95\xa2\xf6\x7c\x40\xc1\x51\x50\x55\xe1\xb0\x3d\x9a\xf5\x2b\x70\xad\x57\xd9\x3f\xa5\x6c\x5d\x29\x8a\x2d\xec\x83\xb2\xe1\x04\x4b\x62\x70\xcf\xa9\x04\x30\x28\x6e\x09\x80\x49\x9e\x76\x11\xeb\xfc\x1a\x57\xf5\x6f\x2f\x9a\x5a\x97\x2a\xe7\x37\x70\x55\x2f\xfd\xff\xe0\x02\xf8\x7b\xfb\xda\x83\xbf\xbf\x01\x5b\x19\x5c\x82\x36\x74\x00\x9d\x4d\xe1\x6d\x0d\xf6\x65\xd5\x79\xe7\xbd\x07\x95\x77\xfe\x29\x71\x8a\x0b\xd5\x41\x8a\x60\x6e\x4a\xaa\x6b\x1e\x4e\x75\xe5\x0c\x75\xfb\x88\xb5\x1a\x43\x19\xaa\x50\xaf\xaa\xbd\x3d\x23\xa1\x8c\xe8\xe7\x7a\xbf\x7c\x05\xf9\x94\x60\xa9\x0c\x6d\x60\x51\x49\x54\x53\xca\x96\xb9\x45\x23\xf2\xaa\x1d\xec\x45\xd3\x86\xdc\xd9\xd4\x5f\x94\xa7\xaf\x39\xb3\x1f\x3e\x3e\xdc\x3d\xac\x0c\x2d\xbf\xfd\xf2\x2e\x12\xb4\xc4\xb8\x4d\x6e\xcb\x79\x48\xed\xac\xfd\x04\x7a\x14\x54\x80\xc1\x19\x75\xa0\xa0\xb0\x16\x37\xdd\xdc\xfb\xec\x78\x2e\x52\x1f\x9c\xd0\x2a\xb7\x5c\x6a\xee\xf8\x44\x84\x2c\x01\xd6\x66\xb1\xd7\xa7\xc8\x99\xad\x9e\x71\x41\x7f\xf1\x82\x0b\x4a\xbf\xea\xf8\x03\xf7\xef\xef\x2f\x14\x83\x97\xf1\xf4\xdd\xf6\xee\xa7\xbb\x9c\x05\x31\x37\x08\x4c\xa0\xf1\x5c\x59\x1d\x1a\x41\x2c\x16\x83\x22\x8e\x88\x94\xd4\xed\x53\xc2\x81\xb0\x81\x83\x61\xb1\x2c\xb4\x07\x50\x4c\x3b\xe5\x79\xe9\x1c\x0a\x53\xcf\x0e\xad\xa9\x69\x6d\x0b\xdf\xd3\xae\x39\xb7\xf3\x90\xc2\x70\xf4\xbe\x07\xd8\x0d\x83\x0b\xbd\x6f\xa3\x66\xce\x26\x63\x4f\xfa\xce\x46\xcd\xac\xb7\xb1\xbe\xfd\xb3\x71\x7d\xcb\xbd\x08\xbe\x62\x45\xcb\x0e\x80\xd5\x40\x06\x0f\xba\xc7\x23\xe8\x42\xdb\x58\xed\xb4\x4f\x2b\xaf\x85\x71\xf3\x08\xe4\x0a\x84\xe9\x1f\x07\xb0\x0f\x7e\xdb\xf4\xbd\xdf\x7b\xbf\x0f\x92\x1e\xb4\x74\xb5\xb4\xa6\x96\xa1\x8e\x54\x6a\x4f\x89\xf7\x91\x54\x30\xcb\x8a\x27\x11\xf9\x3f\xff\x3a\xf9\x1f\xd6\x99\xf6\x4a\xd9\x37\x9e\xc9\xf2\xf6\x95\xac\xd3\xa5\xdb\xf5\xaa\x71\xfd\xd2\xfc\xf5\x70\x5b\xa5\xc8\x2c\xe0\x55\xe9\x8b\x0a\xf4\x01\xc2\x2a\x15\x1d\xf3\xaa\x15\xa1\xc5\x3c\x25\x39\x53\x84\x96\x8c\x16\x65\x1e\x3a\x3c\x8e\xa4\x29\x49\x15\x86\xd0\x4b\x4a\x45\xad\xf6\xa0\x42\x30\x0c\x8e\x22\x5b\xd1\x74\xef\x10\xb1\x74\x8b\x7c\x57\xd6\xde\x4a\x61\x1b\x6f\xc7\x93\x96\xa1\x6d\x0a\x5f\x10\x1f\x48\x55\xe2\x86\x0c\xa4\x22\x2a\xcd\x29\x31\x75\x63\xb9\x02\x1d\x93\x44\x70\x82\x0c\xa7\x57\x1c\x31\xb9\xf3\xe9\xf1\xeb\xb1\xf9\x3b\x70\xf7\x00\x3f\x5c\x03\xb2\x1f\xb6\x97\xb1\xc9\xb7\x6c\x6e\x53\x33\x9b\x0e\x94\x60\x09\x51\xcf\xba\x56\xbd\x04\x14\x37\x05\xe4\x20\x99\x6b\xbf\x29\x1f\xa7\xf4\x18\x94\xb2\xbc\xa8\x5b\xcd\x9d\x99\x4a\x4a\x78\x05\xa8\x35\xd7\xe3\x65\xf9\xdf\x72\xbc\x77\xbf\x78\x3c\xdb\x3e\x1f\x4f\x4d\x97\xc3\x65\x79\x90\xca\xca\xa2\xee\x0c\x77\x76\x39\x9c\x2c\x01\xb3\xf6\x6a\x37\xed\x0e\x3d\x63\x67\x12\xf0\xf6\xa1\xb8\x7b\x6e\xef\xfd\x7c\xff\xf0\x4a\x74\xf3\xb2\x06\x6f\x8a\x4c\x13\xdc\x13\x51\x39\xcc\xcb\x6a\xae\xbc\x73\x59\x1f\x95\x61\xe7\x16\x4c\xa1\x74\xc3\xb0\xc1\xdd\x5c\xf6\xbe\xac\x4b\xe6\xd3\x6a\x3e\x06\xc5\x41\x0d\x4e\xe9\x31\xe4\x40\xee\x67\x1f\x0a\x7b\x58\x63\xf5\x32\x62\x0f\xe1\x5a\x95\x58\xe9\x2f\xdf\x3e\xdc\x2f\xf3\xff\x3d\x8c\x2e\xed\x77\x6f\x9e\x2f\xfa\xfe\x21\xeb\x33\x16\x3a\xa0\x83\x15\x1a\xe4\x78\x0c\xfd\x89\x61\xa6\xbb\xca\x17\x48\x98\xe0\x7c\x0a\xe7\xc3\x0e\xce\x32\x8c\x3e\x88\xbc\xd1\xbe\x71\x1a\x70\xb0\x87\x87\x6e\x5f\x65\xcc\x01\x9d\xa4\x17\xbd\x55\x9d\xe0\x58\xf7\x7f\xf8\x72\xab\x52\x7b\x33\x9a\x57\x4c\xf5\xd7\xd5\xbf\xcf\x5f\x2e\x1d\xb5\xe0\xf3\x97\x87\xb7\x99\x04\x65\x33\x2f\xf3\xab\x06\xc2\x01\xa8\x8c\x76\x00\x06\xa9\x2a\xd0\xfb\xc5\xab\x44\x52\x71\x56\x12\xae\xe6\x63\x5a\x38\x1d\x54\xdb\x31\x29\x65\x4a\x04\x7f\x4a\x32\xea\xed\x68\xbb\x4e\x78\xda\xd4\x56\x43\x6f\x54\x69\x43\x4f\x19\x74\x65\x09\x2a\x2b\x39\xb7\xc6\x60\x06\x1a\x29\xc7\x95\x13\x7a\x89\x69\xc4\x8e\x3c\xf7\x22\x7e\xbc\xc4\x15\x6b\x11\xe9\xdd\xb7\x09\xd4\x7e\xfa\x70\xe5\x0e\xb9\xa2\x54\x37\x42\x2b\x2d\x67\x9c\x79\xd3\x68\x50\x2a\x8d\x08\x14\x15\x0f\xfb\x3a\x1c\x3c\x98\x5c\x0d\x23\x62\xab\x07\xd5\x5c\x5e\xdf\x6d\x2d\x26\x54\x58\xe3\x14\x7b\xf4\x5c\x14\x36\xa7\x87\xa8\xd4\x4b\xb6\x15\x27\xf3\x12\xc3\xcd\xed\xaa\xef\xf9\xab\x0c\x5d\xc6\xd6\x95\xcb\xea\x6f\xe5\x2d\xb8\x7f\x7f\x41\xaf\xdc\x7f\xbc\xbf\x8b\x06\xe1\xcd\xd7\x6d\x16\xd7\x4e\xec\x26\xab\x83\x8e\x6b\x72\x1f\x4d\xdb\x72\x0e\xc6\x4f\x93\x22\x95\x86\x18\xe8\xa3\x56\x84\x08\x7a\x8c\x74\x05\x73\xe5\x08\xb5\x3c\x35\x04\xba\x92\x28\x54\xb8\xa2\xda\xa1\xf3\x54\xdb\xda\xc6\xce\xbd\x34\xb7\x42\x53\x2d\x87\xf9\x94\xe6\x86\x38\xce\xe5\xe3\x64\x6a\xd2\x18\x88\x1a\xcd\x8c\x31\x35\xaa\x6d\x69\x5c\xe5\xcd\xaa\xff\x14\x35\xbc\x77\xec\x46\xff\x69\xad\x51\xfc\xe5\x6b\xff\x3a\xbb\x4c\x98\xe7\xe5\x38\x3e\xa1\x7f\x06\x3e\xde\xfd\xf6\x1a\xab\xbd\x8f\xde\x6b\xb6\xcf\xf8\xb9\xf1\x51\x4f\xb8\x9a\xf7\xd3\xb2\x86\x79\x6b\x41\xe9\x9c\x3d\x0f\x59\x23\x7b\x59\x59\x5e\x85\x7d\x3f\x9c\xc4\x54\x6b\x29\x41\x2e\x55\xcd\x77\x6c\xde\x03\x2a\xc3\x20\xc2\x10\x84\x69\x56\x9c\xb3\x6a\x0d\x2c\x0a\x5f\x28\x8e\x1c\x24\xbc\x35\x94\xaf\x9a\xf0\x19\x79\x22\x77\x32\xe6\x99\x3e\x5e\x62\xf9\xe7\x0e\xf2\x2f\xdf\xad\xf4\x41\x7f\x06\x9e\xa1\xb0\x2f\x2a\xbf\xcf\x28\xd8\x0d\xb2\x45\x99\xee\x55\x4d\x25\x74\x84\x14\xd5\x6c\x19\x57\xde\x58\x04\x9a\x10\x61\xe4\xda\xcd\xd4\x45\x62\x58\x86\x89\xa9\x77\x1a\x52\xfa\x58\x05\x56\xd4\x85\x06\x49\x76\x70\x52\xb5\xa6\x92\x76\xb4\x41\x01\x18\x04\x58\x3c\x68\x67\x47\x4e\x45\x1d\xd7\xbc\x24\xf2\x4b\xeb\x0b\xe7\xf0\xbf\xbc\xe0\x61\x6e\x5a\x1d\xc1\x25\xa0\x8a\xdc\xc7\x91\x87\xf0\x92\xc0\x5b\x97\xea\xad\x22\x10\xe8\xf3\x7e\xb9\x7f\x35\xac\xc0\xb8\xd8\xa5\x12\x95\xa6\x44\x21\x01\x45\xee\x72\x10\x55\x98\x91\x0a\x27\x85\x82\xe7\x80\x55\x4f\xc9\x4e\x0b\x19\xf2\x53\x48\x82\xe6\xc0\x5e\x7c\x99\x69\xea\xb8\x44\x8a\x4d\xca\x39\xe5\x42\xd7\xdb\x01\xe0\x30\xee\x5d\x17\x6b\x3d\x9b\x6c\xe5\x0c\xbb\xe6\x9a\xff\xe2\x56\x3f\xe6\xaa\x14\x92\x5d\xcd\xc8\xd7\x1d\xec\x9f\xbf\x3c\x64\x0e\xd4\x25\xb4\x08\x82\xee\x9c\xd3\x4c\x9c\x6b\x9f\xa2\x79\x6c\x33\xd7\x8c\x4b\x6c\x22\x04\xa3\x25\x61\x34\x54\x60\xef\xcd\x2c\xb7\x13\xc1\x15\xe5\x56\x07\x61\xea\x20\x9d\x12\xa5\x3b\x50\x06\x3d\x84\xbd\x93\x91\xb7\x07\x64\x3a\x3e\x63\xb3\xb2\x0b\xdf\x2f\xb7\xa7\x48\x6f\x2d\xfa\x1f\x81\xc8\x86\xff\x90\x4d\x20\xaf\x73\x70\xa8\x94\x91\xa2\xd2\x9a\x16\x30\xf4\x45\x3f\xaa\xa6\x2b\x9e\x92\x6d\x09\x64\xdf\x9c\x0f\x21\x77\x45\x5d\xf0\x7d\x46\xe6\x69\xee\x27\xdb\xa4\x15\x98\xe2\x58\xba\xfa\x51\x65\xac\x86\x5c\x38\x85\xaf\xcc\x49\x31\x59\x9e\xbd\xff\xf4\x70\xf7\xdd\xbb\xcf\x6f\xb6\xac\x8e\xf0\x3a\x59\x1d\xf4\xa8\x46\x6d\xc2\x49\x80\xc4\x78\x2c\x40\x5e\x20\xed\xaa\x9d\x0a\xc7\xfa\x18\x68\x18\x8c\x71\xd6\x7a\xe3\x94\x3b\x00\xe3\x7d\x38\x74\x63\x14\x10\xda\xa6\xfd\x93\x8f\x3c\x4d\xcb\x7c\x5b\xd5\xd6\x12\xf0\x6e\x95\x09\x4b\xb7\x6b\x98\x9d\x7d\x15\x60\xdf\xad\x61\x76\x52\x13\x50\x00\x2c\xc2\x3e\x4c\xfb\x70\x60\xc0\xf9\xf4\x38\x17\xfb\xd4\x36\xac\x55\x16\xf0\x47\x95\xe6\x31\xee\x6e\x05\xac\x21\xdf\x49\xc4\xc3\xc1\xd5\x0d\xa8\xc2\xa1\x73\xa0\x0c\x8d\x3b\x1f\x80\x5c\x22\x6c\x1b\x8e\x2e\xc3\xd3\x84\x40\x72\x28\x8e\x4b\xa0\x3d\x25\xdb\x34\xea\x3d\xec\xca\xe7\x8e\xa5\xdf\x7d\x8b\xdb\x71\xf5\xd4\xdf\x3c\xdc\xff\x2e\xa2\x91\x23\xd3\xd3\x8f\xf7\x0f\xf7\x77\x58\x70\xc2\x2b\x41\x70\x38\xf8\x30\x42\xe5\x7d\x1d\x2d\x6e\x07\xe0\x0c\x97\x73\x58\xde\xed\xca\xdf\x97\x52\x15\x75\xa1\x00\x9f\xa7\xb4\x0c\x4d\x38\x88\x28\x39\x32\x45\x95\xcf\x36\x36\x92\xb3\x86\x9d\x62\x25\x12\x44\xcd\x2b\xbd\xc3\xab\x27\xf1\x9a\x3f\xed\xa5\x81\xf8\x92\x29\x41\x9b\xc8\x23\x1d\x64\x2c\x54\x4d\xa1\xac\x43\x09\xa6\x95\x3c\x10\xf8\x40\x76\xd8\x4f\x6e\xb2\x93\x0f\x05\x38\xfa\xc9\x4e\x6e\x8a\x63\xcd\x5d\x74\xf0\xfe\x2e\xc7\xe8\xb2\x3e\xc8\x38\x0c\x16\xbb\xdd\x05\xea\x62\x6b\xf8\x35\xa3\x26\xbf\x7d\x8c\x2c\xd6\x07\x5d\x8c\x89\x2f\x9d\x60\x9f\xbf\xbc\xbb\x88\x53\x66\x3f\x6c\xd7\xc1\xf6\xd7\xe0\xd3\xa5\x9b\xe0\x3d\xb8\xfb\xe1\xdd\xe7\xff\xee\xb2\x4e\xf0\xb1\xcc\x1b\x98\x36\x33\x45\x29\x87\xc7\x06\x14\xfa\xd4\x77\xe1\x48\xdb\x83\xe5\xaa\x56\x80\xf0\x1e\x14\x05\x19\x1a\x58\x0a\xec\x30\xdf\x96\x4d\x5f\x84\xc6\x87\x65\x30\x1e\x35\x77\xc2\xd5\xc2\x63\x5b\x2c\xa1\xd0\xe0\x80\x4d\x65\x10\x74\xec\x06\x90\x67\x56\x2a\xae\xa2\x26\x6c\x96\x3c\xad\x5a\x43\xbf\xba\x68\xb5\xde\xa8\x48\xa5\x2b\xe9\xec\x77\x20\x52\x62\x66\x0c\xb4\x15\xae\x49\xb5\xf8\xe4\x59\xd1\x6a\x03\xcc\xa3\x4c\xa5\x0f\x58\x55\x4d\x25\xb7\xb0\xb6\xb8\xee\x3d\xc5\xf3\x10\x84\xf7\x60\x02\xa7\xc0\x03\x47\x60\x00\xab\xde\x46\x3a\x3e\x91\xbb\x76\x47\x2e\xbc\xb6\x57\xff\x6c\x55\x56\x5c\xde\x6c\xf0\x49\x8d\x99\x09\x93\x06\x88\x07\x6f\x40\x31\x77\x29\xcd\xe0\x6c\x42\x6d\x01\x4a\xeb\xb4\x39\x1f\xe6\x76\xdf\x82\x22\x1d\x52\x1b\x8a\x04\x64\xc5\xc5\x1f\x8a\xec\xa1\xab\xe4\xd7\x65\x8b\x69\x95\xe4\xc7\x35\xe1\xb8\x26\x54\xbe\x3c\x64\x1c\x68\x58\x43\x70\x9a\x27\x94\x9a\x59\x90\xd4\xb8\x4e\x08\x1d\xc6\xe0\x64\xd7\x7a\x3d\xf7\x18\x55\xa1\x5d\x9c\xd2\x66\xeb\xa6\x62\xef\x26\x3f\xb9\x53\x47\x98\x01\x49\x67\x84\xf2\xbd\x93\xc6\x4f\x49\xb2\x4b\x5d\xf4\xff\x6e\xfb\x45\xff\xaf\xaf\x38\x4c\xd7\x52\xdd\xc3\xbb\xaf\x56\xd3\x37\xdf\x90\x91\x7e\x56\x91\x8e\xcf\xbf\x88\xf9\xf3\x87\x0f\x1f\xbf\x7f\x17\x91\xb0\xe9\x01\x94\x0e\x50\x0f\xa2\x58\x75\xe7\xc2\x84\x37\xf4\xb1\xf3\x6d\x0b\x70\x63\xdb\x43\x28\x4b\xac\x88\xe6\x56\x60\x98\xbb\x92\x53\xe5\x7a\xc3\xeb\x86\xa2\xe0\x7b\xc7\xb5\xe9\x55\x0d\x0e\x45\x9d\x8f\x54\x51\xb2\x4b\x22\x91\x13\xe7\x9c\xdb\x80\x57\x99\xa3\x50\x18\xed\x24\x27\xc6\xb8\x1e\x35\x7a\x74\x58\x31\x63\x0e\x52\x08\x23\x68\x98\xbc\x36\x00\x82\xd2\x10\x42\x29\x89\x39\xb0\x5d\xba\xac\xc9\xdd\xce\xdc\xe4\xc0\xa2\x22\xd0\xab\x65\xe4\xfe\x79\x39\x01\xef\xb6\xd7\x34\xd0\x87\xdb\x34\xd0\xf6\xc3\x6f\x53\x9d\x32\xe2\x11\x4c\xab\xdf\x1f\xc4\x86\x3d\xb6\x3e\x83\xe7\x83\x49\xf1\x3c\x18\x80\xc3\x90\x4a\x1e\xaa\x14\x07\xd6\x00\x24\x43\xdf\xd5\x53\x18\x38\xa8\x86\x40\x52\x1a\x04\x49\x93\x5d\xc2\x10\x21\x96\xce\x42\x83\x96\x85\x83\x90\x81\x2a\x28\xad\x56\xa6\x6e\x83\x01\x6a\x54\x9a\x7b\x2b\x4a\x53\x24\x9b\x44\x67\x30\xd6\xac\xb6\xcf\xbc\xb3\x6b\xf1\x74\x2d\x17\xfe\x35\xf8\xf2\xee\x1f\xa7\x4b\xb4\x07\x7e\x78\xf3\xdc\x22\x97\x75\xb5\xb4\xa2\xde\xd7\xac\x19\x58\x95\xd7\x39\x75\xe1\xf4\x94\xf8\xec\xd4\x2a\x2f\xdb\xc7\xde\x59\x67\x9b\x9d\xae\x7b\xd6\x35\x38\x24\x25\x84\x72\x44\x53\x8d\x29\x4f\xf3\x69\x09\xab\x93\x09\xf2\x30\xb6\x7a\x8c\xb6\xa1\x8d\x3c\x8a\x38\xb9\x4f\x7e\x88\x2a\x14\xcb\x48\x49\xef\xe2\xcd\x59\x97\xa0\xed\xe7\x2f\x0f\x3f\xdc\x06\xcd\x57\xb3\x94\x49\x99\x1d\x6d\xdf\x83\x12\x87\x6e\x9a\xc2\x9e\x83\xb2\x6f\x00\xea\xe4\x7c\x50\xa1\x03\x36\x96\x72\xd2\x7c\x3e\xd5\x21\x07\xa7\xa0\xb7\x8d\x53\xe1\xe4\x05\xf2\xc8\x5b\xe2\xb1\x70\x44\xb7\xdd\xec\xfa\xde\x0d\x3e\x74\x80\xfa\x61\xd5\x4c\x60\x4f\x3c\xf2\xe1\x6e\x9f\x99\xc4\x56\x34\xf6\xc7\xfb\xe4\xcd\xbb\x14\xc4\x54\xcc\x97\xcf\x5f\xde\xa5\x77\xbb\x87\x7f\xfe\xd3\x85\x7b\x29\x8b\x4a\xce\xab\x8d\xd8\xa8\xba\xb6\xa6\xcd\x6b\x50\x34\x6e\x08\x06\xf1\xa6\x84\xb9\xcf\x09\x7e\x4a\x3a\x55\x77\xec\xd8\x0d\x4e\x1a\xe7\xb3\xa3\x11\x8e\x9b\x9d\xf6\xa3\xec\xbb\xe0\x66\x0a\x74\xda\xe1\x73\x1b\x58\x03\xcb\xaa\x9a\x50\x38\x10\x42\x04\x76\xb2\x36\x7d\xda\xa3\xc0\xc2\x9e\x01\x0e\x92\x70\x0c\x1d\x01\x0c\xe4\x49\x9a\x55\x17\x3d\x8f\x3f\x4f\x50\x8c\xff\xbe\x7b\xf3\x79\x59\x44\xff\x19\x78\xd5\x4d\xf0\xdb\x2f\x69\x76\xcd\x09\xdf\x3f\x64\x1f\x7f\x78\x16\xbb\x09\x10\x62\x87\x3c\xdd\x57\xba\x5c\xbc\x4e\x46\x6b\xd7\x4e\x1a\xc0\x96\xe1\xd0\x37\xb6\x6c\x8f\x14\x8c\x65\x93\x17\xa3\xa6\x96\xaa\x2d\xaa\x83\x0d\x87\x09\x24\x30\xf8\xb0\xd7\x9d\xd2\xe8\x60\x01\x1f\x1a\x3d\xee\x41\x92\xe2\x73\x4b\xa8\xe7\x8c\x6e\x04\x60\x9d\x07\x44\x68\x16\x69\xbd\x12\x10\x6d\xdf\x62\x2b\x7e\x7c\xe9\x29\x8b\x9e\xd5\x8b\x0b\x08\x5e\x75\x94\x7d\xce\xf6\x1e\x56\x7d\xbd\x2c\x6b\x05\x38\x04\x3c\x2d\x36\xb1\xdb\xdb\xe0\x05\x50\x22\x48\xd0\x17\x27\x26\x54\xb3\x83\x50\xab\xe7\xa6\xb2\xc0\xda\x66\x0f\xda\xa0\xc3\xc9\x3d\x77\x95\x69\x73\x78\x8e\x57\xaf\xfd\xc9\x09\xb8\x21\x19\xb9\xd5\x60\xce\x4a\x70\xac\x97\x85\x14\xd4\xf5\x2c\x96\xe3\x17\xc7\xb4\x9e\xc5\xe6\x08\x6c\xd0\x75\xd0\x67\x63\x6d\x66\x80\x3d\x97\x60\x58\xaf\x8d\x5f\xfa\x9e\xaf\xcc\x98\x51\x3b\xe1\xe3\xfd\xc3\xd7\x7e\xc4\xa5\x4f\x76\xbd\xcc\x4d\xe3\x59\x5a\xcf\x90\x28\x00\x6b\x50\x73\x11\x85\x7a\x60\x38\xd5\x27\x2f\xb4\x00\x58\x3f\x25\x80\xe0\x9d\x86\xd3\x62\xe5\x8a\x70\x9c\x99\x88\x94\xd9\xe0\x74\x16\x59\x3d\x57\xe9\xe0\x94\x02\x12\x20\x1f\xd7\x97\x2c\xde\xe3\x95\x0f\xef\x37\x97\x2c\xc4\x73\x56\x69\x9d\x3c\xf7\xaf\x93\x36\x25\x18\xea\x88\xec\x2d\xe7\xa9\x8e\xc2\x50\x58\x6b\xe6\xa9\xca\x3a\x4f\x8d\x53\x9b\x22\x95\xb3\xf7\xa1\xf5\x73\x9b\x32\x0f\x58\xda\x76\x7b\x72\x68\x09\x3e\x74\x34\x6a\x3c\x6e\xd3\x3a\xe6\x94\x74\xf2\x8f\x92\x32\xf9\x2f\xc9\x7f\x4d\xfe\x9f\x78\x0f\x7e\xa9\xed\x25\x8b\x5d\x2f\x6f\x62\x3f\xd0\x73\xb3\xd0\x87\x3f\xd0\xf2\xf2\xf9\x97\x7b\x5e\x94\x21\x04\xe3\xe5\x3f\xe1\xc0\xa8\xcb\x8a\x2c\x3f\x63\x2a\x5c\xc8\xb3\xa2\xf0\x39\x80\x61\x82\x14\x19\x6a\x11\x2c\x0a\x5b\x3a\x41\x09\x53\x4a\xe0\x72\xea\xba\xba\xee\x7b\x4a\xcb\xd0\x07\x83\x95\x1c\x86\xb6\xed\xba\x0e\x10\x29\xd3\x23\x47\x0a\xf3\x9d\x2e\x3b\x4c\x2c\xc5\x92\xc9\xe6\x54\x0a\xfe\xfc\x43\xd8\xa7\xc5\x7c\xb4\xa1\x6c\xdb\x2a\x1c\xc3\xe1\x20\x65\x19\xfc\x41\x4b\xee\x7b\x50\x80\xd6\xe8\x25\x3e\x57\x45\x69\x25\xf3\x45\xe9\x75\xd4\x6a\x3c\xd7\x65\x46\x53\x6a\x6b\xea\xdd\xb2\x76\xb0\x27\x11\xd7\xed\x3f\x4e\x7e\x93\xfc\x6f\xdf\xec\x18\xda\x5e\x5b\x1d\x62\xb3\xc0\xc3\x4f\x37\x1d\x43\xbb\xec\x25\x29\x1c\xc5\x8b\xbe\x75\xa7\x96\x5b\xfa\xf0\xea\x96\x7e\xd9\xbe\xdc\x3d\xac\xcb\x8a\x52\x42\x28\x66\xc2\x83\x03\xa6\xdc\x11\x5d\x42\x46\x09\x9d\x65\x86\x73\x57\x2c\xee\x6b\x5e\x32\x64\xca\xbe\xaa\x8a\x48\xaf\x49\x05\xa5\x4c\x8b\x50\x07\x8e\x94\xda\xef\x63\xdb\x50\x86\x70\x85\x60\x38\xee\xf7\x7d\x7f\x38\x1c\x43\x25\x44\x56\x72\xa2\xb1\xd8\xe9\x52\x30\x4c\x2d\xc7\x9a\xc9\x86\x29\x26\xdb\x03\x64\x8c\x72\x2b\xdd\x11\xc0\xf9\xe8\xc2\x34\xb4\x6d\x65\x02\x5b\x6e\xe2\xc1\x4e\x46\x72\x27\x99\x2f\x8b\xf5\xae\xa9\x73\xcd\x38\x28\x40\xa3\xe3\x3d\x35\x58\x2e\x37\x91\xad\x37\xf1\x9a\xe3\x4b\x92\x72\x19\xed\x6f\x2e\xde\xcf\xca\x76\xfd\xe3\x66\x6d\xfa\x59\xc5\xdc\x17\x67\x43\xa6\x08\x37\xd5\x86\x06\xcd\x1d\xc8\x27\x79\x08\x36\x74\xf3\x91\x03\x75\xaa\x7b\x86\x03\x4a\x6d\x55\xed\xfb\x91\x01\x2f\x0b\x6e\x0d\x47\xc8\x53\xa6\x2a\x5f\x20\x08\x05\x27\x15\xac\xa8\xbc\xda\x32\x7a\xd7\xed\xe4\x9a\x33\xf8\x66\x7d\xf3\x5b\xe5\xcd\x2f\x2f\x0e\x35\x06\xb5\x8f\x26\xa6\x09\x3c\x2d\x03\xa9\xa8\x96\xca\x5a\xd3\xf3\x20\xeb\x9c\x89\xda\x56\x87\x9e\x71\x22\x4f\x75\xb0\x60\x8a\x49\x12\xb1\x6d\xbb\xce\xd5\xce\xbb\xc6\x72\x63\x0c\xeb\x64\x33\xa5\xd6\xa9\xc0\x08\x35\x86\x33\xe0\x19\x34\xfe\xe8\xbc\xab\x93\x3f\x4a\xfd\xd3\xaa\x8b\xf7\xeb\xc8\x54\xfc\xf9\xa2\xaa\xfc\xbf\x26\x2c\x6a\xa5\xde\x96\xe2\x1e\x62\x89\xed\xed\xf6\x99\x70\xe8\x55\xc1\xe1\xe3\x0a\x6a\x8a\x83\xeb\xcb\x45\x20\x1b\x7c\x23\xb9\xf3\xf6\xee\x2f\x3f\xa4\xfb\x93\x07\xa4\x06\x65\x98\x66\x7b\x4a\xc7\xd0\x83\xce\x72\x22\xa4\x2b\x20\x2c\x73\x53\x50\xa9\xe8\xcc\xad\xa5\x0c\x8f\xde\x1f\x96\x90\xc2\x68\x0d\x4e\x8a\x79\x22\xe7\x5c\x63\x6d\x6d\xda\xb0\xd2\x95\xa4\x66\x35\xde\x1e\xad\x75\xce\x1d\x8f\x4a\xa9\xa1\xc7\x4c\x09\x7a\xac\x0a\xa4\x50\xc3\x88\x4c\xd9\x9c\x6b\x58\x1a\x3a\x5a\x3b\x23\x0d\x0e\xb3\x6c\x06\x3a\xb4\x98\x4c\x9e\x37\x5d\xdb\x55\x43\x93\xb7\x5d\x39\xfa\xd8\xdb\xd9\xa5\x32\xda\xc6\x7f\x16\x11\x43\x7f\x93\xfc\x2f\xc9\x7f\x7a\xee\xed\xfc\x4a\x41\x6d\x6d\xac\x5f\xec\xd5\x57\x36\xfc\x4a\x2a\xf4\x70\x7b\x03\x6e\xb1\xc1\x5b\x64\x0b\x98\x26\xaa\x52\xde\x70\x53\x9b\x41\x34\x9a\x73\xac\x94\x80\x61\x8f\x95\x70\x33\x37\xc0\x70\x06\x21\xc4\x10\x1e\xcd\xd1\x01\xf3\x94\x44\x65\xb9\x2c\x37\x5c\x4a\x19\xb0\x44\x58\x52\xe0\x71\x29\x4b\xb4\xd3\x50\x70\x73\xf0\x42\x6a\xb5\xac\xa5\x44\x54\x48\x21\x6c\x3a\xef\xe5\x08\x58\xe8\xe7\x89\xb3\xdc\xe6\x04\xe8\x58\xe4\xed\xd2\x01\x10\x21\xa9\xe4\x8c\x5a\xca\x79\x90\xb0\x37\xd8\x3b\xed\x60\x94\xb1\x4f\x36\xc9\xf8\x64\xee\xf4\x46\x3d\xe7\xbe\x9e\x79\xf1\x96\x57\xf0\xe9\xe1\xed\x85\x2d\xf5\xed\x9d\x98\x61\xaa\x67\x9b\x9e\xfe\x1b\xcf\x8a\xd9\x6d\xa6\xc7\x32\x55\xb3\xdb\x28\x37\xce\xc7\xa3\xdb\x1c\x43\x3d\x8e\xc1\x1c\x67\x77\x3c\xae\x9a\x45\xf6\x89\x6f\x4f\x3b\xf4\xcb\xba\x4b\x59\x93\xc2\xd0\x56\xa0\x41\xc6\x68\x55\x36\xb4\x22\x65\x60\x02\xe0\x60\x77\x68\x6e\xc3\x34\xb7\xe1\x00\x6b\xd8\x01\x93\x32\x50\x2c\x73\xad\x79\x92\xd1\x57\xfd\x74\x83\x3f\x79\x6e\x63\xb9\xbe\xb9\xd6\x4d\x5e\xda\x57\xae\x2f\x3f\x7d\xd8\x58\x52\x39\x56\x35\x08\x03\x18\xf2\x7c\xf1\x25\x72\x94\xea\x99\x63\x98\xd6\xa1\x01\xed\xe3\x11\xf4\x4f\x89\xae\xc5\xd1\x3e\x25\x00\xc3\x22\x1c\x01\x2a\xf2\xa0\x41\x51\xa1\x9d\x52\xd6\x6a\xac\xb8\x13\xdc\xf5\xce\xe0\xd8\xa3\x02\x0a\xaf\x4c\x03\x2a\xc7\xa5\xe3\xc2\xc5\x36\xab\x64\x0b\xf0\x13\xd9\xf5\xa9\xba\xc9\x2c\x26\x37\x98\x9c\x6b\x0e\x37\xf2\x54\xec\x7a\xff\xd8\xf8\x68\x04\x52\x03\xf6\x8f\xcd\xf5\x5d\xa8\x52\x75\x1e\x31\xce\x50\x18\x9a\xa6\x09\xd5\xda\xeb\x9b\xf6\x17\x7f\xf9\xbb\xe4\xb7\x97\x1c\xc5\xda\x7d\xf2\xe9\xfe\x21\x8d\x2c\xe3\x6f\xb2\x8b\x0b\xfd\xee\xb5\x0b\xbd\xb3\xb8\xdb\x0b\x1e\xea\xdc\x38\x69\x45\x8e\x64\x56\x9b\x7e\x38\xf1\x70\xdc\x1f\x97\x30\x02\x8d\x0d\xa8\x6a\x1e\x10\xdd\xe1\x00\xb9\x65\x1c\x98\x30\x1d\xb9\xe6\x07\x40\xcf\xcc\xa9\x30\xb4\x96\xd5\xa2\xe9\x58\xcd\x5c\xc7\xfd\x30\x26\x77\xa9\xb9\x70\x08\xff\x69\xf2\xbb\x88\x0e\x7a\x35\xa3\xbe\x4f\xb6\x4b\x40\x7f\x9d\x56\x2f\x0e\xc0\xf7\xef\xae\x71\x69\x06\x3e\x47\x15\xf3\xb7\x0f\xdb\xaf\x13\xf5\xb7\xe4\xbc\x99\x73\x45\xbe\x18\x94\x30\x09\xa0\x4d\x57\x10\xcc\x10\x2a\x20\x46\xac\x42\x25\x14\x6d\xea\x73\x60\x98\x56\x1d\x0b\x54\x45\x55\x3a\x18\x92\x94\xcc\x7d\x38\x6d\x58\x40\xd4\x08\x06\xa5\x44\xa1\xcc\x44\xe3\x94\xad\xe7\x5e\xdb\x9e\xd5\x3b\x0d\x2b\x64\xd0\x7c\xd8\x1b\x50\x00\x8f\x20\x12\x08\x22\x58\x21\x8e\xe0\x12\xb9\x80\x1c\x96\xa6\xad\x1b\xe5\x40\x9e\x9a\xd0\x0a\x21\x03\x73\x9d\x0b\x4a\xb1\xd2\x43\x0a\x34\x73\xd6\x58\xaf\xc4\xa0\x2c\x4f\xf2\x14\x5f\x72\x9f\xe8\xa2\x5e\xb1\xe2\xc2\xff\xd3\xf3\x0a\x71\x8b\x8d\xbe\x34\x00\xfe\xb8\xbb\xae\x51\x0f\xb7\xf0\x68\xf0\x55\xba\xff\x79\x1f\xad\xd2\x0f\xe9\x08\xf6\x0e\x8c\x75\x1d\x10\x38\xce\xa6\xca\xca\x30\x10\xb1\xef\x79\x1b\x0e\xfb\xc0\x29\xa8\x86\xba\xa3\x38\xf4\xc0\xe3\xe0\xd3\x24\x54\xde\xaf\x84\x3a\x7b\x40\xce\xd3\xf3\xbb\x1e\xa8\xe0\xd2\x04\xf0\xa0\x15\x09\xaa\x42\xf5\x0e\x72\x7e\x70\x7b\x1e\x2c\x77\x56\x60\x62\x19\x53\x95\x2d\x08\x42\x9c\x39\x0e\x34\xdf\x2f\x11\x73\x18\x18\x63\xf3\xc4\x39\x9f\x0d\x51\x18\x55\x6b\x3f\x48\xff\x84\xa3\x7d\xfd\x5b\xaf\xff\xc6\xe2\x5e\x6f\xc0\xdf\xeb\xfa\x33\x0c\x1a\x0f\x1a\xa5\x02\x07\xc3\x3c\x16\x65\xda\x9e\x08\xef\x5b\xe1\x9f\x92\x31\x28\x0a\x60\xe7\x6a\x15\x46\x60\xab\xd0\x80\x21\x70\xce\x63\xd6\x00\x34\xa0\x98\xe9\xf3\xbb\x2a\xc2\x75\x06\x80\x42\x2b\x48\xa8\x61\x65\xe3\xe5\xdb\x03\x0f\x0e\x21\x67\x39\xb9\xb9\xfe\xc6\x09\xa0\xf8\xc1\xc6\xcb\x5f\xae\xfc\x20\x84\x98\x35\x95\x18\xc1\x4b\x7f\xa5\xcf\xd8\xdf\xad\x0f\xf1\xdd\xc3\xa7\x07\x95\xe5\x05\xac\x51\x99\xc9\xd3\xbe\xdf\xd6\xbf\x17\x91\xae\xad\x71\x8f\xca\xfb\x8d\x7b\x54\x69\x8f\x10\x22\xcc\x10\x45\x24\x09\x35\x42\x40\xf4\x17\x2d\x1f\x95\xb6\x91\xcb\xe8\x5f\xbc\xd6\xc3\x7e\xbb\x9a\xc2\x5b\x26\xc7\xd7\x9c\xe4\x2d\xd0\x3e\xd6\x8c\xab\xb0\x07\x74\x3e\x14\x79\x5a\x10\x8d\x48\x29\x2a\x58\x04\x4a\x6a\x36\x54\x7b\x50\x47\xac\xa5\xdd\x41\x21\x14\x53\x54\x55\x70\x64\x85\x28\x20\x31\x42\xe9\x5a\x51\xc5\x96\x38\xd9\x3e\xd1\x3b\x15\x75\xf1\x7f\x97\xfc\xbb\xe4\xff\xb8\xd6\x23\x6e\x53\xd5\xd1\x81\x7d\xd6\x36\xd8\x3e\x6b\x1b\x64\xcf\xfd\xbb\xb7\xff\xfc\x9b\xff\x72\xf4\x25\xcc\x88\x6e\xa8\x80\x96\xb0\xa2\x3a\x4f\x94\xcb\x0e\x60\x03\x1b\x1b\x9c\x7c\x4a\x44\x2b\x3b\xeb\xaa\xbd\x50\x6a\x32\x1e\x56\x59\x65\x06\xaa\x61\x4d\x24\xac\xe6\xd1\x94\xde\x86\x96\x85\x41\x8e\x72\xb4\x75\xb5\xb3\x10\xa3\xb9\x9d\x4a\x5b\x32\x0d\x04\x23\x4a\x3b\x2d\xea\xb0\xf7\x52\x12\xbe\x58\xc0\x19\x71\xac\xf4\x50\x61\x3c\x77\x53\xe9\x4b\xa6\x00\x83\x6e\x71\xf8\x5b\x61\x08\x03\xa8\x15\x6b\x9e\xe0\x70\xe9\x4d\xfc\x96\x16\xe0\xe6\x2b\x2d\xc0\x4f\x0f\x59\xb2\x31\xb5\x83\xad\x0f\x36\x30\x32\x34\x80\xa6\x49\x48\xae\xdb\x0e\xb9\x73\x05\x2d\x0a\x25\x18\x04\x6d\xe0\x46\x85\x13\xc8\x67\x01\xf2\x99\x88\x4b\x5e\x82\xc4\xbc\xa1\x4e\xfe\x24\xf9\xa7\xb1\xff\xf4\x39\xd3\x17\x63\xe6\xf7\xdb\x8f\xf7\xdf\xbf\x89\x1e\x67\xba\xfd\x90\xdc\xaf\xf9\x9a\xf5\x35\x3d\x80\xbc\xf0\x45\x7a\x3a\x9f\x58\xb0\x12\x50\x76\x4a\x4d\x6d\x65\x2f\xc3\x51\x9b\xa0\x78\x9a\x03\xed\x88\x30\x62\x9e\x2c\x51\x5a\x6e\xfd\xa1\x18\xfd\x9c\x07\x62\x81\x4d\x1b\x1d\x68\xf3\x94\xf4\xb6\x9e\x80\x0a\xf5\x64\x01\x06\xfd\x1e\x85\x53\xc7\xba\x01\x85\x63\x4f\xfb\x24\x49\xd3\x63\xec\x75\xd1\xc9\x36\xd6\x13\x62\x47\xc6\xbb\x65\xec\xa7\xe0\x87\x87\x8f\x77\xef\x63\xfd\x3b\x06\xbd\x3f\x7d\xd8\x1d\x59\x50\x73\x8f\xc0\x3e\xa7\x10\x70\x1f\x1a\x03\x5c\x8d\x65\x28\x1b\xe3\x54\xaa\x86\x99\x00\x0d\xf1\x4e\x3b\x03\xeb\xc9\x3a\x17\x64\xe8\x64\xd3\x48\x6e\x80\x4e\x93\xda\xa8\x4b\x9d\xa4\x7d\xd1\x0b\xbd\xe4\x12\xee\xaf\x5d\x1e\xf1\x36\xc4\x42\xde\x5a\xf8\x12\xbe\x84\x3e\x4a\x58\x01\x1f\x4c\x03\x12\x7e\x6c\x4d\x18\x0d\xd0\x24\x28\xd0\x8c\x84\x99\x7a\x07\xa1\x92\x80\x85\xd6\x87\x96\xfa\xc0\x86\x66\x04\x4d\xb0\x47\x09\x2a\x60\x3c\xf0\xad\x52\x6b\xde\x3c\xff\xfb\xe6\x31\x36\xb9\x87\x55\x5b\x03\x1b\x74\x0e\xba\x20\x46\x00\x79\x18\x7b\x17\x5a\x0e\x38\x0f\x06\xd4\xc5\x44\x85\x6a\xbf\xca\x63\xf0\xae\x19\x41\x17\xd4\x53\xe2\x00\x04\xc2\x0b\xb1\xaf\xb5\x39\x5e\xf2\x18\x5d\xac\x61\xfe\xe6\x52\xbf\xb9\xf9\x7e\x7b\xa9\x1a\x2f\x11\x3f\xb8\x7f\x7f\x9f\x95\xb6\x6e\xfd\xe8\x9b\x26\x24\x6d\x46\xce\xd0\x66\x64\xdc\xac\xa8\x96\x0b\x21\x42\x0c\xee\xcf\xd6\x6f\x8a\x95\xa5\x6c\x8d\xeb\xd7\x1e\x4e\x9b\xfc\x2a\xf9\xcd\x85\xb5\xe5\x36\x37\xfe\xc3\xbb\xe7\xde\x91\x88\xcd\xf8\x0a\x79\x9c\x41\x30\x96\x55\x83\x4a\x30\x3c\x76\xa0\x64\x18\x14\x14\xd7\x98\x80\xf2\x51\x02\x88\x48\xa6\xea\xb9\xae\xeb\x54\x44\x1a\xa7\x7a\x3b\x52\x82\xb8\xf0\xd8\xd4\xce\x23\xab\x9c\x33\x62\x3e\x9d\x9d\x10\x99\x0a\x7d\x1b\x8a\x76\xcd\x6f\x34\xb1\xe7\xd0\x24\x7f\x92\xfc\xf3\x2b\x43\xf5\x0b\xdb\x1e\x78\xf7\xfd\xdd\x2a\x2e\xfe\xfe\x59\xd4\xf7\xbb\x17\xd5\x82\x6b\xcf\xf0\x2b\xd9\x02\x88\x20\x18\xfd\x79\xf2\xcb\xe9\x86\xa3\xcd\x01\x5c\x5c\x20\x60\x58\x5d\x62\x86\xb9\x84\x50\xb6\x19\xe9\x4b\xe6\x2a\x57\x54\xf0\xd8\x12\x30\x32\x06\xf1\xf2\xbd\x33\x42\x5f\x94\x0b\x58\x28\xaa\x0a\x9d\x9b\xd0\x9b\x53\xea\x95\xc6\x48\x4b\x54\x49\x90\x93\xf3\xbe\x2a\x90\xc4\x0e\x55\x58\x65\xe3\xbc\xe7\x22\xb7\x39\x4f\xd2\x84\x3f\xd1\x74\xd8\xe9\xe4\x57\xc9\xaf\xe3\x33\xbc\xa0\xfc\x63\x36\xf1\x33\x50\x5e\x31\x8e\xb0\xef\x6d\x41\x2d\xdd\xe9\x30\x32\x66\x08\xfe\x7d\xb3\x6d\x60\x68\x9f\x12\x76\x5c\xec\x42\xfb\xc4\x2e\x76\x78\xcd\xbe\x5f\xec\xf0\x73\x17\xc8\x77\x91\x40\xec\xbb\xd7\x7a\x53\x9b\xc4\x95\x55\x06\x09\x72\xc2\x96\x56\x60\x54\xcc\x98\x1b\x73\x4c\x79\x84\xa1\x5d\x35\x4a\x2d\x92\xe2\x51\x9e\xda\xc2\x17\x00\x66\xc7\xc1\x0b\x80\xc2\xf1\xec\x6d\x76\x0c\xee\x30\xb7\x87\x64\x97\xae\xb5\x74\x93\xfc\x2a\xf9\xd7\xc9\x7f\x88\x6a\x48\xff\xe5\x16\x5d\x05\xbe\xa5\x7e\xf4\xea\x59\x7c\x8a\x8c\x12\x6f\xb7\x37\xb4\x07\xf1\x0f\x7f\x09\xd8\x9a\xb5\xa8\x3c\xcc\xf5\xb1\xac\x52\x07\xea\xc0\xe2\x30\xbe\xd4\xbe\x2a\x6b\xa1\x2f\xaa\xea\x70\x64\x4b\x58\x5d\x83\xf6\xb1\x26\x98\x61\x64\x2a\x64\x67\xe3\x2a\x94\x42\xce\x30\xa9\x24\xaa\xc2\x64\x6d\x64\x6c\x2f\xc3\xb4\x33\x4c\x18\x43\xf1\x53\x62\x83\x92\x5a\x69\x69\x64\x55\x54\x14\xeb\x0a\x62\x99\x75\x2e\xad\xbc\x45\x5c\x09\x55\x09\x1a\x85\x4d\xcc\xb9\xe3\xa2\x74\x25\x13\xa1\xdd\x14\xe1\x50\x07\x12\x71\xb3\x59\x12\x6d\x03\x8d\xb8\xd9\xd7\x25\xb5\x57\x69\x81\x98\x14\xd8\x7e\xb8\x7f\xff\xe9\xe3\xfd\x5d\x35\x27\xe9\x30\xe3\x65\xcb\x54\x48\x10\xf5\x52\xa8\xda\x0c\x2c\xd0\x66\xdf\xd7\xe5\x10\x4e\xd4\xb8\x1d\x75\xde\x3a\xeb\x9d\xd3\x42\x2a\x25\x6a\x5e\x8f\x29\x9d\x3d\xa6\x8e\x53\x9a\x8e\x2e\x13\xc9\x26\xb1\xcb\x78\xd8\x1c\x62\x27\xf3\x9f\x5f\xeb\xef\x97\xee\xae\xaf\x5a\x61\x7e\xfa\xb0\xd2\x20\x3c\xc4\x2c\xfb\xfd\xc3\x8a\xfb\xc8\xab\x32\x1d\xc2\x11\x61\xb0\x3f\x70\x6b\x24\x34\x96\xfc\xde\x83\x43\x85\xc3\x21\xed\x4b\xc8\xc1\x88\xd1\x2c\x09\x18\xcf\xbe\x4e\xab\x79\xbf\x39\x10\xe6\xb4\x74\xf3\xa8\x44\xde\x14\x2c\x2d\x96\x9f\x10\x0a\x48\x29\x19\x4c\x84\x0c\x8e\xcd\x32\x56\x4f\x4f\x36\xe6\x48\xff\x24\x66\x27\x7f\x7c\x89\x8c\x56\xa3\xf2\x9c\x97\xdc\x7e\xf8\x9c\xdd\x44\x74\x77\xa6\x3e\x0f\x35\x98\xa2\x35\xe1\x7d\xad\xea\x3e\x4c\xce\x3e\x25\x62\x6a\xb2\x31\xc8\x34\x79\x94\xe0\x14\xe4\xd6\x07\x77\x38\x01\x2b\x78\xa5\x54\xd8\xdb\xd6\x0e\x56\xb0\x7d\x6d\x7c\xb0\x2e\x28\xe7\x80\xbb\xe8\x30\x2f\xe7\x01\x9a\xd8\xff\x11\x2b\x9f\x8b\x0d\x03\x64\x2b\x7f\xef\xf7\x77\xd5\x69\x0f\x1a\x7f\xf4\x49\x9a\xa8\xb4\x88\x6b\x5a\x11\xd7\xdb\x75\x81\xf9\x31\x82\xf0\xee\x3f\xde\x7f\x01\x1f\xef\x23\x41\xfc\x73\xc1\x64\x2d\x09\x7c\x4a\x71\xbd\xd2\x21\xc2\x20\x43\x81\x65\xdd\x2f\xbf\x29\x7a\x75\x0a\x1d\x32\x03\x87\xb9\x2f\x18\x09\xfd\x5e\xef\x74\xd8\xfb\xc0\x90\x11\xb4\x2e\xd2\x69\xae\x60\x66\x83\xe1\xd6\x78\x19\x7a\x58\x42\x5e\xa3\x70\x22\x98\xf2\x04\x24\x6e\x73\xb8\x53\x31\x97\xf3\xca\xe7\x5b\xdc\x3a\x97\x95\xab\x7e\xaa\xff\x3d\x4a\xfd\x79\xda\x21\xc6\x2c\x8b\xca\x8f\xcb\xdf\xb1\x17\xdd\xd5\xaf\xff\xae\xf2\x97\xbf\xab\xd2\xe6\xbc\xdf\x9e\x8c\x71\xd6\x39\x1b\x35\x33\x37\xc5\x9d\xf9\xf6\xf1\x4c\x86\xd7\xe3\x35\xbf\x2f\xd2\xe6\x3c\x6c\x27\xef\x7d\xe3\x7d\xb3\x8c\x7f\xf5\x54\xc7\x1e\x95\x5f\xbf\xce\x3d\xc7\x8e\x46\x05\x9a\x58\x97\x01\xf6\xbc\xc4\x97\x7c\x53\xa5\x6c\x6e\xfd\xb9\xf1\x3e\xe3\xc9\x36\x65\xb1\xe6\x6d\x9f\x31\x4a\xff\xfb\x62\xcd\x7e\x01\xfa\x17\xe9\x63\x6f\xb8\x63\xb3\x6f\xc1\xfe\x5e\x09\x53\x7d\x79\xd8\x96\x24\x2d\x1e\x69\x9a\x17\x65\xd0\xd9\xe9\x9c\xfb\x38\xe5\xf6\xfe\x4c\x7c\x9f\xe9\x40\xa0\xac\x1a\xa5\xa8\xc4\x47\x39\x31\x5c\x48\x19\x51\x7f\x10\x86\x43\x70\x18\x38\x00\x8b\x7c\x0a\x03\x01\xe8\x04\x4b\x3b\xf0\x76\x78\x4a\x76\xcb\x84\xc4\x28\xf4\x2f\xc0\xbf\x41\x17\x5c\x12\xc9\x09\x19\xb5\xf5\x20\x29\x29\x73\xae\xb0\x05\x65\x68\x94\x5a\xee\x49\x5e\x0b\xcd\x7c\x59\x72\xac\x2a\x7e\xe9\xa3\xf7\xcf\x18\xf4\x75\xde\xfe\x4d\xd4\x3e\xf9\x03\x98\xbf\xaf\x22\xa3\xec\xc3\xfb\xb7\xe0\x42\xb1\xf2\xaa\x57\x65\x8d\xa4\xd3\x13\x38\x78\x70\x0a\x39\xe8\x28\x27\x06\x07\x31\x4f\xf0\x74\x8a\xd8\x56\xb8\x8f\xb4\x37\x35\x80\x33\xb9\xbe\x2b\xd1\x7e\x56\x19\xf2\xc7\x23\xd5\x92\x97\x52\x55\xe7\x11\x50\xce\x34\xe5\xbb\x42\x4a\x2b\xe6\x56\x3b\xac\x69\xe1\x0a\x93\x2e\x46\x50\x29\xb5\xbe\xf4\x4c\x3d\x25\x42\xd8\xbd\x62\x85\x2f\x69\x5f\x71\x2d\x22\x07\xdc\xb2\x56\xc8\x4b\x8d\xe4\x86\xa3\xea\xa5\x03\x35\xb6\x03\xdc\x3f\xbc\x4a\x3e\x46\xce\xb4\x0b\x32\x04\xfc\x22\xce\x3a\x1d\x80\x42\xb0\x86\x30\x25\xa1\xf3\xa0\x54\x08\x05\x43\xac\xc3\x79\x5d\xc8\xd3\xa4\x8f\x35\xc2\xf4\xe4\xc2\x1e\x14\xa3\x9f\xac\xf0\xac\xbe\x45\x37\x6e\xbd\xd4\x48\x30\x37\x0d\xb6\x42\xb3\xf7\xb0\x44\x1e\xf7\x9c\xb0\x41\xa6\x5d\x05\x5d\x0b\x92\xd0\xf5\x7d\xdd\xb4\x01\x75\x5d\x17\x92\x61\x18\x96\x39\x22\x32\x15\xaf\xe7\xd7\x2f\x4f\xea\x3a\xd6\x41\x92\xd6\x75\xda\xce\x2c\x63\xa7\x31\x23\xb3\xd8\x76\x7d\xef\xc3\xe4\x3d\x28\x23\x46\xce\xa7\xe6\x4e\xbd\xe2\xbf\x7a\x61\xbe\x7a\x7e\xb4\x6b\xaf\xc9\xc7\xfb\x87\x7b\xbf\xdb\xcf\x03\x18\x7e\x9f\x80\x71\x1e\xd2\x31\x46\xf1\x24\xf4\x4b\x14\xef\x00\xda\x51\xd7\xcd\x26\x35\x5d\xd7\xcd\xfc\xca\x0d\x09\xc4\xaa\x7d\x6b\xee\x6c\x4a\x6e\xcf\xf1\xb9\xab\x3e\x49\xdb\xf5\x1c\xf1\xe9\x94\xa1\x99\x81\xc6\x7b\x7f\xf2\xfe\x94\x6c\x12\x13\x39\x27\xae\x73\xf1\x5f\x2e\x67\xf7\xcd\xd6\xa8\xcf\x5f\x96\xd7\x9f\x73\x62\x38\x00\x49\x8d\x21\x80\x73\x5e\x3d\x53\x51\x34\x69\x2b\x5d\x6d\xac\xe7\x82\xd1\x12\x33\x1a\xf6\x10\x50\xc5\x43\xb9\x9d\x14\xa2\xdc\xa9\xd8\x1a\xa5\xbd\xe4\x55\x59\x3a\x58\x4e\x94\x95\xbe\x84\x0d\xf2\xc8\x52\x9a\x24\xbf\xca\xda\xe8\x93\xbe\xf0\x0e\xbf\xb0\x3a\x26\x5f\x83\x4d\xb2\x6b\x4a\xf3\x52\x34\xfe\x1a\x26\xbb\x5d\xdc\x7b\x6e\xbd\x9f\xf5\xe5\x8d\xc8\x44\xf0\x8b\x23\xe1\x23\x45\x55\xed\x22\x9b\xdc\x3c\xc4\xdd\x8e\x04\x65\xbc\x0e\xca\xb8\x60\x67\x66\x5c\xe8\x01\x71\x06\x44\x06\x24\xee\xa2\x08\xe8\x1f\xa5\xec\x0f\xe6\xdc\x5f\x69\xbb\x7e\x7a\xf8\x87\xca\xb9\x3b\x50\x38\x20\x22\xfb\xc8\xac\xc3\x31\x4b\x42\x0d\x0e\x56\x50\xa1\x7c\x01\x51\x99\x9b\x82\x18\x45\x67\x64\x2d\xe5\x78\x3f\x8e\x13\x70\x41\x19\x6b\x53\x2c\xa9\xc7\xf2\x5c\x6b\x24\xad\x4e\x0f\x7c\xf1\x68\x1a\xe6\x7f\x39\xeb\x5e\x73\x2a\x52\x36\xe7\x06\xc2\xbf\x4b\xd6\x7d\x03\xe0\x13\xdd\x75\xd9\xe9\xa2\x99\xf0\xe6\xf2\x94\x22\x73\xc9\x4b\xbc\x00\x9a\x4d\xfb\xc8\x5c\x66\xce\x66\x63\xfc\xa3\xf7\x7e\x23\x1f\x7d\x76\x0a\xd8\x76\x01\xcd\x0d\xe7\x29\x0f\xee\x90\x24\x60\x73\x7a\x22\x11\xaf\xb5\x78\xba\x1f\xbf\xbc\xff\x14\xfb\x89\x3e\xbe\x6e\x78\xb9\xe6\xef\x3f\x7c\x79\xbf\x39\xf5\xb0\x1f\xcb\xdc\xc3\x53\x38\x41\x80\x42\x07\x01\xe1\x46\x30\xd9\x4f\x82\x52\x41\xc3\x11\xa3\x26\x1b\xf6\xae\xa9\x8b\x30\xb8\xbd\x1b\xec\xb1\xa5\x54\x77\x56\x55\xc8\xf7\xb6\x4f\x36\x29\x7f\x42\x51\x8b\xfa\x5d\xf2\x67\x91\x09\xee\xa2\x8a\xfd\xdc\x73\xfc\xfc\xbd\xbd\x34\xec\x6e\x3f\xa6\xdb\x0f\xbf\x4d\x62\x9b\xe3\x8f\xe9\x01\x4c\x91\x7f\x0e\x81\x71\x65\xa0\x6b\x03\x4b\xab\x47\xbe\x29\xfc\x6c\x1c\x30\x3e\x9f\x19\x03\x14\xc0\x69\x9a\xf4\x18\x8e\xd9\x24\xad\x72\x75\xed\x94\x95\x4e\xcf\x0d\x18\x42\x95\xca\xd3\x6c\xb1\x2d\x41\x8e\xa5\x33\xcb\x12\x1d\xcf\xab\x8a\xfe\xc9\xbb\xe7\xee\xaa\xbf\xd3\x79\xad\x75\x8a\x54\xa7\x28\xb6\x87\x55\x60\x5f\xa7\x70\x3e\x80\x2e\xd0\x94\xff\x7e\xbf\xd1\x7e\x66\x35\x68\xeb\x62\x16\x2c\xe5\x20\x99\x7a\xd5\x1d\xb2\x41\x39\xe5\xda\xd6\x2d\x3b\x35\xef\x81\x0f\x3c\xc5\xa7\xb9\xc5\xb6\xec\x95\x33\x5e\x5d\x73\x53\x5d\xc4\xf2\xfc\xe9\x0d\xe3\xff\x43\x14\x2d\x5e\x13\x23\xbf\xfd\xf1\xb9\xa3\xac\xce\xca\xf3\x94\xb6\xf3\x04\x4a\xe0\x79\xc0\x61\x5f\x87\x7d\x60\x0a\x68\x00\xe7\x53\xda\x9d\xc7\x0c\xed\x94\x72\xde\x79\xda\xe8\x29\xec\x01\x3c\x18\xc7\x1b\xe7\xaf\x7e\x5c\x5a\xdf\xd5\xb1\x7f\xe4\xed\x6a\x3d\xef\x2e\xf6\xf7\x4d\x4c\x26\x82\xfb\x87\xac\xdd\xd9\xb3\x24\xe9\x09\xd0\xd3\x00\x7a\x1e\x6a\xe0\xc8\xdc\x6f\xf3\x59\xf3\x1d\xf6\x7d\xe0\xde\x83\xc2\xf7\x73\x4c\x0f\x26\x49\x0a\xc8\x32\x5e\xd3\x3a\x5a\x97\x9b\xcc\xfd\xfd\xc3\xae\xab\x1f\x87\xba\xde\xe0\xc7\x21\xad\xcf\x8d\xd6\x19\x9f\x3b\xd0\x2e\x7f\xc3\x9f\xe8\x6e\x4c\xf3\x6f\xfc\xcd\xf8\xf2\x37\xf9\x4c\x84\x48\xfb\x80\x01\x4a\x92\x2c\x51\x69\x19\x75\x54\xff\x38\xf9\x2e\xf2\xda\xbc\xdb\xad\xcd\x90\xc9\xf6\x43\xb2\xbd\xca\xad\xac\x6e\x4b\x36\xd5\x45\x01\x34\x18\x45\xa0\x41\x06\x17\x10\x4b\x25\x20\x1c\xf9\x8a\x87\x6a\xe3\x4d\x67\x0d\x3f\xb3\x9d\x41\x65\x11\x86\xae\xee\x81\x08\x6e\xef\x01\xaa\xa4\x45\x56\x86\xa3\xaf\x8d\x10\x62\xe5\x95\x1d\x9f\xfc\xa6\xd8\x25\xf1\x9e\xfd\x66\xe5\x11\xba\x7f\x81\xd7\xef\xb6\x1f\xae\x71\xd6\x98\xe5\xb3\x3b\x74\x98\x3a\x2f\xeb\x02\x1e\xc3\x40\x3d\x18\x97\x41\x1c\xd0\x2e\x39\xab\xf9\xc8\xb8\x94\xf4\xf0\x94\x50\x42\xb4\x64\x1b\x7f\x9c\x7d\xcc\x8f\x24\xfc\xc9\x6d\x16\x9f\x13\xbe\xd6\xfa\x4f\xef\x16\x8f\xec\xcb\x77\x6f\x2e\x4c\x57\xf1\x40\x0d\xd0\x75\xec\x21\xec\xe6\xa3\x33\x20\x01\x05\x26\xd6\x09\x8f\x42\x1d\x34\xea\x4c\xf0\x60\x08\x76\x2b\x96\x30\xcd\x07\x59\x07\x63\x0b\xe2\x0d\x0d\x53\xe8\x68\xc7\x4a\xdf\x01\x51\x03\x9f\xac\x7c\x8d\x64\x43\xe2\x7c\xb8\xb2\xfd\xfe\xc5\xca\x28\xf9\x7a\x36\x5c\xe7\xc8\xad\x06\xe6\xb2\xfd\x19\x78\xa9\xe2\x39\xa0\x7c\x24\x49\xe3\xa1\x01\xcd\x19\x01\x17\xb3\xa2\xae\xca\xe8\xb9\xf3\x69\x39\x4f\xd7\x8d\xb8\xba\xd5\x7d\x9a\x1b\x29\x94\x8e\xbe\x11\x33\xcc\x2e\x2f\x21\x3f\x9f\xd2\x4a\x84\x91\x87\x3d\x3f\x51\xcf\x14\x97\x4c\x18\xc5\x97\x7b\xb4\x72\x66\xa1\xe4\x77\x71\xe4\x2e\x66\xeb\xf2\xb8\x5f\x45\x69\x51\xb6\x38\xfa\xbf\x5f\x16\x83\xd6\x64\xb9\x1f\x10\x02\x90\x09\xc5\x50\xc7\xa4\x60\x50\x70\xac\x5a\x7d\xd4\xa1\x03\xda\x78\xeb\x9c\x9a\x87\x1d\xb2\xbd\x43\xd8\xb4\x8e\x69\x79\xee\x14\x87\xbe\xe2\x29\x0a\xd3\xa4\x01\x04\xc2\x19\xc5\x15\xd7\xf1\x59\x1d\x9e\xc8\x4e\x65\x65\xf2\x4f\xa2\x27\x16\xfb\xb1\x5f\x25\x71\xd7\xae\x6c\x20\xc1\x08\x1b\x98\x3a\xd5\x4b\x09\xb5\xe6\x05\x9c\x8f\x3e\x20\x05\x4c\x1d\x64\x4a\xa4\x52\x72\xee\xfb\xd2\x97\x58\x81\x2a\xc8\xc1\xfb\x65\x98\xc7\xeb\x14\x9b\x7a\x87\xa2\xbd\x5e\x6f\xff\xf7\xb7\xc4\xe7\x6f\xde\xa7\xd9\x87\xcf\xdf\xbd\xb9\xca\x7e\x6c\xea\xf3\x21\x3d\x06\x9d\x03\x1d\xbb\xd4\x15\xa3\xa8\x98\xaa\xc9\x18\x5d\x8c\x8d\xf3\x3b\xe4\x27\x67\xd4\x4c\xc2\xa9\xf4\xa5\x4b\x8b\x79\x1f\x26\xe9\x41\x93\x96\xe1\x38\x1f\x83\xe0\xa0\x06\xc7\x74\xba\xe8\x80\xf1\x0d\x8d\xf5\xde\x5b\x75\x95\xff\x90\x24\xe0\x02\x4b\xb9\x12\x0f\x7f\x05\x81\x07\x7f\x17\xd2\xe1\x5c\xd0\x9e\x3b\x58\x1d\x21\x72\x18\x1e\xc2\xe9\x70\x38\x1c\x40\x1e\xf5\x2f\x4f\xcb\x57\x4a\x29\xd4\x90\x08\x0a\x0d\xc4\xc1\x1a\xca\xad\x02\x02\x3b\xb8\xa9\xac\x07\x05\x40\x48\x8a\x57\xfc\xc3\x19\xbc\xe1\x1e\xd6\x75\x55\x9b\x6f\x72\x0f\x67\x51\xeb\x7a\xf1\xcd\x56\x1e\x82\xb8\xa2\xde\xf4\x88\x47\x92\xaa\xaf\x44\xa5\xb2\x67\x01\xbb\x5d\x1d\x44\x6a\x0b\x35\x10\x5e\x4a\xc2\x21\xca\x67\xe7\x2b\xd8\x20\x04\xbc\x70\x84\x41\x41\x10\x1a\x68\x65\x20\x9b\x96\x78\x61\x5b\xcd\x64\x6e\xfa\xc2\x17\xb4\x06\x45\x36\x4a\x85\x04\x9d\xf7\xfb\xd2\x96\x1a\x94\xe2\xff\xa7\xed\xed\x81\x24\xc7\xf5\x3c\x31\x82\xcc\xcc\xe2\xbe\xb7\xda\x65\x4d\x4f\xbf\xe6\xdb\xbd\xd5\xa2\x54\xd3\xd3\x5c\x29\x56\x87\x7d\xbd\xdd\x8d\x90\x14\x12\x42\x71\xa1\x83\x2e\xe2\x74\xd8\x0b\x49\x81\x90\x23\x84\x2c\x18\x32\x60\xc2\x84\x09\x13\x26\x4c\x9a\x34\x69\xd2\xa4\x99\x66\x9a\x34\xd3\xa4\x99\x66\xbe\xa9\x24\x4a\x41\x30\xb3\x2a\xab\xa6\x7b\xde\xec\xde\xa9\xa7\x99\x99\x93\x1d\x91\x49\x22\x41\xe0\xff\xf1\xfb\x30\x95\x96\x27\xe9\x16\xcd\x7e\xf9\xc8\xd6\xc5\x06\x27\x55\xe4\x89\x9c\xbd\x4e\xae\xd8\x2d\x4f\xde\x2f\xd7\x92\xc8\xb1\xdc\x1f\xb9\xc2\xaf\xa1\x52\xeb\x2b\x3d\xd1\x9b\x4b\xd4\x70\x10\xdc\xa9\xa9\xcc\x8e\xcd\x16\xf4\x54\x2a\x8a\x1e\x13\xaa\x30\x2a\x09\x41\xc5\x36\xf4\x7c\xd7\x07\x07\x6a\x9f\x19\xa5\x30\x2b\x25\xa6\xa7\x9d\x4f\x6b\xab\x99\xb6\xad\x94\x9e\xd7\x68\xbe\x6b\xa3\xdc\xe1\xda\x57\x08\x63\x2b\x35\x37\x5a\x32\x4a\x6b\x4e\x0b\x5d\x60\xd7\x29\x8d\xb5\x21\xd3\xfe\xb4\x5b\x44\xc5\x53\x7d\xea\xb3\x5d\x83\x99\xe0\x84\x51\x81\x39\xe9\x83\x57\x76\x99\x63\x74\x5d\xbd\xd0\x17\x47\x2f\xf4\x90\x2f\xb9\x5b\x94\x2e\x81\xbf\x90\xbc\x7d\xfe\x85\xec\xad\x06\xdb\x25\x72\xe8\x08\x23\xb6\x2c\x83\x98\xf6\x10\x24\xc7\x18\xa5\xe2\xee\xdc\xd0\x82\x13\xbe\xbc\x2a\xd1\x60\x4f\x43\x46\xfc\xe1\xc0\xd4\x39\x7f\xeb\x01\x7b\xca\xdf\x1c\x9b\x6a\x6d\x30\x41\xa4\xf4\x85\x4a\x05\x0b\x5d\x4c\xe0\xa4\x94\x61\x47\x44\x1e\x0e\x42\xb8\xdd\x92\xc1\x75\xe5\x92\xc1\xad\x9f\x30\x6e\x2f\xb2\xb7\x4f\x57\x26\xe7\x8b\xe6\xd4\xa7\xbb\x17\x99\xf8\x0b\x1c\xf9\x8b\xab\x3f\x1f\x69\x9b\x26\x91\xf8\x15\xdd\xf2\x06\xa5\x7c\xe8\x85\x61\x14\x32\x86\xab\x50\x80\xc3\xd4\xa4\x3c\x22\xda\x09\xe8\x43\xb2\x7b\xea\xda\xed\x62\x0a\x44\xe2\x05\x89\xa0\x64\x38\xba\xd0\x12\xa5\x44\xe1\x0b\x48\xa8\x33\x4e\x3b\x09\x9c\x08\xf5\x7c\x71\xb9\xd6\xe1\x68\x4c\xec\xd5\x91\xf8\x9b\x5d\x2b\x25\xff\x67\xb8\x0e\x03\x8e\x3e\x4d\x42\x12\xc5\x6d\x3b\x21\x7c\xd8\x73\x43\x29\xa4\x0c\x55\x01\x83\xc8\x4f\x9a\x9f\xe3\xaf\x96\x8f\x97\x36\x64\x38\x2c\x05\xd7\x78\x19\x32\x18\x75\xbe\x0c\xcd\x0b\x5f\x54\x78\xb9\x0c\x05\x8c\x0c\xde\x18\x13\x92\xf3\x65\x24\x9b\x94\x3e\xe2\x1b\x73\xe5\x23\x79\x1f\x2b\xe2\x2f\x72\x8c\x45\xd3\x7e\xbd\x70\xa8\x9f\xb1\xd7\xf3\xc5\xcd\xf7\x63\x72\x25\x53\x73\xf3\xe1\x87\x2f\x73\xe0\x32\xc7\x16\x35\xc0\x3e\x72\x4f\xcb\x07\x0d\x92\xd0\x83\x3d\xc0\x61\x1b\x8e\x7d\x0f\x58\x67\xb7\x7b\x3f\x8d\x55\x95\xa2\x30\x4c\x5a\xa5\xec\x18\x20\xa2\xc8\x56\xc4\x29\x50\xb9\x70\xac\x37\x89\x52\x4a\x39\x15\x18\x88\x35\x01\x11\x1d\x64\x82\x0c\xdb\x16\x23\x1b\x64\x6d\x2d\xa8\x10\x61\x94\x62\xa6\x7d\xd7\x83\xe8\x59\x9d\x16\x67\x3c\xc1\x5f\x25\x3f\xc6\x8c\x8e\x9c\x39\xaa\xef\x9e\xe1\x04\x9b\x9b\x45\xe2\xe9\xcc\x86\xff\x95\x60\x02\x70\x03\x2e\x8a\x47\x6e\x4e\x02\x76\x61\xcb\x81\x77\xbb\xbc\xb0\x0c\x11\x84\x31\x93\xb0\xe2\x7d\xda\xe7\xa0\xe5\x56\xef\x58\x80\x06\x94\x0c\xef\xe1\xb4\x4f\xd5\xe4\xc2\xb0\xea\x42\xce\x8d\x14\xa5\x52\x68\x1a\xb3\x06\x08\x15\xda\xc9\x1b\x3f\xf0\x76\xa3\x21\x7f\x86\x11\x94\x25\x13\x08\xb2\x0a\x71\x5e\x5d\x40\x04\x9d\xbf\x80\x08\xea\xf9\x0e\x5b\x40\x04\x92\x9f\x41\x04\x61\x34\x00\x9e\x41\x04\x11\x5b\x46\x63\x3d\xe8\x9f\x89\x2d\xfb\xe1\x19\x5b\x96\xf6\x60\xeb\xd3\x7c\x3a\xce\xb1\x5a\x4a\x42\x89\xa8\x9b\xe3\x68\x3b\xf0\x40\xdb\x92\xcb\xb6\x86\x87\x1d\x13\x4c\x82\xb2\x09\x22\x85\xb1\x0c\x84\xbf\x02\x2e\xdb\xa7\xce\xa9\x40\xe9\x02\x2e\xab\x59\x65\xea\x31\x82\xcb\x9e\x3c\xa4\x7d\x8c\xb7\x16\x3d\x9c\x9f\x9d\xed\xe5\x84\xce\x4c\xc6\xe7\xdf\x04\xdc\xdf\xfe\xf7\xe9\xed\x7d\xd6\x02\x13\xf3\xed\x18\x01\xee\x1e\x0e\xa0\x99\x6f\xe8\x60\xd2\xfd\x34\xfa\x8c\x0a\x8e\x69\x25\x71\x15\x9a\xbe\xf7\x7d\xbf\x1e\xea\xda\x1a\xab\xad\xd5\xd6\x3c\xd8\xa0\xb2\x7a\x82\x8b\x7c\x65\x8a\xc3\x01\x14\xc9\x2a\x13\xff\xc9\xe7\x54\xcf\xe7\xd4\x06\x16\x89\x2e\xfb\x87\x2d\xe8\xcf\xe7\x34\x4e\x7b\x9f\x31\x2e\x30\xad\x14\xaa\x42\xb3\xdd\xfe\xba\x73\x4a\xc8\x23\xcb\xc4\xa6\x48\xb2\xc8\x59\x3f\xe7\x2a\xd9\xb9\x32\xf1\xb7\x20\x62\xc7\x3f\xde\xde\xef\x52\x36\xb5\x34\x1d\xc2\xe0\xc3\x88\x7d\xe1\x95\x01\x3b\xef\x37\x85\x0f\x3b\xff\x50\xaf\x44\x53\xcc\x49\x92\x00\x39\x70\x13\x8f\xfa\x3e\x6c\xa5\xae\x3f\x17\x7c\xf5\x73\x41\x92\x1e\xa7\x5c\x66\x43\xe0\x75\x50\xa2\x2e\xb6\xba\x4d\x65\x5d\xbf\xf8\xe0\x2a\x8c\x12\x24\xf1\x83\x93\x85\x5b\xfc\x6b\xc7\xf1\xe7\x8d\x9a\xdb\xbf\x03\xb7\x1f\x6f\xb3\x6a\xde\xb5\x86\x50\xcd\x3f\x70\x5a\x3c\xb0\x34\x8f\x20\x46\x9c\x8d\x52\x10\x56\x69\x8c\x27\xeb\x3d\x48\x1e\x13\xe0\xf7\x71\x1c\xb5\x55\xd6\x2a\xab\x27\x7f\x19\xc3\x3a\xe8\xac\x0e\x6a\x11\x27\x4e\x92\x2c\x33\x8f\x36\xf6\x9b\x6e\x22\xfb\xff\xa9\xc6\xfc\x33\xa6\xce\x0e\x98\x1a\xd8\x13\x4f\xdb\x86\x5b\xc0\x1e\xc6\x14\xb9\xc0\x15\xa9\xb1\x5a\x93\x79\xdf\xf0\xbc\x9a\xfa\x80\xbd\x4f\x0b\x70\x0c\x32\x94\x08\x1c\x62\x83\x20\x4b\xfc\xa3\xbf\xd1\xd9\x31\xb9\x49\xfe\x8b\xe5\x3b\x96\x2b\x5f\x3f\xa9\x05\xc7\x6f\xfa\x0c\xf2\xb4\xad\xd3\xe1\x8f\x03\x90\x86\xd5\x4c\x67\xdb\x96\xd9\x34\xf9\x23\x5c\x21\x9b\xe1\xbe\xf7\x78\x77\xa4\x20\xd9\x52\x1c\x8e\xb1\xaa\x96\x24\xab\xc4\x3d\xfa\x4c\x6f\xca\x6b\xec\xdd\xfd\xed\xc7\xdb\x28\xe2\x7c\x0b\x6e\xef\x23\x1b\xe8\xcd\xed\xfd\x6d\xa6\x0f\x6d\xb3\x9d\x30\x90\xbb\x39\x11\x19\x86\x4d\xe9\x82\x9b\xea\xa0\xdc\xc6\x84\x64\xbe\x63\x42\x05\xd8\xc9\x03\x17\xd4\xa2\xbd\xdd\x47\x1e\x90\x8a\xbd\xc0\xbb\x04\x27\xff\x36\x56\xd0\x9f\xac\x34\x2f\x22\xe2\xaf\x11\x8b\xe0\xa2\x22\x1d\x91\x8d\xd1\x78\xee\xf6\xfe\xd3\x47\xb0\x94\xcd\xe7\xff\x4d\xe7\x74\xed\xe6\xdd\xe7\x2f\xeb\x3c\x8c\x40\x3b\x60\xc2\xa0\x77\xb2\xd7\x4e\x75\xa2\x49\x89\x61\x5c\x89\x90\x33\xa4\xe7\xd4\xd4\x5a\xeb\x9c\x3d\x62\x6d\xb8\xdb\xef\x03\xc2\xb8\x2c\x04\x47\xa6\xd8\x16\x61\xcb\x2c\xaa\x64\x91\xaf\xbc\x05\x2c\xb4\x56\x49\xa3\x5d\xd8\x01\x54\x4b\xcd\x52\x4a\x0d\x13\x9c\x73\xc1\x24\x9f\xa0\xb6\xa1\xb7\xf3\xef\xae\x00\xc4\x3b\x40\x6c\xc0\x04\x41\x28\x6a\x90\x97\x74\xd2\xa3\x52\x69\x21\xb8\xe0\x91\xc3\xc5\x63\x1f\x54\x9f\xaf\x7d\xe9\x82\x3e\x41\x0f\x2f\xec\xd8\x85\x77\x1a\xd1\x09\x3f\xac\x6a\x07\xab\xd4\xe6\xb6\x33\x5d\xd1\x1b\x5a\xd2\x69\xa0\x5e\x6e\x8f\x96\x39\x66\x80\x87\xe1\x10\x5a\x0c\xc4\x46\x57\x5a\x3e\xb0\xe0\xca\xba\x94\xa0\xc8\x54\x53\x9b\xc3\xce\xd5\xbc\xf6\x41\x3b\x2b\x6a\x11\xfb\xd2\xc3\x23\xbb\x11\x1b\xf3\xfc\xfd\x37\x77\x45\x16\x6f\x8c\xd5\x13\x1a\xe6\xbb\xf5\xf5\xf7\xe7\x35\x49\x8f\x14\x6f\xed\x0e\x82\x5c\xf1\x12\x4d\x0a\xd7\x7a\x07\xa0\x17\x8e\x3b\xd0\xc3\x30\x04\x87\x81\xd9\x18\x78\x78\x68\x1e\x93\x6d\x59\x97\x6a\xc8\xea\x7e\xa7\x00\x6c\x5e\x9e\x40\x96\xf9\x47\x76\xa3\x37\x2a\xf9\x3e\xf9\xab\xc8\xc4\x7f\xf7\xa7\x2e\xbf\xf7\x24\x15\xb9\xef\x95\x2b\x6a\xc9\x21\x0d\x09\xd3\x6a\x3b\x6a\xea\x88\x06\xa6\x7c\x4c\xc2\x16\x03\xba\x51\x70\xff\xc0\x83\x2d\x9b\xd2\x00\x96\x15\xbd\x35\xc7\xe1\xf5\x77\xd7\x67\x4d\xfe\x57\x3c\x9e\x77\x4f\x3c\xe9\x6f\xf2\x78\x56\x15\xcd\x88\xaa\xeb\x3d\x0a\xc7\x6d\x37\xb2\xbd\xb7\x20\x71\x2c\x70\x16\x0e\x73\x08\x12\xb3\xef\xc0\x17\xff\x86\x6d\x24\xf1\x1c\x3c\xc7\x0e\x39\x8b\x1d\x16\x9e\x98\xa6\x9d\xec\x4b\x12\x4f\x96\xe1\xaf\xf3\x8a\xce\xa0\xc8\x5f\x3a\x9f\x6c\xe0\x99\xd5\x6d\x73\xc4\x61\xbf\xdb\x86\x23\x3b\xb4\x1e\x94\x35\x0f\x95\x08\x03\xe0\x67\x9b\xc9\x80\x7d\xec\x6a\x36\xcb\x09\x39\x81\xfc\x7c\x42\x91\x55\x64\x9a\xd7\xac\xa2\x2c\xee\xe7\x5f\xe7\x39\x9d\x21\xea\xdf\x3e\x9f\xd2\xac\xa8\xdb\xed\x00\xc2\xc1\x47\x7d\xd3\x8e\x81\x6a\x68\x01\xd9\xa9\xa9\xd1\xa1\x06\xed\xc2\xde\x20\x53\x5f\x4f\x43\x5a\x05\x76\x66\x3a\x71\x54\x23\x6f\x49\x8d\xbe\xca\x74\x5a\x47\x9f\xb8\xc3\x46\x45\xdc\xe6\x52\xa5\x4e\xc0\xbb\xf5\xed\x53\x0f\xfe\xe2\xf4\x74\xe1\xc5\x9c\xd1\xeb\xe7\x8c\xf9\x76\xfd\x01\x5e\x37\x61\xa2\x61\x52\x43\x43\x4d\x69\x65\x2a\x24\xc2\xd0\x6a\xae\x34\xc0\x36\x94\x0e\x10\xb7\xe5\xa3\x0e\xa3\xa9\x90\xa2\x88\x87\x6d\x05\xcc\xae\x6d\x01\xea\x42\x19\x9f\xba\x8d\xd2\x28\x1c\xa5\xac\x04\xb5\x52\x1a\x2d\x42\x7f\xda\x32\x96\x61\x20\xb6\x4a\x99\xda\x52\x82\xb9\x04\x49\x61\x1f\x8a\x39\x92\x2c\xfb\xbe\x5f\x30\x2a\xd5\x99\xfb\xb8\x3e\xaf\x79\xff\xdb\x85\xb1\x75\xb5\xee\x3d\xb3\xed\xce\xeb\x5e\x36\x2f\x71\x4b\x95\xf4\x79\xe5\xbb\xfb\x30\xdf\x34\x69\x0c\x89\xaf\xe1\xe0\x59\xcd\x89\x43\x02\x24\xc1\xa4\xa5\x4f\xab\x20\x6b\x50\xaa\xb0\xef\xbc\x0f\x83\xdc\x67\xd0\x0a\xa9\xd4\xc1\x98\xfd\x1c\x27\xf8\xbe\xdf\xed\x7c\xf0\x28\x78\x5b\x80\xbc\x0c\xc7\xb0\x67\xa0\xc7\x75\x09\x71\xc5\x2b\x04\x2b\x59\x6f\xb4\x54\x4c\xc9\x20\xdd\xbc\x06\x3a\x29\xac\x6d\x42\x03\x44\x67\x2c\x4d\x19\x33\x54\xf0\x87\x11\xef\x00\x76\x5a\xbb\xb0\x75\xe1\x08\x72\x93\xd2\x92\x86\x26\x48\xa3\x7a\xd0\x63\x04\x91\x42\x10\x55\xa2\x89\x79\xd9\xcb\x31\xf8\x0f\x5f\x19\x83\x77\xbf\x7a\x0c\x36\x5f\x1d\x84\xad\x24\x16\x0b\x90\x07\x97\x26\x2e\x2d\x83\xf1\x47\x15\x0e\x8d\xab\xc3\x41\xee\xd3\x83\x11\x4a\xe9\xa3\x35\xc3\xbc\x96\xfb\xae\xdb\x6e\x7d\x68\x50\xa8\x6d\x3e\x0f\xc2\x63\x12\x0e\x0c\x74\xa8\x81\x10\x23\x8e\x50\x55\x89\x76\xa3\xa5\xa1\x5a\x06\x75\xde\x08\x84\x75\x4d\xa8\x01\xef\xb4\xa5\xa9\x60\x96\x49\xfe\xb0\x8f\xcb\xbe\x7e\xda\x08\x74\xca\xca\xaa\x0a\x3e\xe8\x38\x0a\x04\x55\x48\xa1\x0a\x55\xa2\x7b\xc2\x2b\x5d\xef\x7f\xbf\x6e\xf7\xfb\xe6\x5c\xf8\xf8\x1b\x70\x33\x0f\xc3\x25\x3d\xfa\xbc\xf2\xa1\x07\xbd\x03\xbb\xe0\xdd\x51\x8f\xce\xd9\x51\x74\x69\x67\xa4\x92\x7a\x72\x8a\x68\xa2\xd2\xc2\xa8\x7e\x3e\x55\xdb\x34\x6d\x6b\xc3\x0e\x85\xad\x29\xc6\x62\x1c\x19\xd0\xc8\xa0\x88\x59\x46\x52\x3f\xed\x7f\xc2\xda\x78\x57\x36\xda\xb0\x94\x5c\xed\x7f\x71\x06\x5c\x5f\xbc\x4a\x59\x49\x83\x0b\xc6\xc8\x2d\xe8\x15\x42\x02\x55\x4c\x34\xc9\x5f\xc4\xbd\xc7\xfd\x5a\x5f\xea\x9b\x0b\x81\xe1\x1b\xbe\xd4\x77\x2f\x7c\xa9\xff\x16\x7c\xc5\x97\xfa\x65\xcb\xea\x62\x83\xf9\xfe\xda\x97\x3a\x23\xe0\x10\x8a\x14\x81\x31\x94\xc4\x0e\x76\x95\xdb\xad\x0b\x7b\x58\x8a\x12\xa6\x16\x16\xa2\x84\x40\x84\x0e\xc0\x93\x85\xdc\x28\xd0\xe5\x79\xe4\x1f\xda\xb6\x6d\x01\xf6\xd6\x85\xa3\x35\x9c\x9b\xb6\xc4\xb2\xb4\x39\xed\x2c\x0b\x3b\x2d\x60\xe3\x88\x39\x9e\xcd\xa9\x55\xcc\x9b\x5d\xd0\x11\xc6\x63\x3d\xe5\x48\xd0\x8a\xf2\x8a\xd3\x30\x6a\x15\xba\x30\x1c\x39\x80\x80\x01\x5b\x16\x10\x56\x3f\x37\xa7\x66\xb0\xc0\x02\x79\x46\xa8\x73\x70\x5e\x9b\x28\x68\x85\x8a\x71\x9a\x7c\xa4\x37\x76\xd5\x25\xef\x63\xdd\xf0\x39\x13\xbb\x22\x1f\x9c\xd7\xc6\xcd\xcd\x87\xf7\x9f\x3e\xfe\x61\xe9\x6b\xcc\x2b\xf9\xdb\x79\xd2\x6d\x6e\x22\x89\xa2\x4a\x51\x0d\xf6\x4a\x0a\x63\x81\x99\x74\x6d\xd2\xbd\x3f\xe5\x4e\x1b\x02\xb0\x85\x80\x9c\x0e\xe9\x7e\xda\x65\xb5\x92\x81\x07\x9c\x1d\x4f\xa4\x84\xd9\xf1\x94\xaf\x92\xae\x13\x84\x2a\xce\x2c\x45\x13\x66\x2c\xcd\x2b\x68\x19\xd2\x56\x29\x44\x54\x48\x4c\x91\x87\xfa\xec\x5b\x60\x1e\xc9\x8d\x59\x75\xc9\x5f\xcd\xe7\xf9\xe6\xee\xcb\xc7\xb3\xd5\xff\xf7\x9b\xff\x06\x7c\xf8\xc3\xe7\xb3\x80\x41\x54\x9c\x7c\x32\x66\xbc\xbb\x36\x62\xfd\x60\x32\x08\xeb\x2a\xa3\xa7\xba\x48\x47\xad\x1d\xdc\xe2\x07\x56\xa7\xb2\x98\x92\xb4\x21\x68\xac\xa0\x27\x75\x30\x73\x24\x5f\xc7\xa6\x91\xed\x70\x76\xd8\x6e\x9d\x9a\x0a\x21\x3c\x44\x29\x3e\x8d\x59\xa3\xc2\x48\x38\xa5\x95\xb4\xca\x8e\xa3\x55\x96\xc6\xfd\xb8\x89\x1a\xe1\x22\xe2\x7e\xde\x3f\xc7\xec\x0b\x4a\xf2\xcc\x45\xfb\x78\xfb\xfd\xbb\x58\x10\x7e\x97\x2e\xc8\xb0\xec\x00\x72\x07\x8e\x21\x2f\x42\xad\x00\x2e\x1e\x93\xd4\x45\x06\x6a\xe5\x8b\xbc\x64\xa8\x30\x25\xae\xbc\x66\xab\x06\x74\x81\xfa\x93\x0d\xb5\x06\x24\x83\x29\x33\x8e\x39\x33\xe9\x53\x83\xf2\x5c\x80\x02\x85\x9d\xa0\x54\x25\x59\x86\xce\xeb\xe4\x5f\x26\x6f\x97\xf3\xf8\xbc\x9c\xc8\x7c\x9f\xbf\x38\x93\xf3\x89\x2c\xe7\xe1\x01\xc9\xe7\x6c\xfa\x50\x1e\x46\x06\x5c\x19\xfa\xb4\x57\xcc\x52\x85\x7c\x51\x31\x5c\x38\x28\x6b\xc3\x56\xed\x16\x24\x73\x60\x50\x4c\x43\x67\x01\xcd\x92\x94\x5e\x4e\xc4\xc1\x52\x80\x1c\x87\x9d\xa5\x62\xc9\xef\xe5\xca\xfd\x12\x47\x26\xd5\x69\x19\x3c\x04\x06\x39\xa3\x44\xe9\x09\x62\x30\x28\x0a\x44\xe4\xc8\x34\xa1\x9f\x86\x70\x2c\x6b\xd8\x00\x91\x4a\x50\x45\x2c\xc2\x23\xbe\xf1\x69\x3d\x5f\xd7\x33\xee\xfc\x52\x2d\x58\xdf\xfc\x00\x5e\x16\x0b\xde\xdf\xb9\x74\x28\x60\x8d\x60\x46\xa6\x44\x28\xc3\x1d\x37\x1d\x28\xc9\x64\x1e\x13\x6b\x3b\x57\x8d\x03\x6d\xb7\x1c\x6c\x41\x32\xc9\x14\x41\x88\x30\x76\x96\x73\xce\x04\xe3\x95\x67\x60\xa7\xd0\x63\x82\x90\xe6\x88\x82\x92\x56\x96\x45\x4f\xa3\xac\x7a\x14\x37\xdb\x7f\x31\xc6\xe3\xfe\xcd\x37\x31\x1e\x99\x05\xa8\xaa\x5c\x09\xd3\x22\x0c\x06\x24\x73\x0a\xde\x62\x69\xa2\x16\xf5\xb0\x55\xbd\xab\x10\xdd\xeb\xe3\xd8\xf8\xad\x66\x96\xda\xbe\x07\xbc\x9f\xc6\xf8\xb4\x76\xd2\x20\xc1\xed\x19\xe1\xd1\xc0\x12\x35\x68\x2b\x08\x1d\x64\xda\x41\x68\x23\xc2\x63\xbb\xad\x9b\x2e\xa0\xbe\xef\xcf\x08\x8f\x45\x1b\x62\xd1\x4b\xfb\x9f\x96\xaa\xee\xb5\x5e\xda\xdb\x5f\x16\x4c\xfb\xf2\x27\x05\xd3\x34\x10\x55\xe9\xcb\x0a\xec\x42\x51\x55\xa9\xee\xb9\x57\xad\x0c\x9e\x8a\x54\xe5\x5c\x12\x56\x32\x56\x94\x79\x68\xf1\x30\xe0\xbc\x5e\x14\xd3\x3a\x49\xa9\xb0\x6a\x0b\x20\xaa\xc2\xee\xac\x98\xb6\xf7\xf8\x5a\x31\x8d\xe7\x5f\x93\x4c\x23\xf5\x59\x32\x8d\x50\x62\x8c\xb3\x42\xbe\x96\x4c\x4b\x56\x19\x8c\xb1\x7c\x99\xdc\x9d\x6b\x70\xf1\x6e\x9d\x23\xc0\x17\x0b\xde\xe7\xa5\xf3\x7e\xf7\xe9\xee\x1f\xbf\xfc\x1d\xd8\xbc\xbd\xfb\x04\x36\x37\x11\xb1\x72\x97\x35\x99\x56\x6a\x6a\x2a\x9c\x6e\xfd\x74\xf4\x18\x4b\xa7\xdc\xb6\x2a\x42\x0d\x74\x1e\x8e\xc0\xe7\x80\x85\x3a\x87\xc0\x86\x3c\xcd\xa7\xe3\xa6\x0c\x8d\x0f\xb5\xe4\x13\x61\x2c\x85\x14\x6b\x37\x38\xa1\x3c\x57\x8a\x6f\x43\xcd\xcc\xee\x94\x00\x36\x9f\x1b\x8d\xf8\xb0\x4b\x7f\xef\x7f\x7f\xe9\x2b\xf5\xf6\xe3\xf9\xf4\xe6\x70\x74\x81\xa7\xdc\xbd\xb9\x70\x2e\x5f\x62\xc5\x3e\x6c\xee\xaf\xc1\x62\x9f\xfe\x71\x81\x89\x5d\x74\x6f\xf8\xe8\x40\xe9\x8e\xc7\xd1\x4f\xb8\xde\x8f\x20\xee\x2f\x3e\x65\x53\x5b\xd3\x91\xb7\x3e\xec\x56\xf9\x74\x2c\x38\x36\x92\x33\xc6\x6a\xe9\x79\x9e\x97\x42\x62\x05\x15\x2f\xcb\x7c\x1b\x8e\x04\xa0\x6d\xb9\x7d\x4c\x28\x48\x76\xe5\xfa\x60\xad\xb5\xc6\x84\x7a\xbf\x07\xc2\x18\x13\xbc\x0e\x1d\x61\xba\x62\xc6\x14\x5c\x53\x25\x29\xee\x6a\xdd\x0d\xb9\x32\xd6\x95\x0e\x52\x8a\x2a\xcf\x34\xaf\xb9\xe5\x86\x9a\x2a\xd9\xc4\x9c\x66\xe1\xad\x3f\xfb\x4d\xc6\x0e\xfb\x4b\x95\x8d\x45\xb5\xea\x55\xfd\xf3\xec\x25\x7c\x33\x5f\x60\xc4\x8f\xdd\x3f\xab\xc6\xdf\x9d\x6f\xb0\xbb\x4f\x2b\xea\x41\xe2\xe3\xb5\x3e\x26\x7e\x8e\x38\xfa\xac\x0b\x12\x8c\x8c\x63\x06\x15\x2a\x43\x4b\x8b\x52\x4b\x62\xd0\x3e\xec\xa1\xd1\x61\xe7\x40\x1f\xb4\x3f\x1c\x80\x05\xc9\xa4\x97\xe7\x8d\x56\x4a\xb9\x79\x93\x75\x61\x9c\x9c\x98\xf6\x82\x17\xae\xa0\x40\x37\x05\x2c\xa9\xad\x99\xc2\x45\x9d\xf7\x53\x9b\x0e\xe2\x6c\x64\xa8\x94\x9a\xef\x35\xf2\xa4\x9f\x2a\xce\x7a\xcb\xcf\x4e\x68\xaf\xaa\x4e\x11\x22\xfc\xee\x66\x5e\x2a\x22\x25\xfa\x5a\x4a\x24\x7d\x56\x12\x89\x0a\xa1\x2f\xe0\x49\x17\x4c\xcd\xa7\xa7\x00\x70\xd5\xe0\x6a\x40\xa5\x2f\x61\x1f\x64\x2c\x7a\xb7\xa7\x04\x74\xd1\x31\x44\x0f\x65\x05\x0a\xd2\x0e\x45\xee\x0b\x40\xc2\xae\x28\x29\x16\x4c\x20\x58\x16\x96\x28\x2e\xa4\x21\x56\xa2\x72\xec\x4a\x29\xa9\x22\x18\x32\x0a\x85\x40\x87\x71\x34\xe8\x90\xaa\xaa\x34\x65\xb5\x31\x42\x0a\x01\x39\xb5\x52\x4b\x63\xa4\x96\x96\xe2\x29\xd7\x50\x6a\xfb\x98\x18\x2d\x18\x13\x5a\xa8\x0e\x85\xa1\xe3\xd4\x52\x6e\x3b\x5b\x69\x58\x76\x82\x41\x57\x11\x53\x16\xb6\x6a\x0c\x2b\x74\x89\x28\xc7\x9c\xc6\x75\xb6\x8c\xbd\x98\x39\xdf\x5f\x3c\x6b\xfe\x87\xa8\xbb\xf2\xf1\xfb\x9b\x65\xdd\x79\x8e\xdc\xbf\x03\xe7\x68\xed\xfb\xab\xf7\x3e\xbc\xbb\x10\xf3\x3f\x7c\x7e\x06\x2c\xcc\x81\xc3\x55\x23\xf1\xd3\xd2\xfc\xbd\x5f\x31\x9b\x63\x28\x99\xce\x0b\xc9\x04\xa1\x44\x29\xa3\xc0\x68\x09\x54\xdc\xe6\x5a\x0a\xc6\xb1\x52\x4a\x38\x55\x12\x89\x43\xa1\x0b\x2a\x71\xb6\xf7\x53\xe5\x79\xa4\x9e\x80\x2e\x17\x0d\x11\x85\x24\xa4\x84\x61\xe0\x41\x31\xc0\xe8\x61\xa3\x28\x41\x88\x49\x46\x31\x97\x5a\x30\xc5\x25\x07\x39\xc0\x7e\x7e\x93\xe2\x4a\x1a\xa5\xb8\x16\xf3\x9b\x6d\xe9\x0d\x36\x12\x3a\x83\xcd\x74\x0c\x7d\xdf\x03\x12\x6c\xd3\x04\xd8\x43\x07\x89\xed\x02\x9a\xc3\x29\xb1\xd4\xc1\x78\xac\x5d\x8a\x73\x8d\xed\x2e\x76\x7d\xe3\x4e\x7b\x55\xfb\x3d\x23\xc5\x16\x91\x81\x8b\x88\xec\x37\x1b\x70\x59\x93\x99\x93\x49\xc7\x89\xa5\xed\x54\x82\x71\x0e\x6b\x7d\x04\xdb\x0d\x35\xa7\xc5\x3e\x1c\xcb\xae\xae\xd2\xd1\xf7\x3d\x55\x8c\x96\x9c\xc3\xa9\x04\xb9\xc0\x16\xf3\x8d\x98\x1a\xc7\x2d\x0f\x49\xc0\xb6\xd3\xd6\x15\xb9\xc1\x95\x83\x4d\xe0\x8c\xb9\x71\x01\x4d\x6f\xa1\x34\x4c\xc7\x3a\x5e\x9e\x45\x2e\xd9\xd7\xbc\x31\xc1\x75\x4f\xe7\xd3\xfd\x5b\xf0\x42\x9d\xee\xeb\xde\x98\x99\xcb\xc6\x30\x82\xe2\x84\x40\x11\xf6\x29\x71\xe1\xa8\x35\xc8\x9d\xd3\xa7\x63\xf6\x54\xce\xc0\x60\x1b\x9e\x75\xa2\xbf\xe6\x8f\xa9\xa7\xfd\xb3\x3f\x66\x2f\xe7\xf3\xcc\xcf\xfd\x9a\x4b\xe7\xf3\x1f\xce\xbc\xea\x04\x6c\x5e\x34\xd8\x5f\x69\x4b\xbd\xbd\x07\x9f\xee\xde\x5e\x8e\xf5\xb7\x54\x02\x07\x58\xb1\x96\xfa\x12\x8e\xb0\x72\x08\x46\xd2\xe2\x99\x99\x00\xf8\x94\x78\xd0\x2e\xe0\xfd\x68\x1b\xed\xe7\xf4\x54\x4e\xd0\x30\xae\x45\xda\x92\xca\x41\x6a\x11\xf4\x25\xca\x6a\x8c\x2c\xa0\x40\x21\x29\x15\x47\x2a\x8a\x06\x3a\xef\x68\x56\x5d\xda\xed\xde\x1f\xea\x9e\xf6\x4d\x45\x0e\x46\xd9\xae\xee\xd1\xb6\x2e\x7c\x8f\xfa\xd8\xe7\xf8\x4d\x46\x1f\x55\x8c\x01\xfe\xfa\xc5\x95\xfe\xdb\xe4\xdf\x47\xde\xdb\x57\xfa\xbc\xdf\x32\xe6\xc8\xbe\x62\xcc\xf1\xe9\x6b\xc6\x1c\x0e\x78\x1f\x49\x0d\x12\x51\xa4\x4a\x18\x6c\xa0\xe5\x7e\xbb\x48\x6d\x6d\xaf\x51\x89\x79\x59\xd4\xb2\x63\x4c\x52\xde\x5a\x24\x5c\xe5\x72\xb1\x6f\x65\xda\x08\x3a\x0f\x48\x65\x4a\x6a\xae\x9d\x39\x28\x21\xdf\xb2\xe6\x10\xf3\x0c\x8c\xd6\x1c\x58\x2c\xd6\x1c\xa4\xee\x69\xd7\x60\x38\x74\xa4\x4b\xf2\x0c\x47\x2d\xaf\xaf\x78\x69\x83\x6b\x9f\xd9\xab\x39\xfa\xe9\xee\x9b\x5e\xda\xeb\xcb\xf2\x9b\xf9\xbe\x3e\xfa\xdd\x0e\xe4\xa1\x02\xe6\xa4\x80\x0e\x18\x24\x3d\x10\xc7\x63\x3f\x8e\xc0\x1c\x26\x17\x9f\x42\xc2\x4d\x38\x92\x21\x85\x6d\xc3\xda\x76\xbd\x6d\xdb\xb6\xb5\x9d\x35\x53\x99\x8e\xc6\x76\x5d\x37\xe5\x6d\xdb\x46\xb2\x74\x68\xa4\x62\x16\x4b\xac\xdc\xe2\xa7\xbd\xac\x09\x17\x5d\xc2\x77\xc9\x8f\x67\x37\xc3\xd7\x7a\xbc\x67\x94\xc1\x9b\x85\xdb\x14\xeb\xfc\x1f\x5f\x52\x9b\x32\x0d\xba\xb3\x67\xca\x49\x00\x1b\x28\xcd\xd4\xc9\xb9\x39\x3a\x90\x55\x09\x12\x58\xd6\x08\xe4\x0f\xed\xa1\x28\xb3\xca\x4f\x4d\x5d\xa7\x7c\x6a\x36\xa5\x10\x76\x5e\xfb\x43\x1b\xb4\xb1\x51\xd8\x87\x22\x6e\x6d\x55\x85\x3e\x94\x9c\x83\x31\x1c\x6d\x92\xfc\xd9\x0b\x7d\x9a\x65\x9c\x17\x07\xf0\xff\x10\x77\xfb\x8f\x4f\xbb\xfd\xfd\xf3\x6e\xff\x42\x60\xfd\xdb\x37\x5d\x8c\xdb\x22\xe2\xf4\x2c\xa6\xbe\x92\xfe\xe0\x41\x1e\x8e\xfe\xe0\xc3\x11\xe4\xbb\x79\x29\x30\xdb\x2d\xf0\xe7\x17\xd3\xd1\x16\xe5\xb1\x80\xbe\x2a\x81\x08\xe6\x09\x58\x6c\x4f\x83\x47\x98\xf5\xa0\x9e\xa3\x84\xe5\xd8\xe8\x79\xc7\x17\x42\x08\x17\xc6\xe0\xb4\xd1\xf3\x43\x38\x54\x18\xa1\x0a\x11\x6a\x95\x91\x56\x5a\x92\x0a\x8a\xed\x50\x2b\x35\x4a\x79\x58\xb4\x34\x12\xf1\xd8\x67\x66\x63\x62\xdd\x7a\x8e\xe2\xd6\xb7\x1f\x6f\x17\x63\xdd\xfb\x8b\x12\xfa\xa5\x31\xff\x25\xed\x9d\x9b\x0e\x4e\x85\x2d\xc0\x14\x53\xeb\xa8\x2b\x4a\xd0\x3e\x26\x00\x85\x9d\x4a\xcd\xc4\x28\x4f\xfb\x69\x28\xd3\xda\x03\x6d\x15\xdf\x03\x88\x29\xf5\xc1\xfa\x49\x97\xd1\xe3\x36\x6a\x77\x34\x1b\x7e\xa5\xff\xb9\x38\x79\xfc\x5c\xef\x33\x82\x9d\x5f\xf5\x5c\xcf\x65\x8e\x45\xa1\xfe\x3e\x22\xa1\x4d\x36\x9c\x2a\x6f\x0c\x28\x8c\x33\xa7\x7a\x05\x1f\xf6\x24\x6b\x83\xab\x88\x66\x82\x49\xe9\x74\xd0\x12\x12\x6a\x54\xd5\x35\xf3\x3e\x77\x68\x87\x68\x3a\xb4\xe1\x51\xb9\x7e\x4e\x39\x98\x95\x41\x4a\x8e\xb9\x62\x98\x51\x37\x02\x29\xd9\xb1\xaa\x34\x45\xac\xe7\xc8\xa8\xc1\xf8\xe4\x9c\xc3\xba\x8d\x49\xfe\x21\x7a\x6f\x27\xaf\x53\xfa\xf9\xbf\xcb\x1b\x97\x62\xed\xa7\x97\x51\xd3\xb5\xc9\x8b\x64\xf8\xc8\x2a\xcf\x22\x29\x23\x68\xb0\x0b\x48\x51\xec\xc4\xf6\xa1\xde\x47\x5c\x93\x8c\x3b\xc3\x9c\xf1\xd3\x43\x85\x33\xea\x26\xeb\x7d\xaa\x27\xbb\x31\x5c\x72\x89\xe7\xc0\x56\xdb\x51\x28\x6a\x8d\xe1\x04\x71\x35\x5a\x6d\xac\x25\xe4\x01\x4e\x23\x63\x69\x19\xfa\x6e\x3e\x6f\x18\x6b\xe0\x26\xf9\xb3\xe4\x6f\x96\x3c\xea\x59\x63\xef\xe7\xd2\x1b\xeb\x45\xb9\x34\xe6\x1c\xd7\x81\xec\xe6\xe6\xf3\x97\x73\x24\xbb\x40\xe5\x62\x59\x23\x83\x60\x28\xab\x1a\x41\x30\x3c\xd4\xe9\xa0\xb0\x10\x5c\x08\x51\x4b\x26\x15\xe7\x4c\xc9\x79\x03\x4e\x1b\x17\x44\x59\xa4\xb9\x10\x84\x56\x0a\xa3\x20\x08\xb1\x0e\x19\x5e\x59\xb8\xdb\x57\x04\xef\x3d\x68\xaa\xa0\xd7\x23\x46\x88\x32\x07\x09\xa5\x84\x4a\x4e\x04\x52\x88\x60\x24\x30\xa1\xf9\xbc\x29\x4e\x07\x4a\xa6\x76\xd1\xcf\x05\x4d\x2d\x0a\x2c\xab\xba\x43\x9a\x94\x56\xd6\x93\xce\x0a\x3b\xef\x8d\x45\x9c\x63\x36\x6a\x0a\xfe\xcd\x53\x26\xfc\x6f\xaf\xf4\x7d\x9e\x75\x91\xae\x5e\x5d\x76\xf1\x48\x69\x59\xaa\x95\xe7\xc6\xfe\xcf\xc2\xf5\xc2\x12\x4a\xb1\xa1\x4a\x82\xd6\x51\x16\x5f\x2a\xe0\x2d\x26\xf3\x4b\xc9\xa7\x22\x1b\x02\x03\x87\x60\xea\x03\x3b\x76\xbe\x39\x0a\x90\x34\xc1\x81\x6d\x50\xfe\x78\x04\x0e\x14\x93\x58\x9e\x37\x16\x29\x4e\x19\xd5\x42\x6b\x24\x19\xa5\x54\x09\x65\x90\x60\x8c\x51\x2d\x55\xf0\x93\x95\x76\x27\xbd\x01\x49\x90\x40\xef\xad\xb1\x3b\x2b\x81\xb6\xd6\x86\xf9\x21\x49\x33\x15\xf9\xbf\xec\xac\xec\xf9\xc3\xfb\xe8\xa1\x71\xf7\xf6\xee\xaf\xc0\x93\x3f\xc5\x45\x82\x6c\xfd\x01\xfc\x98\x6d\x6e\x6e\x33\x95\x16\x40\xeb\x76\x9b\x17\x40\x84\x06\xaa\x0a\xc2\xdc\x96\x92\x89\x1e\x07\xb7\x5d\x78\x6f\x69\x52\xe4\x75\xbb\x1e\x2a\x66\xab\x32\x0c\x7b\x1f\x74\xa8\xad\x83\xe1\x58\x03\x9f\x26\x13\xa2\xcc\x0b\x4e\xb3\x61\x0f\xca\x32\x0f\xd5\x3c\xf6\x30\xfa\x09\x98\x17\xee\xed\x4b\xf6\xfe\xf6\xee\xf6\xd9\xa8\xfd\xca\xc8\x7d\xd9\xae\x9e\x45\x6a\xbf\xfc\xee\xdd\x9b\xb3\xf7\xf8\xab\x7d\xeb\xd9\x32\xda\x9d\xcc\xe0\x17\x7b\xdd\x7d\xb0\x80\x46\x46\x86\x96\x56\x80\xbe\x84\x1e\x41\xd2\xb9\xb6\x05\xa4\x8b\xd6\xf4\xa4\x0b\x54\xba\x2d\xef\x40\xdf\x7a\xd2\xd4\xeb\xa3\x0b\xda\xea\x79\xbd\xd4\xd6\x8a\xc9\xa7\x52\xa8\x69\x0c\x7a\xf1\xe0\x1f\xe2\x9a\x39\x8d\xd6\x06\x38\x67\x48\x7e\x7e\x38\xcc\xd9\x20\x51\x44\x58\x45\xe2\x9e\xb6\x8f\xf5\x2c\x73\xe5\xc3\xff\xbf\xbe\x54\x48\xb9\xf8\x47\xbf\xb6\x8f\xfe\xf2\x6b\xec\xa3\x57\x7b\x8a\x15\x43\xa6\xaa\x40\x1e\x76\x47\xc6\xb6\xca\x73\x2d\x9d\xb4\x84\x49\xc7\xea\xee\x78\xec\xfb\x71\x57\x21\x20\x22\x70\xa9\x96\x4e\x6e\xb4\x30\xd2\x10\x41\x6d\x1b\x06\x13\xf6\x3b\xed\xf5\x36\xb0\x79\x77\x04\xd4\x72\xed\x07\x53\x9b\xc6\xb4\x96\xb3\x00\xdb\x36\x4a\x1e\xcf\x31\x58\x5d\x27\xc9\x7a\x95\x9f\xb9\x13\x17\x6d\xff\xff\xe5\x8a\x49\xfe\xca\xb0\x7b\xfd\x6e\xb3\xbe\xac\x05\x37\x4f\x95\xa5\xec\x02\x26\xfc\xfc\x65\x7d\xb6\xca\xf8\x12\x6d\x34\x6e\x2a\x16\xda\x50\x21\x60\xab\xaa\x30\x45\x05\xbc\x26\x52\xcb\x69\x4f\x2a\x03\x71\x2a\xcc\x18\x8e\xc7\x2d\x52\x1c\x6b\xb8\xcf\x0b\x60\x43\x23\x41\xa2\x8e\x92\x3d\x26\x7c\xe0\xa1\x07\xb2\xc8\x83\x83\x7d\xe3\x3c\xf4\xc2\x11\xed\xf5\xc6\x58\x5c\x58\x2f\x65\xa5\x45\x59\x79\x49\x25\xe3\x82\x49\x71\xac\x8e\x35\x44\x8c\x18\x4f\x05\x62\xd4\x8c\xc2\x68\x00\x0f\x9d\x76\x3b\x43\x28\x52\xc2\x96\x85\x91\x4d\xa5\x65\x51\x2e\xb1\x49\x1d\x71\x5c\xe8\x69\x3f\x7a\x1b\x11\xe1\xaf\xd0\xc9\xd7\x5e\x01\xd9\x21\xe3\xa7\xa6\x7e\x09\x43\x76\x8d\xed\xd2\xc2\x59\xa3\x9b\x0d\xfa\x69\xcc\xdc\x61\xb2\x87\xa9\x1e\x82\xa0\xa3\xd1\xb6\xd5\x8d\x8d\x26\xdd\x59\xf4\x50\xef\x37\xf6\xc9\x55\xe9\x77\x3f\xdb\xe5\x9e\xa4\x02\x7f\xfc\x90\x9d\xd1\x6d\x6b\x42\x11\x90\xc1\x42\xe2\x8d\xf2\xb5\x3e\xa8\x40\x6c\xe3\x55\xe9\x07\x0a\x68\x45\xe8\x22\x7f\xbd\xb1\xca\x9c\xb6\x5a\x33\x63\x34\x6b\xb5\x39\xa4\x70\x6a\x70\x54\x04\xdc\xe4\x92\x87\x76\xb7\x0b\x6d\x2c\xae\xad\xa2\x06\xb1\xd9\xc0\xd7\xdc\x90\xdb\xbb\x6b\x0c\xfd\x0a\x65\xe5\x69\xac\xa3\x2a\x4e\x5b\x4f\x5d\x5d\xa7\x74\xea\x36\x70\x12\x1e\xa8\x09\x9e\x1a\x6d\x32\xb1\x20\xf1\xe7\xcf\xd4\xd1\x83\x51\x47\x3d\xfc\xea\xc9\x8f\x2d\x5a\x66\x5c\x6f\x25\xc9\xfa\xc3\x0f\x73\xf4\x77\xfb\xf1\x73\x76\x35\xc8\xeb\xa4\x2d\x4a\xa0\x19\x67\x5c\x08\x2a\xa1\x25\x28\x1c\x82\xa4\x40\x81\x7c\x6a\xe5\x16\xb2\x88\x51\x3c\x1f\x1b\x8d\x08\x9e\x4a\x25\x8c\x0c\x89\x10\xa5\x2f\x19\xa8\xc2\x38\xba\x1e\x24\x36\xf3\x2c\xa8\x36\xc0\x26\xa0\xfa\x49\x6b\x57\x9f\xa3\xce\xa7\xdd\xef\xda\xdb\xee\x26\x5a\x5b\xbd\x79\xf7\x17\x69\x64\x46\x6f\x6e\x62\xfa\xbd\xb9\xff\xf0\x79\x9d\x84\x1d\xf0\x8b\xf2\xac\x0c\xc8\xd8\xfd\x88\xb0\xf1\xc2\x97\x15\x13\x55\x91\x37\x39\xa4\xba\xe1\x08\x57\x61\x90\x20\x81\x9c\x55\xf5\xea\xe8\x24\x47\xd2\xba\xd0\xd9\x92\x28\xc9\x8e\x61\xcf\xa5\x28\x26\x89\x31\x28\xf0\x68\x11\xe1\x69\x53\xe4\x93\x3d\xda\x5d\x9a\x17\xa6\x89\xba\x02\x26\xf2\xeb\x65\xf2\xdb\x58\x9d\x3e\xd3\xd9\x3e\xde\xde\xbd\x05\x1f\xdf\xae\x96\x65\x64\xcd\x53\xf4\x70\x04\xa8\x49\x93\x49\xd4\x80\x8c\x6a\xd8\xd7\xab\x2e\x8c\xde\xa7\xdb\x30\xfa\x50\xee\x6a\x57\xd7\x3a\xcc\x73\x6d\x17\x7b\x53\x38\xf9\x2e\xb2\x1b\xbf\xa6\x59\xf4\x92\x30\x81\x6d\xcb\x59\xd8\xe5\x42\x4a\x41\xf2\xb4\xf1\x01\xfb\x18\x8f\x6e\x70\xa8\x84\xe3\x02\x98\xb0\x3f\x32\xcd\x06\xc0\x4f\xf5\x49\x5b\x9b\xd9\xc9\x82\x71\x3e\x77\xff\x28\x6e\xd4\xfa\x70\xd1\x76\x7c\x7b\x37\xef\x38\x4f\x35\xcb\xe4\x4d\xcc\xfb\xb3\x21\xf3\x81\x51\x9d\x12\x1f\xb4\x27\x54\x82\x5c\x87\x1e\xd0\x68\x87\x7e\x98\x83\xd7\xc3\x09\x13\x96\x25\x8a\x19\x20\xc0\xfe\xa7\x31\x15\x09\xc8\xbe\xa2\xef\xf8\xf1\xb5\xbe\xe3\xfd\xf3\x12\x1b\x51\xfb\x9f\xd7\xb9\x27\x29\x9a\x1a\xc2\x06\x07\x14\x67\x15\x86\xac\x2a\x07\xd7\x7b\x84\xe5\x5e\x84\x23\x40\x68\xa3\xe1\xc1\x76\x5d\x14\x4c\xe3\x8b\xb8\x63\x9a\x9c\x78\xd6\x4c\x30\xd5\x8c\x69\x40\x01\xb1\x36\xde\xb7\x43\x9c\x43\xd5\x13\xd3\xff\xf6\xee\xfb\xcb\x16\x1b\xab\x5e\x57\x1a\x9f\xef\x6e\xef\x6e\x41\x76\x77\x7b\xc3\xc2\x36\x07\x32\x34\xd0\xc0\xa2\xb0\x58\xb3\x1d\x0a\x43\xad\x61\xb3\xa7\x3e\xa5\x61\x57\x84\xe3\xa6\x9a\xba\xc6\xf8\x30\x86\xfd\x48\x42\x07\x24\x50\xd3\x01\x13\xcf\x29\xdd\x38\x17\x06\x50\x45\x1d\xeb\x21\xf2\xdb\xbb\xb8\xe7\xc8\xa4\x7c\xd2\x79\x4a\x93\x38\xb6\xcf\x51\x5c\xb2\xc6\x1e\xa2\x14\x1e\x82\x3f\xaa\x54\xfb\x20\x24\x74\x5a\x49\x5d\x41\x03\xf2\x8d\x44\x46\x6b\x39\xa9\x50\xb5\x16\xf4\x59\x75\xa8\xa4\x31\x46\x20\x24\x81\x5a\xfc\x03\xf9\xa3\x5b\x25\x1b\x18\x19\x2a\xe7\x35\x2a\xd2\xae\xdf\x5f\xb0\xb7\xe7\x4a\xc7\x67\xf0\xda\x01\x7a\x2c\x83\x0c\x05\x04\x3a\x56\xef\x9a\x8c\x84\x16\xd0\xd0\xed\xa6\xa1\xef\x01\xef\xa6\x43\x7c\xea\x9d\x20\x35\xda\xb9\x3e\xab\x4f\xa2\x77\x1d\xcc\x8e\x11\x85\x96\x4c\x66\x79\x8e\x1c\x16\x7a\x53\x67\x7e\x41\xeb\x2d\x59\x57\xe4\xe7\xdc\xde\x9f\xd7\x0e\x9f\x15\x75\x56\x4e\x12\x40\xd0\xf1\x50\x45\xe7\x85\x80\x25\xe8\x41\x31\xa9\x74\x6c\x5b\x1f\xda\xba\xdd\x01\x37\xe1\xb4\x0f\x6e\x67\xb7\x00\x27\x7f\x16\xbd\x22\xe7\x75\xe0\xc7\x73\x5f\xf1\xbf\x4b\xc8\x93\xc3\xe7\xbb\xb3\xd4\xfc\x57\xfc\x15\xce\xd9\xf4\xe6\xfe\x03\x9c\x27\xf1\x59\x40\xff\xe3\xed\xfd\x42\x5a\x79\xf3\x15\x96\x42\x0c\x52\x2a\xda\x45\x62\x57\x8c\xee\xa3\x72\xf7\xc3\x11\xf4\xd1\xe1\x53\x80\x3a\x70\xd0\x34\x7d\x05\xba\x30\xa7\xdf\x47\x43\x2a\x15\xfd\x17\x0e\x5a\x54\x94\xe1\x03\xaf\x5c\xc5\x24\x82\xb6\x44\xa1\xb2\x08\x3b\x0a\x0c\x2a\x5c\x81\x36\x5a\x97\x85\x36\x22\x14\x5c\x4b\xad\xa5\xe6\xe0\x20\x8c\xcc\xf5\x69\x07\x12\x48\x28\xa1\xa4\x06\x09\x44\x8c\x72\x3c\x25\xb6\x45\xad\x2b\xb5\x47\xb5\x86\x55\x6b\x98\xd5\xd6\x2e\x66\x0c\x9b\x58\xeb\x72\x4f\x3e\xd1\xf3\xbc\xfe\x37\x4f\x75\xae\xfb\xa5\x54\xfd\xf6\x5c\xae\x7e\x7b\xff\xfe\xe3\xdb\xfb\xf5\xb9\x8f\xbd\xbe\xf4\x38\x7f\x76\xfb\x5d\xd2\x82\x2e\x6b\x82\x04\x5b\x1f\x76\x3e\x0c\x73\xce\x6e\xf5\x7e\x0f\xfa\x71\x9c\x8e\xf3\x74\x4e\xf3\xc8\x97\x74\xab\x22\x54\x10\x1c\x38\x87\x08\xd2\xaa\xf4\xd6\x59\xeb\x81\x80\x41\x6e\x98\x93\xa1\xef\x42\x05\x86\x0e\x10\x19\x5a\xad\x35\xd7\x5a\x2b\x63\x02\x62\xac\x30\x05\x05\x70\x11\x4c\x01\x7d\x28\x53\x65\x96\xfa\x5d\xfd\x9f\xb5\x7e\xb7\xcd\x62\xa1\xeb\x14\xcd\x97\xd2\x5c\x3d\x26\x4a\x81\x44\x39\x33\x95\x19\x0f\xf5\x82\x8f\xa2\xa0\x0b\x75\x04\xd1\x47\x07\x95\xaf\xd4\xef\xec\xb4\x93\xfe\x70\xf0\x12\x30\x11\x76\x62\x3e\x4f\x7f\xd6\xb0\xfc\xed\x19\x33\xf0\xcc\x8f\xb9\xbb\x3d\x9b\x15\x7e\xba\x7b\xff\xf4\xfa\x49\x95\x6d\x89\x41\xce\x8d\xc5\x68\x6c\xf3\xb7\x60\xb3\xfe\xf0\xc3\x1c\x94\x7d\xf8\xe1\xfd\xbb\xf9\x06\xc9\x3a\xd0\x3b\x6d\x68\x5d\x87\x1d\x38\x82\xde\x29\x4d\xbd\x0f\xbb\xd0\x54\xa5\x2d\xab\xd4\x56\x85\x2d\x2a\x24\xf2\xa2\x03\x25\x0b\xfb\xae\x3b\x30\x80\x47\xd1\x86\x03\x03\x05\x20\x62\x0c\x0d\x03\x0a\x68\x11\xc6\x69\x64\x69\xb5\x91\x13\x77\x14\x5b\x24\x8e\x76\xe2\x96\x22\x8b\x38\x48\x10\x97\x95\x64\xcb\x63\xe0\xb4\xc8\x0d\xf1\xac\xf5\xc2\x6a\x29\x5b\xa1\x45\x29\xf7\xda\x18\xac\x42\xa3\xac\x9e\x63\x4c\xfc\xeb\x3d\xf5\xce\x46\x62\x8b\xa7\xde\x1c\x47\x2f\x6b\xeb\x0a\xcf\x01\xc9\xa2\xdd\x39\x86\x32\x95\x42\x37\x05\xc4\x55\x61\x4b\x6e\x35\x75\x72\x92\x6e\xbf\x57\xa2\x6a\x3d\xf9\x99\xa3\x5e\x55\xd0\x01\x1f\x75\x34\xd4\xc3\xed\xde\x06\x5b\x5d\x0c\xf5\xb2\xf8\x7b\xb8\x18\x0f\xfd\xf5\x65\xb6\xac\x5f\x4c\xf0\xb7\x5f\x22\xb8\xf5\x15\x70\xf9\xfa\xfd\xcc\x67\xc7\x53\x0e\x06\xc6\x60\x05\x09\x84\x0d\xc5\xa5\x28\x2a\x9b\xf5\xaf\xdf\xd9\x40\xdf\x3e\x94\x8c\x17\xb6\xa0\x2b\xdc\x97\xa1\x0d\x2d\x04\x08\x14\x27\xb8\x76\xdf\xfc\x87\xf3\x1e\xc0\x6f\xda\x8d\x8a\xf5\x87\xa7\x34\xea\xa9\x2f\x7a\xff\x0b\x96\x19\x57\x9d\xd0\x4f\x77\x9f\xee\x57\xf9\xd1\x1d\x0e\xd2\x6b\x2b\x35\x48\x82\xd3\x39\x90\xda\x01\x1d\xac\x14\x8c\x95\x84\x89\xf9\xde\xd3\x22\xec\x9c\x67\x9c\x19\x50\xe8\x22\x60\x40\x8f\xeb\x5d\x5d\xbb\x71\x3b\xd0\xb6\x71\xde\x5b\x85\xdd\x91\x92\xd2\x41\x38\x38\x23\x84\x35\x86\x50\x6b\xca\x68\x41\x90\xfc\x26\xa1\x8f\x64\xb5\x8b\x5c\xcb\x45\xad\x6b\x71\xfa\xbf\xf2\x6f\x8d\x6a\xb1\xf3\x3c\x3e\x03\x27\x16\xcd\xf6\xb3\x9d\xcd\xdd\xd9\xce\x06\x5c\x89\xb7\xcd\x53\x25\x15\xae\x28\x41\x79\x50\x87\x30\x6e\x47\x01\x78\x35\x47\xc0\xbb\xec\x70\x2a\xa2\xfc\xa9\x25\x50\x95\x04\x18\x50\xd6\xba\xc2\x12\x83\xd2\x4f\x8d\xf7\x29\x9f\x9a\x58\x12\x34\x55\x59\x68\x67\x6a\x5d\x0b\xe9\x6a\x2d\xa6\xa3\x06\x25\xa4\x82\x70\x26\xe6\x1b\xbe\xaa\x24\xc3\x3c\xb8\x49\x50\x9a\xd6\x07\x15\x6a\x9d\x64\x89\x78\x24\xab\x6e\xa3\x5f\xd5\x7f\x36\x37\x77\x5f\x2d\x00\xfd\x89\xfa\x0f\xe8\x09\xaa\x09\x6a\x30\x06\x65\xa0\x11\xdc\xd8\x04\x2e\xaa\xca\xe1\xe1\xa1\x19\x89\xc4\x95\x8e\xd0\x4b\x07\x54\x60\x07\x88\xd2\x83\x9f\x0e\xce\xa5\xc5\x74\xd8\x68\xa1\x84\x44\x9c\x58\xab\xbd\xdd\x61\xcd\x84\xb5\x8a\x30\xb1\xb3\x5e\x5b\xcb\xc8\x43\x1e\x72\x21\xd3\x24\x1c\x7c\x92\x27\xfa\x91\xad\xe4\xc6\x9e\x7d\x61\xe6\xd5\xe6\xd9\xfd\xe8\xdc\xe5\xbb\xbd\xbb\x8d\x7e\xec\xdf\x1e\xfa\xa7\xbb\xb4\xc1\xd5\x8e\x54\xbe\x24\xe3\xa9\x38\x56\x28\xaa\x43\x7a\x3c\xe7\x72\xc0\x82\xb2\x8e\x5d\x55\x50\xba\x17\xe3\x1d\x2b\x90\x88\xa9\x89\xa6\x9d\x60\x13\x04\x0d\xd1\x0e\x7b\xa5\xe7\x5d\x90\xc0\xc6\x50\x15\xd0\x69\xaf\x54\x06\xc3\xe8\x82\x70\x31\x9f\xd8\x47\x5c\x2d\xb9\xd2\x79\x7b\x4d\x53\x7b\x73\xd1\x44\xf8\x78\x7b\x7f\xa3\x39\xa3\xbc\x32\xa4\x9c\xbc\xdf\xa6\xf9\x74\xac\xa2\x57\x86\xf7\x1b\xf2\xc7\xdd\x02\x69\x5f\xeb\x3f\xd6\x9b\x43\xa8\xed\x6e\xa2\x16\x34\x49\x9a\xb4\x19\xbc\xe1\x1b\x73\xd1\x30\xfe\x7c\x11\x31\xfe\xdd\xbb\x9b\xf7\x67\x1d\x93\x67\x0d\xe3\x16\x1c\x70\xd5\xb0\x55\x12\x3a\x51\xef\x46\x1d\xf2\xb0\x0d\x05\x03\x16\x24\x87\x2d\xc3\x41\xa7\xac\xaa\xfa\x61\x4b\xd7\x3b\xce\xa1\x73\x8d\x24\xcc\xf4\x1a\x39\x48\x18\xa2\x0c\xa3\x8a\xf0\x45\x07\x36\x15\x51\x43\x4d\xbd\xd6\xba\xcf\x5e\x6a\xdd\xbf\x79\x97\x9e\x61\x1a\xb1\x18\xf5\x42\xeb\xbe\x9b\xd3\x4d\x0f\x3d\xc8\x1b\xb7\x0d\x16\xf1\x06\xc2\xdc\xe7\x58\x0d\xad\x6a\xb6\x0c\x24\xfd\xd6\x73\xe9\xf4\x2a\xe7\xd8\x23\xb6\x51\x8b\xd6\xbd\x9f\x18\x90\x69\x7f\xd1\xba\x47\x18\x54\x28\x1c\x1a\x42\x04\x69\x54\x6d\x87\xb4\x45\x81\x2f\x62\xf7\x79\x18\x17\xb1\xfb\x62\xf1\xcf\x28\xcf\xb5\x9d\x22\x72\x12\x7e\xb7\x70\x89\x7f\x98\x93\xe3\x79\x98\xae\x0d\x8e\x9f\x4c\x85\xbe\x3c\x9b\x19\xaf\x8f\xf3\x4a\x12\x70\xc0\x04\x14\xce\x99\x06\x40\xc0\x98\x08\xd8\x97\x30\xcb\x03\xcc\x8b\x54\x4c\x87\x06\x78\x1e\x78\xcf\xa7\x91\x83\x9d\x08\x65\x5a\x94\xf9\xc8\xac\xdc\x6d\xe0\x3e\x1c\x69\x4d\x73\xd7\x82\x04\x0f\x3e\x47\x4a\x04\x0a\x09\x71\x4e\xf9\xb0\x17\xb5\x05\x32\xec\xb7\xae\x1e\xbd\x72\x46\xea\x66\xd1\x2c\x73\x8f\xc3\x8d\x5f\xef\xcf\x7b\x4e\x5c\xd7\x2f\x0c\x90\x74\x58\xe9\x07\x4b\xe6\x45\xdb\xae\xf3\x9f\x8e\xeb\xbd\x9f\x46\x3f\x0d\xfe\x12\xef\xd7\x1b\x11\xeb\x21\x7f\x9b\x24\xe0\xbb\x39\x37\xff\x10\xc7\xff\xcd\xcf\x38\xb4\x6f\xee\x37\x8a\x1c\x54\x38\x90\x83\xe5\x3b\xdd\x15\x29\x16\x06\x11\x48\x31\x82\x45\x9b\xef\x55\x9f\xcb\x8d\x08\xf9\xce\x1c\x52\x54\xc1\x90\x87\x5e\x02\x18\xb6\x53\x1e\x8e\x85\xcb\x7d\x4a\x26\x17\x0e\xfa\x90\x96\x71\x2f\x3a\x9e\x7d\x5b\xee\x62\x7f\x39\x01\x1f\xdf\x3c\x0d\xed\xc5\x25\x28\x1a\x1e\xff\xe3\xd9\xe4\xed\xfe\xcd\xe6\xca\xba\x65\x85\xfb\xc2\xe7\x05\x38\x84\xa4\x28\xc1\xae\xe8\x4d\xaf\x1b\xeb\x5b\x66\x6b\x85\x11\x91\x1d\x6a\x8e\x79\x81\x9d\x82\x85\xc0\x06\x89\x75\x09\x64\xd1\xd5\xde\xeb\x40\xc3\xa8\xb9\xe5\xc6\x33\x47\x4c\x9e\x3b\xaf\xa5\x05\x04\x0c\x41\xc0\x6a\xdb\xf5\x20\xcf\x9c\xd4\x54\xa9\x64\x13\x73\x55\x7f\xf6\x3e\x98\xd7\x72\x12\x63\xc7\x33\x28\xe7\xfe\x5c\x22\x7e\x4a\xb5\xcf\xd5\xbd\xa7\x86\xc2\xe6\xe6\xfd\xe6\xe6\xee\xf3\x97\xd7\xee\xe7\xf3\xfa\x7e\xe3\x3d\xaa\x0c\x66\x35\xe5\x92\x54\x06\xa0\xb2\x74\x55\x01\xc8\xe9\xe8\x8c\xa9\xe8\x96\xbb\xa2\x00\x7b\x58\x85\xaa\x82\xc0\x56\x30\xc8\xd4\x4c\x26\x1e\xd6\x06\xe3\xdc\x1c\x6b\xaf\x13\x4d\x19\xd5\xd2\x33\x4e\x58\x38\x10\x84\x28\x37\x34\x90\xc0\x05\xe0\xa0\x05\xb6\xd2\x07\x90\xa3\x0a\x1a\x4a\x2c\x47\x84\x4e\x85\xe2\x9a\x07\x4a\x29\xe8\x8e\xe6\xa2\xc1\xc7\xa2\x1f\xc5\xbf\x49\x68\xf2\x7f\x24\xff\x4f\x22\xe7\xf9\x93\xde\x7e\x2c\xde\x44\xf4\x51\x74\xa2\xf8\xee\xa2\xa2\x9f\xfd\x82\x8a\xfe\x57\x44\xf4\xb3\xeb\xd2\xfb\x0b\x95\xfe\xb3\x44\xc4\x31\x2b\x73\x93\x83\xe4\x98\x17\x08\x69\xaa\x2a\x58\x14\xa6\x70\x0a\x73\x4d\xbd\xa8\x8a\x63\x14\x7f\xef\x51\x55\x86\x43\xe8\xf0\xb6\xeb\x9a\xa6\x6d\x77\x80\x33\x56\x9b\xbc\xa0\x98\x57\x15\xa2\xd2\x02\x69\xf2\x82\x61\x86\x10\x22\xc2\xa4\x15\xa9\x4c\x85\x56\x18\xe4\x00\x87\xfe\x31\x31\x87\xd6\x75\x55\x68\xc6\x08\x01\x0f\x1d\x48\x9c\x34\xae\x07\x18\x70\x3d\x87\xb0\xca\x14\xb9\x66\xd8\xc2\x5a\xcf\xd1\xb7\x3e\xb5\x45\x46\xd2\xae\xe4\x14\x13\x85\x2b\x2d\xc4\x6e\x0f\x39\xa5\x5c\x32\xa4\x84\xd8\x29\x5b\xe3\xc6\x2e\xb1\x38\xfd\x99\xb6\xd2\xbf\xbe\x38\x5f\x7e\x5b\x5b\xe9\x55\xa9\x3d\xb6\x6d\x7f\x81\x9e\x9b\x71\xd0\xbb\x98\x05\x38\xc2\x90\x41\xc1\x86\x12\x1e\xf6\x31\xcb\x22\xdb\xe3\x71\x81\xc7\x2c\xcf\xb0\x28\xbb\xa9\x4e\xf7\x6e\xbf\x27\x8a\xb3\x52\x08\x38\x41\x50\x72\xae\xa9\x78\x52\x56\xb2\x58\x91\xd2\x17\x3a\x2a\x2b\x5d\x10\x32\x61\x57\x41\x19\x8e\x57\xd2\x4a\x90\x2b\x21\x55\xf2\xec\x75\x09\xfa\x85\xfd\xf1\xe6\xee\x12\x8c\xfd\x25\x58\x5d\x68\x06\x4f\xbb\xc8\xfa\xf3\x17\x99\x42\xd8\x14\xc5\x4a\x06\x81\xb1\x04\x15\xc8\xc5\x63\x12\x78\x68\xa6\x81\x01\x07\xf2\xa8\x1e\x8c\x52\x0d\x2b\xe0\x3b\x06\x0c\x29\x60\x61\x29\xa2\x73\x0a\xc8\x55\x65\x4b\x04\x4b\xce\x70\x85\xb1\x48\x56\x89\x78\x74\x37\x6e\xd5\x27\xdf\x25\xe5\x59\x9b\x74\x51\x85\x9c\xf7\x8b\x37\x67\x61\x8b\x8b\xa6\xc5\x25\x58\x39\xaf\x13\x89\xd9\xa5\xf5\x94\xf7\x07\x9a\x9a\x63\x53\x94\xc0\x81\x86\x07\x19\xb0\x82\x35\x94\x53\x9d\xf5\x5b\xd5\x1a\x0f\x76\x7f\xac\x41\x61\xb9\x67\x36\x1b\xad\x71\x42\x50\xd7\x01\x85\x60\x19\xf6\xce\x7b\xdf\xb6\x55\xd7\x04\x72\x38\xe0\x63\xeb\x53\x66\x6b\x5e\x2f\x7e\x4b\xc0\x3f\xea\x1b\xbd\x4a\x92\xef\xa3\x3f\x66\x5c\xc0\x7e\x78\x1f\xeb\xc6\xb1\x53\xff\xf9\xcb\xdd\x6b\x79\xb3\x34\x59\x97\x53\xe9\x3c\xa8\x01\x65\xda\x70\x57\xc0\x40\xa6\x7d\xd5\xd6\xc1\x96\x69\x19\x81\x60\x69\xfb\x13\x4c\xfd\x34\xae\x12\xd7\x4a\x08\x0d\xae\x7b\x82\x31\x86\x46\x75\xd3\x5e\x29\xd7\x39\xd7\x5d\x7e\x17\x9c\xee\x2e\x7b\xfb\x02\xae\xcf\xae\xdb\x5d\xdf\xbd\xb9\xff\xf4\xf1\xf3\x9b\x79\x11\xbf\xf9\x1d\x10\x1e\x96\xa0\x28\x1d\x23\xa6\x42\xba\x16\xde\x28\x4d\x50\xdd\x97\x9a\x97\x06\x13\xba\x31\xb0\xad\x27\x13\x6a\xa1\x38\xa5\x83\xb5\xe6\xe8\x0c\x28\x00\xf4\xed\xa9\x18\x41\x1f\xc6\x03\x5b\xbe\x77\xfb\x88\x6f\xf0\xaa\x4d\x7e\x1f\xf7\xc9\x77\x17\xb2\x2f\xb8\xaa\xd3\xfc\xf0\xe5\xe3\xe7\x6f\xfc\x4b\x86\x6d\x09\xd3\x24\xe8\xa9\x64\xa9\x9e\x83\x3f\x8a\x71\xa5\x2b\x2c\x04\x05\xb0\xce\x71\x8a\x3d\xc2\x60\x17\x92\x13\x66\x19\x9f\x57\x67\xd5\xe2\xca\x54\xc4\xd5\x34\xad\x57\x2d\xaa\x2a\x1b\x98\x72\x0c\x10\x5c\x22\x4c\x10\xaa\x4a\xcd\x1d\x0e\x0e\x11\x64\xa7\xa3\x73\x0a\x78\x4a\x31\xa6\x94\xa0\xca\xfa\x39\xaf\x58\xa9\xc7\x45\xab\xee\xaf\xcf\x8a\xa6\x2f\xad\xef\xee\xdf\x16\xe0\x43\x72\xfb\xe9\x7e\x9d\xd7\x0e\x10\xa4\x1c\xc1\x15\x63\xbc\xa8\xea\xd0\x19\x80\xeb\x75\x09\x44\xa8\x4f\xfb\x50\xd4\xb9\xcf\xe5\x90\x91\xea\x34\x86\x42\x80\x31\xed\xe7\x49\x99\x35\x8f\xe4\x46\x6f\x4c\xd4\x8c\x8d\x5b\xc2\x37\xa4\xfd\x17\x71\xc4\xb5\xa6\x10\xf8\x20\x80\x15\x02\x91\x4a\xa0\x6a\xf4\x63\x0d\x6c\x90\xc0\x41\xbc\x31\xda\xf9\xc7\x64\x82\x52\xe4\x75\xce\xd2\xea\xe1\xb0\x2a\x4e\x43\xd6\x81\xc4\xab\x45\x6b\x25\x13\x51\xa7\xe1\xab\xb5\xcf\xdf\x80\x79\xf7\xbc\x7d\x51\xfb\x6c\x48\xbd\xe5\x3c\x34\xb9\xd2\x52\xb1\xf4\x50\x4f\xc7\xba\x8e\x08\xc9\xe7\xd2\xe7\xf8\x98\xb0\x45\x94\xfd\x45\xed\xf3\xcf\xb3\xea\x8c\xc5\xf9\xcb\x73\x9c\x7a\xa9\x7f\x2f\x2a\x0c\xff\x74\xee\x3b\xae\x6f\x7e\xfc\x70\xbe\x31\xdf\xdd\xfd\xf8\x61\x73\x69\x79\x7f\x79\xf5\xfc\xe6\x9a\xd4\x79\x5d\x57\x79\x73\x4d\x03\x20\xae\x28\x0f\xa0\xe4\xc6\x84\x42\x19\x06\x74\x01\xa4\x14\x32\x44\xbf\x2a\x4d\xe9\xe1\xd5\x73\x4f\x59\x85\x21\xaf\xf2\x76\xd1\xb1\xf4\x1e\x40\x67\xdb\x8d\x46\x10\x6e\xa5\x23\x8c\x11\x4e\xcd\x60\x28\x57\x61\x0c\x46\xb6\xf2\xe9\x21\xe8\xa9\x8f\x15\x17\x62\xc3\x31\x8a\xd4\xe5\xa1\x4b\xf7\xe1\xe0\xe7\x3f\xc9\x9f\x47\xbe\xea\xe2\xb5\xfc\x2f\xb9\xfe\xf7\xaf\x61\x14\xbf\xea\xfa\x73\x5f\x94\xc7\xf9\xfa\xf5\xb4\x13\x92\xcf\xd7\x6f\x95\xc4\xa1\x02\x24\xf4\x8a\xf3\xd4\x9e\x5f\x84\x62\x7e\xa1\x39\x4f\x39\x63\x15\x81\x1c\xe5\xbd\xf3\xae\xf6\xbe\xae\x01\xf2\xae\xdf\x48\x54\x96\xbd\x74\x98\x31\x44\xb0\xd9\x5a\xc6\x49\x68\x5f\x0d\x81\x99\xfa\x98\x95\x13\x73\x35\x04\x63\xd8\x2f\x43\x90\xfc\x79\xf4\x62\xfb\x93\x73\x60\x75\x35\x06\x37\xff\xe9\x63\x90\xcc\x2b\x16\x04\x88\x3b\x37\x35\xda\x70\xd0\x16\x60\x6b\xb4\x0d\x0a\xd0\xd0\x29\x29\xd3\xf6\xfc\x22\x24\x97\x77\xf4\x7c\x95\x90\xa3\x72\x70\x4d\x5c\x2a\x3b\x40\x1b\x37\x2c\xf3\x40\xcc\x83\x40\x28\x31\x3b\xc7\xb8\x09\x87\x7f\xd6\x20\xfc\x39\x38\xc6\xbe\xbb\xfa\xf5\x63\xf0\xeb\xe7\xc1\xdd\x57\xc7\xe0\xee\xd3\xaa\x6b\x20\x04\x04\x50\xde\x34\x93\xb2\x9e\x83\xb1\x00\x5b\xab\x45\x88\x0b\x92\xd2\x3a\x3d\xc6\x17\xc6\x4c\x03\x90\xb1\x99\x9b\x76\x9c\xe3\x68\xf6\xf4\x98\xd8\x9d\x1d\x9c\x1b\x06\x20\x76\x16\x24\x1b\x85\x2a\xd8\x8b\xf9\x6e\x40\x9c\x98\xbd\xa1\x9c\x87\xdd\x3f\x6f\x2a\x24\x79\xd4\x49\xae\x9f\xbc\x4d\xdf\x26\xbf\x4f\xfe\x63\xf2\x7f\x26\xff\xd7\x65\xe5\x7b\x92\xd4\xbc\xbe\xd8\x6b\xe5\x88\x33\x92\xeb\xba\x2b\xb8\xf9\x4b\xf0\x02\xfb\xb2\x68\xf5\x7f\x8c\x32\x76\x11\x50\xb4\x2e\x51\x99\x16\x0f\x02\x8c\x25\x0c\x0e\x0c\xa1\x32\xbb\x1d\xd8\x81\x7d\x80\x66\xbf\x9f\x2a\x90\x78\x50\x39\x00\xc3\xfe\x78\x04\x64\x3a\x20\x61\x99\xe2\x46\x35\x2a\x08\x47\xb0\x88\xf0\x18\xc2\x29\x1f\xb7\xc1\x00\x34\x0c\x8f\x49\xda\x87\x01\x54\x61\xd8\x58\x44\xac\x85\x30\x8c\xa1\x51\x46\xce\x0f\xa1\x21\x84\x10\x25\x95\xd4\x72\x0e\xfe\x18\xa1\xc8\x78\xc0\x31\xc4\x5b\x58\x69\x52\xb1\x5d\x55\x2a\x62\xb4\x54\x52\x4a\x39\xc8\x24\x49\x7e\x9b\x1e\x1e\x75\xcc\x19\x9e\x6b\xb3\xcf\x58\xb6\xff\xf1\x1c\x15\xc6\x9f\xf5\xf6\xee\xcd\x0b\x2b\xfe\x9f\xe3\x82\xae\x90\x62\x67\x15\xec\x0f\x59\x05\x88\x6d\x0d\x20\x0f\x5b\xd7\xb6\x00\xb7\xa6\x3d\x8d\x97\x17\xd5\xaa\x7e\x10\x3c\xdb\x9f\xa0\x4d\xb7\x13\x36\xf3\x8d\x83\x61\x5d\x12\x40\x1f\x38\xc8\xd1\x26\x9f\xc3\xdb\x49\x03\x13\xff\x04\xbb\x3c\x35\x96\x05\x6b\x65\x18\xb9\x60\x1a\x61\x61\xad\x8b\xba\x4a\x24\x2b\x37\x3a\x29\x93\xe4\xcd\x45\xc6\x28\xbd\xb9\x22\xb9\xfd\xf0\xe6\xce\xec\x23\x72\x72\x27\x64\xad\x25\xe7\x5e\x72\x01\x60\x1f\xf8\xda\x44\x20\xa4\x7b\x4c\x7a\x6f\x9d\x95\xa7\x5d\x96\x1b\xea\x46\x70\x8c\xf5\xb2\x74\x88\xeb\x88\x4b\xfe\xe2\x3c\x42\x77\x51\x5d\x6e\x41\x52\x24\xe0\xec\xe9\x7f\xbe\x87\xde\xcf\x01\xc3\xfa\x57\x96\xcc\x56\x50\x5b\x0a\x4c\x53\x57\x20\x07\x88\xb7\x2e\xe4\x60\x2b\x45\xe9\xc3\x76\x55\x3c\x1c\xa2\x80\xa1\xa5\x15\x43\x14\x58\x50\x59\x81\x08\x9f\xf3\xf4\xc9\x3a\x17\x6d\x68\xf4\x64\x57\x47\x46\xcc\x76\x8f\x70\x27\x3d\x15\x5c\x53\x56\x9a\xfd\xb9\x74\xc6\x31\x67\x2c\x96\xce\xa0\xa4\x98\x05\x35\x49\x4a\x53\x3f\xaa\xd0\xe8\x24\x49\xd3\xfd\xd9\x3f\xf9\x77\x91\xcf\x15\x15\x92\xb2\xd7\x86\x05\xbf\x6c\xa0\x9c\x1d\x5c\x01\xb3\x92\xa2\x36\x9a\x0c\xd0\x12\x4d\x98\x49\xd5\x59\x8b\xc0\x36\x0c\x51\x57\xc0\x4d\x45\x64\x32\x0a\x49\x98\xee\x16\x07\x65\x16\x0e\xdb\xa2\x2e\xd4\x7e\x95\xff\xa2\x83\xf2\xc2\x3b\xf3\x29\x4b\xb2\x27\x26\xf7\x59\x9f\xf8\x65\xde\xb1\x00\x28\x63\x43\x16\x90\xb5\xf9\xc9\x0c\x37\xe8\xb4\x65\x46\x70\xa8\x24\x3e\xd5\xe0\xa0\xb7\xe1\x20\x8f\xd9\x00\x92\x03\x3d\x1e\x53\x66\xb9\x1b\x24\x5f\xf2\x06\x51\x47\x95\x32\xed\x2c\x4b\xa2\xd6\x27\xbf\x51\xe9\xf0\xf3\xef\x7c\xa9\xa2\x32\x7f\xdb\xdf\x47\xe8\xe6\x0f\x00\xcf\xdf\xd9\x6c\xf6\xa7\x23\xb3\x4a\x40\xad\xc9\xa9\x5f\x8d\x20\xdf\xab\xe1\x31\x99\x94\xec\x82\xa3\x80\xa4\x83\xd5\x2e\xec\x24\x2f\x6a\xc8\x40\x51\x99\x5a\x37\x5a\xeb\x5a\x7b\x96\x24\x59\xba\x3d\xe7\x66\xff\x6d\xf2\x87\x58\x89\xbd\xbd\x96\xdb\x89\x64\x8c\xdb\x28\xe4\xf7\xe1\xcd\xbb\x9b\xbb\xb7\xd9\x3c\x08\x57\xeb\x11\xb8\xb9\xfb\xb2\x64\x11\x6b\xcd\x1d\x21\x90\x50\x52\x0d\xe1\x88\x41\x75\x98\xc6\xb4\x25\xd3\x0e\x6f\x1d\x4c\xc5\x16\xb0\x90\x63\xa2\xb9\xd5\xc6\x75\x2c\x8c\xa1\xa4\xe0\xc8\x26\x62\x84\x12\x16\xf0\xd0\x2b\x91\xfb\xbc\xc2\xbb\xd6\x36\xb6\x05\xca\x59\x0d\x7a\x4c\x5d\x60\x6e\xc7\x99\xab\x79\x6f\x1d\xaf\xdd\x1a\xd6\xf5\xa4\xa4\x52\xe6\x9c\x73\xe1\x47\x92\x35\x51\x1f\xfa\xfb\x05\x5b\x74\x36\x09\xfe\x18\x15\xcd\xa3\x2c\x17\x03\x64\xda\x41\x6b\xfc\xe8\x01\x9f\x7a\xe0\x83\x5c\xc3\x61\x72\xc1\x87\x9d\x00\x04\x38\x30\xa4\x68\xeb\x26\x0a\x96\xb8\x3d\x3d\x44\xdf\xf5\x9f\x7f\xe6\xdd\xd3\x67\xae\x3d\xe8\x4f\xc7\xaa\xb5\x3b\x40\x3c\x38\x9c\x76\x51\x3e\xff\xdb\x1f\xfa\x9b\x8c\x3f\xca\xb8\xe6\xfd\x26\xf9\xdd\x39\x0f\xae\x9e\x3c\x5a\x16\x07\x83\xb7\x71\xee\x67\x71\xd9\x5b\xa8\x34\xd9\xfd\xdb\x8f\x37\x6f\x3f\x7e\xca\xde\x7e\xfc\x74\x26\x87\xde\xc6\xdd\xe1\xf6\xcd\xc7\xdb\x7b\xf0\xf1\xf6\x7e\x7e\xde\x50\x5b\x96\xc7\xb0\x47\x48\xc9\x43\x33\xed\x52\xe8\x95\x32\x5a\xeb\x71\xd4\x69\xa1\xb9\x12\x1a\x94\xf4\xa1\x17\x4e\x6b\x90\x68\x7d\xd4\x7a\x63\x4a\xaf\xac\xe5\xb2\x9f\x5a\xb7\x2a\x6c\x13\x64\x4a\x1a\xe3\x7d\x18\xbb\x4e\x68\x2b\x9d\x09\x24\x40\x6b\xe7\x6d\x23\x0a\x00\xc4\x63\xbe\x8e\x24\xfa\xe5\xfd\xc2\x75\xdc\xbd\x3d\x7b\x76\xbd\xbe\x8e\xbb\x88\x6a\xfa\xfa\x75\xcc\xc7\xa6\x72\x05\x04\x45\xe8\x11\xd6\x3a\x1c\xfa\xa9\x4e\x69\x63\xcc\xbc\x02\x83\xe4\x31\x31\x29\xb6\x52\x0b\x07\x2a\xf1\x20\x84\xb7\x16\x14\xf3\xe1\xdc\xc6\x94\x4e\x3b\xc3\x55\x3f\x35\x6e\x55\x38\x1f\x44\x8a\xbd\x75\x6e\xb9\x18\xa3\x9c\x0e\x2c\x94\xce\x81\x27\x9b\xe7\xe8\xef\xfc\x9b\x33\xce\x42\x9f\x91\x4e\xf3\x2e\xf4\xe1\x09\xaf\x16\xb5\xc6\x2f\xcc\xfb\x6b\xcc\xd9\x9b\x9f\x6b\xa7\xbe\x70\x94\x5a\x63\x0f\x3a\x3b\x15\x0e\x74\xc0\x2a\x4c\x05\x99\x1a\x4e\x18\x63\x3c\xf5\x93\x8c\x8d\x95\xd4\xbb\x49\x3b\x17\xfb\xdc\xb1\x2c\x71\x79\xf5\x98\x6c\x74\x18\x83\xdf\x8f\x40\x81\x9c\x28\xcc\x29\xc5\x54\x32\x1c\x44\x94\xbc\x35\xa7\x3d\xa5\x19\x0c\xbb\xa6\x69\x02\x8e\x88\xad\xf9\x37\xa9\xfe\x7f\xb9\x8e\xdc\x83\xd1\x9d\x7a\x07\xf6\xa0\x55\x94\x09\x36\x09\x49\x19\x17\x72\xde\x38\x5d\xb4\xcc\xdb\xb9\x09\x39\x77\x76\xda\x2e\x27\x74\x79\x15\xc6\x7f\xc1\x75\xa4\x2b\xfd\xd8\xde\xb0\xf5\xee\xe7\x1a\x9e\x37\xcc\x47\x95\xd0\x26\xf0\xf5\xee\x8f\xa3\x75\x1b\xf8\x90\xac\xd4\x72\xff\xdb\xb4\x5b\x1f\x17\xbc\xc9\x9b\xbb\xb7\xf7\x69\xe4\xc8\x9d\xd9\x8c\xdf\xbd\x89\x53\x4b\xa6\xec\x80\x28\xc0\xd6\x38\x58\xa9\x86\x6d\x41\x69\xcc\xfa\xe8\x1f\x93\xe1\x24\x59\x97\xe5\x9c\x29\xc0\x41\xfb\xa0\xd2\x72\xf9\xcc\x0c\xad\x8f\xc9\x77\xc9\xef\x16\x9d\xa0\xe7\xcf\x8c\xa8\x92\xe5\x23\xb7\x61\xc0\x0c\x68\xdf\x7b\xae\x77\x32\x1c\x01\xee\xfb\xcb\x67\xd2\x36\x3d\xd6\xfa\xfc\x91\xf3\x62\x1e\x35\x91\xe6\xfb\xe6\xfd\x95\x37\xe9\xb7\xed\xa1\x3f\xdd\x7d\x5e\x27\x75\x05\x8e\xd3\xa1\x84\xa9\x9e\x24\x49\x6b\xd7\x0b\xa6\xc3\x21\xf4\xb2\x76\x4e\x4f\x0d\xc6\x30\x1c\x41\x85\xc3\x08\x50\xb9\x31\xc5\xde\x69\xe5\xf7\xfe\xd0\x52\x66\x41\xd2\x5a\x2e\x5d\x17\x2d\xa2\x9d\x4e\xd6\xe9\x10\xef\x5b\x95\xc0\xb3\x96\xd0\x2b\x5d\xab\xcd\xcd\xe7\xf7\x67\x82\xda\x6a\x7d\xf1\x48\xfc\xda\x5d\x9a\x29\x60\xa2\xdc\x0d\x18\x26\x2f\xf4\x11\x24\x15\x32\xde\x49\x15\x74\xc0\x55\x63\xc2\x1c\x6a\x9a\x6c\x2b\x1f\xb0\xf1\xc6\x80\xdc\x39\x50\x3a\xb7\xee\xdb\xd6\xb5\xce\xab\xa2\xaa\x2a\x6e\x5a\x65\x48\x61\x64\xeb\xda\xd3\x30\x8d\xce\xa5\xe5\x14\xf5\x90\x97\x23\x49\x6e\x52\xfc\xa4\xa7\xf0\xdb\xe4\x5f\x25\xff\xf0\x8c\xcf\x88\xea\xb9\xb1\xaf\x70\x13\x61\x85\x57\x67\x0d\xee\x6e\x5f\xb2\xcc\xe6\xcd\xeb\xfd\xd7\xde\x7c\xd1\x44\x3f\x98\x26\x0c\x02\xc0\xd4\x72\x20\x58\xd0\x6a\x6b\x6d\xb3\xef\xaa\xca\x78\x61\x59\xd8\x05\x57\xed\x40\x99\x72\x46\x99\x29\x2d\x42\xfd\x9e\x80\x62\x17\xc8\x24\x53\x4e\x19\x35\xd0\xe2\xaa\x1b\x97\xf7\x32\xca\xb1\x45\x7c\x1a\x39\x71\x88\x6f\x34\x0d\xbb\x41\xef\x8f\x61\x67\x5d\x0d\xec\x11\xf5\xa6\x84\xa8\xc2\xbe\x23\x0e\x43\x63\x43\x73\x1a\x18\x2b\x6c\x81\xb6\x82\x39\xce\x41\xe5\xae\xdf\x60\x02\x54\x98\x09\x26\x18\x8b\x8f\xc9\x4d\xf4\x6b\x6e\xce\xe3\xf2\xd7\x67\x9d\xc3\x7f\x3a\x8f\xcb\xe7\xeb\x71\xf9\x85\x61\xf9\xfc\xb5\x61\x79\x8d\x2d\x58\x61\xeb\xc2\xc8\x8f\xa9\xa6\x00\xb1\xe0\xf9\xd6\xe9\x7a\xdb\x50\x63\xb8\x25\x61\x0c\x1d\xea\x41\x92\x22\x46\xa9\x2a\x35\xaa\x9a\x2d\x39\x76\x41\x4e\x75\x5a\x31\x4a\x25\x9c\xdf\xea\xe9\xb1\x0b\x2a\x2b\x18\xb2\x88\x86\x92\x21\x5b\xd1\x79\x48\xc6\x9d\xe9\x0f\xf3\x90\x34\x40\x1f\x50\xeb\x4a\xc8\xe7\x11\xb1\xe8\xc5\x88\x0c\x9c\x79\x4a\xaf\x46\xe4\xf2\xc6\x8b\x11\x49\x92\x14\x34\x8f\x7a\xc5\x37\xd5\xa2\xa6\x1b\x53\xc4\x33\x52\xe0\x62\x13\x71\x7b\xff\xe5\xe3\xed\x7d\x5a\xa6\x85\x77\x4e\xb0\x32\x8c\xa1\xc6\xca\xb1\xbd\xdf\xef\x37\xd5\x64\xa3\xe7\x08\x84\xc6\x08\x0f\xd3\x7e\x92\x45\x46\x2d\x98\x73\x95\xd5\x0a\xc7\x38\xdc\x24\xef\x92\xff\x32\x56\xae\xcf\x7b\x5c\xfa\x02\x2f\x7f\x16\xf6\xf9\xfc\xe5\x6e\x73\xbd\x6c\xad\x61\x5d\x40\x30\x48\xef\x5b\xb2\x6b\xea\x11\xf7\x96\xd3\x12\x4a\xcf\x99\x32\x24\xd4\x45\x9a\xfb\xa0\x7d\x14\xb9\xdd\x98\x8a\x51\xf7\x98\xd4\x92\x3a\x6a\x0d\x77\x54\x09\x57\x41\xd5\x4b\xaf\x5c\x03\xa7\x72\x82\x4a\xa5\x71\x3b\x4e\x92\xe4\x2f\x52\xfb\xc8\x22\xbf\xee\x5a\x6f\x62\xc1\x20\x2f\x5c\x95\x7f\xb6\xde\xc4\x12\xe1\xfc\xe3\x87\x2f\x17\xb9\x89\xb7\x37\x1f\x3f\xdd\xbf\xfd\xfe\xfd\x53\xf6\x75\x11\x9c\xf8\xba\xde\xc4\xdd\xdb\xf4\x98\x16\xd3\x21\x65\x29\x9c\xf6\xd4\x8d\x6e\x25\xfd\xc1\x85\x0e\x41\x0e\x51\xda\xc6\x27\x20\x42\x03\xc8\x09\x43\xa1\x15\xd8\xe7\xa6\x80\x9d\xed\xf2\xbe\x03\xa4\xb3\x4d\xe8\x9d\x53\xcc\xf5\x42\x21\x9f\xf3\xc1\xf3\xd0\x5b\x55\xf5\x0d\x75\x00\x6e\x84\x31\x86\xbd\x96\x9b\x68\xa2\xd0\xc4\x59\x6e\xe2\x68\x64\xe8\xc2\xf6\x31\xe1\x00\x02\x01\x5c\x51\x40\x32\x2e\x59\x27\x2e\xd9\xfc\xe2\x31\x51\x88\xcc\x59\x09\xae\x74\xd5\x30\x42\xbd\xaf\x2a\x45\xab\x45\x71\xe2\x2f\xb2\xea\x4f\x6a\x78\xfc\xbf\xff\x92\x31\xfd\xa6\x86\xc7\xcd\x37\x34\x3c\xae\x24\x3c\x6c\xc4\xdc\xe6\x60\x17\x10\xb2\xbd\xcd\xb6\xb6\xb3\xe1\x08\x4b\x51\xc0\x94\xc3\x82\x17\x10\xd0\xb0\x03\xf9\xa9\x2f\xb8\x11\xa0\xcd\x73\x55\xe6\xb9\xb5\xde\x7b\x00\xad\xd5\x47\xa7\x18\xd7\x75\x89\x78\x61\x73\x5a\x5b\x16\x8e\x5d\x55\x5b\x62\xf7\xdf\x12\xf0\x10\xd5\x2b\x01\x8f\x43\x38\x70\x50\x02\x0e\x6c\x59\x94\x10\x7e\x4b\xc1\xa3\xa6\x98\x39\xc7\x9e\x05\x3c\xd6\xa9\x38\xf3\x64\xfe\x2c\xe2\x0d\x16\x9c\xf3\x0b\xce\xc9\xa2\xe1\x76\x09\x09\x9f\x6f\x9c\xb4\x8b\x6c\x12\x0c\xc1\xee\xa1\xce\x58\x4b\x19\x50\x3f\xed\xb2\x9c\x4f\x47\x5a\xd5\x15\xcd\x86\x7a\xaa\xea\x3a\x1d\xa6\x6a\xdd\x33\x82\xb8\xf4\x04\xb5\xce\xfb\xb6\xd3\x0e\x7b\x3d\xa9\xa9\x62\x2c\x1d\x42\x01\x78\xb2\x49\x93\x47\x19\x6b\x72\xd5\x93\xce\xd2\xff\xfc\x4a\x0f\xe1\x49\x0e\x61\xfe\x11\xa2\xa7\xfc\x19\xb0\xfa\xc3\x97\xc5\xf2\xe2\x2e\xca\x21\xbc\x92\x8c\x4d\x15\xf0\xb8\xaa\xcb\x2a\xf5\xc1\x78\x80\xb5\x0a\x9c\xba\x9e\xd6\x85\x0e\xfb\x83\x09\xfb\x1a\x13\x06\xca\x26\xb4\x00\x1e\x3d\xc8\x9d\x6c\x45\x77\x8e\x91\xf2\x89\x5c\x5e\xad\x9d\xd2\x48\x70\xb7\xef\x9d\x98\x5c\x5d\x42\xe2\x50\x2f\x08\xdd\xc9\xb4\x47\xd0\xb5\xc7\xd0\x6f\xb7\xbe\xe9\x02\xee\xba\x2e\x14\x5d\xd7\x25\xe9\xb9\xc6\xa6\x93\x3f\x2c\xbc\xda\xf3\xa5\x5c\x8e\x38\xa2\x2f\x65\xac\x3e\x5d\x70\x3f\x4b\x84\x11\xb5\x02\xe2\x75\xa5\x1e\xec\xa1\xcb\x8b\x34\x9f\x86\x2a\x85\x53\x83\xd2\x63\x18\xcd\xa8\x05\x0b\x0d\x38\x86\xbc\x8e\x0e\x79\x9e\x0b\xb5\x35\x03\x20\x24\xec\x01\x47\x81\x02\xcd\x24\x40\x35\x40\x9a\xad\xf7\xbe\xc2\xd8\x59\x6b\x9c\xd5\x8e\x50\xe9\xdd\x1c\x62\x3b\xcf\x29\xd5\xae\x76\xc6\xda\x69\xaf\xa5\x73\x4a\xcd\x7b\xbb\x7e\xc4\x37\x7a\x83\xaf\xfc\x59\xff\x66\xc1\xd2\x9e\xc3\x8d\x2b\x30\xf8\x6b\xd4\xfd\x66\xef\x1f\x92\xa6\x7e\xea\xf4\x9e\x0f\x69\xda\xa3\x18\x52\x36\x6e\x75\xb7\xdf\xe0\x07\xe2\xdc\xaa\x0f\xbb\x3a\xa0\xcb\xdf\x46\xb4\xda\xce\x39\xb7\xf5\x62\xce\xf1\xf4\x99\xe3\xb7\x8e\xdf\xfc\x04\xda\xbc\x70\xdc\xae\xac\xda\x97\xe3\x73\xd6\x4b\xe2\xb0\x4c\xb7\x2d\xe7\x40\x4d\x91\x7e\x9c\xe2\x69\xdb\x4c\xdb\x14\x07\x08\xf6\xd3\x31\xad\xd5\x46\x6b\xcb\x8c\x66\xa8\x35\x3e\x8c\xf1\x6f\xb4\x1c\x28\xe7\xbf\x4d\x02\xa2\x67\xa3\x5b\x74\xd9\xc1\x9f\xd2\x65\x4f\xf7\x60\xd7\x44\xfd\x50\x3c\x89\xba\x01\x18\x50\xc2\x5c\xab\x1b\x12\x44\x40\x68\xf0\x81\xa5\x55\x40\xeb\x98\xa2\xf9\xd0\xd4\x81\xb7\x90\x79\x4b\xc2\x3e\x34\x74\x2b\xa0\x1f\x80\xab\xe7\x0d\x23\x8b\xde\x85\xcd\x39\x47\x58\xb4\xe9\x22\x94\x36\x5d\x7f\x48\xde\x3d\x4b\xdd\xbf\xbb\xf9\xe1\x1c\x89\xae\xfa\xba\x02\x08\x10\x1e\xb6\x61\x77\x08\x9d\x02\xf5\xd1\x30\x4f\x75\xe8\xb2\xc1\xef\xba\x39\xbe\xef\x44\xed\x3b\x75\x3a\x6c\x34\xa2\xc1\x76\x75\x0f\x4c\xb0\x83\x02\xc4\x4b\xc3\xb4\x0c\xbd\x3d\x0e\xc6\x1e\x1a\xcd\x44\xd7\x25\x20\x55\x8f\x2c\x72\x2c\xe2\x3a\x30\x7f\xdb\x45\x8c\xfa\xaa\xe8\x70\x76\xc5\x5a\x4e\x22\x3d\xac\x8a\xee\x60\x40\xc3\xb4\xe5\x38\x34\xaa\x16\xac\x12\x82\xa1\xa9\x4d\x75\xd3\x4a\x25\xb7\xfe\xd4\x6f\x90\x39\x34\xd2\xd5\x0d\xd3\x7a\x2a\xb4\x28\xea\x22\x0a\x5f\x68\xae\x30\x35\x6d\x72\xd6\xc3\xe7\xb1\x0f\xf4\x9b\x25\xa3\xff\x7e\xd1\x57\xba\xb1\x3f\xe5\x8c\xd6\x6e\x83\xfd\x69\xf4\x01\x76\x02\xd4\xe0\x18\xa5\xcb\xa3\x96\x36\x5f\x2d\x5a\x35\x73\x56\xf5\x77\xc9\xdf\x27\x7f\xf8\xb9\x13\xd3\x73\x7d\x2d\xc2\xd6\xee\x37\x37\x31\xee\x78\xff\x21\xd2\x12\xdf\x7c\xf9\xfc\xe5\x4e\x83\xbe\x8e\x00\x60\x7d\xd2\x40\x05\xb2\x2a\xdc\x04\xfd\x3e\xe5\x53\xa3\x33\xa6\x0b\x78\x80\x01\x4f\x5b\x0c\x2a\xa4\x23\x7e\xb4\xed\x61\x11\xf6\xb1\x15\xad\xac\x55\xa1\x0d\x43\xdd\x03\x3a\x1a\x11\x14\x23\xd0\x72\x5c\xc3\xad\x71\x01\x97\x8c\x25\x9b\x84\x3f\xb2\xd5\xf6\x49\x77\xf1\x1f\x12\x9c\xb0\x98\x3f\x3d\xd9\x9d\x3f\xab\x6f\x5d\xdf\x4b\x6f\xa2\x3e\xe1\xab\x08\xe6\x7e\xf3\xfe\xe3\x2b\x19\xae\x48\x22\xbf\xbd\xcf\x92\xba\x1f\xd9\xd8\x05\x3f\x5f\x4e\x1b\xda\xc6\x2b\xc7\x8c\xe0\x52\x4c\x2d\x27\x16\x73\xe4\x4a\x90\x97\xfb\x1d\x6f\x05\xa5\x25\x14\x96\x72\x52\x15\xbe\x00\x7a\xef\x95\xb2\xd6\x3f\x26\x15\x37\x25\xb4\xfb\xd5\x9c\xb5\xe4\x35\x33\xcc\xba\x79\xf2\x3a\xa1\xb4\x4d\x1d\xb3\x94\x73\xc9\x15\x93\x62\xaa\xa0\x0c\x3e\x18\xa5\xb9\xa7\xb8\x82\x62\x2b\x31\x35\x1a\x35\xd6\xda\xb0\x8d\x0d\x28\x0d\x12\x28\x25\xc0\x51\x2b\xca\x3e\xd2\x55\x1b\xef\xe7\x7f\x93\xfc\xbb\xe4\xff\xbe\xb0\x96\xc0\x52\x97\xbd\xb9\xfb\x70\x56\xb1\x88\x2a\xff\x5f\x27\x34\xfe\x78\xc5\x68\x3c\x4f\x40\x70\xd1\x6c\x5f\x34\x8f\xe3\xbf\x9f\xff\x69\x25\x69\x10\x53\x83\xc0\x21\x10\x0d\xb1\x21\x95\x48\x85\xe0\xc8\x11\xaa\xdb\x1a\x42\xc0\x04\xaf\x2a\x48\x2a\x14\x3a\xc2\xa4\x46\x8a\x61\x9d\x17\xc3\x08\x25\x1b\x3d\xe8\x76\x4c\x70\xa5\x26\x0c\x86\x88\x99\x33\x69\x85\xb9\x14\x18\xeb\xbe\x32\xc2\x53\x29\x48\x15\xd4\x46\x1b\x5a\xd8\xd0\x50\x4c\x28\xab\x90\x14\x58\x31\x6d\x59\x59\x9c\x3c\xe3\x51\x15\x7d\xa7\x69\x0e\x29\x56\x06\x43\x58\xe5\x82\xda\x93\x5c\x15\x46\x20\x8c\x29\xe0\x84\x61\x46\x4e\x89\x52\x94\x88\x0a\x52\xa4\x20\x62\xbc\x42\x98\x2c\x1c\x5c\x75\xae\x73\x2d\x78\xc0\xbf\x4f\x3e\x46\xcd\xf8\x67\x47\xb8\xdb\x65\xa2\xc7\x82\xd7\x05\xdc\x1e\xc1\x2e\xd7\xb1\xef\xbb\xeb\x54\x6a\x01\xbc\x0b\x7f\x22\x1e\x1c\x7c\xea\x26\x15\x8a\xac\x3f\x11\xe0\x24\x96\x44\x9a\xae\x56\xdc\x08\x5b\xcf\x79\x69\x7b\x20\xa3\x6f\x7b\xc6\xb9\xa2\x22\x1d\x19\x53\x84\x6f\x15\xd5\x44\xad\x93\x9f\x88\xd6\xeb\x1e\x68\xe5\xf4\x03\x5d\x55\x15\x13\x98\xd3\xbc\x6d\xeb\x03\x0c\x63\xdf\x75\xb2\x6f\xb7\x46\xd9\x6e\xdb\xce\xc3\x28\x04\x62\x92\x09\x11\xb6\x8c\x93\xa8\xcd\xb1\x02\x5d\x8c\xe5\x6c\xb2\x4e\xfe\xfe\x8c\x35\x39\x33\xfe\xe7\x7c\xfe\xbb\x78\x19\xd9\x19\xb3\xb3\x79\x06\xed\xdc\x9d\x2d\x10\xee\xe2\xfe\x3f\x4f\x99\xbf\x04\x4f\x94\x8a\xdf\x83\xfb\xbf\x05\xe9\xcd\x87\xcf\x9b\x5a\x10\x49\x45\xe7\x73\x40\x43\x57\x94\x04\x39\x6e\x08\x2e\x4a\x5b\x70\xaa\x85\x50\xaa\x11\xb8\x9c\xdc\xce\x6e\xb3\x64\xea\xd3\xb2\xc1\x95\xe2\xae\xd0\x42\x30\x4e\x3b\x09\xd0\x9e\x98\x92\x69\xba\xb1\x94\x28\xce\xc8\x9c\x7f\xd8\x71\x7b\x80\x81\x87\x21\x34\xce\x97\x61\x5f\xcf\x31\xb1\xdc\x1e\x01\x8e\x2e\xda\x30\x78\x06\x14\xe8\x52\x1f\x0e\x36\x0c\x94\x71\xa7\x24\xe7\x46\xd0\xa1\xd5\x00\x81\x0e\x24\x75\xf9\x98\x74\x34\xae\x77\x37\x60\x88\x7d\xf6\xe7\x3d\xf6\x6f\x22\xbe\xf0\x45\x55\xe5\x09\xc9\xf9\xd4\x8d\xca\x16\xf0\x78\x84\xe2\xde\x20\x7f\xc2\x5e\xc7\x9e\x40\xba\x9f\xe0\x7c\x00\x83\xab\x94\xfe\xd4\xa4\xbc\xac\x98\x6c\x82\xa1\x00\xa7\x1a\x14\x7b\x35\x86\xe3\x06\x3f\x26\x5a\x83\x24\x6c\x27\x09\x22\x29\x35\xf4\x8c\x3b\x47\x70\xe8\x94\xd3\x8e\x39\x69\x6d\x2d\x93\x9b\x94\x45\x8c\x01\x7a\xe2\xd9\x2d\xbd\x9f\x18\x59\x3f\x79\x77\x7d\xbc\xbd\x5f\x5f\x2b\x04\xbe\x42\x9f\xa6\x7e\xd5\x86\x1a\xb8\x9f\x86\xe8\x0a\xb2\x1f\x86\x54\x45\x0d\xc0\x93\x65\xa5\x83\x74\x45\xfc\xc4\xbd\x4f\x9b\x89\xcf\xc7\x06\xb9\x69\x70\x6e\xa1\xc7\x71\xd6\x6b\x61\x6d\xed\xab\xc6\x4d\xfa\xb4\x53\x2a\x43\x61\xef\x03\x73\xc9\x2a\x45\x8f\xfa\xc6\xc6\xde\xe5\xdb\xc8\x19\xf8\xb9\x63\xd7\xf5\x59\xbd\x72\xd7\x4b\x77\xf3\xd2\x78\x08\x45\xca\x7f\xda\xa6\x24\x10\x90\x5b\xd7\xe8\x36\xd5\x7d\x2d\xeb\x6e\xa2\x60\x58\x48\x74\xec\xa7\x26\x95\xa1\x5a\xb7\x7d\xef\x07\xef\x87\xa0\xe9\x5e\x2b\xd3\x28\xaf\x1b\x15\x62\x25\xd0\x3f\x26\xde\x83\x88\x5d\x64\xe7\x38\xfa\xbf\x4a\x3e\x3c\xb1\xe9\xde\x6e\x6e\xe2\xfd\xf9\x84\xb0\x9c\xf7\xa5\xdb\xbb\x33\xbe\x1b\xcc\xfb\xd0\xfd\xbc\xb3\x46\xdb\x5b\xb0\x27\x14\x10\x37\x1d\x3d\x30\x3c\x88\x5a\x06\x6a\x80\x95\x21\x6f\xd3\x84\xa1\x60\x85\x52\x43\xda\x1e\x8b\xaa\xa9\xa2\x13\x27\x64\xcc\x38\x39\x0d\x3e\x8c\xb2\xf5\xc0\x84\x7e\x54\x3d\x28\x7c\x5a\x29\x6d\xb8\x6c\x4f\x2d\x70\x63\xd3\x8c\x51\xf4\x78\x1d\x7b\x55\xf4\x9c\x37\x2d\xfd\xde\x2b\x87\xa9\x6f\x59\x88\xe6\xf3\xcc\xaa\xd3\xdd\x84\xb2\x5a\x6b\xae\xab\x9a\xb3\xd3\xae\xae\x33\x74\xda\xcd\xc7\x86\x86\xc2\xed\x42\x79\x22\x0b\x64\xd7\x07\xbd\xb2\xa1\x6f\x42\x15\x7d\xf8\x45\xd4\xa1\x52\x71\xe5\x82\x17\x9f\xa3\xa7\xb0\x2d\x36\x8c\xc0\xd9\x80\x39\x59\x7f\xf8\x21\x59\x1d\x97\xaa\xd5\x38\x0d\xcd\xd4\x1d\x3c\x28\x82\xac\x85\x73\x2e\xdb\xfa\xb0\x3d\x39\x06\xba\x34\xd9\xa8\x5d\xd4\x5d\x82\x60\x1f\x55\xb3\xc3\x88\x1f\x93\x96\xb7\x03\x9e\xcc\x58\xcb\x58\x12\x38\x6b\x7d\xba\x2b\x8e\xec\xc7\xcb\x6e\xb3\xbe\x32\x27\x39\xaf\x88\x11\x72\xff\xe9\x02\xc7\x7f\xb9\xf1\x8c\x2c\xa0\x49\xe1\xb4\x02\x47\xc7\x95\x33\xc1\x62\x3b\xdf\x2c\xc4\x12\xc9\x53\xd5\xda\x53\xbf\xaa\xba\x61\x8e\x32\x95\x92\xb2\x64\x4a\x4f\x6e\x63\xac\x2c\xeb\x06\x0d\x96\x36\xca\xb7\x45\x67\x73\xeb\x71\xad\x4f\x73\xae\x6b\xbd\xb3\x45\x1d\x1a\xca\x0a\x5f\xc0\xb8\x35\x26\x59\x1a\xbd\x36\x37\x38\xfe\x3e\x7f\xfd\xcc\xf0\xcc\xe2\x7c\x7e\x66\x3b\x45\x7f\xc8\x64\xfe\x59\x9a\x74\x3b\xe1\x2d\xd8\x86\x62\xe5\xa7\x63\x14\xb7\xa5\x3f\x0d\x29\x09\x78\x83\x27\xeb\x01\x3d\xe5\x47\xe7\x8e\xee\x31\x71\x0e\xc4\x58\x29\x15\x31\xb6\x9b\xd7\xdb\xc5\x3b\x71\xce\xb4\xce\x71\xf5\xfa\x7c\x97\xbc\xbd\x7b\x3d\x19\xce\x31\xf6\x6b\x87\xf9\x0d\xe1\xd8\x60\x71\x6a\x52\x12\x45\x3d\xd2\x44\x2b\x4c\xa1\xc0\x3c\x78\x17\x7a\x0f\x86\xa9\x07\x49\x34\x9e\xd8\x01\x79\xda\x5e\x5e\x6d\x2c\x13\x8c\xb3\x1e\xe4\xe1\xe8\xfc\xc3\x96\x8b\xdc\xe5\x74\x17\xa5\x13\xd8\xea\xe8\x43\x32\x0c\xc3\xb4\xdb\xed\x76\x4b\x9f\xe7\xc2\x27\xfc\xaf\x17\x7c\xd6\xfa\xcd\xfb\x77\xeb\x67\x11\xab\x37\x31\x1f\xcf\x16\x75\xe0\x0f\xeb\x0f\xef\x97\x87\x4f\x1f\xcf\xf8\xda\xcd\xbe\x98\xf6\x45\xaa\xf3\xc9\x43\xd2\x5a\xd7\xec\x6a\x86\x2b\x5f\x69\x5e\xef\xc2\x31\xd4\x1c\x98\x91\xc3\x50\x96\x60\x2c\xf2\xe0\x4a\xa0\xf3\xa6\x18\xa5\x32\xdc\xac\x4b\xcf\x1e\x13\xe5\x55\x6b\x4d\x4b\x47\xbf\x03\x05\x1d\x3d\x40\x5e\xd6\xca\x36\x5b\xee\xb9\x76\xc8\xe3\xed\x31\x30\xd0\x70\x2d\x54\xac\x45\x45\x9d\x5d\xb3\xc1\x67\x1c\xfc\xdf\xbc\xf6\x3b\x7f\x7f\x1b\x45\xd7\xa2\xdf\xf9\x0f\xef\x3f\xdd\xa5\x7a\x75\x1c\x76\xe5\xe8\x03\x0b\x05\x06\x79\x07\xd8\x3c\x95\xe6\x03\x54\xa0\x98\xb6\x73\xd4\x4b\x91\x25\xf3\x4f\x2c\x79\x53\xad\xe4\xf1\x38\xa9\x39\x35\x45\xb8\x4f\xd2\x74\x7c\x74\xf1\xfb\x7e\x1b\x9d\x0b\x9f\xf2\xa2\xbb\x5b\x70\x7b\x77\x9b\xd9\xec\xf8\x20\x57\xfa\x54\x65\xfe\x24\xd3\x23\x70\xc1\xfb\x4d\xe3\x83\x9b\x44\x9a\x07\x17\x89\x84\xab\xf4\x10\xd7\x06\xf3\x84\x80\x38\x73\x81\xcf\x11\xc6\xe7\x27\x83\xf6\xbb\xdb\xbb\x55\xdd\x94\x38\x65\xf5\x69\xef\x81\xc0\x8f\x49\x06\x4f\xfb\xcb\xb1\x31\x95\x94\x7f\xec\xeb\x7a\x43\xcc\x34\x80\x72\xc2\x00\x4e\x15\xa8\xe2\x77\xb0\xf8\x3b\x16\x2f\x7b\xa7\xd9\xcf\x7a\xa7\x11\x2e\x1f\xfd\xd8\xbf\xcb\xc8\x7c\xd2\x7a\x55\x4f\x07\x51\x47\x04\xa8\x08\x45\x56\x77\xca\xa9\x6e\x6a\x9c\x6b\x4d\xb7\x28\xf3\x9f\xb8\xe2\x65\x0d\x69\xe6\xb6\x61\x08\x2d\x07\x14\x20\x46\x03\xdf\xab\x08\x86\xcf\xd2\x2e\x72\x09\x71\xf2\x5d\x72\x1f\x51\x97\x3f\xe7\xd6\x66\xf7\x9f\xee\xd2\xf5\x42\xd3\x7a\x52\x9a\xfe\x6e\x23\x49\x3f\x72\x11\xea\x5c\x19\xa9\x59\xce\x71\xd6\x54\xe1\xb0\x05\x25\x0b\xdd\x6e\x1f\x3a\x06\xd0\x76\x0b\xd8\xb6\x9a\x8e\x7a\x83\x03\xe4\x96\x71\x60\xc2\x7e\xe4\x9a\x0f\x80\x9d\x98\x0b\xea\x60\x60\x4d\xbc\xe7\x9e\xea\x41\xb7\xfb\xc7\x64\xf1\xae\x68\x22\xa7\x4c\x5f\x46\xfb\xb6\x00\x37\x3f\xa6\xbf\x07\xf3\x34\x99\xff\xe7\xc3\x5f\x81\xdf\x83\x1f\x36\x83\x20\x14\xe4\xce\x9a\xce\x37\xe1\xa8\x8d\x00\xe3\x46\xbb\xb2\x08\xe3\xa9\x09\xda\x1c\x53\x9a\x26\xa0\x80\x3f\x25\xeb\x43\x11\xe8\xd4\x86\x44\x02\x08\x5a\x50\xa6\x34\x5f\xd6\x95\x7d\xfc\x6d\xc5\x99\xcf\xf3\x8a\x95\x11\x3d\xa5\x7e\x0f\xde\xc4\x85\xe6\xf6\xee\xed\xf7\x37\x54\x08\x55\x57\xad\x24\x53\x8f\x7a\xef\x64\x9d\xa2\x69\x97\xa7\x78\xda\x6d\xc4\x1f\x77\x4a\x95\x75\xa9\x40\x1d\x4c\xd8\x8a\x23\x70\xa0\xca\xf2\x50\x02\x76\xda\x01\xb6\xa5\x91\x17\x7d\x7c\x34\x37\x78\x3d\x7c\xa5\x3f\x84\xeb\x90\xd4\x75\x9a\x84\x64\x3d\xfc\xb1\xb5\x6e\xc3\x7f\xda\xad\x7c\x92\xa4\x2b\x3e\xc7\x81\xeb\xdd\xd2\xcb\x99\xe7\xed\x85\x58\x96\xde\xcd\x3f\xd2\xbb\xdb\xbb\xdb\x1b\x3a\xb5\x54\xef\x69\xde\x94\x54\x85\xe3\x41\xd5\xa0\x5d\xef\x4e\x76\xda\x57\x50\x6d\xd1\xe8\x10\x93\xeb\xad\x9f\xba\x94\x2e\x3d\x67\xfa\x28\x56\xfd\x46\x27\xff\x3a\xa1\x57\x0e\x7b\x67\x5f\xa5\xf7\xef\xd6\x67\xd2\xc6\x93\xb4\x66\x94\xbb\xbb\x44\x96\x6f\x3e\xde\x7e\x39\xbb\xc4\xdf\xbf\x5d\x52\xc5\x4f\xf7\xf3\xff\xa6\x28\x72\xac\xc1\xb1\xc2\xaa\x2a\x82\x06\x55\x1e\x76\x95\x70\xa8\xcc\x4d\x2e\x8e\x9d\xb4\x65\xdd\x6b\x2b\x81\x81\x46\x18\x6e\xf7\x7d\x19\xe6\x14\x10\x94\x7b\xcb\x37\x5a\x28\xa5\x25\x67\x18\xbb\x52\x41\x56\x96\x45\x2e\x2a\x43\x30\x91\x85\x2e\xea\x69\x17\xf0\x1c\x40\x72\xd0\xa6\x66\x62\x53\x53\xa4\x24\xb4\xa0\x0a\x42\x42\x4d\x91\x2d\x6b\x60\xc3\x21\x49\x7e\x1b\x75\xd2\xdd\x95\x2e\xcf\x1f\x5e\x54\x40\x17\x9e\xde\xc7\x4f\x51\xe1\xf1\x36\xe2\x95\x6e\xef\xbe\x21\x73\x14\x4b\x52\x3f\x7e\xf8\x72\x5d\xce\xc9\xae\xa4\x8f\xd2\xc8\xcd\x71\x63\xfc\x03\x76\x69\x15\x20\x05\x7d\xc0\x51\x73\x6b\x3e\xf6\x27\xe8\x31\xe1\x5b\xee\xf2\x02\xc0\x12\x8a\xa5\x63\x7a\x3e\xea\xb0\xb8\xe3\xc8\xe0\x37\x7c\x4a\xd2\x4a\x86\x7e\xfe\x9b\xc2\x29\x51\x56\x69\xad\x95\xa5\x29\x62\xd4\xed\x8f\xa8\x2c\x2b\x48\xd3\x5c\x86\x5e\x85\x4e\x4e\x9d\x52\x07\xad\x47\x95\x6c\xd2\xfe\x57\x73\x5f\xaf\x38\xaf\xbf\x8e\xfb\x5a\xac\x50\x40\x69\xe1\x83\xf5\xc1\xf8\xb4\x0c\xd1\x97\x6d\x48\x21\x80\x61\x3f\xd5\xf3\x99\xa7\xd1\x75\x65\xaa\x56\xdb\x69\x0b\x53\xcc\x39\xc2\x90\x57\x70\x6b\x3b\xdb\x7b\xd0\xc0\x50\xfc\xcb\xf8\xaf\xeb\xd4\x3d\xe9\xef\xfd\x90\x54\x5f\x55\xdf\xbb\xff\x19\x92\xfe\xd3\xdd\xa7\xfb\x6b\x49\xbe\x85\xb1\xb0\xc8\xa5\x66\x34\xdb\x9e\x70\x86\xa6\x22\x3d\x9c\x76\x69\x9e\x96\xdd\x38\x52\x23\x18\x94\x12\x9d\x74\x66\xb7\xee\x70\x98\x7f\x86\x9d\xe2\xc5\x63\x12\xb6\xe5\xb8\x3d\x2a\xea\x88\x5a\xb4\xf7\x1c\x0b\x49\x40\xea\x49\x6b\xcf\x29\xdb\x19\xeb\xf2\x62\xd1\xe1\x9b\x1a\xa9\xf9\x59\x7b\x2f\xad\x1f\xd9\x4d\xbf\x21\xc9\xbf\x7a\x72\x62\x5e\x66\xe1\xd3\x1e\xf4\xf1\x0f\x9f\x16\x72\xe8\x5d\xbc\xbf\x96\xe9\x05\x6e\xef\x6f\xbf\xff\xdd\x9b\xb7\x1f\x3f\xad\x3f\xdd\xbf\x7d\x73\xff\xf6\xe3\xfb\x33\xe6\x60\x8e\x6d\x6e\x48\xb0\xf3\xac\x72\x48\x57\xb9\x83\x36\x68\xde\xa9\xc8\xa9\xab\x53\x63\xf1\xb8\x9f\xe4\x6e\x37\x0c\x73\x1e\x75\x52\xf1\x69\x43\x02\xd6\xa7\x7e\x9f\x13\x41\x5a\xca\xf8\x2e\xc3\x1a\x6c\xff\x58\xaf\x87\x9f\x0c\x82\xeb\x5d\x37\xff\x09\x6a\xbb\xdd\x6e\x43\xbb\xdd\xc6\xa0\xe2\x26\xce\x27\xbf\xa1\xe7\xfd\xee\xe2\x78\x17\xc7\xfe\x29\xcd\x7a\xe6\x15\xbf\x42\x3f\x2f\x9e\xbe\xd7\x22\x23\x3c\xdb\x05\x0c\x8b\x34\x7f\x20\x69\x51\xc2\xd0\xf8\xb4\x9e\xc4\x7c\xf8\x6c\x1b\x14\xb7\x9c\x97\x52\xd0\x20\x6c\xda\x4e\xac\xf2\xda\xd9\x26\x43\x4e\x58\xee\x36\x74\x1a\x10\xb6\x16\x23\xc0\x78\x18\xf8\x34\x04\x19\x7a\x31\xa7\x47\x04\x54\xa6\x0e\x2d\xea\x0d\xf5\xce\xd6\xac\x5e\xbc\x4c\x93\xa8\x11\x6d\xcf\xca\xa6\xff\xf1\x8c\x7d\xb9\x58\x99\x2e\x12\xb4\xd7\x60\xc4\x97\x58\xa1\x9b\x0f\x3f\x7c\x59\x26\xd7\xdb\x62\x59\xfb\x97\x3a\x5e\x76\x46\xb0\x80\xb3\x64\xcf\x43\xbf\x08\x7b\x7a\x10\xf5\x58\x31\x15\xd4\x48\xa5\x1a\x19\x0e\x9e\x29\x4a\x4b\xca\x60\xd9\xef\x25\xa8\xf6\x11\xab\x41\x7b\x27\x69\x4a\xcb\xca\xe3\xaa\x38\x1c\x0e\x53\xe5\x34\xd7\x6e\x7d\x70\x41\x39\xcb\x79\x18\x6d\xd8\x1b\xc1\x04\xb1\x5c\x4b\xd3\x83\x2a\xd4\x92\x15\xb6\x28\x89\x34\x42\xe9\xfa\x60\xbd\x9c\x8e\x41\xf0\x03\x30\xa0\x4c\x87\xa8\x2d\x15\x94\x73\x61\xf4\x3e\x34\x88\x2a\x8e\xe3\xbc\x83\xb1\x1e\xe2\x93\x4f\x4f\x4a\x3e\xff\x3e\xf9\xa7\xa8\xe9\x79\x91\x72\x3b\x23\x32\x5f\xc4\xb1\x6f\xef\x3f\xdd\x3f\x15\xd9\xaf\xaf\xfd\xcd\x59\x32\x60\xfd\xf6\xe3\xa7\x9b\x27\xfc\xe2\x33\xa5\x65\x4d\x09\x04\xfb\x50\x01\x2d\x44\xb0\xa0\x96\x0a\xd1\x4a\x22\x16\x0e\xfe\xe0\x80\x89\x93\x93\xb6\x4e\xd0\x14\xc2\x4a\x47\x7a\xb9\x4b\xf3\xfd\x7e\x3f\x2d\x72\xaf\xc5\x24\x97\xe7\x8d\xa7\xcc\x8a\xc1\x0c\x7c\x12\x0b\x67\x18\x8d\xe3\x63\x92\x51\x6e\xf8\x6e\x1a\x83\x3c\x5f\xf9\x1e\xa3\xd0\x8a\xb0\xe5\xc6\x70\x3e\x70\x3e\x8d\x17\xf5\xc1\x65\xcd\xb8\xe0\x55\xe7\x9c\xea\xef\x92\xbf\x4f\xfe\xe1\xaa\x5f\x73\x7f\xee\xd6\xfc\xf8\xe1\x3e\x3a\x65\xbc\x5b\x7f\x83\x2b\x9f\x1e\x2e\xbd\x9b\xa1\xa9\x4a\x80\x1e\x0a\x00\x21\x72\xe9\x88\x8a\x90\xa3\x32\xf4\xd9\x3e\xc8\x39\x11\xf7\xd3\x2e\x45\x81\xf9\x79\xe2\xce\xc7\x7a\x4f\x30\x62\xdc\x1a\x6c\xad\xe0\x9d\x26\x82\x1f\x27\xa5\xdc\x6e\xe7\x14\x30\x36\x68\x33\x9f\xa3\x3e\x73\x0f\x2f\xb9\xd7\xbf\x7b\x9d\x7b\x5d\x75\xe1\x96\xec\xe3\xd2\xe3\xf9\x21\xbb\x7f\x66\x22\xc6\x0d\xea\xb2\x4b\xbd\xff\xfc\xe5\x5d\xb2\x8e\x1e\xf5\x5b\x1a\xc4\x54\x23\x70\x00\x07\x4f\xa5\x93\xa1\x11\x44\x13\x11\x06\x89\x0d\x11\x19\xab\xa5\x85\x55\x18\x8a\xf2\xff\xe3\xec\xed\x81\x24\xc7\xf5\x3c\x31\x82\xcc\xcc\xca\x77\x77\xbb\xc7\x9a\x9a\x9e\xe6\x5b\xc5\xee\x63\x6d\xcd\x4c\x61\x77\xef\x03\x77\x7d\xdd\x8d\x88\xd5\x9d\xb0\xa7\x08\x09\x17\xa1\x90\xa0\x93\x14\x01\x47\x21\x44\x9c\x14\x42\x84\x0c\x21\x42\x0e\x4c\x98\x30\x61\xc2\xa4\x49\x93\x26\x4d\x9a\x34\x69\xd2\x4c\x33\xcd\x34\xf3\x4d\x25\x51\x0a\x82\x99\x55\x59\xdd\x3d\x6f\xdf\x6e\x77\x33\x33\x3b\x33\xab\x48\x80\xf8\xf8\x7f\xfc\xfe\xbf\x5f\xca\x02\xe9\xc1\x96\x87\x7a\xb7\xb5\x81\x50\x40\x6d\xe0\xe0\x50\x6e\xbb\x1e\x36\x95\xaf\xca\xa3\x73\xba\x01\x5b\x2d\x6d\xd8\x87\x01\xa0\x23\x22\x1b\x63\x4c\xe1\x08\x6e\x0c\xd7\x4c\x48\x2a\x04\x12\x8a\x49\x19\x64\xd5\x31\x82\x91\xa0\xd6\xb3\xda\x81\x24\xec\xa4\x27\x8d\x25\xac\xc8\x35\x53\xf9\x56\xab\x0e\x56\x22\x17\x12\x85\xbd\x2f\x21\x89\x7e\xdd\x3a\xf2\x14\xfa\xa8\xad\xf9\x5a\xc9\xfb\xe3\x52\x43\x76\xff\xee\xfe\x2f\x22\x25\x49\x34\x41\x1e\x23\x67\xfe\xea\xe6\x11\xfc\xfc\xb8\x7e\xf7\x65\x2c\x25\x2b\x52\x04\x9c\xee\xc7\x6d\x0e\xea\x60\xb0\x29\x51\x61\x4b\xc1\xc4\x48\x82\xec\x6b\xf8\x9c\xec\x59\x9a\xe7\xdb\x50\x67\xd2\x4f\xd4\xfb\xb4\x9d\xe8\x7c\x6c\x12\xc8\x4c\xac\x29\x31\xa6\x43\x8d\x1a\xdb\x23\xc2\x86\x62\x06\x06\x2e\x4a\x3f\xb5\xa7\x5a\x88\x8c\x87\x3e\x3a\xed\xeb\x74\xb6\xdf\xea\x8d\x8e\xb6\xc5\x9f\x25\xbf\x8b\xd5\xae\x17\x68\xc9\x6c\x24\xdf\xfc\x05\x88\x4b\xc4\x12\x59\x7c\xbf\x68\xc9\xbd\xd5\x74\x5f\x11\xe7\xc2\xd1\xda\x14\xd3\x34\x06\xc2\x39\xd3\x9a\x51\xc1\x2b\xae\x07\x52\x0e\xe5\xc4\x80\x77\xf3\x42\x9f\x26\x4f\x32\xdd\x06\xb9\xd1\xa7\x22\xab\x4f\x36\xdd\xbb\x50\x1d\x04\xc2\x96\x5a\x46\xb1\x61\xba\x27\xb6\x6d\x4e\x4d\x55\xb9\x4b\xa8\x25\xc9\x22\x2f\xa1\xdb\xa0\x57\x06\xa8\xb7\xc9\xa0\x75\x74\x1f\xce\xfa\x56\x70\x85\x43\x99\xe6\xd3\xa1\x9a\x0e\x69\x1e\x68\xe6\xfc\xec\xc6\x4f\x42\x96\xbe\x94\x1b\xe4\x4f\x47\x3f\x8f\x6d\x9f\x6d\x15\x0e\xfd\x48\x41\x02\x92\x70\x08\x07\x04\x60\x3c\x5d\x92\x26\x55\xe2\xd2\x6e\xdd\xbf\xda\xb4\x0f\xf3\x9d\xf9\x70\xfb\x90\x76\xd5\xde\xfb\xfd\x7e\xdd\x3f\xe5\xa6\x5f\xe3\x13\xcc\x48\x92\x26\x3e\x71\xa9\x5c\xf7\xc9\x3a\xf9\xcd\xb2\x1f\x9e\xbf\x2d\x43\xef\x7d\x55\xad\xfb\x27\x3f\xac\xf1\xa9\xcc\xd8\xd2\x1e\xfd\x4c\x6f\xd4\xa6\x8c\x18\xf4\xc7\xf9\x27\xce\x66\xe8\xed\xec\x1f\x81\x0f\xb7\x97\xbf\x0b\xc8\xf6\xe1\xe3\x19\x6c\x9b\xb5\x8d\xab\x57\xcc\xcf\xde\xd7\x84\x7d\x5b\x75\x3e\xd4\x83\xf7\x13\xf4\x43\x68\x56\x38\x0c\xd3\x6e\x11\x7a\x3d\xa6\xfb\x50\x00\xde\x87\x3e\x1c\x62\xf5\x7a\x1e\x44\xa0\x00\x4f\x3b\x0e\x86\xd0\x81\xf6\xb5\x9d\xfe\x1b\xd7\xed\x43\xe5\x7d\xdf\xaf\xfb\x27\xd7\xbf\x5e\x77\x9a\x34\x89\xcb\xca\x2f\xbe\x3f\xbb\x12\x65\xc0\x75\x3d\x9b\x51\x97\x9f\x98\xbb\x25\x49\x13\x9b\x38\x70\x58\xb7\x5f\xf7\x23\x38\x38\x66\x2d\x63\xeb\xf6\xa9\xb4\xc3\x1a\x9e\x60\xc6\x23\xff\x24\x8b\x78\xcc\x05\xc5\xf8\xe1\x85\x25\xff\xc3\xb9\x72\xff\x42\x64\xbe\xc0\xba\xd7\xe7\x70\xd6\xfa\xfd\x6a\xfd\xfd\x0f\xf7\xe5\x62\x7c\x94\x3f\xff\x7b\xf0\xe1\xdd\x8f\x5f\x21\xac\x77\xde\x12\x68\xf0\xde\x9f\xa4\xdf\x17\xd0\x10\xa4\xc3\x90\x25\x53\xe2\x62\x28\x45\xe2\x60\x03\xe5\x00\x03\xc2\x73\x57\x9a\x20\x03\x37\x1e\x54\xa0\xf3\x93\xf4\x3e\xf5\x93\x9c\x8f\x8d\x69\x99\x20\x6a\x41\xd1\x21\xc4\x38\x1f\x43\xa7\xf9\x51\xd3\x72\x36\x86\xb1\xa5\x58\x8e\x04\x06\x3e\x35\x10\xa6\x6c\x14\xa1\x17\xaf\x7d\x4d\xd7\xdd\x37\xc6\x14\x75\xd6\x39\x6b\xd7\xdd\x53\x61\x87\x35\x3a\xc1\x8c\x25\x69\x52\xc7\x31\xf5\xad\xef\x4b\x57\x39\x57\x55\x6f\xbe\xbf\x4d\xf5\xb3\x8e\xd8\xac\xdf\xbc\x89\xdf\xfe\xeb\xeb\x9c\x3a\x38\x67\x98\xae\x23\xb8\x5f\x83\xc9\xd2\x43\x2a\x25\x6b\xb8\x00\xec\xc9\x83\x52\x52\x4b\x54\x63\xfd\x20\xc7\x34\xef\x2b\xe5\x5b\x50\x99\x5f\xc6\xca\x57\x15\x80\xd6\x82\xd2\xb9\xd5\xbe\x1b\x70\xe7\x5d\x9a\x47\x61\x87\x50\xf0\x83\x51\x55\x63\x1b\xdd\xda\x60\xa7\xce\xda\x94\x4c\x5d\x4c\xb6\xc5\x23\x79\xc5\x38\xff\x63\xe2\xa7\x0f\xb7\x2b\xe6\x0b\x08\xea\x79\x81\x37\x01\x6b\xc0\x79\x30\x5e\x05\xab\x01\x9d\x6f\x1b\xe8\x19\x0e\xad\xd0\x6a\x4c\xed\x7e\x0b\x6b\xb8\x3d\x6c\x4c\xc9\xa8\xf1\x6a\xda\xfb\x30\xea\xba\x02\x55\xa8\xf7\xa6\x07\x89\x4f\x0b\xa3\x8d\x50\xcd\xa9\x01\x76\x57\xd7\xbb\xa0\x97\xfb\x55\x9f\xe7\xc6\xd7\xfd\xef\xab\xa6\xaa\x9a\xe6\x8b\x35\x60\xfe\x7e\xfd\x8d\xb9\x54\x07\xef\xfd\x30\x7c\x35\x97\xe6\xf1\xb0\xbb\xfe\xfd\x2f\x38\x8b\x9d\x0f\x07\x1f\x75\xd7\xdf\x9c\x62\x39\x47\xc6\xbf\xf5\x33\x19\xaf\x82\xab\xa2\x5e\xf8\x97\x3f\xd3\x25\x2e\xcb\xbf\xf9\x33\x79\x15\x0e\x55\xf5\xf5\x79\x36\xa9\x8f\x5a\x82\xf8\x4d\x1d\xc8\x79\xd5\xbd\x7d\x59\xf5\x6f\xcf\x19\x81\xec\xe1\xf6\x43\x5c\x8a\xa3\x58\xdf\xed\x43\x3a\xac\x5c\xa8\x00\x0e\x3d\xf0\x4f\x09\xa8\x42\x0f\x70\xf0\x69\xe2\xe7\xa5\x30\x95\x55\x18\xbc\xf7\x7e\x83\x5d\x68\xa6\x22\xd4\xce\x01\x9e\xee\xcf\x10\xe0\xf2\xc2\x21\x77\x62\x11\x52\x95\x64\xc9\x6c\x5b\xa8\x0c\x27\x79\x5c\x15\x22\xf2\xf3\x6d\x04\xe9\xf6\xb2\x6d\xea\xcd\x31\x8c\x4c\x53\x52\x72\x06\x7f\x19\x56\xe5\xa4\x7c\xd4\x9d\xcd\xb0\x9b\xf8\x52\x1a\x9c\xba\x3a\x60\x91\xc2\xd0\x75\x49\x16\x63\x77\x75\xb4\x5b\xee\x63\x56\x21\x96\x04\xdf\xdc\xbf\xfb\x7e\xb1\xa7\xbf\x8b\x5c\xa3\xd7\x27\x7b\xd1\x5b\xbd\x5f\x6d\x01\x02\x39\x0d\xbb\xb0\x53\xa9\xc4\x3d\xb7\x7e\xa8\x07\xbe\x6b\x39\xe3\x16\x56\x18\x05\xc2\xc1\x3e\x8c\x61\x10\xc0\xb8\xd0\x6d\x0c\x11\x5e\x91\xfd\x21\xaf\x1b\xaf\xf6\x3e\xe8\xbe\xd9\x83\x71\xf2\x52\x96\x75\x81\x57\x64\x57\xa1\x69\x37\x5a\xb0\x8d\x9a\xed\x20\x39\xac\xc9\xcd\x36\x62\x03\x92\xbb\x73\xf5\xd1\x3c\x17\x0e\x2e\x45\x3e\x85\xfe\xf7\xfb\x8d\xf0\x4d\xe3\xc3\x2e\x59\x67\xc9\x33\x3b\x6b\xe6\x17\xc9\x5f\x24\x30\xf9\xbb\x2b\x36\xd5\xcd\xbc\x35\xbe\x7f\x49\x95\x7e\xb7\x04\xe0\x7f\x07\x36\x31\xf2\xf4\xf8\xe9\xa7\x85\x0a\xf3\x87\xbf\x05\x37\xb3\x51\x12\xf1\xb9\x1f\xbe\xbf\xf9\xe1\xfd\x9a\xdb\x6d\x49\x10\x2f\x4b\xc4\x85\x07\xda\xe4\xb0\xe1\x94\x20\x22\xeb\x49\x6b\x59\x8b\x86\x1b\x48\x1c\xe7\x4d\xca\xfd\x7e\x4f\xb8\x46\xb4\xdb\x31\x48\xad\xdf\xda\x9c\x88\x8d\x29\x2b\xc7\xa8\xa6\xa8\xb1\x02\x60\x60\xcb\xbe\xee\xac\x64\x56\xcd\xff\xd3\x34\xb4\xbd\x39\xec\x89\x33\x4f\xc7\x74\x6f\xed\x3e\x0f\x07\x1b\x74\xe1\x7d\x37\x3a\x0e\xf2\x94\x74\xd5\x2e\xae\x9d\x60\x85\xbe\xa8\x7f\x3d\x47\x6a\x96\x10\xcd\xeb\xfe\xb8\xc2\xae\x73\xbd\x73\xfd\xe0\xdc\x44\x7d\x17\x9a\xf5\x18\xb6\xf3\xb2\x0d\x8e\x13\xa1\xa7\x31\x15\xa7\x96\xa7\xc7\xc9\x67\x30\xd6\xc0\x27\xff\x98\x1a\xf8\x2f\x25\xaa\xff\xbe\x1a\xf8\x02\x8c\x0b\xca\xbd\xa1\x8c\x18\x1c\xd4\x74\x2c\x8f\x87\x18\x4e\x81\x63\x0c\x9c\x38\x50\x4c\xfc\xf2\xaa\x28\x8a\x61\x32\x59\xe1\xf7\x7b\xaa\x24\x2b\x95\x2c\x4f\x7b\x40\x19\x33\x84\xff\xc3\xeb\xe0\xa3\x40\xf5\xec\x03\x67\x6f\xf3\xca\xff\xea\xcc\xb0\xf6\xeb\x79\xe5\xc7\x87\x2f\xf2\xca\xff\x01\x7c\xfc\x77\xe0\x1b\x89\x65\x3d\xdb\x1f\xc0\x45\x49\xa2\xa0\xd3\x71\x82\x80\x50\x28\x10\x65\x46\x51\x6c\xa8\x30\x52\x08\x65\x1b\xac\xab\x70\x10\x04\x49\x48\x53\x42\xa1\x84\x54\xc6\xff\x7c\x3b\xb1\xcc\xaa\xca\x8f\x65\x38\xb4\x5d\x27\xdb\xa6\x33\x4a\x8e\x5b\x08\xe8\xc8\x04\x11\x6c\x1b\x1f\xc3\x81\x73\xc2\x59\xcc\x75\x2d\xfa\x18\xef\x93\xbf\x4e\xfe\x43\xf2\x3f\x27\xff\xe5\xf5\x0e\xde\x7e\x7f\xf3\xb2\x9b\x24\xbf\x05\xf7\xef\x5f\x7d\xe5\x4b\xb2\xfc\xa7\x37\x0a\x28\xcb\x7b\x77\xf1\xbd\x37\x6f\x5d\xbe\xf6\xfa\x83\x59\x02\x8e\xf1\xd6\xe6\x12\xb4\x3c\x38\xab\x03\x25\xa0\x00\xdb\xb0\x65\x8c\x11\x24\x11\xa1\x98\x5a\x25\x08\xe3\x94\xa6\x23\x63\x18\x0a\x88\x08\xa1\x94\x08\x46\x08\x25\x54\x31\x8a\xa1\x94\x18\x33\x8c\x19\x21\x98\x10\x3a\x09\x4a\xd1\xfc\x3d\x49\xa5\xa0\x94\x30\x42\xd6\x5d\xd7\xd9\x50\xf5\x55\x20\x43\xd5\x03\x1d\x88\xf6\x14\xb4\xe0\x08\x04\x47\x84\x33\xc6\x19\x26\xca\x1a\xac\x90\xc4\xd0\x20\xc2\x28\xa3\x14\x13\x45\x88\xc2\x12\x09\x0c\x83\x23\x94\x73\xde\xce\x67\x24\x02\x49\xc4\x29\x26\x08\x33\xce\x38\x93\x4a\x2a\x2c\xb1\xc0\x28\x49\xc0\xba\x88\x75\x0b\x6a\x5e\x6b\xbf\x5d\x6b\x9e\x3d\x7e\x77\xfb\xb0\x96\xda\x82\x12\x4a\x05\x61\x89\x31\xcd\x4b\xbf\x97\xbd\x5e\xe7\x40\x84\x6a\xda\x4e\xa3\xcb\x5d\xae\xc6\x8c\x6d\x4f\x38\x38\x09\x58\x66\x93\xe4\x37\x09\x7b\xa6\xab\xb7\x1c\xee\x7f\xf7\xa2\x86\xff\x4a\x3c\xbc\x70\xb8\x3f\x7c\xfc\xf0\x35\x87\xfb\xaf\x52\xb8\xdf\x3c\x7e\x7a\x7f\xf6\xe8\xa3\x57\x6f\xfd\xce\x1f\x8f\x7e\xe7\xf7\xfb\x7e\x36\x3a\x6c\x5d\x03\x0d\x9a\xc0\xa2\x36\x86\x85\x6d\x5e\x18\x58\x00\x15\x7c\x94\x4f\x98\x0f\x34\x11\x4f\x45\x67\x8e\xf3\x9f\x5f\x65\x6d\x97\x08\x42\x4c\x9d\x34\xd2\x4a\x87\x53\x4a\xe5\x80\xa4\x8c\x9c\xed\x32\xee\x57\xfc\x59\xac\x92\x8d\x4a\x7e\x38\xe7\x5c\xdf\x9f\xf9\x30\x5f\xdc\xa5\x87\xc5\x96\xb9\x6c\xc3\xa0\x70\x79\xe9\xfd\x6c\x3d\x03\x7e\x32\xc0\x75\x98\x6a\x9b\xee\xa6\xea\x42\xef\x59\x2a\x35\xef\xa6\x2e\xf4\xce\x01\xec\xa4\x1a\x27\x3c\x35\x26\x1d\x02\x59\x72\x2d\xd9\xfe\xd9\xde\xa8\x2b\x5c\xc1\x15\x6a\xef\x35\x93\x73\x93\x8b\x93\x96\x55\x24\x3b\x3c\x1f\x1b\xfc\xfb\xbd\xf7\x9b\x22\x24\x40\x9e\x2c\x50\xf3\x31\xb7\xc1\x3c\xb3\x1b\x97\xaa\x88\xcd\xfc\xcf\x57\xd1\xf4\xfb\xab\x09\x71\x7f\x3d\x61\xce\xd1\x28\xf0\xf1\xbc\x1a\xbf\x5b\xcf\x6f\x7f\x7c\x78\xbc\xff\xfe\xfa\x5b\x73\xfb\x37\x91\x85\x26\xeb\x62\x12\x31\x23\xd3\x58\x28\x46\xb9\x2a\x6a\xa4\x71\xd0\xf9\x56\x30\xca\x04\xb1\x50\xd1\x69\x07\x98\x05\x32\x6d\xad\xfd\xc5\x9a\xcc\x70\x89\x3c\x64\xe1\xb8\x95\x74\xf9\x8a\x2d\xc2\x71\x75\x0c\xfb\xed\x76\xfe\x15\xa9\x82\x12\xaa\xa2\x28\x28\x2c\x4b\xc8\x8b\x72\xbb\x2d\x4a\x0a\x4b\x58\xb2\x02\xce\xcb\xe3\x51\x05\x94\x83\x4e\x55\x28\xe7\x45\xbe\xdd\x6e\xe3\x57\x51\xc1\xca\xc2\xb9\xbc\x28\xe8\x7c\xbb\x12\x99\x2d\x75\xb0\xff\xfc\x5c\xa5\x73\x85\x33\x00\xfb\x0a\x90\x6a\xde\x4f\x32\x74\x1c\x80\x59\xef\x03\x4c\xd5\xde\x1f\x62\x69\x71\xb2\x5e\xe5\xe7\x1a\xeb\x79\x7c\x5f\xac\xa6\x2b\x4a\xed\xf3\x4d\x59\x2c\xed\x2f\xfc\xfd\x15\xf6\x6e\xe7\xea\x7a\x3c\xc9\xce\x03\xb8\xdb\x81\x83\x0f\xd4\xfb\x8b\xd5\xbc\x36\x87\xc3\xe1\xe0\xc2\xd1\xb9\xa5\xae\x79\xda\x9f\x94\xb5\x99\x0b\x6d\x17\xb6\xd1\x9f\x8b\x35\x92\xe7\xb1\x77\xb6\xfd\xef\xae\x54\xb9\xae\xee\x43\x36\x9f\xf9\xda\xae\x79\x7f\x9e\x61\x0e\x88\x7c\x5b\x6d\x0b\xc0\x82\xdb\x6e\xbb\x96\xd7\x8d\x38\xb2\x23\x0b\x03\xcc\xbc\x64\x36\xda\x56\x64\x92\xf4\x4c\xde\xb5\x6e\xb8\x2c\x38\x73\x79\x41\xb4\xb7\xb4\x66\x86\x0d\x01\xbb\x89\x2e\x09\xba\xb4\x72\x81\xd8\x26\x8e\xd1\xe6\xbc\xd7\xbe\x3b\x47\x8f\xe3\x0a\xfd\xfd\x1f\x7f\x69\xab\x04\xf0\x6a\x0b\x54\x30\xdb\xed\xd0\x28\x5f\xf3\x03\x3d\x90\xd0\xb1\x6c\x6f\x98\xe1\xb4\x14\x02\x4f\x88\xcd\xcb\xb1\x1d\xc7\x75\xd7\x4a\x66\xcb\x5c\x18\x63\xa4\x17\x86\xf7\x01\xba\x89\x28\x9e\xfb\x9c\xa6\xb5\x0b\x85\xdd\x2d\x18\x44\xf9\x2c\x6f\x7c\x5a\xcc\xb3\xe6\xee\x8d\x8a\x77\xf4\xbf\xef\xfb\x8d\x9a\x8a\x54\x4e\x3e\xa3\xc7\x01\xb0\x0a\xf0\xa9\x48\x0b\x1b\xa5\x9c\x23\x3a\xdb\x5f\x69\x68\xa0\x73\x5e\xe6\x6c\x43\x44\xba\xb2\x87\x28\xbd\x74\x6e\xe3\x17\x91\xe5\xdb\x2b\x6a\xff\xcf\x0f\xf7\x31\x35\x03\x2e\x01\xa0\xeb\x88\x73\x0b\x0a\xe2\x10\xe8\x0e\x3c\xcf\xa1\x85\x88\x32\x8e\x71\xd8\x11\x85\x51\x49\x49\x1e\xf6\x25\x94\xb3\x69\xc6\x08\xc2\x68\x07\x0c\x16\xc0\x73\x1c\x8e\xa0\x0e\x7c\x3e\x88\x96\x4e\x98\xd4\x2b\x65\x84\x5e\xb7\x5d\x59\xd9\x41\x52\x81\x19\x74\x10\x05\x16\x8c\x62\x85\x2b\x28\x90\xa0\x82\xa5\xe0\x71\x97\xc6\x4c\x79\x6f\x9a\xa9\x5f\x64\xb9\x44\x67\xad\x6c\x5d\x27\xdb\xfa\x45\x4b\x58\x6f\xca\xe4\x9f\x24\x7f\xba\xe4\x58\xf3\x2c\xe6\x30\xff\xbe\x20\xc6\x8a\x39\xcb\x70\xd6\xba\xe8\x50\xd7\xce\x3a\xef\xc2\x58\x3b\x37\x39\x57\x87\xfd\x8a\x84\x7e\x3a\x04\xc6\x40\x02\x14\x80\xe9\x21\x94\x80\x0f\x57\x71\x0c\x19\x08\xc0\xd3\x8e\x81\x31\x74\xa0\xbb\xdc\x43\x9f\x99\x0d\x8e\xfc\x25\x6f\xb7\x86\xf4\x0a\x47\xb8\x40\x78\x3f\xdc\x66\x32\x24\x2f\x24\x95\x45\xb0\x52\xf9\x4a\x49\x27\x54\x59\x1c\xc3\x01\x39\xf9\x9c\xc8\x0d\x76\xb5\xad\x6d\xed\x42\xef\x4b\x5e\xf3\xae\x57\x84\x18\xe8\x6a\x40\x5c\xe6\xe7\xf1\x6c\x22\x9f\xb6\x49\xfe\xed\x8b\xb6\xcf\xb9\xb9\xef\x1e\x5e\x85\xb9\xbe\x7f\x09\x73\x5e\xa2\x9c\x9f\x5f\xf8\x06\x1f\x3e\xde\xdf\x7d\xf8\x7c\xff\xc3\x35\x76\x69\xd5\x79\xe9\x41\xd9\xe4\x45\x1f\xc4\xbc\x42\x6f\xc1\x10\x94\x05\x25\x09\x7d\x25\x43\xc3\x01\xa1\xc1\x03\x9b\xc7\xea\x4f\xdb\x95\xc8\x81\x52\xec\x60\xa8\x11\xd8\x5b\x44\x0c\x99\x44\x14\x1b\xdf\x98\x25\x5f\x67\x85\xb0\xda\x6e\x31\xb6\x3b\xe6\x39\x80\xcf\x89\xb1\xa6\xb3\xda\x6a\x2b\xb9\x0d\x6d\xc7\x53\x82\xbc\x24\x5a\x29\x4d\xb5\x4c\x56\x19\x3a\xc7\x60\xfe\xcd\xd7\xed\xba\x34\xeb\xcf\xc1\x97\xad\xfa\xf4\xf1\x6d\xb3\x3e\x7d\xbe\xff\x21\xbb\x22\xdd\x5d\x59\xaf\x3d\x40\x2d\xda\x05\x12\xa9\x63\x0e\x81\x79\x80\x48\xa8\x2b\x15\x3c\x07\x94\x07\x0d\x9a\x6d\x70\x40\x07\xd5\x43\xe4\x01\xe6\xc7\x32\x0f\x06\xed\x39\xd6\x48\x64\xda\x61\xa6\xe9\x4b\xab\xe6\x16\x6c\xd5\xdc\x26\x01\x50\x38\xc4\x36\x61\x72\x69\x94\xe4\x3c\x65\xb1\x3d\x4b\xdb\x22\x16\xe6\x70\xae\x5d\xfb\x37\x6f\x74\x0f\x5e\xeb\x0d\xae\x6c\xc0\x2f\x67\xe9\x1f\x39\x49\x19\x40\xb0\xac\x8a\x12\x1c\x9f\x13\x44\xcb\xc2\x22\xc4\x18\xa7\x38\x74\x54\x13\x5c\x50\x5a\x86\x9e\x6a\x3e\x9b\x5d\x04\x11\x78\x04\x8d\xa0\x60\x10\x24\x74\x97\xd1\x48\xb4\xae\xa4\x4b\x77\x56\x1b\xe9\xd6\xad\x10\x25\x63\xd6\x70\x8c\x29\x27\x14\x3a\x88\x03\xb9\x9e\xaa\x54\x72\x81\xe7\x99\xaa\x58\xa7\xde\xcc\x54\x27\x6b\xdb\xc9\xa6\x4e\xb6\x51\x3b\xae\xda\xb0\x7f\x1c\xe7\xee\x25\x85\xf2\x12\x95\x66\x2b\x14\x3a\x80\x9e\x0e\x00\x86\x3e\x15\x3e\xec\xad\x05\x85\x77\xfe\xd4\x66\x6d\x50\x51\xfe\x2b\x94\x60\x17\x94\xbf\x94\x01\x6c\x98\x51\xf3\x6d\x8b\x9c\xbb\xbb\x85\x73\xd7\x4c\x3b\x6d\x9f\x13\x90\x2c\x21\x9b\x2e\xe6\x3a\x7e\x13\x35\x5c\xfc\x86\x5d\xe9\xcf\xcc\xd7\xfb\x2f\x17\x6e\xf8\xdb\x37\x19\xba\x2f\xf4\x68\x36\xd7\x2a\xe6\x8f\x0f\xf1\x76\x2e\xda\x64\x0b\x2d\x15\x9b\x9a\xc3\x0a\x3e\x8d\x7e\xb6\xb4\x2a\x57\x9d\x5c\x36\xaa\xbe\xda\xc3\x30\x8c\x43\x38\x8a\x43\xad\x8c\x04\xb9\x32\xb5\xd8\xb0\x69\x9c\x2f\xaa\x17\xa1\x0f\x22\x2a\x31\xd4\x41\xab\x46\x93\xad\xcf\x15\x47\xae\x24\xa4\x37\x94\xab\x85\xcb\x88\x9c\x75\x30\xff\xeb\xe4\x3f\x46\xe4\xc1\xcb\x88\xba\xf9\xfb\x54\x30\x63\xb0\xf2\xd7\x45\x30\x1b\x40\x61\x04\x8c\x35\x01\x91\x94\xd4\xd4\xa9\x5a\x84\x9e\xd0\x14\x6e\x99\x24\xb4\xa0\xb4\xc8\xb7\xa1\xc7\x7d\x4b\xb6\x55\x21\xc3\x2e\x74\x82\x10\xe1\xe5\x00\x8a\x12\x85\xd1\x13\x68\x21\x49\x5b\x87\x90\x23\x17\x09\xcc\xfe\x45\x00\xb3\xae\x72\x9f\xa3\x3a\x10\x58\xe0\x9a\x8c\x9c\xa8\x34\xa1\xd8\x54\xb5\x45\xfe\x2b\xfd\xcb\x6c\xbd\xf8\xca\xc9\x25\x0e\x03\xbe\xdc\xa7\xc1\xed\x25\x40\xb6\x4e\x52\x4f\x09\xc3\xa8\xc0\x38\x0f\x04\x88\x9d\x31\x42\x6c\x12\xfb\x8b\x53\xac\xb0\x39\x5b\xb3\xd0\x4e\x4c\x67\x70\x1a\x40\xd4\xc0\x91\x67\xdb\xe0\x37\x67\x95\x94\x2f\xeb\x91\xde\x56\x7e\x5c\xe6\x9b\x03\x35\x24\x15\x43\xc0\x9c\xca\x74\xac\x91\x06\x28\x14\x8b\x6a\x5b\x04\x97\xa5\x52\x06\xce\xa1\x87\x6c\x6d\x25\x47\xca\x38\x84\x7d\xe7\xc2\xde\x06\x02\x3a\x0b\x0a\xd7\xd7\xda\xa3\xc8\xb7\xbd\xce\xf0\x55\x1e\xa4\x48\xfe\x3c\xf9\x97\x5f\xe6\x41\xae\x7c\xc1\x6f\x67\x41\x94\x73\xcf\x89\xb5\x69\x41\x52\x58\x58\xe2\x99\x52\xdc\x72\xcb\x65\x47\x8a\x0e\x4e\x12\x68\x1f\x0d\xef\xdd\x53\x0d\x76\xc1\x5e\xe7\x40\xfc\x41\x08\x4b\x8d\x66\x86\x9a\x16\xda\xa6\x3f\xf5\xaf\x19\x90\x34\x62\x39\xdd\xc6\x24\x77\x67\x66\xdb\xd7\xa5\x6a\xb5\x0c\xf8\x17\xe6\xfd\x98\x13\xfe\x36\xf3\xfe\x32\xc8\xb2\x7a\xb7\xef\x9c\x31\x8d\xf7\xbc\xeb\xc2\x21\x8c\xf0\xd0\x77\x2d\x28\x7c\x99\xb6\x53\x41\xf0\xc1\x03\x2b\x45\x24\xe4\x27\x47\xbf\x73\x84\xd1\x46\x1d\x01\x2e\x36\x82\x2a\xa9\x98\x16\x5c\x3a\xab\x2c\x73\x94\x09\x1c\x34\x62\xce\x13\x63\xc2\x19\x11\x0a\xb6\x93\x48\xab\x90\x80\x23\x45\xce\x8c\x0e\x2f\xfa\xa4\xe4\x46\x6d\x74\x72\x9b\xfc\x45\xf2\xe3\x6b\xbd\xe6\xf7\x8b\xc9\x77\xb3\xb9\x79\xfc\x6e\xfd\xe1\xea\xb2\xc1\x05\x15\x96\x3d\x7e\xb7\xd2\xae\x44\x69\xcb\x91\x21\xe5\xd4\x51\xc8\xcc\x08\xf2\x8a\x2a\x25\x4b\xa3\x0b\xd0\x88\xb2\x2a\xc4\xd4\x3b\xe8\xbc\xdf\x68\x64\x8d\xdd\xf6\x8c\x4b\xde\x72\x2d\x81\x18\x9e\xf6\x8a\xe7\x55\x41\xd3\x63\x68\x43\x83\x80\x04\x18\xc2\x50\x85\x91\x01\x14\xf1\x4b\xdb\x18\x3b\xd3\x2f\xda\x22\xd1\x55\xfb\x0e\x2c\xac\xd1\x69\x76\xa5\x7f\x6c\x81\x9d\xcd\x71\x31\x80\x52\xee\x3a\xef\x8e\x06\x50\x17\xea\x74\x1f\x99\x3a\x57\xc3\x6c\x68\xb9\xe9\x18\x9c\x07\x14\xf4\xa7\x3c\x1b\x83\x08\x9d\x01\x16\x1c\xc0\x51\x28\xaa\xc4\x3c\xce\xaa\x67\x7a\xc3\x63\x5c\xef\xb2\xbe\x5d\xc7\x60\x6e\xc1\x39\xaa\x7a\x79\xbe\xe1\x7e\x52\x0e\xb8\x79\x4c\x27\xcf\x09\xf0\xc7\xe3\xeb\xab\xf5\xf6\x17\xe2\xfd\xba\x8b\x78\x95\x76\x71\x15\x22\x8d\x3d\x99\x2d\xa3\x34\xf2\xac\x89\x8d\x3e\x57\xf9\x45\x5e\x97\xcd\xab\xa0\xf2\xed\xdb\xff\x7d\xf8\x34\xef\x08\xab\xca\x97\x25\x38\x48\xcf\x4d\x61\x04\x81\xf9\xb4\xcf\xa0\xf2\xc2\x16\x56\x50\x94\x9f\x76\x0d\x0c\xbb\x74\x3f\x15\x1b\x8d\x04\x09\x65\x93\xbb\x9c\x83\x62\x72\x93\x3f\x14\xbe\x30\xa0\xc9\x9c\x7c\x82\x55\xf4\x85\xd1\xb3\x4e\x67\x7f\xe8\x2f\xcf\x5c\xa9\xaf\x41\x96\xfb\x85\x82\xf3\x76\x91\x98\xbc\x5d\xd8\x37\xbf\x14\xa0\xd7\x36\x2f\x94\xe0\x9c\x4b\x01\xf4\xbc\x10\x17\xfb\xb0\x2b\xc6\xba\xb6\x98\x0f\x00\xab\x12\x6a\x1c\x5a\x5c\xe8\x12\x6f\x14\x44\x58\x39\x65\x55\xa7\xcc\x60\xa6\x23\xb2\x1c\x3b\x94\x22\x33\x28\xcc\x77\xa7\xa1\xa8\x55\xe9\x8c\xad\xe1\xc2\x7f\xb9\x4a\xe6\xbe\xa9\x52\x1b\xf5\x7c\xff\x3a\xe6\x49\xa2\xfc\xf3\x2b\x09\xd6\xbb\x37\xf9\xf5\x79\x17\xfc\x69\xde\xfb\xef\x66\x37\xf6\xc3\xc7\xfb\x1f\xd2\xa2\xe9\x49\x4a\x81\x65\xf9\x16\x38\x50\xb3\xbe\x0d\x32\x65\x55\x59\x82\xe1\xf7\x39\xb0\x25\x34\xa9\x08\x0a\xb4\xda\xa6\xa8\xaa\xd1\x73\x12\xcc\x21\x0c\x25\xc0\x08\x5a\xd1\xf1\xed\x56\x63\x07\x11\x25\x06\x41\x6b\x11\x34\x64\x4f\x20\x0a\x98\x73\x0e\x93\x7f\x16\xed\x15\xbf\xe1\x5f\xec\xda\x9f\xcf\x9a\x77\xff\x4b\xac\x16\x7b\xf7\xf0\x71\xe9\xbd\x79\xf4\x5c\x6c\x12\xf0\xf1\xfe\xdd\xdd\x97\x9f\x9d\x91\x61\x77\x1f\x1f\xde\xfd\xf4\x07\x3e\xbb\xb1\x79\xeb\x4e\x63\xde\xba\x15\x72\x93\x01\x87\x90\x5f\x8e\x3e\x27\x36\xf8\x82\xc0\xb4\x80\xa1\x8b\x38\x9b\x36\x1b\xb6\xd8\x05\x9f\x63\x98\x16\x65\x68\xcf\x6f\x1e\x74\x2e\x38\xd2\x79\x0a\xb5\x0e\x5b\xe0\x45\x18\xe6\x7f\xe6\x34\xe8\x6d\x5f\x33\xbd\x4d\xb1\xd6\x11\x61\x11\xc6\xf9\x9f\x65\xbf\xf2\x7e\x92\x24\xff\x34\xe6\xd3\xe5\x86\xc5\xbc\xca\x9f\x9c\x79\xcb\x2e\xca\x7f\xff\xdb\x82\x1e\x7c\xb8\x7d\x7f\x41\xbe\xbd\x35\xdc\xde\x9f\x9b\xb5\x7e\x0d\xe7\xde\xbf\xbb\xa2\x82\x8a\x34\xb8\x0b\xad\xe9\xef\xc0\xcd\xe3\xe7\x77\x1f\x3e\x2e\xfc\x4c\xeb\x6d\xa8\x9c\x1b\x86\x61\xc8\x3a\x4a\x11\x2b\x79\x09\x43\x15\xdf\x98\x3a\x80\x63\x3c\x66\xf6\xfe\x5a\x43\xa5\x55\xd2\xf0\x96\xef\x40\x1e\xfa\xca\x7b\x46\x18\x3a\x7a\x4e\x73\x48\xca\xd9\x94\x78\x2a\x6f\xb6\x7b\x15\x7a\x01\xd8\xef\x2b\xc6\x73\x97\xa3\x55\x99\xc2\xdd\x6c\x60\x88\x23\xa5\x9a\x07\x96\x53\xa1\x38\x0d\x7b\x50\x5a\xae\x94\x01\x0d\x0f\x62\x57\xda\xd2\x92\xdd\x0e\x16\x0c\x43\x7c\x1e\xb3\x19\x8c\xf5\x33\xbf\x8b\xb8\xd6\x98\x35\xbb\x1e\xad\x6f\x06\xeb\x0b\x87\x1b\xf8\x74\x1e\xb1\xab\x5c\x15\xc0\x82\x8a\x76\x4d\xd0\xa9\x19\x18\xe8\x7e\x4f\x81\x2b\x51\x9b\x9a\x20\x87\x1e\xa5\x38\x4f\x6d\x57\x03\x88\x51\x38\x06\xb7\x0b\xbb\x8d\x65\x5b\x8d\x4d\x09\x39\xd7\xda\x18\x82\x35\xe7\x18\x46\xde\xc7\xa9\xc7\x44\xc7\x5c\xd9\x9f\xa4\xd5\x17\xbc\x58\xbf\x3b\xf3\x66\x7f\x4c\xfe\xf6\x7c\xaf\x5e\xd8\xb1\x96\x1c\xdf\x3d\x58\x08\x86\xdf\x86\xd2\xc1\x1b\xb4\xc8\x2b\x5e\x7f\xfd\x45\x2e\x37\x4b\x8a\x02\x82\xad\x76\x08\xec\x4a\x08\xe0\x53\x0b\x4a\x09\x3a\x58\x4e\x3b\x80\xc2\x00\x7a\x40\x4f\x87\x97\x57\x8d\x96\x42\xa9\xec\xa0\x88\xc5\x32\x40\x68\x4a\x50\xe3\xd2\x14\x18\x54\x6f\x52\xbb\xab\x2e\xdf\xba\xaa\x45\x44\x63\x34\x35\x69\x2b\x11\x0e\x8d\x10\x62\xbe\x4f\xe2\x39\xa1\x8e\x09\x21\x22\xc3\x32\x95\x3a\x37\xbc\x10\x0a\x6a\xbe\x9f\x0c\x21\xa9\xd9\xf3\x30\xf2\xc8\xa3\xb6\xd4\xab\x9b\xe4\x87\x2b\x8d\xb5\xff\x36\xf9\x4f\xc9\xff\x94\xfc\x1f\xc9\xff\xf5\x15\x32\xf5\x92\xf9\x9f\x0d\x9d\xef\x7f\xf8\x50\x7e\x5c\xec\xc2\x0b\x40\xf5\xc3\x3b\x70\xc5\xb7\x76\xb1\xd0\xaf\xab\xda\x7f\xfa\xf0\x46\x32\xfe\xe3\xe2\x91\xac\xb8\x4f\xb7\xd3\x31\xe5\x10\xa9\x32\x3f\x35\x8d\xad\x81\x4d\x93\xbc\xed\x71\x05\xca\x7c\xeb\x72\x15\xda\xa3\x6a\xf2\xd9\x1c\xca\xc8\xa9\x73\x7d\x0f\x78\x3f\xed\xe2\x53\x38\x70\xec\x21\x05\x47\x41\x2c\x16\x53\xeb\xa0\xa8\x50\x6e\x73\x71\xec\x78\xa5\x0b\x69\xe4\xc6\x50\xc5\x34\xa5\xa4\x84\x53\x1b\x8a\xe0\x18\x50\xa0\x4b\xab\x46\x95\x45\x51\xc0\x2d\x86\x92\x60\x5c\xe4\x2a\xe7\x34\xf4\x61\x0b\x10\x63\x2c\x1c\x19\x63\x3b\x26\xb8\xe0\xa5\xab\x58\xe5\xf0\xbe\x2c\x21\x87\x96\x13\x0e\x8a\xb2\xad\xa8\x4f\xfe\x49\x7a\x38\xe7\xb2\xfe\xd5\x15\xca\x95\x26\xff\x63\xf2\xbf\x26\xff\xe7\x55\xef\x7d\x7f\xf3\xb6\x9b\x7e\x5a\xfa\xef\xdf\x7e\xfa\x7c\xdd\xab\xd9\x37\x3a\xef\xe6\xba\xf3\x62\x67\x7d\xfe\xa2\x0b\x57\xa3\x9b\xb7\xd2\xb4\x44\x2c\x97\x61\x37\x4a\x5d\x38\x07\x50\xe1\x1b\xac\x5b\xb2\xc5\x45\x3e\x6d\x9d\xb5\x40\x98\x79\x1f\x74\x91\xa9\x32\xe0\xf8\x34\x46\x3a\x0d\x30\xcc\x4f\x6c\x12\x26\x27\x86\x34\x0e\x12\x03\xb7\x36\x67\x63\xcd\x62\xc7\xa9\xc2\x96\x9a\x2e\xfd\x23\x18\x5e\xfa\x0c\x97\x94\xc6\xbe\xb4\x0c\x18\xd0\xa6\x7e\xda\xbd\xe9\x37\x2e\x98\xe4\x85\xf5\xd4\x59\x1c\xfb\xca\xef\x61\x71\xee\xbd\x24\x59\x47\x7e\xac\x45\x23\xfc\x21\x79\x4c\xfe\x63\xf2\xbf\x5f\x62\xcf\x0b\x5d\xe1\xec\xad\x5f\xcb\x26\x3e\xdc\x7e\xf8\x74\xc1\x0c\xbf\x26\x43\x16\x55\xd1\xf4\xe6\x73\xcc\xfc\x7c\xfa\x1c\xfb\xe9\x57\x3e\x5a\xcf\xce\x89\x91\x60\x1f\x54\x05\x72\xfe\x9c\x34\xae\x3b\x72\x50\xce\xee\xfd\x51\xf2\xbc\x10\x42\x88\xae\xcc\xd5\x56\x99\x52\x30\xca\x0a\x49\x2c\x11\xb4\xcc\xb5\xd0\x08\xe6\x99\x8a\x9f\x69\x28\x38\xa3\xa5\xa4\x06\xcb\xf9\x33\xa9\x10\xcc\x37\xa6\xa4\xe4\xd4\x79\xbb\x57\x11\x7a\x85\xc1\x70\xb4\xb6\xea\xac\xcf\x08\x0a\x6a\x9c\x86\x41\x58\x0f\x19\x2c\xa5\xdf\x97\x5b\xdd\x02\x04\xc3\xb1\xce\x29\x85\xa1\x1d\x8b\x9c\xc1\x2f\x3f\x7d\x4e\x9a\xf8\xa9\x6f\x8b\x9c\x25\xc9\x6f\x52\xf6\x2c\x22\xae\xf2\xbb\x17\x36\xcc\xbf\x4e\xd0\x4b\x55\xe2\x17\x7b\xff\xe3\x12\xd2\x00\x6f\x0b\xf4\xde\x4e\xc2\xbf\x05\xd7\x00\xd8\xf3\x44\x5c\x43\x58\x80\xb1\xc6\x18\xf0\x27\x0a\x30\x44\x0d\xe8\x50\xb1\xc7\x30\x48\x14\xaa\x6c\x7f\x2a\x5e\x80\x5b\xc0\x31\x64\x10\x4d\xa1\xa2\x96\xaa\x89\x79\xac\x35\xc4\xe5\xd6\x15\xfa\x39\xa1\x95\xd8\xbb\x42\x7a\xb9\xb1\x94\x19\x25\xac\x8d\xe2\x6a\x54\x4a\x11\xda\xa9\x05\x42\x84\x4e\x86\x03\xe3\x4c\xb0\xdc\x37\xac\xae\xe8\x0e\x95\x5b\x28\x49\x83\x28\x07\x39\x6c\x6b\x56\x45\x1f\xbb\x3c\xb7\xfb\xee\x45\x43\xea\x6f\x92\x7f\xf3\x6b\xed\xfe\xf9\x8f\x69\x78\x04\xfe\x7e\x7c\xff\xa7\xe0\x6f\xc0\x6b\xbb\x35\x2c\x81\x33\x10\x81\xfc\x69\x0f\x12\x88\x15\xd0\x45\x59\xee\x50\x19\x0c\x0a\x63\xa6\x4e\xce\xa7\x74\x6a\xe7\x03\x30\x02\x75\x49\xc0\x4e\x10\x83\xe5\xbc\xdc\x48\x8d\x0b\x9b\x8b\x1d\x71\xac\xb5\x05\x73\x3c\xb6\x5a\x0b\x33\x1f\x18\x05\xa2\xa4\x08\xcd\xd4\xcd\xcd\x6e\x55\x38\x70\x49\x84\xd8\xfa\x86\x35\x9e\xee\x51\xb9\x45\x12\x37\x98\x32\x50\x94\xdd\xd2\xec\x64\x9b\x2d\x9a\x0e\x26\x2a\x06\xbc\xd5\x68\xbe\x7f\xd1\x0e\xbe\x5f\x1c\xa8\x97\x3c\x54\x84\x91\xbe\xff\x43\x7a\x83\xed\xec\xd4\x55\x41\xf8\x60\x79\xef\x80\x76\xfb\xbd\x0b\xd6\xf5\x2c\xf3\x27\xe9\x53\x39\xbd\x1c\xb5\xaa\x46\x39\x80\xb1\xef\x78\xd7\x6f\x12\x63\x8c\xb5\x8d\x52\x4a\x59\xce\x85\x30\xa7\x3e\xa5\x32\xb4\xf1\xdf\x91\xdb\x28\xd2\x2c\x9d\x21\x91\xef\xc6\x3f\xf3\x9b\x7a\x83\x5e\x46\xea\xc2\xa7\x73\xcd\xf9\x72\xfb\x90\xce\xf3\xf3\xe1\xfa\x42\x57\x63\xaa\x1c\x2a\x72\x9f\x13\x65\x31\x86\x83\xa8\x0b\xe3\x5e\xf2\x5d\x34\xb4\x1b\xf4\x64\x83\x22\xa8\x85\x47\x4e\x04\xe8\x02\xad\xb5\x03\x3c\x2b\x87\x69\xdf\x4f\xfb\x61\xc9\x05\xd1\x9b\x2a\x93\x91\x7d\xa5\x5c\x2a\xd8\xe7\x93\xaf\x3f\xe4\xb1\x84\xef\xf3\x87\x4b\x38\x63\x73\xb3\xb9\x2f\x7f\xfe\xb8\x89\x85\xc6\xe9\xb6\x0a\x36\x94\x04\xf4\x00\x35\x15\x75\x07\x51\xf8\x92\x90\x50\x3d\x27\x3a\x93\x93\x48\xf3\xe9\x98\xfa\x5d\x90\xc1\x40\x0f\x01\x22\xc1\x97\x25\x69\x50\x4f\xf1\xbc\x9c\x5d\xce\xbb\x4a\xe2\x79\x7f\xf7\x7a\x5e\x70\x75\xde\x0f\xe5\xf9\xb4\x7f\xf9\xf3\xc7\x8d\xaf\x4e\x79\xb5\x9c\x16\x12\xd0\x01\xd4\x57\x1a\x60\x51\x54\x05\x27\x41\x74\x7c\x95\x9c\x8e\xa9\x9a\x7c\x96\x84\x63\x80\x81\x23\x8f\x00\xd3\x41\x51\x66\x51\x4f\x30\x95\x31\x8e\x6c\xb2\x6a\xa3\xa3\x9a\x49\x1a\xc5\xdb\x3e\xde\xcf\xbe\xc9\x6b\xfe\x6e\x71\x60\xd2\xad\xe8\x0c\x28\x61\x18\x01\x3c\x1e\xab\xe8\x8e\x15\x61\xb7\x2d\xba\x56\x1b\x60\xc2\x30\x08\x40\x41\xeb\x01\xf5\xa0\x0c\x3b\x1f\x5a\x2f\x84\xef\xb4\x4f\xd2\x44\x3c\xd3\xcc\x6d\x92\x68\xcd\x46\x9c\xd0\xb2\x57\x45\x44\x8e\x9b\x46\xed\x54\xac\x89\xdc\x24\x13\x66\xd3\x21\x28\x0e\x1c\x38\xa6\xe3\xd4\x83\x25\xee\xae\x9e\xf1\x8d\xdf\xa8\x73\x7c\x36\x01\x4b\x62\x69\x89\xb1\xdf\x9e\x25\x87\x62\xbc\x3d\xea\x19\x9c\xd3\x71\xf7\x1f\x3f\x2c\x22\x4d\xef\x3e\xbc\xbb\x16\x43\x5b\x11\xa5\x6a\x45\x2a\xd3\xb6\x55\x3d\x0f\x46\x0d\xb6\xf4\x69\x87\x25\x93\x94\x4a\xd0\x54\x95\x76\x6d\xe8\xac\x6b\x54\xbb\x2a\x8f\xf6\x39\x89\xb2\x9a\x22\x95\x9d\x6d\x26\x04\x12\x7b\xb4\x20\xb1\x4f\xca\xda\x15\x45\x5c\x51\xb8\xb7\xa7\xc1\x34\xa6\xa9\x19\xdd\x1b\xe1\x17\xec\x41\x75\xb6\x89\x16\xdb\xf0\xd3\xb9\x72\xe5\x82\xeb\xdb\x7c\x09\xec\xbb\xb9\x02\xf6\x5d\x6d\xcd\xe5\xe3\xb7\xa1\x7d\x6b\xea\x04\x81\xa6\x2c\x1b\x37\x21\x57\xc3\x52\x53\xc4\xc7\x94\x4d\x4d\xa4\x99\x06\x3d\x09\x87\x30\xe0\xb1\x46\x5b\x9b\xcb\x43\xe8\x21\x71\xa0\x98\x7d\x77\xe4\x1c\x18\x02\x9a\x8f\x05\xd8\x47\xd0\x05\xd9\x47\x19\x1f\x43\x2f\xe5\x51\xd3\x32\x2f\xf3\x92\x61\x87\x8a\x42\xee\x09\x0c\x6c\x6a\x10\x8a\xd8\xbe\x41\x24\xe7\xdc\x96\xbe\xf1\x91\x63\xfb\x57\xea\x93\xef\xfe\x40\x7d\xf2\xaa\x04\x64\xc9\x42\xbb\x13\x05\x2e\x74\x95\x35\x5e\x55\x69\x5e\x59\xe1\x7c\x48\x00\xa9\x62\x33\xfc\x09\x82\x2a\x74\xeb\xfa\x52\x9e\x2c\xc9\x4e\x4b\x5b\x49\xa7\x2b\x15\xfc\x9b\xf2\xe4\x64\x15\x35\xb3\xfc\x46\x27\xef\xcf\xdc\x72\x6f\xae\xe9\x5a\x41\xef\xd7\xab\x81\x07\xb0\x8c\xc5\xa8\x6d\xde\x9d\x12\x50\x87\x01\xa0\xe0\x32\x21\x78\x44\xc5\xc3\xe9\xe8\x17\x43\x73\x3b\x1d\x37\x89\xd6\xd6\x58\x63\xe7\x87\x49\x4d\xe5\x12\x10\xc2\x61\x97\x55\xcf\x89\x09\xc6\xbc\x68\xc0\xb9\x8d\x3a\xeb\x3f\xff\x74\xc6\xb4\x7f\xbc\xd6\x7f\x7e\xfc\x86\xfe\xf3\xdd\x25\x5f\x7a\x65\xce\xad\xe7\x63\xb0\x5c\x2a\xe6\x99\xb5\x07\xcb\xa4\x62\x8e\x5b\x93\xee\xe7\x37\xa9\xe5\xd6\x0e\x7e\x6a\xaa\x6a\x1c\x81\xda\x4d\x4d\x7c\xda\x6d\x14\xea\x7d\xd5\xb0\x5d\xdb\x0d\x2f\xaf\x46\xd4\x7b\x5f\xb3\xb1\xe9\x26\x73\xc2\x4a\x65\x7d\xf0\xe3\x38\x4e\xdd\x38\x8e\xb1\x3f\xc7\x58\xff\xa2\x5f\x76\x8f\xc8\x18\xf8\x95\x7c\xea\x39\x21\xf2\x95\x7c\x2a\xf6\x08\x18\x22\x18\x93\x82\x8a\xd2\x10\x7c\x0c\x35\x05\x64\x37\xf5\xa2\x2f\xd9\x2b\x34\x32\xd0\x8d\x46\x7a\x82\x42\x1a\x19\xb6\x67\xe9\xd4\x32\x1c\x07\xd7\xee\xdf\x2a\xa7\x2e\xba\x9e\x4b\x5c\xf0\xfb\xc8\xd0\x7c\x1d\x17\xbc\xb9\xe0\x58\xfe\xe8\xc0\xe0\x8a\xb7\x8d\x16\x9a\x2b\x63\x98\xaf\x7a\x61\x51\xe7\xbc\xdf\xb9\x22\xc5\x93\xc7\xb8\x77\x80\x2e\x4a\x80\x25\xea\x5c\x6d\x31\xa6\x9e\x0d\x60\x5b\x6c\x24\x15\x5c\x32\x29\x98\x34\x46\x68\x84\x1c\xe1\x1c\x07\x05\x85\x35\xdc\x98\x80\xb9\xc8\x5d\x4e\x41\x19\x8b\xfe\x8f\xe9\x16\x43\x63\x5b\x4b\x16\xfd\x31\xba\x82\x1b\x93\xfc\xe9\x15\x27\xf9\x5f\x9f\xd5\xf6\x16\x46\xc6\x45\xfd\x2a\x5a\x14\x11\x72\xf0\xa5\x35\x7f\x89\x98\xa7\x97\xe9\xf5\xaf\x41\x74\x1c\x81\x77\x08\x70\x8c\xfb\x09\x97\x90\xed\x41\x42\xd1\x73\x42\x28\xf3\x1e\x14\x2e\xd2\x56\x16\xce\x33\x68\x4b\x32\x79\x83\x89\x61\x29\x26\xb9\xcd\x31\x43\xae\xdc\x18\xa4\x8c\xe4\xa7\x7d\xda\x97\xa5\xdb\xed\x66\x87\x25\x34\xb3\xeb\xbf\xef\xfb\x3e\xd8\x18\x44\xca\x61\x38\x74\x74\xd7\x37\x5d\xd9\x37\xdb\x76\xb7\x3d\xc4\xb5\x2e\xcd\xba\xb3\x9e\xfb\x12\x4f\x8c\x31\xb7\x9b\x4b\xb7\x7f\x77\x77\x1f\xf1\x75\x3f\xdc\xdd\xa4\x8f\xeb\xd2\x41\x9c\x22\x82\x6a\xdd\x94\xad\x21\x24\x0f\xa5\x30\x72\xaf\x34\xf3\x54\x6d\x0c\xb4\xf6\xa9\x39\xb6\xb0\x82\xa0\xcc\x9a\xda\x49\x50\x06\x73\x08\x07\x0a\xe0\x2e\x59\x83\xed\x33\xd9\x1c\x56\xe4\x2a\x53\x72\x8d\xee\xfc\x2b\x70\x7b\xbf\xc4\x12\xef\x6f\xef\x37\x87\xea\x89\x2f\x95\x98\x69\x95\x6e\x9f\xf8\xe5\xd5\x74\x5c\x91\xa7\xc4\x98\x75\x12\xb6\x71\x92\x8b\x53\xb3\x3c\x47\x3c\x03\xd8\x3e\xd3\xcd\x21\x1b\xfe\xa1\xe7\xa8\xd3\xe4\x7c\x8e\x3a\xc2\x2f\x87\x27\x6d\xed\xca\x06\x16\x13\xe6\x17\x4a\xd2\xf2\x72\x0e\xb2\x39\x64\xc5\xf5\x39\xd6\x31\x16\xfa\xf0\x11\xdc\xbf\xfb\x2b\xf0\xf1\xfe\xdd\xfa\xdd\xfd\xc7\xf5\xc7\xfb\x77\xa0\xae\xd6\xfb\x6a\x12\xf3\x28\x4a\xab\x90\x4c\x7c\x79\x66\x2a\x1b\x4f\x50\xa5\xc3\x30\x0c\x7e\x88\xa5\xe4\xe7\xdf\x9b\x36\xff\xf0\xdf\x3b\x1d\x27\xb1\x3c\x4b\x3e\xdb\xa9\x3c\x35\x4d\xd3\xd8\x66\xfe\x73\xe9\x93\x74\xfc\x76\x9f\xbc\x65\x6b\xfd\x03\x7d\x92\x8e\x27\xa5\x54\xe6\x42\xdb\x34\x4d\xc8\xe7\x5f\x9d\xac\x41\xf2\xcc\x6e\x92\x55\xfe\xcd\xd8\x70\x8c\x05\xbc\xfd\xfd\x37\x49\xf5\x44\xaa\xb4\xa9\x26\x16\x49\xfe\x9a\x34\x7f\x22\x97\x57\xd3\x21\xc3\xa7\x82\x90\x6c\x3f\x8e\x41\x1f\x0e\x87\xc9\x1d\x0e\x87\x05\x7b\xac\xd2\x45\x6b\x75\xc1\x0a\xcd\xbb\xec\xeb\x7e\xf4\x63\xbc\x9b\xc8\x4e\x6a\x3a\xae\x93\xc0\x52\x78\x1c\x41\x9e\x1e\xa6\x26\x6d\x26\xb6\xd1\xd6\x94\xb5\x0f\xbd\xf7\xe9\x01\x9f\x46\x80\x93\x04\x80\xe4\x99\x6c\x8e\xa9\x8b\x16\xcd\x92\xf0\xbf\x5f\x52\xfe\x20\x99\x4d\xb2\x34\xaf\xaa\x5f\x6a\xb0\x0f\x38\x55\x93\x03\xfd\xc4\xc9\x82\xed\x55\xf3\x1e\x95\x1d\xcf\x0c\xb9\x51\xff\xf9\xdd\x1b\xde\xa9\x57\x98\xd4\xda\xfd\xb2\xbb\x81\xa1\x12\x8e\xe0\x92\x10\x0c\xc3\x30\xb5\x55\x14\xf9\xcc\x84\xf7\xa7\x4e\x8b\xa2\x2e\x21\x4e\xf5\x34\xd8\xb4\x0d\xf2\x52\xcb\x61\x9e\xcd\x8d\x59\xf1\xe4\x37\xc9\x6f\x93\xe4\xee\x35\xb3\xf4\xdd\xdd\xfd\x77\xb3\x3f\x1b\x5b\x9d\x66\x43\xba\x2b\x51\x85\x61\x3a\xfe\xde\x03\x6b\x05\x90\x9e\x35\x52\xa7\xe5\xef\x93\x34\xe7\x3a\x53\x82\x23\xa5\x3d\x0d\x63\x68\x00\x01\x98\x84\xf6\xe0\x3d\x40\x60\x3e\x07\x7b\xc6\x37\x4d\xb6\x4f\x7e\x88\xb9\x8d\xfc\x2e\x12\x15\xa4\x9b\x87\xbf\x7c\x4c\x6f\xef\x6f\x73\xf0\xf8\xe3\x6f\xc1\xfa\x0b\x84\xe1\xe7\x1f\xde\x7f\xda\x48\x58\x22\xbc\x75\x85\x64\x0e\xf1\x13\x0c\x7b\x0b\x92\xac\xd2\xda\x55\x5e\xfa\xba\x1b\xe5\x50\xfb\x5a\x34\x55\x95\xed\xa7\xee\x39\x69\x00\x29\xc3\xbe\xf1\x20\x49\x65\xe0\xa1\x0d\xa3\xdc\x83\x32\x25\x23\x6b\x9c\xb6\xc6\x9b\xda\x18\xe3\x94\x90\x42\xfb\x24\x01\xc9\xbc\xd7\xea\x95\x8d\x8a\xd5\xef\xaf\x95\x10\xe7\xa5\x7f\x73\xf3\x98\xa4\xb2\x26\xab\xfa\x84\x63\x45\xbf\x38\x55\x95\xaf\x6b\x0b\xe8\xca\x62\xeb\x3a\xd7\xb9\xd0\x64\x87\xa3\x95\xcb\x5c\x05\x69\x1b\xb1\x81\x30\xe2\x2c\x22\x63\xc0\x72\xc3\xbe\xb8\x69\xb7\x29\x78\x4c\xc0\xfd\xe3\x0a\x3a\xc2\x80\x9f\x76\x59\xf7\x9c\x00\x18\x46\x6e\x22\x19\x39\x2a\x8f\x41\x19\x20\x40\x1e\x0c\x5a\xa3\xb2\xe9\xc0\xc1\xfb\x90\xbb\x29\xbf\xdc\xc4\x2e\xe4\xa1\xb6\x20\x01\xbd\x99\xd7\x54\xf4\x5c\xdd\x54\x9b\xfc\xcc\xfd\x1d\x79\x04\xb2\x78\xdf\xee\xee\x1f\x67\x9f\xe7\xee\x3e\x63\x2b\x32\x61\x94\x1a\x07\x8a\x27\x97\xb6\x78\x6a\xb1\xdb\xed\xc1\x11\x87\x62\x93\xfb\x70\x78\x1a\xbc\x07\xda\x64\xf4\x34\x00\x1b\xb9\xc7\x52\x17\xf3\x7d\xbf\xaa\x63\xdc\xa4\xc7\x2a\x4b\x26\x03\x10\x68\x44\xe0\xa1\xbe\xd2\x31\xb6\xeb\x7a\x18\x7c\x18\x9b\x7a\x04\x22\x50\xd0\x84\x7a\xb0\x1d\x40\x67\x2d\x9d\x6a\xa3\xa2\x97\xf6\x16\xfb\x77\x91\x22\x5d\x64\xea\x2e\x48\xc0\x95\xf4\x45\xe9\xea\x68\xe2\xa9\xb0\x97\x3b\xdd\xaa\x5a\xf5\x7a\xa7\x42\x0f\x7c\x0b\xb1\x31\x9b\x1c\x49\x11\x19\xb9\xc2\x7c\x4b\xc2\x60\x41\x0e\xe8\x84\xd3\x31\x54\xe1\xa0\x01\x04\xca\x01\x62\xa4\x3c\x26\x20\x3b\x9e\xb1\xd2\x7f\x7e\xa9\x2d\xbe\xba\x80\x88\x67\x7f\xb8\x4d\x23\x61\x72\x76\x04\x32\xf4\x00\xfb\x18\xcc\x36\xa1\xb1\x1d\xf7\xd6\x73\xa7\x3b\x1e\x76\x99\x05\xd0\x2d\xb0\xc3\xd1\x07\x76\xf4\x03\x10\x93\x4a\xab\xd0\x1d\x35\xc0\x73\x17\x26\xff\x24\xb1\xcf\xf8\xc6\xae\x8a\x3f\xb8\x7f\xdf\x2f\xfb\xf7\x8f\xef\x63\x19\xc7\x97\x6c\x8d\x5f\x17\x08\x9e\x15\xd6\x7a\x55\xa6\x75\x01\x01\xfb\xa5\xe3\x8c\x01\xcc\xd3\x1a\x95\x93\xc1\x04\xf4\x01\xa7\x0c\x74\x4f\x87\x97\x57\x85\x95\xd2\xe8\x75\xa7\x99\xa3\x2a\x74\xb2\xf4\x25\x0f\x35\x43\x1e\xb2\x55\xc1\xa1\xc2\x68\x1a\x40\x8f\xa1\x75\x0c\x21\x14\x0e\x42\xcc\xa6\xbb\x10\x23\x6b\x84\x96\x5c\x4a\xae\x24\xd5\x1a\x59\x55\x2a\x83\xac\x8c\x5a\xae\xdd\xaf\x71\x02\xc6\xc9\xfb\x96\x13\x70\x95\xcf\x46\xfa\x6c\xc2\x57\xa1\xd0\x6a\xdc\x23\x6c\x0d\xf7\x68\x5e\x2c\x90\x97\xb3\x69\x1f\xba\xb5\x88\x62\x9c\x41\x56\x81\x56\x05\xab\x2c\x09\x63\xa8\x49\x2f\x61\x1d\x19\x01\xcf\xf6\xc3\xfe\x99\x45\x2d\x86\x17\xdd\xff\x77\x69\xf6\xf8\xe9\x5c\xb7\x1b\xd7\x66\x08\xc8\xe4\xb7\xce\x18\x50\x16\xd8\x93\x70\x98\xfd\x97\x35\x9a\x60\x11\xca\x70\xd0\x07\xd0\xa7\x8d\x37\xc8\x4f\xdb\x73\x9d\xd7\x2a\x79\xf6\x5f\xcd\x9f\x0f\x6f\xe6\xcf\x2a\xc9\xcc\x34\xc0\x74\xab\x76\x27\x91\x96\x30\x94\xd8\xb6\x03\xb0\x28\xd8\xf3\xf4\xa9\x2a\x20\x4c\x26\x4e\x2d\xa8\xe2\xbd\xe7\x60\xf6\x79\xec\x1f\x75\xef\xa3\xed\xf6\xcf\xbf\x0a\xf7\x7f\x15\x89\x3d\xdf\xfb\xba\x42\xa9\x45\x04\x54\xbf\x48\x8c\x05\x70\xa9\xa0\x78\xea\x55\x49\x22\x62\xcb\x80\xfd\x93\xbf\xbc\x0a\xed\xec\x98\xd1\x94\x59\x66\xa9\x79\xda\x56\xda\xdb\x3a\x2d\x29\xb2\x90\x6c\x2c\x46\x06\xe3\xa9\x02\x23\x2c\x4c\x6f\x30\x16\xf9\x51\x29\x15\x9a\x48\x3b\x4b\x39\xe1\x14\x2b\xc3\x8c\xa6\xd8\x31\xc9\x38\xe1\x78\xde\x99\x6e\xb2\x63\xc4\x0a\xbd\xc5\xa1\xfc\xcb\x57\xfe\xa4\xaf\x70\xc9\xe7\xf5\xe3\x4d\x66\xe9\x7e\x65\x52\x3d\x2d\x4c\x7a\xc7\xd9\x8b\x72\x4a\xcd\x13\x27\x68\xab\xf5\xd4\x02\xee\x80\x0e\xa3\x1e\x78\xaf\x9d\xa9\x44\x6f\xc2\x6e\xc3\x82\xb0\x2e\xe8\x40\x6d\x63\xe6\x87\x00\xa5\x34\x47\xee\xf4\x3e\x08\x60\x5b\xad\xaa\x36\xfa\xd3\xdb\x67\x11\xf3\x40\xbf\x49\xfe\xe4\xdc\xe7\xff\x5d\xf2\x3f\xbc\xac\xc9\xb7\xf7\x9f\xe6\x2b\x5c\xf8\xa3\xdf\xdf\x7c\x78\xf7\xfd\x15\x51\xde\x19\xc7\xb4\x80\xb3\xee\xcf\x41\xbc\xdb\x2f\x52\x08\xb3\x35\xbd\xea\xaa\x02\xa6\xf9\x89\x81\x04\xf9\xb9\x25\x20\x41\x44\x6a\xa2\xca\x23\x81\x8a\x63\x24\x0c\x56\xb4\x2c\x29\x84\xb0\xc0\x82\x18\xcc\x41\xa7\xa8\x21\x3a\x24\x1e\x32\x83\xb6\x2e\x17\x63\xcb\x77\xbe\x64\x9e\x6f\x6c\xc9\xf0\xa9\xcc\x76\xec\xc4\xd3\xe1\x39\x91\x8c\x54\x1d\xe4\x32\xaf\x90\x12\x04\x71\x68\x0a\x52\x16\xbc\x28\x09\x9b\xac\xb6\xcc\x9a\xf6\x80\xc7\x01\x07\x0b\x0b\xac\x61\xc3\x09\x03\xae\x08\xc7\x11\xf7\xc9\x4d\xe4\xd6\xaf\x36\xf8\xec\x39\x2e\xfc\xca\xff\x69\xb9\x3f\x9b\x9b\x4f\x9f\xcf\x95\xc3\x0b\xd9\xf6\x5b\xff\xec\xb5\xc4\xf8\x6b\x31\xc3\x6b\xf0\x8d\xc9\xda\x80\xa4\xf3\x5a\x08\x17\x76\x61\x04\xf0\x20\x8c\xe5\x86\x58\xcf\x34\x25\x05\x63\xa8\xeb\x51\xd7\xf8\xaa\xa8\x4d\xe8\xfd\xf1\x08\x1c\x48\x26\xb5\x3c\x97\x8d\xb4\xa2\x0e\xb9\x36\x46\xf9\x0d\x9e\x8c\x13\xdb\x82\xf1\x58\x28\x8c\x0c\xae\x07\x64\xca\x22\xd4\x92\xe5\x76\x4b\x00\x2c\x72\xcd\x4d\x91\x6b\xe9\xa3\xc2\x4d\x98\x1f\x4e\xac\x6a\x68\x5d\x41\xda\x4a\x61\x92\x64\x73\xc6\x5b\xea\xe4\x4f\x93\xef\x92\xc7\xe4\x6f\x93\xbf\x4b\xfe\xfb\x24\x01\xd1\x9a\xb9\xbd\x24\x3c\xee\xe2\x94\xfe\x9a\x43\xfc\xe1\x2d\xb1\xf8\xf2\xde\x75\x16\x69\x4d\x48\x85\x4a\x60\x4e\xa3\x71\xaa\x4a\xed\xa4\x11\x10\x84\x52\x09\x0d\x82\x5c\x61\xa7\x46\xe0\x81\xa4\x84\xaa\xd2\x20\xd8\x63\xa7\x76\xa1\xa1\xb1\x96\x23\x89\x4f\xeb\x51\x21\xca\x03\x09\x7d\xc8\x83\xe4\xc0\x82\x5d\xda\x85\xbe\x0e\xe8\xa4\x19\x2f\x5c\x0e\x7b\x4a\x1d\xe5\xc0\x9a\x97\x37\x9c\x63\x0c\x58\x21\x15\x51\x92\xc4\xc7\x64\x93\xe9\xc8\x1b\xa4\x5e\x32\x89\x3f\x45\x5f\xfb\x2a\x2e\x7b\x41\x51\xaf\xaf\x29\x4c\x16\xd9\x97\x25\x26\xdb\x5b\x0f\xa4\xd7\xda\x9f\xf2\xce\x82\xf2\x42\x48\x32\x1f\xb9\xb4\xcf\x09\x19\xc1\xb1\x75\xb2\xaa\xcf\x98\xea\x93\x73\x2e\x53\x7d\x3f\xed\xfb\x69\xd7\x07\xab\x2a\xed\xb8\x93\xce\x56\x3a\xe2\x3c\xf9\xb9\x26\xf5\xb5\x9e\xf2\x0c\x5c\x5e\xec\xb9\x3f\x05\x31\xa7\xf2\xab\xc0\xe5\xac\x07\x2a\xf7\xb3\x7f\x65\xf3\x7d\x27\xdb\x2e\xef\xbc\x00\x10\x87\x96\xae\x0a\xc7\xac\x91\xa5\x35\x64\xca\xc5\xec\x17\xf8\x71\x5c\x77\x31\xa0\x81\x84\x35\x56\x22\x4f\xac\x6e\x02\x72\x13\x3b\x17\xb0\x79\x1b\x88\xad\x97\x5a\xf3\xf2\xd9\xdd\xb8\x8d\x88\x9a\x5e\x57\xc8\x9a\xef\x5e\x55\xbc\x92\x6c\x51\xf1\x9a\x4d\xdd\xec\xa5\x04\xf4\xe6\xec\x80\x56\x79\x71\x00\x5b\x4e\xc9\x44\x09\x16\x40\x88\x54\x57\x8d\x0b\x4d\x4a\x0c\xad\x85\x02\xe5\x29\x01\x3b\x52\x56\x39\xa9\x44\xe1\x4a\xbe\x11\x08\xc2\xd0\xd5\x15\xc2\x5a\x22\xe4\x00\x0a\xbd\x3b\xec\x9f\x3a\x20\x00\xc7\xc1\x85\x43\x95\x91\xdd\x1e\x1e\xc7\xfc\x18\x8e\x10\x14\x87\x05\x23\x87\x62\xec\xdd\x9e\xab\x52\x23\x46\x6e\xbd\x60\x2d\xbe\x3f\x13\x23\x2f\x3c\x00\x9f\x3e\xdf\x83\x0f\xf9\xbc\xfa\x7c\x17\x2b\x0b\x09\x50\x45\x1e\x46\x0c\x76\x40\x93\x7e\x57\xa4\x38\xec\xe4\x8e\x85\x41\xd6\x22\xec\xd4\x38\x9b\x48\x5b\x2f\x6b\xa9\x25\xb0\x55\xb5\xf2\xca\x95\x71\xed\x81\xde\xf8\xa3\x72\x1e\x88\x70\x6c\x95\xed\x43\x15\x74\x68\x9d\x16\xa0\x04\xe2\x54\x27\xc9\x2a\x73\xcf\xf2\x86\xc7\x9a\x89\xef\x63\xdd\xfb\xb5\x67\xbb\x44\xd4\xe7\x49\x15\xa9\xa3\x6e\xc1\xa7\xdf\x82\x87\x1b\xee\x26\xee\x5c\x5a\x5b\x4a\x4c\x23\xd3\x12\x8a\x89\x5b\xbb\xc1\xbf\xc7\x52\x6d\x86\x5f\x30\x90\x94\x66\x38\xd4\x81\x84\x1d\xcb\xf6\xa7\x03\xcc\xf0\x89\x1e\x81\x04\x3c\x49\x33\x16\x71\x3f\x26\xce\xdf\x98\x69\xb9\xa2\x22\x9f\x97\xeb\x75\x43\x0a\xc0\x26\x0a\x6b\xd3\x02\x51\x62\x95\x16\xd3\x7e\x63\x7c\x3d\x91\x40\x82\x15\xc0\x80\x63\x5a\x3a\x7d\x1a\x66\x4b\x61\x9b\x74\xe9\xfe\x86\x6f\xc4\x37\xf6\xde\x37\xf8\xe7\x38\x20\xdf\x47\xd8\xe1\x7a\xe1\xf9\x89\xc7\xcd\xeb\x7e\xfb\xaf\xc1\xeb\xe3\xe3\x4d\x32\xe9\x0b\x60\x32\xdd\xe5\x5c\x41\x5e\x58\x58\x6c\x7f\xa9\x53\xfb\x8a\x05\xa9\x0d\xe5\x8a\xaf\x28\x85\x06\xe2\x06\x16\x36\x87\x7b\x54\xba\x02\x6e\x84\x24\x92\x08\xfa\x9c\xe8\x5c\x6f\x4b\x95\x8a\x9a\x90\xf9\x1f\xa5\x86\x18\x22\x28\xc3\x14\x53\x02\x29\x43\x9c\x96\x94\x23\x41\x93\x64\x9b\xc9\xb3\xa6\xf2\x9f\xbc\x70\xcb\x7c\x59\x9d\x16\xb7\xad\xf5\x99\x02\xe7\xc5\xb0\xf8\xf4\xf9\xe3\x9b\x8c\xc7\x92\x7b\xba\x0e\xb6\xde\x48\x3f\x31\x0f\x7c\x5e\xf8\xb2\x08\x36\xe5\x07\xaf\x45\xd5\x02\x79\x6a\xca\x92\x1c\xbb\x01\x2d\xf4\x93\xcb\x51\x6a\xed\x99\x1b\x4c\x35\x8a\x1d\xd8\x37\x5e\xd9\x6a\x7d\x08\x7d\xd7\x03\x82\x4b\x4c\xd8\xa8\x5b\xca\xa4\x62\x53\x9e\xb2\x7c\x6b\x31\x3d\x4e\x3b\x1e\x76\x3c\x8c\x3c\xc3\x44\x53\x45\x4e\x88\x1b\xaa\x18\xa7\x42\x49\x7a\xd6\x81\x21\xb1\x6d\xb3\x15\xf1\xbb\xb3\x26\xcf\x25\xa3\xfd\x66\x5d\x7b\x77\xff\xf1\x21\xde\x9a\xd9\x73\xbe\x59\x64\x89\x7f\xba\xe6\xf7\xbf\xec\xcf\xe0\xac\xa9\x0e\xbe\xb4\x9c\xce\xb1\xaf\x8c\xef\x3d\x48\xfc\xe1\x30\x0d\xfb\xd4\x3c\x27\x3b\xad\x15\xae\xeb\x3a\x65\x9a\x60\xce\x75\x59\x16\x5b\x95\x13\x21\x70\x50\x80\x85\xc6\x30\x06\x1a\x19\x53\xfd\xc4\x16\xc2\xcb\x54\xe3\xc2\x16\xc8\x50\x8f\xd6\x07\x6b\x9d\xb3\xc7\xa3\xd6\xba\x9f\x12\x41\x1c\x1b\x6d\xd5\x62\xaa\x04\x39\x22\xa8\x60\x43\x89\x48\xc9\x04\x0d\x18\x27\xe5\x1b\xda\xd4\xb0\x1c\x5b\xd6\xd4\x4d\x03\xbb\x3a\x6f\xba\x7c\x98\x0d\xdb\x4d\x56\xc5\x7e\xa0\x2f\x36\xd5\x39\xf7\xf6\x25\x92\xf7\x25\x46\x7d\x85\xa2\x7f\x78\x83\x2e\xff\x78\x0f\x16\x7c\x79\x9d\x75\x27\xe2\x9c\x03\x85\xb1\x66\xda\x02\x19\xd9\x9b\x40\x3d\x94\xe5\x18\x62\x56\xae\x0a\x0c\x34\xc1\xf6\x45\xd9\x83\x3a\x78\xc0\x9b\xb2\x0c\x23\xdc\xd0\x80\x6c\x1f\x39\x82\x10\x63\xc6\x18\xc9\xac\x71\xfb\xbd\x33\x56\x70\x63\x02\x8d\x50\xbd\x64\x9b\xe9\xc8\xd9\x66\xdf\x68\xe2\xfd\x4d\xd4\xef\x79\x7f\xf3\x82\x7f\x5f\xb0\xbe\x5f\x55\xaa\xbd\xf8\xfa\xd7\xaf\xd7\xbc\x2a\x07\x90\x8b\xe7\x64\xe8\x9e\x13\x06\x58\x01\x9a\xc0\xf6\xf3\xb5\xce\xf6\xbc\x38\xbf\x08\xd0\x11\xc1\x15\x61\x84\xea\x26\xc5\x16\x69\x29\xb9\x20\x54\x55\x1b\x8b\xc8\xa1\x71\x2d\xd8\x86\x43\xed\x8e\x3b\x6b\x02\xb4\xbd\x9d\x1f\x82\x85\xb5\xd0\x46\x72\x23\xf8\x08\x0a\x58\x29\x6b\x8d\x30\x82\xef\xce\x9a\xab\x0b\xd7\xf8\x0b\x67\x58\xec\xe9\x38\xee\x6e\x23\x1c\x60\xbe\x05\xe7\xa0\xf0\x87\x85\x63\xeb\xe6\xc3\x39\x4e\xf0\xe9\xee\xf2\xf1\xbb\x57\xba\xaa\xbf\x02\xe7\x62\xbb\xac\x07\xc6\x9e\xf9\x72\xf2\xd1\x70\x6b\xb9\x19\xc3\xc1\x86\xfd\x76\x67\x64\x89\x25\xdd\x1a\x6e\x46\x50\xc4\xa2\x33\x0c\xfa\x60\x22\x63\xce\x26\x97\x72\x6f\x0e\x01\x72\x80\xfa\xfe\xe9\x00\x70\x18\x40\x25\x42\x92\x26\x22\x08\x80\x0e\x42\x36\xe0\x08\xf2\x7e\x08\x3d\x03\xa3\x51\x46\x4a\xb9\x5f\xea\x59\xb7\xb1\xe6\xb9\xda\x98\x33\xda\xe8\xbf\x24\xff\x77\xf2\xff\x24\xff\x6f\xf2\xff\xbd\xa9\xdd\x3d\xf3\x85\xbd\x7b\x81\x0e\xbf\x7f\x71\x41\xde\x3d\xbc\xfb\xf0\x31\x7e\xf6\x0d\x55\xc7\xf7\x37\x3f\x3e\x3e\x6c\x6e\xae\x44\x1d\x7f\x7c\x15\x75\xbc\x10\x72\xad\xe7\xbd\xfd\x2c\x1e\x91\xe5\xe0\xe0\xe2\xea\xe8\x83\x4c\xb7\xe6\xa4\x34\x58\x4a\x7c\xf3\x1d\xc8\xc3\x01\x54\xa0\x98\x20\x90\xe2\xc8\x01\xd7\x00\x86\xf1\x78\x04\x34\x08\x4c\x19\x14\x88\xb6\x22\xec\xaa\xdc\x28\xa3\x91\x6f\x99\x60\x0c\x6c\xeb\x20\x01\x3e\x1e\xc3\x00\x90\x11\x55\x05\x1a\xe7\xf2\xe3\xf1\xb8\x21\x84\x08\x12\x8e\x38\x0c\x5d\x07\x10\x06\x5b\xb2\xa7\x94\x06\x73\x24\xe4\x78\x8c\x6b\xaf\xc0\x18\x62\x42\xa0\x50\xcd\x28\xa1\x82\x88\x53\xc2\x34\x2c\x24\xe1\x82\x0a\x22\x09\x9f\x7f\x40\xcf\x8b\xf2\xc2\x9b\xc7\x33\xb4\x31\x49\xfe\xc2\x03\x79\xc1\xe5\xa6\x37\x8f\xdf\xbd\x3f\xe7\x0d\x1f\x01\xf5\x79\x09\x0c\x27\x86\xc1\x70\xe4\x5a\xd5\xb2\x72\xba\xac\x76\x74\x63\xa0\x56\x2e\x3f\x48\x6a\x7d\x18\x5a\x0d\x70\x7f\x62\x9c\x57\x46\xb2\x24\x59\x27\xe2\x19\xdf\xd4\x19\x89\x16\xca\xbc\xba\xff\xdb\x0b\x6a\xed\xf1\x36\x12\xe0\x6c\xd6\x8f\xb7\x17\xc9\xd5\xd9\x98\xfd\xf1\x31\xc6\x05\xe6\xe3\xf5\x6e\xfc\xb4\x42\x82\x80\x1a\x34\xec\xf0\xd4\xed\x9a\x62\x08\x23\xd1\x8a\xa5\xa5\x04\x3a\x2f\x14\x86\xa0\x09\x4d\x1f\x78\xd6\x9c\x58\xd6\x04\x3d\x8e\x16\x6b\xc4\x6b\x1a\x74\xd0\x19\x61\xa5\xc2\x16\x05\xed\xca\x52\x41\x88\x53\x5e\x16\x46\x98\x22\xa7\x18\x73\x1a\x0e\x18\x7b\x84\x9a\x02\x12\x46\x09\x2a\xb5\x42\xf3\x7a\x25\x63\xac\x6b\xe1\x34\x5a\x66\xfe\xc7\x6b\x4d\x82\x58\x38\xff\x32\xba\xb2\x0b\xb3\xee\x95\x27\x78\x8e\xb4\xcc\x9e\x60\xa1\x18\x17\x22\xdb\x6a\x26\xb9\x08\x95\x07\xad\x9b\x0a\x07\xda\xe3\x6c\x69\xfb\xd9\x43\x0c\x0d\x68\x1c\xe8\x82\xab\x46\x3e\x54\xce\x8d\x62\x67\x43\xb3\x31\x64\xde\x47\x04\xd3\x54\x32\x16\xc6\x50\x0f\x23\x10\xe1\x10\xb8\xad\x02\x91\xd2\xed\x65\x65\xc1\x36\x60\x30\x86\xa3\xd7\x7e\x97\xa4\x89\x5a\x15\x37\x26\xc6\x0f\x7e\x77\x5d\xb9\xb9\x2c\xa4\xe0\x7e\x49\x09\x5f\xfe\xae\xa4\x4f\xd5\xe4\x52\x34\x0d\xa9\x99\x8c\x3f\xa1\x54\x56\xd5\xa4\x52\x17\xa1\x19\x7e\xa3\x89\xa6\x9a\x2a\x94\x96\x78\xaa\xb1\xa2\x9a\x26\x49\xb6\x9e\xf7\x34\xf3\xc2\xcf\xf7\x96\x63\xf2\x61\xb1\x6a\xee\xce\x6c\x10\x37\x86\x52\x2c\x4a\x09\xe1\x6e\xcb\x1c\x77\xbb\x79\xe2\xb3\xdf\x0f\x9c\xe7\x3e\x47\x60\x08\xf3\x60\x06\x39\x38\x66\x43\x80\x80\x9e\x46\x10\xf9\x1c\xd7\x09\x7b\x86\x37\x75\x76\x48\xde\x9d\x95\x6a\xff\xdd\x2b\xda\xf1\xcb\x81\x73\x1e\x37\x9b\x9b\x6f\x8e\x9c\x52\x41\xa0\xc0\xc0\xb4\x7a\x6a\xf6\x23\x3e\x86\x5e\x6a\xc9\xd2\x9c\x02\x8f\x14\x46\xc0\x84\xb6\xc1\x30\x54\x59\x7b\xa2\x59\x1b\x0e\xbe\x52\x54\x61\x32\xd2\x60\x42\x95\x1d\x78\xe1\x85\x29\xca\x40\x5b\x44\x62\x99\x69\x03\x0b\x63\x1c\x61\x84\x29\x56\x14\xe1\x48\x69\x4b\xc8\xae\x84\x98\x32\x0c\x89\x71\xe7\xd8\x36\x79\xa6\xab\xed\xc6\x9e\xaf\x3e\x79\xdd\x05\x96\x71\x7e\x26\xdf\x7d\x29\x5f\xfe\xf1\x92\x2e\x4c\xb7\xbe\x1c\x5a\x55\xf5\xa6\x06\x79\x89\x0c\x43\xfd\xd9\x40\x21\x53\xe7\xa1\x04\x68\x7b\x21\x63\x9c\x37\x03\xd7\x9a\xce\xee\x0c\x46\x8c\x8b\x49\x49\xab\xac\x5e\xf5\xa5\x3c\x4c\x7b\x1d\x9c\x4a\x40\xb6\x7b\xb6\x37\x76\x43\x23\xd3\xe6\xfb\xcd\xcd\x75\xe6\xf9\x63\x34\xa2\xca\x9b\x92\x55\x5d\xac\xae\xe3\xa7\x0a\xc4\x5a\x1d\x57\x21\x60\x37\xd4\xa0\x62\xaa\xdd\x64\x9c\x4b\x8d\x4b\x69\xbe\x75\x31\x0e\x9c\xed\x9e\x65\xdc\x4b\x1e\xae\xea\xec\x97\x52\xbf\xd7\xd2\x96\xc8\xb6\x7a\xe6\x2d\xda\x01\x1d\xf5\x94\x7a\x1f\xaa\x02\x5b\xbc\xad\xb6\xe2\x39\xf1\x2c\x54\xbe\x0f\x76\xed\x77\x3b\x37\xa1\xb4\x9c\xd8\xec\xee\xa3\x1a\xb7\x8a\x70\x50\xa7\xf5\xb4\x4f\x87\x24\x01\x89\x78\x36\x19\x5a\x62\xb5\x8b\x52\x3c\x78\x4c\xee\x1e\xae\x09\x2e\xac\x2f\x20\x60\x38\x94\x02\x58\xd2\x43\x28\x99\xa0\x0c\x21\xd9\x6d\x34\xb4\xf6\x69\x0c\xd2\x02\x9a\x71\xab\x28\x37\x8c\x08\xa6\x80\x4a\x40\xa2\x9f\x69\xc6\xce\xb1\xd2\x08\x6a\xfb\xf4\xf9\x7d\x9a\xac\x1f\x7f\xbc\x7b\x03\x79\xfb\xf4\x39\x55\xae\xed\x2b\x93\x6f\x3d\x0a\x5d\x18\x09\xa8\x45\x7f\x80\xce\x5a\x57\x76\xc6\x9b\x5a\xf3\xd5\x11\x07\xbe\x47\x98\xcb\x22\xa0\x80\x85\xb3\xa0\x62\xd8\xd4\x07\x98\xbb\x23\xf0\x28\x98\x31\xcf\x67\xbf\x63\xd1\xfc\xf0\xc9\x3f\x3b\x73\x28\xbe\x78\x6c\xd1\x98\x00\xb7\x67\x1e\xbf\xb3\xe2\xc7\x79\xf5\xbd\x18\xc0\x91\x3b\xf1\xfe\xe3\x1a\xf9\xed\xf6\x00\x12\x7e\x3c\x0c\xe1\x40\x01\x4f\xa5\x42\x42\x0a\x1e\xf6\x61\xa0\xd6\x08\x32\x19\x29\xb1\x6d\x05\xa0\x25\x32\x1c\x05\xbf\x98\xee\x1b\x8f\xb6\x79\x38\x1a\xef\x40\x11\x0e\x8d\x39\x86\x7a\xa2\x82\x73\x42\xcd\xe0\x0c\x66\x4c\x05\x8d\x89\xe1\x5c\xae\x1c\x42\x8c\x09\x53\x55\x61\x5f\x55\xc9\x3a\xcd\xcf\xd7\xfd\x66\x3e\x6e\x6e\x92\xb8\x90\x5f\x2e\xf3\xe2\x71\xce\x13\xf2\xe7\xc7\x4d\x76\xbe\xde\xd9\x22\x5f\x9f\xdb\xb4\x6a\xaa\x3c\x8f\x34\x4b\xfe\xd4\x7b\x47\xda\xbd\xc4\x94\x81\xa1\x05\x06\x62\xc3\x31\xe0\xfb\x43\xef\x16\x42\xc5\xce\x70\x01\x12\x11\x5c\xd0\xb4\x6d\xcc\xc6\xa3\xbc\x08\x07\xeb\xd9\x84\x03\x27\x54\x4b\x2e\x57\x1e\x96\x16\x24\x61\xcf\x28\x53\xda\xed\xc6\xb0\xaf\xeb\xb0\x6b\x9a\x30\x48\x45\x9c\x1d\xbd\x25\x8c\x45\xdc\x0d\xbb\xa9\x37\x24\x72\x44\x24\xe0\x36\x4f\xee\x2f\xb0\x92\xe4\xb7\xe0\x12\x40\x99\x47\xc1\x77\x77\xe7\x41\x75\xf7\xf3\xe3\xe7\xbb\x4f\x99\x07\x1d\x28\x11\x81\x1e\x59\x15\xda\x69\x08\x84\x3b\x0e\x5a\x0d\x31\x23\x1a\x22\x4c\xb4\x60\x94\x2b\x51\x6e\xc8\xa9\x0a\x3c\xb4\xd4\xe2\xc6\x44\xd4\xce\x70\xf2\x01\x86\x1d\x06\x09\x38\x66\x5d\x18\x60\xd8\x1f\x23\x16\xa5\x6f\xc7\x8e\x82\x02\xe0\xc3\x88\x9e\x13\x9f\x24\x69\xf4\x81\xda\x0d\x4e\x8a\x18\xef\x48\x6f\xf3\xb3\x10\xc2\xc3\x5f\xa6\xb7\xf9\xdd\xcb\x05\x9e\x49\x39\xbe\xbb\xbb\xc9\xe2\x35\xa6\x8f\x9b\x63\x5e\x14\x79\x6e\x4a\xc3\x64\x1e\xca\x46\x7b\x50\x62\x54\x6e\x4d\x49\x28\xd1\x8c\x49\x59\x11\xca\x37\x78\xea\x03\x0d\xfb\xb0\x17\x12\x85\x1a\x94\x60\x00\x1a\xec\xa7\x3c\xa0\xc0\x38\x10\xa0\xcf\x4c\x70\xbe\xaa\xba\x6d\xa8\x8e\xe1\x38\x5f\xb5\x1e\x1b\x0e\xf2\xf9\x6f\xd4\x5e\xf9\x4d\xc2\x9f\x69\x56\x6f\xe8\x1b\x7b\xf8\xec\x75\xde\x2d\xb2\xa2\xf7\xb7\xb3\x65\xf4\xf1\xe1\x5d\xf6\xe1\xe3\xc3\x87\x2b\x5d\xe8\xaf\x55\x73\xaf\xb6\x52\x9d\xa1\xc3\xee\x74\x18\xf7\xa0\x63\x23\x63\x23\x33\x7c\x6a\x53\x37\x29\x9e\xe1\xd0\x60\x89\x50\x41\x70\x1e\xea\xd4\x32\xa4\x21\x0d\x5c\x63\x25\xe4\x86\xda\x2a\x20\x30\xc4\x8a\xc2\x7a\xde\x58\x76\xa1\x34\xda\x84\x4a\xd0\xc2\x16\x18\x50\xa2\x0c\xd1\x8a\x90\xd6\x08\x9b\x24\xab\x84\x3e\x57\xd9\x10\x79\x72\x2e\x55\x6c\xf3\x80\xbd\x3b\x67\xe6\xd6\xf7\xef\x5e\xd8\x84\x6e\xef\xd3\xbc\xea\x05\xc0\xd6\x15\xe5\x50\x69\x17\xca\x28\xb4\xac\x42\xe9\x23\x58\x67\x2d\x0f\xf3\xd6\x0b\x0a\x48\xb0\xad\x74\x75\x70\xed\xe4\x7c\xb6\x9d\x37\xb1\x98\x77\xe4\xcf\x74\x95\x6f\x74\x64\xb8\x88\xfb\xf0\x39\x7a\xf5\xf0\xd2\x0f\x31\x14\x77\xa5\x5f\x12\xf1\x6d\x6f\xde\x58\x28\x2c\x1f\x6e\x1f\x3e\x7e\x98\x2f\x0e\x6c\x2b\x50\xf8\xb6\xdd\x01\xc7\x39\xc4\xd0\x96\x24\x2f\x50\xce\x48\xc9\x04\xa1\xcf\x89\x43\x79\x51\x16\x8c\x14\x8c\x13\x72\xf0\xc0\xee\x9a\x06\xb4\x61\x0f\x8a\x8d\x6e\xdb\xd6\x85\x83\x3d\x49\x2e\xb6\x8e\x7a\x44\x89\xcd\xb9\x52\x23\xa9\x7a\x50\x9d\x14\x20\x90\x10\x09\xb9\x16\x3b\xe2\x1b\x60\x4e\x64\xc5\xa2\x90\xab\x4d\x92\x6d\xe4\x15\x58\xd6\xdf\x6b\xcc\xe8\xe7\x73\xee\xf8\xfb\x1f\x3e\x94\xaf\xe5\x8c\x11\xa0\x15\x83\x0d\x7f\x9e\x2e\xa9\x6a\x10\xf7\xba\xeb\x4c\x4f\x66\x69\xd8\x05\xcd\x1a\x90\xd3\xad\xdf\xda\xe0\xc3\xd1\x3a\xc0\x01\x9f\x0c\x38\x46\x8e\xcd\x78\x04\xe7\x33\x78\x22\x20\x57\xba\x11\x1e\x1c\xad\x12\xda\x6e\xb4\xe6\xa8\x2c\x0a\x24\x90\x65\x84\x00\xac\x60\xe0\x53\x92\x25\x3b\x29\x95\x10\xa1\x97\xa0\x9b\x0a\x0b\xb9\x61\x16\x4b\x26\x8d\x89\x76\xa8\x7a\xe6\xab\xed\x55\xdd\xd5\x5f\x45\x5e\xa5\x08\x9c\xfb\xf8\x21\x32\x3b\x5d\x6b\x97\xc7\xad\x60\x11\x0d\xfa\xf4\xf9\xe7\xc7\x2a\x12\x0b\x9d\x7a\x98\xb9\x93\x42\x59\x79\xda\x45\xba\x1b\x4a\x11\xa1\x08\x7a\xea\x8b\x60\x02\x2e\x8d\x82\x78\x53\x1c\x66\xa7\xfa\x10\x8c\x71\x3a\x60\x57\x07\x27\x4d\xbe\x15\x06\xb9\xd2\x48\x52\x6d\x0b\x3e\x5f\x0f\x28\x9e\xd5\x8d\xce\x50\xf4\x87\x97\x5e\x7d\xcd\x2f\xbc\xbb\xa6\xb3\x9b\xb7\xd1\x9f\xce\xfc\xc6\xc0\xad\xcc\x93\xf1\x19\x3b\x35\x5a\x81\x43\x8a\x5c\xee\x51\x37\xd9\xa9\x6b\xd7\xf6\x74\x08\x25\xd8\xa5\x2a\x40\x30\x66\x28\x8c\x92\x4f\x35\x2d\x0b\xac\xb0\xe7\x44\x80\x36\xd4\x7b\xad\xf5\x62\x5b\xb1\xd5\x6e\xc3\x92\xdb\x33\x36\x2c\xf2\x45\x9d\xc1\x43\x67\xc3\x29\xcd\x7e\xba\x7f\xf7\xfd\x92\x1e\xbf\x4e\x1c\xdc\x5f\x24\x6a\xb3\x1f\xde\x7f\x8e\xdf\x5d\xe8\xb2\x7f\x7e\xcc\x4a\x26\xa8\x10\x62\x1e\x81\x82\x73\x65\xfd\x3e\xe4\xa0\x15\xb3\xc3\x57\xa8\x16\x19\xc1\x85\xe0\x14\x95\x61\x67\xb2\x64\x4a\x3c\x18\x02\xda\x72\xdc\xe2\xa2\x82\xc5\xae\x98\x86\x40\x19\xc0\x88\x6e\x88\xc6\x4c\x31\x8c\x10\x22\x8a\xa2\x23\x01\x16\x20\xec\xf2\x70\x64\x4e\x78\x61\xa8\x16\x44\x62\x2a\xe4\xa4\x03\xb5\x75\xa8\xb4\x2b\x1d\x47\xa6\x40\xd6\x92\x0a\x46\xdf\xfd\x9f\x26\xec\x99\xac\x86\xc8\xb7\xbe\x8c\xd8\x05\x67\xf6\xf9\x25\x57\x10\x3d\x9d\x45\x4f\xe9\x1c\x50\xfe\xf8\xe1\xe3\x99\x66\xee\xf2\xf7\xb7\x17\x39\xe7\xc8\x8f\xf7\x8d\x90\x59\x84\x1a\x49\x57\x94\xe9\x28\x9d\xf3\x4f\xb5\xd5\xba\x2c\x65\x97\x3a\xee\x98\x8b\xe5\x0e\x6c\xc7\xf9\xd4\x58\xc6\x8d\xc8\x84\xa2\x8e\x48\x45\x4a\x5f\x62\x89\x1d\xdc\xe8\x92\x51\x17\x8c\x0b\x8d\x73\x80\xb9\x1d\x2c\x75\x17\xd0\x35\x45\x4b\x28\x5f\xd5\x91\xa7\x3d\x3d\x5a\xed\xba\xaa\xe1\x6d\x85\x5c\x8d\x5b\x57\x54\x75\xd1\xc5\x39\xaa\x9f\xe9\xca\x7e\x55\x3b\x1d\xb5\xb1\xfe\x40\xe5\x74\xbc\xa5\x1f\xcf\xf5\xd3\x3f\x9f\xb9\xf0\x1f\xf7\x19\x3f\xd5\xfe\x12\x15\xdb\x67\x87\x53\xee\xad\x05\x85\x73\x6e\xa2\x63\xa7\xe8\x04\xb3\x9a\x3b\xa7\x85\x6b\x76\x61\x14\x20\x69\x6c\xf5\xad\xba\xe9\x69\x24\x8c\x71\xab\x9d\x24\xd4\x0a\xaa\xb0\x83\x04\xe3\x24\x49\x6e\x22\x17\xd0\xb8\xa1\x6f\x38\xe6\xfe\xf6\xc2\xc1\xf1\x0d\x96\xef\x0f\xef\x1e\xde\xb2\x7c\xcf\xc7\x75\x59\xf5\xe7\x87\x2e\x6b\x82\x01\xa3\x0d\x8d\x0f\xde\xce\x0e\x78\x64\xd5\x4a\x8b\xfd\x7e\xea\x22\xcb\x77\x94\xf7\x9b\x74\xb6\x3f\x15\x7c\x65\xa7\x6d\x99\x76\x85\x54\xae\x2d\x7a\x07\xe1\x76\x2a\xd8\x71\x43\x8d\x08\x7b\x3f\xcf\x21\x0f\x0a\x11\xda\x33\xb5\xb7\xd0\x4a\xab\x30\xfa\xc2\xe4\x44\x1f\x92\x6d\x22\x9e\x69\xe4\x9b\xff\xaf\x5e\x10\x81\x8b\xee\xeb\x95\x16\xd9\xed\xc3\xa5\x46\xf7\x85\x3c\xec\x0b\xf8\xda\xdf\x47\x1e\xe6\x41\xb5\x30\xc0\x38\x42\xb1\xcd\x8b\x60\x43\x51\xee\x77\x41\x03\x1b\x44\x73\x38\x00\x7b\x9c\x4c\x7c\x2a\xf2\xa2\x9d\x5c\x7a\xf0\xe3\x48\x95\xa0\xa5\x90\xe5\x94\x03\x42\xa9\xc1\xec\x8a\x36\x0c\xe3\x3f\xc0\x1b\xe6\x86\x25\xc7\xd0\x16\x2f\xbc\x61\xdb\x44\x45\x0d\x2f\x1b\xb9\xfa\xff\xec\xc5\x87\xff\x0f\xaf\xfc\xcb\x57\x71\xec\xbb\xb3\x48\xe9\xed\xd5\x10\xcb\x6e\x5f\x95\x33\xd7\xb3\xdf\x76\x7e\x9d\xee\x51\x01\x4c\xd8\x81\xe2\x34\x6c\x95\x53\xa0\x2e\xca\x46\x5b\x6b\x2d\xc8\xb5\xd3\xa4\x2b\x2b\x47\x5c\x37\xf5\x94\xc0\x23\x75\xcd\xc6\x72\xe9\xfa\x50\x04\x18\x3c\x8f\x4a\xee\x1d\x23\xa1\x88\x51\xbc\x6a\x9c\xff\x4c\xc5\x73\x42\x15\x85\x34\xad\x7a\xbb\x3d\x16\xa5\x52\x34\xad\xfb\x97\x7a\x4f\xb2\x6a\x37\x32\xb9\xbb\xe8\xa0\xc4\xfb\xf4\x96\x73\xea\x7e\x11\xd7\x8f\x64\xc4\x31\x91\x1a\x6b\x21\xbe\xbf\x59\xbd\xbf\xf9\xf9\x52\x5e\xe9\xc1\xd6\x1d\xfc\xe1\xe0\x0f\x2e\x1c\xc1\xe0\xc2\x8e\x03\x28\x83\x03\x75\xb1\x0d\x4d\xc6\x43\xbd\xcd\xc1\x38\x1d\xb7\x60\xbb\xd3\x7d\xc0\x97\x59\xb4\x6e\x9b\xa6\x69\x9c\x31\xc6\x3c\x91\x81\x7b\x36\x3a\x4c\x66\x9b\x82\x60\x97\xe7\xda\x9b\x2a\x73\x3a\x78\x3d\xcf\x0d\xf9\xcc\x56\xed\xd7\x5a\x4c\x77\xff\x00\x2d\x26\x97\x1d\xc3\x0e\xb0\xa7\x06\xe0\x70\x00\xb5\xf7\x60\x67\x98\x90\x62\xa2\xa4\x70\x05\xce\x8c\x9f\x0e\xde\x47\xb0\x58\x3e\x1d\xde\x48\x31\x31\x3a\x28\x61\x6d\x55\xc1\xc6\x4f\xf2\x34\x48\x99\xa1\xb0\x73\x81\xbb\xb9\x1f\xe7\x79\x5b\xc7\xfa\x91\xc7\xe4\xdf\x2f\x2a\xc7\xd7\x65\xc5\xb7\x91\xaa\xf3\xe6\x05\xd9\x3d\xcf\x85\xc8\xca\xf0\x70\xf7\xa2\x3f\x90\x5f\x11\x8a\xad\x3f\x7c\x7f\xfd\xa5\xf9\x76\x7c\x02\x9d\x23\xa9\xd7\x0d\x55\xa5\x27\x8c\x4c\x4e\x38\x71\x24\x56\xa0\x5c\x6f\x61\x65\x43\xad\xc2\x8e\x74\xc2\x79\xa5\xc5\x5e\xcd\xab\x6f\x75\xfe\x32\xcf\x61\xc8\x4d\x6e\x6d\x18\x49\x38\x88\x1d\x1a\xac\x2e\x36\xb6\x14\x53\xbb\x2b\x5c\xe1\x80\x95\x54\xb8\xa3\x15\xbe\x30\xc2\x1e\x5a\xa2\x11\x0b\x48\x53\x69\xc7\x12\xa3\xa9\xdd\x17\xae\x60\x0a\x08\x6a\x84\x3b\xf6\xca\x30\x79\x74\xfc\x12\x8f\xa0\xab\x7e\x83\xe2\x2c\x78\x8c\x31\xfc\x04\x3c\x9c\xc1\xfb\x97\x58\xe3\xe2\x05\x9d\xf3\x6c\xaf\x60\xdc\xcb\x04\x7f\x9b\x1e\x5c\x3e\xda\xcb\xc6\x54\x59\x7f\xea\x33\x3c\x75\x9c\x14\xd2\x93\x72\xb6\x7c\x01\xa3\x04\x15\xa6\x44\x82\xc9\x76\x0c\x1d\x18\x7d\xdf\x13\xc5\x68\xc1\x79\x11\xa0\xa5\x58\x12\x9a\x0d\xdd\xb4\x0b\x9c\x81\x16\xec\xd3\xa3\x0d\xb5\x09\xbb\x12\x1a\x82\x70\x7a\x34\x61\x5f\x42\x0c\x29\x81\x94\xaa\xd6\x04\xe1\x9c\x0d\xbb\x33\xd3\xfc\x16\x13\x6e\x24\xbd\x8c\xb5\xea\x1f\xa1\x49\xf6\xca\x59\x63\xdc\x44\xbc\xc8\xd0\x69\x70\x17\x2c\x38\x40\x65\x09\xea\xa7\x03\x68\xf3\x42\x4a\x73\xa0\x43\x0a\x1b\xa7\x7c\xfd\x0d\x3d\xb2\x9e\x0a\x6b\x09\x0e\x9d\xaa\x94\xe3\x5e\x3a\x5b\xcd\xbe\xb9\x8a\xe3\x4c\x47\x3f\xf3\xbc\x4b\x7d\xbc\x7f\x29\x62\x78\x38\x5b\x6e\x4b\x99\xc3\xc2\x56\xf2\x76\x0f\x03\xc5\x71\x30\xfc\x74\x00\x2e\x28\x2f\x95\x50\x5d\x77\xf0\x87\xae\xeb\x00\x0f\x1a\xd4\xca\x55\x4e\x54\xed\x21\xb4\x14\x14\x7d\xdd\x83\x8a\x4b\xa1\xbd\x4f\x77\x98\x6b\x06\x6b\xdb\xcd\x36\x4a\x67\x3b\x7f\x1a\xbc\xaf\xb5\x10\x4e\xab\x8a\x3a\xac\x66\xf3\x2d\xc9\xa2\x0d\x25\x36\xf6\xd2\x5f\x67\xa6\xad\x2b\x89\xc6\x74\xfd\xf8\xe9\xee\xe1\xe3\x87\x7f\xf7\xf9\xf6\x21\x6a\x9c\xdc\x2c\x08\x03\x97\x22\x49\x3c\xe6\xbb\xa6\xeb\xaa\xb0\x87\xcf\x89\xea\xd1\x30\x6e\xfb\x54\x85\xe3\x56\x53\xec\x10\x5d\xe7\xf5\x80\x5b\xeb\x03\xf5\x13\x4a\x87\x90\xef\x75\x07\x2a\x4f\x28\x40\x11\x25\xde\x11\x9c\xb5\xca\x12\xab\x2e\xd7\x92\xed\xfe\xc0\xb5\x9c\x8b\x83\x3e\x7e\xf8\xf4\x31\x32\x8f\xbd\x5c\x8b\x07\x8d\x60\x9e\xf1\xc1\xb5\xad\xdf\x95\x83\xaa\xcb\xaa\xde\x3a\x70\x1c\xb6\x56\xce\xb6\xca\x3a\x6f\x7a\xd4\xba\x97\x0b\x29\x0e\xbf\x7e\x21\xf3\x75\x90\x0c\x6f\x68\x8c\x99\x7e\x77\xd1\x85\xbf\x3c\x6e\x92\x9b\xc7\x1f\x53\xe5\x8e\xa1\xe6\x00\x82\xc4\x1e\x43\x23\x00\x04\xa5\xf3\x61\x3f\x0a\xc0\x36\x94\x86\x7d\x6d\x4d\x38\xb0\x30\x36\xf3\x68\x65\xbb\x70\x74\xae\x8f\x1c\x4f\xfa\x59\xdd\xf8\xac\x4c\x1e\xe2\xca\x1d\xd3\x41\xf3\x08\xf8\x82\x09\xf0\x25\xb2\x79\x48\x93\x69\x48\x91\x3b\xf8\x14\x4d\x43\x94\x7f\x63\x53\x93\xba\xe3\x2e\xd5\x51\x1c\x36\x01\x3b\x69\xf8\x69\x97\x15\xcc\x48\xa3\x8c\x72\x4e\x19\xb5\xd4\x4e\xa8\x33\x27\xc4\x4f\x71\x57\xff\x78\xcd\x4e\x7c\x7f\xfb\xfd\xa5\xda\x29\x66\x89\x17\x96\xe2\x48\x11\xf4\x29\x8b\x10\xb7\xbb\x0f\x0b\x4d\xd0\x87\xdb\x55\xeb\xca\x02\x0c\x5c\x02\x1c\x3a\xa1\xd0\xd6\xe5\x18\xf6\x15\xb3\x61\x27\x01\xd4\x61\xc4\xd4\x0b\x24\x01\x52\x2c\xd4\x2c\x6f\xca\xed\x08\xe4\xb6\xd8\x6f\x34\x22\xc4\x6a\x31\x55\x01\x12\xd2\xc2\x3d\x41\x84\x03\x1d\xda\x9d\x3e\x02\x9a\xe6\xd8\xd6\x2d\x0f\x54\x68\x33\x0d\xb6\xef\x2d\x60\x49\x16\x71\x13\xf5\xd9\x1e\xf9\x7b\x73\xec\xb7\x0f\x97\x3c\x7b\xa6\x81\xc9\xb7\xe1\x40\x40\x0d\x38\xad\xdb\x02\x8c\x61\x2f\x8e\x2c\x8c\x8a\x89\xb0\x57\x47\x1a\x9a\x54\x7a\x1f\xfa\xca\xf6\xaa\x32\x2b\xaf\x6c\xe9\x20\xb3\xb0\xa8\xb4\x3f\x6a\xeb\x80\x0c\x43\x27\x9b\x31\xf8\x53\x97\x91\xa0\x43\x6b\xb5\x04\xc5\xbc\xb6\xe8\x67\x12\xe3\x05\xbf\x66\xe3\xc5\xb1\xb9\xd8\x78\xe0\xc3\xbb\x87\x68\xe3\x9d\x9f\x2f\xa2\xc9\xaf\xaa\xf9\x4b\xa5\x42\x9f\xfa\xb0\x07\xc2\xec\xf4\x68\x00\x0f\x47\x50\x3b\x17\xe6\xed\x8d\x7b\x1f\x6a\xe7\x70\x2a\xa6\x4a\x66\x45\xe0\x98\x18\x8b\xa4\xa4\x06\xee\xf6\x88\xe1\x61\x43\x8d\x09\x7e\x1f\xb6\xe0\xb8\x07\xd2\x04\xa7\xb5\x56\x5a\x6b\x6b\x94\xad\x64\x8e\x04\xf1\x35\x53\x24\x37\xa2\x5d\x6a\xee\x2e\x3c\xfe\x7f\x79\xd6\x98\xbf\x79\xfc\x2e\xaa\xae\x2e\xf1\xdb\x17\xdf\x21\xfa\x0f\xef\xe2\xb4\xba\x3b\xbb\x0c\xeb\x02\x31\x4f\x1c\x44\x5d\x81\x2c\x2e\x7c\xeb\xbd\xf7\x5d\xd8\x5a\x40\xce\x14\x09\xdc\x81\x02\x60\xe4\x9c\x33\xa5\xf7\x36\x1c\x6d\x38\xd8\x30\x18\xb3\x62\x60\x1b\x8e\x41\x82\x3c\x1c\x02\x8d\x1c\x25\x20\xd5\xcf\xc7\x55\xbd\x56\x31\xfe\x79\x5e\x0b\xd3\xec\x25\xa9\x78\xf7\xf3\x63\x86\x29\x81\xdb\xb0\x03\x6d\xce\x29\xb1\x25\x94\x5e\xd4\x52\xa8\x15\x32\x6e\x3f\xba\x90\x87\xae\x69\x89\x92\x07\x6b\x2b\x00\xf7\x7d\x92\x66\x2c\x29\x56\xc7\x8d\x4a\xd6\x91\xe9\xf0\xac\x8b\x77\xb6\xd5\x1e\xb2\x83\x40\x06\x71\x08\x72\xc2\xa9\xd4\x66\xa3\x9c\xa7\xde\x06\x7c\x1a\x05\xf7\x96\x67\x3c\xda\x54\xfc\x99\x66\x6a\xa3\xce\x11\xc1\x7f\x91\x24\x77\x97\xfc\xfb\xbb\x3f\xa2\x97\x8e\x45\xa1\x2c\x73\x65\xd9\x15\xd8\xd0\xa2\x6a\x9d\x73\xae\x0d\xb9\x05\x38\x82\xed\xb3\x03\x2c\x44\x07\xaa\xa2\x32\xf9\xb9\x9b\xf6\x36\xec\x4d\xd8\x19\xb3\x22\xa0\x08\xfb\x20\xce\x8f\x65\x72\xb9\x9e\xe8\xe3\x5f\xd5\xe8\xbc\xde\xaf\xfb\x97\x2b\x79\x91\x43\xfa\xee\xfa\x72\x80\xa8\x20\x3a\x40\xea\x19\x6a\x9f\x93\x61\x18\x06\x90\x4f\xd6\x41\xc4\x5a\xc0\x62\x55\xc1\x46\x23\x67\xbd\x41\xbe\xf1\x4b\xad\xd5\x73\xe2\xed\x4a\x31\x6a\x01\x5f\x0a\xb0\x16\x6a\x96\x33\xf8\x7c\xb6\x39\x87\x4c\x6e\xb6\x11\xa7\x77\x1b\xef\xde\xed\x59\xc1\xe7\x95\x99\xf3\xa7\xdb\xfb\xf4\x08\x51\x11\xba\xa0\xb0\xf0\xd7\x6a\x4a\x9b\xed\x2f\xfb\x6d\x6e\x25\xf5\xf9\xda\x05\x08\xc8\xe9\x08\xc8\xe9\x80\x40\x11\xe3\x4b\xe4\x26\xdf\xe8\x33\xa6\xf3\x05\x05\x76\x96\x39\x99\xad\xd5\x15\xc1\x30\x55\xbf\x54\xbd\x53\x2c\x1d\x4a\x18\xf2\x55\xff\x84\x37\x9a\x89\x20\x42\x3d\x1d\x83\xe6\x7b\xa0\xc1\x36\xed\x29\x0e\xd2\xc5\xdf\x89\xb3\x76\x53\x2e\x59\x9d\xbb\xfb\xd7\xfd\x63\x61\x7d\x5d\x0a\x0a\xe7\x3e\xab\xb2\xc4\x37\x8d\x6f\x77\xa6\x6f\x1a\x03\x86\x76\x53\xba\xa9\xf2\xa7\x26\x63\x68\x1e\x6c\xf3\xba\x5e\x23\x3f\xcf\xc5\xf9\x98\xd7\x02\xf5\x8c\x6e\xdc\xaa\x88\x16\xc6\xe3\x95\xae\xed\xfd\xed\x57\x6b\xf7\xe7\xf3\x2d\x8b\x29\xe6\xb3\x19\x09\x7e\x05\x28\x0c\xf0\xda\x4c\x51\x7f\x27\x23\xc7\x5d\x46\x62\x95\x91\xad\x46\x88\x14\x43\x32\xc0\x54\x4b\x04\x6d\x01\xdb\x27\x62\x39\x37\x72\xb5\xc5\xa5\x2f\x70\xca\x19\x72\x88\x9e\x8e\xb8\xf0\x05\x5a\x15\x01\xcb\xd9\xe6\x15\x4a\x6a\x8a\xa9\x90\xbb\x1d\x93\x88\x92\xdd\x69\x60\x15\x57\x52\x46\x5c\x30\x94\x8a\x68\x41\xa4\x41\x26\x72\xbd\xae\x92\x33\xa7\xf2\x25\x0f\xf6\x42\x77\x38\xf7\x5a\x34\x9f\x1e\x2e\x5a\x7a\xab\xc4\x7a\xc0\xbc\x31\x3e\x34\xde\x82\x17\xaf\x7e\x5d\x2c\x05\x37\xa1\x72\xbf\xb4\x55\xb5\xa6\x01\x83\xfe\x69\x1f\xf9\x7b\x56\xfa\x5c\xdf\xb5\x60\x81\xcf\x18\xe4\x4b\xad\x64\x04\x0d\xc9\xa5\x40\x8f\x55\x41\xf8\x03\x07\x55\x10\x1b\x13\x9c\x0b\xe6\x44\xbd\xcf\xda\x49\xa5\xf3\xef\x29\x23\xa7\x9f\x8e\x9c\xb4\x09\x78\xbf\xfe\x33\x10\xf7\xb0\xd9\x7b\x4e\xb2\x9b\xc7\xcf\x69\x76\xd1\x4f\xbc\x51\x79\x28\x71\x8f\x8a\x72\x1b\x75\x73\xc3\x9e\x0e\xe5\xae\x2c\x2a\xd8\x2b\x66\x89\x5e\x79\xcf\x43\x11\xa8\x73\x28\x1c\x3c\xd8\xa7\x1c\x7a\x08\xb6\x80\x4e\x7d\xba\x3d\x8b\x16\x65\xab\xed\x19\xef\xf5\xcf\x92\xef\x62\x6e\x25\x3d\x47\x59\xbf\x9b\x4f\x71\x51\x6f\xfe\x3e\xea\xfb\xde\xdd\xaf\x07\xdf\x29\x90\x3b\x9b\xe7\xdd\x8e\xf7\x15\x85\xae\x64\x87\x74\x50\xcc\x89\x9e\x4e\xc3\x5a\x84\xae\x53\xa0\x04\x9e\xc2\x32\xf4\x8d\x6f\xb6\xa6\x9e\xdd\x00\xeb\xf8\x73\xd2\xd5\x76\x07\xf8\xd9\xf6\xa8\x37\x2e\x2a\xd0\xfc\xd9\xcb\x39\xa3\x49\x78\x73\x39\xe5\x82\xbc\x4f\xa1\x1f\x14\xc8\x2b\x5b\x56\x95\xd2\x96\x41\x57\xd2\x63\xda\x55\x9d\xee\xd4\xb4\x5f\xab\x78\xba\x02\x78\xc6\x6c\xa3\x7d\x65\x2b\x54\x9b\xe0\x6c\x50\xa1\xe3\x80\xcf\x3b\x5b\x72\xae\xe3\x3d\x6c\xf4\x59\x65\xef\xfd\xfa\xbb\xbb\x1f\x5e\xea\xb1\x1f\xd3\xb7\xbd\x9a\xf1\x3c\x28\xa4\x19\x86\xd0\x17\x4a\x18\xe5\xd1\x50\xee\x8a\xad\x2b\x3b\x35\x9b\x94\x2b\xeb\x69\xc0\x61\xec\xb4\x2e\xf7\x7e\x04\x30\xa5\xa5\x2f\x97\x6e\x05\x87\xc8\xf9\x70\xb6\x81\xe8\x8d\x05\xfb\xc8\x09\x7f\xc9\xbb\x3d\xdc\xde\xeb\x0c\xfb\x8c\x9c\x3a\x7f\xea\x01\x77\xf3\xdd\x07\x26\x49\x92\xdf\xa4\x4d\xc4\xdc\x5c\x62\x42\x3f\x27\x24\xe2\x84\xff\x73\xc2\xdf\xf2\xe9\xdd\xbd\xd6\xa5\x5c\x7c\xb4\x4f\xff\x0d\x78\x9f\xde\x7c\x7e\xfc\xe9\xf2\xe2\xf3\x1b\x22\x88\xcf\xef\x37\x77\x57\xa8\xb1\x6b\xf4\x76\x46\xb3\xf1\x04\xdd\x45\x40\x68\xcf\x90\xde\x16\xed\x1e\x3a\xa3\x54\x61\x98\xa3\x8c\x12\x6a\x7d\xd7\x96\xa0\x22\x98\x19\x57\xb5\x51\x85\xbb\x6c\xc7\x52\x49\x29\x0b\x45\x6c\xe9\xa2\xdc\x6a\x45\x91\x83\x24\x6c\x2d\x23\x8e\x03\x8f\x91\x2b\xc9\x86\x4d\x16\xe8\xd9\x51\x9e\xa8\xf5\x04\x21\x54\x2a\x5d\x95\xb9\x91\x35\xb4\x6c\x9b\x6b\xf4\x9c\x34\x88\xee\xb6\xb9\x45\xe1\x50\x21\x46\x5d\x45\x25\x2a\x95\xf2\x30\x7e\x49\x4e\x95\xab\x69\xe5\xb0\xa9\x48\x65\x11\x69\x34\x75\x56\x7b\xe2\xcf\x1a\x6d\x4d\xcc\xfb\xeb\x38\xa3\xff\x45\x82\xa2\xff\xb1\x30\xb9\x2e\xd1\x80\x77\x2f\x11\xd1\x87\xbb\xfb\x37\x8c\x43\x4b\xf5\xec\x0b\x49\x0d\x04\x25\x76\xb3\x2f\x87\x8a\x32\x1d\x82\x02\xc3\xd3\x01\x22\x35\xd8\x5d\x05\xf8\x31\x2b\xa4\x62\xb2\xb4\x94\x4e\xd6\x47\x7c\xf5\x7c\xac\x0f\xb6\x94\x0e\x63\x63\x2d\x42\x50\x75\xc7\x60\x6d\xf0\xa7\x23\x17\x85\xdd\x52\x11\xba\xac\x3b\xca\xe0\x75\xd4\x79\x5c\xe6\xf4\xc2\xb4\x73\x59\x1d\xae\x3d\xcc\xa5\x3a\xe1\x42\x47\x98\xde\x5c\xb4\x77\x7f\x78\x1f\xc1\x9f\x11\x21\xc5\x04\xe7\x05\xe7\x28\x90\xd2\xa9\x70\x04\x04\x96\xbe\x84\x29\x9c\x6a\x69\x00\x0c\x3b\xab\x07\xd1\xa5\x7d\x6d\xa5\xab\x56\x2c\x38\x3b\xb5\x8a\xe5\x2e\xe7\x69\x69\x47\x50\x3a\xe3\x4a\xad\x5d\xd8\x8d\xe1\x48\xc3\xd8\x9a\x6e\xdf\x1d\x0c\x38\xf3\x11\xa7\x4b\x2d\x4c\x9e\x64\x67\x15\xfc\x6f\x68\x80\x7e\xfa\x52\x04\xd4\x65\xe2\x54\xe9\x95\x08\x85\x6c\x09\x2e\x19\x25\x38\xa0\x4c\xd7\xb3\x45\x33\x75\xce\x56\xa6\x3e\xab\x80\x0a\x15\xab\x85\x60\x66\xce\x32\xa0\x0c\xc0\x2b\x19\xd0\x38\x47\xc9\x8d\x4a\xd1\xa2\x33\x79\xb7\xe0\xb4\x96\xd5\x73\x81\xf4\xcc\xbb\x64\xb5\x19\x9e\xf6\x7e\x95\xfb\x53\xe9\xad\xa3\x80\x76\x01\x83\x36\xdb\x9d\xca\x14\x39\x11\xb6\x10\x01\x8d\x91\x15\x32\x88\x26\x49\x6e\x22\x8e\xca\x5f\xe1\x93\x2f\xfd\xff\x1a\xf5\x3b\x2b\x35\x7c\x7c\xc3\x1a\xf1\x15\x73\x84\x05\xb5\x8f\x4c\x6d\x92\x3f\x8d\x12\xc8\xc0\x63\x86\xff\xfa\xa0\xc6\x76\xb2\x4e\x8b\xae\xd2\xbe\xd9\x24\x4a\x59\x75\xc2\xd6\x66\xbd\x0a\x5e\x85\xea\xf2\xef\x20\xbc\x74\xcc\x08\x6d\xad\xb8\x6e\xb7\x5c\xaa\x13\xef\x96\x91\xfb\xcd\x86\x0f\x54\xac\xf0\xdc\x72\xe3\x18\x40\x5d\x60\xe7\x96\x4b\x4f\xf0\x74\x20\x14\x78\x82\x9c\x54\x21\x0a\x98\xaf\x33\x7a\xd6\x98\xb9\x56\x13\x7e\x1f\x45\x94\x5f\x4d\xbc\xcb\x3e\x1e\x03\xea\x11\x6b\xb2\xb9\x79\x2c\xc1\x55\x40\x7d\xde\x21\x6f\x12\xda\x8c\xa0\xd1\x75\xed\x03\x02\xcd\xa9\x00\x55\x60\xb6\x6d\x0d\xa8\xab\x16\x81\x06\xe4\x95\xaf\xaa\x0a\xe0\x6a\xa3\x6d\x59\x8c\x36\x0c\x3e\xec\xfd\xe8\xdc\xe8\x41\xe1\x01\xb2\x7d\xbe\xf5\x53\x12\x59\x9e\x50\x18\x2e\xb5\xa5\x0b\x3e\x01\xc6\x5a\x6d\x18\x11\xa4\x67\xd2\x86\x45\xd0\x63\x1e\x67\x9b\x9b\x1f\x6e\xbf\xdf\xfc\x0d\x78\x5c\x24\xf2\xa2\x03\x37\xaf\x7e\x5f\x96\x48\x3c\x2e\x5d\x95\x99\xec\x18\x2a\xa5\x05\xf1\x5a\x62\x5a\x8e\x72\x87\x60\x89\x8c\xb1\x50\x30\x84\xf6\x61\x60\x80\x1f\xcb\x12\x33\x62\xf2\x42\x08\x26\x39\x44\x1a\x96\x9c\x60\x2d\x05\x28\xbb\x50\x6e\xa0\xf3\x4a\x79\x3d\x6a\xc1\x43\x12\xf6\xf3\xf6\x7f\x2c\xcb\xe1\x39\xd9\xed\xfc\xd6\xfb\x26\x98\xce\x0f\xa0\x32\x54\x50\x4b\x11\xe2\xd0\x10\x4a\x30\x85\x88\x0b\xc6\x91\x31\x87\xa8\xd3\x65\xa3\x7f\xb7\xe4\x2e\xcb\xe4\xe7\x17\xe4\xc0\x8f\x73\x1b\x92\x79\x5a\xad\xe3\xd4\x7e\x45\x7b\xdf\x2d\x53\x3d\xaf\xf2\xe2\x08\xa0\x08\xc7\x70\x18\xc2\x81\x03\xfd\xff\xd3\xf6\x2f\x41\x92\xe3\xfa\x7e\x18\x4c\x20\xab\xb2\x38\xe7\x7c\x8a\xcb\x3a\x3d\x3d\xcd\x2b\xe9\x7e\x83\x3a\x3d\x33\xcd\x13\xb6\x24\xe8\xf6\xed\x1e\x58\x57\xe7\x0a\x76\x58\x61\x38\x6c\x2b\x60\xd9\x92\xa1\x70\x38\x04\x45\xf8\x81\xb0\x1d\x61\x78\xe1\x08\x2c\xb1\xc4\x12\x4b\x2c\xb9\xe4\x92\x4b\x2e\xb9\xe4\x32\x97\xb9\xe4\x92\xcb\x5c\xe6\xed\x4a\xa2\x1c\x04\x33\xeb\xd1\xdd\x73\xce\xd5\x0d\xb9\xaa\x59\xc5\xca\xca\x99\x4a\x32\xf1\xf8\x3f\x7e\x0f\x09\xed\x6c\x41\xc6\x51\x8d\x58\xec\x20\x09\xac\xd5\x0e\x98\xfb\xae\xd5\xa8\xae\xe4\xd6\xe0\xaa\x8a\xfb\xb6\x6e\x00\x8f\xfd\xce\x03\x1c\x7b\x2f\x0e\x47\x0c\xf2\xc3\x4c\x81\x02\x82\x44\x17\x0f\x61\x53\x1d\x0e\x18\xe4\xd3\x32\x36\xc4\x39\x5f\xfa\x7b\xcf\xa2\xef\x17\x48\xbc\x27\x35\xd9\xaf\x56\xc2\xed\xa5\xd4\x9d\x5c\x46\x23\x0a\x09\x29\xe8\x80\x89\xb2\x9b\x26\x60\x8f\xb3\x4b\xdf\xae\xc7\x10\xbc\x3b\xed\xbd\x8f\x03\x20\xde\x6f\x2a\x17\xab\xbe\xef\xe7\x63\xdf\xf7\x19\xdc\x88\x84\x89\x27\xd9\x4d\x62\x6e\x9d\x0b\x73\x60\xed\xa4\x7e\xc9\x81\xbf\x31\x27\xbb\x09\xf7\x03\x44\xb6\x06\xa8\x06\x15\xe3\x15\x41\xa4\xc4\xbe\xde\x92\xf0\xc9\x85\x6d\x33\x87\x59\x6c\xc8\x34\xcd\x8a\xf3\xc2\x15\x18\x1c\x4e\x21\x03\x1b\x92\xd6\xb6\x0b\xcf\xee\x99\x6a\xe4\x39\x64\xfe\xf0\xfe\x4c\xf4\xdb\xe8\xf5\xca\x42\x03\x32\x71\x68\xa7\x29\xec\xf7\x76\xd2\x47\x17\xbb\x35\xf8\x0b\x73\x88\xc7\x16\x20\x28\x67\xe5\x96\xbd\xdb\x41\x37\x4f\xb1\xf1\x40\x40\x92\xb0\x9b\xec\x21\x24\x0e\xc2\x37\x49\xb5\xe7\x85\x3e\x2a\x5c\x89\x90\x17\xf7\x33\x07\xea\x8a\xd5\x1c\x03\x7f\x42\x70\x6c\xb5\x05\xfa\xbe\x85\xc4\x45\xa5\x50\x8b\xc4\x35\xaa\x1d\xa9\xfb\xc0\xc8\x3c\x44\x19\x02\x38\x80\x43\x14\x51\x60\x30\x24\x4a\x5f\x06\x36\xe2\xc1\xdd\xd8\xa4\x21\xbf\xb2\xb8\xbe\x85\xab\xe1\xcd\x45\x58\xe0\x5d\x76\x8d\x02\x87\xe5\x21\xb2\xb8\x67\xb0\x6f\x23\x67\x24\x38\x6d\xad\x71\x80\x6c\x35\x3e\x04\x31\xeb\x88\x4d\x03\xb2\x8d\x6b\x95\xf6\xc6\xc9\x5a\x01\xff\xb8\x2e\xd5\x7f\x7c\x5d\x9a\x98\xba\xaa\x2e\xeb\x92\xe8\x63\x75\x5e\x97\x6a\xcf\xd8\x3c\x10\x0a\x5a\x8a\xbd\x71\x31\x1b\x93\x67\xf8\x2e\xe9\xcf\x99\xec\x4f\x13\xeb\xf2\xfd\xed\xb7\x67\x90\x04\xb8\xc9\x9e\xfb\xf7\x80\x25\xe8\x4c\x71\xe1\xdb\xab\x63\x8d\xbb\xa0\xfa\xa1\x01\x85\x8a\x53\xe0\x4a\x30\xc4\x05\x8e\x08\x78\x23\x83\x02\x19\x3d\x6e\x4d\xa4\x65\x13\x26\x1b\x8f\x3e\x92\x78\x70\x80\x80\x76\x26\x46\x16\x75\x21\xaf\xb4\xf3\xd1\xc6\x71\xd4\x20\x80\x63\x06\x52\x0d\x4e\x6f\xf1\xb9\x4e\xbf\xdc\xad\xf7\x67\x20\xe5\x8b\xba\xef\xca\xbd\xfc\x70\x77\x69\xa7\x36\xb0\x31\x35\xc6\x7b\x89\x0d\xad\x2c\x53\x9c\x21\xce\xb1\xf4\x66\x2f\x1f\x32\xc0\xac\xd7\x9c\x2b\x11\xcb\x2d\x76\xbd\xc7\xc4\xe6\xa3\x10\x46\x9e\x3a\x2d\x50\xa8\x04\xcc\x1e\xb2\x9d\x01\x08\x48\x6f\xa5\x22\x54\x9a\xf4\x1e\xca\xc4\x8f\xc2\x67\xaf\xbc\xaf\xb8\xdc\xa7\x4a\xea\xdd\x66\xd8\xa8\x66\x07\xa6\x58\x4a\x29\x78\x49\x85\x58\xe6\x5c\xe7\x67\xb1\xc5\xcd\xae\xed\xc2\x8c\x18\x2b\x7c\x51\xc2\x21\x80\xbc\xae\xb3\x15\x8b\x25\xae\xb2\x33\x2f\x72\xed\xa1\x3e\xf7\x17\x80\xd7\xab\x6a\xce\xab\xd5\xe5\xa2\x0b\x15\x06\xbb\x63\x5e\x02\x1a\xdb\x22\x1f\x83\x0a\xb5\x8c\xa3\x05\x8a\x44\x0b\x02\x72\xd2\xaa\x71\x6b\x2a\xad\xc3\xbe\x0d\x9c\x75\x4d\xe8\x7d\xdc\x1d\x96\xf8\x7b\x1f\x80\x6b\x8c\x39\x64\xbf\x82\xfb\x07\x9c\x7c\xec\xd7\x1d\xf7\x7d\xf6\xfb\xec\xbf\xc8\xfe\x9b\xec\xbf\xcb\xfe\x4d\xf6\x6f\x9f\xab\xc8\x9c\x15\x9b\xee\x5e\xda\xc3\xfd\x2d\x32\xcc\x17\x94\x88\xab\x31\x18\x46\x4c\x55\x8d\xfe\x64\x3d\xc8\x2b\x62\x96\xcc\xb2\xdd\xe0\xd3\xce\x41\x34\x8f\x0f\xd9\x92\x3f\x2e\x7b\x39\x2c\xee\xf5\x32\xa1\x40\x13\xa9\x57\x25\x92\x04\xb1\xb8\x03\xbd\x40\x85\x2e\x0a\x75\xea\x0d\x63\x46\x6c\x92\x3c\x1c\xed\x29\x76\x15\x71\x38\x0f\x79\xb5\xb5\x7b\x65\xa8\x60\x47\xe7\x8e\x9c\x31\x65\x86\x38\x29\xfe\x90\x45\xc9\x55\x12\x1c\xe4\x06\x63\xc2\x78\xdb\x72\x5e\x31\xdc\xce\x82\x39\xae\xb8\x54\x9a\x1b\x45\x84\xa4\x9a\x63\x29\xb1\x5e\xf5\x68\x80\x78\x60\x5b\x0f\xc5\x73\x3f\x90\x97\x92\x39\xcb\xb1\xf5\xfe\xfe\x10\xc2\x55\x71\x7f\xb8\x1c\x50\x9c\x0e\x18\x6f\x8a\x3d\x8f\x07\x1e\x47\xb1\xe4\x10\xbb\x73\x3c\xfc\x14\xef\xac\x08\xf2\x7f\xf1\x88\x6a\x39\x43\xf4\x57\x98\xfe\x57\x3c\x5b\xee\x7e\xc1\xb3\x25\x01\xe2\x9f\x79\x4f\x5f\x95\x01\x14\x61\xd9\xcd\x43\x3c\x84\x38\x02\x34\x9d\xdd\x1c\x40\x0f\x0e\xb1\x70\xe3\x38\xef\x1d\x06\x79\x89\x3c\x2e\x41\x13\x39\x70\xa9\x13\x6a\x40\x77\xb2\xa1\xaa\x78\x07\xba\xe4\x36\x96\x8e\x64\xe1\xe2\xd4\xf2\xe5\xa5\x85\x8b\x26\x15\xa6\xdc\xae\x6e\xd4\x14\x4a\x52\xb9\xa1\xbd\x98\x4f\x27\x6f\xba\x63\xd2\xf0\x70\xd9\x37\xd9\xdf\x5b\x79\x85\xcf\xf5\xa8\xdf\x3c\x87\xe8\x7c\xbc\x3e\xeb\x1d\xbc\x74\x9d\x7e\x2a\x5b\x9e\x9f\x7b\xb6\x9f\x86\x47\x30\x15\xa8\xa9\x0a\x70\xb8\x37\x70\x32\x44\x76\x4a\xaa\x5a\x0b\xad\x5b\x6e\x94\x9a\x5d\x80\x43\x88\x0c\x41\xa4\x14\xe5\x48\x53\x12\x29\xa5\x2e\x10\x2f\x2a\x9f\x97\xbb\x03\x66\x64\x17\x40\x8d\xa2\xba\x9e\x28\xc6\x4c\x78\x44\x19\xb3\x9a\x33\x89\x35\xa6\x52\x11\x42\xf3\xe5\xae\xcc\x93\x9d\x3b\x29\x0b\x9f\x73\xe0\xbd\xc8\xb1\xaa\x42\x8f\x29\xa1\xa5\x53\x61\xb6\x9b\xe2\x9c\xef\x74\x8f\xde\x61\x7f\x9a\x7d\x9f\xfd\x2e\xf5\xb5\x3e\xf7\x0e\xfb\xee\x0f\x98\x87\x2d\x4b\xcb\x57\xcc\xc3\x88\x2f\x10\xc3\xa2\x42\x44\xe8\x06\x78\x57\x24\x48\x26\xc3\x4c\x77\x33\x71\xaa\x57\xad\xb7\x84\x07\x26\x5b\x68\x53\xd1\x8b\x29\x4b\xd8\xee\xc0\x2b\xee\xeb\xdc\x17\x54\x25\xff\x30\xc6\x2c\xc3\xad\x53\xa0\x02\x1e\x0d\x8d\x94\xc9\x40\x4c\x01\x0c\x0c\x8b\xc3\xde\x8d\x23\x6b\xea\x13\x81\x83\xf2\x3b\x14\x0f\x3e\xba\xb2\x0e\xfd\x2e\x48\x80\x60\xd5\xad\x06\x62\x39\x9c\x1e\x44\xd2\x9f\xfe\x3b\xcf\xd0\x20\xff\xe8\x8c\xe7\xbe\x7b\xa2\x18\x6d\x9e\x29\xe2\xdf\xfe\x01\x6d\xd2\x6b\x56\x95\x60\x0a\xa7\x3e\x80\x43\x89\x46\xd8\xc6\x09\xd4\x27\x02\xfc\xb9\x74\x17\x40\x3e\xcb\xc7\xb3\xbd\xf4\xa3\x98\x60\xd9\x77\xbc\x1f\xb6\x86\xf3\xd8\x0c\x3b\x20\x29\x8d\xc6\x99\x19\xc1\xd1\x44\xde\xb6\x6d\xc4\x4d\xd3\xc4\x46\xd7\xc2\x49\xc3\x82\x6b\x56\x1c\x34\x3c\x3c\xe8\x14\xf7\x7d\x7f\xe6\x1f\xbe\x7f\xa9\xe4\xf4\x54\x1f\x4f\x50\xa5\xb3\xa2\xd3\x97\xae\x8e\x1b\x07\x4c\xb2\x60\x05\x87\xd9\x4b\x39\x1d\x85\xf1\x5e\xcb\xe8\xa2\xa8\x82\x8e\xfb\x25\xd6\xda\xb4\xfa\x9e\xc9\x84\xf4\xb0\x16\x14\xde\x5f\x0f\x6d\xeb\x7b\xdf\xc8\xa2\x92\xdc\x75\xda\xb1\xc2\xaa\xce\xf7\xa7\x2e\xe6\xce\x81\x63\xcc\x2f\x48\x2d\xa0\x97\xd7\xea\x52\xbd\x41\x65\x7f\xf6\xc8\xe3\xba\xe4\x07\x2f\x98\x18\xaf\xd7\xd6\xc3\x9f\x82\x1f\x36\x1f\xb6\x37\xaf\x9f\xa7\x49\x37\x15\xef\x76\x4b\x62\x0a\xa4\x9f\x8f\x4b\xe0\x69\xb9\x71\x42\x40\xcd\xbb\x61\xbc\xb4\x17\x93\xdc\x94\x72\x65\xb1\x77\xcd\x7d\xd0\xfa\x4a\x35\x74\xee\x63\xd5\x6b\x07\x7a\x48\xc0\x88\x62\x3b\x14\x79\x3b\x37\x75\x24\xcb\xbf\x84\xfd\xa3\x57\x2e\x69\x51\x3f\xbe\xb2\xab\xeb\xd7\xe7\xcc\xfe\x31\x0c\x79\xff\xf1\xe7\xe7\x2f\xef\xb9\x9a\x1e\xe1\xb1\x89\x18\xd0\x22\x14\x00\xc5\x01\x01\x64\xa3\x73\x7d\x99\xc7\x91\x0a\x4b\x29\x44\x2b\x88\xfa\x7c\x6c\xb5\x27\x65\xeb\x2b\xe5\x9b\xfb\x5a\xeb\x2b\x29\x38\x99\xfb\x88\x07\xe5\xcf\xaf\xf1\xc4\x9b\x88\x9b\xe5\xd5\x65\xd9\xe6\x8a\x3c\x90\xf4\x3e\xa3\x54\x1d\xcd\xc0\xfb\x8f\x8f\xf6\x38\xcf\x8b\xfd\x3f\x9f\x67\xd9\xdb\x57\xcb\x34\xfb\x78\x2e\x30\x5d\xb9\x90\x87\x1c\xec\x23\xca\x0b\xd0\x16\xad\x6e\x4d\x30\xb6\x61\x3d\xe7\x04\x33\xd7\x62\x7f\xcc\xb1\x91\x65\x29\xb0\xc3\xfc\xba\x68\xfa\xae\xf5\xde\x46\x16\x27\x23\x1c\x77\x5e\x78\xa9\x8d\xed\x83\x00\x16\xea\x28\x11\x1a\xda\x16\xe4\x1b\xa3\x56\xd9\xf2\xc7\x3d\x25\xfc\xfb\xef\x29\xe1\xd4\x72\xbe\xe1\x23\x5f\x89\x72\x4b\xae\x70\xf1\x18\x79\xee\x91\xfc\x66\x7b\xf3\xed\x57\x1d\x92\xb7\xd7\xef\x6e\x7f\xd8\x7c\xcd\x23\x79\x7b\x60\xc3\xae\x04\x6d\x34\xcc\x56\x55\xe9\x90\xe0\x6a\x64\xd1\x36\x1d\x19\xe2\xc4\xc0\xb1\x28\xf2\xd8\x6f\x96\xe5\x2e\x3c\xd9\x51\x58\x87\x4a\x25\xbc\xb3\x03\xee\xf4\xbe\x9f\x10\xb5\x9c\x08\x38\x15\x71\xc7\x25\xf2\x73\x7b\xaa\xa5\xdc\xc8\x38\x34\x11\x35\x6b\x1d\x63\x7c\x30\x37\xee\x6f\xab\xef\xb6\x51\xc0\xd6\xcb\x90\x86\xd9\xbd\x01\x53\xb4\xa3\xf5\xad\xe9\x21\xeb\x82\xac\xbb\xb9\x05\xbe\x4e\x35\xdc\xe3\xbd\x80\x45\xd4\xcf\xf4\xdd\xd8\x68\x94\xaf\x95\xb3\xb5\x8a\xf5\x67\xfa\x6e\x40\x3e\xf0\x6d\x0d\xa7\x3f\xf2\x7e\xd4\xf5\xfd\x31\x84\xab\xfc\xfe\x78\x39\xe0\x74\x52\x9c\x6f\xc2\x41\xc6\x4e\xc5\x56\x3d\x79\xb1\x9a\xec\x4d\xf6\xc3\xea\x2f\x7e\xae\x2d\xfe\xe6\xac\x1a\x0b\x6f\xde\xfd\xf0\xea\xf6\x6e\x59\xf7\x9f\xd1\xda\x9e\xfd\xb0\xa9\x40\x57\x83\x5d\xc4\x23\x20\x3c\x4e\x6d\xdd\x1f\x39\xc0\xfb\xc8\xac\xcb\x51\x5a\xf8\xa9\xd0\x3d\xdc\xf9\xa2\xd4\x52\x72\x5e\x61\x63\xaf\xeb\xfd\x3e\xcc\xbb\xc8\xeb\xba\x01\x6c\xd6\x50\xc5\x7d\x53\x77\x40\x43\x49\x91\x96\x52\x5b\xc9\xbd\x56\x47\x80\x91\x55\xe9\x27\x25\xcc\x2e\xf5\xbb\xeb\x07\x76\xa3\x60\xb8\xd4\xdd\x5f\x9d\xdd\x31\x9f\xaf\x32\x17\x76\x78\x0d\x48\xd8\xa0\x00\x68\xec\xc3\x69\x0c\x71\x00\xbb\x24\x76\x83\x4e\x23\x44\x5a\x1b\xe3\xe7\x8e\x52\xc8\xec\x2a\x50\x77\x9d\x91\xb4\x1f\xb2\xc7\x5d\xe2\x2f\x1e\xfb\x95\x4b\x8c\xfb\x3b\x70\x73\x87\x7e\x7c\x01\x88\x7c\x99\xcd\x7e\xfc\x3d\x78\x7b\xf7\x67\xe0\xfd\x07\xb3\x69\xa3\x02\x3c\x36\x25\x39\x42\x0e\x31\x8d\xc5\x6c\xe2\xc1\x4e\x6c\x50\x52\x71\x25\xaa\x32\x76\x40\x44\xd3\x0f\x03\x10\xfd\x3c\xf5\xf9\xf2\x7d\xcb\x42\x38\xed\x7b\xdb\xd6\x43\xa0\x9e\x18\xa6\xac\x62\xc2\x6d\xaa\x10\xd1\x92\xe5\x4e\x98\x48\xa9\x86\x15\x93\xd2\xc0\xfd\x8d\xd8\xfa\xec\xfa\xac\xa0\xf4\xfd\x3a\x8f\x2e\xdc\xa4\xf5\x38\xbb\xfe\x9e\xa3\xe1\x6d\x69\xb5\xd6\x76\x9e\xc2\xa6\xa8\x3f\xf9\x7a\x93\xc7\xe5\xf6\x1a\x63\xaf\xd0\xfd\x58\xc3\x71\x46\x5b\x9f\xf8\x46\x2c\x4e\x91\xa6\x60\xaa\x07\x25\x65\x46\x90\x28\xa3\x72\x2e\xdb\x26\xdd\xb6\xe5\xef\xfe\xee\xac\x71\xbd\xba\x34\x9f\x7b\xe4\xef\xcf\xb6\x27\x6f\x2f\x02\xeb\xe7\xd8\xe9\x8c\x60\x7f\x92\x72\x3b\xcf\x9f\xe7\xea\xde\xc0\xf9\xa2\x04\x43\x59\x8d\x01\x23\x83\x59\xc7\x84\x24\x58\x03\x84\x2d\x2e\x01\x9d\x73\x6f\x0d\xe6\x23\x68\x71\x19\x2d\xa9\xf8\x65\x52\x43\xe7\xa3\xf7\x69\x27\xda\x7a\x8c\x2b\xcb\xa8\x65\x8c\x69\xe5\xb9\xa0\x2c\x1e\x4d\xc5\x84\x7d\xc8\x62\x1d\x5b\x09\x0a\x40\xa1\xc7\x66\xdf\x50\x26\xf0\x1c\xb4\xd0\x32\x32\xc6\x40\x77\xb4\xd9\xaf\x53\x7e\xa3\xb6\xfa\x91\x57\xbd\x22\x64\x3f\x3e\xfa\xbb\xbc\xf9\x12\x36\x7a\xfb\xb7\x82\x8d\x0a\x87\xa1\xad\xa4\xa4\xa7\x40\x8d\xc1\x58\x36\xd0\x72\xcb\x2c\xe7\x7c\xc7\xd8\xc0\xf9\xbc\x73\x4c\x1a\xb9\xc9\x59\xe5\x11\xe3\x04\x39\x44\x38\xf1\xd5\x56\x23\x9f\x90\x33\x8d\x73\x40\x38\x90\x51\xac\xbb\xc8\x1e\x83\x61\x17\x4d\x44\x40\x24\x8b\xa8\x06\x88\x79\x64\x93\xd5\xae\xa9\x7b\x3c\xd4\xa5\x6b\x71\xeb\xcb\xba\x2d\x7a\xb7\xf2\x94\xe4\x03\xbb\x2a\xb7\xee\xec\x5d\xf6\xa8\x01\xfc\xfe\x45\xa1\xe4\x8c\xb8\xb9\xbb\x20\x6e\x6e\x93\x56\xe7\x33\x81\xe0\x65\x02\x40\x82\x11\xf0\x01\x91\xbd\x90\x84\x21\x45\xaa\xc3\x6e\x17\x22\x0b\x5d\x37\xfa\x3d\xa6\x1e\xf8\xb2\x62\x35\x29\x63\x43\x50\xd3\x6c\x1d\x97\xce\x98\x7b\xcf\x45\xe1\x0a\xb6\x19\x06\x1b\x96\xd4\x29\xd8\xe1\x5e\x5d\x97\x56\x3b\x46\x63\x66\xb5\xbe\x3f\x74\x2b\xde\x72\x33\x7e\xcd\xab\xf5\xd5\x1f\xf0\x6a\xfd\xbc\xc8\xf4\xee\xed\xeb\x8f\x5f\xc0\x2d\x7f\xfb\x08\xb7\xf4\x80\xf9\xd4\x98\x63\x98\x54\x06\xc5\x21\x1a\xd4\xb7\x29\x9d\xe8\x42\xdb\x02\xda\xc5\x3c\x7d\xcb\x91\x17\x73\x0d\x99\xaf\x6b\xc2\x93\x29\x5e\x3e\x77\xa0\x20\xc4\x54\x64\x9b\x6b\x6d\xd4\xc5\xa4\xd5\x17\x16\x72\x15\x6b\x6b\x6d\x0c\xcb\x97\x81\xa9\x3c\x4e\x4a\xd9\x49\xf2\xc2\x97\x74\x87\xa4\x11\x46\x67\x2b\x57\xd2\x5c\x95\x5b\xf3\xa8\x89\xf9\x9f\x7c\xa5\xbe\xfa\xf1\x0c\x4a\x7f\x59\x62\x7d\xfb\x65\x89\x75\x23\xb9\x6f\x81\x96\x21\x88\x18\x9a\x80\x62\x1d\x19\xe9\x9a\xd8\x08\x6b\x25\x90\xce\x63\xa0\x40\xe6\xbd\x31\x06\xe4\x7e\x6b\x5c\x55\xf6\x3e\x1e\x97\x7f\x43\x89\xbc\xa0\x75\x89\x46\x0f\xf2\xe5\x5f\x53\xf8\x99\xae\xbe\x83\x09\x9c\x90\xce\xd6\x35\xc8\x3f\xb0\xcd\xfe\xb1\x36\x95\x9c\x46\xce\x2a\x6b\xef\xd7\x7c\x29\x09\x0d\x7d\x81\x52\xbc\xbd\x1b\x40\x59\x56\x81\xa0\xe3\x4c\x61\x56\x13\x32\x9e\x3a\xd0\xb3\xb8\xe3\x95\xaf\x92\x45\x9f\xf4\x7e\xd9\x36\xaf\x3b\x4e\x89\x54\x1e\xe3\x3e\x78\xdf\xd7\xda\x61\x67\x66\x3d\x63\x21\xe0\x2e\x16\x40\xad\x1a\x47\x3c\xad\xdb\x65\xc2\x40\x9d\xfb\x0c\x9f\x29\x24\x6f\x56\x78\xde\xab\x33\x71\xfe\x8a\x6f\xca\x58\x94\x40\x92\x72\x49\x92\xb4\x25\x7b\xa9\x34\xea\x3d\xf5\x35\xd0\x18\x19\x84\xb6\xa5\x8f\xe3\xfd\xb0\x24\xea\x9d\xa4\x72\xb3\x3b\xa1\xb2\x72\xac\x34\xd7\xfd\x1c\x9a\x81\xec\x52\x7c\x00\xe1\x3e\x71\x8b\xd0\x2f\xff\xed\xbb\xe5\x6f\x5f\xdd\xbc\x03\xe9\x6f\xc3\x77\x9b\xf2\x8a\xce\x08\x43\xc4\x30\x6a\x72\x19\x02\x8b\xb2\xd9\xef\x50\xec\x0f\x14\x64\x3d\xe8\x25\xf3\x54\x6c\x51\x88\xd3\xfd\x8e\x13\x8f\x7b\xc3\xcc\x66\x38\xe1\x4a\x78\x83\xed\x75\x37\x77\xc3\x91\x82\x6c\x58\xfd\xef\x78\x9a\x1b\x2e\xf5\xd3\x5f\xa8\x80\x5e\xbc\x1f\xff\xb8\xfc\xe7\xcf\xe7\x3d\x0d\xe4\x6d\xf0\x5a\x4b\xab\xa5\x30\x2e\x98\xb2\x04\xfb\xf9\x40\xab\xd6\x83\x4a\x08\x84\x10\x2d\x71\xed\xbd\xaf\x2a\x61\x45\x0f\x32\x54\x1a\xc9\x43\x67\xdc\x96\x33\xae\x94\x54\x92\x71\xa7\x84\x40\x9c\x3a\xcf\xea\x3a\x56\x67\xfd\x4f\x3c\x13\x38\xcc\x03\x2c\x08\x76\x4d\xef\x38\xa7\x95\x25\x9a\xd2\x2c\x83\x9b\xf1\x8f\xbd\x77\x77\x9f\xbd\x77\x9b\x71\x63\xe7\x01\x01\x4f\x2b\xe4\x73\xee\x1d\x7d\xc8\xb4\x75\xe5\xbe\xa6\x4d\x0f\x6a\x52\x39\x84\x2f\x6f\x1e\xb1\x55\xa3\x99\xf8\xec\xcd\xeb\xe9\xae\x3e\x73\x9a\x68\x5a\xff\xf2\x54\x59\xff\x36\x2b\xb3\xff\x3c\x63\xd9\x7f\x9d\xfd\x9b\x65\xee\x9d\xe1\x8e\xe0\xf3\xa2\xc6\x59\x5d\x39\x1d\x4f\x20\xe2\xf5\xb8\xdb\xde\xdc\x3e\x11\xc7\x3f\x82\x33\x45\xfc\xcd\xf3\x37\x06\x0a\x04\xfc\x49\x01\x5d\x14\x71\xbf\x2c\xd8\xc6\x7b\xc0\x97\x30\xd0\x7a\x1f\xf5\x61\x0c\xa1\xeb\xfc\xce\xef\x76\x4d\x33\xcd\x23\xaa\x24\xaf\xbc\x63\x14\x4b\x07\xfa\xdd\x6e\xe7\x18\xa5\x58\x13\x46\xa9\x0a\xfd\xd6\x69\xe7\x50\x15\xf7\xb1\x53\x76\x89\xea\xec\xc9\x1a\xa5\x95\xa6\x94\x52\xad\xb4\x32\x04\xc7\x63\x55\x59\x86\xf9\x8e\x20\xcb\xc0\x5e\xa9\xbd\x3a\x12\x82\x09\xa7\x84\x32\xbd\x7b\xe4\x75\xd2\x9b\x6e\xab\x52\xa7\xee\xd2\x2e\xb9\xb9\x5d\xf2\xcb\x57\xa9\xf9\x7b\xfb\xdb\x9b\xdb\xc7\xe4\xe8\x06\x31\x42\xcb\x56\xf5\x95\x66\x58\x33\x62\xd1\xb2\x59\x53\xc6\x0c\xa5\xa0\xdd\x2a\x5b\xe4\x27\x36\x0f\x16\xaa\xcd\xb1\xf8\xd4\xaa\x16\x1f\xe2\x44\x06\x29\xd4\x75\x97\x47\x37\x77\xb1\x6c\x96\xcb\x81\x0c\x8c\x09\xbf\xf3\x0d\x14\x0f\x2c\x69\xec\x2e\xf1\xec\x4f\x8f\x8e\x37\x67\x17\xc2\x97\x59\xe4\x4d\xaa\xc6\x9c\xf9\xc0\x4f\x25\xe4\x95\x76\xf8\x85\x24\xc8\x19\xa9\x2a\x02\x44\xf3\x08\x55\x38\xa9\x00\x86\x69\x93\xcd\x19\xd0\xaa\x00\x08\x28\x41\x69\x98\x79\x8d\x31\x03\x9c\x40\xdc\xf8\x3a\x5c\x5a\xd8\xcb\x51\x72\xdd\xd1\x6e\x93\x77\x2d\x6b\xfb\xad\xa1\x4e\xac\xce\x77\xa3\x29\x79\xd1\x18\x8b\xca\xb9\x62\x0c\x0e\xa8\x70\x46\x72\xe9\x1e\xb2\xb3\xeb\xcd\xc6\x08\x45\x15\xe5\x58\x19\x43\xb2\xec\x06\x8e\x29\xd6\x66\xe7\xd1\xf6\x54\x89\xb8\xbb\xbd\xbb\x0c\xb7\x17\x74\x8d\x17\x65\xa5\x9f\x3f\xf7\x1c\xd4\x9b\x2e\x32\x0c\x8e\xf7\x12\x1c\x0b\x14\xdb\x00\xdd\x6c\x12\xab\x7c\xd3\x46\xcb\x9d\xe4\xa5\x54\x34\x2a\x0f\xfd\xac\xb1\xd7\xce\x85\x4d\xe5\x85\x13\x6e\xcb\xe6\xbd\x72\x8e\x60\xc0\x97\xb4\x6c\xde\x47\x15\xfb\x33\x3c\xb8\xb2\x75\x6c\x71\x6f\x59\xf0\x67\x4c\x07\x48\xfd\x66\xbf\x35\x29\x46\x78\x94\x15\x4f\xfd\x9c\x14\xe8\xfd\x33\xb0\xe4\x08\x77\x67\x79\xa1\x73\x5e\xb0\x1a\xbe\xc0\xeb\x4b\xdf\xfc\xf6\x6e\xdb\x87\x70\xf2\x1e\x54\x31\x83\xd9\x9e\x49\xc3\x31\xef\x29\x9c\x86\xa8\x18\x31\x54\x71\x4e\x2c\xe6\x08\x69\x50\xba\x40\xa0\xe8\x22\x46\xb0\x8e\x26\x39\x24\x96\x20\x8b\x9c\x00\x3d\x81\xca\xed\x04\x93\x04\x4b\x1c\x34\xb0\x42\x30\xad\xb9\xd4\x4c\xc9\xb2\x50\xcd\x1e\x0b\x1b\x7d\x43\xdd\xce\xc5\xfd\x12\xe3\x80\xe2\x41\xdf\xb8\x0d\x3a\x73\x18\x92\xea\xfa\xb7\xdf\xdd\xa1\x9f\x9f\x28\x56\xd7\x77\xaf\xef\xde\x2f\xe1\xf1\xf8\x69\x68\xc0\x1e\x0a\x82\x90\xaf\xfc\x2c\xe6\xdd\x04\xeb\xf9\x08\xf3\x90\xa4\x6c\x51\xcc\xf6\x15\x2a\x0b\xcf\x5b\x46\xf5\x26\xf3\xe3\x98\xbc\xe3\x56\x7d\xfe\x15\x67\x51\xae\xee\xb6\xcf\x58\x37\x6b\x66\x72\x16\x52\x48\x8a\xd1\xdf\x3d\x02\x70\x12\x65\xee\xe3\x86\x6c\xc6\x13\xf2\xb0\x9f\xe9\x72\xb8\x24\xd3\xdf\xfa\x6a\x1a\xd8\x66\x92\xcd\x58\x62\x4b\x4b\x87\x6c\xef\xb8\x6f\xb6\x78\xce\xc1\x50\xc7\xaa\x8d\x66\x74\xd1\x60\x62\x05\xe1\x70\x32\x8a\xc5\x0e\x95\x62\x20\x0f\x99\x61\x0a\x4e\x07\xb2\xce\xeb\x22\x69\x58\xa9\x35\x3f\x78\x34\xd4\xbb\x7b\xb4\x65\x5d\x67\xcb\xf2\x3e\xfe\xe6\xaa\x0a\x14\x76\x51\x27\xbe\x70\x51\xd7\xa7\xa6\x06\x45\x2c\xc0\x61\xc7\x85\x1b\xb6\x0a\x37\x3e\x5a\x3f\x73\x58\xce\x99\x80\xed\x3c\xc2\xd6\x03\x5b\xab\xb3\xde\xea\x66\xc3\xd2\xf8\xc6\xe7\x38\x6d\xb9\xd7\x4b\xa0\xff\x77\x53\x56\x0f\xdf\xfe\x16\x6e\xd6\x1b\x71\xfd\xee\xf6\xcd\xed\xdd\x2d\xd8\xdc\xdd\xde\x90\xe8\x0b\xd0\x46\x59\xd5\xa8\x2a\x1d\xf5\xe2\x80\xa3\x1f\x3c\xea\xe3\x91\x05\xd8\xc7\x50\xc4\x6e\x8b\xe7\x26\x8e\x21\x4e\x71\x9c\x68\xec\x80\x02\x7a\x3e\x10\x1a\x04\xe3\x5b\x1f\xe2\x1e\x54\x33\x02\x28\x8e\x69\x3f\xf4\x0f\xfa\x46\xc3\x61\x55\x7c\xbd\x0c\xbd\x4b\x4c\xf2\xe1\x2c\x61\xd2\x6d\xf5\x5c\xc1\x30\x2b\x50\x57\xd8\x72\xb2\xfb\x6b\xb4\x41\xb3\x84\xf5\x9c\xc3\xc1\x37\xfe\x21\xa3\x94\x0a\xe5\x3d\xc8\xfc\x79\x9f\x77\x0f\xf8\xa6\x49\xbd\xc5\xdf\xbe\x70\x24\xd8\x3c\x37\x41\xb8\xc0\x82\x3f\x66\xbf\xd9\xee\xeb\x79\xaa\x81\x0c\x95\xc6\xc2\x91\x3c\x14\xb4\x9a\x06\xe9\x22\xe5\x13\x28\xe4\x96\xdc\xbb\xcd\x74\x2a\xaf\x4c\x6c\x23\x79\xc8\x62\x8e\x10\x6d\xaa\x7d\x82\xfb\xba\x68\x77\x4e\x03\xba\xea\x42\x6e\x60\xf7\x40\x93\x7e\xd4\x26\xe5\xfb\x17\x6f\xc2\x02\xbc\xfb\xcd\xed\x72\xbe\xed\xea\xfa\x74\xac\xe3\x64\x8f\xc0\x85\xb0\xb5\xc7\xe1\x86\xdc\x8f\xb1\x8c\x83\x02\x25\xa8\x37\xdd\x5f\x2f\xc1\xc2\x36\xeb\x1e\xf8\x15\xdd\xd2\xf3\x58\x3d\xfb\x49\xbc\x40\xf9\xff\x92\x1e\x7c\xb7\x71\x27\xe3\x1f\x3d\x2d\xf6\x46\x13\x5e\x69\xc2\xe7\x63\x5d\x3f\x56\xe5\xe8\xec\x81\xb6\xd1\x9b\xd8\x9c\xbc\x10\x85\xcb\x99\x8f\xe1\x0a\xc5\xc9\x45\x51\x67\x60\xc9\x1d\xe1\xd9\x63\xe1\xd5\x9b\x9b\xf7\x67\xb4\x5c\xd2\x51\x3f\x87\x23\xeb\x40\x1c\x5c\xc5\xbc\xb5\x4b\xe6\xe6\xa5\x62\xc1\xc8\xaa\x32\x62\x8b\xc8\x71\xd9\x2f\x7d\x2c\x98\x25\x64\xb6\x10\x13\x1c\x08\x83\xa4\x0f\x14\x2c\x57\x15\x36\xc5\x8d\x7c\xf4\x1a\x48\x98\xbc\xb3\x64\xd4\x73\x29\xa9\xc7\xee\xd0\xa6\xad\x8f\x94\xb4\x94\x00\x55\x7f\x32\x35\xd0\x84\x05\x49\x0f\x31\xbb\xaa\xef\x65\xbd\x91\xa7\x7a\x6b\xe3\x41\xdb\x84\xd1\x5e\x32\x75\xc1\x99\xb6\xc7\x18\x56\xac\x38\xc8\xdc\x03\xbf\x61\xb0\x5f\xf7\xcc\x9b\x34\xb2\x2e\x1e\x45\x4f\xb7\xf1\x6d\x76\xfd\xee\x87\x1f\xef\xde\x01\x1b\xe8\xc6\xdc\xbb\x2d\x8b\xbb\x25\x3b\x93\xb5\x51\xa5\xb1\xd2\xc5\x66\x16\x14\x62\x50\xce\x96\xc2\x8a\xc8\xda\xfb\xda\x1f\x94\x28\x03\x62\xfb\x38\x1a\x27\x5b\xb3\xfe\x3d\xf1\xc0\xe1\x7e\x6b\xb2\x6f\xb3\xec\xd5\xd9\x62\x79\x45\x05\xae\xca\x1b\xb7\x43\xa8\x03\x8d\x0e\xb0\xd0\x16\xc6\xea\x2d\x8f\x25\x2c\xe6\x83\x8f\xdd\xec\xc0\x14\x55\x9c\x24\x28\x93\x97\xc4\x15\xdc\xa7\x9a\x63\xc8\xae\xd3\x2e\xf4\xaf\x2e\x38\xe0\xeb\x37\x17\x01\x8d\xef\x2e\xb5\xb8\x77\x6f\xcf\xb4\x8a\x44\xf5\xfc\xf9\xbb\x37\xaf\x3e\x7b\xe6\xff\xff\x0c\x29\x7c\xfb\xdb\x55\x7c\xfe\xf9\x73\xaf\xb5\xe4\x82\x4b\x88\x8a\x79\x42\xd4\x19\xa9\x5d\xe0\x65\xe1\x4b\xc1\xea\x31\x1f\xe3\x81\x82\x7c\xc7\x70\x6c\x4a\x50\xe1\x2a\x54\x04\x6b\x21\xa4\x82\xbe\x98\x5b\x4c\x6a\x27\x5d\x60\x35\x2a\x8b\xc2\xa3\x86\x8e\x66\x67\x47\x0a\xaa\x49\xe0\x58\x97\x80\x90\x2a\x60\xb2\x0d\x15\xd1\x0c\x4b\xcf\x08\xa3\x5c\x71\x66\x43\x55\xeb\xbd\xe0\x8e\xf2\x84\xf4\x94\x1a\x5b\x35\xf7\x84\x69\x41\x4c\x10\x82\x71\xa9\x14\x67\x02\xfb\x2a\x0e\xd6\x0a\x4c\x1d\x53\x5a\x10\x8f\xb5\xc1\xce\x64\x00\xea\x07\x76\x4d\xb6\x22\xa1\x6b\x57\xdd\x8c\x14\x31\x3f\x86\x3f\x57\x23\x6f\x47\x10\x74\x08\x9c\x3b\x4e\x41\xb5\x15\x8e\xa1\xe8\xdc\xfd\xf1\x2a\x8f\x55\x14\xb5\x0a\xa0\x86\x15\xd8\x55\xab\xe6\x36\x50\x09\xcb\x79\xf6\x6d\xdb\xbe\x24\x4d\xdd\xdc\x7d\xb9\x27\x2d\x77\xf1\xd5\xeb\xbb\x0f\x30\xf7\x25\xba\x72\xca\x11\x8a\x14\xae\xaa\xfb\x9d\xdc\xf0\x39\x77\xa0\x86\x0c\x23\x54\x57\x7e\x96\xf3\xb1\x67\x5c\x81\x3c\x40\xb1\xb5\x15\xa5\xb3\x9f\x8a\x50\xd4\x20\xd4\xb1\x72\x18\x95\x85\x15\x35\xe3\x0a\x52\xce\xf4\x21\x1e\xbb\x2e\xcb\xb2\x1c\xec\x1e\xc8\x8d\x4b\xba\x7c\xdf\x67\x6f\x33\x99\xfd\xcf\x99\xca\xfe\xcf\x4c\x3f\x57\x1d\xbf\xe8\x3d\x3d\x01\x39\x3e\x9c\xd5\xc7\x37\x77\xb7\x49\xb3\xec\xf6\x6e\xb5\x98\xba\x7c\xa6\x01\x91\x34\x2c\x36\x37\xaf\xff\xb8\x80\xd2\xda\xfb\xbb\x71\xfe\xde\x7b\xa8\x97\x9d\x66\x6e\x21\x0f\x50\xcc\x4d\x6a\x30\xa8\x18\x62\xb6\x7c\x65\x60\x70\x80\x29\xb0\x9f\x52\x5d\xa3\x8a\x7b\xd0\xce\x5e\x6a\x5a\x19\x6e\x02\x9e\x8f\x83\x1d\x50\xed\x59\xeb\x24\x28\xc7\x48\x80\x3e\x1e\x97\xd4\xbd\x33\xfb\x3d\xac\xc6\xb1\x5c\x3d\x6f\xae\x48\x9c\xda\x0e\x20\x0a\x4a\xa6\x18\x53\x2c\x4e\xb4\xe1\x9c\x47\xf9\x90\x31\x96\x3a\x51\x92\x4a\xaa\x04\xc6\x94\xf3\xb2\x70\x14\x54\xd2\x50\x4d\x10\xd5\xa2\x32\xd4\x28\x2a\xa9\x64\x17\x11\xa5\x9a\x66\xdf\xc0\xec\x81\x25\x9f\xcd\xa7\x1e\xe9\xc5\xa1\xf0\xab\x3d\xd2\x0b\xcf\xfb\xc7\x4b\x87\xfa\xcd\xf6\x6f\xdc\x24\xdd\xd4\x01\xd0\x00\x78\x6c\x43\xec\x43\xba\xa4\x23\x2c\xe7\xc9\xa5\x9c\x3c\x9d\xfa\xe5\x22\xe6\xd6\x95\x08\x90\x12\x79\x8c\xc0\x2e\x22\xd0\x26\x2d\x34\x0e\xa6\x53\x19\x28\x13\x87\xe7\x3c\xfb\x5f\x6c\x95\x12\xf2\xb2\x57\x6a\x19\x79\xd9\x2b\xfd\x15\xcc\x13\x46\x59\x3c\x76\xa7\x2e\x8e\x77\xab\xeb\xdf\x12\xd5\x6e\x6f\xee\xde\xfd\xbc\xc4\x18\xbf\x74\x7d\xab\x6d\xd1\xf5\xaa\x9f\xf4\xe2\xfb\xe6\xd9\x95\x43\x0f\x51\xec\x55\x51\x02\x4c\x35\x24\xf3\x11\x57\x60\x8c\xe8\x62\x71\x0f\x8e\xf7\x07\xcf\x98\xd8\xcb\x36\xdd\x00\xe8\x40\x11\x0f\xb3\xf9\xfa\x79\xf3\xc4\xb0\xde\x8a\x39\x43\x55\x45\x39\x1c\xe7\x0c\x53\xb7\x5e\x2b\x83\x54\x70\x3f\x81\x0c\x56\x4a\xa9\xd8\x6b\xad\x63\xa7\xb5\x9e\x9f\xae\xfe\xff\x97\xae\xfd\x6f\xed\xd1\xf9\xc5\xef\xfe\xe6\x1e\x9d\x53\x38\x91\x72\xea\xae\xb3\x6e\xce\x2f\x18\xfb\xe5\x00\x59\x2e\x7c\x64\xa5\xa0\xd0\xd1\xe8\xa6\xf4\x71\x15\x72\xee\x23\x4d\x0f\x92\x98\x24\x4f\x0f\x87\x97\x26\x9d\x19\xa8\xff\x98\x49\xa7\x17\xbf\xf0\x78\x96\x5d\xc3\xf2\x41\x26\x2c\xd4\x65\xd4\xff\xdb\x75\xdf\xfd\xf0\x59\x9a\xfc\x98\x22\xbf\x64\xef\xfd\xd2\xef\x5f\x68\x32\xbc\xf9\xee\xcd\x23\x94\x75\xc9\x91\xa0\xb1\xb5\x4d\x1f\xcb\xfb\x65\x8c\xa9\x4d\x30\x46\xeb\x95\xd3\x63\x8c\x09\xf6\x9e\x90\x6b\xfc\x69\x67\xae\xd8\x7d\x57\x6f\x8a\xd3\x41\x70\x02\x28\xc7\xbe\xa2\xc0\x7e\x32\x40\x57\x78\x2b\x66\xa9\x85\x92\x52\x28\x25\xa4\x54\x42\x2f\xd1\xb7\x52\xf2\xf2\x88\x54\x0a\x86\xd3\xc4\x2d\x8f\xc1\x98\xa3\x54\x52\x54\x8c\x59\xcb\xc9\xb2\x7e\x1e\x12\x36\xc2\x3d\xf2\x3b\xfe\x34\xfb\x6f\xb3\x7f\x95\x2a\x07\xdf\x7d\xb5\x74\xf0\xa8\x10\xf6\xd2\x89\xe7\xa9\x32\xf0\xc3\xe6\x2b\xaa\x73\xe9\xf3\x11\x24\xd1\x61\x04\xd9\xa7\x3d\xc4\x05\x8a\x7c\x59\x21\xed\xf1\x08\x8b\x25\xf6\xb2\xcb\x12\x70\xda\x03\xec\x81\xf2\x49\x4f\xbe\x8c\x13\x50\x73\x4d\x4c\x2d\xb5\x0c\xb6\x57\xb1\xac\xf1\x2e\xd8\x6a\xd7\x32\x2d\xc4\xb2\x4c\x32\x20\x1f\x32\x90\xc5\xdd\xa6\x5a\x25\x72\xb7\x0e\xd3\x54\x4e\x18\x63\xa3\xad\x5a\xbe\xc4\xe6\xb1\x92\xa0\x24\xe3\x82\x53\x4a\x6c\x00\x12\x99\x5d\x55\x19\x5a\xf1\x3d\x2e\x35\x33\x46\xe9\x65\x09\xd9\xab\xb4\x2e\x14\x89\x1b\x71\xd1\x07\xff\x29\xfb\xa7\xc9\xff\xf2\x7f\xcf\xfe\xaf\xec\xff\x79\xc1\xa7\xfb\xf0\xd8\x10\x78\x73\xf7\xe1\xee\xd5\xeb\xf7\x7f\xfe\xe3\x99\x2f\x7e\x97\x5c\x1d\x5f\x7a\x33\x2e\xb9\x52\x4a\x61\x6e\xde\xa7\x0d\xf3\x49\x6d\xea\xf7\x60\x0d\x51\xee\x6e\x2f\x82\xe3\x37\xcb\x88\xf9\x1d\xd8\xde\xdc\x9d\x4d\x1f\x37\xc6\xe7\x05\x34\x98\x80\xe2\xbe\xa6\xf2\x08\x39\xc6\xf3\x48\xaa\x7c\x43\x4f\x7d\x91\x17\x80\xa1\xc3\x9e\x3a\xc0\x20\x63\xcd\x01\xcb\x0e\x17\x3a\x99\x5e\xba\x7e\x96\x0e\x41\x23\xa7\xa8\x38\x6b\x69\x6e\x0a\xf9\x90\xf5\x12\xb9\xa8\x24\xa0\x3e\x7a\x2a\x41\x01\x25\x46\xf3\x8e\x92\x12\xe0\x32\x8f\x2d\xd8\xe7\x05\xb0\x4a\x49\x2e\xd5\xd6\xa1\xb2\x50\xb8\x8a\x63\x8f\x94\x91\x15\x26\xa8\xe3\xd1\x49\xa2\x50\x49\x01\xc2\xca\x09\x5a\xe5\xa8\x28\x19\xd2\x94\x50\x90\x49\x14\x27\x84\x14\x8f\x43\x8b\xca\x52\x20\xcb\x29\xdf\x1f\x8d\xe3\x01\x64\x48\x49\x5d\x55\x18\xed\x30\x21\x58\x8d\x15\x91\x14\xaf\x58\x81\xec\x81\xdf\x74\x5b\x9d\xb0\x1c\xff\x2e\xfb\x5f\xb2\xff\xe3\x25\x96\xe3\xc9\x4e\x29\x15\xa6\xee\x7e\xba\x7d\x5f\xbc\x49\xbe\x00\x09\x2e\xf7\xfa\x1c\xc3\x2d\x77\x3a\x71\x33\x7e\x86\x9b\xbb\x17\xb3\xf2\x52\x7a\x7e\x3e\x6f\xdf\x82\x9f\x2f\x52\xa4\x70\xb4\x79\x29\x99\x24\x94\x4a\xd5\x83\xce\xe6\x48\x31\xce\x18\x91\xb2\x9b\xfb\x8d\x2f\x7c\x01\x68\x1c\x72\xc4\xa9\x11\xae\x24\x65\x51\x24\x96\x89\x16\x3a\x90\xda\xd0\x32\x0e\xe3\xb8\x2c\x59\xbe\x8c\x4d\x14\xd8\xb9\xe3\x71\x9a\x76\xbb\x09\x68\x29\x37\x6b\x69\x60\xab\x4b\xc1\x08\xd5\xb4\xb2\x52\x0e\x13\x12\x8c\x09\xc5\x89\x91\x72\x88\xfd\x11\x90\x38\x1c\x6d\x9c\xf6\xcd\xa1\x8a\xcd\x54\x6a\x6b\x5d\x79\x0c\xa0\x0c\xda\xd8\x0e\x54\xc0\x1a\xbd\x7c\xd8\xd2\x70\xe2\x8a\x32\x98\x44\x02\x3c\xb5\xc5\x86\x42\xe2\x6a\xd2\xb8\x2c\xfb\x26\xf9\x5c\xd4\xc9\x6f\xfd\xc9\x69\xf8\x7f\xcc\xfe\x5d\xf6\xbf\x7d\xa6\xd8\x7a\x76\x08\xbc\x5e\x37\xb6\x4b\x29\xf0\xee\xf6\x2b\xea\x14\xaf\x1e\xb9\xe2\x3f\xbd\x03\xcf\xe5\x11\x9e\x21\xcd\xde\xae\xe7\xab\x02\x39\x99\x3c\x70\x7e\xbf\xf7\xd1\xf8\x09\xb2\xaa\x04\xfd\x89\xb6\xae\x75\x80\xcd\xa1\x84\x6a\x36\x25\x1c\x91\x54\x84\x96\x9c\x94\xa8\x98\x73\xd3\x79\xe3\xc0\x54\xa0\x38\xb4\x2d\x20\xad\xeb\x54\x55\xea\x12\x09\x52\xd8\xa2\xa2\x28\x37\xcb\x05\x63\x62\xd8\xb6\x4c\x7b\xbd\xd6\x4a\x55\x8c\x99\x54\x28\x8c\x35\xd7\x22\xba\x2e\xf7\x39\xdf\x81\xc0\x22\x8b\x1d\x03\x12\x38\x28\x09\x99\x3b\xb7\x7c\xcc\x4b\xc4\x2c\x18\xb6\x06\x59\xe3\x5c\x15\x6c\x59\x75\x96\x86\x2c\xfb\x06\xd4\x0f\xf4\xc6\xfc\xc2\x3d\x7b\xbe\xe6\x9d\xa3\xa0\xff\x2f\xee\x19\x24\x00\x79\x30\xf9\x65\xdd\xf3\xb1\xf4\x71\x84\xbb\xaa\x84\xc5\xbd\x1d\xfd\xe8\x81\x9d\x51\x09\xc7\xd3\x11\x6d\x54\xa9\x35\x61\x25\xa7\x15\x2a\x4e\xd6\x4d\xad\x6b\xa0\x2a\x50\x14\xe3\x08\xf4\xe8\x0f\x35\xad\x74\x45\x2c\x47\xb6\x64\x02\x97\xb6\xa8\x5a\x43\xb9\x91\x7f\xe0\xbe\xf5\xb9\xcf\xc5\xe5\xbe\x71\x20\xbe\x7a\xdf\x8c\xfd\xfc\xbe\x6d\xaf\x92\x3e\x66\xba\x6f\xcf\xf5\xce\x2f\xbd\xd4\xa4\xe6\xff\xf3\xaa\xc1\xfa\x0b\x55\xcd\xeb\xe0\xcb\x0a\x10\x42\xdb\x39\x80\x82\xe3\x89\x0a\x51\xe3\x27\xd5\x98\xd8\xe6\x56\xb7\xba\x01\x4d\x90\x46\x84\x64\xad\x6a\xb4\x38\xa1\xcd\x28\x94\xa0\xca\xcf\x5d\x13\x49\x13\x69\x1d\x7b\xe6\x53\xf8\xe3\x99\x37\x59\xb6\x05\xc7\x84\xab\xb5\xd9\x37\xd9\x3f\xce\xe8\xe3\xde\xf6\xfe\x12\xaa\x82\x17\xe8\xee\xc7\xcf\xa7\x55\x39\x89\x17\x7d\xb8\xfb\xf1\xbb\x37\xef\x57\x27\x82\xa4\xe1\xfb\x8b\x05\x06\x58\x1e\x8a\xd2\xa1\x12\x94\xb3\x84\x7b\x0f\xb3\x98\x81\x31\x96\x60\x1f\xab\xcb\x51\x35\x4d\x95\xfb\x42\x3c\x64\xf1\x28\xc0\x18\xab\x79\xc2\x48\xa3\xd2\xe3\x7a\xae\xea\xb2\x82\xcb\xee\x24\xd0\xb2\x96\x04\xe7\x2e\xb2\xef\xd7\x3b\x46\x30\x97\x16\xa0\x60\x7d\xd4\xca\x68\xa3\x8c\x41\x65\xc5\x89\x61\x44\x6d\x3a\xbf\x97\x5a\x29\x5c\x5b\xcb\x59\xd4\xa7\x4e\xc8\xd2\x97\x4c\xc7\xe6\xaa\x88\x63\x1d\x69\xbd\xd6\xa7\xf3\xb3\x96\xf3\xdf\x79\xec\xcf\xfd\xb3\xec\x9f\xa7\x71\xfe\x19\x92\xec\x73\xaf\xbd\x0b\xaa\xec\xf2\xf9\xea\xa5\x06\xcf\x57\xdd\x9c\xef\x7e\xfb\xd3\x87\x77\xab\x4b\x63\x8f\x11\xa4\xfe\x44\x3c\xcc\x4a\xf4\x90\x01\xb9\x46\xee\x63\x44\x89\xdc\x3e\xde\xb7\x60\x9c\xf7\xb0\x4a\x56\x86\x75\x3e\x0c\x80\x0e\xa6\x8f\x95\x56\x42\x69\xa8\xb5\xd2\xc2\xcc\x65\xa8\xc4\x81\xe7\xae\xb0\xb1\x6f\xd5\x60\x29\x77\x72\x6b\x99\x88\x63\xdd\x80\x8a\x92\xe8\x39\x37\x5c\x73\xc3\x97\xa4\x20\x9d\xce\x95\x5f\x3e\xe2\x48\x85\x92\x0c\x9b\x20\xbc\x63\x87\xb2\xc0\xae\x6a\x25\xa5\xc7\xaa\xb3\xdc\x65\xdf\x40\xf5\x37\xbd\x2f\x9b\xff\xa0\xf7\xe5\x3a\xa7\x08\x1c\xfc\xc9\x79\x70\x44\xd5\xf1\xd2\xbc\xed\x22\x4b\x1a\x14\xfd\xfd\x01\xf4\x31\x07\xc7\x94\x20\x74\x45\xdb\x02\xdc\x98\x36\xf2\xb5\xba\xc0\xa5\xd4\x5c\xcd\xcc\x57\x7c\x4f\x8b\xe5\xb6\x8c\x8d\xec\x2d\x61\x4e\x3c\xbb\x2d\x38\x86\x3f\x76\x5b\x74\xfd\x74\x5b\x3a\xf1\x78\x5b\xb2\x2d\x18\x93\x57\xe7\xf3\xbc\xf0\x5f\x7f\x7d\x35\x7c\xf3\x99\x2e\xd3\xab\xa7\xa0\xf0\xb1\x02\x73\x6e\xd0\x9d\x0d\xec\x8b\x9b\xd5\x14\xe6\xc3\xfb\x37\xeb\x7c\x84\x0a\x90\x64\x38\x2a\x63\x1d\x62\x17\xe2\x80\xae\xea\x7b\x19\xf6\x7b\x20\x06\x37\x1c\x23\x42\xc8\x09\xa3\x5a\x81\x49\x19\x4a\x2d\xb5\x3b\x36\x62\x37\x11\x1c\xb3\xde\x49\x6d\x7a\xdd\x40\x53\xf8\x62\x8f\x2a\xc3\xc8\x36\x5b\xb6\x46\x2f\xa5\x94\x2e\x52\x93\xf8\xcf\xf3\xd1\xd6\x5c\x0a\x6a\x8d\x6f\x70\xad\xf7\x61\xd9\xc6\xd5\x5e\x29\xe9\x24\x8b\xc7\xa0\x2d\x40\x00\x31\xe6\xab\x8a\x33\x91\x5d\x83\x5d\xd2\x24\x70\xd9\xc7\x33\x66\xf8\x5f\x27\x16\xfd\x45\x60\xe7\xfc\x65\x5d\x4d\x2e\xb1\xfd\xf6\x42\xfc\x5f\xcd\x54\xee\xce\xd1\xf0\xab\xf7\x17\x51\xc9\xbb\xc7\xf6\xce\xf5\x53\xd8\xfc\x23\xdc\x05\x05\xb2\x26\xf6\xa0\x45\x65\xd4\x60\x28\xf3\x79\x07\x74\x59\x79\x82\x00\xa1\x95\x43\x08\xa0\xb9\xce\x0b\xc8\x66\x87\x37\x79\x0c\x7e\xe2\x4a\x9d\xc6\x60\xca\x7a\xcf\xda\x43\x89\x02\x2e\x41\x21\x68\x6c\x98\xbb\x34\x51\x40\x7b\x68\x94\x54\xc2\x6a\x1d\xa7\xe8\xa0\x96\xc6\x36\x16\x63\x83\xb1\x4d\x89\x31\xe7\x98\xe2\xe5\x01\x69\x3b\xe5\x08\x8f\xfc\x58\x11\xcb\x08\xdd\x28\x8c\x08\x65\x42\xc9\xb8\x13\x71\x14\x93\x20\x4a\x89\x8a\x10\xd3\x24\xdc\xc5\xaf\x21\x4b\xb5\x17\xfb\x4c\x49\xf1\xeb\xae\xc4\x67\x84\xd9\xf5\xed\xdd\xed\xf5\xdb\xd7\x7f\x09\xcf\x75\x93\x67\x05\xdb\xe5\x09\xdf\x83\x27\x03\x0c\xa8\x61\x15\x20\x9f\x5b\x70\xbc\x0f\x60\x3f\xef\xaf\xf6\xf7\x1c\x0e\xfb\xbd\x1f\x86\x99\xec\x76\xec\x0a\xdf\xef\xc2\x26\x9b\xb3\xcb\x11\xf8\x2e\x1e\xe9\x08\xeb\xdd\x81\x1d\xa6\x65\x97\x33\xcc\x18\x76\x5c\x12\x64\x13\x42\x08\xb1\x9b\x05\x98\xd8\x43\x46\x8f\x74\xd0\x0c\xbb\x92\x55\xdc\xea\x2a\xfb\x06\x56\x0f\xe4\xa6\xde\xca\x17\xfb\xd7\xbf\xcc\xfe\x87\xe4\x3f\xbe\x22\x2b\x2f\xb8\xfc\xf7\x4b\x06\xf4\xea\xfc\x82\x97\xe3\x2b\x3e\xf6\xe7\xf2\xd7\xdb\x9b\xb3\x9c\xcb\x0f\x3f\x5e\xad\x75\xc7\x75\xf4\x7f\x48\xd2\x7c\xe7\xdd\x5e\x5f\x1d\x66\x5f\xc2\xb2\xf6\xf7\xa3\xb7\x40\x95\x11\x1d\x9e\x5f\x15\xd0\x92\x31\x2e\x60\x6e\x84\x10\x76\xd6\x1e\xeb\x80\x51\xee\x72\x15\x8f\x0e\x43\x2f\xec\xfe\xc8\x62\xff\x90\xc5\x31\x6a\x0a\xd8\xe4\x95\x16\xe2\xe0\x91\xb0\xb5\xe3\x73\xa9\xa4\xe3\x76\x2b\x2d\x9b\xc7\x49\xeb\x09\x22\x16\x0f\xfc\xc8\x8e\x6c\x8f\x88\xa0\x15\x91\x5a\x18\x45\x6d\x59\xe4\x39\xab\x14\xa1\x56\x73\x8a\x3c\x11\x1a\x87\x92\x51\x29\x2a\xa3\x1b\x84\xe3\xc0\x09\xe1\x20\x30\xcb\x24\xcf\xbe\xb9\x2a\xcf\x3a\x1d\x2f\xdf\xf7\x7f\xf0\x84\xeb\xbd\x7d\x7c\xcf\x2f\x2b\x02\xf8\xcc\x81\x1a\x3c\x8b\x79\xae\x24\xa8\x12\x66\x1e\x98\xd3\xb2\xdf\xed\x7d\x08\x00\xd7\x73\x0d\x8f\x73\x1e\xc0\x90\x58\x54\xeb\xc1\xdb\x96\x36\xf5\xa8\x6c\x2b\xeb\x6d\x29\x65\x6c\xa4\x73\xd2\x28\xa5\xe6\xf1\x74\x84\x48\xc5\x9d\x8c\x83\x8a\x87\x8a\x3b\x81\x35\xd7\xcc\xe2\x95\x4f\xe8\x36\x87\xe4\x69\xf9\xa7\xa9\xef\xf1\xfe\xf5\x65\x6d\xba\xbe\xf9\xe1\xdd\xeb\x17\xfc\x9a\xd5\xff\x74\x33\x06\x4a\x0f\x3d\xef\xbb\x3d\xa8\x58\xc4\x07\xa6\x94\x40\x4a\xe2\x39\x87\xa6\x89\x05\x05\xbe\x8e\x78\x6b\x3d\xc1\x32\x18\xc7\x14\xf1\x62\x6f\xb5\x28\x7c\x21\x00\x51\xb1\x93\x8e\xf6\x59\x9e\xea\x6a\x61\xcb\x93\x02\xf7\x9f\xbd\x60\x1e\x2c\x7b\x4a\x4a\x90\x53\x15\xed\xf1\xfc\xf9\x88\xfa\x43\x55\xb5\x73\x51\x0d\x7c\xb8\x7b\x9d\x02\x0f\x01\x79\xdd\x8d\x04\xe4\x43\xe4\xb0\x81\x32\x9c\x7f\x20\x31\xe3\x95\xad\xf8\x86\xb2\xca\x56\x34\x66\x0e\x55\x80\xa7\xa2\x1a\xcc\x63\x7e\xb9\xb5\x30\xbf\xef\x83\xe6\x23\x2c\x63\x92\xf0\x4f\x3c\x7c\x3e\xb3\x96\x33\xcb\xf9\xc1\x3f\x9e\x51\x26\x2a\xc1\xaa\xf4\x35\xca\x8a\x51\x5c\x61\xca\x9c\xb1\xd6\x5a\x47\x60\xa3\xdd\x6e\x67\xcc\x43\x66\xed\x43\x96\xf0\xf9\xdf\xa4\x1a\x43\x7d\x1e\x2f\x3f\x3c\x22\x83\xfe\x32\x69\x36\x7e\xd6\x13\xbf\x7e\xec\x89\x5f\x5a\xe2\x97\x8e\xf8\xcd\x2f\x75\xc4\xcb\xd5\x85\x3d\x84\x53\x19\xc0\xf4\x90\x2d\x99\x30\x08\xb2\x00\x15\x30\xdc\x85\xb9\x0c\x86\x01\x53\x41\xd1\xd6\x6d\x0d\xa7\xb9\xbc\x1c\x39\xb7\x03\x1d\x36\x78\x18\xd8\x30\x7c\xd9\x10\x37\x78\xed\x87\x63\x67\x15\x97\xfe\xf8\xf5\x6e\x78\x96\xfd\x0a\xec\x1e\xd6\xba\xf8\xaf\x1e\xf5\xe5\xaa\xc4\xba\x26\xab\x8f\xd8\x79\x53\x78\xf7\x11\xac\x53\xe3\xed\xeb\xf7\xb7\x6f\x37\x6f\x5f\xbf\xbf\x49\xda\xc2\xef\x3f\x5c\x80\x45\x5f\x42\xde\xaf\xf7\xbe\x44\x40\x44\x4d\xb8\x09\xb1\x39\xce\x18\xf6\x87\xa6\xf6\x6d\xdb\x02\x11\x9b\x0e\xaa\xbe\x56\x4d\x07\x84\xfb\x44\xeb\xb0\xdb\x01\xd1\xf7\x60\xb9\x1a\x5b\x7a\x1d\x82\xd2\xc3\x3c\xb8\xab\xdc\xb5\x51\x41\xd6\x3a\xef\xe3\xa1\x6d\xa5\xf2\xa6\x56\x51\x44\xe4\x5c\x2a\x3f\x3e\xc6\xd9\xd9\x0d\x2c\x1f\x58\x9a\xdb\xaf\x1e\xaf\xe0\x5f\xa4\x2a\xe0\x57\x76\xfc\xef\xc1\xd7\x07\xe7\x5a\xf0\x5d\x4e\xcf\x4e\x2d\xaf\xde\xae\xf2\x8c\xcb\x5c\x5b\xd7\xc2\xeb\x8f\x3f\xdf\x7d\x07\x05\x70\x7e\xd9\xee\x49\x1c\x42\xec\x7c\x34\xa3\xc3\xcb\xd0\x34\xb4\x02\x53\xcc\x12\x95\xb2\x8d\x1c\x16\xf7\x1c\x55\x7a\x80\xd9\x53\xc5\x33\xef\xaf\xac\xd9\x0d\x20\x63\xb1\x3b\xc4\x29\x7a\x01\xe8\x54\x03\xd1\x99\xb9\xd1\xdb\x3c\x99\xd2\x2f\x1b\x3f\xa9\x44\x55\x11\xca\xac\x34\xd2\x28\x03\x8e\x08\x89\x16\xcb\xbd\x94\xa3\x52\xb1\x37\xca\x4a\x5c\x7a\x2c\x05\x76\x25\x11\x88\x08\x91\x5d\x9d\x6b\x62\xe6\xbc\xb6\xfd\xcb\xcf\xae\xfe\x19\x0b\x60\xed\x21\xbc\xbe\x7b\x75\xd1\xdc\x4b\x86\x4a\xcf\xc0\x4b\xdf\x3d\x2d\x2d\x1f\x7f\x0f\x96\x6b\xff\x31\xdd\x81\x1f\x7f\x82\x78\x89\x75\x7c\x52\xce\x07\x38\x9c\x70\x00\x45\x1c\xc0\x0e\xf8\xa8\x9b\x65\xe1\x1b\x5c\x3c\x48\x90\x75\x51\x5d\x93\x99\x21\xcb\xba\x5a\x68\xad\xf7\x6a\xb0\x04\x19\xcd\x1d\x72\xba\x42\xb1\x8d\x82\x80\x01\x30\x1c\x8f\xb1\x66\x40\x80\xbc\xba\x3e\x2c\x09\x9b\xb5\xb1\x1e\x47\x20\x13\x6a\xcf\xc4\x9e\x33\x83\x99\xb5\x85\xb4\xdc\x28\x4e\xda\xda\x74\x63\xa9\x8d\xf3\xa5\x47\x8c\xa9\x5e\x58\xd1\x0b\x2f\x2c\xb3\x55\x96\xfd\x0a\xca\xb3\x77\xc0\xdf\xc9\x5e\x9d\xf9\xe1\x97\xaa\xf8\x7f\x9f\x65\xe0\x05\x4d\xed\x66\x5d\xcb\xdf\xbf\x2c\x73\x3d\x37\xc5\xbb\x7e\x1c\xda\x67\xc7\xeb\xe4\x38\xf7\xb2\xbf\x78\x77\x23\xc2\x49\x06\x98\x17\xc8\x57\x25\xd3\x42\x08\xbd\xf7\xc4\x04\x9c\xdb\x5c\x4e\x3b\x0d\xf7\x46\x2b\xe9\x4e\x47\x23\x95\xd2\x57\x54\x7f\xda\x5b\xbf\x04\xc4\x5d\x07\x48\xdb\x9e\xf6\x57\x75\x2c\x84\xd5\xa2\xd4\x9a\xce\xd3\xf5\x74\x34\xe6\x48\x30\x66\xbc\x23\x4c\x71\x8a\x87\xb2\x44\xa2\xb2\x8c\xb0\x9d\x72\xca\x39\xc4\x02\x97\xf2\x18\x07\x6b\x97\x21\xd8\x2f\x1f\x51\xda\x61\x45\x90\xb4\xab\xb7\x6f\x9f\xf0\x3c\x2c\xfb\x8f\xb2\xbf\xcc\xfe\xab\xec\x7f\xca\xfe\xef\x8b\xc7\xeb\xeb\xf3\xc5\xbf\x7b\x81\x6e\x39\x37\xd4\x57\xe0\xc8\xf6\xe6\xcc\xb6\xba\x90\xad\xde\xa4\xf2\xd5\xd3\xcf\xdf\xbd\x39\xd7\xb6\x9e\xb1\xb1\x7e\xfc\x8a\xc9\xea\x95\x99\xc3\xb5\x98\x6b\xb0\x33\x56\x0c\x3d\xa5\x2b\xb3\x8a\xd0\x28\x7d\x34\xa1\xaa\x18\xa8\x6a\x21\x24\xe0\xa0\x95\x18\x4b\xbe\xec\xd7\x8c\x18\x2e\xab\xf9\xb8\x3c\xc0\x38\x21\x62\x79\x80\x60\xa8\x24\xc6\x18\x73\x4e\x28\x67\xd4\x72\x82\xab\x98\x89\xf4\x10\xaa\xe8\xf2\x9f\x11\xba\x3c\x78\xdd\x79\x7f\xa4\x95\x22\xce\x54\xf7\x7a\x05\xb8\x5e\xa1\xfb\xe2\xea\x70\x5f\x5c\x97\x79\xa1\xa5\x93\x1c\x37\x58\x89\xc0\x1d\x27\x8c\x8b\x86\x58\xca\xb0\xe2\xf5\xe3\xcf\x94\x46\x87\x8d\xe4\x92\x07\x49\x99\x94\x03\x61\x4b\xbc\x99\x1e\xe1\x4c\x2e\xc1\xa5\x92\x84\xb1\xc4\x13\xda\xc2\x2c\x61\x50\x68\xd2\x65\xfc\x07\x67\x7e\x64\xb6\xfa\x9c\xac\xb0\xb4\x4b\xbd\xee\xc7\xaf\x3c\xb6\xf2\x4b\x6e\xde\xdf\xfe\xf0\xea\x4d\x76\x7d\x06\xa7\xdc\x6c\xef\x7e\x7b\xbe\x93\xcf\xf7\x0c\xa8\x21\x19\xba\x6e\x37\x77\xfb\xae\xdb\x41\x9f\x7e\xda\xcf\xed\xf2\x93\x31\x42\x09\xd9\xd5\xa0\xdc\xf9\x78\x88\x75\xb1\x6b\x68\x51\x97\x94\xc4\xe3\xd1\x14\xbe\xe1\xfb\x66\x08\x94\x05\x71\xc5\x94\xb6\xd2\x6e\xa9\xef\xdc\xe0\xfd\xe0\x3a\xff\x78\x36\x13\x2a\x8c\x64\x79\x54\x0d\x20\x2c\xaa\xbe\xe2\x03\x7e\xc8\x18\xc1\x94\x12\xcf\x04\x18\xf0\xb1\xe5\x83\xb6\x8d\x6b\x9b\x74\xed\x79\xea\xbf\x89\x47\xed\xdb\xdf\xae\x7e\xf7\x9f\x45\x4d\x2b\x26\xfe\x6d\x22\xe5\xde\x9e\x8d\x84\x6e\xcf\xb4\xf4\xe5\xd8\x34\x8f\x86\x8d\x97\x23\xd2\x00\xac\xaf\x4d\x60\x43\x03\xf6\xd1\x5c\x91\x3a\x6a\x50\xfb\x78\x08\xc0\x6d\xc5\x69\x80\x4c\xc5\x6e\xf9\x07\x9a\x39\x3b\x79\xb0\x1f\x76\xd4\x32\x50\x38\xb7\x71\x27\x1b\xe6\xe5\xbf\xaa\x36\x26\xbb\x02\xfd\x19\x3f\xf5\x27\xd9\xef\x93\x06\xcb\x33\x6f\x8e\xa4\x64\x77\x07\x1e\x0b\xb1\x4f\x42\x32\x6b\x19\xf6\xa7\xcd\x59\xda\xe9\x43\xe2\xb0\xbf\xbf\x78\x61\xdd\x2e\xcf\xbe\x4e\x88\x89\xef\x93\xd3\xdf\x55\xe3\x41\x13\x05\x44\x9f\x0e\x3b\x0f\x32\xd8\xc6\x26\x47\x92\x39\x55\x53\x5c\x21\x57\x4a\x61\xa5\xeb\xe8\xe0\x49\x31\xbb\xc6\x4b\xba\xc9\xbd\xc6\x8a\xe0\x13\x01\xc7\x86\x60\xdb\x47\xc5\x06\x35\x60\x5d\x72\xcd\xb7\x46\x3b\xb3\xec\xe9\x71\x8a\x07\x17\x87\xc6\xef\xaa\xb8\xeb\xf7\x5a\x97\x93\x07\x85\x57\xd6\xd4\x3b\x50\x47\x11\xeb\x78\xe0\x35\xc8\x7a\x70\x90\x12\x33\x42\x47\x1b\xf7\xd2\xe0\x88\x7a\xa5\x0c\xd8\xd3\x62\xd7\xe0\x90\xdd\xc0\xe2\xbc\x37\xfc\x49\xf6\xf7\x5f\xec\xf2\x17\xee\xc6\x99\x31\xf3\x82\x67\xf2\xe3\x73\x2b\xa5\x67\xf0\xe1\x4b\x63\x08\x0a\x88\xea\x24\x5c\xaa\x3f\x39\xa8\xe6\xf1\x68\x10\xb6\x52\x28\x4d\x98\xee\x36\xd4\x26\xe1\xe9\xe5\x87\x00\x48\x38\x85\x10\x36\xea\x14\xfc\x92\x1f\x79\x50\xc5\xfd\xf5\xd1\x5a\x17\x2b\xe7\xc0\xbe\x44\x9c\x51\x6a\x38\xe1\x44\xf8\xa1\xd2\x9c\x19\x41\x05\x13\x2e\x96\xa7\x86\xd2\x8d\x98\x35\x2c\x64\x6c\x95\xcd\xbe\x81\x45\xea\x79\xb9\x47\xe6\xc5\xb2\xce\xaf\x75\x8f\x47\x0c\x7d\xba\x9c\x77\x6f\x3f\xdc\xbd\x7b\xb5\xa4\xba\xdf\x81\x97\x5a\x9a\x9f\x59\x6f\xde\xfd\xf6\xa7\x0f\xcf\xe5\x74\xae\x33\x5c\xc1\x6c\x40\x18\xd0\x4f\x13\x10\x74\x07\x26\x5a\x00\x8c\x51\x4c\x6e\x25\xc7\x53\x1e\xe0\x90\x40\xb5\x04\x08\xab\xa4\x32\xf1\x58\x13\x3b\xb1\x3c\x14\x49\x2b\x70\x23\xcc\xf2\x79\xa2\x9e\x70\x2f\xb6\x8e\x71\x27\x85\x73\x9d\x53\x51\x08\x29\x62\x3f\x37\x40\xa5\xe1\x7b\x60\xd2\x68\x4e\xe3\xa1\x44\x58\xe3\x46\x30\x0e\x88\xf3\xba\xf6\x14\x0f\x9e\xd7\x69\x8e\xc9\xb3\x1f\xee\xab\xec\x9f\x66\xf4\x8c\x91\xfd\x45\x06\xf0\x67\x74\xf3\xd7\xcf\x38\x8a\x09\x9b\x7f\x96\x75\x7e\x49\xb1\xdc\xb4\x35\xe0\x3e\x49\x61\xc5\xb6\x5e\x42\xaa\xe9\x4a\xc4\x12\x32\x21\x99\x40\x86\xe2\xc8\x18\xad\x8c\x66\x0e\xc7\x31\x06\x54\xd7\x51\x06\x48\x22\x4a\x82\xfc\x60\x0f\xf8\x69\x7f\x39\xdb\x1a\xad\xb5\x57\x4a\x29\x1f\xa7\xd9\xcb\x79\x94\x22\xc1\x90\x4d\x5b\xe4\x84\xb9\x9a\x6b\x52\xd4\x79\x3f\xb7\x70\x2f\x81\xbe\x48\x21\x67\xbf\x86\xe4\xc1\x24\x6e\xda\xaf\xbf\x92\x99\xff\xd5\x79\xac\x9e\x2b\xd6\x2f\xaa\x55\x2f\x5c\xcc\x5e\x68\xc9\x3f\xeb\x5b\xbe\x83\x0e\x68\x3b\x3a\xa0\xef\x89\x5f\x02\x8c\xd1\x8d\x27\x71\x3e\xb9\xb7\xd7\xe2\x53\xa3\xaf\xd4\x7d\xf0\x1b\x76\xea\x1c\x2e\x81\x62\xa8\x4e\xed\xca\x1a\x50\xba\xcd\x8d\x31\x66\x36\x60\x6d\x7c\x46\xb7\x7e\x6b\x1c\x8f\xce\xa9\x38\x09\xa9\x24\xe6\xcc\x39\x9f\x6d\x21\x4d\x73\x8d\xfe\x07\xf1\x5b\x4b\xa3\x17\xfa\xab\xf6\x9e\xfb\xfd\x1e\x88\xd1\xee\x4f\x39\xd8\x87\x84\xfa\xe2\x7b\x8c\xc7\x58\x2e\x13\x2a\xcc\x35\x94\x11\x1d\x30\x99\x20\x8e\x15\x08\x80\xe3\x6a\x3e\x90\x2d\x8d\x54\xaf\x06\x0d\xd5\x6a\xb8\x26\xac\xf5\xe3\xe8\xd7\xb3\x48\xa5\x94\x59\x76\x93\xea\xcd\xfe\x97\x7d\x77\xbf\x80\x61\x5f\xdc\x96\xce\x34\xb5\x35\x90\xdc\xe4\x1b\x73\x72\x35\x24\xf3\x10\x7b\x88\xe6\x31\x1c\x0e\xb0\x80\xe5\x3c\x85\x69\x3a\x05\x48\x03\x64\xb1\xdc\x01\xc6\x63\x3f\x85\x5d\x6c\x15\xe0\x63\x2c\xbf\x34\xdf\xc5\x52\xba\x49\x05\x07\x8a\x88\xc1\x30\x05\x6b\xf7\xd9\xaf\xa0\x39\xfb\xb0\xfe\xfa\x71\xe6\x3f\x21\x1f\x56\xf7\xfb\x73\x84\xfb\x9c\x31\x7c\x61\x5f\x3d\x63\x30\xbe\x70\xf2\xbf\x6a\x02\x24\xfe\x84\x3c\xc4\xe0\x68\x84\x54\xea\x34\x28\x2e\x84\x72\x1b\x71\x6a\x92\x3f\xd3\x46\xfa\x53\xed\x7d\x2a\x69\x1f\x81\x3a\xd5\x97\xb3\x18\xb6\x26\x4e\x31\x8c\x13\xd0\x20\xe7\x92\x4a\xca\x08\xd5\x1c\x47\x1d\xb5\xf5\xd1\x9e\x46\xc6\x36\x28\xee\x9a\xa6\x89\xa4\x69\x9a\x35\x5e\x10\x0f\xe4\x46\x6d\x5d\x76\x9d\x7d\x9b\xfd\x79\xf6\xfb\xf3\x7c\x5e\x3b\x0a\x2f\x67\xef\xcd\xe7\x82\xe6\x8f\xbc\x81\x33\xc7\xe6\x26\x05\x5a\xcb\xa8\x5a\x8b\x75\xaf\xdf\x27\x48\xe2\x26\xd3\xcc\x51\x03\xc2\x46\x08\xce\x4d\x65\x39\x99\xc9\x01\x28\x97\x14\xef\xe8\x21\x48\xc3\xad\x53\xad\xec\xd4\x04\x68\x0c\x4d\xcf\x10\x16\x55\xd9\x03\x56\x95\x12\x61\xde\x9d\xbc\x73\xdb\x64\x07\x6c\xca\xbf\x1e\xa5\xca\x7d\xae\xae\x65\x6f\xad\x31\x73\xeb\x03\x73\x2e\x0a\xd0\xef\x9c\x76\x0d\xe4\x66\x6e\x29\xd2\xb2\xa2\x7c\x3f\x72\x8e\xac\xc4\x1c\x48\xd0\x7e\xaa\xb2\xc7\xf5\x6b\xd5\x31\x78\xc2\xa8\xfc\x42\x2d\xf6\x29\x3e\x7a\xae\x5a\x73\x89\x95\xae\x3f\x13\x39\x87\x16\xd0\x00\x64\x58\x36\x93\x10\xeb\x10\x7b\x7a\x15\x7c\xdf\xdb\x98\x2f\x63\x30\xcc\x1d\x64\x31\x73\xe3\x68\x37\x7a\x0c\xe3\x38\x02\x33\x5e\x4f\xa9\x82\xbc\x5c\x48\xef\x76\x76\x67\x43\xe2\x8e\xfb\x60\x77\x36\x95\x5a\x77\xb1\xdd\xed\x76\x59\x76\xb5\xe9\xcf\xb5\xf5\x75\x94\xfd\xc5\x05\xc1\x9b\x7a\xe7\xdb\x9b\x27\xd5\xe3\x47\x6e\xf0\xf2\xbe\x3c\xef\x17\xa5\x92\xd9\x55\x53\x57\x50\xcc\xb2\x20\xb0\x89\xac\x44\x30\xe3\x56\xb5\xa2\x69\x9a\x3d\x6d\x9d\x24\x94\xaa\x46\x18\x54\xc9\xd0\x5c\x00\x35\x98\x5a\x43\xb6\x16\x69\x57\xf1\xb9\xe6\xd4\x0e\x86\xe0\x80\x95\xc2\x35\xa2\xd2\x70\x6a\xea\x03\xac\xaa\x4a\xb7\x31\x79\x6a\xc7\xcc\x49\xe1\xb3\x2c\xbb\x81\xd5\x19\xe3\xbe\xa2\x22\x7e\x3a\x7b\x93\xa6\x79\xfc\xdd\xbf\x3f\xc8\x1d\xee\xaf\x48\xcc\x50\x01\xc5\xa7\x0e\xd2\x02\x45\x13\x36\xf9\xe9\xb8\x1c\xe1\x0a\x47\xca\x6d\x62\x60\x91\x58\xf9\x4d\x71\x3a\x20\x6b\x3b\xd5\x6d\x7c\xa3\xbd\x6c\xb6\x6c\xde\x63\xf2\x0c\xe6\x3e\x46\x19\xfb\x95\x79\x05\x2a\xe7\x63\xcb\x77\xc6\x38\xe7\x82\xa8\xfd\xb9\xde\x42\x6f\xdc\x16\xa7\xb5\xe7\xcf\xb2\xbb\x3f\xaa\x55\x79\x77\x91\xf2\xfe\xf1\xf6\xee\x76\xb5\x55\xfd\x9a\x31\x67\xba\x90\x70\xb5\x0c\x8a\x65\xd1\x94\x9f\x7a\xc8\x52\x6f\xa2\x48\x59\x6c\x10\xc4\x55\x1c\x0c\x40\x7a\xcd\x85\x92\x00\x69\xe6\x99\x3c\x71\xcf\xa5\x37\x9b\x42\x91\x80\x55\xcb\x51\x28\xf9\x16\x9f\xa6\xda\xd5\xce\x2d\x5f\x60\x6e\xa5\xe1\x46\x0d\xf3\x11\xe6\x96\x39\xae\xc4\xfd\x2e\xa9\xd9\x61\xdc\x98\x65\xa9\x0d\xa4\x76\xa5\x75\xf8\xac\x6f\x97\xd6\xd8\xb0\x95\xd9\xaf\x13\xb7\xf1\x71\x57\xb8\x5c\x0f\xb8\xa0\xf9\x9e\x67\x97\x09\xb1\x97\x00\x6b\x17\x10\xc0\x8f\x1f\x2e\x3d\xff\xe1\x8a\xdc\x0f\x9b\x70\x6a\x36\xe2\xa4\x20\x83\x6c\x00\x79\x3c\x2e\x01\x09\x32\x9a\x9e\xb2\xab\x6c\x0a\x4b\x08\x79\x6a\xa0\x3a\x4c\x45\x1c\x63\x83\x40\x3e\x82\xdc\x71\xcf\xdc\x56\xce\x8d\x17\x9e\xc7\x2c\x62\xed\x27\x2d\xf3\xa6\xe0\x83\xd7\xae\xb3\x2e\x20\x4b\x2a\x8f\x9a\xb9\x51\x89\x21\xf7\x0d\xcc\x93\x4f\x2c\xfd\x6c\x5f\x5e\x9d\x68\x9e\xa1\x10\xcf\xd7\xf2\xf6\x8b\x00\xe3\x5c\xf2\xbb\x59\xdd\xa2\xaf\xde\xdc\xfc\xf4\x23\x6c\xae\xf8\x94\xc0\x84\xfc\xd3\x1e\xf0\x78\x00\xc5\x58\x27\xd6\xeb\x0e\xd0\xd3\xe1\x72\x36\xae\xf9\x00\x15\xfb\x78\xe4\x13\xac\x01\xde\xc9\x21\x4e\x5b\x3a\xe3\xce\xb7\xde\xb7\xbe\x03\xad\xf7\x3e\xf2\x10\x42\x44\x5d\x17\xfb\xb6\x6d\x4d\x50\x81\x79\xe5\x7d\xd0\x49\x87\xa2\x48\xaf\xdf\xfc\x52\xb5\xff\x79\x6f\xec\xa9\x2f\xb6\xd6\x49\xbe\x50\xa3\xb8\x7e\xf7\xc3\x79\x7a\x38\x90\x07\xa0\xd3\x4d\x06\x72\x0e\xab\x3d\xfe\xdc\x24\x75\xe4\x1a\xe8\xe8\xc7\x14\x15\x8d\x80\x9f\x76\x97\xb3\xd9\xca\x3a\xd6\x0c\x60\x68\x0e\xa3\x18\x0f\xd7\x43\xdb\xb6\xad\xeb\x9c\x9d\x4b\x38\x59\xd7\x75\xdd\x9c\xb7\x6d\x1b\xab\xa4\x4a\xa1\x34\x77\x44\x11\xed\x2d\x5b\xc6\xd0\xe1\x81\xdf\xb8\xad\x7e\xf4\x1c\xfe\xcf\x9e\xeb\x3c\x5c\x46\x52\x5a\x9e\x9e\x30\xae\xaf\xee\xce\x6b\xd3\x0f\xe0\x73\x89\x9d\xc7\x52\xb6\xe9\xf6\xcb\x7e\xb6\xa1\x09\x96\xe8\x60\x71\xea\x11\xde\x1c\xf5\xb2\x34\x59\xc9\x48\x71\x22\x56\xc8\x9d\x76\x20\x83\x5a\x10\x87\xb9\x15\x38\x60\xae\x79\x19\x4a\xd6\x07\xa1\xbc\xd9\x6a\x4b\x50\xe3\xba\xce\x35\xfe\x74\xa4\x7c\x6e\xa6\x2a\x54\x0e\x04\x4f\x6d\xdb\xc1\x23\xba\x0f\xc6\xd3\x60\x0a\xdf\x92\x2e\x14\x6d\x8b\x87\xa6\xc4\xc7\x86\xf7\x6b\x3d\xf2\xf0\xa0\xd3\x7a\xfb\xc4\x33\xfd\x87\xd9\x5f\x24\xa6\x29\x7f\xa1\x68\x76\xe1\x9a\xa2\x1f\xcf\xcb\xec\x67\x6f\xd1\xed\xbb\xbb\xd7\x97\xe2\xce\x2f\x07\xf9\x90\x41\xbc\x2a\x94\xef\xb1\x64\x9a\xc7\x6c\xee\x4a\x80\x41\x1e\x2b\xb0\x9f\x77\x87\x04\xe3\xda\x03\x7a\x9a\x2e\x67\xf4\x21\x93\x4a\x6a\xae\xa7\x9a\xd8\x91\xe6\x3e\xb7\x71\x37\x9a\x0d\xae\xa5\x15\xf5\x49\xf8\x52\x79\x75\x7d\xf0\xde\xe9\xb9\x73\x9e\x7a\x96\xfb\xc2\x40\xa6\x63\xa3\x52\xb4\xaf\x54\x1c\xb8\xee\xa4\x15\xc6\xe0\xd8\xa3\x12\x2b\x5c\x73\xc6\x80\x6c\x77\x6c\xe8\x4a\xb4\xef\x58\xb7\x72\x0e\xd6\x5e\x85\xcc\x7e\xca\xfe\x45\xf6\xbf\x3e\x71\x0b\x9f\x15\xe9\x5e\x7f\xfb\x97\xe0\xf5\xdb\x84\xbe\x82\x37\xef\xfe\x0a\xfc\x7c\xf7\xc3\xe6\x77\xe0\x35\xbc\x4e\x80\x8e\xe2\x39\x98\xe3\xee\xc3\xdb\x97\x4e\x42\x8f\xe6\x33\xdf\xbe\xdc\xc3\xae\x5d\x6a\xcc\x73\xc5\x25\x57\x44\x0b\x2b\x29\xae\x5c\xcd\x78\x9f\x7b\xc9\xaa\x1c\x98\xb8\x13\x73\x80\x38\xc4\x65\x7e\x1e\x2a\xc0\x94\xe1\xb2\x94\x82\x94\x45\x0c\x12\x64\x07\x42\x44\xad\x29\x53\x9c\x4a\x1c\x35\x74\xce\xb0\x2a\x52\x28\x05\xb1\x46\x6b\x67\x7b\xd9\x69\x6d\xb7\x92\x73\xca\xa8\x66\x82\x5a\xae\x14\x21\xba\x44\x13\x36\x94\x76\x71\x12\x0a\xbb\xfd\x0e\x70\x1b\x0f\x3e\x92\x36\xaa\x21\xf7\xb9\x9c\x40\xdf\xea\xb2\x50\x84\x51\xca\x30\x15\xfc\x3e\x30\x26\x94\x35\xc5\x40\x85\x34\x7a\xc9\xb7\x98\xe4\x34\xbb\x4a\xb5\xe0\x25\x8f\x58\xf6\x8e\xdf\xaf\x0e\x4b\x4f\x0d\xce\x3f\x88\xf7\x4d\x02\x5a\x2b\xe6\x03\x7c\xb8\xfb\xf6\xe6\xb1\x4d\xb1\x31\xae\x28\x37\x62\xde\x97\x15\xdc\x9d\x0e\x14\x03\x5c\xe1\xc0\x2a\x60\x9f\xb1\xbf\xf7\x27\x14\x18\x33\xa0\x68\x62\x0b\x3c\x1f\x09\x33\x35\xcc\x62\x78\x94\x6a\xd9\xda\x0a\x63\xa7\xa4\xb7\x8c\x12\xcc\x85\xf3\xd6\x5b\xef\x18\x6c\x38\xd5\x20\x03\xcc\x0f\x82\x49\x77\xb2\x3e\xcf\x97\xab\xf7\xf1\xe0\x33\x98\x34\x17\x1c\x64\xd9\xdf\x5b\x35\xd6\x5e\x7f\xf7\xe6\x87\x15\xf7\xff\xe6\xe6\x87\x1f\x9f\x55\x6a\x9f\x75\x81\xfa\x50\x61\x90\xed\xf4\x6e\xbf\xef\x1b\x9e\x6c\xd1\xad\x60\x48\x70\x8c\x4e\x13\xac\xdb\x28\x05\xe0\x4d\x2c\x20\xb3\x15\xa2\xda\x4a\x6a\x59\x15\xec\xf1\x90\x3a\x41\x88\x80\xc6\xc7\x7d\x6d\xec\x2e\x3b\xd7\x0e\xea\x2d\x79\x86\x31\xfe\xe7\x17\x84\xf1\x76\x75\x6e\xcc\xae\x7f\x58\xf9\x06\x69\x28\x3d\x0f\x29\x92\xb7\xc8\x6a\x6a\xfb\xc5\x9e\xf0\x7c\x32\xb6\x57\x6a\xee\x4d\xb7\xab\x8d\xf6\x31\xc4\x1a\x18\x80\x09\x35\x9d\xb1\x15\xee\x06\xe1\x05\x2b\x85\xe4\xc7\x87\xac\x9a\xc6\x61\x28\xf7\x21\xfa\x04\xc5\x06\x23\x10\xa7\xe1\x72\xc6\xf6\xde\xd9\xfd\xdc\x99\xb6\xd7\xe3\x96\xcc\xd6\xa9\xbc\xe4\x02\xc7\xd1\x23\x4c\x29\x69\x76\x98\x52\x54\xc6\x46\xf1\xc2\xe5\x14\x54\x65\x61\x84\x2d\x0b\xa3\x42\xca\xec\xe2\xf2\xe5\xc4\xeb\x96\x35\x75\xc5\x3a\x25\x6d\x96\xea\x47\xcb\xde\xe1\xce\x3d\x30\x7e\xd6\x36\xbc\x60\xf3\x57\x5d\xf3\xe7\x40\xd2\xe7\x20\x9b\x73\x77\x2c\x71\x53\x1e\x11\x55\x3f\x7f\xf7\xe6\xd5\xd9\x9f\xf1\xac\xfd\xec\xef\x3d\x18\x96\x8d\xce\x03\x6f\x6d\xac\x09\x93\xcc\x29\xa3\x1b\x19\xc7\xc0\x34\xa7\x88\x73\xd2\x8f\x1a\xe0\x75\x3b\x24\x3b\xbf\x83\xb8\xc4\x9e\x54\xc5\xaa\x59\x3e\x97\xc1\x08\xeb\xae\x0f\x2e\x2a\x6f\xa5\x8c\x07\x17\x47\x2b\xb9\xa4\x4e\x18\x65\x07\x50\xc5\xb0\x5c\x75\x21\xb4\x17\xda\x86\x83\xad\xd5\x7c\x8c\x92\x83\x1a\x4c\x70\x24\xa4\x62\x3c\x6a\xef\xe3\x54\xd7\xb1\xc1\x4c\x0b\x92\x65\x57\x90\x25\x5c\xa3\xcd\xfe\x49\xf6\x57\xe9\xfa\x9f\x50\x78\x8f\xbb\xe5\xeb\x6f\x1f\x27\x57\x4a\x07\xdf\xc2\xeb\x77\x7f\x05\xff\x19\xb8\xa0\x0c\xce\x44\x86\xe4\xb0\x7e\xd9\x4d\xa1\x39\x06\x70\x48\x68\xf1\xd8\x83\x29\x96\x4b\x3c\x96\xe5\x45\x72\xf9\x03\x5a\x44\xde\x16\x3e\x62\xa6\x5a\x8b\x51\xc4\x10\x15\x79\xc4\x60\x4c\x48\xa4\xe1\xb8\xb1\x4b\xec\xb6\xc4\x07\x7b\xc0\xb6\x95\x10\x42\xb8\x83\x8a\xba\xa8\x2a\x47\x88\x0f\xb4\x51\xa0\x8c\x7b\xe1\x0b\xc2\x71\xe5\x09\x71\x12\x78\x75\xd0\x5a\xc7\xdc\x7b\xbf\xac\xaf\xec\xc1\x26\xaf\xde\x37\x29\x12\x78\x64\x94\x9d\xc5\xe9\x6e\x2f\xd4\xa5\x55\x43\xfc\x65\x74\xb3\xb9\xfb\x90\x8a\xfe\xb4\x3e\x30\xe1\x0c\xf7\xc1\x0b\x5a\x53\x1e\x51\xdc\x6f\xf2\x65\x93\x8f\x08\xaa\x4f\x03\x24\x91\x82\xde\x81\x21\x92\x6b\xb2\xda\x0a\x80\xa0\xa5\xf0\x49\x12\xc5\x05\xec\xd4\x69\x0f\xb3\x98\x75\xae\x0b\xa1\x73\x80\x1c\x93\xef\x13\x74\x5f\xe8\x79\xfe\xe3\xa4\x1e\xfd\xf9\x1e\xf8\xd3\x1f\xda\x04\x93\xbf\xd5\xc7\xc7\xff\xe2\x4b\x83\x2b\xd8\xc0\x3c\x2c\xb9\x39\xd8\x31\x49\x6d\x89\x22\x9d\x3b\x04\x4a\x90\x2f\x2f\x7b\x3e\x8e\x29\x34\xeb\x01\x99\xf3\xcb\x59\x59\xa2\xc9\x9f\xda\x8d\x0e\x4b\xa0\xc9\xac\x92\xa5\xd6\xf8\xe4\x81\x94\xc2\x32\xf5\xcc\xec\x8a\xe2\x5f\x30\xbb\xca\xe3\x41\x4a\xb7\x5f\xdd\xae\x7a\x74\x76\xbb\xfa\x35\x44\x49\xdb\xd7\x7c\x51\xf7\x59\xd7\x9b\x67\xb5\x9f\xa7\x08\x6d\xc9\x06\xc1\x2f\xd4\x81\x5e\x7d\xa6\xc8\x03\x11\xe8\xc3\xb0\xaa\xfe\xea\x7b\x02\x64\xa4\x1b\x34\xc4\x7a\x18\x80\x1c\xc2\xee\xa4\xcf\x27\x3c\xcc\x79\x08\xf0\x38\xe7\xcb\x71\x6e\xc8\x25\x85\xe8\xe5\xe3\x21\x21\x73\x4c\x0c\xeb\x37\x37\x57\x52\xc2\xfd\xd1\x44\x6f\xd7\x18\x53\x24\x2e\xca\x1f\xd1\x3a\x03\xcf\xae\xe1\x0f\x45\x97\x57\x3b\x8a\x20\x0e\xa7\x3c\x40\x5e\xe2\x78\xd8\xe0\xd8\x80\xe9\xbe\x06\x63\xec\xf3\xaf\xc4\x95\x46\x76\xf1\x20\x00\x82\x72\x9a\xf8\x61\xfa\xf7\xd5\x3b\xbb\x81\xf6\x81\xdd\xe8\xb3\x1f\xd1\xed\x79\xad\xff\x4f\x5f\xfa\x11\x5d\x9f\xab\x14\x3f\xa5\xb7\xe2\xed\x77\xdf\x83\x4b\xd9\xfc\xc3\x9b\xed\x23\x52\x6a\xf3\x88\xaa\x5a\xc3\xcb\x1b\x1d\x4e\x34\x84\x4d\x7f\xa2\xf0\xc8\x08\xa5\x74\xb6\x60\xcc\x0d\xc8\x8e\x79\x51\x10\xac\xb9\xaa\x4a\x24\x73\x23\x31\x93\xdc\x72\x5c\x46\x84\x80\x89\xce\x1a\x03\xf2\xbc\x9f\xca\xe3\x96\xfc\x75\xa1\xd4\xf6\xf0\x29\xbb\xd6\x55\x45\x38\xad\x9c\x94\xbd\xdb\x49\xe7\x07\x1c\x77\xbd\xb3\xe8\xe0\x25\x97\xda\xee\x81\x37\x51\xeb\x36\xd6\x7a\xf9\x7f\x65\xbf\x02\xfb\x14\x4b\xf9\xa4\x21\xf5\xd2\x45\xf3\xf7\x2f\xfd\x65\x96\x08\xe0\xa2\x90\xf3\xf2\x7d\x79\xf5\x0b\x79\xe5\x66\xaa\x51\x05\x11\xe3\x40\xdd\x07\x84\x39\x20\xa0\x11\x34\x12\x26\x57\x18\xe8\x01\xf0\x53\x7f\x39\xab\x9c\x68\x98\x39\xc9\x20\x54\x6d\x37\x58\x91\x40\xe4\x4e\x92\x80\xe5\xd6\x63\x4a\x9d\xe6\x27\xb3\xa9\x10\x72\x20\x9b\x84\x52\x22\x31\x46\xe6\x70\x38\x1c\x22\xf3\x0d\x6f\x02\x25\x3b\x27\x42\xed\x52\x62\x99\xc4\xf1\xd3\x7a\x91\xa5\xde\xb7\x4b\x3a\x20\x7f\xf6\x8c\x05\xf4\x84\x40\x7f\xea\xce\x3d\x3b\xbb\xe4\xd4\x97\x1a\x1e\xbc\xbe\xb0\x1e\xbe\x58\x4b\x84\x63\x52\x52\x2b\x9c\x85\xe5\x92\xe8\x32\x2b\xbc\x07\x47\xc7\x78\x7a\xd4\x9c\xc4\x95\x9f\x0f\xd0\xc4\x62\x00\x84\xc7\x7a\x1f\xc6\xd8\xc9\x25\x77\xab\x20\x8d\xe5\xda\xd8\x39\x00\x73\x0a\x97\xb3\xad\xc3\x5a\x30\xce\x8c\x34\x06\x2b\xce\x18\xd3\x52\x5b\x2c\x39\xe7\xcc\x28\x1d\xc3\xec\x94\xdb\xa9\x10\x40\x11\x29\xa8\x1f\x32\x6f\xed\xde\x29\x60\x5c\xb2\xae\x72\x2e\xbb\xc9\x14\xa4\x67\x7c\xc6\x5d\xf6\x3e\x23\xc9\xef\xf5\xbf\x7c\xae\x4a\xb3\xae\xd8\x3f\x3e\x8b\x94\xb7\x4b\xa4\xfc\x61\xf3\xf6\xc3\x67\xd5\x9b\x25\x1c\xfe\xee\x7a\x39\xff\x3d\xb8\xbb\xdd\xbc\x7d\xfd\xfe\xee\xc3\xdb\xd7\x0d\xb0\xc9\x3c\x1b\xd0\xd3\x92\xc8\xd9\xeb\x43\x35\x1e\x39\xef\xf2\x56\x0a\x82\xe4\x26\x13\xc6\xd6\x6c\xa8\x53\x25\x47\x1f\x34\x8d\x0d\xbd\x3f\x16\x4e\xbb\x4d\xe1\xdb\x36\xf6\xfd\x16\x09\x91\x00\x5d\x5d\x4f\x2c\x65\x7a\xa4\xaa\xd2\xf5\xbc\xb7\xd2\xf1\x0a\xd9\x8a\x73\x64\xcb\x8a\x17\x98\xb1\xce\x2b\x2d\x87\x5d\xf4\x20\x4b\x7b\x14\x84\xe4\x81\xdd\xa8\x33\xb7\xe7\x59\xbd\xff\x59\x8d\x3f\xb5\xe7\x7f\xd1\xc8\xf6\xa7\xc7\x47\x2e\xb0\xbd\xbb\xd7\x77\x1b\x1e\x40\x5f\x03\x14\xc7\x38\x40\xa2\x0d\x61\x95\x52\x15\xc5\xcb\xfe\xcf\x88\x55\xd6\x46\xe9\x31\xa6\x98\x72\x8e\x09\xd3\xc6\x44\x1b\x60\x19\x77\x71\x02\x25\x14\xcb\xde\xf0\x99\xa5\x2d\xaa\x02\x96\x52\x4b\x21\x5d\xcf\xbb\x03\x98\x4e\x0a\xd0\x4a\x4a\xcb\x85\xb2\x52\xf2\x76\x04\xbb\x13\x39\x9b\xda\xfa\xec\x06\xf2\x73\x8d\xea\x25\x6f\x6d\xad\xf1\x3c\xb1\x91\xbe\x56\x01\x5c\x96\xf6\x2f\x46\xe7\x65\xdd\x87\xcd\x95\x8b\xd9\x14\xa6\xc9\xc6\x0c\x8a\xb9\x09\xf3\x0e\xe2\x58\xea\xdd\x2e\x8c\xb1\xa8\xd3\x34\x9c\x80\x3a\xb5\x97\xb3\x19\x8d\x23\x30\xd3\x96\xcd\xae\x31\xc6\xd7\xde\xfa\x78\x00\x85\xb7\xcb\xa9\x6d\x80\x59\x76\xad\x25\x77\x9b\x71\x9d\x34\x78\x37\x89\x5b\x63\x12\x76\xf0\x3f\x4e\xfa\xa4\x9f\x71\xa3\xc0\x93\x35\xd0\x93\x85\xf9\xab\x37\x70\xb3\xbc\x1b\x3f\xfe\xa1\x5f\x6e\xac\x26\x40\x48\xd6\x30\x0e\xc8\xa7\x1e\x30\x22\x80\xe1\x65\xc8\x8b\xe1\x80\x6b\xef\x6b\xd4\x59\x27\x5b\xa3\x9c\x1f\x0e\x4e\x17\xe5\x86\x7e\xf9\x5b\x2b\x2f\xbf\xdd\xda\xd0\x84\x86\x78\xe3\xbd\x37\x9f\xba\x61\x57\x71\xce\x2b\xb3\x03\x08\x15\x7e\x04\xba\x8a\xdd\x3e\x2f\x00\xc5\xf3\x21\xf6\x55\x45\x29\xfa\xca\x53\xfa\x71\x7d\xca\x14\x87\xe5\x29\xcb\x1e\xc1\x52\x0d\xde\x7e\xa9\xc1\xff\xa8\xe6\x78\xd6\xe0\xff\xf9\x0e\xac\x3e\xc4\x97\xa9\x78\x73\x59\x42\xaf\xdf\x7d\x84\x0e\xe6\x65\x8b\x60\x31\xef\x4b\x30\xb9\x4f\x7b\x0b\x7c\x19\x8b\xcd\xb0\x6c\x52\x97\xa3\x9f\x26\x31\x4d\xb1\xb7\x7d\x3c\xc8\xc3\xf5\xc1\x97\xc6\xd9\x13\x73\x6e\xd3\xd9\x68\x8d\x31\x5a\x4f\xda\xe8\x86\x18\xef\xa8\x51\x56\x78\xb2\x6a\x06\x2e\xef\x91\xda\x92\xec\xef\x3f\x76\x05\x53\x4a\xfc\x2b\xf0\x98\x12\xa7\xa8\xfc\xe3\x6a\x13\xf0\xe3\x1f\xfa\xe5\x73\x24\x34\xd4\x10\xc5\x1a\x81\x50\xe8\x46\xd9\x32\x48\x82\xcb\xa9\x63\x00\x0f\x79\x64\x02\xf0\xa8\x61\x0d\x59\xac\x2b\x10\x72\xdd\x28\x57\x78\x75\x79\x46\x5f\x44\xc6\x01\x8f\x7c\xd6\xc1\x09\x1f\x36\xa8\xb6\xc2\x85\x2d\x89\x78\x3c\xf5\xf1\x88\x02\x92\x83\x61\x41\xaa\xb6\x03\xe3\xce\x2e\x0f\x77\x0f\xd9\x67\x0f\xcf\x39\x57\xda\x2c\xa9\xb9\x36\x3c\xbb\x86\xd5\x83\x4e\x31\xec\xa5\x5f\xf3\x6e\x5d\x25\x6e\xdf\xdf\xde\x7d\xc5\x57\xf9\x25\x87\xaf\x4b\x80\x65\x11\xee\x83\xb8\x46\x9f\xc6\x24\x41\x17\xe0\x61\x2e\x88\x64\x80\x30\xdc\x94\xcb\x30\x6c\x80\x21\x6c\x5b\x4c\xcb\x84\x99\xa2\xb3\xde\x44\xe4\xfb\xa8\xb5\x5d\x16\x0e\xe5\x3d\x67\xd9\x16\xe2\xb4\xbf\xda\x84\x3e\xff\xfd\x65\x15\x06\x2b\xf3\xe0\x6c\xdc\x71\x49\x92\xd6\x16\xc6\x73\xf9\xa3\xe7\x9f\x3f\xbd\x03\x1f\xde\xfe\x19\x3c\x87\x73\x17\xca\xc9\x4e\xa9\x41\xe0\x06\x49\x20\xa3\x04\x5c\xeb\x78\xf4\x47\xb1\xaf\x43\xe7\xfd\x4e\x1d\xc2\x01\xe0\x04\xae\xda\xa5\xef\x8a\x32\x30\x75\x5d\xe8\xe6\x63\x17\xba\xad\x55\x4e\x1b\x42\x8c\xab\xe3\xde\xc7\xfd\x68\x82\x3d\x44\x02\xd9\xdc\x81\x76\xe7\x9d\x9b\x6c\xe3\x1b\x5b\x3b\xce\x22\xad\xeb\x64\x9d\x1b\x87\xe5\x6b\xd2\xb5\x32\xe7\xfd\xe5\xfb\x27\xa5\xf9\x4b\xa7\xfc\xf6\xb3\x9f\xaf\xea\xb3\x82\x32\x60\xa7\x29\x39\x7f\x16\xa9\x2f\x01\xc4\xa9\x05\x32\x1e\xae\x53\x02\xe0\xe3\xe4\x3d\x28\x4f\xa9\xee\xe9\xe3\xde\x7b\x50\xa5\x1e\x49\xf5\xd8\xe3\x7d\xa1\xe2\x7f\x76\x35\x7a\xd6\x23\x79\x16\x8d\xfd\x0e\xdc\xde\xdd\x2e\x63\x7b\x39\x60\x05\x50\x00\x6d\x22\x5d\x84\xc8\x43\x1c\xaf\xf6\xe1\x34\xf8\xcb\xde\xcb\x4e\xc3\xe5\x2c\x76\xd7\xe6\x62\x74\xe5\x0f\x4b\x78\xd1\xdd\x37\x5a\x5f\x89\x28\x56\x2b\x87\x99\xa4\x57\x5e\x65\x57\x30\x4b\xeb\xdd\x92\x27\x7d\x7f\x56\x47\x7d\x7a\xbf\x5e\xf0\x09\xae\xcf\x19\xd4\xf5\x1b\x98\x5d\xbf\xfb\x21\x7b\x73\x95\xc0\xe1\x16\x16\xa9\xa7\x51\x80\x43\xbd\x52\x03\x22\x85\xec\x3e\xbf\x22\x61\xb6\x01\xd4\x01\xc7\x3a\x3a\x02\x04\xc0\x3b\x50\x1d\xd4\x43\x16\xa7\xcd\x68\x9c\x76\x75\xed\xb4\x33\x4e\xce\x01\x8c\xb1\x80\x66\x9f\xc7\x21\x36\xcc\x13\x50\x6a\xe5\x6c\x50\x89\x77\x47\x93\xdf\x91\xc9\xbe\xcd\xfe\xee\x53\xaf\xe3\xf1\x95\xad\x85\x87\x0f\x8f\x46\x3b\xe0\xee\xe3\xed\xfb\x22\x79\xb2\xa4\x60\xe7\xfc\xe8\x55\x9a\xde\x07\xd0\x24\x21\x4d\x58\x72\x6d\x04\xbe\x3f\xc0\x3c\x8a\x9d\x37\xd2\xb8\x78\x84\x86\x04\x0c\x8b\xb9\xaf\xe7\x91\x81\xd0\xce\xfb\x26\x2c\x53\x78\x53\x81\x7c\xaf\xa6\xe3\x75\xdf\x75\xae\xb7\xb5\x15\x4a\xb8\x3e\x1a\xa6\x8c\xe1\x51\x34\x80\xc7\xa1\xf7\x71\xdf\x58\xb3\x07\x07\x6e\xb4\x15\xb1\xd2\xc1\xad\x9a\x12\x10\xaa\x14\xbb\xa1\x54\xe9\x4c\xef\xf7\xeb\xbb\xd7\x5f\xaf\x25\x7c\xfc\x7d\xb2\xc8\xfd\xf1\xa9\x61\xb0\xbe\xfa\x0d\xda\xe8\xc3\xbc\xc7\xd4\x09\x67\x5d\xbb\xe3\xb1\xef\x95\x67\x0c\x71\xc6\xf0\x31\x8e\x14\x30\x50\xcc\xcd\xc6\x27\xc0\x42\x55\x7a\x6d\x54\xd8\xa2\x39\xf8\x56\x30\xe3\x45\xab\x5b\x51\xd7\xa0\x8a\x5e\xcb\x3c\xe4\x15\xd9\x77\xae\x71\x2d\xd0\xbe\x71\xcd\xcc\x94\xd6\x8f\x7a\x1b\x9b\x2a\xd5\xd5\xbe\x40\x22\xbf\xa0\x15\x5d\x30\x85\x9b\x3e\x30\xb1\xb3\x3e\xf4\x13\xc0\x2c\xe2\xb8\xa7\x9a\x62\xc4\x58\xb9\x9f\x8f\x02\x0c\xc3\x7c\x80\xdd\xd6\xb6\x8c\x19\x2b\x83\x0c\xc2\x39\x80\xe2\x4e\x26\xe1\x8d\xc3\xb1\x76\x66\xd5\x49\xbc\x4a\x7d\xdf\x55\x23\x75\x55\x84\xcc\x3e\xe7\xf8\x3c\xef\xa0\xbc\xe8\x68\x2d\x13\xe3\xfd\x32\x39\x7a\x30\xd5\x29\xd7\xdd\xc7\x0a\xf2\x4f\x23\xc4\x51\x81\x10\xcb\x4d\x3d\xb3\x7a\x73\xd4\x8a\x89\xca\x52\x1a\xc5\x3a\x6f\x8b\x78\xb8\xde\xd7\xb5\x5b\xc6\xe1\x32\x0a\xef\x5d\xd4\x9b\x7a\x46\x52\x16\xa1\xe0\x30\xcd\xee\xf5\xb5\xa9\xb3\x4f\xd8\xdf\x7d\x54\xd3\x4d\xa5\xc5\xed\xcd\xa5\x20\xf6\x28\x0e\xfd\x07\xd8\x57\xd7\x05\x45\x10\xcd\x58\x6b\x50\x00\x54\x55\xd6\x39\xc7\x23\x8f\x65\xd5\xfb\x28\x21\x43\x15\xf4\x4a\x71\x8d\x3c\x23\x4b\x28\x02\x77\x33\x5e\x8e\xad\x15\xc2\x35\x3c\xaf\x70\x25\x7c\xa7\x2c\x29\xac\x6c\x1d\x25\x73\x76\xea\xa4\x58\x79\x54\xdd\x55\x16\x47\x1f\xa5\x5f\xeb\xca\xf2\x7c\x2f\xff\x61\xf6\xe7\x19\x59\x72\xbb\xaf\x8e\xaf\x9f\xef\xde\xbd\x5a\xf6\xf3\x24\xcb\xfd\x6c\x38\x82\x9b\xbb\x9f\xcf\x8d\x6a\xa6\x3c\xa3\x88\x31\x86\x0f\xeb\x18\xcb\xe7\x0e\x4e\x74\x6e\xc8\xde\x23\xe8\x76\x40\xcd\x23\x61\x5e\x7a\xef\xeb\x65\x4c\xce\x47\x06\x11\x9f\x73\xaf\xb4\xf6\x40\xc6\xee\xf3\xd1\xe6\x0c\xe8\x09\xf3\x91\xfb\x41\x72\x5f\x8b\xc1\x7a\x19\xc2\x75\x59\xd7\xb3\xbe\x0c\xc2\x2b\xb0\x3f\xe3\x7c\xff\x24\x69\x1e\xfe\x83\x8b\xff\xde\x33\xb6\xe2\x63\xa8\x71\x7d\xf7\x6a\x95\x71\x4e\x5a\xba\xab\x5b\xe8\x75\xc6\x2a\xb0\xbf\x3f\xee\xfd\x0e\xa2\x8a\x40\x7a\x0a\x1b\x45\x19\xb2\x88\xcd\x35\x90\x85\xcb\xc1\x18\xa5\x02\x4e\xc7\xda\xd2\x48\x04\x68\x70\xec\xb6\x46\xaa\x98\x1f\x62\x11\xb5\x00\x0e\xec\x60\xc7\x69\x9c\xa6\x4e\x2a\xac\xc5\x04\x32\xaf\x7d\x6c\x7b\xb7\x03\x3c\x76\x7b\xdf\x01\x9e\xe6\x76\xca\x3b\x45\xf2\x7e\xfb\x8b\x8b\xee\xc8\xe6\x99\xff\x72\xea\xca\x7c\x0f\x1e\x15\xba\x1e\x2d\xec\x9e\xa4\xbd\x36\xa5\x2f\xd1\x66\xe2\x64\x27\x3c\xea\xb8\x2a\xe9\x49\x0a\x63\xf6\x9d\xa3\x90\x47\x0b\xea\x28\xf7\xfe\xe4\xfd\xb4\x84\xe5\x0d\x97\x66\xda\x1a\xc4\xd8\xbd\x8c\x87\x7d\x51\x17\x66\xda\x1c\xbd\xd2\x9d\xab\x94\xdb\xb9\xa8\x01\x8a\x12\x84\x38\x01\x9f\x44\xbc\xea\x0c\x26\xac\x0a\xdb\xea\xec\x4f\x92\xf3\xf0\x39\x17\x5e\x06\xec\xf6\x7a\x35\x8e\x7b\xd9\x11\x3b\x6f\x3e\x1f\xaf\x78\x40\x15\x94\xb6\xb3\xb5\x8c\x59\xfd\x90\x29\xc0\x47\x3b\xec\x97\x2d\x66\xb3\xba\xea\x39\x58\x84\x53\x1d\x8e\x5b\x8d\x19\x73\x87\x41\xb4\xcd\xb1\xd3\x20\x8f\xad\x15\xd5\xce\xc7\x23\xc8\xfd\x2e\x9c\x4a\x21\x36\x7d\x95\xd6\xf2\x3a\xcd\x25\x9d\xfd\xfd\xec\xb7\x67\x97\xa3\x73\x06\xfb\x42\x9b\x7a\xb3\x92\xd3\x57\x65\xea\xed\xcd\x97\xd2\xd4\x83\x1e\x8f\x79\x09\x8e\x91\x51\x5f\x91\xd2\x21\x29\xa6\x2e\x22\x80\xab\x71\x60\x50\x57\x65\xde\xef\x36\xbb\x70\x3a\x84\xb0\x29\x4e\x87\xe5\xd8\x6a\x53\x95\x56\x3a\x63\x06\xdc\x69\x60\x27\x6e\x69\xc5\xe1\x1e\xc7\x56\xea\x32\x6f\xe7\xdd\x4b\x65\xea\x0d\xa4\x0f\xfc\x46\x6f\x51\xaa\x24\x7c\xb8\x78\x7d\xac\x16\xc9\x6b\x94\xf3\xbc\x06\xbe\x04\x94\xb7\x1f\xcf\xdb\xcd\x3f\x02\xef\x2f\xfa\x5f\xf0\xb8\x19\xda\x31\x28\x5d\xef\xa6\x46\xf9\xc0\x05\x21\x65\x45\xd8\xae\x66\xa0\x68\x5a\x3f\x17\xda\x6b\xa5\xdd\x10\xae\xb2\x10\xee\xd5\x16\xd5\xc1\x76\xc2\x58\xa7\x52\xd0\x6f\xe2\xc8\x18\xf2\x08\x01\xba\xd7\xa1\xe9\x80\xd7\x2a\x4e\xca\x99\xa0\xd8\xfd\xf1\x2a\xff\x74\xd4\x6b\xad\x73\xf5\x68\xf9\x75\xf6\x7d\xea\x78\xbe\x7f\xfd\x0c\x29\x73\x73\x07\xc1\xbb\x1f\x5e\xbd\x7d\x34\x99\xf9\xcd\x8f\x6f\x6f\x5f\x12\xff\x9f\xb2\xcd\x0f\x57\x6d\x0d\x51\x7d\x32\x35\xcc\xa3\xf5\x05\xe0\x74\x9e\x24\x68\x45\x5f\x12\x4e\x05\xa5\x54\x0f\x9b\x66\x2c\x65\xa8\xf2\x50\x8a\xc3\x40\x61\x2e\x78\x45\x2a\x85\xb7\x66\x17\x47\xbf\x84\x44\x5d\x25\x4e\x6d\xec\xdc\x61\x59\xd4\x12\x9d\x4b\x6a\x90\xd1\xd3\x88\xca\x4a\xd1\xc0\xa8\xde\xec\xe6\xbd\x94\xb9\x4b\xfe\xdf\x1b\x30\x3c\xf0\x9b\x7a\xcb\xb3\x6f\xb2\x3f\x4d\xa3\xf4\x51\xd0\xf8\x73\xa6\xd6\xe6\x33\x34\xe3\x4d\xb8\x6f\x0f\x7e\x04\x39\xd0\x75\x12\x87\xef\x4e\x39\xa8\xa3\x2f\x81\xaf\x13\x22\x7f\x7f\xaf\x20\x8a\x7a\xcb\xc3\xec\xe6\x63\x2c\x15\xf0\xe0\xb8\x29\xa2\x3e\x0b\x81\xcf\x6e\xbf\xbf\x28\x7f\x6f\x40\xff\xa0\xd2\xda\x79\x9b\xbd\x59\x77\xeb\x8f\x3f\xbf\x4f\xf1\xed\xaf\xc0\xcd\xbb\x8f\xbf\x79\x75\xce\x16\xc0\x1b\x78\x7d\xfb\x8c\x51\xf5\xdb\x9f\x52\x1b\xe0\xe3\xcf\xb7\xef\x6f\x3f\x42\x0d\x48\x91\xd7\x79\xb1\xc9\x4f\x87\xea\x30\xba\xfd\x58\xc5\xdd\xc6\xaf\x78\x1d\xec\xfa\x78\xe0\xa2\x41\x28\xaf\x0b\x1d\x0f\x3b\x5d\x5b\xd5\x0f\x61\x77\x75\x68\xf7\xfb\x36\x44\x32\x1f\x7a\xb5\xe4\xae\x01\xe6\xda\x72\x63\xe6\xc0\x62\x77\x78\xc8\x4a\x84\xaa\x1e\x4f\x86\xf2\xd6\x31\x67\x5a\xa8\x22\xda\x9d\x7d\x7f\xc2\xa6\xfd\x1a\x7f\x08\xdc\x7e\xc1\x1f\x7a\x75\xb7\xe9\x6b\x26\x3a\xed\x5c\x77\x00\x44\x44\x1a\x47\xe1\x05\x43\x52\xb2\x39\x87\xf5\x10\x91\x04\x4d\x1b\x8b\x4d\x3b\x29\x9e\x82\x87\xbd\x6e\x7a\xa0\x63\xa5\x05\xaa\x2b\x06\x83\x8f\xe2\xe0\x76\x80\x26\x6f\x20\x72\x13\x12\xce\xe9\xcf\x2f\xf8\xa6\x15\x69\xfb\xea\xcd\x16\xfe\x09\xf8\x4c\xf3\xe0\x87\x9f\x9f\x09\xd4\xdd\xfd\xf4\xee\xfd\xab\xad\x30\xdc\x31\x03\xea\xf9\x58\x91\x86\x84\x52\x53\x53\xe9\xb2\x42\xb9\x2f\x85\xa8\x43\x7f\x34\x80\x74\x9c\xc4\xba\xf3\xa8\x7f\xc8\x18\x38\x14\x79\x53\x6c\x9d\xb6\xdc\xea\x78\x0c\x11\xed\x0f\xa0\x40\xfe\x21\x53\x8d\x69\xad\xc1\x93\x07\xa2\x6f\xcc\xb0\x03\x15\xac\x4e\x81\xb0\x20\x19\xbb\x32\x75\x1b\xdb\x0c\xc0\xe9\x81\xdd\xe0\x54\x77\xcf\xce\x73\xf4\xa2\xd3\xf7\x42\xaf\x0f\x4e\x01\xe0\x1a\xd0\x10\x62\x0f\xb8\xf7\x27\xbe\x8c\x6a\x72\xbd\x8f\x79\xd2\xb4\x3b\xce\x94\x9e\xf6\x50\x9d\x5a\x01\x8f\x73\xd8\x54\xab\x86\x1c\xbb\x21\xdb\xe2\xac\x73\xfa\x7c\xdf\x5d\xd1\xf7\x2b\xc0\xee\xf6\xed\x0d\xd1\x26\xc5\x22\xf2\xd4\x04\xc0\xc0\x31\xe6\x6e\x1c\xb7\xc5\xa7\x42\xaa\xa2\x2e\xf8\x35\xf9\xeb\x61\x3b\x44\x7e\x3a\x38\xb8\xfc\x7f\x57\x5c\x86\x7d\xf4\x2e\x78\xce\xe6\x84\x20\x51\x57\xce\xf2\x61\xc9\x7d\xe9\x2e\xe1\x7b\x3f\xbe\x5a\x7b\x6f\xb0\x05\xa4\x5c\x06\x23\x1c\xe7\xbc\x44\xd0\x57\x0f\x59\x0f\x2a\x13\xa7\xfd\x18\x27\x0e\xaa\xba\x11\xb6\x53\x40\xaa\x38\x02\x55\xe4\x7c\xdf\x57\xa5\x62\x81\xa8\xeb\xb2\xe9\x8b\xae\x0e\xde\x46\x1a\x8f\x46\x78\x11\x1a\x11\x84\xf1\xe1\x21\x1b\xfc\xea\x64\x80\xab\xa1\xdb\x81\x7c\x63\xa4\x12\x5a\x64\x20\xf5\x65\x3f\xf3\xed\x3a\x7b\x77\x65\xa9\xfe\x08\xd6\xfe\xeb\xed\x1d\x6c\xc1\x21\xc0\x62\x3e\x80\x31\xfa\x06\x70\x1b\x77\x5d\x18\x62\xab\x81\x6e\x62\x0b\xfa\x58\x5c\xb3\xd5\xac\x66\x17\x62\x1b\xf7\x01\x70\xe0\x4e\x61\x23\x22\x89\x47\x0b\x4a\x60\x03\x58\xf9\x73\xa9\x77\x29\xce\x5e\x8d\xcb\xdd\x79\xf5\x1e\xde\xdc\x15\xf0\xe5\x36\xbc\x36\x2e\xd7\xbf\x7f\xc6\xd6\x48\xb0\x47\x79\x53\x94\xd0\x50\xdf\x58\x57\xd5\xde\x94\x38\xe2\xa2\x14\x41\x04\x66\x64\x54\x1e\xec\x69\x24\x20\x17\x38\x60\x71\x25\xa7\xe5\x05\x4d\x33\x89\xcc\x15\x6d\x21\x3b\x58\x07\x43\x9a\x81\x37\x75\x24\xb1\x36\x40\x43\x0f\x4d\xe8\x70\x17\x12\xaf\x8f\xc2\x7d\x8a\x63\xfe\xc6\xf3\x72\xa8\xb9\x9a\xbc\x6f\xa7\x3d\xa0\x3c\x56\x71\x12\x4e\x0a\xa4\x15\x3d\x8d\xb0\x1f\x62\x26\x41\xdf\xce\xc7\xad\xa9\xb5\x30\x41\x35\xaa\x53\x4d\x0f\x64\x6c\x94\xc4\xa1\x62\xe0\xe0\xa3\x1f\x5d\x07\x8a\xec\x66\xd3\x9f\xfb\xe3\xbf\xc9\x7e\x3a\x7b\x09\xfe\x93\x84\xaf\x7d\xb3\x5d\x15\x67\x57\x5e\xc7\xed\xfb\x0f\x1f\x7f\x07\x9e\x44\x21\x5e\x9d\xad\xec\x1f\xf7\xdb\x67\x0a\xdf\x89\x1c\x53\x68\x57\x1b\xe4\xaa\xc2\x16\x5a\xb1\xbc\x07\x39\xcc\x73\x2e\x30\x46\x94\x14\x45\x6e\x72\x67\x4c\x6e\xc0\xde\xcf\x8d\xf7\x09\x8b\x37\x37\xe9\xdb\xb8\xb5\x46\xe2\xe8\x58\x8d\x86\x5d\xa5\x38\xe5\x50\x16\x64\xde\xff\xbf\xa4\xfd\x3d\x90\xe4\x38\x9f\x27\x06\x13\x64\x65\x16\x77\x6f\x6f\x97\x35\x35\x3d\x8d\xe7\xb9\xbb\x7d\x51\x5b\x33\xd3\x7c\xe2\xbd\x5b\x31\xb6\x9e\xee\x86\xee\x6b\xa1\x53\x9c\x04\x69\xa5\x13\x4e\x11\x92\xa0\xd0\x47\xe0\x64\xe8\x10\x0a\x49\x81\x90\x05\x13\x26\x4c\x98\x30\x69\xd2\xa4\x49\x93\x26\x4d\x9a\x34\xd3\x4c\x33\xcd\xdc\xa9\x24\x4a\x41\x30\xb3\x3e\x7a\x7a\xe6\x59\x49\xdd\xcd\xcc\xac\xac\x6a\x16\x93\x24\x80\xff\xc7\xef\x63\x57\xf8\x42\x01\x1d\xf8\xc4\x7a\xa0\x66\x72\xd2\x94\x66\x36\x34\xc3\x30\xcc\xbb\x88\xd1\xdb\x64\xed\x39\x9e\xdd\x9c\x51\xa1\x9f\x57\x77\x91\x0f\x68\xf3\xb3\x5a\xfd\xed\x6a\x9f\xfa\x26\xde\x5a\x07\xf5\x1a\x71\x5d\x23\x1a\xdc\xbc\xaf\x40\x07\xb4\xa3\xdc\xca\xb0\xc3\xd0\x42\xbc\xe3\xd8\x54\x7c\x5f\x56\x56\x60\x5b\xa4\x3e\x34\xc0\x05\x35\x39\x37\xc3\x7a\x0c\x02\xd4\x5b\x6d\x65\xe1\x75\xb5\xab\x69\xa7\xb5\xad\x9c\x2a\x84\xa6\x4a\x86\x9c\x33\xe6\x07\x4c\xdc\xe0\x82\x06\x78\x3e\x50\xd0\x86\x1d\xb0\xd1\x57\xff\x3a\x33\x4f\x32\x7a\x85\x5d\xea\x37\xbf\x4b\xfe\x32\x5e\x87\x95\x69\xf7\x6e\x59\xa6\x6f\x5f\xa9\x4f\x81\xd7\x66\x24\x7f\x0d\xd2\xec\xfe\x21\x52\x72\xbf\xa4\x2b\x5b\xa5\x8d\x0e\xb9\x53\x6a\xb7\x93\x12\x58\xb0\x83\x86\x4a\xc9\x28\x53\x84\x54\x4c\x95\xa8\x81\x18\xc3\xd3\xb0\x0c\x13\x17\x54\x34\x3d\xee\x82\xd9\x2e\xab\x0f\xeb\xed\x15\x09\x5d\x1f\x8a\x36\x14\x7d\x9f\x75\x81\x84\xd1\x6b\x23\x9d\xe7\x86\x50\x03\x10\xa0\x87\xae\xdf\x3f\x3a\xad\x5d\xe3\x7d\x93\x5c\x67\xec\x1c\x5f\xfc\x36\xf9\x21\xc6\x6d\x7f\x9d\xfc\xeb\xe4\x3f\x8f\x68\xc9\x87\x77\xdf\x46\x03\x8b\xfb\xeb\x67\x75\xda\xb3\x83\xc5\x85\x64\x9c\xdd\x7e\xfa\x7c\xff\x1d\x38\x33\xcf\xdf\xcc\x8a\x2b\xb1\x62\xb9\x82\xe0\x0a\x5b\xb8\xdb\x1f\x38\xa8\x94\x29\x2a\x44\x10\x42\x15\xa2\x04\x22\xee\xd3\x2a\x07\x94\x70\xe6\x68\xb0\xe2\x80\x51\x8d\x02\x01\x87\x50\x74\x99\x0d\x96\x49\x46\x10\xe7\x28\x58\xa7\x74\x4b\x5d\x6a\x6b\x23\xc3\x71\xab\x11\x37\x55\x40\x83\x3e\x02\x89\xca\x92\x97\x90\x20\xc4\x49\x59\x8a\x11\x24\x44\xb5\xde\x4a\x73\x48\x79\x68\x85\x90\x81\x58\xe7\x02\x3e\xeb\xf3\xb6\x9c\xef\x8d\xd6\x63\xed\x0c\xa0\xc9\x55\xa6\x9e\xc8\xb5\xf9\x43\xb5\xc6\x4f\xbf\x56\x6b\x5c\xbf\xf9\xf0\xb6\xd6\x98\x19\x30\x85\x03\x04\x55\x2e\x2c\x95\x85\xa2\x25\x2a\xac\xa4\xbd\xc9\x43\x4b\x40\x12\xfa\x14\x82\x29\x1c\x2f\x3f\x00\x15\x43\x65\xee\x0d\x9d\x5c\x11\x5a\x72\x0c\x7d\xa8\x24\xe7\x5c\xa6\x2a\x2a\x2e\xbc\x2e\x34\xb2\x41\x60\xcb\x45\xdb\x5f\x0a\x8d\xeb\xdb\xbc\x57\xc4\x8b\xf5\xed\xb7\x85\xc6\x25\xef\xca\xf0\x79\x2d\xff\x02\x03\xb1\x16\xe5\x7f\x86\x81\xf8\xf1\x4b\x0c\xc4\xa7\xcf\x37\x51\x80\xf0\x0d\x06\x22\x7b\xf7\xf0\x31\x7b\x96\x9b\xb8\x36\xa7\x09\x54\xfb\xbd\x03\x25\x63\x4f\x49\x59\xe2\x52\x53\x4a\xb5\x6c\x25\x59\xe2\x62\x4c\xa0\xf5\xb8\xf7\xfb\x7d\x18\x6b\xe3\x41\x53\x40\x57\xc2\xdc\x7b\x1f\x72\x46\x38\xa5\x9b\xbd\x09\xa2\xd6\x42\x84\xbd\x09\x7b\x2d\x18\x5b\xa1\x0f\x2d\x28\xc2\x10\xa1\x0f\x4c\x6a\xe1\xa5\x06\xb9\xae\xc5\xbc\x0f\x72\xc5\x3e\x4c\x04\x97\x94\x07\x53\xd7\x61\x57\xd7\xc1\x55\x54\x31\x72\x99\x5b\x5c\x9c\x27\xdf\x9f\x7b\x15\x09\x38\x5b\x6a\xac\x90\xfd\x08\xd3\xdf\x7c\xbe\xfb\xee\xfd\x33\x3e\xf5\x5c\xd1\x7c\x46\xd8\x4e\x40\x57\xbe\x84\x40\xba\xb2\x38\x9e\xd0\x01\x22\x97\x96\x38\x8c\xb0\x08\x63\x86\x43\x07\x7c\x90\x75\x50\xc0\x85\xd6\x5f\x94\x5c\x37\x3b\x89\x29\xb7\xb6\x74\x8e\xf3\xb6\xe5\xfc\x29\x99\xb5\x76\xe3\xe8\x34\xd0\x36\x18\x93\xe4\x99\xff\x19\x46\xe0\xec\xc9\xf0\x35\x8c\xc0\xaf\x99\x32\xfc\xcc\x93\xe1\x05\x21\x90\x35\x60\xf5\x01\x00\x1a\xd3\xd2\x14\x30\x34\x81\xa0\x69\x88\xe9\x9d\xea\xc7\x11\x88\xfd\xdc\xc5\xa7\xa2\x6c\xe7\x29\xad\xdd\x30\x50\x11\xc3\x45\x38\x0b\x90\x33\x66\x08\x7f\x85\x0a\xc0\xf8\x6b\xa8\x00\x2a\xc3\xf1\x35\x26\x80\x69\xa1\x64\x92\xe4\x89\x7a\xc2\xd7\x34\xa3\x91\x7f\x7e\xe9\x15\xad\x68\xe0\xe7\x9e\xed\xfa\x11\x3f\xdf\xbd\x7f\x41\x5f\x7f\xff\xfe\x2e\xb6\x70\xbf\xe8\x12\x6d\x5e\xa3\x81\x3b\x03\x61\x2a\xcb\x0a\xf8\x52\x31\x4f\x35\x7f\xf4\xdc\xb4\xa2\x16\x15\x97\x14\x30\x96\xca\x0a\xcd\x3d\xa6\x91\x61\xce\xe2\x04\x79\x7e\x15\x1a\x8e\x3c\xa2\x07\x0a\x3d\x24\x19\x25\xab\xb6\x18\xe2\x92\x2a\x59\x61\xc3\x34\x61\xc0\x56\xa5\xb2\xb4\xac\xaa\x3d\xe7\x3c\x1c\x38\xe7\x3b\xc6\x2b\xc9\x20\xe3\x95\x88\x39\xcd\x1f\xc5\xeb\xa7\xb6\xf8\x79\xdd\x5a\x3e\xe3\x85\xc9\x10\xab\x58\x3f\xc4\xc7\xd7\xac\xfa\xf3\x8a\xf6\xfe\x52\x36\xb8\xe4\x70\x17\x51\x8e\xac\x06\x3b\x17\xda\x34\x07\x83\x0b\x43\xa8\x0c\x63\x54\xa5\x44\x31\x4a\x25\x48\x90\x95\xa4\x0d\x02\x1a\x41\xdb\x43\x83\x80\xab\xe7\xc9\x83\xd2\x45\xfe\x56\x39\x4f\x5b\x3c\xe7\xa9\xb2\xcb\x03\xc6\x54\x12\x2c\xe3\xa3\x36\x96\x58\xc1\x8c\x23\x56\xec\x2b\x71\x6a\x85\xc8\x58\x18\x9b\x50\x46\xfe\x5f\x26\xce\x39\xfb\x0b\xa7\x8c\x9c\x11\xa9\x17\x67\xc8\xbb\x37\xc4\x85\x38\x66\xa2\xff\x63\xf4\x26\x8e\x1f\xe0\xe6\x1e\xac\xf2\x1a\xd9\xfa\xb4\x3d\xb2\x6e\x92\x25\xaa\xcb\xb2\x0b\xad\xdb\xd1\x7d\xe3\xdc\x24\x26\x17\x7a\x5f\x40\x55\x22\xdd\xb4\x25\x68\x00\x9d\x7b\x97\x09\x17\x96\x91\xb1\xdb\xad\x8f\x5b\x65\x11\x3c\x48\x59\x0a\x6a\x7b\xee\xf4\x3e\x0c\x00\xf5\xc6\xc8\xce\x52\x8c\xb9\xd8\x17\xb9\xfb\x5b\x27\x33\x72\xea\xd3\x6e\x19\xf1\xcd\xcb\xe7\xf0\x51\x1b\xf9\x2f\x92\x1f\x5f\x7d\x8e\x3f\x5b\x0e\x71\xc5\x5b\x5e\xbc\xc7\x3f\xde\x7d\xfa\x7c\xfd\x01\x65\x77\x3f\x7e\xb8\x8f\x8a\x28\xe0\xad\xa7\x76\x74\x22\x5f\xe1\x0f\xdb\x81\xd6\x3d\x01\xc7\x83\x6a\x29\xa3\xb3\xa3\x44\x78\xd9\x03\x54\xa2\x5d\x09\x84\x03\xb4\x42\x4d\x41\x00\x0f\x4d\xaa\x39\xaf\x30\xa2\xa8\x2c\xe6\xc6\x2f\xeb\x31\xb5\x4d\xb3\xd5\x06\x41\x63\x3d\xf5\x25\xee\x47\x52\x69\x6d\x2d\x26\x85\x0b\x45\x45\x50\x18\x54\x68\x66\xcd\x78\x6e\x73\x54\x82\x69\xe6\x59\x15\x25\x44\x97\xf9\x9a\x9e\x63\x3c\x92\xfc\x27\xc9\xdf\xc4\xf9\xfa\xfd\x05\xe6\xf0\xe2\xc9\xbc\x4c\xd4\xdb\x37\x64\xef\x8f\xbf\xbf\xa4\x0b\x6f\x59\x0d\xd7\x1f\x3e\xad\xc3\xea\xf6\xe1\xd3\xe7\xfb\x68\x6b\x71\xe5\x7c\x05\xea\xb2\x02\x45\xc0\x45\xc1\x2b\x2b\x0c\x11\xd4\x6b\xc7\x60\x01\xa5\xc4\xbc\x94\x0c\xa2\xbc\x0b\x7b\x0a\xf0\x58\xe4\xf5\xc4\x77\x5d\x01\x75\x2b\x46\x7d\xc0\x7c\x9f\x03\x81\x51\xe8\x68\xde\x95\xf9\x1e\xd8\x02\x1d\xb7\xa6\xe2\x9a\x92\x80\x11\x5c\xe6\x6d\xc9\x58\xe8\xbd\xeb\x01\xcb\x0b\x6d\x9b\xa6\xa8\xa1\xe0\x65\x39\x28\xab\x47\x96\x37\xca\x8a\x1a\x21\x4d\x0d\xf3\x40\x96\xa6\xef\x08\xe1\xc1\x73\x21\x78\x97\x6c\xb3\x2e\xde\x97\xe2\x1c\x5b\xa1\xaf\xa2\xed\xcf\x8c\xa6\x08\xac\xdf\x5e\x7f\xf8\xfc\xf1\x3e\xfb\xda\x64\xb8\x72\x0c\xae\x50\x06\x4f\xfb\xd4\xcc\x4d\xca\x67\x03\x22\x94\xc8\x7b\x3f\x1b\xd0\x3a\x5b\x0c\x07\xd8\x38\x98\xd6\xbe\xae\xa9\xa4\x04\x31\x0e\x67\x71\xe0\xd8\x56\x7c\x2b\xe6\xd6\x72\x2b\xe6\x43\xa0\xba\xd7\xd6\xc1\x15\x5b\x1f\x38\x63\x6e\xaf\x79\x84\xdd\x23\x69\x98\x91\xc9\x75\xa6\x62\x2c\x45\x5f\xf1\xb0\x7e\x1f\xeb\xb4\x3f\x63\x8f\xad\xbd\xbd\xd7\xad\x82\xfb\x67\xf7\x8b\x73\x73\x2d\x56\xe1\x9b\xac\x3d\x31\x6f\x0c\xc8\xb5\xd5\xa7\xf6\x0a\x3d\xee\x58\x66\x43\x8b\xa8\x12\x52\x29\xe1\x55\xf0\x3a\xaf\x98\x91\x65\x57\x53\x4a\x49\xa7\x76\x51\x02\x78\x4b\x03\xd5\xc3\xf2\x27\x70\x27\x82\x90\x82\x08\x25\xb0\x20\xa6\x05\x35\xc5\x61\x57\x55\x9a\x13\x06\x10\x82\xb6\x12\x36\xd6\x97\xaf\x63\x3c\xe4\xde\x1c\xff\xaf\xf2\xc8\x2e\x15\x9b\xb7\x73\xc4\x15\x4c\xbb\x99\xae\x9e\x89\xc9\x79\x28\xcc\x7a\x39\xe3\xa6\xeb\x1a\xd0\x79\xd0\x86\xc6\x4d\x74\xaa\xbd\x1b\xe5\xe4\x43\xbd\xa5\x81\xd8\x36\xa8\xe5\x27\x4c\xa0\xa6\x0d\x4c\x4a\x37\x09\xaf\x0f\x81\x82\xf6\x60\x8d\xd9\x27\x49\x92\x67\x4d\xf4\x27\xc7\xc9\x3f\x78\xe5\x30\xb5\x9e\xe1\x73\x3a\xfa\x57\x1f\xcf\x70\xf1\x08\x18\x59\x29\xcc\xe0\xe6\xfe\xe6\xdb\xdb\x77\x0f\x1f\x37\x1f\xef\xdf\xdd\xde\xbf\x7b\xf8\xe1\xdc\x9f\x5c\x2e\xc7\xb5\x0e\x3d\x20\xa1\x37\x1c\xe6\x0e\xea\x30\xd1\x5a\x84\x3d\x80\x61\x9f\x26\x6c\xd7\xcc\x3b\xe7\xac\x05\xba\x99\xf9\xf2\xb8\xc5\x81\xe8\x53\xbf\xcb\x89\x20\x1d\x61\x7c\xcc\xb0\x06\xfd\xdf\xb6\x9b\xf1\x27\xc3\x36\xe3\x4a\xe6\x8f\xa7\x3d\xb4\xc3\xb0\xe4\x38\xd7\x71\x6e\x6a\xb6\xe6\xbc\xd2\xff\xcb\xe4\x5f\x25\xff\x43\xf2\x3f\xaf\xb3\xec\xc3\x4a\xbd\x58\x43\xae\x8b\x95\xf3\xc7\xbb\x25\x69\xf8\x74\xc9\x1d\x36\xcf\x44\xfd\x0b\xea\xe0\xaf\xe3\xc4\xf6\xe9\x73\x5c\x58\xde\x7e\x2b\xc2\x79\xb7\x7f\x06\x3e\x7f\xd8\x10\x03\x73\x23\x40\x1b\x7c\xbd\xe7\x53\x6d\x9b\x89\x81\xc4\x06\x07\x3a\x86\x21\x62\x8c\xb1\x34\xaf\xa0\x2c\xa4\x46\x9c\x11\x0a\x39\xd1\x84\xd1\x52\x51\x42\x2b\x54\xcc\xf6\x8b\xef\x61\x5e\x42\x54\x2c\xdf\xe5\x68\x6b\x90\x86\xa7\xb1\xb6\x47\xe5\x2d\x48\x02\x05\xfd\xd1\x99\x66\xb4\x75\x56\xb1\xc0\xf6\x73\xbf\x13\xb6\x41\x02\x23\x51\xef\x61\xa1\x3a\x80\xcb\xb0\xf3\x85\x2f\x0f\xb5\x87\x90\x55\x3f\xfb\xe6\xa1\xc9\x73\xca\x96\x6f\x57\x6c\x59\x5f\x2f\xf3\xf9\x0b\x4e\xe1\x35\x73\xf6\xe1\x99\x77\x76\xff\x8b\xde\xb9\x0f\xbf\xaa\x5f\xf3\x2c\x0a\x6b\xfd\x2e\x9a\xa8\xfa\x9d\x0f\x47\x90\xef\x96\x40\xc1\x76\x1d\xb0\xcb\xed\x6a\xbb\x2e\x24\x16\xed\x2a\x57\x42\xc0\x42\xbf\xb6\x55\x63\x53\xf8\xe8\x09\xab\x41\xbd\xde\x29\xcb\xf6\x0b\x4a\xd0\xfb\x52\xf0\x8a\x50\xa3\xb5\x32\xca\x92\x94\x31\xdb\x37\x5a\xef\x95\x3a\xa8\x24\xcb\x5c\xf4\x73\xd4\xb1\x9b\xb3\xe6\xf0\x4b\x98\xf0\x43\xc4\x64\x9f\x11\x40\x3f\xc7\x64\x5f\x2e\x78\x84\x3a\x5c\xa0\x6d\x4b\x76\xbf\x1d\x65\x13\x1c\xe7\x06\xe4\x82\xfb\x70\x0c\xe3\x61\xa8\xb0\x71\xc2\xa2\x52\x08\x66\x71\x05\x09\xc1\x4d\x57\xf5\x6d\xdd\xa0\x5a\x29\xcb\x52\x74\xd0\xc6\x48\x1b\x98\xd5\x46\xdb\xad\xd6\x94\xc1\x5e\x23\xe3\x70\xe0\x87\xb2\x62\x8c\x8d\x07\xc6\x19\x2a\xe6\x9d\x64\xd0\x23\x0a\x76\x25\xb4\x6e\x2c\x0b\x67\x26\x58\x18\xf6\xe8\xdb\xbd\x98\xc6\x8a\x86\xbd\x97\x6d\x92\x66\x63\xe4\x01\xff\x42\xdf\xfd\xf6\xcb\xbe\x7b\x09\xf0\x8a\x05\x36\x27\x0d\x54\x18\xf2\xcb\xd7\xfe\x84\x81\x0f\xc3\xa5\xf1\xbe\x73\x0e\xa0\xd3\x1e\xa0\xb0\x7b\x6e\xbc\xa7\x59\x73\xee\xbb\x17\x51\x6d\x7e\xd9\x6d\xba\xca\xbb\xc5\x4e\xec\x32\xfe\x37\x23\xf0\xb3\x28\x6a\x65\x41\x52\x83\x7e\xc6\x31\x44\x47\xd3\xec\x02\xdf\xeb\x1d\x18\xc1\x94\x56\xbd\x9f\x29\x60\x49\x9a\xfa\xb3\xd6\xc0\xab\xfd\x6d\x3e\x7c\xba\xbd\x79\xb5\x3f\x01\x0e\xa7\xb1\x08\x47\x35\x15\x80\xd4\x69\x75\x8a\x0e\x31\xeb\x1e\xc5\xde\xf4\x40\xa6\xec\x79\x8f\x49\x92\xa6\xd5\x57\x8f\xf1\xcd\x3e\xf3\x14\x9f\x44\x71\x50\x43\x01\x44\x9d\xda\x53\x91\x25\x73\x72\xde\xe5\xc1\x0c\xc0\xa6\xd5\xab\x5d\x26\x69\xc4\xdb\xaa\x58\x17\x2b\x63\xb5\x33\xd6\x5d\x6f\x5e\x69\x80\xde\xde\xad\x90\xc0\xe4\xf6\xee\xc3\x37\xb7\x9f\x3e\x83\xbb\x9b\xcd\xf6\x6a\xe7\x8f\x3d\x39\x84\x23\x38\xe6\xca\x50\x06\x39\xab\x20\x0c\x8d\x1f\x83\x96\xc0\xb5\xa1\x65\x1c\xed\x86\x28\xfd\x78\x28\xb7\x3a\xec\x21\xb4\xa8\x08\x64\x3e\x1e\x0a\x5f\x50\x60\x4f\x5d\x96\x07\x79\x34\xa0\x00\x44\x02\x0c\x60\x5e\xcc\x3d\x68\xf3\x5d\x72\x15\xeb\xaf\x68\x8b\x7e\xee\xab\x79\xbb\xe2\x2d\xe2\xdf\x6b\x54\xcf\x79\x5d\x5f\x20\xba\x11\xa6\x8b\xfe\xb6\x6c\xdb\xed\x14\x10\xa0\xa7\x5d\xdc\x96\xe0\x0d\x1c\xcf\x1a\x80\x7f\x11\xa3\x9f\xdf\x82\xdb\xeb\x3f\x06\x59\x5c\x24\xa3\xad\x52\x0c\x6e\x6e\xae\x6f\x0a\xf0\x21\xf9\x0d\xf8\x7e\xab\xcc\x80\x9a\x46\xb5\x6d\x29\xa4\x60\x42\x1b\x66\x21\x32\x35\x19\xc2\xd1\x82\x04\xec\xb7\xda\x96\x73\x3f\x8b\xb0\xb3\xa0\x4c\xbb\xd4\xc1\xfc\xa7\x1e\x96\x13\x3e\x84\x1d\x11\x02\x57\x64\xe3\x8a\xd0\xcc\x79\x40\x1c\x0c\xe9\x08\x86\x72\xed\x11\xdb\x27\x7a\xcd\x22\xae\xf6\xdb\xe4\xb7\xf1\x9e\x7e\xf9\x5c\xab\x3f\xda\x4d\x91\x7d\x00\x37\xdf\xfe\x33\x70\x03\x3e\xfd\x06\xdc\x5f\xb3\xfa\xa4\xeb\x3a\xb3\x23\x63\xc3\x5e\xa6\x5d\x55\x9f\x74\xd7\x6d\xf1\xdf\x16\xde\x6f\x0f\x3f\x61\xc0\x29\xcb\x68\xb0\x81\x86\x03\xcb\x0e\xa7\x5d\x99\xd1\x13\x39\x02\x06\x74\xf4\xeb\xc3\x57\xcb\xe7\x7e\xab\x09\xff\x5f\x26\x49\xd4\x42\xb8\x79\x71\x03\x58\x6e\x9f\x25\xda\xb9\x3b\x8b\xc0\x5e\x20\x91\x9b\x15\x3c\x78\xff\x65\xbe\xf8\xfc\x1c\x23\x48\x0b\x72\xb4\xcc\x5d\x66\xc9\xe3\x96\x68\x56\x2c\x29\x1d\xb0\x61\x09\x46\x85\x71\x86\x9b\x61\x08\x43\x35\xd5\xd6\xeb\x7e\x5a\xf2\xc4\x71\x1e\xd7\xa7\xf6\x70\x00\xe6\x18\x08\xd5\xd2\x30\xd0\x57\x15\x90\x62\xa7\x77\x9c\xef\xf4\x4e\x04\x2f\xac\x13\x15\x36\x84\x4a\x6a\x4b\x52\x95\xdd\x55\x7e\x61\x50\xcd\x83\x31\x26\x94\x0a\x95\x5c\x24\x59\xd2\x3c\x8d\x57\x24\xd6\x94\x63\x85\xf7\xf6\xe1\xe6\xd3\xed\xb9\x52\xff\xee\xac\xd7\xb8\xae\x8b\xcb\xd7\xaf\x79\xe1\x8d\xef\xe4\x11\x40\xb7\x4c\x0e\xb5\xe6\x42\x38\xee\x78\x2a\xe7\x24\x2b\x2c\xe5\x8a\x07\xce\xb0\xae\xd8\x16\x3e\xba\x01\x40\x9b\xca\xd9\x5b\xea\xbd\x31\x2a\xc0\x14\xed\x5a\x15\x06\xb7\xa5\xd5\xa1\x21\x43\xd3\x0c\xb8\xef\x92\xb3\x8f\x20\xbb\x42\xe7\x75\x67\x5d\xaf\x93\xdb\x57\x46\x65\x17\xe7\xca\x28\x94\xf5\x45\xe3\xd2\x36\x7e\xe7\xba\x6e\x7f\x22\x63\x03\xc8\x6e\x07\x0e\x3e\x54\x75\x84\xa4\x2c\xdb\xc6\x1e\x0e\x87\x83\x7b\x4a\x9c\x3b\x33\x3e\xf6\x27\xa5\x75\xe6\x42\x3b\xcc\xc7\x3e\x49\xd3\xc3\x13\x8b\xb5\xee\x3f\x4d\xbe\xb9\xf4\xc5\x8b\x2c\x4e\x14\x3f\x7e\xc8\xe2\xcc\xc3\x4a\x60\x4e\xfb\xd1\x34\x39\x70\x25\x31\xa9\x9a\xdd\x56\xbb\x76\x46\x21\x0f\x07\x7d\x00\x36\x3d\x3a\x73\x6a\x40\x1b\xfd\x29\x0f\x4f\xf4\x3a\x4f\x77\xe7\xf1\x98\x7c\x79\xbc\xd7\x79\xfd\x58\xd6\xf5\xd5\xf4\x58\x2e\x5b\xba\x3b\x49\x6b\x33\x1f\xba\x78\x38\xc9\x26\xf5\x4f\xd5\x75\xb7\xad\x9e\x75\xf6\xfe\x6a\xd5\x25\x3c\xfb\xb9\x6e\xae\xbf\xff\xe1\x9c\x6b\xbc\x72\x73\x7d\xce\xda\x3f\xfd\x0b\xf0\x3b\xb0\x2c\xb1\x19\xba\x12\xa1\x00\x5d\x20\x90\xec\x40\xc3\x82\x7a\x4a\x9a\xd0\x31\x50\xda\x5a\x48\xe1\x2b\x18\x96\x20\x05\x8d\x91\x60\x51\x03\x38\x53\x90\xe7\xeb\xcb\x6d\xe5\xda\xd3\xb1\xd3\x8a\xd6\xd4\xf6\xc4\x63\x1b\x15\x59\xb9\xcd\xf2\x36\x14\x5d\xd7\x85\xbc\x2c\xa5\x64\xcb\xc5\x4b\x33\xf1\xc4\x22\x7e\x7f\x3d\x7f\xcb\x34\xfb\x52\xac\x8a\x64\xa7\x04\x88\x99\xe4\x9d\xa9\x81\x40\xc4\x93\x30\x2c\x89\xf3\x06\xcf\x28\x14\x61\xaf\x40\x02\xfa\xb4\x73\xa6\xf2\x73\x0e\xba\xd8\x7b\xa3\xd9\x70\xd6\x99\x5c\xe2\xcb\x95\x77\x76\x73\xf7\x6e\xd9\xef\x32\xa7\x81\x02\x94\x08\x3b\x8c\x40\x32\xef\xf2\x51\xb5\x11\x6d\x9c\xd6\x69\xe3\x74\xe5\x9a\xb9\xaa\x02\x0a\x3b\x09\x8a\x94\xc6\x4b\x12\x31\xc1\xec\x9a\x9d\xf1\x0f\xf1\x18\x63\xef\xf1\xf6\xe6\xf9\x20\x37\x0e\xf4\x27\x99\x2b\x6b\xc6\x02\x4c\x25\xf1\x34\xb0\x65\x92\x8c\x87\x39\x85\xce\xeb\x1d\xf0\xe9\xd1\x69\xec\xe7\x62\xd9\x6b\x9a\x4e\x4f\xee\xda\xc6\xf9\xe9\x1f\x9c\xd7\x97\x77\x77\x37\xe0\x7d\x7a\x36\xcc\x7b\x21\x0e\x5e\x9b\xc7\xe3\x55\xf1\xc8\x32\x51\x73\xd5\x7a\xed\x7c\x3d\xe9\xa3\xeb\x47\xdd\x37\x7c\x8b\xfd\x4f\xd6\x6f\x9b\x30\xa2\xb0\x9f\x86\x49\x0f\xfd\x53\xd2\xc8\xe1\x38\x0d\xbc\x6d\xdb\x04\xa4\x3e\x7a\xfb\xaf\xfd\xb5\x57\xab\xf8\xcd\x33\xce\x77\xdd\xd2\x1e\x1c\x9a\x88\x15\xdb\x05\xb4\x9c\xe1\x66\xde\xa7\x30\xca\xfd\x3d\xf7\x7d\x0e\x3e\x0c\x3e\x14\xe0\xe0\x97\xd5\xbe\x58\x35\xd8\x87\x88\x65\xd0\xaf\xf4\x43\x5e\xdc\x54\x6e\x1e\x6e\xc0\x0b\x62\x2e\x3e\x5f\x53\x7f\x6a\x3d\x38\xfa\x90\x47\x59\x84\xe3\x19\xaa\x17\x5f\x6d\xf2\x9f\x88\xf7\x9b\x1e\xa8\xe0\xe6\x2e\x4a\xba\x75\x8f\x11\xbd\x06\xfa\x24\xc9\x52\xf6\x44\x22\x27\xee\x9b\xf3\x0a\xba\x4c\xde\xef\xee\x62\xb7\x3c\x8d\x20\xf3\x9b\xec\xfe\xe3\x5d\xba\x79\xd5\x81\x8b\xe2\x71\x5b\x49\x76\xe1\xc0\x79\x90\x85\x71\xd2\x4a\x41\xaf\xf2\x32\xf4\x53\x84\xcd\x1f\x0e\xc1\x31\x20\x62\x45\x0d\xcf\xb5\xd9\xe2\x80\xb8\x65\x1c\x98\xb0\x3f\x32\xcd\x27\xc0\x4e\xcc\x05\x79\x30\xa8\x26\x75\x6c\x44\x0d\xba\x3d\x1c\xe3\xbd\xbb\xe6\x08\xbf\x59\x39\x82\x37\xdf\xde\xae\x29\xfe\xed\x75\x9a\xbd\xed\x27\x7d\x9b\xa5\xd1\xc5\x7c\xa3\x3c\xd1\x52\x39\x2f\x47\xdd\x18\xcc\x05\x43\x5c\x14\x41\x00\xa9\x79\x2d\x0f\x6c\xdc\x9a\xc0\xe1\x53\xe2\xf6\xf6\xe8\x43\xd4\x5d\xca\x81\x9f\x95\xe6\xb0\x46\xe2\x0a\x6b\x17\x5c\xd8\x1f\x34\xb0\x20\xf2\x96\x40\x8a\x23\x7f\x5f\x27\xef\xd6\xfe\xe9\xbb\x25\x42\x5e\x2e\x6c\x9a\x2d\x0b\xec\xc3\xcd\xdd\xa6\xaf\x41\x79\xe2\xe9\xae\x9e\x5b\x3c\x59\x90\xd7\x60\xb7\x15\x01\xf9\x9d\x38\xb5\x69\x17\xe8\x32\x8a\x78\x9a\x64\x2a\xe4\x09\x48\xd9\x93\x89\x1a\x94\x7f\x76\xd9\xdf\x39\xe6\x5b\xf6\x94\x37\xf1\x5a\xec\x7f\xea\x40\xde\x80\x7c\xcb\xe6\xa1\x39\xb5\x75\x7d\xd5\x3c\xf2\x95\xb7\xb6\x6a\x7d\x66\xc9\x1f\x25\x7f\x96\x7c\x77\x76\xed\x8a\xa7\xe3\x87\xf7\x69\xf6\xe1\x13\x78\x1f\x61\x8a\x57\x63\x5d\x83\xba\x33\xb5\x6e\xe7\xc1\x72\xef\x7d\x66\x55\x10\x73\xc2\x40\x9b\x26\x5b\xfd\x58\x67\x32\x1c\xc3\x40\x00\x01\x09\xaa\x42\x17\x8e\xec\x18\x6a\x3b\xb7\xad\xd3\x40\xc4\x31\x59\x3f\xb1\x6b\xb3\xcd\x13\xb8\x76\x36\xd7\x00\xed\x75\x20\x15\xdb\xc6\x51\xca\x25\xad\xaf\x76\xf3\x90\x16\x39\xc7\xbb\x7a\x57\x1c\x3c\xa7\xe5\x09\x3b\x40\xe7\x43\xda\x00\x51\xe4\xc1\x6e\x73\x17\xda\x93\xee\x1d\x32\x85\x06\x65\x56\xcc\x3a\x53\x27\x37\x4c\xf1\x77\xb1\xc8\x93\x32\xc9\xb7\xcf\x5a\xe5\xaf\x65\xdb\x63\x8f\xf7\xbb\xf7\x31\x07\x3c\xdf\x7b\x17\x47\xa8\xab\xd2\x17\x28\xf5\xd0\x5a\x2e\x90\x64\x94\x16\xf3\xe4\x6a\x0d\x12\x64\x5a\x90\x57\xa7\xf6\x0a\x95\xa1\x1d\x00\x61\xc1\xed\x8e\x66\xc7\x00\x1d\x5b\xb1\x35\x88\xd1\x20\xc7\xdc\xe7\x6a\x08\xbb\xc6\x00\x38\xe3\x83\x6e\x0f\x2e\xa8\xa3\x84\x35\xb6\xaa\xc2\x9e\x0a\x3f\x25\x69\x56\x9c\x6b\x4e\xb7\x2b\x96\xe8\x67\x87\xf6\xcd\xed\x99\x76\xfc\x66\x58\x7c\xb8\xaa\x3d\x4a\x31\x54\x9a\x72\x24\x08\xc6\x79\xc0\xd2\xa9\x1e\x0b\x3f\x55\x33\xcd\x34\x0a\x93\x07\x90\x85\xb1\x3f\x84\x23\x03\xb0\x73\x7c\x6b\x90\x5f\x8f\x4a\xf7\xe1\xd0\x19\x50\xcc\x6c\xa8\x9b\xe3\x32\x36\x24\x6a\xb0\x73\xd4\x53\x51\x4f\x2b\xe6\x8d\x9d\xc7\xc6\x1f\x27\x7f\xba\xc6\x82\x17\x65\xcb\x6f\x6e\x57\xe1\xfb\x77\xaf\x4d\x01\x6f\x7e\xff\xf9\x2e\x73\xbe\x2c\x33\x72\x52\x4c\x9a\x89\x64\xe2\x54\xf7\xd9\x11\x22\x54\x90\xc2\x40\xc5\x95\x2a\x4e\xed\xd6\x60\xc9\xbd\xd5\x02\xe4\x4f\x89\xf3\xe1\xd8\x0f\xbd\xf7\xe5\x53\x52\x4f\x80\xda\xe6\x1c\x63\xaf\xf8\x61\xf4\xba\x33\x7f\xee\x33\x7f\x73\x1b\xb1\x81\xdf\xdc\xbe\x4f\xb3\xd8\x9f\x9f\x00\x82\xb1\xe5\x3c\xce\x50\x87\xda\x02\x2e\xc3\x31\x6b\x5a\x55\xb3\x30\x85\xba\x6c\xeb\xda\x75\x20\x1f\x29\xdd\x10\x5f\xe7\xb5\xf3\xa7\x71\x1e\x65\x8a\xd3\x7e\x26\x61\x1f\x3a\x3a\x49\xe2\x80\x4c\x1d\x9e\xfb\x50\x63\xe2\xcc\x3a\x2e\x0f\x67\x8f\xa4\xbb\x2f\x71\x07\x2f\x14\x98\x6f\x62\xb8\x7f\x77\xfb\x90\x5d\x0b\xad\xb9\x2e\x6b\xce\x43\x0b\x61\xef\x95\x71\xcc\x9a\x23\x0c\xcb\x54\x59\xb8\x7c\x43\x7e\x1a\x84\x80\x1e\xb2\x2b\x33\xb9\x76\x67\xc7\x7a\x6a\x14\x80\x69\xfe\x93\xdf\x44\x17\x88\xe8\x45\x98\x3c\xd1\x6b\xb2\x85\x3f\x8f\x1d\xce\x51\x3c\xa9\xe7\xa4\xae\x2f\x7a\xc1\x5b\xf8\xb7\x95\xf7\xdb\x71\xae\x52\xfc\xd3\x31\x8d\x38\xfe\x34\xc3\x4f\xe2\xba\xd9\x8c\xd1\x3b\x32\xf9\x21\xfe\xc7\x6f\xbf\x7b\x40\x67\x81\x3c\xf4\xe3\xb2\xb3\x0c\x67\xe3\x69\x54\x03\x90\x06\xfa\x52\xb2\x40\x43\xef\xeb\x25\xa1\xca\x37\xc3\xc9\xce\x7b\x54\xf2\x3e\x4a\xd8\xb1\x8c\xa4\xf4\x8c\x09\x20\x51\x87\xe3\x37\x6b\x7e\x79\xbe\x2e\xf7\x6b\x77\xf5\x87\x65\x5a\xf8\xfc\xc3\x37\xb7\xbf\x03\xe9\xf5\xe6\x9b\xdb\x54\x00\x47\xaa\xa6\xc2\xe9\x71\x10\xc3\x7e\x92\x6d\xd8\x87\x43\x20\x1c\x34\x87\xc0\x25\x0f\x75\x5a\x70\x01\x78\x4f\xaf\xc6\x61\x28\xc6\xd6\x87\xe4\x29\x71\x75\x5d\x77\x61\x2f\x6b\x39\x1d\x00\x04\x45\xd8\x0d\x3d\x48\xa2\xf7\x1b\x48\xf9\x93\x8a\xf7\xc5\x3f\x4e\x12\x50\xa4\xcf\x4e\x64\x9b\x9b\xfb\x9b\xeb\x9b\x8b\x13\x59\xba\xbd\x43\x1f\xfe\x12\x7c\xbc\xb9\xfe\xf0\xf9\xe6\xe1\x66\xd9\xae\x91\x32\x25\x87\xac\xac\x70\x18\xeb\x3d\x01\x05\x10\xac\x84\x75\xe9\x43\x15\xfa\x82\x31\x4b\x86\x7a\x5f\x6f\xd0\xcc\xc3\xae\xa8\xf3\x11\x68\x31\xe7\xe9\xc0\x4e\xbb\x12\x96\x70\x4f\xc3\x51\xe5\x39\x63\x19\x2c\x1d\x49\x8b\x80\x68\x8a\x42\x71\xf1\x57\x5c\xe6\xb0\x2a\xc9\x92\xf7\xeb\x1c\xb6\xaa\x45\x67\x6f\xac\xd2\x32\x9a\xd5\x27\x61\x43\x77\x75\x3c\x1d\x58\xba\xd7\x75\xd3\x57\xbb\x86\xe1\xd3\x71\x5b\xf9\x80\xbc\x0f\xed\x3c\xec\x0a\x5f\x38\xc0\xd7\x7b\x4f\x3d\xe9\xd8\x43\xfb\xb3\x0b\x32\xf6\xe6\xac\x44\xfa\xe3\x87\xab\x41\xe0\xb4\x3a\xd1\x4c\x3c\x1e\xba\x94\x60\xb6\x35\xcd\x50\x3f\x36\xf5\xd5\xb1\x6e\x7c\x02\x52\x17\x79\x1c\x3a\xe2\x65\xe2\x25\xfa\x36\x4d\x62\x42\xfa\x72\xdf\x26\x57\xc2\xa3\x2a\xed\x8f\xa1\x0c\x0d\xcd\xf2\x7e\x6e\x09\xde\xf5\xba\x1d\x28\xd7\x80\x6c\x35\xf2\xd6\xd3\x59\xcd\x47\xd3\x80\x3c\x6b\x6b\x69\x1b\xd3\x1a\x2d\x14\x30\xf1\xf8\xaa\xf3\x3a\xf1\xcd\x4b\x4c\x12\xf1\x28\xeb\x20\x4d\x3b\x30\xf8\xb4\x9a\x8f\x0a\x1c\x55\x10\xb5\x09\x50\xa4\xa4\x08\xf8\xca\x81\x7d\x80\x7e\x96\x41\x7b\x20\xd3\x6a\x1e\x97\x01\xdb\xa6\x7a\xc5\xd8\x92\x6b\xfc\x73\xbf\xc8\xec\xe2\x17\x59\x7b\x7f\x72\xf5\xc1\x8c\xa0\xbb\xd8\x45\x9e\xd0\xbc\x0f\x9d\x00\x18\x0c\x99\x8e\x76\x91\x31\xd6\x5b\x8e\x0d\x26\x45\x5c\xbf\xee\x52\xf0\xcd\xe6\xfa\x7b\x10\xf1\x20\x49\x76\xff\xf0\x5b\xf0\x3e\xb9\x4d\xeb\x2b\x4f\x42\x7d\x00\x88\x85\xf1\x29\x39\x06\xad\x80\x3f\x84\x7d\xcb\x8f\xf2\x58\x81\x82\x6c\xe1\x2c\x02\x0a\x87\xa6\x6e\x40\x19\x0e\xbd\x6f\x41\x01\x4c\x2a\x43\xbb\xe4\x69\x06\xac\x73\x64\x62\x62\x1d\x69\x9d\x23\xef\xde\xa8\xff\xbe\x5f\xe7\xc8\x15\xd1\xb6\x42\x02\x6f\x8a\xdb\x3b\xd0\xba\x22\xdf\x94\x3f\x19\x65\x44\xdf\x5c\xed\x1f\xe1\x7e\xd3\x17\x05\x44\xd0\x42\xce\xb8\xc8\x7f\x9a\xb6\x06\x41\xa8\x2d\x93\x9a\x29\x1a\x68\x18\x0e\x87\x5d\x39\x9a\x23\x30\x20\x8f\x4b\x67\x02\x12\x91\xa8\x8c\x45\x1f\xaf\x9f\xdd\x1f\x60\xa4\x08\xc0\x90\x83\x69\x76\x02\x10\x84\xb7\xbc\xee\xfc\xa9\xf6\xd9\xd1\xd7\x36\xd9\x26\x43\xea\xa2\xd6\xeb\x3f\x3e\x57\xbf\x56\x7e\xfa\xbb\x4f\xb7\xeb\x78\xfe\x99\x3c\xd3\xcd\xb7\xdb\xff\x3f\xf8\x70\xe9\xd1\x2c\x57\x7b\xb3\xaa\x61\x7c\x29\x17\xf6\xf0\xf1\xfe\xaa\xf2\xcc\xc1\x12\x1c\xeb\x42\xd9\x5e\xb6\x4e\xf7\xbc\x95\x82\x22\xc4\x38\x53\x50\x91\xd9\x1b\xa0\x5c\x4a\x99\xe2\x45\x38\x04\x65\xf8\x32\x19\xe4\xb4\x32\x25\x1d\x97\x30\x5e\x35\xcd\x86\xd5\x1d\x80\x48\x70\x73\x30\x9c\x1a\xa6\x14\x32\x88\x71\x59\x22\x1e\x7a\xc6\x4c\x51\x01\x3d\xb7\x69\xbf\xc4\xb4\xc2\x08\xd9\x02\x46\x0d\x15\x1c\x33\xce\x04\x0b\x32\x8c\x42\x26\x7f\x92\xf0\x27\x7a\xe5\x5e\x69\x6c\x5e\x6a\x9a\xcf\x5e\x6f\xb7\x67\x45\xbc\x9b\xf3\x06\xbe\xf8\x3a\x7a\xc1\xff\x1d\x5d\xee\xa2\x89\x83\xf3\xf1\x0f\x10\xb1\x9a\xd9\xc6\x3f\xa1\x70\x79\x31\x14\x85\x45\x10\xc8\x50\x47\xaa\xcb\xb2\xa9\xd3\xd1\xa3\x92\xd5\xc0\xad\x8c\x92\x65\xdb\xf2\x39\x4f\x91\x0c\xbd\x0a\xad\x4e\xe1\xab\x2f\x0e\x25\x2a\x4b\x54\x56\xc4\x5c\xcc\xde\x72\x8c\xed\x5e\xbc\x18\xdb\x5d\x25\xe4\x89\x5e\x99\x67\x1d\xe3\x7f\x7b\xce\xa0\x2f\xad\x99\x87\xf3\x52\xb2\x7c\xae\xb3\x8e\x31\xf8\xb5\x0e\xd6\x19\x7e\xff\x56\xe2\x58\x8f\x1e\x24\x7e\xbf\xdf\xf9\x99\xf9\x71\x04\x32\x72\x61\x56\x35\x18\x21\xb0\x44\x92\x17\x30\xdf\x47\x64\xfb\xa1\x28\xba\x03\x3d\x0c\x10\x85\x1d\xaf\x7d\x98\xb2\x5d\x28\x0a\x8e\x95\x10\x5a\x0f\x56\xaa\xaf\x09\x17\xcf\x88\xba\x55\xa2\xb8\x2a\x5b\x6e\x58\x4f\xa0\x8d\x22\xc5\xd0\xea\x92\x19\x53\x70\x4d\x95\x54\xd4\xda\xc8\x1d\x8f\x5e\xe8\xfa\x67\x7d\x93\xbf\x5a\xaf\xed\xe7\xaf\x55\xa8\xbf\xd6\x39\xf9\xdd\x72\x2b\x7f\xde\x65\xe8\xb4\xf3\xe0\x10\x8a\x3d\x68\x03\x73\xce\x01\x7b\xbe\xaa\x33\x05\x8d\x03\x6d\xe0\x87\x41\x36\xad\xf3\x7b\x76\x34\xa1\x05\x53\x91\x17\x78\x4b\x83\xb4\x2e\x98\xc0\x75\xa7\x97\x87\x80\x8c\xb1\xa6\xd1\x4e\x05\x0d\xda\xd1\x58\xd7\xc2\xa2\xc0\xf1\x1a\x89\x27\x7a\x25\xb6\x3c\x29\x93\xff\x68\xf5\xdb\xbb\x8d\xdd\xc5\x15\x3c\xfe\xa6\x7f\x76\xe1\xe0\x3c\x6b\xcf\xbc\x0e\x41\xa2\xd1\x44\x2c\xcf\xdc\xdf\xac\x19\xcb\xfa\x73\x1f\xef\xc0\xc3\xc7\xfb\x36\xb3\xb6\x05\x82\x0a\x45\xab\x91\xca\x58\x7d\x46\xed\x91\x4f\x75\x68\x80\xe1\x42\x28\x61\xe5\x4c\xb3\x5a\x08\x22\x90\x26\x98\x40\x14\x44\x89\xa8\xb5\x9a\x29\x42\x00\xa7\x94\x69\x31\x73\x50\xd4\xf5\x96\x2f\x81\x8d\x55\x8c\xb3\x96\xd3\xc2\x14\x58\xd5\x5c\x13\xa9\x4b\x24\x4b\x5c\xb1\x99\x9e\xa6\x95\x34\x01\x6a\x8e\x60\x70\x40\x40\x48\xe6\x26\xdb\x85\x86\x4b\xcc\x09\xa9\x18\x15\xd3\x7c\xac\x97\x79\x4b\x3f\x89\xeb\x6e\x6b\x63\xee\x17\x71\x73\xef\xd7\xed\xdb\xef\xee\xfe\xea\xf3\xa5\x83\x84\x7e\x5c\x97\xef\x75\xfb\x3e\xd5\x5c\xa9\xbe\x18\xdb\xbc\xb3\xc0\xef\x0f\x9d\x80\x35\xd9\xcf\xc6\x87\x66\x18\xe0\xae\x86\x5d\x4d\x40\xb2\xb5\xba\x42\xc1\x61\x47\x42\x5f\xba\x2a\xa8\xaa\xcc\xa9\xa3\x3b\xc6\x05\xa8\xb1\xc3\x80\x96\x16\x03\x89\x34\x5e\x8e\xc3\x67\x65\xc4\xef\xff\xb8\xe2\xde\xde\xfd\xf0\x7e\xdd\xce\x81\x52\x74\x02\xfa\x17\x60\xf3\xe1\x87\x8f\xcb\x76\xb5\xf9\x80\xb6\x8a\x86\x21\x98\xb4\xc9\x67\x96\xe1\xe2\xd4\xe9\x1e\xe4\x14\xda\x25\xe6\x0c\xbd\x9b\xe9\x12\x80\xf6\x45\xca\xc2\x21\xf4\x65\xda\x6f\x95\x41\x90\x95\xaa\xe2\xd8\xe0\x0a\x41\x44\x4a\x4d\x09\x67\x95\xa9\x78\xa9\x4b\x5e\xe4\x36\xb9\xca\xea\xc8\xc3\x32\xc9\x6f\x13\x14\x55\xf2\xcf\xb3\x79\x7a\x7d\x69\x42\x44\x1e\xcc\x6d\xbc\x0f\xb2\xd8\x6b\x58\x92\xd4\xf7\xdf\xbe\xc2\x99\x67\x0f\x37\xf7\x9b\xb6\x42\xc0\x84\x52\xc9\x61\x2a\xb1\xb1\xcc\x55\x61\x0a\x7d\x69\xc5\x53\x02\x04\x2c\x87\x3a\x9f\x74\x07\xf6\x3e\xcf\x21\xcc\x1d\x24\x4a\xd0\xc3\xb2\x88\x4a\xe3\xc2\x5e\x15\x95\xe0\x6c\xdc\x33\x83\xa1\x71\x20\x77\x82\x9f\x04\x9a\x9b\xa3\x99\xc0\x71\xae\xab\x3c\xaf\x34\xee\x18\x55\xa9\x3e\xf5\x67\x7f\x85\x27\x9d\x0d\x31\x67\xfd\xfe\x82\x5b\x78\x17\xbd\x55\x23\xe3\x78\x09\x39\x3f\x81\xd5\x7a\x6d\xf5\xfb\xb8\xf9\x04\x3a\x63\xcd\x38\x82\xe3\x34\x8d\x40\x9e\xa6\x36\x95\x30\xf0\xd0\xd2\xde\x87\x31\x3d\x84\xa9\xdd\x6a\xcd\xcb\xce\x4d\x93\x1b\xdc\xa9\xcd\x8a\xea\xa7\xce\x19\xe2\x11\x02\xca\xb9\xd0\x95\xcb\xef\x95\x4f\x26\xdb\xc5\xdf\x5b\xfe\xd2\xef\x7d\x76\xec\xf9\xf4\xf9\xfa\x7c\x04\x3f\xfb\xdd\x2d\xe0\xd1\x6f\xb0\xaf\x8b\x60\x02\x46\x43\x1f\x9a\x9f\xfd\xfa\xc7\x5d\xd7\xb9\x03\x42\x9e\xd1\x1a\x22\x90\x2f\xeb\xbd\x7c\xa2\x57\x2a\xe6\x26\xef\x97\x23\xf8\x92\x33\x7f\x89\xd7\xc1\xa5\xa3\x7c\x7f\xae\x6a\x58\xa0\x9b\x58\x23\x41\x73\x0e\xaa\x60\x33\xe3\xe6\xc6\xa5\x3d\x17\x52\x8f\x6a\xca\xb5\x93\x8e\x6f\xc6\xa6\x71\x8d\xb5\x4d\x20\xa1\x9e\x76\x60\x09\x36\x08\xb7\xa2\xef\x24\x18\xc2\xfe\xc0\x35\xdf\x47\x80\x2e\x48\x64\x52\x64\xcd\x56\x26\xff\xf0\x8c\xdb\x5c\xcf\xf3\xcd\xb3\x39\xcd\x39\x20\xf8\x94\x39\x18\x4c\x50\x55\xdb\xc4\x6e\x59\x0f\x2a\x84\x6b\x86\x00\x0e\xdd\x32\x75\xd7\x80\x59\xb7\x64\xb8\x60\x72\xc0\x39\x2d\x4b\x63\x5d\x50\x2e\xd0\x72\xcd\x01\xe5\x19\xa3\xf8\x6f\x92\xff\x3a\xe1\x17\x15\x9b\xe5\x6f\xf6\xda\x88\x2f\xfb\xee\xe1\xe3\x2b\xcb\x9f\x2f\x4d\xf8\x3e\x5d\x04\xf8\x5e\x9b\xf0\x7d\xbc\x7b\x63\xc4\xb7\x3f\x44\x13\x34\xa0\x0a\x97\x03\x16\xda\x02\x51\x62\x85\xad\x90\x2b\x28\x16\x84\x0b\xed\x05\x86\xe1\x30\x8e\xd3\xb4\xdb\x49\x51\x04\x1f\x08\x04\xf9\xe1\xb0\xdb\x8d\xe3\x0e\xd0\x03\xc8\x85\xc8\xf2\x08\x3a\x8d\xac\xc2\x06\xec\xc3\x61\x32\xa1\xd9\x77\x3b\x18\xf4\x53\x32\xee\xd0\x64\x77\x56\x4a\xdf\x03\x08\x0e\x56\x1b\x6d\xb4\x2e\xa0\x65\xd8\xc6\x29\xdb\x6b\x67\x9a\x47\x5a\x64\x26\x2d\xb4\x63\x6b\x1e\x78\x15\xf3\x40\xbf\xb5\x67\x0c\xfa\x3f\x4f\x12\xf0\x2c\x7b\x71\xce\x81\x9e\x4d\x52\x63\xcc\xf7\x2a\xf4\xbf\x8f\x5d\xac\xf8\xb8\xca\x63\x7d\xbe\xbf\x2a\x8a\x32\xc3\x27\x07\x91\xf2\xc4\x17\x79\x56\x9c\xc6\x94\xcd\xed\xb2\x85\xe9\xca\xcd\x49\x95\x25\xc2\x10\x5e\x5a\x5c\x21\x2d\xc2\x8e\xef\x84\x91\x61\x60\x07\xe9\x98\xd4\xb5\x3a\x6e\x5c\x85\xe7\x3d\xe8\x11\xe2\xdd\xbe\x2a\x4b\x1d\x3a\x15\x9d\x50\x8c\x08\x65\x5b\xb8\xc2\x82\x24\x74\x9d\x31\x20\x09\xfb\xda\xca\xc1\x70\xe1\xba\x24\x49\x36\x59\x12\xb5\xe2\x8a\xc8\x02\xfb\x47\x17\x8c\xc4\xbb\xb7\x7d\xce\xb8\xd8\xdc\x47\xa8\xf2\xcd\xfd\x0f\x77\xb1\x9e\xf9\xe1\xfa\x4f\xc1\x1b\x25\xb4\xe5\x16\xa0\x59\x57\xf7\x5a\x51\x52\x54\xc4\xd4\x66\x86\x40\x1d\x9c\x13\x22\x85\xa0\x86\x82\x61\x4b\x71\x41\x2b\x6e\x09\x97\x9a\x12\x54\x3c\x25\x33\xba\xb2\x8f\x7a\x5b\xd4\xde\x9c\x24\xa5\x91\xa6\x35\x28\x19\x0e\xa7\x1d\xcb\xd4\xac\xd2\xc4\x04\x7b\xf0\x8e\x74\x1c\xd1\xd2\xa8\xa6\xf5\x58\x4a\xef\x4e\x38\x7a\xca\x6f\x32\xf8\xe4\x22\x6e\xea\xa5\x3f\xfd\x1a\xb9\x77\xe6\xd0\x7f\x7c\xa3\xa2\x1e\x31\x5e\x06\x38\x1f\xab\x91\xd2\x3c\xda\x0e\x90\xa0\xf6\x69\x31\x1f\x5e\x6f\x9b\xae\xeb\x5c\xf7\xd8\x58\x7b\xc5\xbb\x50\xfa\xc0\xea\xc0\x5d\xe0\xf5\x92\x97\xe3\x27\x16\xf3\x9d\xff\xdf\x05\x11\xff\x82\x16\xbc\xf9\xf6\x8d\x8f\xfe\xb9\x1e\x7f\x73\x77\xfb\x7e\x49\x39\xb2\x06\xd8\x3a\x0a\x94\xd2\xb1\x92\x65\xee\x61\x59\x0e\x96\x86\x0a\xf0\xa0\xc7\x34\x09\x49\xee\x59\xd8\x29\x90\x2f\x37\xad\x1f\xe7\x21\xe4\x04\x0f\xe5\x11\x57\x84\xa7\x65\x8a\xc7\xd9\x81\x3c\x54\x28\x54\xad\x6e\xcf\xb1\x7f\x9e\xd9\xad\x4c\x6e\x62\xdf\xe6\xf3\xd9\x8f\x7e\x1d\x64\x9f\xa7\xda\xd7\xc3\x20\x39\x0c\x75\xe0\x48\x6f\x8a\xc7\xa9\xdc\xf0\x79\xe7\x67\x87\x4a\xe7\x44\x03\xa3\xa7\x3e\x8d\xf3\x18\x39\x7b\x9f\xad\xec\xf3\x18\x33\x6d\xaf\xef\x8a\xd7\x45\xb8\x38\x91\x9c\xd7\xa2\xdf\x7f\x88\xc3\x38\x02\x58\xcf\x50\x99\x87\x8f\xf7\x0f\xaf\x74\x84\x36\x0f\x1f\xef\xfb\xcc\xce\x0d\x2a\xd3\x01\x23\xcb\x0c\x34\xbc\x2c\xf3\x10\xb9\xa1\xa6\xc8\x15\x2e\x6d\x1e\x0e\x61\xc0\x80\x86\x03\x28\x6a\xca\x79\xcb\xac\x97\xf2\xa0\xad\x9c\x1b\x6b\x01\xb4\x76\x4b\x42\x41\xf0\xa9\xeb\x5c\xe1\x8b\x21\x6d\x5c\xb0\x4d\x51\x22\x2c\x0d\x41\xb0\xaa\x1c\xea\x80\x76\x8c\x1a\xeb\x56\xc7\xe0\x53\x6e\x8c\x89\x9f\x6b\x89\xf9\xf5\xb3\x57\xd1\x87\x95\x5b\xfa\xe5\x2c\x7d\xfb\x25\xbb\xff\xd9\xe6\xef\xa5\x53\xa3\x40\xe3\xa3\xfb\xb4\x3a\x19\xa0\x03\x27\x19\x3f\x35\x51\xf7\x90\x56\x10\xc0\x12\x59\x88\x0e\x8f\xbb\x1d\x44\x19\xf2\x73\xef\x7d\x4a\xe6\x7e\x0b\x85\xb0\xd2\x98\x65\xe2\xd6\xc6\x86\x1d\x21\x84\x96\xb8\xb4\xb6\x2c\x43\x1f\x20\xe7\x60\x1f\x8e\x36\xb9\x4a\xd8\x13\xb9\x42\xdb\x2a\x6a\x1d\xfd\x93\xf5\x18\xa3\xfc\xe0\xf5\xab\xb9\xe3\x75\x22\x76\x3e\xdf\xcf\xf8\xd8\x98\x71\x0f\x59\x12\x08\x4b\x65\x55\xda\x8a\x22\x59\x95\x68\xc8\xa1\xe0\x9c\x32\xc2\x45\x5d\x1d\x04\x63\xba\xae\xfd\xa5\x13\x56\x7b\xb0\x9f\xcd\xb6\x9a\xa5\x99\x59\x6d\xa1\x85\x7d\x5a\x10\x22\xb5\x54\x5c\x09\xd1\x0c\x12\x5b\x36\x00\x67\x82\x36\x33\x09\xfd\x92\x89\xf3\x27\x7e\xb5\xe4\xe4\x45\x54\xfe\x49\xc0\x77\xb7\xe7\x88\xe4\xfd\x36\x86\x28\xe7\x84\xf7\xdb\x17\x6e\xf8\xc7\xbb\x4f\xeb\xdd\x71\x56\xfa\xa9\xbc\x70\x24\x0c\x61\x20\xa3\xb1\x46\xf7\x13\x26\xa1\x71\x05\x4c\xab\xd0\x15\xa0\x09\x04\x07\xc5\x01\x21\xa1\x06\xa6\xb0\x94\x4b\x07\xc6\xda\x28\xe3\xb7\xc5\x14\x8e\xa4\xa6\xb9\x6b\x40\x8e\x8f\x3a\xaf\xa4\x08\x0c\x11\x62\xbd\x76\xa1\x1f\x6c\xbd\x73\xda\x5b\xa9\x9a\xf9\x20\x8c\x71\x32\x49\xfe\x24\x75\x67\x6f\xef\x2f\x73\xbe\x7f\x79\x46\x60\x27\x5f\xe6\x78\x5f\xcd\xf9\xfe\x8e\xc6\xe6\xf9\x92\x2b\xb8\x55\xfd\x18\xb4\x69\x3e\x1f\xdd\x6a\x60\x3d\x0f\xae\xc8\x8f\xc8\x95\x05\x18\x02\x8b\x14\xba\x65\xeb\x4f\xdc\x57\x84\xf5\x60\xff\xe2\x74\xb9\xe5\x73\x92\x96\x31\xcb\xeb\x54\x0a\x5f\x7d\x71\xa8\x20\xaa\xaa\xaa\x7a\xb6\xf7\x2e\x19\x71\xbb\xe7\x8c\x6f\x9b\x9a\x33\xaf\xee\xcf\xce\x5d\xd3\x7f\x19\xf3\xf8\x5f\xb8\xd7\xc1\xb3\xb2\xd7\x19\x97\xb9\xf9\x82\x05\xbe\xde\x60\x9b\x1f\x3f\x7c\xbe\xdb\x5e\x7f\x4a\x27\x70\x5c\xa9\x44\xfd\xe3\x1e\xf4\x21\xa7\xd9\xee\x84\x7c\xda\xce\x2c\x9b\xdc\x09\xbb\x2e\x53\x8d\xd3\xbc\xc2\x61\x8a\xda\x04\xec\xa7\x7d\x5a\x06\x0e\x9a\x76\x40\x4e\x36\xa9\x2f\x4b\x1c\xf6\x94\xef\xb6\x25\x63\x9a\x68\x4d\x9e\x92\x30\x49\x1e\x8e\xa1\x1f\x06\x40\x7a\xcd\xb5\xc4\x15\xe2\x5a\x6a\x2d\x35\x2b\x72\x49\xa4\x42\x10\x73\x52\x24\x7f\x94\x36\xb1\x06\x6c\x5e\xf9\x54\xff\xa3\xc8\xf5\xff\xa7\x3f\x73\xaa\xbe\x18\x2b\x9c\x3d\x66\xae\x7f\xa6\xda\xf6\xda\x78\x94\x54\x10\x1c\x1e\x35\x38\xc2\x32\xd8\x67\x43\x02\x19\xe9\x62\xfb\x7d\xa8\xb3\xfa\x24\xda\xab\xe3\x3c\x52\x49\x09\x64\x0c\xcd\x03\xa8\x94\xeb\x59\x9b\x8e\x6d\xc3\x9a\x76\x6b\x08\x37\x06\x57\x61\x98\xb9\x02\x3d\x09\xbd\x54\xa1\xd4\xcc\xee\x56\xa2\xc3\x50\x72\xcf\x2c\x55\xd8\x18\x4b\x92\xeb\x14\x9d\xf1\x54\x3f\x9e\x99\xb9\x9f\x92\xbf\x89\xba\xa4\x91\xe3\x71\xfd\xf0\x7a\xd9\x8d\xfa\x1e\x67\x14\xcd\x79\xc0\xdf\x9c\xa7\x57\x70\x7e\xbe\x7d\xc3\xf4\x38\x13\x8b\x96\xa1\xf8\xd2\x26\xbf\x3f\xb7\x04\x57\x1e\xb4\x35\xd5\x24\x7a\x42\xb0\x40\xb2\x2c\xa5\x51\xd0\xa9\x1a\x24\xa4\xac\x29\xe3\x8d\x94\x7b\x19\xda\xe5\xd1\xa7\x8c\x12\xa2\x90\xae\x4a\x8f\x06\xe6\x50\xa3\x75\x5e\x30\xd3\x34\xc3\x60\xc2\x0e\x20\x03\x4b\xc5\xb6\xba\x94\x1a\x75\x8f\x9c\xb1\xc2\x16\x15\xa0\xb1\x94\x31\xed\xd4\x2e\x5d\x42\x73\xa5\x98\xf5\xb3\xd8\xed\x76\xf3\x30\x8e\x63\x66\x03\xe5\xbc\xf0\x45\x05\x50\x68\xbc\xd2\x20\x9f\xa7\x92\x90\xbe\xb7\x4f\x49\xd4\xfe\xb4\x20\x11\x94\xf9\x24\xf9\x7b\x19\x8c\x98\x13\xfe\x15\x0f\x83\xb3\x56\xf2\xaf\xe8\xd7\x7d\xe1\x9a\xf2\xc2\x7f\xf9\xf1\x43\x86\xae\x74\xf0\x00\x3f\xee\x00\x0e\x75\x6a\xeb\x30\x36\x0d\xa8\x6a\x5b\x9f\x9a\xac\x3b\x51\x97\xfa\x59\x5e\xb6\x5a\xb5\x07\xb1\x4b\x8b\xa9\x95\xdd\xb0\xe5\x56\x2e\xb7\xb3\x94\x52\x86\x5d\x2c\xeb\x84\xfa\x74\x48\x4b\xb1\x7a\xce\x1d\xb8\x61\x16\x4b\x26\x8c\x66\xc9\x55\x6a\x22\xd7\xf6\x97\xbd\x52\x1e\xfe\xa0\x57\xca\x37\xbf\x59\x29\x05\x3f\xfe\xa2\x57\xca\x26\x59\x4d\x54\xa7\x47\xdb\xb9\x21\x95\x61\xca\x21\xc5\x96\xdb\xaa\x2a\xa0\x83\x9c\x6a\xa6\x6b\xd2\xea\xaa\x98\x77\xd6\x9a\xb4\x71\xbc\x80\xb2\x2a\x4f\x35\xe8\x2d\x42\xa6\x0e\x9e\x36\xa2\x2d\x65\x81\x15\xfe\xc2\x2a\x65\x57\xdb\xae\x0c\xd3\x30\x29\x05\x0f\x76\x49\x01\x8d\x6e\x76\xc0\x06\x1e\x7c\xec\x1e\x01\x0a\x0e\x42\x40\x18\xbd\x52\x9e\x12\x26\xbe\xf4\x4a\xf9\xfb\xe9\xf0\xa4\xaf\xcd\x2b\xff\x86\x2f\x35\x09\x1f\xd6\xeb\xf8\x7e\xbd\x5e\x6f\xb5\xa8\x7e\xe5\xfd\x74\x77\xe5\x1e\x15\x8d\xa3\x15\xa0\xb0\x03\x6d\x54\x5a\x39\xbf\x3a\x99\x2b\xf1\x58\xc3\xab\xfc\xf1\xb8\xea\xc6\x74\x00\xcd\xe5\xe5\xd5\x09\x5f\x75\x8f\x74\x4b\x34\x9b\x0f\x00\x0b\xb1\x44\xd3\x9c\x87\xbd\xe6\xf3\x01\x90\xe5\xe5\x6e\x79\x73\xd2\x49\x92\xc7\x39\xc7\x6e\x7d\xf2\xfb\x57\x7e\x21\x2c\xfa\x5f\x5d\x56\x83\x0b\xe8\xe7\xd5\xfc\x12\x95\xf5\x9f\xe5\xb6\x5e\x11\x75\x6e\xcf\xfa\x9d\x9b\x77\x0f\x1f\xaf\xbf\x02\x06\xda\xb8\x0a\x82\x36\x70\xc0\x19\x0b\x0d\x30\x52\x56\x04\x89\x8a\x1c\xdc\xe0\x00\x8f\xd8\x58\x53\x5b\x0f\x76\x10\xc9\xa8\xd3\xd3\x83\x31\x32\xf8\x86\x01\xf0\xc3\xdc\xc5\xa7\xad\xa7\xcc\xca\x49\x8f\x62\x16\xab\x67\x13\x3e\x1c\xc2\x31\xa3\x42\x89\x71\xa5\xea\x34\x51\xa6\xb4\x0a\x8d\x5c\xe6\x2a\x25\xe5\x4e\x88\x79\x7f\x81\x05\x25\xc9\x75\x3a\x9d\xfb\x6d\x3f\xd3\xa6\xfa\xc3\x71\xf5\xed\xfb\xd7\x63\x0d\xf4\xf5\x32\x93\x02\x6f\x1f\xb1\x07\x2a\x90\x7d\x1a\x35\x20\x5f\x36\x6e\xda\x83\x9c\x52\x32\xb5\xaa\x1d\x63\xfd\x4f\x9d\x88\xb5\x59\xaf\x82\x57\xa1\x8e\xff\x1a\x15\x0e\xc2\x09\x4f\x14\x57\xd6\x8a\x15\xa3\x20\xbf\xea\xcb\x1a\x0b\x64\xbf\x66\xcb\xba\xfd\x45\x5f\xd6\x87\xaf\xfb\xb2\xfe\xf8\x43\xc6\xb4\xda\xfb\x30\x01\x5b\x85\x1a\xb8\x22\x0f\x10\x10\x88\x96\xab\x55\xe0\x25\x61\x89\xa0\x93\x22\x2d\xe6\xa1\x80\x69\x1b\x06\x3d\x32\xce\x66\x6c\x24\x74\x3d\x6d\xbb\x02\x7a\x04\xf7\x94\x84\x1d\x17\x4b\xb8\x18\x8b\xa3\x7a\xf2\x8c\x73\xa6\x85\x3a\x86\x2e\xe5\x4c\xd9\xd6\x88\x9f\x7b\xb2\x56\x95\x69\x85\xab\x68\xe0\xc7\xaa\x7a\x63\xca\xaa\xc3\x81\x85\x9d\x38\x70\xca\xa5\x40\x17\x53\xd6\x6d\x42\x9e\xe8\xb5\xbe\xda\x47\x17\xd3\x65\x7d\x59\x19\xa9\x2f\x6e\x3e\x6f\xc4\xe0\xee\xa2\x3b\xca\x8f\x1f\x6e\x1f\xa2\x6c\xdf\x19\xa6\x73\x13\x2d\xed\x5e\x8b\x55\xb6\x15\x02\xdc\x55\x18\xc0\x20\x81\x0c\xbe\x0e\x03\xc0\xc1\x82\xa4\xac\x0c\xe0\x10\x31\x89\xcb\xb0\xaf\x4e\xb0\x30\x56\xa7\x93\x0f\x02\xd4\xed\x99\xef\xff\x94\x5c\xed\xb9\x74\x8d\xf6\x83\x5b\x6e\x62\x37\x78\x6f\x1d\x23\x73\x6f\xbd\xb5\xc1\x05\x2f\x01\x06\x35\x68\xe6\x03\x30\xfb\x30\xce\x5c\xa9\xb4\x09\x2c\xea\x39\x81\x44\x3d\xb1\x6b\x0b\xa6\xe4\xdd\x4b\xd4\x7e\xb5\xb9\xfe\xfe\x87\x9b\xfb\x9b\x68\xa4\x77\x67\xb3\xb2\xce\xca\x59\x81\x0a\x28\x16\x58\x18\xea\x30\x05\x26\x81\x02\x78\x56\x40\x0b\xe1\x1c\xf1\x72\x0a\x0e\xc8\x41\x5b\xe6\x93\x6d\x82\x41\x73\xad\x36\x55\xf2\xe7\xc9\xfd\x2b\xdc\xfa\xa5\x50\xf2\x15\x17\x99\xbb\x0f\xf7\x9b\x4f\x9f\xef\xde\x47\x61\xc3\x25\xa3\xfb\x70\xf7\xee\x6e\x73\x29\x28\xef\x80\x2c\x0a\x07\x73\x60\x6b\x58\x1e\x82\x5a\xed\x7f\x3a\x40\x83\x06\x49\xd5\xa5\x10\xc1\x70\xac\x1e\x8f\xd0\x18\x9b\x8e\x2e\x30\xd0\x06\xbd\xdc\x05\x71\xb2\xbd\xea\x4b\x54\x62\x6c\x08\xb1\xd2\x34\x8d\x91\xd6\x18\x42\x0c\x3e\x76\xa2\x59\x16\x29\x77\xd0\x7d\x68\xb4\x4c\xae\xd3\x3c\x11\x11\xbf\xfa\x47\xe7\xaa\xf6\x8a\x4a\x8c\x0a\x61\xe7\x7c\xe5\xdd\xd9\x53\xf9\x26\xbb\xbf\x79\xf8\x61\x4d\x64\xde\x3d\xc7\x00\xcb\xdf\x4f\x1f\xce\x02\x4e\x2b\x4d\x7e\xcb\xca\xe2\x30\x9b\x23\x44\xb3\xee\x94\x4f\xa1\x3b\x1e\x53\xe3\x31\xee\xc3\xf1\x78\x8c\x9d\x88\xb0\x03\x92\xec\x71\xa9\x11\x0e\x10\xd8\xa0\x9d\x94\x5b\xcd\xa4\x73\x0c\xcf\x5d\x11\xca\xa3\x1e\xc1\x04\xa6\x79\x0f\x5c\x38\xfa\xca\x29\x37\xb9\x20\x81\x77\x93\x73\x4e\x68\xac\x64\x10\xb3\xb2\xc0\x24\xc9\x16\xc8\x27\xbe\x55\xd9\x18\xef\xcf\xff\xe0\xcd\x27\xb8\x7f\x7d\xb4\xe7\xaa\xd0\x72\x7f\x3e\xac\xf7\xe7\xfd\x77\x9b\x57\x9f\xee\xdd\xc3\xf5\x39\xc6\xdb\x54\x65\x71\x64\xb0\xac\x9f\x92\x69\xb2\xe3\x78\xb0\xb0\xc4\x63\x01\x19\x2b\x8b\x1e\xcd\xc6\x18\x0d\x0e\x76\xb7\x8b\xaa\x5d\x5a\xca\x6c\xa4\x4c\x0b\x69\xcc\x1a\xc6\x18\x23\x85\xc6\x38\x30\x21\x85\x45\x61\x9a\xe8\x1e\xe4\xc0\x07\x06\x70\xbf\x0f\x50\x1f\x93\x6d\xc2\x9e\xe8\xb5\xca\x54\xf2\x8f\x92\xbf\x88\xf7\xcb\xea\xf8\x15\xef\x95\xeb\xbb\x2f\x6f\x95\x1f\x57\xb7\xac\x87\xb7\x07\xfc\x66\x44\x7d\xbc\xdb\x34\xa8\x00\xa6\x63\x51\x48\x46\x05\x57\x47\x38\xbb\x03\x39\xaa\x1c\xe0\xa8\x52\xe4\x50\x9e\x90\x57\xf2\x32\x98\x5c\x38\xb8\x08\xb1\xcc\x14\xa1\xb6\xb1\xd6\x4e\x93\xb5\x96\x33\xcb\x83\x6e\x98\x2a\x42\xdd\x1a\x07\x38\x60\x41\x02\xe8\x9e\x92\x80\x08\x01\xbb\xb0\xab\x93\x6d\xe2\x9f\xaa\x6b\x95\xb1\xb3\x17\xc0\xea\x77\xb0\x76\x26\x2f\x92\xcc\x7f\xfa\xc2\xa4\xbd\x3b\x33\x01\x6f\xee\x3e\x6d\xee\xd6\xc4\x06\xfc\x5c\xae\x15\xb9\xbc\x48\x87\x47\xbb\xb1\x3f\xe9\x0d\xcb\xa5\x45\x14\x32\x44\x20\x0c\x9e\x94\x06\x11\x71\xaa\x40\x5b\x84\x69\x49\x12\xb2\xdd\xa3\xd4\x54\x0a\x99\xe5\xa4\x74\x08\x4f\x04\x7a\x88\x33\x86\x60\x11\x04\xe6\x78\xaf\x0b\x53\x20\x4e\x08\x63\x14\xa7\x23\xea\xb1\xc7\x38\x54\x4c\x51\x49\x19\x63\x44\x10\x7c\x21\xfc\x65\xd9\x94\x92\xe8\xaf\x74\x13\x9d\x64\x13\xf0\xa2\x49\x7a\x77\xd6\x24\xbd\x7b\xb7\xbd\x7e\xff\xdd\xfb\xeb\xef\x2f\x8d\xab\x95\xde\xbd\x6d\xab\x76\xa4\x2c\x1c\xf2\x49\x28\xaa\xb3\x9c\x5b\xce\x1a\x1a\x0e\xce\xef\xab\xda\x48\xc2\x0f\x58\x6a\xb2\x65\x2d\x37\x8c\x8b\x3d\x93\x95\x6e\x42\x69\x0d\x43\x10\x59\xcc\x69\x65\x61\x45\x0d\x25\x84\x2e\xc7\x61\x9f\x68\xec\x5b\xfc\xc3\xe4\x21\xe6\x20\x67\x85\x9f\x2f\x38\x7a\x77\x1f\xb7\xf7\x1f\xd0\x59\xd4\xf1\xfe\x35\x2c\xf8\x87\xc8\xfe\x5a\x0e\xec\x3a\x61\xcd\x00\x5c\x98\xcc\x41\x4d\xce\x9b\x41\x0c\x2a\xec\x81\x75\x75\x05\x6c\x40\x00\x62\x57\xa5\xbc\xaf\x64\xd7\x70\xb7\xef\x43\x4f\x8f\x75\x18\xf5\x04\x74\x55\x1a\x2d\xaa\xad\xb5\x15\xec\x5c\xe3\x4d\xdb\x2f\xf3\xf2\xe4\x8d\x6b\x5d\x53\xb8\xc7\xa3\x2f\xac\xed\x34\x63\x86\x4b\x5b\x59\xc4\xf4\xc4\x49\x55\x72\x9f\x6c\xe3\xf1\x37\x5f\xd6\x45\x7e\x29\x57\xbc\xbd\x68\x10\x7e\xa5\x2e\x92\xf9\x4b\x61\x44\x9f\xf4\x5a\x18\x11\xa7\xda\xa7\x78\x1e\x14\x82\xfb\x12\xfa\x02\x1e\x1f\x77\xfb\x02\x66\xb9\x9f\x3b\x1f\xdd\x7a\x5f\xd7\x45\x96\x91\xb8\x27\x94\xd0\xaa\x2a\xad\x2d\xab\xd0\xbd\xd4\x45\xf2\x4c\xc4\x58\x84\xc7\x9c\x6f\x89\x1a\xff\x3a\xf9\x8f\x93\xff\x2c\xf9\xaf\xe2\x95\x7f\x09\x9c\x63\x99\x6d\x99\x15\x36\xef\xbe\x94\xdc\x59\xde\x05\xaf\xfb\x9e\x77\xab\x67\xe4\xe6\x0b\x8b\x9e\x6d\x59\x60\x55\xda\x82\x0e\x1e\x83\xc6\x39\x37\xcb\x02\x6b\x94\xdb\x82\x0d\xbe\x02\x75\x74\xcb\x1f\x3c\xc8\xfd\x34\x81\xe2\xb1\x3f\x0e\x40\x44\xf5\x6e\xa9\x5b\x59\xa7\xc5\x50\x2b\xdf\x5d\x69\x87\x72\xa4\xaa\x9a\x54\x22\x5d\x2e\x9e\xd8\x19\x87\xf2\x4a\xbc\x7e\x67\xb6\xce\x59\x6b\x5b\xe7\xda\xb6\x0d\x0d\xaf\xa5\x65\x46\x68\x63\x79\xf2\x47\x59\xfb\x54\xc6\x3c\xf7\xff\x83\xb7\xf6\x9b\x18\xec\x08\xc4\x6a\xb8\xd5\x9d\x0a\xd0\x84\xda\xad\xb8\x71\xbc\x5e\xa4\x73\x38\xb2\x6c\x9a\xfb\x8e\xd6\xa0\xeb\x5b\xd6\xf5\x5b\x24\x44\xa8\xb9\x73\x3c\x7a\x6b\xef\x9f\xf3\x9c\x51\x3c\x25\xca\x50\x57\xa9\x4a\x38\x5d\xad\x9c\xf6\xfa\x8c\xfd\xb8\x3d\xaf\xa6\x6b\x57\xe0\xa2\x40\xbb\x72\x83\xee\xdf\x9f\xcd\x9e\x56\x99\xe4\xe7\xd2\xd0\xe7\x57\x14\xef\xd1\xef\xfd\x34\xf9\xbd\x1f\xab\x8c\x05\x9f\x17\xa0\x0d\x2d\x07\x50\x85\x51\xe8\x30\x30\x90\xf3\xe0\x81\x87\x79\x68\x7d\x8a\xe6\xdd\xb2\x6d\xf6\xd6\x3a\x67\x9c\x73\x6e\x9c\x0d\xa5\xae\xd3\xb6\x06\x79\xe8\xa5\x63\x93\xa3\x14\x18\x13\x8c\x5d\x6b\xc5\x75\xe4\xc3\xa8\xe4\xee\xd9\x83\xfa\xcd\x1d\xbf\xbd\x7e\x21\xfa\x5c\xc4\xe6\x3e\xde\xbd\xb6\x65\xbe\x6c\x57\x09\xc0\x7e\x3d\xab\x01\x09\x35\x4c\xa8\x34\x86\x19\x04\x43\x13\x6c\x59\xeb\xd0\x03\x17\x86\x8c\xd1\x53\xce\x3c\xe7\xfb\xf8\x6f\xd3\xb7\xad\x6b\x5d\x2d\x0b\x54\x55\xcc\xb7\xb4\xc2\x18\x5a\xd1\xb9\xf6\x34\x85\xdc\xfb\x18\x29\xcb\xb0\xee\x57\x26\xc9\x55\x3a\x3e\xfb\x66\xff\x5d\x72\xc8\xcf\x5f\x4f\x21\x7f\xff\xe1\xe1\xfd\x4b\x0e\xf9\xee\x67\x39\x64\x69\xa3\x9c\x65\xff\x38\x79\xdb\xa7\x32\x8c\x39\xc4\xd8\x30\x53\x95\x30\xb7\x05\x27\x8a\x49\x4b\x6b\x55\x15\x21\xd1\x56\xa7\x36\x77\x39\x83\x48\x11\x7c\xaa\x41\x63\x11\xd4\x2e\x74\xb4\x66\x35\x52\xb0\x7a\x9b\x45\xee\x6d\x38\xd6\xa6\x8d\x59\xe4\x0e\xee\x1d\x48\xec\x9a\x44\x9a\x98\x44\x1e\x18\x28\x01\x01\x07\x5c\x49\x04\x19\xa1\x93\xd9\x11\x56\x85\x72\x90\xd2\x80\x71\x49\x22\xcb\x3a\xfa\xd9\x64\x28\x72\x21\x6d\xf2\xa7\xb1\xdf\x72\x9f\xe0\xe4\x7f\x4c\xfe\x97\xe4\xdf\x27\xff\x7b\xf2\x7f\xbd\x70\xd8\x97\x74\x64\xf9\x3c\x91\xb3\x1e\xe5\xea\xdf\xfd\xf0\x7e\xf3\x21\x52\x7b\x96\x48\xe8\xdd\xeb\x16\xe9\xcd\xc3\xbb\x4f\xaf\xfe\xe3\xeb\xef\x3d\x0b\x2f\xfe\xc5\xbb\xe7\xbd\x9d\xb9\xba\x77\x1f\xd7\x09\xfc\x0a\x2f\xab\x5f\x82\xca\xe9\x24\x4b\xd1\x83\x5d\x89\x82\x40\xb8\x5c\x12\x1a\x90\xa3\xe0\xa9\x05\x09\xe8\xa9\xe9\x94\x46\x85\x2a\x58\xd7\x30\x6b\xe7\xd1\xae\xff\xab\x0f\x9d\x52\x65\xa1\x0b\xd6\x37\x4c\x85\x41\x80\x64\x39\xed\xe7\x1d\xf1\x9c\xc3\x09\xe6\x47\x60\xf2\x02\x14\x98\x11\x46\xd8\xd6\xa2\x95\x1f\xbf\x1b\xa1\x94\xb2\xac\xca\xaa\x63\xc1\xf2\x4a\x62\x02\x50\x25\x2d\xc7\x65\x51\x41\xba\x5c\x16\x02\x12\x81\xc2\x1e\x15\x85\x2c\xcb\x30\xb4\x18\x72\x64\x29\x61\xe3\x61\x89\x7e\xf7\xb9\x14\xaa\x2c\x0b\x32\x56\x18\x57\x72\x57\x62\x41\xaa\x24\xc9\xb3\xf2\x09\x47\x6c\xe7\x0f\xc9\xbf\x4d\xfe\x9b\xe4\xbf\x4f\xfe\xa7\xe4\xdf\x25\xff\x3e\xf9\x3f\xce\xec\xc8\x67\x31\xe9\xfb\x73\xd2\x74\xa9\xf7\x2f\x33\x69\xbc\x8d\xce\xcf\x9f\xbf\xf8\xe9\x37\x27\xf6\xfc\x7f\x7e\xb5\x3e\xd3\xa8\x02\x12\x63\x8c\xe7\x55\x89\x04\xc7\x55\xe5\x84\x2e\xd5\xa4\x10\x62\x0c\x1c\x06\x09\x91\xa0\xa5\x2c\x72\x62\x9a\x66\xa8\x51\x55\xe4\x22\xc7\x92\x63\x04\x15\xe7\x50\x85\x32\x33\x27\xe3\x52\x31\xd7\x97\xcd\xb3\x76\x24\x5d\x0a\x3b\xcf\xeb\x76\x6b\x20\xc1\xce\x29\xa5\x1d\x44\x82\x55\xe4\x38\x68\xc9\xac\x56\xb8\x64\x7a\x32\xa4\xa2\xda\xa1\xb2\xd4\x5a\x19\xed\x2b\xc8\xa1\xc1\x15\xe9\x3a\x23\xb8\x09\xdd\x5c\xa6\x39\x0f\xbb\xe5\xdf\x5e\x29\x6a\x2b\x45\x85\x92\x74\x99\x03\x79\xe4\x26\x55\x91\xf3\x00\x63\x17\xf6\x4b\x07\xc2\x77\x77\x9b\x9b\x4b\x46\x95\xd9\x6c\x10\x82\x2a\xa4\x28\x39\x4d\x55\xda\xcf\x24\xb5\x81\xfa\x58\xcf\xd8\x56\x7f\x7b\x54\x2a\xaf\x73\xb5\x21\xa3\x1b\x67\x2b\xd2\x29\xa0\x95\xc3\x96\x55\x11\x83\xfa\x35\x9d\xc1\xeb\x5f\xd5\x19\xec\x3d\x44\x69\x22\x9d\x31\x34\x28\xd3\x2b\x90\x37\xa6\xae\x97\x88\x32\x5d\x3b\xc1\x13\xe8\xfd\xcc\xfd\xf8\x85\xcc\x20\x0c\xb5\xe1\x68\x7a\x2b\x33\x58\xad\xf3\xa9\x7e\xe2\x51\x77\x67\xad\xef\xdc\x25\x7f\xf9\xd6\xb1\x38\xe2\x39\xde\x2e\xc7\x0f\xef\x3e\xfd\xb0\x2a\xcb\xad\xb7\x51\xa6\x23\xab\x3a\x35\xb3\x59\xb6\xac\x14\xf5\x04\x2b\x41\x0a\x8b\x54\x63\x99\xab\x4f\x83\x8b\x44\x05\x5b\x4e\x3d\xd9\x56\x73\x0e\x86\x3a\x94\x6d\x80\x5a\xd2\xd0\x22\xc8\x07\x7c\xd4\x54\xa4\xc7\x23\xee\x76\x36\xe8\x0a\x1b\x8e\x59\x72\x15\x71\xb3\xed\xd6\x24\x7f\x72\xf6\x28\x88\xe7\xea\x82\xfb\x4b\x96\x68\xec\xdd\x97\x3a\x39\x1f\xef\x3e\xde\xaf\x90\x8a\x73\x71\x18\x7b\x88\x0e\xa0\xe4\xe1\xf0\x94\x74\xe1\xa8\x80\x28\xd3\xa2\x07\x5d\xa0\xdc\x44\x3d\x1c\x1c\x4a\x30\xb5\xdc\x6a\x63\x7d\xba\xf3\xdc\x71\xb7\x35\x25\xc1\x4f\x89\xab\x3d\x80\xe1\xd0\x29\x90\x1f\xdc\xe4\xe7\xa3\x12\x45\x03\x19\xd8\xfb\x29\x10\x16\x76\x8d\xee\x77\xc3\xc4\xa7\x21\x49\xd2\x84\x3f\x89\xd4\x44\x5e\xe2\x6f\x9e\x11\x9a\xeb\x50\x49\xaf\x3f\x7c\xf3\xfe\xe1\x7c\xb2\x40\x62\x73\x08\x20\x29\x75\x05\x6b\xc2\x84\xa4\x5e\x32\xa8\x1b\xba\xd5\x48\x6b\x5b\x0c\x9c\x4a\x1d\xa6\x56\x01\x74\x38\x79\x4a\xbd\xe6\x34\x72\xb5\x51\x5c\x9f\x7f\x39\x86\xfa\xfc\xd5\x18\xea\xe3\x1f\x88\xa1\xee\x7e\x1e\x43\x65\xbb\x82\x38\x94\x5b\x48\x77\x35\x06\x9d\xab\x6b\xe0\x0b\x62\x4b\x07\xd9\x74\x7e\xe3\xe4\x27\x0f\x90\x3f\x1c\x40\xf9\x68\x40\x3e\x01\xb5\xdc\xf2\x54\xb9\x51\x74\x29\x1e\x5b\xd5\x0c\x57\xda\xc1\x22\x86\x4c\x98\x3f\x07\x51\xf1\x1d\x4f\xdf\x04\x51\xce\xd9\xd6\xda\x9f\x05\x51\xb1\x6e\xc0\x9f\xc8\x75\xb7\xd5\xc9\x9f\xc7\x9e\xe8\x43\x84\x3c\xdf\xa1\xb5\x2d\x7b\x87\x7e\xfc\x78\x73\x1f\x2b\x73\x37\x1f\xef\x55\xe7\x01\x51\x80\x81\xbd\x80\x1e\x29\x3c\x8f\x81\xb5\xf5\xde\x8c\xdd\x06\x2d\x4b\xe3\x23\xc6\x25\x71\xd5\x88\x11\xd7\x57\xac\x9b\xab\x80\x25\x68\x53\xd3\x45\x9e\x7e\x1d\x79\xaa\xf8\x55\x7d\xf3\xac\x90\xf0\xb6\x3e\x9d\x3d\xdc\xdc\xc7\x25\x3b\xf2\x67\x2e\x48\xe9\xed\xf5\xe6\x85\x26\xb8\xae\x31\xef\x3f\x7d\xce\xba\xac\x0b\x7b\x90\x9c\x0c\xc8\xc3\x94\x42\x79\x54\xea\x28\xad\x3a\xed\x00\x86\xb0\x2e\x60\x9a\xd7\x44\x02\xaa\x5b\xd7\x86\x81\xed\xeb\xda\x70\x72\x04\x4d\x55\x75\x12\x6f\xb1\xab\xe7\x7d\x0a\xeb\xba\xae\xc3\xb3\x3a\x35\x48\xe6\x09\x53\x84\x4b\x37\x99\x7a\x99\xcb\x4a\x57\x70\x5a\x69\xa3\x19\x15\x6d\x92\x80\xec\xa2\x0d\xfc\xfb\xb3\x47\xda\x3a\x7b\xac\x42\x9c\x2b\x5a\xf0\xe1\xe6\xe1\x05\x55\xf3\xee\xa2\x3b\x75\x49\xb2\xae\x8c\x70\x8d\x9c\x19\x10\xc1\x39\x21\xb9\xf4\x7e\x72\xbb\xba\x6e\x01\x09\x0e\x68\x39\x36\x87\x32\x0c\x43\xb7\x13\xa3\x37\x1c\xb4\x8d\xd4\x9d\xab\xd3\xa9\xa4\x1a\xa3\xce\x36\xe9\x7e\x86\x8d\xad\xdd\x5c\xd4\xe6\xd0\xd0\xc2\xe5\x46\x62\x5f\x52\xed\xd7\x18\x93\x9f\x3d\x6b\xdf\x25\xbf\x4b\xfe\x3a\xfa\xc2\xbf\x7f\xed\xcd\x77\x91\x81\xdd\x3c\x7c\xbb\xac\x3f\x37\x77\xf1\xa4\xde\xdf\x3c\xbc\x7b\xf8\x94\x3d\xe3\x32\x5e\xff\xf8\xd7\x7e\xf2\x8a\x2e\x0b\x7b\x27\x3c\x66\x48\x57\xb8\x80\xb3\xe3\x42\xd4\x20\x77\xd0\x98\x18\xfb\x4a\x6f\x5b\xa3\x90\x60\x42\xf4\x62\x99\x52\xa5\x6e\xb0\x40\x06\x33\x88\x02\xb2\x85\xb6\x61\x87\xc3\x4e\x8c\x74\xb0\x0a\x6e\x75\x89\xd0\x5c\x4f\xd0\x42\xaa\x80\xd2\x54\x59\x63\x84\x0d\xc7\x4e\x4b\x62\x41\x62\xc4\xcc\x28\x56\xb2\x2e\xcb\x72\x6e\xf6\xd0\x43\xa6\x80\xc4\x46\xb8\x70\xe8\x95\x66\x72\xf9\x91\x75\xae\x35\x67\x4e\xc8\x45\xe7\x86\xfe\xb2\x3e\x1b\x58\xc5\x08\x2e\xa5\xce\xef\x3f\xa4\xe7\x60\xf6\xf3\x0b\x61\xfd\xfd\xf6\x3a\x82\xe3\x63\xc8\x7b\x5d\xd0\xe0\x57\xc1\x36\xeb\x88\x30\x22\x0c\x91\xb3\xb9\xe3\x95\xae\x78\x7a\x34\xcc\x56\x4a\xe7\x05\xe8\x43\xed\x27\x1e\x0e\x8d\x0c\xbd\x38\xaa\xd0\x03\x8d\xea\xa6\xf2\xd6\x58\xd8\x29\xcb\xec\x28\x85\x3d\x4c\x53\x57\x56\x5b\x63\x25\x74\x1c\x37\x86\x69\xce\x25\x95\xbc\x94\x8a\x2a\x19\x44\xdd\x33\x05\x0b\x41\xad\xa7\x8d\xd9\x3d\x25\xc2\x91\xce\x3a\x58\x68\x2e\x8b\x5c\xab\xb6\xb2\xa2\x10\xb2\x0a\x3b\x8b\x10\xc1\xab\x16\xc6\x8a\x11\xfc\xa3\xe4\xef\x9f\xeb\x17\xab\x8b\xd3\x5a\xc1\xb8\x79\xf8\x94\x2d\xab\xce\x59\x95\xee\xe1\x4b\x2f\xbe\xcf\xcb\x90\x8a\x6f\xdc\xfd\xcc\xb0\x3c\xc2\xe5\xe2\x94\xbf\x49\x6a\x84\xc0\xf1\xa4\x8e\xa5\x5d\x82\x86\x63\x45\xa4\xc6\x1a\x1d\x48\x89\x2b\x5e\x55\x42\x63\xc9\x50\xc9\x68\xb9\xac\x4f\x06\x73\xd0\x49\xa2\x89\x0a\xb9\x2f\x99\xaa\x0a\x5b\xf0\xb1\xe3\xbd\x87\xcc\x2f\xe1\x1a\x23\xa7\x32\x9b\xf8\x89\xa5\xd3\x53\x22\x19\xa9\xfb\x92\xcb\xa2\xae\xf0\x12\x6f\xf1\xd2\x40\x82\x20\xc7\x84\xcd\xd1\x1a\xd8\x74\x07\x3c\x8d\x38\x68\x04\x2b\x5b\x76\x0c\x33\xe0\x61\x38\x4e\x78\x88\x1a\x47\xea\x2b\x1a\x47\xcf\x55\xcb\x3f\xac\x71\xb4\x79\xff\xa2\x71\xf4\xe9\x59\xe4\xc8\x5d\x44\x8e\x26\x17\xba\x50\x69\x4e\x99\x4a\xa9\x66\x8c\x4a\x90\xc3\x28\x72\xc4\xa1\x55\xb4\x03\x79\x53\x81\xda\xcf\x83\x07\x08\x35\x4b\x5e\xbf\x6c\xff\x4f\x64\x8e\x68\xb0\x67\x9d\xa3\x4d\x66\x9f\x35\x13\xbf\xa6\x05\x76\xee\xe3\xfe\x01\x2d\xb0\x16\xb8\xa8\x05\x66\xea\x2a\x07\xf9\xe3\x01\x24\x10\xd5\x29\xc5\xa1\x47\x45\xe8\xb3\x25\x9d\xe9\x02\xad\x63\xa1\xb5\xf6\x17\x61\xa6\xb3\x1a\x58\x5d\xfc\xa2\x1a\x58\x92\xe4\xc9\x32\x0f\xca\x2c\xff\x8a\xbf\xd1\xeb\xe6\xff\x6b\x42\xd6\xcd\x19\x02\xb0\x6e\x5f\xfa\x1b\x9d\xaf\xc7\x75\x31\xcb\x94\x47\xcd\x9b\x26\x3d\x14\xd2\x22\x8a\x38\x22\x10\xfe\x24\xd2\xf6\x15\xec\x08\x72\xe4\x10\x9d\x1b\x4b\xb8\x11\x57\x98\x63\x53\xb1\xf9\x48\x0a\x5f\xe0\x2c\xd7\x58\x12\x49\xc2\xe8\x0a\x5b\x10\x9b\xaa\x16\xe3\x86\x90\x86\x10\xab\x0c\x32\x0a\x55\xb5\xa4\x5a\x0b\x89\x15\x2f\x8d\xae\x9c\x8a\xba\x7a\x6b\x0e\xf9\x97\xc9\x3f\x8d\x1a\x46\x2f\x39\xe4\x1a\x36\xbe\xfb\xfc\xfe\xfa\xcd\x7a\xff\x2f\x40\x54\xf0\xb9\xa4\x8f\xd9\xdd\x79\xd5\x7a\x78\x4b\xfb\xde\x20\x17\xe1\x53\xbb\x92\xa8\x12\x86\x61\x97\xef\x4b\x6e\x91\xcd\xf9\xd8\x0a\x07\x9b\x91\x7b\x0e\x78\x0f\x12\x87\xdd\xfe\xd4\xa7\x9d\x29\x4b\x5d\xcd\x6b\x1d\x79\xab\xa5\xe1\x56\x0b\x46\x68\x5d\xea\x0a\x43\x88\x79\xe9\x29\x21\x14\x6a\xd4\xce\x53\x28\x43\x2d\x00\x07\x5d\xaa\x7f\x1a\x2f\x61\xbc\x4d\x1d\xda\xfb\xb2\x6b\x9a\xa1\x1a\xeb\x65\x5e\xb0\x11\xdb\x41\xfe\x5f\xfb\xdf\xfc\x02\x2b\x3f\xeb\xb2\x36\x68\xeb\x9d\x13\xc1\x80\x36\x30\x1f\x9d\x17\x0c\xf7\xde\xbb\xa0\xea\xc3\x01\xd8\xfd\xec\xd6\xa7\x83\x73\xa0\xb4\x5b\x32\xfb\xd6\x98\x2f\x9d\x6f\x5a\xa0\xde\x3a\xdf\x80\xa8\x23\xdc\x64\x2c\x3a\x11\x3d\xa3\x8d\xde\xb4\xa8\x22\xa5\xef\xee\xfa\xa5\x26\xfb\xf9\xee\xdd\x39\x76\x39\xa3\x90\x2f\xea\x34\xe7\x26\x57\xca\x10\x04\x49\x05\x5d\x81\x46\x56\x36\x25\x06\xfc\x34\x22\x94\x75\xc1\x7b\x00\x65\x18\xbb\x79\xa7\xd2\x7d\xce\x05\x57\x50\x33\x9c\xcf\x9a\x80\x02\xec\x55\xe1\xaa\x7a\x9e\x82\x53\xae\xe3\x00\xf5\x81\xa5\xbc\x42\x73\x0d\x20\x84\x19\x26\x8c\x32\x48\x08\xe3\x18\x63\x55\x56\x4a\x08\xed\x1a\x36\xa8\x5c\xe6\x62\x44\x79\x25\x2b\x4f\x31\xdb\x33\xac\x85\x52\x55\xa9\x70\x19\xf9\x2f\xfa\x89\x5e\xf1\xad\x8d\x7e\x6d\xff\xe1\x4b\xe7\xe9\x02\x6c\x78\xbf\x04\xda\xe7\x80\xe2\xee\x1c\x50\x9c\xfd\x02\x5f\x75\xa2\x96\x2b\x93\x9a\x12\x02\x6f\x11\xd9\x0b\x89\x19\xaa\x71\x38\xec\xf7\x4d\x80\xed\x38\x86\xa3\x3f\x60\xaa\x81\x87\x10\x77\x18\x05\x4d\xe1\x30\x6c\x2d\x13\x56\x9a\x47\x2f\x78\x61\x73\x9a\xf5\xbd\x8d\xd7\xcd\xdb\xfe\x51\x6e\x90\x56\x96\xe2\x50\x28\xad\x1e\x0f\x5d\xb2\x49\xd4\x13\xbf\x5a\xf2\xa8\x17\xcd\xd0\xe4\xf6\xe1\x1c\xe5\x7c\xe1\xf9\x72\xf3\xdd\xfb\x28\xe6\x73\x7d\x46\xd4\xfd\xf8\xc1\xf9\xa9\xde\xf9\x93\x46\xd9\x70\xc2\x11\x08\x56\xa7\x68\xde\x71\x7c\x20\xa5\x2f\x4b\x29\x60\xa0\xf3\x1e\x8e\x15\xdb\xc2\x23\x60\xa1\x3d\x06\x63\xac\x89\xd2\x4a\xad\xf1\x48\x9b\x4a\xe1\x62\x99\x64\x3d\x52\xd1\x7f\x23\x91\x4f\x34\x9b\x22\xbe\xe5\x36\xf9\x4d\x9c\x79\x92\xdb\x67\xe8\xee\xe6\x5c\x7a\xbd\x3b\x0f\xbe\xd7\x2c\x40\x0b\x28\x2a\x3d\x86\x40\x9c\xba\x54\xd4\x98\x0c\x27\x97\xe6\x34\x34\x14\xd9\x92\xa4\x7b\x1f\x4a\xef\xc1\x14\xca\x4d\xcf\x48\xc5\xa5\x27\x65\xe7\xbc\x6f\x3b\xe5\x4a\xab\x66\x39\x57\x8c\xa5\x63\x28\x22\x91\xe8\x2a\xd1\x4f\xe4\x2a\xdf\xba\x33\xce\xa6\x7a\x8d\xae\xc9\x9e\x19\x14\x2f\x1a\xed\x6f\xf9\x09\x3f\x7c\xfc\xf4\xf9\x2e\xc5\x15\x02\xe6\xa4\x00\x87\x68\x5a\xc2\xba\x58\x1d\x6e\x33\x64\xea\xc6\xc3\xa6\x15\x92\x33\x48\x04\x69\x7b\x08\xac\x11\xf3\xb0\x75\x8c\x5b\x8b\x71\xf0\x81\x5b\x1f\xb4\x97\x02\x15\xd0\x22\x78\xa0\x0c\x7a\x88\x3a\x58\xf8\xd2\x52\xf2\xcc\x97\xa8\xb6\x55\xcc\x65\x96\x19\x3a\xb9\x7d\xe5\x96\x74\x7b\xff\xf1\xe1\x73\xd4\xc6\x7a\x7d\x86\x4c\xe6\x03\x2a\x41\x27\x4f\x55\x8f\xdb\xb1\x0c\x3b\x80\x81\x0e\x7d\x9a\xd4\x21\xaf\x63\x87\x7a\x5b\xb9\x31\x70\xe7\x00\x5c\xf2\x6d\x00\xe7\x7e\xa6\x4a\xa5\xcb\x04\x57\x9e\xf9\x55\x4f\xee\x2a\xd9\xe6\x6b\x1f\xf2\x2c\xd4\xf9\xc3\x19\x68\xfd\x70\xf3\xf9\xe6\xce\x67\x32\x8c\xfb\x3d\x28\x60\x50\x01\x22\x42\xea\x36\xc8\x6d\xbe\x9c\xfe\xb9\x63\xde\xf2\x26\x2f\xb2\xc3\xa9\x42\x57\xbb\x24\x49\xd3\xdd\xd9\xeb\xe7\x7d\xe4\x3a\xbf\xcf\xee\xde\xdd\xbf\x91\x99\x5e\x82\xd6\xe4\xfd\x37\xef\xbf\xb9\xbd\xbb\x92\x35\x4b\x27\x4b\xc2\x71\x0f\x12\x16\xa6\x69\x0a\x83\x04\x64\xf4\x12\x13\x0b\x72\x21\xea\x91\x84\x62\x6b\xaa\x70\xf4\xf3\x2e\xd4\x47\x5e\xdb\xfd\xe4\xad\xdb\x0d\xc0\x4a\x2e\x81\x61\xa1\x9a\x96\x11\x9f\x5c\x25\xea\x89\x5d\x89\x18\x47\xaf\x08\xa4\xe4\xf6\xee\xf3\xc3\xd9\x78\xf4\x12\x35\x7d\xff\x79\xb9\xc6\xf7\x6f\x92\xe3\x0b\xa4\xaa\x07\xaa\xf0\x05\x50\x41\xe7\xc5\xae\x15\x6d\x6f\x26\x0e\x4a\x1c\x3a\x96\x1d\x34\x53\x8c\x42\xce\xcb\x19\x89\x34\x9f\x8f\xf6\x78\xdc\xb4\x83\xe2\x0e\x21\x61\xb5\x15\x5e\x68\xd3\x05\xec\x66\xa6\x38\xac\x11\x4d\xbd\x09\xd8\x46\xcd\x88\xab\xf2\x5c\x43\xfe\xf3\x15\xc1\xfb\xac\x6a\xf0\x6d\xfa\x3a\x98\xcb\x62\xf2\x01\x96\x39\xe2\x4a\x00\xb2\xea\x13\xe1\x46\xd8\x8e\x0d\xae\xd9\xb1\xc9\x3b\x86\x01\x0a\x3d\xa8\x15\x0d\x0d\xbe\x68\x16\xd5\xbe\x08\xd6\x78\x51\x8b\xb6\xe3\x35\x6b\x26\x50\x79\x20\x4e\xae\x19\xa7\xe4\x4f\x52\x7f\xf6\x93\xbf\x64\x70\x97\xd5\xe4\x3f\x4d\xfe\x66\xe5\xe4\x80\xf7\xd7\xef\xee\x3f\x6e\x3e\x7c\xbe\xa0\xf9\x2f\x15\x8e\x8f\x77\xef\x6e\xbf\xfc\xde\x2b\xa5\xe1\x1f\x7e\xe5\x7b\xd7\xb6\x18\xfc\xa9\x86\x63\x7d\x65\xea\x99\xbf\x06\x1e\x4f\x39\x71\x41\x43\x5a\xa5\x0c\x47\x95\xe6\x61\x18\xae\xe0\xf9\x4d\x92\xb2\xf2\xf2\x66\x76\xd0\x85\xe0\x95\x2e\x52\x64\x6d\x28\x80\xe7\x61\x12\x61\x14\xe6\x34\xea\x7c\x68\x98\xce\xd3\xca\xda\x50\x01\xcd\xc3\x4e\x84\x49\x58\xf6\x0b\xef\x27\x49\xf2\xc7\xa9\xfe\x4a\x9d\xf5\xdf\x25\xff\x6b\xf2\xbf\x25\xea\x57\xea\xac\xb7\x7f\xa7\x3a\xeb\x5a\x66\xfd\xee\x6d\x39\x70\x2d\xb4\x2e\x7b\x5b\x77\xf6\xe9\xf3\xef\xc0\x73\x95\x35\x8b\xf5\x52\x5a\x56\xc7\xc7\x03\x11\xfb\x14\x61\x14\x8a\xaa\x42\xe9\x61\x2e\x72\x40\x50\x10\xd4\x82\x2a\xcd\xa9\x1f\x4d\x5d\x16\xaa\xe0\xbb\x8e\xd9\x66\x76\x26\x2f\x52\xc2\xa6\x60\x09\x75\xb8\xd0\x05\xdf\xf7\xac\x30\xc1\x09\x80\x6c\x68\x4a\xb1\x4f\x2b\x16\x92\x82\x43\x90\xc3\x3c\x4c\xa0\x2d\x00\xe3\x82\x31\x26\x5e\xea\xac\x13\x12\x4a\x96\x55\x55\x76\x2c\x58\x81\xbf\xac\xb3\x4a\xfa\xba\xce\xca\xc2\xd0\x22\x08\x39\x32\x8c\xb0\xe9\xa8\x2d\xf3\x47\x28\x85\x62\xb1\xcc\x2a\x9f\xab\xac\x49\xc4\x44\xe1\xeb\x2e\xce\xaf\xb7\xe7\x08\xf3\x53\xf2\xd7\x09\x4d\xfe\xdb\x58\xd3\x96\xc9\xff\xf9\x87\xdc\x26\xb3\x33\xc6\x71\xf3\xfe\x79\x60\xac\x5d\x0b\xf0\x5c\x27\x7a\x79\xf1\x5b\x10\x03\xbb\xf4\xfe\x2f\x3e\xfc\xf8\x5a\x16\xf9\x75\xaa\xb0\x6d\x25\x65\x9c\x09\xed\x7c\x98\x24\x61\x9c\x0a\x6d\x97\x97\x97\x77\xdd\x15\x7f\x6c\x7c\x56\x9e\xa6\xd4\x52\x4d\x69\xa5\xb5\xad\x71\x27\x04\xf6\x7e\x6e\x9c\xe2\xd0\xb4\x04\xf4\x4e\x89\x62\x79\xd1\xd9\xbc\x2c\x20\x54\x85\xe3\x25\x9d\x6b\x56\xc9\x92\xa5\x28\x3e\x05\xcf\x2a\x59\xd1\xf3\x57\x5b\xc7\x19\xa9\x88\x50\x52\x4b\xce\x30\xbe\xbc\x3a\xbf\x17\xea\xb9\x33\x80\xe4\x8c\x40\x24\xaa\x12\x23\x51\x21\x28\x4a\x1c\xd4\xec\xca\xd2\x60\x4c\xd2\xf1\xf9\xd5\x10\xa6\xb0\xa7\x14\x85\x49\x0d\xc0\x51\x46\x38\xc5\xf1\xb1\x23\x8c\x30\x8a\xe3\x63\x92\xe4\x69\xfb\x84\xaf\xeb\xad\x4d\xfe\xe4\xec\x2b\xfb\x4f\x9e\xb5\x70\x2f\x29\xd2\xb9\x55\xb2\xc2\x83\x36\x67\x5e\xc7\xf7\x3f\xac\xa3\xfd\x02\xf5\x5d\x7b\x6c\xaf\x6c\xf0\xbf\xbf\xb6\xfe\xe4\x3d\x18\xb1\xab\x60\x90\xe9\x2e\xec\x5a\x67\x86\xa0\x53\x7c\xa2\x8c\x95\x80\x80\x24\x4c\xe9\x38\xeb\xd4\xae\x5b\xc1\x75\x47\xeb\xd4\xec\x6a\xd5\x4c\x61\x2f\x9a\x23\x07\xc5\x36\x09\x93\xf7\xa0\xe4\x15\x25\x7b\x5d\x63\xcc\xa5\x9a\x61\xea\x8b\xdc\x55\x64\x98\x07\x21\x96\x7f\x3c\xa3\x94\x13\x8d\x4e\x90\xb2\xe5\x8c\x49\x89\x0d\x59\x71\x51\xe3\x93\x8c\xda\x21\x17\x0c\xf0\xbf\xfe\xc3\x08\x60\xb0\x3c\xc5\xee\xd7\xb3\xca\xdd\x57\xa0\xc0\xe9\x11\xec\xa3\xb2\xf2\x59\x0f\x0e\x8a\xac\x3e\x09\x9f\xaa\xd9\x65\xde\x9f\xb4\x07\xf5\x98\xa1\x20\x96\xdc\xaa\x62\xb5\xe1\x55\xa5\x14\x68\x02\x4f\x93\x47\x99\x26\x11\x09\xdc\xa1\x3a\xa2\x7f\x99\x52\x2c\x1c\xc3\x24\xd9\x53\x12\x86\x61\x00\x38\x4c\x4a\x49\x52\x40\xc4\x98\x96\x55\x59\xe4\x42\x47\x9a\x21\x2f\x72\x49\x92\x64\x1b\xfd\x75\xea\xb3\x3e\xdf\x3f\x8f\x99\xcc\x7f\xf1\x5a\x0b\xe2\x15\x25\xf5\xc3\xcd\xdb\xb2\xee\xcd\x6b\xc7\xfe\xdf\x81\xc8\x8c\xbc\x4c\xe0\xaf\x8b\x97\x69\x0b\x74\x85\x7c\x51\xa6\x24\x0c\x8c\x54\xc8\x61\x2c\x04\xe7\x2c\x38\xa6\x19\x81\x8c\x97\xc1\x57\x95\xe2\x0c\x47\x87\x16\x12\x46\xb0\xa7\x3a\x45\x8a\x05\x9b\x92\xb9\x5f\xb6\x4a\xfb\x41\x76\x19\x73\xce\x98\x7a\xd3\x09\x81\x18\xb3\x9e\x54\x84\x32\xc2\x4a\x57\x91\x50\x05\xa3\x58\x64\x47\x4a\xd0\x96\x95\xe2\x1c\x57\xb2\xc4\x4c\x79\x6f\xda\x79\x30\xc1\xeb\xd0\x89\xde\x3a\x59\xdb\x4e\xb6\x75\x92\xa5\x2a\xae\x8d\x22\xf9\x31\xf9\x37\x11\x2b\xfc\xfc\x61\x2f\x9f\xf9\xc3\x2b\x67\xd6\x22\xa2\x20\xee\xbe\xcf\x7e\x07\xde\xa5\x9b\x95\x44\xf0\x2a\x5b\x5d\x42\xeb\x8f\xdb\x37\xcc\x9d\x73\xb9\xef\xcb\xba\xc9\xa6\x29\x4a\x5a\x69\x22\x49\x2e\xb1\xc4\x92\x6b\x21\x2b\xed\x18\x6b\x1d\xc7\x15\x90\x61\xcf\xe7\x36\x45\xf6\x29\x01\x28\x1c\x4b\x80\xa5\x62\x1c\x0a\x56\xa2\x22\x34\xe2\xb8\x2f\x4b\x6e\x25\xa1\x8a\x10\x5e\x05\x93\x2a\xa3\x68\x19\x78\x4a\x45\xa5\x97\xac\xc8\x74\xbc\x51\x4a\x6d\x05\x63\x84\x12\xc9\x58\x2e\xc4\x72\x23\x63\x55\xed\x2a\x4d\x48\x17\xf6\x5c\x56\x6e\x1c\x00\x37\xe1\xe8\x03\x6e\x83\x1c\x72\x97\xb3\x23\xe8\x5b\x09\x73\x89\x23\x66\x80\x72\xfe\xe8\x09\xe3\xd2\xe8\x62\x20\x5c\x68\xc5\x35\xd7\x8c\x33\xb2\x72\xb5\x2e\x58\xc6\xef\x92\xdf\x26\x7f\x9e\xfc\xab\x15\x6b\xf4\x6c\x4b\xfe\xcc\x81\xfe\xf0\x3c\x28\xde\xbf\xdc\xfd\x6f\x60\xe3\xe7\xa1\xf0\x17\xd7\x1f\x50\xb6\xa7\x95\xf1\x06\x57\x4d\x85\x77\xee\x64\xfc\x5e\xd0\x2c\x3f\x1d\x57\xd7\x3b\x4f\xfb\x7d\x44\xc0\xa3\x79\x47\x95\xe4\x50\xaa\x72\x59\xd7\x03\x05\x5d\x37\x96\x60\xdc\x12\x69\x41\x19\x26\xad\x2b\xc9\x43\x37\x0c\x80\xb6\x41\x45\x91\xca\x5e\x17\xb9\xd4\x52\x1b\xce\xa0\x85\x78\x79\x29\x72\x93\x24\x59\x26\x9e\xa6\x2d\xca\x44\x1c\xd5\xff\xf0\x8d\xfe\xc8\x8a\x7c\xf9\xf4\x1b\x70\xf1\xe8\x7e\xb7\x45\x94\x56\x0c\x72\x58\x86\x11\x2a\x6d\xcd\x45\x2e\x33\x13\x73\xc1\x68\x6e\xf3\xd2\x34\x56\x3a\x40\x01\x3d\xea\xe0\x75\xb9\x6a\x69\x17\x71\x6e\xd4\x7f\x77\xec\xc1\xdd\xaf\x63\x0f\xec\xd9\x18\x21\x4d\x1e\x15\x38\x06\x13\x53\x66\x90\x9c\xa6\xac\x3f\x11\x9f\xba\x59\x5d\x36\x2f\x9b\x83\x98\xc0\xb4\xdf\xe1\xdd\xb4\x85\x42\x84\x46\x58\x2b\x22\xf8\x60\x9a\xf3\x14\xca\x30\x2c\xff\x9e\x12\xae\xb9\xc5\x02\x0b\xbb\x4c\x0b\x09\x48\xcc\x12\xb3\xa4\x74\xd5\xa3\xb9\xda\xfc\xda\xa5\xdb\x7c\x40\xdb\x9a\x86\x29\x44\x8c\x7f\x86\x4f\x03\xb7\x5a\x41\x63\xc8\x69\xc8\xf0\x0c\xd3\xfd\x2c\xcb\x74\x4c\xa9\x29\x72\xaa\xb1\xa1\x62\xb9\x08\xa4\x32\x58\x93\xdc\x24\xdb\xd4\x46\x0f\x47\x95\xdc\x9e\xcf\xca\x3f\x4b\xfe\xbb\x58\x4f\x59\xbb\x0a\x2f\x83\xe7\x9b\xcb\x7b\xdf\xbe\x7a\xef\xc3\xab\x8a\xdc\x4b\x76\xf2\xe9\xe3\x12\x7c\xbf\xb2\x51\xf9\x78\xb7\x4d\xae\xa3\x51\xc9\x68\x69\xa9\x84\xcb\x0b\x2d\x04\x13\xd4\x28\xaf\xd3\xca\xf0\x4a\xc9\x3a\x77\x5a\x48\x45\x8c\xb2\xaa\xd1\x50\x48\x3e\x0f\xba\x60\x92\x5c\x49\x7f\x72\x5e\x03\xbc\x84\xe8\xc7\x5c\x76\x4c\x15\x9a\x32\x58\x05\x5f\x85\x71\x60\xc0\xf0\xb0\xdb\x2a\x8f\x31\x93\x8c\x55\x5c\x6a\x49\x15\x97\x02\x24\x00\x37\xf1\xcd\xaa\x14\x56\x69\x61\x85\xe4\x20\x6f\xa1\x37\xd8\x48\xe4\x0c\x36\xf3\x31\xf4\x7d\x0f\x48\xb0\x6c\x99\x12\xab\x11\x39\x44\x4d\xb7\x0f\x87\xc2\xa2\x98\x3b\x6e\x53\x78\xe6\x2e\xa3\xe4\xfb\x57\x38\xb3\x95\x7c\xfa\xaa\x7b\x74\x73\x77\x73\xff\xae\x48\xaf\x3f\x24\x67\xa3\xb9\x9b\x28\x0d\x9d\x9e\xb5\x53\x2f\xa5\xec\x77\xd7\xbf\xff\xb0\xa1\x04\x81\xfe\x44\x5b\x0f\x8a\xba\xef\xe7\xae\x75\x4e\x83\x04\xec\x51\x05\xa2\xc5\xe0\x51\x52\x47\xc4\xac\xed\x32\x01\xa4\x92\x41\x8b\x28\x2f\x7d\xb1\x35\x8c\xbb\x30\x4e\xd3\x34\xb9\x50\x81\x51\x05\x1f\x68\x67\x00\x4c\x4d\x6a\x28\x99\xcb\xd0\x8d\xe3\x91\x80\x64\x84\x65\xd8\xf7\x74\xd7\x0d\x53\xb9\x1b\xe0\xb0\x83\x87\x6e\x99\x37\x9a\x33\xc7\xf3\x4f\xa3\x6a\xce\x3f\x4b\x12\xf0\x8a\xe2\xf9\x05\xc3\x73\xfb\x0b\x14\xcf\xef\xcf\x2c\xad\xbb\x6c\xc2\x99\x3c\x09\x54\xaa\x9a\x79\x94\xd1\xd3\x73\xc7\x33\x0c\x57\xd3\x69\x84\x28\xab\x84\xa5\x02\x59\x52\x56\x56\x85\x89\x1f\xa4\x53\xa1\xe3\x20\xd1\x35\x57\xba\x55\xe1\xb8\x71\x72\xde\x83\xb1\x2c\x79\x7b\xa8\xd8\x0b\xc3\xb3\xaa\x56\x8a\xa7\x06\x45\x68\xdb\x0b\xc5\x53\x8c\x86\x0b\xdb\xaf\x9c\xdd\x21\xea\xc5\xd9\xe4\x8f\x92\x7f\x90\xfc\xcd\x2b\xa4\x6b\xac\x2b\xbc\x4c\xf9\x1f\x3e\xbf\xff\xb4\x39\xfb\x35\x6d\xaf\xef\xbe\x50\x38\x7a\x15\x1d\xc4\x7e\xc9\xfd\x4d\xd4\xe1\x1a\xd3\x04\xc2\xba\x84\x69\xf2\xc8\xb2\x5c\x13\x21\xb9\x14\xba\x56\x5c\xea\x8e\xef\xe5\xac\x7d\xba\xf7\x01\xc3\x22\xc5\x4a\x12\x56\x6a\x4c\x43\x89\xa9\xf3\xd8\x89\xd2\x16\x70\x77\xac\x28\x39\x7a\xd0\xc3\x22\x88\xcd\x9e\x54\x15\xe5\x0e\x11\x4a\x09\x51\x8c\x8a\x4a\x55\x64\xb9\xd5\xf3\xa0\x81\x9d\xf7\x84\xcc\x9d\x10\x85\xcb\x19\x70\x46\xe6\x95\x2c\x7d\x5f\x11\x4c\xa0\x95\x7e\x36\x59\x41\xc8\x12\xe3\xed\x23\x36\x4f\x26\x7f\xef\xb9\x56\xbe\xdc\x89\xff\x6a\xad\x96\xaf\x8b\xdf\x5a\x33\xbf\xbc\x7e\x1d\x0e\x67\x67\xf7\xa0\x98\x87\x6f\xde\xaf\x8f\x11\x6a\x1c\x85\xce\xb2\x3c\x4d\x9c\xf3\xac\xeb\x83\x4b\x59\x7c\x4d\xbb\x2e\xb8\xc0\x09\xb2\x88\xa4\x53\x7c\x42\x3c\x2f\x26\x40\x59\x68\x76\x43\x18\x19\x50\x00\x8a\x29\xb4\x0c\x70\xa0\x45\xd8\x07\x4e\x41\x07\x46\x11\xda\x59\xb1\xd4\x6f\xe5\xcc\x1d\xc5\xb6\xe2\x20\xb1\x2f\x2f\x2b\x2e\x4b\xc9\xd6\xc7\xc0\x69\x51\x68\xe2\x59\xe7\xa5\x55\x42\xb6\x42\x4b\x24\x27\x63\x0c\x56\xa1\x51\x56\xaf\x3a\x37\xfa\x6a\xd8\xea\xe4\x8f\xa3\x1e\xd3\x8b\xf2\x4c\xf6\xbc\xcc\xad\x24\x92\xc8\x43\xcf\x2a\x0f\x4b\x80\x83\xa5\x42\xd6\x62\x2f\x41\x5d\x8f\x23\xa3\x58\x79\xb1\xdf\x2e\x2b\x93\xf7\x5a\xec\x67\x01\x90\x73\x61\xe7\x02\xae\xb0\xe6\x4c\xa4\x68\x5d\x57\xd5\x13\xdd\xe0\x6d\x79\xe6\x62\xfd\x79\xec\x78\xde\xdf\x2c\xfb\x5e\xd1\x8f\x9f\x57\xa4\xd4\xcd\xb2\x7d\xfa\x7c\x73\x9f\xaa\xb4\xe7\x14\x56\x95\x1b\x0f\x50\x88\xc3\x7e\xbf\xdf\x1b\xb9\xdf\x96\xf6\xb1\x2d\x6c\x91\x07\x0b\x58\x55\xfa\xe2\xaa\x8b\xc6\xb9\x14\xa0\xd3\x11\x42\x80\x97\xdf\x35\xc4\xb1\x28\x93\xcd\x4b\x2f\xff\xd2\xf9\xba\x94\x77\xdf\x18\x8b\x9d\x91\xce\xaf\x7b\x62\xd7\x15\x0b\x78\xd6\x55\x0a\x41\xd3\x08\xd9\x86\x72\x59\x9e\x01\xa9\x97\x18\x16\x54\x51\x18\x91\xa5\xa3\x0a\x0d\x27\x0e\xf3\x83\x58\xa6\x95\xad\xb4\x1c\x3a\x53\xed\x3b\xd7\xb9\xc0\x01\x9e\x77\x0c\x8c\x61\x00\x8d\xeb\xdc\x6e\x74\x0d\x69\x2d\x8a\x8f\x6b\xec\xbd\x7b\xa2\xd7\x76\xab\x9e\xfb\x34\xff\xe4\xe5\x48\xd3\x2f\x7b\x74\x37\xf7\x37\xd1\xd1\xe7\xd9\xff\xf7\x9b\xcd\xf5\x8f\xd7\x09\x0f\x74\x36\x55\x5a\x80\xae\x16\xda\xd9\x60\x25\xb5\x44\x4e\x8a\x79\x22\x53\xe6\xdb\x23\x07\xd4\x05\x0a\xa2\x2c\x09\xee\x41\x29\x0e\x5b\xe5\x39\x74\xae\x0a\xfb\x9e\xed\x5a\x53\xd3\xda\x16\xbe\xa7\x5d\x73\x1a\xe6\x36\xc5\x4f\x89\x75\x0d\x40\xbe\xef\x7d\xd8\xd9\xd6\x45\xef\x75\x7a\xad\xb7\x55\xd4\x28\x8a\x9a\x8b\x45\xf6\xe1\xd3\x33\xf2\x1f\x5c\xfa\xd4\x17\x17\xcd\xe7\xf3\x9a\xd9\xbd\x33\x72\x59\x64\xfa\x8c\xcc\xa5\x9b\x7c\x5f\x87\xfa\xe8\xdc\x69\xf2\x20\x09\xfe\x8a\x87\x6e\xde\x05\xce\x8f\xc0\x02\x98\x1e\x43\x09\xd8\x10\xc6\xd0\x45\x89\x41\x1a\xaa\x40\x01\x9d\x27\x0e\x96\xb7\xba\x55\x9b\xa9\x79\x22\x51\x53\xed\xbb\x88\xc6\xfb\x25\x6f\xcf\xed\xaf\x9a\x7b\x0e\x0e\xa2\x8c\xd0\xaa\x63\x1a\x35\x84\xc3\x72\x2e\x98\x52\xbd\xb1\x10\x81\x63\x88\xc0\xef\xc6\x9e\x8e\xae\x0b\x0e\x28\x43\x98\xee\x56\x77\x4f\x16\x8e\x63\x51\x17\x7a\x77\x95\xac\xee\x9e\xb8\xfa\x9a\xbd\xa7\x4f\xce\x9a\xca\x3e\x1e\xe7\x73\xd7\x6a\x5d\xbb\x5f\x0a\x67\x9b\x5f\x2e\x9c\x2d\xa9\x06\x06\x43\x5e\xe7\xa0\x09\x38\x2f\x8e\xbb\xff\x9b\xb8\xff\x07\x92\x1c\xd7\xd6\x03\x71\x82\xcc\xcc\xe2\x95\x5e\xfc\x2e\xab\x7b\x7a\x9a\x57\x7a\x7f\x50\xaf\x67\xa6\x79\xf5\x7b\x21\x51\xea\xdb\xdd\xdc\xa7\xd5\x5b\xac\xa4\xdd\x40\xbc\xdd\x55\x60\x0d\x6d\x20\x76\x1d\xc4\x5a\x88\x58\x07\x26\x4c\x98\x30\x61\xc2\x84\x49\x93\x26\xcd\x34\xd3\xa4\x49\x93\x66\x9a\x69\xe6\x9d\x2a\x9e\xda\x20\x98\x59\x5d\xd5\xd3\x73\x9f\x14\x4f\x11\xdb\x3d\xec\xca\xaa\xc9\xa8\x04\x41\xe0\xe0\xfc\xf9\xce\xf7\x91\xd3\xc9\xc1\x51\x21\xc5\x41\xb2\x4d\x17\xb8\xe5\xac\x14\x82\x3c\x38\x9b\xf2\xb9\xb5\x51\x5d\xba\xe3\x4a\x71\x57\x62\x69\x5d\x90\x81\x5b\xd5\x41\xe3\x66\xaa\x78\xe1\x0b\x9a\x06\x0b\xb5\xeb\x9f\x8d\xed\x1f\xd6\xf5\xfd\x35\xe1\xdc\xac\x42\xbd\x47\x47\x28\x51\x07\x2c\xc5\xf7\x0c\x9d\x97\xb9\x02\x9a\x1d\xa5\x20\x1c\x2b\xd2\xcc\xd6\xfb\x6b\xd7\xce\x2e\xd1\xda\x1a\x6b\xec\xf2\xcf\xac\xae\x7a\xbe\x0d\x4c\x59\x78\x4c\xcc\x5a\x4b\xdb\xa5\xfe\xc2\xb1\xb8\x76\x6b\xfe\x75\xf2\x3e\x32\xb5\x7d\xc1\x9d\xc7\xa2\xcc\x87\xc8\x58\x9b\x5d\xfb\xbb\x3e\x5c\x62\xb4\x8f\x68\x79\xb8\x9b\xb6\xab\xaa\x34\x87\x23\x0a\x20\xfc\xdc\xd8\x5e\xc2\x80\x68\x17\x99\x21\x3a\x84\xe7\x7a\xc2\x05\x9c\x50\x57\x94\x88\xc2\x51\x52\xb3\x33\x35\x6d\x1e\xfc\xd9\x81\x40\xc1\x49\x97\x49\xf0\xe3\x38\xce\xbd\xd4\x5a\x4e\xb3\x3f\x3b\x19\xd7\x9d\x8f\x67\x84\x4a\xfe\xf5\x8a\xd6\xf8\x74\x95\xdd\x8f\xd7\xbb\x18\x53\xbd\x2c\x1c\x5d\x35\x4b\xd6\x0e\xa3\x38\xc4\x0f\x6f\xee\x62\x97\xd3\xa1\xc8\x5d\x81\x0e\x50\x60\x74\x80\xbc\x4e\xfd\x24\xf7\xda\x40\xbf\x84\x03\x1e\x30\x9a\xa0\x23\x54\x75\xfa\x80\xea\x06\x8e\x88\x55\x20\x90\xa4\x12\xe5\x1e\x95\x92\x6e\x27\x4a\xb1\x72\xd6\x69\x67\x94\x53\xc2\x3b\xe8\x10\x73\x9e\x91\x46\x5b\xef\xb4\xb3\xf3\xa4\xe5\x12\x32\x5d\x6d\xcc\x4b\xbd\xa2\xe7\x7d\x59\x2f\x86\xfc\x92\x07\x78\xfd\x9a\x95\x68\x8a\x94\x6b\x31\x42\x29\xe6\x93\x5b\x4d\x1f\xea\x00\x1f\xe2\xac\xb6\x08\xcf\xcd\xf5\xd5\x76\xf2\xde\xb9\x87\xc9\x39\x38\xa0\xc6\xb9\x0c\x3b\xa8\xfa\xbe\x87\xa4\xef\x57\xfe\x88\x26\xe2\xde\x56\xbe\xa5\x32\xf9\xf3\x95\xa1\xf1\x9a\x5f\xf8\xb5\xd5\x26\xb3\xfe\x81\xfa\xd4\xce\x3a\x63\x4a\x72\x8d\x3d\xa3\x73\xe9\x7d\x7a\x8c\x5e\x78\xb9\xa3\x50\xb8\x01\xca\x07\xb2\x2e\xac\x00\x6a\x63\xe1\xd0\x42\x15\x92\x64\x97\x15\x31\xa6\x93\x4f\x76\xf6\x6f\x56\x85\xdb\xaf\xd0\x10\xef\x2f\x69\xc4\xab\x96\xe9\xf3\x4d\xb9\x1e\xf8\x37\x15\x03\x3a\xdb\x26\x2d\x50\xe7\xb8\xb6\x06\x5a\xd5\x84\x5a\x1c\x54\xed\x1b\xd1\xa4\xa3\x5f\xe6\x81\x3b\x2d\x4b\x6d\xd8\x5c\xa1\x4a\x35\xa1\x91\x3b\xe9\x55\xe9\x55\x73\x0c\x74\xaf\x43\xdf\x1c\x7c\xe9\xba\xba\xf3\x80\x9d\x73\x73\x7f\x11\xf0\xac\xf9\x45\xa4\x70\x9b\x95\xf1\x99\x7d\x39\x17\x3e\x7c\x3d\xda\xc5\xd5\xfd\xf1\x3a\xda\x35\x18\xbf\x00\xf9\x5e\x40\x08\x73\x06\x6a\xde\xd7\x68\x44\xbd\x63\xc2\x69\xe8\x68\xa8\xe1\x2c\x88\x6b\x44\x9d\x26\x41\xcf\x24\x0b\xbe\x47\x23\x54\x4a\x31\x56\x12\x26\x20\xd9\x29\xc7\x0a\xdf\xd6\xa3\x63\xad\xf2\x6d\xd9\xdb\xc2\x7a\x12\xf4\xc3\xa4\xa4\x70\xc1\x99\xd2\x41\x58\x0b\x2d\x88\xac\x36\x59\x3d\xf2\x1b\xbf\xab\xbf\x3c\xcd\x98\x8b\xff\xfe\xdf\xa2\x9b\x77\x38\x02\x7e\x22\xd0\xf0\xfb\xb7\x6b\x22\x32\x53\x59\x80\xc8\x8b\x65\xfb\x7d\x63\xa1\x07\xaf\x98\x36\xa8\xac\x7c\xd9\xc8\x00\x2a\xe6\x88\x76\xf5\xcc\x61\x70\x20\xca\x36\xb4\x7b\xaf\x91\x40\x7b\x3c\xf4\x1d\xc9\x6a\x87\xec\xd5\x4f\x65\x17\x0d\xc2\xbf\xf9\xa2\x74\xba\xbd\xd6\x02\xbe\x29\x8a\xf6\xf1\x36\x52\xb5\xde\x5e\xc4\x65\x76\x42\x34\xb6\x66\x33\x46\x63\x64\x39\xa8\x34\x77\xd6\xf4\x93\x3c\x1e\xb8\x51\x02\x4b\xc5\xf7\x27\x85\xf8\x01\x2a\x1f\x95\x62\x77\x3a\xa2\x52\x22\xdf\xa6\x03\x5d\xf9\x8e\x4f\xf6\xd4\xbb\x01\x95\xf3\x49\x89\x32\x60\x81\x26\x98\xf6\x06\x61\xc4\x90\x32\xbe\x63\x6d\x58\xce\x83\x10\xf3\x51\x26\x7a\x24\xf5\xd3\xd9\xb5\x0a\x03\x7d\x05\x7a\x7c\xb7\x72\x20\xc6\x34\xe2\x9a\x36\x7f\x7d\xb5\x72\xb7\x1b\xe2\x4b\x9c\xe6\x4c\x20\x0a\x7b\x4c\x44\x53\x78\xac\x3a\x2f\x2a\x05\x54\x23\x2f\xa0\x2d\xb1\x40\x05\x52\x8a\x83\xe0\xbc\x99\x70\x0e\x67\xd4\xe6\x25\xa2\x3b\x83\x29\xb5\x46\xce\x2d\x54\x55\xc9\xfa\xe6\xac\xd9\x12\x66\x53\x38\x2f\x21\x12\x5d\x1c\x73\x79\x3c\x08\x63\x04\x34\xae\x6d\x1d\x6a\x92\x74\x2b\x1e\xcd\x0d\xdb\x0e\x11\xb1\x19\x73\x9e\x57\x5e\x97\x1b\xe6\x0e\xde\x1f\x0e\xdb\xe1\x8f\xbd\x75\x3b\xf6\xf3\xb0\x09\x11\x6f\x4a\x6e\xcc\x85\x5f\xe5\x59\x5d\xe6\x89\x0e\x3a\x66\x13\xb3\x1a\x8d\x61\x59\x76\xc8\x84\xd9\x07\x64\xa1\x3a\xa5\x72\xf6\x9b\x13\x32\x60\x3c\xa8\x07\xed\x5c\x66\x91\x7b\x28\xd0\xca\xc9\x98\xa8\xd4\xde\x84\x9d\x48\xbe\x8f\x38\xd6\x0f\xb7\x3f\x7c\x7e\xbb\x7b\x6a\xde\xd8\xdd\xec\xee\xfe\xfa\xa7\x8f\x2b\x54\x61\x2d\xb3\xfd\x9b\xa8\xfa\xfb\x79\xa3\x03\x6a\xbc\x9c\xa0\xa5\x6a\xe0\x85\x2f\x29\x81\xe1\x24\xe7\x7d\x58\x0e\x4c\x44\x4b\x58\xc2\x8b\xa6\x09\x5c\xec\x04\xb4\xca\xb8\x20\x87\xaa\xa2\x5d\x75\x26\x0d\x93\xe9\x79\xf4\xd0\x32\xe7\xea\x2e\x4f\xf9\xdc\x17\x79\x92\xa0\xb4\x4d\xdc\xb6\x8e\xba\x8b\x09\xba\x0a\xb9\xbc\x8e\x64\xae\x6f\xd3\xec\xd3\xe7\xf5\xdf\xf7\x9b\xc0\x1b\x87\xf7\xc7\xda\x1b\x65\xaa\x56\x7a\x19\x04\x13\xbe\x1b\x8c\x22\xa9\xec\x06\xa2\x78\xad\x07\xd4\xd4\x65\x40\x15\x3a\xd6\x40\xe0\x94\x97\x28\xa9\x21\x87\x01\xd7\x2b\x8e\x2d\xed\x2e\xf9\xa8\x95\x4f\xf9\xed\x2f\xf8\x94\x5f\xa1\xb7\x69\x24\x54\xde\x26\x6d\x8b\x6c\xab\x9c\x68\xe7\xc9\x33\xe3\x6d\x96\x84\x00\xc9\x12\x3b\x58\x74\xd8\xe9\x7b\x9a\x1d\xe1\x04\x07\x86\x6a\x54\x92\x06\x38\x8c\x02\xd5\x70\x68\xa0\x05\xa1\xbd\x44\x6a\x99\x67\x83\xc6\x4d\x19\xcf\x8b\xbf\x79\xc1\x7b\xb2\x72\x3e\x5c\x51\xdc\xcf\x34\x9f\xdf\xfc\xb8\x72\x33\xdd\xed\x11\x09\x88\xc0\x1e\xe9\x96\xd4\x86\xf0\xb3\xd0\x92\x91\x80\x0c\xec\x0b\xc4\x2e\xbc\x85\x25\x58\x88\x4c\x63\xdd\x2e\x57\xca\x28\x43\x28\x53\xd2\x31\x4e\xa8\x51\x50\x38\x67\x4c\x65\x9a\xda\x63\x9b\xa0\xa8\x6f\xe9\x76\x3a\xf9\xf1\xaa\xb9\xb3\x8a\x0b\xbc\xd0\x96\x8f\xca\xb5\x9f\x2e\x58\xf1\x4d\xe3\x4b\xec\xfd\xf2\x68\x73\x14\x40\xed\x51\xc2\xe1\xd4\x1a\x18\x15\x22\x02\x3c\xb2\xf9\x40\xb9\x0a\x3b\x8c\x95\x44\x0c\x3a\x7f\x14\xdc\x01\xed\xdb\x11\x75\xa0\xce\x16\x95\x48\x3b\xc1\x8f\x9d\x8e\xb2\x45\x09\x8a\x9c\xa2\x36\xf2\x2f\xfc\xda\x18\xd0\xd3\x18\xee\x6e\x96\x45\x90\x29\x57\xe2\x63\x58\x3c\xa3\x3c\xcd\xa1\x38\x22\xc2\x21\x8c\x01\xa4\x40\x41\x43\x83\x4e\x05\x4c\xb4\x22\xaa\x7b\x3e\x0c\x16\x80\x76\xed\x84\x7a\x90\x70\x76\xa8\x44\x2a\x70\x7e\x6c\x29\x37\xe8\x52\x4f\xae\x37\x7c\xa7\xaf\xac\x65\x2f\xc6\x71\x71\x28\x9f\xcf\x46\x1c\x09\x6a\x7c\x51\x76\x01\x61\x98\x2e\x15\xd8\xc1\x49\x17\x1c\x4c\x1c\x31\x01\x12\xf5\xc5\x44\x70\x6d\xfd\x2e\xa9\x39\x8b\x03\x39\x48\x19\xaa\xaa\x0d\xae\x73\xd0\x1e\x1d\xaa\x90\x0a\x52\x1e\xf6\x94\x09\xb4\x18\xf7\xa8\xe3\xe4\x76\x2a\x72\xbc\xbf\xdd\xdd\xbc\xbb\x7d\xb3\x32\xb7\xa6\x4f\x13\x11\xed\xd6\xee\xa8\xda\x61\x71\x5e\x95\x41\x58\x1f\xad\x5e\x7c\x57\xd6\x80\x41\x56\x07\x9e\x96\x3b\x65\x49\x0d\xa2\xf2\xf3\x04\x27\x8f\x8a\x65\xb6\xe0\x64\x11\x47\x47\x8f\x42\x59\x58\x96\xa4\xe9\x21\x9d\x22\x0f\xed\xf7\x2b\x4b\xd9\x05\xa2\xf8\xa5\x15\x68\xf7\xee\x3d\x5e\x55\x74\x76\x03\x69\x0f\x45\x89\x4e\xf3\x68\x41\x4b\xd4\x38\x90\x68\xc2\x79\x3f\x54\x68\x1f\x4e\x7b\x79\x18\x77\xda\xe0\x82\x53\x07\x27\x61\x48\xe7\x08\x2b\x2c\x60\x65\x75\x90\x17\xfc\x2f\xbb\x09\x1b\xb7\xde\xd7\x66\xbb\x7b\xbe\xc6\x62\xd4\xf5\xe9\xf3\x4a\xe2\xc7\x60\x82\x90\x17\x19\x9b\xf3\x90\x1a\x3e\xcb\x5e\xce\x95\x48\x5b\x3e\x57\x59\x52\xe6\x30\x42\x5f\xa7\xfd\xc6\x39\x5a\x39\xe5\x21\xb4\x61\x8f\x02\x98\xc9\x1f\x10\xf5\xd2\x94\x85\x5f\xf9\xd7\x96\x79\xcc\xc2\x65\x1e\xbf\xfa\xbc\xcb\xed\x2d\x27\xfe\x99\x1f\xe1\x94\x17\x59\x3d\xe3\x90\x0a\x3e\xbb\x83\x9d\x85\x4a\x8d\x9e\xeb\x2c\x2f\xf3\x33\x1c\xeb\x74\x39\xc5\xab\x42\x71\xff\x98\x98\xe0\x11\x87\xbe\x75\xfe\xec\xb9\x28\x72\xbf\xac\xe1\x3c\xee\x23\x16\xed\xd5\xdb\xdd\xf6\xf6\x12\x3e\x26\x2f\x1e\x19\xde\xf5\x6c\x82\xd3\x62\xe5\x86\xe5\x20\x31\x53\x00\xaa\xd0\xa4\x20\x49\xf1\x61\xaa\xd3\x7c\xc7\x7c\x8d\xe1\x60\xfc\xbc\x9f\x3a\x94\xa4\x05\x54\x70\x70\xeb\x23\x6b\x8b\x3c\xc4\xfd\xd2\x5e\xf8\x73\x2e\xc8\xf4\xdb\xaf\xb7\xea\xe7\xdb\xed\xfb\x1f\x76\x67\x3a\x1e\xd1\x04\xc4\x2c\xf1\x4c\xdf\x6a\x60\x1a\x1d\x09\x48\x14\x72\x70\x4d\x5a\xec\xb8\x6b\x2a\xa0\x7e\xee\xc6\x76\x40\x67\xa8\x4e\x06\xe5\x29\xf5\x1c\x91\xda\x47\xfe\x45\x8e\xc6\x78\x1e\x2c\x2b\x63\xcd\xb6\x3c\x9f\xc4\x77\x4f\xb3\x98\x75\x30\xc0\xb9\xca\x6a\x74\xd0\x27\x30\x65\x93\xf1\xf9\x30\xa0\x4e\x01\x9e\xf6\xd3\x3c\x50\xd4\x8d\xf3\x21\x6d\x9b\xad\xc6\xb9\x2f\x85\x6e\x6a\xa3\x3c\x9c\x9d\x8d\x71\xe0\xde\xf9\x93\x97\x51\xe3\x83\xde\x88\x5d\x7e\x59\x8b\x5f\xa4\x64\x3f\xbf\x7a\x7d\x17\x0d\xf0\xab\x48\xd8\xb5\x84\x97\x2e\x1b\x0a\x37\x28\x5f\xb6\x4a\x60\x96\xc3\x69\x59\x14\x93\x42\xd5\x19\x0c\x75\xd8\x18\xb5\xcb\x7f\x9e\x40\x62\x8f\x1d\x52\x99\x7d\x18\xe6\x71\x30\x87\xb4\x49\x5b\x38\x62\x38\x9e\xc8\x79\xf5\xab\xba\xf4\x74\x63\x77\x24\x6a\x23\x26\xe8\xee\xcd\x45\x2e\xfb\x59\xb8\x1b\x73\x87\xaf\x5e\x5f\x5a\x62\xb2\x24\x33\x52\x10\xdb\xd0\x5c\x05\x4a\x31\xe7\xac\x28\x47\x0c\x4c\x0e\x7d\x01\x9e\x98\x86\x1b\xbe\x23\xe7\xba\x3d\x90\xde\x81\x0f\x4b\x58\xa8\x90\x98\xa7\xd6\x50\x94\xa0\x84\xd5\x9d\x61\x7a\x8d\x77\xd2\xe1\xa6\xde\x35\x11\x5d\x94\xa0\x67\xf9\xca\xd7\x77\xeb\x8e\x58\x3f\x32\x3d\x6f\x1a\xdd\x52\x55\x2a\x46\x9b\x02\x06\x3a\x9f\x44\xd4\xe7\x8e\x8c\x78\x7a\xd7\xcc\xe1\x54\xd9\xd2\xa0\x76\x3e\x0f\xb6\x43\x41\x61\x6f\x88\xb9\xc4\xf2\x69\x7b\xa3\x77\xab\xce\x68\x82\xee\x76\xbf\xbc\xc1\xd7\x5f\xdd\x60\x9e\xe9\x9c\x4b\xe2\x6a\x5a\x70\xc7\x44\xa9\x69\x5d\x54\xf9\x11\x43\x2d\xc6\xa1\x80\xb6\x76\x15\x71\x74\x47\x3b\x5b\x6b\xc7\x95\x84\xb6\xc7\x1e\xd3\x0e\xd9\xd9\x77\x7a\x39\xf9\xb0\xae\x7b\xc3\x5c\xec\x8d\x49\x5e\x3e\xd3\x2f\x89\x84\x57\xaf\xef\x8a\xe5\x83\x93\xe5\x83\x97\x43\x36\x93\xd9\x99\x36\x7b\xa6\xb1\xe1\x8c\x96\x30\x4c\xd0\xcb\x01\xe1\x1c\x96\xc3\x4b\x39\xb3\xcb\xef\x6b\x38\x0d\x65\x5b\xa2\x6a\x43\x67\x32\xbb\xb3\xf1\x69\x91\x25\xa7\x1a\x0c\x9c\x19\x6a\x96\xe9\x5d\xfc\xd5\x0d\xfe\x12\x83\x5d\x1d\xbf\xf4\x4a\xfd\xf6\xe6\xbb\x27\x53\xfe\x45\x9f\x05\xe5\xe8\x1c\x52\x59\x51\x5a\xe7\x21\x27\x75\xdf\x31\x68\x9a\x61\x6f\x42\xd7\x02\x51\xa8\xb7\x6d\x2f\xda\x80\x73\xc8\x33\xdd\xb6\x0f\xfb\x0a\x8b\x73\x0d\x47\x41\xa9\x4a\x87\xa2\x75\x4a\x5b\x25\xe1\x14\xb4\x3b\x0b\x6a\x28\xd3\x76\xc5\x28\x3d\x1b\xcf\xeb\x67\xe3\x79\xfd\x27\xc7\xf3\xf1\xee\x90\xe2\x90\x9a\x17\xc3\xc1\xd5\x70\x30\x6d\xd7\x2e\xfb\x38\xb8\xfd\x41\xf4\x1d\x9e\x8f\xd7\xd1\xf0\xc5\xa9\x39\x72\x16\x87\x13\xac\x54\x56\x71\x98\x82\x71\x67\x4e\x0d\xa1\x72\x39\xeb\x9b\xe4\x1c\xf1\x3c\xd5\x95\x23\x32\x8e\xe5\xf5\x2a\x0d\xf0\x3b\xf4\xee\xbb\x2f\xa2\x28\xaf\x2f\x03\x79\x97\xd9\x93\x47\x0a\x63\x82\x6d\xa9\x84\x94\x53\x29\x85\x24\x94\x8d\xea\x40\x95\x91\x9c\x15\xa7\xad\x3d\x9d\x66\xdf\xf7\xa8\xc4\x8f\x49\x18\x10\x45\xc3\xd0\x0a\x61\x18\x81\xa9\x53\x2d\xaa\x05\x53\x0d\xd1\x2e\x59\xed\x24\xb9\xd9\xef\x74\xf2\x2f\x56\xdd\x8b\xf4\xb6\x78\x75\x1d\x42\x7a\x5b\xbc\xbe\x2b\xbe\x4c\xc6\xeb\xeb\xc3\xf9\x78\xb7\xc9\x3d\x1a\xcb\xba\xa1\xcb\x3a\x17\xc6\x16\x30\x54\xce\x2a\x29\x35\xb4\x1a\x09\xe1\xbd\xd4\xba\xc8\x61\x44\xd5\x4e\x43\x00\x06\x03\x4c\x70\x44\x35\x86\x73\x87\x2a\xd4\x2f\xce\xf7\x63\x32\x58\x6f\xb5\x02\x72\x32\x27\xd4\x5b\x2d\x99\x08\x7b\xbf\xfa\x20\xc7\x8b\x1f\xf4\x2b\xe3\x7a\xf7\xcb\x71\x2d\x0e\xda\x46\x05\xe4\x8a\xb2\xac\xb1\x29\x05\x17\x2a\x3f\x62\xad\x24\xe3\x02\x4e\x0a\xe5\xcc\x58\x25\x78\xf1\x62\x54\x47\x98\x96\x51\x9d\x02\xc2\xeb\xa8\xe0\x34\x1a\x67\x94\x00\x7e\xd4\x27\xb4\xb7\x4a\x52\xee\xfb\x78\xa6\x9c\x53\xf2\xe5\x79\x5d\x9e\xd6\x25\x82\xc9\x3e\x7e\x45\x01\x1e\x67\xea\xdd\xc7\x0f\x9b\x10\x90\x2c\xca\x1a\xdb\x52\x72\x21\xf2\xa1\x20\x82\x2b\xca\xe5\x5e\xf5\x92\x52\x4e\x9b\xaa\x38\x9e\x76\x7a\x02\x17\x42\x8b\x7b\xbd\x47\xd5\xd8\x5b\xc6\x35\xa7\x86\x2b\x66\x9a\x5a\x55\xb5\xd0\x3e\x41\x99\x48\x93\x1b\xb7\x2d\xaf\x9f\xbf\x7b\xf3\x6c\x00\x1f\xff\xf0\x79\x1d\xc1\xb5\x4e\x71\xfd\xfc\xbd\x43\xb4\xc4\xb8\xc1\xba\x14\x5c\xca\xbc\xcd\x6b\x4a\x84\xe2\xad\x0a\xdc\x31\x4a\x8a\xfc\x74\xde\x96\xea\x60\xa5\x3c\xe0\x5e\xbb\x03\x57\x56\x36\x8d\x14\x8a\x48\x22\x85\xac\x6a\xc2\xd7\xbd\x93\x91\xc8\x83\xb9\x6a\x9c\x5d\xf0\x33\xb7\x3f\xbe\xdd\x7e\xbd\xa3\xb7\xef\x7f\x5c\xae\xcd\x18\x0e\x3d\x1d\x4f\x69\x5e\xcc\x47\xa2\x0d\xc9\x7d\x41\xaa\xe3\x51\x81\x29\x91\x87\x43\x83\xd4\x4e\xc3\xa9\x26\x96\x36\x50\x91\x40\x20\xa9\x30\x3b\x56\x30\xb2\x86\xca\x14\x57\xbe\x46\x07\xe2\x63\xbc\x8d\x36\xc9\xa3\xbd\x71\xdb\x53\xe4\xe7\xbf\x7b\x83\x96\x7b\xff\xb7\x28\xee\xdb\xdd\xff\x1f\xe1\x9f\x3e\xfe\xe1\x35\xba\xdb\x24\x59\x3e\x1f\x0a\x7e\x50\x9c\x14\xbe\x30\x5d\x78\x4c\xbc\x43\xed\xdc\x6d\x4f\xfa\xde\x54\xbc\xa9\x18\x2a\x6a\x38\x58\x69\x35\xc2\x19\x4d\x10\xaa\x1e\xcd\x8d\xca\x4e\xab\xc5\x7f\x93\x6c\xde\x7c\xf7\xfd\xdd\x95\xcd\xf8\x1d\xfe\xe1\xe3\x1f\x3e\x7f\x42\x77\xa8\xde\xaa\x87\x0e\xda\x03\xf2\x0a\x09\x5b\x74\x78\x0f\xee\x30\x8f\x70\xd6\x63\x3a\xde\x4f\xd9\xc9\x42\x7d\xae\xeb\x5a\xf6\xcd\xd1\x69\xcd\x78\x87\xd6\x75\x8c\xea\x47\x71\xc3\xb3\xf2\x32\xee\x6f\xfc\xfe\x1f\xd0\x1d\x32\x9b\x76\x2e\x61\x3c\xa0\x4e\xa1\x4a\xe5\x3d\x6e\xe1\x70\x98\x7b\x38\x22\x9c\xf2\x87\x31\x2b\x1d\x84\xbe\xc6\x95\xec\x96\x5f\x2f\xc9\x01\xd5\xcb\xef\xce\x1f\xf9\x8d\x4a\x9b\xe8\xe3\xbc\xf9\x33\xf4\x66\x95\x73\xf8\x1f\x56\xaf\x31\x76\x70\xfd\xe1\xc7\xbb\x8f\xbb\x64\x1e\x80\x5a\x74\x40\x1d\x6f\xca\x22\x34\xb8\x52\x06\xe4\x1c\xfa\x74\x7c\x98\xd2\xc6\xeb\xa1\x29\x8b\xa2\x10\x9c\x8c\x65\x95\x97\xd4\xec\x0f\xd1\x36\x5c\x7e\x7f\x88\x73\x73\xfd\xfd\x7f\xe2\xd7\x1f\x74\x51\x86\x06\xd7\xdc\x82\x98\x7d\x97\x9e\x1f\xf6\x69\x08\xee\x44\xab\xb2\x96\x92\x9c\xcb\x3a\x2f\x99\x9b\x4e\x3e\x49\xd2\x4d\x99\x0c\x37\x7c\xa7\xbe\xf8\xb9\xcf\x68\x1c\xaf\x39\xed\xd7\x17\x14\xbd\x2f\x2b\x34\x91\xba\x15\x1c\x2b\x49\x8b\x12\x2c\x93\xb2\xb7\x86\x19\x6a\x76\x0a\x2b\xf1\xe0\x7a\x8b\x1d\x96\x21\x35\xad\x92\x67\x18\xdb\x9e\xf6\x21\x9e\xb7\x8b\xcf\x49\x9e\xfb\xd3\x77\x45\xfa\xd5\xe7\xbc\x5a\x3f\x27\x3b\xb4\x15\xc9\x1a\xd2\x76\xce\x55\x6d\xf0\x25\x99\xb1\xd0\xfa\x38\x74\x3a\x88\x6e\xa7\x2b\xef\x1e\x06\x48\x5a\xdc\x62\x39\x66\xac\xd3\x0a\xe5\xe0\xf7\x23\x1f\xf7\x49\x9a\x9e\x2f\xba\x27\xcf\x3e\xe7\xeb\x1c\xfd\xe5\x73\x36\x3c\x60\x92\x1e\x58\x33\xca\x50\x8d\x5c\x94\x64\x76\x42\xeb\xd3\x5e\x33\xcf\xd4\x4e\xe3\xe0\xee\x8f\x8f\xc9\x01\xb7\x58\x0c\x99\xea\x8d\x46\x25\xa8\xfd\x48\xa6\x2e\x41\xf1\xfc\x0e\x2f\x75\xad\x8a\xec\x39\x26\xf6\xf3\xab\xb7\xaf\x6e\xef\x32\x95\xd6\x11\xf9\x19\x8e\x08\x53\x18\x8e\x7b\x18\x39\xaa\xda\xce\x18\xe5\xd5\x3c\x6e\xce\x6b\xd6\xa1\x80\x69\xb2\x4e\x9f\xcf\xd6\xb9\xf1\x88\x78\x03\xc7\x03\x4a\x62\xb2\x69\x93\xc8\x47\x7d\xe3\x52\x77\xc9\xc9\xdd\x5d\xb3\x4d\x3f\x46\x3d\xc3\x58\x88\x7e\xf5\xbc\x51\x68\x59\x11\x9b\x4a\x53\x4f\x54\x7a\xe8\x74\x2b\xdb\x7b\xde\x09\x1d\x2c\xd2\x1d\xdd\x9f\x79\xde\x16\x16\x3c\x1c\x43\xea\x7c\xe0\xc1\xd7\xd3\x63\xc2\xce\xa7\x92\xc0\x7e\xe4\x28\x19\x81\x62\x4c\xda\x66\x52\x54\xac\xbe\xd2\xf8\x48\xbf\x5e\x23\x5f\xcf\x69\x72\x99\x53\x19\x2a\x92\xf6\x8c\x1c\x55\x87\x27\xa1\x30\x99\x83\xb2\x06\x15\x9d\xe1\x9e\xd9\x9d\xc2\xde\xdd\x9f\x1e\x93\x61\x79\x78\x87\x4c\xed\xad\x42\x25\xd8\x6e\xa4\x53\xd4\x3a\xbb\x89\x1c\xd5\x7e\x47\x2f\x58\xf7\x1f\x92\x2a\x32\x27\x46\x86\xd1\x15\xdb\xfd\xfe\x4b\x6f\xcd\xdd\x57\xe8\xa9\xcf\x5f\xa1\xa4\x0e\x99\x02\x8d\xd1\xe1\x7e\x40\x7b\x0c\xfb\xc8\xe6\xb1\x5c\x3e\x53\xd0\x32\x13\x49\x12\x1b\x30\x2e\x65\x73\x57\x7b\xae\xac\x49\x3b\x49\x2d\x11\x3b\x3a\x8f\xd2\x5a\x89\x18\x87\x91\xcf\x23\x28\xe8\x05\xc3\x16\x13\x54\xeb\x00\x5d\xbd\x37\xd4\x2b\xa1\xa9\x92\x49\xf2\x9b\xa8\x5d\x30\x3e\x8d\x79\x45\xa3\x5c\x10\x05\xaf\xff\x24\xf7\xdf\x9a\xc4\xff\x46\xb6\x77\x85\x5e\xe8\x0d\x87\x16\xd5\xf7\x67\x54\x41\x97\x6a\xbf\xc2\xed\xbc\xf5\x0f\x87\x2c\x3c\x08\xbd\xd1\x50\x52\x29\x19\x96\xaa\x80\x22\x93\x96\x3b\x66\xe6\xd1\x0a\xaf\xfc\x8e\x3a\x0b\x25\x3a\x5a\x6b\x2d\x84\xc8\xf2\x09\xb5\x55\x0e\xf6\x8a\x61\x8f\x09\xaa\x48\xe8\x58\x17\x18\x1d\x8d\xb2\x57\x1d\x43\xba\x51\xcf\x72\xbf\xff\xf2\xd7\x6b\x82\x4f\xd9\x99\x2b\x89\xcc\x5a\x20\xdc\x60\x06\x66\x1e\x6a\x74\x40\xd6\x31\x69\x35\xec\x39\x71\x35\x1f\x62\x51\xb0\x44\xc1\x21\x0b\xfa\x18\xa4\xf5\xae\x3d\x71\x54\x2b\xe8\x62\x4d\xd0\xfb\x1a\x8e\x7b\x7a\x6c\x8d\xa7\xde\x94\xbe\xa7\x5d\x0b\xe5\xe1\xe0\xa8\xb5\x56\xcb\xf9\x9c\x32\xd8\x07\x77\x40\x24\xd9\x44\xcd\x29\x1b\x39\x3c\x96\x99\xfe\xcf\x57\xaf\xed\x49\xdf\x37\x6a\xfc\x6e\xbf\x70\x86\x5e\xfa\xed\xee\x3e\x5e\xf2\x15\x5f\xe0\x77\xdf\xd2\x41\xff\xf1\xa7\xeb\x16\x66\x93\x47\x78\x15\xfa\x85\xc9\x4f\x1b\xec\xe7\xd2\x8f\xa9\x98\x43\x2b\x07\xde\x05\xd8\x6f\xaa\xf9\x58\xe4\xb2\xb6\x52\x70\xc6\x5a\x19\x78\x59\x0a\x41\x16\x5b\x58\x2c\x01\xf2\x9e\x20\x89\x92\x32\x3f\xc0\x99\xa2\x7c\xc0\x17\xd5\x08\x21\x84\xb8\x28\x47\x1c\x35\xf4\x94\x46\x79\x88\x3c\x8f\xfa\x10\xb4\xe9\x83\xee\xc7\x42\x1a\xfb\x4c\x4c\x82\xf7\xb4\x58\xc5\x24\x56\xcd\xed\x2a\xe6\xe9\x69\xf2\x67\x91\xd9\xfb\xc7\xc8\x7a\xf7\x71\xcd\x80\x7f\xff\x5f\xbd\x51\xb2\x36\x73\xc0\x71\x81\xc6\xfb\x16\x8d\xf5\xb2\x55\xae\x7c\x04\x99\x05\xc7\x0c\xa7\x58\x88\xb8\x55\xe4\xec\x1b\x27\x8c\x75\x59\x62\x98\xa5\x66\xd9\x2a\x75\xf3\x7c\xaf\x48\xd8\xaf\x74\xa2\xa8\x32\xd7\xbd\xe2\x6c\x60\xc1\x2e\xe3\x66\x4f\xbd\x04\xdf\xc0\x6c\xfd\xb2\x0a\xf8\xfa\x97\x98\xad\xed\xd3\xa8\x03\x72\x1e\x85\x95\x95\x0a\x0d\xf7\x07\x34\x44\x46\x12\x55\x66\xe6\xc1\x84\xeb\x6e\x5f\x2e\x2d\x2c\x1c\xc9\x84\xa6\xe1\x40\xf6\x91\x31\x46\xcb\x95\xbb\x55\xce\xd3\x4a\x18\x73\x90\x70\x10\x8f\x89\x12\xd4\x57\xac\x66\x8e\x47\xcd\x8b\x8c\xc6\xba\xa0\x8e\xf8\xd4\xf7\xab\xaa\xf9\x75\x6c\x2f\x47\xbc\x8d\xf2\x32\xef\x6e\xb7\x31\x27\xfa\xe9\xd5\x9a\xe4\xcf\x24\xea\xa0\x45\x1c\x24\xf2\x17\x4a\x66\x70\xe8\x78\x3f\x64\x3e\x40\xe2\x91\xf4\x15\x9c\xe0\x4c\x4e\xe3\x70\xda\xcb\x61\xca\x26\x6d\x95\x0d\xc1\x2a\xab\xad\x98\x3d\x9a\xa0\x48\xf5\x58\xc0\x1e\x3a\xe2\x1a\x94\x4b\x69\x8c\x5f\x75\x74\xb2\x15\x6b\x49\x93\xf7\x5f\x75\xfc\xbd\x79\x29\x11\xff\x04\xa3\xf8\xf8\xe1\xf6\x86\xcd\x2a\x12\xb6\x2f\x13\x33\x82\xc4\x8d\x64\x52\x2a\xd1\x32\xb0\xba\x0f\xa6\x0c\x47\xda\xf6\x8b\xf1\xb0\xde\x06\x67\x0d\xd3\xda\x50\x2f\xdd\x31\xad\x66\xdf\x10\xcb\x18\x4d\x07\x97\x89\xe5\xf3\x57\xbe\xe2\x7c\x8d\x60\xdf\x7c\xb5\xc8\xde\x5d\xfe\xde\xdd\xde\x65\x6e\x93\x00\x43\x5a\xca\x9a\x54\xa2\x26\x93\x3b\x7a\x64\x80\xec\x72\x07\xa7\x87\x5e\xc8\x22\x14\x2c\x75\xf7\x6a\xe3\x1e\xf4\xa6\x44\x45\xb2\x4d\xf4\x23\xb9\xb1\x9b\xf6\xa9\xb7\xf1\xf7\x97\x5e\xb9\x0b\xa7\x1e\xba\x7d\x77\x9b\x44\x4e\xbd\x8f\xdf\xa8\x1c\xa2\x6a\x1b\x66\x9b\xe5\xb3\x45\xb1\xd1\x80\xc0\x14\xe0\x0c\x8d\x44\x16\x95\xb3\xcf\x92\x59\x47\xa9\x94\xd4\xa1\xe9\xde\x5d\x5f\x6d\xda\x99\x49\xd7\x8b\xe0\x50\x01\x1c\xb5\x8f\x89\xb7\xaa\x77\x12\x05\x63\x0c\x28\x6b\x6d\x92\x67\xc9\xaf\x72\x8f\x7c\x8b\x52\xe4\x17\x04\x24\xff\xcd\xb8\x47\x7c\x59\x71\x51\xcb\xb2\x20\xda\xb9\x56\x92\x1a\x4b\xd1\x34\x95\x17\xa6\x72\x67\xc4\x0e\x12\x63\x4e\x2b\x99\x17\xc4\xec\xf7\x53\x5f\x35\x65\xce\xf3\x46\x71\x52\x95\x8a\x31\xac\xa0\x58\x8e\x10\x77\xc5\x76\x2d\x57\x4b\xbb\x91\xee\xd3\x7a\x1f\x44\xdb\x6f\x4d\x53\x51\xe3\x71\xb3\x12\x90\x04\x8c\x05\x5d\x09\x48\xb8\xd1\x4a\x19\x52\x53\xd1\xe2\x0a\x2b\xa5\x8d\x0e\x75\x29\x4a\x43\x9a\x66\xbf\xd7\x9c\xdb\x27\xf2\x11\x06\x47\x36\xc9\x25\x78\x92\x94\x6b\x45\x93\xdf\x64\xf9\x93\xed\xbe\x5a\x80\xff\x70\xe9\x5d\x89\xb1\xd4\x0b\x1b\xfe\x4d\x8d\xf6\xff\x72\x55\xa3\x4d\xe3\x51\x12\x59\x4a\xfc\x62\xc1\x8f\xa8\x3c\xa2\x23\x94\x76\x1c\x51\x77\x79\x31\x4f\xb6\x28\xcf\x25\xf6\x15\x46\x0e\xc4\xe2\x8b\xc5\xab\x7d\x08\xbe\xc4\x2c\xa0\xee\x22\x78\x54\xc3\xf0\x2b\x5a\xed\xa7\xaa\x69\x22\x11\xe6\x45\xdc\x88\xa4\xac\xc2\x76\xdf\x3d\x89\x1b\xed\x12\xf5\xc8\x6f\xba\x6d\x1e\xfb\x88\xc9\x65\xdd\x7c\xe9\x98\x7b\x77\xa1\x2a\x7b\xff\x6e\xfb\xe1\xd3\xe7\xbb\x1f\x5f\xd4\xc7\xbf\x60\x44\x57\x6d\x97\x2b\x23\xc4\xdd\xc7\xbb\x9b\x17\x25\xeb\x78\xd2\x5d\x34\x85\x11\x2b\x4a\x8f\x0b\xc4\x75\x89\xa7\x07\x75\xa8\x2c\xa2\x3d\x2e\xe1\x98\x6a\x9f\x86\x59\xa4\x72\x76\x57\xd5\x86\xb4\x9e\x87\x6a\x42\x98\xe4\x0e\x93\x1a\x3c\x1c\x44\xaa\x66\xa7\x84\x60\x12\x3b\x52\x43\x13\x02\x3a\x44\x21\xd6\x66\x63\xea\xaa\x26\xd4\x30\x6a\xad\xf7\x94\x9d\x6a\xad\x60\xcf\x35\x57\x5c\x63\x5c\x10\xdb\xb4\x4d\xdd\x88\xac\xe0\xc3\x2c\x18\xcd\x75\x4e\xc8\x39\x6b\x26\x01\xbd\x5c\xf1\xaf\x63\x1a\x76\x2c\x29\x2e\x71\x6b\xc4\xeb\x2c\x96\xe9\xc3\xed\x67\xc4\x0d\xc6\xd6\xfa\x3d\xb1\x6c\xc7\x7e\xd6\x45\xb9\x69\x7e\x9e\x04\x23\xcd\xb6\xbc\xa7\x78\x39\xf3\x22\x3f\x7a\xb7\x33\x97\x6e\xb0\x3f\x24\x4d\xf2\xbf\xfe\x57\xf0\x51\xbf\x7e\xc6\x47\xfd\xe6\xbb\xcf\x91\x91\xfa\x59\x6a\xf1\x89\x90\xfa\x2b\x3e\xea\xc5\x6a\xae\xd0\x9d\xd6\xd4\xc7\xc6\x13\xd2\x70\x2c\xaa\x4a\x68\x51\x2a\x65\x50\x51\xe1\x3d\xe5\xac\xad\x39\x1f\x04\x1c\x04\x1f\x44\x9b\x96\x44\x55\xa4\x24\x35\x2e\x73\x5f\x06\xae\x4a\x4d\x4c\xd1\xd8\xae\x1b\x47\x7b\x3c\xf2\x12\xcb\x7a\x67\x2a\xa5\xab\xf6\x5e\x30\x96\xdb\xbc\x46\x15\x9c\x51\x0e\xe3\xa0\xc6\x34\x4f\x73\x21\x25\x53\xed\xac\xa6\x69\x9a\xbb\x23\x67\xed\xf1\x98\x69\x60\x5d\x61\x0b\x86\x12\x08\x56\x2a\x54\xcc\x43\xcd\x43\x88\x84\xd4\x0a\x39\x8b\x12\x49\x99\x4b\xb2\x2c\xbf\xf0\x8f\xff\x55\xb4\x4d\x11\x45\x7e\x65\xc4\xfb\xfa\x7c\x8d\x0c\x79\x1f\xe2\x6e\xba\x9e\x19\x1f\xfe\xcd\xe7\xd8\x84\x73\x49\xa0\xdc\xbd\xf9\x66\xf3\xe4\x62\xcc\x6e\xde\xff\xf0\xf9\xed\xcd\x9b\x0f\x3f\xad\x36\x69\xa3\x49\x35\x36\x38\x94\xf5\x74\xe1\x8d\x1f\xee\x47\xb4\x8f\xe0\x1c\x3e\x95\x15\x32\x3e\x2f\x10\x81\xa1\x28\x69\xc3\x19\xaf\xab\xb2\xb4\x44\x0b\xa1\x1d\xf1\xba\x2e\xe1\x7c\x28\x95\xa2\x8a\x90\x92\x51\x2c\x54\x8d\x92\xf3\xd9\xd5\x28\x19\x48\x7f\x2a\x10\xaf\x4a\x53\x56\x3b\x23\xa4\x10\x98\x53\x2b\xb5\x34\x46\x6a\x69\x69\x33\x97\xce\x18\xcd\x29\x13\x9a\xeb\xa1\x86\xfd\x9e\x33\x4b\x85\xed\x6c\xa5\x71\xb9\xb8\xee\xae\x22\xa6\x2c\x6c\x1d\x0c\x2b\x74\x59\x6b\x2c\x8d\xa1\xbc\xe1\x34\x79\xb2\xe9\xfa\x2b\xde\xe7\xbf\xbf\x78\x25\x6b\x46\xf0\xa9\x03\xfb\xc3\xb3\xee\xeb\x48\x6b\xfe\x0f\x9d\xba\x4b\x78\xf6\x3b\x94\x19\x54\x19\xe7\x50\xf9\x80\x9d\xf7\xa8\x74\xce\xce\xe4\xf2\x62\xff\xa0\xb3\xfa\x61\xc8\x1c\x84\x8a\x92\xda\x52\x46\xf9\xb2\xb1\x9c\x60\x95\x77\x4c\xe6\xda\xea\x5d\xae\x94\x52\x73\x87\x64\xfc\x03\x9d\x8a\xed\xda\x7b\xc3\x35\xd7\x92\x53\x46\x15\x6d\x2a\x13\x90\x04\x8f\x2b\x43\x6a\x86\xf6\x30\x8c\x0c\x25\x08\xaf\xf8\xb5\x4d\x56\xc6\x75\xa1\x92\xdf\xc6\xf8\xe4\x7f\xf9\x65\xb7\x0d\x7a\xd6\x89\xfe\x71\xb1\xba\xd7\xef\x3f\x2f\x6e\xd7\xe7\x8f\xef\xb2\x18\xae\xbc\xfd\x0a\x32\x10\x73\xf2\x59\x87\xa4\x8f\xde\xcd\xfe\xa1\x40\x1e\x3c\x9a\x82\x6b\xdb\x61\x1e\x86\x30\x0f\xde\x75\x5d\x28\x07\x38\xd7\x7b\x5f\x6e\x08\xec\x8b\xbc\xa6\x55\xe1\x4a\xe1\x1d\xef\x6b\x68\x19\x2a\x2b\x38\xed\x12\xa5\x22\x54\x0b\x98\xd6\x91\x30\xc7\x2a\x65\x43\xa5\x68\x63\xf1\x1e\x94\x85\x73\x95\xe7\x8d\x6d\x7a\x41\x25\xc2\xa0\xb8\xa5\xa8\x4c\x92\x5d\x8c\xc7\x17\x3f\xed\xcf\x23\x73\xe8\xa7\x0b\x97\xf0\xdb\x2f\xd4\x22\x3f\xbd\x7f\xf3\x0c\x18\x75\xf3\x1e\x67\x77\x3f\xbd\x7f\x17\x59\x94\xd1\xf3\x86\xef\xdb\xc5\x90\xae\x2e\xf2\xae\xa7\xed\x58\x56\x29\x86\xb3\xd9\x53\xc1\x66\x41\xb9\x68\xf5\x80\x08\x3d\xd7\xc8\xf6\xc8\x36\xd5\x1e\x37\xcb\x89\x91\xb6\x82\xd7\x04\x3b\x3c\x4b\x3f\xa5\x09\x24\x26\x4a\xe2\x69\x83\x4b\x42\xac\xa7\xbe\x26\xe3\x44\x1a\xad\xad\xd5\x85\x83\xa4\xa1\x35\x1c\x14\xf4\xb3\x66\x3c\xb7\x39\x45\xe3\xcc\xb3\x3a\x1e\x2b\x49\xc4\xa3\x9d\x2e\xf8\xfd\x57\xc9\x4f\x11\x61\xf2\xb7\xb1\xb7\xf3\xc3\x9b\x5f\xc2\xf7\xbf\xbb\x59\x56\xda\x6f\xd1\xf5\x67\x7f\x87\xbe\x0d\xdf\xff\xfc\xe1\x2b\xf0\xfe\xfa\xdc\x36\xa5\xe5\x92\x99\xbc\x90\x5c\x50\x4a\x95\xb2\x2a\x4d\x6c\x4e\x2b\x25\x6c\x61\x94\xe0\xa2\xd1\x4a\x4b\xaf\x4a\x2a\x09\x24\xba\xa0\xb2\xd9\x94\xfe\x61\xf2\x1a\x95\x85\x2f\xd0\x50\x88\x96\x89\x42\x32\x52\x56\xb0\x17\x20\x19\xe2\xec\x31\xd9\x29\x27\xaf\xc8\x7d\xc1\x14\x97\x1c\x25\x88\x70\xda\xd4\x4c\x52\x21\x8d\xd2\x7c\xd9\xca\xe7\xfe\x19\x70\x1f\x12\xe8\xf7\x7b\x44\xc1\xb4\x2d\x14\x1d\x76\x98\xa8\x01\xea\x26\xa2\xf6\xf3\x0b\x4f\x96\x8e\x58\x9f\x6b\x66\xe0\x6f\x13\xb2\x9e\x00\xdf\x72\x0a\x16\x97\xe0\xd5\xdb\xc5\x21\xbc\x5e\xcf\x42\xd8\xe7\xc4\x17\x1b\xe2\xc8\x19\x57\xa1\x5e\xc5\xa5\x30\x4c\xf1\x62\x0f\xb2\xa1\x7c\x5a\xc5\x9d\xe2\x85\x9c\x68\x5c\x2d\xf4\xf2\xa8\x1b\x28\x1c\xe1\x4e\x22\xd7\x94\xbe\xa8\x77\xba\x1e\x14\xaf\x95\x75\xde\x06\x1b\x5c\xaa\x15\x77\x88\x95\xde\xc3\x14\x02\x8c\x21\x80\x08\xfb\xfa\x10\x70\xfc\xb7\xac\x47\xcf\x5a\xdf\xb6\xf5\x3e\x24\x9b\xc4\x3c\xd2\x1b\xb3\x19\x93\x32\xf9\x9b\xe4\x7f\x8c\x8c\x0b\x6f\x6f\xee\xde\xac\x8f\xe8\x19\x42\xec\xe6\xfd\x0f\x3f\xae\x78\xd7\x77\x57\x09\x85\x65\xe3\x6e\xaf\xed\x0a\xcf\x5d\x82\x35\x02\xd9\x9c\x4d\x8d\xfa\xfd\xdc\x34\xa9\x6e\x21\x34\xb5\xa9\x49\x43\x2a\x53\xd5\x9c\xa3\xfc\x61\x70\x47\xef\x7d\x71\x14\x7d\xe1\xd1\x1e\x6c\x2a\xd2\x83\x3f\x1c\x88\x12\x0c\x0b\x5e\xcf\xcd\x79\x79\x74\x7a\x33\x92\xda\x80\xb0\x4e\xa0\x86\xb2\x86\xd3\x8a\xf2\x9a\x91\xda\x2a\x06\x2d\xb2\x3f\x77\x69\x01\xca\x68\x81\x1a\xdb\x1d\x8f\x47\x0b\x27\xc5\xb1\xaf\xf8\xa9\x12\x52\x6a\xb9\xf2\x02\xe1\x98\x33\x73\xb1\xae\xb7\xb2\x5a\xbe\x60\xb2\xbe\x5b\x09\x5b\x23\x7d\xf5\xf7\x6f\xb7\xbf\xc6\xa8\x22\x50\x8f\x2b\xdf\x60\xd4\xfa\xba\x44\xe5\xbd\x3b\x17\x65\x48\x1d\xc9\x41\x94\x05\x4c\x99\x01\x8b\xce\x90\x47\xa5\x78\x70\xfe\xea\xe8\x6c\x27\x42\x6a\xce\xad\x5d\x82\x55\xbe\x0f\x58\x88\xd3\x2f\x38\x55\x76\x91\x8b\xab\xdb\x96\xc9\x6d\xf2\xd7\xf1\x39\xfc\x6f\x57\xfe\xa6\x1f\xbe\xf0\x6d\xde\xbd\xff\xb4\x7d\xfb\xbc\xcb\x60\x0d\x49\xa3\xc1\x8f\x84\xdf\x9b\x35\x8d\x10\x3b\xee\xd7\x37\xa2\x0b\x2c\xff\x19\x38\xbf\x36\x4e\x22\x3b\x12\xa2\x4f\xde\xd4\xcd\x7c\x9a\x4f\xe5\x29\x1d\x0c\xa1\xda\x10\x6d\xb8\x2d\xab\xe9\x31\xc1\x1a\x2a\xcd\xf2\xc2\x15\x05\x6a\x51\xcb\x00\x03\x85\x3d\x60\x86\x4e\xa8\x2c\x0a\x38\xc1\x88\x9d\x30\x84\x5a\x47\xd0\xc0\x1f\x13\xa8\x28\x3a\xa1\x89\x43\x3b\x0b\x9a\xb6\x69\xc1\x81\x3c\x1c\x68\xc6\xb6\x25\x67\x55\x81\x2b\xcc\x8c\x65\x75\xd5\xd8\x3a\x54\x9a\xe4\x98\x34\xda\x37\x4d\x5d\x15\x82\x09\xa9\xf3\xbc\x2e\x72\xdd\x38\x1e\x9c\xb2\x62\x89\x2f\x0a\xc1\x7c\x25\x49\x59\x11\x70\xd2\x55\xaa\x29\xe5\x48\x14\x6b\x14\x9c\x98\x16\xab\xed\x15\x71\x5f\xfe\xfe\x89\xd7\xe4\x3f\xbc\xec\x77\x5c\x29\xec\x5f\x32\xb7\xbc\xbb\x78\xec\xaf\x2f\xa7\x4e\x34\xc6\x5f\xb3\x9b\x70\x44\x2a\x1c\x4a\x9c\x62\x18\xcc\x59\xe3\x12\x7c\xa3\x4d\xe3\x73\x39\x0d\x7a\x70\x55\xc5\x06\xfb\x98\xa0\xa4\xf5\x07\xcd\x2c\x73\xc3\x80\xe4\x30\x1f\xe2\x97\xad\x93\xa6\x16\xdc\x4d\x7b\x87\xf1\xdc\x05\x5c\x36\xbe\x1e\x38\x61\x83\x4c\x3b\x5c\xba\x80\x12\x38\xec\xf7\x3e\x74\x50\x1d\x0e\x07\xc8\x57\x98\x68\xb2\xcd\xaa\xd8\x1b\xa4\x93\xdf\x26\x6f\x92\x7f\x7e\xe1\x4c\xfe\xfa\xa4\x7c\x66\x42\xb6\x17\x34\xdd\x4a\x31\xf6\xa4\x43\xfa\xc3\xdb\x58\xa4\xfb\x2e\xeb\x97\x83\x71\x71\x87\xc6\xfb\x09\x75\xe0\x53\xdf\x07\xe5\x3a\x10\x46\xf5\xb2\x45\x89\xaf\x6a\xe4\xa9\x39\x1c\x19\x9c\xc7\x09\x0e\x04\xe1\x9e\x33\xca\x14\x2a\x38\x57\x92\x40\x1b\xb5\xf5\x7a\xe7\x7a\xf0\xa6\x55\xad\x91\xb4\x75\xd2\x94\x98\x33\xbb\x37\x92\x04\xea\x3c\x0d\xb5\x66\x8a\x34\x6a\xcf\x34\x17\x2e\x5f\x39\x64\xd7\x1c\xf5\x5f\x24\xef\x9e\x34\x2c\x7e\x58\xbb\xb3\xef\xde\xdc\xbd\x7a\x3a\xc4\xb3\xab\xbc\x00\xfa\xe9\xe3\xee\xe6\xcd\x73\xc6\xe4\xb8\xe3\x02\x3a\x21\xa9\xfa\x43\x5e\x20\x0d\x2d\x67\x25\x2e\x2d\x16\xbc\x77\xd0\xb7\xae\x3a\x1e\x28\xda\x17\xd6\x65\x45\x98\xdb\x10\xae\xcc\x41\xbb\xbc\xa2\xba\x2a\x95\x70\x8f\x09\xb1\x75\xaf\x90\x3b\x57\x75\x74\x4c\x06\x2e\x8b\xbc\x9d\xfb\x87\x20\x44\x26\xe0\xd0\x02\x6e\x93\x24\xbb\x60\x4f\x75\xf2\x36\xf9\x61\xb5\x0d\x17\x34\x6c\x84\x55\x5c\x73\x8c\xb7\x31\x0e\x7e\x3a\x00\xd1\xf3\xb6\xa0\x55\x29\xad\x03\x76\x40\x15\x85\x73\xf0\xed\x89\xa2\xf2\x00\x4a\xda\xa2\x14\x4c\x10\xda\x70\xd9\xa7\xde\x15\xa5\xe4\x82\xd0\xaa\xd2\x7a\x1b\xc6\xd1\xcd\x07\xa0\xc1\x77\x88\xce\x32\xd5\x30\x74\x7e\x8f\x74\x2a\x28\xd6\x92\x2b\x2d\x98\x53\xe2\x8c\x1a\x6c\xa4\xd0\x5a\x52\xc9\xd5\x18\xf9\x63\xd8\x63\x7d\xd3\x6d\x93\xe4\x6d\xf2\x97\x57\x5e\xed\x65\x1d\x3c\x37\x01\x5f\xd6\xc1\x5f\x7f\x9d\xe2\xfa\x42\xc3\xfe\xf1\x2e\x6b\x74\x5d\x67\xd5\x30\x22\x89\x34\x9f\x4f\x10\x40\x42\x5d\x23\x85\x98\x53\x4a\x69\x64\x78\x38\x0c\xed\x5c\xe7\x30\xa6\x64\x4d\x6d\xd9\x59\x67\xc5\xc3\x29\x44\x35\x75\x97\xaa\x79\xbf\x4d\x48\x85\x95\x66\xb4\x72\x54\xd9\xca\x62\xd6\x10\xd2\xe8\xc0\x29\x21\x0c\x1a\xbd\x18\x15\x6e\xc6\x71\xf9\xb2\xcc\xb7\x8b\xf3\x5d\x45\x7f\xf7\x87\x24\x41\xb7\x77\xdf\x2d\x0b\xe3\x9f\xa1\x4b\x08\x90\x66\x57\xee\xcb\xc8\x4d\x82\x7e\xfa\x78\x77\x7b\x43\xa1\x2d\x90\x05\x53\x39\x8c\x0b\xdb\x58\x3e\xd6\xd0\x75\x16\xf7\x27\x1a\x3b\xc5\x10\x29\x60\xd8\x55\x73\xdf\x1a\x0f\x47\x98\x8e\x04\x7a\x24\x90\x9e\x4f\x0d\xf1\x9c\xd2\x9d\x03\x8a\xaa\x19\xdb\x00\x63\x82\x92\xf0\x38\x64\x2b\x9f\xc5\x55\x0f\xee\x12\x16\x6e\xdf\x87\x55\x90\xf8\x04\x23\xdd\x36\xf7\x4d\xb5\x3d\xfc\x2c\xea\x0d\xfd\x79\xe0\x8c\x90\x15\x37\x25\xb2\x69\xa7\x22\x2b\x49\x3c\x43\x56\x35\xf7\xe7\xc5\xe8\x55\x7c\x34\xc5\xbc\x46\x8d\xaa\xb4\xb5\x46\xea\x16\x8e\x12\x95\xa1\x3d\x98\x10\x18\x9e\x03\xd2\x15\xdd\xa9\xd0\x7b\xd0\x30\xf5\x07\xdb\x75\x30\x75\xb6\x43\xd5\xe9\xc8\xbb\xe1\x88\x2a\x1f\x4c\xec\x99\x19\xa3\xff\x41\x93\xdf\x27\x4d\xf2\xf7\xc9\xff\x95\xfc\x3f\xd7\xbc\xd7\x45\xed\xf4\x65\x2b\xf7\x9a\x0e\xbc\xb0\xf9\xdd\xc6\x66\xdd\x2f\x55\xe1\xb7\x3f\xc6\x6f\x7f\x7a\x56\x25\x7e\xfe\x86\xf8\x0b\xaf\x6f\xb9\x52\xc3\x65\xe5\x86\x41\x8e\xb8\x94\xac\xef\x68\x25\x38\x61\x58\x35\x35\xec\x0d\x1c\x1c\x0b\x5c\x11\x8a\x1a\xa8\xb2\x8a\x61\xcc\x28\xc1\x15\xad\x2b\x4e\x09\xa8\xc8\x05\x57\xe2\xcb\x0f\x70\x55\xa2\xe1\xf2\x16\xcc\xea\xaa\xaa\x29\xc6\x97\x37\xe1\x92\xb2\x06\x57\x35\x23\x3b\xea\x1e\x13\x5a\x49\x6a\x4d\x75\x6f\x57\x79\x96\x0d\xbe\x6f\x36\x87\xfb\x62\x5b\x72\xa9\x28\x23\x28\x01\x56\x49\xe6\xa9\x6e\x6a\x42\xa9\xaf\x85\xaa\x05\xf3\x94\x34\xa4\xa6\xcb\xf7\x75\xdd\x00\x89\x3f\xd2\xa4\x22\x94\x51\x5a\x57\x8d\xa8\x96\x1f\x34\x8d\xa4\x84\x51\xda\xc4\x5c\xe6\x4d\xac\xdb\xad\x1c\xef\xff\xfc\xc2\xf0\xbe\xaa\x2d\x5c\x6d\x40\xb4\xbb\xcb\xde\xff\xb2\xdb\x7f\x7c\xfb\xcc\x0c\x3c\xe3\xd0\xb9\xd2\xbf\x64\x35\x3a\x38\x34\x01\x4e\xf1\x3d\x4b\x13\x68\x82\xad\x25\xe3\x8c\x37\x44\xf9\x74\xb2\xb5\xe2\x9c\xf3\xba\x56\x06\xe1\x30\x57\xde\xa7\xe3\x5c\xa9\xc5\x79\xb7\xc7\xe3\x2e\xd1\xda\x41\xed\x1c\x1a\x70\xa5\x48\xa3\x59\xcd\x08\x77\x6d\xa5\x9b\x46\xd3\x9a\x36\xdc\x42\xf9\xe0\x19\xcb\xe4\xac\xd2\x5c\x40\xaf\xa2\x1e\xcd\xfe\x91\xde\xec\x77\xec\x99\x8e\xd0\xca\x2d\x75\x19\xd3\xf3\xda\xcf\xdb\x98\xab\x7f\x16\x32\xee\x6e\x9e\xa2\xc6\xc8\x6c\xf3\x2e\xe6\xe9\xa3\x78\x99\x73\x0e\x61\x63\xdd\x83\xdc\x98\x7b\x23\xb3\x16\x96\x23\x5f\x49\x6d\xec\x5e\x82\xd8\xe7\x84\xe7\xad\xab\xa6\x03\xe5\x92\xa0\x44\x8f\x6e\xb1\x0f\x3b\x06\x44\xaf\xb5\x1f\x6a\x25\x48\xc1\x88\x50\xbc\x91\xdc\x4c\x48\x31\x0a\xa7\xba\x31\xac\x61\x28\xaf\xb0\xa5\xd2\xf8\xe4\x37\x31\x16\xfe\x47\xf6\x55\xbf\xc8\x53\xaa\xc5\x22\x7b\x90\x69\x7e\x2f\xd2\x04\x94\x3f\x9f\x91\x43\xc9\xc3\x90\x0d\x0f\xf5\x9a\x8d\xba\x5c\x4e\xb5\x67\x31\xa1\xe9\x78\x6c\x8e\xdf\xea\xab\xc6\x02\x0e\x02\x06\x71\x8e\xe2\x55\xb1\xad\xba\xf9\x12\x2b\xad\x1a\x40\x2f\xfc\x8f\x5f\xd4\x84\xee\x16\x1b\xf1\x27\x98\xd6\xde\x6d\x57\xfa\xf7\x37\xb7\x57\xff\x63\x31\x50\x88\x05\x94\xc3\x39\x40\x17\x1e\x93\x7a\x53\xd9\x61\x70\x40\xd0\x11\xca\x30\x9f\xd3\x1c\xa8\x3a\x1c\x6c\x56\x84\xd0\x75\x1d\x62\x61\x1b\xf5\xb6\x9c\xd6\x5a\x77\xb6\x77\x9d\xeb\x57\x3e\xe2\xf8\x32\xfe\x81\x7d\xd7\x75\xcb\xb8\xf7\x97\xf3\xf9\x5f\x5f\x46\xfd\x3f\xad\x31\xf9\xa5\xbf\xe7\xbf\x01\x4d\x44\x56\x21\x5a\x61\x5f\xa7\x39\x9c\x2a\x56\x97\xb6\x6e\x38\xe3\x94\x42\x47\x34\x6d\x30\x63\x18\xfa\xaa\xd2\x2b\x4b\x44\x4d\xea\xc7\x04\xf5\x4c\xa0\xd3\xe2\x73\x2c\xfb\x60\xb9\x6a\x69\x7a\xd1\x66\x89\x35\x46\xb9\xc8\x12\x11\x1c\xd7\x4d\x43\x39\xa1\x95\xab\x08\x34\x60\x24\xbf\x90\x44\xb4\x35\x96\x5c\x44\x92\x08\x2e\x5a\x63\xda\x79\xd4\xe0\x15\xec\xf9\xc1\x5a\xd9\xae\x24\x11\xb1\x7f\xe2\x7c\xe1\x56\xfc\x70\xe1\xc1\x7b\xa6\x66\xf9\xf4\xf7\x85\x8e\xc3\xe7\xef\xdf\x7e\xf8\xf8\x32\x6f\xf5\xcc\x4f\xd9\xd4\xa4\x46\x0d\xa9\x42\x5d\x9f\xa1\xb8\x36\x0c\x99\x86\xf8\xa6\x1a\xee\xd5\xa9\xaa\x3d\xc1\x0a\x72\x74\x5e\xfb\x87\x26\x5c\x65\xd2\xcf\x3a\x84\xb8\x4f\x0c\x97\x42\x54\x9c\x58\x6b\x8d\x9b\x1a\xc3\x28\xb6\x96\x92\x9a\x8b\xc9\x19\x6b\x2d\x21\xf7\xe5\x7c\xa2\x34\x2d\x60\xdf\x3f\xd9\x2b\xbb\xb3\x17\x1f\xf1\xdd\x97\x4e\xbb\x97\xf6\xea\x79\x8f\xcf\xeb\xb5\x9d\xfc\xdf\xa1\xdb\xbb\x68\xa7\x2e\x36\xaa\x8f\xdd\x1f\x69\x7e\xaf\xd0\x09\x68\x56\xb9\x86\x18\x3a\x0f\xb4\xb2\x15\x61\x2e\x3b\xfa\x99\xe8\xe5\x1d\x66\x18\xb6\x43\xdf\x3b\xe8\x9c\x43\x0c\xd7\x56\x50\x29\x84\x26\x4a\xfe\x3c\xa9\x2c\x3c\x08\x65\xd3\x72\x3e\xa2\x3d\x38\xe5\x92\x55\x1b\x6b\x59\x5f\xcd\x33\xbe\xc1\xcb\x0a\x5b\x7b\xa4\x3f\x7d\x7e\x9b\x6c\x17\x27\xe5\xda\x2b\xfd\x7c\x8d\x7d\xa1\x5f\xfd\x65\x5f\xd6\x33\xdf\x37\x23\xd9\x09\x72\x19\x3a\x23\xa5\x85\x11\xf6\xa8\x41\x79\xdd\x18\x27\x0d\xae\x7c\xcb\x4c\x24\x23\x69\x86\xb1\x3a\xec\xdb\xae\xec\x2d\xf4\xfe\xd2\xb0\x55\xce\xe4\xfa\xaa\xea\xb5\x95\xfd\x7c\x32\xce\xa9\x76\xd7\xcc\xc6\x89\xbc\x64\xbc\x86\x53\xc0\x35\x21\x4d\x3b\xd4\x84\xe0\x12\x5a\xc9\x0a\x9b\x13\x54\x95\x85\xe6\xa6\x2c\xb4\xf4\xc8\x68\xad\xc1\x5a\x6b\x1f\x68\xe8\x68\x1b\x2a\xda\x4b\x61\xe2\x1a\x3b\x5e\x74\xed\xfe\x7d\x42\x93\xff\xf4\xcb\x1a\xe3\x65\x0e\x76\xdb\x2f\xa1\xdd\xcb\x39\xd8\x3e\x4d\xc1\x53\x53\xe2\xf3\x5b\xa7\xa8\x5f\x79\x25\x0d\x18\x34\xcd\x86\x73\xa7\x48\x13\x8e\x70\x42\xf8\x58\xd5\xd6\x70\x57\x96\xc6\x32\xd3\x34\x25\x25\x0d\x90\x6a\xdf\x59\x57\x6a\x0e\x03\x3a\x83\x42\x0e\x68\x56\x74\x5e\xb9\x00\x58\xd9\xbd\xe8\xb6\x47\xe7\xac\xb4\xca\x1a\x92\x97\x4d\xd3\x4c\xae\xaa\x9b\x9a\xb8\x8e\x34\x15\x2e\xa1\x17\xac\xb0\x05\x41\x25\xb1\xdc\xe2\xc2\x30\x63\x95\x95\xf7\xad\x92\x56\x6b\xca\x83\x30\xec\x1a\xbf\xd0\x4b\x6f\xd2\x5a\xc7\xff\xf4\xad\x8e\xb3\xcb\x9a\xbc\x72\x04\x7c\xbb\x35\xf9\x06\x53\x90\x73\x57\xa3\x23\x6a\xd7\x7a\x7e\x4f\x4a\x57\x36\x70\x62\x8d\xa9\xe9\x41\x59\x43\x1d\xce\x12\x60\xb1\x4f\x0f\xfb\xc8\x2b\x54\x42\x89\x8e\x3b\x6d\x65\xe1\x54\x7d\xf4\xb4\xd7\xc6\x57\xde\xe4\x5c\x52\x21\xa0\x68\xb9\x3f\xd4\xdc\x0e\x0e\x0c\xaa\xe6\x33\x43\x3d\x8c\xc8\xb8\x61\xb1\xe5\x91\x3b\xb9\x7d\xaa\xed\x5f\xbb\x06\xbf\x51\xdf\x7f\x76\xe2\xff\x7e\xd9\x51\x91\x49\xef\xee\xf6\x2e\xe3\xa7\x58\xb5\x2f\xe0\xe4\x61\xf2\xa7\x4d\xee\x67\xee\xfd\x62\xc2\x91\x47\xc5\xcc\xaf\xaf\xe0\xb4\x8d\x8a\xa7\x6e\x9a\xa6\x09\xc6\x7b\x65\xcc\x26\xfa\xa6\x30\xa2\x6a\x2e\x62\x3b\x09\xb9\xac\xa3\x6b\xcd\x6a\xed\x58\x7d\xce\x2e\x7e\x19\x4d\x76\xf7\x85\x16\xf3\x32\xb0\x5d\x44\x44\xac\x43\x9a\x3c\x2a\xfd\xe9\xe4\xe1\xe8\xa7\x12\x39\xe2\xca\x32\x2d\xe7\xb6\x11\xa9\xf7\x90\x7b\xa1\x29\x4a\x42\xf4\x93\xcf\x90\x6f\xfd\x32\x22\x77\x3a\x1d\x8f\xe0\xfb\x8a\x11\xa7\xcd\x5c\x4b\x99\xd6\x82\xd8\x80\x8a\xb9\x46\x34\xb9\xf6\x9a\xf3\x5d\x93\x7c\x17\xb3\x61\x7f\xf3\x82\x69\x65\x39\x25\x56\x5a\xd4\xd7\x5f\x25\x75\xaf\xa6\xe7\x86\x73\x2e\x3c\xf6\xa2\x99\x4b\xe3\xf4\xe9\xe0\x0e\x87\xe3\xdc\x4e\x87\x72\x19\x84\x39\x9d\x76\xcd\x1f\x27\x21\x0b\x57\xc8\xad\x98\x65\x6c\x96\x46\x2d\x3a\xa7\x67\xd0\x6d\x6b\xa3\xd4\x3b\x83\xd2\x8e\x71\xcd\xa9\x4b\x8f\xd9\x5f\x3e\x8b\x35\xdf\xee\x6e\x62\x40\xf1\x97\xe8\x09\x1e\xf9\xfe\x1a\x6a\xde\xfe\x90\xfd\xf4\x7e\xfb\x8b\x58\x73\x77\x66\x87\x43\x89\x02\x58\x62\x70\x55\x5a\xcc\x99\x18\x18\x74\x2e\xd4\xdd\x99\xa1\x09\x17\x39\x9c\xb2\xda\xcf\xce\x2d\x21\x4f\xbc\x76\xc6\xe0\x52\x71\x67\xcd\xa1\xee\xf4\x70\x38\xe1\xc6\xd0\x9a\xa5\xc7\x12\x06\xce\x4b\x3f\x77\x0f\x5e\xca\x4c\xc6\x40\xb3\x4b\xb2\x74\xff\x28\xe2\x1a\xfb\x77\x91\x5b\x3e\x41\x91\x09\xe6\x42\x69\xba\xf6\x1a\xbd\xa4\xc9\xf8\x1c\x21\xa6\xcf\xcb\x6f\xd7\x3c\xf2\x62\x1d\x5f\x58\x43\x64\x88\x2d\x2a\x74\x9c\x4f\xb8\x4a\x6d\xcf\x5a\xdd\x4b\xb0\x84\xa7\x92\x29\xc2\xb1\x20\xb8\xcc\xc1\xd6\x07\x54\xd2\xdc\x97\xa4\x01\x07\x83\xa0\x5c\x74\xfa\x84\x68\x53\x42\xd7\x37\x95\xc3\x4d\x3a\xba\xba\x31\xcd\xb6\x46\xb4\x08\xde\x09\xee\x5a\x67\x0f\x67\x2d\xc1\xdb\xc2\x15\x4d\x80\xa6\x2a\x48\x68\x0e\xa4\x26\x32\xad\x18\x35\xbe\x75\x8a\xa2\x03\x97\x44\x88\xba\x36\x8c\xac\x39\xb7\xf4\x78\xf1\x8d\xae\xb9\x8c\xe6\x1b\x1c\x5b\xcf\xa9\x72\x7f\x25\x97\x11\x69\x0c\x33\x8b\x4c\xb8\x64\x32\xf6\xe8\x00\xa6\xd5\xe6\x20\xfb\x54\x47\x3d\x21\xd8\x87\xaa\x49\xb1\x08\xfb\x13\x85\xd3\x38\xc1\x28\x11\xde\x2b\x26\x94\x44\x18\x71\xc3\x80\xca\xed\x21\xea\xca\xb8\x0e\x3a\xd2\x05\x65\xb5\x30\xda\x8a\x0a\x0b\xae\x0f\x4e\x11\x47\x9d\xa7\xbe\xd1\xdc\x4a\xa6\x47\x98\xa4\xb1\xc9\xe5\x79\x85\x1d\x4b\x7e\x13\xf3\x86\x09\x7a\xf3\xb4\xb4\xbf\xba\x93\xec\xab\xd3\xf7\xc6\x3f\xa8\xbd\x6d\x4f\xa8\xbc\x74\x87\x3d\xb4\x88\xc0\x31\x47\xd5\xfa\xbd\x7d\xa8\x50\x07\xe3\x8e\xf9\xd9\xce\x27\xa8\x05\xb2\xe8\x9c\x15\xa0\xf6\x7b\x3f\x7a\x3f\xce\x76\x1c\x2f\xd2\x80\xd7\x5e\xde\xee\x59\xed\xfa\xc7\x17\xb6\x69\x2d\x19\xde\x7d\xfc\x70\x1b\xb5\x06\xbe\x89\x58\x91\xce\xa1\xbd\xb7\x76\x7f\x6f\x07\x87\x70\xe4\x1a\xb8\x5c\xa5\xb0\x30\x92\x53\x8a\xa7\x4e\xee\x87\xad\x39\x9f\xcf\x67\xf7\xe0\x9c\xcb\x54\x14\xce\x9c\x8f\x07\xb0\x2a\x18\xc7\xbd\x74\x36\xe8\x64\x1b\x6d\xa5\xdb\xa9\x0b\xff\xe9\xef\x62\x1c\xfc\xc4\x97\xf2\xf6\x0b\x2e\xe5\x29\x32\xca\x38\x1a\xca\xda\x37\x25\x3a\xdc\x1f\x48\xd6\x3d\xb0\x78\x79\x37\x7b\x17\xa1\x3d\x5b\x27\x78\xa5\x94\xeb\x6c\x67\xfb\x59\x29\x95\x3a\x50\x28\x49\xd2\xf4\x70\xb9\xf7\x27\x36\xf3\xdb\xbb\x34\xfb\xf0\xea\xf5\xd5\x51\x4d\x6f\xd6\x7c\x52\xfa\x5c\xd6\x67\x85\x26\x7f\xed\x55\xc4\x92\x6a\xe4\xa9\x5b\x97\x5c\x22\x84\x46\x79\x91\xfb\xbc\x40\x0a\x7c\x81\x39\x31\xca\xd0\x26\x2f\x72\x5b\x3a\x2b\xcc\x72\x82\x90\x12\x4e\x4a\x94\x4a\x53\x21\x38\x16\xa2\xd6\xa6\x09\xee\x74\xe2\x9c\xa0\x26\x75\x9a\x5a\xaa\x76\x74\x09\x87\x7b\x94\x23\x0a\xdd\x63\xe2\xc6\xa3\xdf\x13\x18\x7a\x18\x8d\x29\x41\x23\x62\x84\xd5\xee\x8c\x14\x9c\xaa\xca\x34\x35\x60\xc5\x0a\x57\x70\x64\xea\xca\xd7\x35\x22\x0e\x15\x65\x61\x1b\x1e\x7a\x16\x61\xab\x49\x9a\x0e\x51\x9b\xa1\x8a\x55\xa5\xb8\xf2\x5e\x78\xe6\xc9\xf3\x3a\xdf\x65\x49\xbe\xb9\xbb\x11\x0f\x3e\xb3\x60\x70\x6d\x98\x52\x5e\xed\x19\x28\x61\x9c\x2a\xdc\x81\xaa\xdc\x39\x77\x4e\x87\xb9\xde\x55\x6e\x3e\xba\xbd\x96\x56\xb4\x72\xb4\x0e\xe1\xd4\xce\x09\xa1\x56\x30\x9a\xc9\xf9\x04\x82\xa3\x90\x26\xe9\x09\x56\xce\x8e\x65\x2c\xfc\xc6\xfd\xa9\x5e\xe7\x57\x2f\x7a\x9d\xbb\x4c\x42\xc4\x47\xe9\xbe\xab\x0d\x0c\xd0\x4b\x26\xf5\xa9\x76\xc5\x12\xbc\xfa\x28\x7b\x76\x6d\x75\x96\xb8\xf5\x6d\xef\x35\x62\x68\xc0\x43\xef\x59\x56\x39\x64\x93\x34\xe6\x42\xf5\x4e\x27\x77\xf1\xfe\x3f\x44\x9c\xf9\x8b\x8e\x9c\xdb\x77\xb7\x6b\x95\xe2\xfd\xab\xd7\xff\xe6\x33\xba\xbb\xbd\xd9\x6d\xab\x80\x14\x59\x1c\x6d\x6d\x1b\x52\x12\xda\x94\x18\x8e\xc1\x3f\x26\x12\x15\x16\x4e\x94\x94\xfb\x28\xe4\x32\x96\x3b\x0d\xc7\xda\xd5\x40\x21\x39\x17\x3e\xa7\xc8\x3c\xf4\xe9\x00\x43\x6f\x06\x54\x08\x44\x10\x2e\xe6\x3d\xea\xf2\x29\x49\x50\x86\x2f\x31\xc3\x9f\xaf\x68\x9b\x98\xca\xbc\x34\x79\xfd\x14\xf3\x83\xd9\xda\xe7\xb5\xcd\xdb\xae\x41\x47\x14\xe8\x61\x44\x07\x70\x1e\x25\xe2\xd8\x06\x3f\x29\x94\x7b\xf0\xa8\xdb\x1a\x5c\xfa\x46\xba\xba\x82\xde\x43\x35\x75\x47\xd4\x3e\xc8\xcc\x83\x78\x4c\x1c\x2a\xd0\xe8\x63\x7e\xef\x90\xd1\xd8\x03\xf8\x9b\xe4\xb7\x11\x7b\xfd\x45\xbb\xfb\xc9\xe6\xc7\x1f\x7c\xda\x10\x5c\xa6\xfa\x67\x9c\x76\x45\x09\x67\xd6\x84\x9a\x66\xa4\x23\x34\x4d\xfe\x28\xb2\x23\xdb\x69\xc6\xbd\x27\x35\x8c\x42\x53\x23\x9a\xda\x29\xef\xdd\x8a\xe1\xba\xd6\xb4\xfe\xe2\x05\x93\xec\xda\xd5\xf8\xec\x96\x6e\xef\x32\x89\x2e\x48\x0c\xb7\xf8\xd0\x95\x39\xf9\xe0\xcf\x1a\xd5\x0e\x06\xa4\x41\x6c\x69\x14\x9f\x81\xa3\x87\x00\x83\x47\x15\xa2\x73\x92\x9e\xc1\xc2\xa4\x11\x45\x8b\x5b\x96\x24\x28\xc6\x04\xed\x9f\xf8\x3c\xf4\xf4\x79\x0e\xc9\x80\x96\xed\x7f\x04\x71\x40\x89\x3c\xee\x83\x87\xb3\x41\x95\x83\x1e\x75\xe0\xaf\x1f\x38\x7a\x50\x30\x79\x84\x91\x7b\x38\x65\x09\x18\x18\x0d\x22\x4b\xd8\x5f\x25\x59\xbc\x3f\x1e\xb9\x72\x7f\x88\x3d\x24\x77\x9f\x5e\x7f\x48\x9f\x83\xbf\x3f\xbd\xba\xbd\xfb\x27\xe8\xe6\xfd\xa7\xd7\x9f\x5e\x5f\x0e\xd3\x8b\x6e\x23\x45\xaa\xc8\x43\x5e\xa4\x49\xe3\x7c\xb4\x4b\x94\x54\x10\xaa\x71\x6f\x3b\x25\x2a\x08\x07\x56\xb9\x8a\xa5\x5c\x60\x8f\xd9\x86\x9f\x96\xf1\x9c\xe6\x06\x98\x2b\x43\x49\x91\x43\x67\xe0\xf3\x69\xaf\x03\x4a\x26\x64\x52\xed\xfb\x7a\xef\x1f\x86\xfe\x50\x0d\x7d\x92\xa4\x19\x7f\xf4\x17\x3f\xf9\x77\x57\x4c\x35\xba\xcc\xc7\xf5\x04\x89\x31\x1c\xd6\xd4\x51\x05\xc3\x26\x07\x8a\x2c\x68\x34\xdd\xef\xd1\x3e\xea\xe2\xb3\x9d\x56\x86\x1b\xbd\x4c\x04\xf5\x80\xbd\x47\x93\x5f\xeb\xed\xeb\xbd\xbb\x5d\x13\xb9\x6b\x7e\x5c\xac\x47\x91\xbd\xff\x67\x68\xe5\xae\xb9\xbd\xbb\xb4\x6e\x3c\x6f\xdb\xb8\xfb\xeb\x9f\x3e\x6e\x68\xef\x04\xcd\x42\x98\x43\x2a\x00\x87\xd3\x20\xce\x30\x12\x11\x48\xe1\xcb\x25\x44\x1f\xe5\x26\x39\xad\xde\x58\xb2\x72\xd7\xcc\x07\x14\xe0\xfc\x98\x40\x27\xad\xf5\x12\xda\x0a\xb3\x53\x05\x07\xd2\x50\x99\x24\xe9\x46\x3c\xaa\x1b\xba\x9d\xbe\xf4\xd1\x5f\xcf\x83\x1b\x1a\x80\x87\x80\x5a\xe0\xdb\xe9\x8f\xa1\xdb\xef\xd4\xcf\xc7\x8d\x49\x92\x34\x91\x8f\x24\xe6\x56\xbf\x5f\x56\xca\xeb\xd5\x43\x4a\xb3\x27\xd2\xe5\x9f\xde\xbf\x7a\xbd\x44\x43\xaf\x5e\xdf\xa5\x12\x61\xe6\x71\x85\xda\x7c\x3c\x39\x2e\xfa\xa3\x42\x85\x0d\x7b\xce\x1e\x13\x54\x18\xe3\x31\x8c\x74\x5b\x20\x81\x5b\x3f\x6b\x08\x27\xa9\xe4\xe8\x5c\x68\xc3\xb2\xd5\x30\x24\x52\xa3\x0a\xf5\x70\x8c\xfd\x25\xe6\x51\xdc\xf8\x5d\xb9\xb2\x34\x3d\x4d\xcd\xff\x0f\xbd\x8b\xa8\xa7\xe7\x3d\x03\x3b\x0f\xb6\x6e\xf7\x4d\x1e\xca\x46\x9c\xe0\x28\xd2\xae\x12\x92\xd1\x4a\x88\x26\x2f\xb7\xe6\xe7\x7d\x55\x8a\x73\xf3\x98\xb8\x9a\xea\xed\x79\xee\xc1\x45\xa0\xa1\x8f\x3d\xfd\x21\xcd\xe3\xba\x8c\x7d\xed\x5f\xfb\x11\xd7\x39\x0a\x59\x11\xb2\xfc\xe1\x9c\xb6\x3f\x97\x69\x78\x38\xed\xfa\xf0\xb3\x5d\x33\x3c\xbd\xf7\x3d\x34\xe0\xc6\x09\xe9\x95\x3f\x86\xde\xf4\x2f\x34\xff\xff\xf0\xab\x6a\xff\x8b\x57\x70\xfb\xee\xf6\x42\x29\x7c\xf7\x31\xd6\x04\x23\x1d\xe0\xf7\xdb\x9b\x1f\xb6\x8b\x31\x29\xef\xeb\xb4\x28\x0a\x50\x9b\xe2\xfe\xe4\xd2\xd3\x5c\xa8\x14\xcf\x93\x41\x18\xa6\xd1\xf7\x8b\x6f\x55\x1c\x80\xa5\x18\x34\x41\x47\x34\x71\x20\x29\x06\x3a\xa0\x9c\xc3\x71\x67\x1a\x62\x6d\x85\x61\x9a\x95\x41\xae\x81\x49\xb2\x87\x16\x1c\xd2\x7b\x6d\x99\x73\xa2\x34\x05\x56\x58\x3a\xdb\x04\x99\x6c\xd3\x3e\xfa\xee\xf4\xc2\xc8\xf3\x87\xb5\xde\xf5\x05\x7f\xf6\x0b\xdd\xd8\x95\x00\xff\xe3\x0b\x61\xc7\x35\xa9\xb9\x78\x89\xe9\xb4\xd1\x50\xc4\x9c\x46\x0d\x67\x8e\x30\xe4\x29\x99\xf7\x3e\xf2\x4a\xf2\x01\xd7\xc7\xb4\x8c\x78\xb2\xc2\xef\xf7\x88\x75\xae\x9f\x07\x94\x57\x18\x54\xb5\xa3\xd0\x58\x63\x6c\x67\x8d\x9b\x26\x67\xac\x60\xcb\xb7\x26\xa6\x30\xef\x4f\x9c\xf3\x98\xd7\x68\x9f\xb4\x06\xff\x79\x52\x5d\xd4\x45\xfe\xfb\x7f\x28\x57\xbc\xfb\xd3\xc9\xe2\xf4\x88\xa6\x48\x19\x9b\x92\xfb\x3c\xc5\x80\x7b\xd7\x08\xce\x19\x27\x9c\xfb\xf4\xec\x4a\x2c\x39\x67\xa2\xa1\xdc\x22\xec\x1e\x8e\xce\x65\xe5\xc3\xd1\xa4\xe5\x7c\x74\xe7\xf3\xb3\x6c\x71\x89\x35\xa1\x8a\x35\xbc\x11\xa6\xc3\xa4\x21\x4c\x31\xb2\x7c\xf3\x55\xba\x58\xf3\x98\xbb\x34\xd1\xaf\xb2\xc9\x9f\x45\x2d\xb6\xdf\x27\xff\x2a\xe6\x2e\xa3\x0a\xca\x5a\x43\xf8\xf4\x5c\xc9\xe2\xe6\x6a\xb2\x2f\x74\x70\xef\xb6\x17\xab\x75\xcd\x19\x7e\xe9\xe2\xde\xc8\xae\x4e\x65\x98\x13\x8f\xaa\x12\xb5\xaa\x6e\x14\x01\x4d\x6a\x59\x93\x02\x95\x06\x95\x70\x34\x42\x33\xab\x8e\x69\x45\x99\xa4\x7c\xae\xd0\xb1\xc8\x7d\x91\x72\xc0\x01\x71\x0e\xa2\xd5\x50\x53\x24\x0c\xf0\x9d\xad\xe4\x43\x9e\xa9\x07\xbb\x49\x08\x9c\x2b\x23\x88\x14\x31\xd6\x38\x2e\x2b\x52\x83\x9f\x3c\x57\x32\x10\xa1\xa5\x51\xa0\x08\x29\xa5\xeb\x68\xab\x51\x05\x07\xe1\xc9\x3e\x49\x92\xfc\xc9\x87\xfc\xa7\xcf\x74\xf5\x3f\x3e\xcf\xf2\x2f\x2b\xec\xe6\x1b\xb1\xfe\xdb\x3f\x85\x02\xe7\x28\xf8\x95\xbd\x48\xf0\xd1\xa1\xce\xa1\xe4\x31\x71\xc0\xdc\xc8\xb3\xe9\x01\xfb\xb4\x9b\xd9\xf5\xb2\xaa\x7f\x4c\xe4\x29\xa5\xe3\xc8\xc7\x69\x97\x2b\x65\xad\x8d\x50\x2a\xc7\x18\xe7\xfa\xe1\x90\x52\x09\x7d\xfc\xef\xc4\x75\xcc\x33\x4b\x67\x2e\xfc\xac\xc9\x23\xdd\xe6\x4f\x7b\xfc\x5f\x3e\xa9\x59\xff\xc3\x7a\x03\xdb\xf7\x3f\x7e\xfc\x7c\x97\xb9\xa6\x3c\xcf\x1c\x15\x65\x15\x4b\xa4\x51\xf3\xdf\xa7\x42\x18\x67\x4b\x17\x84\x68\x48\x59\x13\x0a\xe7\x06\x91\x16\xd4\xce\x08\xed\x9c\xa0\x20\x81\x9b\x00\x2e\x08\x5e\xe3\xd2\x56\xf8\x40\x69\xe1\x8a\xd2\xd5\xa1\xf6\x3a\xd9\xc5\xfd\xb0\x9c\xe9\xef\x5f\x28\x8b\xbc\xdd\x6d\x63\x06\xf5\xe6\xc3\x65\x5d\x7c\x31\x39\xd7\x74\xea\xee\xe6\x3d\x46\x2b\x37\xca\xbb\xe5\xe4\xfb\xb0\xde\x41\xfc\x7a\x93\xd0\x11\xce\xbe\xa9\x82\x98\x40\x76\xa8\xa0\x30\x0e\xbe\x87\x93\x40\x45\x00\xd3\x17\x78\xf1\x9a\x63\x73\x3e\x0a\x73\xe1\x37\xa5\x83\x1a\x26\x84\xdd\x12\x5a\xb9\xa7\x57\x3b\x6d\xab\xf2\x24\x65\xd5\xba\x9e\x3b\x83\x12\x68\x11\x19\xad\x51\xad\xa3\x35\x61\xf2\x58\xe4\xee\x8f\x4e\x66\xcd\xc3\x21\xed\xdb\x16\xa6\xb6\x5d\xeb\x28\x32\xfa\x7a\xaf\x93\xdf\x5d\xf4\x4f\xff\xbb\xa8\x6c\xf3\x15\x5e\xe4\xee\x97\x78\x91\x17\xdd\x03\x5f\x65\x2e\x73\x74\x28\xb0\xab\x4a\x74\xf6\x55\x85\xca\x7b\x8a\xaa\xaa\x6e\xd3\xb1\x2a\xa1\xa9\x31\xb8\x4d\x02\x24\xc2\xc1\xf1\x7d\x95\x62\xa8\xd0\x08\x3c\xa6\x8a\x50\x8b\xea\xb9\xba\xbe\xda\x4e\xa4\xa9\x28\xb7\x8c\x38\x47\xa9\xa3\x94\xd2\xf3\xec\xb4\xd1\xd6\x6a\xa3\x91\xd2\x5a\x43\x50\x4a\xc5\xd8\xf5\xdb\x79\xee\xbb\x6f\xe6\xb9\xef\x7e\x91\xe7\xbe\xfb\x2a\xcf\x8d\x49\x85\x6a\x56\x79\x5c\xa3\x04\x72\xd4\x03\x5d\x4c\x90\xe6\xd8\xd7\xf5\xe9\xbe\x42\x65\x55\x7b\x52\xa9\x79\x4c\x2b\xa8\xd1\x30\x9f\x50\x52\x56\x99\xf5\x33\xf1\x3e\xdd\xcf\x64\x67\xb8\xe4\xb2\xa1\xc4\x3a\x63\xed\xa4\x19\xa3\xf5\x35\xd5\x6d\xad\x71\x96\x90\xfb\x62\x3e\x53\x9a\xe6\x70\x58\x7b\xb2\x52\x13\xf3\x5f\xe6\x1f\x95\xeb\xbe\xfb\x78\x97\xee\xd1\x31\xc4\xb2\x02\xf9\xf9\x9c\x56\x50\x66\xd6\x11\x66\xf8\x6c\x58\x63\x6b\xc6\xfc\x86\xf8\x87\xd3\xe2\xb5\xe5\x51\x0c\x6e\x3b\x74\xdd\xb7\xb2\xdd\xa3\xcc\xc2\x83\x90\x2e\x66\xbb\x0f\x60\xb5\x4d\xb2\x78\x86\xa9\x9d\x8d\x7d\x57\x7f\xfb\x45\xcb\xe5\x65\xdd\x64\x9d\xed\x28\xe6\x72\x51\x9c\xbc\xbd\x7b\x29\xe6\xb2\x44\x0f\x65\x8d\xd3\x3c\x34\x0c\x95\x4a\x51\x51\x59\xc2\x20\xa2\xc8\x0f\xf3\x38\xc0\x09\x15\x10\x3c\xaa\x98\xf0\xe8\x5c\x54\xcd\x99\x34\xf3\x99\x97\x8b\x39\xdd\x59\xc6\x9d\x56\x4f\xaa\x2e\x7d\xb0\x5d\xa4\x12\xb7\xe1\x5e\x6d\xb1\x56\x8e\x34\x50\x08\x1b\x55\x5d\x16\xdb\x4f\x23\xee\xd4\x26\x45\x82\x93\xbf\x4b\xfe\x63\xf2\xf7\x09\x5b\x63\xeb\x27\x64\xd1\x66\xfb\x02\x6a\x74\x3d\xca\x7e\x8b\xd6\xea\xcf\x5f\xa1\x0b\xda\x20\xee\xeb\x2b\x1e\xe2\x89\x05\xf4\x2e\x02\x8d\x36\xca\x09\x79\x3c\x4b\xd5\x2b\x83\x6b\xb0\xc0\xab\x7d\x9a\x9b\x86\x09\x51\x2b\x41\x4c\x75\x98\x2a\x33\xef\x4d\x85\x89\x94\x65\x65\x68\x6d\x8a\x02\x95\x88\x0b\x68\xe1\x78\x58\x1c\x0c\xd9\x15\x87\xa1\x52\x69\x69\x06\x30\x0c\x49\x14\x34\x4c\xf3\xc4\x53\x8c\xfa\x00\xdd\xc3\x99\xa7\xd3\xce\x56\x9e\x17\x58\x12\xdf\x31\xd2\xd4\x85\x96\x43\xa5\x45\x51\xb2\xda\xb6\x8d\xaa\x0b\x2d\x6c\x25\x6a\x91\x63\x4a\x2a\xed\xaa\xb2\x30\xd2\xea\xd0\x0a\xc3\x0c\x59\xde\x0d\x8a\x7a\xa9\x44\x49\x26\xaf\x42\x03\x7b\xab\x4d\x92\xec\x12\x83\x4c\x3c\xeb\x7f\x13\x51\x90\xcb\xb3\xfd\x3f\x9e\xfb\x55\x3f\x7e\xf8\xee\xe6\x45\x03\xf8\xfb\x97\x62\x6a\xef\x3e\x7e\x40\xb7\xef\x76\x37\xdf\xa3\xe7\x9c\xd9\x5f\x59\xe6\x2b\x8b\x59\xaa\xab\x12\xf1\x07\x83\x74\x51\x66\xc4\xe4\x08\x17\x45\x55\xda\x52\x30\xca\x0b\x46\x29\xf3\xba\x25\x9c\x73\x5d\xe4\xe3\x84\x4a\x5f\x94\xf2\x3e\x59\xfc\x43\x1f\xab\xcc\x6d\xb1\xef\x39\x67\xb4\x24\x8c\x80\xab\x90\xe7\x14\x70\x3a\x68\xbb\xd3\x84\x68\x5d\x55\x58\x0a\xc8\xdb\xb6\xaf\x7a\x6d\x47\xc1\xc8\x14\x44\x38\xb2\x86\x33\xa1\xed\x6c\xd0\xb9\x37\x1c\xb5\x8b\xb3\x06\xb5\x2a\x72\x49\x68\x61\x8b\x92\x16\x36\x27\x25\xd6\x86\xd4\x49\xb2\x4d\xdd\x05\xdb\xfd\x36\xf9\x17\xc9\xdf\x26\xff\x29\xf9\xbf\x9f\xed\xc3\xef\x6e\x9e\x58\x5c\x92\xdf\x45\xfc\xdf\x97\x0a\xe2\x8a\x33\xf8\xf1\xfb\xb7\x9f\xdf\x3e\xeb\x4e\x7f\xfd\x8b\xb7\xc4\xc2\xc0\x2f\x7e\x96\xf6\x69\xe9\xd3\x62\x3e\x15\x0a\x8d\x1c\xa4\xb5\x50\x13\x54\xa3\x62\x3e\x32\xc1\x68\x13\x09\xce\x19\xa5\x5a\x50\x26\x5c\x96\x70\x2e\xa5\xa0\x84\x39\xc9\x09\x61\x4e\x71\x46\x2a\x59\x13\xda\x30\x42\x38\xa1\x84\x50\x3a\xd7\x8c\x35\x95\xac\x9a\xa6\x61\x4d\x23\x97\xe9\xa5\x64\xbb\xdf\xef\x1d\xb4\x7b\x0f\xf5\x10\x0e\xc8\x42\xad\x3d\x43\x1d\x3a\x23\xce\x6a\xc2\x19\xe3\xac\x69\x34\x6d\x74\xa3\x1a\x21\x4c\x4d\x3c\x73\x4d\xa3\x8d\x6a\x54\xcd\x05\x38\x42\x99\xe0\x82\x2f\x0e\x18\x11\xb5\xaa\x19\x6d\x48\xdd\x30\xce\x19\xab\x1b\xd5\xd4\xcb\xfb\x44\x53\x25\x39\x3a\xc7\xda\x90\x7d\x51\xe5\xfe\x77\x11\xf3\x7d\x41\x91\xde\xde\xa5\x17\xa6\xd1\x9f\xde\xbf\xfe\xaa\x2e\xbc\x62\xc0\x2f\x8a\x93\x2f\x08\xd4\x7e\xbc\xa6\x83\x96\x27\xb2\xc5\x0d\x4e\x73\xd0\x48\x3c\x24\xc5\xde\x29\x9e\x16\x65\x35\xee\xdd\x7e\xf1\x7b\xf7\xee\x00\x7b\xdf\x0a\xe9\xa6\x4a\x30\x5c\x98\x92\xbb\xc5\xf1\xd0\xaa\xea\x03\x75\xa8\xd8\x59\x2e\xdd\x01\x4a\xa8\xc1\xf3\x23\x52\x28\x4f\xf7\x8c\x40\x79\x38\x1c\x0e\x10\xc6\xe5\x0f\x48\x38\x31\xa1\x0c\xf5\xb8\x6c\x58\x1d\x28\x13\x27\x38\x57\x58\x93\x9a\xa5\xed\xc1\x26\xf9\xe5\xfc\xb1\x51\x25\xe5\xcf\x9f\xb1\x5d\x27\xe8\xc3\x9b\x88\x47\xbc\x64\xb6\xd7\xb6\xe1\xab\xa3\xf5\xe6\x72\xa1\xe8\x6d\x6e\x9f\xbb\x5b\x22\xa0\x0e\x31\x02\x01\xb0\xb5\x48\xca\xd2\x63\x0f\x0d\x8c\xb6\x5f\x77\xc2\x18\x4f\xcd\x78\x81\xf4\xd9\x74\x6f\x91\xe2\xe3\x63\x42\x8f\x29\x1d\x46\x36\x8d\x3b\x7d\x20\x5e\x7b\x5e\xe2\x5a\x56\x2d\xa7\xfc\x38\x0b\x34\xd2\x33\x3d\x53\x34\xcc\xd8\x95\x4a\x53\x57\xcb\x5a\x3a\x7d\xe1\xf8\xa3\xa8\xbf\xf0\xfa\xfc\xc5\x97\xc8\xe4\xea\xd2\x5c\xd9\x76\x56\xb6\xcb\xac\xcc\x0e\x20\x96\xb0\xa8\x47\x09\x83\xc3\xc1\x1f\x60\x90\xa8\xe8\xc0\xa6\x25\x28\x9f\xfa\x59\xee\x38\x60\xe3\x7a\xe1\x1d\x2a\x40\xa0\xf0\x98\x38\xa3\x5b\x67\xdc\x3e\xc9\xd2\x2a\xe6\x9a\xe9\x8b\x5c\x33\xfa\x2f\xcc\x35\x97\x8f\x89\x3d\x1d\x11\xf7\x97\xe4\xb2\x42\x0a\xda\x1c\x49\x1f\x55\xcb\xdb\xfb\x11\x1d\xc1\xef\xa8\x9b\xed\x7c\x86\x4a\x20\x87\x4e\x59\x0e\xea\x70\x70\x93\x73\xd3\x6c\xa6\xc9\xc1\xd9\x39\x94\x5f\xf8\x61\xe4\x8e\x44\xf4\xf7\xd7\x75\x9d\xa7\x4a\xf9\x73\x86\xd9\xdb\x77\xb7\x17\xa6\x48\xa9\x14\x95\x95\xa5\xec\x61\x40\x07\xd6\x04\xca\x02\x4c\xc2\xce\xc1\x2a\x68\x03\x92\xac\xb6\x35\xd9\x91\x3f\x0e\x42\x94\xbe\x64\x5b\x0d\xa4\x3b\xd4\xbd\xb3\x73\x40\x63\xcc\x3a\x54\xa9\xb8\x9f\x76\xe7\xa3\xf6\x8d\xd7\xd1\xf7\x4d\xd4\xa3\xcd\x8e\x4f\x75\x84\x7f\xf9\xcb\x98\xf9\x79\x15\xe1\xc9\x9f\x5f\x55\xc8\x3e\x7d\xbe\xbd\x1b\x16\x77\x10\xc3\x84\xe4\x43\x40\x12\x26\x63\x78\xc7\x3d\x3a\x4b\x25\x85\x81\x06\x55\x11\x64\x1d\x74\x09\x1c\x7a\x3a\xb4\x30\x6e\xdb\x61\x70\x07\xe7\x0e\x60\xa8\xd7\x5a\x6a\x61\xa4\x31\xd0\x1e\x8f\xee\x88\xb1\xd5\x8d\xc7\x18\xe5\x2b\x07\x24\xb9\xd9\xef\x54\xf2\x7e\x8d\x25\x9e\x0b\xd4\x3d\xe9\x8a\xde\x3d\x2b\xd9\x5c\xa5\xfc\x9f\xc6\x7f\xc5\x81\xa4\x67\x74\xc0\x3e\x2f\xd0\x69\x3e\x15\x25\x3a\xcf\x43\x93\x8e\x30\x99\x49\x3e\x26\x1e\xac\x9f\x44\x50\x7b\x54\x17\x04\xce\x88\x94\x05\x70\x87\xaa\x48\x71\x86\x0e\xd0\x04\xa0\xa8\x87\x71\x3b\xfa\x82\x12\x4b\x48\xd4\xfa\x37\xfd\x38\x04\xad\x8d\x2b\xb4\x25\xe4\xe1\x14\x82\xf5\x16\x5a\xc4\xed\x45\x2b\x36\xf9\xc7\xf3\xe1\x12\xd4\xad\xdb\x2e\x80\x48\x8b\x7b\x89\x4e\xb1\x0d\x96\x65\x83\x10\x2b\x44\x6c\xf6\xde\xa7\x72\x8e\x57\xe4\xc3\x5d\xa2\xea\xe5\xfa\x35\x3e\xdc\x6d\xac\x79\x86\x27\xee\xd6\x6a\xe5\x87\x8e\x40\xb6\xb5\x71\xf1\x25\x25\xee\xa7\x97\x9c\xb8\xdf\xdd\xdc\x7d\xdc\x0c\xa1\xaa\xd2\x04\xca\xca\x8c\x7e\xa5\xc4\x35\x87\x96\x40\x87\x9a\x7a\x8c\x3a\xbf\x1e\x95\x33\x3b\x16\xf9\xf2\xb2\x40\xd5\x4e\xd7\x9c\x3e\x4c\x41\xf5\xbd\x8f\xed\xb2\xb2\xcd\xb0\x04\x16\x29\x5c\xb9\x94\x7c\xbf\xf2\x26\x91\x1b\x71\xd1\x51\xfc\x6a\x5f\x3c\x13\x05\x7b\xbd\x86\xce\x1f\x63\x8e\xfc\xbb\x9b\xc5\x66\xdc\x08\xad\x2b\x52\x89\x4a\x40\x9b\x97\x07\x27\x9d\x13\xbd\x40\x25\x86\x7d\x40\xa7\x1c\x54\xe6\xc0\xe5\x60\x96\xc0\x2c\xab\x1e\xc6\x75\x5a\x52\x25\xa8\x31\xce\xa9\x5e\x9a\x0e\x55\x0f\x6d\x76\x64\x3c\x55\xb3\xe3\x0c\x35\x51\xe6\xfc\xe2\x7b\xae\x75\xa1\xbf\x88\xbe\xe7\x2f\xaa\xc3\x1f\x3f\xbc\x5e\xc9\xc6\x17\x07\x2d\x9e\x1b\xe9\xcd\xd7\x6d\x34\x71\x7d\x66\x47\x8f\x8c\x3f\x9f\x3d\x18\x7f\x3a\x09\x4b\xb9\x37\x62\x42\x93\x0f\xc2\x84\xa9\x28\x6a\xdd\x14\x0e\xeb\xde\x71\xc1\x84\xb5\x3b\x3d\x0c\x83\x6b\xdb\xc5\x4f\xf6\xd4\xd9\x07\x99\x8e\xc6\xf5\x68\xb1\x74\x9e\xc2\xb9\x07\x5b\xe5\x39\x73\x64\x10\x54\xa2\x92\x55\x86\x2d\x31\xc9\xca\xfd\xdd\x24\xff\x34\x79\xbd\xe6\x64\x6f\x9f\xad\xb2\x6b\xac\xf1\xe6\x0b\xb5\xfc\x17\xfd\x95\x4c\x64\xed\x03\xcd\xf0\x9c\xa7\xe7\x87\xd3\x06\xbb\x07\xeb\xfb\xac\xd6\xfd\x80\x70\x05\xe1\x3c\xc0\x99\x9d\x3b\x49\x0d\x93\x81\xcf\x6e\xd7\xcc\xad\x95\x46\xcc\x07\x98\xdc\xb2\xfd\x0f\xea\x64\x55\xe1\xf2\x56\x37\xbe\xe6\x42\x33\xcb\x23\x56\x25\xcb\xe8\x05\xab\xb1\x76\xfb\x26\xe8\xf6\x1b\xdd\x54\xdb\xf7\x17\xa8\xe5\xf6\xd2\xce\x71\x93\x00\xab\x45\xa7\x84\xee\xec\xa4\x01\xfb\x61\x68\xcb\x01\x8e\x04\x19\xbc\x84\x41\x20\xd7\xde\xd6\xad\x7f\x18\xfc\xda\x9f\xe9\xa4\x3b\xa5\xd5\x1c\x1a\x1a\xc1\xa8\x89\x60\xb5\xd4\x6e\xbf\x87\x7e\x18\x96\x75\xbf\x62\xa6\x17\x9f\xfc\xfb\xe4\xcf\x93\x4f\xb1\x8b\xe8\xc9\x15\x5f\x9e\xe2\xa7\x1f\xdf\xbf\x7e\x01\xfe\xbe\xb9\x4c\xd5\x4f\xff\x0a\xdd\x7c\xa9\x98\xfe\x1d\x7a\xfd\xf9\xef\xd0\xe7\xbb\x9b\xef\x77\xa4\x0d\xb6\x26\xa0\x81\xd6\xa3\x0b\xda\x9c\x51\xae\xf8\x31\xa8\x76\x02\x6e\x43\xab\xf6\x28\x0f\x24\x2d\xcc\x30\xa0\x9c\x9e\xf6\xda\x18\xd8\x13\x54\x0f\x8b\xdb\x29\xdb\xee\x24\x88\xa8\x80\x10\xbe\xc3\xed\x51\x30\x46\x4a\x6b\x51\x52\x8f\xb2\xc0\x06\xac\x75\xaa\x35\x94\x4d\x46\x84\xa6\xd2\xee\xe4\x35\xf1\x44\x52\x4a\x85\x15\x8a\x1b\x5a\x2b\xbd\x07\xca\x1a\xd5\x50\x93\x24\xdb\xd8\x1b\xb8\x9c\x2b\x3f\x3c\x65\xfb\x12\xb4\x16\x7c\xef\xbe\x36\x30\x97\xf0\x68\x7d\xf2\xbf\x0c\xa5\x37\x4d\x3f\xe1\x12\x59\xad\x09\xc7\xba\x11\x10\x3c\x0c\x1e\x4d\xb6\x75\x5a\x06\xfd\xb0\x5f\x69\x37\x0f\x48\x3c\x8c\xd7\x57\x3b\xa2\x7a\x53\x94\xf7\x9e\x8b\xc2\x15\x74\x8a\xed\xb6\xcd\xb6\xe6\x4c\x10\xca\xe5\x4c\x8f\xc7\xe3\xdc\x4d\xd3\x74\xb1\x41\x2c\x6a\xbc\x5d\x71\x2c\xdf\x64\x4e\xbe\xc4\x9b\xdf\x64\x21\xfe\x78\xf7\xf1\xc7\xbb\x9b\x86\x01\x99\x75\x9d\x16\xe8\x60\x88\xb5\x1e\x2c\xad\x3c\xa6\xb0\x8f\x04\x06\x22\x3b\x44\x9a\xbf\x5c\x70\xad\x4a\xa1\x18\x24\x69\x82\xea\xb9\xdc\x59\x27\x4a\xe7\xe8\x60\x59\x30\xae\xad\x5b\x87\xad\x67\xde\x42\xd7\x5a\x5d\x39\x68\x19\xcd\x7d\x8e\x51\xe3\xf4\x45\xbb\xe2\x74\xc1\x40\xfc\x26\xd6\x86\x9f\x67\x7f\xd7\x13\xe9\xf6\xe9\xa8\xb9\xfd\xa2\x8f\xb9\xa5\x0d\x46\xc3\x7d\x8b\xc6\xb2\x46\x5d\x4b\x0d\x92\xf3\xe2\x28\x94\x3e\xd6\x85\x8b\x34\x18\xa8\x69\x15\x30\xdd\x19\x65\x9d\x93\x1c\x4c\xd3\xb5\x0e\x8e\x76\x79\x83\x45\xa5\xeb\xf7\xc6\xd7\x41\xc7\x31\xd0\x98\x37\x59\xcf\xe9\x65\xbe\x3e\xbc\xfe\x90\xdd\xbd\x59\x2b\x2c\xaf\x5e\xbf\xbb\x54\x39\xa2\xfd\x89\x59\xf4\xa7\xa6\xf3\xb5\x34\xfb\xe1\xf6\x53\x56\x9d\x8a\x50\xa4\x61\x66\x78\x1a\xed\x61\xa8\xa6\x2c\x17\xc4\x36\x02\xe5\xa6\x3d\x52\x6a\xcb\x32\x0f\xb9\x3c\xf5\xca\x48\xd9\xb6\xbe\xdd\x9c\x90\x05\xed\xa1\x99\xcf\x07\xd9\xa2\x23\x0a\xe8\x2c\x35\xd3\x72\x6e\x29\x74\x13\x9c\x4b\x8c\xab\x7d\x7d\x52\x84\x05\x4d\xad\xee\x52\x09\x64\x9f\xa4\x69\x8b\xce\x97\xe7\xfb\x17\x4f\x0c\xca\x6f\xb7\xdf\x6f\xd6\x9c\xff\xee\xdd\x5f\x27\xd9\xf6\xfd\x8a\x4f\xdb\x1a\x2d\xb8\x54\x69\x5e\xcc\x7e\x09\xcc\xab\x2a\xb7\xb9\x12\x01\xbc\x04\x5d\x22\x5d\x97\xbe\xac\x76\x96\x49\xa5\xd9\x64\xe5\x70\x52\x23\x86\x53\x8f\x2a\x84\xa9\x23\xdd\xa9\x3c\x75\x2b\x9f\x99\x7f\x6c\x22\xbf\xf5\x5f\xad\x6b\x69\xad\xa0\x5e\x38\x4c\x96\x90\xf1\x36\xfa\x7b\x9f\x5e\x7d\xbc\xfd\x61\x37\x2d\x11\x70\x9d\x09\xe8\xf6\x9d\x51\x26\xb8\x20\x0f\xe0\xe0\xac\x8d\x40\xe7\x9d\x72\xbc\x80\xce\x03\x33\xd6\x4a\x0e\x55\x4a\x05\x33\x0a\x31\xe8\x41\xc0\xe2\x27\x94\x7d\xb6\x2f\x16\xff\xa4\x8f\x7c\x5d\xab\x66\xe3\x97\x4f\x8d\xed\x4e\xb7\x3f\x44\x34\xde\xe8\xa0\x06\x9d\x49\x38\xa2\xfa\xbe\xea\xd1\x31\x96\xd8\xd8\x4e\x38\x51\x80\xf3\x0f\x9d\xf7\xdb\x11\xff\x9c\x67\x6c\xad\x2b\x91\x1b\x73\xc9\x8d\xfd\xd5\xcb\x3a\xde\x75\x79\xbd\x40\xa5\x34\xa8\x0d\x31\x53\x94\x40\x12\x22\xc7\x3b\x37\x86\x39\x6a\x32\x1d\x84\xb7\x6e\x53\x2c\x27\x9a\x87\xce\xcf\x5d\xca\x3c\x62\xa9\xf6\x1d\xef\x3c\x6f\x06\xcf\xdd\xea\x83\xf7\x31\xc7\x68\x92\x32\xf9\xab\x24\xfd\xd7\xf5\x13\xde\xfe\x89\xf1\x28\xcd\xd6\x3c\xca\xab\xd7\x77\xdf\xbf\xfd\x7e\x4b\x59\x85\x06\x4f\xce\x1d\x6a\x24\x1c\xba\x09\x5a\x89\xf8\x38\x8a\x90\xe6\x15\x69\x0f\xcd\x7c\xc6\x14\xef\x8c\xef\x3d\x24\xd0\xf5\x7b\xbb\xdf\x1f\xbd\x73\x47\xd4\xa4\x85\x0f\xe6\xde\xa0\x12\x75\xa7\x9e\x26\x09\x42\xc3\x63\xb8\x09\x9b\x21\xf9\xed\xcb\x7b\x5d\xee\x33\x15\x69\x1e\x62\xda\xde\xff\x5c\xa7\x7e\x3e\x67\x38\xaa\x20\xcf\x9d\xf7\x29\x8b\x5c\xa7\xe2\x46\xed\xaa\xe4\x9f\xac\xbe\xfc\x77\x6b\x37\xee\x8d\xfa\x59\x6b\xe5\xa7\x5d\xe5\x1f\xce\x01\xc8\x41\x20\x8f\x8e\xe9\x71\xc5\xcc\xd8\xc8\xab\xe1\x93\x37\x97\x3e\xc3\x3f\xac\xbe\xcf\xab\xed\x8a\xc4\xbd\x44\x78\x37\xef\x93\xec\x92\xaf\xfb\xe9\xfd\x2e\xbb\x1c\x49\xaf\x23\x68\xff\x87\x1f\x17\xab\xb9\x99\x42\x91\x9f\x11\xe6\x55\x35\xe7\xd6\x34\x61\x14\x8a\xa1\x60\x51\x83\x1b\xc3\xea\xa9\x6d\xfd\x85\x68\xa5\x35\x54\x1c\x05\xf4\xe0\x69\x08\x6a\xe7\xeb\xa2\x84\x21\xf8\x12\xcf\x16\x44\x43\xb5\xe4\x72\x63\x88\x45\x39\x9c\x68\xc3\x84\x72\xe3\x1e\xc6\xb6\x5d\x2f\x29\xa9\xb3\xa3\xb7\x84\xb1\x35\x5f\x37\x3d\x36\xb1\xee\xf8\xa5\x9f\xf9\x92\x65\x7f\xf3\x27\xb8\x88\x2e\x59\xc9\x77\xbb\x9b\xed\x55\x20\xe2\xa7\xf7\x2b\xba\x78\xfb\xe9\x73\x56\x6e\x34\x38\x54\xdf\x9f\x50\x03\x21\xd5\x16\x86\x10\x50\x6d\x9d\x7f\xa8\x50\xc0\x65\xc0\x45\x2a\x07\xaa\x91\xd3\xe3\x3e\x26\x89\xf0\x7e\x1f\x14\x87\x1e\x9d\x29\x41\x89\xaf\x77\x8d\x6b\xe7\x63\x5a\xb6\x6d\xdb\x82\x3e\x2f\x7f\xe6\x91\x90\xb2\xa9\xdd\x68\x5a\xa3\x98\xa9\x5d\xc1\x59\xad\x8d\x66\xdc\xb9\x24\xd9\x6c\x92\xc8\xb1\x6e\xbe\xa5\x63\xf1\x4c\xad\xea\x4f\x08\xc0\x6e\x08\xaa\x0b\x9f\xa3\x06\xba\xfc\xd0\x8a\x10\xe4\x41\x9e\x1b\x38\x92\xcc\x6b\x6a\x25\xc7\x4a\x35\xb3\xe6\x91\x0f\xbe\x6d\xb7\x7b\xa6\x24\x77\xb8\x50\xc6\x58\x11\x84\x55\x7b\xa8\xdc\x4c\x04\x2f\x3d\x8e\x12\x16\x95\x19\x17\x1f\xf4\xf4\x28\x6e\xdc\x0e\x7f\x13\x87\x91\xad\x30\x8c\x9b\xef\xde\x5e\x71\x18\x1b\x95\xf6\x51\x77\x6e\x62\xa2\xaf\x2d\x30\x5e\x11\xed\x0a\x57\x36\x55\x0d\x63\xc4\x53\xed\xf0\xcc\x61\x74\xc0\xcb\x80\x78\x7f\x21\x9c\x3f\xf1\x56\x56\x59\x19\x19\xe7\x37\x1b\xfa\xe8\xa2\xae\xfe\xb5\xab\x20\x41\x17\xb0\xd1\xeb\xf8\xf9\xeb\xdf\x1b\xcc\x1e\x46\xee\x11\x83\xee\x7a\xed\x9a\x3f\x1e\x9d\xdb\x95\xf3\x09\x99\x07\x83\xd4\x83\x45\x3a\x49\xd0\xa6\xba\xe8\xc8\x7e\x77\xe1\xe5\xbd\x8b\x64\x07\x97\x73\xe2\x77\xe8\x87\x1b\xcc\xcf\xb0\x4f\x79\x1f\x1e\x93\x9c\x50\x4b\x1b\x64\x77\xc2\x11\x0c\xc1\xdf\x0f\x9b\x1a\x0a\x90\x5e\x7a\xd4\xa6\x18\x0d\x91\x93\x28\xdd\x24\x8f\xfd\x8d\xdf\xb1\x4b\x9c\xfe\x45\x9a\xe5\xc3\xed\x45\x49\x6b\xb5\x50\xe8\xf6\xdd\xed\x26\xe1\x41\x3b\xeb\x8c\x01\xae\x53\xf7\x30\xf0\xd4\xda\x8d\x88\x6c\x3e\xa7\xd8\xb9\x59\x44\x63\xf4\x60\xfd\xa6\x58\x01\x52\x2b\xff\x60\x15\x7d\xd7\x2a\xce\xfc\xdb\x6c\xd5\x90\x5b\xa9\x1a\x9e\xf3\xec\x67\xef\x5f\xbd\xbe\x7b\xbf\xe9\xbd\x44\x04\xea\xac\x08\xfb\x3d\xd3\x8c\x60\x4a\x69\x98\xcc\xd4\x42\x5f\x6d\x6b\x0c\x0e\x9d\xbc\x87\xc2\xcd\x85\x16\x65\x8b\x45\x2a\xa0\x81\xc1\xa0\x1c\x8d\x26\xf9\xb3\x94\xff\x7f\xa4\xb5\x3b\xfa\x07\x5b\x1c\xc2\xa6\xed\x66\x92\x56\xf3\x78\xbd\x8e\x05\x73\xc0\x0a\x51\xa7\xac\xbe\x70\x7a\x0d\x1b\x92\x53\x07\xb2\x64\x4d\xca\x9f\x7e\xf8\x2b\x5a\xbb\x5c\x3f\x0c\xba\xd8\x07\x66\x8a\xb4\xd6\x1a\x6a\xa4\xc4\xf2\x3f\xa2\xd6\xee\xb7\x7f\x1e\xed\x49\x77\xe1\x00\xfd\x6d\xf2\xe7\x97\x1e\xcf\xff\x98\xfc\xef\xcf\xd4\xf9\x97\x65\xf8\xe1\xf6\xc3\xcd\xf3\xa4\xe1\x76\x65\xb9\x59\xf7\xe9\xdb\x27\x58\xf1\x9b\xdb\xbb\xdb\xed\x37\xde\xb7\xfe\x64\x5b\xf8\x88\xaf\x38\xde\xe3\x93\x9b\x8e\xa6\x28\x69\x23\xaa\xba\x26\x5c\xa2\x73\x4d\x85\x2b\x4c\xc1\x89\xa8\x83\xf7\x0f\xa5\xcf\xd8\x2c\x4d\x81\xd7\xb7\x34\x42\xa3\x53\x4d\xa4\x2f\x4c\x5e\x30\x22\xea\x9d\xb6\xce\x39\xb7\x6c\xaf\xb6\x22\x0d\x69\x44\x5d\x33\x2a\x2c\xe1\x4c\xb8\x7d\xd9\xd4\x42\x08\xa6\x90\xbb\x67\xcd\x46\x83\xb2\x50\xa3\xa1\x5c\xde\x48\x04\x89\xed\x3d\x82\x51\x69\xfb\x92\x36\x8c\x49\x9a\x24\xc9\x3f\x4d\xf5\xa3\x7a\x16\x13\xff\xfe\x52\xbd\xfc\xc2\x5f\xb3\x46\xee\x4b\xdc\xf7\x92\x63\xe3\xe2\x32\x2f\x51\xcb\xeb\xaf\x5b\xcf\x2f\xcd\xe8\xdb\xeb\x6e\xfe\x70\xfb\x0e\x5d\xae\x0c\x23\xef\xd1\xc1\x18\x68\x52\x7a\x8f\xd3\x64\x89\x8a\x63\x53\x86\x4c\xeb\x95\x95\x86\x0b\x2e\x99\x7a\x18\x34\xe5\x92\xa7\x1d\xa9\x2c\x26\xbe\x2e\x5c\x51\x65\x58\xfd\x3c\x6a\xdf\xb6\xa8\x0e\x01\x55\x7d\xbf\xcb\x95\x9a\xcc\x51\x58\x2b\x8c\x34\x42\x88\x49\x4a\xa8\x98\x50\x52\x52\x6a\xa8\xe0\x8c\xcb\x46\xf2\x4a\x88\x4a\xf1\x33\x48\xe7\xd0\x12\x86\x3f\x75\xbe\x27\xbb\xd4\x5d\xb8\xbc\xbf\xe4\x4c\xff\xe3\xd3\xa9\xf2\x6e\xad\xa6\xbc\x79\xb7\x2a\xb9\xbc\xb9\xfb\xf1\xee\xcd\xdd\xf6\xd9\xd7\x9b\x6f\xb2\x43\x45\xa3\xf3\xf9\x2e\x1d\x37\x02\x8a\xb4\xf6\x20\x3d\x68\x9f\x62\xa8\xa2\x10\x64\x5a\x2d\xf7\x39\x3b\xa4\xc0\xa5\x0a\x19\x30\x73\xb1\x4d\xe6\x80\x53\x26\x44\x4d\x4a\x56\xd7\x83\x3d\xd8\x83\x47\x1d\x86\x64\xc7\x9c\x84\x7d\x0f\x15\x1a\x7b\x44\x24\x74\x5a\x6b\xbe\x04\x7d\xc6\x40\xcd\x58\x61\x0a\x8a\xf0\x13\xe2\xb2\x4c\x55\xe4\x5a\xc8\xe3\x7d\xad\xfd\x43\x57\x2c\x01\x49\xfe\x73\xf2\x7f\x7e\x9b\x91\xe8\xe6\xed\xcd\xdd\xaf\x71\x0d\x44\xfa\xa1\x9b\x0f\x1f\x77\x6f\x2f\x8f\x3b\xca\xd5\xee\x6e\xde\xfe\x25\xfa\x70\xf5\x93\xde\xfd\x14\xeb\x95\x9b\x24\xa0\x32\xe6\x8e\x02\x1c\x03\x4c\x08\x2b\x87\x51\x5e\x62\x5f\x97\x68\x0f\x3c\xc2\x6c\x15\x38\x14\xee\x0f\x18\x8b\x16\x9d\xc1\xb3\x3c\x67\x48\xc6\xe4\x8e\x90\xd9\xc9\xf4\xbe\xf6\xa2\x02\x37\x9d\x61\x4f\x51\x71\xc8\x0d\x22\x9d\x84\x44\xed\xb4\x10\xc2\x6a\x2d\xa5\x3d\x62\x16\x49\x7b\xb4\x54\x5c\x4b\x8d\xda\x0a\xcb\x40\xa5\xac\x8a\x9c\x71\x3e\x48\x09\xd4\x08\x27\xaa\x3c\x77\x85\xe4\x95\xc5\xb5\xa8\x08\x13\x4f\xf3\x62\x77\xec\x49\x9b\xee\xdf\x27\xff\x73\xf2\xf7\x6b\x27\xc5\x15\x80\xf0\xf1\xff\x65\xed\xed\x81\x25\x47\xf2\xfc\x30\x24\x50\x55\x0f\xcb\x8f\x25\xba\xdf\xf6\x36\xb8\xc7\xe5\xe1\x6d\xcf\x4c\x83\x47\xea\x98\xda\xbe\xee\x4e\xea\xb4\x77\x79\x94\x14\x4c\x06\x65\xa4\x14\x52\x44\x32\x42\x1f\xa9\x50\x84\x98\x06\x15\x91\x21\x2b\xcd\x34\xd3\x4c\x33\x4d\x98\x30\x61\xc2\x84\x09\x13\x66\x99\x30\x61\xc2\xac\x9d\x57\xc8\xa7\x40\xa2\xea\x7d\xf4\xf4\xcc\xee\xea\x34\x33\x78\xaf\xba\x66\xe6\xbd\x2a\x14\xf0\xff\xfc\x7d\x3c\xf3\xa6\xfb\xf8\xc2\x9b\x2e\xf4\x3c\x3f\xa2\xd4\xf4\x24\xd4\xf4\x66\xbd\x5c\xe2\x79\xad\xf9\x5a\x34\x36\xde\xc4\xe2\xe9\xb1\xc7\x28\xd7\x39\x8a\xa7\xf0\xcd\x23\x93\x97\xa0\xc8\x72\x5b\xac\x67\x68\x43\x62\xad\x47\x77\xa6\x8e\xd3\x01\x0c\x41\x68\x2d\x1c\x07\xba\x90\x86\x61\x4d\xc9\xc9\x5e\x1e\xd1\x19\x13\x56\x06\xe1\x82\x92\x11\xcf\x4b\x82\xc3\x89\x31\x5a\x69\xad\x0d\x8a\x6b\x6e\xbb\x51\xeb\x93\xd6\x0f\x91\x0e\x1e\xe3\x9b\x17\xa1\xba\x74\x9f\x7f\x16\x14\xe0\xae\x39\x20\xa8\x21\x5f\x9d\x45\x9e\x43\x34\xbe\x74\x2c\x7e\xd6\x38\xdf\xed\xef\x3e\xde\xed\x06\x17\xe7\xf6\x2c\x6c\x9c\x82\xa3\xa2\x4c\xf0\x25\x97\x8c\x71\x29\x92\xf2\x7c\xb4\x6b\x2d\x9b\x94\xc1\xc6\x28\xb8\x84\x1c\x01\x39\x8f\xd7\x47\xbe\x3d\x28\x3f\x79\x37\x86\x75\x00\xe5\x98\x63\x02\x89\xa4\xc8\x0b\x2f\xb5\xf5\xfa\x3c\x12\x92\x14\x7e\x58\x6b\x2c\x54\xd7\xf5\xf5\xfa\xde\xbc\x2e\xff\xff\xc1\x5d\x7c\xf3\xc8\x2d\x6b\x82\x88\x9a\xf3\x94\x8f\x16\x0c\x76\xb3\xaf\x87\x76\xe4\xbb\xf4\xfe\x14\xd8\x94\xd7\xc3\xc9\xce\xcf\x02\x44\x31\x9b\x46\x36\xce\x87\x54\xa9\xaf\x01\x2f\x1a\xf9\x15\xe0\xc5\x3f\x08\xd7\x61\x7d\xa8\x1e\xf3\xf0\x5d\x40\x5e\x5f\x19\xa2\x9b\xe8\xc2\x55\xde\xe5\x9b\xb7\xcf\xd1\x56\xdb\xf5\xf8\xea\xee\xd5\xcd\x0b\x31\x94\xab\x52\xd6\x3e\xad\x8a\x02\xa4\x00\xd1\xd6\x2c\x93\x32\x12\x54\x18\x10\x4e\x7d\xb4\xcb\xef\xa7\xa0\xdb\x6a\x70\x21\x73\x04\x2a\x50\x38\x55\x22\x89\x40\x59\x2d\xca\xb9\xab\x31\xf6\xa1\x82\x65\x31\x48\x4b\xd6\xa4\x81\x65\xc7\x31\xf1\x6e\x99\x35\xc8\x21\xa6\x98\x10\xb9\x86\x4e\x58\x72\x82\x89\xd7\x0b\x27\x24\xae\x66\xe9\x6b\x19\x3e\x17\x7e\xc1\xe6\xef\xc3\xbc\x60\xfd\x44\xfe\x2e\x62\xd1\xff\xfe\x38\xe5\x08\x9d\xc5\xe7\x47\xf5\xa6\xab\x31\xe2\x05\x20\xf9\xaf\xc1\x87\x97\xbb\xa7\xe7\xe4\xa4\x3f\x07\xd7\xb1\xd4\x65\x39\x7c\xc9\xb6\x1f\x3e\x85\x91\xd4\x89\x6c\x23\x91\xdc\x0f\xa8\x3c\x16\xa5\xc1\x65\x45\xcb\x0a\x22\xe7\xce\xc2\x75\x45\x19\x67\x84\x4a\xc4\x3a\x1b\x7c\xe9\x75\xc6\xa7\x8e\xc5\x5a\x2b\x29\xcc\x42\x34\x17\x52\xf6\xb6\x8c\xa5\x6c\x26\x90\x11\x5f\xfb\xf9\xe4\x6b\x0c\xf2\x41\x32\x44\xc4\x11\x98\xb4\xe6\xcb\x29\x57\x07\x65\x78\x66\x1d\xe5\x04\x61\x26\x94\x46\x82\xf9\xc9\x5a\x90\x63\xe8\x8f\x98\x33\xce\xf2\xa9\xc8\x0b\x56\x58\x82\x29\x48\x65\xc5\xac\x2d\x48\x23\x84\x1a\x4b\xa2\x2b\x41\xa0\x43\x4a\x52\x83\x09\xa6\x10\x0a\x37\x72\x51\xac\xb1\xe9\x67\x60\x0e\x7b\x1a\x13\xbd\xba\xb8\x25\xff\x26\xe8\xc1\xfc\xdb\x88\x5c\x77\xff\x8f\xf0\x90\x8f\x77\xef\xd7\xab\xe1\x97\xcf\x69\xaa\xcf\xfd\xe5\xbf\xfd\xb0\x69\x58\x7f\xbc\xa8\xe7\x86\x53\x19\x4e\xe2\x6e\x40\x45\x9c\x1e\x29\x90\xdf\xd7\x40\xe6\xc5\x08\x4e\x18\x40\xe2\x69\xe1\xdd\x0e\xde\x0f\x2e\x89\x02\xf9\x3e\x02\x0d\x87\x1a\xb2\x98\x18\x6a\x88\x5e\xb2\x0a\x19\x0d\x31\x4c\x6d\xa1\xfc\x48\x6b\xe1\x4f\x55\xc1\x2c\x3b\x18\x4c\x6d\x6b\x2d\x67\x96\x7b\xd6\x32\xdf\x2d\x35\x08\x5a\x4e\x7e\xa0\x9c\x72\x06\x5d\x43\x1b\x47\x46\x58\xa4\x50\xe0\x06\x11\x06\xb2\xb2\xad\x69\xb5\xe1\x8f\xe0\x03\xbd\xe8\x52\xfc\xf5\x05\x2b\xf0\x45\x05\x06\xde\xdc\xbd\xde\xc0\xf8\x57\x15\xaf\x0d\x8b\x1f\x27\x57\xc6\xc4\xdd\x26\xb5\xb1\xd9\xc6\x87\xa9\x6a\x1c\xf6\x33\xef\x36\xd2\xee\x6e\xda\x0a\xb0\xd3\x3d\xea\xed\x18\x5b\xdf\xa5\x05\x25\x9a\x3b\x0c\x61\x6a\xf2\xda\x50\x53\x91\x4e\xc3\x6c\x69\x2a\xe3\xe2\xa3\xe5\x59\x2e\x20\x3c\x0b\x30\x56\xb0\xd4\x8d\xd7\xa4\x15\x1d\x14\x39\x96\xe4\xa0\xa4\x51\x36\xac\x75\xfc\xbc\xf6\x8b\xa6\x2f\xfd\xd0\x1d\xc7\xdc\x1b\x90\x1a\xa1\x55\x0d\x22\x20\x3c\xf3\xce\x9f\x28\xc8\x01\x01\x33\xe7\x79\x4e\x10\x1e\xb5\x9f\xb8\x80\xbe\xe8\x84\x50\xe0\x88\xb3\xa1\xde\x3c\x89\x7e\x16\x30\x13\xd5\x0f\xb4\xba\x7e\xf7\xff\x41\xad\xeb\xb9\x40\xd7\xa7\x7f\x0a\xc0\x75\xd6\xbc\x76\xee\xf1\x0c\x88\xad\x2d\x60\xf7\xce\x35\x0d\xc0\xb5\xed\xce\xfd\xe5\x41\x7f\x3f\x27\xcd\x99\xee\x8a\x25\x93\xa2\x6c\x1c\xa9\xd2\xca\x54\xbb\xcc\x70\xc1\xac\xf0\x82\xe9\x82\xc9\x8b\x5c\x57\x0b\xf8\xa6\xd3\x55\x6f\xdf\x7a\x43\x15\x33\x41\xa1\x0b\x95\x14\x34\x7e\x1a\xe9\x09\x94\xa0\x5d\x1c\x11\x18\x41\x65\x01\x2a\x18\x23\x1b\xaf\x99\x5f\xb0\x81\xff\x38\x4c\x7a\xfe\x22\x82\xc1\x21\x3f\x6c\x61\xfe\x54\x70\xe0\xe1\x4b\x74\x20\x6b\xb2\x22\x96\xee\x3c\x39\x50\x16\xa0\x91\x10\x4b\xe2\x05\x81\x02\x92\x0c\x14\x01\x67\xaa\xd7\x6e\x58\xce\x31\x5c\x0b\x60\xbe\x14\x60\xca\xd2\x3a\xcd\x62\xe1\x73\x0b\x24\xf3\xac\xd6\xbe\xa4\x40\xaa\x80\x0f\x44\xf0\x0a\x10\x24\x7e\xfe\x0a\x40\x70\xaa\xe9\x4b\x80\x20\x82\x2f\x11\x82\xbb\xe8\xf4\x40\x6f\x32\x50\x85\x1e\x77\xf3\xf0\x7a\x86\x7c\xfa\xf6\xd9\xe3\xa4\xae\xbc\xb6\x76\xad\x07\xf7\xc6\x79\xed\x5c\xe0\x60\x56\x4b\x43\x48\x4c\xbd\x99\xec\xe3\xa3\x68\xfd\xb9\x3b\x74\x93\x3e\xe3\xe4\x47\xd7\x1c\xfd\xed\xe5\xfb\x29\x76\x8b\x08\xad\x42\x3c\xc6\xd5\xc2\x83\x8e\xd9\x81\x2e\x93\x3d\xd9\xf5\x4b\x94\xc6\xf3\x03\xbd\x11\x81\xef\x7b\x1b\xfa\xdb\x27\x96\xdb\x35\x3e\x87\x0e\x7c\x43\x02\xfe\x58\xde\xb9\x86\x9f\x1d\xa4\xe8\x44\x50\x55\x12\x90\xde\x1b\x90\x43\x94\xaf\x55\x4b\xc3\xa0\x85\x14\xf4\x80\x75\xb6\x10\x8a\x01\xe8\x16\xe4\x82\x03\xf8\x7a\x1c\x8c\xd4\xdc\x42\xc1\x16\x12\xb7\x9c\x2c\x25\xa8\xb1\xb4\xd8\x4a\xed\x19\xa8\x71\x51\x6b\x22\x3d\x3c\x8f\x52\x26\x85\x1f\x9d\xe7\x36\x4a\x2f\x1e\x5e\x2c\x60\x92\xd7\xcc\xff\xb7\x81\xf3\xb6\x76\x2b\x2f\xf4\x78\x3e\xbe\xba\x7b\x95\xbc\x7b\xf3\x61\xff\x32\xa5\x5c\x9e\x7d\xc1\xbf\xdc\x3a\x9b\xc0\x71\x7a\xce\x35\xdf\x8f\x19\xa9\x4a\x9b\xb1\xb9\xc6\xe0\x68\xdb\xf6\x3c\xad\x4f\xa4\x36\x7f\x7c\xc6\xd7\xb3\x03\x6c\xa3\x62\x92\xfb\x0c\x14\x33\x30\xeb\xfb\x46\xb2\x9a\xf9\x31\x66\x73\x2f\xbb\x71\xa7\x6c\x9e\x21\x06\x1d\x41\x2c\x36\xbe\x00\x7c\xd4\xd7\x67\x20\xbf\x3c\xb3\x18\x6b\xd7\x02\xc2\xda\xa6\x69\x7c\xcd\x2a\x61\xa8\xe6\x4a\x1b\xb6\xc6\x08\x13\x7c\xb3\x60\xb8\x86\x7e\x1d\xdd\x5d\xf4\x0b\xfe\x4d\xc0\xdf\x7d\x05\x25\xf8\xb5\x4a\xe1\xc7\xfa\xb4\x04\xee\x22\x4f\x02\xbf\x7c\x23\x6c\x33\x50\x7b\x1a\x28\xcd\x06\x43\x5d\x22\xe0\x40\x69\x24\x26\x82\x9e\x04\x36\x98\x9d\x8f\x96\x09\xa3\xe2\x9e\x42\x5b\x52\x1b\xd8\xb3\x07\x78\x9e\x2a\x53\x19\xb3\x7e\x89\x53\x2d\x14\x51\xa2\x5f\x4e\x71\xaa\xb1\xa5\x9c\xdd\x4f\xba\xc2\xb5\x2e\x60\xad\xa8\xd6\xba\x82\x95\xc9\x8d\x29\x9d\x8e\xd2\x78\xb8\xe8\x3e\xff\xc3\x2f\xa6\x12\x7f\x60\xba\xf7\x23\x5a\x5a\xd1\x4e\xf9\x0a\x90\xfb\x16\x20\xdf\xc4\xa6\xde\xa6\x7a\xb5\x6d\xce\x26\x39\x7a\xbe\x99\x6e\x1e\xe3\xd2\x33\x17\xd7\x0b\x5b\x8f\x03\x59\xef\x5f\x60\x43\x3c\x9b\xaa\xf5\x2f\x6f\x96\x41\xb8\x79\x76\x02\x50\xee\x07\xbe\xc6\xae\xe1\x71\x66\x70\x1b\xf4\x7c\x7e\xb0\xdb\xbe\xaa\x3b\x07\x34\xfc\x2f\xdf\xde\x6d\x00\xe6\x8f\x77\x2f\xe0\x8e\xf1\x04\x4e\x01\x77\x04\xba\xfb\x11\xf4\x3e\x65\xc9\xf1\x5c\xda\xb8\x5d\x88\x2e\x72\xc0\xa0\x2b\x41\x76\x8f\x41\x5a\x24\xf2\x09\xe2\x98\x73\x6e\x84\xd6\xc2\x37\x5e\x69\xe3\x47\x8c\x55\x49\x8d\xa1\xbe\xf3\x39\x63\x60\xf2\x27\x13\xe2\xab\x7d\xd8\x7c\x44\xfe\x79\xa8\x8a\xb7\xbe\xef\xc9\x11\xeb\x85\x66\xe0\x66\x8a\x15\x54\x03\xbf\x10\x0d\x7c\x54\x7b\xd9\x5f\x55\x03\x07\xd2\x3f\x44\x45\x19\x4b\xdf\xeb\x49\x72\xba\x94\x4c\xf0\xde\x3c\x44\x40\x95\x45\xdd\x42\x30\xd6\xa0\x13\xa7\x8c\xad\x97\x51\x52\x48\x89\x59\xa1\x30\x39\x1f\x2b\x90\x6d\x20\xff\xdc\x4f\x07\xa5\xcb\x1c\x23\xa3\xa5\xc6\x78\x1c\x30\x56\xca\x1a\x84\xb2\xd4\xf8\x42\x65\x6b\x99\xdc\x2c\x72\x93\x65\x01\xe3\x0b\xed\xc0\x9f\xc5\xfd\x9f\xa0\xe1\xf1\xd8\x9d\xfc\x04\xc2\x3a\xb0\x87\x6a\xcf\xe2\xf2\xbe\x8c\x73\x2f\xcc\x05\x07\x9b\x9f\xeb\xe4\x74\x4e\x1f\x03\xd4\x7a\xd4\xa2\x7d\x88\xf8\x0c\xe6\xd3\x8c\xe6\xf9\x2b\x32\x1e\xb9\x08\x52\xdb\xe2\x21\x62\x8a\x5d\x74\x3c\xf0\x36\x77\x6f\x43\x4d\x77\xd5\x7f\xfa\xf7\x61\xc6\xf4\x26\x24\xb3\x6f\x3e\xbf\x7a\x14\xdc\x7e\xb5\x56\xfb\xb7\xcf\x67\x48\x2f\xc0\xfd\xb7\x4f\x0c\xd6\xef\x9e\x31\x58\x3f\x6d\x2a\x4c\x87\x9b\xbd\x70\xc3\x89\x02\x7c\xf4\x08\xf4\x1b\x6e\x22\x02\x88\xce\xa9\xca\x4b\x4e\x28\x66\x25\x64\x6a\xa9\x74\x56\x50\x4c\x11\x41\x44\xb8\xa3\xcd\x72\x30\x52\xed\x8c\xb2\xd5\xbc\x16\xba\x68\x90\x12\x53\x31\x73\xab\x25\xf6\x2a\xcf\x13\x59\xeb\x86\x6a\xd9\x03\x6a\x9d\xb3\xbe\xed\x95\x11\xb1\xc9\x29\x41\x58\x51\x8c\x0a\x2a\x9a\x82\xe0\xb5\x83\x80\x9c\x70\xe3\x69\x59\x96\xba\x96\x4c\x68\xc5\x2d\xb1\x50\x84\x11\x55\x8f\x09\x61\xba\x0c\xbe\xe5\x09\x38\x05\x2d\x99\x35\xe7\x7c\x1b\xf8\x0d\xa1\x95\xbe\x16\x72\xdf\xbd\x07\x97\xc9\xea\x9b\xa0\x3d\x14\x08\xe7\xaf\x6f\xc3\x74\x75\x7b\xf4\xf1\xf2\xef\x5f\x87\xf0\x8c\x60\x0e\xe6\xfb\xf1\xa8\xbb\x38\xcf\x4b\x3f\xd6\xd6\x18\x29\x84\xb4\x90\xa8\x0a\xbb\x04\x59\xcc\x55\x87\x4d\x65\xad\x16\x15\x93\xf8\x60\xa8\xb0\x8b\xf6\xd0\x33\x0e\x38\x68\x93\x8c\xe0\xc5\x82\xd2\x1f\x0d\x56\x56\xb8\x25\x8a\x79\xad\x25\xc8\x00\xf7\x66\xe1\xb1\x69\x5d\xf8\x83\x09\xff\x89\xe7\x6d\xe5\xba\xad\x6e\xa5\x17\x8c\xcb\xbf\x0e\x1d\xce\xbf\x7b\x56\xb7\x6e\xf7\xd6\x9b\x6f\xdf\x3e\xcb\x3b\x77\xbf\xf9\xee\x77\xe0\xe6\xfd\xe7\x8f\x77\x9b\xd7\xf7\xc7\xc0\xeb\xbf\x98\x7c\xbf\x79\xd1\x6b\xef\x6a\x1b\xa4\xb0\x70\x49\x64\x99\x7b\x06\x50\xea\x3b\x24\xdb\x32\xb5\x19\xf7\xa7\x41\x76\xd9\xf0\x10\xb5\x96\x53\x50\xfb\x23\x20\x4e\x39\x50\xde\x4f\x89\x76\x18\x59\xb2\x50\x02\x35\x24\x07\xc5\x8d\x32\x52\x30\x8c\x75\xa9\x61\x59\x64\x90\x95\x96\x62\x4c\x0a\x93\xbb\xe5\xe8\x89\x77\xec\x08\xc8\x18\xab\xef\xa7\xab\x2e\xbe\x8d\x9b\x72\xb4\x65\xab\x6d\x8d\x1a\x13\xdd\x5c\x76\x46\x7f\x3f\x5d\xfb\x4b\x67\x1d\x8f\x60\x76\xe0\xe4\xd3\x90\x66\xca\xfb\x3c\x2e\x03\xb4\x28\x83\x3f\xe8\xab\x5b\x5e\xf9\x86\x80\x3c\x2e\xe7\x19\x4f\xd3\x1f\x2d\x6c\x9f\xc6\x26\xf0\x95\xc4\xe3\x6c\xe7\x5f\x5f\xfa\xcf\x1f\x99\xed\xbc\x7a\x31\xdb\x49\xde\x6e\xd8\x90\x5d\x80\x1a\x3f\x01\x8e\x37\x65\xc3\xf8\x18\x97\xb6\xe9\xe8\x38\x7a\x11\xeb\x38\xb2\xb6\x22\x6d\xe7\xad\x5f\xcf\x68\x41\xe2\x09\x17\xa6\xc0\x05\x2f\x46\x40\xa8\x77\x47\x7f\xf2\x1d\x03\x15\xc0\x7c\xf2\x96\x02\x05\x2c\xf7\xbd\xc7\x14\x4c\x60\xe4\xbe\x5a\x28\x8d\xbb\x83\x58\x98\x63\xd8\x20\x71\x32\x0b\xb3\x04\x19\xc8\x40\x04\x99\x28\x05\xdd\xbe\x7a\x46\x0a\x85\x1d\x6d\x1b\x6e\x14\x13\x0d\x57\xa2\x10\xa3\xd2\x1a\xad\xd5\xb7\x51\xd1\xcf\x02\x8e\xdd\x7d\xdd\xa7\xe3\xa7\xb3\xe7\x57\x7c\x3a\x9e\x8b\x1c\xc5\xc3\xae\xf7\x0a\x90\xfb\x06\x60\x6f\xe2\xa6\xf6\x7d\x5d\x03\xb4\xa5\xd1\xf1\x5c\x98\xdd\x71\x99\xa8\xa6\xb8\x60\x0c\x2f\x43\x67\x44\xad\xaa\x44\x5a\x66\xa8\x3d\x10\x6b\x7d\x01\x46\x6b\xad\xf5\xf5\xc5\xa7\xc3\x0a\xeb\x3b\xc1\x72\x97\x63\x50\x62\x72\xd4\x52\xb5\xc1\xad\x23\xc4\x85\x88\x3f\xa0\x9b\x22\x2e\xa3\x5f\x6d\xac\xe4\xdb\xcb\x56\x2c\xfb\x52\xdc\xf5\xf3\x8b\xa2\xb9\x02\x45\xea\x52\xe0\x58\x0b\x61\x81\x31\xcd\x72\x3f\x97\xbe\x55\x20\x87\xfe\x74\xd0\xce\xab\xaa\x0a\xcd\x9f\xa4\x42\x50\x6f\xaa\xd4\xa4\x25\xaa\xfd\x5c\x49\xd5\xdb\x65\xa4\x3c\x86\xbe\xed\xa2\xdd\x3e\x7f\x60\x41\x77\x62\xad\xa7\xb7\x5d\x54\xd8\xb7\xbd\x7a\x97\x3c\x43\xfd\xef\x51\x1c\xf9\xc8\x8e\x63\xee\x62\x5c\xf9\xd3\x01\x2d\xa5\x01\xfd\xf7\xd0\x24\xf4\xdc\x6a\x03\x1a\x4f\xa3\x5d\x64\x1e\x58\xdc\x3d\xff\x59\xb7\x5f\xf9\x59\xf5\xd3\x8f\x42\xee\x47\x7e\x54\xd0\x07\x47\x01\x7f\xf1\x8f\x1e\xe7\x5c\xff\x65\x98\xd4\xbd\x7d\x86\x92\x7f\xbb\x06\xd1\xc3\xcd\x87\x0d\x46\x79\xe1\xee\xbc\xb8\x0f\x9f\xa2\xcb\xe8\x02\x10\x1e\x52\xdf\xfb\xe3\xe4\x8f\x14\xb8\x23\x2c\x01\x42\x64\x3e\xa7\x31\x62\x78\xa9\x01\xca\xcb\x61\x2d\x3a\xae\x87\x51\xed\x49\x4c\xb1\x98\x3a\xd9\x8e\x07\x0d\xb3\xbc\xe3\x56\x4e\xbd\x31\x2d\xa7\x4c\x13\x7c\x6e\x13\x82\x89\x46\x70\xa9\x42\xe7\x5f\x29\x3f\x73\x49\x0c\x62\x98\x69\x8e\xd7\xcf\x57\x27\xd3\x4d\xf9\x18\x4b\x2e\x48\xcb\xe7\x72\x14\x97\x0f\xf7\x52\x70\x54\xa0\x70\xa0\x66\x16\x91\x82\x21\x94\xa7\xfe\x54\xf8\x56\x82\xac\xf4\xd3\x2e\x8a\xcd\xa2\x02\xfe\xf4\x90\x0b\xe1\x6b\x93\xd9\x1c\x5b\x7f\xd4\x92\x1f\xad\x47\xa6\x5d\xeb\xa0\xe2\x12\xbb\x36\x8e\xcd\xdf\x45\xff\x5d\x50\xc5\x78\xec\x6b\xc2\x9d\x11\xc4\xd0\xaf\x40\x89\x77\x5b\x8e\xf9\x26\x58\x1a\x84\x6e\x60\xfb\xfe\xdd\x7b\xf0\xf1\xdd\xaf\xe3\xcb\x6d\x73\xb9\x7d\x76\x6b\x39\x46\xcb\xba\x24\x40\x78\x05\x90\x94\x27\x37\xb2\xa3\x71\x8d\x73\xb3\x00\x51\xd3\xcc\xbe\x07\x68\x9e\xfd\x11\x40\x44\x40\xd7\x34\xae\xf2\x79\xe3\xaa\x83\x16\x46\x2a\xc4\x98\xa9\xfc\xd1\xfa\xe3\x24\x9d\x9e\x3d\x5a\x43\x3e\xe8\x47\x67\xf4\xac\x6b\x5b\xeb\xca\x50\xe2\x71\x55\xe9\xb0\x5a\xee\xeb\xcb\xdc\x73\xcb\x3b\xd5\x01\x86\x1d\xfe\xef\x02\xaf\xee\xdd\x23\x05\xf7\x4b\x26\xff\x93\x62\x77\x72\xf7\x66\x03\xf7\x7e\xf8\x72\xab\xbc\x5d\x15\xb9\x1a\xb4\x60\x3b\x79\x2e\x92\xd1\x43\x44\x11\xd2\x90\x08\x43\xbc\xa8\x85\xa4\xb9\xae\x49\x9e\xe4\xe7\x89\xc5\xdc\x9d\x4e\x44\x73\x5a\x08\x01\x97\xaa\xe2\x4c\x52\x9e\x0c\xdd\x32\x79\x4a\x41\x04\x2c\xc8\xe2\x93\xf1\xb5\x66\xb8\x24\x04\x63\x58\x1a\x05\x98\x3f\x16\xa5\x46\x10\xc5\x27\x7d\x9e\xac\x35\x7e\xbc\x98\xa9\xa4\x08\x33\x2d\xc8\xfa\xbe\xea\x10\xc7\x58\xf4\x26\xfa\x57\xd1\x7f\x13\xfd\xc7\xf0\x59\x5d\x39\x0c\x8f\x82\xb4\x9f\xdf\x27\x5f\x3e\xfb\x0c\xdf\xff\xc3\xa7\x93\xc7\x02\xeb\x39\xb2\x7a\x97\x56\x56\xe0\xc5\x24\x90\x4a\x23\x89\x6d\x1a\x3f\x95\xb5\xae\x3b\x2d\x48\xe9\x75\x9c\x23\x4a\x31\x61\x5c\xd6\xa5\x60\x94\xc5\x95\x92\xf8\xfa\x3c\xa1\x94\xcb\xa6\x94\x94\xd2\xd9\xf3\xb8\x74\x60\xf4\x46\x01\x48\x7c\xab\x5d\xe7\x47\x01\xf2\x7d\x57\x94\x10\x29\xc5\x71\x89\x04\x41\x04\xca\xbc\x84\x9e\x86\x85\x85\x92\xb4\x84\x12\x43\x82\x54\x0e\xcb\x5c\x7c\xed\x49\x9f\x5a\x4a\xed\x89\x3b\x0d\x48\x00\xb6\x0c\xb5\xb6\xa1\x96\xec\x2f\xfd\xc7\x15\x3b\xf6\xf9\x27\xb0\x63\x87\x3f\x20\x82\x94\x06\xeb\x7d\x18\xa7\x60\xb0\x4c\x58\xe5\x6b\x9c\xdb\x02\xf9\x63\xe0\x2d\x0d\x08\x1b\x47\x6c\x91\x60\x5f\x86\x56\x05\x39\x77\xe6\x0e\xa0\x65\x8a\xf3\x27\x15\x24\xda\x5c\x54\x90\xb8\x22\x92\xfb\x9c\xd1\x1f\x97\x41\x8a\x92\xb0\x7b\x7e\xae\x39\xf4\x15\x35\xbb\x9f\xd6\x1c\x8a\x40\xe4\x00\x0a\xcd\xb6\xf3\xbd\x7b\x88\x32\xd0\x50\x93\xe7\x31\x5e\x14\x61\x71\xef\x96\xd6\x69\x4b\x00\x6e\x7d\x05\xd8\x7a\x4f\xfd\x50\x77\xc8\xc8\xa0\x3b\x54\x48\x6a\x5b\x50\x5c\x74\x87\x92\xb8\xbe\xf4\xd7\xff\xec\x82\x8d\xf9\x81\xf7\xcb\xe3\x7c\xea\xd5\x1d\x78\x7d\xfb\xa8\x69\xf9\xed\xb3\xc7\x71\xbd\x1b\x97\x63\x9c\x72\x46\x78\xa1\x71\xe9\xad\xf5\xce\xc5\xd1\x72\x04\x44\x31\x89\x60\xc6\x70\x51\xc2\x58\x3c\xfb\xc3\x01\xda\x87\xe8\x5e\x6c\xd8\xc1\x64\xba\xb7\x3b\x79\x0f\xf7\x1c\x44\x3e\xf2\x83\x77\x70\xe8\x72\x61\x2b\xab\xe0\x8b\x3f\x3d\xe1\x97\xd8\x41\x46\x3f\xdf\x5c\xac\x6f\xae\xb5\x67\xf0\x2e\x7b\x7b\xc1\x0e\x3e\x02\x61\x2f\xa7\xf3\xd3\xce\x38\x1c\x97\xa2\xd6\x86\x79\x64\x26\x01\x60\xa7\xbb\x06\x20\xdf\x27\xd1\x1a\xb4\x7c\x03\xe6\x6a\x89\xdc\x78\x90\xd0\x9a\xb9\x67\x4d\x3d\x77\x12\x64\xeb\x5d\x5d\x0e\x9b\xf0\xdf\xe0\xce\x39\x63\x49\x07\xc3\xeb\xe8\x02\x7e\x59\x45\x6f\x36\x85\xa4\x17\x56\x6a\xaf\x37\xbb\xbd\x30\xbb\xbf\x44\xdd\x27\x7c\xff\x1a\x65\x03\x9a\xeb\x68\x61\x52\x62\xd4\x10\x55\x54\x98\xe6\xe5\x52\x52\xa1\x3a\x65\x20\x98\xfc\x00\xa8\x6f\x2a\xb3\xa4\xb6\xf1\x0e\x08\x85\x89\xaa\x0f\xaa\xb0\xf7\xd4\xcf\x7d\x56\x65\x06\x44\xc9\x60\x85\x6c\x4d\x29\xcc\x60\xbc\x04\x85\xe7\xc0\xf9\x09\x58\x33\x30\xc2\x5d\x88\x9b\xc7\x70\xef\xe8\xe0\xc3\x0e\x9f\x78\xec\x87\x9b\x27\xb1\xb8\x80\xea\xbf\xb0\x13\x7f\x04\x97\xbe\xc7\xb0\x88\xa3\x45\x6a\xb5\xe6\x50\x8c\x55\x5d\xe9\x12\x7a\xe6\xf3\xb2\x35\xde\xc5\x51\x5e\xc4\x2c\x80\x47\x25\x66\x2f\x10\xea\x9a\x2b\xdb\xf3\x1c\x62\x44\x4d\xcf\x11\x22\xb9\x96\xbd\xe5\xe4\x7c\x3c\x8f\x1b\x2c\x5b\xf8\x26\x19\xfd\x6c\xbc\xb4\x81\xff\xba\xe9\x4f\xbf\x7f\xe4\x89\xfe\xdd\x73\x1d\xc5\xfd\xcd\xa3\xfa\xf4\xe7\x3f\x49\x7d\x3a\x05\xbc\x2c\x2b\x1c\x53\xdf\x18\x90\x29\xe2\x15\xd6\x0e\xa5\x2e\x95\xa7\x51\x4d\x0e\x96\x74\x5c\x4f\x5d\xda\xb9\x51\x33\x47\xea\x69\x02\x7a\x5e\x6c\xf8\x16\xd4\xa7\x5b\x3b\x76\x96\x2c\xf5\xa6\x3d\xdd\x73\x42\x06\x11\xb7\x45\xf1\xa4\x3d\x5d\x05\x3e\xcf\x93\xf6\x74\x88\x5b\xee\x80\x2f\xee\x77\x7f\x11\x58\xc6\x8f\x1b\xf6\x6d\xbb\x1e\xea\xd3\xbb\x8f\x9b\xf9\xc2\x9b\xec\xe6\xfd\xa7\xdf\x81\x77\x77\xaf\x7e\xf1\xd7\x20\x00\x50\xe2\x7e\x37\x78\x09\x48\x75\x3e\x55\x80\x78\x15\x37\xce\xf7\x49\x8a\x6a\xe6\x6a\x65\xeb\x98\x4b\x74\x3e\x25\xe9\xf9\x74\xc0\x76\xfe\xde\x08\xb1\x57\xf3\x3c\xcf\xe7\xe1\x88\x39\x28\xa5\x9f\x6a\xee\x7a\xe9\x4f\x18\x90\x73\xd6\x47\xd1\x3e\x41\x17\xdd\x99\xb5\x46\xdb\x76\x2d\xd1\x95\x4e\x97\xbc\x0a\x66\x94\xcf\x8c\x69\x9e\x84\xd8\x4c\xc2\xce\xb5\x8b\xcb\xe5\x48\x09\xc8\x01\xe7\xa9\x2b\x18\xf2\xd4\x6b\xb5\x4b\x97\x35\xda\x95\xa0\xf1\x23\x28\x0e\xd0\x97\xb6\xbd\x9f\xbd\x2d\x33\xd6\xa2\x99\x40\x2c\x93\x7e\xe9\xb6\x7f\xeb\xc7\xf5\xbc\xb0\x07\x78\xd3\x1e\xe0\x63\x65\x07\x9f\x6a\xf6\x97\x6b\xae\x0d\xae\xfc\xea\x4b\xf6\xef\xaf\xc1\xdd\xc7\x78\xdc\x55\xcb\x0c\x7a\x0f\x73\x3c\x83\x96\x7a\xea\x4f\xb5\xaf\x28\x80\xae\x96\x42\x56\x28\xf3\x14\x74\x3e\x3d\x06\x4a\x47\x0b\xca\xa5\xb8\x3e\x3a\x40\xdb\x9c\x4f\xad\x52\xb8\xa2\xa6\xc7\x0e\x19\xa1\x84\xe4\xdc\x24\x69\xe3\xb3\xb6\x6d\x7d\xda\x0a\xda\x6e\x73\xfb\x4d\x63\x85\x3f\xe6\x9e\x7f\xf5\x75\xe4\xf2\x96\x7e\x1f\x79\x44\x3f\x74\x01\xbc\x29\xa8\x47\x0b\x87\x71\x09\x8e\x95\xb4\xc6\x79\x23\x91\x45\x72\xd2\xd8\x21\x0d\x93\xd4\x01\xe8\x07\xee\x94\x28\xb4\xe6\xe7\x13\x28\x79\xe9\x4a\x76\xe0\x56\xe5\x4e\xa0\xb9\x22\xbd\xaa\x3a\xd8\x55\xb9\x6d\x61\xeb\x7c\xee\x9c\x5d\x42\x5f\x51\x90\xb8\x64\xa6\x81\x8d\x8d\x22\xb0\x2b\x1e\x58\xa8\x27\x6e\x5f\x60\xc1\xde\xbd\xd9\x88\x4f\xdf\xdc\x14\xac\xf7\x27\x30\x3b\xd7\xf9\x49\xce\x00\x1e\x98\x95\x85\x1f\xed\xfd\xb0\x83\x47\x8f\xbd\x12\x80\x03\x9d\xe4\x59\x04\x22\xf9\x40\x6f\x5c\xc2\xa3\x3f\x7b\xea\x4b\xae\x20\x80\x5f\x06\xe3\xae\x4d\x2c\xa8\x89\xc7\xcc\xa5\x80\x15\xc8\xe1\x02\xc0\xa5\x54\x80\x03\x8c\x97\xd6\x9f\xf8\x92\xd3\xb8\x23\x0b\x8a\x0d\x57\x8a\x33\x02\xb9\x74\xc3\x88\x1a\x0e\x46\xaf\x3a\x53\x03\x79\xd1\xb1\xa9\x82\x86\x5b\xb8\xd3\x5f\x5a\xb2\x3d\x16\xae\xdb\x28\xe8\x6b\xb8\xf0\x2d\xf4\x7f\xfa\xfc\x2e\x21\xa0\xb4\xf9\x32\x82\x6e\x8d\x98\x21\x5f\xf2\xd6\x69\xe5\x40\xee\x39\x47\xa0\x73\x2d\x18\x7d\x21\x25\x63\x39\xe1\x81\x58\x6d\x95\x97\x6d\x4f\xa5\x94\x09\x91\x85\x1d\x4c\xdb\x9a\xa1\x1b\x48\x55\x5b\x51\x3a\x2d\x73\xeb\x7b\x42\x0b\x9b\xe7\xa0\xb0\x82\x31\xa3\x35\xa2\x51\x0c\xc8\x03\x39\xb4\x71\xf1\x43\x1d\x96\x43\x5b\xdd\x0f\x55\xb5\x83\xf7\x43\x5c\x2c\x90\xf1\xf8\xe8\x8b\x35\xd9\x82\x7d\xf5\x20\x03\xa6\xee\x9f\x04\xc4\xc1\x55\x0f\x25\x18\xfc\xee\x2b\x97\xe3\xb0\x65\x64\xd6\xb1\x03\xfd\xfd\xa9\xc8\xe9\x80\xfd\x2c\xa9\x0c\x58\xe7\xea\x81\xef\xd9\x01\x06\x34\xde\xdb\xfd\xf3\x33\x10\x5a\xfa\x6b\x15\xf8\xe6\xd3\x1e\xe7\xfe\x24\x38\x5f\xdf\x21\x3d\x22\xab\xad\xf0\x28\x96\xd2\xea\x44\x5b\xbd\x18\x42\x73\x97\x17\x71\x4e\x2b\x08\x01\x69\x5b\x57\x4f\x7d\xc8\x67\x9b\x26\x93\x3c\xe8\xe0\xa2\xfe\x82\x43\xf0\xf1\xd5\xdd\xaf\xc0\xdb\x9b\xef\x92\x00\xc6\xbb\x72\xad\x77\x33\x82\x71\x2e\x04\x11\xa5\xc5\xc8\x37\xc4\x72\xd1\x48\x52\xa9\x11\xfb\xa1\x02\x55\x09\x0f\xda\x34\xdf\x77\x1b\x35\x6d\xa7\xbd\xf1\x1d\x57\x15\x68\x7d\xe5\x4f\x12\x30\xd0\xe5\xdf\xbb\x43\xa4\xe4\xfa\xbb\xd1\x03\xde\xf7\x07\x18\xbd\xd9\xe2\x51\xf2\xe4\x8c\xff\xe9\x36\x4c\x58\x12\x1a\x0b\xcf\x73\xd0\xa3\xca\x31\x96\x6b\x8c\x59\xe1\x21\x01\xce\xa3\x03\x5c\x5a\xdf\x2f\x8d\x1f\xb3\x2a\x1b\x80\x88\x05\xc8\xd7\xfc\x6c\x2e\x3b\xf9\x9f\x6f\xd8\xce\x8b\x32\xe0\x26\x8b\xb4\xd6\x32\x21\xf5\xbd\xbe\x7d\x1b\x27\xa1\x68\x2e\x40\x59\x54\x69\x1e\xeb\x45\x28\xdf\x68\x40\x84\x9f\x12\x59\xc9\xaa\x28\xfd\xec\x3b\xd8\xb8\xca\x55\x63\x8b\xe8\x1e\x03\x94\x56\xd6\x9d\xfb\xe5\x28\x62\x1c\xb7\x0b\xf6\x93\x6f\x89\xe4\x1c\x5b\x20\x63\x83\x16\xeb\x07\x88\xed\xc5\x1f\x9d\x3f\xb8\xc0\xb7\xbb\x0b\x1d\xf1\x23\xe6\x39\xbe\xd9\xc8\x38\xb7\x57\x46\x4a\x48\xb6\x0e\xc0\x2a\xe8\x56\x32\x2f\x95\x3b\x4e\x98\xe9\x46\x9a\xbc\xf0\x9d\xaf\x61\xad\xfc\x04\xb8\x1f\xf6\x1c\xe4\x7e\xda\x10\x56\x5d\x8e\xb5\x64\x27\x3f\x53\x82\x69\x61\x07\x60\x5c\x30\x4a\xde\x45\xf4\x01\xef\xca\x80\x15\xd9\x98\xa2\x6b\x8d\xf2\x38\x4a\x4d\xee\x36\x6c\xdb\x97\x37\xd3\xbb\xe4\xc9\x20\xf4\x7d\x4c\x5c\xd9\xd7\xa2\x6a\x5b\x7f\x62\x80\xf3\x18\x86\xaa\x84\xc8\xe0\xb7\x9a\xaf\x77\x59\x07\x2d\x93\xd6\xc4\x35\x43\x06\xb2\x83\x86\xc8\x54\xb2\x56\x53\xa3\x67\x3f\xba\xc1\x2d\xad\x62\x79\x5d\xd0\xb8\x74\x83\xc7\xc8\xcf\x2d\x19\xfb\xba\x23\x5d\x73\xc1\x99\xd2\x9b\xfa\x90\x47\xd9\xf6\xc9\x5f\x55\xdf\xd7\x74\x1e\x27\xef\x3e\xbc\xbe\x7d\x7d\xbb\x83\x49\x09\x67\x33\x89\xa3\xa9\x47\x76\xb2\x0d\xe1\x33\x32\x55\x79\xc8\x17\xee\xf3\xe3\xa4\x87\xe1\x21\xb2\xba\x01\x11\x90\xb1\xf6\x91\xef\x80\x06\x5d\x94\x3c\xf6\x0d\xd7\x77\xff\x8c\xe5\xf9\x02\xbf\xb6\x06\xc7\xe8\xd5\xc7\x0d\x6c\x7f\x79\xf7\xb7\x37\xf1\x7a\x45\x74\x2e\x80\xed\x33\x6f\xb0\xa0\xa4\xa0\xac\xa8\xd6\x02\x82\x7a\x1d\x67\x1e\x23\x93\x2b\xa3\x92\x56\xc0\x0a\xf2\xbd\x3e\x9d\xec\x43\x64\xcf\x83\x66\x59\x95\x8b\x24\xb5\xcb\xd1\x57\x02\x10\x70\xb4\x16\x44\xcb\x58\x3c\x44\x03\x3e\xf6\x47\x7f\x42\x20\x3b\x6e\xb5\x6c\x1f\x66\x77\xea\xa2\x5e\xf9\xa8\xc5\x17\x62\xec\xed\x8f\xac\xff\xd7\x62\xe8\x07\x11\x60\x7d\xf5\x4f\x42\x7c\xbb\x13\xe6\x02\xe4\x8f\x42\x7c\x69\xc9\xb0\xe1\x16\x41\x94\x9a\xbc\xd1\x54\x56\xac\x93\x38\xf7\xa3\x60\xe5\x44\x25\x63\x05\xe3\x64\x20\x4e\x3f\xac\xd7\xab\x40\xa0\x88\x7b\x45\x35\x55\x07\xa1\xcb\xc2\xdb\xe0\xe2\xde\x9c\xd6\xac\xe1\x06\xe4\xdb\x61\xaa\x0b\x3f\x80\x4c\x73\x65\x1c\xc8\x81\xf4\x63\x59\x5a\xe1\xa9\x5a\xdf\x3b\x03\x8c\x3a\x08\x01\x73\x80\x14\xb9\x83\xa5\x6d\x71\x13\xb4\x9a\x62\x7a\xf1\xe0\xdc\x30\x4b\x97\x39\xf0\xc6\x08\x7b\xb3\x7d\xfd\xe6\xf3\xc6\x64\x7e\x9c\x20\xbf\xbf\x28\x0d\x5e\x3e\xa6\x0b\xef\x25\xee\xa6\x2a\x29\x96\xbe\xb6\xa2\x7a\x88\xc6\x96\xf7\x7e\x00\xe5\x91\x3f\x44\xbe\xc2\xb6\xc5\xa9\xcb\xa4\x9f\x46\x95\x62\x84\x19\x67\x5e\x49\xc0\xa6\x44\x69\x6a\x88\xd9\x1d\x41\xe5\xb9\xf5\x2d\x73\xb4\x55\x4e\xb7\x6c\xb4\xda\x75\xf4\x54\xe7\x39\x74\xb0\xe3\x08\xe7\x99\x28\x60\xd2\x97\x4b\xe4\x0b\x0e\x86\xb8\x29\xe3\x5c\x19\x6a\x54\x88\x2b\x6b\x4d\x80\xa2\x5f\x04\xc6\xdd\x5a\xac\xbd\xb9\x0b\x0b\xd6\x37\xbf\x08\x6c\xb1\xdf\x81\x2b\xb5\xe1\xf5\xb3\xf6\xfb\xf6\xee\x40\xd0\xc9\x8f\x8c\xf9\x5e\x59\x6d\xc4\x43\x04\x26\x17\x67\x9e\x77\xa0\x60\x7e\xe8\x5d\xb3\xf6\xd1\x99\xf3\xf5\x01\x79\xc2\x0c\x65\x80\x8b\x76\x12\x8a\xd5\xf6\x74\x36\x9b\x14\x4e\xef\xea\x0e\xf0\x45\xc6\xad\x37\xa3\xe9\x01\xba\x70\x00\x6d\xf0\x52\xfa\x17\xc1\x37\xf6\xea\x23\x1f\x58\x89\x1f\xff\x06\x84\x8a\xee\x5f\x82\xdf\xbc\xff\xcd\x77\x1f\xc1\x23\xa9\xfd\xd5\xdd\x9b\xe4\x89\xfb\x79\xb7\x27\xb6\xb2\xbc\x3d\x16\x19\x52\x65\x91\x9a\x1c\xe2\x1e\xa1\x12\x42\xaf\x2a\x55\xd4\x23\xb6\xa0\xc8\xc2\xfe\x2e\xb8\xf1\x1c\x94\xaf\xa8\x30\x92\x3d\x44\x24\x4d\xd3\x14\x1a\x34\xe5\x45\x46\x09\x08\x88\x00\x47\x29\x49\x3a\x3f\xd8\xe5\xd8\xd9\xf5\xbf\xb7\x51\x1c\xc9\xf0\xd9\xe3\xe8\x75\xf4\xcb\x28\x02\xef\x2e\xcb\x8f\x57\xef\x5e\x47\x77\x1f\x6e\xde\x15\x61\x5c\x18\x23\xd7\x49\x17\x57\x03\x01\x2a\xce\x27\xd8\x2e\x8d\x87\x7a\x0d\x34\x49\xb1\x18\xef\x34\x80\x71\x1d\xd7\xe7\xd1\xe7\xbe\xad\x80\xdd\xf5\x3e\x8b\xa2\x5d\xb2\x7e\x26\xe4\xa0\x1f\x15\xbb\xae\xd8\x8a\xad\xd0\xfe\x94\x3c\x43\xd6\xef\xa3\xba\x80\x6b\xaf\xa7\x1c\x28\x61\x77\x85\x7f\x6d\xe2\xe1\xa5\x62\xbf\xef\xaa\xea\x80\xe5\x32\x81\x7c\x41\xa0\x58\x4a\x50\x6e\x7d\x7c\xfa\x20\x42\x3e\x59\xeb\xc0\x0f\x5b\xad\xf2\x21\xa4\x94\x1f\x30\xb2\xf6\xaf\x5e\xb6\x28\x8f\x84\xac\x78\x06\xd1\x26\x84\x37\x2c\x65\x39\x4f\x7a\x18\xcb\x39\x29\x25\x31\x58\x82\xc2\xd4\xfe\x44\xa9\x45\x69\x95\xca\x53\x2f\xac\x14\x4d\x6b\xdb\xdd\xdc\x1c\x8f\x8d\xf3\x68\x99\x3b\xd1\x80\xf1\x05\x27\xab\x3b\x3d\x44\x79\x81\xfb\x97\x94\x2c\xd8\xaf\x35\x43\xff\x80\xc3\x75\xf1\x17\x57\x3f\x93\x30\x5d\xf8\xf0\xc3\xfe\xfe\x32\x03\x0c\x6a\x81\x9f\x76\x9d\x2b\x8b\x58\x2f\x84\x70\x90\x3a\x50\x31\x5e\xe2\x92\xc3\xc2\x9f\xdc\xec\x30\x16\x20\x67\x7e\x06\x18\x1e\x54\xa1\x94\xe9\xeb\x35\x13\x2d\x8c\xb3\xd4\xa6\x24\x8e\xce\x2c\xa9\x97\x22\x36\x8c\x2a\x20\x41\x66\x4c\x04\xe2\x53\x88\xf1\x5f\xd5\x7a\xbc\x7a\xc1\x6c\x5a\x8f\x51\xd3\xc3\x38\x02\x0d\x19\x46\x30\x7a\xd1\x82\x94\xf9\x53\x5d\xd5\xb3\x04\x85\xf3\x1a\x0c\x2f\xc5\x1e\xf3\x63\x33\x83\xe3\x19\x27\x8d\xa7\xb3\x05\x39\xb8\xc4\x98\x2a\xd4\xc0\x2a\xfa\x87\x97\xf9\xc0\xeb\x4b\xad\x7a\x51\xa1\x7b\xd1\xe2\x3c\x8d\x62\xf7\xa9\x29\x4e\x00\x72\x3f\xf9\xd3\xe8\x7b\x0e\x2a\xd0\x78\x52\x56\x80\xd3\xac\x2a\x18\xf6\xcc\xcf\x2c\x3e\x71\xc9\x64\x2e\x45\x9e\x1d\x14\xc5\xbe\xea\xab\x01\x48\x5f\x4f\x1a\xb0\x65\x5a\x58\x99\x53\x87\x46\x0c\x89\x4a\xb8\x27\x43\x5e\xe7\x30\xc4\xf9\x88\xc6\xe4\xa6\x3b\xa8\xe8\x9f\x06\x77\x96\x0f\x6f\x7e\xf9\xf6\x9b\x35\xda\xfd\x32\xf8\xdf\x3e\x7d\x1c\xe0\xee\xcd\x2f\xe2\x5d\x98\xfc\x24\x53\x45\x18\x48\x9d\xe9\x1e\xa2\x09\x10\xea\x91\x1f\x99\x09\x7e\xfd\xf8\xdc\xc4\xc3\xe0\xfb\x8e\x82\xbe\x5e\x8e\x07\xd5\x4b\x51\xb5\x6c\xb2\x27\xe3\x06\x50\x79\x25\x59\x51\x95\x24\x16\x0a\x79\x73\xc2\xd6\x80\x66\xbd\x1e\xc8\x85\x6f\xf1\xee\x91\xff\xfd\xf1\x07\xe9\xf0\xd3\xc7\x57\xef\x22\xb0\x9e\xaa\xf7\x49\xe7\x28\x07\xe3\x62\x77\xd8\x0f\x80\xfb\x8a\x1b\x42\x0a\x42\x51\x99\x3d\x44\x9e\x6a\xa0\x40\xee\x49\xb9\x87\x45\xd3\x82\xc9\xad\x3d\xc9\x85\x7c\x51\xa2\xb8\x5f\x66\xef\x0c\xc8\xc0\xb8\x16\x41\x3f\x8b\xf8\x03\xde\xd5\x07\xf3\x4c\x53\xef\xbf\x8d\x48\xf4\xdf\x5f\x26\x9e\xcf\x95\xf5\x9e\x3b\xc4\x5e\xe7\xd1\xeb\xf1\xc4\xc4\xbe\xa0\xf2\x6f\x2e\xa1\x2c\x6c\xb5\xc0\xc5\x28\xf6\x85\x50\x4a\xec\x8a\x1c\x0c\xf7\x23\xa8\xb3\xdc\x37\x17\x6a\xd0\x5a\x1c\x78\x6c\x9b\xc6\x43\x7f\x02\x51\x5d\x1f\x8f\x0e\x44\x6e\x9e\xfb\x1e\xa4\x8b\xc1\x42\x94\x8d\x25\x0c\x8b\x2a\x4e\xd7\x6c\xf8\x10\x55\x94\x32\xa8\x30\xa3\x44\xb4\xe3\xc1\x40\x64\x6d\x51\xf8\xd1\xd7\x52\xc9\xf5\xcb\x59\x1b\xa6\x99\x46\x08\x21\xcd\x34\x33\xdc\xcf\x25\xd4\x04\xd2\x91\x14\x9a\x80\x91\xb1\x23\x3b\x41\x8c\x10\xc5\x08\x13\xd9\x9b\xe8\x26\xd2\x0f\x78\x27\xbe\xf0\xb9\xf8\x0f\x51\x74\xfb\x15\x3d\xf2\xb7\x5f\x7c\x44\xbf\x03\x61\xf2\xf6\xf9\xe3\xbb\x2d\x72\xdf\x7e\x31\xeb\xb8\x7d\x75\xf7\xe6\xf3\xfb\xcf\xbf\xd4\x93\x05\xa9\x1b\x06\xe7\x4f\x76\x22\x09\xf3\x0e\x38\xc6\xa8\x2c\x2c\x29\x58\x31\x9c\xf2\x6e\x76\xc0\xf8\xda\x75\x1d\x60\xc3\x72\x0c\xdf\xe0\x43\xc4\xa0\x44\x87\x92\x52\x4a\x9d\x10\x42\xd8\xc5\xd2\xa5\xa6\x2c\x37\x39\xc9\x4b\x01\x0b\x9b\xcf\x8b\x4d\x22\x0a\xb4\x10\xc2\xd7\x42\x88\x25\x05\xc5\x98\x31\x18\xfc\x5f\x7e\x16\x89\x07\xba\xab\x5e\x7c\xd6\xbf\xbe\xe0\x7c\x9f\x9c\x72\x2f\xea\x89\x4f\xfc\xae\xe7\xa8\x85\x6d\x03\x29\x80\xcb\x0b\x03\x4b\x70\xba\xef\x61\xd2\x9d\xb1\x8b\xed\x22\x29\x98\x7d\xa6\xe7\xd9\x77\x89\x3c\x5b\x17\xe3\xa5\x0b\xc7\x98\x7b\xb6\x9c\x8a\x18\x1d\xd2\xb2\x84\x18\x5b\xbc\x70\x0d\x2a\xec\x27\x41\x3c\x5e\x4e\x00\x13\x7f\xa2\x27\x53\x16\x36\x8f\x0e\x11\x7d\x20\x3b\xf3\x15\x9d\xb5\x9b\x57\x8f\x0a\x5e\x1b\x68\x64\x9b\x2d\x3d\x09\xad\xbd\xda\x3f\xd3\x59\x7b\xf7\xe6\xaf\xe3\x8f\xef\x92\xed\xdb\x0e\x93\x6e\x62\x1c\x2b\x08\xb5\x6f\x5b\xc3\x74\xe3\xea\x99\xcf\xce\x77\x15\xc4\x8a\x23\xe9\x2d\x04\x3d\x80\xcb\xe0\x12\xee\x7c\x35\x0c\xae\xef\x5d\xf8\x7a\x50\x26\xcf\xfc\x29\x58\xf1\x58\x26\xb5\xe2\x27\x00\x8f\x5a\xc9\xda\x52\x8c\xb8\x00\x51\x66\x7e\xcf\x48\x82\xcf\x5d\xdc\xb6\xad\xef\x9b\x66\xd3\xf2\x80\x0f\x64\x27\x0e\x3a\xfa\xed\x13\xe6\xe5\x51\x30\xe3\xc7\xed\x95\x37\x4c\xc1\xd5\x4d\x17\x7c\x7c\x77\xf8\x35\x00\x17\x04\x3f\xc8\x4c\x11\x5b\xcf\xf3\x22\x46\x4b\x55\x96\x5d\x96\xdb\x32\x0b\x5e\x8a\x59\x90\xcc\x9a\x01\x5e\x4a\x07\x55\x2f\x66\x50\xe4\x85\x83\x58\x1a\xe0\x4e\x69\x10\x82\x88\x1e\xa2\x83\x2e\xb9\xe5\xdc\x6a\x82\x71\x49\xb8\xd5\x56\x5b\x63\x71\x2c\xd6\xdc\x01\x4a\xcb\x39\xc3\xdc\x9e\xb5\x4e\x53\xe9\x67\xad\xfd\x14\xfa\xa4\x7d\xc4\x1f\xda\x9d\x3e\xe0\xe8\xcf\x1e\x19\xed\x6b\x5a\x78\x6c\x6d\xd7\x97\xfe\x7c\x3e\x09\x5e\x7d\x58\xaf\x93\xcf\xaf\x6e\x3f\xbf\x7a\x77\x3d\x6a\x70\x94\x7c\xe9\x93\x5c\x57\x80\xf9\x9a\x51\x4a\x83\x86\x53\x99\x54\x45\xee\xf1\x32\x40\xe9\x38\x9f\xc3\x3f\xbb\x4e\x61\x6c\x1c\x67\xd0\x3a\x82\x53\x9b\x15\xca\xd7\x3e\xd3\x9c\xda\x2c\xd6\x8b\xcb\x40\xef\x49\x06\x6a\x2f\x33\xa0\xa3\x24\x12\x0f\x2c\xd4\xea\xeb\x2b\xfb\xf8\x38\x79\xfe\xf0\xea\x5d\xc8\x2a\x9f\x37\x07\x8a\x4b\x62\x79\x17\x83\x20\x5d\x71\x77\x19\x4e\xdc\x7e\xb8\x0d\x44\xa0\x03\x18\x2c\x06\x1a\xe2\x93\xa3\x13\x48\xb3\xb9\xc8\x73\x57\x50\xb4\xb4\xbe\xd1\x08\x7b\xa1\x81\x22\x7e\x04\x0a\x23\xdf\x6b\x29\x66\x52\x15\x1d\x40\x5d\x95\x1e\x54\xa9\x8d\xe6\x4b\xeb\xb3\xb2\x48\xd3\xac\xac\x59\x8f\x4a\x22\xe2\xdc\x63\x7f\x12\x13\x50\x31\x11\xd2\x51\xd1\x2d\x70\x33\x3e\xa8\x22\x90\xb4\x91\xbc\x81\x07\x11\x2a\xae\x50\x6d\x67\xf1\xbf\x04\xef\x3f\xfc\xf6\xf3\xa7\xf0\x12\xa3\xdb\x77\x3b\xde\x3a\xa0\x65\xdd\x94\x47\x92\x15\x63\xe6\x8d\x04\x34\x6b\xf7\xd9\x7a\xfe\xce\x95\x1f\x6b\xe6\x62\xb6\xe4\xfe\x28\x41\x1a\xbb\xe0\xfd\x8c\x0e\x43\xcc\xd6\x7c\xfe\xb4\xaf\xbe\x7b\xda\x57\x1f\x36\xed\x84\xbb\x3e\x16\x69\x95\x26\x91\xf2\x27\xad\x4a\x6b\x6d\x0e\x17\x0b\x4d\xeb\x2d\x8b\x31\x59\x3a\x70\x44\x84\x20\x8f\xfb\xac\xca\x4a\x7a\xec\xb8\xe1\x56\x9f\x2e\xf9\xf2\xc1\xed\xca\xfd\xbc\x61\x47\xbf\x7d\xf3\x54\x9f\x5c\x56\x24\x61\x97\x0c\x8e\x15\xa6\x0c\x44\xca\x77\x49\xe5\x09\x91\x71\x54\xf9\x8e\x34\x49\xce\x59\x05\x30\x30\xd6\x9e\xc6\xb3\x60\x41\x0c\x74\xfb\xb9\x22\xc2\xc9\xb4\x9f\xa2\x64\xad\x11\x6f\xc3\x7a\x30\x74\xe2\xdf\xbe\xec\xc4\xdb\xb8\x5e\x18\x4e\x4a\x5f\x99\x6a\x06\x29\x24\x56\x63\x9b\xa5\xbe\xf3\x0e\x36\xca\x4f\xfb\xc9\xfa\xa0\x6c\x95\x33\x67\xca\xc9\x8f\x25\x84\xa2\xb0\x33\xe8\xa2\x34\xe2\x0f\x68\xcf\x0e\x3a\xfa\x26\xa2\xd1\xff\x14\xb1\xe8\x7f\x89\x78\xf4\x7f\x45\xff\xf9\x47\x7c\xe5\x5f\xda\xca\xdf\xfd\x01\x5b\xf9\xf5\x06\xf8\xe3\x6c\xe5\x41\x54\x14\x5c\x20\x91\xe5\x44\x3b\xd7\x48\x55\x48\x8e\x48\x59\x09\x5b\x56\x20\x03\xfc\x28\x8b\x62\xad\x26\xb2\x14\x9b\xbe\x9f\xbb\x12\x67\x29\x47\x9a\xe3\xb2\xd0\x94\xe7\x6a\x39\x25\xc7\x73\xf9\x88\x15\x5c\x8f\x86\x76\x13\x19\x62\xda\xd7\xbc\xe9\x82\xab\xbc\xaa\x0a\x04\x8d\x51\x52\x39\x2c\xbe\x34\x95\x57\xf6\x6a\x2a\x6f\x61\x4e\x0b\x41\x11\x69\x5a\xcd\x99\x0e\xa6\xf2\x11\xf7\x23\xf3\x23\x9b\x84\x22\x06\x8a\xcb\x46\x34\x8a\xfe\xc1\x5a\x2b\xec\xe9\xc5\x8f\x67\xad\x97\xfe\x4d\xf4\xbf\x45\xff\x67\xf4\x9f\xa2\xff\x1c\xfd\x3f\x4f\xce\x7c\x1f\x5e\x6d\x70\xbe\x7d\xb8\xc1\xde\xae\x79\xf0\xcd\xb7\x6f\xf7\x9b\x5a\xd7\xb7\x41\xcc\xeb\x39\xf8\xf5\xc3\x9b\x4f\xdb\xff\xb9\xfe\x8f\x5f\x2e\x10\xb6\xcb\xf5\xd5\xf5\xc7\xdd\xbc\xbd\xbb\x08\xdf\x6c\x65\x04\x70\x36\xcd\x62\x5c\xc2\xd3\xfd\x9c\x65\x7c\x88\x0b\x58\xf8\xa2\x2c\xd3\x78\x5c\x8a\x14\xa0\xc2\x0b\xac\x41\x19\xa7\xc4\x1d\x75\x55\x66\x32\xa3\x53\xc3\x4c\xbd\x38\x93\x66\x31\xa2\x47\x6f\x30\x76\x28\x55\x19\x1f\x5b\x96\x2a\x6f\x39\x28\x94\x6f\xf3\x8c\xcf\x71\x51\x16\x3e\xe3\x19\x48\x0b\x7f\x04\x75\x06\x30\x59\x63\x16\x3b\x98\x22\xcf\x44\x59\xfa\xa1\x4b\x33\xa1\x58\x59\xa2\xbc\xc5\xde\x72\x24\x10\x06\x05\x14\x86\xa1\x32\x83\x05\x2e\x24\x46\x18\x44\xbc\xf0\x53\x91\x65\x82\xfa\xae\x2e\xf2\x82\x16\x86\x60\x3a\xcc\xca\x50\xbb\x76\x1c\x82\xcb\xb2\xa4\x3d\x83\x25\x3b\x96\x88\x63\x18\x45\x69\xc4\x1e\xc8\x3e\x7b\xe1\x6f\xf6\x36\xfa\xcb\xcd\xad\xf1\xc2\x7b\xfa\x61\x3d\xb6\x0d\x65\x77\x17\xf0\x40\x38\x71\xff\x02\xbc\xfd\x0c\xca\xa4\x3c\x1f\x03\xd2\xc9\x8f\x60\xf2\xb9\xed\x7b\x30\x04\x4a\x51\xd7\x9d\x4f\x57\x10\x54\x76\x94\x6d\xe7\x7a\x3f\x53\x80\x2b\xcf\x62\x9a\xa6\x07\xea\x99\x35\x5e\x7b\xaa\x5b\xb5\x7e\xf1\x90\x31\x9b\xe9\xca\x38\xe5\x0d\xa8\x8e\x4a\x57\x4d\x9a\xae\xb9\x0e\x3d\xb0\xbd\x0e\x58\xc8\xff\x3a\xfa\x0f\x5f\x63\xad\xbe\xe0\x4c\x5c\xe0\xd0\xef\x1f\x1d\x0c\xb2\xcd\x42\x7e\xbd\xa5\x7e\x94\x34\x11\xf7\x2e\xb0\xf2\x8e\xf7\x6c\xa8\xfa\x58\xf8\x31\xcb\x09\x32\xcc\xa0\x32\x2f\x4c\xce\xa8\x64\xa6\xc1\xbd\x46\xd9\x32\xb6\xd2\xc6\x8d\x25\xa5\x80\xf0\xec\xc0\xb1\x81\xa5\xae\xbd\x23\x15\xab\x0a\x91\x41\x51\x1e\x94\xb4\xf2\x4a\x9a\xb0\x7e\x74\xba\x29\xfd\xd4\xb5\x9c\xe5\x83\x9e\x2a\xa1\x75\xd3\x03\xe7\x8d\x27\x47\xdd\x81\x1a\x34\x9c\x43\x82\xf0\xa8\xfc\x91\x49\xe8\xcb\x4e\x32\x09\x66\x92\x0d\x75\x59\x85\xfb\x42\x3c\x90\x3d\x3c\xd8\xe8\xe7\xa1\x83\xfe\xd5\x45\x01\xee\xb7\x17\x95\xcc\xc3\x66\xe1\xbe\xdb\xa0\xae\xe0\xe6\xee\xbb\xeb\xc7\x78\x01\x44\xbf\xb9\xfb\xf8\x75\xea\x14\x70\x52\x52\xa0\xeb\xaa\x00\xe5\x49\x32\xb6\x18\x90\x55\xa0\xd6\x4b\x93\xf4\xe7\x6d\xed\xac\x71\x49\x4b\x02\x04\x48\x35\x87\x88\x13\x90\xba\x65\x70\x2e\x86\xcb\xb0\x1e\xbb\x09\x23\xdd\x1f\x61\x69\x6a\x85\x11\x05\x99\xa5\xfe\xb8\x8c\xee\x94\x11\x86\x18\xc5\xa7\x53\x5e\x08\x82\xa8\x57\x0b\xc7\x38\xae\x66\xe1\x5b\x1e\x72\x3e\x7e\xc0\x7b\x17\xfc\x40\xde\x47\xff\x45\xf4\xbb\xe0\x48\xf1\x08\x8c\xdc\x87\x42\xec\x5d\x76\x13\x4c\x92\xe3\x10\xf2\xd6\xcf\xf9\xd3\xab\x77\x1f\x3f\x7c\x7a\xff\x4c\xb9\x7f\x0b\x87\x21\xd1\x6e\xce\xa2\x1f\x5e\x6d\x74\xe5\x3d\x39\x17\xce\xda\xb8\x34\x90\x88\x2a\xc5\xaa\x2f\x2b\xa6\x0b\xa7\x60\xd6\x9f\x48\x83\x0a\x55\xc0\x98\xe8\x2c\x07\x11\xc4\x02\xe6\xae\x44\x42\x54\xa8\x17\x20\x4a\x4d\x56\x4b\x2e\x0e\xd4\x2e\x7c\x39\x7a\xca\x40\x13\x47\x49\xd4\x17\x95\x31\x9e\x71\xa0\x7c\xe4\xbb\x4a\x98\x39\x8e\xbc\x11\xa0\x32\x55\x25\x34\xd2\x02\x96\x82\x2b\xc5\x09\xc1\x9a\xd3\xe1\x6c\x1e\x22\x1b\xa4\x54\x22\x3f\x51\x69\x5a\xd5\x6c\xf7\x1e\xdd\xc3\xa0\x5d\xf2\x84\x6e\xda\x70\x2d\x3f\xc1\xb5\x3c\xdc\xbc\x7f\xbd\xff\x78\xf7\xe6\xb1\x54\xfb\x11\x0b\x6c\x50\xdb\xa2\x00\x51\x01\x1d\x2a\x00\xf1\xcd\x56\x0e\xf8\x23\x10\xe7\xa3\x83\x48\x8d\xa0\xf7\xc3\xc6\x3a\xf6\x43\xdc\x09\x64\x30\x57\x18\xba\x12\xfb\x54\x23\xa1\x05\xb0\xa8\x74\x05\x3c\x48\x24\x98\xe0\xc1\x07\x3b\xfc\x4d\xe2\x8e\x51\x06\x88\x75\xce\x1f\xc3\xe1\x75\xd5\xb2\xb6\x22\x55\x87\xbb\x0a\xb1\xb6\xe2\xae\x72\x2d\x6e\xdd\x25\xbe\x6c\x1a\xcb\xb7\xd1\xaf\x1f\xbb\x9c\x7f\xb7\xbd\xc7\xf0\x42\x9f\xe0\xbe\xcf\x1e\x3d\xaa\x02\x3e\x0f\x32\x5f\xd5\x00\x06\x5c\x63\xca\x89\x61\x5a\x26\xa5\xc6\x94\x61\x4d\xb5\xf2\xd3\xfa\x2c\x36\x54\x4b\xcf\x92\x93\x67\x60\xf6\x70\x6e\x78\xdd\xba\x2e\xd8\x56\xb4\x9e\xc7\x91\x27\xee\xb2\x10\xcc\x16\x74\x7d\x74\xd0\x50\xb0\xf5\x27\x0a\xa5\x20\x27\x8c\x13\x23\x85\x84\x9c\x52\x86\x95\x10\xde\x2d\x96\x59\xa3\x8c\x93\xde\x01\x73\xd4\x56\xb6\x96\x01\x15\x4c\xfc\x85\x10\xa1\xaf\x40\x7b\x12\xb8\x6c\xdf\x44\x38\x38\xac\xfc\x8f\x57\x1d\xd8\xef\x5e\x0a\xc1\x5e\x85\x5f\xaf\xb8\x9d\xf5\xde\x5c\x6f\xde\x67\x02\xb0\x9f\xaf\x72\xb1\xb7\x3f\x50\x82\x8d\x89\xa5\xf2\x38\x95\x48\x36\x42\x17\xa5\x77\x5e\x14\x0d\x38\x1a\x84\x52\xce\xf3\x4c\x30\xac\xb3\xbc\x19\x4a\xd1\x9a\x2c\x03\x78\x64\xa3\xef\x3a\xef\x30\xc0\x75\xd6\xf6\xa5\xa0\x86\x22\x2e\xb0\xc6\x42\xf7\xde\x52\xc0\x81\x56\x7e\x5e\x4e\x2c\x4e\x41\x55\xf9\x6e\xc9\x59\xdc\x1d\x4c\xa9\x65\x56\x40\xf4\x5c\x08\x56\xd3\x2c\x2b\xca\x12\x9a\x1a\xa1\xf5\x29\xde\x96\x79\x26\x8d\xae\xd4\x93\x00\x6c\x5f\xb6\x28\x2d\x4c\xa9\x3c\x27\x4e\x48\x51\x3c\x29\xc1\xaa\xad\x47\x24\x21\xf7\x7c\x15\xbf\x79\xfb\xf7\xc1\x6f\xda\x9d\xf6\x0e\xc0\xfb\x09\x40\x5f\xc5\xda\xae\x97\x29\x28\xad\x73\xe7\x2e\xa9\xcf\x4c\xef\xac\xcf\xa8\x0a\x4e\x76\x70\x39\x35\x86\x57\xd2\x26\xc4\x50\x4b\xf4\x81\x58\xe3\x33\x30\x1b\x63\x8c\xaf\xfa\xa0\xcd\x89\x7e\x1c\xbe\xb9\x8f\xe4\x03\xdf\x1d\x9f\xf1\xd7\xca\xb5\x7f\x0f\x48\x8f\x35\x1f\x85\xd7\xf9\xf6\x89\x15\x11\xda\x83\x9b\x20\xa2\xf8\xed\x77\xef\x3b\x07\x22\x07\x52\x77\x86\x68\x47\xef\x1b\x9a\xb8\xb3\x08\x88\x89\x9c\x61\xad\x71\xe1\xc8\x90\x7b\xb8\x74\x08\x44\x25\x3e\x64\x81\x36\x3c\x7a\xa3\x9c\x5a\x73\xab\x17\x5c\xa6\x19\x97\xd0\xe6\x16\x41\x97\x51\xbc\xc6\x52\xf7\x40\xf6\x79\x98\x4b\x6f\x9b\xfd\xef\x82\xb2\xc8\x97\xc3\xbe\x0f\xaf\x36\x25\x50\x70\xf5\x0f\xbb\xfb\x78\xb7\x53\x95\x90\x44\x14\x06\x93\x73\xe3\x54\x9c\xb7\x4b\x0f\xb4\xd7\xf3\x9c\xc7\xe5\x72\xb4\x6b\x0a\x38\xa0\x85\x9d\xf5\x45\x4a\x6f\x38\xe3\x1d\x09\x65\x61\xde\xf9\x7a\x5c\x26\x9f\xe9\x29\x8a\x40\x64\x1f\xc8\x4d\x04\xf4\x86\xfe\xfc\x21\xce\xb1\x3d\x10\x51\xe9\x36\x6f\x35\x85\xe9\x92\xb3\xe5\x28\xc1\x28\x96\x11\x68\xaf\xea\xc2\x15\xa4\xf3\x47\x6d\x58\x1f\xfc\xdb\x15\x68\x2e\x5a\xd5\xff\xec\x51\x37\xfc\x85\xea\xf6\xc7\x0d\x39\xff\x6c\x7c\xf6\x02\xc0\xf2\x3c\xc5\xad\xf9\x43\x33\x0c\x7a\x02\x6b\x88\xc0\x7c\x9a\xc1\x54\xa2\x1d\x73\xf4\xe2\x41\xb4\x0c\x8c\x23\x52\x08\x58\xfa\xac\xaa\xae\xc2\x25\x09\xb2\xf6\xa0\x99\xe4\x02\x52\x62\x2d\x46\xbe\x5b\x6c\xd8\x71\xf0\x18\x2e\x8e\x05\xd2\x46\x39\x27\xd9\x48\xfd\x44\x01\x5a\x86\xb0\x37\xc7\x7b\x78\x28\xa3\x7f\xbb\x5d\xcb\x6b\x5c\xdb\xe4\x65\xc3\x15\xfa\xcb\x37\xcf\x86\x6d\x7f\xf5\x7e\xbd\x99\xc1\x1a\x01\x5e\xf8\x05\xff\xf6\xd3\xc5\xac\xeb\xdb\xbb\x6e\xc7\x3d\x67\x5c\x61\xa7\xa4\xe9\x8e\x95\x90\x2a\xed\x7b\x2c\x4a\xc5\x94\xca\x1e\x22\x6f\x28\xb0\x20\xcf\x33\x2e\x91\x85\x9c\x32\xce\x20\x32\x08\xa6\x0e\x95\xa8\xb3\x02\x40\x10\xf9\xe8\x50\x5a\x4e\x4d\x2b\x6b\xd5\xeb\xbc\xa9\x9d\x53\x42\x9e\x4e\x45\x55\x36\xb5\x96\xde\x0d\xae\x07\x8e\x97\x82\x29\x26\x50\x69\x21\xa2\x94\x12\xa2\x09\x21\x0a\x19\xb6\xed\xaa\x22\xf9\x40\x76\xf3\xa1\x88\xfe\x32\xfa\xab\xb5\x27\x7b\x7a\x1b\xbf\x03\x4f\xbc\x8e\x2b\xea\xea\x43\x10\xe3\x7a\x9c\xc5\x5d\x28\x57\x29\x33\x18\x15\x18\xa3\x72\x38\x21\x90\x4f\x3e\x4a\xf2\x80\x14\x32\x49\x36\xf8\xbc\x2c\x0c\x33\x52\x39\x2d\x9a\x85\x2b\xae\x98\x9e\x8f\x92\xa7\x2e\x2d\xf0\xd0\x98\xda\x34\x40\xda\xda\xd4\x76\x71\xd6\xcb\x2c\xab\x3b\x36\x58\xce\x6d\x15\x73\x21\xa5\x96\x51\x72\x79\x8d\x38\xfa\xc5\xc5\xd1\x2b\x6c\x67\xde\xbd\xdc\xce\x3c\xc2\x34\x2e\x36\xe4\x17\x88\x46\x32\xe2\x6e\xe2\xcc\x4f\xc2\x68\xc5\x26\xd0\x57\xa0\xf1\xb4\x6a\x46\x01\xd2\xc6\xab\x24\x6b\xac\x74\xd5\x01\x7b\xcc\x1d\x67\x40\xf0\x76\x94\xdb\x6e\xa6\xa9\x2a\x77\x9e\x63\xe2\x8f\xb5\xe9\x00\x55\xba\x32\x6d\xe0\xef\x1c\x92\x2c\x60\x80\x6c\xd8\x40\xfe\x55\x84\x22\x1c\x74\x36\xae\x3d\xcc\xc5\xa2\xee\xd2\xcd\xbd\x7a\xcc\xfb\x97\xfa\xe7\xb1\xbd\xb9\xfd\xc2\x00\x6c\xbd\xac\x77\xb5\xc9\x72\x30\x15\xe5\x5c\xc1\x52\x23\xda\x51\x26\x10\x34\x80\x66\xb9\x2d\x73\x40\xce\x5d\x67\x9a\x82\xcd\xa0\x87\xa5\xe7\xa8\x24\x8f\x9d\x5c\x63\xbd\x30\x06\x38\x2f\x0e\x16\xc2\x52\x13\xbc\x7e\xd0\x52\x58\xca\x11\xf1\x27\x0c\x21\x61\xfa\x21\xf2\x95\x6f\x04\x88\x00\x89\x45\xa1\x46\x87\x09\x83\x8b\x93\x4c\x72\x4f\x08\x01\xed\x49\x47\x51\x9a\x54\x0f\xf4\x46\xfd\x24\x97\x32\xa0\xde\x82\xd8\xd6\x1f\xe6\x52\xf6\xa8\xec\x70\x59\x15\x78\x3a\x97\x53\x01\x83\x0a\x01\x2a\x74\x01\x81\x06\x59\xa5\x33\xaa\x30\xc8\xdd\xd2\xb9\xc7\xb9\xdf\xc1\x48\xa3\x34\x64\x72\xa1\x71\x23\xe8\x92\x83\x06\x2b\x8b\x9c\x54\x9e\x82\xe6\x42\xa4\x2c\xcf\x93\x94\x49\xd8\x98\x33\xb7\xe1\x7a\x4e\x3f\x81\x93\xfe\xc5\x4f\xe0\xa4\x3f\xfd\x71\x38\x69\x43\x88\xa6\x45\xc5\x01\xf4\x0d\xc8\x19\x1b\x4d\xc7\x2a\xe3\x8c\x53\x15\xef\xb5\xeb\xfd\x09\xa4\xfd\xfa\x35\x2a\x11\x30\xc6\x38\xed\xb9\x71\xfa\xa0\x85\x31\x1c\x65\xd5\x13\x4a\x5a\x8e\x3e\x20\x3a\x81\x1d\x94\xb1\xd3\x8f\xa3\xa4\xf7\x89\xbe\x78\x72\xac\xf1\xff\xaa\x0c\xfd\xc4\x59\x79\x72\x3f\xbd\xbd\x80\x95\x3e\xbd\xfa\x90\x05\x44\x44\x08\xcd\x2f\xfc\x9a\x66\x40\x2f\x4a\xc7\x98\x2a\x54\x9e\x07\xe0\x7c\x33\x70\xca\x29\xef\xc1\x58\xba\x02\x28\xcf\x94\x67\x04\x40\xe3\xb9\x95\x9c\x09\x11\x9b\xce\x89\xba\xd9\x77\x6d\x6b\x3a\x5d\x69\x26\x98\xe9\xbc\x22\x42\x29\xea\x59\x0d\xa8\xef\x3b\xeb\x87\x4a\xab\x23\x98\x99\x12\x86\xf9\x42\x3a\xd3\xa8\x28\x4a\xc2\x75\x64\x03\x5f\xec\x2e\x7a\x1f\x10\x35\x17\x56\xf4\xe7\xbb\x9b\x8d\x0a\x76\x73\xf7\xe6\x17\x37\xc9\x87\xec\xe7\xe0\xe6\xfd\x37\xaf\x2f\xea\x3b\x37\xcc\x79\x5c\x01\x46\x4a\x7f\x92\x88\x8b\x49\xd4\x18\x08\x31\x38\x7a\x9a\x38\xc8\xa6\xc9\x18\xa5\xaa\x1d\x39\xab\xf8\xb4\xa4\x89\x51\xca\x62\xaa\x06\x90\x97\x46\x97\xc7\x87\xc8\xa3\x79\x22\x9a\x81\x7c\xf4\x9d\xae\x55\x55\x47\x51\x9c\x14\x17\x9f\xb8\x77\xe1\x95\xfc\x94\x4f\x5c\xb6\xc9\x8a\x07\xa3\x38\x71\x9e\x13\xe8\xab\xa2\x54\x48\x49\x2d\x6a\xea\x1d\x13\x8a\xe7\xba\x25\xac\xb6\x8c\x4c\xb1\x5d\xe4\x66\x14\xd7\x6a\x2d\x79\x23\x8e\x7a\x33\x8a\x4b\x31\x7e\x66\x14\x77\x02\x1a\x94\x17\xa7\xb8\x38\xa9\x2f\xfb\xf2\x7f\x11\x34\xd3\xde\xee\x7f\xf9\xe6\xdb\xb7\xfb\xdb\xed\xb5\x7c\xf8\xed\x6d\x68\x71\x93\x0b\x5c\x6e\xff\xfe\xdb\xf7\x37\xef\x3f\xff\xd5\xfb\x0f\xaf\x2e\x67\x27\xcb\xbc\x49\x41\x93\x79\x8a\x04\xb3\xda\x31\x5c\x64\x55\xc9\x89\x5c\x2b\x61\x06\x90\xc3\xb9\xef\x72\x40\xb2\x29\x3f\xa5\x4d\x4b\xa9\xc6\x7c\x9f\x3b\x62\x24\x77\xdc\x8f\xca\x92\xd1\x1d\x41\x46\x66\x0b\x4a\xcb\x2b\xa5\xbb\x16\x3b\x7c\x2a\x1d\xec\x4f\x9e\x03\xc7\x34\x97\x32\xf0\x58\xea\x07\x78\x43\x12\x17\x98\x1f\x6f\x9e\x3e\xbf\xfd\xdb\x78\x4d\x70\xd1\xdb\x8d\xb4\x61\xaa\x73\x59\xc5\xac\x42\x5e\x7a\xb6\xa6\x2d\x71\x02\x02\x10\xb2\x86\x9a\xc4\x2d\x65\x8c\x97\x36\x1e\x4f\xb9\xb7\x5e\x32\x47\x00\x93\xba\xae\x7a\x19\x1d\x40\x9a\x64\x37\xe5\x81\x3f\xce\x2a\xde\x44\x7f\xb6\xcd\x29\x9e\x8f\xbf\x2e\xcc\xa5\xf0\xbb\x00\xdb\xb3\xef\x6b\xb7\x2b\xef\x8f\xd7\x03\x40\xf8\x10\xf9\x09\x82\x32\xae\x41\x09\x4a\xe8\x47\x3f\x1e\xf8\xc2\xc0\x91\xf9\x13\x7d\x88\xc8\xc0\x8b\x5c\xa5\x79\x96\xcb\x22\x0b\x71\x22\xa2\x0f\x24\xae\x0f\xe5\xcb\xdf\x1b\x18\x5f\x1f\x5e\x05\x9d\xaf\xf5\x78\xce\x9d\x0e\xaa\x2f\xc1\x8c\x76\x9a\x0a\xc3\x85\x14\x40\x52\xa8\x20\x39\x94\xf7\x69\x22\x41\xb4\x98\xd3\xe2\x66\xcf\xf1\xc9\x08\xd7\x29\x83\xb5\x8a\xd2\x84\x3f\xd0\xe0\x79\xf1\xd3\x71\xf4\x8f\xe5\xa4\x5b\x52\x1e\x49\xe9\x72\x32\xdf\xcf\x20\x2a\x61\xba\x36\x38\x16\x97\xba\xc0\xc0\x81\xb2\x36\x39\x53\x04\x14\x6e\xb1\xce\x3d\x5a\xaf\x1a\x69\xb4\x82\x54\xfd\x09\x91\xf4\x26\xa9\xc2\xf5\xf9\xf7\xe3\xca\x5d\xb9\xa9\x13\x90\x2e\x68\x25\x11\xdf\x82\xea\x5c\x80\xda\xb7\x80\x78\x9b\x25\xf4\xdc\xb8\xb8\x58\xc6\xeb\x21\xb9\x7e\x88\x70\x07\xba\xae\x45\x6d\xf3\x53\x54\x39\xc1\xa9\x2d\x19\x64\x86\xc3\x68\x7d\xbd\xf6\xc2\x5f\xfc\xf9\xa3\x8a\xfe\xa6\xca\x7e\x9d\xe5\x3f\x4d\x01\xd7\xac\xfb\x63\x64\xa2\x0a\x02\x0b\xf1\xf1\x3c\xe6\xb9\x18\x01\x21\xd0\x0f\x94\xf2\xe0\x9b\x7c\x39\x32\xab\x7b\xd5\xc6\xd4\x72\x47\xed\x41\x15\x42\x4b\x7a\x4e\x93\x3e\xcb\x55\x33\x30\x2e\x89\x1f\x6a\x8f\xad\x27\x95\xef\xa9\x31\x4a\x4a\x65\x98\x51\x01\x2f\x26\x1e\x68\x52\x1e\xe4\xe6\xf5\x7c\x2d\x1e\x5f\xbf\x7a\x51\x36\x06\x76\xc0\xd5\x0a\xe2\x70\xf3\xfe\x8a\x96\xdd\x9e\x8a\x39\xab\x61\x81\x4a\xc1\x84\xd5\x0a\xb2\x82\x51\x08\xd3\x66\xa2\xa0\xe8\xb2\xd4\x0d\x6c\x6a\x0a\xd7\xe0\xba\x84\x1a\x96\x10\x96\x98\x4b\x72\x3a\x48\x25\x39\x47\x50\x4a\xe6\x67\x9f\x1f\x8f\x79\x5d\x5a\x5b\xa2\x59\x39\x03\x52\x51\xb4\xca\x89\x9e\x09\x6a\x29\x67\x94\xf1\xa2\x94\x12\x42\x7b\xf1\xa9\x8e\x2e\x5e\x16\x57\x9c\xec\xbf\xff\x71\x8e\xc6\x96\x62\x0e\xff\x04\x5c\xf4\xdc\x93\xab\xec\xff\xc5\xa1\xfb\xda\xf9\x7e\x0e\xc3\xb9\x35\xb0\xdd\x64\xc4\xab\xa5\x83\xe0\x08\x1a\x87\x98\x65\xbe\xe3\x48\x21\xee\x27\x0a\x0d\x24\x09\xb2\xcc\xe4\x85\x75\x45\x5c\x78\xd1\x4c\xcc\xf7\x9d\xf2\x8a\x82\x42\xfa\x16\x98\x3c\xab\xbb\xa2\x72\xd6\xe5\xa3\x35\xa2\x9e\xa5\x30\x27\xdf\x83\x62\x86\xf0\xa0\xb5\xce\x2d\x41\x8d\x66\x6a\xfd\x50\x04\x2f\xb8\xa0\x82\x7b\x55\x75\x14\xa3\x22\xab\x8d\xa3\xb5\x05\x91\x1f\x85\xc3\x8d\xc1\x34\xcf\x14\x95\x59\xaa\x64\x57\x3a\x91\x71\x01\xfd\xa9\x2e\x4a\x8c\xa2\xe8\x67\xc9\xb6\x5f\xc7\x8f\xb1\xe2\xcf\x9f\xfb\xeb\xbc\x9c\xa4\x26\x97\x19\xc7\x55\xad\xfe\xcb\x1d\xee\xbe\x02\x83\x87\xa6\xeb\x16\x0a\x7a\x8f\x4c\xdb\xf2\xa4\xf6\x72\xf3\xc6\x2a\xc1\xd1\x6b\x3b\xcf\xc0\x9c\x16\x1d\xbe\x1d\xb0\x57\x6b\x6b\xa8\x94\xf3\x66\x21\xda\xfa\x0e\x60\xab\x41\x65\xad\xf5\xcc\x39\x17\x6a\x51\x71\xe1\x02\x7c\xdd\x8f\xfb\xd9\xc6\xf9\x31\x9e\x7c\x78\xf5\x6e\x6d\xc4\x83\x8a\x5d\xf0\xad\x9c\x2c\x28\xaa\x79\xae\xfc\x68\xa7\x64\x76\x8b\x76\x6e\x9e\x81\x06\x51\x78\x21\x3a\x58\xfd\xd8\x79\x9e\x67\x7b\x3a\xcd\xb3\xef\xee\x8d\x31\xbb\x35\x80\x6c\x4e\xdc\xc5\x36\x74\x0a\x1a\xe1\xdb\x7d\xf8\x8f\xa3\xdb\xe8\x57\xcf\xf2\x7d\xb8\x8c\x6f\x5f\xdf\xde\x44\xc9\xb7\x6f\xff\x01\xb8\x79\xff\xfa\x46\xba\x85\x3a\x60\x0b\x58\xe3\xc2\xe0\x93\xf6\x33\xf1\x5d\x85\x2a\xa3\x4e\x7b\xe5\x61\x30\x68\x18\x24\x43\xd2\x7a\xba\x40\x3f\x5a\x40\x93\xa8\x84\x1e\x79\xd8\xe8\x40\x73\x09\x9a\x1f\x7f\x8a\x6e\xd6\x17\xdb\xf7\x1f\x8d\x58\x0a\x58\xb7\x7e\x3e\xce\x4b\x36\x58\x50\xd9\xd3\xc9\x7a\x6e\x07\xb6\xad\xab\xdd\x22\xae\x87\x52\xcd\x43\xc4\xc7\x18\x1d\x07\x36\x1c\x9f\x8b\x66\x19\xc6\x38\xd7\x3f\x2e\x9a\xb5\x8b\xe4\x03\xdd\x0d\x07\xf5\xa4\x9d\x7a\xfb\x03\xed\xd4\x70\x07\x7d\x5d\x3b\xf5\xee\xe3\x5d\x0f\x5c\xe6\x52\x60\x3d\xc9\x4e\x1d\xeb\x47\xfd\x10\x51\x80\xa8\xb7\x6c\xc7\x0d\xd5\x8c\xe6\x9c\xc3\x73\xaf\xd7\x82\x3a\xcc\xab\xf7\x0d\x93\x92\xd9\xbc\x10\x56\x5a\x51\x73\xa5\x5b\x8f\xec\x42\x25\xcb\xab\x82\xc4\xce\x78\x68\xfa\x90\xf7\x75\x98\x39\xa8\xe8\x2f\xc3\x06\x3a\x02\x77\xef\x43\xa5\x96\xdc\xbd\x6c\xff\xde\x7f\xbd\x5b\x04\x37\x77\x9f\x2f\x15\x27\x5d\x26\xd4\xd9\x22\xa6\x1d\xc0\x3e\x87\xe5\x1a\x0d\x55\x6d\x44\x3f\xfc\xa0\x65\x8c\x9d\x1f\x09\x18\xc9\x22\x42\x8b\xb8\xc3\x0a\x74\x88\x58\x4f\xad\xaf\xf2\xa2\x6a\x58\xaf\x95\x74\x9d\x3d\x85\xd6\xb1\x44\x8f\xad\x23\x68\xaa\x6a\x91\x5b\xab\xb8\x71\x6f\xf7\xd1\x41\x46\xff\x38\xba\x0b\x9c\xb2\x2b\x5a\x2c\x5c\x83\x6b\x46\x88\xc1\xfb\x4f\xb7\x17\xf3\xa1\xf8\xe6\xfd\xeb\x6f\x1f\x2b\xbf\xe7\x03\xa8\xdd\xa9\x3a\x1f\x2d\x98\xc3\x05\xea\x33\x93\x81\x08\x79\xcc\x8e\x02\x53\x64\x60\xa6\x71\x25\x8f\x49\xda\x54\x16\xb7\x93\x00\x47\x42\x4a\x5c\x90\xbc\xdc\xb7\x7e\xa8\x1a\x80\x09\x42\x54\xf8\x53\x61\xce\xc6\xd7\xda\x81\x12\x95\x0a\x37\x9d\x9f\x47\x01\x20\x3b\x1b\x26\xb4\xd1\x62\x27\x96\x91\xb2\xcc\xa4\x1b\x9e\x68\x1f\x45\xf6\x30\x1e\x68\x40\x58\x44\xcf\x67\x20\x9f\x3e\x86\x35\x33\x71\x4c\x6d\x83\x8d\xc2\xb7\xd6\x1e\xe8\x7d\xae\x78\x5e\xe5\x25\xda\x15\xe7\xf2\xb2\x0b\x0d\x31\xdb\x5c\x37\xed\x9f\x9e\x53\xd0\x02\x17\xe4\x6f\xc0\xd5\x4c\xe6\xd5\xbb\x2c\xbe\x79\xff\xe9\xf5\xa5\x24\x5f\xd3\xb8\x05\xed\x06\x2f\x6d\x3c\xca\x72\x50\x4f\x12\x64\x00\x57\x65\x56\x67\x9d\xcf\xbc\x6b\xea\xaa\xa7\x95\xee\x00\xca\x33\x2f\x86\xc0\x4a\x6b\x85\x28\x18\x73\x82\x2d\xad\x2f\x8a\x22\x27\x02\xf6\x82\x91\x38\xf7\x9d\xef\xb9\x25\x20\x02\x51\x4c\x38\x5f\xcc\x86\xb9\xdb\x47\xd5\x03\xd9\xe9\x83\xbe\x64\xeb\xdf\x04\x44\xd7\x0b\x04\xdb\x45\xdf\xfe\x4a\xfc\x7d\x2e\x29\x10\x53\x0b\x9c\xe0\x54\x96\x8e\xa0\xc5\x38\xa0\xa7\x58\x2d\x26\x1c\xc6\x62\x66\xf8\xc2\x18\x93\x54\x1c\xb4\xcf\xef\xe5\x86\x53\x9f\x7d\xb9\xa7\x5e\xcf\x4b\x35\x25\x3d\x6a\x35\xb5\x46\x56\xcc\x98\x28\x89\xe8\x83\xd9\xa7\x07\x15\x65\xd1\xaf\xa3\xbf\x88\xa2\x6f\xc3\x28\x2f\xc4\x85\x0d\xc5\xfa\x5c\xc8\xe2\x35\x78\xfe\x87\xdd\x94\xfb\x68\x31\x68\xf3\xa1\x0b\x26\xad\xb3\xcd\x4b\xce\x64\x10\xfd\x6b\x17\x65\x32\xc4\xa8\x44\x18\x61\xd9\xb5\x86\x13\x87\x41\xe9\x76\xec\xbe\x76\x7e\xde\xe3\xa2\xab\xa4\x55\x8a\x6b\x2e\x40\x09\x78\xd1\x57\x5c\x68\x4e\x04\x93\x20\xdf\x78\xe4\xe4\x81\xee\x8e\x07\x1d\x58\x46\xbf\x7d\x59\x35\xbe\xb9\x8b\xbf\xe6\xf1\x7c\x7b\xb1\xff\x5c\x53\x0e\xb8\xf9\xf0\x11\x34\x9c\x18\x8e\x1d\xc6\xb3\x97\x60\xcc\xa4\x20\xb4\xe4\xb8\x84\x99\xef\xaa\xea\x21\x92\x20\x73\xbe\x43\x40\x7a\x7d\x44\x04\xf4\xf3\xec\x75\x36\x1f\xa4\x75\xa6\x21\x46\xf8\x68\xf2\x68\xcc\xaa\x2c\x94\xb8\xe0\xe4\xc7\xc6\x74\x20\x8d\xf3\xc1\x49\xb1\x74\x83\x77\xd3\x14\xae\x39\xbe\x1b\xc2\x4c\xef\x37\x2f\xd1\xf0\xc1\xa7\xf8\x3a\x98\xf9\xe6\xd1\x6b\xa6\x5d\x23\xac\x5d\x5f\xd0\x7d\x03\x8e\x5e\xa6\xc0\x56\x41\xcc\x34\x1a\x0a\x9f\x2d\x75\x71\x1a\xbd\xdc\xab\x40\x8d\x7c\x88\xaa\x0a\x44\x0b\xea\x7b\xe7\xc7\x12\x3a\x45\x9a\xbc\x00\xe8\x82\xc1\x27\xbb\x8d\x07\x17\xf8\x13\x6b\xc0\x0f\xeb\xfe\x67\xf0\xc3\x57\xfb\xf7\xdf\xec\x0a\x12\x7c\x0c\xf4\x71\x90\x76\xb3\x99\xc6\xce\x4b\x50\x79\x83\xc1\x7c\xd0\x96\xfb\xce\xa9\xc1\x4f\xaa\xef\xce\x63\x82\xfc\x3c\x5a\x50\x00\xe5\x40\x89\x2b\xb4\xd6\x6e\x51\xb6\x5b\xe3\x61\xf1\x03\xac\xff\xb7\xcf\xc6\xff\x5b\x42\x31\x80\x54\x41\xdb\xb9\xf6\xb9\x92\x13\x88\xa8\x11\xa4\x4a\x33\xdf\x7a\x0b\x9d\xf2\x23\x10\xbe\x7d\x84\xfa\x57\xbe\x31\x39\x6d\x71\x37\x11\x04\x79\xe1\x1a\x80\x2a\xe0\xd6\xcf\xde\x3e\xe0\x5d\x17\x78\x88\x7f\x16\xdd\x6d\xf7\xc7\xe5\xb7\x86\x0f\xfa\x2b\x37\x06\x09\xa3\x2d\x70\xf4\x39\xf4\x93\x01\x11\xf4\x0c\xb4\x5e\x02\x0b\x6a\x87\xa9\x65\x8b\x12\xc4\x61\x7e\x50\x8b\x73\xbe\x71\xde\x4d\xe2\x08\x32\x07\xa8\x8b\x33\x34\xd7\xb4\x6b\xea\x8e\x0c\x55\x94\x84\xfb\xf3\x78\xf1\x31\xff\x26\x78\x7d\xfc\xe2\xed\xdd\x9b\xbb\x5f\x81\xab\x83\x7c\x9c\x3c\xaa\xb3\xbd\x5d\x4b\x89\xe4\xee\xd5\x4e\xf8\x2a\x03\xd6\xeb\xd2\x16\x19\x4a\x0d\x76\xfc\x88\x7d\xd3\x98\xa2\x9d\x89\x8b\xad\x6f\x32\x3f\x1c\xe0\x52\x57\xda\xf9\xd1\x4f\x52\x61\xdf\x02\x0a\xcc\x32\x23\x52\x31\x42\x0f\xd6\x5d\xca\x89\xc0\x28\x5b\x63\x19\x79\x90\xbb\x39\xe4\xf7\x0d\xf3\x19\x36\x29\x3f\x82\xf9\x7c\xba\x1d\x62\xe5\x0a\x50\x1e\xd5\xe0\x4f\x47\x3f\x09\xa0\xc0\xe0\x69\xe9\x00\xa2\x69\x55\x90\xb5\x4b\x3d\xb1\x78\x4e\xb9\xa2\xbc\x10\xbc\xc8\x0f\x9a\xe2\xe3\xa8\xe7\xde\x77\x83\x01\xd0\xa7\x4b\x51\xe4\xac\x46\x23\x41\x58\x25\xd6\x93\x63\x5e\xe7\x34\x8a\x40\x92\x5e\xea\x9b\xdf\x86\x0a\xe3\x71\xb0\x17\x6f\xbc\xcb\x40\x3e\xd9\x6c\x1b\x3e\xdd\xbe\xfd\x79\x7c\x71\x8d\x09\x9f\xd7\xcd\xfb\x4f\xbb\xca\x77\xa0\x2d\x60\x85\x0a\xd0\x2e\x81\x3d\x00\x0a\x4c\x74\x23\x6d\x01\x55\x49\x48\x91\xd6\x69\x49\x5d\x2d\x30\x86\xbe\x11\x20\x47\xc7\xb2\xdb\x9d\xac\x60\x50\x18\xeb\x5b\x93\x63\x25\xa9\x3f\xf9\x23\x15\xa2\x58\x70\x91\x13\x90\xc3\x93\x45\x84\xc6\xc7\x2c\x5d\xcc\xc9\xf4\x71\x96\xe9\x3a\xf8\x16\xd1\xbf\xbf\x6f\x91\x59\x6f\xd3\xd6\x93\xa0\xdd\x36\xdd\xb7\xa0\x0f\xad\x9b\x4c\x1c\xe7\x88\x94\x12\x95\xcf\xd7\xc5\x7f\x94\x6f\xd1\x3f\x8c\x55\xf0\x77\x60\x5f\xe8\x03\x3e\x69\x41\xfc\x01\x95\xac\x2f\x80\x31\x61\x32\x10\xae\x7e\xbd\xcf\xbd\x00\xec\x9e\x01\xe1\x45\x3c\x75\xbe\xee\x7b\xc0\x3a\xd7\x9d\xcb\x17\x52\x90\xeb\x31\xc8\xde\x8f\x7c\xcd\x4a\x20\x1a\xc4\x71\x3e\x04\xbd\x47\x50\x73\xce\xb9\x1f\xdd\xfa\x97\xaf\xce\x73\x0c\x99\x3f\x32\x3f\xf0\x13\x97\x6b\xed\x46\xb8\x96\x64\xbd\x2e\x9b\x07\xb2\x73\x87\x22\xca\xb6\xbb\xe3\x8b\x5d\x0c\x78\x1b\xbf\x20\xee\x07\xa7\x01\x27\x38\xc4\x25\x87\x70\x61\x55\x2c\x2d\x59\x5b\x2e\x88\x19\x37\x9a\x0b\xad\x39\xc5\x87\xe2\xf7\xf3\x76\xc6\xf6\xf4\xf7\xdd\xe1\xe8\x7b\xf8\x10\x1d\xbb\x01\x3b\xd3\x3a\xd6\x4f\x7d\x8b\xb4\xad\xaf\xfa\x22\x78\xa7\x0f\x59\x74\x13\x3c\x89\x1f\xeb\x6c\xf0\x21\xbb\x89\xa3\x9b\xf7\x9f\x7e\x05\xb6\x51\xd1\x0e\x55\xcb\x54\x01\xe1\xb2\xc2\x9f\x26\xde\x1d\xe9\xa9\x35\xd2\x74\x87\xec\xbe\x4e\xba\x73\xbe\xd3\x7e\x5a\x5a\xfd\x10\x79\xa3\x34\x07\x39\x10\xde\xd6\x9d\x3a\x36\x01\x0f\xa6\x76\xfa\xe2\x43\x7f\xf5\x92\x08\x27\x7a\x1f\x7a\xd4\xf5\x4d\xdd\x86\x7b\x20\x6e\x48\x01\x84\x81\xd6\x69\xbd\x96\x94\x83\x04\xb0\xeb\x06\xdd\xd5\xbc\x5c\x28\x38\xe6\xf8\xa0\x9a\xc6\x79\xe9\xe7\xe1\xa8\x87\xce\x9f\x7a\xdb\x81\xfc\x34\xf1\xe1\x38\x00\xe4\x6a\x7b\x79\x4f\x64\x57\x1e\x48\xa8\x09\xfe\xf9\x97\x67\x35\xde\x44\x21\x02\x65\x6c\x0d\x82\xbf\xd8\x95\x8c\xa9\xa6\x6c\x15\xf2\xb0\xac\xad\xe2\x0e\x74\x1e\xa7\xa0\xf7\xf8\x40\x7e\x3f\x49\x99\x56\xa9\x04\x9d\x17\xbe\xa3\x20\x38\x59\x25\x91\x47\x00\x9d\x4f\x00\x0d\xe8\xba\xf7\x18\x03\xbf\xe2\x37\x51\x04\xae\xe9\xe2\xd3\xc7\x6b\xea\x7f\xf5\x61\x2d\x9a\xd6\x6b\xeb\x76\x2d\x9c\x6e\x62\x26\x27\x0b\x82\xd5\xa8\x4e\xd7\x7e\xa7\x02\xc6\x2d\x7d\x9a\x03\x32\xf1\x63\x39\xa5\x00\xfa\xb1\x97\x20\x07\xda\x21\x08\x88\x03\xc4\xb7\x4b\xeb\x08\x6e\x26\x3b\xc6\x02\x34\xbe\x45\x70\xe3\x8e\xc9\x07\xbe\x9b\x0e\x3a\xc4\xf5\xb5\x3c\x7b\xa4\xc5\x7d\x7e\x7d\x05\xf0\x6d\x5f\xc3\x1c\x68\xb0\x39\x8c\x87\xd4\x0e\x4c\x67\x86\x89\x9c\x72\xb2\xd4\x22\x2e\xa8\xc5\x9e\x72\xa0\x08\xa3\x4e\x4d\x07\x5d\x18\x71\xcf\xbd\xcd\x6d\x66\x00\x8f\x4f\xe7\xde\xe7\x0a\xb4\xf1\xbc\xd4\x6b\x34\x41\x71\xda\x5b\x31\xad\x3d\x23\xe8\x82\x1f\xd6\x73\x2c\xef\xc7\x9f\xf2\x42\x4f\x36\x0f\xf4\x62\xad\x8d\xae\xfa\x13\x6b\x8e\x0d\xea\x42\x59\x91\xc5\xe4\x7b\x17\xcb\x2c\xf3\xf9\xce\xdc\x2b\x97\xb0\x73\x6d\x62\xb6\xd4\xd5\x9a\xe4\xa8\x2f\x62\xee\x31\x8c\x51\x8c\xc9\x43\xe4\xfb\xd8\x2d\xd3\x0c\x20\xf3\xcd\x9a\xdc\xd7\x97\x86\x0f\x06\x61\x6b\xcb\xc2\x4f\x8b\x30\x57\x3f\xf4\xce\xf2\xd4\x16\x3a\x4f\x85\x75\xb8\x96\x93\xb7\x40\x4e\xd2\xd0\xe8\x67\x60\x08\x35\xae\x7d\x81\x45\xfe\xcb\x8b\x2f\xfa\x8f\xbe\x8b\xeb\x96\xf9\x05\xdc\xf4\xf9\x20\x63\x77\x2a\xf3\x98\x7f\xaf\x63\x99\xe5\xbe\xdc\xd9\x7b\x69\x13\x79\xb6\x2a\xd6\x8b\xb6\x80\xfb\xca\xd7\xbb\xf2\xfe\x58\xed\xf9\x52\x91\x4b\x7f\xb5\x38\x80\x45\x7b\xa2\x63\x42\x86\x23\x3d\x1e\x0f\x16\x13\x6b\x61\xe9\xfb\x85\x19\xe0\x90\x3f\x4a\xe2\xb1\x26\x66\xdc\xba\xac\xbe\x60\x35\x33\x44\x23\xad\xcd\xa6\xd5\x50\x5e\xe2\xf4\xa6\x8f\x7b\xcd\xf3\xcf\x2f\xfe\xad\xb2\xb8\x12\x1d\x6f\xee\x40\xe0\xb1\x7d\x1b\x38\x6d\xbb\x36\x6c\x35\x09\x0f\x3c\xb6\x7c\x99\x8b\x4a\xfb\x01\x48\xee\x8a\x32\xb6\x0b\x52\x16\x70\xa0\xbb\x4a\xd6\xed\x52\x39\x3d\xc9\x71\x47\xbd\x73\x4b\xaf\x58\xe6\x32\x1e\x67\x6e\x00\x85\x03\x69\xa1\xa4\xf3\xe3\xe0\x4f\xdd\x43\x64\x40\xde\x09\xea\xc7\xce\x76\x51\x02\xa6\xe0\x55\xa2\xa3\x22\x4c\x01\x23\xf0\xbc\xa3\x88\xc1\xa3\xca\xd4\xe7\xc0\xef\x8b\x6e\xef\x40\xd8\x8c\xde\x5e\x82\x85\x04\x24\x4f\xeb\x34\x4f\xb2\xf3\x98\x17\x71\x95\xfb\xa9\x07\x58\xf9\xe3\xf4\x10\xf9\x91\x02\xe6\x6a\xa6\x5b\x01\x38\xf7\x3d\xd0\x59\x4a\xa7\xbe\x2c\x25\xb1\x58\xee\xf3\xba\xcb\xda\xca\x59\xe5\xa9\x9f\x34\xb3\xdc\x35\xcc\x71\xe5\x9c\x3f\x0d\x16\x98\x58\x78\x5e\x16\x43\xdb\x83\x34\x51\x4c\x30\xc1\x36\xff\xa0\xec\x4f\xe4\x43\x54\x96\x72\x70\x5a\xf8\x4e\xfb\x0e\x48\x6f\xb9\x5d\x4f\x25\x45\x30\xf7\xb3\x27\x06\x68\x00\x3d\x82\x7b\x58\xd6\x7f\x88\x0f\x11\x87\xdf\xdd\x1c\x54\x40\x71\x05\x2f\x94\xe7\xc1\xe4\xf5\xfe\x26\x4a\x36\x9e\xea\xb7\x6b\xaf\x73\x13\x0b\x70\x4a\xd7\xfa\xac\x02\x43\xbb\x74\x2d\xa8\x95\xe7\xbd\xf1\xcc\x82\x4e\xfa\x32\x19\xfc\x90\xc6\xd3\xf3\x58\xe2\xe5\xe8\x40\x0a\x6a\xcf\xfd\x2c\xb7\x0a\xf5\x12\x55\xe2\x38\x7d\xa8\x6e\xea\x43\x16\x65\xc1\x31\x24\x60\x60\x93\x70\x27\xdc\xde\xbd\xbf\xbd\x03\x77\xb7\x77\xb1\xda\xe7\xe7\x1a\xc6\x53\x05\xd8\xf7\x3c\xa9\xd1\x42\x50\xe3\x07\x50\xc4\x82\x2c\xd5\x21\x73\x7e\xbe\x1f\x9c\x03\x4a\x27\xe4\x3c\x80\x0d\xbf\x9d\x9c\x1e\x58\xd0\xe8\xd9\xe6\x5f\x77\x9b\xde\xc1\x33\xa1\xe6\xc0\x49\x7b\xce\x7a\x7e\xf5\xe1\xcd\xa7\x6f\x37\x71\x9e\x8b\x5e\xcf\x69\x1b\xf5\xe6\xcb\x14\x8e\x9a\x9b\x36\x2f\x49\x99\x99\x9c\x5b\x4d\xad\x5e\xa0\x3d\x9d\xb4\x2c\xdb\x9a\x1c\xe0\x92\x82\xbe\xf2\x65\xe3\x73\xc5\x89\xaf\xcb\x8c\x0e\xe8\x21\x92\x84\xc7\xa7\x19\x35\xa3\xf1\x1a\x42\xcd\x50\xf0\x59\x32\x8f\x35\xce\x37\x1b\xc2\xf1\xd2\x69\xbc\xde\xdf\x7c\x97\x5c\x17\xc1\x1b\x94\xe4\x31\x21\x3f\x6f\xe1\x3e\x25\x03\x90\x01\x1b\xd8\x80\x8c\x8e\xd6\x55\x1d\x03\x51\xeb\xad\xd4\x69\x4e\x31\x83\x08\x12\x6e\x63\xa6\xd3\x82\x51\x86\x70\x01\x85\xdc\x57\xc7\xa3\x5d\x06\xcf\xea\xaa\x02\x68\xd1\x31\xf7\xbd\xab\x3a\xa0\x63\x46\x72\x2d\xb8\x12\x8c\x5a\xc9\x4f\x00\x17\x5a\x72\x25\x05\x61\x54\x6c\xbb\xf6\x30\x57\x97\x4f\xda\x22\x87\x9b\xbb\x2c\x7e\x94\x04\x7b\xa6\x2d\xf2\xee\xc7\xb4\x45\x76\xc2\x66\x79\x5c\x49\x8b\x79\x61\x10\xca\x8a\xa5\xc7\x54\x1a\x61\x0a\xa0\xe6\xb5\x5d\x92\x66\x51\x76\x6d\x32\x0a\x02\x91\xb6\x07\x55\x10\x72\x5f\x7a\xba\xb6\x70\xd3\x2e\xfa\x49\x65\x91\x24\xd1\x17\x7f\xb4\xdf\x5c\xa6\x88\x6f\x6f\x5e\x6f\x74\x89\x37\x5f\x28\x5c\x84\x4d\xe9\xe1\xe6\x7d\x74\x73\xf7\xdd\xfb\xc3\x9a\x92\xf7\xcc\x15\xc7\x13\x13\xa2\x09\xa6\x08\xc8\x79\xec\x40\xe1\x1b\x40\x6b\xc6\x29\x20\x29\x70\x4c\xb3\xc0\xd2\x39\x68\x88\xfd\xb1\x72\x94\x8b\xd6\xb6\x0b\x55\x2a\x6e\x5a\xdb\x52\x4e\xd6\xc8\xc3\x1b\x7b\x4f\x40\x11\x3c\x07\xbb\xcb\xe7\x7b\xf5\x6b\x7b\xac\xb8\xf7\x3f\xe1\xd7\x96\xcc\x40\x16\xa8\x5a\x8b\x92\xb3\x8a\x75\x0d\x39\xc8\x3c\x09\x06\x97\x6b\x0a\xf1\x2a\x86\xd4\x57\xa4\x70\x05\xde\x1b\xc1\xa0\xd4\x16\xa2\xba\x79\xe1\xd7\xd6\x2a\x07\x9d\x0e\x75\xf4\xf1\xc5\xfc\xf7\x8b\xfd\x54\xf2\x85\x3f\xe9\x8e\xc4\xf3\x92\x59\xd0\x7b\xb4\x1e\x6d\x82\x7c\xbd\x79\xaf\x49\x60\x7d\x7b\xc0\x0b\x04\x55\x1d\xac\x48\xed\xb0\x99\x68\x0e\x51\xb2\xcb\x2e\x1e\xf4\x3f\xe5\xad\x78\xf3\x03\x6f\xc5\xdc\x37\x05\xd4\x42\x1a\xc3\x46\xea\x95\xd5\x46\x16\x6e\xa0\xa0\xc8\xd7\x1e\xc3\x0f\xdb\xab\xd8\xbb\xf3\xa0\x05\x91\x5a\xe1\x5a\x56\x43\x4c\x97\x1a\xe1\xd0\x6f\x45\x9c\x22\xa9\x6c\xdf\xfb\xb6\xef\xc3\xf5\xc9\x42\x6d\xfe\x35\x1e\xef\xcd\x9b\xe7\x6c\xde\xcd\x99\xee\xe3\xd5\xd0\xfb\xfd\x85\xc7\xfb\xfa\x91\xc7\x9b\xa8\xce\xc5\x95\x2f\x1d\x13\x66\xe8\x34\x77\xfe\x34\xd7\xfc\xe8\x47\x24\x5d\x96\xbb\x54\x8e\x9d\x4c\x29\x71\xe8\x21\x52\x63\x17\xd7\xc1\xbe\xee\x4a\xe0\xed\xa4\xa2\x8d\xb6\xa6\x66\x43\xa5\xaa\x86\x9e\xaa\x34\xcf\x8b\x52\xc3\x81\x42\x5c\x08\x92\x0c\xe5\xf9\xe4\x0b\x0e\x8e\x71\x53\xc6\x85\xd2\x54\x07\xfc\xd9\xf5\xfa\xfd\x23\x7c\x33\xdf\xde\x7c\xf3\xbc\x3a\xff\x7c\xb7\x8b\x92\xec\x3c\xc5\x7a\x1b\x24\x25\xda\x2e\xd8\xf2\x24\xe2\xb6\x19\xa9\x9f\xda\x35\xc3\x3b\x45\xb9\x30\x9a\x2e\xcd\x33\xd7\xcc\xd9\x58\x90\xfb\x5e\x8e\x9a\x96\x15\x52\x1a\x3b\xc8\x84\x10\x86\x09\x13\xed\x12\x16\xb8\x9a\xf0\xd1\xd9\x39\x02\x6f\xee\xb2\x9b\xc3\xb3\x5b\xfe\x4a\x97\x5d\x2f\xa4\xeb\x3a\x61\x27\x92\x12\xc3\x06\xb3\x42\x23\x92\x95\x8b\xd2\x56\x25\xca\x2d\x6d\x4c\x7c\x14\x06\xd3\x55\xb5\x43\xed\x92\xb5\x2e\xaf\x72\x62\x62\xbc\x4c\x5e\x31\x50\x81\x53\x3c\xfb\x14\x88\xe3\xe2\x7c\x66\xc6\xcd\xbf\xb6\x0f\xb5\x12\x7a\xec\xb6\xa2\x00\xa1\xfa\xfc\xf6\xe6\xd5\xbb\x57\xc1\xe0\x08\x5c\x39\xb4\xdf\xbe\xba\x4b\xa6\xc4\x30\x95\x99\x6a\x11\xb9\x95\x20\x0b\x9d\xdf\xe5\x38\x20\x77\x6f\x32\x97\xf9\x06\x60\xea\xb2\x5d\x40\x9b\x2e\x39\x28\x97\x14\x82\x2c\xfc\xae\xe6\x81\x04\xef\xd7\xec\x32\xd9\xfb\x61\x6f\x74\x7b\x85\xcf\x7d\x78\xf5\xee\x86\xb3\x6d\x8c\x57\x2e\xa6\x1a\xd7\x32\x06\xad\xf7\x8a\x51\xea\x80\x7f\x7f\xe4\x22\xab\x32\xba\x17\xbf\xaf\x0e\x27\x5f\xd9\x7e\xc1\x1a\xb4\xd1\x2e\xb1\x17\x8c\xc7\x3f\x0a\xbd\x4f\xf1\xe4\xfc\x96\xac\xf5\xc7\x9f\x07\xf9\x92\xfd\xdb\x78\xff\x3e\xba\xae\xa9\xf7\xca\x65\x79\x07\x22\x3e\xb7\xcd\x49\x00\x7c\xd4\x8d\x1f\x19\xc8\x01\xd2\xbd\x57\x1c\x68\x40\x6d\xe5\xad\x1f\x08\x28\x00\x3d\xe8\xb2\x2c\xfd\xdc\xd9\x1e\x64\x7e\x6c\x05\x48\x2d\xf1\x43\xaf\x86\x8c\xfa\xea\xa4\x40\x9a\x63\x3f\xf9\x5e\x1a\xb9\x06\xa9\x35\x46\xb1\x67\x9e\x43\x8f\xfa\xbd\xf1\xc5\x9c\xf5\xf9\x45\xf6\x39\x6c\x5e\x3e\xbc\xda\xa5\x60\x53\x30\xcf\x70\x0f\x4a\xe6\x4f\x47\x35\xe3\x81\x6b\x2e\x29\x87\xa9\xaf\xec\x30\x00\x31\xee\xf5\xe9\xb4\x40\x3f\x37\x35\x73\xa2\x6e\x89\xc3\x4e\x57\x4c\x0b\xdd\xdb\x30\xe7\x09\x5c\xb1\x34\x52\x0f\xe4\x46\x24\xe3\x33\x3e\xde\x86\x3a\x5e\xaf\xb5\xa7\xbf\xe3\x67\xa0\xbd\x57\x57\x6b\x97\x60\x86\xf3\xe5\x26\xef\x82\x3c\xbe\xc9\x16\xb1\xd6\xf0\xe1\x98\x53\x69\x0a\x52\xb0\x02\xe7\xd9\xf7\x22\xae\x97\x53\x70\xf4\x4b\x97\xd3\xe0\x10\xb5\x0c\x0c\x28\xab\x32\x98\xe4\x0c\x59\x48\x6b\x92\xbb\x1c\x27\xa3\x61\x9a\x29\xe6\x5d\x9d\xd9\x8c\xb6\x49\x14\x28\x93\x6c\x60\xac\x0a\x13\x58\xed\x1c\xac\x6d\xa9\x2c\xb6\x0a\x6d\xea\xd9\x51\xb4\x8b\x74\xe2\x82\x1f\xfa\x9b\xe8\x9f\x45\x7f\xb9\xe6\xc9\xdb\x0f\x9f\xdf\xde\xdc\x1d\x6e\x1e\x75\xf3\xbe\x7b\xff\xe9\xf3\xbb\x0d\x80\xf7\xb7\xe0\x4b\x95\xbc\x77\x1f\xd6\x53\x5d\x9f\xb0\x43\xa0\x2a\xda\x86\x33\xa3\xfc\x40\x3b\xab\x2d\xc1\x15\x40\x10\x6a\xa9\xe1\x9c\x64\x4c\xdb\x8e\x8e\x75\x7d\x82\x9d\xb1\x0c\x0f\xd4\x4a\x72\xc8\x65\xc6\x8f\x0e\x5b\x04\x29\xb3\x05\x82\x90\x31\x0c\x8b\x92\x8a\x5a\x3b\x8e\x0b\x87\x38\xc7\xba\x24\xd2\x09\xca\xf8\xf3\xf3\x5f\xfd\xb1\xe7\xff\x6f\xc1\x9f\x78\xfe\xf9\x52\xc5\x73\x26\x2e\xe7\x3f\x2b\xbe\xe7\x71\x73\x29\xa4\xf2\x65\x6a\x0d\x66\x9a\x83\x0e\x67\x2e\x43\xeb\xf9\xd7\x90\xb5\x34\xb7\x39\x49\x2a\x43\x25\xd5\xd4\xd7\x2e\x33\x59\x79\x8c\x87\x23\xa5\x1d\xa5\x03\xa5\xae\x6c\x15\x31\xca\x58\x58\x99\x42\x1a\x64\x64\xa9\x54\x19\x82\x68\xb2\x8b\x42\x0c\x2d\x9f\xd0\x18\x2f\xd3\xec\x3e\xb4\x1d\x5b\x0b\xb2\xa3\x49\xee\x9b\x2d\xbf\xad\x21\x62\x88\x95\xcb\xa9\xc1\x3e\x27\xb9\xcd\xf1\xa1\xb4\xe7\x31\x6c\xca\x5c\x52\xd8\xdc\x1f\x4f\x68\x04\xf9\xc9\x9f\x4a\x90\xcf\xe1\x77\x6d\xda\x34\xd9\x25\x5e\x7c\x2d\x5a\x5c\x22\x85\x64\xdb\xf4\xa4\x5c\x46\x37\x03\xe5\x8d\x56\xea\x90\x7d\x9f\x5e\x06\x26\xf8\xf7\xfd\xa1\xf7\xe4\x7c\xd2\x71\xba\xe9\x8f\xb8\x1b\x7b\x28\xa3\x9b\x30\xbd\xb8\xbc\x81\x97\x63\x99\xeb\x5d\x79\x63\x97\x2c\x9e\xcf\x32\x76\x0e\x73\x2d\x24\xe7\xd2\x2a\x4e\x52\xa1\xad\x54\x62\x7d\x0f\xdf\x5b\x7b\xb0\x7e\x2a\xfc\x71\x1c\x8e\xb2\x6b\xc6\x4a\x48\x9d\xf6\x43\x47\xab\x6a\xbb\x07\x2f\x3b\x58\xf4\x47\xdf\x83\xb7\x77\xaf\xc0\x86\xf8\xff\x75\x7c\xb1\x1c\xfb\x0a\xe0\xff\x46\xf8\x2e\x60\xd8\x83\x2b\x7b\xa6\x0c\x6d\x8a\x9e\x60\x94\x9f\x4f\xa0\xda\x58\x99\x20\x3a\xa2\x5c\x15\x10\xe3\xcc\x64\xd8\x3b\x93\x51\x43\x01\x46\x99\xc9\xe0\x01\x99\xda\x54\xa6\x5a\xcc\xa9\x70\xb9\x01\xed\x2e\xf3\x43\x5d\xfb\x63\x55\x99\xaa\xf2\x46\x3b\x58\xe9\xb4\xaa\x8a\xda\x66\xe5\xdc\xe1\xa1\xad\xea\xa2\xa9\xd6\x3a\x60\x0c\x39\x43\x04\x2f\xd1\x97\xd3\x9f\x8b\x5c\x49\x70\x12\x4d\x7e\xf9\xfa\xcf\xc1\xeb\xdb\x7d\x4d\x21\x90\x12\xf6\x66\x92\x47\x53\x4d\x62\x76\x2d\x11\x40\x43\x92\xe6\xb4\xc4\x16\x1e\x84\x6d\xec\x32\xfb\xba\x69\x6c\xdd\xf4\xd6\x98\x23\xc0\x31\xb4\x4e\x79\xde\xfa\x81\x19\x90\x87\x60\x96\x44\xd3\x03\xb9\x29\xe2\xab\x2f\xe6\x45\x57\xf5\x55\xd8\xe2\x5e\x75\xd0\xa7\x78\xa8\xe2\x7e\x41\xd5\x02\x5d\x8c\x96\x3e\x3e\xc6\x10\x34\xc6\x78\x79\x3c\x1a\x1d\x66\x8c\x71\xb2\x69\xb4\xc1\xe8\x9f\x6e\x11\xf9\x4d\x72\xf7\xfc\xe5\x7f\xf7\x3e\x4e\x36\x65\x87\x4f\xb7\xef\xde\xdf\xde\x25\xbf\x78\xbd\x43\x71\xcd\x40\x84\x5a\x69\xa5\x96\xba\xa1\xad\xd0\xac\xa8\x14\xe7\x29\x8b\x23\x05\x87\x92\xf9\x29\x6b\x0f\x50\x7b\xb1\x9c\x7c\x6f\x94\x91\xce\x49\xad\xec\x70\xf4\xb9\x6f\x44\x1f\xa3\xf8\x74\xdf\xce\x00\xab\xb5\x88\x29\xfd\x9a\x1b\x76\x22\x68\x1a\xa6\x57\x57\x8b\xe7\x8a\x52\xc1\x0d\x92\xad\x55\xb2\xbb\xd8\x9d\xe1\x43\xfa\x7b\x6c\xed\xa1\x5b\x60\x8c\xbf\x9f\x63\xbc\xed\xb8\xa3\x4b\xff\xfd\x4d\xf4\x3f\x44\xff\x73\xf4\x1f\xa3\xff\x35\xfa\x3f\xa2\xff\x14\xfd\xdf\x8f\xbc\xc3\x17\x74\xc2\x4f\x7f\x0c\xef\xf0\x6e\xe3\x1d\x7e\xfe\x63\x88\x87\x8f\x5b\xf1\xb8\x2f\x4a\x2e\x4a\x59\x70\xdd\x34\x83\x22\xa8\x50\x02\x13\x74\xe4\x5d\xd9\x01\x04\xf4\x6c\x8a\x92\xd1\x42\x65\x29\x33\xf3\x0c\xf2\x23\xa4\x69\x9a\x72\xa2\x05\x81\xa5\x61\x32\x37\x4b\x80\x6b\xbd\x9c\xc3\xd2\xc1\x9f\xf0\x18\xeb\xb1\x13\xdd\x71\x6f\x31\x24\xc6\x16\x4c\x29\xa5\x95\x2b\x8a\xc0\x3d\x3c\x5a\x21\xad\xd2\x5a\x63\x48\xa4\xbb\x72\x0f\x35\xca\x32\x52\x28\x8c\x71\xdd\x6a\x4e\x4d\x20\x1f\xa6\xec\xab\xe4\xc3\x9f\x83\x39\x5c\x0f\xe2\xa2\x61\xbc\xe9\x69\x7f\x8a\xfe\xab\xe8\x6f\x2e\x8e\x69\x3c\x9c\xcf\x8b\x17\xde\xcd\xa3\x36\xe6\x05\xed\xf6\x0c\xe5\xb2\xdf\x86\xd3\xf1\x55\xe1\xfd\xf3\x2f\xff\x1c\x7c\xfc\x7f\x79\xfb\x7f\x60\xc9\x75\x3d\x3f\x0c\x27\xc8\xee\x3e\xdc\xdf\x6a\x25\xce\x9d\x3b\x6f\xb8\xd2\xbe\xfd\xf1\xbc\xb9\x73\x87\x4f\x5e\x49\xf0\x8e\x66\x06\xf2\x4a\x16\xec\x92\x64\xc8\xb2\x25\x04\xae\x35\x02\xbb\x0a\x55\xaa\x72\xc1\x55\xae\x32\x22\x17\x42\x84\x08\x11\x22\x64\xc8\x90\x21\x43\x86\x0c\x19\x32\x64\xd8\x21\xc3\x7e\xf7\x34\x71\x5c\x04\xbb\xcf\xe9\x33\x77\xde\x7d\x6f\xab\x54\x3e\x77\xf8\xe7\xf4\x3d\xd5\x04\x41\x10\xf8\xfe\xf9\x7c\x3f\x9f\x77\x6f\xde\x7d\x7a\xf7\xeb\xdb\x40\xf5\xfe\xe3\xf6\x24\x5e\x2a\x78\xbc\x7f\x73\x65\x69\x79\x73\xff\x26\x56\x81\x18\xbd\x5e\xf7\xc2\xfa\xc9\xee\x8e\xeb\xde\x73\x8a\x18\x62\x49\x1a\x0e\xc0\x7a\x0d\xd8\xc3\x98\x1b\x65\xe3\x2c\xcd\x4c\x91\xe5\x83\x1d\xc7\x11\x88\xc1\xf6\xde\xd9\x46\xd3\x6a\x2a\x49\x55\xba\x54\xcc\x15\xf7\xb6\x32\xc5\xd0\x12\x03\xc8\x41\x18\x63\xa8\x97\x41\xcb\xc3\x5e\x8f\x35\x21\x8c\x11\x12\xf6\x27\xc3\x7d\xe3\x67\x7f\xe4\x20\x03\x0c\xb8\x3c\x87\x10\x1e\x39\xe7\x7c\x64\xeb\xcf\x49\x42\x2c\x08\xa2\x79\x8e\x04\xac\x18\x26\xce\x95\x50\x61\x48\x40\xc3\xd4\x36\x36\x37\x0e\x54\x13\xa5\xd1\xdf\xbb\xcc\xe1\x5b\x6d\xec\x53\x14\xee\x5b\xe4\x0f\x2f\x84\x4a\xde\x7c\xc5\xf1\x7b\x71\x34\x2e\xfc\x0f\x5f\x9e\x20\xb9\xfb\x0b\x13\xc4\x6e\x82\x45\x50\x39\x48\xa1\x97\xe0\xe8\x73\x33\x8e\x60\x02\x27\x9f\x9a\x69\x5a\x52\x90\x3a\x80\x5d\xc0\xa5\xac\xb3\x23\x59\x26\x28\x1c\x91\x52\xca\x46\x78\x6c\xa5\xd4\xaa\xec\x1a\xc2\x28\x1b\x27\xaf\x01\x9a\x26\x7f\x8a\x27\xdf\x01\xec\xbb\x8d\x03\x02\x07\x0a\x08\x2d\xd6\x9d\x6f\xae\xec\x0f\x76\xed\xb5\x75\x0d\x42\xda\x01\xce\x70\xbf\xe9\x03\x0d\x65\x2e\xb1\xb4\x4c\xaf\xfd\x35\xb2\xa0\x85\x46\x83\xcd\x7f\xad\x73\xfd\x31\xfa\x97\xe1\x7d\xfd\xbf\x22\x19\xfd\x3f\xcf\x18\xf1\xfb\x6f\xd4\xb9\xde\x0c\x8e\xf7\x4f\x63\xe7\x65\xa9\xeb\x15\xce\xf6\xed\x52\xd7\xa0\xc3\x70\xfd\xc6\xcf\x5f\x7e\x0b\x9e\x6a\x5d\x93\xda\xa4\x59\xcc\x4b\x04\xd2\x87\x2e\x2f\xd8\x31\x46\xa8\xf0\x11\x2a\xd3\xa4\x38\x4f\x59\x53\x15\xc7\x01\x1b\x80\xe3\x92\xd4\x13\xc1\x0d\xcc\x64\xc6\xe7\x96\x99\x76\x51\xa6\x88\x39\x2c\x27\x2f\x09\xa9\x70\xa6\x32\x7e\xea\x58\x66\xbc\x16\x00\x5a\xef\xf2\x82\x81\x28\xc6\xeb\xc2\x5c\x92\x1c\x14\x79\xea\x3b\x30\x14\x40\x0a\xc1\x28\x13\x5b\xc1\x2b\x2c\xfd\xd4\x65\x99\x50\xbc\x84\xa8\x68\xa9\x37\xbc\xc8\x45\x91\x3f\x97\xbc\xe6\xf9\xcb\x9a\xd7\x42\x94\xa5\xef\x9b\x22\xcf\x59\xa1\x29\xa6\xe3\x49\x19\xea\x4e\x69\x16\x4a\x5e\xcb\x72\x80\x48\x88\xe9\x52\xf3\xfa\xa7\x71\x73\xe1\x15\xff\x3a\xa3\xf4\x35\x1a\xe8\x92\xf5\x0a\xec\xe7\x1b\xbd\xc3\xfe\x02\xdb\xda\x8a\xd0\xb7\xed\x05\x73\x7c\x13\x97\x21\xc3\x05\x8e\x0f\x35\x18\x97\x71\xd7\x3e\x88\xb8\xe9\x3a\xdb\x75\x0b\xeb\x7b\x1a\x74\xe8\xe2\xe3\x92\x5f\xb7\x6e\x2b\xa7\xe6\xc3\x80\xfb\xee\x00\x29\xd5\x44\x6b\xe2\x4f\xab\x85\xa4\x42\x66\xa9\x59\x04\x98\xf0\x09\x1f\x51\x2f\x19\xd2\x25\x85\xd8\x90\x72\xbd\x8f\xe8\x91\x86\xfb\xf8\xd5\x8d\xce\xe5\xbf\x09\x4a\x62\x7f\x1b\xfd\x1f\x3f\x53\x65\xb8\x0a\x4d\xec\x2f\xa3\xa5\x08\x33\xcd\x93\x3a\xc3\x3a\x62\x6e\x84\xb6\x9e\x40\x68\xb7\xca\x6a\xc1\xda\xf8\xf2\xf1\x85\xb6\xc3\xa7\x1d\xb1\xc1\xbc\xd4\x90\xca\xb2\x38\xdb\xd6\x34\xc0\xc5\x69\xd6\x0d\x52\x82\x8c\xb8\x4c\xaf\x8e\x50\x9f\x4f\x76\xf4\x01\xc5\xb9\xfa\x2b\x7c\x58\x86\x70\xf0\xc7\xe0\x04\xc4\xa9\xc0\x06\x89\x25\xd2\x39\xd3\xbc\xb3\x90\xd5\x30\x33\x19\x7f\x8c\x5a\x7e\xd0\x58\x51\x45\x19\x86\x70\x69\x7d\xe1\x0d\x05\x0a\x74\xb1\xab\x64\x91\x67\x79\x0e\x19\x54\x04\xa1\x32\x93\x19\x41\xb9\xaf\x7c\x0a\x20\xa5\xd4\x9f\x28\xa5\x13\xe5\x8c\xb3\xc2\x56\xb4\xb2\xa8\x68\x2b\x5c\xb9\x63\x51\x14\xbc\x34\x0c\xaf\xef\xdf\x9f\x05\xfd\xf8\x36\xe4\x06\x5e\x5f\xac\xb1\x2f\x11\x8e\xfe\x7d\xf4\xbf\x46\xff\x7b\xf4\x9f\xa3\xff\x33\xfa\xbf\xff\x50\xa5\x62\x72\xc9\x1b\xec\xdf\x3e\x99\x8b\x17\x5b\xf1\xca\xc1\xf5\xe1\xe6\x24\xfb\x2e\xcc\xf0\xf1\xbb\xdf\x7c\xf8\xf1\x56\xb4\xee\xb6\x9b\x0f\xb5\x20\x94\x51\xae\x5c\xe5\x7b\x41\x28\x27\xe1\x74\x78\x3a\xb5\x3b\xf5\x60\xec\xda\x95\x71\x4d\x14\x21\x50\x2b\x5b\xa3\x8e\x73\x58\x39\xb9\x94\x56\xf1\xdc\x34\x04\x0c\x56\xf1\xc2\xb4\x04\xf4\x16\x66\x45\x2e\x33\xc7\x20\x5e\x34\x45\x02\xd2\x18\x32\x28\x20\xf5\xe6\xf2\x5b\x38\x1c\x2c\xa3\x18\x62\x2e\x85\x12\xdf\x38\xf3\xd5\xd2\x6a\x80\x53\x8a\xf3\x82\xc3\x12\x15\x1c\x16\x39\x2f\x11\xf4\x78\xb1\x65\xa9\x11\xc2\xf1\xf0\x74\xd6\xfb\xde\x9f\x08\x29\xfc\xa8\x3a\x60\x09\xc5\x8c\xa0\xb0\x6f\x31\xc5\x94\xa0\xb0\xdf\xea\x30\xca\x8b\x2e\xe9\xf3\xdb\xf8\xef\xfe\x78\x1d\xda\xc3\x2f\x08\xd1\x7e\xfe\x72\x1f\xcb\x5d\xbf\x8c\x31\x77\x1e\x39\x4f\x5c\x4c\x97\x53\xc0\x16\xc7\x1c\x50\xdf\x2c\xeb\x9a\x29\xe3\x7a\x35\xc2\xce\xc3\x9e\x2f\x32\xcb\x63\x2d\x44\x49\x72\x06\xd1\xd1\x8e\x76\x74\xa0\xcf\xb3\x65\xd8\xb4\x68\x1b\x0f\xc1\xd0\xdc\x6a\xd1\x0a\x8b\xa1\x2f\xbf\x21\x46\xab\x10\x8a\xa2\x3f\x89\x45\x98\xdf\xaf\xf5\xf5\x65\x50\x34\xfc\x8f\xd1\xff\x12\xd4\x68\x6f\xec\xa7\xd7\xcf\x3c\xef\xcf\x45\x9f\xa1\x8a\xfd\xcb\x8f\x1f\xde\xff\xeb\xd5\x19\xf9\x72\x53\x27\x7a\xfd\xa3\x1b\x5f\xe0\xba\x0f\xef\x68\x3c\xef\x8a\x87\xc9\xc5\xf3\xea\xad\x2c\xd9\x89\x21\x99\x67\xc3\x63\x54\x38\xa3\x74\x6e\x99\x25\x9c\x91\x12\xea\x7a\x18\xf3\x1c\x74\x96\x6a\xd7\x0c\x50\x72\xa4\xb2\xbc\x9f\x0b\xa5\xa4\xca\x15\xb1\xa8\x95\xd8\x60\xd1\x53\x6c\x11\x69\x09\xb2\x10\x4f\x86\x60\xcb\x0e\x74\xd1\x40\x4b\x5f\xa9\x85\x18\x87\x21\x84\x85\x54\x55\x91\x69\x51\x97\x9a\xa5\x19\x46\xd0\x9f\x6a\x58\x94\x63\x61\xc2\x19\x25\xb6\x22\x68\xfd\x33\x51\x95\xe1\xcf\xe4\x52\xdb\x9a\xd6\x16\xe9\x0a\x57\xa6\x54\x0e\x3b\x8d\x50\x23\x89\x09\xb6\x02\x0c\x73\xb4\x89\xfe\x5e\x78\x27\x7f\x7b\xa3\xf8\x75\x0d\x2b\x5f\xea\xf7\xef\xb7\x20\xe3\xfd\xab\x0b\xf5\xe1\xa6\xd6\x7d\x35\x00\x36\xc8\xf6\x93\xb3\xb4\xff\xf0\xc3\x9d\x72\x67\xe8\xe2\x1c\xba\x22\xf7\x28\x29\x7d\x3b\xd4\xfa\xe4\x79\xac\x1e\x66\xc6\x4b\x20\x40\xee\xdb\xa4\x58\x8a\x78\xda\xb6\x82\x9b\x11\xb7\x71\x73\x6a\x65\x7b\xf2\x03\x0f\xd1\x20\x78\x88\xb6\xaa\x52\x06\x31\x39\xaa\x0a\x62\xa6\xf8\x92\xc7\x2e\x4b\x2d\xc4\xfd\xd2\x73\xbe\xfe\x63\x09\x21\x0c\xab\xe2\x9c\x13\xba\xbe\x49\x42\x20\x8d\xc2\x98\x8f\x02\x66\xde\x44\xff\xf8\xc2\x3d\xf4\xaf\x9f\xea\xbe\xdf\x04\xd9\xfe\xd0\xe2\x0b\xa5\xed\x9b\xe7\x5a\xf0\x6b\x4d\x58\x58\xb8\x7f\x56\x12\xb6\x8e\xa6\x5d\x6a\xf3\x22\xe6\x08\x02\xdc\xe3\x52\x13\xf9\x18\x49\x2d\x18\x1e\xc1\x54\x96\x16\x97\xa0\x7e\x18\x6a\x5b\x09\x01\x58\x8c\x11\x5c\x4e\x8a\xaf\x33\xc9\xb6\xd9\x65\x34\x26\x2e\x97\xf1\x60\x4a\x58\x6a\x0a\x2d\xc6\x54\x08\x4b\x18\x22\x27\x04\x21\xa1\xd6\x7a\xec\x1b\x06\x38\xb0\xe0\x88\x65\x2f\x11\xd1\x8b\x53\x54\x53\x8f\x28\x05\xfd\x63\x64\x82\x5d\x03\x03\x3f\xa2\x8d\xfe\xfe\x37\x35\x5e\xaf\x3c\x05\x9b\xce\xeb\xfb\x75\x50\xef\xff\x48\x8d\xd7\xa4\xb6\x15\x01\xe3\xe0\x20\x28\x00\x61\xd6\x2e\x0a\x1c\x39\xa5\xcc\xbb\x1d\x7d\x68\x42\xee\xab\xc2\x85\x28\x11\xa8\x00\x69\x55\x09\x25\x02\xd0\x2d\xcc\x3d\xd1\x98\xec\x4e\x14\xeb\x7e\x42\xb0\x15\x0e\xd1\xd2\x20\x8c\xd1\xbc\xcc\x1a\xa4\x45\x10\x79\xe5\xfe\x04\xd2\x62\x13\x79\x95\x2f\x44\x5e\xef\xe2\x28\xdc\x17\xbb\xe1\xcb\xd8\xd4\x83\x2f\x06\xeb\x6d\x8d\xf2\xdb\xfb\xaf\x02\xf3\x87\xbb\x57\xef\xaf\xc6\xea\x0f\x5f\x42\x96\x39\x1e\x76\xe2\xc1\xb9\xb6\x05\xa4\x76\xcd\x39\xda\x0d\x0f\x90\xee\x90\xa7\x90\x39\xc1\xb9\x52\xb5\xf2\xc8\x60\xc2\x00\x2c\xa7\x8e\x38\xc5\x41\x3e\x3e\x46\x2e\xf0\x7d\xb3\x80\x0e\xef\xba\xce\x07\xa1\x4a\xc1\x10\x93\x14\x31\x6c\x27\x20\x39\xf5\x27\xa6\x08\xa4\xa3\x84\x5a\x0d\xda\x05\x8d\xd5\xff\x4f\xb4\x36\x1b\xc0\x6c\x67\x80\x7c\xe0\xae\xeb\x00\xed\xcc\x70\xbe\x9e\x8c\x0f\x4d\x72\x3c\xe7\x3b\x76\x9e\x95\x28\xdb\x8a\x34\x59\x6d\x9b\x1d\x35\x5c\x72\x27\x3c\x15\xa6\xe0\xea\x49\x6b\x53\x84\x9f\xc0\x2e\x26\x84\x1f\x0c\xd5\xf4\x56\x6b\x73\x1a\xd9\x09\x14\x9b\xd6\x26\x41\x65\xd0\xda\xe4\xdb\x9a\x72\x17\x97\x21\x26\xc1\xa3\x7d\xf4\x97\xd1\x0f\x81\x29\x64\x5d\xd1\x6f\x94\x78\xff\x48\x21\xde\xfb\x77\x87\x67\xe5\xdd\xdd\x93\xfc\xd8\x0f\x5f\x7e\xfc\x04\x82\xf6\xee\x6d\x20\xe6\x30\x51\x8f\x16\x01\xe3\xc2\xd7\x18\x9e\xa8\xc2\xa5\x65\x65\x8d\xf0\xe0\xce\x45\x75\x2c\x4a\x30\x53\x2a\x31\x9b\x2c\x94\x2d\xcc\x74\xce\x1f\x23\x58\x96\xb1\x51\xed\x45\x77\xf7\xf4\x18\xf9\x5a\x01\x3c\x2a\xce\x38\x07\x85\x61\x80\x34\x7c\x99\x32\x1d\x23\xad\xa5\xb4\xe7\x93\xe4\x42\xa8\x03\x37\x24\xb3\x0d\x13\x0e\x71\xa9\x35\x92\xcc\xcf\x5a\x83\x8c\x60\xdf\x23\xc2\x28\x29\xda\x22\x2f\x69\xe1\x08\x44\xc6\x4a\x02\x2b\xac\x34\xb1\x98\x52\x8e\x91\xac\xba\x82\xaf\x53\x54\x26\xe2\x51\x56\xcc\x9a\x8c\x34\x9c\xcb\x28\xda\xc5\x3c\xf8\xbe\x32\x7a\x13\xfd\x78\x65\xab\xbf\xe2\xcc\x6f\x98\x09\x7e\x3f\xcc\x3c\xee\xc1\x29\x75\x29\x98\x97\x53\x06\xe0\xc8\x07\x3f\x18\x5f\x53\x60\x84\x87\x62\x8f\x1a\x66\x24\x2f\x94\xc2\xe7\x3c\x40\xe3\x43\x5c\x7b\xdf\x30\x21\x98\x45\x42\x1b\x23\x1d\x37\x22\x00\xcd\xc9\x05\x68\x5e\x19\x0f\x6d\x1b\x45\xbb\x04\x5d\xda\xf6\xfd\x65\x45\xd8\xda\x16\x68\x00\xff\x18\x04\x7c\x62\x81\xcb\x2c\xb0\x9e\x65\xa7\x86\xd5\xb3\xf4\x13\x05\x84\x78\xc3\x76\xdc\x10\xcd\x68\x21\x38\x3c\x77\x72\xb5\xdf\x83\xe8\xd9\xda\xae\x6e\x6b\x96\xb0\xdf\x68\x56\x90\xdb\x89\xe2\x9d\x08\x31\x7d\x11\x65\x01\x89\x14\xe6\xf0\xef\x9f\xd4\x28\xbe\x7b\x1d\xdf\x7d\x88\xfe\x7c\x1d\x53\xdf\xbd\xbd\xfb\x71\xcf\x6d\x5e\x80\x81\x21\x4d\x0a\x5f\x23\xa6\xaa\x99\x9d\x18\xc0\xb6\x6d\x54\x73\x10\x50\x29\x97\xcd\x92\x1a\x37\xd4\x1c\xb0\x73\xeb\xab\xd9\x02\x02\x46\x90\x9f\xf0\x32\xf4\x6e\x8e\xd2\x24\x0a\x7c\xc1\xe6\xc9\x8b\xfe\x8b\xa8\x88\xfe\x2a\x20\xef\xdf\x6e\x03\x35\x54\xd3\xdc\x6d\x22\xfd\x2f\xfd\xe9\xb7\xb7\x99\xed\xe7\xf3\x7d\x56\x65\xf9\x0c\x30\xf7\xc3\x3c\xf8\x99\x01\x59\x80\xd9\x67\x53\x60\x49\xac\x2a\x60\x2e\x27\xcb\xc9\x62\x25\x04\xe3\x98\xa9\x36\xd6\x16\x5b\x29\x84\xc4\x4c\x35\x07\x03\x8b\x62\x6e\x6c\x0b\x22\x7f\x6a\xec\x69\x34\xda\x97\xa6\x37\xeb\xce\x1b\x58\x71\xa5\x25\x33\x9c\x1f\x41\x04\x2b\x69\xb4\xe1\x5a\xf0\x71\x8b\x0b\x8c\x17\x7c\xd1\xed\xbc\xf4\x57\xa1\xce\xff\xed\xd3\xed\x44\xdf\xbe\x9d\xdf\x97\xa9\xdf\xa7\xae\x3c\xad\xf7\xd3\xcf\x47\x3f\x13\xa0\xcb\xf5\x7e\x8e\x21\x1d\xe6\x1c\x30\xeb\xc9\x7a\x3f\xb3\xc9\x4b\x2d\x04\xe7\x94\xab\x3e\x76\x36\x2f\x8c\x12\x42\x61\xae\xda\x83\x81\x64\xae\x6d\x0b\x52\x3f\x55\x06\x44\x93\xd6\xbe\xd4\x83\x59\x77\x5e\x43\x4a\xb9\xdc\x6e\x69\x00\x69\x49\xc9\xf5\x9e\x86\xed\x9e\xcc\x37\x9f\xd1\xbf\x78\x56\xaf\x02\xd7\x9b\xda\xff\xe2\x33\xba\xb9\xa7\xdd\xec\xf2\x1c\xa4\x80\x71\xdf\x3c\x46\x27\xdf\x53\xd0\x94\x71\xe4\x23\x3f\x83\xd1\x97\xb6\x6d\x41\x7f\x39\x59\x46\x4b\x8c\x10\x5c\x12\x2e\x87\xb8\xb6\x45\xe9\xb4\x50\x8a\x72\x35\xac\x0f\xaa\xbc\xdc\xd7\xdc\x7c\x7d\x5f\x06\xd6\x4c\x69\xc5\x8c\xe0\x13\x48\x21\x0b\xb7\x25\xd6\xdf\xa2\x38\xe4\xb6\xdb\x43\x11\xdd\x07\x7c\xed\x13\x4f\xf7\x53\xaa\xe8\xc7\x0f\x01\xaf\xb2\x79\x3f\xaf\xde\x81\x5f\xbd\xfd\xee\xf5\xbb\x6c\x27\xe3\x2e\x2d\x18\x63\xa8\x2c\x8e\x98\x66\x0c\x43\x94\xa1\x0a\xf9\x59\x82\x14\x4a\x2a\x21\x4a\x3b\x80\xb1\xc9\xd3\xe1\x50\x2c\x99\xa7\xa8\x70\x79\xe1\x6d\x66\x33\x31\x95\x95\xb7\xbe\x93\xa0\x00\x7d\xd5\x33\xc9\x47\x50\x2e\x90\x29\xd0\x82\xa3\x27\x5b\x3e\x25\x70\xad\xdc\xf6\xf3\x3f\x09\xc8\xae\x80\x3c\xbc\xf0\xa9\xec\xff\x4e\x83\x27\xee\xa7\x75\x6a\x30\x75\x95\xe5\xa0\x98\xe5\xec\xb3\x75\x4e\x98\xc1\xe0\xa1\xad\x6b\x10\xea\xb2\x5c\x55\x2d\x93\x5d\x47\x8f\x64\xab\x5b\xd6\xc5\x95\xcd\x4b\xa7\xa4\x94\x84\xe9\x6e\x5f\xfb\xb9\xb1\x27\x90\xc3\x22\xaf\x06\x33\x49\xab\x7c\x61\x3b\xbb\xee\xbc\x85\x8c\x5c\x5f\x88\x11\x64\x6b\x37\x6b\x63\xb8\xe1\x7c\x8a\xa2\x3d\x28\xe3\xe1\x30\x3d\x61\x68\x9e\x14\xd9\x7e\xc6\x7c\x53\xee\xdb\x9f\x48\x0d\x26\x5f\xc4\x06\x4c\x0f\xee\x7a\x76\x80\xe7\x2a\x8e\xfa\xbe\x5f\x7d\xec\x4d\x7f\x68\xa7\x1f\xf1\x9d\x0e\x5c\xa3\x7f\x1e\xa2\xf4\x37\xb8\xf4\x6b\xae\xe6\x85\x12\x63\x1b\xa8\x49\xfc\x09\x04\xe9\xe1\x09\x14\x8f\x51\x8c\x0d\x64\x9a\x7a\xc8\x90\x42\x6c\x97\xc6\x72\xb1\xd6\xd7\x76\x69\x62\x6a\x01\x8b\x15\x1c\x2d\x71\xb5\xad\x49\xbd\x69\x36\xe5\x51\xbe\xe3\xfb\xf1\x86\x59\x2c\xba\xad\x2a\x5b\xb7\xe4\x72\xdc\x71\xe3\x7b\xb3\x76\x00\x63\x53\xd8\xef\xc7\x9f\x2a\xde\xed\xbb\xa5\x5d\x7b\x1b\x0c\x0f\xf3\xe6\x5a\x85\xfe\x51\x87\xf9\x50\xfc\x11\xfd\xd3\xff\x84\x2a\x70\xf2\x69\x6c\xc1\xe9\x41\x5d\xcf\x0e\xc5\x99\xc5\xc5\x3c\xcf\x8b\x39\x9d\x4e\x9b\x4e\x4b\xf1\x48\xee\x48\x62\xbf\xd9\xd6\xfb\x57\xbf\x05\x37\x42\x28\x77\xa4\x3a\xe7\x55\xb5\xfa\x8c\x31\x06\xf5\x39\xbf\x9e\x79\x96\xd8\x87\x4e\xc8\x1d\xf1\x0c\xe4\xfe\x08\xf2\x85\x6c\xc7\x70\x0d\x60\x1f\xf1\x41\x25\xe5\xb7\xaf\xf1\xd4\xf6\xfb\xfd\xfd\xa7\xfb\x83\xaa\xce\xac\xaa\x80\xf6\x3a\x2e\x81\x3e\xb3\xeb\x99\xd7\x49\x79\xce\xa5\x4c\x8e\xde\x4c\xd3\xb4\x34\xd3\x34\x45\xd1\xff\x2f\x3a\xee\xd0\x1d\x3c\x90\x17\x3c\x6e\xd7\xc8\xd6\xa5\x56\xf9\x2b\x86\xd8\x6f\x7c\x76\x8c\x8f\x4b\xbe\xce\xf7\x65\xe5\x51\x38\x9c\xe2\xd3\x92\xae\x63\x1e\xd6\xbe\x0c\x87\x03\x59\xd6\x85\x82\x73\x3f\x70\xce\x01\xbe\xfd\x6d\x6d\x07\x18\xef\xca\xe4\xf8\x5f\xbe\x1d\xf3\x92\xad\x9f\xc0\xca\xc3\x70\x48\x8e\xbf\xd0\x8e\xdd\x8e\x04\x2e\x81\x2c\xb4\xe3\xcf\x9e\x34\x0d\x2f\x02\x56\x71\x12\xe0\x90\xdf\xed\xec\xa6\x0e\xae\xbc\x01\x56\x33\xcb\x94\x3f\x3a\xae\x8d\x39\x64\xab\x8f\x58\x9d\xb9\x9f\x7d\x8f\x01\x01\x11\x44\xbe\x3e\xd2\xf5\x49\xee\x92\x3a\xe4\xef\xbe\xf1\xdd\xaf\xb6\x6c\x67\xb8\xc2\x0e\xad\x37\x11\xca\x7c\x4c\x55\xa9\x16\x9c\x3a\x65\x45\x77\xfd\x66\x46\x7d\x35\xc8\x13\xc8\xfd\xc9\x8f\x0c\x40\x90\x6e\x1a\x77\x1b\x8f\x7b\xfa\x8b\xed\xfe\x9c\xb8\x44\x9f\x75\x15\xe3\xa5\x03\xa7\xd1\x58\x3d\xfa\xd6\xf6\xbd\x9e\x0f\xe9\x19\xdb\xb8\x3a\xd3\xc7\x68\xfd\xd6\x12\xa4\x74\xbb\x4e\x74\xb5\xed\xe4\xce\xfe\xfc\xbb\x5f\xdf\xca\x3d\x9c\x56\x0b\xbd\x0a\xdc\x97\xb6\xeb\xf5\x31\x6e\xba\xd6\xb8\x61\x67\xcf\xb3\x03\xc7\x85\x32\x3f\x57\xaa\x1d\x9b\xa3\x18\x87\x0d\x33\x32\x47\x5d\xc8\x9f\xfe\xbc\xcd\x17\xdb\x38\x40\x4f\x45\xdc\x2d\x78\xab\xe3\x71\x8e\x6b\xe6\x7c\xaf\xb5\x91\xee\x50\x9e\x4f\x16\x1c\x97\xa2\x1b\xe9\xd8\x13\xea\x4f\x95\x68\xc3\x1a\x2a\x1f\xe9\x5d\x77\xc0\x01\x73\xfd\xe3\xa5\xaa\x69\xe3\xb9\xbb\x4c\x5d\x1f\xff\xfa\xd3\xd5\x4a\xff\xcd\x8f\xff\x6a\xc3\xef\xbc\x02\xa1\x70\xed\xf5\x9b\x8f\x9f\xf6\x9f\xde\xbd\x79\xfd\xee\xcd\xc7\xf7\x01\x02\xf5\x31\x84\x6b\xef\x90\xd7\x01\x37\x84\x04\xca\x6c\x61\x3c\xa7\x9d\x0a\xe9\x68\x1b\x57\x0e\x9d\x8e\x0b\x1d\xc7\xe3\x11\xf4\x20\x3d\x93\x70\x38\x60\x0f\xe5\xb9\x9b\x52\x28\x71\x43\x28\x1b\x12\x24\xc1\xf0\xbb\x6a\x3f\xfc\x64\x60\xb1\xef\x9b\xf5\xc7\xcb\x40\x15\xd5\xf4\x7d\x98\x70\xf7\x31\xb9\xf0\xdc\xff\x93\x27\x0d\xab\xe7\x5a\x85\x67\x76\xe1\x1b\x69\x80\x2f\xd7\x0a\x91\x8f\xdf\xae\x66\x88\xab\x5d\xef\x35\x20\xbe\xb4\x02\x6b\x84\x46\x8f\x7a\x50\x30\x3f\x76\x55\xe7\x5b\x01\xf2\xd6\x0b\x90\x23\xaa\x39\x36\x3e\x05\xc4\xbb\xb8\xed\x7c\xd7\x34\x00\x77\xb6\x3d\x60\xeb\x96\xd9\xf7\xc6\x52\xc9\x6c\xcf\x6b\x03\x22\x4f\xc0\xbc\x9a\x36\xba\xb7\x52\x20\xe5\x00\x8a\xb3\x10\x71\xd6\xf3\xfa\xb3\xcd\x8b\xd1\x45\x57\xe0\x96\x21\xf9\x57\xab\x45\xbd\xb9\x80\xbf\x9f\xa5\x2e\xde\x68\x31\x02\xb2\x7a\x8b\xc9\x5c\x19\xeb\xf6\x05\xca\xe3\xe8\x61\xe2\xb4\xca\x0b\x90\xe7\xa5\x83\x39\x60\xde\x84\x32\xa8\x75\xb3\xe7\xde\x61\x5c\x1a\x2b\x68\x9c\x16\xa5\x1f\x13\x73\x56\x71\x7e\x21\x1e\xce\xfc\x7c\x50\x4c\x78\xe6\x9d\x1a\x0b\x82\x31\x82\x94\x19\xab\x8d\xb6\x96\xc4\x33\xc1\xbe\xf6\x33\x3b\x02\x09\xd2\xb8\xa5\xc8\x73\xb3\x64\xd6\xfa\x93\x31\x7e\xb6\x21\xf6\xe2\x42\x9e\x95\x46\xfb\x80\x08\x7f\xae\x5a\xba\x29\x66\xf9\x0a\x5b\xf0\xf6\x72\x0b\xbb\xce\x0b\x1b\x98\xb0\xd6\x6d\x07\x19\x43\xa4\x64\x10\x79\xe6\x9e\xda\x46\x17\xfb\x20\xef\xa2\xc7\x48\xfa\x5a\x02\xf9\xbb\x8e\xf3\xcc\x64\x3c\xa9\x63\x79\x92\xab\x33\x1b\xc6\x76\xf1\x47\xd5\x22\x7f\x43\x25\xf0\x9b\xb5\xc8\x5b\x55\xcb\xfb\xb8\x03\x47\x1b\x17\xcb\x64\x7d\x2e\xd6\x05\x7c\x0e\x8a\x52\xce\x67\xee\x31\x92\x21\x3c\x92\x14\xe7\xe9\xba\xb5\x72\xf4\x03\x07\x79\xac\x40\x7a\x62\x27\x7f\x3a\xa4\x4a\x59\xad\xeb\xd5\xff\xb6\x94\x32\xa6\xb6\x92\xe4\x56\xfc\xbc\x24\x39\xda\xc5\xd1\x45\x5b\xe7\x1f\x44\xff\xff\xe8\xbf\x8e\xfe\xc3\x37\x32\x27\xcf\x39\xe4\x90\x9a\x7b\x7f\xfd\xfd\x52\xda\xf7\xe9\x5d\xa8\x11\x7e\x99\xba\xba\x50\xd1\xc4\x0d\x98\x36\x8b\x06\x3d\xe4\x71\xee\x8b\x98\x8f\x6e\x1c\x41\xb6\x60\x90\x8f\x0b\xe9\xdc\x3c\x1f\x73\x3f\xfb\x06\x6a\xd5\x95\x7b\xe6\x69\x41\x15\xce\x6c\xa1\xba\x9a\xfb\x13\xf2\x42\x00\x81\xbc\xdd\x9f\xb4\xb6\xd2\x5a\xe9\xb9\x52\xb6\x36\xa6\xb6\x52\x5a\x07\x15\x41\x26\xcb\x1b\xaf\xac\x3f\x15\x19\x32\xa8\x65\x84\x81\xc2\xd7\xc6\x88\x39\xe8\xae\xb3\x30\xf6\xff\x70\x2d\xff\x85\x25\xf5\x45\x2d\xff\x57\xb6\x48\x1c\x74\xd3\xdc\xe9\x04\xe6\x75\xd6\x0e\xa3\x65\x29\x76\xcc\x17\xe1\xd7\xa5\x8a\xb9\x2f\x42\xec\x0a\x4c\x80\x9c\xc7\xeb\xd9\x01\x7b\xa9\xad\x0e\xba\xf7\xf6\xb6\xa8\xdf\x18\xe3\x85\x31\x66\x7d\x47\xe1\x45\x3b\xeb\xd7\xd1\xdf\x04\x6e\xc5\xff\x70\xa9\xe8\xff\xf8\xe6\xdd\xf7\xeb\x34\x73\x83\x63\x79\xf7\xe9\xe3\xe7\x2f\xef\xc0\xcd\xf9\xa7\x8f\xab\x7b\x7f\xf9\xd3\x10\x76\x7c\xfb\x15\x93\x48\xac\x27\xdb\x74\xe9\xd1\xcf\xa9\xe2\x9c\x31\x56\x11\x47\xda\x63\x96\x8e\x49\xcb\xba\xeb\xf9\x64\xd3\xb6\x4b\x8f\x3d\xab\xa5\x45\x76\x29\x9c\xbb\x06\x50\xd7\x29\xd2\xac\x9d\x4d\xb8\xe2\x44\x53\x45\xad\x81\xd4\xd7\x95\xd8\xce\x4c\xc3\xe9\xfa\xff\x95\xd0\xba\x3a\x5b\x21\x12\xe9\xfb\xda\xe7\x41\xcb\x56\x5c\x30\xbd\xe5\x4d\x8e\x6b\x53\x35\x7b\x12\x05\xbb\xd6\x97\x1c\x5e\xcc\xa2\x9f\x0e\xb7\x24\xed\xf7\x6f\xee\x3f\x5e\x00\xb8\xeb\xf1\x2e\x25\x47\x7f\x74\x18\x56\x08\x83\xd4\xc3\x0e\x14\xc4\x0f\x83\xeb\xfd\xc8\x41\xda\x7a\x0a\x22\x84\x95\xc0\xee\xe8\x4f\x30\x46\xa0\x3b\x8f\x6e\xc7\x9c\xcf\xd7\xee\xaf\x42\x88\xf1\xe9\xec\xa0\x4c\x99\x3d\x46\x9c\x43\x42\xac\xa3\x86\xf7\x7e\x06\x68\x54\x8a\x55\x96\x20\xc4\xf8\x9c\xa5\xf6\x77\x86\x07\xde\xf6\xc6\x39\x3f\x55\xd5\x96\xf7\x58\xd7\x08\x75\x90\xd1\xeb\x0b\x63\xca\xdf\x44\x7f\x1b\xb2\x76\x5b\x9d\xe2\xf3\x53\xfb\xee\xfa\xd9\xf7\x37\x9f\x7d\x78\x7b\x95\xca\xbf\xe5\x7e\xf9\xfc\xe9\xe3\xdd\x33\x72\xe8\xcb\xe7\x2f\xf7\x87\x68\x53\x92\xa8\x35\x85\x52\xb8\x34\xd3\x82\x73\x4e\x8d\xac\x75\x4c\x34\x47\x52\xd6\xa9\xd3\x5c\x2a\x62\xa4\x55\xb5\xcc\x85\xe0\x4b\xa3\x72\x26\xc8\xce\xb9\x33\x73\x1a\xd0\xb4\xca\xe2\x2c\x55\x2d\x93\x99\x62\x2c\x2f\x53\xaf\xa0\xef\x06\x0a\x2c\xf7\xc3\x41\x3a\x84\xa8\x60\x04\x32\xa1\x04\x55\x4c\x70\x10\x01\x54\xaf\x1f\x52\x58\x0a\x2d\x35\xd3\x42\x30\x90\x36\xb9\xd3\x48\x8b\xc2\x6a\xa4\x7d\xe4\xdb\xb6\x05\xc4\x6b\xca\x6a\x5f\xf6\x85\x2d\x88\xea\x26\x7f\xcc\x4c\x01\xf8\x66\x0b\xa1\x0b\xbe\xfc\xbf\x8d\xfe\x4d\xf4\xef\xa3\xff\xf8\x22\x1f\xfe\x44\x89\xf2\xf6\xee\xc7\xe4\xee\x2b\x3e\xbd\xc0\x00\xf4\xe1\x70\x13\xad\xbb\x7f\x75\xf7\xe1\x87\xbb\x40\xc4\x9e\x84\x64\xf7\xe1\xee\xfe\xd3\x2e\xb7\x45\x09\x46\x84\x00\x5f\xea\x52\xe1\xd1\x69\x2a\x69\xa7\x7a\xa6\x0a\xad\x88\x2a\xb5\x80\x30\xf5\xb3\x37\x18\x54\x20\x2b\x8f\xab\xcb\x0d\x4f\x05\x74\x33\x07\x69\xe5\x7b\xc8\x00\x85\xa0\xa1\xd0\x73\xc4\x40\x8e\x32\x5f\xc5\x51\x56\x02\x79\xd0\x25\x84\x8a\x60\x0f\x11\x57\xc2\x0a\x82\xbd\xb3\xa6\x02\x16\x29\x53\xd7\x59\x95\x73\x86\xca\x51\x1a\x35\xb2\x46\x1a\x5e\x95\x85\xa2\x86\x1a\x20\x0b\xd3\x76\x04\x21\xaf\x18\x63\xac\x89\xee\xe2\xfc\x92\xab\xfe\xd3\x0b\x9b\xe3\x95\xd3\xeb\xed\x26\x81\xbd\x7b\x96\xc0\xbe\xff\xfd\x12\xd8\x4f\x65\x8f\xbb\xc6\x95\x00\x01\xc2\x7c\xe3\xdb\xc7\xc8\x77\x0c\x0c\x03\x2e\x01\xc5\x04\xa4\x0f\x5d\xcc\x39\x59\x04\xe0\x65\x39\x27\xf9\xf9\x78\xdd\x1a\x19\xd4\x7d\x57\xdf\x29\x1a\xe5\x70\x3a\x68\x58\xb6\xdc\xc9\xe3\xa0\x9f\x54\xb0\x9b\x84\x12\xac\x11\x5c\x6a\xe6\x3b\xee\x1b\xe1\x4f\x2f\x54\xb0\xb7\xd8\x39\xbb\x6b\x0e\xf4\x46\xd5\xf3\xdf\x45\xff\x63\x60\x11\x7c\xa9\x39\x79\xc5\x72\x5c\x74\x1f\x3f\x5d\xec\xa6\xbb\x27\x3e\x58\xf0\xb3\x4a\xcf\x1f\x3f\x84\x64\x60\xd2\x11\x90\x02\x4a\x33\x57\x10\xe4\x99\xb7\x8a\x71\xd9\x56\xbe\x05\x5d\x99\xfb\x75\x7e\xb5\xbb\xd1\x2b\x40\x17\x8b\x12\xe8\x6b\x33\x52\xad\xfc\xd0\x6e\x63\xb1\x75\xed\x52\xc6\x14\x96\x5e\x82\x76\x99\xe3\x4c\x8b\x32\x43\x12\x55\xb0\xc4\x02\x58\x82\xa5\x74\x16\x41\x30\x28\x6b\x95\x87\xc2\x3a\xea\x30\xf7\xd3\xae\x57\x6a\xb5\xb4\x9a\xa6\x59\x18\xc4\x27\x1d\xed\xe2\xfe\x91\x06\x8c\xfe\x5f\x3f\x71\xfa\x7e\xdc\x6a\x33\xde\xbc\x0b\xa6\xdf\xa6\x64\x70\x9d\xbe\x9e\xe8\x6f\x2e\xc2\x87\x1f\x7f\xfc\xf0\x6e\x5d\x44\xbe\xdc\xff\xea\x85\x57\x4e\x9c\x71\x80\x0f\x79\x71\xf2\x19\xe8\x3d\x4a\xe3\xd2\x97\x0e\x30\xec\x4d\xab\xbc\x64\x40\x51\x4f\xc1\x94\x79\x0e\x2a\x8f\x8f\x10\xd5\x80\xaf\x03\xd3\x13\x14\x63\x47\xa8\x66\xe7\x23\xc7\x1a\x89\x83\xf6\x02\x38\x2f\x0c\xe7\x46\x99\x14\x21\x33\x51\xc7\x01\xf2\x47\x6d\x74\x67\x94\x51\x46\x30\xe3\xdb\x8e\xc5\x18\x59\x41\xa4\x14\x9a\x28\xb1\xbd\x97\x24\xdc\x9b\xba\x64\xe4\xfe\xed\xcd\xbd\xdd\x1f\xae\x52\xb7\x4f\x33\x73\xf2\xee\x99\xda\xe7\x02\xae\xbf\xdc\xdc\xe7\xaf\xef\x2e\x5f\xef\xce\x3d\x46\x25\x04\x74\x99\xd6\xb5\x3f\xcd\x62\xe1\x0b\x03\x38\xf5\xa2\xce\x6b\xcf\x39\x20\x6e\x35\x09\xf2\xd4\x17\x60\x5a\x46\x80\x4a\x38\x81\x0a\x83\x0c\x16\x9e\x96\xb1\x71\x98\x18\x7a\xb6\x9b\x10\x9d\x0a\x15\x1c\xd6\x0a\x66\xb5\xc1\xd8\x0e\xcc\x29\x40\xfc\xdc\x58\xdd\x58\x8c\x8d\xb6\x9c\x5b\xdf\x70\xce\x62\x08\x9d\xa0\x52\x08\x49\xa5\xdc\xec\x33\x72\xd7\x1e\x64\xf4\xa7\x17\xfc\xd7\x66\x9d\xfd\xf7\x61\xe5\x7f\xb7\xa1\x8d\x5e\xdd\xbf\xbf\x39\xbf\xcd\xe0\x27\x5b\xdc\x32\xcc\x43\x1b\x1f\xd9\x85\x95\xec\x6d\xb4\xff\xf0\x57\x20\xae\xe3\xd2\x75\x23\x99\x67\x2f\x63\x1d\x97\xae\x6a\xc8\xd0\x7b\xe9\x4b\x52\x9a\x92\x24\x29\x2d\x6d\x41\x73\x56\xcc\xeb\x8d\xeb\xd9\x1f\xbd\xa5\x60\x00\x8c\x3f\x46\x5e\x51\xe0\x40\xcd\x7d\xeb\x73\x1a\xa7\x71\xca\xbd\x5d\x4a\x02\x6a\xd0\x1f\xe4\x42\x1d\xc3\x06\x71\x10\xd9\x85\x5a\xb2\xf6\x01\x88\x20\x13\xa5\xa0\xdb\xde\x33\x52\x28\xec\x68\x5b\x0b\xa3\x98\x68\xb8\x12\x85\x98\x94\xd6\x68\x35\x56\x0d\xe9\x82\xdd\x83\xc3\x9a\xfb\x4d\x5e\xde\x5f\xae\xb7\xfe\x03\xbc\xbc\xb1\xdd\xa7\x5e\x00\xfa\xa0\x01\xf5\x32\x1e\x1b\xdf\x36\x0d\x20\x8d\x6b\xcf\x6c\x97\x3d\xcc\x76\x9f\x2f\x03\xd3\x0c\x17\x8c\xe3\xa5\x19\x8d\x6e\x64\x93\x58\xc7\x0d\xb7\x7f\x0c\x31\xef\xa4\x9e\x88\x79\xaf\x5c\xe9\xa1\x26\x79\x7f\x73\x1f\xef\xa3\xdf\x86\xf9\x27\x7a\xce\xdb\x04\x87\xeb\x33\xf8\x2a\x06\x71\xa9\x4c\xf9\x2a\xbb\x1a\x53\x0a\x35\x24\xc0\xd5\x84\x54\x67\x17\x17\xcc\x17\xc3\x00\xf8\xb8\xf4\xdb\xa1\x25\x50\x43\x2c\x76\xf9\xc3\x31\xa9\xaa\x2b\x8d\xec\x41\x71\x8d\xa4\x84\xc8\xca\x45\xc5\xc6\xae\x5e\xc4\xb6\x8b\x1d\x93\x48\xf0\x33\xd6\x6c\x19\xb8\x88\x91\x6f\xdb\xd5\xa6\x6b\x43\xfc\x42\x5e\xe6\xfb\x7f\x19\x46\xde\x45\xd6\xfa\xb9\x16\xff\xd5\xfa\x9a\x65\x37\x38\xe1\x0b\x87\xe8\x67\xf0\x7b\x70\x01\xbb\x56\x55\x1d\x40\xbe\x8f\x87\x0d\xc5\x06\xc6\xa5\x28\x60\x62\x84\x23\x32\x97\x14\xa1\xf4\xdc\x50\xcc\xb5\x94\x53\xbc\xba\x60\x05\xe6\xa4\x70\x05\xa2\x30\x77\x39\x6c\x1c\x61\x56\x1c\xa4\x46\x79\x63\xda\xd6\xd4\xf6\x7c\x22\x64\xa9\xa6\xdc\xe5\x1a\x54\x1c\x6a\xd9\xc6\xa7\xe2\xc1\x29\x8b\x9d\xca\x6c\x83\x5a\x97\x35\x0d\xec\xeb\x1c\x9e\x6a\xda\x45\x7f\x12\x9f\xc2\x9a\x4e\xbf\x8a\x0f\xfd\xb3\x4d\x77\xfc\xb6\x52\xea\x67\xf9\xd4\xc3\xdd\xdb\xbf\x04\x1f\xef\x7e\xb8\xa2\xfa\xdf\x85\xe4\x6a\x22\x93\xe6\x4c\x5d\xac\x17\xbd\x6e\xa7\x90\x4e\x5d\x9d\xde\xd6\x36\x67\xb2\x2b\xe4\xa8\x4b\xc7\x4b\xdf\x4c\x93\x9f\xf9\xa9\xb5\x4a\x81\x52\xb8\x46\x1e\xe8\x32\x02\x22\x7c\xcf\x7d\xef\x79\x60\xd1\xac\xbd\x92\x8d\x2e\xb2\xcc\x65\x92\x41\x5b\x20\xde\x28\xca\x64\xf0\x83\xf9\x23\x0a\x75\x24\x6b\x6b\xff\x69\xf4\x6f\x03\x47\xfd\xa5\xb6\xf5\xc2\x0f\xfa\xe5\x7e\x83\x47\xbd\xfb\x0a\x0d\x74\x85\x8e\x5f\x8d\x97\xad\xd0\x63\xb3\x4d\x9e\x10\x78\xbf\x8a\x27\x20\xca\xbc\x29\xca\x18\x8e\x5d\x25\x9b\x11\x7a\x8c\xab\x93\x18\xcc\xe8\x92\xec\x3c\xc7\x84\x1b\x4e\x99\x10\x95\xc6\x42\x09\xc1\xb4\x62\x8f\xd1\x6a\xbf\x0c\xcc\x8c\x20\x22\xbe\x3f\x1d\x7d\x8f\x41\xd6\x49\xda\x72\x00\x01\x31\xc4\xf3\xb4\x90\xfb\x81\xb1\x92\xe0\xa5\x54\x4e\x75\x06\x17\x4d\x2d\x8c\xb1\xa0\xcd\xa8\x40\x48\x52\xcc\xa1\x2c\x08\x82\x0c\x61\xb4\x98\x02\x21\x5d\x0b\x06\x1d\x56\x1a\xd9\x92\x12\x2e\x45\x35\x33\x9d\xe6\x22\x7a\x8a\x6b\x54\xa1\x1f\xfe\x71\xf4\x37\xd1\x7f\x8a\xfe\xf3\x4d\x1d\xe5\xf7\x41\x65\x2d\xac\x65\xd1\x9f\x83\x97\x32\x5c\x1b\x49\xdd\xfb\xcb\x47\x57\x9e\xe3\x0f\xaf\x7f\xf6\x37\x3f\x3e\xfd\xd1\x0b\x08\xb6\x8c\x71\x00\xd6\xe5\x0a\x9c\x98\x67\x95\xf6\x29\x06\x04\x14\x4b\xc7\x38\x27\x48\x6c\x78\x22\xa6\x05\x61\xa2\x4a\x4a\xc1\x30\x14\x10\x39\x5a\x49\x46\x08\xab\x14\x0f\x1f\x10\x82\x29\xc1\x9c\x62\x4c\x29\x5d\x22\xc6\x70\x29\x4a\x8c\x31\xc3\x28\xfc\x1d\x21\xfb\xae\xeb\xac\xaf\xbb\xca\xa3\xa1\xea\x81\xf1\x50\x39\x0a\x5a\x30\x03\x46\x21\xa6\x8c\x32\x8a\x90\x5a\x4d\x1d\x89\x38\xd7\x10\x53\x42\x09\x91\x4a\x4b\x24\x21\xe3\xde\x62\xca\x38\xe3\x0c\x93\xad\x6b\x21\x25\x08\x43\x44\x19\xa3\x14\x22\x89\x90\x42\x12\x72\x54\x6e\x1a\xd8\x24\x60\x40\xbe\x8b\xf2\x67\xd6\x8d\x2d\x9e\xf2\xee\x89\xdb\xfa\xdd\x3a\x40\x7e\xf5\xf6\xea\x60\xbe\x79\x77\x25\x51\xbc\x38\x67\x75\x1c\xd1\x0a\x97\xe0\xd4\x96\x25\x20\x3f\xf5\x00\x17\xb0\x4e\x32\x94\x2f\x73\x99\xfb\x76\x97\x79\x1c\xd3\xa5\x71\x4b\x13\x53\x4f\x9e\x9d\xb2\x49\x41\xca\x2c\x27\xd6\x32\x5a\xaf\xb7\xf5\x18\x2d\x52\xda\x61\xb0\x12\x18\xe5\x37\x9d\xfd\xbb\xb8\x7e\xb4\x77\xee\x80\xbe\x8a\xe6\x3e\x57\x49\x3c\xd5\xfc\x6f\xa5\x17\xef\xaf\x25\x18\xf6\xa1\xde\xf1\x87\x0c\x88\xb8\x5f\x90\x5b\x4d\x8d\x80\x2b\x36\x4a\x01\x7d\x39\x39\x20\xf7\x93\x71\x87\xda\x9f\x7c\x69\x3a\x4f\x97\x4a\x03\xae\xc3\x7e\xe3\x7d\xaa\x1f\xc9\x1d\x4f\xf4\x05\x2f\xbc\x55\x88\x3d\x97\xeb\x7f\x83\x0d\x39\xc7\x49\xfa\x3b\x92\x44\x79\xb6\xb8\x7d\xff\x13\x0a\x9b\x73\x0f\x8d\x0b\xd8\x90\x44\x4b\x63\x8a\xc2\xcf\x92\x48\xea\x35\x84\x40\x8f\x2c\xba\x4b\xd0\xa5\x46\xec\xbf\x04\x7f\xa5\x02\xae\x06\xb5\x67\x21\xa6\x3c\x3e\xd4\x60\xf4\x15\xe0\x5e\x14\x1b\xb9\xfb\x85\x67\x73\xdd\x2a\x6e\xfc\x48\x66\x30\x0d\x03\xee\xfb\x5f\xe2\xaf\x94\x9c\xb8\x92\x42\x6a\x19\xba\xe8\x91\x6f\xb1\xa3\xb5\xad\xbf\x7d\x8a\x1b\x6d\xa4\xd1\x1f\x2f\x38\x8e\x8f\x9b\xe3\x7b\x01\x0c\xad\x1d\xf6\xee\xd5\xc7\xb7\xbf\x7a\xfb\x44\x05\x70\xad\x1e\x7a\x73\xf7\xcf\x3f\xec\x0d\xca\x81\x3b\x57\x95\x9b\x5c\xd3\x2c\x73\xd5\xa9\x0a\xb4\x79\x01\xe0\x34\xcd\x0c\x5b\x48\x97\xd6\x60\x62\x58\x0c\x71\x6e\x73\x44\x91\x2b\x0e\x9a\x32\xeb\x87\x71\x1c\x47\xeb\x21\x18\xe4\x22\x7d\xab\x41\x11\xab\x58\xaf\xb3\x8d\x6f\x87\xe1\x84\x41\x34\xe4\xa5\x3f\x76\x64\x6a\x87\xa1\x9c\xfa\xbc\x9f\xf2\xb9\x8d\xfe\x24\x29\x43\x2d\x0f\x7a\xe2\x8a\xdc\x6c\xac\x2b\x96\xe6\xdd\x66\x5b\xbd\xb4\xaa\xf6\x37\x1e\xef\xfe\xed\xb3\xb0\xe7\xd5\xd9\x49\x60\x9c\x39\x6f\x62\x1c\x47\xce\x3b\x1f\x19\x4e\xa9\x8e\xa5\x66\x84\x2a\x7f\xca\x9d\x22\x7d\x5c\xe7\x4e\x92\xde\x8f\x75\x01\x1a\xbb\x28\x07\xd8\x93\xf6\xe7\x01\x2d\x69\x2c\xec\xba\x83\x88\x08\x8c\x64\xd8\x6b\xed\x88\x11\x32\xec\x4f\x90\x9d\x1b\xce\x13\xea\x87\xda\x97\xf5\x86\x33\xa1\x4f\xdc\x18\xeb\x5a\xfd\xdf\x45\xff\x43\xf4\x3f\x3f\x71\x09\x5c\x54\x47\x9f\x34\x9f\xbe\x2e\x3f\xfb\xb2\xae\x60\x17\xcc\xc9\x35\x0c\xb6\x7a\x41\xbf\xf9\xf1\xd3\x2d\x9f\xec\x8e\xd6\x05\x8c\xf5\x83\x03\x18\x8e\x09\x3a\xf7\xa0\x20\x44\x3a\xa6\xb2\x1c\x30\x48\x29\xe6\x84\xe8\x1a\x19\x8e\x10\xb5\xa8\x60\x8a\x18\x22\x4f\x15\x12\x23\xce\x4c\x8e\x91\x9f\x46\x31\x68\x2c\x8d\xde\x91\xf0\xff\x0e\xa6\x20\xf8\x9c\x27\x47\x76\xa6\x71\xff\x18\x71\x8a\xab\xae\x84\xa5\xd4\x0c\x22\x81\x11\x83\x26\x47\x65\xc1\x29\xa2\x8b\x95\x86\x68\x99\x7a\x55\xe4\xc8\x96\x3d\x84\x98\x82\x8a\x9c\x6a\xd6\x8e\xed\x48\x86\xa0\x91\xff\xa7\xf1\x95\xa3\xf8\x6b\x44\xf5\x35\x66\xfc\x84\x2f\x7a\x69\x3f\xee\x7f\x1f\xd6\xe8\x2b\xd4\x57\x5c\x03\xe3\xea\x2d\x7b\x40\x1e\x56\x47\x4e\xc5\x7d\xbd\xd9\x8f\xb5\x6b\xce\xfd\xe5\x84\xb9\x85\x3a\x17\x37\x0b\x5d\xb7\x0d\x49\x64\xe5\x6a\x1b\xac\x67\xa7\x0d\x49\x54\xad\xe7\xd2\xbb\xa5\x60\x2c\x9e\x4e\xc2\xbb\x6d\x8d\x17\x97\x58\xf7\x75\x4c\xa2\xdf\xcf\x5f\xfa\xfa\xf9\x89\x3e\x45\xf5\x03\x56\xf5\x12\xbd\xff\x74\x97\x12\x5f\x2e\x1c\xc6\x10\xcc\x96\x69\x63\xbc\x0e\x35\xe4\xbe\xe3\x48\x23\x36\x20\x6a\x6a\x6e\xb2\x3c\x91\x3e\x8d\xd1\xd2\x03\xe6\xdc\xb9\x70\x20\xd4\x50\x1e\x94\x11\x99\x95\xf0\xe8\x68\xa3\xb4\x2b\x9d\x4e\xb9\x22\x92\xfb\x8c\x11\xe6\x7a\x54\x96\xb6\xb7\x5e\x83\x72\x39\x51\xd0\xfa\x11\x68\xdb\x47\x87\x38\xbf\xac\xcd\xdf\xe2\x33\x3f\xdc\xf0\x99\x07\x2f\x3a\x79\xc9\x67\x7e\x7f\xfb\xdf\x37\xf9\xcc\x93\xd6\xd0\x9a\x23\x8b\x10\x30\x9e\x00\x6a\xcc\x63\x54\x1f\xd9\x54\xbb\xce\xd9\x4e\x4c\x6e\x00\x59\x98\xeb\x66\x90\xf9\x16\x50\xcc\xc0\xb1\xeb\x5c\xbb\xcc\x9d\x6b\x0f\x5a\x6a\xa5\x90\xa0\xd6\xfa\xc1\xfa\xf1\x28\x2a\x03\x52\x9f\xc7\x64\xe9\x40\x73\x34\xda\xce\xd6\xd9\xca\x5a\x4b\xa9\xc7\xd6\xda\xaa\xaa\x2a\x3f\xb8\x8d\xb6\x34\xba\x8b\x59\xa8\x6b\x92\x37\xe3\x6b\x63\xc3\x7e\x9a\xa3\x5f\x85\x48\xf9\xab\x2d\x50\xff\xeb\x78\x4b\xa5\x06\x28\xe8\x33\xf8\xf3\x73\xdc\x83\x63\x15\xe7\xcb\x11\x74\xfa\x21\xd2\xa0\xf2\x79\xd2\x2c\x30\x1e\x6e\xb6\xe8\x34\xa2\xe3\xec\x6b\xd1\xfa\x99\xcd\xfb\x59\x6b\x2b\xcf\xc4\xda\xa4\x95\xde\x4a\xa9\x85\xf0\x0d\xf7\x2d\xe7\x2d\x95\xc6\x10\xc9\x0c\x0b\xf1\xf0\x7d\xf0\x37\x78\xd0\x77\xfd\x75\xf4\x57\x21\x57\xf5\x75\xef\x5f\xf9\x10\x3e\xae\xf3\xf1\x9b\x8f\xe0\xfe\x53\x08\x79\xbf\xcb\xee\x3e\x7c\x5e\x07\xff\xf7\x7f\x03\x5e\x85\x76\x33\x86\x5a\x01\x2b\x4c\x42\x5f\x46\x4b\x6a\x41\xe6\xfb\x09\x12\xd0\x49\xe9\x6d\x2c\x24\xc1\xd2\x32\xa1\xc1\xa9\x24\x41\x3c\xc1\x1d\x94\x75\xce\x22\x23\x6c\xf5\xd0\x98\xdd\x58\x59\x29\xbc\xab\x16\x6a\x31\x01\xa9\x1f\x3a\x6d\xa7\xa9\x04\xe9\x79\x30\xd1\x3e\xe1\x91\x0b\x78\x80\xb5\x37\x37\x5d\x82\x08\x5c\x94\x22\xaf\xd9\xa9\xa7\xf7\xf4\xe3\xa7\x77\xe0\xd3\x6d\xe5\xd7\xab\xf7\x9f\xde\xbd\xf9\x7e\x6d\xfe\x7d\xc2\x8f\x10\x6b\x4e\x40\xc4\x90\x29\x51\xef\x2b\x80\xce\x38\xb4\x7a\x14\x02\xd8\x1a\x63\x99\x29\xc9\x33\x1d\x57\x35\x5c\xc6\xb8\x5a\xf8\x5e\x31\x46\x95\x91\x86\x08\x62\x9a\x33\x4b\xea\xa6\x69\x16\x2c\x31\x76\xa3\xa2\xc2\x79\x35\x3b\x59\xfa\x54\x47\xfb\x44\x5e\xe2\xbf\xeb\x33\xff\xa7\x21\x02\x7c\xc3\x6b\xf8\x35\xcb\xc4\x8f\x1f\x40\xf0\x15\x2e\x8d\xdd\xc4\xa2\x42\xaf\x86\xd1\xb0\x33\x02\x0f\x14\x1a\x88\x4e\xbe\x06\x45\x80\x9f\x21\x5f\x81\x1c\x11\xc0\xa8\xd7\xb1\x33\x84\xb0\xdc\x71\x9e\xdb\x38\x2b\xf9\xc6\xda\x7a\xe9\x57\x2d\x6d\xf5\x50\x4a\xb9\x76\xac\x16\xde\x54\xd5\xb9\xa9\x30\x39\x3d\x46\x8d\xd0\xfd\x50\x9e\xce\x6d\x15\xed\x03\x96\xa9\x0a\x3a\xc7\xf7\xc1\x73\xfb\x6f\x5e\xaa\x95\x3c\xb7\xf7\xf3\xa5\xc1\xdf\xdf\xfd\x52\x8b\x0b\xb1\xf6\x2c\x5c\x5f\xba\x72\x75\x9d\xdd\xf9\xe8\x80\x48\x3d\x03\x04\x52\x20\x53\xe9\x61\x92\xb7\x84\xa8\xa2\x91\xa6\xe8\x62\x5e\xda\x2d\x66\x77\x50\xa6\x72\x0e\x99\xa7\x56\x13\x16\x9a\xcd\xc8\x73\xbb\xb5\x6a\x9f\xda\x2d\x9e\xfa\xb9\x08\x16\xc5\xbf\xf8\xd9\xd8\x7d\xd9\xcf\xbf\xd8\xec\xe4\xc4\x49\xcf\x61\x8d\x08\x50\x1e\x03\xe9\xce\xce\x01\xed\x11\x30\x88\x02\x9e\x1a\x1f\x25\x62\x24\xc4\x16\xbd\x74\xe5\x18\x5b\x58\x9f\x5d\x22\xce\xee\x20\xb4\x73\x16\x6b\xf1\xdc\xd5\x8a\x7b\x77\xdb\x66\xa9\xae\x7d\x7d\x17\xdb\xc0\x3f\x81\x6e\x2c\xd3\x7f\xbe\x65\xd0\x7e\x29\x46\xf1\xe5\xed\x5d\x30\xaf\x9f\x11\x83\x3f\x7e\xd8\x02\xc2\xab\xdb\x11\xf7\xbb\x21\x2c\x31\x0d\x40\xde\xc6\x75\xe5\xbb\xba\x06\xb8\x72\xf5\xc3\x04\x3a\x5c\xc1\xd8\x1d\xa9\x1e\x8e\x6a\x1e\x47\xcf\x08\x40\xfd\x50\x2b\xee\xab\x38\x27\x58\x5b\xcd\x0e\xc8\xd6\xcb\x31\xce\x37\x6f\xf2\xb4\xfe\x2c\xa3\xce\x85\x1d\x35\xe1\x5a\x52\x0d\x6d\xc6\x28\x54\x5a\xd1\x02\xd2\x7e\xf3\xa9\xcc\x25\x7f\xf3\x67\xd1\xbb\x4b\x8e\x23\x02\x1f\xaf\x91\xa5\xb5\xbf\xdf\xbf\x28\x10\xbc\x66\xca\xf6\xbf\x8f\x89\x6f\x57\x3a\x57\xf7\x70\xea\xbc\x06\x1a\xe4\xae\x71\xac\x9b\xa0\xa6\x30\xb5\x05\xab\x46\x09\x06\xc6\x99\x2e\x2a\x5a\x2e\xc8\xb9\xd5\x40\x5f\xb7\x83\x5a\xd0\xea\x0f\x50\xa1\xac\x69\x31\x55\x1c\x37\x45\x4e\x6a\x3c\x32\xc2\x4e\x67\x4d\x59\x69\x4a\x62\x7d\xb5\x2b\xfd\x64\x3d\x33\x17\x3d\xf4\x6d\xcd\x7c\x1d\x32\xdd\x11\xf8\x46\xc6\x32\x79\xc9\x2a\xfb\xe9\xa2\x62\xf6\xc3\xeb\x90\x35\x8b\x2d\xc8\x2b\xc0\x2b\x50\xfa\xb1\xf2\x55\xe5\x8f\x39\xe8\x11\xac\x02\x21\x55\x41\x45\x52\x54\x8b\xa9\xc4\xea\xb6\x37\xde\x81\x40\xb8\xb1\xaf\x56\xb3\xd3\xcd\xf3\xf1\xe8\x2b\x26\x4a\x4a\x9c\x96\x4b\x29\x44\x0c\x39\x95\x23\x88\x16\xb8\x71\x3e\xef\x82\xde\xb5\x3c\xe0\x0b\x7e\xe0\x12\x65\xf8\x39\x93\xce\xb3\x51\x76\x89\xa1\x3c\x05\x22\xc2\xad\x24\x79\x32\x2d\xa2\x84\x89\xd0\x3d\x24\xa5\x2a\x45\x5e\x7a\x9d\x15\x95\x11\xca\x12\x21\x5b\xec\x47\xa6\xe4\x49\xd7\x4f\xb6\x47\xef\xe2\xe6\xdc\x1e\xf0\xc2\x08\x5e\xb0\x3f\x65\x2e\xe3\x06\xb4\x08\x51\x2e\x05\xe6\x54\x9a\x8a\x51\x65\x5b\xe0\xb4\x57\xfa\x7c\x3a\xda\xd0\x5e\x16\x74\xd2\x55\xb0\x88\xef\x37\x2f\x24\xf9\x98\xad\xa6\xfd\x77\xaf\x9f\x69\x93\xe2\xe4\x8a\xad\x08\x22\x4e\x61\x55\x0f\x54\xb4\x7f\xfd\xe5\xd5\xc7\x57\x5f\x62\x19\x9f\xb2\x2a\x05\xc6\xeb\x82\x42\x98\xe7\xa9\x2b\x38\x95\x43\xb9\x44\x3b\x16\x74\xe6\xcf\x41\xc5\x1f\xe4\xae\xef\x41\x96\x7b\xe7\x31\xc2\xc8\xd9\x9d\x01\xb3\x3f\x8e\xd6\xe7\xbe\x6f\x8d\x29\xfc\x54\xc5\x45\x6c\x2e\xac\x29\xb9\xf5\xd8\xcf\xd6\x1b\x6c\x04\x71\x59\x12\x2d\x79\xb1\x8e\xdf\xe9\x91\xdd\xd5\x4f\x78\xb5\xdf\x5c\xf3\xa3\x37\x9c\x4f\xfb\x57\xdf\xbf\xfd\x06\xe9\xd3\x33\x92\x3c\x9e\x42\xb5\x6f\x7c\x5a\xd2\x20\xd2\xd1\xf2\xf6\x31\xca\x53\x68\x69\x6e\x4a\x33\x58\xe6\xfa\x33\x71\x80\xfb\xaa\xad\xca\x79\x7a\x49\xfc\x24\x88\x6f\xcb\x34\x65\x3d\x7a\x8c\x14\x11\xf1\x7c\x42\xed\x64\xbc\x82\x68\x63\x7e\x5a\xdb\x58\x3e\x8d\xd3\xb7\x57\x34\xd2\xed\x58\xbd\xb2\xcf\x06\x8c\xd7\xd7\xf9\x4f\x09\x52\x07\xea\x0d\x0e\x87\x7f\x72\x80\xfa\x13\x08\xc0\x9e\x78\x76\x4b\xe6\x9e\xca\x6c\xf6\x26\xb0\x9e\xfb\xd3\x15\x22\xb0\x1c\xcf\xc2\x98\xc4\xf9\xb6\xf1\x79\x73\x79\xbe\xe4\x8e\x05\x7d\xae\x4d\xdf\xf8\x6b\x16\x83\xcd\x5f\x7b\x91\x38\xbf\xd1\xe8\xba\x63\x8c\xa9\xba\x68\x24\x3a\x37\xd6\x68\x90\x8e\xd5\x34\x81\x74\x11\xf3\x78\x2b\xd2\xf5\xbb\x89\x8b\xcc\x66\x62\xcf\x17\xb1\x8c\x9e\x33\x50\x83\x53\x7c\xf2\xc6\x39\xdb\x58\xdb\x78\xe2\x73\x33\x06\x5f\x52\x3f\xe2\x3b\x73\x63\xb7\xbf\xff\x9a\x0f\xfe\x62\x57\xbd\xdb\xff\x3c\xa5\x74\xa9\xf4\xae\x2b\x30\x57\x75\x7d\xfc\xe9\x34\xd7\x80\x5c\x55\xb3\xd6\x2d\x13\xce\x8f\x04\x44\xb1\x18\x1b\xd1\x0e\x6b\xff\x1c\x8f\xeb\x62\xe0\x12\xd1\xf7\xcb\xdc\x2d\xc7\xde\x2b\xe5\xa4\xa3\x56\x58\x53\xc9\xed\x59\x75\xa1\x8f\x36\x0d\x9b\x22\xf4\xd3\x57\x7c\xcf\x1b\xdd\xc3\x0b\xc0\xe2\xeb\x0b\xe4\x68\xd7\x57\x60\x96\x82\xf0\x42\x63\x7c\xae\xab\x38\x05\x93\x95\x4a\xe9\x05\x09\x6c\x09\x3f\xc5\x70\x19\x5c\x90\xa8\x56\x4b\xfb\x30\x6d\x84\xcf\x89\x78\xa8\x77\x47\x70\x64\xa3\x12\xce\xba\x16\xb7\x76\x21\x4b\x1f\x18\xa8\x41\xc2\x2f\x7c\x4b\x17\x8e\xb8\x57\xdf\x22\x88\xbb\xf6\xce\xfe\x43\x71\x57\xd2\xee\x18\x68\x70\x7a\x8f\x98\xd2\xb2\x50\xba\x2c\x56\x1f\x39\xd0\x3a\x09\x08\xa6\x83\x36\xb8\xf4\x9b\x78\x22\x51\xac\x70\x45\x81\x80\x73\xa0\x74\x80\x16\x6e\xed\x03\xf4\x28\x83\x1d\xf1\x8c\x7b\x0a\x59\xef\x00\xae\xb9\x3c\x95\xa7\x98\xc4\xba\x56\x04\xef\x63\x5d\x31\x0a\xb0\x19\xf6\x7f\x0e\x2e\xf4\x31\x87\x99\x1e\xfd\x14\xc3\x76\x9e\xa7\xa5\x8e\x8b\x07\x14\xe7\x4b\xd3\x1f\x8f\x36\xce\xc7\x23\x8c\x73\x40\x26\x3b\xcf\x33\xd0\xd3\x41\x5b\x58\x74\x76\x7d\xc7\x3b\x3b\x59\x3b\x59\x80\x2d\xc8\x6c\x93\xa5\x76\x41\x57\x84\xcb\x85\x6e\x1f\x87\xf9\x9f\x5c\x38\xec\xfe\x2c\xba\x0f\x18\xa7\x6f\xf1\xa7\xff\xf0\xfa\xba\xde\x6e\xfc\xe9\x5f\xe1\x3d\x2e\xfd\xf8\xf1\xaf\x3f\xdd\x09\x77\x96\x2e\x4e\x4b\xe8\xf0\x3a\x9a\x33\x40\xf1\x72\xe4\xa0\x61\x5d\x8e\x28\x66\x18\x63\xd9\x27\xd5\x98\x73\x57\xa6\x2e\x67\x73\x8f\xe3\x94\xb3\x02\x96\x0c\xed\x6b\x3f\x59\x07\x4a\x46\x20\x97\xbe\x2d\xd9\xb9\xf1\xad\x99\x63\x2b\x04\x84\x1a\x95\x5c\x82\x08\x9f\xa7\x22\x2f\x05\x76\x04\xcb\xa4\x5f\x26\xce\x53\x13\x78\x00\x93\x98\x87\xf7\x00\x46\x7f\x11\xfd\xe3\x4d\x33\x29\x58\x10\x5f\x8f\xb8\xb0\x05\x28\xde\x8f\x1f\xee\xae\xe1\xca\xef\x5e\x3f\xa9\xb6\xc5\x7c\x5f\x2e\x5d\x9c\x73\x46\x79\x69\x48\xe9\x75\xe5\xb5\x8b\xf3\xa5\x05\x42\x52\x95\x15\x69\x0e\x39\x2b\x61\x19\x3b\x49\x15\xcc\x30\x27\xb0\x84\x07\x68\x1f\xa3\x07\xc1\x78\x66\x33\x92\x1c\x1f\xec\x4e\x3e\xc0\x3d\x07\x91\x8f\xfc\xe0\x2b\x24\x04\xa4\x5c\xda\xca\x68\x18\x7e\x1f\xb8\x96\xb2\x33\x7a\x6d\x77\x1d\x6a\x27\xf3\x28\x89\xfe\xd1\xb6\x5a\xbc\xb9\xdf\xbf\xa8\x87\x7c\xf3\xe5\xbb\xd7\x77\xf1\x87\xd0\xf2\x6f\x7f\x1e\xd7\xbb\xe9\xa1\x88\xa1\x10\x05\x2c\x69\x89\x8f\x94\x15\x3a\x87\x6e\xe7\x38\x2b\x51\x41\xcb\xf2\xc4\x44\xa1\x73\xe2\x0e\xb9\x6d\x1e\x4a\xce\xd6\x76\xee\xca\x3e\xf7\x9d\x6f\x4b\x90\x1e\xcf\x72\x6f\xd7\xcf\x53\x9b\xde\x7c\x9e\xcf\x67\xb6\xb7\xd1\x3e\x56\x37\x36\xfc\x55\x71\xe2\xd9\x6f\x7b\x81\x9b\x79\xf5\x2d\xec\x4c\x1d\x67\x9b\xd3\x36\x78\x18\xe3\xa5\xab\x96\x2e\xc6\xbe\x04\xe3\x32\x0f\x61\x28\x4e\x00\x9d\x8f\xd7\xb3\xfd\xe4\x9c\x35\xe7\xd1\x38\xdf\x03\xe4\x4c\x52\x1a\x5f\x76\x5d\xb7\x9c\xba\xae\xdb\xb4\x55\xa2\x3c\xa9\x03\x87\x7b\xe0\x01\x0f\xf5\x83\x1f\x5e\xdd\x7d\x58\xd7\xce\xc4\x64\x9e\x1d\xdb\x7c\xf4\x23\x99\xf2\x93\xdd\x1d\xad\x3c\x1f\x99\xb0\x5a\x90\x44\x60\x8b\xe3\xc2\xa7\xd1\x0e\xb4\x8f\xe6\x50\xee\xe5\x25\x36\xf9\xc3\xa6\x1e\x73\x09\xf8\xbc\x24\x7b\xbb\x0d\x1d\x26\xb5\xa3\xa0\x3b\x4b\x00\xe1\x70\x8d\x03\x76\xc9\xc9\xd3\x30\x5d\xcc\x0f\x16\x1c\xbd\x01\xca\xd3\xbd\x84\x6a\xa9\x62\x4e\x7d\x27\xbd\x53\xbe\xd2\x4a\x2b\xbd\xee\xa2\x24\xd9\x6c\x2e\x12\xe2\x14\x7f\x11\x45\xe0\xbb\xb7\x41\x29\x23\x06\x1f\xbe\x5b\x87\xe6\x87\xdd\xfe\xc3\x77\xaf\xdf\xc6\x49\x40\x3f\x30\x32\x2b\x3f\x63\x2f\x2a\xe4\x67\x7d\x8a\xa1\xe3\x0e\xfa\xce\xeb\x72\x68\xab\xa6\x05\xf9\x84\xc8\x81\x2c\xc7\xc9\x80\x34\xa6\x65\xe9\x33\x6f\x15\x20\xcb\xb0\xfe\x0d\xe9\x29\x34\x40\xc6\x0e\x2f\xce\x77\x10\xf5\xcd\x3a\xe6\x9a\x4b\x7e\xf0\xe9\xfa\xfb\xeb\xf5\xa3\x9f\x5f\x1f\x11\x90\x2b\x3f\x10\x4f\x6b\xec\x07\x0d\xb2\x98\x55\xa2\x86\xbe\xf6\xbc\x3c\xf6\xae\x1e\x01\x3c\x61\x7a\x69\x41\x14\xb3\x62\x6d\x81\x7b\xd1\x02\x0b\x64\x6c\xf1\xd2\x7b\x0b\x51\xbf\x71\x1a\xef\x58\xa8\xc3\xc3\xb7\x7d\xf0\xe3\xda\x86\xe4\xd2\x07\x87\x4b\x1b\x82\x1a\xce\x54\x56\xa2\x85\xbe\xb3\x65\xa3\x2a\xd0\x2a\xea\x8a\x93\x1f\x61\x53\x59\xeb\xc6\x1a\xe1\x03\x5e\x8e\xa3\x3a\xc5\xb4\x28\x7c\xea\x2b\x09\xe8\xd2\xfb\xd6\x1b\xd2\x52\xa8\x81\x8a\x1d\x5c\xf4\x7a\xfb\x63\x1b\xe6\x0a\x76\x73\xff\xbf\xfe\xf9\xfd\xff\xf8\xdc\x01\xef\x7f\xfc\x70\xc8\x29\x80\xca\xb7\xd4\xa3\x1a\xfb\x46\x03\x14\x8b\x5a\x56\x79\xe1\x8d\xc7\xf0\x34\x55\xdd\x08\x08\xc8\x08\xfb\x79\x17\xac\xad\x58\xbb\x40\xf0\xa7\x3e\xa8\x7c\x7b\xed\x83\xd5\xd7\x64\x81\xab\x6d\xb5\xbb\x36\xb5\xcf\x27\xd5\xee\xe4\xd5\x57\x98\x8a\x67\xf8\x7a\x52\x3c\xe9\x8c\x12\x0a\x20\xa8\x45\xea\x4a\x4a\x7c\xe6\x85\xde\xc1\xa5\x5a\xdf\x1a\xd0\xfb\x11\x94\x07\xb4\xcc\x76\x7e\x68\xfd\x58\xe6\xac\x42\x13\x41\x44\x25\x76\x69\x43\xc8\xa9\xf4\x63\x14\x01\x30\x3e\xe2\x5d\x1f\xde\xed\x0b\x03\xe0\x0b\x72\xe2\x37\x19\xf8\xf0\xf9\xbb\x57\x9f\xde\xc5\x65\xe7\x00\x49\xa5\xc5\x3c\xe3\x04\x66\xa8\xf1\x2d\xd7\xb6\xdb\x17\x80\xf9\xfa\xc1\xf9\x36\xb7\x99\x04\x28\x1e\xc5\x59\xfa\x46\xb9\x38\x03\x27\x18\xed\xc0\xf8\x88\xee\x58\xd0\x72\xfc\x25\x7b\xe9\xf5\x57\xc0\xc3\x5b\x7b\x49\x77\xe5\xa0\xd0\x99\xd6\xb6\x9a\x01\x0c\x80\x48\xc0\xce\xeb\xc4\x31\xc0\x0d\xfe\x2d\xbd\x3d\xe0\xdf\x1d\xa5\xcc\xaa\x4c\xee\xd9\xc2\x97\xc1\xb3\x8b\xd2\xb3\x57\x55\x65\x6b\x6b\x6b\xcf\x7c\x6a\x87\xa0\x1f\xc5\x83\xdf\xa9\x7f\x1e\x8b\x0a\xbe\xe5\xfd\xdd\x53\x2c\xea\xcb\x35\x16\x75\x6d\xdb\xdd\x4d\xb1\x60\x52\x03\x97\x37\x39\xd0\x5e\xe4\x40\xf1\x87\x89\x01\x92\x79\x1d\xcf\xcb\xb8\x9a\x72\xdb\x26\x9b\x9a\x36\xad\xef\xb5\xe9\x44\xbd\x9f\x6d\xae\x8c\x3e\x13\x63\x92\x56\x7b\x23\xa5\x92\xf2\x28\xb5\x6c\xb0\xb2\x16\x2b\xa1\x99\x59\xdf\x08\x1d\x74\x75\xf5\x05\x0b\xf8\x9f\x22\x1e\x45\xaf\x3f\xbe\xfa\x18\xa8\x51\xae\xdb\x33\x09\x50\xd8\x5e\xfd\xe1\xff\xff\xb5\x96\xed\xfb\x30\xba\xde\x5f\xb4\x6c\x9d\xd1\x3c\xfc\x88\xed\xa0\x95\xd9\x4e\xe4\x76\x50\xf6\xc1\x65\x3b\xf6\x50\xab\xc4\x9e\xa5\x5d\x47\x5f\x49\x20\xc8\x51\xee\xf2\x12\x64\x99\x4f\x17\x07\x41\x56\xc2\x03\x5e\xac\x60\x9c\x73\x16\xfe\x71\x26\x56\x6f\x4a\x5c\x7e\x0d\xff\x44\x2c\x97\x82\x1b\xe6\x9d\x52\xfe\x48\x59\xc6\x29\x44\x28\x93\xa8\x34\x19\x46\x9b\xb6\xb0\x78\x44\x7b\x78\x60\x2f\xec\x5a\x1a\xfd\x6d\xf4\xbf\x6d\x7a\xac\xe1\x19\x6d\xfe\x69\x78\x4e\xb7\x84\x1e\x2f\x28\x2f\x3e\xbe\xf9\xfe\xc9\x58\xf9\xf0\x1c\xbf\xdf\x5d\xf3\xb7\x9f\xbf\xfc\xf8\xe9\xf5\xfe\xf3\x97\xfb\xef\xb7\x80\x7d\xb3\x43\x3e\xca\x41\xef\xd6\x77\xcc\x02\x94\x7b\x31\x3e\x09\x8e\xa8\xc5\x80\x9c\x62\x42\x28\x18\x19\xe6\x98\x2d\x93\x31\xa6\x48\x75\x4a\x6b\x4c\x61\x8c\xa8\x34\x5a\x5a\xf7\x18\x79\x87\x41\xd1\x6b\x2d\x59\xa7\x8b\x0c\x10\x81\x7d\xee\x04\x11\x4c\x1c\x98\x26\xcb\x3c\x2b\x79\x8c\x33\xf2\x18\xe1\x19\x1f\x51\x97\x97\x1c\x16\x98\xae\xbd\x5d\x2a\x58\x92\x52\x92\x14\x6b\x45\x11\x56\x94\x48\xe4\x0a\x8c\x4a\xaa\x64\x97\x43\xdf\x29\x44\x53\xd0\x63\xcb\x38\x0f\xf5\x53\x74\x37\x1d\x50\x88\xfb\xfc\x70\xc9\x42\x6e\x51\xb6\x8b\x99\xfb\x7b\x21\xf6\x2f\x11\xf6\x1f\x2f\x08\xfb\x8f\x9f\x76\x66\x83\x71\x3b\x02\x53\x5b\x68\xdf\x91\x9a\x07\x95\xf1\x3e\x86\xe2\xd4\x2d\x6d\x5d\x57\x15\x30\xdd\x92\xaf\xfb\x03\xf2\x58\x5d\xd0\xf5\x1d\x0a\xe8\x7a\x05\xba\xdf\xd5\xfb\xf1\x27\x4d\xf7\xc3\x56\xde\xac\x6e\xc1\xf5\x69\xc4\x1e\xf1\x3e\x3d\xb8\xe8\x9f\x5f\x18\x4f\x48\xf4\x3f\x05\x26\xa1\x4b\x0e\xec\xcd\xfd\xd5\x75\xba\x0d\x90\x04\xda\xa5\xab\x99\xf1\xe9\xfe\x39\x31\xf6\x7a\x5b\xae\x3f\xed\xdf\x7c\xfc\x74\x77\x0b\x00\xb9\x1c\x93\xb2\xcc\x41\xe5\x05\xa0\x84\xf8\x06\x48\x2e\x4a\x5c\xb0\x12\x4f\xb6\xb3\x80\x86\x3b\xb3\xd6\x18\x30\x64\x05\x0f\x78\xa3\x01\x74\x6d\xdb\xae\xe6\x06\xa0\xd3\x32\x84\xc3\xc1\x11\x6a\xf8\xa8\x46\xbe\x70\x1a\x04\x83\xd1\x3c\xfb\x53\x42\xb8\xe2\xe3\x32\x7b\x4e\x81\x03\xa7\x78\x42\xd0\x37\xdc\xf7\x42\x4a\x21\x26\xce\x97\x49\x08\xe1\x5b\x21\x44\x14\xc5\xe0\xf4\x88\xf7\xd9\x01\x45\x7f\x6f\xb3\xa0\xde\x04\x70\x6f\xc0\x55\x6d\x05\xf5\x4f\xbc\xbf\x5b\x8c\xeb\xcd\x93\x36\x54\x6c\xe2\xb4\xa8\x96\x0c\xb4\x79\xe6\x0d\xc8\xe4\xc0\x41\x84\xfc\x08\xb0\x2c\x91\x12\xd8\x16\xa0\x9d\x01\xf4\x5d\xda\x1a\xa1\x0f\x48\x95\xad\xb5\x4c\x3d\xa4\xb3\x31\xcd\xec\x66\x4e\x59\x75\x84\xd2\xce\x2e\xcf\xeb\xca\xf6\x11\x58\xed\xce\x7d\x79\xd0\xa1\xe2\x35\xcc\x1e\x9b\x5f\xf2\x6b\xf0\xf1\x4d\x08\x07\xbe\x7e\x77\x75\x4b\xe2\x7e\x74\xc7\x63\xdf\xcf\x27\x38\xea\xae\x1c\x8f\x6d\x3b\x6e\x62\x2d\xab\xa7\x3c\x95\xd6\x9b\x93\x18\x01\xb4\x20\xb5\x20\x5d\xfd\xad\xe8\xf2\xdd\xbf\x7e\xf9\xdd\xaf\x7e\xf6\xd5\x49\xda\xbb\xb6\xad\xaa\xae\x2f\x5b\x5d\x15\x6d\x5f\xd7\xfd\xf3\x57\xaf\xff\xf4\x7c\xfb\xd5\x21\x5e\x25\xf6\xe9\xa1\xbc\xa8\xfe\x45\xe0\xdd\xa7\xe7\x15\xeb\xf3\xeb\x77\xf1\x7e\xfb\xfe\x00\x8c\xbe\x7f\xf5\x2e\x79\xfd\x79\xed\xd2\x84\xd6\x31\x4f\x85\xc6\x3c\x13\xb8\x28\xb2\x96\x3e\x46\xb4\x23\xca\x66\x99\x31\xa0\xb4\xa9\x49\x6d\x9a\xed\x9d\xfd\x69\xf2\x2e\xaf\x72\x03\x90\x67\xb3\x69\x01\x33\xaa\x0f\x7c\x23\x1e\x55\x55\xa7\x37\x5f\x43\x3d\xb2\x7d\x7e\x28\x9e\x2a\x0f\xde\x7d\xba\xa1\x79\x5d\x1b\xf1\x7c\x93\x7f\x13\x07\xb5\xee\x77\x09\xd7\x31\x42\x65\x5d\x94\x05\x82\xa8\x48\x55\x7a\xd2\x63\x56\x55\x42\x54\x4a\x29\xb5\xb7\xf6\x21\x9a\xc7\xdc\xe5\x12\x68\x2f\x4f\x7c\x02\xc4\x86\x7f\xe7\x09\x90\x4b\x5c\x29\xf4\xe9\xc6\x81\xff\xcf\x6e\x99\xef\x93\xa7\x1c\xfe\x9b\x8d\x4f\x6b\x7f\xcb\x79\x7f\xb8\xfb\xf0\xfe\xd3\xe7\x2f\xf7\xc9\x00\x73\x90\x2d\x10\xe4\x59\x51\xc5\x6c\xa9\x83\x74\x7e\x1f\x3b\x69\x9d\xca\xfc\xc4\x19\x65\x19\xa6\x44\xe9\x02\xe4\x92\x79\x74\xd0\x8c\x5b\x4b\xb0\xb7\x9e\x19\xe7\x8d\x93\x22\xcf\x73\x83\x8e\x84\xe4\x36\x2f\xea\x2c\x77\xa5\xa6\x24\x02\xb1\x7e\xa4\x7b\x72\xd1\x37\xb8\x79\xde\x1b\x3c\x32\x4e\x42\x67\xdc\x7f\xfe\x57\x60\x1b\x4e\xdd\xa9\x3a\x1e\xc7\x31\x03\x91\x9f\xc9\xac\x47\x3c\x83\x34\x9d\xe7\xd3\xf6\xe0\x8d\x9f\x0d\x63\xcc\x78\xf3\x18\x89\x19\x14\xe1\x97\xc0\x37\x0b\xf6\x22\xf8\x78\x79\xf4\xab\x28\x02\x6f\x92\xef\x5e\x60\x86\x93\xa0\x8a\x74\xa7\xab\x5a\x48\x5c\x66\x18\x95\x65\x53\x3f\x46\xf6\x90\x9b\x65\xf6\xd3\xd1\xda\xd4\x66\x94\xf6\x00\xc5\xd9\xef\x9a\xc3\xb8\xe5\x7b\xd4\xae\x3d\xc8\x17\xb3\xe6\x86\xd1\x7a\xf6\xd1\x3f\x6f\x62\xef\x7f\xd0\x4b\xdf\x21\xda\x1d\x41\x6f\xab\xca\x7a\x34\x77\xb9\x47\xcb\x58\x80\xc6\x13\x5d\xd7\x1a\xb4\x55\x0b\x41\x07\xa2\xca\x55\x55\x05\x50\x75\x90\xa6\xcc\xdb\xcb\x20\xef\x8b\xd2\x71\x5c\xc3\x69\x1b\xe6\xb6\xce\x52\xb7\xe0\x6b\x91\x8a\x17\xdb\x59\xb4\x8b\xca\x0b\x1e\xae\xb8\x7a\x61\x9b\xd9\x74\x8d\xce\xde\x06\x67\x2f\x58\xcd\xfd\x97\x77\x57\x77\xa6\x05\xa5\x03\x25\x2c\xb4\x6a\x01\xf6\x70\x8a\x99\xf3\xd0\x71\xc2\x86\xc1\x57\x40\xf9\x31\xcc\x7a\x5b\xad\xa6\x87\xfb\x7a\x18\x10\x26\xfd\x60\xbb\x33\x33\x26\x29\x71\x29\x75\x6b\xc7\xbe\x3f\x9b\xd5\x13\xbb\xe8\x55\x91\x5d\x1d\x62\x4f\x9b\xa2\xdd\x37\x94\xf7\x5e\x5f\x6c\xaa\xc3\x57\x8d\x5b\x17\x22\xdb\x57\x80\xb8\xbe\x77\xbe\xad\xfa\x0c\x70\x62\x61\x1c\x2d\x3d\xa1\xb1\x76\x3e\x73\x84\xd1\xc9\xfa\x23\x80\x60\xf6\xd9\xde\x4d\xd3\x34\xd9\x10\x31\x76\x2d\x34\xd6\xc8\x05\x0a\x11\x43\x82\x9c\x3b\x86\x70\x71\x12\xb1\x47\x12\x6c\xd9\x2b\x3f\xfc\x33\x25\xfc\xa7\x6b\x98\x70\x9d\x4d\x7f\xa1\x70\x78\xaa\x9a\x91\x82\xac\xf7\x0a\x98\x0a\x58\x2f\x8f\xb5\xb0\x4b\x63\xd2\x82\x51\x8e\x31\xa2\xb2\x89\x9d\xc9\x72\xc9\x04\x26\x25\x54\x0a\x54\x4b\x1d\x0b\xdf\xbb\xaa\x05\x2a\x66\x6e\x1c\xdd\xc2\xc6\xc1\x8d\xc9\x50\x48\xc1\xa5\xe2\xc4\x48\x71\x04\xb8\xd0\x82\x2b\x25\xa8\x64\xb2\x8f\xa2\x5d\xd0\x3f\x31\xdf\x7e\x9f\xaf\x3e\x00\xf8\xf6\x8b\xfc\x69\x7b\xcd\xe3\xaa\xcc\x40\xf3\x70\x04\x4d\x96\xfb\x29\xc9\xcf\x47\x07\x8e\x3e\x8f\xa7\xdc\x73\xa9\x18\xcd\x31\x93\xc3\x94\x83\xde\x88\xc5\x24\xcc\xd4\xe3\x41\x13\x66\x2d\x82\xbe\xf2\xd4\xda\xa5\xb0\x70\x24\xb4\x70\x45\x51\xe7\x99\x2b\x0d\xc6\xc6\x09\x56\x06\xcd\xdc\xad\x7d\x1b\x4e\xac\xbc\x6a\xcb\xfd\x1d\xf5\x84\x24\x18\x36\xae\xcb\x10\x49\x7b\xe8\xc0\x14\x5c\x63\x98\x0c\x52\x12\x56\x28\x4c\x97\xde\x6d\xa4\x9e\x68\xe9\x0f\xb9\x10\x66\xfd\x6f\xdd\x2d\xcd\xb9\xdb\xa2\x14\xda\x37\xc9\xec\x67\xe3\xa5\xd9\xb4\x7c\xc5\x23\x0d\x1a\x60\xbf\x0a\x16\xcf\xfb\x90\xfb\xbc\xa0\x35\xde\x3d\x15\x43\x7f\x0c\xc8\xf3\xcf\xc9\xc7\xcf\x9f\xde\xdd\x87\x4c\xd7\xc7\x8d\x43\xf8\xfe\x13\xb8\x3b\xdc\x7d\x7c\x15\x67\x55\x51\x82\x61\x02\xc8\xf7\x6e\xa9\x9d\x26\xfe\x08\xf2\xb2\x1a\xd3\x09\xc8\x74\x5e\xea\x3a\xcf\x06\xc0\xd3\x1c\xe4\xbe\x2b\x4b\x32\x1f\x74\xc9\xc8\xb9\x7a\x8c\xec\x7a\x13\x56\xda\x84\x73\x0f\x85\xd6\xe2\xb8\x34\xcc\x1a\x7e\xf4\x56\x60\x06\x42\x1e\x59\x5d\xf4\xee\xfe\x24\x54\x6b\x07\x8e\xf7\xd7\x5f\x73\xd9\x3f\xf1\xd7\xdf\xb2\x84\xd6\x40\xe6\xd0\xe2\x02\xa8\xb3\x8c\xeb\x0a\x63\x90\x3d\x9c\x62\x4a\xbd\xc6\xa5\x2d\x48\x92\xba\xe5\xe8\x82\xb2\xc2\xbe\x65\xa4\x64\xd2\xe2\xb2\xb3\xf6\x4a\x60\xbf\xf0\x05\x52\x1a\x0f\x3e\x03\x7c\x7d\x86\xf4\x91\xec\x9a\x43\x79\xe9\xa7\x7f\xba\xa9\x99\xbd\x79\xf7\xea\xeb\xb7\x31\xac\x97\xf7\x9f\xee\xbf\xfc\x16\x7c\xbf\x76\x51\xe8\xa7\xfb\x57\xf7\x43\xc2\x8c\x59\x8e\xb0\x8c\x8d\xf3\xc2\x51\xae\x6a\xde\xcc\x45\xe6\x6b\x20\x33\x3f\x81\x26\x05\xb9\x1f\xb3\x1c\x50\xaf\x83\x12\x7d\xe9\x6b\xeb\x2b\x41\x96\x42\xe9\xd8\x09\xaa\x4d\x63\xb9\xb4\xbd\xe0\xbd\xaf\x25\x1f\xce\x39\x20\x61\xde\xa5\xbb\xe6\x00\x6f\x94\xa0\xa2\xd7\x97\x58\xd2\xe1\x89\xa4\xe4\x99\x47\xfb\xd5\xcf\xb4\x55\xd7\x47\x5a\x27\x53\x40\x69\xa9\xac\x04\xf0\xc8\x8f\xfe\xa8\xfd\x91\x4e\xc2\x38\x52\xd9\x22\xf3\x16\x68\xcf\xdb\xe3\x11\xe8\x69\xa9\xd6\x43\x7a\x3c\x40\xdb\x9c\x67\x2b\xb4\xb1\x56\xf5\xd8\x41\x8d\xa0\x81\x88\xca\x24\x6b\x7c\xd6\x34\x8d\xcf\x5a\x51\x96\xed\xda\x77\xc7\x47\xb1\x23\x07\x79\x61\x25\x78\xff\xb2\x6a\x32\x70\xf3\x27\x17\x62\xfe\x8b\x62\x60\xfc\x3e\x90\xe7\x30\x52\x00\xb8\xd8\x4a\xe7\xf5\x44\x40\x59\x20\x04\x46\x5f\x82\x51\x4b\x2e\x38\x13\x47\x7f\xe2\x52\x98\x83\x14\xea\x3c\x2c\x3d\x44\x8e\x62\xba\x1f\x39\xf5\xab\x9d\xdc\xf6\xbd\x57\x4c\x61\xc6\x35\xc8\x5a\x41\x98\x08\xf3\x2c\xbb\x68\x87\xfe\xb0\x8d\xf6\xdb\x37\xf1\x65\x48\x30\x03\x1f\xa2\x57\x17\x90\xdb\x4d\x49\xf0\x04\x54\x15\xf0\x6c\xb5\x9f\x99\xc2\xb0\xc4\x84\x58\x7f\x34\x20\xf5\x13\xa8\xbd\x81\xba\xb0\xc6\x25\x84\x61\x8b\xe8\x3a\xd3\xba\xc9\x9d\x2b\xc9\xb3\x2a\xe7\x09\xea\x97\xa3\xaf\x05\x40\x60\xe8\xdd\xb4\xf4\xc5\x63\x34\x91\x69\xac\x07\x3c\xd6\x51\x1c\xd1\x47\xb4\x2f\x0e\xea\xa2\xc6\xf3\xe6\xfe\xbb\xb7\x9f\x5f\xbf\x8d\x93\xa0\x6b\x1e\xbf\xfb\xcd\x95\x41\xf8\xfe\xd5\x0d\xce\xf9\x19\xd6\xf6\xea\xe3\xf7\x6f\x2f\xda\x55\xb3\x77\x69\x41\xa1\xa5\x06\x97\x79\x5e\x21\x47\x14\x37\xa2\x96\x2c\xf3\x1a\x10\x22\x11\x2c\x09\xc9\xb3\xd6\x19\x1b\xa7\x2e\xad\x09\x96\x98\xec\xb1\xf5\xc5\x69\x04\xa4\xf0\xa9\x9f\x07\x40\x90\x47\x27\xa3\x65\xd5\x81\x3c\xb6\x7e\x5c\x5c\x9f\xb9\x4c\x80\x5a\x7b\xe8\x2b\x0a\x04\x68\x63\x0d\x50\x6d\x01\xa2\x92\x89\x0b\x4e\x71\x9d\xeb\xc4\x8d\xee\xf1\x5f\x7f\x0b\x37\xb4\xad\x12\xe0\xed\x8b\xe8\xec\xfe\x66\x4a\xde\xa5\xd4\xeb\x65\x80\xa0\x07\xc6\xae\xde\x82\x3f\x92\xd2\x95\xa8\x21\xa5\x2d\x71\x62\x73\x2f\xa5\x94\x3c\xa7\x52\x78\x81\xc1\xe8\xe4\x22\x12\xaa\xab\x83\xb6\x2c\x73\x0d\xec\x0c\xa9\x94\xae\x60\x65\x32\x55\xc1\x4a\x2f\xa5\xa5\xbe\xa6\xb4\xa8\x8a\x02\x14\xb8\xc6\x4c\x49\xe3\x02\x6d\x7a\xd0\x93\xc5\xbb\xfa\x00\x83\x1e\xd2\xaf\x57\xcb\xeb\xf5\x4d\xe4\x62\x35\x3e\xbf\x7c\x95\x0b\x7b\x75\x6f\x76\xd1\x32\x15\xa0\xad\x1f\xfa\x23\x1a\xe7\xd2\xb7\x40\x02\xe1\x7b\x30\x3f\x4d\x2b\x07\x68\x7b\xcf\xac\x05\x99\xeb\x17\x0b\xb2\xa5\x5b\x88\x54\x71\xe7\xc9\xa6\xe5\xb9\x8b\xea\x47\xb2\xcb\x2f\xb9\xc2\x0b\x6b\xf3\xa5\x56\xfc\xe6\x4a\xc7\x24\x5a\xa2\x6a\x9d\xfc\x63\x5b\x2d\x63\x5d\x07\x4a\x32\xb8\x10\x07\xcc\x92\x9e\x6b\xa5\x12\xb6\xb4\xa0\x09\x7d\xcf\x76\xe8\x52\x8b\xbf\xd5\x6a\x44\x4f\xa2\x01\x17\x4e\x8b\x2f\x5b\xed\xc5\xe5\x39\x88\x64\x38\x43\x92\xe0\x73\x57\xc5\xe9\x72\x02\x53\x4d\x48\x9f\x7b\xe1\x33\x0c\x4a\x90\x72\x2f\x68\xe6\x72\x72\xc8\xac\x5b\x1a\x07\x4a\x1f\xc1\x63\x03\xad\xe2\x15\x42\xf3\x3c\x4d\xe5\x3c\x6c\xba\xa9\x6c\x47\x43\xed\xeb\xfd\x2f\x68\x58\x5e\xac\xbf\x75\x66\x66\x15\x60\xbe\x06\xf5\xb9\x00\xce\xd7\x19\x10\xe1\xf7\xa9\x29\x3c\x5d\x8e\xeb\x67\x6e\xaf\x40\xf4\x18\xb9\xc7\xc8\xb9\x4d\xc1\xd2\xfa\x09\x42\xa7\x59\x83\x01\x8e\x22\x10\xd9\x47\xb2\x93\x87\x10\x6d\x7e\x1d\x14\x7b\x5e\xbc\xbd\xcf\x66\xc8\xeb\xe0\xe7\xbe\xbe\xb7\xc9\xe4\x65\x0a\x34\xe7\x84\x97\x06\x97\xc7\x5c\x73\x41\x29\x16\xba\xc9\xa7\x0a\xd8\xcc\xe3\x4d\xc6\xa7\xe6\xbc\x70\x05\x4d\xaa\xb1\xad\x6d\x63\x7b\x2b\x26\xe0\x1e\xe4\xbe\x58\x0d\xe7\x24\x6a\x1f\x59\xb0\x1b\xff\x32\xcc\x20\x11\x78\xb5\xcd\x61\x3f\xac\x87\xd7\x4f\x99\xe9\x8d\xb7\x38\x4e\x3e\xfc\xf8\xe9\x70\xf7\x6a\x4b\x4f\x03\xa6\x4b\xad\x28\x38\x4e\x5a\x55\x19\x40\x7e\x28\x28\x2c\xb3\xdc\x66\x9c\x88\xbe\x4c\x33\x65\x00\x81\xb9\xcb\xcb\x84\x9c\x47\x6c\x49\xc9\x0e\x38\x17\x0a\x15\x1e\x5a\xcf\x1f\x23\x27\x65\x71\xb4\x60\x88\x0b\xdb\x1f\xb3\xd4\x8b\xf3\xc9\x36\xe5\xc6\x2f\x02\xd2\x47\x7a\x67\x2f\x7c\x06\x5f\xc5\x3f\x41\x60\xbd\xbd\x2f\xbe\x7c\x7e\x52\xaf\xdd\x5f\x6a\x3f\x81\xdc\x1d\x1f\xf2\x3a\x71\x67\xb1\x1b\x7e\xea\x6a\x70\x8c\x29\x2c\x0a\x57\xba\x45\x2c\xf5\x18\x57\x3e\x8a\xa3\x2a\x8e\x7c\xb4\xb3\x5e\x1a\xed\xad\x2f\x5d\x59\xe4\x99\x66\x8e\x50\x1e\x3b\x13\xe4\x4f\x82\x06\x1d\x4d\x86\xa7\xdc\x69\x88\xb1\x6d\x0a\x3c\x6f\xde\x5d\x06\xf3\x93\x5a\x06\x97\x0e\x70\x27\xa5\xf3\x95\x93\x20\x05\x3c\x20\xe5\xaa\x7d\x7e\x3d\xb3\x3f\xf5\x18\xef\x91\xcf\xc0\xfc\xe0\xc0\x7c\xc5\x3f\xef\xe0\x0b\xbe\xb6\xe7\xfc\xda\xab\x8f\xaf\xae\xae\xc3\x93\x0b\x01\xab\xa5\xad\x80\xac\xbc\x1d\x06\x20\xc7\xa5\x0d\x87\x7d\xf6\x13\x72\x6e\xdf\x03\xe1\xdd\xd2\x04\x81\xc6\xf6\x1c\x6d\xc7\x4d\x5f\x8e\x3d\x1e\x77\xc5\x21\x0b\x7c\x24\x17\x9d\xbe\x37\xdf\x5f\xd8\xef\x2f\xfa\x7d\x80\x35\x95\x40\x8b\x4e\xa0\x61\x56\x69\xa1\x7a\xdf\x0b\x80\xbb\xa6\xdf\x8d\x5d\x37\x03\xe8\x0c\xf4\x69\xdd\xf5\xba\x6b\x7c\x3b\x9b\x13\x20\xf3\xb4\x8d\x59\x99\x4c\x87\x34\xfa\xfb\xdb\x9b\xfe\xea\x87\x10\x30\x5c\xbb\xc4\x26\x78\xa9\x00\x03\x51\xee\x07\x2f\x48\xcc\x16\x71\x48\xcf\xf3\x02\x19\x77\x8a\xd3\x64\x00\x53\xd0\xc1\x57\x3b\x76\xc9\xd5\xbc\x09\xe1\xde\xcf\xdf\x7d\xba\xa4\x17\x77\x6c\x11\x9d\x13\x14\xf0\x02\x39\x5c\xee\x89\x5b\x26\x4f\x7c\xc5\x07\x80\xe7\x58\x1a\x89\x6c\xb5\xb6\x41\x45\xd9\x4e\x1c\x58\xe0\x54\x7f\xf7\xac\xc3\xb9\xbe\xad\x00\x75\xa0\x2b\x70\x45\x0a\x60\x16\x19\xc3\x05\xee\x98\xab\x2c\xaa\x3b\x77\xa6\x2e\x5c\x9f\xec\x70\xd0\xfd\x7b\xf1\x96\x1f\x9e\x7a\x67\x93\x8d\xbd\xb7\xeb\x1a\x69\xbc\x5a\xed\x98\x34\x3f\xb5\xb2\x69\x85\x9f\x35\xd0\xb9\x97\xc0\x79\xb3\xc7\xab\xad\x68\x7d\xef\x04\x1f\xfa\xea\xd8\xf8\x66\x12\x80\x82\xc9\x81\xa0\x2f\xb8\xae\xd1\xfc\x00\xa3\x3f\x89\xfe\xe1\xad\xb5\x07\xae\x44\x7b\xaf\xb2\xfd\x87\xcf\x7f\x0e\xee\x15\xb0\xe1\x66\x81\x39\xe3\x78\xd2\x32\x77\x3d\x9e\xfd\x49\x4e\x71\xb1\x2f\x94\x80\xca\xd9\x87\x01\x61\xc7\x09\x4d\x56\x4b\x5d\x0c\xba\x01\x0e\xd8\x6d\xce\xa2\x3b\x75\x50\xd1\xab\xa0\xb6\xfe\x31\xa4\x33\x2f\xca\x81\x61\xc2\xb8\xd2\xd4\xc6\x51\x05\x4c\x75\xcc\x3d\x5f\xdb\xdf\x56\x80\xb5\xce\xa9\xbc\x1a\xc9\x41\xf9\xc6\x13\x50\x9c\x3b\x1f\x09\x70\x8a\xa7\x20\x1b\x04\xcf\x27\x42\x9d\x60\x24\xf4\x17\x0d\x6b\xe1\xfd\xb3\x9d\xf1\xea\xa9\xd4\xf1\xaa\x45\xfb\xf9\x5f\x81\xd0\x69\xee\x2a\xe4\x2b\xbc\x4b\x41\xed\x09\xf5\x83\x01\x39\xf1\x1c\xb4\x69\x78\x2f\xe4\xde\x9c\x4e\xab\xd9\xdc\x96\x85\xf3\x7a\x96\x13\x28\x5c\x59\xb4\x76\xb5\x94\x43\x2e\xef\x51\xef\x78\xc0\xdb\x5d\xde\xbf\x27\x57\x6d\x7b\x1b\xaf\xf6\x56\x5d\x8d\xeb\x80\x77\xa0\xf6\xac\xaf\xbc\xab\x2a\xd4\x9e\xb8\x37\x3b\xba\x1c\xe3\xde\x1d\x8f\x6e\x41\x71\xbe\x30\x6f\x31\xd5\x82\x0b\xd0\x5d\xf5\xb1\x59\x78\xfe\xf7\x01\x31\xf2\xf6\x45\xbd\xd5\x97\x17\x56\xc9\x3a\x3c\x3e\x87\x75\xff\x87\x38\x6a\x72\x04\x34\xd7\x84\x17\x92\x94\x45\xea\x79\x5c\xa9\x86\xa9\x42\x73\x82\xb3\x85\xb6\x18\x90\x75\xd8\x5b\x0c\xcc\x41\x21\x4a\x3c\x6e\x72\x97\xf3\xe3\x62\x96\x7a\x0e\x01\x24\x9b\x38\xf1\xa0\x2c\xc5\x15\xda\xb4\x8b\xf1\x5d\x0d\x9a\xe8\xcd\x73\xbf\x06\x16\xb1\x8b\xae\xe2\xfb\x7b\x9d\x94\x55\x02\x17\x0b\x0a\xa0\x99\x87\xbe\xaf\xfc\xec\xa1\x00\x0a\xe4\x8b\x05\x12\x63\x6b\x49\xad\x40\xe4\x05\xb0\x47\x63\xb8\xdb\x34\x90\xca\x47\x7d\xe1\x70\xf8\x8b\xe8\xb7\x2f\x79\xa1\x3e\x05\x66\x98\xdf\x27\x67\x9d\xd4\x40\x86\xba\x0e\x30\x3c\xac\x83\xc0\x72\x97\x97\x8c\x2a\x88\x11\x09\x64\x58\x69\x29\xa8\x42\x18\x12\xd5\x80\x71\x57\x3d\x70\xeb\x7b\x6b\x01\xda\xd5\x45\x57\x9b\x5a\x1b\xe9\x94\x04\x04\xb8\xa2\xad\x4c\xab\xad\x74\x5a\xae\xeb\x5c\x88\x0b\x24\x6d\xd0\xba\x0f\x73\xfa\xeb\x50\xa3\x77\xdb\xac\x77\x2f\x8b\xde\x5f\xdd\xcf\x36\xcd\x6d\x40\x75\x00\x78\xee\x80\x6a\x11\x56\x32\xee\x9c\x37\x2e\xb0\xfb\x1c\xd2\x82\x31\x80\x7d\x67\x7d\x67\x2d\xc0\x95\x52\xdd\x22\x82\x9b\x71\xf4\x05\xa0\x5b\x5f\xb0\x50\xd7\x2a\xae\xd7\x05\x7f\xf8\xba\x3b\xe2\xf2\xb2\xad\xd6\xf1\x0b\xaa\x87\x23\x18\x4f\x98\xaa\x2a\x61\xee\xea\x9a\x1e\x50\x21\x25\x80\x7e\xb8\xdc\xbc\x15\xb2\x5f\xc8\x52\x48\x19\x4f\x97\x0b\x27\x49\xf7\x77\xbf\xae\xb5\x79\x51\x6d\x7c\x11\xea\x4c\x40\x3d\x22\x22\x4d\x92\x39\x9f\x39\x17\x0a\x0e\x7f\x7e\xdd\x61\xc1\x2f\xaf\x1b\xc6\xb6\x3a\xf0\xab\x05\x08\xde\xfe\xa1\xcb\x02\xe2\x50\x5d\xad\x13\x19\x30\x0f\x33\x38\x1e\x21\xd6\x26\x3e\x55\x1e\x57\xc1\x5a\x3b\x94\xb0\x03\xa5\x1f\xdd\xc6\x8d\xab\x24\x9f\x17\xba\x44\x55\x15\xd4\x54\xe1\xa6\x53\x4d\xee\xd4\x4e\xdf\xde\xeb\x57\xb9\xbb\x97\x17\xfd\x74\x0f\x66\x53\x94\xc0\x04\x46\xa2\xa4\xf8\x5d\x9e\x94\xbe\xc0\x54\x0d\xfb\xa2\x7a\x18\xaa\x6a\x07\x1f\x86\x9d\x2e\x09\x6e\x1a\xdb\x18\xd3\x30\xcc\xeb\x65\x58\x7a\xc6\x62\xe4\xeb\x3e\x8a\x92\x1d\xfc\xbb\xf7\xef\x64\xb3\xc2\x6c\x9c\x2e\xe8\xdc\x03\xd1\x42\xa4\x54\xdc\x3b\xcf\x9d\x03\x95\xe7\xdf\xe8\xdf\x69\x81\x2f\xfb\x37\xd4\x86\x7c\x75\xdd\xaf\x5e\xaf\xaf\xaf\x9b\x08\x57\x40\x90\x87\x9a\xd1\x18\xfe\xd4\xc6\xca\x3b\xc6\xf5\xb4\x2b\xaa\xad\x1b\x97\xe8\xe9\xca\xce\x0f\xd6\x02\x68\x6e\xaf\x5c\x02\x1c\x25\x81\x0f\x64\x9d\xe7\xbf\xd6\x81\xbf\x7f\xf5\xb5\xb4\xd3\x0b\x1d\xf8\x2b\x55\xcf\xdd\xfd\xa7\xe4\x24\x88\x51\xd4\x11\x0a\x4a\x0f\xe3\x32\x37\x86\xb2\x52\x10\x4c\x52\x6f\xab\xd6\xd7\x12\x20\xe7\x1b\x02\x5a\x1f\x01\x8c\x18\x98\xd7\x16\x79\x94\x03\x7c\x10\xa6\xb2\xf5\xea\xbe\xa4\xb3\x27\x53\xee\x32\x35\x2f\x3a\xd6\xde\x4e\xa6\x07\x51\x9c\x0f\x56\x8b\xa5\x1d\xbc\x9b\xe7\x68\x1f\x57\x97\x5a\xf2\x2d\x8e\xf5\xe7\x21\xe6\xff\xb4\xfa\xbd\xfd\x19\xbf\xf1\xab\xfb\xb8\x8a\x51\x09\x6b\x5c\xc6\xe9\x43\x2a\x76\xc5\xc3\x14\xb6\xac\x5a\x70\x55\xc5\xdd\x82\xf7\x96\x53\x24\xb4\xab\x6c\x65\xab\x85\x73\x11\xd7\x9e\x82\x22\x8a\x2f\x58\x25\x74\xbd\xca\x86\x3c\xf9\xee\x86\x83\x69\xeb\x86\x75\x5a\x4f\xb2\xa4\xf7\x32\x2e\x7d\x31\x00\x4a\x7d\x37\x56\xbd\x1f\x04\xa0\x9d\x2f\x62\xe8\x45\x15\xdb\x45\x1e\xd0\x62\x47\xeb\xeb\xba\xea\x00\x09\xb7\xd8\xf4\x66\x00\xcc\x8e\x76\x1d\x00\x87\x58\x3c\x8a\x50\x57\xf6\x5c\x3b\xf7\x5f\x3d\x2b\x7e\xfd\x8c\xad\x2e\xf8\x5f\xb7\x4f\xe7\xf5\x7d\xdc\x07\x0e\x9c\x87\xfa\x1b\xcc\x30\x0f\xd3\x1e\x9f\x0d\x4c\xb2\xb2\xea\xa5\xce\xed\xea\x1a\x9e\x7b\xee\xa7\x7d\xdf\xb6\x0b\x01\xb5\xd6\x3a\x30\xc4\x78\x65\x6b\xdf\x75\x99\xcd\xe9\x66\x6b\x5c\x74\x38\x74\xf4\x3a\x54\xe6\xec\x6e\xab\x2d\xb7\xb4\x26\xd8\x62\xae\xff\x00\xfc\x6a\xa3\x04\xfe\x06\x0c\xea\x89\xa3\x21\xc1\x20\x3a\x8d\x95\x36\x7d\x5d\xb3\x61\xec\x3d\x2f\x41\x3a\xf4\x03\x20\xae\x88\x8f\xe7\x09\xa2\x4c\x1b\x07\x2a\x29\x20\x2a\x79\x49\xfc\xc9\xf9\x93\x63\x8c\x0e\xd6\xb7\xc0\xe4\x07\x4e\xa4\x90\x54\x71\x26\xac\x91\x52\x58\x42\x39\xf2\x06\x72\xcb\x69\x91\x6a\xed\xf1\xa6\xda\x04\xd2\x85\xaf\xb6\x39\x38\x52\x64\xf5\xc9\xe2\xe8\x52\x97\xbb\x61\xf3\xae\xbe\xf7\xc7\x5f\xa8\xd9\x09\x81\xcf\xaf\x0b\xd4\x3f\xdd\xaf\x1e\xf8\x5d\x04\x7d\xb9\xa8\x3c\x56\xa0\x75\xd2\x1a\xe7\x25\xc9\x6d\x8e\x7c\x2b\xa9\x23\xb2\xd8\xc1\x26\x64\xe4\xa5\x92\x22\x67\x52\x2c\x2e\x16\xad\x3d\xb7\x07\x6d\x45\xea\x6a\x34\x58\x5a\xab\xaa\x2a\x1b\x97\x6a\x87\x9d\xf6\x75\x65\x55\xe1\x7c\x4d\x68\xe6\xb2\x02\x20\x27\xb9\x58\xe7\x04\x71\xd1\x1a\xfa\xd5\x55\xf5\x75\xb5\x25\x5f\x3d\xa1\xeb\x03\x89\xcd\xeb\x80\x5f\x00\x9b\x50\xf9\xb0\x33\x3e\xcf\x32\xd0\xba\x05\x39\x50\xb7\xbe\xe7\xc0\x0e\x3e\x1d\x03\x6e\xbb\x00\xd1\x20\xfb\xf9\x00\x6d\x5e\x2c\xf0\xdc\x68\x9d\x50\x70\x9a\x1b\x3d\x03\xfc\x53\x0b\x9a\xf8\x54\xf5\x6a\x70\x57\xbc\x08\x09\x58\x8a\x6b\x6d\xd6\xc7\xcd\xde\xbf\xc4\x1f\xde\xde\x7f\x1d\x89\x0d\x5b\x20\x13\x79\x31\x52\x77\x91\x51\x56\x9d\xa7\xe4\x64\x5a\x0d\x90\xd2\x88\x14\x02\x0a\x5f\x39\x5f\xbb\xb8\xa8\x1b\x18\x3c\xdd\x19\xf0\x73\x73\x3d\xdb\x1b\x84\x09\xb3\xda\x4a\xfa\xe0\x18\xcf\x4c\x4a\xb6\x70\x2e\xde\x97\x0c\x2f\xa7\x40\x65\x78\x3c\x1e\x43\x3b\x87\x47\x72\x87\x0e\xfa\xc2\xe7\xf9\x9b\x9f\xe3\x3f\x2f\xcd\x03\x57\xa4\xd5\x0d\xaa\x62\xd7\x39\x30\x09\xc9\x6d\xd1\x30\x7a\x3e\x5a\xd0\xf9\xe1\xca\x63\x82\xa5\x50\x5c\x27\x83\xe3\xca\x98\x83\xf6\xf9\x83\xdc\xc6\xd6\xec\xcb\x3d\xf5\xf6\xb8\x54\xc7\xa4\x93\x15\xb7\x86\xc1\xce\x50\x17\x25\x49\x1e\x6a\x2d\xcd\x37\xb4\x36\xf7\x4f\x5a\x9b\xfb\xaf\xb5\x36\x0f\xb3\x27\x98\x34\x56\xd6\xb5\x06\x99\xf1\xb0\x3d\x76\xae\xe8\xfd\x89\x00\xbb\xa9\x6d\xf2\x38\x28\x9d\xed\xed\x79\xb0\x92\x6a\xa5\x49\xa3\xcc\x29\x2e\x97\x1a\x13\xcb\x29\xd9\x9f\x24\x83\xd2\x98\xbe\xf7\x75\xd7\x45\xbb\x58\x07\xcc\x57\xf9\x1c\xaf\x01\xcf\xf1\x9a\x30\x7d\xff\x3c\x5e\x13\x77\x3b\xb7\x68\x18\x97\xdd\x4f\x33\x28\xf1\x63\x04\x0a\x14\x2a\x02\x66\x4f\x63\x5b\x2d\x65\x55\xc5\xe3\x52\x1e\x4a\x3b\x05\x56\xb3\xcc\x4c\x8b\x01\xd9\x32\x2c\x44\x88\xb8\xf5\x18\xc0\x2d\x5f\x49\x2f\x73\xf4\xfe\x52\x17\xbb\x55\x63\x5e\x97\xb2\x1b\x86\xf3\x17\x88\xd8\xe0\x1b\x5d\xf9\xdc\x0f\xa5\x0a\xb0\xf3\x39\x4e\xeb\xd5\xb5\x2e\x1c\x77\xce\x0d\x27\xe1\x4f\x23\xb7\x4a\x16\x4a\xa3\x62\xf4\xb3\x04\x7a\x5c\x4e\xd6\x30\x43\xcd\x41\x09\x49\x24\x9f\x37\xc7\x49\xc1\xaa\x61\xa3\x9d\x5b\x3b\x82\x7c\x39\x2a\x96\x57\x45\x81\xc0\xc9\x8f\xbd\x06\x39\xa0\x40\x69\xd7\xd0\xba\x7a\xd2\x55\x86\xd7\x7e\x7a\xb5\xa1\x75\x7f\xf5\xf1\xfe\xee\xbe\x08\x1a\x8b\xc1\xa4\xfc\x4b\xf0\x71\x8b\x11\x25\x45\x32\x7a\xb5\x3a\xc4\xd2\x01\x84\x1e\x23\x2f\xfd\xc8\x99\x56\xa0\x80\x2e\xc7\xa4\x26\x9e\x04\xee\xf8\x03\x5c\xd8\xda\x14\x9e\xd6\xa6\xee\x9c\x02\x02\xf4\xc5\xd8\x19\x95\x50\xbb\xe9\x1f\xef\x62\xfc\x48\xef\x36\xce\x89\xab\xa6\x5b\xf0\x08\x2e\x7d\xf6\xa2\x83\xc2\x64\x1b\x0a\x21\xae\x6a\x0f\xd1\xfe\x87\xf7\x3f\x7e\x78\x7d\xc3\x9a\x78\x50\xcc\xb3\x65\x26\x60\x04\xb3\xe1\xb6\xc8\x7d\xc5\x6b\xc9\x72\xa1\x10\x3a\x3e\x46\x10\x44\xa7\xbe\xcf\x41\xde\x54\xe6\x38\x56\x4a\x56\xbe\xf6\x04\x08\x50\x96\xd0\x1a\x52\x61\xb3\x64\x96\x59\xe3\x0e\x4a\x69\x6a\xd1\xa2\x9b\x11\x61\x5c\xfa\x54\xb2\xac\xca\x8b\x12\x0c\x79\x66\xa4\xcb\x33\xe3\x40\x04\x7b\x9b\xe6\x4c\x60\x3f\x0c\x79\x49\xb0\x17\xc3\x09\x9e\x86\x02\x3d\x46\x0d\x6b\xa2\x5d\xe0\xac\x93\x7f\x67\x7d\xd2\x44\x27\x33\x41\x23\x91\x85\xc3\x32\x87\xe7\x66\xb0\xfd\x0e\xba\x20\xe9\xc5\xe3\x6c\x99\xed\x3c\xef\x50\xbb\xe4\x6d\x95\x57\xb9\xac\xe2\x68\x39\x79\x49\xbf\xa9\x4f\x9a\x04\x5e\x16\xf7\xc7\x68\xb6\xde\x28\x8d\x6f\x69\x80\xb8\x4f\x4e\x0f\xa7\x44\x06\xad\x83\x6a\xe7\xdc\x19\x39\x9e\xcc\xa6\x9b\x00\x21\x5e\x06\xe6\x75\x0a\xe0\xe0\x84\x70\x75\x2b\xcf\xe3\x01\x2d\x95\xe5\x86\x2d\x83\x9f\xb5\x01\xb9\xef\xe4\x68\x36\x26\x75\xec\x20\x63\x42\x18\xca\x6d\x14\x07\x0d\xa7\xf6\x50\x06\x7e\xa6\x6b\x65\xfc\x33\x87\x41\xf4\xac\xc8\xfb\x6e\x53\x02\x0b\xaf\x2e\x3b\xe3\xe4\xe8\x69\x09\x2d\x57\xaa\xd1\x03\xf5\x44\xd8\xd5\xcb\x9e\xb0\xc9\x6a\xdb\x80\x34\xc9\xce\xf3\xa1\xb4\xcb\xd1\x76\x5a\x69\x5e\xcb\x51\x5b\x50\xc6\x7a\x89\x30\x31\x9c\x92\x44\x2c\x93\xd7\x0c\xd4\xe0\x18\xcf\xbe\xb1\x41\x53\x3c\x0f\x75\xb8\x28\xfa\x93\xd0\x96\xcb\xfc\xf0\xe9\xfe\xf5\xdb\x6b\xa5\xea\x77\xb7\x74\x43\x9b\xb5\x9d\xa4\x89\x1e\x1f\xb2\x44\x2f\xb9\x76\x38\x41\xa1\x2c\x73\x6e\x80\xc6\x5e\xf4\x8d\x2f\x59\x9c\xf2\x65\x8c\x89\x3f\x06\x5e\x6c\xe4\x6b\xe7\x7a\x6f\x90\xb2\x27\xeb\x8f\xa2\x92\x80\xf8\x63\x6d\x9a\xd9\x9e\x04\xe3\x5d\x78\x0f\x60\xd0\xd5\xd9\xb4\x5d\xb7\x95\xee\xcd\x35\x76\xf3\xea\x5d\x00\x4c\x3e\xad\x71\xef\x93\x40\x65\x95\xd4\x93\x53\x7c\x57\xf4\x04\x64\xcc\x37\xa4\x0b\x44\x05\x35\x28\x7b\xd1\xfa\x39\x05\x14\x94\xc4\xf7\xbe\x4f\x26\xe9\x4b\x6f\xf9\x08\xd8\x29\xb6\x4b\xe5\xf3\xc9\x81\x2c\xa6\xa0\xf7\x83\x37\x7a\xf5\x02\x7c\x63\x7b\x77\x34\xdb\x78\xc1\x01\x9f\xfe\x8f\xae\x35\x1f\x9f\xbf\x04\x22\x9e\xc3\xfe\x67\x0c\x45\xe0\x63\x16\x6f\x6c\x6b\xaf\xde\xc5\x06\x34\x45\xe6\x2d\x8e\x11\xe8\xc8\xfc\x18\xa5\x45\x5c\x79\xa3\x41\xc9\xbc\x35\xad\xf4\x4c\x02\xaa\xbd\x03\xa8\x52\x8d\x34\x12\x4c\x55\xb5\x73\xca\x14\xae\xc4\xba\x2c\x9c\xae\x4e\xd2\x39\x20\xfc\x34\xa8\x6a\xf4\xb5\x17\xbe\x33\x9a\x83\x02\xb0\x73\xbd\xb6\x2b\x7b\x24\x7b\x18\xb4\xfe\xbe\xdb\xb4\x2c\xb7\xe5\x16\x7c\xcc\xee\x0e\x6b\x2b\xfe\x21\xd8\xa6\x81\x7d\xea\xbc\x74\x20\x77\x45\xd9\x69\xae\x6a\x78\xb4\x61\x6e\x4c\x1f\xe0\x8e\x3c\x34\xbb\xd1\xf7\x8b\x6b\x26\xdf\x33\xc5\x40\x06\x98\xd7\x75\x4b\xdb\x6b\xad\xc9\x86\x53\xcc\xa3\x5f\x07\xde\x9b\x67\xcb\xfa\xdd\x45\xd0\xe0\x62\xef\x6d\x1c\x13\xc9\xc7\x37\x19\xf8\xf0\xc3\xab\xf7\xeb\xfd\x37\x60\xce\xcb\x0a\xe6\xe0\x54\xa9\x6a\x04\x08\xfb\xc6\xcf\x47\x5f\x31\x80\xfb\x4a\xdb\x98\x18\xe1\x33\x71\xaa\xfd\x68\x40\x1a\xf3\xba\xde\xf7\x84\x94\x9c\xd9\x56\x0b\xec\xb0\x33\xcc\x30\xa1\xdb\x49\x28\xbd\x8c\x83\x57\x8f\x91\x1c\x00\xe9\xcf\xfd\x13\x7e\x56\x47\xff\xe0\x12\x4f\xfe\xca\x01\x7c\x8a\x9e\xdf\x9a\x69\x1b\x28\x2f\xee\xc0\xbc\x39\x47\xf8\xa7\x3e\x66\x3e\xe3\x89\xad\x40\xfa\xff\x12\xf7\xff\x50\x92\xe3\x78\x9e\x18\x4e\x90\x11\x91\xdc\xdd\xfb\xcd\xb0\x3a\xbb\xba\xb8\xb7\xb7\x3b\xcc\xcd\xee\x2e\xce\xdd\xbb\x7b\xdc\xcb\xab\x2a\xbe\xdb\xdf\xec\xe2\x4e\x27\x3d\x3c\x49\xa7\x83\x74\x32\x20\xeb\x20\x47\x82\x89\xf7\xe4\xc0\x84\x09\x13\x26\x4c\x98\x34\x69\xd2\xa4\x49\x93\x26\x4d\x9a\x34\x69\xc6\x74\x06\x91\x7a\x04\x23\xb2\x22\xb3\xab\xa7\x7b\xe6\x9e\xa4\xea\x8a\x20\x93\x15\x9d\x8c\x2f\x40\x7c\xf1\xfd\xfb\xf9\xb8\x23\xb5\x4a\x64\x5a\xd3\x13\x07\x50\x60\x83\xf9\x5e\xcf\xb3\x9e\x8d\x99\x17\x5d\xd7\xc6\x65\x9c\xa6\x55\x86\x41\x8b\xa5\x41\xf6\x5c\x87\xa3\x3d\x26\x76\xf2\xc5\x39\xf0\x54\xc0\x5f\x6d\x73\x70\x93\xd9\xc5\x5a\x20\x6d\xba\x3a\x39\x3d\x03\x01\x48\xe8\xd8\xf7\xb2\x99\x0f\xc9\x23\x8f\x8e\xa7\x74\x27\xdd\xb4\x74\x66\x76\x52\x28\x3f\xcb\x8e\xa9\x46\x35\x8d\xe7\xc4\x0f\x3c\x07\x90\x38\x6b\xcd\x73\x15\xeb\xc3\x2b\x96\x82\x37\xf7\xbe\x3e\x64\x95\xfd\x3a\xb0\xbb\xbe\x6e\x0a\x4a\x39\x43\x24\x97\x10\x2e\xdc\x52\x0a\x8c\x75\xec\x78\x04\xe6\xb8\x70\x7f\x38\xee\xed\x89\x1a\x57\x9f\x4d\x65\x5f\x3a\x6a\x22\x3b\x0c\xae\xf0\xde\x7a\x79\x3a\x6e\x47\xcf\x77\x99\x3e\x69\xcf\x3f\x7a\xb3\xad\xcb\x33\x92\xc7\x56\x1c\xf7\xca\xdc\xbf\x7f\x73\x7f\xc3\x4f\x28\x1a\x1e\x55\x88\x2b\xcf\x96\x57\x62\x94\xa3\x0c\x65\xb9\x35\x17\x04\x8f\xc5\x2c\x24\x2a\xe7\x79\x61\x18\x27\x2a\x29\xc0\x7c\xb2\x41\x14\x1e\xbd\xdd\x40\x3d\xfb\xcb\xfb\xab\xde\x99\x97\xe6\xf7\xea\x4a\x64\xfb\xab\x74\xe3\xe1\x88\xbb\x39\x8c\x97\x23\xc2\x14\xe7\x94\xa6\x2e\x08\x83\xa6\x2f\xc0\x00\xa4\x81\x54\xd3\x85\x72\xac\x11\x3f\x50\x5d\x64\x0b\x32\xcb\x51\x92\xd4\xa6\x14\x8c\x26\xac\x92\xd8\x74\xa5\x9b\x1a\x34\x36\xed\x84\xc6\xd5\xff\xf7\x7c\x09\xe6\x8c\x4f\xfc\x57\x57\xe8\xc4\x3e\x87\xf2\xc2\xe3\xba\x8f\x4c\xc4\x4f\xba\x0a\xb3\x65\x74\xab\xf9\x14\xa3\xb0\xcf\xb4\xc1\x3c\x15\x04\xc1\x64\x49\xf9\xf1\x90\x2f\xa3\x06\xc1\x32\x1a\x77\x74\x78\x4c\x6c\xc2\x67\x60\xd6\x79\xa6\x4f\xf0\x86\xbe\xe8\x47\xdd\xe2\xf5\x67\x02\xab\x2b\x1c\x71\x7f\xbc\xa1\xc6\x4d\xd6\x4d\xc6\x78\x90\xf0\x06\xa4\x4b\x71\x39\x3b\x94\x8f\xa9\x5e\x1d\x1e\xbd\x9b\x5c\xe6\x7d\xbe\x8b\xef\x87\x82\x20\x00\x51\x71\x7e\xa6\x7e\x7b\x41\x45\xbc\x3b\x44\x5b\xc4\xf3\x0b\x64\x58\x9e\x86\xe2\xfe\xc3\xdd\x3e\xd6\x69\x1e\x96\x8b\x4d\xe5\x64\x00\x23\xd8\xb7\x77\xa4\xbd\xe9\x0c\x44\xec\x48\x07\x10\x1f\x44\x26\x84\xc2\x6e\x5c\xbf\xc9\x42\xb6\x9e\x8e\x30\x38\x91\xa8\x5a\xb2\x50\x72\xc2\x81\x00\xa5\xf2\xcf\x51\x7b\xd6\x2f\xb9\xe7\x09\xf1\xb9\xdb\x4f\xef\xc2\xe8\xab\xe7\x64\x50\x74\xe1\x7f\x7d\x0e\xc3\x46\x0f\x7f\x75\x26\x2c\x96\x4e\xa4\x19\xcf\x75\xd9\x92\x22\x49\x74\x82\xa1\x90\xaa\xe1\x93\x86\xc5\x51\xb1\xd4\x74\xab\xad\x6c\x93\x86\x96\xaa\x20\xfb\xc2\xb8\xa2\x19\x8e\x99\x93\x6e\x74\xbd\x94\xc5\xa4\x01\x6a\xac\xe8\x7b\x90\x85\xf9\x49\xf9\x1d\x11\xee\xa4\xc7\x0f\x86\x54\xe0\x0d\xab\x2e\x0c\xd0\x93\x88\xd4\x41\x04\x7f\xee\x51\x6b\x2e\x6d\xa8\x5b\x49\xd9\xdb\xfb\x37\x57\x5c\x36\xab\x05\x21\x4d\x96\x83\xc6\x05\x44\xf0\xbe\xd6\x61\xe0\xc9\x74\x35\x4f\x4d\x0f\xdd\x0c\x92\x83\x28\x28\x35\x46\xf0\x79\x35\x98\xdd\x68\x1d\x84\x58\x51\x82\xc2\xdc\xfa\x5c\xb6\x88\x8e\x3f\x75\xaf\xbb\xe7\x7b\xed\xb7\x7b\x35\x26\x2f\xc2\x60\xa9\xa9\xe2\x73\xd3\x86\xf4\x29\x58\xbf\x7c\xa3\xd3\xe6\x29\x40\xae\x07\xc5\xeb\xbb\x19\x87\xb6\x30\x7b\x58\x18\x1f\x37\x64\x3e\xce\xb3\xee\x21\x6f\xce\x58\xf2\x17\xfd\xf5\xe7\xe0\x6a\x0b\xb9\x49\xcd\x32\x18\x40\x0d\x9a\x1b\x5a\xf5\x70\xee\x2c\xaf\x9a\x43\xfc\x08\x77\xe5\x63\xbf\x6b\x9c\x59\x8c\xab\x5c\x47\x25\x06\x09\x40\xae\x35\x9d\x1a\x6d\x10\x46\xec\xc9\x7a\x2c\xf2\xdb\xe0\x2f\xaf\x98\x9d\xcf\xa1\xab\x0f\xcf\xf8\xde\x51\x15\xd5\x8e\x7b\x4f\xaf\x7b\x1c\x40\xeb\x03\xf7\x32\x0a\x28\x34\x25\x39\xc4\x66\x39\x9a\x85\x5b\x1b\x6a\x13\xc6\xa7\xb9\xea\x51\xd7\x6c\xb6\xb2\x3a\xfb\xa3\x7f\x42\x2f\xe4\xc3\x87\xfb\x1b\x42\x09\xd7\xb9\xa5\xf0\x34\x2b\x23\x40\xd0\x9b\x71\x04\xc1\xa2\xc6\x3e\x5d\xd7\xaf\x99\xe7\x33\x31\xfc\xa5\x13\x72\x74\x84\x9e\x3b\x21\x79\x55\x29\x5f\xd5\x8f\x7d\x27\xe4\x65\x4f\xfa\x5c\xfb\xb5\xed\x40\x2f\x82\x43\xbe\x9f\xfc\x27\x6b\xbf\x76\xd6\xe7\x93\x67\xc0\xb0\x6b\x3b\x3b\xb8\x11\x03\x7c\x74\x29\x98\x5c\x23\xe3\x8c\x5e\xea\xbf\xa2\x4c\x25\x29\xc5\x6c\xfb\xe9\x20\x06\xbd\x0c\x0e\x55\xb6\x06\x78\xa1\xa1\x71\x75\x6d\x5b\x60\xc2\x52\x37\x99\xa0\x42\x73\x41\x25\x67\x13\x28\xaf\x7e\x9a\x3d\x0e\x17\xba\x81\x87\xf4\x5c\xdd\xbe\xf5\x48\xfe\x28\x4e\x13\x9e\x9b\x23\x3e\xf3\x17\xbc\xf5\xc4\x5a\x90\xd2\x1c\x67\xa8\x80\xae\xb3\xae\xca\xb8\x31\x1e\xc9\x16\x4c\xa0\x3c\x8d\x97\xb3\x43\xfa\x43\xca\x7c\x4b\x04\x20\xcb\x14\xa6\xce\xb8\x99\x02\x03\xe6\xf0\x85\x46\xaa\xaa\xb3\x4e\xda\x9d\xf7\xd3\x2d\x97\xb0\x79\xed\x67\xc8\x9b\x0b\x15\xce\xfe\xe1\xea\x2b\x3e\x03\xda\x47\xef\xbf\x8a\x7a\x93\x15\x11\x43\x54\xa2\x62\x49\x90\x54\x23\x10\x16\x73\xcd\x33\xad\x33\xd0\xeb\xa2\x2a\xe4\x22\x4d\xd1\xeb\xee\x20\x0a\x25\x8c\xd5\x84\xb3\xae\x65\x80\x74\x8f\x93\xf7\x65\x50\x78\x74\x8d\xab\x0a\xc0\x41\x99\xe7\x4e\xb9\x16\x5f\x7a\xc0\xf9\x33\xbe\xd3\x5f\xfb\x5e\x0d\xcf\x3f\xf6\x0f\xc0\x57\x16\x86\xd7\x78\x6c\xb7\x1e\x03\x00\x78\x73\x74\xc3\x57\x8d\x14\x21\xac\xed\xa8\xc5\x61\x2e\x9b\x16\x60\xec\xec\x7c\x74\x0d\x01\x65\x4f\x32\x24\x4c\xc5\x5c\x02\x30\x28\x90\x6b\x5d\xdb\x84\x08\x68\xea\xc4\xd2\xed\x30\x86\x5c\x1f\xbb\xdc\x6a\x37\x55\x0c\x59\x6c\x2a\x24\xb1\x2c\x81\xa2\x86\x99\x6e\x49\x09\xb7\x0a\x4b\xd3\xea\xd6\x6c\x58\xb7\xfc\xc6\x1c\x48\xb0\xf7\x23\xf7\xaf\x2e\x5e\x76\xf4\xf0\x26\xb8\x7d\x17\x02\xdf\xf9\xef\x09\x01\x0f\x9e\xb1\xd3\x8f\x29\x78\x6e\x77\x0a\xdf\xef\x48\x65\xa5\x6a\x13\x0b\x68\x63\x8f\x0e\x16\x6c\xc8\xf2\xd8\x26\xca\xf5\xad\x50\x5a\x8c\xb5\x9b\x75\x46\x34\xd9\xe5\x92\x58\x2c\x0e\x44\xb7\xb2\x6d\x9c\x5d\x38\x18\xc3\x3c\x5b\x12\x17\x74\x69\x96\xe7\x43\xe1\x66\x89\x08\x56\x8c\xd5\x6d\x28\xd6\x69\x1f\x4b\x90\x82\xf4\x29\x70\x3d\x02\xa5\xe7\xcb\x00\xe1\xc5\xa6\xf9\xe7\x57\x9a\xee\xee\xf5\xfe\x73\x15\x2c\xf4\x69\xd2\x8f\x3b\x6a\xb3\x22\x1c\x4f\x23\x23\x00\x19\xd0\x33\x5a\xc2\x8c\x16\x5b\x34\xdb\x12\xc6\x40\x29\x5d\x0f\x44\xb9\x6e\x43\xdc\x8c\xd2\xe3\x64\x13\x4a\x63\x13\x63\x30\x9d\x68\x64\x97\x3c\xac\x05\x15\x80\x82\xcc\xa8\xcf\xfd\xc2\x70\x3f\xfe\x22\xee\x0e\x68\x4f\xad\xb5\x7e\x9b\x98\x01\x3e\xb5\x97\x33\x57\xef\xc7\xdf\xb3\xaa\x3a\x98\x85\xac\x4e\x69\x98\x3c\xa2\xed\xb8\x3d\x43\xcc\xf7\x9b\x7d\x81\xf3\xe1\xf6\x5d\xe8\xfd\xfb\x75\x12\x22\x14\xf5\xa7\xc2\x07\x87\x4b\xd5\xba\x99\x83\x34\x94\x53\x2b\xba\xf1\x99\xf6\x81\x38\xdb\xab\x09\xc4\xbd\x9b\x35\xc8\x7b\x6f\x87\x16\x1e\xdb\xa6\xf4\x31\xf0\x6f\xcf\x9e\xd2\xd9\x8d\x7e\x73\x07\x1e\xb6\x9c\xf9\xa5\x6b\x36\xdc\x1a\xba\x22\xd3\xd9\x76\x57\x5a\xdf\x79\x5e\x5b\x50\x80\x98\xba\xde\x19\xac\x06\x92\x9a\x14\x97\xae\x7d\x0a\xc4\x2e\x38\x2e\xa3\xc3\x14\x54\x61\x10\x1e\x97\x0e\x58\xcf\x30\x56\x33\xa5\x0c\x77\x75\x9e\x91\xa9\x70\x13\x86\x88\x05\x3e\xd6\x85\x6e\xca\x83\xf2\x91\xf8\xb7\xcf\x55\x91\x67\xb8\x92\xe8\x5c\xc9\xb0\xeb\xea\xbc\x0c\x33\xbb\x64\x16\x60\x38\x5f\xf0\xe4\x0e\x2a\x97\xfc\xf7\x43\xdb\x1e\x72\xb5\x24\xa0\x7f\x6c\xc1\xb0\xfa\xa3\xd5\x73\x7c\xff\xfb\xeb\xc8\xfe\xfe\x5d\x00\xbe\xfd\xee\xfb\xf7\x9f\xce\xfd\x82\xc1\xed\x6e\xff\xfe\xe3\xed\xbb\xf0\xe6\xe3\xa7\x8f\x61\x13\xa6\x79\x69\x71\x1e\x26\x8f\x59\xc4\xb5\x93\x4e\x01\x08\x04\xc4\xba\xe2\x1a\xb9\xd4\x65\x08\xc8\xc9\x1d\xdd\x54\xcc\xb6\xb2\x66\x98\xc8\x5e\x53\x52\x30\xa9\x27\xb8\xe0\xa7\x20\x25\x46\x42\x37\xb9\x06\xb6\x22\xd6\x20\x01\x45\x99\xa8\x06\xb0\xc2\x35\x3a\x2d\x65\x10\x7a\x5e\xce\xfa\x00\x83\x5f\x05\x5f\x05\x01\x48\xc0\x36\xe0\x77\xde\x33\xf5\x5d\x72\xa3\x3b\xf2\x31\x6a\x5d\x2f\x00\x25\x4e\x18\x50\x2c\x22\x54\x51\xb6\x08\x57\x29\x90\x87\x55\x58\x9d\xc6\xa5\x19\x6b\x10\x87\x7d\xa8\x5c\x72\xe9\x23\xde\x7a\xd7\x2f\x9a\xe6\xee\xe3\xed\x43\x78\x73\x97\x84\xd7\x61\x92\x30\x58\xfd\xcc\xdb\xf3\xfe\xb9\xbd\x87\x06\x74\x69\x6c\xe3\x34\x24\xa5\x36\x52\xe6\x46\xb3\x34\x77\x38\x7f\x0a\x06\xdd\x1f\x73\x87\x40\x82\x73\x93\xe3\x90\x73\xa4\x21\xdb\x11\x9f\x73\x99\x17\xe8\x90\x4a\xea\x84\x36\xa1\x75\x74\x99\x5a\x51\x83\x09\xb0\x50\x98\xa6\x68\xcd\xa9\x5b\xdd\x41\x8f\x87\x1a\x86\xe9\x13\xf3\x73\xf1\x4f\x2e\x56\x63\xb0\xbf\xf9\x16\x04\xfb\xf7\xeb\xc3\xfc\xba\x5f\xf0\x73\x62\x7b\xd7\xa9\x34\x01\x39\x40\xd4\xad\x2e\xf6\xd1\xd5\x14\xb4\x60\x76\x31\x04\x31\x80\x38\xb1\x19\x2e\x1d\x73\x4a\x44\x90\x09\xc6\x33\xc1\xf3\xf4\x20\x70\x96\xbb\x6e\xdd\xd6\x88\x6b\x7a\x05\xf2\x65\x5a\x48\x9e\x22\x0b\xc7\x32\x87\x22\xa2\x0e\xf7\xa9\x4d\xc8\xaa\x4b\x84\xc7\x3a\x95\x3e\xbe\x7a\xee\xa0\xdb\x00\x84\xb7\xb0\xe2\x77\x5b\xfc\x66\xcb\x37\xf8\x9c\xc3\xce\xd6\x45\x58\x2c\x15\x0c\x87\xd3\x31\x2f\xc2\x59\xb7\x82\x51\xd7\xba\x1c\xcd\x9d\x55\x0b\x82\xb0\x70\x16\x68\xe4\x34\x30\xe9\x41\xa6\x83\x19\x8d\x60\x66\xaa\x10\xd6\x53\xa3\x09\xd3\x8d\xa1\x72\xbd\xb8\xde\xdf\x3c\x41\x3f\x67\xdf\x79\x5f\xf4\xb9\x82\x60\xfb\x2f\xbc\x4e\xf0\x9f\xdb\x87\xc2\x09\x58\x47\x81\xf5\xdc\x42\x60\x70\x79\x58\xc4\x42\x21\x94\x62\x04\xb3\xc4\x09\xeb\xe1\x0f\xe8\x2e\x9e\xcd\x34\x99\xd9\x4c\x2e\x1f\x13\x1d\x73\x90\x2e\x38\xac\xcd\xe4\x63\x46\xc8\xe3\x7c\xfc\xd5\x67\x24\x8a\x2f\xf1\x20\xdc\xde\x45\x97\x38\xeb\xba\x9f\x77\xab\x03\xd6\xa6\x10\x26\xb1\x89\x89\x35\xd8\xf5\xa9\x13\x18\x14\xb9\xeb\x45\x58\xda\x10\x2f\xb5\x5d\xba\xbd\x9e\xa6\xa5\xc9\x33\x6c\xd2\x51\x40\x06\x06\x97\xf5\xba\x02\xe2\x34\x6e\x74\x4e\x31\x38\x5e\xfc\x40\xe5\xfd\xc0\x7f\x76\xe5\x07\xbe\xbb\x54\xfe\xdc\xbc\xff\xf8\x8f\x60\x8b\x9e\xdd\xc8\x53\x19\xf5\x8f\x3a\x2a\x0c\x66\x95\x12\x52\xeb\x4e\x0c\x32\xa9\x3a\x51\x1b\xfc\x0c\xe4\xd8\x67\x6e\xea\xfb\x41\x74\xad\x3b\x5a\xd6\x4e\xd9\xd0\xd2\xba\xae\x83\x20\xdc\x4d\x3e\x46\x26\xce\x9e\xf6\x43\x12\x6d\xe8\xed\xb7\x37\xdf\x47\x9e\x29\x24\xda\xc2\x9d\x85\x4a\x48\x29\x79\x85\x3b\xae\x31\x6e\x79\x65\x5b\x95\x62\x89\x0f\xc2\x29\x37\x6a\xcd\xa6\x7a\x99\x9e\x82\x6a\x06\xc2\xd5\x6e\x16\x7d\x68\xc0\x90\xb9\x69\x42\xf3\xf6\x8c\xcf\xeb\xb8\xee\x88\x8f\x3a\x05\xe0\xe1\xcd\xdb\xaf\x7d\x20\x6e\x7f\x09\x7b\x05\x5e\xc0\xf7\x1f\x77\x47\x1d\x8f\x5a\xd4\x4f\x81\x05\x90\x3a\x2d\xb5\x13\x38\x8c\x9f\x02\x85\xa5\x52\x3b\xe2\x70\x16\xc7\xa6\x63\xb3\x75\x55\x65\xc6\x75\x83\x18\x15\xc8\x41\x0d\x8a\xc2\x8d\x3d\xe9\x7c\x6d\x08\xba\x31\x3b\x1d\x7c\xb3\x21\x53\x7e\x7d\xf3\xcd\xbb\x6f\xd7\xed\xe0\x9b\xe0\xdd\x7a\x33\x1f\x42\xd8\xee\x16\x75\x26\x29\x4b\x10\x68\x59\xbb\x99\x00\xda\xe3\xc5\x74\xd8\x41\xd7\x31\x50\x81\xda\xa5\x86\x28\xad\x77\x3a\x51\xa2\x95\x13\x08\x98\x1b\x46\xfd\x14\x94\x76\x0c\x4b\x37\x39\x84\x0d\x0f\x4b\xa0\x4a\xd7\x0d\x64\x38\xfb\xf0\xc8\x8f\xe7\x59\xce\xaf\x7f\x0d\xce\x78\xf8\xe0\x26\x88\x42\xf0\xfe\xdb\xaf\xfc\x9d\xbf\xda\x17\x36\x89\x93\x9a\x2a\x3d\x48\x00\x95\x1b\x14\x76\x84\x83\x7c\x76\xad\x49\xb9\xa2\x07\x31\x0f\x1d\xa9\x5b\x3e\xb7\x2e\x71\x83\x04\x05\x38\x3a\xe8\x8c\x1c\x42\x0b\x64\xee\x86\x23\x04\x71\x10\x86\xc5\x13\xbe\xa9\x77\xc3\xd9\x17\x78\x48\x6e\xbc\xaf\x77\x06\x7c\x05\x5e\x50\x6f\x05\x57\x55\x06\x3b\xae\xed\x50\x01\x64\x9c\xb4\xd4\xc5\x1c\x30\x90\xb8\xca\x22\xa1\xf9\x6e\x70\xfd\x50\xd5\x03\x75\x73\xe5\x8e\xb5\x9a\x80\x76\xc6\x4d\xb2\x0a\x03\x80\xca\x63\x4d\xaa\xe0\xcf\x3d\x3f\xbb\x3a\xa8\xb3\x6d\xfb\x10\xfc\xce\x63\x2a\xfe\xe7\xe0\x7f\x0b\xfe\x8b\xb7\xcc\x2f\xe8\x5f\x67\x7c\xa1\x8d\xef\x61\x7f\x85\x44\xfa\xba\xc7\xe0\xd3\xc3\x99\x13\xe2\xb7\xe0\xf2\x3f\x7f\xb8\x02\x0f\xb9\x06\x4a\x7e\xbf\x1b\xb4\xc2\xa5\x28\x8a\x59\x9f\x88\x06\x49\x0e\x39\x81\xdc\x99\x08\x9f\x6a\x15\xa2\xa5\x39\xee\x4a\x97\x7b\x28\x82\xec\x11\x86\x89\x2b\x41\xe7\x0a\x29\xd3\x8c\x94\xf9\x6a\x4c\x8c\x34\x4f\x59\x92\xc9\x93\x11\x98\x70\x16\x4d\xa4\x90\x39\xee\x51\x21\x8b\xd2\x96\xa9\x49\x8a\x83\x1c\x98\x80\x04\x1d\x95\x3a\x62\x84\x98\x68\xdd\x44\x89\x3b\x3a\x46\x28\xe6\x1c\x53\xc2\x8b\xa2\x44\xb8\x69\x30\xce\x61\xd9\x2c\x18\x29\xcc\x30\xa5\x1c\x0b\x5a\x12\x56\x72\x5c\x50\x96\x73\x1a\xc4\x5e\x8f\xa8\x33\xfe\xe4\xba\x6b\xff\xa5\xef\x84\x24\x3f\xea\x07\xb9\x26\xbe\xbb\xc6\x68\x3a\x3b\x56\xd7\x3c\xb5\x87\x9b\xb7\x9f\xae\x68\x6a\x3f\xdc\xf9\x86\xe0\xbb\x0b\xa5\xf2\x3e\xce\xb3\x30\x7e\x64\x60\x4a\x53\xa7\xd6\x81\x90\x7d\x0f\x3a\x30\xba\x4c\x8e\xe3\x52\x80\x40\x83\x42\x83\xd4\x4d\xf3\x0c\xca\xe5\x58\x50\x0d\x39\xd2\xbc\x62\x8e\x28\xc5\xe6\xbc\xa9\x20\xc7\x0c\xa4\xab\xa3\x58\x0c\xc3\x53\x10\xb6\xbe\x8b\xb2\x3f\xa8\x02\x2a\x95\xe5\x6e\x74\x15\x97\x6c\x7d\x73\x15\x84\x10\x72\xe6\x89\xc8\x3d\x40\x2f\x2c\xa5\x01\x94\x15\x1d\x92\x65\x8e\xfb\x22\x91\x90\x0b\xc6\x19\x63\x6c\x38\xe3\xd3\x9b\x33\x2f\xcd\xdf\x04\xdf\x06\xff\x25\xf8\xbf\x5e\x20\xdb\xdd\x7c\xa9\x05\xe5\x39\x7f\xf8\xf6\xee\xfb\x0f\x0f\x5f\xbf\x7b\x1e\x90\x5f\xfb\x1d\xfb\x73\x21\xfa\xf7\xd1\xfd\xfa\xd1\xb7\x67\x6c\x2e\xdf\xcc\x75\xff\xfe\xdb\x2d\x17\xf7\x2b\xf0\x39\x92\xf4\xe9\x3e\x9c\xc7\x2c\x17\xa8\x00\x01\xcc\x34\x04\xa9\xcb\x3c\x4d\x5c\xf0\xa8\xc1\xe8\xe1\xf9\xb3\xc8\x10\x4c\x10\x76\x5d\xc9\x04\x28\x62\x15\xaf\xbe\x77\x9c\xa3\x42\x14\xeb\x06\x96\x25\xa2\x14\x84\x42\xc4\x29\x41\xe9\xdc\x62\x42\x25\x35\xd8\xa2\x01\x94\x84\xe6\x20\x75\x36\xec\x1d\xca\x80\xc9\x98\x40\x38\x21\x10\x16\x89\xc3\x50\xef\x87\x3c\xc7\xeb\x9f\x92\x49\x2c\x08\xe7\x44\x60\x47\xf3\x92\xc1\x1c\xb3\x24\x86\x98\x52\x2c\x1a\xab\x75\x6e\x94\xb4\x53\xe1\xda\x8a\x62\xc2\x64\x0f\x32\xc6\x50\xa9\x2d\x85\x14\x42\x51\xc4\x2c\x59\x66\x4e\x27\x99\x88\xa4\xc0\xfd\x86\xc3\xd8\x9d\xfd\xe4\x5f\x07\x69\xf0\x6d\xf0\x3b\x8f\x31\xf9\x9f\xbe\x14\xc3\x3d\xbb\x7d\xef\x5e\x5e\xdc\xda\xc9\xaf\x13\xb9\xbe\xcd\xec\xcd\xfd\x87\x7b\xcf\x0a\xf8\xe1\x7e\x0b\xf4\x46\x29\x18\xb4\xef\x7c\xb0\xa7\x02\x58\x97\x97\x3b\x9b\x43\x91\xa5\xa7\x58\x44\xb9\x1b\xc2\xe4\x51\x80\xd1\x19\xbd\xeb\xad\x31\x88\xe7\x79\x5a\x94\x99\x33\x80\x9d\x18\x38\x2a\xab\x94\xb5\x61\x52\xe4\x32\x2b\x0f\x39\xc6\x02\x4b\x89\xdd\x28\x30\x41\x45\x41\xf8\xba\xc8\xdc\x24\xb0\x3c\x52\x1c\xeb\x04\x8e\x12\x93\x65\x24\x24\xcc\x5c\xdd\x67\x98\x94\x04\x6f\x98\xa6\xdc\x3f\x47\x7f\xf5\x02\x69\xf7\xd2\x55\x7f\x91\xf9\xbc\x82\xde\x5e\x23\x68\xfa\x3c\xf9\xfe\xed\xdd\x87\xdb\xab\xd4\xf4\x95\xae\x79\xbf\x3f\x43\x04\xdc\x9e\x43\xbc\xc0\xf7\x78\x02\x6e\x40\x23\x84\x43\x61\xf1\x48\x56\xf1\x00\x73\x08\x34\x4e\x87\xf1\xba\x71\x83\x8c\x12\xcc\x10\x3b\x8d\x02\x61\x46\x42\x5b\xe6\x2a\x2b\x75\x9e\xe8\x24\x8b\x62\xf6\x18\x73\xe3\xc9\xf2\xfc\xeb\x90\x30\x36\xaa\x91\x29\xc5\x24\x55\x94\xd2\x89\x52\x97\x63\xca\x19\x43\x48\x22\x4a\x30\x61\x25\x23\x39\xa5\x39\x27\x47\x9f\x00\x36\x8e\x6d\x74\x85\x9e\xb2\xf0\xe0\xe3\xa6\xf2\x05\x2f\xff\x7f\xf8\xe5\xbc\xfc\x7f\x80\x96\xff\xd3\x5d\x84\xa2\xd9\x61\x30\x1b\x57\x19\x67\x35\x98\xd7\x3d\x29\x71\x33\xf0\x2d\x8b\x8b\x47\x75\x09\x0b\xcf\xd0\x4f\x77\x7c\x99\xb3\x30\x25\x24\x2f\x32\x94\x67\x95\xaa\x54\x65\x80\xcc\x1c\xdc\x38\xf9\x1b\x97\x83\xa1\x01\x90\xb9\x46\x4a\x49\x84\x10\x5c\x4a\x57\x7c\x81\x92\x9f\xcb\x8d\x9b\xb5\x3d\xeb\x87\xbd\xc7\x05\xf8\x37\xc1\xbf\x0d\x60\x40\xfc\xde\xf2\xcc\x0e\xfd\xfd\xcf\xd0\x43\x5f\x19\x6a\xd7\x04\xd0\xbf\x01\x57\x66\xeb\x67\xfe\x99\x8f\x67\x90\xf7\x9b\x00\x39\xba\x54\x05\x98\xdd\x5c\xe4\x75\x96\x2b\x98\xd3\xd5\xa8\x2f\x1a\x73\x6a\x6c\x9d\x65\xe0\x88\x20\x2b\x71\xad\xa4\xca\x63\x99\x90\xbe\x26\x21\xe5\x8c\x13\xb1\x08\x8e\x89\xe0\x95\x4e\x92\x10\xd2\x6a\x38\x22\xd7\x3d\x05\xa3\x6b\x21\x88\x1b\x8a\x0b\xc8\x3a\xc0\x2c\x71\x79\x12\xb3\x83\x50\x34\xd1\x15\x22\xb0\x40\x84\x7a\xdc\x55\x37\x69\x0d\xd2\x32\x77\x13\xa4\x84\x92\x74\x2a\x73\x9c\x69\x04\x31\x88\xb9\x25\x5a\x67\xb0\x61\x4c\x8c\x79\x96\x4b\xcb\x50\x61\x4a\xc1\xb1\x82\xb8\xc4\x45\xc1\xec\x48\x58\x92\xd0\x60\xc3\x7e\xd9\x30\x66\x7f\x13\xfc\xef\xc1\xff\x79\x85\x6d\xf9\xf0\x63\xb5\xea\x51\x4e\xdf\xdd\xbc\x7d\xf8\xfe\xfd\xc3\x37\xef\xae\x36\x99\x97\x2a\xf5\xfd\xdd\xdb\x0d\xdb\xf0\x55\xab\xa2\x47\xd1\xbd\xa0\x8c\xed\x4a\x58\x80\xa0\xcc\xaa\xac\x38\xba\xc2\xc3\x00\x8f\x8f\x22\x0c\x3c\x8b\x49\x71\xcc\x0a\x80\xca\xee\xb8\x5a\xc5\x09\x10\xce\xa4\x19\x41\x94\xb2\x32\xcf\x53\x05\x15\xe5\xd2\x40\x2b\x8a\xcc\xcd\x4d\xca\x18\x92\xb0\x4c\x11\x2a\x28\x2f\x40\xb0\xae\xaa\xba\x00\x69\xd8\x16\x99\xcc\x8a\x83\xa4\x8c\xd2\x8c\x20\x45\x25\x93\x72\x5d\x3a\xa8\x5c\x62\x91\x31\xa1\x94\x90\x92\xae\x5a\x98\xf0\xa6\x70\x43\x4b\x91\x42\x44\x35\xb2\x90\x59\x5a\x53\x9c\xa8\x04\xf2\x2c\x51\x45\x25\x71\x22\xd2\x02\x91\x92\xa0\x33\xbe\x23\xf6\x63\x96\xf9\x8a\x80\xd5\x8e\xf1\x56\x8c\x57\x86\x5f\xff\xca\xb7\x98\xde\x5d\x51\x3b\x7d\x7a\x77\xf3\xf0\xdd\xe7\x0a\xfc\x0d\x28\x7f\xf3\x81\x6e\x37\xf0\xeb\xb3\x4b\xb0\xfe\xf3\x77\xcf\xc4\x57\x67\xf3\x25\x50\x75\xdd\x28\x5d\xf3\x12\x70\xe6\x86\x04\x95\xa4\x28\xb3\x9c\x2a\xa8\x56\xaf\x39\x4c\x38\xa4\x94\x61\x6a\x3a\xd4\xc9\x9a\x61\x0c\x0b\xa7\x3b\x89\x31\xc3\xa7\x16\x4c\x36\xcc\x1c\x9c\x26\x3c\x3e\x05\xb6\x75\x13\x06\x45\xe5\x98\x67\xc3\x2a\xe0\x41\x52\x25\x64\xde\x29\x5e\x48\x03\xe2\x34\x29\x4a\x56\x16\x65\xce\xec\x98\xd1\x23\x4b\xdc\x84\xb9\x64\x42\x58\xa8\xa1\x6a\x11\x22\x4c\x2c\x9b\xae\xe9\xd6\xc5\xad\x7a\xa6\xd8\xec\x14\xa0\xbd\x90\xba\x01\x0a\x52\x42\x70\x70\x88\x3e\x63\x48\xfe\x7d\xf0\x8f\x9f\x19\xcc\x5e\xe3\x48\x5e\x6c\xbb\x17\x11\xa6\xb7\x7e\x68\x3c\xde\xcf\xbf\xfe\xf4\xe1\xec\xa1\xbd\xae\xad\xdb\x65\x06\x64\xe6\x4c\x65\x6b\x56\xed\xd6\x45\xeb\x26\x7c\x24\xa4\xc4\xf9\xfa\x60\x58\x9c\x73\x0e\x65\x31\xbb\x3e\x53\xca\x55\x66\x55\x49\x3e\xb3\x08\x2c\x48\x16\x7c\x39\x3b\x08\xc6\x98\xa6\x94\x52\xed\xc6\x45\xd3\x65\xdc\xfa\x4c\x81\xa8\x92\x12\x29\x8b\x79\x99\xd8\xa4\x59\xea\x70\xa0\x80\x0b\x21\x3c\xd8\x74\x70\xf0\xf8\xd8\xb5\xe7\x29\x5e\x3d\xa0\x75\x2f\xf9\x6f\xce\x98\x51\xe7\x3a\xab\x8f\xd7\x68\x76\xcf\x75\xa2\x17\x43\x63\xdb\x15\xc1\xc5\x82\xb9\xe2\x0c\xda\xc9\xba\x08\xb1\x59\x32\x03\xd2\x14\x18\x51\x94\x1c\x3a\xe5\x79\x0d\x12\x90\xc8\xf5\x8b\x4b\x2c\xb0\x60\x43\x98\x22\xc4\x20\x59\x30\x68\x92\xb8\x4a\x42\xe8\x4a\x05\x08\x71\xdc\x72\x07\x31\xc0\xc2\xc9\x83\xca\xf9\x29\x89\xf8\x49\x45\x47\xec\xe6\x5c\x52\xc8\x28\x61\x90\xd2\x69\x1d\x3d\xe1\xcc\xa8\x29\x67\x16\x52\xc1\x24\x77\x1c\xc2\x94\xe9\x1a\x55\xbe\x20\x95\x19\xd8\x06\x1b\x1e\x24\xf2\x79\xbf\xbf\xf0\x71\xe9\x33\x6f\xcc\x55\x9d\xc6\xdd\x9b\x2f\x9a\x01\xf7\x9b\x91\xfa\xf6\xfe\xdc\x34\xff\xe9\xc3\xfd\xb6\x7d\x46\x2c\xaa\x4f\x38\x4a\x97\x3c\x1c\x4e\x13\x98\xc3\xb4\x1e\x06\x2c\x28\xca\x28\x2b\x4e\x4d\x84\x7a\x3b\x8e\x4b\x12\xa6\x1d\x23\xc9\x53\xe0\x86\x74\x68\x8e\x14\xaa\x92\x1d\xe8\x52\x69\xa2\x88\x0b\x5c\xc1\xf5\xcc\x49\x6c\x13\x34\x68\xae\x1a\xa9\x74\x9c\xc8\x32\xd7\x59\xb5\x54\x5c\x60\xe9\x6d\xc7\x18\xcc\x67\x3c\xbb\xcf\xbd\xa5\x17\xfe\xa6\x3f\xc8\x76\xf9\x3e\xd8\x9f\x19\x2e\x5f\x40\x4e\xbf\xda\xf5\x23\x6d\xb2\x1c\x14\x19\xb4\xa8\x00\x6a\xeb\x7b\xf0\xaf\xfa\x04\x0d\x62\x1c\xa4\x61\xea\xab\xe2\xfc\x2b\x2a\x25\xb6\x98\x9f\xb4\x20\x8a\xa9\x28\xa1\xa5\x29\x68\x47\x32\x9b\xe1\x83\xc0\x84\x70\x52\x0a\xa5\xad\xb4\xca\x6a\x14\x0e\x9c\x71\x00\xb5\xb5\x6e\xb4\xd6\x0d\xd6\x4e\x55\x0b\x5b\x5b\xe0\x51\x09\x63\x6d\x5b\x74\x26\xad\xaa\x62\x8b\x05\xed\x42\xf8\x54\xde\xe0\x43\x19\xe4\xc1\xbf\x0b\xfe\x53\xf0\x9f\x9f\x63\x73\x97\x6a\xc0\x8b\xfd\xf6\x42\x2d\x6f\x7a\x66\xeb\x47\x79\xb1\x0c\x6f\xbe\x7f\xef\xb3\x41\x1f\xee\xde\x5e\x68\x41\xa3\xbb\x0f\x77\xa1\x06\x47\xc6\x88\x12\x56\x9e\x86\x5d\x62\x3a\x60\xb0\x10\x04\xba\x11\x29\xaf\x83\xe1\xec\x0c\x05\xf1\xec\x08\xc0\x45\x5e\xda\x9d\x11\xe7\xde\x6e\x9c\xe5\x4b\x0f\x46\xc1\x4f\x95\xa5\x22\x27\xa0\x46\x64\x5e\x9f\xc1\x7d\x90\x67\xb4\x28\x4b\x24\x38\x27\xd2\x4a\x42\x59\x4d\x56\xe5\x5b\xea\x9a\xcb\x92\x9f\xfa\x3c\xc1\xcb\x10\x75\xa7\x01\x93\x54\xa5\x08\x48\x9c\x67\xce\x84\x84\xb0\x61\xa6\x02\xad\x7f\x1c\x33\xc1\xce\xfb\x99\xf4\xe7\xc7\xe0\xfe\xd5\x18\x7c\xfc\xe5\x63\xf0\xf0\xe1\x3e\x0a\x40\x47\x29\x11\x5c\x8b\x25\x8d\x5a\xd5\x00\x81\xb8\xc0\xe5\x11\xcb\xb2\x48\x21\x2c\x7b\xd7\xd0\x79\x70\x0a\x94\x45\x56\x9a\x1d\xe4\xbc\x24\x19\x87\x10\x65\x99\x8b\x41\xc3\xe8\xe9\x28\xa0\xcc\x11\xb0\x10\x77\xd3\xf4\xd3\xf2\xab\x9a\xad\xf2\x4f\x79\x82\x96\xee\x4a\x7e\x81\xb2\xfc\x2c\xff\x48\xf8\xb3\xfc\x87\xd0\x9e\x71\x87\xff\xee\x8c\xd2\xff\xdf\x6e\x1c\x9e\xcf\xbc\x8a\x57\x85\xc1\xaf\xe3\xfa\x9f\x69\x6d\x36\x2e\xbd\xad\x74\xdc\x17\x63\x5e\xa9\xb1\x28\x01\xa8\xc8\x6c\x96\x86\x89\x9b\x32\x96\x67\xaa\x2c\x30\x21\x18\xb9\x1a\x09\x54\x66\x18\x67\xae\xa1\x9c\xe0\x12\x62\x54\x92\xd4\x1d\x41\x4b\x08\x98\x29\x72\x55\x18\x2f\xc7\xf5\x05\x85\x6a\x58\x15\xa5\x5a\x4a\x61\xf6\x0d\xa5\x19\xc6\x0a\x9a\x02\x22\x02\x51\xae\x8b\xd2\x95\x4e\x32\x92\xea\x14\x01\x06\x2a\xcc\x08\x2d\x0b\x96\x97\xaa\x6c\xb9\xac\x97\x5e\x38\x23\x5c\x43\x3b\xa9\x99\x55\x0d\xdb\xb8\xa1\xe2\x50\x9f\x71\x76\xb7\xba\xce\x8b\x6d\xff\xef\xfe\xc0\x3a\xf7\x59\xf4\xeb\x55\x7e\xf3\x53\x11\x84\x40\x67\x05\x48\xb2\xd2\xc2\x0c\x70\x27\x7d\x66\x74\x7d\x99\xc7\x19\x21\x7c\x04\x9d\x6b\xb6\xfc\x99\x6b\x2a\x43\xb8\x91\xd1\x44\x91\x29\xa9\xc4\x99\xc9\x90\xf1\x84\x4b\x07\x51\x70\x21\x68\x21\xb4\xb6\xab\xc5\xab\x43\xc5\x89\x06\xb4\xb5\xd6\xf5\x55\xb5\xbe\xba\x62\xb2\xb8\xa9\xab\x0e\x75\x75\x6e\xdb\xb2\xab\x32\xff\x7e\xce\x57\xe0\x3d\x7e\x8e\x0b\xfc\xab\x67\x1f\xf8\xe1\xdc\x1b\xeb\x09\xf0\x5f\xe0\x43\xec\x5f\xc2\x43\x54\xc7\x34\x33\x45\x3a\x2f\xbc\x3c\x67\x53\x41\xb7\xee\xf0\x08\xc1\xb4\x44\xb9\x1b\x52\x00\x19\x71\x24\x64\x5c\xaa\xfd\x54\x96\x05\xc6\x4a\x38\x2a\xed\x92\x88\x0b\xc8\x4b\x5d\x98\x5c\x22\x24\x35\xa7\x59\xea\xfd\xc7\xde\xef\x0d\x3a\xf8\x97\xc1\xbf\xf6\x7a\x75\xdd\xeb\xff\xe7\xe7\x95\xf7\x02\x6f\x7c\xa3\xc8\x7b\xe5\x2a\x7a\xe0\xf4\xfd\x87\xfb\xaf\x6f\x9e\xd1\xc7\x0f\x37\xdf\x79\xe4\xf1\xfd\xc7\x4f\xdb\xee\xbf\x85\x2f\x7b\x00\x4b\x24\x19\x3c\x72\x28\x8a\x12\xa4\x4e\x82\xb2\x59\xed\x10\xac\x60\x99\x21\x5c\x9e\xe6\x28\x59\x0a\x40\x62\x47\xc2\x5a\xc5\xae\x89\xe2\x0a\xc1\xaa\x3c\x86\x34\x97\xa7\xa3\x28\xaa\x28\x3e\x1d\x09\x83\xb2\x64\x7b\x4d\x30\x16\x52\x28\x4c\xb1\x50\x4b\xca\x54\xc3\x70\x6c\x12\x64\x14\x0b\x27\x88\x94\x42\xd0\x11\x5a\x96\xb4\xcf\x8f\x65\x4e\x65\x4e\x5c\x4c\x5c\x4a\x05\xe2\x2c\x08\x0e\x3e\x47\x55\x9d\xf3\x02\xef\xcf\xfc\x0c\xfe\x59\x3b\x3c\xd3\x1a\xbe\xbd\x7b\x8e\x2a\x7c\xfc\xb4\x7f\x9f\x45\x77\xdf\xbf\xbf\x3f\x44\x2f\x31\x32\x3e\x6e\x59\xb5\x0b\x0e\xdb\xa1\x45\xcd\x94\xe5\x21\x71\x83\x1c\x30\xa5\x0b\x24\x94\xd6\x6a\x04\x78\xb5\x76\x0b\x60\x3b\x50\x97\xf9\x98\x42\x1f\x7c\xe8\x29\x29\x51\x86\x72\x98\x2c\xa5\x99\xc3\x74\x99\xe4\x46\xa7\x2c\xb3\x14\x42\xa5\xb1\x29\xd0\x38\x23\x28\x84\x52\xb0\x4c\xb4\x0b\x4a\x94\xb9\x86\xbb\x66\x11\x98\xc4\x2a\xce\x72\x30\x2c\x24\x2a\x26\xa7\x85\xf4\x78\x1a\x3a\xe8\x6f\xf8\x41\xf9\x9c\x6f\x76\x46\xab\x0d\xbe\x00\xc7\x77\x21\x34\x7a\x7f\xbf\xd1\xe5\x7a\xf2\xbf\xb3\x10\x3a\xca\x6c\x94\x9d\xc6\xb0\xfe\x21\x0e\xab\xd3\xd8\xee\x59\x9b\xe7\xa0\xfb\x7d\x06\x7a\xdc\xea\x1d\x7c\x6c\x41\x0e\xe6\x3c\x5b\x54\xe6\xd0\xbe\xfa\x81\x98\x9d\x7c\x94\x07\x88\x90\xc2\x42\x60\x37\xbb\x06\x95\x4a\x49\x41\x5c\x0d\x61\xb9\xfe\xcc\x7d\x6f\x7e\xec\x6d\xcb\x97\x5c\x76\x97\xca\xf7\x3f\x88\x12\xff\x65\xb2\xa5\xa8\xd8\xad\xeb\xb6\x7c\x1c\x41\xe1\x9a\x50\xd8\xad\xcf\xc9\x2a\x7b\xaa\xa2\xc6\x71\x70\x74\xb1\x71\x41\x18\x38\x6e\x42\xbd\x70\xdf\x25\x82\x24\x5b\xbd\x14\xcf\x3c\x32\x5a\xcf\x6b\x21\x97\x81\xab\xe3\x51\x71\x80\xa9\xeb\xe8\xaa\x8f\x3a\x9f\x03\x14\x2f\xb8\x53\x36\x5e\x9f\x6b\x54\x9c\xab\xef\xbc\x1a\x4c\xfb\xad\x5a\xee\x65\x1f\xc9\x35\x1b\x51\x31\x1a\x50\x98\x71\x04\xd9\x32\xfb\xd6\xf3\x6a\x39\x82\x7c\x04\x62\xb5\xd7\x7a\xef\xe8\x57\x20\x59\xd0\xf3\x59\xc7\xb4\x1b\xe0\x14\xe2\xae\x25\x6d\xb7\x91\x9b\xab\x46\xc9\x25\x0d\x27\xa9\x9a\xa6\x59\xe2\xba\xae\x5d\x5e\x55\x95\xab\x38\xc3\xba\x60\x25\xd7\x0a\x9e\xeb\xe9\x36\x3b\xfe\xdf\x6f\xbc\x9e\xd7\xf1\x91\x37\x77\x1f\xee\xdf\x78\x06\x98\x73\x10\xe0\x61\xb3\xd5\xbd\xfd\xeb\xdb\xaf\x6e\x2f\xff\xfc\xf6\xb3\xa9\xf8\x1c\x46\x89\x08\xa8\x14\xb0\x8c\x39\x0a\xca\x59\x72\xa5\xb8\x9c\x5d\xa7\x5c\x9b\x80\x40\xea\x42\xb0\x3a\x96\x4c\xcd\xa0\x74\x04\x54\xbe\xe8\x82\x84\xc5\x06\x7c\x74\x48\x18\x9b\xe4\xec\x72\x02\x8a\xae\x7b\x9c\x00\x74\x3d\xb0\x74\x99\xc2\x94\x3a\x0a\x8a\x4e\xb0\x06\x4c\x20\x68\x7b\xd7\x61\x30\x48\x2e\x19\x63\x13\xe7\x5b\x3e\xef\xc2\x7f\xbe\xa1\xcc\xbd\x96\xe9\xee\x85\x4c\x77\x9b\x4c\x5f\xff\x58\x28\x7f\xed\x47\x52\x85\x23\x18\x34\xe8\x85\x70\x05\xa0\xee\xa8\xa4\xd6\x52\x81\xd8\x59\xed\x74\x02\x72\x55\x43\xc1\xbb\x58\x49\xe5\x8e\x31\x60\x1b\xe1\x65\x98\xbb\x3c\x64\x1e\xc4\xb2\x38\xa4\x94\xce\x72\x76\x19\xfd\x91\x64\x45\xb1\x89\xc6\xeb\x8b\x68\x45\x0e\xc6\x17\xb2\xfd\x99\x7f\xe6\xec\x01\xbe\xe2\xec\xf9\xbb\x0b\x07\xd3\x2b\x7f\xfe\xfe\xb5\x57\x15\xbd\xdc\x07\x7d\xbb\x4a\x84\xa3\xbe\xf3\x7d\x98\xd9\xa3\x04\xc5\x53\x00\x82\x61\x03\x4e\x37\x20\x5e\xe8\xe5\xac\x5b\xff\xe1\x29\x60\xa4\x19\x71\x17\x12\x10\xd7\xb4\x9a\x0f\x70\x29\x6a\xdd\x68\xdd\xe8\x1a\xd4\x5a\x6b\x87\x8d\x31\x2e\xaf\x6b\xd7\x34\x4d\x2d\x0c\x33\x48\x33\xad\x0d\x0f\xfe\x2c\xca\xbe\xc8\x23\xf8\x2f\x7d\xbf\xdb\xcf\xf1\x08\x5e\x2a\x3e\xae\x58\x04\xf5\x33\x26\xea\xfa\x9a\x57\x95\x63\xaa\x0a\x94\x95\xb6\x27\x11\x1d\x79\xaf\x41\x90\xbb\x76\x18\xdc\x91\xce\x35\xd3\x1c\xa4\xd4\x54\xcc\x93\x08\xfa\x35\xec\x3a\x47\xc5\x46\x22\x28\x79\x2d\x60\x7c\xe6\x10\x84\xc5\xc0\x89\xe7\x10\xdc\x85\xf3\x13\xbe\x69\xae\xf8\x79\x7e\xb4\xb6\xdf\xdc\xfd\xf5\x85\x44\xf3\x8b\xd4\xa9\x6f\xb6\x55\xff\xe1\xee\xed\x65\xd5\x47\x69\x6f\x80\x35\x7d\xef\x46\x50\x3b\x0c\x6a\x07\x93\x30\x73\x54\x02\x48\x9c\xd4\xb1\x74\x1c\x81\x82\x3b\x01\xfa\x24\x76\x0c\x54\x3e\xf4\x3c\xf5\x51\xbc\x7e\x66\x9d\x27\x03\x92\x43\x4e\x08\x21\x6a\x66\x8e\x27\x54\x32\x6d\x60\xc5\x41\xe2\x7a\xac\x61\xad\x8b\x52\x72\xa0\xd9\xcc\x39\x77\xb1\xd6\x3a\x08\x77\xe6\x5c\xe7\xf3\xee\x19\x3b\xe9\xed\xd7\xe1\xee\xe6\x05\xce\xf7\xc7\xdb\x2f\x5d\xf7\xd1\x8b\xce\x24\x19\x28\x6a\x77\xac\x10\xb0\x7c\x8c\xcb\x3c\xa7\x59\x5e\xb2\xb6\x92\x69\x02\x92\xd6\x0d\x2d\x04\x83\xec\xcb\xa4\xc8\x59\x56\xe4\x05\x69\x0f\x22\x43\x50\x95\xae\xe9\x0b\xcd\x81\x4c\xb0\xa7\xe6\x2a\x59\xbb\x8c\x28\xcb\x15\x74\x72\x86\x46\x81\x1e\x27\x10\x33\x88\x8a\x42\x56\xc1\x9f\xf9\xf8\xe5\x6b\x8e\xb1\x0b\x4e\xdb\x1f\xc9\x31\xf6\x19\xd5\x39\x08\x73\xe3\x78\x48\xc2\xd4\x38\xb9\xcc\x8a\x21\x2a\x43\xa9\x09\x22\xd2\x1d\xd3\x4a\xa0\x3e\x6c\x53\x2b\x60\xe7\x86\x2a\x07\x9d\x59\x88\x01\x2c\x9d\xc2\x6a\x21\xbe\x87\xe4\x8f\x60\x19\x43\x4e\x6d\x34\x63\xc1\x4d\x68\x7c\x2f\x61\xf1\xfc\xac\xe7\xc1\xbf\xf4\xdd\x25\x1e\x9c\x75\x75\xa7\xef\x7c\xf4\xdc\xdb\x3f\xeb\x6e\x76\x17\x46\x9f\xa3\x47\x61\x74\xff\xe0\x2b\x9b\x5e\xed\xcb\xfb\xdc\x68\x63\x97\x5a\x5b\x4f\xbf\x61\x0c\x98\xc3\x3c\x35\x44\x52\x4e\x98\x46\x86\xa8\xac\xa8\x33\x8c\x93\x53\x76\x21\xe3\xcf\x1f\x83\x10\xba\xec\x50\xa8\xd6\xe1\x56\xed\xa0\x6b\x5a\x97\xd4\x2e\x69\xdb\xa8\x71\xd8\xb5\x46\x48\x6e\x2c\x55\xcc\x02\x08\xb2\x63\xdb\x4f\x8f\x42\x6b\xad\x8d\xd1\xeb\x3e\xc7\x7d\x2c\x4c\xbd\xd0\x39\xbf\x3b\xf3\x54\x9d\x77\x37\x9f\x0f\x3e\x43\x73\x7a\xd4\xce\xb7\x6f\x5e\xb0\x84\xbd\xf9\x02\x17\xca\x05\x93\x64\x5d\x4a\x7b\x9e\xa7\xa0\x77\x15\x28\x4f\x38\xa9\x14\x43\x60\x4a\xb3\xae\x32\x55\x55\x01\x58\x69\xeb\x26\xad\x28\x55\x6d\x46\xca\x3c\x96\x29\x96\x15\x75\x43\x97\x57\x1a\xe9\xe3\x41\x11\xa6\x7a\x97\xba\xc2\x19\x3c\x01\x0e\x92\xb0\xc5\xd0\xa5\x7d\xdf\xf7\xce\xb3\x8e\x0c\x8e\xb9\x23\x64\x5c\xc1\x2a\x4b\x72\x56\x58\x84\x7c\x74\x08\x71\x54\xa0\xb0\xee\xd4\x96\x27\xa1\x57\xbc\x70\xab\x4e\xfd\xf7\x01\x7a\x66\x30\x7f\xe6\x85\xdb\x7f\x66\x11\xfb\xfa\x4f\x23\x86\xe3\x55\x5a\x84\xec\xb1\x03\x79\xd1\xae\xd6\x2a\x58\x17\x80\xc2\x22\x49\x00\x42\x39\x46\x14\x61\x69\x37\x62\x38\x55\x64\x98\x21\x05\xd9\x6c\x4a\xd6\x95\x89\x4a\x61\xe1\xe6\x81\xb6\x12\x0a\xa5\x76\xa9\xff\xb7\x83\xca\x70\x79\xca\xa2\x11\x9f\x48\xd8\x1f\x19\x81\xb6\xcd\xf3\x8c\xc7\xa6\x80\x90\x21\x48\x73\x99\x5d\x88\xe1\xe4\x0b\x62\xb8\xb6\x7c\x26\x86\x6b\xfb\x0b\x31\xdc\x21\x0a\x9e\xb0\xc7\xd5\xbf\xe0\xfd\x6c\xec\x91\x97\xda\xa9\xe7\xbc\xcf\x9b\xfb\xef\xae\xce\xa3\x21\x9c\x96\xd4\x80\xc6\x21\x63\x7a\x6b\xfb\x3e\x9a\xf4\x68\xcc\x38\x1e\x8a\x25\xd7\xa0\x59\xe0\x89\x73\x1e\xad\x26\x56\xa0\x3f\x9f\x06\x51\xd8\xfb\xfe\x17\x1e\xfc\x45\xf0\x1b\xcf\x61\x74\x15\x43\x8c\xbe\x88\x2f\x78\xa9\xbb\xf8\x70\xa9\xbb\xb8\x3f\xd7\x5d\x10\x50\x69\x50\x39\xa2\x1d\xa1\xbd\x01\x9d\x19\x06\xe3\x4a\xd3\xe7\x3b\xec\xba\xbc\x84\x99\x8d\x51\x6d\x78\x53\x38\xcd\x00\xcc\xdd\xb4\xaf\xba\x4e\xf7\xbd\x3b\xae\x0f\x8b\x9e\xe7\x79\x76\x83\x76\x3c\x4f\xcb\xa6\x98\x38\xa4\xa0\x73\x65\xab\x0d\xa0\x41\x10\x46\xc9\x13\xba\x61\x07\x1e\xfc\x6a\xab\x93\x7c\x8e\xb7\x84\xe7\xee\xb4\x17\x86\xde\x45\x0d\x7d\xdc\x35\x16\x86\x09\x33\x52\x62\x47\x74\xcb\x41\xd2\xa8\xaa\x06\x99\x1b\xc3\xce\x8d\x20\x73\xfd\xaa\x71\x4a\x33\x1c\x78\xa1\xd5\xdc\x91\xba\x72\xc7\x8a\x83\xd8\xd5\x92\x64\x83\x5e\xed\x21\xdd\x9b\x53\x4a\x48\xd4\x16\x41\xb0\x8b\xb2\x27\xe9\x6b\xb8\xff\x7f\x3e\xb3\x7f\xc1\x29\x7b\x26\x71\xb8\x22\x0f\xfe\x36\xba\xaa\xfe\xdd\x93\x32\x03\x83\x3d\xcd\x16\xb4\x59\x0e\x68\xd3\x48\xdb\x8f\xd4\x1e\x09\x88\x4d\x64\x57\x53\xd8\x27\x3a\xd5\x41\x32\xe9\xf4\x30\x03\x45\x89\x2b\x6c\x27\xbb\x0e\xab\x89\x1b\xe1\x8c\x71\xdc\x78\x64\x92\x20\xd8\x87\xd3\x39\xaf\x78\xcd\xcf\x72\xcd\x42\x72\x6e\xd4\xff\x12\x3f\x4b\x94\x8f\x16\xa0\xd5\xca\x4d\x1e\x31\xc8\x46\x20\x57\xcf\x3a\xe4\x76\xb1\xd6\x86\x74\xf1\xaf\x8d\x9b\xe5\x0c\xae\xb4\x5a\x1f\xcb\x74\xe2\x4a\x45\xda\x75\xd5\x85\x9b\xa5\xf2\xdf\x01\xfb\xe7\xf4\x2f\xb7\x1a\xee\xdd\xfe\xcd\xb9\x4c\xfc\xc3\xc3\x9b\x6f\xc1\x19\x11\xe3\xb9\x53\x81\x69\x67\x9c\x8c\x8a\x23\x80\x8f\x79\x03\xd6\x39\xd0\x8e\xa7\xaa\x9a\xf9\x10\xca\xa1\x15\xf5\x70\xc0\x9a\x64\x4f\x81\x71\xd0\x98\x68\xc8\x4f\x01\x68\x17\xc1\x46\x63\x44\x6f\x5a\xd5\xeb\x00\x44\x43\x14\x7b\xd9\xdf\x7e\x7e\x5e\xb7\xa0\xcb\x05\x5f\x6f\x57\x82\xdc\x00\xee\x06\x3e\x89\x5a\x18\x51\xd3\x5a\x74\x7b\x33\x8e\xba\xb2\xba\x6a\x9c\x00\x66\x54\x52\xf6\xbe\xd7\x04\xf9\x5a\xaa\x2b\xec\x40\xf0\x8b\xb0\x03\x23\x04\xf4\xea\xf1\x67\xc0\x9e\xb2\x70\xac\x20\x02\xe8\x91\x87\x16\x3b\x48\x0a\x93\x93\x88\xd9\xc5\x54\xd5\x6a\x1e\xed\x5b\x0c\x0b\xc2\x0c\x2c\x1a\x65\x4c\xed\xc1\x03\xc5\xc2\x97\x1c\xe3\x70\x70\x09\x20\xc1\x2e\xb4\x67\x3e\x8d\xbf\x7c\xee\x9c\xfd\x42\xaf\xe0\xc7\x1f\x35\x0b\xee\xe2\x48\xc2\xb2\x85\x2c\x53\x90\xa4\xf9\x92\x0d\x5a\x90\xa8\xf3\xcd\xb2\x4b\xbd\xee\x40\xaa\xeb\x7c\xb7\x60\x6b\x52\x9b\x32\x5f\x73\xed\x18\x39\x02\x05\xd2\x97\xed\x82\x51\x94\xff\xc9\xfd\x27\xed\x08\x66\x97\x40\x4c\x71\x46\x68\xb2\xfa\x13\x75\x5b\x82\x0e\x70\x03\x89\x26\x8b\x61\xc8\x40\xb6\xf5\x9f\x40\xfd\xb9\xff\x44\x87\xf5\x8f\xfb\x4f\x76\xe1\xd1\xdb\xd9\x5f\xa8\x1d\x7d\x2e\x81\xbe\x79\xff\x31\x6a\x23\x74\x6a\x2a\x5f\x51\xd6\x8f\xca\xc8\xc1\x35\xba\xe9\xe4\x73\xe9\x28\x7e\x0a\x5c\x4f\x40\x0e\x12\x84\x9d\xe9\xc5\xf1\xdc\x07\x82\xfc\xef\x7e\xbf\x79\xb4\x5f\xbf\x4c\xbb\x5e\x33\x5b\x6d\xe5\x6b\x1f\xbd\x17\xcb\x5d\x9a\x80\x9e\x31\x2c\x72\x8b\x0b\xd7\x25\x49\xa5\x39\x97\x48\x8b\x31\x77\xa3\x05\x5d\xe2\xe2\x43\x62\xb4\x78\xac\x28\xcb\x6c\x86\x23\xc3\x71\x3d\x88\xd6\xf4\x86\x8d\x40\x3d\xf2\x7d\x2e\x74\x10\x44\xfe\xfe\xec\x90\x9e\x71\x0e\x7f\x5c\x83\x0e\x2e\x84\xc0\x8c\xf3\x92\xe4\xa2\xc4\xa7\xa3\x01\x85\x9f\xc9\xbe\x3f\xa4\x3f\xc4\x94\x25\x36\xc1\xfb\xf2\xf7\xdd\xa1\x77\xe8\x34\xab\x70\x95\xab\x3c\xe7\x68\xdf\x7e\xc6\xa4\xf9\x0a\x6c\xac\x95\x61\xf4\x3e\xb8\xbd\x8b\x34\x50\x16\xb4\x4e\x54\x20\xa6\x63\x65\xf5\xc8\x41\xaa\x5d\xbd\x8f\x01\x77\xda\x2c\xcd\x53\x50\xcf\x60\x7c\x3c\xee\x12\x47\xdc\xa4\x00\x0e\xe3\x20\x0c\xd4\x3a\x17\x3b\xf6\x5c\x37\xe5\x2b\xbe\xdf\x6d\x55\xe0\x1b\x73\xf5\xb9\x62\xab\xb1\x09\x62\x1d\x35\xa6\x9d\x00\xc1\x4b\x7b\xe4\x0b\x11\x60\x04\xc8\x21\x2d\x94\xd4\x3b\xd6\x57\x56\x0d\xc7\xd2\xd5\xed\xa4\xaa\x09\x1c\x5d\x76\x34\x15\x18\x41\x8a\x5c\x53\xf1\x6e\xc3\x27\x82\xa1\xbd\xa9\x0e\xda\x8f\xcd\xb9\x1a\xde\x17\x96\xfb\xa6\xe0\xbb\x9b\x5f\x81\x55\xb1\x66\x55\x09\xc3\x49\x57\x40\x81\x8c\xbb\xde\x21\xc7\x96\x01\x47\x18\x74\x0b\x31\x85\xa2\x18\xd4\x07\x5d\x20\xa4\x8c\xa0\xd2\x5a\x31\x62\xc3\x81\xe5\x39\x2a\xf4\x10\x44\x01\x7f\x2a\x6f\xea\x7d\x15\x24\xe7\x4a\xb4\x87\x24\xf2\x95\x9d\x5f\xdf\xfb\xca\xac\xaf\xb6\x07\xec\x2c\x57\x5d\xe5\x80\x87\x09\x59\x66\xd7\xc6\x76\x61\x04\x40\x20\x94\x93\x46\xb4\xba\xdb\x55\xda\x36\xb2\xdb\x57\x8e\x3f\x05\x4b\x33\x56\xc7\x30\x88\x5d\xec\x8e\x46\x00\x0e\x86\xb9\x74\xd5\x91\x1c\x41\x8e\x9c\x69\xc5\xb8\xf9\xc7\x5b\x7f\xe5\x57\x9e\xed\x30\x00\x0f\xe7\xc2\xbe\x77\x37\xe1\x3a\x9c\x1f\xff\x29\xf0\xcb\x6e\xdd\x72\xaf\x75\xda\xed\x79\xe1\x7d\xbb\xd5\xb0\xef\x7b\x1b\xf3\x52\xf1\x8a\xb7\xb4\xa5\xd8\x4d\x44\xd6\x85\xb3\x88\xf1\xa6\x51\x94\x41\xa8\xa9\x62\x83\x58\xb7\x2f\xc6\x4a\x90\x03\x23\x13\x24\xd1\x41\x9c\x8e\x55\xc7\x8e\xed\x72\x1c\x0d\x08\x80\x76\x74\x52\x1c\x70\xd0\x46\x81\xce\x33\xd7\x19\x2b\xb8\x66\xe4\x34\x46\x49\x57\xc9\x23\xa0\x06\x24\x69\x62\x0a\x37\x67\xae\x7f\x0a\x20\x88\x83\x20\xdc\xf1\x67\x19\xd2\x2f\x4a\x10\xfd\xf4\x77\xec\x7e\xe6\x7b\x00\xfd\x7c\x23\x10\x65\xbe\x3f\xec\x8f\xa8\x33\x8d\xe8\xfa\x2c\x03\xee\xc1\x75\x7c\x79\xc6\x1c\x73\x55\x96\x19\x82\x65\x9a\xb9\xca\x7a\x8f\x4f\xef\x82\xa3\x9e\x67\x7d\x54\xb3\xcb\xc7\xd8\xc4\x08\x40\x5f\x67\x3a\x07\xe1\xd9\x1e\x12\x97\xba\xbd\xe8\xb9\x6c\x2f\x78\x9e\x9e\x55\xb8\xdd\x68\xe3\xb4\x63\xca\x4e\x06\x40\xe6\xac\x14\x0e\x93\x7e\xc6\x6e\xd4\x58\x28\x71\x10\x0b\xe4\xed\xc0\xdc\xb1\x75\xe9\x64\x41\x01\xfa\xe5\x38\x2b\x09\x38\x68\x80\x2e\x1d\x73\x13\x01\x59\x70\xae\xab\xae\x3e\xd7\x25\x46\xbe\xfc\x32\xdc\x3f\xdf\x30\xf8\xea\x7c\xc3\xc6\xc6\xd9\x28\x54\xe5\x8e\x35\x20\xcc\x09\x23\x5c\x4a\x26\x90\x10\xd7\x69\xa2\x95\x5e\x6f\x99\x50\x7f\xcf\xce\xa5\xa3\x05\x25\x18\x96\xf9\xa8\x14\x60\xa0\x06\xe6\xf3\x3d\x81\xe7\x76\xab\x7c\xbd\xd7\xb3\xae\xd8\xf0\xc6\x82\x73\x75\x62\x70\x01\x1d\x0b\x27\xd0\xf8\xc1\x8c\xc3\x7c\x19\x40\x00\x38\x71\x72\xaa\x1d\x22\x60\x10\x2e\x0d\xe3\xd8\xa1\x8d\x92\xc4\x8c\xb0\xb4\x2e\x6b\xab\x11\xf4\x8e\x3c\x05\x1a\x64\x40\xdb\x12\x8e\xbe\xf7\x61\xab\xbd\xfc\xe6\x85\x6e\x0a\xbc\x6e\x02\xef\x3f\x06\xb7\x77\x21\x0d\x4b\x1b\xc2\x65\x9a\x00\xa7\xae\x9b\xec\xe8\x6a\x66\x01\xa3\xcb\x71\x37\xad\x26\x82\x59\x8c\x9b\x1b\x10\x87\xf1\x29\x8d\x8e\x2e\x71\xbd\x52\x61\xea\x31\xea\xc3\x30\x7b\xaa\x7c\xdf\xd5\x56\x85\xbf\x21\x3d\x3e\xe3\x3c\xdc\xde\x81\x37\x77\x51\x28\x77\x76\xa9\x51\x58\xf6\x3f\x68\x50\x32\xd7\x03\x84\x1d\x89\xac\xc3\xfc\x10\x1b\x97\x9d\x6a\x63\xc2\xc6\x80\xf1\x87\x3e\x6c\x16\xb4\xf5\x6c\x0c\x4f\xe5\x4d\x7b\xee\xd9\x78\x78\x73\x17\xbe\x49\xbe\xf2\x30\xab\x87\xfb\xbf\x0d\xdf\x24\xb7\xf7\xc9\x0b\xc8\x3f\x9f\xdc\xb9\xff\xf0\xb0\xe3\x06\xd8\x34\xcf\xcb\x4c\xa5\x9c\x70\x11\x1f\x33\xc1\x39\xc6\xd4\xcd\x02\x64\x48\x29\x4e\x49\x12\x1f\x8f\x07\xe1\xac\xc3\xae\x77\xa3\x9b\x40\x91\xb9\xb9\x02\x05\xa8\x41\x00\x90\x3b\xf6\x4a\x2b\x4e\x1d\x9e\xe5\x11\x34\x4a\x30\x44\x4c\x63\x82\x0d\xf7\x0e\xde\x88\x83\x0c\xfe\x76\xdd\xc1\x6e\xaf\x99\x22\xcf\xad\x39\xdf\x6d\x4d\xfc\xd1\x06\x54\x77\xe7\x01\x4b\x54\x58\x64\x99\x49\xb3\x5d\xfa\xd8\x66\x79\xa4\x44\x37\xac\x33\xd9\xb8\xc1\x0d\x8e\x23\x20\x8f\x23\x41\xb5\x6b\x29\x68\xe4\x72\x8c\x02\xda\xd5\x64\x1f\xd4\x7d\xd2\xd6\x56\x72\xe3\xba\x46\x73\x4b\xfb\x9e\x55\xb8\x1e\x41\xe2\xa8\x1b\x25\x68\xc2\xc4\x89\xd9\x9a\x63\x70\xe9\xc7\x69\x3d\xae\xcc\x37\xbe\x9b\xe9\xdc\x8f\x73\xbb\x79\x63\x67\x58\xc9\xd5\xf1\xf4\x5b\xf8\xdd\xf6\x4c\x9b\xb9\x13\xfd\x18\xdb\x0c\x36\x59\x16\x57\xb1\x74\xa3\xa5\xa1\xb2\xac\x62\xe6\x34\x57\xa5\xb5\xe6\x20\xab\x5e\x4f\xd6\xe9\xc7\x26\x4b\xd3\xbc\x29\x67\x8e\x68\x34\xb9\xce\x69\x04\xc4\x3a\x6e\xc8\x99\x12\xf8\xba\x78\xfd\x44\xfd\x7c\x7d\x7b\xc6\x3f\xb9\xfb\xf0\x0c\x1f\xb5\x75\xda\xbc\xf0\x0b\xdf\xdc\x85\xb3\x06\xf9\x32\x85\xa9\x0e\xd1\xd2\x80\xc2\xb8\xb2\x64\x03\x49\xaa\x14\x43\xd7\xf6\xd4\xa1\x1d\x5e\x8e\xa1\xb6\xab\x05\x6c\x17\x1e\xc6\x0b\x73\x2a\xcf\x60\x5d\x4c\x65\x89\x18\xd8\xb8\x95\x7c\x5f\x1e\x3f\xe4\x67\xdb\xed\x8c\xa0\xf1\x5a\x3f\x3d\x77\xd6\xac\x4f\xe3\xb8\xcb\x5c\x1e\xa2\x54\x6a\xc2\x33\x81\x51\x99\x3a\x66\x5d\x40\x81\x75\x24\x44\xa0\x74\xb9\x9b\xf2\x43\xbe\x6e\xca\x8e\x0c\xeb\x7e\x0f\x82\xd3\x31\x8a\xc3\x6c\xab\x6b\x5b\xf0\xfa\x95\x56\x99\x9b\x27\xe3\xfb\x6c\x6e\xbf\xdc\x71\x18\x05\x3b\x71\x2e\xb9\xcf\x1f\x93\x30\xf7\x68\xf3\xd9\x21\x31\x4b\xb5\xfe\x35\x21\x31\xe1\x3a\x76\x81\x7a\x82\x37\x3c\x92\x5e\x0b\xbd\xc4\x18\xbb\x28\x57\x0f\xd8\x9e\xd9\x2c\x07\xc4\xac\xe3\xb5\xba\xcf\xe6\xd4\x44\xc8\x21\x4c\x59\x17\xd1\x1c\xc3\x61\xd0\xa3\x71\x16\x50\x33\x32\x2c\xaa\x20\x0a\xc7\x67\xee\x7d\x1a\xfc\x1f\xaf\xb9\x88\x5f\xd7\x01\xfe\xf2\xfa\xa7\x1f\x97\x3f\xdd\x7f\x78\xb8\x2a\x7f\x62\xa8\x18\x60\x56\x65\xe5\xd1\x41\x0f\x33\xd9\x3f\x5a\x30\x39\x01\x94\x83\x20\xc8\x0b\x50\xc2\x6e\xde\xca\x9f\x98\xab\xd2\x94\x20\x42\x58\x99\x67\xa9\x82\x92\x51\xa9\xa1\x11\x45\xe6\x8e\x6d\x3a\x20\x81\x60\x8a\x71\xce\x79\x09\xd2\xe3\xd1\x16\x20\x09\xab\x9f\xaa\x7d\x82\xf0\x55\xed\x93\xa0\x5b\xed\x13\xc1\x5b\xed\x53\x2e\x8b\x96\xe2\x4c\xe7\x50\x26\xa9\x2a\xec\xcb\xd2\xa7\xe0\xe0\x6b\x41\xb6\xbc\xd7\xdf\x06\xdf\x7b\x6e\x5b\xf8\x8b\xf2\x5e\x3f\x9b\xf6\xaa\xc7\x2c\x0f\x91\x9b\x44\x8f\x29\x59\x30\x21\xb4\x96\x03\x40\xab\xe2\xc9\x81\x6e\x41\x55\x16\x3d\x59\x55\x6d\xd8\x52\x52\xa0\x0c\xe5\x65\xb2\x20\x33\x87\xc9\x32\xfb\xaa\x98\x4b\xd6\xcb\x20\x53\xa0\x71\x42\xe5\xe7\xac\x17\x84\xce\xfc\x64\xd2\x2b\xda\xc1\xb3\x4c\xdf\x05\xbf\xf5\x99\xd5\x4b\x9d\xc0\x9b\x4b\xd0\xed\xeb\xfb\x4b\xb5\xf0\x67\xa0\x6a\xf0\xf0\xe6\xfe\x76\x7d\x02\x0e\x0c\x94\x10\xf1\x32\x33\x20\x48\x57\xbb\x46\xd0\x98\x1a\x52\x13\x59\x66\x42\x71\x90\x6b\x37\x18\x53\xe7\x18\xa5\x7b\x21\x8d\xc0\x14\x3b\xed\x98\x9b\x0d\x53\x5c\xc5\xeb\xff\x61\x46\x80\x88\xcb\x9c\xc2\x80\x83\x2e\xac\x40\xb0\x04\x80\xbb\x64\xac\xcc\x1c\xfc\x85\xe7\x31\xe0\x1e\x5f\xe1\x35\x1b\xbf\xcf\x28\xbd\xce\xce\xad\xab\x78\x7f\xff\xf6\xef\xc3\x0f\xf7\xfb\x87\x0f\xf7\xd1\x55\xf8\x7c\x7d\xfd\x06\x7c\x76\x78\x05\xa8\x8d\x8f\x33\xf3\x93\x02\xdc\xe1\x68\x3c\x15\x61\xae\x94\x56\x6a\x19\x94\x22\x11\x3b\x7d\x86\xe4\x5f\x5f\x04\xdb\x16\xd5\xe0\x28\x35\x32\xea\x90\x13\x22\x88\x10\xc4\xcd\x4e\x01\xc1\x8d\x31\xc6\x35\x0b\x01\x13\x7a\x0a\xd6\xbf\x3d\x47\x85\x4a\x61\x06\x25\xcd\x3c\x87\x13\xd9\x05\x07\x79\xe6\xd8\xfb\xfa\x19\x77\xe6\xb7\x9f\xab\xdb\xdf\x5f\x5c\xa9\xe7\xa4\xf6\x0b\xe2\xd9\xdd\xfe\x7d\x88\xb2\x04\xa8\x13\x03\x2c\x77\x53\x54\x9c\x7a\xbd\x3e\x01\x25\xa8\x1c\x11\x75\xed\xc6\x70\x58\x72\x05\x3a\x5f\xc6\x5f\x86\xc4\x73\xe1\xa6\x07\x09\xb1\x94\xd4\x0d\x8b\xe2\xc0\x20\x77\x24\xc4\xe1\x65\x06\x25\x75\x23\x71\xa3\xc8\x52\x1d\xec\xfc\xf7\xcb\x3c\x9e\xea\xbb\xe0\xaf\xcf\x4c\xdf\x1b\x37\xd4\xc7\x0d\xd2\xe7\x33\x96\x8f\xb7\x79\x7d\x65\xc9\xe1\x39\x36\x7e\xb8\x39\x43\xae\xad\x1f\x8c\x62\x2b\x44\x5e\xb8\xde\xe9\xbc\xab\x8d\xb2\x43\x5d\x14\xd8\x48\xaa\x8c\x9b\x38\xaf\x88\x6d\x28\x26\xa5\x6b\x90\x65\x03\x33\x59\x06\x2a\xc4\x15\x45\xb8\x71\x33\x3c\x5a\x82\xf7\xb3\xae\x04\x84\x28\x97\x06\x24\x65\xa7\xd2\xbc\x2c\x5c\xc5\x8c\xb0\x9c\xe2\x9a\x73\xbe\x1c\xcb\x92\x09\xa3\x45\x0f\xf2\x8c\x20\xdd\x08\x21\x11\xb4\x5c\x31\x05\x0b\x8f\xcd\x8d\x9e\x50\xd4\x1f\x54\xf0\x75\x90\x07\xbf\xf3\x59\xf9\x97\x78\xa7\x1b\x5e\xe1\xbb\x87\xaf\x6f\x7c\x4e\xeb\xfc\xd0\x3f\xbc\x7d\xf8\x18\xfd\xd2\x0f\x82\x42\xa5\x59\x88\xa9\x2c\x60\xc6\xf2\x3c\x5b\xe6\x12\x51\xd3\x89\x84\xca\xa7\x00\x76\x44\x41\x29\xcb\x54\xfc\x92\x0f\x1d\x54\x56\x16\x8b\x1d\x52\x95\x1a\xa0\x51\xc9\xa4\x51\xc4\xba\xd1\x12\x5e\x62\x90\x59\xe2\x50\x56\x96\x8b\xed\x53\x95\xea\xf5\x03\x5c\x18\x49\xad\x9b\xb6\x0f\xa4\x96\xac\xfb\xfc\xe4\xf7\x3a\x15\xbc\x0d\x7e\x1b\xfc\xa3\xaf\x01\x7a\x21\xca\xa7\xb3\x2c\xfb\x67\x59\xf6\x3f\x21\xf4\x1f\xfa\xe4\x2e\x37\x69\x1e\xce\xdc\x42\x92\xc9\x12\x25\xd9\x52\x10\x46\x47\x10\xc8\xd4\x28\xd7\x20\x37\x91\x86\x34\x4a\x64\xf6\x4b\x9f\x1b\x40\xfc\xfa\x73\x9b\xec\xf5\x94\xaa\x14\x73\xc0\x30\xe4\x52\xaf\xb2\x0d\x96\x8a\x12\x83\x7c\x15\x3e\x2f\xca\xa5\x1e\x53\x95\x22\x01\x28\x2e\x99\xf2\xd2\x8f\x96\x72\xe8\x87\x67\xc3\x3c\x85\x1e\x43\xa0\x0c\xfe\x59\xf0\xfd\x17\x3a\xf0\x9f\x11\xad\xdf\x6c\xcc\x1c\xe7\x82\xe8\x33\xa8\xd7\x8d\x60\x9e\x47\x9c\x14\xae\x65\x62\xa9\x05\x77\xad\x31\xc0\xc2\xd2\x94\xb0\x3f\x1d\x5b\x54\xc8\x02\x1e\xca\xdf\xf7\x94\xa6\x3a\xc1\x91\x5c\x2a\x30\x2e\x55\x48\x5c\x16\x92\x47\x73\x98\x5d\xa0\x6d\xa1\x39\xe0\x25\xe5\x25\xa3\x97\x7d\x3b\xb4\x3f\xb7\x6f\x73\x9d\x66\x20\x7e\xb5\x6f\x2b\x44\x69\x17\xaa\x3c\xcf\xb5\xd6\xd6\xac\xde\xa2\xb1\xb8\x64\x32\xd8\x87\xf3\xd9\xc7\x5b\xfd\x92\x7f\x7e\xf6\x55\x3f\xff\xf2\xcf\x8c\x37\xe7\x8a\xc3\xbb\x8f\x6f\x1e\x92\x0b\x64\xf1\xa7\xf3\xd5\x73\x11\x9f\x02\xa2\xf2\x35\x7a\x2d\x22\x02\x16\x27\x01\x3a\xa7\x3a\x41\x29\x63\x53\x98\x96\x26\x07\xad\x4b\xb4\xcb\x11\xa0\xc6\xe5\x46\x72\x22\x44\xd8\x8f\x35\x6b\x87\x7d\xdb\x34\xaa\x95\x56\x12\x46\x54\xeb\x04\x62\x42\x60\x47\x2a\x80\x5d\xd7\x6a\xd7\x5b\x29\x06\x30\x13\xc1\x14\x71\x19\x37\xaa\x16\xab\x3d\x36\x3d\x51\xdf\xbf\xfe\x0f\xc1\x7f\xd8\xf2\xea\xd7\x56\xf2\xbd\xff\x52\x77\xaf\x81\x89\xaf\x6c\xc3\xec\xfb\x0f\x6f\x3e\x6f\xb0\x77\xd7\x2a\x29\xa2\x80\xe5\xa9\x4d\x33\xd0\xbb\x38\xcb\x43\xde\x10\x23\x6a\xee\x6a\x48\x42\x4c\x18\xc2\x29\xc6\x69\x12\xbb\xaa\x1c\x46\x18\xdb\x04\x16\xae\x71\x0d\x43\x98\x56\x7c\x04\x45\x9e\xbb\xb6\x82\x85\xca\x61\x38\x98\xb2\x54\x70\x5f\x98\x26\xb5\x46\x31\xaa\xac\xd6\xfd\x2c\x98\xab\xab\xc4\x24\xa5\x75\x30\x4f\xcb\x0a\xb6\x28\x87\x3c\x4c\x30\x94\xb6\x52\x58\x80\x0a\x33\x48\x09\x2c\x04\x46\xe4\x8c\xfd\xa7\x6e\xf4\x81\x5f\xed\x5c\xd7\x5c\xb1\x67\x5e\xc5\x0f\xcf\xd0\x7f\x97\x57\x54\x82\x6e\xf3\x92\x99\x7a\x84\x1d\x60\xae\x04\x41\x58\x2c\xfd\xf5\x6b\xdf\x34\x8d\x6e\x1e\x2b\xad\x77\xa4\x71\xb9\x71\xd8\x3a\x6c\x1c\x31\x01\x08\x64\x94\xf8\x9c\xe6\x8f\x9f\xbb\x4b\x11\x88\x47\x7c\x98\x6d\x9a\x02\x6c\x43\xb9\xc8\x75\x2f\xb1\xa7\x3e\x2a\x1c\x41\x84\x57\x07\x94\xc1\xa2\x6d\x75\xa7\xd7\x37\x06\xb9\xf6\xeb\xab\xf2\xbd\xad\xfc\x19\x3b\xff\x05\x64\xfe\xa7\x33\x64\xfe\xdd\x05\x51\xff\xf6\x0a\x3b\xff\x26\xc0\x55\x95\x00\xe8\xfa\x14\x15\x79\x92\xc4\x3a\x25\x88\x35\x85\x6b\x44\xc9\x34\x06\x6d\x9a\x18\x03\x58\x99\xe9\xb4\x3c\x70\x95\x67\x0e\x1a\xc7\xdd\xd1\x70\x91\x4d\x1a\xd4\x61\x71\x9a\x91\xc2\x25\x3d\x24\xd9\x32\xb6\x53\x9a\x38\x79\xe2\x94\x17\x82\x6e\xb8\xe6\x11\xda\x70\xcd\xc1\xbb\xe8\xc2\xba\xf5\xf1\xd3\xbb\x9b\x4b\xd4\xd9\x57\x30\x7c\x05\x12\x5d\x48\xd3\xb6\xa8\x2c\x6a\xa3\x34\x6a\xad\x2d\x4a\x29\x0e\x79\xe1\xe6\xd5\xba\xd2\x0e\xe6\xb9\xe6\x0b\x0d\x11\x82\x16\x91\x30\xe9\x0d\x5d\xdd\x97\x67\x1b\x3c\xf1\x91\x87\x77\x3f\xb9\x94\x99\x81\x20\x31\x61\xbc\x1c\xaf\x56\x32\x5e\x57\xf2\x9c\x89\xa6\xd1\xad\x76\x1d\x28\x75\x4b\x11\x37\xc1\xd5\xef\x2d\x7e\x4e\x47\x30\x93\xe7\x20\x7b\xf5\x9b\x05\x22\xb4\x8d\x8a\x8c\xa0\xf5\x59\x30\xae\x06\xd8\x34\x04\x71\x1b\x80\x28\x7e\xd2\x3e\x77\xf4\x37\x3f\xc2\x08\xbe\x76\x41\xd6\x51\xd9\x25\x26\xcf\xa7\x0d\xbb\x5c\x3a\x09\x9a\xc7\x1a\x1c\x3d\xbb\xf7\x08\xb1\x6a\x0f\x41\x6e\xe4\x6a\x27\x19\x87\x8c\xc3\xc6\xac\x66\x53\x53\x49\x06\x8a\xd5\xc7\x39\x9e\x73\x1d\xff\xf4\xc7\xf7\xb9\xff\x7c\x8f\x68\x32\x59\x7e\xdc\xee\xd1\xb9\xd2\x2e\x63\x98\xb9\x01\x62\x69\x0f\x79\xa1\xe4\xea\x05\x18\x97\x9a\x85\x87\xda\x80\xa9\x56\x0c\x64\x01\x88\x92\x27\xe6\x9f\xb7\x4b\xbc\xfb\xbb\x77\x7b\xff\x7a\xe5\x2b\xee\xdf\x7f\xe7\x5f\x87\x9b\xf7\xdf\x1e\x3a\x3a\x1e\xc1\x98\xba\x38\x2c\x92\xa5\x2d\x48\x83\x12\x9b\xa2\xd2\x4d\x1d\x75\x22\x05\xd6\x75\x29\xc0\xc6\x22\xd0\x1f\xb8\xc4\xd0\x75\xdc\x70\xd7\x09\x23\x56\xe7\xb1\xd4\x45\x57\x16\x88\x01\x89\x0d\x01\x05\x32\x18\x14\x59\xaa\x51\x00\xc2\xe2\x5c\x5f\xfa\x4f\x7f\x84\x7d\xfc\x42\x4e\x65\xf2\x12\xa4\x76\x4b\x2f\x2f\x83\x5d\x54\x28\x5c\x45\xb8\x9a\x0e\xc5\x2a\xa8\x74\x72\xd5\xa3\x0b\x09\x2b\x03\x86\x56\xb3\x0d\x97\x32\x8c\xd8\x19\x7f\xc8\x33\x00\x5d\xb8\x63\x0e\xe1\xcd\xdf\x80\xe7\xb5\x15\xf9\x1e\xc6\x75\x85\x7d\x26\xde\xb9\x82\x20\x82\x59\x2e\x0b\x93\xb7\x79\x46\xd3\x24\x8d\x75\x8a\xb0\x52\xb6\x13\x20\x36\xb0\x74\xa3\x11\x59\x35\x20\x50\x27\x71\x95\x74\x0c\x4a\xc8\x3c\x10\x51\x37\x82\x20\x9b\x9d\xc8\x79\x23\x45\x31\x2b\x80\x5b\x8f\x44\x14\x87\xf0\xa4\x21\x32\x04\xa3\x9d\xb0\xf5\x05\x89\x88\xae\x7a\x40\x7b\xbc\x16\xf9\x87\xb1\x15\xf6\x41\x9d\x15\x60\xb4\x8b\xb6\x20\x2b\xea\x0b\x43\xf4\x41\xe6\x92\xfd\x7e\x6c\x9e\xb1\x15\x3a\xd0\x6f\xeb\x00\xdd\xf0\x5d\xfa\x6a\x1d\xbc\x1a\xdf\x8f\xa0\xd7\x59\x01\x5a\x1b\x76\x4b\xe9\x79\x55\xd6\x75\xb0\x1c\x11\x51\xc3\x2e\xce\x19\x39\x1e\xcd\x53\x60\x1c\x01\x95\x01\x81\xa4\x6c\xf6\x31\x28\x1b\xd6\xbe\xee\x69\xef\xb1\x92\xcf\xb5\x11\x7b\x3f\xb2\x5b\xa6\xf4\xdb\xf7\x9e\xf7\xf5\xd3\x37\xef\xf6\x3d\x85\xaa\xa4\x60\x48\x96\x11\x4d\x34\xcf\x4d\xc2\x98\x76\x2d\x73\x30\x05\x55\x99\xe8\xb4\x38\x08\xca\x31\xa7\xbd\x22\xca\x32\x96\xb7\x6a\xea\x90\x82\x76\x4c\x46\x13\x84\x61\xe7\x71\x25\xc5\x16\x03\xba\xe4\xf7\x5f\x10\xfe\x9c\x91\xaa\x83\xdb\xbb\xf7\x5f\xdd\x7e\x07\xee\xde\xdc\x1c\xf6\x99\xe9\x2b\xd8\x4f\xa0\xa1\xaa\xc0\x19\x2f\xb2\xdc\x4d\xa6\xf5\x28\xcd\xd6\xcd\x18\xa6\x80\xbb\x09\xa4\x43\x7a\x10\x6e\x4e\x52\x9d\x25\x0e\x2d\x43\x9f\xd8\x44\x02\x78\x6a\xc3\xde\xc9\x41\x82\x00\x20\x06\x20\xc8\x92\xa5\x05\x75\x32\xfa\x9c\x0a\xba\x5a\x9f\x5f\x7c\x64\x3d\x22\xfd\x9e\x6e\x8c\x2e\xc6\x31\xeb\x2b\xce\x8e\x10\xcb\x0a\x99\x2c\x1f\x0e\xe2\xe5\xda\x94\x0c\x64\x80\x17\x52\x6e\xfa\xcb\x3e\xa1\x1b\xba\x63\x7f\x78\x5d\x7c\x0c\xd3\x75\x5d\x70\x1b\xc2\xa5\xdd\xe6\x6d\x8c\x32\x57\x22\xa2\xa6\x1d\x2d\x84\x6f\xd5\x33\xeb\x5f\x08\x5a\x03\x52\x4e\xd8\x1c\x80\xc0\xac\xcf\x44\x48\x7f\x66\x1f\x0b\x03\x9d\xa6\x40\xf8\x22\xc5\xf5\x77\x9b\x53\x1b\x41\x17\x43\x2a\x86\x10\xe5\x45\xa6\xb5\x36\xba\xef\xb5\xc1\x25\x55\xc1\x86\xd1\xb0\xd5\xc1\x7d\xf3\x8c\xf7\xf2\xa3\x75\xdc\xd8\x34\x8b\x90\x2b\xc1\xec\x12\xbb\xd8\x70\xf5\x95\x8c\x18\x0e\x22\x63\x54\x2f\xb3\x39\xcd\x51\x62\xc2\x64\xac\xf8\xc6\xc5\x09\xc8\x13\x3c\x54\x21\x3b\x57\x70\x05\xaf\xf3\xba\x87\xca\x3e\xce\xd6\xee\x92\xc7\x79\x7d\x85\xec\x34\x20\x14\xe5\x6e\xd0\x0e\x19\xcf\x4b\x13\x64\x11\xda\x8f\xc1\xde\x57\x59\x78\xc6\xda\xfb\x37\xab\x37\xfb\xf6\xcd\xdd\x9b\x08\xb9\xc4\x82\x79\x55\xf0\xfb\xf1\x87\xa9\xda\xb7\x4b\xb3\xaa\x64\xe5\x30\xa8\x2f\x78\xff\xe8\x86\x1c\x90\xf7\x2c\xff\xfa\xb5\xed\x7b\xae\x42\xb9\x3d\x2f\xcd\xb7\x37\x84\x10\xaa\x73\x43\xcb\x65\x28\xa4\x66\xd8\x13\x1e\x79\xd2\x23\xf4\xfb\x89\xf1\xc4\x24\x1c\x50\x67\xdd\xe4\x93\x91\x79\x14\xb8\x18\xf0\x93\x06\xdc\x5e\x70\x9f\xcb\xf3\xbd\xfe\xe6\x0f\xdc\xcb\xb7\x38\x7d\x7d\x53\x12\x4a\x54\xae\x09\x5c\x10\xac\x8c\xe6\x36\x34\x0b\x8b\x43\xbb\xb0\x03\xfa\xfd\xc0\x99\x67\xa5\x12\xce\xba\x99\xae\x77\xcb\xc2\xa3\x8b\x01\x3d\x55\x80\x5a\x7a\xc6\x21\x81\x3e\x7e\xf9\x4f\x82\xaf\xb6\x3d\xfe\x8c\xf6\xb1\xae\xa2\x4b\x33\xd1\xdb\xaf\x03\x5f\xea\xb0\xeb\xab\x34\x03\x39\x20\xcc\xf5\xae\x1d\x5d\x2f\x80\x01\x31\x85\xa6\xa4\x8e\xee\x0a\x37\x3e\x05\x1c\x60\x7d\x92\x07\x59\x14\x85\xeb\xab\x6a\x35\x58\x9b\x86\x83\xb4\x96\x06\x2b\xe9\x6a\x53\xba\x58\xe9\x0a\xc8\x55\x77\x94\x4f\xe8\xa6\x3b\x64\xc1\x6f\xb6\xac\x64\x12\x7d\xf3\xee\xe6\x7d\x78\xb7\x89\x7b\xfb\xfd\x7b\x1f\xc9\xfd\x3e\xfa\xf4\xcd\xbb\x8f\x6f\xee\xc0\xbb\x6f\xde\x7d\x75\x7b\x97\x84\xc3\xae\xc8\x38\xc7\x55\xe6\x5a\xc2\x33\x41\xda\xb4\x6f\xa8\xa3\x1c\x68\xd2\x19\xc5\x54\xe6\x24\x98\x4b\xb2\xda\x31\xfa\x90\x2d\x81\xe3\x45\x6e\xa1\xe3\xa9\x4d\x41\xc9\xb4\x5b\xb7\x24\x90\x82\xa6\x03\x05\xec\xed\x04\xe0\x82\x0a\xcc\x01\x0a\xa9\x23\x1b\x36\x84\xf1\x7c\xe9\x62\x63\x89\x02\xef\xf6\x5f\x05\x1b\xa2\xce\xe1\xfe\x6f\x83\x68\xff\xfe\xbb\x30\x7a\xf8\xea\xdd\x79\x6f\x60\xc9\x02\x11\x80\x10\xc2\x44\xa7\x42\x58\x27\xa9\x33\xa9\xb7\x96\xb3\x0c\xc4\x9a\x2a\x62\x76\xc6\x10\x97\x3b\xc8\xab\xe2\x29\xb0\x60\x0e\x51\x6e\x0a\x1f\xf0\x6e\xe6\x30\xd5\x16\x5b\x8f\x93\x17\xb2\x27\x7e\x53\x1d\x54\xf0\xe7\x3e\x92\xfb\x8c\x0b\x17\xdc\xde\xbd\x05\xbf\x02\x6f\xbf\xfe\xe6\xee\xe1\xc2\xb1\x9c\x7d\xff\xe1\xdf\x7c\x02\x77\xbb\xd2\x66\x65\x94\x9c\xac\xee\x38\x28\xd3\x28\x5b\xa6\xae\xe4\x20\x35\x35\x49\xab\xac\x7a\x0a\x7a\x57\xb5\x6d\x98\x2d\xe3\x41\xe5\x9c\x99\xd9\x72\x90\x3c\x05\xc2\x05\x2d\xca\xd3\x14\x8a\xa2\xa5\x8c\xe2\x26\x8c\x83\x33\xd6\x88\x39\x04\x41\xb2\xe5\x13\x42\xf0\x8c\x01\x7b\x1b\x44\xf7\x0f\x5f\xdd\x7e\x75\x1b\x76\xd1\x5c\xb8\x61\x00\x14\xbb\x6a\x9e\x9c\xa1\x80\xf7\xee\xc8\xc8\x91\x0e\x43\x79\x08\x16\xe9\x4a\x37\x77\xa6\x01\x99\x1b\x1b\xdd\x80\x0c\xa8\xb0\x70\x99\x6b\x80\x04\x55\x10\xfb\xd8\x81\x3e\xc8\xe0\x2b\x8f\x6c\xfe\x37\x3e\xda\xf7\xe0\x63\x7d\x1e\x6f\xf4\xed\xc3\x05\x8d\xec\x55\x59\xd7\xc3\xa5\xac\xeb\xb2\x41\x3f\xbc\x7d\x78\xfb\x70\xfd\x43\x98\x16\x29\x28\x86\x7e\xb1\x09\x11\x04\xe4\x69\x56\x21\x89\x10\xea\x90\x44\xae\x2b\xf3\x9c\x13\x28\x79\x5d\x14\x19\xa3\x50\xf1\x83\x24\x4c\x0e\x2e\x77\x89\xab\x10\xb0\xa0\x0b\x3b\x0c\x5d\xea\x2b\xb7\xec\xb8\xfe\x59\xd2\xa7\x20\xcd\x18\x2a\x60\x58\xf7\xe2\xfa\x3c\x38\x84\x79\x40\x6f\xe4\x55\xdc\xbf\xf4\x9d\xde\x2f\xda\x2e\xb7\x8e\xcb\x8f\x2f\xbd\x42\x5f\x5a\xf1\xe7\x60\xff\xb2\x08\x12\xdc\xbd\xff\xf4\xee\xe6\xe1\x9c\xeb\xbb\xb0\xa9\xdf\x1f\x94\xe0\x9c\xc9\x13\x0b\x63\x6f\x9e\x9a\xda\x4d\xb4\xb7\xae\x6e\xf8\x6a\x64\x84\xf3\xd8\xb0\xba\x5f\x7a\x95\xa4\x20\x49\x67\x77\xc4\x40\xc1\x3e\x49\x51\x89\x21\xc4\xac\x8b\x52\x37\xe7\x44\x42\xeb\x46\x90\xe9\xbe\x9f\x26\x7d\x90\x98\x41\x82\xba\x75\x57\x50\x8e\x03\xd5\x0b\x89\x25\xb0\x98\x62\x4a\x9c\xc4\x6c\x5d\x5a\x69\x59\xb8\xa3\xeb\x28\x53\xa0\x48\xd3\xa2\x5c\xe5\xa6\xc6\x61\xd1\xa4\x7a\x54\x52\xaa\x51\xb5\x41\x1c\xb0\x27\xb8\xc3\x07\xe9\x6b\xa8\xbe\x1c\x39\xbc\xff\x70\x77\xf3\x85\x6a\xaa\x77\xaf\x42\x87\xd7\xb5\x32\x3d\xc0\x66\xd5\x8f\xc6\xd5\xb8\xd2\x80\xea\xaa\xd2\xce\xea\x0a\x46\xf0\xd4\x9a\x0d\x6a\x6b\x7b\x11\xa6\x3a\xda\x80\xb6\xaa\x70\x55\x1f\x02\x29\xa5\x52\x35\xe7\x9c\x2b\x42\x28\x95\xa7\x2e\x44\xcc\xd5\xdc\x35\xcc\xcd\x44\x60\x55\xd2\x92\x2b\x09\x37\x7e\x4f\xf4\x84\x77\xfc\xc0\x83\xb7\xbe\xea\xe3\xef\x82\x4f\xc1\x7f\xdc\x90\x11\x2f\x2e\xfe\xe7\xd6\xd9\xeb\xc6\x6d\xf0\x1c\x96\x0b\x7d\x3c\xee\xd3\xc7\x4f\xf7\x37\xdf\x7c\xb7\x3e\x8a\xcf\x6c\xf8\x1b\xaf\xd7\x9b\xfb\xb0\xd1\xb6\x43\xd6\xba\x19\x48\x0d\xa4\x9b\xb4\x64\xd2\xc5\xb8\x10\x05\x0e\x3b\x86\x09\xa5\x8b\x4c\x53\xc6\xa1\x4c\x62\x10\xa4\x8e\x61\x4b\x0a\x9e\xc7\x3a\x43\x20\x57\x78\x1c\xb5\x10\x52\xea\x61\x57\xba\x09\xe4\x2d\x11\xc8\xaa\xd5\x94\x50\x94\x09\x19\x5a\x26\x90\x60\x10\x6a\x42\xd8\x23\x2d\x32\x5a\x83\x24\x2d\xcb\x45\x0e\x9c\x6a\x52\x0a\x8e\x51\x39\x03\xa8\x94\x52\xae\x95\x9e\xda\xf7\x2c\x37\xba\x92\xbb\x0c\xf0\x4f\xc9\x7d\x3d\x2b\xb7\xef\x6e\x1e\x3c\x58\xe4\xb9\x51\xfd\x9d\x4f\xfa\x1d\xf6\xe7\xbe\xf7\x2b\xc9\xd7\xf9\x7d\x1f\xd6\xc6\xb6\xc8\x58\x77\x04\xc2\x00\xb1\x8a\xce\x05\x11\x98\x30\xea\x12\x98\xa8\xb4\x8c\x65\x32\xa5\x5d\x87\x5b\x02\x51\x9a\x52\x4e\x50\x99\xc4\x22\x01\x52\x66\x85\x1c\x47\x8d\x31\x63\xfa\x98\xef\x56\xf7\x31\x6b\x5e\x89\x6e\x90\x26\x94\x32\x21\x72\xc5\x4f\x73\xca\x9d\x75\x52\x70\xde\x96\x45\x91\xd1\x16\xe7\x05\x26\x45\x96\x0a\x7e\x91\x5e\x1f\x8f\xf2\xcc\x97\xda\x1e\xd4\x73\x9d\xef\x87\x9f\xe6\x80\x78\xc5\xbf\xe8\x07\xe7\x73\xd7\xd3\x2e\xc3\x4e\x2d\x63\x01\x1a\x50\x69\x44\x14\x75\x43\x91\x98\x24\x73\x47\x5a\xea\x82\xec\xe2\xcc\x95\x9c\x61\x9c\x42\x4c\xfb\xa1\x3c\x4e\x5a\x2c\x34\x92\xa6\x3e\x28\x43\x13\x5d\x15\xbd\x42\x56\x1a\x5b\x6c\x34\x10\x56\x2c\xa9\xc6\xae\x41\x38\x35\x69\x06\x92\x2c\xb5\x69\xa6\x18\xd3\x95\x96\x69\x10\x87\xec\xa9\xdc\xe3\x83\xf0\xfd\x28\x9f\x9e\x7b\x9f\xff\xa7\xd5\xea\xdc\x5a\x99\xee\x7d\x16\x68\x9b\x04\x3f\x05\x1b\xc5\xe9\x73\xe8\xf8\x5c\x2b\x7a\x7f\x7b\x56\xa4\xe0\xea\xe8\xd9\x4e\x0f\xbe\xbc\x25\xe4\x43\x9a\xcc\x20\x99\xca\x72\xd2\x33\x84\x33\x48\xdc\x98\xa6\xa0\xc0\x54\x63\xc4\x74\x57\x68\x46\x39\xd7\x2d\xa5\x33\x73\x95\x7f\x97\x4a\x81\x54\xb9\x63\x96\x23\x88\x4b\xd0\x16\x05\xa0\x74\x14\xe3\xf6\xe6\x6c\x99\x2b\xc3\xa8\x28\x21\x85\x32\x87\x65\x51\xef\x82\x0b\x55\xfd\xd2\x4b\x29\x5d\x0e\x8b\x2c\x27\xbe\xb7\xa5\xf2\xb5\x3c\xea\xcc\x47\xf3\x31\xf8\xb7\xcf\x91\xac\xb7\x77\xeb\x1e\xb0\x49\xf8\xac\x20\x9f\x2b\x1f\x2f\xc9\x93\xd5\xc9\x58\xf7\x8c\xe8\x15\x33\xff\x8b\x8e\x69\x7d\x82\xa3\xd6\x7a\xd0\x55\x75\x74\xd4\x73\x4f\x50\x47\xad\x32\x60\x2c\x4c\x9e\xe2\xc1\xf6\x3d\xa0\xfd\xd2\xfb\x83\xcb\xb9\x1d\x49\x07\xc6\xb6\x82\x4d\xbd\x3f\x6a\x27\x94\x58\xd5\x8b\x50\x8a\xad\xb6\x2b\xe3\xcb\xec\x38\xf6\x78\x97\x03\x2d\x20\x5e\x26\xa5\x5c\x26\x84\x70\x66\x7d\x9b\x89\x22\x12\x72\x48\x15\x2f\x83\x20\x06\x8d\x97\x51\x7f\x59\xc6\xbb\xb3\x8c\x5f\x68\xe3\x79\x29\xe3\xe7\xc2\xfe\x2f\xb5\xf3\xdc\xe8\x47\x0d\xf2\xae\xd3\x20\xd1\x5d\x07\x72\x17\x83\xea\x94\x82\xca\x25\xa3\x1a\x42\x08\x6d\x91\x31\x37\x0f\x1e\x48\x63\x6b\xeb\xb9\x9c\x4d\xbc\x71\x33\x99\xc3\x74\xec\xe0\x30\x9c\xc5\xa5\xf4\x4a\x5c\xb6\x1c\x1d\x5b\xc5\x9d\xc2\x81\x15\xe8\x0f\x88\x0b\x83\xad\x8e\x7b\x93\xf7\xc2\x7c\xfe\xff\x0f\x60\xf0\xdf\xf9\x0e\x99\x2f\xcc\xe9\x2b\x79\xcf\xd5\xdd\xbf\x6c\x56\xd3\xa3\xb5\x6a\xd2\x75\x0d\x02\x9f\x77\xd2\x80\x3b\x54\x2b\x82\xc3\x20\xcd\x6c\x9e\xe2\xa9\x9e\x26\x20\xc6\xa5\xf2\x07\x97\xf2\x6a\x22\x3d\x98\xba\x1a\x36\xed\x97\x27\xf6\xe8\x28\x3e\x02\x09\x92\x70\x2c\x8b\x5f\x20\x2b\x3d\xcb\xfa\x2f\xae\x56\xea\xd6\x2b\x7b\x35\xb7\x3f\x21\xeb\x1f\x23\xea\xea\x1a\x5a\x3d\x19\x2f\x2b\x02\xe2\x24\x81\x70\x65\xa5\x6c\x98\x5c\x8b\x3a\x79\x3e\x62\x31\xb9\x84\x57\x13\xed\xc1\xdc\xd7\xb0\x6d\xbf\x38\xa9\x2e\x70\xf4\x3c\xa9\x3f\x2b\x69\x1c\x8e\x41\xec\x79\x81\xfe\x6b\xd6\xa9\x6f\x79\x7e\x25\xe6\x0b\x1a\x5c\x75\x12\xad\xd6\x6a\x52\x5a\x37\xce\x80\x7c\xc9\x40\xee\x94\x95\x1a\x34\x99\x4d\x53\x3d\x4d\xa2\xaa\x40\x69\x5d\xbe\x1d\x38\xa1\x23\x6c\x80\x14\xbc\x14\xfc\x90\x29\xc7\xd6\xcd\x53\x4a\x21\x24\x59\x8e\x61\x4c\x32\x97\x3b\x8d\x01\x07\x4d\xa8\x8b\x22\x2f\x97\x51\x2c\x13\xc6\xd8\xad\x6f\x23\x25\x48\x16\x30\x2b\x25\xca\xd7\xb9\x0c\xe0\x13\xdc\x27\x3f\x35\x97\xbf\x40\xc6\x5f\x34\x97\xfb\xf8\x44\x7a\xa5\xf4\xa0\x8d\x99\x9c\x00\xf8\xd4\x01\xec\xb8\xd6\x0a\x0c\x49\x6a\xb3\x14\x0d\xa6\xeb\x00\x6d\x97\xd1\x1f\x5c\xc1\xcd\x40\x3b\xd0\x37\x15\xac\x7f\x42\x1b\x4d\x4e\x60\x60\x7f\xd1\x4c\x6e\xfd\x84\xf0\x46\xff\x3f\x2d\xe7\x8d\x3c\xb1\xd1\x18\xdd\x6a\x6b\x07\xa7\x00\x3e\xf5\x9b\x9c\x1a\x0c\xe9\x2a\x27\x6c\x6d\xdb\x02\xdc\x2e\xb3\x3f\x38\xc8\x75\x4f\x5b\xd0\xd5\x16\x56\xd5\x97\xe4\x3c\x3f\xb1\x7a\xd5\xba\x65\x5e\xfe\x9c\x9c\x07\x20\x9e\xb2\x1b\x13\x1e\x83\x3f\x0b\xbe\x09\xfe\x79\xf0\xbb\xe0\x7f\xf4\x79\xcb\x67\xec\xb3\xb7\xe7\x9a\x8b\xb7\xf7\x1f\x36\x53\x6f\x2b\x87\xbd\xdf\x5a\xf4\xdf\x7f\xf8\xf6\xb7\xe0\x19\xb6\xeb\xd3\x96\xb5\xbf\x7f\xb7\x65\x19\xee\x7d\xa8\xe4\x1f\xc0\xbb\xbb\x0f\x77\x87\x9d\xca\xd2\xb0\xfb\x21\x0d\x55\x92\xc0\x12\x16\x98\x20\x51\xc2\x88\x62\x4c\xa0\x85\x23\x2c\x8a\xb2\xc8\x18\x2b\x41\xf0\x88\xc1\x31\x46\x24\x2b\x53\x94\xa5\xb1\x4a\x2a\xa2\x12\x66\x54\xc4\xb5\x3e\xe1\x52\x60\x8e\x44\x24\x4f\x2a\x0e\x8f\x79\xc9\x58\x96\xb6\x79\x91\x97\x88\xa4\xda\x16\x05\xa2\x71\x82\x73\x8e\x4c\x4c\x92\x94\x65\x29\x9c\x92\x9a\xc5\x3c\x41\x8a\xb0\x02\x35\x65\xe1\x88\x40\xa5\x28\x24\x2c\xd2\xe0\xe0\xe3\x54\xcd\x41\x05\x71\xf0\x75\xf0\x5d\xf0\xe9\xac\x7f\x2f\x99\xf1\xdb\x6f\xde\xf9\x38\xda\xfd\x9b\xef\xdf\xef\x3f\x7e\x7a\x77\xf3\xd5\xbb\x9b\xef\xa3\x1b\x1f\xe3\x7f\x0f\xee\x92\xc3\xbf\x00\xef\x57\xbf\xf3\x3e\xf4\x52\xdf\x9e\xa5\xde\x82\x4f\x6f\xde\x79\x12\xd8\xbd\xcc\x52\xd0\x3f\x0e\xa0\xc9\xf2\x32\x67\x0c\x23\x55\x20\xc0\x2a\x4e\x69\x4e\x28\xcb\xf2\x2c\xcb\x2a\xb8\x60\xc0\x4a\x52\xa4\x65\x12\xc7\x65\x2c\x08\x89\x4b\x65\xc2\x58\xeb\x65\x2c\x90\x92\x3a\x4c\x96\xe3\x41\x41\xac\x14\x73\x47\xc2\x5a\x5c\x53\x67\x81\x96\x5c\x17\x84\xc2\xa7\x80\x31\x05\xd2\xd8\xcd\x49\xcc\x20\x02\x93\x53\x5a\xc0\xee\x29\x90\x84\xb5\x0e\x09\x79\x6a\x40\xde\x70\xd6\x82\x40\x9a\x14\x06\x87\x80\x3e\x95\x37\xd5\x2e\x0b\xe2\xe0\x2f\x83\xef\x83\xbf\x0f\xfe\x87\xd5\xd6\xf5\x9c\xa9\xbe\xc8\xfd\x0c\x5f\xf7\xe6\xdb\x4f\xef\x6e\xce\x76\xfe\xf9\x19\x78\xf3\xfd\xfb\xef\x5e\xb4\x94\x9f\x67\xfc\xf6\xe5\x8c\x7f\xf2\x53\x2e\xa2\x3c\x4e\x24\x8a\xf2\xdf\x07\xfb\xa9\xae\x32\x25\x21\x28\x06\xd2\x40\x4d\xea\x53\x4b\x08\x44\x8c\x31\x8d\xc8\xa2\x42\x0c\x51\x49\x53\x9a\xe7\x4d\xdc\x53\x9b\xea\x41\xef\x32\xad\x1f\x75\x61\x98\x64\xb1\xd8\x95\x8f\x63\x1c\x75\x49\x0c\x89\xae\x12\x99\xb1\x34\x41\x20\x4e\x4b\x96\x59\xc8\x08\xa0\x05\x2a\x10\xa1\xe5\x00\x62\x08\xf3\x1e\xc1\x84\xc7\x19\x34\x8c\x21\xfc\x14\x10\xb2\xb4\x1a\x23\x5e\x58\x59\xb3\x72\xf3\x71\xf8\x2a\xff\x5e\xf8\x67\x3e\x0f\x7e\x17\xfc\xc7\xe0\x7f\xb9\xe6\x8c\xdd\x9f\xe5\xdd\x66\xfe\xf0\xa3\xe1\x78\x41\xa4\xf5\x6a\x04\xde\x6c\x23\xf0\x61\x1d\x81\xaf\x45\x54\x26\xa9\x2c\xb2\x28\xfb\x7d\x10\x8e\x84\x40\xc2\xa9\xd4\x98\x46\x8c\xd0\x3e\xb3\x66\x1d\x0f\x5a\x95\x86\x34\x3f\xc4\x21\x46\xa8\x24\x19\xcd\xf3\x7a\x1d\x83\x44\x35\x76\x97\x58\xfb\xd8\x96\x0d\x13\x5c\xef\xb2\xc7\x69\x77\xcc\xb3\xb2\x44\x3a\x41\xb4\xe0\x44\x10\xd7\x01\x4e\x88\x48\xe3\x11\xf2\x22\x83\x40\xe6\x88\x15\x23\x63\x02\x30\x37\x22\x94\x88\x24\xd7\x9d\x62\x4c\xba\x96\xd2\x25\x07\x81\xe5\x1c\xf6\x4d\x25\x60\xb0\x0b\xc8\x13\x0e\x8f\x67\x4e\x8d\x2d\x73\xed\x5d\x96\x57\x51\xb5\xaf\x6e\xef\x3f\x3c\xbc\x79\xf0\x01\xf6\x2d\x67\x7d\xf6\xd9\x6b\x93\x66\x13\x82\x90\x67\xa2\xc8\xdd\x1c\x4b\x29\x62\xce\xab\x0c\xae\x26\x93\x2e\x73\x91\x95\x0c\xe6\x22\x83\x07\x91\x71\xfa\x03\xdf\x78\x2d\x42\xe5\xd2\x8d\x06\x5e\x9b\x90\x88\xa5\x00\x7d\xa1\x0d\xb2\x6a\x69\x4d\x8d\x6a\x1b\x1c\x3c\xff\x8e\xdd\x43\x3f\x37\xef\x83\xbf\x0f\xfe\xfb\x0d\x29\xee\xcb\x73\xf3\xf1\x3c\x25\xef\xcf\x73\x04\xae\x73\xb8\x7e\x66\x3e\xbc\x7c\x36\x3f\xfa\x89\x79\x1b\x92\x30\xf3\x33\x13\xe2\x1f\x26\x30\x63\xc4\x72\x2e\xa9\x82\x04\x74\xbd\x21\xa2\x90\x4c\x95\x58\xa4\x8c\xc1\x53\x0d\x2a\xc4\x93\x2c\xcd\xd2\x3c\x8d\x79\xac\x89\x80\xdc\x84\x47\x6b\x4f\x63\x2e\x64\x6d\xc2\xe3\x12\xef\xba\x2c\x85\x25\x94\x09\x22\x0c\x12\x03\x5d\x0d\x24\xc5\x2c\x87\xb4\xa8\x84\x30\x63\x32\x16\xac\xcc\x20\xa8\x5d\x2d\x13\x91\x94\xd5\xac\x98\x30\x4e\x22\xb4\xa8\x41\x50\x26\x5a\xcc\xd2\xe0\xe0\x79\xb7\x2a\xdf\xf3\xf6\x8d\xc7\x38\xd8\x3a\xde\x9e\x75\xf1\xed\x6b\xd9\x0f\x17\x95\xf4\x47\x68\xa4\xdd\x94\xa7\x21\xf9\x61\x58\x07\x20\xa6\x90\x96\x8c\x31\x85\x18\x18\x06\x4d\x21\x2a\x57\x97\x04\xf3\xac\x87\x27\x0d\x5a\xcc\xca\x14\x66\x49\x4c\xe3\x86\xe8\x84\x28\x13\x8e\xd6\x9e\x8e\x98\xcb\x5e\x87\xd3\x92\xad\x3a\x49\xeb\x32\x77\x47\xca\x18\x43\x35\x5b\xb5\x92\xe0\xb2\xc0\x2c\x4b\xd7\x8b\x02\x14\x1e\xb8\xe4\xb3\x56\x72\x47\x41\x78\x73\xd1\x4a\x1d\x65\x35\x48\xbc\x56\x5a\xd7\x25\x79\x2a\xf7\xcc\xeb\xe3\xb7\xc1\x6f\x2f\x73\x7f\x7b\xf7\xc5\xa9\xbf\xb4\x65\x9c\x93\x1d\xab\x1f\xf7\xdd\xcf\x8c\xc0\xad\x5f\x94\x1a\x8c\x99\xce\x52\x70\x7c\x94\xa0\xc7\x25\x2c\x19\xe6\xa2\x24\x61\x25\x10\x4f\x52\x29\xcb\x9a\x53\xa1\x31\xcc\x8b\x13\x02\xba\x60\x45\x5a\xa6\x49\x4c\x62\x43\x78\x82\xa4\x09\xa9\x31\x8b\x2c\x0c\xab\x63\x1d\xb2\xc5\xee\x8f\xb4\x40\x48\xa7\x94\x22\x89\x8d\x70\x16\x28\xc9\x27\x53\xc3\x22\x2f\x73\x08\x9a\x1c\x53\x94\xbb\x39\x4d\x11\x1a\x9c\x31\x02\xb7\x6e\x16\x84\xf6\x0e\x0a\x71\x6a\x41\xd9\x0b\xae\x81\xac\x25\x0a\xc2\x80\xfa\xdc\x43\xb0\x21\xb0\xdf\x9e\x21\xe1\xb7\x98\xfe\x06\x25\x0a\xee\x3e\xdc\xd9\x43\xff\x38\x41\xbc\x8b\xcd\x29\x33\x52\x63\x50\xb4\x0e\x83\x26\x1a\x4f\x59\x18\xa8\x22\x77\x45\x96\x03\x52\xe4\x1a\x11\x27\x6d\x10\x04\xbf\xf6\xbd\x72\xf2\xdc\x43\xf8\x17\xcf\x5d\x84\x5b\x64\xea\xb3\xe7\xbc\xf5\x7d\xbf\xb2\x56\x6e\x2f\x39\x85\x2b\xcf\xf8\xdd\xc3\x87\x7b\xf0\x13\xd7\x23\x13\xc9\x93\xd4\xd7\x66\xf6\x51\xba\x49\x4a\x8c\x5b\xb2\x5a\x94\x2d\x21\x4e\x9e\xaf\x74\xde\xc6\xec\x30\x3e\x14\x0b\x05\xda\x18\xb3\x75\xac\xf3\x13\xe4\x3c\x6a\x9d\x99\xe7\x79\xb1\xc7\xe3\x11\x8c\xa7\x52\x88\xa8\x73\x66\x9a\xa6\xa5\x9a\xe7\xd9\xcb\xb5\xf5\x6a\xfd\x49\x72\xfd\xd4\xf7\xff\x49\xb9\x74\xa4\x4f\x5c\xcf\x33\x90\xf3\xb2\x1d\x40\x20\xdd\x28\x25\x21\x1d\x71\xe3\xfa\x4e\x1c\x97\x6e\x54\x0a\xe3\xf5\xca\xfa\x4e\xfe\x14\xc1\xf6\xbe\xb6\x20\x78\x81\x65\x11\xdc\x3e\x5c\xf0\x66\x37\xec\xaf\x73\xa2\xfe\x7e\x35\x45\x5f\x47\x2f\xf8\x51\xad\x5a\x78\x18\xa6\x49\x3d\x05\x20\x18\xc7\xa3\x25\x64\x24\xae\x5b\xdf\xf7\x83\xb5\xda\x2e\x49\xa5\x5c\x0b\xa0\xaa\xc2\xd9\xba\xbc\xae\x6b\x97\x79\xa4\xe9\x20\xf8\xb5\xe7\x6c\xc7\x3f\x3f\xae\xb7\x3f\x31\xae\xf7\x57\xe3\x17\x5d\x8d\xeb\xcb\xeb\x6f\xee\x6f\x1f\xde\xdc\xf7\x51\x79\xea\x4c\xd3\x00\xd4\xb8\x60\x3b\x8c\x72\x12\x02\xc2\xba\x9c\xd6\xb7\x32\x6c\x85\xff\xb9\x82\xd3\xfa\x06\x5f\x0d\xa9\x38\x15\x42\x44\xbd\xd3\xcf\x43\x3a\x9d\x4a\xce\x2f\x43\x6a\xb7\x66\x45\x2f\xd7\x19\x57\xed\x97\x3d\x2f\xaf\xc3\x08\x7f\xec\xf3\xc2\xa3\xe6\x84\xb4\xbf\xbb\x06\xf1\xc2\x2e\x67\xeb\x53\xd3\x2b\x45\x69\x4f\x5d\xbf\xbe\x53\x47\xa4\xeb\xa5\xbc\xba\xf2\x27\x2d\x87\xe0\xd7\x41\x1d\x16\x37\x78\x4f\x5f\x61\x3a\xfc\xe6\x8a\xaf\xf4\x93\x47\x44\xd9\x8a\x80\x37\x18\x8d\xe7\xe3\x67\x9c\x87\xfd\xf9\xf8\xdd\x17\xae\x01\xba\xcf\x7f\x18\x34\x68\x1d\x0c\x11\x68\x1f\x8f\x97\xb3\x1f\x7c\x1d\x99\x6e\x1a\x50\x34\x2e\xf5\x07\x90\x47\xc1\x12\xa8\xa6\x01\x65\xe3\x12\x7f\xd8\x53\x27\xe6\xa2\x28\xda\xb2\x2c\x7b\xa7\xc7\xa2\x28\x9a\xb2\x2c\xc7\xcf\xa7\xab\x1c\xe6\x09\xdf\xf0\xdd\xf8\x5f\x3b\x4f\x97\xe7\x72\xff\x6a\x9e\x5e\x5c\xa7\x7b\xf4\x43\x63\xbc\x14\x04\xb4\x8f\xd3\xe5\x6c\xe9\xcc\x32\x69\xdd\x75\x00\x77\xcb\xe4\x0f\xdd\xee\x78\xb9\x46\x5a\x7f\x8d\xb4\xed\x6e\x5c\x2c\x60\x52\x4a\xa7\x57\xff\xaa\x5e\x0a\x84\xc2\xde\xcd\xeb\x15\xa9\x94\x02\xea\xf5\x95\x6d\xae\xaa\x30\xb9\x21\x07\xf2\x4b\xe6\xea\xc7\x4c\xc7\x5f\x58\x77\x5f\xba\x46\xf7\xc5\x0f\xbd\x05\xb5\xc3\x21\x02\xcd\x29\xb8\x9c\xb9\x32\xca\x4e\xe3\xba\xea\x60\xed\x27\x06\xd6\xbf\xf7\x04\xaf\xfa\xfa\xd2\x81\x2c\x33\x80\x84\x78\xb5\x8d\xdd\xec\x62\x50\xac\x27\x47\x84\x10\x28\xaf\x7f\x5a\xe5\xb1\x60\xf8\xff\x4c\x9e\x1f\x3c\xfa\xd1\xfa\xe5\x51\xed\x62\x7f\x00\x89\x17\xb1\xae\xbd\x3c\xfe\x70\x20\xcb\x00\xf0\x2a\xcf\xb0\xbe\x8d\xd7\xd2\x01\x78\xfd\xd3\xaa\x2b\xf2\xb0\xfe\x63\xe5\xb9\x5e\x4b\x17\x7d\xb0\x3f\x1f\x6f\xbf\x70\x2d\xac\x77\xf9\xe3\xa0\x01\x74\x2d\xe8\x00\x3c\x1d\x2f\x67\x8f\x63\xc8\x17\x2d\xa5\x9c\xa5\xd3\xeb\x7b\xff\xea\xe7\x03\x71\x10\x24\xeb\x1a\xf2\x8b\x07\x81\x04\xc2\x55\x3d\xae\xd6\xf7\xe7\x1f\xbc\xce\xab\xfe\x5f\xd4\x79\x70\x35\x42\xf4\x19\x0b\x29\x5d\xe0\xe5\x0c\xc4\xca\x35\x52\x72\x3e\x32\xd7\xac\xef\xcc\x21\xb9\x5e\x61\x6c\xe0\xae\x59\xdf\xf9\x9f\xa6\xf3\x0e\x11\xf7\x78\x93\xe8\x6a\x66\xfe\xd7\x33\xfa\xce\x16\x4c\xdc\xca\x3b\xcf\x5e\xda\x87\x2d\x70\x73\xff\x5c\xe0\xfe\xe1\xfe\xaf\x81\xdf\x41\xdf\x5e\x83\xf5\xbd\xea\x25\xf9\xf8\x69\x83\x93\x98\xa3\xc2\xf4\x3d\x08\x7a\x62\x59\x2b\x66\xd5\x13\xc3\xfa\x63\xdf\x57\xfa\x92\x79\x03\xa2\xef\xfb\xd5\xba\xcc\x33\x9e\xe5\x8c\x32\xa9\x20\x2d\xf2\xb4\x2c\x13\xdb\x94\x82\x43\x01\xd3\xf4\x80\x96\x91\x2b\xae\x04\x17\xa6\x9b\x04\x27\x46\x71\xc5\xc1\xff\xcd\xdb\xdf\x03\x49\xae\x6b\x79\x62\x38\xc1\xfc\xe2\xce\xfc\x63\x1e\xfb\xf5\xed\xdb\xdc\xfd\xeb\xed\xa0\xa6\xee\xbd\xcd\x8d\xd5\x48\x98\xe9\xd7\xdd\xd8\xd8\x78\xb3\x58\xc5\xae\x02\xab\x90\x01\x85\x42\xbb\x90\x42\x8a\x80\xa4\x50\x04\xe4\xc1\x84\x09\x13\x26\x4c\x98\x34\x69\xd2\xa4\x49\x33\x4d\x9a\x34\x69\xa6\x99\x26\xef\xed\x22\x4a\x41\x30\xb3\x2a\xfb\xe3\xde\x77\xdf\xbc\x8d\xad\x6e\x56\x66\x65\x65\x54\x9e\x73\x00\x02\xe7\x1c\x9c\xf3\xfb\xd1\x65\xf5\x5f\xcc\x33\xa9\xd0\x0e\x79\x8e\x31\x25\x88\x32\x63\xa5\x13\x34\xb3\x19\x56\x4a\x58\x4c\x14\xd5\x45\x9e\xec\x63\xdf\xf0\xa7\x7a\xff\xcf\x9f\xe8\x7d\x77\x2d\x6b\xbd\xc0\xac\xff\xa2\xde\x87\xaf\x6a\x1d\x63\xae\x0f\x9b\xe3\x46\xd4\xa7\x13\x28\xc2\x24\x5b\xd5\xeb\x70\x36\x83\x68\xd4\x04\x8a\xd3\xa9\x76\x29\x99\xbb\xe5\x02\xcb\x40\x61\x97\xe7\x08\x6a\x76\x92\xd6\x51\x89\x50\x81\x09\x6c\x06\xec\x0d\x44\x12\x95\xf8\x46\xf1\xaa\x3b\x5b\x2d\xbf\xa2\xf8\x98\xe5\x84\x52\x53\x19\x23\xed\x45\x6d\xcd\x0d\x21\x04\x13\x42\x60\xb2\x4f\x57\x7c\x51\x72\xa3\xf7\x7f\xfc\x59\xbd\xef\xbe\xd4\x7b\x85\xe0\xff\x63\xe3\x7d\x69\xde\xdb\x54\x1b\x51\x4d\x13\x40\x8f\x89\x6c\xe5\xa8\xc3\xe8\x47\x59\xb9\xc7\x04\xc0\x69\xaa\xdc\xb5\x47\x03\x54\x2b\x1a\x13\xf6\x10\x22\xa8\xcb\x52\x4b\xe1\x2b\x2a\x23\x3c\x65\xd1\x8c\xd8\x6b\x88\x34\x82\x65\xb1\x27\xf3\x49\x6b\x6d\x8d\x32\xf5\xf1\x6c\x0d\xaf\xac\xd6\x3a\x12\xc3\xc8\xd0\x68\x7d\xd6\xa1\xe9\x8b\x38\xf4\x25\x63\xc6\x49\x7f\x3b\xf4\x18\x53\x4c\xf3\x62\xed\x0b\x5a\x7b\x28\xe9\x57\xec\x70\x29\x57\xfa\xf6\xf5\xe1\xbb\x37\x6b\x11\xfd\x2d\x02\xd5\xaf\xb6\xc3\xee\xd9\x0e\xe9\x71\x9b\xb4\x71\x71\x32\xe1\x68\x46\x19\x26\x1f\x74\x1d\x4e\x72\xa8\x82\x05\x55\x68\x01\x1d\x7c\xda\xcf\x28\x5e\xc5\xe2\x57\x86\x4e\x78\x54\xd2\x52\x23\x5c\x19\xd1\x0d\x4c\x13\x04\x29\x45\xa7\x70\x26\x5d\x55\x62\x8d\x11\x2a\x2f\x13\x62\x09\x19\xeb\xee\x64\x0d\xf7\xee\x2b\x77\x42\x41\xae\xe6\x50\xd5\x6a\x0e\xad\x2f\xe6\x20\x24\x5f\xe2\x66\x17\xe3\x66\xf2\x95\x35\xe0\xd9\x16\xb7\x73\xe2\xe7\x6c\xb1\x9a\x62\xf7\x4b\x33\x82\x6e\xea\x58\xc2\x01\x44\x18\xd4\x51\x9e\x6c\x68\xdc\x24\xeb\x2a\x0c\x80\x86\x01\x94\x8d\x4b\xcd\x6c\x96\x0b\xf4\xcb\xcf\x61\xe0\x8e\xe1\x52\x23\x04\x32\xd9\xb4\x54\x61\x04\x09\x2d\xfb\x09\xd7\x6e\x9d\x14\xe5\xd3\xa4\xd0\xa6\xee\x4f\xd6\xb0\xaf\x4c\x8a\x01\xc6\x39\x51\x3d\xdb\xe0\xd3\x29\xb1\x4f\xf4\x23\x3d\xe8\xed\x29\xf2\x31\xfd\x10\x33\xb9\xff\x76\x8d\x21\x23\x70\xda\x73\xf8\x08\x3e\x0f\x2b\xdf\x7f\xb8\xbf\xbe\xfe\x95\x97\x87\xbd\xfc\x78\xa6\x9b\xe1\x23\xb3\x95\x02\xa4\x0d\x12\xf4\x4b\x84\x17\x92\x0d\x09\x30\x2f\xc0\xe8\x43\xe7\x10\xd2\x15\xef\x01\x89\xb0\xf3\x74\x43\x43\x89\x2e\xbf\xc0\xaa\xe2\x03\xa0\xcb\x2f\xb6\x27\x47\x83\x3e\x53\x62\x85\x09\xad\x0e\x8d\x45\xe5\x7c\xa6\x14\x10\x8c\x94\xa9\x82\xaa\x81\xb2\xfc\xd3\x57\xd6\x7c\x9d\x8c\x39\xa1\x32\xf9\x36\xf9\xbb\xe4\xdf\x25\xff\x7b\xf2\x7f\x25\x72\xcd\x57\xbd\xba\x81\x78\x5e\x06\x75\xf7\x06\x7e\xff\x69\x27\xcd\xbb\x4b\x26\x20\xd6\x9f\xac\x09\xdd\x27\xf8\x80\xef\x7f\x78\x03\xde\xae\x89\xec\xed\xeb\xc3\x77\xdf\xbf\xba\xe1\xd6\xbb\xd4\xa4\x2c\x6f\xdb\x08\x6a\xab\xc8\xa1\x6e\x6a\xde\x8b\x30\x01\x1e\x4e\x25\xe0\x69\x6d\xb3\x3c\x2d\x85\x2b\x09\x14\x25\x2e\xbd\x6c\xb8\x63\x0d\x66\xca\x06\xc7\xb1\x55\x79\x0e\x1c\xa8\x59\xc0\x41\x04\x1b\x28\x03\x02\x70\xcc\x40\xe9\xbd\x14\x5c\x82\xe4\x44\xc2\x10\x46\xa2\x08\x86\x84\xa0\x70\x42\xd0\x15\x08\xd0\x22\xd4\x61\xa2\xc0\xef\x4a\x53\x64\xd2\x86\xe3\xb1\x66\x4a\x78\x2b\x72\x83\x0b\x54\x06\xde\x14\xb6\x90\xa7\x30\x39\x65\x6a\xc5\xa4\x19\x29\xe7\x3c\xcb\x1b\xee\xd4\x70\x36\x96\xb7\x9c\x86\xaa\x23\x5c\x63\xc4\x95\xf3\x42\x29\x9e\xbb\x9c\x03\x41\x39\x12\xd4\x58\x4d\x1c\x7f\xe2\x7d\xf3\x7b\x93\xfc\x57\xc9\x87\xe4\xdf\x25\xff\x77\xf2\xff\x5e\xac\x7a\x01\x1b\x78\xc6\x4f\x79\xf7\x76\xb1\xf1\xdf\x7f\x66\xdb\x97\x37\xb6\xdd\xbc\xbe\x61\x44\x7e\x7d\xb1\xea\xab\xed\x57\x56\xd7\xef\x3e\xbc\x59\xbb\xbc\x7a\xca\x65\x55\x29\xce\xb4\xc5\x5a\x78\xee\x5b\xca\xcb\x13\x18\x4c\x5e\x00\xc6\x74\x89\x0b\x52\x96\x30\x47\xa4\xa1\x06\x51\x4c\x85\x56\xb6\xc8\x27\x50\x2e\xbe\xe8\xe9\x18\x4e\x0c\x18\x6b\x95\x60\xa6\x02\x49\xcb\x5d\x4f\x38\xa5\x05\xa5\x65\x33\x10\x90\x1c\xcf\x92\x73\x2e\xf6\x46\x97\x85\x35\x90\x10\xa5\xc3\x19\x24\x52\x6a\xe5\x8c\xca\x33\xcb\x20\x63\xa1\x6c\x72\x9d\x0b\x80\xc3\x50\x29\x75\x32\x5c\x54\x81\x95\x45\xd1\x48\x2b\xc7\xce\xe8\xd6\xf5\x98\x29\x89\x11\x15\x46\x30\x21\x59\x6e\x73\xc6\x04\x33\x42\x4c\x98\x29\x41\xae\x18\x99\xe4\xe0\xf6\x32\xf9\x6d\xec\x68\xfc\xdb\xe4\xef\x6e\xb1\x70\x23\xc0\xf5\x05\xce\xf0\xdd\x8b\xf7\xdf\x7f\xf1\xd2\x77\xe0\x17\x1a\x06\x77\x39\xab\x06\x20\xa4\xd1\xb9\x94\x7c\x4a\x4f\xac\x5e\x7f\xcc\xb4\x14\x20\x79\x38\x6d\x8e\x0f\xd8\xa7\xd5\x2c\xae\x57\x25\xc6\x13\x1c\x53\x78\xac\x55\xd5\xee\xa5\x26\x39\x37\xcb\x4a\x54\x3b\xa1\x2d\x28\x33\xfa\xf4\x8a\xaf\x84\x31\xa0\xcc\x66\xf1\x30\xa6\x78\x71\x8b\x43\xcf\x27\x25\xb1\x43\x8c\x50\xc3\x49\x92\x64\x69\xfb\xeb\x75\xfb\xee\x4f\xd4\x6d\x3b\xb1\xe6\x04\xb4\x32\x36\xb3\x52\x81\x7c\x93\x3d\xfd\x6c\xa4\x04\xd9\x43\xb7\x99\x1e\xb2\xe7\x8d\xa5\x9f\x51\x2b\x4e\x13\x3c\xa5\x78\x68\x54\x7d\xbc\x2a\x37\x02\x58\x79\x6e\x6e\x94\x8b\xaf\xac\xea\xfe\xbc\x72\xfb\x94\xc7\x5a\x7f\x9d\x7c\x93\xbc\x49\xfe\x36\x79\x9b\xfc\xeb\xe4\x7f\x59\x31\x4d\xe2\xec\x7d\x66\x14\xf8\x07\x70\x59\x27\x7e\x03\x9e\x5f\xfa\xfe\x06\xe9\xee\x86\x39\x7f\xfd\xf7\x84\x15\x7c\xed\x64\xde\x78\x9b\x31\x22\xa4\xcf\x8c\x12\x42\x50\x2b\x9d\x4a\x8d\x65\x44\x28\x97\x7b\x2d\xa4\xa2\x5e\x38\xf5\xd0\x9a\x42\x18\x91\x56\xeb\x03\x75\x0f\x89\x1f\x36\x3a\x58\xe0\x83\xec\x61\xa9\x31\xea\x3e\xe2\x34\x8f\xb4\x0d\x6e\xaf\x39\xc3\x54\x0b\x0a\xa1\xd0\x5a\x73\x2d\x24\x9f\x40\x59\xc7\xd7\xc8\xf2\x92\x30\xcb\x4b\xc7\xa2\x35\x54\xbb\xa2\x33\x54\x87\x2c\x98\xf3\x19\x98\x30\xb9\xda\x75\x04\x61\xc6\x9d\xeb\x5c\xbd\xf8\x14\xd3\x23\x39\xd8\x0d\x7e\x8a\x15\x5e\x5d\xd9\x9e\x7f\x6e\x04\x37\x62\xd3\x3d\x90\x27\xa8\xd6\xe5\xf2\xac\x3d\x93\x3e\xe5\xc7\x4a\xd4\xdd\x06\xcf\x18\x4c\x3c\x9c\x96\xff\x67\x29\x89\x2d\x39\x66\x66\xbd\x6f\xd2\x4d\xb2\xe1\x97\xf5\x07\x5f\xd0\xaa\xde\xbe\xba\x3f\x2c\xd7\x33\x94\xdb\xfd\xbb\xb7\xef\xdf\xdd\x83\x9b\xe7\xef\x6e\xde\xb8\xbc\x6f\x43\x2b\x5b\x55\xd9\x71\xc8\xb5\xe4\x42\x50\xc5\x2d\x76\x4d\x56\x6d\x10\xf3\xcc\x97\xae\xc9\xea\x3a\xbe\xa1\xa2\x46\xa8\x7d\xa6\x97\x2f\x44\xb9\x12\x44\x62\x49\x9d\xc6\x24\xb4\x15\x95\xcc\x6a\x4c\xf4\xfa\x25\x94\x4a\x0e\x11\x17\xc3\xc5\x3e\xe0\xbf\x7b\xc2\x9c\x7c\x3a\x1d\x7d\xf1\x74\xd0\x0b\x9e\x19\xb3\xd6\x68\xe3\xc3\xdd\xeb\x27\xbf\x7b\x6d\x8a\xfb\x22\xba\xfd\x0c\x47\x50\xa2\x02\x0c\x0f\xc9\x60\xfb\x34\xcb\x8b\xc7\x64\xa3\x82\x03\x22\x54\xc0\xb7\x52\xd1\xa6\x42\xe1\x84\xfd\xc0\xbc\x3e\x01\x1f\x21\xef\x9d\x1b\x47\xa0\xc6\xb9\x59\x1f\x10\x10\x36\xbe\xbf\x7e\x28\x40\x1b\xaa\xbd\xa1\xcc\xce\x76\x3d\xf4\xf6\x60\x4c\x07\x8c\xc2\x31\x24\xc4\x10\x5d\x12\xad\x11\x2e\x15\x5d\x9e\x11\x43\x00\x8e\xe1\x3d\x63\xec\x61\x14\xc2\x08\x6b\x45\x72\x00\xd5\x9f\xa9\xfb\xd3\xcc\xff\x32\xda\xff\x1c\x43\x11\x95\x69\xf6\xd1\x9d\xed\x29\x25\x05\x0c\xa7\x4d\x17\x54\x6c\xd1\x3f\xf6\x5a\xd3\x63\x83\x42\x8f\xeb\x33\xab\x5d\x98\x40\x17\x7b\x84\xa4\xbf\x20\x6f\x26\x97\xbc\x9a\x07\xc9\xc3\x08\x4c\x15\x7b\x89\xfa\x8f\x0d\x18\x83\x59\x4c\xe0\x66\x3b\x4f\x6b\x15\xd2\x29\xed\x7f\xbd\x09\x9c\x13\x49\x72\x88\x58\x05\xbf\xc2\x06\x9b\x3f\x7f\xfc\x3d\x82\xc0\x3f\xf0\xc5\xfb\x3d\x15\xb0\xdf\xc0\xd0\x46\x88\x5a\x59\x0b\x49\x9c\xc5\xe1\x88\x75\x43\xb5\x38\x02\x19\xbd\xeb\xd6\x76\x1d\x60\xed\x3c\xad\x0f\x06\x20\x17\xf9\xe9\xf5\x83\x06\x26\xf4\x7b\x43\xb8\x99\xcd\x7c\x0e\x92\x81\xea\x32\xfc\x7d\xc8\xe9\xa2\x31\x55\x8b\xee\x92\xc8\x92\x68\xaa\xe8\x9a\xc6\x89\xba\x9f\x4d\xac\x15\x35\x49\xf2\x17\x1b\xf8\xa8\x0f\x76\xcf\x63\xde\xe3\x77\x11\xff\x6b\x59\x21\xff\x55\xf2\x6f\xd6\xf3\xb8\xaf\x70\xc4\x3d\x1d\x11\x46\x8a\xe4\xd7\x57\x82\xe7\x4f\xea\x07\x2f\x08\xef\x5f\xb0\x5d\xa9\xcd\x31\xc8\xd8\x13\xda\x7f\x1c\xc0\x31\x38\xa0\x82\x70\x20\x0f\x67\x43\x91\x2a\x09\x30\x20\x73\x91\x9a\x63\xae\x15\x21\x82\x02\x8e\x72\x93\x97\x69\x43\x4a\x5d\xa2\x0a\x15\x26\x2f\x43\x06\x94\x8f\x7f\xe4\xf4\xd1\x83\x53\x70\x7b\x3e\x1f\xd7\x09\x6d\x84\x05\x65\xc1\x05\x11\x9c\x2f\x5b\x1f\x2c\x35\xc3\xe2\xe1\x44\xcd\xe2\x3b\x31\x51\x4a\x06\x85\x46\x5a\x20\x2e\x91\x12\x61\xd4\xda\x68\x6b\xf5\xb2\x4e\xfd\x45\x7a\x7e\x54\xff\x05\x6d\x81\xb7\x49\x60\xf1\x06\x58\xd5\xd0\xc0\x06\xba\x92\xaf\xc4\x73\x55\xe0\x40\x51\x59\x44\x34\x99\xad\x26\x44\x12\xa0\xcb\xc2\xe5\x30\x3d\x92\xd2\x94\xc8\xc7\x1f\xe6\x09\x58\xbf\xfc\x91\x34\xf9\x28\xd3\x24\xe8\xc5\x16\xdc\x2e\x33\xdb\x72\x07\x8a\x9c\x09\x2a\x38\x0b\x27\x50\xe4\xa5\xe6\x44\x3c\x8c\xd4\x50\xc1\x38\xe3\x48\xb0\x52\x28\xac\x04\x5e\x6c\xc1\xc3\x59\x29\xab\x9d\xbb\xd8\xc2\xfd\x97\xb4\x45\x7a\xde\xe2\x80\x62\x9a\xaf\x88\x5c\x81\x1c\xd4\x01\xc5\x8c\x59\x45\x4b\x0d\x29\xa8\x01\xae\x0c\xa6\x9a\xcd\x4c\x13\x26\x19\x30\xb8\x70\x39\xda\x24\xb1\x75\xba\xc1\x85\x2d\xca\xb9\x07\x75\x44\x5d\x48\xd1\xc7\x2c\x45\x81\xff\xe7\xb1\xc5\x21\x51\x8f\x64\x87\xf6\x36\xf9\xeb\xe4\x0f\xc9\xff\x9a\xfc\x1f\xc9\xff\x99\xfc\x3f\x8b\x0f\xfd\xf2\x5a\x16\xf4\xcd\xb2\x45\xed\x5f\x7d\xb2\x99\xfd\xfe\xc3\xfd\xf7\x37\xbf\xfd\xfc\x77\xef\xde\xde\x74\xeb\x7e\xd2\x76\xf4\x35\x5e\x9e\x63\x6d\xeb\x3a\x3b\x0e\x99\x16\x9c\x0b\xaa\x98\x2d\x7d\x9b\xd5\xe9\x14\xf7\xbb\x5a\x4a\xc9\x25\xf6\xcc\x94\xae\xcd\x9a\x66\x4e\xc0\x31\x82\xd0\x46\x5b\x64\xf3\xe4\x23\x2d\x39\x03\x4d\xc0\x4d\xcc\xd5\x35\xa0\x98\xf1\xf5\xd9\x1e\x4a\xa9\xf3\x12\xea\x3c\x5b\x2c\x8b\x65\x3c\x29\x2d\xd1\x28\x75\x56\x96\x9a\x09\x29\x84\xa2\x92\x0a\x5d\x22\x3d\x0b\x4a\x0d\x0d\x19\x75\x75\xed\x28\x98\x68\x98\x08\x21\x8f\x49\xcc\x0e\x27\xc9\x3f\x49\xcb\x88\x67\xa8\xbf\x86\xa7\xf1\xc4\x48\x79\x83\x9b\x79\xcb\x48\xf9\xb9\x07\xb2\x5b\xa2\xb5\x37\xdf\xbf\x5e\x42\x8d\xad\xf3\xdc\x30\x8b\x09\x48\xfc\x43\xe1\x40\x86\xa9\x11\xc4\x07\xb7\x11\x0f\x55\x44\xd2\x08\xd3\x96\x7f\xac\x63\x86\xf8\x7a\xa5\x04\xe4\x27\xf2\x98\x4c\x61\x14\x6d\xa8\x18\x60\x7b\x7d\x52\x8a\x31\x12\x8e\x6d\x07\x08\x63\x44\xea\x63\x68\x95\x0c\x91\x16\x87\x86\xf3\xb2\x42\x9e\x4b\xec\x59\x69\x24\xc3\xb6\x4c\x92\x04\xec\x70\xd2\x5f\x78\x12\x9f\xfa\x50\xaf\x65\xee\xd7\xa2\x83\xb7\xab\x27\xbc\x6b\x75\x5e\x50\x57\x55\x75\xdd\xcd\xa7\x63\xd3\x68\x58\x72\xbe\x3b\x17\x82\xc7\xea\xed\x50\xd9\x50\x5b\x0b\xb8\x8d\x50\x03\x91\x63\x03\x6c\xce\x8f\x3e\xf6\xd3\xfe\xee\xa9\xc7\xf8\xcb\x76\xda\xd8\x64\xbc\x75\x1e\x35\x3e\xee\x18\x30\x8c\x80\x3f\x1c\x01\x0d\x3d\x40\x3d\xc2\x46\xed\xce\xe8\x31\x59\x9b\x69\xd9\x53\x33\x6d\xd3\x18\x01\xca\x04\x6c\xfa\x5f\xd3\xb3\xbb\x7e\x88\xf4\x79\xd1\x56\x31\x0f\x14\xf7\xa6\x07\x09\x62\x6b\xf1\x58\xae\x9f\x62\xf5\xf3\xa7\x54\x55\xfc\x94\xda\x88\x48\x22\x0f\xb6\x49\xd2\x1f\xf4\xd6\xac\xba\x1c\xde\xde\x22\xb7\x3d\x23\xa4\xff\x06\xbc\x79\xbf\xad\x2d\xac\xd7\x24\x72\x16\x26\x80\x1e\x46\x20\x16\x87\x7e\x40\x54\xaa\x2d\x87\xb2\x69\x6c\x6b\x5a\xbb\x7c\xd3\x52\x56\xb1\x8f\xd3\x1e\xcc\xb6\xb8\xfc\xed\xbb\xaf\xfe\xed\xb5\x95\xb3\xae\x08\xe8\xeb\x18\x2a\xb1\xb9\xd9\x24\x3f\x96\x1b\x34\xd7\x29\x9f\x4f\x4c\xd8\xe3\x36\x43\xf5\xe9\x54\x9d\xfc\xd9\xfb\xb3\x3f\x39\x29\x63\x3f\x63\x22\x36\xf8\xa0\x22\x66\xd1\x2f\xfc\xfd\x08\x45\xf8\x1e\x68\x07\xc1\xc9\xa7\xc3\x5c\xa6\x7a\xb6\x9b\xec\xc7\x72\x83\x23\x82\xea\x40\x73\x5a\x9a\xe3\xde\x94\xd2\x39\xeb\x8c\x73\xce\x19\xa7\x4b\x86\xe4\x10\xed\x53\x1f\xcc\x65\xac\xd7\x16\xc9\x9f\x19\x8b\xed\x00\x91\x95\xc8\x23\xef\x41\x19\xd6\x62\x65\xf6\xe0\x80\x5d\xf6\xb5\xad\xd5\x9a\x82\x0c\x40\xd8\x2f\xf3\xca\x85\x6a\xf9\xef\x80\x70\x40\xac\x73\x4a\x3c\xba\x4b\x3f\xfd\xf5\x73\x7e\x6e\xd0\xb7\x12\xe1\xca\x96\x75\x0e\x87\x2a\x92\x2c\xf1\x50\x03\x17\xfd\x4b\x0f\xe4\xb6\xac\x2c\x06\x04\x38\xe8\xdd\x17\x9d\xda\x09\x48\xe5\xcd\xe7\x7c\xd6\xa3\xf9\x59\x2f\xf8\x46\x46\x52\xa7\x2a\xb2\x55\x76\x81\xa4\xd9\xc7\x32\x45\x11\x98\xaa\x22\xcc\xb5\xfb\x0c\x7d\xa5\x19\xbc\x77\x12\xd0\x04\xa4\xd5\xa3\x3b\x54\xbf\xee\x73\x9c\x2b\x4a\x50\x56\x11\xab\xa6\x09\x0c\x4c\x1f\x69\xba\xd2\x1b\xd6\x98\xd9\xfa\xe7\x3f\x87\x24\x29\x30\x8f\xc7\xbd\xda\xb4\xc9\xb7\x11\xf9\xe2\x92\x7b\x7a\x15\x6f\xf3\x38\xfe\xfb\xfb\x37\xf0\xfb\xbb\x57\xfb\xc3\xdb\xfd\xe1\xf5\xb7\xff\x02\x1c\xee\xe0\x9b\xdb\xcc\xe1\xfd\x9b\x0f\x77\xbb\x9e\x2a\xbb\xdc\xa1\xd3\x6c\xcf\xcb\x9c\x96\xaa\x04\xf0\x61\x02\x95\xe0\x4d\x2e\x32\x0b\x2a\xa0\xca\xd0\x86\xcc\x52\xc9\x38\xc1\x88\x60\x52\xc2\x3e\x1f\x1e\x93\x4d\xab\x61\x5e\xa9\x4a\xeb\x4a\xb9\x5c\x43\xa9\xf8\xe4\x33\x62\x25\x27\x0a\x13\x44\x25\x43\x4c\xeb\x63\x1c\x63\x99\x9c\x23\x36\xf2\xab\x1b\xcc\xd6\x67\x63\xec\xde\x7c\xb7\x3f\xea\xb6\x8f\x36\x70\x0f\x14\xc4\x8e\xce\xd0\x88\xb4\xdc\x2b\x8b\x50\x50\x3e\x94\xde\x83\xc1\x03\x8d\x1c\x49\x40\xcc\x2d\x36\xfb\x3c\xda\xf8\xdb\xd7\xef\x5f\xde\x45\xb2\xa2\x57\xfb\xc3\x5d\xba\xf9\x76\x77\xf7\xac\xea\x06\x20\xcc\x18\x0a\x5d\x0e\x60\xd0\x29\x71\x06\xc0\xc2\xfb\xb4\x4a\x39\x9e\xc7\x99\x8d\xd2\x71\x2b\x34\x49\x7d\x67\x1a\x40\x2c\xa8\x2a\x7f\x6a\x43\x1e\x4e\x6d\x56\x0d\x4e\x19\x65\xab\x78\x58\x9f\x26\xf2\x91\x1d\xea\x2d\x4d\x5e\x25\xbf\x8f\x08\x16\xbb\x37\xd7\xf4\xc2\xb3\xd7\xbc\xd2\x9a\x47\x59\x76\x77\x7f\x05\x0e\x9f\x9a\x7d\x23\x40\x13\x6a\x04\x5a\xa0\x58\xd5\x44\x6d\xcd\x83\x06\x32\xb0\x79\x24\x5c\x90\xe0\x32\x50\x06\x9d\x2e\x1b\x3f\xcd\xb9\x68\x52\x96\x32\x3c\x9f\x66\x39\xea\x4a\x78\x21\x71\xea\x7a\xe4\x4a\xe1\x61\x71\x72\x27\xe7\x4e\xdc\x71\x79\xd4\x20\x31\x66\xf2\x67\x23\xbc\x93\xd4\x12\x2a\xeb\x95\xa7\x9f\xc6\xf9\xfe\x2a\x76\xcf\xc4\x3c\xd7\xeb\xc3\xa7\x5b\x41\xb4\xdd\xfd\xd5\x76\x6f\xd3\xcd\xb7\x77\x7f\xff\xe1\x46\xe0\x5d\xcf\x04\x06\x70\xa2\xb1\xc9\xae\x3b\x0e\xc3\x5c\x95\x08\x17\x53\x0e\xb2\x70\x02\xad\x51\x53\xa1\x3d\x20\x6d\x8f\x43\x13\x5c\xcb\x8d\x30\x9c\xa3\x9d\x29\x32\x57\x72\x47\x82\xf0\x01\x7a\x0f\x46\x1f\x8c\x15\x15\xc8\x2c\x68\xbc\x3f\x75\x81\x84\xa1\x2b\xba\xb1\x56\xd6\x78\x7f\x4c\x2e\x3d\x95\x34\xde\x37\xeb\x7c\x5e\xe4\xfd\xfe\x82\x33\xfa\xa9\xc0\x1f\x3e\x19\xec\xcf\x05\x16\x02\x03\x0c\x12\xaa\xf4\xf9\x7c\x9a\xfd\x38\x4d\xb3\x29\x11\x2a\xc3\x39\x07\x79\xe8\xc1\x60\x0d\xc8\x0b\xed\x80\xe8\x46\x12\xaa\xa0\x5b\xe9\x84\xe7\x0c\x5f\x85\x2e\x8b\xc0\xdc\x3a\xdd\x5c\x70\x46\xd4\xd3\x55\x68\x1a\xc6\x63\xde\x9d\x6a\x6d\x4d\xed\x22\x2f\xde\xa6\x8c\x58\xb9\xe4\x82\xd3\x0a\x63\x37\xe8\xe7\x78\xb9\xbb\x67\xc0\xed\xf7\x9b\x1b\xec\xdc\x88\xb3\x43\xe6\xa4\x4a\x5b\xcd\x2c\x51\xbd\x26\x56\xa8\x22\x4d\x42\xe2\xfb\x7e\x4f\x7e\x1c\x84\x28\x7c\x41\x77\xea\xc7\x6a\x3f\x8d\xcd\x91\xf5\x0d\xa5\xa7\xda\xf8\xd0\xcf\xd6\x00\x9d\xec\xe2\x39\x83\xf8\x63\x9f\x7f\xe3\xda\x5e\xb1\xb5\x0e\xc2\x68\xe9\x60\xcb\xc5\x83\xf4\xa0\x31\xac\x16\x16\xb4\x96\x5b\x66\x43\x93\x92\xb9\xf3\x91\x45\xe8\x73\x19\xe8\xb9\xd1\x55\xdf\xf4\xf4\xd8\x04\xb1\xca\x00\x2e\xb8\xe7\x38\x22\x2a\x46\xe6\xe4\x77\x77\xaf\x92\xdd\xdd\x5f\x3c\x15\x61\xbf\x7f\xb9\x22\x3d\xc6\xef\x5b\x37\x91\x48\xc0\x68\x37\x32\x8c\xa1\x4d\x87\x4c\x38\xa6\x32\x45\x51\x0e\x33\xc1\x03\xd5\xa0\x62\x15\x0f\x8d\x06\x68\x03\xed\x08\xf2\xca\x85\xfe\xf8\x50\x3d\x26\xb9\xcf\xc5\x09\x9c\xe7\x2a\x58\x03\x68\x9a\x07\x19\x06\x05\xb2\x64\x93\x76\x8f\x62\xeb\xf7\xfc\xd2\x2f\x76\x45\x76\xbc\xf4\x87\xa5\x9b\x37\xbf\xdd\xd0\xd6\xcb\xaa\xa1\x8d\x95\xbe\x02\xc8\x88\xc6\xb7\x7b\x2e\x8d\xf1\x22\x54\xd2\x1a\x2f\x83\xe1\xc1\x06\xaf\x00\x4b\x40\xc4\x83\x93\x7b\x74\xd5\xe9\x65\x2c\xd1\x3c\xdc\xe5\xe9\xfd\xdf\xbc\x79\xb7\x42\x43\x5d\x75\xda\xbc\xf9\xed\x8e\x58\x02\xca\x2e\xd0\x54\xf7\x23\x98\xb8\xc1\x9c\xa1\x32\x2b\x11\x5e\xe4\x2b\x10\x27\xa3\xec\xa3\x2e\x85\xb3\x17\x5d\x0a\x9b\x93\x26\x65\x73\x1d\x8c\x06\x3c\xcd\x02\x0f\xbd\x04\x45\xb2\x49\xea\x47\xb7\xc1\x7b\xfd\x84\x2b\x71\x25\xab\x8d\x0e\xe9\xcb\x6b\x2f\x3c\x76\xc1\xb9\xa6\xcc\x6b\x58\xb6\x4b\x70\xba\x53\x3f\x71\xa2\x77\xa3\xb1\xd0\xc8\xd9\x83\x3e\x20\xbf\xec\x58\x11\x8b\x3d\x31\x97\x5e\xde\xe7\xaa\x81\xf8\x77\x63\x5e\x74\x71\x6f\x5f\xbc\x7d\x01\xde\xbe\xb8\xbf\x3e\x46\xee\x62\xe7\x6a\x5f\x7b\x40\x7c\xe8\x22\xcd\x42\x28\xe2\x43\xbd\x63\x0f\x89\x98\x7d\x2a\xc5\x36\x59\xdc\xae\xa0\x2f\xf0\xeb\xea\x5a\xd9\x04\x36\x32\xce\xcb\x4f\xed\x97\xec\xa2\xfd\xbe\x36\x27\x8e\x03\x01\xe6\x3c\xf7\x9b\x3c\x4c\x61\x4c\xad\x30\x54\x66\x82\xa0\x0c\x66\x94\x05\xad\x81\xa2\x8e\x86\x5e\x83\xe2\xd6\x8a\x6d\x38\xe5\x3e\x67\x63\x9a\x2d\x56\x34\x80\xa5\x59\x10\xe1\xa8\x40\x11\xf1\x0d\xaa\x88\x05\xb0\xce\xcb\xbb\xaf\xce\xcb\x17\xb7\x32\xf0\x30\x12\x70\x04\x70\xe6\x9b\x2a\x1c\x83\xdf\xc0\x4c\x7a\xae\x33\xcd\x70\x5e\x4a\x19\xa0\x06\x9d\x68\x64\x30\x0a\x88\xdb\x79\xb9\x4a\xc1\x4f\x60\x7a\x9e\x97\x3c\xf4\x8b\x14\x20\x85\x8f\xec\xf9\xde\x58\xe1\x4e\x7f\x41\x92\x5d\x3d\xe8\x80\x15\xa8\x54\x18\x08\x18\x01\x9e\xcb\xcd\x10\xea\x60\x37\x3c\x93\x95\x30\x99\x65\x38\x47\xda\xcc\xa3\x49\xf3\x0d\x0c\x62\xf9\x98\x1c\xb0\x67\x61\xea\x30\x2d\x26\xe9\xd2\x72\xae\x82\x37\x80\x26\xe9\x36\xbb\x60\x1b\xbe\x5c\x57\x87\xfb\x17\xf7\xb1\x3d\xf4\xb7\x2f\x63\xc9\xde\xcb\xb7\x7f\x09\xde\xbe\xf8\xe6\xf5\x2d\xff\xf1\x41\xfb\x1e\xb6\x8d\xa9\x1a\xd8\x79\x20\x72\x9f\x17\x3e\x87\x08\x66\x36\xe7\x5a\xb3\x1d\x0c\x0c\xc0\x79\x98\xdb\x41\xb5\x69\x91\x66\x61\x04\xcd\xe2\x8b\xcd\xc7\x99\xa1\x2c\x23\x35\x1e\x25\x55\x49\xb2\x49\xaf\x39\xbb\xbf\x4e\xfe\x61\x65\xfa\x5f\xe3\xd0\x4f\xc2\xd0\x57\xd7\x60\xf3\xc3\x3d\xd8\x1f\xbe\x92\x56\x7d\x0a\x4b\xc1\x17\xc8\x17\x6b\x4a\x6b\x65\x50\xdd\x1f\xee\x36\x49\xb7\x84\x9f\xdd\x90\x29\xc1\x38\xa7\x84\xc9\x8a\xf8\x36\xef\x36\x94\x14\x98\x0b\x4f\x7d\x9b\xb5\x6d\x0c\x51\x7b\xde\x0a\x17\x98\x8f\x34\x6a\x31\xf4\x6c\x52\x16\x10\x14\xec\x04\x08\x71\x65\xda\xcc\x19\xa5\xa0\xd8\x4d\xd6\x1a\x8a\x4d\x9e\x51\xbe\xb8\x36\x19\x41\x42\x34\xc6\x04\x2b\xe1\xfa\x14\x53\xb3\xbe\xc5\x4a\xad\x82\x97\xc6\xbb\xae\x73\xde\x50\x69\x24\xa4\x46\xae\xf1\x66\xac\xa1\x6c\xf6\xe4\x29\x97\xfd\x1c\x73\xc6\xba\xc5\x4f\xf9\xfc\x5f\x7c\x02\x7e\xf4\x79\xb6\xce\x01\x15\x9c\x51\x0a\x94\x40\x07\x6b\xb4\x9e\xa7\x74\x0c\x7d\xcc\x4e\x45\xa6\xd1\xde\x55\x15\x80\x55\x20\xf1\x61\x4f\x02\xd5\xbd\x0c\x4c\x1f\x83\x9a\x99\x8f\x67\x2d\xc6\x83\x88\xd6\xc8\xbd\xf7\x49\x92\x6c\xe3\x3a\xde\xec\xf5\x53\x35\xd1\x05\xa5\xeb\xa9\xca\xf3\xee\x33\x9a\xda\x08\x3d\xf6\xe2\xed\xbb\xbb\x0b\x67\xd9\x8a\xda\xc5\x41\xe6\x41\xe6\x96\x48\xa9\x09\x2a\x07\x53\x10\x1a\x10\x16\xbc\x37\xc1\x30\x40\x54\xb0\xa0\x29\xb2\xe0\x9b\x48\xbf\xbb\xbc\xed\x89\xd0\x61\x5c\x04\xb2\xd5\xac\x9c\x1d\x99\xd7\xa0\x0c\x47\xe9\xd8\xc9\x52\x9a\xba\xaa\xaa\x02\x37\x21\x02\xae\x6c\x23\xfe\xc1\x9f\x2d\x6b\x5a\x01\xe2\xe3\xff\xd0\xf5\x81\xc0\x94\x87\xdc\x03\xc5\x03\xaf\x7d\x80\x64\xb9\x0d\xcb\xb4\x28\xb2\xc0\xfa\xd0\x81\x21\xbe\x2d\x1d\x67\xb8\x5c\xab\xac\xce\xcf\xca\xb9\x9e\x55\x1a\xe0\xd0\x70\x2b\x7a\x47\x58\x1a\x6b\x86\xc4\x93\xac\xcd\x05\xf7\xbe\xbc\x74\x56\x7e\x21\xeb\xfe\x57\x09\x7b\x02\x45\x05\x8a\x98\x75\x1b\x02\xcb\xf2\x14\x06\x64\x81\x64\xc1\x34\x2e\x28\x06\x84\x0a\x1a\x1c\x8b\x2c\xf0\xe3\xe2\x9a\x2d\xe1\x6a\x9f\x76\x33\x59\xae\x67\x69\x29\x75\x03\xf3\x6a\x35\x2d\x1f\xdd\x62\xda\x5b\x71\x93\x6d\xc2\x93\x63\xe4\xb6\x7e\x92\xf7\xe5\xad\xbc\x77\x17\xdb\xbe\x3e\x7c\xf7\xfd\x53\x2d\xc7\x22\xef\xdd\x2a\xef\x15\xc6\xad\x5a\xbc\xf5\xe5\x7f\x28\x41\x31\x67\x74\x5b\x04\xd3\x4e\x22\xb4\x8f\xc9\x7c\x1c\xc2\x20\xfb\x2a\x1c\xd3\x04\x97\x41\x83\x3c\x94\xa9\x5a\xde\x19\xce\xdb\xe4\x21\x59\xae\x7d\x21\xa5\x94\x8e\xcf\x2d\x77\x9c\x54\xba\x6b\x95\x66\xc2\xa1\x32\xa5\x9c\xf3\xd0\x89\x70\xe4\xc9\xf6\xc2\xfb\xae\xe2\xdd\xf4\x77\x2b\xd7\xe9\x67\x48\xa8\x37\x0d\x71\xef\x96\x3b\xec\xfa\xf3\xb2\x9b\x46\x42\xe2\xcd\x13\x5f\xcc\x87\xcf\xf9\x62\x04\x70\xfe\x42\x4c\xde\x81\x63\x50\x69\xd2\xba\xb6\x3d\xcd\xd5\xa9\x9d\xeb\xda\x77\x9d\xe0\xf9\x29\x9c\x50\x5f\x17\x5b\x1f\x3c\xc4\x1c\xe5\xae\x90\xb5\x13\x3d\x0a\x86\x02\x5c\x86\x7e\x17\x53\xd8\xc6\x98\xc0\xb5\xb6\x8d\xb5\x8d\x55\xca\x56\x45\xae\x28\xb6\xb0\x0b\xca\x86\x09\x16\xc4\xe0\x56\x30\x01\x60\x50\xdc\xd2\x65\x03\xdb\xa5\xed\xc5\x1f\x5e\xfb\xff\x71\xec\xbc\xf8\xa4\xeb\xff\x7a\x1a\x7e\x9b\xbb\x04\x4b\x90\xfe\x84\x4d\x71\xc1\x37\xb8\x8b\x2f\x2f\xab\xfe\xa7\xbc\x5d\x5b\x15\x2a\x70\x72\xe0\x14\x9c\x9f\xd4\x54\xb9\x6a\x92\x43\x7a\xb4\x9c\x2b\x31\xb7\xa4\x70\x05\x01\x93\xd5\x91\x87\xc6\xd5\x75\xdb\xba\xd0\xa1\xd0\x9a\x7c\x2a\xce\x13\x03\x16\xfb\x1c\x52\xcc\x31\x86\xa5\xf4\x5b\x6f\x01\x0b\x8d\x55\xc2\x5a\x1f\x5a\xc0\x5a\x65\x69\xca\x98\x65\xb1\xff\x1f\x59\xf5\xb1\xc1\x3d\x20\x56\x6b\x1b\x3a\x1b\xce\x20\xd7\x29\x2b\x58\xa8\x82\x32\xaa\x03\x5d\x89\x11\x51\x18\xe1\x52\xb4\x37\x38\xc3\x22\xf9\xe1\xa6\x77\x35\x01\xaf\x77\xaf\x9e\xe0\x99\x23\xeb\xdb\x13\x5b\xfa\xbb\xcb\x11\xe7\xbb\xdd\x1b\x08\x62\xd2\xee\xc5\x3d\xb8\x7b\x75\xf7\x36\xde\x45\xeb\xe3\x21\x61\x81\x18\x54\x56\x08\x0d\x41\x37\x20\xa1\xe1\xdc\xb9\x3a\x9c\x04\xc8\x7c\x70\x6d\x01\x15\x2e\xab\x20\x10\x38\x01\x37\x63\xb7\x39\xb9\xc0\x17\xf5\x63\x90\x6c\x9f\x9e\xed\x85\x45\x27\x29\x4b\x41\x6d\xc7\x9d\x3e\x87\x0e\xb0\xc1\x1b\xd5\x58\x8a\x31\x17\x63\xee\x7e\xf4\x6a\x83\x1f\x8e\x69\x5b\xd7\x61\x6c\x9a\x64\x7b\xe1\x2e\xb9\xf2\xb7\xfe\xed\x6d\x0f\xd1\x15\x04\x79\x13\x31\x0b\xbe\x42\x92\xfa\xfe\xc3\xb2\xb2\x76\x05\xac\x10\x04\xcd\xc7\x81\x6d\xec\x83\x76\xcb\xa2\xd9\x6c\xba\x66\x04\x63\x80\x22\xa2\x18\x70\x16\x32\x30\x55\x76\x26\xbb\x13\x5e\x42\xdf\x95\xc0\x35\x48\xa7\x44\xe1\x46\xca\xa0\x87\xb0\x73\x32\x26\x41\x37\xb1\x76\x6d\xc5\xcf\xf9\xe7\x11\xed\xf6\x82\x62\x1b\x2b\xb5\xa2\x55\xe3\x44\xf9\x0e\x44\x94\xdb\x6f\xc1\x67\x89\xa6\x57\xf7\xcf\xc0\xd8\x5b\xe5\x0a\x98\x62\xd9\x0c\x23\x0b\xe3\x38\x86\x16\x83\xbc\xd3\x82\x32\x01\x12\x20\xc6\x32\xe4\x59\xae\x42\x03\xaa\xf5\x96\x52\xc1\x2d\x52\xfb\x45\xdc\xf5\x70\x65\xaf\x21\xc6\xa6\x31\x1c\x39\xaa\x35\x33\x94\x53\x41\x91\x6c\x1e\x13\xcf\xf2\x5c\x85\xdc\x39\xe3\xac\x73\xa7\x93\x73\xd6\xad\xb9\xa3\x24\xee\x03\xc5\xba\xaa\xbe\xba\x5b\xc1\x11\x5e\xef\x0f\xaf\x7f\xbb\x3b\xfc\xf0\xe6\xdb\x57\xdf\xa4\x4f\x65\x37\xbf\x8f\x28\xf8\xe0\x4d\x7a\x78\x52\xeb\xc3\xdd\x46\x6f\xc6\x80\x08\xd5\xb4\x62\x46\x8c\x59\x03\x32\x76\x34\x99\xf7\xcc\x41\xab\x29\xc9\x86\x30\x4a\x40\x40\x86\x8e\x67\x06\xf2\xb6\xc4\xb5\x11\x20\x3f\x86\x6a\x5f\x78\xc9\x6c\xeb\x34\x6d\x6a\x18\x46\x5d\x29\x8f\xd0\xf4\x98\xc0\xaa\x6c\x1a\x29\x96\x69\xd5\x02\x5c\x85\x49\x5b\x77\x22\xc4\x13\x63\xa7\x35\xce\x9d\x1e\xd5\xa1\xde\x9d\x92\xdf\xc4\xb3\xec\xfd\xee\xe2\x1e\xaf\x56\xdf\xdd\x32\x32\x89\x21\x9c\x64\x4a\xc6\x99\x6c\x34\xaf\xcf\x03\x7d\x4c\xe6\x72\x53\x07\x09\x86\x8f\x36\x4d\x82\xdb\xd8\x8a\x7a\x03\x2a\xa7\x87\x9a\x29\xef\x46\x17\xa8\x73\xa0\xbd\x8c\x2d\x8b\x7b\xe4\x15\xed\x7e\x89\xa2\xaf\x30\x41\x71\x4d\xbf\xb8\xfd\xef\xdf\x2d\x8e\xff\x37\x87\xb7\x2f\x0e\xa5\x09\x79\x07\x30\x0f\xc3\x60\x43\x65\x80\x13\x01\x69\x60\x7c\x30\x63\x76\x02\x26\x9b\x76\x78\x76\x2e\xe8\xae\xea\x41\x15\xec\x24\x41\x01\xa4\x4b\xd5\xb2\x35\xce\x8e\xd2\x65\x01\xa0\x14\x8c\x31\x5f\x42\x2f\x78\x94\x17\xde\x88\x2b\xc7\xdb\x85\x91\xe0\xf0\x26\x79\x11\x59\x38\xde\x03\xeb\x14\x31\xba\xcd\x2b\xa5\x84\xe4\x8d\x05\x78\xf0\x05\x77\x6c\xaf\x83\x54\x46\xb6\x6e\xa8\xdc\xb1\x75\x47\x1f\xda\x41\x02\x9d\x42\xd0\x97\xa1\x0a\x13\x5f\x0c\x7a\x00\xe3\x23\xdd\x9e\x23\x37\xfd\x9b\x88\xb6\xf1\x1f\x93\xff\x2d\x11\xf1\x13\xaf\xff\xee\x5e\xbe\xbd\xc1\xea\xb9\x20\x9f\x5c\x2b\x6f\xbf\xff\x85\xdf\x81\xf5\xde\xbc\xdf\x1f\x56\xfa\xfa\x1f\x56\xae\xdb\x97\x1f\xde\x7f\xb8\xff\x36\xcd\x54\xcf\x8f\x72\xc6\x06\x31\x84\xca\xb2\x2c\x19\x5a\xbe\x00\x2a\x59\x19\xbf\xd6\x87\x40\xd2\x69\xce\x70\xaa\x49\x51\x88\x3c\x0c\xc1\xa1\x1e\x96\xd8\x02\x19\xbc\xd6\x65\x7e\x2e\xf7\x64\x66\xb1\x9e\xa4\x7e\x98\xd2\x46\x29\xa2\xa8\xa2\x2a\x7e\x23\xf1\x27\xc9\x94\x62\x92\xaa\x19\x6b\x1e\x5a\x81\x97\xcd\xc3\x14\x46\x48\x1d\x78\x21\xa9\x58\x62\xbc\x6d\x17\x31\xa9\x54\x02\x6f\x3c\x8d\x1b\x08\x83\x15\xbd\xfa\xc3\xb7\xaf\x0f\x6f\x9e\x4b\x70\xc1\x25\xb5\xf2\xf2\xd2\xfc\xb2\x5c\xbb\x72\x30\x7d\x0f\x92\x70\x12\xdc\xf9\x12\x49\x89\x75\x3e\x4e\xa5\xe6\x23\xc8\x87\x94\xa1\xb9\x60\x9a\x90\x0a\x63\x4f\xc8\xae\xe9\x3a\xdd\xe9\x41\xe4\x25\xa3\xd0\xb5\x25\x45\x85\xd2\xbd\xee\x1e\xba\xf9\xa4\x54\x5a\xcc\x27\x50\xc7\x43\x32\xbe\x72\x11\xec\xc0\x74\xa9\x71\xb9\x7b\xaa\xde\xf9\x64\xd7\xde\x1f\xbe\x5b\x41\x08\x2f\xb8\xdb\x1f\x2e\x88\xe6\xcf\x82\x5e\x23\xd4\xf4\x04\xba\xb5\xef\x03\xce\xd8\x70\x90\x03\x88\xb0\xae\x6b\x85\x49\xe0\x01\x96\xb5\x09\x4d\x0a\x03\xd9\x66\xd5\x4f\xb2\x8a\xe4\x9f\xb1\xec\xbe\xd9\x75\x6d\xeb\x5a\xd7\xd1\xbc\x44\x88\xd9\x56\x51\x42\x8a\x65\xa2\xb5\x0f\x5d\xc8\xbd\x07\xe7\x90\x3f\x11\xf9\xcb\x45\x66\xf3\xa8\x0e\x72\x07\xff\xb1\x32\xaf\x9d\x1d\xcb\x95\x0a\x70\xf6\xe0\x14\x8a\x54\x3d\xf4\x5c\x00\x08\x70\x01\xb5\xb5\x0a\xa1\x80\x42\x52\x56\x26\x88\xd4\x84\x7c\xeb\xf4\x4f\x45\xeb\x23\xb2\x49\x0f\x78\xdf\x6f\x6b\xad\xad\xb6\x86\xe5\xa8\xc8\xb9\xb4\x0a\x61\x9a\x1b\xe6\xac\x9e\x79\xb0\xce\x2d\x81\xc0\xf9\xbc\x16\xa1\x1f\x36\x26\x62\x40\x9b\x58\x79\xf9\xc9\xee\x79\x69\x4c\xbc\x4e\x83\x17\xef\x77\xf7\xef\xbe\x28\xa0\xfb\xb9\xd6\x94\xed\x59\xb8\x9a\x92\x22\xb7\xa8\xb0\xb9\x56\x74\x00\x4e\xa5\x09\x53\x25\x2a\x70\x09\x8b\xdc\x64\x4e\x6b\xa0\xdd\x6c\x9c\x9b\x26\x60\xa7\xd9\xc4\x87\x69\x6f\x94\x40\xc1\xc0\x92\x31\x78\xec\x4b\xc5\x09\x4b\x25\x76\x6e\xee\x8f\xb9\xc9\x96\xdd\x40\x8d\xac\x0d\xed\x83\xa6\x74\x63\x43\x7d\x3c\x1e\xe7\xb1\xef\xfb\x45\x97\xe2\x91\xc6\x73\xba\xcf\x75\x59\xdb\x2c\x3f\x5c\xed\xfe\x59\xb3\xed\xaa\xc9\xcb\xfb\x1b\x08\xc2\xeb\x41\xe5\xea\x57\x17\x53\xad\xaa\xbe\x86\xa5\xe5\xd8\xe5\x99\xa9\x69\x8a\x52\xc2\x2c\xa6\x90\x91\x12\x66\xbe\x1c\x44\x0d\x35\x38\xf9\x19\xf9\xe8\x76\x2f\x4e\xf5\x8c\xae\xcf\xc2\x69\x37\x62\xa1\x39\x0a\x5a\x70\x8a\xeb\x23\x41\x25\xa7\x34\xad\xe6\x7e\xcc\x7c\x66\x81\x08\x79\xab\x6b\x60\x67\xf6\xa0\x18\xdb\xb8\x50\x77\x5d\x6c\xd2\x39\xae\x7c\x92\xe3\x45\xaf\x97\xc9\x9b\x1b\x44\x87\x04\x7c\xf7\xe1\x76\x94\xfe\x64\xc5\xd2\x11\x64\xad\x6a\x46\xc9\x60\x69\x04\x71\x79\xe6\x6a\x96\xd2\x54\x70\x87\x29\xe4\xb8\x2c\xf3\xba\x3c\x8b\xae\x30\x69\xe2\xe7\xcc\xaf\x87\x74\x47\x80\xe6\xec\xfa\x2c\xf4\x4f\xaa\x21\xcc\x56\xdd\x90\x78\xd6\x4d\x02\x13\x8a\xee\xe7\x75\xdb\x6f\xca\x27\xce\xba\xc5\xd7\xf9\x9b\x58\xff\x7b\xd3\x37\x7c\xa5\x09\xff\x3a\xb7\xd8\xa2\x88\x42\x05\x18\x3e\x7a\x30\x14\x30\x9c\x37\xf4\xa1\x75\x69\x39\x0f\x1b\x24\x25\x61\x50\x61\xf2\x30\x79\x90\xa5\x70\x1e\x63\x43\xdb\xde\x50\xe1\x1c\x41\xc1\x07\x6d\x6c\xb0\x73\xb9\x52\x90\xa5\xf0\xe1\xbc\xa9\xc2\x14\xb8\xad\x62\xdd\xae\x7d\xa4\x9b\xe1\xc9\x07\xfb\x42\xae\xcd\xcf\xc9\x75\x0d\xd0\x53\x5e\xe4\x80\x3f\xb4\x80\xe5\xc5\x31\xb5\xb3\xb6\x8b\x23\x93\x32\x2e\x30\x83\x12\xa3\x79\x74\x23\xb0\x41\x1b\x63\xf6\x96\x32\x6b\x09\x0a\x2e\x48\xe3\x83\x9a\x4b\xc1\x73\x9b\xd1\x14\x3d\x9c\x37\xfe\x31\x09\x5c\xaf\x7e\xae\xfd\x73\x6d\x95\x91\x32\x85\x3f\x4d\x29\x82\x65\xe8\x36\xcd\x03\x73\x11\x04\xb4\xd6\x8a\x08\x68\x08\x7b\xd0\x15\x40\x8b\xaf\x18\xcb\x14\xf6\x86\x72\xef\x31\x0e\xee\x62\x2b\x28\x44\xee\xf3\x55\xae\x5b\x5b\xe9\x47\xba\x35\xff\x08\xb9\x9e\x6c\x55\xc1\x1c\x34\x1f\x27\x50\xc7\xfa\xb1\xfc\xe1\xec\xe2\xc2\x77\x12\x12\xad\xc6\xa2\xfe\x9c\x66\xf3\xe4\x4e\xa7\x5f\x37\x80\xab\x4c\x62\x07\x3f\x95\xe9\xe5\x17\x7e\xf4\x17\x32\x5d\xb9\x24\x34\x70\x79\xe1\x61\x0e\xda\x87\xc2\x2c\x91\xb1\x8b\xe9\x9f\x5a\xca\x38\x7e\x74\x36\xfe\x0c\xfa\x80\x6c\xd7\x6d\x2b\x84\x20\x21\x9a\x85\x56\xa9\xd0\xcf\x0d\xe3\xb9\xcd\x29\xa8\x67\x9b\x4e\x7d\x68\xa5\x4e\xf6\x49\x03\xe8\x81\xec\xae\x7c\x16\x30\xf9\x2e\x72\x7f\x5e\xf1\x3a\xae\xe5\x02\x57\x80\xb2\xe8\xcd\xbf\xb8\x7f\x71\x7d\x7d\x8b\x61\x91\xf6\x3f\xaa\x4d\x06\x43\xb2\xad\x3f\xf2\x6a\x23\x1f\xfc\x76\x64\x1c\x22\x28\x8b\x9f\x4e\x1e\x90\x4d\xff\x80\x5c\xda\xcc\x6c\x67\x10\xd2\x1a\x8d\x61\x12\xf4\x14\x5a\xca\x32\x8d\x8f\xc1\x80\x71\xf1\x84\x78\x9c\x47\xe4\x20\x77\xf9\x45\x96\xbb\x58\x1d\x9b\x80\xbb\x3f\x66\x9a\xab\x30\xa9\x4d\x0b\xe4\x61\x91\x96\x1f\x61\xb5\xd1\x0f\xd6\x47\x98\x5a\xa7\x14\xa6\x50\x22\xfa\xa0\x3c\x80\xa9\x99\x8d\x5b\xb6\xc5\xad\xe7\x10\x13\xc3\x62\x49\xc2\x30\x1f\x05\xcf\x5d\x4e\x41\x35\xdb\xf4\x7c\x0c\x8d\x16\x6b\x9d\x7c\xf5\x88\x0f\x72\xc7\x3e\x93\xe9\x53\xa6\x8f\x5f\x90\x69\x8b\xca\x22\x9d\x7e\xc4\x1b\x88\x42\xb9\xf5\x1f\x65\xb5\xe1\x0f\xf5\x76\x90\x92\x2b\xe8\x29\xf9\x69\xf0\xc0\x6e\xd8\x43\xe3\x22\x18\x3c\x23\xcc\x5a\x11\xba\x50\x6b\x19\x8e\xcb\x88\x15\xb6\x58\x46\xcc\xa5\xe7\x7e\x79\x31\xca\x54\x3f\xd2\x83\xdc\x92\x9f\x9b\x43\x9f\x0f\xda\x17\x42\xd5\x9b\x2c\xcb\x1d\xcc\x37\xf9\x8f\x04\xe4\xdb\xea\xa3\xa8\x36\xe2\xa1\xda\x8e\x52\xae\x96\xfa\xa9\x5b\xa4\x12\x0f\x55\xec\x45\xda\x8c\xb0\x28\x4b\x6c\xf0\xe2\x4f\x4d\xa1\x60\x2c\x37\x19\x01\x74\x3e\xa7\xb6\x0b\xa3\x10\x2b\xfe\x07\x3d\xf8\xed\xf4\x27\xdf\x6b\x57\x99\x36\x13\x2a\x36\x7c\x1a\x36\x30\x87\x01\x6f\xdb\x8f\xd4\x2f\x11\xe2\x0e\x4a\xb5\xdc\x6b\x88\xfc\x64\x3d\x68\x97\x80\xd4\x2e\xeb\xe8\x76\x22\xc4\xb9\xb2\x0c\x8b\x55\x54\x38\x86\x42\x88\xdc\x65\x0c\xd0\xb9\x4f\xeb\x63\xa8\x95\x5e\xc7\xcf\x83\xf1\x20\xf7\xd5\x25\x63\x79\x99\xdf\x2f\xef\x2e\xb0\x2c\x7f\xcc\x52\x7e\x93\x21\x4f\x36\xf0\x47\x04\xe8\x96\x7d\x6c\xdc\x06\x3d\xf4\xdb\x4e\x4a\x44\x20\x47\x74\x19\x3d\xb3\x8c\x9e\x5f\x64\xda\x23\x82\x94\xc5\xcb\xf4\x1e\x03\xe7\xab\x95\xf2\x80\x52\xda\x84\x51\xf2\x95\xef\x2c\xbf\xe4\x7b\x7e\x7f\x73\xe2\x1d\x33\x22\xd7\x30\xf4\xc5\xca\xfd\xb0\x7d\xa6\x19\x5b\x0f\xbb\xd7\x5f\xbe\xdf\x8c\xca\xb5\xb1\x40\x41\x56\x40\x86\xf3\x0a\xa7\x16\x12\x70\x74\x03\x48\x00\xa2\xc1\x86\x31\x4c\xa1\xe1\x00\x0e\x95\xe2\x6e\x18\xf4\x83\x4c\x93\x90\x0c\x7b\xa4\x09\x6c\xac\x4f\x4f\x73\x51\x59\xef\xe6\xc2\xea\xc9\x71\xec\x89\x31\xa4\x42\x4c\x18\xed\xa5\xaa\xbd\x4d\xfb\x58\x8b\x93\xba\x0b\x3f\xc5\xfb\xf5\x8c\xfa\xc3\x93\x10\x1f\xae\x1d\x0d\xab\xe4\x6b\xb4\xb1\x4a\x9e\x3e\xb7\x2c\x7c\xf8\xe1\xcd\xe6\xa8\xbb\x2a\x17\xf4\xa1\x05\x4d\xa0\x8d\x51\xda\x0d\x03\x80\x1e\xc0\x61\x18\x80\x0a\x14\x74\x6e\xec\x01\x46\xc1\x86\xf3\x39\x0c\x0c\x24\x5d\x25\x41\x53\x29\x95\x33\xe1\xaa\x74\x28\x69\x14\xba\x5e\x84\xae\x6d\xe5\xe6\xbc\x52\xe1\x6c\x59\x5e\xe5\x56\xe3\xaa\xa4\xda\x5f\x38\x9d\xff\xcc\x3d\x88\x21\x08\xce\x1f\x15\x18\x0b\x18\xc6\x65\x15\x8b\x84\x65\x1b\x2e\x15\x61\xa5\xc6\xf4\xe1\xb8\xac\x1e\x68\xee\x63\x09\xe5\xaf\xde\xaf\xd5\x23\xd9\xf2\xbd\xfe\x93\xf7\xeb\xeb\x7a\x9f\x2a\x0c\x63\x85\x48\x5d\xa0\x98\x0d\x8d\x34\x1f\xa9\xe5\x02\xd1\x52\xe2\x72\x76\xfe\x0c\xda\x40\x6d\x5d\xef\x35\x13\xd6\x52\x1c\x7c\x4c\x98\x98\xb8\x2f\xba\x8c\xa5\xe8\xe1\xb4\xa9\xce\x81\xeb\xee\x8a\xd5\xb3\xdc\xab\xe2\x1f\xbd\x7e\xa8\x0d\xce\x73\x0f\xf3\x0d\x9d\x06\x40\x9e\xd7\x8f\x93\x58\xd7\x0f\xf2\xe9\xfa\xb1\x4d\x60\x51\x22\xa4\x59\x38\x49\xba\xac\x1f\xeb\x36\x44\xe7\x53\xea\xfa\xd0\xcb\xb8\x7e\x98\x47\xbc\xcd\x77\xd9\x9f\xbc\x2f\x5e\x9b\xec\x0d\xb0\x11\x4f\x1d\xa8\x07\xa5\x9e\xf7\x45\xc7\x39\x26\x50\xa0\x72\x76\x2e\x92\x60\x2a\x5d\x55\x5b\x89\x31\x62\xcc\xb2\x30\x68\xf2\x98\xcc\xfd\x45\x22\x33\x57\xe9\xa9\x0f\x47\x29\x57\x3b\x2d\x31\x88\xdd\x15\x3f\xb3\x37\x7e\x3e\xa5\xbe\x58\xfa\xb3\x12\x6e\xf0\x34\x2d\x4b\x7f\xb6\x2b\x7e\x3a\x55\x9b\xe1\xa1\xdc\x61\x29\x98\x84\x3d\xfa\xa9\xad\x80\x5c\x7c\x1d\xbf\x78\x61\xbb\x82\x50\x6b\xf9\xb2\x9c\x19\x11\xfa\xb9\x8f\xbb\x23\x70\x73\x9b\x1e\x87\xd0\x2e\xbb\xd1\x76\x53\x3f\xea\x18\x77\x3e\x77\x4a\x7f\x82\x77\xfb\xea\xa6\x52\xf4\xd5\x27\x9c\x6f\x6b\x42\xfb\xdd\xfd\xee\xdd\xdd\x13\x76\xda\xa6\x6e\x2a\x40\x7c\xd3\x8c\xb1\xc2\xdb\x06\x0d\x68\x68\x41\xf5\x50\x80\x26\xb4\x80\xc6\xaa\x70\x07\xd4\x63\xd2\xa4\x2e\x74\x7a\xb9\x5f\x4f\xbb\xb3\xb5\xd6\xba\xb3\x0a\x4a\x39\x65\x95\x8b\xdf\x14\x70\xea\x2c\xa5\x0c\x89\x31\x26\x72\x50\x89\xad\xdf\xeb\xa7\x0a\xef\x0b\xd2\xc6\x57\xe5\x7c\xff\xe1\xd5\x76\xf7\xe6\xfb\x4f\x24\xbd\xff\x54\x52\x79\x72\x00\xfb\xd3\x29\xfa\xa5\x91\x7a\x42\x06\x7f\xea\x02\x9e\x47\x08\x8e\xa1\x02\x22\xca\x6a\x81\x3e\x9d\xd2\x26\x1c\xed\x38\x02\x7d\xde\x0d\x55\xe5\xbd\x3b\xcb\x60\x85\x15\x46\xe7\x85\x25\xb8\x2a\xad\x11\x56\x00\x2d\xcf\x4a\xa9\x50\x2a\xa5\x92\x6d\xa2\x96\x78\x7e\x3b\x3e\xdb\xf5\xd3\xf3\x82\x3f\x6a\xd7\xbb\xdd\x0d\x48\xa6\x05\xd6\xa7\x4d\xb5\x4c\xb5\xc0\x96\xa1\x8d\x07\x2e\xcd\xcc\x36\x74\x1a\x37\x91\x04\x75\xce\xd3\xf3\xac\x52\x17\x44\xd0\xdb\x7e\x66\xd3\xb2\x3c\xa7\x3e\x4d\xb6\x15\x21\x84\xe8\x96\x85\x86\x69\x6a\xa8\x73\xd4\x50\xcd\x00\x63\x2d\x63\x2c\x28\xb1\xec\xb5\xdb\x14\x3d\xaa\x43\xb5\x4b\x7e\x66\x1e\xfc\x71\x79\xef\x6f\xe5\x4d\xc9\xd9\xa7\xb8\x3a\x9f\x83\x8b\x62\x94\xf3\x00\xa6\x90\xa5\xea\x27\x97\xaa\x90\xa4\xc9\x7c\x4c\xf1\xf2\x18\xdc\x79\xd3\xcd\x47\x1f\xe3\x85\x04\xa8\xad\x97\x52\x4a\xd5\xf1\xd0\x32\xbd\xfc\x8b\xdf\x18\xa0\xbc\x5b\x84\x15\x52\xca\x38\x17\xf4\xb6\xd8\xab\x5f\x39\x17\x5e\xff\xd1\xb9\xd0\x3a\x00\x5d\xdb\xf6\x31\xfd\x2a\x43\x8c\xfd\x2a\x97\x07\x1b\x70\x01\x4c\x68\x00\x8b\xb9\x58\x0f\xe4\xd0\xa6\x32\x8c\xb6\xef\x81\x1c\x76\xa7\x65\xde\xda\x51\x06\x25\xad\xb4\x32\x2f\x0c\x2d\x1d\x34\xcb\x73\xe0\xe4\xb8\x4c\xde\xfc\x82\x23\xb1\x4d\x0c\x40\xdb\x66\x6f\x9e\x50\x44\x13\xf0\x73\x12\x7f\xff\xa5\xc0\x71\x3b\xdc\x45\xfa\xf0\xc5\xc0\x6f\xdf\x01\xee\x80\x70\xc3\x70\x8a\xf7\xd9\x72\x89\x50\x01\x99\x07\x36\x4f\x05\xe8\xa2\xb8\x32\x4e\x6b\xff\x98\x0c\x03\x38\xc7\x19\x9d\xaf\x4d\x18\xa7\xbd\xe1\x9c\xeb\x9a\x86\x9e\x28\x2a\x79\xa1\xca\xd2\x16\x42\x52\x45\x00\xa2\xb5\xd6\x34\x78\xce\xa3\x6f\xb1\x05\xf5\xa3\x3a\xa8\x1d\xbe\x45\x52\xf8\xc7\xcf\x63\x30\x2d\xfb\xf4\x18\xf3\x06\xa1\x5d\x02\xd5\xd8\x9b\x5d\x2c\xab\xf6\x4f\x38\xad\x23\xcf\x40\x9b\xd2\x79\x48\xcb\x70\x0c\xe3\xc6\x07\x18\xd9\x77\x52\x08\xcc\x76\x64\x8c\x73\xdb\xf3\xd0\x31\xc3\x0d\xb3\x36\x3e\x00\xc2\x7b\xce\x79\x90\x8c\xb1\xc8\xc7\xfe\x4b\xeb\xd9\x9f\x3a\x8f\xcf\x83\x07\x8d\x1f\x86\xd0\x2d\xf1\xcf\x12\xa8\x2d\xfb\x62\xa4\xe4\x44\x71\x81\x40\xa0\x0f\x14\xb4\x61\x71\x32\x03\x6b\x2e\x69\x10\x72\x59\xd3\x26\x15\xf4\x27\x6b\x9a\x55\x93\xd6\x3a\x64\xcb\x9a\xb6\xdf\x4c\xf1\x9c\xe1\x8a\x5d\xf1\x4f\x93\xb7\xf1\xb4\xe1\x96\xd8\xef\x93\x42\x6b\x70\xb7\xd2\x61\xdd\x1e\x56\xfd\x1b\xf0\xfd\xfb\x0f\xf7\x97\x14\xff\x16\x45\x30\x8d\x98\xa8\x3b\x87\x3c\x1d\xdc\xac\x2c\x50\xb0\xf4\x18\xce\x27\x90\x21\x57\xe4\x60\xaa\x21\x73\x86\xab\xd6\x9f\x98\xa2\xe6\x31\xc1\xe5\x00\x34\x84\x82\xd1\x72\xcf\x67\x07\xb4\x0a\x95\x0a\x22\x9c\xaa\x0a\x14\x08\x21\xc2\x42\x5d\xe7\x8c\x9a\x4a\x11\x6a\x29\xd7\xa5\xc9\x21\x96\x52\x72\x0c\x4b\x66\x23\x2e\x35\xd9\x26\x7b\x1e\x2b\x73\xfe\xe9\x15\x41\xfd\xc5\xdd\xb7\xaf\x6f\x0a\xc5\x9f\xfa\xb8\x5f\x7e\xae\xc3\x3f\x80\x0f\xbf\xbf\x90\x76\xbd\x8c\x5d\xaa\x63\x7a\x0c\xc7\xa2\x00\xcc\xcf\xbd\x07\x32\x2f\xce\xee\x9a\x2d\x15\xae\x80\x60\xf0\x98\x1b\xc5\x65\xd5\x9c\xa9\x39\x66\x13\x41\x3d\xc8\xcb\x8a\x97\xa7\x72\xd1\xc0\x62\x1a\x86\xba\x06\x25\x21\x20\xc2\x69\xce\x7d\xc1\xa8\x6d\x25\x65\x86\x2f\xd2\x17\x34\xcb\x95\x10\x96\x07\xca\x2c\x5d\xb1\x06\x37\x3e\xfa\x7a\xf8\x69\x2c\xfe\x3e\xf9\xf0\xcb\x63\xf1\x3e\xd6\x57\x3c\xe9\xb1\x7b\xf3\xfe\x43\x1c\x8a\xc3\x32\x10\xc9\x32\x10\x55\x9c\x2f\x4b\x70\x7f\x74\xb3\xf6\xd1\x99\x28\x8b\xb9\x05\xa8\x2c\x2a\x9c\x16\x1d\xe2\xb5\x13\x66\xe8\xc2\x40\xc7\xfa\x31\x21\xe8\x0c\x2a\xda\x32\xb4\xc7\x73\x0d\xa4\x0a\xb5\x8a\x74\x98\x1e\xe4\xa8\x44\x84\x86\x86\xb3\xdc\x1b\x2f\x29\xb3\x9c\x6b\x64\x20\x93\x42\x18\x4a\x4d\xb2\xd9\xc0\x58\x1f\x8e\x63\xaf\xc7\xbb\x95\x23\xe4\x52\x5d\x7b\x43\xa2\xf6\xe2\x6e\x6d\x14\x5e\x74\xda\x7c\x81\x6a\xff\xee\xed\xa6\xdd\x8c\x1f\xed\x56\x3c\x60\xa0\x10\x34\x05\x04\xdd\x7c\x2e\x48\x9a\xcd\xb2\x44\xb2\xe1\x64\xb9\x17\x8d\x05\xd8\xd6\xb5\x0d\x47\x5b\xd7\xe9\x38\x13\xb7\xaf\xdd\xdc\x31\x56\x50\x62\x11\x0d\x25\x20\x65\x29\x8c\x09\xa4\xdb\x58\xe7\x7d\x5c\x25\xed\xb2\x06\x0e\x40\x1d\xc8\x9e\x25\x87\xe4\xff\x7f\xa9\x4f\xb8\xc8\xf8\xfa\x76\x4d\x59\xa5\xb9\x3b\x5c\x66\xfb\x53\x63\xfc\xfb\xb5\x31\xfe\x00\x7f\x62\xbb\xfe\x47\x3f\x02\xe8\x40\xe3\x40\xe4\x49\x61\x2e\x8c\x05\xe8\xa4\xcc\xb3\x74\x7c\xa8\xc5\x06\x3d\x20\xa5\xca\xda\x84\x11\xc4\x3c\xc1\x9e\xd9\x07\x64\xb7\xe3\x44\x29\xa5\x11\x3c\xd8\x4a\x9a\xe7\x9a\x85\xe6\x44\x90\xa5\x3c\xf4\x2a\xd6\x25\x9c\x1f\xd5\xc1\x5f\x64\x5c\x4f\x0b\x2e\x32\xee\xbe\x66\xaf\x27\xe3\x3e\xdb\x76\x15\xd2\x3c\x24\xdb\xe2\x23\x07\xc6\x02\x6a\xdb\xd6\x86\xd6\xb6\x6d\x07\x04\x2a\x75\x51\x82\x71\x1e\x78\x5a\xcc\x0c\x63\xd1\x2d\xf1\x16\x5d\x96\xea\x3d\xb3\x3f\x21\xbb\x1f\x4f\xbe\xaa\xcc\x62\x32\x13\xb4\x10\x05\x67\xc6\x06\x02\x0a\x5c\xf2\xda\x05\xdc\x25\x87\xc5\x17\x3a\xf8\x5d\x16\xb9\xce\x6f\x72\xa4\xcf\x9e\x6d\x14\x69\x09\x05\xee\x76\x77\xef\x3f\xdc\x7d\x1b\x2b\x67\xbe\xf9\xf6\xee\xed\xfb\x0b\xa1\x33\xfc\xe1\x0f\xe0\x8b\x2e\x95\x2e\xed\x73\xe8\x50\x91\x1e\xc3\x09\x63\x30\xfe\x98\x83\x1e\xe1\x70\x4e\x0b\x30\x32\x3c\x13\x14\xdc\xae\x9c\x6b\x01\x8a\xc6\x15\x79\xee\x0b\x11\x64\xd0\x76\xd9\xbe\x17\xb7\x18\x83\xee\x21\xbb\x3e\xdb\xaa\x88\xde\x6b\x18\x31\x86\x11\x47\x29\x0d\xe3\xdc\x21\x58\x64\x19\x34\xdc\x51\xcc\x39\x10\x57\x20\xf5\x24\x39\xa4\xa7\x47\x76\xe8\xf6\x36\xe2\xda\xdf\xe2\xf6\x2c\x73\xe2\xfe\x49\x9f\xfb\x65\xde\x2e\x1a\xad\x74\x35\xaf\x9e\x2a\x14\x22\x45\xf5\xbb\xbb\x57\x6f\x96\x58\xe3\xd5\x5d\x84\x8f\xdc\x2e\x77\x60\x0b\x09\x60\x1f\x29\xc0\x98\x58\xd0\x15\x23\x2d\x02\xc3\x24\xb0\x6d\x11\x30\x96\x47\x92\x55\xb9\x0e\xc3\x51\x83\x3e\xf4\xd5\x25\xf4\xcd\xab\xc5\x03\xd8\xdb\xca\x09\xeb\x9c\x56\x2e\x58\xcf\xe4\xc7\x7e\x99\x48\x35\x2c\x90\x46\xb5\xa0\x2c\x55\x71\x90\x9c\x73\x2e\x39\xa4\xf8\xc2\x5d\xb8\x8c\xc9\xdf\x3e\x7b\x26\x2b\x2b\xc8\xad\xfc\x3f\xbc\x79\x79\x3b\x26\xcf\xf2\x7f\x65\x44\xb6\xe7\xb2\x48\x61\x5f\x12\x60\x7e\xaa\x80\x82\xa8\x05\x63\x0e\x33\x50\x90\x32\x94\x38\xa8\xad\x0c\x39\xb3\x1d\xcb\x5d\xa1\xc3\x38\xe9\x00\xd7\xb6\x8f\x01\xf0\x87\xfe\xfa\x6c\x6f\x18\xb7\x4a\xda\xe5\x22\x38\x94\x52\xa9\xe0\x67\x5e\x43\x88\x6c\xd9\x0a\xc2\x07\xb0\xdc\xa3\x41\x5e\x7c\x15\x10\xb9\x32\x97\xb8\xf7\x7f\xb8\xd8\xff\xee\x89\x39\x72\x65\x70\x7e\xe2\xc6\xfa\xe1\x0f\xe0\xf0\xe6\xc3\xbb\xfb\x17\xaf\x2e\x09\xb5\xdb\xad\xe9\x29\xc9\x90\x1e\x62\x03\xe6\x0e\xba\xb8\x3d\xf6\x90\x68\x58\x84\x7e\xc8\x4f\xac\x2e\x6d\x26\xce\x8e\xb9\xa2\x3e\x82\xb2\x34\x65\x01\xb8\x85\xca\xd5\xa4\xaf\x6c\xcf\x3b\x23\xa8\xa2\x42\x16\xf3\x19\x4a\x6b\x17\x5d\x9c\x91\x46\x70\x82\xb1\x2b\x74\x81\x11\xe2\xa5\x67\x84\xf2\x5c\xe7\xd5\x3c\x6a\x81\x08\x33\x5e\xd3\xd2\x61\x21\xb0\x46\x94\x6b\x24\x28\x57\x61\x98\x18\x90\xc0\xa7\xb1\xfe\x8e\xc5\x7c\x89\x49\xfe\x7d\xf2\x1f\x56\x16\x82\x4f\x75\xfc\xfe\xf5\xee\xb3\x81\x39\xbc\xfa\xe6\x70\xbd\xb9\x3e\x59\xf1\x7f\x78\x13\xcf\x1d\x7e\xfb\xee\xc5\xdd\xe6\xdd\xfd\xab\x98\xd1\xd8\x36\x91\xa0\x31\xc5\x88\x18\x58\x04\x06\x58\x1e\x2a\x6a\x7b\x92\xf9\x4c\x87\xfe\x64\x4e\x19\x50\x59\x8c\x2b\xfb\xba\x74\xf5\x91\x9c\x8f\x6d\x38\x89\xa9\xf1\xd2\x40\xeb\x24\x05\x4d\x79\x02\x85\xd0\xa6\xdc\x1b\xe9\x94\xe5\x9c\x22\x64\x4b\x5b\x16\xb0\x40\x12\x79\x4e\x29\x86\x03\x46\x65\x59\x62\x62\x2b\xcb\xb1\x25\x46\x11\x8b\x98\x6e\x42\x3f\xf1\x1e\xd0\x53\x2a\xc3\xe0\x9b\xb9\xd6\x42\xe8\x24\xd9\xa5\x2c\x31\x07\x1e\x6b\x0e\xbf\x8f\xfe\xe7\x7f\xf7\xc4\xaf\xb9\x68\xff\xcd\xda\x5b\x92\xee\xde\xbc\x7f\x79\xff\xe2\xed\x8b\xb7\xef\x97\xd9\xb8\x22\x1b\xbc\xf8\x66\xff\x2f\xc1\x9b\x18\x1c\xdf\xaf\x43\xf9\xf2\xed\x8b\xfb\xcd\xdb\x17\xf7\xaf\xbe\x49\x05\xf0\x0c\xfa\x92\xd5\x61\xcc\x94\x0b\x67\x1a\x46\xd2\xe3\xc1\x89\x2c\x9c\x6a\x86\x74\xc9\xb6\x1d\x63\xaa\x64\x08\x4d\xa8\xd2\xbd\x1b\xc7\xec\x34\xee\x70\xe3\xb1\xaa\x6c\xe7\x0d\xa0\x01\x2f\xd1\x14\x05\x19\x38\x86\x56\x57\x1d\xe8\xa4\x22\x4a\x14\x1f\xa9\x10\x2e\x13\x20\x0f\xe3\x99\x83\x1c\xc8\xb4\x0b\x1a\x24\xb3\x05\x49\x07\x23\x2e\xc6\xf4\xc8\x0e\x6a\xcf\x63\x25\xd0\xbb\xd8\xdb\xf8\xac\x53\xd4\xe2\xc5\xe5\x54\x68\x7d\x7e\x21\x04\x7d\xf1\xcd\x5f\x81\xfb\xc3\x9b\xf7\x7f\xff\x7e\x51\x68\xf3\x99\x42\x13\xe0\x8b\x42\xdc\x9e\xb9\x3b\x95\xa3\x3a\xc2\xc1\x8a\xc9\x51\xac\x31\xdd\x0a\x48\xb0\x81\x84\xc2\xae\xb0\xb6\x76\x4d\x93\xb5\xcd\xf6\x7c\xac\x90\xaf\xcc\x7c\x04\x76\x9e\x82\x39\xf1\x11\xa0\x34\x0b\x3a\xc5\xe0\x64\x3c\xf6\xa6\xfc\xf1\x4c\x38\xce\x7d\x86\x08\xa8\x83\x09\x1d\x03\x1d\x38\x6d\x92\x80\x00\x79\x18\x01\xed\x48\xb2\x03\xfd\x23\x3e\xc8\x3d\x4f\x7e\x97\xdc\xc7\x95\xef\x82\xdc\xf0\xf6\xd5\x4a\x4b\x7b\xff\xee\x52\x7e\xb5\x1e\xdd\xbf\xbb\xbb\x76\x65\x7e\x81\x04\x7c\x4b\xaf\xb5\x25\x0e\x89\x63\x68\xac\x73\xae\x0c\x15\x07\x10\x3d\x26\x4e\x87\x16\x0c\x2c\x74\x0c\x5b\x44\x77\x05\x67\x54\x42\x45\x70\x18\x51\x63\xcf\xb1\x46\x31\x03\x79\x98\xf6\x1c\x55\x95\x9d\x5b\x30\xce\x8c\x06\x7f\xb6\x1d\xc8\x53\x15\x8a\x94\xda\xaa\xd3\x0e\x3b\x8d\x7f\x3c\x5f\xf8\xc0\x64\xa8\xc2\x91\x81\x26\xcd\x36\x59\xc8\x81\x7c\xa8\x80\x6c\xf8\x32\x46\xfc\x46\xaf\xeb\xbc\xfb\x8a\x5e\xf7\xbf\xa4\xd7\x32\x4a\xff\x0c\xdc\x0e\xd3\x56\xfb\x92\x37\x61\x50\xce\xe9\x32\x1c\x39\xc8\xe0\xc9\x89\xc7\x04\x18\x1a\xce\x04\x99\x92\x6c\x2b\xce\x30\x87\x1c\xe3\x73\x59\x59\xbd\x04\x4b\xd9\x38\xec\x39\xf2\xf5\x93\x4e\xee\x74\xa3\x53\xdd\x7e\x5d\xa7\x0c\x38\x00\x3f\xd5\x2a\x89\xf5\xfd\x2c\x72\xe7\xc5\x3d\x6a\x71\x0d\x5f\xbc\x7d\x75\x89\x20\xe2\x32\x72\x58\x06\x6b\x25\x49\xbf\x59\x12\x17\x97\x31\xdd\xc5\xed\x60\x8d\x45\xf6\x47\xef\x1f\x1a\x0f\x92\xc5\x53\x6c\x09\xd7\x9a\xb6\x24\xed\xbb\xa0\x29\xd2\x98\x33\x86\x4d\x49\x61\x29\xcf\xce\xe3\x94\xb6\x81\xe6\x45\x6a\x83\x8a\x2e\x3e\x04\x49\x60\x18\xa8\x13\x80\xae\xe7\x54\x08\x89\xbc\x04\xcb\x6a\xa1\x64\x46\xb9\xa4\x82\x15\x85\xac\x26\xc4\x4d\x70\x35\x84\xb6\x77\x61\x4c\x92\x2c\xe2\x8a\xeb\xbd\xfb\x04\x2b\xef\xf7\x09\x8d\xbe\x4e\xf4\x76\x6e\xb0\xf1\xff\x1a\xac\xee\xd8\xef\xae\x7b\xd2\xe2\x06\xed\xd6\x15\xf3\xbb\x58\x2d\x08\x5e\x6f\x77\x9f\xac\x96\x6f\x5f\x7d\x77\xd0\xf3\x09\x1c\x7f\x62\xde\x98\x74\x88\x4e\x85\x0e\xde\x5d\x6a\x07\x26\x20\x2d\xa0\x1f\xf1\xca\x46\x9e\x1c\x8b\x73\x38\x92\x1d\xa4\x8f\x49\x18\x32\x37\x90\x5c\xe7\x32\x0c\x47\x6e\x41\xb2\xcf\x0d\x0d\xe3\x34\x9f\x02\x14\xc0\xa7\x49\x3a\x46\x14\xf9\xe3\xe2\xc5\xb5\x6c\xf9\x1a\x4a\x49\xf3\x42\x14\x45\x09\x0a\x51\x42\x58\xa0\x92\xa1\x92\xb4\x38\xe2\x6f\x65\x09\x8e\x7b\x99\xff\x44\xd7\xb7\xc9\x7f\x7f\xcd\xb9\xbd\xfa\x04\x21\x60\x09\xb1\xbf\xbf\x78\x10\x6f\x3f\xd5\xf5\xfd\x87\xd7\xbb\x37\xdf\xbf\x5d\x36\x87\x4f\x9c\x8e\x2d\x83\xc5\x26\x9b\x8f\x69\xf2\x53\x52\x99\x6a\x93\x65\x39\xc8\x83\x00\xd5\x3c\xc6\x98\xbb\x02\xc2\x80\xca\x00\xf1\x91\x9b\xc5\x39\x3a\x35\x79\x28\x48\xaa\x35\xe8\x71\x48\x94\x1e\x58\x2e\x0b\x19\xc6\x49\xed\x7d\x89\x04\x1a\x83\x9c\xbb\xc0\x18\x68\xc0\xb4\x49\x8a\xc2\x21\x84\x78\xac\xa0\x41\x55\xc9\xca\x2c\x67\x65\x39\x20\xc4\x50\x9e\x97\x04\x0a\x8c\xca\xe4\x5a\xfb\xbb\x2b\xf7\xf6\x49\xc7\x4b\x97\xdd\xcd\x5d\x74\x29\xa3\x5d\x61\xc2\x6f\x18\x85\x5d\x24\xc5\x13\x3c\x1e\x21\xa3\x26\x34\x14\x20\x1b\xa8\x71\x10\x46\xac\x82\xcb\xb5\xb7\x50\xd0\x9f\xd0\x25\xad\x99\x87\xce\x3b\x3b\xd9\xcd\x20\x03\x3d\xce\x53\x37\x4f\x5d\xac\x97\xee\x62\x7d\xa2\x49\xfe\x7f\xd1\x27\xe5\x2b\x43\xd1\x8b\x7c\x59\x87\xff\x29\xf8\xee\x70\x0d\xc3\xbf\x89\xc5\x36\x17\x77\x62\x11\x6f\xb5\xe8\xbf\x04\xeb\x76\xbb\x8e\xc8\xdb\xcd\x87\x77\xf7\xe0\xc5\x37\x9f\x54\xa1\xbe\xfa\x26\xc6\x8c\x7f\x00\x07\xc4\x42\x1f\x24\x66\x4a\x83\x81\xd8\xf3\x19\x20\x26\x60\xde\xba\xbc\xca\xb3\x92\xe4\x79\xa6\x0b\x62\x11\xc7\xdc\x68\xd3\x73\xce\x97\x00\x2c\xcb\x54\x46\x28\xc7\x82\x09\x42\xf1\xde\x18\x56\x06\x3b\xf7\x01\x1d\xf9\xb4\x71\x60\x2c\x6b\xa2\xa4\x82\x9e\x10\xd4\x14\x2a\x47\x38\xcb\x0a\x86\x2d\x24\x94\x66\x6d\x50\xa1\x27\x80\x00\x95\xa2\xd0\x65\xdd\xdc\x04\x0a\x89\x83\x9d\x28\x11\x30\x78\x68\x4a\x59\xda\xda\x5f\xf9\xb9\xc8\xc6\xc4\x7a\x9e\xef\x93\x7f\xf1\xd4\x41\x1d\xc7\xe4\x32\xed\xd2\x27\x46\xf5\xc3\x4a\x42\x71\x77\x19\x99\xe5\x56\x03\xaf\xd3\x6b\xf5\xea\x7f\x0b\xbe\x7d\x75\xf8\xfd\x1b\xc0\xeb\xa2\x04\x6e\x1e\x52\x3e\xd7\x29\xc9\xb8\x2c\x69\xc1\x4b\x94\xf1\x02\x0a\x98\xe7\xf3\x51\x95\xc5\x9a\xf2\x99\x07\x09\x4b\x85\x80\x43\xb9\xca\xcb\x12\xaa\x62\xaf\x21\xc3\x73\xa3\xb5\x9e\xa7\xbe\xb0\x85\x2d\x2b\x53\x6a\x0b\xca\x2d\x66\x21\x02\xf7\xce\x09\x0c\xe7\x86\xf4\x6d\x55\xc1\xc6\x67\x75\x97\x8f\x36\x49\xd2\xc8\x1d\x59\xef\x65\xf2\x87\xe4\x3f\x25\x09\xb8\xbf\xdc\x2b\x6f\x5f\xec\x0f\x97\xa7\xb7\xed\x7e\xfb\x9b\x51\xfd\xf6\x5f\x83\x4f\xc6\xf4\xcd\x07\xb0\x16\x14\xbf\xfb\x72\x28\x77\xde\x38\x65\xce\xae\xf2\x52\x83\x13\x90\xbc\x3e\xc6\x2e\x56\x05\x91\x84\xf9\x58\xe5\x4d\x41\x04\xca\x33\x55\xf0\x76\x19\xd0\x5c\x82\x32\x43\xb0\xd0\x19\xd5\x02\x1b\x21\x28\x23\x9b\x63\xa8\x03\x0f\x86\x03\x0a\x2c\xe8\x01\xcb\xb3\xf9\x38\x0f\x01\x73\xd0\x82\x31\xed\x32\x61\x50\xa1\xb4\x56\x9c\x63\x8c\xeb\x42\x16\xb4\xcc\x91\x42\x4d\x89\xb1\xcc\x65\x1e\x6c\x10\x30\x2f\x5d\xd1\x72\xc4\x00\xc3\xc7\xa6\x54\xa5\xa9\x5c\xb2\x4d\xf3\x84\xc7\x9c\xd2\x5f\x26\xbf\x4f\xfe\x55\xe4\x1b\x8b\x73\x7a\x55\xff\x70\xe3\x3d\x7e\xee\x3c\xae\x1e\xf2\xb2\x2b\xbf\x78\xb7\x38\x88\xbf\x03\xeb\x6c\x7e\xf2\x9e\xef\xff\x0a\x44\x1a\x82\x43\xc2\x03\x9b\xdb\x51\x75\xa9\xa2\x11\x44\x08\x9c\x10\x56\x38\xd4\x20\xc9\xc3\x19\xe9\x0a\x65\x36\x13\xd3\x51\x36\xa5\xd7\x1d\xc0\x79\x95\x62\x8c\xa0\xcd\x99\x56\xec\x94\x49\xcd\x15\xdd\x6b\x43\xf2\x20\x03\x0b\x95\x00\x14\xc8\x14\x66\x15\xd6\x4b\x0c\x46\xa9\x86\xba\x80\x45\x0e\x05\x32\x04\x63\x9c\x87\x2a\x0c\x0c\x30\x50\xf5\x61\xb2\x8c\x86\x2e\x8c\x65\x29\xa1\xe7\x08\x9f\xbb\xaa\x50\xd0\x0c\xcf\xfd\x9d\x6a\x97\x24\x7f\x88\xb8\x85\xcb\xa8\x83\xcb\xa8\x6f\x77\x5f\xb8\xcd\x8b\xe2\x1f\xae\x14\x8f\xd7\xe8\xe0\xee\x45\x1e\x6f\xfe\x3b\xf0\xea\x9b\x5b\xbb\xdc\x3d\x0d\xff\xa6\x3b\x4d\x61\x52\xe3\x06\xa5\x9c\x87\x36\xe8\x38\xc5\x47\x8c\x55\x59\xcc\x67\x60\xb3\xa0\x90\x14\x82\x96\x99\x2d\x64\xe8\x88\xe3\x5d\x31\x84\x69\x50\x2d\x10\x29\x54\x1c\x2f\xaf\x57\x5e\x84\x5e\x55\xd4\xb2\x6d\x9e\x67\x81\x06\x11\x1a\x09\x30\x60\x29\xce\xb5\xa1\x10\x69\xaa\x05\xa3\xb8\x54\xa5\x2a\x4b\x98\x41\x46\x0c\x22\x0c\xe6\xaa\xd0\xe1\x18\x5c\xa3\x3d\x90\x40\xcc\xf5\xb1\xc4\x1a\xd6\x12\x61\x97\x69\x55\xa8\x82\x71\x96\x6c\x97\xfb\x79\x3b\x5c\xe6\x00\x8e\x7b\xe5\xd7\xe6\xc0\xed\xaa\x76\x3b\x05\xae\x0b\xda\xcb\x25\x48\xb8\x90\xa0\xdf\xc7\x45\xf0\x0f\x60\x4b\x79\xf0\xa1\xac\x95\x4d\x13\x14\x2b\x67\x80\xe6\x0a\xe6\xe3\x31\xeb\x85\x2a\x33\x9d\xb3\xd6\x53\x53\x29\x37\x65\x06\xf4\x46\xf0\x4a\x2c\x77\xf2\x5e\x1b\x9e\xcf\xdd\xb2\x78\x09\xd0\x81\x31\x3d\x66\x15\xd7\x4a\xd6\x04\xe1\x16\x4a\x88\x30\x64\xd0\x50\xcc\x48\x01\x83\x5a\xbc\xbf\x12\x28\x30\x84\x63\x7f\x0a\x4d\xf0\x3d\xef\x1a\x09\x74\x7d\x94\x92\xf7\xc7\x65\xac\x77\xf8\xd2\x93\xf1\x9b\xb5\x83\x7e\x71\x53\xbe\xd9\x5c\x91\xe3\x5e\x2e\xbe\xff\x8b\x77\x6f\x5f\x1d\xbe\x89\x8e\xf4\x1e\xda\x1c\x82\x82\xd8\xb2\x68\x10\x91\xd2\x09\x23\x26\x93\x71\x22\xa8\xdb\x6b\xe8\xb5\xa6\x61\x2a\xad\xaf\xa4\x38\x3e\xe0\xd0\x37\x06\x70\x70\x1e\xc7\x5a\x3c\x26\x8d\xf2\x3e\xd9\x82\xf1\x91\xec\xda\xd8\xd3\xb7\x78\xbc\xff\xe3\xed\x5e\xf1\xdb\xdb\xcd\x62\xff\xa7\x99\x35\xbf\x2c\x2a\x88\x86\x73\xf0\x4c\x28\xc6\x40\x4d\xf5\xf9\x0c\x20\x44\xa2\xc8\x95\xce\x0c\x67\x45\xa6\x72\xe2\x2c\xe1\x5e\xda\x0a\x71\x20\x31\x23\x82\x4b\x47\x10\xda\x6b\xcd\x51\xdc\x16\x70\xc3\x3d\xa8\xd3\x12\xf4\xc8\x2b\xc9\x25\x63\x04\x95\x4d\x26\x72\x5c\x96\x0c\x1a\x82\x08\xcd\x50\x10\x41\x33\x40\x80\x07\x7d\xe8\xbb\x65\x19\x9a\x04\x57\x92\x02\x48\x82\xa6\xb2\x74\x5d\xb5\xee\xd1\xf9\x23\x39\xb4\x7b\x95\xfc\x65\xac\xd5\xfb\x4f\x57\x7d\xd7\x1b\x0a\x5c\xbd\xae\x17\xd7\xc9\xf4\xcd\x7a\x5f\x45\x0c\x92\xcb\x1e\xf9\xee\x69\x3d\x7d\x71\xff\xea\xed\x27\x8b\xc9\xf3\x7a\xfa\xe1\xdd\x01\xf1\x40\xe7\xf6\x31\xd1\x63\xaa\xc3\xd4\xd8\x06\x70\x17\x57\xd4\x8e\x2f\xb1\x77\x73\x3a\xc1\x9c\xa8\xb2\x70\x85\x38\x62\xcd\xea\x1a\x54\xa4\x5c\x56\x13\xa9\x79\xab\x1c\xd5\x34\xdb\x2b\xcb\xf2\xf9\x38\xf7\xa1\x94\xa0\x05\xa7\xb4\xcb\x1e\xfc\x31\x98\x65\xdd\x40\x40\xa4\x05\x20\x4c\x6b\x55\xd6\x94\x10\xaf\x0b\x92\x67\x50\xe0\x0a\x51\xc6\x40\xee\x03\x0b\xae\x44\x0a\xd6\x02\x11\x80\x51\x5b\x97\x1a\x1a\x67\x93\x0d\x38\x3f\xd9\xe0\xc6\x02\x5f\xae\xa4\x6b\xae\x61\xf7\xea\x9b\xd7\x8b\xe2\xff\x00\x3e\xd9\x48\xde\x5d\xb7\xa1\xbb\x9f\xb1\xc0\x1f\xc0\x01\xf3\x00\x67\x3b\xa8\x36\xad\x48\x2c\x03\x05\xe3\x72\x5f\x17\xa1\x9a\xf2\x30\x95\x39\xd5\x24\x5f\x96\x8d\x81\x68\xe6\xf2\xaa\xef\x4c\x07\x24\xb0\x14\x95\x36\xe7\xca\xf0\x5e\x79\x66\xd9\x6a\x84\x6e\x1e\x02\x5a\x8c\x30\x2c\xf7\x18\xd3\x5a\x0b\x49\x31\xf1\x50\xc3\x12\x67\x59\x96\x21\x8e\x6b\x44\x29\xc9\x75\x51\x07\xb4\xda\xa8\x04\x32\x2d\x66\x12\x5c\x59\x6a\x58\x0b\x8c\x6f\xed\xb0\x4d\xab\x47\x7c\x68\x2f\xf1\x38\x89\xeb\xc9\x05\x4d\xe5\x9a\x51\xfc\xfc\x84\x02\xc4\xea\x8d\xdd\xeb\x4b\x1f\xc2\xc5\xb3\x7b\xbd\x84\x7d\xef\xee\x5e\x7d\xfb\xfa\xfd\xee\x6e\xf5\xf0\x36\x09\xc0\x10\x3b\x0a\x8f\xb4\xf4\x25\x02\x45\xc8\x96\x0d\x25\x2d\x3e\x0a\x70\x8e\x87\x16\x25\x20\x00\x01\x88\xc2\x18\x86\x74\xd2\xba\xf5\x47\x16\xce\x0d\xa3\x4c\xc3\xae\x0c\x3a\x85\xb0\x6c\x1e\x10\x38\x96\xc1\x72\x90\xd1\x30\xee\x9c\x14\x50\x69\xad\xb1\x64\x86\x1b\x6e\x2d\x37\x3c\x94\x90\x1a\x5a\x7a\x61\x44\xc5\x9d\x3b\x87\x33\x65\xb9\xc9\x60\x9a\x98\x1a\x21\x06\x83\xaa\x0c\x1f\x93\x2d\x58\x7b\x76\x6c\xf2\xcf\x93\xef\x12\x92\xfc\x87\xe8\x7b\xbf\x5d\x83\xa1\xaf\x1c\xc4\xfc\xf0\xe6\xe5\x76\x77\xf8\xe1\xcd\xe1\xee\x06\xf4\xf6\x49\xe1\x35\xd0\x3d\xdc\xbd\x5a\xdb\x5b\xb6\x05\x81\x23\x45\x95\x04\x78\x3e\xc5\x5c\x3b\xfd\xe9\x98\xb2\x00\xc1\x38\x9f\x01\x83\x88\x82\x0c\x24\x78\x9a\x86\x54\x22\x54\x49\x25\xaa\x63\x4f\x43\x75\x64\x8c\x5b\xe8\x31\x0a\xb8\x02\x93\x5f\xf4\x2c\x5d\x68\xf7\x86\x4b\x21\x97\x80\x31\xc2\x4a\x19\x6d\x29\x79\x38\x95\xd8\xd2\x52\x18\x82\xa4\xe5\x4e\x79\xe2\xdd\x29\x9c\x18\xcf\x5d\x8e\x40\x2f\xec\xd9\x19\xe9\x93\x64\x93\x36\x8f\x3a\xea\x79\xad\xc5\xbd\x1d\xd1\xb7\xaf\xee\xd6\x3c\xf1\xda\x92\x19\x21\x07\xd7\xf6\xce\x2b\x0c\xdb\xf5\x1b\xb8\xfb\x70\xb7\x59\x2e\x06\x92\x92\x7a\x06\x7b\x81\x3d\x26\xa7\x80\x72\x50\x07\x8c\x52\x31\x73\x88\xd2\x96\xf8\x8f\x0d\xa0\xf0\x34\x15\xad\xaa\xe4\x64\xc3\x08\x64\x99\x87\x0e\xc8\x3c\x0b\x22\xcd\x00\x2a\x42\x4f\x01\xc9\x43\xbf\x33\x4a\x96\xc6\x58\x83\x95\x70\xda\x69\x47\xf1\x5c\x3b\x57\x9b\xda\x2a\xdd\x0c\x8e\x95\x8e\xe0\x07\x52\x07\x54\x27\xc9\x66\x23\x3f\xd3\xe3\xed\x97\x7a\xec\xff\x98\x22\x1f\xee\xc0\xdb\x0f\xf7\x51\x8f\xa1\x87\xc8\x91\xa2\xa1\x65\x85\x50\x17\x74\x0e\x64\xd0\x45\x9e\x66\x73\x07\x61\xca\x90\x7e\xc0\xa0\x28\xba\xbe\x30\xc2\x8a\x5e\x3e\x26\x00\x97\x59\x38\x03\x94\x87\x0a\xf4\x53\x7e\x26\x20\xcb\x1f\x93\x45\x09\xa8\x9f\x94\x90\xf9\x8d\x16\x52\xb5\xbd\xe3\xd0\xe9\x8b\x12\xff\x24\x9e\xe7\xf8\x3d\xfb\x0c\x17\xfe\x6f\x93\xbf\xff\xf4\x54\x67\x73\xc3\x9d\x10\x31\xd2\x9f\x1b\x7d\xd6\x14\xe6\xfd\xdd\xb7\xeb\x81\x0e\x7e\x38\xba\x2b\x13\xfa\xb0\xe9\x1e\x88\x33\x06\xe4\xc6\xba\x87\x71\x63\x44\x5b\x75\x65\x18\x9b\xee\x24\x86\x4a\x4b\x01\x32\x66\x1c\xdf\xb3\x79\x00\x4c\x84\xa3\x08\xc7\x20\x4c\xbd\x7c\x05\xad\x1a\x4d\x32\x9f\x2b\x8e\x1c\x24\xa2\x56\x9c\xab\xd8\xff\x42\xb7\xfd\xde\x24\x7f\x91\xfc\xd5\xb2\x2a\xa6\x87\xb5\x8d\xed\xb7\x1f\xde\xbe\xb8\xdf\x9c\x1d\xa2\x06\x16\xbc\x69\xb4\xde\x9b\xf2\x31\x39\xff\x34\x6e\x1a\x42\x2c\xa8\xcd\xc7\x3c\x59\xcf\xef\x5d\xcc\x47\xec\x92\xbf\x4c\x60\xe4\xa3\x8e\xb8\x4b\x6b\x36\xe5\xaf\xc1\x5a\xfc\x15\xcb\xf0\xaf\xd5\x5f\xe0\x1a\xfe\x3e\x2d\x39\xef\x2e\x13\x76\x3d\xb8\xdd\x12\xd6\x87\x11\x83\x3c\xa5\xa7\x13\x3f\x9d\xa9\x65\x12\x64\xa0\x60\xc1\x9f\xc3\x18\x5a\x3e\x01\x98\x4b\xa6\xb9\x32\xf3\x71\xa3\x83\x4d\xf3\xf9\x6c\x39\xaa\x11\x07\xe5\x4f\x1d\x80\xe5\xb2\x08\xb9\x78\x16\x59\xed\xb5\xb5\xc4\x23\x4d\x9d\xaf\x98\x60\x8a\x19\xec\xb8\x75\xd4\x62\x95\x53\x2e\x04\xe5\xa1\x70\x8d\x0b\x8d\xa9\x91\xd1\xce\x69\x89\xb4\x07\xcc\x35\xcb\x7c\xbc\x72\xf2\xff\xf3\xe4\xbf\xbe\xe6\x8f\xa2\xe0\xb1\x9d\xe9\xc5\xfd\x8b\xf4\xf0\xe6\xbb\x97\x51\xe8\xfd\xe1\x0d\xdc\xbc\xbd\x42\x0d\xbf\xbb\x7f\xf7\x36\x46\x27\x9f\xc6\x1d\x6f\x5f\xbd\xdf\x1f\x99\x6f\x97\x55\xb1\x03\x19\x3d\x3b\xd7\xb4\x1c\xe4\xcd\x12\x3b\xb9\x0a\x01\x3d\x19\xc3\x78\xa1\x58\x5d\xa7\x9d\xe0\x3a\x87\xb0\xd0\x39\x11\x8a\x18\xba\xd7\x16\x15\xde\xcc\x75\x68\x4d\x65\xcf\x21\x01\xe7\x30\x29\x5b\x03\x94\x2a\x63\xf3\xcc\x06\x32\x4b\x8e\x91\xc5\xb8\xd6\x98\x4a\xe2\xca\x0c\x32\x64\x30\xe6\xe0\xdc\xe2\xd8\x83\x04\xe3\x7a\x28\xa3\x3e\x6b\x9e\x6f\x77\xd5\xe7\xbb\xcd\xa2\xcf\xee\x56\x1f\xf0\xac\xcf\xdd\xbb\xbb\x55\x9f\xdb\x88\x78\x51\x67\xa0\xa7\x70\x4e\xd9\xdc\x4c\xc0\xb0\x50\xf7\xfe\x14\x7a\x0e\xf4\x34\x0f\x69\x79\x1c\x51\x9a\x87\xd6\x5a\xe3\x61\x1b\x79\x94\x37\xb5\x70\x1d\xe3\x28\xd3\x19\xaf\x8d\x70\x76\x2f\x0d\x82\xce\xcd\xe7\x20\xab\xaa\x06\x78\x1e\xd2\x24\x8c\xce\x35\x80\xa7\xd4\xd9\x3c\x73\x01\xcf\x9a\x11\xe4\xf0\xe2\x32\x69\x41\x24\x85\x06\x36\x9c\x31\x30\x1d\xd1\x32\x46\xd9\x23\xfa\x4c\xa7\xc3\xa7\x3a\x1d\x7e\x46\xa7\x65\x8c\xae\x38\xc4\xb7\x7a\xed\x7b\xda\x8e\x60\x08\xe5\x09\x60\x16\xc6\xc6\xb7\x03\x03\x79\x1f\x18\x68\x9a\x16\x81\x2e\x4c\xd6\x0a\x55\x58\x31\x0c\xe0\x68\x25\x13\xba\x42\x0c\x66\x2e\xa7\x8d\x26\x7b\xa9\x51\xd1\xd8\xb9\x0d\xde\x79\x0f\xb2\x79\x4a\xf3\x30\x3a\x5f\x03\x91\x12\x5b\x2d\x0a\x25\x73\xc3\x51\xe9\x4a\xa4\xad\xac\x4b\xa2\x09\x16\xa4\xd4\x65\xcd\x08\x4f\x92\x4d\xa2\x1e\x69\xe4\x2c\xfe\x7c\xce\x6d\x5f\x7f\x6d\xce\xfd\xa2\x3e\xfb\xc3\x7e\x51\x68\x6b\xd9\x71\x4a\xb3\x79\x02\xc5\x28\xbb\xde\x77\x13\x07\xa4\x5f\x6e\x8f\xe6\x88\xc0\x10\x46\x6b\xa5\x29\xbc\x3c\x9d\xc0\xd9\x1a\x21\x6c\x4b\xa2\x3e\x25\x6c\xe2\xb4\x2b\x0b\xef\xe6\xaa\x39\x99\xbe\x9a\x8f\x60\x7a\x4c\xb4\xab\x00\x4e\xb9\x73\x8b\x3a\xc5\x5c\x4b\x8c\x1c\xc2\xd6\xb2\x0a\x33\x25\x89\x5c\x42\x9d\x1a\x41\x12\xf3\xb0\xc3\xa5\xaf\xe2\x77\x97\x8c\xc4\xbf\x5d\x31\xb2\xae\x27\x86\x9f\x36\x30\xbe\x38\xbc\x79\xbf\x7b\x77\xf7\xea\x7a\xbd\x8c\xe7\xb1\xe9\x33\x67\xdb\xdd\x87\xe8\x6c\x6c\x73\x4b\x00\x2c\x90\x23\x10\xb0\xa0\x01\x8b\xb5\x32\x0d\x70\x0f\xad\x63\x7a\x04\x2e\x9c\x22\x40\x58\x11\x4e\xd9\xb0\x11\x18\x24\x85\xf6\x4c\x41\xc7\x30\xce\xc2\x44\x42\x9b\x07\x27\x00\xde\xeb\xb2\xe2\x04\x71\xa5\xa5\x96\x5a\x18\x92\xe6\x82\x4f\x56\xca\x51\xca\x41\x88\x60\xdd\x14\xda\xba\x70\x90\xba\x29\x40\x1d\x61\xb1\x93\x7d\xec\xe7\xf9\x85\xfa\xcc\x3f\xda\xb7\xb0\x73\xa8\x00\xed\xc7\x09\xb8\x1c\x4e\x91\x57\x25\x56\x29\x4d\x42\x62\x5a\x4a\x8c\x67\xec\x23\x5d\x84\x9b\xa6\x5f\x59\x9b\xb9\x8d\xd8\x0e\x7e\x8f\x63\x4f\xce\x5a\xe7\xf3\xea\x33\x06\xd2\x1b\xa7\x66\x73\xbf\xd6\xbd\xbe\xb9\x1e\x44\xdc\xbd\xd8\xdc\xbd\xba\x03\x6f\xdf\xdd\xbf\xfa\x66\xf7\xf6\xdd\xfd\x66\xe8\xfc\xd1\x1d\x8f\x53\xe0\x90\x48\x26\x85\x54\x5e\x05\xab\xac\x16\x65\xe3\x99\x28\xb5\xa9\xb6\x89\x8f\xa0\xcb\xe5\xb1\x03\xfc\x78\xdc\xaa\xa1\xaa\xaa\xca\x1e\xad\xe2\x44\x2a\x41\x24\xb3\x27\x60\x03\x2d\x91\xe1\x84\xa5\x65\xa8\xc2\x59\x00\x01\x8e\x1b\x11\x30\x20\xed\xcc\x8e\x98\xd2\x63\xb2\xdd\x64\xd1\x9e\x24\xca\xbe\x9e\xbe\xfe\xe3\x64\x8f\xa2\x6f\x61\xe5\x5a\xd7\x34\x43\x70\x90\x70\x26\x84\xe0\x8e\x86\x5a\x6b\x25\x0a\xdb\x10\x51\x08\x67\x36\xb5\x8b\x20\xfc\xba\xae\x00\x6a\xdb\xad\x1e\x9c\x73\xce\x1e\xad\x14\x58\x28\x81\x15\x75\x2d\x38\x86\x12\x21\x43\x31\x49\x71\xa8\xc3\xc0\x41\x95\x66\xe9\x74\x15\x5d\x8a\x63\xec\x17\x69\xa3\xdd\x49\x9c\x03\xb7\xb6\xff\xb5\x72\xef\xae\x0e\xc0\x93\xed\xf7\xbe\xeb\x4e\x41\x2c\x76\x17\x42\xc8\xc5\xee\x52\xab\xc5\xee\x94\x23\x65\xab\xcd\xb9\x9a\x69\xda\xce\xb4\xf5\xdd\x7c\xea\x5a\xc0\xba\x6e\xab\x8f\xb6\x77\x8b\xd1\x57\xc3\x9f\x81\x0d\xe4\x62\x78\x14\xaa\x70\x5a\x0d\x2f\xa3\xf4\xf6\xb8\x36\x74\x31\x42\xfa\xa8\x03\xbe\xf0\x23\x5c\xf1\x1b\xd6\x13\xe4\x67\xc2\x8c\x9f\xd1\xe1\x9f\x81\x5f\x50\x42\x8f\x23\xc8\x03\x2a\x99\x24\x86\x5a\xd5\xb0\x20\x9c\xf7\xa6\xa8\x06\x6a\x91\xb5\x4a\x6c\xa1\x7d\x38\x6f\xf2\x87\xf3\xc9\x8d\x73\x75\x3e\x01\x3d\x8e\x5b\xdd\xdb\xde\x2a\xc5\x04\x95\x42\x30\xd7\x81\xee\x66\x10\xaa\x30\x32\x90\x00\x0b\xe0\x26\x59\x15\xe9\xfb\xbe\x9f\x87\x3e\x93\xa2\x4f\x92\x6d\x3c\x3f\x6e\xf6\x24\xea\xf0\x27\xde\x03\xcf\xba\x3c\x4f\x24\xe7\x9c\xb7\xde\x77\xa1\x85\x98\x43\x43\x34\x33\x2c\x1c\xa5\x94\xbc\x30\x35\x61\xc8\x58\xc9\x37\xdc\x45\x92\x8f\xce\x3b\x00\xbd\x7f\x9e\x49\x4a\x72\x4c\x05\xbb\x28\x81\xca\xab\x12\x2e\x9c\x17\x25\x1c\x28\x2e\x4a\x3c\xcd\xa5\x4d\xec\x3d\xf2\x11\x3f\xe1\x06\x99\xe2\x39\x4c\x59\x6b\x9b\xae\x0a\x24\x9b\xfb\xd8\x98\x16\x55\x88\xfd\xd3\xb1\x1b\x76\x63\x80\x8b\xc0\xae\xa0\xff\xd8\x81\x21\xa8\x6c\x63\x42\x5b\x12\x2b\x95\xb1\xb2\xb1\x41\xf1\x82\xb1\xca\x94\x43\xc7\x8c\x90\x20\x6f\x8f\x7e\xd9\xc0\x77\xa3\x73\x11\xdc\x37\xe8\x80\x35\x27\xca\x08\xaa\xad\x01\x1c\x28\xce\x82\x47\xd8\x08\xc2\x80\xe0\xa5\x56\x8d\x6d\x93\x28\x6f\x76\x39\x8b\xfa\xcd\x97\x3d\x98\x5f\xca\xfb\x5d\xf2\xe6\xab\x02\xa7\x03\xe8\xd6\x83\x6b\xf4\xd3\x94\xe2\x40\xf2\xcd\x39\xb8\x92\x5b\xee\x8c\x51\xbd\x0e\xa7\x30\x21\x4c\x99\x53\xe5\xb1\x61\x56\x2e\x22\x9f\xaa\xd8\x83\x73\x72\x2b\x4c\x62\x10\x81\x54\x52\x69\xee\x97\x9b\xdd\x02\x3c\x71\x1a\xea\x12\x1b\x81\x19\xa0\xbc\xb4\xb2\xb6\xcd\x05\xff\xc6\x47\xdc\xa5\x5f\x61\xdf\x1f\xd2\x28\xef\xf7\x57\x71\xdf\x5f\xec\x8b\x41\x55\xad\x28\x35\x1f\x23\xc4\x51\xbe\xe9\x42\x05\x99\x66\x56\x1b\xd9\xa9\xe9\x8c\x0a\xce\x41\x06\xbb\x86\x4a\x26\x4e\xed\x54\xa5\x66\x36\xbb\xb3\x73\xd6\x59\x1b\x65\xf5\x4a\x29\xe6\xa4\x10\xce\x02\x32\x29\x16\x8e\x4a\x4b\x42\x01\x26\x50\x8b\xc6\x2e\xbe\x67\xe4\xb4\xf0\x5b\x9f\xfc\xe6\x16\x51\xe5\x67\x6d\xbb\xcc\x85\xb5\x80\x33\x52\x79\x7c\xbf\xee\x3f\x30\xf5\x3e\xf5\xb3\xdc\x90\x69\xdc\xd0\x59\xd2\x5d\x19\x12\x2e\xc7\x56\xf9\x63\x3d\xe1\xd9\x4e\xc4\x7a\xd0\x96\x61\x78\x4c\x68\x63\xc5\x12\x9c\x87\xc6\x47\xd4\x0f\xc2\xb9\xe1\xc6\xf0\xd0\x07\xcb\x09\xd1\x9a\x63\x0c\x1d\x05\x96\x91\x56\x1a\x8a\x58\x87\x0b\x83\xa4\x31\xc9\x36\xe5\x8f\xd3\x41\xed\xb2\xe4\x37\x71\x97\xff\x6f\xbe\x2e\xed\x61\xf5\x54\xbe\xfb\xb0\xca\x76\xcb\x2b\x93\xf6\xe0\xe8\xc1\x31\xe0\x14\x7f\x4c\x52\x14\x70\xbe\xcd\xe6\x89\x54\xa3\x14\x20\xe9\x43\x5b\xa5\xc7\x19\x83\xa3\x94\x56\x4a\x29\x19\x13\xe3\xb4\x6d\x38\xd7\x5c\x6b\x1e\x86\x50\x93\x50\x9d\x35\xd4\xd4\x2a\x1d\xce\x08\x63\xa1\x49\x89\xb0\x69\x54\xb2\xb9\xf4\x3e\xea\x9f\xb5\xe3\x3a\xb2\x2f\x3e\x33\xe7\xd3\x44\x8d\x15\x6b\x2d\x50\xb1\x52\x18\x74\x1f\x47\x70\x0c\x4e\x73\x2a\x8f\xae\xdb\x88\x65\x9e\x4a\x62\x84\x94\x5e\x06\x63\x97\x9b\xa4\xb0\x2d\x29\x63\xff\xd3\xe8\xbd\xf1\xce\xf9\x8f\x8e\x40\xc3\x22\xac\xa4\x35\x52\x31\x27\x24\x53\x1d\xe8\x08\x0e\x16\x61\xcb\x08\x4d\xa7\x26\xde\x4f\xd3\x7f\x06\x59\xed\x15\xe6\x7c\xf8\xd8\x80\x21\x98\xc5\x43\xed\x5d\xb7\xd1\x41\x63\xa1\xc8\x62\xc1\x4a\x06\x61\x11\x5a\x64\xed\x08\x4c\xe9\xdc\xae\x77\x92\xb5\xee\xa3\x67\x50\x8b\x38\x16\xce\x48\xcd\xbc\x14\x54\x75\xa0\xa7\x38\x98\x5b\x59\xff\x49\xa2\x23\x17\xc0\xf1\x33\xee\xb3\x7f\xb7\x66\x94\xae\x87\x98\xcf\x3c\x82\x6f\x6f\xf8\xcf\x96\xe7\xaf\x57\xb5\xae\xec\x52\xdf\xbd\xb9\xbb\x32\x86\x5f\x98\x21\x62\xd5\x31\x04\xbd\x03\xc4\x81\xe1\xc7\x69\xa5\x41\xeb\x97\x9f\xe8\xc7\xe2\xe6\x87\xe1\xa7\x72\x77\x9e\x1d\x73\x9c\x68\x39\xd2\x90\x0c\xa1\x6d\x6c\x5e\x9f\xe8\xb4\x44\xc9\xa0\xd8\x8e\x1f\xe1\xc6\x23\x84\x50\x30\x27\xbc\x7c\x75\xf1\xfb\x51\xb6\x02\x43\x58\x12\x04\x2d\x1b\x3c\x2c\x15\x2e\xf1\xa9\xd1\x4b\x84\x96\x79\x1e\x79\x65\xf0\xc1\x6d\x7c\x92\x27\x7f\x73\x61\x77\xff\x9f\x56\x8f\xfc\xbb\xef\x9f\xdb\xcb\xbf\xdb\xbd\x7e\x6e\xe6\x5f\x8f\xdb\xbf\x7f\x7e\xe5\xc3\xeb\x1b\x3e\x99\x18\x06\xaf\xa4\x31\xeb\xf7\xef\x57\x02\x19\xa6\x84\x00\x19\xc8\x99\x6c\x95\x86\x30\x14\xf3\x09\x82\x3c\x75\x0a\x96\x9c\xc3\x42\x79\xa5\x11\xee\x4f\x50\xcc\xb9\xc2\x48\xaa\xbc\x90\x82\x71\x56\x00\x09\x86\x72\x9e\x82\x0e\xc7\x90\x60\xd0\x82\xb2\x08\xe7\x30\xc0\x2a\xf5\xec\x31\x09\x0e\x03\x07\x1a\x1a\x6c\xc8\x70\x0a\x53\xc9\x42\xf9\xd0\xe2\x8d\xd9\x78\x48\xcb\x0c\x96\x98\x0a\x52\x40\x9c\x73\xac\x4a\x54\x66\x45\x5e\x20\xa5\x31\xc1\x28\x17\x08\x41\x52\x16\x30\xcb\x09\xa6\x48\x64\x86\x1b\x55\x7b\xa5\xb8\x29\x78\x21\x70\xcb\x35\xe6\x34\xe3\x8e\x70\x86\xf8\x80\x05\x5b\x71\xed\xd4\x46\x47\xbf\x78\x97\xfc\xcd\xe5\xec\xf1\x9a\x0d\xf8\xd4\xcd\xbf\xed\xcc\x7f\xfb\xe2\xe5\x62\xaa\xbb\xfd\xfa\xce\xd5\x2e\xfb\x46\x74\x81\x61\x20\x03\x9f\x79\xec\x3b\x58\xae\xc1\x51\xac\xf2\x22\x54\x41\x42\x2b\xc3\xc9\xb5\xfd\x09\xc2\xc7\x84\xec\x20\x3f\x05\x8e\x81\x06\x90\x87\x53\x60\x14\x0c\x7b\x23\x05\xd3\x98\x0b\xcc\x08\xc3\x9c\x31\x02\x21\x2e\x24\xe2\x1c\x34\xb3\xcd\x0b\x58\x52\xe0\x85\xe5\x9a\x72\xe1\xb9\x92\x51\x7e\xbd\x69\x2f\xf2\x5f\x71\xcb\x7f\x56\xfe\x55\xfc\xfb\x55\xfc\xcf\xa5\xef\xd8\x31\x50\x04\x4c\xa0\xb7\xd2\x6b\x04\x65\x1e\x7c\x90\x50\xf3\xb3\x6d\x87\x11\x86\x23\xda\x21\xd6\x87\x12\x01\x0f\x0a\x16\xce\x01\x13\xd0\xef\xcd\xe2\xfe\x60\xca\x11\x2f\x39\x12\x08\x11\x88\x73\x09\x89\x00\x6e\xee\x72\x08\x11\x30\x5c\x72\x49\x04\xd7\x54\xd2\x95\xff\x88\x6e\x8b\x18\x8f\xbc\x4e\xbe\x8b\xf5\x48\xff\xfe\x93\x78\xe4\xba\xce\x7e\x13\xa1\xa6\xd7\x82\x90\xf5\xa5\xdd\x65\x89\xf9\x24\x52\xf9\x6b\xf0\x74\x06\xfc\x26\xe5\x14\x02\xf2\xe0\x80\x85\x58\x98\xbc\x60\x84\x63\x4c\x89\xae\xc0\x19\x63\xed\xb0\xc9\xa1\xa0\x9c\xcc\x18\xf8\x08\x00\x4c\x15\xc6\x05\xa1\x30\xc8\xc6\x71\x63\x6d\x6a\x05\x71\x98\xef\x8d\xd4\xd6\x0a\x16\x1a\x44\x08\x65\x9a\x93\xcc\x70\x7e\x14\x92\xf1\xe3\x50\x32\xc6\x99\x16\x27\x29\x6d\xc8\x24\x2f\x5c\x4e\xc0\x48\x50\x38\xb5\xa2\x3d\xb5\x3d\x19\x9b\x64\xb7\xa9\x96\xfd\x70\xaf\x2e\x98\x92\xaf\x93\xbf\x5b\x73\xf8\x6f\xe0\x0d\xa0\xe6\x15\x25\xfe\xd2\xd1\xb7\xc4\x5c\xef\xde\xae\x00\xd5\xb1\x84\xfa\xfd\x01\xb1\x60\xe6\x63\x09\x8e\xc0\xd6\x84\x7b\x1e\x7a\x86\x1c\xa2\x0d\xc5\x0e\x31\xc0\x74\xa5\x4f\xa7\x54\x4c\xd3\x63\x02\xbc\x9f\x2b\xdf\xee\x95\x93\xb9\xd3\x78\xf0\xac\x31\xda\x12\xa7\x72\xed\x88\x57\xe1\xac\x25\x9c\x6c\x38\x81\xdc\x82\xdc\x7e\x1c\x85\xda\x4c\x28\xd9\xa5\xf2\x4f\x94\x33\x16\xbe\xbc\x78\x02\xd2\x8e\x72\x7e\x77\x28\x59\x48\x66\x88\x52\x91\x96\xb5\xf6\xae\x0e\x89\xe5\x8e\x9b\x49\x52\x47\x24\xe8\xf4\x54\x2f\xc6\xde\xac\xf0\x72\x26\x2d\xfc\x83\x71\x20\xd9\x2b\xc7\x0b\x67\x6e\x84\x85\xc6\x13\xaf\xc3\x49\xab\xe2\x4b\x61\x23\x66\x2a\xbe\xf8\x9c\x7f\x8e\xbc\xd1\xae\x6c\xf6\x28\x4d\xc0\xd1\x73\xe5\xcc\xe2\x33\x38\x2c\x7a\x81\x1d\xe6\x40\xeb\x36\x36\x1a\xa6\x5d\x18\x01\x0c\x03\xe8\xfc\x4c\xfc\x70\x11\x17\x8d\x7f\xc4\xb6\x83\x94\x9b\xff\x8f\xb6\xbf\x07\x92\x1c\xd7\xd2\x04\x51\x1e\xd2\xdd\x83\x63\x33\x6d\xc3\xb8\x59\x79\x93\xdd\xd6\x3f\x88\x8e\xaa\x9b\x9c\x37\x33\xfd\xd8\x9d\x9d\x59\x7c\x36\xf3\x66\xb1\xb3\x63\x3b\xb0\x59\x05\x22\x44\x88\x10\x21\x42\x84\x08\x11\x22\x44\x8a\x14\x29\x52\x74\x91\x22\x45\x8a\x2e\xba\x48\xd1\xb7\xd2\x89\x58\x23\xe8\xee\x19\x11\x99\x59\xb7\xee\xed\xde\xcc\xa0\xbb\x17\x3d\xc3\xea\x3b\x00\x48\x9e\x73\x70\xce\xf7\x4d\x65\xb4\x8d\xaa\x27\x96\x0c\xbb\x2a\xca\x03\xbb\xea\x3f\xac\x6c\x68\x81\xb1\x2d\xbb\x6c\x4a\xfc\xfc\xe9\xfe\x22\x69\xf8\xbc\xec\x7f\x15\xaf\x0b\xe6\x04\xba\xae\x3e\xee\x3d\x2d\xca\x98\xc8\xba\xa2\xa8\xc1\x39\x9a\x8f\x18\x8b\x8e\xc8\x5b\xc1\x7f\xab\xd2\x8c\x53\x4a\x48\x49\xb8\xf5\xbd\x81\x7a\x1e\x77\xd5\x2c\x29\x9e\xab\x53\xa6\x53\xac\x61\xaa\x4a\x61\x2c\x18\xe3\xa5\x99\xf7\x39\xae\x28\x95\x9c\xa4\x9c\x72\xcb\x7d\xad\xa3\x38\x99\x12\x17\x9e\xe7\xf9\x97\x7d\xcd\x57\x85\xaa\xcb\xdb\xbb\x50\xac\xfa\xc3\xa6\xd3\x69\x16\x57\xba\x54\xf5\x1e\x1f\x3b\xd3\x11\x27\x69\x85\x0a\xe9\x38\x55\xa2\xf0\xed\x4e\x15\x05\x52\x56\x92\xc2\x54\x9c\x15\x12\x61\x4c\xaa\x92\xf6\x98\x13\x26\xb2\x95\x87\xbc\x4d\x0e\x3b\xb2\x76\x1b\xbe\xdd\xdd\xfd\xfe\xbf\xc0\x75\x0f\xf3\xb5\x5e\xdd\x35\xe7\xfa\xe9\xe7\x87\x3a\xc1\x8a\xa7\x59\x57\x62\x56\xe4\x06\x73\x5c\xe5\xb8\xaa\xea\x13\x3d\x29\xdf\x42\xcd\x38\x16\x82\x92\xd9\xee\x88\xa0\x55\x26\x28\xc1\x65\xd1\x10\x9c\x89\xac\xe2\x8e\x09\x2a\x04\xca\x49\x5e\x14\x65\xd0\x3c\x10\x4f\x24\x39\x5d\xf2\xc1\x7f\x1d\x95\xd1\xff\x88\xfe\x57\xa8\x5c\x58\xab\xeb\x42\x75\xc9\xdf\xc1\x73\xf6\x9b\xed\xfb\x4f\x6f\x1e\x6e\xbb\x4a\x17\x78\xf7\x0f\x3f\x7d\xe3\xdc\xf6\x8b\x20\xc4\xfb\x78\xac\xb5\x52\xf5\x53\x64\x45\x6d\x9a\xa3\x61\x5c\x6b\x54\x0a\x4d\x55\x79\x7c\x8a\x0a\xd7\x81\xc1\x04\x0b\x54\x17\x94\x09\xa7\x9e\x22\x4f\x6e\x67\x98\xe0\x8d\x7a\x8a\xe2\x0c\x17\xa2\xa8\x7c\x83\x4b\x51\x90\x9d\x72\xad\xdc\xd7\xa4\xf4\xa7\x8e\x76\x79\xb1\x97\x59\x59\x55\xc4\xb5\x44\x90\x5c\x69\xdf\x9d\xdb\x75\x9b\xe9\x20\xa9\x30\x2d\x44\xfa\x7a\x62\x92\x94\xeb\x1a\x82\xba\xbf\xe0\x55\x50\x11\x09\x63\xa1\x9f\xc8\x26\xda\xe9\xe8\x87\xe8\x3f\x3c\x53\x88\x59\x79\x5f\x2e\xf6\xff\x73\xe0\x7d\xf9\xf0\xf1\xd3\x87\x87\xec\xee\xfb\xac\x22\xaf\x55\x89\x1b\x29\x2d\xcf\x52\x83\x52\x93\x72\x46\xd2\xe6\x04\x63\x81\x58\x51\xe6\x65\x95\xa6\x29\x4b\xa5\x16\xa9\x80\xd6\xce\x93\xb5\xfb\x3d\xd0\xfd\x3c\x85\xb7\xfd\x4e\x2b\x5e\x7a\x8b\x57\xea\x97\xb2\xa4\x15\x8d\x79\x56\xcd\x93\x15\x99\xcb\x2a\x68\x3d\x1b\x69\x0f\x62\xc6\x5f\xb3\xbf\x04\x3e\xc2\x27\xbc\xc1\xbb\x2a\xfa\xeb\xeb\x73\x26\xf8\xf6\x5f\xd8\x53\x3f\xfd\x1c\x26\xeb\x53\xa0\xc9\x5c\x66\xf1\xfb\x5f\xc2\xb3\xe9\x54\xb0\x7f\x8a\x32\xc8\x53\xae\x08\xcf\x25\x41\x79\x66\x25\xe9\x4d\xea\xfb\x6a\xf2\x23\x9c\xa0\xbf\x7c\xaf\x09\xcf\x04\xcd\x51\x66\x25\x1d\x2e\xdf\x0f\x9e\x72\xca\x18\x8f\x99\x58\xde\x76\x95\x2f\x0f\xe7\xbd\x3f\x21\x87\xe8\x5e\x60\xc7\x44\xbb\x87\xc3\xa0\xbf\x9c\x66\x7b\x79\x3b\x3d\xa7\x54\x48\x45\x79\x78\x5d\x6c\x54\x4f\x64\x93\xee\x4c\xf4\xef\xa2\xe2\x12\x29\x3e\x6b\x29\x7a\x9f\xfc\x0a\xef\xda\x17\x1a\x98\xfb\x87\x98\x17\x39\x08\x37\xb7\x0e\x54\x79\x82\x4b\x15\x7a\xe9\x07\x50\xde\xd8\xd0\x3e\xd7\x43\xe5\x0f\xf1\x78\x61\x93\xf7\x74\x67\x28\xf3\x47\x6b\x21\xd7\x9e\x08\xa1\xc3\xdf\xf0\x32\xd7\xb3\x15\x2a\xd6\x5e\xc1\x6d\x1e\x92\x61\xa7\x6f\x3d\x0b\x2b\x33\xf1\xee\xee\xaa\x2c\xf6\xf8\x8c\x45\x6b\xcd\xac\xfe\xee\x4d\x20\x17\x5e\x1c\xee\xe4\xe3\xe3\xdb\x37\x1f\x1f\xdf\xde\x7f\xf8\xf8\x98\x0c\xda\x9f\x30\xe9\x50\x21\x31\x6e\x87\xfd\x7e\xbf\x1f\xe6\xbd\xe1\x74\xd0\xd6\x00\x41\xb9\x2b\xd3\xc3\xf2\x67\x3b\xf8\xfd\xbe\xb1\xb8\x22\x4c\x98\xce\x74\x7a\x6f\x4d\xd2\x1a\x0d\x05\xe0\x03\x70\xc6\x4a\x3d\xa7\x5d\xe7\xf7\xcb\xb1\x8f\x42\xbf\x24\xb9\xa3\x9b\x63\xf0\xa4\xd6\xbc\xde\x8a\xf1\x7b\xd9\xdf\x35\x3c\xbc\x80\xdc\xdd\x2d\xb1\xc2\xc3\xf2\xc8\xf9\xb8\x7c\xba\xa3\xcd\xf9\x58\x71\x60\x79\xe1\x4a\x14\xe3\xd9\x5d\xb5\x65\x63\xfd\x4b\xe7\x28\x67\x70\x70\x5e\x36\xb1\x46\x59\x9d\xe5\xbe\x8a\x4b\x9f\xa1\xd0\xe5\x1e\x97\x1b\xe1\x27\xc3\x24\x2e\x4b\xc2\x6c\x60\x6e\xb2\x65\xdc\x17\x48\xed\x0f\x16\x72\x8c\xb3\xaa\x9a\x4f\x54\x65\x93\x52\x4f\xd1\xa5\xef\x97\xdc\xd1\x2d\x8a\xfe\xd3\x85\xe3\xe8\x86\xfd\xcf\x85\x8e\x39\x50\x6c\xab\x3c\x66\xb3\x0e\x75\x46\xcb\xe1\x2e\xc8\xc7\xfa\x05\xf2\xdc\x17\x08\xad\x9b\x7e\x1b\xeb\x27\x2b\x85\x2a\x29\xb3\x3a\xf4\x7d\x54\xf1\xa1\x28\xf4\xfe\xe4\x20\x27\x24\xaf\xf0\x3c\x31\x9d\x4f\xc6\xf8\xe9\xc2\x19\x9a\x94\x4f\xf4\x4e\xef\xd4\x57\xd8\x3f\x7c\x1f\xfb\x6d\x6d\xec\xee\xde\x7c\x7c\xf8\xe1\xf1\x2d\x7c\x7c\x78\xbb\x3c\x3f\xef\x54\xed\x35\x26\x03\x76\x25\x02\xe4\xdb\xb0\x80\x57\x79\x8f\xa3\x43\x05\x83\x82\x35\x35\xc8\x7c\x41\x9e\xfa\x29\xbd\xe6\xdd\xb7\xb5\x6f\x86\x56\x68\x1c\x16\x4b\x6b\x3a\x2b\x12\x83\x90\x9e\x20\x9b\x40\x09\x99\x73\x3e\xa3\x2e\x6d\x7d\xdf\xb6\x7e\xdf\x85\x1c\xb6\xfc\x1e\xee\xef\xee\x16\x44\x2f\x71\xef\xee\xbe\xe0\x96\xb5\xc7\x15\x1e\x51\x61\x71\x01\xc4\xab\xb5\x26\xd6\xd7\x50\x9f\x95\xb3\x1c\xb4\x1a\x6b\xa8\xf3\xac\x4e\xf3\xcc\x9f\x50\x71\xdd\x44\x08\xc0\x6b\x85\xf1\x73\xe4\xa5\x54\x50\x80\x38\x81\xbe\x22\x2f\x0b\xfe\x05\x7a\xb4\x09\xdc\xd2\xdf\xc2\xfe\x6b\x6b\x7d\x05\xff\x0d\xec\xdc\xf9\x0c\x53\xc8\x8a\xd2\xe1\x12\xb8\x67\xa1\x90\x64\x39\xf6\xe7\xca\x51\xc6\xc0\x98\x63\x0d\xfb\xb2\xce\x10\xf2\x4d\x9a\x85\xec\x84\xf4\x76\x01\xdf\xd7\x32\x80\xb7\x8d\x6d\x6d\xbb\x0c\x3b\xae\xf4\x09\xaa\x09\xf4\xb8\x60\x2f\x9a\x34\x75\x7e\xbf\x60\x6f\x43\x1e\x2f\xd4\x5a\xaa\x9d\x8c\xfe\x22\x7a\x17\x62\x9e\x57\x1d\x87\x37\x2e\x85\x2f\x05\x22\x57\x2a\xe4\xeb\xce\xed\xa7\x3b\xe1\x66\xe4\xa0\xc9\x50\x8d\xf2\xf9\x08\x3a\x47\xb6\x44\xa0\xcf\x2c\x76\xae\x28\x21\xf3\x18\x6a\xcf\x9d\xe7\x50\x7b\x02\x51\x59\x49\x56\xf5\xd5\xb6\xf7\xf5\x30\x00\xc7\x55\x49\x99\xe7\x14\x17\x54\x58\x54\x2a\xe6\x5a\xeb\x1b\x60\xb6\x75\x3c\x48\x92\xde\xf2\xa3\x66\xa7\xff\x7c\x9c\x0f\x9f\xee\xb8\x3b\x33\x17\x47\x19\x6a\x0a\x34\x0b\x38\xe5\xc8\x05\xb2\x0c\x91\x94\xae\x28\x80\xaf\x6d\xc1\x41\xf9\x68\x1e\x00\x97\x44\x73\x02\x11\xbe\x01\xc5\x15\xe3\x5e\x52\x5c\x71\x61\xf3\x42\x0b\xdb\xd9\x65\x5d\xd9\xce\x72\x4e\xb5\x35\x51\x94\x44\x3a\x70\xff\xf0\xe8\xf7\xd1\x5f\x85\x95\x10\x50\x3d\x57\x2f\xba\x6c\x13\xfd\xfc\xf0\x05\xf4\x0f\xeb\x3e\xd7\x4f\xef\x37\x61\x9f\x6b\x89\x26\x3f\xfd\xfc\xb0\x41\x55\x1e\xef\x7d\x4b\x61\x74\xbf\x70\x1b\xa7\x65\xe5\x5d\x3c\xe6\xa8\x80\x9a\xce\xad\xaf\x62\x9d\xa3\xba\x40\xb1\x3b\x93\x2c\xd9\xa7\x7a\xf1\x74\x10\x64\x06\x17\xe9\xb9\x93\x5e\x4a\x40\x07\xe4\xcd\x96\x13\x6a\x7b\x7f\x52\x0a\x52\xc1\x6d\x55\x84\xe2\xe9\xd0\x64\x6b\x08\xf6\x63\x8b\x74\x4e\xf4\x60\x14\x1f\xd7\xdc\x6e\xe4\x9e\xc8\x9d\xdc\x9c\xa2\x77\xd1\x5f\x2f\x36\xbc\xe8\xf1\x7b\x66\xc8\x76\xad\x1c\xb9\x7e\xf9\x72\xb3\x6e\x65\xd3\x1c\xe3\x26\xcb\x6b\x94\x27\x4b\xbc\x5b\xc1\xde\xfd\xc2\x1c\xf4\xe5\xf2\xe4\xab\x60\x2a\x8b\x99\xfb\x22\x1e\xc2\x3c\xc4\xd3\xe7\x0e\x25\x53\x6e\x3b\xd3\xa2\x4e\x0b\x9a\x9d\x9d\xf4\x2d\x03\x45\xbc\xde\xa8\x02\x55\x18\x6b\x4a\xfc\xc1\x39\x40\x94\x38\x42\x7d\xb1\x1a\xa1\xfc\xa1\xc9\x1d\x22\xe2\xc4\x1c\x5b\xb5\x6c\x92\xf8\xf8\x44\xee\x74\xe0\x17\xfb\x9b\x5b\x4f\xdc\x3a\xf4\xb7\x7a\xa7\x2f\xa6\xc0\xf3\x69\xb8\x5a\x10\x6f\xdf\x7f\xfa\xdd\x9b\xf0\x3b\x5b\x5a\xe4\x30\x7c\x1e\x60\x9f\x23\xc5\xca\x53\x55\x34\x45\x01\x69\x7d\xde\xd7\x80\x8a\x0a\xea\xb2\x80\x76\x96\x69\xcc\x53\x6d\xa9\xcb\x1b\x56\x96\xa9\xaf\x88\x9f\x54\x67\x33\x7f\x80\x09\x15\xcb\xf3\xdd\x18\x5c\xf9\x83\x54\x42\x96\x9c\xf8\xc9\x18\xc8\x28\xf1\x0d\xe1\x4b\x78\xac\xc6\xbc\x46\x62\xf4\x87\xbd\x56\x90\x2d\xf3\x88\x23\x88\x6c\x82\xef\xe4\x46\x47\x77\x5f\xd6\xfc\x9d\xac\x7f\xe1\xf5\x46\xfb\xfd\x7e\x0f\x38\xda\x44\xfd\xa6\xb9\xab\x76\x3a\xba\x8f\x1e\x43\xee\xe5\x8b\x4e\xe9\x35\xde\xf8\xf1\x1b\x67\x9e\x69\x94\xc6\x44\x67\x9a\x71\xdd\x34\x9a\xba\x5a\x8d\x04\x64\x42\x6f\xa7\x98\x5d\x4f\x7d\x1e\x35\xd2\x4a\x25\x22\xbc\xed\x34\xae\xca\x4a\x56\x25\xae\x14\xc3\x26\x93\x39\xd0\xaf\xce\x54\xc8\x70\xcc\x64\x78\x0d\x3d\x2c\x41\x2f\xc6\x26\x79\xf4\xb7\xaf\xd6\xd5\x33\x59\xe6\x87\xb5\xeb\xc8\x24\x05\x42\x1a\x97\x49\xf9\x79\x9f\xe6\x89\xd5\x03\x37\xa8\xa3\xaa\x3c\x1f\xad\xa7\x04\x4e\xd5\x7c\x88\x45\x59\x30\xca\x2d\xc1\xde\xb9\xdc\xe4\xdc\xfa\x03\xb7\x1c\xea\xd0\xab\x75\x78\x22\x9b\x76\x27\x2f\x7b\xb5\x7f\x19\xf4\x93\x6e\xea\xab\xef\x2e\x95\x51\xdb\xfb\xc7\x8f\x8f\xc1\xcf\xbe\x7f\x8c\x0f\x75\x5e\xba\x2a\xb7\xbe\xcc\xc1\x7a\x19\x8a\xd8\xa0\xb6\xc6\x5a\x63\xb6\x96\xd3\x52\x28\xd3\x98\xd6\x34\x33\xb5\x36\x6e\xbd\x80\x2c\x4a\x36\xfc\xc2\xdd\xfb\x63\xe0\xfb\xfc\xc2\xf5\xf9\xe1\xd3\x9b\xb5\x7a\xe9\xcb\x62\x5b\xe3\xaf\x67\xb2\xf3\x9b\xc9\x59\x6b\x91\xe2\x96\x8a\xce\x4f\x58\x82\xb2\x7e\x74\x02\x8f\xce\x4f\xbd\x6b\x83\x8e\x53\xe1\xc7\x6d\x3d\x8e\x66\x6c\x01\x95\x53\x6b\x98\x3c\x33\x63\xe2\x13\x56\xa6\x33\xe3\xd9\xf4\xf3\x71\x88\x36\x41\xa3\xd5\x06\x1e\xc3\x7f\xb8\xb0\x54\x7f\xa3\x7f\xf8\xcd\xc3\xc7\x2f\x45\x53\xef\xee\xae\x0c\xd6\xe1\xc1\xf4\xe1\xed\xc3\x1f\xde\x3f\xee\xee\x3e\x3c\x27\x30\x58\xee\xa3\x6b\x24\xb9\x49\x6b\xa0\xee\x78\x74\xbe\xad\x8f\xc7\x93\x1f\x09\xc3\xe3\x12\xab\xab\xb2\xb0\x18\x8e\x7e\xdc\xb7\x84\x52\x7f\x30\x06\x52\xed\xb8\x70\x47\x9f\x1f\x1d\xc8\x7a\xbf\xaf\xbd\x41\x7b\x5d\x17\x87\x9d\xaa\xeb\xda\x04\x35\xc9\xb3\x64\x55\xa1\x55\x6d\x28\x2f\xb5\x69\xa8\x29\x2a\xe9\xa0\xb5\xbc\xb1\xca\x2b\xe7\xea\xda\x04\x36\x14\xc7\x55\xb3\xd6\x0a\x93\xa0\x37\xfc\xef\x6f\x8a\x4e\x97\x7a\xd5\xdd\xdd\xfb\xdf\xbd\xfb\x70\x29\x12\x4e\x42\x2d\xef\x76\x34\x39\x02\x51\xe8\x3c\x7d\x8a\x8a\x4a\x0a\x65\x52\x8e\x19\x93\xb4\x68\xa9\xe0\x3b\x51\xd6\x4a\x55\xc7\x42\x6a\x6b\x18\x94\xc7\x93\xf6\xf5\x51\xd7\x7b\x60\xbe\x1f\x8d\x05\x1b\xf6\xd5\xe9\x56\xec\xaa\xe8\xaf\xa2\xbf\x8d\xfe\x3e\xb0\x47\x5d\x32\x0e\xb7\x68\xed\x57\x72\x0e\xbb\xbb\xf7\x6b\xa5\xd3\xdb\x4f\x49\x1a\xe7\xfe\x90\x21\x70\x65\xe1\xf2\x02\x91\xbc\xca\x72\x5f\x97\x84\x1b\xcc\x4d\x90\x32\x4b\xfd\x89\x89\x34\x2b\x59\x45\xca\xb2\x2a\xa1\xf4\x54\xb3\x5d\x35\xab\xaa\x9c\xab\xc6\x64\x26\x63\x36\x8e\x08\x96\xca\x82\xb6\x5e\xd8\x79\xcc\x71\x25\xb0\xac\x04\xa7\x25\xd5\x70\xec\x54\x58\xf3\xc7\x27\xb2\x45\x3b\xf5\x4c\x49\xef\xd9\x7a\xbc\x7f\xbc\x4c\x68\x60\xba\x5a\x22\x80\x25\xba\xbc\xee\xde\x2e\xef\xf1\x34\x98\x61\x18\xc7\xae\x33\xe3\x38\x0c\x83\xa6\x74\x64\x7e\x58\x5e\xb7\x07\xe7\x8c\x9b\x53\xb7\x3e\x9d\x5d\x7c\x72\xbe\x6c\xdb\xd6\xe7\x5d\xb7\xf2\x1c\x07\x3e\xa6\x1d\x8f\xfe\x22\xfa\x6f\x41\x65\xff\x75\x65\xf5\x37\x1a\x36\x6e\xc5\x37\xef\x5f\xd7\xd9\x7e\x80\x25\x10\xfe\x6f\x70\xff\xf0\xa2\xde\x76\x77\x0c\x49\x6d\x21\x95\x64\x31\x66\x36\x50\x58\x37\xa8\x94\x59\x28\x5e\xcf\x85\xc8\x52\x93\xb1\xba\x4d\xcb\x82\xe5\xd2\xf5\xaa\x3b\x41\xda\xa5\x03\xe7\x04\x86\x02\xe5\x26\x23\x5c\xd0\x1d\x37\x55\xee\xed\xbc\xf7\x65\xc3\x1d\xb4\x71\x01\x23\xea\xa9\xe2\x92\x12\x82\x0a\x8b\x14\xc2\x45\x86\x65\xb5\x2f\x53\x82\x71\xaa\xb2\xc6\xf7\x9e\x7a\xc9\x00\x43\x03\xed\x79\xf0\x1a\xab\xa2\x86\xc8\xeb\xa2\x30\xa8\x15\x25\x0e\x5c\x63\x26\x70\x20\xab\x90\xf5\xb9\xdd\x6b\xde\x7e\xd1\x5b\xf9\xf4\xe6\xf1\x52\x74\xfd\x18\x1f\x8f\xa8\x34\x18\x19\x7f\x80\x9c\xcb\x8a\xe6\x81\xee\xd4\x1c\xc4\x9e\x6f\x89\x55\x85\x69\xec\xf1\xdc\xfa\x63\x6e\xb2\x7d\x6c\xd2\xd9\x7a\xcd\x40\xc7\x39\xe8\xf5\x39\xcd\x9e\xea\xb8\xdb\xc9\xab\x8e\xcc\x9b\x95\x63\xf9\xf1\x45\x7e\xe1\xa7\xfb\xc7\x9f\x3f\xdc\x3f\x2e\x5f\x98\xc1\x8c\x23\x4e\x73\x55\x66\x3a\xed\x4f\x39\x44\x83\x21\x64\xa0\x5b\xbc\x38\xf5\xe7\x93\xe7\xb9\x14\xf9\xbe\x2f\x10\x62\x95\xc3\xb0\x37\x70\xf2\x29\x9c\x6e\xf7\x6d\xbd\xd9\x5f\x74\xbe\xd6\x7b\xf6\x97\xd8\xfe\xcd\xc3\x85\xca\xfa\xe1\x0f\xef\x37\x29\x29\x92\xf4\xb3\x4e\xf3\xa4\xcd\x9d\xe3\x1a\x19\xc6\x68\x76\x3e\x48\xdf\x09\x70\x85\xcf\x13\x56\x54\x9b\xbd\xd0\x4e\x4a\x1f\x3d\x45\x59\x9d\xd7\xcb\x82\x1f\x2c\xa4\x31\x77\x9c\x2e\xe3\x58\x5d\xf6\xc3\xd0\xf5\xff\xf7\xc3\xdd\xf3\x41\x7c\x58\x95\x53\xee\xd7\xc7\x33\xc2\x45\x9c\x9e\xc7\x34\x6e\x55\x23\x1d\xaa\x25\xa9\xb2\x79\xca\x87\x5e\x0e\x9d\x9f\x62\x84\xaa\x9d\xb2\x4d\xdd\xda\x19\xf9\xa9\x68\x0a\x17\x67\x7e\xf0\xac\x36\x35\x9c\xe2\xaa\xb6\x32\xba\xf9\x98\x72\x67\xa2\x34\xfa\xeb\x10\xb1\x5e\x19\xb2\x92\xc5\x7b\x7c\xe5\x32\xbc\xb9\xf9\x95\x61\x28\x5e\x39\x0e\x3f\x6e\x8b\xe0\x59\x1a\x38\x60\xc5\x2a\x48\x71\xd1\x14\xe5\xe2\x31\x34\x8b\xc7\x80\x8d\xdf\xc7\x69\x8e\x6c\x95\xc3\x38\xb3\x34\x8b\x4d\x2a\xad\x34\xb9\xd6\x55\x91\xcd\x93\xf0\x47\x01\x6c\x67\x08\xb7\x56\xbd\x72\x18\x08\x99\x95\xc5\xb8\xa0\xcc\x32\xea\xc5\x80\x1c\xa2\x93\xef\x6b\x1d\xae\xc1\x04\x3d\xf3\x7b\xfe\xeb\x37\xfd\x9e\x0f\x57\x19\xa3\xab\xdf\xf3\x7d\xb7\x87\x97\x39\xec\xcf\x11\xd4\x79\x21\x58\x75\xac\x50\x53\x14\x27\x7b\x9e\xec\x54\x54\x10\x0a\x99\x66\x9b\xc5\x24\x55\x86\xda\xbc\xa6\x8b\xd3\x43\x2a\x3f\xc9\xda\x65\xfe\x08\x7d\x7e\x75\x7a\xb0\x1f\x84\x96\xb2\xe4\xd4\x9f\x96\x67\x03\x25\xbe\x25\xdc\x36\x5e\x8e\xc8\x21\x35\x2c\x3e\x8f\x04\x04\x91\xc5\x38\x4a\x12\x1e\x7c\xfd\x75\x1e\xfe\xeb\xcb\x79\xf8\x8e\x09\xaf\x5d\xb7\x55\x55\x27\xd8\x60\x8a\x1c\xea\x33\x06\x5d\x0a\x5a\x8e\x65\x51\xa3\x62\x5a\xe2\x95\x53\x51\x82\x2e\x72\x70\x73\x9b\xc6\x65\x26\x0d\xb6\xb9\xa3\x45\x91\x7a\x51\x4d\xca\x99\xf4\x04\x75\x86\x56\x03\xb4\x1f\xa4\x7a\x85\x9f\xb2\xc5\x69\x0b\xe3\xcf\x8f\x7e\xec\x82\x01\xe9\x85\xdb\x65\xb9\x0f\xff\xcb\xf7\x02\x42\x6e\xbd\x9c\x45\x19\x23\x38\x39\xa1\xad\xf3\x44\x12\x4b\xc4\xb4\xee\x05\xd4\x6a\xb4\xcb\xa5\x9b\x64\x81\xe8\xac\x85\xa3\x3b\x4f\xee\xf8\x2b\xb9\xf5\x6f\x6d\x05\x6c\x12\x13\x62\x40\x15\xfd\xbb\xe8\x77\x51\x1e\xf6\xf0\x6f\x09\xaf\x9f\x7f\xff\xee\xb9\x6a\xd9\xdd\xcb\x3e\x81\x8b\xec\xc5\x9d\x72\x33\xaf\xc1\x94\x75\x81\xfc\x24\x75\xc3\x5b\x38\x28\xa5\xb9\x19\x6d\x5e\xc4\xb9\x47\x21\xb5\xde\x7a\x5a\x0b\xa5\xa6\xed\xe0\xc7\xba\x81\x52\x95\x94\x35\x74\xd4\xd2\xd6\xaa\xe6\xce\x36\x88\x33\xdb\x98\xc6\xfa\x29\xc1\xb5\x94\x87\x25\xb6\xee\xc3\x35\xa9\xa2\xbf\x08\x2c\x17\xff\xf8\x3a\xf2\x7b\x0e\x6e\xfb\x15\xb8\xc7\xbb\xc5\xd3\xbd\x93\xf5\x79\xa8\xe1\x90\xa3\xa6\xcc\x7d\xaf\xdd\x20\xc6\x38\x33\x5a\x0b\xeb\x27\x97\x97\xb1\x9b\xbb\x38\x94\x6b\xce\x53\x9d\x6a\xca\x15\xa0\x2b\xc6\x10\x9c\x36\x6c\xd0\xda\x38\x59\x73\x6b\x5b\xc4\x6e\x20\x55\xcd\xc9\x82\x32\x8a\x76\x89\xb9\xd4\x97\xac\x38\x7f\x0a\x7c\x1c\xbf\x82\xf5\xee\x5d\xe0\x97\x0c\xd2\x0e\xcf\x13\x87\xcb\x50\x2e\x0f\xb5\xbc\x70\x55\xee\x0f\x46\xf7\xbc\x83\x43\x6b\xb8\xab\x95\x45\x6d\xd8\x29\x6c\x4d\xa8\xb1\x8f\xb1\xf3\xd8\x39\xd8\xfb\x25\x42\x1d\x9a\x06\x4a\x82\x4b\x2a\x8e\x64\xb0\x5a\x37\xaa\xd1\x9d\xc6\x18\x1f\xb8\x13\xa7\xa3\xb6\xe6\x29\x9a\x99\xd6\x71\xe3\x79\x90\xe5\x8a\x76\xe1\x5e\xd1\xdd\x30\xaf\x9c\xde\xbf\x8a\x79\x17\x40\x27\x5f\x81\xd6\x8b\x5b\x00\x5d\x56\xb8\x32\xf7\x83\x51\x47\x3e\xc0\xa9\xaf\x45\xdb\x09\x93\xe5\x23\x54\xd4\xef\xfb\xc6\x77\x14\x64\xac\xdd\x7c\x70\x2e\x46\xf3\xe1\x19\x6a\xc6\x7b\x32\x58\x65\x8c\x6a\x4c\x67\x2a\x5c\x14\x93\x70\x0a\xa2\xc9\x5a\xe7\x8f\xb3\x16\x22\xd6\x5e\x42\xba\xf6\xb9\x06\x7d\xc2\x6d\x75\xc1\xfd\x9f\x2e\x15\x48\x2f\xa8\x9f\x92\x75\xef\x76\xf3\xee\xee\x0f\x3f\x2d\xb8\x37\xdb\xbb\xf7\x97\x6f\xc3\x92\x78\xf8\xf1\xfd\x0e\x16\xf7\x1b\x95\x28\x3e\x2d\xf1\x75\x92\xe5\xa8\x51\xa3\x1f\x05\xe4\x49\x01\xd9\x41\x4c\x4f\x51\xab\xb3\x0c\x34\x74\xf4\x54\x9f\x95\x35\xba\x8c\x0b\xbb\x89\xfc\xe9\xd4\xfa\x43\xa0\x75\xad\x08\xf5\x7d\xdb\x42\x55\x95\x7e\xe4\x8d\xb4\xd4\x4a\x67\x5a\x95\xd2\x2c\x3f\x68\xcb\xe7\x23\xe7\x71\x56\x16\xae\xee\x54\x63\x7c\x3e\x5c\x6b\xee\xda\x9d\xf9\x13\xd6\xca\xe6\xca\x45\xfa\x8c\x6b\xfc\xe1\x4e\xb8\xb3\x74\x71\x86\xca\x9a\x20\xdf\xaa\xf6\xc4\x0f\x31\x9b\x7a\xb9\x3f\x72\x55\x42\x0a\x8c\xf9\xde\x8f\x83\x67\x04\x0e\xf1\xe0\x66\xb1\x96\x04\x2d\xe3\x5e\xd7\xcb\xb8\x57\x4c\xec\xf9\x68\x8c\x6c\x4c\xab\x3a\x9d\x0b\x32\x6a\x67\x4e\x27\x67\x1a\x3f\x5d\x46\x5d\x2d\xcf\xff\x34\x3e\x3d\xb1\xbb\xe6\xc6\xd7\xbd\x2a\xe1\xbc\x8f\xaa\x5b\x7f\xf1\xfd\xc3\x8b\x0e\xef\xf5\xce\x76\xd9\xb4\x59\x15\xef\x3f\x5c\xb5\x7d\xae\xb5\xc9\x87\x06\x15\xb0\x3f\x3b\xc8\x8a\x7a\x4d\xd5\xae\x07\x54\xa4\xb0\x08\xc3\xa4\xa9\x25\x7a\xce\x6d\xce\x2c\x1f\x5d\xc9\x4c\x95\xd9\xac\x2a\x8f\x7b\xbe\x33\x88\x91\x73\x91\x8c\xdc\x6b\xe7\x69\xed\x49\xed\x9d\x50\xa5\x16\xa8\x6e\x59\xdb\x54\x68\xdc\xd3\xce\xf9\x23\x42\x95\x29\xf6\x65\x89\x59\x94\x46\x6c\xb1\x61\x4b\x5e\xd8\xf0\x8f\x21\x7f\x7e\xb3\x01\xbe\xb2\xe1\xc2\x0d\xf1\x61\x71\x56\xd1\x95\xc9\xe8\x63\xb2\x8a\x48\xf2\x06\x55\xf1\xfe\x97\x13\xd4\x95\xdf\x27\xe3\x82\x68\x3d\xa0\x77\x8a\x6b\x9b\x64\xce\x69\xdd\x9c\x4b\xc7\x7a\xa0\x3c\x75\x99\xf3\xcc\x8f\xf6\x60\x94\x55\x6e\x4b\x10\xc5\xe7\x7d\x82\x99\x6f\xe5\xe5\x67\xc4\x54\x71\xcc\x54\x2d\x9c\xc3\xc7\x1c\x95\xb2\x72\x9c\x50\x48\xc9\x20\x44\xf0\xfb\x52\x18\x9f\xd8\x5d\xbd\x2d\x2f\x7c\x9e\x3f\x44\x7f\x15\xa1\xa8\x5c\xb5\x67\xbf\x3b\x15\x57\x33\xee\x5f\x30\x09\xac\x66\x6c\x50\x53\xc6\xc5\x39\x03\x84\xda\xa0\x7e\x71\x39\xa0\xd4\x9c\x0b\x19\x1b\xc3\x0c\xd5\x73\xa4\xa9\x3b\x90\xd4\x66\xca\xf7\x93\x3a\x5a\x4c\x0d\xdb\x96\x48\x9d\x0f\x09\xa2\x7e\xe0\x41\x0b\x8a\xfb\x13\x61\x4a\x92\xca\xb5\xb4\xad\xcb\xa7\x08\xe5\xcb\x0c\x70\x42\xa0\x28\x0f\x35\x6d\xa3\x34\x6e\x9e\xd4\x57\x6b\xe9\x9f\xfe\xd8\x5a\x7a\x6d\xc0\x65\x15\x5d\x2c\xe8\xeb\xbc\x80\xf1\xcc\xa1\x44\x6d\x2c\x66\x77\x3d\x40\xe1\xb0\x96\xf6\x8e\x5b\xe6\xe6\xcb\x2a\x32\x59\x55\x1c\x97\x95\x9f\x33\x27\x76\x06\x11\x7c\x26\x49\xc7\xbc\x5d\x22\xab\xf0\xb3\xae\xa5\xfe\xc8\x8e\x3d\xf5\x0e\xe5\x48\x97\xa1\xac\x1d\x70\x58\x59\x2b\xcf\x03\x7b\xe2\x9b\xc3\xad\x16\xfc\x37\x5e\x13\x0f\xbf\x76\x4d\xc4\x55\x93\x17\xd0\x9d\x6b\x48\x8b\x3a\xf0\x14\x5e\x0e\xa0\xeb\x35\xb1\x57\xd4\x60\x35\x97\x26\x63\x8e\x8f\x0e\x63\x5d\xa6\x36\x2f\xcb\x61\xcf\x76\xba\xa0\xe4\x8c\x92\x03\xf7\x2a\x08\x6d\x33\xe7\x2d\xd7\xa5\x16\x75\x47\xdb\x26\x47\x63\x4b\xda\xc6\x9f\x10\x2a\x55\xd1\x15\x05\x66\x51\x94\x26\xe2\x9b\xd7\xf5\xa7\x2f\x36\x7c\xf8\x0d\xd7\xf5\xb3\x16\x8a\x6d\x1e\x28\x03\xce\xc7\x09\xa9\x2b\x17\x5d\x38\x50\x95\xdb\xbc\x84\x5e\x12\x83\xe5\xcc\x4c\x86\x1d\xed\x9d\x54\x0b\x7e\x36\xb4\xec\xd5\x25\x1d\x7e\xea\xcb\x25\xdd\xd1\xae\x29\xd1\xb8\x27\x5d\xed\x8f\xb8\x32\x45\xcf\xf0\x85\x2b\xf2\x10\x72\x2f\xfa\x92\x7b\xf9\xf8\x85\xef\xe0\x79\x99\xdc\x97\x12\x97\x4f\x1f\x5f\x5c\xe6\xf0\xf0\x36\xf0\x0f\x3d\x6c\x74\x8d\x8a\x38\xf5\xb8\xc2\x6d\xc7\xea\x7d\x37\x51\xdf\x8c\x54\x2b\x81\xa4\x2a\x91\xc7\x20\x4b\x7f\x8a\x8f\x73\xbe\x1c\xfe\x04\xc3\xe0\x8f\xfc\xd4\xf8\x71\xa7\x0b\x82\xe7\xc2\x30\x4a\xad\x56\xb4\x17\x75\x03\xd8\x3b\xc9\x32\x9b\xa1\x2a\xee\xe3\x91\x2d\x06\x91\xda\x17\xda\xab\xd6\x29\x28\xae\xf5\x7e\x75\xd0\xe4\xf9\xe7\x2f\x79\xe2\x10\xfa\xbe\xb9\xec\x78\xaf\xc5\x3b\x0f\x6f\x1f\x7f\x58\xbc\x9a\xdf\x6d\xef\xfe\x90\xc4\x17\x89\xa2\x4f\x6b\xa5\xdc\x65\x32\x0e\x65\x0e\xec\x7c\x1a\x75\x93\x53\x5e\x19\x09\x2e\x47\xb9\x49\x33\x30\x87\x14\x0a\x7f\x24\x10\x89\x9e\x13\x3f\x32\x28\x4b\x7f\x82\x3c\xa3\x18\x0b\xe9\x55\x85\xf4\x12\x19\x71\x69\xe6\xc6\xe7\x5e\x11\xc0\x50\xd2\xaa\x26\x2c\x3e\x30\xec\x6b\x44\xb0\xe9\xac\xf1\x6d\xa7\x6b\x40\x4f\xd1\x60\x06\xc0\xc6\x76\x2d\x17\x3d\xa4\x4d\x5f\x0e\x4d\x14\xdd\x6a\x6b\x17\x5b\x3e\x44\xff\xbf\xef\xda\xf2\x5b\x4c\x19\x4a\x04\xec\x3c\x1c\xcd\x3e\xe7\xaa\x72\x1a\xf6\x79\x51\x59\x04\xed\x31\x03\xec\x47\x02\x99\x18\x05\xf1\x3d\x03\x5c\xfa\x23\x14\x19\xc7\x84\x0b\xaf\xaa\x5c\x23\x7c\xb5\x24\xf3\x9a\x00\x85\x92\xe1\x86\xf2\xb8\x0f\x96\x98\x60\x48\xb7\xd7\x2d\xe4\xfe\x34\xd8\x3e\x18\xd2\x08\xd1\x41\x7e\x31\x64\x93\x14\xa1\x17\xdd\x84\x6c\xcf\x3f\x07\x4b\xde\x3e\x3c\xaf\x22\xbf\x7f\xb8\xbf\x06\xef\xc1\x33\x7e\xf3\xf1\xf1\xed\xf6\xd2\xbc\x77\x2b\xeb\x78\xfc\xb0\xac\xbc\x3b\x7b\x6e\x9d\x3b\x3a\x6b\xe7\xa3\x33\x56\x43\x47\x34\xa9\xf0\xf1\x29\x8a\x07\xae\x74\x47\x07\xd7\x1c\xe8\xe8\x14\x25\x53\xc5\x79\xb5\xed\xed\x31\x68\x2e\xfa\x11\x8a\xd3\x7c\xf2\x8a\x81\x85\x31\xee\x05\x63\x62\xe6\x75\x7d\x10\x07\xc3\xab\x9a\x68\x8d\x6d\x25\xcc\xde\x70\x6e\x16\xff\x78\xbc\xf4\xcf\xff\x5d\xf4\x18\x7d\x0c\x2b\xe9\xdb\x98\x3f\xfd\x36\xd0\xb2\xa9\x4f\xae\x69\xe6\xa1\x71\x96\x56\x70\x28\x75\x55\x92\x93\x9f\x92\x48\x18\xdb\xd3\x43\xd3\x9d\xc8\xb1\xd6\x94\x4e\x58\x4a\xfc\x12\xb5\x8f\xbc\x64\x47\x90\x90\xc5\x3d\x63\x94\x3f\x87\x6d\xcc\x05\xb6\x10\x26\x5c\xb7\xdd\x05\x37\x8a\x7e\x8c\x3e\xad\x7d\x1f\x0f\x37\x06\x9c\x15\xf7\xc3\x0d\xf7\xca\x55\x12\xa4\xbc\xdf\xee\xbe\x38\xce\xb7\x56\xc9\x3b\xfb\x59\x43\xe4\x80\xb9\xc3\x61\x56\x4f\x51\x6f\x25\x8d\x09\x2a\x34\xc1\xda\x37\x7e\x9f\x34\xaa\x69\x21\xa2\xfe\x30\x4c\xbe\xa7\x50\xf6\x4e\x28\xc8\x99\x75\xec\x1b\x26\x4c\x20\x21\x8d\xfb\x90\x59\x7e\x66\x03\x35\x76\xb5\xc1\x0a\x61\xc3\xbe\x9f\xfe\x96\x0d\x1f\x5e\xd8\xf0\xf8\x3d\x1b\x2e\x74\x6e\xcf\x6d\x38\xa3\xde\x41\xee\xf6\xfb\xb9\xeb\x6b\xcb\x70\x1c\xe5\x48\xe3\x8a\xfa\xa3\x3f\x26\xa5\xb0\x6e\xa4\x53\xd7\xfb\x89\x40\xd4\x18\xca\x21\xc2\x4a\x93\x6f\x2c\x9c\x09\xc4\x32\x05\xaf\xf1\xbf\x9e\x83\x50\x67\xbe\xa5\x41\xa7\xea\xc7\xef\xa0\xbf\xff\xe3\xe8\xd7\x42\xa2\x2d\x39\xf3\xc6\x02\xaa\x9d\x9b\xdb\xa6\xb5\x8c\xc0\x31\x47\x75\x85\xa8\x3f\x3c\x45\x49\xc9\x94\x53\xdc\xd4\x7b\x3f\x49\x88\x6a\xeb\xaa\xbe\x15\x78\x36\xdb\xc1\x8e\x81\xb5\xd6\xf7\x50\x3d\x45\x3e\xbd\xad\xa0\x7d\xd8\xaf\x9f\x79\xd3\x9c\xac\x53\x94\x69\xce\x1d\x33\x54\x10\xac\x29\xe5\x41\x67\x2b\x0a\x79\x82\x4d\x7f\x61\x34\xff\x87\x0b\x73\xe6\xfa\xd8\x7a\xd1\x7e\xf5\xf0\xf3\xc3\x6a\xc9\xc7\x7b\x78\x96\xa7\xbd\x39\xd8\x66\x56\x79\x11\x57\xf3\x89\x0a\x2d\x91\x56\xd5\x7c\x82\xa1\x9a\x49\x6b\x39\x86\xe0\xe8\x2f\x47\xae\xea\x51\x1c\x12\xdb\x37\xb2\xd9\x6f\x7a\x8b\xab\x59\xfb\x41\xb2\xc5\x41\x85\x2c\xd6\xca\xa7\x9e\xfb\x8e\xf5\x50\x1c\x62\x32\x9f\x94\xb7\xca\x0f\x74\x54\xd2\x1a\x61\x4d\xad\x96\xe7\x2d\x0b\xf1\xac\xbe\x75\x08\xff\x65\xe8\xc6\x0f\x59\xda\xfb\xe0\x32\xbc\x78\xda\x3e\xd7\x93\xbc\x8a\x97\x6f\xdf\x7f\xda\x22\x07\xea\x6c\x40\x0c\x31\x09\xdc\xc5\xeb\x81\x1d\x61\x86\xcf\x03\xc3\xb6\x62\x31\x1e\x3a\xdc\xef\x07\xa1\xfc\x48\x8e\x3b\xed\xf9\xe7\xe3\x26\xf7\x7d\xe3\xcb\xe5\x67\x53\x95\xb5\x20\x5a\x0a\x4d\x94\xfc\xa5\xa3\xd2\x19\xaa\x95\x92\x0e\x07\xdf\x26\x3e\x5c\xf6\xb4\xbf\x8b\x13\xbe\x87\xf3\x59\x0f\xf0\x66\xaa\xa1\x39\x67\xd0\xf8\x53\xdc\x06\xc6\xf0\xf5\xe8\x1b\x2e\x8d\x9a\x2b\x49\x1c\x16\x40\x64\x08\x68\xa3\x38\x3a\xec\xc9\x30\xec\x94\xe7\x9f\x4f\x9b\xd4\x8f\xf5\x05\x2a\xab\x5a\x45\xac\x52\x16\x1b\xfd\x4b\xab\x8c\x70\x54\x51\x59\x1b\x1a\x25\xb1\x8b\xd0\x86\x6f\x0f\x17\x9c\xab\x96\xf6\x65\x37\xe7\xfe\xc3\xfd\xe3\x86\xbb\xda\xda\xba\xae\xeb\xed\xe1\x17\x2d\xdb\xed\x7e\xee\x42\x4a\x6b\x1f\x25\x31\x89\xd0\x86\x7c\xfd\xbb\x70\xff\x78\xff\xf6\xfe\xc3\xfd\x86\xd8\xa3\x01\x79\x3c\x6e\x0f\xbf\x28\x75\xf9\x55\x8f\xb5\xc7\xb0\x0f\xba\x51\xe2\x09\xdf\xd9\x6d\x75\xeb\x6f\xfc\xcf\xd1\x7f\xff\x52\x03\xff\x25\xf7\x7b\x7f\x61\x97\x7d\x1b\x36\xa4\x6f\x8c\xa1\x1f\x1f\xde\xfe\xb4\xf2\x6e\xae\x99\xf1\xe7\x42\x93\xab\x83\x15\xcb\xb8\x72\x50\xe4\x48\xe1\x52\xcc\x7b\x38\x38\xdf\x2d\x3f\x70\x98\xfb\x4d\x1e\x3e\x03\x81\x83\xef\x3c\x02\x32\xef\x13\x19\x48\xae\xa9\x55\x3c\x57\x8a\x9c\x2d\x60\x8e\x4d\xc5\x37\x0d\xa5\x05\x22\x4b\x60\x31\x8f\x84\x73\x12\x17\xdc\x1f\x28\x5d\xd9\xd8\x29\xf5\x8e\x73\xbd\x17\x2c\x77\x88\x34\x05\x13\x24\x94\xb0\x45\x77\x91\x7d\xaa\xee\xd4\x56\xbd\xb6\xef\xcd\xbf\x96\x7d\x36\x29\x1c\x9c\x50\x21\x18\xe6\xe7\x29\x76\xce\x47\xcb\x4f\xec\xce\xe3\x76\x1f\x3e\xc7\x51\xec\x7c\x34\x8b\x38\x3a\x8f\x9b\x43\x68\xc4\x20\x4a\x72\xa4\x54\xf1\x19\xc1\x68\x24\x57\x7a\x73\x90\xb2\x40\x94\x50\xc5\x66\x69\x9c\x73\x71\xcd\xfc\xc8\x39\xe7\xfd\xf2\xc2\x3d\xb7\xd6\x76\x3c\x98\xe7\x32\x4c\xb5\xc0\xd1\x5d\x6c\x9e\xe8\x5d\xbb\x19\x2e\x5a\xfd\x45\xe8\x20\xfe\x9f\x97\xb9\xfb\xf0\x1d\xd3\x5e\x53\xa5\xfe\xda\xd4\x35\x71\xea\xda\x4a\x11\xdc\xce\x23\x8c\xce\xef\x9d\xef\x1d\x0c\xf3\x69\x08\xe4\x66\x03\xe0\xf3\x74\xfb\x14\x25\x3a\xc8\xfc\x53\xc3\x69\xce\x05\x3e\x6b\xc8\x8d\xe0\x52\x6d\xa8\x94\x05\xc3\x58\x93\xb9\x13\x42\x88\x98\x10\x7f\x22\x84\x3c\x45\xcb\xbc\xd5\x65\xa9\x85\x64\xb9\xcb\x09\x45\x25\x56\xb4\x5a\xf5\xcc\xc6\x27\x72\x67\xb7\xec\x9b\xb6\x3d\xfc\x29\xb6\x05\x1a\x98\x67\xb6\xbd\x5b\x6d\x9b\xe2\xcc\x42\x5e\x71\x5a\x55\x3e\x82\xc1\xf8\xce\xfa\xce\xc0\x30\x4f\x7d\xd0\x5e\x18\x81\x9c\x0f\xb7\x4f\x51\x42\xec\xe1\x40\xa4\x64\xb9\x94\xc5\xb9\x9b\x54\xb0\x6c\xd0\xba\xa2\x98\x28\x36\x33\xeb\x9c\x8d\x1b\xe6\x07\x21\x44\x68\xb2\xf3\x8c\x52\xdd\x30\xba\x04\x6a\x16\x2d\xff\x08\x2f\x76\x4d\x4f\x34\xe8\xa7\x7f\xeb\x7a\xfb\xf0\xbd\xf5\xf8\x9b\x0c\x5b\x27\x2d\xc9\x60\x74\x2d\x2a\x04\xae\x5a\x9f\x42\xeb\xfc\x71\xf9\x81\xd6\x17\xfb\x50\xdb\xd4\x42\x3e\x57\xd7\x4f\x67\x96\x94\x6e\x9a\x88\x66\x04\x71\x5e\x9e\x07\x48\x15\x17\x5c\x6c\xc7\xba\x2e\x0b\x42\x98\x51\x33\x5a\x1e\x6e\xf1\x61\x79\x12\x28\xe5\x9d\xd6\xda\xa7\x8c\x99\x51\xb2\xbc\x46\x64\x5f\x51\xa1\x14\x0d\x73\xd6\x5c\x34\x42\xff\xe5\xb6\x7d\x67\x41\xf6\x70\x72\x7d\x51\x08\x52\x75\xf3\x11\x7a\xe7\x07\xe7\x07\x0b\x7b\x9f\xf6\x5f\xeb\xce\x9d\x51\x22\x1c\xa4\xfe\x44\x0d\xa3\x39\xe7\xf8\xec\x20\x57\x52\x08\xf5\xa7\x5b\x17\x27\xd5\x4d\x77\xfb\x7f\x04\xb6\xd4\x8f\x1f\x7e\x78\xce\xe7\x71\x69\x0a\x79\xb8\x8a\x61\x5e\xb9\x3c\xde\xad\x14\x6f\x37\x81\xe5\x8b\x24\xf7\xc7\xbb\xf7\x3f\x26\x0a\x9a\xd4\xa5\xd0\xf9\x32\xcd\x96\xf9\xc9\xf2\x58\x1c\xb9\x21\x7b\xe9\x7b\x3d\x72\x2b\x26\x20\x45\xe6\x27\xa8\x90\x97\xf1\x58\xed\xc1\x78\x75\x6a\x58\xdd\x38\xf3\x14\x31\x48\x8d\xef\xc1\xb4\x25\xe4\xdb\x09\x13\x82\x4d\x55\xe9\xaa\x34\x0a\x1b\x39\x8c\x5a\x31\x63\x70\xa1\xe5\x6c\x64\xe9\x0c\x32\x5a\x6b\xe9\x7b\x90\xad\xd2\x6c\x30\x1a\x69\x74\xf1\x9f\xaa\xbb\x7a\xcb\xa2\xf7\xd1\x7f\x5b\x2c\x7b\x73\xdd\x50\x0f\x76\x3d\x5e\xa4\xc4\xdf\x3f\xd7\xe6\x5e\xc9\x56\xae\xf9\xfe\x67\x36\x6d\xdf\xff\x08\x21\x59\x39\xc5\x75\x9e\x59\x14\x4f\xe7\x63\x19\x1f\xcf\x03\x4e\x37\xcc\x8b\x7a\x71\x5e\x87\x7e\x16\xbd\xef\xd9\xe0\xbc\x8b\xb3\xb2\xf4\x0a\x46\x94\xcf\x76\x23\x70\xdd\xc4\x62\x76\xf5\xd1\x0b\x0e\xec\xe0\x49\xcc\x7d\x57\x42\x0b\x29\x54\x23\x1b\xfc\xb8\x39\xe0\x2a\x13\x9a\x29\xae\x1d\x71\xfa\xb4\x37\x8a\x4b\x5d\x54\xaa\x28\x7d\xae\xf3\x4c\x1a\xcf\xc1\x4e\x56\x8b\xc6\x70\x64\x72\x2f\xa8\xd2\x8a\x45\x71\xd8\x8b\x71\x3b\x1d\xfd\x87\xc0\x5f\xf9\x1b\xe6\xee\xf1\x85\x8d\x6f\x9f\xcb\x63\xdf\x66\xaf\x01\xb5\xcc\x9e\xf3\x34\xcd\xc0\x7a\x9a\xa1\xb8\xea\xb9\x25\x7b\xe5\x0f\x6a\xcf\x0c\xeb\x21\x2f\xd2\x23\x64\x59\xea\xeb\x58\x63\xc6\x41\x79\x33\xec\x71\xd3\x58\x3b\xf0\xd1\xf8\x03\x68\x57\x42\xb4\x3d\x12\x4a\x89\xc1\x95\xc6\x58\x5b\x62\xe4\x14\x26\x4f\xb3\x42\x57\x78\x76\x0a\xe5\xce\x60\xae\xb4\xa2\x7e\x02\x35\x2a\xa5\x7a\x23\x91\x0e\xfc\x95\x31\x1c\x2e\x35\x65\xef\xd7\x75\xf9\xf3\x87\x17\x96\x3d\x5c\x2c\xfb\x6a\xf6\x56\x0e\xba\x90\x92\x7d\xfb\x6c\x0a\x77\x77\xef\x7f\x8c\x69\x9c\x65\x2e\x8b\xcb\xb9\x4d\xf3\xb8\x98\x9b\x1c\x25\xa9\x3f\xe9\x8e\x1c\x6b\x5f\xd5\xfe\xc8\x82\xde\xb6\x29\x72\xbf\x07\x95\x67\x3e\x4b\x04\xf6\x61\xe7\x01\x4a\xc8\xf0\x53\xf4\x14\xd9\xc1\x8f\x1c\x50\xef\x79\x9c\x49\x5d\x02\xdb\x4e\xd6\xda\xc5\xc4\xca\x1a\x62\xe5\x34\x18\xc9\x8d\xad\xb0\xc6\xd5\xec\x14\xb6\x16\x73\x6d\x35\x3d\x81\x3b\x69\x2d\x7b\xab\xf2\x6c\xb1\x30\x8e\x87\x27\x1c\xee\x97\x45\xe8\x09\x7a\xf8\xf4\xf3\xab\xb9\x7b\x78\x39\x77\xaf\x96\xe7\xdb\xcd\xb7\x2e\xbc\x0a\x9a\x2c\xb5\x29\x8c\x3e\xcb\x52\x38\xce\xc7\x0c\xc5\x8d\x3f\xa9\x9a\x1c\xb4\x6f\xec\xc4\x1a\x79\x02\x56\xf9\x11\x58\x96\x2e\x97\x1e\xe6\x1c\x3a\x4f\x20\x6a\x79\xdd\x5a\xe7\x07\x0a\xc8\xf8\x06\xfa\xa6\x84\x74\x7b\x24\x84\x2c\xf3\x67\x70\x65\x35\xb6\x6a\x5c\x9e\xe9\xd6\x2a\x53\xe1\xb9\x96\x28\xaf\x6d\x6e\x94\x31\xdc\x0f\x60\x46\xad\xf9\x68\xc3\xd5\xb7\x89\xd5\x25\xe7\xf0\xe3\x45\x63\xf7\x9a\xf7\xf9\xe1\x56\x05\xfd\xb5\x90\xff\xcb\x74\xdc\xc6\x35\x79\x0e\x47\xcf\xb2\x01\x15\x8a\x62\xeb\xa9\x05\xc6\xbc\xaa\xf1\x7c\x62\x50\x53\xaf\xa1\xcd\x52\x6f\xa0\x28\xba\x5b\x2b\x97\x99\xd5\x4e\x21\x52\x9e\xb5\xa0\x45\xc1\x28\xb3\x07\x5a\x6b\xc0\xfe\xd4\x59\xbd\xb7\x54\x24\x9a\xf8\x56\x7b\xa3\xbd\x36\xd1\x26\x8e\x2e\x38\x7f\xba\xe8\xd5\x5e\x71\x5e\xab\x43\xaf\x38\x1f\x7f\x05\x28\x6b\xf2\x22\x46\xbe\x48\x33\x88\x02\xd4\xc6\x23\x07\x86\x79\xd2\xe6\xd2\x67\x1c\xac\xf2\x0c\x0e\x79\xea\x39\xd0\xf2\x10\x84\x7a\x2e\xc7\xb7\xb0\x52\x7f\x68\xac\xfa\x0a\x6b\x12\x55\x4f\x24\x29\x77\xe6\x82\x35\x82\x77\xd7\x1c\xc1\x87\x2b\x47\xcf\x4b\x31\xd4\xe5\xa2\x8e\xde\x5c\x0a\x9d\xa1\x75\xc8\x2a\x29\x24\xd7\x23\x42\x02\x17\xd6\x73\x2d\x50\xa1\x24\x31\x79\x56\xf7\x24\xcf\x24\x44\xc5\x4a\x76\xbf\x33\x25\x56\x4e\x59\xb1\xb7\xa4\x22\x5c\xcc\xd8\x9b\xaa\xc2\x98\xb6\x03\xc5\x98\x51\xb2\x91\x79\x2e\x20\xf5\xc2\x5a\x3f\xd9\xa0\x31\xbe\x8b\xf3\xb0\x6f\xa2\x02\x5f\xd1\xdf\x06\x76\xd3\xff\xfd\x5a\x07\x14\x16\xf1\xba\x99\x9d\xfd\xee\xc3\x3f\x5d\x6a\x4a\xfe\x10\x48\xa9\x43\xdf\xcf\xf3\x1b\xd1\x8f\x3f\x5f\x78\xc6\xd7\x0c\x66\x52\xb9\x2c\x4f\xec\xb9\xa8\x14\xb7\x22\xd1\x67\xed\x92\x63\x51\x14\x99\xcd\x39\x95\x05\x3d\xb7\x1c\x4c\x28\xb1\x1d\x3a\xa5\xad\x6d\x3a\x0e\x51\xe3\x6d\x8b\x0b\x55\x90\xd8\xd8\x12\x6b\xbc\x53\x08\x57\x56\x09\xe9\xac\x16\xf3\x69\x3e\x4d\xe8\xe0\xec\x29\xae\xbd\x5e\xdc\x3c\x9d\xab\x5a\x19\xe9\x0d\xe8\x4e\x6a\xbb\x87\x86\x32\xc2\x08\xad\x24\x25\x6c\xb1\x4d\x5c\x6c\xfb\x37\xd1\x5f\x44\x7f\x13\x72\x82\x78\xcd\xe7\xff\x69\xa6\x5d\xae\xdf\x6b\x30\x96\x18\x8b\x12\x7a\x16\x94\x0b\xc7\x13\x7a\x6e\x4d\xd2\x14\xa8\x48\x4d\xc6\xa8\x28\xc8\xf9\x28\x40\x84\xde\xbd\x7d\x2d\xa5\x76\xb6\xe5\x87\xc6\xb7\x71\xa3\x0b\xac\xb0\x47\xa4\x94\x25\xdd\x29\xa4\xac\xe5\xaa\x71\x17\xc3\x8a\xd1\x9a\xc5\x30\xb3\x78\x0b\x26\x18\x26\xbc\x05\xd9\x48\x6d\x7a\xa8\x4b\x4d\x31\xe7\x8c\x2f\x61\xc4\x2e\x6e\xc3\x1e\xe3\x6f\x99\xb3\x37\x7f\x92\x61\xad\xcb\xb3\xa4\x38\xbb\x8a\x09\x4d\x93\xf2\x3c\xe8\xc4\xa0\xc5\xb2\x9c\x11\x51\xe0\x39\xe5\xc0\xed\xe2\x83\x76\xb5\x94\xca\x5a\xc7\x0f\xd6\x77\xb1\x32\x45\xa5\x4a\xcf\x69\xa9\x82\x65\xcb\x6d\x87\xcb\xa6\xd6\x62\x9e\xe6\x09\xa2\xe2\xb0\xd8\xd6\x5c\x26\x2d\xd3\x57\xdb\x5a\xb1\x4c\x9a\x2b\x15\xc5\x8c\x2d\x53\x47\x83\xb6\xee\xea\xb3\x2d\xd1\xe3\x43\x54\xad\x5e\x00\xdc\x5d\x9b\x2c\x43\xb2\xe4\xe1\xee\x21\x0e\x75\x4e\x3f\xbf\x8b\x1f\xff\x3e\xbe\xff\xe7\x9f\xbf\x63\xde\xe3\x73\xf3\x36\x38\xc5\x4c\x38\xe2\x32\x14\xef\xcf\x87\xb8\x99\x59\x93\xc8\x2c\xcf\xf2\xcc\x20\xcb\x78\x3a\x17\x05\x14\x66\x71\x45\x3b\xcd\xa4\x34\xcc\xc8\x5a\x1c\xe2\x4a\x97\x58\x62\x2f\x16\xf3\xc8\x96\xa6\x8a\xc9\xe6\xb8\x18\xc9\x35\xf7\xed\x71\x9a\x8e\x85\xaf\x21\x02\xdd\x4e\x5e\x02\xf5\xed\x12\xfd\x2b\xc9\xfd\x1e\x74\xa7\xa5\x19\xc3\xf4\x55\x82\x85\x1e\xd3\xe5\x19\xe2\x2e\xbe\xdb\x4f\x2b\x7b\xff\x77\x9e\x91\xcf\x9e\x20\x5f\x1c\xb7\xcd\x8b\x2b\xee\xf2\x84\x4c\x22\x18\x32\x97\xc1\x69\x9e\xd2\x1c\xa6\xf9\x98\xa3\xb8\x7b\x8a\x64\x43\x46\xe3\x8d\x9b\x78\xab\xa6\xe5\xf9\x71\x04\x8a\x3c\x49\xb2\xea\x10\x54\x90\xa2\x23\x1e\x46\xd7\x9d\x04\x44\xad\x77\x30\x70\x51\x42\xb9\x3d\x5a\xbb\x3e\x3b\x8c\x23\x56\x4f\xa3\x51\xdc\x18\x65\xd4\x6c\x25\x76\xb6\x14\x5a\x6b\xe6\x8f\x60\x8e\x5a\xab\xfd\xf5\xb9\xb8\x4b\xf8\x13\x0d\xbd\xbe\x57\x5d\x2c\x1c\xe6\xed\x39\x5d\xc8\xa5\xd6\xf9\x99\x1b\x1d\xaa\xe6\x6e\x73\x15\x44\x9b\x3e\x7c\x7c\x4c\x9e\x35\x67\x05\x31\xba\x7e\xb0\xa3\x1d\x06\x88\x66\x9e\xa3\xb8\xa6\xac\xa8\x10\x2d\xf2\xce\xb6\x75\x59\xf1\x9a\x8e\x80\x06\xe0\xe3\xc8\xdb\x16\x70\xe7\xd3\xf0\xb6\x6d\x87\x61\x18\x74\x67\x08\x3e\x1b\x4a\x33\x9d\x11\xb3\x56\x74\x24\x19\xae\x54\x7b\x30\x5d\xd7\xcd\x69\x5d\xd7\x9e\xd4\x75\xd0\x63\x0c\x31\xde\xe2\x97\x7d\xd1\x62\xf9\x3f\xbe\xb6\xe1\xfb\x26\xbc\xf9\xbe\x09\xea\xe8\x0e\xee\x78\x84\x62\x46\x65\xdc\x33\x16\x24\x42\xf3\xde\xf5\x8e\x72\x31\xa8\x23\x14\x47\xd0\x87\x83\xec\x7b\xe0\xfd\x3c\x86\xb7\xd5\x02\xd3\x1a\x73\xb6\x8c\x65\x26\xc5\xda\xef\x01\xfb\x36\x3e\x4a\xa6\x46\xa8\x4c\xdb\xb6\x73\x16\x2c\x70\xce\x45\x10\x09\x90\x31\x0f\xf7\x85\xb5\x27\x6e\x65\x9e\x83\xc1\x56\xd4\x12\x42\x4f\x3b\x55\x3a\x77\x66\x71\xc3\xa9\x85\x72\xbd\xff\x47\x20\xee\xc4\x4e\xbd\x9a\xb7\x57\xda\x60\xaf\xe6\xed\x1a\x2d\xdd\x8c\x5e\x35\xc7\x5f\x05\x4e\xb1\x85\xa2\x06\xe4\x42\xb5\x2d\x3b\xd3\x34\x4b\x34\x63\x41\x89\xb8\xf0\x07\xeb\x47\xcb\x84\xd8\xf3\x11\xa4\x1f\xa1\x07\xe4\x0f\x75\xf8\xa7\x1d\xa0\xb9\xb8\x7e\xda\x65\x9c\x0b\xa1\xa5\x2a\xcb\xb9\x23\x34\x53\x19\xce\xf7\xfb\x01\x26\x27\xc4\xb0\x84\x4f\x52\xce\x47\xc6\xd6\xe4\xc4\x62\x4f\x71\x99\xc3\x3f\xc9\x9e\xfb\x35\x31\xbb\x0b\x4d\x5d\xdf\xb5\x67\x1f\xc4\x49\x57\xb1\x74\x71\x66\x69\x96\x30\xce\x4b\x82\x78\x55\x3c\x45\xee\x29\xaa\x89\xd4\xa7\xea\x00\x22\x68\x87\x21\x7f\x50\xab\x4e\x1b\x44\xb3\xb8\x7e\xda\x76\x7d\xdf\xf7\xb6\xb5\x18\xbf\x9e\x55\xd7\x58\x05\x04\xb4\x7d\x39\xad\x17\x2e\x76\xb3\xc3\x11\xba\x74\x3d\x46\x10\x8a\x74\x7f\x5e\xfb\xd1\x7e\xff\x5f\xe0\xee\xf1\xef\xd7\x6d\x87\xb5\x52\xf6\xfe\x39\x55\xd6\x6a\xde\xad\x34\x3a\x4a\x54\x61\xd0\x34\x4d\x98\x9d\xca\xbe\xdf\x8b\x92\x08\x83\x4c\x96\x53\xe2\xeb\xa4\xa2\x34\xd0\xc7\xe7\xbe\xb4\x36\xdc\x24\x06\x5f\xee\xb0\x46\xa6\x50\xb5\x76\xa9\xad\x88\x62\xa2\x87\x1c\x49\x5e\xe5\xe0\x66\x76\x3e\xb1\xa0\x43\xac\x7d\x9d\xf4\x4f\x91\xf2\x2e\xe8\x2f\x85\x3e\xe8\x05\xf3\xdf\x7f\xd1\x9b\xbb\x12\xe1\x86\xdb\xf4\x87\x87\x57\xa0\x3f\xfc\x0a\xea\x44\x25\x53\x69\xf3\x2c\xb4\x3b\x1f\xa8\x00\x54\x4e\xc7\x83\x2a\xa9\x6c\x90\x49\x11\xa7\xa9\xe7\x49\xcb\x19\xe6\x48\xe1\x62\x1e\x5d\xd0\xdc\x0d\xba\xbb\xd8\x20\x55\x94\x95\x7b\x05\x1e\x2f\xe0\xf9\x2b\xf0\xd2\xd7\x32\x8a\x36\xf1\x15\xfb\xc3\xad\xf7\xe8\xc6\x65\x7b\xc5\xfe\x80\x7e\xfc\x6d\x03\x1e\x37\x9b\x1e\x55\xb6\xc8\xbd\x58\xe2\x2d\x69\x80\x97\x7e\xf0\x07\x7f\xb4\x44\xca\xa9\xd4\x59\xb1\x84\xf8\x1b\x26\x04\x55\xc8\x91\x6a\xc6\xce\xc5\xfb\x19\x2f\xc7\x0e\x1b\x4a\x6e\xe8\xa9\xe2\x2b\x7a\x81\x73\xa8\xaf\xe8\x33\xa2\x9e\xa3\x5f\xf7\xaf\xbe\xbd\x5e\x9e\xc3\xff\x8d\xeb\x25\xa9\x36\x98\x98\xd2\x37\x80\xfd\x9e\x69\x28\xcb\xa7\xc8\x9f\x26\x8d\x99\xdc\x17\x26\x43\x92\x7b\x9a\x1c\x39\x27\x1c\x69\x52\xcc\xb5\x73\x31\x9f\xeb\xe5\x58\x47\x5e\xbc\x1a\x78\x51\x7d\x77\xe0\x57\xce\xb5\xd7\xb8\x77\xaf\x70\xff\xc6\x61\x4f\xa2\x8d\x42\xa5\x29\x7d\xa0\x4b\xe6\x06\x70\xe9\x27\x3f\x3d\x45\x86\x70\x31\x14\x26\x2b\xa4\xf4\xd5\x26\x13\x9c\x48\x64\x49\x39\x2b\xe7\x6e\xb1\x48\x18\xf5\x3f\x82\x5c\xf9\x66\x45\xee\x54\x14\x45\x77\xd0\x3c\x91\x5d\x96\xb4\x17\x9e\x52\x74\xd3\x8d\xba\x7f\xb8\xdf\x7e\x7c\xf8\x9b\xf8\xe1\xe3\xf6\xc5\x3d\xe7\x42\x04\xf9\xd3\xb7\x4e\x6e\xdf\xdd\xbd\xff\xe9\xdd\xdd\xfb\xed\xfe\xac\xe3\x69\x19\xce\x73\x03\x13\xc6\x15\xcd\x19\x2a\x5c\xc3\x8f\x9d\xb7\x31\x79\x7e\x8a\x1d\x3a\x6f\x7d\x6a\xb1\x8d\x8d\xc5\x36\x69\x3d\x86\x7d\x43\x88\x24\xe4\xe8\x0b\x42\x32\x95\x2e\xeb\x26\xf4\xe4\xbe\xfa\x6f\x44\x28\x66\x84\x86\x3d\x8a\xbb\x84\x5d\xb4\x78\xbe\xd8\xb1\x7a\x97\x2f\xb9\x56\x5f\x63\xbe\xff\x96\x21\x2f\x1b\xcc\x93\x31\x61\xe7\xa6\xbe\x52\xaf\x1e\xa1\xa7\xa4\xa4\x05\x43\xa5\x76\xb4\xaf\xfd\x10\xe7\xd0\x13\x5a\x52\xc4\x50\x71\x39\xe5\xab\x90\x6c\x8f\x6b\x5e\x99\x8a\xef\xd8\x2c\xc0\x18\xaf\xb4\xb7\xe7\x96\xf1\xac\xce\xaa\xc6\x10\xc3\x5b\x28\xbf\x3a\x51\x49\x4d\xb5\x60\xe1\x75\xb1\xab\xfe\x7f\xcd\xae\x53\x52\x9d\x7b\x17\xf4\x51\x23\x1f\xf5\xd0\x10\x5a\x50\x44\x51\x61\x38\xed\xb4\x9f\xe2\x68\x39\x55\x92\xe5\x94\xd6\x74\x6f\xfd\xe4\x19\x2d\x4d\x41\x62\xb5\xbc\xd1\x6f\xd9\x55\xdb\xd2\x8a\x06\xd0\xed\x84\xb3\xd8\x8a\xc5\x2e\x21\xa9\x14\x34\xbc\x46\xd1\x5d\x4c\x22\x7e\xc7\x7e\xdd\x2e\x78\x6d\xc2\x8f\xdf\x5a\x78\xcb\xc9\x17\x84\x00\xa7\x64\x3c\x17\xf6\xba\xbf\xe4\xa7\x98\x10\x42\x15\x32\x55\x31\xf4\x14\xca\xce\x93\xd8\xc6\x94\x12\xa2\x0a\x5b\xa1\x7e\xa0\x50\xb5\x9e\xf8\x88\x56\xa6\xa4\x49\x4e\x4b\x5d\xb2\x1d\xbb\x29\x20\x76\xb3\x60\x2c\xb7\x79\x65\x75\x69\x88\x1c\xec\xed\xbf\x55\x65\xa8\x18\x10\x65\x94\x51\x1a\x5e\x57\xde\x83\x0d\xdf\x91\x8b\x5d\x7f\x17\x18\xe8\xfe\xff\x6b\x77\xfc\x57\xf3\xf5\x1b\x68\x0e\x82\x51\xef\xfb\x84\x9c\x3b\x77\x5d\x82\x03\xf4\x84\x54\x1c\xd9\xc2\x38\xbc\xaf\x7d\x1f\xa7\xaf\xcf\x78\x2a\x18\xef\x62\xbe\xbc\xee\xc8\x65\x9a\x8c\xd7\xe7\x8e\xb1\xd4\xa5\x65\xcd\xa9\xa5\x12\x84\x79\x7d\x82\x60\x22\xad\x58\x5e\xa2\xbb\xb0\xef\xf7\x47\xd6\xde\x57\x73\xf4\xdb\xd6\x1e\x4f\xba\x33\xa9\x63\x35\x9b\xe5\x00\x19\x47\xcb\x7c\x20\x5d\x15\x75\x47\xa6\xd6\xbb\xb9\xf9\xea\x54\xdc\x2f\x57\x13\xf3\x45\x78\xfb\xd6\xe2\x1b\x0d\xb5\xb4\x85\xec\xab\x13\x85\xd0\x54\x49\x1a\x5e\xa3\xbb\x78\xf1\xf9\xff\xf4\xb5\xf7\x0d\xbb\x7e\x7c\x6d\x57\x96\x4c\xe7\xec\xf6\x18\xf4\x63\x5c\x85\x75\x66\xaa\x62\xdf\x30\x40\xb5\xe7\xb1\x8b\x31\xa5\x44\x16\xa6\x2c\xda\x8e\x02\x72\x9e\xcf\x07\x81\x4d\x25\x92\x5c\x56\xa6\x12\x3b\x36\x73\xb0\xda\xeb\x67\x96\x1d\x3a\x6a\x75\x07\xd1\x97\x13\x2d\x0b\x27\xc2\xed\x42\xd2\xf0\x1a\x6a\xcd\x75\x88\x43\xf1\x85\x8d\xb4\xbc\x76\x2a\x05\x09\xc9\x40\x66\xff\x4c\xca\xe6\x5a\x77\xf3\xc5\xec\x17\xa9\x10\x92\x0c\x5e\xc4\x91\x37\x69\x8a\x2c\xc9\x0d\x32\x83\xa2\x8e\x7a\xc6\x41\x61\x3f\xc0\xe8\xc5\xed\x32\x4b\xc5\x72\xa7\x4b\xb8\x66\x42\x8a\x1d\x9e\x89\xb7\xc6\xbb\x22\x4d\x89\xa9\xf6\x82\x08\xd0\x9e\xd7\x41\xb9\x13\x24\xd4\xd6\x33\xeb\x3b\x2e\xa9\xe4\x14\x3b\xba\xee\x31\x6e\x63\xf4\xc4\xee\xd4\xbf\x0a\xf6\xb8\xd9\x60\x5f\xc6\xc4\xd3\x2c\x2d\x1c\x5d\xb0\x1f\x0c\xdd\x63\x2f\x05\x88\xca\xbb\x18\xf9\xd2\x24\xc5\x79\x5c\x8e\x4c\x11\x83\x55\x72\x50\x42\x4b\xf3\x6d\xec\xa2\xd6\xfa\xd7\xb1\xd3\x10\x47\xfe\xab\x8c\x3b\x4a\x26\xcf\xe2\xcc\xeb\x34\x45\x86\x64\x06\xa9\x41\xd1\x86\x78\xcc\xc1\x10\xdf\xc1\xc9\x53\x7b\x2d\xcb\xcc\xd6\x95\xa3\x35\x97\x52\xfd\xb9\xe3\xde\xff\xeb\xad\x19\x95\xb4\x5e\xc3\xe8\xeb\x2c\xcd\xf5\x82\x5d\x87\x2a\x45\x2f\x38\x70\xec\x0f\xb0\xf7\xd2\xc5\x3a\x90\xae\xea\x8c\x55\xa6\x64\x49\xa1\x29\x97\x7c\xc5\x6e\x7d\xfd\x0c\xbb\x5a\xc6\xdd\x40\x69\xbf\x8b\x3d\xdd\x44\x81\x2b\x5e\x45\xdb\xe8\xdf\x87\x8a\xc5\xc7\x0b\x7b\xe9\x85\x69\x26\xb9\x69\x0c\xfe\x1d\x3c\xab\x4b\xb8\x0f\x61\x55\xa8\x0c\xb8\x1e\x9b\x49\x60\x5b\xf1\x0a\x3a\x52\xb9\x0a\x1f\xce\xfd\xa8\x54\x23\x5a\x18\x6a\xa1\x79\x0d\x94\x9c\x39\x35\x94\x0e\xe1\x67\xa7\xac\xa3\xce\xf8\xbe\x1b\xca\xbd\x33\x45\x68\x5d\xb0\xae\x25\x4d\xed\xc5\xbc\x37\x26\xc6\xf3\x3e\xe4\xba\xc3\x71\xad\x11\xa5\xc9\x14\x78\xc5\x56\xac\x6b\xbe\xfa\x1f\xbf\xb0\xe2\x04\xa0\x1f\x1f\x3e\xbd\xa8\xa1\x08\x02\xe2\xcb\x8d\xe6\xf1\xfe\x7f\x8b\xef\x1f\xdf\xfc\xd3\xcf\xf7\x8f\x40\x39\xd6\x15\x8f\xf3\x1a\xe3\xf6\xbc\x87\x89\xfa\x5e\x99\x3d\xdf\x83\xb4\x8a\x2f\xce\x3a\xce\x3d\xf2\x8e\xca\x78\x98\x4f\x84\x28\x4a\x7b\x54\x90\x9d\xd6\x8e\x58\x43\x8a\xbd\xb5\xb6\xf5\x35\xdb\x4b\x61\x34\x15\x52\xd2\x73\x97\x29\x87\x5d\x16\xf7\x6a\xee\xd3\x3c\x8b\x53\x9f\x67\x30\x86\xde\x80\xfe\xc2\x6d\xfb\x32\xbf\x10\x28\x5d\x9e\xb7\x61\x05\xe9\xb6\x2f\x39\xe1\x20\x22\x7e\x7f\xd5\xa3\x7b\xfc\xf9\xd2\x55\xf8\xe1\x19\x7f\xcd\x26\x4d\xc4\xbc\xc7\x71\xc3\x15\x55\x48\xb3\x02\xa5\xbe\x81\xcc\x4f\x32\xcb\x04\x2e\x54\x9a\x1d\xfc\x54\x42\xe4\x4f\x90\xea\x0a\x33\x53\x69\x2b\xc4\x24\x8c\x98\x3b\xad\x21\x33\x66\x87\x7d\xa6\xce\xd6\x1f\x32\x97\xf5\x71\x63\xbd\x69\xb2\x02\x55\x52\x61\x94\x57\x85\x45\x1d\x28\x8b\x2b\xad\x95\x39\x2e\x7f\xce\xd1\x2a\x32\x9a\xc2\x29\xd4\x1d\xcb\xe8\xdf\x7c\xb5\x6e\x6e\x9a\xba\x97\x8e\x9c\xcd\xbb\xbb\x3f\xfc\xe7\xb5\x92\xe5\xf9\xba\x81\xcb\x11\xcb\x78\xd0\xac\x13\x12\xe8\xe7\x02\x52\xc3\x2c\xd5\x49\x0a\x51\xe3\x9c\x3f\x79\x6c\x7a\x3f\x09\xc8\x37\xa9\xf9\x85\x59\xb7\x72\xef\x04\xa6\xde\xe3\xbe\xaf\xf6\xd6\xc4\xa9\x36\xcc\x6a\x5f\x74\x23\x1b\xf6\x8c\x9f\x8c\x6c\x7c\xff\xad\x15\x94\x26\xe4\x49\x86\x3e\xb8\x3f\x7b\xad\x5f\x31\x6f\x4c\x78\x86\xca\x18\x31\xdc\x51\x7a\x38\xd3\x83\x91\x4e\xb8\x38\xab\x85\xe1\x35\x58\xf2\xb9\xe3\x56\x4a\x88\xd6\x63\xa7\xb4\xa5\x56\xfb\xfd\xbe\xaf\x3a\x67\x2b\x36\x6a\xe9\x9a\xba\xa5\x6d\xed\xe5\xdc\x3b\x17\xca\x92\x5b\x4f\xd7\x63\xc1\x1a\xfd\x56\xac\xcf\xbb\x1b\xbe\x89\x95\x71\x62\x2b\xae\x63\xca\x48\x47\xd9\x74\xce\x20\xd2\xaa\xe1\x4d\x8c\x5a\xb1\xb8\xcc\x8e\x7d\x96\xd2\x2d\xcb\x41\x29\x48\xb5\xfe\x53\xc1\xde\x25\x3a\x68\xb6\x17\xc1\x1f\xf8\xe1\x56\x29\x11\x56\xf8\xcf\xcb\x8d\xee\x39\x53\xde\x37\x6f\x1d\xd1\x4d\xf7\xfc\x54\x51\x6e\xa9\xce\x0b\x4e\x19\x01\x85\x3f\x4f\x3c\xac\xd8\xe5\x67\x57\x9c\x07\x1d\x97\xbe\xe6\x94\xb5\xc7\x82\x51\xc2\x05\xf3\x66\xd6\xd6\x86\x5b\xe2\xc5\x13\x8f\xd7\xfc\xd6\x93\xbc\x6b\x36\x5d\x94\x7c\x0b\xd1\xf3\x82\xcd\x87\x6f\x2e\xca\x63\x32\x9c\x4b\x17\xd7\x4f\x51\x9a\x1b\xc1\xb9\x20\x86\x76\x95\x3f\x26\xad\xfa\x85\x19\x37\x0c\xc0\xd6\x63\xd3\xcd\x56\x81\x2e\x0b\x82\x35\x27\x82\x48\xee\x66\xeb\x91\xd6\x70\xf0\xe8\xc6\x95\xc2\x2f\xbd\x36\x7a\x87\x12\xfd\x2d\x4c\x1f\x2f\x19\xec\x20\x7f\xf3\xf1\x19\xa6\xf5\x42\x0f\x64\x55\xc5\x26\xff\x7c\xb4\xf1\xc9\xf7\x46\x33\x69\x98\xe5\xd2\xfa\x21\x19\xed\x2f\xc4\xd8\x2f\x88\x12\xed\x23\x7d\xca\x2a\xc2\x69\x45\x2a\x81\x58\xea\xcb\xd0\x46\x8e\xfc\xa1\xae\xd7\x9c\xe7\x5d\x92\x86\xfb\x7e\xf9\xbd\x39\xdb\x3e\x6b\xbd\xfe\xf4\xad\x11\x4a\xda\x25\xac\x0b\xf9\x16\x48\x55\x8e\x04\x65\x84\x95\x58\xd6\x31\xa6\x9f\x85\x70\xc6\x40\x66\xed\x72\xec\xca\x40\xcc\x8e\x8a\xaa\xc2\x54\x32\x4c\x31\x75\x73\x33\x5b\xe7\x62\x39\xdb\x30\x4c\xe1\x58\x73\x18\xcd\x65\x8f\xef\x1f\x6f\x2c\x5f\xd7\x1a\x93\x0f\x3f\xde\x84\xd0\xdf\x06\xc6\xcf\xbf\x85\x6b\xf7\x05\xfa\xc3\x17\x3a\xb6\x2f\xe4\x51\xef\xae\xf1\x42\x06\xc4\x4d\x13\x83\xa8\x13\xaa\x01\x3a\x4f\xbc\x07\x09\x15\xf3\xb5\xe7\x29\x3b\x1d\x57\xfd\xe5\xce\x37\x56\x0a\xda\x9f\x3c\x85\xda\x77\x9b\xd4\xcd\xa2\xae\x63\x37\x8b\xd0\xe8\x33\x19\x63\x6c\xd3\x32\xad\x0d\x96\x39\xe1\x52\x10\x94\x17\x22\xaf\x19\xa6\xb2\x2a\x34\xb1\xc6\x9e\xeb\x19\x13\x12\xef\x4f\xb7\x9c\x4c\xe0\x64\x77\x3b\x19\xfd\x53\xd0\x62\xf9\xef\xbf\x66\x4f\xd8\xd9\xf8\x35\x83\x6e\x01\x90\x84\xd4\x9e\x4e\x0c\xa2\x56\xea\x1a\x2a\x9f\x15\x13\x10\xc8\xa8\x1f\xbc\xa1\xe3\x50\x16\x99\xcb\x95\xdf\xfb\xc1\x30\x4a\xbb\xc1\xd7\x40\xfc\x29\x19\xdc\xac\xdd\xcd\x7b\xd8\x1e\x8d\x31\xa6\xed\xb8\x36\xa6\xd0\x28\x4c\x4d\x91\x67\x99\x44\x8b\x45\xa6\x44\x1a\x6b\x63\xce\xcd\x6a\x51\xc8\xf0\xa9\x68\x9b\xd8\x4b\x2f\xf1\x7f\x8c\xca\x4b\x9e\xf5\xda\x13\x7f\x93\x52\x5f\x3e\x6d\xb6\xbf\x7f\xb8\xb8\x3d\x28\x34\xa3\xaf\xa6\x3c\x6e\x3f\xfd\xfc\xf8\xf6\x2b\x7b\xa6\xc9\x8d\x9c\x4a\x69\x01\x79\xdc\x9f\x0e\x34\x48\x89\x42\x54\xe3\xcc\xe6\xf2\xe4\x0f\xca\x51\x53\xfb\x09\xaa\x09\x2c\xa7\x1d\xec\xad\x8f\xdc\x2d\xf6\x5e\xe6\x46\x30\xca\x94\xd6\x86\x60\xae\x38\x29\x0a\x96\x37\x18\x53\x4b\x74\x25\xb4\xb5\x84\xd8\x19\xcf\x05\xa5\xf1\xe8\x4f\xda\x2b\x13\xea\x84\xd8\x13\x0f\xcf\xe5\xe5\x1a\xf8\x9b\xe8\xf1\xb6\x53\x78\xb9\x06\xde\x7d\xf8\xb4\x4e\xd5\x73\x05\xd8\xc7\xf5\xfe\x7b\xf7\xba\xdb\x04\x9e\x7b\x71\x5f\xc2\x98\x6a\x4a\xf5\x78\xcc\x9c\x60\x5c\x12\xcb\x7b\x74\x00\xcc\x2a\x5b\xd2\xd1\x61\x6d\xaa\xcc\x65\xb8\x98\x8e\x32\x9e\x0c\x33\xd4\x9c\xf7\x06\x69\xa3\x77\xf8\x73\x67\x93\x62\x20\xac\xd6\x05\x12\x4a\x6a\x6a\xa8\x52\xed\x2c\x95\xc1\x56\x65\xbe\x46\xa8\x74\x45\x5f\x15\x98\x81\x6d\x7b\xda\xb7\x25\x9a\x7a\xd2\x47\xdb\xc0\xd3\xdc\x84\x7d\xb4\xb5\x53\xf6\xe3\xa5\xca\x74\xcd\x74\xbf\xd8\xf7\x7b\xb3\x9c\x79\x21\x71\x71\x71\x4f\x1f\xc3\x1d\x20\x6f\xa0\x09\x64\x44\x7b\x30\x46\x70\x29\xe6\x81\x63\x87\xb9\x8d\x8d\x16\xb4\x48\x5d\x56\xa2\xae\xa5\xa2\xf2\x8d\x84\xaa\x94\x61\xef\x73\xa7\xbc\xf0\x12\x52\x7f\x84\x1a\x04\x75\x4c\x88\x05\xb4\x91\x73\x3b\x1f\x7c\x43\xf0\xbe\x98\x70\xb9\x78\xe2\x9e\x37\xd6\x40\x69\x20\x0b\x3e\x74\x73\x59\x57\x2b\xee\x7f\x0a\x3e\xf4\xaf\xe2\xfe\xfd\xf7\x80\x6f\x7a\x07\x93\x3b\xd7\x2e\x4e\xa1\x36\x42\x48\x39\x5b\x8e\x5d\xc5\x45\x12\x35\xb8\x92\x65\x6a\xb3\xb2\x18\x3a\xa6\xb1\x37\x02\x68\xd5\xb8\x90\xed\x56\x5e\x7a\x11\x90\x37\x0b\x72\xbe\xfc\xa6\xc5\x46\xcd\xed\x3c\xf8\x16\x21\xdc\x15\xa7\xaa\x24\x6c\x09\x67\x16\xe8\x85\x0d\xd0\x83\x46\xf2\xbf\x1a\xf6\x7a\xf1\x21\xce\xc2\xc5\x05\x74\x46\x48\xa9\x66\xc5\x2b\x57\x31\x96\xa0\xb6\x64\xaa\xcc\x6c\x56\x15\x63\xcf\x2c\x09\xa1\x18\x6e\x83\xe4\xc5\x6b\xec\x8c\x0b\x29\x2f\xa3\x3e\xf8\xb6\x40\xa4\xbb\x0c\xfb\x2b\xec\x31\x84\x71\xdf\xe6\x11\x09\xfa\x7d\x0f\x6f\x77\xdb\x87\x1f\x93\x9f\x2f\x0d\x3f\xcf\xb8\xc5\xd7\x4d\xb0\x97\x82\xfd\x5f\xa2\x99\x8f\x17\xf5\x94\x6b\x09\x3b\x7c\x7c\x7c\x1b\xa3\x98\xe9\xa7\x28\xc9\x7d\xcf\x6c\x5e\x71\x62\x84\x12\x5c\x18\xa1\xa4\xa1\x82\x4f\x50\x7b\x4e\xc9\x72\x89\x67\xf2\x29\xea\xc5\xb1\xf2\x15\x05\x89\xbd\x02\x37\x10\xc2\x6a\x41\xb9\x62\x4c\x60\x4f\xe2\xfd\x61\x73\xd0\x07\x37\x42\x59\x30\x5a\x05\x51\xf9\x4a\x13\x45\x70\x69\x8b\x8a\xf5\xe6\x80\x10\xb6\x65\xcf\x31\x83\xcc\x5b\x66\x2b\x88\x4c\x4f\x0b\xa4\x30\xa6\x84\x11\x4a\xd9\x5c\xf5\xfd\x62\xef\xe9\x89\xdd\xb5\x3b\x19\xfd\xcf\xe8\xff\xba\xe4\x99\x1f\xe2\x9b\xbd\xcf\xc9\xd4\x1f\xd7\xf0\xed\x1b\x33\x15\x9a\xca\x5f\x9a\x7b\xff\x78\x1f\xdb\xb8\xc2\x0e\x0e\x4d\x69\x73\xa4\xa9\x92\x0e\x15\x8a\x2a\x61\x64\x23\x8d\x0c\x52\x02\xdc\x56\x59\x9d\x57\xe5\xa9\xa1\x2d\xf2\x84\x81\xca\xbd\x01\x2d\xb4\x63\x8d\xa2\x4c\x13\x22\x2a\x2f\x63\xd3\xee\xb0\xab\x8f\x90\x41\x5e\x48\x29\x24\x6d\x04\xae\x98\xa0\x96\x69\xae\xa9\xf6\xad\xf3\x0d\x21\xfb\xf2\x44\x4a\x22\xc0\x78\x77\x30\x2d\x64\x0e\xa8\xe6\xcb\xe0\x0a\x46\xb9\xb1\x67\x0b\xd4\xb7\xeb\x33\x88\x05\x7d\x01\x1d\xbd\x89\x7e\x8c\xfe\xcf\xe8\x7f\xad\xbb\x84\xcf\x7b\xba\x16\x2b\x7e\x7a\x78\xfb\x43\xfc\xdc\xa8\x37\x2b\x8b\xcd\xe3\xfd\x0f\xaf\x22\xd8\x75\xf7\xef\x42\x84\xb1\xab\x15\xe7\x55\xca\x0b\x41\x18\x11\xd4\x1b\x69\x33\x54\xcd\x1c\xdc\xd4\x51\x41\x2a\x22\xcb\xaa\x42\x4f\x91\x8a\xa5\x98\x26\x54\xe2\x32\x35\x39\xb3\x96\xd6\xd5\x49\xf4\xd5\xf1\x44\x8f\x76\x47\xb0\xc3\x32\x65\x98\x09\x4c\xb1\x39\xc4\xb8\x90\xbc\xe4\x86\x78\x69\x15\xe5\x84\xd2\x92\x08\xe1\x23\xeb\x4f\xd6\x3b\x94\xd3\xae\x9a\x04\x59\x16\x73\x73\x94\x7b\xc8\xec\x4a\xfb\x12\xee\xe9\x55\xb4\x6a\x29\x5c\xf7\x00\x97\x75\x4d\xbf\xde\x09\xbc\xb4\xb5\xbf\xae\x5d\x5d\x69\x7d\xee\x9f\xa9\xd9\x6d\x6f\x49\xc7\xdb\xae\x60\x38\x17\xaf\x5b\x9c\xeb\x2e\x67\xf4\x14\x81\x9c\x1b\xe8\xeb\x3a\x6c\x46\xe9\x0a\xcd\x99\x73\x0e\xfa\x79\x0f\xe2\x29\x82\x28\x6c\x0d\x5e\xe8\x87\xa6\x4b\x65\x68\x31\x67\xd7\x4f\x7e\xdc\x65\x42\x08\xa1\xb8\xe2\x9a\x7a\xaa\x04\x0b\x3a\xcd\xe4\x74\x52\xd0\x52\xcd\x15\xe7\xdc\xf7\x7c\x3e\xad\xef\x9c\x47\xd1\x5d\x44\x9f\xe8\xa6\xfa\xda\xd6\x37\x2f\xc5\x3a\x1e\xbf\x63\xeb\x4a\x5d\x13\x6c\xfd\xf0\x31\x90\xd8\x6c\x3f\x3e\xfe\x0d\xbc\xda\xc6\x5e\x3c\x4f\x75\xb0\x9d\x3d\x1e\xbb\x0e\x52\x4f\x80\x08\xc1\x18\x66\x48\x55\x85\x8f\x2c\x63\x40\xbc\x9a\xda\xf6\x10\x17\x5d\xd7\xb5\x5d\x07\xa4\xf3\x51\x78\xeb\x76\x91\x52\x4a\x69\xa9\xa4\x56\xf3\xc1\xd8\x55\x7c\x5a\xf8\x01\x4a\x13\xa3\xf0\x85\x94\xf2\x28\x17\xbf\xc4\x79\x1e\xb6\x3d\xa3\xbb\xa0\x3f\x52\xef\xf4\x57\x73\xf8\x27\xdb\xf5\xf0\xeb\x76\x25\xf2\x68\x27\x77\x3c\xf6\x7d\x30\x4c\x4a\xc9\x58\xd8\x16\x42\x73\xeb\x94\x02\xe5\x0b\x88\xda\xf6\x18\x8b\x69\x9a\xdc\xe1\x00\xf2\x30\xb7\xe1\xed\xb0\xb8\x1c\xd6\x2a\xa5\x95\x91\x3e\xb2\x96\x86\xcd\x21\xe1\x7b\xa8\x6c\x1c\x49\xa3\xf4\x62\xf9\x49\xcd\x56\x6b\xed\xf5\x12\x35\xdf\xc5\xfb\x27\x1c\xea\xe4\x7f\x6d\x6d\xfe\x09\x76\x3d\x6c\x57\xad\xe9\xaf\xd6\x66\x82\x20\xb2\x90\x07\xa2\xd4\xc3\x01\xf0\x7c\x82\x46\x29\x21\x30\xcd\x45\x45\x66\x62\xeb\x1a\xea\xf9\x04\x45\xd7\x3d\x45\x71\xb3\x12\x4d\xee\x43\x35\x59\x0d\xf9\x4c\xae\x9f\xfc\x71\xa3\x18\x63\x81\x1f\x5d\x55\x5e\x29\x45\x69\xa6\x53\x4c\x97\xdf\x50\x60\xaa\xe5\x0b\x42\x48\x4b\x3c\xa6\x94\xfa\x89\x52\x7a\xe1\x2e\xbe\x73\x9b\xc3\x57\xeb\xf2\xcf\xbe\x06\x2f\x76\xc2\xab\x9d\xf9\x23\x34\x0e\xea\xa0\xb2\x00\xca\x9b\x38\x3f\x1f\x62\xd3\x75\x5a\x71\x8d\x6a\xc6\x3f\xbb\x7a\x18\x62\x73\xee\xe3\x34\xb0\x3e\xb2\xe4\x10\x68\x13\xb9\x6f\x83\xd2\xa4\x86\xe3\x67\x77\xfd\xb4\xd1\x18\x73\xae\x68\x10\xa7\xd1\xba\xa4\x0c\xa9\x0c\x67\xe3\xa8\x41\x53\x4d\x15\xa5\x94\xf6\xd4\xe7\x8b\x9d\xa7\xd5\xce\x38\x7d\xc2\xa1\xe6\xf5\xcf\xbb\xd7\x7c\x63\x3e\xbf\x77\xaf\x21\x80\x1d\x90\xe0\x60\x85\xb9\xd1\xb3\x83\x49\x6b\x29\x99\x42\x8e\xd2\xf3\xde\x59\x0b\xc7\xb9\x03\x7a\x38\xf8\x3d\x8c\xa1\x5f\x80\xf8\x6e\x0a\x64\x9c\x47\x60\xe7\xfd\xf5\x93\x6f\x96\x8b\x52\x6b\x2b\x8c\xb4\x7c\x1e\x1d\xe7\x2c\xb3\x19\xc1\xfe\x00\xc8\xc5\x05\xb7\xd2\x08\x21\x7c\x2d\xe7\x25\x3e\xf0\x22\x24\x7c\xee\x22\xf6\x44\x37\xea\x1b\xf7\x9a\x87\x57\xd7\xe4\x87\xdf\xbc\x76\xbf\x7d\x4d\x4a\x88\x5c\xef\x4e\xa7\xfd\x7e\x89\xc3\xf8\x72\xaf\x21\x02\x19\x8c\xe6\xb1\x66\x0c\x84\xa7\x90\x0e\xc3\x53\x14\xf3\xbe\xef\xbb\xe7\x75\x33\xfd\x7a\xb7\x31\x52\x4b\x23\xe7\xd1\xca\xf5\x6e\x43\xfc\x04\x99\x8d\x0b\xb9\x7c\x21\xa5\x9c\xe4\xac\x83\xd6\xcd\x72\xb7\xb9\x0b\xdc\x86\xdf\xba\xd7\xfc\xd9\xd7\xe4\x77\xe6\x70\xb9\x26\x1d\xa4\xee\xf9\x35\x29\x04\x17\xc1\x38\x3c\xd3\x5a\x4a\x68\x7c\x06\x59\xdb\x86\x8a\x91\x0b\x91\xd9\x3e\x7c\x70\x90\xcf\xf4\xfa\xc9\x1f\xd7\x19\x34\xd2\x48\x2b\xe6\xd1\x31\xc6\x52\x9b\x92\x72\x31\xd4\xc5\x85\xb0\xd2\x48\x29\xbd\x93\xb3\x59\x0c\x65\x76\xad\xf9\x4c\xe3\x53\x64\xee\xf8\x45\xa3\xf2\x77\x51\x7e\xeb\x68\x79\x56\x43\xf8\xbb\x6b\x7c\xbf\xc6\x33\x6f\xbe\x11\xf9\x6f\x0f\x16\x15\x50\x79\x47\x98\x6a\x7c\x67\x97\xa7\xb2\x4d\x2a\x21\x05\xd7\x47\xf5\xd9\xb1\x90\xf8\x52\x6a\x39\x76\xba\x54\xdc\x34\x86\x41\x06\xf4\xdc\x26\xd9\x5c\x40\xc5\x35\x57\xd2\x77\x3e\x37\x26\x74\xb3\x3f\x4b\x92\xa4\xb1\x79\x32\xc1\x57\xf9\xed\x18\xbf\x95\x9d\xd8\x4e\xae\x28\x00\x7b\x83\xa9\xaa\x03\xc6\xd1\xda\x84\x4b\x6c\xb0\x80\xc8\xfe\x32\xb9\xe5\x8a\x59\x00\x20\xad\x77\xba\x74\xca\xd5\x86\x41\x01\xea\x4c\x13\x7e\x3e\x01\xb5\x8e\x58\xeb\xc5\xec\xdc\xca\x7d\x30\xfa\x62\x3d\xa2\x14\xea\xa0\xd5\xf9\x2f\xc6\x68\x1c\x2a\xa0\xf1\x05\xa6\xa6\xf1\xb6\xae\xfd\xbe\xae\x93\x56\x12\x4d\x24\xe0\xfa\x97\xb4\xab\xbb\x0e\x58\xd7\x01\xed\xba\x9d\x2e\x8d\xb6\xb5\x16\x90\x03\x3d\xbb\x04\xcd\x25\x14\x61\xd7\xca\x9b\x6b\x0d\x03\x4c\x41\xab\x33\x83\x29\x4a\xe3\xee\x49\x07\x3f\x28\x09\x5c\x04\xef\x9e\x33\xd8\xdd\x3f\x42\xa8\x78\x7a\x97\x3c\xbc\xfd\xf5\xa9\xde\x70\xe7\x60\x8f\xb1\xa9\xa9\xa3\x80\x3f\x77\xce\x25\x9a\x14\xae\xc0\x07\xfd\x19\x35\xcb\x33\x32\x5d\x8f\x9d\x3a\x13\x18\x1b\x4d\x80\x03\xab\xfc\x64\x41\xcd\x11\x20\x53\x97\xb5\xf1\xe6\x9b\xc9\x9e\x7f\x93\x84\xe7\xc4\x8e\xbc\xd0\xbe\x29\xa3\x4f\x81\xa7\xea\xe1\x0b\x8b\xd3\xf6\xe3\xe3\x5b\x78\xa9\xf1\x1a\xda\x42\x5e\x89\x6d\x3c\x2b\x68\x6d\x92\xc9\xf7\x90\x9d\x39\xa4\x7e\x88\x4b\xf5\xb4\x2e\x47\xa3\xe6\x32\x29\xcf\x83\x48\x4e\x9e\x11\x89\xab\x9c\x10\xe4\x89\xd5\xcc\x08\x1d\x1f\x05\xd1\x58\xec\x88\x71\x0b\x40\xb7\x78\x24\xcd\xb8\xfc\xf1\x85\xd6\xc6\x77\x82\xe6\x36\xc7\x50\x62\x7c\xd0\xc2\xb4\x75\x47\xda\x7a\xad\x9d\x10\x4f\x32\x70\xff\xbc\x8b\xfe\x3a\x7a\xb8\xd4\xa6\x2f\x71\xf7\xfd\xa5\x20\xfd\xfd\xe3\xee\x2a\xd2\xb2\xdc\x52\xe0\xc3\xa7\x9f\x1f\x1f\x7e\xb8\xfb\x70\xff\xe6\x1b\xc9\xd0\xbb\x54\xf9\x56\x43\x2a\x7c\x5f\x67\xd2\x1f\xe4\x20\xfd\x81\x03\x71\xbe\xd5\x65\xda\x01\x2d\xc6\x96\x7f\x9e\x98\x15\x62\xe2\xfc\xc8\xf9\x76\xef\xa9\x71\x4c\xeb\xe9\x60\x24\xab\x0d\xb4\xfb\xbd\xa7\xba\x6d\x0c\x94\xe7\x7e\x9e\x4c\x10\x76\x0d\xdc\x7e\xe1\x58\xf9\xee\x44\x9c\x87\x35\xfc\x97\xd1\xdf\x46\x8f\xaf\xb1\xfe\xb8\x62\x0d\x0d\x2a\xf0\xf0\xe9\xe7\xff\x00\xbb\xbb\x87\xfb\x9d\x9c\xe6\x61\x00\xc7\x7c\x34\x8c\xc3\x7c\x62\x20\x5b\x8f\x86\x18\xa7\x4d\x3a\xb7\x80\x78\xee\x45\x8c\xf3\x0a\xc6\x05\x92\x35\x65\xcd\x4f\x07\x63\x99\xb6\xd0\x32\x21\x98\xa7\xa2\x6b\x25\xa0\xb0\x27\x92\x87\x7e\x0a\x13\xfd\xbb\x0b\xbb\xe2\x9a\xdb\x5e\x59\x91\xfe\x00\x0b\x86\x77\xbf\x7f\xf7\x70\xff\x70\xd1\xf8\xfb\xc3\xfb\xab\xdc\xed\x9b\x67\xc9\xa3\x2d\xb6\x59\x76\x84\x8c\x9d\x9e\xa2\xde\x1f\x29\xa8\x81\x96\x50\xcd\x25\x72\xa6\x05\x5d\x94\x50\x5f\xa9\x70\xba\xfa\x0b\x39\x7c\x81\xf2\xa3\xb2\x1a\xa2\x53\x63\x8e\x4a\xa8\xb9\xf5\xce\x8f\x1c\x2a\x70\xd0\x12\xe2\x8f\x5c\x89\xa7\x68\x1e\x09\x89\x0b\x5f\x87\x3d\x9c\x68\x89\xf1\xdd\x96\x47\x6f\x02\xa3\xc1\x95\xdf\x29\xb0\x09\xfd\xe1\xfd\x7d\x60\x7a\xfb\x4b\x58\xe9\x90\x56\x2a\xbb\x1f\x7f\xda\x6d\xdf\x3e\x7c\x5c\x8e\x37\xcf\x12\x92\x9b\xbc\x26\xa0\xa1\x61\x94\x7e\xe6\xa9\x3f\xc9\x93\x10\x34\x76\x07\x18\x50\x61\x31\x82\xc6\x9f\xfc\x38\xfa\x43\x72\x3a\xa7\xc9\xe9\x54\x9f\xb9\x73\x49\x7d\xe6\x5b\x5e\x56\xad\x70\x39\x9a\x27\xdf\x0e\xaa\x05\x07\xac\x40\x76\x18\xab\xb2\x24\x94\x35\xe6\x24\xc4\x20\xa5\xdf\xfb\x92\x10\x18\x4e\x2a\xda\x25\x24\x8c\xb1\xfe\xc6\x18\x5f\x7b\xce\x93\xec\x3a\xbc\x0b\xe4\x8b\x06\xe1\x17\xc0\x61\x8c\x79\x9d\x65\xc3\x89\x1e\x0e\x83\x3f\x0a\xe0\x55\x6d\x1c\x98\xa2\xd4\xb4\x82\xdc\xad\xd5\x76\x71\xd1\x07\xf7\x7d\x71\xae\x76\xba\x40\x59\xaf\xac\x3a\x9e\x8c\xea\xce\xca\x5b\x3f\x31\x40\xc0\xe2\x14\x57\x94\x8b\xb9\x81\x41\x28\x21\xbc\x9d\x0f\x84\xc4\xc8\xb7\x43\x14\xc1\x32\xbe\x71\x17\xf8\x56\xc3\x1d\xea\x16\x66\x06\xda\x94\xfb\x0f\x31\x72\xae\xce\x3a\x6e\x52\x03\x7b\x6f\xdc\x61\xa7\x4e\x43\x3c\xce\x43\xa3\x0d\x0c\x16\xb2\x58\xfb\x6c\xad\xe5\xc5\x77\xed\xce\x46\xff\x36\x70\xd4\x3e\x5c\xba\x2f\xc2\x9a\xbe\x50\x3f\x85\x65\x75\x65\x9e\x80\x6f\x59\x4c\x46\x3f\x51\x50\x4d\x5d\x42\x04\x19\xf3\xa7\xa7\x08\x97\xc0\xe6\xa8\xb5\x0d\xd4\x14\xda\x2b\x27\xce\xe0\x7c\xe6\xc2\xbe\xc5\xb6\x3b\x38\x37\x1c\xab\x6a\x90\xb5\xa1\x42\xcd\xb5\x77\xab\xdd\x3c\x8e\xac\x3f\x70\xcd\xb9\x6f\xe6\x01\x57\xcb\x92\x1a\xd6\x1a\xdc\xe2\x82\xf5\xe5\xfc\xac\x58\x77\xcf\xc0\xbe\xb8\x06\x5e\xa3\xdd\x4c\x27\xdf\x33\xd8\xef\xeb\x1c\x41\x01\x15\xf3\x83\xdf\x33\x0c\xea\xec\xd2\xc1\x0e\x30\x96\x15\x9c\xae\x3c\x44\xa3\x9b\x3b\xe7\x82\x54\xd9\x05\x30\x42\x83\xa8\x35\x0b\x88\xad\x3f\x5d\x10\x13\xf2\x35\xe4\x1d\xf4\xa1\xff\xe0\x7a\xcd\xfe\xf8\xa5\x57\xe8\x26\xcd\x95\xc4\xc9\xfb\xe8\xe5\x7a\x7a\xbb\xf8\xee\x2f\x00\x0f\x0b\xd2\x12\x28\xf7\xad\xef\xfd\xe4\x5b\x0a\x87\x16\xef\x0d\x44\x70\x28\xb1\xe6\x18\xac\x9b\xb3\x78\x5a\x8e\xd1\x5d\x6b\x0b\x77\xa6\x44\xa8\x97\xb5\x99\x8e\xd6\x0e\xe7\xca\xd7\xcb\x25\xcb\xa0\x03\x45\x30\x15\x72\xae\x61\xe0\x3a\x65\x4f\xd1\x7c\xa8\xaa\x18\xf9\xa6\x8f\xa2\x6d\x44\x9f\xc8\xa6\xdc\x99\xe8\xfd\x6d\xf7\xf5\xc2\xa9\xb2\x7a\x73\xf7\xb7\x3e\xd0\xfb\x35\x08\x7e\x78\x7b\xbb\x24\xde\xac\xdb\xaf\x1f\xb7\x6f\x3f\x7c\x4c\xc2\x73\xe7\xe3\x43\x6c\x8a\x1c\xa8\xdf\x43\xba\xc4\x01\x90\x1a\xef\xcc\x61\x18\xfc\x24\x34\x07\x95\xe7\x74\x71\xc2\x06\xe0\x4a\x29\x5f\x83\xf0\x6e\x67\xa8\xd0\xda\x1f\x94\x3f\x98\xb9\x63\x2c\x26\x46\xd7\xcc\x47\x5e\x50\xb0\x70\x88\x7b\x8a\xbd\x0c\x45\x06\xba\xae\xfd\xb1\xae\xcf\xc7\x29\x8a\xb6\x81\x03\xaf\xde\x99\x8b\x72\x46\xf5\x85\xbb\xf1\xd7\x70\x7f\xfa\x3e\xf0\xed\x54\x21\xa0\xbe\x81\x7c\xb9\xc1\x01\xb2\x5e\xbb\x69\x1c\xfd\xc9\x1a\x5a\x81\xcd\x0b\xb2\x98\x33\x82\x5c\xe2\x55\x0b\xda\xeb\x9d\xa1\xdc\x68\x7f\x34\xfe\xa0\xe6\x96\xb1\x98\x2a\xe3\x68\x40\x7e\x02\x0e\x79\x3c\x90\x00\x5d\xd8\x25\x14\xf6\x47\xe7\xce\xa7\x63\xd0\x42\xca\x7f\x33\xf6\x87\xdf\x86\xbd\x2d\x11\x38\xaf\x00\xd3\x65\xe8\xb1\xf5\xd8\x42\x7a\x3a\xf9\xa1\x31\x0c\x43\x9b\x17\xcc\x0f\x50\x9e\xc0\xd6\x75\xed\x29\xec\x3d\xfe\x36\xf8\xf9\xe4\x25\x9d\x40\x7c\x17\xfc\x36\xe2\xa1\x0f\x95\xbc\x58\x2f\xcf\x83\x80\x1b\xf0\xf0\xf7\xed\xf3\xfb\xe7\xdd\xea\xf9\x7f\xbc\xde\xf6\x17\xe8\x77\x66\x2e\x62\xdc\xb6\xf3\x3e\x66\xee\x9c\xdb\x18\x85\x07\x92\x74\xd6\xc5\x7d\xa0\x73\x67\xb3\x8c\xed\x3c\xc4\xfd\x2a\x99\x74\x2e\x93\xe3\x39\xdf\xb4\x86\x1f\xcd\x91\xfb\x8a\x10\xe8\xb9\xe1\xa5\x67\xbe\x63\x40\x41\xc7\xb4\xaa\x0a\x42\x8f\xdc\x77\xdc\x98\xe0\x01\xcc\xfb\xb5\x76\x69\xb8\x8c\xfb\x1f\x5f\xeb\x5f\xc1\x7f\x73\xc3\xfe\x6c\xd8\x9b\x62\x79\x1e\x71\x20\x9c\xfb\x0e\xa8\xf3\x85\x85\x7c\x59\xe0\xbe\x69\x4d\x03\x7d\x8e\x96\x80\x94\xf9\x09\x9a\xb6\x6d\x7d\xb9\x38\xc8\xdf\x19\xf8\xc9\x2b\x0a\x0e\xc6\x78\x20\x95\x57\x5f\x8f\x3b\xb4\x21\x87\xfe\xdb\xd6\xcc\x0d\xfb\xa7\xd7\xe0\x2f\xed\x73\x0b\xf8\xbc\x42\x71\x3e\x1f\xa0\x36\xc6\x73\x68\xdc\x6c\xdd\x25\xd2\xa8\x06\x23\x59\x4c\xf2\x82\xfa\x0a\x7a\x5f\xc3\x69\x8d\xb6\xe6\xe0\xa3\xfe\x86\x95\xf3\x2d\x0b\x96\xf1\x57\xa1\xbf\x47\xff\x0b\x6d\x78\x36\x01\xba\x42\xcb\x62\x06\x26\xa5\x6f\x80\x5b\x9f\xba\x4b\x12\xd1\xf4\x46\x30\x38\xe4\x85\x08\xa9\x8d\x03\x74\x7d\xdf\xfb\x2c\x6c\x06\x68\xca\xad\xba\x19\x40\x63\xa2\x8c\x63\x3e\xf5\x82\x4e\xa0\x21\x8d\x7b\x5c\x79\xad\xbc\xbc\x19\x30\x47\x87\x0b\xc7\x3b\x0e\xbd\x3c\xab\x77\xf3\xe9\x0b\x97\xd6\x1f\x5b\x3f\xdf\x46\xdf\x15\x39\x58\x2f\x00\x73\xee\xf7\x20\xdc\x82\x3e\x04\xa9\xbe\x5b\x96\xcf\xbe\x5c\xb3\x14\x13\xd4\x5d\xd7\x79\xb4\x62\x27\xcc\xb8\x05\xfb\xd1\xcd\x03\xa5\x71\xe9\x8c\xc5\xf3\x71\x5d\x3d\x87\x78\x94\x5e\xba\xc5\xb7\x0c\xc8\xad\x3d\x9f\x86\x68\x1b\x89\x27\x7a\xe7\x36\x6d\xf4\x6f\x6f\x1d\xff\xd1\x9b\xe7\x7a\x9f\x0f\xf7\x0f\xe1\x09\xf5\xf3\xc3\xca\xa7\x72\x2b\xbd\x5a\x8e\xc3\xae\x98\x8b\x44\x9c\x86\xa4\x9a\x31\xde\x36\xbe\x82\x02\x08\xf1\xd6\x77\xcc\x63\x3a\x79\x5c\x41\x09\x85\x67\x6e\xa3\x3e\x9b\xdb\xd1\x6a\xaa\x35\xf5\x87\xb9\x2c\xa8\x12\x25\x63\xac\xd2\x88\xc0\x89\xf9\x89\xfa\x89\x86\x7a\x25\xf5\x44\x36\xf5\xad\x96\x75\x8d\x71\xfe\x66\xf1\xb6\xdf\x5c\xf6\xfc\x93\x67\x65\x60\xaf\x89\x74\x4e\x09\x3f\xd7\x76\x71\x5e\xfb\xb5\x16\xa1\x99\xd9\xf5\x30\xba\x3e\x88\x3e\x4e\xdb\x86\xb6\xdd\x8e\x78\x66\x6a\xcf\xcf\x3a\x56\xa1\xff\xd4\x68\x3f\x72\xc3\x2c\x96\x95\xb4\x7a\xe5\xa0\x89\xdc\x53\x75\x27\x36\xee\x6b\x2c\xf0\x1d\x2c\xdb\x0b\xeb\xe7\x32\x70\xe0\x36\xd3\xe7\xcc\x2e\x38\x4e\xdb\xf6\x17\xea\x36\xe6\xb3\xba\x1e\xc0\xf8\xe0\x0b\x0c\x5d\xdc\xac\x23\xd7\xf8\x61\xe3\x7c\xab\xb8\x3f\xcc\x14\x26\xf2\x14\x11\x7f\x22\x07\x41\xb0\x29\x70\x41\xb5\x28\xa2\xf4\xe2\xff\xe3\xdf\x8e\xe7\xcd\x8b\x8e\xc5\x65\x70\xea\xc5\xf5\xec\x93\xfd\x19\xbb\xd8\x86\xbb\x68\x38\xa4\x6a\x8e\x7c\x88\xcb\xb1\xc3\xfd\xb0\xc3\x9e\x1b\xe7\xd5\x59\xc6\x26\x70\x08\x19\xe5\x47\x6e\x99\xc1\x9a\x72\xa7\xc8\xa5\xae\x8c\x6c\xc8\x9f\x32\x4f\x37\xfe\xa0\xbb\xf7\x9f\x0e\x49\x71\x1e\xdd\xb2\x78\xfb\xc4\x9d\xc5\xad\x0f\x62\x39\xa0\x76\x96\x39\x77\xd0\x6e\x10\xcb\x3c\x51\x6b\xbd\x3e\xab\x67\xf3\x54\x2a\xab\xb1\x12\xcb\x6c\xad\x7b\x35\xd7\x1e\xe7\x2f\xf5\x3e\xef\x7e\xb5\x15\xfb\xe3\x57\x1d\xce\xc7\xa6\x84\xc6\x9b\x6c\xcc\x0b\x5d\x15\xca\x6b\x05\x25\xf5\xb5\xe5\x5e\x2c\xb7\x72\xdf\x82\xca\x7d\x0f\x29\x32\x31\x9a\x0f\xd7\x63\xa7\x0a\x75\x36\x92\x55\x55\x45\x99\x1e\x59\xe8\xc3\x3e\x36\x56\xef\x35\x93\x89\xa2\xbe\x53\xa1\xb7\x59\x47\xc9\xa6\x7c\xaa\xee\xcc\x4e\x05\x5d\x96\xbf\x0d\x33\xb6\xf2\x18\xfd\xfc\xfe\xe7\xdf\xbf\xb9\x48\x7a\xde\x3f\xfc\x74\x69\x91\xdb\x30\x28\x97\x0b\x7f\xb0\x58\x33\x6c\x91\x1f\x7d\x8d\xba\xda\x0f\xb1\xa8\x5d\xb3\x8d\x40\x79\x73\x1e\xbc\x42\x43\x75\xf4\x13\x6e\x48\xe5\x72\x04\xb5\x5d\xa2\xd6\xe5\x58\xc7\x65\xe5\x04\x36\x97\xd9\x59\xee\xac\x81\x9a\xea\x4b\x7f\x28\xdc\x12\x6f\xaf\x34\x30\xae\xa1\x44\x1c\x94\x46\x2f\xea\x0b\x6d\x15\xef\xe7\x14\x21\xd5\x60\x97\x66\xb1\x9a\xc5\x35\xc3\x73\x48\x9a\x59\x67\x79\x6c\xa8\xac\x08\x92\x65\x8e\x30\x9d\x58\x47\x19\x7f\x8a\x58\xcf\x54\x45\x94\xc6\x76\x6b\xc5\x7c\x84\xbe\x40\xac\x3b\x96\x45\xa1\xfc\x5e\xf8\x81\xfb\x5e\x55\xa5\x47\x4d\x66\x33\x09\xb9\xef\x3a\xad\x21\xf2\xc7\xda\xf0\x41\x50\x6e\xeb\x68\x17\xc9\x27\x92\xb4\xb7\xb5\xf6\xd7\xd1\xdf\x2f\x3e\xf4\x72\xb7\x7a\x77\x59\x6b\xf0\x92\x6e\xeb\xf1\x7e\x7b\x29\x38\xb8\x14\x7c\x85\x41\x95\x09\x3e\xef\xe9\xb2\xda\xcd\xe2\xaa\xc5\x82\xb3\xa2\x44\xa4\xa8\xe6\xc1\x00\xc2\xa5\x2c\x70\x3a\xe1\xc2\x96\x15\x6f\x6c\xb3\x23\x46\x79\xa9\x6a\x2f\xce\xc3\xda\xc5\x12\xdb\xb3\x4d\xa6\x96\x32\xcc\xe8\x5e\xe9\x42\xb1\xa0\x0e\x11\xed\x12\x17\x38\xcf\xcb\x1b\xbe\xff\x4f\xf0\xf1\x7f\x15\xdf\x17\x58\x1f\x1f\x3e\xbd\x5f\x2f\xd0\x3a\x39\x9c\x51\xe8\x25\x5e\xab\x34\x4e\x9c\x13\x86\x14\x2e\x67\xe2\x62\x61\x8b\x52\x2e\xb1\x49\x59\xee\x31\xd2\x08\xef\x4a\x2b\xbc\x30\xc6\xeb\xf3\xb0\xa6\xa3\x63\x7d\x6e\x92\x63\x1f\x80\xb5\x40\x8d\x52\x84\x95\x9c\xac\xfa\xb8\xf5\x13\xb9\xe3\xdb\xf4\x86\xf1\xff\xfb\x47\x46\xf0\x2a\x1e\xf0\xe9\xe7\x77\x77\x1f\x56\x31\xa3\x7a\xb7\xff\xbf\xf1\xb0\x45\xbf\x1c\xdc\x12\x69\x6f\xb1\xe0\xc2\xa2\x8e\x95\xbf\x74\x0e\xf0\x50\x62\xc5\xe9\x81\x94\x8d\x18\x7d\x65\x3d\xdf\xa6\x9a\x79\xa3\x95\x6f\xe7\x86\xf1\xdc\xe6\x04\xda\x59\x26\xb9\xb7\xb8\xa2\x4c\x72\x5e\x5a\xfd\x14\x05\x49\xb9\x10\x77\xbf\x1c\xc3\xbf\xff\xe3\x63\xf8\xac\x80\xf5\x3a\x92\x09\xd9\x54\x9f\x7b\x91\x88\xf3\x5a\x72\x97\x94\x42\x84\x76\xab\x6a\x4e\x1d\x98\x2a\x37\x79\x09\xd2\xa2\xc2\x4c\xf6\x08\xb4\xf8\xde\x20\x0e\x84\x17\x8c\x16\x85\xbc\x0c\xa5\x0c\xf9\x0c\xf5\x44\x92\x71\x57\x5d\x30\xfe\x55\xe0\x7c\xfb\x6a\x14\xff\x23\xbc\xbf\x22\x7c\xf3\x62\xfd\xbd\xb9\x72\x4e\x9d\xc7\x32\x6e\x67\x6a\x83\x92\xbb\xe1\x82\x21\x49\xe7\xc6\x74\x27\x5a\xc8\x02\xeb\xbd\xee\x54\x55\xf0\xa2\xda\x55\x61\x09\x36\x5e\x2e\x4b\xd0\x90\xd8\x9c\x5d\x32\x79\xa6\x0c\x52\x22\x88\x72\x81\x62\xa2\x94\xa1\x7f\x3f\x7d\x22\x9b\xe1\x35\xb6\xd7\xe3\xf7\x47\xb0\xc5\x28\x36\xb3\x2a\x96\x81\x33\x8b\xcf\x14\x47\x94\x51\x24\x4a\x8f\x4d\xdd\xe1\x5c\xa2\x92\x69\xa3\x65\x81\x38\x2a\x56\x70\xb2\xf5\xe2\x3c\x06\x70\xcb\xd5\x71\xf4\x5c\x6b\x64\xd8\x0b\x70\xbb\xc0\x95\xa1\x6f\xd8\xfe\xd4\xb9\xbd\x08\x69\x7d\x8a\xd5\x36\xfd\xe5\xa4\x37\xd1\x39\xaa\xe3\xfd\x8c\x93\x51\x29\xba\xee\xe5\xb0\x1a\x7a\x5c\xd8\x82\xc0\x68\xcb\xb2\xf1\x07\xe7\x0f\x50\x57\xbb\xca\xad\xb3\x6b\xce\xfd\xb3\xd9\x9d\x46\xca\x4b\xce\x9e\xcf\xee\x2e\x3e\xfc\x8b\xd6\xdf\x0d\xe3\x61\x53\x7f\xe6\x2a\x69\xce\xcc\xc5\x6a\x36\x89\x16\x92\x0a\x64\x08\x39\x37\x16\x9a\x0a\xd9\x1c\x43\xed\xca\xd2\x3d\x45\xd6\x9f\x40\x95\xdf\x5d\x81\x94\x97\xe2\xc5\x0a\xdc\x82\x78\xaa\xee\x5c\xac\x6f\x0c\x4d\xff\x78\xcd\xf9\xae\x7f\x43\x2a\xf2\xed\xe3\xc7\x1b\x5f\xca\x75\x23\xf0\xed\x73\xf5\x73\x70\xdb\xbd\x2f\xc0\xcd\x6d\x3c\xcc\x5d\x0d\x4d\xe9\xd1\xde\x8e\x5e\x09\x60\xce\xa7\xf1\x30\x3b\x70\xbe\x4c\xb8\x3f\x85\xa2\xa4\x13\x58\x48\x0d\xa4\xb1\x96\xf8\x54\x69\x9c\xeb\xc2\x76\xa3\xe1\x12\x57\xba\x3a\x61\x8c\xb1\x5b\x5e\x70\xb4\x8b\x78\xd0\xae\x7c\x9e\x9b\xfe\xa7\x8b\x57\xb9\x3c\xeb\xd6\x0d\xac\xb7\xc9\xa5\x08\x62\xf9\x7b\xe3\x8b\x7a\x49\xb4\xa0\x13\xed\x4f\xa7\x73\x7d\xf2\x27\x98\x96\x60\xed\xc8\x0d\x9f\x11\x98\x90\x1d\x68\x34\x17\xbc\x56\x7b\x71\x54\xbe\xdb\x11\x17\xf4\xd2\x42\xea\x59\x5e\x77\x80\x20\x9d\x3b\x63\x6c\xa1\xa4\x51\xcc\x33\x18\xc7\x46\xee\x43\x9c\x1d\xb1\x25\xde\xd8\x98\x4b\xdf\xc1\x3f\xdc\x10\x86\xce\x83\xb7\xab\xcf\xbb\x00\xd9\x5c\x49\x03\x2e\xe9\xf4\xf0\xb0\xbc\x0d\x62\xb7\xb3\xf3\x08\xfd\xcc\x93\x6a\xa6\x50\x42\x4d\x7d\xe1\x87\x9a\x7b\x7a\x64\x30\x1e\x67\x91\x14\x33\x87\xfd\x3c\x25\x83\x1f\x3d\x09\x6d\xd0\x5d\xa8\x7c\xd8\x18\x23\x3d\x13\xa6\xa5\xb5\x9e\xbc\x02\xcd\xc6\xca\x88\xd6\x08\x68\xa4\x94\xf2\x4b\xb9\x69\xb4\x0d\xdc\x15\xcd\xae\xfc\x7a\xbe\x57\xac\xbf\x5b\x9c\x9a\xfb\xc7\xfb\x5b\x41\xd1\xb3\xcc\xff\xfd\xe3\xc3\x65\x8c\x93\x68\xb3\xf8\x2f\xd8\x17\x71\xfe\xff\x10\xf7\xef\xd0\x92\xeb\xd8\x99\x20\x4c\x30\x5e\x6c\x75\x4b\xe2\xb9\x79\xb3\x92\x7a\x54\x0b\x47\x59\xb7\x12\xfd\xb7\xb4\x0a\xad\x54\x66\x42\xad\x5f\x12\xfa\xff\x57\x77\xa3\x67\x56\xcf\x60\x8d\x05\x13\x26\x4c\x98\x30\x61\xc2\x84\x09\x93\x26\x4d\x9a\x34\x69\xd2\x0c\x93\x66\x98\x61\xd2\x0c\x55\x06\x71\x66\x11\x11\x71\x32\x4e\xde\xbc\xf5\x68\x69\xcd\xdc\x7b\xe3\x51\xac\xb5\x4e\xec\x0d\xec\xbd\xb1\x01\xec\xfd\x7d\x91\xf7\xa0\xe0\xf1\x38\x84\x3e\x4e\x12\x94\x7d\xe4\x79\x19\x21\x60\xb1\xcb\x6d\x13\x87\xa6\x01\x64\x59\xfb\xb0\x6f\xe6\x43\xeb\xe3\x64\xea\x25\x0b\x29\xc1\x21\x4e\xb5\x0d\xa0\xf0\x6d\x0e\x9b\xa6\x69\xa2\x4e\xf5\x1b\xd9\x2d\x7e\x6f\x72\xf6\x84\xff\xe5\xb2\xe6\xf5\xba\x8b\x01\x88\x98\xe5\x22\x56\xfd\x92\x83\xf5\xfb\xba\x8f\x83\x02\x78\x88\x55\xce\x63\x06\x44\xac\xf3\x7e\x1f\xbb\xae\x03\x6c\xef\xbb\x67\x59\x4f\xb6\xae\x01\x99\x8f\x79\x11\x8f\x8d\x0b\x20\xfb\x29\x59\xb7\xb9\x7c\x12\xbb\xb0\xe5\xd7\xcc\x15\x26\x4b\x58\xa4\x4d\x54\x53\xcf\xfe\xfe\x98\x76\x6d\x5f\x9c\x7e\xf5\x70\x3b\x8d\xcb\x9b\x75\xeb\xea\xb3\x11\xb9\x9d\x6d\x00\x3c\xb6\x79\x7d\x46\x1b\xd2\x4b\xa3\x04\x94\x8a\xb7\xf3\xc9\x27\xc0\x96\x2d\xf7\xb3\xc9\x9d\x8b\xc2\x74\x73\xe7\xfd\xdc\x6a\x59\xd5\x50\x82\x36\x4a\x01\x4e\xf1\x50\x67\x57\xbf\xe1\x5b\xf1\x52\x9e\x57\xf7\xf2\xbc\xff\xf0\x76\xf5\x52\x9a\x87\xc7\xcd\xc3\x8d\x9e\xd7\xaf\x6a\x59\xcf\x92\x80\x63\xac\xdc\x38\x4e\xab\xc9\x31\xbb\x44\x6e\x89\x66\x92\xcb\xe8\xbc\x3f\x1e\xb7\x22\x5c\x45\xb1\x6d\xe4\x61\xf6\x4a\x94\xa1\x62\xb9\x30\x51\xa8\xbc\x8c\x63\xf3\xbc\x0e\xfb\xdf\x36\x36\x3f\x25\xcb\xf2\x7f\x89\x35\x14\xe1\xbc\x27\x39\x9b\xbb\x74\xf3\x7a\x58\x33\xc5\x8c\x92\xd0\x68\x74\xee\x72\x1f\x49\x48\xa9\xed\x97\xb1\xb1\x4d\xe4\x7e\x0e\x5a\x94\xa1\x64\x39\x37\x5f\xc6\x66\x93\xf9\xc5\x5f\x57\x30\xfb\x9b\xbb\x2e\x90\x1b\x82\xd1\xc7\x4f\x5f\xb0\x80\x12\xd1\xf4\xcf\xde\xc3\x4f\x97\xd2\xb3\x47\x78\x2b\x3d\x4b\x70\x46\x9b\xc7\x8f\x1f\xfe\x03\xd8\x3d\x7e\xd8\x3c\x7e\x4a\x9f\xab\x53\x0d\xab\x5c\xc7\x13\xc6\x42\x60\x21\x88\x2c\x8b\xae\x87\x9c\x0e\x64\x02\x19\x81\x95\x85\x94\xc5\x2e\x36\x12\xda\xd9\xd0\x1c\x99\xf9\x94\x7b\x34\x8f\x60\x5f\x44\x94\xab\x22\x47\x9f\x0d\x68\xcb\x48\x73\x51\xe6\x74\x05\x31\x44\x11\x29\x5c\x56\x98\x08\x49\x60\x45\x4a\x49\xd5\x04\x8b\xb2\xf4\xa4\x85\x10\x0b\x50\xc4\x96\x38\xbc\x07\x23\x3d\x21\xc8\x58\x2a\x88\xd8\xa6\xfb\xbc\x1b\xe6\xf3\x2f\xd3\xee\xe5\x9f\x6e\x1a\xbe\x7d\x41\x3c\xf5\xf0\x36\x07\x8b\xef\x3c\xbc\xff\xb8\xba\x55\xb7\xbf\xff\x78\xf9\xb2\xec\xf3\xae\x83\x91\xc6\x62\x3d\x35\x08\x83\xe1\x28\x24\xaa\x4b\xd1\x7b\x51\xd2\x68\x05\xc0\x22\x8e\x23\xd6\x6d\x0b\xc8\xb8\x8f\x7d\x5d\x34\x00\x1d\xc7\xc9\x62\x84\x71\xa9\x50\x69\x0a\xa9\x10\xb9\x00\xa1\x0f\xb3\x23\xc8\x90\x9a\x53\x9e\x37\xf3\x21\x8e\x61\x04\xe3\x8a\xc8\xc8\xf6\xfb\xfd\x3c\x4a\xbd\xdf\x47\x05\x6b\x59\x56\x12\x1a\x0f\x09\x2c\x95\xba\xf0\x90\xf0\xa4\xcf\x5f\x3c\x77\x1a\xfd\xff\x5e\xe8\xf3\xe9\xdb\x0a\x7d\xbc\x69\xf4\x29\x7d\x7e\x7f\xd1\xe8\x97\x5f\x54\xda\x64\x35\x22\xa0\x3f\x48\x5d\x94\xa1\xe4\x7d\xe0\x15\x89\x9e\x03\x42\xe2\x61\x4f\x4c\x5b\x74\x80\xec\xf7\x71\xa8\xcb\x16\xa0\xc3\x78\x32\x88\x10\x52\x16\x12\x55\xaa\x54\xcf\x5a\xed\x67\x43\x20\x54\xb8\xe1\x94\xe5\xdd\x3c\xc6\x83\x3d\x81\xfd\x0a\xcb\xc8\x94\x1e\xc7\x79\x3f\x8e\xa3\x89\x23\xac\x65\x01\x31\x5e\x14\xa3\x68\x51\x6c\x9b\xec\xb0\xd9\x94\x69\x8f\x79\x61\xfc\xf8\x6f\xcf\x96\x78\x29\x6c\x7e\x61\x7a\x97\x38\xf7\xfa\xed\xc3\xa5\x00\xe7\xfb\xdd\xe3\x87\xcb\xa5\xe0\xee\xf1\xc3\xab\x2f\x36\x7b\x99\xb7\xd5\xd0\x94\x55\xae\x67\x06\xad\xec\x01\x45\xa8\xf0\xa5\x60\xd1\xc5\xd1\x37\x73\x4b\x73\xa9\xa3\x0a\xb9\x8a\x18\x1c\x22\xcc\x4d\x01\x8e\x9f\x1b\xd0\x95\x45\xc4\xb9\x2a\xf3\x8c\x33\xa2\xcb\x62\x18\xa1\xe6\x96\x13\xa5\xf1\xa6\xc4\x04\xcf\x4c\xc5\x0e\x56\x08\x79\x34\x12\xcc\x18\x60\x51\x32\x2f\x40\x30\x2b\x1c\x8f\x8e\x51\x17\x25\x63\xde\x47\xa3\x2d\x86\x15\x2e\x94\xe8\x50\x4d\xca\x8a\xa7\x38\x50\xfc\xc8\x2e\xff\xcb\xef\x60\x97\x9f\x5e\xda\x25\xb8\x9b\xc5\xbf\xbd\x58\x66\xdf\x40\x0a\xa6\xa3\xd0\xa8\x2e\xd9\xc1\x0b\xc8\x22\x13\x40\xf1\xd8\x4f\xc4\xef\x8b\x11\xa8\x71\x8c\xa1\x2f\x06\xc0\xa7\x03\xa8\x0c\x22\x18\x17\xa5\xc2\x95\x29\x94\x86\xf4\x85\x71\x06\x91\x8c\x73\x8c\x07\x7f\xf8\x96\x71\x8a\xa2\xba\x4c\x22\xac\x2e\xe6\x99\x6d\xc1\xe9\xca\x4f\xf5\x17\xd7\x99\xc4\x5f\xf4\x7a\x7c\xf8\xba\x52\xf7\xa2\xd8\xe3\xc7\xd5\xe3\xa7\x54\x90\xb2\x28\x76\xf9\xf2\xc5\xe1\xae\x7a\xa1\x16\xb3\x9c\xc6\x11\x89\x0e\x15\x75\xa9\xe2\xd4\x2a\x22\xe6\x13\x07\x9d\x88\x0e\x20\x7e\x00\xe5\xa5\xd6\x98\xc4\x21\x8a\x53\x99\x12\x2b\x1e\x7b\x20\x1d\x21\x8c\x41\x4d\xa1\x2d\x42\x40\x7c\xeb\x10\xa7\xe7\x7e\xf6\xb0\x42\x7a\x71\x40\x91\xd7\x49\xc7\x23\xd8\xaf\xa8\x88\x3c\x91\xa2\x0b\x3d\x0c\x51\xa1\x20\xca\x8a\x23\xe3\x10\x84\xa8\xd4\x2a\xad\xc5\x40\x3d\xf1\x5d\xb7\x41\xc9\x4a\xff\x73\xf6\x4f\x09\xd5\xe5\x56\x92\xfa\xcc\x20\x72\x35\xd1\x87\x67\x66\xb1\xaf\x1c\x2e\xd9\xed\xf6\xf5\xcd\x6e\xb7\x4b\xf0\xf4\x2d\xab\x47\x59\x94\x45\x28\x5d\x6c\xe2\xc9\x76\x11\xd2\x1c\xaa\x28\x40\x87\x60\x0d\x61\x4e\x5a\x4a\x39\x2f\x4b\x45\xb1\x86\x75\x07\xf9\xec\x52\x05\xd6\xa9\x00\xee\xec\x00\x29\x8b\xd8\x82\x63\x51\x82\x06\x74\x51\x54\x55\x85\x2b\x8f\x47\xc3\x18\xc8\x62\x47\x2c\x07\x2e\xaf\xa5\xc6\x82\xcd\xb2\xe6\x65\x85\x20\x36\x0e\x73\x52\x6a\x99\x93\x64\xb3\xa9\x78\xce\xdf\xf0\x81\xe9\xae\x59\xef\x13\x07\x49\x95\xce\x31\xdf\xdf\xad\x0f\x5f\xb9\xe0\xeb\xdf\xe0\x81\x37\x5e\x8f\x3b\x7e\x95\x9b\x4b\xfa\x59\xd2\x65\x8d\xbc\x77\x40\x70\xf8\x49\xff\x43\x42\xa9\xaa\x9a\x27\x2f\x3a\x80\x58\x11\x4a\x1f\x7d\x3c\xba\xf5\x1e\x63\x3c\xcb\x79\xe2\x5e\x00\xa3\x12\x26\xa3\xb5\xd1\x50\x6a\x6d\x74\x6a\x09\x4a\xb8\xd4\xbc\x45\xcc\x16\x15\x82\x24\xee\x61\xc5\x1c\xee\x15\x63\xd9\x36\xf7\x57\x3e\xb2\x5b\x3d\x0a\xbe\x60\xb3\x7d\x65\xb3\x6f\xbf\xb2\xd9\x65\x91\x78\xbc\x86\xd4\xc7\x0f\x8f\xdf\x83\xaf\x17\x09\xdb\x20\x96\x97\x71\x42\xdc\xe3\xc2\x97\x7a\x6c\x65\xa9\x22\xe1\xc0\xca\xd8\x80\x8c\xb5\xd3\x04\x2c\xc8\x4e\xd1\x8c\x65\x02\x45\x8f\x27\x80\x2c\x26\x94\x42\x83\x2b\x5d\x5a\x87\xd8\xe2\x8f\x57\x63\xc5\x0a\x77\x94\xf1\xbc\x9e\xfb\x78\xf2\x23\x38\x2c\xc6\x9a\x1c\xf2\x30\x0c\x83\x5e\xa2\xea\xc5\x58\x53\x50\xbd\xd8\xea\x36\x67\x5f\xe9\xf6\xab\xdf\x49\xb7\x6b\x81\x18\x78\xff\xe9\x27\xdc\x91\x35\x88\xe6\x38\x1e\x11\x0f\xb8\xf4\x85\x3a\xb5\xaa\xe2\xb1\x10\xa0\x96\xd1\x83\x92\x76\x69\x9b\x50\x83\x32\x4e\x51\x4e\xe5\x53\x06\x96\x1d\xef\x11\x50\x83\x29\x63\x50\x51\x68\x4a\x17\x20\xbf\xe9\xe7\x60\xf5\x32\xe0\xbc\x70\xc6\x61\xf1\x45\xe8\x75\x09\x45\x0a\x37\x10\x5d\xc2\x4d\xf6\x07\x19\x7e\x62\xeb\x3e\xf5\x24\x7e\xe9\x74\xfe\xff\x26\x6c\xdd\xff\xe3\xc6\xc8\xf6\xea\xb2\x13\x5f\xbd\x5f\xbd\xff\x72\x02\xf7\xea\x7a\x83\xfd\xea\xf1\xd3\x63\x62\x6b\xbe\x27\x6c\xbb\x14\xdb\x3f\x93\x8e\x3d\xa3\xb6\x21\x16\xdd\x3c\x62\xd0\x1f\x05\xf4\x98\x31\x1a\xb0\x91\x8e\x30\x28\x08\x46\xe5\x4c\x88\x33\x83\x07\x7b\x14\x8b\x32\xa7\x70\x6e\x01\xa4\x48\x23\xd2\x51\x64\x10\xcd\x3b\x52\x9a\x12\x13\x52\xe9\x92\xc4\xd1\x60\x6a\x18\x58\xcc\xb2\x44\x5b\xe3\x44\xe9\xa3\xe8\x3c\xf6\x2e\x8e\x71\x3f\x9f\x86\xca\x55\x1a\x88\xd8\xc7\x93\x04\x0a\x0c\xc0\xc7\xb1\x89\xa8\xcd\x7b\x2e\x28\xe7\x88\x09\x26\xd8\x99\x39\x07\x83\x0d\x01\x36\xbe\x44\xa7\x86\xf5\x7d\xd3\xc0\xae\xce\xfe\x20\xef\xaf\xfd\x1f\x9b\xeb\xfa\xf2\x9f\xb2\x4f\xd9\x3f\x64\xff\xff\xec\x7f\x64\xff\xe7\x6f\x1b\x97\xdd\xfd\xb8\x7c\xff\xbb\x0c\xcc\xf6\xc4\xa3\x9a\x7b\x0c\x0e\x47\x81\x3d\x16\x8c\x36\xc4\x4a\x4f\x79\x25\x08\x43\xc5\xf9\x44\x8d\xed\x42\x5e\xa0\x79\x5f\xe6\x16\xcd\x0a\x10\x8a\x0d\xa2\x7b\x86\x0d\xe2\xf9\xc4\x2a\x53\x52\x42\x2b\x5b\x92\xd8\x39\x42\x2d\x03\x84\x94\x36\x0d\x8c\x2c\x7d\x94\x75\xf3\x62\x60\x2c\x60\xb1\x9d\x24\x90\x5f\xc6\x45\xac\x2a\x2e\x99\xe4\x98\xdf\x0f\x8c\x47\xcf\x03\x53\x37\xa8\xab\x2f\xf7\x0e\xf8\x89\xed\xd4\x86\xa4\xb5\xf7\x5d\xf6\xd7\x89\xd5\xe4\x9f\xb2\xff\x7a\x45\xf8\xdd\xee\x96\xfc\x7b\x77\x37\x26\x89\x03\x36\x03\x4b\x68\xfb\xb4\x04\xea\x4f\xd7\xea\xb4\xaf\x99\xfe\x7e\x05\x7e\xf6\x7a\xf7\xb7\xef\xda\x1c\x73\xea\x31\xce\x3b\x01\x0a\xd1\x99\x9e\x69\x18\xa8\xa0\xbf\x6e\x95\x51\x60\x49\x54\x61\x5e\xab\x5c\x93\xf3\x44\xd8\xba\x14\x9f\x0d\x45\x0e\x52\x1c\x98\x0c\x7a\x6d\x68\xe5\x2b\xd2\x92\x2a\x54\x78\x4f\x03\x59\x63\x67\x99\x12\xf1\xe0\x9a\x88\xfa\x2a\x54\x1a\x14\x4a\x6a\x50\x01\x1f\x42\x3c\x08\xde\xe4\x35\xe3\x9c\xb3\x33\xc3\xc7\x9a\x77\xad\x32\xc8\xaa\xc2\x3a\x1c\x6c\x15\xfa\x72\xb4\xa9\x37\x7a\xba\x62\xe1\xfe\x3c\xd9\xc3\x5f\x25\x3e\xa6\x7f\xbc\xe2\x35\x5f\x74\x7e\x61\x06\x17\x95\x5f\x3d\x6e\x1e\x3f\x3d\x6e\xc1\xa7\xc7\xdd\xea\xce\x00\x76\xd7\x93\x99\x3c\xa9\xbf\xa8\x9c\x3b\xd0\x63\x18\x20\x02\x3d\xeb\x69\xa3\x03\x11\xc8\x12\x82\xcf\x4c\x6a\x0d\xf8\x18\x35\xd8\x03\x85\xe3\x1e\x83\x96\xcc\xb5\x93\x17\x68\x89\xc0\x2a\x57\x51\x9d\x34\x8e\xa5\xaf\xb4\x57\xc0\x63\x87\x37\xda\x7a\x68\x75\xb4\xd1\xcf\xcd\xa1\xac\xcb\x00\xb4\x55\x0a\xb0\x1c\x9f\x4e\x36\x56\xd3\xb4\x3a\x31\xc1\x05\xfb\xbc\xd8\x7e\xed\x71\xb3\x4c\x6e\x09\x9f\xb2\x03\x1f\x87\x76\x5f\x1c\x7c\x96\xfd\x41\x8e\x7f\xbb\x0f\x80\xdf\x25\x36\xfc\xd8\x07\xae\xdf\x5f\xf8\xc0\xc4\x23\x9b\x1d\xce\x0b\x90\x49\x5c\x63\xc5\x59\x4b\xbc\xaa\xa9\x80\x92\x51\x5c\x9e\x6b\x56\xdb\x29\xe4\x14\xcf\xbe\xc8\x3b\x34\x23\x20\x19\xb6\x88\x1d\x39\xb1\x58\xac\x20\xaf\x6c\x45\x29\xad\xdc\x92\x78\x7b\xb2\xe4\x92\x82\x94\xae\xc4\x5b\xe3\x65\x15\xa2\xae\x6b\xec\x2e\x4e\x30\x0d\x95\xaf\x34\xe0\xb1\x7b\xca\x2e\xd1\x21\x5c\xd8\x14\xc4\xaa\xe4\x82\x71\x8e\x29\xe7\x9c\x9e\x85\xb3\x28\x98\xc2\x07\xd4\xb8\x02\x4f\x0d\xef\xbb\xc5\x0d\x42\x56\xe4\x21\x8d\x8d\x4d\xd5\x81\x5f\xd9\xc3\xab\xdf\x6e\x0e\xdb\xdf\x62\x0f\x2b\x04\x2c\xf5\x15\x02\x9e\x34\xc4\x2b\x97\x6e\x2d\x10\x3e\xf7\x5c\x6a\x80\xba\xd8\x82\x00\x30\x8a\x27\x08\x0c\x9a\x4f\x84\x32\x46\x3c\x62\x2b\x82\x4b\x57\x22\xb1\xac\x28\x28\x52\x57\x2d\xab\xb9\xc2\x1e\x6d\x34\x28\xef\xec\xc1\x97\x01\xd8\x8b\x3d\xa0\x69\xb2\x11\x4e\xc6\xfc\x76\x83\xf8\x7f\xd5\x1e\x02\x96\xff\x12\x7b\x70\x17\x7b\x90\x2f\xec\xc1\xd7\xd8\xda\xdf\x66\x0f\x4b\x54\x14\x1c\x5f\x22\x04\xff\x29\x7b\xf8\x03\x70\xc1\x69\xfb\xd7\x1a\x9b\x77\x3f\xfc\xe6\xb1\x39\xf2\x88\x67\x89\x73\x04\x2a\x85\x6b\x22\x19\xeb\x88\xd7\x35\x13\x50\x31\x86\xcb\x33\x25\xc1\x1d\xea\xdc\x91\x99\x96\xab\x0a\x9d\x07\x10\x04\xb6\x98\x3f\x65\x92\x58\x22\x56\x4c\x54\xb6\x62\x9c\x57\xae\x62\xd1\x3a\xca\x9d\x04\x82\x56\xfe\xcb\xe0\x84\x1a\xdb\xeb\x8a\xb1\x4f\x83\xc3\xe2\x70\x5b\x4a\x43\x1c\x43\x24\x35\x4f\xce\x22\x16\x67\x61\x8c\xfe\xf4\xe0\xa4\xf8\xb9\xbf\xd6\x82\xfc\xfc\xeb\x35\x03\xfc\xd8\x5b\x5e\x5d\xbd\xe5\xc3\x65\x67\xb3\x05\xcb\xdb\x4f\x3b\x4c\x4a\x2d\x78\x0d\x11\x18\xd9\x80\x7b\x59\x33\x09\x15\x27\xa8\xf8\x3c\x71\x21\x01\xaf\xa3\x03\x2d\x86\xc0\x91\xd8\xe0\x78\xca\x27\x38\x1b\x8a\x39\xf6\x98\xad\x34\x87\xbe\xe2\x9a\x57\xa1\x62\x11\x06\xae\x82\x01\x0d\xab\xea\x6a\xd9\xc9\x59\x1d\x5d\x74\x73\x3b\x95\x61\xf1\x18\x25\x34\xa8\x41\xed\x5d\xcc\x8e\x26\x56\x47\xb3\x72\x8c\x0b\xce\x3f\x87\xd0\xa0\x36\x14\x4d\x8b\xfa\xba\xc4\x71\xea\xf8\xd8\xb7\x1d\x1e\xda\x84\x81\x3f\xe5\x63\xc2\x2d\xfe\x59\xf6\xe7\x59\xf6\xea\xf9\xca\x77\xf3\x26\x5f\x2d\x06\xb1\x79\xf7\xf1\xd3\x77\xab\xef\x5e\xed\xf2\x95\x3e\x42\x5c\x13\x38\xce\x01\x84\x9a\x30\x42\xaa\x63\x1c\x49\xf0\x62\x48\x1e\xbd\xa1\xde\x60\xdf\x04\x89\x23\x8a\x87\xb2\x72\x46\xd4\x08\x83\x06\xa4\x3e\x77\x04\x34\x48\xfc\x16\x79\x4e\x9e\xc8\xae\xdd\x92\xac\x4a\xf5\xeb\xf9\x43\x99\x88\xdd\x2e\xf8\xba\xe5\xab\xc7\x2b\x81\x38\x48\xdd\x82\xf9\xf2\xd3\x57\x00\xc1\xfc\xdd\xb6\x2b\x69\x55\x56\x0e\x7a\xed\xca\xd9\x4f\x76\x04\x54\x70\x0c\x3d\x16\x82\x3b\x42\x4c\x30\x7b\xad\xec\x96\xcc\x43\xa4\x71\x38\x2a\x85\xa3\x07\x08\x0c\xc0\x80\xe9\xbc\x8f\x3c\x6a\x09\x28\xa8\x57\x7d\xf4\x5d\xdf\x1d\xcb\x18\x9e\xb2\xa7\x2c\x9e\xe8\xbe\x3b\x74\x72\x02\x15\x28\x4f\x89\x87\xf9\x94\xed\x77\xf5\x56\x67\xdf\x5f\x4f\xf0\x16\x2b\xb8\x07\x4e\x49\x67\x2a\x0f\x77\x8d\x8a\x69\x4f\xf8\xea\xfd\x87\xb7\xeb\xc9\x41\x98\x43\xe5\x96\xf4\x88\x12\x5c\x44\x4c\xb9\x6e\x80\x9f\x60\x3b\xe0\xc2\x57\x32\x1e\xe3\x89\x3b\xad\xb7\x1a\x2b\x31\x93\xa7\xac\x72\x30\xe4\xd0\x2a\x3e\x1d\x22\x8a\x27\x54\x20\x81\x1d\x27\x2a\x3f\xc5\x3a\x61\x14\xfc\x9b\x8c\x3e\xb1\x55\x9d\x6a\x55\xdf\x5c\x2b\x37\xff\x4b\xf6\x5f\xb3\xff\x91\xfd\xcf\x2c\x03\x5f\xba\x61\x12\x01\xce\x87\xb7\x1f\xde\xaf\xae\xa7\x9e\x3f\x5c\x3f\xc1\x9b\xeb\x65\xfe\xe3\x73\xcf\xcc\xa5\x6f\xe6\xed\xc3\xee\xdd\xc7\x37\xaf\xdf\x7f\xd8\x5d\x5f\x00\xfa\xce\x37\xcd\xe5\x0d\xc8\x58\x1b\xad\x01\xba\x7e\x89\xd2\x40\x5f\x56\x16\x56\xa0\x38\x1d\x0e\x87\xc3\x34\x0f\xbe\x92\xce\xf6\xcb\x3f\x5b\xa3\xf5\xb2\x8e\x2b\x65\xe3\x31\x06\x63\xf5\xf2\x16\x27\xa4\x31\x46\x94\x19\xab\xad\x36\x86\xe5\x08\xc9\xa1\xb4\x76\xb2\x76\x32\x26\xdb\x65\xf2\x89\xad\xf4\x96\x64\xff\xf6\x5a\x03\x71\xa9\x64\xba\x30\xaa\x3e\x5c\xba\x7c\x7f\xb8\xfb\x7e\x1f\x81\x56\x77\xac\xde\xef\x6f\x25\x09\x40\x1c\x81\x76\x8a\xb1\x00\x8e\x07\xa0\xbd\x58\x36\xbe\x90\x63\x86\x28\xe8\x05\x61\x98\x8b\x50\x95\xa9\x1e\xd1\x1f\x38\xb0\xd1\x2e\xaf\x75\x03\x0a\x37\x17\x9d\x63\xd6\xb8\xf4\xb5\x35\xd4\x1a\xc0\x08\x97\x8c\xa8\xf4\x1e\x4b\x8c\xd1\xb9\x55\x6a\xc5\xe3\xbe\x89\xa8\x49\x77\x22\xea\x49\xac\xda\x14\x5b\x2f\xdd\xd8\x9f\x7e\x9a\x2b\xfa\x2f\xc0\x8d\xe2\xf8\xe1\xd3\xc3\xfb\x87\xb7\x1f\x36\x0f\xef\x1f\x3e\xa5\x3a\xa6\x54\x26\xb0\xe2\x3c\xf6\x91\x60\x60\x80\x30\x4c\x2a\xf9\x94\x11\x64\x11\x09\x74\x59\x3a\xf6\x16\x82\x31\x8e\x80\xc6\xde\x78\x3f\x1f\xbd\x89\x03\x20\x12\x53\xed\xb7\xc6\xab\xd2\x3b\x7a\x34\xd2\x39\xe5\xa8\x35\x48\x6a\xa6\xe4\x88\x84\x1b\x7c\x34\x25\x28\x63\x29\x19\xd8\xc7\xa1\x04\xc1\x0f\x82\x89\x3a\xcb\xd6\x2b\xf3\xc4\x76\xfd\x96\x65\x6f\x9e\x51\x24\xf3\x87\xf2\xbb\xf7\x7f\xf3\xe1\xcd\xf6\xa5\x3b\x2e\xba\xbc\xbe\x63\xa7\x4f\x3e\xf9\xe9\xe1\xed\xc3\xfb\x0f\x8b\xdc\xd7\x5b\xa9\x1d\x2a\xca\xb2\x52\x50\x32\x59\xce\x83\x76\x26\xa7\x84\xcb\xa6\x61\x65\xa5\x28\xd4\x45\xd9\x8e\xd5\xbe\x69\x2c\x1a\x15\x21\x0d\xdd\xb2\xb9\x8f\x34\xee\xe3\xde\xa0\xc5\xf9\x8e\xc0\x82\xe9\xec\x63\x15\x8f\x64\xf9\x9f\xab\x61\xaf\x61\x35\xcc\xf2\x29\x2b\x39\x43\xdd\x01\x52\x8a\xa1\x83\xa0\xcc\xeb\x16\x5a\x78\x6e\x6e\xe8\x35\x59\xb6\x5a\x8f\xd9\x61\xe7\xb7\xe2\x3a\x0f\x19\x78\x93\x6f\xde\xfd\xe2\x2f\xc0\x97\xf7\x6d\x67\x9b\xd8\x2a\x40\x47\xd7\xc7\x20\x81\xe8\x5d\x13\x7b\x09\xf0\x56\xb0\x38\x0d\xb6\x6f\x79\x3c\xee\xed\xd0\xb1\x78\x18\xdd\xfe\xc2\x73\xc7\x76\xfb\xf5\x98\x55\xcf\xd5\x75\xf9\xc3\x33\x1c\xf8\x2f\x2f\xe3\xb3\x84\xf9\x65\x80\x36\xe9\xb6\xe6\x76\x46\xb0\xbe\x81\x29\x6d\xde\xfd\xe2\xd6\x71\xb6\x5b\x46\x87\x14\x1a\x39\x21\xcb\x73\x6b\xad\x3e\xac\x14\x89\xfb\x65\x1f\xcd\x18\x36\x82\x5a\x1c\x0f\xb1\x21\x40\xc7\x09\x94\x4f\x19\x06\x7a\x9f\x20\x4d\xd6\x63\xc4\x31\x8c\xe3\x88\x62\x33\x01\x05\x10\x70\x11\xc7\x7d\xf4\xde\x4c\x79\x99\x97\x83\xc1\xcb\x06\xb3\x28\x05\x09\x3d\x71\x04\x7b\x34\x80\xc6\x42\x5b\xcd\x63\xd7\x75\x57\x3b\x25\xbb\xfd\xea\x90\xbd\xba\x76\x8b\xfc\x7d\x96\x81\x3f\x05\x37\x68\xf3\xd5\x8b\x99\x7e\x7c\xb8\x6c\x03\x9f\xb5\xd8\xbe\x7d\x07\x6f\x0d\x73\x9b\x84\x19\xb5\x6d\x0b\x84\x49\x61\x51\xd0\xa6\xfc\xec\x3b\xd7\xae\x0d\xeb\x27\xe0\x84\x15\x0e\xa2\x68\x62\x55\x81\x21\x1a\xe0\xba\x3d\x02\xfb\x78\x3c\x9d\x80\x3d\x9d\xd2\x9d\x46\x55\xad\x0e\xf3\x69\x3e\x8d\x28\x76\x40\xe4\x43\x14\xb1\x8e\x13\x07\x15\x60\x60\x6a\x4d\x55\xca\x58\x3b\xcf\x08\x59\x66\x3b\x00\x29\x0a\x1b\x99\xd6\xfa\xe8\xab\x0a\x2e\xf1\xf9\x56\xb3\xf4\x2a\xfb\xb3\x74\x57\x76\xdf\xa7\x7b\x8d\x82\x77\x90\x1f\xe9\x96\xf4\xbb\x37\xbb\x5f\xa6\x3b\xb4\x65\x2d\x79\x5c\xb1\xa9\x9e\xea\xd3\xa9\x9e\xea\x69\x35\xd5\xb3\xaa\x0b\x10\x6a\xd0\xc6\xb6\x99\xc4\xa9\xa9\xc3\x49\x4f\x21\x1e\x36\xfe\x78\x3c\x1e\x7d\xd7\x75\xdd\x53\x16\x9b\xfd\x08\xd2\x29\xa9\x8f\xa7\x74\xb7\x37\x1f\x73\x18\xc7\xce\xd6\x17\x6c\x83\xd5\x2a\x3c\x89\x84\x29\xf7\x6f\xb2\x3f\xbc\xb0\x71\x5f\xcb\x15\x53\x5d\x3a\x48\x75\x42\xcf\xc7\x84\xbb\xd7\x77\x15\x83\x17\x7c\xf5\x8f\x9f\xde\xae\xad\x74\x72\x25\x7d\x22\x85\x3b\xe6\x4d\xac\x39\xf3\x75\x09\x2d\x23\x16\x5e\xae\x68\x69\xa2\x67\x9a\x40\xa9\x14\xd1\xb4\x5d\xbb\x18\xe6\x31\x4a\x0e\x1a\x70\xca\x4f\x91\x01\xdc\xc4\x93\x6b\x45\x49\x30\x26\xbe\x21\x12\xee\x5d\x1f\x42\xef\xba\xb2\xb0\xc6\xa7\xf5\xed\x49\xec\xea\x2d\x49\x72\xfe\xed\x6f\x96\x73\xf1\xf4\x5b\x29\xf2\xb5\xe5\x70\xfb\x36\x49\x3a\x0a\x27\x56\xd0\xcd\x53\x5e\x46\x94\x8b\xb8\x67\xd4\xf8\xaa\xd2\x1c\x9b\xb2\xc4\xe4\x74\x02\x68\x86\x00\x4d\x93\x14\x58\xd1\x90\xe4\x3c\x44\xc1\x40\x07\x8e\xf9\x29\x72\x80\xdb\x78\xb2\xb5\x28\x11\x41\x8b\x9c\x04\x15\xe5\xe8\x06\xe7\x06\xd7\x97\x46\xfb\x6c\x05\xf6\x77\xe3\xf9\x53\x72\xfe\x70\x27\xe7\x37\x46\xf4\x71\x85\xf6\x6e\x58\x3b\x7f\x0e\x2b\x75\x3e\xad\xda\x79\xd2\xe2\x00\x32\x84\x8d\x97\xae\x82\x46\x83\x10\x15\x38\x7e\xb6\x79\x16\x15\x08\x6d\x43\x1a\x15\x4f\xb7\x51\x15\xa0\xfe\xf6\xa8\x12\x5c\x95\x77\xe3\xaa\x43\x96\xad\x32\xf1\xc4\x36\xd5\x96\xa6\x3e\xbd\x9b\xbc\x7f\x0a\x6e\x02\xbf\x7a\x73\xf1\xa7\xe7\xc9\xfe\x70\x1d\xe9\xab\x02\x17\xf9\x41\xd3\x7b\xc5\x57\x63\x98\x45\xde\xb4\x55\xac\xa2\x65\xa0\x8d\x3d\xa0\xd6\x12\x23\xf6\xab\x22\x0a\xc1\xda\x81\x1a\x45\x6d\x59\xd5\xcb\x7a\xb0\xb6\x69\x6c\xb9\x00\x19\xb0\x00\xe5\xa7\x48\x01\xae\x3f\x5b\x67\x88\x67\x83\x77\x65\x61\x55\xf0\xbe\x11\x25\x91\x97\xa1\x86\xb5\xbf\xc4\xcd\xfc\x82\xdf\x72\x91\xf9\xc3\x8f\x64\xfe\x86\x31\x7c\xcb\x6c\x57\x7e\xf4\x46\xac\x79\x38\x1f\x56\x70\xc6\x2b\x13\x4b\x21\x86\x23\x44\xc6\x08\x5b\x41\x95\x28\x80\x40\xff\x79\x00\x87\xe8\x80\xa9\x03\x0d\x72\x4a\x52\x8f\x51\x2c\x52\x3b\x00\xaf\x52\xc7\x93\xaf\x45\x89\xef\x46\xd9\xf7\xde\xf7\x3e\x8d\xb2\xbf\xd4\x63\x99\x27\xb1\x23\xeb\x36\x71\x1e\xbf\x4b\xfb\x99\xec\xd5\x73\xff\xf3\xc3\x8d\xcb\xee\x31\xc1\x36\xef\xb6\x9b\x77\xa9\x75\xf6\x12\xa8\x5f\x5d\x5a\x65\x1f\x5f\x7f\x6f\x80\x4e\x9c\x74\xa0\x9c\x8f\x01\x14\xd1\x2f\x62\x44\xb3\xe9\x79\x15\x8f\x70\x4f\x22\x45\x83\x3e\xd4\xa0\x8e\xb2\x00\x4d\x94\xab\x71\x1c\xfd\x38\x0f\x2e\xef\xc7\xd9\x00\x94\x37\x9f\x1b\x8f\xcb\x22\xe8\xfe\x29\xdb\xdb\x11\x4c\x60\x8a\xfe\x30\xb7\x07\x4a\xb3\x3c\xdf\x67\x64\x53\x6d\x4d\x92\x31\x03\xe9\x8a\x7e\x49\x53\x92\x74\xd7\xce\xbb\x7c\x3f\x86\x71\xac\x63\xed\xda\xb1\x1d\xc7\x0d\x02\x3c\xb6\x3e\xb6\xb3\x32\xab\x12\xf0\x73\x03\x4c\xd2\x77\x2d\xae\xf1\xee\xdf\x65\x8f\xd7\x4a\xfb\x0c\x3c\xa4\x0d\xdb\xbb\x87\x25\xea\xfd\xb0\x04\xed\x17\xf7\x4a\xef\x1f\x3e\x82\xfb\xec\xe8\xb9\x62\x73\x7d\x54\x1c\xd5\x8e\xf9\x01\x38\x69\x1b\x46\x2a\x57\x30\xe7\xa8\xd5\xd1\xd4\x15\x04\xde\x47\xea\x3b\xc8\x52\x19\x78\x1f\xe9\x06\xc5\x11\x63\xa3\x28\xcf\x8f\x7b\x3b\x6a\xc9\x0e\x04\x85\xc4\xe1\x9c\x87\xa7\x8c\xcc\x03\x66\xf8\x6c\xb4\x5e\x39\x1e\x55\x3f\x4f\xfb\xec\xdf\x65\xec\x89\xad\xc9\x56\xdf\x75\x59\x5e\xce\xa7\xbf\x74\x3b\xbf\xd9\xee\x12\xc3\xc4\xeb\x0b\xb1\xc4\xe6\x97\xef\x76\x9b\xaf\xb2\xd6\xe7\xec\xf5\x5b\x34\x08\x6f\x1f\x2e\xb7\xf7\xb7\x16\xcd\xbc\xf2\x55\x05\x8a\x4e\x10\x3e\x9f\x84\xe4\x80\x82\xa0\x9d\xbd\x2c\xae\x8a\xb1\x3c\x71\xd7\x48\xc6\xa2\x48\x5f\x38\xcf\x33\xce\x20\x86\x0c\x56\xce\x5a\x67\x9d\xb3\x16\x14\xd6\xba\xad\xc6\x10\xd9\xda\x10\xc2\x10\xa7\xe6\x60\x38\xf5\xc7\x68\x55\xab\x9e\xdf\xa2\xb9\x50\x04\x14\x24\xa4\xea\xf2\xe5\xd5\xe6\x87\x78\xbc\x94\x9f\x6c\x32\x9f\x6a\x79\x4c\xf6\xfd\xdd\x7c\xbd\xbf\x4c\xd8\xeb\x7b\xbe\xed\x2f\x93\xf8\xf0\xfe\xf5\xea\x9b\xf3\x95\x23\xaf\xa5\xf4\x35\x67\xb0\xf0\x25\x6b\x3c\x8f\x93\x11\x95\x6d\xa9\x1b\x51\x9a\xb0\x10\x71\x3d\x42\xf1\x0c\xa2\x6f\xe2\x91\x70\x23\xe9\x40\x71\x40\x09\xa1\xa6\x8a\x07\x8c\x1d\x23\x74\x55\xc6\x93\x8d\x16\x33\x72\x76\x9c\xaf\x0c\x8f\x62\x3f\x1f\xf6\xa9\x87\x86\x5e\xcf\x08\x5e\xa7\xea\xad\x4b\x0e\xfe\x2c\xf3\xcf\xbe\x2d\xf4\xe3\x0b\xa1\xbf\x94\x05\x6f\x58\xa8\xad\x6c\xf7\x88\x29\x5c\x84\x52\x0e\xad\x88\xae\x36\x55\x3d\x32\x0f\x10\x6a\x20\x04\x53\x3d\xfb\x1a\x94\x28\xb5\x40\xa4\x36\x88\x24\xb7\x95\xb4\x45\x90\x38\xb4\x17\x6c\x99\xa9\x03\x25\x4e\x30\xb6\x2a\x9f\x32\x77\x27\xb8\x88\xa2\x9f\xa7\x3e\xcb\x36\x00\x2f\xf1\x6b\x7d\xcc\xfe\xed\xdd\x58\xbf\xfe\x61\x09\xb5\x0f\x4b\x40\x78\xf5\xfe\x82\x75\xf6\xfa\xcb\x0d\xd5\x5f\xfe\xf2\xc3\xee\x85\xd8\xcf\x84\xe2\x7d\x5e\xa1\xd8\xc4\x3d\xf3\x39\x92\x1e\x10\x50\xca\x38\x44\xcf\x02\xc8\x58\x51\x17\x2e\xd6\x93\xdd\xb7\x10\xe6\x63\xf8\x3c\x06\x30\xa0\xd8\xac\xd1\xe7\x71\x79\xad\x86\xd1\x3a\x8e\x45\x8e\x82\x03\x65\x8d\x89\x65\x58\x55\x10\x4b\x1c\x04\xe3\x12\x51\x34\x23\x4a\xf3\x11\xc7\xc1\x45\xed\xb2\xe7\xbe\xa5\x7f\xb5\x31\xc7\xa1\xf1\xb2\x3b\x20\xae\x49\x11\x4a\xb5\xef\x44\x34\x8d\xad\x9a\x23\xf5\x00\xc3\x06\xc2\x3c\xab\x67\x5d\x03\x88\x9a\x5b\xe5\xfa\xd6\xc4\x03\xbd\x8e\x39\xf6\xbf\xeb\x98\x6f\x57\xc7\x27\xba\xeb\xb6\x22\xfb\x2e\xfb\xd3\x54\xe5\xf2\x8f\xb7\xb3\x92\x2f\x57\x83\x09\xd3\xe7\x87\x54\xba\xf6\xb2\x57\x7a\x93\x8a\xa7\xbf\xb4\x84\x2e\x6b\x4b\xe2\x12\x4a\x18\x40\xdf\x6f\xa5\xa2\x9c\x51\x49\x99\x16\x8c\x8b\x9a\x4b\xc1\xe7\xc9\xe7\xd4\x9f\xeb\xbd\x55\x8d\x0e\x60\x6a\x9c\x74\xf5\x53\x56\x57\x08\xec\x85\xf7\x83\x1a\xea\xf6\x29\xa3\x87\x20\x18\x61\x6a\xaf\x85\x32\x24\x86\xad\xe0\x42\xa4\x3f\x23\xb1\xc6\x8b\x96\x8c\xb3\xf9\x94\x17\xb3\x85\xcc\x3b\xad\x8d\xb4\xda\x49\x09\x39\xb3\xbd\x11\xcc\x09\x63\x85\xe3\x72\xd9\xea\x99\x8e\x18\x21\x4d\x91\x6d\x13\xfe\x5c\xbd\x15\xd9\xc3\x95\x45\xf7\x1f\xd2\x39\xea\x45\xd7\x7f\x91\xaa\xdb\x2d\x51\x54\x70\xa6\xbc\x95\x94\xcb\x8e\x6b\x29\xe6\x7d\xc8\x95\x3f\xeb\x83\xd3\x8d\x0a\x39\x0c\x4e\x99\x10\xbb\x50\x56\x60\x10\x2e\x1c\xf5\xa1\xed\xe3\x44\xa7\x46\x30\xc6\xd4\x68\xb8\xd6\x34\x86\x62\x2b\x38\x17\x94\x2a\x2f\xc9\x4d\x53\x1c\x2b\x70\x9c\x03\x64\xcb\x9f\x70\x6a\xd1\xd4\x41\x8c\x7d\x6b\x24\x77\xd2\x18\x99\x34\xe5\xc4\xb4\x58\x27\x4d\xb3\x6c\x9b\x77\x89\xc7\xea\x7e\x5e\xaf\xba\xbe\xf9\xc2\x36\x7e\xaf\xec\xfd\xb1\xdf\xb3\xb2\x77\x04\xdf\x4b\x68\xbf\x2a\x0b\x25\x53\xad\x12\x32\x18\xa6\x8c\xd2\xcc\x59\x3d\x6b\x9f\x1f\xc3\xe7\x09\x94\xd6\xee\x55\x97\xf3\xae\x56\xa1\x8d\x43\x80\x38\x4f\x85\x36\x95\x8e\xd3\x78\x8a\x35\x03\x74\x54\x42\x48\x09\x0a\xad\x6c\x2d\x22\x5e\xe6\x96\x5b\xcd\x59\x52\x98\x11\x49\x39\xe7\x2f\xe7\xd6\x68\x7b\x99\xdb\x4e\x2f\x1a\x5b\x2b\x1d\x57\x5c\x72\x6a\x5a\xb2\x68\xbc\xd8\x31\xfe\x4a\xdf\x7f\xf8\x2d\xfa\xbe\x9c\xdc\x9b\xba\xbf\xfc\x86\xba\x5b\xa4\xa8\xac\x15\x17\xde\x50\xa9\xa5\xe6\x56\xab\xd9\x87\xbc\x0b\xe7\x6a\xb2\xba\x55\x75\x4e\x5b\xaf\x5c\x1d\x87\x9a\xe7\xa5\x6c\x1a\x90\xe9\xd3\x30\xc6\x81\x82\xb2\x53\x9c\x0b\x05\x32\x2d\x4d\xe0\x91\x15\xdf\xd0\x56\x5c\x2c\xd9\x54\x5f\xb4\x15\x02\x06\xdb\x19\x91\xa6\x57\x38\x26\xb9\xe2\xd4\x74\xd4\xf0\xcb\xf4\x66\xdb\xdc\xa6\x5c\xef\x1b\x7e\xfb\xfb\xce\xef\xfa\xc7\x0a\x67\x8a\xcb\x56\x49\x59\x5b\xa6\x8d\xd6\xcc\x5b\x33\x4b\xbf\x2a\xfc\xe7\x71\x59\x57\x07\xdd\xe7\xb2\xaf\x65\xe8\x62\x5b\x43\x94\x13\xdd\xf5\x00\xaa\x78\x38\x3e\x65\xd1\x51\xc0\x0f\x4a\x24\xa5\x95\x72\x0d\x8f\xe8\xa6\xb4\x60\xea\x6e\x8a\x63\x96\x67\x37\xa5\xad\xba\x4e\x31\xf5\xad\x96\xcc\xdf\xa6\x58\x2c\x46\x4d\x35\x97\xa6\xbc\x60\xa0\xb2\x1d\x5f\xd7\xd9\xcf\x9f\x4f\x75\xff\xf7\x1b\xa6\x6d\xea\x1b\xb9\xb1\x7c\xa4\xea\x8e\x7c\xb3\x0c\xc1\xcb\xf3\xbe\x4f\x97\x0b\x92\x8f\x17\xfe\xdc\xd5\xfd\x8d\xe0\x15\x76\x5d\x52\x57\x56\xf1\x18\x1b\xd4\xb5\x75\x5b\xf5\xc6\xcb\xb6\xb1\x9c\xfb\x53\x1c\x87\xa6\x82\xe0\x58\x57\x30\x27\x7e\x54\x0a\x59\x63\x2a\x1c\xb1\x30\xba\x77\x86\x05\xaa\x4e\x0c\x79\xc4\x1c\x81\xa1\x22\xfb\x00\xb5\x57\xb9\xf6\x0d\xc1\x98\x41\x6b\x5b\x58\xfa\x00\x32\xbc\xf7\x45\x25\x0d\x89\xf5\x01\x42\x82\x73\x85\xa4\x38\xb7\x71\x44\x35\xe2\x75\x2e\x3b\xa3\x0f\xa7\xba\x11\x6d\x88\xa3\x0d\xa4\xb6\xa5\x6b\x70\xe3\x30\xea\x1d\xb7\x59\xb6\xc9\x4f\x4f\x6c\x37\x6c\x55\xf6\x2a\xf5\x7c\x7f\xc1\xd0\x7c\x7c\xde\x33\x27\x10\xa4\x57\x6f\x3f\x5c\x1b\xa9\xaf\x49\xfe\xfb\x32\xdf\xbd\xfb\x47\x00\xde\x3f\x7c\xff\xfe\x67\x77\xe9\x65\xc2\x63\xc5\x53\x00\x34\x4c\x53\x88\x7d\x98\x9c\x03\xc7\xaa\xaa\x51\x05\xba\xf3\x98\x8f\x67\x57\x2b\xa7\x35\xcf\x79\x5d\x14\x05\x47\xbe\xe0\xad\xe2\x71\x0c\x61\xb3\x0f\x21\x04\xdf\x34\x75\x1d\xb5\x4f\x3c\xf1\x7e\xef\x44\x1c\xe2\xa4\x0d\x1f\x41\x15\x21\x2e\x70\x40\x7b\x41\x44\x9e\xcd\x2e\xd9\xed\xf0\x64\x76\x6e\x8b\x9f\xbb\xa5\xfe\xfa\xca\x16\x9f\x1a\x04\x37\x2f\x98\x1a\xae\xcd\x39\x6f\xef\xa3\xee\x0f\x1f\x3f\xbd\x7d\xbc\x00\xd0\xed\xdc\xe7\xfd\x1a\x7f\xa6\x00\xaf\xca\xf3\xe4\x6e\x80\x9e\x07\x40\xaa\x32\x94\x65\x9e\x0d\xa5\x08\x4e\xd8\xbe\x8e\x07\x31\x86\x78\xa2\x78\x02\x1e\x21\xad\x38\xdc\xe2\xf0\x6b\x13\xb6\xdd\x34\x1f\x00\x93\x71\x2f\x63\x87\x51\x89\xa0\x73\x8a\x52\xc7\xb9\x46\xae\xa2\x52\x08\x8a\x11\xa4\xe6\x52\x0f\xfa\x52\xee\xbf\xca\xde\xff\x94\xdc\xcf\x62\xdf\xb9\xe2\xbd\xd8\x67\xbe\x6a\x3f\xf7\xa0\xc8\xf7\x33\xf6\x37\x30\xe4\x3d\x28\x60\x28\x4b\x30\xd4\x25\x3f\x49\xd5\x84\xa3\x68\xad\x76\x14\xf7\x40\x22\xa4\xa4\xa8\xbe\x21\xb3\x58\x44\x0e\x4a\x3b\xc6\x15\x72\x15\xc1\x58\x0a\x86\x11\x64\x26\xd5\xae\xe9\xdf\x5d\xe6\x8f\xdf\x12\xfa\x5e\x66\xb3\x72\x9f\x8f\x20\x7b\x6e\xd8\x58\x5e\x03\xc8\xaa\x32\x54\x05\xa8\x43\xc1\x8f\x42\xd5\xee\x20\x1a\xa3\x8c\xea\x81\x84\x48\x70\xfe\x2d\x99\x2f\xe3\x5c\x0b\xf3\x45\xe8\x8e\x61\x88\xf8\xa5\xb7\xa4\x79\x32\xeb\x97\xf6\x71\x27\xf3\x9b\x7b\x99\xdf\x7f\x65\x1e\xbb\x77\x1f\xff\x09\x5c\x85\x7e\xf3\xf1\xd3\xda\x9d\xdb\x15\x3f\xc3\xd3\x92\x1d\xd9\x65\x3b\xb8\xbc\xfa\x09\xf9\xa2\x04\xce\x95\x4c\x2f\xc9\xb8\xdb\x0b\x47\xb8\x34\xaa\x03\x02\xa2\x9a\xfe\xe4\x28\x37\x9c\x50\xc7\x98\x44\xae\x84\x30\x89\x4c\x99\xce\xb6\xab\xee\xc9\xee\xdc\x16\x7d\x7b\x8c\xbf\x96\xf7\x47\xe2\xbe\xb4\x8b\x61\x45\xce\x78\xca\xdd\x6c\x5c\xda\x64\x9b\xe8\xba\x23\xf4\x15\xb0\x8b\xb8\x4a\x08\x6f\xf6\xc2\x12\x3e\x12\xd4\x00\x06\x11\x67\xac\xdc\x22\xf7\x6b\xe5\xb6\xcd\xf1\x5e\x5e\xe6\x82\x22\xd4\x5e\xc4\xad\x90\x5c\xac\x02\x22\x66\xb2\x6d\x16\x9e\xcc\xba\x7c\x61\x13\x7f\xf3\xbb\x8f\xef\xa7\xbb\xe1\x2d\x67\x98\x1f\xce\xee\x94\xf3\xb9\x75\x80\x26\x42\xb2\xbe\xef\xa0\x2f\x0b\x20\x4c\xc9\x84\x10\x5c\xab\x5e\xd4\x52\x28\xe1\x00\xac\x2a\x4d\xca\x9f\x1a\xdd\x96\x5f\xc5\xb5\x15\x7d\x1e\xdc\xc5\x1e\xd6\xe8\x47\x36\xfc\xdb\xe5\xfd\x91\xdf\xa5\xe1\x9d\x71\xbe\x3f\xd7\x53\x8e\xe6\x31\xe1\x59\x2f\xaf\xbe\x87\xae\x28\x81\xb0\x25\x19\x24\x37\xaa\x13\x41\x70\x89\x61\x62\xfb\xff\x4a\x5e\xaa\xe2\x5e\xc5\x46\x96\x08\x99\x96\xdb\x8b\xb8\x70\xf1\x39\xc9\x09\xe1\x57\x1e\xad\xd3\xb5\x7e\xe3\xb2\x53\xfe\xc2\x33\x7b\x09\xc3\xf9\xdd\xdd\xe3\xc3\xfb\x8f\xbb\x5b\xb7\xff\x0d\x9c\x3f\x9d\x29\xac\x5d\x53\xc1\x3c\x9b\x8b\x95\x39\xbb\x95\x2b\x95\x25\x1a\x3a\x8c\x50\x79\xb6\x47\xa4\x73\x31\x37\xb9\x38\xd7\x61\xf4\xfb\x30\xe3\xb0\xb5\x88\x92\xd9\x2b\x2b\xe7\x69\x5f\x85\x52\x02\xbe\x66\x7c\x6f\xed\xc9\xda\xf3\x69\xd8\xef\x87\xd8\x25\x7e\xb5\x54\x4b\xa0\xff\x85\xb2\xf1\x06\xa2\x1c\x9d\xf7\xab\xfe\x4c\x57\x43\xa9\x1c\xb1\x95\x23\x04\x96\x67\x36\x61\x77\x41\xbc\x3e\x8b\x70\x0c\x53\x38\x9f\xee\x65\x3b\x8d\x55\x28\x0d\x20\xf7\xb2\x8d\xe3\xb3\x6c\xe4\x5a\xe7\xf0\x2a\xfb\x93\xec\x57\x29\x97\xf9\x82\xa1\x76\xe5\x5a\xbf\x71\x0d\x6d\x9e\x59\x02\xee\x19\x7b\x57\x77\xa8\x6b\x0f\x6f\x1f\xd2\x19\xd1\xa7\xc7\x95\xab\x01\x49\x10\x61\x4b\x7a\xb6\x4c\x7a\x3e\x09\x2a\x98\x38\x6b\xd0\x2e\x0b\x75\x95\xb3\xa8\x3c\x10\x2c\x32\x2f\xba\xe8\x59\x62\x45\x2e\x41\xd5\x00\x94\x6a\x54\x9b\x38\x90\xa3\x1d\x70\x3c\x6d\x6d\xdf\xf7\xae\x69\x9a\xc6\x0d\x98\x2a\x86\xbd\x90\x84\x11\xd7\x73\x6f\x00\x8a\x07\xeb\x65\x1b\x51\xdb\xb6\xad\x4f\xcc\x01\x87\x56\x87\x21\xcb\xf2\xbc\xc8\xc8\xba\x79\x3e\x3f\xba\xb2\x8e\x3e\x9f\x1f\xa5\x1e\xf3\xbc\x00\x59\x0d\xb2\xa7\xac\x8b\xca\xef\x9f\xb2\x84\xdd\xf6\xed\x53\xa4\xd5\x1a\x26\x0e\x1d\x76\x3d\x91\xc9\x5e\x76\x64\xdd\xae\xf9\x53\x57\xed\xe3\x4e\x70\x2e\x03\x6c\x28\x8e\x3d\x6a\x5c\x5f\x2f\x2a\x2d\xaf\x2d\xfb\xe7\x4e\x88\xd2\x97\x18\x9c\xa2\x8b\x83\x04\x0c\x84\x55\x1b\x11\xa0\xe7\x23\x60\xa9\x46\xb8\x49\xfb\x25\x93\xfd\x79\xf6\x8b\xec\xfd\xf5\xc4\xe7\xeb\x7c\xeb\xd3\x73\xbe\xb5\xfb\xf8\xe9\x1d\x78\x9f\xce\x75\x1f\x52\x9a\xb1\xec\x79\xf3\x04\x7e\xfb\x43\x82\x33\xbe\x3b\xfb\x79\xb8\x82\xd1\x6c\x84\xa6\xa6\x82\xf1\x14\x0f\xc8\x59\xad\x61\x6b\x9c\xf4\x92\x73\xea\xba\xc1\x59\x3c\x33\xdf\x18\xbf\x3a\x85\x12\x55\x85\xad\x98\x52\x74\x6e\x43\xae\x18\x23\xb2\x92\x08\x5d\xa2\x0e\xa0\xeb\x7d\x68\x97\x6d\x14\x34\xdc\xc2\xd2\x85\x13\xda\xbb\xb2\x92\x06\xc7\xc6\x43\x2c\xc1\xfe\x3c\xce\x21\x1a\x09\x74\x0e\x57\xe8\x9f\xf7\x98\x9d\x70\x1c\x35\x95\x36\xf6\xab\xee\x7c\xe4\xac\x74\x15\x76\xe0\x64\x8d\xb5\x69\x3f\xdf\x24\x4e\x19\x93\xf8\x13\x1e\xb3\xbf\xbf\xa0\xaf\x5f\x66\xee\x37\xb0\xe1\x7e\x33\x67\xb9\x5b\x48\x57\x07\x60\x3c\x30\x71\xd4\x83\x6a\x8c\x57\x9d\xea\x55\x3c\xe6\xbd\xc3\xdc\xb2\x58\x72\x62\x31\xe7\x00\xc1\xaa\x2e\x21\x38\x79\x22\x1b\x2f\xed\xd0\xc6\x8e\x9d\x6a\x1b\xec\x04\x02\xc6\x4a\x09\xb2\x9e\x96\xc5\xcc\x06\x6b\x5d\xf3\x94\x81\xac\x77\xc6\x76\xe0\x80\xbd\x61\xca\x2a\xc3\x8d\x3e\x53\xce\x4b\x4e\xfd\x60\x18\x77\x5c\x5a\xec\x4a\x49\xc8\x49\x71\x88\x64\x9d\xad\x32\xfb\x84\x77\x66\x7d\xc8\xde\x5e\xab\x23\xde\x3f\xbc\x7f\xe9\x55\x4b\x16\xb9\x4e\x88\x07\xd7\x4c\xf2\x3d\xb8\xf1\xea\x5f\x0e\xfc\x7e\x95\x5f\xb7\x0e\x97\xb2\xe8\xcd\xc7\x4f\xab\x36\x0c\x8e\x59\x42\x81\x9e\xbb\x11\x28\x1a\xc9\x88\x42\x19\x8f\xd1\x69\x40\x41\x35\x37\xc0\x12\x66\x35\xdf\x9f\xf7\x39\xc1\xb0\xa5\xeb\x2c\x52\xa2\x40\x79\x92\xfd\xe8\x51\x3c\xc4\x8c\x03\x77\x1a\x0e\x8c\x46\x98\xd7\x08\x83\x60\xe8\xfa\x10\x8f\xcb\x96\x88\x7a\x8f\x03\x07\xc5\xf1\x78\xb2\x81\xd6\x9e\x33\x61\xcc\x3c\x31\x5a\x1a\x67\x25\xa5\x9e\x61\x54\x58\xe2\x20\xc3\x58\x08\x82\x04\xd3\x29\x5f\xbe\xe0\x6a\x5c\xe6\xf1\xef\xae\x18\xed\x97\x79\xdc\xdc\xcf\xe3\x3d\x95\x0e\x78\xbc\x5f\xab\x7f\x48\x7b\xc2\x1f\x2e\x6a\xa6\x59\xe4\x60\xf0\x60\x88\xc1\x83\x42\x4f\xc1\xfb\xa3\x3e\xb9\x58\x37\x8a\x3a\x22\x57\x95\xa7\xd2\xcb\xf3\x00\x14\x6b\x68\xce\x7a\xa6\xc7\x5e\xd6\x71\x1a\xa2\x61\xa0\xea\xe2\x41\xd0\x78\x00\x23\xa5\x46\x6b\xba\x3e\x2d\x13\xe9\x82\xb3\x4d\x1f\x47\x50\xee\x9d\x33\x0d\x38\x6a\xcb\xad\xa1\xd8\x1b\xae\xce\xba\x29\x83\x1f\x0c\xe7\x5e\x68\x87\x7d\x29\x94\xb5\x7a\x99\xc6\xe6\xc2\x7d\x44\x77\xf5\xa6\xc8\x36\xa9\x57\xf3\xc2\xa5\x75\xb9\x82\xf8\xa2\x65\xea\x86\xbc\xe2\xc8\x81\x67\x05\xaf\x70\x83\xcf\x78\x5e\x37\x0d\x97\x89\xd4\x92\x58\x2c\x43\xce\x5c\xce\x22\x6f\x40\xa9\xe3\xd8\x39\xd8\xc6\x83\x1a\xfa\xe8\x56\xa3\xa7\xd2\xca\xb3\x00\x9e\xd6\x89\x5a\x7f\xcf\x54\xdf\xc8\xfa\xb4\x8f\x8a\x81\xaa\x8f\x2d\xa7\x71\x00\x07\x4c\x00\x32\x6c\x53\x70\xc9\xa5\x38\x00\x14\x47\xa7\xa4\xf5\xed\x71\x1a\xad\xa3\x1e\x2c\xfb\x77\xce\x67\x64\x2b\x82\x7d\x50\x84\x78\xc6\x35\xf2\x25\x95\x52\x32\xc2\xd8\xe2\x8b\x2b\x10\x9e\xe8\xce\xaf\x43\x9a\xbf\x7f\x4a\xfa\xa5\x15\xe9\xc6\x62\xb2\x68\xf8\xc3\x5d\xbf\xe7\xe2\x87\x37\x43\xbd\xdb\xe1\x7e\xfc\xf4\xb8\xf9\x98\x4a\xe2\x4a\x4e\x3a\xdf\x71\x62\x21\x9a\x22\x9a\x12\xc4\x41\xe2\xfb\xef\x14\xa8\x8e\xb1\x02\x25\xc2\x07\x70\x60\x35\x59\x55\x71\x12\x16\x1c\x96\xcd\x6d\x3c\xcd\x27\x06\xf4\x69\x5c\xb6\x3f\x3e\x3f\x05\x11\x19\x21\xeb\x20\x44\xd3\x70\xc9\x09\x72\x8e\x06\x75\x98\xc6\xce\x38\xe6\x1d\xc1\xb3\x35\x95\x5c\x76\x4f\x46\x52\x83\x7c\xc9\x08\x12\x6a\xe4\x8e\xd3\x6c\x93\xd7\x57\x3e\xe7\x8b\x5d\xfe\xe7\x6f\xda\xe5\xe6\x6b\x86\xf4\x9b\x07\x7e\xcb\x30\x37\x1f\x3f\xe5\x27\x70\x0c\xe0\x18\xad\x07\x85\x3a\xd5\x21\xc4\x49\x81\x2c\x44\xdf\x18\xe6\xa8\x5e\x49\xc7\xb4\x53\xe7\x1a\x38\x0c\x6b\x96\xdb\x03\x37\xd3\x5e\x74\x71\x1c\xa3\x60\x80\x0c\x71\x90\x6c\x99\x35\xca\x40\xe6\xd8\x25\xc6\xf8\x3a\x99\xe6\x11\xa0\x83\xb7\xa6\x01\xa7\x64\x9a\x0c\x07\xc3\xf4\x59\x0b\xbe\xd8\xa6\x65\xc2\x49\xb5\xd8\xa6\x94\xce\x68\xce\x64\x73\xc5\xb6\xa7\x89\x4f\xe0\x16\x43\xff\xcb\x0b\x1d\x7f\xf1\xee\xda\x07\xf9\x13\x31\xf4\x1a\x66\x7e\xa4\x64\x9d\x97\x21\xaf\xa2\x6a\x00\x5a\xac\x32\x34\x69\xda\x9a\x64\x95\xdc\x7a\x33\x93\xa4\xad\x01\x0e\xc1\x06\xc1\x55\x16\x27\x66\x40\x76\x10\x43\x1c\x8e\x91\x30\xc0\xc7\x68\x04\x8b\xfb\xc5\x07\x81\x30\xfc\xaa\xa8\xb7\xae\xe9\x62\x0b\xdc\x53\x56\x2f\x9a\x4e\xc9\xfd\xcc\x12\x4d\xd5\x19\x33\x56\x52\xea\x3b\xcd\x85\x93\xda\x2f\xaa\x9a\x25\x10\x4b\x11\x2e\xe7\xbf\x30\xe1\xb1\x99\x7f\x79\x9c\xf9\xe5\xbb\x57\xcf\x71\x46\x83\xce\x83\x3e\xd6\x1e\x64\xfa\x18\xbc\x3d\xea\xc9\xc5\xa6\x91\xd4\x61\xb9\xca\x3c\x91\x5e\x9c\x4f\x40\xb0\x9a\xe6\x74\x89\x33\x9d\x68\x9e\xb2\x21\xda\x25\xce\xb8\x65\xfa\x41\x47\xa8\x5e\xc2\xcc\x11\xf8\xa8\x6d\x70\xb6\xee\xe3\xe1\x16\x66\xa6\x1f\x87\x19\xcb\xb9\xbb\x86\x19\x82\x41\xf6\x1c\x67\x12\xb7\xe2\x7e\x6b\xb2\x3f\xbc\x63\xe7\x7d\x7f\x2d\xe4\xf9\xb4\xe4\x66\x3f\x5c\x59\x3c\x5e\xdc\x8a\x6c\xbe\xe6\x5a\x05\x17\x5e\x53\xd0\x85\x60\x3d\xed\x42\x1c\x01\x02\x30\x38\xa9\x7c\x4f\x15\x2c\x5d\x29\x3a\xcf\x80\x92\x92\x72\x64\x08\x9e\xa7\x90\x37\xf3\x94\x97\x5b\x33\x57\x8e\x91\x9a\xd0\xe0\x9a\x03\x11\x56\x32\xcf\xb0\xc7\x83\x60\x62\x3a\xf7\x42\x96\xbe\x64\x3a\xb6\xeb\x2c\x1e\xbd\x77\xce\x25\x4c\xa2\xcb\x5d\xdb\x1f\x26\x7e\x8e\x4b\xd5\xc7\x4f\xc8\xfc\xb3\xdf\x41\xe8\x35\x09\xc1\xd6\xa4\xab\x97\x8c\x03\xe0\xe0\xb4\xf4\x03\x62\x12\x17\xbe\x94\x5d\xc7\x81\x96\x2a\x61\x9b\xd3\x79\x08\xf9\x7e\x1e\x72\xf2\x52\x6a\x2a\x8c\x66\x1e\x41\x14\xbe\x25\xf6\xe4\x5c\xc2\x4b\xde\x64\xe6\xc9\xed\xfc\x5a\xdd\x61\xca\x3c\xa3\x2b\x7c\xe1\x48\x7c\xfd\x38\x6d\xe1\x3f\x1f\xfc\xfa\xf4\xb9\xa8\x57\xdd\x99\x2d\xaf\x28\x76\xd5\xe9\xb8\x56\x5e\xcf\x08\x34\x4d\x24\x75\x94\x7e\xc9\xaf\xd3\xd9\x19\x5b\x1f\x52\x7e\xfd\xf3\xec\xf1\x82\x0d\xf3\x55\x21\xdc\x2f\x2e\xed\xab\xb7\x39\x9a\x6a\xbc\x3e\xd6\x5e\x85\x2a\x68\x46\xab\xcf\xda\x75\x1a\x64\xab\x71\x46\x21\x1f\xe7\x3e\xa7\xeb\x03\xd4\x9f\x4f\x4f\x59\xe5\xcb\xfd\xaa\x3c\x04\x33\xaa\x19\xd9\x95\x88\x63\x5d\xbb\xd4\xbc\x0d\x32\xf2\xc4\x56\x28\xe1\xbd\x64\xaf\x1e\x2f\x37\xa7\xcf\x5d\xee\xf9\xee\xdd\x77\xaf\x1e\x03\x28\xfd\x34\x29\x2e\x11\xf6\x3a\xa8\xa3\x79\xca\x36\x05\xd0\xd1\x07\xae\x84\xa3\xf4\xf3\xb4\x6a\xe3\x61\xb2\x80\x81\xfe\xb2\xc7\x6a\x9f\x6b\x46\x9e\xb9\x96\x3f\xfc\x68\xb7\xf0\x17\x60\xbb\x7b\x2c\x77\xdb\xbb\xa3\xbf\xef\x77\x97\x1b\xe5\xe4\x7a\x1f\x1e\x5f\x3f\x5c\xb0\x95\xab\x90\xfe\x8b\xc7\x90\xfe\x6b\xea\xa2\x5c\x55\x8c\xf4\x2a\xc0\x41\x88\x0a\xcd\x82\xe5\x24\x22\x4f\xa9\xee\xf3\xe2\x82\x8e\xbd\x49\x20\xaf\x7e\xf9\xc7\x21\x84\xce\x7c\xf0\xc8\x23\xd5\xe5\x43\xe1\x67\xe2\xf2\x93\xa0\xe6\x10\x4d\x5d\x5f\xfb\x89\x33\xfb\xc4\x76\x66\xa5\xb2\x3f\xce\x7e\xfe\x05\x21\xeb\xd5\xf5\x8c\xee\x16\xf1\x36\xef\xbf\x98\xde\xc7\x0f\xe0\x2b\xfe\xf4\x1b\x29\xf0\x0f\xef\x1f\xde\x5a\x70\x2c\x91\xc7\x10\xec\x29\x0c\x10\x83\xe9\x9f\x8b\xcd\xe8\xb9\x66\x14\x32\x86\xe0\x7c\x90\x82\xb0\x4a\x62\x3c\x1f\x7c\xde\xce\x87\x1c\x02\xe1\x7d\x3e\x60\x84\x08\xe3\x1c\x51\x62\xc9\x3c\x29\x5e\xb9\x0a\x12\xb0\x9f\x8f\x8c\x57\xba\x20\xe8\x90\xb7\x1d\xe7\x52\x88\x53\x24\x09\x9f\xd6\x5f\xf7\x00\x9b\xec\x8f\xb3\x3f\xbf\xd6\x1b\xfd\xdd\x3d\x6b\x5e\xaa\x1f\xf8\xf8\xea\x4e\xf2\x0f\x3f\xbc\x7d\x99\xef\x7f\x78\xb8\xd6\x29\x26\xc2\xae\x26\x55\xc4\xe6\xa2\x26\x14\x64\x9f\xa7\x5c\x0a\x1b\x98\x5a\x04\xe7\x28\xd2\x36\x80\x83\x10\x10\x23\x02\xc9\xb2\x95\x3a\x3a\xb7\x35\x42\x53\x2d\x08\xb1\x2a\x04\x1f\xd5\xe7\xd1\x88\x2a\x54\x72\x1f\xf1\xfa\x78\xce\x94\x2e\x42\xa1\x57\x6c\x6f\xf6\x39\x9a\xb3\x6c\x9b\x1f\x73\xb7\xf3\xdb\x90\x24\xfe\x8f\xcf\x37\x89\xbf\x61\xac\x3f\x5c\x41\x41\xfe\x11\xbc\x18\xe8\x74\xb1\x7f\x04\x55\x05\x0d\x45\x80\x30\x64\x21\x02\xc5\x67\xb1\x1a\x3c\x95\x8c\x56\x94\xa1\x58\x2b\x65\xaa\x16\xc6\x83\x07\xed\xb2\xbd\x3c\x7a\xbf\x39\x61\xbc\x0c\x72\x1a\x65\x1c\x33\xc5\x4b\x5f\x09\xd0\xcf\x13\xe3\xa6\x28\x11\x1a\xf3\xba\xe7\x5c\x72\x0e\x8a\xc8\xb2\x6d\xe6\x9e\xd8\xce\xae\xa7\x1f\x8d\xf0\xb3\xac\x4b\x4e\x03\xbe\x96\xf7\x9b\x1c\xd6\x89\x80\x4c\x29\x06\x06\x4d\x03\xa6\x60\xf8\xe7\x02\x74\x88\xac\x4d\xe0\x5a\x09\xa8\x24\x9d\x1b\xad\x31\x43\x0a\xb3\xc8\x42\xb8\x91\xdc\xad\x90\xf7\xeb\x83\x90\x52\x11\x4e\xbd\x27\x38\x76\xe7\x41\x8b\xca\x57\x22\x3f\xcc\x99\x94\x65\x28\xb9\x8e\xfd\xaa\xb9\xb0\x39\x01\x3e\xf3\x0b\x2f\x59\xce\x77\xf5\xd6\x27\xd9\xff\xea\xf9\xe6\xf3\x8b\xd8\x69\xc8\xbf\x29\xfb\xcd\xaa\x6f\x54\x5b\x8b\x59\x6f\x74\x4b\x08\x98\x4e\x43\x9e\x61\x62\x25\x03\xfb\x25\xd0\x52\x75\x31\xeb\xb9\x91\x12\x11\x68\xf0\x3d\x81\xd3\xca\x7a\xbf\x75\x98\x91\x10\x30\x16\x5c\xf1\x78\x88\x85\xe2\xd0\xa3\xeb\x90\x17\x86\xc0\x3e\xf7\x1d\x7f\xca\xd8\x29\xd2\x6c\x9b\x99\x6c\x4a\x67\x34\xff\x5a\xe3\xed\x39\x01\x3d\xc5\x1d\x5e\x44\x9f\xc0\x01\xe1\xb5\x08\x5c\x69\x05\xb5\x26\xb3\x11\x32\xf1\xe3\xa3\xc8\xbc\x7f\x1e\x6f\x16\xc2\xd6\x0a\x2d\x15\x61\xcc\x7b\x46\x62\x73\x1e\xaf\xe3\x3d\x9d\x0f\x17\x04\x14\x1d\x87\xd5\x10\x27\x17\xb5\x03\x2c\x9d\x9f\xef\x52\xbd\x9c\xbf\xf2\x58\xfe\xfc\x05\xd6\x5e\xca\xf9\xbf\x1d\x49\x7e\xd2\x21\x13\x50\x37\x66\x38\x20\x56\xe7\xbd\x64\x1d\x17\xa0\xfa\xac\x57\x7d\xe0\x86\x33\xc8\x39\x82\xf3\x74\x0a\x39\x96\x82\x70\x28\x30\x39\x9d\x4e\xa7\x44\xcc\x66\x95\xa1\x46\x9e\x42\x43\x82\xf6\xe6\xf3\x45\x76\x48\x0e\x91\xac\x8f\x9f\x27\x25\x0b\x5f\xc8\x95\x18\xec\x90\x7c\x72\x97\xb0\x6f\x7e\x7f\xb9\x1f\xbf\x96\xfb\x7a\x56\x95\x6e\x2d\x06\x41\x02\x16\xfd\x0a\x0a\xda\x32\x06\xe8\xaf\x8f\x6b\x1a\xa4\x15\x1c\x2e\xdb\xbf\xb9\x8b\x7d\xc8\xb5\x10\x4c\x22\x4d\xc9\xed\xa4\x00\xa0\x3b\xe1\x6b\xe2\x17\xe1\x0f\x09\x8c\x02\xd2\xfd\x22\xfc\x73\x40\xa1\xbd\xeb\x73\x38\x67\x37\x8e\xf3\x2f\xf2\xff\x28\x0e\xee\xbe\x30\x2a\xfe\x4e\x71\x30\x0d\xbb\x61\x24\x60\xe6\x73\x2f\x48\xcb\xd8\xe9\xf3\xb0\x32\x41\x28\xbe\xc4\x41\x1a\xcb\xa3\xcf\x0b\x2e\x10\x43\x1c\xe3\xe3\xf1\x78\x04\x99\x73\x49\x6e\x2b\x96\x41\xf7\x66\x91\xdb\x88\xaa\x86\x72\x7c\x11\x07\xe9\x70\x8d\x83\x9b\x84\x61\xd1\x6c\x6d\xe2\xd9\xfc\x93\x84\x48\xf2\x1c\x05\x5f\x3f\xbe\xf9\x2a\x82\x7f\xa9\xb2\x7c\x78\x5c\x79\x60\x2b\x54\x63\x08\x9a\x33\x3a\xf1\xc5\x3c\x72\xd2\x52\x0e\xf8\xe7\x3a\x57\x1c\xc0\x30\x1f\x42\xc8\xe1\x7c\xd8\x74\x9c\x61\xa1\x3d\x5b\xf6\x3c\x9a\x90\xda\x86\xd0\xc4\xec\x4a\x97\x56\x00\x95\x65\x45\xaa\x47\xb1\x49\x8e\x57\xd9\xcf\x9f\x71\x51\x3e\xdc\xd5\x19\x7c\xfc\xe1\x1b\xdf\xee\x80\x7f\x5f\xd0\x21\xac\xa1\x17\x4a\x31\xcf\xad\x05\xbd\x17\x3a\xb1\x1b\x39\xd0\x79\xae\x8c\xf0\xd2\xdb\x31\xcc\x2a\x84\x84\x74\xe2\x41\x31\xab\xdb\xb7\x78\xda\x5a\xb2\x0f\x75\xc3\xc7\xae\x3f\x92\x7d\x1d\x6a\xbe\x6f\x87\xe3\xf3\xb3\xd9\x9c\x89\xd6\xab\x21\x15\xe8\xce\xc3\x38\x8e\xa9\xae\x8e\x5d\xd7\xc0\x3f\xcb\xfe\x26\xfb\xef\xcf\x9c\x75\x5f\xea\xef\xdf\x5e\xa8\x62\x3e\xa4\x4a\xa7\xf2\x2e\xe3\x78\xfb\x07\x60\xf7\xee\xe3\x77\xaf\xde\xa6\x8d\xdb\xf7\xbb\x1b\x00\xcc\xa5\x25\x3b\x0f\xfb\x70\x3c\xf6\xfd\x7e\x1f\xc6\xb1\xeb\xf6\xb9\xcd\x99\xf4\x94\x20\xce\x49\x59\xb6\xa5\xb2\x46\xcb\x52\xcf\x32\x27\x65\x11\xca\x9c\xcf\x87\x1a\x58\x1e\x4d\x57\x47\xaa\x40\xeb\xe6\x53\xa2\x92\x71\xce\xf9\xae\x5b\x3e\xfa\x99\x1e\x96\x40\xed\x40\x1d\x43\x1c\x8d\x92\xa0\x02\xe8\xcc\xb8\x28\x39\xf3\x4f\x99\xac\x0d\x20\xb1\x95\x41\x80\x32\x5b\xe5\xee\x4e\xaf\xff\xf6\xbf\xa8\xd7\x37\xd4\xda\xef\xdd\xe1\xd0\x75\xc3\xe0\x2e\x6a\xa9\x1c\x4b\x47\x28\xe2\x1c\x17\x55\x53\x48\x63\x95\x2c\xd5\x6c\xf3\xaa\x0c\x45\x8e\x63\xe6\x81\xe6\xd1\xb7\x75\x94\x0a\x78\x17\xab\x9b\x56\xae\xef\xd3\xfb\xcc\x8e\x65\x28\x99\x03\x4d\x6c\xe2\xde\x2a\x05\x0a\x80\xcf\xbc\x2e\x39\x0d\x17\xa5\x70\xec\x2e\x4a\xa5\xf9\x5a\xf6\x62\x7e\x53\x66\x7f\x96\xe1\xcb\xd9\xd6\xb3\x1e\x3f\xd2\x0f\xdc\xe7\xc0\x6f\xf3\x74\x83\xbc\xcc\xd6\x87\xf7\xdf\xdf\x8e\xc2\x2e\x87\x23\x8f\xb9\x3e\x8d\xe3\x34\xf9\x69\x4a\x1f\xa7\xbc\xc9\x99\x50\x4c\x54\x82\x57\x55\xd1\x94\x5c\xea\x50\xda\x19\xe5\xb8\xf0\x45\x6e\xe7\x83\x05\xad\x89\x32\xb0\x79\xe4\x60\x2f\xe7\x29\x1f\x95\xd1\x56\x29\xab\x8d\x72\xce\xe5\x26\x56\x4b\xea\x5c\x71\xe0\xe2\x71\x12\xd2\x02\x3b\x23\x42\x29\x71\x8d\xf6\x7e\x3a\x19\x27\xba\x0b\xde\xfe\x32\x4f\x66\x2d\x52\x85\xf4\x7f\xbb\xaf\x8f\xbc\xfe\xfb\xf6\x0b\xdd\xcd\xdd\x3c\x7d\x7c\xf5\xf8\x47\x60\xf7\xee\x1f\xc1\xa7\xb7\xe0\xc5\x89\x39\xb8\x6c\xba\x07\x40\x13\xfe\x4c\xf2\x0e\x12\x87\xb0\x64\xb6\x89\x6f\xaa\x5f\xb1\x55\xa1\x6a\xa6\x2a\xc5\x19\x2a\xe3\x54\x6a\x67\x8c\x2a\xf7\xe7\x90\x1f\xaa\x62\xc9\x8f\xd1\x4c\x4e\x60\xa2\xf3\x3e\x1e\x9a\xd9\x51\x70\xaa\x67\xb7\xce\x84\x70\xc2\x4a\x2b\xa5\x95\x56\xf8\x88\x3b\xe8\xa1\x00\xd5\x7e\xcf\x25\xab\x9b\xb9\xc5\xa4\x42\xc8\x79\x12\x12\x21\x09\xf3\xc4\x5f\xf8\x04\x9e\xc8\xae\x5e\xb7\xbf\xbf\x7e\xf9\xf6\xa6\xdf\xbd\x7a\xd7\x0b\x81\x0e\xb0\xcb\x69\x37\x8c\x87\x25\xf6\xd7\xd1\x03\x9d\xae\x7d\xba\x95\x59\x65\xba\xa6\x12\x2a\xc6\x51\x19\x8f\xa5\xf6\xc6\xaa\xb2\x3f\x8b\x55\x05\x43\x51\xae\xc8\x2c\x27\x30\xd2\x79\x88\x13\x6c\x67\x49\x73\xd4\xcc\x7c\xcd\xa5\x74\xcb\xbf\x4a\x2d\x1f\xe3\x7c\xd8\x97\xa1\xb4\x80\xc7\xd3\x24\x15\x1b\x0e\x33\x54\x25\x46\x3e\x90\x3a\x15\xea\x31\x4f\x43\xaa\x25\x2f\x9e\xfd\xec\x3f\x5d\xed\xf1\x77\xf1\xb3\xdf\xe2\x66\x2b\xd6\xfa\xbe\xaf\xeb\xa6\xf1\x5d\x17\x42\x9b\xa3\x3c\xe3\x96\x10\xc8\x18\x84\xae\x14\xca\x08\x5e\x8a\xb9\x07\x63\x19\x0a\x70\x8a\xc4\x02\xc6\x63\x57\xbb\xe8\x15\x50\x2a\x8a\x6f\x79\x99\x2f\x3d\x98\x6e\xa1\xa3\x00\xe4\x85\x93\xa1\xd8\x89\xab\x93\xe5\x99\x7c\x3a\xac\xec\x56\x65\x0f\xcb\xce\x0e\xbc\x59\xef\xd2\xce\xea\xe3\xa7\xd7\x89\x30\xfb\x17\xab\x8f\x9f\x1e\xde\xe6\x07\x1f\x4f\x47\x70\xb2\x8c\xc6\x26\x5a\x66\x41\xa9\xb5\x1a\xb7\xca\x4b\xf8\x94\x85\x99\x95\x55\x2d\x79\x5d\x6d\x28\xfc\x75\x5f\x56\xf9\x21\x5b\xad\xc4\x13\x49\xf8\x59\x7f\x90\xfd\x51\x5a\xaf\x5e\xdf\xd5\x30\x3f\x2c\xcb\x6b\xea\x65\x7b\x6e\xd7\xca\x97\x0d\xfb\x3a\xb4\x5e\xb2\x95\x0c\xf3\x3e\xc7\x91\x86\x43\xaf\xa6\x78\x24\xd2\x93\x32\x94\x44\x0e\x7b\xb9\xce\x4e\xb7\xf2\x64\x0f\xaa\xfc\x34\xef\x41\x1d\xa7\x53\x6c\x95\x73\x41\xc5\x00\x21\x3f\xa1\xc9\x63\x26\x97\xfd\xe5\xe1\x8a\xfd\xf4\x6f\xb2\x3f\x4c\xbb\x87\xaf\xaa\xd5\x37\x17\x38\xc8\x04\x1a\xf8\xfa\x0a\x1c\x98\x5f\xaa\xc0\xd3\x2c\xfe\xf2\x1d\xf8\xf0\xf6\xf5\xba\xac\x7d\x58\x17\x61\x46\xf9\x18\x31\xc7\x96\xa0\x06\xe1\xae\x6e\xdb\xb0\xaf\x4e\xa2\xab\xda\xd6\xd7\x10\x83\x66\xbf\xd6\xb1\x59\xa4\xe3\xa0\x03\xa7\x55\x11\x21\x60\xed\xa0\xad\xb1\x58\x0b\x7f\xf2\x89\x98\x65\xdf\x7b\xbf\xf7\x27\x2f\xd8\x3c\x9e\x4e\x89\xab\x4e\xa5\x73\xed\x7f\x97\x95\x2f\xf2\xa9\x0b\x0b\xc6\x05\x51\xff\x9b\xdb\x9c\x9f\x4c\x63\xd7\xc7\x50\x55\x13\x90\x22\x1e\x63\xfb\x94\xc5\x86\x83\x83\xce\xdb\x99\xe7\xc7\xc0\xd4\x92\x0d\x0a\x14\xad\x94\x98\x40\x81\x71\x3c\x7a\xbf\xec\x99\x97\x57\x0e\x97\xdc\x04\x57\xa5\xe5\x81\xf5\x9d\xb1\x4d\xef\xd4\x8c\x0c\x2f\x42\x21\xf2\x76\x2e\x84\x28\x7c\xc9\x64\x3c\xac\xc2\xb2\x7d\xf0\x06\xd0\x39\x5c\x7a\x7d\x12\x76\x49\xba\xdf\x7d\x48\xa7\x12\x57\xe2\xcb\x57\xef\xcb\x64\xfc\x7f\x0a\x5e\x3d\x5f\x25\x5d\x88\x14\x77\x3c\xc4\x21\x4c\x8e\xb6\x4e\x98\x1a\x5b\x5f\x56\x65\x61\xcb\xaa\xd2\x8a\x6c\xf1\xe7\x7a\x35\x9e\xf1\x5a\xc4\x7e\x36\x51\xc7\x41\xea\x65\x09\x54\x4f\x59\x74\x04\x8f\xe8\x29\x23\x88\x88\xe5\x77\xab\x84\x57\xfd\xa3\xdf\x05\xcf\xbf\xfb\xe6\xfd\x15\xde\xe7\x4a\xe0\xb8\x23\x3e\xca\x00\x4a\x4f\x87\x20\x5c\x43\xbc\xaf\x70\xe5\x4b\x08\x9d\x7e\xf9\xbb\x3a\xba\xd8\x49\x93\xd8\x10\x0e\x51\x11\xb2\x47\x13\xc5\x24\x71\xe6\xaf\x33\xf9\x24\xd6\x78\xab\xae\xf9\xe3\x3f\x5c\x19\xf7\x9e\xab\x77\x5e\x3f\x5f\xc7\xbe\x7e\xbc\x70\xe1\x5e\xdb\x0c\x6e\x58\x71\x6f\x3f\xbc\xdd\x7c\x78\x7c\x7d\x6b\x44\x52\xbd\x07\xd0\x0f\xc3\x98\xca\xdf\x55\x0c\x80\xc5\x6e\xa8\xab\xa8\x62\x56\x81\x3a\xdd\xf5\x35\x40\x2c\xa1\x6f\xec\x73\x1d\x0f\x7e\x1c\x81\x1a\x37\x07\x6b\x9d\x73\x07\x15\xb5\x72\xca\x99\x0a\xfa\x65\x13\xe0\x9c\x72\x0a\x78\x75\x50\x4a\xc5\xf2\xca\xfd\xb4\xcb\xe4\x13\x5f\xab\xff\x07\xb8\x02\xfd\xc1\xf7\xe1\x78\x6c\x5b\x50\x44\x01\x84\x10\x22\x01\xbf\x32\x34\x8f\x5e\x29\x20\xa3\x48\x5c\x81\xb8\xef\xfb\x66\xbf\x4f\xec\x5d\xe9\x63\xb8\x71\x05\x2e\xff\xce\xa3\x73\x17\xf6\x2e\x19\x47\x80\x5c\x8e\xd2\xe3\x0b\x7b\x97\x0b\x21\xdc\x48\xad\xb6\xa9\xb6\x5d\x6f\x4d\xf6\x5d\x06\xbf\xcc\x07\xb8\x24\xc4\xa9\x33\xf8\x9a\x8a\xbe\xfa\xe9\x63\x99\x5b\xf1\xfa\x43\x82\x7b\x7a\x78\x9b\x1b\x2b\xc1\x71\x3e\x48\x29\x80\xa9\x17\x87\xea\x4c\x23\x3c\x57\x8c\x41\xce\x50\x15\xf7\x82\x43\x04\x29\x44\xad\x73\x6d\xdb\xb6\xc0\x5b\xbb\xf1\x81\x7b\xc9\xa9\x05\x19\x28\x31\x44\x75\x63\xbb\xd8\x9d\x95\xe6\xa5\x2f\x21\x59\xa9\xb3\x14\xa2\x70\x05\x6b\xa3\x59\x8b\x38\xd6\x91\x06\xa0\x66\xb8\xd8\x31\xbb\xc6\xcb\x9f\xb0\xe3\xef\x1e\x5e\x7d\x6d\xc7\x22\x44\xed\x41\xe1\xc9\x10\x44\xdb\x3a\x07\xd1\x62\xc6\xd5\x8f\xcd\xd8\x2e\x66\x6c\x40\x0d\x6c\x54\x17\x3b\x3e\x51\x74\xb1\xe3\xc4\x69\x93\xf8\x23\x1f\xb2\x7f\x7f\xc7\x18\x70\x3f\x76\x3f\x1a\xba\xdf\x32\x72\x82\x2b\xd0\xc6\x8c\x0b\x0e\x98\x0f\xe8\xd8\x9a\x9a\x3a\xca\x19\x85\x9c\x55\x4f\x99\xe0\x15\x82\x04\xa2\xda\xb9\xba\xae\x6b\xa0\xb5\xde\x78\xab\x3c\x61\xd4\x82\x12\x40\x4c\xeb\xf6\x6e\xd8\xc4\x65\xd4\x16\x3b\xf8\xd1\xa8\x5d\x6c\x9a\xee\xda\xf5\x90\x58\xb8\x2e\x1d\x0d\x97\xf3\xe1\x25\xd9\xbb\x50\xf3\xfc\xe2\xdd\xeb\xc7\xbf\x06\xdb\xdd\x9b\xaf\x83\xe6\xf5\x74\xe8\xe5\x01\xc1\xa2\x41\xdd\xc7\x83\xcc\x1d\xc8\x02\x04\xf5\x92\xfd\x1d\x0f\xb3\xcc\x65\x3c\x49\x3d\x5e\xe2\x26\x22\xd1\xfa\xbc\x8c\x16\xd8\xdc\xd7\xdc\x32\x02\x39\xc7\xb1\x0b\x61\x85\x39\x73\x0e\x40\x02\x0f\xca\x73\x63\xbc\xe7\x74\x9c\xc5\x8d\x60\xef\xb8\x92\x87\x25\xbb\x12\x40\xce\x5a\xf3\x2a\x40\x96\x8b\x79\x48\xba\xe4\xf8\x89\xee\xc2\x06\x67\x7f\x94\xbd\xca\xe0\xdd\x6c\x5c\xd8\x55\xee\x1a\x33\xb6\xbb\x97\xfb\xd3\xeb\xf6\xf4\x3f\x82\x77\x7f\xf3\xf1\x1f\xc0\xc3\x87\xc7\xd7\x09\xe0\x73\x59\x0c\x06\x5b\x16\x00\x03\xc2\x4f\x33\xf1\x4a\x82\x3e\xc7\x7d\x08\x3a\x3f\x78\x6e\x14\x87\x5a\x91\xb3\x75\x39\x17\x42\x41\x7d\x2d\xfe\xc9\xa5\xf7\x1b\xcc\xca\xb2\x15\x5e\x4a\xc1\xb1\x1d\x1a\xa1\x1c\x19\x66\x7c\xc1\x58\xa4\x71\x5c\x99\x19\x73\xe1\x4a\x22\x80\xd4\xfa\xa8\x35\x18\x67\x9f\x65\x60\x99\x8f\x55\x96\xfa\x2c\xb2\x57\x57\x58\xd4\xc4\xe1\xb5\xac\xad\xab\x77\xdf\x3d\x1c\x42\xeb\x59\x34\x80\xf9\xae\x74\xd6\x6e\x59\x44\x79\x31\x9f\x42\x1c\xce\x7d\xde\x46\x1e\x0f\x0a\xa0\x74\x40\xbc\x06\xfb\x27\xbe\x6b\x52\x2f\xec\x05\x2b\xf1\xd6\x0b\xfb\xe9\xeb\xd6\xf4\x57\xa9\x03\x0e\xfe\x70\x6b\x89\x7d\xee\xe8\x5b\x6f\xde\xfd\xcd\xa7\x87\xb7\x9f\x6e\x44\xb5\x63\x09\x2b\x54\x18\x64\x85\x2e\xcf\xa7\xa3\x1b\x8f\x93\xd2\x18\x40\x80\xa8\xf1\xa7\x13\x21\x15\x34\x82\x3a\xf8\x94\xc5\x16\x76\xf5\x64\x17\xdd\xae\x4d\xb1\x87\x78\xd8\xe3\xd8\x00\x08\x46\x60\xc1\x34\xf3\x58\x46\x22\x81\x01\x87\x15\x9d\xd5\xbe\xb4\xca\xe0\xea\x38\x77\x4f\x59\x51\x32\x42\x9a\x81\x18\x59\x84\x0a\x54\xee\x52\xab\xf1\xc5\xdf\x86\x9f\xf6\xb7\x5f\xbc\x7a\x93\x6e\xcb\x7e\x0f\x7f\xab\x95\xcb\x8b\xb9\x97\x9a\x03\xdb\x04\x04\xca\xc1\xf4\xd4\x13\x29\x18\x14\x1c\xc6\xbd\x10\x29\x50\xe1\xc1\xfb\x61\x18\x06\xd0\x58\xbb\x09\xc6\x78\xc1\xa9\x3b\x81\x2a\xf9\x5b\x1f\xdb\x97\xfe\xf6\xcd\x28\xb5\xd8\x68\x9d\xea\xb3\x4d\xf6\x47\xa9\x93\xe6\x92\xad\xfc\xe3\x17\x16\xac\xab\x16\xbb\xc7\x77\xbf\x7c\xb7\xfd\xdd\x8f\xde\xd6\xfb\x00\x41\x05\xb8\x30\x7a\xe6\x4a\x0a\xe0\x70\x4e\x1c\x53\x2e\x87\x9e\x29\x29\xa0\x94\x24\x1a\x29\x21\x46\x1c\x91\xa7\xcc\xb9\x1b\x06\x6a\x5e\x58\xbb\x35\x18\x9f\x7c\x20\x4c\xca\x45\xa7\x5e\x11\x19\x62\xf8\x5d\x14\xda\x66\x12\x88\x5d\xbb\xb5\x09\x65\xe2\x3f\x66\xbf\xba\x56\xe2\xde\xf8\x8c\x92\x3a\x8f\x5f\x9f\xdf\xa7\x1a\xeb\xc7\x45\xc1\x2f\x2a\xbc\x0c\x21\xeb\xac\x2e\x2b\xe0\x40\xbb\x24\x61\xd3\xdc\x77\xfb\xbc\x51\x2a\x45\x0e\x1a\x69\x20\x84\xe7\x8e\x81\xbd\x35\x2a\x56\xb7\xb6\xae\xb5\xf7\xdc\x1a\x09\xad\xa1\x31\x78\xbf\xb5\xb8\x2c\x07\x1d\xb8\x93\x42\xf1\x39\x30\x5e\x98\x82\xe2\x29\x9f\xaa\xd2\x8d\x8c\x32\x16\xa1\x88\x7b\x09\xc8\xdc\x6a\x51\xd5\x90\xe5\x45\x84\x29\x26\xea\x27\x92\xb8\x57\xff\x38\xfb\xfe\xf9\x96\xef\x9f\x9e\xe7\xe8\x57\xe0\xa7\x02\xc9\xd7\x57\x15\x0f\x5f\x0e\x75\xd3\x41\xdd\xb1\xc1\x49\xa7\xc6\x74\x33\x3e\x9c\x78\xae\x72\xd9\x06\x39\xac\xa4\xe7\x1a\x63\x48\x30\x82\xf3\xa4\x15\x84\x90\x40\x1e\xb9\x7f\xae\x8a\x5d\x65\xde\xaf\x0f\x04\x1f\x74\xc0\x58\x68\xa5\x85\x1f\xad\x50\xcc\xf4\xb3\xba\x9e\x38\xe6\x72\x56\x17\x06\x5d\x1c\xa7\x15\x9f\x54\xec\x17\xdd\x86\x14\x17\xd9\x95\x27\xae\xcc\xfe\x34\xfb\xc5\xf3\x1d\xe0\x75\x96\x40\xb6\x79\x97\xa5\x1c\xf9\x4d\xbe\x4b\xc0\x18\xa9\xd1\xee\x67\xe9\xdb\x0f\xf7\xa7\xd4\x77\x77\x80\x07\x5f\x55\x8b\xc5\xf1\xd8\xc7\x7d\x9c\x62\x2b\xc0\x81\x25\xce\x86\xd2\x31\xe9\x95\x97\xb5\x02\xda\xf2\x65\x0b\x2c\x83\x8e\x54\x48\x44\xa1\x4d\xb4\x86\x75\x9c\x40\xb9\x75\x08\xc1\x93\xf7\x1e\xc0\x38\x76\x0e\x14\x7b\x27\x71\x3c\x0d\x4f\x59\x3c\x32\x40\x41\x35\x81\x0c\x4f\xdd\x29\x1e\x29\xa0\xa0\x1c\x4f\x67\x23\x64\xe9\x98\x8b\x61\x4d\xe3\xe8\xbd\xab\xeb\xc4\x1f\x7b\xe1\xea\xff\xe3\xaf\xfd\x69\x7b\xef\x50\xd9\xee\xf1\xf7\xf3\xa7\x3a\x94\x15\xc0\x40\x09\x67\x67\x68\xbc\x00\x7b\x9c\x6b\xb7\x77\x39\x09\x4c\x2b\x59\x49\x45\xa2\x52\x0a\x11\xc8\x11\x8d\x53\x08\xd7\x9e\xb9\x29\xc7\xce\x6d\x0d\xae\xaa\x93\x0f\x94\x6b\x29\xb9\x05\x65\xcb\xbb\x10\xfd\x4f\x3a\x54\x88\xec\xea\x50\xf9\xfa\x94\xb0\x44\x6c\x3a\x1d\xbe\xde\x1f\x7c\xbf\xba\x92\x2e\x7c\xb7\x44\xb5\xd4\xf5\x9d\xef\xde\x65\x0f\x9b\xc9\x95\x10\x30\xe6\x11\x1c\x11\x31\x5a\xb8\x5a\xcb\x9a\xca\x5e\x00\xb8\xb5\xa8\x76\x96\xc4\x23\xf2\x7e\x08\x12\xf0\x38\x45\xe5\xa2\x51\xa1\x07\x59\x3c\xb6\x0e\x14\xc0\x65\xd9\x2a\x17\x4f\x64\x63\xb6\xe6\xca\xfa\x72\xb7\x27\xbf\xf6\xcb\x5f\xef\xeb\x5f\xa5\x78\xf9\xea\xba\x0e\xe4\xc7\xa3\x3b\x9d\x0e\x5d\x90\x96\x4a\xa7\x1b\x79\x34\xc3\xe1\xe8\x85\x38\x88\xcd\xd0\xb6\xae\x9d\x43\xdb\x73\xef\xe6\x2e\xaf\xa6\xde\x1c\x01\xca\x55\x3b\xeb\x84\xfc\x28\x2e\x3c\xaa\xe1\x6a\x93\x97\xb3\xd0\x1b\x96\xef\x7f\xff\x6d\x67\xa1\xe0\xba\x2f\xf8\xd9\x1d\x7e\xf4\xa7\x2b\x43\xcd\x4b\x62\xe3\x55\xef\x18\xe7\xd4\x72\xa3\xc1\xc1\x31\xc1\x89\xe5\xc6\x82\xde\x51\x96\x9e\xaa\x73\xb7\xc6\x11\xe5\x28\xf2\x16\x94\x3c\x1e\xf7\xa1\x5b\x16\xcf\xb2\x8b\x26\xcf\x96\x10\x87\xe2\x08\x7a\x40\xe6\xe2\xf6\x6d\xeb\xb0\x16\x8c\x33\x23\x8d\xc1\x8a\x33\xc6\xb4\xd4\x16\x4b\xce\x39\x33\x4a\xc7\x30\x3b\xe5\xf6\x2a\x38\x90\x45\x09\xda\x78\x0a\xd6\x8e\x4e\x01\xe3\x9c\x8b\x26\xf1\x57\x5f\xfb\xfc\xd9\x8b\x2e\xd2\xbf\x7f\xc6\xc6\x4e\xa0\x20\xb7\x6e\xdf\x57\x8f\xaf\x1f\x7f\x58\xdc\xf2\xee\x73\x97\x5e\x5f\x4a\x54\x3f\x3d\x7e\x7a\xbb\x12\xab\x43\xe4\xe0\xe4\xa2\xf7\xd1\x3b\x70\x8a\x52\x82\x22\x9e\xf2\x6a\x09\xf0\x73\x9b\x72\x12\xbe\x2c\xa2\xb3\x5e\x57\x9f\x8f\x74\x1d\xce\x47\x98\x1f\x2b\x65\xea\xbe\x1a\x03\x46\xc5\x79\xe2\xc7\x2d\xb3\x32\x1e\x43\xc4\x60\x1f\x40\x25\xe3\x60\xad\x95\xc6\x18\x69\x94\x53\x71\x0c\x95\x2d\xa9\x39\x66\xd9\x6e\x55\x3d\x85\x5d\x7d\x57\x8b\x7c\xd1\xe4\xb9\x1a\xf9\x9e\x7d\x66\xc9\x1c\x7e\xb8\x7e\xee\xec\x19\xaf\xa6\xcf\x06\x88\xbc\x9e\x65\x6a\x54\x4e\x55\x5f\xd6\x39\xa0\xae\x5f\xb6\x38\xfc\xda\xfb\x6d\x88\xa7\x48\xec\x10\xe9\xdc\x1a\x20\x4d\x7a\xbf\xf4\xfb\xd4\x57\xbb\xf9\xc3\x6b\x4d\xfc\xdf\x25\x9b\xb9\xb5\x0e\x5e\xd2\x96\x2b\xd9\xc7\xc3\x2f\x5e\xbd\xc9\x37\x97\x03\x92\xed\x6e\xfb\xf8\x97\xd7\x6a\xe8\xd5\x5d\x95\x0d\xb8\xb4\x05\x2d\xe3\xfe\xfe\xe1\x71\xe7\xfd\x59\x87\x3c\xab\xaa\x80\xaa\x54\xfb\x25\x1a\x0f\xca\x41\x9f\x62\x5f\xa9\x8e\x95\xae\xa2\x38\x4e\xad\x28\x9d\x67\x7d\x68\x0c\xe3\x8a\xaf\x26\x49\x2d\x91\x51\x04\x50\x85\x70\xae\x03\xa8\x36\x63\xf4\xc7\x23\xd0\x8c\x60\x2e\x5b\xa1\x98\x94\x2c\xba\x1a\x20\x19\x7d\x5d\x11\x8f\x7a\x82\x20\xa6\xd8\x52\x06\x2c\x1b\xb4\x74\x2c\xb4\xbc\xad\x63\x16\x15\x10\xf3\x48\xc1\x18\xbb\x2f\xfd\x4d\x61\x6b\x12\xa6\xe9\x7f\x48\xdd\x6b\xff\xdb\xe5\x8e\xee\x21\x25\x6f\x1f\x6f\xa4\x86\x89\xa2\xe9\x2e\xa2\x25\x4d\x1f\x1e\x7f\x78\x71\xed\x72\x7d\xf8\xe6\x0e\x70\x66\x23\x30\x04\xdd\x99\x05\x2f\x08\x38\x56\x30\x1e\x57\xd5\xf9\xc8\x41\xcd\x98\xf0\xb0\x21\xc8\x06\x3a\xf8\x38\x81\x23\xe8\x18\x13\xa1\x6a\x08\x32\x81\xf4\x2e\x8e\x54\x11\x45\x54\x74\x92\x28\x22\xb7\x86\x89\x48\xe3\x10\xb3\x68\xc4\x09\x08\x50\xe5\x3d\x21\x51\x34\x11\x9f\x0d\x17\x95\x2f\xd1\xa4\xb8\x17\x12\x68\x7b\x79\x50\x61\x90\x69\xe1\xa5\x01\x5c\x4a\x43\xb5\xa2\x4a\x53\xad\xb2\x5d\x2e\x9f\xf8\x4e\x6f\xc5\xb5\xee\x03\x26\x64\x8f\x4b\xcd\xd4\x5d\xa7\xc6\x57\xca\xfe\xe2\x2b\x65\x9f\x1f\x6e\xee\xd1\x75\xaa\xd5\xe9\x5c\xd4\x79\x37\xb3\xe5\x75\xca\x21\x67\xcc\x20\x47\xd0\xb1\xe5\xa0\xda\x47\x93\x87\xbc\x5a\x3c\x1c\x3a\x8c\xc6\x4e\x2c\xcf\xec\x3c\x68\x6a\xa9\x5e\x55\x8a\x39\xaa\xb6\x62\x56\x60\xf1\x67\x1b\xfd\xb9\x15\xb2\xac\x4b\xd2\x75\xd4\xeb\x01\x54\x5f\x1e\xb4\x2c\x3d\x20\x89\x5e\x98\xa7\xf7\x4b\xcd\x46\x95\xe6\xd3\x66\x9b\xec\x57\xd9\x7f\x4f\x68\x47\x97\xbe\xab\xf7\xaf\x12\xa2\x47\x42\x88\x7a\xfd\xdd\x05\x3f\x6a\xfb\xf6\x2f\x57\x69\xca\xae\x58\x26\x1f\xbf\xfb\xf0\xf0\x08\x2e\xe7\x8b\x8b\x45\x3f\x37\x24\x64\x7f\x02\xde\x5e\x1a\xf9\xb6\xad\xa4\x92\x89\xc1\x17\x80\xc7\xae\x80\x14\x7b\x61\x09\xae\x2a\x57\x09\x66\x98\xd4\xba\x56\xb4\x9c\x87\xce\x2b\x96\x0f\xb1\x00\xa3\xc7\x50\x71\x5d\x54\x92\x09\x42\x65\x2d\x01\x1e\x90\xa9\xa8\xa6\x5b\xcb\xb8\x14\x9c\x3d\x65\x3e\xea\xe3\x70\x82\x51\xc6\xb1\x88\x83\xf7\x30\x1e\x03\x40\xad\x53\xfd\x09\x98\xbc\x98\x87\x88\xa3\x17\x23\x10\x53\xee\xe3\xc9\xc7\x23\x25\xdc\x48\xc1\x85\x30\x92\x9d\x9c\x02\x10\xb4\x80\x34\x70\x6a\x69\x93\xb8\xed\x73\x95\xb0\xa4\xff\x3c\x75\xec\xfd\x5d\xf6\x3f\xb3\xff\x2b\x13\xb7\x2a\xfc\xfb\x55\xf9\x8a\x29\xf1\xfe\xda\x3c\x7e\xb1\x5b\xf0\xfa\xfb\xbf\x07\xaf\xdf\xfe\xe5\x2f\x97\x64\xf2\xfb\xdd\xbb\x8f\xff\x00\x5e\x2d\xee\x7f\x19\x8e\x5f\x81\xdd\xa5\xe5\x61\xf3\xf1\xd3\xe3\xcf\x7e\xb8\xf2\x98\x24\x5e\x4f\x21\xa8\x84\x8a\x90\x68\x2b\xe7\x6d\x69\xec\x01\x26\x10\x87\x8e\x20\x03\xc9\xfa\x40\x5d\x2b\x44\x3c\x06\x63\x0b\xb5\x42\xc2\x9a\x76\xf1\x0a\x2d\xf7\xac\x77\x06\x54\x9a\xc5\x40\xce\x47\x8c\x0c\xc4\x5b\x87\x11\x9a\x91\x14\x85\x2f\x65\x38\x36\xa2\x75\x0e\x38\x14\xf9\xa9\xa2\x4b\x6a\x09\xe0\xc0\x2c\xe7\xba\x0c\x4e\x08\xed\xe7\xce\x29\x27\x20\xf2\x90\x20\x8c\xa0\x83\x48\x42\xc2\x18\xa2\x8c\xb0\xc4\x59\x05\x32\xfb\x44\x77\x75\xae\x2f\x15\x49\x9b\xe7\xa3\xaf\xfb\xd1\xb8\x9e\x7e\x6d\xde\xc1\x6d\xc7\x66\x91\x38\x4f\xd8\xb9\x13\xce\x98\xca\x59\x76\xee\x57\x74\x26\xf9\x30\x73\x94\x1f\x73\x6d\xa1\x30\xdc\x11\xc9\xa1\x87\xb4\x72\xdc\x88\xd2\x26\xae\x76\x9e\xb8\x57\x96\xc8\xfd\x3a\xfb\xb3\x67\x46\xeb\x2b\x33\xc3\xe2\x5d\x89\x58\xfb\x3e\x46\xde\x11\x8f\x26\xdf\x2b\x97\x04\x0c\x88\xcf\x0a\xc8\x38\x80\xbe\xef\x73\x6c\xa5\x52\x6a\xce\x58\xe5\x2b\xb6\x1a\xeb\xb9\x0d\x21\xe7\x73\xbb\xbc\xb6\x24\xcc\xa3\xf7\x17\x8e\x5b\xc1\x7b\x23\x9d\xaf\x03\x6a\xc2\xac\xce\x7b\xad\x57\x38\x1e\x42\xe4\x21\x5b\xe5\x53\xce\x77\x66\x2b\xb2\x9f\x65\x7f\x9d\xba\x56\x53\x1b\xe6\x87\xaf\xdb\x8d\x57\x5f\x3f\xbe\x74\xb8\xfc\xf0\xed\xc7\x6b\x58\x3b\x49\xe6\x66\x55\x31\x65\x14\x73\x4d\x1b\x4f\xb8\x36\x8c\x77\x56\x11\x14\x7d\x5e\x12\xc6\x08\xe3\x42\x37\x48\x71\xce\x73\xf7\xed\xe7\x9b\x1e\x22\x8c\xad\x15\x14\x61\x4d\x09\xc5\xa6\x82\x55\x19\x25\x42\x84\x5a\xab\x18\x42\x0a\x23\x8e\x4d\x85\x61\xa5\xbf\xf5\x30\x5b\xad\xdb\xec\xb8\x13\xd7\x3c\xfc\xfb\x1b\x2b\x59\xda\xdd\xdf\xc0\x11\x1e\x1e\x37\x6d\xc0\xa0\x8a\x30\x2f\x66\x31\x40\x06\x58\xec\x12\x71\x84\x43\x6d\xcc\xea\x79\x5c\x0f\x2a\xc2\xe9\xcc\x40\x95\xb0\xe7\x56\xc5\x13\xdf\x85\x2d\xca\x36\xd9\x9b\xdb\x2d\xfc\xea\xf1\xe1\xdf\x27\xf0\xd7\xbf\xbc\x61\x5a\xad\xf6\x02\x5b\x2c\x2a\x00\x69\x0f\x08\x28\x58\x6c\xf6\x03\x15\x52\x76\x6e\x8b\xac\xe7\xde\xce\x87\xf3\x24\x69\xa3\x8c\x31\x75\x9d\x5f\xcf\xa4\x0f\xd9\x71\xc7\xd3\x5a\x7b\xe9\xd8\x78\xb3\xdd\xbd\xff\xb1\xc0\x43\x28\xab\x29\x72\x30\xce\xbe\x85\x24\x9d\x85\xd3\xd8\x6f\x1d\x92\x3c\x66\xcd\x7c\x58\x0f\x3a\xc2\xc3\x59\x80\xf4\x37\x87\xcc\xef\xd8\xd6\xde\xff\xcd\xfb\x41\xb8\x74\x6b\x6c\x9a\x50\x41\x00\x23\x05\x87\xd9\xd6\x08\xa5\xab\x2b\x16\xbb\xad\x45\x5a\xcc\xc7\x7e\x1e\x37\x99\x99\x4f\xa0\x38\x97\xb7\x71\xe0\x39\x4a\x39\xc9\xab\x94\x89\xdc\x31\x8d\xa4\xf3\xe2\xf7\x29\xad\x7f\xbc\x66\x57\x8f\x2b\xbd\xce\xe2\x31\x6d\x81\xd9\xe7\x16\xf0\xa7\xec\xb4\x64\x78\x7e\x79\x12\x9e\x32\x50\x6c\xb1\x0b\x91\x86\x65\x77\x32\x84\xb9\x04\x65\x02\xdd\x18\xb3\x75\xf2\x53\xb1\xca\xb2\xef\x12\x73\x1b\xbc\xd5\xdc\xa5\x6c\xf9\xdd\x7a\xf3\x0e\xfe\xf0\x61\x49\x7e\x52\x0a\xfa\xea\xdd\xa7\xc7\xd7\x1f\x01\xcb\x55\x9d\x2b\x62\x85\xa3\xb3\x3e\x37\x08\x34\xc0\xcd\xa1\x06\x43\x24\xb9\x02\x43\x41\x78\xac\x8e\x39\x19\x86\x28\x8d\xe5\x52\x54\x75\x55\xdb\xba\xae\xa3\xa6\x38\x94\x59\x9e\xb9\xbc\xdd\x99\x2d\xbd\xe8\xf6\xea\x6b\xdd\xae\xb8\x30\x97\xd9\x78\xfd\x58\x6f\xbb\x79\x00\x63\x44\xb9\xf8\xe7\x32\xa7\xcb\xde\x78\x1e\xf3\x1e\x20\xb0\x8f\x38\x91\xcf\x74\x5b\xea\x4c\x34\xc6\x7b\x03\x9c\x99\x1d\xc8\xcc\xa2\xb8\x49\xf7\x59\xee\xc9\x6e\xfa\x55\xf5\x1b\x7e\xeb\x7d\x8a\x42\xe9\x94\xbb\x5d\xef\xa3\x03\x3c\xb6\xa0\xfb\xf5\x00\xfa\xd8\x02\x1e\x55\x5e\xf6\xcb\xa3\x2e\x76\x80\xae\x2a\x67\xa3\x75\xce\x59\xe0\xec\x6c\xa6\xf6\x78\x4c\x79\xcd\xa2\x13\xda\x99\x2d\xf9\xd7\xd3\x89\xf8\x10\x59\xed\x7d\x0d\xba\x65\xc6\x70\xca\xdf\x43\xb2\x0d\xf4\x14\x76\x7e\x8b\xbe\xd8\xc6\xc3\xf5\xef\x7e\xb8\x7e\x03\x17\xee\xbd\xb7\xcb\xfb\x4a\xac\xcb\xb8\x4f\x66\x2c\x3e\x87\x74\x13\x5c\xc4\x03\x68\x13\x36\x78\x88\x27\x90\x6d\x51\x88\xdd\xcc\x62\x1d\x02\x90\x79\x0b\xf8\xaf\x6b\x30\x81\x00\xc6\x08\xa3\xbe\xe8\x46\xff\x95\x75\x73\x3e\xf2\x10\x42\x00\xad\x9f\x11\x40\xcb\x9e\xf9\xe0\x13\xf6\xe4\xf8\x7b\xe9\x56\x24\xee\x1f\x1c\xf7\xc0\x7c\x66\x40\xc6\x23\x40\xb1\x07\x43\xbb\x8c\x55\x13\x0f\xa0\xfa\x2d\xba\xad\xd6\x65\xde\xef\x42\xea\xb7\xff\x45\xf6\x1f\x96\x9c\xff\x47\x8b\xf1\xea\xeb\x10\xfc\xf6\xfd\x12\x9a\xb7\x7b\xe2\x1a\xce\x62\xef\xb5\x15\xab\x4a\x5a\xdb\x90\xb1\x69\x47\xda\x3a\x2d\xf8\x81\x6b\x4b\xb7\xa2\xa5\x8a\x52\x55\x59\x23\xa8\x74\x51\x4b\x27\x10\xb4\x88\xa7\x8a\x43\xae\x19\x25\x3c\xcb\x36\x97\xf3\x99\x7c\xb8\x43\xe1\x79\x89\x95\x74\x77\x57\xfe\x70\xa9\x95\x49\xee\x78\xfb\x0c\xab\xaa\x5e\x92\xdc\xbc\x99\xc5\xb2\x80\xd6\x69\xe5\x14\x79\x73\x3e\x82\x32\x2f\xe6\x53\xde\xe4\xc5\x67\x7e\xfb\x96\x7b\x42\x0c\x89\x8a\x1a\x21\x0c\x05\x81\x8c\x84\x90\x3d\xa5\xcb\xc2\x9d\xaf\xab\x5c\xa4\xfb\xc7\x37\xd9\x9f\x5f\x22\xfa\xd7\x8d\xa2\xcf\xe8\x18\x9b\xcc\xe2\x1c\x29\xec\xf5\x81\xed\xeb\xd0\xf2\xce\x08\x55\x41\x5d\x0b\x61\x34\x5e\x36\xec\xfe\xd0\x49\xee\xa8\xf3\xc4\x12\x23\x3b\x04\xf9\x28\x1a\xef\x9b\xe5\x77\xca\x55\x96\xfa\xb0\xde\x24\xb6\xc8\xdf\xf4\x3b\x8f\x7f\xb9\x3e\x38\x98\x63\x4d\x5d\xe8\xe8\xd8\x1a\xcf\xad\x12\xac\x82\x3a\x08\xa1\x0d\x8e\xa1\xd8\x1a\x24\x6c\xef\x14\xf1\xd4\x71\x64\x21\x15\x16\x41\x51\x33\xa7\xb4\xcb\xf2\xac\x7b\xe2\x3b\x96\x1f\xb2\xd7\xd9\x9f\x2c\x36\xb5\x7a\xb1\xdf\x7c\xf5\x66\x97\xa0\x73\x5f\x3f\x02\xb7\xee\x09\x20\x95\x6d\x98\xac\x0c\xa3\xac\xf8\x4c\x49\x80\xf9\x01\x7d\x3e\xed\xd7\xfb\xcf\x38\x3f\xc4\x2e\xea\xae\xf0\x85\x1a\x00\x2c\x5d\x1f\xb9\x4b\x3c\xf5\xab\x62\x9d\x6d\x79\x86\x92\x77\x6c\x77\xef\x5f\x2f\xcb\xd4\x8b\xdb\xb2\xcb\x45\xf2\xad\x72\xf2\xe3\xa7\xc7\x7e\x05\x95\x3c\x72\x2a\x85\x63\x92\x92\x8a\x50\x8c\xed\x51\x76\x3a\x9e\x80\x24\x4c\x4b\x26\xf8\xdc\x6c\xb9\x31\xc2\x38\x2a\xf4\xa8\x58\x69\x4b\xde\x3d\x65\x4e\xeb\xc6\x60\xcc\x29\x63\x69\x0f\xb9\x8c\x65\x79\x9d\xb3\xe7\x33\x96\xaf\x06\xf3\x79\x2c\xd7\x07\x5f\x96\x39\x31\xd8\x87\x8e\x8d\x4d\xdb\xf3\xc1\x48\x86\xb5\x97\xc2\x18\x14\xc3\xd6\x22\x0c\x5d\x17\x04\xf1\xd4\x38\xec\x88\x10\x16\x8b\xc0\x9c\x32\x36\xc5\x9e\x63\x4e\xd2\xbc\x55\x3f\xf9\x5b\xcf\x13\xb7\xee\x5d\x59\xe5\xc2\xe0\x50\x77\x74\xdf\x74\x47\x3e\x05\x2d\x20\xd2\xc1\x2c\x3f\xb6\x35\x88\x10\x7f\xec\x1d\xf7\x22\x34\xdc\x31\xef\x7a\x8c\x44\xcf\x7b\xe7\xbb\x6b\x6d\x9e\xdf\x85\x2d\xf9\xbd\xf7\xe5\xfe\x2c\x57\xcd\xe7\x1e\xb0\xdc\xce\xd6\x2d\xe9\xc6\x01\xa8\x18\xac\x94\x80\xa6\x2f\x4a\x6d\x49\xf8\xb5\x0b\xdb\x26\x4e\x91\x9a\x7d\xa4\x73\x63\x97\x7d\xf9\xf2\x7e\xe1\x16\x2d\x9e\x4c\xda\xa7\x7e\x39\x93\xff\xe9\xfb\xdc\x2f\x50\x6b\x5f\xdf\xe6\xde\xce\x6e\xc8\x14\x00\x09\xd3\x34\xa5\x03\xd0\x3e\x52\xe0\xa3\x06\xa7\xcf\x3a\xcf\x52\xff\x3a\x05\x7d\x94\xa0\x3e\x4c\x79\x1f\x87\xfe\xca\xdd\x90\xea\xa5\x9c\x73\x93\x89\xda\x38\xed\x8c\x73\xe9\x03\x78\x33\x19\x63\x62\x61\x53\x4f\x23\xc8\x7c\x7e\x58\xc3\xad\xcd\xfe\xea\xc7\x35\x36\xdb\xdd\xe3\xdd\x71\xee\x65\x03\xf2\x2c\x68\x0f\x68\x9d\xd0\x55\x2f\x49\x59\x55\x94\x60\x10\x9e\x88\xca\x60\x02\xa3\xe7\x41\x0c\x24\x9e\xae\xc5\x35\xfd\x96\x52\x6a\xa8\xa6\x06\xc2\xbd\xa8\x54\x59\x61\x23\x8c\xaa\x97\x47\xd9\x26\xe5\x11\x6e\x45\xb3\x22\x65\x83\x55\xc2\x2a\x5e\x8c\x3d\x95\x24\x5e\x85\xd9\x5c\x13\xef\x37\x8f\x1f\x1e\xed\x8a\x16\x65\x80\x2b\x74\x3a\xb5\x9b\xfa\xd7\x72\x13\x7e\xad\x36\x8d\xff\xac\x43\x58\xfb\xcf\x3a\x1f\x10\xc4\xc6\x30\xc5\x14\x8b\x01\x63\xa0\x06\x91\x6c\xbd\xc8\xc7\x34\x2f\x57\x5b\xff\x4d\x71\x63\x53\x38\x9c\x23\x81\x1a\xdf\xb0\xbe\x76\x9d\x6c\xac\x92\x08\x89\x96\x49\xef\x70\x34\x5b\x03\x8d\x6f\x5b\x81\x3d\xd5\xcb\xef\x08\x6e\x30\x92\x83\xd4\xda\xf9\x34\xae\x32\xdf\xaf\xb3\x2d\xbb\x72\x47\x5f\xb0\x55\x96\x0d\xdc\xc3\x8f\x1c\xfb\xed\x17\xc7\xee\x56\xa5\x92\x20\x13\x54\x62\xec\x18\x27\xb8\x22\x18\x12\x3d\x89\x5e\x4c\x40\x52\xae\x97\x7d\xe4\x1c\xb6\x4c\x7b\x29\x6b\x2e\x09\x8f\x27\xc9\x4a\x5b\xf1\x63\x9c\x6a\xe5\x3b\x45\x09\x67\xfc\xda\x77\xbe\x42\xe9\x7e\xc5\x5e\xd7\x85\xbf\xfd\x92\x61\xbe\x49\x7b\xe6\x9f\x25\xcc\xcc\xbb\x29\x7e\xb8\xe7\xfe\x5d\x3d\xbe\xbe\xf0\xdc\x6e\x60\x5d\x21\xd0\xc4\x86\x78\x27\x5d\x1d\x7a\x31\x05\xae\x53\x4d\x2a\xaa\xa2\x03\x10\xb5\x39\x99\x87\xe5\x75\x04\x3e\x1c\xc5\x60\x4e\x5b\x0b\x39\x9d\x51\xab\x98\x31\x9a\xed\x75\x5d\x83\x2a\x0e\x5a\xa4\xbb\xeb\x7c\xc8\x47\x11\xed\x92\xa2\x44\x64\xa3\x6e\x9d\x07\xe8\xd6\x27\x7f\xb9\x3f\xf9\x65\xf6\xff\x49\x35\x36\x5f\xcb\xfb\x8b\xd5\x4b\xa6\xc9\x6f\x89\x5b\x2e\xe2\xb6\xd1\x73\xef\xa5\xaf\xfd\x5e\xc4\x53\x7d\xbd\xf7\x49\x80\xd1\xb8\xcf\x59\xc2\xdf\xec\x3a\xa0\x9a\x49\xee\xdd\x70\x15\x37\xd8\x9b\xb8\x0d\x40\xb1\x4d\xe2\x8a\xaf\xa4\x35\x5d\x70\x00\x5e\xce\x2f\x2e\xfc\x64\xff\x6b\xf2\x82\xc7\xd7\xf9\xe6\xdd\xc7\x57\x8f\xeb\x63\x0d\x11\x18\xa2\xe1\x75\x2d\x7c\xdb\xec\x79\x3c\xb4\x5c\x5d\x0a\xf3\xa3\x06\x14\xef\x6f\x18\x6a\x4f\x19\x68\x87\xf8\x7f\xd3\xf6\xef\x50\x92\xe3\x6a\x7a\x28\x4a\x90\x11\x91\x9c\x19\x3d\x58\xbb\xba\x76\x63\xae\xa4\xb9\x48\x55\xf7\x2e\x6e\xcd\x48\xc2\x4c\xed\xea\xc2\xd2\x5c\x8d\x70\xaf\x64\xc0\xba\x0b\xd6\x59\x30\x61\xc2\xa4\x09\x13\x26\x4c\x98\x30\x69\xd2\xa4\x49\x93\x66\x98\x34\x69\xd2\xa4\x19\x66\xa8\x2b\x88\x3c\x8b\x60\x44\x56\x64\x57\xf5\x63\x66\xeb\x64\x17\x23\x22\xbb\xbb\x32\xff\x07\x9e\xff\xe3\xfb\x46\x71\x6e\xc2\xcd\xc2\xce\x46\x91\x47\x55\x37\x00\x87\xe6\xe7\x44\x36\xa0\x4c\x76\xd9\xf8\x84\x1f\xea\x0c\x7f\x96\xf7\xfb\x37\x2f\xa4\xbb\x76\xfb\xbe\x18\x20\x91\xea\xef\xf1\xc3\xe3\xf3\x00\x3e\xe4\x44\x50\x82\x28\x2b\x42\x7f\x2e\x0b\x07\x11\xa8\xc2\xc8\x95\x62\x42\x4a\x4b\xc6\x00\x6f\x44\xcb\x2d\x90\xae\xa5\x5e\x8e\x4c\x0b\x56\xe8\x82\x02\x0e\x1c\xc1\xa8\x44\xa1\x62\x1c\x33\x49\x4a\x8e\x2b\x9e\x56\xa4\x27\xa3\x9c\xb8\xa4\x2e\xb9\xf6\x25\xe1\xec\x98\xe1\x04\x45\x9e\xb4\xbf\xff\x52\xce\x97\x62\x7e\x4d\xca\xd4\x53\xce\x08\xa4\x14\x86\xfe\x4c\x2c\x84\x40\x85\x09\x0b\xce\x29\xf7\xbc\x0a\xf8\x26\x63\x07\xa4\x6b\xa8\x53\x13\x96\x9f\x65\x54\x51\x44\x8d\x4a\x2a\x31\xd2\x4a\xa5\xec\x5e\xc2\x5d\x22\xd3\xe9\xc1\x1d\xdc\x17\xf3\xea\xf7\xdf\xfe\xc3\xb3\xe3\x7f\x22\xf2\xe3\x0f\xfb\xab\x88\xfb\xc7\x37\xbb\x0d\x9c\xc0\xbb\x02\xa6\x6e\xe9\xcd\x31\x77\xb8\x12\xac\xee\x69\x80\x61\xe6\x8a\x33\xc8\x38\x5d\x5c\x0a\x51\x88\xa4\xbd\xeb\x13\xc6\xb4\x0e\x43\xb0\x14\x90\x39\x94\x07\x87\x4a\x18\x94\xe0\x1c\x0b\x06\x09\x32\xaa\xb7\x57\x05\x12\xe0\xf1\x40\x8e\x64\xac\x8e\x4c\x91\x2a\xda\x93\x46\xbf\x7f\xb1\x0e\xfc\xfe\xdb\xdf\x24\x6f\xba\x7f\x87\x3e\x3e\x66\x93\x83\x28\xf5\x8b\xd7\x4d\x63\x2b\xab\xea\x23\x0b\x65\x98\x69\x25\x39\x92\x02\x2f\x32\xad\xca\xe5\xbc\x33\x9f\xcc\xfa\x84\x63\x3a\x8c\x01\x11\xa0\xbb\xe5\x94\x45\xa7\xcb\x42\x30\x22\x84\x28\x09\xb2\xea\xa8\x2b\x11\x2b\x41\x13\x50\x93\x91\x0c\x64\x96\xe1\x04\xd7\xc5\xf3\x90\x98\x27\xf3\x60\x76\xf3\xb5\x2b\xed\xfb\x7b\x04\xd0\x2b\x96\xc3\xed\x79\xbb\x4e\xa6\xfd\x4b\x96\xf9\x87\x77\x3f\x7c\x1f\x9b\x44\x1b\x40\x7c\x96\xfb\x58\xe3\xaf\x7e\xac\xf6\xf4\xc7\x72\x8c\x51\x9a\x21\xcb\x2f\xe7\xdb\x03\xca\xca\x1c\xd5\x11\x74\x00\xf5\xa2\x0b\xe7\x9d\x95\x52\x4a\xbb\xcc\x26\x34\x0e\xcc\x26\x85\x4a\x85\xa3\x0c\xbd\x3a\x8b\x4a\x2a\xc9\xa9\x34\x91\x38\xfa\x90\x8e\x4f\xed\xde\x1e\xf4\x4b\x39\xef\xd1\x8a\xb7\x7a\x85\x28\xe7\xfb\x57\x6f\xbf\xbd\x66\xda\x63\xb6\xfd\x0e\x61\x2a\x3d\x09\xd7\x3b\x4a\x65\x58\x47\x69\x82\x2b\x31\x47\xc8\xf5\x1e\x40\x5a\xaa\x92\x58\x55\x52\x49\xb6\xee\x32\xbb\x30\x1b\x90\x4d\x95\x4d\x3b\xef\x83\x88\x7f\x5a\x5b\xd3\xda\xe1\xb2\x33\xc4\xac\x72\xe1\x27\xfd\x20\x0e\xd5\x57\xe4\x7a\xfc\x42\xae\xc7\x57\x6f\xf7\x3f\xc3\x8a\x9f\xca\xd1\x83\xb3\x3f\x9d\xce\x9f\xa6\x5d\xf1\x49\x54\x20\x1f\x41\x05\xce\x21\xbf\x3d\xb5\x33\x56\x7b\xd0\x7b\xa3\x8c\xdf\x37\xc7\xe3\xf1\xe8\x16\xb2\xde\xcf\x52\xe6\xd2\xa3\x73\x41\xb8\xc0\x5d\x38\xb2\x5e\x49\x6d\xa5\x31\x5e\x46\x5e\xab\x66\x2f\xfe\x0f\xd8\x4d\x29\x77\x72\x42\xe8\xf5\xce\xb8\xac\xe7\xcc\xf3\x29\x7e\x01\x26\x70\x85\x59\xad\xd7\x7b\xd2\xb3\xdd\x5c\xb4\x9b\x4b\x3b\xe7\x82\xb4\x41\xba\xd0\xd9\x9a\x7a\x47\xca\xce\xd0\x68\x37\xff\xa4\x1f\xcc\x6f\xb4\xdb\xfb\x5f\xb0\xdb\xf1\xe8\xc1\x58\x8f\xe3\x74\x29\xb2\xe9\x93\x53\xe7\x23\x90\x37\x3a\xf8\xf5\x71\xb6\x32\x95\x01\xad\xd3\x4a\xdb\x3b\xb3\x31\xf7\x0b\x66\x4b\xd2\xd8\x6f\x9b\x1c\x68\x52\x26\xff\xe3\xb9\x4f\xf0\x16\xe7\xbb\x2d\x7c\x6f\x7e\x9a\xf7\x78\x04\xcf\xb0\xd8\x1f\xee\x29\x85\x1d\x10\x94\x71\xc6\xa4\x58\xe6\x74\x6e\x1c\xa8\x30\x57\x18\x3a\x2a\x4b\x04\x31\x86\xcd\x20\xea\x3a\x8c\x29\x74\xae\x53\xa3\x0d\x3d\x70\x0e\x88\xd0\xf4\x56\x56\xbb\x91\x22\x55\x52\xc2\x8d\xf6\x42\x57\x92\x53\x32\x4a\x96\xdb\x82\xf8\xa3\x32\xa4\xb9\xe8\xa0\xc1\x14\xce\xde\x36\x00\x5a\x21\xac\xa8\x2a\xab\xae\x35\xc2\xec\xa1\xde\x4d\x49\x19\x33\xd3\xcf\xf2\xef\xaf\xf2\xbf\x88\xf2\x3e\x63\x4d\xbc\xbb\x91\x21\xdf\x28\x88\xb7\xff\x90\x61\xc9\xc7\xfa\xd3\x79\x4f\xfa\x30\xa7\xad\xf4\x46\xb2\x40\x85\x67\x14\x72\x2e\x58\x18\x03\x52\x40\x00\xb2\xf8\xb4\xae\x97\x73\x56\xd4\x19\x8c\x94\xc4\x1d\x0f\x38\x0c\xeb\x72\xca\x14\x70\x00\x2d\x6e\xc7\x4a\x4c\x88\x31\x82\x5b\x53\x49\xc6\x9c\xe4\x85\x2d\xa8\x1e\xb4\xa5\xc6\xe2\xc5\x33\x66\x1b\x5e\xeb\x39\x58\x50\x8d\xc6\xca\x36\x49\x63\xfe\xad\x3e\xd0\xe4\x6f\xb7\x8c\xcc\x0b\x7f\xfc\xfe\xfd\xd7\x5d\x12\x01\x17\xb2\xab\x3a\xbf\x7f\xc1\xfc\x9b\x9e\xc0\x28\x25\x57\xd2\x9a\x05\x67\xfd\xd8\xe5\x79\x0e\x46\xa6\x2a\x86\x4f\xac\x22\xe5\x7a\xcf\x9b\xc3\x51\x9e\x87\x20\x8b\x34\xf1\x60\x0c\xb5\x03\x48\x87\x53\xed\xdb\x30\x2a\x80\xea\x60\xee\x5c\xe3\x78\x9e\xbf\x70\xce\x71\xd6\x86\xd6\x21\x61\xcc\xce\x47\x77\x02\xe5\x52\xa7\x2a\xd4\x47\xdb\x82\x22\x49\xd2\x74\xbe\x62\x45\x6f\xbe\xf9\x0d\xe3\xeb\x17\x94\xc9\x08\x68\x05\xe7\x95\xae\xd4\xc2\x32\xef\x0d\x90\x4c\x56\xb4\x1c\x58\x85\x4b\x48\x48\x39\x84\x51\x8e\x43\x30\x05\x98\x3c\x98\x83\x33\xa0\xa8\x9e\x12\xef\x9b\x70\x52\xa0\xf0\xc1\xef\x26\x82\x14\x16\x4c\x1a\xed\x84\xad\x04\x27\xf4\x4e\x0f\xd2\xac\x7a\xb8\x79\x30\x27\x00\x97\x36\x95\xa1\xee\xcd\xa6\x47\xec\xcb\x6a\x0f\x34\xf9\x63\xac\x54\x79\xa9\xc7\x9b\xdf\xa0\xc8\x4b\x2c\xf9\x1a\x38\xc1\xb9\xe4\x5a\x2e\x75\xc6\xfa\x1a\xd4\x44\x2a\x52\xf6\x54\x45\x45\x50\x17\x4e\xe2\xd8\x85\x3a\x07\xad\x03\x5d\xe8\xf4\xa9\x9a\xac\x73\x67\x75\xb2\xe1\x78\xef\x0e\xf1\xd2\x1b\xed\xf0\xec\x8d\xd3\xaa\x05\x5a\x9a\x54\x84\xf6\x68\xda\x5b\x1c\xd7\xfd\x1f\xd5\x63\x00\x9a\x71\x2e\xb8\x92\x4b\x97\x95\x9d\x07\x16\x8b\x8a\x94\x2d\x55\x65\x09\x31\x81\xcd\x53\x22\xfa\x26\x74\x39\xf0\x0e\xd4\xe1\x58\xcd\xd5\x60\x9c\x9d\xe5\x68\xc3\x78\x3f\xe3\xf9\x4b\x3d\x9a\xe3\xbd\x1e\x33\x80\xeb\xe1\x3a\xf4\x47\xd3\x6c\xe7\xe4\x7d\xe6\xaf\x75\x5e\xaf\xe3\x89\xee\xef\x22\x7b\xfc\x57\xf0\x09\xf7\x77\x08\xb3\xdf\x65\x77\x77\xbe\xd8\x7e\xd6\x37\x1e\x60\xdf\x34\x3e\x0c\xbe\x01\x9d\x83\xc5\x74\x12\xf3\xd4\x9d\x38\xe0\x32\x9e\xe8\xbd\x8f\xf4\xc9\xc7\x40\xf6\x7d\xd7\x75\x9d\x1d\xc7\x71\x14\x25\x42\xbd\xf4\xd5\x34\x7b\x3b\x86\xb3\x75\x8b\x16\x22\xb5\x41\x44\xe1\xf6\x99\xbc\xd6\xcc\xfc\x16\xd9\xf6\x0f\x7f\xf8\xfe\xab\xb2\xc9\xc9\x01\xea\xa6\xc9\x85\xde\x4d\xe0\xe4\x0a\x38\x02\x28\xe6\xa7\xe4\x78\xe2\x40\xa8\xd4\x2e\x3a\xed\x7d\x28\x9c\x03\xa7\x50\xbc\x94\x0e\x76\xda\x55\xf3\xc9\xb9\x21\x9c\x5e\x48\xb7\x8f\xf8\x57\xdd\x1e\x46\x5c\xc7\x32\xf6\xd1\x7e\xb5\xab\x7d\xff\xb2\xbe\xe7\xbb\xad\xbe\xe7\x2e\x51\x95\x5a\x50\xd4\xc0\xfa\x2d\x6a\xab\xeb\x70\x4a\xa5\x87\x05\x28\x01\x11\xb5\x5b\x2a\xe3\x39\x98\x72\x30\x1a\x2d\x52\x55\x2f\xa5\x73\xe9\xb8\x94\x3b\x67\x23\x74\xb6\x31\x06\x63\x08\x67\xed\x99\x14\x84\x33\x3b\x5b\x21\x45\x68\x97\x49\x88\x14\x85\x3e\xf2\x4f\xc4\xfe\x88\x9f\xb3\xe3\x67\x59\xdf\xee\x6f\xd5\x70\x87\xfd\x97\x76\x4c\xa7\xb3\x07\x55\x6c\xd2\xf3\xc1\xf9\x73\x8a\x57\x29\x13\x50\xf2\x70\x0a\xd3\x31\xcc\x02\x18\xb3\x8a\x96\xe5\xf5\x72\xf4\x7e\xbd\x72\x6e\xc6\x74\xc3\x30\x0c\xbc\x44\xa8\xab\x9c\x9a\xa7\xfa\x2b\xae\x8e\xb1\x52\xb6\x2f\x5e\xca\xf8\xfa\x2b\xbe\xde\xb2\xe5\x1b\x84\xf9\x77\xfb\x9f\xc8\x58\x9d\x3d\x90\xf5\xe9\x54\x87\xda\x9f\x53\x32\x9d\x63\x4d\x77\x01\x01\x9e\xd4\x53\xb2\x0c\xe9\xb0\xe0\xf4\xec\x97\xd1\xfb\xb4\x5c\xc6\x3b\xf1\xc2\x78\x72\x6e\x3c\x61\x04\x6b\xef\x8e\xce\xd9\x45\x73\x1e\xc5\x83\xc9\x21\xf3\x4f\xf4\xc1\x1f\xf0\x1d\xbe\xc3\x7f\xbe\x66\xf9\xef\x0a\xe2\xe3\x7b\x9c\xd9\x9f\x2f\x98\x6f\x6f\xd8\xd1\x6f\xb3\x53\x26\x2e\x8d\x1b\x06\xa0\x8e\xcb\x10\xdf\x2e\x73\x76\x0a\xbc\x24\x8a\x1a\xa1\x55\xcd\x83\xf3\x8d\xad\xf0\xb1\xe1\xea\x80\x2f\x33\x58\x8f\x1e\xcb\xb9\xef\xfb\xc0\x9c\x91\x5c\x08\xc3\x2c\xab\xfb\x34\x5f\x26\x4c\x8c\xa4\x3c\xb5\x11\x37\xf8\xe7\x64\xfb\x49\x9d\xd1\x57\x65\xdb\x45\xd9\x50\x36\x5f\xe0\x56\x19\xd6\x80\x62\x61\xb7\x4f\x17\xb6\xeb\x97\x99\x08\x2f\x9c\xae\x4d\xcf\x03\x6e\xc7\xbe\x29\x9f\x92\x89\xd5\x5f\x88\xe8\x2a\xa1\x84\x11\x9a\x6e\x22\x52\x66\x2b\xb6\x8a\x98\x1c\x22\xe6\x51\xf5\x2f\x91\xf1\xf1\x59\xc6\xf4\xb8\x2b\x3e\x9d\x7c\x4c\xb0\x75\x91\xdd\xe2\xfa\xe9\x52\xec\xf3\x65\x24\xc2\x73\x5b\x79\xdb\x8b\x80\xdb\xa7\x64\x68\xcb\x70\x3e\xb1\xf6\x4b\x21\xb5\x52\x32\x0a\xd9\xa5\xc5\x9d\x90\x87\xf4\xf4\xcb\x3e\x7e\xbc\xfa\xf8\x67\xec\xb8\xf9\x98\x67\xfd\x85\xfa\xf3\x19\x38\x90\x2c\xd5\xf6\x7e\xd1\x3b\x1b\x72\xcc\xd7\x6d\xd2\xeb\x8e\x07\xda\x1c\xbb\xba\x3c\x8f\xcc\xfd\x8a\x09\x67\x4a\x6f\x26\x8c\xf7\x2e\xfa\x60\x77\xe3\x9d\x7c\x7f\xf7\x9b\x6c\x08\x1e\x5f\x45\xec\x9a\x57\x8f\x40\xec\xe5\x8f\xb5\x07\x43\xc0\xa9\x04\xc3\xa7\xe1\xf6\xe9\x47\xf9\x90\x5c\x66\xe5\x24\xf3\x9c\x37\x13\x59\xaa\x70\x0e\x06\x14\xe5\xd0\x8b\x70\xde\x8d\x4b\x05\x5c\x55\x55\xc1\x69\xad\x83\x77\x96\x0b\xc5\x15\x27\xc8\x0b\xd0\x05\xaf\xac\x20\x1c\x1c\x93\xe4\x10\x31\x75\xfe\xdc\x79\xa2\xb3\xe6\x22\xfc\xe9\x04\xec\x69\xb1\xf1\xed\xe2\x77\x22\x20\xcc\x0d\xb7\xca\xe9\x86\x07\x51\x77\xad\x2b\xe7\x81\xdb\x5f\xb0\xe0\xea\xdf\xcf\x16\x7c\xc8\x44\xc4\x4d\x37\xc9\xbf\xbe\xeb\x8a\xf9\xff\x6f\x15\x4a\xb7\xb5\xfa\x0f\xef\xb2\xbb\xfe\x98\x57\x91\x97\xff\x1f\x3e\xde\xf3\xf8\xee\xdf\x7d\xf7\x31\x5e\x75\x3e\xbc\xdf\xbf\x7d\xf3\xfe\xfe\x92\x71\x25\xe3\xb3\x18\x81\xda\x2e\xd8\x01\x0f\x91\xb4\xb3\x6d\x1a\x3b\x23\x2e\xf3\xb2\x30\x50\x36\xb5\xac\x60\x68\x15\x28\x51\xe3\x9b\x06\x54\xf3\x7a\x66\xbd\xbb\xb4\xa5\x84\x94\x15\xc2\x07\x43\xf9\xa9\xd2\x67\x52\x86\x59\x4a\x69\xd4\xe5\x3c\x43\x58\x14\x15\x76\x8c\x72\x90\x84\xd9\x69\x75\xcc\x72\x65\x8c\x9a\x64\x38\xaa\x70\x54\x4f\x09\xe5\xb1\x4a\x23\xcf\xdc\x13\x89\xdc\xc4\xff\x2a\xde\x94\xfe\xf8\xcc\xaa\xf7\xb9\xfe\x6c\x3d\xad\xec\x1f\xdf\xbc\x8d\x70\x3a\xfb\xc7\x57\x8f\xb1\xd6\xf9\xe3\x87\xb7\x60\xeb\x29\xf8\x0f\xe0\xf1\xc3\xe3\x56\x7f\x06\xee\xf0\x8f\x1e\xb4\x5d\xa8\x05\x35\x76\x25\x0c\x26\x15\xa3\x16\xba\x7e\x4a\x40\x7b\x99\x08\x2e\x41\x72\x3c\xa5\xf4\xb3\x32\x85\x10\x96\xe9\x14\x35\xba\xd2\x4d\x38\x09\x73\x14\xe3\xfe\x14\xe6\xba\x06\x50\x61\xc6\x47\xdd\x10\xca\x8d\x5a\x50\xaa\x8a\xdc\x10\x7e\x5a\x7a\x29\x8f\xeb\x9f\x8c\x71\x49\xaa\xf2\x02\x19\xd3\x52\x30\x29\x89\xc1\xeb\x3e\xf1\x57\x59\xfb\xa4\x63\x5f\xff\x5f\x7d\xc1\x70\xf1\x5f\xb7\x93\xd8\xf5\xa6\x7a\x1d\x75\x37\x30\x4c\x70\xff\xf9\x8a\xcd\xb3\x9e\xd6\x5e\xdf\x7a\x03\xd7\xa9\xfd\xfe\x0f\xef\xb2\x09\xe4\x46\x1b\x90\x5f\xb4\xd3\xfa\xac\x8d\x5e\xfc\xf6\x7e\x39\x65\xdd\x85\xe1\x8c\x5f\x5a\x9b\xd2\xa5\xd7\x08\x1e\xcb\xc2\xc3\x12\xe4\x17\x34\x17\xe8\x90\xac\xbb\xf1\x62\x63\x15\xe5\xb5\x8e\xd2\xda\x50\x6b\x19\x9c\xd1\x61\x12\xb2\xe2\x98\x31\x6b\x19\x5b\xe7\x0a\x89\xf5\x2d\xf4\xda\xc5\xb4\x71\xca\x25\x20\xd2\x58\xdd\x08\x5f\x22\x66\xe3\x87\xb7\x1b\x55\xdc\xc7\x98\x18\xfd\x82\x0c\x6f\xd5\x08\xdc\x91\x71\xdc\x3e\x1f\x5c\x38\x63\x52\x14\x15\x2d\x75\x5e\x84\x29\x0c\xb8\x6d\xbd\xa1\x6a\x10\x75\xe6\x97\x16\xa2\xb4\xd5\x9e\x2b\xa4\x39\xc3\xc5\xe2\x73\x39\xb9\x70\xd4\x1a\x24\xda\xea\xc5\x7b\x0f\x4a\x9b\xf6\xc1\xba\xbc\x80\x08\x57\x96\x94\xa5\x40\x3e\x47\x0d\x07\x96\xaa\x61\x5c\xcf\x4a\x94\x5c\x7c\x98\x0a\x5f\xcc\xa9\x41\x95\x52\x29\x9c\xd7\xaf\xcb\x35\x7f\xb1\xcb\x74\x5c\x0f\x74\xf2\x6f\x13\x94\xe0\x88\xfd\x7d\x97\xc5\xf8\x10\x31\x60\xaf\xb3\x2d\xce\xfe\x8f\x1f\xde\x7e\xff\xb9\x3d\x2d\x76\x9f\xc5\x44\xf1\x37\xdf\xfe\x84\x4e\x7b\xbd\xc4\xbc\xdd\x15\x80\x6e\xf1\x23\x73\xa9\x80\x0e\x3d\xf3\xeb\xa1\x08\xf6\x33\xe9\x3c\x38\x5b\x67\x6d\x13\xca\xda\x2e\xe7\xac\x0f\xa7\xa2\x28\x31\xca\x1d\x14\xda\x8a\xba\x0c\x83\x04\x09\x9a\xf6\xe7\xd5\x65\xd6\x9a\xc0\xb4\x36\x0e\x55\x8c\x38\xd4\xda\xaa\xb2\xad\xb5\x6d\xa8\xec\x53\x82\xf3\x1c\x1b\xd2\x72\x26\x01\x0a\x5a\x1a\x0a\xca\xc8\x0b\x98\x35\x4f\xe4\x9a\xaf\xb8\x1f\x81\xdb\x9a\xb2\x69\x79\xed\xb0\x7b\xf5\xb8\xb1\xcc\x7d\xf8\xc7\xf4\x27\x8b\xe0\xf3\x62\xf8\x33\xb8\xd9\x1b\xfa\xdd\x2e\x01\xc2\x01\x2e\x44\x68\x81\xba\x78\x50\x85\x46\x08\xdf\xf7\x80\xf7\xcb\x69\x7b\x1b\xa6\x09\x54\xe3\x65\x06\x18\xb9\xbc\x48\xcb\x86\xf0\xda\x0a\x73\x6c\x42\xcb\x4e\xfe\x29\x21\xe5\x29\x45\x9c\x84\x13\x44\x07\x28\xe5\x64\x26\x19\x3c\x50\x72\x32\x52\xca\xd0\x4b\x29\x97\x51\x29\x15\x3a\x5e\x20\x64\x9d\x24\xcc\x30\x51\x95\x36\x82\x02\xb7\xb4\xa2\x78\xbb\xf3\x90\xd8\x83\x69\xae\x77\x9e\x88\x4a\xf1\xea\x9b\x87\xdf\xbd\x8e\x95\x6f\x37\xa4\xa8\x77\xaf\xde\xbe\x7a\x38\x6c\xfc\x0c\x5b\xd1\xe7\xeb\xeb\x7f\xbd\xf1\x80\xc5\x0a\xf1\xb7\xfb\xb6\x84\xa0\xba\x4c\xc8\x95\x4a\x59\xce\x39\xe5\xd4\x96\xb0\x14\x90\x5a\x86\x41\x0d\xe1\x51\x58\xa3\x99\x66\x84\x59\x8a\x85\xa1\xfc\x60\xb8\x70\x8b\x3f\x4f\xa0\x04\xd8\xac\x47\x51\x23\x95\x54\xd5\x92\xa4\xc2\x52\xc1\xbb\x23\x3f\x01\x09\x50\x3a\x50\xbc\x78\x90\x87\xb3\x09\xba\xf7\x14\x24\x8b\x49\xf9\x28\x75\x2c\x26\xdf\x67\xb7\xdc\xc0\xbf\x4e\x1e\x93\x3f\x26\x7f\x1f\x23\x04\x2f\x2a\x73\xbf\xc6\x6a\xb6\xbf\x76\xea\xed\xdf\x17\xe9\xfe\xdd\x3f\x81\x8f\xb7\x3e\xd7\xcf\x7d\x7a\x8b\xf5\x40\x17\xd0\x96\x30\x90\xc6\x35\xae\x6d\x5d\xe3\x9a\x2c\xf7\x01\x7b\x90\xfb\xd3\x53\xc2\x4f\x5d\xed\xb8\x58\x47\x62\x89\x5a\xcf\xf6\x73\x68\x8f\x47\xc0\x09\xc6\x8c\x07\x5f\xd7\x75\x6d\xbd\xf7\x7e\x5c\x1c\x98\x03\x4a\xd5\x1c\x74\xe8\x90\x45\x67\x11\x26\x52\xba\xb2\x2f\x63\x47\xdf\x21\x6b\xae\xb8\xc5\x7f\x11\x2b\x94\xfe\xe3\x95\x2d\x33\xfa\x64\x43\x54\xdc\xd6\xb7\x97\x58\xb3\xaf\xb6\x73\xf2\xc7\xf7\x1f\xde\xee\x9b\xb2\x00\xcd\x05\x01\x53\xc0\x31\x9d\x16\xe4\x40\x1f\x68\xda\x49\x49\x78\x59\x11\xbc\x18\x3f\xc7\x78\x58\xd7\x1d\x0c\x65\xce\x61\x14\x9a\xa0\x8c\x0f\xd5\x52\x6e\xf0\x42\x29\xba\x9c\x33\xff\x94\x04\x61\xeb\x98\xd7\xed\x62\x8d\xd7\xad\x46\x7f\xdd\x77\xfe\x7f\x09\xbb\xad\xc9\x37\x7e\xd3\x18\xa1\xbb\x5a\x35\x46\xe7\xbe\x98\x0e\x57\xbb\xdf\x97\x14\x5e\x09\x00\x46\x60\x6a\x87\x4a\xc5\xb0\x08\x06\x08\xdf\xd7\xbd\x07\x22\x98\xbe\xef\x81\xec\x97\x69\x7b\x4b\x52\xef\xdb\x96\x55\x82\x41\x21\xd1\xa2\x46\xc5\xa5\x10\xfb\xb1\xae\x71\xc9\x98\xb0\x7a\x41\xeb\xd2\x9c\x4e\xfa\x7a\xa4\x31\xc6\x84\x5c\x08\x37\x6c\xfd\x35\x1d\x24\xa2\x92\xb1\xde\xf1\x90\x75\x4f\xe2\xc1\x47\x3e\xd2\xbf\x4e\xfe\x26\xde\xf5\xfe\x73\x92\x7c\xff\xf8\xe1\xfd\x0f\x1f\x57\x4b\x7e\xfb\x70\x2d\xd5\x7a\xf5\x16\xbc\xff\xe1\xc3\xdb\xc7\x6f\x1e\x56\x55\x36\x18\xeb\xf7\x1f\xb2\xb7\x87\x87\xf7\xfb\x79\x19\x2a\xcf\xc3\x0c\x72\xde\x30\xd0\x44\x24\x6b\x17\xea\x31\x9f\x40\x95\x0f\xcb\xb1\x85\xf9\x00\x64\x5e\x9c\x46\x42\xd5\x34\x79\xd5\x66\xf0\x88\xfd\x65\x0e\xb3\x0f\x7a\x9f\x0b\xa5\x44\xbf\x9c\x79\x55\xf1\x3e\x74\xbd\x58\xd7\xd6\x3e\xe2\x17\x6e\x58\x31\x6f\x62\x65\xe4\x67\xdf\xdf\xf1\xdf\xbe\xfe\xf6\xf3\xaa\xf2\x4f\x20\xe2\xad\xff\xfe\xdb\x1f\xf6\x03\x41\x40\x5e\x2c\xa8\x20\xa6\x46\x7b\x55\xa7\x85\x17\x46\x78\x66\x78\xd5\xf5\x62\x6c\xfa\xa7\x44\xa8\x8e\x88\x4a\x18\x26\xd5\xc1\x18\xe7\xbd\x96\x81\x8b\x70\xaa\x75\x37\x74\x47\x7e\xec\xc2\x51\x9c\xda\x51\xd4\x66\x18\x8c\x25\x06\xcb\x76\x94\x7d\xdd\x6c\x6b\x45\xff\x84\x23\x8f\xeb\xbf\x8b\xd5\x37\x51\xb6\x1b\xf0\x30\x78\xf7\xdd\xeb\xc3\x73\xd9\x04\xf8\x36\xfd\x8c\x69\x9a\xec\x5b\x81\x81\x08\x58\xda\xc6\x90\xd2\x4f\xa1\x14\x00\xb5\xdd\x11\x39\x15\x7a\xd0\x62\x0a\xce\xce\xfa\xda\x6a\xeb\xa6\x30\x71\x40\x41\x75\xa8\xb4\xf5\x93\x2b\xa0\x32\x74\x69\x9f\x12\x53\x83\xbc\x84\xce\x4f\xbe\x92\x97\x89\x85\xb9\x37\xb5\x6b\xed\x60\xad\x07\x66\xab\x85\x79\x62\x0f\xfa\xca\xe9\xfa\x19\xdf\xf9\x99\xd7\x67\x43\x78\xde\x41\x20\x23\x10\x35\x20\x75\x20\x35\xc0\xa1\x1e\xc0\x31\x90\x0d\x9a\xd1\x07\x7d\x31\xd6\x66\x06\xd8\x0b\x04\xb1\xaf\x13\xec\x48\x9c\x93\x30\xf9\xb7\x9f\xeb\x54\x5f\xbd\xdd\x0e\x88\x3b\x95\x9e\xc2\x08\x44\x68\x7c\x58\x7f\xea\x70\x80\x6e\xe9\xfc\xa5\xce\xa4\x4f\x59\x72\x88\xb1\x8e\xfa\x80\x23\x83\xe6\x9b\x38\x9b\xff\xcb\xba\x2a\xbd\xbf\xb1\x52\xbd\x02\x51\xca\xfd\x4f\x59\xb9\xee\x3b\x82\x1e\x72\xef\x2e\x93\x73\x60\x6c\x02\x5c\xb7\xc6\xb6\x4d\x2b\x21\xa8\x40\x15\x45\xf7\xe8\x61\x07\x1c\xf2\x70\xb2\x16\x14\xf1\xac\x56\xe9\xb3\x0e\xe6\x32\x4a\x51\xd8\x9c\x89\x70\xcc\xe6\x30\xbb\x20\x6d\x72\x48\xea\x27\xf6\xa0\x76\xc3\x4f\xe5\x7a\xfc\x2c\x57\xd4\x73\xff\x72\xad\x79\x89\x14\x76\xe0\x00\xfa\x1f\xa5\x9b\xd3\x33\xc0\x97\x2a\x95\x4b\xbd\xde\x3d\x76\x4c\x6b\xa9\x51\xcd\xe5\x85\x7b\x9f\xb5\x17\xbe\x3e\xbb\x21\xf0\xb0\x4e\x68\x1a\x6b\x2a\xb0\x1c\x64\x38\x2e\x35\xe7\xd0\x14\x14\x9f\xb3\x64\x94\x61\x94\xc9\x76\xaf\x64\x0f\xf2\xcf\xb4\xd9\xa1\xe9\xdc\xa5\x70\x6d\x8a\x4e\x8b\x03\x26\x98\xd3\x29\x3d\x49\xc9\x2b\xe4\x18\xbe\x05\x32\xd6\x67\xb3\x99\x31\xbf\x6e\xb3\x74\x88\xe3\xeb\xcf\x94\xeb\xd8\xba\x8b\x76\x4d\x9a\xb7\xcb\x14\x4b\x5d\xa6\xb4\x5e\x17\x67\xa4\x08\x0e\xd0\xad\xfb\x03\x5c\x9f\xaf\xcb\x35\x45\x08\x07\xce\xee\xe5\xca\x48\x82\xe2\x99\xf3\x5f\x22\xd7\xb5\x9f\xee\x30\xb4\xee\x32\x3a\x0f\xfa\x2e\xe4\x91\x41\xa0\x4f\xa5\xe0\x25\x29\x45\x59\x86\xca\xa6\x30\x54\xc0\x1d\x68\xa0\xa1\x3f\x8e\x60\xab\x89\xa1\x62\xd6\xc1\x2d\x94\x8b\xdc\xe6\x94\x3c\x25\x99\x7a\x8a\x08\x00\x7a\xe3\xee\x8c\x3c\x88\xbb\xfe\xb9\x56\xef\xd5\xe7\x5a\xbd\x2b\x22\xce\xad\x56\xef\x99\xde\xe8\x5a\xab\xd7\xe0\xba\x13\x22\x1c\xf3\x48\x6c\x94\xfb\x4c\xc9\xb6\x3d\xf1\x70\x3e\x4e\x61\x92\x00\xf6\xb5\xe4\x27\xee\x0c\xdf\xf5\xa1\xa7\x8e\xb3\xf9\xd8\x52\x4d\xdb\x69\xf1\x7a\xf0\x82\xd4\xcc\x3a\xea\x48\x65\x7b\xab\x54\xac\xf9\x52\x4f\x2c\x73\xbb\x53\xc4\x69\xff\xf6\xf0\x5c\xe0\xfe\xea\xbb\x8f\x6f\x0e\xfb\x37\x57\x2c\xd2\x57\xdf\x65\x50\xcf\x61\xbc\xcd\x27\x00\xe7\x53\x38\xb9\xb2\x24\x94\x01\xba\x3b\x19\x02\x6b\xdb\xd8\xa7\x84\x31\xcf\xe9\x7c\x2c\x72\x9f\x17\xd9\x19\x26\x20\x9d\x9f\xd8\x1e\xc5\x3a\xab\x98\xe9\x8d\x99\xab\xf5\xe7\xaf\x17\xac\xf5\xe4\xf4\xee\xe3\xab\x1f\x76\x8d\x76\xed\xf9\x1c\xeb\x7e\x4b\xe8\x1b\x4f\x91\x1c\x0e\xda\x12\x78\x76\x4f\x89\x0b\x13\x5e\x8f\x18\x1a\x54\x85\x2f\x76\x47\xb4\xae\x3d\x69\xfd\xc4\x76\xf3\xdd\xcf\xbd\xad\x3f\x2f\x7e\x6e\xa5\x7d\x17\x8b\x90\x8a\x70\x02\x04\xfa\xce\x33\x28\xc7\xbb\x9f\x3c\x12\x5b\xa2\x60\x9e\x7f\x72\xb6\xeb\xe2\x3e\x83\x63\xd7\x7d\x79\xe7\x9b\xf5\x1c\x1e\xd1\x7c\x5e\x65\x8f\xe9\x7d\xa1\x4e\xb6\xb9\xe6\x01\x52\xaa\x84\x68\x72\x2e\x2a\x4e\x78\x6a\x60\x43\x7b\x61\x6d\xdd\xb0\xae\x32\x84\x1c\x89\x90\xc5\x01\x07\xc4\x2d\x17\xc0\x84\xe9\xc4\xb5\x18\x01\xbb\xcc\x41\x9f\xb9\xaa\x99\x73\xcc\x71\x7d\x04\x78\xb6\x6d\xbf\xf5\x1e\xb0\x27\x96\x8d\x31\x37\x19\x79\x9e\x9f\x75\xfc\xee\xe3\xb7\xbb\xfd\x55\xc9\xef\x32\xa9\xc3\x39\xf4\x60\x0a\x28\x3e\xe8\x0c\x9f\x92\x30\xd4\x15\x69\x40\x75\xd0\x86\xa1\xd3\xa6\x6a\x49\x2c\x23\xc1\x03\x56\xd4\x70\x37\x94\x09\x48\xc5\x13\xdb\x75\xbf\x66\x43\xaa\x7d\x1f\xed\x17\x0b\xc8\x61\xdd\x79\x8e\xaa\xe9\x17\x6c\xf8\x17\x19\xba\x62\xd1\x6d\xa7\xa2\xff\x92\xbc\x4f\x48\xf2\xff\xbd\x76\xd5\xdc\xdd\x57\xdf\xac\xa3\xfd\x7a\xca\xdc\xf2\x07\x5b\x6c\xe7\x76\xb3\x5b\xaf\x04\xef\x3f\xbc\xfd\x06\x3c\x7e\x78\x7b\xd8\xbf\x7f\x17\x6f\x45\x6f\xc1\xfb\x18\x96\xd8\x0e\x48\x15\x40\xd6\x9a\x28\x9a\xca\x29\xf5\xcb\xe4\x21\xe2\xb5\x9c\x68\x2c\x0e\x6e\xac\x71\x0b\x35\x30\x77\x20\xa9\x6d\x38\x01\x3f\x70\x50\x0b\x88\x4b\x04\xf3\xf1\x29\xa9\x49\x48\x14\x38\x9e\xe6\x81\x4e\xe3\x7e\x5a\x8f\xa3\x41\xdb\xc1\x14\xa1\x04\x3a\x54\x60\x28\x0a\xcd\x15\xa8\x22\xd9\x62\x90\x74\xbd\xcd\x06\x3d\x1a\xa1\x72\x24\x82\x08\xb4\xb5\x46\x8a\xca\xd9\x88\x35\x99\x6d\x58\x17\x3a\xde\x90\xb6\x8c\xed\xc7\x5f\xe7\xb0\xc8\x7e\x8e\xc9\xff\xdc\x22\x0c\xc6\x05\x65\xe2\xd2\x64\xb4\x90\x96\x1a\xe4\x69\x89\x8a\xcb\x70\xc2\x36\xe5\x8a\x21\x83\x28\xa5\xc8\x40\x1a\x7a\x5d\x72\x23\x41\x49\x0b\x53\x90\x83\x2e\x19\x0d\xc4\x59\xb7\x1c\x67\xe4\x91\x06\x36\x3b\x8b\xa9\xeb\x2e\xc2\xd6\xb8\x71\xb9\x6f\x71\xe7\x73\xfa\x94\xb4\xfc\xd8\x77\x7d\x39\x74\x51\xfe\xfc\x89\x5c\x71\xa0\xfe\xd9\xf2\xbf\xbd\x8b\x9a\x5c\xe5\x9f\x5a\x54\x82\x69\xc9\xb3\xea\xe2\x32\x51\x28\x4b\x2c\xaa\x49\x59\x16\x97\xfe\x44\x7c\x2a\x25\x45\x16\x52\xb6\x6a\x41\x42\x6b\x88\xb4\x1a\x90\x55\x7e\xfc\x53\xf9\x2b\xe0\xee\xe5\xb7\xbe\xc5\xbd\xcb\xe9\xb9\xe6\x5d\xb7\x49\x7f\x48\xc8\x13\xd9\x99\x3f\xc7\xf6\x8f\x77\xb6\x07\xa7\x16\x96\xa0\x5b\x78\x06\x2f\x73\x96\x17\x4a\x13\x8d\x1c\x41\x10\x2e\xf9\x54\x56\x29\x14\x14\x69\x48\x09\x41\x1a\x92\xd0\x1b\x22\x4d\x05\x08\x2e\x74\x7e\x2f\x7b\x3f\x21\x8f\x04\x68\x9e\x65\x6f\xca\xd5\xf6\x5d\xd9\x7b\xfa\x94\x34\xbc\x7f\x36\x7d\x72\x48\xa7\x18\xc3\xfa\xb3\x6c\x7f\x37\x76\x86\xd5\xf6\xe3\x02\x33\x79\xa9\x33\x56\x54\x7a\x1d\x3b\x04\x43\x78\x39\x9e\x88\x4b\xb9\x64\xc8\x22\x42\x29\xb4\xab\xfc\x9a\x6a\x63\x01\x23\x85\x2d\xca\x5f\x19\x3b\xd6\x75\xd7\xa1\x73\x93\xbf\xdd\xe4\xd7\xff\x3c\xf9\x1f\x7f\x59\xfe\xba\x45\x38\x4d\x2e\x43\xc4\x8d\xf6\x45\x65\x99\x83\x35\xc3\x08\x5e\x34\x28\x48\x9b\x7a\xcd\x4b\x5b\x32\xb6\xaa\x41\x43\xa3\x99\x35\x1e\x88\x55\x9d\x7b\x07\x0c\xa7\xaf\x2b\xb0\x0e\x9e\x97\x0a\x64\x49\xb5\xae\x59\x19\x4c\xde\x25\x7f\x1f\x63\x1a\xef\x3f\x57\x9e\x3e\xaf\xf5\x8f\x77\xeb\xfe\x63\x44\xeb\x7b\x04\x1f\xae\x4d\xaa\xeb\x61\xe1\x45\x05\xe7\xfd\x5f\xcc\x6a\x1f\x8b\xda\xc5\x72\x86\xe8\xcc\x2b\xc7\xa4\x68\x79\x88\xc1\x3e\x69\x08\x63\x46\x2c\xc7\xb3\x07\x75\x3a\x3b\xf7\xa3\x74\xfb\x62\x84\xd8\x28\x5e\x59\xae\xc4\x51\x06\x52\xe2\x51\x28\x43\x29\xb3\x2a\x83\xa5\x22\x1a\x21\xc2\xcb\x12\x23\x4e\x28\x2b\xa0\x40\x08\x21\x46\xa9\xee\xba\xd0\xd5\x4b\x5d\xa4\xbc\x56\xc3\x50\x22\x08\x79\x89\xca\xf5\xff\x2a\x11\x12\x10\x22\xc8\x30\x8f\xfb\x67\xf2\xa4\x23\x06\xe1\x9f\x9e\xb3\xb9\xcf\x71\xc1\x0d\xdb\xfe\xf6\x72\x8b\x5d\x45\x10\x8f\xc7\x0f\x8f\xf1\x1a\xf3\xf1\x31\x6d\x00\x41\xd8\x51\x7c\x22\xb0\x41\x18\xd0\xf5\xb7\xe2\xa5\x2d\x60\x3a\x5d\x66\x84\xd2\x29\xe8\x34\xf9\x64\xc0\x14\x26\x37\x49\x50\xd6\xa1\x07\x06\x16\xa1\x07\xaa\x08\x74\xc7\x29\xa5\x42\x49\x59\x72\x66\xb5\xa5\xeb\xde\x64\x8e\xd6\x1e\x9b\xca\x38\x90\x5b\x42\xed\xd6\xf7\xa2\x32\xf8\x60\x0f\x3e\xc1\xc9\x87\x2f\xf1\xa8\x3f\xbf\x3c\x4b\xfa\xb0\xf5\x9d\x7f\xdc\x24\x05\xf1\xc4\x0b\xba\x02\x19\x52\x82\x99\x20\x87\x20\x18\x2e\xc7\x02\x66\xf9\xa5\x86\x68\x97\x7c\x72\x6c\x87\x97\x3a\x9d\x7e\x2c\x06\x01\x8a\x21\xb0\x94\xb1\x65\x4c\x1d\x2a\x2e\x27\x80\xd3\x32\x10\x7c\x80\xa8\x24\x84\x51\x42\x4a\xa8\x10\x92\x08\x4a\x2a\x89\xa2\x52\x55\x56\x12\x89\xd0\x72\x22\x28\xc9\x12\xf9\xc4\x32\x1b\xe3\x7f\xaf\x93\x3f\x7c\x1e\x43\xb7\x7b\xd6\x7a\x8b\x78\xfd\xb9\x9a\xf1\x56\xe8\x0b\xcc\xc6\x0d\x2d\x6d\x48\x1c\x40\xa0\x0a\x89\x71\x18\x19\xcc\x39\xd1\x25\xa6\x42\x55\x4c\xa8\x83\x3e\xda\xf6\xc7\xc1\xb9\x3d\xfe\x34\x67\xf6\xa2\x33\x36\x6b\x53\xf6\xad\xaf\x69\xa5\x4c\xa5\xbc\xaf\x7d\xf2\x10\xcf\x73\x37\x19\xfe\xfa\x73\x24\xfc\xdb\x78\xd1\x7b\x16\xe8\xbf\x47\x59\x6e\xab\xdf\x17\x22\x6d\xe1\x87\xfd\x67\x16\xc2\x77\x27\x0b\xe0\x55\x4c\xb3\x9c\x27\x0c\x05\xc4\x88\x33\x5a\x2a\xc2\x05\x13\x84\x71\xc5\x2a\x2e\x14\x2f\xa1\x2c\x10\x68\x11\xe4\x10\xc9\x12\x49\x88\xb0\xdd\x37\xc0\x6a\xe3\x7e\x54\xda\xee\xe0\xa7\x39\x3b\x31\x59\x4a\x46\x8d\x6d\x5a\x34\x0f\xc7\x23\x69\xea\xd6\xb2\xae\x6b\xeb\x5e\x54\x65\x25\x0b\x21\x4b\xc5\x43\xc7\x78\x29\x68\x02\x32\xfb\xa4\x62\xad\xfe\xfb\x8d\x5b\xe3\x86\x65\xfb\xcd\x8b\xc1\x7a\xed\xad\x79\xbb\xa1\x22\x7c\x78\xfc\xf8\x36\x8e\x82\xf7\xeb\x4e\x4a\x4a\x4d\xcb\xba\xc4\xa7\xc0\x0a\xe0\x03\x47\x29\x5a\xba\x82\xa4\x38\x8c\x40\x5f\x14\xb0\x47\xae\x54\x2b\x67\x00\xf1\x19\xe4\x45\x68\x67\x44\x0e\x5a\x1b\xa3\x49\xc5\xbd\x14\xae\x77\xc4\xb8\x70\xf6\x1e\xe4\x5a\x1a\x0f\x72\xd7\xbb\xce\x2b\xb1\x9d\xd3\xd4\x93\x7e\xb0\xfb\xe4\x2a\xdf\xe3\xfd\x3c\xfa\xd9\x69\xf4\xe1\x87\xdb\x30\x7d\x97\x8e\xa4\x04\x8e\xc4\x66\xd8\xfe\xe2\x8b\x8c\x5c\x6a\xbc\x2b\x3e\x35\x25\xde\xe1\xa5\x4f\xdb\x1f\x71\x6a\x43\xd9\x4f\x1c\xb0\x63\x28\x52\x86\x8a\x80\xd2\x1c\x2d\x16\xf4\x74\x9f\x30\xc1\x39\x21\xd8\x55\xb6\x72\x8c\xb9\xd6\xb9\xb6\xe7\xd6\x80\xd2\xe5\x04\xdb\xca\xad\x77\x47\x00\xc6\xab\x0d\xff\xf4\x8c\x7e\xfd\x72\x02\xdd\x5a\x93\x7e\x32\xcd\x6f\xdc\x3a\x3f\xec\xe7\x86\x90\x75\x96\xa3\x94\x2e\x0d\x44\x59\x72\x39\x92\x32\x83\x41\xa6\xc5\x27\x92\xc2\xd0\xbb\x5e\x01\x5c\x87\x23\xd0\x08\x86\x16\x54\x28\x20\x20\x31\xf5\x9c\xf6\xf2\xa0\x49\x25\x5c\xe7\x94\x70\x86\xb8\x70\x72\x0e\x14\x8d\xb6\x2d\xc0\x4e\x28\xd7\x39\x29\x98\xb6\x36\x49\xd2\xc8\x11\xef\x0f\x26\x79\xb7\x9d\x16\x6f\x3c\x29\xb7\x97\x2d\x4d\xba\xd5\x96\x5c\x85\x5c\xa7\xf9\xfb\x57\x77\x83\xf8\x8b\xb2\xb3\x6b\xb1\x4a\xda\x80\xa1\xac\x57\xdf\xf7\x05\x4c\xe1\xd2\x41\x98\x9e\x43\x53\x4f\x3c\x4c\x7d\xe8\xdd\x53\x52\x75\xfa\x29\x01\x12\x96\x61\x04\x12\x16\x81\x83\xc9\x53\xc9\x15\xe3\x9d\x95\xc7\x91\x49\x4a\x11\xa3\xe5\xf1\x44\x6b\xc7\x84\x92\x1c\xa3\x7d\x3b\x94\x8d\x63\xd4\x72\xe2\x3a\xe1\x0c\x40\xe7\x5e\xfb\xc6\x21\x65\x19\x5d\x74\xe8\x10\x57\x4a\x50\x25\x8d\xd7\x4d\xc5\xa1\x2d\xb8\xf3\x95\xe5\x5c\x30\xc5\x15\x84\xab\xce\x32\xea\x6c\x93\x7f\x9d\xfc\xcf\x2f\x22\xb3\x57\x0e\x9c\xa8\x5d\x0c\x28\x3f\xfc\xfe\xcd\x5d\x99\xfc\x9f\x22\x7b\x0c\x78\xc1\x0b\xfb\xf1\xf1\x41\xfa\x4b\xe5\xd3\x1c\x22\x8f\xe1\x62\x76\x7c\x19\xcb\x52\xb1\xb1\x55\x95\x51\x63\x35\x68\x41\xb4\x21\x0a\x29\x41\x70\x1e\x4e\xc1\x31\xe0\x01\x84\x70\x0a\x83\x00\xe4\x54\x92\xbe\x53\x00\x1e\x83\xdb\x0f\xe1\xac\x35\xc8\x19\xc5\x42\x86\xd6\xe1\x52\x59\xe9\x95\x64\xc1\xf4\x6e\x02\x0d\xea\xc6\xa6\x29\x3c\x94\x92\xd1\xb3\xb1\x16\x14\x15\xec\x2a\xa3\x3a\x8a\x1d\xd5\x32\x9e\x0d\x40\x4a\x9f\x54\x3c\x1b\xfc\x70\x37\x7f\x5f\x78\xf5\xe7\x47\xe0\x35\x68\xb6\x83\x82\xb5\x12\xd7\x98\x02\xbc\xf4\x79\x91\xa2\xe5\x58\xa0\x74\xb8\x9c\x21\x4d\xe7\xd8\x82\xa2\xd3\x24\x8c\xba\x95\x20\x77\xab\xf7\x10\x0c\x3d\x10\x45\x1e\x18\xa0\x98\x1e\x74\xe5\x6c\x1c\x83\x52\xac\x83\x90\xab\xeb\x20\xf4\x95\x69\x40\xb9\x0e\x42\x21\x9d\x60\x5b\xce\x6d\xc3\xf8\x34\x5f\xc9\xb8\x7d\xd8\x30\x41\x5e\x66\x75\xd6\xb5\x74\xff\xf6\xcd\x3f\xa6\x1b\x4a\x60\x76\x07\x87\xb0\x3e\xf7\x4c\xbe\x99\x06\xc7\x58\x15\x04\xcc\x45\x01\x13\xc8\x2e\xbf\x14\x29\x8d\x3c\x0d\x4b\xef\x9c\x58\x57\x76\xbf\x31\xe8\x6d\x8f\xe2\xed\x91\x75\x29\x69\x3a\xd6\x77\x87\x52\x08\x2d\xb4\x16\xe1\x14\x2c\xd0\x95\xf7\xde\x87\x6e\x11\x60\x66\x4f\xc9\xfa\x67\xa8\x18\xb6\x90\x20\x66\x24\xbe\xe1\x39\xb2\x4c\xc6\xb1\xf5\xbb\x88\x6a\x9d\xbc\x8e\x3c\x8f\xaf\x62\xc2\x69\xbb\x60\x1d\xc0\xe3\xab\xb7\xf7\x60\xb6\xef\x3e\x7e\xfb\xb0\x75\x93\xc6\x15\xa0\xee\x0a\x5f\x00\x28\x96\xa4\x47\x35\x80\xbd\x2f\xc2\x94\xca\xe3\x0d\xa9\xca\x85\xa9\x54\x86\x35\x11\xcb\xf1\xec\x62\x93\x71\x62\x91\x0a\xa3\xd6\x6d\xdb\xca\xd0\x07\xad\xf5\x68\x86\x41\x77\xd0\x8f\x5a\x6b\x9f\xec\x32\x13\xf3\xd3\xf6\x1a\x3b\xff\xcc\xf5\xf7\x70\x2b\x16\x7b\x6e\x48\xf9\xf8\x78\xc7\x51\x9f\x5d\x73\x2b\xaf\xde\xbe\x7a\xbb\x2f\xea\x02\x81\x2e\x18\x9c\x16\x61\xd6\x3d\x3b\xd5\xce\x9c\x45\x57\x9d\x00\xc1\xe1\x74\x2c\xc5\x2d\x33\x4b\x26\x3f\xcf\x7e\x3a\x58\x44\xc9\x22\xac\x3d\x2a\xe7\x00\x0e\xa7\x46\xdb\xce\xda\xb4\x61\xa1\x76\x41\xb9\x8b\x59\x2f\xba\x26\x4c\xb1\x48\xe7\x90\x75\x57\x5c\xdc\xd7\xcf\x58\x53\xff\xf3\x65\x6d\xf0\x2d\x57\xf2\xed\xe3\x33\x5a\xee\xe3\x9b\xe7\x28\xe8\x0b\x40\xc9\xf8\xbf\xbe\xba\xc6\xfc\xb3\x6e\x76\x67\x37\xc7\x17\x9a\x19\xe5\x9c\xdb\x18\x4b\xfd\xf6\xe6\x9c\x93\xa9\xb3\xde\x5a\x0b\x90\xdd\xcf\xeb\xf0\x30\xce\x79\xdf\xdb\xde\xf4\xb6\x5b\xaf\xb2\x85\xed\xd6\x6f\xe2\x57\x58\x5f\x22\x7e\x4f\x16\xb1\x98\x0f\xe4\xb9\x26\xe1\xbb\x6b\xf6\x3f\xd6\x25\x7c\xbc\xcf\x0a\xdf\xd8\xf1\xee\x32\xac\xaf\xf6\x8f\xd7\xab\xf9\x3d\xd2\xdc\xf7\x1f\xe2\x5f\x8c\x82\xc7\xb2\x1e\x53\x55\xa7\xca\x54\x4b\xc7\xb8\xf0\xcc\x17\x30\xad\x95\x25\x02\x19\x5c\xe2\xcb\x19\x14\x76\xbd\x90\x73\x5a\xc0\x8a\x96\xba\x08\xe7\xd0\x23\x50\x86\x93\x71\x0e\x40\x77\x20\x01\xc6\x7a\xb3\x71\xf1\x8c\xa8\xca\xa3\x12\x5d\xda\x70\x2c\x6c\x31\xa7\xce\x29\x15\x5c\x9b\x17\xb8\x44\xda\x95\x8c\x94\x16\xf5\xfa\x9a\x5f\x8d\x63\xb9\xb9\xf6\xa8\x5f\x2b\xa6\x7e\x3a\x96\x7f\x65\x28\xb7\x03\xf4\x10\x94\xea\xd2\x0d\xb8\x05\x68\x6a\x43\x9b\xb6\x53\x0c\x11\xe5\xe1\xec\x42\x8b\x2b\xcb\xc7\x60\x80\x09\xbd\x03\x2e\x54\xfb\xb3\x2d\x65\x18\x23\xa6\x63\xa8\x82\xae\xec\x60\x8e\xc7\x75\x20\x0f\xb6\xd2\x57\x6e\xa5\xad\x96\xa6\x4a\xf6\x31\xd2\xf8\xed\x36\x9a\x77\xfb\x77\xe8\x0e\xad\x61\xe3\x71\x7e\xf7\x39\x06\xb6\xd5\x6d\x7f\xb8\x9d\x0e\x7f\x78\xc0\x3c\xd4\xcb\xb9\x04\x35\xa8\x3c\x15\x4e\x86\x51\x60\x87\xb9\xe7\xc4\x61\x0e\x4a\xd3\xc8\x71\x4c\xe9\xe9\x74\x06\xce\x2f\x7d\xdd\x1e\x2a\x27\xa0\x33\x64\xf4\x3c\x32\xf1\xda\xaa\xd0\x96\xba\x2a\x9c\xb4\x42\x67\x1b\xe6\xd5\x11\x85\xfd\x34\xc9\x2a\x3b\xe3\x24\x01\x59\xbf\x8e\xe7\xb4\xde\x58\x1e\xbf\x5a\x97\x79\xbc\xd6\x5b\xaa\xa9\x3a\x6a\x57\x1d\xd5\x51\x85\x31\x15\xf7\xe5\x94\x24\x0c\x5b\x59\xe8\x2e\x6b\x63\xfe\xcb\x5e\x73\x72\xff\xf9\x05\x7a\xff\x73\x4f\xe3\x56\x1f\xfa\x05\x62\xc6\x0f\x1f\x1f\xb3\x11\x68\x18\x49\x62\xfc\x85\xd3\x0c\x5f\x86\x48\x9a\xd1\x64\xd4\x75\xc0\x07\x25\x85\x94\x90\x4b\x16\x18\xe8\x6c\xb5\x34\xfb\x99\x92\x92\x09\xab\x83\x34\x75\x50\xae\x92\xd0\x4d\x8c\x23\x8f\x50\xef\x14\x5b\x17\x6f\x10\x7d\xd1\x1c\x58\xf2\x2e\xf6\x57\xde\xff\xf3\xf5\x02\x9c\x0f\xef\x5f\x3d\xac\x4b\x2d\x5a\xa6\x14\x2e\x73\x5a\x07\x8b\x08\xa7\x95\x94\xdc\xf3\xd0\xa8\xda\x55\xd0\x0f\xac\xd2\x07\xe6\xd6\x19\xe9\x9d\x31\xbc\xd2\x86\x79\xe5\xe6\xb4\x5c\x3c\xa1\x96\x73\x96\x0e\x2e\x93\xeb\x58\x70\xd7\xf3\xcb\xbf\x49\x5e\xc7\x78\xf3\x3f\xac\x2b\xc6\x0f\xcf\xc3\xf4\xf1\x63\x2c\xd5\x3f\x80\xfb\xbe\xcb\x38\x4e\xdf\xde\xc6\xe8\xeb\x87\xc7\x0f\xd9\x69\x2e\xf2\xba\x00\x4e\x5d\x20\xc8\xd1\x11\x30\x40\xc3\x5c\x84\x3a\x63\x61\x8c\xb0\x8b\x36\x68\x1f\x14\xa1\x18\xf4\x41\xfb\x55\xf4\x9c\x00\xb4\x3f\x31\x56\xaa\x70\xf2\xde\x18\xc3\x42\x1f\x64\xe5\x6a\xd7\xf7\xba\x73\x95\x33\xcb\xa9\xae\xaf\xf3\x68\x97\x44\x19\xef\xf6\x84\xc3\xdd\x44\x7a\xfc\xfa\x44\x7a\xfc\x3c\x91\xba\x13\xf2\x45\x0e\x88\xb9\xc8\x13\x3e\x02\x02\x92\x21\xd4\xe9\x7c\x8e\x90\x5c\x38\x0c\x2e\xe8\xd2\x18\x01\xf2\x88\x93\x57\xc7\x64\xeb\x3a\x97\x30\xfe\xc5\xc9\x94\x65\xd3\x13\x89\xb1\xc3\xff\x98\xfc\x31\xf9\xaf\x57\xdb\xdd\xce\x08\x69\x76\xbb\xa4\xfc\x13\xf8\xf0\xa7\xf8\xe1\x77\xaf\xdf\xbe\x8e\xe7\xa3\x7f\x77\xe5\xfd\x24\x7d\x91\xbb\xbc\x00\xa7\x90\x43\x08\x06\xd8\x99\x5e\x37\xd6\xb7\xdc\xd6\x15\xa1\x5c\x1e\x69\x7b\xce\x0b\xe2\x34\x84\x82\x1a\x22\xf6\xb0\x3e\x16\x5d\xed\xbd\x0e\x34\x9c\xb4\xb0\xc2\x38\xe1\xa8\xc9\x73\xe7\xbd\x36\x60\xdd\x43\x24\x2a\x8f\xdd\x11\x24\x99\x53\x9a\x55\x91\x0f\x16\xb4\x4f\xec\xc0\x76\x24\xfa\x79\xf3\xf2\x76\x56\x8d\x4e\xde\xd2\xa1\x8f\x1f\xf6\x5f\x78\xf9\x85\x11\x53\x02\x60\xe1\x0a\xe0\x87\x4f\x0a\xa8\x22\x3f\x03\x9b\x17\x80\x2c\x32\x53\xe1\x18\x2f\x5b\x26\x18\x17\x30\x16\x15\x06\x2a\xc6\x77\x65\xcc\xcf\x64\xa3\x2c\x49\xab\x14\x2a\x4b\xc4\xce\xe1\x44\x2b\x53\x19\x23\x2d\x25\xa6\xa2\x8a\x5d\xf9\xb4\x76\xdb\x19\xe6\x9b\x0d\x23\xfc\xf5\xf5\x5e\xf2\x2b\xc3\xf0\x85\x80\x47\x80\x60\xe1\xf3\x02\x18\xff\xa9\x07\x88\x9c\x81\x02\x2c\x9c\x60\xb0\x99\x0c\xb1\x17\x79\xcb\x0d\x32\x6c\x6b\x09\x50\x24\xbc\x11\x5b\x29\xec\x99\xd1\xab\xb3\xbd\xf7\x3c\x1c\x43\xa5\x5c\x6f\x57\x6f\x23\xdb\x3b\x65\x5c\xb2\x4b\x65\xc2\x1f\xe4\x15\x23\x70\xc3\x31\xbf\x96\x86\xdc\x8c\x18\x65\x7c\x7d\xeb\x46\xfe\x52\xd4\x58\x50\x7c\x04\x18\xf9\xbc\x48\x61\xfb\x29\x01\x18\x15\x67\x20\xc1\x29\x30\xe8\x96\x39\x85\xcb\x69\x87\x83\x8e\x84\xe0\xc7\x40\xfc\x32\x60\x65\x30\x4e\xcf\x4b\x7e\xc8\x2b\x54\x96\xb3\xb5\x04\x2b\x45\x2e\x85\xb3\x62\x35\xb9\xb0\xeb\x4e\xab\x2c\x21\xe0\x54\x25\xbb\xf5\x3e\xb2\xaf\xae\x67\xc1\xcf\xb3\xf9\xf0\xcf\xda\x75\x52\x3d\xc4\x8c\xc8\xdd\xc6\xd3\x85\xee\xb6\xf1\x94\x61\x74\xe1\x58\x56\x96\x77\x2f\x36\x1e\xca\x7e\x79\xb6\xec\x12\xf7\x44\x1f\xec\x5e\xfd\xac\xfd\x1e\x7f\x8b\x8f\x01\x07\x23\xaa\x8b\x3c\x6d\xcf\xff\x1b\xa6\xb0\x84\x41\xa5\x49\x5a\x2f\x35\x5c\xfa\xbd\x09\x28\x96\xb3\xb7\x0b\x77\x97\x89\x28\x47\x52\x7f\xf1\x99\xba\x9c\xfc\x8e\x7f\x6a\xf7\xb9\x44\x08\xdd\x6c\x18\x4e\xc1\x8b\x75\x89\xf4\x95\x27\xcc\x5b\x61\xd4\xb6\x3f\x92\xeb\x9a\x58\x24\x6f\xae\x1c\x4c\x2f\xad\xf8\xec\xea\x5f\x5b\x15\xeb\x73\x91\x37\x45\x0e\x7a\xfd\xa9\x07\x05\x2c\x06\xc0\x80\x0e\xdd\x3a\x1e\xeb\xd0\xc5\xe4\x75\x17\x58\x1d\x08\xe5\x2c\x4d\x02\xab\x53\xb9\xd4\x39\x05\x3c\xae\x8b\xeb\xa1\xd0\x7b\x4a\x7f\x76\x65\x5c\x65\x4d\xae\xb2\xae\x36\xfd\xdb\x9b\x55\x7f\xd3\xcc\x79\x29\xaa\x02\x45\x91\xd7\x79\x01\x46\xfb\xc9\x02\x84\x67\x20\x80\x0b\x35\x0c\x3a\x1b\x42\x1d\xe9\xd3\xc7\x50\xd6\x01\x51\xc1\x53\x18\x70\x9d\xba\xa5\x82\x0c\xc8\x3b\x51\x7f\x7e\x0d\xdf\x5f\x39\x00\x5e\xee\x33\x8f\x9f\xb7\x99\xdf\x6a\x51\x0e\x72\x54\x43\x70\x72\x9f\x24\x80\xa8\x18\x01\x07\x5d\xd0\x30\xa8\x5d\x12\x6a\xd0\x04\x01\x86\x80\xeb\x90\x13\x29\xd2\x32\x24\x75\xda\x2f\x94\x72\x50\xed\x4f\x6e\xdb\x67\xbe\x66\x4e\xbb\xcc\x75\x1d\x7b\x5f\x78\xec\xb5\xa0\x91\x55\xe2\x31\x16\x67\x3c\xbe\xc9\xde\xff\xda\x95\xf6\xf3\x5d\xf6\xd6\x08\x1f\x07\xea\xe1\xe1\xf1\xe3\x01\x06\x88\x6b\x5f\x14\xe0\x6c\xcf\x01\xa2\x52\xe0\xda\x28\xc6\xcb\x5e\x1d\x09\x45\xaa\xc2\xac\x14\x0c\xa1\x7c\x08\x33\x03\x64\x86\x79\x33\xb1\xb1\x83\xc8\x78\x3e\x99\xd0\xa6\x2a\x9c\x21\x02\x35\xde\x19\x03\x34\x42\xa5\x09\xd6\x96\xa5\x34\xd2\x56\x8c\x84\x7a\x34\x33\xd0\xc8\x77\x75\x5d\xd4\x50\x70\x4a\xa7\xca\xea\x59\xe6\x4d\x65\x65\x5b\xa2\x8a\x5b\xad\x2d\xd0\x94\x9a\x24\x8d\x3d\xe2\x75\xd4\xef\x7f\xdd\xeb\xf7\xc5\x95\xfd\xf0\xb5\x3b\xfb\xed\xb2\xfe\x59\xbf\x55\xbd\x7c\x99\x70\xe7\x8b\x22\x85\x16\x14\xcb\x8c\x20\x27\x5e\x4b\xc6\xf0\xa0\x46\x8a\x20\x92\x92\xaa\x52\x8b\x02\xe6\x4f\x49\x18\x28\xa8\x4e\x45\xd1\x9f\x39\x48\x8e\x78\xb0\xfc\xe4\x83\x4f\x7d\x18\x29\x18\xee\x15\x74\x10\x29\x2d\x9c\x66\x24\xb8\xc1\x9e\x80\x29\x8a\xba\xab\x1b\x58\x23\x21\x18\x39\x29\x63\x4f\xac\xec\x2a\x2b\x7b\xee\xa9\xad\xb4\x03\xda\x98\x04\x5c\xf5\xe3\x1b\x83\xe1\x3a\xae\x6e\x5a\x6d\x0c\x89\x77\x2a\xad\x1e\x7b\xfd\x87\x17\x8e\x7b\x46\x67\xc8\xda\x2c\x1f\x43\x82\x35\xf2\x46\xb5\x6d\x33\xf1\x56\x57\x57\x3f\x95\x53\x98\x18\x10\x73\x5e\xf4\x4f\xc9\xaa\x05\x84\xbd\xe5\x93\x0d\x38\x8b\x2d\x48\x8b\x3f\xf0\xa5\x77\x58\x2b\xa6\x2b\xc7\xf2\x51\xd4\xdc\x0d\x63\x51\x43\xe7\x67\x6d\x2d\x48\x08\x19\x8c\xad\xc6\x12\x5a\x66\xab\xca\x5d\x39\x01\x62\x7f\xe2\x83\xdb\x8d\x77\xbe\xb9\xba\xe6\xe1\xf7\xdf\x7e\xb3\x2d\x3e\x1b\x79\x4e\xf4\xcd\xdf\x82\x77\x57\xd7\x24\x5b\x38\x25\x36\xf5\x6d\x0a\x7d\x7f\xf5\xcd\x3e\x59\x92\xf2\x6c\x51\x7a\x6a\x53\x78\x91\xd8\xb1\x7c\x68\x2b\x65\x24\xd0\x2a\x58\x5d\x96\xd0\xba\xaa\xe4\x8c\xd2\x22\xe8\xe5\xcc\x52\x04\x4c\x8e\xc2\x18\x20\x05\x2d\xa0\xa8\x9c\x43\xaf\x80\x02\xc9\xc2\x77\x55\x48\x78\x7a\x24\x59\x59\x01\x8a\xb0\x09\xa3\x41\x4c\xe5\x4c\x57\x1c\x0f\xda\xae\xcb\x1c\xe7\xd6\xd4\x05\xa1\x94\x84\x93\xf5\x15\x48\xf2\xb2\xd7\x96\xb7\x10\x6a\x6e\xa9\x34\xa0\x94\x32\x49\xd2\x1d\x7b\x12\x0f\xfd\x41\x27\xff\x7d\x63\x00\xff\x72\x8e\x7d\x65\x8a\x5d\xc3\x62\x2f\x26\xd8\xdb\x0f\x8f\x59\x9c\x60\x55\xa8\x4b\xe7\x8a\x1c\x28\x33\x84\x1a\x13\x5a\x6a\x25\x35\x72\xd2\x61\x82\x84\x40\x14\x31\x52\x14\xcd\x91\x9e\x9a\x42\xd7\xac\xb1\x45\x21\x24\x6b\xd4\x0c\x6a\x0b\x11\x80\x78\x67\x2b\x60\x50\x89\x74\xd0\x86\x10\xa9\xa5\xad\x74\x68\x7b\x3d\x00\x59\xba\xa6\xf6\x85\x83\x42\xa8\xa3\x34\xd5\x24\x8c\xd4\xc2\x97\x90\x11\xa3\x94\x01\x96\x31\x97\x24\x69\xba\x1e\x60\xd4\xa1\x4a\x7e\xbf\x61\xf7\xa4\x0f\xdb\x61\x7d\x23\x74\x7f\x1d\xbf\xff\x61\x6b\x72\xcd\x66\x63\x5c\x25\xca\x66\x28\xd7\xeb\x02\xb4\xc2\x71\x4b\x30\xa2\xb0\x9b\xc8\x69\x37\xe2\xa0\x66\x84\xb5\xc0\xba\x39\xa1\xc2\x9e\x81\xc7\xc1\xcd\x45\xae\x2e\x83\xae\xb8\x67\x1b\xee\x4c\xf2\x24\x1e\xba\x83\xbe\xde\xef\x6f\x63\xe5\x8b\x65\xea\x8b\x69\x1c\xe7\xef\x9f\xde\xdd\x19\x73\xb5\xe2\x6a\x44\x1e\x6a\xec\x2c\x04\xc6\xce\x41\x95\x98\x63\xa3\x24\xa5\xa8\x96\x35\x81\x05\x52\xb2\xa4\x88\x51\x84\xf2\xee\x44\x41\x7e\x44\xb6\x65\x9d\x2b\x85\x62\xad\x3c\x83\xa3\xc3\x00\x92\xcd\x8a\x2c\x1a\x11\x4b\x2d\xe2\xf2\xd4\xf7\x66\x00\xb2\x28\x7c\xeb\x57\x33\x72\xc1\xd8\x58\x99\xea\x9c\x73\x2b\x34\x77\x94\x5f\xed\xe8\x36\x0c\xaa\xe6\xda\x07\xf5\x6b\xeb\xd3\xd7\x96\xa7\xef\x7f\x12\x52\xbc\xae\x4f\xc9\x72\xc4\xfd\xba\x3e\x61\x07\xca\x65\x40\xa5\x20\xb5\x55\x9c\xe3\x51\x4d\x94\x95\x4a\xd2\xaa\xd4\x12\xc2\x3c\x9c\x83\x67\xc0\x83\x3c\x87\x43\x38\x73\x50\x8c\x10\xb9\x51\x80\xbc\x0e\x3a\x3d\x86\x8e\x82\x99\xde\xaf\xc1\x08\x29\x23\xe3\x12\xe5\xc7\x75\x89\x2a\xfd\xf3\x0a\x45\x4f\xc6\xda\x33\x21\xad\xb6\xb2\x2f\x4b\x2d\xb7\x35\xd8\x98\x55\xc7\x01\xa8\x07\x73\x70\xc9\xff\x88\x3a\x46\x05\x1f\xde\xbf\x79\xfc\x1b\xf0\xe6\x3e\xab\xf1\x72\xf4\xff\x44\xbf\xfd\x2d\x65\xf4\xee\xfb\x58\x80\x5c\xd8\x22\x4f\xb5\x9c\x97\x8e\x50\x5f\x49\x21\x44\xa7\x7a\x59\xe4\x45\x55\x61\x81\x24\x2b\xcb\x70\x0e\x47\x0a\x14\xc8\xf3\x62\x5c\x17\x30\x34\x43\xe4\xc2\x48\x00\xd4\x41\x67\x08\x2d\xbe\x4c\x7b\xb4\xcc\xb0\x38\x38\x54\x40\x75\xd2\xb4\xca\x89\xa8\x48\x79\xd4\xa6\x3e\xe5\x39\x97\xce\x17\x16\x0a\x4e\x5a\xae\x45\x8b\x90\x93\x86\xb9\x12\x19\xa6\x89\xd0\x54\xe6\x0c\xc5\xba\xeb\x2d\x36\xfc\x2f\xf5\xe1\x4f\xc3\xc2\xd7\x75\xec\xb4\x78\x3c\x7a\x58\xa4\xa2\x06\x74\x69\xcb\x52\x92\xd6\x29\x21\xc8\xac\x4e\x8c\x21\xa5\xa8\x2e\xb5\x82\x28\x0f\x73\x30\x0c\x34\x00\x15\x45\x2c\x3e\x44\x33\x2c\xed\x59\x00\xd4\x04\x91\x9e\x43\xcd\x53\xf8\xc2\x87\x25\x92\x57\x1f\x6e\xdb\xcc\x4f\x7d\x08\x12\x56\x76\x9b\x13\x2b\xf5\xec\xc4\x34\xe1\x4f\x7c\x97\xc4\xf9\xf7\xbf\x22\x67\xc0\x17\x6b\xd5\x57\x4e\x03\x1f\xef\x97\xba\xfb\x1c\x16\x78\xfc\xf8\x78\x48\x87\x22\x47\x4a\x95\xb4\xe4\x14\xc2\xf6\x4c\x41\xd1\xe7\x85\xeb\xf9\xd1\x17\xb0\x32\xbc\xaf\xc2\x94\xa2\x32\x70\x6c\xd7\x6b\xec\xd1\x8c\x81\x53\x86\xad\x52\x3c\x4e\xa4\xc0\x81\xc2\xc1\x17\xe0\x94\xe7\xcf\x87\x81\xea\xa8\xad\x9e\x69\x79\x3d\x0b\x28\x66\x95\xb6\xea\xb3\xfa\x3c\x4e\x53\xc1\x7c\xcb\x9a\xac\x37\x34\xe6\x86\xea\x74\x7a\x58\xef\x0f\xff\xef\xe7\xbc\xcb\x97\x50\x4b\xd7\xa4\xe6\x9e\xb4\x84\x82\xe3\x02\xd7\xa3\x60\x86\xfe\x37\xce\x8a\xa5\x4a\xdd\x82\x80\x21\xd4\x56\x0c\x58\x71\xd0\x58\x50\xe7\x6d\xe4\xf5\xf5\x8e\x52\x2e\x2b\xb9\x9e\x5b\x77\x55\xe4\x6b\x47\x57\x9c\x92\xad\xe7\xf1\x8a\xbb\x76\x78\xf8\x76\x2b\x25\xbb\xcb\x85\x7c\xb5\x14\x79\xd7\xa5\x7d\x88\x97\x92\x82\x9b\xaa\x13\xe1\xec\xa5\x11\x15\x97\xac\xa2\x0c\xe7\x67\x90\x84\xb3\xaf\x2a\x90\xeb\x60\xe2\xdb\x01\x39\x7f\x99\x1a\xcf\x28\xf1\xd2\x68\x61\xb9\x14\x95\x10\x4c\xa9\x0c\xf9\x80\xba\xae\x0b\x49\x8c\x4c\xee\x77\xec\x97\xe4\xfb\xfd\xee\x2e\xf9\xb8\x35\x16\x7f\x55\x3e\x97\x4e\x11\x02\x70\xca\x79\x0e\x60\x2d\x4e\x83\x5c\x17\x3e\xc5\x35\xe5\x64\xab\xf3\x9a\xbd\x31\x00\xda\x20\xe3\xdb\x55\x40\x57\xb8\xd2\x73\x67\xf8\x55\x40\xae\xaa\x97\x02\xee\x23\x7e\x8e\xdf\xa9\xbb\x58\xff\x9d\x7c\xcf\x5d\xa2\x2f\xc5\xfb\x49\x27\x5a\xda\xef\x9a\x65\x02\x53\x80\x05\x06\x05\xb0\x38\xb0\x30\xd6\xa1\xa7\x20\x37\x11\xe4\xb7\x2c\x02\x01\x43\x28\xba\x18\xc1\x19\x00\xbb\xcc\xb7\x4f\x3b\xe5\xc4\xd2\x69\xa1\xf2\xa6\x70\xa6\xf4\x88\x51\xc6\x29\x26\x3c\x65\x22\x76\x2c\x84\x5e\x29\x95\xec\x77\xc9\xaf\xd9\xf1\xbb\xdf\x60\x47\x9e\xa1\xd0\xac\xbf\x3a\x17\x39\xc0\xad\x08\xd3\xa0\xbc\xb0\x5c\xad\xce\xa6\x79\xc4\xc9\x1a\x6a\xe7\x40\xd9\x04\x1c\xdf\xee\x0d\x29\x9c\x11\x96\x0b\x59\x09\xc9\xab\x9f\x18\x32\xf6\xdf\xe6\x31\xb6\x4f\x9e\x6d\xf9\xf7\xff\x5c\x5b\x7e\xf3\xf0\xf8\x21\xb5\xbb\xd3\x32\x80\x29\xe4\x90\x03\x04\x06\x1c\xca\x50\x77\xa1\xa5\x00\x7a\xaf\xa4\xae\x19\x0a\x18\x4c\xcb\x34\x46\xd8\xaf\x19\xb0\xcb\xb0\x7d\xca\x01\x3f\x10\xd7\x5d\x4e\xbd\x31\x79\x93\xd7\x35\xa9\xb1\x54\x95\xb1\x42\xfa\xac\xe8\x42\xbe\x4a\x9b\xb7\x02\x97\xed\x67\x8c\x5f\x93\x26\x1b\x07\xf8\x0f\x77\xd0\x2e\x6f\x5f\x3d\x6e\x40\xf6\x26\x85\xb9\x03\x63\xbd\xdd\xd9\x0a\x12\x04\x05\x1c\x87\x1c\x54\x94\xbb\x5b\xf4\xde\x61\x8f\xc7\x24\xc9\x13\x0b\x86\x07\x75\xe0\x2f\xb0\x3b\x3e\x46\xee\xa6\xfb\x78\x64\x71\x87\x67\xf6\x6a\x7f\xe5\xb6\x89\xcf\xe7\x78\xf1\x7f\x7d\xd1\x8d\x86\x17\x99\xaa\xc5\xc7\x67\x94\x3e\x46\xdc\x69\xf9\xa3\x4a\xfb\x65\xdc\x60\x7c\x97\x31\xeb\x08\x72\x90\x1c\x29\xf2\x90\xcc\x0c\xd7\x88\x3e\x25\x56\x54\x46\x1f\xb8\x16\x95\xa8\x78\xd0\x75\xe1\x0a\xd5\xa5\xc3\x20\xc4\x51\x88\x9e\x73\x27\x14\xae\x04\x52\x06\x9b\x0a\x56\x06\xdb\x0a\xb1\x5e\x56\x55\x8c\xc7\xd1\x07\x75\x30\x49\x16\xb3\x09\x91\x9f\x1e\xbc\x8f\xf4\x34\xaf\xd6\xcf\x87\xc1\xfb\xa5\xf6\x8d\x71\x00\x7b\x7f\x30\xe7\xe3\x03\xf9\x34\x85\x22\x0c\x12\x20\x50\x67\xdd\xff\xde\x6a\xc5\xb3\xe6\xa9\x7a\x68\x0e\x55\xec\xe2\xbc\x6b\xe9\x8a\x75\x86\xaf\x3e\x37\x1e\x3e\xa2\x77\xff\xf1\x0f\x1f\x62\xe9\xe1\xfb\x57\xeb\xf3\x20\x99\x20\x04\x61\x52\xc0\x7c\x70\x2d\x39\xce\xa4\x2c\x3c\xd4\xa1\x0e\xe7\x9c\x51\x5e\x6a\xdf\xba\xdd\x79\x91\xe1\x0c\x1b\xe4\x81\x67\x4b\x91\xf6\xe4\xd2\x23\x88\x8a\x89\xce\x55\xce\x59\x56\x42\x8b\xc1\x18\x04\x4d\xcb\x90\x6f\xb5\xeb\xf9\x93\x7a\xf0\x07\x19\x51\x1b\x1f\xde\x7d\x17\x4b\x1e\xbf\xff\xf6\x99\xb8\xef\x4a\xe6\xf6\x6a\xff\xee\xfb\x3d\x39\x12\xa0\x01\x65\x4d\x0f\x5c\x11\x24\x11\x12\xe7\x35\xc4\xe5\xf1\x28\xc3\x0c\x01\xde\x17\xb8\x66\xde\x71\x1a\x10\xf1\x74\x71\x25\x62\x27\x1c\x06\x4a\x98\x4a\x5d\xe9\xcb\xd8\xef\xad\x9e\xaa\x4c\x1f\xf4\x73\x1f\xdf\x7f\x4a\x92\xd7\xef\xdf\xc4\x6c\xd6\x87\xf7\x5b\xda\xeb\x39\x66\xbe\xce\x8a\xb8\x9f\x6d\x04\x6b\x3f\x7c\x7c\x67\xb7\x0c\x21\x46\x59\x71\x39\x95\x69\xb7\xb0\x18\x24\xca\x29\x61\x14\x23\x0f\x11\xc1\x30\x1c\x83\x86\x8c\xc9\x03\x3a\x03\x1e\xda\x73\x30\xc6\x99\xc0\x4d\x1b\x6a\x65\xe3\xe1\x85\xd3\x22\x77\x82\xd4\x45\xde\x5d\xeb\x16\xe8\x43\x0d\x86\x75\x6f\x8a\x58\x02\x1b\x9d\x43\xfc\xcd\x91\x7f\xe4\xf0\xf0\xe6\x1f\x3e\x6c\x1d\xc9\x29\x3a\xf6\x18\x9c\x00\xd3\xa8\xac\x9c\xe1\x46\x08\x50\x00\x24\x16\x15\x3c\xe3\xf9\xd8\x96\xe1\x74\x62\x8e\x96\x5e\x74\x1c\x42\x41\x63\xcf\xac\x2c\xbd\x05\xb8\x84\xa7\x1c\x63\xc3\x31\x4f\xf2\x44\x01\xf4\xa0\xf6\xf4\x57\xe6\xc6\x3d\xb0\xe5\x97\x73\xe3\x8a\x1a\xff\xfd\xfd\xdc\x80\x8b\xb8\x41\x93\xa5\xe7\x5c\x5a\xc4\xa1\x28\x31\x2a\x7e\xd4\xa9\xdb\x88\xb8\xe3\x23\x09\xb4\x90\x80\x23\x41\x06\xe1\xa5\xc5\xd0\x15\xf8\x29\x31\xa2\xd2\x7a\x4f\x15\x97\x5c\xb1\x70\x32\xb9\xc9\xb1\x4a\x5d\xc7\x79\xcb\x79\xcb\x98\xe7\x02\x4b\x86\x85\x24\x8a\x97\x5c\x61\x25\x20\x6d\xd7\x9d\x37\x8f\x1c\xc6\xf6\x40\x7e\xb3\x3e\xaf\x1f\x5f\x81\x0f\x8f\x6f\xae\xe5\xe5\xaf\xbf\x98\xe4\x9b\x52\x0f\x2a\x6c\xdc\xa0\xeb\x63\x8a\xca\x8b\x0e\x1e\x05\xc5\xe8\x32\x80\x66\x23\x34\x01\xc5\x4c\x91\x41\x94\x71\x68\x21\x0b\xce\x16\xcc\x32\x40\x68\x61\x0b\x7c\x20\xb6\xb1\xb5\xad\x17\x7b\x46\x0e\x5a\xd0\xef\x8a\x30\x34\x4d\x18\xeb\xda\xd6\x75\xb0\xc6\xe3\xda\xe4\x75\x8d\x1a\x57\x94\x73\xcf\xfa\xae\x6e\x50\x5b\xaf\x6b\x97\x8e\x5c\xae\xea\xcf\xf2\xcf\xd7\x14\x2a\x16\x75\x4b\x69\x67\x49\x51\x59\x6a\xa0\x23\xb8\x2c\x7e\x94\x69\xbb\xc1\x9f\xad\x4f\x16\xb3\x5d\xac\x93\xa8\x46\x62\xf1\x35\x57\x5e\x83\x91\xc1\x1a\xb2\x9d\xb2\xca\x2a\xa3\x82\xec\x90\x83\x2c\x52\xe9\xa8\x93\x52\xb3\x52\x5e\x56\x54\x0b\xe8\x1d\xae\x1d\x22\x47\xcb\x6b\xe3\x7c\x59\xdb\xcf\xfa\xd8\xff\xc7\xf5\x29\x15\xac\xca\x2f\xf5\xa9\x05\x71\x98\xf7\x5f\xd3\xc7\xda\xca\x56\xa6\x0a\xa2\x2b\x7c\xc1\x4f\x99\x3a\x57\xd5\xb9\xaa\x4e\x55\x55\x57\x9a\x1a\x85\xbc\x2f\xaf\xfa\x78\xeb\x7c\xe9\x5d\x8c\x6b\x80\x73\xca\x0f\x34\xe6\x1a\x93\xd7\xd7\x9c\x62\xfa\xf0\xee\x87\xb9\xb1\x95\xab\x81\xd4\xcd\x51\x0f\x07\x2a\xb5\x75\x32\xe8\x2a\x8c\x9d\x39\x26\x39\x68\x81\x7c\x10\x87\x3f\x77\xde\xbd\xc8\x67\xbe\x79\xf8\xd3\xbb\x07\xba\x9c\x6f\x44\x4f\x29\x2a\xb4\xc7\x12\x56\x25\x2f\xe1\xa7\x53\x9a\x84\xad\x9f\x48\x86\x3a\xb5\x1c\xeb\x92\x2f\x89\x15\x4a\xab\xb4\xe3\xa5\x43\xcc\x11\x87\x0f\xd4\x48\x2d\x2b\x19\x64\x07\x2d\x14\xa7\xac\x98\xa4\x1c\xa5\x1c\xa4\x74\x52\xb1\x4a\xe4\xac\x93\xaa\xb2\xca\x60\xab\x0a\xed\x8a\x5a\x6d\x79\x6e\x72\x9d\x77\xff\xaf\xe4\x6f\x62\x37\xe0\xdf\x25\xff\x90\x90\x88\x15\xf4\x55\x7d\x3e\xfe\xf6\x89\xe7\xe2\x29\x62\x7d\x5c\x61\xbc\x3c\xc2\x89\x73\x88\xe0\xa5\x06\xc7\x30\x44\x8c\x66\x7c\x62\xa5\x29\x19\x13\xd0\x42\x1e\x9c\x85\xd4\x52\x40\x18\xb4\x90\xbe\x9c\x79\xbc\x02\xf6\x97\xa6\xde\xd8\xb1\xae\xb9\x4e\xbd\x24\x8f\x7c\x50\xf2\x57\x75\xfa\x4b\xf0\x33\x3a\x7d\x79\x62\xb8\xea\x44\x02\x8f\xf0\xa8\xeb\x33\x16\xae\x93\x03\x3a\x09\x01\x4b\x78\x21\x69\x1e\x59\x87\x1d\xa8\x00\xa4\xd0\x22\xa2\x18\xf4\x90\x06\xec\x90\x72\x15\xd0\x14\x7a\x48\x0e\xc4\xd6\xae\x76\x7e\xf1\xe1\x0c\x6b\xc8\x55\xd4\x6a\xac\xeb\x30\xd4\xb5\xf3\x3e\x78\x53\xe3\xda\xe6\x75\x5d\x36\x3e\x8f\x0b\x4a\xdf\xb6\x65\x5f\x27\x87\x5d\x12\x73\xc4\xec\x0e\x23\xe1\xdd\xad\x16\xe1\x33\xd2\x2d\x78\xae\x96\xbb\x3f\x14\xbd\x7e\xbb\xc3\x40\x07\xeb\xe4\x7a\x96\x30\xc1\x38\x29\x97\x39\x1d\x97\x52\x64\x7e\x39\x96\x29\xd4\x0d\x97\x65\x25\x39\x59\x5a\xde\x1e\xd8\x72\xb6\x20\x31\xf1\x35\xe4\xce\x38\x1b\xd7\x0a\x24\xa7\xc8\x09\x7c\x48\xaa\x27\xba\x6b\xee\x6a\x23\xa2\x2c\xaf\x7f\x56\x96\x17\xe8\xca\x8f\x7e\x1d\xe2\xb6\x6d\x41\x7b\xfd\xb0\xc8\xac\xbe\x48\xb6\x23\x8b\x47\x69\x5e\xd6\x9d\x34\xc8\x29\x25\xe0\x32\xd1\x30\x1e\xc8\x32\x59\x50\xd8\xf8\x1a\x12\x6b\xad\x09\x7a\x28\x7c\xa1\x06\x90\x27\x87\x44\xad\x76\xd9\xcd\x77\xb2\x7c\x7f\x95\x25\xb2\x48\x5f\xbb\x59\xef\x65\x79\x7c\xf7\x18\x79\x85\x1e\xcf\x31\x1d\x03\x6c\xd0\xe9\xb0\x7e\xf4\xab\x6d\x2e\x62\x6f\x7e\x34\xd3\x03\xfe\x71\x42\x3b\x83\x6c\xf3\x94\x40\x90\x73\x5a\x7c\xd2\x2c\xb8\xdd\x1c\x8c\x31\x66\x7d\x09\xce\x54\xb6\x0a\x53\xed\x48\x75\xde\xb0\x43\xed\x7a\xfe\xdd\x1d\x93\xbf\x8a\x52\xfc\xa7\xcd\x3f\xb7\xcb\x29\xb8\xc2\x45\xdc\xb8\x3c\xae\x8c\xe3\x37\x26\x8f\x8c\x64\xf6\x52\x65\xc9\xc5\x65\xd5\x92\xef\x0a\x77\x91\xee\xcc\x33\x5d\xd9\x1e\x14\x24\x34\xa7\x21\x74\xf8\xd4\x6a\x00\xad\x08\x4c\xee\x8e\xcb\x49\xaf\x87\x50\x34\x49\x39\x05\x67\x8c\xe6\x04\xd6\xa8\x12\xc4\x21\xca\x0b\xca\xf8\xc6\x29\x2e\xb2\x32\xe6\x61\xbe\x4d\xfe\xfd\xc6\x15\xf9\x0b\x08\xb9\xdf\xdf\x83\x05\x6f\x25\x80\xd7\xc6\xa5\xa8\xc1\x3e\x77\x38\xc5\x86\x68\xd3\x92\x63\xdd\x4c\x6c\x74\x9c\x12\x26\x7d\x47\x84\x28\x7f\xa4\x80\xfb\x88\x95\x2f\x43\xdd\x3b\xa1\x8d\x6f\x3a\x71\x36\x61\x02\x32\xb4\x07\x53\x6a\x5b\x6b\x81\x2d\x36\x16\x6b\xa2\x84\x16\x4c\xf6\x44\x09\xa1\xda\xaa\x32\x95\xcb\xd7\x1b\x25\xeb\x86\x86\x56\xc2\xbb\x2a\x49\x40\x3a\x3e\xb1\x3d\x3b\xd0\x88\xec\xfb\xfe\xd5\xed\x64\x75\x6b\x18\xbf\xe3\xee\xca\x8a\x5e\x08\x06\x12\x90\x08\x55\x75\x9d\x55\x8a\x32\xcb\x84\x70\xac\xde\x95\x00\xc3\xc2\x95\x42\x97\x28\x34\x56\x5b\x63\x8d\xbc\x0c\x59\x39\x38\x7f\x02\x79\xf4\xdb\xfc\xcc\xb1\xb6\xd5\xf9\xae\xbf\x2d\xfb\xe6\x77\xdf\x3e\xa4\x59\x1a\x89\xb9\xc1\x57\x7e\xed\xd6\xbe\x1e\x79\xf2\xbe\x4d\xb3\x77\x3f\x6c\xbb\xc7\x21\x77\xb9\xb3\xca\x73\x3e\x55\xbe\xcd\xc3\x40\x85\x30\xa6\xe2\x12\x63\x47\xb8\xf2\x7c\x18\x05\x27\x20\x4f\x4f\xae\xc0\xb6\x0c\xca\x42\x61\xc5\x41\x87\x3c\x8c\x72\x69\xfb\x1a\x24\xc0\x04\x35\xeb\x3a\x45\x69\x01\x46\x53\xc2\xd0\xb9\xc6\x68\xab\xf8\xe5\x9c\x8e\xad\xd7\x20\x07\xca\x01\xb4\x2a\x35\xc3\x30\x3c\x25\x64\x06\x25\x0a\xdd\x89\xcf\x91\x63\x9d\x3d\xd4\xbb\x3e\xf9\xf7\x9f\x3b\x07\x3e\xbb\xf3\x1e\x35\x70\xff\xee\xbb\xef\xdf\x7f\xf3\x10\x19\x79\x1e\xfe\x06\x7c\xfb\xf0\x5d\x96\x82\x77\xdf\xfd\x6e\xd3\x23\xe3\xd4\x45\xd4\x9c\xce\xca\xaa\x72\xda\xcb\xce\x84\x11\xc8\xa7\x84\x80\xf5\xaa\x5a\x60\xa7\xb4\xee\x65\x6d\x54\x18\x0d\x0b\x9c\x03\x74\x0c\xb3\xa7\xd4\x8b\x5d\x6f\x11\x9c\x1c\x71\xd6\xba\x78\x94\x0c\x67\x6f\x3a\x40\xdd\x11\x39\x44\xce\xbd\xaf\x67\x19\xce\x7d\x77\x14\xf5\x19\xb8\x60\xc2\xd9\xb6\x60\x02\x04\x85\xa9\xc7\x73\xb2\x4b\xfb\x67\x7f\x6c\x2b\xf7\x2f\xfa\xe3\x17\xdd\xb1\x3f\xbb\xdc\x3b\xd5\x70\x31\xeb\xa6\xcb\x43\xcf\xa4\xb4\x56\x0b\xa5\x1c\xe5\xd2\xb3\xa6\xe3\xab\x37\xb2\xc2\x15\xc4\xe2\x40\x1d\xe4\x96\x6f\xde\x10\x4b\xdd\xd5\x20\x07\x36\x88\xd5\x1b\x65\x9a\x83\xce\x20\x18\x06\xe7\xac\x71\xe3\x65\x4c\x4f\x7d\xad\x01\x04\xc2\x81\x22\x2f\x1c\x9a\x7e\xea\x8c\xad\x1f\x22\x1d\x1f\xcc\xc1\x24\xbf\x4b\xfe\xcb\x96\xaf\xfd\xe6\xe1\x33\x50\xf3\x3a\xff\x7f\x77\xa3\xc3\xb9\x1f\xd2\x1f\xaf\x1e\xda\x0a\x9f\xf6\xca\xa3\x5a\x57\xb6\x73\x47\x3e\xd5\x32\xf4\xf2\xdc\x87\x92\x86\x31\xd2\x1a\x18\xa1\x54\xad\x7b\x39\xdb\xd0\x03\x15\x4e\x04\xd8\x14\x5b\x2a\xb5\x3c\x98\xb1\x16\xd6\x1a\xd1\x29\xa7\x41\x32\x5b\x53\x01\x0a\x84\xc5\xce\x16\x52\x6a\xc1\xc2\x0c\x88\xab\xb4\x71\x56\x23\x8b\x4a\x3c\x3a\xe6\x92\x2c\x6d\x62\xef\x9e\x4e\xfe\x32\xc6\x46\x12\x10\xcd\x1b\x7b\xd9\x6e\x69\xd0\xdf\xbd\xbe\x2f\x77\xfa\xf0\xf8\xe1\xed\xc7\x48\x2d\x81\x31\x9f\xa5\xa7\xc2\x03\x96\xd6\x61\x06\x2a\x8c\x6a\xaa\x9a\xca\x57\xbd\x9c\xaa\x70\x02\xfc\x14\xab\xdf\xb3\x81\x11\x0f\x30\x90\xb8\xef\x7e\xd4\x87\xe3\xe2\x6b\x17\xc6\x70\xb6\x33\x28\x16\x9b\x56\x61\xec\xf5\x19\x50\x57\x3b\xc0\xb6\xfa\x4b\x0e\xec\x83\xd9\x8b\xe4\x2f\x63\x34\xe4\x8f\xdb\xc8\xde\xac\xf5\xdd\xf7\x57\xa9\xd6\x6f\xf7\xb7\xd5\x2a\xae\xfb\x31\x1e\x06\x26\xcf\xa8\xa7\xcc\x00\x08\x74\x36\x04\x91\xd2\xa5\xf7\x6d\x18\xd4\xdc\x07\x9f\xe6\xa1\xf2\x69\xbd\xc8\x14\x83\x64\x54\xc7\xf3\x5e\x60\xab\x16\x09\x66\x4a\xd5\x69\x0a\x8d\x70\x61\x00\x79\xa3\x2d\xd3\x4e\x58\x1e\x4a\xb9\x15\x83\xc7\x3e\x85\x87\x76\x9f\x3c\xdb\xe9\x59\xa2\xe4\x9e\xc6\xef\xdd\x0b\x1a\xbf\x28\xd6\xe4\xa9\x74\x8c\x73\x90\x03\x9f\x9d\x82\x48\x79\x28\x1b\xc0\x4c\x18\xba\xba\x0f\xad\x02\xb4\x0f\x38\x65\x41\xb8\xf4\xb8\x90\x7d\x82\xfb\xee\xd3\x29\xcb\x95\x70\x40\x02\x16\x72\xe7\x86\xce\x0d\xe7\x65\x4e\x61\x38\x75\xd6\x9f\x9d\x73\xe3\x36\xde\x38\x98\x63\x8f\xfa\x5f\xc6\x9e\xc1\xaf\xc9\xf4\x26\xe2\xca\x7d\x61\xab\xb4\xf0\x9c\x7b\x26\x35\x20\xc0\x65\xc7\xa0\x52\xbc\x0c\x00\x02\x28\xe6\x53\xdd\x85\x59\xce\x7d\x90\x69\x79\x35\xd6\x41\xe3\x46\x5f\xce\x29\x96\x42\x02\x0c\x60\xe0\xc6\x15\x54\x3b\xcb\xc3\x0c\xaa\xd1\x18\xd1\x38\xa3\x63\x1c\x2b\x03\xa7\x9f\x8c\xa7\x67\x99\x7e\xf7\x3c\x9e\xc0\xf3\x78\x4a\x5e\x5f\x45\x7a\xf5\x98\xa1\x1a\xd3\x1a\x53\x3e\x00\x9d\x4e\xe1\x08\x7c\x68\x2d\x48\xaa\xd1\x3a\x37\x49\x90\xe8\x30\x00\x1b\xe6\x1a\xd4\x61\x15\xa8\xef\x7f\x34\xbb\x42\xc9\x1a\x38\x20\x16\x57\xbb\x30\x3d\x25\xf6\x0c\xca\x85\xa7\x4d\xe8\x46\x0d\x12\x40\x5c\xed\x01\x4d\xb2\xf4\x18\xf1\x0b\xab\x5f\x92\xe9\xab\x63\x7c\x97\x7b\xc6\x3c\x44\x7a\x02\x30\xb5\xe1\x0c\x44\x98\xd4\x50\x79\xe5\x4d\x2d\xc7\x75\x88\xb3\xd9\x03\x11\x9a\x43\x85\xe7\xfa\x47\xb7\xa3\x18\x0b\x50\x01\x74\x37\xc4\x93\xa5\x4e\x69\x98\x1b\x7d\x02\x6c\x1b\xe2\x59\xe4\xa9\x36\x7b\x94\xfc\x55\xf2\xc7\xe4\xff\xba\xee\xd3\x8f\x0f\xff\x06\x6c\x48\x4a\xef\x5f\x06\xba\x5e\x47\xae\xe4\xbf\x06\x6f\x3f\x3c\xbe\x03\x9f\xff\xf5\xab\x5b\x14\xe8\x1f\xd3\x0d\xf7\xe6\xf1\xed\x35\x08\xf4\xe1\xfd\x9b\xf5\xd9\x21\x8b\xd3\xd3\x65\xc0\x90\x94\xba\x0b\x39\xa7\x63\x30\x40\x72\x4b\x39\x92\xb4\x2c\xf3\xa1\x18\xf5\xd0\x02\x22\xf6\x3d\xd7\x25\x86\x84\x40\x78\x74\x2d\xed\x1b\x2a\x70\x61\x90\x0f\x9d\x38\x56\x15\x69\x5c\xeb\xf6\xa8\x74\xae\x42\xa2\x14\x13\xc8\x95\x71\xdd\x62\x4f\xd0\x43\x0d\x8e\x01\x85\x71\x3d\x6a\x76\x00\x3a\x1f\xcc\x72\x6e\x0b\x07\x25\x80\x24\x94\xa0\xc5\x81\x60\x88\x15\x6d\x31\xe3\x60\x80\xb6\xec\x3d\x9e\xba\x24\xb9\xd9\x60\x37\x24\xff\x2a\xf9\xdb\x67\xbe\xb4\x9b\x11\xbe\xff\x25\x23\xfc\xe1\x9f\x6b\x85\x02\xa6\xf3\x65\x24\x05\x5d\xcd\x50\xb0\x9f\x33\x03\xc2\xfb\xee\xab\x76\xa8\x82\x13\xc7\x4a\xe3\xd5\x0e\xbb\x01\x63\x62\x65\xc9\x4a\x71\x9c\x84\xb6\xfd\xd2\x6d\x76\xa8\x03\x0d\xb3\x04\x05\x70\x00\x59\x4a\x83\x0b\xb0\x29\x6c\x21\x40\x4e\x02\x05\x1e\x07\x8d\x51\x29\x89\xa7\x4c\x00\x0f\xcd\x6a\x88\x63\xb3\x9e\xaf\xe9\x13\xcd\xce\xd7\x5a\xa9\x3f\xc6\xca\xc2\x0f\x49\x02\xae\x5c\xd6\xd7\x2c\xc7\xab\x48\xc0\xf4\xea\x9b\xc3\xdb\x77\x1f\x7f\xf8\xf0\xea\xed\xdd\x3f\xaf\xdf\x7f\x88\xf8\xca\xeb\x03\x20\x73\x14\x54\x08\x7b\x02\x01\x5b\x58\x5a\x76\xca\xc2\xaa\xa0\x15\xab\xa8\x31\x94\xb6\x8c\x75\x94\x66\x7d\x60\x81\xac\x9b\x7b\x0e\xba\x4c\x0b\x86\x65\x15\x0a\xa0\xa6\x69\x39\x5f\x06\x49\x4d\x5e\x60\x50\xc4\x78\xf6\xba\xe9\x94\xd9\x10\xdc\x79\xfd\x8a\xf5\xdd\xeb\x99\xc3\x5c\xe5\xfd\xdb\x2b\x43\xc6\x2a\xef\xc3\xbb\x1f\xbe\x22\x6f\x24\xdb\xfd\x79\x89\x77\x42\x78\x01\x34\x2c\x6b\x8c\x40\xb5\x24\xa9\xea\x23\xbc\xb8\xc1\xa2\x12\x9a\x5b\xcb\xf9\x31\xc6\x5b\xb3\x2e\xf0\x40\xcf\x64\x02\x43\x56\x09\x46\xd4\x55\xe2\x90\x5c\x8e\x9c\xe7\x9a\x02\xb8\x05\xe0\x01\x0e\x65\x36\x06\x7b\x15\xf8\x90\xc2\x44\x3f\x88\xab\xbc\x5b\x1d\xd5\x7a\xc6\x78\xf3\xd2\xbe\xd9\xe3\x9b\xc7\xd7\x3f\x25\xd6\xbe\x17\x78\x7f\x7d\x32\xd6\xe9\x1a\x8c\x10\x35\x18\x81\xc9\x5d\x9a\x4c\x74\x7c\xe3\xd4\x2e\xbd\xa9\x8d\x77\xce\x7b\x00\xeb\x1a\x20\xef\x77\x8c\x04\x19\xac\x00\x04\x58\x30\x92\x92\x30\x1e\x24\x40\x75\x98\x97\x6a\x83\x39\x58\xb7\x4d\x18\x9f\x3a\xc3\xa1\x1d\xd6\xaf\x18\xf7\x64\x0f\x64\x37\x3f\x8f\x87\xf5\x94\x7a\x95\xf4\xf1\x3f\x80\x9f\x52\x50\x6f\x44\x60\xdb\xe2\xf5\xbb\xbf\x06\xaf\xef\x32\x03\xef\xdf\x3c\x7e\xc8\x3a\x88\x1c\x46\xa9\xf9\x71\xda\x6b\x25\xa9\x40\x9a\x90\x30\xbb\xed\x0f\xd5\xb6\xf7\x3b\xfb\x49\xeb\x28\x48\x03\xa0\x03\x70\x27\x48\x89\x29\x0f\x12\xa9\xe5\xc8\x39\xd4\x05\xd5\xe7\x73\xac\xf7\xee\x52\x14\xe6\x41\x82\x12\x38\xd0\x87\xa9\x5e\x48\xec\xf3\xde\xf8\xcc\xf9\x13\xdd\x95\xff\x87\xc6\x32\xe6\x8e\x01\xbd\x8e\xe5\x12\xf0\xa5\x4c\x59\xab\x2c\x32\x05\xab\x78\xc5\x8c\x61\xac\xe3\xbc\x67\x2c\x8e\x65\x1a\xce\x04\x24\xa0\xff\x67\x8e\xe5\x34\xad\x13\x19\xf7\xcf\x7f\x1f\xc7\xc4\xe3\xc7\xf7\xdb\xbd\xf1\xa7\x70\x48\x8f\x1f\x1f\xc1\xd6\x3d\xf7\xb2\x4f\xe1\xda\xe5\x95\xd6\x69\x59\xd4\x45\x5a\x2c\x53\x91\xe6\x4a\x61\x8a\x64\x49\x2e\xad\x07\x53\xb1\xcc\xe9\xd9\x63\x6c\x9f\x92\xc8\xe0\xb5\x0a\xf1\x94\xb8\x92\x68\x86\x25\xde\x8f\x75\xed\xfc\x45\x8a\xc8\x74\x9d\x9e\x2f\x62\x87\x7d\xe8\xb1\xe2\xda\xea\xa7\x24\xc2\xac\x71\xc6\x2b\x5d\x25\x69\x26\xaf\xdc\xa9\x57\x59\x9f\x19\xa2\x7e\x2a\xeb\x87\xab\xac\xb1\xb7\x62\x35\xeb\xd6\x4f\x71\x95\x35\x93\xe0\x18\x71\x55\x40\x2b\x25\x61\xa5\x22\x78\x21\x1e\x34\x81\xa4\xb5\x43\x58\x0c\xa7\x93\x9f\xe7\xa1\x2a\x89\x61\x98\xe1\x7d\xdf\x75\xbe\xff\xd4\x4a\x05\x6b\xc8\x33\xf7\x49\xef\x51\x1f\xaa\x52\x71\xdb\xad\x27\x50\x6a\x3b\x2b\x38\x51\x7a\xc3\x06\xaf\xd6\xb5\x61\x8f\x92\xff\xb0\xca\x18\x6b\x67\x7f\xde\xa0\x77\x3d\x89\x2f\xad\xfa\xae\xca\x04\x2c\x5a\x94\x25\x97\x11\xa7\x93\x10\xca\x97\xbd\x44\x9f\xa0\x4b\x35\xbe\x0c\xa9\x67\xe4\x44\xb0\xc7\xf8\x18\xaa\xad\x72\x91\x81\x2e\x54\x3d\xdb\x69\xc1\xb1\x76\xee\xd2\x5e\xa1\xa7\xfc\xc5\xec\x0a\x17\x8e\x5c\x0a\x51\x72\x62\xed\xea\x86\xc4\x5a\xab\x22\x8f\x1a\x8b\xbd\x7d\xbf\xc1\x9e\x9f\x45\x7d\x7b\x27\x6a\x34\x6a\x56\x82\xd9\x47\x94\x95\xe3\x33\x28\x16\xf4\xa0\x0b\x10\xd4\x8c\x30\x82\xea\x12\xcb\x69\x03\xc4\x3d\x83\x7c\xd2\x25\xde\x77\x7d\xef\x8e\x9f\xba\x3b\x9b\xc2\x63\x30\xca\x56\xa6\xac\xc4\x67\xbb\x72\x1e\x6d\x6a\x9e\xd8\xae\xba\xc9\xf9\xfa\x37\xcb\xf9\x13\xe7\x1b\xd0\xf8\x08\x95\xe3\xa5\x20\xb4\x54\xb8\x5c\x2a\x0f\x5c\x10\x40\x13\x4c\x31\x72\x65\x29\x8e\xe3\xe8\xc6\xf1\xa8\x50\x79\x15\xb1\x95\x12\x7a\xc8\xb3\xfa\x53\xb5\x8a\xa8\x95\xf9\x9a\x88\x49\x9a\xea\x7f\x89\x2d\xbf\x98\x4c\xa9\x4e\x49\x13\x91\x74\x12\x55\x51\x51\x6a\xca\x2e\xb6\x4e\xf3\xe5\x08\x7a\x41\x35\xc5\x35\xa1\x26\x9c\x00\x09\x47\x1f\xa3\xfc\x27\x87\xe9\xd7\x47\xa8\x51\x56\x9b\x52\xbf\x14\x35\xbd\xd6\xa9\xfe\xd9\x3e\x4f\xc0\xb9\x4e\x93\x90\x80\x51\x49\xca\x91\xa2\xf8\x72\x5e\x27\x55\x0e\x6a\x4e\x39\x29\x6b\x8c\xe5\xbc\x61\x35\x9f\x40\x31\x57\x25\xf9\x19\x29\xab\xaf\x1a\x34\x8d\xe7\xd5\x3f\x5f\xce\xf4\x98\xc2\x3a\x85\xcb\x0c\x66\xa5\x28\x2f\x35\xa1\x97\xde\x81\x69\x99\x41\xcb\xa9\xa4\x65\x8d\x49\x75\x5e\xef\xfd\x7e\x5d\x20\xcf\x06\xff\x9c\x9c\x5f\xb3\x66\x12\x6b\xd1\xdb\x58\x4f\xbb\x45\xe3\xde\xde\x58\x40\x5f\x3d\x3e\x7c\x26\xf5\xf9\xa2\x74\x63\xe7\x5b\x0a\xce\x97\x04\xf0\x36\xed\x17\xba\x3e\xd3\xce\x86\x7c\x9d\xcb\x29\xfd\x71\x48\x45\x9c\xd0\xf9\xc1\x60\xb5\xb4\x29\x9f\x55\xe8\x54\x68\x9c\xb2\x95\x73\x95\x55\xb1\x4e\x5f\x3d\xf8\x7d\x71\xed\xa1\xf9\xfe\xb9\x0f\xee\xd5\xe3\x0f\xe0\x33\x3d\xcf\x17\xbf\x39\xe3\x0d\x2a\xb3\xe2\xc7\x0a\x0c\x38\xd4\x3b\xfe\xa9\x5d\x9f\x30\x1f\xec\xb5\x7c\x84\x9e\x87\x8c\xc5\xf2\x91\x7c\x5f\x94\x14\x2f\x75\x2a\x59\x38\xca\x55\x80\xd6\x4a\x2b\xac\x15\x76\xe3\x08\x4b\xa7\x27\x19\xb9\xbb\x37\xce\xab\xef\x3e\xeb\x7e\xcf\x68\xf4\xa5\xf2\x53\x5d\x82\xe9\x82\x01\x43\xc7\xf5\x57\xae\xcf\xbc\x13\x01\x03\x1f\x54\x9a\x7c\x22\x69\x19\xd3\xe2\xf0\x60\x4b\xbb\xa0\x74\xa2\xc1\xd5\x81\xd4\x81\xb9\xd6\xb6\x6e\x7d\x89\xb5\x02\xe4\xa1\xde\x97\xc9\xef\x22\x13\xd6\xdb\x38\x4a\xbe\xdd\x20\xfe\x6f\x67\x81\x87\x77\xdf\xed\x7f\xf8\xf8\xf8\xb0\xbf\xe3\xdb\x88\x35\xd9\xb1\x01\xfc\x16\x90\xfc\xee\xe3\xe3\xae\xf0\x65\x09\xce\x65\x09\xa0\xbf\x4c\x9e\x71\xc0\xc1\x80\xcb\x80\xda\x54\xd8\x4a\x68\x33\x68\x51\x73\x17\x58\x4a\x50\xee\x61\xca\x43\x31\x01\x2c\x82\x3d\xf7\x81\x09\x20\xbb\x80\xf7\x25\xc6\xa5\xe1\x64\xe9\x41\x17\x78\x9a\x97\xb6\x19\x09\x33\x9d\x34\x95\x93\x92\xd6\xba\xd2\xa1\xe5\xaa\x90\xcc\x1a\xd2\x54\xc3\x99\x5a\x1c\xeb\xb1\x8b\x67\xcc\xf1\xbf\x8e\x08\x18\xff\xed\x4b\x3d\x0e\x57\x45\x0e\x5f\x6a\x72\xb8\x69\x92\x6d\x37\xee\x6c\xf2\xb0\x4c\x29\x65\x80\xad\x9a\x60\xaa\x00\x01\x27\x86\x03\x66\x3c\x95\x9a\x19\xaa\x8f\x96\x69\xa3\x03\x49\x09\x2c\xea\xbc\x48\xf9\x72\x1a\x01\x13\xc1\xcd\x75\xc8\x39\xe8\x6c\x28\x0e\x1a\x53\x5a\x55\x7c\x11\xb1\x3a\x80\xe3\x52\x9d\x5b\xa6\x14\xeb\xac\x67\xde\x52\xdc\x19\x66\x82\xe4\x12\x72\xe6\x3a\xd9\x38\x90\x87\x41\x79\x3e\x26\x7f\x11\x63\x8b\xeb\xbc\xbd\xf5\xb4\xfd\xe9\x19\x47\xf8\xe7\x7b\xdb\x5e\xfd\x14\xc6\x70\x5b\xb6\x5f\x3d\xde\x81\xb6\x82\xeb\xe9\xf3\x21\x17\xa1\x5a\x7a\x0c\x06\xe0\x3d\x97\xae\x0a\x3d\xc3\xbe\x24\x93\x20\x8e\xb0\xac\x31\x46\xaa\x08\xfe\x45\x96\x48\xb0\x69\x7c\x30\xf3\x0c\xcc\xbc\xf8\xf8\x36\x1f\xb4\xe7\xd0\x6b\x3c\x58\x5e\x6b\x65\xa8\x95\xb0\x72\xd4\xe9\xd0\x2e\xce\xf7\xeb\x39\xa4\x60\x3e\x58\xa0\x7d\x5a\x29\x15\xfa\xb6\x6d\x03\x6a\x9a\x26\xf9\x8b\x88\x65\xdf\x46\xae\xef\xdf\xac\xdb\xfe\xfd\x9b\xc7\x9f\x55\x0f\x6c\x64\x96\xcf\xef\x0f\x90\x07\xb4\x70\x9c\x12\x70\x8c\x29\xbf\x50\x09\xe2\x31\x3f\xc5\x57\x30\xd4\x60\x70\x4e\x55\x4c\x21\x4b\xd9\x65\xf6\x75\x0d\xc6\x75\x35\x0a\x3d\x98\xd6\x2d\x21\xa0\xcf\x9f\x0f\xc6\x4a\x58\x1b\x3c\x38\xde\x54\x51\x4d\xa4\x2d\xf3\xd5\x59\x2c\xce\x0f\x3c\x1e\xb7\x9a\xab\x9a\xe1\xd8\x34\xcd\xa6\x64\xc4\xa3\x6d\x63\x2f\x9c\x4c\xf6\xc9\xc7\xe4\xff\x13\xeb\x83\x37\xed\x6e\x18\x05\xef\xef\xda\xaf\xbf\x0c\xad\x7f\x7c\xfb\xe1\x7d\x7c\xf9\xc3\xbb\xc8\x8d\x72\x05\xcb\x61\x2c\xd8\x65\x22\xe0\x18\xce\x82\x00\x2c\x48\x5d\x4a\xb7\x4c\x79\x91\xca\xc5\x14\x30\xc5\x5c\xdb\x9e\x0f\x4d\x3b\xd3\xc1\x69\x4e\xa8\x36\xac\x9f\xf3\x62\x74\x25\x05\x90\x69\x45\x46\x56\xea\x92\x1e\xa4\x11\xd0\x75\x95\x71\x1d\x36\xde\x72\xe6\x38\xb5\x47\xcd\xb0\xa7\x55\x45\xeb\x92\x57\x5e\x08\xd5\x4e\x8e\x71\x2b\xd8\xc5\x5b\x21\x6c\x36\x70\xc1\x04\x4f\x92\x5d\xc2\x9e\xe8\x0e\x5d\x75\xfb\xef\xb1\x6e\x37\xea\x96\xdd\x42\xaa\x1f\x3f\x1f\x14\x7f\xaa\xea\x37\x2f\x74\xfd\xf8\xc3\xc7\xc7\x37\xbf\xdf\x32\xa9\x59\xcf\x42\x1b\x8a\x12\xb8\x23\x13\xa6\xe3\xdd\x50\xf4\xba\x24\x86\x93\xb3\x40\x0d\x66\x36\xa0\xbc\x48\xe1\x32\x14\x10\x9c\x25\x91\x42\x09\xd9\xcc\xf4\xe8\xaa\x91\x95\xc1\xb8\x32\x02\x02\x1d\xa4\xe5\xd0\x7d\x4a\x6a\x23\x01\x04\xdc\x79\x2b\x18\xaf\x4c\xeb\x89\x71\x57\x3d\x8b\x81\x0a\xa1\x95\xb0\xd4\x63\x29\x0a\x5e\xe5\x62\x87\x6f\xba\x65\x3c\xd6\x78\xad\xba\x7d\x48\xfe\x5b\x42\xbf\xe6\xb7\x2b\x80\xc3\x67\xb0\xcb\x5b\x89\xe4\xeb\xb7\x5b\xd3\xfc\xcd\x6b\xdb\xf0\x7d\x28\x79\xa8\x96\x0e\x83\x29\xcc\x92\x00\xa6\x70\x43\x64\xb3\x0c\x28\x35\x8b\xc4\x29\xe7\xd6\x0d\x6c\x6e\x87\x30\x51\x90\x34\x15\xe7\x52\x77\xfc\x04\x60\x91\x87\x73\x8d\x29\x20\x4c\x6b\xfa\x94\x30\xac\x4b\xb6\xa9\xd7\x55\xa6\x6e\xb0\xb3\xb6\x76\xd6\xf6\x9a\x63\xcf\xb4\xa1\x75\x29\x2a\x67\x2b\x31\x81\xc4\xf1\xcd\x6f\x46\xde\xf9\x6d\x1f\x63\x25\x6e\x0f\xaf\x73\xef\x9f\x9e\x3d\xf7\xdd\x3d\xb3\xf9\xf7\x57\xfc\xcc\xcf\x63\x73\xff\xf0\xdd\xf7\xd7\xae\x89\xb7\xb7\x62\xd6\x7b\x35\x0f\x5a\x05\x78\x91\x3c\x9b\x80\xf5\x4c\x58\xb9\xcc\x51\xd8\xc0\x05\xd9\xa9\x0b\xce\x8b\x1d\xff\x64\x20\xca\x46\xdb\x9d\x80\x20\x81\x86\x63\x98\x82\xe3\xa0\x1c\x1b\x93\xfb\xb9\x02\x6c\x3d\x42\xce\x45\x1e\x7c\x5f\x12\xe0\x6d\x77\xd4\x7b\xa8\x25\xb2\x48\x10\x23\x98\x42\x8c\x53\xc6\x4a\x59\x19\x8c\x2d\x29\x95\x13\x18\xd6\x48\x09\xec\x51\x29\x74\x63\x74\x73\xb2\x18\x1b\x46\x16\x2c\x08\x11\xc9\x2e\x85\x11\x3f\x78\xf5\xe3\x0f\xc9\x3f\x46\xd4\xdd\x5f\x99\x7f\xdf\xdd\x79\x32\xc6\x13\xbf\x74\x24\xe4\xa1\x58\x08\x49\x79\x70\x5a\x00\x6f\x58\xc3\xcc\xb4\xb0\xbc\x58\xef\x18\x10\xa5\xbd\xf4\xdd\x99\x87\x79\x9c\x43\x4f\x41\xd1\x3b\xa5\x5b\x03\x4a\x15\x7a\xa0\x50\x68\x26\xc6\x81\x94\x8d\xe3\xa1\x95\x44\x13\x11\x9d\xe9\xfb\xca\xf8\x76\x75\xe6\x36\x3a\xa3\x3b\xa9\x36\xc4\xaf\xee\x1c\x9b\xf5\x8a\xcc\xe2\x30\xbe\x78\x2b\x85\xcb\x46\x21\x99\x14\xf1\xec\xd0\x3e\xeb\xf8\xdb\xd7\x98\xfd\x6d\x8d\x49\x5e\x3f\x7e\x75\xb4\x22\x16\xf8\xe2\x71\x9a\x84\x5e\x51\xa0\x2a\x52\x93\xaa\x5f\xda\x1c\xa6\x7e\x61\x05\x4a\x95\xb0\xf5\xc8\x4f\xdd\x10\xce\xec\xd4\x18\x5e\xd5\x06\xe4\x6a\x3d\x4f\xe7\x45\x18\x5a\xcc\x00\xe3\x4e\xb3\x30\x72\xa2\x31\x8f\x2b\xcd\xaa\x63\xdd\x60\xeb\x5e\xae\x34\x7a\xd5\x51\xd9\xb1\x55\x00\x01\xf9\xbc\xd6\xac\x4a\x3e\x8f\xd9\xb4\x7b\xe2\x57\xfc\xe4\xef\x92\xff\x94\xfc\x43\xc4\xb1\x78\x89\xd2\xb1\xf5\xd2\x7f\x1e\xaa\x9b\x1b\x3f\x46\xc8\xa8\x7b\xf6\x93\x07\xee\x2f\x67\x0f\x8e\x10\x39\x0c\x83\xc2\xa4\x3a\x09\x8f\xc1\x59\xd6\x23\x28\x58\xe8\x9f\x92\x21\x62\x75\xf7\x7c\x76\x2a\x48\x2c\x53\xea\x96\xc1\xfb\x14\x2f\xc3\xbe\x0f\xb3\xf3\x00\x71\x8a\x85\x5a\xe2\x2d\xe7\x84\x95\x6d\x2a\x8e\x1d\xd5\x15\x37\x8c\x13\xc8\x2c\xe5\xab\xed\xa4\x4c\x55\x30\xe7\xad\x1e\xb3\xba\x93\xff\xef\xae\x51\xa3\x97\xf2\xdf\xa0\x00\x5e\xca\xff\xfd\xc7\x7f\x02\x5f\x68\xc0\xfc\xe5\xe8\xc1\x04\xb1\x23\x28\x70\xa5\xcf\x95\x83\x28\xc5\xaa\x9b\x01\x5c\x57\xcf\xd3\x14\x3a\x09\xe0\x51\x80\x44\x95\x02\x87\x12\xab\x54\xfa\xa5\xf5\x3e\xe5\x4b\xfb\x52\x09\x2f\x44\x7f\xc6\x04\x5f\x95\xa8\x14\x37\x54\x90\x82\x40\x4e\xa8\x08\xe2\xb3\x1a\x87\x0c\x3f\x55\xf1\x5e\xb6\xf1\xd3\x6f\x55\x2c\xab\x16\xdb\xed\xe1\x19\x2b\xe5\xe1\x0e\x7c\x23\x7e\xaf\xfd\x92\x47\x83\xd7\xab\xc1\x53\xb5\x78\x95\xd1\x4b\xef\x6f\x15\x3a\x61\xf8\xbf\x49\xfb\x7b\x60\xb9\x71\x2d\x4f\x10\x27\xc8\xfc\xe0\x8b\x8e\x99\xe6\x2d\x95\x4a\x9c\xff\x74\xf7\xe3\x7d\xb7\x24\xb1\xe7\xab\x31\x4f\x2d\x09\xff\xe9\xee\x69\xc4\xee\xc4\x0e\x62\x67\x63\x17\x1b\xb1\x1b\x0b\x6f\x61\xc2\x84\x09\x13\x26\x4c\x98\x30\x69\xd2\xa4\x49\x93\x66\x9a\x69\xd2\x4c\x93\x26\x4d\x76\x29\x89\xbb\x41\x30\xf3\x7e\x49\xf5\xaa\xba\x5a\x51\xcc\x4b\xe9\xbe\x78\xf9\x3b\x07\xdf\x38\xe7\xfc\x7e\x1b\xfe\xa5\xda\xb6\x5e\x84\x62\x4c\x17\x80\xf9\xc1\x98\x39\x02\x5d\xeb\xb3\xc6\x63\xb7\xea\x51\x98\xbd\xd9\xa2\x17\xdf\xff\xc3\x9b\xdb\x47\x47\x7e\xeb\xfb\x37\x25\xcc\xe3\xc9\xfd\xc4\x6d\x52\xe6\xc5\x3c\x6e\xa3\x2f\x51\xbe\x45\x3f\x1d\xdc\x26\xfd\x32\x2d\x8f\xd7\xfb\x74\x9a\xb6\x08\x51\xdf\x57\x15\x28\x61\xe9\x5b\x2d\xe6\x0a\x48\xe9\x6b\xe9\x2b\x13\x5d\xee\x2a\x7f\x9b\xfd\xda\xcd\xd0\x81\xba\x28\x2b\x54\x7a\xb5\x34\x81\x48\xca\x73\xef\xc0\xe8\xb3\xe5\xf1\xa7\x4d\xf9\xa5\xff\x45\xfb\x63\xf2\x1b\xbf\x9f\xbb\x33\x75\x71\x5a\xc0\x0a\x97\x1e\xc5\xe3\x9c\xc9\xe4\x74\x2e\xaa\x10\xb9\xaa\x66\xee\xab\x2d\xf9\xa9\xfd\xe5\xef\x9f\x7e\xe3\xf7\x4b\xb7\x18\x3b\x2c\xf6\x17\x9e\x2e\x67\x14\x99\xa8\xe5\x2c\x7e\xa1\xb9\xf5\x87\x8d\xfb\x22\x7e\xf9\xfb\x8f\xbf\xfd\xfb\x5b\x0b\x86\xbc\x74\xe1\xfb\xab\x99\xcb\x95\xe3\x85\x2e\x07\xc2\xb9\xf1\xdd\xa6\xfb\x82\x7f\xe9\xfb\xd7\xbc\xef\x26\xc9\x9f\x70\x8d\x3f\x8c\xe1\x4b\xe1\xd1\xc7\xfd\xfb\xe2\xed\x25\x6c\xfe\xc3\x9b\xfd\xdb\xd7\x1f\xde\x6d\x3f\x7c\xdc\x5d\x8f\x70\x7b\x68\xbc\xd0\x98\x36\x62\x02\x6a\x2c\x01\x06\x18\xe9\x0a\xa8\xfb\x48\x36\xcc\x77\xbd\xf6\xba\x2e\xc4\x72\x76\x0b\x4f\xee\x4b\x8c\x41\x57\x08\xcc\x18\xce\x04\x11\x79\x46\x19\x46\xe2\x60\x09\xb1\xa5\x3f\x71\x3f\xb1\x65\x3d\xa7\xf7\x38\x19\x92\xfc\x92\xb1\xb4\x32\xec\x3e\x82\x78\x7f\x81\xb8\x7b\x82\x31\xf9\xf0\x71\xb7\x7d\xf7\xfe\xf5\x55\x4d\x24\x61\x01\x87\x3f\x34\x86\x14\xda\x0b\x5d\x16\xb4\x91\x13\x50\x53\x01\xf0\xb1\x2e\x81\xe6\x6a\xf1\xcc\x0a\x2c\xc9\x03\x12\x84\xc5\x05\x61\x96\x09\xc4\x17\x88\x5e\xd8\x52\xa0\x92\xb7\x2b\xb4\x05\x5b\x92\xed\xeb\x9d\x8d\xfe\xea\x92\xd1\x1f\x54\x71\x43\xd0\xfa\x12\x4a\xbc\x62\x0b\x35\x7e\x1f\x97\xed\xe3\xc7\xbb\xfd\xee\xcf\xc1\xee\xee\xf6\x02\x70\x39\xee\xee\x18\x9a\xdb\x24\x9f\x6b\x90\x01\x4b\x8c\x32\x67\xaa\xad\xa2\xa0\x02\xd9\xdc\x24\xe9\xb2\x8b\x52\x65\x2a\xb3\xb2\x4a\xd3\x24\xaf\xf5\x7c\xba\x72\x3b\xef\xac\x28\xb0\x50\xd8\x14\xa5\xaf\xcb\x12\xa8\x32\x17\x44\x88\x05\x2c\xaf\x50\x9a\x91\x94\xb0\xca\xe1\x9e\xac\x63\xdc\x5c\x78\xfa\x9f\x6b\x64\x3c\x61\x4c\x5a\xcf\x20\x37\x77\xd7\x90\xfb\xdd\x03\x73\xea\xc7\xb5\xdc\xfc\xe1\x92\x0c\x7c\xbc\xfb\xcb\xf8\x42\xf4\x72\x21\x7c\xd9\x34\x0c\x49\x86\x74\x09\x41\xee\x0f\x20\x62\xec\xa8\x2a\x66\x84\x93\x96\x28\x51\xf3\xaa\xf3\x13\x48\x0f\x87\xe9\x54\x22\xa0\xa4\x74\xd2\x1b\xe9\xe4\x4e\x89\xe5\x78\xc5\x89\x69\x7c\xaf\x7d\x7f\x50\xce\x2c\x47\x63\x32\xb7\x40\x1a\xa9\xcd\xc1\x54\xba\xd6\x8d\x61\xd4\x17\x4d\xa3\xeb\x7a\xcd\x76\x0b\x17\xe9\xbb\x44\xdd\xf3\x10\x43\x7d\x7f\xb9\xfd\xff\x87\x55\x9f\xf0\x72\x9f\xba\x1a\x72\x1b\x94\x67\x3e\x7d\x5c\x15\x2f\xfe\x01\x5c\x24\x40\x5e\xdd\x05\x45\xac\x0f\xcb\x96\x2f\x79\x51\xc2\x90\x1c\x40\x51\x16\x06\x82\xc1\x8f\xf2\x24\x8b\xdc\x1f\xa0\x90\xd0\x65\xec\xd8\x8a\xda\x52\x72\x94\xe3\xa9\x32\x8d\x24\x92\xc8\xba\x06\xb0\xf6\x65\xf8\xb1\xb5\x42\xc3\xd6\x0c\x07\x53\x14\x73\x53\x17\x39\xac\xe1\x81\x63\xd2\x8b\xb8\xc5\xba\x01\xa9\x6f\x0f\x07\xd7\x74\x1e\x75\x5d\xe7\xa3\xc3\xe1\x70\xe5\x77\x5f\xb9\xfe\x5f\xad\xac\x14\xd7\x2b\xbf\x75\xee\xff\xb8\x1e\xfe\x9e\xe8\xe1\x3d\xbf\xe0\xda\x32\x17\x32\x21\x9d\x5b\xaf\x2a\x6b\xc0\xbc\x00\x1d\x27\x9e\xc6\x92\x2b\x60\xbc\x12\x12\x93\x0c\x62\xe9\xf1\x4e\x35\xb6\x59\xd9\xca\x1b\xfb\xe5\xa4\x38\x33\xce\xc8\xd2\xfa\x23\x25\xb9\xcb\x73\x90\x47\x81\x3f\x49\xee\xab\x1d\x8b\xb6\xd1\x1f\xa2\x32\x8c\xba\xd5\x97\x1f\x6e\xbe\x7b\xf5\x26\x06\x17\x2d\x9f\x8f\x6f\xe2\x5d\x70\xe9\x4a\x43\xf9\x26\x4e\xde\x7f\x07\xbe\x7b\xb5\x8f\xdf\x6f\x33\xad\x94\xb0\xae\x77\xae\xf1\x75\x49\x4c\x56\x54\x99\x38\xd5\x9c\x52\xe5\xf4\xd1\x64\xa5\x85\x09\x63\xa8\x82\x74\xc7\xec\x41\x75\x9d\x77\x73\x0d\x5c\x4c\x8a\xb9\x98\x4f\x87\x22\x2f\x60\x0f\xfd\xa8\x09\x2b\x38\xe5\x75\x1b\xf3\xdc\x57\xbe\x47\x20\x03\xf8\x3e\xf2\x47\x02\xd0\x14\x25\x89\x0b\x5c\x5a\x30\xdc\x6f\xfd\xf8\x24\x5a\x75\x93\xdc\xde\xdc\x6e\x3f\x04\x1e\x96\x97\x59\xf7\x9b\x43\x65\x5d\x82\xdc\x3c\xc5\xa9\x67\xee\xd8\x88\x93\x9f\x20\xd7\x28\x75\x39\x2a\x4f\x07\xbe\x89\xa6\xf9\xe8\x39\x03\x55\x9c\xc6\xd3\x7c\x04\x95\x1f\x27\xdf\x08\x63\x9c\xf0\xae\x28\xe8\x54\xfa\x23\x41\x84\x5f\x72\xc9\x02\xdf\xf6\xf1\x52\x31\xb3\x6c\x3a\x43\x05\xe0\x85\xee\x3a\x6c\x78\x9e\xb0\xe1\xaf\x7a\x9e\xd7\xcb\x37\x9b\x94\x7e\xf4\x03\x4d\x38\xe8\xc4\xd1\xb3\x24\x9f\xdb\x13\xa8\x89\x4f\xfd\x10\x13\x77\x4e\x5d\x4c\xfc\xe0\x0b\x01\x04\x40\xb3\x03\x2a\x99\xce\x69\x78\x1a\x99\xa5\x26\x45\x2a\x2f\xa4\x51\xd0\xd1\xde\x0f\x33\x45\x28\x6e\x40\xde\x2a\x83\xf5\x7c\x94\xbe\x92\x51\x14\x83\xe9\x9e\x6e\x48\xb8\x8f\xc8\x42\xbd\xeb\xf6\xfd\xa7\xdf\x83\x87\x2c\x91\xa4\x51\xed\x7d\x44\x86\x4e\x51\xed\x28\xa1\x20\xdd\x69\xe6\xab\x56\xb7\x9c\xb7\xcd\x19\x26\x19\xc3\x76\x08\xf7\xeb\xc0\xec\xc6\x6d\x11\xfd\xbb\x50\x15\xf4\xe6\x9a\x4d\xf9\xe6\x8f\x9f\x6e\xd6\xd4\xb9\xa7\xa5\xaa\x97\xe2\x9b\x90\xa7\xf3\xe9\xf3\xdd\x6e\x0f\x5a\x57\x6c\x3a\x6e\x30\x2f\xba\xb2\x98\x10\x51\x82\x0d\xa6\x12\x9a\x1f\xdb\x41\x1c\x6c\x8b\x95\xc4\xa5\x3f\x70\x27\xfb\xb8\xa7\xe5\xa9\xc4\xdb\xa2\xa0\x73\xd3\xa7\x55\x6a\x80\xb2\x32\x2f\x35\xae\xb8\xa2\x1c\x76\x52\x71\x55\xe8\x2c\x27\xa4\x92\xb2\x3e\x09\xc9\xe9\xca\x13\x9b\xde\xf3\x7d\xb5\x19\x2f\x19\x6b\xff\x23\xfa\x3f\xa3\xff\xe7\x29\xd6\x10\x08\xbf\xdb\xfd\x39\xf8\xea\x36\xe2\xfd\xe7\x37\x01\xe6\xfb\x4f\xdb\xbb\xdd\xfe\xcd\xa7\x64\xbd\x9d\xf9\x70\xe9\x3b\x6b\xc4\xfc\x0f\xef\x3e\x3e\xcd\x7f\x4d\xa8\x2d\x12\xc1\x4d\x89\x0b\x5e\x96\x85\x28\x4b\x06\x4b\x0a\x11\x97\x92\x53\x8c\x4d\xcd\x8d\x52\x4c\x23\x78\x64\x4a\xb4\xb1\xab\x20\xd1\x8c\x4b\x6c\x30\x9f\x2a\xe2\x1c\x4e\xb3\xd4\x65\xd2\x8f\xa3\x4d\xa4\x24\x96\xc8\x33\xb1\x85\xb2\x6a\x33\x16\x6c\x3e\x1c\x33\x97\x19\xc0\x39\x31\x59\x6e\x8a\x5c\x32\x41\x58\x91\x3b\xce\x99\x2c\x64\x41\x88\xe6\xdc\xe5\x9c\x43\xe9\x0b\xa9\xa8\x16\xb9\x3f\x15\x79\x56\x64\x02\x76\x8c\x70\x10\x0a\x05\x2b\x5c\xf6\x0d\x69\x82\x6f\xf4\xbd\x08\x73\xe5\x35\xef\xf7\xbf\x45\xff\xd7\xe5\x16\xf1\x69\xf6\xc0\x6e\xff\xbc\x21\xdf\xad\x9e\xd9\x07\xd7\x04\x1f\xbd\x7a\x42\xdf\x79\xa1\xd5\xbd\xba\xe9\xe2\xa4\xa4\x77\x59\x9e\x44\xc2\x10\x56\x08\x02\x61\xca\x4b\xaa\x98\xa0\x5c\x32\xa2\x94\x13\x5a\x94\x25\x66\x65\x69\x73\x66\xe4\x11\x08\x85\xa0\x2a\x53\x81\x34\xe2\x71\x6e\x99\xa3\xe6\x7c\xb2\x84\x59\x09\x22\x07\x97\xa5\xcc\xa5\xf2\x3e\x6a\xe5\x4e\x15\x84\xce\x64\xca\x5d\x6e\xe2\xb4\x6b\xa8\xc6\x4e\x0a\xa9\x70\x67\x84\xae\xb2\x54\x17\x4c\xc0\xc6\xca\xe1\x84\x4c\xad\x67\xa6\x0d\x35\x3a\xed\x7a\x7a\xec\x28\xf4\x43\x4b\x4e\xbd\xd7\x79\x81\x6b\xd4\x0b\xcc\x56\xfd\x68\x11\xee\x55\xff\x53\xf4\xb7\xe1\x2e\xe4\x7f\x09\xfd\x25\xa4\x56\x84\xfa\xcf\x6c\xff\x98\xe2\xfd\xcd\x5e\xfe\xe6\xd3\xe7\xdf\x83\xc5\x2b\x37\x3f\xe7\x95\xc7\xbe\x93\x74\x9c\x12\x79\x90\x36\xcb\x13\x82\x60\x85\x48\x21\x21\xca\x73\x51\x30\x82\x99\x96\x95\x70\x5c\xb9\xa3\x38\x2a\x85\x35\xcc\xb1\x22\xa5\xcd\x25\xb1\x48\xc5\xa8\x62\x96\xb9\x73\x63\x09\xb7\x12\xa4\x15\x54\x75\x5e\xa4\x55\xaa\xef\xa3\xa3\xda\xa2\x56\x50\x71\x02\xa2\x20\x78\x16\xb5\xc9\x5c\x46\x35\x38\x74\x4d\x01\x35\x6d\x8c\x30\x16\xf5\x8e\xd7\x15\x54\x90\xf3\x09\x5a\xa7\x67\x61\x2c\x73\x26\xff\xca\x35\x45\x51\xa3\x13\x27\x74\xe5\xf8\x41\x7b\x9d\x34\xd1\x5f\x5c\xe3\xd3\xaf\x9e\x33\xe3\xbe\x7e\xe4\x1c\x0d\x5c\xb8\x61\x7a\x5b\xd6\xa5\xb7\xef\x37\x1f\xfe\xf8\x11\xbc\xbe\xfd\xb8\xfc\x4f\x34\xb0\x04\x9a\x02\x6e\xba\x9f\x86\x22\xdf\xb4\xf3\x21\x36\x3f\xf1\xd8\xce\x95\xb2\xac\xd3\xbe\xdf\xf6\x5f\x1a\xbb\x95\x84\x54\x7e\xca\x41\x29\xcb\x35\xda\xb0\xa1\x49\x4e\x68\x81\x91\xcc\x73\x8e\x38\x47\x9c\x70\x21\x67\x54\xc5\xa9\x17\x18\x65\x22\x2b\x40\x89\x90\x46\xcb\x5e\x0c\xdd\x93\x0d\x0f\xfa\x51\x8f\x68\x3f\x3c\x44\x55\x2f\x58\x1f\x58\xe0\xef\x76\x3f\x2b\x14\x61\xc7\x22\xb3\x45\x8c\x67\x0b\x63\xee\x0f\x40\x9c\x6d\x5e\xc8\x4a\xb6\x06\xa0\x1e\xc6\x47\xce\x43\xbc\x0d\xfa\xb4\xaa\xae\xfc\x7f\xdb\x91\xe0\x42\x58\xae\xad\xa1\x65\xce\xeb\x93\xb7\x96\xfa\x7e\xce\xb8\xc8\xaa\x8c\x12\xdf\x25\xdd\x7d\xa4\xbc\xd1\xe1\xbc\x2c\x42\x6d\x81\x8a\x7e\x88\xfe\xed\x03\x5f\xcd\xed\xb7\xa0\x86\xad\xfe\xcf\x43\x8d\x6b\x40\x90\x2d\x42\xe6\x52\x92\x7a\x0e\x86\x2f\x4d\x59\xca\x83\xba\x8f\x3a\x60\xfc\x09\x26\x4a\xca\xa0\xbc\x41\x67\xee\xdc\xf5\x48\xb4\x1d\xcd\x05\x2c\x81\x85\x68\x86\x0b\xd8\x88\xf1\xcc\xa6\x84\x5d\xc1\x5a\xb5\x60\xb5\xa1\xfe\xdd\x04\xbf\x3e\x60\x7d\xca\x40\xfb\x3a\xf4\x86\xf7\x57\x32\xe4\xed\x23\xd8\xcf\x57\xcd\x92\xa5\x97\xc4\x47\x40\xf2\xdc\xa4\x79\x7c\x3c\x4f\x65\x7c\xf2\x1a\x1c\xbf\x8c\x98\xb0\x93\xf0\x13\x88\x02\xed\x53\x82\x39\x27\xac\x50\x18\xa6\x33\xab\xaa\xb8\x9e\xd9\xf2\xec\x72\x0c\x8b\xb2\xd4\x58\x11\x49\x90\x38\x2e\xab\x55\xd9\xfb\x82\xd0\x4c\xa6\xa8\x89\x55\x8b\x07\x7c\xc9\xbf\xdf\xbb\x24\x8b\x6e\xa2\xbf\xba\xec\x06\xff\x71\xd9\x11\x3c\xb9\xde\x7b\xfb\xee\xfd\xdd\xc7\xed\xdd\x0f\x9b\x0f\x7f\xfc\xf1\xf3\xed\x5a\xce\x1d\x18\x09\xef\xae\x0a\x71\xeb\xa5\x58\xc8\x08\x79\xf3\xee\xfd\xe7\xdb\xd7\xbb\xa3\x19\x02\xe1\x63\xe1\xdd\x4a\xa0\x27\x41\xd4\x99\x36\x36\x93\x01\x51\x56\x00\xa8\x7c\xa8\x48\x9b\x65\xac\x6d\xac\x33\x25\x18\x82\x73\x7e\x76\x79\x42\x66\x5d\x81\x93\x2f\x62\x09\x4e\x79\x91\x17\xbe\x48\x32\x2e\x71\x91\x99\x82\xe0\xdc\xa4\x05\xe6\x42\x20\x8c\x51\x9e\x11\xe4\x8f\x08\xf9\x11\x53\x5e\x96\x65\xaa\x29\xa7\x94\x4e\x59\x56\xae\xeb\xda\x06\x45\xf5\xde\xed\x50\x88\x27\xfc\xe5\x65\xa7\x1b\x81\x97\xf7\xea\x77\x1f\x7e\x78\xf3\xc7\x4f\x9f\xd7\x7f\x03\x57\xb2\xc5\xcf\x57\x01\xbc\xdb\xf7\x7f\xfc\xfc\x48\xb6\xb8\x11\x49\x2a\x2a\x55\xe3\xce\xba\x96\xb7\xc6\x52\xdc\x21\x9b\x55\x68\x84\x90\x95\xe8\x3e\x02\xb9\x06\x85\x3f\xd5\x85\x20\x48\x66\xb9\xef\xbc\xcd\x0f\xb5\x1f\x54\x55\x81\xa2\xda\x21\xd5\x1a\x52\x6a\x24\x38\x56\x90\x9a\x56\x1a\x2b\xf2\x12\x63\x84\xe6\xc1\x18\x6f\x6c\x06\xa1\xd0\x08\x42\xaa\xb3\x4a\x84\xa8\xc1\x2e\x2e\xee\xf1\xbe\xda\xf4\xd1\x4d\x60\xdf\x58\x79\x2f\x23\xf0\x24\xf7\x7f\xbd\x85\x0d\xb9\xff\x9f\x9f\x9b\xf1\xf6\x51\xc7\xef\xed\xc7\xdb\xb7\xab\xc8\xe4\xeb\x24\x62\x1b\xe1\x8e\x1d\x40\xa5\x17\xc3\x7d\xe4\x0d\x02\xc5\xa9\x02\xa4\x57\xb3\x34\x15\xc6\x0c\x12\x0f\xc1\x60\x83\x7a\x85\xc0\x5a\x51\x93\x17\x73\x3f\xeb\x3c\xd6\x3e\x4f\x3a\xdf\x5a\xdf\x6e\xa8\x31\x8d\xc2\xa9\xcd\x24\x27\x16\x12\x9a\x09\x65\x75\x89\x08\x42\x3e\x95\xd2\x6b\x97\x61\xac\x0d\x46\x10\xa5\x3a\xad\x8c\x94\x81\xa7\x6d\x97\x44\xe1\xee\xab\xbc\xb4\xcb\xa7\xe8\xbf\xac\x7a\xe2\xaf\xe3\x97\xf2\x2a\xcb\x22\xb1\x7d\xd1\x2e\x4f\x94\x09\x8b\xcf\x8f\x1d\x2f\x21\xc9\x51\x35\xed\x48\xfd\x78\x3c\xf9\x13\x03\x79\x7b\x50\x6c\xc4\x52\x35\xcc\xaf\x55\x79\xde\x01\x57\x2d\xe7\xd5\x53\x9e\x57\x12\x57\x79\xe1\xe5\x3c\x14\x20\x1f\xbc\x08\xa2\xc2\xa0\x02\xd1\xae\xd4\x7e\x72\x1c\x55\xc4\x18\x62\x90\xac\x27\x2d\xb8\xe9\x0a\xca\x4b\x41\x66\xec\x9c\x27\x6d\x51\x16\xd0\x34\x08\x23\x96\x56\xd9\xc1\x5c\x62\x3b\x3b\xd0\x07\x3d\xc5\xf2\xd2\x4e\x8f\x76\xbd\xb8\x2b\x0f\xac\x87\x2f\xcc\x7a\xa6\xb8\x58\xbc\x7d\xb4\x2b\xe6\x1b\x6e\x8e\x27\x80\x98\x6f\xee\x23\xdf\x7b\x45\x81\x9a\x46\x2b\x40\x64\x86\x83\xf2\x0d\xce\x55\x81\x3d\x01\x43\xb8\x3e\x6a\x5d\x5e\x54\x3a\xd8\x96\xcd\x3c\x07\x14\x14\x3e\x5f\x4b\x29\x06\x40\x77\xa5\x9e\x2a\x86\x1d\xb1\x15\xd1\x58\x57\xe3\x41\x99\xf6\x99\x69\x59\x5e\x16\xd0\x36\x88\x20\xfe\xcc\xb6\xd8\xfd\x7c\x9b\x6d\x9f\xb6\xd9\x5f\x81\x0f\x5f\x19\xf7\xf6\xe7\x6c\x1b\x37\xa9\x6e\x3b\x90\x53\x7f\x1c\x26\x7f\x60\x00\x1e\x4f\x9a\x8d\x6c\x48\x5b\xe1\x0f\x28\x97\x05\xf2\x0a\x74\xa1\xcc\x07\xa4\x79\x59\x19\xb2\x58\x86\xe7\x3a\x07\x10\xa4\x1e\xbb\xc0\x6d\xd8\x81\x72\x57\xea\xfb\xa8\xe2\xa8\xa2\xc6\x12\x83\x54\x3d\xda\x76\x69\x35\x56\xf2\xc7\x56\x2b\x17\xcb\x30\x7e\x62\xd9\x36\xf0\x6f\xca\x1d\x8c\xbe\x7f\xa8\xf0\x0a\x6a\x44\x2f\x52\x21\xae\xb2\x44\xcb\x51\xf7\xe6\x42\xda\xba\x8f\x24\x67\x21\x27\xa7\x9c\xb5\x13\xa0\x53\x9e\x2f\x70\xaa\x0a\x34\x9e\x9a\xaa\xda\xc1\x99\x9f\xd5\xba\x42\xc4\xfd\x19\x6f\x48\x58\x4d\xb2\xd6\xd7\xa7\xf9\xe4\x0b\x35\x46\x20\xd4\xcc\xd5\x3b\xb1\xea\x86\xbe\xfe\x3e\xde\xdf\xbe\x4b\x3e\x3f\x50\x67\x3c\x21\xd0\x0e\x12\x3d\xfb\xcd\x35\xb4\x14\xd6\xb3\x4b\x45\xcd\xba\xdb\xbc\x4d\x6a\xe0\x34\x01\x47\x07\x4d\x9a\x41\xa4\xa8\xc8\x0b\x86\x25\x93\xcc\x4a\x41\x8f\x40\x7a\x93\x81\x74\x90\xc7\xc1\x2c\x03\x44\x60\x5f\x03\xd1\x53\xce\x0c\xc5\x54\x0b\x58\xf8\x71\x57\x9a\xdc\xb7\x7c\x02\xa2\xc4\xb8\x64\x5c\x50\x82\x29\xe3\x8a\x5a\xa9\x88\xc2\x7e\x74\xa8\x1b\xf4\xd0\x8c\x95\x6d\x41\xe6\x40\x86\x25\x55\x4a\x71\xce\xb4\x10\x81\xd3\xbc\xbe\x1f\x77\x7c\x1b\xad\x37\x0a\xaf\xbf\xdf\xed\xaf\xb2\xf4\x2f\xec\xb9\xbb\x6c\x89\x9e\xaa\x37\xdc\x5e\x0e\x13\x0f\x2c\x04\x71\x01\x1c\x45\x40\x99\x42\xa7\x05\x17\x54\xa8\xbc\xe0\x9c\x31\xc1\x2d\x37\xfc\x98\x66\xa0\xf4\x4d\x96\x8d\x3d\x1e\x47\x5e\x89\x89\xf8\x0e\xc8\x3c\x9d\xb8\xa0\x8a\x42\x2c\x51\x89\x4a\x3f\x6e\x8e\x26\x6d\x68\xdb\x95\x18\x21\x2e\x39\x86\x25\xe2\x92\x62\x86\x25\xe2\x9c\x9a\xb2\xa0\xd2\x1a\xaa\xa8\xb0\xd6\x50\xce\xb1\xa4\x14\x23\x5a\x42\x46\x23\x00\xaa\x7b\xb4\x33\x49\x1b\x22\x7e\x21\x71\xe0\xd1\x9c\xa7\xad\x73\xbb\x5b\xd7\xf4\xa5\x7d\xde\x3e\xb2\xd7\x7c\x7c\x66\x0e\x38\x82\x13\x11\x31\xaa\x6a\x06\x21\x85\x82\x22\xc2\x90\x64\x58\x08\x2a\x85\x1f\x53\xd0\xfa\x32\x4d\x41\x76\xe0\xed\x7d\xa4\xfd\x48\x00\x45\xcb\xa4\x95\xf9\x49\xd8\x92\x13\x84\x18\x41\xb8\xf4\x6d\x62\x54\xc5\xf5\x81\x21\x88\x10\xa3\x05\x26\x84\xf1\x92\x20\x8d\x29\xc3\xd0\x64\x39\xe5\x46\x72\xcd\xb4\xd0\x46\x12\x02\x55\x51\xc2\x92\x43\xb4\xd6\x71\x6d\xa2\xea\xbe\x89\xeb\xcd\xe1\xa1\xca\x2d\xdc\x5a\xde\xbd\x5e\x33\x24\x6f\x2e\x4f\x5c\xdb\xc1\xda\xa0\xa6\x3a\x6c\x0e\x5f\x32\xc4\xb7\xb9\x77\xa7\xb9\xeb\xe7\xee\xb4\xe6\xa8\xb4\xf7\x78\x5f\x6f\x86\x50\xa1\xf6\xff\xbf\xe8\x71\xbe\x68\xe8\x1f\x93\xb7\x4b\xaf\x7e\xee\x86\xdb\xd7\x77\x21\x4d\xe4\x5a\xc9\xf0\xe9\xe3\xdd\x25\xa2\x7f\xc8\x72\xcc\x14\x53\x45\x41\xa9\x22\x82\x29\xe1\x19\x9f\x7b\x30\xb8\x93\x26\x8a\x12\xc2\x19\x26\xa5\x6f\x41\x16\xa7\xa7\x14\x8c\xf3\x88\x3c\x65\x80\x12\x6f\x81\xcb\x2c\x68\xc7\x83\xec\x86\xcd\x40\x70\xc1\x39\x27\xb0\x84\xcb\x0f\x8a\x54\x0f\x86\x4c\x40\x7f\x38\x40\x53\x12\x0c\x05\x44\x4c\x7b\x69\x39\xb5\x7e\xaa\x8d\xae\x2d\xe5\xde\x4a\xab\x2b\x11\x6a\xf0\x51\xc8\xff\xf9\x9f\x96\xdd\xfb\xeb\x6f\x76\xe1\x65\xce\xbb\x58\x71\xa1\xcf\x88\x2f\x83\xf2\xd3\xc7\xbb\x8f\x97\x68\xda\x6a\xee\x14\x0f\xcc\xc5\x79\x8d\x6c\x56\x74\x0d\x6f\xfa\x12\xb6\x2d\xaf\x3a\x07\x52\xe5\xbb\x66\xcc\x62\x34\xd7\x69\x0a\x1a\xa0\x89\x17\x5e\x34\xf3\x09\xc7\x44\xcc\x53\x0c\xf3\xe1\xe8\x07\x7e\x72\x5c\x28\x2e\x34\x9d\x8f\x9b\xd6\x56\xf6\x34\x16\x84\x60\xa5\x25\xc1\x08\x6b\x2d\x88\xe5\xd6\xf4\x82\x33\x9b\xe5\xaa\xae\x96\xad\x2c\x74\x08\xa4\x96\x71\xd6\x28\xb3\x0c\x18\x4a\x78\x10\x3a\x03\xf1\x31\xe4\x1f\x88\x4b\x7f\x5e\xe6\x9b\xf8\x17\xe7\x9b\xf8\xeb\xf9\x26\x58\x96\x10\xd0\x6a\x16\x47\xf5\x32\xe1\x10\xac\xb8\xcc\x4b\xce\x24\x37\xbc\x96\x8a\x0f\xa0\xf2\x2c\x03\xd9\x20\xfa\xd1\x86\x09\x87\x78\x03\xcc\xc8\x25\x75\x9c\x72\x8d\x31\x2e\xfc\x31\xcc\x38\x07\x09\x22\xc0\x4b\x42\x20\xe7\x92\x10\x82\xe5\x3a\xe5\x50\xf9\x38\xe5\xdc\x47\x95\x6b\x41\xee\x40\x46\x24\x53\x4a\x73\xc6\x10\x15\xa1\xb6\xaf\x08\x79\x31\x4f\x6d\x7a\x9c\x43\x9f\x0d\xd2\xc5\xa4\xef\x1f\xd9\x4e\x2e\x67\x82\xe7\x53\x4e\x05\x46\xc7\x62\x7a\xc0\x26\xcb\x35\x92\xdc\x51\xc3\x95\x72\xb2\x93\x56\xfa\x01\x9c\x7c\x96\x01\x06\x4a\xe9\x47\xdf\x35\x5e\x31\x30\x30\x4f\xc1\xc1\x9f\xb8\x64\x35\x67\x52\x53\x4a\x4a\x5f\x5d\xec\x5a\x66\x52\x4a\x39\xe6\x92\x5a\x2a\x2e\x56\x69\xea\x47\x57\xe4\xdd\xa0\xc7\x66\x72\xa6\x03\xe9\x32\x93\x0a\x2a\x83\x55\x98\x86\x6d\x52\x04\x62\x7b\x59\x1b\x7e\x6d\x5b\x6d\xf7\xef\x1e\xba\xe1\x4b\xbb\x92\x14\x1c\x0d\x8d\xf3\x16\x99\x2c\x27\x54\x72\x5d\x94\x92\x29\x61\x45\x23\xb5\x98\x40\xeb\x51\x06\x30\x48\xe5\xe4\x4f\x8d\xaf\x39\xe8\x98\x97\xa0\xf6\x13\xe3\xcc\x72\x26\x34\xa1\xa8\xf4\x6d\x30\xab\x13\x6b\x73\x51\xb4\x34\x17\x25\xe4\xda\x5c\x8a\x2c\xcd\xd5\x8e\x7a\x6c\xee\x23\x7b\x31\x0c\x71\x2a\xc3\x12\x71\x31\x2c\xe8\xa1\xec\x69\xd0\x91\xff\x5d\xf4\xe7\x0f\x51\x8a\x95\xc7\xe4\xf1\xa6\xe8\xc7\x6b\x2c\x25\xdc\x0b\x6e\xfe\x15\x78\xc2\xdf\x9f\xd4\x55\x15\xc3\xae\xd5\xae\x9f\x0b\x7b\x1a\x14\x48\x37\x53\x75\x2e\x2a\x3f\xe1\x84\x81\x49\xf8\xd1\xd7\xde\x25\xa7\x73\x71\x7d\x36\xbd\x77\xa0\x94\x8e\x1b\x83\x69\xc3\x85\xf4\xcd\xb9\xc6\x24\x9e\xa0\x51\x07\x25\xc9\xc0\xfd\x61\xf9\x2f\xda\xc7\xf9\x25\xcf\x6a\xc5\x77\x65\xf5\x79\x86\x2f\xde\xbf\xff\x04\x9e\x04\x2b\xc0\x9b\xdd\x9f\x83\xe4\x09\xc2\x4d\xe3\x1c\x18\x9c\x70\xcc\xcd\xc2\x5a\xab\xeb\x4d\x56\xcd\xa4\xe2\x82\xc4\x06\xd4\xa2\x39\xe8\x31\x6e\x67\x72\x7d\x76\x6a\x1e\x41\xd7\x0d\xe4\x74\x40\xcc\x8f\x95\x6c\x7d\xf1\x65\xc2\x24\x51\x79\x61\x2b\x00\x95\xe6\xc8\x0f\xc6\x0b\xe3\xa5\x8e\xf6\x31\xba\xc7\x7b\x1d\x62\x5f\x57\x3d\x84\xb7\x41\x81\x75\x65\x5b\xbb\xbd\xb9\xbd\xd9\xbf\xff\xf1\xcd\xed\xa7\xcf\xb7\xbb\xa7\xc2\x07\xaf\xde\x2c\x73\xd3\x45\xf8\xa0\xad\xf3\x22\x46\x12\x64\x5f\x26\x2a\x41\x94\x83\x13\x81\xbe\x64\x59\x7c\x9a\x8b\xeb\x53\xe9\xd6\x4f\x62\x88\x65\x7f\x64\xfd\x69\xa7\x4a\x84\x6c\x7d\xce\x12\x87\xd5\xb1\xa1\x54\x2d\x27\x01\xea\x3c\x71\xbe\x13\x8e\x5b\x62\x88\xb1\x36\xc4\x4e\xf6\x2b\x87\xcf\x16\x07\x75\xd8\x35\x3a\xf7\x3e\xc4\xc8\x1e\x72\xf0\x56\xc9\xf7\xd7\x01\xe5\x53\xe7\x81\x65\x88\xfe\xc7\x35\x07\x25\xc9\xea\x12\xc6\xac\x84\x80\xff\x74\x20\x54\x82\x26\xe6\xb0\x9c\x07\x22\xae\xd1\xda\xe5\x89\x7b\x40\x00\x66\xbe\xf3\x8d\x57\xca\x8f\xde\x48\x20\xb6\xb8\x84\x50\x23\x74\x6e\xe2\xa9\x2c\x54\xad\x11\x42\xbe\x97\xbe\x52\xbe\x92\x7e\x80\xcc\x08\xa8\x84\x20\x55\xe0\x75\xdb\x27\xf0\x9e\x04\xce\xc1\x7f\x1d\x7d\x1f\xe5\xd1\x5f\x44\x45\xa8\xf7\x5f\xeb\xa7\x1e\xe0\x7e\x7a\xf3\x35\xdc\x27\xd7\x9b\x1b\x5b\x41\x50\x43\x0c\x8a\xb3\xcc\x73\x31\xe4\x80\x11\xe8\xdb\x12\xc6\x7c\xae\x1e\x9e\xac\xb5\xa2\xaa\x7d\xa3\x6c\xcf\xdb\x9d\x2a\x96\x81\x7f\xce\x13\x93\x67\xf2\xd0\x30\x4e\xbc\xb4\x9e\x05\xc7\x1e\x98\xd6\x86\x0b\xee\x84\x0d\x9a\xed\xf6\xbe\xd8\x37\x97\x7a\xf9\xd5\xa7\xef\x2e\xb5\xfb\x6b\x74\xf3\xee\xe6\xf3\x5a\x7e\xb6\xd9\xbe\xff\x7c\x73\x77\x0d\xe8\xdd\x7c\xfa\xfc\xf1\x76\x03\xe3\x7e\x2e\x1d\xa8\x3d\xf3\xa7\xe4\x20\x5d\xce\x98\xf3\xad\xb7\x85\xd3\x20\x0f\xcc\xb2\xb5\x67\x43\xe7\xd9\x0e\x79\xa8\x8f\x9e\x98\x99\x64\x3a\x4b\xfd\x00\xd2\xb2\xb0\x59\x3c\x55\xd5\xd2\xd4\x30\xcb\x4d\xb4\x8b\xcc\x3d\xdc\xdb\x6d\x14\xb0\xac\xfe\xfa\xf1\x2b\x2c\xdb\xd7\x77\x1f\x5f\x40\x79\xfb\xf1\x16\x88\x6d\xf9\x53\xef\x36\xd1\x39\xf2\xf5\xae\x39\x8e\xb9\x9f\xec\x6c\xe6\x22\x1f\x8f\x40\x24\xc3\x39\xbf\x3e\xdb\xc8\x57\x4a\xfa\x46\xcf\x87\x4c\x65\xfd\xb1\x2c\x4c\x1a\x4b\xa5\x96\x46\xd4\xa5\xb8\x68\xb0\x3e\xfa\x64\xc5\xf1\xf6\x6b\x1c\x5f\xbb\xe4\xc7\xb7\x1f\x6f\x43\xa9\xfc\xaa\xee\xe1\xab\xcd\xd8\x0c\xf9\x7d\xe4\x3c\xf1\x59\x71\xea\x00\xbb\x06\x84\x01\x06\xd9\xdc\x3c\x73\x4a\xfe\x6d\x9f\xc4\x32\x60\xc1\x7f\x12\xcb\x37\x9a\x27\x60\x61\x89\x3c\x5b\x17\xe3\xb9\xf3\xd5\xa6\x6f\x4e\xf9\xe4\x3c\xf3\xf9\x02\x85\x2e\xff\xba\x3c\x00\x83\x68\xee\x76\xd8\x17\xb6\xf3\xd4\xce\xf4\x29\x94\xd1\x86\x3e\x13\xa0\x44\x71\xa2\x42\x7f\x2e\xc2\xbd\xfe\x85\x2d\xf6\xf5\x93\x75\x23\xb9\x79\x2e\xca\xf3\xe3\xe7\x47\x86\x81\xf5\xba\x7a\x93\xc5\xc7\xd6\xd3\x02\x32\x64\x05\x57\x0d\x1d\x1c\x57\x08\x15\x18\xb1\xae\xc7\x20\x3d\x7a\x18\x1f\xe7\x63\x0c\xe7\xae\x5c\xb6\xdc\x62\x57\xcc\xce\x76\x04\x2b\xc3\x1a\x55\xf1\xca\x81\xcc\x37\x92\xa7\x2e\xe5\x87\x46\xd7\xa6\x06\xca\xd6\xa6\x9e\x89\x90\x52\xcb\x28\x4a\xc2\x98\x6b\x76\xea\xa1\x9a\xe7\xaa\xbc\xfd\x21\x5c\x25\xaf\x99\x4a\xd7\xe3\xe3\x93\xf9\x76\xad\x35\xbd\xce\x6c\xc9\x01\x44\xd5\x34\xa9\x4a\x3a\xa1\x06\x5f\x19\x03\x8e\x84\x30\x23\x59\x51\x38\x5f\xba\xa2\x64\x00\xb6\x73\x0f\xdc\x7d\x74\x02\xbd\x2f\x97\x67\xdb\x1c\x0e\xf6\xd8\x81\x14\x9d\x1a\x6b\x39\x2a\x39\xe1\x32\x2f\xce\x15\x65\xf1\x98\x67\xca\xd6\xf6\x78\xe6\xdd\x3c\x76\xcb\x9e\x59\xdf\xa3\x64\xdc\x89\xe8\x75\xf4\xdf\xa2\xff\x2d\xfa\xbf\x1f\x95\x53\x5f\x5f\x23\xbc\xcb\xfc\xf0\x09\x7c\xc8\xbe\x0b\x61\xd3\xf8\xee\x0f\xc9\x02\xf9\xa2\x69\xf0\xe4\xf5\xc3\xeb\xcf\x3f\xbc\xf9\x18\x3e\xff\x16\xfc\xf0\x26\xfc\x0a\xdc\x7c\xfe\xe1\xcd\xbb\x8f\xfb\x77\xa0\xe1\xca\xf6\x3d\x98\x86\xe1\x08\xe8\x1c\x35\xa0\xd2\x79\x96\xe7\x24\x13\xac\xa4\x25\xc2\x28\x67\x1a\xb1\x02\x61\x98\x33\x85\x34\x45\xa5\xa6\x65\xee\x2d\x2a\x59\x81\x00\xa4\xb0\xcc\x68\xbe\x13\x02\xe6\x8d\x6a\x5b\xd5\xaa\xb9\x8c\xdb\xe2\x3c\xf9\xca\x3b\xce\x33\xdf\x82\x14\x72\xea\x0d\x84\x92\x12\x04\x24\xe2\xd4\x57\x25\x94\x14\xa3\xa4\xb2\x90\xd0\xc9\x42\x44\xa4\x1f\x09\x03\x29\x62\xe4\x3e\x02\x91\x9f\x20\xc2\x4c\x42\x1e\xce\xcb\x2e\xdc\xfd\xbf\x7e\x60\xad\x79\xa6\x5b\xf1\x58\x74\x0e\x6e\x6e\xaf\x82\xbd\xe0\xf6\xf5\x6d\x32\x02\x69\x81\xf2\x83\x3a\x89\xa3\xb6\xea\xc8\x8e\xca\x0f\x49\xb1\x1c\x88\xbd\x06\x7a\x16\x49\x7d\x66\x5b\x3b\x0c\xba\xa9\x54\x7b\xf4\x15\x20\xbd\x91\xb6\xf5\xe5\x4c\xe3\xc6\x0f\x41\x6d\xc5\x6b\x13\x6d\x13\x78\x6f\x02\xc7\xf3\xb7\x30\x5c\x8a\xa4\xbf\x8d\x81\x81\xd6\x82\xd6\x77\x66\xd9\xe3\x47\xce\xda\x91\x9f\xec\x72\x9c\x9a\xb3\x98\x79\x04\x0e\x73\xba\x41\x5f\x0e\x5b\x77\x3a\x99\xc6\xe9\xae\xf7\x16\xb0\xc1\x29\x73\x78\x8e\x42\xd9\x70\x27\x4d\xef\x6d\xe8\xbb\x7f\x02\xc7\x7a\xc4\x79\x81\x23\x76\x71\xea\x62\xe4\x69\x03\xb0\xf4\xdd\xc1\xb5\xfe\xc0\x41\xd1\x78\xb5\x29\xcf\x32\x9e\x96\x45\xe2\x8c\xb6\xc5\x4f\xa7\x2b\x92\xc3\xc9\x6b\xa0\xfc\xf4\x35\x14\x6d\xd7\x7c\xb2\xe3\xbd\xfd\x45\x9f\x7c\x0b\x4b\x12\x81\xde\x81\x93\xaf\x2c\x28\xa4\x1f\x6a\x57\xf9\x89\x83\xc8\x79\x97\x1c\xce\xa7\xd8\xf8\x14\x4c\xe7\x76\x63\xbe\xa8\x07\xaf\x9c\xbc\x01\x7c\xb2\xcf\xa0\x98\x70\x79\x19\x6d\x63\xf7\xcb\x38\xbe\xed\x93\x03\x18\x5d\x1c\x79\x53\x2d\x7b\xeb\xbe\x75\xb5\x1f\x38\x48\x9d\xb7\xc9\x74\x6e\xe2\x76\x3e\xc5\xc5\x59\x6f\xfa\x2f\xe5\x82\xc3\xd6\x4e\x1f\x06\xaf\x80\xbc\x8f\x9c\x32\x9d\x87\x5f\xfb\x64\x13\x8f\x17\x2d\x94\xb5\x86\xe2\x3f\x04\xae\xd6\x5f\x2f\x85\x12\x8f\xe0\x54\x54\x79\x16\xa7\x5f\x24\x4f\x8e\x67\x18\x82\x01\xdd\x26\xeb\x42\x92\x9a\x10\x9c\xe6\x84\x71\x1f\xc5\x51\x63\xcf\xd3\x76\x90\xf0\x4f\x0a\xa1\x24\xb1\x0c\x7a\xf4\xea\x21\x57\xe8\xc3\x85\xd6\xf0\xa2\xbf\xfc\xfa\xf6\xbb\xed\xfe\xc7\xe4\xe2\xa1\xb5\x74\x7d\x5d\x22\xc0\xc7\xdb\xd7\xf1\xa1\x73\x60\x72\x6d\xeb\xbb\x38\xf7\xbc\x05\x11\xf5\xa7\xce\x75\xcb\x6e\x1c\x76\x5e\xc4\x99\x6f\x3a\xf0\x20\xaf\xb4\x6d\xbb\xae\xeb\xec\x5c\x5b\xeb\x4f\xca\x35\x60\x59\xca\x88\xef\x3a\x53\x81\xcc\xda\x98\x55\x95\x87\xe1\x72\x2f\x49\xd2\x7b\x18\xc6\xf4\xcf\xe3\x7a\xf3\xf3\xb8\x12\x54\x39\x70\x70\x75\xed\x7b\x30\x78\xeb\x46\x7a\x1f\x35\xce\xf9\x49\x80\xa8\xf2\x0e\x1c\xfd\xa1\x02\x28\xe8\x6b\x1d\x3c\x7a\x0a\x6b\xd0\xae\x06\x64\xee\xe2\xc2\xf7\xad\xae\x41\xfe\x0c\x56\x94\xc4\xfd\x65\x3f\xf6\xdb\x70\x95\x8d\x03\xbd\x6d\x1a\x7f\x04\x93\xd7\xd5\xc4\xee\xa3\xd6\x35\xfe\x24\x96\x91\x66\xc0\xc9\x1f\x1a\x40\x1e\x16\x83\x27\xb8\x46\x5d\x2d\xb8\xfa\x38\xf7\xfd\xd7\xee\x0a\x75\xa8\xab\x56\xcb\x9f\x5d\xee\x0c\x2f\x19\x56\x0f\x77\x59\x3f\x6e\x43\x29\xed\x43\x5d\x6a\x72\x09\xea\xbd\x7a\x92\xb3\x19\x33\x51\x76\x35\xaf\xeb\xc3\x89\x82\x02\xa4\x65\x06\xa2\xb9\x71\xda\x02\x9c\xe5\x76\x15\xf5\x76\x17\x41\x34\x3f\xee\x34\x43\xca\xe9\x46\x8f\xda\x54\x44\xf0\xb9\xf6\xd6\x9f\x28\x28\x01\x8f\x33\x46\x7c\x2f\xc4\x49\xdc\x47\xf3\xc0\x78\x5c\xf8\x43\xd0\xaf\xdd\x46\xf8\x9e\x24\xdd\x4e\x05\x8c\x65\x88\x60\x87\xec\xb8\x40\x42\xf0\x50\x18\x77\xc9\x9a\x59\x39\x43\x96\x23\xce\x2a\x34\xf9\xf6\xe6\xc3\xcd\x3e\xec\x68\x63\x6e\xd4\x81\x75\xea\x04\xb0\xaf\x00\x37\x21\x6b\x86\xf8\xb6\x51\x9c\x7b\xd6\xb6\xb2\xc8\x68\x5e\x80\xb2\x93\x2c\x2f\x69\x09\xa0\xcf\x43\x47\x53\x2d\x40\xb1\xee\x74\xd7\xe9\x6e\xd6\xa5\x56\x46\x81\x1a\x58\x2c\x74\xa9\x85\xf0\x12\x58\x5c\x58\x0e\xe5\x7a\x27\x25\x42\x1c\x8a\x04\x94\x9f\xa2\xff\x12\x45\xaf\x6e\x2f\xc5\x44\x0f\x51\xb3\x1f\x9e\x27\x88\x7d\x7a\xaa\x29\x1a\x76\x09\xd7\xe4\xb0\x3e\x6e\x72\x93\x26\x59\xd0\x14\x2d\xce\x35\xdc\x44\xde\x3a\x90\x4a\x27\xed\xb9\xb7\xda\xb1\xa9\xf6\x26\xce\xb1\x2f\xe3\x22\xcf\x66\x1d\x17\x65\x19\x0f\x65\x31\x17\x49\x79\xee\xc3\x93\xa1\x2c\xcf\x44\x99\x73\x2c\x04\x57\x84\x78\x5b\x96\x80\x63\x24\xb9\x10\x98\x17\x85\x6f\xcb\x3c\x2f\x47\x7c\x5a\x39\x45\x42\xbd\x67\xb3\x93\x21\xcf\xe3\x6f\x2f\xf5\xbe\x0f\xd1\xc9\x65\x8a\xb9\x7b\xb1\x85\x59\x75\xd4\x82\x96\xda\xab\xdb\x77\xef\x1f\x4f\x14\x89\x06\x26\x73\x19\x68\x3c\x2a\x40\xe7\x73\x18\xeb\x51\xd4\x8c\x60\xe7\x89\x45\x90\x1b\xde\x03\x88\x46\x90\x17\xde\x0d\x60\x44\xa5\x3f\x96\xc5\x55\x05\x7e\xdb\xbb\xcc\x58\x6d\x74\x6a\x6b\x56\x41\x3c\x53\xce\xe3\x0a\x42\x6d\x9c\x35\x46\xcf\x98\x30\xea\x75\xed\x61\x1d\x6d\x22\x1e\x67\x41\x53\xaf\x7c\x8c\x55\x7f\x43\xdb\xf1\xdd\xfb\xcb\xc1\xe7\x99\x86\xeb\xfb\x20\xa6\x13\x00\x1f\xe2\xba\xb0\x59\x52\x9c\x9b\x2c\x4b\xb2\x73\x9b\xe7\x9b\xdc\x37\xc7\x96\x56\xe6\x8b\x16\x4a\x06\x67\xa7\xd8\x0b\xd0\xe7\xd9\x6c\x41\x97\x60\x39\x3b\x28\x13\x7a\x6e\x96\x67\xb7\x6c\x5d\x54\x59\x08\x58\x28\x8d\x2d\x61\xde\x00\x8c\x90\x12\x4a\x51\x51\x94\x1e\x32\x78\xa2\xf7\x11\x8d\xa2\x28\x8d\xf8\x3d\xda\xd7\x60\x88\xbe\x8b\x7e\x88\xfe\x7f\xd1\xef\x2f\xbd\x05\x5f\x6b\x57\x43\x50\xf2\xfd\x66\xfb\x2c\x68\x97\xbc\x7b\x7f\xf7\x1a\xfc\xfc\xef\x6f\x96\xdf\xff\xb1\x05\x44\x03\xcc\x28\xd2\x85\xef\xbc\x2c\x8e\x47\xdf\xda\xb6\x05\xa8\x2d\x8b\x82\x82\x1a\x50\x03\x18\x24\xeb\xaf\x45\xd1\x36\xbe\x31\x87\x03\xa0\x87\xbc\xb0\x02\x34\x08\xf9\x5a\x28\x44\x61\x6a\x52\xa9\x84\x10\xfe\x00\x4b\x01\x1a\x42\x7c\xf3\xf8\xef\x9c\x73\x7f\x84\xe1\xdc\xb2\x09\x3c\x95\x2f\xfa\xcc\x93\xe8\xfb\xfe\x9f\xd3\x67\x2a\xa0\xb2\xd4\xad\x42\xaa\xa0\xf6\x10\xc6\x62\xe0\x35\xc3\xd8\x79\x5e\x95\x6b\xa7\x29\xd7\x4e\x53\x9d\xc0\x09\x95\xfe\x54\xe6\x41\x82\xa7\xf2\x7c\xdb\x53\x12\x7a\x8d\x09\x9d\x06\xcd\xec\x67\x3b\xcd\x65\xac\x92\xbd\xd9\x16\x21\xff\x03\x45\x7f\xff\xa4\x16\xfb\x65\xc7\x79\x3e\x58\x3f\x3d\x1b\xad\xd7\xfb\x9c\x63\xec\x16\xe8\x49\x79\x6e\xb2\x3c\xc1\x67\x95\x97\x1b\xec\x6b\x33\x68\x4e\xdd\xd9\x54\x52\xd3\x93\xf3\x0d\x18\xca\xd2\x93\x38\xca\xb3\xd9\x81\x11\xa2\x44\xa0\xe2\x7c\x4a\xd4\xd9\x2c\xcf\xa6\x83\x30\xa3\x06\x42\x85\x4a\x23\xb9\x43\x78\xee\x28\x8d\x09\x41\x52\x69\x53\x22\x05\xa1\xc7\x08\x42\xb4\x9c\x1b\xad\x5a\xf7\x07\x30\xe4\x76\xca\x47\x3b\x9e\x47\xe9\xbf\x6d\xc7\xdd\x13\x3b\x9e\xb5\x41\xec\xc0\x31\xc8\xcb\xc4\xf9\x7c\x2c\xe3\x62\xae\xb3\x32\x29\xfc\xc9\xb6\x94\xb3\x6a\xee\x2a\x4c\x99\x93\x23\x60\x28\x7b\x90\x32\x8d\x62\x8d\xa0\xa7\x30\xbf\x1e\xef\x96\xa6\xc8\x31\xb6\xc6\x60\x6a\x6b\x52\x41\x3a\x63\xce\xe3\x16\x23\xad\xad\x15\xa5\xc1\x64\xc6\x98\x52\x6f\xd7\x31\xfc\xc0\x3d\xf3\xef\x1f\x98\x1c\x6e\x9f\xa6\x9b\xfc\x9c\x09\xeb\x58\x7e\xd1\x89\x20\xa8\x73\x97\x66\x60\x9c\xa7\x2c\x07\xe3\x3c\xc0\xb8\xb9\x8f\x64\xcb\x08\xae\x7c\x5e\x61\xcc\x17\xfc\x04\xfb\x11\xe0\xc2\xab\x31\x2e\x11\xf4\x35\xcc\x42\x81\xfa\xe0\xf3\x65\xf2\x21\xd8\x62\xfc\xac\x23\x2d\xd8\xbf\xd5\x91\xe2\x48\xdc\xbb\xb0\x3e\xdd\x44\xaf\x03\xcf\x5e\x08\xb1\x05\x4d\xa9\x10\x64\x7b\x75\x7b\x73\x2b\x00\xaf\x00\xf3\x35\xc8\xe6\x43\x05\x4a\x5f\xf5\xc0\x79\xb1\xcd\x80\xf0\xce\x79\x37\xf3\x3e\x51\x40\x9c\x1d\x90\x11\x48\xf0\xe5\xde\xee\x76\x3d\xed\xde\x5c\x04\x4c\xe3\xfd\x8f\x6f\xdf\xbd\xff\xfc\xdd\xab\x35\x02\xf9\x69\x3d\x35\x26\x15\xd0\xd5\x4a\xbf\x38\x77\xae\x02\x39\x80\x98\xd8\x4a\x54\x79\xe1\xb5\x67\xf0\xe8\xbc\x05\x27\xaf\xb7\xc5\xf2\xfd\xce\xd7\x95\xa7\x6d\xc1\xad\x21\xbe\xf7\x0d\x11\x5c\x94\xae\x07\x55\x05\x58\xe0\x2e\xce\x2f\x35\xea\x5f\x7d\x77\xb8\x82\x7d\xf1\xdd\x1b\x0a\xca\x35\x74\xa9\x3d\xd6\xfa\x78\x82\xd8\x68\xe6\xf2\xdc\x9f\x7c\x07\x2b\xe5\x27\x40\x7d\xbf\xcd\x97\xa5\xd6\x2e\xff\xd1\x36\xa7\x4e\x63\x3f\xf8\x96\x48\x26\xca\xaa\x07\x95\x05\x3c\x4a\x93\xfe\x1e\xee\x9b\x78\xba\xcc\x87\xeb\x5d\xea\xdf\x45\xff\x7d\xe5\xa7\xfc\x10\x94\x5b\x3f\x7d\xbc\x24\xc3\xef\x57\xc9\xcb\xbf\x04\x4f\x24\x27\xf7\x1f\x56\x51\x86\xd7\xdf\x5f\x52\xd1\xee\xfe\xf0\xee\xe3\xfb\xd7\xd7\xa3\xea\x87\xd7\x7b\xed\xa7\x61\x26\x19\x95\x0c\xf0\x2c\x37\x79\x96\x4b\x25\xa5\x1c\xa4\x92\x07\xc9\x29\x96\x9a\x90\x22\xe3\x39\x51\x92\xf4\x06\x72\x45\x44\x1d\x3b\x4e\xfd\x70\x6a\xf0\x61\x04\xbc\xc8\x4b\x08\x1b\x4a\x03\x73\x2f\xa5\xb4\xa7\x45\xc1\x60\x81\x8a\x82\x94\x1c\x41\x24\x25\xa6\x08\x11\x80\xca\x95\x47\x34\x62\xf7\x70\x13\xc5\xd3\x93\xac\xfe\xb7\xd1\x1f\xd7\xbc\x94\x17\x36\x7d\xd3\xa4\xe4\xf5\xa7\x47\xf8\xb7\x4f\xff\xb2\x89\xfc\x38\xcc\x24\x65\x82\x01\x96\x65\x1a\xe6\x4a\x2a\xa5\x06\x25\x25\x67\xa4\x14\x1a\xf3\xc0\x64\x54\x3e\x31\x62\xa8\x71\x37\x05\x23\xf8\x13\x1b\xbc\x13\x45\x49\xf1\x82\x1a\x0a\x59\x14\x4f\x0c\x48\x23\x11\x1f\xf7\x74\x57\x3d\x6b\x93\xbf\x0f\x79\xe3\x57\xc2\xf5\x87\x36\xf9\x3d\x58\x53\x32\xfe\x12\x3c\xa1\x54\xd9\x7e\x78\xfd\xe3\xe7\x37\xbb\xed\xeb\x87\xfc\xc0\xa5\x51\xde\xae\xff\xf8\x3e\x5c\xe3\xec\xe9\xdc\x81\xfe\x27\x9d\x29\xa5\xe3\x3a\xcb\x5d\x99\x53\xdf\xe8\x90\xc5\x5c\x83\x1e\x50\x0d\x98\x2f\x35\x88\x7a\x32\xf9\x1e\x99\x9a\x64\xba\x90\xe3\x51\xce\x27\x90\x1e\xb3\xd1\x77\xd8\x80\x61\x87\x05\xf1\xc3\xd4\xd0\x6e\x02\x62\x6d\x26\x42\x08\x09\x1f\xe4\x48\x8a\x92\x97\x45\x9a\x67\x79\x09\x29\xc4\x18\xf3\x3c\xe7\x45\x01\x41\x59\xf2\x70\x6e\x18\x03\x57\x8f\x89\x7e\x17\xfd\x45\xf4\xbf\x3e\x55\x9a\xdc\xbe\xd0\x2e\xff\xfc\xe6\xd3\xf6\xc3\x4d\x18\x16\xbb\x17\x74\x1d\xbb\xfd\x9a\xf6\x7a\xc9\x10\xbc\x5b\xe9\x3b\x36\x11\x10\x59\x51\x95\x39\x10\x67\x1d\x43\x09\x09\x46\x0c\x63\x41\x28\xa1\x98\x50\x87\x7d\x61\xe3\xd4\xf9\x26\xcb\x41\xcd\x28\xc4\x4b\x87\xf2\x07\x88\x18\x2f\x34\x2e\x4c\xee\x2a\x08\x4b\x67\x01\x29\xfc\x61\x3b\x20\xb4\x1c\xcd\x4a\x4c\xe8\xf2\xff\x81\x59\x29\x21\x46\x90\x4b\x9c\x7a\x05\xcc\x3c\x12\x3c\xb7\x9c\x67\x36\xa5\xc0\x59\x91\x41\x51\x56\x2d\x94\x28\x37\xa2\x9a\x55\x92\x99\x68\x9b\xb8\x7b\x19\xe6\x96\xff\x39\xfa\xef\xd1\xff\x88\xfe\x8f\xe8\xff\x0d\xf1\x80\x0f\xd7\xec\xfe\xf0\x5c\x6e\xae\xae\xcf\xcd\x2f\xff\xfe\x19\xc7\xf8\xab\x27\x55\x05\x81\x08\xa2\x97\x1c\x87\x3f\xd7\x1f\xfc\xc5\xdf\xe5\x59\xe7\x49\xf3\x54\xa8\x13\xe2\xb2\x43\x99\xc9\x0a\x90\x9e\xa3\x31\x2f\x76\x68\x56\x82\x0b\x26\x99\x08\x1f\x5c\xc4\x87\x19\x09\xbe\xfc\x9b\x10\x2c\xbc\xc4\xf6\x3c\x31\xcd\xbc\x55\xda\x8f\x84\x88\xb2\x84\x48\x6b\xb8\x72\xa4\xf3\x7b\x92\x1c\x02\xe7\xe7\x5d\x04\x23\x12\xfd\xef\x8f\x2c\x21\x37\xcf\x68\x3d\x6f\x6e\xb7\x8f\x27\xa0\x4f\x6f\x9f\xf6\x80\xa0\xdd\xf3\xfd\xcf\x10\x85\xde\x5a\xc0\x0c\xc0\xbe\x6b\x1c\x97\xca\xd8\x8a\xf4\x95\xaf\x63\xaa\x0a\x8a\x09\xc4\x59\xc1\xb0\xa7\x2a\x2b\x10\x24\x05\x84\x84\xe9\x56\x67\x40\x48\x4c\x89\xc4\xb4\x19\xf1\xe0\x28\xc5\x8c\x1f\x14\x67\x14\xfa\x69\x3b\x38\xa7\xbc\x95\x56\x68\x56\xdb\x23\x53\x2a\xcc\x40\x86\x30\xc1\x30\x2a\xa9\xac\x73\xc6\x4a\x24\x10\x94\x84\x39\x2f\x4a\xa8\xb3\x89\x52\x26\x39\x75\xc4\x21\x4d\x09\x23\xbc\xcb\x29\x15\x26\xac\x51\x3c\xd4\x34\xeb\xf5\xf4\xf4\xea\x29\xa9\xe9\x45\xff\x32\x64\xfe\x6e\x9f\xe9\xa0\x3c\x5c\xa1\x7e\xfa\x7c\xdb\x01\xb6\x6a\xf4\x43\x7f\x04\xcc\xc3\xac\x00\x7d\xd1\x5a\x65\x1b\x3f\xd2\x69\xd9\x31\x62\x71\x94\x7e\x04\x26\x70\x8e\xd4\x27\xad\x44\xe1\xab\x6d\x5f\xd7\xb6\x36\xb5\x45\xd8\x8f\x9d\xd4\xda\x32\x4b\x24\x63\x18\xa9\x66\x5a\x7e\x71\x16\x8c\x0b\xbd\x9e\x47\xc5\x3d\xdd\x64\xbb\xf2\x99\x36\x76\xf4\x6a\xad\x7c\xba\x64\xd0\x7f\xbe\x7d\xb5\xaa\x04\xdc\xed\x9f\xc4\xf8\x45\x52\x7b\x89\x41\xed\xe6\xa3\x03\x05\xf2\xa6\xe5\x1c\x1c\x39\x1f\x65\xf8\xb3\x2b\xed\xf4\x53\x23\xc4\x96\x4e\x3f\x35\xc9\xe1\x8c\x92\xc3\x30\xcc\xf5\xf2\xdf\xca\xdd\x1b\xb3\x90\x5f\xf7\x67\x4f\xbe\xf9\xfa\xbd\xa1\x4f\x83\xdb\x9b\x75\x52\xbb\xb9\xbd\xd9\x5e\x7c\x26\xf7\xe5\xb9\xa1\x49\xf1\x4f\x7d\xcc\xe9\xf9\x08\x02\x73\x11\x68\x41\x6b\x41\xe1\xe9\x7a\x8a\x01\xed\x0e\x19\x36\x47\x49\xc4\x66\x08\x46\x4a\x7d\x06\xc6\x23\xd5\x6b\x5e\x5f\x58\xe7\xed\x4b\x7b\xc1\xcf\xd8\xbb\x7d\x62\x6f\x82\x37\xd4\x17\x08\x4c\x6e\x2e\x1d\x90\xc8\xc3\xce\xda\x18\x3b\xe7\x4f\x81\xcc\xdf\xee\x4a\x3b\xfe\x54\x29\xb5\xe5\xe3\x4f\x5d\xd2\x9d\x71\xd2\x9d\x4e\x73\x13\x2c\xde\x05\x8e\x82\xdf\xf4\xbd\x31\xda\xb2\xd9\xa1\x58\x54\x67\x5e\x81\x1e\xcd\xcd\xa9\xef\xe3\x43\xdf\xfb\x2a\x70\x72\x1d\x77\xa5\x1d\x7e\x72\x4a\x6d\xc5\x70\xfd\xde\x61\x98\x9b\xd3\xdc\x9c\x1e\xee\xc8\x75\xf4\xaf\xa2\xdb\x90\xc1\xf8\xac\xc2\x31\x79\xb3\xbf\x8d\xc1\xfb\xe8\xd5\x95\x89\x77\xff\xfe\xbb\xb7\x77\x37\xcf\x96\x8e\x9b\xdb\x47\xb2\xb4\xad\xc4\x05\x68\xec\x5c\x38\xd0\x14\x70\x30\x19\xc8\x91\xc7\x0c\x48\x64\x8a\x12\x43\x56\x96\x50\x56\x49\x5a\xe5\x58\xe6\xa9\xcd\xc8\xa1\xc6\xa0\xa5\x34\x2f\x0b\x8c\x76\x5a\x48\x7f\x72\x15\x28\x39\xf1\x59\xc9\xce\xb5\xef\x34\x48\x63\x63\x78\x09\x15\x2c\x99\x00\x29\x3e\xf7\x65\x06\x05\xaa\x08\x92\xc9\x71\xee\x19\x4f\x35\x7b\xbc\xcf\x69\x42\xcc\xf2\x0f\x21\x7b\xec\x79\xbd\xeb\x6a\xc7\x8f\xaf\x9e\x30\x0a\xff\x49\x43\xf6\xca\x9d\x87\x50\x46\x68\x61\x39\x4f\x26\x5d\x7a\x70\xc1\x80\x21\x55\x8e\x08\x62\x10\xe5\x85\xec\x12\xd4\xe5\x54\x17\x8b\x25\xa7\x86\x80\x9e\xd2\x02\xe6\x14\x6e\xeb\xd5\x8e\x95\xd1\xab\x2d\xd9\xb9\xf1\xad\x9e\x62\xc7\x4d\xb9\x9c\x21\x20\x14\x20\x43\x17\x53\x2c\x7b\x6a\xca\x2e\x68\x78\xa9\xdf\xd4\x0f\xea\xcd\x71\x1e\x48\x0c\xdd\xf9\xe8\x80\x25\xf3\xd0\x37\x4d\x6c\xea\xda\xb7\xeb\x9f\x6f\xf4\xbf\x87\x7e\xb0\x0b\x1c\x5d\xbf\xad\xdf\xf3\x0d\xf4\x10\x81\xc1\xcd\xc4\x01\x8e\x3c\xee\x8c\x89\xa1\x31\x7e\x30\xe1\xcf\xd3\xef\x6d\x5f\x8c\xf4\x4d\x5c\x85\xdc\x6b\x7c\xa9\x25\xfc\xdb\x35\x9e\xf5\x2c\xcf\xff\xd3\xcd\xf3\x54\xae\x87\xa4\xf1\x8b\x40\xfc\x32\xf0\x13\x91\x54\xb3\x2d\x8b\x04\x41\xe8\xa8\x2a\x6a\x0c\x91\xaf\xb3\xdc\x58\x6c\x2c\x62\xb2\x82\xfe\xc8\xa4\xec\x95\x71\x57\xd5\x08\xe3\x62\x32\x17\x3b\x3c\x53\x84\x67\x5e\x9b\xc2\x16\x1d\x18\x31\x42\x5c\x0b\x2c\xa8\xb0\x35\xa7\xd2\x35\xa0\xd2\x5e\xe9\xf3\x34\x98\x95\x2f\x6a\xd5\xb1\xc7\xd1\x1f\x02\x77\xe0\x3a\x4f\x3f\xdd\x74\x3c\x25\x85\xbb\x0d\x19\xe3\x9f\x3e\xae\x77\x4d\xdf\x5d\xe9\x5e\x5e\xdd\xc6\xdd\xe6\x30\x4f\x79\x11\x67\x94\x16\xb8\xc0\x79\x59\xd9\xda\xd6\x0e\xb8\x22\x9f\x4f\x18\xb4\x99\x4b\x63\xec\xf3\x1a\x70\xec\x65\x6b\x3c\xe2\xa0\x92\x5e\xee\xb0\x65\xcc\x47\x94\xa5\x36\x85\x80\xad\x34\xfc\xa0\x9b\xc7\xb8\x62\xec\x8c\x09\xcb\x28\xb6\x7e\x14\x95\x02\xd2\x2b\x61\x38\x40\x41\x5f\x2f\x9c\x5d\x70\xf4\x57\xab\x7f\x2f\xb4\x66\xff\x1e\xbc\xff\xe3\x0b\x16\xbb\xdb\xcf\xb7\xc9\x03\xd1\x4e\xc0\xbb\xdb\xec\x03\x60\xbb\x74\x2e\x18\xe7\x94\xc8\x82\xc3\xc6\x36\xb6\x71\xa0\x82\xf3\x98\x82\x69\x39\x61\xc7\x64\x9e\x6a\x60\xa9\xe7\x1d\xf2\xc7\x9e\x03\xab\x3c\xda\x61\x57\xf9\x8c\x32\x9b\x15\x80\x5c\x67\xdf\x79\x8a\x5d\x75\x46\x94\x67\x8c\xb8\xfb\x88\x57\x0a\x60\x33\x41\xcb\x40\xb6\x60\xed\x43\x0e\x11\x8e\x8a\x35\x62\x77\xf5\xef\xb7\xc0\x06\x29\xa1\x6f\x78\x37\x29\x37\xc2\xe7\x59\x0e\x4e\x94\xb0\x82\xe7\x61\xf6\x75\x40\xe5\x99\x2f\x41\xb7\xb8\x36\xf5\xd0\x02\x46\xbd\xab\x2b\x6f\x39\x10\x6a\x71\xad\x5b\x96\x82\x6f\x80\xa5\xf4\x8a\xd6\x4f\xbc\xd2\x00\xfa\x96\xad\x68\xa3\xc0\x6d\x87\xf7\x76\x87\xa2\x22\xb0\x04\x3c\xc5\xfb\xad\xde\x90\x3c\xc7\xfb\xfa\x02\x58\x6f\x22\x4f\xb2\x1c\xb4\x94\x90\x1c\x17\x81\xfc\xdb\x02\x96\x67\x9e\x65\xc0\x65\x36\x05\x27\x4f\x15\x20\xd4\x1f\x2a\xe3\x7b\x06\x4a\xee\xcd\x0e\x59\x4a\x7d\x4a\xa9\x79\xde\x15\x16\xc0\x90\xf1\x8c\x51\xeb\x27\xe1\x14\x80\xa9\xef\xa8\xa1\xa0\x58\xeb\x77\x69\x72\x78\xc2\x89\xff\xd7\x2b\x0b\xfd\xb3\x3c\x8e\xf8\x72\x98\x5c\x09\x1d\x02\xa9\xca\x7a\xd2\x6f\x97\x0d\x9e\x7b\xa8\x19\x76\x5e\xb4\xdc\x0f\x78\x0a\x04\xcd\x41\x87\xdb\x62\x89\x20\xf7\xb6\xaa\x68\xb5\x43\x67\x1e\x5b\xeb\x85\xf3\xdc\xcd\xb9\x1f\xb8\x61\x20\x32\x8c\x67\x9c\x08\x42\xb9\x11\xad\x39\x44\xd1\x26\x4e\xef\xab\x5d\xba\x99\x1e\x6a\x9d\x2f\x73\xc0\xd3\x6f\x7e\x7f\x25\x01\xbe\x14\x61\x5c\xb1\xc6\x2a\xc9\x7c\x97\x66\x4d\x29\x50\x69\x3c\x3d\x5a\x56\x0d\xea\x3e\x62\x23\xf3\x2d\x30\x79\xea\x0f\xe6\x41\x0c\x26\xf2\xd1\x66\x9a\x33\x82\x4a\x0c\x91\x12\x46\xd7\xba\xe5\x92\x5b\x85\x71\x9c\x09\x7f\xe4\xfe\xc8\xa3\x68\x0b\x0e\xf7\x74\x57\x26\xee\x61\x1e\x5c\x11\xdd\x7d\x0d\x66\xc5\xf2\xfa\xf2\x80\x90\x79\x1a\xa3\x44\x92\x22\xb7\x3e\xeb\x8f\x74\x98\xb4\x1f\xc8\x24\xbc\x03\x6d\xe1\x9d\xb9\x4a\x88\x84\x07\x17\x85\x4d\xb3\xc4\xcd\x55\x09\x25\x12\xda\x10\x8b\x35\x94\x92\x81\x9a\x8e\x64\xc0\xf7\x11\x2c\x61\x19\x38\x35\xe9\x46\x5e\xe2\xfe\x4b\x9b\xfd\xbb\x6f\xb7\xd9\x85\x24\x65\x69\xb3\x77\x4f\x5c\xd7\x27\xe4\xdc\x06\xc5\xf8\xeb\x33\x4a\xdf\x11\x50\x30\x5f\x01\x13\x84\xaa\x9b\xa2\xd4\x08\x49\xcf\xfb\x23\x3b\xed\xf0\x99\xc6\xce\x78\x65\xbc\xb4\x73\xe6\x47\x6e\xd9\x68\x19\xcf\x29\x85\x90\x51\x61\xe5\xc1\x0d\x41\x3b\xb9\x08\x39\x64\x8f\xb8\x2e\x4a\x0f\xcf\x73\x82\x1e\x9b\xf1\x91\xee\xea\xe3\x6d\x62\x13\x7d\xd6\xd5\xf5\x6a\x6a\x79\x8e\x36\x1b\xa8\x22\x48\x79\xa2\x97\xc1\x69\x9c\xf0\x86\x00\x28\xbc\x04\xed\x0e\x9f\xd9\xd2\x97\xa4\x59\xfe\x3b\xe4\x95\xa4\x54\xda\x81\x85\xf1\xd8\x49\xcb\xa6\x4b\xac\x12\xbf\xc0\xf4\xd7\x5f\x63\x5a\x76\x03\xef\xbe\x05\xea\x53\x12\x25\xe3\x39\xab\xe2\x66\xa6\xd7\x07\xa4\xae\x00\x79\x89\x34\x23\x66\x9e\x1c\x70\xd4\x93\xd6\xf8\x92\x00\xab\x3d\x8c\xa3\xfc\x2b\x64\x08\xb2\x2b\x34\xe2\xeb\x00\x6d\xdd\xa3\x44\x66\xa3\xf7\x7c\x57\x85\xbc\xaa\x7f\xb3\x9c\xd8\x9f\xee\x51\xb6\x21\x23\xe9\x6d\x48\x20\xdc\x53\xf7\x93\x71\x49\x1a\x8e\xa9\xfe\xc0\xfc\xe0\x05\x01\x5d\x4c\x81\x58\x56\x04\xe7\xed\xae\x1c\xa5\x06\x51\x59\x40\x84\x9d\x90\x48\x62\x06\xb9\xe4\x28\x8a\xa2\xdf\x81\xe8\x1e\xed\xdb\x84\x3e\xd1\xb6\x5b\xeb\x3a\xfe\x31\xba\x90\x6b\xdf\xdc\x7e\xff\xc3\xdf\x81\x8b\xe8\xd4\xee\xb6\x78\xf7\x0f\xe0\x52\xd7\x7c\x4d\x9f\xdf\xbe\xd0\xba\x7b\xf8\x3b\xda\x9a\xd9\x2c\x8e\xa1\xc3\xb1\xc9\xb2\xcc\xe4\xa8\xf4\xd8\x57\x6a\x1e\x6c\x5c\xcf\xd6\x81\xde\x97\xb1\x02\xa7\x2f\xf5\xc3\x9b\x08\x1d\xaf\x8d\xb3\x2f\xe8\xfa\x96\x50\x2f\x89\x97\x65\x96\xe6\xa5\xa5\x35\x2a\x10\x2d\x21\xe8\xc8\x88\x31\x3e\x62\x8c\xbd\xba\xbc\x44\xd1\xef\x12\x79\xcf\x42\x0e\xce\x5f\x3c\x51\xc1\x7b\xb8\x55\xbd\xdc\x86\x7d\xff\x58\xed\xf8\x60\xcc\x4b\x1d\x3c\xf0\xc2\xa8\xa4\x4a\x84\xb7\xa0\xf6\x0c\x4f\x24\x33\xb9\xf6\x9d\x21\x7e\xb2\xc0\x79\xa7\x87\x01\xa8\x61\xae\xd6\x1f\x7a\x25\x6b\x00\xf9\xd2\x21\xd6\xb7\x1d\x9a\xb5\x9a\x65\x85\xb0\x2a\x5b\x86\xe8\x51\xc4\x93\x02\x5a\x29\xe5\x8d\xd6\x7a\xd6\xc6\x2c\x03\x68\xd5\x27\xfe\x5d\x22\x82\x0d\xf0\x09\x9f\xc3\x7f\x7e\xac\x1a\xba\xda\xf0\x64\x3b\xfa\x68\x44\x00\x7b\x05\xff\x0d\x23\x4c\x62\xbd\x59\x96\xab\x52\x59\x92\xeb\x42\x9e\x0e\xc2\x0f\x8b\x59\xca\x84\xca\x13\x3b\xce\xfa\xfa\x22\x2e\x54\xb9\xe5\x0c\xaf\x6f\x3b\x38\x1b\x35\xab\xa6\xc8\x90\x42\x8e\x63\x7a\x54\x49\xa4\x80\x5a\xf0\x2f\x1f\xb3\x72\xce\x79\x11\x2c\x49\x13\x16\xf4\xe1\x9e\xea\xbb\x5c\x33\x18\xd7\x51\xf6\x0c\xdb\xab\x9f\xab\x94\x4b\xd8\x26\xfb\x32\xba\xcb\xf1\xac\x9c\x8b\xeb\x9b\x14\x82\xf0\x42\x63\x34\x9b\xaa\x8a\xd5\x6c\x96\x67\x47\x66\x0e\x82\xec\xde\x82\xc2\xab\xf3\x81\xb3\xcc\x66\x44\xf8\x36\x99\xfc\x60\x3d\x37\x41\x4f\xc7\xdc\xe3\x3d\xfe\x17\x63\x8b\xcd\xa6\xfd\x42\x82\xc8\x4a\x9c\x02\x7d\x56\xd7\x37\xa1\x14\x95\xe5\xb2\xbc\x8e\x55\x95\x64\xe7\x71\x79\x7e\x1d\x36\x90\xa4\xf7\x6c\x8b\x76\x22\x68\x84\xfc\x49\x95\x8e\xcd\x80\x19\x33\x26\x48\x71\x18\x44\x44\x45\xea\x9a\x30\x04\xa2\x9d\x58\x45\x36\x1a\x25\x0d\x7f\x10\xd9\x08\xba\x0e\x41\x64\x23\xf4\xb3\x0d\x89\x5c\xe8\x67\x8f\x3e\xf8\x37\x81\x2f\xe0\xb2\xb3\x7e\x39\x24\x2e\x24\x6f\x1f\x6e\x9e\x5e\xd1\x3e\xcb\x39\xac\x97\xc1\xae\x9d\x03\x99\xf3\x2c\xfc\xd0\xa8\x94\x25\xaa\x0d\x25\x45\xaa\x33\xe2\x2c\x01\x13\x85\x02\xd2\xf9\xa8\x32\xac\xf0\x0e\xce\x39\x68\xba\xae\xf3\xe9\xf2\x51\x09\x8d\x8c\x48\x3d\x87\xa5\x2d\x0e\x14\x31\x50\x57\x2d\x6e\x2a\x58\xb4\x15\xae\xa2\xe8\x77\x11\xb9\xe7\x1b\xb9\x2b\x9e\x61\xfe\xeb\xe8\x6f\xd6\xa8\xe1\x9f\xc2\xfc\xc3\x37\x40\xc7\xfb\xf7\x9f\x9a\x40\x79\xd3\xb6\x00\x77\x3e\x0a\x3f\x5a\x8a\x0c\x22\xb5\x2d\x08\x2d\x53\x9b\xd1\xa6\xa6\x31\x95\xc4\x22\x39\x4b\x9d\x11\x43\x76\xc5\x59\xc7\xe9\x30\x0c\x73\x35\x8e\xa3\x27\xb6\xc6\x8d\x2d\x7d\x59\xe6\xd0\xc2\x03\xc3\x1c\x1c\xeb\x03\xed\x1a\x54\xf8\x69\x20\x61\xfd\x03\x0c\xa8\x9d\xd9\x64\x4f\x70\x7f\xb3\xa7\x01\xb6\x85\x3f\x1d\x0d\x38\x78\x14\x33\x70\xf8\x72\xba\xbe\x6d\xb2\x59\x00\x73\x1d\x67\xeb\x3c\x61\xee\xf9\xde\x7e\xdb\x17\xbf\xa2\xfd\x76\x2b\xa1\xc2\x53\x5f\x24\x63\xb8\xc0\x6b\x5b\x40\xda\xe0\x0c\xd2\x76\x14\xd9\x92\xd4\x56\xd0\x22\x75\x59\x59\x2e\xce\xc0\x02\x6b\x2c\x66\x63\x72\x62\xe9\x37\x9c\xd1\x9a\xd2\x43\x02\x2d\xec\x50\x49\x38\x38\x1c\x47\x3a\xf4\xa8\xf0\xe3\x69\x71\xc6\xef\x92\xe9\x9e\xee\xeb\x5d\xf9\x0c\xf7\xef\x9f\xf6\xbb\x9b\xbb\xdb\xb5\xd4\x29\xfc\x4c\x9e\x16\x67\x3f\xef\x7d\x49\x80\xbd\xa1\x49\x7a\x9e\x4c\xd3\x00\x5c\xfb\x3c\xfc\x68\x28\xd2\x90\x00\xc1\xb1\x46\xdc\x73\x8b\x1c\x4c\x75\xc6\x4f\x06\xb7\x3a\x43\x0a\xee\xca\xb3\x8c\xd3\x30\xd3\x45\x97\x19\x2f\xf2\xa8\x3a\xa0\x63\x95\xb5\x3d\xed\x3b\xe8\x4b\x82\x68\x59\x51\xcc\xc1\x58\xf8\x61\xc0\xe3\xe2\xf3\xd8\x05\xce\x92\x9f\xf7\xf9\xcb\xf6\xfc\xc5\xfe\x97\xa0\xe4\x74\x2e\x5c\x58\x2a\x2a\x90\x5d\x16\x8d\x0a\x64\xbe\x97\xd8\x21\x7e\xb4\x90\x6b\x9c\xd9\x4c\x0c\x1d\x8f\x0f\x41\xc5\xfc\x7c\xb4\x39\x77\xe2\xa5\xeb\x4d\x4d\x96\x7e\x08\xcb\x62\xf1\x3d\x0f\xae\x1f\xd8\xd0\xa3\xd2\x4f\x27\x7a\x0a\xfd\x90\x82\x66\xd7\x6e\xe4\x2f\xf6\x43\xba\x15\x3f\x39\x07\x8e\x1e\xc6\x02\x1c\xbf\x1c\xae\x6f\x1b\x39\x63\x50\x2d\xb3\x3c\x75\xce\xad\x7a\x6b\xfa\x9e\xec\xd9\x8e\xfe\x4b\xe7\x79\x9d\xf4\xe7\xd2\x05\xfd\xc2\x0a\xa4\x33\xbb\xbe\x29\x29\x03\x9b\x3b\x9b\xeb\xaa\xba\xee\x88\x77\x74\x66\x97\xb9\x74\x19\x14\xfa\x71\x2e\xed\x92\xd1\x9f\xac\xe7\xab\xce\xf9\x18\xa1\x2d\xba\xc6\xf6\x40\xb8\x0b\x7f\x7d\x17\xe2\x62\xcb\xe7\xdd\xd2\xd7\xe2\xb1\x77\x7d\x5f\xf9\xda\xb5\x7d\x7b\x38\x6c\x4b\x40\x7d\x63\x7d\x33\x0b\x95\x64\x80\x9e\x6b\x10\xe2\xb4\xbf\x8b\xf1\x3d\xdf\xbb\x17\x6d\xff\xef\x22\xb8\x9e\xe6\x7e\xb9\xed\xbf\x31\xe0\xe2\x71\x93\x7e\x99\x82\x28\x11\x68\x41\x3e\xc3\xeb\x9b\xef\x05\x71\x88\x8f\x0e\xf1\x0a\x65\xae\x40\x70\x3a\xf2\x78\xb4\xcc\x32\x73\xae\x6d\x21\xad\x7c\xd2\xfa\xc3\x30\x78\xfa\xd8\xfa\xd8\xc2\x1e\x96\x0f\xcd\x4f\x4b\x3f\x4c\x74\x5a\x73\xe1\xe5\x3d\xde\x9b\x44\x3c\x9c\x56\x96\x9e\xfb\x77\x0f\xcc\xc2\xeb\xd5\xe8\xbf\x06\x4f\x94\xfe\x6e\x3f\xed\x97\x3d\xdd\x62\xcf\x57\xcc\xa7\x6b\xfe\x7e\xdc\xd8\xbc\x48\xf4\x17\xb5\x35\x3f\xa9\x2d\xca\x98\x2a\x48\x4e\xcb\x22\xcf\x7e\x3a\x82\xac\x70\x2b\xeb\xc9\x97\x4c\x41\xae\x65\x42\x71\x69\x0a\x34\xe1\xdc\xe6\x28\x89\x30\xe6\x88\x24\xa2\x84\xa5\x57\x90\xc1\x51\x66\x2a\x2b\x78\x5c\xe3\x0a\x21\x8b\x90\xa7\x58\x51\xca\x30\x61\x98\x13\xc8\x58\x29\x68\x01\x09\xa7\x24\x8a\xa2\xcd\x26\x0f\xf3\xc8\x75\xff\xfe\x37\xcf\x77\xef\xe0\x85\x66\xdc\xcd\x5d\x38\x40\xdf\xc5\xe1\x4a\x68\xbd\x18\xda\x34\xb1\x9d\xe5\x45\xe4\xce\x5b\x3f\x25\x72\x9e\x70\x5c\x72\x8d\x68\x21\x51\x51\x16\xd6\x37\x02\x40\x85\xe4\x44\x0f\x8c\x62\xc6\x2d\x3b\xec\xf0\x6c\x80\xd2\xde\x68\x6f\x8d\x9a\x0f\xc7\xdc\xe5\x16\x08\x4f\x4f\xf2\x08\xa8\x1f\x9d\x54\x1d\xc3\x4a\x56\x51\x04\xe2\xe9\x1e\x6f\x9a\x1d\x8e\xbe\x5f\xf6\xf0\xc9\x0f\xaf\x2f\xc7\xfd\x4f\x1f\xff\xf6\xfd\xab\xe5\xa4\xbf\x69\x94\x64\x94\x16\x3c\xcf\x95\xaa\xcc\x0e\x2b\x9f\x8e\x7d\x5d\x19\xa2\x4e\xa7\x38\xfa\x27\xb5\x0f\x39\x02\x1b\xfb\xec\xac\xf2\x9f\x9e\xdb\x9a\xbc\xb0\xf5\xd5\x6a\xea\xee\x89\xa9\xdb\x10\xda\xb7\xa1\x7f\x15\xfe\x34\xc5\x93\xa7\x10\x34\xa2\x2e\x60\x41\x0b\x02\xd3\xca\x1f\x19\x20\x8e\xc9\x89\x1e\x39\x45\x98\x1b\xd2\xbe\xb4\xb4\xcf\x6c\x2a\x41\xe6\xbb\x46\xb4\x80\x4c\x46\x8a\x9a\x20\x29\xaa\x68\x13\xcb\x48\x3c\xd9\xeb\xc1\xaf\xdb\x62\xf7\xad\xc6\x08\xa9\xa0\x2b\xc2\xdb\xa4\x48\xea\x33\x73\xd7\x8d\x9c\x6f\x37\xd3\x1c\xe5\x30\x49\x55\x47\x78\x69\x31\xc7\xec\xe0\x0b\x06\xaa\xae\x75\xbe\x61\x20\x33\x35\xe3\xbc\x97\xbe\xd9\x91\x79\x00\x84\xf9\x13\xf3\x47\x0d\x4b\x5f\x76\x79\x95\x2b\x10\xf9\xaa\x55\x16\x64\xbd\x52\x4c\xe3\x52\x72\x19\xf8\xac\xcb\x50\xc3\xfe\xab\xfa\xcc\xc7\xaf\x61\xde\x25\x4d\x22\xce\xce\xc6\x64\x6e\x97\xc7\x0f\x1b\x35\xe7\x38\x3e\xf1\x8a\xc8\xc2\x61\x5c\x1a\xe7\x2d\x03\xd8\x56\xc6\x1f\x18\x48\xb5\xe3\x84\x55\x76\xd8\xf4\xf3\x04\x10\xf3\x03\xf3\x27\x45\x3d\x6e\x32\x93\xc9\xc9\x37\x9d\x72\x20\x5a\x5d\x59\x48\xa2\x57\xcd\x18\x1e\xf3\x6d\x76\xe1\x41\xbd\xb0\x37\x25\x57\x3d\xcf\xe4\xfd\x77\x80\x3a\xc5\x8d\xcd\x8d\x14\xca\x00\xac\x45\x67\xbb\x6d\xc6\x94\x36\xdc\x8f\x54\x1a\xbd\xfa\xc2\x9f\x04\xc8\xa3\x4d\x4c\xef\xd1\x5e\x6f\xcc\xd7\x6d\xf3\xfa\x5b\x6d\xb3\x1a\xfd\xf9\x79\xdb\x64\x0f\x89\xa7\x81\x98\xef\xb0\xcd\xce\x7d\x01\x13\xac\x5a\xa2\x8a\x0a\x33\x2c\x4f\xf3\x44\xc1\xe1\x50\x37\xde\x31\x00\xcd\x40\x19\x6b\x9d\x3f\x06\xca\x73\x48\x26\xea\x07\x5d\x16\x5e\xd6\xb9\xcb\x45\xe7\xfb\x5a\x9a\xbe\x15\x0a\x8b\xb2\x90\xe8\xc2\x35\x4e\x01\xdb\x57\x0f\x7d\xe8\x6f\xfe\x59\x38\x43\x2e\x7e\x12\x2d\x73\x4d\x75\xad\x65\xf2\xa7\x6d\x71\x3e\x95\x30\xc1\xcc\x42\x92\x8b\x12\x16\x4e\xfb\x8e\x81\x4c\x36\xce\x57\x0c\x14\xe6\x78\x08\x9a\x4b\xed\x8e\xf8\x02\x94\x64\x22\x7e\xd2\x65\xe9\x1b\x9b\x9b\x82\x56\xf7\x91\x91\xb2\x3e\x6a\xc9\x0c\x57\x81\x7f\x37\x2e\xef\xe9\xde\x6c\xc6\x5f\xd9\xcf\xaf\x18\xe3\x27\xbe\x5c\xe7\x7c\x1b\xf7\x73\xb9\x3c\xfe\xb4\x2d\xcf\xa6\x28\x13\xcb\x1d\x55\x45\x45\x70\x51\x57\xfe\xc8\x41\xea\x8e\xad\x37\x0c\xe0\xa6\xa7\x42\xf4\xd2\x8f\x9b\xd1\xa7\x00\x51\x3f\x52\x7f\xd2\xcb\x51\xba\xc9\x4d\x6e\x06\xdf\xb5\xb2\x1a\xfc\x58\x4b\xd3\x61\x24\x84\x5e\x70\x62\xd0\x3e\xd1\xd6\x7c\xe1\xcb\xed\x57\xfd\x3c\xdc\x52\x3d\x6b\xf2\x78\x5c\x96\x63\x7b\xbd\xdb\xf0\x87\x2d\x3d\x57\x30\x21\xdc\x42\x52\x08\x08\x0b\xa3\xfd\x89\x8d\xb2\x73\x81\xd3\xd3\xd4\x42\xf3\x41\x04\x4f\x12\x90\xe2\x1e\x8f\x12\xfb\xd6\x64\x26\x23\x76\x34\x8a\x57\xbd\x52\xd4\x50\xac\x04\x5f\xfd\x88\xf6\xfa\x01\xdf\x1f\xff\xb4\x1f\x03\x7d\x4f\xb4\x0f\xd3\xf7\x73\x88\xc7\x33\xb4\x57\xae\x11\x7f\xdc\xc2\xf3\xa1\x80\x09\x54\x2d\x95\x65\x8d\x59\x5e\x70\xe6\xf9\xc8\x40\xdf\xd5\x75\x50\xa8\xb1\x1d\x57\x62\xd4\x0b\xcc\x59\x03\xad\xbc\x55\xde\x1a\x8c\xe6\xfe\x54\x54\x05\x11\x00\x1d\xbc\x15\xea\x08\x98\x1f\xad\x92\x2d\xc5\x5a\xba\x28\xda\x46\xd5\x3d\x49\x48\xd0\xef\x7b\x88\x30\x86\x6a\xe5\x9b\xbb\x9b\xbb\x90\x26\xb4\xec\x57\x5f\xec\xb7\x89\x35\xc6\x68\x90\x9a\x95\xb1\xcd\x2c\x5b\x15\x90\x99\x6d\x76\x66\x62\x56\xb1\x91\x49\x03\x84\x77\xbe\xee\xfb\x7e\x3e\xf4\x7d\x1f\x6d\x42\x4e\x2f\x7c\x3a\x8f\xbe\xfa\x35\xf3\x68\xbc\x7d\x9c\xe9\x4f\xf1\x29\x04\xd5\x3c\x5d\x1e\x3f\x25\xdd\xdc\xe5\x65\xcc\x85\x83\xb8\x14\x10\xc2\xc2\x79\x27\x01\x31\x54\xf9\x91\xf7\x42\x10\x2a\x2a\xd6\xbf\x74\xc8\xf1\x98\x57\xb9\x01\xcc\xd3\x93\x3a\x00\xea\x27\xa7\x44\x77\x71\x47\xb4\x09\x77\x14\x8f\xfd\xab\x7c\xb1\x1e\x85\xa8\xfb\x4d\xe8\x6d\xab\x0e\xe0\xdf\x81\xfd\x5d\xf1\x63\x88\xa5\x6d\xd2\x65\xb7\x5e\x5d\x33\xb1\x8d\xcb\x0a\xa2\xbc\x4c\x2a\x6f\x97\x93\xbd\xac\x2a\x24\xfc\xe0\x7b\x0e\x89\xaa\x76\x64\x2e\x41\x53\x79\x58\xcf\xb6\xb0\x4a\xe1\x38\xb3\xb6\xb7\xa7\xac\x52\xda\x4a\x01\xd2\x28\xda\x25\x7d\x94\xed\xcd\x8e\x3c\xc4\x7f\xff\xf2\x49\x3c\x2a\xc4\x7f\x5f\x54\x1e\x3e\x70\x49\x27\x53\x62\xbc\x2a\x00\x9f\x23\x10\x15\xbe\x3a\x06\x9e\x91\xcb\x03\xa5\x6e\x78\x15\xe7\x4a\x6b\x6e\x77\xc4\xb8\x33\x4e\xba\x50\x61\xc8\x97\xdd\xa5\x3f\x30\xcd\x34\x16\x4c\xf1\xb5\x4e\x76\x93\x1c\xc2\x7e\xe4\x37\xf9\x84\xad\x8d\x76\xc9\x9e\x35\x36\x2d\x28\xf5\x36\x91\x3e\xec\x0d\xa5\x73\x50\xdc\x47\x7e\xa0\x10\x29\xb3\xfa\xa4\x5e\x7c\x62\x0a\xa7\x55\x19\x67\xc6\x9c\xcc\x29\xaf\x94\x34\x52\x82\x6c\xc1\x62\x22\xfc\x50\xff\xf5\x67\x2f\x6f\x5b\x93\x6f\x60\xf8\xf4\xea\x4d\xc0\xb7\x21\xf1\xb0\x6a\xbb\x04\x28\x53\xd2\x7a\x01\xb8\xaf\x44\x55\x41\xb9\xb4\x0b\x83\x54\xba\xc2\x16\x54\x7a\xb5\xc3\xb3\x05\x4a\xfa\x4a\xfa\xda\x54\xba\xcd\x9c\x90\x56\x8a\x11\x94\x45\xa7\x20\x68\x1e\x73\xaa\xab\x64\xfc\x36\x96\x07\x05\x8b\x1f\xfe\xfa\x01\xcb\x8f\x9f\x57\x2c\xc0\x6c\xb3\x9f\xc6\x6a\x19\xe5\xcb\xe3\xd5\xae\x3f\x9f\x96\x99\xbd\x07\x1c\x64\xf0\x34\x8f\x3e\xb3\xbc\x53\x00\x61\x5b\xb8\xe3\x79\x48\x96\x19\x12\xb2\x65\x86\x1c\x34\xd7\x2c\xb3\x82\x4b\xa1\x6c\x57\x52\x5e\x82\x22\xda\x6c\xa2\x7b\x15\x72\x8d\xd7\x9a\xda\x1f\x2e\xd5\xb4\xdf\xbd\xda\xc7\x49\xd8\x92\x7f\x17\x38\xf6\x7e\x8c\xb6\xc6\x39\x20\x14\xb6\x48\x7b\x69\x99\xd1\x26\x66\xe6\x34\xf7\x1c\x94\x80\xee\xf4\x97\x26\xa1\x7e\xf4\x35\x04\x0c\xe4\x05\xf4\x7c\x14\x20\xf2\x35\x9b\x8f\x07\xab\x2f\xfa\x8e\xc9\x14\xe1\x27\xf5\xbb\xaf\xaf\x95\xbb\xaf\xf6\xf1\xb5\x72\x37\x7c\xd7\x56\x3b\x07\xa8\xa2\x96\x48\xcf\x4c\x2e\x8d\x88\x0b\x37\xcc\x13\x03\xe3\x4e\x9d\x69\x7c\xe8\xfd\x84\x40\xda\x97\xe5\x72\x0c\x9d\xbc\x45\xbe\x38\xa8\xc3\xea\x5b\x73\x4f\xf6\xf6\x61\x3f\x53\xfe\x2a\xdf\xae\x1d\x11\x1c\x36\xe2\x8b\x73\x09\x3e\x77\xcb\xe3\xf9\x4e\xcd\x59\xcc\xe7\xea\xe2\x5c\x1f\xf9\xdc\x49\xab\x40\x89\x6c\x56\xd8\xe3\x9c\x6f\xfa\xb9\x01\x5c\xfa\x46\xfa\xda\x2a\xbd\x0c\x48\x61\x84\x6c\xc7\x82\x62\x01\x97\x53\xd2\xe6\xa2\xe9\x42\x7f\xc3\x18\x48\xea\x84\x9f\xab\x40\x67\xbd\x3c\xc2\x66\x90\x29\x8f\x37\x85\xc7\xcb\x2c\x69\xba\x16\x69\xdf\xf9\x56\x10\xa1\x86\x1d\x9d\x8b\x87\x31\xf0\x30\x2f\x2c\x63\x40\x6b\xa7\xd7\x31\x10\xf2\x6a\xcd\x6f\xc1\x12\x25\x38\xa9\xce\xfc\x21\xfe\xab\x6c\x06\x45\x3b\x0f\x1b\xeb\x8b\xa0\x3a\x7d\x38\x40\xe7\x9d\xb7\x8a\x2a\x05\xd2\x00\xa6\x75\x1e\xbb\xd9\x16\x46\x59\x1c\x17\xcb\x24\xd5\xe7\x95\x31\xb5\x96\x20\x8f\xd2\xc8\x86\xfc\xa5\x6b\x2c\xed\x45\x7e\xcc\x35\xf3\xea\x81\x4c\xfb\x85\x20\x86\x4d\xe0\xf9\x88\x1e\x02\x6a\xb1\x70\xf3\xe4\x5c\xdb\x02\xda\xce\x53\xf8\xd1\xee\x90\xb5\x1e\x99\xd6\xc3\xb3\x11\x22\x51\x21\x92\xef\xd3\xb6\x0d\x35\x18\x69\x5c\x45\x87\x3d\x7c\x76\xdf\x79\x5d\xc5\x9e\x95\x21\x7d\x7d\x8a\x8d\xab\x8d\xbd\x14\x1e\x55\xb1\x9b\xc5\xb4\xd1\x5f\xf4\x9a\x0b\x3b\x02\x76\x6e\xaf\x6f\x3b\x62\x78\xd0\x90\x76\x33\x05\xee\xc9\x05\xc1\x62\x3b\xdd\x8b\xcd\xe1\x57\xda\xfe\xf8\xfd\x41\x30\xc3\xee\xfa\x7f\x2a\x87\x65\x1e\x08\x65\xf4\x9b\xd1\x7d\x41\x55\xd0\xfb\x89\x9b\x38\xbf\x44\x09\x9a\xe5\x73\x73\x30\x3c\x14\xe9\xb6\x33\x22\x34\x3e\xde\x47\x4a\x29\xef\x94\x52\x51\x9a\xa4\xf7\x74\xcf\xbe\xe5\x7f\xf0\x2b\x30\x24\xe9\x86\x7e\x69\x02\x6d\xaf\x8b\xf5\xac\x13\x51\x9d\x47\xe7\x82\x12\xc7\x11\xe0\xf3\x78\x7d\xf3\xdd\x93\x76\xb0\x9c\x27\xd2\xaf\x97\x9b\xd7\x76\x08\x3c\xbe\xf2\x37\xe3\x30\x8b\x0b\xf0\xc3\x38\x49\x32\x37\x13\x77\xbd\x32\xc9\x67\x72\x7d\xf3\xc3\x57\xfd\xe1\x39\x0e\x10\xdd\x93\x7d\xb4\x39\xfe\x36\x1c\x40\x6f\xa6\x2f\x69\xb9\xa9\xbf\xb0\x30\x68\x37\x4d\xf5\x05\x5f\x1a\xa5\x8e\xf3\x2f\xf8\xfa\x36\x0f\x9b\xa3\xe1\x4b\x1b\xf8\x7a\x86\x84\x5c\x1b\xc5\xa8\x40\x03\x12\xa5\xcb\xbe\x6a\x63\x7f\xf5\xb8\x78\x81\xa3\x4a\xc6\x73\x86\x1f\xaa\x95\x93\xdc\xce\xc8\xb9\x10\xac\x68\x40\x3e\xa3\xeb\xdb\x73\x77\x70\xfe\x6c\x78\xa4\x20\x5d\x7c\xb1\x2d\x7f\xa3\x2f\xec\x66\xf8\x92\x97\x9b\xea\x0b\xaf\x82\x2f\xea\xea\x0b\xa9\xaa\xc0\x21\x5f\xc7\xd9\x17\x72\x7d\x9b\xc7\x6d\x69\xc5\x2a\xb3\x3e\xa7\x94\xc6\x93\x1f\x97\xbf\x5c\xef\x73\xd3\xb8\xbd\x27\x7b\xf1\x5b\xfb\x46\xdc\x6e\x9a\x2f\x94\x2f\x07\x20\xb7\xcc\x14\x49\x53\x9d\xeb\xaa\x0a\x55\x52\x13\xe0\xe7\xfa\xfa\xe6\xab\x1d\xb2\xc6\x97\xf6\x67\xfa\xc6\x2e\xe6\x11\x0b\x9c\x0e\xeb\x2c\xf1\xfb\x0b\xfb\xc0\xca\xa1\x75\xa1\x8d\xbc\x09\xdf\xb9\x5d\xf1\x04\x6a\xaa\x6d\x58\xcb\x3e\xad\xd7\xb4\x1b\x13\xaa\xfb\x63\xfe\xd3\x29\x2e\x43\x39\xff\x18\xba\x66\x1d\x3e\x8d\x9b\xb5\x05\xda\x21\x9f\x62\x10\x75\xa0\x68\x5b\x59\xf5\x3b\x25\xbc\x13\xc6\x08\x20\x46\xa5\xd4\xdc\xf9\x12\x50\xef\xc0\x78\xc8\x3c\xc2\xba\x6c\x73\x69\xa4\x59\xeb\xfd\xc9\x5e\x6e\xb3\x07\x7c\x2b\x9b\xc3\x2f\xe2\xdb\x6d\xb6\xef\xff\x03\xd8\x86\xa8\x69\xd2\x84\x9b\xc4\xa4\xf8\xa7\x3c\x29\xe7\x3a\xbe\x24\x45\xc4\x3c\x7c\x96\x6e\x39\xec\x92\x0a\x79\xed\x11\x06\x1d\x40\x20\x05\x14\x50\xed\x07\xaf\xb6\x19\xf7\x15\x33\x86\x01\x7e\x12\x42\xcc\xbd\x87\x80\xfa\x1a\xf4\x5d\x7e\x9c\x4a\x5b\x36\x90\x0a\xad\x44\xe0\x34\x5c\xd7\xe6\x7f\x09\xce\x36\x5c\x88\x24\x78\x3a\x25\x64\x36\xb1\x5a\xf7\xa6\xb1\x0a\x9f\xd8\x9e\x23\x17\xf3\x0a\x79\xe9\x0b\x02\x4e\x80\x80\x14\x70\xc0\x94\x3f\x7a\xb9\xe9\xa9\xaf\xa9\x31\x14\xb0\x9e\x31\x36\x4f\x1e\x01\xe2\x1b\x70\xec\xf2\xc3\x00\x5d\x59\x95\x54\x28\x29\xa2\x5d\xac\xee\x51\xa8\x19\xf8\x93\x38\xc1\xd7\xed\x1d\x2d\x0d\xbe\x96\xe9\x6d\xda\xb5\xc1\xf1\x4f\x43\x8c\x43\x35\xcf\x8b\x06\x57\x0e\x58\x57\x2e\xfb\x47\x0c\xb2\x61\x9c\x8e\xf2\x30\xee\x94\xf1\x52\x2f\x47\x24\xeb\x47\xe7\xdc\xcc\xe6\x23\x68\x3c\x8c\xe9\x29\xf3\x07\x7f\x44\x16\x8f\xa5\xae\x55\xbd\xe6\x97\x86\xf1\xa1\x7f\x09\x67\x72\x59\x33\x9f\xe3\xfc\xaf\xe0\xd2\x31\x8f\x0e\x58\x2f\xd7\x85\xc3\x2b\x60\xa6\x69\x02\x76\x9a\x80\x72\x73\xed\x80\x74\xa5\x9f\xfc\x88\xa7\x23\x48\x4f\x9d\x6c\xfb\x9d\xd2\x5e\x1a\x63\x0c\xb0\x7e\xa8\xaa\x6a\xa6\x4f\x20\x1e\xfd\x11\x39\x74\x2a\x54\xa5\x2a\x15\xed\x92\xec\x1e\xee\xed\x4e\xfe\x4b\xf0\x6d\x33\x07\x8c\x57\x60\xf8\xa2\xe3\xe8\x19\xbe\x6a\xae\x2b\x60\xaa\xd2\x8f\x0b\xbe\x1e\x64\x4d\xa3\xdc\x71\x27\xa5\x67\x4a\x6b\x05\x6a\xdf\xd7\x75\x3d\x8b\xb9\x06\xbd\x4f\x63\x35\xe6\xbe\xf3\x07\x64\xf1\x04\x55\xa5\x6b\x17\xee\xbe\x48\xd0\xb1\x5b\x39\x84\xff\xfe\x52\xc9\x1a\xb8\x03\x92\x0f\xd9\x32\xe1\xbe\x0a\x44\xdb\x8f\xcc\x01\xe1\x44\x19\x27\x81\x3e\xfe\xed\x45\xc8\x6b\xdd\xa0\xdc\xdc\x25\xd1\xc9\x9d\x4e\x00\x66\x36\x03\xd0\x1f\x0b\x84\x34\x97\x65\x99\x43\x9d\x37\x1a\xdb\x96\x8c\xba\xcc\x66\x08\xa2\x53\xd2\x71\xac\x21\xf7\x47\x5f\x39\x77\x38\x6c\xed\x30\xd8\x21\x16\xbe\xf6\xa3\xf5\x56\x3b\xec\x4f\x9d\x1f\x95\x29\xbc\x00\x65\xa3\x6c\x75\x00\x10\xe4\x76\x18\x75\x45\x9c\x9d\xd1\xec\x5c\x12\xf9\x02\xb0\x68\x13\xa3\xc0\xff\xa7\x2e\xf7\xd6\xff\xf8\xd4\x86\xf8\x62\xc4\x77\x6f\x1e\xac\x58\x03\x2e\xab\x19\xef\x56\x33\xc0\x53\x33\x6e\x6f\x6e\x63\x33\x56\xd3\x04\x78\x96\x56\x19\xd0\xde\x64\x05\xc5\x5a\x68\x84\xf2\x3c\x35\x39\xa3\x9a\x55\x47\x32\x19\x94\x9f\x5b\x80\xc7\x0d\x14\xd8\x20\xe1\x3b\x8f\x6d\xb8\x4c\x5d\x8d\x59\xa6\x07\x5f\xdf\x47\xd6\x0f\xd6\xb6\x64\xb1\x67\x52\x2a\x1f\x5c\xb0\xc7\xb5\x13\xe0\x76\x00\x99\x6b\x68\xe3\x66\x38\x5b\x97\xa4\x3e\x07\x3c\x02\x21\x46\xbe\xf4\x99\xff\xf0\xa8\x8d\x10\xf8\xc6\x57\x26\x87\x75\xaa\x5f\x0b\x63\x3e\xac\xd5\x48\x1f\x03\xa1\x52\xb1\x4f\x49\x73\x0a\x0a\xa7\xd9\xe1\xd0\x01\xe6\x66\xec\x2a\x29\x85\x3e\x1e\x41\xee\x21\x38\x36\x07\x08\x0e\x3b\x69\x60\xd1\xdb\x2f\x23\x20\x7a\xb4\x5f\x7a\x4a\x92\x13\x62\x8a\x96\x27\xed\xdb\x4d\x66\x0f\x79\x1a\x72\x0e\x40\x62\x7f\x33\x0e\xda\x1c\xc3\x61\x31\x6a\x97\x9d\xa8\x9b\xb9\xad\xa4\x10\xfa\x70\x00\xa9\xa7\xa0\xa9\x1b\x08\xea\x6f\xe1\x80\x5c\x52\x38\x68\xdf\x6d\x32\xdb\x65\x17\x1c\x91\xba\x27\x9b\x32\xd4\x22\x3e\xe2\xf8\xf0\x80\xe3\x39\x8a\x0f\x0f\x28\x92\x9a\x54\xed\x32\xb0\x7b\xe7\x1c\x80\x73\xee\x0c\x17\x54\x54\xd5\x69\x19\x43\xae\x86\xc0\x5e\x21\x4c\x00\xeb\xd1\x9e\x21\x4d\x4e\x90\x49\x52\x8e\xda\x1f\x36\xe9\xc5\x13\x20\xc9\xef\x97\x33\x1b\xbb\x72\x18\xad\x7e\x78\xc2\xac\xb1\xd8\xfe\x80\xe0\xf5\xea\x87\xed\xfb\x62\x1f\x91\xc3\xb4\xac\xf1\x00\x9e\x4e\x27\xa0\x3d\xb4\x1e\x35\x5a\x2a\xbb\x0c\x91\x30\x69\x4b\x08\x4e\x3b\x66\xf2\xbc\x32\xe7\xbe\xb1\x8d\x3b\x9f\xbc\x01\x2a\x9e\x4a\xa2\x70\xd1\xda\x26\x29\x8d\xcb\xec\x85\x1b\xcd\x3d\xb4\xc5\xf6\xd7\xb7\x45\x44\xfb\xfb\x28\x2e\xe6\x13\xa0\x61\xde\x70\xe7\xa3\x3b\x18\x69\xaa\x71\x04\x64\x1e\xe3\xec\x30\xc0\x38\x7a\x6c\x0c\xaa\x87\x27\x9d\x02\xf6\x26\x34\xc6\xa5\x53\x80\xf8\x79\x9f\xb8\xe2\xb8\x94\x15\x3c\xc3\xf1\xf8\x9b\x05\xc7\x6e\x22\x27\x3f\xc5\x68\x3e\x00\x1e\xd4\x94\x27\x50\xb9\x73\xed\x8e\x56\xda\x3a\xc4\x5a\xd9\xdc\xc7\x65\x3f\xa0\xb8\xf8\x19\x30\xac\x7c\x06\x66\x1f\x72\xb6\x5d\xa8\xff\x58\xb3\x62\xfe\xe3\x25\x6e\x75\xfb\xee\xe3\x87\x30\xe8\x5f\xfd\x70\x9d\xb5\xde\xc7\xc9\x85\x0a\x09\x5c\x2a\x0f\xb7\x97\xb9\xf6\xcd\x87\x2c\xde\xbf\xff\xaf\x60\x5d\xb3\xe2\x29\xb6\xa9\x5b\x46\x6e\x93\x51\x58\x16\xb9\xc9\x6b\x85\x55\x31\xcb\x64\xc0\xb9\xc9\xf1\xf9\x04\x26\x1f\xea\x28\x87\x18\x1a\x7f\x30\xa3\x56\x9d\xac\x75\x27\x39\x67\x62\xcb\x4c\xe5\x7b\x3b\x77\x5e\x0e\x42\x94\xbe\x6a\x01\x4d\x04\xd0\x84\x95\x8c\x78\xaa\x99\x5a\x97\x33\x1a\xc3\xa3\x3f\xfa\x51\x4a\x3a\x28\xc2\xa4\x20\x51\xb4\x4d\xd8\xa5\x4e\xef\xcf\xc2\x3a\xf1\x37\x0f\x9c\x33\xcb\x4a\x71\xf7\x71\x59\x25\x1e\x38\x06\xd6\xd4\xaf\x8f\x77\x57\x2b\xb6\x1f\x96\x15\xe3\xd3\x77\xab\x15\xc9\x09\xf0\xa0\x20\xe1\x7c\x85\x3a\x0b\xa8\x6d\x5b\xeb\x1b\xdb\x25\xca\xf9\xcc\x01\xe6\x0a\x3f\xfa\x89\x4f\x63\x7b\xe8\xe8\xe1\xb8\x3d\x39\xa7\xbb\xce\x4f\xcb\x19\xcd\x2c\x1f\x87\xd9\x82\x71\x59\x32\x06\xdf\xfa\x96\x68\x04\x32\x85\xb4\x31\x0b\xce\x58\x5f\xfc\xfe\x67\x97\xf5\xec\xc3\x83\xc2\xc5\xdd\xd2\x0b\xb6\xcf\x10\x86\xda\xa2\xdb\x57\x17\x9c\xe0\x43\xb8\xac\x0d\xd4\x7d\x9b\x93\x03\x95\xe7\x6e\xd9\x1a\x00\x68\xa7\xc9\x7a\xb6\x7c\x82\x7a\x0a\xba\x17\xae\xca\x66\xc1\x62\xda\x83\xe8\x28\x8f\xe3\x4e\x3b\xdb\x75\x76\x72\xf6\xf2\xc7\x37\xb3\x01\x83\xcf\x62\x7d\x1f\xcd\x1a\x9b\xa2\xe5\x5a\x19\xb6\xe6\xf1\xc1\x5f\xc4\x78\x79\x5f\xff\xbe\x60\x04\x8f\xbe\x0c\x99\x74\x6f\xf6\xef\xde\x6e\x9a\x10\xef\x76\xbe\x04\x3d\x28\xdc\xaa\x64\x4d\x82\x98\xb5\x03\x2d\x80\xd5\x5c\x3a\xd0\x54\xd9\x4c\x69\xcc\x41\x0a\xf2\x41\x0e\x7e\xdc\xe9\xca\x74\x9d\x19\x2f\x50\x9d\xbb\x40\x4d\x63\x33\xcd\x0a\xdb\xbc\x13\x5a\x2f\x48\xb7\x49\x15\xb4\xfb\x54\x60\x01\xf9\x3e\xca\x57\x25\x86\xc7\x7c\xf5\x1f\xdf\x5c\xae\x2c\xc3\x51\xfc\xc3\xa7\x8f\x1f\xbe\xdf\x5f\x16\xb7\x9b\xbb\x9b\xcb\x1d\xef\xd6\xc8\x34\x1b\x7a\xda\x8f\xf5\x48\x41\x9e\x2f\xbb\x85\x36\x49\xcf\x93\x05\x83\xcf\xc7\x3e\x75\xe9\xe8\x86\xc1\x4d\x85\x1f\x70\x57\x1c\x77\x8a\xe5\xd9\x81\x59\x71\x3a\x58\x53\x55\x9a\x7b\xa6\x6b\x5f\x20\x8c\x91\x52\x6b\x62\xae\x45\xa6\x9c\xd6\x3e\xf9\x27\xf0\x6d\xbf\x89\xef\xf6\x01\xdf\xed\x05\x9f\x92\x59\x36\x8c\x74\x1a\x0e\xf7\x11\x05\x65\xbe\x6c\xa8\xeb\xa4\x3c\xf7\x36\x4e\xe7\x69\x1a\x96\x11\x17\xb9\x71\x74\x7e\x2a\xfd\x09\x1f\x8b\xd3\x4e\xb1\x2c\xef\xb8\x95\xfd\xd1\x18\x6b\xbf\x05\xd1\xc0\x00\x31\xda\xc6\xe5\xfd\x7a\xa7\x76\xc5\xf8\x37\x2b\xc6\x07\x2e\xc5\xd7\x4f\x30\x82\xdb\x4f\x97\x51\x74\x91\x0c\x5e\x93\x37\x37\x07\x95\x65\x00\x02\x42\x7d\xeb\xbb\xc9\x37\x14\xe8\x98\xce\xcd\x61\x3d\x3b\x1d\x67\xe8\x7b\x40\x52\x0b\x94\x05\xcc\xd7\xd6\x2b\xe4\x1d\x06\x45\xe9\x0f\x3b\xc5\xb3\xf4\xc0\xad\x3a\xf5\xd6\x38\xf7\x00\x95\xe8\xe7\x48\xb7\xf1\xf0\xc2\x97\xff\x5c\x9c\x9f\x3e\xdf\x6e\xb1\xc8\x32\x90\x82\x8c\x2d\x7b\xbe\xde\x0f\x04\x90\x65\x42\x3a\x24\xf6\x2c\x5d\xcc\xe7\xb0\xc9\x4e\x1d\x80\x6e\x55\x37\xee\xa0\xef\xf0\x58\xfa\xe9\xc1\xa3\xa7\xde\x68\x67\x5f\xc0\x5c\x76\xe7\x17\x87\x6e\x83\x46\xdf\x37\xfc\xf9\xa0\xf4\xb6\xff\x15\x38\x73\x99\x65\x13\x40\x74\x99\xe5\x4e\xbe\xa7\x80\xa7\xcb\x9c\xd9\xae\xf1\x5c\x39\x5b\x3f\x80\x22\xb5\x00\xbb\x65\xa3\xe8\x7c\x03\x7d\x8b\xa7\xd2\x8f\xa1\x73\xb6\xc2\xaa\xbe\x37\x7f\xca\x9d\xd1\x36\x19\x43\xae\xbf\xba\x28\xe8\xfe\xfb\xe8\x3f\xaf\xf5\x47\xaf\xef\x02\x39\xd7\x45\x7b\xff\xc3\xbb\xf7\x77\x1f\x6f\xdf\xbd\x7f\xf5\xe1\xd3\xe7\xdb\x1f\x96\x35\xeb\xfd\x8f\xbf\x07\xbb\xa0\x20\x19\x6e\x5a\x07\x98\x03\x2e\x0a\xd8\xcc\x98\x1a\xd2\x15\x50\x00\x9a\x97\xb8\x29\x73\xdf\x41\x40\x98\xf3\x47\x0c\xb2\x89\x77\xde\x62\x80\x41\xca\x27\x6f\x18\x30\x3b\xc5\xa5\x71\xca\x78\xec\xdd\x4a\x77\x42\xe3\xd4\x6a\xc3\xc8\x7c\x30\x46\xfb\x56\x34\x5a\x0b\x22\x8f\xce\x28\x2c\xef\x23\xa3\xdd\x95\x9f\xa5\xd8\xe9\xe8\x77\xd1\xbf\xbd\x60\xfe\x7c\x41\x7d\xbb\xa0\x4c\xae\xd4\xa0\xfb\x6b\x31\x22\x78\xb0\x64\x1b\xf8\x11\xc3\xe7\x8f\xeb\x67\x4c\x61\x01\xd8\xd9\x01\x9e\x17\xae\x76\x8a\x53\x4c\x2a\x3a\x56\x2d\x94\x9c\xf3\x24\x9b\xa9\x56\x22\x56\xf4\x78\x1f\xe1\x13\x80\xfc\xe0\x2d\x5a\xce\x83\x7c\xf4\x18\x01\xbd\xd3\x94\x19\x83\x91\xef\x4b\x84\x10\x83\x05\x16\x1c\x41\x99\x17\x45\x7e\x1f\x19\x3f\x79\xed\x1d\x07\x39\x90\xc0\x36\xc2\x30\x8d\xb1\x68\xb4\xe1\x4c\x1c\xad\x11\x61\x1d\xc0\x61\xbd\xfa\x86\xff\x6f\x1f\x50\xdf\x5e\xfd\x7f\xfb\xe8\xff\xed\x45\xc1\x73\x39\x2c\x6e\x11\x2a\xc0\xd4\x95\x18\xa4\x67\x64\xad\x06\x59\x81\x5b\x30\x14\xb0\x04\x19\x2a\x3d\x44\xa0\xe7\xbd\x67\x04\x68\x40\xc4\x7d\xe4\x53\x02\x3a\xa0\x84\xaf\xe7\x91\xc7\xe5\xd2\x0a\xd6\x68\xeb\x89\xb7\x7e\x60\x20\x07\x3c\x8e\xac\xb2\xa1\x15\xb4\xf2\x07\xd5\x68\x23\xa9\xec\x9d\x55\x44\xdd\x47\xda\xb8\x6b\x9e\xf7\x3a\x16\xff\x65\xd8\x73\x5c\xc6\xd9\x01\x62\x90\x7f\x59\xd6\x25\x50\x94\xf8\x10\x67\x25\x2a\x41\x41\x0a\x9f\x61\x30\xf1\xc1\x23\x0c\x2a\x40\x85\x1f\xe7\x91\x80\x1e\x58\xe9\xcd\xdc\xf3\x98\xfe\x32\xf6\x56\x7d\x03\x7b\xbc\xe9\x2f\xdc\xab\x59\xf4\x57\x57\xc6\xca\xef\x1f\xf3\x3a\xde\x7c\xb8\xf9\xfe\xbb\x37\xfb\x77\x49\xbc\x7f\x1f\xdd\x6c\x0f\x36\x2f\x00\xc7\xa5\x41\xc5\x88\xa8\xd0\xd4\x56\x95\x68\x28\x6b\x38\x88\x76\xa2\x54\x4a\xa7\x13\x2f\x5c\x55\x69\x31\x9e\x7c\xcb\x7c\x5a\x55\x3d\xc0\xbe\x3d\x1a\x80\xc0\x31\x8a\x36\xa1\xce\x76\xda\xc9\xe8\x55\xf0\xd3\xa7\x28\x5a\x75\xb6\x1e\x76\x22\xe1\x01\x37\x1f\x5e\xdf\x3e\xae\x5b\xaf\x6e\x1f\x84\x9c\x3f\x7d\xbc\xb9\xbb\xbd\x79\xfd\xe1\x46\xb6\x76\x5a\x76\x22\x93\x6d\x13\x44\xbd\xcc\x8e\xb5\x70\x8d\xee\x05\xc8\xa9\xaf\x28\x40\xd6\x1f\x5d\xba\xec\x05\xb6\x4d\xa0\x3c\x0a\x17\x72\xbd\x87\x0e\x99\x46\x37\x7a\x74\xa6\x05\xa9\x03\xc7\xae\xf3\x30\x2f\x40\xe6\x47\x74\x89\xab\x44\xfc\x9e\xee\x5d\xc2\x2e\x18\x3f\x5f\xeb\x61\x3f\x3e\x5b\xe7\xb7\x37\x57\xd9\xec\xbb\x4b\xce\xfe\x05\xe3\xed\xa7\x7f\x00\x7f\x0d\x5e\x2f\x6b\x17\x07\x7d\x15\x93\x6a\x59\xf5\xab\xb9\xad\x7c\xb9\x83\x20\x9d\x61\x07\x26\x34\xb7\x43\x69\x67\x85\xe3\xa8\x9a\xe1\x14\x43\x3b\xf7\xc0\x64\x5e\xc4\x65\x0a\x4e\x49\x8e\x31\xc6\x86\x31\xc6\xcc\x7d\x24\x75\x69\xe1\xb2\xcb\xc5\xa6\x74\x12\x44\x9c\xdf\x47\x08\x67\x19\x46\x66\x8d\x03\xb1\xcb\xdc\xf5\x2a\xd4\xad\xfd\xf1\x39\x83\xd4\x75\xef\x04\x2e\xe4\x51\x2b\xca\x40\x92\xf8\xdd\x9b\xfd\x8f\x0f\x49\x90\xe2\x64\x00\xb1\x7d\x6f\x7d\x6b\x4e\x31\xe4\xbe\x66\x00\x11\x4f\x05\x60\x0e\x68\xee\x75\x3d\x32\x3f\xf8\xa2\xeb\x00\x1b\x2e\x34\x52\x87\xc3\xe1\x70\x46\x4b\xf3\x76\x20\xb5\xe0\xd4\xb6\xbe\xb0\xbe\xd7\x4d\x17\x97\xe1\xde\x3e\xe8\xb4\x26\xd1\x33\x7c\x1f\x7e\x06\x5f\x40\xf4\x58\x39\xf5\xd0\xe4\x97\x06\x4f\x8a\x93\x03\xda\x9d\x4e\xce\x6b\x77\xda\x44\xd2\x97\x07\x50\x32\x7f\xe8\xac\xb7\x0c\x08\xe1\x11\x07\xb6\xf2\x72\x1c\x81\x1d\xb6\xdd\xd2\xde\xae\xef\xfb\x7e\x01\x5d\xf9\x21\xa4\x6f\xfa\x63\x6b\x3a\x10\x55\xe0\xd4\x34\xbe\x00\xc4\x9f\xca\xd0\xe8\x9b\xb8\x0e\xb5\x74\xbf\xe4\xc3\x05\xe3\xff\xc7\xda\xbf\x03\x49\x8e\xa3\x79\x82\x38\x41\xfa\x83\x33\x6b\xff\xff\x32\x2a\x2b\x2b\xd9\x3b\x3d\x3b\x8c\x89\xae\x4a\xce\xde\x0b\xd7\xd1\x99\x89\xdd\xd9\xdd\x83\x72\x66\xb0\xb5\xb3\x3d\xdc\x9d\xd9\x19\x84\x13\x20\x42\x3a\x83\x08\x11\x22\x44\x88\x10\x29\x52\xa4\x48\x91\x22\x45\x17\x29\x52\xa4\xe8\xa2\x77\xa5\x13\x71\x46\xd0\x3d\xc2\x23\x33\xab\xba\x7b\xa7\x33\x8b\x41\x56\x44\x58\xfa\xc7\x0f\xaf\xef\xf9\xfb\x45\xdb\xfd\xef\xc0\x37\x64\xbc\xbf\x4b\xb2\xd1\x02\x6d\xc7\xd1\x7a\x6d\xc7\x4d\x2e\xe7\x23\x48\x17\x19\x4f\x7e\xa8\xbc\x64\xa0\x96\xbe\x94\xc0\x54\x5e\x4d\x13\x30\x20\xbd\x48\x39\x4d\xd3\xb4\x4a\x39\x56\xd6\x01\xe4\x8f\xad\x6d\x6f\xa5\x6c\x17\x21\x37\x31\xbd\xec\x33\x6f\x42\x55\xe0\xb3\x45\xff\x7a\x5e\xfe\x92\x1e\xef\x3f\x7e\xb8\xfb\x27\x70\xf7\xf6\xfe\x2e\x36\x20\x77\xa0\x09\x71\x6c\xe7\xa9\xf3\xd3\x46\x5b\x9f\xd6\x80\x61\x2f\x3a\xe5\x0b\x06\x9c\x9e\xc7\x0a\x34\xd6\x53\x90\xa7\x7e\x04\x0d\xc0\x97\x21\x6f\x9a\xa6\xf1\xa3\x2f\x2b\xdf\x4a\x67\x40\xeb\xeb\xc9\x06\x8d\x0e\x6d\xeb\xcb\x3c\x5f\xfe\x51\x18\x74\xba\x4b\x4c\x18\x77\x1d\x65\xd1\x7d\x60\x94\xfa\x2f\xd1\xff\xb1\xee\x31\x57\x16\x88\x00\x15\xb2\xbd\xfd\xc6\xb5\xa7\x3e\x80\x25\xfc\x03\xf8\xfe\xe1\xca\x94\xf1\xf1\xd3\x1f\xc2\x0f\xc1\xcd\x91\xf5\x63\x08\x65\xfe\x6e\x9b\x5a\xc6\xaa\xa6\x84\xd2\x71\x8d\xfd\xe0\xdb\xb2\x02\x56\x93\x9c\x90\x2c\x17\x14\xaa\xc2\x56\x25\xf1\xc4\x60\x4c\x29\x54\xa8\x50\x69\x7f\x62\x4f\x51\x5f\x3d\x45\xac\xaf\xd3\xaa\x2e\x05\xb0\xba\xf6\x8b\xc1\x0b\x4a\xd5\x79\x4a\x81\x06\x52\x3b\xdf\xf8\x96\xc4\xd1\x4e\x97\x86\x67\x05\x82\xd8\xb5\x44\xc3\x5c\xf1\x11\x36\x79\x9a\xc3\x12\xda\x1a\xa9\x22\x93\xcc\x95\x15\xcb\x0a\x55\x4a\x83\x53\x49\x8d\x30\x56\x69\xaa\x8a\x02\x65\x4a\x78\x85\x6b\x2e\x54\x49\x5a\x27\x0d\x94\x75\xc7\x02\x30\xcf\x2e\xe9\x9f\x54\xf0\x7f\xaf\xd8\x1f\xeb\xc9\x71\x8b\xfe\x76\x89\xed\x05\xaa\xf7\x17\x10\xd5\x2f\xaa\x0c\x36\x91\x71\x80\x3a\xad\xcd\x9c\xc5\xd3\xd9\x90\xce\x80\x22\x50\x61\x5c\x2e\x66\x98\x14\x02\x10\xc9\x38\x17\xdb\x7a\x59\xb5\x76\x46\xd6\x53\x17\x13\x1b\xf7\x76\xc5\xe0\xb5\xbe\xc5\x1d\xe7\xd2\x0a\xad\x9c\xb8\xda\x44\x2b\xee\xe3\xdf\x3d\x5b\x17\x2f\xc8\x00\xdf\xbf\xc0\x00\x5c\x18\xcc\xef\x3f\xde\x3d\x66\x2f\x80\xf7\xeb\x77\x57\x4f\x79\x23\x40\x11\xca\x2f\x80\x20\x50\xc2\x62\xc6\x80\xfb\xd1\x72\xc6\x18\x77\xa0\x2a\x6d\x01\x98\xd7\xd2\x5b\x02\x72\xe9\x2d\x53\x8c\x71\x11\xcb\xda\x70\x5b\x2d\x33\x4f\xf7\x32\x3d\x50\x2a\x99\xee\xbd\xa2\x52\x68\xea\x69\x0d\xa8\xef\x5a\xe3\xfb\x4a\xcb\x09\x4c\x4c\x09\xc3\x7c\xa1\x9c\x6e\x42\xee\x67\x1b\x70\x3b\x5c\xc0\xed\xf8\xcd\x4b\x37\xdf\x15\xbb\xe3\xdd\x0d\x3d\x7b\x60\xad\xbc\x01\xad\x0b\xc0\xd6\xd9\x62\x09\x55\x65\x0e\xf8\xd9\x8d\x14\xd5\xa8\x74\x25\x1c\xce\x6c\x82\x28\x3e\x38\x8f\xdd\x4a\xd7\xd1\x79\xbc\xed\x09\x46\x4c\x58\xa4\x2b\xe3\x4a\x23\x17\x1f\x63\x3e\x9e\x1d\xe7\x89\xf0\x7d\xe3\xb3\xe6\x8a\x5f\x40\x36\xd1\x0e\x45\x65\xf4\xef\xc3\x7a\x20\xd1\xff\x76\xe1\x12\x58\xb9\x1b\x97\x6b\x39\x79\xd7\x22\xce\x50\xc0\xfc\x70\x55\xf2\x22\xe0\x17\x64\x1d\xdb\x50\x28\x1b\x26\xc2\xfe\xc2\xd5\x01\x96\x43\x9e\xce\x75\x92\x2b\x05\x8a\x12\xea\xb2\x70\x58\xd0\x1c\xc1\x32\x6d\x46\xd6\x1a\x7f\x00\x4e\xc9\xf8\x20\x04\x24\x05\x87\x74\xae\x4d\x8c\x1c\xc3\xcc\x72\xa2\x89\x82\xc0\x79\xa1\xea\x7a\x5b\x43\x8c\x89\x92\x8b\xaa\x45\x49\x69\xc3\xb0\x4a\x51\x35\x0a\x45\x8c\x2a\x8b\xf9\x70\x1e\x57\xfa\xff\x58\x9f\xeb\xe4\x60\x1b\xca\x39\xc6\x9a\x70\xd2\xfa\x8a\x57\xa1\xc6\x90\x24\x68\xa7\x9f\xb1\xb0\xef\xef\xee\xe3\x97\x72\xab\x37\xf7\x77\x81\x80\xeb\xf1\xa5\xd4\x68\xad\x3f\x0c\xf3\xfa\x77\xb1\xf0\x6d\x9c\x67\xd4\x20\x92\x51\x54\x66\x45\x3a\x9f\xc6\x3c\xab\xd0\x91\xca\x12\xe7\x18\xe6\xb9\x2a\x73\x93\x97\x87\xa2\x3f\x22\x10\x6d\xcb\x19\xcd\x55\x5b\xea\x1c\x39\x00\x93\x41\x88\xb2\x9e\x0f\x7d\x6e\x72\x06\x4a\x2e\xa1\xe2\xe7\xde\x28\x5e\xb1\x15\xff\x3a\x0d\x36\xcf\xb2\x8f\x5e\x7b\xb7\xfe\x6b\xf4\x7f\x7d\x7b\x37\x7d\xb3\xbb\xd2\x53\x5f\xa6\xcd\xed\xdf\x50\xfe\xf0\xe1\xfe\xed\xf6\xc3\xfd\xdb\xe4\x42\x53\xf4\x42\xec\x13\x68\x8a\x12\x04\x72\x03\xf2\x00\x6e\x68\xfd\x64\xfc\x24\x8a\x82\x39\xac\xd3\x1c\x64\xc8\x94\x25\x30\x9e\x03\xe1\x57\x8e\xce\xe6\x9c\x83\x7a\x2d\xa0\x5d\xae\xb4\x4e\x0e\xbc\x72\x3d\xf1\xa7\x7e\xf4\x07\x06\xd2\x4e\x83\xd2\x30\x4f\xd8\x2e\x95\x52\x4a\xc3\x39\xe7\x1e\x95\x85\xaa\x9a\xb2\x2c\x18\xc2\x54\x73\xc5\x35\x57\xb1\xe5\x03\xe7\x23\xe7\xbe\xd6\x52\x32\x98\x5b\xc8\x58\x69\x72\x44\x32\x48\x48\xb4\x0f\x35\xf5\xab\x0e\xae\xbd\x5f\xff\x7b\x60\xfc\xbb\xff\xca\x1a\x7b\xd1\xc1\xe3\x4f\xdf\x52\xc2\xc3\xdb\xc7\xb7\x1f\x1e\xde\xbe\xfb\xf0\x70\xa3\x84\x2b\xd3\xfa\xaa\x84\x0a\xe4\x76\x58\xce\xc5\xc1\xfa\x89\xe6\x05\xb2\x58\x67\x69\x97\xe5\xba\x5c\x36\xaa\x2a\xa4\xb7\x91\xef\x01\x3b\xdb\x90\x92\x38\x9d\x38\x49\x34\xaf\x6c\x47\x4e\x6d\xff\x14\xb1\xa1\x32\x00\x5a\xe6\x11\xbd\x7d\xf3\xb4\xc8\x65\xd3\x95\x45\x51\x96\x08\x13\xcd\x15\x5b\x5e\xdd\xf0\x03\x63\xcb\xab\xb7\x4a\x68\xbe\xbc\x3a\xa5\xa5\xc9\x21\x2b\x30\x63\x6b\x5f\xcb\xb2\xef\xda\xc0\x0b\x7a\x8b\xbd\xf4\x4f\xb7\xde\xd3\x8a\x65\x7d\xb7\xe6\x45\x97\xa5\xf5\x45\x7d\xd3\xb6\x2b\x72\xe0\x3e\x9f\x40\x97\xe5\xbe\x7e\x46\xd7\x46\x60\xf2\xb9\x19\x47\x7f\x48\xf0\xb9\xb3\xd7\x36\xd7\x00\xde\xbe\x0b\x90\x61\x65\xe9\x87\x99\x4b\xd0\x31\x7f\xe4\xcc\xc3\xb5\xa2\x68\xe2\x7e\x34\xd1\x2e\xb2\x71\xb7\x57\x3b\x7b\xf1\x96\xff\x6d\xf4\x1f\xa3\xff\x33\x54\x02\x5e\x0e\xc7\xbb\x75\x0c\xae\x25\xf3\xfb\x9f\xde\x3f\xbc\x5d\xcb\x7c\x3e\x7e\x0a\xc3\x74\x1d\xab\x4b\x43\xe5\xc7\x4f\x1f\xc1\xdb\xfd\x0f\x2f\xb0\xaf\x1f\xfe\xf0\x3e\x80\x0f\x6d\x73\x88\x4a\x55\xf4\x2d\x6a\xf2\x82\x23\xd8\x07\xfd\xa3\x32\xcf\xa6\xcc\x1f\x14\xf2\x04\x4f\x4c\xdb\x42\x0a\x21\x73\x4d\x15\x61\x94\xc0\x52\xdb\x4a\xb0\x6c\x0b\x9d\xe4\x0c\xc3\x0c\x63\xa4\xdd\xc9\xee\x72\x4f\x18\x87\x14\x95\x38\x96\x45\x8e\x21\x11\x94\x56\x84\x1c\x8b\x42\xa7\xa0\xc8\xbd\xac\x14\x93\x65\x2e\x99\xce\x33\x29\xbb\xb2\x66\x69\x46\x48\x39\xd9\xa2\x84\x40\xaa\x51\x0b\xce\x33\x95\x51\x66\xc6\x19\x27\x81\xb3\x6f\x99\x9f\x26\x11\xa1\x07\xe2\xd5\xd8\xac\xb0\x41\x57\x6f\x2a\xb9\xff\xf8\xe1\xfe\x87\x24\x84\xa9\x1f\xd6\x5c\xf5\x87\xfb\xb7\x9b\xb4\x2c\x62\xe7\xc7\x32\x03\xa7\xd3\x09\x9c\xf2\xe2\x14\xf3\x3c\xe7\x01\x92\xa4\x9c\xec\x36\xb3\xe7\x2c\x39\x5e\x2e\x01\x91\x16\xb9\x52\x18\xeb\x22\xf7\xbd\xcc\xf0\x8c\x11\x38\xf9\x14\x81\x94\x1c\x29\x5d\xce\x92\x0d\xf9\x17\x9d\x25\x1c\xa0\xbc\x70\x65\x0e\xf0\x79\x1a\x08\xb4\xb0\x70\x65\xd9\x9d\x9b\x43\x89\x62\xeb\xbc\x72\x6b\x56\xce\x78\xb5\xed\x03\x0b\xf7\xed\x59\x22\xe6\xe9\xe6\x2c\x69\x57\x9b\x5f\x5d\x30\xe0\xfe\x02\x9b\xfa\xd3\xd7\x36\xb5\xed\x1d\x28\x5c\xdf\x3b\x3f\xba\x3e\x71\xd2\x1b\x0a\x4a\xe1\x07\xa1\x7d\xcb\x01\xe1\x9e\x2f\xe6\xbf\xaf\x17\xa3\xbf\x5d\xad\x55\xdb\xf7\x87\x83\x6f\x7d\x69\xfd\xc9\xe9\x06\xe4\x7e\x68\x6d\x73\xb2\x60\xe8\x3a\x5f\x02\x72\x35\xff\xa2\x34\xe9\x2f\xf8\x09\xb7\x35\x41\x97\xda\xc9\x57\xf5\x40\xdf\xb6\x6a\xe8\x73\x9d\x69\xff\x8a\x35\x7f\xb9\x88\x36\xbd\xa8\xc1\xa9\x76\xb8\xaa\x76\xd8\x73\xe3\xbc\x3a\xab\x58\x6b\x6f\xd4\xf2\xdf\xc0\x2d\xb3\x58\x51\xee\x54\xb0\xef\x93\xfa\x89\xef\xab\x30\x7e\xcb\x9a\xff\x31\xe0\xd8\xbe\x0b\x49\x85\x8f\xc9\x97\x55\x8b\x97\x5c\x6a\x88\xed\xe2\xaa\xe0\x00\x9d\x1b\x90\xe5\xcf\x8b\xb9\x4f\x6a\xaf\x83\x71\x55\x9d\x53\xd0\x06\x23\x4b\xed\x4c\xa9\xd3\x39\x8f\x27\xe4\x5d\xe5\x51\xe5\x89\xad\x5d\x6d\x97\x2f\xcb\x7c\x96\x01\xa3\xf6\xd5\xfc\x79\xf3\x67\xcf\x1f\x03\x60\x56\x54\xc5\x75\xfa\x18\x74\x3b\x7d\x42\xb7\xe7\x15\x03\xe1\x1b\xa6\xc8\xeb\xe9\xd3\x84\x1e\x7e\x92\xf0\x20\x4b\x7e\xe9\x62\xfe\x5a\x96\x5f\x12\x45\x83\x6c\xb5\x8a\xb2\x19\xf5\x18\xca\xb2\x70\xa4\x9a\xd3\xb6\x44\x31\xb7\xbe\xb6\x76\xf5\xfb\x7c\xfd\x5a\x92\xd3\x37\x04\x89\xa2\x28\xd9\xe4\x81\xdf\xa3\x88\xde\x5c\xab\xc5\x6e\xba\x4c\x42\xfc\xef\xcd\xc3\x8b\x08\x77\xf7\x9b\x32\x61\xd2\x61\x5e\x08\x82\x61\xe6\x0f\xa5\x3f\x8a\xb1\x3c\x25\xb0\xf2\xa5\xb5\x60\xf0\xe5\xae\x98\xbb\x31\x73\x99\x02\xda\xe7\xbd\xa9\x80\x99\xa3\x73\x23\x44\x42\xe7\x1a\xf4\x01\x27\xe3\xf0\x44\xf7\x72\x27\xa3\xdf\x46\xff\x78\xe5\xb8\x4d\x5e\x3e\x35\xb4\xbe\x7f\x5c\xd1\xeb\x2e\xf4\x00\x87\xaa\x80\x31\x25\x78\x50\x6d\x31\x09\x46\x33\x3f\xfa\xba\x00\x16\x64\xa9\x4f\x29\x13\x75\xa7\x99\xa3\x7a\x27\x4b\x25\x3e\x77\xfe\x74\x28\xaa\xa2\x02\xb2\xd5\xb5\x69\x27\x80\x0d\x97\x83\x9f\x5c\x83\x1b\x17\x5d\xe6\xc2\x26\xfa\x6f\x9d\x0b\x16\x90\xab\x59\xda\x0c\x0c\x39\x04\x2d\x84\xc3\x59\x4e\x10\xc7\xa1\x7c\xf8\xb9\xb4\xf6\x9b\x73\xe1\x78\x29\x1b\xeb\x2e\x73\xa1\x7a\x22\x7b\xb6\x2d\x7f\x65\x9f\xbd\xbf\xec\xb3\x9f\xee\x7f\xf8\x6a\x5f\xcb\x51\x1e\x57\xfe\x54\x22\xd0\xfe\x91\x80\x06\xe1\xa7\x28\x1e\xf3\x52\x83\x13\xc9\x67\x84\x92\xce\x9d\xa1\x73\xd7\xfa\xda\x6d\xc9\x98\xe1\xdc\x2c\x17\xc1\x1e\x2a\xc2\x7c\x35\x67\x18\xc7\xc7\xd0\x9d\x6c\xa3\x6d\x74\x78\xc2\xfb\x62\x63\xbf\x92\xe7\xe1\xf5\xbe\x0f\x16\x71\xde\x6d\x2f\xf2\xbc\x7b\x96\xa7\xc8\xc0\x51\x42\x04\xba\x3f\x36\xc0\x15\x50\x80\x53\x96\x03\x04\xcb\xb9\x81\x59\x92\x57\x73\x5a\x55\xf1\x69\x4e\x97\x6b\x63\x31\x31\x82\x99\xe5\x42\xd0\xd3\xc5\xa2\x98\x66\x41\x69\xec\x8e\xdc\xf7\x62\x8d\xed\x85\x7d\x7f\x0b\x5f\xc9\x73\x1d\xab\x1b\x99\xb6\xdf\xd4\x4f\xec\xc0\x31\x2b\x2b\x98\xc7\x59\x57\x22\x20\x7f\x6e\x00\x83\xd8\x81\x66\x11\xc9\xa7\x28\xee\xec\x5c\xda\xe7\x56\x8d\x8d\x26\x78\x51\x91\x5a\x84\x12\x07\xa6\x84\xb7\x73\x49\x69\x3c\xf8\x93\x0e\x04\xb1\xeb\x3e\x32\x5c\xe6\xce\x8a\xa9\xf0\xab\x73\x67\x91\xe6\x82\x3e\x6f\x00\x5e\x27\x0e\x3d\xf7\x23\x41\x16\x95\xb6\x84\xfd\xd9\x8d\x10\xc7\xf5\x7c\xa8\x62\xb4\x6c\x21\xbf\xb0\x81\x9c\x96\x65\xdb\xb5\xad\x59\x6b\xb8\xb6\x71\x13\x6a\x8f\xfe\xe4\x38\x7d\x7b\xde\x6c\x49\x91\x81\xb1\x87\x25\x60\x9f\x0b\x80\x21\x5a\xf4\x94\x43\x90\xc3\xc2\x23\x14\xbb\x6a\x56\xce\xc5\x66\x56\xcb\xb5\xb1\x04\x1b\x85\xac\x65\xcc\x40\xe4\x39\xa7\xd4\x77\x33\x43\x28\xae\x9f\x22\xed\xed\xca\x9b\xab\x9e\xc8\xe6\xf8\x5a\x2f\xe0\x19\x7a\xe4\x57\xf5\x12\xdb\x43\x38\x9b\xc7\xb9\xa9\x71\x89\x51\x61\xca\x52\xcf\xc6\x15\x30\x4e\xbd\x30\xc0\xfa\x13\x48\xb7\x3d\x21\x90\x09\x83\x8d\xfb\x96\x5a\x74\xd7\x45\xdb\xc0\x63\xf5\x8b\x36\xc2\xf6\x87\x77\xcf\xa8\xbb\xab\x3b\xf7\xc5\x5c\xe9\xc0\xb1\x80\x35\x2e\xe2\xf4\x33\x05\xa9\x24\x00\x32\x5c\x61\x02\xd0\xcf\x27\x80\x31\x4d\x1a\xf7\x8a\xa8\xf7\xd6\x4e\x80\x46\x04\x9f\xf3\xf4\x6a\x71\x5f\x30\xef\xc9\x5e\x05\x99\xfe\x7e\xed\x7f\xbe\xca\xf3\x1a\x95\x6c\x15\x0d\x84\xc8\xe0\x57\x08\x47\x09\x04\x55\x81\x1c\x29\xc1\xe1\xf3\xb8\x21\xee\xdc\x39\x90\x97\x48\x51\x04\x22\x5c\x54\x39\xf5\xb5\x03\x96\x50\x53\x48\x74\x72\x27\x77\x95\xcd\x4f\x8b\x6e\x00\xa6\x94\x48\x25\x15\xa4\xc2\xcb\xae\xf3\x70\x05\x36\x82\x33\x8e\x3b\x9f\xc6\x3a\xe0\x0f\x5a\x50\xed\xd7\x33\xe9\xe3\xad\x15\xbe\x7f\xd6\x5a\x10\xf7\xfe\xcb\xe6\xde\x70\x5d\xdf\x63\x53\xa0\x22\x76\x7f\x3c\xc4\x43\x5e\x1e\x28\x04\x35\x2c\xeb\x12\x82\xc9\xcd\x26\x46\x42\x62\x56\x48\x4c\x3d\x73\x9e\xb9\x18\xcf\xd2\x81\xb1\x28\x77\x66\xb5\xc9\x27\xca\x29\x83\x18\x79\x37\x3a\x3f\x71\x9e\xb9\x8c\x0a\x6f\x80\xf2\x0d\x18\xdc\x08\x04\x84\x97\x38\x21\x0d\x79\x8a\xbf\xb9\xb0\x82\xdf\x7a\x0c\xef\x9e\x99\xaf\x5f\xb9\xea\xab\x25\xb1\xce\xc5\x8f\x37\x4d\xae\xef\xb7\x1c\xe6\xa0\xfa\x3c\x81\x2e\x2f\x00\xa9\x4b\x0a\xb0\x2f\x17\x83\x87\x1a\x4a\x72\xc6\x50\xe8\x60\xc9\x41\x51\xe2\x8a\x94\x0d\xf1\x85\xb2\xbd\x38\xc4\x53\x65\x8d\xaa\x76\x4a\x08\xe7\x18\xf5\x35\xd2\xca\x4d\xce\x33\x41\x73\x57\x10\x60\xdc\xe4\x8c\x84\xa6\x32\x73\x41\x8f\x56\xbb\xd6\x76\xa2\x6d\xa2\x4b\x7e\x73\xb5\x1b\x57\x3b\xe8\x37\xcf\xb9\x8a\x1b\x9f\xe7\x52\x03\x7a\xf7\x70\x07\xbe\x44\xa5\x8b\x17\xef\xfc\xe3\xdd\x66\x42\x79\x9c\x7e\xe6\x60\x2a\x4a\x3f\x3c\x97\xb2\x27\xb5\x3b\x73\x97\xb8\x9c\x90\x32\xad\x32\xde\x59\xea\xbb\xac\x3d\x0a\x10\x99\x9d\x22\xd4\x18\x0c\x7d\x1d\x2a\x54\x2b\xaf\x4f\x4f\x11\x30\xfe\xe8\x11\xcc\x91\x2d\x7a\x81\x05\xe0\xfe\x78\x84\x1a\x0d\x00\x3e\xef\x31\x7f\x9e\xac\x6f\x7f\x41\xd6\xff\x0c\xee\xb6\x05\xcc\xc1\xf8\xb9\x01\x7d\x5e\xfa\x29\x11\x67\xe7\x62\x34\xf7\x09\x77\xe7\xc6\x25\x22\x23\xa8\x48\x5d\x46\x1b\x43\xfd\x90\xd6\x3d\x1f\xe4\x4e\x11\x62\x2d\x42\x8b\x90\xab\xa8\xc7\xd3\x8d\xa4\x07\x1e\x24\x9d\xa6\x8b\xa4\xdb\x84\x85\x39\xa1\x2f\xfc\x1b\xf9\xad\x1f\x79\x2b\xe6\xa5\x24\xec\xed\xc3\xab\xd9\xb1\x75\x45\x0e\xba\xcf\x23\xa8\x0b\x3f\x3e\xe3\x9b\x26\x99\x9b\xb3\xaa\x8f\xdd\x40\x34\xa5\x39\x67\xd0\x0f\x3b\xbd\xa8\x50\xf8\xc6\x0b\xed\xbc\xf5\x12\xa4\x27\xa0\xfd\x60\x7c\x2b\x59\x5e\x15\x24\xa8\x2d\x9c\xe9\x78\x2f\xb6\xe8\x59\x6f\xff\xee\xd7\xf4\xb6\xfd\x92\x15\x64\x93\xc3\x22\x1e\xfe\xa8\x92\x28\x2f\x3d\xde\xb8\xcf\xc2\x2d\x5a\xdb\xe6\xee\x67\x6e\x41\xba\x69\x7d\x86\x15\xa3\x39\xe7\xc5\x7c\xd8\xa2\x45\x26\x04\x7d\xe7\x1b\xc5\xfd\xe0\xab\x61\x00\x7c\xd4\x03\xa7\x85\x2d\x71\x17\xe2\x9c\x22\xe0\x8f\xff\xc5\x75\x95\x7f\x0b\xf6\x2f\x75\x8b\xc8\x05\xc3\x72\x45\x0a\xa8\x00\x3f\x1c\x0e\x40\x1c\x0e\x00\x3b\x1f\x39\x80\x5d\x31\x1d\xf1\xd0\x80\xa8\xad\xa4\x6b\x42\x55\xa5\xb6\x56\x5f\xab\x2a\xd9\xdc\x83\xd6\x97\x31\x1b\x73\xdf\xfb\x01\x59\x34\x15\xca\xe9\x5a\x85\x7c\xcf\xb2\xa6\x75\x92\x3e\x77\x2d\x44\x3f\x06\x3a\xaf\xed\xfb\x1f\xd7\xf6\x8d\xbb\x2b\x84\x3b\xf8\x70\xff\x76\x2f\x33\xdf\x57\x9f\xf3\x1c\xa0\xa7\x68\x27\x9e\xa2\x33\x5c\x46\xed\x7a\x29\x9b\x5a\x03\x4d\x1a\x13\x63\xe6\x09\xb4\xdc\xb7\xdc\xf7\x4c\x2d\x9f\xc3\x9e\x48\x52\xee\xe0\x73\xcc\x21\x7a\xf3\xc2\x93\xb5\x62\xcb\x06\xbc\x80\xbb\xe5\xfa\x74\xf7\x20\xe2\x8e\xe3\x9c\xb9\x6e\x44\x08\xf1\xd3\x05\x41\x13\xda\x73\x9a\x99\xc2\x23\xe0\x10\xaa\xb2\x74\xa3\x02\xc6\x84\x04\xd1\x8c\x20\x48\x97\x75\xc3\x9e\xf1\x8a\x5f\xc6\xff\xc5\x46\xf8\x7a\x42\xbe\xde\xae\x62\x0b\xa6\xac\x70\x8b\xd1\xf2\x99\xb1\x80\x1f\x10\x8c\x93\xc8\x9d\x53\x37\x26\xc2\x1f\x98\x0d\xdb\x13\xf1\xe2\x0a\x39\xcc\xc3\x94\x5c\x5c\xd8\xe8\x08\xd4\x62\xcc\x35\x92\x65\x2e\x23\x00\x45\xdb\x04\x5d\xd6\xc7\x9f\x9a\x8f\xbf\xb0\x40\x4c\x99\x83\xfe\x73\x17\x02\x2d\x43\x42\xcf\x8d\x8b\x8b\x79\x4c\x90\x3b\x0f\xae\x8f\xfb\x89\x6a\x4e\x0a\x2e\xa0\xef\xd6\x15\x82\xe0\x65\x89\x3c\xcb\x33\xea\x45\x9e\xb0\x44\x50\xb4\x0d\xf8\xa6\xea\xcf\xd0\xcf\x87\x6f\xeb\x47\xc4\x51\x5e\x38\x94\xc7\xc5\x67\xc8\x37\xe5\xe7\xc1\x05\x73\x32\x77\x9f\x8f\xee\x90\x54\xde\x12\xa5\x55\x61\x0d\xf4\x7c\x3b\x61\x08\x09\xb3\xcc\x0b\x6d\xbd\xf5\xea\x34\x2d\xea\x31\xbe\xbe\x88\x83\xa3\x08\x44\xe3\x13\xd9\x95\x71\x13\xe5\x2b\xaa\xfd\xf7\xfb\x97\x50\xe9\xea\x04\xfd\xee\xcd\x3d\x38\x82\x32\x73\x59\xac\x52\xe3\x88\x2d\x2a\x8a\x70\xea\x0b\xe5\x4b\x01\x9c\x7a\x8a\xe2\xac\xca\x28\xf6\xf8\x94\x55\x99\x02\xa9\x27\xca\x71\x80\xa2\x38\x52\x40\x5e\x38\x6f\x9e\x59\x13\x9f\x01\xff\x7f\x97\xdc\xdf\x40\xd9\x5d\xf0\xda\xee\xaf\x87\xd3\xb1\xa2\x0c\xb0\xb3\xc1\x70\x53\xfa\xaa\x9a\xa8\xef\xbb\xd9\x1c\x7c\xc7\xa7\xda\xab\x38\x63\x70\xae\xe3\x0a\x97\x55\x81\x41\x64\xce\x52\x10\x8b\xe4\x8e\x33\x27\x9c\xc6\xae\xa6\x4e\x83\xec\xd4\x28\x5b\x39\xce\x5d\xdd\xe7\x4d\xed\x1a\x2e\x99\x14\x01\x7f\x0c\x3d\x91\xcd\xb0\x83\x61\x0c\x7e\x8a\x22\xf0\xf6\x92\x25\xbf\xfb\x02\xc3\xe3\xc5\x0a\x09\x91\x8b\x66\xb2\x43\x52\x9f\x4f\xb1\xe8\x04\xcf\x8b\x12\xe7\xd0\x56\xb6\x02\xb0\xda\xe4\x8d\xcf\x3c\x12\x40\x82\x31\xee\xe7\x09\xe8\x69\x9a\xdd\x6c\x38\x4f\x5d\x4a\x41\x7b\x6e\x12\x3a\xd3\x84\x34\xcd\x05\x93\x9f\x6c\xba\x9d\x8a\xfe\xbb\x6b\x15\xd2\xe3\x2d\xe4\xf1\x97\xa1\xf6\xf5\xf3\xef\x3f\x3c\xbe\xff\x08\x3e\x3c\xec\xf6\x80\x98\x2c\xaf\x57\x58\xfd\x83\x87\xa0\x12\x1c\xd1\x42\x20\xf8\x14\x55\xc7\x0a\x58\x9f\x33\xe6\x00\x1d\x21\xde\xd1\x12\xe3\xc3\xc1\x0d\xee\x30\xf7\x9c\xa5\x36\x25\x40\xcf\x59\x7c\x9c\x9b\x78\x3a\x38\xd2\xfb\xe3\xa0\x42\x7f\x7a\x1c\xf1\x27\xb2\xe9\x77\x6a\xed\x87\x78\xc1\x60\xfe\x52\x19\x21\x25\x7e\x15\x69\x4d\xaf\x58\xd0\xd7\xa1\xe1\xd5\x51\x0a\x49\x41\x73\x78\xaa\xdd\x51\x02\x5a\x9f\x2a\xe0\x3c\x8a\x87\xd6\x09\xd7\x6c\xfb\xa6\x71\xad\x2f\x19\xcd\x4c\x0a\x41\xf9\x59\xc4\xf2\xd4\x9b\x13\xa0\x20\xf7\x69\x6c\xdb\xb3\x96\x56\xd7\x32\x02\xd1\x21\xcc\x49\xb2\xe2\xb7\x64\x5f\x4f\xc7\x76\x23\x55\x23\x6c\xe1\x24\x85\x99\x47\x74\x1e\x15\x38\x11\x5f\xc7\x64\x1e\x0f\xa9\xcb\x2c\x40\x9e\x34\xce\x2e\x33\x7c\x99\xe3\x55\x5c\xec\xf1\x4e\x85\x8e\xc8\x77\xfb\xdb\x08\xf2\xc3\xdd\xc3\xff\x1f\xec\xdf\x47\x31\xb2\x78\xd3\x9e\x61\xa0\xa5\x59\x56\xb9\x53\x84\x19\x50\xec\x14\xb4\xb6\xb6\xb5\x75\x49\xda\x73\x26\x40\x7e\xdd\x4b\xd9\x5f\xb2\x97\x1e\x35\xcd\x85\xeb\xa7\xb0\x97\x8e\xe1\xcf\xb2\x97\x46\xf9\xba\x97\x62\xf8\xad\xbd\x14\x44\x6d\xcc\xe3\xe3\x0e\x85\xee\xca\x15\x5f\xe3\x25\x90\xfa\x66\x99\x1a\xf1\xb1\xad\x84\xc4\x30\x23\x88\x36\xad\x3f\xb9\x1d\xd2\x4f\x51\x63\x28\x4d\x6d\x5e\xaa\x1a\x64\xe7\x3a\x19\x82\x0e\xe8\x13\x4e\xb2\x9d\x58\xd1\xa3\xaf\xbe\xc9\xdd\xfd\xdf\x82\x9b\x36\xf4\x38\x79\xff\xf1\xbb\xbb\x07\x0b\xf2\x02\x3a\x54\x76\xbe\x05\x30\x15\x16\xe2\x9c\x42\x98\xc1\x2a\x3b\x4a\x29\xab\xad\x90\x1c\x2a\xe3\xfc\x70\xee\xfd\x29\x77\x39\xe9\xe2\x6c\x36\xbe\xd2\x15\x38\xc6\x3a\x02\x51\x0d\x74\x7c\xda\xe1\x5f\x91\xfb\xd4\x55\x5c\x50\x9c\x31\x82\xda\x83\x1f\xdd\x0e\x1b\x5f\x77\x95\x14\xb9\x2d\x98\xe9\x01\xff\xdc\x6f\xba\x15\x2f\x0c\xd4\xe1\xfc\x5e\x99\xaf\x1f\x9f\x39\x50\x2e\xf5\x45\xa1\x40\x64\x77\x1b\x64\xfe\xf8\x21\xa4\x40\xfe\x70\xa5\xcb\xbf\x32\x19\xfe\xf4\x7e\xc3\x28\xa9\x70\x59\x73\x00\x7d\x9a\x97\x04\x36\x4e\x48\xc9\x7a\xd5\xb3\xbc\xc8\xa4\x44\xbc\xe0\xac\x2c\x47\x3f\x60\x40\xc7\xac\x7d\x8a\x28\x88\x0e\x79\x76\x68\x30\x80\xda\x73\x50\x42\xb4\x53\x4c\x72\x01\x9d\xcd\x0b\x22\x88\x50\x18\xfa\xa3\xd0\x06\xe0\x2c\xc5\xb4\xeb\x72\x5b\x68\xd5\x71\x2d\xfa\xb2\xa8\x84\x61\x36\xcf\x65\x69\x30\xb3\x08\x45\x60\x93\x47\x72\x5f\xed\x78\x78\x97\x2b\xf1\xe2\xe5\x3d\x7e\xff\x16\xec\xdf\xdf\xbe\xc4\x1f\x56\xc1\x5f\x61\xb9\x7f\x0a\x0e\x64\x30\xe5\x77\xba\x42\xb8\xf3\xae\x2c\x09\xe4\x54\x0a\x93\x02\x2c\x1b\xad\x4b\x56\x30\x82\x50\x5a\x8d\x04\xa4\x4d\x96\x99\x03\x19\x4d\x9e\x4b\x2a\x2a\xe3\x0f\x43\x81\x2d\x29\x25\xd9\x71\x68\x84\x41\x25\xe5\x44\x2a\x43\x53\xdf\xe9\x89\xb6\x6d\x61\x4b\x2e\x4a\x58\x33\x23\x5a\x5a\x34\x4c\x8b\xaa\xc8\x79\xa9\x89\x35\x5a\x42\xe3\x4c\x04\x62\x1d\xb1\xbd\xdc\xe9\xd0\x61\x71\x83\xa5\xff\x9a\x2b\xf9\x8b\xc1\xf8\xf1\xa7\x6f\x0c\x46\xa4\xa8\xe1\xa8\x41\x1c\xc8\xb9\x43\xb2\xb4\x5a\xdb\xe1\xd8\x2b\x57\x2b\x4d\x74\x69\x04\x84\x27\x5f\x11\xa0\x41\x9e\x66\x47\x3f\x52\x40\xc6\xa2\xec\x3a\x0e\xd2\xce\x97\x40\x61\xb6\x53\xc6\x99\x0a\x69\x69\x90\xb2\xcc\x89\x5a\x56\xbd\x6e\x4c\x76\x3c\xe5\xae\xa8\xab\x41\x1b\x7d\x22\xb8\xe7\x46\xb4\xa8\x54\x58\x53\x65\x84\x58\xe6\x54\x16\xbb\x7d\xb5\xd3\x5f\xcd\xa9\x7f\x0b\xde\xbe\xbc\xc4\xed\x94\xfa\x4f\x60\x7d\x8d\x87\xeb\x6b\x5c\x22\xda\x3f\xbd\xdf\x60\x82\x8e\xb0\xa8\x08\x28\x7c\x9e\xa5\x10\x55\x86\x1b\x5d\x55\x5a\xd5\xa9\x94\x25\x2e\x28\x5a\x66\x54\x87\x01\x05\x51\x9a\x1e\xfc\x44\x40\x3e\x66\x59\xed\x8f\x08\xe4\x95\xa7\xc7\xa2\xd8\x69\xcc\x28\x29\xa5\x4e\x53\xa8\x52\xc4\x24\x41\x5c\x69\xad\x8a\xc2\x98\xd4\xa4\x98\xe4\x9a\x68\x6c\x91\xa4\x0a\xcb\x3c\x63\x48\x41\xac\xcb\x22\xec\x6d\x1b\x16\xc9\x7d\xf3\x6a\x4e\xbd\x4c\xa9\x1f\xde\xbd\x9a\x53\x81\x80\x74\x99\x4b\x1f\x7e\x61\x4e\x55\x0e\xe2\xd6\x37\x04\x97\x8c\x48\x66\xd2\xca\x88\x4a\xab\x92\x16\x0c\x43\x58\x75\x64\x6c\xd3\xcc\xb4\x74\x50\x59\x26\x28\xb7\xda\x4f\x7d\x81\x2c\x2e\x04\x5e\x27\x14\xbf\xce\xa7\xda\xe9\x91\xb6\x4d\x61\x4b\x21\x71\x4d\x0d\xef\x20\x4c\xeb\x65\x3e\xe5\xc5\xab\xf9\xb4\x8d\x75\xd4\xee\x79\xa8\x7d\xff\xbb\x0b\x47\xd3\xab\x79\xf5\x52\x95\xff\xd3\x7b\xf0\x21\x30\x4c\x05\x50\xc8\x0b\x1e\xc4\xfd\xdb\xef\xff\x19\x84\xd4\x4b\x72\xc2\x70\xc0\xa8\x86\x08\x08\x4f\x01\xff\xdc\x01\xec\x25\x80\x05\x04\xbd\xf5\x87\x24\xeb\x09\xb6\x85\x91\x2a\xab\x62\x52\x56\x17\xd0\x42\xcd\xa5\x10\x90\x11\xeb\xce\x30\x39\x38\x4b\xb0\xa7\xce\xcd\x03\xc7\xa8\x9b\x0c\xd3\xce\x95\xdd\x4c\x6d\xb4\x5b\x39\xb1\x62\x74\xc9\xd7\xfd\x87\xe8\x3f\xaf\xcc\xf5\x1f\x56\x4f\xe2\xf7\x9f\xae\xfc\xa9\x5f\xd0\x5e\x7d\xba\xfe\xc6\x6d\xd9\xc9\xed\x2f\xac\x8c\x58\xbe\xc3\x38\xcb\x24\xc7\x3a\x5b\x9c\x84\x5b\x62\xac\x63\xe0\xc4\xf2\xb5\x60\x59\x26\x19\xfe\x8a\x19\x0b\x0c\x9c\x7b\x27\xd3\x3c\x43\x52\x23\x58\xc2\xcc\x64\x5a\x29\x15\xe8\xb1\x2a\x9d\x66\xeb\x0f\x18\xcc\x4c\x6a\x94\x5c\xf1\x1c\xb6\x91\x0a\xbc\x02\xe6\x56\xef\x6f\xee\x5f\xa2\x31\xcf\xaa\xff\xc3\xa7\x90\xd5\x5a\x54\x1c\xc0\x38\x83\xd1\xf6\x4f\xe0\xed\xf7\x8f\x6b\x7b\xa6\x02\x47\x6a\x18\x04\x0d\x29\x5d\x5e\x82\xd3\xac\xc0\xe9\x8f\x47\x30\xa6\xb3\xdb\x64\x7e\xf0\xe5\x66\xf2\x15\x26\xbe\xc5\x4f\x11\x6b\x91\x3f\x26\x06\x02\xf8\x39\xdf\x4c\x9f\xf3\xed\xc0\x29\xe5\x94\x23\x8c\x34\x9f\x79\x5c\xa5\x8c\x73\xee\x2d\x82\x88\x5a\x2c\x4a\x0c\x0b\xea\x39\x09\xe7\x97\x78\x62\xf1\xb8\x99\xd6\xec\xc9\x6e\xff\xc3\x5d\xf6\xc5\x5e\xf9\xf1\xd3\x4f\xff\x13\xb8\xa1\x63\x8f\x99\x21\x92\x0b\x43\x4c\x61\x44\x89\x52\x53\xd1\xc1\xa6\x59\x6e\x39\x53\x06\x0b\xc5\x30\xdd\x4c\x44\xc9\xc1\x37\xde\xf6\xb9\x2d\xba\x06\xa2\x86\x3b\x79\x20\x90\x29\xa4\x88\xe2\x9c\x10\xc6\x02\xef\x27\xde\xab\xcd\x14\xb2\x04\xff\xe3\x85\x45\xec\xb5\xa2\x2e\xe1\xac\x6f\xcc\xd3\xef\xf7\xef\x3f\x7e\xb8\x99\xa7\x1b\x84\x4a\x50\xd0\xd2\x95\x10\xa4\x5e\x03\x6c\xcf\x47\x0b\xa8\x57\xa0\x2c\x4a\xd0\x39\xdf\x25\x59\x83\x89\x3b\xb0\xba\x8b\x79\x69\xd6\x89\xba\x19\x99\x58\xcc\x3c\x6c\xdc\x19\x73\x9e\x74\xce\x10\xec\x99\x73\x3e\x13\x08\xdb\x5e\x29\xaa\x64\x61\xe7\x5a\x46\xd1\x66\x03\xa3\xe6\x79\x4d\xad\x3d\xb6\xd7\x25\x7e\x89\x43\x06\xec\x90\xc7\xd7\xd8\x21\x1b\xd8\x41\x6c\x43\x82\xa7\x2a\x61\xe3\xdb\x1c\x14\x33\x3d\xe6\xbe\x1d\x82\xa9\x79\xb9\xb6\x96\x31\x2c\xb5\x54\x50\x50\x6d\xce\x65\x32\x18\xcf\x2a\x8f\x2b\x4f\xaa\x28\xda\x26\xd7\xb8\xc9\xf6\x19\xa5\x36\x7a\x81\xd1\x7c\x05\xa3\xbf\x9a\xfd\xb7\x8c\xf3\x9b\x8a\x41\x03\x59\x5c\x36\x90\x01\xe8\x69\x09\x94\x9b\x4f\x0e\x64\x45\xe6\x65\x9c\x51\x6f\xe2\x74\x3e\x5d\xaf\x9d\x62\x82\x0a\x46\x91\x96\xb6\xf9\x4c\xb8\xdc\xf4\x8c\x59\x7b\x9e\x5a\x9f\xb6\x3e\xea\x56\xdc\x25\x15\xb5\x7b\xb1\x53\x37\xba\xb8\x19\xb9\x2b\x86\xca\x5a\x1b\x7b\x43\x7d\xdf\x31\x0c\x32\x02\x1b\x88\x01\x99\xbb\x12\x9c\x3e\x9f\x80\x28\xe7\x13\x80\x10\xe1\x5b\xea\xf6\x9d\x12\x52\x48\xc8\x89\xd5\x8b\x2e\xb4\x25\x78\x26\xa1\xb0\x8d\xba\x90\xef\x29\x43\xdd\x9c\x8c\xfe\xe1\xd5\xce\xf6\xf8\x75\xb6\xef\x9a\x51\x7e\xbc\x01\x9d\x5f\x4b\xfa\x1b\x5a\x76\xa4\x74\xcb\x39\x82\x81\xf2\x06\x0c\x9f\x3b\x70\x08\xf1\x41\x02\xd2\x12\x75\xa0\x4b\x5d\x80\x46\xb7\x00\x62\xdf\xd7\xd4\x13\x0a\x6a\xe4\xe9\x4e\x0a\xad\x24\x14\x74\xf1\x53\x6c\xf8\xc2\xd9\xe7\x0a\x13\x82\xad\x9f\xb8\x13\xa0\x3c\x19\xab\x4e\x51\x9c\xc8\x4b\x5f\xd6\x3f\x84\x7c\xee\xaf\xc9\xf9\x78\x91\xf3\xed\xfd\xab\xfc\xee\x66\xc2\x65\x83\x0a\x57\x94\x07\x2f\x42\xbc\xa4\x39\x67\xa0\x0e\x09\x39\x39\x15\xb0\x01\x36\x75\xa0\xf5\x46\x83\x14\xfb\xc1\x70\xaf\x19\x30\xa5\xd7\xbf\x28\xa4\xb9\xc8\x08\xfd\x49\x2f\x42\x06\xcc\x43\xfe\x84\x43\xfe\xec\x1f\xbe\x3e\x29\xfe\xa4\x3e\x2f\x82\xe6\x1c\x8e\x0c\x3a\xb8\x2c\xc0\x28\x34\x31\xe5\x9f\x61\x9c\x07\x4c\xa1\x14\xa0\x92\x4c\x71\x94\xba\x34\x86\xbe\xac\x00\x41\xde\x34\x64\x3e\x32\x30\x21\x9f\xff\xaa\x42\x47\xe6\x24\xa0\x7e\xb4\xab\xb0\x71\xa8\x3d\xad\xfe\x2c\x9d\x06\x59\xbf\x21\x6a\x8d\x8b\x03\x85\xb6\x84\x47\x0f\x2f\xbd\xb3\x0e\x4c\x21\x5b\x8f\x40\x5a\x94\x23\x38\x54\x29\x38\x79\x66\x96\x91\x6f\x6b\xea\x11\x03\x2d\xf4\xe4\x46\x50\x53\x5b\x5b\x9b\x55\x50\xf3\x3c\xf0\xd8\x9f\xac\xd5\xc7\xb0\x46\xec\xa5\x1e\x67\x1b\xfd\x5d\x74\x1f\x6a\x3b\xd7\xea\xb9\xb5\x2d\xe7\x19\x4c\x7d\xf5\xdb\xd7\x9f\xbd\x79\xee\x4c\x7d\x7b\x09\x83\x7f\x78\xd8\x16\xb4\xa8\x0a\x0a\xd2\xd1\xf8\x49\x1d\xf5\x53\x14\x77\x92\x35\x5c\x1c\xfd\xc1\x8d\xd4\x4f\x33\xd3\xc4\x10\x3d\x1d\xea\x69\x0a\xad\x33\x9e\x80\xf6\xb0\x53\x75\x5d\x36\xd5\xdc\xfa\xfa\x20\xbb\x93\x1d\x26\x34\x34\xf6\xa4\xaa\x26\xa9\xac\x63\x95\x39\xd7\x5d\x67\x7a\xeb\x2d\x90\xb6\x8f\x02\xde\x05\xde\xdb\x9d\x89\xfe\x10\xfd\xc7\x08\x5f\x6a\xd9\x68\xa8\x20\xba\x56\x08\x5d\x25\xbb\x89\x2d\x86\x92\xa2\xbb\x2b\x25\xeb\xfd\xdb\xe7\xca\xf8\x37\x1f\x2e\x9d\x8e\x6f\x1f\x3f\xec\x6f\x51\xb2\x2f\xf7\x6d\x0f\x33\xa0\xbd\x05\x90\x10\x7f\x00\x94\xf3\x02\x16\xa4\x40\x9d\x6d\x2d\x20\x7e\x00\xa5\xb7\x56\x1b\xd0\x67\x05\x0f\x58\x8b\x03\x68\x9d\x73\xbe\x68\x5b\x40\xba\x80\x61\x42\xba\x9d\xc1\xc4\xf0\x41\x0d\x7c\xe6\x94\x65\x26\x23\xe8\x78\xf4\xa7\x84\x70\xc5\x87\x79\xf4\x92\x82\x0a\x4c\xf1\x04\x4b\xdf\x71\xdf\x73\xa5\x38\x1f\x38\x9f\xc7\xe5\x14\x6f\xc5\x62\xb7\x6e\x42\x1f\xab\xdb\xe9\x0b\x6e\xf6\xef\xaf\xde\xec\x7e\x65\x0a\x79\xfb\x35\xf9\xd3\xa7\x87\xbb\xfd\x95\x0f\xef\x42\x96\xb4\xb1\xae\x88\xd5\x4c\x48\xdc\xf8\x3c\x2f\x63\xc4\x8c\xea\x58\xd7\xb6\x27\xdc\x3b\x41\x30\x15\x2d\xd7\xa5\xa8\xcc\x33\x54\x14\xb1\x86\xec\x74\x29\x8c\x9a\x2b\x8a\x75\xaf\x10\x74\x50\x0a\x54\x15\x98\x6b\x86\x55\x3d\x81\x63\x29\x1a\x6f\x85\x6f\x84\x8f\x2c\x67\x2e\xc4\x5d\xe9\xbe\xda\x95\xd1\x5d\xf4\x43\xf4\xdb\x17\x94\xf2\xb7\xf1\x2b\x21\x1f\x1e\x17\x99\xf6\x97\x86\xc6\x8b\xa9\xf4\xe9\xdb\xa6\x54\xd2\x25\x42\x54\xd5\x40\xa7\xb6\x3b\xd1\xa9\xea\x24\x1a\x58\x63\xd8\x58\xe6\x32\x47\xbe\x02\x2a\x90\x40\xf5\xd0\x09\x54\x65\xb9\xb7\xbe\x28\x4e\x83\x37\x6e\x1c\x81\x1a\x76\xa5\xf6\x47\xc7\x91\x23\xda\x60\x8d\x45\x73\xea\x8c\xe9\x0a\x42\x4b\x86\x67\xec\x9c\x27\x6d\x41\xa1\x6d\x10\x46\x2c\xad\xb2\xde\xd4\x75\x1d\x45\xbb\xa4\x0a\xf1\xc3\x5b\xfc\xd7\x0b\xc6\xd3\xa7\xc7\xbb\x87\x1f\x2f\x77\xf0\x4c\x27\x7a\x63\x95\xdc\xbf\x79\x48\x46\x60\xbd\xb4\x52\x02\x02\x9c\x17\x56\xa9\xb9\x4d\xca\xf3\xc0\x93\xe3\xec\x50\x4c\x64\xc3\x18\x54\x8c\xe1\x59\xb1\xc3\x8e\xce\x47\x03\x22\x13\xbe\xfa\xd4\x4a\xeb\x3c\x6f\x0b\x57\x8a\x03\x28\xa3\x95\xc7\x5f\xec\xe5\xf3\x59\x76\xe1\x40\x0c\x3d\xbb\xef\x3f\xfd\x70\x61\x3f\xfc\xf1\xee\xfe\xc7\x4b\x2b\x6f\x22\x81\xb5\x8b\x00\x66\xb1\x0e\x88\xcd\x72\x2f\x7d\x59\x80\x83\x97\x49\xf1\x14\xd9\xa7\x68\xe5\x78\x9c\x23\x4f\xf3\x6c\x40\x93\x3f\x22\x4a\x08\x72\x8b\xc9\x7c\x1d\xfe\xeb\x99\x6e\x77\x2a\xfa\x3e\xba\xbf\x60\xe8\x47\xe0\xf1\xee\x6b\x4a\x43\xf0\x4c\xbf\x7f\x77\xff\x36\x79\x4e\x9c\x3d\xdc\x3d\x3e\xd7\xb9\x6c\x9d\x53\x82\xd9\x9a\xd2\x35\xf3\xe1\xa8\xaf\x9d\xca\xab\x03\xb1\xa0\x20\x75\x5e\x80\xbe\x9a\x87\xea\x58\xaa\xb8\x9c\x87\xe5\xda\x29\x7f\x42\x58\x33\xdc\x12\x68\xcb\x03\x23\x0c\x64\x7e\xc4\xc8\x30\x42\x92\xec\x29\x32\x5e\x43\x82\xce\x86\xd2\x44\x31\xcf\xba\xf9\xd8\x2d\x32\x87\x1a\xae\x1d\x8c\xbe\x7f\x66\x07\x8c\xc0\xdd\xe3\x97\xb1\xb5\x00\xc4\x7c\xff\xf6\x7e\x59\xeb\x6f\x2e\xc5\x76\xfb\xc8\x08\x4e\x45\x61\x08\x9e\x73\x2b\xc1\x50\xfb\x0c\x10\xdf\xf6\x7d\x20\xe1\xd4\xe3\xb8\x83\x33\x3f\x4b\x16\x96\x71\x3c\x9d\xf1\x86\x84\xcc\x68\xde\xfa\x6a\x9c\xc7\xe5\x57\xd6\x1a\xe0\xb5\xdf\x5a\x44\xbf\x7d\xc6\xba\x8f\xc0\xbb\xed\xfe\x0b\x32\xa1\xb7\x59\xbc\x7f\xff\xf1\xbb\xdf\x80\xdf\x25\x9f\x76\xfb\xb7\xb7\x76\xc8\x1e\x51\x5f\x67\x40\x79\x9d\x02\x6c\x3d\xb2\x20\x4f\x7d\x45\xa8\xc2\x38\x46\x38\x6b\xfa\xc3\x15\x69\x6e\xb9\x76\x42\xc3\xc1\x34\x9f\x2b\x29\x37\xbc\xc1\x73\xe3\x61\x2b\x34\xe8\x63\x0c\xc6\xc2\x37\x87\x3c\x6d\xe6\xba\xf2\xa8\xf6\xa8\x0a\xf2\xc9\x4b\x6f\xe9\xbf\x8e\xbe\xbf\xb0\x23\x44\x60\xf5\x86\xef\x42\xb2\xfa\xe3\xa7\x50\xf7\xbd\x03\xcf\xe8\xb9\x6b\x71\xea\xfb\x4f\xa1\xd7\x34\xf0\xe9\xed\xef\x3f\x24\xc3\x18\x00\x06\x6a\x79\x8e\x4e\x79\xd6\x01\x04\x98\x3f\x64\xde\x26\xca\xf7\x6b\xa9\x92\xe7\x95\x67\x98\x20\x30\x78\x5e\xc5\x68\xee\x53\x04\xe0\xf6\x48\x48\x29\xfc\xd1\x39\x8c\xb5\x26\xbe\xf3\x5c\xda\xca\x76\x9d\x6a\xad\xb4\x7a\x3e\x56\xd5\xca\x45\x26\xff\x45\x6b\xb0\x5b\x3e\xde\x6a\x0d\x18\xa8\x3d\x33\xc6\xcc\x4d\x82\xcf\x9d\xdc\x14\xb3\x46\x31\x57\x2d\xe5\x50\x71\x86\x67\xc1\xa6\x3f\xb5\x06\x37\x09\x09\x67\xba\xbe\xf0\x49\xfc\xe1\xba\x07\xef\xbe\xdc\x84\xb7\xb7\x9b\xf0\xee\xab\x5d\x98\xba\x22\x6e\xe7\x34\x87\xf1\x34\x1f\x8b\x22\x16\xdc\xe9\x81\x1d\x0e\xbd\x3f\xe1\xa1\xd6\x84\x30\xd1\x0b\x55\x14\xa2\x76\x57\xb6\xf9\x92\xd4\x6e\xdd\x88\x21\x79\xd9\x89\x91\x08\x3b\xb1\x54\x8c\xa8\x66\x8c\xa3\xa2\x94\x9d\x37\xeb\x56\x6c\x04\x73\xcb\xf9\xee\x9e\xd0\xbe\xda\xa2\x9b\x73\x23\x88\xbb\x7f\x2e\x1a\xde\xac\x61\x8d\x17\x61\x43\x44\xe4\x39\xf3\x14\xea\x68\x87\x0c\x27\x74\x3e\x90\xb8\x52\xae\x9f\x88\xef\x4f\x4f\x91\x6f\x09\x88\x7a\xc5\xb5\xec\xaa\xaa\x2c\x44\xcb\x1c\x4c\xe0\xf9\x19\xc8\x1a\x40\x2b\xe7\x51\x6f\xca\x82\xce\x27\xa6\x24\x85\x85\x85\x94\x97\xa6\x80\x98\x50\xc5\x1c\x38\x14\x85\xaa\xc6\x42\x18\xdf\x31\x3f\xb1\x79\xc0\x84\x06\x3d\xc3\x8b\x9e\x57\x96\x8b\x0f\xb7\xf9\x83\xbf\x48\xd1\x45\x95\xe5\xf1\x70\x9e\x72\x98\xe4\xf3\xb1\x28\x63\x79\xd1\xf4\xc1\x1f\xf1\x58\x1b\x4c\x18\x1f\xa8\x29\x21\xaf\xeb\x6b\x85\x1f\x22\x75\xb5\x68\x1a\x41\x83\xf0\xd7\xaa\x5e\x0e\xbd\xb6\x8f\x4b\x04\x65\xe7\xf5\xcd\xa9\x17\x05\x1c\x12\x1c\x78\xe4\xfe\xa5\x72\xe7\x2e\xcb\xe3\xd3\xb9\xc7\x79\x82\xe7\xbe\x28\x63\xcb\x6b\x3b\xb1\x71\x1c\xfc\x88\x8f\x8d\xa1\x54\xf0\x41\x5a\x4c\xf8\xa1\x59\x16\xd4\x72\x21\xd6\x54\x6c\xa7\x0b\x0c\x8d\xc8\xe7\x8a\xbc\x96\x5b\x18\x4e\x54\x3d\xc6\x25\x45\xe2\xe0\xad\x5c\xe4\x4e\x9f\xe5\xe6\xbf\xa6\xef\x55\xec\xed\xfe\xa7\xf7\x1f\x5e\x02\x79\xdf\x94\x3b\xe9\xaa\xac\x48\xc8\x99\xe7\x34\x71\xb3\xc1\xf1\x41\xb4\x15\x88\xd8\xe9\x74\xf2\x2d\x06\x59\x57\x51\x2e\xc5\x51\x3b\x42\xf9\x54\xc7\x7a\xd6\xcb\x85\x45\xd7\xb2\x55\xe1\x25\x9f\x2b\x6d\xba\xd5\xc8\x48\x65\x50\xb8\x11\x44\xd5\x43\x4c\x08\x12\xed\x32\xb7\x5b\x7e\x15\x7c\x17\x0f\x4f\x64\x2b\x6e\xf0\xf6\xdf\x46\x7f\xf7\xc2\x10\xf0\xcc\xcd\x76\x8b\x8b\x59\xc4\xc5\x3c\xba\x63\xf8\x53\x6a\xc6\xb5\x04\x9a\x63\x8b\xd8\xae\xfc\xf9\x98\xd8\xe3\x1c\xfe\xf3\x94\x8c\x4a\xea\xda\xb5\xb8\x73\xd1\x2e\xe6\x4f\x6c\xeb\xbe\xf9\x39\xb7\x8c\x3a\x3f\xbc\xb4\x45\xc4\x5d\x2c\x66\xe7\xd6\xd2\xe6\xcb\x45\x95\x52\xc2\x1c\x8d\xd4\xca\xec\xca\x9f\x4f\x89\x39\xce\xee\x38\xdb\x93\xa7\xaa\x56\x75\x45\xf1\xa4\xa4\x0e\xfd\x1a\xea\x89\x6c\xd4\x0d\x7f\x45\xf8\xbc\xaf\xd8\x8e\x6e\xde\xeb\x90\xd0\x73\x53\xdd\x16\xaa\x42\x6b\x6b\xdd\xc4\x65\x2b\x9d\x68\x77\xf0\xe7\x29\xbc\xdc\x69\x79\x39\x46\x26\xad\x4c\xed\x1a\x16\xca\x02\xa3\x5d\x9c\x3d\x91\x2d\xfe\x53\xef\x77\xab\xc7\x58\x2e\x23\xe7\x6e\x7b\x7d\x32\x2d\x8c\xb2\x60\x54\xc4\x11\xfe\x0d\x6d\x9a\xaa\x6a\x71\x57\x5d\xf9\xcd\xb7\xd1\x4e\x45\x79\x88\x13\xfc\xf4\x2a\xe7\x14\x52\x04\xa1\xf7\x72\x65\xaf\xb9\xa5\x4a\xa8\xc1\x61\xc5\x7f\xb5\x5e\xba\xe6\x24\x40\xd1\xf8\x0e\x68\x0f\xc7\xe3\x11\x98\xa3\xe8\x2b\x59\xb7\x21\xd7\x54\xcf\xc3\x79\x8a\xb9\x9f\x1a\xd3\x01\x14\x97\xf5\xdc\x06\xb8\x8e\xd4\x67\xb6\x33\x83\x5d\xf9\x12\x8b\x27\xb2\x35\x3b\xf5\x6c\x23\xdc\x48\xf1\xcc\x4b\xb2\x9c\xcf\x6f\x1e\x6e\x65\x89\x2d\x80\x6b\x4b\x51\xea\x4f\xad\x16\x42\x58\xdd\x8a\xc9\x2c\xff\x7f\x68\xb4\x06\x99\x5a\x64\xb0\xcd\x3c\xc0\x40\x32\xba\x2c\x50\x7f\xaa\x4c\x07\x70\x5c\x36\x73\xbd\xb6\x59\x44\x09\x68\x9e\xc8\x56\xed\xd4\xa5\x0b\x20\x02\xaf\x3e\xee\xc3\x8d\x34\x8b\x30\xd7\x86\xc9\x4d\x64\x5d\xcf\x47\x37\x82\xd2\xb7\x80\xd8\xd0\xa6\x07\xfd\xa9\x37\x42\x7b\x6a\x2d\x28\x1c\xa8\xe6\x3a\x26\xfe\xa8\xb5\x01\x45\x0c\x7b\xdb\xf7\xb6\x9f\x0f\x55\xe5\xba\x0b\x70\x55\xb6\x8c\x03\x70\x4f\x66\x27\x37\x69\xe8\xc4\x78\xc1\x1c\xba\x7f\xf1\xee\x82\x12\x96\xa7\xef\x7f\x78\x2c\x9e\x89\x92\x3e\x3c\x13\xce\x7f\x08\x36\x42\x12\x58\xce\xb7\x8b\x29\x75\x3c\x19\x90\x9b\xd3\x09\xa0\xa7\x48\xd7\x54\xf0\x74\x6e\xd1\x11\x64\x38\x35\x05\x82\xbe\xf6\x9d\x60\x98\xf5\xda\x0f\x00\x9e\x80\x06\xb9\x9f\x08\x18\x21\xf4\x87\x12\xe8\xc5\x92\x49\x2a\x21\x84\x90\x5a\x2a\x62\x30\x3b\x89\x22\x2b\x39\x34\x65\x01\x39\x80\xb8\x90\xcc\x4a\xad\xb5\xaf\x21\x42\x15\x0f\xef\x70\x0a\xdc\x05\x2a\xfa\x7d\xf4\x31\x78\x84\xaf\xbb\x69\x9e\xd9\xd9\x5f\xbf\xc2\xfb\x7f\xbc\x7d\x89\xfb\x97\x97\xd8\xbf\xbd\xff\x10\x1b\x90\x55\x80\x54\x41\x51\xdc\x37\x7a\x52\x92\xcd\x14\x4d\x40\xf2\xbc\x2a\x29\xf3\xc4\x8f\x19\xc1\x82\xf2\x83\xf3\x07\x20\xfc\x11\x34\xcb\x28\xd4\xb1\xa6\xc8\x5b\x52\xc6\xf9\xa5\x69\x71\xb4\x4d\x6d\x18\xf7\xb2\x2f\x73\xd4\x90\xa9\x80\x29\xa3\x31\xe3\x50\xcb\xa3\x1d\xc7\x71\xee\x05\x97\xd3\xe1\x10\x62\x9c\x72\xef\x62\xbe\x46\xec\x02\x9b\xc3\x17\xfd\x2e\x1f\x5e\xfd\x4d\x32\x57\x07\x6c\xc0\x40\xea\x06\xe7\x43\xdc\x9c\x0e\x71\x3d\x77\x31\xf6\x51\x1c\xcd\x6d\x4c\x62\x3e\xdb\x58\x22\x49\x25\x51\x44\x6b\xa2\x88\xa4\x32\xd8\x7e\xe2\x89\xec\xf9\xd7\x98\xcf\xf7\x97\x4a\x88\x80\xf9\xfc\x05\x5a\xe6\x9e\x57\xfe\x54\xf9\x63\x05\x9a\xca\xd3\xa0\x9a\x06\xa4\x17\x60\xc6\x06\xa4\xdb\xfc\xf3\xc1\x2c\x46\xbb\xd9\x40\xc0\x7d\xe5\xd5\xf1\x78\x9c\xcd\xf1\x78\x8c\xe2\x04\x3e\xa1\x7d\x1d\xf8\x25\x7e\xb3\x62\xfe\x25\x5f\xb3\xc6\x7f\xf7\xe6\x3e\x69\x12\x7b\x96\x7a\xc3\xe7\x63\xdb\x82\x12\x08\xc2\x4c\xad\xea\xac\xf0\xdc\x33\x72\x72\x9e\xef\x0a\xe7\xa1\x9b\x0f\x53\xc6\x0f\x0d\xf6\x9d\x37\x84\x51\x99\xd5\x80\x80\x43\x04\xe2\xe9\x89\x86\xb9\xb0\xe8\xf0\x5d\x9c\xdc\xff\x94\x7c\xfa\x2e\xe4\xa4\xee\x93\x5b\x6c\xe9\xfb\x37\x81\x52\xf9\xbb\x0d\xa9\x58\x15\xd7\xd6\x38\x37\x71\x84\x3c\x25\x60\x32\x07\x6d\x60\x6d\x04\x9d\x8f\xc2\x62\x2c\xa7\x9d\x2a\x7d\xef\x4f\x23\x60\xa5\x67\xc7\x0a\x53\xea\x4f\x73\x3f\xad\xd4\x08\xc0\x49\x4e\x14\x28\x02\xbe\x12\x0d\xf8\xb0\xdf\x2f\x9f\xbd\xd9\xde\x5d\x62\x23\xcf\xf6\xfd\x9e\x50\x5f\xf9\x32\x41\xfe\x64\x3d\xe7\x42\x73\x1a\x97\x3b\x6a\x48\xe1\xad\xf9\x7c\xda\xa4\xbe\xf0\xa2\x12\x16\xd4\x71\x09\xfa\x32\xe4\x3f\xa3\x27\x1e\x62\x33\x3f\xad\x08\xbb\x1f\x1e\x6e\x18\x37\xee\x57\xb6\xd6\xc7\x15\x2c\xea\x42\x88\xff\xb8\x63\xce\x9d\x90\x68\x49\xe6\x72\x8c\xfc\x34\x08\xef\xdc\xc1\x63\xd0\x55\x6b\x37\x10\x9e\x53\xe5\x45\x51\xe0\x0a\x1e\x10\xc4\x0c\xf4\xb1\xf6\x69\xec\x1c\x88\x9e\x22\x37\x8b\x4b\xcf\x02\xd9\x93\x5d\x7e\xc3\xa4\x72\x53\x09\x7f\xfd\xbb\x27\x6e\xb6\xee\x19\x4a\x76\xb9\x76\xf9\x1f\x61\xd3\xec\x0e\xbe\x04\xe4\x3c\x02\x72\x1e\x00\x8d\x22\x10\x77\x91\xdd\xe6\x3b\x1d\xfd\x76\x8d\x2e\xad\xa8\xcc\x81\xf0\xe9\x5d\xbc\x36\x0c\xc5\xc9\x62\x10\x6d\x6a\x52\xda\xac\x3d\xc0\xca\x2a\x53\x34\xca\xca\x86\xb3\xb2\xb0\x4d\xaf\x44\x5e\xc4\xa2\xee\x30\xa1\xa5\x9a\x80\x80\xb9\x01\x39\x38\x40\x4f\x4f\x59\xce\x05\xf4\x91\x3f\x94\x25\x23\x2b\x1f\x25\x79\xa2\x7b\xbd\x4b\xa3\x77\xe1\x13\xef\x5f\xe5\xba\x43\x0b\xe0\x5d\xc0\xfd\xfb\xf8\xe1\x3e\x21\x1b\xe4\x33\x70\x48\x75\x6f\xba\xac\x37\x84\xe4\xe7\xc6\x82\xcc\x93\x98\x00\x98\xfa\x7e\x97\x5a\xdf\x9c\x85\xef\x0a\x9d\x29\x50\x26\xd9\xac\x12\x79\xb6\xfd\xb0\x62\x6a\xd9\x7d\xb5\xcb\xd6\x5a\x85\xb7\x57\x06\xb3\xfb\x0f\x8f\xeb\xb0\x04\x4a\x4b\xb9\x86\x43\x3f\xab\xd6\x1d\x7d\xb9\xcb\xdc\x5c\xd9\xb9\x72\x2e\x99\xce\xf9\x96\xae\xb5\x91\xfc\x49\x84\x3c\xf7\x4f\x97\x1e\xf0\x8f\x2f\xb8\x54\x6f\x6f\xdc\xaf\xeb\xda\xbf\x9c\x0e\xbb\xfd\xfb\xe2\xcb\x65\xba\x1b\xc8\xe1\x29\x8a\xe9\xdc\x04\x1c\xc5\x65\x6f\xa0\x3f\x77\x31\x0b\x5e\x44\x01\xc6\x79\x8c\x8b\x6e\x80\xe0\xe8\xd7\x73\x63\x1d\xa4\xcb\xd3\x4e\x99\x22\xd3\x56\xcd\x58\x59\x65\xad\xb2\x2a\xee\x94\x55\x59\x6a\xcf\x47\x63\x8c\xe7\x2b\x91\xdb\x36\xe2\x4f\x74\x43\x77\xf2\x86\xc3\xed\x19\x53\xec\x59\xde\x1f\xdf\x6d\xdf\xff\xf8\x4a\xde\xed\xfb\x22\xf9\x12\x49\xfe\x40\xeb\x7e\x71\xd1\x42\x17\xa2\xf0\x0e\xd0\xec\x2c\x72\xd0\x86\x00\xb7\x03\x22\x40\x6c\xd6\x10\x54\x63\xdf\x03\xde\xcf\x43\xb8\xed\xa4\x29\x32\x69\xe5\x4c\xa5\xd5\x85\x65\x16\x1a\x2b\xe3\x46\x5a\x9e\xd9\x39\x5b\x0e\x08\x79\xc1\x1e\x05\x11\x0f\xb1\x00\x19\x2a\x35\x1e\x2f\xfc\x38\xdf\xff\x70\x5f\xac\x44\x79\xcb\x61\xf6\x10\x27\xef\xbf\x7b\xf3\xa0\x2a\x07\x28\x77\x40\x82\xc6\x64\x2e\xeb\xe6\xa3\x87\x07\x96\x0e\xb2\x49\xab\xcd\x11\x68\xaf\xed\xe7\x2e\x2f\x0a\x06\x0d\xa5\x64\x23\xcf\x34\xa0\xcd\x27\x7c\x1d\xc3\x53\x24\xf7\x74\xc7\x6e\xb8\xf9\x16\x7f\xff\x4f\x0c\xe1\xf6\x7d\xf1\x65\xc4\x71\xd7\x61\x2f\xc1\xe0\xcb\x90\x74\x71\x5e\x04\x16\xc1\x29\x74\xd9\x68\xa0\x43\xe3\xaf\x2b\x41\xeb\xc7\xd3\x09\x98\xd3\xac\xc3\x6d\xc7\x54\x21\x14\x9b\x1b\x66\x98\xb5\xcc\xb0\x98\x32\x25\x32\x33\x73\x29\xa5\x6f\x42\xe6\x6f\x1b\x93\x27\xb6\x8d\x7e\x61\xdc\x1e\xef\x56\xd6\xfc\x4f\x61\xdc\x02\x26\xdb\xdd\x63\x10\x72\xff\xf5\xb8\x6d\x2c\x11\x7a\xd9\xfa\x8f\xc7\x69\x9a\xb2\x59\x66\x20\x5f\x4c\xea\xc5\xb2\x38\x94\x20\x33\x52\x82\x48\x78\x17\x6e\x3b\x69\xf2\x5c\x69\x3d\x0b\x6d\x4c\x61\x98\x29\x2a\xa3\x63\xa7\xf5\x22\x5f\xe6\x5c\xa0\x54\x73\x6b\xfd\xa0\x0c\xfb\xf7\x5f\x61\x1d\x1c\x9e\xd7\xc1\xe0\xcb\x5f\x58\x07\x63\x09\x8e\xde\x04\x03\x76\x02\xe4\x7c\xb8\x3e\xed\x94\x2e\x72\xad\xcd\x4c\xb4\xd1\xc6\x68\xa3\xe3\xd6\xe8\x75\x1d\x58\x6b\x2f\xe2\x86\x75\xc0\x92\xc3\x5f\x65\x1d\x70\x62\x03\x65\xc2\x8b\xb7\x90\x9d\x9b\x1c\x28\xdf\x01\xec\x0f\x00\x86\xb5\x30\x42\x20\xba\xba\x06\xa8\xf6\x45\xb8\x85\x75\xa0\x94\x9e\xf9\x45\xb3\xa5\x33\x3a\xae\xb4\x12\xcb\x3a\x58\x44\xbd\x2c\xd9\x68\x1b\x99\x27\xbd\x57\xdb\xf2\xb5\xac\x9b\x3f\x67\x82\x7e\xa9\x5a\x8b\xfd\xe8\xab\xa4\x3c\x0f\x81\xd2\xa6\x9b\x71\x52\xfe\x31\x4b\xe0\x0c\xe3\xc3\xe2\xd2\x9d\x0f\x09\x9c\x2b\x18\x37\xf3\x09\x4c\x3e\x8f\x35\x18\x3f\x57\xd7\xa7\x6d\xa9\xb2\x94\x2b\x3e\x0f\x5c\x09\xa5\x84\xe2\x71\xc9\x15\x4b\xcd\x2c\x85\x10\xbe\x0f\xd1\xee\x65\x2e\x14\x4f\x6c\xab\x76\xf2\x8b\xb9\xf0\xa7\x74\xbb\xfb\xc6\x64\xdd\xe6\xd8\x36\xa1\xd3\x77\xb1\x55\x2e\xca\xed\x72\x20\x82\x62\x17\x9f\xe0\x00\xa0\xb6\x10\x88\x7a\x31\xde\x8d\x17\xe1\xb6\x93\xaa\xcc\xf4\xaa\x5c\x5b\xde\x28\x57\x66\xe9\x2b\xed\x6e\x93\xec\x49\xee\x4d\xa8\x75\xfc\xe5\x79\xf0\xe7\xe9\x76\x20\xcd\x61\x51\xd5\xe2\xe1\x80\xda\x33\x30\x7d\x36\xe0\x14\x76\xc1\x65\x03\x20\xa0\xf5\x0d\x04\xb5\x3f\x5c\xc8\xd4\xd2\x99\x5d\x9f\xbe\x3d\x6b\x65\xf6\x6a\xd2\x6e\x13\xf2\x24\xc3\x59\xf3\x97\xcb\xfa\xe5\x46\x75\x24\xf5\xca\x2b\xb1\xc8\xba\xec\xe1\xcb\x46\x35\x06\x39\x55\xe8\x2e\xaf\x7c\x07\x41\xe5\x87\x80\xf4\x3a\xab\x70\xfb\xb3\xa4\x5c\xc6\xbf\xba\xc8\xf9\x6b\xe3\xff\x67\xee\x05\x23\xe9\x8f\x8b\x89\x1c\x62\xa5\xcb\x3c\x84\x9f\xa3\x18\x85\x10\x37\x02\xfd\x7c\x8a\xd3\xf6\x00\xc1\xe8\xab\x30\x39\x0e\x00\x9d\x4f\xd7\xa7\x3f\x73\x2b\x88\x40\x24\x9f\xe4\x5e\xc7\xc7\xc5\xf6\x7c\xf7\xda\x56\x5f\xac\x8d\xaf\xac\x79\x19\x8b\xe5\x83\x83\x10\x51\x1c\x39\x10\x85\x3e\x53\x70\xf2\x69\xc8\x71\xab\xd3\x31\xe3\x86\x19\xa6\xd9\x9c\x26\x11\xd7\xcc\x30\xc3\x75\x74\xa9\x87\x70\x7b\xb7\xb1\x17\x5f\xe1\x1b\xff\xfa\x6b\x5f\x21\x1e\x1c\xc8\x56\xfe\x81\x65\x23\x2c\xe6\x31\xd6\xa7\x43\x2c\xe7\x29\xce\x97\x0d\x71\xd9\x0c\x37\xf6\xb3\xdb\x88\x2e\xd4\x3b\xd6\xf6\x72\xbb\xf8\xea\xc9\x6a\x53\xaf\x51\xcf\x57\xb8\x49\x77\x0f\xd7\xb1\xb8\x26\xd7\xee\xee\x3f\x3c\xdc\x3d\x6c\x3f\x3c\xbc\xbd\x2e\x43\xe1\xcc\xd1\x38\x17\xd0\xca\x17\xb5\xda\x90\x15\x1e\x41\xd1\xb9\x38\x3b\xb2\xc5\x61\x35\xdb\xa1\xaa\xaa\xca\xfa\xd1\xf9\xb2\xb2\xcb\xa6\x67\x2b\x30\x38\x50\x38\xe7\x66\x73\x38\x1c\x56\xfc\x84\xfa\x12\xa7\x42\xaf\x72\x7f\x17\xa4\xdc\x8b\xd7\x7a\xf1\x5c\x03\xd0\xd0\xc3\xdb\x2f\xba\x76\x1e\x3e\xac\xd0\xaa\x8f\xeb\x01\x77\xa5\xf0\x4f\xbe\xa0\x25\x48\x86\x83\xeb\xdc\x34\x35\x0d\x88\x3c\x03\x82\x10\xce\x30\x2d\x24\x2a\xe7\xc1\x31\x06\xb8\x17\xa3\xb5\x07\x20\x16\x27\xaf\xee\x7b\xc0\x0e\xc1\x32\x61\x87\xc3\x2e\x52\x4a\x6b\x23\x97\xbf\xf3\x41\x8b\x95\xbc\x2f\x64\x0a\x75\x0c\xc3\xb7\xa5\xf4\x4e\xce\x66\x99\x3e\x81\x49\x60\xc5\x3b\xe1\x3b\x13\x3a\xef\x7f\x1b\xfd\x63\xa8\x9b\x58\xc6\xf5\x8b\x84\xc5\xfd\x73\xc3\xf0\x0d\x37\xe9\x96\x57\x80\x0b\x89\x79\xa9\x31\x99\x47\x07\x68\x1b\x46\xb8\x98\x47\xc4\xb1\x41\x3c\x1e\x1c\xa6\x86\xed\x8c\xcf\x3f\xcb\xb5\xbf\x08\xa4\x3e\xda\x72\x6f\xa7\xb9\x19\x93\xca\x54\xa4\xb2\x18\xf6\x86\xba\x68\xbb\xc9\x02\xe7\xe1\xca\xa7\xb0\xc6\x67\xa2\x97\x4a\xf9\x5f\x60\x38\xdc\xc0\x24\x3d\x9f\x56\xd6\x63\xcb\x79\x50\x15\x9c\x27\xf7\x4c\xb8\xbd\x23\x3e\xb3\x07\x9f\x9d\x31\xe3\x85\xc9\x49\xed\xd5\x46\xfb\x43\xe5\xcb\x3a\x8a\xfe\x26\xe4\x4a\xaa\xe7\x18\xff\xfb\x80\xd8\x43\xa3\xff\x3b\xfa\x7f\x5e\x47\xa1\xde\x5c\x7d\x87\xd7\x60\x03\xf1\xfe\xd3\x4f\xef\x7f\xbc\x3c\xbe\x02\xf4\xb9\xfe\xde\x9b\x5b\x6a\xbf\xdb\x70\x60\xf5\x8c\x38\xb8\x5c\x1d\x85\xb2\x68\xfa\x42\x4b\x2e\x0a\x49\x34\xc2\x18\x96\x85\x36\xb5\xcd\x32\x60\x11\x2c\x0b\xa5\x2c\xc5\x59\x2e\x29\x52\x45\xdd\x95\x42\x70\x5e\x08\xac\x61\xc5\x90\x41\xcc\xe0\xd2\x16\xc8\x43\x83\xb1\xa5\x40\xa3\xc2\xe6\x70\x47\x67\x03\x02\x5b\xc3\x8c\x8d\xc5\x1c\x16\x42\x35\x65\xa6\x45\x5d\x1a\x9a\x66\x08\x97\xfe\xd4\x94\x65\x31\x66\x29\x21\xa5\x3f\xd6\x59\x51\x14\x44\x5b\xc2\x60\x21\x45\x55\xe4\xcb\x6f\xca\xb9\xb6\x35\xa9\x2c\xd2\x15\xae\x0c\xc4\x8d\x22\xd6\x28\x87\x9d\x5e\xeb\x5c\x0e\xc1\xbf\x96\xd1\x63\xf4\x5f\x23\x11\xfd\xbf\xeb\x8a\xf8\x7e\xff\x18\xdf\x3d\x7e\xf7\xe6\x86\x07\x7d\x2d\x70\x7c\xfc\xfd\xa7\x80\x26\x7b\x49\xc3\xde\xef\xd6\x98\xd3\xb3\x67\xf6\xe9\xa2\xdc\xdf\x3f\x2b\x77\xfb\x92\xb6\xbd\xfe\xec\x7f\x01\xcb\x8f\xde\x5f\x00\x78\x88\xb6\xe9\x89\x9b\x94\x56\x65\xc9\x19\x65\x5e\x16\x25\x46\x86\x71\x02\xcb\x4c\x17\x8e\x69\xd3\x92\x5e\xe1\xd2\x4f\x99\xd6\x72\xcc\x54\x72\x42\xb9\xca\x4c\x5d\x70\xd6\xe4\x0c\x6b\xc8\x10\x84\x50\x5b\xa3\xd3\x6c\x3e\xa0\x42\xa6\x99\x71\x25\x67\x55\xc1\x91\x41\x14\x96\x58\x49\x25\x73\xc7\x90\x81\x34\xc6\x1a\x63\x40\xe2\x69\x86\xbe\x2a\x0b\x4e\xb8\x91\x9c\x72\x5c\x09\x53\x15\xfe\xd8\x4b\x62\xa8\x30\xf5\xf4\x14\x49\x59\x01\x12\x4b\xeb\x0a\x89\x0a\xa9\xea\x42\xd9\x63\xd9\xeb\x4c\xe8\xd2\xbb\x0e\x16\x65\xa6\x5d\x89\x21\x2a\xa5\x6a\x0a\x6d\xa7\xf2\xa0\x52\x07\xfd\x50\x41\x34\x6b\xca\x29\x67\x51\xf4\xff\x0b\xb8\x1d\xf5\x37\x38\x46\x5e\x98\xc5\x9f\x99\x0c\xbe\xa6\xdb\xfe\xe5\xef\x27\x5d\x72\x38\x43\x18\x68\xf7\xc6\x11\x88\x71\x6e\xc3\xed\x7c\x4a\xfa\x33\x82\x89\x3a\x1b\x3b\x4d\x40\x4e\x73\x1d\x6e\xe7\x66\x53\x7c\x1e\x77\x44\x31\x1f\x01\xc8\x39\xf7\x23\x63\xcc\x8f\x7a\xf9\x7f\x14\x1e\x97\x6f\x0e\x6a\xe5\x2e\x45\x21\x76\x70\x45\x9a\x59\xf7\xcb\xff\xfa\x1c\xe5\xbc\x56\x49\xdc\xef\x43\xef\xec\x6d\x5e\xe2\xd3\xc3\x87\xfb\x8f\x9f\x2e\x85\x1d\x1f\xfe\x39\xfe\x42\xf2\xeb\xfd\xe3\xa7\xfb\xdd\x3e\x19\x81\x70\x40\x70\xee\x1d\x50\x3e\x2a\x62\x3e\x40\x5a\x19\xa6\xfb\xca\x77\x64\xb4\xda\xb2\x1e\x44\x79\x76\x02\xc6\x3b\xce\x5d\xe8\x9e\x9a\xfb\xf5\x56\x1f\x8f\xc0\x8c\x7e\xa4\xd0\x8f\x59\xb1\x2b\x18\x9b\xf4\xc8\xbc\xe5\xd6\x70\x84\x0d\xa1\xa2\x34\x19\x2e\x51\x6d\x21\x04\x92\x8d\x7a\x79\xbd\x9e\x31\x36\x2f\x2f\x3a\x6b\x2c\x10\x5c\xb9\x28\xf9\x36\xda\xe9\x80\x24\x78\x65\x42\x5d\x66\xe9\xed\x06\xba\x96\xe6\x27\x59\x6b\xeb\x5a\xe6\x98\x50\x41\x70\x8e\x09\x76\x48\xf2\x76\x5b\x2c\x0e\xa8\xf1\x1d\x75\x08\xce\x4a\xd2\xd4\xe5\x2c\xce\xa8\x85\x18\x84\xf3\x3d\xd9\x66\x4f\x55\xc0\x14\xfb\x9b\x0b\x6f\xfd\x73\x1d\xfd\xf6\x5d\x9c\x3c\x2e\x47\xee\x77\x49\x60\x5b\xda\x42\x10\x95\xd8\xe1\xa2\x9f\x6b\xd0\x38\xca\x86\x59\x00\xc8\x7b\x92\x99\x1c\x6f\xf3\xda\xc2\xba\x33\x14\xce\xdd\x62\x3e\x82\x29\x8e\x3c\xf7\xac\x04\x1d\x08\x1c\xd9\x9b\x3e\xea\x83\x0f\x74\x65\x75\xbd\x7f\x7b\xff\xf7\x20\x24\xf8\x03\x14\xe2\x87\x87\xcd\x74\x0c\xa8\x3e\xce\x49\xa1\xe9\x81\x81\xec\xb8\xe9\x40\xeb\x89\x2d\xf4\xc9\xb7\xf2\x74\xf4\x5d\xa7\x41\x01\xea\xe2\xca\x51\xe5\x92\xe3\xcd\xf9\xfd\x45\x7c\xf4\xee\x39\xb5\xfb\x62\x47\x05\x60\xa1\x8b\xf9\xe4\x00\x77\xf1\x10\xf8\x36\x3c\x0a\xdd\x96\xec\x5c\xdb\x73\x9b\x90\xd9\xc6\xd2\x13\x5f\x6d\x0e\x73\xd9\x04\x1e\x5d\x0e\x0e\x49\x13\x20\x04\x3b\xee\x5b\x66\x9d\xb3\x0c\x10\xde\x2d\x73\x53\x30\xc6\x22\x90\x0c\xa1\x9e\x20\x0d\xf1\xee\x10\x09\x7c\xd5\x65\x72\x53\xc6\x12\x58\x44\xef\xdf\xdc\x27\x43\xd2\x7a\x9d\x01\xcd\x19\x61\xa5\xc6\xe5\x31\x5d\xfc\x4b\xca\xb0\x90\x75\x31\x39\x60\x32\x4f\x77\xa9\xf5\xc7\xcf\x35\xe7\x85\x2b\x68\x52\x49\x56\x0f\xaa\xb5\xbd\xe5\x13\x30\x9f\xe5\xb6\x00\x59\x14\x25\x09\xba\xd4\x3a\xfd\x70\x41\x60\xb8\x45\x29\x89\xde\x5c\x2c\xb5\xbb\x2b\xd8\xe3\xf7\xfb\xc7\xbb\x7d\x29\xbc\xa4\x80\x49\xdf\x49\xeb\x6b\x01\x34\xf3\x92\x03\x66\x7d\xd3\xa6\x1d\xa0\xe9\x61\x8b\x66\x6b\xbd\x9e\xcc\x69\x71\xd8\x8f\x06\xa4\x80\xd9\x58\x2e\xfe\xc6\x6c\x31\x5a\x9c\x3a\x84\xc1\x18\xc6\xf6\x18\x62\x84\x2c\xca\xa2\x08\x7c\xf7\x26\xec\xb6\xdf\xbd\x09\xb1\xaf\x38\xd9\x1d\x25\xaa\xf2\x71\x2a\xbb\xca\xd4\xd6\x39\x48\xe2\x93\x97\xbe\x40\x3d\xcd\x4d\x5c\x27\x8a\x9c\xe9\x3c\x95\x08\x94\x20\xc4\x06\xb3\x27\xb1\xcd\x42\x8d\x43\x38\x23\x93\x97\x08\xd7\x9b\xfb\x37\xcb\x37\x30\x38\xf8\x43\x0e\x70\xa9\x15\xa3\xb9\x46\xac\xf0\x2d\x02\xa5\x3f\xec\xe0\x5c\xfb\x6e\x3e\x3c\x45\xb9\xcb\xe3\x34\x16\xa0\x8c\x40\x52\x3d\x91\x90\xbb\xfc\xbb\x10\xb7\x58\x26\xc5\x77\x60\x1f\x27\x77\x0f\x77\x71\x12\x94\x73\x1f\xfa\x7f\xf6\x11\x09\x39\xfd\x0a\x03\xa4\x27\x5a\xe9\x83\x00\x91\xf4\x35\xa8\x4c\x05\x41\xb5\xd3\x96\xfb\xce\x79\xe3\xb5\x02\x08\x94\xe7\x2a\x71\x5e\x3e\x45\x1a\x10\x50\x39\x50\x14\xb9\x43\x2b\x2e\x7f\x1a\xe9\x2d\xd9\xc9\xf0\x79\x5f\xc6\x04\x93\x4b\x4c\xf0\xd3\x4f\xef\x37\x13\x2a\x6d\x56\xf7\xb0\xd2\xca\x14\xb5\x70\xa2\x16\xb4\x28\x6d\xdd\xf5\x59\x1e\xd3\x66\x40\x82\x40\x3d\x01\x01\x0b\x0b\x72\xd0\x43\xcf\x9f\xa2\x2c\xe7\x02\xf9\xc8\x0f\x94\x92\x28\xda\x24\xed\x93\x09\xdc\x44\x37\xf1\xcc\xb0\x04\x5e\xc7\x33\x53\x71\x26\xbc\xba\xf2\x0b\x2e\xd7\x0e\xfd\x71\x72\x6e\x97\xcf\x27\x20\xcf\x66\xbd\xa2\xc0\x6d\xb0\xce\xa3\xbf\xbf\xd6\xe1\xac\xab\x28\xf4\xa3\xdc\x2a\xec\x3e\xe9\x80\x09\xcc\x56\x40\xf9\xc1\x8d\x6c\x70\xce\x9e\x04\xc8\x9c\x3f\x02\xe6\xd5\x96\x00\xe8\x0f\x76\xb1\x89\x79\x5f\x0f\xa0\x3a\x1f\x93\xd4\x3b\x3f\x2e\xcb\xd7\x58\x80\xa2\x38\x51\x01\xcb\x06\x46\xbf\x09\xd6\xfe\x43\x58\x98\x71\x72\x53\x47\x95\x84\xce\x1d\xf0\xf1\xcd\xc3\xfb\x37\xf7\xc9\xf7\xdf\x6d\x38\x8d\x5b\x0e\x72\xd4\xaa\xca\x58\xa1\x1a\x56\x4b\xc3\xcb\x56\x2b\x0e\x06\x05\x87\x92\xfb\x43\xd6\x6d\x2b\x6b\xbc\x9c\x27\x3f\x18\x69\x94\xb4\xd2\x4a\xb3\x38\xc8\xa9\xaf\xc5\x10\x43\x5f\x1d\x01\xd6\x01\xa7\x78\x3e\x85\xf1\x72\x97\x5c\xd5\xdf\x86\xd8\xfa\xa5\xdb\xe9\xbb\xcd\x64\x11\xb5\x10\x8a\x71\xa7\x0a\x7f\x1a\x7f\x1e\x92\x81\x11\x19\x88\xa5\xc1\x36\xbf\xc4\xaf\xff\xcd\x4b\xcd\xd0\x6b\x8e\xf6\xe5\xdf\xf8\xb4\x1d\xac\x95\xd0\x56\xb9\x28\x53\x9b\xc1\xb2\x93\x08\x63\xdc\xed\xd4\x6c\x84\x70\x4a\x9e\x27\x82\xaa\x72\x40\x10\x8b\x78\x2a\x0b\xad\x42\x3d\x94\xbe\x60\x7b\xfe\xab\xe8\x2e\xfc\xfb\xef\xf6\xdf\x6d\x2f\x78\xb1\xdb\x2b\x46\x7e\x0c\x96\x81\xd8\x32\x5b\x8e\x20\x65\xd3\xb1\x1e\x25\x40\x20\xc2\xb9\x2b\xb0\x3f\x25\x85\xf5\xa3\x04\x91\x9c\xed\x4e\x95\xcc\x1f\xea\xaa\x02\xd8\xf7\xad\x00\x79\xa7\x1d\x74\xda\x5b\xeb\xa5\x3f\x28\x90\x01\xf4\xec\x0b\x6d\xb3\x2f\x7c\xa1\x67\xec\xa3\x6f\xf9\x42\x1f\x1e\xc2\x5e\x7a\xf5\x85\x94\x01\xa9\x75\xae\x0f\x29\x40\xec\x3b\x1b\xc2\x3d\x03\x28\x7b\x15\xa7\xfe\xc4\xab\x0a\x40\xb7\x69\x38\xe7\xdc\x1c\x99\xe7\x5c\xfb\x09\xe4\x9a\x83\x8a\x1d\x17\xc7\x21\x6a\x9a\xe6\x8a\xbd\xca\xf7\x7c\x5b\x84\xea\x9d\x15\x21\xf1\xdd\xfe\x3e\xdb\xdf\x34\xcc\x2d\xd3\x23\xb9\x4c\xcf\x57\xe9\xcc\x4f\x0f\xe0\x15\xde\x91\x81\x71\x8b\x4a\x4d\x78\x21\x68\x59\x64\xb3\x41\x54\x36\x14\x2c\x0b\xca\x4f\x4e\x53\x2e\xac\x6a\xd8\x81\xf5\x31\x51\x10\x4b\xec\x31\xc3\x12\xb1\x6d\x51\xca\x33\x3e\xb8\xcc\x65\x4d\xc2\x18\x61\xd5\x7c\x04\xd2\x5b\x05\x85\x11\x92\x79\x05\x0e\x7e\x72\xa2\x3f\x81\xba\xd4\x1c\x0b\xc2\x24\x16\x3c\x8a\xd2\x4d\xf4\x44\xf6\x66\xc3\x5f\xe1\x4f\x7e\x8a\xfe\x53\x14\x81\x8b\x61\xb2\xd2\x9e\xdc\xbc\xcb\xdd\xf6\x82\xf4\xb6\x5c\xdb\x5f\x30\xe7\xf7\xd2\x0f\xa7\xd3\xe9\x04\x70\xc6\x55\x49\x0b\x51\x96\x65\x36\x4b\xc0\xfa\xe5\x0f\x70\x65\xc6\xb3\x12\xc1\x5c\x66\xd0\xf7\xaa\x44\x12\x81\xbc\x4c\x65\x56\x6c\xb8\x94\x52\x28\xe1\x71\x97\xeb\x8c\x01\x98\xa4\xa3\x94\x83\x10\xa3\x10\x15\x93\x85\xe4\x99\x54\x85\x16\x69\xd9\x5b\x5c\x39\xad\x0b\xab\xa2\x68\xb3\x29\x9e\xc8\xbe\xda\x54\xd1\x0f\xd7\xf9\x00\x9e\x6b\x8e\x6f\xeb\x31\xef\x93\x2f\x5b\x8b\xaf\xd8\x6e\x1b\x0a\x48\xaa\x53\x40\x7c\x95\xa6\x87\x16\x1e\x7a\xde\xf0\x23\xf2\x13\x4c\xb4\x21\x8a\xb3\x42\x0a\x38\x3b\xb2\x1c\xae\xa6\xeb\x36\x08\x22\x04\x75\x96\x43\xac\x18\x64\x48\x11\xe6\x7b\x3d\x9f\x38\xcd\x4d\x8e\xc1\x91\x79\x2b\x6d\xb4\x09\xb5\x5d\xea\xd6\x67\x7f\x85\xed\xf9\xad\x79\x7a\x7f\xf7\x6a\x9e\x26\xaa\xb5\x40\xda\xb6\x0d\x87\xda\xb2\x15\xba\x10\x78\xd6\x40\x3f\x45\x6d\xdc\x7a\xab\x43\xc6\xfd\xc6\x6f\x2f\xdc\xea\xb7\x3b\x30\x7e\xe1\xb7\x6f\x62\x13\x62\xf0\xbf\x24\xcf\xfd\xaf\xc8\x73\xe5\xea\xab\x27\x07\x0e\x6e\x9a\xfc\x21\xd8\x19\x8b\x1f\x1e\x52\x9d\x10\x1c\x7c\x3f\x25\xd4\x43\x77\x09\xd9\xe0\xed\xe8\x02\x4b\xdf\x60\x7d\x61\xdd\x22\x93\xb3\x60\xb4\xa0\x7c\x2d\x93\x7a\x22\x5b\xf8\x95\x4c\x2f\x71\x8d\xc7\xbb\x87\x5f\x8f\x6b\xc4\x9a\x2f\x06\x06\xaf\x4e\x81\x09\xc4\x2d\x0b\xf5\x29\x02\x51\xc3\x41\xdb\x53\x29\x41\x2a\x7e\x3d\xac\x31\x0c\x43\x14\x27\xc3\x13\xdf\xcb\xed\x31\xf8\x14\xc1\x22\x8a\x93\x6b\x7d\x60\x38\x0d\xef\x97\xd3\x7d\x93\x27\xcc\x4b\x2c\xe3\xbc\xf2\x75\x85\x90\x38\x4a\x3f\x86\x52\xbb\x7a\x7b\xb4\x7e\x78\x8a\xce\x08\xd3\x78\xe2\x44\x03\x06\xa6\x9f\xa7\x98\xaf\x1c\x9a\x68\x73\xdc\x89\xe8\x6d\xf4\x8f\xd1\x7f\x09\x78\x7e\xcf\x11\xb4\x0f\xab\x71\x1f\x2a\x48\xc1\x63\xf6\xee\xea\x15\xc6\xef\xd7\x9d\xe2\x52\xcc\x79\xf3\xf8\xf8\xf6\xd3\x0f\xef\x3e\x84\xaf\xcb\x77\x7f\xfc\xe1\x5d\xf8\x29\x98\x84\x6d\x16\x05\xc4\xc2\x8f\xa0\x38\x01\x7d\x36\x87\xb8\x30\x45\x96\xa1\x54\x16\x96\x49\xc7\x90\x80\x94\xe1\x5c\x58\x4c\x21\x5b\x1e\x1c\xb6\x8c\x20\xc3\x28\x14\x25\xf1\x47\x8a\x18\xa4\x3b\x21\x61\xd6\xaa\xa6\x51\xad\x9e\x8b\xb8\xcf\xcf\x93\xc7\x27\xe3\x0a\x7f\x04\x72\x64\x1c\x73\xea\x2d\x84\x8a\x10\x0c\x18\xe4\xcc\x57\x25\xd2\x04\xe3\xc4\x1a\x44\xe8\x64\x20\x5f\xb6\x17\x3f\x61\x42\x41\x84\x18\xf5\xa7\x80\xf3\x05\x9f\xeb\x1c\x7f\xb7\xf6\xdb\xbf\x58\xbe\x21\x8f\x7e\x9d\x85\xaf\x3a\xff\xd7\x8d\x51\x81\x32\x90\x65\x00\x76\xae\x80\xf4\x03\x8e\x61\x65\x2d\x51\x8c\x14\x01\x83\x02\x60\x02\x1d\xc4\x5b\x37\x4d\x6e\x72\x6e\x9a\x6d\xd3\x38\x5f\x48\x9e\xd7\x05\x05\x1d\xd5\x8e\x54\x3a\x8a\xe2\x64\xad\x0b\x63\xd1\x0f\xd7\x68\xeb\xdd\x05\x63\xf7\x43\x60\x00\x0a\x86\x15\xf8\xe1\x5d\x38\xc2\x57\x24\xcb\xc7\x38\xf9\xe1\x9f\xc0\xfe\xbe\xb8\x1e\xf2\x7b\x24\x28\xaf\x2a\xe7\xb1\xad\x2a\x88\x29\x88\xe6\xbe\x28\x8b\xac\x4f\xbb\x06\x50\xc1\x0e\x19\x67\x20\x05\x04\xf9\xa3\x9f\x74\x89\x18\x2c\x78\xb9\x63\x12\x16\x9e\x1a\x5f\x58\x0b\x46\x03\x4c\x96\x6a\x78\x1e\x46\xdb\x84\xc3\xdd\xd9\xa9\x9d\x7b\x3f\x29\xa7\x04\x35\x4c\x74\x40\xac\x9c\xfc\xf9\xa5\x8f\xe7\xdd\x25\x97\xf5\x4a\x6b\xb7\xf1\xc5\x5f\x8e\x08\x11\x70\x01\xce\x80\xfe\x00\xf4\x59\x03\xb1\xac\x0d\xdf\xc7\x27\x4a\x21\x2e\x18\xcc\x3d\x75\xcf\x64\xce\xdb\xa3\x31\xca\x68\xa3\xb5\xd1\x66\x96\x73\xbe\x86\xcd\xa8\x1f\x92\xea\x29\x32\x5e\x99\x20\x57\x14\x7c\x87\xb5\xf7\x7a\x39\x39\x22\xf0\x18\x10\x6c\xef\xaf\x45\xab\x6f\x1e\x16\x29\x5e\xe1\xb6\x91\x43\xe1\x4f\x49\xe9\x55\x01\x98\x39\xcb\xa1\x6c\x17\x0b\x7a\x00\x6b\xda\x09\xd4\x9e\x6d\x0e\x83\x31\x83\x67\x2b\xef\x15\x28\xe6\x76\x26\x52\xc6\xad\xc7\x00\xad\xb5\xbc\x53\xc0\x11\x41\xcf\xfe\xff\xbf\xfb\xba\x3a\xea\xcd\x33\x4c\xe9\xe3\x05\x9d\xfd\x82\x82\x7d\xff\x71\xc3\xe2\x21\x30\xac\xbc\x18\x96\xca\xa6\x59\x5d\x40\x49\x11\xf5\xb5\x04\x29\xf5\xa3\x12\x7e\xc0\x20\xc5\x7e\x02\x28\xdb\xa1\x33\x8f\x9d\xf1\xd2\x78\x61\x7d\x9f\x31\x8a\x20\xa5\xc2\x9c\x98\x53\xa0\xf4\xbd\x30\x1c\x44\x86\x2d\x76\xc0\x31\xca\xf6\xe2\x52\xc7\x7b\xa9\xe2\x5d\x61\x8b\x9e\xab\x78\x1f\x3f\x3c\xec\x16\xb5\xbc\xae\xe2\x7d\xb7\xbf\x8c\xe1\xa7\xd0\x98\x36\x15\x2e\x4b\x01\x92\x67\x33\x86\x2a\xde\xd3\x21\xf3\x6d\x3c\x1c\xc3\xfc\x0f\x46\xaa\x2a\xb0\x81\x20\x5b\x33\xb2\x76\x71\x38\x77\x99\x2c\xcb\xc2\x9f\x8c\x41\x44\x6b\xe2\x8f\xde\x52\x53\xeb\xa6\x51\x2e\x57\xb5\xa1\x4a\x47\xbb\x8b\xbf\x07\xa3\xfd\xab\x68\xc9\x0b\x06\xd5\xe3\x2f\x79\xa1\x5f\x46\x4c\xf6\xda\xcd\xd6\x21\x40\xd7\x79\x45\x7d\x13\xca\xc0\xbc\x04\x76\xad\x40\x0b\xbc\xb1\x8d\x8f\xc2\x6d\x07\xfd\xd1\x2e\x7e\x72\x6b\xad\x36\xb3\xb0\x76\x1c\xad\x5d\x74\x2a\xec\x8a\x5c\x78\xe1\x07\x2b\x42\xed\x9b\x0a\x3e\xfd\x33\xff\xd6\xdb\x87\xbb\xc5\xb0\xb8\x0b\x2d\x14\x8f\x77\x1f\x37\xad\x32\xd5\x34\x1d\x8f\xa0\xc8\x6d\xed\x60\x51\x96\xdd\x4e\x19\x58\x9c\xec\x53\x64\xfd\x80\x4c\x59\x78\x0d\x44\xea\xd2\xcd\xa1\x08\xf6\x59\xe8\x19\xbd\xe5\x3b\xff\x55\x3e\xfd\x6f\xf1\x9d\x27\xc7\x67\x54\x9e\xe5\xf2\xa7\x4d\x39\xeb\xa2\x8c\xad\x70\x98\x17\x06\xa1\xb2\x6c\x3c\xe7\x40\x3a\x61\xfc\xc0\x8f\x4a\x51\x2e\x5a\x7e\xfa\x8a\xf0\x7c\x28\xaa\xc2\x02\xe6\xc9\x74\xe5\x7f\x0f\x84\xe7\xa2\x8a\xa2\x5d\xe2\x9e\xd4\x5e\xfc\xcb\xb1\xc0\x93\xd6\x3a\x40\x9d\x73\xd5\x1c\xc5\xc7\xb3\x42\x8d\x05\xe5\x6d\x7d\x20\x36\x84\x4b\x06\x94\xa0\x82\xf2\x5f\xc1\x02\xef\x49\x27\xb8\x32\x5c\x6b\xc7\xaf\xd8\xd5\xcd\x5f\x63\xfe\x6c\x1a\x7b\x3e\x5a\xb8\xb8\xa1\xb5\x67\xc1\xae\xe9\x3c\x76\x3e\x07\x53\x48\xac\xf3\x76\x9a\x80\x9e\x66\x17\x6e\xcf\xf3\xa7\x33\xc6\x98\x59\x18\x3b\x4d\xd6\x7c\x35\x7f\x76\xb1\x8c\x16\xdb\x06\xff\x37\xc8\xf7\x65\x85\x95\x74\x67\xe4\x7a\x20\x43\x27\x0b\xe8\x3d\x8a\xf1\xdc\xbd\x98\x39\x16\x5d\x2c\x1c\x38\x47\xd7\xa7\x1d\xf6\x43\x55\x81\xd2\x8f\x9c\x1b\x3e\x3b\x6e\x9d\xb3\x3c\x16\xdc\xd7\x8b\xb7\x50\x87\xbc\x3f\x08\xfb\x97\xdb\x15\xd1\xbf\xbe\xa9\x53\x79\x58\x47\x71\x53\x24\xd4\x07\x14\xcf\xb5\xbc\xa0\xdd\x15\x76\x6e\xed\xd9\x26\xd2\xc6\x24\xda\x46\x0a\xac\xb6\xe4\x4b\xbc\x33\xfa\xb5\xb7\xfa\x32\xf9\xd6\xc6\xc7\x2a\x3e\xce\x59\x2c\x66\xb7\x4c\xe7\x2a\x64\x87\x6d\x2c\xe7\x0c\xe4\x21\x61\xa0\xc0\xe1\x73\x7b\x7d\xda\xe5\x9c\x5b\x3e\xb7\xc2\x56\x95\x15\x31\xe1\xa1\xff\x69\x6d\x82\x0a\x3e\xe8\xbe\xde\x9e\x2e\x55\x3d\x0f\x77\xdf\xbf\x5b\xbd\xc9\x78\x75\x26\x1f\xee\x32\xf0\x3e\xfa\x0d\x78\x48\x4e\x89\x98\xb2\x02\xc3\xd4\xe4\xdc\x28\x5a\x2f\x1e\x75\x5a\x6f\x4f\xf6\xe7\xb6\x4c\x53\x7a\x40\x4f\x91\x22\x62\xcb\x67\x31\x0f\xbe\x12\x80\x80\x21\x5e\x6b\x61\x2f\xbd\x23\xff\x2d\xe3\xf9\xe5\x7e\xa5\xdc\x8c\x5c\x09\xec\x0a\xb1\x2b\x7c\xc0\xc7\x5c\x73\xb8\x0e\x08\x2f\xbb\xdb\x58\xe8\x0e\xfb\xc9\x2e\x23\xd9\x1a\xa3\xed\xcc\x2f\xf3\xad\xb2\x5e\x18\x63\x6e\xea\x59\xc4\x13\xda\xdb\x58\x84\xd8\xc3\xbb\x67\x08\x89\xe5\xc4\x01\xbb\xfd\x62\xab\x6d\xf6\xef\x83\x41\xb1\x81\xac\x28\x98\xac\xa5\x96\x76\x00\x19\x99\x8d\x3f\x29\x33\xb4\xa5\x3f\x9e\x68\xdb\xb0\x58\xc7\x42\xe7\x99\xa0\x4c\x09\x45\x25\xae\x2a\xa0\x30\xf2\x13\xc2\x9a\x63\x0a\x20\x29\x5d\x15\xea\x67\xd0\xde\xc5\xd1\x17\x9f\xb7\x59\x3f\xef\xed\xcd\xe7\x25\x27\x55\x94\x5c\x6a\x6a\x85\x04\x29\xc8\xe8\x5c\xfb\x96\xc9\x43\x53\xfa\xd3\x91\x0e\x03\x8c\x61\x1c\xd1\x3c\x67\x94\x0b\x26\x89\x46\xb6\x02\x04\xc2\x13\x84\x86\x40\x06\x22\x0a\x9d\x8a\x36\xf1\x29\xe0\xb2\xea\x4b\xde\xf7\xf1\xb9\x16\xfd\xfb\xdb\xae\x85\x2f\x4b\xe8\xbf\xaa\xa0\x8f\xaa\x2c\x8f\x8f\xe7\x1e\x27\xf9\x3c\xe0\x58\x71\x67\x06\x3a\x0e\x07\x3f\xe1\xb1\x31\x84\x72\x31\x72\x43\x78\x55\x5d\x3b\x8d\x10\x6d\x2a\xba\xd3\x25\x44\x36\x15\xb3\x33\x6b\x15\xfa\x73\xd5\x3f\x27\xaa\x19\xe2\x8c\xc8\xd6\x9b\x65\x4e\xce\x27\xc3\x99\x8d\x2e\x9c\xbd\x6a\x73\xfa\x2b\xac\x7f\xe1\x7e\xa6\x6e\x8a\xc9\x9a\xa9\xd5\xb3\x4e\xca\xf3\xe0\xc2\x7a\xd1\xb1\x9e\x5b\x7e\xa9\xa1\x58\xdb\x40\xc3\xd3\xe6\xe4\xdd\x38\x02\xe1\x8f\x94\x6a\x36\x0f\xcc\xb6\xad\x65\x71\xc9\xfc\x81\x31\xe6\x07\xc6\x02\x3f\x5b\x71\xe1\xe6\xfe\x0b\xfb\xa1\xee\x3f\xdc\xef\x06\x27\x04\xe1\xa5\xc1\xf8\x3c\x3a\x15\xa7\x17\x1f\x7f\x18\xf2\x38\x9d\x4f\x1a\x44\x4f\xd1\x0e\xcd\xec\x6c\xb8\xc8\xaa\x8c\xc6\x7d\xe8\x88\xaa\x67\x16\x3a\xa2\x86\xf9\xe8\x33\x3d\x45\x51\x12\x9f\x2e\x58\x6c\x7f\x17\xfd\xcf\xd1\xff\x7a\xc3\x6e\x7a\xbd\x1e\x2e\x5c\x94\x8f\x1f\x1e\x7e\x7c\x75\x30\xfe\x2d\xd8\xbf\xff\xf8\xdd\x62\xd9\x05\x84\xaa\x57\x1c\x23\x49\xd4\xdb\xae\xab\xaa\xa6\xb1\x7d\x5f\xd7\x7d\x2c\xe2\x94\x69\x84\x0a\x42\x8a\xc2\xa4\x4c\x2a\xc6\x52\x36\xb7\x60\xcc\x5c\x1a\x47\x1e\x6a\x40\xa9\x6f\xaa\xca\x3b\x0e\xb8\x5a\x0d\x4f\xbb\xec\xf0\x5d\xd8\xe7\xbb\x99\x4c\x99\xcb\x34\x38\x79\xe7\x07\x25\x38\x48\x01\x3a\xd3\x2a\xa3\xd8\x3d\x45\xbc\x5a\x8c\xaf\x96\x39\x16\xea\xa7\x77\xc9\x18\xde\xe9\xaf\x61\xdb\x18\x3b\x3b\x0b\x01\x59\x4b\xea\x89\x6f\x57\xdb\x46\x80\xe0\xc0\xfa\xd6\x35\x0d\x20\xad\x8f\xc2\xed\x0b\xdb\x86\x1b\x33\x4d\xc6\xc4\xd5\x97\x67\x53\xc0\x75\x4a\xff\x2a\x67\x67\x6a\x67\xb3\xca\xb7\xc8\xb6\x9c\x3e\xc4\xb7\x6b\x9d\x47\x0f\x90\x6f\xab\xba\x06\xb8\xf6\x79\xb8\xdd\x9e\x9d\xda\xbe\x9c\x9d\x6b\xc1\xcc\x8b\x7c\x9b\x2c\xc2\xc1\xae\xfe\xb6\x7c\xcf\x5d\xc6\x5f\xc9\xf7\xf0\x95\xfe\x2a\x3b\x5b\xdb\xf6\xb6\x5f\xab\xa7\xa4\xb7\xa1\x65\x78\x11\xae\xcf\x9b\x06\xe0\xc6\x67\xe1\xb6\x43\xbe\xeb\x16\xe9\x4f\x9c\x6b\x31\x5b\x6e\x9a\xc6\xf0\x58\x0a\x5f\x3d\x93\xea\x87\x73\x7d\xf5\x1b\x7f\x49\xb6\xbf\x64\x5d\x73\x77\x26\x0e\xc6\x51\xb0\xe4\xc2\x41\xc7\xe6\xda\x05\xce\xeb\x12\x0c\x3e\xea\x42\x6d\xd2\x00\xf0\x79\xba\x3e\xed\x90\x9f\xac\x05\xf9\x72\x1a\x98\x65\x84\x17\xeb\x75\x1d\xe1\x70\x1a\x04\x0d\xee\xe2\xe3\x5f\x4d\x46\xe9\xce\x83\x83\xa0\x59\x31\x9c\x2b\xcf\x97\xd5\xed\x42\x85\xca\x32\x07\x69\x13\xd8\x4d\x1d\x48\x67\x7e\x7d\xfa\x33\x65\x6c\xff\x6a\x32\x0a\x77\x6e\x2c\x04\x07\x13\x90\xcf\x1a\x4f\xe3\x62\x1e\xd7\xe6\x8a\xc5\xa9\x82\x4d\x70\xdf\x6a\x50\xcc\xe8\xfa\xf4\x95\x8c\x2f\x2b\xe5\xe5\x54\x5d\x6c\xf5\x65\x1d\xe7\xd1\x77\x97\x6c\x69\x04\xee\xe3\xbb\xec\x99\x2d\x3a\xbe\xcb\xde\xdc\x83\xdd\xfe\x7d\xf1\x63\xf0\x10\xee\x1e\xee\x9e\xab\x0c\xb6\xef\x7f\xbc\x5b\x1d\x86\x7f\x06\x77\x0f\x77\x09\x4f\x6c\x96\x67\x59\xa6\x0a\x45\x79\x76\x3e\x81\x52\x2a\x08\x10\x28\xa9\x76\xc7\xa3\xcd\x33\x4d\x0a\x9b\x1d\xfd\x88\x40\x3e\x4d\x42\x1c\xe5\x2e\x9f\x07\x4f\xfd\xe8\x47\x29\x4a\xef\x40\x01\x06\x20\xc0\xe8\xdb\x2c\xb5\xc2\x94\x45\x3b\x1f\xfc\x54\x10\x52\xb6\x63\xa9\x09\x74\x10\xc0\x18\xae\x85\x81\x5d\xb4\x09\x7b\xbb\xdb\xd4\x97\x5a\xae\x7f\x1f\x62\xa8\x17\xa2\xe8\x95\x38\xf6\x85\x28\x3a\x4e\x9e\x39\xe1\xde\x3f\xbe\x5d\xbd\xd5\xed\x15\x79\xf0\xf1\xee\x61\xaf\x7d\x9f\xe6\x18\x6a\x26\x11\x4c\x33\x93\x53\xa4\x28\xd3\xb4\x62\x30\xf3\x4c\x69\x19\xc3\xd4\xa8\x2c\x17\xb0\x98\xd3\xe5\xe3\xd3\x65\xb1\x49\xc6\x36\x85\xf6\x87\xba\x3a\x94\xbe\x1e\x26\x29\xf3\xa3\x01\x91\x16\xca\x54\x80\x01\xe2\xb1\x37\x7e\xa4\x00\x02\x1a\xa7\x42\x94\x05\xc6\xe4\xa8\xa4\x2f\x05\x48\xa3\x38\xc1\x11\xda\xe6\x3b\x15\x7c\xfa\x97\xec\xed\x5a\xa7\xfb\xb8\x62\xa9\x25\xb8\x72\x55\xe5\xfc\xe4\x74\xd5\x1a\xb3\x0d\x7e\x85\xf5\xcd\x2c\x54\x92\x01\x7a\xae\xc1\x85\x77\x07\x3f\x91\x7d\xbb\xd3\xd1\xf6\x46\x1b\xc1\x5a\x78\x77\xd5\x49\xf2\xdd\xb3\xc1\xf8\x95\x4e\x92\xc7\x37\xe0\x32\x17\x83\x36\x4a\x5c\xea\x12\x4f\x4f\x51\x9a\xa1\xd2\x50\x05\x8b\x2c\x4d\x75\x46\x31\x27\xdc\xd0\x9a\xa3\xcc\x13\x65\x64\x4c\x52\x97\xce\x63\xa8\x60\x96\xde\x1a\xce\x77\x9a\x71\xc2\xd8\xc1\x78\x3b\xb6\x23\xf4\xcc\x9f\x7c\xab\x75\xee\x4f\x16\xa0\xda\xa8\x6e\x04\x32\x8e\xe6\xd6\x43\x6f\x28\x90\xa0\x8b\x03\x25\x96\x1f\x8c\x9b\x07\x03\xf2\x50\xaf\x49\x9e\xe8\xc6\xee\x54\xc0\x2c\x7d\x1e\xd9\x87\x9b\xb7\xf8\x85\x91\x4d\x1e\xef\xde\xdc\x70\x04\xaf\xef\xb2\x91\xc7\x34\x83\xa5\x61\xb2\xcc\x97\x81\x25\x98\xa1\xeb\xc0\x0a\x63\x74\x5c\xa6\xd6\x2c\xaf\x8b\x7c\x18\xd3\xc0\x1d\xac\x38\xdf\x72\xe3\xcd\xd8\x4e\xd0\x2f\xde\xfd\xa8\x54\x7e\xb4\x20\xab\xb4\xea\x06\x50\x81\x61\xee\x7c\xe1\x1d\x05\x0a\x34\xeb\x2b\x80\x9c\x2e\x6f\xee\x53\x53\xcd\x93\x02\x65\xb4\x0d\x7b\x54\x13\xc6\xe4\xbf\x7f\x5e\x5d\xdf\x18\x93\xd7\xb4\xec\xbf\x34\x24\x19\x2e\x15\xc4\x27\x7f\x4c\x33\x04\x35\x95\xa8\x4c\x53\x93\x6b\x49\x85\xa5\x8d\x40\x99\x2f\xad\x31\x31\x5f\x06\xe4\x10\xbc\x28\xe5\x8d\x56\xea\x65\x40\xcc\xd0\x4c\xd0\x0b\x7f\xf2\xf5\x32\x20\x02\x90\xc6\xaa\x7e\x04\x45\x4c\xbe\x7a\x99\xdb\xf1\xd8\x45\xcb\x3e\x56\x26\x79\xe0\x15\x5a\xbb\x24\xff\xfd\xa5\xff\x77\xb7\xbf\xe6\xb0\xdf\xfd\xfe\x3f\x81\xb0\x87\x05\x04\xe0\x4f\x8b\x55\xbc\xfd\xf8\xe9\x7e\xf7\xaf\xc1\x62\x4a\xfd\xf8\xf6\xfe\xc3\xe2\x3e\x7f\xbf\x3c\xc4\xaa\x2e\xe2\xaa\x2c\xc1\x40\x08\xb7\xc5\x54\xfa\xdc\xce\x07\xe4\x84\xa2\x29\x84\x02\x94\xb1\x45\xe5\xdc\xe4\x34\x8d\x53\x1f\xa5\xb1\x03\xd3\x67\x19\xe7\xf3\x31\xae\xc0\x94\xe4\x25\x54\x25\x9c\x8f\x94\xa4\x3a\x2d\x0b\xad\x2d\xd2\xb0\x3e\x65\xb9\x34\x0a\x96\x39\xee\x48\x59\x12\x72\x0a\x5f\xa3\x4d\x24\x63\xb7\x37\x3b\x7d\xa9\xa3\xfc\x0f\x61\x8f\x78\xa9\x06\xfa\xf8\xba\x1c\xe8\x6d\x96\xbc\xff\xf8\x9b\xc0\x3f\xfd\xfd\xbb\x2f\x36\x89\xfb\x0f\xf7\x7b\xe9\xcb\x02\x72\x6c\xb9\xc1\x28\x45\xb9\xa1\x56\x49\xa6\xa8\xa6\xa4\x3c\x2f\xb6\x54\x72\xca\x5c\xda\xe6\x85\x44\xf0\xe7\xd3\xe2\xfa\x95\xb1\x9d\xa5\x0e\x1c\x23\x93\xa9\x15\xb3\xa8\x53\x82\x31\xe4\xa7\x1a\x41\x05\x71\x35\x39\x3f\xf9\x89\x1f\x40\x04\x0a\x42\x28\x5e\xa4\xa6\x07\x49\xfc\x41\xd2\x0b\x2f\x22\xd9\xdb\xcd\xe1\x66\x06\xdd\xee\x71\x6f\x5e\x2f\xe7\x2b\xb8\xc7\x87\xeb\x16\x07\x6e\xa5\xe7\xbe\xc8\x89\x60\x46\x3a\x49\x8a\x5c\xe7\x8c\x38\x63\x7a\x36\x69\x55\x9c\x9b\xda\xb8\x64\xac\xba\x12\x6a\x8a\x7f\x3e\x2e\x56\x6c\x38\xab\xed\xb2\x24\x36\xb9\xf1\x87\x43\x73\x82\xbe\x19\x8e\xa0\x80\x4f\x91\x03\xb9\xd3\xda\x56\xa0\x00\x6a\xf0\xd0\x73\x01\x28\x68\x01\x6f\x5b\x08\x29\xe5\xfe\xa4\x8d\x87\x6a\x8c\xb6\x71\xfd\xbc\x06\xbe\xd8\x97\xb6\x5f\xac\x81\x6f\xae\xe8\xd0\x8d\x75\xb3\x08\x22\x5a\xea\x92\x82\xd4\x8f\x69\x8e\x90\x66\x12\x2e\x9b\x75\x46\xb1\x22\xd2\xd1\x4e\xa0\xdc\x67\x8d\x69\x62\xe9\xe6\x2e\x84\x39\x8c\x57\xe6\x76\x11\xe8\xb1\x3d\xbe\x2c\x82\x53\x75\x5d\x04\x79\x4c\xaf\x8b\x40\x83\xfa\xab\x45\xb0\xd6\x92\xe8\x4d\xff\x0b\xe3\xf0\xe9\x59\xfc\xdf\xdd\x8a\xff\xed\x71\x50\x3e\x4d\xb1\xa4\x56\x55\x14\x61\x68\x4a\xc9\xb5\x72\x47\x0a\x32\x2b\xf2\x73\x65\x8c\x4e\xa6\xba\x2f\xa0\xa2\xe8\xe7\x29\xae\x66\x9e\xc7\x72\xb6\x76\xd9\x96\x96\x81\xe8\x87\x7a\x80\xbe\xef\xc7\x13\x9c\x0c\xc8\x9c\x52\xa6\x06\x08\x08\x8f\xbd\x5d\x79\x6c\x59\x9c\x5a\x0b\x21\x65\xcc\x1f\xb5\xf1\x58\x1d\xa2\x2d\xe8\x43\xde\x7e\x19\x87\x15\xc9\xe2\x9f\x5f\x8d\xc3\xdb\x8f\x6f\x7e\x79\x20\x3e\xde\x6c\x47\xd7\xf3\x72\xd7\x32\x64\x20\x03\xc8\xbb\xac\x60\xd8\x08\x4b\x70\x9e\xdb\x9c\x51\xcb\x75\x47\x27\x45\xb2\xd9\xd6\x96\xe1\x24\x5d\x76\x24\xba\xd8\x2d\x19\xe8\x3c\x36\x4d\xb3\xd3\xcb\x4e\x49\x0f\xd6\x8b\x29\xed\x41\xf6\x6a\x3c\x58\xeb\x96\x43\x82\xc4\xc5\xdc\xfb\xd2\x5b\x36\x00\x0a\xa2\x38\xe4\x63\xfd\x68\x2f\x03\xb2\x05\xd5\xb2\x2e\xb6\xe2\x36\x36\x03\xfe\x02\x8b\x0a\x9c\x62\x5e\xc5\x62\x5e\x19\x6e\xdc\x2c\xaa\x99\xc4\x6d\xe8\x1f\xae\xc6\x65\xe6\xc4\x05\x50\x67\x71\x7d\xda\x1c\x95\x5a\x9b\x83\x86\x21\xb4\x06\x05\xfb\xc9\xf3\xc5\x88\xda\x05\xdd\xea\x1d\x8a\xfe\xf6\xe2\x61\x2e\xde\x7b\x74\xe1\xfd\x5d\x94\x07\xbe\x51\xb4\xfd\x95\x19\xcf\x3f\x0f\xa3\x55\x02\x64\x09\xf3\x2e\xd4\x95\x0f\x9f\x3b\x30\x84\x6e\xa0\xca\x1e\x0e\x80\x0f\x21\x5e\xc2\x87\x1d\x32\x21\x78\xc3\xd8\x11\x38\x90\xc7\x27\x7f\x3a\x77\xb5\x69\xac\x6d\x4c\x0d\xc6\x61\x18\xe6\xc3\x30\x0c\x97\x98\x4e\x24\x02\x1e\xc8\xdf\x3c\xf3\x6d\xfd\x0f\xcf\xb2\x7d\xf7\x1b\xf0\xee\x26\x38\x1e\xb2\x62\x8f\xab\x87\xf1\x78\x11\xed\x31\x44\x73\x66\xdc\x98\xfa\x10\xb3\x63\x30\x80\xcb\x39\x07\x68\x1c\x47\xcd\xf9\xc4\x7d\xbb\x7c\xdd\x41\x33\x8f\x1e\xf9\x9a\x02\x01\x5c\xac\xa6\x99\x08\x2d\x8c\x11\x5a\x80\xca\x39\xb7\x56\xfb\x2e\x36\x31\x7d\x62\xc1\xef\xf9\x96\xae\xfe\x0d\xf8\x33\x75\x65\xce\x59\x67\x38\x05\x51\x02\x7d\x1b\x0e\xbb\xf6\xf3\xe9\x12\x5b\x6a\x6c\xd7\x01\xd6\xcd\x53\xb8\xed\x90\x9d\xe5\x3c\x79\x46\x41\x04\x34\x28\xe2\xe3\xa2\xac\x46\x2f\xca\xd2\xcd\x2b\x65\x25\x49\x1f\xf1\xe0\xd3\x6e\xa3\x7f\x15\x6a\x7f\x43\x51\xcb\x8f\xef\xe2\xe4\xfd\xc7\xdb\x26\xca\x10\xaa\xfe\xcf\xe0\xd3\xc3\x4e\xd8\xda\x38\xf7\x14\x59\x36\xc9\x2e\x8b\x35\xe5\x98\x16\x1c\xe5\x59\x3a\xa5\xbe\x97\x56\xa7\x62\x07\xbd\xab\x45\x0b\x14\x29\xbc\x79\x8a\xe4\xe0\x87\xd9\x0e\xa9\x4d\x25\x68\x7d\x36\x48\x79\x3a\x06\x1c\x62\x12\xf6\x49\xb5\x8e\xcf\x8d\x6f\xb0\x76\x6c\x7d\xba\x69\x40\x7e\x58\xfb\x2a\x2f\x8d\xd9\xf7\x77\xf7\xf2\x1a\x37\x85\x95\x00\x30\x4e\x51\x91\xbb\x82\xa2\xd9\x79\xee\xac\xaa\xa5\x91\x69\x0d\xb0\xb7\x21\x7f\xbc\x6d\x42\x43\x74\xef\xb3\xb2\xc8\x73\xc5\xaa\x32\xc7\x32\xce\x7d\xeb\x27\xa5\x28\x48\x41\x1a\xa3\x7e\x76\x20\x8d\x92\x38\x7f\x22\x1b\xb2\xa3\x21\x3f\xfb\xdb\xc5\x73\xb9\x2d\x57\x8b\xc3\xfc\x59\x0c\xff\xbf\x8f\x1f\xef\x36\x84\xe0\xff\x8f\xb4\xbf\x07\xb2\x1c\xd7\xf2\xc4\x70\x82\xbc\x1f\x9c\xdd\xd9\xff\x30\x5f\x75\xbd\xe2\xcc\xfe\x35\xc3\x9c\xec\xea\xe2\x93\x66\x35\x8c\x57\xaa\x2a\xae\x14\x6f\xc4\x91\xb3\x88\x50\x6c\x08\xa1\x8d\x50\x40\x21\x07\x26\x4c\x98\x30\x61\xc2\x84\x09\x93\x26\x4d\x9a\x34\x69\xd2\xa4\x49\x93\xe6\x35\x69\x52\x5d\xc9\x73\x15\x04\xef\xcd\xbc\x59\x1f\xdd\xef\xf5\x54\x15\x33\x6f\x55\x76\x34\x0e\x0e\x0f\x80\x73\x0e\xce\xf9\xfd\x72\x96\xf0\x34\xad\x63\xaa\x25\xca\xaa\xea\x40\xfe\xdf\x9a\xd2\xc8\x46\x19\x9a\x81\x43\xbf\x1e\x10\x73\x10\x82\xa3\xc9\xd4\x9d\x46\xc4\xf3\x02\x4f\x9e\x8b\x9d\x70\x77\x38\xff\xe4\xe1\x97\x68\x61\x8e\x35\xe4\xb9\x26\xce\x7d\x71\x65\xce\xaf\x2e\x3d\x93\x6f\xbf\xff\xc3\x77\xc8\xe4\x69\x5f\xa4\x55\x9a\xb7\x8f\xac\x49\x52\x14\x91\x58\x85\x91\xa9\x52\x21\x98\x88\x05\xd6\x58\xe0\x9c\x29\xdd\x30\x1c\xc5\xbe\xc0\xb1\x0c\x23\x53\x27\x82\x3f\xfd\xb4\x60\x52\x35\x94\xa4\x07\x65\x6a\x5b\xe5\x46\x1a\x63\xe5\xcf\x75\xd7\xa7\x14\x93\x4c\xf4\x28\x4f\x62\x75\x42\x32\x05\xdb\x45\x21\x22\x19\x84\x50\x26\x19\x2e\xd2\xbe\x4f\x08\x21\x19\x1f\x50\xf6\xf5\x7f\x52\x25\xa9\xcb\x01\x1c\x1d\x97\x78\x74\x78\xe6\x0c\x78\xea\x85\xbf\x9e\x7e\xc1\xc3\xdd\xfb\x8d\x13\xe2\x25\x6f\x89\xcb\x36\x63\x25\x79\x40\xcd\x30\x40\x39\xf8\xad\x01\x6b\x8c\xcb\xb4\x5e\x9e\x5d\x06\x0c\x30\x48\x8a\x30\x2a\x83\x6a\x99\x91\x76\x0d\x3f\x33\x4c\x9f\x2b\x29\x77\x14\xc6\x12\x8a\x0a\xf2\xea\x49\x16\x7d\x28\x7e\xa3\x2c\xb2\x52\x26\x28\xed\x34\x81\x9a\x82\xe8\xe9\x7a\xf1\xfa\xec\x32\x68\x20\x01\xcc\x90\x40\x5d\x40\x97\x09\xe9\xb3\xb7\xee\x25\x30\x7d\x2e\xa5\xdc\x31\x18\x4a\x97\x1f\x5e\xf7\x88\xa3\xdf\x9c\x8b\xa3\xfc\x45\xbd\xdc\xdf\xfd\x01\xdd\xdd\x7f\x53\x96\x60\xb4\xc6\xee\x52\xeb\x3a\x9c\x72\xe8\x02\x65\xc1\xb3\x4f\x57\x49\xeb\xb3\x4b\xe1\xe4\xf6\x4f\xd4\xa0\xc9\x9f\x5f\x88\x53\x09\xb1\xa3\xb7\xe2\x78\x47\xd4\x9e\xf1\x31\xff\x86\x6e\x5e\x47\xe8\xcf\x90\x07\x9f\x3d\x7d\xda\x69\xe3\x5e\x4b\x08\x65\x30\x99\x45\x1b\xe3\x1a\xc8\x2e\xcf\x2e\xeb\x97\x13\x84\x1c\x95\x7e\xe8\x8f\xbf\xac\x1e\xef\xe8\xcf\xe7\xfc\xc8\x7e\xf1\x5d\xfd\x82\x3c\xbb\xbc\xd1\x55\xd0\x5a\x77\x27\x2d\xce\x5e\x90\xda\xdb\xeb\xe8\xf5\xd9\x65\xd0\x83\x07\x39\x45\x1a\x9d\x82\xe2\x57\xe5\xa9\xdc\xfb\xfa\x96\x7e\x9e\xe4\x79\xfd\x07\xf4\xe1\xfe\xf5\x37\xe5\x09\x07\xdd\xee\x42\xeb\xe8\x37\x09\x8c\x81\xb0\xcb\x6c\xcc\x2d\xe2\xe5\x2e\x9b\x96\x13\x24\x1c\x19\xdf\x0b\xbc\x65\x42\x6a\x9a\x26\x38\x7d\x2e\x85\xdc\xf1\x55\x96\x62\xfd\xb3\xc9\xc2\x5c\x0f\xc7\x6f\x94\x25\x68\x47\xd5\xed\xb2\xd2\xd9\x4e\x01\x5d\x60\xcb\xdb\x56\x8e\xf5\xd9\xa5\xdd\x72\x82\x98\xa1\xd2\xf7\xfc\x71\x39\x39\xea\xcc\x6f\xea\x65\xe7\xd1\x33\x0d\xe6\x27\xac\x81\x77\xb7\xfb\xfa\x76\xb8\x5d\x53\xcd\xaf\x7e\xff\x66\xdd\xe1\x8f\x9f\x5e\xef\xf6\xef\x3e\xfd\xf4\x8e\x23\x65\x1d\xe2\x65\xfe\x38\xa1\x02\x54\x1e\xc4\x8f\x27\x97\xf9\xc6\x79\x22\xb3\xa4\xcc\x5b\x30\x90\xe7\xa7\x24\xdb\x9f\x8c\x31\xd6\x18\x0b\x05\x24\x6a\x04\xa2\x6d\xac\x4d\xd6\x64\x56\xb0\x32\xb3\xd2\xf3\x76\xa8\x3f\xf3\xfd\x33\xe6\x41\xfa\x45\x25\xc8\xfb\x67\x39\x82\x4d\x8e\xc3\xf1\xd3\x9b\xdd\xfe\xdd\xdb\x9f\xde\xf9\x29\xca\xb6\x3a\x10\x6f\x11\x33\xf4\xc5\x6a\xad\xee\x12\x3a\xe3\x98\x90\xdc\x24\x74\x88\x41\x42\x9c\xa0\x28\xa7\xfb\xa6\x6d\x75\xab\x75\x0b\x19\x64\xa6\x01\x65\xaa\xd0\x94\x19\xb1\x89\xc6\xa9\x89\xb5\xf2\xfc\x1d\x39\x9b\xa3\x3d\xa4\xae\x96\xc0\x9d\xfb\xee\xf7\xeb\x7b\x57\xb1\x70\x54\x0b\x73\x18\x4a\xcd\x63\xe3\xae\x01\x0f\xa9\x01\xb3\x70\x30\xe6\x60\x3f\xcf\x5b\xae\xc3\xe9\x75\x17\xde\xce\xe7\xdb\x7a\xbd\xbb\x47\x6f\x36\x7d\x7e\xba\xce\x8b\x23\x6d\x5d\x5c\x50\x3c\x8e\x08\x83\xcc\x9e\xaf\x99\xdb\x18\x38\x84\x49\x9f\x61\x4d\xf3\x3a\x4f\x6c\x9c\xec\x87\x72\x83\xbb\x84\x0d\x1e\x6b\x31\x5a\x10\x9b\x48\x41\x75\x99\x48\x43\x30\xde\xb0\x54\x32\x77\x6f\xa6\xbc\xff\xe8\x3d\x38\xb4\x3f\x97\xbd\xbd\x7b\x7f\xf7\x05\xc3\xfe\xc6\x0e\xf9\xc4\x9c\xf3\x45\x83\xd3\x85\x6d\xc1\xa7\x83\x1d\xcd\x68\x87\xcb\xb7\x7d\x62\x3f\x9f\xec\xae\xe5\xdc\xb5\x16\xe5\x30\x5a\x18\x4b\xd4\xda\xbd\x9a\xe7\x75\x4d\xce\xb3\xee\xba\xb6\xed\xba\xd5\x87\xee\x3a\x44\x41\x41\xba\xd5\x90\xa0\xcc\xf1\x56\x9d\xfc\xb2\xae\xd7\x38\x7e\x3a\xd3\x63\x15\x8c\x37\x9e\xd7\x1f\xb7\xbb\x79\xe7\x31\xff\xf0\xfb\xf7\xce\xcf\x70\xad\xe1\x2e\x98\xbf\xbb\x94\x48\x04\x5f\x3a\xcf\x74\x1f\x2e\xb5\x5f\x2f\x44\x0e\x08\xa7\x79\xac\x93\x0a\x14\xd4\x16\xe2\xd2\xd7\xcb\x58\x06\xdd\x63\xce\xb7\x8b\x1a\x3f\xfa\x2c\xae\x9f\x82\x11\x5a\xb2\xcc\x79\x12\xc7\xa9\x4a\x1b\x56\x60\x4e\x7d\x46\x24\x81\xc4\x5d\xd9\x30\xc6\x9c\x2f\x24\x82\xd1\xd5\x8a\x07\x5b\x95\xf1\x86\x6f\xf6\xfa\x89\x6a\xe8\x09\x90\xf9\xc7\x4f\xf7\xa8\xd8\xab\x9f\x55\x7b\x8c\x97\x82\xa8\x89\x44\x2a\x16\xd0\xcc\x1c\x66\xb6\xf4\x05\x1a\xf1\x72\x3a\x50\xc9\x24\x4d\xa2\x04\x27\x12\xe7\x58\xcd\x99\x4e\x9d\x1d\x85\x8e\x87\xaf\x0a\xd4\x05\x89\xe7\xbf\xbf\xc9\x11\x5c\x54\xf2\xbf\xf8\x97\x11\x1f\x9c\x46\xdc\x36\xb1\xff\x70\xff\xfa\xed\xdd\x0f\xbf\x7f\xe3\xaa\x4c\xae\xec\xa7\xfb\xcb\xf7\xc3\xb0\x74\x6b\x58\xc1\x67\xa2\x8b\x48\xa5\x25\xa4\x12\xe6\x27\x6c\x12\xb0\x68\xce\x84\x71\xe7\xe2\x00\x29\x14\x40\x02\xf1\xf4\x49\xc1\xc8\x20\x17\x29\xce\x75\x86\x31\x43\x1d\x43\x49\xcb\x18\x7b\x3c\xc5\x49\x18\x50\xc6\x20\x25\x84\x90\x9a\xe0\xd5\xf2\x7c\x8f\x05\xd5\x51\x3a\x3d\xfd\xfd\x2f\xe8\x69\xb7\x29\x4a\xec\xa3\x9f\xa7\xf6\x60\x97\xb6\x10\x63\x11\x99\x98\x43\x3b\x70\xe8\x73\x18\xa1\x2e\xd0\x4c\x20\x3c\x50\xcd\xb4\x4c\xe2\x9c\xa6\x06\xe7\xb8\xd4\x36\xd1\x9b\xaf\xb2\x71\x77\xa8\x43\xec\x05\x5e\xec\x78\x1f\xb6\xc2\xce\x4b\x7d\xdc\xc3\x7a\x12\x7a\x77\x1f\x1e\x4e\xfe\xbc\x84\x34\xa8\xa7\x52\xc6\xd5\x88\x4b\x18\x14\x0a\xc7\x43\x6c\xa1\xb4\x8f\x53\x81\x2d\x23\x38\xd0\xdd\x32\x42\xc5\x51\x8e\x06\xc7\x0d\xe9\x4b\x4f\x1f\xb5\xc3\x60\x4a\x9e\x31\x52\xee\x7e\x78\x7f\x33\x91\x27\xb7\xf7\xee\x3e\x08\x83\xf1\x31\x11\xbb\x06\x74\x1c\x46\x55\x1e\xda\x50\xc0\xac\x48\xd7\x4c\xa4\x29\xa1\x3b\xa4\x16\x46\xbb\x54\x59\x98\x9b\xac\x63\x05\xf5\x35\x68\xb0\xc2\x10\x94\xa3\xfc\x32\x97\xa3\xd9\xd1\xe7\xf1\x8e\x6e\xbc\x2f\xf0\x45\xfe\x1d\xda\xbf\xfb\xf1\x77\x9f\xee\x11\xd9\x93\x9f\xeb\xea\xd0\x2c\x43\x21\x1a\x1c\xd9\x08\xe7\x70\x3a\x71\x28\xa3\x19\x6a\x89\x8a\x31\x82\x68\x47\xed\x64\x21\x4e\x13\x5c\x67\x27\x9c\x61\xee\xc7\xd0\x41\x23\x2c\x43\xde\xbc\xfa\x57\xe2\x8c\x77\xe4\x90\x7b\xff\xfe\xc2\xc7\x7a\xcd\x22\x6c\x05\x9f\x0e\x99\xfe\xed\xcd\xe7\x4b\x85\xef\x56\x5f\x72\x83\x28\xf9\xd4\x07\x89\x5a\x68\xd0\x68\x8d\xc4\xbd\x2f\xa1\x45\x83\x35\xb2\xe8\x16\x25\x09\x26\xdc\xcf\x05\x21\x05\xe7\x55\x14\x23\x6d\x97\xde\xa2\xbc\x74\x37\xab\xd9\xd2\xef\x34\x4a\xf5\x12\x56\xaa\xd0\x5c\xa1\x58\x2f\x61\x6b\xb0\x16\x88\xe6\x98\x17\xb9\x70\x5f\x21\xc9\xb2\xec\xb1\x66\x2c\x20\xd0\x57\xae\x53\xd1\xf3\xfc\x5d\x71\xc6\xc7\xf6\x10\xbd\x78\x4f\x0f\x77\x3f\xbc\x79\xc1\x01\x76\x7d\x4f\x0f\x3b\x77\x91\x4b\x82\xb8\x0b\xc3\x28\x4d\x42\x15\x63\xc1\x89\x34\x25\x91\xa2\x3a\x44\x06\xb8\x79\x1c\xd2\x30\xcc\x74\xd6\x52\xcc\x83\x02\x62\xa0\x4a\x0b\xc4\x51\x7d\xb5\xb9\x7c\x37\xfe\xaa\xcd\x8d\x01\x79\xac\xc9\xce\x9b\x2b\x1d\xd7\x13\x1e\x61\xd0\x28\x3a\xad\x36\x67\xec\xe2\x51\x66\xa5\xc0\x81\x6a\x96\x11\x2c\x47\x05\x1a\x1b\x37\x97\xd0\x63\x47\xba\x0f\xdd\xbd\xf0\x85\x81\xfb\xcb\x42\xe5\xad\x12\x32\x44\x83\x1d\x47\xc2\x39\x4d\x39\xcf\x21\x6d\x59\x61\x73\xba\x8b\xe6\xd9\x2c\xad\x62\x71\x9d\x70\x3f\x62\xb6\xc1\xad\x5d\x65\xd6\xab\x6d\x05\xfd\xaf\xd8\xd6\xc1\xdb\xbf\xfb\xf1\xe3\xa7\x7b\xc4\xf6\xd9\xcf\x7d\x7b\xe8\x56\xdb\xaa\x70\x54\xc6\x45\x0e\xd3\x89\x43\x13\x9d\x3d\x68\x24\xc2\x7d\xbc\x9c\x82\xde\x4e\x06\x4c\x9a\x14\x65\x36\x14\x19\xe6\xa8\x9c\x61\xa4\x86\xf4\xad\x5b\x3f\x9e\xc3\x89\x8c\xbf\x5c\x3f\x2f\x5f\x8b\x7f\x3c\xec\xd7\xb0\xf1\xde\x77\x2d\x76\x72\xd7\x82\x4a\x19\x2f\x22\x93\x88\xa6\x11\x7d\xc8\x18\xf4\x74\xae\x43\xe8\x57\xdd\x09\xfb\x78\x4a\x62\x6c\xf2\x81\x11\x1e\x64\x50\xf4\x43\xa9\x35\x12\xae\x55\xcb\xbd\x9b\xe2\x68\x76\x6a\x1b\xf3\xd5\x36\xcf\x27\x74\x91\xa7\x50\xf5\x75\xb4\x7f\xf7\xf1\xd5\x87\x87\xde\xef\x96\x9c\x06\xb2\xb7\x28\x46\x4a\x27\x36\xa5\x04\x22\x10\x4d\x7d\xf6\x44\x1f\xf5\x3b\x65\x7a\xb3\x34\x49\x4a\xda\xec\x44\x0a\xc2\x7c\x59\x43\xdc\x48\x8b\x2a\xbb\xe1\xda\xe4\x97\x7b\xaa\x60\x43\x80\x7d\x39\xc7\x6b\x11\xcc\xe5\xbe\xfc\x3e\x18\x83\xe2\xb1\xe5\xbb\x04\x86\x38\xc9\xd3\xd0\xc4\x54\x6b\x52\x87\xd5\x48\x1b\x1d\xc2\x7c\x99\xe0\x98\xc4\x64\xce\xe1\x64\x08\x0f\x72\xc8\x80\x5a\xa3\x10\x43\xe5\x1a\x97\x8a\xa0\xd8\xa5\x0e\x1b\xfa\xdf\xbb\x6a\xcb\xdb\xb6\xe3\x4b\x63\xc1\xc6\xf9\x71\x01\x8e\xbc\x47\x34\x4f\x54\x9a\xf9\xa5\x49\x73\x95\x2f\x39\x92\xce\xd3\xe8\x2b\xa6\x8d\x55\x2d\xeb\x0c\xf4\x07\x49\x58\xce\x70\x91\x09\x8c\x89\x43\x65\x33\x4c\x0b\x4e\x4f\xc8\xab\xa4\x14\x8d\x17\xb8\x7d\x96\x05\xcc\x4b\x1d\xe2\xfe\x65\xdc\xe3\x6d\xad\xe9\x6d\x2f\xea\xc6\x38\xbe\xff\x78\xed\x46\xdd\x04\x0c\xb4\x26\x2a\x49\x47\x2c\xd3\x34\xc9\xf3\xb4\x6e\x13\xab\xfb\xb8\x66\x46\x0a\xae\x70\xa1\x6a\x98\xc7\x26\x2f\x28\x15\x98\x83\xe0\xdc\x52\xe5\x53\x53\x63\x5c\x64\x30\x72\x1a\xd9\x18\x4f\x49\x24\x0a\x1a\x09\x6d\x32\x83\xc3\x28\xcf\xb3\xd2\xa6\x29\x86\x89\x1b\xaa\x74\x42\x2d\x93\xdb\x19\x74\xb6\x41\x7f\x48\xbd\x37\x1b\xa3\xee\xeb\x1f\x5e\x02\x1d\x7f\xfa\xfd\x1b\xd7\x04\xb0\xf9\x67\xae\x46\xc7\x61\xf5\x5a\xff\xa4\x0a\x25\x99\xd4\xcd\x8c\x47\x6b\xeb\xa2\xab\x58\xbe\xb4\x11\x22\xae\x9a\xbd\xb2\x09\x18\x28\x72\x24\xa0\x3e\xa4\x3c\x82\x91\x32\xa6\x05\xab\x89\xc1\x8a\x11\x45\xb9\xb2\x8f\x4d\x55\x59\x38\x25\xa9\x96\xb4\x2a\x1c\xe9\x91\xef\x15\xe7\x3c\xe8\x2e\x38\xa5\xae\xd2\xe3\xfe\xf5\x0f\x5b\xa1\xcc\xd6\x3a\xf4\x52\xb0\x4b\x54\xf0\xea\xfd\xdd\x83\xef\x59\x94\x31\xe3\x7a\xa9\x62\x49\x30\x57\xba\x63\xa3\x50\x5a\x0a\x9e\xc7\x50\x48\x23\x6c\xd3\xec\x5d\xd9\x87\xc9\xba\x94\x33\xb0\x50\x9d\x3d\xce\x45\x3d\x48\xad\xba\xb2\x24\x42\x8b\x9e\x42\x02\x8a\x22\x89\x3a\xbf\x06\x0f\x71\x2f\xf0\xd8\x99\x04\xc3\x41\x79\xbf\xf7\x1e\x9e\xbb\x10\x57\xeb\xdd\x54\xe5\x1f\xdf\x79\x7f\x8b\xee\xf7\x6f\x6e\x1a\x27\xd0\x9b\xc3\xf1\xfa\xb9\x46\x99\x4b\xc3\xc7\x95\xe2\x52\x8a\x93\x40\x0a\x7a\x1f\xab\x30\xc1\x05\x4d\xd3\x24\xe1\x18\x32\x15\x25\x82\x26\x69\x9a\x71\xbe\xaf\x86\xc1\x2c\xb3\x35\x75\xa5\x1b\x03\x5d\xa7\x10\x41\x93\x1f\xca\x44\x2b\x26\x18\x29\x24\x65\x03\xa2\x89\x35\x15\x2f\x72\xc5\xd8\xe8\x05\x1e\x3e\xe7\xbb\xd8\xf5\x5e\xfe\xe3\x6d\x06\x2a\xba\x88\xb8\x77\x47\xef\x37\x44\x74\x8d\x7c\x1a\x31\x8b\x18\x94\x69\x5f\x0a\x63\x19\x9c\x58\xd7\x41\xe9\x97\x26\x4e\x68\xc1\xf2\x2c\xcb\x19\x87\x58\xc5\xa9\x60\x45\x96\x73\xb5\xaf\xfa\xde\x2e\x5d\x55\x8f\x7a\x34\xa0\x07\x65\xfd\xdc\xd7\x24\x53\x92\x33\xc5\x89\xa0\x6c\x44\x79\x5a\x1a\xa3\xa4\xe4\x02\x85\x5e\xe0\xd1\x73\xee\xee\x04\x7f\x8b\x7c\x1f\x4b\xa4\x4b\x64\x40\x64\x53\x2d\xaa\x5a\x42\xcf\x4e\x03\xc8\xc0\xd3\x71\xc6\x31\xc5\x38\x2b\x98\x5a\x46\x95\x64\x9a\xd1\xbc\xe0\x7a\x93\x6f\x68\xeb\x51\x9f\x0c\xa8\x5e\x59\xbf\xf0\xd5\x55\x3e\x2a\x37\xf9\xac\xb1\x4a\x49\x21\x4e\x1b\xe7\x6b\x71\x6c\x5c\xdd\xf8\x8f\xae\x8a\xf4\x22\x5f\xf0\xc3\xdf\xa1\x37\x47\x6f\xab\xd9\xf9\xdd\xdd\xfd\x3f\xa0\x67\x09\x7f\x87\x6e\xc5\x0d\x08\xaa\x1c\x99\x76\x58\x8d\xb5\x85\x46\x71\x50\x1c\x45\x92\x01\xab\x75\x92\xd3\x82\x65\x79\x9a\x73\xe5\x0f\x36\xce\x14\x65\x94\x64\xb9\x50\xfb\xba\xeb\x2c\x90\x0c\x72\x38\x29\x83\x62\xd4\x40\x32\xeb\x1a\xe5\xc8\xf3\x39\xc9\x4a\x8b\x0b\x8d\x73\xce\x38\xf2\x10\xc9\xb4\x62\x4c\x73\x22\x18\x9f\x3c\x67\x97\xf9\xd1\xee\x3d\x2f\xf6\x7e\xf2\xde\x3f\xeb\xf4\x87\xe3\x0f\x47\x6f\x7f\xfc\x11\xad\x42\x7b\xb7\x6a\xfd\xff\xa1\x8b\x5e\x9f\xa4\xae\x82\xb0\x0c\xc2\xc7\x39\x8c\x50\xe2\x17\x6c\x99\xa1\x2f\x17\x21\x10\x41\xac\x7c\x9c\x11\xb5\x69\xaa\x18\x63\x8c\x62\x2c\x4f\xbb\xdc\xc4\x49\xa3\xb8\xd6\x39\x51\xd5\x8e\xd4\xb5\x31\x21\x25\x10\x37\x55\x8f\x2a\xe0\xbd\x61\xc8\x43\x18\x15\x49\xc6\x08\xa3\x5a\x50\x43\x31\x9b\x51\x9a\x11\x6c\x94\x2d\xa5\x20\xac\xf5\x7c\xaf\x76\x7d\xbd\xa5\xf7\xa3\x97\x3d\x4b\x7d\x78\x41\xc5\x74\x29\x0b\x74\x74\x02\x1f\x5f\xdd\xef\xdf\x3c\x8b\xdc\xf8\xf3\x45\x64\xc2\x2c\xb3\x69\x5a\x19\xa1\x4c\x5e\xb4\x48\xe0\x65\x82\xb6\x5c\x6a\x8a\xca\xd6\x84\x4b\x88\x72\x9b\x13\x22\x8a\x82\x0b\x39\x04\x99\x10\xb6\x2a\x18\x29\x87\x8c\x16\x84\x2a\x8e\x49\xa1\xb1\x15\x88\x42\x6f\x35\x6f\x34\x4a\xd3\x4c\x60\xa2\x68\x61\x18\x73\x3c\x1c\x81\x27\xd7\x18\x63\x67\xae\x76\xf1\x14\xa9\xde\xaa\xf8\xee\xc3\xd7\x96\xfb\xf4\x97\x32\x88\xaa\x20\x7a\x3c\xc5\x28\xf3\x0b\xb2\x9c\xa0\xab\x16\x41\xd1\x80\xd8\xe3\x84\x12\x13\x27\x52\x08\xca\xb0\x11\xf3\x2e\x37\x61\x6a\xa4\x60\x32\x27\xa2\xde\x79\xc6\x18\x4b\x09\x14\xca\x6a\x54\x82\x6a\xac\x42\x0a\x65\x2c\x4f\x25\x2d\xa8\x24\x85\xa2\xa2\x44\x45\xc2\x28\xe1\x92\x11\x4a\x44\xe9\x21\x3f\x3e\xf3\xa3\x41\xfd\x56\x2f\xfb\x32\xaa\xf6\x7b\xd4\xba\x22\x19\x9f\xff\xac\x7d\x09\x05\x4a\x1d\xc6\xa7\xae\xbc\xc0\x4f\x50\x7c\xac\xf7\x89\xdb\xe3\x6e\xbb\x26\x7e\x38\x3e\x51\x7a\xdc\x7d\x78\x61\xfe\x1f\xdf\xde\x4e\xd3\x17\xbe\x67\x7d\xbc\x34\x61\x8f\xc6\x02\xb2\xc1\x02\xa6\x3e\x01\xaf\x36\x71\x52\x14\x3c\xcb\x30\xe3\x4d\x20\x74\x98\x48\xc6\x29\xcd\x72\x2e\x76\x2d\x63\xc6\xa4\x19\x8c\xd2\x28\x14\xcf\x95\xee\x51\x66\x92\x64\x5d\xd0\x3c\x4f\x39\xe1\xe5\x90\xe4\x19\x65\x92\x93\x22\x65\x7c\x8d\xd5\x5b\x87\xb7\x21\xbf\x94\x33\xf8\xc1\xdb\xff\x79\xcb\x94\xae\xcb\x74\x84\x24\x42\x1e\x8a\x35\x74\x5a\x02\xe1\x28\x37\x02\x98\x54\x71\x4a\x31\xcb\xf3\x9c\xf0\xd2\x9f\x74\x94\x4a\xca\x08\xc9\x8b\xcb\x8e\x07\x19\x5d\x9a\x41\x6f\xab\x74\x52\xeb\x2a\x0d\x7d\xc6\x62\x6b\x08\xd6\x34\x2f\x25\x47\x31\x22\xb1\xe0\x92\x6b\xc5\x24\xe5\x4f\x7c\xd2\xf9\xa5\x77\xfb\x0b\x99\x7f\x77\x2b\xf3\xa5\x83\x78\x93\xf5\xa5\xcc\x0c\x95\xa5\xdb\x5a\x66\x27\xb2\x12\x20\x39\x0a\x95\x00\x56\xe6\x98\x1b\xac\xe3\x04\x17\x22\xf5\xb9\x8e\x13\x4a\x44\x56\xa4\x99\x10\x9b\xc8\x94\x2d\xc6\x89\xdc\xad\x1b\x4b\x89\x52\x14\xf9\x62\x19\xac\xe4\x28\x42\x3c\x55\x52\x18\x29\xfc\x34\x55\x4a\x68\x29\x88\x60\x62\x72\x39\x11\xf6\x3d\x99\x37\x3d\xa3\x5f\x93\xd9\xef\xd0\x58\xfa\xe9\xd2\x87\x28\x45\x58\x83\x2e\x05\x64\x1c\x15\x46\x42\x52\x16\x8c\xd7\xc4\x24\x29\xc5\x22\xf7\x4f\x26\x4e\x39\x15\x05\xce\xb0\x50\xfb\x72\x18\x0c\x70\xba\xa8\x51\xa3\x04\x0d\x10\x9d\xbd\xcb\x76\xc8\x96\xd1\x2a\x8e\x52\x44\x52\x25\xa5\xde\xa4\x16\xd2\x4a\xc9\xb4\x90\x27\x2f\xf0\xcb\x27\x99\xff\x71\xeb\x68\xfc\xa6\x6d\xdc\xca\xfc\x52\xcd\x1e\xea\x4a\x3f\x5c\xe6\x10\xc5\x28\xd3\x50\x1a\x67\x1a\xa9\x96\x90\xd7\x05\xe5\x25\xd5\x71\x4a\xb0\xf0\x99\x89\x92\x4d\xe2\x42\xca\x4d\xcd\x8c\x2e\xda\x49\xdc\x43\x34\xeb\xca\xa9\x99\x2f\x83\x51\x37\x6a\xf6\x6d\x2a\x84\x2a\xa5\xe2\x46\xca\xc1\xf3\xbd\xee\x5c\x04\xda\x4f\x5c\x97\x85\xb7\x77\xe8\xa5\x0f\x7f\x72\x79\x5f\x66\xfd\xd6\x82\xc8\xb4\x3f\x2c\x89\x31\x28\x83\xde\xdb\x7b\xf2\xac\x83\xc1\x61\x2b\xff\x07\xef\x8d\x77\xef\xfd\x8f\x9b\xe7\xfe\x64\xec\xcf\x2b\xf2\xe6\x93\xab\x9a\x7f\x7b\x71\xdb\x4c\x90\x3d\xf6\xc2\xe4\x05\xc3\x06\x0b\x82\x88\xc1\x44\x10\x43\x14\x43\x44\x17\x98\x13\x4d\x15\x5b\xfa\x20\x86\x06\x25\x31\xd4\xc0\x72\x44\xa1\x3b\x64\x26\xcf\x1a\x6d\x4b\xdc\xd6\x75\xbf\x7d\xea\xaa\xba\xcd\x1a\xad\x0d\xae\xcb\x7a\x69\x0c\xb4\xb9\x62\x45\x99\x21\xea\x6a\x80\x8a\x33\x76\xfe\xc8\xdf\x78\xaf\x2e\xb8\x82\x1e\x5a\xdd\xfb\x8d\xbb\xe4\xd3\xef\xdf\xb8\x4c\xee\xfd\xab\xef\x75\x61\x21\x19\x12\x2e\x6b\x84\x93\xb4\xcc\x63\x94\x59\xf0\x7c\xaf\xe4\xcc\x35\x60\x15\xd0\x1a\xe3\x0a\x0e\x0b\x68\x83\x09\x0a\x48\x27\x8e\x8c\x3f\x20\x83\xf3\x8c\x30\x48\x11\xe9\xe0\xf4\x58\x52\x1a\xeb\x18\x5b\x30\xbb\x18\x4e\x06\xb8\xf6\xb6\x73\xb3\x08\xe6\xa0\x73\xfc\x61\x17\x6c\xae\xad\x6b\x7f\xff\xe3\x33\x04\xcf\x6d\x2c\x79\x78\x78\xf7\xf1\x7f\x45\xfb\xa7\xb0\xde\x79\xe9\x48\x19\x4c\x98\xa0\x58\x4d\x30\xa1\xd8\x26\xa9\x14\x85\x4a\x38\x27\x3c\xcf\xe2\xa2\x48\xeb\x2a\x66\x9c\x9d\xbd\x44\xfb\x91\xc0\xba\xe0\xa0\x04\x53\x4c\x04\x5d\x26\x49\x18\x53\x4e\xa1\xd3\x51\x91\x67\xd8\x94\x98\xc4\x11\x54\x8c\x84\x26\x2a\x50\x1a\x9b\x94\xe0\x44\x30\x08\xa5\x21\x46\xa5\xb4\x14\x9a\x6c\xe7\x91\x38\x93\x5d\x74\x48\xbc\xb7\xde\x3f\xbb\x8e\xbc\xfb\xd7\x5b\x29\xfb\xe1\x78\xe9\x93\xfe\x32\xd2\xb8\x5b\xfd\xf7\x0d\x1d\xe2\x61\xc3\x21\xfa\xe9\x1d\xf2\xfc\x52\x5a\x9c\x51\x2a\x25\xa5\x79\x51\xe0\x3c\x8b\xd3\x2c\xa5\x04\x1b\xa6\x38\x44\xc6\xf8\xca\x98\xc7\x69\x22\x98\x60\x72\x48\xac\xd5\x55\x41\xd7\x83\x4a\x2b\x25\xd9\xd9\x2b\x70\xac\xe3\x64\xd2\xc4\x28\x85\x06\x29\xa0\xfd\x3c\xef\xc2\x9f\x67\xb9\xc3\x05\x61\xb4\x70\x35\xb2\xae\xf6\xc5\xe5\x4c\xb6\x4c\xef\x7f\xe7\x70\x00\xee\xbf\xcd\xe3\x75\x8b\x41\xbe\x63\x41\x02\x5d\x82\xb2\x85\x8c\x09\x34\x83\xbb\x4e\xbf\x3e\x42\x0a\xc1\xd5\x20\xb8\xa1\xe6\x90\x9b\xea\x73\xbb\x2b\x2a\x88\x1b\x88\x6a\x88\x1a\x28\x99\x16\x5a\x61\x52\x32\xc1\xbd\xbf\xf2\xf8\x99\xec\xf2\x27\xde\xe2\xd7\x37\xbd\x42\x57\x3e\xd1\xa7\xd2\x8e\xe7\xde\xe6\xdb\x7e\xa7\xfd\xba\x74\x7e\xe4\x88\x45\xb1\x4d\x63\xd4\x3e\x66\x69\x20\x1e\x8d\xf1\xc9\x52\x17\xa8\x83\x5c\x75\x1d\x0c\x41\xf2\x38\x9a\xa7\x3b\xaa\x26\x02\x01\x51\xec\xc7\x87\x30\x4d\xb3\x1c\x6b\xbc\x70\x81\x6a\x02\x13\x23\x50\x40\x88\x32\x0a\x27\x3a\xc9\x22\xd5\xa9\xf7\x57\x1e\x3d\xe3\x1d\x7d\xea\xd1\x4b\xbd\x7f\xf5\xfe\x8b\xf7\x5f\xbd\xff\xe6\xfd\xdf\x2f\x91\xd3\x5f\x3d\x07\x66\xab\x41\xbe\xc4\x39\x7a\xfb\x25\x04\xd2\x86\x72\xf4\xd3\xbb\xef\x01\x48\x35\xab\xc8\x16\x4d\x10\xad\x8f\x2d\x32\x11\x46\xb6\x4e\x19\x25\x38\x61\xb9\x4c\x71\x96\x16\xb9\x54\x95\x0e\x23\x1f\x93\x8c\x27\x65\x9d\x52\x52\xc5\x2c\x57\xeb\x51\x2e\x95\x31\x71\x94\xb9\xc2\x3b\x8e\x63\x15\x17\xc0\x75\x96\xab\x02\xe1\x3c\xd6\x51\x76\xc8\x97\x06\x71\x06\x2d\x5b\xa8\xd4\x45\x96\xe6\x09\xe7\x3a\x92\xbc\x4e\x4a\x12\x0a\x95\x42\xdf\x67\x49\x4c\x95\x29\x58\xb1\xfe\x28\x51\xbc\x4e\x0c\x8b\xc6\x0c\x86\x36\x4f\x52\x98\x84\xce\x8d\x88\xac\x4d\x4a\x13\x66\x9d\xc6\xa5\x31\x36\xad\xf4\x56\x7f\x4d\x1d\x97\xd2\x6f\xb5\xad\x36\x41\xf9\x92\x4d\x09\x74\xcd\xed\x3d\x27\x32\x42\x0a\x6e\x26\xcd\xac\xd0\x37\xb6\x55\xaf\x7f\xa2\x1a\x4a\xa6\x84\x92\x14\x1b\x25\x84\xf7\xef\x3c\xec\xde\x9b\x7e\xca\x3b\xff\x8b\xf7\xbf\x79\xff\xd5\xfb\x3f\xbd\xff\xcb\xfb\x7f\x36\xae\x76\xf7\x7b\x4b\x2f\xbc\xfe\xf4\x66\xff\xfa\x36\xa5\xf3\x27\x74\x7c\xf7\xe9\xc3\xc3\x53\xb9\xe0\x0d\xd0\xd2\xfe\xf2\xfd\xd5\x6a\x7a\x1f\xd7\x10\xf8\xe3\xf1\xc3\xc3\xeb\x3f\xae\x5f\xdc\x07\x34\xb8\x70\x0d\x0d\x69\x26\x92\x08\xea\x39\x3c\x7b\x19\x63\x49\xa8\x42\xdc\xd4\x5c\xc4\xba\xe2\x8a\xa1\x8c\xfb\x66\x11\x5a\x29\xe4\x29\x50\xee\x5b\x17\xaf\x61\x79\x1c\x27\x7e\x1f\x97\x45\x62\xb1\xc4\xe9\x41\x63\x41\x05\x23\x38\xcb\x58\x26\xb3\x30\x89\x93\x22\x15\x45\x8e\x93\x58\xc6\x72\xa9\x21\x06\x45\x90\x42\x8d\x5f\x2d\x2d\xe4\x28\x22\x84\xcc\x84\x10\x48\x24\xce\x74\x88\xf0\x14\xc6\xc6\xc6\x75\x13\xb6\x9d\xe7\x79\x7f\x7d\xe1\x89\xa6\x4f\x68\x53\xff\xc3\xa5\x66\xe9\xbf\x78\xff\xbb\xf7\x7f\x78\xff\xcd\xd5\x1e\x3a\xae\xf8\x4f\xd7\xdb\x94\x1b\xae\xf8\x57\x5f\xfe\xec\x02\x74\xf7\xea\xc3\xc3\xeb\xb7\xbf\xf0\xb3\x5d\x13\x96\x76\x89\xe3\x4a\x05\x93\x5a\x2a\xd4\xba\xae\x7f\xf7\x34\x61\x66\xa0\x8e\xb2\x04\xcd\x31\xf4\xa5\xfb\x15\xe8\xe8\x1b\xff\x38\xc9\x88\xd1\x4c\x46\x7e\x2a\x25\x84\xc8\x32\xe8\x19\x74\x5c\x3d\xf6\x32\xec\x2a\x22\x43\x3f\x97\x12\x52\x24\x19\x0c\x0c\x7a\xae\xc9\x77\xfe\xfd\x82\xab\x48\x02\x7d\x48\xbd\xb7\xee\x9c\x5e\x0f\xe4\xf7\xaf\x2f\x5d\x3f\xb7\x89\xca\x0f\xf7\xd7\x74\x86\xf6\x7b\x69\xf3\x6c\x28\x98\xc0\x59\x47\x38\xc1\x09\x21\x39\x8c\x48\x18\xc3\x18\x15\x74\x39\x1d\x52\x7d\xaa\xb2\x5c\xd7\x96\x48\xb9\x84\x92\x46\x65\x4c\xfd\xd5\xd1\x60\x39\x56\x95\xcb\xa1\x50\x97\xaf\xc8\xbc\xbf\xf2\xfe\xee\x76\x97\x43\xd7\xcc\xeb\x5d\x74\x74\x65\x92\x02\x91\x24\x37\x45\x8a\xe8\x63\xe3\x6b\x41\x12\x55\xe3\x66\x14\x0d\x3a\xed\x13\x29\x52\x69\xcd\xe7\x3e\x2f\x2c\xc3\x24\xc8\xa0\x04\xde\xab\x1a\x59\x64\x2e\xbc\xcc\x38\xd0\x07\xbe\x61\x86\x1f\xf6\xae\xe6\xf9\xe1\x9a\xc1\xfb\x5b\xf4\x63\x90\x92\x01\x06\x3f\x32\xe5\x18\x62\xaa\x0a\x82\xf8\x81\x1b\x9c\x82\xd6\x9f\xc7\x5d\x02\x09\x88\x9a\x2b\xd4\xfa\x29\xea\x33\xd7\xab\x55\x04\xfa\x20\xbd\x1f\xdd\x9e\x77\xc5\xa5\x79\xca\x46\xed\xdf\xfd\x0b\xfa\x70\x55\xd3\x6a\x2c\x1c\x15\xd6\x79\x00\xb1\x2c\xd6\x03\x81\x97\x30\xe5\x75\x6f\x4a\x66\x34\xcd\x96\x13\x8a\xa0\xdd\x73\x14\xc1\x64\xe0\x64\x22\xa8\xa4\x94\x4a\x8a\xd9\x18\x36\x45\x5a\x48\x21\xeb\xce\x6c\xf5\xb1\x01\x71\x3d\xee\xc5\xd3\x09\xf1\x0f\x57\x84\xa7\xc3\x46\xb4\xf8\xf1\xd3\x77\xd9\x2b\x82\x32\x18\x81\x47\x31\x32\x8f\x02\xd1\x38\x02\xd6\x5c\x49\x64\xd6\x87\xa9\xf2\xc4\x3a\x3f\xeb\x4a\x5e\xb6\x87\xc2\x50\xba\xee\x28\x94\xae\x9b\xc9\xb6\xab\x58\x66\xb8\xc1\x92\x0a\xa5\xa8\xe7\xa1\x00\x9f\x87\x5d\x7f\x88\xbd\xbf\xde\x2a\xca\x9f\xf2\xe5\x01\x36\xc3\x40\x29\x56\x15\x3b\xc4\x10\x9b\x25\x2c\xb0\x12\x9c\x6f\x7d\x0a\xf9\x9e\xec\xba\x6f\xec\x85\xee\xdc\xff\xf4\xf0\x5d\x2e\x8c\xc6\xb7\x30\xc7\xf3\x52\x77\xd1\x5c\xb9\xfe\x98\xcb\x13\xa9\x82\x0b\x8e\x34\x2b\x54\x4e\x77\x9d\xb4\x8f\x5d\x90\x5b\x50\x02\x4a\x01\x95\x38\x7b\x69\xc5\x28\x95\x5c\x10\x29\x2e\x36\x87\x03\xbe\x6b\x2e\xf9\xf8\x0b\x62\xce\xc5\x07\x3d\x1e\x8e\xef\xbc\xbb\xe0\x8d\xbf\x7a\x4d\xb5\x65\x85\x92\x55\x94\x94\x52\x70\x19\xf3\x9a\x22\x7a\x32\x31\x53\x64\xd7\x80\x61\x9c\x55\xca\x28\x6b\x6c\xa5\xd2\xc1\x6a\x94\xa3\x1e\x79\x09\x8c\x3d\xee\xdc\xbb\x72\x77\xb5\xbb\xce\xfb\x6b\x2f\x72\x98\x93\x7f\xbf\x5a\xcc\xd3\xbe\xff\x8b\xaf\x2a\xdf\xe5\x90\xa5\xa8\x79\x14\x28\x8f\x23\xc8\xe7\x5b\xfc\x77\x21\xca\x91\xf5\xbe\xd7\x37\x45\xd7\xee\x3a\x23\x1e\xcb\x80\xe5\x39\x58\x37\x63\x2b\x61\xa6\x02\xeb\x8c\xe4\x6b\xa4\x77\x5d\xdb\xbb\xf1\x66\x6d\xdf\xff\xf2\xda\x36\x7e\x2b\x6d\x9a\x20\x2f\x77\x8b\x1b\x33\x46\x13\xc6\x32\xe8\x11\x93\x92\xe3\x82\x53\xf0\x76\xa3\xaa\x64\x92\xea\xca\x10\x21\x97\x52\x90\xd8\x26\xd4\xcf\x35\xc3\x3c\xcb\xc9\xfa\xae\x03\x7e\xce\x8f\xe5\xee\xf4\x5b\xe6\x5f\x06\x03\xb0\x02\x95\x8f\x0d\x8a\x92\x18\xf8\x78\x6d\x20\x5c\x9f\x42\x98\x9e\xb7\x7e\xd2\x94\xc2\xd4\xbb\x93\xd6\x8f\x3a\x90\x05\x06\xa1\x5c\x33\xb6\x84\x89\x4a\xac\x33\x5a\x60\x45\xb1\x77\xd8\x55\x17\xbe\x82\xad\x26\xf1\x9f\x1d\x0b\x87\xab\x29\xbf\x96\xff\x3d\x43\xe0\x7c\x3a\x6e\x37\xf8\xf7\x77\xef\x3f\x1e\x5f\xdf\x7f\xd8\xbf\xbe\xff\x10\xdc\x9c\xc8\x9f\x7e\xff\xfa\xf8\x3f\xbd\xdb\xd7\x26\x41\x19\x60\x07\x23\xeb\x45\x5c\xa5\x24\x66\x69\x96\x84\x49\x92\x91\x38\x8e\xc0\x93\x71\xe8\x4a\x19\x52\x99\x47\x34\xca\x66\x16\x15\xbc\x98\x12\x1e\x1d\x64\xa2\x96\x52\xac\x5b\x76\x1f\xeb\x28\xa7\x91\xe4\x49\x56\x54\xbb\x82\xb4\x4a\xcd\x4a\x3d\x76\x4a\xc5\x5a\x86\xf1\xd0\xe4\x4d\x6d\xab\xa8\x93\x9e\x87\x7c\xe2\xce\xa9\xad\x7f\xde\xdd\xf7\x47\xfe\x45\xe6\xdf\xbd\x7a\x6a\xc8\xf5\x67\xaa\x26\xae\xd3\x2c\x29\xd2\x3c\x0f\xf9\xd9\x53\xc8\xa3\xfb\x7c\xdd\x7c\x3e\x2b\x28\x23\x13\xa1\x38\xa8\xa0\x5f\x38\xf0\x35\x08\xc9\xd1\x1a\xa1\x91\x33\xf6\xbb\x1b\x7e\x96\x0b\xc5\xfe\x2b\x77\x5e\x7d\x78\xea\x20\xbc\x7b\x78\x7d\x25\x48\x59\x25\x40\x93\xc1\x8c\x6b\x56\x0f\xe3\x68\xfa\xbe\xef\x15\xa5\x05\x8c\x84\x8c\x18\xb1\xe5\x84\xa6\x52\x8b\x12\x85\x7e\x32\xe8\xbe\xd7\xc3\x32\x26\x92\x2b\x8e\xec\x85\x96\xc5\xdb\xf9\xc2\x23\xae\x96\xe1\x89\x9f\x06\x7d\xc1\x4f\xe3\x6e\x93\x6f\x4b\x6a\x37\x40\x2e\xbf\xf2\x23\x57\x28\xb3\xba\xb4\xb6\x81\x51\xa0\xb8\x84\x0e\x75\xcb\x34\x5c\x5b\xb6\xcd\xd8\x88\x7a\xd8\x8f\x65\x69\xca\xe5\xb4\x34\x7e\x0a\x63\x65\x74\xef\xc7\xe5\x32\xcc\xf3\x0c\x99\x2c\x65\xe5\xf6\x83\x5d\x74\x2e\x8e\x76\xd7\x79\x7f\xe3\x2a\x0f\xdf\x1c\xef\x5f\xff\xb0\x39\x42\x2e\x23\xe3\xf0\x00\xdf\xb8\xdc\xd2\x4f\xbb\xde\x26\x7e\x4a\x72\x55\x24\x40\x32\xac\x15\x4a\xd9\x28\x10\x33\x91\x46\x89\x18\x77\x5d\xdc\x98\x68\x64\x44\xaa\xd2\x14\x28\x59\x0c\x9c\x3a\x85\x12\xbf\x08\x4b\x01\xaa\x31\x8d\x8b\x8b\xf8\xb9\xd8\xc5\x3b\x7b\xd5\xf7\xab\x6f\xf1\xe1\x5c\xd6\xe7\x4d\x45\x6a\x85\xa4\xb9\x62\x97\xd7\x9a\x73\x6e\x4c\xcb\x27\x35\xa1\x1c\x74\xef\x70\xca\x77\xa9\x10\x5a\x40\x11\x0b\xae\x19\x01\x8b\x6c\x27\x95\xee\x51\x2b\x80\x34\x8d\x1b\xdb\x71\x4e\x54\x37\x5c\x38\x37\xd5\x9f\x4f\xb8\x6a\x5f\x51\xf1\x04\xc3\xb5\x48\x88\xce\x6a\xa0\x83\xb6\xba\xe5\xad\x1c\x11\x05\xd5\x35\x0d\x22\xcd\xbe\x69\x5b\x57\xea\xd9\xda\xaa\x41\x6c\xd1\xbe\x01\xd3\xe8\x0a\xe1\x4b\x89\x27\xcc\x28\xf4\x3c\x7f\xdf\x9c\x8b\x23\xdd\x0d\x6e\x4f\x58\x2d\xf9\x79\x03\x5a\xed\xea\xd0\x19\x4c\x9c\x27\x91\xc0\x64\xcc\x6e\xf8\x9c\x4b\x1a\xda\x90\x05\xa7\xc7\x7a\x95\x1f\xcd\x67\xbc\x97\xbb\xe9\x17\xb9\x84\xbe\xd6\x9d\xcf\x50\xae\x9d\x69\x44\x30\xf5\x9a\x4a\xad\x55\xcb\x66\x3d\xa3\x18\xba\xca\x18\x14\xeb\x1d\xb5\x56\x5b\xc8\x89\x14\x4a\x32\x68\x90\xac\xb4\xb2\x1d\xea\x2c\xa4\x4e\x79\x81\x4f\x2f\x7c\x4a\xd7\xb1\xbf\x5c\x19\xef\x5e\x2c\x9c\x57\x97\x75\xe2\x9b\x49\x9f\x4e\xe3\x68\x38\x25\x44\x63\x21\x8c\x68\xc6\xc9\x52\x3a\xd2\x7d\xb5\xad\x0c\xac\x94\x92\x14\x62\x3f\xac\x8d\xb0\x28\xf2\x93\x61\xd1\xd7\x75\x12\xec\xf8\xa5\xb7\x2f\xf2\xfe\xce\xdd\xba\x5e\x4a\x78\x2e\xa0\x2c\x87\x63\xf0\x3e\xf2\x5d\x2b\xcc\xef\xb6\xb0\xeb\xc8\x2c\x94\x76\x88\xe1\xe4\x0f\x30\x86\x91\xb4\x45\x63\x85\x29\xf3\x51\x48\xc9\xf5\x3e\xfc\x3c\x05\xea\x51\xee\xe2\xd2\x18\x42\xa0\x03\x0f\xba\x99\x6a\x3c\xa2\x10\x26\x55\xa9\xca\xdd\xc1\x07\x48\x9e\xf3\xdd\xb7\x6c\xe5\xfd\xdd\xc3\x57\xd3\xbd\x7f\x9a\x6e\x88\x42\xb3\xbe\xef\xe9\x64\x04\xa3\xc4\xc8\x96\x4d\xba\x9f\x60\x2e\x39\x9f\xd9\xbe\xab\x6b\x5d\x2f\xb6\x2a\x55\xa5\x96\xda\x4f\xc7\x46\xf6\x28\xf6\x79\xbd\x6c\x14\x1e\x74\xab\x73\x5a\x75\x5d\xfd\x0a\x67\xd4\xe1\xf8\xee\xc7\x2f\x38\xa3\x3a\x94\x6e\x8a\x8b\x60\xaa\x15\x15\x5c\xcb\x86\x23\x4f\xcd\x28\x82\xa1\x52\x0a\x85\x7a\xdf\x57\x95\xae\x96\x81\x18\xad\xb5\x58\x3a\xbf\xe8\x2b\xb5\x8a\xe0\xd8\xab\x5c\x77\x95\xbb\xa3\xc2\x41\xff\x3c\xfe\x37\xd7\xa8\x5b\x28\x2f\xf8\xb3\xdc\xe5\x14\x81\x7a\x35\xb5\x56\x73\x21\xac\x29\x45\x5f\xc2\x84\x0a\x28\xdb\xb2\x44\x79\x79\x29\x8a\xee\x0b\xad\x8d\xe6\x10\xf9\x09\xcc\xa5\x6c\x50\xee\x67\xeb\x42\xd9\x58\xa3\x02\x97\x93\xca\x7e\x65\xfc\xc3\x37\xc6\x37\x5b\xcd\x19\x83\x72\x28\xb9\xd6\xd6\x0c\xe2\xd4\xc0\x80\x18\x88\xce\x91\x7a\x5c\xc7\xcf\x8d\x36\x86\x43\xe8\xe7\x73\xf7\xe5\xf0\x5e\xe0\x0f\x97\x3e\xf2\xaf\xf7\x89\x7b\x07\x00\x78\xd9\x9e\x2f\xc3\x5f\x6a\x40\x03\x8c\x3a\xeb\xe0\xdf\x4b\x90\x0d\x4a\xe9\xa9\xb1\x2d\x4c\x1c\xe1\x1e\x34\xb2\x90\x77\x97\xae\x56\xef\x22\xc5\x00\x4d\x59\x59\x94\x2c\x93\x9f\x42\x5f\xe9\x1a\x31\x3f\xed\x96\xf2\x69\xbf\x58\xf7\x4a\x5f\xb9\xbb\x38\x87\x98\x19\xdc\xfb\xc1\xcd\x95\xef\xef\x5e\x3d\x7c\x78\xff\xea\x77\xaf\x1e\xfc\x23\x4a\x75\x86\xbc\x58\x2b\x9d\xa4\x94\x53\x89\x99\x28\x32\xae\x0c\x8d\x55\x96\x1d\x64\x02\xe5\x82\xa1\x3e\x71\x42\x8c\x90\xb2\xae\x2c\x8a\x51\xae\x1f\x4b\x14\xa2\x1e\xfa\x79\x8d\xd3\xeb\x73\xee\xea\xe2\xaf\xb8\xc3\x2e\xf3\xb2\xe1\x22\xfc\xe0\xdc\xd3\xfb\x0b\x68\xcc\xf7\xdc\x96\x7d\x67\xa2\x04\xe5\x8c\x2d\x1d\xca\x8a\xac\x2f\x08\xd7\xe9\xe6\x07\x6c\x4f\x28\x64\xc9\x0c\x92\x5a\x08\x26\x0f\x32\x21\x58\xa6\xed\x23\x0b\x4a\xae\x14\xe5\xe5\x32\x68\x10\x06\xb8\x81\x86\x5a\xa6\xb0\xa6\x52\x69\xe6\xf0\xb5\x56\xd9\xac\xbb\xd7\x4d\xae\x67\xb4\x2b\xe3\xbb\x4a\xe4\x4e\xad\xa7\x9d\xc0\xdf\x0a\x4a\x8e\xeb\xff\xc9\xa0\xb8\x48\x1a\xcc\x58\x49\x6c\x81\x22\xd6\x99\xa2\xd2\x54\x9a\xac\x93\x42\x30\xb5\xc3\x8f\x32\xf0\x16\x2f\xd0\x52\x2a\xca\x1b\xe4\x25\x95\x48\x07\x38\x41\x01\xd3\x88\x45\xd1\x4e\xbd\x2c\xc5\xc6\x13\x1a\xf8\xe1\x99\xec\xfa\x03\xfb\x6a\x5d\x7e\x73\x0f\x7c\xde\x14\x0a\xe4\x99\xf5\xdd\xaf\xdb\x20\x23\xd8\x50\xc5\x7a\xda\x8f\x67\xaf\x64\x6c\x62\xfb\xc6\x2d\xc9\x96\x69\x65\x14\x83\x04\x0d\x6d\x29\x4f\xeb\xb9\x59\x2d\xa5\x83\xb6\xca\xd6\xf7\xa3\xce\xb9\xeb\x2f\xf9\x4e\xec\xf3\xfe\x0b\x87\xf2\x36\x7a\xd8\x55\xfe\x08\x43\x18\x21\x6f\xa9\x9a\x28\x84\x53\x7f\x1b\x41\x84\x92\x5b\x6e\x51\xa9\x88\xc6\xea\x90\x69\xb2\x85\x3e\xe4\x39\x53\x67\x48\xe5\x88\x34\x34\xd1\x0e\x73\xd3\x8f\xce\x78\x67\x0f\xe9\xc5\xa3\x3d\x1c\xdf\xbc\x7f\xfd\x43\xf0\xa5\x4b\xfd\xf0\xe1\xfd\xd5\xa5\xf6\x33\x3f\x63\x26\x9f\xa4\xcc\x12\x59\x10\x4e\x13\xc6\xa3\x61\xa2\x94\xe7\x29\x2b\x40\x1e\x52\x33\xb6\xd8\x64\x30\x63\x21\x97\x48\xd3\xa4\x4c\x98\xdf\x5b\x4e\x45\x96\xbb\x46\x7e\xe4\x47\x5e\x12\x34\xbb\xf6\x12\x6f\x5d\x6a\x1c\x0e\xc7\x77\x7e\xe4\x16\x8c\x12\xb1\xed\xf0\xae\x85\xc1\x2c\x7d\x96\xeb\x4b\xcd\x68\xe8\x89\xd5\xdf\xd8\x87\x2f\x32\x8a\x0e\xcb\xf2\xd5\xfb\xd7\x3f\x7e\x7a\xb3\xdb\x5f\x49\xdb\xb6\xf2\xb7\x37\x97\x3c\xde\xeb\xcb\xb3\x8d\xf5\x0f\xe8\x59\x9b\x9d\x41\xe4\x44\x61\x02\x55\x28\x94\x90\x58\x26\x12\xec\x89\x97\xbe\x5a\x94\x71\xd9\x9e\xcb\x03\xd6\xf8\xd3\xa3\x1a\x94\xd4\xd2\xfa\x91\xc4\xba\x10\xfb\x50\x66\x05\x2f\xb2\x30\x89\x53\x92\x28\x9c\xe3\x7a\x69\x91\x2d\x86\xbc\x2f\x10\x5b\x5a\x19\x61\x89\x45\x41\x08\x25\x94\xb8\xfc\x59\x7c\xce\x8f\xd5\xae\xff\x0d\xf9\xb3\x3c\x48\x9f\xf3\x67\x6d\x7b\x5b\x78\x8e\x64\xad\x99\x29\x47\xa1\x6a\x56\xee\x7a\x2d\xd7\x20\x4a\x82\xd6\xa0\xd5\xfa\x75\x22\x4c\x0a\x4a\x5d\x24\xe5\x1d\x3c\xe9\x55\x47\xbd\x3b\xbd\x94\xe1\xd5\x53\x2c\xf3\xc9\x91\xdb\x5d\x35\xb6\xe5\x61\xdf\xee\xf6\xc7\x1f\xdf\x96\x87\xf6\xb1\x89\xfd\xfa\x67\xed\xa7\xf1\x92\xa2\x6c\x87\x3f\x37\xd7\x07\x11\x02\x33\x50\x8c\x4a\xbf\x43\x14\x91\x0c\x6a\x68\x76\x27\x59\x2c\xda\x97\xc5\x5c\x9c\x8a\xb1\xe8\x18\xcd\x44\x56\x64\x54\xd0\x6c\xab\x49\x9e\xcf\xf4\x18\x7a\x27\x97\x81\x75\x78\x86\x6f\x2f\x39\xa6\x37\xf7\x1f\xee\x6f\x3f\x1f\x43\x87\x05\x81\x4a\x60\x30\x3e\x7d\x3c\x81\x48\x53\x64\x4e\x42\x5e\x3f\x78\xc8\x17\x5e\xbc\x8b\x0f\x91\xb3\xad\x17\x14\xd3\x1e\xa7\x85\xae\x98\x41\x71\xd0\x2e\x71\x81\x25\xe7\x7c\x6f\xa0\xd8\xb0\x25\x82\xe9\x17\xf3\xe6\xf7\xdf\x0f\xf1\x76\x71\x20\xc0\x26\x88\x2c\x1e\x0a\x13\x28\x5d\xc7\xd0\xf5\x29\xb8\x3c\x15\x2d\x1a\x95\x12\xa2\x7c\x4e\x6e\x26\x5b\x7e\xb3\x82\x4a\x68\x66\xb0\xe2\x4a\x28\x87\xcd\xbf\x47\xc3\x59\x1e\xc2\xc0\xbc\xec\xd1\x7b\xfd\x3d\x0e\x93\x3f\xa0\x9b\x16\x2f\xd7\x7f\x36\xed\x22\xe8\x50\x0c\xcc\xb9\xb9\xdd\xe7\xfe\xd2\x0e\xc7\x56\x0f\x11\xb5\xc6\xe1\xd6\xc5\x46\x9b\xc0\x48\x0e\xea\xca\xaa\x83\x14\xe7\x1c\xb4\xcb\xc8\x39\x7d\xe0\xb3\x3a\xda\x03\xbe\xc1\xaf\xbf\x91\xc4\xe5\xe8\x3f\x3c\xbc\xbe\x72\x4c\xbe\xdf\x18\x00\xdf\x5f\xe5\x74\x58\xc6\x62\x17\x42\x8f\xe2\xc7\x14\x25\xd0\xf9\x58\xc1\x49\x6b\x14\x2b\xa3\x1e\x07\xa4\x4b\x77\xba\xf7\x9f\x6b\x34\x82\x3c\x60\xd3\xae\x86\xd2\xb6\x6d\x0b\xf1\xe6\x3d\xad\xcf\x52\x18\x63\x60\x36\x66\x3d\x42\x1d\xcf\x29\x0b\xa6\xdd\x70\x23\xd3\x3f\x6d\xb6\xfb\xda\xe5\x5c\x9e\xb5\xf1\xfe\xaa\x8d\xeb\xae\xbe\xdd\xc5\x7d\xb8\x37\x01\x3b\x7b\xd3\x63\x3b\x9d\x3d\x24\x24\x54\x42\x8c\x52\x8a\x85\x20\xec\xaa\x85\x50\x11\x83\x86\x34\x46\x0a\x9a\xdd\x60\x24\xe4\xa8\x93\x52\x42\x3e\xac\xbf\x20\x16\xc2\xd4\x99\xc6\x99\x4d\x5b\x57\x0f\x79\x26\x6e\x3d\xdf\xda\xca\x2d\xc7\xf9\xdd\x7d\xb0\x59\xe0\xc6\x96\xf0\xd3\xbb\x5d\x12\x64\xcb\x29\x41\x36\x4b\xa2\xd0\x84\x44\xc9\x1c\x46\x26\x45\xd2\xd9\xa2\xd4\x88\x17\x99\x4a\x8b\x5d\x6f\xc6\xc7\xb6\x48\x44\x6a\x58\xc1\xfd\x7e\x89\xe3\xd4\x64\xb1\xd8\x29\x88\xa4\xc9\xed\x16\xeb\xa5\x6e\x6c\xfd\x17\x8c\x8d\x83\x6c\x19\x13\x64\xd2\x38\x0a\x75\x84\x99\xc0\x70\x62\x42\xc4\xed\x7a\x8e\x22\x5a\x64\x32\xcb\x77\xda\x4c\x8b\x97\x65\x2c\x29\x69\x9e\xfb\xed\x22\xe2\xd4\xe4\xb1\xd8\xe5\x90\x56\x5d\xde\x3b\xdb\xf0\xf4\x99\xed\xbc\x5d\x79\xf3\x1e\xfe\xd3\x5f\xf2\x1e\x3e\x7e\xfa\x70\x6f\x03\xbe\xbd\x08\x98\x91\x72\xc8\x63\x27\x21\xc5\x82\x11\xd9\x88\xe6\x48\x0c\x0a\xd2\xa4\x6b\xa0\xde\x95\x9a\xaf\x2f\x62\x35\x50\xbc\xbd\x88\x84\x73\x6d\x33\x4d\x32\x1b\xc5\xf5\x86\xbf\x72\x3a\xab\x63\xf9\x6f\xb2\xd7\x6c\xb7\x0e\x9c\x3e\x7a\x28\x81\xc6\x17\x76\xb3\x57\x6b\xcc\x63\x89\xac\xc3\xf9\xf6\xc3\xcf\xd8\x8f\x80\xff\x99\xf6\x1a\xd4\x9e\x39\x9a\x03\xfe\x5e\x1f\xe9\xab\x97\x7d\xa4\xae\x97\xf4\xab\x3e\x52\xbd\x24\x52\xf1\xc1\x67\x5b\x1f\x69\xb6\x44\xa8\x38\x7b\xc8\x9b\x94\x10\x93\x80\x72\xfd\x7a\xc0\x1a\x12\xa0\x40\x29\x22\xa8\xf2\xf9\xd9\x5b\xb0\xdb\x52\x84\xe2\xc8\x56\x55\x05\x45\xb5\xc5\x42\x07\x8f\x9f\x65\x30\xbd\xd0\xd3\x76\xa3\xfd\x70\x79\x77\x17\xcc\xda\xcd\xdd\x59\x7f\x6f\x17\x22\x9f\xee\x9e\x09\x66\x3f\xea\x80\x4e\xa7\xc7\x66\x9a\xd1\xc8\x4e\x8c\x9d\x98\x66\x3a\x06\x09\x49\xd2\xd7\xab\x23\xe2\x9a\x5d\xda\x03\xd6\xcd\x52\xf9\xb4\x69\x9a\x06\xb2\x67\x37\xe5\x31\x33\x0c\x97\x71\x82\x42\x6d\xad\x9e\x92\x2b\xf6\x90\xdc\xf1\x6f\xc8\xf5\xdd\xf7\xf7\x0d\xb9\xd8\x2e\x5c\x23\xe3\x47\x8a\x42\x68\x7d\x2c\x61\x96\x12\x85\x52\x2b\x15\x03\x59\xa6\xe4\xd4\x81\xba\x24\x00\xfa\x3f\x5f\xba\x03\x9a\xcf\xca\x61\x33\xfe\x66\xdb\xf2\xc9\x3e\x05\x8e\xe8\x67\x82\x18\x70\x7f\xee\xa0\x74\x31\x8c\xed\x3e\x0f\x7e\xb8\xf5\x4a\xe9\x9f\x89\x6f\x96\xf9\x80\x4d\xb3\xda\x96\x93\xeb\xd6\xb6\x72\x6b\x9f\x6d\x6b\xe7\xf5\xae\x66\x3a\xbe\x74\x6c\x65\x97\xfe\x8b\x2b\x62\xe7\x76\x82\x5e\xd8\x19\x82\x27\xee\xf6\x97\x05\xa6\xf5\x52\xfb\x64\xa9\x7d\xb6\x94\xc6\xa0\x16\x0a\x7f\xf4\x4f\x4b\xec\xd3\xa5\x8a\xfc\x89\x69\x3e\x15\x30\xd5\xa6\xcf\x24\xe7\x05\x65\x46\xf1\xa5\x0b\x62\xb0\xeb\x99\x51\x06\xed\xc8\x14\x54\x92\x41\xaf\x15\x4d\x62\x9d\x16\x45\xaa\xe3\x24\x2b\x28\x29\x72\xc7\x0b\xea\x1b\xd7\x47\x9d\x5e\x64\xfc\xe7\x17\x32\xde\x3d\xdc\xbd\xba\x30\xf2\x7f\xb8\xc2\xb0\xdd\x3b\x2c\xdb\x9b\xb0\x68\x57\x83\xbc\xde\x41\x5b\x3b\x4d\x68\x74\xbc\x5c\x16\x78\xa6\x24\xce\x80\xfa\x04\xb3\x51\x72\x61\x4e\x59\x2b\x85\x3a\xa4\xcb\xa9\x34\xa5\x81\x71\x6f\x41\x20\xcf\x40\x68\x86\x05\x13\x26\x95\x31\x9d\xee\x95\x60\x96\x2a\xa2\xd8\xc6\x1b\xbf\x71\x18\x24\xbf\x2e\xdf\xfa\x96\x5f\x80\xe8\x5f\x54\xb8\x57\xeb\x8e\xb1\x21\x9e\x5a\x5b\xd7\x48\x3b\x3c\xa4\x35\x6e\x1f\x62\xb3\xba\x18\x98\x29\x66\x09\x29\x54\x9a\xe3\x18\xfa\x43\xb2\xe8\xd1\x8c\x06\xd4\x61\x58\xdf\xae\x59\xac\x41\x78\x29\xc1\xc0\x28\x98\xa6\x52\x52\x4d\x95\xed\x69\xa5\x6c\x77\xed\x71\x0e\xf4\x41\xb8\x7c\xaf\xf7\x8c\x71\xf5\xda\x45\x29\xef\x5e\x38\xe9\xae\x30\xf7\xee\xc3\xc3\xba\x8f\x6c\x89\xff\x7a\x2e\xe7\x19\xa5\x25\x27\x9c\x60\x96\xe7\x49\x5e\xa4\x6c\x54\xc3\x80\xb2\x39\x52\x11\x56\x78\x6f\x87\xc1\x8c\xa6\xb7\xda\x74\x50\x28\x1a\x57\x09\x0b\x88\x5e\x1a\xd0\x1c\x51\xdf\xd3\x66\x84\x38\x81\xd3\x54\xcc\x1b\x8e\xbc\xab\xcd\xfb\x37\xe9\x8c\x6c\x25\x24\xeb\x63\x6d\x55\x21\xeb\xae\x0c\x57\x2d\x8e\xb1\x25\x4a\x70\xc2\x0c\xb5\x94\xe4\x32\x5b\x75\xd6\xfd\x82\xce\x4e\x92\x69\x26\x9e\x75\x56\xb6\x6e\x6d\xac\x31\x3f\xdb\xd5\x17\x19\xdf\x7f\xb9\x36\x5e\x7d\xb9\x36\xde\xfc\x3d\x7a\x29\xe6\x1f\xb7\xe5\xd1\x3a\xc2\xe4\x6c\xe9\xb7\xce\x5c\xbf\xf5\xe7\xc5\xf3\xf9\x52\x86\xfe\xc4\x4b\x92\x28\x56\x9c\x4a\xd3\x65\x56\x08\xc9\x99\x8d\x6c\xbe\x34\xbb\x1a\xbc\xca\x54\x66\xde\x73\x30\xa3\x86\x42\xd7\x40\xcc\x64\xb2\x30\x8d\x4d\xce\x79\xa1\x33\xcc\x2a\x5e\x8a\x46\x5e\xb0\xce\xf3\xa3\xdd\xf5\xdf\xd7\xe7\x87\x27\x7d\x06\xf7\xdf\xaa\x13\xdf\x19\xd0\x57\xec\x1a\x63\x4e\x27\xb7\x46\x3a\x54\x01\x4b\x7c\x96\xd4\xa2\x15\x95\xe2\x3d\xeb\x98\x4c\x74\x42\x79\x02\x74\xd7\x2f\x73\x69\x2a\x05\xa7\xbd\x04\x7d\x32\xcb\xa8\x50\xb2\xcc\x30\x74\xb4\x50\x05\xa7\xd4\x14\x44\x9b\x54\x70\x79\xe1\x8f\xc3\xe7\xc2\xef\x0e\xc2\xfb\xff\x7b\x9e\xc3\x2d\xbe\x7b\xba\x24\xbb\x40\xde\x7e\xba\x5b\x83\xf7\xdf\x8d\x3a\x8a\xa9\x55\x2a\xcf\x53\x6b\xe7\xa2\x32\x32\xcb\x24\x3b\x24\xb9\x92\x8e\x0f\x15\xf2\x24\xd5\x62\xa1\x3e\x51\x16\x13\x3f\x69\x2d\x46\x85\xb7\xf3\x4f\xff\xe6\x75\x18\x81\x70\xfe\xae\x04\x6d\xed\x3c\xa3\xde\x65\xd5\x05\x18\x3f\x4f\x2a\x66\xb8\xe2\xbc\x64\x15\x13\x58\x16\x94\x25\x20\xbf\x6b\x53\x12\x26\xbe\xad\x43\x43\xa4\x1d\x68\xab\xab\xc1\xd9\x7d\xfc\x6f\x96\x31\x05\x7d\x0d\x27\xad\x1d\x47\xd4\xf8\xe1\x32\xaf\x7f\xf3\xd3\xa4\x62\x9a\x4b\xce\x2d\xb3\x9c\x61\x99\x13\x96\x80\xfe\x15\x19\x57\xbb\xdf\x64\x6c\x74\x39\xb8\x7e\xf4\xe6\x8c\x8f\x64\x37\x5e\x50\xa7\xaf\x9c\x53\x4f\x39\x96\x37\x17\x71\xf7\x37\x91\xd5\x35\xa2\x39\x92\xf2\xe7\xaa\x9c\x77\xd5\x67\xba\x3e\xfb\xc8\x7e\x6e\xad\xdd\x15\x6b\xbc\x72\x79\xc6\x65\x5c\x77\x5e\x3f\x19\x05\x15\xf4\x71\xc8\xf3\x20\x1d\x28\xb8\x3f\x1b\xdf\x9e\x76\x3c\xd0\xc5\xf7\xc6\x7f\xf5\xc5\xf8\xb7\x11\xd5\x11\x9b\x85\x99\xee\xda\x70\xe5\xb7\x66\x19\x8d\xb9\x32\xd3\xad\xcf\xa1\x58\xb0\xfb\x51\x03\xb3\x54\x4a\x3d\x86\x84\x04\x33\xcc\x0e\xf2\x9a\xeb\x75\xfc\xec\x8c\x8f\xfc\x37\x8e\xcf\xed\xe3\x6c\xc7\x35\xf0\x77\x50\x9a\xb1\x5d\xb4\xb5\xb7\xfd\xe6\xb7\xe3\x2b\xa9\xe4\xa3\x47\xc8\xce\x83\x49\x83\x50\x20\xd6\xf1\x3d\xeb\x6a\x53\x7e\xd3\xf8\x3b\x5a\x2e\xd2\xf6\x4f\x13\x6e\xec\x97\x4d\xd4\xbf\x3e\xfe\x85\xa7\x9d\xfc\xa6\xf9\x33\xbb\xe4\x76\x72\x83\xad\xe3\x0f\x66\x51\xd6\x5e\xd5\xb1\x3e\x07\xb2\x50\xf7\xe3\x0a\x4e\xdb\xf8\x18\xaf\xe3\x2b\x90\xcf\xf3\x27\xbb\xe2\x69\xfe\xd7\x2c\xcd\x37\xc6\xff\x6a\xf6\xc5\xaa\xee\xce\xe1\xca\xac\x4f\xb5\xf0\x97\xe8\x03\xcf\x93\x3f\x7b\x4a\x29\xf9\x28\x78\x30\x9f\x3d\x09\x7a\xfd\xe3\x70\x6e\xbd\xd3\xb1\x0c\xac\xf7\x7a\xf5\x1a\x5d\xe4\x73\x7f\x01\x56\x7f\xd8\xba\x5e\x95\x3f\xa5\x91\x09\xe3\x40\x2c\x73\x8f\x08\x01\x36\xcd\xbd\x2b\x27\x6b\x17\x13\xc4\x45\x91\x64\x99\xa9\x68\x69\x50\x34\x6b\xcd\xac\xab\x8f\x38\x05\xbd\x3f\x7b\xff\x61\xf3\x44\x6f\x3a\x71\x02\x0f\xba\xda\x64\x50\x42\x8e\x11\x83\xc1\x9f\x0d\xd8\x34\xd3\x8a\x97\x04\x19\xcf\x43\x3b\x72\xce\x8f\x24\x08\xdd\xed\xd0\x97\x7d\xcb\x47\x42\x08\xb3\x49\x55\x64\x50\x94\x41\xb8\x54\x94\xc6\x26\xca\x50\xfd\xd8\x06\xbd\xb7\xdf\xc5\x67\xea\xb0\x01\xde\x3d\x55\xf1\x5c\x3b\x8e\x6f\x8f\xfb\xbb\x1b\xea\xc2\x4f\x77\x0f\x77\x0f\xdf\x44\xe2\x2c\xfc\x19\x3a\x24\x19\xcb\x70\xca\xb3\xfc\x54\x44\x31\xcb\x13\x1e\xd5\x5d\x5c\xb6\x06\x11\x18\x8c\xb5\x28\xab\x20\x75\xdf\x0e\xc5\x92\x94\x0b\xa1\x2c\x36\x31\xf1\x3d\x98\xa3\xa2\x48\xcb\x26\xe3\x79\x62\x62\x94\x2c\x49\xc0\x4b\xd4\xac\x21\x45\x52\xd7\xb5\xb7\x0f\xfa\x33\x75\x38\x3e\xbf\x28\xeb\xfd\xeb\x5b\x59\x3f\x7c\x4f\x56\x2f\xc8\xa1\x42\x25\x17\x79\x91\xf2\x8c\xc0\x84\xa3\x98\x17\x99\x8c\xba\x53\xdc\xcf\x06\x69\xa8\x4c\xd7\x21\xd2\x2d\x27\xf7\xed\x90\x2f\x91\x5d\x38\x63\xb1\x8d\x09\x1a\x4f\x51\x91\x67\x65\x9b\x89\x2c\xd1\xc9\xbc\xe4\x01\xb5\xa8\xa9\xeb\x7a\x13\xd5\xdb\x7b\xea\x4c\x77\xc9\x01\xdf\xca\xfa\xea\x37\xea\xb5\x0a\x30\x54\x48\x33\x96\xd3\x54\x16\xe9\xe4\xd4\x9a\x8a\xa8\x1d\xe3\xee\x64\x91\x82\xca\xbe\x80\xd4\xc1\xab\xa4\x17\xb5\xa2\xf9\xec\x85\xa4\x48\xcb\x36\x63\xd9\xaa\xd6\x78\x49\x03\x6e\x51\x5b\x96\x25\x64\x2e\x52\xdb\xfb\x95\x67\x8e\xec\xa5\xac\xdf\xd2\xeb\x1f\x3f\x6d\xb2\x6e\xe9\x8d\x8b\xac\x5f\xb4\x9e\x07\xe1\xce\x5b\x83\x57\xc6\x1d\xeb\x67\x0e\x06\xe7\x99\x60\x85\x4c\x60\x00\x13\x23\x02\xba\xf4\x63\xc0\xa5\xbb\x34\xaa\x51\xbc\xe4\xd7\x4f\x07\xbc\x08\x01\x1e\x65\x91\x8d\x30\x22\x6d\x48\x0a\x69\x30\x59\x8d\x61\x58\x26\xdf\x0a\xa4\x95\x52\xa0\xb4\xd6\xde\xde\x97\xe7\xc2\xd5\x89\xa4\x37\x88\x5f\xdf\xb7\x85\x9f\x7e\x51\x68\x7f\xde\xe5\x90\xf9\x29\x65\x98\x25\xaa\xc8\x80\xeb\x38\x11\x1c\xcb\x28\x86\x11\xca\x18\x65\x80\xad\x4f\x20\x33\x5f\xc3\xa1\xee\xba\x45\x51\x08\x2f\x0d\xfd\xa4\x8d\xd2\xb4\x50\x06\xa7\x69\x9a\x98\xb8\x5b\x46\xbf\xa2\x48\x49\x29\xc1\x48\x29\xbd\x7d\x90\x9f\xe9\x51\x1c\xf0\x0b\xee\xe0\xaf\xe5\xbe\xfb\xf4\x84\xe1\xf9\xe9\xee\xfe\xdb\x66\x11\xc8\x60\x0d\x59\x7a\x2e\x30\x4f\x4d\x81\xa1\xa3\x99\xa0\xb9\x4a\x4f\x30\xc5\x13\xf4\x16\x75\x20\xd7\x40\xc6\x4c\x8b\x72\xdf\x0e\x78\x89\xcb\x85\x31\x1e\x97\x31\x41\xa7\xb3\x17\xc9\xac\x6a\x73\xf9\x6c\x18\x97\xf5\x96\xae\x86\x71\xf0\xe6\x73\x71\xa4\xc1\x78\x83\x8e\xfa\x9f\xbf\x96\xf6\x4f\xe8\xe1\x62\x14\x7f\xfc\xf4\x5d\xab\xf8\xe9\xdd\xc3\xeb\x8f\xa8\xd8\x57\x8b\xf4\x67\x21\x92\x34\x29\x12\xdc\xe7\x89\x8d\x40\x80\x97\x4c\xd3\xd2\x97\x7e\xbf\xc8\xf2\x6b\x1c\xe9\x21\x8a\x4f\x26\x18\x97\x13\x03\x4d\x68\xa4\x42\xdc\x0b\x95\x11\x12\xe9\xd8\x00\xf5\x53\x86\x30\xa5\x14\x7a\xc6\xd8\x32\x67\xa9\x8a\xb6\x18\xbf\x47\xf9\x31\x3e\xe4\x37\xb2\x7f\xc3\x42\xfe\x84\xee\x7f\x55\x76\xb4\xca\x8e\xb2\xbd\x5c\x8c\x3f\x32\x96\x66\x29\x4d\x53\xe8\x49\x2e\x13\x30\x90\x24\xd3\x69\x69\xad\x3f\x2c\xda\xa2\x11\x12\x5f\xa0\xe1\x73\x73\xfd\x04\x53\x9a\xca\x43\xbe\x94\x1c\x4a\x4a\x42\x1d\x16\x2d\x97\x98\xe4\x91\x89\x14\x60\x3f\xe7\x48\x5c\xb1\xf0\x97\x26\xcf\x56\xfb\x90\x6e\x8f\xc3\xbf\x62\xd7\x77\x4f\x76\xfd\x8b\x16\xd2\x04\x0a\x0c\x6a\x2e\x30\xd9\x18\x06\x12\xc5\x02\x67\x2a\x8c\x7b\x98\xe3\x11\x4e\x16\xd5\x60\xec\x30\x20\x39\x2e\x95\xfb\xf6\xb5\x8d\xe4\x79\x5e\xb5\x79\x91\x7f\xdb\x4a\xd6\xbd\x6e\x74\xbe\x60\xfb\xc4\xda\xfd\x0d\x2b\x59\xd7\xe2\xc7\x4f\xcf\x6b\xf1\x17\xf4\xad\xf6\xe1\xd2\xfb\x33\xe7\x4c\x27\x15\xcd\x97\x4a\xa9\xcc\xd0\xcc\x84\x11\xf0\x65\x4e\xe6\xd3\xd2\x95\xfe\xb0\x74\xd6\x61\x01\x17\xa8\x7c\x4c\xae\x9f\x76\xed\xa2\x39\x24\x97\xc5\x58\x54\x61\x54\xa4\xc2\x64\x69\x92\x45\x36\xac\x97\x93\x6f\x39\x92\xb7\x58\xca\x7b\x77\x67\x2b\x7e\x75\xef\x7b\xda\xa7\xb7\x33\xf9\x3b\x56\x9e\x04\xf3\xba\xf7\x49\x41\x45\x62\x08\x05\x23\xe3\x44\xd2\x5c\x25\x67\x0f\xba\x18\x45\x50\x5a\x34\x03\xb1\xdf\xdc\xfb\xd6\x3d\x9b\xd1\xc8\x6e\x7b\xf6\x7a\xbc\x54\x6d\xae\xf2\xc4\x24\x28\x5a\xe2\x40\xbe\xdc\xb3\x03\xef\xb2\x8f\xfc\x99\x72\x1f\x7e\x49\x6e\x1c\x0c\xc0\xd0\x24\x04\x11\x89\xc1\x04\x2a\x11\x27\x92\xe4\x2a\x99\x61\x4c\x90\x07\x6d\x89\x46\xe0\xd6\x25\x05\x37\x5e\xf7\xcb\xa7\xaf\x8d\x65\x13\x7b\xdd\x51\x56\xb1\xbf\xb6\x15\x9f\x9d\xe9\x91\xff\x19\x72\xdf\x6c\xdb\xdf\x93\xdb\xaf\x77\x14\x12\xbf\x50\x8a\xaa\xa4\xa4\x1c\xa8\x29\x24\xc7\x3a\x8a\x61\x80\x2a\x46\x39\x70\xeb\x67\x90\x6c\xc0\xe0\x23\xc2\x8f\xc3\xf5\xd3\xa6\xef\xaf\x76\xc2\xa2\xc8\x9f\x04\x7f\xa1\xef\xa3\xef\xb0\x48\x0e\xd9\x0d\xc3\xee\xe5\xbe\x64\xab\xeb\x08\xee\x37\x7a\x94\xaf\xac\xf9\x7d\xe4\x1f\xdf\xfd\x0b\x42\xef\xef\x1e\x82\x64\xe7\xf5\x65\x43\x87\xfe\xec\x95\x67\x8f\xb7\x76\xd8\x0a\xbb\x1a\x14\x2f\xd9\xd3\x27\x6d\xb5\xe5\x4a\xa0\xda\xda\x43\xf6\x58\x57\xcc\x1a\x14\xc1\x5c\x6a\xde\xa0\xa9\xef\x1d\x9d\x77\xb7\xb4\xd0\xc2\x40\x0c\x1e\x91\xb7\x50\x6f\xe7\xb8\x21\xac\xe3\x99\xdd\xb0\x63\x3c\x74\xe9\x82\x7a\x22\x83\xbd\x92\x99\xb9\x58\xf2\x61\x75\x94\x5f\xdd\x3d\xfc\xed\x2a\xd8\x2e\x67\xf4\xc4\x4d\x86\x51\x92\x11\xcd\x8a\x1e\xfa\xad\xa8\x01\x26\x84\x97\xdc\x22\x75\x5a\x7f\xed\x22\x65\x50\x82\xf2\xcc\x68\x25\x69\x59\x9b\x35\x20\x58\xff\x18\xbd\xc3\xeb\x7f\x0c\xfc\xfa\x75\xbb\x73\x53\x67\x11\x4c\x07\xf2\x94\x91\xbe\x74\xcb\xbb\xe5\x7f\xb7\xd1\x96\x5d\x24\xba\x5b\x63\xd7\xd5\x0e\x90\x73\x82\x1e\xee\x02\xc6\x32\x1b\x46\x30\x82\x4e\x2b\x0b\x1d\xca\x47\x5f\xc3\xbc\x9e\xba\x8c\xc6\x09\x6c\x44\x3b\xb6\x2e\x2b\x84\xdb\x31\x2b\x72\x96\x94\x31\xc2\x7e\x52\xae\x21\x45\xb9\x8c\x30\xc4\x09\xc5\x41\x89\xbc\xc7\x6c\x2b\x50\x81\x93\xe7\x1d\xfc\xd6\xd5\xcf\xc9\x2f\xee\xde\x9e\x2b\xe8\x9e\x00\x3c\xbe\xba\x7b\x33\xd6\x27\x4b\x8d\xe6\xcf\x23\x32\x93\x4b\x5e\x5e\x9e\x5a\xd6\x13\x1f\x7d\xe2\xaa\xe7\x0e\x92\x69\xf1\x28\x02\x03\xb3\x04\x23\xc0\x48\x38\x31\x89\x4d\xc6\x08\x97\x9c\x3c\x61\xf3\xdb\xaf\x64\xb8\x60\x2d\xad\xa2\xa0\xef\xd5\x4a\x8c\x48\x3e\xf6\x28\x35\xa8\x5c\x8a\xdb\x98\x25\x57\xaa\xe6\x16\x9d\x2a\x23\x54\xb9\xa7\xe5\xa3\xb7\xf3\x50\x6b\x35\xe4\x16\xb0\x85\xa2\x84\x96\x1b\xae\x89\xe6\x4a\x6a\xb6\xea\xa1\xb8\xf0\xde\xfd\x59\x32\xa0\xdd\xa5\xbb\x64\xff\xee\xe3\xde\xf3\xc3\xcf\x35\xaa\x4a\x9f\x7f\x9e\x82\xf8\xf1\x74\x7d\x7c\x8c\xc2\x51\x0c\x33\x34\xb2\x83\x99\xcf\x5f\x88\xe1\x30\xc0\xa0\x65\x4a\x19\x26\xb8\x61\x1a\x7b\x1b\x4e\x7c\xe1\xec\xf6\xfb\x72\x7c\xd8\x9e\x8b\x2e\xf6\xef\x7e\xbc\xe8\x82\xa2\xe6\x11\x23\x56\xfa\xf1\xd9\x7b\x0e\x9d\x2b\x5a\xc1\x4c\x51\xe8\x7b\x53\xad\xea\x69\x4f\xf5\xe7\x7e\x97\xa1\xba\xd4\x50\x94\x25\xf4\xeb\x63\xa1\x55\x1a\x9b\x42\x50\xae\x24\xdf\xee\x64\xe9\x6f\x7e\x27\x16\x55\x8f\x12\x61\x8b\x4e\x8f\xfd\x6d\x6d\x38\x55\xb6\xe7\x8d\x9f\x35\xa5\xb0\xf5\x37\xdf\x49\xc7\x2d\xd7\xc4\x70\x2d\x0d\x5b\xe3\x4a\x75\x2e\x8e\x26\xc0\x97\x0a\x9a\xfd\x97\x37\xb0\x5f\x22\x07\x5d\x4a\x3d\x7f\x0c\x4a\x36\x43\x8f\x06\x48\x77\x18\x72\xd4\x81\xe7\x5b\x20\xb9\x6d\x68\x6c\x12\x0d\xd3\x49\xc1\x48\x97\x13\x43\x23\x03\x85\x58\x80\x39\x4e\x88\xe4\x42\x32\xb9\x74\x6d\x12\x15\x3a\xaf\x39\x26\x23\x9c\xa4\x26\x8d\x1f\xa6\x9e\x87\xd0\xba\x58\x92\x7d\xec\x76\x92\xaf\x99\xf9\x1e\x5e\xde\xff\x5d\x18\xa2\xee\x3e\x06\x8c\x09\x57\xb3\xe2\x53\x98\x51\x38\x23\x3d\x13\x9a\x86\x36\x22\xad\xa6\x2c\x87\xb2\x40\x61\x3e\xd7\xfb\x98\x17\x49\x29\x4b\xab\x8c\x59\x30\xb4\x79\xaa\xb2\x9a\x14\x04\x09\x30\x95\xd6\x28\xf4\x4d\xba\xd5\x60\xef\xd4\xd6\x33\x80\x1e\x1c\x61\xea\xa5\x5a\x7e\xe3\x66\xbc\x7b\xf8\xf0\xde\x69\xe6\x5a\x43\xef\xf7\x26\x84\x4a\xa0\x2c\x1c\x1b\x25\xb5\x99\x67\x1f\x9f\x4e\xeb\x51\x35\x1a\x9e\xd8\x1e\xfb\x14\x42\x98\x14\xf2\x90\x0e\x44\x2e\x25\xcf\x46\xb3\xee\x73\x66\x32\x8f\x64\x19\xf2\xc2\x52\x4c\x36\xee\x2d\x7c\xa9\x6b\xfa\x4f\x37\xdc\x5b\x97\x3c\xee\x36\xff\x97\xe8\x2d\x57\x26\x90\xbb\x8f\xbb\x51\x96\x72\x9e\x7d\xb6\x41\xf2\x21\x7b\x5a\xe3\xfd\xc8\xc6\xcc\x94\xb4\x0c\xab\x9a\x97\x3a\xec\xeb\x83\x94\x3c\xe9\xcd\xfa\x1f\x99\xd1\x3c\x8a\xa5\x4e\xe2\xbc\xc9\x47\x4e\x98\xcf\x1d\x1e\x92\xe6\x28\x41\x45\x40\x32\x27\xcf\xf0\x4d\x79\x36\x5e\x92\x6f\xc8\x73\x05\xf9\xb9\xfb\xb8\x8f\x95\x92\xc3\xe0\x47\xc3\x30\x22\xd9\xc7\x79\x16\x87\x36\x26\xca\x30\xad\x95\x90\xbc\xb6\x07\x29\x59\xfa\x5d\x51\x14\x94\xab\x28\x31\xc2\x01\x49\x9d\x6e\xfc\x93\xeb\xa7\x78\x96\xe5\xe9\x6e\xea\x57\x75\x53\xcb\xca\x11\x84\xfb\x76\xdb\x91\x51\x3d\x27\x18\x67\xab\x76\xaa\x92\x35\x61\xd3\xf1\xc6\x44\xa7\x66\xd3\x8e\x03\xc4\xd4\x27\xfd\x28\x96\x2a\x89\xb1\x2d\x5a\x41\x98\x2f\xc0\x80\x15\x66\x15\x29\x5f\x45\x42\xae\x2f\xf8\xfb\xf2\x7c\x85\xb4\x73\x23\x8f\x96\xb5\xab\x95\xf2\x7b\x57\x6b\xd6\xa3\x0e\xe6\x84\xd0\x2c\xb2\x09\xaf\x2a\xde\x85\xed\xc0\xbb\x32\x9c\xfb\x6f\xbd\xae\xa2\xbe\xea\xc8\x80\x11\x5a\xac\x67\xe3\x45\x47\x81\xc7\xce\x38\xd8\xf0\x26\xfe\xa3\x43\xc4\x79\x81\x7c\xfc\xcc\xdc\xf9\x04\x17\x55\x96\x2e\xa9\x4c\xa0\x73\x49\x5b\x97\xbb\xed\x51\x24\xd7\x65\xbd\x3e\x07\xa9\x74\xbd\x64\xb5\x83\xa9\x34\xf5\x2a\xf0\x05\x54\x31\x70\x77\x5f\xe2\x20\x7e\x6d\xac\xe3\x35\x03\xc6\xad\xbb\x6c\xf0\x36\x9a\x8a\x72\x19\xfd\x04\x0a\x24\x47\x7f\x5c\x92\xf5\x39\x08\xae\xed\x52\x9a\x6d\xba\xc6\x67\x93\x80\x52\x6e\xbd\xee\xbd\x97\x5d\xf8\x17\xff\xac\x79\xed\x73\xe7\xa6\x23\x05\xf5\x46\xe4\xb5\xd1\xc6\x44\x12\xcd\x10\xae\xcf\x41\x72\xad\x17\xa1\x35\xf4\x28\xd3\xda\x37\x30\xab\x8d\x53\x71\xc3\x66\x50\xbb\xd3\xb7\xc7\x7a\x46\x8f\xbe\xf2\xbe\x05\xd2\x06\xe1\xe3\xec\x97\x8b\x0d\xf2\xc7\xce\xb5\xb4\x2c\xab\x07\x28\x76\xe9\xe7\xc1\x3d\x27\xab\xf8\x52\x73\x33\x0c\x86\xfb\xe4\xc4\xa1\x16\x5e\xe0\xee\x99\xcc\x5f\x30\xa7\x70\xbb\x46\xd2\xe0\xba\xd0\x4a\x47\x9b\x55\xa1\xcc\x3e\xa5\x8f\xa5\x36\xe5\x12\x57\x06\x2a\x44\x4d\xe5\x9f\xa0\xab\x37\x90\xae\x8d\x6b\xe8\x2f\x18\x6b\xd7\xb8\x8e\x75\xc7\x6f\x3b\x43\x58\x39\xa5\x49\x44\xea\x6b\x5f\xcb\x41\x2a\x5b\x2e\x91\xb5\xeb\x58\xd6\xfa\x13\xf4\xab\xd3\xea\xc6\x52\x7f\xe1\x58\xca\xd9\x05\x3a\x01\xf5\xf3\xa5\x2b\x1d\x7d\x09\x45\x62\xf0\x1b\x07\xbe\x8d\xb7\x79\x45\xe5\x36\xaf\xf2\x76\xac\x20\x75\xfd\x9a\x7f\xfe\x58\x93\x71\xad\xa9\x0d\x38\xf4\xc1\x8d\xea\x4e\x22\xde\xfb\x7a\x91\xeb\x73\x90\x56\xdb\x25\xb2\x9b\xbd\xaf\xf3\xea\xaa\xeb\xbc\x9a\xbf\x70\x5e\xa5\xf1\xd3\x65\x40\x03\xf0\xf5\xed\x58\x67\xef\x6c\x1d\xab\x74\xf8\x8b\xec\xfb\xef\xcb\xf7\xb4\x1f\x1f\xc5\xbe\xf0\xfe\x66\x1d\xe9\xd5\xc6\x8a\xfa\x74\x26\xef\x6f\x6e\xfa\x56\x21\x6a\x3f\xb7\x76\x29\x7d\xe6\x70\x51\xbb\x1d\x77\x08\xa9\x74\xa9\xac\xf5\x8b\x5d\x2f\x1e\x27\xaa\xb8\x64\x21\x93\x5c\xf1\x20\x95\x17\xde\x34\x76\x4e\x8f\xd6\xc7\x97\x4e\x8a\x5f\xa0\x4d\x8b\x48\x86\x69\x57\x91\xaa\x1c\x91\xc8\x16\x0d\x8d\xd0\x5d\x95\x9e\xbd\x13\xa9\x6b\xe2\x4b\x1f\x8b\x98\x13\x6a\x94\x2e\x6c\x54\xc6\x68\xce\x33\x18\x72\xac\x04\x26\x88\x16\x89\xbe\x60\x05\x2a\xb7\xae\x9a\x6d\x4e\x6b\x00\x70\x77\xff\x3c\xa7\xb7\x2f\xd8\x54\xef\x1e\xfc\xde\xda\xa5\xf6\x09\x44\x68\x5a\x35\x87\x6a\xbb\x5a\x87\x9b\x19\x5f\xac\xdd\x35\x3f\x1b\x24\x4c\x6f\x7a\x53\xd7\xee\x1b\x18\x6f\xe7\x89\x33\x3e\xe6\x7e\xe5\xfd\x70\xe9\x1e\xf2\x5e\xbd\xc8\xbb\xb8\x5a\x3f\x77\x35\xfa\xf5\x3f\xee\x6f\xb0\xf5\x9a\x20\xc2\x84\x9a\xa4\x2c\x52\x18\x57\xf7\xc1\xa2\x74\xd1\x81\xd8\xfe\x39\xb6\x2f\xfe\x79\xf1\x2a\x9b\x97\x65\x50\x57\x26\x2f\x4b\xbf\x5a\x72\x82\x23\x15\xa5\x95\x91\x46\xe9\x59\x7f\xf1\xf7\x22\x2b\x14\xc9\x84\xfb\xea\x70\xda\xd8\xb9\x38\xca\x5d\x7f\xd1\xcb\xb3\x4e\x9c\x86\xd0\x97\x7a\x61\xc8\xed\x59\xab\xcd\x94\x25\x48\x7f\x4b\x48\x38\x42\xbd\x06\xb0\x45\xc9\x49\x8f\x7a\xf8\x59\x20\xb2\x2b\x06\xbd\xfe\x05\x36\x9c\xbe\xc0\x7b\xe2\xfd\xfd\x87\x0b\x4b\xff\xc3\xd5\xb3\xbc\xfb\x03\xba\xbb\x12\x4f\x6f\x54\x33\x41\x86\xa2\xb2\x74\x77\xd8\x33\x0a\x61\x0a\x92\x79\x5e\xc3\xd8\xb2\x44\xc9\xbe\x40\xc5\xdc\x21\x6d\x2f\xcc\xa3\x16\x6a\x0b\xf2\x98\xc3\x86\x75\xe7\x30\xe0\x02\xf6\xfc\x9e\x3f\x7c\xf7\x3d\xbf\x7e\xf0\x27\x63\xdc\xd2\x6b\xfd\x62\x75\x60\x91\xd8\xf0\xf7\xd7\x93\xc2\x2c\xa2\x0c\xd8\xe7\x71\x5e\x63\x53\xcd\x98\x2e\xb5\xd5\x0e\x17\x1d\x0d\xab\xce\x82\xea\x49\x67\x2f\x46\x41\x5f\x8e\x91\x21\x61\x8c\xf3\x51\x8d\xbb\x31\x6d\xb7\x5d\x60\xdd\x4d\x67\x08\x4d\x90\xe8\xcf\x76\xd0\x8d\x6e\x50\x64\x74\xa3\x6b\xdd\xad\x63\x9c\x1c\xb7\x43\xf2\x67\x8e\x11\x23\x5b\x96\x4f\x63\x70\xff\xe4\xa0\x55\x5c\xb1\xc4\x08\x49\x19\xa8\xf2\x73\x32\xad\x86\x8a\xb2\xd2\xf4\x66\x30\xc3\x55\x57\xd6\x6f\x5c\x85\xf4\x76\xab\xb3\x51\xa5\xaf\x91\xcf\x5b\x67\x98\x3f\xbd\xfb\xf8\xe9\x0f\xe8\x70\xdc\x7f\xfc\xc4\xfd\x3a\x4b\xaa\x22\xe8\xc0\xb0\x0a\x79\x27\x3e\x82\x85\x66\x99\x28\xaa\x50\xd4\x8e\x8a\x2f\xad\x3f\x13\x82\x4c\x4f\xfd\xbc\x28\x62\x6e\x5a\x85\xb1\xa5\x5c\xe7\x36\xc1\x79\xae\x24\x2f\x18\xab\xd6\x71\x8d\x4f\x8e\xf2\xc9\x16\xbe\x98\xcb\x97\xef\x6c\xa7\x5d\x0c\xea\xae\xc6\xd6\x5d\x05\x0a\x6b\xdd\x2e\x9d\xa0\x71\x39\xf9\xf1\x41\x19\x6d\x8d\x35\xdd\x7a\xd8\xb5\xc6\x9a\x52\xaf\x76\xdd\xfe\xb2\xbd\x3d\xd3\x6e\xae\xf6\xe6\x0f\x28\xb3\xd6\x95\x28\x8d\x28\x81\x3e\x20\x2e\x33\x21\xc0\x58\x8b\x8a\x7d\x8e\xf0\x6a\x71\x06\x31\xb3\x5a\x9c\x81\xd2\x38\x8b\x6b\x2e\x7b\x8b\x3c\xe3\x7d\x7c\x1d\xeb\xd5\xcb\xb1\x2e\x55\xd1\xcf\x03\xd6\x28\xba\x0c\xe5\x4c\xdb\x57\x17\x2c\xe3\xb3\xe7\x48\x73\x2f\x83\x19\x83\xa8\x41\x14\x0d\xd0\xb8\xe1\x2a\x03\xd2\x9d\x03\xd3\x25\x66\xfb\x3b\xef\x47\x87\x0a\x7b\x7d\x6b\xbf\xbb\x00\xff\x3d\x5c\xc0\x3a\x5f\xdd\x6f\xc5\x2c\x3f\xbd\x7b\x38\xb8\x46\xc0\xfb\x4b\x55\xc1\xc3\xdd\xbd\xbf\xf1\xd9\x52\xc4\xd2\xd4\x14\x7e\x04\x83\xee\x09\x67\x93\x99\xb8\x2c\xc6\x12\x4e\xdd\x68\x4e\x8c\x5b\x06\x7c\xb2\x88\x9a\x71\x34\x50\xa6\x33\x6d\x93\xd3\xde\x70\x95\x35\xe6\xec\x69\x4b\xb8\x58\xa7\x20\x18\x51\x16\x79\x50\x9d\x4e\xe2\xd4\x2e\xc2\xcd\xc4\x3b\x7b\xda\x55\xe8\x0e\x8d\x36\xdd\x76\x56\x6e\x9c\x2b\xff\xd1\x7b\xeb\xba\x2a\x9f\xee\x10\x7f\x83\xe0\x0a\xe1\x2c\x31\x71\xe2\xc7\x70\x52\x2d\x61\xf4\x64\x4f\x4c\xe0\x41\xc3\xdc\x0f\x76\x14\xb4\xa2\x50\x76\x16\x61\x3b\x0c\x16\xea\x74\x26\x4d\xd2\xee\x8d\x50\x19\xa7\x1a\x66\x59\x62\x21\x57\xd1\x25\x27\xfa\x22\xba\xee\x9b\x85\x6d\xdd\x24\x30\xbf\x10\xdd\x0b\xfc\xf4\xd2\xe3\xf2\xda\xbb\xdf\x72\x77\x4f\xf7\x9f\x6f\x8e\x3f\x06\x1b\x49\xf0\xfd\x53\xe7\xcd\xc3\x87\x7b\x67\x6f\xd7\x8e\xef\x55\x6e\x97\x27\xf3\x0d\xd2\x45\x6a\x92\xcc\xaf\xa0\xac\x26\x02\x7d\x33\x75\xd0\x14\x53\x05\xfd\x78\xe1\x36\xb7\x30\xc0\x84\xbc\x12\xb5\x2e\x4d\x66\x21\xcf\x60\xa4\x63\x3a\x3b\xc5\x33\x6a\x06\x6e\x4b\x94\x43\x5f\x2b\x3d\x40\x39\x4d\x7a\x9a\xc0\x5e\x75\x6e\x9c\xe0\x63\x63\x74\xeb\x79\x7b\x87\x01\xbd\xca\xfd\x83\x17\x5f\x4f\xa4\x27\x7b\xd9\xae\x6e\xb7\x70\x1a\xdd\xbf\xbe\xdf\x7f\x99\x8e\xfc\x07\xe4\x3f\xf7\x54\xd7\xc8\xe4\xa9\x2d\x7c\x0a\xa5\x41\x89\x80\xae\xb1\x1d\x58\x8c\xc2\x1a\x3a\x14\xfa\x6c\x29\xcf\xde\x4e\x40\x42\x0d\x29\x12\x4a\x31\x44\xb5\xb6\x95\x68\x02\x6a\x8c\x54\xd5\xbe\x62\x22\x2b\x4d\x5b\xeb\x13\x8a\xa0\x69\x8c\x19\xa1\x5d\x4f\xcd\x54\xd0\xb8\x4c\x30\x6a\x09\x81\xd9\xf2\xa6\xb3\xbd\xea\x3a\xcf\xdb\x07\xd1\xc5\x5e\xbe\x29\xfb\x9b\xe3\x4f\x17\xb5\x3f\xbc\x7a\x82\x33\xfd\x8a\x30\xfe\xad\xab\xd1\x0a\x0c\xca\xd3\xa4\xcc\xd1\x0c\xa3\x3c\xc9\xd9\xa8\x12\x3a\x3c\xd8\x69\x5c\x9d\xb0\x21\x68\x40\x12\x45\x8a\x98\xd0\x1c\xb8\x3f\x29\x25\x84\x85\x42\x2b\x23\xca\x7d\x4d\x65\x6e\x57\xb1\x47\x14\x43\xd3\x28\x33\x41\xa3\x7b\x0b\x09\xa7\x89\x89\x0b\xd4\x31\xdb\x8b\xb6\x23\xe4\xec\x69\x56\xbb\x7b\x01\xe6\xf8\xdf\x06\x77\x3b\x7f\xc1\xe2\x79\x79\x5f\xfe\xee\xde\x5b\x77\x56\xa7\xf0\xaf\x94\xbe\xbf\x05\x33\xf1\x4d\x9e\xdb\x24\x09\x0a\x08\x7b\x24\x14\x88\x09\xe6\xb3\x07\x09\x41\x05\x0a\x21\x42\xa3\xdf\x2f\x19\x88\xfd\xb4\x30\x5e\x71\x9a\x08\x21\x17\x8c\x3c\x6d\x4a\x59\xef\x98\x53\xfc\x0e\x17\x24\xcb\x53\x63\xa4\x6d\x47\x98\xad\xe6\xf5\xa0\xb5\x81\x8e\xd3\xd8\xc4\x2e\xf7\xd9\x0a\xa1\x8c\x30\xca\x1a\x97\xab\xae\x2f\x7d\x9f\xdf\xd1\xfb\x93\xb9\xa3\x6f\xe9\xfd\xd6\x66\x82\x0c\xc9\x6c\xdd\x5e\x62\x68\xf5\x2c\x61\x2a\x65\x0d\x0d\x9e\xed\xba\xd9\xad\xbb\xf9\xbc\x8b\x00\x13\x8d\xf3\x84\x90\x02\x0a\xab\x4b\x2b\xea\x20\x32\x46\xca\xf2\x6a\x30\x95\x71\xa0\x07\xad\x2a\x2f\x06\x93\x70\x1a\xdb\xf8\xc6\x60\xca\x5e\xf6\x9d\x93\x5b\x1e\xcd\xa1\x70\x78\xe7\x5b\x9e\xfd\x82\x23\xe4\x00\xdf\x6e\x2e\xbf\x3e\xdc\x7f\x58\xc5\xbf\xd0\xfd\xbf\x7a\x7f\xe7\x4e\x1c\x97\xab\xe6\x81\x29\xd7\x50\x20\x16\x1c\xe3\x38\xc7\x6c\xf5\xfd\x4a\xb5\x90\xa0\xe5\x9f\x13\x61\x8d\x41\x89\x31\x28\x35\xe6\x50\x58\x2d\x43\x33\x16\x38\xd2\x51\xdc\x19\xc2\xd9\x63\xbb\x68\xed\xd2\x71\xeb\xff\x61\x7b\xbc\x7d\x20\x5c\xdd\xf4\x6f\x92\xeb\x2a\x5b\x30\x07\xa9\xae\x56\x47\x8b\x51\x46\x63\xcc\x1c\x01\xb5\x96\x4b\x15\x10\xfa\xb9\xc7\x96\xf3\x99\x73\xe4\x71\xbe\x89\xa5\x47\x8c\x63\x13\xc7\x9d\xa6\x6c\x15\xcb\x68\xbd\x46\x4d\xab\x27\xb0\x3d\x1b\x07\xed\xbf\x5d\x5f\x6d\x80\x4d\xbd\x3a\x32\x9c\x11\x12\xe5\x84\xac\x73\xb6\x62\x31\x81\xa4\x9f\x0d\x33\x52\xa2\xc8\x55\x08\xcb\x67\x7d\x85\xe6\x97\xf4\xe5\x7b\xe2\x2c\x8f\x36\xc8\x2f\xb5\xdc\x1b\xb5\xf1\x4f\xef\x2e\xce\xc1\xfb\x8b\x21\x7e\xb8\x77\xf9\xfd\x8b\x8b\xb0\x86\x09\x6f\xee\x7f\x7a\xb7\x4b\x64\x1c\x21\x8a\xfa\x74\xec\x40\xae\x8e\xdc\x29\x89\xcb\x0c\x35\xf3\x8c\xda\x42\x90\xbc\x5e\xac\xcf\x41\x77\x7d\xea\xe7\x89\x4f\x2b\x1d\xe4\x24\x0a\x0d\xd5\x59\x51\x08\x55\x62\x9c\x31\xad\x0b\x5c\xe0\x52\x89\xa2\x48\x8d\xe4\x79\xb1\xf9\x2b\x1b\x96\xfe\x83\xdb\xfd\x2f\xc5\xd0\x2e\x27\xe7\x8e\xac\xb7\x1f\xee\xd7\x9d\xe8\xc3\xfb\xab\xff\xf4\xfe\x92\xc9\x74\x87\x9a\xbb\x0a\xb9\xfb\xf0\xa3\x4f\xcc\xba\xa3\x57\x26\x2e\x6b\xd3\x0f\x31\x6a\x41\x27\xb4\xa8\xe7\xc2\x66\xe8\xb4\x0c\x39\xee\x77\x1d\x99\xa1\xf1\x59\x5f\x4e\xd1\x28\x05\x47\x7a\x9f\x18\xa5\xa3\x58\x25\x91\x55\x71\x64\x52\xab\xa9\x50\x65\xa2\x94\x60\xa8\xd6\x45\x5c\x6e\x47\x55\x69\x18\x3e\xa1\x78\xab\xf5\x5e\xfd\x91\xfc\x58\xee\x5a\xef\x47\xef\x3f\xdf\xee\x3e\x87\xe3\xfb\x0f\x4f\xc2\xef\xb7\xfe\xbb\x8b\xec\xe8\xcd\x6e\x7f\x0d\x24\x9f\xe0\x4e\x24\x8a\xb2\xd4\x26\x09\xaa\x20\x26\x6c\x74\x39\x4e\x23\x62\x38\x99\xb6\x5b\xff\x51\x26\x82\xf6\x87\x8a\xc0\x09\x94\xdf\x9d\xbd\x12\x86\x90\x0a\xc5\x18\x6a\x83\x13\x93\x29\x23\xa6\x54\x7d\xaf\x9b\x38\xd6\x19\xf4\x28\x4e\x62\x9b\x75\x5a\x95\x28\xd7\x79\x3c\x9b\x25\xf2\x27\x68\xa1\x53\x9c\x21\x82\x0c\xa2\x89\x87\x7c\x7e\xa6\x8e\x7f\xf2\xc7\x55\xd3\x97\xd7\xed\x5f\x4b\x22\x5f\xaf\x33\xb9\x36\x6e\xdf\xdd\xbf\xfb\xf8\xea\xc1\x2f\x9b\x24\xd6\x19\x8a\xa1\x23\xac\x35\x5a\xdb\x98\x52\x53\x6a\xdc\x97\xd0\x26\x9c\x98\xbd\x96\x32\x1e\x34\x0c\x3d\xca\xa1\x53\x1d\x56\x59\x0a\x29\xb2\x45\x6a\xf2\x1c\x79\xba\x47\xc9\xe6\x6f\x6f\xf1\xf5\x5b\xe7\x55\xbd\xbf\xea\xec\x79\xe8\x8f\xcf\x63\x3b\xa5\xbd\x7a\xb8\xc5\x88\xd9\x72\x8f\x7f\x8b\x7e\xf4\xd3\x21\x89\x75\x9c\xa0\x02\x4a\x2a\x26\x5d\x96\x94\xc4\x8c\xe9\xb6\xc4\xa8\x02\x93\x48\x56\xef\x23\xd2\xc3\x84\x4e\xda\x76\x84\x29\x82\x11\xdd\x2b\xa9\x62\xc9\x15\x8c\x0e\x97\x40\x55\x71\xa4\xe3\x08\x3c\x34\xa6\xb1\xc6\xed\x2a\x23\xa2\x1a\xa7\x60\xf4\xe7\x79\x17\x42\x02\xbc\xe2\x16\x95\x7e\x8a\xfa\x74\x7b\xe7\xc6\x9f\x9d\x8d\xfe\xa3\xab\xae\xb8\x76\x83\x1c\x36\x6c\xa1\x8f\x9f\x7e\xdd\x44\xff\x84\xae\x26\x8a\xf2\xd5\x44\x81\xc6\x53\x0f\x3a\x21\x45\x75\x35\xd1\xa2\xe8\x77\x3d\x9e\xa1\xf6\xf9\x60\xe7\x50\xc9\xa2\x40\x7a\x4f\x85\xe4\x89\x8a\x43\xa3\x12\x1d\x46\x52\x62\x2a\x55\xc2\x24\xc5\x88\xa9\x2c\x5e\xcf\x2d\x64\x60\x96\x34\x6f\xc6\x2e\xbe\xc8\x9a\xfd\xf6\xf5\x14\xfd\xd2\x7a\x22\xf8\xba\x9e\xc6\xe2\x79\x3d\x0d\x76\x3e\x5d\x96\x93\xd6\xdb\x72\xea\x9b\x97\xcb\x89\xa2\x4a\xe7\x89\x35\x8e\x62\xb7\xb4\xfc\xb2\x9c\x0e\x01\x3b\xb3\x63\xe7\x78\x3f\xb7\x5b\xfe\x3f\x79\xff\xfa\xf2\x44\x7c\x77\x7b\x49\xe1\x30\xb0\x1e\x5e\x5f\x5b\x5b\x9f\x3d\xd9\xe0\xcb\x32\x85\x16\xc5\x69\x62\x32\x34\xc1\x24\x27\x81\xa1\xc9\xb9\x48\x43\x13\xd2\xbe\xe3\xb5\x49\x53\xdc\xa9\xd3\x50\x9a\x56\x12\x81\x55\x5d\xa3\xa2\x81\xd0\x7d\xdb\x3c\x70\x7d\xea\x34\x59\xca\x2a\x89\xb3\x2a\xeb\x58\x81\x07\xee\x37\x69\xac\xcb\xd5\xbf\xea\xba\xb2\xaa\x21\x6d\xdb\x16\xbc\x6e\x75\xa7\xbc\xbf\x72\x78\xcf\xeb\x39\xb4\xf5\xc3\x3e\x3c\xe1\x9b\xfc\xeb\xb5\x46\xeb\xb6\x7b\x68\xfd\xfd\xe9\xfd\xdd\xc3\xd6\x1d\xfc\xf6\xee\xfd\xdd\xd1\x39\x26\x1b\x6c\xc0\xc3\x33\xfa\xda\xa5\x7f\x52\xfb\x23\xf4\xce\x7b\x8e\x23\x68\x80\xc7\xcd\x46\x9d\xd3\xab\xba\x16\x49\x48\xa3\x18\xc5\xb5\xa0\x71\x4a\xd2\xbe\x48\x55\x92\xe7\x79\xac\xe2\xac\xc8\x22\x1d\xa6\xb5\x4a\x52\x9d\x1f\x8a\xa5\xd0\xda\x66\x0a\xa7\x3a\x8a\x2b\xad\x35\x6a\xa8\xb6\x71\xa9\x39\x60\xd4\x90\xb8\x96\x99\x7e\x24\xa6\xce\x6b\x63\x9b\xb4\xb1\x61\x59\xa5\x4d\x19\xa5\xbd\xc1\xa5\x77\x08\xba\xb3\x72\xe7\xd9\xb7\x7b\x48\xde\x6f\x3d\x24\xb7\x7d\x37\x5f\xf5\x27\x0d\x81\x5d\x5d\xef\x47\x33\xc3\xe4\x7b\x7c\xe2\x7c\xe2\x5a\x2c\x39\x22\xe5\x76\xf1\xfa\x98\x23\x03\xf5\xa1\xd0\xed\x62\x7c\x71\x69\x4e\x7a\x6a\x62\x5d\xf2\x9b\xe6\xa4\x4d\xdf\xa7\x43\x71\xc1\xb3\xf9\xc7\x0b\x76\xfa\xff\xec\x15\x5f\xea\xfb\xed\xf7\xd5\x8d\xbe\xa3\x6e\xe3\xb0\x2c\xd7\xa8\x31\x8f\xc0\x42\x11\x23\xee\xb2\x32\xad\x6e\x1a\x99\x44\x22\x4c\x50\xde\x4a\x1e\xa7\x2c\x41\x5e\x96\xea\x55\xd3\xb1\x89\x52\x9a\x46\x26\x4c\x5a\x9d\xe6\xba\xb8\xd5\x77\x7a\x55\xb7\x49\x4a\x25\x56\x75\xe3\xa4\x96\xb9\x7e\xc4\x52\xe7\x46\xd8\x3a\xbb\xa8\xdb\xc6\x59\xb7\xaa\xdb\xdb\x05\xb9\xc3\x96\x56\x8e\x0f\xf7\xfd\x33\x83\xe6\xe1\xb8\x6e\x9b\x5b\x79\xc0\xc3\xc1\x79\xe8\x1f\xee\x3f\x1d\x9e\xa0\xe1\x1d\x73\xc4\xfe\xdd\x8f\xfb\x37\xde\xd3\xd7\x83\x54\xd4\xc4\x89\x10\x71\xea\x47\x93\xae\x68\xd3\x76\x25\xcc\x45\x2d\x27\x84\x0b\xa9\xd2\x56\x19\xc1\xeb\x36\x49\x53\xd6\x43\x47\x11\x46\x05\x87\x13\x30\x8a\x3a\xa4\x19\x74\x4b\x47\x7c\x72\xf0\xca\xae\xc0\x45\x1c\x31\xa2\x2d\x35\x12\x85\xb3\xd4\xc4\x6a\x1b\x85\x4a\xcd\xe9\xc0\xa2\x34\xcf\x17\xce\x07\xa9\x65\x22\x60\x32\xba\x0c\x05\xd4\xdc\x35\x86\xee\xfc\xe4\x5c\x1c\xdb\x83\x7a\x7a\x4f\x2f\xe6\xb3\x45\x1c\xf7\x6e\x3e\xf7\x1f\xee\x3f\x3e\x4f\xe8\xed\x3a\xa1\xdd\x97\x13\x8a\x6b\x69\xd2\xcc\x98\x34\xf3\x0d\x74\xf5\x40\xe7\xe9\xec\xd5\x60\xf1\x64\xa1\x43\x55\x96\x56\x75\x3a\x57\xc6\xc8\x13\xf2\xb2\x3c\x61\x30\x03\x27\xa8\x44\x25\x03\xbb\x4c\xc4\x2f\xd0\xc4\x40\x2d\x29\xf1\xa7\xdb\x69\x19\x66\x14\xf2\x26\x65\x88\xd1\x98\x6c\xf3\x1a\xe9\x2f\xcd\x0b\xed\xc2\x33\x77\xfe\xfc\xbb\xcd\x9b\xba\x7b\xfb\x66\xef\x9e\x67\xf6\x07\x77\x41\xb4\x7f\xf7\xf6\xee\xf8\xee\xad\x4b\xb9\x1e\x26\x5a\x36\xab\x69\x35\x88\x47\xa0\xd3\x42\x65\xa1\x8d\xf2\x6c\xa8\x29\xf4\x31\xc2\x53\x8c\x42\x21\x30\x62\x07\x29\x71\x0e\x3d\x36\x18\x1a\x6c\x31\xb0\x24\x29\xea\x74\x2a\x32\xcc\x50\x95\x1b\x8c\x8a\x5c\x17\x28\x4b\x22\x93\xbb\xd8\x88\x9e\x8b\x1d\x39\x28\xc7\xd9\x7b\x63\x35\x57\x25\x6f\x70\x2c\x57\xf5\xbe\xba\xd8\xcb\xab\xab\xe1\x3b\xf5\xae\x01\xeb\x5b\xa7\xe4\x80\x70\xa2\x33\xc6\xe2\x04\xf5\xcb\xa4\xe7\xa2\x14\x03\x4a\x92\x44\x88\xa4\x14\x86\xf3\xaa\x8a\x53\x61\x25\x55\x1a\xd3\x06\x4e\x18\x25\x28\x66\x13\x68\x82\x14\xe2\x14\x66\xf0\xb0\x1f\xae\xda\xcd\x55\x1c\x31\xaa\x26\xa9\x88\x55\x98\x46\xa1\x54\xc8\x4b\x47\x1e\x67\x79\xbe\xd4\x4c\x08\x4d\x23\x36\x0a\xa9\x12\x01\xb3\x51\x36\xe4\x50\x71\xa9\x5c\x6f\xc9\x66\x33\x3f\x79\xff\xe4\xfd\xf1\xca\xa4\xfc\xc2\x64\x1e\xae\x26\xf3\x6b\x4b\xa0\xb0\xc2\x60\xa5\x93\xcc\x67\x30\x96\x1d\x3d\x0d\xa7\x0a\x1a\x3c\x18\x18\x91\x26\xb6\x4c\x47\x6b\x95\x1a\x4e\x69\x96\xd0\x19\xcc\x3a\x09\xc9\xa1\x85\x88\xfa\x11\xea\x57\xb3\x61\xc4\x6f\x9c\xb1\xe8\xaf\x6c\xe5\xcb\x25\x30\x8a\x6f\x98\x8a\xb7\x0b\xf8\x13\xfe\xd5\x36\x23\x0f\xbd\x39\x5e\xd2\x33\x17\x3c\x8f\x1f\x83\x27\xac\xa5\x87\x27\xbf\xfb\x10\xbc\xff\xf8\x27\xf4\xe0\xc0\x2f\x3e\xec\xa9\x4d\xfa\x99\x30\xda\x21\x0e\x4d\x85\x3c\x7a\xf6\x1a\x05\x03\x47\x19\x83\x0e\xf1\x9a\x50\x81\x8a\x14\x29\xc1\x8a\xb1\x0b\x7b\xc4\xc3\xe1\x20\xb3\xe2\xec\x19\x93\x13\x52\x2e\x33\xcc\xaa\x2c\x51\x0a\xa7\xda\xd4\x27\x3f\x2c\x0b\x9c\x8b\x93\x11\x92\x3f\x0e\x79\x66\x4c\x96\xcf\xeb\x7a\x6d\x2e\xdc\xb1\xff\xf8\x2c\xeb\xe1\xe8\x5d\x63\x85\x6f\x0b\x7b\xbc\x7f\x7b\x40\xf7\x1f\xff\x84\xfe\x80\x5e\xff\x70\xbc\xff\xb0\x4f\x4d\x9c\xa0\x18\x45\x44\x08\x98\x51\x0d\xb2\x43\x05\x85\x66\xb0\x60\x18\xe2\x12\x0c\xaa\x26\xca\x05\x2a\x43\x34\x9e\x3d\x0a\x13\x0a\x43\x98\x50\x15\xa2\xe4\xa0\xd2\x2c\x85\x59\xda\x82\x90\x6a\x15\x5a\x97\x15\x2a\x60\x68\x4d\x3d\xf9\x61\x95\x17\xb9\x3c\xd9\x93\x7c\x1c\x57\x99\xf3\xcc\xc9\x3c\xba\x7c\x8c\x7a\x3a\x0d\x6e\x64\xfe\xae\x82\x8f\xf7\xef\xae\x1a\xbe\x4a\x9d\xaf\x52\x7b\xab\xd4\x6c\x46\x16\x74\x8b\x52\x02\x5d\x6f\xa0\xa4\x88\x71\x28\x91\xed\x19\x97\xc8\x84\xa8\xe7\x39\x11\xa7\x29\x3a\x7b\xc8\x86\x28\x3c\xa8\x34\x4d\x61\x56\x57\x99\x27\x55\x56\x28\x87\xa1\x31\xcd\xc9\x0f\x2b\x42\x0a\x39\x95\x34\x63\xfa\x71\x7a\x92\xda\xf3\xfc\xa0\x3f\xe3\xa3\xd8\x4f\xde\xef\xdd\x6d\xcd\xfd\xbf\x43\x97\xe8\xf0\xd3\xef\x9e\xe9\x4d\x5e\xb9\x64\xcb\x4e\xfa\x73\x24\x34\x95\xb1\xa6\x59\x9c\xf5\xe1\x69\xe4\x63\x1b\x9e\xbd\x4c\xc6\x4c\xf3\xfd\xf4\x73\x0f\x26\x31\x89\x44\x3c\x28\x1f\xc7\x65\xe8\x65\xeb\x17\x7e\x09\x73\x02\xe3\x8c\xe7\xed\x1e\x59\x9d\xf1\x6e\x76\x67\xcb\x3f\x39\xde\x82\x37\x5b\x4a\xfa\x9d\x3b\x5a\x56\x45\x3d\xfd\xfd\x82\x6b\xb3\xa9\x2a\x78\xff\xf1\xd3\x83\x8b\x72\x7c\x5b\x46\x31\x0a\x47\xd1\xcf\xd4\xf8\x49\x8f\x08\xc8\x30\x42\xde\xa0\x9a\x41\x9c\xe8\xbc\x5a\xa2\x9a\x28\x15\x88\xe5\x5d\x14\x8e\x48\x86\xd1\xb0\x6a\x27\x31\xb5\x6a\xb5\x90\xba\x5a\xe6\x24\x29\x3b\xdd\xdb\x41\xaf\x47\xba\x1f\x56\xb4\xc8\x44\xf7\xd8\x30\x6b\xf8\xbc\xd5\xcf\xb0\x4b\x2e\xf6\xaf\xbd\xe8\xa9\x76\xd5\x49\xeb\x10\xb2\xfc\xfd\x3b\xef\xe8\xda\x31\xb6\x70\xfa\x8f\x1f\x3f\x5c\x0a\xbd\xb6\xdf\xaf\x6e\x9c\x91\x7d\x6e\xa3\x68\x9a\xc9\x7c\x6a\xcf\x1e\x46\x38\x75\xd5\xb4\x2d\x25\x71\x9c\x90\x58\x2a\xa5\xa4\x31\x52\xce\x4a\xc9\x83\xcc\xe2\x08\x7a\x6b\xd6\x57\x37\x36\x0a\x85\x27\x6d\x1f\x6b\x4a\x43\x1d\xe5\x28\x7a\x02\x15\x8e\x76\xe1\x56\x9b\x76\xc5\xea\x39\xb8\x1c\x6c\x7b\xa9\xf7\xb9\xd6\x22\xae\x6b\xfc\x8a\xfa\xff\xab\xe2\xde\x3f\x8b\xbb\x59\x20\x4c\x67\xaf\x87\x11\x23\x91\xfb\xd1\x32\x05\x1e\xa3\x51\x92\xd0\xc4\x68\xa3\xcc\xfa\x0b\x45\x46\x9b\x83\xcc\x32\x18\xae\x12\x6b\xe4\xad\x12\x37\x94\x85\x3a\xce\xbe\x90\x58\x5c\x73\xb0\xae\x0d\xd7\xf5\x2d\xe3\xa3\xd9\xa7\xde\xdf\x78\x3f\xdc\x54\xda\x3e\xe7\x05\x9e\x77\x21\xf4\x25\xec\xf6\xfd\xff\xc7\xda\xfb\x83\xc9\x8d\x63\x79\x82\x04\x19\xff\xfa\x76\x66\x97\x2a\xb5\x4a\xec\xde\xb9\x19\xe6\xa8\xaa\xc5\xd9\xb9\x9d\xe5\x8d\x46\x12\xf6\xdb\x9b\x19\x7c\x77\x6b\xc0\x38\x03\xdf\x59\x30\x61\xc2\x84\x09\x13\x26\x4c\x98\x30\x61\xd2\xa4\x49\x93\x26\xcd\x30\x69\x86\x49\x93\x26\x5b\x19\x44\xdc\x47\x30\x22\x15\x29\xa9\xaa\xab\xba\xb7\x3a\x99\x11\x95\x11\x5d\x78\xef\xe1\x01\x78\x00\xde\xfb\xfd\x9e\xea\x62\xd6\xbc\xc4\x77\xaf\x1e\xde\x6f\x0e\x2a\xcb\x80\x04\x2d\x3b\x1e\xcf\xd5\xb1\x21\x71\x5a\xc6\x4d\xd7\xb8\x44\x73\x0e\x49\xce\x21\xf2\xa3\x5d\x7f\x56\x94\xa3\x0a\xa4\x16\xa4\xdb\x82\x67\x69\x2f\x1d\x62\x9c\x08\xa8\x1b\x46\x85\xf4\xf5\x6c\xd7\xb4\x5b\x7d\xb3\xb2\x77\x49\xee\xbb\x7a\xf9\x27\x02\x01\x3f\x32\xdd\xa9\xc0\x18\xb7\xac\xbd\xef\x5e\xbd\xb9\xc7\x84\xfa\xee\xe5\x9b\xf7\x0f\x61\xc5\x8d\x0d\x66\xbc\xaa\x8c\xe0\x98\x58\x2c\xb8\x21\x1d\x38\x30\x86\x40\xb1\x53\xa6\x2c\x7c\x67\xca\xca\x19\x23\xcf\x32\xd1\xfe\x34\x68\x70\x00\xd2\x80\x28\x4f\x2d\x8a\x22\x00\xba\x0b\x4e\x16\x3f\xfc\xdf\xae\xed\x84\xed\xc7\x77\xf1\xe4\x4a\x6c\x4b\x44\x96\xf9\xb5\x6d\x3f\xa9\x4d\xca\x99\x03\x2b\x1e\xc7\xf5\x7e\x64\xf5\x85\x3b\xdf\xfd\xb6\x2f\xbc\xfb\xe7\x65\x82\xff\x09\x67\xd8\x8c\x2e\x07\x07\x10\xa2\x98\xf1\xe4\x7b\x0a\x74\x11\x1f\xe6\x29\xc9\x19\xcd\xf2\x02\x95\xa9\x35\xc6\x1a\x6b\xd7\xa3\x33\x1b\xbc\xe1\x68\xac\x5b\xa6\xcb\xc6\x80\xc3\xc9\xea\x73\xc3\xd8\xc1\xe4\xe5\xe4\x65\xb8\x4c\xd4\x3e\xdb\xa4\x9e\x3f\x73\x86\x5d\xc8\x47\x6d\xff\xd7\xc8\x3c\xb9\x65\xe2\x2f\xa9\xef\xfd\x69\xf0\x0d\x01\xae\x8c\x8b\xb9\x4f\x30\x63\x59\x91\x43\x98\x55\xc6\x19\x67\xad\x73\xa0\x74\xa6\x0a\x32\x9f\xac\x5d\x3d\xd8\x80\x68\xf8\x85\x32\x07\x5e\x37\x77\xc5\xb1\xbb\xe5\x8a\xdf\xfc\xf7\x87\x70\xc9\xf6\x95\xd0\x3f\xe5\xbb\xc9\x64\xb3\x0c\xd4\xc0\x50\x8f\x3c\xf5\xad\xcf\x48\x2c\x79\x3c\xcd\x87\x8d\x90\xb2\x28\x0a\x4c\xa0\x3f\x19\xdf\x6b\xdf\xdb\xf5\x56\xa9\x06\x85\x01\xf9\xa6\x2f\xb3\xb4\xa3\x56\x0e\x9d\x35\x4d\x63\xc8\x6c\x57\xd1\x65\xd8\xa5\x2d\x8f\x4d\x4a\xdf\x55\x55\xa8\x81\x08\xf9\x1a\xbf\xc6\xce\x3f\x33\x51\x14\x76\xf1\x8d\x8c\xf8\x31\xf8\x06\x01\xba\x00\x93\x3f\x24\x11\xa5\x79\x9e\x2f\xbe\xa1\xad\x5e\x67\x8a\xcc\x6a\x7b\x9b\x29\x16\xdf\x78\x3e\x53\xe4\xc5\xcf\xcd\x14\xfb\xc4\x5c\xd8\xbe\xde\xe9\xe8\xaf\xa2\xef\xc2\xde\xef\xff\x8c\x3e\x46\xff\xba\x5a\xfa\xfb\xed\xba\x56\xfc\xb0\xee\xaf\xb6\x37\xf8\xea\x97\xef\x9e\x67\x49\xdd\xf3\xdb\xad\x77\x07\x5b\xa9\xd2\xb4\x03\x11\x9b\x3a\x37\x30\x80\x34\x25\x0c\xd3\x4b\x94\xe4\x8a\x0b\x4a\x66\x53\xdb\x9c\x5e\xb9\xbc\x6a\x06\x72\x82\x18\xa2\xc0\x31\xa4\x10\x9b\xb9\xce\xb0\xc1\x3b\x8d\xf3\xac\xd5\xda\x1c\x8f\x56\x9e\x2a\x88\x05\x81\x8d\x3a\x09\xce\x94\xef\x7c\x9e\x67\x50\xc2\x8a\x62\x06\x06\x4a\x19\xa7\xf9\x71\x84\x53\x97\x67\x7e\xea\xcb\x2e\x8a\xf6\x71\x7e\x61\xfb\x6a\xa7\xa3\xff\x10\xbd\x88\x7e\x7f\xbd\x51\xf8\xbf\x42\x6f\x04\x07\x5a\x02\xc9\x5f\xa6\xd6\xeb\xcf\x47\xf3\x9b\x49\x95\xe0\x00\x08\xf5\x95\x1f\x07\x7f\x64\xa0\x71\x82\x31\x26\xbc\xdd\x44\x95\x16\x82\x9d\x8f\x47\x0b\xb5\xc1\xa9\xcd\xe5\x70\x92\x80\x2a\x2a\x98\xf4\xc8\x50\x61\xf5\x06\x73\x62\x11\xdf\x69\x52\xae\x8a\x19\xd5\x1b\x4c\x05\xc7\x27\x7d\xe2\x82\x2e\x8a\x15\x79\x86\x38\xb2\x8c\x30\x70\x62\x5c\x48\x8e\x4b\xdf\x77\x64\xb0\xcd\x09\xf6\x75\xb4\x8f\xdb\xab\x5e\xdf\xee\xaf\x1f\xde\xfe\x59\x8a\x6d\x91\x4a\xd3\x7e\x99\x8a\x86\x53\x7b\x89\x18\x10\x86\x13\x46\x99\x3f\x25\x42\x4b\xc1\xc8\x4c\xac\x2b\x85\x80\x07\x9b\xf1\xae\x93\x00\x31\x22\x08\xf3\xdc\x60\x66\x65\xd2\x71\x64\x10\xbb\xeb\x31\xa3\xfa\xaa\xc4\x92\xc0\xf6\x5e\x31\xc8\x90\xa1\x84\x81\x36\x28\xb6\x4c\x0c\x1d\x19\xba\xba\x43\xc7\x6a\xe5\xd0\xc6\x17\xb6\x69\x9f\x74\x5b\x76\x3b\x9f\x75\xbb\x32\x43\x7d\xa9\x1b\xb8\xdf\xe4\x7f\xa1\xe7\x8a\x4f\x16\x73\x95\x66\xa7\xa3\xac\xfb\xa3\x3f\x15\x00\x9d\x48\xa9\x0b\xec\xa7\x78\x32\x3d\x6f\xd8\xdc\x26\x19\xc7\x06\xf1\x96\x62\x8e\xe9\xd1\x96\x82\x96\xa9\xcb\x45\xd5\x89\x5a\x23\xaa\xd9\x4e\x93\x25\xa4\x51\x4d\xed\x27\x6b\x5b\x42\x19\xa6\xf4\xa8\x07\xc3\x95\xf1\xda\x54\xa8\xd6\x05\xa5\x5c\x50\xe8\x6d\x91\x41\x85\x6a\x82\x19\x50\xe5\x54\x05\x98\xe2\x68\x1f\xcb\x9f\xf4\xc5\xbf\xa0\xcb\x32\x5d\x8c\xa0\xa0\xfe\x38\x1e\xfd\xc0\x80\xae\x19\x66\x84\xfa\x3a\xa9\xac\x94\x9c\xce\x79\xe5\x4a\xa5\xe0\xe2\x89\x5d\x2f\x01\x16\x84\x53\xe1\x99\xa5\xdc\xaa\x64\x12\xd8\x60\x71\xef\x89\x47\x8d\xa8\x64\xb8\xff\xa2\xc3\x2c\xf9\xdc\x61\xd0\x9f\x5a\x72\x3a\xde\x3a\x6c\x1f\xb3\x9f\x9d\x3b\xfe\xcc\x41\xb6\xcd\x75\x96\x8e\x00\x31\xdf\x5d\xa2\xc1\x0f\x1c\x38\x23\x19\xe3\xc2\x37\x49\xcb\xad\x12\x64\x8e\x6a\x0b\xb5\x0e\x83\xec\x74\x92\x80\x4b\x2a\xa9\xf4\xd8\x10\x6e\xd5\x66\xed\xcd\x9d\x26\xd9\xea\x8c\x27\xad\x7a\x85\xb9\xe0\xb8\xd7\xb5\x65\x42\xf8\xa3\x2f\x8a\x0c\x09\xe8\x18\x66\xa0\x97\x52\x1a\x55\xc0\xe7\xce\x18\x07\x0c\x0e\x17\xb0\x05\xe0\xe7\x4c\xd1\x67\x00\xa8\xd7\x2b\x94\x1c\x84\x8b\x9e\xf7\xdf\xbc\x04\xda\x4d\xd8\x35\xc0\xf8\x5e\xf6\xa2\x53\x46\xf5\xac\xd1\x7e\x02\xca\xb8\x12\x28\x4f\x81\x93\x6c\x3e\xc5\x83\x30\x40\x79\xc5\x39\x25\x19\xa2\xd4\xb3\x9d\xd0\x45\x56\x69\x2d\x95\xa9\x7d\x07\xca\x46\x29\xe6\xb4\x49\x0f\xe6\x91\x32\x8c\x95\x11\x2c\x35\xd3\x7a\x5b\x75\x0a\x7b\x8d\xb0\xa7\xae\x76\x32\xfa\xcf\xe1\x6c\xf8\xb3\xbc\x3f\xbc\x7d\x02\xfa\x7d\xff\xf0\x7e\xfb\xf6\x87\xa7\xdb\xaa\x17\x5f\xdf\x56\xed\x5a\xd6\xf6\x60\xf0\xb6\x9a\x88\x1f\x1a\x7b\xf4\x47\x0e\x0e\x9d\xaf\xc1\xe0\x35\x02\x9d\x27\x49\x65\x9b\x65\x21\xe2\x9c\xd2\x0c\x53\x3a\xbb\x98\x19\x31\xe3\x9d\x94\x65\x5e\x99\x9a\x58\x39\xfa\x23\x20\x97\x48\x2b\xd6\x18\x5d\x2a\x78\x3e\x1a\xc1\x32\xe3\x27\x4c\x32\x9b\xe5\x83\xe1\x2b\x6e\xde\x26\x92\x17\xb9\xd7\x9b\x26\xfa\xeb\xe8\x65\xf4\xbb\x95\xf5\xfc\xca\x8c\x1a\xea\x50\xb6\x6b\x06\x7f\x98\xaf\xc1\xdd\x89\xe3\x9e\xbb\x4f\xc2\xc5\x63\x56\x38\x58\xf8\x8e\x0d\xde\x12\x20\x63\x0a\x08\x28\x91\x6f\x7d\x7b\x3e\x6e\xdd\x2c\x13\x34\x8d\x49\x39\xeb\x4d\xee\xeb\xee\x08\x28\x2c\x4b\x4c\x8e\xc2\x51\xc5\x24\x95\xc6\x50\x3f\x98\x35\x5a\x5d\xf1\x2e\xc8\x35\xef\xe5\x77\x4f\x6c\x8d\x0f\x4f\x90\x48\x0f\x7f\x78\x9b\x5c\x6b\x64\x5e\xbc\x79\x79\xcb\xac\xf8\x9a\x61\x74\xcb\x61\x06\x4e\xe7\x83\x36\x2a\x4e\xf3\x52\x23\xe2\x90\xc9\x4b\xd3\x02\x61\xac\xc5\x92\x91\x9c\xf3\xd2\x9b\x1a\x15\xa6\x80\x3b\x25\xb4\x99\x9b\xcf\x24\x83\x4e\xd0\xc7\xc5\x19\x0a\x80\x4b\xad\x1f\xbb\x0d\x0d\xa0\xf5\xe7\x69\xe5\x71\x8c\x47\x65\x6b\xd4\x98\x28\xda\x80\xe9\x49\xde\xdf\x5f\x6f\x9b\xbf\x94\x77\xf7\x8b\x04\xce\x70\x1e\x67\x8f\xda\x1a\x13\x93\x02\xda\xa2\xc4\x0d\x31\x05\xb4\x47\x50\xd9\xaa\xa2\x4a\xd0\x5c\x0a\xe4\x69\x83\xa1\x29\xf1\x4d\xe2\xd4\x1b\x0a\x14\x68\x83\xc4\x13\x42\x5f\x89\x3c\x47\x82\xa6\x2e\xc3\xf1\x70\x13\x39\x4a\x92\xf4\x82\xc2\xfd\xc5\x7f\xba\xd6\xff\x7f\x21\xf1\xcb\xeb\xb9\xf2\x67\x7a\xdc\x17\x0f\xdb\x06\x66\x40\x9d\x1b\x6b\x2d\x68\xb2\x42\xac\x5c\x17\xa5\xf3\xc2\x82\x88\x2f\x61\xcd\x4e\x51\x6e\x66\xeb\x53\xcf\x29\xb0\xe0\x18\xb7\x04\xfa\x6a\x34\xfe\x38\x1f\x28\x8d\xa7\x79\x04\x2a\x70\x58\xe1\xbd\xda\xa9\x28\x8d\xf2\x70\x47\xf6\xd4\xf6\x87\x9f\x69\x9c\xc2\x1c\x1c\xcf\xb8\x37\x92\x82\x63\x5e\x98\x95\xec\x99\x19\x5f\x1a\x10\x09\x70\xf4\xe5\xda\x7a\xe5\x53\x2f\xe9\x00\x38\x38\xc4\x35\x41\xde\xad\xcd\x33\x16\x9a\xd7\x51\xb4\x0d\xf1\xac\xdd\xb8\x28\xbb\x43\x87\x7c\xb8\x01\x0c\xdf\xf2\x4a\xae\x44\xd8\xdb\x67\xb0\xcd\x77\x73\xe3\xfa\xdb\xc6\x54\xcd\x76\x3b\xcd\x65\x09\x13\xe7\xb3\x16\x50\xea\xf9\xe4\xab\xa3\x2f\x09\x28\x3a\x8f\xe2\x93\x23\x9a\xe2\x9c\x31\xe8\x1b\xa3\xad\xae\x93\x42\x51\x47\x24\x68\x6a\x61\x78\x9d\xb0\x46\x6b\x46\x8d\xa1\x95\x06\x87\xc9\x38\x62\xe9\x6c\x05\xcd\x6d\x8e\x81\xc6\xbe\x77\xb2\x6e\x9b\x13\x1e\x1a\xd8\x9d\x48\xdf\x45\xdb\x98\x5f\x79\x11\x7e\x77\x77\x6a\xf7\xf0\xe1\x4b\x05\xd6\xe2\x8e\x87\xe7\xb8\xd3\xdf\xbd\xdc\xc7\xc9\x8f\xdf\xbf\xdc\xc7\xeb\x44\xff\x5d\xdc\x03\x96\x1f\xfc\x94\x08\x0f\xd3\x2c\x46\x7e\x30\x20\x97\xfe\x58\xd7\xca\x3b\x06\x4a\xe1\x8f\xa0\xb1\x44\x12\x9c\x33\x5a\x02\xc6\x73\x9b\x33\x20\xe4\xb2\xc7\x9b\xd9\xb2\xee\xda\xcd\x91\x2f\x3b\x7b\x6e\xbb\x46\x0f\x20\xf7\xa2\x55\x15\x28\xfc\x74\xee\x05\x3d\xb8\x14\xc7\xd0\xf7\xbe\x2f\x01\x06\xd9\x61\xf2\x3d\x06\x70\x84\xa5\x6f\x4f\x04\x44\x2b\x9e\xe1\x29\x9c\x83\xa1\xe8\x3f\xdf\x9d\x5c\x7f\x5b\x9f\x7f\x03\xff\x0e\xbe\xe8\x92\xa0\xd1\xdb\x55\xaf\x55\xa3\x12\xb4\x30\xf7\x78\xc3\xe6\x31\x2b\xe3\xd6\x5b\xbb\xa6\xfb\x4c\x95\xaf\x25\xaf\x21\xf7\x36\xce\x0c\x96\x61\x38\x95\x31\x76\xc2\x32\xab\x25\x36\x98\x7b\x64\x94\x33\xed\x93\x46\x4d\xa5\x4f\xe0\xe0\x4f\xbd\x84\x06\xc9\xe1\xdc\xae\xb9\x3e\x31\xf3\x83\x6f\x10\xa0\x20\x4d\xfd\xe4\x3b\x04\x30\x88\xca\xd2\x37\x27\xb2\xee\xf9\x97\x3e\x22\xfb\xe6\x97\xf5\xd1\x97\x4e\x76\xa7\xcb\xfa\x3e\x9e\x00\x2f\x33\x5f\x25\x95\xc7\x59\x11\x63\x7f\xd2\xe0\x20\xfc\xc9\x75\xc6\x57\x02\x64\xc6\x0f\xc0\x58\xa2\x30\xce\x28\x81\x71\xa9\x99\xa1\x6a\x66\x56\x68\xe3\x62\xcd\x90\x81\xf4\x2b\x8d\x06\x59\x9f\x86\x73\xc3\xd6\xc9\xec\x4e\x9f\xab\x16\x20\x7a\x52\x2c\xe8\xd3\x86\x5c\x26\x14\xfd\xfe\xee\xdc\xfb\xb9\x3e\x4f\x89\x35\x7f\xba\x8b\x92\x03\x90\x65\xe6\x75\xd2\x78\x1a\x14\xea\xd5\x28\xfc\x64\x1b\xed\x3b\xae\x85\xf2\x47\x50\x3b\x2c\x28\xc9\x39\xcb\xe2\x4c\x11\x83\x25\xa3\xd0\x94\xc4\x4b\xcd\x95\xb6\x9b\x4e\x2c\xea\x08\x73\x55\x67\x18\x24\x93\xf5\x70\x6e\x02\x35\x03\x8e\xf9\x4f\xf5\x0f\x5e\x6b\x1c\x43\xde\x68\xc0\xbc\xfe\xa7\x7b\x86\xce\xdb\xff\x56\x54\xfc\xcf\xf8\x3c\x6f\x6f\x40\xc8\xd7\xd4\xd5\x0f\x1f\x1f\xf6\x2d\x58\x66\x5a\xdf\x87\x43\x13\xe4\x69\x09\x34\x47\x18\x0b\x84\xdd\x09\x1f\x55\x5b\x22\xd6\x88\x4b\x04\x44\xa8\x50\x69\x81\x23\x85\xef\xf3\xed\xb1\xaa\x4c\xa5\x2a\x23\x4d\xda\x13\x84\x05\xc6\x86\x6b\x26\x2d\x82\xb2\x02\xd1\xf2\xd1\x63\xc7\x24\x0c\x67\xd9\xd5\x05\xef\xe5\x4e\x44\xbf\xbd\xcd\x52\xe0\xf5\xfe\x21\x4d\x76\x4f\x64\x08\xe1\xba\x21\xb9\xae\x28\x5f\x40\xc2\x83\xfb\x1a\xc8\xc6\xa2\x98\xa3\xb2\x82\x34\x67\x08\xa1\x83\x8f\x10\x91\x95\x02\xa9\x9e\x26\x2b\x28\xa5\x9a\x59\xde\xb2\x63\x9c\x4b\x88\x04\xf6\x0a\x95\xa2\xc0\x3b\x51\xd6\x8f\xf2\x12\xb5\xa9\x4b\x41\x99\x0c\x9a\xb3\x61\x96\xcb\x54\xab\xa1\x51\x4a\x71\x0f\xc1\x78\xac\x44\x37\x81\x53\x69\x05\x54\x94\x0b\x24\x58\x88\x27\xd8\x05\x27\xe3\x4e\x44\xaf\x9e\xbc\xff\xf5\x6e\xff\x90\xee\x9f\xd8\x27\xae\xc2\xbf\xfb\x93\xc2\x03\x66\xb2\x3c\x86\xa8\xb4\x25\xce\x09\x84\x30\xf5\x19\x22\xaa\x11\x93\x1e\x06\x23\x18\x21\x9a\x48\xd1\xd2\x3e\x8e\x02\xd8\xae\xb7\xb0\xe0\x05\xdc\x89\x92\xd2\x47\x31\xb5\xa9\x3d\x4c\x9b\x5c\x73\x36\xce\x61\x99\xd0\xa5\xd1\x4a\x73\x5f\x82\xba\xd6\x9f\x65\x67\x5c\xa2\x50\x54\xb8\x49\xd2\x0b\xde\x1e\x76\xf2\x2e\xab\x68\x85\xa8\x5c\xb9\xcc\x57\x0c\xfc\x77\xd7\x74\xcf\x2b\xd3\xd1\x8b\x2b\x26\xe2\x8a\xc8\x98\xa4\x58\x4a\x89\xb1\xac\x6b\xad\x55\x5d\xd7\xb5\xc0\x00\x4a\x04\x61\x03\xb7\x27\x6b\xad\xd5\xbe\x77\x3e\x77\xda\xb7\x00\x69\x07\x4e\x0e\x14\x75\x5d\xcf\x6a\x1c\xc7\x75\xff\x45\x2e\x34\x9e\x76\xf0\x09\x13\x72\x19\x71\xff\x1e\x45\xe0\xd5\x9b\x15\x86\x7f\x79\xbe\xa2\xf2\xf8\xf0\xfe\xe1\x05\x78\xff\xe6\xd5\xcb\xf7\x6f\xfe\xf7\xf8\xdd\xfb\xdb\xb5\x53\x48\x39\x5d\x77\x6d\xc7\x6a\x69\xfd\x98\x72\x51\xe0\x9c\xe5\x45\x96\x16\x59\x49\xb2\xf4\xe0\x11\x88\x84\x10\xa2\x28\x53\x9a\xc2\x13\x4b\x73\x5e\x9c\xb2\x94\x1f\xd2\x1d\xd4\x95\xaa\x65\x3d\xdb\x31\x35\x29\xe2\x69\xad\x33\x84\xb9\xda\x1c\xfc\xb1\xaa\x96\x95\x42\xd6\xb5\x27\x75\x93\xb5\xd5\x21\xf3\xd3\x09\x9e\x86\xa6\xc9\xbb\x3a\xdc\xdd\xf5\xd7\x7a\xd5\xff\x7e\xf5\xde\x1b\x93\xc7\xc7\xfd\x67\xf4\xec\xf7\xef\xde\xaf\xf2\xbf\xb8\xf2\xd3\xbc\x0d\xfa\x7d\xfc\xfe\xf5\x77\x2f\x82\x97\x6c\xad\x2e\x81\xa5\xa4\x80\x39\x2e\xf2\x03\x25\x92\x50\x22\x31\x77\xb4\x80\x0c\xe6\xb2\x48\x45\x59\x62\xad\x0b\x52\x1e\x7c\x53\x22\xa1\x77\xb2\x68\x1f\x23\xdf\xa4\x3a\x3d\xc1\xa3\xa7\x60\xec\xd4\x12\xa6\x48\x56\x0a\x8e\xa8\x00\xd4\xf7\x8c\x16\x86\x17\x42\xaa\x4c\x6a\x50\xc4\x93\x66\x64\x31\xfe\x36\xe0\x78\xa9\x90\x3f\xf8\xe3\xe7\x91\xb7\xbb\x13\x7e\x1d\x79\xdf\x25\x9f\xd3\x63\xbf\xe1\xb6\xeb\xc8\x63\x26\x2f\xe2\x5e\x68\xc2\x73\x41\x61\x79\x98\x25\x95\x72\x90\x00\xae\xb9\xb1\x4c\x33\xc7\xc6\x98\xeb\x12\x49\xe4\x29\x2e\x44\x81\xe3\x54\x31\x2a\xc4\x4e\x96\x8c\x3e\x96\x5e\x67\x36\x03\x45\x32\x39\xc5\xc0\x61\x36\xa0\xf3\x50\xcf\x38\xce\x7a\x23\xed\x14\x47\xa5\x15\x58\x96\x94\x21\x46\x3c\xa4\x42\x2a\x16\xad\x38\x03\x78\x2f\x7e\xbd\x0e\x2f\x1f\xbe\xa1\x03\xb6\x79\x19\x9f\xb8\xa4\x2a\x53\xac\x28\x16\x1d\x94\x38\x69\x40\x02\xae\x8a\xd1\x1d\x1b\x8c\x1f\x62\x69\x4a\xa4\x90\x27\x8b\x12\x24\x46\x0a\x2b\x24\x57\x25\x72\x6f\x53\x9b\x82\x7c\x73\xa8\x34\x03\xd1\x6c\xc3\x38\x9c\x69\x1c\x8d\x46\x55\x20\x8a\xd3\xb2\x12\x38\xd0\xe6\x33\xea\x91\x71\xd8\x99\x68\x1b\x89\x0b\xda\x97\x9b\x21\xec\x48\x9e\x38\x21\xef\x54\xb8\xce\x21\xdb\x67\xec\xf1\x4f\x5b\x2c\x70\xa7\x02\xa8\x5d\xbe\x8d\xb8\xc3\x2c\xe7\x04\x95\xe9\x23\x11\x56\xf4\xc9\x49\x09\xc1\xe5\xb9\x88\xa9\x8d\xd3\x79\xb4\x83\x6f\x38\x28\x7b\x0f\x01\x62\x48\x43\x16\x9f\xac\x66\xca\x6e\x86\x9c\x9d\xa9\x57\x99\xcb\xc6\xe4\x70\xd4\xf2\x88\x88\xa5\x8c\x0f\x4b\x00\x6c\xe6\x2e\x8e\x7c\x6f\xb5\x9c\x40\xcf\x15\x56\xc2\xe7\x4c\x0a\x45\xd7\x75\x13\x05\xbc\xb1\x9f\xe9\x87\x55\x89\xe8\x79\x3f\x2c\xe2\x7f\xd5\x0f\x49\x6f\x0b\x98\x50\xa9\xb9\xc9\xad\x28\x60\x7a\x1e\x2b\x2a\x41\xe6\x80\x36\x40\x7b\x69\xdc\xc8\xc1\xa1\xf6\x4d\x3c\x1a\x44\x15\x9d\x27\x0a\x05\xa4\xb1\xb4\x4c\x11\xfb\xe4\x4e\xa9\x4b\xfb\x0d\x1a\xe1\xb3\x8e\x28\x26\xab\xed\xf8\xed\x7e\x48\x0e\x57\x5f\x7a\x19\xfd\xf0\xcd\x7e\xf8\x15\xae\x44\x1d\x89\x3b\x2e\x89\xcc\x15\x5d\x3c\xc9\x50\x21\x7b\x09\x50\x20\x2c\xd1\xb6\xe5\x83\xbd\x44\x31\x35\x25\x92\xd0\x4b\x94\x8b\x02\xc5\xb9\xc4\x0a\x2d\xc3\xa1\xb9\x73\xa4\xfa\x3a\x1a\xae\xf2\x1f\x26\xa3\x1c\x38\x7c\x53\x81\x50\xab\xc5\xe3\x72\x03\x13\x18\xfd\xe6\xb6\xdf\x78\xff\xf0\x87\xb7\xb1\x2a\x73\xc0\xcf\x25\xe8\xb2\x2c\x81\x18\x4b\x09\x8b\x68\x0b\xf0\x05\xef\xda\x04\x86\x2c\x9c\xbf\xbf\x72\xa4\x5e\xab\x87\xd6\x0d\xc9\x15\xcd\xf5\xe1\x7d\x28\xe8\x5e\x2f\xc8\xff\x01\xbc\xfa\xed\xbb\x00\x20\xf1\x00\xf8\x16\x7a\x0c\x7a\xfb\x58\x1b\x50\x7b\x11\x8f\x47\x4f\x36\xc4\xb7\x18\xf7\x85\xef\xcb\x36\xf7\x53\x92\x16\x20\x7b\xac\x37\xe4\xb1\x4e\xa0\xe4\xe7\x11\xa1\x24\xe5\x9c\x73\x2f\x30\x84\xac\x2d\x75\x4a\x61\xc1\x7c\x1e\xea\x9a\xb7\xd1\x12\x0b\xb0\xc4\x5c\xf9\x32\x7f\x17\xee\x63\x9e\xf4\x00\xdf\x40\xed\xdb\x1c\x60\x9e\x44\x7f\xc4\xf1\x98\xe5\x73\xb3\xed\x3e\xc1\xf0\x58\xfb\x58\x5b\x1b\x9a\x35\x70\x99\x32\x0b\x7f\x12\x58\x62\xaf\xca\x12\xa8\x9e\x2e\xb6\x32\x09\xdc\xb3\x4d\x11\xed\xc3\x7a\xb3\xfc\x17\xdf\xef\x99\xfd\xc4\xec\xa6\x18\x45\xe0\x21\xde\x44\xcd\x06\xed\xc9\x4e\x46\xdf\x5d\xfd\x3a\x02\xef\x42\xfe\xdb\x7f\xba\xe5\x9c\xbc\xfd\xe1\xfd\x8f\xef\xee\x19\x50\xd7\x3f\xbd\xbe\x31\x54\xbf\xfd\x10\xe7\x46\x73\x6a\xbb\x43\xa3\x89\x73\xdc\x31\x80\x13\x66\x14\xa7\xe6\xd8\x6a\xe2\x6a\xee\x28\xc0\x8f\xad\xcc\x84\xe4\x89\x54\xcb\xcb\x4e\xda\x02\x72\x02\x0f\x08\x4b\x8a\x18\x52\xbc\xaa\xbe\xfa\x0b\xce\x0c\x43\x54\x84\xdf\xa1\xef\x4d\xac\xf7\x22\x69\x83\x3e\x57\x0b\xed\x85\xfd\x44\x6c\xd2\xfa\xae\x69\x00\xbc\x7e\x87\x27\xe3\xb3\xef\x70\xfb\x89\xda\x64\xf4\x76\x18\x00\x8f\x36\x91\xdd\x14\x7b\xba\x13\xd1\x8b\x6b\xee\x59\x04\xde\xed\xf6\xf7\xdc\xe8\x6f\x7f\xb8\x27\x2e\xfe\xe1\xe5\xf2\xf1\x33\x8d\x0b\x73\xc8\xb5\x24\xd6\x6a\xc9\x8c\xa5\x8e\x82\x62\x7b\x20\xce\x55\x86\xd5\x2d\xab\x18\x40\xb9\x3d\xe4\xf6\x93\xb2\x25\xb4\x28\x91\xe1\x65\x27\x38\x45\x4c\x0a\x88\xb0\xe4\x44\x62\xa1\x41\x2a\x59\x09\xd7\x7f\x93\x0a\x60\xc1\x10\x2d\x2c\x2f\xa5\x5a\x56\x34\xb5\xc6\xb7\x70\xef\xc0\x74\xe5\x7d\xbb\xde\xd5\x80\xdd\x66\xd9\x13\x06\x19\xaf\x22\xed\x22\xc5\x8f\x20\x05\x18\xcf\xc6\x0f\xd0\x0b\xdf\xd0\x04\x1e\xcc\x21\x47\xe4\x78\x36\x9a\x09\x29\x80\xa3\x92\xb3\xd2\x09\x10\xf1\x63\xa9\x39\xe8\x52\xc1\xca\x82\x68\x54\xb3\x10\xee\x45\x20\xd2\x40\xed\x79\x6c\xbf\xb4\x1f\xb1\xb1\xf5\x83\xb5\x20\x5b\x7c\x26\xae\xf6\x64\x1b\xfd\x5a\x9f\x79\x7b\x67\xc1\xad\xd2\xab\xcf\xb4\x9a\xda\x2a\x78\xc8\xb9\x0a\x7f\x3a\x2e\x5e\x54\x71\xcb\x00\x19\x55\xc6\x15\x4b\x54\x70\x99\x6d\xe4\x4a\xc4\x29\x3a\x10\x22\x19\xe2\x48\xc9\xa6\xfa\xea\x2f\x24\xb7\x02\x33\x15\x7e\xaf\xe7\x61\xf6\x82\x02\x87\xff\xcb\x80\x9c\xfc\xe1\x76\xf2\x7d\xeb\xed\x1f\x7e\x5c\x16\x99\x75\x82\xbb\xff\x64\x31\xf2\x7f\x4c\xf6\xb7\x8f\x92\xde\x1e\xa0\x14\x86\x58\xa6\xba\x8e\x7a\xe5\xd5\xe8\x33\x9a\xa4\x9e\x3a\xc6\xac\x02\x83\x3b\x14\x98\x69\x62\x99\x99\x00\xc4\x73\x7d\x89\x88\xe8\x06\xcb\x92\xc2\x43\xbb\x7c\x65\x1b\xa5\x95\xca\x4b\x6d\xa1\x53\x94\xdb\x41\xf9\x01\x6b\x01\x74\xd1\xc8\xd2\xfa\x26\xb5\x92\x20\x6d\x61\xad\x25\x72\x0a\xe4\x82\x0a\x92\x19\x05\x44\x51\xcb\xf2\xca\x5b\x90\x07\xac\x0e\x79\x3d\xdb\xbb\xe5\x6d\xbc\x4b\xaf\x19\x08\xdb\xb7\x3f\x7c\x77\xef\xa5\xe0\xdd\x8b\x2b\xbb\xfc\xa2\xe3\x8b\xfb\x8f\xb6\xc8\x95\x20\xea\x45\x77\x92\x81\x89\xac\x05\xda\x40\x62\xc9\x2c\x6c\x51\x3a\x04\x50\x95\xb6\xa0\xa0\xfe\x54\x59\x6f\x29\x98\x80\x71\x88\x5a\x36\x4b\x07\x4b\x87\x77\xd2\x9f\x2a\xd3\xe8\x46\xd5\x5a\x09\x00\xa7\xb2\xab\x88\x75\xf9\x51\x97\xd5\x3c\xf9\x16\x42\xdf\x6b\x67\x41\x7a\x89\x2a\x73\x02\xa4\x29\x07\x4b\x1a\x53\x1c\x4d\x59\x47\x51\x02\xcc\x05\xef\x54\xdc\x5d\x19\xf6\xa2\x1f\xc3\xfd\xe2\xdd\xc9\xe9\xb2\xf8\x6c\x5f\x3d\xbc\x8f\x0b\xbb\x19\x29\xe5\x36\x77\x0c\x9e\x51\xd2\x2e\x8f\xf2\x5d\xa2\x66\x2a\xf8\xc1\x1e\x38\x04\x0d\x93\x9c\x07\x0e\x83\x9f\xb0\xcd\xf7\x7f\xc2\x36\xbb\xaf\x6c\x43\x5c\x39\x1d\x79\xdb\x53\xdf\x09\x70\x68\x81\xb0\x25\x35\x78\x56\x0e\x42\x1b\x50\xad\x6a\x90\x53\x3f\x56\xc6\x57\x14\x9c\x80\xb6\x08\x1b\x32\x1b\x5b\x96\x16\x2d\xa6\xa9\x75\xa3\x1b\x53\xdb\xd5\x34\xad\xc5\xc6\x15\xad\x2a\xdc\x3c\xfa\x16\x21\x3f\xe8\x80\x3b\x19\x2c\x53\xc3\xa3\xc1\x95\xc9\xfb\x60\x99\xc5\x5f\x79\xdc\x6d\x0e\x81\xf7\xf3\xf7\x57\x1d\x96\xb1\xf3\xe1\xe3\xbb\xdf\xde\x79\xed\x1f\xae\x0e\x1b\x68\x3b\x3f\xbe\xdb\xed\xbf\xfc\x24\xc6\x7a\xa4\x20\x6a\x0e\xba\xcc\x33\x81\x28\xc4\x84\x50\xe7\x89\xcc\xa4\xe0\x20\x17\x7e\xa0\x63\x7d\x30\x87\x8c\x8a\x92\x96\x98\x52\x5a\x79\x28\x33\x21\xf8\x16\x2a\x28\xca\xda\x0a\x92\x1e\x30\x63\xa4\x2c\x0b\xc1\x00\xc9\x24\x43\x64\xee\x2c\x16\x65\x5d\x51\x5c\x62\xc4\x50\x01\x11\x57\xa0\xcc\x04\x41\x01\x4b\x26\x39\xfe\xa9\x3e\xf8\xf0\x1d\xf8\xaa\x0f\x5e\x7f\xd3\x3f\xa5\x2d\x86\x96\x35\x1d\xf3\x03\x1b\x6b\xc0\x75\x89\x0d\x9e\x2b\x53\xe4\x16\x82\xdc\xa5\xcd\x44\x2e\x91\x91\xfe\x44\x80\x06\xc2\x40\xa4\xc9\xec\x6c\x51\x58\x18\x9c\xd3\x36\xaa\x59\x36\xe7\x1c\x20\x10\x95\x8d\x25\xda\xe6\x47\x53\xd4\x57\xef\xec\xe4\xe2\x9d\x7e\x72\x7a\x58\xbc\x73\xe9\x03\x55\xb4\xba\x74\x6b\x1f\x98\x0b\xdc\xf3\xd8\x44\x49\xe8\x85\xfc\xc6\xb9\xf0\x75\x7d\x54\x38\x4a\x7f\xbd\xff\xc3\x8f\xa0\xde\xd4\x8f\xa4\xda\x8e\xb3\x20\x3a\x1c\x77\xc0\x19\x01\xc6\x9c\xaf\x31\xc8\x93\xd3\x32\xd6\x8e\x97\x28\x36\x4a\x6a\x7f\x62\x34\xb3\x39\x06\x11\x12\x56\x58\x62\xb8\x91\x3a\xf0\x8c\x2e\xe3\x5b\x6d\xa3\x2f\xed\xf7\xdb\xcf\xd7\xab\x5f\xfb\xf0\xe6\x76\xdb\xf5\x6c\x49\xde\xb4\x16\x02\x04\x52\xee\xc7\x65\x83\x5a\x71\x20\x4e\x5e\x59\x8c\x1c\x4b\x8c\x46\xc2\x08\x0f\xdd\x01\x44\x80\x52\x6f\x87\xc6\x13\x12\x0b\x30\x59\xca\x8c\x3c\x9f\x2a\x8c\x2b\xb6\x8d\x06\xc3\x95\x32\xdc\x70\x49\x41\x54\x17\x95\x2c\x8d\x2a\x9c\x22\xc2\xb3\x4b\x54\xe4\x23\x75\xe2\x74\x54\xa6\x9a\x4c\x59\x0b\xac\x45\x51\x89\x52\x5f\xd7\x69\xbc\x17\x89\x7b\xbe\x4e\xbb\x4f\xcc\x25\xce\x57\xc7\x23\xa0\xe1\x5c\xc1\x6e\xa2\x9d\x09\xd8\xb1\x57\xfc\xff\xcf\x67\x37\xef\x6f\x9c\x38\x57\x46\xed\xe4\xe1\x73\xb1\xc8\x95\x09\xa0\xba\xf1\xd3\xaa\x33\x07\xca\xb7\x31\x35\x82\x2a\xe5\x6b\x21\x2c\x73\x10\x94\x21\x23\xbf\x36\xa9\x57\xbe\xcc\xfb\xc6\x1f\xb7\x4d\xdf\xeb\xa3\xd6\x47\xaf\xb8\x96\x96\x73\x52\x0b\x21\xfc\x78\x3c\xea\xa9\x28\x94\x24\x36\xcf\x41\xb6\xac\xb9\xf0\x82\x93\x6e\x27\xa2\xff\x14\x30\xb3\x42\xf1\xc5\x67\x6e\xc5\x97\xdf\x40\x7f\x09\x2a\x7e\x00\xd2\xa6\x39\xa8\xa9\x91\x02\xfb\x8e\x39\x79\x52\x4a\xcb\xbe\x8f\xb3\xbe\x1f\x80\xb2\xf3\x60\xdd\x4e\x94\x18\xeb\xb1\xa5\x55\x35\xb6\x12\x14\x5e\x2b\x9a\xf7\xc6\x4f\xe0\x60\x8e\xf6\x9c\x51\x9a\xb4\xc5\x32\x96\xfa\x0b\x0a\xf5\x92\x3f\x31\x96\xf6\x3f\x31\x96\xfe\xf0\x8d\xb1\x64\x6d\xd1\xd7\xac\x6a\xf8\xc8\x4f\x15\x60\x0a\x32\x45\xe7\x93\x2e\xa1\xc1\xe0\x60\x0f\xd5\x48\x06\xa3\x7d\x4f\x80\x03\xdc\x20\xa2\xe8\x7c\x34\x10\x19\x72\x1b\x49\xb5\xae\xf5\x75\x24\xb5\x0e\xd9\x2a\xef\x4d\x51\xfb\xc8\xb7\x10\xf9\xa3\x74\x06\x64\xd7\x91\x54\x95\xbd\xc5\xb5\x2d\x3a\x55\xb8\xc5\x0f\xa6\x0b\xda\x37\xb1\x0a\x2c\x68\x0f\xbf\x0f\xd9\x19\xe1\x8a\x32\x4e\x9e\x21\x45\x00\xb9\xd1\x07\x07\xf3\xdc\xa6\x8c\xa9\x29\xf3\x07\xe0\x3c\xb3\xa1\x9a\xa8\x8e\x95\x77\xbe\x51\x2a\x3f\x59\xc0\x00\x69\x57\x8c\x88\xf6\xea\x67\x68\x2f\x12\xfb\x0d\x3f\xb3\xbe\xea\xba\xe0\x67\xe6\x92\x6f\x6d\xd2\x05\x2f\x5b\x77\x6d\xcf\x67\xd2\x30\xac\x3e\xde\xac\xb8\xfe\xcb\xfb\x67\x5f\xb9\x86\x00\xf1\x64\x72\x8c\x04\x56\x94\x5a\xcd\x27\x3f\x6a\x0f\x31\x10\x5a\xf8\x46\x11\x2a\x28\xa8\x94\x47\x18\x10\xcd\x5d\x06\xa1\xc0\x8a\xd0\xca\xf2\x4b\x34\xcb\xf0\x71\xd2\xd5\x3c\xcb\x19\x23\x1c\x13\x2a\x2b\x59\x31\x85\x25\x93\x58\x62\x8e\x67\x52\x33\x85\x24\x1b\x2d\xcf\x52\xc2\x08\xc3\x84\xc9\x0a\xa8\xf0\x61\xe0\x7f\x59\xeb\x20\x7f\x1f\x10\x96\xdf\xad\x19\xfb\x57\xdc\xf1\xfd\x7f\x04\x01\x79\x3c\x79\xf3\xfe\xdd\xfe\x6f\xc1\xdf\x81\x0f\x2f\xb7\xc4\x85\xdc\x14\x9e\x9f\xd4\x51\x74\x0a\x21\x4b\xe9\x49\x5b\x8c\x4e\x69\x06\x0b\x64\xf3\x9d\xf4\xa3\x9d\x3c\xf2\xad\x52\x5a\x2b\x84\x58\xa9\xb9\x1d\x80\x72\x4e\xb4\x48\x0e\x60\x9d\x07\xc5\x05\x06\x3e\xbf\x65\x95\xfe\xaf\x6b\x9c\xf7\xdb\xfd\x7d\xa0\xb7\x0c\xc5\x0f\xe0\x75\xf2\xf6\x9b\x1f\xfc\xf8\x3a\x79\x1b\xe7\xf6\xa0\x39\x33\xc7\xf4\xd4\x8a\xaa\xe6\xbe\x25\x23\xa7\x7e\x70\xcc\x02\x61\x0f\x8a\x71\xdb\xa6\x83\xe3\x55\x25\xfc\x31\x7c\x34\x9a\x65\x8f\x6b\x04\x11\xd2\x30\xac\x6b\x55\xab\xc1\x68\xde\x38\x10\x65\xde\xe5\xde\x59\x89\x98\x54\xa4\xd4\x8d\x6a\x44\xaf\x35\x6b\xec\x98\xf9\x26\xbf\xdd\x41\xa0\xbd\x4b\xaa\xeb\xb8\x59\x6f\xf1\xee\x67\xd0\x0f\xcf\x67\xd0\xdf\x5e\x97\xce\x40\x0b\xf0\xec\x1b\x1b\x6a\x0b\x80\x41\x8e\x7c\xe7\x8f\xca\x2b\x01\x78\xef\x5b\x4d\xa4\x90\x09\x33\x44\x49\xe1\x99\xcd\x69\xad\x35\x6b\x15\xac\x24\xf6\xd8\x0f\xd2\x23\x01\xf4\xe8\x8f\x8a\x1a\x61\x93\x4a\x73\xa6\xad\xe3\x96\x19\xdc\x55\x2b\xa5\x73\x29\x19\xa2\xbe\x52\xbc\x84\x82\x12\x02\xd3\x32\x35\xb4\xa9\xb8\x26\x3d\x2b\xcc\x4a\x1f\x16\xb0\xc8\xf8\xde\xc4\xcb\xde\xf5\x8e\xc7\xf0\x3a\x33\xe2\x98\x05\x84\xb3\x70\x1b\x5b\xcc\x0e\xb0\xbe\x37\xbd\x31\xfd\x32\x26\x40\xb3\xe7\x49\xfe\x8d\xfd\x4f\xee\x6d\x7f\x04\x6c\x89\xdf\x13\xb2\xa7\xa1\x86\xfc\x76\x0a\x70\x0d\xd6\x6f\x7c\xd2\x8b\x4f\xfd\xf0\xe2\xc7\x67\x51\xfd\xed\x8f\xcf\x36\x7e\x56\x31\x66\xda\x43\xda\x18\x66\x1c\xca\x19\xe6\xcb\xde\xcf\x6a\x46\x4d\x9b\x36\x9a\x19\x8b\x73\x86\x19\x40\x8f\x8d\xce\xc4\x12\xcb\xeb\x9c\x29\xba\x93\x03\xa2\x42\x92\x2c\x17\x5c\x49\x46\x73\x5c\xe8\x0a\x1c\xc6\xf5\xaf\xf0\xd9\x1f\x79\xde\x59\xac\xeb\xf0\xfb\xea\x93\xfd\xd5\x27\xff\x29\xe4\x5a\x3f\xb9\xde\x53\x14\xbc\xba\xde\xed\x83\xfd\xee\xd5\x17\x9f\xc4\xd2\x1e\x1a\xc5\x9b\x29\x05\xe9\x49\x1c\x07\xe1\x15\x01\x48\x12\x5f\x57\xcc\x81\xca\xa5\x95\xe2\xf5\x78\x00\x69\x1b\x02\x64\x43\x40\xae\xb8\x6f\x2c\xb3\x3b\x69\x25\x95\xd2\x70\x14\x66\xc5\xd1\x68\x71\xb4\xc3\xea\x97\x4e\x22\x2e\x15\xc9\x32\x5d\xeb\xc5\x31\x0d\x6f\xec\xe9\xea\x98\xbb\x18\xfd\x64\xec\xfe\xd3\x6b\xfb\xb7\x63\xf7\x4d\xef\x96\xb5\xfd\x20\x2e\x91\x3f\x29\xaf\x39\x60\x27\x70\xb2\x44\x58\x71\x1e\x2d\x42\x8e\x02\x55\xa7\x13\xa0\xc4\x9b\xbe\xf2\x98\xc5\x7c\x59\xda\xa5\xd5\xe7\xb1\x42\xb8\xa2\x4f\x31\xaa\xae\x8d\x12\x00\x0f\x21\x7c\xaf\x42\x78\x1e\x02\xa4\xd2\x77\xca\xb9\x65\x5a\xaf\xef\xc3\xf7\x6b\x90\xba\x8d\xcd\x45\x5f\xd7\xa6\xcf\xb8\xef\xdf\xbf\x7e\xf8\x9c\x68\x00\xae\x69\x05\xf7\xb8\xef\xdb\x08\xe7\x71\x66\xce\xcc\xc5\x69\x01\x63\x04\xa2\x4f\x23\x38\xd8\x1b\xbe\xd6\x8a\xb1\xc5\xa5\x57\xe3\x04\x34\x23\x3e\x7a\xec\xad\xdd\x14\xde\x1d\xe7\xae\x9f\xbb\x63\xb4\x4d\xf0\x45\x5f\x6d\xf8\x93\xed\x5e\x2b\x83\xef\xdb\xa5\xb0\x00\xbd\x9d\x23\x07\x9a\x1c\xc6\x59\xf7\x58\x1f\xed\x35\x49\x32\x3c\xa1\xd5\xba\xed\x00\x0d\xad\x1e\x8d\xd9\x94\xde\xf6\x4b\xab\x6d\x1f\xce\x6c\xf4\x45\xec\xe5\xb6\xfc\x75\xfa\x6e\x22\x98\x25\x07\xf7\xc9\xba\x78\xcc\xf2\x24\x02\xe9\x1f\x53\x90\xb9\x44\x9f\xe5\xed\xd9\x96\x84\x7a\x77\x3c\x02\x86\xa1\xe7\x67\x63\x4c\x22\x7c\x7f\x45\x27\x0c\xf9\x9a\xe5\xc6\xec\x54\xb4\x7d\xc6\x10\xf7\x14\x17\x7d\x05\xb8\xf4\x01\x7c\x51\xd9\x07\x2c\x83\x1a\xd2\x38\xaf\x20\x05\x07\x2f\x41\xeb\xd1\xba\xae\x4a\x30\x31\x8f\x87\x01\xa8\x71\x36\xe1\x65\xa7\x84\x86\x9a\x97\x85\x55\xe7\xae\x36\x8b\x6d\x4c\x9d\x40\xe7\x0f\x5d\xd7\xcd\xc3\xf1\x78\xbc\x72\xe7\x95\x21\x87\xe7\x27\x64\x7a\xf7\x27\x65\xda\x46\xb8\xd4\x25\x8e\xd3\xaa\x24\x8d\xaf\x96\x95\x6a\x4d\xa4\xac\xc0\x40\x3c\x5d\x96\xed\x6e\x3e\x85\x97\x9d\x10\x0a\x69\x01\x0b\xab\xcf\x7d\x1b\x8a\x37\x55\x9b\x14\x95\x3f\x04\x18\xd6\xbe\xef\xd7\x33\xb5\x15\x8b\xfc\xf8\x85\x44\xd7\x5a\xe3\x2f\xd1\xca\xfe\xf0\x36\xf9\x12\xc7\xd6\x51\x08\x34\x2a\xaa\x02\x01\x39\xab\xa4\x3c\x1f\xed\xb9\x49\xf0\x2c\x01\x2e\x10\x06\xa3\x4f\x63\x0d\xc6\x47\x7d\x7b\xb7\xa9\x29\xe7\x12\x52\x32\x73\x6d\xa7\xc9\xea\xd8\x22\xe4\x85\xd6\xda\x4b\xad\x75\x18\xef\xf0\x82\x42\xae\xf8\x37\xec\xb4\xff\xa6\x64\x5f\xa1\x02\x9f\xc8\x62\xa7\x36\x9e\x70\x59\x23\x0c\xd2\x79\x8a\xc9\x5c\xdb\x00\x3b\x36\x05\x0a\x98\x38\x05\xf2\x2c\x6f\xef\xb6\x05\xe5\x90\x93\x5e\x1b\xa8\xd8\x4c\x2b\x33\x8e\xa6\x02\x76\x91\x8a\x2f\x52\xed\x12\xf6\xf3\x7d\xf7\xa7\xfd\x69\x63\x29\x32\x90\xc4\xe9\xea\x4f\x1a\x1c\x7d\x69\xc3\xd8\xd5\xe0\x44\x3d\x3b\x9d\x02\x90\x75\x78\xf9\xdc\x79\xea\x7c\x6c\x56\x7f\x6a\x92\xd2\xad\x9d\x77\xba\xfa\x53\x6c\x2f\x70\x6f\x76\xfa\x57\xf8\xd3\x17\x76\xda\x94\x0c\x1a\x48\x63\x55\x23\x76\xf2\x24\x2e\xe6\x7e\xc5\xe4\x21\x31\x17\x73\xfb\x0d\xac\x67\xcd\x35\x54\x8b\xa3\xcb\x73\xd7\x1a\xaf\x80\x32\x6d\x02\xad\x4f\x83\x57\x05\xc1\x76\xf1\xf1\x9a\xab\xf6\xcb\x6d\xf5\xa5\x5c\x90\x22\x0b\x49\x4c\x6b\xc4\x40\xe6\x03\x9f\xc6\x0a\x7d\x46\xe3\x4c\xf8\xf4\x9a\xd0\x9f\xcd\xe8\xf6\x6e\x27\x98\x44\x92\xa1\xdb\x08\x34\x40\xdc\x8f\xc0\xae\xeb\xc2\x9c\x00\x13\xbc\x93\x7f\xfe\xf8\x03\x18\x17\xba\xc0\xe0\x64\x08\xaa\x56\x14\x48\xe3\x3b\x00\xfd\x00\x24\xf5\x9d\x52\x20\x95\x5e\x86\x97\x9d\x14\xba\xd0\xbc\xa0\x96\x9f\x3b\xbb\x5a\xca\x06\x4b\x3d\x09\x14\xee\xe0\xe9\x05\x6f\x8a\x9d\x8e\xfe\x3a\xa0\x95\x3e\xcb\x37\x03\x0f\x57\x30\xad\xef\xff\x07\xd8\xbf\xf9\xfb\x40\x4b\xf6\xdd\x7a\x70\xf9\xe2\x61\x53\x98\xd9\x19\x20\xf2\xd2\xa0\xc2\xb3\xd8\x4e\xcb\x9e\x8d\x0a\x5d\xd2\xe1\x12\x51\x88\x45\x95\x9b\xb4\xc4\xc2\x4f\xdb\xde\xd7\x5d\x07\x08\x46\x05\x61\x9e\x6b\x6f\x8c\x97\xa9\x95\xa6\xb6\x02\x70\x30\x14\xa7\xce\xa2\x84\xae\xf2\xb0\x0b\xd9\x57\xdb\x22\xfa\xeb\xdb\x4c\x70\x37\x53\xdf\xf0\xc3\xbe\xff\x07\xb0\x7f\xc8\x7f\x78\xbb\xdf\xed\xdf\x46\x4f\x02\xe5\x30\x8f\x4f\xcb\x9c\x9d\x64\x59\x3e\x1f\xb7\x7c\x0e\x20\x5c\x0d\x38\x00\x05\x7d\x33\xf7\xde\x68\x46\xb4\x00\x12\xd9\x0c\xb9\x7e\x36\xcb\xa8\xf3\xe3\x62\x2e\x82\x3c\x34\x83\xf1\x53\xea\x94\x13\x9c\x0b\x90\x01\x91\x1b\x79\xcc\x63\xb1\xe6\x13\x4e\xc1\xa7\x7e\xca\x4e\x0f\x9f\xed\x94\x3f\xb7\xd3\x9e\xdb\xb9\x70\xa0\xcd\x0b\x8b\x72\x9f\x25\xa9\xef\x00\xf7\x56\x35\x35\x94\xbe\xf3\x0d\x47\x54\x1e\x0b\x9b\x42\xa2\x7d\xb7\x58\xaa\x6d\x01\xc1\xb0\x0c\xd9\xc4\x7e\xe9\xb8\xcc\x69\x5d\x5b\x09\x04\xe8\x8b\xa1\xd5\x38\xc1\x51\x14\x27\xec\x42\xff\x3c\x79\x84\x99\xb1\x06\xa6\x80\x16\x97\x1e\xc6\x27\x7f\x02\xc4\xd7\xb2\xaa\x4a\xe9\x07\xdf\xf3\x5b\xcf\x31\xee\xfb\x6f\xf6\x5c\x66\x95\xa9\xb5\x00\x0c\x9c\x8a\xa1\xb3\x65\x42\x16\xfb\xac\xb8\x6c\xbf\x58\x9e\xa7\x6e\xdb\x63\x7b\x96\x36\x4e\xf3\xc2\xc1\x62\xee\x12\xb7\x42\xc0\xb9\xa1\x87\xce\x6b\x2f\x04\x95\x12\xa4\xd0\x64\x48\xd4\x5e\x3d\x37\x10\xb1\xbe\x09\x06\x32\xa6\xbd\x1a\x28\xb8\x52\x19\xc5\x51\x73\x91\x7b\x92\x14\xd1\x5f\x45\xc5\x9d\x3c\x6f\x3f\x7e\xff\x77\xe0\x0e\x09\xe4\x09\xf7\xe3\xe3\x8a\xf6\xbd\xc7\xee\x53\x6d\xe3\x53\x6e\xf3\x6c\xd1\x30\xe7\x8c\x7b\x1c\x4f\x7f\xe4\xc9\xc1\x23\xa1\x30\x70\x23\x35\x6d\x22\xeb\x26\x6e\x7c\xef\x2a\x50\xa2\x12\xc2\x8a\x1b\x01\x4b\xe1\xb4\x76\x3c\xcf\x04\x51\x8c\x40\xbc\xe6\x8f\xb0\x10\xf7\xa8\xbb\x9c\xce\xe7\x3e\xfd\xb9\x1c\xfb\x87\xe4\x2e\xa7\x73\x2b\x60\x0e\x5a\x3b\xe7\x16\x54\x59\x09\x70\x5d\x4b\xdb\x1d\x99\x3b\x51\x10\xd9\x44\x78\x0d\xfa\xc7\x23\x68\xbd\xdb\x29\xa1\xbc\xed\x47\xa0\x38\xf5\xa5\x3b\xca\xae\x23\x6a\x14\x46\x2d\x7d\x25\x8c\x59\xeb\x74\x36\xf1\x18\x78\x62\xff\xb4\x1c\xdb\x2f\xe4\x28\x51\x01\x06\x77\xee\x1c\xe8\xf3\x12\xf0\xae\x91\xd5\x69\xe0\xf5\x25\xa2\x20\xab\x92\xce\xb3\x38\x7d\x64\x60\xf2\x62\xa7\xb8\xf2\xa6\x1f\x81\x66\x8b\x20\x9d\xea\x3a\xa2\x4f\xd2\x2a\x6f\xac\x17\xd6\x06\x41\x36\x20\xdb\xe8\xdd\xb0\x43\x51\x72\x65\x1f\x0a\x08\xf6\x1f\xef\xaa\x53\x40\xb6\x3d\x7e\x2a\xd7\xb2\x93\x06\x14\x06\x94\x3b\xe4\xb1\x59\x19\x6f\xe3\x65\x0f\xb1\x37\x1b\x1e\x6e\x41\x9f\xed\xae\x42\x02\xd4\xfd\xa2\xfc\xfe\xe1\xed\xba\xe5\x7a\xf8\xf0\xf1\xe1\x7b\x10\xc5\xb5\x8b\xeb\x99\x24\xc8\xf3\x02\x82\x62\xd6\xf1\x34\x1f\xdc\x7c\x88\xa7\xd9\x82\x42\x78\x99\xa0\x99\xc4\x19\x38\xc2\x62\xe6\x30\x99\x84\xd0\xd2\x50\xa2\xb5\x19\x06\xa3\x75\x65\xa4\x27\xcb\x16\x2f\x8e\x45\x84\xae\x18\x1f\xff\xf8\xa5\x0c\x37\x38\xcd\x1b\x2c\xe4\xbb\x3f\xdc\x0b\x11\x0f\xa0\x0f\xd7\xbd\x31\xbc\x44\xb0\xe8\x3d\x8c\xe1\xdc\xad\x4b\x1e\x9c\x4a\x78\x89\x62\xe2\x0b\xa0\x41\x86\x72\x5f\x96\x6b\x9a\x8a\x51\xd8\x54\xc6\xd7\x80\x98\xca\x70\x66\xac\x4f\x05\x65\x57\xbc\xb8\x4d\xb4\xe9\xa3\x1f\xa2\x7f\x78\x76\x06\xf7\xe6\x1b\x72\xbc\x7d\xb3\x02\xfe\x7d\xf8\xf8\xd0\x81\xab\x79\x85\x3b\x40\xbd\xbc\x2e\x5d\x64\x80\xf0\x27\x83\x2d\x50\xfe\x08\x72\x57\xe4\xbe\xdf\x10\xbd\xfc\x53\x68\x6d\xb4\x3f\x81\x5c\x1b\x5d\x6b\xed\x11\xe6\xd1\x15\xf3\x11\xef\xe5\x2f\xb6\xc3\x9b\x3b\x3b\xf4\xe0\xf8\x64\x87\x12\x0e\x1e\x2d\x76\x30\xc1\x0e\xc5\x54\xa2\x29\xc6\xbe\x5c\xcc\x80\x33\x5f\x94\x2b\x77\xbf\xb1\xdc\xf4\x6b\x28\xd2\x1b\x23\x4c\x37\x57\x15\x95\x61\xcd\x10\x17\x9c\xb4\x37\x39\xfe\x84\x1d\xae\x72\xbc\x5c\x0c\xf1\x7d\x1b\x6a\xf2\xfc\x08\xa8\x29\x72\xb5\xbc\x06\x1c\x48\x40\xfc\x24\xd3\xcc\x02\xe6\xc7\x69\xb1\xc4\x94\x5d\x65\x70\xec\x4b\x19\x94\x92\xd7\x5c\x36\xbc\x89\x82\x0c\xff\xe5\x97\xca\x00\xde\xbd\x7c\xf8\xfe\x73\x67\xd8\xbc\xd0\xfe\x18\xa8\xf1\x02\x43\xde\xd1\xe4\x85\x0a\xbd\x91\x56\xc4\xb7\xc5\x55\x04\x23\xbe\x14\x01\x44\x72\xed\x8f\xd3\x13\xf6\xcc\xf3\xb1\xf1\xb3\x32\x7c\xf8\xf8\x90\x10\x50\xad\x8c\x20\xd1\xa9\x2c\x97\x31\x1d\xf9\xc8\x06\x74\x7c\xde\x17\xf0\x14\x67\x9e\x02\x3e\xa2\xdc\xb3\x9f\x14\x62\xad\xfd\x8e\xe3\xfc\x7a\xde\xf5\x0b\x7c\xe2\xe1\xf9\xd8\x70\x71\xb4\x72\x89\x09\x3f\xe4\x64\xf2\x87\x58\xcc\xc6\x06\xa8\xa5\x14\xa4\x10\xfb\x29\x56\x3e\x02\x15\x28\x49\x36\x4f\xe8\x2a\x09\xb7\x5f\x4a\xe2\x98\x8c\x92\x6b\x7f\x14\xd1\xdf\x5c\xf3\x9b\xe3\x35\xab\xfa\xc5\x4a\xc0\x1d\x40\xa0\xae\xb3\xdf\xbb\xf7\x2f\x1f\x5e\x3d\x04\x02\x05\x7e\x10\x5a\x24\x87\x59\x4f\x01\x69\x7b\x09\xae\xcc\x69\x0c\xa8\x52\x2d\x80\xbe\x8b\x8f\xfe\xe0\x35\x05\x06\x4c\xf1\xe0\xb3\xa1\xaa\xf4\x30\x33\xa5\x62\x37\xc4\xfd\xf0\x68\x42\x62\xe3\x26\xd6\x21\xdf\xaa\x88\xb2\xa7\xd6\x1f\x3e\x37\xff\x2c\x89\x01\x5c\x6f\xcb\x42\x76\x35\x5e\xa2\x22\xe3\x36\x99\x77\x21\xaf\x9a\xda\x79\xb4\x80\x00\xb6\x52\x25\x00\xdd\x04\xd2\xb5\x45\x06\x45\x41\x05\x86\x45\x86\x93\x19\x66\x26\x65\xec\x92\xba\x33\xa7\xd3\x39\x0d\xc9\xaf\x49\x92\x87\xfc\xa9\xcf\xfa\xbf\x7a\xea\x8a\xcf\x09\x14\x37\xa1\x92\xab\xfe\x1b\x08\xb0\x5d\xa2\x13\x50\x3a\x8f\x17\xb7\xac\x0f\x4a\xeb\xc4\xd9\x59\xc7\xd2\xa3\x65\x61\xde\xa0\xa1\x69\xcc\x69\x6d\xf3\xe4\x23\x6f\x08\xa8\xc0\xb8\x88\x02\x68\xf7\xa8\xd6\xdc\xdb\x90\x7b\xb8\x19\x7f\xb5\x0d\xe2\x93\x77\x07\x65\x4d\xd2\xfa\x2e\x60\x7a\x43\xeb\x4b\x07\x20\x80\x33\x8f\xed\xcc\x01\x5b\xa7\x8d\x63\x48\x30\xff\x79\x1b\x80\x4d\x14\x30\x5c\x65\x38\xc3\x7e\xbd\x7f\xf5\x15\x00\xe4\xfb\x77\x01\x29\x72\xdb\xc1\x0a\x44\xba\xae\xf5\x25\x4a\x7b\xd1\xa4\xdd\x11\x23\x38\x26\x52\xa1\xd3\xca\x87\xb9\x8c\x84\xee\x28\xaa\xd1\x34\xe9\x41\x15\x51\x94\x6c\x60\xe2\xf6\x68\x87\xaf\xeb\x58\x58\xc5\x6e\x27\x08\x1b\x98\x1c\xce\x93\xb9\xc1\x91\xed\xf0\x4c\x81\x35\x9e\x99\xc5\x0d\xc3\xde\x24\x11\xab\x4c\xbb\x55\xa8\xcf\xe8\x8e\x6b\x55\xca\xfe\xed\x0f\x5b\x88\x18\x07\xc4\x81\xe8\x12\x39\x5f\x67\xde\x51\x90\xe5\xbe\x01\xb8\x2e\x41\x96\x08\x55\xe4\x4d\x90\x6d\x1e\xe2\xcc\xb7\x47\xed\x06\xa3\x0b\x5d\x86\x7d\xfe\x14\xe6\xe5\xfc\x2a\xdb\x8a\x62\xf3\x4c\x42\xf0\x05\xb3\xe0\xa6\x5c\x24\x7e\x3a\xcf\x89\x6b\x37\xb7\xce\x05\xf8\x5a\x34\xb7\xbb\x7c\xce\x41\xbd\x78\x84\xc7\x67\xc3\x79\x22\x7c\x5b\xfb\x40\xe8\xbd\x8b\x61\x94\x6d\xdb\xcd\xf0\xb4\x9e\x2f\xad\x3d\x6b\x2b\xb9\x7b\x1f\x8b\x24\x3b\x0f\xe6\x86\x5f\xde\x25\x7a\x89\xfd\xae\x9c\x0f\x9b\x61\x3e\x82\xc0\x46\xe5\xdb\xb9\x05\x94\xf9\x6e\xe5\x97\x00\xd3\xc5\x6d\xc7\xc4\xfe\x74\x1b\xfb\xfb\x36\x70\x82\xcf\x8d\x8a\xf1\xdc\x2c\xcf\x31\x99\xce\x07\x75\xa3\x1b\x49\xac\x47\x20\x25\x97\x88\x4c\x3e\x05\x05\xf5\x23\x0d\x98\x3f\x78\xcf\x77\xd9\xaf\xb0\x57\x94\x14\xe7\xde\xdd\x7a\x38\xee\xdc\xec\x9c\x8b\x59\x80\xaf\x76\xbb\x6c\x2e\x41\x15\xec\x85\xce\x56\x88\x84\xfb\xb6\xf1\x69\x13\xea\x78\xa7\x0b\xda\xa7\x4f\xf6\xfa\x05\x6d\x01\xb9\x4d\x3f\x8d\x36\x39\x9d\xf3\xe5\xd9\x46\xf6\x31\xb3\x76\x33\x3c\x66\xeb\x33\x37\x80\x09\x5f\x09\xdf\xcc\x11\x63\x49\xe4\x07\xeb\xa9\x7d\xc2\x15\x10\xbf\x46\xaf\xa4\x7a\xd6\x23\x49\xb9\x04\xa0\xf6\x09\xda\x3e\x9b\x33\xd0\x38\x0f\x2b\x8f\xcf\x96\xf3\x84\xfb\xae\xf2\x79\x7d\xcd\x6f\xf8\x95\x36\x4c\x78\x52\x9f\x89\xbb\x61\xb1\x27\xcc\x9d\x27\xe7\x16\x3f\x5c\x9e\x9f\x69\x6b\x1b\x99\x80\x35\xdd\x5e\xcf\xf3\x56\x76\x9c\xeb\xb4\x12\x32\x6c\x5e\xbc\x79\x11\x50\x87\xbf\x79\x36\x03\xe8\x76\x51\x2d\x9b\x97\x3d\x9e\xa2\x1e\xfb\xd1\xf9\xc9\x13\x01\x0c\x88\x66\x99\xe4\xb3\xb3\xa0\xf3\x30\xe6\xa0\x7d\xec\x6f\xef\x36\xed\xcc\xa4\x69\x88\xd3\xe0\xe0\x11\x68\x27\x6b\x44\x65\x24\x30\x5a\xeb\x70\x7a\x14\x5d\x73\x25\xab\x0d\xfa\x29\xb9\x7e\xbc\xca\xf5\xf1\xa7\xe4\x42\xb3\x4b\xb2\xd9\x80\x1c\x54\xc4\x17\xcb\xde\x66\xf4\x88\x03\x3b\xcd\x4d\x3c\xce\xf5\xca\x6d\x8f\x40\x7b\x8e\x6e\xef\x36\x68\xd6\x4c\x5b\xe2\xe4\xe4\x25\x50\x27\xad\xb9\xd5\xec\xca\xd3\x25\x44\xd8\xbb\xfe\x26\x91\x17\x18\xd6\xe4\xcf\xfc\x4b\x6f\xae\x15\x04\xd1\xed\xd4\xf5\x89\x11\xfd\x1e\xd9\xea\x0e\x3b\xf2\x3e\x8d\x70\x4f\xe8\x63\x8f\x41\xa4\x85\xf1\x07\x21\x26\x61\xc4\x6c\x97\x57\x01\x22\x21\xbc\x10\xa6\x63\x75\x8c\xad\x16\xb2\xda\xca\x33\x35\x26\xa9\x6e\xc8\xb2\xbe\xbc\x71\x4a\x07\x22\xc0\x27\x3a\x77\x1f\xd1\xc1\x69\x79\xb2\xbd\xe8\xba\x45\xe6\xf2\x5a\xbf\xf7\x0b\x65\xbe\x7f\x0f\xbe\x25\x33\xe2\x8f\x9a\x80\xd4\x28\x33\x9f\x96\x1d\xbf\x32\x6a\x59\xb9\x41\xba\x3e\x1e\x2b\xd3\x89\x26\x96\x46\x2b\xe5\x7e\xa9\xd4\xf3\xc4\x7a\x63\x45\xa3\x1b\xdd\x34\xc1\xd6\x31\x09\xe7\x99\xd3\xcf\xca\x7d\x4d\x64\xbf\x9d\xea\xbc\xbb\x9e\xf0\x6c\xaf\xcf\x33\xb9\x33\xf1\xa9\x93\x00\x99\xda\xcc\xba\xaa\x00\xac\x4d\x75\x3e\x85\x37\x35\x40\x55\xe5\x23\x55\x0d\xfc\x18\xdb\xa1\x93\xcd\x69\xc3\xe6\xcc\x98\x78\x58\xb6\x0d\x5e\x07\xe2\xa9\xb9\x0a\x2f\x9e\x72\x27\x0c\xb1\x42\x69\xcb\x16\x39\xdb\x0b\x0c\xf7\x00\x7f\x91\x7d\x3f\x57\x62\xed\x0b\xf9\x58\x50\x50\x1a\x63\xe6\xc6\x5a\x50\x2c\x6f\x8a\xf5\x0d\xc8\x8d\xf1\xd0\xb4\xad\x1e\x62\x5d\x57\xca\x76\xbf\xd8\x2b\x0e\x21\x53\xa4\x6a\x4c\xa7\xbb\x36\xd8\x17\x5f\x60\xb8\x47\xf8\xcb\xfc\x62\xfb\xd9\xbe\xea\x53\xc3\x01\x36\x8d\x5e\xed\xdb\xe8\xfa\xdc\x87\x37\x0d\x40\x75\xed\x0b\xd5\xf8\x49\x8c\x71\xd7\xb4\xca\x9d\x7e\xb9\x3b\xb3\xc1\x5a\x79\x7c\x92\x3b\x89\x7e\xdd\x18\xfc\x25\xfe\xcc\x28\xc8\x8c\x36\x73\xbf\xb8\xb0\x36\x7a\x26\xe1\x8d\x06\x99\xd6\x9e\x0a\x37\xb0\x63\x2c\x6a\x27\x4c\xfb\x95\xd8\xc5\x67\x51\x7f\x62\x14\x1e\xdb\x95\x2b\xba\xb9\x9e\x7b\x6d\x43\xb5\xf6\xeb\xc0\xaa\x18\x6a\xb5\x57\xb0\xb2\x27\x89\xfe\xdb\x35\x3f\x7a\x3d\xba\x5c\x73\x2c\xbe\x28\xa8\x7d\xf8\xf1\xfd\x9b\x57\x2f\xde\xbd\x7f\xb3\x3b\x72\x3f\xcc\x03\x06\x13\x38\x98\x90\x74\x3f\x95\xb9\xce\xca\x06\xe5\x32\x87\x08\x28\xdf\x24\x94\x52\xaf\xb1\x44\x30\x27\xb8\x08\xb2\xa9\x78\xec\xfb\x7e\xa7\x05\x45\xa6\xd4\xa5\x13\x48\x61\xa6\x0a\xc9\x0f\x84\x62\x4a\xe6\x53\xab\x7d\xa3\x7d\xed\x47\x41\x53\x9b\xe2\xc9\xb4\xba\x6d\x7d\xb3\x72\xcd\xf3\x2b\x9e\xf2\xf6\x99\x06\xf9\xf6\xfb\xd7\x57\x92\xb7\x70\xae\xff\xee\x4a\x20\xf0\xa5\xe4\xb7\xfd\xca\x12\xa7\x2e\x93\xf5\xce\x91\xb9\x3e\xd7\x65\xdc\x7a\x4a\x20\xc8\x8a\x52\xd1\xb2\x97\xd8\x42\xe8\xea\x7a\x16\x44\x6b\x91\x6b\x53\x2e\x51\x6b\xb8\x8e\xa0\x20\xca\xcb\xd8\x05\xc4\xfe\x71\xd3\x1b\x9c\x1a\x47\x28\x84\x84\x72\xa1\x08\xc5\x97\x48\xf9\xc9\x48\x56\x54\x25\x91\x5a\x29\xa5\xca\xa2\x57\xea\x12\xad\xfb\xaa\xfd\x13\x5e\xfb\xb7\xfa\x21\xff\xba\x1f\x5e\xfd\x54\x1f\xbc\xbf\x2d\x37\x8b\x16\x1d\xf6\x7c\xae\x4b\x30\x80\xae\xc2\xdc\x70\x5f\xe3\xc2\x14\xf8\x44\x4a\x55\x92\xe4\xb4\x4c\x8b\x44\x11\x9c\x53\x56\x86\x6b\x9e\x70\xfb\x14\x17\x2b\x27\xdc\x4e\x6a\x96\x19\x0a\x2b\x41\x05\xe1\x4b\x47\x64\x2b\x14\x80\x6f\xac\x6f\x97\x5e\xc8\x6d\x8e\x27\x5b\xd9\xba\xae\x7d\x53\xad\x35\xf2\x75\xd8\xa3\x9a\x5f\xaa\xc7\xfe\x97\xe9\x41\x3c\x99\x0d\x8c\x0f\x60\x74\x98\x5b\xe1\x35\x29\x6c\x81\x27\x06\x75\xc9\x0e\x9b\x5c\x4a\x8f\x88\xe4\x2c\x97\x22\x0f\x8c\x33\x4b\x40\x8f\x63\xb6\x82\x96\xec\x8c\xe6\xa9\xa1\xc8\xc9\x45\x11\x5d\x2a\x91\x51\x8e\x19\x3d\xf9\xd6\xfa\xc6\x4f\x92\xa6\x2e\x25\x83\xad\x57\x45\xea\x7a\xd9\x5f\x2d\x7b\x3c\xb2\x43\x61\x34\xff\xcd\x97\xdc\xd1\xeb\x4e\xe7\xe5\x4a\x80\xf6\xf0\x6a\x4f\x18\x13\x75\x5e\x0b\xe4\xf3\xdc\x9a\xd6\x3c\x5d\x9a\xa2\x3f\x4e\x5c\xa4\x36\x15\xc0\x7a\xe3\x1b\x0a\xaa\x38\x8a\x27\x5f\x00\x74\x1e\x01\x6c\x23\x90\xb0\x0b\x09\xf8\xe5\xbf\x0b\x7b\x98\x17\xe9\x77\xaf\xf7\x71\xf2\x22\x80\xf3\xec\x5f\xa4\xc9\xdb\xdf\x83\xdf\x81\x1f\x76\x23\x95\x5c\xea\xfe\x80\x90\x55\xbd\x14\x18\xb8\x9d\x32\x85\x3f\xf9\x74\x1e\x4e\x02\xb8\xc4\x81\x34\x3d\xfc\x71\xdc\x4e\xa9\xc7\xb3\xf3\x07\xbe\x04\x19\xa0\x88\x51\x1a\x81\xc4\x5c\x44\x58\x0b\xfe\x6b\x14\x81\xcf\x35\x11\x2f\xd6\x36\x7e\xfb\xfd\xbb\x7f\xfe\x37\xf0\xf1\x75\xbc\xdf\x3d\xe4\x6f\xff\x09\xbc\x7f\xb1\x7f\xfb\xf1\xc5\xbb\x17\xcb\xb3\x28\x96\xe3\x14\xe6\x79\xde\x5a\x57\x1e\x2b\x99\xa7\x36\x87\x78\xb1\x5a\x8a\x10\x41\xc6\x3a\xbb\xcd\x67\xea\x4f\xa9\x3d\xf4\x40\xd2\x39\x8a\x3b\x7c\xee\xf2\x2c\x87\x3d\xf2\x43\x81\x0e\x07\x4c\x92\x2c\xd7\x30\xce\x7d\x8e\xe2\xc2\x67\x2b\x87\x58\x1d\xfc\x3d\x5f\x4f\x08\x9f\x48\x16\x56\x84\xcd\x21\xd1\x5e\x2d\x5b\x64\xe7\x19\x70\xde\xee\x72\x33\x37\xe6\x6c\x12\x61\x62\x1c\xc5\x89\xbe\x90\xbd\xda\x95\x51\xb2\xee\x13\x5e\x3d\xbc\x5c\x42\xcf\x87\xe4\x21\x7d\x2a\xd6\x7a\xf1\xb0\xc9\xe2\x71\x4e\xf9\x94\x4c\xb3\x45\x31\xe5\x5a\xdb\xb2\xd1\xb0\x9c\xf5\xae\x34\x3e\x33\xc6\xd7\x73\x77\x4a\x4d\x6a\x00\x0f\xe7\x09\x6a\x6f\xb6\x3a\xfa\xab\x50\x4b\xfa\x39\x9b\x3b\xba\x22\xef\x84\x1d\xed\x13\xdc\xef\xfb\x2b\x85\xd6\x0a\x74\xba\x89\x5c\x96\x01\x06\x5a\xe6\xa9\x17\xbe\xf2\x05\x8b\x33\x9e\x74\x9e\xc7\xdd\x0c\x1b\x86\x6b\x82\x81\xfe\xa3\x8c\xc7\x19\xc6\x9d\xe7\x39\x83\x1a\xd1\xad\x26\x69\x36\x1a\xb7\xec\xc3\xa7\xd6\x74\x47\xd3\x1a\xaf\x6d\x05\x8d\xb4\x16\x48\xd3\x7a\x2d\x14\xd2\x7c\xb5\xd7\x70\x51\x7b\xb7\x1d\xa3\x2c\x68\x0c\x76\xaf\x7e\xfb\xfd\xff\x00\xff\xfc\xe1\xe5\xeb\x78\xf7\x8f\x20\xff\xc3\xfb\x7f\x79\x09\x1e\x36\x51\x3c\xcd\x13\x67\x27\xc5\x51\xea\x32\xdd\x54\x7e\x70\x06\xb4\x73\xb7\x1d\xe5\x39\x6b\x29\x2a\x18\x38\x94\xbe\x33\x42\x4b\x90\x27\x38\xda\xc4\xe6\xa2\xc2\xba\xf5\x77\xd7\xba\x93\xe7\xf8\x78\x9f\x0f\x8a\x6f\x27\xe9\x51\x12\x30\xb4\xee\x0b\x1f\x4f\x2e\x4d\x41\x0e\x0a\x81\x71\x40\x4e\xc8\xe2\xec\x31\x8f\xcb\x30\x04\x1a\x84\x09\x30\x72\x59\x5e\x4d\x9c\x6a\x2a\xa4\x9c\x0b\x81\x15\x16\x3b\x59\xe6\x99\x6f\x9c\x29\xa0\x1c\x8d\xcf\xac\x05\x83\x19\x19\x2c\x0d\x28\xfc\xc9\x9e\xba\xf9\x80\x4f\x92\x6b\x67\x1c\x09\x05\x26\x9b\x38\xbf\x88\x30\x47\xfe\xed\x53\x6d\xc0\xeb\x3f\x2d\x6a\x72\x97\xab\xb8\xb1\x55\x09\x0a\xc0\x18\x25\x5e\xad\x4c\x21\x9f\xfa\x18\x86\xdd\xaa\x25\x84\x80\x86\xc7\x75\x57\xd9\x8a\x22\x8b\x68\x82\x2b\x4c\x0d\xdb\x49\x88\xfc\xb1\x72\x25\xc4\x93\x99\x4f\xc6\xc4\xb9\x99\xf0\x22\x67\x7e\x89\x6c\xdd\xcc\x69\xd5\xe2\xce\x61\x78\xb2\xa4\xbe\xde\xb9\xc9\xbd\xdd\x98\xe8\x3f\xac\x0c\x81\xcf\x21\x9c\x9e\x1c\x69\x7f\x2d\x2c\x59\x16\xa7\x55\xe8\x0d\x94\x08\x68\xe0\x16\x37\x22\x7e\x99\x9c\xe3\x82\x24\xd6\xeb\xc5\x8d\x06\x0c\x9d\x00\xe6\x8f\x29\x70\x25\x94\x14\x0e\xc1\x97\xd4\xc6\xb0\xb2\x22\x8e\xf7\x27\x61\x4c\x65\x8c\xf1\x03\x17\x65\x65\x0c\x41\x84\x4b\x90\x19\xb3\xae\x2f\xea\x8a\x83\xb8\xbd\xd6\x3a\x2e\xf3\xf2\xbf\x3d\xbb\x9d\x8c\x5f\xa4\xdf\xbd\xfb\xe7\xc5\xa1\xde\xfc\xfd\x1f\x92\x1b\xe0\xf3\x87\xdf\x81\x87\x0f\x2f\xdf\xbf\x79\xf5\xe6\xfd\x9b\x57\xe0\x0f\xef\xff\xe5\xe3\xfa\x76\x35\xeb\xe6\xc8\xa1\x86\x0c\x4c\x0e\x09\x73\x48\xd3\xe2\x60\x33\x8e\x31\x4b\x47\x3b\xe5\x4a\x9b\x58\xaa\x7c\xb4\x63\x2c\x0f\x87\xd1\x8e\x39\x83\xa6\xa4\x3b\xa5\x1d\xb1\x1a\x15\xc7\xca\x2b\x3f\xfa\xd3\x32\x47\x17\x7e\x72\x1d\x40\x81\x9a\x66\x18\xf9\x04\x60\x3c\x74\x73\xd7\xf7\x7d\xef\x4d\x51\x42\xdc\xf7\xfd\x46\x84\xff\xe3\x7a\xfe\x84\x2f\x38\xc9\x03\x4f\xc8\x1a\x69\xad\xb9\xa0\xf7\xb3\xf4\xf5\xb8\xe5\xdd\x8b\x77\x1f\xee\x79\x4b\x81\x71\x69\x0e\xf2\x2b\xb9\x3d\xee\xfc\x89\x86\xe3\x30\x5c\x17\x18\x90\x70\x38\x1c\x9e\x9d\xca\x31\xfa\x54\x32\x96\xda\x94\x00\xec\xbb\x5a\xb7\xa3\x49\x14\xf5\xa2\xf2\x70\xd9\xb9\x86\x1a\xc0\x65\xaf\x2a\x02\xff\xc4\xef\xc3\x39\x58\xb1\x66\x01\x3e\x67\xec\x7d\xf3\xe2\x59\x9d\xd6\xb2\x70\x7c\x7c\xf7\xe2\xcd\xb6\xb4\xc0\x31\x16\xe0\xe4\xca\x99\x5a\xe0\x40\xab\x38\x57\x6a\x96\x1c\x1b\xc8\xa6\x65\x77\x6a\xaa\x6a\xa7\xe6\xfa\xf1\xb8\x42\xc8\x25\xfa\xd1\x6e\x46\x70\x22\x27\x25\xac\xb5\x35\x6a\xcd\x5c\xce\x47\x05\xca\x90\x6f\x91\x9c\x22\x72\xad\x85\xfb\xb5\xf2\xbc\x7f\xb3\xa5\x16\xf0\x27\x79\x1a\x0b\x24\x30\x8a\x52\xc1\xe6\x9a\x42\x0d\xf1\x08\x6c\x48\x57\xd8\x49\x1f\x9d\x0d\x65\x8b\x3c\x71\x77\xe6\x9b\x1c\x38\xdc\x08\xae\x84\xb2\xd0\xc9\x79\xd9\xb5\x4c\xd1\x36\xe0\x84\xb2\x50\x5b\xfd\x67\xd8\x26\x75\xa0\xe2\x02\xb1\x5c\x21\x34\x63\x07\x2a\xd0\x69\x21\xa5\x9e\x65\x40\x5f\x9a\xc0\xc9\xe7\xb6\xae\x77\x62\xee\x1e\x47\xc6\x0f\xee\x80\x13\xfa\x58\x6f\x06\xd0\x93\x5e\x71\x6b\x4d\x83\x1a\x3b\xc3\xb9\xd3\xa0\x58\xeb\x04\xd5\x05\xed\xe9\xaf\xec\x2b\x70\x95\x67\xe3\x5c\x9c\x09\x89\x79\xae\x11\x39\x73\x17\xe7\x71\x6e\x94\xd6\xee\xdc\x4b\x6a\x89\x00\x45\xc8\x6e\x98\xa6\xd0\x59\xfd\xea\x36\x89\x78\x74\xd7\xce\x92\xc6\x9a\x1a\x37\x66\x46\x37\x81\x36\x49\x79\xe5\x1e\xfa\x9c\x2b\x70\xbb\x39\xfd\x49\x62\xe2\x87\x17\xe0\xc5\x43\x38\x64\xdd\x44\x10\x13\x10\x09\x0b\x31\x40\x90\x68\x8e\x4e\xbe\x06\x65\x00\x78\x3e\x02\x3e\x1f\x1c\x70\x57\x9a\xcd\xe8\x12\x6d\x72\x8c\x0d\xc8\x00\xfa\x65\x04\xc5\x9b\x44\x86\xbe\x83\xd1\x6f\x83\x9d\xfe\x8f\x2f\x23\xa0\x2b\x8a\xc9\xcb\x6b\xc1\xf6\xab\xb0\xc3\x79\xff\xe6\xe6\x49\x7b\x46\x09\xe1\x85\xc4\x70\xb6\xd4\xd2\x53\xa5\xab\xaa\xf5\x51\x53\xa5\xa1\xb4\xb6\x69\x76\xf0\x8f\x27\xc6\x53\x93\xf2\x2d\x3b\x3b\x9f\xfa\x09\x82\x03\x18\x93\xc6\x8b\xba\x56\xb5\x52\xb5\xc7\xbe\x90\x43\x90\x25\xbf\xce\x5d\xf9\x4d\x96\xed\x0d\x39\x3d\x9c\xb0\x06\x5b\x3d\x3c\xb3\xd5\xd5\x50\xe1\xd9\x48\x57\x42\xd2\x33\xb7\x18\xaa\xc4\x96\x42\x50\x7a\x0b\x60\x48\xac\xe8\x02\x69\x70\x7e\xc3\xb7\x2b\xf5\x36\x82\xd0\x4c\x20\x87\x5a\xa5\x56\x42\x5b\x5b\x3f\x2d\x56\xf2\x93\xd9\x74\x01\x48\x4e\x04\x00\x47\x16\x00\xe5\x40\x24\x2f\x24\x3e\x6d\x44\xf4\xb7\x51\x74\x33\xc6\x8b\xc0\x00\x70\x67\xad\xc0\x42\xf0\xc6\x9c\x6c\xdf\xd7\x19\xe3\x88\x73\x9a\x33\x5e\xb4\x50\xc9\x53\xd2\x34\x8d\xf1\x23\x52\x65\xe1\x03\x22\x49\x41\xc1\x01\xd9\x22\x07\x38\xac\x79\xc7\xc0\x47\xa7\xef\xb8\xab\x5f\xef\x9f\x34\x7e\xce\x88\x15\xd0\x1c\xb7\x77\x94\xc0\x9b\x83\x45\xcb\xde\xc5\xe0\x65\x3f\x68\x9f\x9c\x43\x9d\x9d\x2d\x4b\xda\x83\xf6\x69\x63\xd8\x6c\x74\xe9\x08\x2e\x19\x37\x95\xae\x74\x65\x70\x12\x21\x68\xc0\x61\xa8\xaa\xb5\x04\xbd\x8a\x9e\xf6\x59\x6a\x63\xee\xe4\x59\x7d\xf6\xa7\x84\xba\xa7\x28\x06\x94\x60\x0a\x22\xe9\x10\xe8\xf2\xc2\xa1\x3c\x76\x33\xbf\x9d\x42\xc7\xcd\x27\xe9\xe2\xe3\x7c\x8c\xcb\xeb\x43\x19\x76\x20\x05\x25\xd4\x18\x42\xca\xac\xb3\xce\x5a\x87\x13\xe2\x9c\xef\x02\x57\x71\x04\x22\x9a\x0c\x21\x7e\x7e\xf5\x25\x7f\x0e\x78\x58\xcf\xe2\xaa\xd8\xc2\xd2\x64\x79\x22\x3c\x3c\x02\x48\xbd\xbe\x44\xde\x5d\x22\x9f\x63\xc0\x4e\x3e\xdd\x45\x10\x97\x45\x61\x2c\x71\x0a\x1c\x26\xa3\xb9\x8d\xa2\x1d\x68\x2e\x78\x73\xda\xc9\xe8\x37\xd1\xf7\xd1\x9b\xb0\x56\xfe\xcf\x25\xf2\xba\x8d\xcb\xbf\x03\x77\xd8\x15\xf7\x05\x89\x1f\x9e\xf0\xe2\x7f\x92\x24\xa9\x04\x59\x56\x6a\x98\x0d\xb3\xb0\x22\xcd\x60\x81\xf3\xa2\x44\x5c\x01\xc1\xd3\x8c\x21\x52\xe2\xa2\x64\xdc\x53\x50\x04\x2a\x0d\x2c\x60\x99\x21\x54\xf8\x5e\x68\x62\xa4\x8d\x33\x52\xa8\x02\x6d\x1d\xa3\x39\x17\x2a\x2f\x48\xc0\xb8\x28\x35\x23\x2d\xc8\x0b\x4a\xb9\x16\x92\x0b\x82\x1b\x6f\x29\xd5\xfe\xc0\x49\x6a\x52\x04\x4e\xa8\xf0\xc7\x96\x1e\x87\xa6\x2f\x4e\x75\x14\xc5\x80\x5e\xf0\xee\x08\xf4\xf5\x86\xe3\xee\xfc\x76\x77\xb4\x8f\x8d\xb5\x1b\xfc\xd8\x00\x3d\xb7\x94\xc6\xc8\x57\xdd\x7a\xef\x03\xfa\xbd\xd8\xe9\x10\x2f\x16\xb7\x48\xf9\x67\x1c\x32\xda\xbe\x7f\xd8\x3f\x11\x55\xc7\xa5\x29\x4a\xd0\x16\xa5\xa6\x65\x4c\x66\x19\xd8\x12\x97\xa7\xfb\x64\x2c\x65\x04\xa0\x98\xfb\x43\x1a\x08\x14\x0f\xf3\xb4\xd3\x05\xa3\x08\x11\x26\xb4\xd4\x52\x2b\x03\x63\xc6\xa8\x06\xa5\x91\x19\xbb\x44\x52\xfa\x69\xdd\x3f\x83\xb8\xde\xd8\xb0\xd6\xfc\x87\xeb\x9c\x7e\x7d\xe2\xda\x01\x61\x81\xb0\x8f\x64\x57\x5c\xa2\xe0\xed\x91\x17\x6b\xce\x44\x71\x41\x7b\xbb\xb9\x9f\x7f\x7f\x5e\x97\x0f\xf7\x83\x2b\x51\x36\x2b\x00\xcd\x0a\x0b\x73\x50\xfb\xe2\x0a\x39\x29\xc0\xe9\x71\x34\x08\x91\x31\x3e\x04\x42\xd7\xf0\x6c\x54\x89\x10\x2a\x4b\x4c\xc3\xf0\xaa\x0d\x4b\x20\x82\x66\xbc\x8d\xae\x6e\xe9\x8f\xc8\x82\x3e\x26\x3b\x16\xf6\xce\xd7\xc8\x6c\x65\xd3\x06\xd0\x2a\xa1\xcc\xa8\x58\x6d\x9b\x1d\x63\x5a\x5b\x3e\x4f\xf4\xd4\x8b\x6e\xd1\x23\x8d\x0f\x7b\x1e\xfa\xe4\x97\xe9\xf1\xdd\xeb\xeb\xc6\x3a\xe4\x32\x52\x9b\xe5\x80\x64\xf9\xa2\x47\xe5\x73\xb0\x6e\xba\x18\xe8\xcf\x99\x2d\xa0\x18\x25\x50\x5e\xad\xcf\x4e\x3f\xa9\x21\xb5\x34\xd2\x94\x31\x83\x25\x05\x87\x4c\xca\xb5\x3b\xa4\x0c\xf9\xf1\x78\xaf\xe2\xc3\xda\x17\x9f\xaf\x84\x93\xc6\xae\xf9\x9b\x5d\x02\xe3\x43\xb5\xde\xea\x46\xd1\x06\xf4\x17\x12\xc6\xda\x7a\x56\x80\x9e\x63\x81\xbc\x5a\xb1\x40\xae\x55\x5e\xb7\x61\xf6\x6f\xe0\xdf\xc1\x9b\xf7\x0f\x1f\x9f\xc0\x41\xde\x3f\x03\x07\x89\x73\x66\x5a\xc3\x58\x3b\x4d\x20\xf3\x43\x0a\x88\xef\x9c\x62\xda\x8a\x8a\x62\x51\xa4\x47\x70\x48\xc7\x71\x9a\x0c\x03\x75\xcb\x39\x9f\xf8\x76\x0c\xb9\x10\x03\xf3\x82\x29\xa6\x84\x12\x56\xb6\x42\x96\x12\xe5\x8a\x29\x06\x0c\x1b\x84\x10\xcb\xbe\x31\xec\x45\x36\x55\xa8\x01\xfa\xc2\x77\xde\x5d\xa7\x87\x37\x2f\x3e\x3f\x37\x9b\x83\x17\x6f\x5e\xbc\x7c\xf1\xe6\x77\x60\x09\x6e\xac\xc9\xcb\x66\x99\x04\x72\x59\x2d\xcd\x56\x3e\x37\x59\x4e\x2a\x90\x05\x6c\xd5\x9d\x2a\x9c\x55\xa2\x50\x56\xfb\x93\xf6\xc3\xf2\x23\x36\x39\x84\x1a\x08\x1f\x8a\xa7\x3c\x5b\xf4\x5a\x7e\x47\x20\x3e\x5c\xa6\x4d\xb9\x5d\xe2\xac\x70\x0b\xbb\x82\xcb\xbf\xfd\xf0\x72\xc5\x2b\xf9\xf8\x10\x53\x60\x52\xcc\x90\x26\xd4\x70\x4b\xb9\x56\x14\x17\x87\x4b\xb4\x15\xf3\xe4\x87\xa6\x45\xc3\xe0\x74\x05\x8a\x53\x07\x95\x19\xfa\x30\x36\x6e\x9c\x70\xdf\xf6\xa9\xe7\x61\x49\x18\xe7\xf7\xb1\x49\xd2\xd8\x12\x01\x59\x62\x47\x21\x50\x9e\x85\x3b\xe7\xe5\xa9\xcf\x99\xc5\x94\x80\x34\xce\xae\x5e\xe6\x3c\xdb\xc9\xd2\x18\xa3\x4a\x53\x2f\xab\xec\xfa\xa3\x37\x4a\x32\x0b\x98\xaf\xc0\xc1\x4f\x2b\x5a\xee\xf2\x3b\xf0\xec\x1d\x03\x9f\xae\xba\xde\x3d\x5f\x23\xff\x6f\x90\xdc\x6e\xc3\xbd\xf7\xfb\x87\x8d\xa9\x0e\x29\x18\xcf\x5d\x42\x3d\x5e\x73\x3d\xc7\x38\xf5\x0c\x94\xf1\x61\x65\xb9\x8d\xdb\x19\xed\x54\x51\x96\x1e\x19\x8f\x6e\x85\x4c\x9b\xd4\xb8\xb9\x0e\x3c\xd2\x91\xb8\xa0\xa4\xbf\x6f\xf3\x9b\x4d\xbe\xfb\x70\x6b\x13\x1c\xab\x12\xb0\xd9\xc4\xda\xd7\x8b\xea\x36\x58\xa0\x9b\x0a\x40\xae\x49\xf5\xa3\x4f\x77\x2a\xe7\xe1\xda\xb5\x5b\x5b\xec\x36\x07\xd4\x55\x73\x5d\xad\x7c\xd2\x32\xdc\xf3\xaa\xcf\x2b\xff\x4d\xcf\x2f\x03\xd6\xdb\xc9\xc9\xd3\x46\x67\x1b\xd5\x79\x0e\x1a\x6f\x41\xc3\x19\xa4\xb9\x80\xd0\x9f\xac\x1f\x2c\xa8\xbd\x06\x69\xe1\x6e\xd7\xa7\x3b\x05\x71\x39\x17\x95\xc7\xd7\x8d\x4e\x3a\xcb\x58\xfb\x28\x56\x55\xdc\x13\xaf\x9d\x87\x41\xff\x50\xc3\x2b\x03\xe6\xff\x8f\x4f\x95\x77\x3f\x2b\xcb\x13\xc3\xf0\x50\x65\x39\xe8\xbc\x06\x47\xc1\x11\xcd\x25\x42\xbe\xb3\xfe\x68\x41\xe7\x05\x28\xcc\x67\xb2\xe6\x12\xc1\x19\x55\x3e\x67\xec\x60\x0f\x04\x14\x21\x25\xe0\x14\xd7\x55\xdc\x2e\x43\x80\x99\x68\xcd\xfb\x48\xaa\x9d\xfc\x19\x9b\x7c\x46\x73\x5e\x7b\xe4\x89\x46\xbc\xaa\x8a\x1c\x48\xdf\x03\xc2\x78\x51\x16\xa4\x80\x8d\x6d\x2d\xa0\xfe\xd8\x95\x6c\x89\x4b\x97\x67\x27\x4b\x08\x67\xa2\x3d\x5d\x0d\x12\x8e\x6c\x16\x29\x74\x5c\x13\xef\x94\x17\x81\x7f\x3b\x71\x17\x14\xf0\x6b\xfe\x8c\xbe\xc9\x16\x83\x54\xbe\x02\x15\x67\x88\x84\xbe\x19\x8d\x1f\x2d\xa8\xbc\x01\x51\x11\x08\x99\x97\xe7\x67\x2d\x42\xbc\x5d\x4d\x12\x6c\x82\xf6\x7a\x5b\x04\x9c\xf6\xff\xfe\x84\xf5\x77\x4d\x04\x7a\xf5\xb0\x56\x44\x7e\xff\x99\x34\xe0\xfd\xc3\x87\x7f\x7d\x4a\xd7\xf8\xc3\xdb\x97\x61\x25\xf8\xed\xfe\xe1\xfd\x46\x94\x59\x5c\x7d\xe2\x31\xf3\x39\x38\xd9\x38\x6d\x1a\x8f\x2a\xd0\x50\x9f\xb7\x95\x87\x14\x28\xb3\xf4\x63\x3a\xbb\xc3\x51\x77\x71\x9f\xe5\xe3\xb2\x30\x1c\x80\xde\x16\x08\x19\x2f\xa4\xe2\x7c\xd2\x97\xa8\xa1\x95\x04\xe5\x25\xaa\xac\x72\x1a\x96\xa9\x97\x2b\x1f\x8b\x8a\x71\x51\xf8\xc3\xb2\x5a\xa4\xb0\x94\x51\x12\x91\x0b\xda\x14\x3b\xf5\x24\xfb\x2d\x73\xe3\xc3\xbf\x82\x37\x4f\x48\x89\xd7\x49\x67\x99\xe6\x43\x76\xcf\x9a\xe6\x11\x98\x33\x5e\xbd\x7b\x9f\x04\x42\x89\xd8\xd0\x1e\x37\xa8\x6a\x0f\x13\x57\x0c\xc8\xac\x30\x65\x0e\xf0\x5c\x4c\x5d\x67\x40\x8e\xf1\xa4\x18\x67\xc8\xda\x83\x03\x85\xef\x5b\xdd\x4e\x12\x93\xc2\x67\x5e\x12\x60\x40\x1f\x77\x04\x15\x84\xab\x79\xe8\x64\x55\xf9\x56\xfa\x4e\x2b\xd3\x24\xb4\xeb\x7c\x5b\x10\xdc\xae\xdc\x17\xe6\x9a\x83\xb5\xc6\x85\xff\xed\x29\x26\x7c\x58\x62\xc2\x35\x0a\x0c\x55\x7f\xdf\x8e\x09\xdf\xbc\x78\x48\x7a\xc0\xb3\xa2\x2a\x33\xa0\xce\xdc\xda\x92\x61\x51\x22\x54\x40\x61\xe3\xd2\x66\xb9\xa2\x02\x13\x48\x84\x9e\x35\xa8\x96\xe1\x4a\xac\xa7\x5b\x47\x31\x64\xd2\x94\x59\xcb\x94\x92\xc4\x61\xc4\x3b\xc0\x73\x4e\x85\xd1\x86\x69\xca\x6b\x5f\x54\x95\xf1\x29\x18\xd7\x5c\xb5\xbd\xdd\x2e\xbb\xa5\xf2\xe6\x0d\xd7\xe2\xb1\x15\x33\x66\x7f\x5f\x9d\x78\x05\x37\xf9\x2c\xe0\x26\x45\x79\xdc\xfa\xba\xec\x0c\x37\x16\x16\x54\x3a\x32\xd7\x28\x54\x8c\x91\x9c\x42\xd1\x0b\x6f\xe3\x29\x2f\xcf\x63\x82\xab\x04\x9d\xdb\xea\xdc\x6c\xf3\x45\x14\x2d\xad\x95\x02\x11\x61\xc1\x41\x0b\xa1\x35\x13\x05\x2d\x65\x3b\x1a\x82\xcf\x64\x11\xd0\x02\x7e\xc3\x7e\xc0\x7b\xb9\x11\xc1\x8e\x7f\x1f\xfd\xd3\xbd\x1d\xb7\xf7\xf8\x1e\x3f\xbe\xfe\xb6\x19\x41\x14\xb7\x39\xb4\xa8\x88\xdd\x1f\x27\x40\x6d\x5e\x5a\x41\x95\x16\x86\x83\x28\x69\x2d\xaa\x25\xd3\xa6\x74\xe2\xf8\xc8\x92\xc2\x26\xf9\xf9\x64\xcf\x7d\xd2\x10\x58\x12\x6e\xf2\x1c\x21\x8c\x15\xc3\x92\x48\x7d\xcc\x25\x25\x5a\x60\xca\xb8\xf4\x63\x60\xbd\x04\xf0\xba\x06\xa2\xbd\xda\x96\x77\x7d\xfd\x84\x06\x93\xbc\xfe\x93\xf1\xff\x62\xca\xa9\xcc\xc0\xf8\x48\xe2\x34\xcb\x3b\x93\x97\x9a\x71\x2a\x30\x93\x5d\x5c\xbb\xbc\x70\x52\x08\x89\x89\x70\x67\x17\x33\x17\x93\xb9\x76\xb3\xdb\x96\x84\x1a\x83\xa0\x3f\x15\x8c\x11\x2e\x05\x52\x8c\xf5\xe0\x90\x0b\x4a\xb9\x92\x58\x50\x55\x79\xcb\xb9\x5d\xa2\xcd\x68\x13\x85\x5c\xb4\x4d\x17\x1d\x6e\x76\x7c\xf9\xf0\xa5\x19\xf7\x6b\x7d\xda\xb7\x45\xec\xe2\x9e\x28\x82\xe2\xd3\x1f\x35\xb0\x2e\x2f\xb4\x60\x52\xe2\x52\xf0\x53\xe2\x2c\x72\x9a\x2b\x43\xb8\xea\x16\x2b\xba\x04\x9e\x3b\x77\xee\x37\x39\xa1\x98\x99\xbc\x40\x08\x53\xc5\x31\x81\x58\xda\x63\xae\x29\x53\x8b\x7a\x52\xf8\x93\x5e\x73\x1c\xaf\xfd\xcc\x37\x63\xf4\xd7\x3f\x53\x9d\xf5\x55\xf6\x0d\xcc\x93\xd4\x7d\x12\x2e\x49\xb3\x22\x89\x1e\xab\x4d\xe7\x1e\x7b\xe7\x92\xe6\x8c\x37\xc5\x63\xbf\x19\x11\xf1\xc7\xaa\x06\x10\x96\xde\x79\xc6\xe7\x89\xb0\x4d\xee\x07\x33\x93\x2a\xda\xc4\xd5\x85\xec\xc5\x36\xff\x35\x6d\x6e\x0f\x65\x11\xa7\xf6\xcc\x4c\x9c\x66\x45\x0c\x67\x12\x9f\xcc\x5c\x5b\x1b\x4e\x89\xc9\x5c\x6f\x73\x4c\x7d\xd3\xb6\x00\xa3\xd2\x6b\x4f\xe5\x3c\x61\xbc\x29\x7c\x5f\xcd\x45\x1d\x6d\x62\x79\x41\x7b\x1c\xf2\xaf\x6f\x6d\x3e\xcf\x91\x0f\x97\x5c\x6b\xbb\x4b\x78\xf0\xe2\xd5\xc3\xfb\x3d\x76\x67\xe1\xe2\xbc\x80\x96\x94\x5e\xba\x84\xcc\x24\x89\xdc\xec\x42\x1a\x20\xdb\xd6\xbe\x6e\x1a\x40\x08\xc4\x4c\xfc\x71\x64\xdb\xcc\x1f\xdc\x6c\x48\x42\xbb\x99\x8f\x63\xb4\x89\xa7\xb0\x06\xfd\xba\x36\x95\x3d\x57\x36\x8e\x8a\xd2\xe0\xd2\x1b\x9b\xe4\xb3\x8c\x8f\x76\xee\x42\xfd\x14\xdc\x56\xbe\x69\x1a\x80\x09\x46\x4c\xfe\x71\x62\xdb\xd4\xa7\xd5\x6c\x49\x42\x8e\x33\x9f\xa6\x68\x13\x55\xc0\xec\xe9\xce\x44\x7f\x15\xaa\x3c\xff\xe6\xb9\x6d\xdf\x82\x6b\x50\xf4\xf2\xda\xdc\x26\x2b\xb2\x24\x72\x9f\x94\x49\xa2\xd2\x1f\x36\xfd\x63\xbb\xa9\x3e\xb5\x36\xa9\xce\x74\x93\xee\x0c\x66\xde\x9d\x46\x20\xa4\x77\x5e\x31\x2f\x62\x29\x7d\xa6\x75\xb4\x49\xf0\x65\xe5\xd2\xfc\xab\xa7\x88\xeb\x2e\xc7\xff\xdb\xaa\x69\x7b\x1e\x2d\x38\x11\x83\x0a\x5f\xdb\x78\x98\xeb\xd8\x5a\x1f\x81\xc6\xe3\x38\xba\x69\x66\x83\x62\x74\x7b\x58\x14\x33\xf4\xa6\x58\x18\xef\xf5\x9f\x67\x4f\x66\x9f\xfa\xd0\x26\x68\xa6\xf1\x64\x9f\xfa\xf0\x66\x4f\x84\xbf\x69\xcf\x2d\x98\xc2\xd9\x96\x8e\x7e\x13\xfd\x36\xfa\x2f\xd7\x2a\xf8\x67\x33\xe1\x95\xa5\x63\x09\x38\x63\xf0\x19\x2e\x33\xbc\x7c\xf7\xfa\xfb\xd7\xdf\xbd\x7c\xd8\x5d\x81\x07\x69\x0c\x0b\xa8\x69\x11\xc3\x4f\x03\x38\x18\x48\x2d\x44\x74\x02\x83\xcb\xc1\x08\xfd\xd8\x0e\x64\x3a\x56\x13\x9b\x9c\x64\x25\xe4\x03\xe2\xaa\x2f\xbd\x29\x39\x83\xaa\x64\xdb\x9a\x92\x92\x0b\x9b\x17\x95\x7d\x6c\x12\x42\xb1\x05\x05\x80\xf9\xb2\x47\xb0\x15\x73\xbc\xab\xa5\xe6\xce\x1c\x31\x92\x20\x57\xbd\x05\x19\xa0\x22\x93\x86\x18\x15\x6d\x63\x7a\xcd\x0b\xbe\xd7\xe3\xd9\x6c\x79\xaf\x47\xf2\x0d\x3d\x3e\x3c\xe9\xb1\x45\xa8\x00\xe3\x23\x8a\xb3\xbc\x1c\x6c\x49\x2c\xc4\x6c\x00\xa3\x2d\x41\x8b\x06\x33\x90\xa1\xd2\xad\xec\x0c\x65\x45\xc1\x8f\x88\x8a\xaa\xf4\x5d\xa9\x70\xa9\x0a\xbc\x93\x4c\x1a\x43\x89\xaf\xf2\xb6\x7a\x3c\x25\x07\x46\x04\x28\x40\x9d\x57\xf3\xd1\x0f\x86\x3a\x56\x1b\xad\x94\xe5\x47\x58\x4a\x90\xdb\xa3\x39\x01\x26\x52\x2e\x48\x80\xa5\x8c\x7e\x13\x89\x0b\x49\xda\x3f\xc1\x7f\xb8\x22\x5d\xfc\x0c\x21\xdf\x7a\x2d\xb8\xff\x8a\x90\xcf\xc6\xa3\xef\x40\xea\x47\xa7\x32\x5f\x7b\x9a\x01\x1a\x90\x4b\x3b\xd5\x34\x32\x3b\xd0\x43\x0e\xf2\x5a\xd0\x2c\x27\xf9\x00\x73\x95\x17\xb0\xc8\x74\x9a\xd3\x22\xd5\x69\x56\xab\xa2\x54\x37\xfe\xc3\x2c\x53\xb8\x30\xf9\x1d\xff\xe1\x95\x90\x2f\x6b\x64\xa9\xcf\x54\x1a\x68\xe4\xe1\x6b\x02\xc4\x90\x5f\x77\xc3\xd0\xf8\x4d\xf0\xf3\x37\x6b\x75\xc1\xcd\xe7\x5e\x3f\x84\x13\xf1\x7f\x04\x6f\x03\x63\xc7\xc3\xc7\x25\x96\xbf\xcb\x04\x12\x80\x64\x85\x81\x19\xe0\xe7\x0a\xc7\xb5\x1f\x09\x97\x39\xa6\xe9\x25\x72\x40\x7a\x2d\x34\xe5\x52\xc4\x8c\x41\x5d\xd2\x6d\x4d\x48\xce\x98\xad\xe6\xd3\xdc\x49\x6a\x73\x14\xa7\x06\x44\xfe\x80\xfd\xd1\xf1\x76\x6c\x7a\xd2\xb7\xeb\xbd\x45\x15\xe2\x2a\x15\xfd\x26\xdc\xe8\xfc\x78\xab\x0e\xbb\xfa\xcf\xc3\xfd\x29\xfd\x4d\xaa\x7b\x2c\xfd\x6d\x05\x73\x20\xcf\x04\xe8\xbc\x1c\x92\xcc\x77\x44\x62\x54\x10\x5c\xe4\xbe\xb1\xe1\x4e\x32\xd2\xd4\x60\xed\xa1\xc6\x4a\xc9\x9d\xe2\x4a\x6b\x46\x7c\x3e\xb7\xf3\x28\xe9\xc1\x1e\x72\x04\x06\x03\xf2\x79\xea\x47\x32\xf6\x18\xfa\xe3\x91\xac\x35\xac\x09\x0a\xb5\x58\x8b\x6f\xff\x3e\xfa\xdb\x5b\x65\xca\x17\xf6\xfa\x1c\xf4\x7f\x69\xb0\xa4\x02\x2a\xcb\x2d\xcc\x80\x3b\x97\x38\x81\xbe\xa6\x8c\xe0\x9c\x10\xb8\xcc\x52\x87\x79\x42\x4a\x19\xe9\xe2\x41\x13\x83\xd5\xd6\x72\x52\x08\x61\xaa\xb9\xf5\x07\x49\x53\x97\x31\x70\x5c\xb6\xfc\x11\xf6\x6d\x2d\xfa\xd3\x71\xa0\xc3\x2a\xd7\x26\xfb\x8b\xe4\xda\x50\xc0\xf2\xd2\xc1\x0c\x14\xe7\xbe\x88\x3b\x3f\x60\x8a\x60\x8e\x50\xbe\xec\x13\xad\xe7\x4c\x11\x26\x58\xac\x03\x4c\xe3\xcf\xc9\x75\xac\xf9\xf1\x74\x1c\xc9\x2a\xd7\x21\x76\xa1\x9e\x5e\x45\x7f\x1b\x4e\x73\xfe\x67\x84\xa3\xff\x37\xfa\xff\x22\x7a\x3b\xd7\x79\xf5\x66\x09\xd8\x5f\xbd\xb9\x03\xff\x5d\x02\xfe\xf7\x6f\xc0\xdd\xfb\xf7\xcf\xbe\xba\x7c\x73\x7b\x97\x6c\xba\x3c\x7f\x07\x3e\xa7\x79\xc5\x63\xa3\xeb\xfa\xd0\x8f\xa9\x16\x74\x19\xcd\xd4\x22\xd7\x1e\x9a\x44\xe0\x9a\x58\xb8\xbc\x6d\x4c\x55\x1f\xfa\x8a\x68\xa6\xce\x74\x13\x9d\x23\x1b\x1f\xe7\xf2\xf6\x34\xe4\x78\x89\xd0\x29\x56\x7d\xcd\x9b\x6e\x17\x29\x25\xd3\xb2\x94\x25\xa6\x82\x61\x01\x39\x36\x12\x42\x7f\xac\xc8\xfa\x4e\x5e\x3f\x97\x4c\x08\x33\x43\x30\x51\x3f\x2c\x3f\x23\xe7\x48\x17\x14\x12\xc5\xd0\x2d\x4f\x9e\x26\x62\x27\xa3\xbf\xb9\xb2\xb9\x45\xe0\xc3\xc7\x0f\x1f\x5f\xc7\xc9\x87\x8f\x6f\x3f\x7e\x06\xe4\x58\x6f\x33\xae\x13\xfc\xfe\xfb\x57\xfb\x7f\xb9\x4e\x19\x20\x57\x0c\x63\x7b\x9c\x9c\x46\x8a\x61\x93\xa6\xa3\x3f\x95\xce\x68\x9b\xd7\xa2\x12\xe0\x80\x32\x99\x43\x84\x5c\x71\x34\x19\xd1\x78\x53\x1c\x32\x6d\xa1\x87\x7e\xcc\x4b\x85\x5d\x8b\x61\x41\x4b\x5d\x8d\x79\x66\x06\x20\x4b\x5f\x9d\x1b\x69\x0a\x23\xf3\xe3\x90\x4e\xcd\xa1\x98\x7a\x74\x8a\x36\x81\x83\x4a\x7f\x5b\xce\xe0\x51\xfb\xb7\x9b\xaf\xe4\xdc\x5e\xbd\xe9\xd5\xfe\x5f\xde\x82\x5c\x71\x82\xed\x69\x6a\x6c\x9e\x2b\x8a\x6c\x76\x89\xfc\xb1\x70\xd6\xd8\xbc\x91\x56\x80\x82\x16\xa6\x20\x9e\x9a\x8c\x6a\x02\x14\xb2\xc5\x26\x4f\x83\xa8\xa5\x1f\x8b\x92\x62\x54\xb5\x98\x52\x78\x27\x6a\x7d\x6e\x94\x2b\x9c\x82\xc5\x25\x3a\xe1\x53\xdf\x0f\xe9\xd4\x46\xdb\xd8\x3e\xf9\xfd\xe7\xb9\xe2\x27\xfc\xfe\x5b\x33\x58\x12\x81\x63\x0e\x2b\x9c\x83\xe1\xd1\xd0\xa4\xf6\x92\x0a\x46\x72\x46\x8b\xcc\xcb\x2a\xe6\xb3\xc5\xda\x58\x55\x27\xc4\x71\x4b\xdd\xd6\x31\x52\x70\x61\xdd\xdc\xf8\x54\xb2\xb4\xca\x0a\x08\x3a\x0b\x32\x1f\x11\xdf\xd5\xf2\x78\x1d\x92\xdb\x58\xfc\x65\x72\xc5\x27\xd0\x65\x45\x05\xd3\x38\x7b\x14\x2c\x69\x3d\x27\x92\x91\x9c\xb2\x3c\xf7\xd2\xc5\x6a\x56\x8b\x5c\xba\x49\x58\xcd\x2d\xab\x7e\xb9\x5c\xd3\x5f\x36\x7f\x61\xd0\x66\xa5\x45\x19\xe8\x1e\x8f\x28\x31\xde\x10\x4e\x71\x4e\x28\xf4\xd2\xc6\x6c\x76\x85\x56\x5a\xb9\x24\x37\xd4\x12\x7d\x37\x4f\xcc\x93\x20\xa9\x49\x49\x98\x57\xbf\x10\xea\xe9\xfe\x53\xff\x4c\xbc\xf5\x45\x9c\x0e\xde\x3f\xbc\x5a\x82\xbc\xde\x82\x53\x5e\x2c\x13\x3e\x9a\x49\x08\x5e\x9d\x0b\x61\x3a\x9c\xbb\x6d\xe5\x4f\xc6\x80\x3c\xec\x97\x7d\xed\x0f\xcd\xec\xd8\x12\x76\x99\xd3\x59\x9c\x4e\x6b\xbb\xea\xba\xd6\xfc\x9a\x76\x4d\xa8\xd5\x6c\x16\x43\xe4\xa0\x9c\x4d\x6c\xac\x3f\xd8\xb5\xa4\x62\xf2\x87\xa7\x76\x49\xf9\xbf\xbc\xdd\xc2\x81\x2a\xcb\x97\x89\x1a\xce\x36\xd6\xd6\xa7\xce\x85\xe3\xaa\xd1\xa7\xdb\xda\xf7\xc6\x80\x82\x60\xc8\x84\xaf\x7c\x54\xcd\x96\xd2\x6d\xea\xed\xf1\x2c\xaf\xed\x46\x4b\x5c\x4b\xb7\xe4\x57\xed\xc1\x8a\xf2\x56\x6d\x7d\xc8\xf2\x78\x7c\x6c\x36\xd6\x9e\x23\x6b\x93\xfa\x4c\x96\xd9\x73\x4b\x08\x5b\xf1\x31\x10\xf2\xd2\x13\x39\x9f\x28\xdf\x50\x7f\xac\xe7\xac\x8d\x36\x31\x8f\xba\x3d\x0b\xba\xbe\xfa\x8c\xa4\xfa\x65\x9b\x0f\xf7\xfb\xaf\x6c\xd9\x7f\x41\x1b\xc3\x2c\x8f\xb3\x19\x26\xd9\x99\xd8\x70\x37\xa4\x66\xb5\x53\x88\xfa\xc1\x58\x90\xc3\xd2\x2b\x8f\x8d\x47\x9b\x83\xef\xea\xf9\x50\x47\xdb\x48\xc4\x2e\x60\xb8\xff\x75\xf4\xe2\x69\xf6\xfa\xaa\xb2\x7c\xff\x25\x57\xcd\x3d\x46\x5c\x38\xf3\x18\xcc\x27\x65\xe2\x31\xcb\x3d\xde\xd8\x47\x3e\xee\xf4\x9c\x62\x85\x50\x46\x70\x39\x47\xa0\x22\x47\xdf\x61\x80\x92\x16\x64\x23\x1f\xfc\xb8\x0b\x27\x77\xd6\x82\x34\xcf\xfd\x24\xb0\xb4\x14\xa7\x2a\x43\x2a\x13\x06\x2b\xac\x98\x12\x9a\xae\xf1\xc3\x1a\xe3\xdf\xcb\xf7\x55\x05\xf5\x57\x18\x76\xf7\x77\x86\x7b\x65\x66\x6c\x81\x29\xa0\x21\x85\x37\x31\x9e\x9b\x2e\x99\x3c\xc2\x92\xe0\x8c\xd2\xc2\x33\xa7\xa4\xe3\x55\xdc\x2a\xa5\xb8\xd9\x5a\xaf\xc6\x01\x48\x4e\x4b\xa1\x7c\x6d\x3a\x33\x57\x82\xe4\x26\xc7\x31\x12\xd4\x4f\x56\xd6\xad\xeb\x65\x80\x79\x88\xb6\x31\x7c\xaa\xed\xfe\xb3\xe5\x63\xee\xac\x5d\x7c\x28\x4a\x8b\x4b\x5f\xc4\xfd\x5c\x4c\x9b\x71\x3e\x12\xcb\x69\xc6\x05\x9e\x4f\xbd\xd2\x8d\xec\x12\xe6\xac\xd2\xf5\xd6\x79\x39\x0e\x40\x31\x02\x85\xf4\x95\x6d\xec\x5c\xaf\xe9\xa4\x31\x14\xec\x12\x59\x55\x37\xee\xa8\x8e\xdd\x1a\xaf\xda\x0b\xde\xb3\x4d\xf7\x2b\xe5\xdb\xae\x69\xe0\xa1\x7f\xf7\xcc\x7e\xe2\x26\x39\xa4\x99\xcb\xb3\x99\x6c\xaa\x47\x3a\xed\xaa\xf3\x44\x0d\xa3\xb9\xe0\x70\x4e\x81\x56\xad\x9f\xe8\x90\xf4\xe0\x30\xc8\xfe\x12\x6d\xd0\xba\x75\x2b\x8b\x12\x61\x3f\x18\x6d\xbc\x59\x39\x5e\x00\x2d\xf8\xa0\x8d\xe8\x4d\xab\x8f\xe6\x8a\x65\xfe\x17\xf6\xaf\xb4\x73\x1a\x18\x5f\x2c\xcc\x3d\x8f\xe5\xac\xfb\x0d\xf6\x19\x56\x81\xd5\xa4\xf4\xb0\x51\xc2\x72\x1b\x9f\x8c\xd6\xc2\x3d\xf5\x2f\x81\x4f\xfd\xcb\xe9\xad\x7f\x2f\x91\x51\xee\xde\x7e\xec\x82\x93\xfa\x9a\x9b\x7e\xcd\xf2\xfb\x12\xd1\xef\xe5\x37\x2d\x78\x97\x3a\x27\x00\xb1\x81\xde\x3c\x9f\x4b\x90\xf9\x1a\xc7\xd5\x4c\x71\x52\xf8\x16\x0b\x54\x66\x08\xe7\xbe\x8e\x1d\x86\xa6\xc0\x9e\x6a\x44\x14\xdd\x0e\xc6\x18\xab\xb5\xf5\xc4\x58\xe3\x33\xbe\x44\xd9\x18\x74\xc8\x54\xa8\x36\x65\x39\x3a\xdc\xac\xf3\xe2\x32\x3e\x9a\x9d\xbc\xf2\xe6\xff\x3f\xb7\xba\xd2\x6b\xae\xf6\x15\xed\xed\x75\x20\xbf\xb8\x5b\x41\xff\x35\xa0\x6f\x7e\x7c\x71\x97\x2e\xfc\xee\x7d\xf2\xea\xdd\x95\x63\x2b\x39\x01\x6c\x00\x97\xd2\xdb\x02\x6a\xa2\x84\xe1\x5c\x12\x3f\x3a\xcc\x09\xca\x09\xce\xb3\x76\x40\x20\x3b\x86\x6c\x2f\x01\x8c\x6f\x40\x7f\x3c\x1e\x67\xe8\x24\x53\x76\xdb\x3b\xe7\x7b\xed\x4f\x35\x25\xca\xd0\x46\x72\x86\x5c\x05\x72\xdf\x08\x9a\x99\x2c\x87\xb5\x96\x56\x6b\xa0\xb4\xd5\x6e\xf9\xaa\xb5\x5e\x10\x26\x05\x09\xb5\xf8\xab\x3e\xeb\x7d\xe6\xff\xfd\xcb\xf4\xf9\x86\x3a\xd7\x4b\xda\x55\x1d\x09\xa8\x05\x4e\x6b\xcf\x20\x72\x4c\xab\x4a\x4a\x4d\x7c\xd7\x61\x49\x48\x46\x28\x6c\x16\x6d\xba\x70\xcb\x44\xc3\xed\xc2\xb8\x92\x1e\xce\x91\x53\x5c\xaf\x0a\x9d\x8c\xef\xab\xab\x42\x82\x22\xe7\x40\xe9\xeb\xa0\x10\xad\xb4\x58\xf4\x91\xc6\x1a\x63\x8c\x3f\xdd\xe9\x03\xd8\x05\xef\xdd\xb6\x8d\xde\x45\x1f\xd7\x9d\xf0\xb7\xf4\xf9\x4a\x9d\x50\xa2\xf5\xfe\x27\xd4\x89\x8b\x38\x72\x71\x59\x55\xf3\x91\x0a\x23\x34\x77\x55\x4f\xbc\x1c\xb1\x94\x2c\x57\x32\xf7\x95\x1f\x30\xa8\x40\xea\xa3\x38\x0a\x99\x8e\x51\xbc\x22\xe7\x99\x33\x22\x44\x60\xba\x39\xfe\xff\xa4\xbd\x3f\x8c\xe4\xb8\x9a\x27\x28\x4a\xf1\x47\x33\x83\x9d\x53\x76\x75\x76\x69\x66\x6e\x67\x94\x2f\xbb\xba\xb4\x87\xbb\x5d\xdd\xcb\xad\x2a\x62\x71\xbb\x2b\x2c\xf6\x00\x02\x87\x03\xb8\xc6\x01\x3c\x8f\xe7\xd1\xa4\x49\x93\x26\x4d\x9a\x34\x65\xca\x94\x29\x53\xa6\x4c\x99\x32\x65\xca\x94\x19\xdd\x19\x62\x1c\x44\x45\x44\x46\x56\x65\xbf\xee\xd7\xf3\xaa\x14\x11\xa5\x87\xf7\xf8\xf1\xdf\xc7\x8f\xdf\x9f\xdf\x6f\x9a\xec\xa4\xed\x88\x18\x21\x8a\x09\xc2\xf2\x42\x83\xe8\x74\x26\x62\x32\x15\xd1\x52\xb5\x5a\x69\x29\xa5\x9d\x94\xb2\x2d\x62\x84\x52\xcf\xdb\xf8\xc6\xf1\xac\xfc\xc6\xfc\xb8\x78\xc9\x5f\x5e\x6e\xaf\xe6\xc7\x03\xda\x80\xa6\x2c\x6d\x0e\x71\xcd\x95\xae\x0d\xf0\xb0\x2d\x7a\x22\x28\x59\xb6\x70\xd2\x8e\x08\x24\xbd\xcb\x07\x88\xc1\x68\xb9\x9f\xba\xba\xf0\xf4\xd8\x19\xc1\xa4\xbe\x4e\x50\x41\x97\x09\xaa\x44\xc9\x8a\x12\x64\xb6\x3c\x2f\xb8\x52\xf1\x42\xbe\x9e\x20\x85\x85\x90\x78\xe5\x5e\x6e\x9d\x0e\x82\xe7\x9c\xd3\x87\xbb\x17\x22\x15\x87\x2e\x7e\xbd\xd2\xbf\x8a\x8e\xdd\x3f\x7e\xda\x64\x41\x74\x9c\x7c\xe9\xc2\x81\x32\x10\xc6\x4e\x80\x12\x01\x13\x91\x74\xa6\xd3\x80\xda\x49\xef\xe0\x2c\xa5\x12\x72\x56\x07\xd9\x59\x45\xb1\x42\xfd\xdc\xf9\x99\x45\x3e\xec\xe4\xe1\xca\x1f\xc7\xb7\x9e\xf7\x77\x2b\x92\xfb\x5b\xed\xbf\x15\x9f\xbb\x7f\xbc\x0b\xc6\x20\x3d\x76\x7e\x31\x4b\x5f\xce\x2c\x50\xca\x4e\x00\x61\x92\xc2\x84\x24\x69\xa3\x1b\x0d\xb0\x1d\xd4\xd6\xb3\x1e\x27\x9c\xd8\xf8\x20\x0b\xdb\x11\x1c\x89\x10\xad\x78\x59\x06\x0c\x85\x5a\x79\x8e\x7c\xaf\x38\xe1\x3d\xdd\x54\x6f\xc8\x71\xf7\x8d\x1c\x37\xf1\xb9\xfb\xc7\x3b\xc0\x36\xd3\x2f\x87\x0d\x7f\xee\x36\xd9\x73\xb9\x3d\x98\x59\xf9\x39\xe3\x6b\xc6\x9f\xc5\xc6\x62\xe3\xa3\x59\xe8\x4d\x35\x8f\x82\x08\x62\x23\x7b\xd0\xfc\xe4\x11\x1c\xc9\x30\x67\x6e\x62\x07\x60\x78\x09\x12\x97\xa3\x8e\xf6\xc5\x1f\x98\x8f\xe0\x10\xc0\x63\xeb\x57\xb3\xf2\xc5\x8c\x83\x52\xdb\x16\x48\x2a\xf2\x44\xa6\x93\x9a\x34\x90\xb6\xfd\x1d\xf3\xe1\xf8\xb7\x82\x15\x47\x70\xb5\xf9\xce\x19\xb2\x4f\x8b\x9a\xbf\x14\xc6\xbb\x48\x20\xb8\xb9\x52\xaf\x7e\x2b\xdf\x14\x39\x2a\xed\x94\x82\x48\x5b\xa9\xc7\xcc\x36\xa0\x42\xb6\x79\xc9\x03\xb1\x12\xc2\x44\x27\x70\x27\x32\xc5\x75\xf5\x0c\x39\xdf\xb4\x95\xd6\xc7\xb1\xb6\x61\x6d\xbd\x66\xcb\x89\x48\x39\x75\x9c\x77\x68\x6f\x36\xd9\x99\x1f\xf6\xb3\xf3\x34\x7d\x7a\xfa\xfe\xfd\xd3\xe5\xfe\xf1\xdd\xfb\xcf\xef\x1c\x90\xa1\xcb\x3d\x7e\xfc\xd3\xea\x10\xf0\x03\x77\x31\x59\x24\x5c\x4b\x91\x8a\xc0\x84\x26\xec\xd3\x94\x63\x08\xa2\x59\x24\x52\x53\x83\xa9\x5c\x0e\x48\x95\x35\xb2\x91\x05\x29\x79\x99\x1c\xa9\xf4\xd5\x2c\x34\x60\xd6\xf8\x2c\xb6\xdc\x46\xd0\xf7\x02\x8d\x30\x46\x69\x86\x30\xd6\xb6\xeb\x4a\x10\xc3\xd6\x94\x8b\xe5\x66\x79\xcb\x89\xa0\x0c\xc4\x80\x72\x8b\x54\x69\x35\xa7\xb9\x81\xde\x55\x76\x74\x66\xa8\xf9\xf4\x2b\xb2\xfb\xfb\x1f\x9e\xfe\xfc\xe5\x37\x45\xef\x32\x28\x68\x0e\xa2\x59\xa6\x42\x53\x23\x2b\x9d\xa3\x44\xa5\xad\xaa\x64\x49\x2a\x5e\xa4\x47\xf2\xa6\xe4\x58\x48\xc5\x61\x86\x08\xd1\x27\xaf\x2d\x80\x07\x6d\x5b\xe9\x43\x62\x55\xc3\x9c\xe0\x21\xc8\x88\x25\xca\x2c\x9a\x22\x37\x99\x17\x78\x2a\xa8\x5d\xac\x7e\xc5\x82\xf9\xca\x16\x0e\x6e\x58\x06\x83\x03\x4c\x83\xa4\xf8\x05\x17\x41\x94\xa4\x21\x3b\x58\x43\x01\xf2\x1b\x90\x83\x88\xda\xd1\xb6\x3b\x81\xb0\x35\x7d\x0f\x18\x4c\xed\x40\x4a\x26\x89\x66\x9a\x1b\xee\xec\x46\x7c\xce\x09\x78\x3c\x33\x16\xaf\xbe\xeb\x4f\x4f\x8b\x31\xf1\xdd\xbf\x80\x65\x6c\x82\xef\x1c\xb2\xac\xbf\x7b\xfc\x53\xe0\xf4\xa7\x1f\x5c\x48\x43\xce\x89\xb5\xeb\x18\xf9\xdc\x6f\x43\x1d\x82\xca\xe2\x28\x8a\x15\x93\xa6\xca\x51\x92\xca\x98\x62\xcd\xda\x03\x02\x69\x9d\xc7\x33\xdc\xc4\x8e\x6e\xe3\xe8\x80\x24\xd4\x34\x01\x13\xdb\xc1\x96\x09\x90\x5b\xa4\x0b\xdb\x69\xdb\xeb\x6e\x00\x69\x6e\xa9\x3d\x58\x53\x14\xb1\xed\x4b\xa0\x7a\xa3\x9a\x01\x40\xdf\x03\x0d\x21\x88\x90\xb9\x9b\x47\x09\x62\x9b\x28\x8e\x4c\xee\xee\x48\x0a\x68\x77\x66\xbf\x9e\xeb\xfb\x4b\x46\xcf\x32\xd5\x5f\x6e\xa6\xfa\xe2\xbd\xfe\x7a\xae\x55\x70\x08\x8b\x36\xc9\x24\xce\x0e\x73\x91\x50\x81\x35\x33\x8a\xa6\xb1\x4e\xcb\xbc\xcd\x45\x85\x4b\x6e\x92\xa3\x67\x16\x13\x79\xc5\xe4\x60\xb1\x15\x36\x81\xe0\xb0\xad\x29\x6d\x5c\xc9\x98\xb6\x87\xda\x8c\x99\xed\xeb\x6a\x4a\x6d\xe1\x48\x75\x19\x3f\x00\x24\xdc\x44\x17\x9c\xa0\x65\x85\x2e\x73\x50\x39\x9e\x3a\x71\xe6\xd0\x58\x11\x43\x1f\xee\x9e\xbe\x7f\x59\x9e\x5f\x4d\xc1\xe7\x5f\x9d\x82\xc1\x17\xc6\xc1\xfb\xc6\xa9\xa0\x4a\x97\x38\x8f\x13\x15\x51\x6c\x58\xd1\xe1\x83\x41\xf1\x2c\xcf\xc0\x77\xc7\x7e\xb9\xf3\xea\xbe\x07\x65\x6c\x7b\xab\x13\xa0\xb7\x08\x64\x85\xd6\x16\x4f\x23\x48\x72\x4b\xec\xc1\x36\x85\x89\xed\x58\x03\xda\x28\x5d\x76\x80\x81\x09\xd4\xae\xf0\x6a\x1e\xe6\x51\x81\xd0\x66\x4a\x90\xf2\xcc\x8d\xd9\x6d\xa2\x7d\xba\xc3\xde\xdf\x79\xef\x9d\x4f\xda\x7b\xb7\xac\x59\x87\x0b\xfa\xe9\xe1\xc3\xcd\xef\xed\x0d\x33\xe0\xe0\xf7\x7a\xb2\x7d\x0e\xe8\x61\xae\x03\xbe\xfe\x0b\x02\x72\x98\xeb\x63\x67\x0a\xa8\x75\xa0\x8d\xc9\xb4\xd9\xe1\xb9\x97\x18\x49\x8c\x2a\x71\xfd\x95\xc6\xa9\xc8\x62\xee\x3e\x9d\x1d\x3a\xb9\x7c\x9b\xcc\x7b\x77\xc5\x00\x7d\xb8\x92\x57\x7f\x5a\xe9\x87\xee\x16\x59\x6e\x6c\xe4\xf5\xe5\xe3\xad\x50\x9b\x14\x18\x82\x73\x9a\x14\x90\x89\x95\xff\xb4\x03\xd2\xbd\xa1\x39\xa4\x94\x16\x72\xb2\xca\x85\x2b\x7c\x94\xa7\x22\xc9\x77\xd9\xcf\x23\x63\xa1\xa6\xa0\xa9\x05\x6b\x0f\x7e\xa5\x7e\xee\x29\x0d\x75\x48\x41\x59\x70\xd6\x4c\x7e\x53\x34\x1d\xee\x1b\x54\x77\xa8\x6b\xbc\xb3\xbf\xae\xff\xab\xf3\xb3\xef\xce\xf9\xd9\x41\x4f\x30\xa4\x09\x85\x70\x3e\x50\x45\x7a\x21\xa5\xd4\x96\x29\x07\x58\x28\xa4\xdc\xc1\x45\x80\x48\x45\x74\x2b\x66\x36\x8f\x16\x61\x60\xfc\xc8\x3f\x58\x5e\x55\xa2\x16\xa2\xb6\xf9\x39\x3d\x7b\xc5\x7d\xdd\x43\x3f\xf1\xbe\x3f\x47\x4b\x96\xb9\xfb\xd6\x10\xfc\xf0\xd6\xcb\xdb\x81\xab\x83\x08\x21\x62\x92\x32\x4f\x6d\x6f\x0d\x04\x06\x64\xb3\x0c\xf8\xfa\x3a\x2e\x5e\xbd\x9e\xbd\xd2\xc0\xa2\x08\xca\xd2\x64\x65\xe1\x27\x73\x89\x50\x24\xa3\x94\x0b\xaa\x29\x6f\xe5\x57\xff\xce\x92\x4c\xc0\x94\xb9\x4f\x97\x33\x23\x7d\xee\xf2\x38\xae\x75\xfc\x17\xd4\x98\x3f\xff\x78\x4e\x22\xde\x3e\xdc\xad\xac\xfb\x1f\xce\x28\x36\xe7\x34\xa2\xd8\x4f\x0c\x28\x2d\xe9\x23\x60\x0a\x62\x4a\xa0\x66\x64\x0f\xfe\xf8\x9c\x17\x05\x04\x1c\xc0\x99\xfa\xd5\x3c\x00\x19\xc8\xa3\x7b\x76\x11\x63\x82\x95\x84\x12\xb4\x58\x0d\x80\xa7\x89\x44\x44\x30\x1b\x12\x3b\x10\x87\x21\xb6\xd6\x7e\x5e\xf3\xdb\x57\x69\xce\x72\xec\xae\x07\xf6\x95\x86\xf7\x61\xfb\xf9\xcb\xe3\x25\x9f\x28\xe8\x40\x6a\x40\x8a\xa5\xa8\x00\xb4\x39\x67\x3e\x2a\x6c\x64\x60\x46\xda\xce\xa1\x3e\xf5\xa0\x61\xb8\xee\xd7\xda\x54\x1b\x6d\xcb\xae\x13\xa8\xed\x14\x27\x47\xa2\x54\xe0\xa5\x31\x97\x8d\xea\x3b\xc6\x8e\xaa\x99\x0f\x8d\x1b\x1f\x7a\xca\xf7\x7a\x53\xbc\x96\x68\x19\x9f\x1f\x3f\x7c\x2d\xd6\xf6\x8d\x21\x22\x0e\xc6\x55\x01\x04\x22\x56\x56\xc0\xcc\x19\xe9\x82\xb8\x3c\xca\xd2\xb6\x39\xe0\x20\x9f\x51\x10\xcd\x25\xe0\x97\x41\xda\x24\x52\x2a\xa5\x2a\xce\x89\x4e\xd1\x9c\x61\xec\x23\xac\x08\xd3\x6a\xe6\xc2\x6a\xe9\x79\x81\xbf\xdc\xb3\xd5\x36\xfc\x56\xa6\xcf\xdf\x0c\xd5\xfe\x06\x1e\x62\x85\x0d\x19\x41\x6e\x00\xb6\x95\x39\x54\x5c\x2c\x17\x9f\x48\x73\x5f\x98\x99\xea\x11\x81\x08\x20\x17\x28\x6e\x26\x97\x0d\x58\xcc\x74\xb3\x48\xa3\x4c\x41\x38\x57\x14\x1e\x0f\x8c\xf9\x8c\x48\x52\x2b\x35\x23\x6d\xd9\x9a\x8b\xe6\x0d\x57\x3c\xa6\x7f\xff\x6a\x8c\x6e\xe4\x79\x58\xa7\xed\xd3\xd3\x79\xea\x96\x41\xda\xbb\x51\x4a\xfd\xc4\x41\xac\x4e\x20\x1a\xa9\x5e\x06\x49\xc9\xd6\x57\xcf\x45\x51\xe5\x5d\x23\x9a\xea\xd8\xf8\xe5\x3c\x00\x1e\x24\xc7\x31\x0c\x92\xe3\xe0\xae\xd4\xba\x6c\xb9\x12\x1a\xd1\x19\x83\x21\x87\x3a\x47\x2e\x65\x64\x4e\x74\xe8\xe4\xda\x6c\xd0\x37\xb9\x9b\x4e\x0d\x7c\xf9\xca\xfe\x3b\x2f\xa7\xa7\x4f\x8f\xb7\xcb\x69\xd3\x36\xba\xcd\x25\x51\xbd\xed\x4a\x50\x6a\x5b\xe9\x2c\x25\x65\x65\xa7\x43\x03\x30\xca\x84\xbe\x54\x48\x6d\x8b\xbe\x97\xa8\xeb\x64\xbb\xac\x23\xbf\xcf\x12\x6e\x06\x39\x34\x94\x1e\x65\x37\x8f\x9d\xe7\x79\xc0\xe5\xf6\xea\x5d\xb4\x6a\xd3\xfb\xc7\x2b\x8b\xcb\xf7\x6b\xcc\xf4\x87\xfb\xe8\xf5\x0d\xeb\xf3\xbb\x9b\xb8\xf0\xe7\x2f\x8f\x7e\xec\xb3\x29\x4d\xd3\x04\x67\x92\xf0\x50\x60\x92\x26\x91\xe0\x39\x4e\x28\x4e\x53\x55\xe1\xc1\x44\x5a\xe2\x52\x46\x31\xc3\xa4\xe4\xfd\x2e\xd2\x04\x21\x4c\x29\x2e\x69\x98\x62\x2c\xd2\xb4\xa8\x6d\xdb\x27\x45\x52\x55\xea\x20\x8d\x01\x89\xe9\x88\x12\x63\x96\x4a\x28\x94\xf3\x45\x03\x30\x9d\xd0\x26\xd9\x11\xc7\xd3\xbb\xdc\xfe\xee\xae\x72\x7d\x77\xf7\xe9\x9c\x4d\x7b\x16\xec\xcb\x0f\xef\x3f\x07\x85\xcc\x05\xa6\x22\xc5\x09\xc9\xd3\x84\x0b\x54\xc8\x28\xe4\x88\x30\x0e\x89\xc8\x21\xda\x11\x54\xd5\x93\xa5\x36\x1e\x13\x1d\x83\x18\x24\x79\xc7\xb5\x06\x19\xc1\x0a\x09\x5e\x28\x89\x08\x53\x97\x3c\x74\x74\xd6\x45\xaf\x56\xf6\xb7\xab\xfa\x45\x1b\x6d\x3f\x5c\x77\x9b\x3f\x02\x51\x00\x0d\x33\x69\x26\x50\xcc\xb5\x51\xfe\x64\x66\x61\x24\x25\xc0\x03\xb1\x45\xa0\xb7\xca\x8f\x1d\x2e\xc0\x61\xb1\x30\x97\x67\x51\x02\x30\xbf\xd1\x02\x19\x4a\x9d\x16\xe8\xfb\x8b\x12\xf0\x7d\x75\xaa\x36\xda\xd5\xa4\x47\x97\x7c\xf4\xe0\xe1\xcc\x1e\x78\xf7\x18\x60\x89\x35\x92\x39\xc0\x69\xca\xb0\x12\xf5\x4e\x14\x35\xae\x0a\x1b\x1e\x0d\x44\xd4\x18\x16\xb8\xdc\xfc\x8d\xc3\xc8\x37\xaf\xfa\xe7\xd6\xe3\x9b\xfd\x5b\x77\xc9\xe3\xf6\x66\x41\x16\xbd\xa9\xd3\x58\x12\x03\x3c\x5b\x50\x02\x06\x6d\xb5\x4e\x53\x52\x94\x76\x02\x71\x0f\x38\x63\x95\xcb\x8b\xe6\x56\x2f\x6b\x32\xcf\x97\x45\x79\xa3\xdd\x54\x2d\x07\x63\x2e\x8b\x72\x73\xad\xb5\x7f\xd9\x1f\xaf\xc6\xfb\x46\x89\xbc\xa5\x6e\x15\x48\x0a\x80\x72\xa8\x8a\x0e\x88\x79\x5a\xac\xa6\xb9\x37\x92\x0c\xcb\x4d\x94\xdb\x01\x34\x9c\x76\xe3\x25\x89\x73\x19\x68\x84\xd1\xd0\xeb\xe6\x48\xa4\x0c\x22\x22\x65\xa5\xfb\x9e\xb3\xa3\x6e\xe6\x69\x19\x67\xc0\x4e\x68\x1f\x6e\x3d\xef\x6f\xbd\xbf\x5f\xce\x71\x47\xd2\xbc\x9c\xe1\x1f\x1f\xee\x1f\xfc\xb2\xd2\x14\x6d\x0e\xfa\x98\x05\x5d\x50\xd8\xc6\xe6\xb6\xc4\x1d\xc8\x47\x9f\xdb\x62\xa0\x8b\x5e\x5c\x79\xcb\xfa\x57\xab\xc7\x1d\xfa\x6f\xea\xc5\x2f\xaf\xf4\x62\x90\x82\x5c\x4d\x13\xab\x0d\xc1\x04\x84\x36\x8f\x15\x38\xa8\xd9\x28\x93\x03\xaf\xb3\x18\x14\xb6\x19\x7c\x36\x9b\xe5\x09\x88\x94\x42\x72\xc5\x10\x12\x11\x9a\xeb\x2c\x03\x05\x54\x88\x09\x39\xf7\xc4\xf6\xc4\xdb\x80\xf2\x94\xef\xa9\xc3\x6f\xfc\x77\x67\x5e\x82\x55\x2b\xbe\x25\xca\x8b\x52\xdc\x7e\xfe\xf2\x70\x7f\x5d\xd0\x39\x68\x34\x40\x82\x29\x55\x00\x34\x77\x5c\xf8\x2e\xb5\xc7\xe0\x11\x6b\x35\x0f\x7e\x6a\x73\xbf\x61\xc4\x76\xd6\x04\xd1\x71\x5a\x9e\x8d\xc7\x98\x40\x08\x31\xa2\xf2\x6c\xce\x72\xe4\xa7\x50\xe0\x24\xcb\x15\x63\x19\x64\xd6\x93\x56\x4a\xcf\xfb\x9b\x60\x74\x7b\xed\x05\x9f\xf2\x5f\x6e\x18\x48\xcf\xc6\xd1\x87\x8b\x91\xf4\x55\x76\xf7\xbb\xaf\xd1\xb2\x87\xc5\x58\xd6\x52\xce\xda\x15\x46\x4a\xc9\x82\xdc\x96\xcb\xc1\x67\x1c\x7c\x79\x65\xea\x1a\xe0\x66\x9e\xdc\xd7\x2e\xb7\x5c\x1a\x61\xb9\xd4\x56\xcd\x58\x6a\xdb\x80\x5c\x4b\xe0\xc0\x5c\xc8\x5a\x57\x00\x3c\x12\x74\xae\xd6\xed\x57\xeb\x99\x8c\xaf\x72\x68\x92\x34\x50\xf3\x34\x02\x8a\x2d\xb6\xa3\xed\x4f\x9e\x85\x08\xe4\xa3\x8d\xb7\x23\xc2\x19\xcc\xb4\x41\x85\x04\xde\x41\x0b\x56\x2e\x67\xd5\x72\x97\xc5\x9b\xd1\x65\x2b\xff\xfb\xaf\xce\xce\xaf\xe7\x65\x39\xad\xbe\x3a\x3d\x13\x00\x0b\x10\xdb\x91\xb4\x85\x19\xc1\x38\x67\x15\x09\x72\x73\x84\xc5\x40\x4b\x83\x00\x9c\xa5\x5f\xd8\x16\x06\xed\xd1\x3d\x1b\xa2\xb5\x32\x42\xe0\x42\xd3\x74\x4e\x29\xf1\x23\xac\xb2\x3c\x56\xda\xcc\x84\x5b\x77\x7f\xdc\xf8\xe4\x84\xb6\xc8\xd9\x3d\x6f\x9d\x53\x5f\xa9\x05\x57\xe9\x71\xa3\x16\xfc\xaa\xd4\x65\x2e\x88\xae\xed\x44\xf1\x72\x50\x4d\x3a\x8e\xb0\x90\x5d\x5f\x02\x48\xa9\x72\xc0\x8f\x91\x9d\xd6\x63\xaa\xed\xa5\xc0\x4e\x23\x24\x51\xc4\xb8\x91\x83\xd6\xd7\x63\xca\xdb\x04\xdd\x37\x3a\xe1\x2a\xcb\xc3\xb7\x67\xe6\xc3\x57\x67\x26\x3e\x98\x31\x97\x6c\x19\x22\xde\xf8\x91\xb1\xcc\xe4\x29\xa9\x2a\x3b\x00\x78\x00\x1a\x41\x59\x5f\x4a\x81\x2e\xe6\xd7\x59\x1f\x84\x69\xc2\x65\xad\xfb\x12\x93\xb3\xe2\xdd\xf8\xfc\x6a\x0f\xae\xb5\xda\x5f\xe9\xa7\xed\xad\x30\x1f\xae\x0a\xea\xfe\xaa\xa1\x12\xc0\x0c\x50\x59\x26\xf5\x00\xe4\xdc\xd9\x83\xdf\x9a\xd9\x18\x4e\xc8\x01\x78\x96\x80\xd6\x1a\x3f\x54\xec\x70\xb8\xec\xeb\xeb\x69\x70\x16\x2a\xcd\x53\x27\x54\xcf\x59\x3f\xd3\x8b\x4d\xe8\xe2\x97\x74\x07\x5f\xf4\xcc\xdd\x32\x49\x37\xa0\x0b\x8f\x3e\xf8\xe8\xbd\x73\x04\xd5\x5f\x1e\xd7\x59\xbb\xea\x99\x3e\xc8\x6c\x9c\x64\xbe\x16\x06\xe2\x54\x40\x98\x65\x85\x63\x3f\x37\x5c\x9c\x3c\xda\x32\x96\x63\x5a\x92\xb2\xb8\xd8\xa9\x3b\x38\x47\x18\xcf\x7a\x8a\xca\xa8\x00\xca\xe6\x76\x12\xc0\x03\xc4\x8e\xa5\xd0\x35\x86\x5c\xd7\xa0\x2e\xad\x23\x86\xda\x7a\xd4\xc7\xfb\xca\x61\x82\x3f\x5c\x71\x77\x9c\xa7\x03\x38\xe8\x9d\xd7\x45\x50\x97\x74\x86\x87\x8f\x0f\xbb\xfd\xe7\x0b\xd6\xcd\xf2\xb9\x3b\x90\xde\xa2\x1c\x88\x67\x61\x27\x1d\xf0\x39\xb9\x18\x84\x41\xd4\x90\x5c\x64\xd6\x58\x96\x08\x9f\x61\x3b\xa6\xec\xb0\x51\xf4\xe4\x59\x8e\x41\x09\x12\x6a\x07\x0b\x31\xe8\x76\x9c\x09\xa2\xf2\x59\x09\x1f\x71\xc2\x08\x23\x82\x4b\xc4\x60\xc4\x21\x87\x2c\xf2\x29\xab\xa8\xa2\x05\xeb\x84\x12\x6b\x7c\x86\xf9\xf5\x7e\x3d\x67\xff\x74\xb9\x41\xad\xb2\x7f\xf8\x46\xec\x9f\xd6\x34\x8c\xc7\x4f\x4f\x77\xe0\xa7\xb3\xf4\xbb\x17\xe9\x4b\xda\x5b\x99\x03\x6e\xd9\x8c\x7d\xe1\x7c\x88\xca\xef\x4b\x94\xd3\x24\xb1\xa5\x15\x29\x41\x83\xf1\x69\x9a\xda\x09\x66\xc3\x46\xd2\x83\x15\x04\xe8\x45\xf8\xde\x12\x02\xba\x9d\x60\x9a\x48\x4c\x39\x62\x88\x61\x8e\x09\x4b\xb3\x2c\xe2\x10\x73\x3f\x99\xe3\x2c\x45\x59\xe8\xc7\xac\x62\x8a\x1a\x5e\x92\x95\x07\xd7\xe3\x01\xdc\xaf\x5c\x08\xbf\x57\x7e\x47\x04\xb1\xd8\x52\x8f\xbb\x57\xf2\xd7\xa4\xb3\x04\x02\x66\xe9\x4c\x7d\xe9\x3c\xc2\x72\x91\x1f\xf2\x28\xb2\xc6\x8a\x44\x31\x3b\xaa\xa6\x1d\xd2\x64\x84\xdb\x98\xf4\x16\x42\x20\x41\x4a\xec\x68\x11\x02\xf5\x4e\x52\x8e\x65\x46\x59\x4e\x72\x92\x53\x4c\x50\x12\x2f\x03\x4f\x28\xe8\x67\x1c\x26\x69\x8a\x40\x43\x35\x97\x88\xd0\xf2\xcc\xab\xb8\xe8\x46\xb8\x87\x41\xfa\xab\xeb\xfa\xd3\x19\xba\x71\xb7\x7e\x2e\x67\xa8\x5b\xd7\xf7\x8b\x15\x2f\xb7\xd1\x91\xa7\xe9\x46\xf1\x8a\xaa\xa4\xc6\x34\x3b\x79\xbd\x45\x10\xb0\xea\xe4\x1d\x6c\x0a\x81\xa9\x6c\xad\xaa\x1c\x64\xba\x36\xc1\x78\x8c\xdd\x93\x5a\x9c\x25\xb6\xd4\x89\x4e\xb0\x3e\x79\x42\x90\x72\xa0\x12\xf3\x3c\x93\xb9\x00\x61\x3e\xe4\x6b\x0d\x50\xe6\x70\xf7\x7e\x63\xcf\xfd\xf8\x2b\x7b\xae\x0e\xc8\x3c\x25\x99\x5f\x8b\x22\x27\x89\x84\x10\x66\x95\x55\x0c\xa0\x52\x6a\x3b\xb2\x51\x2a\x4c\x69\x47\xcb\x35\x7d\x22\x9e\xc7\x37\xf6\x9c\x3c\x00\x62\xfb\x4a\xea\x96\xe4\xdc\x34\xd7\x2d\xe7\x05\x01\xff\x3d\xfa\xe0\xd7\x64\xfb\x56\x1f\xa4\xe5\x59\x1f\x28\x3b\xb0\x51\xfe\x0e\x7d\xe0\x64\x6b\x6b\x69\xfa\xd7\xea\xc0\x0b\x1c\x46\xeb\x22\xdb\x55\x83\xbe\x96\xed\xcb\xad\x70\x3f\x7e\x23\x1c\x0b\xcc\xdc\xa6\xd0\x3f\x88\x3a\xa7\x89\x82\x38\x4e\x50\x6b\x39\x03\xac\x36\x8d\x95\x1c\x90\xd2\x50\x46\x47\x5e\x17\x17\x30\xc5\x5b\xf1\x30\x07\xcc\x42\x7b\x70\xf2\x55\xad\xac\x46\x92\x73\xdd\xbe\xc8\xe7\xea\xa8\x37\x69\x70\xc3\x7f\xee\x5c\x35\x0f\xd7\x9a\xc7\x6f\xb8\x31\xd6\x12\xc7\x07\x57\xe2\xb8\x58\x1f\xbc\xd2\x00\xe9\xa2\x70\x04\xc9\x2b\x8c\xe9\x1a\xf7\x23\x53\xe5\x2b\x5b\xb3\xb6\x05\xa4\x0b\x72\x08\x21\x64\x35\xb2\x1d\x12\x45\x21\x10\xc8\x50\x4d\x08\x71\x70\x27\x9e\x17\x6c\x96\x3b\x75\x16\x10\x17\x27\xf8\xe7\x1b\x8f\xd7\x1a\x20\xd9\x39\x00\x90\x27\x57\x2f\xea\x0a\x84\x06\x1f\x63\x84\x64\xa2\x60\x6a\x4d\x22\x64\x91\x72\x80\x6c\x15\x02\x12\x90\xa3\xc1\x38\x56\x71\x56\x35\x15\xef\x81\x04\xb9\x34\xc6\x4e\x38\xd7\x97\x5a\xdb\x22\xa0\x0e\x4f\xc9\xf9\xf7\xc0\xa5\xbf\x2f\x51\xe8\xc7\xed\x32\xf6\x2f\xe0\x0b\x1f\x7c\x33\x1a\x50\x14\x2e\x90\x89\x7e\x29\x40\x3e\x02\xb9\xd8\x5c\x58\xd4\x07\x36\xfa\xed\xd0\xcb\xfa\xe4\xf9\x9d\xd6\x4a\xe9\x51\xeb\x71\x1c\x2d\xa7\x05\xd7\x58\x10\xae\xa4\x70\x7e\x0c\xe4\xd3\xe0\x82\x47\x75\x61\xf9\x38\xa7\xaf\xb9\x04\xbb\xac\x54\x54\x17\x51\xa5\xa9\x29\x01\xe2\xac\x91\x4d\xa0\x11\xe3\x1c\x1b\x44\x39\xc3\x23\x1e\x7a\xda\x2e\x7a\x4e\x06\xed\x5e\xee\xf8\x0d\xc2\x9b\xf7\xee\x0a\x75\xbb\x58\x89\x2b\xec\xee\xf2\xee\xc3\xb9\x57\xcb\xf7\xb4\x4b\x66\x18\xc0\x72\xe6\x7a\xe6\x65\x00\x67\x28\xc1\xc1\x86\x41\xe2\xd0\x90\x3d\xeb\xad\xee\xd4\x1d\x57\xb9\x23\x04\x04\xc4\x80\x24\x3f\x79\x9c\xf3\x9c\x31\xbe\x9e\x11\x32\x50\x7f\x4d\xdb\xdb\x9b\xb6\xf3\x20\x2b\x67\x51\xcc\xa2\x0c\xb2\x39\xbf\x69\x7b\x6d\x37\x48\x97\xdf\x3b\xae\xb1\x6d\x9a\xc5\x6e\xad\x01\xc4\x76\x12\x42\x42\x29\xc4\xd2\x36\x3e\xd7\xdc\x5d\x6a\xfe\x5f\x31\x02\xba\x88\xe9\xfe\xa7\x8f\x57\x82\xf6\xbb\x37\x4c\x65\x01\xf0\xea\x36\x48\xec\x50\x29\xca\xb8\x66\x25\xeb\xf8\x08\x12\x5b\x55\x45\x01\xb2\xc2\x66\xee\x6b\xf5\x70\xcc\x19\xe4\x5c\x0a\x62\x63\x3f\x9a\x0a\x59\x1f\xfc\x4e\xdb\xbc\x2c\x4b\x9b\x17\x45\x71\xf6\x7b\xaf\xf9\xe6\xff\xf6\xca\xde\x7f\x83\x46\x7d\xf7\xe0\xe8\x99\xce\x34\xe5\xef\xd6\xd8\xd6\xd7\x1c\x2e\x11\x98\x0c\x18\x6c\x02\x6a\x2b\xea\xe5\x08\x39\x54\xa6\xb1\x03\x07\xb0\xb5\x05\xa8\x6c\xd4\x9f\x59\x49\xd6\x8c\x07\xf7\x6b\x3b\x18\xa3\xcc\x9c\xd8\x51\x95\x06\x84\x36\xf2\x63\x3b\x96\xba\x00\x91\x3f\x18\x0b\x17\x09\xb3\xb2\x2c\xbd\xad\xdf\xfa\xd1\xbe\xd8\xb1\x5f\x93\x6f\xb1\xe8\x3f\xde\x3f\xae\xdc\x04\x6f\xcb\x97\x82\x4e\x3b\xf9\x0a\xdb\x16\x0e\xd4\xb6\xd5\xdd\x81\x81\xb8\xb2\x2d\x28\x6c\xd6\x38\x03\xb7\x00\xd1\x8c\x2f\xbf\x76\x31\xc6\x82\xd8\x48\xe4\x9a\x54\x7d\x6f\xb0\xcc\x19\x98\x88\x1d\x31\xc6\xf6\xe0\x76\xfc\x8a\x59\xb3\xc6\xbf\x7f\x6d\xec\xde\xef\x7f\x0a\x2e\xd3\xf9\xf0\xd6\x74\x06\x15\x28\xb4\xc3\xb0\xe6\xb6\x37\x13\xe9\x0b\xad\x5b\xd6\x19\x3b\x02\x6e\x69\xdb\xf7\x80\xf5\x73\xe3\xbe\xb6\x7d\x51\xa8\x62\x4e\xec\xe4\xa8\x55\x6d\x04\x0e\x93\x56\xfa\xe0\x0f\x85\x85\x45\x51\x5c\xc7\x6b\x91\x69\xd3\xff\xa5\xf1\x72\x32\x6d\x7f\x75\xbc\x12\x30\xac\xe3\x55\xda\xae\x04\x1e\xb1\x63\xa5\x1b\x3b\x31\x10\x76\xb6\x06\xa5\x4d\xba\xf3\x30\xc5\x33\xba\xfc\xda\x30\xce\x15\x9f\xdb\x86\x9e\x81\x5f\x8b\x41\x2a\xd6\xf8\x90\xdb\x6a\xd1\x92\x3d\x21\xe4\x9a\x43\xb3\xaf\xb6\xde\xad\x7c\xb7\x7b\xe0\x82\x4b\xeb\x39\x67\xe8\xdd\xea\xe7\x7b\x25\x9f\x08\xa0\x2b\xa0\xf2\x95\x0d\x41\x0c\x6a\x6a\x33\xdb\x15\x76\xb0\x48\x80\x12\xc4\x36\xf4\xd5\xb1\x05\x2b\xa3\x91\x06\xd3\xb3\xbc\xfc\xda\x68\xce\x35\x9f\x55\x4d\xeb\x65\x00\x29\x28\x4e\x9e\x36\xbc\xf6\x05\xb7\xfa\x06\x08\x76\xeb\xfc\x7e\xbf\x3e\xaf\x8f\xb7\xf3\xfa\xee\xcd\x6d\xba\x29\x41\xaa\x5c\x56\x42\x32\x68\x25\x89\x54\xaa\xa0\xad\x9e\x40\x62\xfb\x42\x29\x10\x69\x4b\xdd\xd7\x32\xab\xb2\x98\x53\xdb\x6a\xc6\x40\x68\x53\xd0\x4f\xc2\x91\xc3\xf7\xc5\xba\x0d\xd2\xaa\xaa\x3c\x0f\xf8\xc5\x09\x6d\xe4\x2e\xf6\x7e\xf0\x3c\x70\x1f\xfc\x70\x7f\x93\x01\xfb\x1f\x3f\xbe\x7b\xbc\x7b\xbc\xdb\x48\x25\x19\x8b\xd3\x04\xa6\x49\xa2\x74\x27\x77\xb1\xb1\x51\x3b\x94\x55\x58\x44\x94\xb6\x8d\x1f\xff\xdc\xec\xba\x33\x47\x7e\xf1\x17\xf7\xbc\xeb\x9f\xbf\xff\xd5\x3d\x4f\x40\x6b\x40\x6d\x11\x30\x56\x97\x20\x26\x63\x69\xaa\x03\x07\x49\x65\x2b\x60\x2c\x6c\x1d\x5c\x8e\x01\xde\xcc\x2e\xbf\x6e\x77\xbc\x06\xa1\x8d\xc1\xe1\xe4\x15\xdf\xee\xf8\x45\x27\x31\x87\x69\xab\xff\xb8\x4e\xf2\x3b\x3f\x72\xa1\x4d\xd0\x59\xd6\x00\x48\xec\x50\x9b\xce\x36\x0c\x10\x57\x40\x3d\x4f\xbd\xc3\xac\xe9\x40\x36\x7b\x97\x5f\xdb\xa9\x28\x74\x31\xc7\x76\x52\x65\xe1\xa8\xa8\xd2\x65\xe9\x2f\x93\x31\x3a\xb5\xba\x6e\x34\x6f\xbf\x21\x5e\xb1\x97\xbb\xfc\x06\x65\x7b\x3d\x89\xdf\x60\x66\x73\xcf\x2d\x1e\x69\x42\x8f\x3d\x51\xd7\x42\xfe\xf3\x23\x09\x63\x0c\x68\x41\x19\xe1\xbb\xfc\x08\x95\x0a\x5a\x7b\x90\xd6\x08\x6b\xdc\xe7\x90\x2b\x4c\x31\xc5\xcb\x71\xea\xf2\x33\xf0\x09\xef\xd5\x2e\xf7\xde\xbb\x3b\xf6\x5d\xe4\x3d\xfd\xf9\xf3\x97\xf7\x7f\x0f\x1e\x13\xef\x1f\xc0\x25\x6c\x05\xde\xfb\xfb\xef\xde\xad\xc5\x01\xdf\x9d\x61\x0c\x82\x01\x94\x53\x0a\x13\x9d\x0a\x66\x87\xf9\x60\x63\x65\x14\x18\x44\x96\x53\x2c\x32\x94\x63\xc1\x31\xa2\x1c\xc2\x74\x97\x1f\x3b\x9b\xd9\x0a\x12\x28\x19\x30\x7e\xec\x17\x47\x63\x63\x3b\xad\x10\x43\x8d\x6d\x52\x3b\x1e\xec\x68\x7b\x38\xb4\x63\x83\x40\x08\xb2\xbe\xc9\x84\xaa\xbc\xfd\xa6\xf4\xca\x7d\xf1\xfb\xc7\xe8\xdd\x2b\xdc\x64\x3c\x87\x44\xbe\x20\xc6\xae\x4f\x28\x30\x61\x14\x30\x41\x29\x65\xbf\x32\x48\x06\x13\xca\x31\x67\x02\xad\x58\xa0\x70\x6f\x76\xf0\x0f\xc9\xe0\x99\x67\xd2\x15\x17\xcb\xe2\xf2\x24\xbc\x9c\xd8\xe0\xc7\x7d\xc5\xab\x6e\x07\x9f\xa1\x52\x9b\xd6\x76\x95\x4d\x2a\x1b\xbb\xcf\x82\x54\x42\x11\xc3\xb4\x2a\xd9\x45\x06\xf9\xc7\x64\xd8\x4d\xea\x59\x6a\x73\xc5\x76\x39\x3f\xb9\x28\x06\xd6\xfa\x79\x5f\xf1\xb2\xdd\xc1\xe7\x5c\xeb\x4d\xb3\xa8\xc0\xac\xb4\xa9\xfb\x5b\xd0\x4a\x68\x62\xb8\x92\xc6\xc9\x00\xcf\x32\xbc\xe0\xc2\xff\x83\xf7\x2f\xaf\x51\xc7\x57\x4d\x7b\x7f\x49\xe6\x5d\xf3\x57\xfa\x4d\xfa\xdc\x1b\xff\xe0\xb8\x5f\xdc\x63\xdb\x2d\xfa\xa5\x06\x0d\x35\xb6\x41\x20\xf2\xd5\xd8\xf0\x66\xd8\xc1\xe7\xce\x3f\xb8\xa6\x93\xca\x26\x3a\x66\x85\x70\x9c\xcf\xeb\x18\x6c\x3c\x97\x9f\xae\x5c\xd6\xfc\x9f\xce\x31\xe1\xff\x74\x53\xeb\xbf\xfc\xf1\x9d\x3e\x7b\xff\xe7\xcf\xef\x5e\x61\x0d\xdc\x64\x4e\x5e\xe0\x4e\xef\xf7\xff\xf1\xe3\x16\x99\x28\x01\xe5\x5c\xaf\x97\xf3\x90\xf0\x8c\xc7\x55\x1a\x47\xb3\x28\x92\x14\x54\x16\xbb\x87\xc3\x98\xc6\xb9\x45\x2c\x85\x2c\x07\x55\x16\xb1\x28\x83\x19\x4f\x77\x2a\xc1\xf9\x5c\x2c\x4a\x3f\xec\x22\x19\x52\xc0\x36\x39\xb1\x95\xb4\x5a\x1e\x47\xa1\x12\x25\xa2\x74\x2c\xf3\xa6\xd2\x26\x29\x74\x68\xea\xb0\x95\xeb\xf9\x85\x4f\xf9\x26\xdf\x11\xef\x6f\xbc\x7f\xe3\xfd\xd9\xfb\xec\xfa\x71\xde\x6d\x67\x82\x88\xa7\x57\x5e\xe3\xa7\xfb\xc7\xdd\x57\x8e\xf0\xa7\x4f\x0e\xcd\xc9\x81\xe0\x20\xae\x58\x80\xb5\xcb\x3a\x8a\x0b\x6d\x0c\x62\x58\xe6\x44\x4f\x3a\x05\x44\xd9\x51\x21\xd8\x2a\xdb\xb7\x05\xe8\x56\x1e\xb3\x4d\x65\xd5\xdc\x5b\x84\x41\xe5\x7b\x81\x67\x09\x48\x4b\x3b\x72\x2e\xb4\xac\x53\x23\x84\x4a\x66\x92\x23\x3f\x4b\x39\x95\x42\xcf\x58\xeb\x49\x29\x6f\xb7\xc1\x67\x9d\xbf\xde\x93\xfe\x77\xef\x8b\xf7\x9f\xdf\x9c\x81\xe5\x44\xf9\xb2\x5f\x55\x85\x83\x7d\xd8\xdf\x3f\x7c\x72\xb4\x13\x37\x53\xf1\x65\x9d\x04\x59\xc4\x09\x60\x73\xe7\x26\x41\x46\x98\x67\x2c\x16\x59\x1c\x87\x28\xc3\x34\xcf\xc2\x59\x97\x29\x5e\xd1\x49\x6a\x14\xb3\x18\xda\x03\x8b\x30\xcd\x0f\x09\x0f\x77\x22\x41\x70\x2e\xb8\xe0\x36\x9e\x62\x15\x43\x9c\x94\x32\xe5\x92\x95\x9b\x0c\xb7\x52\x4e\x52\x1e\xa7\xa2\x48\x2a\x13\xc5\x5d\x0d\xeb\xb2\x6c\xa2\xc1\xc5\x79\x76\x9e\x3e\xa1\x4d\xb6\xc3\xde\xdf\x7b\xdf\x79\x3f\x5c\x79\x33\x5e\xc7\xed\x97\x23\xf9\xdd\xa7\xc7\xfb\xc0\x65\xa6\xbd\x3b\xa3\xdb\x6c\x32\x42\xe2\x24\x4d\xe3\xdc\x0e\x46\x29\xa5\x06\x3b\x2e\x97\x1e\xa5\x76\xf8\xe7\x9e\xb1\x50\x87\x2c\x48\xfc\x61\xb9\x3f\x64\xc5\x72\x27\x4d\x9e\xfb\x7d\xb8\xfe\xd3\xb5\x5d\x3a\x3f\x02\xf1\xb6\x6e\x05\x5c\xdb\x76\x8d\x5c\x11\xfc\x5f\x4b\x72\x2e\x41\x08\xca\x59\x6b\x0d\x3a\x97\x6b\x97\xed\x32\x4a\xb9\x49\x4b\x96\xcf\xaa\xb8\xe2\xdc\x92\x39\x7f\xae\xf6\x91\x1d\xb4\xa5\x1a\xe8\x9f\x47\xce\xa3\x22\xe2\x01\xf4\x2b\x3b\x39\x00\x7d\xcf\xdb\x05\xc4\xc9\x80\xcf\x32\x5c\x10\xf8\x5e\x75\x14\xdc\xdd\xef\x77\x8f\xff\x01\x3c\x7d\x5c\xa4\xf8\x7c\x3b\x22\x5b\x68\x2b\xad\x9b\xa6\x69\x02\x19\xc7\xe2\x90\x64\xa1\xce\xe2\xd4\x56\xee\xdd\x0e\x1f\xdb\x63\xb6\x0f\x6d\xd9\xcd\x7d\x0f\xfa\x9f\x87\x0c\x93\xd0\x84\x51\x18\x11\xbf\x0e\xa0\x2d\x1c\x51\xa6\xe3\x32\xf0\x1c\x77\xca\x65\x2c\xd6\xdd\x7d\x96\xe3\xfd\xcd\x58\xb8\xfc\xbc\x45\x82\xf7\xe7\x91\xd8\x86\x8e\x7c\xef\x02\xa9\xe7\x11\x5c\x24\x05\xb4\xec\xea\x6a\xde\x91\xb9\x7c\x46\xfb\xc8\x29\x77\x40\x7f\xae\x28\x51\x24\xe8\x7d\x3c\x09\x5b\x2c\x77\xa9\x75\x1e\xc8\xe6\xf0\x47\xe6\xa1\x98\x8d\xd6\x57\x9c\x92\x84\x10\xaa\x13\x43\xe0\x6c\x8a\xcb\xcb\xcd\x61\x56\xc7\x76\x5b\x9d\x3c\x69\xa5\x02\xe2\x39\x61\x34\xd2\x11\xf5\x73\x5f\xac\xef\x94\xe7\x85\x9e\x72\xfc\x0a\xd3\x55\xb3\xff\x93\xf3\x40\x3c\x5d\x6f\x94\x6b\x45\xc6\xd2\xe1\x5b\xde\xae\x6f\x39\x31\xdd\xad\x5d\xed\xc6\xb9\x01\xc3\xcf\x1d\x18\xe6\x76\x13\xdb\xda\x26\x0e\x65\xcb\xa5\x5f\xa3\x5f\x1c\x4f\x5f\x90\x1e\x7b\x73\xec\x83\x74\xd6\x7a\x93\x3f\x37\xee\x99\x24\x5e\x0e\x48\x8c\x31\x6e\x97\x0f\x6c\x47\x1b\x63\xa5\xb5\xc2\x20\xcb\x0f\x68\xcd\xe7\xe4\x9b\x69\x2f\x77\xda\xbb\x73\x75\x2b\xe7\x70\xc8\xb2\xa3\x1f\xf7\x17\xda\xdd\x87\xfb\x07\xf7\xc2\xdd\xe6\x89\x8a\x42\x3f\xb2\x53\x12\xeb\x14\x6a\x98\xe4\xa2\x0c\xa4\x09\x23\x9f\xd9\x26\xd7\x59\x5e\x23\x4a\xcd\x4e\xa7\x49\x22\x93\x84\x60\x84\x33\x48\x75\x91\x24\xb1\xcc\x09\x46\x3c\xe7\x62\xdd\xab\x8d\x9b\xa7\xea\x37\xd6\xc8\x7e\xf7\xf8\xd5\x1a\x09\x8a\xb9\xd2\x1a\x34\x36\x5f\x9e\x5d\x88\xe2\x29\x29\xe1\xac\xae\x74\x31\x9b\x6a\x6e\x8e\xfd\x96\x0d\xc4\x76\x04\xd0\x67\x2a\xb3\x58\x33\x3f\xf3\x73\xf7\x86\x78\x3b\x6f\x38\xe5\xfb\x6c\x53\xff\x45\x3d\x71\x69\xef\xb5\x48\xfb\x8c\x10\x22\x53\x45\xe0\x5c\x6b\x67\xe8\xd6\x16\xd9\x6e\x6e\x8d\xb9\xa0\x2d\x6d\xea\x67\x4c\x9d\xc2\xf0\x73\x3f\x1f\xa9\x6d\x19\x03\xf5\xdc\x1e\xbb\x2d\x1b\xae\x9c\x2c\x2e\xaf\x4c\xec\xd0\xb9\xff\x67\x8f\xc3\xb7\x7b\xe4\x92\x1c\xf5\x22\xd0\xa6\xb7\x4c\xeb\x35\xf7\xdc\x1e\x36\x10\x21\x24\x92\x3a\xb5\x44\xaf\xb0\xe2\x76\xdc\xa1\xb9\x7d\xce\xf6\xe1\xd2\x1a\x05\xe4\xe7\x02\xe1\x50\xa6\x9b\xc8\x87\xee\x0d\x75\xed\x73\xd7\x3e\x7e\x6b\x9f\x7c\xdd\xfe\x57\x23\xb2\x69\x6c\xae\xf5\x05\xec\x70\x23\x08\xce\xf2\x14\xa7\xd0\x42\x7d\x01\x7d\xdc\xe1\x79\x7c\x8e\xf7\x5e\xc7\x16\xdb\x1a\xfe\xdc\xac\x03\xb2\xf1\xfc\xa8\x63\xcb\x80\xac\x63\x90\x39\x0c\x70\xf4\x47\xe6\x01\x63\x82\x45\x2c\x10\xb4\x48\x5d\x44\xb1\x83\xc5\x5a\x5f\xc0\x26\x77\xe8\xe7\x12\x93\x50\x86\x78\x13\xf9\xc9\xc0\x6c\xc7\x18\x28\xe7\xe1\x39\xd9\x7b\xee\x5f\xab\x0c\x2b\xc7\xcb\x9b\xe3\xf0\x1b\xfa\x62\x53\x58\x5a\x14\x57\x6d\xc5\x09\xa1\x32\xd5\x04\xda\x7c\x25\x24\x4b\x6d\xbf\xc3\xe7\x73\xc2\x59\x82\xa0\x5a\xf4\x76\x58\x84\x3c\x08\xfd\x61\x7d\x57\x2d\x32\x90\x53\x7e\xa3\xb7\x5f\xad\x85\xaf\x65\x78\xff\x5a\x04\x6d\xb1\x52\x97\x1e\x6f\x14\x42\x58\x25\x5d\xfa\x7a\x26\xd4\x33\xdb\x47\x27\x4f\x2c\x2a\x53\xfc\x5c\x60\x1c\xaa\x30\x0b\xba\x45\x63\x2d\xef\xd6\xfd\xe8\xee\x7e\xbf\x36\x0e\xd7\xb3\xe3\xcd\x93\x74\x1b\xda\xa2\x28\xda\xb6\x6d\x83\x96\x10\xa2\x12\x8d\xa1\x2d\xcc\xf2\xe2\xda\xff\xde\x2c\xa3\x52\xff\x3c\x30\x1e\x9a\x90\x07\xd1\x72\x94\x2e\xef\xcc\xd2\x7f\xed\x7c\xc9\x7f\xa4\xed\x4d\x65\x85\x31\xd3\x34\x4d\x1b\x48\x08\x2b\x92\x82\x41\x2b\xdc\x8b\xdf\xd5\x76\x10\x48\x87\xc3\x9a\x3a\x0b\x38\xbd\x45\x69\x74\x05\x4e\x7b\x67\xb1\xdd\xfa\xdf\xde\x3d\x7e\x7a\xfa\xb4\xff\x98\xec\xa9\x9e\x73\xad\xfd\x66\xce\xfd\x1c\x31\x31\x4d\x86\x51\x8c\x15\xa4\x4c\xd1\xe1\x50\x65\xc0\xdb\xa5\x3f\xa7\x8c\xed\xfa\x5f\x92\x2d\xc6\x32\x4d\x0a\x15\x97\xa5\x2a\xe5\x3c\x00\x6d\xa4\xaa\x00\x54\x2a\xd2\xe7\x18\x04\x3f\xdf\x05\xfe\xdd\x1b\x32\x2c\xa7\xc2\x2b\x19\x3e\xad\x2c\x57\xc9\x9e\xeb\xe3\xa0\x75\x90\x1c\x07\x9f\x63\x26\x17\x8d\x50\x0a\x42\x99\x26\x8c\x95\x72\x51\x11\x75\x06\xc2\x1d\xfc\x39\x12\x62\x37\xfd\x12\x6d\x29\x56\x71\xdc\xaa\xb4\xae\x64\x21\x6d\x06\x64\xc9\x64\x01\xe2\x58\xd5\xd1\x8a\x01\x5e\x9f\xf2\x3d\xda\x54\x4e\x96\x7f\x72\xb7\x81\x1b\x69\xde\x5f\xa3\xda\x77\x0f\x77\x4f\xeb\x19\xb5\x47\xe6\x58\x16\x45\x40\x8e\x25\x74\x89\x72\xb6\x1f\x67\x3d\xd9\xbe\x5b\x2e\x67\x9b\xea\x17\x4d\xe9\x96\x3f\x8b\x8d\x57\x3b\x1e\xc4\x1c\x34\xca\xe6\x95\xe7\x05\xde\x78\x42\xfb\x78\x43\xbd\xfd\xb7\x2d\xdd\xdf\x9c\x94\xd7\xac\xae\xb8\x78\x8e\x8a\x62\x33\xcd\xbd\xf3\x8d\xc1\xe3\x08\x72\x4b\x40\x39\xf7\x40\x2c\xb7\xb0\x0d\xfd\x65\xa4\x74\x1b\x3f\x0f\x81\x92\x5a\x2e\xfa\x58\x6a\x39\x13\x7d\xae\x81\xe2\xe7\x79\xfe\xa6\xb5\x77\xdf\xf4\xeb\xee\x61\xcf\xcd\xec\x19\x13\x78\xb3\x97\x81\xd0\x21\x85\xf6\x73\xd3\xdb\x43\xe3\xb4\x4b\xfa\x73\xc2\xd8\x6e\xf8\x25\xde\x12\xdb\x0d\x83\x1a\xe6\xde\x4f\x87\x59\x82\x64\x8d\x77\x87\x7f\xa0\xbd\x63\x6b\x4c\x00\x8f\x2d\x04\x89\x53\xe6\xc3\x5c\x8e\x76\x58\xf7\xf1\x6f\xb4\xe7\xf0\x41\xc8\x6f\xb6\x77\x1e\x51\xd7\x1e\x31\xc7\xcc\x98\xa0\x3b\x66\x08\x60\x97\xba\x07\x22\xe7\xb9\xab\x7a\xa0\x2d\x77\xab\x97\x9f\x5b\xec\xfb\x5e\xbb\x12\x88\x7e\x56\x20\xf2\x3c\x3f\xc0\xa7\x6c\xaf\x83\xd6\xdb\xaf\xe7\xf6\x5a\xe8\xb1\x7d\x8a\xf6\xdf\xef\x9f\xee\xbe\xbf\x38\x1d\xfe\xf4\xd3\x7f\x06\xfe\xf6\xe3\x7f\xf1\x77\x53\x61\xbd\x02\x60\x13\x86\x12\x8b\x34\xd4\x11\xe9\x0c\x22\x56\xd3\xba\x81\x41\x3b\x47\x8e\xfc\x6b\x1a\x6d\x1f\x22\x64\x0f\x79\xc6\xb2\x02\xe7\x64\xb2\x83\x12\x79\xe5\x72\x08\x80\x27\x4f\x2c\x10\xc1\xe8\xfd\xcf\x9e\xf7\x61\xe7\x9c\x50\x9f\x2e\x20\x6c\xcb\x36\x7d\xb8\x7f\xd8\xb9\x7d\xe2\x27\xac\x11\x20\x5a\x54\x60\xbe\x18\x8e\xfa\x70\x00\x91\x1d\x43\xa3\x05\xed\x06\x45\x1b\x10\x69\xa3\x8d\xd1\x46\x27\x31\x53\x92\x7b\x81\xc3\x19\x2f\x76\x99\xb7\x77\x35\x86\xd7\x1e\x81\xa7\xe8\x6f\xc1\xfe\xe3\xe7\x7f\x04\xef\x9f\x1c\x95\x83\xbb\xbc\xed\x1e\xff\xf4\xd3\xa7\x7d\xec\xba\x94\x15\xa8\x2b\xa8\xaa\x61\x69\xe2\x1c\x27\xa1\x8a\xd2\xa4\x2c\xd1\x2e\x7b\x2e\xd7\x4c\x0d\xdb\xcc\xdc\x6a\x5b\x51\x49\x40\x0c\x68\x61\x61\x92\xc0\x3a\x1d\x61\x96\x93\x97\xba\xe5\xcb\xfe\xff\x17\xc7\x2d\x7b\x3b\x77\x4f\x77\x2e\x35\x63\x79\x71\x7f\x86\xbc\x3c\x47\x59\xb8\x99\x73\x63\x16\x15\x04\x87\xba\xee\x7c\xd8\xd7\xf5\x38\x97\x60\xc8\x53\x9e\xe4\xd7\x5d\x1f\x6f\xc9\xf3\x00\x88\x3e\x68\x7d\xd0\xb6\x54\xc0\x60\x92\x93\xd5\x57\xed\x71\xc7\x5f\x7d\xc9\xcb\xf8\xaf\xde\x7f\x77\x7e\xd7\x0b\xb2\xdd\xc3\x8a\x6e\x77\x4b\x0a\xbb\xd6\x01\xee\xef\x9f\x3e\x39\x6b\xf1\x06\x99\xeb\xcb\x4f\x2e\x72\xfe\xf0\xee\xf3\x97\x87\x7d\x0b\x62\x07\xb9\xe8\xcc\x22\xcc\x98\xad\xb4\xb3\x4e\x34\xe0\x76\x04\x65\xd3\x34\x56\x9b\x38\x02\x3a\x69\x04\x23\xac\x34\x03\x6d\x04\x13\x79\x56\x03\xaf\x95\x99\x1d\xd1\xd6\x13\x4a\x08\x25\x46\x35\x66\x99\xe0\x8a\x3b\x8a\x2c\xdb\x46\x30\x9b\x4a\x98\x2b\x44\x68\xae\x53\x98\x42\x4a\x95\x2d\x19\x93\xe7\xba\x1c\xb8\x69\x76\xe2\x7c\x8a\x9e\x71\x65\x5e\xf7\xe5\xd3\xcd\x9f\x6b\x4d\xe3\xfb\xfd\xc3\xfd\xa5\x2f\xdb\xd7\x7d\xd9\xed\x39\xd0\x85\x73\x7d\xb3\xba\x3e\xb6\x60\x25\x73\x59\x7a\xc3\xfd\xac\xeb\x3a\xab\x75\x06\x6a\xa6\x94\x24\xa2\x6d\x6d\x9b\x0d\x25\x57\x39\x1c\x01\xec\x24\xb6\x55\x9a\x6e\x0f\x52\x2a\x7d\x50\x07\x29\x94\x90\xda\x4e\x17\x38\xd7\x88\x2b\xc3\x61\xae\x30\xe1\x48\x66\x38\x85\x84\x2a\x5b\x51\x86\x32\xcf\xdb\xfa\xc5\x29\x71\x77\xf3\x4b\x5f\xfe\xdb\x2b\x7f\xe7\xd3\xfd\xe3\xdd\x57\x7d\x39\x17\xcc\x2d\x7d\x79\x5c\x3b\xe3\x68\x11\xbe\x7c\x70\x95\x48\x6b\x5f\x7e\x08\x42\xd0\x18\x3f\x99\x07\x50\x4b\x79\x84\x40\xd8\x04\x0c\x8e\x31\x35\xf7\xc9\xd9\x86\x8c\x4c\xe2\x17\x7d\x2e\xba\x9a\x96\x76\x5a\x53\x30\x68\x6b\x7b\x61\x47\x40\xe3\x49\x66\xb6\x48\x53\xb9\xf3\x96\xf9\xb1\x93\xb4\x07\x25\xa5\x52\xe2\xe4\x29\x65\x0f\x52\xda\x3e\x42\xaa\x64\x98\x68\xc6\x55\xa6\x52\xcc\x6b\x95\x59\x41\x39\xca\x52\x87\xa9\x06\x1d\xee\xdb\x5a\x8f\xfa\xdf\xbe\x9d\xa1\x35\x61\xea\x7e\x73\xe9\xc0\xff\x06\x5c\x52\xd0\x39\x99\xed\xf2\x67\x7b\xf6\x40\x80\xfd\xf6\xf3\x97\x83\x5f\x17\xee\x30\x66\x6d\x7b\x6c\xb3\x4d\x6a\x29\x62\x20\x3a\xd0\xd1\x2a\xdb\xce\x3d\x02\x19\x10\x96\xe4\x99\x25\xbe\x97\xc4\x56\xf8\xdc\x5d\x98\x0a\x9f\xce\x28\x20\xeb\xf5\xfb\xd8\x41\x50\x88\x7c\x33\x60\xac\xf0\x28\x07\xac\x28\x0a\x33\xa8\x10\x96\xa9\x88\x11\x46\xb9\x4a\x53\x45\x24\x55\xb8\xa7\x74\x20\xc4\x22\x88\x32\xbc\xec\x61\x76\x8e\x97\x7d\x55\xc3\xf9\x32\x53\x2f\x73\xf2\xd1\x05\x59\x3e\xb8\xf5\xf5\xe5\xf1\xeb\x19\x74\x3d\xda\x2d\x5d\x0a\x34\x50\xeb\x25\xc3\x50\x6a\xa3\xd4\xd1\xfc\x97\x05\x55\x7d\x63\x35\x02\x51\x65\x6b\x98\x0d\x20\xce\x46\x80\x5d\x6c\xba\x02\xd8\x0a\x3f\x3e\xdf\x0d\xf2\x24\x01\x21\x83\xcb\xda\x93\xea\xe4\xf1\x93\xa7\x64\xc5\x73\xa4\x10\x95\xa9\x8a\x88\xa0\x4c\x2a\xa1\xb8\x12\x6a\x99\xb7\x83\x52\xf3\x01\x43\x4a\x56\x3b\x40\x9f\xfb\xb3\xce\xd1\x7f\x7f\xc5\x45\xfb\x55\x7f\x3e\xb8\xfe\xfc\xf4\xf1\xad\x39\xba\xe9\xd1\x0f\xef\x3f\x7f\xf1\x07\xd0\x3a\xe8\x2e\xd0\x0b\x31\xb7\xd0\x3f\x0c\x88\xb5\x35\x2d\x4f\xde\x60\x11\x06\xa8\x2d\xdb\x3c\xb3\x3d\xe0\xc9\xb2\x10\x95\x63\x0e\x11\x40\x39\x12\x41\xe7\xef\x9d\xc7\x34\xab\x8c\x44\x6e\xed\xa9\xc3\x72\xed\xd6\xe5\xd2\x2b\x4c\x64\xaa\x23\x0c\x21\xa3\x3a\xcf\xa5\x14\x42\x2a\x7b\x10\x62\x92\x72\x9e\x10\xcc\x32\xa2\x3c\x6f\xeb\x74\xed\x25\x86\xf3\xd3\x99\x91\xe5\x36\x0e\x76\x36\xb3\xfc\x9b\x18\xce\x8a\x3f\x75\x03\x3f\x15\x94\xa0\x5a\xef\x7b\xdc\x8e\x62\x12\xad\x34\x66\xa0\xbd\x3c\x00\x61\xf1\x72\x38\xa7\x31\xcf\x01\xed\x95\x48\x33\x96\x6d\xdb\xaa\xd2\xd5\x4c\xa7\x5e\xf7\x87\x79\xf4\xb1\xad\x5a\xd9\x80\xd4\x2f\xaa\x19\x01\x9e\x31\x91\x0d\x74\xd1\x8b\x59\xaa\x28\xe4\xe7\x58\x58\x71\x8e\x85\xad\x5e\xb9\xdf\x8c\x85\xdd\x3d\x5c\x30\xb2\x1e\xce\x42\xb2\x00\x15\x01\x3a\xd6\xbe\xb2\x1e\x48\x40\x49\x2d\xb4\xfd\x39\x1e\x56\x83\xd0\xc5\xc3\x6a\x40\xc0\x64\xa3\x81\x60\x8e\x98\x9f\x82\xe9\xa0\x31\x52\x64\x23\xe5\x62\x37\x55\x35\xa9\x97\x8b\x26\x01\xe5\xc9\x33\x46\xd4\x3e\x96\x73\x0d\xf2\x18\x53\x42\x08\x5f\x66\x23\xce\x25\xce\xd9\xa2\xab\x86\x9b\x78\xf1\x59\xe6\x37\x63\x47\x37\xb1\x99\x17\x99\xaf\x03\x8b\xc0\xb0\x7a\x60\xb4\xed\x15\xf0\xf8\x68\x74\xb5\x5c\x62\xc3\xf2\xe4\x01\x63\x93\x61\x31\xc3\x74\x16\xf3\x24\x05\xfc\xa0\x45\x0a\x79\xbe\x6d\xea\x5a\xd5\x33\x3f\x79\x83\x1a\x41\x34\xb7\x7e\x61\xf5\x28\x6b\x90\xfa\xba\x9e\x73\x20\x33\x2e\xa0\x64\xcc\x4a\x20\xe1\x3a\xc4\xde\xd6\xe5\xf4\xfe\x05\x79\x7f\xf8\x8b\xf2\x5e\xc6\x38\x88\x2f\x31\xee\xd2\xb6\x1a\x84\xe2\x60\x4c\xbd\x5c\x79\xe3\xca\x4e\xa0\xb4\xd1\xb8\xec\x45\x93\xa5\x32\xc9\x80\x04\xa1\x59\x04\x86\x97\x05\x71\xe8\xf5\x2a\xaf\xb6\x66\x50\x15\x48\xce\x2b\x02\x52\x01\x25\x65\x37\x4b\xc2\xdb\x82\xfe\x9c\xc3\xfe\xcf\xe7\x4a\xb4\x3f\xbf\x1d\xbf\x7d\x7c\x11\xf8\xad\x45\xe1\x13\x1f\x69\x1f\xce\x2d\x18\x6d\x51\x00\x28\x6c\xdf\xe8\xb8\xb7\x86\x83\xbc\xb3\x1d\x18\xe7\x1a\x38\x10\xf7\x32\x4f\x45\x9a\x83\x12\xa0\x52\xe6\x88\xe3\x1b\x99\x0f\x60\xd1\x9a\x85\x55\xb7\x32\xa7\x4c\x42\xc9\xe8\x2b\x99\x1d\x6e\x43\xf5\x17\xc6\xf8\xfd\x75\x8c\xbf\xda\x6b\xaf\xd6\x84\x04\xcd\x1a\x53\x54\xb6\x53\x07\xd1\x69\x53\xd9\x89\x1d\x8a\x03\x50\x36\xef\xa6\x49\x65\x09\x4f\x32\xc0\x27\xc9\x53\xc8\xe0\xed\x76\x03\xde\x3c\xf8\xd2\xea\x46\xbe\x48\xba\xec\x37\xf1\x5a\xd2\xc5\xb6\xa4\xa7\x43\x90\xee\x3c\xef\x87\xd5\x4b\xe7\x74\xf6\x8a\x43\xf7\xf9\xcb\x62\x80\xdd\x3d\x08\xbf\xb2\xd3\x34\x11\x9c\x9c\x3c\xdb\xe4\x5a\x4d\xd3\xc9\xdb\x79\xc6\x62\x63\xe3\x24\x35\x8a\x55\x69\xe6\x27\x06\x38\x7e\x33\xef\x24\xf6\x66\x87\x6e\x59\x25\x3e\xad\x6c\x66\x37\x7f\x2e\x5a\xf2\x7e\xc5\x8d\xbd\x64\x95\x99\x04\x84\x56\x06\xd2\xae\x15\xf9\xcc\x1a\xd0\x3c\x37\x60\x58\x21\xae\x61\xae\x54\xeb\xe3\xb9\x5a\x9e\x00\x67\xa2\xf5\xfb\x39\x6d\x55\xab\x1a\x63\x1a\xd5\x86\x8a\xb2\xce\xaf\x4a\x0b\x0b\x2f\xf0\xd3\x93\xd8\xf3\xdf\x2b\xc7\xfe\x95\x1c\x9e\x4a\x00\xb6\x70\x13\x59\xe2\x9c\x6b\xb5\x45\x7e\xfc\x1c\xfa\xb9\x8b\xa2\x88\x30\xc3\xd2\xb4\x17\x72\xdb\x00\xa6\xb4\x5e\x7e\xd4\xba\xd1\x8b\x20\xba\x09\x25\x65\x95\xdf\x16\x36\x5f\x73\xb2\x9c\x5f\x98\xfd\xaa\x9d\xfb\xe0\xec\x5c\xe7\xf5\x5c\x4f\x98\xab\x9d\xcb\xae\x37\x23\x04\xa2\x61\x38\x79\xbe\x3a\x79\xc3\x00\xa2\x99\xf8\x09\xca\x44\x8a\x7e\xdd\xd6\x2d\x30\xcd\xd7\x1c\x83\xe5\x6e\xbb\xdc\x91\x2e\xfc\xb2\x5f\x5e\xb2\xd6\xfc\x97\xac\xb5\x87\xd7\x99\x6a\xe0\xfd\x6e\x7b\x7f\xb6\xfb\xff\x1e\x3c\xfc\xe9\xa7\x4f\x77\x4f\xf7\x9f\x03\x1e\x88\xb9\x4c\xd2\x20\x92\x55\x8a\x12\x96\xe2\x38\x99\x53\x44\x45\xc7\xa4\xb9\x40\x7f\x83\x92\x8c\x76\xc8\x45\x87\x22\x1d\x0b\xdb\x0f\x4c\x8f\xbb\x7c\x26\x08\xce\xd0\x1e\x22\x13\x11\x0d\x1a\x8a\x85\xae\x81\x91\x56\xc8\xb9\x14\x8a\xc4\x49\x92\xb1\xb4\xc4\x39\x01\x54\x62\x6f\xe3\xa3\x3f\x22\xf3\xc6\xc9\x9c\xdc\xca\xfc\x63\x10\x07\xed\xcc\xd2\x34\xa0\xaa\xc9\xf2\x94\xa7\x2c\x4e\x8f\x2d\xe1\x7c\x14\xda\xf8\xe6\xcc\x0f\x3e\x52\x3b\xd9\x06\x29\xe0\xa1\x58\x27\xd2\x56\x13\xd7\x20\x3a\x8b\x9d\xdb\x29\x32\x11\x55\xbf\x26\x76\x41\xce\x62\x7b\x7b\x3f\x3f\xc9\x7d\xb1\x4b\x5f\xf1\x19\xff\xcb\xd7\x8c\xc6\xe7\x58\xe7\x0d\x47\x67\x90\xbd\x66\x50\x46\xfa\x97\xc2\x98\xb2\x04\xd0\xa5\x2f\x15\xbb\xf4\xd8\x82\xb1\x99\xc7\xd6\xc6\x73\xa5\xf5\xb2\x07\x2e\xce\x60\xd0\x78\x7b\x8f\x9d\xd8\xce\x0b\xe4\xef\x6b\xf7\x86\x33\x36\x0b\xa6\x63\xa4\x2f\x70\x75\x41\x69\x7e\x61\x42\xb7\x2d\xc0\xeb\x13\xc8\x79\x00\x08\xdb\x91\xd8\xce\x0e\x52\x82\xc4\x0e\x45\xe1\x92\xa5\xf6\xa0\x39\xd1\x7d\xf9\x15\x27\xf5\xef\xe8\xab\xdf\xbc\x82\xc9\x0b\x3a\xf9\x4b\x5c\x38\xc8\xa7\xf5\xd9\x8c\x33\x02\x85\xd3\x2f\xc2\xa6\x7a\x65\x3d\xbc\x32\x68\x39\x1c\xea\x3a\x88\x36\x8d\xf3\x9d\x7a\xe0\xbd\xbf\xbf\x28\xac\x0b\x77\xcf\xe7\x2f\xcb\xd7\xf6\xe3\x8f\xbe\xd4\x4d\x5b\xe9\x74\xd1\x5c\x69\xa1\xa5\x4a\x2a\x6e\x98\xe6\x04\xe2\xd8\x95\xf4\xe6\x41\x0f\x6d\x53\xa5\x50\xb0\x5c\xaa\x26\x89\x54\x09\xc2\x6c\xd0\x61\x84\x67\x2a\x29\x36\xb9\xb7\xf7\x9b\x65\x4e\x37\xfa\xaf\x9e\x53\x19\xd0\x63\xa1\x2f\x44\x34\x41\xc2\x9f\x13\x6e\x5c\x9d\x98\x7b\x36\x7a\xae\x00\xe3\xb6\xe0\xb6\xb0\x99\x10\xce\x16\x7f\xe9\xe7\xde\xef\xfe\xe0\x5a\x72\xf9\x40\xc6\x21\xc5\x2e\xcf\x24\x9e\x33\x69\xa4\x04\xf1\xca\x59\xfc\x5b\x6b\x29\x08\xff\x60\xbb\x5d\x10\x1f\x47\xf3\xc2\x6e\xce\x9f\x99\x30\x42\x80\x70\x7d\x7e\xb3\xdd\xfa\xa4\xfe\x9a\x76\x2f\xcf\x06\x2f\x17\x20\x73\x21\x4a\xf1\x19\x3e\xc6\x48\x53\x3a\xba\xbf\xaf\x5b\x55\xca\xb5\x7a\x8e\x6b\x81\xd6\x9d\x81\xec\x84\x02\xb6\x13\xde\x4f\xaf\xf1\x8b\x5e\xa3\x16\x9d\xa1\x34\x1c\x82\xe4\x83\x00\x9e\x71\xc1\xb9\xe5\xca\x41\x10\x4e\x71\x82\x93\xb4\x31\x76\x02\x51\xdf\x9f\xbc\xad\x9a\x26\x3d\xea\xc9\x42\x42\x62\x1d\x65\x20\x99\x91\x5f\xeb\x49\x8f\xcb\x19\xd9\x39\x1c\x4b\x71\x45\x20\x7e\x72\x7c\x9f\xae\x02\xf0\xdd\x25\x93\x7d\x79\x15\x9c\x07\x76\xcb\xcd\x72\x09\x58\xae\x9e\x1c\xab\x38\xb1\x95\x65\xc9\xd0\x2c\x86\x68\x59\x96\x20\x2f\x8a\x9d\xb0\xc5\x71\xb2\x38\xa1\x38\xef\xed\x01\x11\x42\x60\x91\x24\xa0\x0d\xa2\x59\xae\x89\xce\x1e\xd8\xac\x78\x61\xc8\x9d\x40\x37\xd1\xed\x87\xbb\xaf\x90\x73\x57\x76\x8f\xbb\xc7\xbb\x7d\x1e\x12\x46\x58\xcc\x68\x1c\x87\x16\xfa\x65\xd2\x70\xc3\x15\x13\x1a\x2b\x26\xa9\xc4\x5c\xc4\x36\x34\x3b\x64\x69\x1b\x9b\x18\x4f\x73\x65\x89\x1d\x38\x55\x54\x28\xac\xb0\x28\x0f\x64\x30\xdd\x74\x14\xbb\x83\xe7\x3b\x5f\x64\xe1\xfa\xfd\xcf\x17\xec\x92\x95\x4f\xe7\x7e\xb1\x93\xbd\xc0\x55\x79\x3c\x7c\xb8\x7b\xbc\xfb\x7e\x1f\x70\xa0\x6c\x0b\x60\x01\x84\xb2\x50\x83\x5c\xd8\x4e\x73\xdb\x29\x80\x91\x35\x81\xd7\x87\xfe\xb8\xdc\x46\x90\xad\xe7\xba\xb0\xac\x33\xc0\x5b\x66\xff\xe4\x71\x90\x00\x5e\x80\xca\xd6\x19\x5c\x39\x2e\x1d\x6f\xcc\xce\x3b\x73\x5c\x7e\x4b\xa7\xe0\x68\x25\xda\x80\xd9\xca\x25\x01\x53\xce\x12\xce\x53\xb7\x30\xd5\xce\x33\xf3\xc1\xcc\x58\x90\xc4\x24\xd4\x57\xc6\x0f\x97\xff\xcf\x4d\x74\xca\xf7\xcd\x4e\xb8\xca\xba\x7f\xf4\xdf\xef\xfd\xc0\x0f\x3e\x7e\xf7\xce\xff\xb8\x55\xbc\x2c\x05\x3f\x28\xd3\x91\xbe\xca\xc9\x4e\xd8\xe1\xc8\x2d\x17\x12\x78\xfe\x38\x1b\x2b\x35\xd0\xfe\x00\xc2\xc1\xc9\x36\x9d\xed\xdb\xbf\x5b\xf1\x15\x2e\x7c\xa5\xc1\x04\xb4\x01\xc2\x2a\x63\xf9\x26\xf4\xf9\xac\xf5\x73\xb7\xc9\x56\x4c\x1e\x75\xc2\x7b\xb4\x29\x2e\xfa\x6f\x39\x15\xf7\xbb\xd7\xc7\xe2\x77\xab\x39\xb9\x31\x3a\x49\x7c\x9a\x67\x35\x91\x49\x85\x50\x9c\xda\x08\x72\x55\x0f\x0e\x13\x76\x53\x64\x8c\xcc\x5e\x53\x24\x26\xc1\x85\x8f\x8b\x8a\x82\x78\xac\x5a\xdc\x3a\xbe\xc9\x00\x9e\xf0\x9e\x6c\xb8\x77\xef\x38\xf9\xdf\xbf\xd1\xcc\xe7\x73\x33\x54\x43\xbf\x40\xb0\xa5\x2a\x6d\x30\x49\xd2\xb9\x23\x5c\x36\x07\x43\x0d\xd1\x1b\x9e\xe9\x73\x23\xc4\xf8\xb8\x55\xf4\xd0\x96\x2d\x69\x6a\x17\x87\xad\x4e\x68\x9f\x6e\xf4\xb7\x7d\xd9\x5c\x1b\xf1\xb6\xce\x21\xe2\x68\x0c\x36\x26\x87\xad\x1e\x13\x90\x08\x12\xa7\xcf\xad\x32\x02\x44\xc0\x03\xe1\xc0\x87\x93\xb7\xd1\x19\x84\xc7\xb6\x2d\xb3\x22\x23\x85\x2f\x7b\x45\x81\xd7\xa8\x4a\x36\x6a\xdd\xe7\xf0\x5c\x57\xed\x81\xdd\xfe\xb2\xe1\x96\x55\xbf\x72\xe2\x7e\xf7\x0f\xc0\x55\xa1\xff\x23\x78\xbf\xdc\x2b\x3c\x3f\x40\x39\x92\x69\x2a\x38\x52\x19\x53\x48\xd5\xaa\x04\x06\x10\x49\x48\x28\x9b\x09\xa8\xdc\x6a\x8b\x9a\x6d\x19\x85\xbf\x34\x50\x30\x38\xd9\x21\x6f\x60\x96\x6f\x75\x64\xcb\x39\xb2\x31\x01\x8d\xdf\x83\x36\xa5\x2a\x8e\xac\x99\x51\x35\xc0\x02\x01\xea\x27\x6e\x7c\xb5\x57\xec\xd3\x9d\x38\xf7\xdd\xe5\xa4\x7d\x33\x99\xe0\xcc\x85\x4a\x84\x1c\x99\x49\x33\x3f\xcc\xb3\x0a\xd1\x44\xe5\x28\x4a\x2d\x93\x44\x63\xb9\xa9\x5a\xc3\x00\x04\x2a\x53\xe2\xd8\xb4\x45\x6c\x62\x56\xf9\xd4\xf6\xba\x24\xa5\x71\x6b\xc6\x2f\x4f\x87\xcd\xc1\xe1\xf6\xfc\xd3\xf5\xcc\xdc\x2d\x17\x90\x33\xf2\xea\xfe\x72\x64\x6e\x98\xae\x9b\x52\xa7\xa3\xed\x53\xad\xb8\x48\x34\xd5\x44\x95\x59\x19\x8f\x76\x84\x20\xdb\x66\xd0\xa2\x43\xe6\x0e\xcc\x0a\x78\x71\xa4\x07\xc0\x33\x5b\x77\x91\x38\x0a\xc5\x50\xe1\xf8\xe5\x82\xe1\xcc\xc3\x1f\x78\x7f\xe3\xfd\x4f\xde\xbd\xd3\x72\x8f\xe0\xbb\x77\x7b\xff\xe3\x87\xf7\xcb\x56\x01\xef\x97\xed\xbe\xe5\xc6\x00\x26\x17\x5d\x61\xa1\x46\x42\x0a\x9f\x9b\xc3\xdc\x62\x3f\xda\x89\x67\x11\x88\x93\x67\x3b\x08\xe0\x21\x83\x56\x9f\x3c\x04\x22\xdb\xc1\xb9\xb0\x07\x01\xd6\xbd\x9d\x5f\x6b\x80\x5f\xf6\xcf\xc3\xfd\x83\xbf\xff\xf1\xc3\x4f\x1f\xbf\x7c\x77\xd1\xa7\xeb\xf9\x11\x68\x20\x5d\x4d\x03\x18\xe7\xc6\x14\x20\x06\x59\x8e\x74\xc1\x8a\x38\xb1\xd2\x92\xac\x33\x56\x83\xce\xca\xad\x63\x41\x32\x96\x15\x16\xd7\x09\xd5\x0a\xd9\xde\x56\x88\x51\x96\x9a\x1e\x14\x05\x30\xe7\xb6\x2f\x5c\x2d\x97\x0c\x02\x7f\x7f\x96\xe1\xb6\xbe\xd3\x05\xcf\x1e\x3e\x6f\xaa\x22\x49\x7d\x3a\x73\x2a\x40\xe8\x30\xad\x17\xc3\xa6\x70\x27\x11\x4d\x15\x1d\x40\x92\xee\x44\x22\x98\x39\x79\xf5\x72\xdf\x37\x93\x59\xfe\x4b\x33\x99\x1a\x78\x46\xac\xfd\x75\x9c\x85\xdb\x83\x5b\x31\x4e\x8f\xbd\x5f\x8d\x74\xc7\xae\xba\x9c\x52\x11\xf8\xe8\xfd\x03\x78\x0c\x44\x30\xd8\x29\x0a\x13\x02\x23\x95\xb0\x42\xe2\xc1\x76\x12\xc4\xcd\xf6\xa0\x7f\xa9\xd3\x30\xc4\x1d\xb4\x07\x8e\xd8\x96\xce\x6c\xee\x6d\xc1\x00\x02\xbd\x6f\x96\xa3\xa1\x39\xe1\xbf\xd4\xc6\xc3\xb5\x8d\x6c\x93\xbe\x6e\xc3\xd6\xb6\x97\x20\x2a\xde\x68\x84\x2f\x8d\x50\x80\xc0\xe0\x6b\x0f\xf8\x93\xe3\xdc\xe5\xaf\xb9\xa3\xbf\x7b\xf7\xc2\x1d\xfd\xe5\x42\x1e\xed\xda\xbc\xe1\x8e\x86\x84\xa6\x24\xc6\x59\x1c\x87\x87\xa2\x23\x23\xe7\x2c\x0d\xcb\x14\x51\x5b\xb1\x51\x53\x54\x16\x5d\xb1\x39\xcc\xdc\x8e\x71\xe1\x0a\xe4\xd1\x1c\xfa\x6d\x7e\x9c\x60\x12\x86\xa4\xc2\x76\x4c\x52\x4c\x83\x24\xd1\x19\x68\x2d\xcb\xfd\xc4\x46\xeb\x1e\x39\x5c\xb1\xc2\xff\xf4\x0a\x2d\xff\xee\x7a\x11\x3a\xf7\xff\xfb\x95\xc0\x36\x40\xa0\x4c\xf2\x12\x27\xa0\x7c\x3e\x04\x69\x04\xd3\x38\xd4\x21\xd6\x1a\xd9\x52\x6a\x3e\x6e\xa1\x51\x69\x59\x14\xdd\x91\xa5\x71\x66\x92\x96\xe5\x34\x48\xad\x19\x6d\xcf\x65\x03\x0a\x50\xac\x73\x5a\xba\x38\xc8\xba\x86\x5f\x1d\x4c\x2f\x41\x86\xef\xde\xb9\xe5\xf4\xee\x29\xd8\x73\xc6\x10\x4b\x75\x9e\x9f\xbc\x28\xd2\x82\x51\x96\x33\xd9\xc4\xf6\xa0\x41\x11\x99\x68\x9b\xff\xd2\x52\xba\x9c\xc6\x1b\xd9\x2f\x9a\xbe\x29\xba\x82\x83\xc8\x8f\x7e\x31\xdb\x03\x80\xb6\x75\xb5\x69\xe8\x84\x82\x6e\xa7\xae\xf9\xc4\x2f\x54\x23\x57\xea\xe0\xbb\x2b\x44\xf3\xa2\x21\x5d\xe0\xe9\xec\x69\xf7\x63\x13\x45\xa5\xe1\x4a\xcb\x02\x84\x0e\x95\xa8\xb4\xb1\x64\x49\x22\x69\xae\x93\xa2\x45\x69\xc6\x40\x76\xb6\xda\x77\x2a\x4b\x13\xa1\x85\x66\x9d\x42\x39\x66\x7c\x46\x56\x65\x10\xc1\xbc\x6c\x20\xc1\x08\x6d\x64\x92\xb0\x83\xe5\x4a\xd9\x49\xa9\x75\x2e\x98\x27\xf7\xf4\x8c\x1b\xed\x58\xde\xef\x1f\xee\xfd\x1b\x37\xf2\x4f\x1f\xfd\xb5\x9c\xfd\xc7\x77\x9f\xbf\x3c\xdc\xff\xb0\xab\xa9\x55\x36\x0e\x08\x2f\x9a\x82\x96\x5d\x77\xf2\x28\xf0\xca\xa2\x4e\x0b\xc1\x90\x1f\x23\x8d\x67\x3a\xed\x84\x66\xf1\xa8\x4f\x5e\xa5\x8c\x2e\x75\xa3\x94\x32\x8c\xd9\xfe\xe4\xb1\x06\x24\xb5\x9f\x46\x47\x5d\x56\x64\xad\x9f\xf4\xf1\xb2\x46\x37\xb5\x17\x78\xff\xc6\x7b\xef\x3d\xac\x79\xd7\x37\x1c\x8d\x2e\x4b\xe8\xeb\x5f\xe0\x86\x31\xda\xaf\x36\xc5\x33\xd5\x1a\xe6\x04\x69\x2c\x08\xe8\x74\x06\x09\xd4\x88\x61\xd0\x5d\xde\xd2\xa3\xd9\x08\xeb\xf9\xec\x97\xda\x47\x36\xd9\xd4\x2a\xcf\x04\xa5\x1c\x69\x29\xf5\xcb\x2f\x28\x08\x65\x58\x0b\x69\xa1\x3e\x79\x5a\xaf\xfa\xcf\xcd\x23\x76\xbe\x26\xef\xdd\xfb\xe0\xe9\xee\xe9\xe2\xc1\xb9\x30\x23\x7c\xfe\x72\xf7\xb8\x2c\xa0\x49\x67\xc2\xf4\x3d\x67\x31\x97\x46\x9b\xbc\x29\x4d\x06\xa5\xd8\x25\xa9\x9d\x16\xc3\x49\xdb\x0c\xe6\x1a\xe7\x33\xf3\x11\x82\x26\xc7\x7e\xd2\x28\x0a\x72\x87\xe3\xca\xf7\x7a\x97\xfc\x2b\xc6\x41\x6f\x86\xe7\x64\xd2\x94\x4b\x62\xa8\xd1\x60\x34\x8c\x4b\x6a\x68\xa1\x7d\xcf\xbd\xd5\xcc\xe8\x23\xda\x8c\x73\xeb\xb3\x5f\x96\x2b\xf0\xb8\x4b\x34\x84\xad\x29\x2a\xdc\x37\xcd\xf0\xc6\xaf\x99\x69\x5b\x69\x0d\xb0\x8b\x7f\xa9\x13\xdb\x76\x01\xb9\x95\xf1\xdd\xef\x92\xf1\xe2\x07\xea\x36\xfa\x99\x37\x12\x22\x86\x24\xd1\xdc\x0f\x05\x66\x74\xf9\xa9\xc1\x41\x62\x42\x90\x24\x4a\x1d\xc9\xa6\x9a\x0f\x3e\xf9\xa5\xf6\xc9\x3c\x05\x44\xa4\x29\xc9\x73\x84\x18\xa1\x3c\x25\x28\xcf\x5f\xff\xb2\x8d\x28\xa5\x2c\x3d\x6f\x1b\x24\xff\xda\x31\x0c\xf8\x72\x6b\xae\x34\x26\x0c\x69\x22\x38\x28\x0c\x59\x96\x06\x91\x02\x54\xe7\x9f\x82\x1f\xa7\x4d\x64\x73\x30\x3e\x6b\x30\x59\xf4\xd7\x8d\xa1\xdf\xfe\xab\x65\x8c\x37\xe4\xb9\x6c\x16\x69\xb0\x59\x04\xab\x35\x61\x02\x1b\xa2\x24\x68\x35\x66\x1c\x6b\xa2\xe4\xb1\xde\x50\x47\xe6\x0e\xfd\xd8\x26\x7f\xe5\x3c\xd3\x93\x08\x4a\x77\x47\x5c\x65\xfc\x0f\xbf\x77\x9e\xef\x3e\x9c\x9d\x9a\x0f\x32\x48\x8f\x3d\x97\x10\x92\x5c\x2d\x3b\x11\xa9\x1c\x31\xa4\x91\xa0\x20\x97\xcb\x4f\x41\x24\x9d\x87\xc0\xb3\x1d\x88\x62\x5b\x5b\x0e\xab\xc2\xb6\xbb\xd4\x64\x59\xad\xb4\xc1\x4d\x59\x75\xb7\xbf\xb4\x2a\xf2\xba\xac\xe6\x5a\xdb\x1e\x6b\x41\xcb\x24\x75\x7e\x0a\x71\xc2\x9b\xe5\x5e\xf9\xce\x79\x80\xaf\xf5\x32\x9f\x1e\x2e\x11\x4c\xf0\x15\xa1\xef\xf6\xe3\x87\x4f\x2e\x90\x74\xbf\xdb\xdf\x7f\xf6\x53\xe3\x6c\x95\xd2\x2c\xb7\xdb\xca\x2a\x20\xfc\x24\x6e\x3a\x4a\x29\x89\x10\xcd\x2d\x4f\x40\x25\x88\xcd\x7c\xc5\x64\xb7\x13\x95\xaa\x6d\x5b\x96\x00\xd6\xea\x18\xab\x34\xb6\x2d\x42\xb1\x8e\x13\xe0\x65\x26\x53\x94\x2a\xa3\x44\x1a\xbb\xd8\xb7\xd8\xa4\x7f\x68\x0c\xcf\x0c\x25\xcb\x18\x96\x47\xa2\x75\x8e\xb9\x53\x61\x40\x28\x84\xc5\x32\xbb\x0c\x70\x8d\x88\xc0\x82\x19\x3e\xcb\x40\x58\x53\x99\xd8\x4a\x9b\x42\xa0\xad\xfe\xed\x31\x6c\x8c\xed\xd3\x74\x19\x44\x0c\x90\x8b\x6b\xf3\x4d\xeb\x72\xf5\xff\xb0\xac\x7a\x93\x3c\x0f\x8d\xc2\x6c\x51\x3e\x4a\x02\xa3\x10\x91\xc4\x10\xcd\x41\xb1\x88\x4d\x0c\x51\x6c\x8e\x83\xde\x92\xc3\x10\xdb\x74\xae\x73\xd0\x59\xbe\x83\x26\xcf\x2a\x65\x0a\xdc\x55\x65\x93\x55\xd2\x14\xb8\xad\xca\x36\xab\x94\x2e\x70\x5b\x56\x73\x61\x6c\x1b\x27\x8a\xa0\x32\x03\xd8\xfb\x1b\x7f\xb5\x79\xa5\x3b\x53\x57\xde\xb9\xff\xea\xfd\x9f\xde\xff\xe5\xfd\x8f\xb5\x6e\xfd\x5a\xd7\xf8\x95\xf7\xf9\x1c\xcd\xde\x7e\x4c\xc0\xc3\xa7\x4b\xe8\xe2\xfe\xe1\xd3\x1a\x07\x00\xaf\x92\xfd\xaf\x9f\x1f\xf7\x79\xde\xdb\x09\x1c\x6c\xe8\x3c\x19\x8d\xcd\xc1\xc1\x15\x77\x61\x50\x39\x9b\x32\x02\x93\xe5\x29\x38\x58\x97\xb3\xa8\x51\xca\x53\x87\x71\x66\x68\x8a\x48\x3e\x0b\x09\xa9\x62\x41\x49\x09\xc7\xcc\x60\xa8\x53\x64\xf2\x48\x47\xd9\x4e\x8a\x34\xe2\x92\xd8\x90\x72\x26\x04\xe3\x14\x1c\x88\x64\x91\x3c\xf6\x87\x38\x47\x39\xca\xc9\xe1\x10\x43\x84\x08\x9c\xbd\xac\x51\x58\x15\x5c\x73\xad\x91\x2a\xf2\x52\xa7\xa6\x48\x2b\xbd\x9c\x4d\xfb\x20\x3a\xa1\x7d\xb3\xc3\x37\x75\x16\xef\x2f\x35\xd3\x5f\xce\x81\x9a\x5b\x5c\x94\x4b\x8c\xe4\x5a\x93\xe7\x6a\x18\x83\x2e\x88\x8e\x53\x01\x3a\x9b\xd9\xe1\x4c\xce\x0e\xca\xf3\x8f\x39\x01\x6d\xb1\xf4\xb3\x00\x11\xb1\x53\x59\x54\xa3\x0b\x42\xf1\x1d\xb6\x54\x69\x2b\x2c\x52\x95\x5c\x3e\x6c\xca\x98\x3c\x10\x2d\x80\x67\x11\x30\x8d\xe4\x45\xed\x79\xff\x26\xc8\x4e\xdc\xd5\xe5\xdc\xca\xf8\x4f\x37\xe8\x2d\x4f\xab\x0e\x7c\xbf\xfa\xa0\x5e\x55\x55\xfd\xa5\xf7\x01\xde\xa4\xcf\x7d\x16\x54\x47\xec\x52\xa8\x80\x06\xde\xcc\x2f\xbf\x8e\xd5\x06\x3e\xb7\x59\xd0\x1e\xa1\x76\x6e\x24\x03\xa2\x99\x5c\x7e\x1d\xc5\x86\x3f\xeb\x5d\x2e\x88\xf5\x00\x74\x09\xcc\x84\x10\x3b\x08\x32\x1f\x00\xa4\x94\xda\xde\x7d\x08\xcf\xdb\xb8\xda\x30\xed\xb8\x7d\x3f\x79\xff\xc9\x71\xdc\x2e\xab\x3e\xd9\xfe\xf0\xfe\xe1\xf3\x15\x98\xcb\x3d\xaf\xb3\x3c\x1c\xbb\xf6\xe3\x1a\xb7\x7e\xfa\xe9\x23\xf8\xe1\xfd\xe7\x2f\xe7\x85\x15\x21\x4b\x66\x9d\xf9\x9e\xed\x58\x0e\x18\x87\x05\xe4\xcd\x5c\x26\x7e\x31\x43\xe8\x4b\xa2\x8a\x1e\x4f\x75\x67\x0f\x68\x2a\x35\x91\xad\x00\x90\x1d\x40\x12\x87\x76\xa8\x32\x04\x10\xd6\x02\xd9\x1e\x43\x91\xe1\x1d\x55\x38\xd6\x35\x97\x45\x99\x29\xad\x8c\xd6\xaa\x15\x28\x33\x39\x17\xd0\xa4\x44\x14\x43\x45\x41\x02\x90\x46\x58\x11\x74\x34\x8a\x12\x1d\x74\x98\x20\xb2\xec\xa7\xde\xf9\x8b\xd0\x57\x75\x3a\x9f\x5d\xa5\xc6\x5b\xe3\x7e\x53\x2b\xb4\x3d\xe7\xb5\x6c\xf7\x3f\x5e\xec\xc5\x65\x39\xbd\x77\x9e\xad\x5d\x40\x82\xc3\x31\xd4\x2e\x5d\xb5\x02\xe9\x9c\x5e\x7f\x31\xa9\x6a\xd6\xf8\xbc\x2d\x58\x59\xdb\xc6\x64\xa0\xa5\xa6\x02\x69\x66\x8b\xa1\xb7\x5d\x0e\xa2\x86\xe6\xcb\xe9\x9b\x2a\x24\x14\xb2\x32\xdc\xa1\x39\x05\x65\x59\x96\x6b\xd1\x5e\x43\x0c\x71\x65\x6b\x52\x12\x98\x62\xd5\x4a\x16\x15\x51\x29\x73\x93\x52\x42\x31\x12\x4d\x2a\x28\xd5\x91\xe7\x85\x8e\x83\x5d\xed\xe0\x39\x0b\xfc\x27\x17\xdd\x84\xde\x7f\xf1\x3c\x70\x1b\xa4\xfa\x5b\x70\xf5\x06\xbc\x7b\xb8\x3b\x33\x5e\xff\x5b\xff\xe1\xd3\xbb\x1b\x6d\xf0\xe1\xb6\x56\x8b\x59\x76\x2d\xa6\xab\x23\x55\xb0\x2e\x1e\x28\x8e\x93\xe4\xc8\xc1\x70\x29\x20\x1b\x49\x2a\x53\x4c\x49\xa2\x12\x62\xb9\x8a\xb0\xc2\x20\xc7\xb1\x4c\xd0\x0e\xaa\x52\x15\xaa\x98\xf5\xc9\x4b\x74\x8c\x19\xd0\x9b\xc8\xd1\x49\xbb\x9a\xdb\xc2\x2a\x69\xb2\x42\x86\x45\x91\x94\x3a\x4a\xfb\x1a\xd5\x65\x51\x26\x55\xb1\xac\xc7\xfe\x84\xf7\x22\x20\x2f\x98\x8d\xaf\x2b\xff\xcf\x58\xd7\x1f\xde\x7a\x79\x8b\xd9\x18\xe4\x60\x40\x18\xd2\x84\xa5\x69\x53\x60\x10\x96\xb6\xf6\xc9\xb7\xef\x6c\x48\xa1\x84\xd4\xef\xdd\x57\x40\x8e\x15\xa1\x51\x11\xc1\xba\x42\x9a\xb7\x20\xd6\x5f\xbf\x80\x5c\x62\x29\x90\xfb\xf4\xbc\x20\x50\x41\xb3\x4f\x76\xe4\xbc\xc6\x5e\xf9\x9a\x03\x15\x98\x23\x7b\x01\x62\x20\x33\x03\x4a\x59\x21\x3d\x6f\xe7\x1f\xce\x71\xf4\x55\x63\x7c\xbc\x68\x8a\xaf\xd1\xef\x57\x4d\xf7\xee\xb2\x1b\xcf\xbc\x53\xb7\x9c\xe8\x6b\x2c\x7d\xb4\x31\x28\x8e\x11\xa8\x6d\x44\x9c\xd2\xf0\xf5\xcc\x79\x16\x83\x34\x8d\x8b\x38\x01\xc9\x33\x06\x51\x9c\x04\xcc\xcc\xd4\x18\xbf\x98\xe9\x2e\x62\x4c\x32\x29\x99\xad\xac\x90\xca\x0e\x79\x9e\xa3\x2c\x4b\x95\x4a\x53\xdb\xd8\x98\x10\x30\xda\x83\xab\x8f\x49\x4f\xd0\x61\x46\xaf\x48\xae\x2b\x3a\xb9\x77\xad\xbb\xb8\xd4\x65\xbd\x85\xe6\xb5\x12\x91\xad\x45\xbc\x4f\xf7\x4f\x9f\x2e\x50\x5a\x81\x0c\xc6\xb9\x5d\x76\x4d\x5d\x0a\x45\xc5\x68\x85\x42\xbe\x67\xe6\xc9\x68\x0c\x60\x63\x21\xc0\x2e\x39\xbb\xd7\xc6\x80\xd8\x48\x33\xb7\x97\x78\xc4\x0e\x5a\x22\x85\x94\x75\xa6\x85\x22\xe9\x9c\x12\xec\xa3\x8c\x53\xa6\xa4\x90\xa2\x5e\xfe\xf3\x8c\xa5\x95\xea\x8a\x0d\x54\xec\xd4\x75\x35\x39\xf6\x20\x0f\xfc\xf8\x72\x35\x7d\x6d\x40\xbd\xa2\x12\xf2\xcf\xfb\x62\xc3\x2a\xc5\x69\x61\x7b\x5b\x80\x64\x4c\x33\x23\x73\x93\x71\x8e\x05\x46\x09\x25\xa9\xa5\x69\xdf\x56\x4d\x72\x30\x85\x06\x5a\x11\x83\xa5\x0d\x35\x96\x52\x6e\x74\x14\x4b\x0d\x2d\xb1\x87\x2c\xa3\x38\xeb\x0e\xb0\x4c\xe2\x59\x30\x12\x9b\x04\xf9\x24\x57\xa6\x4b\x62\xd3\x80\x3c\xb3\xc3\xb1\xee\x26\x04\xbc\x16\x66\x53\x89\x4b\x6f\x13\xa8\x93\x76\xbe\xa9\x1f\xce\xec\x47\x57\x0f\xd5\xfd\xeb\x74\x9b\xe0\xe9\x25\xe8\x7b\x16\x58\x9c\x53\x8a\x1b\xcd\xb8\x30\x92\xc9\x8a\x0f\x93\x09\xc4\xf3\x04\x72\x92\x2b\x88\xfd\x5a\x23\x22\x69\xd0\x2f\x6b\x41\x23\xa3\x95\xe6\x36\xf4\xd3\x93\xa7\x68\x0f\x62\xbf\xfd\x25\x54\x3b\x6c\xea\xbc\x31\x30\xeb\x0c\x2a\xbd\xad\xc3\x0e\xc7\x3b\x79\x66\x58\x5c\x25\x7a\xba\xfb\x16\xba\x3c\x78\x09\x02\xbf\x28\xd4\xd4\x00\x45\x29\xe1\x89\x41\xd9\x6c\x0c\x10\x57\xf4\x36\x9f\x1b\x44\x14\x9d\x05\xc5\x1c\xb3\x9d\xb4\xf1\x33\x5f\x3d\x10\x93\x4d\xb7\xd8\xca\x69\x2e\xa6\xa0\x85\xb5\x44\x46\x89\x82\x68\x75\xe6\x7d\x5e\x6c\xa5\xff\xc5\xfb\xf7\x2e\xa7\xe3\x87\xf7\xe7\x75\x78\xf7\xba\xf4\xee\xe1\x5a\x78\xed\xd2\x33\x97\xa3\x6a\x31\x15\xf6\x4f\x9f\x36\x05\xcb\x25\x86\x3a\x83\x83\x95\xa0\x8b\x19\x43\x24\xa1\x79\x96\x86\xb6\x37\xc5\xc4\x40\xa8\x6c\x47\x40\x6e\x4d\x9d\x21\xd0\x0c\x83\x2d\x93\x61\x27\x4d\xa9\x2b\xa4\x99\x0d\x27\x9b\x0f\x91\x09\xd5\x38\x0b\xdf\xb3\x43\xa5\x5a\x10\xfa\x51\xaf\x25\x9f\xcb\xde\x9a\x69\xf2\xd6\x7c\x06\xb4\xaf\x1c\xde\xfa\xbb\x6f\x10\xd7\xaf\xbb\xf8\xe6\xa4\x79\x89\x9f\x04\x2a\x10\x47\xe9\x0f\x2e\xca\x99\x06\x07\x7d\x6c\x35\x0d\x18\x2f\x6b\x90\x60\xdb\xf4\x83\x1d\xd0\xa1\xd6\x84\xf2\xca\xe0\x99\xec\xe0\x5c\x2a\x2a\xd9\xdc\xda\x49\x69\x10\xdb\x96\x0f\x12\x65\x05\x14\xcb\x62\x25\x6c\xd9\xed\x4c\x5f\xb1\x7b\x8a\x3f\x26\x53\x1d\xa0\x63\xe5\x57\x0e\x7a\x8a\x04\x8d\x9e\x3d\x4d\x03\xc8\x8c\x02\x29\xb6\xcd\x72\xa8\xe3\xa9\x94\x84\x91\x52\xe3\x59\xbe\x29\x53\x0e\x8b\x9c\x5f\x64\x12\xcc\x81\x4d\x06\x8e\x0b\xaa\x74\xd8\xe0\x77\xce\xc6\xfb\x15\x9e\x92\x57\x8e\xb4\x47\x97\x62\xfc\xdd\xbb\x87\x3d\xd5\x73\xa8\x40\x93\xc1\x02\xa5\x36\xf5\xbb\x39\x2b\x37\xa9\x6d\x13\x84\xb3\x50\x27\xd4\x94\xa4\x0e\xcb\x96\xd5\x3a\xb2\xe3\x56\xd9\xaa\xed\x01\x5d\x49\x68\x4a\xd3\xe9\x79\x4a\xe2\xbc\x80\x3d\x45\xd4\xcf\x6c\x63\x1b\xaa\x08\xf0\x80\x93\x0b\xfd\x71\xb9\xbe\x3c\xec\xb1\x39\xea\xc2\xf7\x92\xac\xc8\xb3\x79\x5a\xee\x8d\xed\xa6\xb5\x2a\xc5\x02\x46\x3a\x11\x75\xc9\xfa\xa8\x19\xf9\x50\x86\xb6\x5e\xe4\x6a\x3a\x27\x17\x53\xb6\xd0\xab\x5c\xd8\xe4\x1d\xc3\xd4\x4f\x9d\x5c\x9a\x00\xef\xe0\xe6\xb0\x3c\xe5\xfb\xda\xf1\x18\xdd\xbd\xf0\x0a\xad\xac\x01\x3f\x7d\x0c\x56\xb9\x1e\xef\xbe\x7f\x7a\x4b\xb0\xbb\xc7\x6d\x07\x63\x40\xcd\xac\x35\x50\x71\x26\x17\xb5\x5a\x07\xfa\x10\x85\x49\x96\x85\x3a\x26\x4a\x60\x15\x96\x35\x2d\xd5\xb8\x93\x4c\xd8\xc5\xea\x3d\x00\x4d\xf1\x3c\xe9\xce\xcc\x63\x16\xe1\x0a\x4e\x0c\x31\x1f\xda\xd2\xd6\x4c\x50\x10\x81\x64\x91\x2b\x3c\xc1\xeb\x78\x5d\xf8\x66\xee\xbe\x1d\xaf\xf7\x6f\x4e\xe4\xe3\x9e\x99\x19\x39\xbe\x99\x22\x8b\x2d\x5b\xb4\x43\x1d\x0c\xb6\x8d\x43\x88\xd2\xc8\x24\xd4\x68\xa2\xa3\xba\xe7\x7d\x11\x1e\xb6\x85\x15\x87\xc5\x20\x76\x7c\x63\xcb\x88\x99\x79\xc8\xc2\x10\xd7\xf0\xc0\x31\xf3\x73\x5b\xd8\x9a\xa9\x45\xb4\xd8\xcd\x25\x73\xb2\xa9\x57\x73\xf9\x86\x6c\xbf\xb6\xc6\x8a\xe5\x1a\x31\x24\x99\x46\xa9\x85\x7e\x3d\xa3\x7e\xc3\x6c\x1b\x43\x9c\x45\x26\x61\x85\xc6\x53\xd8\x1f\xf8\x54\x47\x76\xb8\x8a\xc6\x70\xc6\xe4\x2a\xda\x94\xc6\xb8\x84\x13\xc3\xcc\xcf\x6c\x65\xcb\x45\xb2\x18\x44\x5e\xe0\xee\x7d\xe6\x0d\x5d\xf6\xf0\x96\x2e\xdb\xbe\xd2\x65\xcb\x96\xdd\x3f\x7c\xda\x68\x94\x6a\x9c\x97\x39\x02\xa1\xa5\x60\x8a\x19\xc7\x34\x61\x68\x51\x66\x8d\x29\x6c\xcf\x40\xaa\x6d\x03\x81\xb4\xa2\x4f\x21\x28\x1d\xea\xaa\x8c\x81\xb7\x13\xba\x34\x25\xd4\x62\x51\x68\xb8\x8b\x8b\x98\x2d\x0a\x0d\xdb\xa2\x15\x1d\x88\x17\x85\xa6\xc5\xac\xcf\x0a\xcd\x07\xf2\x54\xed\x50\xd0\xdc\xb0\xcb\xaf\xe7\xe8\xdd\xe3\xfd\xf7\x0e\xcf\xfd\x5c\xbd\x70\xc6\xaf\xba\xbb\x64\x46\x05\x91\x48\x11\x68\xb9\x34\x8d\xa0\x15\x16\x89\x0e\x49\x2b\x89\x4a\x2d\xa1\x40\xa6\x65\x0e\xc9\xb8\x58\x97\x49\x50\xe7\x79\x2e\x51\xc3\x58\x6e\xbb\x16\xe6\x2c\xab\x30\x24\x07\xdb\x51\x91\xf7\x00\xa7\x31\xe7\x56\xbb\xd8\x1f\x50\x27\xe3\x64\x59\xeb\x75\x9d\xf2\x5f\xa5\xf8\xf2\xb5\x14\x67\xb8\x7c\x47\x2a\xb1\x29\x75\x0a\xcb\x16\xcb\x34\xd4\x21\xed\x15\xd1\x99\x55\x0c\x90\xb4\x32\x69\xc6\x31\x2c\xb1\x25\x7e\x3c\x8f\x41\x93\x51\x64\x61\x9d\x65\x2a\x6b\x30\xc4\xa3\xed\xa9\xcc\x5b\xd0\xa2\x1c\x51\xce\x2c\x69\x3c\x2f\x00\xc3\x69\xda\xa1\x2d\x3c\xe7\x17\xbe\x25\xc5\xa7\xbb\x8b\x14\x0f\x9f\x9d\x79\xb8\x9e\x87\xa1\x41\xc4\x54\x88\x26\xa1\x0e\x49\xad\x88\x8e\x6c\x29\x00\x8c\x1b\x30\x32\x9b\xfb\xe1\x7c\x08\x29\x54\x90\x6c\x21\x31\x6c\x9e\x26\x98\xe8\xac\xc1\x39\x01\x89\xad\x8d\x14\xa3\x1f\x99\x79\x00\x1e\xe8\x99\x40\x9c\xb9\x58\xe8\x72\x97\x2b\x36\xc3\x19\x39\xfc\xcc\x06\x71\x39\x15\xd7\x75\xfd\xe9\x92\xd9\xf4\xb0\x2e\x24\xc7\x57\x4a\xc6\x9c\x68\x89\x41\x43\x61\x91\xe5\x93\x15\xb9\x99\xf2\x22\x92\xb6\x39\x48\x3b\xc1\xb9\x22\xbe\x97\xdb\xaa\x70\x00\x71\x0d\xa3\x44\x19\x59\xe4\x82\xcd\xb5\x2d\x93\x24\x97\x59\xc3\x30\x06\xda\x7a\x50\x27\x40\x19\x10\x7b\x7e\x90\x9c\xe0\x66\x39\x9f\x57\xab\xf8\xe9\x2e\x02\x1f\xbf\xbb\x0b\x9e\xee\x1e\x37\xb1\xb6\x07\x79\xe8\xa5\xdc\xc9\xe7\xde\x26\xb6\x59\x6e\x70\x45\x90\x3e\x37\x9e\x07\x36\x07\x77\xa7\x89\xbd\x7f\xbc\xc4\xda\x5f\x0a\x9e\xaf\x84\x24\x77\x0f\x9b\x83\xaf\xed\x04\x3c\x84\x61\x82\x13\x29\xd7\xea\xe7\x5d\xac\x6d\x77\xac\x08\x51\xc8\x2f\x9f\xc5\x46\x1d\xe5\x26\x04\x99\xab\xd3\x2b\x9c\xbd\x4d\xcf\x78\x5b\xef\xcf\x99\xa0\xeb\x5d\xf7\xf6\xee\x73\x46\x13\x5e\x4b\x63\xde\x60\x9d\xda\xa7\xd8\xca\xb9\xcf\x40\x03\xb8\xc1\x44\x31\xdb\xd1\x4c\x67\xd4\x50\x68\x32\x1a\xfb\xc2\x1c\x0e\x58\x31\x92\x70\x9e\xcf\x0a\x78\x2c\x33\x19\xdd\x51\x2d\x62\xc3\xb2\xa9\x44\x8d\x30\x4d\xd6\x98\x48\xd7\x59\x6d\x6c\x6c\x8c\x9e\x9b\xb3\x35\x98\x12\x5d\xc1\xda\xac\x58\x48\xad\xc3\xfc\xcf\xaf\xc8\x56\x4e\xda\x8b\x6f\xef\xfd\xdb\xb4\x35\x3f\x7d\xfc\x06\x38\xa7\x6a\x24\x9b\x4d\x90\x8a\x82\x81\x88\xb1\x0c\x26\x38\xcb\x27\x73\x30\x40\x0b\x15\x1e\x0e\x40\x4f\xb3\x74\x5f\x5b\x4a\x10\x53\xd2\x70\xf4\x6c\x08\x8d\x54\x88\xce\xc5\x0d\xdb\x14\x65\x36\x1e\x86\x61\xae\xc6\x71\xf4\xbc\x8d\x93\xcd\xec\x62\x97\x09\x7e\x41\xa8\x75\x99\x87\xaf\xa1\x51\xdf\x3d\x7e\x7a\x72\x90\x90\xff\xf1\xcb\xe3\xc3\xf7\x7b\x97\xcc\xbe\xd6\x6b\x6f\x90\x3f\x70\x6e\x93\x24\xf5\x89\xb1\xdc\x64\x90\x69\xcc\x4d\x1c\x8e\x87\xb0\x01\x28\x04\xa1\x9d\xc2\x08\xa4\x6b\x22\xe7\x2e\xb6\xa5\xb1\x25\xa3\x73\x8e\x31\x98\x68\xce\x5b\xe0\x29\x89\x0d\xe5\x82\x74\xd6\x08\xd2\x1d\x3d\x40\xae\x75\x39\x41\xe6\x38\x84\x17\x2d\xef\x18\xfe\x6e\x39\x84\xd7\xbb\xd5\xf6\x26\x7f\x92\x2f\xf7\xa2\x22\x8d\x41\x38\xe7\xe8\x82\x8e\xec\xe7\x85\x3d\xac\x00\x6f\x5b\x4d\x89\x23\x8e\xd4\x85\x2e\x67\xc2\x99\x5f\x58\x0c\x52\xcf\xf9\x67\x97\xfd\xd6\x5e\xb8\x05\x96\xbb\xdb\xa5\xa5\x0b\x5b\xd3\xf7\x0e\x22\xf7\x15\xbf\xa6\x63\x18\xb8\x2c\x27\x1d\xc0\x02\x44\x59\x2e\x79\x0e\xb2\xd9\x23\xbc\xe4\x46\x97\xfd\x62\xe1\x65\x76\x24\xca\xe8\xc4\x98\x2c\xb5\xa5\xc5\x08\x8c\x80\x1d\x5b\x40\x39\x97\x54\x05\xc3\x38\xe6\x90\x30\x66\xa4\xe0\xa6\xc4\x9d\x0c\x4b\x56\x54\x80\xd8\x9c\x2f\xb6\x73\x0a\x81\x57\xe9\xb2\x28\x01\x85\xbc\x60\x5a\x7b\x1b\x7f\xc5\x29\x92\x6e\x0f\xac\x58\xb2\xce\x55\xf6\xe1\xfd\xa2\x0b\x82\xe5\x74\x79\x9d\xb1\xf9\xf8\xb7\x60\xbb\xd8\x31\x8f\x8b\x96\xd8\x56\x23\xf0\xe8\xc9\x1b\x6d\xab\x2a\x5b\x53\x00\x79\x50\xf4\x09\x34\x30\x34\x21\x3b\x79\x9a\xf5\xe1\x78\xf2\xd8\xd4\x44\x75\xe1\xd3\xb9\xd8\xc9\x83\x34\x1a\xc4\x14\xd9\xa9\x96\xb5\xed\xe7\xca\x46\x69\x9c\x95\xb0\x63\xf9\x62\xd0\x0c\xb6\xe2\x86\x80\x70\xd4\x6e\x8f\x6e\x96\xb9\xdb\x97\xdb\xf0\x46\xbe\x1b\x2a\x44\x47\x7b\xf0\x95\x7c\x3b\x6f\xfb\xf1\x7f\x05\x5f\x9c\x16\xf3\x95\x99\x6c\x41\x01\x0c\x6a\x90\x0d\x72\xb0\xfd\xb1\xdd\x28\xdb\xe5\xba\x47\x61\xb9\x28\xb3\x51\x4d\xb1\x9d\x16\x2d\x9b\x01\x2f\xb1\x83\x4b\xf3\xdf\x86\xb8\x91\x9a\x1a\x5d\xca\xc6\x0c\x73\xb3\x68\x34\xa8\xb3\x96\x21\x02\x74\x6b\x0f\x4c\xe2\xce\x18\x10\x2d\x6b\x8b\x9c\xd0\x26\x76\xf8\x0c\x7f\xe7\xc5\xe7\x6a\xdb\x5b\x42\xd2\x97\x18\xe8\xc7\x1f\x6f\x53\x74\x81\xd2\xa6\x12\x35\x18\xb4\x11\xb2\x82\x3a\x89\xdb\x46\x98\xae\x6c\x04\x48\xfd\xa4\xb0\xaa\x70\xe1\xfc\x1d\x41\x76\x30\xbc\x6a\x54\x2d\xea\xd2\x4e\x28\x4d\x75\x2d\xca\xb2\x93\x6c\xb0\x62\x8e\x94\xf2\x27\x9b\xb8\x38\xc6\x5a\x77\x5c\xb9\x58\xf3\x9f\xbd\xdc\xfb\x1f\xde\xff\xe3\xfd\xbf\x57\x9d\xff\x74\xff\x00\x9e\xbe\xf6\x16\xbb\x3f\xaf\x2b\xf1\x16\xb3\xff\xc3\x0f\xef\x9f\xbe\xbc\xdf\xbb\xac\xb8\x9f\x3e\xbe\xac\xd4\x3f\xad\x7a\xe5\x52\x47\x1c\x24\x75\x9c\xa8\x2c\xae\xe7\x83\x8f\xb4\x4b\x95\x53\x56\x38\x74\x73\xe6\xe0\xc5\x75\x22\x78\x1c\xea\x28\x49\xba\x01\x01\x69\xa5\xc5\x49\x8c\x33\x95\xf1\xb9\xa3\x51\x02\x06\x98\xc3\x3c\xa1\x59\x38\x2a\x35\x8e\xe3\xb8\xed\x10\xcc\x30\x95\x20\x31\x52\x5b\xce\x04\x17\x4c\x88\x24\x4e\x31\x14\x69\x02\x59\x50\xeb\x9e\xf2\x2e\x2b\xa4\x24\xb9\xe5\xc7\x9a\xd0\x58\xc7\x88\xdb\x72\x13\xd9\xa1\xb0\x79\xb9\xe2\x55\xd6\xa7\x6c\x4f\x7c\x76\xf6\xbb\x3e\x5c\x39\xd3\xae\xa0\xae\xc9\x87\x4f\x0f\x5f\x2e\x38\x5b\x3f\x7d\x7c\xb8\xff\x0c\xb0\xcf\xb5\xcf\x89\xe4\x0c\xc2\x59\x1f\xdb\x04\x68\x20\x16\x5b\x78\xb0\x89\xcf\x41\x1f\xe5\x99\x2d\x47\x3f\xc6\xd8\x0a\x26\x05\xca\x49\x6c\x62\x23\xb5\xd6\x56\x67\x99\x8e\xd6\x1c\xaa\xdc\xe5\xa2\xfd\xfd\x9a\x81\xf7\xee\x9c\xbf\x01\x3e\x7e\xf7\xce\xa5\xa9\x9c\xa3\xee\x67\xa2\xe2\x60\x1c\xe3\x22\x8c\x7c\x6f\x9e\xc8\xc9\x93\x13\xea\xfd\x5e\x11\x13\x27\xdd\x21\x55\xc2\x70\x55\xca\x2c\xdf\x42\x90\x87\x85\xd1\xc7\x61\x1e\x98\x0f\xfd\x62\xce\xed\x68\x6b\xc4\x28\x85\x0a\x70\x5f\xc3\xd9\x25\xa5\x19\x79\xce\x49\x53\xbb\x74\x45\x9f\x08\x1e\xce\x5c\x61\xaf\x32\xd3\x3e\x7f\xba\x5b\x33\xe2\x3e\x6e\x98\x91\x80\xd9\x28\x60\xfd\x72\x4e\x52\x01\x61\x02\x51\x9a\x74\x76\x94\x20\x6e\x6d\x91\x6d\xb3\xc4\x6a\x30\x19\x63\x23\x3d\x47\x82\xc6\x65\x92\x42\x5f\xd9\xd8\xb6\x0a\x44\xa0\x95\x97\xf5\x8f\xfe\xc8\xfa\x2f\x94\x69\x44\x0b\x86\xb2\x10\xaa\xc9\x54\x9c\x74\x2d\x2f\xfb\xba\xe3\x00\xfa\x59\x61\x79\xb1\xea\xf9\x37\xd6\x7f\xc3\xab\xb2\x97\xac\xb7\x72\x8e\xa4\xbc\xae\xff\x45\x13\xe1\x40\x6d\xd3\x33\xa6\xef\x85\xbd\xe1\x87\xdb\xde\x3b\xb7\xe0\x39\x29\xf1\x55\x6a\xe2\x4f\x1f\x5d\x6a\x2f\xcf\xf2\x34\xcd\x12\x26\x54\xa9\x74\x46\x52\x8a\xf3\xbc\x3d\x60\x90\xf6\x61\x54\x0d\x64\xac\x53\x59\x63\x4a\x93\x84\x67\x09\x46\x69\x66\x6b\x0c\xe0\x36\xa5\x69\x0a\xb3\x24\xe5\x9c\xd4\xb6\x1c\x86\xa8\x8a\x95\xac\xa8\x61\x2d\xcc\x0a\xae\x69\x99\xa1\x5c\x26\x69\x96\xa2\x2c\x4b\x60\x9e\x3b\x26\xbc\x6d\x40\x4e\x6a\x6f\x36\xd3\x2d\x4e\x26\x78\x23\x96\xf3\x0d\xa2\x61\x19\x68\x2b\xdd\x7e\x1b\x9e\x1b\xd0\xba\x23\x59\xe9\x71\x04\x72\x9a\xd7\xaf\xcd\x74\x1c\xb4\x36\xee\x2f\xe8\xeb\xba\xb6\x5e\x5d\xd7\x4b\x9b\xf4\xa4\xf7\xd5\x2e\xf9\xed\x36\xef\x1e\x1f\xee\x9e\xee\xc0\xf9\x3b\xa8\x03\x63\xa5\xdb\xdf\xc3\x73\x05\xfa\x95\x59\xad\x18\x06\x20\xc6\x79\xfd\xda\x25\x47\x3a\x3a\x64\x53\x3d\xfa\xd1\x8a\xe5\x30\x9f\x11\x68\x56\x7c\x94\xfc\x44\x1c\x6f\xf7\x3f\x5f\xb3\x9b\x6e\xfc\xd0\x77\x8b\x11\xf3\xe0\xb0\x41\xff\x74\xff\xf1\x3b\x97\x04\x4c\x8b\x24\x05\x5d\xc8\x35\x55\xb1\xa1\x59\x94\x59\x9d\x23\xc0\xed\x20\x43\xd1\x65\x45\xb1\x13\x99\xe0\xcf\xd8\x96\xb1\x89\x71\x17\xd4\xa1\xe1\x33\x92\xfe\x14\x52\x00\x8f\x1a\x18\x2f\x08\x84\xab\x93\x10\xe7\xaa\x99\x73\x36\xe0\x75\x3d\x2c\x2b\xf1\xd5\xbf\x9e\x3e\xbf\x3b\xd3\x4d\xdd\x3f\x6c\xa6\x32\x49\x80\x26\x02\x92\x98\xe4\x49\x12\xda\xd4\x9f\x98\xa6\x32\xd1\x34\x4b\xa3\x39\x1a\x12\x81\x33\x95\x62\x5b\xfa\xc3\x9c\xec\x04\x24\xf9\xdc\x77\x91\x0a\x39\x60\x33\x9e\xeb\x3e\x32\x11\x07\x2a\xe8\xb0\xad\x29\xc7\x9c\x1e\x4b\xbd\xe6\x0c\x62\xc7\x71\xba\x68\x89\xfd\xce\xdf\x7f\xf4\xee\x3e\xad\x46\xec\x93\xbb\xad\x3b\x22\xf9\x33\x77\x85\x8f\xe3\xb4\x12\x12\xf0\xc2\x00\x68\x40\x56\xe8\x48\x22\x94\x73\x4d\xfd\x5e\xb7\x96\x6a\x06\x46\xbf\x4d\xed\x04\x4a\x80\x6d\x65\x19\xf0\x52\xa3\x67\x04\x91\x64\x2b\x36\x88\xef\x72\x91\x4b\x87\x63\xf7\xe8\x79\xef\x9e\xee\x7e\xfc\xf2\x52\x89\x71\x3d\x39\x83\xb3\x9f\x79\x91\xa3\x29\x40\x6c\xe4\x68\x6b\xc8\x2a\x1c\x86\xa1\x0e\x85\xed\x5b\x41\x00\x29\x5c\xd2\xb0\x2d\x77\xb9\xed\xb9\xe0\x25\xa3\x49\x1c\xa7\x11\x4f\x1b\x96\x13\x9b\x1e\x0e\x66\x6e\x7d\xe8\xed\x3d\x7d\x32\xc1\xb8\x4b\xbe\x8a\x80\x79\xe0\x9c\x2a\x0b\x6e\x78\x0b\xbe\x3c\xdd\x39\x6b\x62\xf9\x0e\x86\x19\xf9\xe6\xd8\x01\x6f\xb9\xed\xa8\xc3\xa1\x06\xa9\xed\x39\x42\xd3\xf9\x7b\x97\x98\x5f\x4a\xb3\x53\x76\xb4\x44\x96\x96\xcc\xbd\x00\x99\x74\x9f\xd7\x1a\xec\x68\x27\x1c\x66\xdf\xff\xe1\xfd\xdf\xde\xff\xf7\x92\x7f\x1d\x9d\x73\x7d\x9c\x83\xf4\x3b\x57\xd0\x75\x61\x03\xbd\xa6\x29\x7f\xb8\xbe\x3a\xeb\x88\x77\x5f\xbf\xf8\xf0\xc6\xff\x4a\x2d\x37\x1c\x62\xcb\x34\xeb\x1b\x5a\xd5\xbc\x65\x3d\x25\x56\x64\x79\x9e\xa5\x34\xcd\xd2\x0c\x65\x29\xc9\xf3\x0c\x41\xe8\x1b\x9c\xc4\x74\xd1\x05\x18\xa3\x2c\xcf\x20\x4d\x68\x96\xd0\x14\xc2\x8c\x90\x3c\x83\x69\x46\x6d\x9c\xc1\x24\xa1\x49\x9a\xc4\x28\x4e\x72\x98\x67\x30\xcb\x5c\x65\x9e\x4d\x6d\x55\xc8\x42\x95\xc2\xfe\xff\xa4\xfd\x3d\x90\xe5\x38\x96\x26\x88\xf2\x90\xf7\x87\xf3\x6a\x66\x8a\x9e\x91\x91\xc1\x9e\x99\xea\x47\x6f\x8f\xcc\x60\xbf\x9e\xb1\xe1\x94\x4f\x44\xe0\xd9\x7b\xdd\x4b\xb3\x1d\xb3\xc5\xec\x9a\xad\x61\x35\x88\x10\x29\x42\x84\x08\x11\x22\x44\x88\x10\x29\x52\xa4\x48\x91\x22\x45\x8a\x57\xa4\x48\xf1\x56\xc6\x25\xee\x1a\xc1\xeb\x1e\xee\x91\x51\xd5\xd5\xbd\x95\x7e\xe9\x9e\x5e\x69\x8e\x43\xfc\x9e\x73\xf0\x9d\xef\x3b\x1b\x55\x03\x82\x38\x94\x3c\x2f\x30\xc1\x14\x17\x39\x2f\x0a\x86\x78\x4e\x8a\x9c\x13\x54\x12\x5c\x96\x65\x25\x68\x51\xe5\x94\x39\xc6\xca\x12\x13\x8c\x30\x93\x38\xab\xb2\x92\xb1\x1c\x61\x84\x31\xce\xb2\x2a\xcb\x58\xc1\x73\x9a\x17\x41\x14\xb4\x57\x1a\x75\x07\x7e\x53\x85\xf7\xeb\xe5\xcd\xe3\xdb\x87\x1f\x6e\x5a\x72\x61\xf4\xf0\x24\xaa\xf2\xfe\x77\x70\xbc\xdb\x56\x4b\x84\x78\x65\x92\x71\xc8\x8b\x3c\x16\x99\xa2\x3c\x1b\x2b\x9a\xca\x06\x43\x83\x92\xfe\xe4\xef\x51\x0e\x5c\xa0\xdc\x95\x6a\xa9\x87\xdc\xb5\x10\xc0\x79\xb1\x45\xa1\x30\x2a\xf7\x2c\x5d\x46\xa8\x13\x57\x5d\x9a\x4a\x10\x51\x05\x41\xe4\x7d\xf6\xf1\xb6\x6e\xff\xcb\xbf\x60\xdd\x6e\x3c\xfa\x43\x9d\xe7\x50\x51\x81\x70\x46\xfc\xca\x65\xa1\xac\x2c\xa2\x19\x2b\xcb\x22\x5e\x54\x5f\x88\x32\x53\x69\x09\x41\x76\x76\x03\x82\xf2\x20\x10\x2b\x96\xa1\x4f\x74\x2a\xa0\x5a\xf0\xd2\x9d\x12\x93\x08\x90\xd1\x48\xdc\xc0\x65\xa1\xf8\xa5\xd3\x92\xd6\x34\x08\xa3\xf9\x2a\x3d\xe6\xf7\xdf\x6d\xdc\x2a\xaf\xb2\x7f\x7e\x75\xed\x6e\xf0\xbe\x37\xef\xfe\x7d\xb8\xae\xad\x23\x37\x4b\xad\x41\x64\x85\x45\x99\x63\x06\xe2\xad\x36\xa8\xe4\x23\x49\x6c\x4a\x2a\x77\x3e\x55\x7b\xe6\xe4\x3c\x83\x94\x0c\x49\xe3\xa8\xab\x45\xad\x3a\xe9\xea\x3c\x63\x10\x14\x67\x5b\xe0\x2a\x38\x04\xe8\x4a\x77\xc9\x41\xfd\x8b\x38\xe6\x3e\xff\x96\x63\xee\xfe\x45\x7c\x0b\xba\x4e\x33\x50\x8b\x0d\xa7\x25\x0d\xc7\x84\xeb\xa2\xca\x44\x81\xf2\x98\xe4\x98\xa3\x2c\x89\x97\xbc\xcf\xc8\x56\xd6\x6d\xcb\x44\xa4\xc8\xd5\x22\x2e\x65\x09\x59\x9e\x88\xc4\x53\xfd\xa1\xc5\x56\xb2\x72\xc1\x98\xe9\x0c\xb1\x4c\x8b\x8c\x72\xa6\x76\x88\x8c\x9c\x4f\x55\x75\x99\x95\xc9\xac\xcc\x86\xb6\x6c\x1b\x6b\xf2\xc6\x04\x61\x54\x5f\xa5\xc7\xba\xfe\x3b\x3f\xd3\x5e\x2b\x3f\x3e\xde\xbd\xff\xf9\xa9\x1f\x3f\x3f\x77\xe4\x5e\x91\x1c\x3c\x3d\x34\xd4\x79\xd9\x58\x40\x10\x70\xd7\xb8\x1a\xf1\x39\x2f\x62\x1b\x63\xed\xe6\x5e\x1e\x84\x34\x5b\x67\x8a\x6a\x11\x4e\x89\x5e\xce\xc2\x75\x59\x56\x14\x10\x14\xb3\x45\x25\x5b\xfd\x35\xf3\xd7\xb5\x9f\xbd\x68\x5f\xd0\x1c\xa4\x5d\x98\x85\xa6\x58\xdb\x2f\x21\xe6\xae\x76\x16\x71\x08\x9e\x0c\x38\xfd\x05\x03\xd6\x10\xec\x66\x00\x04\x72\x17\x1f\xed\x41\xfb\xca\x85\x77\xfb\x9f\x76\xcf\xf4\xa2\xef\x3f\xec\x3f\xfc\xfc\xcb\x87\xc7\x9f\xde\xfd\xbc\x5d\x49\x1d\xcb\x64\x29\x38\xb0\xaa\x28\x62\x99\xb0\xea\x1a\x38\x52\x5d\xa6\x34\x1c\x8b\xdc\x14\x08\x2a\xae\x88\xd5\x64\x3f\xaa\x84\xb0\x82\xe6\x8a\x35\x32\x51\x09\xad\x38\x89\xcb\x9c\xe5\x25\x0d\x82\xa3\xe7\x52\xd3\xfb\xe0\xb7\x1c\x91\xdf\x9d\x3c\xf7\x77\xf7\x9f\x6e\xb7\xc2\xd1\x6f\xee\x83\x37\x57\x3a\xb4\x75\x11\x15\x5f\xf4\xbe\xfd\x15\xef\x75\xc2\x14\xe2\x99\x2a\x50\x9a\xfc\x2a\x00\x65\x51\x7a\x29\xa2\x81\xe0\x5c\xe6\xe8\xc2\x05\x13\x5c\x46\x49\x95\x99\x8c\x0e\x34\x33\x19\xd9\x07\x19\x5d\x66\x22\xb1\x53\xf5\xea\xc7\x77\x51\x53\xba\x99\x52\x4e\xe9\xa2\x08\x2d\x19\x49\x49\x5b\x49\x2e\x84\x2c\xf4\xf6\xd8\xb8\xfc\xbb\x67\x6c\xeb\xbf\xfc\x4c\x3f\xd9\x34\x87\x86\x8a\x92\xa4\x14\xe5\x59\xec\xb2\xf0\x5c\x69\xa6\x32\x5d\xf9\x33\xbd\x2d\x04\x2b\x04\x22\xce\xab\xab\x1d\x04\x22\xe5\x32\xf6\xb1\x4e\xb8\xdf\x16\x9e\xcf\xf4\xb1\x72\x5d\x25\xb0\xa8\x2e\x42\xaf\x36\x55\x3e\xff\x21\x3d\x9b\xee\x3f\x3c\xe7\xfc\x6e\xec\x2d\xe1\x2d\xb6\x7a\xce\x69\xdf\xd2\x7e\x77\xdb\x21\x12\x37\x84\xce\x6d\x89\xf3\xd8\xa4\x79\xd6\x68\x5c\xc7\xa2\xe1\x86\xc7\x16\x34\x73\xcd\x1a\x82\x54\xa5\x46\xd5\x41\x16\xbd\x5e\xaa\x65\x28\xf1\x58\x5c\x83\xf5\xf0\x08\xa9\xb3\xae\x97\x82\x41\x0a\x79\x68\xda\x05\x81\x0a\x63\x69\x4a\x2b\xb6\x3a\xd1\xec\x16\x93\xac\xfe\xf9\x73\x4e\xf4\xc3\xa7\x9f\x3d\xc1\xb2\xbf\x9a\xfb\x6d\x5a\xf2\x8d\x3f\x8e\x77\x5a\x89\x99\x0e\x61\x56\x37\xa2\x69\x5c\x10\x65\x0d\xa6\x79\x6c\x62\xd6\x2a\xa2\x33\xa7\x18\x90\xa4\x35\x5e\xee\x40\xe0\x73\x23\xeb\xde\x9d\x05\x57\x90\x39\xbc\xb4\xcb\x84\x8a\xae\x98\xaa\x92\x86\x78\xe9\x1a\xa9\x60\x52\xfe\x88\xf6\xf7\x01\x5b\xcd\xce\x53\x7e\xf4\x29\x1f\xb9\xd9\xf2\xf1\x3b\xb6\xdc\x8e\x99\x16\x7a\x56\x36\x98\x0e\x3d\xae\xb2\xd5\x10\x4d\x65\xe6\x44\x05\x34\xed\x3c\x15\x42\x56\x95\x06\xb1\x7d\xdc\x74\xa8\x51\x4b\xb9\xcc\x25\x31\xc5\x54\xe1\xd5\x88\xb6\x55\x0a\x66\x0d\x16\x4e\x5c\x61\xcd\xb7\x58\x11\x5f\xf1\x4e\x78\x2d\x96\xdf\xdd\xfc\xd2\x0d\x01\xe1\x0b\x19\xe0\x66\x82\xf7\xca\xb6\x63\x6f\x1d\xb6\x28\x69\x1b\x61\x87\x49\xca\x6b\xc0\x4e\x50\xf1\xd4\xd5\x14\xb2\x44\x87\x9d\xd2\x3c\xb5\x03\xbe\xfa\xba\xa1\x03\xd7\x9d\x68\x5b\x84\x47\x2b\xd5\x45\x2e\x63\x2d\x14\x0c\xa1\x5e\xb8\xab\x50\xa9\x28\xc1\xa1\x01\x1e\xdc\xee\x21\x4a\x7f\x0f\xb1\xbf\x65\xd1\x9f\x57\xdc\xe3\x6f\x86\xe8\x9b\x49\xb4\xcb\x39\xd6\x25\x0f\x7b\x4b\x78\x7f\x26\xbc\x88\x4d\x4c\x4f\x8a\xb5\xc9\xe9\x2c\xe6\x3e\xe9\xc3\x5c\x2d\x53\x28\x16\x75\x50\x42\x51\x25\x31\xb5\x6a\x61\xcb\x58\xa2\xae\x98\x44\xc9\x42\xe6\x06\x67\x94\x94\x90\x41\x10\xda\x66\x29\x41\x7a\x9b\xe4\x95\x1e\xad\xe7\x12\xbb\x65\x86\xbe\xda\xf4\x67\xae\x44\xee\x9e\x8d\x8a\x39\x36\xb8\x0a\x4d\x43\xc8\xe9\x1a\xe4\x94\xf8\xab\x1a\xdb\x56\x73\xac\x27\xde\xeb\x2e\x24\x6c\x99\xc2\x66\x21\x07\x22\x0d\xb6\xb2\x2c\x5a\xbd\x88\x65\xcc\x52\xdc\xa2\xb9\x22\x2c\x2c\x5d\xe7\x06\x25\x19\xc4\x90\x84\xaa\x5d\x08\x54\x1b\x86\x1a\x05\xe2\xd8\x1c\x2a\x3f\x66\x7f\xe3\x57\xdc\xab\x98\xf3\xf8\xee\x70\x0c\xf6\xc7\xf7\x10\xee\x3f\xfc\x67\x78\x19\x74\xee\x02\xd5\x76\xf2\x14\xe2\xb9\x17\xdd\x49\xda\x34\x81\x0c\x4a\xea\x3a\x77\x3a\x39\x55\x41\x0c\x59\x48\xcd\x52\x1b\x5f\x34\x7b\xa8\x88\x9b\xad\x68\x3b\xd5\xa8\x4e\x8a\x3c\xcd\xae\x81\x34\x06\x92\x6b\xd0\x08\x39\x39\xb6\xd0\xaa\x0a\x6b\x47\x36\xde\x28\x1f\x0b\x47\xfc\xaf\x8b\x85\x3f\xbd\x8a\x85\x4b\xc5\x95\xd0\x60\x24\xe7\x95\x2e\x54\x92\x5a\x23\x84\x56\x46\xcc\x30\x18\x77\x32\xc6\xd3\x64\x7d\x0d\x85\x79\xd3\xb8\x09\xe7\x99\xee\x44\x6d\x47\x55\x4d\x4e\xbd\x0a\x85\x9f\x73\xc5\x5b\x6e\xfb\xdd\x2d\xce\x7b\x65\xcb\xb3\x2f\xfc\x2a\x2c\xdf\x0d\x92\x2b\xae\x61\x54\xaa\x12\x46\xa8\xac\x9d\xd8\xd8\x98\xbe\x82\x34\x4c\x8c\xd3\xc6\xe7\x75\x0e\xac\x74\xbd\xad\xba\x93\x1d\xf9\x30\xb8\x31\x23\xe7\x56\xb7\x67\x37\xd9\xea\xec\xf4\x82\xb8\x08\x07\x97\x03\x0e\x76\x51\xb7\xc6\xb8\xfe\x4e\xf2\x4d\xf0\x37\xbf\x3d\x67\x9f\x57\xdb\xf1\xc3\xa7\xe8\x05\xea\x77\xdf\x14\x29\x18\xb3\x70\x03\x32\xcd\x00\x19\x23\x64\xd3\x33\x35\xd0\x93\x8c\x32\xd7\x82\xbd\x14\xa0\x5d\x7f\x90\x5c\x3a\x33\xce\x20\x2b\xea\x0a\x3b\x88\xbe\x27\x72\x12\x5a\x3a\xad\x1d\xd7\x1a\x74\xb0\x0f\x3b\x9f\x17\xdb\xc6\xe5\x3f\xbd\x9c\x2f\xf0\xd3\x9b\x63\xf8\x3b\x78\x77\xfc\x61\x7f\xfc\xf0\x8c\x53\x09\xa2\xfb\x5f\x3e\x1c\xd6\xc8\x64\x27\xa5\x1d\xab\x2e\xcc\xc6\x9e\x37\x73\x65\xf3\x33\xa4\x94\xd9\xe5\x64\x15\x81\xba\x8e\xe2\xa1\xb1\x3c\xcc\x96\xd3\x81\x32\x37\x0c\xba\x86\x7c\x70\x13\x87\x18\x02\x37\x16\xa5\xeb\x6b\x53\xfa\x81\x39\x33\x05\x85\xeb\xeb\x69\x5c\xf0\x3a\x8b\x37\x3e\x87\x7f\x66\x7c\xf6\xc7\xf7\xeb\xf8\xbc\xaa\xec\xdf\x31\xa5\x6b\xd1\x86\x69\x53\x0b\xdd\x09\x5d\x9c\x20\xad\xdc\x79\x6c\xce\x1c\x48\x48\x8d\x43\xc6\x78\xca\x55\x86\xdd\x60\x79\x7b\x32\xa3\x18\x7a\x77\xca\xc9\xdc\x98\xf6\xec\xe6\xba\x82\xc0\xa9\x05\x55\x3c\x5c\xfd\xb9\xf2\xa6\xbf\x7e\x34\xbb\xc9\xdb\xf2\x07\x7f\xbb\xf0\x94\x65\x7d\xb9\x9e\x5e\x74\x10\xdc\xbf\xff\xd9\x77\x50\xd8\x8b\xde\xcd\x15\x04\x11\x3a\x0f\x7c\x9c\x4e\x6b\xc0\xae\xa0\x67\xa3\xbd\x48\x3b\x91\x50\x5c\x83\x1d\x72\x83\x3b\x9f\x3a\xaf\x9c\x3a\xb1\x51\x6b\xde\xaa\x4e\x0d\xa6\x28\xf2\xdc\x9d\x8c\x65\x8b\x64\x2c\x94\x5c\x43\xe6\x26\x3b\x0c\x8b\x05\xe4\xd7\x79\x70\xa5\xc7\xd6\xef\x3f\xeb\xde\xfc\xe0\x75\xe1\x77\xef\x8e\xbf\xfc\x17\x78\x17\xee\x3f\x7c\xda\xbf\xb6\xeb\x70\xfc\x10\x1c\xef\xdf\x7f\x08\x57\xc3\xf6\x16\xe2\x93\x18\xaf\x81\xb3\xaa\xbb\x06\xd5\x09\xb4\x4e\x52\xc8\x41\x56\xca\x2c\xa5\x41\x25\x03\x49\x22\xbe\x1a\xa6\xc2\x6e\x29\x0f\xc4\x0e\x72\x34\x1c\xbb\xa9\x31\x32\xc7\x59\xe6\xc6\x93\x61\x4b\x20\x44\x38\x14\x85\x86\x60\xea\x66\x77\x5e\xf0\xb6\x37\x06\xd5\xb5\xdc\x07\x07\xe9\x99\x04\xfe\xfe\xc5\x7d\xc2\x2b\x5e\xa2\x27\xf7\x7b\xab\x66\x4e\xd6\xe1\xfd\xa1\x86\xb3\x0f\x03\xa0\xb5\x48\xb6\x96\x35\xc3\xec\x24\x06\xd4\x6b\x5b\x8e\xad\x40\x97\x39\x3c\x59\xeb\x72\x2b\x3b\x6e\xc4\xde\x32\x52\x54\xc2\xd4\x92\x32\x2d\x98\x61\x9a\x54\x08\xa9\x92\x30\xb9\xe8\x4b\x1d\x61\xa7\x5c\x23\x25\x83\x24\xf8\x37\xe1\x74\xe5\xc7\xfa\x60\x6e\xf7\x1c\x4f\x6a\xfa\xdb\xcd\x9f\xbf\x81\xf0\x38\x31\x8f\x1f\xbb\xdb\xb4\xc0\x3d\x42\xf6\x45\x25\xf4\xfd\xdb\xfb\x3d\x2f\x52\x98\xbf\x50\x98\xd3\xd4\xe9\x5d\xfc\xe5\xac\xc3\x71\xc9\xf9\x4d\xc5\xdc\x35\xeb\x38\x9a\x27\xce\x0c\xd7\xef\xda\x2f\xf8\x60\x08\x15\xa2\x2c\x5c\xbf\x70\x01\x16\xbb\x99\x32\x87\x5c\x00\x05\x73\x27\xe6\x46\xf9\x74\xd6\xd2\x5d\x70\xc8\xbd\x56\xdc\x4d\x99\xe5\x7b\x77\x44\x9f\x1f\x6e\x5a\x8b\xfe\x8a\xe8\xf1\x63\xf4\x74\x45\xd4\x86\x13\x63\xae\x48\xf3\x30\x35\xae\x36\x39\x12\x9a\xe8\x2e\x4d\xdc\x04\x59\x72\x02\x1e\x9f\xe6\x38\x81\xd8\xb5\x6b\x2c\x7e\xc8\x5d\xad\x9d\x65\x64\x29\x2a\x1e\x66\x25\x92\xa6\xd7\x8c\xeb\xbe\x62\xbd\xab\x39\x1b\x2e\x29\x6c\xbc\xbd\x11\x5f\xfb\x6d\x3f\x05\xbf\xf7\x75\x8c\x4f\x6c\x78\x37\x70\xeb\xfe\xe5\xae\x64\xbb\x73\x15\xc6\xdd\xa2\xa3\x9c\xea\xa1\xc3\xa7\x85\x47\xc4\x19\xb0\x5f\xce\xd0\xbb\x36\x92\x06\x1b\x09\x56\x8b\xb1\x26\xdc\xe8\x93\x76\x58\x6b\x68\x57\x5f\x3f\x4a\x8f\xf2\xa0\x7c\x0e\xe4\x05\x72\xef\xdb\xbc\xdb\x3a\x42\xa1\x65\x25\xb4\xac\xd0\x39\x02\xbd\x04\x61\xbd\xd0\x08\xfd\x29\x88\x8a\x85\x86\xf5\x12\x43\x5f\x94\x07\xc5\x25\x97\xa8\x22\x4a\x48\xa1\xfc\x83\xe0\xa7\xba\xf3\xa3\x0e\xcf\x37\x4f\xe6\x37\xed\xbc\x7d\xc5\x91\xf5\x21\x3c\xe1\x12\x30\xca\xeb\xbc\x00\xbd\x70\x4f\x13\x51\x5c\x06\x7b\xa9\x23\xea\x81\x58\x04\x6a\x12\x9e\x99\xa8\x78\xc1\xb0\x60\x92\x29\x63\x14\x93\x4c\xc8\x20\x0c\x14\x98\x23\x3f\xe8\x60\x7f\x7b\xab\x9b\x77\xf0\xdd\xd7\xfa\x14\x36\xb4\xa8\x0b\x1a\x55\x96\x12\x68\x96\x6c\x75\x83\x22\xf4\xa7\x34\x4a\x17\x1e\xea\x05\x45\xad\x3e\x68\xa1\x91\x16\x05\x35\x5c\xcf\x7a\xd6\xfe\x51\x3f\xe9\x76\x93\xa3\xf6\xe8\xfd\xed\xae\xf6\xb9\xbd\xaf\x7b\xe6\x8d\xd1\xdf\x6a\x66\x88\xf9\x82\xb5\x10\x4a\x47\x23\x27\x35\xae\xdc\xc8\xf3\x26\xaf\x00\x77\x27\x7a\xea\x4a\x72\x0d\xb4\xa8\x6b\xdb\xe1\xde\xe6\x6d\x8b\x86\x66\xd3\xb3\xbc\xe2\x28\xf1\xb5\x15\xbe\xb2\xf4\xee\x61\x83\xd2\x79\x8e\x97\xc7\xbb\xfb\x50\x18\x33\x24\x27\xd6\xc4\x75\x98\x38\x62\x20\x3d\x88\xf3\x10\x8e\xcb\xb8\xba\xb7\x83\x86\x24\x94\x2e\xf1\xbc\xd9\xe5\x11\x45\xcd\xb3\xce\xfd\xc7\xe0\xff\xbb\x45\x59\x3e\xc3\xf9\x12\x19\xb7\x0e\xc7\xe1\xf8\xe1\x9f\xe0\xcd\x3a\xeb\xf6\x9f\x3e\xdf\x1f\x7e\xff\x42\x8c\xe5\xfe\xc7\x9f\xdf\xde\x7f\x0c\x4f\x36\x0f\x49\x96\xc3\x48\x08\x33\x59\x5d\x16\x2e\x35\xcb\x5c\x74\x5c\xd3\x18\x95\x1c\x78\x58\xa1\x7c\x99\x49\x91\xc2\xe8\xf2\x90\xdf\x4a\x75\xd2\x50\xc2\x14\x35\x19\x12\x45\xb1\x54\x84\x24\x2a\x29\xca\xa6\x69\xb1\x2e\x7b\x40\x59\x2a\x15\x2b\x0a\x9c\xce\x55\x55\xb9\x8e\x21\xc4\x98\xaf\xb1\xdd\xee\x03\xdf\x05\x7f\xb8\xed\x1c\x7e\x44\xc3\x57\xf9\xae\x5b\x95\xf6\xba\xb3\xbd\x3c\x9b\xce\x36\xcd\x60\xe2\xd6\xf6\xf8\xd4\xda\x19\xf5\x9a\x91\xbc\xa8\x5a\x46\xb9\xc6\x4e\xae\xab\x96\x1a\xaf\x47\x7e\x90\x39\xc1\xca\x9d\xad\x28\x0d\xd1\x8a\xe8\x72\x75\x7c\x0a\xde\x33\x23\x6c\x73\x99\x97\x8c\xf3\xf0\xe4\x32\xa0\xeb\xfa\x9c\x7c\x5d\x27\xf6\x0a\xa8\xaf\x2a\x72\x7d\x7d\xd0\x37\xff\xbe\x43\x50\xfa\x2c\x25\xf0\x8b\x04\xee\xba\x18\xb0\xf5\x2c\xdf\xf2\x42\x40\xbb\x76\x5f\x42\xec\xce\xda\x9d\x8d\x81\x78\x89\x21\x71\xb3\x71\x93\x31\x90\x6e\xf7\xb7\x38\xb2\xbe\x9e\xfb\x1f\x5e\x31\x37\x3c\x78\x38\xeb\x8b\x12\xdc\x87\x8f\x8f\xbf\x7c\xf0\xab\x09\xd6\xdd\xea\xa7\x0e\x62\xe3\x93\xdd\xa5\xcc\x72\xe1\xce\xab\xcb\x66\xdc\x08\xf9\x2c\xf2\xa2\x02\xe2\xce\x10\x28\x14\xbb\x73\xbe\x6f\xfa\x5e\xf7\x5a\x73\x3d\x6a\x27\x40\xe9\xf5\x48\xd4\xfd\x52\x0f\x85\xf0\xb5\x9b\xe8\x86\x97\xfa\x83\x9f\x35\x3f\xbc\x39\x06\xd1\xf1\xee\xf3\x77\x0a\xcb\x0f\xad\xd0\xd9\x54\x5d\x83\x5c\xb0\x92\x53\x24\x72\xca\x31\x9f\xe4\x00\xe2\x20\x44\x71\x89\x97\x49\x86\xe9\x8e\xa6\xbf\x36\x68\x2e\x66\x37\x22\x5f\x49\x6e\x12\x67\xb7\x4a\xf2\x26\x9c\xa0\x2b\xd6\x36\xcd\x15\x1d\xbb\x03\xf3\x7e\xc8\xab\xc2\xf5\xbb\xe4\x87\x77\xc7\xf0\x6f\xe0\xf8\xaa\x74\x73\x9f\x49\x25\x05\x18\x20\x82\x10\x2e\xe5\x6c\x51\x9e\xe6\x15\x41\x22\xa5\x1c\xef\x59\xe2\x9a\x05\xb9\x64\x6d\xa1\x87\x2e\x67\x72\xdd\xa5\x5d\xbc\xcc\x33\x87\x26\xb2\x90\x64\xbf\x36\x69\xca\x69\xd1\xcf\x48\xa0\x62\xdd\xbb\xa2\x5d\xe6\xb5\x44\x98\xcf\x3c\xde\x62\xe8\x1f\xdf\x3d\xbe\x7d\xf8\xe1\xcd\x06\x53\xf1\xf9\xc7\x67\x51\xe7\xf7\xd1\x2f\x1f\x0f\x4f\x19\xc8\xc3\xa0\x2a\x1d\x9f\xc6\x14\xa5\x59\x92\xc8\x44\x33\x5d\xb8\x93\x11\xa9\x1d\x31\x8c\x59\x22\x4c\xa3\x39\x13\xea\xc0\x64\x91\x9d\x3b\xe3\xaa\x6b\x60\x78\x95\x39\x05\x2c\xd4\x8b\x40\xa5\x66\x18\xef\xeb\x74\x19\xdb\x29\x8d\x9d\xbc\x50\x84\x05\x45\x9e\x5f\xdd\x5e\xcb\xc3\x79\x87\x9e\xd7\xf3\xa7\x67\x65\x8d\xb7\xc7\xdf\x22\x5d\xd7\xc5\xe1\x65\xb8\xdf\xaf\xdb\xef\xfd\xe1\x45\x49\xc1\xfd\xdb\x6d\x41\x57\x36\xc9\xc2\x86\xc1\x40\x30\x33\x69\x8d\x0a\x97\x1b\x97\x16\x3d\x3f\x23\xc4\x21\xcb\x43\x8e\xf2\xa5\x61\xbe\x0a\x27\x64\x30\x7e\xe9\x60\xd8\x7e\xda\xa1\x3c\xcf\xb9\x5a\xd2\x4d\xbe\x8e\xba\x33\xc4\x5a\x08\x0d\xe5\x9c\x67\xc2\xaa\xb2\xac\xdc\x24\x84\x70\x5a\xa4\x88\x78\x42\xea\x30\x7a\xc2\x95\x3f\x71\x64\x3c\xde\xdd\x47\x8f\x6f\xef\x7f\xb8\x31\x4c\x78\x92\xd2\xbb\xbf\x87\xbb\x1f\x8f\x8f\x6f\x76\x18\x62\x0b\x38\x93\xce\x8a\xb3\x98\x05\x9d\x15\xc4\xc8\x9d\x00\xb9\x33\xd4\xb1\x49\xf7\xc5\x6b\x7e\x0c\xeb\xd8\x6b\x7e\x0c\x68\x56\x37\x6d\xf4\xb8\x60\x11\xfc\x5b\xbf\x97\x7e\xfa\x7c\xf7\xb8\x55\xdf\xec\x46\xdb\x28\x6b\x9b\x13\x3e\x64\x5f\x08\x2a\x76\xf6\x3c\xc0\xb9\x2c\xf1\x0d\xff\x5e\x79\xfd\x8c\x4d\x8f\xf9\x45\x3f\xbf\xda\x38\x3f\x6e\x98\xc6\xf0\xb8\x4e\xd2\xe7\x8d\xf3\xb8\xdd\x93\xdd\xfb\x7b\xb2\xb7\x6b\x3f\xef\x84\x4d\x52\x68\x50\x09\x25\xc1\x25\xcb\xaa\x22\x77\xb3\x59\x57\x8b\xae\xd3\xac\x82\x00\x2a\x5c\xb8\x1e\x17\xf1\x3c\x83\x82\x64\xa9\xb6\xef\x07\x91\x17\x48\x55\xe4\x0b\xa5\x34\x31\x49\x01\xa9\x2f\x80\x9a\x06\x0a\x04\x04\xd8\x34\x15\xb3\xa1\x54\x16\x4e\x9f\x4e\xa7\xa5\x9e\xa4\x9c\xa6\xe0\x10\xe2\x2b\xde\x93\x03\xff\x9e\xfd\x9e\xc9\xf7\x05\xf1\xcb\xdb\x87\x8f\x0f\xcf\xf6\x7f\x7a\xe7\x25\x27\x57\xfb\x1f\x6f\xf7\x7c\x6f\x3f\xbf\x7d\xfc\x18\x09\x95\xa4\x10\x90\x1e\x97\x58\xa4\xb2\xc8\xb9\x94\x99\x10\x26\x49\x58\x37\x16\x59\x8d\x8a\x5c\x88\x33\x77\x66\x7d\x1e\x78\x8e\x10\x4f\xeb\x2f\x78\xdb\xe9\x01\x9f\x4e\xee\x34\x61\x20\x20\x61\x4c\x13\x36\x5a\xca\x44\xe9\xf4\x38\x8e\x4b\x3f\x6a\x3d\x8e\x1b\x67\x7b\x71\xe4\x07\x19\x3c\xbc\x3e\xab\xfe\x42\x9f\x7f\xfa\xda\xe7\xc7\x57\x73\xdb\x77\x39\x32\x49\x1a\x26\x45\x01\x29\xc1\x44\xe6\x06\xe5\xae\xd5\x6e\xc8\x47\x3e\x67\x19\x85\x04\xc6\x32\x77\xa5\x2d\x3d\x39\x6a\x0d\x78\x89\x57\xaf\x7f\xfd\xe9\x20\x8b\x3c\x57\x9c\x7e\x21\x5b\x75\x05\xa4\xbe\xdc\x64\x18\xe5\x14\x26\xd0\x66\xa9\x1e\x4f\x8c\x75\x4f\x7d\x4e\xe9\x34\x05\x51\x50\x5e\x71\x24\x0f\xdc\x2b\xfe\xdc\x4e\xab\xbb\xdf\x70\x7c\xaf\xf3\x7b\xb5\xf9\xff\x0d\x5f\x33\x98\x51\xca\x94\x85\xc2\x0d\xb5\x60\x8c\x59\xa1\x78\x6f\x5d\x0f\xa5\xd0\x14\xc6\x51\x94\x58\x50\x97\x93\x42\x16\xf8\xc0\x79\x59\xb8\x5c\x23\x0f\x88\x5f\xe2\xb0\x3e\x2b\xd1\x83\xd0\xab\x51\x0a\x77\x79\xaf\x4a\xcb\x84\x42\x5b\x4e\x69\xb3\xa9\x3e\xf0\x67\x3c\xfc\xb7\x36\x85\x4f\x36\xed\xbf\x31\x09\x33\xd3\xac\xab\xab\x55\xac\x12\x46\x1a\x3e\xd6\xae\x05\xe2\x4e\x14\xe6\x49\x62\x2a\x2a\x17\x13\x24\x11\x79\x32\xa9\x30\x46\x19\xbe\x04\x61\x73\x0d\x9e\x6c\x42\xdf\x98\x04\x1e\xe7\xb6\x71\xdf\xbe\x3a\x3d\xef\x9e\x0f\xb3\x1b\x5d\x4d\x07\x66\x63\x3c\xe2\x4e\x43\xe3\x88\xf1\x9a\x0c\x0a\x84\xab\xf6\xd8\x17\xfc\xdd\xbe\x12\x98\x35\x14\x1b\x44\xc7\xf3\x57\xa3\x63\x73\x28\xbd\xf6\x40\x00\x21\x6c\x42\x3d\x0f\x9e\x7f\xc7\x3b\x06\x7d\x7c\x0d\xf8\x18\x65\x33\x85\x80\xba\x51\xcc\x2e\x83\x53\x94\x2d\xd2\x19\x05\x45\x58\x87\xf5\xe5\xb4\x34\x63\x03\x41\x38\x86\xca\x25\xb7\x3e\x1c\xfe\x35\x7d\x58\x31\x8f\x78\xaa\x3b\xc5\xb8\x30\xda\xf2\xb1\x75\x35\x54\xae\x27\x61\x70\x16\x98\x09\xbe\x4c\xb4\x94\x25\x7d\xee\x43\x6b\xa5\x11\x4b\x10\xb6\xab\x57\xd8\x81\xfc\x4e\x1f\x46\x81\xda\xd1\x23\x3b\xd8\x5b\x1e\x23\x80\xb7\xde\xef\xf9\xb8\x85\x7d\x37\x45\xa7\xdd\xfe\xf8\xfe\xe7\x23\x31\xbf\x2a\x13\xc5\x69\x6a\xf3\xd4\xf5\xf4\xec\x30\x06\x1b\x72\xa8\x80\x61\x67\x9d\x3e\xe4\x73\xc5\xcf\x79\x56\xa0\xd2\x56\x82\x70\x2c\x10\x17\xa2\x5c\x7d\x77\x28\x8e\x72\x27\x6f\xef\xbb\xff\xaa\x89\x7f\x53\x60\xdc\x60\x62\xf7\xb7\x46\x1f\x3f\xee\xf6\x1f\xb2\x43\x4c\x66\x37\x0d\x0c\x59\x84\x80\x2f\x72\x86\x16\xb9\xe0\x6c\xdd\xc9\x21\x06\x1a\xe2\xa5\x06\x96\x17\x92\x97\xc3\x35\x70\x63\x11\xd2\x9d\x54\x69\xd2\x31\x86\x70\xa9\x74\x6e\xf0\x30\x41\xdc\x0b\x49\xa5\xca\x52\x52\xe2\x36\x89\x55\x10\x85\x32\x0c\x8e\xfa\x40\x5e\xf4\xff\xfe\xee\xc9\x92\x1b\xe4\xf8\xf3\x6d\x59\xbd\x02\x4b\x1e\x46\x3c\x5c\x83\x30\x70\x56\x43\xc2\xdd\xa9\x31\xd6\x75\x14\x72\xe9\x74\x18\xf4\xa7\x02\xce\xa0\x54\x89\x15\x5d\x0c\x41\x32\x27\x07\x22\xf3\xd4\x35\xda\x2a\xd9\x4d\x4e\xc3\xea\x9a\x4b\xd1\x6a\x28\x93\x58\x8b\x42\x51\xcc\x4a\x5a\xe1\x8a\x06\x10\xa6\x01\xf3\x79\xff\xc7\x0d\xa5\x79\xf7\x9a\x5b\xfb\x15\xce\xe5\x05\x02\xf2\xe3\x7d\x78\xf3\x96\x4e\xd4\xb1\x65\x80\xce\x49\x90\xc6\x63\x19\x1a\x47\x40\x31\x56\xe0\x94\x16\xe8\x6c\xce\x1a\x94\x2b\xe3\x91\xb7\x21\x3d\x08\x49\x52\x27\x37\xde\x6c\x25\x9d\xa0\x24\x56\x71\x39\x2d\x63\x98\x3b\x12\x16\xd2\x49\xd7\x56\x50\x00\x0d\xab\xf8\x89\x7b\xbc\xf4\x5a\x68\x77\x9e\x11\xe7\x7e\x43\xab\xbe\xdd\x7c\xa9\x47\xef\x28\xff\x43\x78\xf7\xf8\xb2\x02\xe6\x20\x20\xbb\xcc\x52\xf1\x79\x8a\xc4\xd9\x54\x15\x64\xaa\xc0\x12\x2f\x1a\xa5\x2a\x45\x91\xd0\x67\xa7\x5d\x57\x41\x0c\x25\xa8\xb0\xd0\x7a\x19\xa0\x2f\x7a\x4d\x54\xa3\xdb\xbc\xdd\xf8\x85\x91\xe7\x8c\xf9\xa6\xdd\x67\xc1\x2c\xcf\x02\xf9\x0f\xf0\x4d\xc3\x09\xf0\x4b\x32\xca\x0e\x88\xd3\x3b\xeb\x8c\x31\x06\x88\x29\x99\x62\x97\x33\xc9\x75\x4e\x22\xae\xaf\x81\xb3\xae\x63\x10\x03\x02\x1d\x22\xad\x97\x1e\x06\xd4\x4b\xa2\xac\x6e\x7d\x45\x6e\x14\x91\x2b\xf1\xbe\xc5\x1f\x83\x4f\x5b\x05\xd8\x57\xe6\xe2\x4f\xcf\x82\xf4\x5b\xe5\xc1\x6f\xd0\xb3\x1b\x07\xc9\xfe\xe3\xfd\x71\x2b\x50\x8e\x24\x14\x69\x72\x0d\x20\x4b\x62\xa7\x40\x25\xb1\x8d\x13\xe8\x5d\x9e\x41\xeb\x8a\x3c\xa4\x7d\xd7\x61\xe9\xeb\xab\x90\xab\x2a\x25\x3a\x7e\x0d\xc2\xc1\x8d\xc8\xd7\x2f\xd1\xa8\xc2\x44\x13\xa2\x29\x8b\x19\xd1\x56\x1b\x6d\x95\x63\x15\xcd\x4c\x8e\x41\x4d\x7d\x05\x39\x60\x6b\xed\x70\xbb\x65\x5e\xf7\x6a\xb5\xfa\x1c\xbb\x36\xf8\xe3\xed\x26\xf5\xfe\xf3\xbb\x1f\x37\xca\xec\xa7\xc7\xb7\x13\x6b\x13\xd5\xbe\xf7\x08\xb2\xf5\x45\x37\x04\xeb\x76\xc3\x14\x87\x65\x62\xe2\x08\x5d\x9a\x38\x89\x92\x4b\x9f\xa4\xbb\xc0\x75\x6b\x58\x40\x2d\x23\x59\x55\xd1\xcb\x6c\x4f\x1c\xf2\xc6\xd1\x30\x28\x1c\x85\x31\x4e\x96\x31\xcc\x50\x12\xd6\x8b\x51\xc4\x60\xb9\x23\x55\x52\xe4\x0a\x15\xaa\x28\x34\x53\xd7\x80\xd1\x44\x27\xf8\xd4\x28\x55\xcf\x9a\xa9\x02\xb9\x8c\xc6\xcc\x4d\x95\xa0\x82\xaf\xef\x40\x83\xee\x68\x0e\xca\x9f\xde\xff\xbf\x35\x6a\xf9\xf4\xf9\xdd\x8b\x8e\xbf\xc1\xfc\x5e\xbe\xc1\x7e\x4b\x71\x6c\x59\x96\x7b\x58\x83\xd0\x6d\x08\xba\xb0\x8f\x13\x93\x44\xc1\x65\xca\xc2\xe9\x32\x17\xbb\xc0\x99\x75\xeb\x27\x4a\x54\xa9\x90\xe8\x32\xb7\x6e\x66\xc0\x86\x65\x0c\x55\x96\x2e\xe7\x10\x65\x0b\xd9\x0d\x4b\x1b\x63\xc2\xa8\x22\xd5\x21\x46\x38\xe1\x46\x28\x61\x84\x3a\x6d\xbd\xdf\xf7\x56\x76\x90\x1b\x54\x2a\xb1\x08\x91\xb2\x9a\xe9\x4a\x8a\x20\xf2\xdc\xc1\xc6\xcf\x9f\x5b\xff\x7f\xfa\xf8\x78\x78\xfb\xd4\xf7\x7f\x61\xda\xac\xd6\x3f\x7c\x63\x7d\x84\x80\xc5\x36\x0e\xd1\xd2\xc6\x49\x98\x2f\x5d\x1e\xf6\xa7\xd3\x89\x08\x46\x52\x56\x15\x2e\x60\x5a\x9d\xc4\x35\x58\xa7\xd9\x0c\x49\xe2\x9a\x70\x72\x32\xcd\x08\x2f\x65\x59\xed\x3b\xca\x18\x35\x04\x2b\xab\xad\x5e\x27\x4e\x6a\x32\x0c\xaa\x6f\x09\x24\xb0\xce\x2c\x65\x96\xc4\x12\x32\x72\x41\xe4\xed\xde\x66\xba\x9d\xad\x8f\xdf\xda\xff\x34\x7f\x7e\x6b\x7f\xf8\x5c\x26\xbd\xd5\x4a\xc3\xd7\x05\x60\x81\xc6\x36\x86\xd1\xa5\x09\x0c\x2e\x4d\xd2\x90\xb5\xeb\x9c\xa7\x38\xa5\x0c\x39\x2c\x1a\x05\xb1\x9c\x21\x4d\x93\x33\x24\x49\xec\x9a\xb0\x71\x5d\x29\x56\x3f\x85\xee\x07\x42\x29\xd1\xb5\xf2\x8f\xd5\xfe\x44\xc7\x25\x28\x77\x9e\x08\x94\xa0\x35\xa1\x8a\x92\xcb\x5c\xd7\x03\xe3\xb8\x62\xb7\x5a\xa6\x8d\x2b\xee\xa5\xfd\x5f\x17\xc0\x9f\xeb\xff\xe0\xcd\xd7\x45\xfe\xc2\xfe\xd0\x42\xbf\xf6\x3f\x59\xea\x64\x1d\x85\x3a\x0b\x4f\xa7\x69\x22\x1a\xa3\x8c\x10\xbc\x4c\xde\x7e\xe5\x6a\x50\x69\xe2\x6a\xe0\x49\xec\xca\x88\xbb\xaa\x94\xb4\x14\x88\xed\x07\x4a\x08\x5d\xed\xac\x75\xad\x5d\x55\xad\xee\x77\x09\xf2\x7c\xc2\xeb\xfe\xf7\xe2\x05\xb8\xc4\xeb\x08\x80\xd7\xea\xa8\x77\x76\xbb\x47\x7c\x79\x16\xbc\xbd\xbf\xfb\xe9\xf1\xfe\x78\x9f\xbd\xff\xf0\xc4\x82\xf6\xd3\xbb\xed\xc8\x08\x67\x18\x8d\x4f\x95\x24\xcb\x79\x0d\x60\x84\x81\xa2\xb8\x06\x8e\xbb\x91\x95\x44\x9c\x32\x9d\xa0\xaa\x5f\xe6\x30\x76\xf9\x2e\xb0\x56\xd7\xba\x96\xee\x1c\x1b\xc2\x38\xe3\x10\x00\xca\xac\x14\x79\x98\xeb\x3a\x08\x00\xce\x57\x7a\x54\x87\xed\xdc\x7e\xf8\xe8\x35\x26\x6e\x9c\x39\x4f\x9f\x9f\xfe\x1e\xbe\xb1\x24\xaa\xce\x63\xd3\x68\x63\x1a\xad\x94\x01\x09\xa2\x70\xad\xe3\x6e\x10\x79\x29\x74\xa6\x92\xac\x40\x11\x51\x90\x78\xc1\x36\xb5\x7e\x9d\x85\x13\xc4\x9a\xce\x98\x12\x04\xc8\xdc\x1a\x5a\xfa\x7c\x41\x7a\x9b\x83\xf9\x77\xfc\xbb\xb5\x0f\x1e\xb2\x5f\xbe\xe9\x83\xbb\xfb\x68\x00\xe2\xc9\x00\x6f\x14\xe1\x9c\x29\x08\x50\xef\xba\x99\x94\x94\x77\xb9\x4a\x32\x22\x3c\xe7\x43\xb3\xe7\xb7\x84\x89\x76\xb3\x76\x32\xb1\xc2\xb6\x9a\x03\x86\x36\xeb\x6c\x87\xa2\x58\x83\xe7\x2f\x0c\x36\x3f\x50\xac\x7e\xf8\xcf\xdf\xb4\xf7\xf0\xf1\x26\xd9\xe8\x01\x7e\xbe\x4b\x76\x5b\x9f\x40\x91\x97\x42\x24\x3a\x4e\x0a\xe4\x46\x48\xa6\xc9\x8c\x23\xc4\x53\xd7\x31\x60\x70\x5a\xdd\x19\xb9\x28\x57\xb6\x63\x2d\x80\x43\x9f\xd5\x86\xa2\xb0\xd2\x10\xe8\xf3\x59\x5f\x83\xf5\xcb\xd5\x25\xaa\xad\xbf\x5b\x56\x7e\x3e\xa7\xc1\xef\x82\x5f\x36\x3e\xfa\xaf\x99\x21\x78\x7c\xfb\x02\xbb\x15\xbd\x84\x85\xc2\xfd\xdb\x1f\xb7\x64\xdf\x2e\x88\x52\xd7\x83\xb8\x70\x10\xae\x03\xa2\x73\x54\x61\x41\x95\xd0\x64\x54\x44\x60\x94\x95\x38\xcf\x5d\x05\x55\xa3\x58\x87\xc7\x43\xba\x76\x8c\x86\xd8\xa1\xae\x62\x52\x50\x2b\xdb\xca\xd6\x50\xb8\x92\xaf\xb3\x37\x43\x61\xa3\xb0\xe3\x46\x76\x50\x04\xbb\x68\x5b\x6f\x99\xaf\x0d\xff\xbb\xe0\x3f\x6f\x16\x46\xf7\x6f\xef\xf7\x7f\x8d\x75\xd1\xe8\x35\x6d\xa2\xf6\x82\xc1\x98\x1c\x71\x22\x98\x12\x86\x4c\x8a\x70\x82\x33\x42\xb2\xcc\x55\xc0\x7a\x43\x47\x32\x1c\xb2\xd5\xb4\xc2\x9b\xc5\x8c\x6c\xb9\x6d\x21\x77\x88\xd3\x54\x27\x29\x0a\x5b\x89\x1d\xd7\xa2\x87\x7c\xe3\x9c\x2f\x9f\xeb\x00\xee\x82\x77\xc1\xff\xfc\x5e\x25\xcc\x0d\x2f\xe4\x73\x40\xbf\x87\x4d\xdd\xee\x7d\xf4\xf0\xe4\x0c\x6e\x75\xd2\xdb\xe3\xdd\xe1\xf8\xf3\xa7\xcf\xef\x82\xfd\xfb\xcf\x1b\xfd\x43\xb5\xd4\x05\xcc\xd0\x19\xc4\x34\x75\x2d\x43\x02\x55\x6e\xa4\x48\x15\x24\xc2\x86\xa9\x52\xdb\x2c\x2c\x1c\xab\xcf\xd4\x75\x7d\x2c\x1d\xc7\x90\x09\x57\x83\x4d\x93\xb6\xcb\x6a\xa3\x6d\x3a\x19\x25\x6a\x08\x44\xa5\xdc\xe4\x46\xc8\xcf\x05\x3a\x48\x29\x53\x8d\x51\x23\xa9\xa0\x7e\x5b\xcb\x58\x45\x2a\xe6\x84\xed\x88\xc8\x92\x5a\x19\x52\x6b\x08\xdc\xa9\x32\x65\xa3\x4a\x92\x26\x82\xf0\x24\x16\xbc\xcb\x2d\x4b\xd6\x53\x61\x32\x59\x5e\xa2\x60\xe7\xb9\x13\xd6\x3e\xf8\xa7\xe0\x7f\x04\xff\x33\xf8\x3f\x5f\xc6\xc1\xf7\xcf\x70\x62\x0f\x9c\x38\xbe\x14\x87\xfe\x47\xf0\x7e\xf9\x0b\x4e\x88\x4f\x9f\x7d\xbd\xfb\xd1\xe7\x7f\xa2\xc7\x4f\x9f\xff\xde\x3b\x09\x3b\xa3\xd3\x0c\x74\x5e\x40\xb6\xee\xed\x0c\xd5\x9c\x97\x14\xd5\xbc\xc6\x38\xe3\x1c\xb1\xbc\xa2\x59\xe6\x66\x57\x97\x20\x21\x49\x47\x37\x11\xc8\x4e\x69\x26\x3b\x76\x92\x67\x4c\x21\x4b\x41\x94\xb9\xab\x71\xda\x17\xf1\x35\x80\x3a\xc9\x20\x3d\xc8\xbc\x28\x04\x2e\x1d\xca\x52\x26\x2a\x45\x09\x76\xc6\x48\x0b\x32\x17\xaa\xae\x13\x9b\xb2\x0a\x9f\xb9\x12\x67\xda\x0a\x55\x35\x79\x2a\xb0\x22\x1a\x04\x52\x5d\x87\x11\x76\x6a\x3d\xf7\xda\xcd\x87\xdd\x74\xb9\xb3\x5b\xa5\xcc\x7f\xf5\xda\x61\x6f\xbf\x92\x0f\xbe\x79\xbc\x7b\xf8\xf9\x16\x2f\x7e\x9f\xe2\x75\x8f\x9d\x79\x62\x1c\x36\x66\x18\xc0\x7a\x22\x02\xe2\x9a\x30\x49\x2d\x51\x95\xa0\x95\x66\x52\x32\x2c\x10\xa1\xa9\x33\x87\x6c\x51\x27\x7d\xd2\x4e\x1e\x46\x97\x02\xd5\x8b\xd1\x80\x17\xeb\xf4\xc6\xfa\xca\x05\x55\xa5\xb2\x23\x6d\x55\xd3\xdf\xee\x6b\x56\x9f\x21\xf3\x37\x5c\xeb\xfa\xd9\x36\x94\x87\xbb\x7b\x0f\x6d\xf7\x3b\x30\xdc\xdd\xdf\x45\x53\x24\xed\x30\x98\x6b\x90\xb8\x61\xed\xcf\x7e\x68\x43\x7c\x0d\x0e\xd9\xda\xc4\xa5\x89\x88\x0b\x5c\xb3\xba\xf0\xad\x7e\xaa\x3b\xbf\xdd\x03\x90\xa8\x3d\xa4\xc1\x7f\xdf\x78\x81\x9e\x87\x7e\x3b\xe4\x7e\x7a\x9b\xbc\x18\x7a\x5f\x47\xfe\x2a\x31\xfe\xf9\xde\x86\xb3\x1b\x0a\x84\x72\x81\x25\x37\x49\xcd\x29\xc6\xa9\x52\x84\x65\x9c\x21\xd4\x8d\x04\x92\x2e\x4e\xeb\x86\x9c\x54\x9a\x2a\xc6\x7a\xe3\xa6\x43\x6a\x28\xf6\xca\xca\x35\xcb\x45\x25\x09\xae\x5b\xd7\x8f\x59\x9d\xb5\x8d\xba\x06\xca\x68\x28\x18\x39\x55\x4a\x8d\x28\x57\x48\x8a\xd3\xc6\xd5\x56\x85\xda\x9f\xdf\xff\x9f\x17\xe7\xdf\xab\xb8\x31\xf2\xba\xe5\xaf\x03\xc7\x7b\x48\x43\x63\xc3\x66\x21\x2d\x2e\x6a\x84\xc0\x2e\x76\x80\x1e\x2d\xe7\x39\xb1\xae\x77\xb4\x02\x09\xf9\xd2\x01\xc9\x0a\x49\xd0\xb8\x54\xfb\x59\x29\x39\x51\x81\xaa\x42\x49\xa4\x31\x04\x6e\x80\x6c\xe6\x1a\x1b\x85\x0a\x42\xd9\x14\x44\x5e\x6b\x43\xef\xd3\xa7\x5c\xcc\x53\xf6\x7c\x9d\x40\xc1\x0b\x9d\x8d\x8d\xf0\x61\xff\x02\x53\x36\x85\xbd\xa7\xee\x8e\xf2\x85\x42\x0a\x0d\x73\xa5\x1b\x8d\x9b\x1c\xe2\xd0\x40\xb2\x54\x51\xbe\x20\xc8\x59\x29\x11\xdd\x61\xc9\x98\xe0\x3b\x5e\xd7\xda\x29\xed\x46\xd5\xb4\xc0\x97\x3a\xac\x9c\x19\x74\x0b\xa9\x06\x91\x71\x81\x45\xe5\x23\x81\x2a\x88\xc2\xf9\x59\x3b\x61\xcb\x11\xbd\xb0\xeb\x59\xe7\xfc\x76\xe9\xf7\x2c\xf3\xb0\x21\x12\x2a\xd0\xd6\x8b\x93\x9c\x1c\x1e\x20\x23\xee\x54\xdb\x7e\x26\x90\x0d\x0e\xc1\xc9\x71\xbb\xc5\x1d\x89\xa2\x8c\xb3\xbd\x9e\x26\xe3\x36\x94\x44\x03\x68\xd1\x21\x71\xa3\xb5\x35\x50\x03\x73\xa9\x2c\x31\x8a\x90\xd6\x8b\x2b\x45\x11\xfa\x57\xdb\x54\x83\xb0\x3e\x78\xed\x1c\xeb\x20\x21\xee\x6c\x6c\x3d\xaf\x73\xca\x51\xe8\x9c\xb2\xab\x33\x48\xc2\x51\x11\x22\xe8\xb3\x4d\xc6\x9a\x06\x8a\xc5\x84\xfe\x1d\x9a\xf5\xf0\xff\xc6\xa6\x63\x44\xaf\xe2\x58\x1f\x0a\x7f\x36\xbd\x79\x66\x2c\x0a\x9e\x6e\x8c\xdf\x6c\x1b\xbb\x3f\x9f\xe0\xc6\xb1\xfc\xf3\x73\x05\xe6\xc3\x5d\x74\x8e\xb2\xcb\xc9\x03\xc2\xe6\x82\x50\x85\x54\x41\x29\x2b\x17\xc5\x22\x4b\xbe\x34\x51\xc5\x35\xd7\xfc\x50\x5c\x66\x15\x06\x6e\x20\x98\xda\x3a\xe7\x25\x63\xf8\xcb\x18\x8a\x45\xe9\x67\xdd\xd1\xf5\x13\xec\x6e\xe3\x56\x7a\x1e\x94\x8d\x5f\xe4\x46\x19\x72\x13\x7f\x5e\xcf\x9f\xa7\x13\xf3\xfd\x57\x60\xf2\x43\x18\x7d\xf8\x0f\xf0\x42\x2b\xfa\xe1\xc7\xfd\xe3\xc7\x87\x1d\xf1\x7e\x5c\x3d\x3a\x93\x95\x55\x2e\xb1\xa4\x8a\xb8\x86\x4b\xc9\x12\xd9\x96\xac\x30\x92\xb3\x48\x69\xbf\x11\xe8\xda\x42\x51\xd7\x3b\x31\x6a\xad\xb5\xea\x15\xaf\x48\x89\x19\x61\x44\xb7\x6b\x44\x5a\x14\x12\xa3\x32\x44\xce\xac\x7b\x74\x00\x1a\xd2\x28\x70\x08\xca\x76\x21\x7d\xc5\x7a\xcf\x55\x55\xdc\xc6\xf8\xf7\xc1\x8f\xc1\xfd\x4d\xc9\xfa\x9f\xb6\x53\xe5\x87\xfd\xf1\x97\x0f\x6f\xef\x3f\xae\xbe\xf4\xdb\xfb\x5f\x3e\x1c\xe0\x65\x7e\x18\xbe\x4d\x64\x3c\x4b\x37\x3e\xde\x3d\xec\x33\x13\xc7\x13\x64\x94\xd1\xa5\x61\x15\x05\x0a\xa3\xe1\x15\xb4\xba\xa4\x14\x67\x84\x66\x6e\xa0\x34\xcb\xb3\x32\x2b\x06\x29\x87\x61\x18\xa0\x51\xea\x20\x8a\x24\xbd\x06\xda\x20\xcc\x28\x25\x12\x92\x46\x49\xeb\xcc\xa5\xe2\x24\xd1\x09\x8d\xaa\x0b\xa3\x34\x56\x31\x6e\x9c\xd8\x51\x37\x5a\x57\x1a\xa8\x96\xec\xab\xae\x9a\x3a\x94\x37\x6e\xcf\xc7\xdf\x6a\x27\x7c\xba\x7b\xa5\x5f\xf6\xf0\x5a\x47\x21\xf2\xb3\x3b\x9a\xa3\x62\x39\xa7\x79\xd8\x08\x9b\x97\x19\xcb\x4b\xe4\xc6\x38\x95\x55\x45\x19\x2a\x85\xca\xeb\x12\x8b\x9a\x28\xf3\xa4\x05\xdf\x99\x30\x5d\x88\x97\x4c\x28\x17\x74\x0d\x12\x93\xb4\x30\x21\xb4\xfa\xe1\x98\x11\xae\x0d\x21\x42\x37\x9b\x7a\xc2\xe5\x3c\x29\xef\x0f\x93\x6b\x79\x54\x87\x22\xf8\xf4\xa2\x5e\xf8\x45\x1a\xdb\x9f\x55\x4f\xe5\x58\xbe\xec\xe2\xd3\x67\xff\x8b\xe7\x7f\xbf\x8f\xc8\x0e\xb9\x1c\x3a\x42\x4a\x92\x71\x94\xb9\x1e\x65\x69\xce\x18\xae\x92\x2c\xcd\xb1\x72\x03\xca\x4b\xca\xca\x2a\x4b\x51\xa9\xa0\x75\xf9\xa1\xd0\xd7\xe0\x4b\x45\xd9\x1a\xab\x47\xd3\xc2\x44\xc7\x59\xee\x06\x67\x0a\x25\x8d\xc0\x4e\xed\xf8\xc2\x84\x9d\xd7\xdf\xe9\x7c\xac\x38\x76\xd9\x9e\xc1\x6a\x2f\xbb\xf9\xcd\x37\x9c\xfb\xe6\x26\x3f\x29\xd5\xbd\xac\xc0\xdc\xa0\x76\x1b\x8e\xe4\xcd\xc3\xdd\xa7\xdd\x59\x28\x39\xcf\x61\x39\xcf\x67\xd0\xa7\xb4\x2c\xf2\xd8\xa4\x54\x19\x66\xea\xb6\xaa\x55\xdc\xdb\x83\x10\x2c\x1f\xf4\x35\x80\x40\x9f\xf4\x85\x2f\x4d\x96\x96\x0d\x3a\x55\x84\x85\x95\x53\xce\x70\x55\x41\x06\x65\x44\x72\x8f\x1b\x13\xff\x8f\xf9\x1a\xbb\xd5\x3b\xad\x15\x66\x15\xd6\x84\x73\x90\x8a\xb0\x8a\x68\x22\x05\xa8\xdb\x8f\x82\x2f\x65\xd4\x3a\x0e\xed\x97\x09\x7a\xc7\x0f\x99\x46\xc5\x60\xea\x06\x8f\x5d\x77\xfa\xce\x4f\x2f\xf9\x1a\x77\x11\xbb\xf9\xf8\x7f\x7b\xbb\xb5\xf8\x4e\xad\xf1\x0d\x46\x72\x43\x91\x1c\xde\xbe\x28\x34\x8e\xc6\xa8\x50\x6a\x19\xb3\x22\x6c\x8c\x2b\x8c\xa8\x24\x13\x4d\xe1\x66\x48\x93\x09\x44\x0c\xb9\xeb\x93\x14\x98\xab\xbc\x86\xb8\x2f\x34\xb6\x15\x5d\x4a\x42\xc2\xd2\x0a\x33\xe8\xc1\xf4\x9c\xf6\xce\xea\x72\xb8\x04\x1b\x87\xa4\xf7\x49\xec\x0d\xcf\xf5\xe7\xb0\x7f\xdf\x05\x74\x59\x25\xad\xa8\xc3\xc4\x1a\x21\x5b\xa1\xd3\x64\x80\xa4\xba\x06\x7d\x3d\x71\x28\x43\xf2\xf5\xca\xfc\x5b\x44\x57\x9e\x6f\x90\xae\xc9\xfe\x06\xd2\x15\xc0\x0d\x8f\x8c\xbc\x1d\xbf\xd1\x1d\x58\x83\xc4\xc7\xe7\xa7\xcf\x91\x46\xd5\xae\x70\x39\xb4\x15\x43\x34\xe3\xeb\xba\xa4\x6a\x69\x24\x73\xa3\x86\xd6\xa1\x03\x52\xcd\x97\x5b\x26\x6a\x47\x2f\xe7\x90\x2f\x71\x38\x2f\x26\x8a\x7f\x1d\xf6\x6d\xb3\xed\x11\xc2\xeb\x20\x6f\x75\x97\x7f\xf0\x37\xc9\x3e\x0e\x7e\x8e\x85\xef\x3f\x3e\xa9\x3a\xdc\x7a\xe6\x8d\x07\xf5\xb6\x66\x0d\xf9\xe6\x4b\x7a\x6a\x81\x4c\x13\x57\xca\xca\x26\x44\x4a\x2a\xae\x77\xb3\x8f\x51\x85\x53\x7a\x99\xb5\xbe\xf1\x3d\x15\xd8\x35\xad\x18\xce\xbd\x3b\xf3\xf3\xc6\xa9\x83\x6f\x79\xa4\xfd\x2d\x5f\xfd\x15\xab\xfa\xc2\x3d\xf4\x60\xde\x8f\x8f\x9f\xd6\xfe\xff\x14\xdd\x3d\x24\xc7\xb7\x3b\xcb\x4a\x5d\xb2\x50\x58\x4c\xc6\x76\x9a\xac\x3b\xe7\xae\x67\x10\xe4\xe3\x29\xee\xc2\x44\xa0\x73\x7c\x10\xc2\x94\x46\x94\xa8\x51\xda\x95\x7a\xc9\xc2\x93\x0b\x4e\xb2\x03\xab\x39\x10\xdd\x5d\x66\xe8\x9c\x49\xf0\x6a\x87\xbd\x12\x1f\x8b\xaf\x3d\xe0\x67\x66\xf4\xf8\xe3\xbb\xf5\x50\xff\x7a\x87\xfd\x21\x8c\x6e\xc4\x4c\xde\x77\xbd\x91\xa6\x7f\xbe\x7b\x88\xda\x30\x8e\x75\xbc\xfa\xca\x09\xce\x8b\x38\x51\xa9\x12\x88\x67\xcb\x39\x42\x14\x09\x44\x17\x02\xbd\x66\x34\x9d\xdd\x98\x56\xcc\xee\x53\x60\x9d\x35\xcb\xe0\xd4\xa0\x74\xee\x68\x0b\x38\x2a\xe0\x54\x71\x22\xaa\xa5\xd4\x2e\xc8\x72\xcd\xb1\x49\xb3\xb0\x08\x7c\xbd\xc5\xea\x2b\x16\x9e\x5b\x2c\xd8\x82\xca\xdf\xfa\xef\x2f\xbd\x36\x8f\xa7\x08\x22\xd4\x56\xe6\xc4\x87\xba\x9b\xc9\xc9\xea\x4a\x30\x6d\xc8\x22\xe3\xd5\x87\xa0\xae\x06\x7d\xc9\xa1\x71\xcd\xa1\xe0\xa9\xd3\xeb\xfa\x66\xd2\x60\x53\x72\xd5\xd0\x46\x9a\xf1\x42\x87\xc1\xb8\xce\x18\x28\x83\xbd\xe7\xa5\xfe\x57\xf3\x45\x15\x9e\x2f\x8a\xf0\x4c\xe3\x7c\x69\x0d\xb0\xfe\x49\x20\x28\x24\xa6\x24\xfe\x52\x81\x70\xfc\xd7\xf1\x45\xad\xb6\x88\xa3\xb9\xf9\x3b\xbf\xbb\xb1\xd8\xdf\xf8\x17\x3d\x07\xc6\x13\xb9\xda\xd3\x1a\xae\xa3\xd3\x25\x63\x51\x79\xe9\xec\x7a\x38\xc1\x58\x97\x0c\x92\x4b\x1a\x16\x95\xe3\x14\x69\x44\x0f\x85\x3d\x2d\x95\x06\xb1\xf4\xc5\xb9\xd5\x7a\x9c\x94\x2e\x8d\x0c\xf6\xa1\x09\x3a\xaf\x8d\xfc\x57\xb6\x15\x0e\x3b\xfc\xa5\xa5\x91\xbe\x70\xe3\xe5\x5c\x51\x53\x54\x40\xbe\xa0\xb0\xab\x1c\xf2\x09\xfa\x43\x6e\x9a\xe5\xb4\x86\xb6\x18\x49\xad\xb5\xa9\xb9\xca\x15\xf7\xf7\xe8\x1b\x0f\xd6\xc6\xca\x56\x06\xff\x23\xc0\x2f\x19\x64\x9e\x75\x14\x1f\x9e\x2e\xd3\x1e\xee\xbe\x22\xef\x3e\x3e\x0b\x92\x7c\xbc\xff\x00\x1f\x1f\xfe\x10\xde\x68\xda\x6e\xbe\xd7\x8e\x13\xca\x49\x66\xb3\x12\x4a\x67\x21\x63\xec\x24\x07\xda\x28\xa3\x6c\xa5\xab\x8e\xd7\xa3\x9b\x20\x1d\x47\x77\x86\x84\x83\x56\xca\x68\x47\x94\xd1\x07\x59\x29\xc5\x10\x61\xca\xba\x51\xbb\x71\xe2\x86\x4f\x8e\x78\x75\x27\xd9\x0b\xa5\x67\x59\xeb\x5a\x5a\x65\x5c\x69\xad\xf4\xec\x87\xfd\xfa\xdc\x34\xb5\xf5\x2d\x3f\xb1\xd5\x11\xbe\x0f\xfe\xde\x33\x09\xf9\xba\xa7\x87\xe7\x8b\xcc\xc7\x7f\x82\x75\xd6\x7c\x8a\x9e\x2b\x66\x3f\xad\xbb\xff\xf1\xf1\x63\x74\xf7\x70\x38\xee\xb3\x26\xcb\xa0\x9b\xa1\x74\x9d\x59\x7a\x5e\x89\x6b\x00\x71\xa6\xfb\x1e\xd8\xb8\xf4\x26\x8b\x3b\x60\x71\x7a\x9e\x90\xaf\xb5\xc0\xe8\x62\xaf\x81\x76\x0c\xac\x26\x36\x89\x18\x75\x68\x9a\xa6\xa5\x61\x52\x54\xa7\xc5\x40\xe0\x2f\x7c\xf7\x01\xbb\xd2\xc8\x1e\xe2\xdb\xd8\xbe\xdb\xf8\x25\x5e\x8f\xed\x4d\x4c\xe8\x36\xba\x95\xcf\xe2\x84\xfd\x82\x36\x4d\x57\x6e\x73\x5c\xa7\xae\x76\x0c\xcd\x23\x71\x73\x99\xd8\x14\x1d\x62\xad\x97\x46\x43\xe1\x82\x6c\xea\x0b\x25\x98\x2d\xd0\x79\x1a\xc7\x62\xee\x37\x4c\x9c\xba\x8a\xa3\xd8\xa9\x5b\xbb\xff\xf1\x65\xab\xbf\xe5\x07\xec\x0e\xf2\x4f\xd2\xec\xc9\xaf\x8d\xdd\x25\x5f\x66\xc9\x4a\x18\x69\x5e\xe7\x25\xf4\x7f\x4a\x60\x44\xe5\x4e\x69\xbd\x4c\x66\x76\x44\x69\x2d\x11\xaf\x8c\x61\xf4\x86\x75\xc5\x51\xeb\xfd\xd8\x8f\x9e\x77\xf6\x2b\x1f\xa1\xdf\xdb\xd7\xf5\xfb\xf1\x35\x38\xec\xf3\xbb\x1f\x9f\xcb\xaf\xdf\xf9\x8c\xe8\x1e\x3c\x70\xe7\xf8\xd3\xbb\xd7\xe5\x94\x87\xe3\x87\xb7\x3f\xc3\xb4\x89\xf0\x97\x97\x46\x68\xe1\x8c\x86\x73\x99\xe6\x79\x4e\x93\x38\x4d\xf3\x82\xd2\xac\x4a\x8a\x2c\x4f\xab\x24\x2d\x32\xad\x17\x11\x2a\x17\xa3\xf5\x97\x79\xc1\xe2\xa4\x2c\x68\x99\x17\x24\x49\xca\x3c\x2f\xe1\x7c\x10\x46\x59\xa5\x7c\x39\xec\xd9\xd5\x95\x2f\xbc\xa4\x49\x92\xa7\xb4\x24\xb2\xce\xb2\x3c\xcb\x09\xcb\xca\xb2\xc8\xed\x17\x43\x49\xa8\xdc\x58\x99\x0c\xa7\x99\x4d\x51\x41\x08\x95\xac\x24\x69\x56\x56\x25\xd2\x68\x9d\x7b\xbd\x9f\x7b\x79\x90\xf8\x5d\xeb\x0f\x1e\xd9\xb1\xe5\x1d\x3e\xbf\xbb\x31\xa2\x7f\xde\x64\x83\x3c\xca\x65\xdd\xca\x61\x3d\xe1\x7f\x8c\x0e\x2f\x12\x24\xe1\xbb\x1f\xde\x3c\xfc\x10\x0d\x61\x81\x51\x4a\xb4\xa9\x33\x4a\x46\x29\xa5\xc4\x48\x02\xce\xa0\x45\x09\x2e\x04\x21\x04\x13\xca\x30\xab\x8b\x54\x65\x87\x5c\x7f\x69\x52\x9d\x39\x0d\x08\xe5\x36\xd9\x0d\x6e\x80\x62\x49\xa1\x58\x92\x24\x85\x24\xb4\x4a\x52\x67\x98\x6b\xfb\xd6\xf0\xa1\xd1\xa2\x9d\xc0\x13\x95\x15\xae\xf2\xe7\x62\xe3\xfd\xf6\xc2\xeb\x65\xfc\xc7\x17\x5a\x35\xb7\x7b\xff\xfd\x57\x1c\xfc\x87\xe8\x14\x71\xe7\xb5\x38\xad\xab\xc0\x38\x13\x76\x26\x25\xaa\x5c\x66\x92\x99\x14\x1f\x0a\x73\x39\x79\x6d\x33\x13\x65\x3a\x75\xe3\x19\x9d\x20\x3d\xbb\x73\x0e\xe9\xfc\x5c\x97\x65\x0e\x32\xf8\xe3\x2d\xce\xd9\x76\x9c\xe3\xcb\xa4\xfc\x33\x31\xe4\xc7\xc7\xa7\x5c\xc4\xf3\x3f\x8f\xaf\x49\x2c\x77\x63\x59\xd4\x38\x33\x64\x70\x12\x98\xf3\x71\x78\x49\x0a\x95\x17\xed\x25\x6f\xb2\x42\xa3\x8c\x6c\x76\x42\xe5\xc4\x90\xe5\xe1\xd9\x2c\x93\x59\x23\x86\xe9\x20\x69\x45\x2b\xa4\x94\x92\x4a\x4d\xb4\xc2\xb8\x50\x0a\xe3\x9c\xb2\xc9\xff\xaa\x2c\xbf\xa4\xcb\x4c\x48\x98\x38\xaf\x19\xb3\x0f\x47\x7f\x77\x4b\x82\x7f\xe3\xeb\x4d\xff\xff\xc1\xff\xbe\xd5\x2a\x6f\x97\xa8\xfb\xcd\x8f\x48\x8e\xeb\x7c\xf7\xa8\xd0\xcf\xeb\x50\x7b\x47\xe2\xf1\xd3\x87\x17\xbe\xc6\x3a\x15\x7c\xe8\xf3\xe6\xf1\xee\xc7\x1f\x9e\xc6\xfe\xcd\x51\x5f\x88\x54\x12\x66\x95\x97\x44\xc6\x88\xb7\x99\xa6\x22\xd5\x3c\x4f\xda\x53\x69\x8a\x8c\x67\x28\xcc\x65\x92\xce\x39\x62\x48\xe5\x05\x23\x58\x72\x52\x91\x02\x35\x6c\x8a\x0f\x44\x2d\x6c\x19\x1c\x21\x50\x87\x71\x14\xf7\x99\x55\xca\x51\x06\xc2\x05\xae\xb3\x95\x39\x85\x81\x53\x1c\x8c\xb2\xb6\x52\x85\xac\x8a\xbc\x62\x42\x30\xac\x24\x23\xbd\x3b\xbb\x69\x75\xf4\xa5\x1d\xcf\xb2\x6a\xe0\x14\x04\xc7\x80\x5c\x4d\x14\xfb\xda\xc7\xaf\x4c\x00\x7f\xff\x35\xe3\xb9\x1e\xc9\xdf\xc3\x25\xad\xdf\xdf\xac\x7b\xd9\x7b\xc8\x75\x92\x41\x90\xa3\x6e\xe9\xa8\x6e\xca\xdc\x64\xb8\x60\x6c\xac\x5c\xb7\x3e\x55\xea\xce\xae\x41\xc0\x0e\x22\x23\x44\x70\x76\x69\xc2\x89\x8e\x7d\x55\x51\xe1\xf4\xba\x8d\xb6\xd3\x34\x39\x24\x2a\x6c\xca\x5b\xac\xaf\x0e\x22\xf8\x5f\x82\xff\x35\xf8\xdf\x82\xff\x63\xdd\x65\xbe\x86\xfa\x77\x0f\x6f\x1f\xd7\xcf\x0f\xde\x7b\xfb\xf8\x78\xf7\x8a\x38\x60\xab\x3d\xfa\xec\x8f\xb1\x8f\xb7\x40\xf9\xee\x61\xff\xf1\xe1\x6d\xf4\x78\xf7\xb0\x0e\x59\x38\x4b\x59\x4b\x21\xd4\xe9\x34\xb1\x58\xa9\x58\x41\x1a\x33\x5d\xd2\xb4\x2a\x8b\xa4\xd0\xb1\x5c\xbb\xac\x93\xd3\x34\x8e\x56\x42\x5d\x23\x4a\x47\xb6\x9f\xd6\xd8\x5f\xba\x51\x2f\x93\x86\x22\xc4\xba\xee\x9c\xf9\xd2\x39\x9d\xda\x94\x0c\x11\x5b\xa6\xa5\x3f\x09\x52\xb9\x1e\x90\xd2\x61\xaa\x21\xaf\xeb\x7a\x21\x9e\xf9\x77\x0d\xa7\x82\xff\x57\x40\xaf\xcc\x73\x0f\xbd\xee\xe7\xff\xba\xdd\xd4\xfe\x55\xbd\xfd\xa2\xde\xf2\xa9\x02\xf3\xed\xf1\xbf\x7f\x80\x52\xc5\xc9\xda\xff\x76\x69\xb1\x6d\xcb\xbc\x2e\x8b\x9c\xb1\x91\xb9\x7e\x7d\x72\x94\x55\x19\xca\xf2\x44\xc4\xb9\xeb\x44\x9a\xcb\x02\xb2\x4c\xa4\x07\x9e\xe7\xf9\x3a\x1c\x5d\x94\xb0\x76\xaa\x98\xc4\xce\x9c\x4e\xa7\x65\x18\xc7\xd1\x09\xdd\xe6\xad\xb1\x4d\xd6\xda\x24\x9f\x6b\xdc\x35\xf5\x90\x4c\x3a\xd8\x47\xc8\xeb\xb7\xc5\x7f\xb5\xaf\xe4\xb9\xaa\x49\xa4\x2e\xc2\x7a\xff\xac\x68\x4a\x01\xe8\x8b\x09\xa5\x5c\xce\xab\xcb\x4d\x0f\xb1\xe9\x17\x69\x80\x2c\x23\xea\x07\x63\xa6\x51\x9b\xd2\xae\xbe\xd2\xc6\x8b\x51\x7f\xbf\xad\x8f\xdf\xf3\x95\xaa\x2f\x06\x45\xc3\xa5\xb0\xa1\x5d\x58\xc8\x9a\x8c\x02\xfd\xb5\x8b\x10\x5d\x4e\x38\xd7\x59\xb9\xab\xf5\x1a\x3f\xcc\x8e\x22\x66\x8c\xa9\x05\xe3\x05\xf7\x5a\xbb\xc2\xd7\x72\xff\xd5\xef\x15\xd6\xbb\xe6\x0b\x61\xd1\x74\x49\x6d\x58\x2f\x34\x94\x0d\xd6\xa0\x7f\x9d\xc2\xc1\x2e\x03\xc3\xaf\xde\x6b\x46\xc3\xc9\x98\x73\xa7\x0c\x5a\x7d\xc0\x5b\x1f\x3e\xf9\x80\x77\xdf\xb6\xf5\xe6\x25\x82\x7e\x0d\x50\xf0\xea\x03\x92\xc8\x5e\x98\x09\xf9\xa2\x13\x8a\x14\x22\x61\x6f\xcb\x0a\xb2\x2f\x26\xb4\xfc\x90\xeb\x69\x61\x1a\xe4\x62\x95\x2e\xad\x40\x45\xdf\x68\xdd\xaf\xbe\x81\xd7\xd0\xde\xf1\xe7\x1a\x90\x8d\xe5\xe3\x25\x57\xd2\x3f\xc2\xfd\x76\x71\xf3\xe6\x19\x01\xf6\xf1\x1e\xd8\x1e\x3b\x55\xaa\x0e\xc7\x36\xd6\x6e\x9a\xa4\x6b\xab\xe5\x44\xa1\x13\xae\xb3\xbb\xf8\xcb\xf9\xf9\xc3\x2f\xa2\x4f\x33\x54\x17\x13\xc5\xe4\xec\x5a\x6a\xd0\x10\x4a\xe9\x94\x70\x4a\x78\xff\x84\x5d\xd1\xb1\xde\x35\x5e\x91\xee\xfd\xed\x76\x72\xb3\xe1\xf3\x46\x38\xb4\xb1\xce\x1d\x76\xcf\xfc\x85\xcf\x66\xe0\x3d\x75\x1a\xc9\x21\xcb\x63\x9b\x60\xe4\x86\x51\x5e\x03\xe2\x3a\xd7\x90\x30\x90\xae\xd2\xeb\xf4\x7a\xfe\x34\x97\x6a\xce\xb2\x2c\xef\x8a\x73\x89\x30\x85\x7c\x3c\xe5\x26\x85\x22\xd4\xe2\xd9\x9c\xe7\x3d\xa6\x78\xd5\x27\x4f\x35\xa7\x4f\xf4\x47\xb7\x8a\xcf\x97\xc6\x44\x3c\xd2\x27\x42\x73\x93\x14\x59\x6b\x88\xc6\xce\x32\x28\xca\x79\x73\xcc\x6f\x9f\x43\xf1\x45\x3a\x89\x51\x53\x9c\x50\x81\x19\x34\xae\xac\xa5\x06\x1a\x15\xdd\x32\xf7\xcb\xd4\x07\xbb\x50\xdc\xb8\xb9\xd3\x5b\x8f\x04\x7f\xb6\xfe\xf6\x55\xf3\x59\x34\xcc\x94\xe5\xb1\x4d\x49\x5f\x93\xa6\x74\xbc\x02\x86\x66\x1b\x6a\x5f\x39\xe1\x3f\x07\xf4\x45\x38\x85\xd7\xd1\x60\xb8\x82\xda\xe1\xe6\xb9\xf5\x6e\x39\x77\xab\x0f\xbd\x4b\xbc\x66\x5d\xf1\xcc\x7d\x7e\x9b\xed\x77\xaf\xba\x3e\x7a\x11\x70\xed\xaa\x70\x58\x0a\x0b\xc6\x9f\xb3\xfe\x13\x2b\x2e\x95\x09\x13\x41\x0c\xe6\x87\xe2\xd7\x29\x32\xd3\xe2\xbf\x1c\xc1\x27\x21\xa4\xb5\x6d\xd9\xd9\xe7\x9c\x48\xe5\x63\xe1\x17\xb9\x64\xcf\xc4\x74\xd3\xac\xb8\xdb\xae\x83\x3d\x21\xf4\x8d\x6f\x66\x5d\x73\xf7\x77\xf7\x91\x05\xb9\x29\x55\x34\xc6\x4d\xeb\x17\x34\x4e\xea\x79\x06\x35\x2f\x5e\x49\x0b\x9a\xf5\xb9\xef\x9b\x66\x39\xb5\x0b\xf5\x59\x02\x13\xf6\xed\x46\x8d\x1f\x5c\x52\x4f\x7d\x9f\x6c\x7c\xcf\x9b\x36\x62\x76\xc3\x95\x3f\x23\xc8\xd7\x6f\xc9\xab\xe8\xfc\xf0\xf0\x77\x61\x04\x77\xf7\xd1\x61\x5b\x8d\xbb\x8c\x91\xc2\x6a\x12\x16\xb3\x94\x4d\x02\xcc\xd5\x19\x45\x45\x92\xe8\x94\x96\x62\xcc\x5d\x03\x65\xa2\x7a\x94\xdb\xac\x88\xf0\xe5\x94\x17\x86\x16\xf4\x50\xa6\x95\x44\xd9\x35\xe8\x8c\x63\x6e\xae\xdb\x36\x73\x6d\x0b\x53\x98\x85\xb9\xe3\x50\x27\x5f\xa8\xae\x8b\x5a\x07\xa1\xaf\x85\xd6\x07\x11\xfc\x1b\x8f\xdb\xfa\x5a\xa5\xf5\x7a\x5a\x6c\xf2\x50\xef\xff\x06\xf6\x0c\x65\x60\x2f\x39\x98\xac\x80\xb6\xcc\x93\x58\xc7\x44\x29\xec\x06\x5d\x73\x88\x0f\xc2\xd4\xc6\x68\xb9\xa8\x4b\x85\x91\xce\xbb\xaa\xac\xa2\xdc\xe9\xc9\x9d\x84\x6a\xc1\x42\x1d\x04\xbb\x1d\xf6\x78\x70\x15\xec\xfd\x49\xf4\x7f\x3d\x65\x4b\xf6\xef\xf6\x37\x9f\xfd\x6f\xe1\xf1\x8f\x9f\xdf\x1d\x1e\xfe\xee\xc3\xf1\xe6\xd4\x1f\x3f\x7c\xf6\x7c\x04\x6f\xfe\xec\x7f\xf9\xf2\x3f\xfc\xfc\xee\xc0\x51\x26\xb3\x02\x44\xe2\x48\x5a\x30\x42\x08\xc5\x45\x16\xc7\x3a\x55\xdc\x48\x62\x48\x67\x50\xd1\xa7\x6d\x9a\x98\x38\xb3\x28\x97\x19\x02\x9b\xb8\x2a\x45\x9c\xb2\x4a\xa4\x2c\x49\x62\x95\x49\x66\xf4\x40\x7a\x5b\x94\xe7\x64\xcc\x52\x8d\x0e\x0a\x95\xa4\x2c\x85\x42\x98\x60\xcc\x68\x49\x32\x59\x9c\x1a\x92\x23\x85\x09\x15\xa9\x4a\x2b\x29\xd8\xd2\xac\xff\x77\x29\x34\x26\xbc\xaa\x2a\xc9\x10\xe1\xf9\x34\x54\xcc\x93\x10\x17\x3a\xaf\xaa\xe2\x14\x1c\xc2\xf6\x5a\xf8\xfd\xe0\x2f\xae\x87\x37\x2f\xd6\x43\x94\xad\x3b\x9f\x5d\x03\xb7\xa7\x0f\xd3\x75\xaf\xc6\x90\xf7\x9d\xac\xa7\xd7\xeb\x81\xe2\xb3\x14\xba\x95\xb5\xf2\x41\xec\x16\x97\xdb\x7f\x51\x7b\xd5\x76\xd0\x58\xcf\xad\xec\x3f\x95\x69\x46\x35\x85\xa4\x6b\xa4\x1d\xbf\x69\x8f\x9c\x84\x50\x56\xdc\xda\x8b\x77\xe4\x4a\x8e\xe2\xa0\x6e\x2a\x07\x7f\x08\x1e\x9e\xd5\x27\x5e\x30\x63\xdf\x3d\xfe\xf2\xe1\x7b\x5a\xe1\x6f\x5e\xb8\xe2\xab\x5d\x7b\x84\x32\x5b\x66\x3a\x43\xcd\x65\x6c\xf3\x22\x1b\x06\x99\xa7\x22\xcd\x00\x0f\x8a\x27\x45\x95\xcf\xca\x21\xad\x9f\x74\x50\x0f\x8a\x2b\x21\xf3\xaa\x5a\x48\xd8\x54\x64\x49\xa1\x2d\x85\x46\x46\x70\x87\xa1\x45\x59\x2d\x91\x70\xd9\x65\x12\x22\xf2\xba\x78\xd4\xe3\x37\xfc\xdc\x14\x87\xc2\x9f\x17\xff\xf9\xeb\x2d\xc3\xf3\x8d\xeb\xdd\xc3\xc6\xa7\x16\x7e\xe7\x92\x61\x67\x42\xeb\x64\x5a\x84\x71\xa5\x33\x94\xd1\xac\x28\x62\xe5\x66\x36\xf3\x52\x4c\xb4\xab\x48\x89\x98\x22\xca\x97\x30\xfb\x32\xe6\x62\x49\x09\x59\xf4\x14\xdb\xd8\x82\x72\xa5\x9b\x39\xc4\x40\xdd\xd0\x55\xf5\x89\x20\xae\x3a\x68\x6b\x57\xd4\xc1\x01\xce\x57\xbc\x63\x2f\x34\x3d\xbe\x8e\xdd\x93\xc7\xe9\xf3\x9a\x5f\xc7\x2e\x2c\xe1\xec\x62\x33\xf8\xff\x51\x55\x12\x49\x81\xb3\x52\x21\x76\x28\x7f\x9d\x23\x75\x5e\xf4\x79\x51\x10\xb8\x12\xcf\x52\xa8\x5a\x5b\x62\xbd\xc6\x49\xb4\x2b\xaf\xe4\x28\x0f\xa5\x6f\xe9\xef\xbe\x51\xf6\x7e\xba\xfc\x7a\x85\x6f\x7f\x38\x4a\xbd\x9c\xb4\x0e\xb3\xe5\x94\x35\xb2\x69\x38\x61\x45\x21\x8b\x82\x72\x64\x0f\xe5\x9f\x12\xce\x0f\xf3\xaf\xf1\x9e\xbb\x6e\x1c\x55\x53\xd7\x4a\xad\xa3\xa0\x04\xe3\x67\x0f\xe2\x8e\xc2\x24\x48\xf6\xd3\xae\xf7\xef\xf7\xb7\x5f\xef\xfc\xde\x7d\xaf\xbd\xcf\x0f\x61\x12\x8d\x97\x5c\x87\xed\x82\xf1\xa0\x86\x41\x33\x8a\x89\xc2\x84\x8b\xaa\xde\xf5\x5f\xb0\x8a\xea\xc1\x5a\x55\x48\xae\x38\x73\x2d\x50\x45\x2b\x3e\x04\x41\x04\xe7\x6b\x7b\x08\x22\xf5\x97\xdb\x79\xfb\xf0\x71\x6b\x07\xce\x5b\x01\xea\xb4\xa4\x78\x52\xd3\x64\xf8\x86\x31\xa4\x35\x3b\x45\xea\x52\xc8\xb0\x97\x94\x8a\x8c\x31\xc1\xf0\xf9\x5c\x61\xee\xa9\xc3\x7d\x3e\x98\x78\xae\xd4\x7f\x41\x1f\x0a\xb3\x04\xc6\x44\xc1\x12\xa0\xb3\x39\x9f\x6b\x59\x31\x66\x48\x55\x35\x6c\x5a\xfb\xb0\xaa\x7c\x1f\x56\xae\x1f\x47\xad\xdb\x46\x37\xca\x25\x30\x77\x4a\xcc\x5b\x1f\x46\xd5\xbf\xaa\xcd\xcc\x98\xf0\xb4\x64\x68\x32\xf3\x5c\x73\x46\x99\xc1\x55\x55\xb3\xf1\x37\x6d\x9a\xa6\xd1\xb5\x72\x29\x4c\x9d\x14\x27\x9f\xe7\x8f\x42\x75\x25\x5e\xd3\xfc\x7b\x6d\x3e\xe1\x01\x5e\xd7\x42\x1c\xa9\xb9\x30\x63\x56\xb7\x92\x42\xa1\x01\xb9\x7e\x34\x95\x54\x9a\xd6\x6b\xf4\x36\xff\xa6\x5d\xd9\xb6\xa6\xd5\x2e\x08\xd1\xa9\x79\x7e\xd7\xfc\x4a\x8e\xfc\xb9\xdd\xf0\xbf\x15\xbf\x79\xdb\xdf\xb4\xfc\x70\xe4\xe6\x32\x19\x13\xa5\x97\x09\x9f\xed\x7a\x4e\x37\xa2\x62\xcc\xd2\xaa\x6a\xff\xb9\x3e\x9e\x7c\x4d\x78\x14\xce\x2f\xda\x7d\xff\xcf\xbc\xef\xf1\xdf\xc3\x73\xbb\xb5\xd6\x11\xbd\xd4\x04\x12\xb3\xfa\x0d\x9d\x64\x9c\x1b\x9c\x92\x82\xf5\xec\xfc\x9b\xa6\x55\xd7\xaa\x46\xbb\x38\x4c\x6d\x51\xa1\xed\xa5\xb7\x3b\x7b\x76\xe3\x57\xff\xf9\x39\xfb\xb8\x51\x19\x7c\x82\xbb\xfb\x3b\xf8\x86\x17\xec\xf3\x4f\xef\x3e\xed\xfa\x3a\x2f\x42\x6c\x97\xd4\x42\x81\xc2\x6c\x49\x43\x2c\xa8\x10\x95\xa0\x4c\x68\x6e\x85\x50\x5c\x70\x76\x90\x85\x60\x7f\x1a\x8c\x39\x14\xf2\x57\xb1\x93\x5f\xe4\x2e\x25\x43\xd7\xb6\xa2\xb5\x75\x4d\xbb\xbe\x6d\x88\x31\xb5\xe7\x73\x63\xbe\x5e\xbf\x0d\x7e\x7c\x66\xbf\x09\x61\xf5\xa0\x9f\xdb\x0e\x7e\x7e\x91\xc4\x5f\x9d\xac\x0f\x6f\x3c\x1f\x24\x4c\x3a\xcb\xa0\x2d\x2e\x67\x12\x2a\xe2\x5a\xca\x69\x45\x29\x42\x12\x92\xb0\x01\xe9\xcb\x61\x80\xba\xda\xba\x0a\xd5\x46\x41\xea\xe4\xae\x2d\x18\xb9\x58\x37\xe8\x39\xe4\x86\x56\xb2\x22\xb8\x64\x5e\x24\xda\xb8\xd2\x38\x06\x56\x81\x40\x6e\x80\xce\x8f\x8f\xb8\x12\xef\x6b\xbd\x0b\x7e\xd9\xee\x33\xc3\xe8\xf1\x26\xca\xfc\xe2\x26\xe6\xc3\x0d\x1f\xe8\x2d\xff\xf4\xe6\x97\x37\x1e\x63\xf3\x66\xcf\x35\xc2\x9d\x3b\x43\x6c\xba\xae\x6d\x8d\xeb\x0b\x27\xf3\x42\x8d\x99\x4d\x21\x2f\x5d\x4c\xcf\x82\x14\x19\xa2\x04\x25\xbb\x3c\xbb\x06\xee\x1c\x6a\xbd\x5a\xac\x17\xae\x97\x29\x4c\x65\x23\x58\x05\x4d\x28\x93\xf3\x17\xe3\x98\x1c\xc0\xa0\x90\x9c\x9a\x1c\xcd\xe0\xfb\x4e\x84\xc2\xfb\x5b\xef\x7c\xfe\xf8\xeb\x68\x6d\x64\x9d\x3f\x86\xbb\xe3\x87\xf7\x6f\xf6\x9e\x11\xe9\xe3\xb7\x9d\x18\x06\x05\xa3\x9c\xd0\xb2\x14\x67\x69\xd3\x0c\xcc\xe0\x9a\xb1\x0c\x63\x0d\x81\xc2\x50\x38\x01\xca\xf3\x03\xaf\xfd\x68\x1d\xc9\xf7\x05\x5e\xf7\xfd\xb2\x44\xd5\x00\x38\xc3\xd8\x20\x57\x4f\xa5\x11\x50\x93\xac\x85\x4c\x77\x9d\x76\x27\x7f\x39\x2b\x37\x9e\xbe\xa3\x89\x44\xf0\xd6\x9f\x7c\x5f\xc7\xf5\xc5\xa4\xfa\x33\x96\x41\xa7\x92\x14\x1a\xb2\x28\x16\xc6\x95\xeb\x13\xc4\x48\x45\x08\x42\xd5\x14\x9e\x15\x03\xe4\x08\x34\x7e\xe2\xaf\x9d\x65\x1c\x41\x91\x48\xcb\x62\xa1\xd7\x40\x37\x70\xca\x28\x5e\x37\x50\x54\x54\x7d\x8e\x3a\xc8\x95\x52\xca\x8d\xda\xb5\x80\x57\xbb\xe4\x55\x1c\x75\xb8\xfa\xa8\x7f\xf3\x92\x39\x79\xff\x4d\x86\x79\x0e\xfb\x24\x35\x45\x1a\xb6\x7f\xea\xa1\xe4\x38\xcc\x59\xd9\x60\x02\xfd\x79\x86\x1a\x11\x38\x17\x59\x81\xb0\x4e\x4d\xad\x6b\xa4\xb9\x31\x82\x3f\xf3\x13\x1e\x9b\x90\x3c\xe9\x08\xbf\xc2\x5b\x79\x16\x97\xf7\xc1\x0d\xfb\x72\xb2\x69\x51\xe2\x93\xd2\x75\x33\xab\x91\x2c\xc6\x9d\x87\x45\x63\xe8\x41\xba\x52\x56\x82\xcb\x90\xa4\x92\x95\xb9\x34\xb4\xe6\x2c\xcf\xad\x80\xc4\x9d\x2a\x5d\x42\xde\x95\x5d\x55\xf1\x20\x08\x77\x1c\xc8\xb1\xba\x71\x60\x06\xf0\x0d\x81\xf0\xba\xa2\xef\xee\xef\xee\xf7\x71\xae\x46\x14\x9b\x54\xba\xe9\x4c\x42\x6b\x56\x9f\x21\xb2\x4e\x64\x29\xd6\x68\xa4\x25\xdf\x65\x4b\x41\x60\x76\x36\x08\xa2\xa0\x03\xe9\xf9\x0e\x7f\x77\xfb\xab\x6f\x6f\x29\xab\xb7\xf7\x77\xe0\x1d\x84\x7b\x0f\xe2\x88\xa6\x53\xd3\x4e\x97\x11\x9a\xb6\x73\xa7\x79\x9a\x0e\x99\xee\x5c\xdc\xeb\x9d\xfd\x32\xf7\x70\xee\x2e\x12\xf0\x39\x08\xf7\x08\x94\xaf\xe9\xf8\x21\xf8\xc9\x63\xf0\x9e\xad\x0c\x7d\x40\xf0\x6e\xf5\xd3\x88\x13\x25\xe2\x45\x6c\xd2\x02\x37\x0d\xd5\xe7\x03\x5a\x94\xb3\x79\x46\x86\x62\x94\x39\x66\xbb\x58\xbb\x1a\xa8\xaf\x11\x01\xb9\x3b\x1d\xca\x67\x36\xc6\x57\x16\x7a\x1f\x66\xf5\x3d\x1f\xde\x3e\xee\x4e\x7d\x5d\xf7\x0b\xd5\x7d\xbf\xfa\x48\x7d\xdf\x1f\x4a\x3d\x3b\x7c\xd6\xbb\xce\xc9\x79\x19\x3a\xd7\x9f\xfd\xb8\xed\x24\xa8\x63\xfd\x1d\x1b\xc3\x5b\x64\xff\xee\xee\xfe\xee\x88\x97\x9e\xb1\x13\x49\x4c\x8a\x4b\xd7\x4f\x95\x86\xfa\x80\x16\xed\x8c\x37\xf3\x1a\x60\xb4\xda\xa9\x9c\x01\xcf\xfb\xd7\x03\xdd\x95\x07\x12\xfc\xbb\x1b\xba\xef\x05\x61\xf1\xb6\xcb\x7b\x3c\xd4\xe3\xdd\xc3\x2e\x5b\x97\xcd\x35\x80\x6c\x3d\x41\xa1\xf0\xea\x05\x03\x95\xf2\x40\xf4\xe0\x82\x51\x17\xbb\xf3\x97\x1e\xd8\x0c\xd4\x2c\x9b\x9e\x48\x77\xad\x8e\xc6\xf7\xc1\xad\x07\x3c\x88\x71\xe3\xa3\xdc\x7e\xf2\xf1\xe7\x51\x3a\xe6\x0b\xc8\xdb\x2f\x79\x28\x5d\x0f\xc8\x65\x80\x61\x74\xf9\xa1\x34\x4e\x2f\xc8\x69\x73\x18\xff\xd4\x01\x0f\x7b\xe0\xbf\xd2\x30\xf6\xda\xcd\xbb\x08\x5d\xc5\x51\xfa\x39\xf0\xfb\xef\xb6\xe0\xab\x71\xd6\x96\xbc\x9a\x16\x76\x03\x98\x2f\x2d\x9c\x9d\xcf\x24\x79\xb6\xe7\xcc\x78\xb0\xb3\x34\x87\x7a\x99\x3c\x63\x72\x06\xf8\xe2\xe5\xa5\x83\x08\xe8\x95\x1f\xf3\x9d\xf9\xcb\xf6\x7f\xbc\x3f\x58\x57\x40\xef\xca\x90\xfc\x5a\x84\x27\x87\xa1\x59\x06\x48\xc2\xf3\x12\xef\x8c\x71\xb3\xcb\xdc\xd9\xec\xf3\x2f\xab\xab\x7b\x82\xe4\x12\x83\xe9\x7c\x7e\x04\xd8\xd5\x1c\xe6\x9d\x7a\x65\xff\x53\xef\x3f\xc7\x01\xf0\xf1\xfe\xed\xc1\x2e\x6d\x88\x96\x21\xd4\xbf\x72\x0b\xad\xc3\xd1\x7c\x49\xa0\x73\xe5\x4e\x99\x93\x0b\x4e\x66\x37\x3b\x75\x5a\xda\x61\x69\x4f\xa7\x6d\xae\xd0\x50\x1c\xd5\x01\x3f\xcf\x95\x17\xb4\xd3\xdb\x5c\x79\x7b\xff\xf1\x98\x2f\x43\x29\xe6\x32\x31\x29\x41\xae\x9f\xb8\x05\x73\xc0\xcb\x34\x65\x19\x96\x79\x8f\x0a\xcc\xa2\x5c\x9f\xcf\xeb\x3c\xa9\x43\xb9\x0b\x0e\xf8\x45\x5f\xf8\xd9\x7c\xff\x72\xbd\xad\x21\x41\x70\x0d\xba\x0e\x82\x4b\x0d\xfd\x30\xb8\x7e\x5e\xb7\xe7\x03\xd6\xd2\x51\xa9\xa3\xfe\xd2\x4b\xa8\xe5\x42\x21\xb6\xc1\x2e\x98\x41\x1c\xf1\x4e\x7f\xff\xfd\xdf\xbd\x78\xff\x63\xbe\xe4\x21\x5f\x74\x78\xfe\x53\xad\xc3\x72\xe9\x76\xf5\x17\xea\xbf\x6b\xc9\x5c\xcd\x64\x94\x9e\x98\xeb\xa9\xeb\x19\xf3\xf9\x07\xe9\xf1\xaa\x37\x5b\x7f\x7e\xda\xb9\x1f\xef\xfe\x21\xf4\x08\x8c\xfb\xf5\x70\x3e\x24\xa0\xbe\x4c\xbb\xc0\x99\xf9\xac\xe7\xb3\xd3\x50\xb1\x75\xb7\x4e\xf4\xc1\x6a\xd7\x2e\x49\x38\x03\xfe\x55\xc2\x00\xa7\x60\x17\xd9\xab\x3d\xd2\x43\xf1\xfd\xb9\xf6\xe6\xf6\xa3\x9f\x6b\xc4\x75\x50\xb8\x0e\xe8\x05\xdb\xd5\xd9\x0b\xd9\x62\x21\x77\xe3\xa1\x30\xce\x2c\xdc\x19\x73\xd0\x2e\x80\xea\x62\x81\x5e\x6a\xa8\x9c\x09\x82\x9d\xd7\xd0\xc7\x50\x78\x3f\xcb\xff\xfd\xfd\x06\x4a\xfa\xc7\xf0\xfe\xed\x8b\x1f\x77\x9d\x89\x32\xeb\xd2\x8b\xb6\x51\x6a\x5c\xc6\x31\x4c\x2e\x2b\xb5\x52\xfa\xf9\x27\x9f\x0b\x9c\x77\xe3\x31\x7e\xa1\xdb\xf8\xac\xd8\xf8\xf3\xed\xfb\xae\xdc\xee\x43\x6b\x47\x2f\xd9\xf3\x8f\x07\xe2\x94\x14\x72\x7d\x6c\x77\x9e\xfd\xd5\xee\xd0\x21\xff\xe7\xdf\x7b\xe7\xab\x09\xdc\x09\xd0\x45\xfb\x93\x6f\x0d\x8e\xfc\xe8\xe7\xda\xe9\x45\x38\xad\x0f\xca\x05\xc0\x2f\x06\xaa\x8b\x8f\x09\xd7\x3d\xa2\xbc\x96\xc7\xc6\xf3\x9f\xfe\x31\x40\x5b\x66\xe4\xc3\xee\xfe\xbb\xa8\x76\xf8\xbe\x1e\xe0\x06\xa3\x38\x28\x45\x4d\xe1\x32\x97\xa7\xe3\xd8\xb4\xd9\x64\xb4\x68\x80\x70\xa6\x5c\xe7\x0c\xd4\x43\x5e\x2c\x7d\x5d\x84\x5a\xb6\x1d\x50\xe2\xd4\x34\x3b\x85\x00\x9d\xb8\x62\xa2\x82\xc0\x2a\x5b\xb3\x65\xdc\xd5\xdd\x09\x2b\x62\xa9\xc9\x12\x65\xce\xc5\x28\x32\xc6\xa9\x33\x36\xc1\x18\x3b\x99\x31\xd5\x6b\x8a\x2d\xd1\x9a\x6a\xcc\x4b\xcb\x88\xa8\x63\xcb\x84\x0a\x3c\xf7\x56\x79\x64\xb7\x5a\x83\xdf\x7b\x56\x93\x5b\xb4\x15\xdd\x06\xd0\xa3\xa4\xcf\x11\xba\xf4\x26\x8c\x97\x33\x32\x91\x35\x8b\x3e\x64\xbe\xf3\x7f\xc5\x26\xaa\x2e\xc6\xf8\x52\xe0\x1b\xa6\x88\xf8\x3b\xf8\xcf\xaf\x4e\xe9\x1f\x5e\x96\x2a\xfc\xf7\x0f\xfe\x6e\xc8\x3f\x7f\xf6\x2c\x48\x3f\x3f\x13\x6c\xaf\x9d\x73\x50\x4c\x6b\x46\x2a\x5a\x99\x76\xb4\x35\x51\xb9\x12\x94\xc6\x6e\x76\x1c\x43\x03\xd9\xea\xd3\xd5\x14\x28\xa4\x59\x31\xbb\x13\x86\x1c\x57\x8a\x53\x81\x29\x6f\x1a\x0c\xf2\x20\x05\x46\x15\x2f\x4b\x2e\xa9\x3b\xbb\x6c\x1c\xd3\x3a\x53\x0a\x97\x67\x65\x14\xc4\xba\x13\xa6\x6a\x51\x51\x51\x4d\x29\x25\xb4\x2a\x72\x51\xa1\x42\x53\x8f\x1b\x47\x37\x2d\xf6\x37\xb7\xdb\xc9\x17\x3c\xbe\x9b\xa0\xd5\x8d\xb1\xfd\x70\xf4\xf1\xcb\xab\x82\xfd\x97\x28\x89\xfb\x8f\xf7\x9f\x76\x49\x3f\x58\x29\xb9\x55\x8a\x34\x4d\xe3\xda\x7c\x6c\xea\x7a\x36\x49\x1c\xf2\x85\xa1\x62\x34\x40\x19\xcb\x8b\x0c\xe7\xa8\x37\xbd\x46\x88\x98\xca\xcd\x50\xa6\x07\x86\x2b\xc6\x89\x60\xb4\xd2\xaa\xe2\x4c\x63\xc2\x90\x13\x45\x9e\x6b\x8d\xa5\x74\x25\x63\x89\x49\x08\xc4\x0b\x0b\xad\x0b\x60\x42\x85\x96\xa3\x46\x5b\xbd\xa2\xb8\xe2\x23\x89\xe2\x67\xed\xba\x77\xbb\xfd\xfb\x9f\x3d\x2d\xc7\x2f\x1f\xf6\x2f\x8b\xfc\xd6\x11\x78\x9e\xb4\xef\x3f\x7f\x7a\x46\x44\xed\x3f\x7c\xda\x17\xd6\xb5\x0e\x79\xfa\x0e\x75\xb6\x1a\x61\x57\x60\xce\x59\x56\xf1\xc2\x8d\xae\xcf\x21\x98\x87\x31\x1b\x95\xc1\x1c\xd2\xaa\x84\x78\xee\x78\x3f\x2d\x8c\x4d\xee\x84\xcf\x51\x8c\x4e\x75\x9a\x11\xa2\x6b\x52\xa2\x62\xe0\x34\xd1\x31\xa9\xd3\x44\x12\x9e\xc6\xb2\xe4\x45\x59\x24\x49\xec\x72\x26\x95\x66\x5c\x4a\xa2\xcb\x75\x3e\xae\x7e\x5e\x7b\x60\xc1\xdb\x1b\xfb\x68\x00\x8f\x1b\x03\xe6\x6b\x84\xe3\x4d\x19\x66\x83\x1b\xbf\x04\xd1\xed\x5b\xdb\x29\x5e\xf1\x14\x95\x79\x62\xd2\x4a\x1b\xea\xce\xc6\x8d\x72\xca\x18\xc7\x56\x86\x4c\x53\xce\xab\x25\xad\x4a\x55\xb2\x03\xbb\x8c\x56\x1b\x23\x96\x36\x4b\x4b\x5b\x0e\x15\xe6\x87\xf2\x42\x96\xc9\x35\x15\x24\xa0\x18\xb1\x4c\x86\x06\xbb\xc1\x56\x9d\x6e\x07\x32\xb4\x9b\x76\x7e\xe6\xd7\x8d\xd8\x78\xd0\xee\x1e\xef\x3e\xff\xf4\xf5\xf9\x70\x77\x0c\x3f\xdc\x9e\xdb\xe5\xf0\x1a\xc9\x44\x35\x33\x0c\x67\xfe\x63\x78\x5a\xae\x9f\x41\x75\x45\xa1\xe8\x4e\x67\x30\x3b\x94\x0e\x63\x54\x38\x9a\xf6\x43\x54\x9d\xfb\x28\xcd\x20\x9e\xbf\x90\xf0\x94\x41\x30\x39\xbd\x4c\xce\x72\x28\xa1\x87\x60\xb4\xd8\x97\x53\x6d\xf3\x75\x5f\x7a\x6e\xca\xe4\x09\x4d\xe8\x59\xce\xde\x78\x21\xf6\x1d\x37\x62\xe2\x3d\x2a\x18\xc4\x42\xa1\xca\x1e\x78\xe1\xcc\xc8\x87\x25\x29\x73\x09\x01\x64\x44\x9b\x0b\x0a\xc2\xa8\xbc\xe1\xbe\x7e\xf2\x6f\xf4\x52\xf3\xfe\xcf\xc3\xbe\xa2\x3a\x92\xa2\xab\xcf\x7c\xee\x06\x37\x93\x73\x63\x84\x10\xeb\x96\x84\x62\xe0\xde\x21\x81\xee\xcb\x00\x83\xd3\x87\x82\xbb\xbe\x61\xd4\xc3\xbe\x2c\xba\xc1\xbe\x86\x0b\xfb\x0a\xfb\x0a\xc2\xf0\xec\xeb\x84\x79\xf0\x7b\x9f\xe7\xfe\x5a\x9e\xec\xdb\x7f\xe3\xd1\xb8\xbb\xfd\x4d\x1c\xe1\xe7\x5f\x3e\x1c\xcd\xa5\x1d\x65\x0b\x43\x5e\x68\x9c\x6b\xcd\x4c\x92\xba\xd1\x0d\xe5\xa8\x6c\xdb\x8c\x10\x94\x64\x2f\xb4\x2b\x5c\xec\x0a\x06\x12\xa6\x90\x71\x5a\x70\x75\x99\x5c\xef\x0c\x26\x58\xc4\x06\xea\xd0\x94\x4b\xe2\xe6\xb4\x1a\xea\x35\x7e\x6f\x7d\x6e\x31\xbd\xe1\x38\x02\xf8\x96\xdd\x02\x6e\x24\xe4\x47\x51\x55\x08\xe7\x15\x2a\x17\x6e\x20\x5e\xcf\x21\x65\xcc\x21\xfd\x35\x66\x55\x62\x13\xb2\x47\x7f\xea\x0f\x83\xc3\x1e\xc8\x1e\xec\x22\x72\xe3\x57\x79\x17\xfc\x6d\xf0\xfe\x59\x03\x6b\xeb\xe6\xef\x48\xc5\xfe\x31\xda\xbd\x3b\xbe\xff\xf9\xe8\xe9\x02\x76\x83\x49\x73\x18\x2a\x33\x9c\xc8\x35\x18\x06\x37\x11\x88\x1b\xce\x50\xc9\x21\xc0\x4c\x28\xe2\x74\x9c\x42\x72\xc6\x6b\xb4\xab\xe1\x04\x84\xb9\xce\xe5\x07\x91\x51\xa2\xdc\x54\xab\x52\x33\x5d\x13\x45\x54\xc5\x4b\xc4\xa7\x4a\x55\xa6\x5b\x52\x2a\x8c\x26\x5a\x77\xaa\xdb\xf4\xfd\x90\xc7\x66\xc4\x41\x12\xfc\x74\xd3\x51\x7a\x5d\xd4\x09\x77\x4f\x0e\x76\x84\x76\x4c\xe1\xca\x43\xc9\xf3\x4b\x1f\x4a\x57\x19\xcf\x6c\x74\x88\xcd\xaf\xb5\xa0\xa9\x49\xd9\xbe\x70\xfd\x52\xf2\xa8\x58\x06\xa8\xfd\x9a\xa1\xab\xbf\x70\xe3\x98\x78\xbc\x31\xd9\xfb\x9a\xf7\xe7\xef\x9b\xa3\x43\x2d\x04\x06\x52\x6b\xdd\x04\x99\x31\x97\xda\x42\xe0\xd8\x7e\x74\x71\x68\x96\x0a\xce\x4b\x59\x5e\x4e\x21\xbb\x34\x34\x3c\x2f\x36\xca\xd6\xbf\xbd\xfa\x22\xf4\xf9\x6f\x3f\xfd\xf3\xe0\x73\xae\x4f\x7f\xfb\xf1\xee\x3e\x6a\xcc\x64\xce\xc6\x9c\xcf\xc6\x5c\x66\x7b\x72\xf2\x3b\x7f\x96\x85\xf3\xf6\x67\x83\xdd\xb3\x5e\xca\x56\xf1\xf6\xb7\x1b\xdb\xd2\xfe\xf8\x3e\x0a\xf7\x1f\x82\xbd\x57\xc0\x79\x7e\x06\xeb\x37\x6c\x8a\x13\x64\xcc\x4d\x63\xef\x4e\x1c\x38\x04\xaa\x73\x96\x01\x05\xa6\x66\x57\x32\x68\xc0\xa8\xda\x09\x67\x71\x88\x0e\x32\xa7\xee\xdc\xe9\x7e\xf5\x42\x5a\x0e\x81\x26\xee\x34\xc8\x21\x25\xce\xcc\xf2\x9c\x60\x77\x76\x83\xf0\xb2\x65\x41\x18\x31\xcf\x71\xf5\xc4\x45\xfd\x55\xb6\xef\x5b\x4e\xf1\xcf\x9f\xde\xf8\xf8\x2a\xfb\xe5\xe3\x91\xeb\x25\x35\x30\xe4\xa5\x26\x85\x23\x06\xf2\xa1\xba\x06\xce\xe2\xe6\x94\x17\xb1\x4d\x48\xe9\xba\x6b\xa0\xf7\xcc\xdd\x44\xa2\x65\x55\x48\xe3\xb4\x93\x95\x15\xad\x70\xf2\x46\x47\xed\x3a\x8c\x09\xbd\xe5\x4c\x9b\x67\x6d\xd1\x00\xee\x1e\x6f\xc5\x28\x6b\x7f\xac\x1b\xc4\xdd\x26\x09\xf1\xe9\xe3\xdd\xc3\xfd\xdd\x8f\xc7\xc7\xbb\x23\xe2\x0e\xb5\x90\x52\x37\xf7\xd2\xf5\x12\x2a\xea\x28\x07\x66\x9c\xed\xe2\x1e\x58\x7c\xda\xa3\x45\x6b\xc7\x5b\x3b\x80\x76\x6a\x5a\x37\x5e\xae\x43\xbe\xc6\x57\x8b\xc6\x18\x88\x6b\x30\x86\x93\xd7\x6e\x8b\xa3\x21\x7a\xd2\xcd\x0d\xe0\x86\x15\x0e\x95\x31\x4e\x1a\x73\xa0\x8b\x58\x5d\xec\x00\x82\x26\x22\x1e\x43\xfa\xe6\x25\x43\xd7\x57\x0d\xfc\x29\xec\xea\xb0\x5b\xca\x28\xb0\xbf\x5a\x1b\x9e\x97\x72\x3f\x19\xa3\x8d\x33\xe3\x09\xb8\xd9\xce\x51\x7e\x45\x47\xba\x4b\x6e\x1c\xea\x01\xbc\xff\xbc\xf9\x75\x37\xc2\xed\x75\x37\x7a\xb9\x3e\x76\xf7\x1f\xde\xff\xec\x37\xcc\x77\x07\x58\x17\xee\x7f\xd9\x18\x32\x43\x0a\x69\x2f\xb9\x74\x95\xcb\x43\x01\x84\x10\xd9\xb5\xaa\x28\xdc\xf9\x1a\x10\x5d\x96\x29\x26\xc8\xd5\xae\x4e\x81\x42\x36\x5f\x83\x74\xd2\x86\x87\x18\x62\x08\xe8\xba\xa0\x17\xce\x6a\xa7\x4b\x28\xa3\x38\x4e\x30\xa5\xae\x57\x49\x89\x09\xb5\x27\x86\xca\x2c\x75\x2d\xa7\xb1\x4d\x30\xe4\xa9\xa1\x26\x8d\x79\x55\x17\x6a\xa9\x59\xa7\xc7\x8a\x54\xb5\x50\x55\x70\xd3\x3d\x6d\x0e\xca\xcf\xe3\xff\x14\x04\xe0\x0b\xcc\xb7\xa9\xfc\xe1\x09\x67\xfc\x63\xb4\xf1\x1a\xee\x59\x3b\x73\x20\x8d\xcc\xce\x90\xd0\x6b\x30\xe0\xdc\x66\xa5\xeb\x22\x2a\xab\x96\x41\xcc\x96\x72\x5f\xb9\xae\xe7\x90\x83\xc6\xc4\xf5\xb5\xa9\x13\x69\x0b\x2b\x9d\xd6\xe4\x1a\xf4\xb5\x3a\x6d\xba\x5a\x10\x99\xab\x3a\x8a\x03\xf6\x11\xdd\x8d\x9f\xe5\xe9\xf8\xb8\x31\x83\x1c\x03\xda\x0c\x1e\xe2\x28\x2f\x0c\x84\xab\xc0\x98\xba\x00\x7b\xc0\x3a\x4f\x97\xd6\x2c\xca\x98\x50\x98\x10\x25\xb1\xdd\xee\x3e\x52\x8f\x5d\x15\xcf\x71\xdd\xbb\xad\xe0\x72\x7d\xa5\xe8\xf1\x2e\x39\x7e\xf8\xf4\xc6\x17\xc1\x68\x9d\xb5\x33\x1b\x1b\xd3\x11\x88\x0b\x33\xf1\x36\x06\x6c\xcc\x41\x14\xcc\xf5\x93\x3a\x01\x72\xf5\xa0\x81\x38\xe9\xc6\xa5\x9b\x78\x17\xc6\x90\x7e\x69\xfc\x5e\xa8\xaf\xc8\xe7\x00\xff\x4c\x1b\xfb\x0f\xef\xb7\x36\xa4\x4e\x9b\x89\x0d\x8d\x3d\x51\xc8\xa9\x75\x2d\x87\x24\x06\xee\x5b\xc1\xae\x9d\xf4\x04\xd8\x35\xb3\x02\xe2\xac\xeb\x97\x66\xe2\x7d\x98\x42\xf6\xa5\xf1\xb8\xbb\x8d\x77\xfb\xdf\xde\xce\x9a\xa7\xca\xd1\xaf\x8d\xdc\x5e\x84\x9b\x24\xed\xcf\x6c\xea\xea\x99\x00\xc2\xd6\x9d\xf9\x10\x83\xf6\xe2\x26\x79\xe1\xfa\x49\x9f\xa0\x74\xcd\x69\x6d\x45\xf9\x77\x11\xeb\xbb\x24\xdb\xbb\x04\x74\xed\xaf\xdd\x18\xfc\xee\xa9\x9d\x8d\xfa\x38\xd8\xaf\xcd\xbc\x5d\xdf\xe5\xd3\xe7\x9f\x1f\xef\x1e\xa2\x73\xed\x89\xa0\xa8\x23\x0e\xbb\xda\xa5\x24\x54\xdc\xba\x40\x40\x30\xc4\xa1\xb6\x76\x37\x16\xb7\x72\x35\xe6\xc6\x41\x42\xea\xce\x27\x57\xd6\x12\xcf\x7d\x7f\x69\x6e\x1a\xb1\xa5\xdf\x1f\x5e\xf4\xdb\xd3\xee\xf0\xea\x95\x88\x29\xc6\x75\x9b\x3c\x9f\x3a\x77\x22\xc0\x85\x75\xa3\x98\x13\x18\xfd\x4b\x31\xd7\x9f\xf4\x04\xc8\xb5\xd3\xfa\x4e\xc2\x8d\x4b\x7f\x12\x6d\x18\x40\xf2\xa5\xbb\x71\x61\x6f\x75\x84\x6b\x8c\xf7\xee\xeb\x3b\xad\xed\xbc\x64\x52\xdd\xf5\x06\x41\xb2\x06\x4f\xbd\xeb\x67\x37\x62\xb0\x60\xad\x5d\x4e\xa6\xee\x89\x55\xfb\xb4\xa0\xd7\xc0\x2a\x03\xb9\x9b\x1a\x05\xb1\xeb\x2f\x26\xaa\x1c\x71\x0d\x57\x74\xe3\x6c\x8e\x22\xfa\xbd\x77\x7a\x1a\xa6\xad\x9d\x6d\x98\x54\x7e\x82\x80\x9e\xe6\xfa\x5c\x41\x59\x1a\xdd\x71\xab\xc0\xac\x73\x21\xaf\x5c\xd3\x99\x06\xb8\x6b\x87\x6a\x0d\xb5\x97\xd9\xb1\x46\x4a\x90\x70\xfa\x52\x07\x10\x4c\xbb\xea\x98\xf8\x36\x82\x37\x5f\xcf\xc6\xfb\xc9\x86\xb9\x0d\x33\xfb\xa7\xf1\x10\xbb\xb3\xaf\x73\x88\x1d\xf3\x75\x94\xe5\xd1\xee\x88\x7f\xff\x6d\x4c\xd7\x1d\xc7\x7b\xf4\xdb\xfb\xaf\xe3\xfa\x4f\xf0\x79\x17\x58\x02\x0a\x7a\xea\x4a\x47\x5c\xed\x72\x1c\xaa\x30\xb7\x76\x21\xd6\x11\x31\x34\xf1\x8e\x14\xe5\x24\x8c\x86\x78\xb6\xfa\xe4\xa6\xcb\x39\x0a\x06\x27\xac\x28\xc7\x75\x8e\xd2\x40\xfa\x33\xe7\x6b\x3f\x6f\xe3\x79\xfc\x10\xec\xb7\xdd\x77\x1d\xd3\xbb\x7d\xa9\xd1\x0c\x09\xb9\x06\x73\x33\x55\x80\x81\x68\xed\x84\x71\x27\x3c\x1c\x44\xa6\xdc\x64\xb4\x85\xcc\x4d\x0d\x83\xf8\x7c\x31\x11\x75\x27\x67\x27\xd5\x42\xec\xb5\x8e\x9f\xfa\xf7\xf7\xdf\xce\x19\x78\x6e\xe3\xfd\x9b\x7d\x61\x8a\xc9\xd3\xc5\x4e\xa3\x9b\x28\x28\xe0\xd6\xba\xc4\xba\x9e\x43\x10\x1f\x44\x41\x5d\xb7\xce\x9a\xd2\xd5\xdb\x4a\xf8\xd2\xec\xca\xe7\x99\xe3\x79\x38\xfe\x8a\x76\x3e\xbd\x6c\x67\x72\x23\x01\x03\xc2\xda\xe5\x6c\xdd\x89\x4f\x5b\x33\xfd\xb6\xac\xeb\xe9\x9b\x66\x3a\x38\xaf\xed\xa0\x5b\x3b\xff\x36\x48\x7c\x7e\xf2\x89\x6b\x3c\x78\xdd\xd0\x0f\x6f\x76\x93\x49\xb3\x75\x7a\x32\xd7\xb8\xd9\x9d\x9d\x25\x70\x82\xda\xda\xa5\x59\x77\x12\xa9\xd7\xe6\x8a\x62\x5b\x0c\xdf\x69\x8f\x01\xba\xcd\xd1\xed\xac\x8a\xaa\xdb\x59\x15\xfe\xb7\x02\x7e\xfe\x0b\x87\xd5\x3f\xc2\x76\x58\xdd\x42\xbf\x97\xa7\x55\x14\x40\x29\x2b\xe9\x98\xc3\x21\x03\x8c\xfd\x61\x95\xa3\xf5\x20\x7a\x7d\x58\x15\x90\x4f\x53\x3a\x2a\x43\x44\xd8\xbe\x3c\xac\x5a\x67\x4b\x40\x61\x9b\x94\x84\xba\x89\x27\x45\x59\x52\xdd\x55\xa8\x48\x13\x37\x6d\x67\xd5\x39\x35\x58\x26\x31\x2f\x45\x51\x96\x2e\x23\x8d\x6a\x29\xad\x34\xd7\x64\xf5\x73\x56\x1f\x83\xed\xe7\xe0\x6f\x36\x2e\xcf\x8f\x2f\x90\x9c\x3f\xdc\xdd\x27\x5e\x0e\xe9\xd3\x7f\x80\x2d\xda\xd9\xa7\xce\x44\x4d\x2c\xeb\x4a\xa5\xa6\xc2\x69\xe9\xa6\x0c\xcd\x6d\xd5\x8c\xf8\x1a\x58\x8c\x0d\xdb\x53\xf3\x25\x70\x55\x56\x67\x02\x8a\xa8\x59\xaa\xf6\xec\xea\x4a\x56\x80\x40\x02\xcf\xdd\x38\x14\x67\x7f\x56\x95\x37\x1f\xfd\x56\x6f\x12\xde\x25\x3f\x3c\xfe\xf1\xcd\x06\xf8\xb9\x4b\xde\x3c\x24\x1e\x93\xee\xd1\x57\x5b\x48\x72\xff\xf1\x7e\xd7\x6a\x10\x49\x9a\x16\x89\x4a\x19\x61\x55\x72\xca\x44\x55\x19\x7a\x0d\x38\xc4\xa5\x90\x15\xa5\x89\x3b\x41\x76\x10\xce\x38\xea\x06\x77\x72\x13\x14\x99\x9b\x2d\x64\xd0\x42\x00\xd8\x9d\x07\x65\xe4\xe0\xaa\xb3\x38\x43\xa3\x44\x85\x29\x10\xbd\x69\x20\xac\xe7\xdc\x1a\x8b\xdc\x90\x04\x21\xfc\xe4\x37\x9e\xd5\x82\x20\x7a\x78\xfc\xe1\xcd\x0f\x6f\xb6\x1a\xe9\x88\x46\x67\xe4\xfa\x0e\x62\xb1\x06\x63\x5d\x05\xa4\x77\x27\x86\x4f\xe4\x3c\x21\x67\x39\xd1\x25\x3f\xa4\x0b\x75\xe9\xb9\xd3\xed\xea\xea\xb5\xba\x59\xc3\x96\x90\xb8\xc4\x29\xd0\x30\x72\x5d\x13\x6b\x82\x1b\xbf\xab\xb9\x69\x2f\x3c\xeb\xf5\x3e\x4b\x04\x3e\xdf\xd1\x6d\xf9\xf6\xe3\x87\x1f\x56\x57\xf4\xcd\xdd\x83\x27\xb0\xda\xcd\x26\x2f\xe6\x1c\x5b\x92\xb7\xd7\x60\x1c\xc7\x11\xd2\x45\x69\x46\x3a\x20\x1e\xe6\x70\x10\x85\x56\x46\x16\xa6\x31\xd7\xe0\xf6\xa5\x76\xdc\x28\xa0\xce\x87\x10\xae\x7a\x7a\x06\xc1\x0e\xda\xab\xde\xad\x7e\xdc\x7f\xfc\xaa\xf2\x13\x46\x2f\x48\x46\x9f\x75\xf7\x8f\x9f\x3e\x7f\x7a\x42\x1e\xbd\xa8\xa9\x6b\x75\xd7\x0f\x49\xca\x71\x21\xb2\xee\x94\x4b\x29\x64\x66\xb9\xa6\x96\x11\xcc\xcb\x5c\x66\xa5\x33\x22\x29\x45\x09\x45\xf1\x7f\xd3\xf6\xf7\x40\x76\xeb\x58\x9e\x20\x4e\x90\xf7\x83\x35\xfd\xff\xf7\x50\x4f\x4f\x4f\xec\xee\xa9\x19\x66\xe7\xd3\x13\x7a\xbb\x67\x1a\x5d\x6a\x49\xd8\xed\x98\x6a\xc4\x1a\x13\x88\xd9\x88\x09\xec\x46\xec\x06\xd6\xd9\x80\x09\x13\x26\x4c\x98\x30\x61\xc2\xa4\x49\x93\x26\x4d\x9a\x34\x69\xd2\xa4\x79\x4d\x9a\xb7\x4a\x49\xe4\xc6\x05\x6f\xa6\x32\x25\xd5\xab\x7a\x53\xb3\x92\xee\xbd\xcc\x1b\x8a\xc4\x39\x07\x07\x07\x5f\xe7\xfc\x7e\xa5\x2d\xe0\x5e\xe3\x40\xee\x13\x4a\x10\xf6\x1d\x96\x0c\x19\x3f\xc3\xd2\x9d\x80\x81\xa1\x1e\xf3\xd2\xdd\x2d\xbe\x87\x7d\x5d\x54\xe1\x3c\x93\xd3\xdc\x8e\x68\xea\x92\x1d\x58\xee\x5d\xe4\xad\xfd\x05\x72\x1e\xaf\xb8\xf6\x17\x69\x77\x95\xed\x86\xae\x28\x15\x86\xba\x68\xa7\x4a\x6b\x2e\xab\x5a\x78\xe1\x28\xa6\x14\x15\xba\x84\x08\xe6\x36\x2f\x1b\x53\x72\xcd\x2f\x52\xd2\xfb\x84\x10\x8c\x7c\x87\x05\x45\xc6\x8f\x55\xb1\x49\xe9\xfa\xbc\x70\x77\xe7\x28\x65\xde\x4e\x68\xee\xca\x4d\xd6\x78\xc6\xde\xdc\xf3\xa3\x3e\xe8\xcf\xf7\x68\x4f\x07\xd7\xcb\x0d\x37\x69\xb3\x62\xeb\x2b\x08\x74\xae\x1c\xe1\x85\x20\xa8\x40\x79\x58\x98\xd0\x9d\x10\xd8\x22\x71\xd0\xc8\x98\x4f\x32\x34\xa5\xaf\x38\x28\x32\x31\x7a\x01\x70\xe0\xc3\xcc\xe6\x3e\xd9\xa5\xe4\x5e\xee\x69\xc4\x3e\xdf\x72\x99\x13\x10\x79\xc4\x36\x5a\xc3\x8f\x9f\xcf\x16\xae\x56\x01\x5f\xf7\x5c\x29\x19\xa7\x6e\x58\x9c\x29\x2b\xc3\xa0\xcd\x8b\xe9\x3e\x81\xee\xa1\x03\x41\xce\x91\x85\x3c\x48\x5b\x32\xcb\x80\x40\x95\x2b\xe1\x0e\xe6\xa5\xef\x50\x80\x61\xaa\x10\x23\xb0\x19\x10\x46\x0c\x99\xfa\x54\x5d\xfb\xb0\xb9\x6b\xea\x1e\x0d\x5b\xff\xd1\x79\xbe\x18\xa8\x4d\x0e\x19\x8c\xf5\xc0\xf2\x11\xdb\x64\x5b\xf1\x5f\xd1\x4d\xd2\xaf\x78\x7e\x37\xf4\xac\xdb\xf4\x19\x90\xfb\x87\x8f\x37\x20\xa2\x8c\x1e\x73\x16\xd4\xda\x22\x30\x83\xc1\x4a\xad\x4d\xe8\x19\xf4\x90\x4e\x0c\x5b\xc4\x28\xa0\xa8\xaa\x49\x2a\x5a\xe4\xba\x5a\xd8\x79\x0a\x35\x05\xb0\xab\x7b\x4e\xc2\x92\x72\x8d\x42\x8f\xc9\x41\x3a\x59\x7a\x4f\xef\x13\x2b\xeb\xce\xd4\xb8\xb1\xa5\xf1\xcc\x9b\x40\x95\x2c\x06\x17\x4e\xad\x54\x4e\x9b\x86\x3a\x6c\x38\xaf\x5d\x70\x66\xb1\x22\x49\x0e\x59\x17\x73\x19\x9f\xea\x82\x7f\x91\x2e\x1f\xa2\x2e\xb7\x9b\x2e\x3f\x1c\x4b\x1a\xfc\xba\x20\xd0\x82\xc6\xaa\x8b\x32\x0b\xad\x7c\x45\x1b\x0a\x1d\x24\x15\xc8\x61\x59\xa3\xb4\xa8\xa1\xf2\x56\xa8\xbe\x0d\x0b\x5b\x9c\xef\x18\x1e\xd2\x44\x54\xf7\x09\xc6\xe6\x20\xad\x2a\xeb\x4d\x17\xdf\x28\x87\x9c\x2e\xa5\x41\x46\x05\x24\x45\xd1\x5d\x75\x51\xda\x53\x87\x35\x17\x17\x5d\xec\xc9\x0a\x92\x1c\x12\x79\x8f\x63\x9e\xf7\x37\x75\xf9\x12\x75\x26\xbb\xf9\xf8\x70\x3a\xbb\xdb\x1f\x7f\x7a\x73\x59\x0d\xfd\xeb\x65\x22\xfc\x3b\xb0\x1d\x45\x1f\x0c\x5d\xdb\xbb\x06\xa5\x43\x6a\x1a\x69\x9c\x0d\x05\xab\x1c\xa4\xc1\x5c\xfa\x87\x2d\x29\xc2\x6d\x59\xee\x68\xe0\xdc\x81\x0a\xe4\xf2\x14\x4c\x68\xd7\x33\x03\xe5\x38\x05\xc8\x68\x40\xa9\xc5\xf8\x34\x37\x6c\xd7\x18\x51\x3a\x89\x7b\x43\x3d\x17\x0a\x69\x51\x5c\x54\x92\x61\x54\x05\x86\xbe\x55\x94\x3b\xa1\x3c\x76\x25\xc2\x5a\x48\x86\x30\xe2\x6e\xab\x53\x93\x5f\xf9\xda\x2f\xeb\x9f\x1f\x9f\xf7\x4f\x71\x65\x96\x1e\x40\x6d\x85\xd4\x2a\xcc\x97\xfe\x21\x03\x83\xb6\x62\x15\x28\x60\x55\xe3\x14\x37\xc8\x34\x5e\x98\x71\x08\x1d\x05\x65\xe3\x3b\x46\xa6\xb4\x94\x30\xcc\xe8\xd2\x41\x7f\xcc\xd9\x1a\xf5\x85\xb3\x6d\x1d\x14\x73\x16\xe9\x9f\xa6\xcf\xfe\x59\x1f\x5d\xf5\x89\x7d\xf4\x74\xec\xfc\x70\x4c\x78\x28\x56\x82\x53\x9a\x62\x6b\x6b\xdd\x04\x2d\xa0\x87\x3c\xf4\x9a\x58\xa2\x10\xb0\xa2\x86\x28\x9d\x27\xdc\x4c\x83\xd8\xd6\x4d\x94\x02\x3d\xf7\x27\xc9\xc2\x90\x76\x35\x0e\x9c\xb2\xfe\x67\x74\x9a\x0a\x29\x1e\x06\x90\x6d\x1f\x75\x32\xf6\x6c\x05\xdd\x74\x5a\xbe\xd0\xe9\x37\x3f\xaf\xd3\x87\x67\x4a\x7d\x33\x20\xf0\xd5\xe3\x34\x01\xb3\x55\x46\xdb\xd0\xc7\x3e\x0a\xe7\x18\x4c\x21\x20\xa8\x6a\x60\x95\x9a\x0e\xbb\xbe\x11\x6e\x99\x83\xa5\x80\x0c\xed\xc8\xe9\x7d\x92\x0a\x8b\x42\x4d\xfe\x48\x48\xf8\xac\xd2\x93\x6e\xb2\x76\x8b\x09\x69\xff\xcb\xfa\xe8\x99\xcf\xbd\xf9\x52\x9d\x1f\x2e\xfa\xd0\x55\xa3\xb4\x00\x67\xab\xad\x76\xa1\xa5\xd0\x57\x34\x9c\x62\xf6\x62\xd4\xa7\x26\x69\xd3\x63\x3f\xb4\xc2\xdf\x27\xa7\xa0\x29\xa0\x63\x37\x89\x8b\x3e\xca\xa1\x60\x08\x6d\x7e\x46\xa1\x27\x71\x61\xd3\x67\x8b\x0b\xd7\x2e\x3a\xa4\xea\x7f\xac\xcf\xe5\x2c\x54\x2b\x47\x29\x4a\x2b\x6b\xbc\xae\x83\xe5\x97\x80\x10\x46\x49\x2d\x91\x10\x28\x5e\x57\x28\x1d\x46\xdc\x4c\xbd\x68\xc2\xf9\x3e\x09\x82\x01\x39\x77\x27\x49\xc3\x9c\xd6\x0e\x07\x45\x69\xfb\x27\xfa\xdc\x93\x0e\x7a\xe2\x73\x89\xb9\xec\x69\xb3\x2e\xf9\x37\x91\xfb\xe2\x1f\x93\x7f\x8e\x38\xcb\xf1\xbe\x30\x8a\x1f\x81\x33\x63\x78\x7b\xf5\xee\xd5\xed\xc3\x5a\xfe\xe3\xcd\x87\x8f\xb7\x6f\xde\xdf\xfc\xf0\xfa\xf6\xa7\xb7\x37\xc7\xfd\xc7\x87\x27\xd0\x29\xc6\x41\x61\x34\xc4\xbb\xfa\x77\x1e\xe4\x65\xbe\x3b\x17\x20\x09\xe7\xdc\xd5\x45\x43\x64\x69\x48\x95\x7f\x92\x55\x71\xde\xdb\x70\x99\x93\x20\x0e\xbe\xc8\xc6\x3c\x40\x54\xd5\x08\x87\xa6\x48\x0d\x83\xca\xb5\x14\x63\x13\x46\xa5\x4f\x0a\x63\xdd\x96\xba\x40\x4a\x2b\x85\x31\xc6\x6a\xde\x3e\xb6\xb8\x46\x63\x4d\xf1\xbf\x89\x39\xf4\xff\x74\x45\xfb\x7c\x88\xc8\x6f\x3f\xbc\xbe\xc9\xde\x6d\x20\xf9\xb7\xe9\x53\xe1\xdf\xbf\xfb\xf0\xfa\xe6\xc3\xfb\x9b\xc3\xb6\x2e\x00\x97\x65\xc8\x35\xb5\x5e\xd7\x45\x95\xea\x95\x08\xa9\xba\x32\x2b\x0a\xa5\xf3\xc2\xd8\xaa\xc3\xb2\x32\x04\x15\x2b\x83\xa5\xb6\xa5\x05\x73\x1e\x50\xde\x33\x2a\x29\x03\xa2\x08\x55\x51\xce\x9c\x08\xca\x0e\x06\x52\xea\x1a\xa1\x87\x39\x20\xd7\xd4\x36\x9c\x0a\x5b\xb8\xe9\xec\xe6\xb9\xa9\x5b\x8b\x99\x16\x64\x95\x80\xb6\x1e\x40\x72\xf9\x21\x39\x44\x4c\x96\x4d\x8f\xb7\x11\xc7\x04\x3f\x20\xb2\x3c\xea\xf1\xfd\xf1\x4b\x45\x3e\xfc\x31\x4d\x48\xc4\x73\x5f\x73\x21\x55\x8b\x32\x98\x6b\x93\x17\xd6\x17\x03\x51\xa5\xa1\x65\x95\xaf\x18\x96\xc6\x95\x36\x4d\xf2\x50\xe4\x03\xa7\x82\x31\xa0\x8a\x90\x94\xc5\x72\xf9\x81\x6f\xaa\xd4\x42\x77\xd3\x79\x7a\x54\x05\x89\x9f\xd5\x25\xb9\x8c\x93\x7a\x9f\x27\xbf\x4a\xfe\xf6\xaa\xcd\x03\xcf\x44\xc4\x28\x8d\xbc\x04\x97\x5e\x39\x3e\xf3\xa8\x97\xb7\x6f\x2e\xe3\xe2\x8a\xe5\x16\xc7\xc8\xc6\xa6\x0e\x26\x87\xf6\xe8\xf7\x92\x78\x7b\x59\xa5\x2f\x65\xb1\x17\xc5\x30\x56\xbe\x81\x27\xd9\x96\x83\xa4\xd5\xa7\x9c\xcd\xfb\xb1\xf8\x34\xe6\x05\x60\x73\xcf\xc6\x39\x2b\xcb\xfc\x53\x5f\x94\x80\x83\x62\xe2\xa7\xfb\x64\x9f\x43\x6e\xa5\x92\xed\x3a\x76\x7d\xb0\xf6\x64\xa7\xc2\x16\x0c\x28\xbb\x18\x35\x41\x2c\x30\x0c\xa5\x56\xfa\xf2\x2c\x31\xba\x8c\x0d\x7a\x8f\x77\x45\xec\x93\x1f\xe3\x7a\xf2\x91\x95\xf0\xd5\x4d\xac\x3f\xc8\x2e\x8a\xc4\x6e\xc9\x9e\xb9\xd7\xcb\xdb\x37\xff\xfc\xf1\x26\x7b\xf9\xa8\xc9\xc3\x23\xa9\x51\x9a\xac\x1d\x85\x44\xd5\xca\x16\x79\xea\x72\xa5\x4b\x2e\xcb\x96\xea\xca\x31\x54\xae\x13\x32\x69\x9d\x07\x5b\x74\x0c\x69\xc8\x40\x59\xe4\xc1\x54\x03\xc3\x1a\xb1\x83\xa9\xbc\xd3\x84\xea\x6e\x65\xf3\x79\x39\xd9\xd0\xb9\x30\x57\xae\x72\x60\xb2\x4d\x1d\x3a\x00\xb9\x24\x82\xaf\x2c\xfe\x80\x84\x22\x52\x6c\xf3\xca\x9f\xee\x5b\xdf\x1f\x7e\x6e\x94\x5c\x74\xd9\x96\xcd\xbb\xa4\xa9\xca\xf4\x74\x37\x6e\xbe\xc5\x73\xeb\xf2\xc2\xd5\x46\x52\x55\x5a\x4a\x8a\xbb\x33\xaa\xea\xa6\x74\x29\xca\xd7\xb9\x98\x24\x13\x5c\x00\x57\xe4\xeb\x80\x40\x12\x7f\x7a\xf4\xad\x7e\xde\x7c\xcb\xf8\x6f\x0d\x93\x4d\xb1\xcd\xb5\x92\x43\x3a\x5d\x75\xf9\x55\xf2\x53\xf2\x0f\x8f\xe8\xac\xaf\xff\x4c\x55\x48\xba\xdc\x0d\x35\x56\x3d\xfe\xef\xd4\xc4\xb9\x09\xfe\x02\x45\x0e\xa9\xb9\xea\xf1\x17\xc9\xdb\xa7\x7a\x1c\x1e\x9d\xeb\x67\x34\xf9\x17\x70\xf3\xf2\x1b\x7a\x64\xbe\x29\xab\x8c\xde\x29\x86\x98\xea\x48\x56\x17\x75\x93\x17\x4d\x67\x15\x35\xa5\x63\xb4\xb8\xeb\x61\xd5\xf4\x75\xaa\x8a\xd5\xe7\x67\xce\x04\xe3\xa0\x29\xf2\xd5\x22\x80\xc5\xe7\x2e\x31\x84\xe9\x7e\xfc\x42\x15\x40\xbf\xdd\x23\x49\x92\xa5\x08\xc8\x58\xb7\xf3\x36\xf9\xa7\x67\xd1\x77\xd3\xe0\xf8\xe5\xbc\xf1\xfe\xdd\xb6\x05\x03\xef\x6f\x8e\xd7\x7b\xd6\xcb\x60\xdf\x1e\x33\xe6\xf3\x22\x1b\x3e\x2d\xb0\xc8\x86\xdc\xd7\x85\x32\x45\x17\xe3\x15\x2c\xee\x44\x55\x76\x7d\x91\x63\x22\xfb\xcc\xae\xa8\x00\x04\x42\x4d\xf1\x5c\xac\x65\x5e\x00\x52\x55\x86\xa2\x83\xad\x60\xe5\x68\xd1\x38\xd3\xda\xb9\xb0\x05\x77\x8d\x51\x9a\x60\xd5\x06\xd5\xb6\xb0\xa2\x94\x86\xb1\x15\x2c\xa2\x8a\x27\x5b\xee\x3f\xcb\xba\x03\xb9\xce\xeb\xd7\xaa\xa3\x6d\xc8\xbe\x7c\x9d\x66\x6f\xbf\x4b\xcf\x92\x4b\x21\x95\xe0\x92\x4b\x67\x44\x67\xbb\x03\xa1\xd2\x68\x16\x14\xe5\x56\xb1\x40\x78\xe8\xc2\x28\x01\xbc\xcc\x49\xcd\x93\xbe\xdd\xa2\xdf\xbf\xfe\xe1\xbe\xfd\xd9\x59\x69\xe3\x8f\xd8\xbc\xd4\xf9\xa2\x4a\xd5\xca\x68\x45\x85\x87\xe9\x9c\x4b\x55\xe4\xda\x56\x3d\xe2\xa5\xc4\xb8\x58\x5d\x55\x2a\x53\x18\x30\xe4\x81\xe6\x1d\xa7\x82\x72\x40\x8a\x3c\xe0\xa2\x9c\x05\x93\x97\x68\x5e\x31\x7a\x89\x20\xaa\x1b\x9f\x84\xf3\x27\x9e\x4a\x35\x23\xab\x6a\xea\xd6\x83\x0a\x53\xcd\xb7\x5c\x7e\x93\xf4\xc7\xe2\x00\xaf\x95\xc2\x09\x78\x46\x63\x9a\x5e\x8b\x24\xb7\x0c\x9e\x74\xde\x21\xae\x95\xaf\x6a\x05\xcb\x3c\x08\x1a\xb8\x00\x92\x86\x96\x65\xc3\x1d\xae\x53\xbb\xea\x03\x0c\x55\x57\xd4\x05\x03\x45\x10\x8d\xb1\x80\xac\xdd\xaa\x3d\x78\xc4\x74\x38\xe6\xbb\xf2\x8a\xf3\x96\xbc\x7c\xd2\xd6\xc7\x6b\x5b\x4f\x73\xeb\xc7\x03\x96\x5e\x37\x55\x6b\x48\x55\xac\xa5\x58\x6b\x9e\x16\x72\x5d\x0e\x95\xff\xe4\xbd\xdf\xc9\x4f\x7e\x57\x06\x5d\x97\xbe\x24\x7d\xb0\x22\x22\x04\xa2\xd5\x51\x9a\xaa\x20\x63\x42\x43\x16\x79\x08\x4c\xcc\xbb\xdd\xb8\xc0\xbf\xa1\xdf\xd3\x36\xb3\x2e\x1b\xa4\x17\xb6\x72\x82\xa0\x3c\xb4\x28\x34\x12\x40\x18\x86\xac\xa9\xd7\xb6\xae\x53\xb6\xb6\x87\x6a\xad\x4f\x65\x5d\x1a\xe0\x42\x39\xb8\x06\xe8\x35\xbf\xeb\xb4\xce\xe8\x3a\x80\x3a\xc9\x92\x11\xd4\x59\xfe\x58\xdf\x1b\xb3\x54\x2f\xaf\x57\x2f\x6e\x5e\x64\xf9\xe5\xff\x84\x33\xc8\x0f\xf9\x27\xbf\x93\xa1\x00\x32\xf8\x6b\x26\x6a\xbc\x57\x03\xe2\x48\x0f\xe8\x5b\xfd\xb1\xd9\xe8\xe3\xed\x43\x7f\x64\x2e\xeb\xa4\x67\xaa\xd2\x9c\x54\x45\x50\x38\x62\x08\xa1\x13\xcc\xf8\x5d\x53\x47\x8a\x40\x14\x68\x9b\xbb\x42\xcd\xa1\x75\x56\x9d\xd6\xd3\x3a\x59\x50\x6e\x77\x38\x74\x87\x3f\xdb\xe5\xe5\x1f\xb1\x8b\xcf\x6a\xe9\x2e\x4d\x31\x02\x8b\xd0\xb3\x50\x73\x00\x71\x98\x33\x5d\xaf\xa7\xba\x8e\xf8\x07\xd5\xda\xcc\x65\x5d\x2a\xe0\x02\x3a\xeb\x05\x88\x8b\x59\x8c\xc9\xe8\x3a\x02\xff\x50\x9b\xd9\x1c\x74\x64\xf6\xfc\xc7\x88\xfe\xbc\xd5\x66\x6e\x99\x4f\x17\x0f\xfb\xac\x6b\x4c\x7d\x8a\x89\xfa\x37\x2f\xdf\xbd\xf8\x3b\x70\xbd\x80\x07\x5b\x4e\x54\x96\x59\x50\x39\xe3\x63\xbd\x25\x2f\x18\xc3\xa4\xa2\xb8\x28\x8a\xde\x3b\x14\x26\x76\x8a\x6f\x61\x06\xad\xf1\x3a\x2c\xc6\xa9\x6a\x5f\x4f\xd3\x34\xad\x73\x58\x82\xee\x0b\x9b\xe3\x65\x95\xa9\x0f\x2a\x9c\xed\x04\x70\x8a\xb6\x12\xce\xcb\x6b\x15\x5b\x19\x67\x58\x92\x7d\xd2\xde\x93\xa3\xdc\xf9\xa7\x32\x6f\xf7\xbf\x0f\x35\xa5\xcf\xd8\x8b\x1f\x00\x9f\x6e\x1e\x48\x4a\xde\x5d\x89\x4a\xf6\x37\xef\x6f\x26\x70\xae\x01\x76\x60\x0c\x28\x45\x85\x50\x4c\x94\x82\xc2\xaa\x08\xda\x85\x8e\xae\x27\x06\x7a\x1a\xa2\xf9\xf2\xd4\x5f\xfe\x23\xfa\x04\x01\x09\x27\xd0\x01\x1c\x86\x5d\xa1\x94\xb5\x81\xd8\x50\x77\xb9\xcf\x71\x17\x0a\xb0\x04\xc1\x3d\x01\x15\x68\xea\xcb\x9f\x40\xad\xb5\xc9\x3e\x15\xf1\x9e\x79\x89\x67\xad\xff\x29\x62\x00\x26\xe0\x4a\x5b\xf0\xee\xb9\xd8\x9f\x2d\xbd\x49\xfd\xe6\x0a\xb8\x03\xde\xdf\x1e\x6f\x3f\xde\x1e\xb3\x39\x4c\x00\xba\xce\x45\x74\xd5\xba\x10\x12\x93\x52\x57\x55\x7e\x76\x13\x0b\x0d\x05\x25\x09\x3d\x07\x75\xe7\xba\xd0\x75\x85\x2b\x6c\x95\xe5\x9d\x69\xdb\xa6\x09\xb4\x0b\xbe\xcf\x0d\x9d\xd6\x73\x9a\x07\x26\x1d\x07\x08\x74\xf1\x4f\x28\x2e\xef\x31\xfe\xb8\x64\x8c\x9c\x3d\x0f\xf9\x31\x3f\xbc\x3c\xbe\xdd\xed\xb7\x93\xcd\x1f\xdf\x7c\xa6\x0e\x3c\x94\x9d\xa9\x49\x20\xa1\x40\xe7\xb6\x6e\x1a\x40\x01\xa7\x6c\x35\x59\x7d\x27\x62\x31\xf4\xbe\x9f\xef\x13\x6a\x79\xe5\x7a\x60\x50\xf0\xbe\xa4\x4a\xae\xfd\xea\x3c\xa0\xd7\xfa\x15\x97\xc2\xe4\xff\xf7\x98\xef\xbf\x3f\xfe\x98\x7d\xfc\xe1\x75\x84\x94\x7b\x11\x73\xfd\x23\x81\xd2\x41\x0a\xed\x1a\x00\xf5\xaa\x6b\x8f\xbc\x5f\x0b\x43\x15\x20\xf0\x34\xb2\xd1\x09\xd0\x81\xce\x70\xa2\xb9\x9d\xc0\x0c\xbd\xa5\x96\x31\x1a\x16\xae\x29\x62\x67\x85\x4d\x93\x24\x20\xb6\x55\x83\x2e\x79\xf5\x39\x57\x20\xe6\xdd\x3c\x82\xa2\xd6\x59\x51\x67\xe5\x7a\x31\x48\xcb\x42\x2c\xdc\x98\x02\x91\xc0\x02\xb8\x3a\xa0\x28\x75\x9e\xd6\x7a\xba\x44\x85\x49\x5b\x7e\x89\x29\x97\x79\x87\xef\xc6\x88\x90\xfb\xeb\x2b\x27\xe5\x96\xf7\xf8\x3a\xd9\x0c\xf5\x64\xb4\xee\x0d\x80\xad\x87\x68\x25\x2b\x21\xa0\x07\x89\x0f\xa7\x19\x0c\x69\x29\x0d\xa8\xeb\x4f\x93\xbb\x96\xb2\xf7\x13\xc7\x98\xe5\x76\x00\x08\x87\xc1\xe4\x58\xf0\x90\xac\x4a\x88\xd4\x05\xbe\xc5\x89\xfe\x9e\x1e\xe9\xae\x4e\x8a\x58\x41\x1e\x33\xc2\x1e\xae\x80\xb6\xe6\x9f\x34\x9b\x36\xbe\x6b\xc0\x94\x26\x8c\xb9\x71\x74\x76\xb5\x2b\x82\xa0\xda\x4d\xf5\xa7\xb6\xae\x77\xec\x53\xbb\xab\x51\x38\xe9\x12\x33\x2a\xda\x45\x79\x5a\x9a\x3a\xc8\x55\x31\x16\x1b\x2c\x92\x34\xe6\x4b\xb5\x11\x67\xef\xc7\x88\x6c\x1e\x91\xaa\xbf\x40\x23\xbc\xc9\xae\xbc\xc8\xdb\xe4\x69\x86\xac\x5d\x5b\x08\xea\x0a\x56\x45\x5e\xe7\xcc\x59\x12\x66\xeb\x7d\x75\xee\x08\x68\x28\xb2\x90\xec\xad\x73\xe1\xf4\x69\x82\x15\xd2\xa8\x91\x54\x65\xfd\x5d\x55\x61\x27\x2a\x93\xb1\x76\x22\x73\x9b\x64\x09\xbd\x57\xd9\x72\x50\x8f\x36\x7e\x9d\x1e\x3f\x44\x5d\x1f\x32\xc5\x9e\x11\xe8\xf6\xbe\x73\x13\x48\x30\xb5\xb5\x70\x25\x0c\x5d\x68\xc9\x39\xc5\x75\x90\x75\xac\x5e\x3f\x28\x1c\x70\x5b\x60\xad\xf8\x39\x9c\x38\x63\x2c\xf7\xa0\x5a\xdb\xbb\xd9\xfb\xac\x0a\xc5\x65\x52\xcc\x92\x31\xe5\x31\x87\xe9\xc5\xb5\xf6\xe0\xf5\x61\xb3\xef\x63\xff\x66\xd7\x5c\xe5\x8c\xba\xb6\x03\x16\xb4\x5c\x68\x50\x0e\x9a\xb2\xd5\xae\x18\x02\xd5\xed\x93\x4f\x49\x9d\xf5\x77\xe4\xa0\x51\x2f\x4b\x44\xb0\x68\x3b\xcd\x08\x2b\xad\x0e\x6d\xa8\xec\x78\xc5\xa3\x75\x07\xf3\x75\x3f\xbe\xfc\xba\x1f\x77\x6d\xd3\x75\x00\x02\xca\x84\x1f\x6c\xcd\x82\x08\x15\x02\x79\x56\xd6\xab\xad\xeb\xc8\xea\x6c\x50\x60\x6d\x81\xac\x26\xe7\x30\xd2\x86\x96\x7e\x5e\xc7\xa7\xd1\x7e\xbb\xb7\xdc\xda\x7c\x62\xcf\x1f\x9f\xda\xf3\x79\xa3\xac\x19\x27\x20\x80\x95\xca\x9f\x6b\x8f\x70\x28\x2e\xab\x70\x92\x99\x7a\x4d\xea\x3a\x4b\xd6\xe4\x8b\x56\x39\xfb\xaa\xd9\x2c\x75\xbf\x44\x4f\xd3\x0c\x23\x60\x40\x72\xe5\x67\xef\x79\x80\xeb\x19\x81\x2a\x63\xf5\x4a\xea\x3a\x32\xb4\x1a\x14\x68\xf3\x47\xf4\x8c\x58\x55\x97\x36\xff\x6d\xf2\xef\x92\x9f\xe2\x7d\xfb\xbb\x0d\x11\x7f\xc3\xab\x02\x9f\x71\xe9\x8f\x3f\xbd\x8c\xc0\x54\x2f\xde\xbd\x78\x73\x72\x66\xc3\x0d\xc8\xef\x26\x03\x20\xc2\xd2\x12\x53\x41\x4a\x38\xf4\x1b\x0a\x57\xbf\x3f\x85\x2a\xd5\x61\xb6\xa3\xb5\xab\xb2\x92\x81\x12\x08\xe8\x8d\xb2\x42\x82\xf1\x8e\x7b\x91\xa9\x15\xd1\x2b\x0f\xf4\xce\x44\x19\xde\xc4\xbb\x86\xff\xfc\x35\x66\x56\x76\x45\x45\x7c\x5e\x56\x9b\x3d\x66\xcd\xbd\xba\x7d\x0a\x7c\x97\x22\x1f\x11\x90\xba\x4f\x53\xe3\xea\xd3\x64\xe6\x51\x4b\xc6\x98\xc1\x5c\x68\xd6\xf6\x36\xf5\xd6\xae\xd2\xa6\x4e\x95\x44\x92\x60\x29\x92\x90\x1e\x8c\xb3\xc6\x5a\x80\xc2\xb8\x0e\x97\xa5\x8d\x36\x8d\xb0\x32\x0c\x00\x5a\xa9\x65\x07\xc6\x3b\x94\x8d\x9f\x88\x94\xbb\xb6\xac\x0d\x36\x5a\x1a\x72\xe5\xb5\xd8\xb1\x2b\x07\xe1\x65\xa5\x7e\xf3\x2c\x47\xe6\xbb\x2b\x57\x45\xcc\x65\x7c\xa4\x49\x7d\xbb\x6f\x6c\xd9\x4d\xac\xef\x54\x27\xe7\x8e\x63\x83\x38\x21\xc4\xb0\x50\xa5\x56\x7a\xce\x75\x37\x1d\x34\xe4\x1b\x48\xb3\x08\xdd\x49\x02\xea\xa5\xa2\x4a\xac\x04\xa2\xa6\xb1\xf6\x34\x30\x6e\xa7\xad\x06\x3a\x6b\x1e\xef\xf3\x1f\xdb\x7f\xc8\xcb\x78\xfd\x90\xd3\xb4\xb5\xfc\xe6\x8a\x3b\xae\x5c\x35\x82\x44\x8c\xa7\xfa\x24\x01\x1c\x05\x76\x88\xdf\x27\xe9\x59\x79\x4e\xd5\xe9\x3e\x91\x4a\x18\xbe\x76\x51\x88\x7a\xa8\x1b\x60\x43\x3b\x29\x80\x5a\xa1\x98\x12\x61\x74\xe7\x89\x10\x3b\x39\x4d\x48\xd7\x5f\x79\xbc\x64\xb6\x3c\x91\xe1\x9a\x57\x75\x19\x32\xc7\x6f\xda\x20\x85\xfe\x24\x01\x6a\x2c\x1e\x7a\xe5\xfb\x68\x04\x2e\x84\xa6\xeb\x92\xb6\xc2\x31\xa6\x86\x65\x8f\xc2\x38\xab\xcb\xf4\x0b\x7d\x7f\x9f\xc8\x11\x4a\x43\x8d\x5c\x25\xa1\x5d\x67\xed\x79\xa4\x4c\xcf\x3e\xf6\x01\xbe\xf7\x11\x4f\xeb\x57\x57\xce\xa9\xcf\x95\x77\xaf\xd3\x2c\x26\x5a\x7d\x07\xbe\x7b\x79\x4c\xb3\x9d\x00\x02\x31\xcf\x21\x28\xef\x96\x94\xd6\x52\x01\x78\x57\x83\x5a\x87\x49\x56\xbe\x92\xfb\xaa\xb6\xb8\xee\x1d\x43\xeb\x10\xf1\x44\x17\x70\x0e\x22\x70\x08\x7a\x60\x93\x47\x5d\xdb\x5f\xa4\x6b\x1e\x59\xc1\x6b\x83\xba\x56\xba\x86\x21\x8d\x28\xe3\x5c\x92\x50\xa6\x4e\x58\x46\x64\x3f\xef\x51\xe8\x86\x4d\x57\x37\x7c\x43\xd7\x89\xd2\xab\xae\x97\x71\xbb\x53\x31\xaf\xe2\xbb\x27\xed\x1f\x9e\x0a\xf0\xac\xfd\x37\xa9\xaa\xcf\x0a\xe0\xc6\x15\xe5\x69\x52\xed\x29\x1e\xb6\xab\x93\xe3\xab\xcb\x2a\x5d\x4b\xae\x97\x30\xed\x45\x88\x38\xaa\xa0\x81\x08\x8d\xe1\xac\x67\x1a\xb9\x7f\x56\x66\xda\xce\xb9\x65\xa4\xd4\xce\x2e\x49\xd2\xcc\xc6\xfc\xe4\x32\xde\xf0\x5e\x39\x19\xd2\x57\xdf\xff\x0b\xd8\xa6\xba\xbf\x07\x7f\xfb\xd3\xfb\x7f\x7e\xf9\x30\xd9\xbd\xbc\xbd\x9e\x04\xd8\x6c\x5c\x6d\x05\xce\x1c\x23\x58\x15\xb6\xe4\x5c\x70\xc1\x83\xb5\xae\x2e\x97\x96\x8c\x23\x18\x70\xe5\x4a\x74\x28\x5d\x98\xef\x4a\xc6\xb1\x86\x8d\x14\x82\x66\xe6\xae\xac\x90\xa5\x95\xda\x0f\xab\xd9\x2e\x2a\x23\x9e\xbb\x48\xaa\x0c\x1d\xf2\xe4\xfb\x0d\xcd\x2f\x5e\xc6\x47\xf0\xc0\x37\x91\x56\xe4\x56\xa6\x43\x18\xbb\x6e\x42\xe1\x7c\x59\xf3\x25\x5d\x77\x3e\xe4\x2e\x20\x1f\xb0\x70\x4e\xd6\x2c\x4d\x3c\x18\x1f\x72\x9b\xe8\xb1\xdd\x2d\xb1\x4f\xab\x38\x86\x7e\xd8\x5f\x2c\xb7\x65\x22\x3f\xef\xd3\x8b\x49\xf7\xcc\xa3\x33\x48\xf8\xe9\x3e\xe9\x16\x05\x68\xaf\xa8\x25\x8a\x69\xa5\xc8\x3a\xa4\x8b\x34\x9d\x5a\xc2\xbc\x5b\x10\x9f\xb5\xd3\xe7\xfb\xa4\x56\x27\x71\x19\x3d\x72\x3d\x23\x62\xb5\x35\xbd\x57\xa6\xd3\x97\xbd\xb9\xbe\x27\x47\xbf\x73\x31\x4f\xe6\xfb\xe4\x61\x0d\xb1\x1d\x57\xbc\x88\xd3\xe8\x1f\x04\xbd\xf0\xd9\x29\x88\xa2\x02\xe6\x6e\x00\x25\x0e\x6c\xb9\xec\x68\x1e\x5e\x42\xd5\xb3\x18\xc1\x34\x36\xaa\xee\x77\xce\x10\x7c\x37\x66\x48\x87\x5a\x86\x4e\x86\x56\xdd\x27\x5c\x31\x8b\x39\xe1\x5a\x90\x24\x4b\xf0\x3d\xcf\x86\x5d\xf7\xe8\x57\x4f\x2a\xb4\xbf\x69\x84\xb7\xe0\xe4\x8a\x72\x6c\x44\xd3\xd9\x49\x81\xb2\x67\x48\x43\xca\x05\x57\x97\x41\x3c\x70\xef\xd5\xb8\xec\x3a\x08\xa1\x6d\x75\x6b\x27\xa7\x06\xc1\x04\x11\x6c\x3d\x23\x6c\x9d\x35\x7d\xa3\x74\xab\xae\xb9\x79\xe8\xd8\x46\x1b\x3c\xb6\xbd\xbb\xe6\x0a\xfd\xb8\x7f\xa0\xd2\xf8\x71\x6b\x7b\xff\xfa\xf8\xe3\x9b\x6c\xf0\x65\x05\x1a\x30\x8b\x40\x02\x0a\x43\xa0\x3a\x45\x80\x45\xdc\xa7\xb0\xf4\x1d\x60\xfd\x27\xb9\x77\x53\xa8\x27\x12\x54\x50\x3b\x87\x60\xb9\xe8\xda\x80\xea\x3e\xa9\xf5\x84\xb9\x64\x92\x87\x12\x53\xe5\xac\x19\x9c\x74\x93\x4e\xb2\xb4\xbd\xc6\xf2\x8b\x1c\xd5\x93\x9c\xa5\x74\xff\x10\x4c\xb3\xfd\x67\x13\xfc\xf8\x66\xb7\xb8\xa2\x00\x05\xc0\x3c\x9c\xc2\x3c\x85\x93\x06\x6a\xd6\xd4\x11\xed\x40\xd9\xca\xb5\xca\x6a\xdb\x9f\x74\x98\x42\x73\xd0\xa8\x82\xc1\xf5\x75\x07\x6c\x30\x93\x06\xc8\x4a\x13\xd1\x67\x4d\xd7\x39\x7b\x1e\x9d\x1d\xdd\x15\x8f\x2a\xf3\x07\x94\x7c\xff\x58\xb9\xf2\xac\xbe\x26\xce\x7f\x91\x5a\xe2\xeb\x2f\xf7\x4f\x6e\x81\x53\x08\x14\x67\x98\x57\x1c\x63\xca\x84\x55\x73\xe0\x40\x31\x8e\x59\xc5\xd1\xf5\x1b\x70\xa6\x48\x43\x12\x06\x0a\x75\x45\x0f\xe8\x77\x93\x10\xb9\xcd\x05\x70\x5e\xc9\xf1\x9c\xf6\xf6\xab\x6f\x5c\x37\xd2\xb1\x27\xf1\x7d\xab\x33\x6b\xd2\xe5\x58\xc6\xfa\xc2\x2b\x96\xf1\xcb\x9b\x17\xb7\xef\x23\xcd\xdf\x8b\x9b\x37\x4f\x9e\x9f\x4a\xd7\xa5\xa7\x7a\x09\x13\x01\x1c\x24\x6b\x97\xe9\x67\x3f\xde\x9d\xda\x0e\xb7\x6d\xd6\x74\x2d\x69\xda\x03\xbd\x6b\x4f\x46\x79\x6d\x00\xf2\x9f\x1f\x31\xe6\x86\x23\x1b\xdf\xaf\x7c\xde\x24\x72\x49\xfe\xfb\x8d\x2d\xfd\x12\x0f\x5e\x5d\x62\xfe\xdb\x6b\x29\xfd\x25\x28\xa4\xd9\xdb\xef\x5e\xde\x3a\xc0\xed\x38\x76\x46\x48\x55\xd7\xb6\xae\x55\x23\x3b\x79\xde\x97\xb1\xe2\x5b\x84\x53\x38\x3b\x90\x8f\xeb\x62\x82\x05\xda\xa4\x26\x14\x61\xb6\x80\xa4\xc5\x15\x53\x00\x1f\xeb\x4c\xc5\x13\xf8\xe4\xe5\xcd\xc7\xd7\xc7\xc7\xd9\x26\x56\xb9\x6d\xc5\x0a\xd7\x52\x86\xed\x48\xe2\xc3\xc7\x9b\x1f\x6c\x8a\x89\x87\xe0\x04\xa1\xa5\x08\x88\x4f\x03\xc9\x1a\x33\x80\x0a\x20\x16\x74\xe8\xc3\x39\x38\x01\xaa\xb9\x77\xdd\x7d\x42\x81\xe8\x43\x9e\x2d\xbd\x5b\xcb\x36\x1d\x6a\xa4\x30\x22\x8c\x3b\x6d\x9d\x64\xd0\x11\x25\xa9\x43\x84\x89\xc9\xbb\x09\xf0\x40\xaf\x6b\x91\x5d\x52\x67\xec\x58\x1d\xf8\x17\x7d\xb1\x3b\xbe\xfd\xf1\xe3\xb5\x2f\xae\xcf\x4f\xfb\x62\x4e\xe7\x3a\x0c\x67\x06\xec\x79\xed\x33\x96\x2e\x75\x18\xcf\x14\xe8\xf3\xda\xae\x45\x6f\x85\x6e\xb3\xba\x37\x42\x37\x07\xbe\x42\x67\x88\xe7\x12\x94\x7e\x2d\xbc\xc0\x9e\x32\x00\x21\x62\x36\x72\x6d\x5a\x46\x92\x34\xee\xf9\x44\xe6\x92\x5f\x6f\x28\x89\xdf\x1f\x9f\x6f\x84\x1e\xc1\xd4\xde\xdf\x7c\x78\xe4\x72\xb8\x7d\x71\x93\x21\x9f\xa7\x79\x49\x25\xca\x7d\x21\xa6\x9a\x05\x6d\x43\xc5\x81\x35\xa1\x4a\xcb\x62\xd5\x59\x12\x97\xd3\xf5\x9a\x64\xae\x84\xd5\x7d\x02\x2b\xa8\xca\x46\x10\x59\x87\x99\x59\xdc\x5a\xb8\xd6\xa7\x93\x0f\xa7\xcb\x1e\x70\x97\x34\x99\x3b\x96\x5f\xd9\x22\xfa\xe2\xfb\x9b\xfd\xfb\x8d\x6b\xe9\xf2\x23\xf8\x83\x7e\xb9\xef\x57\x9b\x95\xf5\x39\x0c\x04\xc8\x4f\x75\x17\xbd\x52\xc7\x8f\x03\x5f\x85\x93\xcc\x33\x71\x1a\x47\xbf\xca\x5a\x50\xc7\x40\x5e\x11\x8d\x2b\x5d\x61\x8d\xaa\x0d\xe7\x9b\xc5\xda\xd3\xcf\x63\x39\xc6\xf1\x2f\x46\xee\x9b\x6f\x7d\xf9\x54\xaa\x43\x1f\x16\xd0\x30\xca\x6c\xe5\x49\x25\xb5\xe8\x82\x0f\x23\xe8\x29\x65\xae\xaa\x31\xd4\x46\xf4\x60\x88\x97\xce\xc1\xc7\x8f\x74\x49\x5b\xf7\xbb\x89\xf3\xd2\x97\x08\x0c\xb5\x12\xc3\x39\xad\x3f\x7f\x33\x35\x5a\x0e\xe9\xd2\x74\xac\x6b\xa8\x6f\x59\xeb\xa3\x6f\xd3\x78\xee\xac\x93\xbf\xdc\xa2\xdf\x65\xe9\x14\x87\x4c\xec\xac\x07\x22\x80\xef\xb6\xfc\xad\x9f\xde\x82\xd6\x43\x20\x82\xe5\x67\x35\xf3\xfb\x04\x14\x25\x10\x92\xda\xa2\x5c\x16\x72\x72\xae\xaf\xeb\x0e\xa2\x83\xce\xc3\xe0\xd6\x21\x48\x01\x2c\x38\x39\xff\xe9\x1c\xce\x61\x24\x9c\x89\xc2\x03\x9a\x42\xb4\xba\xa1\x60\x4e\x6f\xb1\x8f\xed\x92\x03\x4c\xbe\x4f\xfe\xa7\x64\x63\x25\xf8\x83\xf6\xfa\x2b\xf0\x33\x06\xcb\x54\x58\x40\x4d\x29\x33\x95\xc3\x50\x48\xd1\x84\x8b\x5f\x34\x94\x0a\x57\x35\x04\x0a\x21\x6a\xb0\xad\x3a\x83\xe3\x48\x23\x9e\x0e\xe9\x64\x7f\x37\x5f\xcd\x53\x3b\x29\xbb\x26\x2b\xec\x1d\x5b\x0d\xe3\xa5\x2b\x11\xd0\x86\xcb\x26\x63\xed\xc8\xc6\x0e\xb5\x03\x1b\xba\x6d\xfd\x7f\xd9\xbb\xa9\x88\xf9\xbb\xe5\x45\x47\xa0\xf8\xf7\x31\xe2\xbc\xba\xf8\xf5\xb5\x3a\x63\xdf\x79\x50\x79\xeb\x9d\x07\xd0\x39\x07\xa0\xb5\x07\x1d\xdc\x1d\x57\xab\x4e\xad\xce\xda\x95\x6f\x33\xf7\x16\xcb\xf0\xd1\xa7\xcd\xe5\xf7\xbd\xbc\xf2\xcc\x7d\x1e\x29\xdb\xa9\x97\x4c\xcb\xbc\xce\xc1\x5c\x83\x73\xc8\xeb\x50\xe0\x80\x09\x50\x68\x3d\x83\x13\x17\x82\xf7\xbd\x8f\xc4\x10\x90\x78\x02\xc8\x83\x6d\x71\xb4\xed\x9f\xe5\x8b\x59\x73\xf5\x3c\x5b\x79\x0c\x95\x11\x7d\x70\x61\x02\x1d\xa5\xa2\xa9\x3a\x0a\x2f\xde\x09\x5a\x49\x0c\x96\xa1\x16\xd8\x60\x7e\xf1\xc5\xcf\xa6\xed\x1b\x25\xfb\x3e\x5d\xec\xef\xc6\xab\x61\x6b\x2f\x65\x97\xd1\x6e\x64\x63\x0f\x1f\x0c\x0b\x12\x7a\x4f\xd3\xf9\x60\x93\xf2\xb2\x37\xbd\xa6\x5d\x5e\x13\x4b\xb6\x6d\xe0\x8f\x2f\x6f\xcc\x5c\x22\x8f\xab\x49\x68\x2d\x14\xc2\x5e\x0a\x01\x50\x1f\xe8\xde\x28\x89\xb4\x73\xe1\xdc\x29\xe1\x05\xbd\x9b\xb2\xc4\x50\xbb\x80\xf3\x86\xbf\x5f\xee\x8a\x23\x7d\x82\x51\x95\x3c\x14\xb4\xdd\x5c\x4f\x6c\xb3\x72\x87\x3e\x8d\xae\xae\x01\xae\x7d\x7d\x20\xeb\x68\x41\x15\xe6\xed\xb5\x61\x24\x0e\xf7\xfc\xa8\x32\x1b\xed\xf9\x1f\x93\x7f\xfa\xc6\x3c\x7d\x0d\xba\x5f\x7f\xb9\x7f\x7d\x7c\xfb\xe6\xf5\xf1\xed\x9e\xa5\x15\xa5\xfc\x32\xaa\x61\xdd\x49\x90\xf4\x41\xad\xcd\xd7\xdf\xa5\xdd\x22\xe7\x90\x2c\x72\xce\xec\x9d\xbe\x9a\xad\xa8\xa5\xf2\x3d\x28\xdc\x57\xdf\xa0\xda\xb4\xaa\x36\xed\x96\xc3\xe3\x23\xd6\x12\x4a\xfe\xf2\x31\x0b\xf1\xab\x35\xc5\x17\x52\x3e\x9b\x1d\x40\xbc\x6f\xda\xde\xf7\x32\x2d\x18\x13\x1e\x76\x04\x06\xb7\xfa\xcb\x4f\xb2\x81\x03\x85\xc1\xa5\x83\x96\x4a\xea\x75\xb6\x4a\x29\x93\x71\xc3\xbc\xab\xd7\xb3\x91\x9d\xeb\x2f\x2b\x8b\xad\xfb\xf7\xda\xff\x6e\xbc\x3e\x9a\x9a\x2b\x6b\x85\xe4\xda\x58\x1e\x6a\x1e\xba\x30\x49\x50\x01\xcc\xb6\x9b\xab\x6a\x93\x7f\xfa\x1f\x28\xbf\x01\x67\xc6\xb8\xab\x6a\x02\x43\xb3\x76\x97\x9f\x44\x5d\xb5\x14\x86\x26\x6d\x94\x90\x52\x86\x24\xaa\x91\x21\x4d\x9d\x75\xa1\xd4\xa2\xb5\xed\x9f\x21\xff\x65\x1e\x42\xc7\xf2\xc0\xfe\xbf\x5b\x1f\xb1\xbb\xd3\x64\x84\x97\x1a\x14\xfe\xf3\x23\x86\xdc\x30\x68\xe3\x7b\xf4\xd7\x3e\x3d\x1f\x49\xc4\x41\x78\xe0\x9c\x88\x6d\xc7\x95\xe3\x55\x8e\xed\xf9\xd9\x2a\x72\x01\x67\xd7\x74\x78\xee\x82\x4f\xf9\xe7\xe7\x80\x2e\xc1\x93\xa6\x31\x86\xd2\x03\xba\x1b\x46\xc5\x3d\x57\x80\xda\xcf\x8f\x54\x28\xaa\x24\x89\xef\xdb\x98\x89\xdc\x79\xbb\x25\xf9\xeb\x88\x5a\xf7\x2f\x4f\x77\xea\x87\xeb\xa9\xe5\x76\x42\xfb\xe1\xe3\xcd\xcb\x77\xc5\x86\xa9\xf8\xe1\x5a\x2d\xf0\xfd\xbb\xef\xff\x05\xfc\x16\xbc\x7f\xd8\x65\x66\x12\xd4\x15\x34\x04\x81\x61\x9d\xa5\x3c\x81\x04\x56\x46\x73\x8b\x82\x0b\x02\xd6\x26\xf4\xd2\x42\xd2\x48\x87\x21\xa8\x9c\x03\xc8\x16\x25\x2e\x0a\x5d\x60\x0b\x39\xda\x31\x8c\x30\xe5\xb6\xe5\x45\x85\x10\x76\x35\xe1\xa8\x30\xa2\x0b\x55\xa8\x79\xcd\x0c\xd6\x0c\xc0\xb5\x49\x79\x60\x34\xcf\xa1\x42\x3d\xa6\x7c\x8b\xcd\x3e\xa3\x3b\x97\xbc\xba\x44\xd0\xb8\xe1\xfc\xf8\xe2\xdd\x8b\x8f\x2f\xe2\xb6\x20\x7b\xf5\xee\x55\xca\xe6\x32\xf4\x41\x97\xdc\xea\x36\xe0\xd4\x4c\x67\x70\x0a\x0d\xb1\x92\xfa\x22\xd5\x6b\x5d\xa6\xe3\x60\x4d\x38\x7b\x9b\x24\x3b\x30\xde\xe3\x63\xb7\xcf\x93\xbf\x4e\xfe\x2e\x41\xc9\x3f\x5f\x6c\xf2\x68\x92\xa7\x75\x0b\x31\x51\xeb\xdd\x15\xed\x32\x8d\x18\xac\xe0\x75\x2c\x6f\x79\xf3\xee\xc5\x6d\xea\xc0\xc2\x0d\xc3\x29\xbd\x3b\x0b\x05\x30\x60\x15\x34\xb5\xb0\x15\x0a\x24\x24\xb0\xd1\x61\xcc\x88\x97\xb8\xcc\x5d\x41\x7c\xc3\x57\xe1\x83\x56\xbd\x03\xdc\xfb\x1d\x93\x8c\x0b\x5b\x8b\x02\x41\xc8\xea\x8e\x51\x82\x4b\x23\xda\x80\x03\xa4\xb8\x87\xf7\x89\xa4\x32\x4d\xca\x50\xf6\x5a\x9e\xa7\xd5\x45\xcc\xd2\xea\xb2\x67\x3b\xa0\x2b\x5e\xe9\xdf\x3f\x70\x48\xbe\xda\x28\x00\x9f\x40\x3d\x6c\xa7\x4e\x71\xf3\xfa\xc8\x36\xf0\xfe\xf6\xe6\xd7\xe0\xdd\xfb\xcc\x67\x4b\xa0\xc0\x06\x55\xe2\x1e\x68\x16\xfc\xe4\xc3\x4c\x41\xa2\x2d\x97\x5c\xc3\x32\x58\x60\x82\xe8\xe7\x19\xe8\xd3\x5a\xc7\x8f\x03\x72\xed\xdd\xb9\x37\x86\xd6\xcc\xb5\xc4\x63\xa3\xb4\x54\x42\xd8\x2c\x6f\xe3\x15\x4d\xc8\x3b\xc9\xba\xeb\x7a\xc6\x65\xc9\xfe\x1c\xcf\xa9\x93\x97\x31\xf5\xed\x26\x96\xef\xc6\x65\x4c\x9c\x97\x4d\x6a\x16\xcc\x01\x0f\xb3\x47\x58\x0d\xf2\x0c\xb0\x73\xfb\xb3\xbf\x4f\xe6\xbb\xbe\xcd\x4a\x21\x14\xe0\xa0\xfd\xa4\x2f\x33\xf3\xd6\xff\x73\x46\x0f\xc9\x86\x88\xf4\xe1\x89\x03\x7c\xf8\xec\x01\x5c\x89\x2a\xba\x00\x73\x4a\xc7\x74\xd9\x69\x49\xc7\x40\x20\xf2\x4e\xd4\x45\x06\xd7\xa4\xca\x9c\x57\xce\x86\x76\x8c\xe7\x4a\xfb\xd4\x5e\x79\x1b\x7e\x75\x1d\x1d\xbf\x7d\x7e\x8e\x75\x78\x76\x83\xf1\x21\xfb\x7a\x74\x5c\x62\x5f\xc4\x0b\x4e\x0f\x7f\x0f\xfe\xf6\xed\xdf\xbe\xcf\x30\xe8\x2a\xe4\x09\x02\xe3\xa7\x1e\xc0\x5a\x73\x90\x03\x88\x89\xa9\x95\x23\xc1\x04\x06\x6b\xee\x20\xeb\x65\x4d\x21\x40\xce\x01\xec\x8a\xbc\x20\x79\x9e\xe7\xb6\xa0\x0e\xa2\x92\xee\x5b\x46\xb1\x50\x0e\xa2\x59\x94\x84\x33\xdc\x9f\x88\xa5\xa5\x36\xa1\x0e\x44\xf5\xd2\xb0\x5a\x02\xb3\x16\xe9\xb2\xd6\x34\xcf\x8b\x7c\xc2\xe1\x4c\x0a\x97\x80\xcc\xec\xdc\x51\xc6\x1c\x9f\xa7\x99\x3d\x3b\x63\x8b\x2a\x75\x6b\x45\xb9\x6c\x0e\xa6\xa2\xd8\x29\xa6\x7c\xc4\x04\x62\xc7\x26\x8e\x83\xbf\x4d\x7e\x8a\xb7\xac\x0f\xa4\xf1\x5b\x74\xf8\xf8\x64\x24\x6c\x05\x67\xbf\x05\x97\x29\xfb\xe5\xbb\x17\xdf\xbf\x7e\x7a\xd3\xb2\xeb\x46\x20\x2b\x68\x71\x05\xcc\xba\x30\xbe\x0c\xc2\x58\x61\xcb\x2a\x4c\xc1\x43\x89\x9d\x6e\xb9\x95\x67\xe7\xce\x2e\xcf\xab\xaa\xca\x6d\xc9\xa4\xa6\xd9\xe8\x28\x86\x54\xb8\x86\x17\x95\xc2\xbe\x23\x04\xc1\x52\xcb\x30\x86\x21\x9c\xa5\x66\xd3\x79\xb5\xa9\x0e\x18\xe6\x79\xe4\x85\xa2\x32\xae\x25\xb6\xba\x38\x93\xfc\x4d\xf2\xb7\xc9\x3f\xc5\xb9\x29\x4a\xbc\x2d\x91\x3f\x8b\xfc\x32\x22\x7f\x65\xaf\x8b\x6b\xa1\xdc\xf7\xcf\x71\x1c\x6e\xf7\x17\x79\xeb\x90\x68\x35\x9f\x10\xd6\x5e\xb8\xf2\xe2\x42\x35\x8a\x60\x18\xba\x44\x83\x5f\xb4\xe2\x69\xe1\x0b\x58\xe6\xae\xa4\x5a\x92\x70\xf6\xfe\x60\xa4\x71\x61\xd1\x05\x12\x9c\x8d\x27\x46\x2e\x63\xd7\x81\xdc\x09\x7e\x27\xaa\xb5\x39\x1b\x03\x20\x80\x6b\x4d\xa0\xc1\x2d\xa7\x2a\xd5\x77\xfd\x65\xfc\x9a\x7b\x76\xec\x23\x46\xdf\x9b\xe4\x1f\x22\x03\xca\x23\x46\xe0\xb5\x9a\xfa\xa1\x30\xea\x7a\x92\xf8\xe3\x35\x2b\xfe\xe3\x6f\x3e\x7c\xbc\x39\xfe\xf0\x94\x81\xe0\x28\xdd\x6a\x1d\x30\x15\x74\xb8\x0a\x35\x84\x6a\xe0\xae\x28\x41\xc3\x6d\x77\xa2\x61\x99\xba\xfb\x84\xcf\x0d\xe9\x73\x87\x43\x87\x28\x38\x3d\xb2\x35\xed\xfb\x70\x72\x35\x80\x8c\x20\x21\x56\x0b\x2b\xde\x9f\x10\x44\xb6\x51\x0c\x5d\x76\xba\x4c\x53\x86\x2b\xcd\x69\xcc\x1d\x96\x32\x95\xc1\x2e\x49\xcc\x89\xa7\x59\x1d\xcf\x1d\x2e\xa3\x7b\xbb\x35\x4e\xc0\xc3\xa5\x40\x2c\xbf\x7e\x71\xf3\xea\xdd\xf1\xdd\xfb\xdb\x3f\xc8\x12\x97\x61\x69\xd6\xc1\x28\x20\x54\xe8\xc7\x51\x4a\x50\x0b\x51\x45\x28\x92\xb3\xb5\xe7\xf3\xf9\x7c\xa0\x21\x0f\x27\x6b\x41\x79\x59\x67\x03\x6d\xce\x3a\xa8\xbb\x8e\xb1\x42\xe7\x44\x85\x21\x5b\xc2\xc9\x07\x76\xc5\x23\x4d\x22\xa6\x9f\x8a\x7c\x5b\x57\x8e\x80\x97\x37\xaf\x6e\xfe\x1a\x44\xcc\xe4\x4b\x67\xa7\xd9\xcd\x23\xa8\xf2\xcb\xec\x70\x7c\xb1\xad\xad\x8f\x39\x73\xbe\x00\x65\x58\x4a\x51\x15\xa5\x2b\x39\xe5\x0d\x0a\x33\xc6\x48\x18\x06\x7c\x51\x18\x0b\x08\x2e\x5d\x81\x0e\xca\xc0\x2a\x60\x1f\x64\x10\x5a\x95\x27\x0f\xda\x14\xdf\x9d\x2a\x64\x19\xe6\x87\xb2\x5a\x67\xd0\x94\x45\x30\x77\x2a\xe6\xe3\xc7\x9a\x79\x79\xcf\x63\x2d\xc4\x8b\x78\x66\xfb\xee\x7a\x56\x7a\xd8\x22\xd7\x87\x8f\xe0\xdd\x26\xd3\x23\x2c\x59\x9c\x5d\x76\xb5\x33\x46\x95\xe7\x30\x54\xdc\x22\x08\xb0\x53\xc4\xe8\xae\xc4\xa8\x2a\x74\xc1\xb4\x63\x07\xb9\x0e\xee\x6e\x80\x56\xd2\xba\xd8\x57\x9f\x92\xbc\x38\xc0\x55\x1a\x2b\x7a\xb7\x16\x55\x41\x46\x14\xce\x92\x8a\x98\xd7\xab\xef\x69\x66\xfe\xdc\xfe\xaa\x84\x09\x89\x95\x80\x89\x30\xf7\x3d\xe7\x40\x5f\x09\xfc\x60\xe7\x5c\xd7\x75\xdd\x2f\xe9\xaf\x43\x22\xee\xe9\x15\x1b\xeb\xe7\x64\xba\xd9\x7f\x29\x53\x24\x78\x7d\x80\x01\x37\xc6\xae\xca\x1a\xe0\x6c\xd0\x20\xb9\x4f\xac\x05\x27\xce\x10\xae\x38\xac\xc2\xe4\xfd\x46\x72\x10\xa6\x6f\x8b\x36\x0a\x5e\xd8\x9c\xf2\x27\xa2\x1d\x12\x7e\x4f\xb3\xfe\xbf\xc3\x56\xcf\xe4\xa2\xda\xae\x8d\xd5\x40\xab\xd0\x9c\x4e\x4a\x81\x9e\x31\x88\x2b\x06\xcb\x2b\x0f\xf3\x79\x83\xf8\xfa\x13\xa5\x4a\x92\xfd\x15\x77\x11\x3f\xe2\xc2\xff\xdd\x15\xa9\xfe\xab\x5c\x81\xf7\x97\xd9\xfe\x9a\x4d\xb2\xbf\x7e\x02\xb7\x3b\xad\x73\x96\xac\x35\x28\x81\xa5\x01\x87\xd1\x87\x29\x60\x09\x1c\x80\xab\xc9\xaa\x75\xf4\xc0\x07\x99\x22\x60\xef\xe8\xc3\x53\x86\x03\xa2\x46\x13\x2b\xda\x8b\x19\x5b\x65\xa8\x35\x14\x54\x84\x90\x85\x52\xba\xcd\x9d\x4d\xbc\x93\xf8\xa6\x5c\xf1\x32\xec\xc5\xed\x8b\xf4\xca\xe4\xff\x20\xd7\xbb\xf7\xe0\xfa\x99\xb1\x6c\x0c\x2a\x4d\x82\xb2\xa0\x32\xe7\xda\xf7\x97\x75\x3c\x6a\x03\x4b\xab\xc0\xb7\x6c\x9d\xe6\x7c\xcd\xaf\x69\xce\x07\x7c\x37\x3b\x17\x96\xc5\x9e\x01\x5c\xfb\x94\x86\x66\xb4\xc3\x65\xd5\x00\xa6\xcb\xea\x23\xe9\xfb\x4b\x7c\x4d\xe9\xcf\xca\x94\x7c\x4b\xa6\x9b\xab\x4c\x37\xef\xb3\x64\x57\x04\x96\xa2\x40\x3d\xc0\x26\x9c\x5a\x3f\x86\x56\x00\xd2\x07\x98\xf2\x80\x7d\xc4\x1f\x1d\x40\xb9\x56\x0f\x4f\x9f\xc5\x02\x09\xc0\x6b\x93\x8a\xe0\xbe\x21\x57\x9e\xc1\x78\xd7\x6c\x93\x5f\x45\x74\xd6\x57\xc9\x5f\x25\xff\x7b\xf2\x7f\x26\xff\xf7\x33\x4c\xf5\xb8\x1b\x7e\x1f\xf9\x8b\x3f\x46\x32\xcd\x6b\xee\xd0\x46\x26\x1a\xc1\xe3\x9e\x12\x8a\x1e\x8e\xaf\xb6\x98\xf6\xfe\x01\xf5\x29\xf2\x62\xdd\xee\xdf\xdf\xfc\x3a\xe6\x11\xd5\x65\x01\xda\x4f\x0b\xe8\xf2\x22\x38\xd0\x05\x6a\xda\x16\x58\xd0\x06\x66\xeb\x7a\xa5\x8b\x03\x89\x5d\x96\x71\x04\x45\xa0\x90\x0a\x26\x89\x16\x4e\x86\xda\x50\xad\x64\xd5\x78\x42\x31\xef\xdb\xd0\x83\xbc\xef\x97\xd4\x6c\x39\x4f\x07\x8b\x88\xb5\x55\x15\x4e\xa1\x51\x17\x27\x57\x3a\xb4\x84\x10\xa2\xe2\x05\x26\x47\x8c\x53\x42\xb1\xf1\x40\x10\xd6\x43\xa4\x19\x66\x03\x2c\x14\x31\x46\x28\x29\xa5\x1c\x45\x92\xfc\x45\x9c\xbf\x5d\xc4\x13\xf9\x9c\x79\xf4\xbf\x24\xff\x2d\xf9\x3f\x12\x9e\xfc\x3f\x1b\xba\xc6\xa6\xd6\xfb\x88\xbe\xbf\x69\x1a\x41\xf9\xde\x3f\xb9\xf2\xda\x5f\x01\xae\x1f\x97\xb7\xdb\xe7\x67\x0e\xd6\x78\xa1\xfd\xfe\xf6\x12\x4a\x9e\x11\x07\x34\xce\x79\x4d\x46\x13\x16\x50\x9c\xad\xd3\xac\xee\x4a\x2c\x60\x91\xeb\x9c\x8c\x50\x91\x80\x32\x79\xe7\xdd\x3c\x03\x39\xaf\xdd\xf6\x51\x0c\x6e\xb1\xe3\x08\x92\xbb\x7c\x19\x00\x5f\x96\x8a\x34\x3d\x1e\xc0\xd0\xd7\xd2\xb7\x07\x1d\x0a\x42\x2a\x8d\x31\xd5\xd2\x21\xac\x08\x42\xb0\xcc\x2b\x8a\x15\xc6\xac\x5f\xcf\x00\x73\xce\xc3\xe9\xf2\xd6\x53\x4a\xa9\x56\xc6\x28\xa5\xc2\xd9\x48\xec\x90\xa0\x52\xa9\x38\xae\xfe\x22\xe2\x3b\xfd\xc9\xb6\x79\xf3\x8b\x6d\x73\xf3\xc4\x36\x37\xef\x6f\xf7\x5f\x92\x2a\x78\xe7\x5a\x4b\x4e\x2e\x0c\x00\x83\xfc\x6a\x1c\xca\xab\x8b\x71\xf0\x80\x34\x09\x49\xe6\xee\x94\x5b\x16\x60\x96\x75\xfb\xb8\x9b\x27\x07\x12\x37\x4d\x20\xff\x34\x80\x62\x02\xb1\x90\xb6\x22\xdd\x88\x47\xb0\x8c\x8d\xac\xfb\x8b\x81\x28\x81\x06\x3d\x37\x50\xc9\x7e\xa1\x81\x8e\x09\xbb\xe7\x19\x39\xe0\x2b\x6b\xc7\x3f\xc4\xfa\xa8\xdf\x5e\x11\x43\x1f\x5e\xe9\xf1\x73\xae\xdd\xf1\xa7\xb7\x1f\x5f\xbf\x8c\xc0\x8b\xaf\x5e\x6e\x8c\x71\x0f\x5c\x26\x11\xa6\x7d\x3b\x61\x2b\xfa\xb6\x6d\xdb\x25\xc7\xd0\x60\x59\x19\x5c\x55\x39\xaa\x30\x27\xf9\x7a\x02\xd0\x7b\xef\x21\x29\x44\x89\xef\x13\x59\x40\x89\x66\x58\xa8\xbc\x3c\x60\xdb\x98\xc6\x36\xeb\xd0\xe8\xc2\x15\x44\x16\xad\x2d\x3b\x50\xec\x8a\x30\x36\x4d\x98\x9a\xc6\x36\x4d\xe0\x6d\x57\xf6\x4d\x5e\x86\xf3\x8c\x4f\x73\xd7\x55\x43\x9b\x5c\x62\x02\xba\x72\xd6\x7e\x17\x31\x8f\xfe\x7d\xf2\x9b\xe4\xbf\x26\x2c\xf9\xbf\xae\xe8\x47\xbf\xf9\xf8\xfa\xb8\x01\x8d\xff\xe6\xe3\x8b\xdb\xd7\x0f\x30\xee\x1f\xdf\xdf\x82\x9b\x57\xdf\x1f\x8e\x8f\x14\x65\x1f\x23\x3e\xd6\xc5\x05\x9e\x11\xf4\x6f\xa7\x75\x5b\xa1\xe2\x7f\x88\xab\xca\x8c\xa5\x18\x95\x45\x49\x6c\x3b\x56\x18\xd1\xb1\x8d\x7f\x80\x05\x1d\x41\x5e\x1a\xca\x39\xa7\xb5\xba\x6c\x00\xa7\x5e\x18\x8f\x89\x24\x56\x4a\xe5\xe8\x52\x7b\xeb\x09\xe8\x43\x2b\xa4\xe1\xa6\xd3\xa6\x97\xfd\x81\x98\x75\xc9\x4d\x21\x28\x2c\x5d\x9e\x72\xad\x43\xa3\x42\x5d\xca\x14\xb9\x7c\x14\x93\xec\x24\x37\x5c\xb6\xdc\x0a\xb1\x3a\x45\x31\x16\x5c\x19\xd6\x08\x4d\xfd\x65\x22\x84\xe9\x00\x2b\xc7\x16\xe1\x98\x10\x8c\x37\x4e\x5d\x6b\x14\xdb\xb8\x6e\xd2\xd7\x53\xc2\x97\xc9\xeb\x88\x23\x7d\xcd\xa2\xfc\xca\xa5\xe3\x0d\xd0\xd3\xcc\xca\x97\xb7\xd9\x0c\x94\x03\xea\xce\xf9\x69\x02\x72\x5c\x87\xed\x23\xc9\x4e\xab\x81\x29\x87\xc6\x33\x59\x2a\x4e\x71\xb1\x3a\xd6\x47\x8e\x0e\x06\xbc\x73\x2e\x88\xcb\x9b\xb2\x4d\xa8\xbb\xc2\x17\xdc\x03\x9c\x1c\x32\xf1\x67\xcb\x13\xd9\x42\xec\x9d\xb8\x12\x84\xd8\xf8\x71\xd7\xed\xf0\x4a\x60\x6a\xa1\xad\xb9\x2a\xb5\xa0\xb4\x58\x05\x9f\xfe\xb0\x3c\xac\x06\x38\xd9\x45\x9e\x86\xcb\xde\xe7\xaf\xaf\xac\xcd\x9f\xf7\x3e\x4f\xf7\xaa\x8f\x5b\x9f\xfd\x75\xeb\xf3\xfa\x87\x2f\x37\x3f\x9c\x54\x60\x58\x07\x6d\xce\x20\xc1\xc4\x34\xd2\x91\x50\x07\x0d\x6b\x13\x06\xd0\x56\x68\xf6\x61\xd1\x46\xa6\xc8\xe7\x79\x01\xab\xdc\x97\xcc\x28\x1a\x16\xe7\xb6\xfd\xcf\xd9\x3c\xec\x7f\xcc\xb3\xed\x4f\xbd\x18\x03\x10\xa8\xd6\x1a\xe5\x39\x34\xa4\x79\xd8\x00\xa5\x89\xbc\xef\x33\x1e\xb9\xea\xfe\xdd\xb5\xbe\xec\x22\xe7\xc5\x9f\x2f\x5e\xbb\xdf\x48\xeb\x62\x36\x41\x9a\xd8\x9e\x01\x61\x82\x4a\x11\x47\x46\x13\x17\x70\xca\xe7\x73\xb1\xca\x0a\x94\x73\x76\x72\x44\x5b\x60\xad\x29\x4e\x8c\x70\xa7\x66\x17\x0c\x72\xde\x63\xd0\x24\x20\x61\x31\x97\xdb\xc6\x53\xe6\x68\x9d\xcf\x80\x6e\x3b\x88\xab\x2c\xf9\x7d\xd1\xba\x26\x1d\xcb\xea\x60\x31\x71\xab\x59\xe7\x20\x39\x68\xc0\x9c\x9e\xe0\x86\x6b\x01\x8a\x7b\x7a\x98\x77\xf5\x63\xbe\xdd\xcd\x53\x06\xdf\x9b\x0f\x1f\xb7\x5c\xbb\x9b\x17\x37\xc0\xec\x96\xb5\xc5\x79\x96\xd4\x9f\x54\x9d\x56\xa8\x0c\x79\x9d\xb5\x77\x4c\xed\xdc\x27\xb5\xab\xd7\x73\x53\xac\x52\xca\xd4\x0b\xee\x4e\x77\x08\x14\xd7\x9c\x12\x7c\xf4\xd9\x39\x81\xc9\x6f\x92\xff\xf6\x34\x07\xeb\x29\x4a\xfb\xcd\xd3\xe7\x0d\x58\x7b\xff\x98\x86\xf5\xe6\xab\xff\x12\x85\xdb\x22\x40\xef\x52\xbd\xda\x8c\xae\x43\x5e\xd4\x5a\x28\x87\x35\x36\x24\xe0\xd2\x4a\xc1\x35\x36\x58\x93\xf5\x04\xb4\x03\x6c\x85\x6e\x9f\x38\xf7\x7b\xb5\x43\xd4\x60\xc7\x02\xaa\xac\xe4\xd2\x60\x8f\x1d\x3d\xed\xda\x0e\x39\x29\x44\x76\xe6\x9a\xda\xb2\x84\x48\x10\x44\x90\x44\x0c\x42\x24\x30\x22\x58\xa1\xcb\x8a\xa2\x5f\x87\x14\xaf\x25\x5e\x30\x92\x98\x21\x84\x04\xc1\x04\x4b\xcc\x94\x22\x10\x0a\x1c\xcf\x86\x6c\xd6\x47\xec\xc2\xbf\x49\xfe\x31\x66\xbc\x3e\x92\xeb\x3d\x21\xe1\xbb\x79\x75\xfb\xfe\x06\x3c\xcb\xf0\x4e\x2f\x7b\xe0\x5b\x0b\x74\x84\x3b\xae\x81\xa8\x63\xc2\x19\x0e\xc3\xe5\xb3\x0e\x36\x1b\xb2\x22\xd7\xae\x62\x25\x47\x18\xe5\x67\x14\xce\x7c\x82\xa7\x9d\x63\x9a\x19\xc6\xcc\xf6\x91\xc2\x60\xfb\xdc\xe6\x7c\x0e\x9d\xd1\x62\x89\x67\x4b\x3b\x98\xa9\xa3\x3c\xe0\x78\xb6\xf8\x2c\xb7\xfd\x2f\x41\x3c\xee\xb8\xdd\xe1\x0c\xc9\x86\xb0\x4a\x10\x82\xf3\xb0\x94\xd2\x19\xad\x8a\xd3\x01\x87\x64\x28\x7d\x29\x01\x5e\x4e\x42\xd2\x7e\x88\x3a\xfa\xcc\x1d\xc9\xc1\x26\x7f\x93\xfc\xd3\x53\x04\xb0\xcf\xba\x3d\xfc\x7d\xf3\x2c\x63\x7f\x6b\xed\xfd\x6d\x0b\xa8\x07\x34\x74\x11\x0e\x9d\x85\xd6\x5f\xf4\x0d\x27\x50\x86\x2e\xab\xd3\x45\x3a\xc2\x2b\x41\x09\xcc\xc3\x39\x57\x8d\xb2\xaa\x3b\x40\x21\x2c\x37\xdc\x72\x7e\xf9\x70\xa1\xea\xa1\x2b\xd5\x79\x9a\xb8\xc2\x5d\xcc\x33\x76\x99\xca\x4e\x11\x13\xe1\xb9\x44\x6f\x2e\xf3\xc6\xed\xfb\xfd\x75\x35\xf1\xfe\xa6\x03\xc4\x47\x74\xe9\x2a\xcc\x80\x94\x4d\xeb\x43\x5b\xf6\x4d\xbc\x85\xe9\x0f\xf0\xd2\x82\x15\x95\xa9\x0a\xc1\x2a\x9f\x17\xca\xf2\x8d\x9f\xe3\x9e\x1e\x55\xa6\x1f\x6f\x10\x3f\x7c\x89\x57\x76\xd9\xe7\x7e\xde\x32\xc5\x33\x8d\x0d\xae\x2c\x8b\x90\x9f\xd7\x6b\xae\xb1\x36\x5a\xb9\xd0\x87\x1a\x30\x50\x20\x64\x5b\x55\x57\xa8\x6e\x99\xa5\xa4\xe2\x8c\x2e\xf7\x09\x9c\x86\xd0\x95\x27\xe7\xc4\x59\xd8\xfb\x84\x4c\xe9\x79\x6c\x45\x33\xa4\x3a\x2f\xb8\x40\xe1\x54\x43\x84\x30\x71\x1d\x23\xa4\x2a\xef\x13\xc5\x8b\xba\xa4\x63\x55\x1a\xae\x2b\x23\x1a\xa8\xd7\x49\x1a\x6e\x89\x16\x5a\x19\x91\x80\x5d\x9f\xc1\x23\x3b\x94\x11\x27\xec\x39\xaa\xea\xab\xe2\xf8\xf6\xc3\x8b\xf7\xb7\xfb\x24\x65\x94\x10\x55\x69\x04\x87\x49\x76\xfa\x50\xae\xa7\xeb\xd5\x9a\xc6\xa1\x99\x78\x07\x2a\x9c\x24\x20\x85\x19\xd9\x0d\x0f\x58\x80\x57\x3b\x5f\x17\x5b\xd7\x9e\x8f\x6b\xf4\x14\x9f\xe3\x5e\x70\x8e\x90\xbf\xee\xb2\x29\x9c\xe7\xf3\xa1\x14\xc2\x0a\x2b\x8d\x31\x46\x5a\xb1\x61\xcf\x93\xa3\xcb\xf2\xe4\x6f\x62\x7e\xd2\xbb\x57\xcf\xa0\xe7\x9f\x22\xdb\x82\x9b\x57\xdb\xc6\x26\xeb\x6a\x26\xa7\xda\xf8\xb9\xf5\x1d\x0d\x30\x9c\xb8\xd2\xb2\xba\x4c\xeb\x77\xa7\xd4\x37\xa1\xa2\xc0\xfa\x50\x66\xb9\x13\x42\x35\xb2\x51\x8a\x61\x5f\x03\x12\xa4\xe2\x95\xab\x2a\x9c\x22\x15\x88\x73\x22\x52\x78\x24\x20\x3b\x67\xe5\x11\x7e\x6b\x7c\xfc\x9b\x87\xf1\x01\xb3\x44\xd6\x5b\x75\x09\xca\xc3\x52\x28\x63\xb4\x28\xba\x03\x5e\xfb\xb9\xac\x4b\x0d\x74\x98\xc2\x59\x48\x3e\x9d\x2f\xbe\x98\xce\xd9\xbc\xd9\xe8\xe7\x46\x47\x07\xa8\x8b\xe3\xe0\xe2\x89\x2c\xb4\x2e\xb2\xe2\x5c\xfc\xb0\x3b\xe4\x4a\x39\xed\xb4\xb3\xf6\xf2\x11\x65\xc4\x47\x78\x20\x7f\x4c\xc6\x6d\x0c\x3f\x93\x91\xac\xf3\x58\xfa\x52\x01\x1e\xe6\xfb\x84\x0b\x3e\x44\x19\xb3\xea\xcf\x95\xb1\x90\xd2\x49\x2b\xbd\x52\x5e\x5a\x99\x80\x6c\x02\xcb\x11\x1e\xaa\xab\x8c\xe9\x73\x19\x3f\x7c\xf7\x32\xca\xa8\xb6\x2a\x1d\x7c\x89\x33\x85\x71\xc6\xaa\xa2\x3b\x54\x6b\x1e\xce\x65\x5d\xfa\x14\x07\x1e\xbc\x93\x1a\x50\xa0\xe3\xb8\x4e\xe1\x9f\x29\xe7\x7e\x6c\x1a\x17\xff\xc6\xb7\x8b\x2d\x53\x7b\x84\x07\xf8\x6d\x5b\x3e\xc8\x79\xed\xef\x4d\x4e\x65\x8c\xe1\x45\x77\x80\xab\x5a\xca\xba\xb2\x60\x0c\x2e\x8c\x4a\x4a\x50\x80\x2d\x4f\xc8\xa5\xf2\xcf\x95\x73\xf6\xf1\x22\xdf\xd5\xb5\xf3\xce\xc7\xda\x89\x76\x27\x0e\x66\xe3\xb2\x3f\x7e\x06\xe2\xbf\x79\x72\x41\xf0\xe1\x63\xbc\x5a\x8f\x4c\x4c\xc0\x79\x94\xd2\xb0\xa1\xc3\xd2\xd0\xf5\x75\x19\xe8\x3a\x57\xa6\x16\x22\x60\x30\x78\x6a\x64\x77\x30\x95\xf1\x61\xf4\x67\x1f\x66\x84\x9c\x13\x75\x99\xca\xb5\x2b\xca\x74\xf4\x00\x19\xad\x2f\x6b\x77\x90\x16\xf7\x6c\x9f\x1c\x74\x64\xc2\x78\xf7\x64\x8f\xfe\xee\xd5\xcd\xe1\xd5\x53\xa3\xdd\xc6\x4c\xd1\x38\xe8\xe3\xc0\xef\x07\x3f\x4d\x75\x3d\x87\x2e\x07\x54\x18\x4c\x2a\x86\x61\x95\x77\xb4\x73\x20\x29\xed\xa9\x6d\x87\xfd\x54\xd7\xbe\x76\x8d\xe3\x2c\xe4\x43\xe9\x4a\x01\x68\x30\x13\x07\x65\x5a\xba\xc6\xd5\x49\x02\xc0\x70\xcf\x76\xed\xb5\xfd\xdb\x87\xa8\xf2\xfe\x69\xc4\x79\xf7\xea\xe6\xfb\xe3\x97\x92\x7c\x97\xb6\x0d\x28\xa6\xe9\x7c\x8e\x78\x47\xe3\xb8\x84\x3a\x07\x9c\x5b\xcc\x4a\x46\x20\xcc\x07\xd4\xb8\x29\x9d\x2e\xcd\xf8\xcf\x52\x24\xfd\x55\x0a\x77\x8a\xc8\x74\x59\xd2\xdc\x8b\x6c\x7c\xe4\xce\x8b\x75\x6b\xcf\xd0\x75\xae\xa7\xd9\xfb\x57\x37\xef\xe3\xc9\x4a\xbb\xfa\xa1\x47\xc4\x59\xee\x8b\xf2\x14\x4e\x12\x90\x12\x79\x52\x86\x6e\x23\xe4\xda\xbb\xbb\x76\x3d\x31\xc5\xb9\x18\x4e\x1c\x63\xab\xd5\xbe\x97\x1c\x2a\xed\xc7\x31\x34\xc3\x90\x64\xc9\x70\x2f\xb2\xf3\x2f\x68\xf3\xb4\x9a\xd8\xa6\xe3\x75\x51\xce\x61\x96\x80\x96\xa8\xc6\x55\x68\xc0\x1c\x2a\x30\xff\x09\x6d\x66\x33\x38\x1f\xd1\xa1\x8c\xab\xfe\x5f\x3f\xc3\xe4\xfd\xcf\x20\x5e\xad\xbc\x8f\x47\x7f\x59\x5c\xc4\x1e\x11\xe7\x98\x41\x8e\x71\x60\x95\xb0\x26\xd6\x76\xe4\xa0\x0e\xf2\x50\xde\x35\x42\x16\xae\x90\xb2\x71\x97\xc9\x0a\x86\xd9\x07\x5a\xdb\x22\xc9\x40\x02\xba\x6c\x7e\xe4\x9c\x8f\xec\x03\x6f\xae\xe0\x4d\xcf\x94\xba\xbc\xb2\x79\xed\x00\x41\x5a\x51\x83\xc6\xb0\x50\x50\x95\x55\x0d\xab\x30\x80\x26\x70\xd0\xec\xc7\xd5\x9d\x05\xa1\xc6\x51\xc6\x08\xcd\x46\x82\x31\x13\x56\xa9\x93\xd6\x71\xcd\x39\xdf\x8b\x1d\xfd\x86\x0d\xb7\x34\xa3\xaf\x6c\xb8\x4b\x56\x33\xf5\x98\xb8\xe6\x32\x0f\x9f\xc2\xf4\x4d\x1b\xce\x4c\x28\xc5\xc3\x12\x46\xae\xa4\x56\x5f\x5a\x31\x49\x52\x50\xdd\xeb\xa3\xda\xf1\xe4\x18\x67\xc6\x2b\xc1\x00\x78\x12\x05\x1e\x22\xc0\x91\xfe\x5e\xef\xdb\xdf\xb5\xa0\xda\xb5\xeb\x12\x0b\xe0\xc8\xef\xcf\x29\x0e\x08\x8c\xeb\xb2\xe3\xee\x8e\xb8\xdd\x7c\x9f\xd8\xda\xd6\xf6\xf2\xb6\xe1\xd3\xd2\xc8\x95\x4f\xbe\xfe\xfd\x5f\xa0\x7e\xde\x1c\xfd\x1d\xcb\xda\x4f\x2d\x48\xd2\x29\x9c\xe2\x79\x2c\xbd\x9b\x00\x89\xe7\xb2\xf3\x81\xf8\xdf\x4b\x7f\x18\x42\xed\x23\x0b\xbc\x73\x00\xba\x8d\x2b\x37\x4d\x23\xcf\xcc\x9f\xd4\x86\xfb\xe4\x76\xea\xf7\x0b\xa8\x32\x11\x9a\xb8\x9a\x72\x77\x04\x44\xc2\x9a\xe0\x7f\xae\x8d\xac\xf8\x05\x7a\x94\xd9\xe9\x93\x06\x49\x56\x84\x31\xae\x15\xc5\x5d\x03\x78\x5c\x28\xf6\x3f\xdb\x46\xf5\x0b\xda\x80\xd9\xf4\xc9\x82\x24\x4b\x22\x5b\xc1\x02\xf8\x5d\x7b\x6d\x63\xf8\xb9\x36\x92\xe6\x5e\xef\xf0\x37\xda\xb8\xbd\x42\xb8\x6d\x89\x80\xef\x5e\xdc\xee\xf0\x5a\xa4\xfd\x5d\x0d\x92\x54\x9e\xa6\xe9\xbc\x4a\x90\x8f\xe3\xe9\xf3\x2f\x77\x61\x7c\xfc\xe5\x91\xdb\x0b\x90\x7b\x7a\xe8\xd2\xe9\x1b\x38\xd9\xdb\x59\xfc\x03\x15\xc6\xa1\x53\x9a\x8a\xca\x50\xf6\xa9\xf3\x7e\x47\x3f\x75\x97\x57\x3a\xad\x68\x83\xb0\xc7\x61\xce\xdc\x59\x86\x5a\x5d\xef\x98\xd3\x39\x33\x07\x13\x91\x96\xaf\x99\xa5\x9f\xc3\xe7\xfb\x9b\xed\xee\x33\x5e\x8f\xa6\x10\x95\xa0\x08\x24\x07\x0d\xb7\x88\x55\x0a\xa1\x32\xcc\x55\xa3\x05\xcf\x5b\xc0\xca\xea\x60\x28\xb3\x32\x78\x57\xd8\x82\xfb\xfb\xc4\x4b\x3a\x2f\x16\xa3\x68\x7f\x97\x8e\x47\x7d\xc5\x93\x78\x7a\x4b\x0b\xbe\x3a\xd9\x7d\xf1\xe3\x9b\x48\x65\xb9\xe3\xa6\xc8\xd3\x66\xcd\x11\x51\x2e\xed\x39\xe7\xc2\xb1\xd0\xd4\x8c\x73\x89\x74\x4b\x81\x04\x84\x85\xbe\x22\xf2\x60\x60\x55\x1a\x8a\xb9\x0e\x83\x60\x98\x42\x67\x00\x2f\xf3\x53\x85\x34\x45\x0c\xb4\x95\xd0\x94\x93\xb8\x17\x8b\xf8\xd2\xcd\x41\x25\xbf\xfa\x3c\x83\x6e\x1c\x4e\x9f\xb9\x13\xf6\xc7\x9f\xd2\xec\xf8\x78\x77\xb6\x23\x9e\xa4\xf3\xdd\xc8\x94\x99\xd3\x19\xdb\xae\x84\x8d\x15\x6d\x27\x41\xa9\x96\x13\x9a\x9c\xc3\xfd\x42\x40\x73\x50\xa8\xf1\x5e\xcb\xa5\x73\x18\x77\x8e\x69\x65\xd9\x7d\x72\x72\x03\xe8\x81\x43\x77\x03\x22\x8e\x32\xbe\xab\xc8\x95\x5f\xa9\x8d\x73\xc9\xaf\x22\xfe\xfb\xe7\xf3\xf0\xcf\xb7\xb8\x4f\xf0\xeb\x3e\xbe\x4e\xc1\x87\x8f\x6f\xd3\x82\x94\x80\xde\xf5\x97\x69\x04\x0c\x82\xd4\x65\x15\x4e\xa1\x85\x63\xdf\x34\x55\xab\x1a\x55\x3b\x45\x89\x5f\xc2\x3c\xb6\xf8\xa0\x95\x76\x4e\xf2\x4f\x62\x38\x31\x29\x04\xb6\x23\xc0\x55\xe1\x7a\x40\x51\x98\x9a\xbc\xd0\x16\x87\x22\x0c\x08\xe9\x6d\x5f\x4e\xd2\x73\x46\x1f\xeb\xaa\xbf\x8a\xf9\x7f\x05\xc0\xfb\x9b\x5f\xa7\x37\xef\xd3\x33\x63\x98\x57\x02\xa3\xb0\x94\xc2\x68\x10\x57\xf2\x19\xbd\x6b\x05\x2f\x4d\xc1\x9b\xa9\x65\x67\x50\x82\x26\x9c\x9d\x53\xde\x6f\xe3\x0f\xdd\x93\xa3\xcf\x6c\xf2\xff\x8f\xf7\x82\xaf\x77\xfb\x57\xdb\xbd\xfa\x5f\x81\x1f\x9f\xd8\x3e\x7a\xc2\x67\xd3\x1f\x73\x1a\xda\x80\x09\xd3\x14\xa7\x05\x40\xc4\xfb\x12\x4b\x2e\x94\xe6\x9d\x08\x8e\x72\xce\xa3\x27\xe0\xcc\x6a\x0a\xbb\xd0\xdf\x27\x52\xf0\x13\x40\x20\x81\x56\xc1\xd2\x4a\xa6\x95\xa6\x4a\x99\x13\xe8\x8b\xf5\x5c\x41\x8d\x11\x4b\x87\x62\x93\xe9\xf4\x88\x55\xf0\xe3\x26\xd3\xf5\xbc\xe4\xc7\x88\x0c\xfc\xf2\x78\xf1\x82\x27\xac\xb4\x3f\xbc\xfe\x70\xcc\x75\x18\x83\xd3\x46\x02\x03\x94\x14\x0a\x3b\xb5\x40\x6a\xb1\xf2\x0c\xe4\x27\x26\x65\x5e\x92\x83\xd1\x0a\xad\xcd\x3a\x06\xc9\x81\x4e\x8b\xb4\x47\xab\xd6\xfa\xa2\xca\xec\x40\x97\xf1\xe2\xd3\x24\x8d\xa0\x7c\x5f\x94\xd2\xc0\x6a\x6e\xaf\x58\x12\xed\x3d\xde\xc1\x83\xf8\xc3\x58\x0c\x19\xd5\x52\x5c\x26\x1b\x21\x84\xaa\x0d\xb3\xce\x1d\x04\xd3\xca\xf0\x20\x99\xd4\x86\x05\xc5\x83\x09\x5e\x02\xbe\xe5\xa4\xd0\x5d\x15\xeb\x87\xde\x7c\xad\xdf\x0f\xaf\x8f\x69\xf6\x44\xbd\xfd\xab\x8f\x3f\xbc\xfe\x90\x49\x13\xc6\xd0\x38\x6b\x80\x02\x5a\x72\x2e\x99\x33\x7d\x0f\x1b\xc7\x00\xb7\xd2\x87\x85\x53\x4c\x0f\xda\x48\xb4\xb6\xeb\x29\x30\x01\x54\x5a\xa4\x1d\x5a\xb9\xd6\xbc\x1f\x09\x30\x00\xad\x98\x59\x86\xf8\xce\x57\x4a\xa9\xb2\x87\x52\xb2\x38\x1f\x2e\xb1\xfe\xa4\x49\xfe\x62\x63\x71\xf8\x2c\xcf\x73\x0f\x48\xb2\xc3\xed\xa3\x0b\x1c\x6a\x1d\xd8\x7a\x3e\xd9\x29\x2d\xd3\x82\x8d\x53\x85\x9c\xd2\xa6\x37\x67\x1e\xb0\xa4\x44\x5b\x5c\xcf\x0c\xb8\x5d\x63\x38\x0c\x24\xd8\x30\x72\x90\x03\x91\xa2\xca\x1b\x0c\x6b\xc5\xb5\xb0\x62\x76\x35\x28\x52\x5d\xac\xac\x22\x96\x61\x9e\xd9\x32\x49\xd3\xe1\x5a\x0b\xf9\x95\x3c\xd7\xfe\x7f\x16\x06\xde\x6c\x32\x1e\x26\x1b\x54\x80\xb5\x73\x60\x01\xb3\xb4\x96\xf6\xaa\x69\x2a\x2b\x25\xb6\x03\x03\x0c\x40\x66\x5d\x51\xaa\x83\xb1\xd1\x44\x73\xe0\x02\xe8\x34\x4f\x07\xb4\xaa\x8b\x13\x74\x61\x72\x4b\x5a\xa6\x79\xf1\x69\x82\xd4\x0a\x2a\xf6\x45\x21\xed\xe6\x06\x29\xd8\x7c\x52\x3c\x95\x09\x3c\xc8\xb4\xff\xee\x6a\xa3\x2f\x22\xd4\xe1\x64\x02\x5e\xa7\xfb\xc4\x2d\x29\x06\x27\xed\xc3\x5c\x11\xaf\x55\xdd\x70\x90\xa8\x65\x41\xa6\x31\x55\xbb\x50\x70\x3a\x08\x2b\xe0\xda\x7f\x96\xaa\x83\xf7\x89\xa6\x30\x9c\x07\x33\xe8\xd9\x9c\x16\x37\xa7\x39\x18\xf3\xbb\x0a\x53\x2f\x18\xdb\x4d\xe5\xe6\x9b\xf4\x9e\x45\x9e\x90\xbf\x48\xca\x2f\xbd\x69\x7f\x79\x7e\x90\xe5\x0a\xaa\x9d\xc4\xd2\xf1\xc3\x62\x02\x0f\xc9\xe5\x97\x16\x60\xe0\xe1\x14\x3a\x63\x70\x3d\x4a\xa0\x80\x94\xbe\xd6\xb3\x0a\x86\xfb\xa2\xb2\x0f\x82\x9d\x83\x10\x40\x81\x73\xda\xc2\xd9\x31\xf8\xe9\x8c\xa9\x96\x5c\xee\xe6\x2a\xb4\xca\xb1\xa0\x7a\x0b\x58\x96\x40\x67\xe8\xb6\x3e\x91\xf1\x3e\xe1\x17\xf6\x61\x67\x82\x0a\xd5\xe8\x7a\xb0\x80\x93\xb2\x8e\xcd\xaa\xef\xa1\x51\x1a\xfb\x91\x01\x0c\x20\x33\xa6\xa8\x1e\xfb\xf0\xd1\xcd\x63\x1f\x1a\x1a\xfa\xd8\x87\x08\x2c\x5f\xf5\x61\x47\x92\x2c\x2b\x62\x8d\xb6\x48\xfe\xc3\x95\xdb\x3a\xde\xec\x3f\xcf\x78\x78\x71\xfb\xaa\x00\x6f\x7f\x7c\xf1\xfe\xf6\xfd\x0d\x78\x72\x2f\xb3\x2f\x6a\x70\x0a\x6d\x89\x18\x2a\x5c\x25\xbd\xe3\xcd\x25\x8a\xb0\x19\xb8\x30\x1b\xe6\xa8\xc9\x68\x4d\x85\x97\x07\xb1\x42\xb7\xc2\xaa\xe4\x13\x0e\x8b\xa6\x32\x5d\xe6\x40\xc3\xc9\x9e\x80\x98\x5d\xca\xbb\x89\x4f\x3d\x43\xf7\x49\xc3\x86\x2d\xff\x80\x64\xed\xc1\xc4\x6c\x91\xff\x18\xb3\x87\xfe\xe7\x87\x79\xf8\x70\x7c\xf7\x15\xad\x4e\x1a\x23\xfe\x25\xee\x1f\x6f\x3e\x7c\xbc\x3d\xbc\xf8\xf2\xc4\xbf\x75\x65\x05\x28\x42\x3d\xa5\x44\x55\x06\x55\xce\xba\x82\x39\x51\x55\x74\x29\x40\x4e\xe0\x42\x9d\x03\xa5\x0b\x3c\x7e\x1c\x0c\x24\xd8\x28\xf6\x89\x71\x5e\xf8\x02\x01\x1a\x33\x15\x9a\x0e\x4f\x40\xa5\xba\xac\xec\x32\x71\xa1\x02\x9f\xa6\x69\xed\xe7\x79\xde\x30\x96\xe9\xb1\xde\x35\x8f\x0c\x1e\xcf\xec\xf8\x97\xe0\xa6\xfa\xe9\xfd\x8b\x9b\xc8\x02\x71\xd9\x8e\x3c\x2d\xce\xcd\xda\x26\x2b\xd7\x86\x77\x0e\xe7\x4d\xae\xee\x93\x70\xaa\xc3\x84\xc2\x18\x46\x0a\xce\x38\x14\x59\x92\x1a\x67\xac\x76\x9f\x16\x6b\x9c\xf2\xbb\x66\x5d\x7c\x40\x55\x85\x6b\x3c\x4a\xca\xd3\x3c\x8c\xa1\xa7\xb5\x02\x8d\x07\x13\x3b\x19\xe5\xbd\x69\x55\x5d\x27\x49\x9e\x25\x31\x6e\x7c\xce\xb3\xfd\x5f\x93\xff\x92\xfc\xd7\x78\x9a\x7d\xf3\xf9\x96\xf2\xcd\x93\xe7\xe7\x59\xc2\x0f\xd8\xbe\x37\xaf\x9e\xff\xbd\x7d\x71\x71\x80\xf7\x37\xaf\x2e\xaf\x98\x57\x21\xc1\xe4\x6d\x83\x47\x1f\xfa\x14\x82\xf9\xfa\xdc\x05\x05\x0b\x53\xc0\xb4\x85\xa5\x29\x61\xe0\xb6\xac\xce\x79\xe1\xca\x02\xb8\x60\x00\x0f\x4d\x7c\xb9\xbb\xd6\x33\xde\x81\x76\xcb\x09\x89\x79\x21\x6c\xa5\x0d\x23\x86\xd1\xb3\xdb\x9e\x28\x3b\x13\xca\x21\xa7\x30\xbe\x07\x01\x29\x41\x10\x11\x6a\x8d\x36\xc6\x58\x9c\x36\xc2\xf5\xb3\x31\x67\x63\xee\x13\xb3\xd5\xa5\xb2\x7b\x92\x89\x83\x7e\xa8\x20\x8c\x35\x50\x17\xf1\xaf\xc3\xec\x76\x3b\x32\x79\x71\x7b\x99\xba\xd2\xab\x63\x4b\x50\x59\x80\x5a\x41\xa1\x37\x54\xe4\x42\x2b\xc9\x1b\x4b\x4b\x5b\xd2\x94\x5a\xcc\x34\xcb\x9a\x74\x5c\x91\x5d\x1d\xc6\xc6\x30\x96\x25\x01\x07\x5b\x2b\x0d\x38\xa8\xd3\x7e\x5e\x20\x48\xa6\x02\x86\xa5\x23\x73\xb2\x4b\xd4\xbd\xcc\xe6\x83\xbb\xe6\x16\x3c\x32\xbf\xde\xbc\x78\xf7\x21\x7b\x60\x85\x7b\xbd\x7f\xfb\xe6\x61\x8b\x75\xb5\x31\x18\xea\xa2\x04\x72\x4d\x4e\x95\x04\x7d\x20\x97\x57\x6a\x8b\xbb\xa6\x04\x32\x1e\xb9\xb4\x19\x09\x2d\xa8\xc2\x7c\x70\x90\x92\x15\xa7\x03\x0c\x9d\x0f\xd4\xdf\x51\x6f\x3c\x6e\xb6\x0d\x58\xac\x8f\xcd\xc6\x6b\x3d\x74\x15\xf1\xb8\x1e\xfd\xf3\xdd\xd7\x03\xfd\xc3\x36\xd0\x9f\x02\x25\xca\xcb\x46\x79\x2e\x8a\x0a\xc1\xdc\x95\xdc\x58\x76\x99\xba\x96\x33\xf0\xa0\x76\x4c\x5a\xbd\x1a\xc3\x2c\x35\x07\xbd\x56\x76\x2d\x50\xce\xe6\x38\xd0\x45\x56\x9c\x02\xb9\x04\x20\x20\x4f\x36\xe5\x30\x9c\x7a\x3a\x8f\xfd\xc4\xa6\xfe\x7a\x26\x6d\xbf\x96\xe9\xd9\x3d\xd8\x43\x0f\xc5\x51\xf3\x24\xf8\xec\x9c\x4f\x51\x50\x45\x5e\x79\x5a\x3a\x68\x66\xcd\xe7\x7c\x9a\xcd\xd4\x95\xa1\x4d\x61\x30\xb5\xb0\xbc\xce\xce\x91\x99\xf8\xa0\xd7\xd2\xaf\x04\xe6\x39\x75\x78\x94\x4c\xa6\x53\x70\x41\xd4\xc6\x01\x0e\xa8\x4f\xe5\x70\xa2\xf3\x80\x51\x38\xb7\x74\x7c\xf0\x1b\x7a\xb4\xd9\x14\x99\x4c\xe0\x13\x7b\x55\x4f\x98\x3e\xd3\x6f\x8d\xe6\xa6\xce\xc8\xea\x09\x28\x2f\x5b\x18\x1f\xac\xe5\xa1\x87\xab\x17\x69\x85\xd6\x29\x43\xa9\x74\xd2\x68\x73\x87\x34\x75\x54\x65\x53\xa0\x3e\xd4\x98\xb4\x68\xd2\x84\x03\xb7\x9e\xb1\xaf\x80\xf5\x80\x51\xcf\xd5\x65\xb7\xce\xb5\xdc\xd6\xbc\xec\xd8\x1f\xd4\x13\xe6\xab\xc8\xc0\xf3\xc3\xcd\x6f\x3e\x5e\x23\xcc\x6d\xf5\xc4\x5a\x0f\x3d\xf8\xdd\x9b\x58\xec\x07\x9c\x03\x55\xab\x81\x19\xc7\x9a\x97\x16\xf5\x6b\xe7\x42\xdf\xa9\x82\x71\xc5\x68\xee\x40\x09\x90\x23\x4c\xb3\xc0\x78\x65\x2b\x76\x50\x77\x8b\x5b\x39\xaa\x72\x6c\xf0\x40\x19\x4b\xe7\xc0\x43\x6b\x84\x02\x08\x68\x97\x5a\x14\x86\x89\x80\xe4\x7c\x9f\x84\x05\x82\xea\x1c\xe7\x5d\x76\x8f\xa3\x8f\x7d\x31\x97\xbc\xfb\xba\x3f\x7f\xfc\xaa\x3b\xbb\x3a\x85\x41\x95\x05\xd6\xb4\x70\x95\x1e\x6a\x31\x97\xe3\x28\x81\xa8\x42\x97\xa2\xa0\x1b\xe1\x78\xb3\xcb\x6b\x61\x7c\xec\xce\x7a\x25\x28\xa7\x9e\x8c\x82\x8a\x74\x0e\x4d\xe0\x9d\x3f\xa7\xb0\x4e\xd5\x78\x62\xf3\x48\x70\x38\x77\x6c\xda\xce\xc7\xc5\x35\x5f\xe3\x3f\x5e\xd1\xca\x37\x40\x87\xab\x70\x4f\x45\x4b\xc1\xdb\xcb\x0e\xe6\xf6\xe1\x40\x72\x27\x2e\xf3\x7d\x1d\x0f\x3c\x4d\x58\x10\x89\xee\xef\x34\xf3\x79\xe8\x8c\x67\x34\x3f\x81\xba\x47\x54\xdb\x43\x59\x49\x71\xf9\x7f\x3e\x74\x7e\xd5\x84\xb5\x78\x91\x54\xa6\xcd\x3a\x84\xde\xd9\xa1\x3e\x7b\x40\xad\x50\x53\x92\x80\x94\x27\x3e\xd6\x46\xfd\xc3\x37\xe5\xf9\x78\xcd\x89\x8c\x02\x5d\x3d\xec\x45\xdc\xd6\x64\xd2\x95\xd5\x1c\x0f\xad\xd2\x32\x70\xd6\x16\xa5\x2f\xe4\xd9\xf3\x1a\x06\x1d\x4d\x65\x53\x12\x66\x44\x4d\x7d\x60\x50\x70\x90\x87\xb3\xbf\xfc\x83\x18\x22\x8b\x26\x49\x59\x9a\xaf\x93\xae\x25\xf0\x1e\xe4\x5a\xc8\x53\xb4\x0f\xba\x62\xba\xff\xa7\x6f\xc8\xf3\xfa\x79\x80\xb8\x58\x28\x8e\xc5\x68\xa0\xef\x76\xd0\x97\x55\xb7\xdd\x47\xb9\x70\x2a\x72\x88\x61\xe1\x2b\xee\x2c\x6b\x8a\xd0\x9a\xda\x15\xe1\x04\x4e\x33\x26\xd6\x1e\x08\xd2\x6a\xbb\x2f\x6b\xec\x6a\x60\x9e\xf3\x33\x0e\x93\xa1\x32\xf5\x6b\x1d\xce\xc6\x00\x02\xa0\x05\xbc\xd6\x11\xdf\x1d\x24\xfe\x9e\x1d\xed\xee\x6a\xa7\xe3\x93\x53\xe9\x17\x5f\x90\x7f\xde\x7c\x4e\x19\x8b\xfb\xf4\xb3\x43\x40\xd5\xa9\x5a\x5d\x96\xaf\x1d\x91\x3d\x2d\xea\x8a\xe0\x30\xcf\x32\x4c\x74\x5d\x14\x98\xc9\x3a\x67\x28\x10\xca\x4d\xbf\xd3\x48\x59\xeb\x17\x1f\x0c\xac\x88\x43\x13\x42\x54\x82\x36\xd0\xd6\x3b\x40\xfc\x62\xb8\xec\xa3\x9d\x60\xd2\x47\x3f\xfa\x96\x9d\xbe\xf6\xf1\xed\x2c\xe2\xea\x48\xc8\x95\x55\xe3\xe3\x5c\xd7\x84\xae\xa4\xf4\xe2\x49\xc2\x79\xde\xe6\xb6\x57\xb5\xcd\xcf\x60\x3c\x61\x66\xea\x03\x85\x82\x5d\xef\x9c\x5c\x30\xb0\x44\x12\x37\x8c\x49\x50\x87\x73\x38\x49\xcd\x4e\x93\x03\xb9\x91\x72\xdc\xce\x44\xdc\x3d\x3b\xca\xdd\xb4\x31\x79\x7f\xcb\x46\x5f\x06\xab\xcd\x44\x29\xf1\x08\xc0\x88\xf5\x95\x8e\x21\x87\xb4\x27\x79\x53\x98\x30\xb7\x32\x9c\xaa\xd5\xc9\x14\xc3\x75\xcc\x8a\xe0\x30\xb3\xcd\xae\x41\xf6\x74\xf2\x27\x1f\x24\x2c\x71\x8d\x66\xc9\x38\x18\xd7\x45\x7b\x09\xac\x3f\x69\x2e\x87\x8b\x5f\x2f\x57\x3f\xfa\xd6\x38\xfb\x59\x37\xca\x16\x5f\xc2\x61\xbb\x32\xee\x42\x5f\x62\x76\xf1\x22\x51\x7b\xde\x14\xc1\xeb\xc6\x97\xa1\x4b\x8b\x33\x66\xb6\x7e\xe2\x45\xad\x5f\x6d\x55\xaa\x19\x87\x93\x63\x22\x75\x6b\x73\x75\xa2\xca\x03\x76\x71\xa2\x22\x01\xd9\x96\x03\xb9\xc9\xf4\xd0\x1d\x11\xc0\xe5\x67\xa4\x8b\x31\x74\xd7\xb6\xc0\x0f\x18\x5b\x8b\x7d\x59\xd5\xdb\x8d\x2f\x0d\x4b\x01\x49\x55\xf8\x52\x38\xcb\x74\x61\x9d\x39\xa7\x9d\x07\xd4\x6b\x09\x4a\x40\x91\xd6\x8f\x41\xc0\x54\x25\x5d\x70\x98\x35\x93\xa9\x0f\x3e\x38\x67\xe6\xad\xcf\xd8\x3d\xd9\x15\x07\x1d\x57\x02\x37\xdf\x96\xe9\xf3\x02\x25\x05\x6f\x93\x4b\xf0\x01\xf5\x45\x18\x87\x36\x61\x50\x18\x01\xec\xb4\x2c\x6d\x4f\x55\x1e\x06\x03\xe0\xa3\x1c\x08\xa0\xa7\x72\x8c\x84\x38\xce\x68\x5a\xaf\x63\xe8\xae\xe7\x7f\xfb\xac\xbc\xf4\xd5\x3e\x49\x5e\x25\x7f\xfd\x38\xff\x3e\xe7\x23\xfd\xf0\xf1\xa7\xb7\x97\x45\xde\x87\x8f\x37\x3f\xbc\x7c\xbd\x8b\x34\x66\x9f\xdf\x77\xdc\xa3\x94\x2a\x6f\x41\x41\xc2\x3c\x8f\xa1\x47\xe7\x56\x50\x65\x26\x20\x1c\x0f\x95\x3e\x8b\xfb\x24\x38\x06\x0c\xf0\x32\xf4\x21\xe1\x69\x01\x3a\x11\xfc\xca\x59\xda\xef\x13\xc4\xac\x15\x08\x39\x24\x39\x31\x90\x10\xaa\x44\x77\x62\x5c\x86\x51\x29\x6c\xb1\x94\x35\xb7\x1c\xcb\x85\x1a\x9e\x24\xc9\x61\x97\x44\xdf\x82\xd7\xfc\x9e\xbf\x89\xf5\x35\xc9\x96\xcb\xf3\x90\xf0\xf1\xf1\xe6\xe5\xb5\xaa\xf4\xf8\x90\x8c\xf5\xee\xfd\xed\x2e\xc9\x7c\xd0\x08\x78\xb7\xf6\x0e\x40\x14\x5c\x23\x04\x98\x85\x38\xab\xf8\xe7\x00\xdd\xf2\xfb\x5a\xeb\xbd\x58\x7e\xdf\x65\x11\xd2\x66\x59\xd6\xfa\xf2\x6f\xc3\xe2\x21\x11\xc3\xe5\x75\x72\x9b\xfc\x63\xf2\x5f\x92\xff\xed\xf3\xfd\xd8\xc6\x3d\xf9\xea\x73\x85\xd8\xeb\xcf\x79\x1e\x6f\x5e\x3f\xa5\x86\x3f\x3e\x26\xd0\x6c\x86\x7d\xbb\xe5\x7c\x7d\xf8\x78\xe3\x81\xb4\x17\x6f\xee\xbc\x54\xda\xd6\x1d\x5b\xba\xe0\x53\x6b\x10\xc5\x14\x91\xb2\xe4\x34\x54\xa6\x42\x15\x2b\x2b\x44\xa4\x1e\x5c\x09\xb8\x24\x42\x28\x2e\xda\xfb\x04\xcf\xbe\x41\x58\xf4\x3c\xee\x9e\xe2\x05\x5c\x68\x94\x55\x9a\xd7\xaa\xe1\x46\x0d\x40\xc2\xd2\x12\x22\x29\x86\x15\x13\xbe\x32\x10\x69\x58\x29\x2a\x5c\x50\x90\x9a\x62\xa6\x94\x6b\xc1\x3c\x71\x48\x6b\x8c\x64\xc7\x0c\xb7\xd7\xf3\xa6\x8d\x7f\xea\x45\xf4\x8c\xcf\x27\x7d\x0f\x45\xce\xaf\xaf\x24\xa7\x0f\xe4\x69\x91\x54\x3e\xc6\xba\x83\x6b\xa4\x2d\xab\xd0\x05\x07\x7b\xe7\x9d\x9d\x17\x42\x03\xb5\x79\xd1\x6e\x7e\xab\x83\xf5\x41\x01\x37\x95\xd0\x88\xfd\x3c\x9c\x18\x41\xa4\x34\x0d\xe0\x28\x74\xba\xc4\x42\x04\x52\x71\xbe\x2c\x6e\xf1\x91\x77\x7e\x61\x8c\xce\x49\x1a\xd7\xf2\x5d\xc4\xa0\xfa\xfb\x0d\x5d\xee\x4b\x99\xfe\x90\x48\xe9\xa2\x99\x2f\xca\x70\x0a\x03\xf2\xaa\x56\xa2\xeb\x21\x0a\xca\xa3\x2b\xdd\x7e\x15\xe6\x3a\xd4\x40\xf4\x15\x52\xe2\x50\x4c\xe1\x4c\x29\xc5\xa5\xf3\x00\xa1\x70\x52\x05\x54\x17\x91\xc6\xf3\xd9\x9f\x7d\xa0\xa0\xf3\x67\xc1\x74\xbf\x9d\x15\xff\x8c\x9d\xde\xfc\x21\x3b\xc5\x10\x7c\x50\x9d\x76\x65\x15\x5c\x90\x70\xaa\xbd\xf7\x67\x90\x10\x16\x90\xcd\xcb\xd1\x6f\x18\x7d\x41\xf8\x80\xc1\x70\x9f\x54\xd0\xa8\xfd\x3c\xcc\x1c\xe3\x07\x4b\xf5\xa6\xc0\x92\x07\xfa\x0d\x4b\x25\x49\x1a\xf1\xba\xec\xa3\xad\x9e\x20\xbd\x5d\x91\xc8\x2e\x3b\x90\xaf\xe5\xba\xc4\x3d\x5c\xb7\x1e\x10\xc0\x29\xb3\x93\x71\x10\x05\xb8\x2e\x10\xe4\xc2\xe5\x10\xa0\x58\x57\x9d\xe2\x75\xa8\x63\xd5\x8f\x17\xae\x3e\x18\x14\x26\x55\x22\xce\xd9\xb8\x70\x46\x69\x69\x7d\x18\xa0\x10\xcb\x72\x99\x53\x2f\xe6\x5a\x3c\x3d\x25\x69\x86\x12\x16\xe7\x87\x7f\xfb\xc0\x1b\xf3\xe3\xc7\xcf\xe9\x70\x2f\xfe\xb0\xa5\xf6\x89\x6b\x5b\x00\x17\x65\x7b\xed\x44\xb0\x81\xc2\x93\xab\x50\xeb\x41\x17\x28\x18\x03\xf2\x01\x82\xe9\xb2\x3e\xd3\xed\x41\xe3\x45\x57\x50\xb1\x66\xe0\x9e\x40\xe3\xc3\x04\x19\x1d\x06\x37\xb8\xd0\x03\xe2\x06\x82\x85\x4f\xd2\x88\xe1\xbf\xe1\x99\xfd\xc3\x97\xbe\xf4\xe3\x1f\xe9\x37\xd1\xe9\xba\x82\x81\x07\x08\xe7\xba\xae\x2d\x80\x80\x10\xba\x2e\xae\x84\xa7\x1a\xb8\xa0\xc0\x29\x94\x75\x44\x4a\x9c\x30\x51\xfe\x50\x4c\xf7\x09\x63\x8c\x96\xa6\x06\x18\x85\x59\x15\x58\x8a\x80\x2a\xc9\xbf\xf4\xa8\x34\xf5\x51\x2e\x9b\x14\x0f\x3e\x1e\xbb\xeb\xa9\x58\xdf\xe8\xb6\x28\x16\x89\xf0\x6e\x78\x3d\x43\x50\xf4\xbe\x6e\x00\x06\x8c\xb2\x75\xf0\x25\x04\x49\x0d\xda\xc0\xd2\x62\x5d\xea\x75\x48\x71\x68\x31\x7d\x90\xcb\x93\xd2\x7a\x40\x50\x38\x99\x12\x7d\x4b\x2c\x13\xb9\x4f\x87\x7b\x1a\xeb\xf0\x7e\x48\xfe\xdd\x56\xd3\xb8\xb1\x00\xdc\x6c\x31\xf0\x26\xc6\xc0\x97\xb7\x1b\x3c\xf0\x37\x53\x2c\x17\x00\x71\xe5\x08\x68\xee\x13\x35\x28\x46\x42\x81\xa9\x54\x7e\x06\x8e\x33\xd0\x48\x1a\x60\xc6\x2f\x8e\x76\x2e\x95\x16\xba\xb4\x1c\xc3\x7c\x5d\x68\xb3\x6f\x94\x84\xad\x6b\x1b\xcb\xa8\x60\x8c\x4a\x0b\x92\x4e\x5a\xbf\xb6\xae\x0e\x7a\x28\x4d\x21\xe6\x38\xa9\x65\x11\xcf\xdc\xef\xcb\xc8\x5f\xf3\xee\x01\x85\x24\xd6\x60\x3c\x88\xf8\xe3\xc7\x9b\xfd\xcd\x4f\x6f\x6f\x0e\x57\x24\xa1\x57\xef\x9e\x4a\xf9\xf6\xe3\x8d\x4b\xbd\xaa\x49\x26\xd7\x05\x24\x80\xf2\xb1\xbd\x33\xed\x44\x01\x3a\x85\x3c\x2d\xd3\x4e\x89\xb0\x88\xb5\x3f\xa0\x4f\x4b\x59\x65\x02\x97\xc6\xbb\x16\x0e\x86\x93\xe2\xce\x41\x1a\xf4\xce\x78\x24\x5d\x43\x1b\xa2\x38\x13\xd4\xca\xa6\x65\x82\x87\xda\x61\x9c\x87\xa1\x2b\x5c\xc1\xad\x36\x49\x96\xe9\x78\xee\x66\xe3\xb9\xc4\x3f\x5f\xed\x79\xf8\xd2\xa0\xff\x0a\x6e\xc0\x4f\x6f\x6f\x0f\xc7\x6c\xb3\xe8\xf1\x70\x3c\xfc\x3d\x78\xfb\xee\x37\xbf\x05\xd7\xb4\x55\x01\x4b\x57\x54\xe0\x14\x4e\x6a\x14\x8c\xae\x2d\x26\xda\x09\x1a\x96\x74\xd1\x54\x51\xb3\x64\xdd\x5a\x57\xa9\x28\x61\xc5\x60\x5b\x97\xbe\x45\x55\xbe\x1a\xd2\xed\x1b\xa5\x2a\x21\xdc\xa8\x0c\x22\x5c\x10\xac\xb4\x92\x61\x36\xb5\x73\x61\xf2\x75\x18\x34\x47\xa5\x85\xde\x6c\xb6\x4d\xc5\x95\x57\xf1\x75\xf2\xeb\xad\xaa\xff\x51\xde\xcf\xd6\xdd\xb8\x54\xbe\xed\x00\x37\xa9\x03\x03\x86\xbe\xaa\x52\x11\x9c\x05\x95\x52\x62\x45\x42\x8b\x73\x1d\x7c\x0a\xa5\x4d\xa5\x15\x2b\xdf\x9d\xef\x3a\x94\x9e\x51\x33\x2a\x5f\x36\x4a\xf3\x6a\x4d\x78\x58\xf6\x2d\x57\x98\x11\x3f\x28\x8b\xa9\x52\x14\x1b\xd3\x37\x4a\x35\x6b\xe7\xeb\xa0\xc7\xdc\xe5\x62\x04\x38\x49\xc0\x0e\x5d\xb1\x8a\xae\x78\x49\xf1\x66\xe4\x70\x7c\xf1\xf1\x01\xaa\xf0\xb2\xa6\x3a\x3e\x9c\xbb\x1e\x46\x85\x70\xd5\x8a\x1e\xc2\x0a\x17\xa5\xc4\x50\xe7\x05\x61\x84\xd6\xda\x02\x78\xd0\xba\x2c\x3e\x2d\xeb\xa2\xd3\x62\x27\xf2\xe2\xf7\x1d\xb4\x0a\x9d\xc3\x8c\x05\x47\x08\xef\xeb\x22\xf8\xb5\x08\x15\x07\x6d\x3a\x83\x01\x5e\xf3\xec\xd8\xee\xd2\xfe\xf7\x49\xb9\x9d\x69\x5c\xc6\xc9\x03\x50\xdf\x56\x9b\x7a\xfb\x72\x03\xc5\xf9\x6a\x8c\xa4\x62\xa8\x0a\x53\x75\xb3\x37\x42\x19\x82\xb4\xf0\xbc\x56\x97\x85\x9c\x4d\x71\x18\x31\xa8\x4a\xad\x31\x2d\x19\xc1\xa8\x0c\x3d\xd7\xfb\x9e\x8b\xb2\xb6\xca\x29\x2f\x15\xd3\xbc\x6e\x43\xa3\x1b\x53\x07\xd5\x97\xa6\x90\x11\xf2\x65\xcb\x51\xdb\xe7\x31\x1f\x39\xe6\x74\x3e\xf5\xb4\x37\xf1\xe9\x3a\x34\x36\xb9\xfe\x32\xfb\xb7\xe0\xed\xc7\xdf\xa6\x17\x89\x3c\xe8\x61\xe1\x8b\x12\x4c\xc1\x4e\xa3\x99\xc2\xc2\x34\x58\xd6\x51\x1a\x0a\x4a\x1b\x5c\xb5\x2b\x57\x0b\xd3\xa2\xc0\x44\x88\xb1\x9a\x11\x86\xc5\x3a\xf2\xf3\xde\x4b\x53\x49\xe1\xb4\xb3\x4d\x63\x84\x93\x14\x3b\xd3\xad\xbd\xf7\xdd\x49\xa1\xbc\xa8\xf3\x1c\x2a\x1d\xaf\x8b\xaf\xb5\xa2\xec\x8f\xf2\xcc\xbb\xcc\xde\x69\x9f\xf2\xb5\xc1\x3e\x3b\xfb\x15\xff\x21\x9e\xf9\xc4\xdc\xd3\xc3\x98\xb2\xa7\x98\xad\xc9\xfe\xf8\x63\xf6\xe2\xf6\x45\x12\x41\x76\xda\xb4\xf1\x29\x09\x25\x48\x80\xe5\x41\x9d\xfd\x7d\x12\xbc\x02\x6e\x5e\xfb\x34\xa7\xd4\x85\xb3\xf6\x97\xb5\x4a\x05\xa6\x30\x79\xd3\x2c\x5b\xbe\x31\x4e\xba\xa3\x3b\xb8\xc7\xd5\xe7\x76\x8a\xb7\x85\xe2\x67\xd0\xc1\x37\x1f\x1e\xd3\x41\x8a\xa6\x84\x69\xf7\xa9\xde\xf7\xbf\x27\x7b\x57\x48\x43\x6c\xe9\x31\x82\xc5\xef\x35\xb0\x38\x4c\xdb\x8a\xf3\xe0\x2a\x0c\xd7\x85\x69\x16\x4c\x5b\x9a\x92\x2d\x99\x27\x9d\x10\x03\xe7\xb1\xb6\x9a\xed\xd4\x01\x5f\x7c\xfa\xe5\xc3\x0d\xfd\x93\x43\xf0\x8d\x5d\x77\x23\x9f\x7f\x71\xd3\x66\xf5\x70\x3a\x71\xa7\x78\xa5\x15\xed\x43\xab\x00\x6f\x83\x42\xde\x63\x0a\xec\x3a\x1c\xb0\x0b\x95\xbf\x3b\x29\x5e\xd6\x15\x4d\xeb\x20\xce\x16\xe4\x97\x65\x68\x5d\x75\x1d\x98\x13\x90\xba\x7b\xba\xa7\xb1\x7e\x23\x01\xdf\x6a\x2f\x56\x89\xbf\x7d\xf9\x3a\x7b\xf7\xe2\x26\xcb\x53\x24\xb5\xa6\x06\xa3\x8a\x12\x6c\x06\xb9\xa8\x33\xb4\x56\x4f\x61\x38\x60\x1b\x72\x7b\x37\x29\x56\xfa\x8a\xa6\x3c\x34\x83\x06\x39\xe0\x1a\xb4\x55\x30\xe0\x9c\x24\xbb\xd4\xed\xba\x23\x3b\xe0\x2f\x30\x47\x62\xee\xed\xf6\xb9\x87\x29\x5c\x27\x0b\x8a\xb0\xdc\xcd\x69\xb5\xce\xf1\xf1\x80\x83\xd1\x5e\x5d\xde\xe2\x9e\x2a\x35\x09\x39\x9a\x5d\x1d\x79\x87\xaf\xf5\xd1\x0f\x7e\xfe\x6b\x10\xa9\x87\x37\x7c\xa5\x17\xb1\x28\x20\x35\xa0\x42\xc8\x70\x06\x2a\x5c\xb6\x15\x02\x74\x1d\x00\xf6\xa1\x64\xc1\x50\x50\xb1\x40\x3c\x60\xeb\x98\x2d\x08\x72\x26\x38\x87\x94\xb8\x91\xb7\xa1\x0f\x33\x75\xb0\x05\xac\x7f\xc8\x39\xb1\x09\x3d\x9a\x83\x4e\xf6\xd1\x23\xae\x27\x5a\x87\x2d\xd9\x6d\xcb\x01\x7f\x68\xf7\x45\x3c\xe8\xfd\x90\x2d\x14\x3b\xcc\xd2\xbe\x45\x1a\x88\x75\x04\xb0\xae\xff\x5f\xd6\xfe\x1e\xd8\x72\x1c\xcb\x0f\xc4\x09\xf2\x7e\x50\xfa\x4b\xd3\xcc\xca\xca\x4a\xb6\x34\x23\xf1\x75\x66\xd6\xc3\x28\x34\x1a\x68\x72\x32\x13\x21\xfd\x5b\x42\xc4\xc6\xc6\x22\x76\x63\x57\x58\x63\x23\x60\xc2\x84\x09\x13\x26\x4c\x98\x30\x61\xd2\xa4\x49\x93\x26\x4d\x9a\x34\x69\xd2\xa4\x79\xcd\x3b\x95\x8f\xb8\x1b\x24\xef\x7d\xef\xe5\x47\x55\x77\xcf\xaa\xba\x6f\xd7\xcb\xd7\x37\x12\x3f\x1c\x1c\x1c\x7c\x9d\xf3\xfb\x85\x9e\x05\xc1\x01\xa7\x81\x96\x00\xce\x43\x3c\x9a\x83\xe6\x8a\x48\xbe\xec\x56\x5c\xc8\x80\x9f\xa5\x0c\x43\xe3\x5c\x1b\xa3\x20\xc1\xc9\x55\xd7\xf3\xf6\xe2\x8f\xbf\xfb\x56\x11\xfd\xe8\x1e\xb4\x37\x16\x8c\x39\x74\xb8\xd8\x9f\xfc\x6c\x43\x14\x24\x03\x1e\x4c\xf1\x40\x10\xa2\xab\x06\x6f\xbc\x83\x11\x5e\xf7\xaf\xcf\xf0\x5f\x15\x8b\x56\x39\xbf\x4d\x27\x7b\xcd\xee\xbe\xaa\x64\xef\x33\x8e\x0d\xe6\x32\xce\x14\xb5\x94\x36\xc1\x7a\xef\x3d\x0a\xa3\x38\x15\x61\x72\x2e\xf8\x83\x96\x96\x18\x15\xce\xbe\xe6\x56\xda\x90\x01\x39\xb7\x24\x0c\xad\xf5\x5d\x1c\x05\x0f\x4e\x51\x92\x8c\x17\x72\xa4\x3b\xb5\xe6\xee\x6f\x6f\xf8\xc7\xc3\xfe\x7e\x7d\xc1\xdf\xde\x73\x9e\x65\x6d\x51\x96\x87\x13\xec\x71\xd0\xc8\xd9\xd6\x2f\x07\x88\x14\x98\x60\x77\xea\x73\x65\x50\x96\x3a\xd9\x5f\xa2\x41\x9c\x01\x89\x7d\x70\xd3\x5c\x4f\x55\xb1\xc4\x3d\x75\xa1\x3b\xba\x6b\xa3\xfd\xfa\x8e\xff\x38\x36\x4b\x40\xf8\xf1\xf8\xd4\xb5\x6d\x74\xde\x7f\xfc\x23\x58\x09\x9d\x14\x45\x16\xd2\x98\x7a\x84\xc7\xa0\xb2\xda\xda\x8e\x05\x4f\x41\xca\xc3\xc9\x95\x59\x60\x31\xa7\xbb\x96\xf2\x65\x47\x87\x0c\xb3\xb5\x51\x80\xcc\x13\x0b\xa5\x70\xe4\x04\xda\xd0\x49\x5b\xdb\x65\x8d\x6f\x62\x7c\xc4\x57\x3e\xfe\xbf\xfe\x7e\x9e\xc2\xad\x2c\xf5\xd5\x11\x0b\x81\x45\x21\x30\x09\x1c\x96\xaa\x71\xc0\x07\xb9\x52\x0f\xc3\x87\x5e\x88\xcc\x66\x42\xb5\x56\x97\x40\x02\x11\x4e\x26\x18\xb3\xe6\xaa\x44\x26\xce\x76\xc5\xc1\x46\xfb\x35\x2f\xe0\x79\x1f\xff\x06\x7c\x67\xf4\x96\x0e\x7a\x02\x2d\xc4\xe0\xbc\x76\x70\x59\xf0\x1b\x14\x7a\xd2\xe3\xa5\x7b\x41\xc5\x05\x39\x58\x26\xb0\xa0\x18\x6a\xae\x4f\x14\x44\x81\xe2\x70\x26\x16\x7a\x60\x2e\x11\xc0\x5a\x2f\xed\x5e\xc8\x51\xef\x86\xe8\xf7\x4b\x94\x78\x5a\x53\xe2\x27\x71\xb5\x77\x6f\xdf\xbd\xbc\x6a\xab\xbd\x34\x71\xc1\x49\x4d\xe8\x2e\x0f\x9a\xd4\x00\x81\x5c\x4d\xc1\x86\x66\xee\x18\x38\x83\xe2\x12\x85\xa1\x09\x28\x76\x94\x9d\xa7\x8a\x24\xa6\xae\xb2\xda\x97\x8b\xcb\xb8\xd2\x57\x13\x2f\x69\x25\x15\xc0\x56\x72\x51\x82\x74\xe3\x9b\xa0\x47\x17\x37\xd1\xbb\x28\x7a\xb7\xad\x5e\x4f\xb4\x08\x3f\x3d\x3e\x3d\xbf\x05\x8f\xa9\x3a\x31\xaa\x46\x02\xfa\xd3\x2c\x13\x9c\x17\x1e\x15\xf1\xf9\xe1\xc4\x8d\xe1\x4e\xe9\x1a\x40\x38\x97\xa1\x17\x55\xed\xe0\xd4\x33\x4f\x90\xe3\xde\xa1\x02\x61\xea\xac\xe0\x82\x29\x2a\x73\x97\xc7\x29\xe3\x27\x88\x0c\x45\x6c\x99\x3b\x32\x96\xeb\xdc\xb9\x2a\x70\x6e\x59\xa6\xcf\x73\xbe\x5f\xdc\x6d\xf4\x88\x3b\x19\x47\xae\xaa\xb8\xd6\xaa\xd0\x1a\xc1\x10\x0d\x9c\x38\xcc\xf7\x75\xd7\xd9\x10\x29\xb6\xa6\x75\x83\x81\x59\x4f\x4a\xbd\xd6\x60\xcb\x98\xef\xd4\x81\x5e\xdf\x8c\x6e\xb7\xfe\x6b\xbe\xfb\xef\xc1\xdd\x8b\xfb\xbb\x57\x77\xfb\xeb\x36\xe2\xd5\x73\xb7\xda\x3f\xba\xc0\xfd\x47\x20\x94\x95\x09\x73\x73\x1f\xa3\x80\x63\x36\xd7\x24\x1e\xc2\x48\x15\x42\x39\xc1\x30\x0c\x31\xe7\x58\x23\x16\x94\xa4\x82\xf1\x7d\x5e\x87\x61\x60\x03\x28\x80\x0f\x7d\x43\x1a\x49\x54\x2b\x68\x6a\x52\x52\xe5\x4c\x12\xc1\x11\x31\x54\xac\xf9\x11\xbb\x3c\xe6\x47\x77\xa0\xd1\x0f\x6b\x05\xef\xab\x1f\xff\x2b\x78\xb5\xd1\xd8\xbd\xfa\xf1\x78\xff\xf1\x8f\x20\x79\x24\x7a\x5d\xf7\x3c\x37\xbe\x93\x43\x47\x6c\xcd\x79\x38\x59\xa3\x49\x7c\xa6\x52\x6b\x6d\x5c\xd9\x13\xab\xb4\xe1\x75\xc5\xf1\xdc\x1e\x68\x47\x0d\xa3\x3a\x2b\x2d\xe7\xda\x05\x2c\x2d\x47\x58\x53\xcc\xa1\x2d\x0a\x04\x15\x22\x98\x6d\x18\xe0\x15\x03\xfc\x75\x0c\x7f\x0a\x02\xd3\x67\x65\x5d\xd9\x52\xab\xb4\xe6\xb5\x97\x64\x6e\xbe\x45\x50\x0a\x65\x18\xe1\xd0\xe5\x10\x22\x85\x09\x15\xd1\x2e\x92\xb1\x48\x96\x3d\xfc\x5f\x3f\xdd\xa0\x2d\x4b\xf0\xd7\xb3\xfc\xd3\x9b\x0f\xef\xaf\x4f\x7d\xaf\x9f\xa5\xc9\xc4\x59\x99\x15\x00\x71\x4e\x44\x21\x31\x0e\x26\xb7\xce\x64\xda\x0c\x48\x2e\x11\xae\xc1\x50\x17\x58\x20\xa8\x0b\x74\xb0\x08\xc2\x19\x6e\x61\xa0\x3c\x55\xbc\xb1\x16\x58\x19\xb2\x73\x4e\x18\xa6\x34\x34\x84\x62\x4a\x96\xbd\x14\x8d\xed\xca\xf9\xfb\xc3\x8a\xea\xef\xb6\x5b\xbd\xec\xb8\x5e\x95\x17\x3f\x6f\xc4\x65\xaf\xef\x5e\x2c\xee\xf9\xe2\xee\xb0\xb8\xd0\x7e\x85\x7b\xf7\xea\xc7\x9f\xee\xfe\xe1\xe3\x0e\xf9\x22\xae\xb1\xce\x09\x0a\x65\x70\x2a\xcb\x85\xc7\x71\x8a\x8b\xa2\x98\xab\x02\xb0\x30\x00\x08\x24\x62\x90\x64\x41\x52\x10\x9d\xe8\xc1\x40\x19\x72\x8e\x4a\x04\x89\x04\x26\xcf\x94\x77\xe1\x9c\x4a\x90\xe3\x4a\xf9\x22\x25\x12\x66\x70\x7b\x53\xe3\xb1\x4b\xd0\xe1\x37\xf3\xb6\x1e\xcb\xf4\x11\xe3\x44\x40\x49\x70\x68\x73\x69\xad\x5b\x6f\x8e\x50\xe8\x0f\x74\xce\xb6\x44\x5d\x56\x39\x36\x80\x68\x89\x49\x3a\x38\x7d\x8d\x09\x65\x92\xae\xbc\xdd\x4f\xc1\xe0\xdf\x83\xe7\xd1\x60\x4d\x3d\x3f\xde\x6f\x9c\x63\x77\x26\x21\x59\x5e\x16\x79\x7c\x9e\x23\xba\x9c\x9c\x4a\x6b\x1b\x10\xa9\xb9\x0a\xa3\xb4\x43\x53\x84\xd3\x89\xfb\x8e\x83\x72\x98\xcb\xd8\xac\xaf\xcd\x4e\x60\xce\x85\x90\x54\x71\x77\x02\x25\x67\xa1\xc1\xd8\x70\xc2\x00\x65\xc4\x6b\xb7\xdd\xf1\xb6\x49\x76\x54\x07\xfb\x58\x61\xf4\xfe\xf6\x8a\xfe\x94\x3c\xf6\xee\xf9\xc4\xdd\xed\x6f\x2e\xfa\xe9\xc3\x5d\x9b\xa4\xe5\x99\x54\x18\x02\xfa\x70\x9e\x0c\x73\x5c\xd4\x4e\x86\x21\xb4\xdc\x61\x94\x13\x42\x43\x1b\x34\xe9\x1a\x21\x94\x51\xd3\xc3\x79\x3f\x96\xa5\xc2\x8c\x5b\xc7\x84\xe0\x82\x52\x6e\x6a\x25\x25\xcf\x7c\x46\x54\xed\x3c\xa5\x94\x48\x2a\xd4\xca\x7b\xb1\xeb\xe3\xfe\x98\x5f\x35\xa8\x23\xf0\x3c\xa1\x02\xbc\x7f\xf1\xe6\x60\x3c\xdf\xc4\x9c\x59\x60\xde\x1f\xf4\x9c\x49\x96\xb9\x8c\xc6\x64\x6e\x57\xbe\x03\x15\xf3\xa3\x3f\xe0\x55\xcf\x76\x89\x4b\xcb\xf9\xf5\x49\x28\xe7\x1b\x0d\xa1\xfd\x2a\x1f\xb4\xbf\xfb\xf8\xe1\xee\xa7\xd7\xfb\xe5\xd8\x71\xf7\x6e\xfd\xd5\xa1\x49\xa7\x53\x9a\x75\x43\x36\x72\x9f\x57\x82\x64\x9f\x11\xcc\xc7\x53\x9e\x82\x21\xb4\x59\x2c\x4c\x0d\x2c\x60\xe9\x5c\x57\x06\xe4\x73\xef\x35\x02\x64\x66\xa1\x2e\x62\x67\x9b\x03\x2e\xbd\x15\xdc\x4c\xcb\xa4\x70\x95\xf5\xa5\x69\x08\x52\x4b\x94\xea\x11\xa1\x4d\x43\xd1\xb5\xce\xd0\x25\xd1\xb2\x3a\x3e\xae\x13\xdf\x2e\x13\xc9\xa3\x63\xc4\x45\xd9\x2a\x50\x9f\xe7\x32\x1e\x91\x43\x45\x42\x1e\xce\xd4\xd5\xd2\x1a\xdf\x82\x8c\xcf\xa4\x15\xb6\x6f\x60\x38\x9d\xb9\x17\xd4\x96\xbd\x67\x88\x10\x6f\xb5\xd4\xc2\x70\xc1\x7c\x0f\x3a\x25\xc3\x84\x89\x11\x84\xdd\xb8\x91\x36\x0c\xff\x9c\xb5\x8a\x14\xd8\x53\x18\x9f\xfe\xd4\x5a\xc5\x28\x12\xf2\x57\xd7\xaa\x24\x2a\x57\xbe\x35\x73\xcb\x2b\xdf\xce\x45\x5f\xe9\xc4\x7c\x7c\x79\xdd\x75\xbf\xb8\x2b\x41\xe1\x41\x25\x2c\xa6\x05\xc7\x38\x4f\xc3\xb9\x08\x83\x3a\x17\x61\x4a\x4e\xb1\x5d\x65\x80\x42\xb5\xef\x9a\x26\xa0\x26\xb7\xb9\x04\x59\x30\x4e\x5a\x50\xd8\xb9\xb6\xb7\xba\x24\x7c\xa1\xc7\x66\xd5\x88\x59\x2b\x49\xa3\x97\xcf\xfa\x7d\x4d\x0f\xdb\xb2\x9e\xde\x1c\x6e\x79\x4f\xbb\x02\x13\x05\x52\x1d\x6a\xd0\x41\x56\x71\x04\x7c\x30\x19\xd2\x5c\x69\xcf\xce\x6a\x18\x61\x86\x85\x33\xb0\x6f\x58\x8c\x18\x31\x20\x07\xca\x79\x8d\x5c\xed\xc2\xd4\x49\x6f\x2b\x15\xa6\x30\xb8\x73\xcc\xe2\xb4\x6d\x1e\x4e\x94\x1a\xc7\xb7\x71\x88\xed\x7a\x87\xf5\xdb\x78\x5e\x1f\xff\x25\x78\x86\x27\xa9\xb8\x90\x80\x94\xc1\xc5\x11\xc4\x15\x85\xa0\x0b\xb8\xc0\x56\x6a\xd3\xd8\x51\x9f\x26\x9c\x52\xd3\x38\x74\x1a\x58\x4c\x04\x5b\xf0\x18\xef\x14\x76\x95\x0f\x53\x2f\x4b\x57\xe9\xd0\x4e\x1e\x44\x31\x89\xb3\xae\x9b\x23\xca\xac\xdd\xf0\xec\x22\xba\x72\xf5\xc8\xe8\x5f\x44\xbf\x8b\x5e\x6d\xbc\xb9\x8f\xcc\x56\xcf\x96\xf1\x97\xcf\xca\xc6\x6f\x0f\x33\x02\xa0\x02\x39\xb2\x04\x88\x31\xe6\x8e\x3b\x66\xc3\x64\xa5\x93\x96\x49\x89\xa1\xc3\x64\xcd\xbc\xb4\x97\x88\x9e\x94\xd6\x7b\xae\x25\x32\xce\xc1\xb2\x61\x75\x45\xf9\xc9\xe9\x2a\x9c\xb9\x30\x9e\x36\xce\x7a\x6b\xf5\xb9\x75\xcd\xc9\xae\xdc\x4d\x11\xbf\x90\xf8\x74\xd0\xd7\xdc\x87\xff\xf4\xad\x3e\xf3\xf6\xac\x71\x4d\xfa\xdd\x56\xb3\xbb\x6b\xbe\xc8\xab\xe3\x3f\xde\x83\x9c\x52\x8c\x5d\xdd\x39\x9d\x6f\xea\xda\xfd\x19\x5a\x2d\x65\x61\xb9\x17\x67\x54\xd8\x1c\x85\xf2\xaa\xac\x5d\x98\x6c\x87\xd3\xcc\x78\x14\x70\x38\x43\x4c\x31\x2e\x7b\xac\x04\x36\x15\x88\x8a\xdc\x8e\x40\xa1\x50\x3d\x38\x5b\xa2\xca\x16\xe1\x34\x91\xd3\xd0\x4f\xd9\x79\xe3\x59\x8e\xab\x8b\xd9\xe7\x87\xfc\x6a\xc3\x95\xc7\xe7\x26\x46\xbe\x15\xd5\xbf\xbb\xe6\xa4\x3e\x15\xe4\x6f\x1b\x81\xb8\x5b\xce\x46\x28\xef\xe6\xd6\x18\x2a\xb4\x04\x42\x10\x8d\xb9\x34\x08\x3b\xa1\x4d\xc7\x7a\xa9\xb5\x90\x12\xee\xd9\x3a\xb9\x2c\x81\xbd\x23\x95\x37\x9e\x7a\x1b\x2a\x54\xd9\x56\x97\xa3\xd3\x65\x6f\x95\xe0\x4a\x3d\x71\xf9\x55\xcf\xc7\xf4\x29\x5f\xfa\x39\x89\xc3\xbf\x07\x4f\xe4\x51\x37\x36\xb8\x3d\x23\x10\x74\x9f\x7b\xd0\x14\x88\x1b\x3f\xc8\x31\x96\x8d\x57\x65\xcd\x9c\x74\xd3\x59\x84\xd3\xd8\x85\x8a\x03\x56\x7b\x65\xa4\xb3\x07\xa9\x8d\xf7\x52\x04\xc6\x46\xab\xbd\x53\xa5\xad\xf5\x24\xce\x75\xcf\x2b\xd3\x77\xd6\xb9\xba\x19\xc5\x50\x35\x0b\x2e\xf6\x27\x70\xbd\x7d\xc2\xb5\xfb\x8a\xa5\x6e\x77\x66\x28\x8e\x3e\x93\x38\x83\x84\xe9\xfa\xa4\x40\x1a\xfb\xa1\x56\x4d\x2f\xbd\xae\x40\x0a\x72\x11\xba\xf3\x29\x18\x0e\xd4\x50\x1b\xa3\xab\xea\x20\x95\x5d\xa1\x09\x3e\x59\xed\x4b\x5d\xd9\x46\x9f\xae\xd0\x86\xde\x3a\xdb\x34\xa3\x18\x17\x68\xd1\x6e\x3d\x4b\xf8\x9d\xbf\x62\xfb\x0f\x5f\x61\xdb\x5f\xb1\xbd\xbb\x61\x7b\xb7\x5f\x8f\x17\x1b\xb8\x64\xc4\x30\xc9\xff\x89\xc7\x43\x01\x6b\xdd\xad\x19\xb5\x49\x3d\x4d\xba\x0f\x27\xe3\x6d\x07\x24\x30\x22\xe4\xa1\x0b\xe7\x70\x0e\x1d\x03\x2d\x80\x9d\x37\xe5\xd8\xef\x3c\xe3\xde\x13\x1c\x06\xd1\x6b\x27\x1a\x5d\x9a\xd2\x7b\xdc\x7a\x4f\x4a\x55\x69\x41\x4a\x66\x97\x1d\x81\x32\x0b\x46\x71\x21\x47\xbb\xe3\xdf\x9d\xab\xdf\xc3\xf8\x08\x71\xff\xd1\x27\x30\x87\x25\xce\xe3\xd3\x3f\xe1\x38\x53\x63\x68\x18\x28\x92\x76\x9a\x74\x17\x4e\xd6\xb9\x01\x48\xa0\x78\xc8\x42\x17\x7c\x48\x29\x68\x01\x1e\x2b\xdd\x80\xe8\x94\x94\x94\x42\x2e\x6c\xce\x1b\x61\x99\x95\xd6\x38\xeb\x71\x6d\x0d\xf6\xd2\x95\xdc\x13\xad\xad\x28\xb5\xde\x62\xc9\x0e\xae\x39\xfa\xdf\xe0\x7b\x3e\x0f\xc0\xf3\x58\x12\x6f\x63\x2c\x81\x85\xa4\x62\x10\xb0\x07\x75\x32\xba\x96\x75\x4c\x9c\x70\xdc\x05\x63\x0d\xc5\x8e\xd2\xd2\x29\x6b\xcb\xd0\x53\x90\x39\xe7\xf6\xdc\x48\x6c\x4a\x87\xd6\x30\xd2\xd4\x2d\x6f\xeb\xe0\x85\xb2\x15\x6d\xbd\xaf\x6d\xe5\x2f\x51\xeb\xea\x93\x55\xd1\x6e\xd5\x09\x73\xcf\x71\x81\xef\xc6\xb8\xd7\x5f\xc5\xb8\x05\x57\x52\x81\x12\x22\x47\x21\xd0\x0f\x24\x6e\xbc\xd5\xa6\x0a\xb5\x31\x95\x6a\x2c\xd7\x9a\x58\xae\xbb\x5e\x8c\x6d\x15\x26\x01\xf2\xd2\xca\xbd\xda\xf8\x6d\xb9\x6d\x74\x5d\x73\x7e\xb2\xba\x6c\x86\xaa\xee\xf9\xe6\x78\x5d\x6b\xbd\xad\x9b\x31\x8a\x62\x70\xbe\xf4\x87\x7c\x9f\x47\xff\x66\x8d\x19\x1f\xff\x3b\x78\xbd\x5a\xe3\x56\xc6\xff\xc8\xb0\xb7\x7f\x0e\x2a\x81\x9d\x17\xf6\x34\x8f\x1c\xd0\xba\xeb\x0b\x27\x43\x03\xfa\x02\x79\x5c\x80\x7a\x1e\x18\xe8\xbd\xb2\x5a\x29\x65\xfb\xe0\x79\xac\xe2\x53\x9a\x5b\x1c\x78\x6d\xa4\xcf\x33\x23\x9c\x65\x04\x71\x69\x4d\x83\x2b\xc3\xa5\xb5\xc2\x2b\x7b\xe3\x64\xa4\xbb\x62\xe5\xcb\x83\x8f\xf1\xf6\xbb\x80\xc0\x33\x40\x11\x60\xa5\xc1\xd0\x77\x21\xe7\xa0\xa8\x9a\x36\xb7\xfc\x12\x01\x5b\xc0\x12\x17\x40\x85\x94\x01\xe3\x85\x92\x42\x71\xd1\x85\x5a\xc4\x28\x51\x69\xae\x0c\x9e\xeb\xb3\xae\xce\x28\xb3\x7e\x72\x5a\x22\xed\xdd\x10\xce\x78\x2c\xb9\xb0\x8a\x4f\xa5\x5d\xce\xd8\x1b\x26\xf7\x97\x63\x12\x9d\x27\xc8\x9f\xe6\x91\x01\xda\xf4\x43\xe1\x55\x18\x40\x0b\x51\x49\x20\x28\xe7\x4e\x82\xde\x4b\x6b\xa4\x54\xba\x0f\x5a\xc4\x3a\x51\x69\x21\x6f\x98\x60\xfe\x84\x69\xbc\x44\x37\x4c\x63\xb5\x61\x8a\xd5\xf5\x1d\x6a\xc3\xf4\x76\xab\x62\xbf\x7f\xfb\x69\x63\x02\xfd\x62\xe0\xae\xb4\xc8\xbb\xfd\x7d\x94\x94\x20\x6b\x29\x29\xc3\x30\x4b\x0e\xdc\xe9\x12\x85\xa9\x68\x6d\xf0\x31\xc4\xb4\x14\x38\x8e\x66\xaa\x63\x55\xba\x61\x6c\x75\x37\x86\x21\x08\x9a\xe4\x89\xcc\x0a\x69\xc8\xdc\x9c\x8d\x3f\xc3\xcc\xfa\xd1\x6b\x81\x8d\xf3\x43\x87\xc3\xa9\x73\x8d\xe9\xfc\xe8\x2d\x28\xa2\x38\x5e\xf9\x2c\x76\xa7\x2b\xae\x47\x76\xc6\x1b\xbc\x27\x93\x3d\xb7\xd5\xdb\xdd\x48\x70\x5c\xcc\xd8\x9a\x6a\xa0\xc4\x85\xf3\x5c\x73\x20\xca\x6e\xc8\xab\x65\x0b\x74\x86\x30\x66\xde\xb7\x63\xab\xfb\xe9\x1c\xb8\x48\xd2\xdd\x89\x0a\xd7\xa8\xb4\x60\x12\x07\xd4\x19\xed\x8a\xcc\xfa\xd2\x61\x34\x8f\x78\x2c\x95\x73\x95\xa9\x8c\x5d\x7c\x3c\x6a\x2f\x68\x3f\x24\xe2\x2f\xc0\xb4\x3e\x0d\x73\x54\x80\x7e\xd6\x84\xf6\x1e\x63\x1e\x9a\xb9\xa1\x40\x8f\x55\x9d\x0b\x12\x5c\x8c\xf3\x22\x2e\x84\xd4\x4d\xa5\x9a\x3e\xf4\xc1\xd0\xb8\x4b\x04\x21\x5a\xe2\x34\x47\x58\x2e\x91\x80\x9b\x3c\x33\x44\x6a\x04\x03\x96\x92\x11\x66\x15\xf7\x58\x9b\x28\x8e\xf4\x05\x1f\xed\xbe\x88\xfe\xfa\x29\xce\x1f\x8e\x6f\xdf\x2d\x93\x7f\x01\xf5\xee\x69\x1c\xbf\x00\x15\xed\x52\x02\x93\xfc\xf3\xd9\x5b\x40\x00\xe1\x54\x4f\xf3\x29\x20\x16\x23\x10\x85\x2e\xf4\xa8\x74\x73\x9f\xb0\x02\x27\xc8\xd4\xdd\xb9\xb5\xed\x39\xa8\xd9\xb1\x98\xc4\x6e\x5f\x08\xe9\xbd\xc8\x72\x4a\xc5\x39\x4c\xca\x9b\x0a\x66\x5e\x39\xcf\xe8\xdc\xa8\xc6\xba\xd2\xb6\xe5\xe0\xbc\x01\xdb\x9d\x28\x98\x2e\xf4\x10\x25\xc3\x77\xec\x16\xff\xc6\x58\x26\x27\x02\x41\x35\xf7\xdc\x94\x9a\x61\x33\x86\x8c\x83\xcc\xfa\x3a\xf7\x32\x8c\xa0\x2e\x20\x98\xac\xd4\x56\x0b\xe3\xa7\x50\xf2\x58\x27\x03\xe5\xc6\x8b\x34\x63\x02\x05\xed\x15\x97\x79\xaa\xc4\x32\xa1\x03\x45\x5e\x72\xa5\xb4\x28\xa5\xa9\x1e\xb9\x0a\xcb\x3f\x67\x2e\x3e\xfa\xfd\x32\x17\x77\xb2\x75\x04\xf9\x69\x9e\x38\xc0\x6d\x37\x14\x5e\x86\x09\xd4\xb7\xb9\xd8\x0b\x30\x94\xaa\xaa\xbd\xf6\xd5\x18\x7a\x1a\xf3\x2d\x3e\x90\xb9\x3e\xfd\x9a\xcb\xb7\x7e\xb0\x66\xab\x31\x76\xf1\x79\xe5\x70\x79\xb5\xa2\x8a\xff\x33\xda\x6c\xf5\xfa\xb0\x7b\x8e\xec\xfe\xe5\xa6\x11\xfd\x85\xdf\xe7\x45\x9e\xa0\xb9\xe6\xc3\x7c\x0e\x90\x00\x36\xb5\x5d\x7e\x6e\xe6\x36\xc9\x90\x71\x3a\x54\xa6\xdd\xe5\x4a\x9b\xae\x54\xf5\x30\x04\x42\xe2\xfa\x60\x09\xd1\xac\xee\xb9\xc1\x2c\x4b\x35\xd5\x9a\x05\xc7\x96\x93\xb8\x90\x54\x08\xa5\xa5\x64\xda\xac\xb6\xe2\x5f\xc4\x88\xff\x99\xb6\xd2\x55\x5d\x6a\x5f\x9f\x42\x4d\xd7\xb8\xf5\x1b\xb6\x6a\x5d\xfb\x18\x1e\x22\x10\xf1\x0b\x5b\x79\x5f\xff\xf1\x19\x8f\xcc\x86\xe7\xd5\x5a\xd1\xf4\xe3\x4f\xb7\xd4\xe2\xe2\xfe\x0f\x3f\xff\x11\x5c\xb3\xf1\x5f\x64\xc9\xfd\xc7\x1f\x7e\x0f\xee\x12\xe7\x13\xf4\xd0\x27\x08\x12\x5d\xe4\xb3\x06\xc5\x98\x9d\xc3\x84\x3a\x40\x64\x6e\x0b\x1f\xd4\x25\xca\x30\xe9\xfa\x7c\xec\x43\xd6\x3a\xc1\x62\x7b\x30\x54\x53\xcd\x18\x85\x50\x16\x85\x86\x45\x91\xe5\x9c\x28\x94\x12\x9c\xe7\x99\xce\x72\x3d\x37\x21\x0f\x96\x0f\x80\x2f\x7b\xba\x2d\x37\x0d\xaf\x39\xd9\xff\xf9\x5b\x9c\xef\x5e\xef\x5f\x2d\x30\x3f\xdd\x70\xfe\xfc\x47\xb0\xff\xf0\xee\x06\xf2\xc3\x8b\xbb\x44\xfa\xb8\x9c\x45\x62\x31\x37\x18\xce\x45\x8c\xb3\xb9\x41\x3d\x20\x14\xe6\xbe\xb0\x81\x86\x1e\x91\x95\x31\x00\xd7\x0b\x42\x79\xd0\x5c\x4b\xad\x14\x23\x54\x23\x0b\x71\x91\x65\x29\x23\x0a\x67\x85\xa4\x85\xcd\xcd\xdc\x06\x18\x1c\x1f\x01\x3f\xc5\x6b\x5e\x12\x68\x2f\xe8\xe8\x63\x79\xbd\x51\x7f\xe2\x84\xfe\xe9\x99\xbe\xc8\x9b\x35\x67\x2d\x8e\x62\x8e\x1c\xca\x63\x71\x89\x68\x3d\x01\x4a\x82\x0c\x63\x38\x07\xcd\x00\x19\x6b\x53\xc7\x65\xcb\x97\xd3\xea\xc8\x11\xa1\xce\x2b\x0c\x2b\xa8\x25\x2d\x11\x95\x65\xc7\xb6\x7a\x6c\xa0\x2f\xe4\xa8\x13\xb8\xbe\x4f\xfd\xfb\xa7\xd7\xa9\xe4\x7a\xf7\xba\x36\x7b\xb8\x29\x77\x7c\xba\x8b\xf1\xce\x7c\x36\x2e\x11\x0f\x65\xbd\xeb\xe7\x31\x8b\xdb\xd9\xf5\xc0\xc2\x80\x2f\x51\xbd\x2c\xc8\x75\x39\x0f\xb1\xc9\xd2\x79\x4c\x60\x68\xa5\x0a\x83\x62\xda\xa4\x3e\x3d\x8f\x85\xcd\xac\x86\x30\x8a\xa2\x3d\x70\x17\x72\xa4\x09\x7e\x64\x49\xfc\xbb\xad\xed\xe7\x4f\xc6\x1f\xee\xd6\x86\x3f\x6c\x2d\x7f\xcd\x95\x18\xe3\x5d\x3b\x8f\x45\xec\x32\x21\xea\xbe\x98\xca\xa2\x98\xfb\x2a\xe4\x0c\x68\x1f\x70\x8c\x8b\x6c\x3e\x3b\x60\x83\x8e\x73\x60\x1f\xc4\xed\xa7\x04\x87\x8c\x87\x93\xcb\x4c\x8a\xd4\xc4\x2c\x56\xa9\x86\x08\x20\xc6\x58\x38\x33\xc6\xa2\x68\x07\xca\x8b\x38\x96\xb1\xb9\xd6\x54\x6c\xd5\x2e\x6f\xc1\xeb\x68\xff\xd3\x53\x7a\xfc\x76\xd4\x7a\xf9\x6c\x8b\x77\xcd\x8f\x47\x0e\x60\x90\xe9\x30\x05\x55\x08\x80\x78\xe6\x72\x1b\x74\x2d\xb2\xb2\xa6\x63\x7d\x36\x42\x08\x15\x8c\xa7\xdc\xc9\x9d\xb7\xdc\x31\x03\xc6\xd0\x59\xc0\x44\x28\xeb\x9c\x28\x58\x4b\x48\x08\x32\x84\xc6\x19\xa6\x8a\xa1\x14\x9d\x4b\xd6\xa2\x6a\xd9\x86\xde\xee\x5b\xc8\x91\x1f\x64\xf4\xaf\x9e\xaa\xac\xfe\x0d\xf8\x3d\x78\x7b\x38\x8b\xd9\x3f\xf4\xa3\x96\x2c\x11\x07\xe9\x44\x36\x0f\xf3\x10\xa0\x02\x11\xb0\x20\x8d\x9b\xad\xd6\x12\x98\x0b\x3d\xea\x3d\x8b\xfe\x2e\xfa\x5f\x57\xab\xdf\x2e\xdd\x9f\xcd\x87\xa7\xe9\xf0\x58\xdf\xf3\x47\x70\xbc\xff\x04\x6e\x2c\x41\x5f\xa5\x04\xef\xa2\xd0\x8f\xaa\x01\xdd\x9a\x95\x1c\x7b\x44\x0c\x09\x29\x30\x59\x50\xb4\x1c\x70\xe6\x0b\x19\xfa\x4b\xa4\xc7\xfc\x0c\x74\x68\x33\x53\x8b\x52\xc6\xb2\x20\x14\xa6\x3e\x95\xb5\xa7\x89\x0f\x2a\xa0\x93\xe9\x41\x07\x3a\x00\xa9\x11\x56\x0a\xaa\x0d\x34\xa8\x28\x72\x48\x91\xa1\x84\xd1\xc2\x14\x73\xdf\x54\x85\x29\xdc\x10\x06\x58\x50\x0f\x3b\x43\x37\x9e\x79\x50\x5d\xe4\xd1\x81\x21\xda\xaf\x59\x3c\x7f\xb8\xbd\x17\xed\xdf\x7f\x95\x4f\x0d\x9e\x8d\xda\xae\xe1\xc8\x41\x76\x89\x3c\x65\x27\x96\xf9\x9c\x91\xd0\xf6\x22\xe1\x5e\x5a\x5e\x3e\x70\xcb\x94\x35\x60\x30\x1e\x95\x26\x0f\xbe\x28\x98\x83\x03\x46\x84\x03\x57\x77\xac\xab\x29\x3a\xd7\xb4\xdb\xc6\x65\x99\x4b\xcb\x7a\xf1\xf7\xcb\xb8\x6c\xc6\xfb\x6f\xe0\xea\x2f\x7f\x04\x6b\x01\xcc\xed\x11\xf3\xc5\x57\xb1\x67\x3f\x65\x21\x23\x76\x90\x30\x75\x99\x0d\x7e\xd2\xa1\xc9\x81\x08\xa2\xf5\x4d\x8c\xca\xf8\x3c\xa7\x89\xc1\xc2\x62\x38\xd3\x64\x34\x50\x14\x59\x46\x2d\xec\x15\xa1\xb6\x30\x45\x3b\x4f\x01\x87\x65\x6f\x05\xca\x58\x02\x6b\x9d\xb2\x7a\x89\x8c\x75\x14\x01\x30\x5e\xec\xd1\xc6\x64\x7d\x47\x7d\xd4\x7a\xdc\xf2\xab\xc0\xa8\x76\xd5\xe7\xf3\xce\x7f\x96\xbb\xe2\x33\x51\x00\x82\xdc\x3a\x67\xed\x4a\x11\xf6\xdd\x3e\xdd\xe2\xe3\x9f\xdb\x27\x90\xa1\xa5\x53\x26\xb8\xef\x77\x8a\x3b\x04\x67\xb6\xcb\x6c\x8e\xf3\x3c\xcf\x14\xf2\x8c\x50\x9e\xdb\xcc\x7e\xa7\x53\x52\x32\x4c\x4c\x04\xd6\xfa\xd5\x3c\x46\x1b\x2f\xda\xf6\x3a\x17\x7f\xad\x3e\x7d\x17\x13\x50\x67\x69\x99\x66\xb1\x45\xca\x29\x9d\xdb\xb5\x50\x3e\xd7\x01\x13\xa0\x45\xd0\xa0\x24\x2c\xa3\x38\x98\x21\x73\x99\x18\x83\xe1\x9e\x4f\xff\x93\xc6\xb2\x57\x7f\xc6\x58\x2e\xdd\xe6\x45\x9e\x61\x01\x4b\x41\xa8\xf9\x95\x6e\xaf\x63\x69\x56\x3d\x87\x35\x36\x45\x6b\x5d\xf2\xbf\x5d\xb3\x80\x36\x1f\xdf\x5c\xfa\x46\x30\x7e\x75\xf4\x64\xab\x63\x74\x0c\x39\xc8\x41\xe3\xb8\xe5\x36\x44\x25\x29\x49\xe6\x33\x8c\xc2\xc9\xd3\xd6\x52\xe1\x75\x1c\x69\x8f\xbc\xc9\x9a\x9e\xf5\x0d\x0d\x86\x22\x0b\x6b\x82\xa9\x04\x25\x0a\x43\xcf\x4e\x8b\x4d\x80\xb9\x90\xf5\xce\xff\x99\x4d\x9e\x5c\xe1\x78\xff\xe9\xd9\x4a\xf9\xb5\x4d\x0e\x51\x16\x0c\xa3\x13\x49\x5d\xa6\x43\xd7\xca\x3a\xef\x2e\xd1\xc9\x59\x01\x9a\x32\x4e\xe7\x73\x5c\x6f\x16\x19\x77\x99\x45\x34\x2f\x90\x86\x95\x20\x4c\x64\x36\x2f\xe7\x29\x90\x50\xf1\x1e\xd0\x31\x56\x9b\x41\x94\x62\x94\xb8\x28\x89\xe1\x05\xaf\xe3\xf4\x3a\xfa\xfb\xe8\x7f\xff\x66\x4d\x7f\xc4\xf3\x88\xf7\xc3\x73\xbc\xef\x5f\x25\xef\x7f\x7c\xe6\x38\x9f\x1e\xb5\xdd\x3f\xdc\x7d\xdc\xb9\xad\x7c\x80\x21\xa6\x71\xf1\xd0\x9d\xad\x95\x40\x83\x21\x0b\x2d\x64\x35\x76\xa9\x0c\xe7\x4a\x74\xd9\xe0\x98\x4b\x41\x97\x2a\xcb\x45\x2e\x04\xce\xf2\x2c\x74\x24\x58\x06\x10\xbd\x44\x20\x4b\x0f\xd6\x58\xaf\x8c\xa6\x8c\xcf\xa7\xc0\x42\xc5\x7a\x80\xc7\x98\x87\xb3\x2e\x70\x91\x41\x06\xed\xe2\xf1\x99\xce\x8d\x0e\x8a\xe0\xc0\xfb\xdc\xe7\x88\x4e\x01\x21\x5b\x00\x6e\x70\x14\xc7\xf0\xc2\x1f\xfb\xf9\x17\xf7\xf2\xcf\xef\xca\x5f\x82\x75\xdd\x8b\x56\xeb\x5e\xd4\x46\xff\x7a\x5d\x27\xbf\x64\x92\x5f\x7f\x7c\x75\xf7\xe2\xa7\xff\x0a\x8e\x6f\x8a\xb7\xf7\x4f\xda\xb2\x2f\xee\x8e\xda\xcd\xa5\x03\x6a\xbd\xe5\x0d\x22\xf6\x6b\x96\xb2\x74\x1e\xc9\x4b\x14\x4e\x02\x53\x55\x42\x97\x21\xaa\xc2\x79\x3f\x84\xba\xeb\x00\xa3\x04\x32\x11\xa4\x0d\xce\x05\x9d\x7b\xe3\x1b\xaf\x80\x00\x27\x38\x76\x86\x25\x2c\xda\xee\xb1\x68\xd2\xae\xef\x00\x30\xfa\x8f\x11\xfa\x96\xed\xe9\x56\x84\xf8\xab\x0c\xda\x0a\x88\x2d\x3d\xb9\x08\x23\xe0\x0f\xe5\x95\xff\xa9\x4c\x32\x21\x30\x2d\x24\x46\x37\x12\xfb\xe5\x73\xc8\xa5\xb4\xca\x48\x6b\xa5\x51\x73\xfd\xd0\x0a\x9e\xb9\x8c\x9a\x50\x27\xa7\x70\xb2\x41\xd9\x5b\x0e\x98\x5c\x39\x33\xff\xe6\xaa\x9b\xb1\x55\x23\xfc\xb8\x96\x49\xde\x82\xcb\xed\x0d\xf3\x78\xff\xc3\xeb\x65\xcb\x73\x78\xfd\xe2\xfd\x8b\x97\xef\x5f\xbc\xd9\x39\x8f\x40\xa3\x40\x36\x23\xde\xf5\xba\x48\xcb\x8c\xd1\xe0\xc3\x54\x12\x36\x64\x80\x51\x18\x1a\x92\x0e\x76\x18\x0e\x06\x19\x03\xbb\x59\x04\x5d\xe4\x19\xd3\xb8\xc7\x88\xf2\x64\x60\x16\x14\x83\xd2\x76\xda\x92\x2e\x80\x5f\x62\xc9\xe9\xa2\x8e\x7e\x9f\xae\x71\x64\x63\xaa\xde\x2a\x24\xae\x98\x8a\xa7\xca\xde\xf5\x51\x75\x41\x94\x5c\xd5\x92\x76\xa2\x44\xc0\x61\x04\xf0\x9c\xf3\x72\xd9\xa3\xfb\xc2\x07\x11\x26\xc3\xe4\x39\x03\x9c\xc0\xd0\xa1\x74\x1c\x81\x1a\xf7\x29\xe4\x4a\xb2\x79\xba\x44\x45\x81\x2d\x6a\x14\x15\x49\x44\x54\x5b\x71\xc6\x42\xbe\x31\x92\xaf\x63\xa7\x2e\x3c\x31\x7b\xb4\xe2\xb9\xdf\xde\x76\xe3\xfd\x17\x0c\x4b\x1f\x3f\x6d\x97\xf2\x87\xe3\xb6\xf5\xfa\x7b\xf0\xd3\xab\xe3\x3f\xfe\xfd\x56\xa0\x18\xb7\xb6\x0f\xe7\xca\x16\xb9\x16\xc4\x64\xf9\x39\x8c\x45\xe9\x8c\x2b\x4a\xe9\x98\x1b\x5a\x0a\x6d\x41\x19\xf2\x79\x67\x73\x66\xd9\xce\xa2\xa0\xce\x39\x44\x88\xf8\x06\x63\x4c\x0a\xe5\xfa\x22\x73\x35\xc8\xe1\x54\x17\xb3\x71\x15\xac\x5c\x5a\x37\x59\xe7\x33\xd8\x56\xa4\x5a\xdf\x06\x2f\x74\x87\x0f\x3a\xfa\x5f\xa2\xff\x2d\xfa\x3f\xa2\xff\x11\x89\x4d\x43\xf9\x91\xff\x6a\xe3\xc0\x7a\xff\x9c\x0a\xf8\xc5\x9f\xfe\xff\xd7\xbd\xf6\xeb\xeb\xde\xfb\xe5\x4f\xaf\xd7\xfb\x82\xe3\x46\x22\xf6\xf3\xbd\x51\x92\xae\xff\x5c\xff\x25\x94\xf8\xea\xcf\x0f\x3c\x4b\xba\x07\x0c\x13\xfe\x50\xb9\x18\xcf\x1d\x24\x18\xa4\x28\x77\x59\x51\xe6\x41\x86\x0c\xb7\x08\x1f\xf8\x2c\xa4\x90\x5c\x72\xb9\xfe\x8f\x90\x71\x3b\x13\xc5\xd5\xed\x37\x8a\xab\xb8\x7a\x18\xa8\xa6\xa1\xd6\x32\x9c\xb9\x28\x38\x45\x08\xe5\x86\x62\x97\x31\xba\xf8\x71\x76\xf5\xe3\x7f\x77\xe5\x3e\xfe\xca\x67\xbe\xf0\xe3\xc3\xb7\x8e\xcc\x3c\x02\x23\xc6\xa0\x98\x23\xd1\x4f\xa6\xc8\xca\x8c\xb3\x60\xc2\x50\x42\x44\xc7\x14\x68\x8a\x82\xe3\x70\x72\xa7\xd3\xea\xca\x4e\x2c\xae\x9c\x17\x4f\xae\x3c\x21\xb4\xf9\x72\xdd\x3e\xf3\xe5\x84\x2f\xeb\xe2\x9a\x8b\xb4\xcc\xae\x25\x46\x7e\x71\x92\xd8\xf6\x03\xe0\xea\xd8\x37\x90\x7f\xf8\xf9\xc3\x8b\xd7\x37\xed\xaf\x2a\x69\x53\x56\x62\x96\x71\x8c\x51\x70\xd9\x9a\xb1\x96\x87\x31\xa9\xe6\x88\x96\x20\xd7\x28\x2d\x33\xc1\x02\x3f\x5b\x3f\xb9\xf3\x01\x06\xeb\x33\x9b\x29\x1b\x26\x6d\x79\x1d\xc8\x5c\x86\xb6\x28\x72\xa6\xd1\xb8\x4d\x3a\x1b\xea\x35\x90\xb0\x28\x49\xb6\xfa\x1e\xb3\xe6\x17\xff\xe3\x53\xb5\xff\xf3\x37\x92\xc7\x7b\xe2\xbb\xe4\xf5\x71\x0d\x45\xd7\x3a\x9c\x6b\x26\xfc\xfd\x4e\x94\x59\x11\x43\xe5\xda\x91\x86\xd3\x38\x86\x91\x83\xb4\x91\x8c\x72\x75\xd2\xd2\x3a\x16\x56\xd9\x7f\x33\x9f\xe2\xec\x89\x9b\x74\x3e\xe3\x83\x81\x98\xe8\xce\x50\xe4\xb1\xb6\xd8\x62\x4e\x05\xa7\xaa\x2d\x14\x93\xf6\xa1\xa6\x35\xc8\xbd\xb5\x3e\x4c\x6b\x0d\x81\x89\xa2\x24\x26\xd1\xb2\xff\x51\xdf\xe0\x7d\x3c\x0f\x7e\x8d\xf7\x2b\x16\xd5\x37\x1f\xee\xee\x93\xc9\x67\x79\x2c\x4d\x33\x81\x8c\x86\x2a\x9c\xce\xa1\xe5\x20\xeb\x04\x43\x58\x4d\x4c\xb9\x56\x85\x74\xb0\x1c\xb0\x0d\x71\x1b\xc8\xb2\x15\x28\x03\x84\x07\x55\x40\x68\x1a\x45\xa1\xc3\x4a\x22\x0b\x09\x66\x10\x2a\xc7\x39\x11\xfa\xe1\x5c\x94\x93\xb5\xd6\x4e\x76\x9a\xf4\xa6\xe5\x6b\x7e\xd5\xbe\x8f\x6f\x8a\x7f\xda\xbe\x55\x99\xe5\xe0\x24\x6c\xd5\xd1\x53\xdb\x5e\x22\x3e\x95\x8c\x12\xaa\x3a\xc3\xb5\xa6\xc1\xf6\x9e\x03\x16\x10\xe8\xb7\xb2\x1a\x18\x86\x32\xa0\x2f\xac\xab\xcc\x6a\x5d\xce\x89\x6a\x0b\xc9\xbf\x6f\xdd\x05\x2f\xfc\x6d\x7f\xf8\xf3\xf0\xea\xc5\x1f\x72\xe9\x9a\x81\x86\x73\x3f\x84\x89\x9d\x6b\xc1\x08\x57\x93\x96\xc6\xb2\x20\x16\x77\x50\x21\x05\xe7\x72\xa5\x1d\x60\xa1\x2e\x43\xf6\x5d\xc0\xec\xb7\xdc\x61\xcd\x8f\xdf\xf0\x2e\x27\xab\xf7\x5f\xd4\xd2\x3d\xaa\x9e\x6e\x8a\xc1\xbf\x01\x37\x2d\x71\x2c\x54\x35\x80\x94\x86\xf6\x12\x5d\xa2\xd0\x70\x00\x7b\x2d\xb8\x54\x20\x37\xba\xac\x44\x48\x07\xa7\x41\x37\x97\xb1\x28\x81\x0c\xab\x32\x44\x39\x57\x0b\x64\xad\x3b\xcd\x16\x07\x36\xe4\xe6\xc0\x4d\xae\xb8\xfa\x1e\xe2\x64\xe5\x96\xd2\x07\x1d\xfd\x14\xfd\x87\xe8\x1f\xae\xf6\xcd\x92\xa7\x8d\xde\x8b\x67\x54\x53\x5f\x66\x50\x5d\xd9\x8d\xef\x92\x53\x99\x15\x49\x4e\x70\x49\x38\xb4\x18\x67\x70\xe6\x4c\x28\x0f\x1a\x43\x19\x25\x0a\x61\xc2\x24\x67\x4c\x6a\x4a\x70\x40\x1e\x9c\xfc\xc3\x78\xd0\x05\x67\x9f\x65\x38\xb5\x79\x55\xa8\x53\x32\x54\x4a\xb5\x82\x76\xad\xf3\x4a\x2b\xe7\x54\xd5\x54\x9e\x2b\x6d\xdd\x4c\xe2\xfe\xa1\x5c\x6d\xcb\x2f\xf4\x28\xff\xbf\x61\xd5\x65\x5e\x24\x96\xe0\x86\x2a\x58\x12\x9a\xc3\x87\x41\x28\xd5\x81\xc9\x50\xc1\x99\x22\x8c\x4b\xa9\xa4\x54\x4a\x30\x36\x8f\x3e\xe6\xfe\x41\x5f\xb1\x5e\xa2\x7e\xc1\x3a\x24\xa7\x4a\xa9\x5e\xd1\xb6\xf1\xa5\xb2\xa6\x2c\x55\xdd\x94\x9e\x6b\xe3\x9f\x63\x6d\xae\xba\x97\xaf\xa2\xbf\x5d\xef\xd0\x56\xac\xf1\x5f\x02\xb5\x59\xcc\x4a\x75\x45\x05\x74\x84\x64\x70\x2e\xb8\x54\x35\xe8\x0c\xe5\x9c\x6a\x4c\x18\x57\x8a\x0b\xa9\x19\x25\x21\x2d\xe3\xc2\x3f\x54\x1b\x52\x1a\x58\x5e\x15\xb2\xdf\x45\xcf\x80\x1a\x53\x7a\x55\x37\x95\xfb\xc2\xa8\x20\xe2\x17\x97\xb4\xbb\x6e\xcd\xf1\x7e\xff\xe2\xcd\x87\xfd\x2a\xd6\xf5\x58\x31\x77\x4d\xe7\x5c\xfd\xf3\x53\x12\x39\x37\x37\xde\x2d\xa1\xda\x11\x2e\x4a\x66\xb3\x02\x9c\xc3\xb8\x96\x26\x80\x6e\xee\xb9\x88\x61\xd0\x39\x18\xdd\x28\xa9\x76\x43\x41\x88\x1b\x5d\xc0\xf9\x9a\xcb\xe8\xe2\xfc\xc8\x57\x6d\x8d\x9b\x5e\xc2\xff\xf8\xf2\xfd\xf4\x49\x2b\xf8\xf9\x7f\xd6\x5c\xb5\x1b\xc7\xc8\xf2\xd9\xae\x72\x0f\xfb\x2f\x2f\x74\xaf\x70\xab\x78\xc8\xb3\x0a\x66\x49\xf1\x4f\x2c\x91\x1a\x83\x28\x2f\xd4\xb2\x01\x0b\x76\x5b\x64\x42\x0d\xec\x83\xcc\x72\x59\x03\xb5\x89\xbc\x2c\x9f\xd9\x48\x46\x90\x29\x2f\xd1\x58\xa4\x86\xce\x03\x06\x48\xd7\x75\x5e\x59\x63\xf3\x46\x1b\x7e\x28\x8a\x02\x22\xac\x0b\xa8\x20\x64\x94\x4b\xb1\xfc\x23\x41\x9b\x67\xac\xaa\x84\x68\xd7\xff\x82\x3e\xcd\x08\x85\x93\x2f\x96\x03\x74\x6b\x24\x95\x30\x93\x5c\xe5\x99\x92\x35\xb4\xd1\xad\x2e\xe1\x68\x62\x7e\xd3\xd0\x7e\xda\x72\xaf\x79\xe2\xab\xf2\xc3\x53\x0d\xfb\x68\xd3\x6c\x57\xcd\x3c\x41\x0f\x7d\x9c\x96\xe5\x2f\x5d\x09\x4e\x0f\x7d\x82\x02\x2f\x90\x56\x31\x87\x79\xae\xb5\xae\x4d\x18\xe1\x49\xd7\x5a\x63\x28\x78\x74\xd5\x08\xf5\x49\x76\x30\xeb\x7d\xe5\x23\xef\xea\x8b\x4f\x2f\xbe\x18\xe7\x2b\xe5\x6a\x6a\x21\x28\xc3\x19\x64\xe1\x44\x9d\x0b\xdc\xb2\x70\x02\x19\x41\xc4\xd8\x83\x41\xa5\x0b\xc6\xcd\x3c\x8d\xd3\xb9\x60\x38\xee\xe6\x3e\x8d\x5b\x07\x8c\x53\xfc\xbc\x71\x2d\x9d\xae\xe7\xcb\xff\x14\xfd\x8f\xe8\xff\xf9\xf6\xce\xf8\xd3\x72\xe2\x7a\x2e\x73\xbc\x1c\xb8\xde\x3c\xdd\x6a\xdf\x7d\xd8\xdf\xaf\x54\x47\x2f\xde\xdf\x92\xce\xbf\x48\x67\xdd\x2e\x10\x77\xa3\x07\x63\x28\xe2\x08\x62\x55\x64\xc1\x9f\xd3\x4b\x64\x1c\x4e\x6d\x2e\xc6\x96\x57\x59\x33\x1a\x4b\x11\xd0\x03\x10\xe1\x8c\x80\x03\x1c\x97\x35\xc5\x85\x83\xa8\x0a\x86\x48\x82\x72\x42\xb3\x50\xf6\x28\x37\x19\x3c\x58\xae\xb5\x96\x82\x23\x6c\x0a\x5d\x20\x54\xc8\xc2\x53\x4c\x69\xae\x73\x37\x77\x01\x07\xcb\x46\x80\x41\x1a\xdb\xcf\xd3\xa9\x30\x05\x56\x2b\x4f\xb5\x46\x92\xd9\x8e\xd3\xcc\x64\xb8\x06\x94\x30\xb8\x6c\xf9\x56\x9e\xdb\x26\xc1\x07\xf3\xed\x5c\xda\x6c\xbc\x16\x66\x5c\x8f\x7a\x9f\x62\x63\x6d\x80\x66\x25\x70\x59\xac\xac\xa9\xcd\x72\x60\x4f\xeb\xe9\x2e\x36\x33\x96\x3c\x6e\xe6\x21\x8b\x2b\x07\x8c\x55\x6c\x02\x05\xa6\x6c\x1d\x06\x9d\x45\xbf\x8b\xca\x58\x1c\xf9\x81\x3f\xd6\x4b\x3c\x55\x43\x6f\xfb\xba\xf7\xd1\xa7\x4d\x41\xf2\xc5\x37\x4a\x43\xcf\x05\x47\xf6\x8f\x6a\x08\xdf\xf9\x9d\xdc\xc3\x5f\x86\x55\x90\x26\x66\xa0\xf9\x7c\xbe\xfd\xf4\x4b\x99\x14\x0f\xa3\x6b\x5b\x40\x57\xe1\x1c\x40\x1b\x90\x25\xf9\xc3\xe4\x9a\x06\x90\x26\xa4\xeb\xbf\x0e\x3c\xe4\x00\x5e\x85\x88\x4e\xa1\x58\x7f\x9e\x30\xc6\x00\x3e\xfb\xc3\xd3\x7c\x68\xff\xbc\xf9\x70\xb6\x10\xef\xca\xd9\x2d\xf3\x01\x8c\xde\xff\x72\xba\xcd\x87\x14\x62\xdd\xc5\x2d\x62\x44\x5b\x6d\x59\x38\x93\x8e\x59\x6d\x11\x14\xd7\x5c\x4c\xbf\xc4\xe4\xb8\x7e\x9a\x0f\xbf\xd1\x4c\x6d\x8a\x9d\x9f\xeb\xa5\x57\xa0\xf7\xfe\x73\xe1\x41\xff\x30\x25\x79\x80\x10\x69\x1d\xd7\x90\x19\x6f\x3d\x0f\x27\x34\x72\x6f\x3d\xc5\x6b\xbd\x74\xb2\x83\xb1\x3a\xfa\x03\x8f\x5e\x44\x6f\xbe\xca\x46\x5e\x7c\xe0\xbf\x81\x0f\xc9\x9b\x0f\x5f\xa5\x44\x2f\x5b\x81\x9f\x0e\x3d\xd2\x8e\xb1\x73\x5a\x0b\x8e\x0b\x91\x44\xdc\x98\x8a\xf6\xbe\x1a\x48\x63\xd4\x59\x91\xe0\xe9\x81\xf7\xd8\x50\x62\x26\xa6\x90\xac\xe7\x56\x0b\xc7\x51\x61\x11\x63\xd0\xe6\x88\xe7\x84\xf1\xe8\xa6\x8f\x5c\x25\xe8\x57\xec\xf9\xe2\x8b\x8e\xc6\xd0\x66\xc5\x2e\x9d\xfb\x84\x3d\xd4\x71\xe4\xfd\x2f\xbd\x07\xe7\x87\x3a\x61\x81\x53\xae\x87\x04\x41\x04\x6d\xed\x3a\x1b\x1c\x07\xb9\xed\x5c\xcd\xb0\x58\xfa\x7a\x4c\xe8\xba\xd7\x71\xd1\xdf\x45\xff\x10\xfd\xf1\x7a\xd2\xfb\xbf\x1f\x33\x3b\xde\x3f\x2d\x1e\x2f\xb6\x13\xdc\xf3\x09\xbd\x2a\x8c\xdf\x7d\xfc\x70\xb7\xff\xf0\xe6\xc7\x23\xb8\xfb\x70\xb3\xd1\xbb\xc5\x62\x1f\xf6\x1f\x3f\xad\x35\xad\xdb\xbc\x4f\x28\xc8\x11\xd6\x02\xb7\x92\x1a\x8c\x41\x14\x4a\x50\x94\xa7\xd3\xf2\x87\x9c\x12\x38\xb3\xb8\x9e\x15\xc0\x69\x70\x31\x97\x69\x18\xe2\xca\x52\x62\xf1\x10\x17\x50\xcc\x5c\x40\x1b\x57\x33\xe7\x02\x1b\xc4\xf7\x8e\x33\xa6\x8d\xb6\x4c\x30\x6d\xe7\x5c\xda\x46\xb2\xd4\x67\xd4\x5b\x19\x4f\x84\x5a\x4b\x49\xe0\x02\x63\x31\x14\x67\x0c\x85\x81\x3c\xa4\x3c\xe4\x42\x5f\x75\x5a\x41\x52\x5d\xc8\xfa\x36\xf6\x37\xeb\xfc\x5a\x6f\x8a\xd7\xfa\xc2\xaf\xa5\xf4\xef\x92\x0e\x68\x0f\x5c\x18\x4c\x27\x3a\x5b\xd7\xde\x7b\xd5\xa8\x56\x86\xf3\x3e\x5f\xce\x1c\x7e\xae\xc2\x54\x01\x12\xd7\x0f\x27\x1b\x0c\x30\x36\xc9\x67\x11\x9c\x03\x22\xbe\xe6\x4e\x9a\x6b\xbd\xe5\x9f\xdd\x56\xe3\x4f\x7c\xf4\x5d\xe7\xdb\xd6\x76\x6a\xb2\x61\x78\xd6\x56\x0d\x8a\x18\xcd\x7e\x6b\x2b\x96\xf3\x14\xba\xa5\x2d\xb4\x71\x4b\xfa\x6b\x5e\x64\xfe\xd4\x5a\xf2\xfe\xaa\xc7\x15\x83\x2d\x4f\xf2\xc5\xdf\x82\x17\xaf\xde\xbf\xdc\xa5\x20\x2f\x81\x85\x3a\x48\x0d\xa0\x0e\x27\xcb\xc3\x64\x01\x22\xa1\x59\x35\x10\x9a\x2e\xdf\xa3\x65\x5b\x30\x37\x65\xd0\xa3\x07\x11\xb0\xc1\x84\xb3\x02\x10\xc8\x12\xd4\xa1\x91\xa0\xde\xf6\x1f\x55\xd2\x5d\x63\xe6\x6f\xac\x51\xeb\x3a\x02\x0a\x87\x62\x18\x3a\xc0\x43\x65\xbd\x9f\xeb\xd2\x06\x0f\xa4\x41\x74\x59\xa4\xb0\xf7\xc1\xf9\x59\xe6\x60\x9a\x39\xe2\x71\xbf\x44\xcf\xda\x03\x95\x1a\x25\xc6\x75\xfe\x03\x71\xd4\x07\xbb\xf6\xee\xa9\xad\xad\x24\xeb\x5a\x96\xb5\xed\xcb\xe2\xcc\x91\x9d\x9b\x45\x02\x1f\x06\xd0\xf9\x5f\x2a\x0f\xda\x75\xf2\x73\xc2\x4c\x77\xb0\xb0\x74\x97\xc8\x05\x06\x58\x28\xc0\x18\x6a\x50\x3b\x10\x49\xb6\xd2\xc3\x44\x71\xa2\x2e\x6e\xad\xe9\xfd\x57\xb7\x19\xf8\xc3\xfe\xf8\x36\x89\x8f\xf7\x51\x72\x8b\xff\x4f\xe4\xbd\x6f\xf6\xc2\x66\xd9\x00\x32\x7e\x89\xfa\xe6\x2c\x01\x21\x31\xee\xd7\x6d\x4a\xf7\x79\x04\xed\xb2\x65\xe9\x0f\x96\x16\x79\x18\x06\x3b\x00\x18\x9a\x56\x82\x62\xd9\xc2\xd7\x2e\xd4\xde\x03\xe6\xc0\x5a\x8b\x91\xc0\x6b\xbb\xff\xbf\x6b\x84\xfb\xed\x66\x91\x2f\x26\x50\x88\x70\x1a\xfb\xb3\x02\x1c\xc6\x64\x04\x2a\x38\x30\x7e\x2e\xc1\xb4\xd8\xb5\x3b\x58\x86\xc3\xd8\xbb\x01\x14\xa1\x69\xd4\x72\x34\xfa\xaa\xd1\x38\x9e\x2e\x6e\xf5\x99\x67\x6d\xfe\x0c\xe2\xfd\xda\xe6\x37\x3c\xc5\x7b\xe2\xd1\x04\x32\x7e\xba\x44\x7d\xe8\x15\xb0\x2a\x6e\xc2\xb4\xd2\xbd\x0c\x9f\x5b\xd0\x85\x0a\xf0\x4b\x74\xd0\x88\x85\xa9\x5a\xa5\x0e\xba\x56\x83\x74\xed\xab\xdf\x9a\xf5\x5b\x5f\x63\x7a\xb1\xc7\x72\x9f\xaf\x5a\x92\xd7\x2c\xde\xd7\xc7\x68\xab\x41\xfe\xe6\x0a\xf3\x70\xbc\xfb\x39\x21\x8c\x51\x50\x36\x25\x02\x10\x70\xae\x44\x68\xd6\xf5\x8c\xfe\xd2\xc7\x34\x30\x50\x2f\xfb\x42\xd3\xc4\x6d\x13\xb7\x18\x39\x90\x02\x88\x48\x38\x3b\x8f\x88\x1e\xdd\xe8\xfd\xe8\x46\xd0\x96\x4e\x47\xd7\xf6\xbf\x1a\xe3\x68\x7f\x7c\xfb\xab\x1d\xdf\x0d\x3e\xcb\x41\x06\xb8\x08\xf5\x7a\xbc\x57\xa0\x91\x71\x17\x4e\x2b\x04\xf2\xcb\x10\xd3\x40\x41\x13\xa6\x83\x65\x45\xbe\xd9\x7c\x19\xe8\xc5\xe6\xa3\x0f\xcd\x63\xe7\x69\x14\xc5\x91\xb8\xb8\xdd\xd2\xf6\xa6\x57\xf9\xfa\xb8\xdb\xd6\x92\x6b\x01\xef\xca\x86\xf2\xad\xbe\x6a\x6c\x1d\x02\x69\x2b\x9b\xb3\xf4\x31\x99\x2d\x27\x12\xa8\xd0\x25\x7d\x40\xd2\xf4\x23\xc4\xce\xb0\x32\xcb\x43\x1f\x4a\xe4\x55\x68\x0e\x96\x09\xdf\xf9\xbe\x2c\x4b\xcf\x39\xb2\x00\xcf\x95\x0f\x7d\x99\x63\xc9\x49\x77\xa6\x84\xf0\xa2\xac\x00\x5e\x39\xc9\xe8\xb1\xdc\xf5\xeb\x3e\x64\x63\x28\x5e\x8d\x11\xed\xef\xdf\x1e\xaf\xf5\x49\x5f\xe9\xf3\x7e\xba\x4b\xa6\x12\x02\x07\x6a\x1e\x68\x90\xa1\x0a\x39\x8b\x95\x49\xc8\x43\x1b\xd4\x81\x3f\x58\x63\x81\x04\x0e\x63\x53\x96\x5a\x85\x68\xae\x61\xe7\xe6\x69\xd7\xa3\xc5\x1e\xbe\x02\x34\x8c\xad\x3b\x0f\xae\x74\x9d\xce\x09\xc2\xdc\xd6\xc6\xf0\xc2\xea\x21\x4a\x56\x5d\xb6\xea\x5a\xd7\xf0\xf3\xe3\x0c\xfc\x39\x59\x46\xe7\x78\x7d\xb0\xbf\x89\x30\x3d\x12\x3e\xdc\xed\x91\xcf\xb2\x13\xc8\xc4\xf9\xd4\x84\x51\x02\x81\x62\x38\x0f\x75\x52\x85\xc2\xcb\x09\xa4\x98\x58\xb7\xca\xce\x56\xa1\x22\x8d\x0c\xcb\x19\x16\x16\xa1\x6a\x7c\x0b\x44\x68\x7a\x0d\xd2\xc9\x8f\x2e\x18\x9d\x51\xa5\xc8\x14\x96\x7d\x0f\xcf\xfc\x00\xe0\x36\x66\x7b\x74\xb0\xd1\x0f\xdb\x98\x1d\xd6\x41\x7b\xf7\x6b\x83\x76\x1b\xb3\xc1\xe5\x05\x80\x83\xec\xc3\xa8\xea\xd8\xce\x44\xae\x0c\x50\xe5\x8e\xcc\x27\xe5\xa6\x33\x22\xce\xc9\x12\x85\x2a\x68\x54\x9b\x60\x0f\x96\x21\xb4\x8c\x5a\x55\x56\x5e\x70\xfc\xcd\xa8\x99\xeb\xa0\x5d\xcf\xa8\x64\xe5\xe1\x78\x66\xa7\x47\x2f\x7e\xb2\xd3\xdb\xaf\xed\x14\x2d\xbe\x9c\x82\x82\x87\x69\x99\xc7\x9d\x04\x06\xc7\x7c\xae\xba\x5d\x3a\x0f\x95\x01\x19\x20\x84\xd9\x4a\xfb\x1c\x06\x15\x24\x1d\x4c\xe8\x17\x5b\xc1\x50\x55\x65\x0b\x78\x68\xba\x9b\xad\x9c\xfd\xd6\x56\x49\x0c\xaf\xb8\x16\x7f\x7a\xf7\xe4\x4f\xbf\x0d\x6b\xd7\x96\x08\x14\x80\x8a\xd0\x87\x61\x0c\x4e\x82\x86\xc6\x7e\x96\xe7\x9d\x9b\x5d\x63\x01\x02\x8a\x71\xdb\x59\x5f\xc0\x80\x02\x22\x27\x17\xdc\x72\x5e\x0e\x4d\x5d\x36\x40\x86\x76\xf8\x2d\x50\xab\xbd\xc6\xaf\xed\xb5\x06\x9c\x05\xd7\xc7\x1f\x92\x5f\xb7\x57\x5a\x16\x20\x5a\xfc\x2a\x9c\x9b\xd0\xab\xfe\xe4\x16\x6b\x35\xc9\x34\x4f\xde\x80\x14\x20\x42\x6d\xa9\x7c\x5e\x04\x1d\x34\xe9\x4c\x18\x0e\xba\xa0\xa1\xac\xca\x7a\xc1\xd5\xeb\x12\x14\x41\xf8\xc1\x7f\x83\xac\x07\x68\xc1\x55\x5d\xec\xb1\x3e\x90\xa8\xb8\x2a\xa1\x6e\xfb\xcb\x5b\x1d\x43\x94\x1c\x9f\x57\x6d\x2f\x73\xef\xee\xd5\x8f\xab\xda\xc5\x9a\xbe\x92\xe8\xc4\x4a\x53\x40\x25\xa5\xb5\xb2\x51\xe1\x64\x72\x21\x29\xcd\x31\x15\xb5\x9b\x91\x04\xe5\x30\x70\x90\x89\x70\xce\x77\xee\xb3\x3a\x90\x52\x49\xa7\x85\xd7\xb5\x08\x43\xef\x00\x8f\x55\xfe\xd0\x30\x9a\xf9\x2c\x4f\x8c\x35\xa1\xf5\x68\x1e\xfb\xc5\x11\xdc\x03\xdd\xea\xb2\x01\xb9\x88\xa3\x8f\xe9\x55\xbb\x67\xad\x32\x2b\x3e\x3e\x5d\x81\x2f\x51\xda\xec\x4e\x9f\x95\x01\x63\x5c\xd8\xac\x44\x8a\xcd\x7e\x6e\xdb\x9d\xff\x5c\xc5\x34\x98\xb2\xc8\x89\xc7\x1d\x46\x54\x02\x7c\xe5\xf4\xe4\x17\x9a\x74\x07\x15\xfd\x2e\xfa\xeb\xb5\xd6\x6b\xbd\xa0\x7e\xda\xec\x82\xa7\x77\xb4\xe3\xcf\x2f\x6f\x1b\x8a\x77\xa3\x2b\xdd\xfa\x66\x05\x1f\x9c\x05\x14\x11\xe9\x90\xc9\x0b\x41\x05\x6e\x9c\x9b\x95\x8b\xa3\xfd\x18\x70\xcc\x4f\x76\xb4\x76\x96\x56\x32\x50\x00\x08\xb5\x92\x46\x29\xd0\x3c\x08\x2b\x12\x3d\x43\xba\xee\xf7\x8b\x95\xf7\x07\x3f\xea\x34\xdc\xbd\xb8\x7b\xce\x0a\x7d\xe3\xef\xba\x3d\x9a\xed\x8a\xf8\x14\xea\x82\x58\xcd\x8d\xe7\x93\x0a\x4a\x19\x23\x72\xdb\x12\xb7\xe9\x6b\x04\x7c\xc0\x0f\xa6\x74\xcc\x28\xc3\x5b\x67\x40\x1a\xab\x59\x20\xe4\x19\xa6\xfb\xe2\x34\xbb\xf3\x8d\x07\x5c\x1c\xbb\x83\x88\x5e\xac\x9e\xf8\x4c\xb3\xf8\xe3\x2a\xb7\xfe\xa4\x59\xfc\xfe\x1f\x3e\xbe\xbc\x32\x9a\xed\x53\x63\xad\xce\x4f\x61\xc8\x21\xd4\x1c\x40\xcb\xb0\x95\x15\x46\x59\x6a\x53\x6a\x14\x3b\x88\xb9\x77\x0f\x03\x32\x8a\xf9\x2c\xdd\x67\x9f\xb3\xec\x90\xcf\x95\x94\xb4\x29\x1f\x4e\x98\x80\x02\x86\x5a\x13\xbe\x69\xdd\xae\x3a\x31\xbf\x8b\xee\x57\x66\xde\xff\xf3\xb9\x2e\xda\x87\x75\x24\x5e\x1e\x8e\xf7\x9f\xee\x7f\x5c\xaf\x65\x9e\x51\x65\xff\xfc\xee\x26\x8b\xb6\x07\x77\x2f\xde\xdd\xff\xca\xb7\xe2\xd4\xaf\x62\x09\xe4\xc1\x96\x5e\x96\x10\x71\x48\x38\x67\x50\x66\x08\x16\xb9\x4c\x73\x0c\x79\x3e\x77\x2e\x86\xd6\xce\x74\x39\x2b\xc7\xf0\x57\xbe\x75\xd0\xde\x96\xd6\x2e\xdb\xd1\x40\x19\x61\x98\x20\xc3\x75\x95\x13\x08\x19\xcf\x31\xa6\x94\x93\x53\xf0\x40\x7c\x76\x94\xc4\x26\x64\xc8\x73\xfc\xf8\x2d\x5a\x3c\x7d\x2b\x8a\x6e\x6f\x5b\xf0\x59\xdf\xff\xaf\xef\xf7\xfd\xca\xef\xf5\xe9\xf5\xf1\xb7\xfa\xfe\xf4\xad\xe7\x9d\x47\x7e\x7b\x97\x78\xa0\xb5\xd7\x15\x42\x22\xcf\x08\xc4\x9c\x41\x95\x89\x22\x57\x69\x86\xa1\xc8\xe7\xca\xc5\xcc\xb9\xb9\x88\xc7\xb9\x8e\xd9\x97\x5f\xc3\xf0\xf1\x7b\x6b\xff\x9d\xdb\xfa\xcf\x31\xcf\x73\x22\x29\x57\x75\x4e\x28\x5d\x7a\x46\xa8\xc0\xe7\x6b\xff\x69\x6c\xb7\xfe\x3f\x7d\x8b\x16\xc5\xe3\xd7\xd6\x37\xda\x34\xd2\x47\x7a\x80\xd1\xbf\x8c\xfe\x2a\xfa\x61\x55\x61\x78\xf1\x28\xdb\xfd\xfa\x2a\x48\xb2\xcc\xbb\xfd\x31\x02\x1b\xa5\xf6\x43\xe3\x2d\x1c\x5a\x56\xc6\xf5\x72\x56\x43\x4e\x29\x90\xe9\x30\x04\x6d\xac\x35\x07\x38\x67\xf3\x09\xad\x12\xdd\x7b\xee\x36\x41\xce\xe0\x99\xe1\xa3\x01\x39\xc8\x38\x97\x22\x8a\x92\xe4\xb4\x72\xf8\xd1\x55\x7d\xa5\x58\x5b\x7d\x6e\xb2\xc7\xb9\xf6\x88\xe1\x58\x04\x5f\x10\xc3\x8d\xf4\xb2\xd7\xa7\x13\x72\x95\x2d\x9a\x13\x2d\xc1\x29\x64\xe0\x74\xa0\x0f\xaa\x31\xc2\x48\xa7\x8d\xf5\x15\x30\x80\xcc\x1c\x11\xcf\x09\x3d\xd4\x7e\x9a\x82\x19\xc7\xa5\xbf\x3b\x1f\xc9\x63\x75\x20\x7f\xb2\xbf\xeb\x00\x7f\x7a\xfd\xf1\x58\x84\x54\x49\x6c\x1b\xe1\xd6\xbb\x79\x89\x2c\x65\x46\x8b\xe9\x12\x49\xc5\x0e\x64\x4e\xe7\x1e\x61\xcd\x98\xdc\x2b\xdb\x34\xa1\x6f\x9a\xe0\x99\x64\x52\xeb\xa9\x54\x94\x47\x51\x02\x38\x40\x47\xb3\x73\x57\xc5\xd1\xaf\xe2\xca\xdb\x77\xab\x20\xdc\xfe\x31\xac\x00\xbe\x4f\xe7\xc9\x4e\xad\xd6\x52\x2a\xcd\x66\x15\xa6\xa0\x80\xca\xfb\x70\x66\x65\xd2\x3d\xe0\xe5\xb3\x73\xf3\x44\x21\xe5\x94\xe2\x2c\xf5\xfc\xe4\xb9\x21\x98\xc6\x98\x87\x61\x69\x33\x69\x7e\xc3\xbe\x6f\x6f\xf6\xdd\x3f\xb3\x6f\x16\x0c\xa4\x46\x69\x59\xa9\x51\x87\xf3\x19\x55\x8d\xcf\xdb\x4b\x44\xb7\x34\x8a\x7c\xb5\xb0\x15\x56\x7a\xf5\x68\x61\x86\xbf\xb2\x70\x12\xf7\xeb\xfe\xb1\xf9\x7e\x0c\x7d\xfb\xd8\xee\xad\xb3\x71\xbf\x4b\x43\x4e\x74\x53\xca\xb2\xf4\x23\x9f\x87\x7e\x1c\xeb\x7c\x08\x03\x2d\xe3\x6e\xc6\xcb\x67\xd7\xcc\xb9\x91\xcc\x68\x45\x05\xae\x6a\x30\x04\x0c\x91\xc7\x98\x26\x53\x19\x70\xb5\xd5\x68\xc9\x8b\xdc\x8d\xab\xc6\xff\xdb\x55\x0f\x6f\x59\xd1\x37\x7e\x9e\xbf\x02\xc7\xfb\x8f\xcb\xa9\x69\xad\xe4\xff\x78\x0b\xac\xeb\xc3\x74\xf2\x2c\x2b\x2e\x69\x1c\xd1\x42\x70\xc1\x0a\x86\xe5\x50\x00\x65\xda\x56\xf0\x25\xc4\x62\xab\x87\x61\x99\x86\x1a\x62\x30\xa8\xa2\x50\xf0\x60\x90\x13\x5a\x69\x6e\x20\x43\xa2\xbf\x44\xb6\xb1\xf3\x50\xe4\x5a\xb2\x32\x2f\x62\x6a\x9b\x20\xeb\x01\x0f\x35\xca\x3b\x5b\x54\xeb\xfa\x72\x5e\x39\xec\xc9\x55\x27\x3b\x02\x2f\xde\x7c\x6f\x79\x79\xf1\xfe\xc3\xe3\xa0\xf0\x21\x83\x98\x6a\xaa\x89\x55\x61\x40\x42\xf1\xdc\xd4\x34\x75\x6b\x40\xc1\x07\xf2\xa0\x4b\x4d\x8c\xf0\xca\x59\x07\x8a\x98\xce\x1c\x62\x4f\x09\x3d\x08\xea\xa6\x29\xd8\xd3\xe9\xaa\xdd\x72\x2c\x77\xea\x99\xfe\xd0\xf3\x32\xd9\xbb\x4d\x7e\xe1\xc9\x15\x0e\x7e\x36\xbc\x19\x5a\x5e\x55\x0d\x28\xcc\x0c\xa7\x60\x40\xda\xe7\xe7\x50\xd3\x72\x97\x7f\x9e\x76\xf9\x4e\xcd\x44\x2b\xaa\x1c\x43\x1c\xfb\x16\x54\x81\x12\xe6\x04\xa3\xbb\xd1\x59\x1b\x4e\xce\x2d\xfd\x4d\x41\xbb\xf6\xf7\xe6\xf7\x5f\xbb\xc2\xbb\x6d\xd6\xdd\x6d\xda\xd9\x47\x14\x2a\xc2\x95\x90\x52\x4a\x2d\x43\xd5\x96\x00\xe7\xf5\x44\xdd\x9a\x2a\x95\x1e\xc8\x5c\x71\x4e\xb8\x62\x88\x31\x73\x06\x28\x78\x6e\x31\xa6\xbb\xfc\xa4\x46\xad\x57\x2e\x1f\x50\xaf\xf7\x75\xbf\xe2\x7b\x77\x5f\xf9\x1e\xc0\x7b\x3a\x0f\xa2\x69\x8d\xb3\xce\x8d\x6c\x86\x5d\x40\x7d\x95\xf7\x61\xa2\xe5\x2e\xfd\x7c\x5e\x3e\x07\x3e\x13\xc5\xa4\x64\x8a\x41\xe8\x1d\xe0\x61\xc2\xd4\x33\x46\x13\x68\x83\x32\xeb\xbd\x8e\xba\xea\x38\x5c\x4f\x03\xb7\x03\xe3\xf5\x58\xf2\xc3\xcb\x27\x6d\xd8\xf5\x04\x79\x38\xde\x17\x87\x33\xab\xba\xf5\x62\xa0\x09\x91\x73\x13\x88\x30\x75\xa5\x2a\x49\xa8\x83\x81\xad\x0b\x06\x74\xa1\x01\xb4\xee\x10\x68\x0e\xc6\xa1\x3c\x4c\x3e\x0c\x3e\x98\xaa\xe0\x46\xd3\x4b\x14\x7a\xd6\x2a\xe8\x5a\xa0\x3d\x80\x1e\x44\x59\xea\x17\x2c\xcd\x8a\x45\x7c\x07\xcb\xa7\x2f\x76\xb2\x1b\x96\xe5\xb8\x52\x1c\x23\xe6\x9b\xb5\x16\xdf\x05\x6c\x6d\x37\x2a\xe7\x45\x95\x17\xa1\x0f\x35\xaa\x4c\xa8\x40\x19\x7a\x80\xaa\x1a\x03\x7f\x10\x0e\xe6\xe1\xe4\x97\x93\xac\x2e\x0b\x71\xa2\xe7\xd0\x33\xce\x75\xe1\xd6\x3b\xab\xc2\x9f\xb3\xb4\x5c\xb9\xf8\xf0\xb1\x3d\xe8\xe8\x63\xf4\xff\x5f\x99\x6c\x7e\x78\xb9\x6c\x5d\x92\xd7\xff\x0e\xac\xa9\x5a\xf1\x9b\x3f\x24\xeb\x52\x19\x27\x77\x2f\x9e\xd5\x2c\xbf\x78\xf3\xea\x31\xc3\xf0\xdf\x6e\x69\x7e\x47\x17\x7c\x0a\x29\x72\xcc\xa0\x1c\x66\x69\x5a\x42\xcb\xb5\x74\xaa\x56\x3c\x0b\x06\x50\xaa\x30\x2e\x28\xcd\xb2\xda\x5b\x17\xa7\x3e\xad\x09\x51\x98\xee\x89\x0b\x24\x9c\x7b\x40\x8a\x90\x5d\x22\x83\x51\x59\xe1\x80\x41\x56\x1a\x55\xb5\x00\xc6\x3a\x0c\xb3\x6b\x33\x9f\x39\x60\x4c\x80\xa1\x62\x40\x81\x3a\x36\xdb\xe4\x62\x6a\x5d\xa9\x6e\xb5\xde\x7e\x47\x23\xbc\xf5\x64\x71\xa9\xf8\x78\xa5\x97\x7d\xf3\x87\xeb\xcd\x6f\xf2\x15\x61\x54\xbc\x75\xe3\xfe\xfd\xeb\x95\x26\xe0\x28\x66\x8b\xb8\x91\xd6\x94\x56\x66\x38\x73\xcc\xd7\x8d\xab\x69\x6d\x35\x9e\x79\x0c\x73\x25\x99\x2c\x14\x43\x30\x0b\xaa\xb0\xd6\x27\x28\x2b\xb3\x81\x58\x8c\x92\xd2\x86\x53\x53\x4d\x34\x0c\x4d\x5b\x95\x38\xd0\xb3\x66\x96\xab\x09\x88\x53\x60\x7d\x6e\x32\x75\x0e\x4d\x38\x0b\x90\x02\x0e\xbc\x31\x72\xbd\x3c\x8e\x63\x73\x1d\x83\x7f\x8c\xfe\xcb\x0d\xf9\x32\x06\x3f\xbd\xff\x87\x97\x7f\xc6\x00\x24\xef\x7f\x7c\xbd\x5d\xd9\x1e\x6d\xd0\x29\x62\xc4\x71\x27\x61\x9e\x96\xc8\x49\xad\x2b\xd9\x69\x91\x07\x01\xd6\x07\xcc\x82\xd1\x3c\xef\x1a\x5b\xc7\x28\x2d\xd3\x86\x51\x45\xf8\x32\x00\xe9\x34\x00\xb6\xda\x7f\x02\x74\xb1\x7e\x5e\xda\xc5\xfa\x45\x6c\xc2\x30\xfb\x2e\xf3\x99\x04\x95\x09\x38\xf8\x47\xeb\x57\xee\xd1\xfa\x5b\xed\x42\x9d\x98\xab\xed\x6f\xd3\x79\xe9\xc1\x5f\x81\xef\xd8\x7e\xa3\xd1\xdb\xd8\x86\x16\xdb\xaf\xc5\x04\x47\x39\x5b\xa8\xac\xf4\xba\x72\xb2\x48\xcb\x5c\xb0\xb2\xaf\x7a\xda\x79\x47\x66\x12\x93\x4c\x29\x2a\x0a\xc5\x61\x9e\x06\x91\x79\xeb\x13\x92\x55\x19\x28\x90\x83\x79\x92\xda\xbe\x36\x1d\x3a\x55\x15\x48\xd1\xe8\x27\xc3\x2d\x57\x2d\x80\x65\x30\x6d\xea\x0b\xee\xc2\xe9\x2c\x07\x90\x03\x25\x04\x83\x98\xac\xf7\xa0\xe4\xa8\x77\xd3\xaa\x70\x71\xf3\xfc\x0d\xf3\x02\xf2\xd1\xec\xcf\xfd\xe5\xe5\x73\x7f\xd9\xee\x0d\xd8\x6c\x90\xb4\xb2\x34\x8d\x23\x30\xab\x73\x25\x6c\xe3\x3b\xda\x39\x47\x67\x19\xe7\x99\x12\x42\x43\xcb\x21\x4a\x83\x4d\x6b\x53\x25\x59\x56\x65\x63\x81\x0c\xc3\xbb\xdc\x85\xe1\x12\x55\x20\x43\xa1\xee\x7b\x40\x70\x38\x55\x20\x73\xd2\x2a\xb7\x9c\xe4\x4e\x21\x3d\xe5\x3e\xf7\x00\x05\x1b\x2a\x01\x0a\xa0\xc0\xd4\xf7\x04\x33\x21\xa3\x38\xce\xaf\x7e\xf3\x61\x7d\x75\xfa\xc6\x6f\xae\x6f\x1d\xbf\xea\x38\x3f\x7f\x78\xff\xe2\xd1\x71\x58\x86\x05\x71\xc2\x09\x9c\x67\x25\xf2\xc8\x61\xdd\xc8\xde\xca\x3c\x50\xa0\xb9\x41\xb8\x20\xb4\x28\xc6\xc9\x8e\x31\x4d\xcb\x9e\x31\x45\xc5\x9e\xb8\x79\xec\x07\x20\x9e\x39\x4e\xa9\x9f\x3b\x4e\xd9\x67\x3e\xd3\xc0\x5f\x1d\x47\x82\x26\x36\xbe\x7c\x9a\xb6\x09\x58\xb9\x6e\x77\xa7\x55\x6b\xe4\xe3\x4d\x39\x7c\x4b\xcd\xf8\xf1\x78\xb7\xf8\xce\x6d\xa2\xae\x8b\xe0\x96\x2b\x75\xd3\x46\x5e\x95\xf8\x3e\x7e\xb8\x3b\xc6\x2a\x8e\x7c\x4c\xe6\x16\x4c\x21\xcf\x62\x9b\x0a\x55\xe0\x9c\xc2\x22\x4f\x03\xb2\x71\xc4\xe6\x73\xd5\x04\xce\x41\x69\x83\x64\xa0\x0a\x08\xf4\x21\x8a\x3d\x60\x21\xca\xc3\x90\xef\x9c\x10\x56\x04\x8d\xf1\xa0\x53\x9d\xe6\x78\x52\xce\x02\x18\xce\x95\x2d\x5b\x60\xb4\x15\x93\xd6\xc1\x61\xac\x96\x33\xb0\xbd\xe0\xa3\xdb\x9d\x57\x75\xfd\x4f\x4f\xe7\x90\x55\x01\xfb\x11\xf1\xa7\xbb\xdd\xf5\x02\xe5\x19\xe0\x0f\x77\x9b\xa2\x37\xb8\xfb\xf8\xe9\x2e\xa9\xd6\x7c\xeb\x58\xcc\x36\xcd\x92\x22\xa5\x94\x90\x82\xa1\x3c\x9d\x47\x90\xc5\x11\x9e\xeb\x30\x54\xb3\xa7\xe0\x54\xcf\x03\x8d\xc5\xcc\xe3\x6a\xce\xe3\xc9\x83\x3e\xe0\x59\x82\x2e\x4b\x03\xda\x9d\xb5\xd3\x41\x63\x34\xe8\xcc\x64\x74\xa4\x5e\x00\x1e\x4a\xe1\xe9\x04\xb4\xb6\xda\xcd\x67\x9d\xe1\x30\xa2\xed\xfe\x29\xc9\x2f\x64\xe5\x85\xf8\x8f\x57\x2d\xe2\x67\xf6\xfe\x1b\x70\x17\x6f\x14\x97\x9f\x3e\x7e\xba\xfb\xe1\x66\xee\x97\x8f\xe8\xd7\x12\x97\x8f\x7f\x04\x6f\x8e\x89\x02\xae\x5c\x6c\x0d\xaa\xc0\xe3\x28\xe3\x9c\x15\x04\xa7\x69\x1a\x5c\x05\x8c\x08\xd6\xda\xd0\x5b\xa0\x59\xb0\x18\x88\x55\x68\x44\xc5\x08\xa4\x81\xa5\x63\xb6\x9f\x9c\xb3\x2e\x30\x49\x42\xef\x6d\x0e\x55\xb0\xde\x77\x4b\x34\xef\xe4\x19\x50\xd0\x7a\xe7\xc2\xe8\x7d\xc0\x45\x21\xab\x28\x89\xd1\x15\xf3\xe2\x23\x9f\xbe\xc4\xfc\x6a\x4d\x91\xfe\x73\x40\xdf\x1d\xe3\x12\x4c\x65\xcc\xe7\x2a\x8e\x42\x94\xc6\x32\xe3\x52\x14\x94\xa6\x59\x1a\x70\x03\x46\x11\x60\x55\x06\xeb\x40\x2f\x02\x25\xa0\x5c\x73\x68\xf3\xd8\x02\x31\x9f\xd3\x30\x66\xfb\x93\xb5\xde\x04\x22\x8a\x3c\x74\x0b\x6e\x19\x7c\xe9\x7b\x40\x43\xbd\xe0\x26\xa0\xb7\xa5\x09\xa3\xb5\x81\xe6\x85\xf0\xeb\xfd\xa3\xd8\x2d\xe7\x89\x1f\xa3\x77\x2b\x7b\xe0\x5a\xc9\xf8\xec\x82\x78\xf5\x8b\xad\x2b\xef\x5e\xef\xd6\xbc\x7d\xb5\xcb\x42\x6a\xe4\x30\x29\x5d\x29\x53\xc0\x50\x06\x05\x6b\x13\x4a\xb4\xac\xda\x3a\x58\xb0\xea\xb2\x4e\x18\x34\xc1\xee\x9c\x1d\x45\x06\x0d\xad\x7b\x4a\x08\xce\xad\x1e\x66\x5d\x55\xae\x2b\x2c\x86\x65\xd1\x2f\xe3\x8d\x76\xe9\x9a\x23\xf0\xaf\xa3\x97\x6b\x3d\xc2\x4f\xaf\xef\x9e\x12\xa1\x9f\xb3\x22\xec\x15\x2a\x40\xeb\x1e\x7a\x07\x86\xbc\xc8\xb5\x1d\x64\x07\xea\xae\x14\x65\x73\xb0\x8c\x87\x93\x75\x20\x27\x38\x8c\x54\x49\x21\x18\x13\x4a\xd1\xb5\x8f\x2a\xa9\x0f\x45\xf4\xe3\xc6\xfc\xf3\x74\xa1\xfa\xb8\x9b\x02\x6b\xd7\xd6\x1d\xd5\x56\xe0\xf1\x51\x26\x34\x18\xad\xea\x16\x21\x2f\x99\x47\xe1\x1c\x7a\xe4\x65\x38\x25\x59\x11\xaa\x20\xc8\xa6\xfa\xb3\xa6\x09\x96\x87\xc2\x87\xda\x66\x44\x4b\x72\x5a\x36\x7c\x2c\x77\x35\x20\x9f\x73\xc7\x69\x85\x40\xea\x40\x74\x89\xdc\x94\x6f\x77\xf4\x65\xa2\x0e\x45\xf4\x72\xbd\x11\x5f\x7a\x79\xdb\x4f\x6d\x72\xa1\x1f\x93\x1b\x4f\xd8\xbb\x2b\x26\xa0\xcf\xf1\x10\x3a\x25\xcb\x9a\x69\x49\x0d\x3a\x87\x11\x3a\x03\x32\x77\x3e\x83\x22\x0f\x6d\x50\x18\x90\x70\xda\x7b\x6b\xc3\xa0\xd2\xa2\xa5\xe3\x99\x95\x38\xb3\x7e\x1e\xa6\xc9\x85\x81\x5a\xc5\x4a\xb2\xbd\x11\x98\x8b\x5a\xcf\x8f\xaf\x9e\xc6\xfb\x0b\xe6\xe7\xe7\x03\x7e\x7d\x2a\x69\x0e\xfe\x21\xb7\x16\x58\x50\x61\xea\x06\xeb\x11\x9e\xfb\xd9\xa3\xbe\x0c\x39\x89\xab\x32\xae\x66\x9e\x90\x7f\x8a\x92\x62\xe6\x3b\xe7\x7a\x95\x61\x42\x78\x37\x72\xce\x58\xee\xf4\x30\xab\xba\x76\xa3\x73\xe3\xf6\x16\xa5\x56\xcd\xfc\x1f\xd7\xfe\x6f\xfe\xf6\xee\x37\x9b\x4f\xe8\x0e\xcd\x96\xc9\x13\x48\x95\xe8\x4a\x89\x71\xd0\x81\x42\x27\xc3\x19\x02\x5f\xae\x89\xe4\xa7\xcf\x0e\x8c\x41\x26\x67\x5b\xca\x0c\x32\x69\x2a\x4d\x30\xcd\xad\x68\xe6\xc9\x18\xdb\x3b\xd7\xaf\xef\xfc\x72\x57\x27\xe3\xc6\x7e\xb0\xf6\xfc\x29\x37\xfa\xb8\x36\xb8\xe9\x0e\x5f\xa5\xd4\x37\x6e\xae\x2e\x99\xe6\x96\x59\x90\x8f\x10\x1a\xcf\x6d\x01\x95\x59\x4e\xef\x5d\x93\x07\x36\x9f\xd0\x34\x04\x07\x54\xdd\x40\xab\xce\xc9\x68\x8d\x29\x0a\x0c\x99\xaf\x19\xc1\x79\xe6\x6c\x99\x17\x9a\x53\x97\x17\x8d\x35\x79\x66\x64\xb5\xf9\xe3\x2e\x5a\x75\xa4\xef\xbf\xf6\xc7\x9f\x9f\x3b\xe4\x55\xfb\x78\xf3\x48\x9b\xe8\x20\xb5\x6e\x3a\x84\xfd\xf6\x22\x33\x86\x16\x79\x1d\x86\x84\x17\x41\x07\x48\xba\x66\x59\xb4\x56\x35\x92\xc5\x21\x5b\x9f\x63\x2d\xc9\x18\x4e\x94\x12\x96\xfb\xea\xe6\x91\x79\x01\xa2\xab\x4b\xde\xde\x25\xcd\xd1\xaf\xf3\xe3\x3a\x26\xdf\xcc\x8f\xab\x2c\xd2\xe3\xdb\x55\xe2\x93\x21\x20\x6b\x86\x11\x13\xef\x64\x89\x43\x13\x1c\x6a\x6c\xa8\x73\xa0\xca\x35\x06\x0c\x9f\x07\x50\x07\xb7\x4d\x8d\x1c\x69\xb5\x4e\x0d\x4f\x57\x20\x0f\x7c\x6d\x3f\x74\xde\xaf\x8f\x0e\x20\x32\x17\x7d\x34\x49\xfb\xe4\x15\x4f\x5e\xb9\xff\xea\xdd\x6e\xf5\x12\x90\xee\xa7\x07\x2b\x0d\xd0\xc0\x13\xaa\x47\x6b\x21\x0c\xc5\x73\x57\x8c\xab\x79\x80\x9d\x0f\x3c\x69\xad\x93\x69\x81\x31\xf5\x0d\xc3\xa8\xf0\xb6\xb2\xb6\xb2\x2e\xb7\x62\xad\x9d\x8e\xf9\xb5\xff\xaf\x36\xc5\x85\xef\x5d\xd6\x7f\x6d\x80\xb8\xde\xd5\x73\x5b\x95\x20\x07\x88\x71\xd7\xd9\xb2\x80\x41\x04\x88\xa6\x2a\xf0\x02\x0c\xe5\x9a\x8f\xc4\x7e\x69\x63\x16\xe0\x62\x83\xc6\x3d\xda\x80\x53\xf6\x3d\x23\xc4\x71\x79\xf1\xfb\xf2\x00\xb7\x38\xf5\x55\x6c\xf8\xf9\x29\x38\x2c\x30\xde\xdd\xfc\x23\x31\x7d\xdc\x85\x46\xa8\xb2\x22\x46\x10\x9b\x67\xe7\x70\x46\x46\x81\xa8\x5c\xfe\x76\x00\x8b\x25\x40\x20\x67\x2f\xd1\xbe\x5c\x56\x3c\x9f\x91\x0a\xf7\x67\xc2\x28\xcb\x5d\x35\xb7\xe7\xb3\x0d\x23\x35\x92\xfa\xbc\x58\xc7\x22\x06\xed\xc5\x1c\xdd\xce\x3f\x9f\xa3\x6f\x7f\x7b\x8e\xc6\xf9\xbe\x98\xb1\x32\x00\x01\x6a\x4c\x55\x5a\x88\x02\x0e\x11\x6a\x6d\x90\x28\x4e\xb7\x0a\xa5\xf2\x17\x14\xbb\xf9\xbc\xf3\x4b\x88\x80\x96\x97\x83\x24\x84\xac\x11\xc2\x78\xef\x26\x77\xf3\x47\xf8\xed\x78\x7c\x3d\x3f\xbe\x71\x48\x95\x9c\x03\xb4\x6e\x3c\x13\xea\x4b\x51\xe6\xc5\x72\xf8\x5d\xda\x2f\x0b\x60\x4a\x60\x83\x06\xd3\x67\x07\xa6\x60\xae\x73\xe3\x36\x1a\x8c\x7d\x77\x34\x96\xf1\x48\x2f\x7e\x2f\xbf\x1d\x8f\x67\x4f\x71\xdf\x19\x0f\x34\x25\x51\xf0\x6a\x89\x08\xd0\x28\xe6\x96\x95\x63\x44\xd6\x01\xb4\xa9\x1b\xb0\x3c\xf8\x40\x70\x53\x85\x7e\x1d\x90\xc6\x64\x58\xb0\x65\x44\xfc\xd3\x80\x4c\xe4\x69\x40\xe2\xd8\xfe\x33\xfc\x73\xdc\xd9\xb9\xf7\x25\x48\x41\x41\xb9\x6f\xcd\xe2\x9f\x32\x50\x34\x96\x41\x16\xa0\x29\xaf\xc2\xcc\xa7\x18\x05\x7a\xb3\x88\x91\xbf\xe9\x9f\x11\xbe\xd0\x7d\x74\x60\xd1\xcb\x5b\x96\xed\x4d\x0b\x78\x2d\x00\x38\xde\xbf\x7d\xb7\x0a\xf0\xc5\xc9\x4f\xfb\xbb\xe3\x5d\x71\x3b\x50\x7d\xfa\xe9\xf5\xc7\x97\x6f\xee\x5f\xbe\xd9\x79\x29\x75\x5d\x77\xb3\xb7\x76\x60\x80\x3f\xf4\xa0\x54\x72\xca\xad\x00\x2b\xd9\x71\x1d\x84\x65\x8a\x2b\xc6\xa0\x29\x20\x86\xa7\x6c\x3c\x1f\x98\x82\x45\x10\x36\x14\x3e\xa9\x1f\xa6\x64\x82\x16\xe6\x7e\x6c\x42\x1e\xda\x2a\xf5\xad\x95\x46\xb9\x0a\xa4\xb8\xd6\x35\x40\x1a\x94\x51\xbc\xe6\xd8\x56\x7f\x31\xce\xfb\x1b\xce\xbb\x63\x2e\x84\x1e\xc7\x69\xd6\xc6\xad\x38\x3b\xd0\x68\x39\xe5\x46\x00\xb7\xe1\xe4\x9e\x6b\x6e\x18\x81\x36\xcf\x71\x7e\xca\x4e\xe1\xf4\x6b\x40\xe7\xf3\x25\xea\x52\xdf\x3b\x65\x4c\x59\x9e\xb0\x53\x35\x48\x57\x9c\x91\x5e\xef\x02\x4c\xf4\xe3\x96\x11\x7e\x5d\x83\xee\xae\x38\x0f\xc7\xfb\xb7\x2b\x1d\xcf\xdd\x3d\xb8\xfb\xb0\x21\x3e\x7e\x89\xf8\x98\xd2\x61\x5a\x7d\xbb\x79\x28\xfc\xa9\xe9\x70\x9c\x7f\x1e\x31\x63\x30\x9c\x32\x90\x06\x17\x23\xa3\xcf\xb9\x2b\x63\x1d\x33\x3c\x4f\xb3\x1c\xa5\x13\x86\x4b\xbc\x33\xb6\xc8\x27\x7f\xf2\x31\x09\x3c\x16\x79\xe6\x8b\xd9\x5a\xae\x7b\x0d\x72\x67\x4b\x1d\xea\x51\xa6\xa5\x57\xcc\x51\xa6\xab\xd5\x07\x37\x9b\x3e\x62\xfd\xc2\xa6\x87\xdf\x1e\xfc\xa5\x07\xc7\x5c\x48\x3d\x4d\xa7\x59\x58\x2f\x34\x03\xec\xa1\x07\xb5\xd1\xa7\xdc\x09\x50\x81\x12\x07\x1f\x68\xc9\x95\xd0\x9c\x43\x53\x20\x5a\x5c\xa2\x6c\xf1\xbf\x6f\xec\x9a\x67\x57\x0f\xc8\x42\xf7\x85\x07\x34\xa6\x01\x78\xb1\xec\x4d\xdf\x62\xf3\x81\xf7\x5f\xde\x5e\x7d\xe1\x03\x77\xf1\xef\xc0\x77\x9c\xe0\x8a\x57\xd9\x35\x84\xa6\x33\x72\xd5\x99\x03\xf7\x60\x40\x67\x0d\x88\x32\xc2\x25\xe8\x40\x8d\x83\x0d\x45\x29\x2c\x77\x9c\x41\x03\x21\x29\x16\xb3\x67\x61\xfa\x8e\x2f\xa0\x6c\x81\xdc\x9e\xc6\x36\xf5\x83\x57\xc6\xf8\xf2\x8c\x4b\x5d\x83\x62\x41\xbc\x71\xbd\xf1\x95\x93\x62\xcb\xd5\xfc\x9a\x2b\x74\xa5\xf1\x7e\xfb\xe9\xee\x91\x2a\xf4\xc5\xed\xe6\xb1\x29\x97\x38\xa1\x14\xa6\x50\x62\x36\x84\x86\x03\xd6\x84\x8c\x75\x48\xac\x0b\xf1\xf5\x73\x30\x05\x25\xbf\x5c\x95\xb3\x01\x0b\x5d\x63\xbb\xc9\x25\x86\x07\x55\x05\x7c\xbd\xfc\x06\x89\x5e\xce\xba\xc9\xca\x8d\x7e\x3b\xc3\xfc\xf0\xfa\xf8\x73\xf2\xe2\xcd\x8b\xf8\xb8\x44\x9a\xa4\x04\xde\x83\x65\x41\x3b\xb1\xb1\xf4\x76\x10\x93\x09\x6d\xac\x87\x61\x15\x06\x28\x01\x99\x87\xb8\x08\x7d\x63\xba\xed\x7d\x1c\x24\x36\x1e\x8e\x6e\x7d\x0b\x5d\xa3\x68\xf2\x35\xad\x3d\xb8\xff\xb8\xab\xfa\x78\x22\x20\xcb\xa5\x41\x2c\x17\x18\xc2\x2c\x8c\x64\xc4\xe1\x2c\xa7\x7d\x6d\xc3\x14\x54\x93\xf9\x9c\x0f\x20\x0f\x2c\x9c\xf4\xb4\xec\x19\x54\x3c\x1c\xe5\x81\xac\x7f\xef\xdd\x37\x7f\xef\x5d\x0c\xee\xdf\xc6\x22\x94\xbb\x33\x07\x5d\x51\xf6\xdc\xc0\x8a\x2b\x56\x84\x9c\xcf\xa3\x0c\x54\x03\xb7\xaf\x7c\x98\x82\xee\x60\x85\x45\x0b\xf2\xc0\xc3\x69\x15\x61\x4a\x22\x75\x61\x47\xb5\xab\xa2\x97\xd1\xdf\x46\xff\xfd\xcb\x6a\xa8\x5b\x75\x34\x78\xba\xb1\xf8\xf4\x71\xe5\x0f\xff\x6f\xe0\xd3\x9b\x77\xdf\xfd\x2d\xc8\xf7\xe7\xcc\x96\xbc\x2a\x5a\x41\x49\x36\x5b\x39\x97\x3c\xce\xd4\xdc\x26\x45\x82\x55\x43\x69\xc1\xb9\xc8\x8a\x30\x65\xa1\x55\x5e\xe7\xa7\x07\xf5\xf4\xfb\xbc\x08\x63\x1a\x1a\xe5\x4d\x76\xda\x55\xa1\x6a\xa1\x2f\x58\x15\x3c\xf3\x64\x0c\xf9\x3c\x35\x99\xcf\x30\x07\x45\xe0\x8d\x66\x43\x6b\xe6\xd3\x62\x2c\x22\x96\x1e\xb5\x9a\x0f\xed\x4d\xe7\x6e\xd3\x57\x59\x2b\x60\x6f\x55\x74\xb7\x6c\xcc\xc3\x77\x14\x07\x6e\x84\x28\x1f\xde\x24\xe3\x50\x8e\x23\x6b\xbd\x33\x25\x80\x41\x72\x15\xd3\x79\x84\x31\xc1\xce\xd5\xbe\x38\x49\xcc\xf2\xb9\x23\xc6\xb2\x69\x0c\x1a\xe4\xc3\xbe\xea\x7b\xd7\x4f\x67\xda\x77\x4e\x0a\xdb\x04\xd5\x17\xbe\xd0\x1d\xe0\x4a\xda\x72\x5a\xf6\xe3\xf1\xf9\x19\x9e\xbb\xdf\xc4\xb3\x7b\xc4\xb3\x12\x69\x7c\xb8\x4b\x0c\x88\xca\xf3\x59\xf4\xcb\x56\x0e\xd0\x80\xa5\x8c\xcd\x5c\xc1\x58\x62\x5f\x36\x75\x0e\x22\x4d\x58\x31\x3b\xe6\x3d\x07\xe9\x39\x10\x40\x2f\xd1\xaf\x62\x12\x5a\xd9\xf2\xb4\x62\x2a\xae\x98\xfe\xd3\xb3\x33\xfc\xfb\xb7\xbf\x82\xe9\xe5\x06\xe9\xdd\xb6\x07\xaa\x01\x2b\x01\x0b\xb5\x05\x51\xe7\xaa\x0e\xd8\x79\x34\x26\x89\x66\x88\xe2\x81\x54\xcd\xd0\xe7\x00\xd9\x0a\xcf\x90\xb7\x1d\x07\x18\xc0\xf9\x04\x5c\xa8\x9f\xa3\x52\xfc\x86\x0a\x10\xa0\xec\x15\x55\x14\x81\xb8\xfd\xca\x56\x2b\xae\x3f\x65\xab\x77\xd7\x03\x14\xc8\xcb\x35\x7f\x7c\xac\xad\xab\x01\x0f\x85\x96\x71\x39\x5b\x18\x5b\x5c\x96\x5d\x9d\x83\x54\x53\x5e\xcc\x9a\x95\x15\x07\x39\x88\x02\x02\x3c\x4c\xcf\x81\x69\xf6\x3d\x73\x45\xbb\x5d\x7e\xd9\xf8\xed\x7f\x8a\xfe\x5d\xf4\x87\x2d\xe7\xe0\xd5\xdb\x65\x37\xf4\xea\x56\x28\xb8\x09\xcc\xdd\x4a\x9b\x1f\x13\x1e\xf2\x12\x40\x90\xca\xd0\x07\x5f\x50\x90\x29\x9c\x96\x59\x15\x78\x29\x93\xc2\x87\xdc\xfb\xf5\xe6\x66\x0a\xf9\x41\x9f\x99\xb4\x8a\x19\x98\xe7\xdc\xa3\x93\x21\x22\x8c\x0f\x48\xa9\xa4\x0f\x7e\x98\xdb\x61\xab\x0f\x3e\xfd\x33\x71\x24\x27\x0f\x28\xc8\x45\x68\x83\x81\x0c\x14\x9a\xa4\x65\xd6\x06\x56\xc9\x84\xf8\xf9\xec\xfd\xf6\x62\x34\x9f\xbf\xc2\x71\xd6\xdf\xc7\xe1\xae\x38\x5e\x3f\xc6\xf1\xe7\x38\x3e\x3e\x72\x3f\x7c\x0b\xc4\x95\x40\x01\x22\x83\x0b\x1c\x0a\x20\x5c\x9e\x65\x65\x36\x84\xa2\x51\x89\xf3\x73\xed\x7d\xcc\xe6\x7a\xf9\x6c\x48\x34\x35\x30\x2f\x70\xfe\x5d\x28\xbb\x84\xfc\xb3\x71\x90\x12\x78\x20\xe4\x72\xa4\x44\x12\xd8\x32\xcf\xb3\x32\x1f\xe7\x53\xab\x93\xde\xcf\xca\xfb\xd8\xcd\x6a\xf9\x5c\x71\x30\x5d\x14\xbf\x86\x23\x89\x44\x52\xae\xb5\x59\x7f\xb3\xaa\x35\x47\xe0\xb0\xbf\x7f\xfb\xf1\xd3\xb3\x1a\xa2\x2d\xc6\x6c\xac\x88\xe0\xa6\x2a\xbc\xbf\x7f\xbb\x1b\x7c\x18\x05\x28\xc6\xfc\xcc\x84\xe9\x85\xcd\xf2\x24\xc3\xdc\x11\x18\x86\x0c\x2e\xbe\x43\xc2\xf0\x39\x6f\xbc\x28\x6b\x50\xa2\x21\x9c\x29\x80\x3b\xa3\x88\xc1\x4e\x71\x22\x4c\x05\x61\xa1\x39\x83\x98\x70\xca\xa4\x73\x71\x41\xb8\x96\x24\x9c\x8d\xa0\x25\x89\x56\x6c\xf9\x3a\xa7\x6e\xd8\x9e\xe1\x79\x54\xb9\x7b\xfb\xe9\x8a\xf6\xdd\x33\x6c\x49\xed\x37\x34\x25\x45\x61\xc8\x7a\x60\x59\xf0\x83\x0e\x92\x03\xa8\x45\x36\x0a\x6e\xbb\xb9\x6b\x9c\x2c\xab\x47\x68\x07\x8d\x60\x61\x95\x42\x8c\xab\x13\xf7\x6a\xe8\x94\xa1\x8a\xd7\x8e\xc9\xaa\x61\xd2\x28\x1e\x4a\x67\x44\x29\xb6\x1c\x26\x11\x77\x2b\x2f\xe2\x8d\x41\xe7\x39\xb6\x1f\x6e\xd8\x3e\x7e\x7a\xb3\x3d\x49\xff\x26\x38\xc3\x43\xd9\xab\x20\x38\x80\x43\x36\xe2\x8c\x42\xdb\xcf\x5d\xed\x94\xaf\x40\x83\xc6\x30\x51\x80\x0f\x1a\x21\x64\x8d\x82\x42\xe8\x4b\xc4\xbd\x1e\x07\x63\xd9\xd0\x88\x82\x42\xd9\xd6\xeb\x38\x07\xed\x8c\xac\xc4\xf6\x46\x7e\xbe\xde\x77\x66\xd1\x4f\x57\x35\xd7\x5b\x56\xd5\x96\x44\xf6\xf1\xd3\x75\x30\xe3\xfd\x7d\xf4\x7b\xf0\xfe\xc5\x8f\x5b\x0a\xf0\x7a\x9b\xb7\x67\x94\xbb\x9a\xfb\x1c\xc6\x19\xc7\x9e\xa2\x07\xe3\x94\x34\x26\x1e\x75\xe8\x38\xa8\xca\x54\x03\x64\xcf\xf3\xd9\x50\xeb\xec\xae\xea\x5b\x0a\x0c\xf0\xb9\xb5\x65\x1a\x46\x8d\xea\x06\x08\x5d\x99\x46\x7f\xee\x43\x3d\x38\x40\xc0\x7a\x35\x8b\x50\x20\x93\x1d\x63\xcb\x4f\x93\xdc\xb4\x5d\xa3\x65\xcd\xab\x12\xbc\xb2\x41\x2d\xde\x7f\xe5\x64\x02\x8f\x5a\x2f\x1f\xee\x3e\xec\xf6\xf7\xc5\x41\xb0\x70\x0a\x75\x42\x1e\xce\xa7\x18\xd1\xf9\x74\x89\xea\x30\x85\x82\xc6\xe9\x38\xa3\x04\x86\x53\xe8\x51\xec\x13\x6c\x61\xee\xdc\x49\x7b\x05\xa2\xe0\x81\x09\x13\xd7\x76\x72\x66\x7d\x32\x8d\x76\x31\xbf\xb0\x75\xdc\x7e\x17\xbd\xfa\x76\xe4\x16\x13\x3d\x33\xcb\x8b\x0f\xef\x5f\xdd\xcc\x12\x27\xf7\x3f\xec\x86\xc5\x22\x82\x2b\x2d\x70\xc8\x89\xd5\x4d\x68\x15\x71\x44\xc6\x93\x59\xb6\x75\xbd\x4f\x2d\x40\xfa\x3c\x53\x27\x2a\x5f\x1d\x34\xd2\xc6\x9d\x5b\xde\xf8\x7e\xd0\x80\x80\x7c\xe5\x38\x7a\xc0\xc1\x9e\x2d\x50\x71\xde\xb6\x84\x86\xf4\xec\x4f\x71\x27\x42\x19\x1a\x05\xb6\x3c\x9d\xfa\xa2\x8e\x3e\x66\x2b\x07\xca\x8b\x67\x1c\x28\xcf\x6e\x5a\x9f\x33\xa1\xac\x29\x62\x8d\xa4\x06\xcb\xd0\xdb\x9c\x59\x9e\x44\x02\x39\xc4\x03\xb5\x4c\xc0\xd4\xa4\xa8\x68\x1c\x8d\x99\x2d\x59\xe9\x69\x71\xea\x69\xd7\x77\x27\x74\x6e\x8b\xa0\x08\x76\x45\x8b\x21\xe6\xd1\x6e\xd5\xbb\xb0\x07\x1d\xfd\x55\xf4\xe3\xca\x50\x70\xe3\x70\xb8\x9a\xe6\xe3\xfd\x66\x9a\x65\xe5\x7a\xf9\x7e\x4b\x9b\xb9\xf9\x8b\x2b\x80\x63\x06\x16\xa1\x87\x58\x8b\x8e\x15\xb6\xa0\x31\x64\x23\x07\x28\x77\x59\x5e\xb6\xa4\x0f\x94\x2b\x2b\xfd\x41\x43\xa7\xe1\x08\x95\xf2\x82\xb7\xed\x4a\x0b\x3c\xab\x91\x6b\x01\x06\x2d\x27\x6e\x25\x68\xd9\xc9\xa9\x35\xff\x30\x5e\xdf\xd7\x5c\x3c\xae\x75\xc4\x8f\x8a\x60\x87\xe3\x23\x45\xeb\xdb\xf5\xb2\x69\x05\xc8\xe3\x52\x54\x34\x19\x82\x95\x4d\x2c\x4c\x28\x43\x17\xea\x79\xe0\xa0\x06\xf9\x25\x1a\x4a\x33\x0f\x49\x7b\xe6\xf3\x28\x44\xcc\x6d\x21\xdd\xa8\x2b\xab\xb9\xc7\x65\xc1\x08\x32\x36\x0c\xba\xd6\x3c\x8a\xc1\x39\x8a\x92\x6a\x3f\xac\xf6\xbf\xda\xfe\xe5\xea\x00\xf1\xa0\xa9\x23\xba\xb7\xa2\xf1\xcd\x7e\x58\x87\x73\xd6\x32\x54\xa1\x55\xd7\xbb\x19\x7d\x61\x47\x1b\xeb\xe8\xdf\xac\xf9\xed\xef\x5f\x3d\xcb\xbe\xb8\x7f\xf5\x4c\x5a\x02\xdc\xbd\xda\xde\x18\x76\xbc\xcc\xf3\xbe\x56\xe5\xb4\x56\x91\xbb\x81\x49\xc9\x0b\x21\x8b\x6c\xae\x41\x5f\x05\x8d\x00\x31\xa1\x8f\x75\x57\xe4\xcc\x0a\xc3\x1b\x66\xf5\xd4\x6b\x56\xb8\x22\x27\xa0\x33\x41\x1b\x23\x41\x11\x01\x60\xd7\x7a\x2c\xbb\xe5\xb8\xee\xf6\x2b\xc3\xd5\x8d\xf4\xed\x89\xe5\x6a\x7f\xff\xee\xc3\xf2\x59\x86\xf1\x20\x70\x38\x87\x21\x56\xd9\x6c\xe2\x36\x9b\x91\x6a\x41\xc4\x32\x9b\x9b\x50\x87\xce\xcd\x7d\x1e\xd3\x90\x65\x71\xd4\x8f\x28\x96\xb1\x55\xa8\x60\x4c\x73\xce\x0d\xcf\x8b\x7c\x63\x4b\xe1\x90\x1a\xc6\xc8\xb2\x43\xc9\x34\xda\xea\x17\xe9\x51\x25\x38\xfa\x17\xeb\x8b\xe2\xab\x2c\xb9\xff\xf8\x7b\x70\x54\xbf\x64\x8d\xa9\x12\x6c\xa7\x50\x87\x5e\x9c\x00\x02\xea\xa6\xa7\x4a\x8f\x32\xc9\xbe\xfa\xbe\xfc\x25\xab\x8c\x4b\x32\xd7\xac\xdf\x3f\x03\x08\xe8\x35\x7f\x34\x61\xd7\xda\xf2\xbf\x5e\x5f\x2d\x17\x9f\x78\xf3\x65\x45\xee\x63\x6d\xf9\xbb\xe7\x45\xfb\xcf\x04\x3f\xaf\xfb\xd4\x7d\xea\x8a\xb8\xd0\xd0\x9a\x0a\xb7\x65\xd3\xb3\xc1\x31\x82\xa9\xf0\x15\x11\x02\xfe\x42\x01\x2a\x57\x71\x64\x19\x7c\xe7\x98\xb1\xa5\xe9\x04\x48\xf5\xfa\x9b\xfe\x60\x20\x37\xa5\x61\xc8\x22\x6d\x90\x41\x82\x29\x46\x45\x9d\x2b\xce\xb4\x55\x4a\x2b\x9d\x71\x2e\x39\x6d\x1a\xc3\x34\xb7\x5a\x45\xfb\xa8\x5c\xfa\xba\x53\x51\x1a\xfd\xd5\x4d\x75\xe2\xe5\x2d\xfc\x6c\x24\x47\xe0\x6e\x4d\x05\xfd\x71\xcd\x4a\xde\x5e\xfe\xb6\xdf\xaf\xca\x2c\xed\xc1\x50\x6d\x19\xfa\x85\x02\xdf\x55\xa2\xee\x42\x9d\x08\x92\x96\x30\xae\xe6\xa8\x9f\x2b\x03\xc6\x69\xce\xa7\xae\x14\x75\x9b\x9c\x00\x04\x91\x39\x85\x71\xa7\x9c\x73\x4c\x28\x24\xb4\x36\x3c\x30\xe9\x40\x16\x06\x2d\x7d\x98\x9c\x95\x0d\x38\xf3\xf5\xf7\x54\x5a\xeb\x44\xb4\xf1\xcd\x8b\xb5\x0e\xfa\x5f\x44\xbf\x5f\xf3\x6b\xde\xbf\xb8\x9a\xed\xdd\x57\x57\x8b\xdb\xfc\x88\x2b\xe7\xce\x1d\x05\xb8\x07\x19\x70\x7e\x55\x51\x14\x0f\x15\x10\x41\xcd\xa6\xb4\xca\xf9\x83\x7e\x98\x7a\x85\x1d\x97\xcd\x34\xd9\x93\xb5\x27\x80\x84\xd9\x9a\x8b\x00\x88\x2e\xf4\x30\x26\xd1\x96\x67\x7c\x6d\x61\x25\x62\x5e\x0e\xb6\xdb\x71\xae\x07\x93\x07\x43\x80\xc0\x80\x4c\x86\x53\x98\xfc\x14\x2c\x07\x65\x1b\x54\x4c\xda\xd6\xc1\xa6\x76\x7d\x19\x28\x38\x5f\xa2\xda\xb5\xfd\xda\x8f\xfe\x42\x8f\x45\x62\xa2\xbf\x8d\xfe\x3e\xfa\xb0\xf8\x4a\xb4\x7f\xac\x68\x38\x1c\xbf\x50\x70\xb8\xbb\xff\xf8\x69\x69\xe9\xf5\x4a\x16\xba\x2e\xd6\xb7\x77\xad\xc8\x05\x17\x2c\x38\x81\x08\xe1\x35\x75\xa7\xeb\x98\x59\x35\x16\x70\xe8\x43\x9f\x77\x63\x38\xe5\x20\xf3\x65\x5b\xf9\xd6\x86\x54\xb5\x61\x12\xe7\xc4\x9c\x26\x7e\x3a\x25\x48\x84\x93\xce\x09\x25\xa4\xee\xa8\x2e\xf2\x51\xf2\xdc\x17\xb4\x2d\x4a\x24\x0b\xed\x4a\xe4\x79\x5a\xb0\x79\xe0\x56\x58\x22\xb1\xf6\x8e\xae\x75\xd7\xc3\x05\x1f\xaa\xc4\xad\x2c\xee\xdb\x5b\xeb\x7f\x79\x5a\xaf\x6e\x77\x0f\x6b\x55\xde\xab\x37\x5b\x55\xe0\x8b\x75\x8c\xf6\x4b\x38\xfc\x1d\x78\x22\x14\xbc\x7b\xf5\xe3\xbb\x57\x77\x1f\x12\xe4\xf2\x1c\x34\x98\x80\x81\x52\xaa\xf2\x0a\x06\xe2\x82\x80\x8d\x1a\x31\x11\xc0\x02\x4f\x71\x28\x39\xe4\xc0\x04\x13\x67\xa0\x7d\x80\xc0\x6e\x3f\x25\xae\x28\x72\x4e\xd0\x2c\x28\x4b\x4d\x21\xea\xda\x69\x65\x40\x51\x15\xb9\xf2\x0c\x62\xf6\xff\xb2\xf6\xf7\x50\x92\xeb\x5a\x7a\x20\xca\x4d\x46\x46\x52\x52\x4b\xcd\x3c\x75\xea\x16\x5b\xfd\x5a\xcd\x54\x9e\x73\x8b\xfd\x5e\x4b\x82\x6e\xaa\xaa\xa8\xa7\xf7\xd4\x18\xcd\x8c\x06\xa3\x59\x33\x0b\x26\xbc\xc1\x5a\xe3\x60\x3c\x98\x30\x61\xc2\x84\x09\x93\x26\x4d\x9a\x34\x69\xd2\xa4\x49\x33\xcc\x30\x69\xc6\x3d\x15\x44\xce\x22\x18\x91\x3f\xe7\xef\x9e\x2b\xe9\xd4\x89\xac\xcc\xc8\x5a\x81\x8d\x8d\x4d\x60\xef\x8d\xbd\xbf\x2f\x3b\x70\xce\xfd\x20\xca\xac\x12\x22\xba\x01\xf2\x84\xf7\x7d\xd2\x5f\xf8\x6f\xfe\x6a\xeb\x4c\xbb\x76\x89\x5f\x3b\xc5\x6f\x2e\xbe\xed\x87\xd5\x8e\x48\x2c\xb3\x22\xe0\x3d\xfe\x60\xf0\x4d\xf4\x35\xda\x5e\xf5\xb9\xac\xeb\x64\x3a\x97\x49\x15\xe8\x3b\x24\x95\x81\xe7\x9e\x60\x68\x66\x1d\xea\x7a\xbb\x27\x7c\x8b\x77\x2c\x74\xd3\x6e\xfd\xe9\x11\xdc\x3f\x37\x31\x7e\xba\xff\xfc\xe5\xe1\x66\x1d\xe1\xfe\x15\x36\xdc\xc3\xa7\xfb\x8f\x5f\x1e\x56\x03\x0e\x70\x90\xb7\xf7\x9f\x62\x0c\x69\x61\xd3\x0c\x0e\x50\xfd\x90\xc2\x29\xcf\x0e\x40\xa0\xf1\x66\xe9\x6e\xb2\x65\x8c\x8f\x4b\x1e\xcf\x4b\x56\x2f\xb2\xac\x54\x7c\x5a\x7a\x97\x1c\xcf\x79\x85\xe2\x2c\x99\x45\x51\x16\xa3\x10\x08\x71\xbe\x3a\x22\x44\x50\x69\xed\xc6\x31\xe2\x0d\xa5\x51\x12\xcd\x4f\xec\xb6\xd8\xa5\xd1\xdf\x45\x8f\xa1\xd7\xf2\xf9\x19\x7a\xbd\x6f\xbd\xfd\x61\xeb\x6d\x85\x6b\xf7\xe7\xdf\xc4\xa1\xb7\xff\x17\xfe\x75\xd2\x5b\xe0\xbe\x8e\x47\x5f\x65\xb9\xa0\x0c\x33\xcc\x2b\x55\x79\x96\x65\x82\x32\xc2\x30\x47\x12\x7b\x02\x95\x81\x2c\x56\xd6\xfe\x70\xb2\x3b\x75\xcc\x32\x49\xb6\x7f\x2a\xb0\x17\x69\x26\x08\x0d\xff\x54\xe0\x5d\xca\x14\x53\x45\x8e\x2a\x86\x11\x2e\x79\xc5\x5e\xbe\x47\x5c\xf5\xbd\x37\xcd\x42\xca\xd8\xd4\xea\x74\xca\xb3\x0a\x6d\xbf\x2a\xd9\xcb\xf7\x88\x46\x71\x24\x92\xe2\xb6\xd9\xdb\xe8\xe6\x82\x17\x7c\xfb\xfb\x8f\xb7\x17\x7e\xb2\x37\xd1\x71\x38\x20\xef\xf7\x17\xf4\xe0\x2f\xf7\x71\xca\xb1\x41\x7c\x8c\x1d\xa9\x6c\xb9\xc6\x2e\x0e\x61\xa0\x67\x83\xd0\xae\xf0\x6c\x80\x94\xfa\xfa\xb4\x1c\x67\xdf\x91\xbe\xf6\x1d\x9c\xf4\x32\xec\x2d\x21\x94\xe2\x5a\xa8\x8a\x51\x2e\x2b\x4a\x14\xae\x14\x43\x86\x75\x1d\xb7\xd5\x86\x09\xba\xca\x24\x6e\x9b\xbd\xde\xfc\xbf\x77\x3f\x92\xe6\xa7\xc2\xac\x0e\x46\x10\xbc\x8f\x0d\xc5\xb6\xac\x0e\x86\xba\x8a\x82\x38\x6b\xbe\x2b\x3d\xeb\x20\x27\xab\x2c\xc3\xd1\xf7\xb8\xb1\xfe\x00\x07\x44\x97\x03\x30\x89\x35\x96\x37\x6d\x10\x24\xf0\x5f\x4a\x2e\x38\xd2\xac\xab\xa9\x29\xb1\xc8\x09\x60\x5c\xd1\x0a\x07\x99\xe0\x18\x64\x0a\xbe\xfa\x95\x8f\xeb\x57\x34\xf4\x4a\xa8\x1a\x57\x16\x21\x48\x25\x76\x15\x01\x7e\xb6\x18\xef\x2a\x8f\x07\x28\x98\x37\xd3\x32\x1e\xfd\x40\xa6\xc6\xbb\x38\xaa\xd8\xd2\x5e\xc5\x22\xb6\xa9\x8c\x32\xae\xd2\xc2\x4a\x6e\x2c\x71\x7a\x3e\x69\xcb\xac\xa9\x1c\xf4\x4c\x12\xc1\x82\x5c\x31\xfa\x6f\x91\xab\x44\x10\x5d\xe5\x32\xd5\x2a\x17\xe9\xa0\x64\xde\x1d\x37\xb9\xc6\xda\x37\x71\x44\xf0\xd2\x5d\xe5\xe2\xc6\x55\x4a\x2a\x5b\x49\x6e\x39\xb3\x12\xd7\x6a\x3a\x28\x4b\x95\xa5\x02\x1a\xca\x29\xa7\xeb\x33\xcf\x9f\xc8\xed\xb0\x97\xc1\x47\xfb\x7f\x45\xdf\x6d\x7b\x7b\xfc\xc2\x17\xf1\xdc\x8c\x75\x25\x97\x7e\xcc\xd6\xdf\x7e\x03\x01\x2c\xf3\x19\x03\xf7\xf7\x9f\x40\x2b\xde\xab\x11\x86\x56\x4b\xdd\x36\x96\x19\xe4\x7b\x5f\x97\x93\xab\x8d\xed\x07\x54\x79\x57\x8b\x46\x2a\x01\x55\x4d\x0f\xb1\xa8\x8a\xc2\x95\x6e\x21\xbe\x51\x7b\x89\xfd\xb1\xa7\xd3\xb1\xe9\xd4\xd4\x7a\xd1\x0e\x54\x54\xb9\x09\xac\xd3\xb3\xca\x0a\x4a\xbc\xf0\xda\xf7\x56\x33\x28\x80\x2d\x6d\x59\xe4\x99\x65\x0d\x09\x80\x9e\xb0\x8b\xa2\xfa\xd6\xec\xc9\xb5\x87\xeb\xea\xaf\xbd\xf5\xec\xef\x56\x5f\xed\xf6\xea\xaf\x1d\x70\xd3\x82\xcc\xbc\x86\x36\xf3\x98\x5a\x9c\x99\xbc\x2a\x67\x47\xfd\x21\x03\x74\xcc\x21\x12\x12\x81\xde\x13\x55\x95\x13\xb2\xd5\xa9\xb2\x95\x9f\x31\x6e\xcb\x03\x46\x98\x41\x59\xda\xf2\x54\xd8\x72\xca\x33\x83\xd6\x58\x63\x0c\xb8\x52\x32\xfa\x27\xe1\x9c\xff\xfe\x8a\xa0\xb9\xdd\x53\x7d\x78\x7c\xcd\x86\xb6\xa1\x2d\x5e\x62\x11\xbe\x01\x30\x99\x33\x07\x95\xd6\x5c\x33\x52\x32\x86\xca\xce\x48\xad\x4c\xcc\x1c\xb3\xd4\xec\xa5\x3f\x39\x7f\x72\x6e\x5e\x84\xe6\x45\x53\x14\x24\xce\x89\x1f\x5a\x31\x40\x34\xce\xf4\x38\x6d\xfe\x5c\xf5\xc4\x92\xd3\x5e\x46\xef\xa3\xbf\x8f\xfe\xd3\x15\xd1\xee\x52\x91\xf3\xf9\xcb\xc6\x7f\xf7\x90\x3c\x7e\x79\xfc\xf6\xf6\x31\xbb\xbc\x7d\xf7\x10\xd2\xdd\x0f\xdf\x3f\x7e\x79\xfc\xe9\xbb\x1d\x44\x16\x68\x26\xb8\x2a\x4d\x51\xa6\x7d\xe9\x8f\xfc\x58\xce\x95\x48\x55\xda\x13\x5e\xe5\x34\xcf\x69\xd6\x72\x97\x71\x98\x78\xaa\xd2\x81\x88\xaa\x60\x79\x4e\xf2\x96\xd7\x29\xbb\xb1\x87\x83\xb7\x9d\x11\x9d\x1f\xac\x90\xf3\x22\x7a\xc1\x96\xa9\xd3\x02\xb4\xaf\x0e\x6c\x00\xa3\xfa\x7e\x39\xf4\xe1\x0d\x7c\x64\x23\xe8\xe8\x99\x0b\x43\xef\x86\xd0\x8b\xfd\xb0\xd5\x0f\x3c\xc3\x55\xbf\x61\x96\xf8\xbb\x70\x77\x04\x8f\xab\x73\xb3\x7a\x57\x6d\x7c\xca\x0b\x8b\xca\x24\xf2\x9a\x4d\x90\x43\x5f\x2e\x27\x5f\xfb\xde\x67\x78\x8d\x60\xea\xde\x0f\x70\x32\xc3\xc4\x17\xe2\x52\x4f\x18\xa8\x58\xd5\xf5\xae\x0c\x64\x90\xa6\xd5\x22\xb7\x59\xa3\xa8\xc1\x8c\x4d\x86\x73\xb3\x4c\xcb\x09\x99\x1c\xcc\x72\x88\x76\xf1\x14\x7a\xdf\x4d\x90\xeb\xfe\x0d\x8f\xc3\xc3\x5b\x94\xae\x0d\x7c\x19\x02\x13\xff\xfb\xec\xe6\xe3\x77\x77\x49\x0e\x53\x51\x6a\x82\x60\xe4\xaa\x69\x66\x1c\x88\x4c\x8e\x1c\xa2\xa6\x56\x36\xae\x1a\xbe\x9c\x04\xd0\xba\x5e\x8e\xb5\x1f\x0d\xe4\x37\x43\x55\x51\x26\x5c\x6f\x18\x5a\xf7\x17\x6a\x08\x35\xfd\x2c\xb5\x59\x0e\xe7\x21\xa9\x66\x6f\x8f\x62\x0c\x18\xe4\xa1\x9e\x5a\x04\xfe\xf5\x10\xe1\xad\xd6\x17\x50\x1d\x5e\xee\x4f\x2e\x65\xfb\x01\xe9\xb3\xa8\xa1\x6e\xce\x63\x82\xce\xa7\x24\x3d\x4f\x60\xfd\x41\x51\x87\x75\x42\x1b\x26\x8c\xd8\xab\x45\x7d\x65\xd2\x41\xb5\xfe\x1f\xe3\x7e\x62\x53\x4f\x2b\x7f\x6a\xe9\x78\xc1\xa4\xfa\xed\x63\x45\x35\xf4\xcd\xd9\x26\xf2\xdc\x25\xe4\xec\xa0\xf5\x9d\x65\x8e\xda\xc4\x35\x5c\x5a\xf5\x27\xc6\x6a\x43\xcf\xa1\x0e\xbc\x9c\xe5\x4f\x98\x39\x1f\xae\x30\x00\x9b\xb9\x7e\x7a\xfc\xfc\xe9\xee\x01\xee\x1e\xee\xde\xef\x9c\xa2\x16\xcb\x22\x8e\x38\x69\x28\x1b\x9b\x61\x70\x33\x9a\xd5\x80\xc6\x29\xed\xe2\xea\xb8\xd7\x4a\x53\xad\xfc\xa1\xed\xab\xd6\x38\x4f\xdc\x52\xc4\x07\x9f\xce\x6a\x80\xc6\x11\x02\x65\xe8\x48\xee\x2f\xb8\x61\x45\xc0\x7a\x50\xd1\x4d\xc0\x40\x7c\xc3\x70\xfa\x70\x45\xae\x8a\xaf\x55\xe2\x0f\x9f\xee\x3f\x27\x77\xf7\x77\x3b\xc6\xb1\xc3\x2c\xb6\x0d\x16\x90\x8d\x10\x3d\x45\xb5\x1f\x4b\x7f\xe0\xc7\xd2\x9f\x20\x9b\x62\xa2\x4a\x3f\xed\x95\xb6\xa4\x56\xb8\xe8\x9c\xf5\x38\xf4\x33\xf9\xe8\xa0\x7b\xa8\x2d\xf4\xb6\x3b\x9f\xa0\xf7\x38\x4a\x42\xae\xd3\xed\x65\xb8\x3b\xfb\x7e\xdb\xeb\x5e\x54\xb0\x01\x92\x3e\x6c\x5e\x4e\x18\x7d\x6b\xd4\xd8\x8b\x96\xb0\x53\x7f\x3c\xd6\x7e\x2e\xfd\xc0\x21\x2a\xe7\xd3\x10\x67\x32\xf7\x27\xbd\x8a\xc7\xf7\xb2\x6a\xb4\xfb\xc9\xc0\xae\xdd\x06\x4e\x1a\xa9\x89\x91\x51\x12\xb8\x1d\x7e\x83\x0e\xbe\xbb\xa6\x58\x37\x29\x66\x4e\x1a\xcc\xe3\xb9\x21\x0c\xd2\xd3\x1a\x05\xd6\xde\x55\xbe\x16\x50\x20\x3f\x41\xf5\x14\xc5\x93\x22\xbe\xde\x2b\x65\x89\x93\xa4\x6a\xcd\xcf\x68\xa1\x3f\xcf\x41\x0b\xeb\x5a\x64\x17\x8c\xb1\xbf\x0e\x91\xdf\x0b\x07\xf7\x8f\x55\x71\xbf\xda\xc2\x7d\x76\xbb\x29\x22\x51\x71\x25\x69\xcb\x38\xa4\xe3\xe9\x54\xfb\x43\xe9\x7b\x01\x69\x79\x82\x74\x8a\x8d\x9f\x53\xc5\x89\xab\xc4\x4d\xf6\xd6\x20\x36\x11\x36\x8a\xfd\xce\x5b\x92\x74\xca\x61\xa7\xa2\x28\x09\x1c\xf5\xcd\x8f\xf3\xaa\x6f\x35\xb1\xae\xc5\xa7\xb0\x22\xef\xee\xee\xef\xbe\xbd\x88\xb2\xcf\x5b\xc6\x80\x1e\xa0\xf0\x87\xda\xd7\x95\xef\x24\xe4\xe8\x04\x69\x3a\xc6\x84\xe7\xbe\x4d\x19\x47\x0d\x62\x7b\x85\x56\x49\xa8\x5b\xf2\xf8\xe8\xa3\x59\x8d\xd0\x38\x4c\xa0\x74\xcd\x92\x41\xeb\xfb\xaa\x4a\x9c\x34\x95\x95\xa1\x3f\x37\x7a\xc2\xb7\xea\x26\x0f\xcf\xca\xdf\xfd\x84\x85\xf7\x22\xd5\xed\x66\xa3\x17\x96\xd7\x24\x94\x6d\x26\x8a\x52\x45\x58\x92\x19\x42\xa0\xf2\x07\x60\xbe\xa9\xbd\xae\x66\x39\x94\xbe\x01\x91\xfa\x63\x7c\xd0\x95\xb7\xe9\x4d\x4e\x25\x17\x82\x50\xcd\x9c\x6f\xdd\x72\x88\x0b\x6f\x5a\xe5\x20\x77\x18\x8f\xce\x2e\x06\xe8\xb1\xda\xf0\x34\x60\x7e\x32\x37\x73\xd2\x5d\xcf\xc3\x57\xa8\x28\x8f\xef\xef\x5f\xc5\xe5\xab\x8e\xae\xf1\x6f\x39\x20\xac\x59\xd5\xf3\x4a\x23\x54\x7b\x9d\xc1\xe4\x73\xea\x0d\x06\x84\xbd\x06\x97\x79\x1b\x2b\x6b\x84\x6e\xe2\xee\x05\xc8\x44\x0b\xaa\x7d\x5b\x2a\x34\x6a\x2a\xbc\xa1\x52\x6e\x3c\x54\xf1\x4e\x47\x26\xe4\x29\x5f\xf1\xc2\x26\xf7\x1b\x54\xfc\x05\x66\x69\x3d\x51\xb6\x8c\xc6\xd6\x13\x7c\x63\x70\xae\x0a\xac\xa0\xf2\x27\x50\xb8\x34\x39\xae\xfd\x11\x2a\xdf\xa7\xbd\x16\x4a\xf3\x41\x43\x16\x9e\x5a\xa1\x4b\x2d\x16\x35\x1b\x5b\x23\x65\xcc\x6c\xf3\x7c\xe8\xdd\xa1\xf1\x53\xcf\x21\x0a\xf8\x10\x91\x7b\xc2\x3b\xbe\x17\x6f\xc7\xbf\x7b\x35\xfe\xba\x30\xdf\xde\x7e\xf3\xe1\x36\xfe\xb8\x61\x8c\xc0\xc8\x4a\x8b\xa8\x03\xed\x3b\x38\x30\x54\x23\x7a\xf4\x0a\xac\xe7\xe9\xa9\x93\x4d\xc7\xfd\x6c\x00\x63\x6f\xf7\x42\x5b\xe4\xd4\xf9\x08\x95\x6b\x7b\xd4\x38\xe7\x87\x3a\xcf\x9f\xa2\x53\x0d\xc5\xe4\xed\x53\x24\xa0\x0a\x65\x02\x51\x1c\xd7\x91\xba\x15\x7b\xf3\xb2\x73\x5c\x6c\x62\xff\x3e\xa4\x43\x9e\xd1\x8c\x83\x6a\x2e\xd1\xfa\xa9\xae\x04\x94\xbe\x8c\x8b\x65\x4c\x61\xf5\x40\x67\x7f\x52\x5e\x73\x68\xb0\xcf\xe3\x28\xf5\x38\xe6\xc2\x13\x5e\xd9\x8a\xef\x0d\xaa\x9d\xf3\x07\x97\x65\xdd\x6c\x0e\xad\x5f\xd5\x02\xa5\x43\xb3\x73\xbd\x50\x4c\x89\x20\x87\x78\xc2\x37\x64\x2f\x2f\x4f\xee\xb6\x59\x5d\xf6\xf2\xf7\x17\xee\xc4\x97\xb5\x78\xb8\x30\x84\x1e\xc7\x1e\x52\x8a\x1c\x62\x6e\x4c\x0f\xc7\x34\x6f\x94\x14\x52\x74\x0a\x72\x34\xd8\x80\xd7\x9a\x94\x90\x9b\xfe\x88\x86\xd6\x1c\xf3\xdc\x0a\x51\x5b\xd7\x6a\x3f\xf6\x1c\x30\x74\xc9\x10\xf2\xa3\xc1\x26\xe5\x0d\xdd\x8b\xd7\x3b\xe8\xfd\xdf\xc0\xd5\x06\xe2\x8f\x6f\xf6\xaf\x2d\x51\xbb\x23\x35\xc6\x9d\x3f\x40\xe5\xbb\x74\x74\xd2\x3a\xee\x67\x06\x19\xf1\x33\x94\x4f\x11\x28\x3c\x93\xd2\x95\x64\x2f\xd0\xa1\x75\x07\xe2\xf2\x6c\x9e\x1d\xa4\xa3\x1f\x0e\xf6\x04\xcc\x41\xe9\xa6\xb1\x1e\xd0\x70\x59\x8b\xea\x09\x87\xde\xa7\x9b\xa0\x83\xd7\x27\xda\xba\x28\xe1\xc1\xb8\x16\x4f\x47\xdb\xa2\xdc\xdd\x27\xbd\xa2\x8e\xa8\x2a\xe6\x9a\xb5\x42\x42\xe9\xb3\x34\x66\x4b\x57\x43\x63\xbc\xb0\xad\xe7\x0c\x06\xe5\x8b\x75\x55\xd8\x5e\xdb\x9a\xd5\xd6\x77\xfd\x84\x46\xe7\xfc\x09\x55\xce\xb3\xd1\x4c\xa0\xbd\x3d\x1a\xc8\x40\xb8\x0a\x41\x1a\xc5\x81\x9b\xb0\x0d\xfe\xff\xcf\xf1\x5e\xbf\x7f\x16\xe5\x0a\x7f\x73\xbf\xe3\x9a\x59\xa2\x71\x8c\x38\x6a\x31\x3b\x7a\x01\xa3\x67\x2d\x64\xcc\xcf\x9d\xf6\x9a\x81\x66\x9e\x43\xe7\xd5\x5e\x6a\x47\xad\xf1\xfd\x30\x94\x43\xed\xfc\x89\x3a\x2f\x86\xf6\x00\xad\x57\x4f\x91\x81\x14\x94\x03\x16\xc5\x71\xf6\x24\x6e\xd0\xb3\x4d\xbc\xb2\x88\xb0\x30\xaf\x9e\xcd\xb0\x9b\x5e\x76\x73\x33\x41\xc5\x8a\x1a\x63\x73\x84\xcc\x4f\xb5\x12\x52\xca\x49\x43\x4e\xd6\x7d\x54\xf0\xca\x20\xb6\x23\x6e\xea\xd0\x2c\xdd\x68\x5c\x39\x0e\xeb\xa3\xd9\x8e\x02\x32\x50\x8e\xe0\x78\x56\x86\x1a\x15\xc5\x01\xd7\x60\xd3\xc1\x77\xbf\xbe\x1e\x2f\x4a\x88\x0c\x73\xc4\x90\x58\xc9\xaa\x25\x02\x52\x5f\xa5\x71\xea\xcb\x01\x10\xf3\xc3\x60\xbd\xe2\xe0\x98\xaf\xe0\xe8\xf1\x5e\x9a\xb0\x18\xcf\x6a\x28\x4b\xe7\x79\xd7\x1d\xa0\xf3\x7c\xd5\x43\x7e\xd1\x43\xc0\xa2\x74\x7b\x13\x65\xa1\xfb\xf4\xfd\x0b\xe9\xc9\x05\x26\xfb\x6d\xe9\xdb\xad\x39\x8f\x83\x11\x0c\xda\xa2\xaa\x49\xe9\x25\xa4\x36\x74\x8c\xf3\x73\x07\xcc\x9f\x6e\x3a\xbb\xd4\x3e\xf2\x9a\x1e\x41\x40\x16\xf7\x8c\x20\x2e\x17\x02\x8d\x67\x76\xe9\xad\x8d\x71\x14\xc7\xfd\x13\x0b\x63\xfe\x65\xc8\x4e\xfe\x88\x3d\xfd\x67\x86\xb4\x83\xed\xa1\x2f\x50\x8d\xd7\x11\x0b\x17\xf0\x42\xd5\x59\x83\xf4\x87\x75\xc4\xc6\x67\x5e\x31\x30\x30\xc6\xed\x36\x20\x85\xda\x73\xb7\x0c\xce\xc5\x97\xbe\x87\xe8\x69\xcb\x3b\xff\xa3\xcb\xa8\x2f\x2c\x77\x6f\x4e\xac\xec\x36\x48\xf2\xf9\xa6\xa9\x0a\x30\x5f\xe7\xd5\x7b\x46\xb8\x74\x05\x89\x8b\x16\x71\xc8\xcf\xc6\x19\x13\x13\xbe\xd7\x52\x58\xcb\x98\x77\xca\x21\xa7\x50\x65\x9d\x5d\xe3\xc5\x99\x42\x04\x25\x0c\x6d\x04\x51\xf3\x44\xe2\xe3\x4e\x86\xbc\xe8\xfb\xe4\x77\xaf\xaf\x10\xfe\xdd\xc7\x77\xeb\xd1\x18\x1f\x9d\x53\xba\xc4\x05\xad\x2a\xd4\xd6\x7e\xb6\x3b\x69\x7d\x5b\xd7\x4a\xa5\x75\x8e\x90\x75\x20\xbf\xf2\x9b\x0b\x16\xc6\xf4\x54\xdd\xaa\x5d\x17\xfd\xa3\xe8\x9f\x87\xd5\x7a\x9e\x03\x3c\x9b\xcd\xc7\xff\x08\x9f\xee\x9e\x37\x53\x5e\xe6\x30\x7e\x3d\x40\x93\x15\x40\xeb\x82\x40\x79\xb6\xb5\xa5\x38\x26\xd8\xb7\x28\x37\x39\xda\x75\x94\x6a\x8d\x2b\x7f\xaa\xb8\xd4\xfe\x30\x77\x4c\x35\x1a\xa8\xd6\x4c\x20\x19\xb8\x32\x6f\x12\xf1\x44\x03\xde\xc2\x76\xfb\xff\xf7\x21\x47\xf7\xfe\xfe\x76\x9d\xc0\xab\x1a\xaa\x87\xbb\xc7\x2f\xd7\xa5\x84\x9f\x71\xca\x6f\xa5\x3f\x94\x90\x1d\x88\x0c\x34\xba\xc5\xdc\x17\x7e\xd4\x4e\x81\x06\xe2\xbb\xf0\x6a\x18\xb6\x88\x7a\x6e\x08\xd3\x62\x5f\x59\xb3\x44\xcb\x49\xb2\xcc\x65\x04\xe6\x24\x32\x8b\x5a\x8e\xa1\x8b\x07\xe6\x78\x5e\x9a\xce\x67\xad\xe7\xc3\x11\x9f\xfa\x0a\xf9\x53\x47\xc6\x20\x6f\x88\x97\xba\x3d\x8d\x8a\x80\x03\xbd\x71\xe4\x86\x84\xc7\xdd\x9b\xa2\xaf\xfb\xbb\xc7\xcf\x3f\x91\x38\x79\x95\x88\xb8\xb5\xbe\xce\x0b\xe0\x7e\x26\x9c\xe0\x82\x90\xd2\x8f\x53\x91\x7b\xd3\x99\x06\x9e\x51\xd6\x89\x61\x4e\xd5\xb1\x90\xd4\x12\xb5\xa7\x56\xf0\x25\xf3\x99\xe2\x59\x9d\x71\x18\xe2\x59\xf0\xa5\xf0\x85\x27\x1c\x24\x0c\x89\x5c\x54\xed\x51\xe3\x45\xe9\x8f\x2d\xef\xc6\x6e\x60\x43\x17\xdd\x5c\xfa\x72\xe8\x4f\x75\xfc\x63\x91\x7f\x5d\x62\xe7\x5b\x04\xe4\x29\xc2\x9c\x84\x8e\x2d\x7f\x18\x90\xef\x5a\x5b\x83\x05\xed\xf5\xfa\xe2\x86\xac\x61\x3e\x91\x44\x63\xb9\xa7\x76\x58\xc5\xd5\xec\x2a\xee\xb0\x14\x3e\xf7\x54\x00\x87\xf1\x8d\xb4\x35\xeb\x86\x6e\xa4\x63\xe0\x21\x8e\xfb\xff\xfe\x3a\x66\x41\xc7\x85\x9f\x86\x22\xf7\xf5\x64\x07\x70\xeb\x63\xbc\xbe\x82\x8e\x5d\x2c\x14\xb1\x44\xfe\xb2\x8e\x83\xd4\x3f\xd6\x71\x3b\x5d\x74\x1c\xeb\xff\x7e\x32\xcb\xbc\x04\x13\x92\xc5\xb8\xa4\xac\xf4\xdd\xa1\xcc\xbd\x1e\x4d\x07\x01\x2d\x73\x7d\x95\x46\xd6\xaa\x8d\x75\xe0\xd1\xf9\x15\xbb\x10\x20\xde\xca\x7c\x68\x5e\xec\x22\x70\x11\xad\x32\x6f\x95\x26\xff\x2a\x54\x5c\xfe\xd8\x2e\xd6\xb3\x3a\x50\x07\x67\xf0\x8b\x22\x1b\x5f\x50\x18\xbd\xa3\x92\xb1\x82\xf3\x22\xf7\x0a\x32\xea\xf3\xa7\xc8\x1c\xa1\x0f\x5d\x51\x6c\x69\x52\xa3\x47\x75\x88\x87\x56\x5a\xd1\x5e\x6d\x23\x88\x5c\xe0\xab\x71\xfc\x82\xc8\xfd\xb0\x89\x1c\xdd\x44\xe4\x89\xde\xd2\x3d\xfe\x19\x99\xdf\xc0\x11\x6e\x22\x6f\xc7\xcd\x55\xe6\x77\xaf\xee\xc9\x6f\xe9\x22\x51\x5c\xf9\x92\x0a\x42\x72\xca\x8a\x65\x86\x1a\x2d\x76\xb4\x92\xc1\x90\xf0\x73\xbd\xbe\x2a\x61\x46\xd1\x27\xa4\xef\xe9\xd0\xef\xb1\x51\xcb\x38\x6c\x9c\xd9\x4d\x8c\xd4\x22\x96\xd1\x73\x76\x02\x03\x45\x7c\xf2\x25\xf3\x23\xf7\x33\xad\x85\xa1\x0a\x1b\xeb\x68\x14\xdd\xc0\x29\x60\xf0\x15\xbf\xd5\x2e\x7e\x59\xc9\xcc\xd3\x2c\x07\xe5\x47\x7c\xdd\x2f\x86\x43\x9e\x79\xed\x4f\x66\x86\xe6\x0a\x36\xc3\x0d\xb7\xca\xc5\xbd\xd2\x5a\x98\x7d\x61\x04\x5b\x52\x8f\xd4\x2a\x33\x83\x36\x3e\x71\xbe\x94\xbe\xf4\x7c\x35\xe6\x36\xe1\x8b\xea\x7c\xde\x79\x5e\xfa\xd9\xf1\xba\xb7\x03\xef\x02\xd7\xd2\x6d\x88\x49\xdb\x50\x0f\xf1\x6d\x74\x1f\xfd\x21\xdc\x31\xfd\xc7\xcd\xc3\xfc\xdd\x86\xca\x16\x60\xae\x02\xdd\xf7\x5b\xaa\xf1\xd7\xfc\x12\x6b\xf4\xfa\xee\xf1\xd3\xc3\xdd\xe3\xa7\x87\xd5\x39\xbe\xc9\x5d\x9a\xcd\x50\x32\xce\x97\x9a\x4b\x06\x22\x85\xd9\x18\x09\x83\x25\x8c\x91\x62\x35\xf7\x9e\xf1\xa2\x2c\x70\x89\x26\x63\xa6\x69\x9a\xa0\xd7\x7a\xaf\x50\x9e\x9d\x9c\xab\x08\x67\x8c\x6a\xc8\x5a\x51\x3b\x6f\xcf\x42\x86\x99\x25\xe2\xcc\x19\x4b\x4d\x4a\x5a\xaf\x76\xcc\x4f\xb5\xc7\x0e\xc4\x52\x5c\xf7\x6c\x12\xb0\xfb\x6f\xc2\x6d\xd9\xbf\x0b\x7d\xc4\x41\xa9\x1f\xae\x9d\xdc\xc9\x37\x3f\xed\x48\x7f\x6e\x81\x7e\x07\x97\x86\xc0\x2f\x8f\x77\x0f\xb7\x19\x2e\x15\xc2\x27\x3f\xa7\x59\x85\x34\x95\x55\x99\xa6\x26\xd7\x92\x0a\x4b\x5b\x51\x65\xbe\x6c\x4c\x1d\xf3\xd4\xa5\xcb\x18\xf0\xf7\x94\x37\x5a\xa9\xbd\x66\x9c\x30\x36\x1a\x6f\xa6\xf6\x88\xbc\xf0\x27\xdf\x68\x9d\x7b\x01\xa4\xb5\x6a\x38\x04\xe8\x86\xde\x17\xde\x51\x50\xd0\xc6\x01\x2d\xc7\x4f\xc6\x2d\x93\x81\x7c\xeb\xb5\x89\xa7\x5b\x1e\x62\x9e\xb7\x38\xa0\x2f\xc8\x78\x57\x0e\xbc\xcf\x37\xbc\xad\x2a\xa8\x97\x2c\x96\x8b\x4d\xb2\x3f\x16\x09\x5a\x6c\x2c\x97\x0c\x1a\x54\x19\x8e\xa1\x23\x7b\x5d\x71\x62\x8d\x0d\xff\x19\x4b\x09\x15\x5a\x5e\xb8\x4d\xd8\xad\xdd\xcb\xe8\x9f\x6e\x88\x0d\x3f\xe2\x36\x79\x6b\xb7\xb7\xd6\x2d\xb4\x06\x57\x54\x35\x2e\x97\x3e\x39\x78\x4d\x34\xa3\x39\xe7\xa5\xc7\x37\xc2\xeb\x79\x06\x2d\x79\xa5\xac\xcf\xed\x52\x0a\x96\xd6\x39\x8d\xbb\xe0\x37\x55\xbf\xb1\xf7\xf2\xd3\x9f\x68\x18\x35\x60\x42\xdf\x0e\x38\x2f\x52\x38\xa5\x8c\xd1\xa2\xaa\xd2\xcc\xd7\x35\x28\xee\x9d\x51\x7e\x34\x20\x98\x37\x15\xb0\x00\x19\xad\xe2\x12\x22\xcf\xd2\x29\x7d\x6e\x18\x2d\x8a\xdf\xd4\x31\xba\xee\x41\xcd\x53\x75\x2b\x13\x74\x41\xe6\xfd\x77\xd1\xbf\xbf\xe6\xa6\x3f\x5d\xe2\xdf\xd7\xc5\xb8\xd7\xd4\xc9\x0b\x93\xdb\x63\xb8\x7c\xfd\xfc\xe9\xfe\xe6\xfe\xd3\xfd\xb7\x03\xcc\x35\xd0\x80\x16\x15\x57\x19\x17\x5c\xe6\x8a\xa2\x22\xf3\xdc\x7a\x2d\x3c\x22\xc0\xe5\xba\x2b\x5a\x9f\xc5\x76\xfd\x87\xe5\xd7\x02\x50\xea\x8f\xd0\x00\xf7\x4d\x3c\x31\xb6\x7a\x8a\xcc\x1f\x6d\xa1\x73\x24\x42\x43\xec\x4c\x4c\xd9\x40\x40\xb4\xe6\x7e\x28\x11\x63\x68\xb5\x9f\x84\x85\xda\xc2\x8b\x8f\xfa\x1a\x0c\xfc\xc7\x46\x14\x5b\x8e\xc1\x51\x54\x97\x08\xba\x25\x0a\xfd\x59\xd5\x1f\xa3\x04\x85\xfe\xac\x14\x5a\x54\xed\x15\x17\x4c\x54\xb4\x32\xdc\x70\x13\xbe\x54\x55\x58\xd7\xcd\xa7\xdb\xee\x60\x56\x5f\xf2\x9b\x0f\xb7\x71\xf2\x7d\xa8\x94\x49\x5e\x93\x0e\x5d\x73\x4a\xfb\xaa\xe9\xf5\xd0\xf8\x83\x55\xbd\x1e\xf3\x78\xcc\xb8\xad\x48\xce\x50\x95\x97\x7e\xc6\xbe\xe7\x90\x55\x76\x2f\x7d\x31\x4b\xc8\xe1\x50\x95\x3e\xf2\xb3\x00\xec\xcd\xf9\x38\xe7\x2e\xa7\x2d\x1c\x16\x7d\xd2\x53\x1c\x38\x19\x45\xe2\x02\x4f\xe4\xb7\x97\x9b\xa9\xeb\x6d\x54\xf2\xb0\x2d\x44\x1d\x37\x15\x72\x38\x11\xcb\x3c\x82\x64\x1e\x9f\x4e\x27\x5f\x72\x50\xd3\x72\xbc\x39\x12\x5a\x71\xdb\xd2\x5a\x87\x6c\x96\xd1\x1b\x8f\x6f\xfb\x44\x6e\xf9\x4e\xbd\x8e\x2b\xbf\x7f\xab\xbe\xbb\x00\x70\x7b\xfd\xf3\x39\xc9\x59\x65\x4a\x16\x57\x0d\x42\xd0\x2f\x2a\xe6\x4b\x9d\xa4\xe7\x93\x3b\xcf\x49\xb6\xd4\x31\x5f\x74\x82\xf0\x4e\x11\x46\x19\x21\x48\x32\xdb\xda\xd6\xfa\x03\x14\xe1\x1b\x15\x41\x1c\xf2\xa3\x37\xc5\x65\xc4\xc7\x1f\xaf\xd7\xdb\x01\x7f\xff\x31\xb1\x4a\x1c\x39\x6e\x08\x01\xb1\xb4\x71\xb6\xcc\xeb\xc3\xdf\x2c\x7d\x8c\x7d\x09\xd3\x72\x02\x44\xe8\x4d\x2e\xad\x36\x48\x71\x37\xb8\xde\xad\x5e\x9b\xeb\xdd\xe0\x18\xdd\x62\x8a\x1b\x95\xb0\xcb\x78\x3f\xb1\x8f\xf7\x0f\x2f\xa3\x7d\x7a\xfc\xfd\xc7\x38\x27\x05\xa4\x04\xd5\xa8\x82\xd4\x97\xeb\xd3\xb7\x0e\x5a\x87\x24\x1a\x85\xd6\x17\xa7\x12\x25\x8c\x09\xce\x11\xc5\x5a\x1a\x65\xc7\xd1\x2a\x23\x35\xc5\xcf\x7c\x9e\xd7\x3a\xce\xd7\x39\x9c\xbb\xe7\xc9\x5d\x5f\x97\x43\x70\x4f\x1b\xc6\x01\x7b\x1c\xea\x48\x26\x5f\xd6\xe1\xd4\x53\x60\x3c\x8d\x4b\xe1\xb9\xc0\x16\xf3\x4b\x96\xf1\x18\xfe\x47\x30\x3a\xc8\xd7\xff\x9b\x4e\x1a\x6c\x45\x88\x8f\xb7\x1a\xdb\xdf\x3e\x6e\xd9\xac\x27\xa6\xcf\xa1\xf5\x34\x8e\x7c\x54\xfb\x28\x8e\xb6\x39\xc6\x42\x7a\xcc\xb1\xad\xfe\xe4\xb8\xd0\x07\xfe\xc1\xe2\xcf\xb0\x21\x22\xb1\xab\x44\x7c\x6c\x08\x05\xb3\xd4\x71\xb1\x1c\x62\xb7\x88\x7a\xd1\x71\x60\x3b\x59\xba\x24\xe3\x37\x05\x97\x4c\x72\x8a\x8c\xb4\xa3\x1d\xed\xba\x03\x84\x6f\x6c\x14\x27\xf9\x9f\x3d\x57\xb4\xea\x98\xf8\x2a\xe8\xf8\xe0\x8b\x3a\xd4\x73\xaf\xae\x72\x15\x63\xe1\x05\xab\x0c\xa6\x7f\x62\xae\xbb\x9d\x0c\x39\x08\x1d\xfd\x93\x70\xa7\xf2\xf0\x82\xc5\x14\xc0\x31\x3f\xdc\xde\x3d\xdc\xdd\x7c\xfc\xfe\xee\xf1\xee\x72\xf7\xbf\xfd\x2e\xd3\x45\x5d\xd3\xc6\xd5\x1d\x83\x3c\x8e\xb2\xae\xf6\x2a\x87\xba\xf6\x52\x09\x26\x54\x6a\x24\xd3\x66\xaf\x09\x9d\x95\xb5\xc7\x93\x53\x90\x9e\x89\x29\x3c\x81\x9a\x58\x12\x8f\x0b\x89\x15\xd3\xc2\xf0\x8e\x6b\x69\x79\xb4\x4b\xea\x8b\x1c\x7f\x71\x61\xb5\x8c\xae\xdc\xbe\xc9\xfe\xe6\xe3\x77\xbf\x24\xc8\x4d\x63\xb2\x7c\x9c\xd8\x38\x35\x7e\x66\xc0\x62\x9b\x9d\xea\x65\xce\xe3\xb2\xf6\x65\xad\x85\x71\x79\x6b\x84\x6d\xf6\x9a\x14\xc5\x49\x39\x0d\xe9\xdc\xea\xd3\x99\xda\xd5\xf2\x83\x2c\xc7\x05\xc5\x8a\x2a\xa5\x69\xcd\x94\x36\x3c\xdc\x4d\xd3\xdb\x3a\x16\xd1\x3f\xbe\xe8\xe4\xef\xb6\x7a\xbc\xcb\xdd\xdf\xcd\x6b\x2f\xea\xfb\x9f\x12\x6c\x1e\x10\xd8\x38\x62\x9e\x7a\xe6\x87\x65\x26\x31\x82\xc8\x12\x4d\x70\xc1\x68\x05\x6b\xc8\x45\xf8\x72\x50\xd6\xca\x76\x47\x15\xd1\x58\xc5\x02\xf5\xb2\x96\x87\xd1\xd5\x06\xf9\x3e\xc0\x62\xe3\xde\xd4\x55\xb3\x7a\x4a\x42\x28\x2e\x35\x51\x32\xd4\x14\x0d\x30\xde\xda\xbd\x8d\xfe\x59\xf4\x5d\x84\x22\x1c\xfd\x4f\x11\x89\x22\x78\xfc\x7c\x2d\xac\xfc\xf8\xf9\xcb\xc3\xc7\x37\x89\x86\x6b\x9e\xe1\xe6\xe5\xf8\x78\xb8\x79\x35\x85\x6b\x01\xcf\xfa\x9b\x84\x8e\x45\x6e\x8b\x78\x38\x1f\xea\x91\xd5\x52\xe0\xc1\x71\x8e\xcb\x0c\x57\x55\x37\xfa\x53\x9d\xe8\xb8\xf5\x23\xd4\xe7\x12\x9a\x39\x3e\x32\x8e\x48\xc1\x11\x5a\x3a\x6b\x9f\xcb\xe7\x11\x42\x05\x56\xbd\xe2\x42\xd6\xda\x37\x8d\x91\x2a\xb3\x99\x90\x2d\xd0\x73\xb4\x33\x93\xaa\xa4\xac\x0e\x9e\x52\x9a\xea\x14\xb9\xb8\xaa\xd1\x18\xfa\x1f\xe5\x13\xd9\xa9\x3d\x8d\x6e\x43\xbd\xf3\xc5\x9f\x81\xf7\x37\x97\xa5\xbf\x5f\xe7\xf6\xe9\x55\xf1\xc2\xe3\xc5\x0f\xf9\xbc\x53\x6e\xa9\x5c\x72\xf4\xca\x79\x52\xc0\xe4\x65\x2e\xd8\x08\x59\x59\xda\xa2\x5c\x9f\x3e\xca\x4f\x0e\x84\x77\xe3\x9e\x7a\x37\x8d\xc0\xbf\xa6\x0e\xf9\x0e\x2a\xd4\x94\x10\x19\xd3\x59\xa9\x0b\xc9\x6d\x67\xe7\x59\xcf\xd9\x85\x37\xce\x05\x59\xfe\xee\x45\x96\x9b\x0f\x6f\x07\x7e\xb5\x13\x5c\x64\xbb\x35\x6e\x61\x35\x70\x8b\xe3\x68\x19\x28\x9f\x6b\x60\xbe\x09\x2c\x31\xe1\x1e\x47\x17\x82\x0d\x10\xa1\xab\x1c\xc7\x62\xdc\x06\x1d\x9d\xb7\x20\xdd\x18\x64\x09\xf9\x7b\x72\x2b\x76\xf6\xed\xf8\xf0\x4b\xc3\x5e\x57\xff\xfe\x56\xd4\x3f\xc8\x3a\xa9\xea\x98\x2c\x5d\x7c\x5c\xf2\x7a\x89\x92\x68\x19\x0a\x2d\x26\x20\xa8\xac\x71\x12\x9d\x6b\x26\x40\xec\xac\x6f\x87\x03\x88\xe5\xa4\x4d\x6d\xfc\x0c\x99\xa9\x0d\x93\x86\xd0\x52\x1a\xc9\xae\x77\x8f\xf5\x5e\x85\x88\xe8\x5f\xad\x52\x3c\xae\x0e\x5f\xf2\x31\x60\xc4\xc7\xc9\x4b\xf1\xd2\xc3\xef\x93\x2b\xa2\xcc\xbb\xc7\xbb\x87\x77\xbf\xfb\xf0\xf9\xcb\x0d\xa9\xc1\x70\x87\xca\x23\xf0\xb2\xd7\xbd\x6c\x4d\x3b\xd0\xa3\x4e\x5d\x55\x4d\x76\x74\x7d\x3f\x54\x52\xe5\x37\x2a\x34\xc1\x56\x4f\x11\xd2\xda\xab\x35\x4e\xb2\xd2\xc8\xba\xe5\x8e\xbb\x03\xe4\x95\x2f\xbc\x65\xa0\xa0\x8f\xeb\xe5\x00\x66\x99\x0f\x75\x37\x6c\xb5\xc5\xea\x89\x24\x5d\x58\xa3\xf2\x95\x8e\x3e\x5c\xec\xe5\xa2\x9c\xc7\x2f\x3f\x5a\xb4\xa4\x73\xcb\xec\xe2\x63\xf6\x14\x39\x3f\xe4\x40\xfd\x58\x32\xe2\x06\x6c\x10\x38\x5f\x61\xd2\x04\x97\xfe\xd9\x52\x4a\x57\x7a\x0b\x1c\x39\x74\x58\x17\x67\xbe\xae\xd8\x70\xe9\xa5\xbe\xda\xc9\xff\xfb\xb5\x9d\x5c\xcb\x6b\x7e\xd9\x50\x74\x7d\x3e\xd5\x60\x57\x03\x25\x8b\x62\x02\x8a\xad\xea\x72\xf4\xc8\x2d\xa7\x38\xf5\x38\x57\x6c\x82\xe2\x95\xa9\x5c\x0d\xf4\x67\x6d\x25\x99\x7f\xc9\x56\xae\xfe\xc0\x6f\xb6\x15\x25\x46\x60\x65\x51\x97\xf1\xf1\xbc\x1e\x32\x2c\x99\xfd\xd8\xf4\x40\x3c\x12\x46\x99\xe3\xd1\x28\x43\x98\x59\x1f\x73\xc3\xb6\x9a\x5e\x90\xbb\x6a\x5f\xef\xc9\x85\x17\xe3\xca\x7f\xb1\x25\x00\xe5\x0d\xfa\x61\x74\xc9\xe9\x9c\xae\xaf\x3d\x59\x66\xc0\xcc\x1f\x03\x8e\xf9\xe9\xbf\x41\x7f\x43\x0d\x8d\x29\xca\x98\x2f\x8c\x29\xa8\xb6\x6c\xdc\xec\x33\xb7\x1c\xe3\xdc\xa3\x42\x8b\x19\xaa\x3f\xa9\x3f\x88\xf8\x13\xbe\xad\xe3\xf4\x52\xa9\x1f\xc6\xbc\x6e\x32\xbf\xbb\x94\xb0\x86\xa2\x8f\xcd\xe3\xce\x18\x86\xb4\x86\x9c\x20\x5d\x14\x50\x2d\xed\x09\x6a\xe6\x89\xef\x6b\x7f\xf0\x58\x82\x86\x62\xa9\x81\x95\x65\x1c\x31\xde\x34\x4c\x50\x8c\x8c\xc4\xad\x18\xd7\x03\x7f\x90\x96\x18\x53\x95\x51\x94\xac\x7e\x5c\x82\xf7\xfa\xc2\x22\x72\xe9\x48\xdd\xce\xfc\x87\xd0\x85\x7a\x17\xfe\x80\x6d\xf3\x02\x4a\x9f\xc6\xe9\x72\xb2\x6d\x49\x02\xb8\xa5\xf4\x76\xaf\x4b\x46\x16\xd7\x2d\xf6\xb0\x97\x62\xe9\x80\x7d\xbd\x70\xe8\xaf\x9f\xcd\x13\xbd\xd7\xd1\x5d\xf4\x3e\x60\xbe\x3c\x7f\xf6\xa6\xe1\xed\xd3\xff\x0a\xee\xef\x60\x6e\x0b\x04\xd9\x72\x8c\xab\xda\x8b\xfa\x54\x85\x48\x18\xdc\xfa\xe1\x74\x71\xed\x12\x99\x7e\x4f\xc5\xd2\x03\x39\x1f\x02\x59\x5c\x74\x95\x9d\xfc\xa6\xcf\x7f\x96\x3e\xab\xbd\x7d\x11\xff\xfa\xf9\xe7\x93\x9d\xf6\x62\xfb\xfc\xe3\xaa\xa1\xad\x97\x72\x7e\x22\xb7\x6c\xaf\xa3\xfc\x52\xe7\xf1\x26\xc9\xbc\xfd\xb9\xbf\xa1\x35\x08\xc6\x42\xad\x62\x3e\xd4\x83\x03\xbe\xd7\x7e\x3a\x17\x82\xa7\x75\x4a\x93\xe2\x07\x73\xa3\xbe\x9e\x76\x75\x04\x80\x9e\xf0\x7e\x84\x35\x56\x0e\x9f\xf7\x42\xc9\x91\x74\x0e\x8e\xce\xfd\x70\xaa\xe1\x08\xd2\x0f\xb3\xcf\x39\x98\x80\xc5\x48\xa1\xdf\x1f\x02\x6e\xce\x5d\xe8\xd7\x7d\x59\x9f\xbb\xfb\xcf\xcf\xc9\x1f\xd9\x14\x55\x3c\x7e\xa5\x37\xd1\x0f\x12\x7a\xec\xed\xae\xf8\x7a\xd8\xc9\xaf\x76\x6f\x0a\x8a\x3d\x71\xbe\xda\xe5\xcc\xab\xe6\x7c\xea\xb6\xde\x9e\xf4\x89\x86\xfc\xc0\xef\x02\xde\xe7\x77\x57\x96\xaa\xdb\x57\x08\x63\xef\x43\x2b\x4b\x30\x04\xf8\x74\xff\x37\xf1\xfd\xa7\x84\xba\xa2\x4c\x7a\x5c\xd6\xc2\x16\x4e\x56\x55\x76\xb6\x4c\xe9\x63\x3c\xf8\xa8\x8e\x23\x5f\x03\xdf\x1b\x24\xf8\x57\x79\xea\x32\x97\x1d\x77\x65\xda\x6b\x0e\xb9\x9f\xcf\xce\x24\xb3\x77\xd3\x64\x8f\xc7\x30\x3e\x09\x5c\xf8\xbf\x3c\xfe\x37\x3f\x3b\xbe\x5a\xc7\xaf\x71\xe9\xb8\x29\xac\xa8\x50\x76\xee\x98\xd0\x53\xdc\xf8\xc2\xc1\xc1\x77\x40\xb6\xf1\xc5\xa9\xcd\x5c\x06\xe9\x2e\x0d\x02\x14\xfe\xf8\x56\x80\x5d\x92\xfe\xd7\x8c\xbf\xcb\x5d\x5e\xc6\xa7\x0a\x39\x26\x0b\xcd\x2a\x94\x2d\x82\x08\xdd\xc7\xcc\x73\x17\x28\x94\xd2\xd7\xf3\xff\x95\xf1\xe3\xf6\x32\xfe\xb7\x01\xeb\xf2\x5f\x6e\x1d\x08\xcf\x24\x61\x9f\xdf\xdd\xdf\xfe\x74\xf6\xbd\xc3\x09\x95\x36\xcc\x1d\x55\xe9\x92\xa7\x84\xeb\x3e\xd6\x9e\x38\xe8\xd6\x68\x70\x6f\xd0\xf0\xb5\xf2\xe6\x95\xee\x4b\x7f\xf8\x91\xee\x21\xc2\x4f\x24\x99\xf6\xea\xe5\x06\xf6\xee\x21\xf0\x50\xbe\x7b\x43\x57\xf4\xf8\x72\xff\xf5\x3e\x56\x4d\xa3\x84\x72\xb2\x91\x47\xe9\x07\x10\x0d\xc2\xda\x56\x2e\x2f\xe4\x86\x78\x21\xbc\x8b\x5b\x37\x2a\x67\x16\x16\xdb\x53\x2f\x21\x05\xec\xa0\xd2\x5c\x1c\x21\x2b\x05\x83\xca\x0f\xce\x0f\xae\x8c\x20\xce\x2f\xf9\xc2\xab\xd6\x5f\x06\xfa\x06\x6e\xa3\xd0\x86\xfe\x7c\xdb\x18\x90\x56\xa9\xcd\x0b\x88\x02\xd0\x57\x8c\x3c\x6e\x80\x2a\x3f\x74\x75\xe7\x1b\x0d\xbc\xf6\x2c\xae\x7c\x8f\x99\xee\xf6\x39\x62\xf4\x3a\x92\xef\xfc\xd1\x02\x02\x7e\x1e\x13\xec\x8d\x9f\x34\xe4\xc0\x1c\x54\x4e\x8a\x53\x78\xbe\xab\x80\xdf\x2d\xae\x72\xbc\x9a\x70\xa0\x0c\x58\xe5\x48\x2e\x72\x04\xad\xec\x90\xcd\xcb\xba\x0e\x84\x9a\x07\xcf\x6a\x48\xd9\xa1\xa9\xcd\x41\x43\xaa\xbd\x81\x69\xc2\x54\x37\xfb\x02\x71\xb6\xea\xc4\xfa\xc1\x7a\x3a\xb6\x03\xe8\x85\xc4\xf3\x26\x01\x06\x6b\xa1\xb2\x9c\x1d\xc3\x9e\x4f\x76\x6b\xbc\xf5\x7d\x38\x75\xee\xb6\x12\x8c\x5f\x5a\x82\x80\x73\x3c\xd5\x66\x92\x90\x1b\x6f\xa1\x1e\xd6\xd1\x88\xc9\x0a\x5b\x87\xdc\x61\xe3\xd9\x38\x2a\x13\x47\x0b\x89\x3b\x7f\x9a\xae\x4b\xe0\xa4\x98\xa1\x78\xa5\x98\xd2\x8d\xaa\x5e\xe7\x8f\xdf\xae\xc3\xe3\x9b\x75\x88\x2f\xf3\x7f\xb1\x8a\x6f\x76\x91\xcd\xf2\xbe\x0e\x17\x38\x9d\x6f\x35\x44\xea\x60\x6b\x3d\xe9\x59\xfa\x0e\xfa\xb9\xc2\xda\xfe\xcc\x12\x14\x40\xce\xa7\x78\xf6\x9d\x3f\xbd\x5a\x02\x08\x7b\x6c\x3c\xfc\x9a\x0c\x3f\x67\x0b\x8d\xcd\x8a\x43\xbd\x06\xd7\x70\xf2\xcc\x01\x56\xfe\xd4\xd4\x6e\xfd\xec\xd2\x78\x05\x27\x3f\x63\xa2\xeb\xb7\x72\xf4\xfe\x60\x21\x83\x6a\xc9\xe3\x93\x6f\xfc\xbc\xca\x21\x5e\x4c\x21\x82\xe7\x1c\xf6\x16\x7d\xbe\x16\xe3\xdd\x45\x15\xf0\x6a\x75\xbe\xd9\x65\x0e\x75\x1b\x08\x52\xeb\x3b\x7d\x52\x07\xb3\xc9\x50\x18\x3f\x40\x7b\x44\x44\xad\xaa\x68\xde\x6a\x22\x07\xb2\x44\x49\xea\xdd\x1b\x09\x20\x8d\x20\x56\x7f\xae\x1e\x5a\x9b\x15\xd3\xa6\x87\xd9\x2b\x0b\x28\xe8\xa1\xf3\x83\x06\xde\x7a\x09\xb3\x9f\x11\xfd\xb1\x1e\x2e\xeb\x41\xcf\xf3\x2f\xe8\x21\xf0\x2c\xfe\x59\x72\xd4\x26\xac\x47\xef\x71\x1c\x79\x51\xaf\x72\xcc\x6d\xdd\xf9\x6e\x93\x23\x8e\xfc\xb1\x5a\x1f\x8b\x9f\x93\x83\x05\x62\x1d\xeb\x8f\x3f\x96\x23\x8e\xe8\x13\xdb\xe5\x7b\x15\xfd\xd5\xc6\xa0\xb8\xb5\xab\xbc\x5c\xd1\x7f\xfe\x12\x36\xc8\xcf\xef\x3e\xdd\xbf\xbd\x43\xb8\x60\x22\x83\xb3\x18\x5c\x85\x21\x5b\x54\x67\x5a\xa0\xa4\xf2\x3d\xab\x18\x3d\xf4\x70\x20\xb8\xa2\x05\x2f\xca\xb1\x73\xe5\x3c\x92\xbd\x42\x4a\x09\x66\x7d\xee\xa5\x1f\x28\x10\x90\x71\xc5\xb8\xa8\x88\xed\x16\x83\xbd\xa6\x2c\xb3\x19\x3a\x2c\x8c\x50\xad\x29\x4d\x58\xb4\x5f\xfd\xb5\xe0\xdb\x5c\xfb\x6a\xb6\x9b\x82\x4b\x5f\xcd\xe3\x4f\x5c\x85\x0d\x61\xf4\xf6\xe3\xe7\xdb\xc7\xcf\x5f\x1e\xf6\x77\x57\x9a\xb5\xeb\xdf\xd6\x66\x05\x54\x25\x6a\x09\xc1\xbc\x90\x65\xa9\x8d\x4e\xa9\x65\x88\x4c\xe9\xa9\x2a\x0f\x58\x87\x4d\x46\x85\xbf\xf6\xba\xc4\x95\x96\xf4\x2b\x65\x2c\x73\x19\xda\x60\xea\x7c\xd3\x55\x13\xc8\x58\x22\x33\x4f\x8c\x4b\x4f\x0f\x87\xc3\xd2\x4f\xd3\xb4\xc6\x08\x2a\xe0\x7b\xaf\xe7\xdd\x1f\x2e\xfa\x0c\x45\x2e\x17\x75\x6e\xbd\x99\xb0\xd1\x13\x3f\xb7\x8d\xbf\x86\xeb\xdc\x9d\x2c\x86\x49\xcd\x4b\x64\xad\x85\x59\x79\x4d\xa8\xea\xe2\xc2\x4f\x25\xeb\x71\x6a\x33\xe9\x8f\x8d\x88\x31\x55\x25\xce\x31\x2a\xf3\xbd\x41\xd2\x8c\xc6\xe7\x9e\xfb\x91\x02\x06\x1d\xa3\x91\x13\x5e\x2f\xe5\xc2\x8a\x1c\x99\xb2\x17\x98\x27\xdc\x93\x36\x75\x29\x8e\xa2\x38\xdc\x7f\x99\xe0\x6f\x3d\xb3\xbd\x5e\xd7\x3c\x50\xb7\xbf\x96\xb2\xf8\x79\x29\x23\x97\x17\x31\x73\xc0\xbe\x1e\x46\x2b\x59\x5c\xbb\xe5\xc4\x94\x3a\xc5\x9d\xa7\x95\x06\xc4\x32\x9b\x3a\xaf\x46\x1d\x1f\x85\xab\x68\xc1\x70\x85\xf6\xba\x42\xc8\x0c\xd6\x67\xab\xa8\x6c\x80\x72\x8c\xab\x41\x12\xd6\x2e\xe5\xc2\x8b\xbc\xd2\xa8\xdb\x44\xa5\x5d\x5a\xa7\x6c\xeb\xdd\x7e\xaa\x6e\xeb\x5d\x1f\xce\xef\x2f\x6f\x2d\x14\x3e\x7e\x0e\xbc\xce\xdf\xdd\x06\x5e\x67\xc8\x5e\x67\xf8\x7f\xc4\x7d\x11\x37\x35\x8a\x8f\x4c\xc4\xd5\x0f\x6b\xd4\x39\x63\x42\xc1\xa0\x98\x19\xb9\x70\xba\x53\x52\x73\x95\x4b\x89\x8a\x6c\xe1\x0c\x28\x18\x9e\xd6\x05\xc3\xbe\xf4\xd8\xec\x7a\x84\x35\x25\x76\xdd\xdc\xfc\x2c\xc6\x13\xe8\xb2\x30\x7d\x8b\x09\xf1\x9d\x1f\x9a\xc2\x15\xc8\x78\x5d\xe4\x58\x57\x6d\x85\xb0\x8c\xcb\x80\xf1\xb3\xd9\xc1\x87\x2b\x66\xce\x8b\x8e\x9f\x0d\xe1\xbb\x5f\x55\xb1\x74\x45\x19\x23\x0b\xd5\x19\xf7\xb6\x8b\x85\xf1\x39\x53\x0a\xd2\x58\x7b\x5d\x49\x88\x68\x5a\x67\xd6\x37\xbd\x8e\x1b\x66\x11\x29\x68\x55\x95\x7b\x83\xaa\x6a\x55\x71\xb0\x06\x06\x15\xe8\xb8\x1a\x38\xe1\xcd\x52\x6c\xd6\x80\x7a\x7e\xb5\x86\x3a\xa5\x5b\xad\x98\xbc\xc8\xfa\xab\xf6\xf0\xeb\xc2\x32\x5b\xa0\x98\x58\xc0\xe7\xbc\x76\x94\xc4\xc6\x2e\x27\xae\x34\x64\x71\xeb\x45\xa5\xa0\xc4\x41\x5a\x3b\xea\x78\xe4\x0e\x91\x92\x55\xb8\xb8\x48\xeb\x7c\xee\x95\xef\x59\x0f\xc5\xb4\x49\x5b\x2f\xc5\xc5\x20\x5e\x4b\xab\xa2\x68\x17\xd1\x27\xb2\x93\x6f\xfd\xb9\xd7\xac\xaf\xdf\xdc\xdd\xbf\xf6\xe7\x1e\xfe\x26\x7e\xfc\x04\xd4\x66\x45\xdc\x4b\xc3\x4c\xd9\xd1\xb2\x5c\x3a\xca\x75\x1b\x63\xaf\x1c\x98\x79\xde\x1b\xc4\xe8\x57\xec\x59\x55\x57\x40\x92\xe3\xc1\x70\xc8\xfc\xe9\xe2\xcd\x1d\x0e\xab\x37\x97\x86\x71\xe9\x5e\x3c\xe7\x4e\x51\x40\xd0\x0e\x1d\x10\x5b\xb7\xe5\xe7\x2f\x77\xf7\xdf\xbf\xfa\x7e\x6b\x10\xbd\xe4\x09\x43\x37\xe6\x95\x88\x36\x20\x0b\xdc\x84\xaf\xdf\x7f\x88\x6e\x3e\x7e\x27\xa0\xb3\x42\x11\x67\xfd\x04\xa7\x97\xef\x7d\x53\xe6\x26\x2f\x63\x1d\xfe\xaa\xda\x99\x02\x1a\x59\x9a\x9e\x7a\xd9\xf5\xac\xf5\x27\x0a\x39\x20\x7e\xd8\x00\xb2\x15\xf3\xf3\x72\xa4\x71\xb1\x17\x0b\x33\x04\x19\xc4\x20\x32\x2f\xdf\x22\x26\x4a\x41\xb7\xaf\x4b\x53\x73\x23\x3b\x92\xa5\xae\x91\x7d\x25\x3a\xa6\x44\x21\x26\xad\x75\x25\x7d\x23\x4d\xa8\x47\xdf\x87\x39\x8b\xbd\x0e\xdc\x83\x9f\xa3\xff\x6f\x84\xa3\xff\xfc\xd2\x57\xf4\xfe\xfe\xc3\xfa\xf7\x87\xdb\x8f\x6f\xcb\x82\x36\x2a\xd9\x2f\xbf\xff\xf8\xe5\xc3\xe7\x2f\xf7\xf0\xfb\x8f\xfb\xdb\xe4\xf9\xee\xfc\x25\x75\x5a\x03\x29\x72\x9b\xe5\xd0\xf8\xc9\x62\x53\x21\xa9\xc8\x91\x68\x5c\xe5\x84\x94\x4f\x11\xa6\x58\x50\x4c\x99\x41\xc8\x1f\xe3\x56\x99\x8a\x65\x81\xc3\x8c\xfb\x9a\x49\xe1\x98\x8e\x2d\xe7\x8a\x8a\x9b\x8e\x8b\x92\x11\x53\x0b\x42\xd7\x63\xcd\x47\x5e\x0b\x96\xbb\x1c\x83\x80\x96\x54\x9a\x49\x5c\x4a\x4e\xa4\x1f\x9d\xad\x8d\x3f\x59\xaf\xb4\xef\xd9\x68\xb4\x18\x74\xc7\x1a\xb7\xcd\x95\x25\xc5\x6d\xbd\xb7\xa1\x4f\xf9\xdf\x46\x9f\xa2\x7f\x1f\xfd\xff\x7f\x99\x09\x3b\xb4\x5d\x7c\x7f\xa5\x5c\x0c\x78\x75\x5f\x3e\x3d\xbe\xff\xb2\x71\xe6\xc3\x85\x3b\x7f\x37\xa8\x3c\x83\x99\x2a\x37\xa0\xa7\x68\x98\xfc\x11\x1d\x6a\x4a\x30\x65\x03\x30\x4d\x3c\x67\x5f\x6d\x5c\x9f\x4e\x27\x28\x73\x5f\x7b\x82\xa4\x95\x7e\xb6\x60\xbc\x8a\x87\x24\x3b\xcf\x26\x8e\x7c\xb4\xb7\x45\x51\x08\x8e\xcb\x5c\x16\x84\x14\x2a\x2b\x51\x85\x4a\x26\x6a\x84\x71\xef\x7b\x2a\x44\x25\x29\xd6\xd9\x7c\xc8\xa0\x52\xcc\x5b\x7f\xd8\xb8\x69\xf7\x91\x4c\x54\xe8\xe7\xfb\xb3\xe6\x74\xff\x82\x4f\xfb\x66\x4e\xef\xaf\x73\xca\x72\x98\x89\xb4\xeb\x9c\xc6\xd1\x1f\xd0\x54\x13\x4c\x28\x9b\x80\x28\xe2\x25\xfb\xaa\x57\xaf\x78\xe3\x24\xcf\x7c\xe3\x39\x62\xda\xfa\xc9\x04\xe4\xe0\x43\x3c\x2f\x99\x81\x83\x2f\xf6\xb6\xc8\x73\xc1\xaa\x22\x93\x05\xc6\xb9\xcc\x8a\x12\xad\xd3\x72\x65\x55\xf5\xfe\x40\x38\x47\x8c\x61\x95\x1d\xa7\x1c\x72\x41\x7d\x3d\xb3\x6a\x7d\xfe\xd7\x98\xaa\xdf\xeb\xe8\x7d\xf4\xd7\xaf\xb0\xbd\xde\xef\x6f\x6f\xae\x09\xca\x70\x9b\xf1\xfe\x43\x38\x12\x9e\xf1\x58\xee\xee\xa1\xb7\x25\x02\xcb\x0c\xe4\xc2\xb8\x6e\x62\x93\xed\x8b\x52\x42\x36\x69\xec\x87\x12\x86\xda\x4f\xd6\x42\xe9\xa7\xbd\x2e\x05\x33\x6d\xdd\x6b\xc5\x9d\x54\x42\xc9\xb2\x60\x90\x75\x52\x19\xb2\xd4\xe7\xd9\xb8\xa4\xf0\x29\x88\x80\xff\xd0\x85\xbc\xe9\xc6\x45\xfe\x5d\xc8\x4d\x06\x79\xe2\x37\x6c\xef\xcf\xe4\xe9\xaf\x05\xda\x1d\xea\xbc\x88\x33\xd5\x36\x03\x39\xf6\xed\x53\x54\x4d\x4e\x50\x2e\x06\xc6\x74\x4d\xd7\x60\xcb\x79\xe4\x1c\x8c\x1e\xed\x75\x49\x89\x7d\x8a\x1a\x89\x1d\x35\x9a\x5a\x2c\x85\xe5\x72\xe0\xb5\x74\xed\xf9\xb4\x14\x52\xc6\x07\x5f\x6c\xf9\x94\x1b\x40\xc9\x61\x7f\xdc\xe3\x57\xbc\xb5\x6f\x38\x6a\x9f\x9b\x8d\xd1\x4d\xf7\x03\xd9\xa2\x3d\x03\xf3\x57\x73\xfd\x6e\x8f\x97\x1a\x24\xe7\xdc\xf7\x9c\x6f\x18\x25\x17\xec\x8f\x21\xd8\xd2\xab\x79\xbe\xed\x93\xba\x36\x34\xff\xee\x35\x10\x4e\x3c\x37\x79\x91\xa4\xaa\x5f\x1d\x51\xe2\x4b\x6f\x7c\xbd\x9c\x08\x58\x28\xac\x94\x5a\x82\x81\x79\xd4\x0b\xa9\x13\x5c\x9f\xf3\xba\x4e\x8e\xe7\x3c\x19\xca\x3c\xd7\x9c\xa0\xc2\x96\x9c\x61\x5b\x56\x88\xa0\x42\xf1\xa1\xc2\xd8\x5b\x9f\x22\x04\x27\x3f\x34\xd1\x2e\x5a\xfd\xe8\x66\x37\xfe\x69\xb9\xc2\x02\xbc\x7b\x2d\xd7\xa1\x46\x55\xa2\xf4\x11\x52\x50\xd8\xaf\x9f\xab\x97\xa1\x84\x03\xe4\xad\x71\x0d\x85\x5a\xd7\xf3\xc1\xce\xf5\x39\xad\xeb\xe4\x74\x4e\x77\x23\x42\x48\x35\x12\x97\x35\xd2\xba\xac\x73\xca\x24\x23\xb6\xe1\x92\x12\xb5\x4c\x4b\x47\x48\x4c\xbc\x0d\x7c\x36\x81\xb7\xb5\xb9\x70\xea\x7f\xff\x1a\x11\xe7\xe7\x59\xf5\xdf\x18\x86\x5d\x0d\xa3\x50\xed\x30\x13\x3f\x1f\x7a\x3f\x56\xa7\x56\x30\x4c\xf8\x24\x84\x76\xcc\xd3\x98\xbb\xe5\xe0\x5c\x5c\x2c\x87\xcd\x34\x4e\xb5\x22\x8e\x3a\xcb\x2c\x51\xc2\x50\x2c\x0f\xc4\x49\xd7\xbc\x31\x8d\x5d\xc8\x7d\xba\x9b\x3c\xfa\xdd\x8b\x4c\x3f\xab\xaa\x0d\xa2\xe3\xcd\x22\x26\x69\x4d\xe2\x49\x0f\x50\x82\x66\x1e\xf9\xde\x9b\x65\x26\x30\x02\x76\xce\x58\x02\x1a\xa6\x51\x2e\x22\xcf\x9b\x24\xab\xcf\xbc\xae\x93\xfa\xcc\x6f\xf2\x8a\xea\x4e\x09\x5c\x73\xe3\x70\x8d\x38\x15\x9c\xd8\xde\xcf\xcc\x66\xb9\xf0\xc5\x52\x73\x1e\x73\x6f\xe6\x28\x0e\x5c\x0e\x36\x3e\x5c\xba\xcf\x2f\xe8\x32\xcf\x29\xc6\x2b\x58\x6d\x01\xf7\x9f\xee\xf7\x3d\xf6\x83\xd7\x09\x39\x77\xb1\xb5\x5f\x95\x8b\xcd\xb9\x4b\xc8\x22\xca\xf8\xb8\x1c\x77\xe6\xab\x8a\x0f\xaa\xcc\xb9\x62\x9e\x56\x15\xb4\x4c\xb1\x4c\x2f\x81\x4f\x37\xde\xf1\xe8\x10\xee\x1e\x3f\x86\x7b\xa7\x37\xb9\xa0\xbb\x6b\x09\x58\x28\xb1\xdb\x48\xb4\x83\x83\xf9\x19\x1e\xde\x3f\xde\x60\x53\xc0\xc0\x54\x45\x0a\x89\x8a\xc2\xbb\x2a\x03\xfa\x14\x15\xae\x47\x26\x17\xa7\x99\xe4\xb9\x74\x90\xea\x35\x6a\x10\x4b\xf5\x14\x65\x2e\x6f\xe3\xc8\xe6\x9e\x7a\x53\xa6\x44\xa3\x91\x56\x22\x3e\x96\x05\x3d\xf9\x43\x17\x6d\x38\x85\x81\x0b\xe8\x43\x88\x6a\xfe\x7f\x51\x04\x77\x59\x74\x25\xf0\x2e\xa2\xbf\x82\xab\xbb\xf8\xee\xf1\x53\x70\x20\x6e\xdf\x3f\xde\x3d\xbc\x7f\x01\x5a\xbe\xf9\xf8\xe5\xee\xe1\xcb\xe3\xdd\xc3\x1a\x3e\xee\x28\xc8\xb1\xac\xf2\x1a\x29\xf1\x14\x79\xb4\x68\x69\xe5\xd8\x37\x08\xd2\x43\x35\x0e\x83\xcd\x0b\xc3\x0a\x93\x66\xb3\x3f\xe4\xa7\x5e\x52\x3a\xb0\x3d\x39\x8b\xd5\x53\xac\x44\x65\x25\x68\x38\x26\xd1\xd9\xf9\xc2\x1f\x31\x44\x70\x4a\xfa\x65\x70\x85\x2e\xb0\x42\xed\x42\x8f\x79\x55\x15\x6d\x5b\x62\x8c\x91\x2b\x20\x32\x5b\xb1\x66\xb4\x8b\xf9\x13\xb9\xed\xf7\x34\xf8\xba\x1b\x23\x76\x7c\x97\x7d\xf3\xf8\x87\x4f\x1f\xf6\x0f\xff\x32\xbe\xcb\xde\x5d\xe7\x71\xf3\x61\x7f\x99\xc2\x33\x46\xf7\xf7\x77\x0f\x77\x61\x76\xc9\x65\x1a\xb7\x69\x96\xe7\xa5\x2c\x14\x13\xd9\x42\x06\x37\xc6\x5d\xc5\xe5\x30\xf0\x4a\xd1\x52\xe7\x93\x3f\x15\x10\x0d\x43\x8d\x20\x35\x94\x8e\x6c\x4f\x97\xce\x63\x3f\xfa\x49\x96\x33\x94\x30\x81\x82\xd3\xd9\xfa\xc2\x1f\x2a\xc8\x60\x4e\xc6\x49\x15\x79\xb7\xd0\x53\xe6\xca\x6e\x2a\x55\x59\xd8\x1c\xd2\xb8\x6d\x0a\x5d\x9c\x9b\xad\xaa\x77\xeb\xe3\x69\x21\xba\x75\xfb\xea\x25\xcb\xbd\x21\xc3\xdd\xdd\xdf\x3d\x06\xfb\x5b\xa5\xbc\xbf\xbb\xbf\x45\x58\x1b\x40\x7e\x9c\x97\xfa\xb0\x46\x84\x33\x02\x16\x98\xbf\xf6\x95\x2e\xf2\xa3\x99\x96\x21\xae\x26\x33\x16\xa6\xf8\xea\x00\x5d\x7a\x63\x86\x5b\xb1\xe7\x81\x73\xe7\x19\x43\x73\x4b\x2f\x5f\x01\xb2\x57\x0f\xfb\x7e\xdf\x8a\xe9\x18\x67\xcb\x0c\xe6\x5c\x40\xbb\xcc\x71\x36\x1c\x08\x9c\xfc\x1c\x60\xc2\xb8\x2e\x73\x7f\xb2\xc7\xa5\x89\xd9\xd1\xce\x59\x6e\xcb\xaf\xf8\x82\xb1\xbb\x8b\x22\x7d\xab\xf7\xe4\x45\xfe\xb7\x63\xdc\xdd\x6c\xf2\xef\x4f\xd8\x6e\x29\x95\x7c\x41\x50\x78\x0b\xd2\x4f\x15\xb8\x61\xd5\xc5\x9e\x98\x22\xf7\x47\x3b\x2f\x36\x96\xb3\x85\x08\xd9\xf2\x6b\x1e\xfa\x8c\x2e\xbd\x03\xea\xc2\x1a\xf4\x8c\x03\x7a\x7d\x46\xaf\x24\x3a\x61\x1e\xb7\x29\x19\x0f\x70\xf2\x29\xd8\x7a\xd1\x35\x58\x9f\xc2\x69\x18\xab\x38\xf7\x43\xac\x17\xbd\x57\xa6\x42\xbe\x71\x7e\x3a\x4f\x52\x26\x25\x94\x0e\xaa\xb2\xa8\xf1\x0f\x14\x4c\x04\xe1\xae\xcd\xec\x8e\xa1\x96\xfe\x27\xf5\x18\x5b\x96\x50\xba\xbc\x8c\xfb\xa5\x09\x15\x18\xe5\x32\xd9\x42\x72\x73\xdc\x1d\x11\x25\x5b\xcd\x85\xda\x91\x81\x8b\x39\xe4\x9d\x50\xc0\x87\x9d\x7f\xed\xf3\x4a\x57\xe4\x49\xb6\xf0\xb8\x5a\x86\x98\x2f\x75\x9d\x52\xa6\x9a\xdd\x8c\x18\xdd\x3e\x4f\xef\x70\x2b\x02\x19\x7f\x12\xf5\x4f\x4d\x12\xed\xf4\xe5\x84\x8d\x5e\xef\xdf\xeb\x9f\x24\xaa\xfd\xc9\xb9\xe0\x06\xa5\xfe\xb4\xd3\x5f\x4b\xa3\x77\xa3\x2f\x02\x56\xeb\x76\xef\x11\xc9\x27\x9a\x54\xbb\x43\x54\x84\x28\x62\x4b\x00\x5d\x18\x05\x5f\x95\xfa\xee\x6f\x3f\x7e\x7f\x77\xef\x20\x0b\x38\xe3\x52\x14\x4a\x33\x29\x78\x21\x44\x59\x6a\x5d\x41\xe5\xe7\xe4\xb0\xa1\x0b\x9f\x8a\xdc\x95\x85\x37\x8a\x67\x4d\x5e\x56\x50\xe6\x45\x83\xa1\x8c\x2e\x3d\x38\x76\x77\xbc\xee\xaf\x57\x7c\xdc\x1f\xed\xaf\x9b\x09\x1e\x49\x37\x6c\xb5\x7b\xf5\xa2\x1d\x98\x8d\x80\xb9\x82\x71\x5b\xba\xdd\xd1\xa0\x62\xb6\xd3\xe2\x30\x89\xe5\x64\x47\x64\xd1\xd7\x1a\xd2\xa0\x17\xf1\x54\xc5\x72\x77\xba\xe0\x61\x5d\x3b\x5d\x2e\x90\x6a\x71\xf2\xf1\x1b\x60\x4e\x4b\x6d\x73\x23\xa5\xd2\x20\xb4\x1a\xdd\x61\x77\xe2\xd2\x18\xee\x8f\x54\x18\xc5\xfc\x81\xf9\xd1\x1f\x24\x64\x21\x36\x5d\xe5\x9e\xaf\x72\xff\xdc\xb1\xf0\xfc\xe8\x4c\xd8\x57\x81\x14\x64\x72\xe7\x83\x83\x69\xe9\x63\x3c\x4c\x55\x8c\xbc\x48\x8a\xf3\x61\x37\x1b\x7a\x74\xd3\x62\x31\x89\xd5\xe4\xa6\x22\xb7\xe8\xab\x85\x2c\xf4\x3c\xe4\xcf\x1c\x60\x5b\x35\x7e\xb5\xf5\x7c\x86\x5a\x89\xed\x76\xf0\xc3\xa5\x58\xed\xf3\x97\xfb\x37\x65\x21\x10\x32\x97\x1f\xc3\xd7\xd0\xf9\xf0\x4d\x22\x81\x97\xb9\x6f\x12\xe5\xd5\xea\xe2\xf9\x49\x1d\xe5\x53\x64\x8d\xf4\x83\x3c\x29\x7f\x04\xee\xb0\xa0\x34\xe7\x2c\x8b\x33\x49\x2d\x11\x8c\x21\x8b\x88\x57\x8e\x4b\x6b\x76\x83\x54\xd6\x2a\x69\xbb\xc6\x1c\x20\xf5\xf3\xac\xda\xe9\x78\x1e\x24\xcb\xea\x9c\xc4\xcc\x1f\x7d\x87\x81\x41\x96\xf9\x93\x1f\x30\x10\x88\x10\xf2\xdd\x81\x86\x35\xd8\xf0\x6f\x87\xbd\x08\xbd\x2f\xef\x37\x84\xfe\x6b\x5f\xfb\xcd\xab\x1a\x96\x77\xaf\x98\xfd\x42\x4f\xda\x97\xdf\x7f\x14\x40\x0b\xe4\x70\x01\xfc\xdc\xc4\x46\x33\x43\x8d\x9f\xb4\xac\x45\x8d\xb5\xac\x90\xad\x88\x33\x42\x1b\xe3\x0f\x04\x22\xad\xcd\x0d\x53\x02\x69\x6b\xcb\xba\xa5\x6d\x4d\xd8\x6c\x55\xe3\x4f\x5c\x98\x9a\xf4\xce\xb5\xa6\x71\x4f\x51\x6f\xbb\xd9\x88\xed\x8c\x4f\xdc\x9e\xbd\xd8\xe0\xcf\xec\x1f\x97\x3d\x2a\x21\x24\x30\x10\x77\x90\xd5\xde\xd4\x90\x86\x8e\x91\x53\x05\xa6\x0d\x00\xbc\x6c\xdd\xa5\x46\xe7\xbb\xf3\xa0\x4d\x82\x81\x38\xc8\x0b\x57\xfc\x40\xc0\x6e\x7d\xa1\x43\x88\xd7\x65\xd0\xc1\x86\xed\x15\xee\x5f\xb6\xf2\xed\x24\xb2\x92\x72\x84\x6c\x67\x72\xa9\xf9\x5e\x9e\x8c\x36\x82\xfd\x50\xdf\xf0\xc2\x8f\x47\x3a\x6d\xfb\x29\xba\xec\x77\xbf\x41\xde\xdb\x9c\xd8\x3a\x5c\x76\x96\xce\x63\x07\xc8\x3b\x10\x7e\xae\x40\x8f\xd0\x7b\xfc\xbc\xdb\x8d\xe7\x83\x94\x49\x11\x00\xcc\xf1\x65\xb3\xdb\x70\xb2\xa0\x49\xe6\xbd\x0a\x58\x6e\xff\xea\x75\x65\xd6\xfd\xfb\x87\x17\x54\xf4\x40\xab\xf1\xe9\x61\x3d\x89\xe0\x55\x30\x1d\xe7\xb6\x1c\x1a\xde\xf6\x42\xc6\xe9\x21\xb4\x4b\xf1\xdc\x1b\x5f\x15\xc0\xfc\x11\xf2\x4e\x31\xa8\xc0\xea\x8a\x28\xea\x2b\x82\x4c\x89\xf7\x0a\x95\x84\x29\x41\x18\x31\x5a\xfb\x03\x32\xe1\x54\x47\x5a\x4b\xac\xdc\xd2\x20\x49\x30\xc5\x5c\x22\xc9\xb6\xb3\x05\x8e\xb7\x72\x2f\x2f\xe7\xd7\x46\x50\xf6\xfd\xcb\x36\xb2\x15\xf3\xaf\x01\x62\x04\xc2\x36\x08\x0c\x18\x5a\xf7\xe1\xc2\x04\x2d\x25\x64\xde\x1d\xa1\xf3\x64\x77\x6a\xb3\xd4\x52\x53\xe4\x9d\x69\xd6\x7d\xa5\xf1\xd1\x18\xb8\x34\xe0\x18\x70\x25\xc2\xe7\xbf\xfb\xe5\xcf\xd7\x20\x5d\x83\xc0\x82\xc5\x6e\xfb\xf8\x62\x29\xd7\x43\xec\xf0\xea\xe3\x55\x99\xf7\xaf\x3f\xfe\x55\x5d\xe3\x6f\x3a\xbb\x32\xd2\x8f\x6b\xdc\x05\xd2\x2d\x6d\x03\xda\x23\x18\xbb\xbe\x82\xd9\x1f\x37\xd0\xd0\x9f\xae\xe6\xcb\xd9\x15\x47\xec\x49\xee\xa6\xbd\x79\xf1\x31\xdf\xe4\x47\x9e\x9d\xcc\x67\x9c\xb7\x4f\x77\xb7\x1f\xbf\x81\x87\xbb\x47\xa8\x6b\x14\x5b\x2e\x2a\x5e\x72\x8c\x97\x23\xc6\x70\xf4\xb6\xb4\x40\x49\x56\x17\xda\xb3\xa7\x88\x71\x3d\x81\x1a\xc7\xbd\x29\x86\x73\x2e\x44\xe6\x32\x91\xa0\x86\x2f\x9d\x57\x65\x86\x44\xd5\x50\x2c\x93\xda\x28\xc8\x7d\xef\xfb\x0d\x43\xe7\x49\xed\x8e\xfb\x2a\xfa\xcb\xe8\xaf\x2f\xa8\xa1\xef\x36\x10\xf4\xd5\x78\x6e\x36\xe3\x0a\xb6\x15\x0f\x07\x3f\xd2\x98\x0c\x8b\x4c\x30\xd7\xd3\x40\xe6\x05\x27\xd6\x1b\x68\xb3\xaf\x73\x0e\x83\x37\xc9\xb1\x21\xc6\x40\x63\xf4\x64\x98\x70\xf6\x68\x3d\x25\xae\x76\x04\xb6\xb1\xcc\x13\xd9\x8d\x2f\xcf\xf8\xcd\xaf\xa8\x79\xa7\xb1\xaf\x02\x48\x98\xa8\x97\xa1\x06\xb9\xaa\xb9\x1f\xab\xb8\xf4\xe3\x7a\x06\xef\x99\xc6\xdb\x33\xde\x9b\xcb\x33\x5e\xe4\x99\x2d\x7e\xa0\xe1\x21\x0f\x35\x41\x3b\xf1\x1b\xc7\x2a\xc8\xd6\xbd\x05\xb4\xf6\x51\x0d\x74\xfd\xa9\xed\xab\x38\xf2\xa7\x90\x65\x61\x06\xfb\xe9\xcd\x58\x59\x9e\xb9\xf2\x07\x16\x1e\xd0\x38\x60\x06\xb7\xfb\x3c\xdc\x43\x04\xde\x80\xe4\x3e\xbe\xfb\xf6\x3f\xc0\x1f\x3e\xff\x03\x7c\xf8\x67\x70\xbb\xc6\x0a\xd9\xbb\xfb\xe4\xf3\x97\x0f\xbb\xdb\x8f\xef\x1e\x2e\xad\xe6\xfd\x4e\x2e\x79\x19\x2b\x4d\x31\x2a\xd2\xac\xce\xb8\x14\x8e\x49\x5f\x34\x6d\x57\xf8\xe3\x88\xe7\x39\x4e\x59\x69\x4b\xba\xcf\x9d\x3f\x9d\x0f\xbe\xaf\x8a\x8a\xa2\x9a\xa7\x4c\x42\x19\xd7\xe7\x3c\x43\x16\xe7\xea\xa6\x5b\x6c\x77\x40\xc7\x36\xda\x05\x8c\x84\x2d\xb6\xfc\x17\xd1\xef\x5f\xe3\x62\x86\x0a\x96\x0b\x36\xc8\x73\xcc\xfb\x36\x0d\xb2\xcb\x6d\x51\xc6\xc6\x8e\x27\x28\xc9\x46\x94\xbf\xfa\x10\x07\x23\x30\xd1\x50\x56\xba\xe9\xe5\x32\xe5\x49\x56\x2f\x55\x1d\xa8\x3e\xf7\x1a\x91\x35\xc2\xd4\xc4\x32\xe7\xb8\xa5\x4a\x58\x5c\xf1\x23\x77\xca\xb5\xf9\x92\x2d\x05\xe7\xf1\xc1\x67\xab\x57\x13\xc3\xfc\xc4\x6e\xc7\x3d\xba\xdc\x7f\x84\x30\x60\xa3\x57\x8b\x93\xbb\xe7\x70\x66\x73\xab\xaf\x98\x68\x2f\x55\x1e\x8f\x9f\xee\xf7\x53\xb1\x2e\x72\xce\x88\x90\xe9\x79\x6e\x8d\x1b\xe3\xe6\x29\x3a\x51\x9a\xe7\x05\xc9\x85\x13\xf6\xe4\xe7\x3d\x5a\x88\x67\x9e\x41\x5a\x3c\x45\x0e\x54\x6c\xe2\x62\x71\x3e\xf2\xa5\x00\x0b\x87\x24\xf2\xbd\x6d\x16\x49\x59\xaa\x31\xcc\x67\x94\x8c\x0b\x4a\x68\x13\x25\xb1\x0a\xf2\x95\xd1\xef\xa2\xbf\x0f\x99\xf9\xd7\x12\xbe\x0a\xb8\x02\x2d\x69\x90\xf0\xe3\xb3\x6c\x0f\x70\xb7\x39\x64\x73\x9e\x17\x99\xce\x29\x61\x72\xa1\x8d\x71\x43\x4c\x0f\x07\xc6\xf2\xdc\x32\x73\x38\x80\x2c\xcb\x6c\x5f\x2e\xd4\x53\x4f\x21\x2f\xfc\xc9\x06\x01\xcb\xc5\xfa\xd4\x17\x1c\x0c\xcc\xf1\xc9\x0f\xa6\x5d\x24\xa3\xa9\x3f\x6c\xc2\xb5\x7e\x5c\xc6\xbc\x84\x79\xeb\xfd\xac\xfe\x3b\xc8\x79\x28\xf2\x32\xd3\x39\x23\x5c\x2e\x65\x6b\xea\x31\x16\xc7\x23\xa5\x45\xe9\xb8\x39\x1e\x41\xbf\x95\x73\x55\xa4\x8c\x6d\x90\x33\xf2\xe5\x1b\x39\x29\x7b\x2b\x67\x86\x36\x39\xf7\x01\x37\xbe\x0e\xbd\xbd\xff\x3a\x7a\x8c\xfe\x87\xe8\x7f\x8e\xfe\xcb\xb5\xf3\xe2\xa5\x83\xe1\x15\x0e\xe1\xc5\xdd\xb8\xbd\x24\x89\x43\xb9\xda\x05\xfc\xf1\xee\xe1\x36\x50\x06\xad\x6f\xaf\x8e\xd7\xbb\x7f\x80\xfb\xdf\x49\x70\x26\x14\x02\x88\xd0\x71\x2c\x92\x09\xb8\x09\x07\x2d\x22\x56\xd5\xc5\xd4\x3a\x69\x8a\x4e\x72\x4e\x00\xfb\xfa\x44\xa5\xc6\x3f\xa4\x49\xc6\xab\x31\xf7\xc2\x67\x68\x46\xa8\xd2\x6b\x40\xd5\xf4\xd8\x37\x68\x8f\x09\x11\x98\x73\x5c\x2a\xa5\x35\x6f\x02\xe6\x2a\x43\x45\xa6\x33\x84\x1b\xa9\x67\x41\x88\xe0\x7e\x66\x99\x40\xa5\x4e\x49\xc5\xa9\x3f\xa4\x02\xad\x67\xb4\x7d\xe2\xb7\x3a\x61\xd1\x87\xd0\x63\x12\xea\xff\x3f\x3d\x5e\x91\xc3\x5f\x5a\x72\xee\x5e\x61\xd7\x5d\xcb\xc6\xd7\xf9\xc4\x48\x90\xb1\x1e\x24\xd5\x55\x05\xda\xfd\xc0\x1c\x68\x84\x76\xb5\x8f\xe2\x6e\x21\x09\xfa\x63\x96\x94\x81\x65\xfb\x14\x1a\xdd\x92\x8a\xb0\xba\x66\x02\x93\xca\xcf\xd6\x42\x86\x0a\x7f\xf2\x53\x25\xb0\x52\x58\x54\x72\xc3\x1d\x14\x49\x79\xeb\xf6\x36\xfa\xcb\x90\xa5\xff\x4f\xd1\x7f\x8e\xfe\xb7\xdf\xa2\xff\x9f\x55\xff\x7e\xd3\xff\x1f\x9e\x17\xe0\x0f\xff\x00\xf7\x02\x9c\xbd\x2c\x40\x03\xdc\x8b\xe4\x00\x3c\xc0\xd7\x01\x22\x4e\xb9\xe2\xd0\xd6\x87\xa2\x96\x8a\x23\x60\xbe\x1e\x98\xb1\xe4\x8f\xa7\xa4\xe0\x79\x3e\x64\x61\x01\x84\xc8\x0b\x62\xd7\x4d\xd6\x0a\x81\xfc\xb0\xe7\x08\x49\x24\x04\x2a\x39\x97\x82\x37\xac\x48\x75\x4a\x71\xae\xb3\x82\x59\x29\xa6\x75\x01\x98\x3f\x96\xc5\xba\x2c\x3a\x45\x48\x10\x7f\x4a\xe9\x7a\xae\xee\x36\x7c\xb3\x7f\x12\xfd\xed\xab\x39\x3e\x7c\xba\xbf\x7d\xee\xf4\xd9\x7e\x5e\x5f\x53\x3c\xd5\xf1\xb4\x94\xf5\x52\x6a\xb0\x2e\x89\x42\xc9\xa5\x5b\x22\xe7\xe5\xbe\x64\xcc\x70\x6e\x19\x63\xcc\xac\x5f\x36\x5b\x0e\x3d\x32\xc9\x29\xfa\xcb\x08\x5d\xb2\xe5\xff\xc7\xaf\xea\xf2\xdb\x97\x2c\xef\x7f\x84\x7f\x80\x8b\x3a\xe1\xa2\xce\xb0\xe6\x41\xb7\x9f\xbf\x7c\xb8\xbd\x90\x61\x7d\x14\x20\x37\x5e\x37\x7e\x1e\x00\x7b\x9b\x74\xeb\x1b\xab\x1f\x53\x19\xae\x1b\xda\xdb\xc1\x9f\x4a\xe6\x10\xab\x19\x05\xe6\x2d\x44\xd4\x28\xbc\xaa\xf4\x7c\x08\xb9\xda\xb2\x2a\x19\x2d\x0b\x5b\x36\xb9\x57\xbe\xc8\x05\xc7\x49\x43\xa9\xa6\x5a\x53\xa2\xb5\x35\xb2\xf0\x27\x4e\x90\xc3\xd2\x94\x36\x2b\x0b\xe4\x26\x6d\xfc\xa9\x56\xaa\x46\xbe\x55\xfc\x54\xd1\x2c\xad\x70\x59\x15\x9a\x56\x36\xcd\xf8\x6a\xdb\xee\x09\xdf\xba\xf8\xf4\x52\x03\xff\x92\x19\xbc\x09\x5f\xbf\xec\xdf\xe6\x78\x6f\x7f\x07\xe1\xfd\x24\xb2\x79\x7c\xd0\x03\xa4\xa0\x85\x47\x7e\x7c\x8a\xc0\x40\x4a\xfd\xec\x65\x39\xfb\x11\x83\x81\x35\xd8\x33\xa1\x1f\xfa\xa0\x17\x55\x39\xaf\xe2\x1e\x0e\xd4\x97\x0b\x8d\x4f\x45\xae\x24\x45\xa5\xc6\x04\x97\x95\xac\x10\x43\xa5\x29\x31\x42\x15\x12\xaa\x26\xa4\xc0\x5e\x12\x2e\xf9\x85\x17\x5e\xc5\xed\xad\x0d\xfb\xcd\x76\xa3\xf1\xbf\xfe\xda\x0a\xbd\x35\xf6\x2f\xe1\x34\x0c\x48\xb2\x2f\xab\xf3\xb2\x38\x7f\xf8\xf2\xd1\x80\x71\xa1\xea\x86\x9d\x1b\x10\x5e\x25\x03\x50\x17\xd8\x80\xcb\xa2\xd6\x92\x98\xda\x1c\x79\x2b\x84\x46\x5d\x2d\xcb\x65\x80\xca\xb7\x67\x99\xa0\xf3\xe8\x56\xfb\x2e\xab\x72\x28\x72\x5b\x4e\x99\x97\x3e\x45\x42\xe0\x3d\xc1\x58\x60\x21\x70\xa1\x94\x56\xbd\xaa\xb0\xa4\x98\x56\x36\x2f\xcb\x52\x20\x8c\x89\x52\xc6\xcf\x02\xf7\x15\xce\x2a\x5c\xe2\x9c\xd1\xca\x64\x74\xdd\x57\x03\x77\x48\x13\xfd\x65\xf4\xf7\x97\x99\xfe\xef\x3f\x33\xd3\xcb\x4f\xf1\x4f\x1f\xea\x4f\xf7\xc9\xcf\xd9\xe1\xfe\xf6\xf3\xf3\x33\xae\x41\xda\x60\x79\xe4\x7c\x5c\x4d\x71\x37\xdb\x50\xc0\x5e\xe6\xad\xe9\x58\xd7\xb5\x23\x9d\xb9\xc1\x04\x4a\xdf\x03\x26\x58\x8a\xf2\x07\x91\x44\x4b\x64\x43\xbb\xf3\x6a\x79\x65\x6e\xf3\x9c\xb1\xf5\x41\xa7\x48\xc8\xbc\x48\x08\xe7\x8a\x6b\xcd\x7b\xad\xb5\x3f\xb5\x04\xd5\xeb\xf4\x5d\x85\x4d\xbb\xc6\x19\xca\x50\x6a\x90\xef\xa4\x38\x10\x92\x66\x15\x46\x45\x9e\x66\x9c\x15\x26\xad\xaa\xd5\x4f\xef\xfe\x7c\xfe\xb4\x63\x62\x3c\x53\x7a\x3c\xa2\xca\x1a\x56\x07\x48\x40\xd4\x28\x3f\x95\x50\x6d\x25\xf9\xed\xb9\x00\xeb\x87\x0b\x37\x13\x96\xcf\xd4\x82\x3f\x47\x56\xb5\x4b\xea\x27\x72\xdb\xed\x79\xf4\x3e\x78\x7b\xff\x3a\x54\x91\x6e\xf1\xe3\x73\xd9\xc6\xea\xee\x25\x8f\xa1\x37\x78\x63\xf6\x78\x0d\x68\x78\x33\xba\x46\x0b\xce\x73\x84\x51\x6a\x73\x6e\x0d\x3b\x39\x7f\x34\x87\x82\x71\x62\x55\x4c\x0c\xe5\x4a\x2c\x48\x54\xba\xe2\x7b\x7e\x9e\x8c\x76\x5a\x2c\x5d\x91\xe3\xba\x3a\x70\x22\xf7\xf8\x8c\x97\x93\x6f\x25\x44\x20\x15\xab\xa5\x8b\x6b\xe2\x0f\xb5\xe8\xba\xe1\x40\x0f\x43\xe0\xb2\x25\xbb\x28\x60\xda\x5f\x70\x21\xbe\x7d\x5b\xd6\x78\xad\xa8\xfb\xfd\xc7\x18\xe3\x12\x98\xcf\x32\x68\x55\x43\x78\x21\x08\xc5\x99\x3f\xe0\xc1\x41\x96\xfa\x13\xb8\xa2\xda\x2b\xdb\x38\xad\xcf\xa3\x1f\x8b\xba\xe8\x62\xb9\x1c\x3c\x63\x71\x9a\x44\xce\x6e\xd8\x64\x6b\xec\xbe\x13\x7b\x1e\xf2\x3a\xf7\x01\xbf\x11\x3e\x7e\x03\xbf\x7b\x77\x1b\x27\xf0\x7a\xe0\x87\x7f\x0c\xb7\x1f\x3f\x7f\xf3\xee\x01\x7a\x2b\xfd\x49\x1e\xa1\x6b\x5b\x6d\x7b\xdf\xc4\x86\x19\x2a\x0b\xc5\xca\x32\x3d\xa5\xce\x71\xad\x32\xb1\xe7\x85\xcf\x7d\x27\xa1\x80\xfa\xe4\x5b\x0e\x08\xca\x45\x2c\x95\x1f\x42\xfa\x1c\x79\xe7\x95\x95\x1a\x28\xe0\xe7\x5a\xe4\x1d\xdb\x97\xcf\xd5\xa4\x77\xf7\xdf\xae\xb3\xff\xe7\xcf\xf4\xd5\xf1\x85\x4f\xfc\xf6\xe3\xdd\x87\xbb\xfb\x3b\x48\x1e\xee\x76\x91\x9f\x52\xa0\xbe\xcf\x75\x9e\x96\xa6\xd2\x74\x2c\xfd\x6c\x65\xee\x46\x5a\xc7\x85\x3f\x64\xf3\xbe\x5c\xba\x46\x3b\x3f\xfb\x49\x0b\xec\x3b\xe0\xa0\x96\xb9\x22\x8e\x13\xb2\xb7\xd6\x4f\x50\x2e\xc5\x1a\x58\x5f\x62\x9c\x64\xda\xcb\xcb\xcd\xda\xe3\xdb\xb0\x23\x09\x55\xdc\x1b\x95\xa2\xac\x7d\x59\x43\x2a\xd6\x20\x67\x2f\x7d\x6d\xbd\x3e\x13\xe7\x92\x6e\x91\x71\x14\x5d\xe3\xa5\x64\xc3\xb8\xff\xa5\xcf\x32\x5b\x5e\xa1\xa8\xbd\xae\x21\xe2\xeb\xfe\xb4\x57\xde\x39\x2f\xce\x42\xca\xc4\x2d\x12\x4e\x5b\xad\xf1\xf1\x89\xdd\x9a\x3d\xba\xf0\xd8\x07\x7e\xb3\xbb\x87\x1f\x21\x54\x3e\x6c\xed\x9d\xef\x5e\x35\x99\x25\x36\x11\x33\xe3\x65\xea\x32\x54\xf6\x35\xb5\xc8\x3b\x0e\x25\xee\x5d\xc8\x84\x5e\x5e\x7b\xf4\x55\x7b\x4d\xaa\x06\x4d\x15\x22\x1c\x5a\xcf\x5a\x6d\x80\x26\xa8\x5f\xe6\x61\x39\x0e\xdb\x3d\xa1\x7c\xe2\x49\xbb\x47\x97\x3a\xea\xbf\x0a\x99\xcd\x6f\xf7\xb7\x37\x1f\x37\xd8\x82\x50\x37\x70\x69\xdb\xd6\x09\xc2\xd8\x1f\x8b\xa9\x2c\x16\x91\xc5\x64\xe9\x8a\xf5\x7c\xb3\xc3\xb0\x47\x3f\x64\x5c\x64\x69\x5d\x92\x9b\x72\xb4\xe3\x62\xdc\x56\x8b\xbe\x71\x82\xd8\xdf\x30\xc7\xcf\x3f\x9a\xe3\x31\x29\xda\x0a\x17\xa9\xcb\x8b\xb2\x36\xc4\x20\x3f\x8b\x63\xd9\x39\x98\x7d\x76\x7d\x5d\xa7\xd8\xa2\x23\xda\xa6\x48\x5a\x63\x80\xbd\x4c\x71\x97\x4c\x4f\xec\x56\xff\xf9\xe3\xef\x68\x3c\x74\xb8\xcc\x53\x97\x95\xb9\xb5\x84\x22\x3f\xf3\x63\x61\x5d\x70\xad\x2e\xaf\xcb\xf8\xa8\x45\x87\xaa\x0c\xe3\xd3\x46\x5b\x20\xaf\xc7\x3f\xfd\x57\x8e\x2f\xe2\xae\xad\xca\x2c\x75\x59\x91\x5b\x8b\x69\xe9\x4f\x7c\x44\xd6\x05\xc6\xb3\xcb\xeb\x65\xfc\x5f\x5a\xe2\x70\xdf\xba\x23\x7b\x1e\xfd\x45\xf4\xd7\x17\xde\x81\xbb\xb0\x0d\x46\x61\x1b\xfc\xfe\xfa\xe8\x6d\x1b\x26\xbc\xca\x36\x82\x35\x7e\x50\x90\x67\x52\x57\x75\x9c\x59\x99\xdb\x11\x9b\x46\x32\xba\x60\x46\x04\xe1\x89\xd4\x84\x09\x9a\x14\x09\x3e\xe7\x3e\xf3\x3d\x87\x1c\x1a\x2b\x6b\x5d\x2e\x33\xc6\x96\x51\xb2\x47\xe7\x93\x72\x5a\x27\xb4\x9e\xc4\x30\x50\x3c\x6b\xe6\x36\xbc\x1f\xf4\x54\x05\x9c\xbc\xbf\x88\xbe\xb9\x56\x05\x3d\xe3\x5b\x7d\xb8\x26\xa1\xb7\x7c\xee\x76\x07\xfb\xfd\x4d\xe1\xb2\xec\x04\x39\xf3\xa7\x53\xfb\x14\x49\xc0\x07\x8e\x1d\xe2\x4a\x29\xc7\x17\x91\x30\xdd\x4a\xae\x9f\x22\x3f\xec\x15\x2a\x4a\x6f\xfb\x90\xcf\x6a\x0e\x12\x2a\x27\x34\x55\x62\xc1\x15\xe9\x5b\x6b\x4e\x23\xa6\x66\xb4\x17\x2e\x8f\xdf\x74\x76\xc0\x2b\xa5\xbd\x3d\x3b\x6c\x3d\xd6\x52\x99\xa2\x62\x55\xea\x0a\xd1\x38\xee\x0f\xce\xf7\x06\xb2\xc2\x39\x32\x36\xb1\xb3\xab\x88\xe7\xc3\xd6\x57\xcb\xcf\x93\x73\xae\x56\x4b\x5b\xe4\xc4\xe1\x51\x50\xb1\xc7\x67\xba\x1c\x7d\x2b\x20\x03\x67\x44\xad\xea\xd8\x12\x3f\xd6\xb2\x6b\xfb\x03\x3b\x0c\x97\x3e\xff\x2a\xf0\xe5\xfd\xb3\xe8\xff\x13\x2a\x3f\x1f\xb3\x75\xe3\xfe\x6e\x13\xe8\x33\x3c\x6e\x0b\x79\x49\x9b\x7e\xfb\xe1\x8d\xec\x1b\x62\x59\xe3\xf0\xe8\x38\xa4\x58\x19\x32\xba\x14\x72\x27\xa8\xb4\xae\x76\x5c\x8a\x2c\xab\x50\x91\xda\x9c\x6a\xc7\x3c\xa6\xb9\x2b\xc8\x4e\x2f\x8d\xaf\xfd\xc8\x75\x03\x88\xd1\x86\x0b\x02\x07\x3f\x51\xa1\x2d\x95\x58\xd5\x02\xfb\xba\x4c\x53\xa4\xab\x8e\x52\x9e\x8c\x75\x5d\x6e\xb5\x39\x09\xf4\x81\x33\x7c\x8a\xfe\xe2\x59\xa3\x19\x6c\xa2\x7e\xf7\xe5\x59\xd2\xdd\x5b\x25\xdf\x3f\x0b\x9a\xb8\xda\x67\x0c\x4c\xde\x1d\x2a\x88\x26\xa0\x75\xcd\x8d\x9b\x21\xed\xb8\x1b\x10\x6f\xaa\xb4\x4e\xa5\x9f\x3b\xb5\x34\x92\x5a\x22\x77\xd3\xf9\xe4\xe5\x53\x64\x7a\x28\x24\xad\xb9\x8c\xb5\x6f\xb9\x14\xb5\xd2\xc2\x18\xc5\xbd\xce\x0b\xa4\x50\xc7\x30\xdf\xe1\x76\xc4\x53\xb3\xae\x7b\xf7\xdf\xba\xee\xbc\x9e\x1b\xe1\x5c\x41\x64\x95\xb9\x42\xf6\xb5\xf0\x93\xf3\xad\x01\x94\xd9\x86\x4c\x4d\x3c\x5a\x69\x94\x39\x37\x92\x58\x2c\xf7\xfc\x7c\xa8\x9d\xab\xf5\xd2\xbc\x5e\xf7\xf0\xdc\xac\xeb\x6e\xd7\xe7\xa6\xfd\xc9\xba\x43\x64\x9e\xf0\xad\x88\x87\x90\x63\x0e\x7e\xc3\xfb\x2b\x73\xff\xa5\x5a\xf2\x4a\x23\xff\x02\xb3\xf9\xe5\xf1\xf6\xfe\xf7\x1f\x6f\x18\x45\x60\x17\xd6\x5b\xde\x1f\xd3\xee\x48\x53\x9b\x11\xec\x87\x49\x66\xba\xa6\x43\xed\x4f\xda\x53\x01\x52\xf9\x22\x4e\xb3\x26\x83\x63\x51\xc6\x03\x65\xf6\xc8\x85\xb0\xa2\xc4\x4d\x79\xa8\x50\x55\xa1\x52\x55\x18\x4a\x2f\x3a\xe3\x00\x59\xad\x51\x19\xe4\x8a\xbb\x2b\x57\xd8\xbb\xfb\xcf\x9f\x1e\xf7\xb7\xcf\x77\x16\x41\xc2\x9b\x7f\x01\xd7\x95\x2d\x42\x41\xcd\x97\x4f\xdb\x51\x76\x6f\xe3\x2c\xaf\xd3\x3c\x4e\xcb\x4a\x73\x0c\x62\xa9\x06\xcb\xbb\xa7\x28\x25\xc3\x28\x72\x5b\x3a\x7f\xf0\x47\x9b\x4d\xb4\x36\x47\xe3\xf9\x26\xe2\x4d\xcb\x85\xe0\x01\xfa\xd6\xf6\x84\x49\xc1\xf3\x9c\xa8\xaa\x59\xa3\x6d\x5d\x96\xb3\xe7\x83\xa9\x37\x9f\x63\x17\xf8\xdf\x75\x7c\x08\x9d\x5b\xa1\x6f\xfa\xdd\xeb\x78\xf3\xe2\x8b\xdf\x04\x34\x9b\x50\x45\x11\xe2\xa2\x23\xb0\x3a\x46\xa1\x60\x0d\xfa\x3f\x16\xd0\xfa\x06\x4e\x31\x5a\xc6\xbc\xf2\xe1\x36\x8d\x25\x25\x60\xa8\x98\x1f\x7c\x1f\x0b\xa5\x94\xb2\xce\x5a\xe7\x9c\x6f\x95\x21\x16\x8b\x4a\x59\x4b\xa2\x68\x07\xed\x93\xde\x93\xc4\xbe\x8c\x1f\x18\xe7\xae\x2c\x6f\xd7\x36\xdf\x57\xf0\x5b\xeb\x02\xc6\xd1\xd1\x42\x66\xe7\x19\xd0\x57\x01\xd5\x11\x14\x64\x7e\x06\xda\x3a\x69\x1b\x7f\xc4\xdd\x58\x4d\xf1\xb1\x69\x9a\xc6\x0c\xc6\x0c\xc3\xe0\x25\x57\x4a\x73\xa9\x1c\xb6\xf8\x52\xf3\xc3\x6f\xeb\xa4\x8c\xee\x43\x96\xf1\xdf\x6c\xbc\x44\xdf\xad\x1f\xbf\xdb\xe0\x66\xde\x07\x44\xe2\x0b\x28\x59\x08\x3b\xbe\x5f\xd7\xed\xdd\x97\xfb\xf7\xf7\x8f\x9f\xee\x7f\x17\xe7\x6d\x4f\x62\x0a\x9a\x67\x39\xd4\xe0\xe8\xd0\x79\x11\x53\x57\x96\x30\xfd\x31\x03\x5b\x22\x15\x73\x2f\xa1\x53\x26\x46\x75\x8d\xfd\xc9\xeb\xd9\x0f\x25\xd4\xb8\xb4\xea\x28\xb2\xd4\x11\x5b\x56\x95\xd4\xa4\xb2\x96\x54\x5a\xce\x18\x55\xcb\xa4\xb5\xc6\xd1\x2e\xae\xe3\x26\xe0\x6e\xfe\x49\xbd\xbc\x2e\x3c\x4c\xd2\xc9\x01\x73\xf3\x0c\xe5\xd7\x0a\xf2\x09\xe4\x1a\x22\x30\xd9\x1c\xf9\x18\x9b\xae\x53\x6e\xba\x19\x57\xb5\xd8\x56\xeb\xb6\x6d\x7d\xc7\x14\xd1\x15\x63\x6b\x04\xb7\x61\xd7\x54\xe1\xae\x50\x45\xff\x34\xfa\xe7\xd1\xff\x19\xfd\x5f\xd1\xff\xfd\xd2\xc1\xbe\x25\xb6\xbe\xff\xf0\x2a\xf2\x0c\x70\x35\xf7\x57\x54\x9b\xdb\x0b\xaa\xcd\xfe\x15\xac\xcd\x46\xd6\x77\x79\x3d\xd3\x66\x3f\x7c\x7a\x7c\x7e\xdd\xc3\x97\xbb\x4b\x4a\x39\x41\x3a\xcd\x19\xe6\x08\xa5\x88\xf1\x1a\xac\x4e\x73\x8e\x59\x85\x11\xe5\xf5\x52\x27\x4d\x66\x32\x28\xfd\x21\xcb\x31\xd2\x54\x57\x65\x9a\x99\x8c\x62\x41\xb9\xa9\xac\x40\xb9\x3f\x8c\xe3\x34\x4d\x13\xc6\xb9\xef\xbc\x40\x5a\x77\xdd\x30\x8c\xa3\x3f\x40\xad\x54\x82\x2e\xb7\x43\x05\x25\x15\x11\xb8\x4c\x15\xe7\xc3\xb1\x60\x64\x3d\x9b\xab\xf5\x07\xdf\xad\x56\xac\xfd\x50\xd7\x87\xd2\x37\x47\x7f\xd2\x26\x7f\x8a\x56\x63\x93\xca\x74\x90\x82\x53\x52\x2a\x21\x75\x9a\xa9\x35\x9c\xcd\xdd\x6a\xdc\x52\x9d\xdb\x2c\xc1\x71\xa5\x6b\xdc\xe8\xcb\xbd\x44\x1b\x8b\x80\x9b\x9a\xbd\xc2\x2d\xbd\x78\x10\x0f\x20\x24\x71\x58\x4a\x20\x65\x29\xa8\x51\xed\x5e\xb9\x86\x35\xce\xa7\x67\x83\x2a\x66\x35\x4f\xcc\x96\x13\x60\xa1\x26\x90\x85\xd8\x64\xe3\x68\x7b\x83\x2f\x9f\xbc\xa0\x1c\x7c\xf7\xa6\x22\x90\x5b\xe3\x54\x03\x8d\x35\x52\xd5\xc8\xa0\xb6\x51\xba\xb5\xad\x82\x14\x4e\xce\xb7\x2e\x84\xfe\x7b\x46\xfc\xc1\xc9\xb6\x37\x9d\x6c\x5b\x7f\x24\xd4\xf4\xaa\xa9\x27\x23\x8e\xde\x2c\x99\xd6\xf1\xec\x8b\xd5\x3b\xdd\x25\x2e\xe0\x76\x8b\xd7\xf6\x78\x77\xf9\xb3\xf1\xbb\x7e\x0a\x48\xdd\xd7\x5b\xc8\xef\x03\xe7\x70\x32\xb5\xf5\x54\x8f\xe3\xf1\x8c\xc6\x16\xe8\x34\x69\xab\x9d\x69\x62\xac\x95\xe3\x66\x77\x0a\x11\xba\xf4\xf6\x35\x81\x1e\x22\xbe\x69\xd5\x78\xea\xfd\x49\x9d\xe6\x0b\xde\xe7\xf1\xa6\x09\x78\x87\x1f\x5f\xb3\x77\xdc\x04\x48\xfd\xcf\x5f\x3e\x44\xc9\x8f\x68\x9f\xf7\xb7\x1f\xbf\x89\x25\x54\x01\x66\x11\xb2\x25\x82\xd4\x6a\xc5\x15\xa3\xce\x1f\x4f\xe3\x88\xb0\xd3\xa4\xce\xc2\x2d\x52\xd9\xd5\xd6\xe5\xdd\x8d\x15\xb4\x92\xda\x16\xc8\x77\x4d\x9a\x5b\x47\x7c\xe4\xa7\xa2\xd2\x02\x8d\x4f\x51\x85\x2b\x51\xba\x09\xa2\x22\x33\x90\x05\x7e\xfe\xb8\x08\x18\x8c\x7f\xfb\x73\x7b\xe6\xee\xc3\xed\x77\x70\xbf\xbf\x79\x66\xf7\xb9\xff\x74\x7f\x02\xe5\x60\xb6\x60\xbd\x8c\x53\x9f\x43\x34\x33\x3f\xf9\xc9\xe3\xc9\x73\x06\xbc\xf3\x19\x1c\xbd\x89\x83\xb3\x7e\xd3\xf5\xfd\x30\xd8\xd1\x76\xcc\x19\x28\xe6\x46\x6b\x67\xc7\x71\x8c\x92\x48\x3d\xb1\x78\xf5\x6d\xde\xd4\x20\xdc\xbe\xd4\x20\x7c\x06\x6b\x95\xd4\xa6\xaa\xb5\xb0\x0e\xb8\x51\x93\x9b\x76\x9a\x4a\xa3\x59\x1f\xbe\xfa\x23\xf3\xc7\xa7\x48\xce\x17\x1e\x32\x72\x6b\x76\xec\x67\xf6\x99\x97\x34\xc4\x03\xdc\xdf\xbd\xd9\x67\xe2\x61\xae\x81\xd4\xa1\x02\x84\xfc\x70\x82\x6a\x86\x50\x23\xc4\x75\x77\x92\xc7\xb8\x19\x07\xdd\xce\x89\x19\xc7\x61\x70\x7e\x74\x5b\x7b\x1f\xf2\x29\x1f\x8c\x13\xad\x6e\x4c\x5b\x87\x3b\xae\xa4\x08\xd8\x99\xdf\x5e\xeb\x86\x2e\x97\xf6\x1f\x02\xf3\x5a\x74\x73\xbd\x08\x4e\xa6\x3a\xc5\x84\xcc\x8d\x76\x47\xa7\xa1\x24\x4b\xed\x4f\x4f\xd1\x72\x12\x09\xf3\x48\x4b\x23\xed\xde\x64\x9d\xc5\xc8\x8e\xa2\x37\xb8\xaa\xea\xf5\x40\x18\xa8\xd3\x30\x93\x51\x09\xb3\x9d\x75\x36\xf0\x41\x89\x3f\x7d\xd6\x25\xcf\x67\xdd\xef\xbf\x9f\x40\xda\xb8\xda\xf2\x9a\xc3\x1f\x0b\xe8\xbc\x8d\xa3\x35\x68\x2c\xac\x3f\xf9\xd9\x00\x49\x18\x64\x10\xb9\xc9\x4f\x71\x1f\x36\xd7\xd9\xda\x79\x9e\x3d\x67\x8e\x29\x21\xd8\xba\x43\x84\xf8\xae\x7c\xc2\xb7\xea\x17\x9f\xa1\xfb\x5f\x78\x86\xe4\x58\xcf\xf5\x3c\x43\xfa\x75\x9a\x47\x90\xf3\xac\x9d\x6b\x6c\x1f\x73\x67\x9c\xac\x7f\xdb\x43\xb4\x0b\x18\x87\x3f\x1d\xfb\x6d\xba\xe9\xb2\xce\xaf\xc6\xce\x8e\x35\xe4\xdb\x3a\x97\x5f\x25\x64\x47\x30\x90\xfb\xa3\x72\x4d\x6f\xa7\xd8\x34\xb5\xd3\xdd\x6f\x7c\x8c\x2f\xf5\xc4\xff\x75\x5c\x93\x5d\x0d\x1c\x4a\xe1\x1b\x2f\x4a\x06\xc4\x04\xce\xcb\xce\x17\xad\x4c\xa4\x5b\x46\xe7\xd6\x6d\x7b\x7d\x3d\xb3\x6f\x5e\xb8\x26\x8f\xe6\xa7\x5c\x93\x40\x9e\xc8\xbe\x8d\x45\x94\x45\xdf\x46\x79\x14\x7d\x7f\xf7\x70\xf7\xa6\x03\x6c\x55\xc7\xcd\xfb\xfb\x4f\x30\xd9\x1b\xc1\x99\xb0\x85\x63\xf8\xeb\xb0\xab\xd6\x17\xf7\xc7\xa4\x58\x3a\x29\x52\x97\x8a\x1c\x34\x95\x81\x57\x47\xc4\xc3\xad\xde\xf3\xe8\x6f\x43\x2f\x57\x04\x6b\x28\xf6\x42\xb9\x96\xdc\xbe\xbe\x26\xff\xfc\xe5\xfe\x76\xa3\x5d\xfb\x72\xbf\x9e\x9e\x20\x76\xc7\xba\xa5\x63\x23\xdb\x4e\x41\x25\x7d\x35\x21\x4a\x18\xcf\x89\x28\xc7\xf6\x5c\xf5\x71\xdd\x79\xc4\xc0\xd4\x3e\x9f\x76\xd3\xd7\x72\xcf\x1d\xc6\xb4\xe2\x9a\x21\x29\x4c\x07\x38\xf3\x27\x4c\x32\x9b\x17\x80\x30\x66\xc6\x4f\xad\x36\xa3\xa7\x7a\x8b\x1f\xcb\x50\xc7\xcd\xa3\x3c\xfa\xb7\xd1\x7f\xb9\xe0\xbd\xdf\xfe\x84\xa8\xf8\xdd\xfd\xf6\xe8\xbf\x06\xcc\x7a\x26\xb7\xf8\x85\x5f\x24\x0d\xf0\x2c\xad\x33\xe8\x73\xa5\x84\xcd\xad\x40\x28\xf3\x23\xf7\x9a\x00\xa2\xbe\x87\xa3\x32\x90\xa5\x4c\x55\x24\xa3\x55\x99\xe6\x3a\xef\x98\xcd\xe4\x32\xbc\x7e\xbf\x48\x0b\x5d\xb4\xeb\xfb\x37\x3d\x61\x85\xf6\x7c\xcc\x6c\x26\x8f\x5e\x4b\xc3\x21\x5d\xb8\xb5\x8b\x1d\x73\x9d\x21\x03\x6a\x39\xf5\xb2\x81\xd6\x5c\xdf\x2b\x2d\xa8\x65\xee\x64\x0d\xdd\xd6\xf3\x47\xe3\x35\x56\xde\xf6\x94\x6b\x00\xf5\xed\x33\x28\xf6\x37\x77\xc1\xc0\xbf\x01\x66\x50\x2e\xb0\xcc\x14\xe7\x84\x56\x4e\x9f\x1a\x83\xb0\xc2\x7b\xe5\x2b\xc6\x68\xab\x79\xdb\xb8\x5a\x3b\xe5\xfb\x59\x80\x8e\x09\x58\xe4\x9b\x23\x86\x62\xeb\x2b\xb2\x4f\xfa\x26\x0a\x5c\x21\x97\x88\x7c\xf3\xcb\x2e\x5e\xcd\xfd\xdd\xfd\xdd\xe7\x77\x9b\x11\x7f\xb9\xdd\xdd\x7c\xfc\x92\x68\x4e\xb9\xd6\x80\x43\xfb\xdd\xd2\x28\x31\xc5\x64\x9a\x42\x95\x53\x7e\xda\x4b\x41\xd1\x64\x0e\x07\x7d\x30\xe7\x36\x29\xd0\xd7\xda\x5a\xdf\x63\x47\x49\x8d\xd6\x35\xdc\xcd\x61\x0d\x51\xf4\x4d\xf4\xfd\x86\x30\xf1\xed\x7f\x80\xf7\x5b\x46\x24\x30\x23\x7e\xba\x4b\x5e\x5d\xda\x6c\x9c\xea\x0f\x8f\xeb\x86\x7a\x9b\x57\x54\x52\x66\xb8\xa1\x55\x5c\xa9\x8a\x1b\xa9\xb8\xaa\x69\x23\x15\x42\x7d\x49\x48\xb1\x47\xbe\xa2\x9a\x52\x90\x63\x3f\x70\xd5\x02\x3b\x1f\x44\xe1\x9d\xd0\xc2\x08\xed\xa8\x25\x6e\x84\xa8\xb5\x36\x60\x35\xee\xe3\x36\xf4\xd8\xe1\xe8\xdf\x5c\x6a\x62\xff\x21\xfa\x1f\xb7\x2a\xfc\xfd\xdb\x3c\x6d\xd8\x58\x2e\x15\xbd\xeb\xc1\xfc\x7d\x78\x9a\x37\x4e\xd7\x87\x2f\x97\xb6\xc5\xc7\x4b\x0b\xe3\xcd\xe3\xa7\x87\xa4\xda\x15\x4b\x59\x94\x09\xe5\x4e\xb8\xdc\xc9\xd5\x9a\x2a\xc0\xbe\x6f\xb3\x4c\x62\xa4\x33\xdf\x7a\x59\x41\xe3\x3b\x20\x03\x13\x7c\xe0\xb5\x6d\x1a\x40\x8d\x6e\x96\xac\xef\x81\x76\xdd\x1e\xfb\x0c\x57\xe7\xc1\x37\x99\xcb\xda\xb8\xb7\xde\x34\x59\x59\x54\x52\x61\x5c\x21\x5b\x74\xa0\x2c\x27\xca\xd6\xe6\xb8\xfe\x77\x4e\xb5\xd6\x61\x4e\xf8\xd6\xc5\xc7\xe7\xbe\x82\xf7\xa1\x9e\xe4\x15\xfa\xc7\xfa\xfa\x5b\x78\xe5\x6b\xa3\xe4\x74\x4e\x5d\x3c\x2c\xd5\xf5\xe5\xe8\x30\x93\x29\x66\xc7\xb1\x3a\x4c\xf1\x71\x61\x70\xa4\xfe\xb4\xfe\x3f\x49\x8a\x4c\x41\x10\xd6\x14\x6d\x77\xe0\x36\x49\xc3\xd9\x97\x47\xff\x26\xfa\x5f\xb6\x3b\xa9\x6f\x5f\x3d\x90\x57\xdf\xe1\xf3\xf6\x4c\xae\x01\xf6\xf6\xe8\x5d\xb4\xf7\xfd\xdb\xb7\xaf\x4c\xb9\x0f\x37\x91\xc9\xe0\xc0\x1d\x66\x39\xc7\xb8\xc8\xbc\x11\x5e\x63\xc8\x85\xaf\xa1\xc9\x96\xa9\x55\x50\x66\x84\x21\x9c\x93\xb2\xca\xba\xe2\xc0\xda\xd2\xc5\x2a\xbc\x4d\x69\x78\xbb\xc8\xd3\x76\x7d\xbf\x58\x0f\x55\x72\x92\x99\xcc\x4a\x3e\x22\x85\x98\x2c\x7d\x51\x55\xb3\xce\x44\xea\x3a\x2a\x30\x17\x55\x75\x52\x99\x48\x91\x08\x3f\xae\xf3\x2a\x42\x9e\x76\xeb\xb9\xdd\xf6\x9a\x4f\x8f\xdf\xfe\x74\xb3\xf9\x72\xd9\x6c\x5e\xda\xec\xee\x1e\x32\xf8\xf8\xdd\xdd\x65\x66\xaf\xb9\xd1\x2f\xbf\x48\x4a\x50\x69\x9d\xc6\x59\xae\xb5\x34\x65\x2d\xaa\x2a\xf3\xa6\x58\xbd\x27\x8c\x7c\x13\x67\x8d\x83\x8c\x18\x82\x4b\xc6\x8a\x5c\xf9\x86\x41\xde\x2c\xec\xff\xe1\xed\xef\x81\x24\xc7\xd1\x34\x41\x98\x2f\xe9\x3f\x9c\x1e\xb3\x1d\x46\x65\x67\x27\x3f\x9b\xd9\x6d\x46\x47\x55\x25\x7b\xd7\xd6\x96\x5f\xe7\x66\x26\x6d\x67\x7b\x96\x77\xb7\x77\x8b\xbd\xb3\x3b\xc3\x9d\x72\x10\x21\x42\x84\x08\x11\x22\x44\x88\x10\x29\x52\xa4\x48\x91\x22\x45\x8a\x14\x29\x52\xa4\xc8\xca\x74\xc2\xcf\x08\x7a\x44\x46\x54\x65\x75\x55\xcf\x8d\x5d\x64\xd1\xdd\xc3\xa3\x8c\xf8\x21\xf0\xe2\xfd\x7d\x9e\x67\xdf\xa6\x61\x78\xfb\xfa\xd8\x63\x42\x91\x65\x43\x6c\x62\x36\xd8\xa1\xd2\xb2\x5d\x85\x31\xab\xda\xbe\x91\x50\x59\x6c\x27\x35\x03\xd6\x8f\xdf\x15\x14\xd4\xe3\x97\xbb\x7e\x9f\x9f\x8d\x2f\xbd\xff\xdf\x9e\xe1\xfa\x05\xcc\xe9\x05\x23\xe8\x1f\x61\x57\x6a\x98\x9f\xe6\xa9\x49\xd2\x03\xb1\x79\xa1\xfd\x44\xd8\xd6\xce\xb6\x5b\xeb\x02\x7a\x08\xed\x38\x31\x62\x91\xcf\xf3\x7c\x5c\x2a\x04\x33\x42\x49\x91\xe9\x92\x2b\xc5\x90\xca\x54\x8a\x70\x46\x08\xca\xd3\x1c\x6b\x87\x37\x78\x2d\x7c\xe5\xb8\x92\xbc\x57\x8f\xda\xc3\xc3\xdd\x03\x6b\xcb\xb6\x2d\xdb\x43\x0d\xad\x2d\xcc\xe7\xf4\x30\x78\x81\x1f\xfd\xda\xe7\x11\xfc\xe4\x79\xf8\xf0\xf6\xc3\xcf\x3d\x8f\xed\xcf\x3d\x98\xed\x79\x24\xb1\x10\xa2\x4c\x2a\x9e\xe7\xa1\x15\x99\x45\x04\x68\x6e\x95\x6c\x4a\x48\x89\x42\x28\xa5\x24\x4d\x74\x68\x3b\xb2\x34\x7e\xd3\x18\xc8\xb6\x6f\x13\x42\xd2\x28\x32\xee\xdb\xdb\xd3\xa0\xfd\xfe\x34\x3a\xe3\x9e\x86\xd6\x5f\x9e\x06\xb2\xb3\x7b\x1a\x4a\xad\x72\xfb\xbf\x0a\x01\xfc\xf1\xcb\x5d\xb7\x28\xae\xf9\xb9\x39\xe5\xee\x4c\xdf\x11\xc5\x5f\x3f\x96\x78\xde\x3d\x7c\xf3\xe6\xec\x05\xce\x2c\x7a\x22\xe5\xfa\xfe\xed\x41\xb7\x9a\xe1\x80\x98\xbc\x23\x57\xaf\x30\xeb\xe0\xa7\x36\x1f\x0d\xd5\x5d\xb8\x8c\xc5\x3c\x07\x23\xb7\xa9\x35\x78\x04\x32\xfb\x0e\x99\x7d\x30\x10\xfa\x04\x3a\xdb\x59\x2d\x1b\xd5\x28\x5b\xe9\xce\x4c\xea\x56\x7f\xa2\x0f\x3b\x06\xce\xce\x54\x79\x03\x92\xba\xbf\xdb\xd1\x44\x61\x3b\xe8\x9d\xf7\x64\x8f\x3c\xc3\x38\x99\xe9\x28\xec\xcc\x40\x10\x8b\x18\x84\x9f\xdb\x43\x71\x51\x50\x42\x42\xed\x6c\x79\x0c\x3d\x54\x85\x2d\x6c\xe1\x97\xd8\xd6\x8e\x32\x01\x0a\x98\x6c\x62\x5b\x5d\xb6\x50\x03\x6e\xed\x4c\x84\x12\xa4\xa7\xda\x38\xc2\xe5\x43\x10\xfd\xcc\x3c\x6c\x1d\xd9\xe6\xe1\xdb\xe7\xf3\xb0\xd9\x29\xdf\x1d\x48\xa3\x29\x0e\x54\x99\x8d\xc4\x2e\xa8\x5c\x2b\x9f\xd8\x64\xaa\xa8\x19\x43\x88\xe6\xe2\xea\xd9\x65\x9b\x8a\xd8\x96\x64\x04\x04\x9e\x9b\x8b\x78\x34\x8b\xcf\x6e\x53\x51\xeb\x5a\xd9\x7a\x9f\x0a\x2f\xf0\xf6\xbc\x66\xed\xd0\x38\xbf\x77\x51\x92\xa7\x5c\x91\xe0\xd1\xb2\x78\x0e\x9e\xbc\x27\xee\xce\xc7\xf1\x93\x77\xa4\x9f\xbd\xa3\xf7\xa9\x95\x87\xc1\x85\x99\x68\xdd\x56\x71\xdb\xf2\xcf\x29\x28\xe7\x1c\x3c\xe8\x55\x2b\x2e\xf9\x5a\x22\x64\xae\xde\x9e\x36\x3c\x25\x54\x10\x41\xb7\xf1\xab\x2b\x73\x7e\x93\x9d\xef\xf1\xbb\x27\xb4\x1b\x87\xe4\x73\xd3\x26\xbf\x82\x41\x7a\x8c\xaa\x38\x85\xe6\x52\x2f\xa9\xf4\xe3\x75\xda\xae\x2e\x28\xad\x70\x11\xf2\xf6\xf3\x02\x95\x03\x72\x55\x27\x91\xa0\x7c\x8d\xfd\x09\x5b\x59\xda\xbc\xb4\x48\x6d\xa3\xdf\x5e\x3c\xcf\xfb\x8d\x87\xae\x38\x28\x6e\xdc\xc5\xf1\x2d\x92\xf7\x6f\x6f\x15\xb5\xb7\x5c\xb6\xdf\x9e\x37\xc5\xfb\xfc\xf6\xc3\x1b\x57\xc7\xff\xea\xdd\xfb\x87\xc7\x43\x70\x7b\x77\xab\xf3\x3f\xc0\x0b\x40\xbe\xd7\xe7\xe8\x2d\x60\x19\x47\x10\x63\xb3\x76\x19\x69\xa2\x2e\x4b\xdb\x4d\xa8\xf5\xc4\x0e\xdb\xab\xc8\x62\x16\x67\x45\x11\xf3\x38\xb7\xad\x8c\x0b\x51\x40\x92\xc9\xe4\x24\xd2\xa2\x10\x49\x79\x59\xfc\xaa\x10\x4b\x4f\x98\xb2\x72\x18\x86\x75\x1c\x86\xc1\x4a\x69\x12\x23\xc2\xba\x4e\xda\x2a\x4a\x96\xbe\x18\xba\x66\xdc\xac\x19\xcf\x3b\x05\xcc\xe9\x1c\xdc\x9d\x85\xf7\x5e\xee\x21\xef\x7f\x77\xf9\xb1\x37\xab\xe1\x19\xec\xcb\x87\xe7\x19\xbb\x0e\xfb\x62\xd3\x83\x9c\xaf\xea\x91\x53\xc8\x7d\xed\x02\xa8\xb7\xe2\xb0\xdf\xc3\x87\x8f\x0f\x87\xc1\x8e\x7b\x12\x4e\x27\x07\xde\x49\x2d\x5a\x56\xf9\x4c\x12\xca\xe8\x3a\x91\x5c\xe4\x04\x7a\x49\xcd\x34\x29\x63\xca\x52\xd9\x25\xb3\xa3\x8c\xc6\xb8\xef\x71\x47\xf2\x22\x4e\x28\x67\x3c\x0e\xf9\xc1\xa8\xed\x51\x29\x4e\x95\xd0\xb6\x87\xa2\xe2\x12\xfb\x05\x92\x98\x12\x42\x28\x66\xe4\xf3\x94\xf7\x50\x28\x21\x94\x6d\x1d\x4e\x1c\xf7\x71\x8c\xac\xb6\x42\x30\xd1\x16\x59\x96\xd2\x3a\xa7\x6c\xcf\x97\x71\x35\x05\xcf\xc7\xfe\xdf\xfe\x85\xc6\xfe\xa5\x2e\xee\xe1\xd0\xda\x1e\x2a\x0d\xb5\xad\xd5\x24\x3a\xad\x65\xcf\x6a\x5f\x4b\xca\x18\x5b\x3b\xba\xa9\x6a\x30\x49\x56\x2d\x8b\xde\xc6\xae\xed\x94\xd9\x61\x1b\xfb\x30\xe0\x9e\xc9\x38\x66\x9c\x16\x79\x1c\x89\x67\x63\x97\xca\xf6\x80\x1a\xf6\xeb\xc6\x6e\xac\x90\x4c\xb4\x3c\x4d\x68\x85\xd2\x6c\xaf\x87\x3c\x07\xd2\xe5\x13\x6b\x97\x9d\xf1\x9f\x5d\xde\xd5\xff\xea\xe1\x27\xcf\x8b\xc3\x68\xdc\x37\xf1\xee\xd5\x7b\xbe\x95\x77\x16\xb3\x0f\xef\xef\x8f\xef\x1f\x7e\x7b\x86\xfb\xf7\x0f\x7f\xf8\xfe\xcf\xf0\x70\x3a\x7f\xf7\xfa\xb7\xff\x08\xef\x8f\x0e\x72\xef\xfd\x8d\x49\x38\x90\xe0\xa5\xb9\xc4\x79\x43\x0b\xc9\x66\x5b\x43\x6c\xc6\x11\x89\x3c\x4b\x50\x91\xac\xc2\x57\xab\x86\x34\xb4\x95\x9f\x91\xd0\x4e\xbe\x94\x05\x12\x59\xef\x7b\x19\x5e\x25\x49\x84\x2f\x57\x49\x48\x26\x32\x7c\xd4\x8f\x5c\x46\xb5\x50\x6b\xcc\x54\xe3\xc0\x27\x91\x51\xcc\x9f\x0a\xa4\x14\x2a\x2c\xa1\x79\x4e\x87\x64\xc9\x53\x2a\x33\x6c\x43\x62\x63\x2a\x10\x67\xde\xcd\x5f\x87\xfc\xf6\x30\xdf\xfc\x75\xce\x06\xde\xb4\xbd\xfd\x11\x7f\xeb\x7b\x52\x2f\x74\x6a\x65\x4e\x0d\x27\x14\xf2\xc3\x8c\xec\xdc\xc8\x5a\x20\xce\x2f\x83\x2f\x79\x2e\x76\x5c\x24\x76\x35\x81\x39\xe5\xce\x2a\x78\xfd\x1c\xcc\xf6\x27\xc9\x1e\x0f\xef\xdf\xdd\x05\xc4\x86\x8f\x18\xfb\x7e\x64\x0d\x13\x75\x93\xe5\x4a\xd1\x32\xb3\x8b\x1d\x33\x45\x67\x7a\xca\x75\xa5\x2a\x55\x69\xdb\x99\x18\x31\x8a\xfa\xab\x87\x24\x4d\x74\x0d\xb9\x0e\x8c\x8b\x77\xed\xf9\xdf\x6f\x6f\xb9\x7b\x3b\x2e\xf4\xcd\xa7\xf0\x35\xa0\x57\xf7\xef\x8f\xf0\xfa\xdd\xfb\x60\xbb\x6a\x20\x06\x84\x94\x76\xcf\x46\x9c\x6d\xe4\x30\x56\x5d\x45\xba\x43\xaf\x06\x65\x2b\x98\x87\x61\x38\x0e\x65\x69\x3b\x65\xbb\x4a\x95\xda\x76\x90\xeb\x52\x55\xaa\x56\x55\x55\xd9\xbe\xae\xbd\xa3\xaf\xae\xe8\x48\x4e\xe8\x57\xf8\x2b\x3f\x3c\xf7\x57\x06\x44\x32\xc1\x25\x30\xc1\x39\x93\xa9\xcc\x8c\xe2\x6c\x93\xf3\xdb\x0e\xb9\x7a\xda\xd5\x07\x9d\x50\x61\x47\xcd\xaa\x51\x37\xbc\x6e\xec\x50\x50\x55\x73\xa3\x5b\x41\x47\x2b\xd7\x48\x29\xe7\xae\xdc\xb1\x35\xb8\xf3\x6b\x35\x2f\xe7\xe4\xd1\x77\xfe\x15\x7c\xe1\xa7\x39\xb9\x7f\xef\x4c\xff\xd4\x17\xda\xd7\x5d\xb7\x72\x7f\x5a\xe3\x00\x5d\x1a\x7d\x19\x83\xc4\x29\xfa\xc2\x57\x97\x3e\xc8\x56\x15\x84\xae\x0a\x6c\x39\x10\x4a\x67\x39\x53\x49\xcd\x30\x18\x2a\xa9\xe4\x92\x73\x3e\x3b\x12\xad\x53\x80\xae\xc2\xf1\xce\x3d\xc6\xb5\x6f\x51\xc9\x2f\xfe\xfc\xbb\x77\x8f\x00\xb9\xef\xdf\xdd\x39\xaf\xfe\xdd\x57\x38\x04\x02\x5e\x19\xd0\xa6\x69\xda\x8b\x09\xc8\x25\xc2\x7d\x05\x3b\x32\xf1\xed\x62\x8a\x70\xce\xc0\x70\xc6\x18\x3f\x56\x5d\xd7\x75\x7a\xcd\xb5\xc5\xc6\x47\xda\xef\xb4\xb6\x44\x5b\xac\x6d\x87\x5a\x46\x85\xa2\x52\x1a\xba\xf5\x0f\x3b\x8c\x0c\xfc\xac\xa6\xfa\xed\x6e\xfb\x7c\x7c\x77\xf7\xf0\xdd\xed\x1d\x6e\x9c\xb4\xe7\x67\x3a\xe2\xfb\xfb\x57\xf7\x41\xe3\x08\x71\x94\x02\x0a\x8d\x45\x9b\xc2\x6c\x02\x76\x31\xf2\x40\x56\x9a\xfb\x42\x36\x84\x66\x92\xd2\x62\xc5\xd4\x2e\x27\xbc\xce\x0a\x3c\xe5\x5e\x6d\xa8\xb9\x36\x96\x36\x89\x49\x59\x0f\xe9\x26\x7b\xd0\x35\x3f\xeb\x53\x7e\xeb\xc7\x1b\xef\xef\xbd\xf7\xae\xea\xf2\x59\xa9\xc4\xf1\xfd\xc3\x6b\x78\x6e\x3d\x3e\xf1\xd7\xdd\x2a\xe5\xf7\x24\xf1\x5d\xfb\x7e\xf3\xe1\x63\x20\x0e\xb1\x6d\x20\xba\x20\x88\x6c\xe7\x17\xd2\x2e\x0e\x02\x47\xcb\x8b\x04\x1e\x27\x3a\x8a\xfd\xbc\x29\x38\x30\xd1\x55\x8d\xad\x30\x84\x55\xad\x29\xb6\x23\xf4\x79\x3e\xf0\x62\xdb\x81\x9b\x4a\x50\x6d\xcb\x5c\x2c\xdb\xcf\x3a\x14\x45\x9c\x67\x7a\x90\x95\x64\x58\xa6\x3a\x22\x38\x13\x52\x60\xcc\x6a\x17\x47\x59\x6e\x58\xf3\x3b\x9b\xe9\xfe\xc4\x6f\x2c\x97\x5f\x30\x73\xde\xb9\xc8\xd2\xf7\x6f\x5f\xbd\x73\x85\xe5\xcf\xc0\x33\x8e\x0e\x3c\xe3\xc8\x51\x0a\xa5\xc8\x8a\xe5\xc2\xa5\xe2\x4b\x86\x14\x74\x49\x81\xe6\x22\xb1\x39\x82\x96\xf6\x96\x17\x40\x21\x67\xb3\x4d\x11\x94\x40\x99\x6d\x6d\x44\x60\x39\x09\xca\xb5\x16\xda\x6e\x42\x7e\x24\x10\x03\xf5\x3d\x2d\x34\x41\x6b\xa7\xa4\xb0\x9d\xa8\xa5\x62\x88\x0f\x46\x0b\x24\xae\x9e\x54\xfa\x09\x8b\xd4\xaf\x0f\xdd\xd7\xe5\xe0\x07\x98\x65\x3d\x93\x7e\x92\x88\x1a\x44\xc8\x7c\xe8\x90\x9d\x4b\x25\x4d\xc1\xe9\x1a\xfb\xb8\xc8\xd5\x5e\xf3\xe3\xa7\x0e\xdf\x57\xfe\x73\xf7\x9f\x5f\xc2\x60\xfc\x50\x88\xd5\xc5\x15\x37\x49\x6f\x1c\x2c\xef\xe2\x87\x0e\x5c\xbc\xf6\xb1\x4d\x7d\xbe\xbb\x1e\x4f\x29\x21\xa3\x1a\x89\xc4\x92\x31\x89\x25\xd1\x58\x61\x8c\x07\x8c\x5d\x5f\xa6\x1b\xfe\xeb\x5f\x2d\x1f\xef\xdf\x83\xa3\x2b\x07\x55\x42\xa3\xb5\x45\x4e\x4e\x17\x6b\x5b\x3a\xf9\xb8\xc9\x45\x05\x62\xc7\x04\xf7\x53\x47\x1e\x15\x3f\x89\xc8\xd2\x89\x6c\xd8\xa4\x77\x69\x4a\x55\x96\xa5\x1d\x4a\xe7\xf7\x96\xd7\xe2\xcc\x0e\xbd\xf7\xed\xce\x70\x71\x7c\xac\x55\xfb\x12\x4b\xff\x0f\x70\x2b\x59\x3f\xbe\xfd\xee\xfb\xb7\x1f\x1d\x0d\xc2\xeb\x97\xb8\x4a\x37\x6c\xf9\x53\x1b\xad\x09\x46\x63\x29\xaa\x46\x8b\x34\x8f\x75\x22\x38\x2e\x91\xb2\x95\x2d\x10\xb4\x10\x13\xbc\xd6\xb1\x1f\xc6\x89\xa2\x6b\x7a\x6a\x56\x93\xcb\xae\x08\x4d\x28\xed\xd8\xab\x99\xac\x0d\x86\x19\xaf\xf3\xc1\x28\x42\xf3\x82\x50\x82\x70\xc1\x32\x2d\xb2\x14\x93\x5c\xe5\x05\x62\x48\x15\x59\x86\xcd\x4a\xf5\x90\x24\x19\xcf\x6a\x82\x08\x44\x56\x13\x53\xcc\x9e\xe3\x1f\x4b\x5d\x9e\xfc\xc3\xcf\x8d\xe7\x31\x7b\x73\x1f\xcd\x23\xab\xc3\x8b\xd1\x6c\xda\xd1\x3f\xc1\xc7\xfb\xb3\x17\xad\x6d\x92\x0d\x8a\xe8\x46\xb2\x34\x09\x4d\xc4\x58\xd3\x2d\x13\x59\x86\x22\xb1\x22\x06\x11\x87\x3a\x8a\xd7\xee\xe8\x59\x42\x4c\x11\x96\xa1\xb8\x7a\x25\x19\xa2\x61\xa1\x63\x1d\xd9\xf6\x14\x1a\xc6\x0a\xca\x85\xa0\x8c\x90\xb4\x54\xad\xc8\x4d\x41\x29\x2b\x4c\xc1\x55\x24\xf9\x65\xd2\xb6\xc8\x8b\x3e\x5b\x04\xc2\x30\xdb\xc9\x36\x4c\xd3\x65\xdc\xec\x87\xc5\x6b\xcf\xe8\x14\x7b\xbf\x7d\x62\xea\x7f\x51\xe1\xb4\xa7\x0f\x6c\x42\xf1\x27\x5f\xbe\x40\xc5\x39\xb6\xa0\x10\x2a\x78\x22\xb2\x74\x6b\x98\x2f\xb6\x00\x85\x0a\xc4\x52\x99\x66\x94\x15\x5a\x5c\x3d\x3f\xc6\x39\xcf\xb0\xad\x48\xc6\x53\x7c\x8a\x3f\xe3\x1d\x25\x0c\xb0\xe6\x5a\x35\x30\xab\x9f\x7c\x43\x4d\x59\x94\x1a\xb9\x57\xb7\x5f\xe9\x4d\xce\xfc\xe1\xa7\x73\xef\x52\x06\xbf\x32\xf5\x0f\x0e\x40\xea\x0b\xf3\xf4\x3e\xf9\x1f\xee\x1e\x02\x1e\x59\x15\xa5\x86\x12\xae\x10\x8d\x22\x1d\x19\x6d\xea\x92\x34\x65\x96\xd8\x25\x06\x2f\x0a\x75\x18\x59\x11\xb0\x5e\x02\x85\xb1\x88\x63\x95\xc8\xb5\xb3\x59\x2d\x42\x6d\xc8\x3c\x1d\x17\x4d\x09\x61\x8c\x4b\xca\x29\x49\x6c\xdf\xf0\x5c\x23\x42\x24\xd2\x88\xa9\x48\xb0\xcb\xa2\x6c\x9e\x26\x49\x52\xa2\x8e\x14\x9b\xae\xd1\xdb\x9e\xa9\x12\x4a\xcf\xf7\xa7\x6b\xe6\xf6\xe9\x83\xf7\x5f\x7e\x3a\x96\x5f\x58\x47\x4f\xf9\x61\xb7\x85\xf4\x70\x8e\x23\x9b\xc4\x59\x2b\xb0\xaa\x18\x8d\x63\x1d\x52\x5c\xd5\x5d\x8b\xfb\xa6\x48\xec\x1c\x43\x18\x85\x26\x8c\x2c\x3a\x84\xb6\x44\x3c\x0d\xcb\x30\x4f\x07\x45\x4d\xd8\xf5\xa4\x35\xd1\x78\x0a\x35\xe1\x84\xba\x70\x2f\x25\x49\x23\x3b\x96\xab\x82\x48\x91\xeb\x8c\x8a\x88\xd1\xcb\x60\x6c\x91\xe7\x75\x36\xe6\x59\x41\xdc\x3a\x6a\x99\x22\xcb\xb4\xf3\x34\x92\xdb\x58\x8a\xbf\x66\x2c\xbf\xfb\xea\x60\xee\xcf\x59\xb4\x36\x49\x3e\x69\x5c\xf6\x42\x24\x89\x89\x28\xed\x9a\x79\xc0\x73\x5f\xa4\xb6\x8c\x00\xef\x83\x89\x0f\x95\x45\x49\xae\xb3\x6d\x34\xf9\x6c\x68\x13\xf6\x33\x19\xaa\xf0\xea\x9d\x22\x4d\x05\xe6\x82\x2b\x26\xdc\x70\x7a\x9e\xab\x82\x32\x55\xe8\x9c\x8a\x88\x13\x37\x9c\x24\x7e\x36\x9e\xc5\x0e\x4c\x91\xa9\xf7\x3c\xff\x66\x13\x48\xef\xe8\xfd\xa7\xc7\xa8\xe3\xf1\xcd\xf1\xcd\x77\xfb\xf5\x62\xc7\xbb\xf8\xff\xd9\x65\x30\xdd\x86\x77\x7c\xfb\xdd\xfe\xe1\xdd\xab\x53\xce\x30\x25\x14\x68\x64\x51\x04\x62\x5b\x70\x50\x47\x96\xc4\x31\xa7\x54\x28\x92\x25\x49\xa8\x63\x82\x95\x6e\x54\x89\x21\x19\xd2\x78\xfb\x1f\xeb\x28\xb4\x4d\x04\x28\xb2\x6d\x0c\x28\x0a\xab\xe8\xe4\x2a\x3e\x8b\x52\x65\x4d\xa6\xb2\x1a\x29\xa4\x30\xa3\x4c\xb3\x41\x9b\xdc\xce\x06\x32\x81\x0a\x29\x8d\x32\x48\x21\x42\x32\x95\xb5\x89\x4a\x4c\x65\xfb\x67\x78\xd7\x3f\x1e\xcf\xef\x7e\x7e\x40\xa7\xe3\xdb\x0f\xff\x05\x9e\xc6\xf2\x34\x9e\x48\x50\x46\x39\xc8\xc8\x26\x61\x04\x26\xb2\x34\x86\x21\xb2\x59\x9c\x48\x46\xa5\xa6\x59\x9a\x86\x3a\xa6\xc4\xe8\xc9\x0e\x78\x6e\x45\x9a\xda\x34\x86\x31\xb6\x26\x06\x16\x6d\x0f\x8f\xbe\x1c\x0f\x25\xb7\x01\x09\xea\xd2\x8b\x1e\x07\x94\x9b\x6d\x5b\x21\xd6\x20\x85\xea\x97\xe3\x09\x82\xe8\x9a\x39\xcc\xc5\x7f\xe3\xfc\x0d\xde\x13\xf3\xe0\x0b\x36\xcc\x6f\x1f\xd9\x30\xdf\x3c\xf3\x2e\x04\x35\xf0\x72\xa7\xb2\x19\x6c\xd1\x41\x4c\xec\xd8\x19\x6b\x28\x48\x66\x25\x94\xa1\xd5\x1a\x67\x3a\xc3\xfe\x5c\x16\x44\x93\x1d\xe9\xdc\xd8\x34\xcf\x8d\x95\x65\xdd\x82\xb2\xe5\x64\x16\x28\x4c\x9e\xc3\x40\xaa\xae\xe8\xcb\x22\x1f\x4b\xdc\x78\xc1\x21\x76\xf8\xa8\xf9\xd7\xe2\x16\xfe\x69\x5b\xdc\x77\xc1\x97\x14\xff\x17\x71\x8b\xd3\x58\x10\x49\xc9\x10\x62\xca\x70\x4e\xfd\x29\xee\xc9\x40\xaa\xb2\x8e\xb0\xc2\xa3\xd6\x05\x1a\x0b\x2e\xe2\x53\x6e\x13\xa2\x30\x01\x69\xc7\x19\x0b\x3c\x00\xb9\x8c\x56\xcc\x84\x95\x58\x8b\x28\xcd\x0c\x92\x1d\x24\x93\xaa\x3a\xcf\x83\x43\xeb\x62\x17\xf1\x5f\xe0\x31\x3c\x8b\x61\x52\x12\xb1\x44\x90\x2c\x5f\x46\xab\xcb\x53\x6c\xac\xb7\xcc\x55\x9d\x54\x29\x25\xd3\xe8\x27\x3f\x74\xa7\xde\xbb\x61\xf8\x91\x03\x3b\x09\xef\x1f\xf6\xea\xc9\xc7\x2a\x06\xc7\xfc\xf9\xa5\xfa\x7c\x0f\x22\x1c\x9f\x29\xf3\x35\xd0\xd2\xe5\xa6\x36\x36\x8f\x96\x9a\x36\xad\xda\xf4\xb4\x82\x58\x0e\x95\x2d\xfd\x51\x23\xaa\xd8\xba\x90\x54\x67\xe4\xa8\xa7\xc9\xd8\x14\x19\xd4\xd4\xba\x2b\x6d\xdb\xab\x05\x98\xf1\x13\x9c\x0d\x06\x57\xc6\xb4\x59\x5b\xee\xb1\x3e\xe3\xb8\x21\xf7\x5a\x6b\xc7\x71\x14\xbc\x73\x49\xe4\xdf\xbc\xfa\xf0\xea\x8d\x1f\xfc\x1b\x78\xf7\xa7\x8f\x2f\x78\xa7\xf6\xb5\x0f\xef\x9c\x5f\xf8\xdd\xeb\x07\x57\xee\xff\x10\xd4\xd0\x84\x26\xdc\xd4\xab\x30\x21\xb9\xc6\x26\xc4\x71\x12\x99\xcc\x50\x26\x35\xaa\x38\x8a\x2d\x0a\x22\x9c\xcb\x0c\xaf\x54\x87\x26\xd4\x26\x15\x5a\xc4\xf2\x18\x03\x6d\x4b\x63\xb9\x5d\x06\x48\x32\x4b\xec\x5c\x98\x31\xb7\x0a\x92\x92\x6a\xd6\x82\xe7\x13\x18\x18\xc3\x9c\x5e\x1a\x65\x8c\xd2\x16\x5f\xbd\x1b\xdf\x6f\xe0\xb0\x85\xb6\x75\x9c\x78\xdf\x3b\xc4\xbe\xa7\xfe\xbf\x71\xfd\xdf\x0b\x05\xbf\xd2\xfd\xdd\x0d\xbe\x27\x07\x07\x1a\xfa\xb0\x0c\x81\x59\x13\x26\xb4\xd0\xa4\x24\x59\x1c\x95\xb9\x66\x42\x55\x45\x2d\x71\x64\xd3\x20\x27\xb9\x4e\xc9\x9a\xd6\xba\x2c\xa3\xab\x47\xba\xa8\x7e\xec\x3a\xdd\x7a\x9e\x6f\xdd\xba\x7a\x10\xe7\x96\x43\x5a\x32\xcd\x5b\x88\xfd\x02\x46\xca\xb7\xae\x57\x90\xda\x41\xdb\xb4\x15\x15\x88\x9b\x0d\xbe\x63\xbf\xfe\x71\x9f\xf7\xbb\x17\xfd\x3e\x6f\x13\xef\x7a\x7e\x8b\xce\xfd\xb4\xeb\x7b\x40\xb5\xf0\xb7\x69\x37\x96\x45\x09\x2b\x0c\xa9\xc2\x98\xc6\x49\x54\xe6\x26\x53\x99\xae\x8b\x46\x91\x68\x9d\x03\x41\x0a\x95\x93\x35\x6a\x74\x55\x45\x33\x69\xa2\xe6\xb1\xef\x71\x33\x40\x9a\x5b\x66\x97\x88\x96\xae\xf3\x95\xaa\x7e\xbe\xf3\x25\xec\x31\xe2\x27\x0c\xdd\x6d\xdd\xbc\xdf\xe7\xfd\xee\xa9\xfb\x7f\xb7\x6d\x90\xbf\xdc\xfb\x7d\xe2\x13\x3f\x0c\x4b\x28\x2d\x0b\x33\x8e\x4c\xc1\x38\x29\xd2\xb8\xcc\xab\x4c\xe7\xa6\x41\x9d\x26\xf1\xba\x04\x92\x15\x2a\x67\x97\xb1\xd3\x4d\x13\xdb\x91\x4c\x51\xbb\xf5\xde\x96\xc6\x26\xfd\x00\x79\x6e\xa7\xbe\x5f\x5c\xdf\x4b\x5d\x31\xcd\x3a\xb7\x66\x7e\xb6\xef\x41\xe6\x8d\xae\x76\xee\x78\x5b\xf3\xbb\x34\xbf\x7f\xfb\xee\xcd\x97\xd4\xb4\x9f\x28\xa3\xc1\x7d\xf0\x65\xcd\xbb\xde\x9f\x3a\x92\x8b\x8c\xac\x9e\x1f\x45\xa5\x7b\x06\x71\x42\x90\x66\xba\xc8\xe2\x24\x54\x31\xc5\x82\xca\x0a\x77\x1c\x45\xeb\x14\x8e\xa1\x0e\x4d\x19\xd9\x85\x8f\xf1\x70\x92\x88\x20\x82\x9a\x65\x51\x57\xaf\xad\xe6\xdc\x56\x43\xcb\x79\x32\xa8\x41\x73\xa1\xaa\x05\x84\xed\xb9\x52\x5c\x59\x33\xc9\xda\x05\x91\x7d\x98\xbc\xf8\x14\x1e\x93\x1b\x8b\xeb\x8f\xf2\x50\x82\x1f\xfd\xee\x93\x4d\x62\x10\x5b\x41\xf5\x79\x82\x7e\x3b\x37\xd8\x5e\x3d\xd1\x7c\x9e\xa0\xb5\xe6\x20\xaa\x4a\xd5\x52\xd6\xeb\x78\xfb\xb0\xb5\x31\x5e\xbb\x53\xe2\x6a\xad\x7e\x4d\x1b\x19\xc8\xbd\x48\xac\xb9\x78\x50\x5b\x19\x81\xde\xd9\x1c\x86\xcf\x2d\xf4\x96\x07\x39\xe7\x62\xfb\xb1\xfb\x9b\x10\xdb\x59\xca\xae\xc2\xe9\x3a\xb7\x36\x7e\x54\xc2\xf4\xe3\xdf\xe7\xed\xb8\xd9\xcc\x36\x75\x89\xa0\xb3\x3a\x01\x79\x03\x41\xfe\xdc\xc1\x64\xe5\x91\x41\x64\x67\x63\x67\x63\x20\xba\x2c\x90\xd8\xd1\xd8\xd1\x98\x6d\xd2\x0e\x37\xee\xfa\x47\x5f\x45\xfa\x32\x46\x1b\xb8\x1c\xa2\x3b\x07\x6c\xe2\xfe\xfd\xee\x1f\xe1\xfc\x90\x7c\xbb\x3d\xf2\x6f\x82\x39\x48\x2f\x83\x2b\xd6\xdc\x2e\xa9\xc2\x04\x73\x4b\x83\xd1\x52\x40\xb6\x11\x4d\x95\x73\xdb\xdb\x8e\x22\xca\xbb\x13\x5e\x13\xa8\x2b\x9b\x55\xab\x4a\x94\x90\xb9\x1f\x6a\x3d\xa8\x31\x2e\xa5\x2a\x25\x77\x39\x60\x7e\x79\x2d\x8f\x3b\x67\x61\x72\xf3\xe7\x3c\xcb\xcd\xbc\x7b\xf4\x01\xdf\xc0\x2d\x1e\xfc\xc5\xa5\xf1\x24\x6b\x02\xc9\x3c\x6d\x1f\xa3\xc4\xd6\x96\x26\x50\x4c\x47\x35\xcf\x66\x36\x66\x5e\xd1\x26\xe9\xc7\xdc\xa0\xbc\x4c\x6f\xd8\x47\x7e\x71\xad\x8e\xb9\x6b\xe7\xfe\xa7\xed\x04\x8f\xed\xec\xc9\x95\x5b\x43\xe5\x50\x0e\x03\x78\x2b\x86\x68\x48\x97\x72\x9a\x8c\x88\x6d\x63\x79\x02\xd9\xf2\xa3\x96\xa6\x38\x36\x28\x2b\x53\xc8\xbc\xd0\x63\xd7\x22\x98\x8f\x89\xf7\xf7\xb7\xfc\x9c\x7f\xe7\x2c\xa0\x7f\x74\x79\x3a\x8f\xad\xbe\x7b\x86\xba\xe4\xf2\x37\x5f\xbd\x73\x7d\x78\x09\x45\xfc\xdc\x23\x9e\xea\x51\x6b\xdd\x59\xe5\x6a\xf1\x90\x15\xad\xd6\x7a\x1c\x65\xd3\x40\xd1\xd8\x70\x7f\x13\xb9\x6e\xb2\x0a\x8c\x92\xb9\x52\xc7\x44\x0a\x21\xb4\x60\x6b\xeb\x17\x4c\x68\x61\x17\xbd\x56\xdb\xaa\x2b\xb7\x97\x99\xd3\x42\x66\x34\x27\x92\xba\x9a\x36\x88\x0e\xe8\x34\x3d\x71\x76\xfc\xdd\xcd\x77\xf5\x9c\xfd\x2e\x3a\x0e\x9f\xd2\xd2\x81\x87\x34\x90\x6a\x48\x4f\xc8\x7a\xca\x79\x72\x3c\xff\xb0\xeb\xb6\xa1\x17\x78\xbf\x7d\xc4\x3f\xf8\x11\xeb\xe0\xa1\xf7\xc5\xaa\x70\x10\xdb\x99\x96\x18\x25\x94\x50\x6b\x4e\xa1\xb1\xda\x5c\x2a\x4e\xe2\x32\x41\x81\xe3\x18\xf3\x33\x57\x4b\xc6\x9f\xfb\x4f\xb6\xb3\xca\x7b\xf5\xe6\x74\xbe\x7b\x08\xa4\x91\x23\xef\x43\x94\x31\x48\xb5\x2c\x44\x79\xe2\x99\x35\x03\x1f\x2f\x0b\x4a\x25\x44\x90\xa3\xaa\xba\xec\xf5\x60\x40\xae\xf9\x59\xf8\xd2\x8d\xeb\xfe\x69\x54\xf7\x4f\xd8\x3d\xbf\x7d\x64\xf6\x78\xfb\xb0\xe7\x0b\xf8\xf8\x80\x3f\xd7\x32\x28\x2e\xad\xed\x7c\x1a\x85\xeb\x70\xcc\x56\x15\xf9\xd3\x5a\x19\x68\x32\xeb\xf5\xb1\x59\x47\x04\x95\xb1\x9e\x2f\xed\x42\xb0\x15\x49\x4a\x69\x9a\x30\x9c\xa8\xac\x1b\x63\x11\x71\xcf\xf3\x42\x87\x4d\x2c\x4e\xfa\xe6\x83\xdb\xd7\xc3\x3b\xef\xbf\xdf\xbc\xda\x77\xf7\xaf\x9f\xf1\x5c\xff\x1e\xf6\xb2\xe4\x7f\x0d\xcf\xe6\xfc\xb8\x4b\x96\x6f\x3f\xbe\x39\xbe\x85\x5b\x8e\xd7\x93\xc1\xff\x67\x78\xf7\xfa\xdb\xb3\x58\x27\xe8\x3e\x61\x23\xa5\x3f\x44\x89\xce\x62\x6e\x8d\x72\xe0\x32\x06\x66\x60\x1a\xd0\xe7\x5c\x39\xa6\x51\xaf\x8b\xd7\xa1\x38\xc6\xf8\xea\xd9\x01\xe1\x1e\x45\x22\xe2\x76\xec\x88\x02\xef\x14\x49\x64\xc7\x65\x9d\x6c\x42\xc1\xf8\x9e\x3f\xa6\x59\x9a\xa3\x0e\x21\x84\x1a\xbc\xfd\x0c\xd9\x66\x00\x32\x94\x43\xce\xd3\x38\x8c\xe3\x38\x4f\x69\x9e\xe1\x11\xc5\x6e\xac\xec\x9a\x9f\xab\x03\xf3\xbe\x71\x08\x2d\x3b\x6b\xf1\x7f\x76\x7c\x54\xfb\x58\xfd\xf3\x5f\x1e\xea\xab\x37\xa7\xe3\x8f\xbc\x33\xef\x5e\x7f\x7b\x2b\x60\xfd\xee\xcd\xe1\xfc\xf6\xcc\xd6\x01\xfa\x4f\x22\xd4\xca\xf8\x7d\x94\x98\x2c\xce\x6c\xad\x6e\x54\xd1\x3d\x60\x0d\x05\xa5\x83\x6d\xf2\xb2\xc3\xb1\x4c\xa5\x5d\x66\xa1\xc1\xfb\x3c\x6a\x87\xce\x5e\xa6\x76\x5a\x50\xd0\x2b\x6a\x95\xed\x67\xb4\x47\x82\x8b\x2c\xc5\x68\xa2\x94\xd2\x85\x6f\x3f\x76\x60\x34\x4f\x93\x38\x2d\x32\x8e\x10\x06\xaa\x52\x4a\x45\xcd\x54\x91\xb9\x9c\x85\xea\x10\x9e\xc9\x09\x3f\x9d\x05\x2f\xfc\x70\xdf\xfd\xe8\x77\x58\x6c\x17\x78\xb6\x83\xc2\xb6\xda\xd6\x80\x03\x65\x7b\x7f\xb1\xfd\xf6\x85\xd9\xbe\x38\x0e\x42\x94\xaa\xaa\x54\x79\x7b\x77\xbc\x85\xbe\x3a\xcb\x53\xe1\xdd\xed\x2b\xf6\xf1\x9e\xfe\x2d\x9f\x05\x7e\xe4\x6f\xf3\x33\x5b\xfb\xb3\x5d\x36\x91\x9f\xd8\x86\x40\x18\x5b\x05\xd2\x8f\x82\xd8\x56\xdb\x49\x64\x6c\x07\xb9\x1d\x8e\xb5\xd6\x83\xb6\x73\xad\x64\xa3\x81\x6d\x9f\x31\xd4\x7a\x70\x7b\x6e\x70\x1c\xec\x99\xf7\xca\x45\x1b\x6e\xc4\x2d\xaf\x1f\x5e\x47\xf0\xd6\xbb\xdb\x64\x14\xdc\x3f\xc5\xe2\x9c\x87\xfd\x10\x35\x30\x6a\x63\xac\x22\x90\x0f\x03\x70\xdf\x6b\x87\xa1\xac\xaa\xf2\x58\x6a\xbd\x8e\xa6\x58\x17\xdb\x28\x48\xa0\x2a\x8c\x5f\x6f\xdf\x5c\x78\xa0\x8d\x9f\xb8\xfc\x27\x87\xdf\x76\x4c\xbc\xdf\xb8\xda\x81\xcc\xfb\x8f\xce\x86\x74\x74\x44\xce\x84\x79\x73\xef\xb4\x0a\x47\xc1\xff\x94\x37\x71\xef\x48\x9c\x3e\xbc\xb9\xff\x78\xb3\xbe\x36\xb3\xfe\xe6\xd8\xa7\x3a\x0b\xf4\x25\x29\x32\x22\xc7\x34\xe8\x23\x53\x86\x91\x32\xc9\x44\x4d\xd2\x10\x1c\x5d\x74\x96\xd6\x6d\x22\xfd\x2a\x5c\x79\x6b\x24\x56\x1a\xe6\x64\x45\x19\x24\xa5\xc2\xda\x1c\x93\x8c\x2a\x92\x63\xda\x36\x4d\x2d\x05\x57\x73\xac\x63\x5a\xb7\xb2\xae\xa7\x38\xcd\x69\x91\xda\x64\x9a\x86\xb4\xa0\x28\xdd\x74\x3d\x72\xc5\x67\x71\x98\xbc\xbf\x7b\xb4\x15\xbf\xae\x15\xbc\x90\x80\xc7\x5b\xe2\x2f\x0c\x8e\xfa\xd4\xcf\x3e\x4d\x3e\xb2\x29\x0b\x44\xb9\x99\x83\xa4\xc4\x45\x42\x08\xb9\x28\xc8\x68\x61\x72\x7a\x40\x65\xa9\x2a\xa5\x2a\x9b\x0a\x61\x6c\x77\x63\x3e\x4f\x10\x13\x48\x32\xef\x96\x7b\x2c\xce\xe2\x40\x9e\xe7\x5b\xbd\x7f\xd2\x14\x1c\x66\x90\x4b\xd5\xfb\xee\x77\xaf\xce\xfe\xdb\x60\xb6\xf5\x41\xdb\x12\xaa\x4f\x23\x18\x28\xca\x12\x8c\x21\xcc\xc8\x8b\x70\xaa\x66\xd0\x1a\x73\xc1\xc6\x04\xf5\x05\x07\x61\x66\xab\x09\x43\xb4\x4c\x76\x42\x90\x8e\xb7\xfa\x4d\xbf\x72\x35\xa4\x4f\xed\xbd\x7a\xa6\x97\xc0\x8f\x0c\xb4\xee\xc4\xd7\xd1\xe7\xcb\xe4\xb3\x75\xf6\xab\x6d\x81\xfa\x93\x62\x5c\x88\xcf\x2d\x4e\xcb\x14\x9d\x32\xbd\x96\xc6\xf8\x74\x2d\x7d\x2a\x70\x2f\xb8\x32\xba\xce\x1b\xed\xf4\xe9\xd1\xf1\x00\x8a\x27\x24\xdf\xfb\x0f\x1f\x8f\x7b\x7d\xc9\x6f\x5f\x20\xae\xb9\x4c\xa8\x68\x3b\x26\xbe\x71\x99\xbf\x05\xb0\x38\xb2\x63\x0e\x03\xc8\xa2\x1b\x63\x3f\xb7\x23\x9d\x88\x1d\x79\xc5\x6c\x29\x20\xe1\xb6\x87\xd0\x50\xcd\x39\x01\x55\x96\x07\x23\x54\x62\xd2\x42\x66\xb1\x91\xe5\xc4\x8d\x06\x6a\x87\x4e\x54\xbd\xad\x2c\xb3\xad\x92\x04\x32\xc0\x97\xca\xd5\xd0\xaa\xb3\x3a\x25\xcf\xe7\xfb\xd9\xf8\xef\x1e\xee\x6e\x28\x76\x0e\xee\x2d\xc8\x0e\x89\xed\x80\x7f\xa6\x40\xed\xe4\x23\x0d\x4b\x89\xb0\xa1\x97\x05\xc5\x3a\x41\xa7\xc4\x7c\x32\xc6\x1c\xd9\x27\x77\x1d\x50\x6a\x0b\x3b\x64\xc0\x37\xe9\x6d\x55\x0a\x1a\xc8\xf6\x8c\xe5\x2f\xb6\xf9\x08\x2e\x17\xbc\xfd\xc6\x5f\x0e\xc4\xd6\xa0\x3e\x2d\x50\xda\xc1\x67\xa5\xad\x70\xa2\x13\x7c\x08\x35\x12\x92\xfd\xb8\xcd\xe2\xa9\xa5\x24\xb3\xd4\xd6\x08\xd0\xed\x39\x77\xff\xc2\xcf\xb9\x35\xc6\x2f\x36\x6d\x44\xe0\x56\x70\xa9\x1d\xa7\xa1\xc3\xd6\x43\x57\x7d\xae\x4e\xe9\x4b\x3c\xe2\xbd\x0e\xd8\x25\xda\xbc\xbf\x7f\xed\x34\x0a\x15\x4c\x97\x18\x07\xe8\xd2\x94\x8e\x29\x35\x5a\x67\xdb\x1f\xe8\xe7\xf2\x94\x9a\xf1\x42\xfc\x18\xbc\x55\x2c\x8b\xd5\xae\x2e\xf0\x18\xd4\xee\xbe\xc9\x2f\xde\x77\x0e\xd4\x45\x14\x81\xb7\x7a\xc6\xc1\x4d\x0d\x36\xb5\x93\xa3\x27\x4b\xf4\xf3\xfb\xee\xf1\x1d\xf0\x88\x9f\x1e\xbc\x53\xb1\x23\xe7\xbd\xde\xa1\x95\x1c\x11\xde\x73\xb6\x09\xff\xbc\xb3\x93\x3d\xe2\x4a\x34\x41\x54\x2a\xa0\x04\xd3\x3c\x93\x05\x29\xb2\xa4\xc8\x93\x5c\x8c\xac\xa5\x33\xb0\x82\x70\x94\x33\xba\x56\xa7\x42\xb4\x8c\x97\x98\x14\xd8\x36\x1c\x85\x2a\xc4\x90\xda\xae\x11\xe5\x20\x30\xc6\x39\x42\xcc\xc9\xcf\xf9\x5f\x28\x1e\x1a\xb7\x06\x1a\xd3\xf7\xc3\x05\x05\xd5\xe7\x96\x4c\x2d\x10\x68\x1c\x3f\xa1\xbb\xa4\x62\x92\x4b\xa8\x24\x67\x5c\xfe\xea\x78\xe8\xf1\xc0\xaf\xfa\x5c\xfe\xfc\x33\x75\x18\x98\xf7\xaf\xef\x0f\x32\x88\x2e\x33\xf2\xf5\xca\xb5\xd3\x59\x98\x35\x53\x90\x5d\xfa\x53\xaa\x27\x37\xf5\xe1\xca\x20\x5c\x95\xf6\x8e\x7e\x71\xd5\x67\xfd\x73\xf7\xbc\xf1\xcb\x6d\xe7\xa4\x39\xb4\x9f\x0b\x16\xcc\x97\xa8\xf4\xeb\x15\x6f\x97\x2d\x8f\xf8\x53\x7d\x5b\x27\xc9\xbc\xaa\x79\x35\xc6\xf3\x8e\x9e\xbe\xea\x33\x3f\x34\xbf\x74\x4f\xe0\xc7\xe8\xd3\x1c\x1d\x96\xcf\x61\x19\x34\x17\xb4\x5d\x96\x9f\xc6\x1f\x92\x43\xa3\xd4\x65\x81\x6e\x53\xc3\x6d\xae\x76\xee\xf2\x5f\xb7\x9e\xd3\x03\xfa\xdc\xd0\x6d\xf1\x99\x47\xc2\x4c\xdb\x1c\xfa\xcf\xd9\x57\xd7\xf3\x5e\xdb\xae\x1c\x4e\xdb\xab\xc7\x53\xe7\x25\xa0\x19\xb8\x18\xf3\xdd\x2d\xa5\x39\x3a\xbf\xfd\x70\xf7\xfe\x01\x5c\xfd\x77\xa0\x83\xc5\x49\xbd\x55\x18\x88\xec\x00\x2d\xe7\x76\xf6\x15\xc7\x88\x2b\xc1\x84\xaf\x78\x7a\xca\x8d\x9d\x3f\x35\x4a\x1d\x91\xab\x05\x8c\x3e\x75\x80\x0b\x04\x8d\xb1\xf5\x40\x1a\x88\x8d\x5b\x13\x3c\xf5\x0e\x8e\x0f\x52\xff\x73\xfb\x92\x1c\xb8\xad\x20\x35\x6b\x5a\x42\x66\x4b\x98\x8d\xb1\xa3\x3f\x68\x84\x4c\x29\x94\xf6\x07\xfd\x97\xfb\x42\x1b\x88\xbe\xf4\xc5\xd5\xdf\x94\xff\xcc\xbe\xf8\xe4\x88\x2c\x01\x5a\x5e\xe4\xb6\xf8\xb0\x5f\xf4\xbd\x2d\x03\xd9\x22\xd4\x77\xa2\xee\x03\xd9\xfe\x42\x5f\x5a\x08\x9f\xfa\x02\x0e\x03\x4a\x07\x95\xe3\xf4\xda\x34\xf6\xef\xde\xec\xd7\x73\x3c\xbf\x3f\xc3\xf1\xed\x77\xef\xb7\xeb\x74\x7e\xfb\xed\x49\x6e\x32\x98\x05\x51\x74\x19\x83\x32\xba\x60\x31\x00\x67\xb1\x4e\x8c\xcd\x6d\x53\xae\x32\xf6\xcd\xba\x1d\x62\xd3\x92\xfb\x73\x50\xc9\x22\x93\x44\x13\x49\xf5\x66\x73\xe4\x22\xad\x19\xa2\x12\x69\x24\x73\x55\xc8\x24\xd6\xf9\x26\xa3\xc4\x95\x9d\xf5\x21\xf9\x95\xfd\x38\x1c\xb7\x7e\x20\x6b\x2c\x0f\xbc\xe8\x32\xbb\x7e\xd0\x0a\x4a\x1e\x96\x71\x6d\x23\x3b\xea\x95\xc5\x7e\xbd\x36\xb1\x4f\xed\x64\xfb\x7c\x3b\xda\x74\x9e\x97\x44\x13\xc3\xb7\xf3\x33\xce\x79\x56\x51\x84\x2b\x62\x48\x89\x34\x2a\xd3\xd8\xe4\xbb\x7f\xb7\x0c\xd8\x39\x76\x78\x74\x7f\xff\x05\x99\x29\x7a\xc6\x70\xb7\xbb\x77\x77\x2c\x9a\xbb\xfb\x12\x12\x03\x15\x55\x39\x4a\x48\x9e\x25\xa1\x5d\x62\xdb\x73\xf0\x62\x3b\x05\xb3\xaf\xb6\x05\x4c\x6c\x75\x5c\x94\xb2\xa8\x8a\x55\x8c\xc1\xb3\x4a\x73\x01\x89\x5a\x7b\xe5\xfc\x42\x07\x8f\x05\xf9\x39\x3f\x29\x2f\xb8\xa1\x9c\x7a\x6e\x0d\x3c\x73\xd9\xef\xd9\x01\x41\x55\x96\x3e\xab\x85\xe1\xf5\x45\x2b\x3d\x8a\xe1\x80\xa9\x8d\x2f\x0c\x07\xf5\x49\xd9\x18\x2a\x53\xa3\x46\x67\xa8\xa9\x84\x16\xdc\x4e\x44\x51\x77\xb6\x68\x08\x1d\xce\xc4\xb6\xbf\xff\xc1\xfb\xc3\xae\x9f\x3c\xcb\xaf\x78\xf7\xfe\x61\xcf\xdc\xba\xad\xb8\xef\xdc\x6a\x83\x87\xbb\x0f\xef\x03\x7d\xd8\x6c\x82\xf0\xc2\x20\xda\x2c\x17\xc6\xae\x9e\xcf\x38\x42\xac\x41\x3e\xe3\xa9\x25\x42\x9c\x32\xd5\x5f\xb2\xa0\xef\xfb\xfe\xf3\x34\xe5\x05\xd0\xc2\xf6\x4d\xbe\x29\x26\x6d\x02\xd4\x32\xd5\x7f\xc1\x08\x9e\x4e\xa9\xf7\x87\xfd\x84\x3e\x9d\xbf\x4a\x8f\xe8\x32\xe8\x3e\x7c\xbc\xe7\x81\xb0\x32\x4e\xa0\x24\x24\x2b\x12\x9a\xa6\x54\x11\x45\x35\x84\x49\x6c\xab\x53\x6a\x4a\xfd\xd9\x10\x1c\xc9\xb0\x78\x14\x72\x41\xf3\x59\x1d\x43\xed\x78\xca\xd4\x15\x3b\xf9\x7b\xbf\x8f\xf5\x4b\x5b\x5f\x6b\x2a\x50\x87\xd0\xe6\x49\x06\x33\xa5\x69\x9e\x88\x5c\x2a\xa5\xa4\x86\x34\x4b\x2c\x7d\x6a\x2a\x94\x5f\x69\x69\xcf\x01\x43\x67\x13\x34\x3f\x33\x2e\x67\xfb\x3c\x5e\x1f\x3e\xde\xb3\x73\x76\xa9\x93\x34\x40\x18\xd3\x32\x6d\x8a\xcc\xd6\x95\xad\x4b\x5b\x97\xbe\x4c\x93\x4b\x1f\x34\x86\xd3\xb5\xa1\x24\x2a\xa3\x0c\xcc\x3a\x3a\x4c\xe8\x64\xd5\x41\xc8\x98\xab\x0d\x31\xb7\xfa\x9e\xc7\x9a\xc0\x37\x6e\x4d\xba\xd7\x7d\xa5\x9c\x06\xd5\x5a\x43\x81\x34\xba\xb3\x9c\x01\x03\x4f\xda\xd1\x72\x02\xe2\x44\x91\x6d\x26\x39\xd9\x05\xdb\x7e\x52\xfd\xc4\x2c\x9e\xf5\xf4\xf8\x7c\x0e\x66\x9f\xb3\x57\xbf\x38\x67\xfc\x90\xda\x34\xc9\x7c\x8f\xb2\x34\x4f\x55\xae\x94\x56\x4a\x43\x96\x25\x16\xff\xc5\x29\x03\x67\x33\xe2\x7d\x1d\xc0\x17\x58\xe2\x9f\x9b\xb3\x00\x27\xd1\x9a\x9d\xca\xcb\x18\x27\x81\x87\x31\x16\x89\xca\x1c\x57\x5e\xaf\xed\x50\x1e\x26\x42\xb4\xa6\xd8\x3e\x86\xce\x43\x97\xa3\xb1\x5d\x99\x4f\x1d\x5e\x76\xfa\x57\xad\x85\xf4\xc0\xac\x97\x64\x7e\xc2\x58\x96\x27\x12\x95\xca\xa8\x52\x03\xca\x12\x9b\xff\xe2\x5a\x08\xd8\x5f\xd5\x16\x7b\x36\x89\x45\xf2\x57\x4c\xa2\xe3\x5d\x2b\xaf\xe8\x2c\x6e\xf3\xf8\xcb\xfb\xc9\x2f\x0f\xc3\xda\x25\xa9\x8f\x39\xcb\x51\xca\xf2\xa2\x36\x8d\xa9\x4b\x30\x69\x62\xbd\xbd\xb5\x8a\xd2\x58\x47\x28\x28\x2f\xd8\xd9\x55\xf5\x67\x7d\x0c\x8d\xf1\x00\xe2\x2b\x3a\x47\x41\xe2\x3c\x9f\x2e\x2b\xec\x67\x97\xf8\xc7\x7b\x88\x8f\xed\x8a\xb3\x20\x66\xb4\x20\xa9\x28\x32\x3b\x94\xfb\x7f\x7e\x91\xad\x3a\x48\xb4\xb1\x11\xa5\xa1\x09\x31\xe4\x7b\x32\x24\x8c\xeb\xe8\xd7\xe6\xc6\xe3\x16\x64\x8e\xd7\x20\x76\x58\xa8\x7b\x16\xd5\xf1\x39\xb1\x83\x53\x55\xe1\x77\x6f\xbe\xfd\x78\xf0\x8a\x24\xf0\xfa\xc6\x8e\x90\x43\x9b\xaf\x93\x95\xd6\xd8\x04\x81\x82\x6c\xac\xc6\xc0\x4b\x52\x3b\xd5\x23\xc4\xed\x49\x62\xa2\x2b\x81\x12\x9d\x2a\x5e\x98\x14\xf1\x52\x17\xd9\xd5\x93\x84\x48\x0f\x1c\x8f\xd8\x9e\x33\xe4\x90\x01\x6e\x78\x53\x7b\xe1\xf1\x37\x7b\x70\xf8\x1b\x38\x87\x10\x3c\x9c\xce\x77\x3b\x30\x6a\x50\x30\xc1\x80\x35\x96\xf8\x49\x86\x2a\x92\xf9\xc5\x3a\x25\x45\x25\x85\xe9\x39\xa4\xc2\xce\x57\xaf\x88\xb1\xee\xeb\xd4\x2e\x33\xf6\x09\x27\x12\x62\x90\x46\xf3\x5c\x57\xc6\x8e\x3d\xab\x74\x25\xec\x6c\x27\x03\x9e\x5f\xf8\x51\xd7\x5d\x16\x8c\x95\x22\x78\x9b\x87\x63\x7e\x95\x67\x7a\xec\x6f\xcc\xc4\xcf\xb2\x27\xcf\x54\x5f\x3d\x63\x36\x43\xfc\xd8\xff\xd0\x28\x7d\xc2\x9f\xfa\x43\xb9\xe3\x26\x15\xe7\xf4\x66\x47\x3c\xb1\xa5\x6c\x27\x55\xe0\xd4\x8b\x87\x3f\xc3\xdd\xfd\x5d\x90\x06\xdd\x25\x37\xbe\x59\x59\x61\x0e\x85\xb9\xcc\xa7\x64\xcd\x35\x54\x9f\x90\xcb\xe5\x33\xce\x0b\xe5\xf2\xda\x9a\x2b\x3e\x8b\x9b\xbe\x72\x3b\x13\x8f\x4f\x90\xb4\xbb\xe6\x02\xbb\xaf\xe5\x1f\xfd\xbd\x98\xf5\x54\x5f\x3a\x03\x85\x35\x87\xd6\x2a\x40\xc6\x36\x75\x5d\xd7\xa6\xae\x57\x51\x55\x99\x3c\x16\x10\x6b\x6d\xa7\x4f\xed\x89\xd8\x49\x5f\x68\x50\x6e\x97\xc3\x2d\xf7\x27\xc7\x59\xf0\x25\x17\xf0\x2b\x79\x80\x77\x0f\xf7\xb7\x22\xda\x20\x3e\x48\x6b\x20\xfb\x3c\x6d\x8a\x99\xaf\x2b\x3b\x94\x25\xa4\x95\x2a\x4f\xb9\xd6\x6b\xef\x67\x5a\x6f\x3a\x3f\x24\x76\xdc\xaf\x1b\x3f\xaf\x76\x71\xaf\x3d\x3b\xff\x37\x4f\x95\x56\xdf\xbc\x7a\x70\x34\x85\xb7\x57\xc7\xd8\x38\x98\x28\xf5\x49\xa8\x4a\x2a\x62\x4d\x8a\x38\x0f\x51\x66\x63\x06\x4d\x5e\xa4\x76\xa0\xe0\x25\x39\xa6\xbc\x3c\x89\x44\x88\xcf\xd8\xea\xc4\x24\x0c\xd2\x80\x5d\x84\x4d\x25\xd4\x41\xb6\x76\x76\x14\xe0\xc1\x38\x6a\x06\x91\x77\x76\xfc\x9d\xde\x8b\x31\xba\x4a\x81\x57\xcf\xd8\x19\xb6\x71\x3e\x32\x48\x6c\xff\x9e\xe7\x3b\x3e\x67\xe2\xf9\xf0\xf1\xe1\xde\x25\x3c\xaa\x40\xd8\x69\xbe\xb4\xf3\xd5\x83\x91\x0d\x94\x0e\x4c\xd2\x35\x86\x2c\x89\x75\x1c\x41\xaf\x0a\xaa\x0d\x37\xaa\xb4\x03\x1a\x4d\x63\x18\x1e\x41\x15\xf9\x40\xb2\x53\xae\x1c\x2d\xc3\xf6\x84\xac\x8b\xf3\xef\xd7\xda\xe7\x45\x92\xa5\x6a\x94\x05\x11\x04\xc9\x54\x45\x94\xe6\x5c\x70\x4c\x5c\xbe\xe3\xc9\x63\xd7\xe2\x5c\x1d\xd4\x2d\x6a\xf0\x1f\xbd\xff\xe4\xfd\xd7\x47\x9f\x98\xab\xbf\xf8\x02\xe2\xfb\xf6\xf0\x04\xe2\xbb\xd9\x9d\x0e\xad\xfd\x46\xdb\xef\x50\xdb\xf7\xe0\xc1\x2d\xe9\xf0\xbc\xa9\x39\x3a\x0b\xd0\x45\x84\x69\xc0\xd7\x32\x89\x7d\x4e\x84\x86\x10\xd9\xaa\xb5\x8b\x2d\x73\x88\x3a\x49\x28\xc6\xad\x36\x49\x4a\xcb\xd2\x97\xab\xdc\xae\x42\x29\x8d\x3f\xf7\xa2\x19\x71\x3b\x49\x22\xb4\x26\xe0\x1d\x54\x22\x58\x94\xdb\x3c\x49\x38\x43\x49\xa2\x33\x44\x52\x1d\x67\x79\x51\xa4\x1c\x6b\xd0\x69\xc2\xb4\x1d\xd0\x8c\xac\xc1\x59\x8e\x02\x56\xcc\x4a\x30\x52\x28\xb1\x4a\xdf\xe3\x9b\x2d\xe7\xb1\x40\x9e\xf5\x09\x3d\x5f\x97\xaf\x5e\xac\xcb\xcd\x46\xfa\xe2\x1e\x66\xe7\x74\x6d\xa0\xff\xa1\x85\x61\x6d\x0e\xc8\x6a\x9b\x41\x61\x5b\xe8\x81\x1b\xc8\x4f\x48\x73\x9b\x43\xe7\x1c\xb8\x6d\xb3\xfd\x6c\xb6\x1d\x3b\x6c\xe7\x06\xf9\x4b\x6d\x1c\xbf\xd2\x46\x07\xc3\x5a\x1f\xf0\xf3\x36\x34\xe4\x27\x22\xb0\x6d\xa1\xc0\x18\xe3\x8e\xdc\x40\x41\xb7\x36\xf2\xbf\xb6\x8d\x0e\xda\x1f\x3a\xe8\xd6\xf6\x40\x2d\xb7\x85\x2b\xec\x6f\x41\x6b\x48\x5d\x1b\x15\x90\xad\x8d\xd1\xb9\xa3\x5d\x1b\x55\x80\xce\xfc\x54\xfc\xda\xb9\xaa\x4e\xdd\x3a\x40\xf3\xc9\x83\x76\x9d\x0e\x91\x35\x16\xbb\xad\x5a\x03\xd3\x90\x9c\x0a\xed\x08\x1b\x94\x52\xca\xd6\xed\xf6\xe3\x7c\x1a\xc0\xce\xf5\x81\x7b\xbf\xbd\x55\xe2\x3d\x86\x45\x82\x9b\xdb\xb9\xf2\x65\x91\x95\x45\x20\x6c\x32\x41\x4e\xac\x58\x6c\xbd\xd8\x18\x03\x9b\xac\x17\x0c\x08\x67\xcc\x74\xb4\x2e\x21\xb7\x43\xad\x65\xb7\xc7\xc3\xff\xd9\xf9\x34\x1c\x94\xe3\x32\x0d\x61\xb1\x49\xef\x50\x70\x06\xb3\x29\x5b\x9a\x5b\x0e\x4d\x68\x85\x26\xb9\xce\x49\x90\x54\x88\x69\xf6\x22\x9f\x46\x55\x75\x07\xca\x96\xf3\xd7\xf3\x69\xfc\x60\xb9\xe5\xfa\xff\xad\xe3\x41\x79\x86\xd2\xe0\x24\xe3\xe1\x56\x96\x72\x7f\xcc\xf7\x98\x6a\x73\x11\x90\xd9\x36\x28\x6d\x01\x5e\xcd\xca\xca\xd8\xe6\x24\x06\x75\xf5\x94\xb2\x93\x21\xa5\xd6\xa5\x58\xc7\x20\xf1\x3c\x3f\x70\x39\xf3\xbf\x7c\xef\xc3\x64\xa0\xb1\xc8\xf7\x2e\x1e\x30\xab\x0e\xb1\xf5\x20\xe9\x68\xdb\x19\x2b\x9f\xdd\x1b\x97\x46\x97\x72\x1d\xdc\xbd\xfd\xf1\x76\x9e\x3e\xbb\xf7\xeb\xaf\xdd\xbb\x2c\x5d\x80\x96\x7c\xa6\x50\xd9\xe2\xd0\xae\x15\xe0\x99\x4d\x73\x69\xf3\x93\x18\xf4\xb2\x1d\x15\x06\x55\x46\x57\x72\xed\xb7\x5b\x7b\x67\x6f\x9b\x13\xcf\xaf\x9f\x9d\x49\xbb\xcf\xf5\x89\x49\x63\x77\x2c\x3d\x5f\x67\x70\x43\x7a\xd8\xae\xb3\xa7\x3f\xc7\x1a\x7a\x0d\x48\x5d\xe8\x6d\xdb\x20\x05\xe8\x73\xfc\xf8\x8b\x0b\xd2\x20\xdb\xf8\xf8\xb2\x14\x45\x10\x52\x4a\xa9\x1d\xcb\xed\xc7\x16\xee\xcd\xf3\xce\xce\xc7\x21\x6e\x78\x87\x5f\xeb\xc7\xa3\xfc\x7e\x76\x66\xc1\x0d\xf1\x61\xbb\xce\xa2\x5c\xb1\x81\x44\x2b\xbd\xf6\x4a\x41\xac\xb4\x5c\xb1\xfb\xa0\x20\x96\xf2\x98\x7c\x4a\xa5\x3c\x0e\x2e\x09\x80\xd8\x6a\x7d\xf2\xf8\xb9\xf0\xfc\xf8\xa8\x39\x6d\x73\xe2\xcb\x2b\x3a\xb3\xff\x17\x7d\x61\xe6\x82\x0c\x08\x3d\x94\x6b\x3c\x8e\xc0\x87\xb2\xbf\x20\xf7\xc1\x41\xf4\x1f\xd3\x4f\x89\x10\xc7\xd1\x95\xc7\x61\x5b\xaf\xfa\x4b\xfb\x9f\xeb\x17\x7d\x71\x3e\x8e\x63\x79\x2a\x6e\x78\x0b\xff\xe0\xb2\xc0\x5e\x2a\x8b\x8f\x22\xe1\xe3\xbb\xbb\x87\x63\x49\x30\x22\xa9\x2c\x92\x75\xd0\xa3\xcb\x91\x92\x56\x4a\x29\x4f\xc5\x0f\x03\x65\x51\x19\xe1\x23\xfb\xa1\x3c\x2d\xb6\xd4\xfd\x8a\x25\xd4\x9b\xcd\xbc\x5c\x8b\x73\x72\x20\x7f\xa1\x8d\x47\x37\xd6\x66\x60\x9c\x13\x21\xb8\x4e\x5b\x4a\x3e\xc7\x25\xe4\x9b\x2a\x5d\x04\xf9\xa5\xd3\x7e\xb4\xce\x07\xe2\xf4\x5e\x13\xe3\xa0\xfc\x2c\x8e\xb1\x9d\xa4\xb2\xf9\x26\x16\xbc\x83\xaf\xae\xe8\x8c\xff\xe2\x58\xbe\xb4\x73\x77\x7f\xc6\x52\x10\x99\x94\x98\x5e\x44\x09\x9e\xdf\xaf\x19\xf2\x8b\xb5\x35\x10\xd9\xf9\xa7\xe3\x31\xed\x8a\x34\x98\xad\x9d\xca\xd9\x0d\xc2\xfb\x1b\xef\x95\xf7\xaf\x5d\x46\xce\x23\xee\xd2\x17\x04\xa6\x67\x9f\x6e\xcc\x7c\x4e\x24\x3d\xc3\xc1\xfe\x36\x98\x4b\xca\x19\x32\x58\x2a\x98\x4a\xca\x38\x31\x54\x2b\xe8\x4b\xb2\x7d\x24\x5a\xae\x4b\x19\x67\x3e\x9b\x2e\x2d\xf2\x97\x6e\x1d\xa2\x48\x49\xc1\x0d\xa1\x02\xd0\x49\xe4\xb5\x92\x1a\xb7\xa6\xee\xf2\x5a\x6a\x83\xbb\xaa\x6e\xb7\x4f\x25\xee\xab\xda\xc6\x09\xc6\x66\x35\x6d\xa9\x61\x09\xa3\x98\x49\x29\x05\x2e\xf8\xe0\x39\x2c\xc5\x22\x20\x27\xee\xbd\x72\x88\x71\xff\xf1\x59\xff\x9f\x21\x16\xc3\xcf\x47\x9a\x1c\xdb\xcc\x07\xbf\xa6\x88\x70\x2e\x28\x97\x35\x36\x42\x69\xa1\x04\xb3\x29\xc4\x1a\x62\x3b\xe5\xb8\x28\x12\x54\x44\x76\xf2\x11\xc9\x64\x8a\xad\x92\x39\x15\xf8\xc4\xb9\xe4\x8c\x0b\xc1\x1c\xf9\x2d\x67\x84\x32\xb1\xc6\xf3\xac\x56\xc9\x5d\x40\xc1\xa7\xaa\x6a\x71\x5b\xa3\xf4\xea\xf5\x45\xe7\x7c\x82\x85\xcb\x61\x8f\x9d\x4f\xfa\x8f\xcf\x70\x86\x1e\x5e\xf2\xda\x3d\xec\x24\x80\x6e\x9f\xbc\x8e\x8e\x6f\xbf\xbd\x0b\x18\x54\x69\x26\x71\x0e\x3d\xe5\x55\x35\x16\x76\xe9\x5b\xbb\xd0\xb9\x2a\x85\xf0\x63\xc3\x6c\xc8\xa0\x28\xcb\x75\x29\xed\xa8\x20\x3c\x76\x0e\x9b\xcd\xb4\x8a\x64\x26\x97\x0c\x2b\x84\x55\x3b\x73\xa9\xd6\xf1\xd2\x05\xf9\x6c\xf5\xc4\xfa\xdd\x17\xe4\xf8\xd5\xcd\x3f\x6b\x1e\x7f\x0f\xdb\x0c\x3a\x18\xdb\xb7\xa7\x86\x71\x55\x69\x61\xaa\x71\x26\x63\xd3\x74\xb2\x6f\xca\x35\x81\xde\x91\x7f\x63\x41\x50\x82\x49\x61\xb3\xde\xd0\x52\x69\x7f\x52\x44\x63\x79\xe2\x42\x31\x21\xa4\x92\x86\x39\x5c\x46\x2a\x84\x5c\xb3\xb6\xd5\xab\x11\x34\xae\x12\xea\x17\x34\xb3\xfd\x8c\x26\x88\x27\xbb\x10\x08\xe7\x1b\xce\x4e\x71\x58\xbe\xde\xe7\xe3\xaf\x7f\xf6\x87\x88\x09\x55\x97\xa2\x6a\x94\xad\xb6\x4e\xf7\x62\x68\xeb\x35\x87\xd6\x40\x65\x09\xe2\x94\x24\x94\xe6\xb6\x08\x90\x21\x9a\xa8\x75\xeb\xb5\xdc\x7a\x2d\x39\xe7\x52\x09\xa6\x14\xe5\x9c\x52\xc6\xc5\x9a\xce\xb3\x5e\x35\x27\x89\x4e\x88\x8f\xe5\x30\x93\x65\xc0\x99\x5d\x06\xd4\x79\xb7\x78\x5d\xea\xb0\x69\xfe\xee\xb1\x6a\xfa\x8b\x0d\xbb\x75\x13\xde\x45\xe7\xd3\xa6\xb8\x7e\x73\x43\x5e\x3c\x12\x68\xca\xb5\x2c\x01\x95\x7e\xb4\xaa\x32\x4e\xaf\x9e\x5d\x18\x24\x33\xa4\x4d\x2d\xcb\xfe\x98\x8f\x97\xda\x77\xb4\x02\x7e\xd2\x28\xeb\x59\x4e\xab\x85\x48\x0a\xf1\x68\x27\xd3\xa9\xae\xdb\xb1\x3d\x7f\xa9\xdd\x7f\x05\xe7\xad\xd9\x0f\xb7\x76\x25\x98\x72\x1d\x4a\xc8\x4a\x98\xd6\xba\xc4\xcb\x48\x21\x1c\x42\x48\xaa\x52\xea\xf6\xa7\xad\x16\xcb\x88\x25\x85\x68\x0a\xed\x78\x6b\xd5\x73\x5c\x11\xc5\xed\x7c\xb8\x55\xab\xff\x74\xbc\xd1\xf1\xed\x3f\xf9\xfb\x13\x39\xc6\x30\x56\x2b\xa9\x40\x94\x3e\x5e\x8b\x2a\x5c\x0d\x9b\x67\x0c\x69\xdf\x89\x7a\x3e\x16\xc3\xa5\x72\x8d\x12\x3f\xaa\xd5\x3a\xdb\x2e\xb4\x51\x23\x51\x37\xc8\xb2\x97\x7d\xe7\xf9\x8e\xb7\x69\x3c\x49\xef\xef\xdd\xde\x72\x58\x3f\x4e\x5a\x9d\x9e\x87\x9a\x36\x63\xe1\xf8\xb8\x56\xb6\x71\x7b\x50\x68\x9e\x65\xba\xb5\x88\x80\x57\x56\x55\x22\xf1\x04\x24\x75\xb8\x5e\xd4\x66\x14\xa4\x21\x9c\x33\x4e\x99\xee\x4a\xea\x47\x01\x0f\x63\x2e\xf3\xb5\x5e\x36\x79\x9b\x45\xca\x4c\x5a\xb0\x4c\x18\x3d\xcf\xf9\x58\x12\xaa\x38\x36\x06\x2b\x08\xbd\xc0\x2b\xaf\x6d\x60\x9c\x1f\x74\x3b\x23\xbd\xef\xf6\xa8\xd3\xc3\xdd\x7e\x06\x3a\x5b\x76\x3b\x90\xfc\x41\xad\x85\xbf\xb4\x55\x65\xdb\xda\x4e\x10\xd7\x72\x9a\x88\x39\x71\x63\xcb\xcd\xd4\x00\xfa\xa9\x05\x2a\x40\x7b\x5e\xe0\xa1\xeb\x18\x74\xa7\xdc\xf9\xe2\x1c\x73\xcb\x53\x44\xf5\x6f\xe1\xcd\xad\x04\xf4\x9b\x1b\x50\xd9\x37\x40\x8d\xe8\x78\x03\xa3\xa2\x25\x96\x42\xd7\xa6\x5f\xf2\xc2\xf0\xc2\x44\xa1\x1d\xec\x50\x8c\xa7\x3c\xb5\xa1\x9d\x05\xa4\xa0\xed\x60\x4b\x04\x1c\x12\x9b\xe4\xab\x1a\x23\xda\x94\x99\x9d\x6c\x9d\x17\x05\x8b\x0c\x70\x97\x0b\xe9\xe4\xc5\x41\x3f\x6b\x7f\x13\x02\xdf\xbc\x39\x7f\x1f\xbc\x7a\x6a\xf7\xd5\xad\x27\x07\x62\xc8\x28\x5a\x9f\x93\x9e\x8f\x1c\x55\xc2\x24\x99\x6d\xac\xce\xa6\xaa\xac\xeb\x69\x29\x8a\x83\x4e\xac\x59\x78\x0f\x85\x2d\x8d\xea\x40\xad\xfc\xea\xd9\x16\x71\xca\x52\x0d\x1e\x2c\x99\x8d\xda\x98\x48\xee\x79\xc1\xa1\x72\xdc\x2d\x85\x6b\x7b\x3b\x19\x5d\xab\x7b\x64\xf7\xf7\xe0\x07\x8f\x63\xdf\xa4\xc0\x37\xe7\x30\x91\xcc\xa4\x76\xd0\x49\xcd\x4d\xad\xb5\xa9\xda\x2c\x97\x0c\xa9\x64\xba\x7a\x59\x75\x2a\xac\x37\xf0\xc5\xcf\x92\xc4\xa6\xb6\xe6\x50\x98\x6c\xc5\x76\x8e\xf0\xd8\xe4\xb6\xb1\xb2\xa8\x69\xac\x5d\xce\xb0\x27\x83\x1d\x57\xea\xb1\xdd\xc3\xf1\xfc\x2d\x7c\xe7\xd6\xd7\x26\x4a\xbe\xfd\xee\xc6\x29\x79\x38\xbe\xfd\x70\xc4\xe0\x41\xc6\xed\x64\xc7\xb5\x55\xbd\xd5\x14\x04\x94\xba\xad\x21\x03\x4f\x89\xb6\x11\x45\x61\xb9\x4d\xd3\xe5\x24\x26\xa9\x24\x44\x04\xd9\xb9\x16\x5d\x9c\xdb\x45\x24\xa9\xc2\xa6\x93\x18\xa1\x54\x56\x2e\x3e\xa0\xae\xe9\x59\x04\xf1\x53\xdb\xce\xdf\xfa\x9d\xb7\xf5\xe0\xe8\xda\xfe\xfe\xed\xc7\xc3\x0e\x7f\xf3\xad\x3f\xa9\xed\x79\x49\x10\x41\x08\x29\xa0\xad\x17\x95\xed\xca\xa6\x03\x06\x4a\x2a\x01\xf9\x28\xf5\x3a\xaf\x55\x0a\x59\x10\x23\xdb\x95\xa2\x99\x37\x75\x5a\x40\xde\x67\x76\xd0\x61\xc6\x19\x19\x26\x59\xa2\x58\x55\xce\xe7\xe7\x5d\xd1\x61\x1b\xfb\xef\x1e\xd1\xc4\x5e\x3f\xbc\x7e\x56\x9c\xfe\xcd\xab\x07\x3f\x9b\x4c\xdf\x0b\xc2\xb2\xdc\x60\x2c\xfa\x62\x3c\x4c\xa0\x2d\xd7\x4d\x55\x6a\xc5\x2e\x3a\x40\x93\xe2\x90\xef\xeb\x97\x5e\x71\x30\x9e\x98\x1b\xcf\xef\x6f\xeb\xf7\xc3\xd7\xb0\xd0\xb7\xef\x5f\x3d\x80\xd2\x64\x12\x1d\x48\x53\x4a\x55\xdb\xda\x17\x98\x39\x1c\xf6\x24\x0a\xbb\x70\xe1\x7d\x28\x4f\x2c\xb5\xc4\xce\x6c\x01\xfc\x84\x82\xce\x57\xcf\x91\x88\x1a\x1f\xad\xc6\xce\x62\xf6\x23\x87\xdd\x54\x04\xf5\x29\xf2\x02\x2f\xde\xad\xc4\x1b\x82\xd2\x23\x6a\xe2\x9e\x26\xd1\xfa\x7a\xe5\xa4\x0a\xb2\x96\xa1\x44\x54\x45\xc9\x14\x67\xf4\x14\x69\x1b\x69\xbd\x66\x45\x5e\x52\x8c\x03\xb2\x2e\x96\x56\x52\xde\x72\x84\x1d\x8e\xe2\xa6\x9b\xdf\x32\x04\x5f\xbd\x73\x25\x98\x4f\x3a\x6f\xab\x85\x64\x7e\xba\x59\x17\x5a\x9f\xc4\x45\xae\xbd\x95\x0c\x30\x2c\x81\x5c\xfa\x53\xf7\x29\xf4\x0e\xe0\x5d\xd1\x69\x81\xdc\xdd\xc3\x49\x8c\xe3\xcd\x87\xe6\xdf\xbf\x7e\xf6\xf1\x30\x68\xbf\x36\x56\x5c\xba\xd2\x6f\x8c\x95\x94\xc0\x6c\x23\x22\xb5\x96\x4f\x9f\x6e\x79\x8b\xdd\x69\x3e\x91\x9f\xe4\x2d\xde\x3f\x32\x1b\x1c\xb0\x5f\xae\x54\x6f\x96\xdc\x25\xdb\x3e\x3a\x36\x8d\x13\xb1\x5c\x6a\xb9\xbd\xdc\xf0\xeb\x21\x3b\x97\x07\xe9\x45\x8e\xa9\xf9\xc9\x57\x7f\xd3\xf4\x3f\xde\xef\x01\x81\x1d\xba\xd5\x9c\x9a\x35\x8a\x13\x9f\xea\xcf\x93\xf6\xd3\xfc\x32\x05\xa1\xa6\x97\xa1\xf0\x07\x88\x60\x01\x42\x6c\x63\xe3\x83\xd4\x59\x6a\xeb\x7e\x01\x41\xae\x5e\x62\x47\x21\x29\xc1\x5c\x0a\xb2\xd9\x16\xc9\x35\x3b\xcc\x87\xf9\x99\x65\xf1\x47\x57\x57\xf9\x94\x23\x7a\xc3\x83\x7c\xf7\xfe\x05\x4e\xb7\xb3\xf7\x77\x70\x8b\x1d\xc5\x95\x4e\x66\x9a\xfa\x62\xcd\xd0\x38\x3d\x62\x04\x7e\xb9\x22\x82\x68\x81\x1b\x4e\x24\xe5\x07\x43\x88\x20\x6b\x28\x84\xbf\x10\x3b\xde\x50\x95\xec\x4c\xa6\x02\x33\x5c\x50\xc2\x90\xca\x36\xbb\x07\xc4\x15\x1f\xa6\x13\xbe\xf9\x1b\xbe\x7d\xd2\x40\xee\xef\x1e\xde\x38\x7b\xf3\xed\x53\x9f\x82\xfb\x97\xec\xee\x8e\x17\xe6\x05\xcc\x6c\xea\xd3\x29\x01\x6f\xcd\x20\x4b\x06\xf5\x68\xeb\x08\x1f\x0d\x88\x14\x79\x52\xa0\x64\x54\xce\x44\x34\x24\x17\x39\xb6\x54\x30\xce\xe5\x09\xaf\x3d\x97\x92\x03\x66\xb6\xa5\x6b\x6f\xb9\xed\x19\x8e\x55\x4c\x20\x14\xa5\x6d\xa9\x40\x82\xe6\xa8\x66\x6c\xe7\x1f\x38\x94\x4e\xc7\xcb\xbd\x3b\x87\x35\xb1\xd9\x68\xee\x24\x7e\xe7\x0e\xc6\xed\x59\x06\xef\xa2\xbd\x58\xe6\x9b\x1d\x38\xe1\x4c\xb5\x6d\x4d\x17\x85\x8b\x5f\xda\x25\x8c\x84\xc9\x6b\xcd\xa4\xc9\x46\xc6\x04\x15\xc7\xf0\xf3\x1c\xc8\x8b\x38\xc4\x18\x6b\x8d\xb1\xed\xac\x67\xbb\x85\x28\x34\x6c\x76\x87\xac\x64\x55\x79\x5e\xe0\x78\x04\xf5\x33\xdd\xe3\x29\xc3\xf7\xbd\x93\x24\x67\x87\x9e\xe6\x58\x21\x6f\xd4\x82\x48\x69\xdd\xac\x94\x2a\x91\xe9\x3c\x55\x95\x4d\x51\xa7\x1a\x59\x60\x49\x4f\xa2\x93\x93\x52\xd0\x58\x34\x59\x22\x4c\xbe\xea\x41\x93\xca\xc7\x99\x1d\xdb\x62\x7a\x96\x67\x19\xff\x7f\x90\x67\x19\x29\x65\xfc\x2e\x8a\x5d\x9e\x65\xa3\x6f\x79\x96\x03\x20\x97\x67\x39\xda\x36\x2f\x3b\x12\x3d\xe5\x59\x66\x9f\xeb\x17\x79\x96\xa5\x64\xd6\xd8\x61\xdc\xce\x8a\x1c\xfa\x2c\x49\xf3\x62\x62\x8c\xb1\xd1\x39\xcf\xec\xc2\x49\x96\x24\x71\x9a\xe7\xac\x28\x08\xe4\x3c\xcf\xb1\x28\x99\x2a\xd2\xed\x3c\x02\xc7\x6f\xe2\xcb\x1b\x76\xc8\x93\xef\xc8\x31\x98\x6d\x62\x79\xcf\xfa\x7a\x9e\x23\x5d\xfb\x5a\xfb\xf5\xda\x2e\xc0\xb0\xd5\x76\xd6\x8b\x55\x14\xd8\xb2\x8e\x07\x25\x08\x65\xec\x32\x52\x87\x85\x22\x20\xb4\x8b\xac\xb0\xe1\xbd\x35\xc0\x3a\x21\x59\x05\xb2\x60\x05\x29\x8a\x02\x23\x5c\xfc\x5c\xee\xee\x9f\x1d\xfa\xd3\xaf\xcc\xdd\xfd\x3d\x7c\x2d\x5f\xf7\xbb\xa7\x8c\xde\xd3\xf1\xed\xaf\x48\xde\xc5\xb7\x6c\xdd\x01\x85\x22\x12\x76\x6a\xa9\x02\xef\x73\xfb\x94\xd1\x3b\xdb\xae\xf8\xe5\xe4\xdd\x91\x67\x49\x18\xc7\x49\x91\x32\x94\xe3\x09\x27\x59\xce\x79\x92\xf2\x2c\xc9\x36\x19\x2a\xaf\xc5\x59\x79\xd5\x2d\xf6\xb9\x69\x71\xcf\xe1\x73\x9e\x6d\xe6\x53\xcf\x91\x2e\xd8\x4c\x0a\x93\xe3\xab\x47\x0a\x9d\x63\xdb\x6b\x8a\x15\xab\xa4\x26\x46\xe6\x42\x21\xc3\x73\xae\x0a\xcd\xd3\x42\x53\xc4\xff\xda\xb9\x7c\xf3\x6a\x9f\xcb\xd7\x77\xbf\xb4\x68\x3f\xdc\xe6\xf2\xc3\x97\xb9\xec\x3f\xa1\x6d\x2e\xdb\x28\x36\x69\xc2\x6d\x65\xec\x8e\xaf\xbd\x00\x31\x50\x60\xb2\xd8\x01\xa1\xa1\x08\x65\xc8\xed\xd0\x51\xb3\x7c\x1e\x1d\xc1\xc2\x54\xc7\xa3\x1d\xd1\x29\x56\xc6\xb2\xec\xcb\x44\x4e\x69\x92\xe5\x85\x1d\x8d\x31\xc6\x4e\xc6\xbd\x69\x41\x72\x91\x24\x85\x48\x4b\x56\x60\xe8\x1a\xc4\x84\x9c\xb2\x8c\x17\x79\xee\xf6\x27\x3e\xeb\xc3\xf8\x62\x7f\xfe\xe9\xd9\x58\xfd\x9f\x2e\x9b\x17\x43\x85\xd7\xdf\x6d\xc3\x71\x06\xc4\xc7\x77\xfb\xe0\x6e\x43\x7f\x1a\xfc\x99\xda\x08\x9a\x4f\x32\x55\xba\xf2\x97\x38\x2b\xf3\x24\xb1\x8d\xb9\xed\xd0\xd1\x91\x9d\x5e\x22\x30\xf1\x60\x07\x64\x40\x93\x72\xe9\x89\xa3\x06\xeb\xb0\xab\xd8\x95\xb6\xe9\xc4\x21\xd5\xcc\x4a\x5b\xdb\x85\x42\x0a\x02\x7a\x94\xe7\x84\x2e\xdb\x16\xbd\x7a\x72\xfb\x59\x97\x8e\xc8\x3c\x2b\x60\xa1\x72\x2c\x11\x71\x84\xfb\x71\x9c\x44\x2c\xab\x09\x42\x7b\x7c\x3b\x68\x9d\xbf\xee\x61\x8f\x2a\x6e\xbb\xf4\x11\xc7\xcd\xed\xd5\x87\xd7\x0f\xef\x1f\x1e\x91\xf8\xbe\x7f\xeb\x27\xb4\x00\xcf\x80\x47\x8b\x0a\x61\xa0\xeb\x32\x40\x81\x2d\xb3\x73\x6a\xf0\x60\x73\x0a\xbc\xb3\x21\xb0\x1c\x9d\x84\x50\xe0\x5d\x3d\x21\x33\x4e\x04\xcf\x0d\x1b\xfa\xbe\xe7\x12\x09\xe1\x42\x79\xb7\x3a\xb7\xf2\x24\x7e\x2c\x23\xbe\x79\x73\xf6\x83\xbb\x87\x3b\x57\x85\x77\x83\xc9\xb9\xb9\x95\x95\x43\x21\xb0\x9d\x1e\xc9\x52\x96\x72\x64\x9d\xb8\x7a\x9c\x21\x55\xf0\x00\x1b\x4a\x34\x0b\x5a\xbf\x59\x91\xb1\x79\x5f\x41\xe8\x47\x17\x14\xd4\x36\xb4\x9d\x86\x10\x3a\x7f\x68\x06\xdc\xb7\xa8\x58\x6a\xd4\x3b\x7d\xa8\xf0\x3b\xa7\x37\xfe\x83\xcb\x53\xf8\xba\xee\xf8\xbc\x03\x7c\x92\x7d\x2f\x29\x2d\x0a\x89\x08\x2d\xc9\xc8\xd3\x98\x47\x29\x8c\x3c\x4d\x79\x16\x4c\x9b\x5a\x26\xeb\x52\x2b\xc5\x57\xe4\x57\x5d\x25\x20\x02\xe6\xab\x7a\xc8\xc6\x2a\x4b\xe7\xaa\x68\xbd\xc0\xe9\x78\x32\xc0\x5f\x10\x78\x7f\xd4\xee\x5e\x03\xfa\xa2\x61\x0d\x99\x9e\xa6\x6a\x93\x83\x3a\x41\x86\xf7\x74\xe6\x28\x15\x59\xe1\x0b\x89\x30\x45\x30\x6f\x1b\x45\x65\x82\x49\x8a\x6d\x03\x2a\x53\x82\x9b\x0e\x6a\xca\x73\x41\xf2\xad\xbb\xdb\xa4\x87\x01\xbe\xd5\x0e\xfd\xed\xad\xf5\xff\xc1\xfb\x9f\xbd\xff\xbe\xe3\x3a\xdd\x3d\xbc\xbf\x55\xf1\x7f\xf7\xec\xf3\xf3\x8a\x7e\x78\xf3\x0c\xb5\xff\xf9\xbf\x87\xbb\xf3\xdb\x0f\x2e\x56\xb2\x6f\x87\xfb\xa0\x84\x4e\x0b\x53\xb4\xda\x76\x7e\x04\x9d\x96\x3a\x6f\xb4\xed\xac\xcc\x62\x11\xe7\xbe\x76\x6f\x56\xa8\x0c\xbc\x28\x56\x49\xec\x60\x76\x1e\xd5\x1e\x7a\x19\x15\x22\x15\xd4\x5f\x54\xa1\x13\x5e\x51\x85\x0b\x89\x11\x78\x6a\xff\x88\x30\x78\x08\xd1\x84\xa0\xd4\xbd\x5a\x9a\xaa\x3c\x4b\x0b\xac\xa4\x90\x52\xaa\xdc\x2f\x89\x6e\x47\x29\x17\x29\xaf\x9e\xd3\x81\xff\xc6\xd5\x3c\x8b\xd3\xa6\xbf\xbe\x7d\xc2\x75\xfa\x3f\xbc\xff\xcb\xfb\xbf\x5f\x46\x93\x1f\x33\xf4\x1f\x6d\xa6\x3f\x7d\x7c\xff\x84\xe0\xf6\xea\x11\x81\xfe\x39\xe8\xd3\x1e\xfd\x78\xf5\xa3\x22\xa0\xf3\xdb\x87\xd7\x7f\x3a\x0b\x7d\xe9\x94\x0a\x72\x5b\xb9\x38\x4e\x5c\x14\x29\x8b\xa2\xab\x67\xeb\xa4\x34\x9b\x31\xed\x62\xb1\x65\x06\x93\x14\x22\x27\x28\x8f\x11\x8e\x6c\xac\x09\xc2\x08\x63\x63\x20\xd6\x96\xb8\xb7\x38\xc5\xc5\x29\xff\x21\xca\xf3\xd3\xfc\x43\x7f\xac\x10\x47\x36\x41\x24\x4f\xd2\x2c\x14\x21\x82\x11\x71\x74\x89\x8b\x82\x97\xa4\x88\x44\x9c\xeb\x2c\x2d\x28\xca\x83\x68\x3b\xb1\x67\x42\xc8\x9c\xe5\x3b\x7e\xe9\x78\xcd\x5d\xce\xdd\x1f\xbd\x7f\x7f\xe3\x1f\xfb\xf3\xae\x7b\xbb\x91\xef\x9c\x87\xef\x9e\xeb\xd0\xae\x96\xfd\x0b\xdf\xe1\x0b\xec\x99\x9b\x2e\x89\x0f\xc9\x6a\x36\x5d\x70\xa8\xa4\x62\x62\xb6\xd4\x20\x3f\xd6\x6b\x6b\x30\x41\x80\x7b\x1b\x01\x73\x4f\x73\xd0\x55\x05\x69\xa5\xaa\x55\xed\x29\xc5\x6b\x7b\xca\x2d\x91\x42\xc8\x3a\xd3\x5c\xb1\x64\x4d\x09\xf6\x71\x12\x73\xca\x95\x10\x52\xb8\x98\xe0\x67\x2c\xad\x54\x5f\xf2\x8b\xb4\x6f\x9c\xdc\x78\xc1\xd3\xf8\xfa\xde\x99\xbe\x77\x0f\x77\x87\x2f\x52\x2b\xe2\xbc\x29\x07\x8e\x74\x96\x03\x5d\x25\xc4\x60\x88\xcd\xed\x50\xda\xc5\xa6\x14\xc6\x7e\x55\xc0\x73\xe4\x2b\x22\xa7\x89\x49\x8c\x91\x6a\x71\xa5\xc0\xdb\xf4\xa1\x45\x1a\x5e\xab\xa2\x78\xc2\xb4\xd9\xec\xfb\x3d\x6b\xf7\x8f\x0e\xa5\xe1\xfe\xbd\x53\x56\x5d\x3c\xef\x4f\x37\xac\xd7\xdd\xd2\xfe\xb8\x67\x8c\x06\xb7\x08\x83\x5b\x61\x77\xf7\xc1\x8b\xe4\xb9\x57\x87\x11\xbc\xde\x4f\xbb\x4d\x5a\xe6\x59\x9c\x08\x92\xeb\x28\x74\xa0\xb8\x95\xbe\x7a\xed\xa6\xee\x64\x9c\x83\xc7\xd7\x6c\x01\x7d\xf5\x62\x88\x30\xcf\x71\x42\x8a\x24\x0e\xed\x94\x06\xa5\xf2\xe3\x75\x52\xab\xb6\x4b\x88\x8b\xbc\xee\x8a\x22\xcf\x12\x13\x85\x10\x07\x12\xc2\x8b\xe7\x4e\x51\x0a\x18\x72\xb5\x36\xb6\x5e\xab\x29\xd6\x31\x85\xce\xa7\x9b\xfd\xbc\x5c\xf1\xa1\x3a\xa5\x2e\xcb\xee\xeb\x3d\x8c\xbe\xda\xee\x81\x7d\xed\x7e\x07\xdf\x5c\xf3\x73\x7d\x52\xde\xff\xe4\xfd\x37\xef\x7f\xf3\xfe\xcf\xdd\xb3\xb6\x2f\x9c\x27\xd0\x99\x67\xdc\xe4\xc1\x33\x3a\xfc\x3f\x3b\x0a\x8a\x8f\xfb\x22\x7b\x42\x6d\xdc\x66\x34\xb8\x21\x75\xdd\xd0\xde\xcd\x05\x81\xd8\xf6\x8d\x06\xc2\x98\x1d\xd2\x1c\xe5\x12\x6f\x27\xc0\xa0\x10\x2d\x8a\xb8\x28\xe2\xb8\x6c\x18\x78\xad\xdb\x5d\xaa\x55\x0c\xc3\x92\x99\x34\x89\xba\xae\x5b\x8d\xa0\x84\xf1\xe3\xac\x2c\x35\x92\x52\x3b\x29\x3b\x09\x8a\x49\xa1\x88\x60\xb2\x86\xd4\xd6\x0c\x47\x2a\x8a\x0b\x2a\x09\x97\xe5\x24\x0d\x5d\x67\xcb\xf0\x02\x12\x22\x7f\x64\x19\xc2\x96\x1b\x57\x95\x69\xeb\x0c\x71\xb2\x6d\xac\xbf\x0d\xb2\x6b\xe1\x62\x93\xcf\x75\xa5\x7f\xe7\xfd\x87\x1b\x46\xf0\x5e\x67\xf2\xee\xb1\xd6\xe4\x67\xb0\x9c\x9e\x7d\x7e\x75\xdb\x7d\x6f\x1e\xf7\x58\x06\x54\xeb\x9d\xc7\x2f\xb9\x44\x9b\xd8\xf0\xa5\xb6\x9b\xd5\x11\x6b\xad\xd6\xe2\xf6\x81\x9a\xb5\x31\xc6\x47\x6b\xb3\x5d\xa7\x90\x73\xce\x95\x58\x95\xef\x0a\x56\x6f\xfa\x81\xd5\x7b\x1d\xab\x5a\x53\x4a\xfd\x61\x11\x56\x0b\xcf\xfb\x1b\xc7\x87\x22\x0e\xf8\x47\x63\xf8\xff\xdf\x6a\xba\x7f\x82\x1b\xf9\xea\x11\x27\xe8\xf1\x7d\xd7\xa4\xef\x03\x87\xe2\xb4\x9b\xdc\x40\x8f\xd9\xd5\x73\xdd\x9e\x7e\x88\x60\xd8\xac\xc8\xab\xa7\x5d\x0c\x95\x40\xf3\x79\x7e\xfc\x74\xbd\x95\xa6\xa6\x62\xb6\x15\x85\x3c\xc8\x21\x86\x1c\xdb\xc6\x0e\x07\xbc\x4e\x4c\x30\xa5\x98\x60\x9b\x09\x43\xed\xb0\xbd\xb4\x8c\x8d\xcc\xce\x94\x22\x95\xa1\x84\x2a\xee\xb8\x5c\x69\xd0\x9c\xf5\x69\xf7\x01\xfe\xe1\xb1\x1e\xfa\x96\x39\x7a\xf3\xba\x3b\xfd\x66\x53\x6f\x76\x41\x01\x93\xc4\x12\xc9\x03\x97\x42\x53\xfd\x39\x09\xc2\x32\x08\xd7\x6a\x86\x92\xdb\xdc\x2e\x65\x6c\x47\x4b\x38\xd0\x79\x5d\x4e\xba\x40\x08\xe5\x18\x91\x8c\x64\xe5\x30\x28\xce\x55\xd9\x56\xf5\x28\x38\x93\x3b\x76\x62\xe4\xf8\xaa\x94\x17\x79\xf7\xde\x3f\x79\xff\xf5\x86\x1e\xe8\xf8\x19\x9f\x7b\xe2\x9e\x7f\xf1\xc8\x2c\xb2\x47\x07\x7e\x0f\xb7\x54\x11\xa7\x7c\xbd\xbd\x81\x2c\xba\x74\x46\x97\xf1\xe5\x9c\x6c\x87\x5e\x23\xde\x0d\x84\x95\x54\xc6\xa9\x6d\xac\x4e\x2b\x68\x15\xce\x30\x4e\x19\xce\x65\x18\x57\x4d\xca\xd7\x45\xa1\x9c\xb2\x38\x91\x79\x4a\xa2\x70\x86\x8c\xd8\x7e\xaa\x6d\x57\x40\xae\xa2\xba\x49\x29\x74\xb2\xb1\x0d\x06\x04\x44\xd8\xc5\x66\x18\x3a\x50\xc6\xf6\x2b\xc5\xbe\x3c\xa9\x54\x08\x57\x8a\xdf\xa0\x22\xcf\x22\x41\xbb\xb4\xca\xc2\x04\x67\xaa\xca\x8b\x2c\x8b\x04\xd1\x69\x93\x87\x29\xca\x53\xa9\x93\x28\x52\x4c\x89\xb2\xa4\x92\xc8\x3c\x8f\x04\xb3\xbc\x28\x19\xe3\x49\x31\x1a\x6e\xc2\xdc\xb6\xea\xc6\x05\xb0\xed\x15\x79\xca\xbd\x7f\xf0\x72\x37\x47\xb7\xd5\xf5\x9b\x2f\x88\xce\x3b\x5b\xd5\xfb\xc7\x34\x89\xf7\xee\xef\xcf\x70\x7b\xdd\xdf\x5f\xdd\xdf\x3d\x37\x75\x02\x02\x93\x2d\x81\x84\x54\x21\x16\x71\x94\xa4\xa1\x11\x78\xd4\xe1\x8e\xe5\x17\xc8\xcd\xa0\xb0\x1a\x64\xc4\xea\x1c\xc5\x64\x1b\x41\xa9\xd0\x64\x22\x2b\x6d\xce\x08\xa1\xcc\x17\x9b\x74\x10\xa7\xdc\x66\xe3\xa5\xb9\x7a\x89\x49\x70\xc7\x0b\x43\x69\xdd\xc2\xd8\xf7\xbd\xdc\xfe\x50\x2f\x49\x99\x90\xc6\x7d\x0f\x1c\xc6\x75\xc0\x8c\x0b\x8c\x11\xe3\x1c\x7b\xde\x39\x20\x8e\x53\x5c\x3c\x9d\x15\xff\xde\xfb\x1f\x9d\xa5\xef\x64\xc0\x8e\x23\xb9\x6b\x19\xef\x9d\x96\xfd\x7a\x87\x85\xfc\x71\x1d\xf1\xcf\x6b\x1b\x81\x80\xca\x94\x49\xca\x48\xce\x6d\x01\xca\xcc\x66\x36\xa0\x2c\x69\xe6\x19\xd4\xbc\x2a\xf7\x76\xa9\xfd\xc9\x0c\x03\x16\xb8\x88\x31\xc9\xd6\x78\x53\x60\x99\x38\x0e\x65\x99\xa5\x08\x63\x25\xd6\x44\x29\xa5\xfc\x51\x38\x81\x60\xcd\x26\x1a\x42\x42\xd4\xb0\x57\xf5\xb6\x39\x66\x42\xe0\x47\xbd\x81\x9c\xeb\x53\xee\xfd\xcd\xb3\x51\x39\xf9\xfe\x48\x58\xfd\x15\xf9\xf0\x63\xa5\xc8\x5c\x78\xa9\xcc\xec\xcf\xb6\x73\xfe\x24\x7d\x21\xb0\x5b\x3f\xdd\xae\x18\xd8\xcc\xbd\x9d\x72\xb5\xb2\x75\xb4\x14\x43\xe5\xb8\xaa\x97\x4b\x5b\xcb\x5a\xa9\x5a\xd6\x30\x0e\xc3\xb0\xf6\xc3\x30\xec\xb6\x44\xec\xe4\xae\xf4\xfe\xce\xfb\xb7\xde\xff\xb2\xdb\x32\x8f\x3a\xcc\xfb\x77\x2e\x31\xf2\xec\xf6\x90\x0b\xb6\xbc\x7a\xe3\x9f\x5d\xf4\x25\xf8\xf0\xd1\xad\x9a\xaf\xff\xe9\xfb\xb7\x07\x4a\x32\x88\x70\x5e\x15\xc5\xfc\xb9\x99\x53\x04\x28\x8f\x74\x54\xb6\xe9\xa6\xab\x24\x86\x6a\xaa\xaa\x3c\x57\x55\xcb\x48\xe2\xb7\x59\xac\xa3\xb2\x49\x25\x77\x7f\x53\x44\x55\x79\xa6\xab\x86\xe2\x30\x3a\x49\x5d\x9b\x2a\xd7\x42\x6b\x23\x3e\xd5\x5d\x9f\x1a\x94\x8a\x0e\xd2\x24\x52\x13\xf0\xd4\x96\x6d\x64\xea\xcd\x76\xed\xd2\x54\x26\x5f\xfd\x7b\x59\x6d\x7f\xef\x93\xd4\xe9\x22\xa7\x80\xfe\x0b\xd5\x10\xa9\xca\x80\xd4\x4d\xd3\x5e\xea\xa0\xb8\xa4\x3b\xa6\xa2\xb4\xf2\xf1\x22\x0a\x73\xce\x40\x73\xca\xe8\xcf\x63\x2a\x1a\xdb\xbe\xa8\x21\x3a\x04\xb9\x8b\x27\x7f\x9d\xcb\xf0\x5f\xf9\x3f\x4b\x57\xd9\x07\x68\xc4\x24\x09\x4d\x94\x16\x65\x89\x64\x61\x1b\x0a\x49\xd6\x98\x47\x50\xe2\xed\xfa\x42\x57\x59\xb3\x9d\x4b\xb1\xa8\xa5\x79\xc1\xe5\xe8\xe9\x6b\x7e\xde\xec\xac\x2f\x7c\x1f\x5f\xe3\x3a\x79\x7f\xff\xfa\xfc\xfc\xa4\xca\x20\x2b\xa1\x77\x64\x27\x7e\xfc\x43\x04\xbd\xed\x83\xd2\x66\x29\x9f\x6c\x43\x00\xfb\x33\xa4\x10\x22\x3b\xda\xc9\xaf\xcb\xb2\x2c\x75\xaf\x75\xdf\xf7\x7d\x2d\x0d\xd6\x58\x62\x56\x29\xb4\xfb\xa4\xb9\xdf\xb9\x33\xe8\x66\xdf\x3e\x12\xdb\x3e\xea\xa7\x2e\x4a\xf2\xc2\x07\x36\xf8\xa3\xf1\xc7\xb5\x85\x10\x0c\xb5\x85\x1d\x8d\x9d\x6d\x21\x40\x42\xbc\xf6\xc7\x48\x31\x2e\xe4\x85\x4b\x24\x91\x38\x16\xdb\xd6\xd1\x2d\x6d\x0c\x24\x76\xeb\xed\x50\x1b\x31\xc0\x80\x35\x66\x94\x32\x8e\x39\xf3\x3c\x38\xf2\x6b\xe1\xea\x7c\x7e\xbb\x4b\xd7\xe0\x26\x5d\xdf\xfc\x69\x67\xda\xbd\x3f\x6a\x18\xed\x90\x02\xcf\xb4\xc2\x28\x2e\x73\x92\x58\x85\x21\xb6\xcd\x29\x5f\x2b\x3b\xad\xa5\x1d\x42\x1d\x0e\x60\xfc\xd4\x95\x16\xba\x9c\xf8\xc2\xdf\xee\xf9\x7a\xc7\xb5\x0e\x9e\x49\xec\xfd\xa6\x2f\xef\xc9\xf3\xec\xeb\x37\xed\xa1\xbc\xdd\x34\xf0\xe5\xb5\x38\xf2\x2f\xb6\xf8\xa3\x2f\xe0\xa5\x2d\xfe\xc2\x19\xe0\x57\x10\x39\x48\xd4\x4a\x30\x42\x35\x11\xac\x27\x57\x8f\xe7\xa9\x48\x73\x9f\x88\x3c\x97\x78\x2f\x37\x51\x65\xa9\x8d\x16\x6b\xee\x77\x43\xb3\xe9\xfe\xc4\x57\x75\x9f\x0f\x55\xbe\x19\xe4\xdd\x9e\x37\xde\x39\xf9\x91\xba\x55\xba\x2f\x8e\x1f\x11\xee\x3e\xf2\xde\xde\xdd\x94\xd2\xb3\xb9\xd4\x01\xb2\x79\x08\x25\xd3\x84\x27\x92\xe4\x59\x68\xe7\xa8\x34\xcc\xa8\x70\x9a\xb5\x64\xa7\x54\xcf\x5a\xf1\xb5\xb0\x4b\x64\x22\xed\x47\xb6\xb7\xd2\x48\x0d\x8d\x1f\xda\xd9\x71\xf0\x2e\xa0\x20\xf1\xe7\x3d\x4f\x3e\x71\xb1\x43\xe1\x62\x96\xcf\x10\x43\xbe\x81\x9b\x3f\xe4\xb8\xa7\x60\xdf\xdd\x07\x06\x94\x4b\x00\x00\x69\x07\x05\x91\x1c\xb5\x31\x57\x8f\x41\xaa\xec\x0c\xd4\x8a\x23\xda\x6c\x66\xb3\xfd\x57\xdb\xc1\x40\x06\xec\x32\x04\x91\xe5\x8b\x84\x04\x84\x81\x4d\x47\x0a\xaa\xab\x71\xf2\xe3\x6f\x1c\x5e\xfb\x4b\x56\xa9\xc0\x6d\x8f\xc7\x3a\xd8\x01\x78\x52\x98\x22\x05\x75\x61\x7e\x6d\x18\x07\x7c\x89\xfc\x50\x5a\x2e\x32\x9d\xc9\x63\x62\x64\x6e\x1a\x83\xb2\xb5\x73\x96\xea\x0c\x8b\xc5\x16\xa7\xd0\xc3\x8e\xa9\xe9\xf2\xea\xf6\xb3\xf0\x8f\x9b\x8c\xda\x11\xf8\x77\xac\xb7\xf7\x37\xee\xc4\x47\x61\xf0\x84\x96\xf2\x70\x77\x1f\xb4\xb3\x83\x60\x8a\xf2\x28\xd2\x21\x12\x0a\x0d\xb1\x35\x18\xe2\x64\xca\xa1\x34\xd0\xdb\xcc\x58\x7a\xd4\x4c\x4a\xb6\x56\x69\x9c\x37\xf1\xcc\x8a\x4d\x03\x48\x7a\x5d\x81\xb8\x0c\x3b\x54\x4e\xb8\x73\xe8\x06\x41\x72\xe5\x67\x7d\x4a\x6e\xfc\xb5\x6e\x9e\x5d\xd6\xed\xc3\xfb\x77\xaf\x1e\xee\x83\xfb\x3b\xb7\x4b\x9a\x20\xab\x3e\x6b\x08\xf3\xae\xcf\x46\x90\x19\x14\xae\x78\xa2\x39\x25\x3f\x4c\xc6\xf8\x42\xfb\x4e\x97\xfe\x24\x7d\xe1\x41\xc0\xaf\xd4\xc5\x5e\xff\xf0\x0b\xf9\xd3\xff\x0e\x5c\x02\x75\xa9\xe2\xd4\x37\xa1\x6c\x08\x8f\x25\xc1\x49\x11\xd2\x62\x1d\x09\x4c\x85\xc8\xad\x20\x40\xb2\x22\x24\x82\xb5\x27\x91\x48\xf1\x59\x58\x15\xe9\x48\x01\x0e\xe2\x8b\xb6\x48\x80\x09\xe2\xd5\xd8\x8e\x43\xec\xc7\x83\x66\xf0\xcc\x1e\x0e\xaa\x47\x7b\xf8\xee\xdd\xdd\x93\x3d\xec\x3d\x93\x37\x37\xca\xe8\x94\xb2\xa6\x9c\x71\x5e\x16\x08\xd4\xca\x21\x82\x9a\xd8\xcc\x8e\x37\x7b\x78\x18\x56\x05\xa6\xc0\x41\xbe\x33\x88\x4b\x99\x0a\xaa\xed\x22\xab\x0a\xf2\x75\xf6\x23\xdb\x96\xc6\x80\xa7\x09\x76\xb9\xa7\xc1\xa6\xeb\x6a\x37\x9f\xcf\x78\xe5\x37\x35\x75\x67\x00\x0b\xd2\x92\xfb\x83\xaa\xb6\xc5\x4e\x6d\x6b\x73\xcb\xd7\x05\x07\x19\xb4\x2b\xad\xae\x1e\x86\xe6\xa4\x33\x2e\x25\x25\x4c\x4b\x56\x17\x9a\x00\x96\x4c\x35\x1e\x04\x93\xcb\x4d\xa7\xde\x37\xfb\xdc\xde\x3d\xe1\x26\x38\x87\xc4\xa9\x67\xa2\x75\xbc\xff\xdb\x49\xc5\x05\x81\xfe\x44\x05\x2a\x6c\xa8\x2f\x3c\xd0\x1a\x86\x38\xd4\xd9\x5e\x83\xb2\xfb\x1a\xff\xfe\xcb\xde\xf2\x9f\xe9\xd7\xdf\x07\x1f\xbf\x79\xf3\xcd\xdd\x7d\x30\xc2\xe4\x12\xd3\x22\xd9\x83\x87\xec\x32\x54\x8e\x74\x40\x1b\x2e\x89\xa2\x36\x39\x2c\x0e\x91\x61\x1d\xe7\x51\x69\x31\xcf\x4a\xeb\x71\x04\x92\xdb\xb9\x03\xcf\x05\x5a\xf7\x3e\x97\xa7\xf4\x96\xab\x7f\x3a\xff\x24\xc5\xe7\xfd\xfd\xdd\x87\x8f\xf7\x07\x1c\x78\xba\x02\x65\x05\xc1\x94\xc4\x88\x16\x96\x42\x59\x8a\xb5\x3e\xa5\x65\xd7\xb4\x7a\x4d\x10\x0a\x75\x18\xfb\x9d\x86\xc8\x91\xa5\xc2\x21\xbe\xa2\x33\x71\xdc\x84\xae\x22\xee\xfd\x63\xe2\xe2\xbb\x53\x6b\xcc\x4a\x4c\x6b\x9a\x43\xff\x49\xc8\x63\xf8\x59\x9d\x92\x1f\x46\xcf\x3b\x78\xa5\x2f\xcf\xd8\xd9\x22\x9b\x74\x7d\x76\x12\x7d\x39\x84\x9e\x3b\x59\x0f\x6f\xce\xd0\xf9\x8b\xf1\x97\x35\x34\x76\x71\xac\x9f\xe0\xad\x0d\xa4\x9a\x09\xa6\x0f\x4c\x09\xc9\x15\x87\x64\xe6\xd6\x3b\x86\xdb\x7c\x68\xcb\x40\xd9\xb1\x52\xb2\xf7\x3d\xc6\x85\xe2\x04\x97\x94\x31\x5b\x94\x5a\x41\xf1\xc4\x87\x50\xfc\xf8\x2c\x7c\xbe\x36\xe1\xc5\x59\xd8\xfa\x53\xe9\x2f\xab\x82\x08\x9a\x27\x5f\x4d\xce\xa0\x84\x68\x2d\x0f\x9d\x22\x94\xd3\x35\xa5\xb9\xcc\xa8\xef\x42\x6e\xc6\x0e\xba\x6a\x80\xaf\xda\xa7\xb6\xd9\x76\x7f\x0a\x23\x56\x88\x12\x4c\x38\x62\x74\xcf\xf9\x69\x7e\xc6\xe7\x7c\x3c\x7f\xeb\x64\xec\xb6\x4f\xef\x5f\xa0\x75\x67\x50\x97\x30\x5a\x53\x81\x47\xec\x54\x97\xb5\x9d\x19\x44\xc6\xf6\x81\x28\x39\x31\x7c\xdd\x79\x0c\x1f\x1d\xcf\x59\x57\x2d\x30\x5d\x64\x20\x6d\x6c\x27\x0d\x11\xb4\xfe\x5c\xd8\xb9\xc1\x43\x5b\x77\xa4\xab\xf7\x7e\x24\x07\xef\xac\x4f\xea\x99\x66\xf2\x2c\x42\xf6\xf6\xd1\xeb\xfe\x02\x57\x3f\x28\xed\xe4\xa7\xda\x4f\xad\xd1\xe0\x65\xd6\xd4\xa1\xc6\x9d\x1d\x49\x17\x30\x17\x20\x5b\x99\x03\xcc\x3f\x2c\x0a\x42\xbb\x28\x92\xc8\xbc\x1d\x86\x12\x8b\x14\x06\xc4\x0a\x8a\x10\x22\x68\xc7\x03\xf6\x9a\x6b\x71\xec\x82\xec\xeb\xf6\xf1\xed\xec\x75\x2c\xa0\x5f\x82\x75\xcb\xee\x67\x67\x92\x72\x2e\x2e\xd8\xcf\x8c\xcb\x6f\x4d\xc0\xa3\xc3\x64\x06\x3b\x52\x48\x7a\x9b\x07\x19\xe5\x88\xb3\xbc\x50\x88\xe2\x09\x90\x6d\x54\x26\x2a\x55\x09\x5b\x42\x3d\x97\xb2\x1c\xb6\xf1\xb3\x9f\x7d\x0e\xde\xcf\x3c\x07\x0f\x9a\xd2\xf7\xac\x68\x20\x26\xb6\x6b\xca\xc6\xf6\x6c\xb3\x15\xba\xa0\x34\x82\x19\xb5\xe6\x12\x1b\x24\x5f\x04\x00\x60\xbc\x88\x40\xd9\xe8\xe7\x1e\x84\xcb\x89\x38\xeb\x63\xf8\x17\xd6\xa5\x07\x2f\xb6\x87\x09\xa2\x32\x48\x56\x0c\x04\x24\xb5\xca\xea\xd2\x0e\xb6\x60\x50\x41\xb2\x0a\x28\x0c\x33\xa4\x3c\x54\x15\x67\xa5\xf4\x27\x3f\x59\x47\x63\x75\x5f\x0e\x50\xad\xc4\x6f\xac\x58\x14\x78\x80\x7c\xaa\x6b\x52\x19\x8c\x1a\x85\x4b\x27\xbf\x9b\x2b\x3e\x66\x7e\xef\xaa\x93\x9e\x65\x0a\x7e\x7b\xcb\x14\x0c\x16\xc3\x44\x5f\xb3\x7a\x6c\xad\xc6\x80\xcb\x76\x40\xf3\x20\xfc\x1e\x75\x5a\x2a\x63\x54\x67\xb4\x36\x8c\x6a\xc6\x77\xec\x0d\xed\x74\x09\xe9\xfd\xc6\x7b\x70\x79\x09\x6f\x9e\xf0\xab\xbf\xbb\x11\x82\x3d\x07\x1f\xfe\x33\x9c\xdf\x7e\x7c\xca\x46\xdc\xce\xdd\xc5\xe4\xa4\xcc\x0b\xb2\x40\x6d\x66\x42\xdb\x29\x1e\x8b\xd0\x44\xdc\xb6\x22\xaf\xf2\x71\xd5\x7e\x58\xfa\xe1\xba\x94\xeb\x72\x92\x99\x56\xab\x82\xaa\x28\xf4\x32\xdb\x96\x17\xcc\xe0\xab\x57\x20\x91\xd6\xac\x20\x73\xa6\x8a\xcb\x34\x8e\xda\x46\x30\xbb\xbe\xed\x3c\x5e\x5b\xdf\xbe\xf5\xb2\x5f\xd5\xb7\x0f\x2f\x3a\x77\x48\x4d\x56\x94\x59\x4e\x06\xd0\x65\xc5\xa9\x19\xa3\x0a\x45\x26\xa6\x76\xe4\x85\x2e\x38\x5d\x7b\xe8\x4b\x18\x6c\x5a\xda\xec\x24\x33\x29\x56\xf6\xd8\xbb\x8e\x60\x26\xa9\x5d\x8a\x5c\xa5\x15\x77\xbd\x4b\xd2\xcb\xf8\xa5\x7b\x5e\xe0\x62\x24\x7b\xff\xbe\x73\x16\xd5\x2f\xf5\xef\xf4\x93\x0e\x52\x93\x16\x3a\xcb\x70\x03\xc2\x68\x46\x75\x17\x99\x22\x34\x31\xb1\x0b\xcf\x73\x54\x30\x62\x3d\xa8\x1c\xb9\x4b\x69\xc9\x49\x66\x42\xac\x14\xca\x22\x77\x3d\x44\x94\x29\xb2\xf7\xd0\xcd\x5f\x1c\xab\x24\xf9\x32\x83\xe0\x17\x57\x74\xc8\x4f\xca\xfb\xcd\xf3\xbe\x7d\x13\x54\x3a\xa7\x26\x47\x68\x39\xa9\x6c\x99\x3f\x0d\x41\xcf\x99\x81\x76\xc7\x4f\x4b\x6e\xfa\xd7\x37\x5e\xfc\x6c\xb7\xc1\xd9\x0b\x6e\x5b\x6d\xc7\xb6\x31\x30\x94\x3e\x5b\x1b\xe1\x87\xc2\xa2\x4a\xd9\x94\xc0\x8c\x6d\x1e\x48\xcd\x24\x33\x07\xec\xa7\xeb\x60\x56\x63\x4d\x09\xc4\xcf\xd7\xc9\x1a\x03\xda\xcf\x7d\xa1\xb4\x74\x70\x20\x9e\x1f\xd4\xee\xcc\x96\xbf\xd0\x56\x30\x01\x32\x60\x36\x6d\x0e\x71\xbb\x08\x6c\x07\x01\x24\xb1\xad\xdf\x30\xa4\x72\x7e\xc0\x7e\xb6\xf6\x66\x55\x9b\xb8\xcb\x60\x59\x67\x3b\x09\xc8\xfd\xd6\x97\xd2\x20\xbd\xb7\x75\x10\xce\xc6\xfc\xe9\xb8\xfc\xc0\x0f\xbe\xb4\x75\xa8\x20\x34\x90\xda\xb1\x80\x48\x34\x94\x4e\x9b\x06\x69\x17\x1f\xd3\x42\xe6\xf4\x40\xdc\x3e\x5d\xa5\x2d\x0d\xc4\xd0\x5a\x64\x07\x0d\xc6\x27\x3e\x96\x1a\x6b\xe9\xf0\x54\xae\xe8\xac\x20\xf9\x12\x63\x7f\x49\x4e\xf3\x25\xde\x7e\xd2\x86\x56\x44\x7f\x96\x5a\x29\x55\x06\x2d\x43\x65\x41\xa7\xdc\x71\xeb\x24\x55\x87\xba\x2a\xc1\xa3\x14\xba\x32\x35\x6a\x75\x52\x96\x59\x6d\x3c\xdf\xd5\x2a\x6c\xe3\xf8\x8d\xcb\x42\x79\xe3\x3f\x3e\xd5\x8f\x5f\x82\xa2\xdf\x3b\xc1\xe8\xec\xa0\x60\xd6\x08\x99\x2c\x95\x4b\xb3\x4d\x22\xb2\x93\xee\x49\x23\x0d\xab\xd8\xc8\xed\x78\x12\xd9\xd5\xab\x3f\xd5\x87\x08\x21\x02\x0a\x6d\x3a\x86\x5e\xc7\xa9\x1a\x41\x5f\xd2\xa0\xb1\x66\x96\x40\x61\xf0\x0e\xde\x12\xc8\xb3\x77\x0c\xbf\xe4\x5f\xbd\xfa\x11\x6e\xdc\x72\x0a\x7f\x58\xf4\xad\xfc\xa3\x50\x50\x1c\x43\x2b\x84\x8b\xa5\x6f\x72\xab\xbc\xe6\xfe\xe0\xeb\x97\x6b\xf1\x5b\x7f\x3b\x77\x35\x26\x04\x52\x5f\xa7\x82\xaf\x0d\x34\x38\xd7\x37\x5b\xcb\x5c\x8b\xb3\xf4\xa5\x43\x2e\x7c\x0e\x33\xfc\x88\x4d\x79\xfc\x82\x9a\xfc\xf1\x77\x6f\x76\x09\x78\x32\x91\x4d\x72\x5c\x0a\xa5\x4b\x5d\xe4\xa9\x8e\x05\xd5\xfd\x62\x5b\x04\xb8\x63\x99\x95\x31\x90\x34\x51\x69\xda\xa7\x29\x2f\x32\x3f\x52\x05\xa6\x84\x15\x8a\xb0\x3a\x2d\x45\x4d\x0b\x59\x60\x41\x73\x95\x62\x92\x32\x1c\x67\x69\x51\x20\xcf\xf7\x8d\xcb\x15\x35\xde\xd1\xd9\x25\x5f\x30\x90\x7f\x84\x54\x1d\x1c\x5e\x76\xea\x38\x33\xa4\x73\x06\x53\xb4\x8a\xb4\xa8\x35\x33\xad\xd1\x49\x62\x42\x4e\x86\xfe\xea\xd9\xb6\x80\x7c\x61\xa9\xe5\x31\xe8\x38\x2a\xa3\xf8\x60\x28\xc5\x94\xf6\x1a\xf5\x52\x18\x51\xc9\x5e\xaa\x74\x2a\x21\x2d\x85\xe6\x65\xd7\x65\x3a\x2b\xdb\xb8\x73\x73\x4a\x7d\xcf\xef\x9c\xfc\x79\x36\xa7\x9e\x9f\xeb\x02\x97\x84\x73\x28\x4e\x32\x35\xfa\xd2\xfb\x88\x51\x0e\xe9\xce\xc5\x08\xa3\xe3\xd2\xfb\xa5\x71\x9c\x7e\x3c\x0e\x9c\xe9\x0c\xc1\x12\xad\x3c\xcd\xba\x92\x56\x5d\xe9\xc6\xc1\xe8\x34\x4e\x76\x2e\x20\x1a\x70\x6c\x69\x0c\x3a\x89\xca\x28\x39\x29\x42\x09\x23\x95\x12\x0a\x53\xce\x14\xad\x19\x4b\x5b\x0d\x31\x75\x4f\x9c\x21\x85\xca\xce\x0d\xc3\xad\xe9\x1d\x87\xf7\x0f\xb7\x27\xfd\x85\x21\xfb\xd5\x8e\x27\xed\x26\xd5\x0f\xb6\xce\xdc\xbd\x8b\xde\x3c\x26\x76\x45\x6b\x99\xa2\x4a\xea\xba\xd3\x2c\x8f\x75\xc2\x71\xdb\xd8\xd9\x96\x18\xaa\x81\xa5\x16\xc5\xd0\xc6\x55\xd4\x95\x8a\x4b\x73\xe8\xb7\xb3\x66\x68\x26\x64\xbb\xde\x56\x90\xe4\x76\x31\x50\x0e\xca\x94\x1d\x24\x90\xe4\x26\x5f\x20\xb6\xd3\x08\x03\x11\x42\x90\x4d\x87\xae\xae\xca\xf9\xa5\x7e\xe7\x24\xc6\x23\xe7\xf9\x73\x80\xce\x43\x05\x19\xa1\x39\x50\xf0\x90\x2c\x5d\x0c\x3a\x5c\x29\x78\xb6\x0f\x62\x3f\x8f\x42\x13\x23\x99\x26\x6b\x6d\x76\xf4\x2b\x0f\x3c\x7c\x2d\xfc\xe9\xc4\x1d\x13\xde\xa3\x6f\xf7\xb7\xfe\xf9\xf5\x97\x30\xd7\xcd\x8b\xf1\xed\xab\x7b\xdd\x27\x99\xca\x53\xc3\xf2\x24\x4d\x78\x9a\x15\x39\x45\x58\x53\x42\xc0\xab\xad\x3e\x0a\x86\x0b\xae\x74\x68\x27\x96\x27\x05\x42\xf4\xff\xa1\xed\xff\x61\x24\xc9\xb5\xf5\x40\x3c\x18\x91\x99\x95\xd2\x4f\x7a\x8a\xba\x7d\x7b\x3a\xf4\x04\xe9\xb2\x54\x33\xd3\x94\xf4\xf4\x44\xbd\x56\x77\xf3\xa7\xd5\xd3\x12\xb2\xb8\xc0\x02\x4b\x43\xbb\xe0\x02\x0b\x2c\xd7\x59\x10\x58\x87\xeb\xd1\xa4\x49\x93\x26\x4d\x9a\x61\x86\x19\x66\x98\x69\x86\x99\x66\x9a\x69\xa6\x99\x33\x9d\xc1\x5a\x04\x23\xb3\xaa\xba\x67\xe6\xfe\x11\x76\xa7\x90\x5d\x83\x2c\x20\x78\x82\x3c\xfc\x73\x0e\xbf\xf3\x7d\x94\x31\x67\xe5\x65\xac\xa0\x67\xfe\x30\xef\x52\x55\xd1\x3e\x91\x3b\x52\x35\xb9\xa2\xf9\xed\x0b\x5e\x6e\xfd\xae\x9c\x8f\xd2\xc5\x52\x1a\xbe\x71\xf1\x82\x62\xc9\x23\x4e\x3a\x71\x06\x02\x10\x60\x0b\x04\xa0\x2c\x75\xa9\xaf\x9a\x49\x96\xcd\x34\x96\xfd\xa1\x49\xbb\x14\x58\x20\x00\x0a\xed\x43\xab\x96\xfc\x55\x6e\xa3\x74\xbf\xde\xc6\xdf\x80\x77\xaf\xdb\x10\x01\x27\x93\x18\x03\x11\x88\x33\x50\x80\xe4\x26\x4a\x97\xb6\x40\x27\x5d\x36\xbb\x26\x9d\xd3\x9e\x06\x7c\x92\x42\x7b\xcb\x8b\x62\x53\x98\x27\x72\x27\x2a\xf1\x27\xf5\x26\x5f\x72\x73\x7c\x2d\x7f\x8e\x71\x05\xbf\x1c\x6e\x9f\x93\xda\x25\xca\x00\xaf\x0a\xc0\x00\xa3\x69\x48\xbb\x4a\x4c\x45\x09\x65\x1a\x65\xda\x8b\xb3\xe6\x2c\x40\x8e\xb8\x17\xb8\x28\xee\xca\xfd\x35\xc7\x32\x9f\x8b\xfe\x75\xc6\x45\xfe\xc7\x85\x9d\xfe\x79\x1f\x5d\xca\x88\xbe\x2e\x30\xb9\x7b\xff\xf9\xe3\xa7\x37\x9f\x3e\x3f\xfe\xfe\xee\xbb\x1f\x3e\xdc\x3f\x3e\xd7\xe7\xe6\xfb\x98\x72\x0e\x71\x7b\x0b\x91\x45\x98\x86\x92\xb8\xba\x01\x9c\x6b\x3e\xd0\xd6\xda\x1e\x47\x05\x29\x36\x82\x8c\x02\x1f\x1b\x92\x98\x31\x25\xe6\x71\xcf\xcf\x67\xb1\x4b\x03\x07\x1c\xd4\x62\x9f\x24\x07\xdd\xc6\xa0\x10\x7f\xc6\x2b\xa6\x85\x07\x16\x44\x4c\xa9\xdd\x39\x4e\x1d\x35\x9a\x19\xaa\xa0\x92\xa2\xdd\x8a\x34\x6a\x5b\x63\x65\xbf\xd0\x72\x14\x9d\x30\x4a\xcb\x83\xb5\x0e\xab\xd4\xcb\x7c\xb5\x52\x80\xf2\xf8\xc4\x56\xfa\xba\x86\xe4\xdc\xd9\x95\x7b\x13\x22\xde\x71\x07\xa9\xaf\x88\x60\x01\x78\x30\xe0\xdd\xf0\x73\x8e\x5b\x57\x3c\xcf\x0b\x76\x9b\x17\x8f\xef\xe1\x2f\xe6\x05\x07\xc2\x38\x0c\x24\x10\xcc\xe5\x02\x3c\x80\xa6\x1a\xa0\xd4\x56\xb4\xc4\xb5\x17\x0e\x35\xd3\xe0\x27\x1d\x42\xe9\x8b\x65\x2d\x0b\x65\xfc\x76\x2d\xfb\xbe\xdc\x06\xc1\x23\x61\x06\xc0\x8d\xc5\x71\x3e\xfd\x9c\x28\x91\x4b\x1e\xac\x54\xe5\x21\x73\x79\x64\x3b\x3e\x6e\xee\xb2\x1d\xeb\xaf\x48\x7a\x55\xc9\xf7\x27\x5c\xc2\x12\xf2\x63\x3a\x66\xf6\xa5\xe2\x8b\x06\xe7\xa9\x5b\x9d\x42\xbd\xf5\xd2\x21\x18\xb3\x08\x75\x01\x56\x38\xf3\x4e\xb1\x97\xf9\xfe\xcb\xf7\xc2\x40\xb9\x80\x81\x06\x86\x85\x2e\xdf\x96\xd3\xa9\x00\x28\x85\x0a\x96\xb4\xde\x7a\x6d\x49\x33\xb5\xb7\xe9\x5e\x80\x3c\x37\x6c\x49\xf2\x49\xe0\xfe\xf7\xaf\x64\x4b\x3e\xde\x3f\x2c\x8a\x05\xf7\xeb\x88\x98\xa5\xdb\xb6\xf6\x87\x9e\x4f\xfb\xba\x3f\x9a\x63\x28\x49\xaa\x31\xe4\x1e\xef\x1c\xd7\xc0\xa6\xf3\x53\x21\xac\x38\x02\x5a\x80\xd2\x67\x9e\x38\x9a\xed\x7c\xb7\x59\xbf\x36\x70\xc9\x77\xc0\xbb\x9a\x1f\xd3\x21\xab\xc1\x6c\xbf\xf0\x72\x3b\xed\x4b\xb4\x3f\x91\x12\x6d\xa8\x9f\x7b\x3e\x4c\x2e\x84\xd2\x84\x79\x8d\x8a\xf9\xac\x4d\xaf\xfe\x0e\x33\x0e\xb8\x00\x3f\x56\x9f\x7f\x97\xc3\xba\xd7\xd7\x49\xb7\x95\xe9\xdd\xe6\xee\x36\xf5\x36\x2c\x6a\x13\x80\xd4\x8c\x1a\xc3\x24\xb4\x54\x4c\x7d\xa4\x5c\x00\x6c\x02\xf7\xe8\x76\xb5\xbc\x52\x71\x8e\xc7\xcc\xe0\x31\xb9\x6c\xa5\xac\x43\xcd\xf7\x89\xac\x02\x21\x76\x04\x1d\x39\xef\x53\xdc\x4d\xfb\x5d\x51\xac\x2a\x73\xe5\x19\xb8\xe9\x01\x5e\x75\x09\x3f\xbc\xfd\x0a\x82\xfc\x50\x67\xf6\xf5\x8f\x1f\xee\x1f\x3e\x55\x0f\xb7\xba\xe2\x65\x6f\x58\x9b\xd8\x20\x40\x8d\xe1\x4c\x77\x70\xc7\x51\xa2\xbd\x6f\xb7\xd6\x82\x1a\xe5\x7a\xe3\x9d\xa4\x8e\xc8\x8c\x08\x53\x1b\x03\x05\x9f\x42\x98\x38\x17\xd0\x43\x5c\x86\x54\x27\x27\x80\x01\x21\x94\x4a\x4d\x18\xec\xa9\x09\xcc\xd9\xa9\xf7\x1d\xcf\xf9\x95\x7f\x58\x8e\x39\x5f\xee\x8a\x7f\x9c\x6f\x0d\x1e\x0b\x52\xfc\x6f\xc5\xff\x51\xfc\x9f\xc5\xff\x55\xfc\xdf\x37\xed\xc2\xbb\x0f\xf7\x0f\x1f\xe7\x38\xf9\xd3\xe7\x87\xcd\x5d\xbe\x99\x7f\x9b\xcf\x81\x19\xf4\xf7\x43\xd6\x5a\x7e\xed\x0f\x1f\xde\x7e\xba\xad\x29\xf3\x51\xee\xd5\xdf\xfe\x1e\xdc\xa0\x75\xf3\xe3\xf2\xd3\x3e\x2c\x92\x4d\x0f\x1f\x97\xf5\x67\x55\xb8\x6d\x5d\x62\x71\xbc\x60\x2c\x77\xe5\x16\xa1\x44\x10\x6a\xca\x6e\x9a\x4f\xb0\x63\xc7\x3c\x68\xc0\x91\xf9\x9d\xf1\xa8\xd6\x35\xdf\xb7\xc2\xc5\xa9\x75\x75\x5d\x22\x88\x76\x29\x5a\x8b\x6b\x53\x8b\xb1\x13\x5b\x93\xa2\x04\xb5\x4d\x3d\x94\xc7\x72\xcb\x12\x84\xb4\x39\x37\xdb\x74\x04\x71\x5b\x03\xc2\x38\x65\x8c\x6d\x1c\x6c\x6a\x25\xd2\x61\x80\xca\x48\x84\x09\xec\x79\x72\x92\x2a\x5c\x53\x00\xb1\x72\x82\xa0\x1a\x37\x0c\x2a\x46\x28\x28\x24\x4c\x47\x58\x37\x12\xa1\xb4\xeb\x48\x23\xa0\x63\x94\xef\xcf\xc6\xf1\x70\xaa\x95\x32\x0c\xa2\x11\x13\x82\xd5\x11\x62\x41\xb2\x6e\xf4\x3f\xbc\xf2\x57\xbb\xe2\x6f\x8b\xbf\x2b\x3e\x15\xff\xb1\xf8\xcf\xc5\x7f\xb9\xa2\xb0\xfe\x97\x57\x75\xd1\x79\xe9\x7d\xb8\x91\x5e\x3d\xa7\x89\x73\xa8\xfa\xf1\xf1\x7a\xdf\xf8\x30\x7b\xc8\xb7\x17\x8c\x6f\xae\xd8\xfb\xf9\xfb\x77\xd7\xcf\x6a\x17\x40\x4c\xb2\x44\x88\x68\x58\x27\x0d\xe0\x36\xed\xb1\x71\xc8\x6e\xf9\x7e\xa7\x7d\xd3\xf6\xce\x18\x40\x4d\xb9\x9f\x90\xcb\x9c\x19\x09\xe7\x5f\x2d\xbb\x30\xea\xa4\xdc\x2b\x75\x90\x72\xe3\x98\x16\x5a\x72\x86\xb1\xc4\x06\x6f\x61\x83\x08\xd2\x94\x30\xd8\x98\xc6\x4c\xdd\xec\x62\x0c\x38\xd0\x97\xed\x34\x24\x08\x9a\x8c\x95\xce\xff\xa4\x83\xb5\x00\xa6\x43\x37\xff\x57\x14\x9b\xaa\xc8\x73\xd3\x15\xff\xa0\xf8\xae\x40\xc5\x7f\x2c\xfe\x87\xe2\x7f\xba\x72\xbb\xe4\x2c\xed\x9b\xeb\xe9\xed\xfe\xf1\xfe\xc7\xf7\xeb\x85\x6e\x65\x8e\x02\xee\xee\x73\x2d\x08\x78\xa8\x37\xff\x06\xbc\xcf\xc2\xc7\x0b\x59\xe1\x9b\xe5\xb5\x1f\xef\x1f\xe6\xbe\xcb\x98\x91\xb7\xbf\x5f\x4b\xd8\x80\xe3\x97\x1e\x0c\x75\x83\x29\xa2\x48\x71\xe6\x08\x03\xa6\x33\x02\x61\xc8\x85\x44\x84\x41\xc1\xe9\x04\x81\xa5\x02\x41\x52\x6f\xb7\x74\x6b\x85\xdc\x52\xed\x4b\x1e\xc2\xe4\x91\xb2\xd1\x95\x62\xea\x36\x8e\x31\xe7\x30\x7e\x2a\x84\x92\x92\x77\xf3\x42\xe9\xac\x76\x58\x48\xd8\xa4\xb3\x52\x06\xe0\x3a\x9d\x1a\x05\x1b\x0a\x8e\xc9\x79\x83\xf7\xe9\x6c\x84\xdc\x25\x66\xec\xa5\x07\xa8\x33\xaa\x03\xb5\x0d\x0d\x7d\xd1\x98\x34\x1b\xf2\x0a\x6b\xf2\xef\x6f\x0c\x27\x6f\x1f\x3f\xe6\x68\xfa\xca\xc5\xfb\xf0\xf6\xe1\x87\xab\xfe\xda\xfc\x7b\x9d\x81\x69\xcf\x9a\xaa\x64\x85\x13\x02\x47\x9f\x5a\x97\x06\x0f\xc6\x84\xcb\x36\x17\x65\x47\x40\xd3\xb0\x9d\xff\xb7\x54\xf9\x8b\xa1\xf2\x61\xda\x96\xe7\xcb\xa9\xaa\xa7\xed\x86\x38\x73\xd2\xf3\x3a\xaa\x4f\x26\xc9\xf9\x88\xa8\xb5\xb6\x97\x33\x73\xde\x65\xee\x9d\xff\x5f\xa5\xfe\x3f\xc6\xf4\x28\xc0\xbd\x59\x42\xac\xe6\x42\x40\x93\xba\x52\x98\x74\x9a\x57\x35\xe3\xed\xa4\xae\xff\x23\xc3\x74\x08\xe1\xca\x7c\x75\xf8\x25\xa6\x67\x01\xf3\x84\x5f\xc3\xf4\x80\x8a\x66\x4d\x58\x5b\xfc\xdd\x72\x3f\x70\xd5\xaf\xdc\xdc\x3d\x2b\xda\x3d\xef\x35\x59\x45\xfb\xcd\xe3\xc7\x5c\x7d\xf3\x69\x01\xd0\xad\xf6\x14\x79\x0a\x5b\x7e\x4c\x68\x5b\x83\x3e\x91\x79\x03\x70\xbc\x54\x69\x00\xfe\x42\x40\x38\x08\x23\x07\x75\x04\x10\x3f\x15\xa0\xae\xb7\x29\x80\x02\xe2\x8d\x35\xde\x19\xb2\xf3\x52\xf8\xc1\x0d\x3e\x9d\xbc\x07\xb5\x11\x36\x80\xad\x1b\xbc\x90\x5e\xcb\x85\x1b\x91\x3c\xc9\xeb\x5c\xf8\x46\xb3\xf6\xe1\x8f\x6b\xd6\x6e\xe3\xb6\x01\xc3\x45\x01\xdc\xb4\xa5\x98\xf2\x67\xbf\xda\x26\x9e\xa9\x1f\xf6\x5f\x3c\x38\xe7\xab\x1b\xb6\x71\x48\xc1\x09\x96\x07\x9c\xe2\x22\x5a\xeb\x3b\xd7\xf9\xf9\x9f\xb9\xfd\xdd\x13\xcb\x58\x94\x3f\xca\x41\x58\xfd\x06\x1f\xe2\xae\xea\xd3\x01\x6c\xc3\xd4\x45\x50\xa4\x23\x68\x95\x3a\x95\x5c\x53\xa6\x94\x66\xb2\xe4\x1a\xff\x11\x0a\xc2\x76\x14\xc3\x2b\x3a\xc4\x62\x5d\xcd\x7b\x10\xbb\x72\xd3\xdd\x38\x7f\xee\x1f\x3f\x66\xda\xaa\xb7\x8f\xf7\x6f\x6e\x68\xc2\xeb\xef\x3b\x16\xf6\x61\x1f\xc2\x7e\x0f\xf4\x7e\xea\xf3\xaf\x0d\xfe\x02\xfd\x24\xcb\xe8\x57\x87\x04\x97\xaa\x9d\xcb\xb8\xfc\xce\x39\xae\xfe\xca\xf7\x5e\x67\x9c\x7b\xb1\x48\x62\xbd\xda\x84\x41\xae\x02\x9d\x9b\xaa\xfa\xea\xa0\x99\x64\x14\x32\x06\x27\x5c\xd2\x14\xbc\x1f\xc7\xcd\x36\xfc\xdc\x1a\xd1\xf8\x5a\xac\x49\xda\x4d\xcc\x54\x78\x1a\x41\x5b\x94\x95\xbf\x8e\xe5\x3f\x5a\xe2\xbe\xeb\xb2\x55\xde\xbd\xcf\x42\x62\x0b\x81\xe1\xe6\x6e\x93\xeb\x00\xae\x68\x9e\x0f\x7f\xf7\x69\x6d\x5d\x0d\x0f\x27\x7e\x3c\xf6\x7b\x05\xe6\xf1\x33\xc8\x01\xc4\xe7\x60\x0b\x27\x73\x12\x65\xbf\xd5\x8e\x10\x68\x09\xda\x38\x4e\x48\xda\x05\xdf\x02\x9c\x0e\x9d\x03\x78\x1a\x26\x82\x6a\xbe\x23\x47\x46\x88\xae\x4c\xe2\xbb\x6d\xbc\xe2\xcc\xfd\x15\x87\x70\x57\xdc\xe7\x5c\xf7\x35\x8e\x01\x1f\xea\x7c\xa9\xfb\xd7\xe0\xdd\x87\x6f\x54\xa7\xee\xb6\x21\x41\x0f\xb6\x91\x8d\x51\xba\x9e\xb4\xa1\xa1\x1c\x6e\x5d\x8d\x60\xdb\xb2\x0d\xfe\xd2\x56\xbb\x0b\x59\x89\x34\x4c\x3a\xf9\xd4\x49\x9b\xe5\x05\x63\x22\x10\x92\x1e\x1d\x09\xa6\x62\x69\xbb\xcd\xfd\xfc\xdb\xf5\xa0\x3f\x5c\xeb\x41\x57\xeb\xf7\xbf\xdb\x44\xbc\x33\x7b\x9a\x5c\x44\x07\xbb\x1b\xdb\xd0\x9f\x40\xc1\x84\x8b\x3a\xe0\xb4\x4b\x2d\x1e\x36\x74\x3a\x1d\xdc\xa9\x9c\xf7\xdb\x3a\x05\x03\x84\xc5\x93\x48\xe7\x9a\xed\xbb\x39\xf6\xb1\xac\x13\x30\x2c\x7a\xe0\x65\xb5\xcb\x58\x55\x53\xac\xb3\x07\x2d\x49\xb7\xdf\xbd\xf9\xdd\x9b\x77\x65\xf5\x12\xdc\x54\x3f\x96\xef\xd7\x46\xc1\x08\x25\xa7\xc7\x81\x04\x72\x0a\x27\x7e\xec\xda\xa3\x3a\xb6\x8e\xab\x66\x63\xf6\x7b\x7c\x1a\xd3\x39\x91\xa4\x00\x29\x59\x3d\xe9\x64\xf7\x31\x84\xe3\xbe\xf5\xf1\x08\x9a\x16\xc8\xbe\x28\x56\x25\xca\x98\x37\xfb\xaa\x1a\xee\x9b\xf3\xdd\xbb\xd9\xb3\x4a\x70\x15\x7e\x5d\x8e\x77\xeb\xd7\x72\xe4\xb6\x85\xb8\x6c\xfa\x9e\x73\xd9\xc2\x33\x9e\xd4\x36\x1d\xf5\xbe\x19\x76\x60\x4b\x62\xe9\x27\x0d\x6a\xc3\x3d\x33\x3e\xff\xbb\xb1\x48\xf0\x49\x85\x49\x73\xd1\xb8\x2d\x2a\xcd\x74\x4e\x83\x3b\x81\x31\x94\x41\x4d\x45\x59\x50\x1f\x79\xf0\x53\x17\x3b\xd1\xb5\x99\xbb\x62\x78\xa2\x77\xee\x4f\xdb\x78\x3b\x82\x7e\xf8\x04\xbe\x95\x4c\x1f\xda\x86\x80\x7d\x08\x9c\x33\x0d\x3b\x34\xed\xeb\x21\xf4\x5b\x1f\x8e\x18\x74\x59\x3f\x7d\x94\xd4\x13\x99\xa5\xba\xd5\xc6\x22\x2d\x26\x13\x26\x27\x78\xed\xb6\xb8\x94\x09\xa7\x28\x80\x06\x2a\x94\xce\xa4\x63\x6a\x40\xe7\x82\x08\x7e\xea\x5d\x14\xd1\xcf\xe3\x76\x28\xf1\x9d\xdd\xb0\xe2\x77\x39\x97\xf3\xf6\xaa\x16\xf5\xf7\xe0\xf1\xaf\x72\x60\xf1\x31\x1f\x0c\xe6\xcd\xfd\xeb\x20\x75\x13\x49\x18\x84\x38\xd5\x5c\x29\x49\xa1\x77\x1c\xa7\xa2\x1c\xa8\x8c\x4e\x87\xe8\x4f\xd8\x2b\xa5\x37\x6c\x14\x4e\x70\xeb\x2d\x56\xd8\xf4\x93\x41\x98\x52\xe7\x34\x27\xd4\x72\x26\x89\x83\x04\xc1\xa2\xaa\xe2\x57\x67\xb4\x62\xc9\x71\x3f\x4b\x77\x67\x1e\xf9\x8f\x8f\xdf\x5c\x6a\xe6\x9f\xc7\x79\xd3\xb8\x81\x75\x57\x7b\xa5\xe5\x28\xe6\x80\x38\x88\x03\xe7\x71\xc7\x14\xa3\x0d\xe7\x0b\xfd\x98\x01\xee\x04\x18\x81\x70\xb7\xdb\xad\x65\x2b\xec\xee\xc0\x30\x32\xa8\x4d\x3e\x24\x22\xd2\xf1\xca\x98\x5e\x84\x7d\x38\x78\x29\x53\x77\x38\x24\xb7\xdf\x17\xd5\x55\xbb\xcc\x5d\xd1\xeb\x37\xfb\xf2\x21\xfb\xe1\x6a\xde\xd7\x02\xeb\x2f\x67\x85\xd9\xbc\x45\xd5\x72\xa5\x8d\x92\x7b\xe5\x30\x18\x09\x01\x5b\xa5\xe2\x53\xc1\x94\xe4\x8d\x92\x4d\xe6\x97\xc1\x60\x4c\x07\xe0\x18\xa2\x0b\x07\xd8\x5a\x46\x6e\xfb\x03\xe7\x56\x8b\x57\x36\xc6\x86\x9f\xf3\x1a\x2c\x65\x6a\xf7\xfb\xe4\xf7\xfb\xa2\xa8\x56\x2a\x73\x09\xfd\x8a\x8d\xbf\xda\x85\x7f\x0f\x1e\x3f\x7e\xb8\x76\xe1\x87\x97\x2e\x5c\x1b\xc9\x65\xe0\x0e\x02\x2a\x7a\x8c\x83\x61\x7a\xe9\xc1\x71\x36\x0d\x76\x67\x02\xb7\xc6\x98\xb5\x6c\xb9\xed\x8f\x9c\x5b\xd8\xa5\xe0\x13\x7e\xb1\xcc\x1f\xfd\xc1\xa9\xa5\xf3\xfc\xf1\xf8\x52\x7b\xf3\xeb\xe3\xfb\xd2\x81\xbf\x3a\xbe\x0f\x5f\x8d\xaf\x77\x52\x8e\xda\xd5\x10\x0c\x98\x80\x42\xca\x78\x62\x3a\x8b\x83\xa0\x0c\xe8\x9b\x37\xb5\x23\x30\x14\x91\xd3\xe9\xb4\x96\x3d\xb3\xfd\x69\x1e\x62\x23\xfe\xd4\x10\x67\x3e\x8a\xff\x37\xc6\x98\x6a\x2f\x0f\xd6\x61\x70\x24\x14\x34\xc6\xc4\x74\xa2\x8b\x89\x4d\xf2\x40\xa7\x1a\x9c\xd2\x0e\xb4\x14\x5f\x77\xe6\xb5\x0c\xca\xf6\xa7\x3f\x6f\x8c\xcb\xfa\x97\x36\x7e\xff\xe6\x2f\xb5\xb1\x6a\x5b\xa7\xc0\xd6\x3b\x5c\x32\x4c\x01\xf6\x3e\xa6\x9e\x59\xc1\xa1\x92\x28\x51\x30\xcc\xb1\x76\x0a\x65\x41\x51\xd6\xe9\x01\x6c\x2d\x77\xca\x8e\x60\xfb\x67\x59\xb9\xd4\xb4\xb3\xbb\xb0\x62\xf9\xf6\xe2\xaf\x33\x4e\x23\xc3\xd0\x56\xeb\xf7\xdf\x2f\x2b\x30\x78\x78\x9b\xa3\x88\x87\x55\xed\x39\xb0\x60\x27\x12\x4f\x2c\x0d\x09\x8a\xb2\x06\x56\x12\x47\x44\xaa\x57\x43\x18\x63\x6f\x2f\xf5\x8a\x71\xba\x37\xc1\x82\xe6\xd0\xf9\x76\x2b\x14\x93\xe2\xa9\x70\x4f\xc5\x11\x1f\xc6\x02\x14\x62\xde\x73\x57\xdb\x85\x0f\x60\xb5\xde\x3c\x53\x86\x3d\x3e\x73\x86\x7d\x5e\x3d\xbc\x87\x1b\xc3\xd3\x3e\x85\x6d\x53\xa9\x09\xb6\xa5\x10\x93\xee\x6b\x33\x31\x55\x2a\x3b\x91\xf2\x0c\xb7\xe9\x98\x46\x5c\xb6\xab\xad\x47\x8d\x37\x21\x1d\x43\xdb\x83\x98\xcc\xe8\x5b\x00\x83\x71\xb5\xcf\xba\x1e\x4f\xfc\x2e\xae\x44\xf1\x0f\xae\xb7\xd9\xd7\x18\x0a\x7c\x2b\x27\x79\x4d\xce\xbc\xa9\xf6\x04\x56\xf0\x27\x59\x8e\x0d\x2a\x25\x91\x9a\x6d\xdb\x9a\x91\xc3\x28\xe7\x05\xfd\xa4\x8f\x71\xbb\x12\x5c\x79\xcf\x68\x12\xd3\x88\x10\xef\xf0\x81\x53\xae\xc1\x98\xf6\xe9\x28\xad\x3c\x03\x51\x80\x12\xe7\x7a\xc1\x62\xe1\x69\xfe\x86\xa6\xf9\xe3\xf5\x94\xf3\x0d\x5f\x34\xa7\x89\x97\x45\x3d\x9d\x4a\x5d\x4f\x96\x68\x00\x79\xa8\x39\x4b\x71\xa7\xa7\x73\x53\xc2\xc4\x1a\x30\xee\x76\xa4\xac\x57\x85\xa5\x1e\x7a\xd8\x22\x8f\x46\xd8\x08\x8f\x0f\x04\x33\x7e\x46\x1e\x45\xe8\x91\xad\x1b\x8f\x8a\xaa\xcc\x35\x5d\xab\xfd\x7f\xb3\xce\xf0\x0e\x1c\x3c\xd8\x3b\x97\x50\xe6\x1d\x63\x53\xef\xf3\x41\xfa\x5c\x6e\x33\x0b\x69\x57\xf2\x04\x4b\x9d\xab\xbc\xe9\x4a\x2b\x75\x72\x27\x65\x95\x3b\x1e\x9d\xb2\xca\x6a\xa7\xb5\x3e\x67\xae\xbb\xb2\x14\xab\x90\xe3\x8c\xfa\x99\x4d\xf2\xed\x52\x44\x95\xc3\x8a\xf5\xe3\xcb\x3a\x93\xbf\xae\xf8\xbc\x37\xc8\x1d\x82\x16\x51\x8c\x8d\xe9\xaa\x6d\x2e\x24\xa6\xf3\xf7\x66\x4f\xb0\x23\x1b\x8b\x10\xb6\x94\x13\x2d\xb4\x11\x1d\x54\x4c\x86\x1e\x23\x64\xb9\x20\x76\x6e\x13\xad\x9a\x7c\x5f\xbb\x68\xba\xbc\xfb\xf5\x26\x9f\x5b\xa4\x0e\x03\xbd\x27\xd0\x21\x4a\x84\xb4\x43\x85\x29\x97\x66\x60\x1e\x03\x77\x64\xc4\xd1\x8d\x45\xce\x6a\x43\x5b\xbb\xd3\xf2\xb0\xed\x94\x3c\x9e\x91\xb5\xc6\xd2\x6e\xe1\x62\x95\xab\xed\xba\xd8\x98\xe2\xaf\xbe\x69\xef\x8a\xd1\xff\xba\x7d\xc0\x03\x06\xb0\xa7\xc8\x62\xc9\x95\x8c\xa5\x9a\xdf\x8c\xb4\x14\x3b\x22\x6b\x4c\xb5\xdd\x18\x18\x1c\xe7\xcc\xa8\x5e\xeb\x11\x60\xc8\x99\xe3\x82\x5b\x63\x84\x6a\xe7\xb9\xcb\xc1\x39\xf3\xd4\x2c\x7c\x5b\x0b\x1f\x78\xc6\xc9\xdf\x65\x24\xe2\xf7\x37\xca\x84\xcd\x81\x4f\xdd\xe5\xb0\x6e\x7f\x16\x5b\xe9\xac\x91\x95\x9b\xcc\xaa\xff\xc2\x42\xe5\x2f\x7a\x63\x2c\x69\x8c\x4f\x63\x3a\x6b\x25\x40\x0d\x18\x68\x9a\xe9\x98\x6a\x3f\x3e\xaf\xb5\xbc\xa8\xaf\x8c\x5e\xef\x56\x39\xff\xb8\xd0\x4d\xcc\x6d\xbc\xa6\x5a\x65\x3c\xf9\xd4\x54\xe2\xd2\x2a\x63\x95\x2c\x09\xb0\x21\xd1\x10\xc0\x90\xe8\x86\x7b\x02\xd3\xc9\x4f\xc7\xc4\x5a\xe5\x40\x5f\x22\x30\xc2\x4b\x77\x71\x31\x56\x66\xea\x41\x9f\x75\x9d\xc6\xbf\xb0\x3d\x3a\x85\x15\xfa\xb2\xb7\xc1\x79\x53\xf6\xa0\x8f\x53\x1f\x63\xae\x6d\xb9\xb5\x77\x4a\xac\x53\x1e\xf4\x25\xfc\x95\xf6\xae\xe7\x85\x5f\xb4\xf7\xd2\x87\xdf\xb4\x17\x13\xae\xf0\x65\xdc\x72\x65\x05\x2f\x21\x30\x21\x03\x1b\xdb\x24\xfe\x9c\x17\xbc\xce\xc9\xbf\xa0\x3d\x35\xed\xab\xe1\x42\xb7\xda\x39\xab\x4a\x03\xda\x38\x9d\x63\x46\x58\x2c\xed\x9d\x43\x6e\x4f\x07\xd0\x96\x08\xec\xe0\xa5\xbf\xd8\x18\x2b\x3b\xf5\xa0\xcb\x7a\x36\x45\x97\x79\x2c\xbf\xf1\x91\x97\xfe\xbc\xb1\xb1\x11\x91\xd8\xd4\x65\x25\x0e\x69\x39\x2f\x63\xe2\x15\xbd\x0c\x99\x72\x70\x23\x3c\x69\x86\x90\x54\xea\x9c\xd2\x40\x80\x0e\x98\x66\x62\x93\x0a\x40\x2d\x7b\xc8\x4a\xfd\x99\x63\xb6\xaa\x45\xda\x25\x51\x1e\x26\xc8\xb9\x63\xb9\x40\x35\xa4\x2e\x84\x39\x06\x7d\x35\x66\x24\x2a\x07\xba\x12\xff\xda\x98\xc9\x9c\x77\x91\xaf\xdb\x7b\xfb\x9b\x7d\x08\x79\xda\x25\x55\x9e\xa7\xed\x3c\x66\x9c\x83\xd3\x3c\x66\x9d\xf7\xb9\x41\xe9\x39\x3c\x87\xe9\x90\x68\xa7\x2c\xe8\xe7\xf6\xf0\xa5\xbd\xf4\x4a\x57\x7c\xe9\xc2\xa2\x2a\x44\xd5\x5f\xe3\xa5\x2b\xef\xcb\xcb\xcd\xd3\x1f\xc0\x2b\x50\xe3\x72\x75\xfa\xa9\x3c\xd8\x53\xea\x35\xc0\x95\x00\x05\x80\x22\xed\xd3\xa9\x77\x3e\x02\x01\xb4\x48\x75\x8a\x29\xa6\x2d\x07\x2d\xa8\xad\xb2\x7e\x77\xd8\x18\x19\x64\x60\x86\x86\xd0\x73\xcb\x38\xe5\xd0\x53\x25\xa9\xc3\x14\x13\xc9\x29\x9b\xd7\x96\xf8\x84\xef\xe0\x0a\x17\x6f\x8b\xbf\xb9\x9e\x26\x7e\x98\x17\x98\x05\xa6\xb7\x9c\xf7\xc1\xed\xc6\x72\xf9\x1a\xdc\xbe\x3e\x70\x21\x40\x04\xcc\x99\xb2\x4e\xf1\x62\x55\xb5\x05\x7c\x3a\x6e\x05\x84\x0e\x82\xa2\x1f\x44\xa9\xc0\xd1\x71\x0e\x62\xca\xc2\x15\x3d\xe8\x12\xd4\x10\x43\x87\xca\x01\x36\x4e\x0e\x8c\xd9\xd4\xeb\xc8\xc6\x2d\x44\x90\xe3\xc4\x09\x76\xe6\xc4\x30\xf4\x49\x5b\x27\x00\x46\x5b\x84\x39\x2d\xca\xaa\x2d\x68\xce\xe5\xff\x3e\xe7\x4a\x5e\x31\xef\x2d\x21\xc9\xdd\xfb\xef\xf3\xc2\xb8\x7c\xf7\x8a\x8c\x6f\xed\x7c\x83\x80\x1f\x26\x4d\x4b\x16\x53\x14\x94\x4a\xca\x95\x02\x18\x6c\x2d\x05\x7c\x9c\x10\x2d\x7d\x9f\x06\x8c\x28\x55\x8c\x73\xce\x01\xd9\x18\x48\xb0\x4b\xca\x05\x01\x30\x47\x44\x12\x42\x54\x4c\x94\x31\x97\x9a\xe0\x35\xb0\x18\x62\xa2\x29\xc5\xc8\xc4\x05\xef\x62\x0b\x72\xa7\x36\xee\x66\xdf\xb5\xaf\x9e\x4d\x99\xed\x7b\x31\xea\xcd\x4b\x67\xae\x60\xc0\x25\x7a\x2a\x26\xc8\x4a\x7b\x4a\x10\xd5\x14\x3b\x44\x5a\x0a\x10\xf0\x8e\x61\x87\x98\xb1\x0a\x8c\xa7\x88\x30\xf0\xe9\x78\x39\xf2\x72\x00\xc5\xc6\x61\xae\x13\xf1\x5e\x01\x86\xb6\x3c\x57\xee\x5a\x33\x49\xc9\x05\x17\x82\x61\x3d\x80\x1a\x12\xa2\xa7\x5d\x17\x2d\x68\x97\x7d\x64\x1e\x6b\xb6\x86\x57\x1b\xbf\x19\xd4\x97\xa1\x7e\xb6\xfe\x79\xa4\x4f\xfd\x3c\xd0\xdc\x11\x5a\xaa\xe4\x2f\x58\x55\x04\x98\xa9\x35\x78\x1e\xe8\xed\x30\x8a\x52\x80\xd1\x79\x70\x48\xec\x8b\x97\xab\x02\xc4\xb4\x95\x94\x60\x87\x2b\xc3\x9c\x3d\x32\x8c\x7c\x32\x73\x6f\x42\x42\x28\x67\xa9\xa0\xd4\x05\xb0\x65\xdc\xa5\x3a\x3a\x03\x3c\x6e\x18\xe7\xa2\x28\x33\x87\xe1\x82\xd3\xfb\x9b\x6b\x3f\xfe\xbe\x5c\xdd\xbd\x1e\xe8\x4f\x4b\xef\xfd\xbe\x2c\xe6\xaf\x17\xa6\xc0\xf9\x6b\xb0\x0b\x14\x88\x21\x8d\x3b\x0a\x0e\x36\x1d\x05\x25\x0a\x53\x26\x8f\x3b\xdb\xd4\x00\xef\x53\x7b\x20\x25\xf4\x67\xbe\x25\x44\x2b\x2d\x0e\x1b\x03\x9d\xc3\x69\x38\xe0\x79\x44\x15\xa1\x8a\x52\xa2\xfb\x69\xcf\x20\x72\x34\xf9\xa7\x82\x06\x07\x46\xb9\xa5\x4c\x39\x69\x63\xce\x71\xf8\x27\x7a\xa7\x56\xa7\x3f\xea\x87\x9b\x6f\x1d\x71\xf6\x43\xe5\x1b\x08\x4c\x3f\x59\x5a\xe2\x98\x3a\x41\xb0\x24\x54\x4a\x00\x41\x61\x61\x03\xd8\x30\x3b\xa2\xeb\xd2\x8e\x42\x42\x14\x61\x5e\x00\xb4\x3a\x41\x8c\x5c\x72\xda\x73\xb0\xa5\x08\x4b\x82\xb1\x72\x49\xb1\x06\xda\xc4\x7c\x90\x80\x93\x1a\x61\x45\x08\xb7\x66\xc9\xc1\x14\x4f\xf4\x4e\xff\xd1\x79\xf2\xe6\xd7\xe7\x09\x9a\x1d\x6c\xdc\x4f\x35\x2d\x63\x9f\x24\x67\x54\x53\xae\x15\xa0\x47\x47\x41\x77\xbc\x0c\xac\x2a\x76\x49\x23\xcc\x99\x66\x42\x28\x01\xf0\xc6\x40\xc6\x7c\x6a\x42\x54\xc0\x50\x3a\x07\x62\x54\x77\xd3\x81\x71\x3f\xed\xfa\x68\xc1\x88\x10\xe3\x5a\x70\x46\x5c\x2c\xaa\x5c\x9f\x26\x37\x3a\xdf\xbb\xff\xe1\x6a\x5d\x7d\xf7\xaa\xf0\x37\x5f\x87\x3f\x27\x02\x57\xd1\x41\x54\x5a\x82\x83\x30\xd0\x0a\x42\xea\x69\xcf\x82\x1a\xcb\x22\x65\x35\xcb\x8d\x46\x46\x7f\x09\xa7\x1e\x46\x78\xa8\xce\x7d\xa7\x40\x93\xc6\x5b\x62\xf0\x7a\x76\x9a\xfd\x69\xdc\x98\xa2\x79\xbe\xff\x7b\x76\xa8\x57\xd9\x8c\xaf\x5c\xea\xe1\xe5\x7b\x70\x9c\x57\x0f\xbd\x4b\xfd\x9e\x96\x85\x4b\xfb\x2d\x23\x44\x61\x82\xb0\x3c\xee\x6d\xd3\x00\x76\x48\xfe\x44\x4a\xe6\xd3\x59\xcc\xc3\x46\x09\xe3\xe7\xb9\x5f\xe8\xec\x59\x7b\x32\x7b\x56\x2d\xb2\x6b\x41\xa8\xfa\xe9\x38\xfb\x16\x49\xee\xe6\x5b\x94\x2b\xc6\x08\xb6\x6d\x51\x94\xab\x79\xec\xcc\xc6\x14\xef\x8a\xbf\xfd\xc6\xf7\x7f\xdb\xd4\xdb\xd7\x6b\x1f\x28\x50\x43\xea\x66\x43\x7d\xda\xd7\x8c\x10\x89\x67\x9f\x39\x65\x43\xe9\x21\x85\x13\x2d\x59\x48\x27\x61\x34\xa6\x94\x8a\xf3\x6d\x02\xfc\x69\x33\xfd\xb3\x95\xf3\x5a\xd7\x5f\x79\x0c\xdf\x16\xff\xe6\x6b\x1f\xdb\xbc\x72\xb2\x5f\x9d\x04\x75\x44\x04\x1c\x0f\x97\x03\x2d\x77\xbb\x44\x10\x62\x4c\x31\xe1\x14\x90\x67\x07\x11\xd8\x9d\x2f\x9e\x55\x64\x4c\x1c\x61\xce\x35\x97\xa3\x00\xfc\x2b\x2f\x43\xcd\xec\x66\x9c\xe5\x69\x8a\x50\xf6\x33\x07\x76\x08\x51\xa1\x05\xb7\xae\x5d\xf4\x40\xe9\x9d\xcc\xf6\xfd\xeb\x6f\xed\xbb\xb9\xfb\xab\x15\xfa\x65\x0e\xac\x0e\x11\xd3\xb2\x39\x5f\x1c\xab\xd0\x61\x3a\x63\xd4\x6a\xa1\x19\x57\x20\x80\xda\x71\x70\x4e\xa7\x0b\xa4\x55\x38\xa5\x5a\x4a\x61\xa4\x36\x46\x00\xfb\x95\x7d\x10\x3a\xcd\x39\x82\xd9\x3e\x7e\x33\x8f\x53\x6e\x84\x60\xd4\x65\xec\x6d\x75\xc3\x10\xfe\xf0\xb5\x0e\xe0\xdb\xaf\x61\x77\x99\xa1\xfd\x7a\xdb\xb4\xbb\x69\x02\xab\x34\x9f\x09\x6d\x38\x89\x21\x84\x70\x50\xa7\x90\x3a\xd0\xe6\xbc\x82\x5e\x0f\x7d\xef\xfb\xd0\xfb\xe4\xda\xb6\x05\x74\x72\xe5\x2e\x75\x83\xdb\x01\x3e\x7f\xbd\x60\x1d\xc6\x2b\xee\xef\xd7\xda\xbe\x61\xd2\xaf\x01\xf3\xb5\x6d\x04\xf6\x0b\xf0\x7a\x6e\xff\x94\x48\x0f\x90\x48\xe7\x36\x74\xe9\xa8\x00\x1d\x12\x03\xc7\xa4\x81\x4f\x68\x6e\x3f\x0c\xa1\x0f\x69\x88\x5d\x0f\xd0\x64\x4a\x9b\xc6\x9d\xdf\x01\x11\xfa\x90\x71\xa1\xeb\xd2\x5e\xdf\xfd\xaf\x8a\x1f\x8a\xff\x2e\xdf\xc1\x5e\xa3\xe7\xdb\x05\xeb\xfb\x67\x4a\xb3\x57\x20\xa6\x4f\x9f\x1f\x7f\xb8\x7e\xfd\xf5\xb7\x57\x1d\x8c\x67\xca\x88\xfc\xd5\xc7\x87\xb5\xc5\x0d\xe8\x2e\xac\x77\x1d\x38\xe3\x74\xea\x8c\x31\x9c\x30\x08\x0d\x21\x5c\x11\x0f\x76\xd1\xc6\xc0\x0d\x25\xc2\x0a\x21\x02\x33\x89\x54\x71\xda\x13\x70\xf2\xa9\xf5\x5c\xaa\x51\xed\x01\x03\x22\xb5\x1b\xc3\x85\x9b\x42\xaa\x93\xe1\xc0\x82\x7d\x39\x98\x44\xbd\x37\x5b\xca\x25\x82\xe9\x00\x6a\xc7\x94\x6d\xad\x73\x66\x27\x2d\x8e\x4f\x05\x80\xad\x50\x7e\x98\xce\x4e\x25\xc8\x39\x80\x92\x9a\xd0\x27\x1b\x8a\x62\x7b\xad\xd3\x96\xcf\xf7\x7a\xff\xb6\xf8\xaf\xc5\xff\x5a\xfc\xef\xcf\x8a\x1e\xb7\x37\xfc\xfc\xdd\xbb\xcc\xf6\xf3\x61\x3e\x46\xdf\xb8\xfa\xdf\xbe\xb0\xb9\x7d\x78\x7d\x49\xfd\xfe\x06\x20\xba\x55\x97\x5c\x53\xb4\x1f\x5f\x91\xfb\x57\x7c\x05\x53\xdd\x80\xde\x69\x8c\x04\x57\x12\x36\x97\xe8\x15\x20\x4d\xd2\x63\xa9\x27\x7f\xfb\x00\xcc\x28\xa5\x6c\xf4\x48\x7a\xe4\x6b\xd1\x53\x8e\x4b\xc8\x74\x37\xb2\xa7\x62\x7f\x4a\x3d\x05\xf5\xa0\xb9\x64\x62\x67\xa0\x54\x46\xd3\xc9\x69\xae\x84\xda\x48\x4b\xa7\xe3\x09\x13\xa1\xe7\x1d\x8a\xeb\x63\xd9\xd0\x74\x66\x27\x76\x62\x07\x48\x38\x45\xc8\x34\x35\xa2\x48\xb3\x2d\xb7\x9a\x53\xe8\xb1\xd4\x38\x34\x8c\x0a\x8e\x8c\xee\x20\x4e\x03\xa3\x84\x83\xc8\x0c\x93\x4b\x9d\x5e\xcc\xfe\x62\x8b\xff\x7f\xf1\x3f\x17\xba\x28\xc0\x87\xff\xf0\xf9\xc3\xdb\x87\xb2\xfa\x50\xbf\x7b\xc6\xbd\x3d\xbc\xc0\x0e\xb3\x60\xfa\x2d\x41\x7d\x9d\xda\x8b\xca\xfb\x9b\x4f\xff\xfd\x33\x19\xe8\xad\x02\xf7\xf3\x35\x3b\xb0\x5e\xb8\x51\xef\x3e\xff\xf2\x4f\xe5\x39\x6e\x2d\x28\xf0\xd6\xd7\x30\x34\x8d\x21\xa8\x4d\x18\x62\x4e\x9d\xd4\x0c\xe1\xc6\x93\xc8\xad\xef\xd8\x60\x39\x4a\xfb\x3a\x2a\xc9\x35\x8b\x72\x40\xbe\x23\x18\x5b\xeb\x38\xad\xb7\x0a\x37\xba\xf6\x1d\xd4\x4a\xca\x46\x73\xc7\x4a\x49\x51\x03\x8d\xb5\xae\x56\x08\x9a\xda\xb7\x48\x2b\x21\xa1\x61\x8e\x96\x12\x22\x06\x68\x79\x48\xcd\x2e\x79\x88\x38\x15\xce\x69\xa9\x69\xa7\x35\xa8\x49\x72\x83\x62\x8e\xa9\xd0\x0b\xae\x9c\xe4\xe9\xe4\x6d\x07\x44\x85\xb6\xb5\xc6\x69\xdf\x36\x0d\x46\xd0\x77\xc8\x10\xa8\xed\x0e\xd5\x36\x9c\xd1\xde\x6c\x6b\x42\xe6\xbf\x62\xf1\x8b\xbf\x2d\xba\xa0\xfb\xbc\x2e\xe0\xec\x93\xff\xa9\xf8\x2f\x45\x01\x1e\x6f\x34\x5b\xcb\x4d\xed\x0b\x81\xc6\xf7\xd5\x8d\x1e\xb2\xca\xba\xcd\xd7\xda\xdf\xd7\xb9\xdb\x05\x43\xb3\x52\xa2\x73\xed\xaa\xb8\xf8\x4a\x27\x85\x29\x6d\xec\x56\x08\xc3\x92\xf3\x5c\xb2\x46\x47\xb6\x2d\x77\x13\x11\x25\x0c\xfb\x3d\xd3\x82\x35\x42\xc2\xe9\x10\x15\x97\x42\x56\xe3\x30\x2d\x28\x35\x70\x2a\xcf\x2e\xb5\x56\x50\x42\x58\xad\x31\x72\x06\x88\xb4\x87\xc8\x12\x4c\xca\xb3\xb9\x1c\xbc\x77\xe9\x20\x79\xe3\x21\x05\x5b\xc4\x84\x51\x2c\xe3\xea\xcb\x21\xc7\x57\xbf\xe4\x84\x7b\x59\x41\xbe\xe6\x7b\xd2\xa0\xf7\x60\x48\xd1\x83\x42\x1f\x83\xb7\x47\x7d\x72\xa9\x6d\xe7\x98\x49\x56\x85\x27\xd2\x8b\x85\xc8\xd3\x06\x67\xe3\x30\xcf\xfe\xd1\x39\xd3\x82\x93\xb6\xdc\x1a\x8a\xbd\xe1\xea\x56\x1f\x57\x91\x8d\x2d\x7e\x2c\x8a\x37\xb7\xbb\xfa\x6b\x86\xec\xf5\x0a\xf6\xe6\x96\x80\xff\xf8\xd8\x9e\x3c\xd8\xa6\xf3\xf1\x38\xff\x1b\xb5\x14\xc2\x2b\xa9\x7c\x4c\x67\xb0\xdd\xef\x4f\xeb\x61\x18\xdc\xfc\xd3\x45\x17\xcc\xa4\xc0\xb1\x97\xc6\x03\xca\xe6\x2f\x97\x9a\x3c\x76\x3d\xeb\xfc\x98\x35\xd3\xae\xf4\x27\xaf\x7e\x6e\x0d\xbf\x6c\x2e\x11\x90\x74\x45\x74\xf7\x80\xa4\xdd\xbc\xe0\x8d\x5e\x19\x1b\x5c\xcf\xc7\x36\xf5\x40\xa6\xdd\x4a\xf7\xb1\xeb\x62\xef\xbb\x20\xad\xf5\x46\x4d\x7d\xa9\x9f\x8a\x18\x23\x60\xa1\x2b\xca\x22\x3c\xf1\x3b\x5f\xa1\xe2\x5d\x8e\x9a\x37\xaf\xb6\xff\x57\x21\x6c\xa6\xf0\x2e\xeb\x56\x4b\x20\x5a\xdf\xc0\x4a\xd9\xa7\x02\x34\x20\xe2\xb4\x4d\x6d\x1a\x52\x8d\xe6\x6d\x76\x0f\xc2\xc9\x4e\x45\x0b\xbc\xa7\xf6\x08\x0a\x8e\x90\x7d\x2a\xbc\xaa\xdb\x26\x7a\x1c\xa0\x0a\xd4\x74\xcb\x5e\x06\xf6\x4f\xe4\xce\x95\xbb\xa5\xae\xf2\x85\x63\xa3\x7a\x2e\x21\x2a\x75\xd9\xc4\x12\x25\x78\x00\x44\xa6\xdd\x2e\x0e\xc9\x28\x10\xfa\xc4\x4a\x6e\x8c\x3f\xa9\xde\x01\x38\x1d\xca\xfa\xec\x82\xcd\xbc\xf9\x85\x7c\xd2\x77\xb1\xda\x15\x0f\xc5\x8f\xc5\xbf\xc9\x67\xc6\xcd\xf5\x4c\x9f\xab\x93\x96\xdc\x66\xce\x2e\x7f\x7c\xc8\x22\x48\x1f\x1f\xc0\xe6\xee\xe1\xc7\x37\x9f\x3e\x3f\xbc\x7d\xf8\xf0\xf1\xe1\xbb\xb2\xe9\x06\x56\x52\x60\x64\x53\x83\x00\x7a\xbe\xeb\x93\x2a\xf9\x7c\xbc\x3e\xfe\x54\x03\x0f\x89\x29\x65\xd2\xa0\xd7\x7d\x69\x3a\x8b\x61\x3a\x27\x7b\x4a\x03\x2e\xb7\x8c\xf8\x00\x1a\x5d\xd7\xbd\xf4\x98\xd2\x60\x25\xf3\x5e\x70\x1b\x00\x64\x82\x4d\x86\x8b\xb6\xe5\xd7\x5a\xef\xca\xe4\xb3\xe2\x7d\xae\xe8\x2a\xc0\xe3\x52\xa5\x78\xab\xa8\xbd\x41\x46\x97\x5a\xa6\x95\x3e\xc6\xa9\xaf\xb6\x0d\x8c\x04\x96\xe7\xa9\x8b\x13\xf7\xb1\x77\xe3\x6a\xdf\x75\x26\x8c\x6b\x96\x0c\x70\x81\x60\xcc\x78\x48\x06\x50\x36\x6a\x6d\x9d\xf4\xc6\xb9\x5c\xc3\xba\xe0\x86\x6e\xba\x1c\x4b\x0b\xaf\x59\x3c\x97\x14\xc9\x62\xc0\x6b\x41\xdb\xb5\xe6\x08\xb4\x69\xcf\xb4\x92\x50\x29\xe2\xb6\xdd\x49\xef\xba\xd4\x83\x1d\x24\x4f\x85\xe7\xca\x99\x2a\x08\x18\x20\xdf\x38\xe3\xc3\x17\x6c\x44\x1d\x6a\xb9\x6a\x27\x3d\x8d\x07\xdb\x96\x45\x69\x82\x56\xd3\x1e\x27\x96\x46\x0e\x14\xe0\xc9\x27\x8b\x41\x00\x59\x87\xad\xc4\x59\xaf\xc8\x3e\xf7\xc3\xab\x1e\x58\x54\xb7\xfe\x00\x5e\xfa\xa1\x6c\xc1\x11\xd1\xc8\x71\x59\x27\x13\xfb\x98\x46\xe5\x44\xab\x62\xd5\xb7\xca\xcb\xb8\x0e\x8a\x63\x65\xfd\xad\xea\x5f\xb3\x31\xb8\xe0\x63\x27\xfa\xb8\xd4\xd7\xfb\x7c\xee\xfd\xcd\x7e\xb8\x26\xfb\x3f\x5f\xfb\xe1\xd5\x00\x34\x04\x96\xa7\x69\xcf\x55\x26\x50\xc7\xf3\x4e\x71\x12\x3b\xb7\x9d\x0e\xd5\x16\xa2\x44\x9c\xdf\xa9\xdd\xea\xd0\xb6\xce\x0d\x1b\xc3\x65\x48\xd6\x88\x26\x34\x12\xe4\x34\x8f\xf2\xfc\x70\x08\x0c\xa7\x56\x1c\xac\xf5\xce\x8f\x6a\xe8\xae\x35\xff\x3c\xc7\x7b\xcf\x9a\x29\xaf\x7c\xe0\x97\x96\xbd\x26\x67\x2c\xc7\x69\x5f\xd5\x10\x45\x02\xab\x62\x1a\xb9\x54\x02\x4a\x85\xd2\xb8\x6d\xcf\x62\xf4\x15\xed\x3b\x1b\xc6\x0b\xb2\x7e\xa7\xc6\x75\x13\x38\xc3\x52\x85\x24\x8d\x68\x22\x94\xc0\xa4\x5d\x3a\x68\x27\x8f\x7d\x77\x56\x87\x3d\xe7\x67\x9f\x43\xe4\x6c\xd3\xe1\x4f\xf8\xe6\x6b\xca\xf9\xc5\x37\xeb\x06\xdd\x7c\x13\xb4\x5d\x67\xe2\xee\x82\xb2\x8b\xae\x9b\xd4\x80\xe3\xdc\xba\xd0\x21\x35\xc0\xb9\xc1\x0e\x1d\x67\x4f\x85\xd3\xe1\xaa\x17\x59\xee\x72\x1f\xfc\x91\xb9\x50\x7e\x3d\x17\x86\x97\x17\x6f\xe3\x24\xbc\x6f\x6d\xbf\x6a\x0f\x3e\xd8\xc3\xba\x99\x0e\x25\xbc\xbe\xed\x74\x00\x3d\x4b\x27\xaf\xdb\xb1\xdf\x8b\x71\x58\x34\xad\x4d\xb9\xd4\x3e\xfc\x93\x67\x3d\x8a\x97\xe5\x21\x5f\xb9\xdc\x3d\xfc\xf8\x7e\x73\xcb\x92\xaf\x8a\x00\x21\x90\xe0\xc0\xf7\xa7\xa9\x18\x0e\xaa\x34\xb0\x14\x6d\x18\x92\x5d\xed\xbe\x10\x5f\xb5\x17\xb1\x71\xb8\x81\x83\xf1\x44\x0b\xa1\x98\x1b\x2d\x93\xf6\xa9\x48\xde\xe4\x5a\x20\x51\x9d\xee\xfa\x4d\x2c\xfe\xea\xca\x12\x79\xbd\x4d\xfb\xf1\x87\xb9\xb9\xf5\xfb\xef\xdf\x3d\xbc\xdf\xac\xaf\xad\x55\x27\x8f\x40\x04\x83\x38\xa5\xdd\x24\x8f\xe9\xcc\x4b\xdb\x80\xfd\x59\xa5\x62\xdd\xfc\x7c\xf4\x59\xa6\x38\xa2\xc6\x32\x8f\x25\x63\x9c\x7a\x2b\x25\x1e\xd3\x5e\x89\xfc\x6e\xec\x29\x56\xc7\x8d\x2d\xfe\xd1\x4b\x16\xf4\xb5\xb4\xc5\xc3\xdb\x87\x37\xaf\x44\xcc\xca\x26\x34\x70\x8c\xc6\xf7\xe1\xa0\x00\xb1\xa5\x9b\x8c\xf7\xa5\x0d\xa9\xdd\x58\x44\xb1\x8f\x3a\xb8\x83\x57\xa7\x14\xdd\x65\x1f\xab\x7a\x2a\x7c\xe6\xf4\xcd\x5c\xcc\xe6\xa9\xdd\xd8\xaa\xcd\x6d\x5d\xb3\xc8\xd7\xac\xe7\xfc\x56\x0b\x4c\xec\xf6\x56\x73\x1f\xd6\x00\xf1\xd9\xeb\xce\xe9\xc8\x41\xef\x4a\x3f\x69\x5e\xe1\xcb\xe8\xe7\xe9\x5a\xb5\xb8\x81\x96\x3a\x11\xa3\xb0\x7e\x6f\x74\x92\x4b\xbc\xba\xca\xb5\xd8\xdd\xc6\x65\x7c\xd3\x82\x6e\x7a\x77\xb7\xc8\x09\xdd\xbd\x2f\xe6\x57\x5a\xbf\x4a\xec\xae\x45\x40\x23\x68\xe4\x53\x31\x76\x67\x0d\x18\xcb\xe8\xe7\x43\x9c\x0e\x31\x66\x1c\x9c\x43\x32\x1d\xe7\xa8\xa6\x49\xe3\xa0\x01\x4c\x7d\x18\x2f\x47\xe7\xaa\x26\x6d\x81\xbc\xed\xc3\xed\x5f\xb4\x0f\x07\x50\xa7\x03\x80\x01\xa0\xb4\xcf\x9c\x7d\x24\xed\xc6\xa0\xe7\x7d\xd8\xf1\xc1\xa7\x11\xd0\x74\x7a\xb5\x0f\x0b\x67\xbd\x93\x53\x57\xf2\xa7\xc2\xc6\x16\xd0\xd0\x5d\xf5\x7e\xfb\x8c\x83\x7a\x35\x76\xbf\x5b\x5f\xb1\x50\xbf\x78\x51\x1e\xeb\xed\x08\x6a\x75\x1e\xfb\x13\x07\x84\xe4\x45\x2f\xc4\x04\xdb\x76\x8e\xf7\x36\x0e\xc3\x26\xf5\x87\x70\x00\x2c\xc5\x31\xcb\xc9\x85\xfd\xe5\xe4\x5c\x55\xa7\x1a\x64\x1c\x5d\xb9\x16\x4f\xfc\x0e\xaf\x16\x7f\x29\xc0\x87\x57\x6b\x4e\xd6\xa1\x8b\x9e\xa9\x2c\x74\x41\x52\x1f\xc2\xca\x7e\x89\x79\x81\x17\xd5\xe1\x92\xf9\xb8\x57\xf5\x75\x6f\xf9\xda\xe6\x77\xbf\x65\x73\x08\xdb\xba\x3b\xc8\xb1\xed\x06\x0e\x6a\x04\x76\x89\x94\xc4\x27\x13\x02\x70\xc9\xcc\x26\xa3\xb4\x3b\xfa\xb9\x03\xc3\xe0\x67\xc3\xfd\xe1\x72\xf2\xbe\xaa\xd3\x16\xe8\xbc\xbf\xf3\x95\xfc\xaa\xbd\xb9\x9d\x37\x57\x27\x5f\x7f\xd3\x5e\xa9\xfa\x93\x04\x22\xc4\x06\x9d\x7b\xd3\xa6\x26\xa3\x21\x7d\x4c\x3c\x66\x15\x8f\xb5\x48\x87\xc1\x01\x02\x38\xa6\xb4\xed\x4d\x7f\xf2\x87\xcb\xd9\xda\x6a\xbb\xf4\xd0\xaa\xe0\x95\xcc\xbe\xf7\x57\xcf\xc8\xba\xe5\x26\xfc\x57\x97\x8a\xea\x14\x31\x30\x60\x2f\x9e\x8a\xe3\xe5\xb4\x3b\xca\xd2\x35\xa5\xed\xa3\x49\x78\xb5\xff\x82\x7c\xd5\x5d\xf8\xfc\x8e\x4e\x5b\xc6\x15\x63\xd4\x45\x4d\x19\x4d\xe7\xd4\x9b\x8c\xff\x02\xeb\x7c\x3f\xbc\xd1\xc5\xf7\xd7\x93\x4b\x06\xf4\x2e\xd4\x3c\xaf\x8e\xe8\x9f\x3e\x2e\x14\x3d\x1f\x3f\x6c\x6a\xce\x09\x40\x47\xa2\x4c\xdf\x9f\x4e\x7c\x0e\xcb\x38\x43\x70\x1c\x63\x5c\xeb\xa6\xf6\x44\x1a\xbc\xf0\x39\xfb\x04\x33\x45\x1d\xc4\x60\xee\xda\xa5\xde\x42\x3c\xb1\x72\xd8\xe8\xcc\x81\xfe\xe1\xfe\xdb\x16\x9f\xb1\x57\x8f\xb1\x13\x82\x00\x78\xa4\x59\xae\xe5\xb0\x7d\x2a\xec\x71\xbb\x3f\x74\x2b\x0e\x60\xdd\xe4\x56\x60\x6a\x73\x2b\xf2\xa9\x50\x27\xc0\x3c\x60\xc5\xea\xca\xd9\xfa\x6b\x73\x77\xfd\x2b\xee\x81\x23\xdc\x83\x46\xa5\xf3\x38\x3c\x15\x02\x08\x5e\x92\x69\x57\xee\xe2\x74\x8a\x59\x02\x7e\xe3\x30\x4d\xc3\xec\xd2\x34\x75\x87\x90\x15\x16\x5e\xbb\xf4\xaa\xd0\x57\x4d\xbd\xd7\xed\x65\xe4\x42\x71\x5d\x92\x5e\xb7\xb7\x6a\x0c\x06\x0e\x0c\x22\xd1\x24\x92\x4f\x08\x97\x44\x56\xe2\xd2\xae\x44\xbc\x14\x31\xae\x8a\x4b\xb1\x72\x1c\x8f\x3a\x58\x50\xcc\x53\x35\xf4\xce\x4e\x91\x8b\x52\x25\x03\xe6\xb5\xa9\xbe\xce\xd9\x3f\xef\xfd\x50\x84\x07\x80\x55\x3a\x1e\x0e\xe9\x24\x80\x26\x99\xce\x72\x8c\xd3\x3e\xc6\x12\x4d\xfb\x97\xf7\x63\x29\xee\x7f\xed\xfd\xd4\x13\x5f\x37\x2b\xf3\xf5\x7c\x5b\xbd\x7b\xb5\xe6\xbe\x34\xf8\xf1\xa1\xec\x7c\x03\x01\x3e\xc8\xa7\x22\x9d\xba\x74\xd0\xc0\xc9\x32\x4e\xb2\x3c\x85\xe9\x18\x32\x41\xd2\xca\x20\x84\xbc\xb3\xad\xeb\xbc\xe9\xf6\xce\x4c\xad\x94\xa5\x48\x59\xcf\x76\x95\xf1\x2a\xf1\xdb\xf9\x5d\x5c\x3b\xf4\x17\x2f\xb8\xea\x62\x03\x41\x03\xb4\x4a\x31\x1d\x67\xbf\x96\x60\xb4\xe5\x61\x82\x95\x8d\x13\x8a\xb1\xdc\x4f\x68\xe3\x30\x46\x69\x3c\xf8\x79\x14\xe3\xe8\x01\x4d\xed\x3c\xcb\x5f\x2d\x4c\x65\x39\x3e\x89\x8c\x0b\xf8\xc7\xf9\x1e\xe1\xbb\x77\xcf\x52\x2b\xcb\xc1\xec\xfe\x87\x77\xeb\x1b\x54\xa3\xbc\x42\x43\xd7\xef\x7f\xb8\x5f\xbf\xff\x7e\x8d\x28\x04\x87\x78\x69\x63\x59\x40\x0c\x76\x34\x74\x19\x3d\x41\xd4\xc0\xb6\xb1\xa6\x34\x1d\x06\x9b\x64\x03\xfa\x74\x24\x20\x6e\xac\x76\x49\x80\xed\x53\x01\xa2\x12\x09\x3a\x82\xd3\xa8\x82\x4e\x0e\x42\x36\xe2\x74\xa6\x84\x4a\xe0\x79\x10\x00\xd3\x40\x8b\xa2\xac\xd4\xb3\x6d\xff\xf6\x4f\xd9\x76\xa5\xad\x9a\x4d\xcb\x59\x7a\x45\x11\xf0\x71\x12\x11\x44\x48\x40\x60\xd6\x81\xae\x4e\x14\x89\x40\xb6\x71\x4b\xd4\xd8\xe9\xe4\x1a\xe0\x95\x22\x80\xff\xd2\x34\x94\x76\x3a\xe8\x64\x21\xa4\x7b\x3c\x5a\x3c\x5b\x26\x83\x04\x18\x36\xb3\x69\x59\x33\xee\xcf\xb6\xed\x75\xbf\x65\xe3\x04\x86\xa0\x8b\x53\x1d\xc1\x08\x11\x08\xd4\x85\xb2\xa9\xa7\x3d\x96\x81\x6e\xe3\x96\x92\xa7\xa2\x37\x89\x40\x70\xd4\x96\x00\xfd\x6b\xd6\x8d\x36\xd8\x64\xb2\x75\xd7\x8e\x0b\x3a\x68\x80\xae\xe6\x15\x20\xe7\xcf\xe2\xc6\xe4\xcc\xf3\x52\x79\x70\x53\x86\x7d\x77\x57\x54\x8b\x2e\xec\xe6\xee\xfd\xfd\xa2\x1f\xbb\xc8\xee\xbe\xdb\xdc\xdd\xd9\x98\x76\x75\x43\x85\x22\x56\x5a\x33\x9a\xd4\x77\x08\x2b\x89\xda\xc8\xa5\x61\x40\xc4\x74\x8c\x60\x0f\x9b\xd0\xd4\x6b\x93\x38\x80\x94\xa6\xe3\xe8\x9c\xec\x5c\x3a\x8f\x11\x98\xd2\x28\x3e\x59\xca\x5c\x50\xa2\x24\x46\x04\x50\x94\x22\x8d\x60\x30\x8e\x64\xb2\x0f\x50\xb6\xff\x8d\xb6\x99\x98\xda\xa6\x61\xc2\x30\xab\x82\x3b\x9a\xe4\x7b\x44\x8d\x42\x7d\xcb\xb5\xe3\xc0\x76\x69\x88\xe5\x16\x36\xa1\x6e\x16\xdb\x38\x4d\xa7\xd1\xf9\xd9\xb6\xd3\x2e\x02\x5b\x1a\xa1\x27\xcb\x16\xdb\xa8\xfd\x35\xdb\x70\xe6\x48\x35\x19\xe1\xf9\xb5\x6d\xeb\xdf\xb0\xed\xcd\xbb\x6c\x99\x85\x90\x2b\xcf\x9d\x69\x03\x28\x4c\x52\x07\xc4\xbd\x41\x63\xc7\x5d\xe4\xa0\xdb\x25\x17\x4b\x46\x03\x5e\x0c\x13\x2c\x9d\x06\xe7\x65\xef\xd2\x79\x37\x77\x9a\x93\x66\xb2\x8c\x67\xc3\xb8\x93\xcf\x86\x81\x82\xec\xb2\x5d\x4d\xd1\xac\x8f\x95\xcf\x7c\x50\xef\x16\xea\x9a\x17\xb4\xfd\x75\x65\xf8\x54\x79\x1d\xfa\xf9\x6c\x54\xc6\xb4\x07\x28\x1d\x41\x17\x26\x19\x0e\x95\x37\x0c\x7a\xd7\xf7\x2e\xfa\xcb\x48\x59\x95\x01\xe0\xf9\x1c\x24\x37\xf4\xf6\xcc\xfb\xe7\x2a\x89\xfb\x57\xcf\x5c\x9d\x8d\xcf\xfc\xc8\xa5\xcd\x94\xc8\x67\xd0\xb5\x93\x6d\xf7\x1b\x6a\x0d\x49\x4d\x98\x03\xc0\x00\xce\xe1\xa7\xe0\xc3\x06\xb3\x79\x2f\x1f\x9e\x58\x75\xce\x73\xe3\xbe\x78\x7b\x7b\xfa\xed\x81\x1f\x32\xba\xf8\xf6\x53\x16\x6d\x4d\x40\x88\x69\x1b\xcf\xd8\x81\x73\xda\xde\x3e\x1b\x8b\x94\xfa\x69\x88\x71\x43\xf5\x74\x00\x70\xc2\xcb\xa7\x58\x01\x51\x15\x9b\x6e\xe3\xaf\x35\x09\xb9\x02\xf6\xe1\xea\x23\xeb\x8f\x0f\xff\xbc\x5c\x24\x14\x37\xdd\xcf\x2d\xe8\x10\xec\x20\x2c\xc5\x97\xfd\x0a\x2d\x9f\x4d\x31\x15\x55\x41\x39\xc1\xe8\x20\x84\x11\x22\x1d\x44\xb1\x02\xbc\x44\x9b\x7e\xe3\xaf\x15\xaf\x6f\x96\x7b\xa5\x5c\x5f\xf0\x9a\x02\x8f\x77\xac\x2a\x7e\x0e\xa0\x4b\xa7\xdb\xf3\xf2\x33\x3d\xd1\x17\x5a\x0d\xe9\xe0\x92\x76\xc9\xb8\xa5\x86\x06\x5d\x6b\xfc\x5e\xea\x53\xfe\xeb\xd7\x3c\x80\x99\xa5\xfe\xf1\xe3\x63\x96\xe4\x7b\x5d\x89\xf2\x3a\x55\x7b\xab\xbe\xbf\xe6\x6a\xdf\xce\xf1\x53\x7d\xf7\xfe\xd3\x3f\x05\x0f\x3f\x7e\xfc\xf0\xee\x43\x26\xe1\xd5\xc7\x00\xea\x70\x3c\x86\x74\x0a\x47\x54\xed\x2f\x28\x38\x07\x6a\xe7\xed\x98\x44\x83\x04\x31\xcc\x0a\xbc\xdd\xfa\x86\x51\xe9\xa2\x12\xce\x53\x94\x46\x00\xa5\x50\xad\xf6\x20\x6e\x7d\xdd\x12\x4d\xf1\x26\x97\xab\x78\x21\x84\x70\x89\xb8\xac\x63\x9a\x6a\xab\x9d\x10\xd4\x5a\x3f\xe0\x4e\xef\x1c\xd1\xdc\xce\xa1\xb5\x95\x34\x9d\x82\x76\xa0\x99\xd7\x01\xcb\x18\xe5\x8b\xbe\x5e\x5b\x99\x8c\xfb\x7a\xf3\xb2\x97\x3d\xdc\xff\xdd\xe7\x77\xab\xf5\xfb\xcf\xb3\x07\x7c\xbe\x7f\x7c\xf3\xe9\xc3\xfd\xe3\x9b\xcf\xf7\x8f\x20\x04\x84\x80\x68\xea\x26\xb5\x89\x37\x78\x20\x9a\xd2\x0e\x42\xda\x51\xba\xb1\xb8\x55\x5f\xe2\xd6\x1a\xe6\xb7\xeb\x62\xf8\x59\xd4\x2b\xfe\x65\xb7\x5d\xe1\x2f\xa7\x7a\x35\xc7\xb4\xb3\x0f\xdb\x4a\x3f\xf3\xd3\x2d\x1c\xac\xeb\xb7\xb7\xfe\x5b\xf2\x5c\xd5\x2b\x86\xd6\x6a\x97\xba\x14\x68\x85\x4a\x4b\xa7\x96\xab\x43\x70\xc3\x78\x00\x0d\x4f\xf0\x14\xf6\xe2\x94\x1c\x07\x01\x34\x32\x1d\x92\xe2\x60\x57\x1a\xdc\x04\xaa\x9c\x24\x56\xba\x20\x7a\x1d\x79\x0c\x80\x4c\xe7\xf2\x68\xa3\x70\x52\xdb\xbd\x74\x76\xd1\x96\xab\xfc\x9d\xce\x35\x8a\x5f\xf9\xfd\x52\xfd\xf5\xf0\x09\xbc\xd2\x1e\xaf\x48\x87\x48\x45\xba\x9f\x60\x04\x2d\xad\xea\x74\xf2\xe9\xe8\xd3\x71\xe3\x10\xa7\x89\x7b\x0f\x3a\x39\x9d\x72\x98\x73\xfd\x14\x55\x75\xc8\xbc\xac\x26\xb3\xc2\xfd\xe1\x6b\x2e\xba\x2b\xf7\xd6\x57\x59\xda\x55\x0d\x78\xcc\xa5\x25\x36\xd9\xb8\xb0\xac\x72\x49\x03\x16\x55\x11\xa8\xf4\x72\x55\x97\x6a\x0a\x21\x75\x61\x8e\x90\x02\xe0\xa5\xf6\xad\x68\x03\x23\x3b\x2f\xdc\x82\x47\x3e\x3e\xe9\xbb\xb0\x69\x5e\x78\xd9\xaa\xfc\x3a\x0b\x2f\x1b\x78\x78\xf3\x50\x3d\xbc\x79\x58\xa9\xf2\xc4\xfd\x85\xef\xa1\x0f\xa8\x05\x0d\x68\x60\x3a\x65\x2a\x8f\xe3\xa6\xf9\xe9\x38\x47\xba\x37\x66\x36\x53\xda\x7c\xff\x7e\xce\x73\x63\x5b\xfc\xd5\xc2\x80\xf8\xf6\x21\xd7\xd3\x2d\x2c\x1a\x8b\xa4\xd3\x0a\x55\x32\xc5\xba\x09\xc6\xe9\x73\x4c\xa1\xd4\xce\x19\xed\x37\x5b\xcf\xd8\xcf\xb2\x3a\xa7\xc3\x68\x80\x29\x49\x12\xa7\x34\x18\x40\x00\xca\x71\xc4\x53\xbb\xc2\x57\xdf\x7b\xf7\xe2\x7b\xd9\xf5\x3e\x7d\xb8\xf9\x5e\xf6\xbf\xd9\xf7\x8e\x11\x11\xd0\xb2\x26\xf1\xe9\x04\x11\x3a\xb0\x98\xab\x09\xf7\x18\xcb\x8d\x25\x51\x7d\xf1\xb5\x53\x2c\x6c\x57\xe7\xee\x67\x5d\xaf\xe8\x97\xb1\x5e\xc1\x2f\xa7\x7a\x5b\x9d\x97\x1c\x87\x7a\xb2\x77\xa1\x42\xbf\x39\xe6\x79\x05\x59\x3e\x15\x6f\x1b\x5a\xe1\xdd\x79\x1c\xc0\xc0\x52\xa6\x33\x03\x2d\x68\xe6\x65\x7a\xfe\xff\x0a\x21\xaa\xa6\x21\x84\x92\xea\x89\x67\x1a\xc1\xfc\xc9\x39\x80\xf3\x93\xc9\x7b\xe6\x6f\xb5\xf3\x4a\x1f\x75\xe5\x5a\xc2\x4a\x63\x7e\x16\x11\x28\x99\xf6\x7d\x0f\xd8\x30\x00\xde\xf7\x1b\x43\x82\xfa\x79\x0c\x61\x8d\xdb\x9f\xd1\x2a\x7c\x51\xcb\xa7\x58\x95\x7f\xe2\xf9\xd5\xab\xe7\xaf\x8b\x16\xf1\xb2\x11\x5f\x84\x01\x0d\x1f\x17\x01\x58\x50\x5b\xbb\x31\x44\x87\x9f\xf7\x21\xac\x51\xf8\x99\xbe\x7a\x7c\xb1\x2a\xfd\x9f\xff\xfc\xd5\xd8\x62\x5e\x52\xf5\xf3\xc9\x01\x2c\xcf\x31\x02\x1c\x02\x40\x31\x6e\x0c\x31\x7e\x79\x7e\xf7\x95\xf9\xd7\x71\x6f\x9f\xc7\xfd\x9f\x7d\x3b\xee\x0f\x2f\xe3\xfe\xf9\xfe\xb1\xac\x5b\x48\xc1\x41\x34\xa9\x99\xda\x06\x63\x50\xb0\xde\x98\xb3\x31\x27\x6b\x37\x96\x58\xf7\x1b\xc3\xde\xcc\xa3\xbe\x2a\xe5\x5f\x30\x16\x43\x44\xb2\x94\xea\xe7\xc1\x01\xa6\xd2\x29\x46\x40\x96\xcf\xfc\x32\xee\xd7\xc6\xa2\x2a\xdc\x13\xbd\xd3\xd5\xbe\xf8\xc7\x05\xca\xb8\xe1\x7c\xba\x5c\xea\xdd\x7e\x7c\xff\xac\xb0\xfe\xf0\x1a\xf9\xf6\xfd\xfb\x4f\x9f\x1f\x96\xc2\xe7\xef\x56\x08\x35\xe5\x2e\xfe\x7c\x88\xe5\xa9\x69\x2e\xe7\x92\x50\xdc\x22\x5c\x9d\x92\x13\x1e\x34\x73\x5c\xd4\xa6\x7d\xea\xa7\x23\x07\x3b\x50\xa4\xf3\x41\x8a\x84\xab\x5d\xe4\xd3\x09\xe1\xae\xda\x13\x9a\x8e\x3e\x02\x84\x60\x92\x52\x42\xc1\x5c\x34\x99\x42\xd9\x13\x87\x04\xc3\x42\x1d\xb8\x67\x24\xf3\x79\x1f\x9f\xe8\x5d\x53\xb9\xab\x2a\xcb\xb5\x27\xbe\x51\x9d\x5d\x0a\x8a\xe6\xc0\xbd\x6c\xbb\x06\xad\x0a\x25\xb9\x84\x96\x91\x2f\x45\x00\x06\xe3\x67\x9c\x63\xe5\x10\x26\x97\x13\x17\x5b\xb7\x65\xa5\xba\xec\xaa\x9e\xa5\x2e\x11\x97\x71\x87\x4b\x5b\xa5\xcf\x7d\xfe\xcf\xaf\x3b\xf4\x2f\x9a\x7a\xce\x11\xf4\x91\x94\x67\x25\x31\x85\x02\xcf\x2d\x95\x1e\xa5\xae\x92\x97\xe8\x73\x30\xe8\x11\x9f\xc6\xa5\x25\xe0\xa6\xb6\xdc\xd3\x74\x4c\xad\x95\x45\x59\xee\x33\x3f\x4a\xb8\xa1\x6f\x6e\x35\x98\xcf\xeb\x6c\xd6\x5f\xbc\x62\x70\xee\x57\x45\xc0\xe5\x29\xb9\x4c\x4e\xd0\x27\xe6\x27\xdf\x81\x21\x1d\x84\x33\x03\xe8\xd3\x7e\x13\x50\xef\x53\xe7\x93\xf5\xa9\x01\x47\x5f\xd6\x80\xef\x3b\x03\xb6\x97\x76\x5e\x97\xe7\xb5\x30\x3c\xf1\x9c\x2f\x7f\x78\xae\xaf\x7c\x5b\xae\x5f\xeb\x3b\x7c\x05\x6c\xf9\x5d\x8e\x70\x69\x84\x08\xec\x76\x29\x96\x38\x26\x1a\x99\xc0\x25\xd9\xa7\xc8\x90\xe4\x52\x48\x82\x75\xdb\x35\x19\xf6\x6b\xa0\xe0\x3e\xe1\xe3\xe5\xa8\x54\xd9\xa1\xc6\x0d\x65\xa3\x31\x61\x86\x51\x8c\x8d\x07\xc5\xcf\xfe\xca\x05\x5a\xc8\x27\xb6\x39\xae\xc6\xcc\x03\x70\xb5\xa3\xf8\xca\x0e\xf0\x02\x02\xf9\xcf\x60\x1e\xd3\x0a\xb5\x10\x95\xe7\xa7\x22\xd1\x0a\xc5\x8b\x88\xa1\x95\xd5\x01\xc8\x49\x71\xab\x95\xf3\x52\xeb\xe3\xb1\xa9\xda\x8b\x58\x8d\x08\x23\x9b\xda\x38\x69\xce\xcb\x1a\x35\xc1\x01\xcf\x08\xb5\x82\x52\x6c\x74\xf7\x65\x0f\xf0\x8d\x9b\x86\x6e\x4c\x3e\x2d\x15\x57\xa8\xe2\xd7\x26\xbc\x4a\xb3\xe6\x50\xd8\x46\x5e\xaa\x53\x12\x65\x8c\x93\x0f\x5c\x92\xb2\x07\xcd\x74\xc2\xc4\x5b\xe5\x3c\x17\x1a\x70\x59\xea\xc9\x6f\x0c\x6c\x9f\x3b\xa2\x85\xb9\x23\x28\x65\xca\x28\xc1\xa8\x39\x7d\xc1\xc0\x17\x65\xb5\x7d\xe2\x77\xfc\x8f\x8d\xc5\x6b\x03\xfe\x73\xe6\xd5\x5e\x8d\x11\xa2\x12\x1d\x93\x2e\x4d\x98\x8e\x51\x28\x52\x7a\x50\x24\x8a\x98\x56\x4a\x69\x4c\x74\xec\x50\x26\x47\xfe\x6a\x30\x7a\x04\xb3\x0d\x82\x5e\x07\xc3\x9d\x7f\x8e\xd7\xb1\x58\x9d\x2a\x7a\x57\x6f\x54\x5e\x63\xbe\xca\x17\x7e\x5a\x12\x86\x26\x70\x87\x71\x83\xe7\x10\xdf\x78\xbf\x51\x53\x50\xa2\xf6\x35\x24\x60\x97\xf0\x95\x0f\xb8\xdc\xaf\xc4\x86\x2c\x1c\xb2\x8b\x5a\xdb\xd7\x28\xb7\x0c\xdd\x1a\xd3\xb1\x8a\xa9\x69\x20\xd8\xf7\x53\xa0\x25\x8a\x49\xd6\x9c\x69\xca\x38\x17\x87\x75\x6f\x2d\x46\x26\x69\xeb\x05\x40\x35\xa1\x9a\x52\x8a\xb5\x5f\x72\xe0\x4b\x0d\xe5\xbb\x67\x9d\x92\xfb\xba\xb8\xb1\x28\xc0\xe2\x9f\x82\x67\xf6\xf1\x0f\x1f\x17\xac\xff\xdb\x0f\xf7\x8f\x6f\x5f\x88\xf5\xb3\x12\x47\xd6\x31\xfd\x70\xff\xe1\x7e\xb5\x05\xe1\x8c\x70\xe3\x91\x9e\x0f\x5f\xdb\xa9\x53\x4e\x0d\x7d\xc4\xe7\x91\x0c\x7d\x3f\xfb\x09\x87\x76\x5b\x1f\x9e\x0a\x68\x75\xaf\x19\xeb\xd9\x86\x5e\x74\x52\x69\xc0\x92\x58\x05\x2c\x38\x56\xc5\x25\x26\x98\x0e\x04\x6c\xc1\xa9\x1a\xa6\x5d\x84\x06\x32\x83\xfb\x49\x1c\xb7\xb5\x86\x5d\x87\x18\xa1\xd8\xd7\x0d\x28\xec\xf3\xfe\x5a\xae\x4e\x20\xfe\x89\xfe\x16\x4e\x09\xa8\x24\xb9\xf6\xf7\xa5\xd0\xa2\xf1\x0d\x24\x15\x9f\xe8\xb5\xbf\x81\x5e\x89\x0d\x9e\xd7\xa6\xab\xce\xe1\xdb\xdf\x97\x9b\x6f\x91\x69\xdf\xbf\x79\xe8\xab\x98\x08\xc4\xe0\x30\x0c\x4f\x45\xa0\x65\x3d\x87\x8f\x48\x72\xc5\x04\xa3\x12\x6c\x6d\x1a\x36\x38\x08\xe1\x48\x3a\x0c\x81\xfa\x03\x70\x18\x31\xa1\x39\xa7\x58\x1f\x40\x93\x39\x49\xe8\xda\x6c\xea\x85\x5d\x2d\xb7\xb5\x10\xda\x3e\x83\xc8\x7e\xf7\xe6\xb1\x3c\x96\x3e\xf5\x0d\x04\x82\xa6\x46\x02\xc7\xf7\x0d\x94\x4c\x52\xca\x4d\xc7\xdb\x4d\xed\x83\xbb\xf0\xe4\x3d\xa8\xcb\xa3\xe4\x5c\x5a\xce\x7a\x03\x34\x18\x0b\x50\xa2\x27\xb2\x26\x9b\x66\xf1\x9d\x5f\x3e\xff\x2a\xdf\xa9\xcb\x5d\xea\x1b\x0c\x14\x9c\x0e\x06\xec\xf1\x91\x40\xc5\x25\x13\x10\xcb\x51\x1c\x36\x4d\x08\x7e\xc2\x53\xa7\xca\xa2\x84\x91\x12\xe6\x18\xa1\xd4\x02\x01\xc6\xdc\xe7\x4f\xe2\xae\x5e\xb1\x3f\xda\xe7\x5a\x41\xad\x97\x3e\x5f\xb1\x2f\xa3\xe6\xd0\x23\x84\x2b\x7f\xd9\xdf\xf8\x75\xe1\x4a\xac\x8a\xaf\xfb\x7c\xc1\xfc\x6d\xfe\x09\xf8\xb6\xcf\x1b\x0c\xf6\xbb\xd4\x9e\x73\x97\xbb\xed\x16\x0b\xa1\x99\x60\x5c\x82\xad\x4b\xc3\xaa\x70\x42\x38\x94\x7c\x3a\x28\x7f\x04\x5d\xbd\x65\x42\x69\x29\x39\x33\x47\x40\xae\xf3\xb2\xf4\x7f\xa1\x9f\x9c\xb4\xa8\x43\x83\x70\x69\xa6\xfe\x36\x2f\xc5\x4a\x2c\x71\xf7\x9b\xaf\x66\xe5\x33\xee\xee\xd3\xe7\xab\x8f\xa0\x79\x52\x46\x5a\x16\x6d\x32\x4d\x6d\x14\xa1\x94\xc9\xb3\x4b\xbb\x0d\x75\x8c\xfa\x64\x77\x2e\x02\xd4\x34\x2e\x03\x0f\x4d\x7b\x9c\x9f\x6f\x9e\xd8\x2a\x2c\x63\xf7\xe6\xd5\xd8\xbd\xf2\xc1\xe2\xcd\x43\x58\x15\xa9\x80\x04\xec\xf9\x84\x65\x29\x4d\x0a\x90\x3a\xad\x95\x26\x54\x81\xda\xa4\x90\x47\xef\x22\x93\x77\xa0\x2e\x0f\x5c\x2b\xeb\x9c\x14\xdc\x02\x39\x8f\x5e\xf1\xca\x07\xbf\xbb\xa1\xb2\x16\x17\xf9\x85\x07\x62\xc0\xaf\x0e\xb8\xa3\x82\x65\x41\xc2\xc5\xff\x8e\x17\x94\xac\x07\xb0\xaa\x0f\x5c\x3a\x4e\xbb\xc5\xfb\xe6\x67\x6f\x9f\xe8\x9a\x6d\xea\xcc\xe3\xf3\xda\xff\x5e\x3f\xdc\x94\x63\x72\x0d\x04\x86\x4c\x07\x09\x7a\x7e\xe2\x4a\x28\xc6\xa5\xd9\xc9\x7e\x53\x7b\xa3\x2f\x38\x99\xfc\xf8\x23\x97\x56\xb0\xe1\xf6\xf8\xa2\xac\xea\x27\xba\x8e\x1b\x78\x3d\x2b\x3e\x5c\x13\xff\x8f\xf7\x0b\x9a\xe7\xfe\x63\x4e\xc6\x83\xfb\xc7\xfb\x8a\x96\x52\x29\xe5\x4c\x6b\xa3\x52\x1a\x68\xb3\x81\x6e\x3a\xf8\x8b\xac\xa2\x4c\x45\xea\x25\xc0\xa0\x97\xfe\xc6\xff\x90\xfd\x9a\xdd\x35\xab\xf8\x5b\x77\x3d\x26\x72\x6d\x35\x34\x96\x24\x13\xe3\x2a\x7e\x31\xcb\x55\x71\x75\xb8\xa8\x2b\x16\x97\xad\xe2\x4a\x16\x6f\x8b\xbf\xce\x23\x78\xb3\xed\xa1\x5c\x2f\x17\x61\xb3\x65\x0f\xf7\x6f\xbb\x6a\x18\x4e\xa7\x90\x4e\x38\x9d\xf4\x21\x13\x3c\xec\x4a\x95\xce\x2b\xe9\x53\xf4\x93\x2a\x43\x22\xa3\xe9\x80\xf6\x8b\xce\xd0\x53\x21\x6f\xb8\xd4\x75\xf7\x67\xbd\x7b\x53\x7a\xa5\xb5\xef\x76\xb6\xb7\x56\x80\xd0\xcd\xef\x1e\xfc\xa5\xad\x44\xb3\xbc\x3b\x02\x43\xe3\xe7\x30\x72\xfe\x14\xe5\xfa\x78\xc5\xe6\xfe\xc6\xbb\x1f\x3d\xd3\x8c\x40\xce\xd1\x53\xe1\xfd\xc6\xfc\xe4\x94\x68\x42\x43\xd7\xe1\x4b\xae\x53\x5b\x6f\xc1\xf1\xae\xde\x88\x3f\xb6\xef\xd9\x7c\x01\x8f\x61\xf2\x31\x6e\xc4\x45\x65\xbd\x77\x44\xaa\x62\x82\xcb\x39\xc6\x96\xf5\x2a\x6e\xf0\x72\x36\xff\xb6\xff\x3e\x3f\xf7\xdf\x50\x75\x73\xf7\x3d\x15\x75\x3a\x8a\x7d\xfd\x54\x80\x62\x28\xc5\x53\xb1\xc1\x3e\x1d\x7c\x9a\x37\xd2\xc3\xe0\xfd\xe0\xc1\x52\x15\x7d\x98\x9f\xad\x9f\x68\xd6\x64\xca\x7d\xf7\xfa\xd9\x6f\x6b\xf0\xbe\x78\xee\xbb\x87\xfb\xbe\xda\x0f\xfb\x7d\x4c\x87\x74\x74\xa0\x38\x1e\xfb\xd2\xa4\xc3\x06\x85\x29\x86\x4b\x57\xf1\x7a\xee\x3e\x05\x10\xe8\xeb\x50\xca\x29\xce\x9f\x79\x6c\xb6\x99\x6f\x1f\xfd\xe9\xb1\x29\x55\x79\x32\xde\xfb\xc3\xd1\x8e\x31\x6a\x70\xcc\x0f\x6f\x63\x7e\xf8\x74\x4e\xc3\xf2\xf0\x78\x23\xdf\x28\x4a\xb0\x7b\x62\x77\xc3\x06\x15\xdf\x65\xb6\x91\xfb\xfa\x99\xf0\xaf\xcc\x5b\x35\x58\x84\x42\xbe\x5a\x44\x1f\x5f\x01\xaa\x1f\x37\x63\xd3\xa0\xc6\xd6\x92\x0b\x3d\x15\xe9\xac\xf6\x63\xe9\xd3\xd8\x40\xc0\x77\xe9\xd8\x52\xb0\xd3\x27\xc8\xa9\x20\x94\x50\xd1\xb1\x61\x83\xa6\x3a\x89\xc4\x81\x82\x69\xec\x80\x2e\x6d\x29\xa7\x7e\x12\x29\x5a\x80\xca\x58\x86\xd4\x7a\xa3\xbd\x48\x38\x9d\x99\x6f\x4b\xca\xb8\xd4\x82\x09\x66\xfb\xcc\x57\xc1\x73\x8e\xc0\x17\xff\x2e\x57\xf0\xbe\x7d\xf8\xdd\xbb\x4f\x6f\xde\x95\xd5\x95\x36\x31\x33\x15\xe6\xb5\xb2\xac\x1e\xee\xb3\x99\xcf\x82\x97\x1f\x3f\xfc\xb3\xab\x1e\x95\x49\x43\x0d\x19\xf5\xc2\x6d\x31\xae\x1b\x57\x0b\xa6\xe7\xc5\x20\x4a\xd6\xa4\x5d\xb0\x8a\x4b\xef\x2c\x18\xeb\xb0\x75\x46\x29\xa9\x57\x67\x9f\xe2\x79\x07\x6a\x92\xc4\x53\xd1\x9c\xbc\x87\xe9\xdc\x82\xc2\x69\x1b\x3b\x80\xca\x26\xed\xfc\x60\x9c\xde\x26\x9a\x3a\x01\x24\xf0\xa5\x1a\xf6\x49\x01\xcb\xb5\x36\x99\x77\xdd\x65\x1e\xcd\x50\xfc\xfb\xa2\xf8\x61\x36\xf0\xe3\xfd\xc3\xfb\x0f\xbf\x7f\xf7\x2b\x30\xcc\xcf\x0b\x0c\x73\xc1\xa2\x2e\x17\xde\xa0\xdf\x76\x26\x54\xb0\x0e\xdb\x53\x56\x06\x3a\x4e\x2d\x92\x46\x3a\xed\x14\xe6\xd8\xd2\xce\x75\x6d\x3a\x71\x50\x07\x85\x27\xb9\x8b\xd2\x86\x9d\x57\x66\x04\xd0\x50\x82\x10\x21\xdc\x5b\xcd\x15\xb1\x42\x44\xf2\x54\x04\x4e\x0d\xa5\xae\x13\x8c\x5b\x76\x3b\xe7\xd3\xdc\xaf\x28\xe3\xe7\x6f\xfd\x7a\xe5\x7f\x7c\xfc\x97\x57\x82\xe3\xb9\x57\xb3\xa6\xc2\xc7\xfb\x87\xea\xc3\x77\xef\xae\x1d\x2a\xa7\x16\x0b\xaf\xa2\x1f\x22\x23\xd0\xe3\x48\x77\x6a\x48\x83\x04\x62\xb0\x64\x92\x63\xd0\xa2\xc2\xb0\xdd\xd6\xa0\x09\x46\x1b\xb7\x2e\x42\x72\xc7\x1d\x68\x48\xf2\xe7\xd4\x02\x42\x12\xef\xc7\x5d\xeb\xfa\x03\x80\x60\x9c\x8e\x89\xa7\x56\xee\x00\x3d\x96\x0a\xf8\x7d\x0f\x2c\x93\x36\xe3\x12\x4b\xf1\x44\xef\xfc\x9a\x15\x7f\xc8\x1a\x2a\xf9\x34\xfe\xfb\x77\x0f\x6f\x1f\xfe\x1a\x3c\x53\x75\x15\xd5\xc3\xfd\x22\x54\x7a\xff\xfd\x9b\xd9\x4f\xaf\x92\x43\x1b\x23\xfa\x5d\x0d\xf6\x89\xe2\x11\xd7\xa4\xf6\xc8\x70\x9d\x8e\x34\xc1\x7d\x84\x63\x3a\xb0\x92\x90\x7a\xbb\x3f\x80\xce\x69\x65\xcc\x9a\x79\x0c\x87\x10\xd2\x21\x0d\xde\x91\x43\x04\x06\xb8\x84\xb8\x88\x5a\xf2\x95\x26\x89\xfa\x16\x36\x4f\xc5\x24\xb9\xb4\x9a\x67\x4c\x1d\xbf\x23\x6b\x7b\xe5\x84\xbb\x7b\x05\x5b\x98\x27\x6b\x79\xf7\xfe\x77\x15\x0a\x0d\xac\xba\x09\x67\xc0\x70\x3b\x89\x68\xb5\xb5\xa7\xb5\xc5\x52\x84\x73\x38\x87\xa4\x57\x5d\x3a\x7b\x09\x70\x51\xad\x48\xd6\x7c\xc0\x2f\xb9\xbd\xb7\x0f\xd5\x92\x6b\x7b\x78\x73\xa5\xbd\x58\xde\xec\x06\x19\xad\x9a\x84\x21\xe8\xcd\xee\x12\xcb\x42\xa5\x3d\x91\xde\xd3\x1e\x08\x39\x9f\xbf\x1a\x25\x24\x57\x1b\xec\xd2\xf0\xa5\x77\xae\x1a\x92\x48\x9e\x94\x4d\xe9\xa7\x4e\x5a\xed\xe4\xc1\x78\x15\x74\xe6\x5d\x0f\x77\x7e\x83\x8b\xdf\x5f\x75\x96\x97\xe9\xbf\xa8\x4c\x5c\x1b\xbe\xd2\x6c\xbc\xbd\xd2\x7d\xaf\xd4\xa4\xea\xa6\x14\x2d\x20\x5f\x50\x55\x84\x44\x44\xf0\x07\x91\x06\x70\x9c\x67\x90\x8b\x56\xda\xb0\xc1\x3e\x86\xaf\x9b\x76\xd3\xa0\xbc\x0e\x72\x6f\x83\x6e\xf5\x7c\x96\xca\x77\x9e\xab\x43\xd1\x3c\x57\xb9\xbc\x7d\x7c\x4d\x81\xb2\x1c\x33\xdf\x7d\xf7\xee\x77\x9f\x1f\x36\xeb\x3a\xd4\x4d\x59\x70\xb8\x73\xa3\xee\xbd\x3d\x98\xbe\x97\x0c\x42\x13\x15\x97\x11\xa6\xdd\x76\x75\x80\x52\xb8\x14\xd3\x21\x5a\x6f\xbb\xd6\x3b\xbd\x73\x2d\xc5\x1a\xd4\x62\x0c\xa0\x38\xc3\x02\xe4\x5a\x49\xb2\xda\x17\x7f\x93\x31\x27\x37\x6e\xa8\xd7\x64\x0f\xf7\x5f\xe3\x4e\xaf\x20\x29\x0f\x4c\xcc\xc8\x7e\x29\x04\x84\x90\x40\xb8\x1b\x83\xb4\x2e\xc6\x56\x1e\x87\x71\xde\x61\xdd\x4a\x58\xeb\x5c\x1a\xb8\xa8\xed\x96\x86\xd4\x1b\xed\x8c\x4c\x0a\x84\x51\x19\x0f\x9a\x73\x0a\xe0\x74\xd5\x49\x5c\xea\xfe\x8f\xbf\x6d\xc7\x1c\x7b\xbf\xe2\xe0\xff\x78\x4d\xf1\xba\x0a\xb6\x15\xbe\x8c\xa5\x52\x92\x09\x64\x29\x4e\x04\x64\x2e\x68\x94\x0e\x6d\x1a\x12\x17\xe5\x16\xd0\x44\x62\xa9\x2e\x87\x15\x0f\xc1\x87\x14\xa5\x84\x01\xf2\xb6\x4f\x9d\x8d\xf3\x76\x86\xc0\x3e\xed\xbd\xeb\x00\x6f\x93\x29\x9b\xb0\x9c\xe7\x86\xeb\x7d\xc5\xdf\xbc\xae\x79\xf8\x9a\x90\xf0\xab\xda\x87\xfb\xab\x4d\x15\x06\xfb\x9c\xfb\x00\xad\x94\x98\x42\x89\x50\x3a\xef\x01\xe2\xe9\x14\xe3\x98\x0e\x02\xa8\x43\x3a\x47\xd0\x26\xb4\xee\x87\xc1\xcf\x46\xce\xb1\x2a\x3b\xa7\x90\x82\x8f\x11\x6c\xa7\x5d\xe9\x52\x6c\xfd\x01\x44\x50\xa4\xba\xb4\xc3\xdc\x47\xc5\x39\xdf\xc5\xfd\xcb\xaf\xfa\xe8\xf1\xfe\x99\x05\x7e\x53\xe4\x80\x7c\xb1\xa2\xad\x8a\x58\xd5\x97\x53\xa9\xe7\xa8\x4e\x80\x93\x48\x4d\xda\x47\x9b\x58\x27\xc1\x11\xd0\xc4\xdb\xd2\x4c\xc5\x7a\x6c\x5b\xdf\x26\x0c\x48\xd2\x31\x0e\xc0\xa4\x00\x54\x9f\x02\x0f\x7b\x10\xd2\x0e\x8c\x6d\xd6\x63\x5d\xee\x15\xf6\xf9\xfe\xe2\xc6\x8b\xf8\xa9\xf8\x4f\xcf\x2a\x34\xcb\x4f\xb9\x79\x16\xed\xb9\x5f\x7f\x7c\x7c\xfb\xee\xfa\x59\xbf\x16\x7a\x7e\x85\x6f\xbc\xd3\x57\xad\xd1\xf9\xa3\x6a\x65\xb1\x68\x02\x81\xcd\x84\x80\x39\xce\xff\x81\x81\x34\x12\x22\x41\x1b\xdd\x90\xd4\x19\x42\x35\x03\x08\xd7\x76\x8b\xaa\xbd\x16\x4a\x2a\x91\x74\x57\xdb\x2d\x07\x45\xd9\xef\x84\xd8\x49\x39\x08\xe1\xb9\x6a\x24\xaf\xa5\x82\x5a\x6e\x51\x67\xa9\xb7\x5a\x43\xa3\x97\x1c\xb5\x7b\x62\xd5\x58\x9d\x9e\xf9\xd1\x16\xa4\xf5\xad\x7c\xe4\xf1\xed\x4d\x1b\xec\xca\x45\x70\xff\xf0\xf1\xf1\xe3\xe3\xfc\x3a\xd5\xf5\x4e\x2a\x46\x7b\xb2\x73\x67\xe1\x8c\xb0\x1a\x6c\xd6\xd2\xde\x01\xd2\xc5\xb2\x3e\xb9\xbe\x07\xa4\xab\x22\xe7\x9c\xab\x9e\xa7\x1d\x37\xc7\xa3\xe1\x80\xf0\x5e\x08\x91\xac\x52\x0b\x6f\xed\xaa\x78\x62\x77\xb8\xda\x3d\x67\xe6\xbf\x72\xad\x4d\xbe\xd2\xba\xd1\x5c\xbe\xbd\xc3\x9c\x31\x9b\x2f\xbb\x1d\x74\xa6\x75\xb9\xa4\x47\xa5\x50\xed\x2e\x78\xe1\x8d\x1c\x4f\xad\xe9\x41\x0b\xda\xb4\xeb\x12\x6a\xe9\x82\x39\x7c\x62\x2b\x56\x1d\xbf\x79\xd7\x87\x3f\xf5\xae\x0f\xcf\xef\x6a\xdb\x00\x68\x6c\xdb\x53\xbe\x39\x11\xa9\x0d\x49\x82\x98\x5a\x20\x4e\x6d\x69\xd3\xa0\x86\x01\x88\xbe\xea\x08\x21\xc4\xec\x44\xea\x85\xe9\x7b\x23\x00\x9b\x87\x42\x26\x95\xdf\xb6\xcc\xb5\x4b\xdd\xfa\x5c\xac\x5f\x38\xc9\xdf\x7c\xb8\xff\x17\xe0\x5f\x81\xbb\x87\x7f\xf9\xe3\xfb\xbb\x1f\xdf\x7f\xbe\x7f\xac\xce\x99\x16\x13\x9f\xf1\x00\x1a\xb0\xa5\xa9\xdf\xf5\xd4\x23\x1c\xf4\xfa\xec\x02\x8f\x6e\x3a\x5e\x0e\x8c\x78\x2e\xf7\x8c\xc4\xb2\xbd\xf2\xc3\xf8\x3c\x27\x7e\x5c\x70\xac\x2f\xd9\xe0\x87\x5f\xe1\x0e\xfd\xf4\xf9\x11\x7c\x7c\x78\x3b\x7f\xaa\x0e\x6c\x31\x0a\x0d\x2a\xd1\xe4\x11\x2e\xad\xd6\x4c\x40\x43\x59\x6a\x02\xa6\xba\xb5\x43\x79\x4e\x0d\x38\xa6\x66\x6d\x8d\x85\x5a\x05\xc9\xbf\x8c\x0b\x73\xe8\x90\xc4\xaa\x61\x44\x75\xa7\xe9\xbc\xdb\xa5\x38\x8e\x45\x51\x15\xf4\x89\xad\xdc\x35\x57\xf6\xaf\xe6\x39\x7a\xb3\xe5\xd7\x4d\x79\xf3\x6c\x8a\x07\x0d\x82\xb1\x81\x25\x9e\x02\x2b\x99\x54\x79\x25\x23\x89\x05\x4a\x4d\x67\x0f\xe5\x39\x13\xd4\xb0\x9b\x21\xdd\x2b\x3b\xaa\x51\x71\x7d\x04\xf8\xd9\x90\x5c\xab\xb5\xea\xd7\xe7\xbc\x17\xbf\xad\xbe\x7b\xfb\x2a\x66\xf8\x0f\xef\xdf\xcc\x0b\xf8\xaa\xef\x5a\x29\x11\x6e\x28\x6e\x60\xdb\xed\xdd\xfa\x6c\xa7\xd3\xfe\x10\x42\xed\x1b\xc1\xf7\x43\x89\x7f\x1a\x37\xdd\x95\x1b\xc8\x6f\xd4\x73\xff\x7e\xf8\xb3\xfb\x77\xb5\xdf\x23\x34\x87\xa3\x34\x39\x42\x41\xaf\x24\x22\x48\x20\x9a\x4e\x1e\x61\x15\x74\x00\xa7\x74\x02\x75\x3a\xad\x8d\xb6\x50\x29\x67\xd5\xa5\x58\x5e\x6b\x4c\x6c\x55\x13\xac\xba\xe3\x34\x0e\x43\xea\x77\xbb\x67\x6e\x18\xb9\x1a\x6f\xb6\xbc\xf9\x13\x63\xfd\xfd\xe7\xe7\xcb\xea\x00\xc6\x79\xa8\xe1\x8a\x7e\xd1\x88\xac\xa4\x52\xda\xa3\x41\x92\x8b\x8a\x2e\x18\x50\xc7\xe4\xca\xa2\x0a\x17\x35\x7f\x56\x90\x4b\xc8\x98\xe7\x74\xda\x4a\xd9\x84\x86\xb3\x34\x56\x30\x68\x3d\x9e\x92\xb2\xc9\xda\xac\xe3\xb7\xf8\xdd\x75\xac\xc1\x9f\x1e\xeb\x17\x16\x45\x84\x61\x68\x60\xc9\x27\x23\x4a\x2b\x25\x91\x50\x12\x9a\x9a\x48\x98\xde\x99\x13\xa0\xb3\xcf\xbd\xf6\xbb\xe1\x52\x28\x5d\x87\x5a\x87\x24\xaa\x41\x70\x7d\x06\x70\x3a\x0e\xd3\xe9\x5a\xbf\xd1\x82\x43\x79\xda\x90\xdf\x18\xef\xd9\x84\xf2\x14\xbc\xd6\x84\x43\x45\x11\x6c\x63\x3a\x87\x0d\x71\xe9\xe8\x9d\xb3\x8d\x6f\x08\xb5\x06\x90\x0b\x5e\x2d\x5c\x70\xe5\x1e\x1c\x33\x1f\xd4\x6d\xcc\x7f\xbd\x93\x9f\x0b\xe7\x3e\xbe\x50\x1f\xae\xa2\x6f\xea\xd2\x4e\x04\xe2\xb2\x13\x92\x6b\xe8\x19\x9a\xf6\x81\x71\x71\xe2\x27\x40\xd0\x3c\xd9\xf6\x0b\xe2\x0c\x62\xec\x28\x9d\xbc\xe0\x8d\xad\x29\x3c\x94\x8c\x13\x35\x06\x47\xa7\xbd\x4a\xfd\x7c\x16\x83\xf9\xde\xc1\x66\x06\xb4\xbf\xfd\x6a\x0f\x7e\x78\x85\xf7\xbd\x2a\x8f\x7c\x5e\xf4\x02\x1f\x3e\xfd\x3d\xf8\x57\xe0\x9f\x83\x87\xfb\xd2\x95\x38\x96\x74\x1a\xc0\x79\x3a\x43\x01\x0a\xb0\xe3\x89\xa7\x7d\x97\x3a\x0e\x60\x88\x4a\xea\x48\x61\x6a\xca\x62\x1a\x47\x20\xb6\x29\x96\x05\x10\xeb\x5d\xdf\x87\x7e\xea\xf6\xce\xb1\x96\xb7\x3d\x8d\xc4\x69\xa3\x8c\x52\xb1\xe4\xfd\xe4\x09\x6d\x5b\x03\x60\xbe\x0b\x3e\x3d\xb1\x3b\xb5\x61\x19\x23\xf1\x2f\xbe\xd6\xe5\xbe\x69\xb4\xcf\xe1\x62\x35\x9f\x7e\xef\x1f\xef\xd4\xb3\xd6\x2d\x6e\x63\xdb\xd6\x5a\x6a\xc7\xb5\xde\xb5\x1b\xf6\x53\x61\xcc\x5d\xf1\x73\xbd\x16\x29\x5f\x7d\x86\x78\xdc\x3b\x20\x9e\x0a\xab\x41\x0d\x7c\xb1\x2a\x9b\x27\x9a\xef\x01\xfe\x61\xf1\xbb\xab\x12\xcf\x77\xef\xee\x3f\xdc\x3f\xde\xdf\x95\x15\xf8\x90\x83\xd5\xfb\x57\x5f\x3d\xbc\x9b\x1b\xdd\x70\x02\x43\xd0\x90\x4d\x21\x3c\x15\xee\x04\x28\x85\x21\x18\xc8\x92\xf3\x4c\x38\xb5\x6a\x77\x63\xa5\xce\xbb\x6a\x9e\xa5\xa0\x06\xfb\x8b\x98\x8e\x29\x2a\x40\xc1\x08\xce\xc7\x63\x25\x7e\x62\xe5\x11\xcd\x7f\xc3\xc9\x9f\x58\xe6\xf0\x07\x85\xce\xf5\x33\x36\x57\xb9\xcc\xe3\xf1\xfd\xe7\x77\xab\x2b\xf9\xed\x55\x6b\xe4\xe3\xfd\xab\x2c\xde\xef\x5f\x58\x67\x3e\x3f\x02\xb5\xc6\x49\x03\xb4\x97\x4f\x45\x8a\xd4\xee\xd9\x36\xd4\x26\xed\x0e\x26\x49\x4c\x40\xe8\x27\x45\x4a\x1a\x93\xdd\x52\xec\x11\xe6\x8c\xf7\xa3\x2f\xad\xdb\x53\x6d\x0c\xd7\xb0\xc1\x16\x77\x82\xf2\x72\x4b\xb0\x4e\xc1\x7a\x0e\xb6\x5b\xc6\x29\xa3\xb8\xb1\xbc\xcd\xf6\xd9\x72\x7b\x67\x2a\x5e\xdc\xbd\x8c\xc9\x9d\x89\x3f\xb3\x58\xf1\x79\x2d\x01\x2c\xeb\x49\xb4\x77\xc5\xba\xfe\x4b\xf4\x24\xea\x2b\x67\xa9\xc9\x67\x08\xe0\xef\xf4\xda\x5c\x31\x37\x39\xaf\x72\xab\x1b\x78\x77\xbd\x71\xbb\xb5\x1d\x2a\xd4\xc0\x80\xea\xaa\xf9\x09\x0d\x6b\xf6\x73\xdf\x56\xe7\xcb\x76\xad\xe3\xcf\x22\xae\xce\x18\x43\x4a\x0d\x4d\xa3\xe6\xe9\x9c\x76\xbb\x01\xe0\x25\x67\x39\xf7\x71\xbd\xf0\x24\x2d\x7d\xbc\xf9\xcd\x3e\xfe\xfc\xea\xfe\xe2\xf3\x23\xb0\xeb\x22\x39\x50\xef\xe4\x29\xf5\xd4\xde\xf4\x70\xe6\x1e\x46\x24\x53\x5a\x90\x92\xc4\x14\x6a\x82\x3d\xc4\x9c\xf2\x7d\xef\xcb\x5a\x0d\x44\x18\x49\x19\x6c\x90\x22\x8e\x53\x06\x06\x8c\x75\xda\x29\x4f\xc7\x2d\x21\x94\x60\x0c\x1d\x0f\x4b\x5e\xbf\xbd\x73\xab\xc3\x3c\x27\xdf\x7c\x33\xfe\x1f\x7f\xc5\xb6\x17\xd3\x1e\xcc\x5d\x3d\x59\x80\x46\xb5\x0c\xfe\x91\xe6\xb1\xdf\xdb\xc4\x30\x06\x6d\xb6\x8c\xc6\xa4\xd9\x75\xe8\xbb\x3e\xc5\xd5\xc1\xed\x88\xb2\x9a\xf1\xa6\xc1\x0a\x47\x4e\x39\xd8\xe7\xb1\xd7\x9e\x9f\x19\x9b\x47\x1e\x3a\x16\x8b\x7f\x90\x31\xda\x68\x43\x73\x4d\xc0\xbf\xc8\x6a\x0e\xcf\xbc\xf9\xcf\x7a\xaf\x3f\xbc\x5b\xad\xdf\xff\x70\x13\x87\xbf\x7f\x5c\xc2\xc7\x1f\xee\x3f\xdc\xdf\xe5\x73\xe9\x72\x34\x79\x7c\x39\xaf\xfe\x3b\x70\x95\x53\xa2\x73\xb0\x9e\x76\x80\x35\xc9\x26\xd8\x00\x97\x89\xe3\x5a\x37\x8e\x16\xd5\xba\x86\x80\x8d\x56\x23\x24\x11\x28\x32\x15\x07\x23\x8d\x9b\x2d\xae\xfd\x16\x0d\x0e\x53\xc7\x36\x74\xa2\xce\x05\x6c\x19\x72\xa8\x75\xce\x81\x5e\x38\x0f\xa3\xd5\xf3\xf6\xce\x60\x67\x88\xbb\x30\x1f\x49\xeb\x42\x87\xfb\xb0\x8d\x2d\xea\x43\x83\x77\x9e\xe5\x3a\xa2\x79\x2f\x0e\xe5\xf1\x86\xf8\x7d\xf3\x8d\x42\x28\x78\xc5\xd7\xab\x2a\xda\x55\xf4\x32\x94\xbb\x9f\x62\x79\xbc\x0c\x1b\xdd\x7e\x71\x6d\xbb\x32\x5f\x5c\xe9\x85\xd0\x52\x6b\x99\xc6\x24\x38\x07\xed\x41\x17\xd5\x1a\xe7\xbb\x2b\xf3\x8c\x26\xbe\xae\x5f\xd7\x4b\xfc\x47\xb0\x88\xff\x66\x7e\x85\x35\x3e\xfa\xd3\x69\x3f\x8d\xbb\x63\x89\xdd\xde\xb9\xfd\x7e\xcd\x01\x4a\x7b\x97\xf6\xce\x01\x34\xf9\xcb\x49\xa9\xaa\x9e\x0e\x20\x66\x2c\xef\xee\xc9\xae\xd9\xc6\xe6\x6a\xca\xf7\x19\x1f\x9a\x0b\x6a\xbf\x29\x9a\x7d\x93\xbf\xfc\xf4\xe6\x55\x8d\xcf\x55\x14\xc7\xf8\xd8\x69\x8d\x35\xc5\x1a\x0e\x7b\x64\x95\xd4\xd0\x4b\x2f\x1c\xa7\x38\x92\xda\xd6\x24\x05\x5b\x63\x8b\x01\x81\x5b\xbb\x85\x6b\x84\x12\xed\xb7\xd0\xe3\x6e\xc4\x06\x37\xce\x8e\xb0\xf1\x47\x60\x50\x8a\xbb\x6d\xad\x2e\xa7\xfd\x01\x9e\x76\x4d\x9d\x0e\x47\xbc\x07\xc5\x7e\x8f\x4e\xbb\xa2\x2a\x77\xdf\xf4\xc1\x2b\x3c\xd1\xbc\xbd\xbd\x5e\xdf\xcb\x5d\xd9\xc4\xb2\x99\x8e\x60\xf8\xb2\x07\xbb\xe9\xb8\x12\x71\x32\x31\x96\x6e\x32\x6b\x95\x97\xf0\x74\x0a\x01\xd4\x93\x7f\x5d\xe3\xb1\xca\xb8\xf7\xd3\xc6\x64\x74\xd6\x92\x6f\xba\x4a\xf8\xbe\x68\x6b\x7f\x7e\xd1\xf7\xbd\xb2\xc9\xbf\x2a\x43\x2a\xa9\xeb\x76\xd6\x34\xb5\x25\x8d\xdd\xd6\xbb\x23\xb2\x46\xdb\x26\xaa\x20\x63\xcb\x2c\x85\xb6\x21\xc9\xdb\x9a\x58\x02\x08\x6e\x7c\x0d\xd7\x1a\x27\x92\xce\x88\x30\x86\xfa\x03\x62\x54\x12\xd3\x1e\x9a\xda\x1e\x81\xc5\xa9\xdd\x37\xe1\x32\x86\x01\x0d\x71\x0b\xd3\xf1\xc4\x4e\xa7\xee\x80\x0e\x5d\x51\x6c\x56\xe3\x13\xb9\xeb\x37\x2f\x58\x9e\x3f\x2c\xd5\xff\xf3\x51\xe0\xc3\xfd\xc3\xfd\x87\x4f\x9f\xbf\x16\xc4\x7d\x5d\xb8\x76\x2a\x63\x3a\x6f\xeb\xe3\x34\xb6\xdb\xfa\x3c\x3c\x07\x79\x30\x1d\xb6\x46\x39\xe9\x80\xb7\xdc\x31\xbb\x41\x4e\xf0\x2f\x61\xa5\xb8\x48\x75\x96\xc4\x3d\x0d\x29\xf2\x20\x8c\xd0\xda\x70\x33\x9f\x03\xf6\x4f\xe3\x7a\xfb\xb5\x6f\xbe\x78\xe6\xc7\x0f\xaf\x7d\xb3\x6a\xc3\x6e\x37\x4c\xe7\x6e\x1c\x01\x71\xbd\xf7\x7d\xbf\x31\xe9\xec\xd3\xd9\x7b\xb0\xf5\x13\x9c\x98\x90\xe5\x90\xae\x1a\xb1\x65\x41\x9f\x5c\x45\xd6\xe7\x1c\x83\xe5\xd5\xac\xbc\xbb\x0a\x5d\x2f\x52\xae\x19\xb5\x62\xcb\x3e\x1d\x18\x07\x31\xec\x02\x23\x6a\x30\x67\x40\x77\xbb\xf5\x39\xa4\xe3\x70\x51\x6a\xac\x88\x63\x16\xd4\xe0\xf0\xc5\x97\xc5\x12\xdb\x35\x7f\xbe\x2f\xad\x1a\xa0\x23\xd0\xc9\x03\x76\x19\x80\x48\xbe\xa2\x31\xd1\x98\x75\x02\xfe\x88\x2f\xe5\xf5\xa0\x3a\xbe\xb4\xf1\xe6\x8f\xb4\xa1\xfe\x9b\x9a\xc8\x78\x37\x7a\x27\xca\xe6\xb6\x4b\x82\x57\x20\xff\x79\xcc\xef\x84\x9f\x3a\xef\xb3\xb0\xc5\xfc\x69\x26\x24\x78\x39\xa6\xf3\x82\xfa\x04\x95\x28\x45\xc6\x06\xfd\xfb\x57\xe7\xb7\x0f\x37\xc5\xeb\xcd\xdd\xb2\xaf\xbd\x70\x1f\x3e\xc0\xab\x8e\xda\xc2\x21\x71\x00\xdb\x00\xb6\xe9\x2c\xc6\x96\x6b\x7b\x48\x46\xee\x41\x33\xb2\x63\xea\x59\x38\xb2\xda\x43\x46\xd2\xf8\x54\x68\x4f\x0e\x5d\xe2\xc0\xa7\xf3\xfa\xe8\xbd\xf1\xbe\x15\x56\x1a\xaa\x21\xd6\x46\x51\xd8\x50\x8d\x06\x84\x28\xf7\xd4\x72\x69\x7c\x51\x01\xfe\xc4\x36\x7d\x71\xba\xbd\xd7\x0f\xaf\xd6\xce\xb9\xf7\x36\xbd\xfb\x12\xad\x5d\xc9\x2f\x71\xfe\x9c\x92\x40\x08\xb4\x81\xec\x68\xd6\xd0\x91\x77\x7e\x75\xcc\x7c\xa4\xcf\xef\xf4\xfd\x2d\x16\x59\xbf\xfd\xfe\x87\x65\x3f\x7c\x80\x9f\x9f\xdf\xea\xe3\xfd\xfa\xfd\xa7\xcf\x1f\xdf\xfd\xb0\x2c\xd5\x08\x9c\xda\xf9\x88\x7f\x04\xf8\xac\xda\x1e\xf4\x13\x1f\x92\x2d\x0b\xd0\x8b\x84\xa6\x9d\x07\x12\xb4\x88\xd4\x6d\xa3\x78\xaa\x13\xd9\xa5\xc0\x0e\xa3\x00\xe8\x72\x2a\xdb\x54\xaf\x48\xd7\xb9\xae\x1d\xb5\x37\x41\x07\xa5\xbc\x8d\x1a\x41\x08\x91\x47\x07\x82\x05\x03\xd0\x06\xc6\x48\x63\x43\x97\x73\x6b\x55\x71\x37\xc7\xa5\xff\xee\xf5\x19\xfa\x66\xef\x6a\x9d\xcd\xfd\xee\x01\x2e\x07\x0b\xb8\x08\xc5\x7d\x7f\x35\x94\x82\x31\x80\x7d\x42\xa0\x06\xf4\x24\x62\x0b\xfc\xc4\x9e\x8a\xa7\x02\x8c\xc0\xf1\xc4\xa6\x73\x0d\x22\x30\xba\x71\x28\x24\x92\x74\xd7\x8d\x0c\x04\xc0\x27\x54\xc6\x84\x37\x8d\x94\x4e\x5a\x2f\x25\x77\x92\x61\xa6\x18\x46\x58\x20\xc7\x08\xe3\x18\x29\xa9\x9c\x2c\x8a\x72\x45\x33\xbf\x0f\x2e\xfe\x59\xf1\xb9\x28\xc0\xc7\x85\xc5\xe2\x6b\x42\xd2\x8f\x8b\xac\xdd\xfd\x6f\xff\x6d\x33\x72\x2c\x0d\x45\x23\x90\x8c\x11\x05\x35\x42\x84\x4a\x93\xf6\x82\x08\x43\xf1\x01\x68\xc6\x30\x87\x02\x22\x2e\x64\x28\xf5\x19\xb7\x81\x49\x05\x5a\xff\xd3\x5e\x88\x26\x34\x18\x30\x46\xa5\xeb\x41\x41\x82\xff\xe6\x2f\x4a\x73\x15\x72\x3e\x85\x3c\x89\x55\x97\xe7\xdc\xdf\x17\xff\x63\x66\x21\x79\xd9\x83\xf3\x9e\x09\xde\x3e\x5e\xf5\xa3\xae\xd5\x0e\x37\xac\x72\xbe\x3f\x78\xc6\x29\x5f\x85\xf5\xd7\x19\x53\xfe\xf9\x5d\xb9\x40\x3f\x96\xa2\xe3\x52\x2c\x57\x6c\xf6\xd2\xb4\x21\x94\xdb\xe3\xb6\x26\xc8\x72\x85\x60\x5d\x6f\x5d\x13\x24\x53\x9e\x46\x8d\xeb\x44\x9d\x36\x25\xdd\x3a\xda\x34\x0c\xa3\x09\x03\xe7\x60\x63\x7c\x3a\x30\xcf\x03\xe4\x5b\x24\xd0\xc6\x68\x67\x9c\x03\x4d\x3a\xa6\xa3\x4d\xa7\x68\x23\x4a\xc7\x61\xe0\x02\xa6\xf1\x10\x94\x71\x2d\x28\x80\x4e\x2e\xf1\xa3\xee\x41\x0f\x3a\x82\x15\x82\x84\xb0\xbd\x49\x67\x26\x51\x82\x83\x52\x16\xec\x59\x3d\xb6\x30\xe6\x3b\xbf\x92\x66\x7f\xfa\xdb\xe2\xc3\xb3\x47\x7d\x7a\x76\xa7\xc5\xfd\xaf\xf4\xe9\xbf\x70\xa8\xf5\xa7\xcf\x0f\x6f\x81\x04\x5d\x0b\xba\x21\xca\x76\x00\xbb\x89\xa5\x63\x76\x28\x3f\xc7\x67\xc5\x7e\x0f\xb4\x6e\x3c\xf2\x09\x27\xdd\xc7\x81\x83\x08\xf8\xd4\x94\x21\xf1\x0a\x19\x99\xc4\xa6\x30\xc6\x19\x6b\x9c\x71\x5e\xd6\x4c\x69\xc5\x60\x83\x35\x8e\x82\x0a\x4d\x88\xb3\xde\x59\x4b\x69\xd6\x0a\x2a\xba\x39\x86\x2c\x77\xaf\x79\x4f\x7f\xff\x95\xaf\xdf\x28\x4f\x17\xa0\xf4\x6a\xfd\x76\x13\xb7\x53\x53\xb9\xed\x45\xcb\x39\xf6\xa2\xb5\x6b\x74\x82\xc9\xba\x29\xd4\xa5\x99\x8e\x75\x89\x9e\x8a\x74\xc6\xe5\xa9\x34\x24\x75\xc9\x82\x83\x21\x82\x1a\x46\x51\xd3\x30\xae\x30\x15\x0a\x1b\x2c\x90\x41\xaa\xa9\x0d\xe2\x1a\x43\x79\xd5\x18\xda\xfd\xf6\x3c\xdc\xfc\x99\xf3\x70\x0b\xd8\x49\xb4\x3d\x68\x27\x76\x4e\x07\x70\x98\x7b\xed\x3a\x0d\xb5\x69\x1c\x6c\x13\x4d\xaa\x9d\xa7\x61\x04\x72\xaa\xf3\x34\xdc\x6a\xed\xb4\x8b\x52\x0b\xa7\x04\xe1\x8a\x13\x84\x25\x72\x9c\x11\x41\xb0\x56\xc6\xe5\xbb\xe6\x8a\xe7\x1a\x1e\x53\xe0\x7c\xbf\xb8\x9c\x00\x5f\x52\x2c\x5f\x87\x79\x37\x5e\xfc\xcd\xdd\xf3\x15\xf2\xa7\xcf\x8f\xf7\xd5\x79\x1f\xf7\x9c\x79\x1b\x01\x4d\x2c\x88\xff\x87\xb4\xbf\x07\x92\x5c\x67\xf7\xc3\x70\x82\xec\x0f\xbe\xf7\xea\x7f\xc5\x39\x7b\xf6\x2c\xaf\xf4\xbf\x12\x46\x73\xf6\x2c\xaf\x25\x4b\xf4\x1d\xcd\x2e\xab\xf4\x71\xa1\x92\x54\x82\xcb\x96\x0d\x95\xec\x32\xca\x52\x95\xa1\xc4\x46\x60\x57\xa1\xca\x09\x42\x84\x08\x11\x22\x44\xc8\x90\x21\xc3\x0e\x3b\x64\xc8\x90\x61\x87\x1d\xf2\xdd\x69\xa2\x5d\x04\xbb\x67\x7b\x76\xf7\x9c\x57\x7a\xb5\x7b\x38\xdd\xd3\xbd\x87\x7c\xf0\xfd\xe0\xc1\xef\xf9\xfd\x40\x39\x22\x3f\xf8\x16\xcb\x06\x67\x2e\xc7\xa5\x3f\x1c\x05\xa6\x74\xe8\xbc\x02\xa4\x07\x9a\xb3\x7e\x2d\xe6\x29\xde\x48\x45\x86\xce\xd6\xd4\x12\xad\x1d\xe9\x0a\x88\x77\xe5\x11\x57\x98\x83\x1a\x57\xda\x1d\x6c\xc8\x84\x53\xe7\xab\x0e\x3a\x0d\xf9\x8a\x8f\xb7\xbe\xea\x85\xe4\x2a\x18\xfb\xfe\x76\x4f\x1a\x3f\xc0\xc5\xd6\x9f\x17\xb8\x40\xd2\x0c\x6e\x18\x8a\xae\x36\xba\x01\xdc\x43\xa9\x01\x06\x29\xf1\x3b\xef\xb0\xde\x91\xac\xce\xb1\x18\xcf\x91\x10\x8a\x82\x6c\xf4\x12\xe0\x61\x2d\xe6\xe7\xdb\x73\x74\x04\x19\xe9\x7b\xab\x95\x26\xca\x5a\xb2\x2f\x20\x69\xcb\xbd\x2a\x66\x43\x39\x35\x0d\xc8\xec\xa2\x75\x1d\xcb\x8b\x8d\x9f\x6e\xd6\xff\xef\xda\x08\x6f\x96\x89\x50\xa1\x4f\x8f\x4b\xa5\xde\x27\x29\xc8\xdd\xbc\x3e\x93\xae\xd6\xba\x06\xcd\xd4\xe9\x06\x68\x80\xb1\x37\x9e\x52\x07\x22\x96\xd5\x39\x45\xde\xfa\x83\xa2\x8c\x6a\xad\x10\xf2\x29\x30\xfe\xf0\xb5\xc1\xce\x32\xa2\x5f\x0c\x1e\xd1\x5c\xb3\x12\x63\x43\x85\xac\xf0\x62\x72\x14\x47\xfc\x4c\xb6\x72\xb5\x8f\xf2\xa8\x78\x1d\x61\xbb\xc6\xf7\x82\x69\x5f\xbb\x33\x26\x96\xa8\x70\xb0\x48\xea\xe7\xd1\xba\x9a\x52\x61\xb5\xa4\x78\x3a\xc6\x18\x74\x61\xa1\x8b\x8b\xe7\x28\x2e\x7d\xb9\xca\x29\x2d\x30\xb2\x07\x33\xe1\xb8\x40\x95\xe4\x42\x10\xe1\x9b\x60\xeb\x92\x8f\x1b\x30\x19\xe4\x12\x5f\xfb\x31\x60\x2f\xbf\xb1\x23\x7a\xf3\x8d\x0d\xf1\x01\x20\x18\x0e\xc5\xf6\x53\x86\x98\xc3\x54\x80\x42\xf9\x23\x68\x40\x1a\xaa\x10\x90\x53\x0b\xa8\x1f\x5f\xc2\x6a\xcd\x73\x97\x60\x46\x05\xa8\x00\xf7\xd9\xec\x1e\x99\x69\x67\x4c\x8c\xa2\x38\xe8\xbd\xb8\x90\x5b\xf0\x8f\xbe\x44\xc0\x92\xbb\x87\xbb\xed\xc2\xb8\xff\xf1\xcd\xfd\xd3\x95\xdc\xfe\x1b\xdd\xec\x55\xeb\xb2\x3c\x16\x13\x87\xcc\x50\xde\x91\xfd\x11\x16\xa0\x64\xc4\xd3\x98\xb1\xd0\xdb\x39\x27\x24\x47\x94\xfa\x6e\x23\x21\xa3\x96\x9d\xa3\x67\x97\x40\x2d\x80\x00\xd8\x8a\x13\x6c\x38\x37\xce\x28\x66\x3d\xc6\x04\x5a\x08\xc1\xa2\x55\x58\xfe\x9a\x5d\x4b\xa5\x3c\xdd\xff\xa6\x5d\xd8\xe5\x30\x3e\x9e\x06\x28\x2d\x65\x1c\x64\xc6\xf7\x80\x55\x40\x48\xea\xa3\x78\x27\x14\xc0\xbe\x95\x82\xb3\x9c\x70\xe1\xcd\x62\x1a\xf5\x87\xe7\x26\xc1\x5a\x48\xc0\x80\xb5\x27\xf3\x7d\xd3\xa2\x38\xec\x9f\x6e\x6c\xbb\x6d\xaf\xb9\xce\xee\x7f\xbb\xce\xac\x2b\x63\x3b\xa1\x0a\x5b\x4c\xf8\x51\x8e\xa0\x80\x05\xa8\x04\xf1\x28\x96\x4c\xce\xeb\x17\x17\x84\xe6\x88\x32\xbf\xdf\x48\xd8\xda\xa6\x7e\xb6\x49\xa5\xb8\x04\x02\xe8\xdf\xaa\x33\x72\xb1\xeb\x87\x17\x7e\xbc\xdb\x7e\xf4\x07\xaa\x8c\xb9\x2a\xee\x4f\x23\x22\xa1\xc6\xa0\xf4\x47\x80\x11\x60\x82\xfa\x3c\xae\xb9\x06\xc8\xef\x84\x60\xf3\x3a\xc4\xbd\x0b\x76\xb5\xee\xd9\x26\x44\x4b\x09\x34\x10\xbf\x5e\x5f\x49\x12\x34\x3d\x03\x46\xff\xca\xc1\xf1\x6a\x3f\xff\x5d\x86\xa4\x85\x04\x3d\x39\x02\xe6\xc2\x09\x90\x3b\xa5\xa0\xf5\x8e\xc4\xb5\x6d\x5b\xa2\x19\x85\x82\xa3\x89\x82\x94\x63\x83\xd9\xda\x1c\x8f\xe6\x68\xed\x71\x32\x4d\x63\x3d\x14\x2c\xaf\x21\x01\x3b\xa2\x2c\x76\x6a\xde\xa7\x98\xef\xd8\x70\xe1\x1b\xfa\x55\x1b\x2e\x47\xee\x1d\x88\xec\x38\x82\x62\x8a\x00\x3a\x47\x15\x38\x5a\x29\xb1\xc0\x38\x9f\x5d\x8b\x6c\x47\x4b\x5d\x91\xc5\x00\x63\x8e\x93\x6e\x5b\xe3\xa1\xa4\x57\x03\x1c\x72\x6a\xde\xdb\x45\x70\xc5\xd7\xc3\xed\xfe\x62\xde\x7b\x81\xbb\x87\xbb\xb7\x77\x8f\x77\x2b\x6e\x84\x01\x91\x10\xeb\xe1\xb3\x94\xcd\x7a\x37\xb5\xf3\x9e\x45\x79\x14\x04\x83\x93\xc0\xd1\xf0\x5f\x5a\x87\x8b\xfd\xc9\x0e\x48\x17\xd4\x77\xda\xe7\x1e\x74\x5e\x93\x78\xef\x76\x3b\xaa\x05\x85\x42\xa2\xa9\x3a\x72\x6c\x11\xff\x43\x55\x18\x25\x61\xae\xf8\x23\xdb\xd1\x02\xbd\x1c\xa3\x77\xcf\xf3\x34\x29\x69\x7c\x70\x5d\x47\xb5\x60\x50\x4a\x34\xe5\xa0\x20\xc8\x5e\xab\xf1\x37\xda\xf1\xc2\x8b\xfd\x47\xd9\x80\x41\x13\x48\x09\xc0\xf8\x4c\xe2\xdc\x13\x9a\x14\x6e\x18\xb8\x11\x22\x57\x92\x9e\x7a\x50\x32\x64\xab\x6f\xfa\xd2\x97\xa6\xbc\xd8\x00\xfa\x33\xda\xf2\x75\x16\xfd\xcd\x0b\x3e\xe5\x7b\x36\xbc\x1a\x5f\x1f\x5f\x8c\x88\x49\x9c\x86\x4c\xfb\x98\x7f\x96\xb1\x9a\x46\x91\x74\x2e\x8c\xf9\xda\x48\x68\x6c\x55\x9d\x4a\x80\x43\x83\xac\x78\x5d\x9b\xda\xda\xda\xe7\x5a\x1b\xdf\x08\x06\x1d\x2c\x0a\x50\x16\xd2\x20\x23\x42\x8c\x05\x25\x7a\x23\xa2\x37\x97\x08\xe0\x2b\x2e\x92\x4b\xac\xe5\x23\xf8\xc6\x9a\x17\x63\x96\xe0\x53\xdc\x73\xc6\x94\x90\x5c\xaa\x96\x5a\xa5\xad\x34\x4a\xfa\x0c\x94\x66\xb6\x0b\x13\x8c\x72\x84\xa1\xef\x62\xc6\x2a\x59\x11\xcf\x55\xc5\x14\xdd\x08\x61\xb8\x14\x72\xfe\x1f\x35\xe3\x92\x53\xce\xe5\x04\x8f\x47\x3d\x29\x41\xa0\x81\x24\x66\xca\xd6\xb8\xb6\xa8\x38\x47\x1d\xde\x85\x3e\x3c\xfb\xd3\xd9\x4b\xf6\xcc\xe5\xb0\xe5\x92\xe2\xb2\x2c\xb7\xe1\x6f\xc2\x57\xd0\x17\x39\x04\x3b\x37\x75\x0e\xa4\x30\xf7\x0c\x44\x81\x68\xa4\x9c\xba\x4d\x66\xb5\xfc\xbc\x6f\xea\x75\x29\xf5\x94\x02\x76\xaa\xe7\x4d\x7c\x0c\xc4\xbc\xbf\x5a\x57\xb7\xfa\x3a\xe0\xfe\xe3\xdd\x63\x16\xc4\x0e\xa2\xf5\x36\x4a\x96\x48\xfd\xba\x53\xc4\x60\x79\xda\x81\x31\x75\x69\x2c\xa7\x86\x81\x02\xa4\xd6\x33\xc7\xa7\x96\xc7\x12\xfa\x74\x5d\x49\x4d\xb4\xf4\x2d\x05\xa5\x3f\x4a\xeb\x3b\x6f\x8d\x01\x11\xe8\x7c\x7e\xd0\xc7\x18\x2d\xdc\x29\x51\xe0\xdf\x13\x51\xf6\xc2\x30\xf4\xf8\xe9\xf1\xc7\xed\x0b\x2d\xf6\x9b\x87\xf5\x63\x76\x21\xec\x58\x7f\xf8\xf9\x87\x0b\xd5\x4e\xf8\x99\x58\x99\xda\x34\x1e\x26\x98\x1b\xa5\xa4\xca\x65\x5c\x1a\x28\x46\xde\x53\xe2\x5b\x01\xa2\x3d\xc8\x6d\x85\x0c\xf6\x95\xce\xb9\xe6\x6b\x75\x54\xc2\xfa\xd4\x67\x3b\xee\x40\x07\x3a\xe6\x9b\xc1\x93\x9d\xeb\xc0\xec\x6f\x2a\x07\x06\xa0\x0a\x3f\xb6\x65\xdf\x42\x3f\x1e\x70\xd0\x16\x59\x81\xfa\xbc\x70\x43\xdf\xd8\xf8\x8f\x3f\x3d\x7e\x63\xe3\x85\x55\xe1\xb5\x8d\xb1\x1a\x52\x97\x26\xf2\xa4\x8a\xae\x57\xfb\x5d\xd1\xc7\xbd\x83\x0a\x54\xc2\x1f\xb9\xf0\x56\x00\xd8\x03\xe1\x08\xb1\x7c\xda\x2d\x56\x6a\xa1\x8e\x76\xda\x4d\xbb\x41\xec\xe2\x2c\x86\xda\xef\x7b\x4f\x76\x75\x0f\x2a\xdf\x1f\xd4\x6c\xb9\x2e\x7c\xdf\x95\x63\xbf\x44\xe2\xa2\xcb\xb9\x4f\x13\x78\x2f\xff\x22\x9c\x83\x2d\xbe\xd0\x6c\xe3\x82\x61\x5e\x3f\xde\xfd\xf8\x26\x90\xeb\xc5\xeb\x0f\xd1\xdd\xfb\x8b\x89\x0b\x51\x13\xc8\xb2\xd4\x66\xf1\x61\x4a\xa9\xe7\x1c\x70\x72\x8e\x62\xe3\x34\xdf\x71\x7f\x94\xca\x0b\x1a\xa7\x40\xd8\x8a\x1a\x3a\xf5\x1a\x31\xc5\xd7\x56\x88\xac\xb3\x53\xe9\x91\x06\x3a\x56\xd2\xe3\xfa\x1c\xed\xb4\x3b\x00\xe1\xdd\x41\x83\x0a\xec\xfa\xea\x1c\xb5\xb4\xdd\x95\xc7\x9a\x2c\x5a\x45\xed\x25\xd6\xf5\x67\x97\xa8\x66\x04\x1e\xdf\x2c\x6d\xbd\x00\xb5\xd6\x8f\x77\x6f\x5f\xb8\x29\x5e\x9b\x38\x8c\x99\x4b\x67\x03\xd1\x60\xfb\xea\x10\x53\xa7\x00\xe2\xbe\x17\x8d\x2f\x68\xac\x80\xb0\x88\x69\xe6\x53\x89\x94\xd4\xeb\xd9\x63\x51\x76\xea\xfd\x9e\x81\x12\x74\xda\x57\x85\xc7\xad\x0b\x7a\x61\x9d\x06\x39\xb0\x63\x30\xae\x71\xe8\xe0\x48\xb3\x70\x26\x90\xad\xdd\x54\xd1\x8f\x5f\xd0\x5c\x6f\x5f\xab\x1c\xbf\xb9\x11\xc4\x4f\xec\x2a\xf2\x22\xcb\x87\x3d\x73\xb5\x69\x3a\x0e\x98\xf3\x65\x09\x4c\x10\x65\xb4\x5e\x6c\x2a\x03\x21\xd3\xad\xae\x95\x27\x60\xdf\x2b\x79\x00\xf0\x54\x39\x67\x7d\x0a\xc6\x28\x4e\x58\xc0\x0c\xa1\x0b\x8f\xf2\xdd\x45\x13\xe9\xe9\xee\xe1\xed\x8f\x21\x41\xe6\xe9\xee\x3a\x0d\xbe\xa6\x6c\xdd\x18\xd4\xf4\x94\x1d\x98\xd0\x9c\xee\xe7\x55\xc1\xf9\xbd\x19\xe8\xc1\x3a\xd3\xf3\x5e\xf9\xe3\x06\x79\x44\x35\xa1\x80\xf1\xdd\xc0\x25\x69\x0c\x88\x4e\x7a\x1c\xad\xdf\x99\xba\x01\x74\xd2\x31\x5f\x68\x5b\x67\xff\xb5\x8c\xe6\x39\xa5\xba\x68\x33\x7d\xb1\xe3\x3e\x0e\x66\xbc\x58\xf1\x76\x75\x25\x15\x5a\x10\xf7\x2d\xd2\x0d\xa5\x7e\x48\x85\x64\x82\xec\x80\x31\x01\xc8\x14\xb5\xac\x6e\x4c\xed\x47\x06\x0a\xe3\xf7\x9b\xca\x4b\xaa\x29\x01\xd5\x39\x3a\x10\x41\xf6\xa0\x9a\xd2\xe3\x51\xe7\xb5\xd3\xb5\xf6\x08\x8c\xfe\xd0\xc8\x3d\x48\x43\xcc\xa4\x5b\x45\xdb\x62\x83\xbf\x9c\xb5\x5d\x49\xfe\xdf\x5f\x5e\x57\x2c\xde\x4f\x55\x58\x08\x9f\xbb\xb8\x9b\x4a\x0b\xac\xe7\x1b\x3c\xb5\x16\xe4\x36\xfc\xbc\x70\x32\x6f\x5d\x8c\xa3\x2c\xec\xe6\x1f\xbf\x9c\xe7\x7c\xba\x7b\xbc\xfb\x04\x1e\xbf\x77\x10\x19\xd3\x25\xaf\x14\x66\x9e\x4e\x63\xee\xdc\x2e\xce\x2c\x80\x47\xe6\x0f\xbe\xc6\x36\x1c\x3f\x2a\xdf\x8d\x2a\xc6\x3b\x3d\x94\x92\x22\x9b\x81\xc1\x97\x79\x5c\x0d\x15\x56\xa4\xaa\x73\x88\x5c\xd9\x73\x4c\x2e\x58\x74\xb6\x82\x81\xe7\xea\xef\xbc\x44\xa2\x17\x0a\x04\xf0\x78\xf7\xe9\xee\xe5\x83\xd9\xaa\xb8\xb5\x75\xcd\x31\x94\x35\x9e\x06\x2d\xb4\x31\xa8\x84\xe7\xc8\xef\x73\xb4\x51\x9e\xd9\xe7\x43\x85\x2c\x23\x64\x5d\x3e\xf3\x62\xdd\xf9\xcc\x9e\x0e\x79\x6e\x24\x75\x59\x78\x16\x4e\xd0\xc5\x6f\x2d\x5e\xca\xfb\xf1\x9a\x34\x7e\xf7\xf1\x52\xe2\xaf\x8f\x05\x63\x62\x40\xe5\xf7\xd6\x66\xbe\xf2\xb0\x6c\x0d\x63\x71\x6e\x41\xb6\x13\x47\xdf\x20\x7d\x20\xa1\xc4\xed\xa0\x36\xb2\xd3\x63\x5e\x68\x59\x2c\x45\x4e\xb3\x98\x1f\xb0\xd4\x8a\x36\x30\x47\x75\xd9\x8b\xa5\xcc\xf1\x18\x34\x19\x59\xf4\x76\xb1\x63\x29\xef\x0b\x9b\x47\xd0\xab\x09\x9f\xbe\x2e\xfd\x5a\x3b\xc9\xa4\x6d\x21\x9a\xb7\x65\x39\x33\x8e\x4d\x3b\x53\x15\x56\x6b\x5c\xe5\x7e\xf4\x2d\x24\x1b\x36\x09\xa5\x65\xa7\xa6\xaa\xc8\xf1\xbe\xf2\xa3\x20\x62\xd5\x3e\xb3\x2c\x5b\x0f\x73\x7d\x74\x59\x6e\x38\x0e\xf5\xb1\x0a\x38\x62\x99\xcc\xfd\xe8\x06\x9d\xb9\xfd\x66\x0d\xbf\xc8\x21\x84\x65\x2e\x08\x71\xef\x37\xc7\x53\x4f\x35\x41\x39\xa1\xe8\xd4\x83\x41\xd4\xbe\xc6\xa0\x48\xf6\x20\x1d\x74\x37\x26\x58\x3b\xed\x29\x23\xb9\xce\x11\x30\x58\xee\x8d\x13\x3b\xb3\x33\x7b\xf3\x82\x0f\x16\xf1\xe1\xcb\x19\xc1\xe6\x96\x3a\xf8\x02\x33\x71\x9b\xee\xf9\x40\xf8\xaa\xaa\x4f\x65\xad\x34\x01\x74\xef\x21\xd8\x25\xdd\xa9\x8c\x0f\x96\x90\xc9\x22\x0c\x7a\x5c\x19\x63\xa7\x6e\x0c\xeb\x0f\x3d\xe3\x8d\x49\x8a\x1b\x8e\x85\xaf\xa2\xeb\x41\xe0\xd8\x98\xe7\xa3\xb5\xab\xec\xf9\x78\xbd\x92\xe2\x04\x19\x4b\x06\x1f\x54\x33\xbd\x91\x21\x87\x81\x6f\x9b\xd0\x46\x1f\x7e\xa3\x8d\xbe\x6d\x22\xc5\x94\xdb\x15\x18\x17\x99\x85\xcc\xd6\x7c\x32\x46\xd8\xba\xc6\x08\xfa\xc1\x3b\xc8\x36\x6c\x92\x52\xcb\xbd\x9c\x8a\xd0\x42\xe7\x48\x2e\x2d\x04\xbf\x6e\xa0\x38\x12\xab\x28\xe8\x61\x5f\x6c\xf8\x5e\xe7\xbc\x1d\xb5\x7f\x15\x86\xed\xca\x58\x80\x2d\x1f\xbc\x45\x62\xc0\xa9\xcd\x85\xdf\x0d\x7c\xda\x07\x01\x0e\x50\x65\x1e\xf9\xb2\xc2\xd8\xec\x37\xf3\x96\x5e\x4b\x54\x42\x58\xd1\xc2\x32\xcc\x80\x11\xc6\x40\x45\x72\x9b\x02\xe4\xf7\xd9\x12\x73\xc1\xdb\x3a\x89\x6e\xb9\x3d\x5f\xf3\x53\xc7\xbb\x38\xb7\x71\xe9\x51\x03\x72\xe2\xfb\x9d\x6d\x7c\xc3\x00\xb6\x9e\xc7\xa4\x69\x8c\xef\x8d\x6b\x01\x9d\x3d\x2a\x5f\x37\xb2\x09\x90\x87\x28\x8e\x5d\x3c\x06\x2c\x68\x76\xa9\xdf\x4f\x77\x8b\x3f\xbd\x54\xe4\xb5\xc2\xdf\xbe\xa2\xdf\x49\x32\xcb\xcd\x6e\x57\xe7\xbe\xf7\xb6\x14\xb1\x34\x8e\x4a\x33\x14\x98\x15\xa9\xc9\x4a\xe4\x6a\xba\xde\x4f\xc7\x2c\x6e\x8e\xda\x1f\xa0\xa4\xc8\x64\xf1\xe0\xf7\x94\x31\x23\x7a\x08\x51\x5f\xec\x75\x81\xe8\xfc\x7c\xfd\x32\x06\xff\x4b\xda\x97\x39\x2d\x65\xb3\x87\x98\x54\xa9\x85\xdc\xd5\x6c\xd2\x46\xda\xa6\x21\x08\xce\x46\x85\xf6\xe5\xca\x5c\x46\x20\x6d\xe7\x11\x48\xf9\x4d\xfb\xee\xf3\x6b\xfb\x26\x89\xbe\xc4\x64\xfe\x76\x54\x04\xaf\xfa\xc5\x8a\x77\xf3\xc8\xfb\xe7\x60\x6e\xe4\xbf\x0f\xfe\xde\x87\xd9\x96\x2b\x2f\xcc\xe3\xdd\xfd\xdb\xe4\x65\x7d\x7d\xba\x5f\x6b\xab\x38\xb7\x6d\x9e\x15\xac\x48\x53\x9d\x93\xb6\xac\x60\x59\xfa\x56\x8b\xdc\xee\xb0\x01\x51\x1e\x76\x23\xce\x33\xe0\x36\xd2\xd7\x84\x69\x41\xfc\x88\xd3\x34\x4d\x4b\x5d\x0d\x28\x23\x18\x08\x2f\x2b\x64\x09\xc1\xc9\xce\x77\x66\xea\x77\xc6\x67\xe0\x68\x16\x5e\xc7\x60\x67\xc8\x37\xfa\x39\x60\x54\x2e\xd5\x11\x64\xaf\xdf\x3c\xde\x84\xdd\x3e\x85\xa6\x0a\xfd\xf2\xc6\x09\x00\xf5\xf1\x10\xb8\xd1\x98\x05\x07\x67\x41\x01\x22\x3a\x0f\x06\x42\x00\xcd\x8b\x4c\xa5\x64\xe7\x8f\xad\x3a\xd1\x24\x77\x49\x75\xda\xbb\xd3\x21\xc1\x7e\x44\x44\x32\xca\x62\xb7\x37\x80\x0c\x88\x2a\x86\x55\x01\x21\x54\x85\x63\x25\xa5\xf3\x84\x6c\xfc\xa2\x4f\xb3\xd8\x47\xa3\xbf\x11\x3d\x84\x48\xc9\xdb\x5f\xb3\xef\x57\xcc\x1b\x07\x74\x8e\x7c\xf3\xad\x79\x50\xe4\x2a\xc5\x9d\x1f\xbf\xb2\x2e\x3b\x56\x58\x52\xc2\x62\xd9\x1a\x80\x3a\x44\x14\x43\xbc\x80\x85\x2e\x2c\xa9\x28\xf5\x9d\x31\x26\x28\xae\xae\x57\x28\x9c\xf9\xaa\x1b\xf5\xe0\xb0\x5a\xcf\x8f\xbf\xbb\xbf\xa5\xcb\xbe\x64\x9b\xfc\xfc\xe9\x97\x37\x4f\x0f\xef\x3e\x3c\xbc\x7d\xdc\xbe\x7d\xfc\xf0\xee\xf1\xe9\x61\xbd\xf7\x06\xe4\x16\x30\x7f\x84\x18\x31\xc6\xaa\x12\x66\x2a\xa7\x88\x8b\xdd\x40\x40\x69\xe1\xd8\x67\xce\xd6\x75\x07\x1b\xb7\x8b\xf3\x44\x8c\xe3\xc9\xd4\x18\x73\x41\x0f\x20\x2b\xce\x91\x05\x95\x61\x5a\x2b\x19\xeb\xe3\xf1\x78\x54\xe3\x38\x8e\xd1\x3a\x91\x37\xba\x9d\x45\xf4\x0f\x16\xfc\xd1\x87\xd7\x96\x85\x03\x97\x64\xb3\x9a\x5d\xcc\x5f\x3e\xdc\xbf\x79\xfc\xf0\x70\xff\xe3\xbb\xc7\x27\x70\xff\xe1\xe1\xfe\xdd\xe3\x53\xd2\x02\x9e\xd6\xc0\xfa\xa6\x14\x54\x4a\x8b\x8b\x32\x33\xc8\x0a\x59\xf8\xda\x91\x23\xc0\x45\xee\xb1\xeb\xb3\x3d\x10\xe9\x61\x72\x20\x82\x03\x50\x70\xb7\xd6\xe3\x78\x72\x03\xc1\x8c\xf3\xae\xaf\x7c\x0b\x0a\x58\x57\x9a\xec\xac\x05\xe3\x20\xf9\x30\x35\xc3\x30\x44\xeb\x98\x06\x2e\x27\x15\x54\xec\x67\x0b\xff\xf1\x25\x6b\xe9\xfe\x97\xa7\xc7\x1f\xdf\xdd\xdf\xdd\x24\xbb\x2c\x87\x43\xc9\x2a\x60\xd8\xc0\xd3\xfd\xbb\x0f\xf7\x6f\xef\xd7\x6f\xef\x3f\xbc\xbb\x7f\xba\x5f\x75\xde\x3a\xe0\xd2\x3a\x8d\x23\xcf\x61\x21\x38\x97\x8a\x55\x19\xc9\x0c\x69\xb5\xf5\x8d\x57\x04\x0c\x63\x01\xb8\x77\x59\xe3\xc7\x40\x9b\x81\xe1\x0e\x40\x3f\x7b\x38\xab\x4c\x2a\x25\x4f\x5a\x0a\xcc\xa4\xa0\x8d\xe0\xb3\xcd\xa9\xab\x34\xd3\x3c\xee\xe7\x3f\x66\x98\x2d\x8e\xa2\x75\xdc\x5c\x6c\xfe\x7b\x97\x16\x7f\xbc\xda\xfc\x61\x31\xf9\x57\x2d\xfe\x71\x6e\xf7\x17\x93\xd7\x91\x6f\x1c\xd0\x69\x9d\x82\xc1\x2b\x14\x76\xbe\xa4\xca\x50\x66\x70\xa3\xb4\xef\xbc\x21\x60\x3f\x54\x80\xf9\x7d\xda\x1c\x83\x50\x65\x09\x77\x20\xf2\x43\x30\x78\x9c\xed\x1d\x30\x95\x82\xb4\xb7\xe6\x9a\xb8\xe9\x25\xfb\x62\xef\x0a\xb4\x67\xbc\xc1\x49\x1f\xfd\xed\xe8\x63\xf4\xaf\xa2\xff\x69\xd9\xd3\xbe\x62\x5f\xdf\x7e\x5c\x4e\x5e\x3f\xfd\xf2\xe1\xfd\xb7\xdf\xfd\x35\x58\xbe\x02\x0b\xe8\xfb\xc7\xcb\x22\x1e\x7e\xbb\xbb\xbf\x7b\x48\x5c\x55\xb0\x7c\x77\x84\x52\x72\x96\x0b\x2c\x4a\x42\x11\x2a\x55\xd3\x76\x69\x16\x6b\x5c\x72\xd8\xf4\x90\x51\xc6\x72\x8e\x65\x49\x08\x12\xd2\xb9\x36\xcb\x4e\x56\xb5\x72\x77\xac\x40\x51\xf9\x3e\xc6\xaa\x93\xbe\x55\xf1\x8e\xcb\x0a\x55\x05\x27\x12\x66\x9c\x9a\x82\xe1\x34\x43\xb8\x38\xa8\x12\x42\x2c\x35\xa2\x45\xce\x11\xcd\x33\x4e\x35\xa4\x34\x4b\x4d\xd1\x4b\x58\x40\x7f\xa8\xdb\x5d\xdd\x42\x05\x25\x80\x8d\xf3\xc7\x73\x14\x6d\x92\x43\x18\x03\x32\xfa\xf3\xe8\xef\x44\x1f\xa3\x7f\x12\xfd\xeb\xe8\xdf\x5f\xf7\xf4\x5f\x23\x69\x3e\xbd\xdb\xfc\x4d\xf0\xf1\xd3\x87\xcd\xfb\x6f\xbf\x9e\xab\x60\xf9\x12\x3c\x06\xbe\xe3\xc7\xbb\xc7\xe5\x1c\xe5\x2e\x5b\x50\x64\xdb\x12\x97\x22\x4b\xad\x2d\x18\xa1\x3c\xe7\x48\x55\x0c\x55\x05\x54\x18\x49\x44\xca\xc2\xd7\xa8\xe0\x69\xa6\x1d\x14\x94\xce\xb5\x24\x11\x17\x44\x62\x64\x30\x86\x65\x5c\xaa\xa3\x52\x62\xaa\xb4\x50\x75\x83\x0e\xf0\xb0\x42\xa6\x29\xab\x92\xe4\x52\x34\x45\xa6\x6a\x00\x8b\x73\x64\xd2\x8c\xc9\xa2\x37\xbb\xac\xe0\x44\xdb\xa6\x2c\x0b\x9c\x0b\xb5\x2b\x73\xd5\x80\x02\xfa\xd1\xc1\x1e\xf6\x66\xc8\x21\x27\xbe\xf7\xc2\x8b\x84\xfa\x26\xf4\x75\xe2\x77\x7e\x1c\x0b\x5d\x1e\x96\xb3\xb5\x48\xc4\x65\xe0\xf2\x8d\xae\xd8\xcb\xcb\x12\xf4\xe9\xee\x81\xbb\xe0\x7b\x97\xcd\x80\x6a\xb7\x72\xa0\xf7\x85\x9a\x44\x91\x6b\xc9\x2c\x8e\xbb\xb9\x4f\x75\x67\xbc\xca\x37\xc5\x25\x06\xf3\x77\x2e\x23\xe0\x22\x6b\xbf\xdc\xe5\xcd\x63\xa8\xa7\xf9\xbe\x77\x0f\x60\x8c\x21\xa9\xf2\xa2\x50\xb6\xae\x14\x1d\x84\x10\xa2\xaa\xc4\xa6\x50\xcf\x7d\xa6\xf3\xcc\x73\xc0\x50\xe5\xe0\xaa\xf5\x47\x90\x4d\x0c\x64\x53\x9a\xe5\x00\x2d\x1c\x39\x78\xd5\x85\xbd\xd9\x85\x25\xe4\xcd\xfd\xd5\xda\xbb\x87\xbb\xe0\xde\x3f\x5c\x43\x3e\x77\xef\x9f\xee\xf5\x0a\x37\x04\xe7\x94\x3a\x5f\x7b\x85\x76\x0e\xa0\xb0\x29\xbb\x5c\x9b\xca\x9e\xa2\x2c\x9d\x1f\x8a\x80\xab\xaa\x3a\x5f\xf1\x73\x04\xa2\x49\x80\x68\xaa\xd0\x18\x38\xcf\xf7\x67\x1c\xf0\x8a\x7f\xef\x15\x9e\xf7\xf1\xee\x4b\x92\x56\x88\xd1\x2d\x87\x79\x1f\x57\x51\x5d\x14\x71\x3d\xa5\x42\x03\xe6\xc0\xe0\x61\xcc\x26\xe7\x26\x1a\xd7\xd3\xa1\xb0\xca\x77\x40\x57\x6b\x09\x19\xb1\x6d\x60\x9f\xb7\xa3\xf5\x35\xa0\x76\xb4\x7a\x67\x79\x94\x24\x4d\xd0\x94\xcd\x5e\x18\x7a\x43\xfe\xd6\x4d\x48\xeb\xcd\x35\xa4\xd5\x24\xbd\xc7\x25\xa8\x43\x44\x0b\xc2\xcc\xeb\xfd\x4d\x40\xeb\x1c\x7d\xee\x9c\x0b\x01\xad\x08\xf0\x93\x03\x2c\x4a\x56\x30\x68\xf1\xa7\xdf\x8f\x97\x3d\xde\xdc\x7c\x05\x13\xea\xdb\xbc\x00\xc8\x78\x62\x8f\x45\xee\x6d\x17\x22\x9d\x8d\x27\x9b\xd4\x68\xf5\xb9\x77\x6e\x5d\xa8\xe5\xe6\x16\x88\xc5\x7f\x50\x67\x9c\x0c\x9b\xf4\xc2\x9d\x13\x3c\xfe\x17\xdb\x1f\xdf\xbc\xdc\x5d\x25\xcc\xb7\x08\x20\xeb\x89\x1d\x91\x37\xb7\xb7\xf6\xe3\x72\x6b\x90\xbe\xdc\x3a\x8e\x82\x6f\xba\xc9\x16\x1c\xd5\xe5\xae\x5f\x9d\xfe\xdd\x27\xb3\x2f\xb0\xfd\x70\xcd\x6e\x93\x49\xe9\x0b\x08\x8e\xf4\x08\x1a\x92\xd7\x05\xab\x7c\xe4\x9d\xf6\x56\xd6\x0d\xf4\xc7\x3d\x6a\x77\x60\x20\xb9\x85\x78\x93\x59\x7f\x38\x41\x52\x96\xa2\x6c\x4b\xc8\x6d\xc2\x4e\x55\x8e\x0c\x83\x6a\xdd\x4c\xd6\xd5\x65\x6b\x5f\x62\xd5\xbf\x11\x6b\x7c\x69\x98\x6a\xc5\x7c\x04\x0b\x70\x74\x93\x74\xa0\x2c\xa0\xc7\x43\xac\x27\x39\x5f\x4b\xa8\xf1\xeb\x96\x89\xa2\x24\x6e\xce\x78\x9d\xbf\xba\xff\xc3\xab\xb6\x79\xb8\xde\x3f\x6e\x62\x7e\xc8\x72\x90\x59\xdf\xcd\xee\xe0\xc1\x85\x6c\x9a\xd2\x77\x9b\xcc\x98\xcb\xcd\x95\x3e\x8d\xe1\xe6\x7c\x89\xe5\x2c\xf9\x58\x97\xbd\xd2\x17\xd1\xfb\xb9\x1b\xcf\x03\x66\xcd\xc1\x3e\x58\xcb\x5c\x8c\x4e\x6c\xb6\x74\xa5\xbc\x3a\x61\xad\x93\x36\x91\xde\xd9\xe7\x43\xbc\xe4\xbb\x37\x2f\xf8\xac\x37\xc1\x93\x7d\xa5\xa2\x1f\xf4\xbe\xa3\x1a\x1c\x7d\x06\x9a\x7a\xaa\x6b\x40\x42\xce\xf0\x46\x7a\x6d\xbd\x3b\x21\x63\x92\xdd\xc4\x17\xac\x17\x88\xe8\x99\x87\xf5\xf3\x2f\x03\xc6\xe0\xee\xd3\xbb\xf5\x85\xee\xf2\xfe\xaf\x3e\x85\x79\xf8\xcf\xc0\xfd\x03\x7c\x61\x0a\x5d\x58\x2f\x93\x8c\xf9\x7e\xcc\xfc\x08\x50\xe6\x1b\x03\x64\xdf\x35\xb0\xcc\x6c\xd5\x4f\x3b\xeb\x77\x9d\xef\x73\x80\xfc\x21\x07\xa5\x52\x04\xb0\x8d\x52\xc2\xef\xa1\x2d\xfc\xbe\xb2\x95\x67\x45\x91\xa6\x79\xa9\xd0\x80\x09\x05\x6d\x69\x2b\x80\x4a\x5b\x82\xa2\xc8\x4d\xe0\x0a\x6d\x03\x77\xb5\x0c\x48\xd8\x4b\xf9\xde\xde\x7f\x49\x26\xfc\xf9\xd3\x2f\xc9\xc3\xd3\xfd\xf6\x87\xbf\x0b\x3e\xbe\x59\x8d\x36\xa4\x1c\xec\xcb\xd1\x1c\xf9\x68\x9a\x91\x81\x5c\xb7\x44\x81\x22\x47\x26\x6b\xca\x8d\xf4\x07\x7b\xf4\xc8\xb7\x52\x69\xad\x6b\x61\xb8\x19\x80\xb1\xd6\x77\x6d\x3e\x00\x18\x34\xa8\x7e\xf3\x79\x1f\x6f\x9f\xb7\x86\x16\xec\x7d\x05\xea\xe2\xa0\x06\x3e\x68\x37\xb0\x83\xa9\xb1\x04\x59\x5a\xe9\xd4\xbd\x7e\x9c\xd2\x35\x37\xcc\x5e\x1f\x97\xf5\x00\x46\x97\x38\xdb\x6f\xb6\xdf\x6a\x5f\xc7\xc5\xd4\x83\x3e\xb0\x9e\xf2\x7d\x5c\x4f\xf4\xbb\xed\x17\xc7\x26\xf4\x2b\x7e\xc9\xbb\xfc\xe9\xdd\xfd\xdb\x87\x18\xfc\xb4\xbe\xaa\xe2\xc4\xb3\xe5\xbf\x7c\x78\xf3\xf1\x87\x4f\xf7\x3f\xfd\xb0\x8e\x58\x19\x47\x0e\x9f\xa3\x16\x60\xee\xdb\xdd\xe0\x6b\x01\xd8\x70\x64\x0e\x8c\x25\x19\xa4\x2c\xa6\x7d\xa1\x36\xdc\xd4\xd6\xa7\xbe\x6e\x77\x7a\xb7\x3b\x58\xa3\x0f\xa0\x88\x0b\x6b\xe4\xb3\xa9\x41\x75\x3c\xf8\xfd\xfc\x6c\xa0\xce\x78\xa3\x62\x12\x62\x00\xaf\x32\x08\x36\xca\x9d\x90\x73\xc9\xee\x84\x62\x72\x1a\x85\x48\x52\x1f\x85\x71\x10\x91\x78\xde\xeb\xab\x28\x0f\xac\x4f\xc1\xde\xcd\xad\x64\xc6\x87\x60\x2f\xf8\xe9\xdd\xcf\x9f\x56\x11\x82\x49\xb4\x6f\x7d\x0f\x4a\xb0\x47\xd3\xd1\x6b\x6f\x3d\x24\xc0\x81\xea\xd8\x1c\x92\x14\x96\xfe\xd0\x8e\x20\xdb\x6d\x14\x13\x76\xb0\xac\x74\xa5\xd3\xc4\x22\xae\x0f\x96\x60\xdf\xb5\x52\x35\x51\x12\x75\xe7\x62\x2b\x12\x7d\xc9\xff\xbb\xec\xad\xef\xee\xdf\xbe\xbf\x22\x57\x57\xeb\x0f\xf0\xfd\xd3\xfd\xfb\xc0\xe0\x78\xff\x16\x94\xb1\x72\xb1\x9a\x14\xd8\x41\xa8\x8d\x96\x15\x9a\xec\x69\x28\x80\x04\x7c\x52\xeb\xc8\x43\xe7\x61\x7c\xb4\xd6\x67\x3d\x2c\x20\xd3\x3b\x45\x31\xca\x5d\x36\xe8\x8b\x9f\x97\x24\x32\xda\x6d\xe5\x86\x5f\xd8\x22\x2f\x18\x8a\xbb\xfb\xbb\x2b\x74\x78\x89\x21\xdc\xbf\xbf\x48\x36\x24\x1d\x60\x16\x50\x5f\x0b\x4e\x24\xc7\x1a\x7a\xe7\xcb\x62\xe8\xbd\x8b\xdb\x9d\xdd\xaf\x31\x80\x7e\x98\xa4\xdf\xa5\x59\x53\xd5\x1d\x26\x55\xe6\x32\x80\x75\x38\x03\x94\x5e\x87\xb1\xbc\xe4\xd8\x47\x81\x97\x7a\x6e\x8a\x2b\x8a\x2f\x20\x72\x9e\xee\x1e\x2e\x0c\x3e\x0f\x22\x29\x1a\x09\x38\x18\x2a\x98\x1b\xa8\xa6\x9d\x2f\x6b\x7b\x94\x7d\xbb\x89\xec\xe7\x5d\x01\xf3\x5c\x10\x87\x30\x5f\x73\xaf\x27\xe8\x2b\x06\xf6\xb1\x02\x72\xd1\x1d\x38\x57\x5b\x94\xd8\x97\x72\xbd\xaa\xc9\x6b\x45\x2e\x4c\x9b\xeb\xfb\xa7\xfb\xc4\xd9\xb8\x9a\xf6\xc0\xe4\x50\x34\x46\xe8\xb9\x1e\x21\xd0\x40\x4e\xfb\xb8\xf2\x1c\x58\xcf\xe3\x72\xfe\x99\x58\xe3\xb3\x63\x09\x73\xa1\x5b\x5d\x33\xe8\xe0\x08\x8e\xde\x2e\xd5\x19\xf2\x22\x0e\x5b\xb9\x62\xdf\xe6\x45\xac\x98\xd7\x87\x03\x90\xd1\x2a\xf8\x09\xed\x06\x45\xbf\x8b\xde\x47\xff\x22\xfa\x77\x21\xbf\xf3\x52\xe6\xf5\xbb\xcd\xf6\x5b\x25\xad\xa7\xc0\x65\x04\x2e\xaf\x9f\xbe\xf3\x6f\xee\xbe\x80\xe3\xc2\x16\x77\x2b\x9f\xeb\x4e\xef\x62\x55\x11\x6a\x2d\x27\xa4\xac\x54\xc5\x88\xc1\x75\x6b\xca\x23\xd8\xbb\x9d\x29\x0f\xbb\x8a\xd0\xce\x71\x89\x14\x91\x94\x11\x03\x0e\xcf\x55\x67\x0e\x16\x98\x0d\x32\x53\x3d\x0d\x3e\x63\xa0\x8e\xd3\xf8\xd0\x0a\x98\x3b\x49\x09\xc7\x95\x77\x00\x72\xca\x74\x2d\x25\x54\xd0\x9b\xf0\x42\xc2\xf7\x3b\xa2\x78\xed\x0d\x40\x86\x08\x39\xb9\xbd\x31\x8b\x2e\x59\xad\x16\xbc\xee\xf1\xa2\x2f\x76\xe5\x6d\x5b\xcc\x7d\xb8\xbb\xa2\xd4\x5f\x53\x33\xad\xb3\x41\x1f\x0e\xa2\x14\xb8\xd4\xf9\xe0\x0f\xb9\x96\x83\x62\xec\xc0\xd7\x29\x10\xde\x9c\x06\x4f\xb2\xae\xec\x46\xa4\xab\xc2\x64\x39\xd8\xeb\x70\xb6\x99\x5d\x74\x2e\xce\x2c\x69\x93\xec\xda\xfe\x6f\xae\x63\xe9\xd3\x2f\x37\xfd\xfa\xe9\x85\x01\xd5\x00\x6c\x00\xf2\x3b\x99\x65\x92\x16\x1a\xfa\x83\x37\xf9\xae\xf6\xad\x0e\x2c\x86\xb1\x32\xc6\xb3\x16\xce\xfb\x79\x57\x4a\x9e\x9a\xbc\x53\xce\x2d\xfa\xa2\x09\x09\xdc\x06\x32\xfa\x8b\xe0\xf9\x7d\x81\xcc\xc4\xdb\x2f\x13\x5c\x98\x9a\xef\xee\xc1\xc7\x4f\xf7\x3f\x25\x1a\xd4\x2e\xf0\x40\x31\xd5\xd4\x20\x62\xe7\x68\xd7\xf9\x23\x05\x69\xdb\x70\x04\xa4\xa7\x60\x34\xcc\x57\x64\x8d\xe7\xb5\xda\xfa\xbd\xf5\x5d\x67\x59\xcd\xdb\x3d\x75\xa4\xe9\x40\x69\x41\x75\x6a\xea\x7e\x08\xf3\xdb\xbc\xce\x92\x97\x79\xfa\x85\x90\x22\xa4\xca\xdc\x05\x1d\xa8\xf2\x68\x8e\x31\x2c\x2a\x8b\x0b\x70\x70\x27\x95\xa8\x44\x76\x3e\xf7\x9a\x02\x05\x76\xb1\x13\xb4\x14\x7a\x1a\x81\x3c\x2c\xf8\x24\xbc\x4d\x83\x6e\xf7\x8f\x81\xb3\x03\x04\x89\xdd\xeb\x0d\xe7\x1d\x34\x18\xcf\x91\xd1\x3c\x76\xb0\x34\x08\xc6\xa2\x79\x76\x2b\xb6\xe2\x5e\xf8\xd4\x73\x72\x00\x02\x64\xf1\x8e\xe0\x82\x72\x5f\x0f\x3c\x0a\x7b\x76\xb2\x35\xab\x25\x17\xe8\x6f\x85\xcc\x91\x08\xbc\xe4\xf0\xdc\xbf\xfd\x6a\x0a\x78\x77\x49\x10\x8a\xd5\xaa\x78\xee\x5d\x7c\x98\xf2\x64\x78\x3e\x4a\x40\x41\x77\x99\x0c\x3a\x5f\x39\x0b\x78\x0d\xf8\x2a\xf3\x46\x2a\xdf\x78\xa6\x96\x39\xc1\x62\xcc\x63\x2c\x9b\xa6\x69\x82\x5f\x1e\xf0\x0b\x49\x1d\xe6\xd4\x90\x3d\xb4\xd9\xde\x67\x21\x9a\xbd\x7a\xfc\xab\x8f\x4f\x0b\x45\xcb\xc7\x45\x19\x66\x65\xab\x22\x76\x27\x99\x66\x49\x2e\x1a\xb5\x2b\x40\xc4\x71\x35\x71\xe6\x1d\xef\x15\x4b\xa7\x31\x1e\x60\x91\xd4\x98\x1a\x46\x7c\xd5\x94\xae\x64\x07\x7f\xe8\x95\xdc\xe9\xa3\x41\xe5\xf5\x0c\x25\x7b\x69\x8f\xb9\xce\xee\xbf\x34\xca\xec\x0d\xae\x10\x2a\x62\xfe\xb9\x3e\x8a\x5d\xdc\xc3\x32\xee\x9e\xf1\xaa\xdd\x48\xca\x7c\xb6\x9f\x27\x4f\x0d\xb2\x58\xc4\x12\x23\x7f\xe8\xa2\x38\x68\x29\xd9\xc4\x5d\xd6\xfd\xfb\x8f\x9f\xde\xfd\xf8\x22\xa1\xbf\x89\xb6\x1f\xfe\x79\xfc\xd7\xe0\x42\x98\x10\x97\x60\xcc\x53\x9b\xc7\x66\x1a\x6a\xd0\x12\x9f\xef\x90\xdf\x0d\x5c\xb4\xa6\xc0\xbe\x4c\xfa\x79\x8f\xc9\x63\x6a\xda\xac\x99\x97\x69\xe5\x1c\xd8\x0f\xbe\x41\x16\x72\x43\x34\x18\xb8\xc0\x82\x47\x49\x9c\x9e\xab\xad\x49\x4c\xf4\xa7\x41\xb9\x25\xf8\x5c\x0f\xc1\xaf\x7a\xbc\xb0\x5d\x5c\x48\x91\x54\xe6\xad\x3b\xd9\x3c\x51\x6e\xb2\x8d\xe1\xb6\x96\xad\xe5\xb6\x01\xc2\x42\xaf\x80\xc4\x16\xc7\x78\xda\xc7\x90\x4a\xa9\x18\x63\x52\x19\xf6\x87\xfb\x58\x72\xd3\xc7\xec\xa2\x3e\xc3\xec\xb3\x5e\xc9\xa4\x3b\x47\x3e\xf5\xe2\xda\xc7\x30\xaa\x28\xf7\x19\xe0\xc3\xc2\x25\xb8\xcd\x5e\xee\xf9\x36\x10\x89\xdc\xde\xf3\xee\x1e\x8c\xa3\xd3\x22\x76\xb0\x98\x9b\x99\xbb\x70\x4b\xd5\xfa\xcc\x0b\x3a\x00\x09\xd2\x78\x8f\xab\x8a\xb2\xa9\x05\x8d\x9f\xc7\x42\x9c\x9f\xcb\x6d\xb9\x1a\x2f\xf7\xbc\xb0\x62\xc6\x5f\x1a\xf3\xee\x7e\x9d\x95\x10\x74\xee\xd4\x17\x4e\xb7\xe0\x08\x8b\x38\x3f\x0d\x09\x5c\x8d\x8c\x4f\x25\xf5\xce\xf7\x1c\x54\x40\x83\x7e\x5e\xe9\x7d\x1b\xc5\x51\x73\xc6\x2b\x7a\xe1\x0d\xfd\xae\x5f\x05\x0e\x0e\x74\xbe\x04\xdc\xf9\xb4\x06\x95\x59\xb8\xa9\x3d\x37\x5e\x9f\xb8\x10\x89\x9d\x04\x18\xa3\x4b\xbe\x2e\x4a\xd4\x26\x8d\xb6\x97\x76\xba\xb0\xfd\x82\xc7\x2c\x9c\xaf\xff\x2d\xb0\xa4\xb7\x24\xca\x7a\xe6\x40\x61\x51\x67\x99\x6e\xaa\x3e\xc8\xa6\x6d\xd2\xe7\x7c\x45\x9e\xdb\xd5\xe0\xf7\x93\xf2\xc6\xef\x98\xa2\x20\x03\xd4\x3b\x6d\x88\x31\x17\x8c\x5e\xbd\xc9\x2f\x33\xf6\x7c\xeb\x2f\xe0\xd4\xe5\xd0\x35\x06\x1f\x7e\x7e\xf3\xf0\x69\xde\xce\x8c\x09\xdc\xe5\x15\x86\xa9\xc9\x0a\x58\x3b\xac\x4a\x6f\x05\xc0\x45\x63\x67\x37\x7f\x93\x9f\xf6\x13\x2d\x60\xd5\x94\x43\x55\x62\x16\xf7\x93\xf0\xa3\x39\xc4\xd0\xc4\x79\xf4\x5f\xfa\xac\x7d\x82\xf6\xb0\x22\xc5\xfc\xac\xa2\x71\xc4\x14\xbe\xe1\xa0\x80\xad\x0d\x62\x12\x7f\xe0\x59\x91\x3e\x57\xdb\x3a\xa9\x2e\xac\x9e\xf7\x61\x0a\x7a\x95\xf7\xb7\x9c\x64\x84\xf9\x49\xac\x23\x5f\x23\xdd\xe1\xb4\xce\x94\xdf\x0f\xea\x1c\xc9\xa9\xa7\x60\x60\xbe\xb6\x49\x77\x2a\x93\x6a\x3a\x8e\x39\x44\x4d\x39\x08\x4c\x40\xe1\x05\xb3\x08\xe4\xe6\x18\xd6\x07\xd0\x87\xf5\x3e\x7f\xf1\xb0\xee\x5f\x9f\x29\xdc\x3d\xfc\x09\x58\x7f\xf8\xf9\x87\xa5\x60\x71\xbf\x82\x7e\x2c\x18\x2f\x53\x97\xf2\x6e\x27\x86\x74\xf0\x0d\x05\x65\x9b\x1e\xeb\xb8\x9b\xca\xa5\x68\x30\x0f\x3c\xfc\x12\xb1\xb8\xf7\xdc\x1b\x63\x14\xa8\x00\xb1\x71\xfa\xe5\x99\x4d\xe0\x63\xfb\x8b\x6b\x5d\xfe\x5a\x55\xc6\xc7\x64\x18\xa5\x29\x33\x93\xa1\xe2\xd0\xd2\xbe\xf2\x19\x07\xfb\x72\x30\x71\x3b\xe1\xe5\x71\x98\xd8\xb2\x47\xdf\x54\xe4\x2a\x62\xe7\x5d\x52\x6d\xf2\xcb\xb9\xf3\xdd\x92\x05\x78\xdd\x7f\x82\x40\x7e\xed\x62\x39\xe9\x45\xc6\x6e\xbe\x0e\xb9\xdf\x7b\x05\x81\xdb\xe4\xcf\x45\xdc\x02\x73\xc2\xc0\x4e\xdc\x90\xd2\x95\x0b\xae\x45\x9f\xeb\xad\xdd\xc0\xd7\x67\xd9\x2f\x7b\xe6\x79\x3d\xeb\x5e\xe8\x5b\xe7\xeb\xb0\xca\x9e\x8f\x1b\xf8\x0c\xc3\xdd\x08\xd0\xa7\xc1\xce\xf7\xa9\x7f\xeb\x3e\x61\x1e\xce\x93\xf4\x34\xba\xb0\x51\xda\xfb\xca\x1f\x93\xe3\x29\xfb\xfa\x46\x9b\x30\xc6\x8e\x21\x47\xfa\x1a\x6f\xae\xae\x11\x9e\xcd\xf6\xf1\x95\xd8\xda\x85\x88\xe7\xe3\x9f\x87\x24\x83\xed\xbc\xd9\xbf\x92\x3c\x80\xeb\xeb\xde\xe6\x10\xd0\xb2\xec\x08\xc6\x12\xea\xb2\x70\xc6\xa5\xcc\x72\x08\xc9\x98\x02\x58\x95\x7e\xc4\xce\x81\xd2\xf9\x32\xbc\x6c\x54\x59\x55\x9a\x93\x67\x42\x69\x66\xb3\x12\xa0\x90\xe3\xd5\xb4\x55\x07\x64\x2c\x73\x68\x8e\x03\x61\xd3\xa1\xef\xfb\x69\xdf\xf7\x7d\xd0\xee\xc9\xcf\xf5\xd6\xbd\xb4\xcb\x77\xea\x70\xc5\x17\x10\x40\x38\x03\xf2\xec\x90\xe8\x93\xbc\x6d\x91\x53\x67\xe6\x3a\xa4\xe7\x7a\x5b\xff\x56\x1d\x26\x7d\x82\x4f\xad\x8b\xe7\x95\x31\x9d\x46\x3f\xac\xc8\x73\xf3\x75\x1d\xae\xe2\xfc\x2c\xb6\x6e\x25\x7f\xfd\x3e\xf1\x21\x39\x9c\x72\x37\x6f\x21\xe7\xcb\x9b\xb5\xfe\x2c\x57\xf2\x54\xc5\x25\x88\x26\x0e\xa2\x69\xef\x82\x26\x4b\xbd\x35\xbf\x69\x8f\x4b\xd8\x69\x91\x83\x9a\x2f\xdf\xad\xd4\xb3\xfa\xda\x1e\x10\xc9\x84\x6d\xf5\x46\x45\x6f\xbf\xe4\x78\xae\x6e\xb8\x6f\xde\xdf\x1f\xe3\x9d\x8b\x77\xd3\x0e\x64\xa0\x26\xbe\xf4\x07\xe7\x07\x4f\x38\xa8\x41\x3a\xed\xd7\x07\x6b\xed\x41\x1a\x07\xa0\xd7\x40\xf9\xde\x29\x7d\x58\xf0\x04\xc0\x6e\x9b\x4d\x71\xe3\x8b\x7d\xfc\xf3\x79\xf8\x85\xc5\x7a\xb6\x0f\xb4\x07\xdd\xad\xbb\xb1\x05\x29\xf5\xed\x1e\x44\xcf\x62\x65\x56\xa4\xf4\x8d\xdf\xf3\x23\x28\xe3\xd4\x17\xbe\x35\x75\x07\x1a\x80\xdb\x0b\xce\xab\xde\x36\xbf\x59\x66\x3b\xb7\x9e\x8b\xf1\xd4\xce\x97\xdf\xaf\x9a\x67\xf2\x75\x99\xd7\x91\x3b\xf3\x2d\x4b\xa2\x68\x7b\xc3\x58\x7d\x59\x76\xd6\x17\x84\xf7\xbb\x9b\x53\xf1\x2d\xb3\x9f\xb9\x59\x3b\x90\xfd\x9e\x80\xd2\x24\xe4\xd4\xbc\x5c\x91\xdf\x37\x0d\xa8\xba\xa9\x91\x32\x26\x3b\xe2\x0f\xc4\x1f\x68\x94\x44\xbb\x24\xdb\xe2\x0d\x0b\xd8\x1c\x14\x62\x53\x57\x58\xe0\xec\x64\x7d\xf8\xb4\x0e\x50\xbb\xb7\xb7\x58\xc1\x0b\xb5\xc0\xfb\xef\x7e\x0a\xba\x15\xe1\xda\x19\xbc\x1b\x0f\x5e\x15\x3b\xd7\x17\xa0\xb3\xfc\xa4\x62\x12\x0f\x88\x29\x8e\x55\xed\x8e\xa5\xe6\xae\x70\x9a\x56\x53\x7f\x6a\xe2\x1e\x51\x29\xb0\xae\xed\x78\xfd\x1c\x4d\xfd\x86\x09\x54\xe5\x05\x2b\x4b\x54\x88\x2c\x87\xa4\x2a\x0a\xbf\x17\xb8\x82\x05\xaf\xc2\x67\x10\x52\x08\x8b\x92\x87\xcf\xc2\xbf\x93\x59\x5e\x90\xbc\x28\xc3\xf9\x34\x58\xa5\x67\xbc\x15\x49\x1b\x54\xde\x1e\x3f\x3e\x3d\x6e\x2f\x5c\x3c\x3f\x3d\xfe\xd5\xa7\x8f\x6f\x02\xa0\xed\xe7\x37\x0f\x2b\x7c\x48\x6d\x0a\xea\x54\xd4\x98\xe5\x02\xa3\xac\x4c\xfd\x31\x9f\x27\xe8\x08\x0e\x49\x4a\x69\x33\xa1\x31\xb7\x39\x69\x80\xf6\x3b\xef\x34\x1f\xc0\x10\x05\x7d\x23\xbd\xaa\x12\x15\xa5\x81\xc9\x30\x68\x4c\x5c\x90\x28\x2f\x60\x85\x8f\x9f\x9e\xee\x93\x96\xe7\x01\x68\x63\x1c\x50\x5e\xcd\x57\xd7\x78\x95\xa8\xd3\x98\x6b\x5c\x99\x2c\xa1\x7e\xd4\x9e\x6b\x8f\x33\x28\x03\x56\xd3\xae\xfa\x4d\x71\xc9\xa3\xff\xe9\xcb\x69\xed\xa7\xbb\x6b\x2f\xba\xfb\xf9\xd3\xdd\xfd\x2a\xa7\x24\xf7\xe9\x64\x61\x1d\xe2\xd1\xe1\x4a\x7b\x0f\x37\xc5\x67\x9d\xa5\x86\x21\x97\xad\x07\x9f\x03\x7a\xda\x03\x7a\x72\x10\x5e\x63\xed\x6a\x5b\xaf\x6e\x75\x2c\x2e\xbd\xe9\x15\xc6\x82\x00\x3a\xee\x00\x71\x09\x3d\xd5\xd7\x6b\x65\x9e\xb5\xb5\x2b\xe9\xd5\x61\xb2\xc7\xc9\x2e\xba\x44\xe2\x2c\x03\x3f\xd8\xcd\xfd\x96\x44\xd4\x37\x37\x2a\x1e\x9b\xa1\xf9\x3c\xf4\x2f\x3c\x86\xf3\xb5\x29\x7f\x7f\x70\x6e\x93\x4f\x47\x20\x4f\x1a\x88\x93\x06\x32\x8a\x7e\x17\xcd\xf7\xb3\x6b\x19\xfd\x65\xf4\xdf\x46\xff\x5d\xe0\x0d\xfe\x17\xd1\xbf\x8e\xfe\xfb\xe8\xdf\x5e\x74\x4d\x1e\xdf\x3e\x2c\x78\xec\xbb\x85\x9b\xe7\xf1\x72\xcd\x3b\xb9\x4b\x50\xf5\x2e\x70\x7c\x2f\xcc\x03\x6f\xc3\xae\x11\x7c\x67\xc4\xc4\x05\x15\xba\xeb\xba\x0e\xe4\xf1\x0e\xe4\x7d\xdf\xf7\x23\xd0\xcc\x7c\x26\x86\x35\x40\xcf\xf3\xec\x3c\x7b\xef\xd2\x79\x5b\xc7\x84\x88\x2d\xa8\xc6\x1e\x20\x93\x98\x93\xb8\x5e\x6b\xc9\x10\xa4\x8c\x33\x1e\xf3\xc9\x72\x26\x18\xe7\x93\x0d\x34\xee\x59\x5c\x15\x93\x03\x23\x22\xd5\x11\x53\xcf\xa7\x5e\xca\xb8\xd8\x91\x73\x84\xcf\x11\x5e\xe2\x0f\x67\xbc\x55\xab\x26\xec\x75\xbe\x21\x2a\xbf\x9e\x40\x5c\x60\x69\x9b\xbd\x94\x25\x2e\x78\x49\x43\xa4\xc8\xc5\xea\xd4\x27\x45\x38\xd1\x8e\x9d\x8f\x18\x4f\x5d\x4a\x00\x9e\xaa\x78\x3f\x75\xf1\x6e\x67\xe6\xff\x22\x90\xa0\x0b\xdf\x26\xbc\xdd\xed\x7e\xf7\x61\x77\xf7\x09\x02\xfb\xc5\x99\x6d\x04\x2f\x31\x64\x55\xe5\x8f\xce\x1f\x1d\x68\x7c\xb5\x96\x20\x3a\x47\xc6\x8f\x13\xe4\x6c\x7e\x58\x5c\x3c\x1f\x57\xd9\xa9\x4f\xda\x00\x6b\x8b\xd6\x71\x1f\x62\x06\x59\xc0\x22\xfd\x12\xfd\x83\xc0\x22\xf9\xf8\xc3\x9b\xfb\x2c\x79\x7c\xfb\x30\x5f\xf1\x75\x04\xde\xff\xf0\xe6\xe1\xfd\x0f\x4f\xf7\xf1\xf6\x02\xbf\xfd\xf8\xe9\xe5\x7d\xdc\x9b\x3c\x4b\x9a\x4c\x48\xa8\x6d\x31\x50\x0b\x1b\x46\xb2\x53\x53\x41\x95\xb4\xd9\xa4\xd2\x1c\x44\x5a\x6b\x6e\x41\x9f\x67\x93\xc8\x21\xc8\x95\x52\xdc\x26\x41\x3f\x6e\x9e\x9a\xad\xcf\xad\xef\x72\x9b\x5b\x50\x02\x62\x41\x74\xf4\xe3\x01\xd4\xdc\x70\xad\x4e\xe5\x78\xf4\xe3\x00\x6a\x61\xb8\x5e\xb8\xd6\x62\x31\xb7\xc3\xa5\x8e\xc2\x9e\xf3\xc7\xed\x7d\x76\xb5\xf5\x32\x59\x7c\xfc\xe1\x4d\xd8\x73\xae\x53\x8e\x40\x77\x3a\xa6\xb1\x35\x1d\xe6\x50\x60\x41\x32\x9f\xe6\x6d\x23\x5a\x97\xfa\x21\xc6\x15\xdd\x48\xdb\x5a\xa3\xa6\xcc\xf7\x99\xcb\xda\xb8\xf0\xb5\x67\xb5\x76\xa0\x8f\xb1\xb5\x8b\xbe\x45\x1d\xce\x6c\x54\xf4\xe3\x0b\x8f\xf8\xcb\x13\x7f\x78\xb3\x90\xc7\x5f\x0f\x6a\xdf\x5c\xe4\xb6\x57\x9d\x29\xca\x58\xa8\x1a\x11\xc8\x2a\x82\xb2\x69\xc4\x4c\xf5\x80\xcb\xc2\x65\xfd\xa1\xd4\xb4\x16\x42\x5b\x58\x6d\x54\x61\xf5\xb3\xf1\x0a\x3a\x08\xa2\xa4\x6d\x35\x07\x78\xea\x8e\x63\xc9\x09\x34\x03\x68\x4b\x4f\x5c\x46\x94\x8c\xe2\x84\x06\xce\x96\xef\xda\xf1\xf1\xd6\x8e\xf5\x8d\x1d\xd2\xc0\x32\x6e\x74\x8d\x18\x64\x98\xe0\x6c\x6a\x31\x53\x1d\xb0\xaa\x70\xd9\xd1\x1f\x0b\x23\x9c\x92\x75\x53\xa0\x5b\x43\x0e\x49\x37\xdb\x81\xa6\xfe\x38\x96\x82\x7e\xb1\x03\x2b\x15\xb4\x8f\xf1\xb6\x5c\xc9\xe8\xa7\x80\xa9\x5b\xec\x78\x81\xc5\xff\x10\xe8\xf4\x7f\x06\xd7\xc0\xea\xcf\xb3\x29\x3f\xbf\xff\xe5\x43\x5c\xd5\x79\xb6\x92\xb8\x6e\xb9\x2b\x7a\xca\x69\xf5\xdc\x99\x56\x00\x18\xef\x6b\xe9\x72\xe8\x85\xc7\x25\x48\x5b\xd7\xd4\x20\x05\x39\x22\x2b\x59\x14\xe5\x54\xfb\xca\x94\xae\x64\x80\x83\x7a\xa7\x54\xe7\x8f\xfb\x23\x46\x15\x83\x66\x07\x64\xe9\xad\xce\x11\x5f\x74\x19\x43\xdf\xa0\xbf\xd5\x4e\x11\xf8\xe1\x4d\x08\x51\xbd\xd4\x4f\xd2\x99\xa2\x4a\xa8\xdd\x13\x01\x25\xe1\x34\x9f\x22\x2a\x14\x88\x40\xdf\x54\x0e\xce\xfb\xca\xb2\x56\x4e\xeb\x7e\xa8\xc8\x52\x43\xce\x8b\xb9\xa9\xd2\xa4\xb9\x34\x55\x48\xa8\x34\xd7\x4a\xa2\x4d\x3e\x37\x56\xe8\x37\x79\xd0\x64\x92\xd1\x8f\x4b\x06\xe7\xaf\xb4\xd7\x2f\xaf\x0c\x5a\x71\x53\x54\xf1\x5e\xb7\x98\x41\x8e\x29\xc9\x26\x4b\xb9\x3a\x00\x6b\x4a\x97\xa5\xe7\xc8\x0f\x65\x2d\x9c\xd4\x4d\x5b\xe0\x8d\x2c\x8d\x7a\xb6\x5e\x42\x07\xc7\x64\x37\xdb\x53\x4e\x87\xe3\x58\x56\x55\x30\xa7\x29\x3d\x6f\x96\xbe\x13\xe2\x02\x66\xb5\x8b\xde\x04\x0c\xd6\x6a\x1d\x52\x37\x83\x06\xde\x12\x77\x7f\xff\xa2\x43\x7a\x89\xc3\x87\x3c\x03\x09\x04\xa8\x40\xba\xe3\xb6\x01\x70\xe4\x7e\xf0\xc6\x1f\x7c\x46\x01\x01\xf9\xe8\xc7\x55\xe9\x74\x07\x08\xb0\xb3\x23\xa7\x7d\xed\x73\x02\x5a\x50\xf4\xce\xba\x63\xbf\xd2\x84\x71\xa5\x18\x61\xc2\x68\x19\x54\x87\x30\xf2\xb4\xda\x1b\x4d\x1c\x6d\x1a\x56\x63\x65\x76\xb8\x55\x2a\xf0\xfc\x9e\x87\xc4\x6e\xd8\xc5\xbe\x2f\xc2\xeb\x2f\x79\x0f\x6f\xbe\xf3\x19\xc8\x8d\x56\x4c\x32\x29\x85\xe4\x72\xef\xa8\x69\xb5\x66\x56\x7d\xf3\xd9\x26\xe3\xd2\x5a\xe6\x9c\x90\x5a\x8b\x8e\x1b\xd6\x4a\x36\x11\x2e\xcc\x57\x1f\xf2\x28\x02\x49\x7d\x26\x21\xee\xf8\x97\x51\x04\xb6\x1f\x7e\x08\x4d\x13\x6a\xe4\xcd\xf6\xc3\xf6\x46\x09\xee\x61\x49\x22\x5d\xa6\x9c\x95\x6d\xd0\xa0\x8c\xd5\x07\x90\x95\x48\x1b\xee\x4a\x96\xa3\xaa\x48\x6d\x5e\x16\xc6\x32\x54\xa5\xd2\x09\x29\x13\x92\x39\x90\x02\x53\x79\xbe\xcb\xa8\x12\x68\xf4\x1d\xae\xf3\x93\x2e\x72\x72\x40\xe7\x88\x20\xc2\x13\x91\x66\x3e\xf3\xda\x49\x71\x39\xd7\x0d\x6b\xc3\x82\xe1\x0b\xd9\x8d\xd7\x8e\xfc\x62\x1c\x78\xcc\xe6\xfd\xd1\x0f\xe0\xf1\xf5\x26\x78\xa3\x2c\x37\xc8\x5b\x6f\xd0\xa0\x4d\xad\x8e\x20\xaf\x2a\xcf\x9c\xde\x0b\xa7\x00\x76\x10\x55\x45\x66\x72\xa6\x1d\x5b\xab\x73\xe4\x7b\xdc\xca\xcc\x81\x08\xd8\xca\x63\x97\x33\xc9\xa7\xbd\x47\xde\x58\x25\x00\x02\x76\x82\x45\x8e\xfb\xca\x8f\x8b\xe6\x7b\x12\xb3\x8b\x5d\x77\xd1\x9f\x87\xfa\xfa\xe9\xcd\xd2\xa1\xa3\xeb\xb0\xff\x55\xc3\xaa\x9d\x72\xb0\xf4\xc8\x23\x04\xa0\x33\x6d\x03\x0a\xc0\x10\xf1\x99\x73\x07\xb1\xb3\xc0\x39\x48\x59\x95\x19\x28\xea\x96\xad\xd5\x5c\x4d\x9c\xaa\x2f\x95\xf7\xda\x36\x0c\xcc\x6c\x1b\xdd\xdf\xd8\xd6\xfd\xd1\xb6\xb1\x5a\x3a\x58\x78\xee\x05\x02\x91\xb1\x8d\x03\x19\xa8\x2a\xec\x91\xb3\xbd\x68\x0c\xe0\x0e\x12\x52\x66\x06\x32\xd7\x5c\x6c\x63\xec\xc5\x36\xda\x5c\x6c\xc3\x5e\xdf\xd8\x46\xba\x1b\xdb\xe4\x25\x66\x7f\x6d\xcf\x9f\x96\xf6\xfc\xc3\xa6\xe1\x46\x3a\xe2\x89\x27\x08\x64\xce\xb4\x35\x28\x00\xa9\xb0\xcf\x9c\x3d\x88\x9d\x01\xda\x15\xe4\x52\x6b\x0d\x5f\x2c\xdb\xbd\x18\xc6\xda\x3f\x60\x18\x08\xf1\x1b\xb1\xa2\x0b\x47\xef\x62\x4a\x88\xeb\x2f\xfd\xfe\xd3\xc7\xa7\x2f\x12\x88\xd9\x36\x44\xe0\x3f\x7e\x5a\x7f\xf8\x39\xd1\xa6\x19\x43\x6e\x2f\xd5\xbd\x36\xac\x46\x6a\x80\xd0\x65\x18\xf9\xbe\xd7\xe7\x48\x6a\x6f\x28\x28\x35\x4f\xfd\x58\x80\x7c\x45\xab\x73\xb4\x83\x05\xc5\x74\x3f\x50\x93\xf9\x0c\xc2\xb2\x6a\x2e\x02\x88\x71\x0e\xfd\x60\x6a\xe6\x90\x16\x5d\xa6\x76\x57\xbb\xec\x7a\x41\xb0\x2e\x6a\xfb\x57\xe3\x6e\x07\xe5\x25\xcc\xbd\xd9\xc6\xeb\x0f\x3f\xc7\x75\xed\x4a\x50\x74\xae\xd9\x03\x01\x2c\x61\xa6\x33\x8e\xd4\xb8\x6e\x71\xea\x52\xe5\x07\x3f\x1a\xad\xc8\x34\x0a\xd0\xc5\x2c\x4b\x97\x05\xa5\xa9\x73\xa4\x04\x3a\xfa\x01\xd7\x70\xaa\x73\x88\xda\x6a\x90\x98\xc6\x22\x4b\xa7\xe6\x60\x02\x6f\xdd\x9f\xc5\x4d\x88\x03\x89\x97\xbd\xe3\x55\x17\xee\x9f\x5d\x7c\xe0\xff\x10\xb1\xcb\x7e\xf2\xf1\xe9\xe1\xed\xe5\xfa\xfa\xf7\xe4\x96\x7f\xf4\xee\x8a\xf1\xba\x92\x71\xad\xef\x9f\xee\xd7\x4f\xf7\x6f\x03\xa3\xe5\xc3\xd3\x65\x1b\xf7\x73\x58\x2e\x3e\xfd\xb2\x0e\x27\x1e\x30\x8e\x7c\xa4\xc7\xf0\x07\xb4\x60\xf4\xa9\x5a\x7e\x81\xe1\x88\x68\xbe\xf6\xcf\x07\x58\x0a\x47\x54\x96\x82\x28\xcd\x0c\xcc\xc0\xfe\xa4\x66\x77\xf9\x7a\xe5\x7a\x15\xa9\xda\x1c\x2b\x6f\xcc\x39\xf2\x2d\x1a\x77\x1a\x94\x56\xf8\x82\x6c\xc4\xb4\x03\x16\xf5\x68\xc0\xc0\xbe\xbc\xf5\x02\x33\xcc\x31\x03\xa2\x2c\x69\xdd\x95\x10\xe6\x79\x55\x56\x02\xe3\x23\xc6\x0d\xc6\x7e\xe4\x9c\x61\x98\xcb\xaa\x22\x50\x67\x05\xce\x0b\x84\x96\x7a\x3b\x84\xb3\x6f\xfe\xab\xf5\xf6\x1f\xa3\xff\xf4\xc7\xd6\xdb\xe3\x6f\xd6\xdb\x2f\xff\x08\x6c\x6e\x2a\x8e\xcc\x9b\x30\x35\x84\x3f\xc0\xde\xfc\x52\x5c\x8f\x54\x41\x7d\x2a\x21\x14\x16\xa9\x2c\x3d\x66\xa9\xc9\x33\x50\x9f\xda\x2b\xd0\x63\xbe\x72\x95\xec\x95\x33\x03\xaa\x65\x7b\xf4\x1d\x3a\xb4\x06\x14\x96\x7b\x84\x37\x7c\xea\x80\x26\x07\x3c\xcc\x43\xec\xfa\xd6\x4b\x42\x09\x23\x0c\xf0\xb2\x20\xed\xbe\x28\x60\x0e\xcb\xaa\xe4\x84\x8c\x84\x34\x84\x5c\xaa\x0d\x8a\x1c\x56\xb8\x50\x79\x41\x8a\x12\xe1\xa5\xde\x64\xf0\x7b\xbf\xed\x6f\xff\x34\x42\xd1\xbf\x8a\x70\xf4\xbf\x47\xff\xc7\x35\x7e\xb1\xb0\xc0\xcc\xd7\xd7\xbf\x7f\xaf\xde\xfe\x40\xb5\x85\xee\xf6\xf3\xa5\xd6\xe2\x63\x9c\x4e\xa3\x02\xa9\x1f\x5f\xae\x6e\xee\x81\x41\xe9\xf7\x7a\xe1\x6b\xec\x0b\xf4\xcf\xfb\x3c\x17\x0d\xd6\xc5\x31\xcd\x2d\xcc\x41\x77\xe2\x01\x1a\x7f\xb9\x72\xb3\xca\x55\x6d\x47\xe4\xbb\xe1\x1c\xf9\x1a\x81\x68\xa7\x41\xe5\x84\xcf\xff\x50\xcf\xc3\x39\xa4\xcd\xbe\x44\xbf\xd2\xf1\x0a\xfc\xaa\xe3\x81\x88\x9f\x49\xcc\x37\xf2\xaa\x86\xf4\xc3\xdd\x17\x57\xec\xe9\x1f\x2f\xae\xfb\xeb\x14\xcb\x83\x42\x54\x2a\x55\x12\x48\x71\x55\xa5\x42\x91\x46\xe5\x90\x61\xca\x58\xc5\x14\xaa\xaa\x8d\xc4\xc6\xf8\xc6\xa7\x7e\xef\x77\x69\x9d\x1f\x8f\x8c\x8c\xda\x3a\x80\x1a\x26\x91\xa4\xc6\x28\x44\x39\x8b\xfe\x34\xe6\x17\xec\xf9\x9b\x17\x8c\xea\xa7\xe8\xdf\x44\xff\x43\xf4\x3f\x47\xff\x3e\xfa\xdf\x2e\x2a\x92\x2f\x0c\xbe\x4f\xe1\x7a\xbf\x68\x78\x86\xb8\x67\xb6\x04\x3e\x7f\x06\x17\x65\xc9\xf7\x97\xd7\xe4\x2b\xfe\xdb\x79\x84\x3c\x5e\x02\xa2\xf3\x6b\x2c\x6a\xe9\x64\x1d\x7e\xac\x3a\x64\x3b\x20\x99\x36\x08\x0b\x01\xd2\x89\xcf\x1d\x98\x53\xea\x61\xc8\x02\x67\x8c\xc6\xea\x1c\x01\xe8\x07\xe5\xf7\xa0\x3a\x47\x5a\xca\x90\xa2\x21\x47\xb9\xc9\x38\xe7\x5c\x51\x4a\x69\x27\x71\xe1\x1b\xf5\xec\x56\xcc\xa7\x9e\x3a\x36\x24\x12\xec\x8b\x73\xe4\x1b\xae\xf8\xfc\xc3\xef\xa7\x96\xab\x71\x54\x1c\x50\x29\xa5\x77\x52\xca\x68\x1d\x77\x17\x3e\xcc\x7f\x18\xa2\xbc\xff\x34\x20\x5f\xaf\x65\xbe\xff\xe5\xee\xf1\xcd\xfd\xdb\xfb\x1f\xde\x04\x37\xf8\xca\xc5\x77\x43\x3e\xf3\x74\xff\xf4\xf0\xfe\x92\xfc\xb9\x1c\x6e\xbe\xf9\xe9\xdd\x05\x26\xfb\x6e\x99\x0f\x3f\x24\xe9\x60\x86\x01\xe4\x99\xc9\x00\xf1\x6d\x56\xe0\x42\x53\x51\x15\x59\xa6\x33\x82\x05\xa1\x02\x29\x8a\x8b\x09\x81\x7c\x48\x5a\x56\xc9\x8a\x9e\x02\x5c\x4f\x07\x62\xaf\xaa\x20\x05\xd4\x39\xe4\x99\x3f\xfa\x06\x52\x5c\xa0\xf5\x6e\xb7\xd3\xed\x00\x32\x9f\xcd\x6e\xef\xb1\x03\xb0\xf4\xf9\xbe\xe3\x3c\x3f\xe8\x83\x22\x92\x39\x10\xc5\x99\x69\x8f\xca\x62\xab\xa6\xc6\x97\xb2\xf7\x42\xd9\x5c\x99\x82\x53\xa8\x19\x76\x69\xa6\xf9\xa2\x69\x27\xe3\xc3\x46\x46\x7f\x7a\xd9\x6f\x47\xe0\xdd\x17\x57\x36\xb9\x5f\x22\x25\x77\x81\xfd\xfe\xd3\x5d\x08\x93\x80\x1b\x4a\x32\x60\x34\x54\x82\x71\x41\x6a\xde\x61\xd0\x9a\xb6\x6d\xf3\xd1\xef\xe1\xb1\xeb\x2c\xd0\xb2\xac\x58\xe5\xdb\xaa\x10\x45\xb5\x91\x25\x65\x4a\x2a\xe6\x34\x6f\xfd\x51\xf7\x7a\x3a\x54\x8a\x21\x57\xc4\x95\xee\x7d\x55\xb4\xaa\xb4\xd6\x35\x55\x6b\xa3\xe8\x4f\x62\x15\x34\x21\xd5\xe5\xec\xf8\x97\xe8\xbf\x09\x0a\x0d\xff\x26\xfa\xb7\x01\x9b\x7b\xc3\xd4\x7d\x85\x77\x7c\x7a\xba\x90\x95\x2e\x74\x93\xe0\xf2\x7a\xf7\xcb\x87\x87\xb7\x97\x79\xf6\xea\xb2\x7c\xc9\x9c\xb9\x21\xcf\x8e\x3b\x70\xb4\x41\x18\xb6\x29\x29\x92\xc8\x57\xd3\x31\x07\xd9\x21\x28\x24\x66\xc3\x55\x48\x71\x42\xd7\x77\x39\x1c\x08\xa5\x02\xb3\xde\x56\xa2\x46\x69\x9a\x9a\x8c\xfb\x43\x27\xe2\xa3\x21\x8a\xa8\x53\x63\x72\x66\xd8\x26\x52\x4a\xab\xa9\xd5\x06\x19\x9c\x9a\x4c\xc6\x58\x79\xcb\x39\xf7\xed\xfc\x63\x5f\x14\xa2\x65\x8a\x4a\x59\xfa\x1d\xcc\xf3\x3c\xa3\xa5\xa5\x88\x00\xd6\x74\x78\xdf\xe6\xb0\x6f\x71\x1b\x6d\x23\x1e\xe2\xe9\x43\xe0\xee\xbf\x46\xb5\xfe\xd9\x2d\x43\x66\xc0\x9f\x3e\xdd\xff\xf2\xe1\x7e\x7d\x3f\xcf\x89\xeb\xeb\x28\xbc\xd1\xf0\xbd\x56\xce\xfa\xf2\x7a\x8c\x5b\x58\x48\x5c\xc5\xf5\x6c\x07\x18\x7f\x0f\xc1\x00\x2b\xdf\xc7\x25\x68\x0a\x38\x35\x95\xa7\x6b\x3c\xd5\x71\x33\x91\x84\x8e\xfb\x84\x4c\x24\x6e\x26\x67\x40\xe7\xcb\x98\x81\x7d\xc8\xf1\x0f\xef\x56\xa8\x28\x08\xa6\x02\x95\x52\x56\x95\xa8\xaa\xea\xe8\x11\xe1\x44\x08\xc2\x09\xc8\x30\xc6\x47\x84\xd0\xa2\xf9\x9f\xa0\x80\x9d\x78\x88\xfe\xf2\xa2\x3c\x78\x8d\x16\xbf\xc2\x59\x2f\x0c\x7e\x6f\x6e\xa9\x23\x97\x24\xe1\x1d\x2a\x4c\x9a\xf5\x7e\x2c\x8c\x96\x1a\xb6\xd2\xf2\x86\x13\x42\xcc\xfe\x68\x65\x96\x3b\x54\x68\x88\x70\x91\x9b\x0c\xee\x74\x4e\x35\x4d\x4c\xa0\xe8\xa3\xa5\x74\x87\x22\x53\x87\xd9\x9b\x6a\xfb\x34\x37\x75\xe5\x91\x1f\x8b\x12\x23\x8f\xdd\xae\xdc\xbb\xb6\x2f\x87\x16\x16\xfe\x70\x40\x63\xf4\xbb\x24\x3d\xab\xa0\xbf\xfd\x70\x33\x3f\xfe\x93\xe8\xaf\xa3\x7f\xf9\xd2\x03\x2f\xac\x0e\xaf\x6b\xf9\xf2\xf7\x2f\xc1\xdb\xc7\xa7\xed\x3c\xef\x5d\xbc\x84\x57\x87\x42\xf7\x6f\xef\x13\x03\xa4\x05\x42\x29\x6f\x02\xca\xf5\xf8\x3c\xaf\xf7\xb3\x73\x34\xaf\xf3\x25\xe8\xbc\x8e\xb3\xbe\xef\xa7\x3c\x31\x27\x61\x8e\x47\x10\xa2\xa6\xf3\xcb\x49\x85\x53\x8e\x92\x90\xbd\xdc\x11\x89\xa5\xc4\x72\x7e\x21\x84\xec\x31\x9e\xf8\x34\x02\x44\x08\xf1\x07\x4a\xa9\x3f\xe8\xe8\x77\x31\x0a\x31\x56\xf9\xc7\x97\xe5\xfe\x69\x1d\x86\xd5\xdd\x37\x43\x2c\x9c\xe6\xec\x40\x67\x41\x67\xad\x2f\x03\x1b\x31\xfb\xbc\x8f\x51\x60\x5c\x2e\x41\x37\xb5\x31\xf6\x65\xcc\x03\xd5\x67\x75\xe2\xab\xf2\xb9\xb3\xe1\x97\x3d\xa8\xa6\xe8\xfa\xee\x79\x58\xe3\xcf\xed\xa6\xc4\x78\x2f\xf7\x73\x79\x96\x22\x85\x42\x11\x32\xf1\xe9\x08\x10\x0d\x5a\xca\xf3\x8f\x80\x31\xfa\x5d\xbc\x0f\x6d\xf4\x5f\x51\xae\x9b\x36\xfa\x4e\xb9\x12\x0a\xb4\x01\xc6\xcc\x0e\xeb\xce\xa3\x38\x7f\xe6\xe0\x18\x10\xc9\x12\xe8\x50\x3e\x19\xe7\xe3\x38\x9e\xc6\xa4\x3e\x51\x13\x5c\x0d\x0d\xa2\x49\x5e\xdf\x9d\xc8\x6a\xf7\x8c\x96\x42\xed\xc8\x52\x28\x22\x5e\x17\x8a\x31\xe6\xfb\xd0\x52\x73\xa1\x7e\x17\xf1\x33\x5b\xc3\xef\x94\xe9\x5f\xbf\x9c\x5d\xfd\xd1\xfd\x6e\x91\x27\xee\x80\xb3\x40\x2b\xe5\x65\x18\xbf\xf9\x33\x8e\xd3\x50\x28\x0a\xea\x69\x8c\x53\xcf\xe2\x6a\x2e\xd4\x90\xb4\x27\x6c\xc7\x11\x98\x71\x92\xe1\x05\xa4\xd9\xd4\x4d\x4d\x19\xb3\x97\x76\xc2\x4a\x61\x89\x05\x0d\x45\xa2\x74\xe2\x3e\x02\xd5\xdc\xf9\x8e\x94\xd2\x51\xa1\xcc\x64\x51\x02\xba\x33\x0b\xed\xf4\x37\xa3\xbf\xbb\xc4\x74\xbf\x62\x78\x5b\xb2\x0b\x6e\x7e\x7f\x7b\x93\x73\x17\x32\x73\x57\x26\x30\x8b\xc4\xd9\x73\xde\xba\x01\x30\x3b\x0c\x20\x3d\x1d\xa4\x11\x13\xb1\xfb\x3d\xa7\xb9\x37\x7e\x20\xca\x94\xe5\x46\x8e\xe6\x60\x03\x20\xf6\x1c\x9d\x23\xed\xb5\x31\xe1\xd0\x60\x1c\xb5\x3f\x42\xa8\x35\xb2\x79\x4c\xa7\x7d\x96\x46\xd1\x26\xe2\x67\xb4\x22\x37\x1a\xda\x81\x69\xe3\x96\xd3\xff\xca\x8b\xb9\xfe\x15\x66\x4e\xe5\x1c\x20\xce\x39\x7b\x82\xad\x03\xe8\x95\x2b\xa9\x75\x23\x5b\x70\xe4\x48\x21\xbe\x0e\xa9\x57\xe6\x64\x8d\x49\xf8\x7e\x3f\x1d\xe6\xff\xbc\xa2\x7b\xa9\xa5\x95\x1a\x87\x00\x5d\x92\x1c\x02\xbe\xab\xfa\x72\x66\x77\x1b\x6a\x5f\xb0\x28\xd7\x93\x91\x2d\x61\x0c\xcb\x42\x61\xe4\x4d\xe1\xcc\xae\x5e\x54\xb8\xbc\xdb\x54\xbf\x1f\x85\xc8\xea\x5c\x00\xe5\x8d\xef\x39\x20\xc0\x26\xce\xe7\x80\x9c\x3a\x40\xa2\xb9\xdc\x22\x86\x01\xf3\xfa\x43\xf4\x2e\xfa\xeb\x88\x44\xff\x4b\x44\x6f\x56\x94\x87\x40\x27\xf9\xf4\xf8\xe1\x61\xfd\xf8\xf1\xd3\xfd\xfb\xc7\x5b\x27\xfd\xe5\xef\x2d\x27\xdd\x53\x38\x45\xfc\x9a\xd0\xfc\x4a\xff\xa8\x01\xce\x72\x5b\x64\x80\x4a\x98\x0f\x27\xb1\x2f\x34\x40\x7b\x98\xf9\x21\xd6\x26\x76\x13\x8b\xf9\xa4\xaf\x4a\x52\x71\x35\xed\xcb\x1e\x14\x38\xd5\x50\xcc\xf6\xcf\xdf\x5a\x45\x19\xe1\xd0\xa0\xca\x17\xc6\x04\xe6\xb6\xde\x17\x9b\xb4\x80\x65\x85\x78\x55\x71\x2e\x44\x55\xed\x4b\x4e\x8e\x98\x60\x82\x28\xcc\xd3\x82\x97\x12\x17\x38\x26\xc8\x7a\x88\x71\x2a\x52\x94\xb6\xb1\x68\xf0\x31\x9c\x9f\xc4\x6d\x64\xb6\x76\x3d\x5e\x71\xfb\x01\x68\xb5\x5d\x81\x6d\xfc\x7e\x01\x84\x3c\xdd\x7f\x7c\xba\x4f\xb2\x15\xf2\x45\x16\xc3\xa9\xcb\x40\x09\xa0\x1a\xfc\xc0\x3d\xa3\xa0\xad\x7c\x1e\x47\x99\x47\xeb\xd1\xb4\xc6\x92\xc1\x77\x1a\x44\x47\x3f\x0c\xe6\x08\xa4\x35\xed\x82\x7f\x8d\xdb\x6d\x73\xd5\xc8\xbc\xac\xd4\x3f\xad\xb7\x3f\x83\xfb\x28\x90\x39\x3f\x05\x3e\x92\x68\x7d\x98\x48\x45\x12\xe7\xe9\x11\xe4\xd4\xd7\xbe\xf5\xc2\x77\xbe\xa1\xa0\xd8\x79\x1a\x63\x8a\x26\xb3\xa9\x0c\x67\xc6\x32\xab\x41\xea\x8f\x5a\x29\x6b\x18\x9f\xcb\x31\x9c\xd1\xb6\x5d\xf7\xd7\xbc\x90\xec\x05\x30\xf6\x52\x8c\xbb\xfb\x44\x26\x9d\xa7\xe9\x3c\x29\x6b\xa0\xb8\x77\x9a\x7b\xcc\xc1\xa1\xf0\x04\xb4\xa9\x97\xeb\xde\x7a\x59\xda\x69\x38\xb8\x11\xd4\x1e\x1d\xec\x18\x43\x4b\x00\x8f\x40\x44\xe3\x2c\x60\x75\xfe\x7c\x61\x30\x7b\x91\xfa\x0c\x05\x49\xee\x17\x56\xea\x36\xe6\x0c\x4e\x6a\xdd\x4d\x24\xc7\x89\xf2\x45\x0b\xb8\xf4\xbc\xf3\xf5\xc1\x23\x01\xc4\xde\x17\x2b\x2d\x95\xb5\x4a\xda\x4e\x99\x06\x94\xfe\xd8\x2a\xbd\x0b\xfb\xa0\x6a\xeb\xe2\x31\x9c\xb5\x5e\xdb\x21\xdc\x7a\xb3\x44\x73\x2e\x95\x04\xd7\x87\xa9\xcc\x12\x32\x95\x7d\x0c\xe9\x54\x8f\x65\x7d\xf0\x9a\xc6\x9c\x4f\x3c\xee\xb3\x74\x32\xf1\x68\x18\x35\x1d\x6d\x14\x20\x86\x1b\x6a\xcc\xde\xd0\x85\x77\x35\x60\xdc\x36\x55\xd8\xab\xc2\x2f\x8c\x09\xcb\x4e\xf4\xc7\x6f\x6b\x6c\x81\x16\x98\xd9\x17\x6f\xbd\x4e\xda\xb9\xee\x8e\xbe\xe2\x40\x0b\x5f\x2b\xe2\x95\x00\x12\x79\x01\xea\x6c\x53\x4d\x9d\x01\xd9\x54\x1a\x23\xb9\x39\x47\x4e\x37\x20\xf3\xe3\x4e\xd6\x20\x33\x21\x7e\x45\xe3\xe3\xb6\xfe\xba\x0f\xbc\x9b\xfb\xc0\xe6\x22\x18\x37\x17\xaf\x58\x37\x13\xc7\x24\xd9\x79\xd9\x1f\xa9\xef\x7d\xe7\xb3\x83\xd7\xe4\xb8\xf3\x26\x2e\x19\x9e\xda\x4d\x65\x08\x31\x86\x5a\x05\xa2\xae\xd5\x4a\x19\x42\x16\xde\x5a\xbd\xca\x36\xf2\x0b\xfe\xf5\x82\xeb\xfe\x74\x09\x45\x85\xcd\xc8\x17\x5c\xb7\x01\xa5\x9b\xd7\xdd\x7d\x51\x19\x5d\x5a\xe8\x5b\x2f\x61\xeb\x7c\x17\x73\xeb\xcc\x3a\x03\xdc\xdb\x29\xf5\xac\x90\x02\x8e\xe7\xa8\xd0\xa4\x72\x39\x04\xad\xbe\xea\x28\x44\x11\x48\xda\x33\xdb\xba\x0d\xbf\x9c\x22\x2c\x09\x1a\x4b\x92\xc6\x2b\xe8\xd1\x35\x43\x63\xfd\xe1\xe7\x4d\xc7\xed\xbc\x2e\x66\x9e\x83\x26\xf3\xa8\xa4\x06\xa5\x2e\xaf\xaa\xe3\x9e\xf9\x2e\x07\xd8\x1f\x73\x50\xf8\x11\x81\x61\xc3\x05\xc2\x7e\xcf\x0c\xf3\xed\xfc\x43\x14\x10\x35\xe5\xb1\x2a\x31\x07\x0e\x19\x04\x10\x32\x18\x54\xa5\x46\xe1\x4c\xc3\x5d\x72\x17\x2e\x98\xc9\x30\x4b\x07\x42\xe5\x6b\xa3\x06\x5e\xb2\xb9\xf8\x3f\x6e\x93\x1a\x70\x3f\x00\xe8\x00\x57\x9e\x68\x90\x4b\x3f\x6a\x36\x6a\x90\x61\xdf\xc4\xdd\x3e\x8d\x0f\xa0\x09\x00\xa6\xa9\x75\x9e\x77\x76\x04\xda\xcb\x51\x80\x0c\x28\x07\x1a\xdf\x96\x55\xc0\xe2\xb5\xe7\x62\x4b\x57\xd1\x1f\xc0\xef\xdf\x7d\xc1\xef\xd3\x98\xd4\x31\x9e\x5a\xa0\xcb\x52\x37\xb5\xa9\xd0\xe4\x4e\x07\x08\x14\x10\x53\xb3\x72\x9e\xd6\x9e\x24\xe9\x38\xfa\x7c\x84\x65\x45\x6d\x2f\x08\x41\xb9\xcb\x40\xa4\xfb\x00\xf4\x01\x91\x49\xa2\xad\xd8\x54\x61\x9c\x6f\x2e\x1d\x75\x91\xae\xfc\x42\x00\x15\x1f\xb4\x97\x18\x74\x74\xea\x37\xc3\xf3\x21\x83\x89\x4b\xb9\xc4\x26\x77\x24\x87\x2b\x3d\x1a\xd3\x00\x6e\x0c\xc1\x7e\x57\x43\x0b\x91\x0e\x5a\x32\xd5\xb6\xd9\xa0\xe8\xcf\xa2\x1f\xa2\x08\x5c\xd0\xab\x01\xc6\x12\x25\x81\x50\xd9\x36\x42\x27\x68\x64\x20\xa5\x7e\x2f\x47\x1f\xc5\x51\x02\x27\xe1\x6b\x0d\xca\xb8\x8e\xeb\xd3\x30\x35\x7d\x03\xa2\xb8\x8f\xb5\xcf\x2e\x67\x03\xec\x92\x57\xf9\x17\xd1\xfd\xab\x5c\x83\x5f\x3e\x7c\xfa\xe1\x12\xf4\xbe\xed\x95\x89\x04\xc6\x01\xeb\xb9\x51\x65\x65\x6c\x69\xb3\xdc\x33\x9f\xc3\x63\xef\x45\x52\x8c\xee\xf8\xa5\x63\x66\xb9\x14\xd0\x1f\xfd\xb1\xa0\xf4\x7b\x7d\xb3\x0b\x67\xa3\x32\xa8\x3a\xbc\x42\x6c\xbd\x12\x97\x0d\x6a\xde\x4f\x8f\x3f\x6e\xb7\x92\x73\x1c\xf4\xc2\x8f\x69\xae\xa5\xa0\xac\x62\xaa\xcd\x8e\x16\x98\xd4\xa6\x6b\xf4\x79\xbf\xa8\x96\xac\x54\x6f\x9a\x41\xb7\xae\xb3\x02\xe4\x71\xfa\xd9\xae\x47\x53\xd7\x26\x94\xb7\x3d\xe3\xad\xd8\xc0\xe8\xcd\x15\xf9\x97\x6d\xbe\x1c\xab\x2d\xb3\xca\x6d\x36\x4a\xd2\x27\x96\x59\xa6\xa0\x66\x55\x99\xfa\x7d\xe9\x5b\x0e\xf2\xc2\x0f\x89\xaa\xa7\xde\xb9\x20\xe9\x01\x27\x77\xc8\x5d\x2e\x81\xf5\xd9\xce\x38\xa0\xa6\xf4\xd4\x4a\x99\xe0\x69\x0f\x5c\x14\x27\xdd\xd9\x86\x78\xfd\x3a\xcc\x2c\x97\x50\xc4\x17\x2d\xf1\xab\xbf\xb2\x96\x0c\xe9\x8a\xfb\x43\xd2\xf8\xc0\x48\x08\xec\xa9\x04\x36\xf8\x28\x62\x23\x85\x26\x4a\xfa\xce\xfa\xd2\xf8\xd2\x5a\xd0\x99\x8b\xfe\xea\x8a\x06\xdc\xae\x8c\xfe\xc6\x85\x9b\x20\x00\xf8\x37\xdb\x0f\x2b\xea\xf6\xb5\x73\xdd\x88\x37\xf0\x99\x94\xe5\xaa\x1e\x3b\x70\x44\x15\xbe\xcc\x45\xf2\xcb\x5c\x04\x2e\x5b\xf4\xb9\xa5\xef\x6e\xe6\xa5\x37\xd7\x56\xdf\x85\x19\x48\x7b\x04\xbb\x9d\xaf\x01\x75\x80\xfa\x7a\x2c\x50\xd1\xba\x16\xd4\xe3\x58\x1a\xba\xb4\x70\x3c\x5e\x9b\xbf\x14\x02\xe4\x37\xed\x1d\xd1\x33\x5e\xa7\x1b\x1d\xd8\x08\xaf\x9e\xca\xc2\xa3\x7a\xe1\xa7\x7d\x91\xf3\x0b\x64\xd8\x9f\x9e\xae\x59\x27\xf7\x71\x19\x32\xb5\x62\x54\x22\x51\xe6\x1e\x03\x98\xf9\xae\xe4\x16\x66\x32\xa3\xfd\x8e\xda\xbc\x19\xa4\x16\x80\x6f\x34\xd5\x44\x0b\x4e\x30\x12\x85\x2c\x21\xcc\x0b\x02\x35\xae\x48\x95\xcb\x5c\x4f\x3b\x0f\xbd\x25\x40\x80\x36\x5e\xb4\xce\x56\xc5\x19\x6f\xc6\x6f\xea\x6e\xfd\x61\x55\xb8\xa1\x71\xae\xf7\xc7\xa5\xf2\xd0\xca\x8e\x5d\x1c\x61\x74\xe1\x4f\xe7\x2b\xb8\xad\x37\xfa\x26\x17\xe9\xfe\xf5\x19\xe8\x82\x22\xf8\xe9\xdd\xc7\x4f\xab\x1c\x66\x09\xf6\x86\xb5\x20\x07\xba\xf4\xa9\xb7\x7e\x3f\xf5\x18\x58\x90\x77\xce\xb7\x09\xca\x33\x3f\x36\xc3\x5e\x6c\x74\x89\x24\x23\x30\x57\x90\xb0\x42\x67\x25\x16\x12\xc2\x96\x94\x15\x8e\xa2\x3f\x0d\x5c\x77\x7c\x43\xa2\x75\x40\x0d\x2d\x7a\x64\xff\x32\xc4\x5b\xfe\x5d\x88\x05\x06\x7c\xc7\xbb\xc7\xa7\x87\xbb\x80\x85\x79\x05\xfe\x98\x3f\x7e\xf3\xf4\xf0\xf6\x56\x4c\xe6\xed\xeb\x8c\x96\xbb\x4b\x1c\xf0\x22\x0d\x31\xef\x50\x82\xff\xbc\x3a\x7a\x65\xcc\xe1\x70\x38\x24\x23\xc6\x15\x0d\xba\x6e\xca\xcc\x6e\xf2\xd4\x02\x2c\x82\x1b\x5d\xf8\xbe\xd3\x58\x38\xc1\x2c\xeb\xe8\x11\x40\xdf\xba\xba\x26\x05\x24\x39\x04\x69\x4d\x71\x5e\xa0\x62\x43\xa6\xfe\x19\x6e\xd3\x81\xfb\x3d\x07\xf8\xf7\x8e\xd0\xcc\x64\xe5\x0a\xc6\x45\xf8\x88\x9f\x23\x42\x24\xf1\x24\xc3\x4c\x30\xec\x07\x50\x6a\x2e\xa4\x04\x0d\xf1\x7c\x80\x08\x43\x8c\xd0\x30\x14\x39\xa9\x8a\x6a\xc1\x5a\xd3\x33\x4a\xf6\x21\x7f\xe5\xff\xbf\xe8\xc3\x5d\x72\x7b\x6f\x8a\xf6\xc3\x9b\xfb\x37\x37\x41\x24\x7b\x49\x2b\xd9\x69\x2e\x84\x11\x0d\x1f\x95\xdf\x2b\x54\xc9\x0a\xc7\xad\x44\x54\xf2\xe4\x18\xeb\x49\x6a\xeb\xac\xb5\x6a\x2a\xe2\xe3\x71\xaf\x40\x06\x58\xac\x9b\xae\xea\xeb\xaa\x38\xd6\x68\x1f\x6d\xe2\xc3\xb9\xda\xf2\x8d\x8e\xd6\xd1\x8f\xd1\x5f\x45\xff\x2c\xc2\xd1\xff\x78\x1d\xdf\xeb\xd7\xd8\x9b\xed\xeb\x60\xd8\xb7\x95\xbe\xf0\x7b\xcf\xfb\xbf\x25\x79\xfb\xed\xe3\x1d\x78\xbc\x7b\x48\x94\x40\x1a\x71\x20\xe3\x23\x25\x88\x41\x86\xaa\xc9\x75\xa0\x0a\xf4\x9b\xa0\x18\x0c\x53\x58\x68\x62\x99\xa3\x1d\x80\x7e\x6f\x1d\x82\x05\x81\xb9\x03\x05\xcc\x29\x2c\x51\x7d\xea\x8d\xd9\xe8\x40\x5d\x97\xff\x7e\x60\x3c\x35\x29\x5f\xb3\x9d\x52\x52\x4e\x8d\xb1\x58\x4b\xcf\x41\xdd\x18\xa1\xeb\x98\xc8\xa9\x41\xb9\x64\x05\x42\xed\x81\x50\xa8\x59\x81\x00\x03\xcd\xe7\x05\x6b\x17\xa1\x33\x8e\xbb\x0d\xbf\xf4\xf8\xc7\x8b\x48\x63\x12\xce\x1a\x9f\xae\x6a\x44\x4f\x8f\xbf\x7c\x00\x9a\x14\x2d\x82\x98\x31\x69\x84\x93\xda\x09\xa9\x28\x29\x72\xaf\x8e\x05\xde\x70\xdb\x5a\xdf\xf8\xc3\xbe\x9f\x67\xb9\xc3\xa0\x5a\x20\xf2\xbe\xa7\xc6\xed\x7b\x6b\xf5\xa2\xc5\x84\x2e\x67\x9c\xd7\xbc\x94\xeb\x92\x74\xf1\x93\x7e\x7e\x7f\x77\x4d\x81\x05\xf7\x77\x7f\x39\x7f\xbd\x8d\x3c\x72\xb6\x44\xd6\xf2\x1a\x4d\x87\xa9\x2b\x41\x35\x77\x4b\x0b\x76\xce\x87\x77\x60\x0f\xe0\xba\x38\x8d\xbe\xcc\x72\xce\xf0\xc1\x1f\x70\xcb\xa0\x4b\x21\x18\xf6\x49\x20\x53\x9b\x2e\xeb\xd3\x82\x73\x62\x67\xbc\xad\x56\xf6\xe2\x3b\xfc\x72\x61\x36\x7b\x2d\x72\x75\xbf\x94\xfe\xee\x26\x30\x71\xff\xf6\xc7\xf7\x6f\xef\x9f\xb6\x15\x65\x05\x2e\x48\x81\xe6\x49\xbb\x29\xb8\xa5\x38\xf8\x73\xa0\x03\xe5\x69\x04\x68\x79\xb7\xb2\xcf\x56\xf0\xd4\x65\x62\x17\xe2\x4a\xc7\x3d\xdd\x01\x38\xc4\x95\x37\xc3\x30\xaf\xd7\xb2\xac\x03\x7e\x18\xc4\xfc\xcc\xb6\x72\x65\x83\x2f\xb7\x78\xc3\xaf\x3b\xd9\x17\x89\xde\xfb\x65\xd1\xbc\x8f\xf9\x3a\x9b\x76\x69\x9c\x0b\x4e\x44\x61\x31\xf2\x2a\xeb\x2d\x53\x0d\xee\xe9\x98\xfb\x9d\x03\xc7\x74\xda\xad\xac\x11\xec\x74\x58\x56\xcf\x98\x13\xb7\x37\x7b\x3b\x38\xd3\x02\x78\x6a\x92\x9e\x89\x28\x89\xcb\x33\xda\xca\xd5\xf8\x3a\x77\xef\x36\x23\x71\x76\xa2\xee\xc2\xa9\xd1\x7c\xad\x54\x98\xb0\x6b\x47\x94\x66\x16\x79\x38\xd9\x62\xde\x95\x05\x00\xe3\xb2\xf1\x3e\xcc\x3f\x57\xe3\x61\x92\xbe\xcb\xa0\x46\xdd\x88\x5b\x9a\xd7\x39\x40\xb3\x73\x32\x2f\x2f\xe0\xa2\xcb\x35\x5c\x72\x6c\x7f\xa5\x2f\xc0\xef\xf4\x05\xe4\x89\xd1\x25\x32\x9a\xb9\xd2\x93\xa9\x2f\x40\x36\x6f\xc6\x1c\x68\xac\xa7\x97\xe8\x70\xb6\x2e\x4f\x07\x5f\x66\x30\x00\x29\x06\x6c\x49\xee\x20\x18\x4c\x52\x07\xb7\x52\x5d\xba\x42\x02\x76\xe7\x7e\xa5\x6e\xd6\xca\x6b\x8e\xdc\x55\xbe\xe4\xc3\x66\x76\x9d\x5f\x92\xe4\xc0\xd8\xcb\xbe\xc7\x55\x0e\x15\x81\x3a\x3d\xfa\x01\x82\xac\x57\x94\x76\x74\x5d\x84\x5e\x96\x79\x91\x66\x18\x41\x57\x17\x18\x15\x16\x82\x5a\x85\x9c\xeb\x90\x9b\xf0\xbb\x15\x3d\xcb\xa0\xcb\xfb\xbb\x17\x05\x92\xbf\xf8\xa2\xb7\xf6\x5a\x6d\xe9\x6e\x79\xbd\x9e\x73\x5e\xe3\x1e\xf7\x6f\xef\x57\x14\xd0\x2c\xd7\x45\x0e\xe8\xa9\xa9\xe2\xe3\x94\x85\x90\x70\x08\x7c\x28\x42\x7c\x17\x37\x13\x31\xd7\x93\xde\x3e\xa9\x4e\xfb\x4d\x5a\x96\x45\x45\x34\x99\xb8\x00\x2d\xf1\x07\x8e\x3d\xf2\x11\xa8\xa8\x3f\x84\x10\x65\x14\x07\x2e\x24\xb1\x29\xae\xde\xf4\xdd\xd7\x2c\x64\x5f\x20\x8d\x21\x23\x64\x48\x4a\xbf\x03\x8e\xb3\x8a\x40\x5e\x95\xe7\xc8\x2d\x02\xa0\x8d\x0b\xd9\x27\xc5\xa4\x87\xa9\x5f\xc4\xef\x80\x98\xd2\x78\x9c\xea\xf8\x30\x18\x40\x97\x3c\x1f\xb4\xa5\xab\xf4\xfb\xcf\xba\x0c\xbf\xeb\xb3\xe6\xbe\xbe\x92\xbe\x88\x89\x10\x54\x40\x8b\x89\xc7\xd6\x23\x1b\xd3\x69\xb4\x09\x39\x35\xab\xd4\x57\xc6\x6b\xca\x32\x93\xe1\x7d\xe8\x87\x2c\x2e\x8d\x0e\x5a\xfc\x69\x5c\x5f\x38\x76\x7e\xbe\xc4\x58\xfe\x63\xc4\xa2\xff\x33\xfa\xbf\x17\xc4\xc0\x72\x44\x7c\x39\x71\x9a\xaf\x30\x47\x3f\x3d\x5c\x75\xe0\x9e\xd6\x8f\x97\x5f\xbe\xfa\x77\x3f\xde\x7a\x34\x97\x7f\x7e\xdb\x50\xf3\xb5\x68\x1f\xbc\xbf\x70\xd2\x42\xc8\x78\xc5\xb3\x1c\x2b\x6b\x1b\x21\xa1\x60\x15\x2e\x6a\x66\x0a\x37\xaf\x40\x83\x84\x90\x91\x92\x67\x29\x56\x5d\x37\xee\xcb\x2a\x4f\x59\x8a\x04\x43\x25\x94\x94\x67\x72\x1a\x93\xfe\x54\x84\x24\x91\xeb\xd5\x92\xdd\x11\x75\x31\xe9\x6a\x5e\xef\xd7\xaa\x2a\xb0\x74\xb0\xaa\x8c\x11\x42\x5a\xc4\x71\x89\xc6\x9d\xe2\x54\x49\x21\x14\x2a\xb1\xb0\xb0\x28\xa4\x14\x4a\xda\x32\xa7\xb9\x42\x15\x6a\x5b\xc5\x98\xf4\xcd\x54\xc6\x29\xf5\x03\xf5\x3d\x3b\x70\x89\x75\xc9\x11\x0d\x12\xcd\x11\x00\xe9\x19\x6d\xfa\xd8\x5c\x99\xa6\x2f\xed\x74\x4d\xba\x0f\xd8\xab\xcb\x2c\xb5\x7a\xb7\xfd\xe5\xfd\xe2\xf6\x85\x59\x6a\x95\x29\x18\x73\xce\x11\xc9\x4b\x77\xb0\x7d\x05\x2a\xa9\xf2\xbc\x77\xb4\xac\xa6\x3e\x03\xf9\x9e\xec\xfd\x60\xba\xaa\xb5\x1e\xbb\x78\x5f\xc4\xa6\x40\xd3\xc0\x58\xca\xb1\xa0\x12\x0b\xde\x16\x05\x24\x2c\x25\x40\x66\x54\x08\xc5\x14\x11\x58\x4d\x36\x3e\x84\xdc\x95\xff\x5f\xc4\x62\xbd\x55\x1b\x1b\xfd\x49\xf4\x3e\x44\x9d\x97\xf3\xd3\xff\x35\xfa\x0f\xd1\x7f\x8a\xfe\xaf\xe8\xff\x89\xfe\xdf\x79\x4c\x2f\x43\xf9\xfe\x6d\x98\x46\x5f\x13\xe7\x7c\xba\x50\xeb\x7c\x87\x53\x27\x50\xea\xcc\xdf\x5c\x62\x6d\xd7\xd1\xb8\x34\xe7\xfb\x6f\x84\x5f\x6f\xdf\xc7\xcd\x11\x96\xba\x82\x29\xc8\x27\x51\x95\x85\xc8\xda\x1e\x0a\xc1\x78\xae\x88\x42\x4c\x15\xa5\xd0\x8e\x93\x6c\x9d\x7d\xfb\x1d\x15\xda\x31\x9a\x9d\x60\x9c\x4f\x87\xf9\xca\x03\x7e\xe3\x70\xf0\x63\x99\x89\xac\x58\xe7\xe1\xe5\xf7\x07\x99\x57\xa2\x02\xb0\xcc\x64\x5a\xac\xd2\xdb\xdf\xd6\x3d\xc1\x05\xe1\xa9\x94\x5c\x55\xb8\x82\x9c\xea\x3c\x13\xb2\x85\x96\x67\x18\x15\x07\x93\xc3\xaa\xf8\xea\xab\x9a\x66\x7a\xf9\x86\x32\xcc\x91\xdf\x33\x81\x84\x84\x4a\xe4\xe1\x67\x96\x19\x51\x32\xb5\x7c\x72\xf3\x3e\x8a\x2f\xfd\xa3\x8b\xe0\x57\x3d\xe4\xc2\x36\x1e\xfa\xc4\xfa\xa5\x4f\x24\x57\xb0\xde\x9f\x81\xed\x87\x9f\x57\x91\x29\x63\xc9\x79\x59\x41\x5a\x54\x53\x0f\xf2\x3d\xdd\xfb\x83\xf2\x23\xda\x2b\x2f\x5c\xec\xca\xc2\xc0\x62\x6f\xa9\xdd\x1b\x21\x11\xc0\x71\x57\xb0\x69\xc7\x58\x6e\x32\x02\x2c\xe5\x4a\x73\x25\x14\x11\x93\x4c\x52\xe4\x5d\x51\x95\x73\xcf\xa5\xbc\x2a\x14\x5f\xfc\x79\x9a\x88\xe0\x6f\xdc\x85\x59\xf6\x6b\xce\xc9\xd7\x94\x93\x9f\xbe\xe8\x40\x5c\x68\x36\xad\x7e\x45\xb3\x99\xb7\x6a\xf4\x35\xb6\x43\x5e\xa4\x36\xc3\x95\xef\x8e\x7a\x23\x77\xba\xcf\xf2\x5b\xa2\xcd\x03\x15\xdc\x51\x03\xf3\xbc\x70\x65\x5f\x95\x81\x76\x32\x8a\x41\x7e\x46\x9b\x43\xb2\xbf\xb0\xa4\x2d\x2c\x4d\x2f\xbb\xe0\xd7\x15\xb7\x09\x3c\xa6\xeb\x2f\xe7\xc1\x3f\x27\x83\x3a\x0a\x50\x12\x5f\xb9\xb8\xce\x6c\x16\x9b\x79\x68\x41\x51\x55\xd3\x31\x05\x45\xc7\xf6\xbe\xb7\x68\x6f\x98\xde\xab\x23\x06\x15\x38\x28\x6c\x88\x3a\xed\x92\x3d\x11\x9c\x4e\x11\x63\xa9\x4d\x49\x4c\xb2\x8c\x08\x2d\xb3\x52\xcc\x2f\xcc\x70\xad\x02\x16\x22\x39\x6e\xdd\x46\x87\x8c\x97\x55\xb4\xde\xfe\x43\xf0\xe1\x7d\xb4\xec\x78\x92\x02\xa4\x71\x09\x10\x95\xa3\xf1\xbd\xaf\x67\x0f\xec\x00\x2a\x46\x37\x9a\x7a\x05\x6d\x46\xe9\xfe\x1c\x19\xa7\x76\x25\x0c\xe5\x9c\xfb\xc4\x71\xd5\x46\x0f\x0b\x5b\xdd\xab\x72\x6d\xaf\x5d\xe2\x5a\xf6\x4f\xef\x7e\xdc\x26\xef\x6e\x3e\xdf\x1c\xa5\x08\x42\x9b\x64\x1a\xd2\x0c\x54\x3d\xeb\x7c\xcf\xfd\x81\x03\x8a\x3d\x74\x71\x93\xa5\x36\x93\x36\x83\x20\x6d\x69\x73\x8e\x8c\x3f\x32\x60\x93\xc3\x29\x67\x34\x37\x39\x4e\x4a\x98\x73\xad\x0d\xb7\x4a\xb8\xdd\xf3\x71\x55\x33\x91\x73\xe2\xab\x0c\x23\xae\x95\xe1\x8d\x50\x75\xe8\x1b\x55\x88\x49\xda\xc0\xbe\x79\xd9\xeb\x85\x8d\xe9\x9b\x30\x0b\xdc\x2d\x9c\x13\xdb\x5f\x3e\xac\x48\x09\xe3\xe3\x67\x7a\xd0\xbb\x9c\x09\xec\x54\x6c\x73\x38\x45\xa4\x52\x25\xde\x58\x84\xf5\x24\xa6\xc1\xb3\x79\xff\x49\x39\x76\x54\x26\x51\x59\xf8\x9d\x6d\x51\xe3\xe6\xb5\x55\x9d\xd1\x96\x6d\xc4\xf7\xeb\xe3\x1b\xe7\xee\x71\xa9\x8f\x97\xcf\xb7\x8c\x52\xcc\xa0\x42\x85\x1f\xd3\xcc\x72\x46\x25\xb1\x62\x28\x7d\x6f\xc0\x3e\x33\x99\x75\x59\xe1\x04\x63\x9a\x68\x7e\x58\x8b\xcf\x76\x59\x0a\x57\x2d\x46\xba\x36\x8d\xde\x1b\xd9\x01\xf8\x99\x6d\x4a\xa9\xb5\x9c\x6c\x6e\x14\x37\xda\xc8\x5a\x9a\x25\xce\x00\xa2\x33\x5b\xd3\xa4\xf8\x26\x5e\x73\xff\xe3\x62\xc5\xdb\x9b\x59\xfd\xe9\xf1\xed\x9a\x0a\x49\x25\xb4\x84\xfa\x26\xb5\x82\x71\x49\x1b\x76\x84\x7e\xef\xc0\x21\x9d\x97\x28\xbe\x58\x00\x0e\x05\x14\x5c\x4b\x96\x6a\xaa\xc4\x7e\xaa\x12\x5a\x55\x22\x5a\x45\xee\x4c\x57\x19\xe8\xbf\xc7\x13\x7a\xf7\x92\xf3\xb1\xca\xf4\xe4\xb4\x8e\xd9\xe4\x02\x70\x88\x77\x1d\xe8\x27\x55\x96\xb1\xf2\x10\xf0\xea\x48\x48\x14\xad\x92\x5d\xc0\x77\xa7\xdf\xbf\x57\xd0\xc0\x7c\xbc\x7b\xd8\x52\x33\x69\x63\x62\x39\x69\x0e\x6a\x4f\xb5\xb5\x9b\xf4\xf7\xc8\x98\xcd\xee\x33\x5f\xa7\xe7\xe8\x34\x9a\xb0\x39\x58\x45\xc7\x33\xde\x66\x2b\xf2\x6b\xb6\x2d\xbe\xd9\x36\x73\xcf\xd0\xb9\xd5\xf0\x0c\x8f\xf1\x38\xa5\xe1\xb4\x6b\x45\x3e\x8f\x94\xae\xd3\xe7\x63\x22\x5c\x08\x49\x47\xd1\x2a\x70\xb1\x14\x2b\xfb\x1b\xf7\x9b\xed\x2b\xdc\xa9\x76\x21\x5b\x27\x88\xf0\xd9\xc3\x61\x65\x3f\xb7\x94\xad\xc9\x73\x9d\xec\xea\xc9\x58\x10\xb0\x72\xdb\x18\x9f\x79\xc0\x66\xbc\x89\xf2\x97\xfc\xc8\x7f\x7a\xe3\x3f\x3e\xbc\x60\x11\x1e\xd6\x9f\xee\x7f\x7a\xf7\x5b\x50\x84\xeb\x61\x6b\x6c\xc1\x98\x43\x53\xc2\xb8\x6c\xca\x12\xa0\xcf\x7b\x40\xcb\xaa\x4d\x0a\x32\x1d\xab\xc2\x8b\x15\xf5\xcb\x7a\x44\x3e\x37\x31\x9f\xd7\x25\x0f\x97\x1c\xd3\x01\xe0\x53\x7f\x7d\xb7\x1e\x50\x55\x60\xaa\x28\xd6\x9a\x10\xe7\x08\x19\x27\x2b\xd5\xdc\xeb\x94\x04\x42\x08\xb1\x00\x7f\x96\xb3\x9f\x04\x6f\xcd\x06\x2d\xf9\x5d\x77\x2f\x44\xc7\x70\x51\xdc\xbc\xaa\xa6\x25\xa3\x03\xe4\xc0\xfd\xe0\x15\x71\xa0\xc0\x36\x35\xde\xf8\x51\x8f\xb8\xb6\x1b\xe4\x8f\x4c\x09\x27\x54\x0e\xb1\x2a\x77\x1c\x13\x8d\x0c\xbc\xec\x69\x65\x52\xc4\xc7\x8d\x8a\xfe\xe4\x05\x1b\xba\xd9\xde\x3d\x80\x5a\x32\x0a\xe0\x20\x31\x73\x2b\xc3\x91\x69\x01\x61\x52\x4c\xc7\x10\x73\xa8\xcf\xe5\x16\xc7\x43\xc8\xd9\x7b\xfb\x25\xbf\x7b\xfd\x2e\x9e\x67\xc2\xe8\xdd\x22\xd1\xab\xdd\xa9\x70\x31\x75\x95\x17\x9e\x12\x60\x01\x1b\x01\x07\x18\x7b\xe7\x9b\x78\x98\x1c\xe8\x3d\x8c\x79\x07\x7d\xef\x1b\x6c\x2b\x90\x0b\xaa\x9c\xa5\x61\x8e\xcd\xb7\x76\xa3\x43\xee\xf8\x6d\x6e\xd0\xad\xe6\x25\x89\xe9\x44\xe3\xba\x99\xbd\xf8\x58\x4c\x26\x41\x63\x97\xa0\xa9\x5e\x75\x56\x5b\xab\xad\x31\xd6\x9a\xc0\xb9\x81\x13\xf1\x9f\x91\x8b\x8e\x8d\xd7\x06\xa4\x1a\xd5\x9a\x49\x5b\xf5\x9a\x2a\xa2\x36\xe9\x73\xb9\xc2\xcf\xcd\xaa\xf7\xfb\x49\x7b\xe5\x3b\x26\x97\x5c\x74\x55\xb7\xa4\x6d\x16\x6d\xea\xc4\xfd\x67\xdc\x9f\x1b\xcf\x0c\x80\x26\xac\x3c\x4d\x39\x58\xa6\xa9\x79\x75\x7f\xe1\x9d\xdf\xd1\xd7\xf7\x5f\x87\x18\xb1\xd9\xa8\xe8\x77\x01\x55\x73\xbf\x28\x31\x5e\xf7\x40\xeb\x45\x4e\xef\xe9\xfe\x0a\x75\x7a\xad\x2e\x88\x33\x68\xca\x1c\x54\xa7\x3e\x46\xae\x28\x0e\x27\x14\x57\xa5\x6f\xab\xc2\x40\x14\x77\xd6\x43\x1b\xc0\x9b\xeb\x96\xe2\x82\x0a\x83\x8a\x9d\x31\xa6\x6d\xa5\x2d\xad\x9a\xd8\x54\x12\x12\x77\x3e\x03\x3c\x8a\xd6\x51\x75\x66\xab\x6a\xa3\x5e\x46\x12\x9a\xcb\xfa\xf6\x06\x3b\x7a\x75\xf9\x97\x6b\xe1\x48\x8e\xbf\x66\x3b\x78\x7b\x9f\x3c\x3d\xbc\x7d\xf3\xf4\xf0\x36\x84\xe8\x08\x21\x3a\xcb\xeb\x1c\xea\x22\x77\xad\x73\xce\xed\xa7\x51\x57\x25\x64\x9a\x54\x40\xe6\xb9\x9d\xcd\x37\xd3\x2e\x46\x4d\xf8\xb3\x2a\xfc\x1e\xf3\x23\x44\x08\x57\x05\x66\x4a\xcf\x7f\x14\x8d\x77\xa8\xf4\x7b\x3f\x92\x23\xa0\x20\x9b\x7f\xab\x08\xf5\x04\x94\xcd\xd4\x68\xed\x8f\xe1\xba\x68\x66\x9f\x71\x7c\x58\xfd\x9a\x46\x7a\xd0\xcc\x3e\x38\x27\x55\x81\x20\xa9\xaa\xb2\x71\xfe\x68\x56\xa3\xf6\xaa\x6d\xb4\xce\x5c\x8e\xaa\xda\x01\xf7\xb9\x5f\x37\x0b\xb6\xa3\x9d\xd7\xc6\xa0\x7d\x71\x3d\x99\x7f\x08\x5a\xa7\x8f\x37\x67\x2d\x97\x3e\xfb\xe9\x65\x3a\x79\x8d\x2c\xfd\xbb\x01\x5c\x7b\xd9\x00\x15\xa0\x0d\xcc\xeb\x31\x7c\x2e\xe2\xc2\x63\x1d\x00\xb3\x3b\x50\x9e\x4c\x72\x3c\x65\x26\xee\xa6\xf2\x7a\xb5\x78\x7f\x8e\xd0\x10\xe7\x87\x03\x39\x1c\x56\x7d\x55\xf9\xbe\x92\xb2\xe2\x94\x52\x4f\x27\x09\x3a\x74\xc4\x47\xb4\xe3\xac\x52\x05\x29\x88\xe2\xf3\x86\xe0\x77\xc0\x9e\xc9\x86\xaf\xf0\x7f\xa5\xcd\x5f\xfc\xf8\x08\xb4\x36\xd8\x9c\x3f\x97\x31\xf4\xd8\x84\x60\xd3\x0e\x14\xa7\xe0\x6e\xd8\x78\x37\xa1\xeb\xd5\xe1\xf6\x80\x3b\xb0\xef\x3b\xdc\xf5\xab\xbc\x2c\xcf\x51\xc9\x79\xc9\xab\xaa\xf2\x76\x1a\x81\x2c\x9a\xa2\x2d\x6b\x46\x4a\x05\x11\xc4\x92\x86\x79\x6a\x33\xb7\xdb\x96\x6e\xd0\x25\xf6\x7b\x13\x09\x79\x78\xc9\x76\x9c\xd7\xe4\xbf\x0f\x3e\x5c\xe2\xbd\xf3\x07\x4f\xf7\x6f\x13\x37\x59\x63\xae\xd9\xf4\x1b\xc8\x04\x2a\x78\x35\xd9\x97\x04\xfb\x0d\xf2\xd9\xe7\x71\x33\xee\x88\x3f\x52\x50\xfc\xfe\xa0\xe8\xff\xc7\xda\xbf\x03\xcb\xad\xab\x69\x82\x28\x7f\x30\x1f\xec\x5d\x8f\xe6\xda\x3a\xda\x62\x75\x57\xf7\xe5\x6a\xed\x7d\xc4\x8a\xea\xdb\xcd\x28\xb5\x24\x46\xf4\xed\x6e\x5a\x37\x60\x22\x62\x1c\xb4\x31\x31\x18\x63\x22\x10\x31\x0e\x4c\x98\x30\x61\xc2\x84\x09\x93\x26\x4d\x9a\x69\xd2\xa4\x49\x33\x4d\x9a\x69\xf2\x68\x25\x91\x13\x09\x66\xae\xb5\xa4\xa3\x5d\xa7\x26\x66\xce\x51\x4a\x4b\x19\x5b\x78\xfc\x78\xfd\xcf\xef\xb3\x7c\x13\xc1\x29\x7c\x41\xa3\x68\x7f\xe3\x84\x52\x41\x56\x8f\xd1\x87\x5b\xb6\xcb\x1d\x4f\xf1\x39\x84\x71\x3b\x07\x9f\xe1\xe3\xc3\xfb\xed\xeb\x04\xc4\xef\xd0\xbd\x77\xd8\x16\x05\x44\xbe\x05\xf6\x64\x81\xfa\x7e\x2e\x2b\x45\xaa\x53\x7d\x89\xae\x23\xd5\x15\x36\x74\x29\x48\xa9\xcb\x3a\xee\xec\xd2\x18\x73\xcf\x38\xd8\xa9\x42\x32\xe3\x89\xd6\xd0\x1a\x41\x2b\x61\xd4\x52\x43\x5b\x96\xad\x22\x5a\x2a\x5b\x39\xb9\x0c\x4b\x44\x69\x1c\xf9\x93\xf6\x5c\xaf\x6f\x21\xbd\x71\xc4\x7c\x3f\xfe\x5f\xde\x3d\xf3\x6b\xbd\xc4\x61\xfe\xf8\xe1\x2f\x8d\x3f\x3e\xe2\x12\x72\x52\x34\x65\x09\x85\xd7\xd0\x7e\x3d\x80\xf3\x0e\xb2\xa2\x84\x72\x18\x10\x55\xb5\x50\xf2\x2c\x18\x36\x15\xdb\xd4\x66\xa1\xee\xb9\x84\x7e\xa7\x84\x56\xb2\x90\x54\x7b\x6a\x0c\x34\x9a\x93\x25\x83\xa6\xc4\x4e\x10\xa5\x84\xa9\xad\x58\xfa\xf3\x89\x90\x38\xf5\x47\xeb\xa9\x89\xa2\x24\x70\x93\x91\x6d\x71\xf3\x03\xbd\x54\xcc\x06\x3b\xea\x27\x78\x2e\x77\x5e\xc9\xa7\x1f\xaf\x23\xbf\x73\x71\xc7\xc1\x31\xf6\xfe\x25\xd5\xf2\x1e\xe6\x74\x36\xdb\x96\x89\x50\x65\x95\xe1\x2a\x4f\x8a\x27\x9c\x65\xf1\xe9\xe9\x50\x13\x39\xd4\x71\x7f\xae\x2c\xb2\x0b\x17\x76\xd3\xb8\xb3\x01\xe1\x0d\x4a\x80\x7b\x6b\xbd\xd9\x16\x79\xfd\xd4\xfb\x43\x6a\x92\x7a\x88\x71\x91\x4b\x8a\x65\x37\xfa\x81\xd3\xf3\x58\x23\xb6\xb4\xe5\x2d\x5d\x8a\x31\xc6\xc2\x1b\x8b\xf4\x5e\x6e\xb2\x67\xfc\xad\x87\xf7\x0f\x7b\x69\xbf\x96\x76\x93\x79\x75\xba\x44\x60\xd6\xbb\xc9\x6c\xf8\x5e\x84\xfc\xa3\x3f\xe3\x78\x36\x71\xee\xe2\xfc\x7c\x44\xe6\x6b\x89\xdc\xf9\xb8\x8b\xa4\x34\xd2\x18\x19\x45\x10\xab\x5b\x8e\xf4\xe3\xb7\x7c\xb3\xb7\x22\x8f\xe7\x20\xe6\xba\x7e\x71\x0f\x3c\x64\xdf\xc0\x61\x39\x05\x02\x97\xac\xaa\xb5\x61\x36\xcb\xbd\xf3\xaa\xec\xb4\x6f\xa0\xf5\x76\x9b\x03\xf5\x8d\xf5\x8d\xf3\xa4\xcb\x98\xd3\x75\x78\xa8\x39\x13\xb9\x1d\xc1\xb9\xe0\x9c\x5c\x79\x36\xae\x7d\xff\xcd\x6b\x26\xfc\xf5\xc2\x87\xef\x7d\x63\x7b\x11\x30\xf9\x6c\x56\xba\x2a\x5f\xec\xa6\xf0\x8c\x48\x4a\x72\xce\x0a\x9f\x6d\xb9\x57\xa7\x13\x28\xc9\x2a\x65\x7c\x6e\x97\x42\xd0\xdc\x15\x18\x1d\xa2\x28\xda\x06\xce\x2c\x79\xc3\xa7\xb9\xfb\x21\x6f\xb2\xfc\xde\xf9\x79\xf7\xc1\xee\xa5\xbb\x44\xd7\x5f\xe0\x9c\x67\x21\xd9\xcd\x41\xb4\x3c\xff\x74\x89\xb6\xf8\xa9\xa3\xcb\x09\xa5\x7c\x43\xa1\xf2\xbd\x27\x01\x62\xf6\x9e\x40\x9b\x06\x1c\xad\x6e\x6f\x77\xe4\x86\x59\x72\x03\x33\x7b\xb8\x23\xcd\xae\xdd\x3f\x06\x9e\xec\x87\x98\x28\xe7\x6c\x67\x9d\xf3\x99\x8b\xd3\x33\x51\x71\xda\x6d\xd6\x6c\xfe\xe0\xdd\xf4\xa9\x5d\x5a\x44\xce\xda\x6e\x52\x5f\xc3\xc1\xd7\x77\xff\x6e\x15\xde\xf8\x7b\x76\xf3\xc7\xfb\xa9\x8c\x5f\x23\x29\xfe\x0f\x08\x7f\x46\x6f\xde\xc3\xfe\x97\x77\x9f\xff\xed\x6a\x73\xc5\x66\x48\x93\x26\x49\x91\x58\x54\x89\xaa\xfc\xe8\x4e\xf2\xd8\x1e\x8e\xd8\x0a\xae\x30\x37\x02\x32\x7a\x80\x2c\xad\x3a\x9b\xa7\xac\x32\x15\xdb\x66\xcd\x21\xed\x9c\xf5\x27\x4f\xfc\x24\xa9\xa1\xa6\x21\xb6\xc2\xd8\x9a\xb9\x37\x20\x91\xf4\xac\x1a\xbb\x1e\xa2\x58\x32\x4e\x43\x81\x28\x0a\xd8\xab\xff\x3c\x6e\x66\xed\x02\x30\xad\xb6\xcb\x64\x21\xd7\x57\x45\x78\x27\xbd\x35\x5e\x9d\xb1\xb5\x71\xb7\x88\x1b\xee\x62\x7c\xbc\xed\xd7\xdf\x6f\x2b\x71\xc1\xf9\xec\xdc\x32\x3a\x28\x74\x88\x32\x4b\xef\xec\xab\xb6\x92\x15\xbf\x2d\x0d\x79\x68\xea\xe6\x29\x5e\xef\xe4\x67\xd4\xd1\xf8\x96\x81\xb6\xad\xba\xac\xb8\xb6\x36\xdb\x39\x57\x77\x58\x90\x9d\x2a\x14\xff\xd3\xb1\x3b\xec\x0a\xbd\xa4\x30\x3c\xf5\x21\xa0\x1c\xc7\x26\xc4\x5e\x54\xf4\xd7\xd1\xcf\x21\x87\xe1\x35\x9c\x0a\xfc\xfc\x66\x8f\xe2\xdf\xde\xa1\xf8\xc3\xcf\x5b\xda\x50\xcd\x69\x2e\x44\x05\x52\x11\x87\x85\xcf\x2d\xd5\xc6\xec\xd4\x9f\x8c\x60\x79\x53\x90\x4d\xeb\xab\x65\xc2\xa8\x84\xae\xaa\x96\x26\xe4\x63\x05\xbd\x7e\x8c\xc8\x3e\xda\x24\x2b\xaf\xf5\xee\xed\xab\x2a\xe0\x70\x8f\xa1\x1b\x65\xe5\xa6\x76\x09\x2a\x0a\xa6\x30\xce\x29\xc5\x69\xe6\x59\xde\x34\x0a\xb2\xd2\x77\x40\x37\x09\xc5\xfe\xfa\x4c\xa5\x2e\xad\x05\x54\x93\x1f\x85\x68\x80\xaf\xf7\x09\x2a\x23\xb9\xb1\xbb\x72\x45\xdb\x79\xbb\xdb\x5f\xd5\xb5\xfd\xeb\x13\x19\xcc\xf7\xcf\x5f\x1e\x11\x47\xa5\x50\x55\x55\x3a\xc6\xaa\x32\x2b\x4a\x6c\xb0\x64\x8a\x7a\xbd\x2b\x5d\x6b\x55\x9e\x69\xb6\xcc\x98\xe4\xae\xc8\xc1\xd5\xae\x28\x21\xd5\x81\x03\x6d\x83\x23\x1e\xd6\xf2\x47\xb2\x8a\x83\x94\x56\x89\x6d\x1b\x8b\x65\x59\x65\x75\x5d\x8c\xba\xa2\x8a\x22\x4e\x2a\x53\xe2\x9d\xfc\xda\x8a\x00\x64\x1b\x9f\x4a\x1f\x79\x87\x41\xc2\xe0\xa5\xaf\x2a\x18\x03\x6e\x22\x44\xe2\x42\x62\x13\xcf\xe1\x86\x09\xbc\x03\xdf\x32\x00\x7f\x79\x61\xf1\x8b\xeb\x52\x2a\x29\x39\xcf\x28\x97\xda\xd5\x87\xc6\x88\xe5\x88\x46\x65\x11\xd7\x65\xe1\x39\x21\x99\xcb\x72\x20\x45\x61\x8b\xd2\x09\xa6\xad\x56\xe5\x75\xcd\xf1\xa5\xde\xab\x4d\xfa\xe3\x35\x7f\x3d\x8f\xdc\x51\x83\xeb\x9c\x12\xec\x07\x53\x73\xc3\xe3\x92\xd5\xae\x22\x9b\xf4\x69\xe6\x2c\x73\x19\x46\xc7\xd2\x73\x7f\xa4\x90\x03\xf3\xa3\xb7\x18\x04\x14\xd7\xf5\x68\x2e\x74\x1b\x6d\xe7\xb0\x1e\x3f\x5e\x88\x30\x8b\x87\xcf\x1b\x5a\x68\x46\xeb\x3a\x2b\x6b\x22\x6b\x4e\x34\xf3\x06\xe5\xd2\x94\x71\x65\xc8\x62\x30\x4e\x4d\x9a\xa3\xb4\x34\x79\x01\xad\x92\xc6\x39\xed\x87\x2c\xac\x07\xbd\xac\xbc\xdb\x7f\x71\x3d\x3a\x8b\x55\x59\x64\x55\x55\xf6\xb2\xa2\x8a\x21\x4a\x2b\x53\x92\x9d\xfc\x93\xe5\x24\xb5\x59\xbd\xe9\xcb\xc5\x5d\x2d\xb7\x03\x2a\x7c\xb5\x1c\x6b\x54\x06\xee\x3d\x88\x28\xe0\x7d\xbb\x29\xa3\x3f\xdc\x98\x42\x5f\x52\xec\xd6\x5c\xc1\x06\xa9\xba\x74\x75\x2c\x7d\x31\x00\xa6\x5e\xce\xbe\xf5\xb3\x2f\x08\xb0\xc9\x27\xb1\xc5\xa4\x62\xa6\x65\xad\x81\xd2\x1f\x9d\x11\x87\x28\x86\xe8\x52\xef\x06\xf4\xe3\x71\xc3\x2b\x76\xb6\xb8\x75\x54\x05\xf9\x57\xa8\x34\xcc\x51\x75\xd6\x96\x6a\x6b\x90\x5c\x8c\xa0\xa9\xcb\x30\xc8\xc3\x11\x9f\xba\xa2\xba\x44\x2d\xbd\xda\x68\xd3\x86\x84\xfc\x90\x38\xfa\x57\xc1\x6f\xf7\xf1\xe1\xfd\xeb\xaa\x8a\xb8\x73\x0e\x25\xbd\xb2\xb2\x5f\x72\xd3\xf6\x6a\xdc\xc9\xe5\x08\x07\xd7\xd1\xce\x11\x3c\x2b\x79\x7b\x9f\xf9\x45\xef\x4d\x5c\xde\xda\xf8\x46\x6b\x8a\x3b\x17\x2a\x10\xaa\x79\x8c\xc9\x82\x51\x17\x97\xfe\x60\xfc\xc1\x5a\xa8\xcd\xd5\x66\xb6\xe8\x14\xea\xd9\x5f\x8f\xe1\x3a\xa1\xdb\x72\xc4\x4d\xd3\x78\x6a\x9a\x41\x8d\x1b\x7d\xd4\x56\x1e\x77\xf2\x2c\xe3\x94\x78\x7a\x14\x90\x02\xf6\x27\xdf\x53\x28\x21\x8b\xe2\x5b\x1d\xe0\xef\xc8\xea\xd5\xfd\xb4\x99\x1d\x66\x92\x67\x52\x25\x60\x1d\x77\xcc\x2e\xa3\x65\xc6\xda\xeb\x22\xaf\xaf\xeb\xa6\xbf\x2e\xed\xf5\x7e\x3a\xac\xf7\x13\x83\x36\xe0\x01\x8c\x97\x3a\xf4\xb1\x66\x45\x3d\x67\x3e\x87\x88\x6f\x40\xe9\xba\x3e\xbd\x21\x0f\xfa\x71\xfb\xf0\xf8\xb0\x3d\xb9\xe3\x11\x12\x3f\x3b\xdf\x97\x7e\xd4\x90\x54\x33\x44\xe3\x78\x03\x77\xde\x49\x6f\x8c\x8f\xdc\xc2\x91\xf5\xf2\x12\xf1\x09\x2a\x87\xa2\xa0\x58\x19\x1f\x85\x87\x61\x7b\xd3\x63\xae\xf7\xee\x63\xf4\x9f\xa2\x7f\x0a\x3c\xeb\xcf\x7c\x22\x81\x23\xe3\xce\xb6\xf2\x5c\xe5\xf4\xc7\x4f\xfb\x77\xdf\x5c\xf8\xeb\x72\x6c\x72\x2d\x8b\xbe\x25\x0e\x52\x6c\xad\x64\x4d\x4f\x78\x69\x13\xd6\x6b\x66\x9b\x1a\x46\xbb\x74\xf6\x54\xa8\x3b\x38\xd1\x36\xf7\x43\x55\x29\x56\x13\x74\x1a\x0c\x30\x3f\xd7\x44\x53\x3c\x56\xa5\x2d\x7b\x5a\x51\x56\xca\xb3\x14\x22\xd6\xc4\xf3\xc3\x32\x1f\x22\x04\x69\xc0\x04\x48\x02\x97\xc7\x7d\x37\x7c\x0e\x25\x48\x77\x37\xcd\xc3\xdd\x55\x8e\x02\xc4\x37\xa4\xe1\x4d\x9b\x86\x7a\xf6\x3d\x8f\x23\x07\xf9\x89\xfb\xa3\x6f\x70\x3b\xe5\x65\xd2\xa4\xc6\x77\x7e\x36\x9b\xc4\xb7\x76\x19\x09\x97\x4a\xf0\x0d\xf6\x5a\x39\xdd\x2a\x4f\xf2\xbc\x28\x42\xa9\x31\x0e\x7a\x17\x6a\xaf\x7b\x71\x33\x44\xbf\xdc\xfa\x0f\x7d\x3f\xfc\x61\xed\x71\xa5\xa1\xf9\x66\x54\xdb\xd4\xf5\x96\x1f\xfc\xcc\x9a\x3c\x4f\x4c\x52\xf1\xd1\xf2\xc5\x05\x32\xd1\x83\xcd\xfb\x4b\x44\x36\x83\xe7\x98\x4b\x45\x97\xae\xca\xcb\x63\x39\xea\xb2\xa6\x9b\xd6\x0b\xbd\x18\x4c\x2c\x27\x38\x42\x50\x5e\xd8\xde\x20\x13\xfd\xd5\x6a\x7f\xfd\xf6\x0d\x81\xc9\xf3\xb4\xd7\x1a\xff\x50\xbe\x34\x40\x7f\xb5\xcd\x4f\xc4\xc1\x49\x37\x90\xcf\xec\x3a\xe9\xda\x0e\x38\x0d\x25\xce\xc3\xc9\x00\xf5\xad\x30\xa4\xa2\x68\x6c\x0c\x54\x1d\xe6\x4a\x12\x3f\xe7\x79\xa8\x96\xaf\xab\x30\xe5\xc0\x47\xc5\x02\x5e\xf3\x5f\x87\x4a\xc4\x97\xd9\xed\x3f\x84\xd4\xce\xbb\xbc\xd7\xd9\x3f\x7c\x7c\xf8\x8c\xe6\x90\x70\x60\x54\xdd\x1c\xf9\xa6\x16\xa3\x9f\x72\x6c\xb3\x3c\x71\x49\x25\xfa\x86\xb9\x71\xc7\x97\xd6\x9c\x75\x89\x25\x23\x6c\x5b\xaa\xde\x2c\x45\x9e\xe5\xc5\x54\x1d\x75\x89\xd9\x8e\x2e\x44\x06\x5f\x7d\x1a\xaf\x9c\x81\xef\x56\x79\x7f\x43\x39\xf6\x9c\x5b\xbe\xc6\x4d\x56\xa1\x6c\x72\x0b\xf9\xc8\x2f\xd7\x27\xad\x19\x69\x92\x26\x36\xd5\xbe\xbd\x44\xfa\x7c\x72\xa1\x86\x6b\x2a\xfc\xc1\x1f\xc9\x4e\x1e\x6a\xa6\x04\x1e\xf2\x2c\x2b\x52\x51\xf6\xb4\xa6\x88\xf4\xd6\xf7\xca\xd0\x92\x5e\xed\x87\x0b\xd9\x77\x31\x5e\x91\x39\x36\x2b\x99\xf9\xef\x13\x9a\x6f\x3f\xfc\xba\xcb\xa9\xef\xbc\x89\xd3\xf4\x7c\x8c\xdb\xf4\x5c\x2b\xa8\xa0\x66\xa9\xc9\xb5\xe7\x9e\x77\x0b\xcf\x50\xbb\x1c\x32\x44\x7d\x82\x91\x8d\xb1\x2c\x0b\x51\x9a\x8a\x5f\xf5\xc3\x3c\xaf\x58\xe1\x28\x26\xba\x34\x25\x2f\x4c\xc9\x4b\x53\xdc\xde\xe1\x6a\xaf\x63\x11\xfd\xd3\xf5\xde\xff\x12\xa6\xfa\x03\xe6\xb5\xd5\x0a\x5b\x53\x09\x5f\x21\x4e\x3c\x4a\x18\x93\x6d\xb9\x28\x28\x86\x20\x15\xc6\x86\x95\x92\x6c\x38\x4a\x5f\x57\x35\xf4\x87\x45\x54\x88\x58\xcf\x13\x5c\x99\xa2\x24\x98\xf4\x9d\xd7\x31\x4f\x12\xe3\x0f\x54\x29\xcd\x8e\x59\x8e\x87\x72\x16\x35\x46\x47\x42\x94\xcf\x9d\x11\xa0\x12\x2e\x6b\x4e\x71\xa1\xd4\xbc\xc6\x8f\x62\xb7\x17\xe1\x1e\x79\xe6\x8b\x5b\x07\xfa\x01\x9e\x59\x76\xde\x5d\x37\xcb\x4a\x5d\xf4\x18\x0e\x4b\x16\xe0\xe2\x20\x1d\xb3\x4b\xe4\x1b\x1c\xa7\x0e\x0a\x88\xae\x0f\xb8\x2b\x53\x22\x25\xcf\x53\x53\x18\xef\x6a\x4b\x77\xca\x6a\x3f\x55\xb5\xc5\x35\x46\xe6\x44\x85\xd2\x94\xd6\x49\x92\x24\x58\xd5\x53\x4d\x68\x84\x80\x5c\xe8\x5e\xa2\x63\xf4\x57\xeb\xfd\xf9\xb2\x2f\x5e\x7b\x71\x5f\xf1\x63\x91\xc0\x4e\x01\x7d\xe1\x07\x3f\xe1\xeb\xc6\x4d\x27\xee\x27\xdf\xd5\x7a\xc4\x89\x4b\xb4\xef\x8f\x1a\x1d\x07\xeb\x8d\x36\xbc\xa6\x71\xe1\x3b\xa6\xb4\xa1\x5d\x9e\xd7\x6d\x35\x09\xcc\xd6\x7d\x8a\x8e\x7b\xbb\x13\xf7\xb9\x3f\xbc\x9e\xfb\x73\xc7\xff\x15\xfe\xe9\xd3\x0a\x8b\xb0\xce\x3d\x0d\xd0\x74\x90\x85\xb9\x3b\x1c\xe7\x0e\xd2\xc0\x94\xd7\x95\xec\x50\xb3\x2a\x35\x85\xf3\xe6\x3a\x73\x71\x89\x8c\x6f\x31\x31\x8c\xe2\x18\xfb\x9e\x0a\xa5\xe8\xa1\xcc\x13\xd2\xd7\xfe\x48\xae\x83\xd8\x04\xbc\xa7\x2e\x4e\xa2\xed\xb3\x45\xb3\xe2\xb2\x7e\x7c\xf8\x15\xde\x45\xf0\x87\x8f\xf9\x4b\x7d\xe3\xba\x39\x6e\x0c\x9b\xab\x45\x33\xb2\xd2\x16\xf4\x14\xd8\x3b\x95\x77\x8b\x12\xa0\x4d\x96\xa5\x4d\x76\x58\x46\xc7\x93\x61\x28\xe7\xd1\xcf\x86\x49\xa3\xb7\xca\x5a\xa9\xdb\x38\x91\xa6\x34\xb2\xf1\x76\x84\x9a\xfa\xc6\x4f\x65\x5e\xa6\xa6\x1c\x55\x85\x49\x65\x31\x85\x63\xe9\xe7\x8e\x0c\xa5\x3d\xa8\xc3\x21\x42\xa8\xba\x88\x80\x49\xf5\xdd\xfd\x79\xc7\x69\x58\xef\xae\xd7\x17\xe8\x66\x74\xa7\x96\x8f\x7e\x28\xea\x26\x2b\x6c\x22\x2f\x91\xe3\x0b\x73\xa0\xbd\x1c\x9b\x7c\xf4\x47\xbc\x69\x3d\x23\x4a\x19\xb6\x0c\xd7\x3b\xe4\x50\x5e\x22\x81\xe9\xc6\x7a\x69\x97\x06\x53\xc7\x29\x0e\x58\x62\xc3\x45\xec\x9b\x9d\x88\xb6\xf7\xac\xbd\x55\x3e\x0f\x1f\x9f\xfb\x5f\x9f\xb6\x9b\xa6\xb6\xda\x1a\x51\xdf\x8a\xb6\x77\x59\x65\xb2\xbc\x49\xf9\x6c\x18\xa2\xaa\xb6\x58\x2d\x95\x2b\xb5\xd5\x3b\x61\x47\x3d\x39\x6f\x9e\xda\x3c\xcb\xcb\xae\x9a\x05\xa6\xf1\xe4\x7b\xaf\x4a\x50\x50\xa5\x99\xaf\xbd\xa9\xd7\x9c\xa2\x6d\xd4\x5c\xf0\x46\xec\x58\xf4\xd7\xd1\x7f\xb8\xa3\x47\xbe\x79\xae\x67\x0a\xac\x86\x6f\x9f\xdf\xda\x2f\xaf\x1e\xdb\xdd\x0f\x5e\xdb\xc6\x1d\x8f\x82\x15\xad\x25\x70\xb0\x5a\x52\xd7\x61\x91\xa6\x36\xa1\xbd\xa6\xb6\xc9\x72\xe8\xed\x32\xba\xa9\x10\xa1\xec\xee\x6a\xcb\xb1\xd1\xf8\x53\x59\x4a\x5e\x13\x34\x0d\x15\x51\xac\x1e\xab\xac\x70\xe5\x91\xd5\x54\x96\x75\xf5\xed\x73\x1b\x6a\xa0\x71\xe0\x98\x7b\x35\xde\xdb\xa9\xfa\x66\xbc\xdf\x1d\xab\xd7\xe3\x7d\x7c\x1e\x2f\x1a\x1c\x60\xdf\xb5\xa6\x98\x06\x82\x2a\xd7\x37\x7c\xbc\x44\x05\x76\x75\xe2\x12\xe9\xe7\x86\x8b\x36\x2f\x50\xe5\x96\xc8\x01\x29\x8f\x71\xb4\x44\xd7\xcf\x8e\x0d\xd6\x4f\x55\xa5\x59\x4d\xd1\xf1\x58\x53\xcd\x70\x57\x64\x95\x2b\x47\x5e\x33\x15\x86\xcd\x79\x18\x76\xe7\xa3\x2e\x5a\xf1\x63\xef\x6f\xd6\x7f\xf8\xfe\xcd\xfa\x21\x99\x5b\x5c\xd9\x80\xaf\x2d\xf3\x66\xc4\x28\xb7\x9d\xe5\xc3\x94\xd7\xb2\x4a\x6d\x21\x3b\x47\xaf\x0f\x96\x3d\xbb\xb2\x72\xb8\x26\xbb\x6e\x11\xca\xea\x56\x2d\x51\x91\xf1\xbe\xf2\x27\x45\xd6\x78\x7e\xc0\x05\x64\x3b\x1a\xfd\x1c\xfd\x7d\x40\xbc\xf9\xfc\xe6\x1d\x8a\x7f\x7e\xb3\x8f\x43\x08\x15\xc5\xdb\x00\x23\x17\xd4\xb7\x88\xd3\xb2\x30\x15\xc5\xb5\x26\x35\x11\x02\x4b\x83\x88\xb5\x4b\x6d\x51\xb1\xa3\x7e\xf6\xd3\x09\xca\xdc\x97\x41\x89\x3f\x55\x80\x07\xc3\x4f\x90\x81\x05\x36\x7e\x4d\xc8\xb6\xf9\x3a\xad\x76\xbd\xb8\x90\x3d\xde\xb8\x5b\x9f\x6f\x82\x12\xf0\x1a\x72\xe8\xa5\xcf\x8d\x3b\xe2\x5a\x63\xc1\x88\xae\x30\x53\xb2\x61\xca\x21\xeb\xdc\xb9\xb7\xc8\x6d\x84\x37\xdd\x94\xf9\xee\x74\x18\x2a\x6b\x0e\x8a\xb7\xc3\x3c\xea\xa7\x96\xc6\xf3\xd9\x44\x08\xd9\x60\xf3\xd3\xe8\x4d\xb0\xa4\x7e\x7e\xf3\xf3\x6d\x6e\x7f\xfc\x70\x55\xa8\xbf\x99\x5c\x3c\x37\x86\x61\x43\xb5\x16\x86\x70\xd3\xca\x99\x37\x63\x4c\xad\x7d\x3a\xda\x58\xef\xa8\x9f\xfc\x11\x22\xa8\x72\xcf\x7c\xef\x47\x3f\xd4\xf3\xe4\x87\x9e\x43\x01\x39\x08\xa8\x87\xeb\x04\xbb\xaf\x01\xd3\x3c\x2e\x6e\x32\xfd\x43\xb0\x44\x5f\x64\x1a\xfa\xfd\xfc\x3f\xe0\x75\xc7\x1b\x6e\x25\xad\x2c\x95\x92\x19\x4c\x94\x93\x92\x09\x7b\x40\x93\x73\x67\x6e\xe3\x68\x47\xfd\xc9\x4f\xf3\x55\xae\xd4\xf7\xfe\xe8\x87\x7a\x3a\xfa\xe3\x81\xbb\xee\xf4\xdc\x6f\x1b\x04\x0b\x71\xb1\x99\x6e\x31\xa0\x57\xb1\x9f\xb8\x80\x63\x5e\xda\x3a\x87\xe3\x93\xdd\x2a\x41\x2b\xa9\x43\x4e\xf7\x0e\xe9\x8b\xd8\xb7\x61\xed\xef\x6c\x64\xf5\x0b\x2e\xd4\x33\x12\xd4\xaf\xf1\x3f\xc0\xdb\x3f\xec\x5f\xe1\x36\x04\x14\xcc\xc7\xfd\x0b\x4a\xc0\xb3\x7b\x38\xe4\x72\x9b\xac\x50\x9c\x69\x8d\x95\x60\x4a\xf1\x86\xfb\x4a\x2e\x2d\xca\xac\x3c\x52\x45\x28\xe5\x0c\x93\xd2\x2b\xe0\xd0\x79\x3c\xc4\xf4\xdc\xd8\xeb\x61\x4f\x49\x09\x29\xcd\x9b\xb2\x86\xfa\xa9\x80\xb2\xa8\x77\xd7\xff\x94\x0b\x89\x39\x11\x42\x60\x41\xe5\x09\x61\x8d\xe7\xde\x2a\xc2\x68\xcd\x2b\x2c\x94\xe7\x46\xfb\xca\x34\xde\x4a\xe3\x44\x29\xb9\x31\x92\x47\x10\xb1\x0b\xdb\x5b\xc0\x57\x1b\xea\xb7\xef\x7c\xa4\x10\xa1\xce\xa1\x6e\xc1\x71\x3d\xf7\x31\x5d\xf0\x28\x84\x12\x5a\x8b\xab\x0c\xd3\x0b\xdb\x1f\x6e\x18\x16\xc1\x6a\xf9\xf4\x82\x12\xf8\xf1\x05\xfd\xf8\x96\xd6\xf2\xf0\x18\x53\x3b\xfb\x02\x46\x1b\xb4\x82\xc4\x7a\x56\xe3\x0e\xa7\x4d\x5e\x57\xfe\xd8\x53\x2f\x36\x64\x99\x91\x09\x6e\x44\xb7\x08\x94\x2c\xdc\xeb\xbc\xa8\xdb\x72\xaa\x4b\xcc\xa1\x09\x3a\xfa\x6a\x8b\xff\x21\xf4\x1a\x4c\xa7\x10\x20\x5d\x33\x18\xde\x7c\xfc\xc3\x3e\xfe\xf8\xf0\x3a\xeb\xff\xd3\x9e\x3a\x3f\x94\x7e\xf6\x47\x05\x11\x24\xa5\x3f\x39\x38\xa4\x2e\x2d\x5c\x5e\xb3\x32\x35\x39\x6f\x1c\xdb\x16\x1e\x43\xbe\x4c\x2b\xa1\x74\x06\x27\x3f\x40\x0f\xa4\x75\xcb\x61\xa1\x45\x56\xbb\x7a\xe4\x44\x44\xe8\xc6\xc5\x2d\xa3\xb7\x41\x17\xb8\xf6\xf9\x13\x6c\x03\xbf\xf5\x4b\x06\xc5\xc7\x95\xc5\xf1\xf9\xfe\xd9\x0b\xe7\x0f\xe9\xec\x27\x31\xcd\x59\xe7\x80\x26\x2e\x49\x5c\x96\x56\x38\x40\x5d\xd9\x57\xdd\x77\x27\xdd\xa1\x02\xae\x27\xa8\x73\x6d\xe8\x9e\x14\x49\x42\x8e\x95\x3f\x49\xc2\x56\xec\x2d\x1a\xe2\x36\xf2\xce\xa9\xf4\x7b\x3e\xdb\xeb\xc4\x4f\xce\xcf\x0d\xb4\xce\xd3\x00\x8e\xd2\x40\xba\x4d\xce\x4c\x2f\x14\x35\x3a\x76\x57\x53\x71\xd1\x2b\x04\x68\x04\xe8\x70\xc1\x7b\x8d\xe6\xc0\x9e\x72\x5f\xc9\xab\x80\x0f\x28\x09\xca\x8c\x5b\x66\x18\x21\xf7\xc7\x95\xa0\x39\x9c\xa3\x04\xad\x79\xb4\xc1\x1f\x76\x4f\x26\x7a\x2d\xfe\x3b\xc2\x76\x5c\x42\x9e\xd8\x04\x5c\x5a\xe7\x59\x62\x53\x6c\xcc\xd5\x1e\xf1\x96\x40\x56\xf8\x69\x6b\xb8\x52\x7c\xe9\x8a\xbc\x6a\xb3\x13\xaf\x39\x8c\x3e\x1f\x8c\x03\xb5\xde\x83\x81\xaf\x78\x47\xa2\x3c\x68\xec\xbf\xfe\xf6\x6e\xb7\xff\xf9\x5d\x60\x7e\x7e\x91\x34\x8a\x9f\xed\xc5\x3f\xc6\xdb\x87\x98\xa2\x1c\x94\xec\x86\x24\x05\xe1\x6d\x8e\x8b\x22\xcf\x13\x9b\x09\xca\x0e\xa5\x57\x83\xcb\x06\x3f\x63\x94\xa4\x89\x6f\xb6\x63\x41\x54\x91\xf9\xe1\x68\xbd\x9c\xb4\xb5\xb9\x3f\xb5\xd0\xa0\x68\x29\x31\xb5\x9c\xe2\x78\x3c\x42\x96\xfb\xe2\x3a\x96\xe4\xff\x2e\x0f\xc4\x33\x36\xa6\xd4\x5d\x07\x29\xf3\xd3\x70\xf4\x23\x81\xac\xef\x04\x06\xe3\x2b\x94\x5b\xee\x53\xfa\x67\x3c\x10\x87\x81\x3a\xd2\x8e\x50\x58\xa8\xce\x4d\x3b\x4e\x61\xfd\x57\x1c\x3f\x15\x6d\xa3\xbf\xb9\x31\x0f\xdc\xab\x7f\xde\xdf\x69\xf7\x37\x83\x26\x9a\x28\xdf\x6f\xf0\x32\x3a\xaf\xd0\xd4\x49\x2b\xba\x9d\x52\x96\x18\xed\x0f\xf6\xeb\x69\x9b\xce\xfd\x44\x8f\x43\x74\x7b\x53\xd7\x98\xc3\xdb\xe0\x3d\x7d\xbc\xf9\xe2\x5f\x45\x72\x1f\x1e\xdf\xfd\xf2\x66\x8f\x3e\xc4\x15\xea\xdd\xe9\xaa\xa0\xcb\x5c\xa9\x3c\x5f\xaa\xc9\x72\xc7\xcc\x66\x0c\xb4\xde\x4f\x93\x64\x79\x53\xe4\x75\x7c\xd2\xb3\x3f\x62\x28\x4f\xc1\x6f\x7a\x0a\xd8\xe8\x62\xe5\x92\x7d\xe6\xcb\x87\x7d\x14\x23\x08\x00\x99\x31\x05\x97\xba\x14\x0e\x9e\x32\x68\x84\x6f\x2d\xf6\x25\x9d\xe6\xdc\xf3\x8d\x0a\x30\x1c\x47\xbb\x08\xaf\x0c\xd4\x28\xf5\x99\xb7\xb6\xb9\x2a\xb3\x57\x1b\x96\x5c\xf0\xe6\xba\x1e\x77\x2f\xd0\xad\x1a\x22\xb8\xe6\x3e\xc7\xc4\x08\xca\xca\xca\x38\x99\x61\x89\x77\xd2\x1b\x29\x34\x27\x5f\xe7\x6d\x9f\x79\x77\x89\xf0\x7c\x9d\x7f\x7a\xcb\x07\x5f\xf3\xb1\xfe\x6c\x84\xd1\x9b\x1b\xf1\x42\x4c\xc0\xa6\x36\x41\x91\xc7\x0c\x94\xf4\xad\x22\x1e\x13\x70\xa5\x17\x31\x61\x58\xd7\x7c\x43\x26\xa8\x7d\x7f\x72\x8b\xf3\xda\x00\x43\x78\x31\xbe\xd7\x50\xa2\x16\x51\x69\x6a\x1d\xf0\x05\x5d\x38\x6b\x87\xe8\xdf\xdc\x6c\xdf\x5f\xde\x85\x5c\xc0\x15\x9b\xfa\x95\xd8\x61\x35\xfb\xbe\x3c\xc6\x07\x5b\x96\x90\x9f\xc4\xec\x67\x48\xa1\x26\xbe\xf2\x13\x51\x14\xe7\x94\x94\xf9\x79\x42\xae\xf3\x9c\x02\xb7\x3e\x41\xce\x94\x05\x6b\x94\x65\x3d\xb5\x16\x72\xdf\x0b\x9a\x9a\x34\xaf\x60\x32\xbe\xed\x94\x9b\xd6\xb3\x5b\xa3\x6e\x9f\xec\x78\x88\xdb\xaf\x18\x1c\x2f\x56\xe6\x9a\x04\xb6\xc9\xca\x4a\x8c\xdc\x65\x39\xca\x0f\x4b\x4b\x51\xd4\x7a\x9c\x26\x8c\x0a\xb2\xd1\x65\x29\x3a\xc8\x72\x8c\x95\xcf\xac\x56\x20\xb2\x14\x53\x7d\xc3\xbe\x54\x17\x1c\x6a\xeb\x9f\x3d\x73\xab\x5b\x79\x0d\xbd\xc4\xad\x73\x42\xd5\x8d\xb6\xb8\x94\x65\xbd\x93\xf3\x80\xa4\x64\x8e\x1b\xa4\xdc\xa1\xea\xdd\x3a\xbe\xfc\x62\xf7\x62\xa3\x6e\x48\xd8\xdf\x78\x07\xe3\x1c\xc6\xd5\xba\x6b\xce\x19\x38\x5f\xa0\x63\xd8\x7e\xcb\x64\x2d\xca\x22\x14\x91\x0b\x41\x87\xcd\x77\xfd\xff\x7a\xeb\x1f\xe5\xce\x1d\x86\x1a\x92\x7e\xe6\xd8\x60\xb6\x91\x5f\x47\x38\x49\x6a\xb9\x86\x41\xd9\xda\x05\xff\x44\xe4\x90\x8d\xb3\xef\xe7\xf0\xeb\x97\x1b\xd4\xac\xb2\xb6\x3f\x56\x90\x0e\xfe\xc8\x6a\x53\xd1\x9d\x3c\xe7\x50\x28\xa6\x84\x81\xc9\x76\x01\xcf\xe6\x3a\x0e\x8c\xc4\x8f\xe5\x80\x3e\xc0\xe0\x9c\x75\x78\x6c\x06\x52\xd9\x0a\x07\x39\x8c\x8a\x39\x61\x90\x1b\x66\x0c\xd1\x10\xad\x6d\xd4\x88\x6d\xd3\x1f\xcb\x12\x7a\x6b\x8d\x25\x43\x73\xa0\x95\xa9\xe8\x36\xfd\x5a\xa2\x42\xb1\x46\x58\x98\xb4\xa9\xed\x0d\xfb\xb3\xb8\xc5\xab\xff\x6e\xad\x50\xbc\xd5\xd9\xfc\xf1\x76\x59\x7d\x08\x08\xb5\x9f\xbf\xbc\x7b\xf3\x88\xe2\xed\xcf\xdb\x0c\xa9\x43\x39\x4e\x47\xdb\x8e\x07\x7f\x20\x90\x37\xdd\x20\x99\x9f\x00\x97\x85\x1b\x7c\xc7\x18\x64\x87\x6d\x6a\x97\xa3\x6f\x5d\x2b\x1a\x77\xe4\x9a\x77\x4a\x42\x05\xd4\x76\x5d\xee\xb3\xab\x62\xdb\x01\x7e\xe6\x81\xb2\xc8\xad\x18\xec\x77\x56\x93\x50\x08\xbf\x8b\xc2\x66\xd3\x68\xca\x12\x9b\xc5\x6c\xc9\x06\x54\xd3\xc5\x5e\xa2\xda\x33\x7f\xe0\x28\x1a\x17\x06\x23\x15\x29\xa3\xf6\xc4\x1a\x05\xdc\xf9\x53\x65\x29\x24\x37\xb9\x0c\x3b\xf1\x3b\xeb\x53\x5e\xd7\x98\x5c\xd7\x67\x92\xd4\x12\xb5\x13\xf3\x80\xfa\x56\xb7\xf6\x80\x84\x69\x70\x6b\xae\x7b\xac\xbc\xb8\xf0\x9e\xff\x68\x8f\x95\x30\xad\x31\xb3\xee\xe9\x04\x9d\xcf\x36\x05\x22\x57\x4b\xa1\xb1\x36\xa6\x11\xc4\x64\x93\x84\x3b\xf3\xa7\x57\x3c\x90\x1f\x3e\x6f\x88\xc9\x72\x34\x9d\x47\x4c\x65\xbb\x93\x25\xc5\xc6\x09\x36\x85\xfd\x8c\xf7\x62\x83\xc3\xab\xf1\x7e\xad\x6d\x7f\xbb\xdb\xbe\x06\x17\x7f\x78\x1f\x4e\xdf\xf5\xf7\xcf\x1b\xaa\x6b\x60\x93\x27\xa8\x3b\xf9\x13\x32\x09\xb1\x54\x26\x0a\x57\x69\xd1\x52\xdf\x32\x28\x2b\x8b\xfd\x51\xcc\x28\x33\xd2\x1a\xdd\x88\x45\x1c\x32\x93\xd5\x0e\x88\x2f\x66\x75\x02\xe6\xfb\xa3\x38\xac\xb9\xc8\xea\x52\xec\x1b\x98\xd7\xfb\x2d\x60\x1c\x44\xab\xce\xba\xaa\xae\xd7\xc5\x58\x1d\xf7\xa7\x76\x31\x04\x1c\xf0\xa2\x49\x73\xa9\x14\xb1\x4c\x8c\x90\x51\x4f\xce\x85\x23\xdc\xca\xc1\x8f\xcc\x96\x90\x1c\x33\x8a\x71\xa5\x64\xe9\x04\x27\xd6\xa0\xa8\x34\x2c\x60\x36\x22\x89\xa2\x90\x57\xf2\xb8\xce\xf3\xb7\xeb\x3c\x37\xdb\x57\x55\xb1\xaf\xa6\xf9\x6b\x3c\x1f\x2a\x30\x90\x2e\x2c\x1e\xfd\xe4\x7b\x34\x50\xcd\x64\x22\x49\x59\x74\xd4\x1f\x18\x64\x75\xcf\x7c\x27\xa1\xd8\x14\x5a\x1a\xad\x9c\xf0\x49\x97\xdb\xdc\x40\xe4\x6d\xa7\x1c\x44\x7e\x1c\x45\x17\x01\xd2\xa1\x2e\xbb\x0c\x37\xea\xab\x7e\x03\x32\xea\x1d\xbd\xfd\x75\xcf\xd3\xa1\x06\x07\xd9\xc2\xe2\xab\xb5\x70\x40\xa7\xa4\x2c\x2d\xd3\x89\xa6\x55\x5a\x24\x9d\xf4\x29\x83\x9e\x1d\x89\xef\x25\xa4\x70\x34\xa6\xd1\xea\xa0\x16\x27\x59\xa8\x9e\x06\xec\xab\x93\x9a\x80\x5c\xa2\x03\x77\x11\xda\xb0\x8b\xde\xd9\xf8\x9e\xd3\x7b\xc7\x10\x79\x1d\xad\x5f\xcb\x20\x37\x0c\xb0\x61\x8c\x48\x46\x72\x46\x89\xef\x74\x5d\x98\xbc\x8e\x13\x63\xf4\xd2\xf3\xeb\x5d\x4d\x51\xca\x85\x2e\x8d\x58\xf3\x74\xea\x3d\xdf\xe1\x6f\x6a\x34\x7f\x90\xa7\xf3\xba\x32\xf3\x9e\xa9\xd3\x2c\xc6\x84\x1a\x9d\xeb\x67\x57\x52\x9a\x97\x79\x99\x57\xcb\x5a\x4a\x75\xfd\xec\xf0\xe2\x9e\xd8\x3e\x3a\x09\xef\x24\xf0\x3f\x75\x8c\x25\x3a\x61\xf1\x01\xb1\xf0\xd5\x9a\x33\x19\x74\xce\xc3\x0d\x83\xf6\xe3\xc3\x23\x7a\x48\x7f\xbe\x53\x57\xa3\x87\xf4\xcd\xfb\x74\xb5\x4a\x83\x74\x83\xe5\xf3\xe6\xfd\xa7\x8f\x9b\xc9\x00\x4b\xb3\xac\x4c\x75\xc6\x08\xe3\x69\x9f\x73\xc6\x6b\x4c\xfd\x49\x40\x86\x99\xe0\xb8\x4e\xfb\x7e\x27\xbd\xf5\xd4\x0f\xfe\xe8\xa7\xab\xf5\x76\x72\x90\x43\x07\x11\xe0\x4b\x34\x6a\xab\x04\xf5\x62\x96\x33\x1c\x94\xe0\x35\x86\xca\x84\xb8\x51\x1d\xde\xeb\x7f\xbc\x8e\x27\x70\x7f\x3e\xfe\xd3\x97\x7f\x7a\xc5\x0f\xf9\xfe\x66\x27\xa3\xf8\xc3\xcf\xd7\x11\xbd\x0b\x55\x35\x60\x6c\x02\x54\x02\x31\x9a\xe3\xc4\xe5\xd6\x63\xed\x87\xf6\x90\xa6\x94\x88\xa2\xac\x3a\xd5\xd6\x94\x31\x9e\x26\x33\x44\x57\x5d\xe1\xa9\x2e\x8b\xa4\xb6\x78\xa4\x94\x6d\x98\x3f\x1e\x08\x91\x65\xe1\x9d\x1f\x38\xe4\xa0\x48\x25\xb1\x1b\xd6\xba\xdf\xd8\x5c\xed\xa8\x1d\x0b\x96\xec\xfe\x43\xd0\x51\x5f\xe3\x22\xdc\x7c\xe8\xdb\x0f\xbf\x6d\xe6\xb9\x82\x16\x04\x3e\x8c\xd0\xa7\xbe\xa8\x85\xac\x12\x9b\x56\xa4\x9b\xb8\x6f\x33\xe0\xdb\xac\xb2\xd8\x19\x52\xfb\xbc\x76\xf5\xa2\x8a\x9c\x9c\x8a\x93\x29\x31\x47\xb6\x74\x65\xd0\xd7\xee\xb5\x8c\xf9\x8d\x2b\xea\x7a\x01\xdd\x6f\x75\x74\xbf\xd5\xdf\xc3\xcf\xd7\x2b\x3d\xee\x20\x29\x73\x9b\x17\xa8\xb2\xe9\xd8\x1f\xb4\xed\x8e\xbe\xa1\x40\xfa\xa6\x63\x64\x82\xa9\xcd\xfc\x88\xc9\x36\xe9\xba\xbc\x75\x66\x39\xfa\x43\xd3\xf1\xce\xf9\x13\xd5\x6c\xd2\x0a\x72\xa8\x97\x04\x52\x98\xfc\x70\x09\x77\xba\xbd\x90\x7d\x89\x86\x50\x7d\xfe\xee\x99\x67\xeb\x75\xc9\xfb\xa7\xc7\xcf\xb1\x76\x49\x1a\xe7\xc2\xea\x43\xde\xeb\xba\x4c\x17\x62\x17\x53\xa3\x42\x2e\x0a\xb5\x19\x1a\x32\x8c\x97\x53\x9f\xd9\x8c\x43\xed\x0b\xa6\x25\x54\x96\x04\x7d\xd1\xc4\x7a\xaf\x6f\x35\x01\x81\x82\x71\xb5\xd0\xaf\x77\x73\x1c\x09\x54\x65\xb9\x2b\x33\x94\x9e\x93\xb8\x7b\xea\xb6\x85\x25\x75\xc5\xb8\xf5\xb3\x8d\x10\xba\xda\x0a\x36\xc6\xd1\xbb\x15\x13\x22\x04\x53\x6f\xdb\x21\x54\x52\x7f\xf9\xed\xf3\x97\x7f\x80\xf5\xf2\x43\x14\x9a\xb2\x29\xd1\x69\xa0\x66\x1a\x78\xeb\xc7\x4b\x14\xf4\xa8\xc1\x33\x46\x7c\x83\x92\x1a\xb7\x8d\xab\xd1\x20\x53\x6e\xfd\xa4\x19\x37\x42\xb5\xb5\xad\xb8\x33\x46\xb1\xaa\x96\xc7\x28\x02\xc8\x37\xfd\x6e\xda\x99\xe8\x61\x95\xc7\xaf\xaf\xb1\x20\x7e\x8d\x89\x69\x0c\x70\x50\x55\xad\x7b\x65\x8a\x62\x39\x2c\xaa\x00\xbc\x33\x85\xc3\x49\x5e\x95\xd4\x35\xb4\x2a\x8b\x54\x86\xdc\x26\x7c\xc1\x9b\x64\xa7\x82\x26\xfe\x6e\xfb\x4d\xe9\xf1\x0a\x67\xf1\xe9\xf1\xe1\xda\x6a\x83\x7d\x0b\xd4\x37\x83\x65\x4a\x3b\x3d\x30\xc8\xb5\x57\x60\xbc\xa9\x60\xd8\x29\x43\x7c\x6b\xab\xae\x31\x8d\x3e\xeb\x38\x54\xc5\x5e\xb7\xac\x85\xb2\xb6\xd5\x3a\xe6\x24\xe4\x79\x3c\x7c\x8b\xad\x7b\x1b\x33\x75\x87\x16\x1c\xf4\x8c\x9b\xd9\xd9\xa2\x5a\x9a\x85\x94\x40\x76\xaa\xba\x44\x22\x2d\x18\xa3\xc3\x4c\x71\x5d\x67\xc6\x44\xb0\x71\xc1\x7e\xa8\xa2\xf4\x86\x05\xbd\x5b\xb1\xa0\x03\x98\xdb\xae\x53\xd4\x54\x93\x3f\x95\x7d\xeb\xec\xa1\xb5\x55\x8d\x6a\xdf\x7b\x5d\x0f\xbc\xd4\xa8\x8a\x4f\xd5\x99\x2e\x53\x59\x77\xee\x86\x53\x7e\x3d\xdb\x24\xda\x06\x4b\x34\xa8\xe0\xbf\xbd\xbb\x2a\xe1\x3b\x52\x43\xce\xfc\xf5\x5d\xb0\xb9\x77\x02\xaa\x1d\x79\xb2\x3e\x69\x51\xb4\x99\xd2\xf4\x49\x2c\xcd\x55\xfb\x0b\xf9\x5b\x9b\x2a\x60\xaf\xff\xcd\x0b\x9b\xd7\x9a\x44\xb5\xa5\x55\x01\xce\x2e\xd4\x82\xc9\x8b\x9d\xa2\xcc\x8b\x79\x06\x83\x57\x3c\x11\x1c\x62\x90\x45\xb4\x0b\xd5\xfb\xef\x7e\x82\x10\x4e\xbe\x0e\x61\xa3\x6c\x65\xb5\x3c\xa1\x08\x43\x4a\xfd\x81\x6c\x8a\xc2\x47\x3e\x39\x28\x60\x71\xb4\x44\xfe\x60\x81\xc5\x24\x42\x91\x8e\x87\xbd\x08\x35\xdc\x7f\x15\x24\x0b\x1f\x22\x58\xc1\x48\x9c\xea\xbd\xa6\xc0\x63\x3d\x43\xa4\xfc\x34\xed\x34\xf1\xf6\x12\x5d\xdf\x97\xc2\xcb\x03\x3f\xde\xec\x5d\x84\x9f\x65\xf0\xd7\x2f\x32\xf8\x09\xe2\x0f\xd1\x76\xa6\xc0\x98\x17\xdc\x3b\x9b\x4f\x83\x00\xbd\x23\x4f\xc6\xa7\x37\x21\x2c\xf4\x3c\xf9\xd1\xa2\x7c\xbd\x93\x48\xa8\xef\x97\xb7\x98\xf6\xc7\x87\x57\xb9\x7d\x3f\x87\xb0\x73\xf4\xe6\x7d\x3c\xcf\x0e\xc6\x44\x68\xae\x33\xc7\xca\xb4\xf4\x87\xc4\x57\x02\x6c\x32\x6f\x33\x60\xde\x3d\x19\x7f\xc8\x5c\xa6\xa1\x42\xdd\xb9\xf2\x46\x02\x8d\xf9\x1a\xbf\xc7\x97\x32\x3e\x06\xac\x8f\x5b\x9d\xfc\xb7\x49\x37\xab\xe9\x24\x21\x77\xd0\x94\x5a\x13\x5a\x70\xce\xb2\xd2\x9f\x12\xaf\x05\xe0\xc4\x1f\x57\x68\x8f\xf3\xb8\xcc\x26\xb5\x29\xeb\x63\x7e\x2e\xd6\x1e\xe4\xf5\x1e\x68\x5f\x8d\x7f\x6d\x7f\xff\xfa\xa6\x09\xcd\xc7\x0a\x0a\x87\xf2\xba\x3c\x08\x97\x37\x82\xe0\xd4\xab\x64\x39\x29\x38\x25\x7e\xbc\xb5\x1f\x4d\x87\xcc\x66\x53\x6c\xce\xb5\x37\x0a\x48\xcc\x6e\xfe\x8b\x0b\xdd\xd7\x3b\xf5\xda\x7f\xf1\xed\x0c\x6e\x04\x0e\xef\xe3\x1e\xa2\xc4\x25\x30\x96\x42\x52\x52\x70\x8e\xd3\xc2\x77\xe9\x71\x16\xfd\x31\x9d\xb7\x69\xd3\xf7\xcd\xf9\xe4\x13\x9b\xda\x94\x76\x31\xf3\xd1\xd2\x4f\xaa\x41\x39\x8c\xf7\x33\x4d\x43\xac\xf3\x59\x4e\x2f\x54\x00\xeb\x34\x34\x54\x0e\x66\xdd\x70\x9b\x3b\x4e\xea\xd4\xb7\x89\x17\x0a\x44\xe2\xfb\x75\x12\x4f\xbd\x37\x59\x9b\x41\x11\x57\xaf\x66\xb1\x45\xd1\x45\x6d\xe6\x9d\xf8\x9e\xb5\xea\x19\x92\xe1\xa5\xee\xec\xf3\x97\xb5\x0a\xe3\x46\x0f\xb2\xff\xf0\xeb\xf7\xac\x55\x9b\x86\xe8\xab\xc9\x78\x0c\x9f\xd4\x9f\x8c\xbc\xea\xf2\x22\x6b\x9d\x9f\x20\xbb\x7d\x9f\x0f\x15\x94\x9d\x31\x90\x99\x90\x73\x9a\x99\x9d\x10\x45\x6e\x94\x58\xac\x90\x3a\xcd\x15\xad\x6c\x96\x36\x52\x20\x2e\x94\xc8\x45\xb9\xe4\xcf\xe0\xab\x61\xdf\x9c\x2e\xf5\x6e\x88\xbb\x80\x3a\xf3\xf8\xe9\x75\xc6\xe9\x9b\xc7\x87\xf7\x71\xb4\x9c\xb6\xc7\x44\x18\x69\x32\xad\xeb\x24\xcb\x16\xd9\xc4\xb9\x5d\x3a\xdf\xe7\x2e\xc7\x1c\xec\x39\x5f\xdf\x89\xc8\xde\xf9\x9d\xc2\xfe\x78\x1b\xb4\xf0\x08\xf6\x08\xd0\xf6\x2a\x55\x74\x80\xd1\xa1\x68\x39\x25\x19\x08\x48\xf5\xc9\x1f\xac\x6f\x29\x34\xc4\x57\x9b\x11\x1a\x2f\x73\x4b\xb0\xef\x7d\xab\x81\x40\xe6\xed\xc9\x40\x0d\xfd\xb5\x6d\x1d\xe9\x60\x33\xfd\x6d\x14\xc1\xf5\x6a\xfc\x39\x7a\x77\x3d\xc4\xf0\x21\xda\x08\x2a\x6c\x7b\x82\xa8\x53\xde\x0c\xad\x9f\x34\x90\xcd\xd0\x39\x7a\x5a\x88\xb7\xcc\xf4\x48\x2f\x93\x3f\x4a\x20\x81\x23\x24\x32\xbb\xd3\x4e\x06\x0f\xfe\xe3\xe7\x2f\x1f\xff\x8c\xa0\xe2\xba\xc7\xae\x43\x35\x60\xd3\xc4\x25\x29\x2a\x4a\x69\x18\x2b\xa4\xa8\xcb\xdc\xcb\x62\x18\x34\xc8\xd2\xcb\x6d\xea\xfa\x43\xb3\x68\x2f\x55\xea\xd2\x1a\x14\x68\xaf\x7d\xdd\x0a\x28\xd1\x8a\x21\x82\x9a\x0b\x09\x1c\x52\xdb\x70\x62\x56\x6b\xfb\xf1\xe1\xdf\xc3\x3f\xc0\x7e\x8d\x0c\xfe\xf1\xc3\x97\x87\xf7\xb1\xe6\xb5\xae\x59\x06\x55\x3d\x42\x05\x15\xf6\x6a\x1c\xb1\x10\x65\x35\xb9\x5d\x2e\x0d\x31\x72\x99\xce\x33\xc7\x8e\x2b\x25\x29\x6e\x90\x8e\x50\x88\x55\xb7\x1b\x1d\x62\x6c\x2f\x6d\xff\xb2\xb9\xb6\x9d\x7f\xd8\xed\x3f\xfc\xf6\xf0\x1e\x6a\x2d\x99\x32\x04\x34\x83\x0c\x8e\x88\xd4\x8b\x58\xda\x83\xd4\x0c\xa2\xd3\x46\x13\x26\x05\xf6\x87\x45\xd6\xa5\xb1\x94\x5a\xbe\xf2\xb8\xa2\x48\x5f\xdf\xec\x0d\x8d\xb6\xc1\xa3\xf9\x5d\xdb\xbf\x7e\x58\x87\x0d\x8d\x24\x1a\x2b\x0d\x8a\x41\x01\x23\xca\xc9\x62\x7c\xeb\x0f\x62\x2a\xab\x79\xda\x50\x65\xb0\x56\x5e\x2f\x27\x52\xb7\x5c\x8c\x84\x68\xb0\x11\x8a\xcc\x3f\xdf\xf6\xf6\x8f\x1f\x7e\x7b\x78\x84\x46\x61\x53\x2b\x0d\x1d\x85\x02\x7a\x14\x91\xa5\xf5\x9d\x1f\x84\x9f\xaa\x12\x72\x7f\x6d\x5e\x13\x2d\xbd\x5d\x26\x52\xb7\x4c\x0c\x6b\xf3\xa1\xa6\x9c\x07\x8c\xb4\xbf\x20\xf3\x54\x31\xc1\x54\x06\x79\x7d\x02\x06\x02\x7b\x3c\x9f\xa8\x90\x65\x75\x52\xbb\x4c\x28\x61\xe4\x32\x2f\x11\x23\x4e\x48\x21\x08\x31\x48\x47\xdb\x78\x88\x8a\xbd\xd8\xd1\xe7\x8a\x82\x7f\xfc\x06\x05\xf7\x1b\xbc\xe5\x3b\xd6\xca\xeb\xe3\x1c\x0f\xa0\x75\x60\x8f\xc2\xbe\x03\xe3\x85\x0e\x00\x96\x1d\x60\x2f\x87\xae\x83\xba\xf3\x49\xf8\x63\x3b\x06\xb8\xda\x4a\xe9\x71\xd4\x0a\xf5\xca\x53\xe7\x9c\xc7\x2b\xf9\x2d\x42\xd1\x85\xee\xdd\xf6\xf0\x9d\x0c\xd7\x39\xe6\x21\x1a\xf5\xe5\xe1\x3d\x9a\x39\xd6\xb5\xa8\xa1\xc6\x33\x70\xd0\xd8\x97\x7e\x3e\x51\x2e\xd8\xb1\xdd\x1e\xb4\x25\xc6\x78\x7c\x9e\x18\xb1\x5c\x49\xa1\x1b\xd4\x44\x51\xb4\x01\x7b\x71\xbb\x28\x9e\x5f\xcd\xf0\x15\x7a\xfa\xb7\xff\x5f\x5d\x1f\x37\x58\xf0\x7f\x77\xbd\x39\xd0\xa4\xf2\xe2\x94\x15\xba\xcc\x81\xfa\x97\xab\x8b\x9d\x67\x53\x94\x62\x02\x1d\xee\xad\xf0\x89\xe7\x02\xe3\xba\x2a\x08\x91\x42\x09\x29\x24\x47\xae\x2c\x68\xdf\x0a\x71\x12\x62\x12\x51\x1c\x1d\x6f\x3c\xa0\xdb\xe8\xe7\x97\x5d\xfe\xdb\xe3\xc3\x1f\xf6\xbb\xed\x5a\x06\xb1\xfd\xf8\xf0\x1e\x06\x85\x15\x96\xd0\x6f\x52\x92\xf9\x29\x1f\xaa\xb3\x5e\x0e\xd6\x6e\x66\x26\x88\xe0\xe9\x53\xa5\xca\x34\x31\x7c\x93\x92\x27\x12\xb8\xdd\xfa\x88\xee\xfa\xd0\xee\xdb\x50\x31\x70\x6b\xf9\xcd\xc7\x6f\xf9\x1a\x6f\x48\x2f\x21\x74\xbf\xad\x58\xad\x2a\x9a\xe9\x8a\x14\x89\x4a\x8b\xbc\x51\x35\x10\x5a\xcb\x9a\x78\xa1\xcb\x4a\xe3\xcd\x2c\x74\x65\x84\x9f\x16\x5e\x55\x6d\x3e\x55\x65\x4d\x50\x63\xbb\xea\x60\xf3\xdc\x9f\xba\x62\xe5\xfe\x9e\xa2\x61\x97\x6d\xee\x58\xed\xdf\x32\x04\x4e\xcf\x88\xd3\xd7\xcf\x46\x9c\x19\x4a\xaf\xc6\x38\xa4\xeb\xfb\x28\xa3\x61\x27\x37\x26\xf8\x99\xaf\x3a\xd4\xe3\x33\x5e\x67\xc8\x55\xdb\xb4\x27\xa4\x2f\xd1\x38\x42\xb9\x44\x50\x8d\xe3\x26\xd1\xda\x4f\xa1\x3e\x08\xd2\x1b\xee\x8a\xbb\xd5\xa0\x6e\xa3\x3f\xbc\x9c\x90\x7f\xf8\xd6\x64\xbd\x4a\x35\xa6\xbc\xd6\x15\x07\x8b\x4e\x84\x52\x55\x18\x5a\x2e\xce\x97\x5a\xef\x44\x00\x9b\xf9\xd3\x2c\x78\x6a\x53\xbe\xa5\xf6\x2b\x8e\xe2\xe0\xb3\xe5\xc1\x0f\xfe\xaa\xdd\xef\x50\x72\x42\xbb\x33\xc7\xa6\xe6\xd0\x20\x42\x69\xe0\x5d\x2a\x3d\x5e\x66\xe7\x76\x4a\x28\xaa\x45\xfa\xa7\x99\xb3\xc4\x24\x6c\x6d\x38\xe8\x81\xa7\xa8\xda\xb9\x6d\x1a\x6d\x6f\xc8\x34\xd7\xb5\x7a\xfc\x14\x6a\x1c\x5f\x87\x5f\xbf\xfc\xf2\xee\xf3\x96\xd4\xb9\xc9\xab\xd6\x5b\x64\x4c\x8e\x85\x10\x94\xf3\x86\x36\x8c\x73\x49\x70\xb1\x4d\x29\x2f\x05\xf5\x46\xeb\xbe\xd1\x46\x28\xd1\x6a\x69\x1a\xc1\x09\x26\x22\xba\xe7\xc9\xf2\x1d\xff\x76\x1e\xbf\xfd\x60\x1e\x27\x71\x3d\x5e\x20\x90\xa6\xa4\xe6\x39\xaf\x2b\x9f\x78\x6e\xcc\x8e\x0b\x45\x94\x48\xbe\x15\xd0\xca\x13\x16\xd5\x9b\x68\xdb\x5f\xdf\xb0\x37\xb7\x38\xf9\x0d\x92\xeb\x10\xe7\xbe\x6d\x4d\xe9\xad\x2f\x71\xdf\xf8\x61\xdb\xdb\x73\x5a\x14\x46\x10\x97\xe7\x9b\x1b\xbf\xf6\x5a\x97\xd8\xfc\xb8\x2e\xf1\x3f\xc2\xad\x2e\x51\xba\x73\xed\x10\x76\xa5\x97\x9e\x10\xb0\x40\x66\x90\x6b\x5d\xa2\x43\xcd\x72\x04\xeb\x29\x2a\x8f\x99\x3f\xf9\xa1\xb6\xd5\x29\xe3\xd6\xb5\x01\x1f\x91\x6f\x8a\xbd\xdd\xd5\xeb\xbe\x7c\x15\x77\xac\xb6\xe6\x56\x80\x48\x16\xb5\xab\xcd\x6c\xcc\xbc\xe2\x92\x55\x7b\x12\x0f\xc1\xce\x58\xc1\x3a\x5e\xa4\xb4\x6b\x3d\x76\x68\x26\x84\xc8\xc2\x94\x65\x5c\x9d\xa3\x8d\x3d\x0f\x94\xe5\x2e\xaf\x02\x67\x5a\x13\x1f\xe3\xe6\x07\xb2\x30\x71\xe6\x0f\x07\x97\x79\xed\xab\xbc\xb5\xbe\x8f\x1b\xbb\xb4\x65\x65\x0c\x6b\xf2\x02\xdd\x7c\x20\xfc\x72\xd5\x07\x92\xfb\x58\x9f\xfd\x84\x6d\xdc\x79\x01\x87\xa7\x01\x7a\xaf\x76\x89\xfd\xda\x5a\xbb\x25\x6b\xbe\x78\x73\xd1\x7b\xf7\xe7\xff\x06\x8d\x1b\xe7\x23\x54\x3c\x25\xa8\xf4\xd1\xb7\xff\x26\x2e\x7f\xa7\x1f\x15\x9f\x3c\x81\xf1\xc9\xc2\xc9\xb3\xef\xfa\x89\xa2\x6a\x83\xb7\x7d\xb0\x77\x1e\xef\xc8\xed\x9f\xaf\x77\x72\x81\xd2\x43\x97\xcd\x7e\xc8\x25\xef\xae\x6b\x5c\x31\x6b\x78\x53\x14\x9b\xeb\xd9\x2c\x2e\xfd\xb6\x0a\x98\x63\x7f\x7f\xe3\x30\xdb\xff\x97\x1b\x68\xdb\xfb\x87\x67\xe2\xf6\x17\xd0\xb6\x4d\xcb\x73\x93\xf8\xc9\x77\x99\x33\xf3\x6c\xe7\x59\x65\x45\xce\x2c\x03\xd7\x06\xcc\x8c\xda\xe6\x19\x38\x74\xba\xda\x0d\x4b\xea\x75\x4e\x08\xe0\xbb\x07\x2a\x8c\x75\x9b\x7e\x23\x93\x3b\xfa\xef\xfb\x6d\x8e\xe8\x08\xd1\x22\xe6\xe9\xf5\xe4\x00\xd1\xa8\xda\x16\xeb\x1e\x0e\xff\xfd\xf3\xba\xbd\x47\x1a\x89\xa0\xa1\x0e\x5e\xe5\x56\x4d\xd7\xe9\x95\x65\x65\xec\xf3\xfc\xe8\x85\xec\xd5\xae\x8a\x7e\x8a\xfe\x36\x44\x0e\xdf\xde\x19\xa8\x03\x4f\xf4\xf6\x75\x5e\xe9\x4b\x82\x65\x7c\xba\xde\x5f\x32\x1e\x4c\xa8\xb0\x9a\x2c\x24\x47\xea\x67\xdf\xd7\xa2\xc7\x99\xc9\x70\xe5\x8f\x47\xbe\x49\x4e\xcb\xd1\x53\x3a\x83\x85\x04\xcd\xcb\x00\x8d\x3f\xce\xbe\xa7\x52\x6b\xe6\x6d\x91\x93\xb6\xbc\x44\x55\x89\x79\x84\xe2\x3c\xe0\xda\xcb\xe8\x6f\xc2\x28\xbe\xad\xe9\x79\x3d\x88\xff\x0e\xeb\x28\xf2\x10\x36\x3e\x9f\x1c\x9c\xca\xda\x91\xd2\x57\x0e\xaa\x23\xf7\xb3\xd7\xf8\xd0\xd3\x22\x69\x52\x82\x7d\xeb\x4f\x76\x7b\x33\x60\x15\x2f\x95\xf5\xc6\x6b\xe6\x54\x2b\xbd\x29\xf2\x9c\x0f\x95\xef\x31\x5e\xe3\xc6\x1b\xd4\xff\x45\x7e\x51\x11\x37\x67\xea\x10\x5f\xec\xf5\xe3\xbb\xcd\xf4\x94\x7d\xcf\x2f\x8a\x02\x6e\x93\xde\x15\xd1\x4f\xc1\xd3\xfa\xf6\xf1\xce\xea\xfd\xbd\x81\xf9\xf9\xcd\xfb\xd5\xc0\xdc\xeb\xb3\xf0\x83\x6d\x14\x24\x83\x03\x9b\x08\x4b\x58\x26\x48\x99\x96\xc9\x9c\x78\x29\x81\xa6\xc3\xae\xb0\x8b\x5c\x26\xcf\xe8\x0c\x0a\x32\x74\x5a\xfa\xeb\x8b\x74\xd6\x7e\xca\x5c\x86\x3b\x44\x97\xcc\x0f\x12\x12\x64\x43\x0d\xf7\x8d\xbf\x21\x7d\x41\x4f\x78\xa6\x16\xdf\x2a\x5a\x82\x39\x77\x7e\x36\x5a\x40\x53\x56\xd7\x7b\xfe\x6a\x3b\xe4\x5e\xd1\x23\x30\x88\x50\xc3\xe9\xfd\x4c\xaf\x9c\xfa\x7f\xb3\x46\x10\xee\xe8\xa1\x0f\x8f\xbb\xd6\xb9\x73\xe7\x20\x72\x90\x6c\x86\xaf\x52\x6e\xd3\x27\xbd\xcb\xff\x74\xbc\xd5\x78\x47\x2a\x1e\x76\xec\xc6\x84\xbc\xc6\x0d\x7e\x7b\xbe\x4e\xa0\x5e\x51\xb9\x70\xe6\xad\xc7\x55\xdb\xf8\xc3\xc6\xc1\xc1\xd7\x76\x31\xc2\x18\xee\xf2\x32\x80\x05\xc2\xa6\x8b\xc4\xde\x84\xbc\x92\xb5\x0e\xe3\x16\xc5\xfd\x14\xe8\x50\x7e\xdd\x47\x4c\xea\x35\x26\x7c\x82\x94\x32\x0c\xf9\x8e\xca\xb2\xf0\xc4\x2c\x05\x1a\x0d\xe8\x2c\xb5\xc5\xca\x47\x84\x43\x3d\xdc\xcf\x81\x4d\xed\x43\xc8\xc8\x7c\x69\x2c\x6e\xfd\xd1\x8f\x34\xee\x41\x09\x7f\xf4\x4d\x5c\x9c\x47\x77\x1e\xe3\x22\x2e\xd3\x44\x17\x44\x55\xb9\xef\xec\x32\xa1\xcc\xde\xb9\x25\xd1\xb8\xfa\x85\x36\xdb\xb7\xcf\xcd\x84\x3c\xd8\x48\xf8\xd9\x4f\x71\x79\x1e\xdc\x79\x88\x4b\x1f\xd1\xb8\x44\xa3\xc2\x79\x67\x7d\x03\xd4\x36\xb9\xb9\xd7\xc1\xa3\xd5\x36\xfb\xfb\x97\x76\xee\xdc\xbb\x61\x88\xd7\x16\x37\xdb\x0f\xf9\x4e\x90\x30\xa8\x68\x31\x90\x82\xa3\xbe\xf6\xa3\xf3\xb3\xaf\x39\x58\xc8\x16\x8b\xa6\xeb\xbb\x51\x22\xbb\x53\xb6\xc8\x9c\xed\x79\x63\x20\xf3\x12\xe4\xc9\x69\x39\x58\x93\x26\x76\xe5\xc4\x24\x1b\x76\xc7\x2a\x7e\xfb\x1d\xb6\xd3\xe7\x4f\x2b\x38\x92\x89\x5b\x1f\x20\xaa\x98\xd1\x32\x57\xba\x2a\x03\x02\x3a\xdb\x65\xd6\xa7\x76\x29\x04\xcb\x5c\x5e\x54\xa8\xb5\x70\xba\xe1\x89\xaa\x5d\x74\xc7\x57\xfe\x33\x6c\xaa\x4f\xa1\x2c\x3c\xce\xfc\x08\xd2\x6b\xcc\xa4\xc8\xa5\xca\x3c\x07\xeb\xdb\x5d\x64\x97\xd9\x2e\x44\xd2\xdc\xe6\x0c\xe9\x95\xb4\x1b\x22\x7b\xd5\x87\xe2\xee\x8e\x09\xfc\xe3\x71\x02\xde\x9a\xa5\x45\xe3\x52\x30\x15\x06\x5a\x16\xe7\x36\x26\x0b\x8b\x3b\xeb\x67\xeb\x8d\xa4\x85\x2d\xf2\x0a\x88\x5d\x39\x34\x63\xd4\x84\x5c\x7f\x11\xfd\x14\x72\x44\x83\x4f\x6f\x8d\x89\x45\x5f\x7e\x27\xa0\x1f\x9c\x7d\x95\xad\xb9\xad\x2a\x09\xe9\x09\x9c\xe9\x3a\x66\x08\xce\x09\xa9\x2b\xcf\xa8\x22\x06\xab\x9d\xc8\xfd\x3c\x7d\x9d\xe2\x99\x61\x05\xac\x84\xce\x63\x7b\x4e\x42\x50\xb9\x28\xe3\xd1\x0e\x13\x9d\xc6\xbb\x3f\x08\xc7\x22\xbc\x27\x77\x44\xf1\x8f\x6f\x6f\x9e\xf8\x5b\x7c\xee\xcd\xa3\x82\x24\xaf\x2d\x2e\x26\x21\x0f\x8a\x09\x69\xa5\x60\x80\x47\x9f\x6d\x95\x64\xa5\x34\xc6\xcf\x9d\x31\xc6\xc8\xf3\x21\xce\x2c\xd6\x13\x5a\x75\x11\x75\xc1\xa8\x8b\x0f\xc1\xaf\xf6\xf0\x9c\x01\xbb\x46\x41\x43\xf0\x0a\x3a\x23\x98\xd2\xd4\x29\xae\x2d\x28\xad\x67\x3b\xc7\x07\x4c\x95\xc0\x9a\x4a\xa5\xd9\x25\xa2\xa7\x51\x0c\x11\xa0\xf1\x2a\xab\x58\xff\xf3\x6b\x10\x97\x9b\xd4\x73\x98\x7c\x26\x5a\xc5\x73\xad\xea\x7a\x19\x50\xe9\x8b\x58\x9b\x4b\x64\x7d\xcb\xc3\x66\xc9\xa1\xb2\x10\x45\xcf\x7e\x71\x11\xb3\xfb\x7e\x79\xfb\xe7\xfb\xe5\xd3\x23\xf0\x6d\xb9\x0c\x71\x72\x9e\x89\x36\x3a\x37\x86\x5c\x0f\xd2\xe2\x62\x66\x8e\xc6\x1f\x04\x4b\x5d\xc6\x20\x33\xc7\x28\x8e\x6c\x8c\xf7\x62\x67\x42\xa6\xc7\xdf\x7d\xef\xcb\x84\xeb\x71\xfa\xff\xae\xec\xeb\x9b\xbc\xca\xd1\xec\xbe\x72\x17\xe7\x59\x01\x1a\x4a\x48\xc4\x25\xf2\xa3\x37\xdc\x9f\xbc\x23\x60\x76\x86\x71\xdf\xf4\x3d\x50\x42\xbc\xd3\x9d\xea\x95\x14\x3d\x53\xf2\x96\xfb\xf3\x97\xf6\x79\x9c\x6f\x22\xcf\x50\xe4\x23\xc2\x5b\x9b\x37\x4d\xb9\x1c\x51\xee\xeb\x97\x7d\x5e\xd8\xe2\x79\x9f\xa3\xa8\xbd\x1c\xe2\x34\xae\x6e\x56\xc7\x6b\x04\xdc\xd4\xf9\xa3\x73\xd7\xfb\x3d\xae\xce\x4e\xe8\x58\x2e\x0e\xc6\x28\x8a\x21\x8a\x9b\x5d\xbb\xc3\xcf\x2f\xd4\x5d\xdf\xbc\xc9\x72\xd7\x36\x4f\xae\x81\x2c\xd6\x67\x19\x98\xcc\xf1\xc2\x50\xba\x9c\x90\x9b\x15\x57\x11\xc4\xf8\x5f\x20\xff\x58\xc5\xce\x1f\xae\x77\x00\x31\x92\xe7\x4a\xd5\x3e\x81\xd9\xd7\x31\x33\xd3\x55\xfe\x34\x73\x39\x86\xc2\x4c\x41\x17\xc3\x81\x5b\xfe\x5f\xbf\x92\xcb\xfb\x9b\x38\x44\x7c\xf2\x14\x8e\x3e\x77\x21\x94\x46\x77\xb9\x5d\x3a\x73\xb6\x31\x37\x08\x47\x3f\x05\xfc\x95\x15\x2f\xe5\x8e\x08\xf0\x8f\xcf\x9c\x0e\x37\x2b\xfe\x66\xc9\xbf\x5f\x4b\xa8\xef\x48\x5f\x8f\x2b\xfd\xd2\xa7\x17\xd6\xee\xf5\xcf\x6f\x38\x88\x7b\x28\x4c\xf8\xe5\x47\x13\x7e\x91\x00\x66\xe0\x1c\x64\x8d\x74\x90\x99\x73\x66\x36\x85\x5e\x06\xad\xaf\x36\xde\xfd\xb3\x4b\x84\x90\x52\x72\xce\xb9\xf3\x9a\x07\x08\x08\x6f\xfd\xb1\x69\xa1\x18\xce\xa7\xb2\x8c\xd3\x61\x05\x64\xa3\xeb\x99\xab\xb7\x6c\x47\xef\xd5\xe1\x6f\x6e\xaf\xe3\x7a\x99\xec\x77\xfb\x60\x13\xbf\x7f\x9b\xc6\x1f\x7e\x7e\xf8\x74\xbd\x5f\xfe\x35\x7c\xfb\xd5\x6f\xb7\x15\x54\x1a\x7a\x0e\x3d\x63\x55\xde\x16\xbc\x72\xdc\x72\x5e\x96\x6d\xbe\xfe\xa8\xe1\xe0\xd0\xe0\xe2\x67\x5c\x03\xb3\x64\xbc\xcc\x13\xcd\xd0\xa1\xf3\x91\x3f\x55\x90\xc2\xac\x97\x8c\xe0\xfb\x97\xa9\x3f\x56\x90\xa0\x48\x1b\x54\x2d\xfd\xf5\xb3\x72\x6b\xe3\xad\x0c\x31\xb8\xff\x70\x47\xd7\x5c\xef\xbd\x7f\x84\x0f\xd7\x73\xfd\xfe\xf5\xff\x3f\x7d\x7c\x78\x73\xb5\xe6\x6f\x9f\x6d\x24\x25\x63\x55\x21\x32\x6b\x9c\x71\x96\x73\x1b\x88\xf9\x1d\x94\xd6\xee\xd8\x12\xd9\x05\x33\x66\xb3\x0a\x99\x00\x2b\x98\xa0\xf9\xac\x62\x65\xe3\x68\x89\x90\x58\xcc\xfa\x59\x71\x3e\xe7\x90\x4f\x44\x9f\x71\x16\xff\xe3\xcb\x48\xae\x9b\xf1\xc7\x83\x78\x7c\xf8\xf8\x77\xf0\xfe\xe1\xba\x53\xf7\x84\x31\xce\xca\x2a\xe3\xda\x68\x2b\x84\xd5\x1a\xb2\xeb\x47\xa9\x32\x2f\x77\x74\x29\xcc\x92\x31\x96\x88\xeb\x43\x1c\x97\x67\x1a\x37\xe6\xfa\x58\xdc\xcb\xaf\x10\x5e\x8a\xf3\x9c\x90\xeb\x58\xba\x0b\xde\x37\xff\x8f\xc6\x42\x29\xa3\x15\x49\x95\xd3\x8d\x65\xcc\x36\xcd\x2a\x15\xe7\x68\x91\xef\xe8\x92\x99\xa5\x64\x2c\xc7\x57\xb5\x22\x2e\xce\x3c\xb6\x06\x4d\x4b\xf6\x4c\xea\x40\x97\x6c\xc9\x33\x72\xbd\x1f\x59\x94\x20\xb1\x4b\xa3\x5f\xc2\x1b\xfd\xfe\xe1\x9e\x1d\xbf\xea\xf3\x57\x33\x40\xc0\x7c\x70\x8e\x91\xec\xe8\x4f\x39\xa3\xce\x35\xbb\xd4\xf8\xd2\x2c\xa7\xbc\xd0\x92\xb8\x2c\x47\xb5\x81\x21\xe8\xf6\x75\xd0\x9d\xee\xc8\x05\x7f\x69\x6f\xfe\xd9\x57\xf7\xbd\x89\x24\x83\x93\x86\x19\xe3\x2a\x1f\x73\x5d\xf6\xca\x2a\x5d\xe5\xc3\xf5\x47\xe9\x14\x83\x43\x1f\xd7\x7d\xcc\xd1\x69\x49\x03\xea\xe5\x82\x45\x99\x5d\xf7\xa1\xd1\x3e\xf1\x53\x05\x39\x4c\xf4\xf5\x97\xf7\xcd\x49\xcd\x5d\x99\x8e\x62\x34\x87\x98\xed\xff\x0b\xe3\x8d\x53\x02\x07\x0e\x3d\x21\xb7\xc3\xc4\x2c\xe3\x55\xde\xe6\xac\xb2\xdc\x72\x02\xca\xa2\xde\xc5\xf4\x9e\x64\xaf\x17\x72\x3b\x4c\x5a\xad\xe3\xcd\xe0\x44\x5e\x7f\x19\xc6\x9b\xc2\x4c\x34\x92\x4b\xf8\x84\x18\x3b\x8e\x9b\x4d\xbb\xea\x6f\xb7\x78\xc2\xab\x40\x64\x00\x3f\xb8\xaa\x84\x31\xaf\x4d\xb8\xcc\x9d\x64\x94\x19\xd9\xb0\x41\xf8\x01\xc4\xf5\xd4\xaa\x4d\xab\xf2\xf4\x68\x2a\x29\xb5\xa4\x8b\x45\xf2\x12\x35\xaa\x87\xd2\xf4\xb9\xc9\xd7\x7c\xd6\xe3\xf5\x9e\xdc\xd8\xf0\xaa\xbf\x5b\xeb\x78\xdf\x07\xe6\x80\x8f\x0f\xeb\x1b\xbf\xf6\xba\xd7\xe9\xd1\x2e\xc7\x0c\x55\x76\x39\x39\xc5\xb4\x35\x8a\x69\x03\xa3\x29\x7c\x01\x07\x66\x58\x1c\x2d\x39\x1a\x99\x94\x9a\xcd\x4c\x0a\xc5\x6e\x7a\xc3\x2d\x1e\x77\x7f\x43\xbf\xb1\xbe\x56\x66\x9c\xdf\x82\x1f\x63\x2f\xec\x57\x62\xe3\x2c\x2f\x9a\x2a\xf7\x8d\xf4\x93\x97\x0c\x38\x9a\x40\x40\xc9\xfd\xc1\xbb\xed\xe4\x47\xd7\x40\x59\x95\x15\x21\x1d\xb3\x5c\x13\xcd\xb4\x34\x3c\xba\xe1\x22\xf5\xf1\xfc\xcf\xe1\x46\x7f\x7e\xf3\xf8\x9a\x47\xad\x83\xda\x5c\x0d\x85\x56\x31\xce\x8d\x6c\xd9\x2c\xfd\x88\x94\xc1\x44\x52\x9f\xb2\x5a\x56\x1c\x31\xb0\x9e\xeb\xd4\x1a\xad\x85\xaf\xa0\x39\x38\xd5\x43\x04\x63\x69\x79\x2d\x39\x17\x58\xf0\x28\xde\x44\x17\xbc\xd7\xf1\x18\x6d\x6f\x32\xbc\x69\x45\xdf\x4b\x72\x73\xb0\x8a\x29\x1b\x67\x69\x6f\x97\x39\x43\xb9\x5d\x9c\x11\x54\xe9\x78\xa4\x42\x2a\xea\x53\x93\x79\x01\x92\x1a\x8a\xd4\x62\xa1\xa2\x5c\x08\x1a\xed\x50\x1a\xde\x32\x11\x72\x4f\x8a\xc0\x9a\xf7\xff\x7f\x46\x06\x78\xa9\x12\x5c\xd9\x60\xde\xaf\xd5\xac\x0f\x1f\x3f\xc7\xcf\x14\x80\x9f\xff\x1b\xbc\xff\xf8\xf6\x0f\xfb\x8f\x9f\x56\x17\xc3\x1d\xec\x32\x30\xe5\x35\x2e\xcf\x21\x62\xd5\x69\xa8\x8a\x54\x67\xca\x0f\xbe\x17\x39\x0e\x49\x4e\xf5\xd0\x15\x94\xb1\x23\xf7\x1d\x4d\xd8\x31\x11\xd0\x95\xb9\x48\xb4\x29\x70\x25\xcb\x0a\xe3\x34\xdb\x89\x92\x91\xf3\xb0\xb4\x79\x9a\x26\xae\x1a\xaa\x92\x23\xb1\x4c\x97\x88\x1f\x61\x88\x4b\xe1\xab\x71\x1c\x97\x81\x8b\x24\x15\xec\xb8\x58\xa9\x8b\x22\x2f\x52\xc1\x0e\xb9\xe6\x49\x56\x16\x11\x20\x77\xc1\x5b\x7a\xb7\x55\x76\xfb\xeb\x99\xfc\x16\xef\xfb\x7a\x37\xed\x3f\xfc\xba\x4d\x6a\xc6\xbb\x4e\x51\x56\xd5\x96\x69\x76\x64\xd3\xa9\xad\x20\xdb\x29\x53\xe4\xde\x19\xe6\xac\x51\xe2\xdc\xc7\xd9\xe9\x20\x21\x07\x61\xa0\x2c\x6d\x79\xdd\x87\xdb\x24\xd4\xdb\xc8\xdf\xdf\xe7\x2b\xae\xd5\xde\xa4\xca\xfa\x36\x07\x61\x3d\x95\x94\x71\x4e\x34\x67\x42\xa1\xcc\xe6\xcb\x04\x27\x62\xe9\xc6\x3d\xe9\xb8\xa3\x52\x2a\xe6\x05\x53\x42\xb3\xeb\x39\x12\x7f\xa9\xfd\xf8\xde\xfe\xec\x16\x97\x21\xe9\x96\xb6\x77\xbc\xed\xb2\x83\x15\xae\x45\xd2\x96\x8b\x45\x58\x58\xb9\xc1\x4f\x43\x6c\x85\xd5\xad\xf4\x8e\x29\x6d\xaf\xfb\x7b\x5b\x46\xd3\x5e\xef\xf8\x5f\x1c\xbf\x4c\xa5\xf6\x7d\x06\x44\x7b\xc3\x29\xa5\xbc\x16\x94\x30\x11\x57\x26\xf7\x0c\x14\x36\x24\xe6\xe7\x0e\x75\x58\x70\x89\xfd\x48\x04\x97\xe4\xda\xfe\x9a\xe3\x2d\xa2\xbf\xbd\x65\x50\xbd\xdb\xdf\x53\x1d\x1f\x3e\x3e\x7c\xfe\xa6\x0b\x9d\x29\x23\x65\x6e\xa5\xa9\xbc\xa2\xa5\x2a\xa9\xc5\x85\x2a\x30\x2a\x4c\xb9\x8c\x30\x17\xb9\xcd\x8b\x8d\x7b\x32\x59\xdc\x99\xb6\x68\x8d\x2f\x74\x5b\xb4\x3a\xba\xcb\xa9\x79\x2d\xa7\xed\x77\xf3\x58\x33\x88\xf7\x36\xf5\x93\x5b\xda\x0c\x71\xb7\x1c\x0e\x8e\x37\x87\xb1\x65\x87\x11\x49\x5b\x2d\xee\x2a\x27\xb1\x21\x41\x4e\x46\x3a\xe1\x9d\x6a\x64\x27\x57\x7e\x10\xbc\x57\x71\xf9\xfb\xed\xaf\x36\xcb\x5e\xa4\xbe\x70\x4f\x7d\xb6\x21\x6e\xc9\xa6\x9e\x0d\x93\x39\x1e\xf8\xe1\x08\xb9\x29\xfc\x11\x52\x66\x18\xc2\x4b\x8f\x0a\xae\xa4\xe6\x84\x5d\x2d\x98\x15\x9f\x9e\x6f\x92\x5d\x1e\xa4\xf4\xef\xaf\xf7\xcc\xf7\x21\xf7\x40\x38\x71\x57\xb6\x75\xac\x12\xd1\x12\x91\x29\x52\x67\xa5\x9f\x12\x6f\x64\x88\xbc\xc7\xf5\xe2\x5c\xf0\x4a\xec\xf2\xa5\x9d\x72\x97\x63\x0b\xb9\x2f\xfc\xac\x67\x60\x4b\xb2\x10\x19\x17\xcb\x04\x32\x8a\x36\xb7\xfa\xf8\x22\x20\x82\xdc\x58\x3d\x56\x32\xa0\x7d\xe0\x5a\xf9\xf4\xf8\x26\x80\x10\x7f\xa3\xe5\x13\x88\x4a\xaf\x37\x7c\x69\x4b\x98\x0e\x4f\x04\x92\x6a\x84\x1a\x1a\x6f\x90\x70\x0b\x77\x0e\xd9\x85\x6f\x0e\xa3\x31\xa3\x67\xc6\xac\xf8\x30\xcb\xb0\x60\xce\x51\xe7\x6b\x28\x23\x14\xf0\xd2\xed\xae\x8c\xfe\x6e\xcd\xb5\x7f\xfb\x0d\x7c\xcb\x97\x3f\xde\xb2\xc7\xdf\x87\x8a\xa5\xc7\x0f\x6f\x1e\xe3\x2c\x16\x0a\x38\x3d\xda\x5e\x76\xce\x9d\xe8\x64\x3a\x5d\xfa\x59\x39\x93\x19\xc8\xdc\xdc\x56\x7e\x2c\xb4\xa7\xbb\x52\x7b\xb1\x8c\xfe\xa4\xa5\x91\xce\x49\x2d\xcc\x08\xc9\x72\xf2\x4e\x0c\xa8\x44\x93\xc7\x9e\x5d\x22\x88\xa0\x56\xb0\xe6\x77\x45\xe2\x52\xef\x9b\x78\x5e\x47\xf2\xe9\xf1\xed\xfe\x11\x6d\x7f\xb9\xd3\x33\x7c\xf9\x4f\xf0\xe1\xcb\xcf\xef\x7e\xfd\xf2\xf8\xe1\x4b\x08\xe8\xa3\xc2\xeb\x2d\xc1\xa0\x94\x6f\x46\x10\xa5\xc7\x7e\xf2\xb3\x97\x14\xf8\x64\x15\x51\x6e\x86\x44\xf9\x53\x89\x17\x45\x42\x9c\x3f\x16\x5a\x0d\xde\x0c\x3c\x75\x59\x23\xa9\xc1\x54\x38\x45\x2f\x91\x53\x93\x1c\x17\xed\x85\x06\xf6\xcc\xe3\xbf\xca\xe4\xfd\x8f\x65\x12\xdf\x65\xf2\xe5\xf3\x9b\xf7\x57\xa1\xb4\x71\xc2\xa1\xc4\xbd\x6a\x84\x55\xba\xa7\xbd\x74\xb2\x18\xa5\x92\x99\x84\x48\x8d\x89\xaa\x4e\xa5\xf0\xcd\xae\x54\x9e\x2f\xa3\x3f\xaa\xab\x38\xac\xd0\xc2\xf4\x10\xf9\xc8\xb7\xa2\x47\x15\x3a\x79\xea\xb9\x9f\xd2\x1e\xb8\x04\xb7\xc6\x9b\x43\xae\x55\xc0\x43\xf9\xf0\xcf\xac\xcf\x87\x8f\x9f\xc3\x78\x3e\x87\x35\xda\xc5\x59\x2c\x15\xb0\xdb\x22\x35\x33\x3b\xb9\xd6\x54\x7e\x56\xda\x66\x49\x92\x26\xd7\x85\x3a\x35\xd8\x1f\xaf\xe3\x49\xd6\x95\x3a\xfa\xe9\xba\x52\xd6\x49\x23\x4c\x07\xd9\x32\x7b\x27\x1c\x8c\x60\xd3\x01\x22\x4f\x3c\xbf\x44\x47\x20\x0a\xec\xe9\x2a\x23\x16\xf4\xef\x24\x7a\x17\xe2\x37\xab\x7f\xf7\xd3\xad\x1e\xe7\xe1\xf1\xc6\x01\xb2\x16\x83\xee\x5c\x5e\x64\xa9\x4b\xb0\xd6\xd8\x37\x13\xef\x80\xe2\xd4\xa6\xd5\x2e\xf9\x5a\x16\x39\x9e\x4a\x3f\x1b\x2c\xb6\x6c\xe9\x17\xee\x1b\x05\x39\x32\xc8\xf8\xcc\x4f\xfe\x58\x40\x19\x02\x65\x08\x25\xe1\xee\x4a\x6e\xf9\xd5\xf7\xfe\xee\x54\x48\x8f\x0f\x29\xda\x7f\x88\x9e\x7b\xa4\x79\x55\xe4\x4d\x52\x15\xd6\x61\x9f\xba\x56\x40\x0e\x2d\xc9\x9b\x1c\xef\x92\xaf\x75\x99\x93\xb1\x9c\x29\xc6\x72\x4b\x96\xde\x1b\x5f\x75\x0a\x8a\x5b\xaf\x27\x7f\x2c\xaf\xb6\x7d\x84\x90\x0e\x39\x42\xc9\x8d\xfb\xe8\xdb\x40\xe2\x9f\x75\x29\x49\x91\x25\x2e\xa9\x0a\x63\xb0\xa7\xae\xe1\xd7\xc7\x89\x66\x26\x74\x59\x62\x3c\x85\x1e\xaf\xd3\x3c\x78\xe3\xcb\x56\x42\x8e\x2c\xb2\xdf\xce\x13\x22\x1e\xd5\xe8\xb8\xc6\x19\xde\xac\x71\x86\x9b\x2b\x5e\x22\x3c\x8c\xd7\xe1\x75\xb9\x14\x63\x88\x25\x51\x23\x89\xcd\xb3\x4d\x1e\x21\xc4\xff\x05\xf2\xf9\xf9\xc7\xf2\xc1\xc6\x8a\x19\x0c\xcd\xda\xec\x47\xe2\xd1\xbe\x6a\x55\x18\xec\x37\xe2\x89\x00\x86\xcb\x61\x57\x6c\xcb\x35\x1b\xf7\xe6\xa3\x7d\xed\xe3\x41\xdb\x0f\xbf\xc2\x23\x8a\x10\x76\x50\xfb\x03\xd3\x75\x99\x57\x75\x55\xcc\xfe\x24\x80\x42\xb6\x1c\x36\x11\x94\x7e\x30\x4b\x2e\x58\x6a\xd3\xa2\x82\xde\x1f\x1a\x3d\x84\x24\x2d\x00\x77\xd1\xbb\x3a\xbe\x71\x7b\xad\x96\xfc\x6b\x5f\xc3\x5a\xb7\x01\x13\x52\xf6\xda\x3c\x11\x5a\xe4\x4a\xd5\x83\x17\x1c\x44\xef\x53\xd4\x18\x63\x7c\x15\x00\x56\x28\x48\x7f\x6c\xa5\x3b\xde\x73\xb6\xcc\x9a\x53\xf5\xe7\x95\x38\x9f\x1e\x22\xf8\x10\xc1\x63\xdc\xa3\xd2\xcd\x33\xe1\xab\x73\xd0\x4f\x7e\xe4\x20\xa1\x5c\x86\x35\x59\xc8\x3e\xb5\x8a\x65\x2e\x63\xe8\xe4\x13\x3f\x2b\xc0\x48\x46\x00\x87\xc8\xee\xb2\x2d\xff\x7d\x99\xac\xb5\x2e\x33\x92\x0e\x12\x3f\x53\x25\x78\xc6\x45\x99\x8f\x5e\x51\x50\xad\x4f\x36\xec\xfa\xbd\x5d\xec\x75\xf3\x64\x45\x89\x8a\xeb\x3d\x69\x20\x81\xe2\x7a\x0e\xa6\x0b\x09\x3a\xc2\x3e\x78\xd4\xdf\x45\xd7\xa7\x2f\x68\xa3\xe8\xc3\x6e\x36\x97\xc8\x9f\x1c\xd4\x0b\x39\x35\xaa\x9d\x76\x5c\x7a\x7d\x7c\xea\x36\x06\x32\xa0\xc3\x49\x42\x34\xde\xeb\x0a\xef\x79\xb4\xdb\x7f\x36\x8f\xb6\xf5\x63\x05\x27\xb0\x78\x9c\x51\x92\x2e\x13\x56\x16\x27\x36\xab\xd8\x30\x0b\x2f\x33\x70\xdb\xbc\xbe\x27\xd2\x56\x36\x24\xd2\xd2\xa9\x98\x75\x89\x39\x72\xab\x5a\x16\x62\x74\x2e\xe4\x12\xff\xa8\x06\xa0\x80\x83\x83\xa3\xcf\x51\xf1\x75\x46\xb5\xaf\xbf\xaf\x01\xc8\x82\xce\x55\xae\x55\x53\x6f\x57\x23\xe9\x7b\xc7\xd9\xe7\x2f\x8f\xb1\x8d\x6d\x3b\xc0\xc9\xa7\x94\x51\x92\xd5\x94\x2c\x33\x4a\x0e\x66\x29\x76\x65\x33\xb4\x9d\x5d\xf2\x80\x40\x94\xa1\xde\x42\x12\x72\x2e\x20\x60\x24\x8a\x1d\xb9\x55\xe4\xae\x79\x99\x81\xfd\x2b\x5a\x33\x2b\x3f\x7f\x79\x17\xc1\xaf\x5f\xfe\xf8\x61\x47\x1b\xd1\xe4\xa5\xb7\x9e\x96\x50\x40\x7a\xf2\x73\x09\xe9\xe4\x86\xf9\x74\xa0\xc4\xf9\xc6\x73\x28\xe7\x1a\x43\x7f\x89\x7c\x8f\x05\x13\xb5\x81\x02\x0e\x55\x61\xa0\x40\x59\xe5\x4b\x7f\x2c\x0a\xdb\x54\x4b\xe1\x65\x59\xab\xb5\x66\x04\x4d\xa1\xa6\x5e\x45\x7f\x75\x67\x29\xbf\x3e\xf7\x01\x2e\xed\xf1\x2d\xec\x56\xcc\x83\x97\x8c\xeb\xff\xf2\x05\x1e\x37\xca\xe5\x25\x3a\x9c\x67\x4d\xa8\x80\x34\x45\xd3\xd2\x48\x3e\x6b\x47\x92\x26\xd3\x97\xa8\xf3\x43\xdb\xc2\xe4\xa3\x9d\xca\x85\x30\x3d\x27\x1c\x52\x3f\xcb\x45\xc9\x2a\xcf\xb0\x2c\x1b\xc9\x38\xe9\x56\x3f\x79\x98\xff\x5f\xf4\x49\xea\xd8\xf9\x80\x45\x89\x79\xf0\xbd\xaf\x74\x20\xe2\x77\x7c\xef\x21\xaf\xb2\xdb\xc9\x10\x4b\xfc\x37\xe8\xdd\x3e\x8a\xc3\x71\x42\x1f\x36\x83\x1d\x8e\x4e\xfa\xae\xf5\xa3\xd7\x0c\x14\xd4\x54\xec\xa4\x1f\xce\xad\xc7\x52\x41\x14\xe7\x0b\xf3\xd2\x82\x46\x23\xa4\xe1\x9c\xb2\xdb\x39\xfd\xae\x5e\x32\x66\x30\x06\xdc\x36\xe7\x8b\x4d\x82\xc4\x62\xec\xd3\xb8\x29\x56\x99\x9a\xdf\xcd\x6d\xcd\x08\x60\xe6\x35\xf3\x8d\x2d\xbc\x10\xc0\x77\xe4\x49\xf9\xbc\x45\xc9\xe6\x98\xa6\x4f\x7c\x69\xd7\xdc\xd6\x6d\xe0\x4c\x1c\x36\x24\x7a\x73\x43\x6d\xfc\xff\x5d\xe7\x02\x1f\xff\xe9\xcb\x3b\xb4\x16\x41\xae\xaf\xdb\x36\xd8\xec\x37\x72\xa0\x5b\xf2\xdf\xc3\xd5\x60\xcf\xe1\xe3\xa7\xf7\xdb\xc0\xef\xf1\x36\xe4\xe7\xb6\x49\x51\x56\x89\x2a\x0d\x57\xe9\x93\xe9\x74\xbb\x91\xf8\x70\x02\x4d\x15\xd5\x79\xe1\x85\xcf\xb3\xd3\x18\x12\x87\x64\x01\x83\x9f\xe6\x19\xd4\x3c\x07\x72\x76\x9e\xe5\x1b\xb2\x1c\x96\xc3\x5c\x78\x0b\x22\xbe\xea\x8f\xca\x0f\x04\x4a\x10\x28\x3f\xc8\x2c\x13\x5e\xdb\x86\x60\x5c\x17\x3a\xcd\x3a\x90\x3c\xd5\x3e\xd7\x5a\x5f\xa2\x26\x4d\x8a\x3c\x82\x48\x6d\xa2\x90\xe3\xb4\xbe\x29\x8f\x6f\x83\x2d\x7e\x95\xa4\xda\x9d\xce\x07\x10\x80\x6b\x7f\xf0\xbd\x39\x1f\x77\x54\x97\x35\x33\xbc\xf6\x53\xc0\x95\x03\xe8\x2e\x6e\x97\xa0\xe9\x16\xf7\x7e\x0c\xd0\xf5\x57\x9b\xed\x11\xba\x0d\x59\x4e\x90\x74\xbc\x69\x9d\x67\x68\xd2\x54\x0a\x23\xb9\x2f\xd1\xe1\x16\xe3\x12\xf1\xf4\xe3\x3e\x7b\x10\x50\x63\xdf\xfb\xc1\x9d\xa7\x78\xb2\x83\xed\x9b\x51\x2f\x62\xb3\xee\xcb\x36\x8e\x82\xfd\xf0\xf6\xe5\xde\xff\x96\x80\x69\x93\x00\x71\x20\xfc\x68\x07\x32\x18\x67\x3a\x36\xa8\x79\x6b\x8f\x47\x33\x73\xab\x27\xaf\x40\x9d\xa4\xd4\xa7\x08\x22\x1a\x47\xf1\x18\xb8\xa6\x5e\xf0\x29\xbf\x69\xec\xd1\x02\x33\xd7\x57\xa8\xd7\x4c\x4a\xa3\x3b\x36\x2a\x3f\x85\xc6\x32\xc1\xb5\xa0\xbe\x01\x39\x6a\x65\xc7\x35\xdf\xe3\x3a\x2f\xd4\xfd\x9e\x2c\x43\x52\xc6\x2a\x4b\xd4\x19\x2e\x9d\x6b\xae\x12\x39\x86\x7f\x7b\x40\xc7\x3d\xdd\x15\x7f\xfe\x6f\x0f\x3b\x7b\x6e\x41\x42\xc2\xfd\xec\x4f\x6e\xa1\xbb\xc2\xea\xd6\xd9\x46\x79\x8b\xda\x68\xe5\x21\x6d\x82\x2f\xee\xaf\xbe\xc5\xf1\xda\x88\xd5\x03\x28\x9f\x08\x98\x1d\x5d\x06\x7b\x6e\xad\x8d\x36\x11\xbf\xc8\xbd\x41\xdd\x2d\x96\xf3\x9c\x0f\xf5\xdb\x2f\x6f\xee\xb0\x64\x3f\xff\xf6\xaa\x90\xfb\x31\xff\xe3\xa7\x4d\xa2\xa9\x25\x0a\x4d\xad\x6c\x78\xf3\x44\x5b\x26\x9d\x06\xd9\xe2\xc3\x4c\x93\x26\xd5\xde\xfa\xc9\xa1\xae\xe9\x68\xd7\x24\xc7\x4b\x44\xe6\x53\x56\xfb\xc3\x48\x21\x1a\x3d\xce\xf3\xba\xa9\x8e\x2b\xa4\xcb\x55\x8f\x41\x43\x88\xc7\x7f\x37\xde\x98\x36\xc1\x69\x66\xe7\x01\x9d\x76\xd2\x4f\xc6\x5b\x6b\x23\x40\xe6\x77\xe6\x47\x9b\xe0\xf5\x35\x4f\x11\xf4\x2f\xf3\x43\x11\xbb\x10\x34\x06\x0c\xf0\xbf\x7d\x1d\x89\xfb\xf9\x4b\xc8\x1e\xb3\x35\x35\x55\xcd\xe7\x93\x31\x3b\x95\xfb\x69\xfa\x7a\x8a\x8f\x8c\x08\x90\xdd\x93\x0b\xf9\x62\xc9\x85\xec\xb3\x38\x8d\xfe\x10\xd8\xd2\x3f\x85\x1b\xe6\x15\x4f\xcd\x8d\x25\xe0\xb7\x1f\x7d\xb9\x7d\xc5\x13\xb2\xad\x61\xac\x31\x31\x99\xad\x73\xd5\xe0\xd1\xfa\x76\x99\x60\xc4\x35\xd5\xb9\xab\x0a\xed\xf0\xe0\x7c\x8b\x14\xc7\x1c\x33\x8f\x39\xe6\x84\xc5\xe9\xf9\x48\x48\xaa\xd3\xf2\x20\x2a\x8d\x15\x64\xfa\xfb\x2f\x4a\x42\x85\x60\x38\xfc\x7e\xc3\x91\x8a\xab\xf0\xee\xff\x12\x3c\x28\xab\x77\x67\x7f\x7d\x10\x37\xef\xd6\x92\xe8\xcf\x5f\xfe\xf8\x25\x54\x5c\xc4\x63\x59\xf3\x49\xba\x0a\x61\xdd\x42\xd4\xd6\xfe\x30\x8c\xfe\x88\xa7\x4e\xe0\x52\x2a\x27\x37\x5d\x55\xc8\xe6\x54\x70\xed\x24\x49\x4d\x45\x79\xa5\x0b\x5c\x1f\x2b\x8a\x99\xbc\x63\x5d\x5a\x44\x6e\x7d\xad\xdd\xbc\x4e\xca\x0a\x29\x82\x9f\xbf\x3c\xee\x7f\xd9\x46\xaa\x84\x91\x2a\x36\xd5\xc7\xb6\x19\x48\xab\x28\x2e\x4a\xda\x42\x21\xb1\x37\x39\x41\xa4\x60\xb2\xe3\x65\xa9\x4b\x4a\x4b\x9d\xd7\x18\x17\x39\x75\x33\x95\xf9\x3a\xaf\x78\x8c\x4f\x7b\xbb\x73\xd1\x2f\x6b\x35\xc6\x0f\xfb\x7a\x77\x9d\xd6\x36\x93\x25\x4c\x4a\x89\x63\x7d\x6a\x86\xa1\x6c\x1c\xae\x6a\x4c\x07\x4e\x29\x27\x3b\x97\x53\xa1\x68\x55\xe8\x92\x89\x42\xe7\xb8\xae\xaa\x92\x9a\x9c\x56\x35\xb9\xd5\xe7\x05\x8c\x21\x1d\xfd\x9b\xa0\x1f\x87\xb7\xf6\x5b\xee\xbf\x1b\x2a\x63\xe8\x0b\x1d\x9a\xbc\x88\x69\x73\x82\x1a\x24\xf1\x85\x6f\xbd\xf3\x39\x83\x16\xca\x86\x2b\xcb\x67\x5d\x57\x72\x3c\xe9\x9d\x2e\xaa\x4a\x0f\x9a\x15\x0e\x6b\x83\x6d\xcd\x98\x15\x44\x1a\x93\x90\xa3\x63\xc2\x44\xff\x2a\x12\x40\xc3\x1b\xf6\xf7\x37\xcf\xde\xff\x8c\xfe\xd7\xe8\x7f\x8f\xfe\x8f\xe8\xff\x7c\x9d\x85\x79\xa7\x1e\xbf\xd1\x8f\x3f\x5c\xe7\xfc\xf6\xe3\xa7\xf8\xf6\x81\x57\x94\xd9\x2f\x69\xa9\xff\x2e\xf0\xdd\xde\x49\x6e\xff\x1b\xdc\x73\x54\xdf\x7f\x7a\xbf\xfd\xf4\xf8\xf6\x9e\x78\xbe\x5a\x8b\x9b\x59\xe7\xc5\xa9\xa8\x2d\x2e\x7a\x3f\xf5\xfd\xe1\x00\xd9\x79\x22\xa4\xe7\xc7\xeb\xff\xbe\xba\x00\xfa\xe7\x9c\x9f\x43\x22\x2b\xf7\x16\x3a\x5f\x30\x3f\xd0\x23\xf5\x07\xd0\x49\x60\xbf\xee\x00\x1f\x2d\x12\xfe\xa0\x87\x01\x48\xcf\x8d\x62\xc2\xec\x64\xc1\x28\xc1\x25\x15\xc6\xa9\x46\x39\x83\x5a\xa6\x67\xea\x9c\x3f\x36\x8d\x1f\x9d\x8b\x65\x55\xd5\xb5\xb4\xb5\x3f\x62\x5e\x64\xbc\x11\xba\x26\x3c\x4d\x0a\x8e\x21\xaf\x6d\x55\x55\xbe\x21\x84\x2c\x63\x4d\x38\xad\xa2\x9f\x10\xb9\x94\x37\x2c\xfd\x7f\x1b\xfd\x7f\xa2\x8f\xd1\x7f\x0b\x7c\x89\xff\x4b\xf4\x3f\xa3\xff\x2d\xd4\x72\xdf\xb1\x66\x6f\x51\xbd\x55\x84\xdb\x1b\x04\x08\xfc\x80\x14\xe1\xcb\x4d\xcc\x81\xc3\xfd\x46\xf8\xf4\xca\x4d\xfc\x9f\xe1\xe5\xf7\x0f\x9b\xc6\x19\x56\xcb\xb2\x82\xc8\x3c\x9d\x0c\x14\x65\x2d\x78\xad\xbc\x8c\xed\x99\x6b\xa4\x17\x79\x89\x36\x01\xff\xcf\x47\x88\x7e\x1d\x10\x0e\xc1\xcd\x48\xd9\xbc\x60\xb8\x60\x5e\xa1\x54\x14\x99\xcc\x72\x7d\x26\x92\x32\x21\x36\x35\xad\x75\x49\x27\x52\xe9\x12\xb7\x75\x66\xb3\x6a\xa7\x46\x2e\x6b\x8a\x67\xad\x67\x82\x31\x97\x07\x3f\x31\xea\x67\xcf\x02\xbe\x08\xe1\x58\x96\x65\x85\x49\xd7\x11\x52\xd4\x55\xb7\x10\xac\x09\x27\x8c\x0b\x22\x79\x45\x59\x2d\x48\xc9\x58\x19\x2e\x87\x4d\xa4\x2e\x64\xcf\xa2\xd3\xcb\x5d\xff\x03\x26\xa3\x8f\xdf\x30\x30\x7c\xda\x71\xcb\x0c\x35\x9e\x94\x99\xca\xca\xc5\x2a\x2e\xa4\x02\xea\x48\x07\x29\xb6\xa9\xf2\xce\x4f\xe6\xa4\x0c\xb5\xaa\x26\xb4\x64\x24\xc3\x0d\x17\x82\xb7\x79\x56\xf1\xd2\x51\x8c\xa3\x9f\x22\x1d\xf5\x7b\x19\x6a\xb2\xde\x45\xff\x35\xaa\x6f\x2c\x5c\x77\x0e\xae\xc0\x58\xb1\x52\x9d\xff\xf1\xc3\xfb\x4f\x8f\x1f\xde\x7c\xfc\xfc\xe5\xfd\x2f\x70\xdd\xa1\xeb\xd9\xbe\xb9\xa8\x5f\x1d\xf9\xdb\xba\xc1\x2f\x1f\x3f\x7f\x81\x6f\xd3\xaf\xdf\xdf\xa1\xbc\xef\xc1\xda\xed\xc7\x60\x00\xae\xf5\x78\x55\x9e\x42\xc1\xaa\x66\x49\x87\x2c\xd7\x90\x95\x4c\xe4\xc9\x58\x40\x0f\xe6\x44\x71\x6f\x28\x16\x64\xe0\x32\xcb\xa0\xab\x89\x31\xb8\x6f\x84\x42\x91\x9f\xa1\x39\x63\xc8\xda\x92\x56\x5f\x1b\x24\xd7\xdd\x6f\xfc\x01\xea\xa3\x02\xe9\xf5\xf5\xb3\x6d\xb5\xcf\x14\x94\x3a\x59\x06\x02\xf3\x64\x0d\x57\xed\xce\x54\x58\x1a\x29\x49\x2d\xa9\x77\xbc\xc0\x5e\x53\x92\x8a\xbc\x28\x8a\x9a\x32\x93\x15\x19\x23\x75\x96\xaa\xa2\x2c\x73\x4e\x39\x22\xb4\x28\xbd\xf6\x25\x96\x7d\x2f\x31\xe4\xf8\x12\x91\xc4\xf7\xfd\x08\xb8\xf1\x2e\x97\x29\xc5\x9c\xf3\x5b\x3c\xa5\x45\x6d\xe0\xa8\xfc\xeb\xe8\xef\x42\x3d\xe8\x6b\xc6\x98\xdf\x5e\xfd\xe5\xd7\xbb\x56\xfc\x9c\xd5\x79\x32\x69\x6e\x8d\x14\x57\x5d\x6c\x8e\xd7\xbf\x29\xae\xa9\x90\x10\x3d\x39\xa4\x83\x47\x30\xce\xfe\x84\xe3\x68\x91\x3b\x9d\x13\x4c\x84\x62\x4c\x50\xd1\x4c\xaf\xfe\xd2\xfa\x1e\x25\xcb\x6c\x03\x1f\x05\x0a\x7e\x39\x1d\x97\xd1\xbb\xbb\xf7\xfe\xf1\xed\x8a\xa4\xf0\xea\xee\x8c\x02\x12\x07\x9a\x4c\x85\x63\xdd\x5c\x22\x48\xa0\x29\x97\x39\xdc\x9c\x15\x07\x07\x45\x23\xad\xe0\xa0\x61\x9c\xcd\x92\xd9\xb8\x24\x94\xda\x5e\x91\xcc\xa5\x4e\x55\xb6\x22\x42\xe9\x5a\x43\xe4\x2d\x57\x66\xbd\xb3\x05\x32\x7b\x19\xee\x81\x7f\xff\x0d\x82\xc2\x5a\x4f\x7d\xeb\x3c\xbe\xd5\x19\x26\x35\xe1\xb3\x74\x79\x11\x2b\x7b\x3a\x42\x8f\x7d\xe4\x47\x6f\x7d\x86\xa1\x81\xb2\x4b\x92\xb4\x99\x67\xbd\x71\xb8\x96\x03\x14\x05\xc1\xe6\xa8\x09\xb6\x44\x59\xdc\x94\x9c\x41\x92\x26\x46\x8a\x36\x8a\xb6\x40\x2f\xf5\xce\x22\xf1\xcc\xeb\xf2\xee\x75\x76\xc5\x0b\x65\xe4\xf6\xf1\xd3\xe3\xce\xda\xa7\x93\x5d\x99\x04\x08\x1c\x42\x1d\x7b\xf8\xc9\xd7\x48\x9c\x87\xaa\x8a\x4b\xdf\x37\x4d\xe3\x8b\xa6\x69\x56\x2e\x87\x7a\xd7\xa2\x66\xb5\xb9\xbe\xfc\xb8\xb2\x13\x32\x94\xe5\x2e\x4d\xd0\xa8\x7a\xd1\xe4\x8d\x62\x75\xb6\x58\xbd\x8c\x04\x06\xe5\x73\x14\x35\x39\xae\x7d\xda\x67\x36\x13\x90\x79\xaa\x2c\x83\x32\x42\x71\x8e\xfa\xa0\x37\xff\x72\x43\xeb\xbd\x1d\xac\x3b\x62\xca\xcb\x5b\xfa\xb8\xdb\x28\x53\xa1\x82\xb9\xfe\x88\xfd\x78\x98\x7c\x5f\x41\xda\x73\x51\xd7\xf2\xc4\xb8\xb5\xc4\x17\xc9\x4e\x96\xd2\x8c\x8a\x95\x06\x2b\x5d\x9b\x92\x11\x45\x6a\x7a\xac\x34\xe7\x2e\xb9\xe1\xad\xe2\xbd\x41\xd7\x7b\xe7\xdf\xbe\x64\x87\xaf\x35\x5e\x6f\x1f\xaf\x8f\xeb\x4a\xfa\xf4\xe6\x71\xc7\xca\x5c\x65\xd5\x42\xa0\x4f\x6d\x0a\xa3\x4f\x53\x28\x20\x12\x93\x3f\x49\x6f\x05\x74\xd8\x53\x74\xaa\x69\x41\xeb\x03\x0b\xe8\x53\x6e\x90\xbd\x19\x95\xb9\xe5\x5e\xa1\xf8\x70\xb1\x7b\xb3\x2b\xa3\x7d\xe8\xeb\x66\xac\xc2\x6b\xb0\xae\xb5\x2c\xfa\xf3\x5e\x9c\xa7\xb8\x3a\x97\xe8\xa8\x31\x57\x82\x73\xa1\x5a\xe1\x1a\xdb\x08\xa3\xc9\xae\x34\x5f\x8d\xdd\x59\x3f\xe6\x7e\x1c\x0f\x03\x3f\xb4\xb3\x63\x16\x8a\xb1\xa7\x6d\xd7\x46\x10\xdb\x5b\xdd\xf3\xcf\x2f\x36\xe7\x2b\x8c\x92\x78\x00\x66\xa1\xf5\x9c\x82\x94\x7e\x52\xdc\x77\x14\x4c\xe2\xdd\xc6\xc0\xe4\x33\x7b\xb5\x60\x0d\xd4\x30\xfb\xd4\x77\x06\x1a\xa4\xa2\xa0\x8b\xd7\x9b\x68\x63\x6e\xd5\x17\xff\x39\x8a\xde\xbc\x7e\xd0\xdf\xff\xa0\xce\xe4\xbb\x37\xdc\xb4\x06\x52\x63\x4c\x1f\x1e\xe7\x00\x71\x4f\xa1\xb9\x3e\xc7\x43\x8b\x88\x3f\xc9\xae\x03\xd2\x6d\x2a\x4a\x09\x91\x27\xe6\x0d\x57\xe3\xa8\x38\x08\x76\x12\x42\xf8\x42\x29\xb5\xd6\x98\x1c\xb6\xc3\xe6\x74\xcb\x82\xff\x18\x07\x76\x8c\xf8\x63\xba\x32\x50\xfc\x77\x78\x78\xbc\x2e\x1c\xea\x6d\x01\x45\xb9\x8c\xa8\xaf\x46\x61\x5d\xc1\x4c\x91\x2f\x44\x07\xac\xe0\xa3\xef\xa1\x33\x4b\xb7\x9c\x46\x5d\x5a\x48\xad\x0e\xd8\x07\x24\xce\x77\xd5\x8a\x6d\xf3\xe6\x31\xfe\xf8\x13\xfc\x23\x7c\xf8\xa7\x2f\x9f\xbf\x7c\x7e\xf3\xf8\xe6\x5d\xfc\xf1\x1e\x94\xb5\xa8\xae\x54\x26\x8c\xc8\x9b\x34\x4b\xb3\xc4\x97\x85\xcb\xbb\xd2\x33\xa0\x99\xed\xaa\x7e\x57\x9d\xbb\x45\xf8\x93\x4d\x33\xde\x40\x8d\x86\x6c\x19\xd1\xe1\x9c\x19\x49\xdd\x9a\x4f\x1a\xe9\x58\x6d\x8a\x7b\xfe\xdb\xe7\xab\x18\x5f\xce\xcf\x97\xc7\xd5\x25\x78\x80\x32\x31\xe0\x44\x87\x59\x2e\x30\xad\x52\x3f\x85\x6a\xd6\xa2\xf0\xd3\xf6\x84\x89\xf5\xbc\xcd\x4d\x4e\x07\x3f\xb4\x4a\x8f\xe1\xae\xb1\x17\xbc\xc7\x31\x0b\xcc\x9d\x11\x3c\xc6\xaf\x78\xdf\xbf\x3c\xbe\x79\xb7\x7f\x7c\x13\x18\x3a\xa1\xdc\xb4\x15\xb8\xdc\x74\xdc\xe4\x1d\x23\x24\xfd\x7a\xa4\xae\x46\xc7\xe2\x1c\xd9\xcd\xf8\x54\xc4\xcc\x0b\x5f\xf7\x99\x49\xe5\x04\x22\xeb\x21\x5a\x4e\xe6\xb9\xfd\xec\xf7\xdb\xff\xf2\xbb\xed\x33\x5b\xa3\xb1\xbc\xb7\x9f\x79\xed\xf9\x21\x35\xa9\x18\x80\x66\xdd\xc9\xa7\x3a\xba\xad\x01\xfe\x97\xad\x01\xab\x42\x74\x2f\x6f\xd3\xfc\xba\x06\x59\x6d\x8a\xa1\xf2\x15\xf0\xdc\xf5\xd5\xf0\xb2\x06\x39\xb7\x80\xbf\x59\x83\xbb\x2e\x7d\x21\xb1\xf8\x97\xf5\xa5\x2a\x93\x69\xab\xb2\x2e\x2d\xd2\x2c\x59\x66\x6c\xca\xa9\xf2\x19\xe8\xac\x1d\xaa\x29\xf4\x25\xfd\x64\xd3\x9c\x59\x20\x7f\xbe\xde\x28\xe2\x17\x12\xb7\xbb\x7a\x8d\x58\xbe\xf4\x75\xef\xea\xf1\xd6\xd5\xaf\x1a\x0d\xb5\xcd\x74\x6b\xf2\xb1\x4e\xf3\x64\x69\x89\xab\x21\xab\x97\x01\x0e\x59\x3f\x57\x90\xec\xea\xd0\xd7\xd1\x96\xec\xb6\xb5\x8e\xa8\x3d\xe7\xeb\xb4\xd0\x26\xbf\xd4\x7b\xb1\x21\xcf\xeb\xf3\x11\xbd\xba\x96\xd7\x8e\x02\x43\x6b\x8d\xba\xba\xcb\x94\xad\x02\x3d\x5f\x9d\x2c\x0e\x9b\x0a\xb2\x6a\x39\xe5\xa8\x58\xc6\x0d\x59\x06\x1f\x1d\x33\x9d\x6a\xa8\xa1\x4f\xfd\x00\x6e\xa9\x74\xf4\x6a\x8f\xcd\xb7\x17\x25\xec\x81\x7f\x84\x0f\xf9\x7f\x87\xef\x76\x58\x57\x87\x1d\x70\x2a\xa0\xae\xea\xe4\xeb\x91\x36\x35\x1a\xaa\xfb\x06\x98\x7d\xe2\xf3\xd1\x65\x66\x02\x93\x9d\x40\x2c\xc2\x06\x4e\x8b\x7a\x2f\x77\xe5\xcb\xfe\x0a\x72\xca\xbf\xbc\x12\x54\xa0\x32\x72\x31\x91\x10\xe5\xda\x1d\x0b\x28\xb2\x3c\xcb\x93\xf3\x51\x34\x0c\xa4\x58\x68\x85\x8e\x4b\xbe\x2b\xcf\xdd\xc2\xfd\xc9\x25\x19\x75\x40\xd1\x21\x5d\x26\xd4\x3e\x1d\xed\x6a\x87\x96\x97\x7a\xbf\xee\xb3\xe7\x7e\x76\xfb\xdd\xe3\x87\xef\xe4\x84\xc6\x78\x94\x90\xa6\x15\xa9\x73\x7f\xcc\x4f\x15\x4e\xce\x2d\x75\x18\x3a\x76\x1e\x9b\xb8\x3b\xe3\x5d\x75\x1e\xbd\xf0\x42\xe6\x99\x1b\xa0\x5f\xfb\x31\xb7\x7e\x7e\x8a\xf8\xa5\xda\x9c\x02\x7e\xe0\xf7\x7c\xba\x5f\x56\x6c\x8e\x15\x92\xe1\x5e\xa9\x86\x1e\x3f\xbd\x79\x78\x7c\xd8\x3e\xbe\xfd\x07\xb8\x7e\xf5\xf6\xf1\x53\xc0\xe8\xb8\x43\xac\x05\x33\x69\x43\xcf\x16\xa2\x2c\xb5\x69\x06\xb7\x94\x36\x54\x8d\xe7\x14\x3a\x7f\x84\x1c\x9c\x3f\x7a\x06\xb9\x82\xdc\x1f\x17\xbd\xd1\x97\xc8\xfa\xbe\xf2\x7d\x3d\xe5\xfe\xb4\xcb\x16\x81\x4c\x59\xe5\x45\x7e\xa8\xeb\xa6\xae\x39\xc6\x97\xc8\x67\x30\x09\x42\x08\x27\x84\x10\x3f\x07\xcd\xd1\x4f\x95\x2e\x6d\x14\xfd\x14\x47\xcf\x3c\x58\xdf\xcf\xa1\x7a\xc1\x94\xf8\x96\xa3\x28\x5e\xff\xfe\x0d\x85\xdb\x7d\x12\x81\x57\xf3\xcb\x63\xac\xa1\x4e\x13\x97\xa6\xd0\x9c\x95\x45\x64\x69\xef\x9f\x71\x13\x9d\xa3\xb5\x42\xaf\x83\x6c\x29\xef\x3f\x9d\xc9\xc6\xf8\x93\xf5\x87\xd4\x1d\x2a\x88\x52\x7f\xda\xa5\x55\x55\x14\xf9\xf2\x7f\xb1\xf6\xee\x40\x92\xeb\x6a\x9a\x18\x7f\x32\x93\xc9\xd9\x1d\xed\xb0\xba\x4f\xdf\xe6\x68\x77\x66\x58\xd3\xe7\x9c\xe6\x68\x36\xe6\x72\xa7\x55\xdd\x0c\x49\x77\x03\x5a\x45\x48\x90\x14\xa1\x80\xa5\x80\x89\x90\xa1\x40\xc8\x50\x20\x64\xc1\x84\x09\x13\x26\x4c\x9a\x34\x69\xd2\xa4\x49\x33\xcd\x34\xd3\x4c\x93\x26\xef\xe9\x24\x52\x41\x90\x59\x5d\x75\x1e\x77\x66\x56\xba\xb7\x58\x95\xdd\xb7\x6f\xe1\x41\x3c\xfe\xc7\xf7\x7f\x9f\x82\x01\x8f\x68\x5c\x47\x52\xf8\x31\x7c\x1b\x88\xb5\xa9\xca\x9a\xe0\x5f\xf9\x1a\xf1\xfa\xff\xff\x71\x60\xa0\xeb\x38\xfa\x2b\xb1\xa1\x9a\xd5\xfd\x39\xed\xca\xaf\x47\x4f\x29\x0a\x03\x54\x73\x70\xff\x74\x4d\x77\xbe\xba\xb8\x49\x9b\x01\x41\x96\xba\xd3\x6f\x8e\xe3\x16\x2c\xe3\x18\x5f\x8d\x03\x2e\xbf\xf9\x3e\xbe\xfc\xd6\x38\x0e\x7f\x62\x1c\xeb\x65\x13\xf6\xa0\x33\x3f\x8c\xf3\xd7\xc9\x7a\x88\xe0\xf6\x4c\xbb\xe3\xd7\xb2\x06\xe5\x54\x98\x81\xbe\xb2\xfb\xa7\xaf\x78\xdf\x38\x65\x5d\x93\x39\x81\x00\xa5\x8e\x2d\xc3\xc8\xcb\x7c\x96\x7e\x18\x17\x34\xb9\x04\xca\x97\x6f\x63\x80\xca\x5d\x32\x99\xf9\xbc\xc5\x4e\x7a\x2e\x88\xec\xd7\x30\xb3\xbb\x3a\xec\xdd\x04\x95\x1b\xea\x75\x2d\xc6\x99\x99\x3b\x73\xad\x23\xe6\x31\xb3\x01\xb9\xe1\x9d\xfe\xad\x77\xf9\xf6\xb7\xdf\xe5\x66\x89\xec\xef\xf5\xaf\xab\x39\x7c\x7f\x9b\x47\x48\x0a\x2f\x52\xd1\x5e\x6b\xfb\x12\x0d\xdb\x47\xed\x95\xd8\x71\x04\x3d\xce\x7a\xfd\x51\x8f\xbb\xfc\x62\xdd\x39\x91\x8d\x80\xc4\x0f\xbd\x28\xd6\xa1\x63\xff\x06\x73\x28\x30\xc6\x7e\xe8\x52\x6b\x57\x03\x33\x06\x09\xbc\x62\xd9\xba\x8d\x9b\xef\xdd\xa6\xa7\xe3\x2d\xe8\x97\x94\x05\xf1\xe1\xe3\x9b\x0d\x9c\xf1\xe9\xe1\xc3\xae\x37\x79\x11\x52\x54\xd6\xcc\x64\x86\x23\x94\xba\x00\x31\xd9\x43\xef\x8e\x5a\x37\x5e\x9d\x4a\x7c\xd5\x53\x97\x99\x6c\xda\x65\xad\x62\x90\xb9\x6e\xe6\xc6\x23\x33\xfc\x59\xb4\xea\x50\x76\xb1\xdc\xb0\xc5\xff\xfd\xb3\xe2\xd8\x5a\xa9\xf9\xbb\x17\xec\xa4\xbf\x12\x2d\xdc\x62\x10\x7f\x07\xf7\x60\xce\x1a\x65\x48\xa1\x30\xc0\x84\x70\x75\x51\x49\xa2\xb8\x16\x03\xb9\x05\x35\xe6\x18\xe5\x18\x57\xa6\x41\xa7\xda\x1d\xa1\x74\x16\xb8\x3b\x41\x37\x0c\xc3\xdc\x0a\xca\x98\xd8\x9f\xea\xda\x9d\xb4\x3b\xb7\x94\x28\x43\x3b\x59\x73\x0f\xf5\xee\x7d\xc2\x90\xd6\x9a\x5b\xa5\x41\x6b\xab\xeb\xe5\x1f\x5a\xeb\x04\x61\x52\x90\x75\x2c\xed\x0d\x1d\x54\x5c\xfa\x37\xbe\xa9\xa7\x2d\x66\xdf\x8b\x29\x7c\x78\x55\x82\xb9\x09\x60\x3f\xeb\x68\x79\x8b\x78\x57\x44\x81\x43\x24\xe4\x65\xa1\x4b\x9c\xf3\xb2\x28\x8e\x49\xc6\x09\xc5\x04\x51\x56\x97\x23\x23\x44\xd9\xda\xde\xcb\xd2\x6a\x03\xe3\xac\xe2\x72\xe6\x6a\x26\xb5\xce\x74\xd6\x87\x29\x42\x5c\x72\x41\x05\x63\xcd\xc0\x2b\x4d\x06\x30\xca\x49\x35\x23\xd7\xfb\xfc\x58\x12\x1d\x6f\x7c\x3b\x77\xde\x6e\xab\xf4\xae\xe2\x77\x77\x82\xbf\xb9\xc3\x2f\x3e\xc1\xb3\x8e\x96\x0f\x79\xac\x04\xa9\xb9\xcf\x82\xc3\x87\x77\x9f\x7e\xf8\xf0\xee\xd3\xae\x61\x08\x53\xc4\xb8\xd2\x20\x38\xc2\x14\x33\xae\x14\x28\x86\x30\x46\x8c\x49\x3d\x7b\x52\x56\x0d\x8d\xa3\x79\x71\x84\x14\x27\x26\x43\xa5\xb3\xee\xc4\xa2\xc4\xa1\xae\x83\xaa\x6d\x63\x45\x18\xa9\x08\x53\x5c\x4b\x42\x09\x22\x4c\x09\x2d\x08\x23\x08\x2f\x7f\xe7\x84\xb3\x42\x5f\x4f\x7d\x91\x22\x5d\xb6\x55\x59\xf1\xb0\x71\x25\xd0\xd3\x69\xb1\x39\x63\x5f\x97\xba\x8c\xef\x77\xc1\x3f\x04\x9f\x83\xff\x26\xf8\x8f\xc1\x7f\x7a\xd6\x31\x7e\xbc\x0b\xb3\xae\xb9\xa6\x47\x78\xff\x9a\x26\xfa\x0f\x70\xf8\xf8\xe5\xe9\xd3\x3b\xf0\xe8\xa0\x4f\xaf\xa0\xeb\xfb\xca\x00\x72\x3d\x0c\x45\x25\xf3\x6c\xa6\x4a\x49\x90\xc0\xd2\x5b\x50\xd0\xb6\x48\x74\xc2\x6e\x41\xc3\xea\xb4\xd5\x60\xf8\xb5\x96\xc6\x4b\x6b\x6d\x4f\xac\x98\x66\x92\x71\x5c\xa1\x79\x70\x95\xd3\x04\x04\xb4\xa1\x76\x93\x2c\xaa\x2c\x2d\x68\xa1\x71\x85\x71\x26\x33\x2d\x1c\x9b\xa5\x94\xa1\x3e\x09\xd7\x2d\x5f\xc1\x9f\x45\xcd\xad\xda\x30\x72\x2f\x95\xfa\xfe\xbb\xe0\x7f\x5e\x46\xe6\x41\xf7\x9f\xde\x7d\x5a\xcf\x93\x4f\x77\x14\xfe\x8b\xcf\x6f\xbf\xd5\xa2\x3f\xac\x22\x1a\x1f\xd2\xc3\xc7\xcf\x7f\x09\x70\xdf\x62\x8b\x8f\xb7\xcb\x47\x29\xe5\x74\x6d\x95\x10\x17\x29\xe5\xdc\xae\x3f\xeb\x39\xf5\xa2\x6d\xd3\x7c\x51\x85\x12\x98\x0a\xc5\xc3\x49\x11\x82\x24\x73\x17\xac\xd2\x02\xc5\x89\x10\x42\xcc\x1d\x50\xb9\xfc\xc7\x35\xeb\x8f\x56\x30\xc1\xa4\xb3\x95\x40\x05\x86\xde\x8d\x23\x19\xa1\x80\x76\x6e\x10\xaf\x70\x25\x34\xf8\x6d\xb9\xda\x26\xec\x86\xa3\xd3\x6f\x9e\xa1\x9f\xfe\xc5\x67\xe8\x87\xe5\x0c\xfd\xdc\x9f\x16\xcb\x24\x07\x31\x17\x8b\x8b\x49\xee\x4f\x17\xa5\xd7\xd1\xb4\x2d\xa0\xd6\xa5\xdb\x8f\x3e\xe2\x9d\x39\x25\x4c\x89\xe3\x8b\x03\x94\x4c\xeb\x01\x5a\x40\xfe\xf3\x03\xd4\x56\x5e\xf3\xfd\x5f\x79\xcc\xb1\x8a\x55\x90\x04\x7f\x1e\xa4\xde\x13\xbc\x47\xa6\xbf\x6c\x7d\xff\x97\x75\xfd\xbb\x65\x99\x76\x5d\x96\xd8\x1c\xf0\xcc\xcd\x3d\x6a\xb6\x3c\x6d\x78\x9c\x4b\x63\x0c\xe4\xc6\x91\xf5\x07\xaa\xa3\xc4\x9a\x8e\x0a\xd1\xf8\x8e\x93\xad\xdf\x13\xf9\x93\xfd\x4e\x22\x7d\x23\x7e\xaf\xac\xeb\xe9\xff\x08\xfe\xcf\xe0\xff\x0a\xfe\xef\xe0\xff\xf9\x39\x5b\xc3\x1d\x7a\xbc\x6e\x84\xf7\xf7\xee\x3e\xbe\xfb\xf0\xee\xd3\x93\xff\xdf\xfc\xbf\xdd\x02\xe9\x77\x7a\x69\x7f\xd8\xad\xdc\xf1\x1f\x9f\xd6\x7d\xf7\xb4\x38\xe1\x9f\xd6\xc8\xe3\x97\x2d\x9d\x1b\x3d\x7d\xf8\xab\x65\xb1\x46\x16\x5a\xe3\x5f\x0f\x77\x16\x06\x75\xbd\x48\xe8\xfc\x41\x4d\x86\xcb\x05\xe4\x65\x96\x40\xe8\x11\x43\x25\x20\x71\xd3\xe9\x04\xb9\xb3\x25\xaa\x72\x5e\x56\x96\x4d\x86\x09\xce\x4a\x55\x53\x8c\xc8\xc5\xb8\x1a\x92\xe3\xf1\x16\x40\x20\x96\x23\x48\x4a\x99\x1d\x8f\xc7\x18\x21\xc4\x90\x9b\x2a\x77\xec\x7b\x28\x2b\x48\xd0\x05\x63\xec\xd4\x84\xd0\x34\x21\x8e\x18\x66\x55\x55\x96\x08\x15\x4c\xb4\x27\x5a\x89\xa2\x5c\x7e\x9f\x28\x52\x8e\x28\xc3\x0c\x71\x44\x97\xff\x83\x44\xa8\xc1\xc1\x2e\xaa\xb7\x5a\x99\x6f\x75\x1b\xef\xa3\x57\xac\x5f\xf7\x67\xa5\x80\x78\xe3\x45\xe9\x1e\x1e\xff\x12\xbc\x51\x61\x08\x04\x79\x65\x51\x01\x81\xf3\x92\x39\xfe\x29\x67\x64\x8a\x82\xb6\xa0\x97\xee\xaf\x4f\xac\x0a\x37\x18\x51\x9a\x5a\xbb\x71\xfb\xd2\xbb\x8a\x62\x05\xd2\xb5\x90\xba\xd1\xf1\xfb\xf7\x15\x6b\x89\xa3\x2e\x2a\xbc\x7f\x97\x7f\xcb\xd1\xbe\xae\xcd\x7f\x11\xc8\x96\x80\xbd\x3c\x31\x66\xa8\xca\x30\x4e\x5d\x17\x5a\x86\x35\x62\x8e\x2b\xc4\x14\x0f\xad\x31\x7a\xbe\x30\x92\x9b\x02\x85\x01\x6b\x86\x6a\x68\xca\xf2\x64\x89\x5d\x75\xa0\xa2\x20\x6a\x57\xae\x98\xb7\x9f\xee\x7c\xca\x2f\xa4\x79\x1e\x3e\x78\xe4\xfd\x07\xd1\x27\x3a\x81\xac\xc8\x32\x9d\x20\x29\x2a\x9b\x4d\xb8\xcd\xbb\xbd\x61\x5a\x33\x27\x51\x69\x8a\x96\x57\x0c\x0a\x57\x37\x4a\x2e\x63\x59\x6b\xde\xea\x98\x7b\xbb\xe4\x99\x9f\xfb\xe9\x7d\xb8\x81\xb0\x3e\x84\xd1\xf2\xbb\xdf\x78\x5e\x07\x54\x83\xce\x8b\x0d\x84\xa5\xf1\x98\x70\xd1\xf3\xb6\x3b\x9f\x63\xee\xd4\x57\x5d\xe6\xe4\x52\x3a\x0f\xc2\xda\xa5\xf3\xe0\x46\x77\x34\xda\x86\x09\xac\xfe\x11\xc0\xe8\x79\xba\xc5\xa6\x74\xf4\x18\x3e\x7c\x77\x07\x8b\x1c\x96\xc6\xd2\xb7\x8f\xdf\x7d\xf0\x15\xbb\xfe\xd6\x3e\xd6\x30\x56\x25\x2e\xca\xa4\x4e\xb9\xc2\x8a\x16\xae\x4f\xe6\x91\x5f\x46\x77\x86\x22\x16\x4e\xce\xd8\xe5\x94\x76\xe5\x45\x27\x54\x41\x1d\xca\xe2\x2a\x5d\xe7\x9b\x3c\x5a\x5f\xbf\xb6\x6a\x02\x3c\xeb\x35\xbe\x68\xf1\xef\x61\x6b\xf1\xb0\xb5\x18\x4e\x50\xd4\x70\xa6\x19\xc9\x8b\xa4\x49\xb9\x24\x82\x60\x77\x4c\x9c\xe0\x4d\xe7\x4e\xbb\xcb\x62\x0a\xcf\xd4\x95\x82\xf6\xd5\xc5\xb2\x1a\x74\xc8\x8b\xe4\xaa\x97\x16\x61\x82\xb5\xd6\x31\x3a\x05\xe2\xc0\xe3\x64\xd5\xc8\xf3\xac\xf5\xa1\x67\xad\xff\xf2\xf9\x4b\xe8\xef\x81\xb8\xb6\xdc\xd4\x5a\x4a\xdd\x9d\x95\x95\xb9\xee\x06\xd9\xd6\x32\x4e\x72\x27\xdc\xc9\x4d\x6e\x54\x90\x8c\xae\x3b\x09\xd3\x94\x17\x28\x21\x61\xd3\xe4\xf5\x56\x76\xc7\x1b\x39\xa4\xbb\xca\x9f\xe0\xaf\xd4\xa8\x3e\x3f\xc1\xa7\x87\x0f\xb1\xa8\xa9\xf1\xb5\x83\x55\xe1\x58\x5d\xef\xaa\xaf\xa3\x64\x79\x9d\xe7\x28\xc2\x73\x71\xd7\xd6\xc2\x3b\xbe\x2b\x3c\x77\xc7\x73\x24\x72\x0d\xb5\x2e\xbd\x8b\x44\xcd\x54\x63\xa4\x36\x9d\xeb\x25\xe0\x76\x38\xab\xa1\x15\xbb\xa2\x70\x72\x6c\x7b\xd9\x35\x53\xaf\x86\x71\xe8\x59\xdb\x9e\x02\x9f\xd3\x46\x07\x1b\xc9\xcd\xb2\xdd\xa2\x82\x3e\xce\xee\x8f\xda\xe7\x9a\xde\x35\xcf\xc5\xf6\xc5\xdc\x47\xc5\xdc\x42\x02\x82\xba\xc2\x5d\x92\x3a\x71\x67\x87\x39\x08\x08\xe6\x3e\xca\xe6\xae\x8e\xa6\x6b\x12\x49\x47\xb9\xd1\xb8\x51\x93\xe3\x60\x47\xad\xa9\x35\xdc\x13\xef\xef\xc3\xfe\x26\x0e\x3a\x4e\xbd\x2a\xd7\xbf\xf3\x68\x97\x15\x67\xb5\x56\x74\xf9\xfd\xf7\xf9\xcb\x23\x3c\x7c\xd8\x0c\xea\x1f\x56\xfc\xe9\xc7\x5f\x50\xf0\x47\x49\x74\x69\x8e\x8c\xb2\xb4\xc8\x68\xa3\xaf\x23\xa8\xc9\x18\x21\xc2\x12\xda\x8c\x11\xa4\x49\x65\xa9\xc1\x4c\x48\x82\x8a\xd4\x8d\x73\xb0\xeb\xbf\xa2\x38\xad\x8d\xbe\x0a\x8c\x4c\x92\x45\x83\xe0\x6e\xbc\x9e\x49\x24\x66\x11\x06\xca\xd5\x6e\x32\x16\x0d\x4a\x2a\xd1\xb4\xb6\xe2\x42\xb5\xd7\xca\xae\x7e\x40\xe9\xb5\x35\x75\xf0\x67\xc1\x5f\x05\xff\xf5\x4b\x8d\x81\xd7\xd5\x27\xeb\x65\x0c\xde\x5c\xff\x45\x8d\x5a\x44\xc1\xe4\xe5\x72\xaa\x75\xd7\x64\x97\xdb\xeb\xc5\x42\x5a\x94\x12\x97\x23\xca\xeb\xb2\x74\xad\x05\x45\xb0\xca\x79\x75\xb1\x17\xbb\x1f\x08\x2a\x29\x37\xee\xe2\xfa\xae\x03\x44\x08\x16\x92\xab\x52\x60\x27\xfa\xde\x95\x84\x9a\x34\x5f\x0e\xc5\xb0\x77\x49\xa8\xd6\x35\x82\x6e\x38\x94\x1b\xfe\x64\x53\xe0\xfc\x59\xdd\x03\x3b\x1a\x63\x38\x61\x45\x69\x2a\xc2\x6b\xd4\xaf\xf8\xc2\x5a\x48\xa9\x08\xb9\x66\x91\x3d\x2a\x06\x29\x88\x60\xe5\x42\xc2\xfb\x24\x56\x9e\x8b\x2c\x80\xd0\x1b\x87\xeb\xef\xfd\xce\x1b\xea\xcb\x07\xbf\x14\x5f\xbd\xa1\xa5\xb5\x28\xcb\x84\x94\x17\x3d\x51\x96\x67\xf2\x84\x0a\x82\xb9\x50\x0d\x6a\x19\x61\x8b\xd7\x91\x9d\x58\x78\x9e\x47\x27\x29\xb4\x61\x1e\x06\xcb\x29\xad\xca\x13\x66\xcc\x71\x96\xba\x13\x93\x8a\xf7\x23\x57\x62\x54\x0a\x13\x26\xb5\x04\xeb\xf8\xd2\xa7\x7a\xd3\x5d\x5b\x3c\x8a\x00\x7c\xd0\xfc\xbb\xc8\x1b\xaf\xaf\xc1\xca\xdb\x6a\x79\x97\x46\x1f\x3f\xbf\x79\xf2\xcb\x69\x9f\xd4\xd0\x73\x5b\x16\xee\x02\xba\x98\xec\x28\x4f\x4d\x7b\xa1\x67\xab\xb9\x62\xba\x29\xe6\x76\xd2\x8a\xdb\xcb\x65\x2f\x97\xdb\xc5\x54\xb7\xa0\x54\xca\x49\x27\xdd\x45\x72\x2b\xac\x65\x96\x28\x3b\xd0\xde\x0c\xe7\xd2\xe5\xce\xd0\x33\xf0\x31\xac\xe7\x33\xe8\xa5\x6f\xe3\xaf\xf4\x6d\x9d\xa8\x7f\xba\x6f\x65\x0d\x35\xb3\x65\x3e\x01\xcf\x46\x73\x92\x83\xad\x4f\x64\x30\x8a\x29\x2a\x4d\x39\x9f\xcf\x46\x32\x7b\x3c\x6e\x5d\x43\xd3\xda\x33\xe5\xce\x4b\xcf\x8c\xa5\x5b\xcf\x74\x77\x29\x5d\xe1\x34\x3d\x03\x9b\xee\x3d\x0b\x82\xd0\x6b\x76\x36\xcf\x98\x8e\x35\xd7\xb0\x3f\x04\xd1\x5d\xcf\x66\xb9\x28\x56\x95\xa1\x5d\x51\x87\xad\x63\x0a\x08\x71\xc2\x08\xc1\x91\xe9\xb9\xb5\x61\x69\xd5\xc9\x9c\x62\x3e\x97\xb5\x4b\x4e\x16\x82\x90\xcf\x19\x26\x52\x09\x1e\x91\x3a\x6c\x2a\xd7\x5d\xe8\xb8\xdc\x17\xe9\x0d\xc7\x53\x78\xf4\x91\xff\xd7\x5c\xb6\x9b\x22\xec\xd3\xa7\x77\xf1\x24\x44\x89\x0a\x56\x62\x17\x34\x2e\xa8\xc3\xba\x09\x91\x43\x8c\xa7\x36\x21\x10\xcc\x75\xc8\x5c\x1a\x6a\x63\x3c\x17\x2b\x3e\x90\x58\xf8\x3a\xf8\x5f\xe8\xdd\xbf\xa8\x97\x78\x7b\xa7\x36\x78\x8c\x06\xa8\x9c\x01\x51\x7b\x71\xd9\xc5\x72\x6a\x13\x21\x2b\x2f\xaf\x99\x66\x89\x1b\x6b\xef\x80\x0c\xbb\x64\x34\x97\x8b\x19\xed\xc5\xe5\xe7\xd4\xa4\x15\x87\x60\x26\x61\x6b\x2e\xcb\x19\x79\x0e\x8d\xf7\xff\xd7\x0a\xfc\xad\xb4\xf1\xc1\xd3\x31\xf8\xed\xff\x8f\xef\x7e\xb7\x5b\xa9\x46\x3e\xfc\xed\xf7\x1f\xe1\xdd\xe3\x8f\x1f\x77\xa0\x8e\x97\x6a\x74\x1d\x0d\x2f\x61\x4d\xdc\xe0\x86\x2c\x0f\x9b\xd9\x24\x04\x52\x91\x65\x89\x4d\xbb\xd6\xd9\xe5\xd0\xa1\x59\xea\x2e\x3b\xe6\x4e\x25\xd5\x1c\x91\xa8\xcc\xa8\x2a\x72\x49\x75\xa2\x1a\x46\x0b\x77\x1c\xcf\x50\xd4\x54\x64\x7e\x2f\x0e\x1b\x3e\xfc\x8e\x81\x7f\x21\x49\xf1\x0b\x78\xb8\x26\x79\x9a\xd4\x09\xd5\x06\x3b\x65\x1b\x0e\x29\x70\x92\xd9\xec\x19\x1d\x7e\x07\xc1\xf7\xce\xba\xb2\xfb\x06\xb8\x7e\x46\x87\xaf\x73\x8e\x63\xb5\x71\x4d\xbe\xb2\x91\xee\x47\xda\xe3\x3e\xab\xc1\x30\x56\xe2\x82\x97\xc5\x58\x5f\x6a\xd0\xb1\x72\xa7\x6b\xce\x59\x52\x27\x24\xca\x7f\xd2\x7b\xf9\x75\xda\xd5\x1b\x0e\x5a\xc5\xf9\xca\x9b\xe7\x55\x45\x7e\x6d\x61\x3c\x3c\x46\x64\x57\xba\x0a\x6a\xce\x4a\x9c\xb3\xb2\xbc\x2b\x14\xbb\x2a\xce\xad\x3b\x5d\x3b\xc6\x52\x93\x90\x50\x7f\x55\x3b\x75\xd5\xbb\x14\x0a\xcf\x87\x72\xba\x91\x43\x1f\xeb\xe0\xfb\xe0\xbf\x0a\x7e\xef\x4f\xe9\x2d\x7d\xeb\x9b\xba\x13\xc2\x6c\xb6\x91\x4f\x14\x3e\x1c\x3e\x06\x87\xc7\xcf\x5f\x1e\x63\x0f\x16\x78\x5c\xfe\xe9\x4e\x9a\xac\x80\x89\x72\x10\xae\x91\xbc\x4c\x4c\x56\x16\x7d\x47\x53\xed\x34\x07\x2c\xdd\x40\x38\x64\x05\x70\x49\x9c\x92\x65\x5f\x24\x23\x98\x24\x87\x2a\xd6\x05\xc2\x46\x8a\xb9\x71\x05\xc6\xa7\xd2\x5d\xaa\x12\xf1\x30\x71\xe5\xc5\x0c\xc0\xc2\x02\x73\x08\x46\xae\x5a\x17\x98\xa6\xb6\x50\x2d\x36\x87\x0d\x8a\x43\xb6\xeb\xd7\x39\x7e\x95\x5e\xfa\xc6\x1e\xbe\x43\xa3\x85\xe5\xa8\x46\x05\x25\x28\xcd\xbb\xc4\x21\x0e\x26\x19\xa3\x69\x18\x66\x7c\xc9\x6d\x8e\x24\xf4\x73\x73\xe1\xa7\x55\x3f\x78\x17\xe0\xc5\x36\xdc\xe7\x5e\xb3\x7e\x55\x89\x7c\x9e\x0b\x5f\xdf\x97\x7f\x79\x11\xa8\xb8\xcf\xc6\x72\x34\xad\xd3\x11\xf9\xe9\x38\x7c\x7a\x82\xd6\x64\x39\x48\x84\x21\x1f\xc8\x29\xcc\xab\x22\x33\x39\xad\x66\xed\x3a\x99\x71\xa7\x29\x20\xe6\xce\x79\xc6\xc7\x14\x72\x52\xb9\x11\x25\x6d\x9a\x0c\x40\xd3\x61\x9f\x17\x55\x25\x19\x71\x99\x6b\x8b\x3c\x4b\x1b\xd2\x95\x39\xe2\x20\x1d\x96\x9a\x03\x82\x26\xcb\xf8\xd0\x13\xc6\x1c\x61\xd2\xc7\x28\xc2\xb0\xf7\x7e\x97\x0c\xde\x06\xbf\xff\x16\x9b\xf8\xe6\x65\x3d\x3d\xc2\xe3\x37\x29\xdb\x9f\x1b\xee\xbb\xa3\x97\xac\x0f\x83\xfa\xda\xd4\x30\xb9\x0a\x86\x79\x0c\x91\x62\x73\x1f\x25\xca\x86\xe9\x3c\x72\x26\x44\x46\x25\x9b\xfb\x58\xb6\xa6\x75\x67\x6b\x21\x6f\xcd\xd7\xb3\x64\xd4\xd4\x4a\x16\xc6\x1d\xf1\xb2\x51\xf2\xc5\xc6\xde\x05\x02\xca\x83\x89\xd1\x73\x64\xc1\x9f\x3e\x0f\xde\x56\x8a\x0f\xdf\xff\xe0\x09\x76\x5f\x28\x87\x6f\xb5\xfc\x66\x3e\x03\xde\x59\x40\x5f\x8f\xa6\x85\x0b\x68\x2c\x8c\x16\x64\x3e\xce\xac\x18\x64\x44\xaf\xcd\xfd\x09\x7b\xe3\x2b\x90\x0d\xcb\x72\x4c\x84\xe5\xac\xcc\x14\x8b\x32\xe9\xcc\xf2\xe5\x6d\xef\xd3\x4d\x1c\xc8\xee\xb4\xea\xf2\xbc\x7b\xd6\xe3\x79\xf7\x73\x3d\x1e\x5f\x7c\xfc\xf8\xf4\xb8\xcb\x6c\xc8\xe6\x1a\x58\xed\x02\x24\x27\x9c\xda\x8c\x20\xd7\x9f\x85\x0b\x6a\x60\x73\x1f\xa2\xdd\xc9\x1a\x97\x02\x71\xf9\x98\xe7\x58\x95\x43\x55\x60\x0a\x39\x5c\x5c\x03\xa3\x09\x82\x08\xfa\x1b\x3a\xe8\x7d\xea\x11\x3e\x6b\xed\x9e\xa7\x7a\x09\xf6\x1f\xbf\x7f\xbf\x65\xde\xdf\x85\xfe\xd2\xdd\xe9\x06\x41\x05\x8c\xba\xd6\x35\x6e\x74\x96\xc0\x58\x37\x8a\x99\xc6\xa9\x1d\xab\x4f\xed\x60\xae\x62\x9f\x96\x64\xd2\xb5\x81\xc2\x8d\xad\x9d\x3a\xc4\x25\xc7\xa3\x76\x97\x5b\x50\x5d\x2e\x01\xc0\x70\x23\x07\xb9\x1b\x5f\xe5\xc1\xf7\x1b\x3b\xe7\xdb\xc7\x30\x08\x2b\x1b\xaa\xb9\xb7\x70\x24\x0e\x0f\x6a\x9e\x68\x98\xa3\xf9\x14\x31\x30\x4e\x98\xf9\x72\xb4\x43\x58\xba\xca\x9d\x15\x54\x5e\x3e\x3a\x00\x38\xdf\xf0\x3e\xfb\x27\x78\x97\x0f\x1f\xbf\xdf\xf5\x78\x75\x30\x1b\xc1\x28\xab\x45\xc3\x21\x50\xee\x08\xe5\xd9\xd3\x23\x7b\xda\x65\xdc\xd6\xc6\xaa\x6b\x1d\x95\x6e\x3a\x6d\xb4\xcb\x45\x69\xab\x8d\xfb\x14\x1f\x92\xa8\xf6\xda\x53\xcf\x9c\x43\x31\xaf\xeb\x9f\x74\xbd\x3b\x45\xf6\x6b\x4b\x76\xc9\x55\x7b\xed\x41\x11\x34\xf1\x72\x06\xfe\x6e\xf3\xda\xd6\x58\xee\xe2\x69\x7c\xb3\x80\xc1\x13\x88\x7e\xff\xf6\x31\x3a\xd5\xbd\xd2\xe6\x78\xee\x45\x7f\xa2\x46\xe4\x18\xe3\x79\x80\x63\x7a\xec\x19\x54\x85\x3b\xc6\xf9\x7c\x6e\x5a\xde\x35\xa3\xbb\x68\x40\xa3\xab\x38\xb5\x09\x8e\x88\x13\x8e\x4a\x79\x5c\xb9\x6a\xed\x8d\x1c\xb8\xd7\xce\x78\xd9\xbf\xa1\xae\xff\x78\xac\xf7\x66\x27\x7e\x3a\x8b\x5d\xf7\xd5\x63\x86\xa3\xf4\x66\x0e\x22\xae\xbc\x0e\xff\xe6\xa4\x1f\xaa\xab\x8c\xfa\xaf\x75\x5c\xd9\x9f\xb4\x8d\x9b\xc5\x1e\x86\x2e\xd0\x07\xb2\xa7\xc1\xdb\xcd\x32\xfc\x15\xf6\x8b\xc3\xb3\x34\x96\x3f\x80\xd7\x38\xc7\xb2\x7d\xe0\x08\xc8\x42\xa3\x01\xb9\x5e\x3b\x6a\x5d\x9f\xc1\xb9\x2a\x55\x56\x44\xe9\xb5\x16\xe1\x78\xa5\x98\xf2\x53\xed\x16\xc7\x50\xcf\x72\x77\xd4\x5a\x6b\x55\xd7\x75\x7d\x21\x34\xc7\x48\x2b\x57\x40\x81\x2a\x6e\x5a\x57\x0e\x41\x10\xc4\x20\x03\x1c\x0f\x71\xea\xa3\x80\x7f\x1f\xfc\xde\xc7\xce\x57\x96\xd7\xf7\xfe\xf4\x3f\x7c\xfc\xfc\xf4\xf0\xfe\xdd\xe3\x13\xbc\x20\x99\xfb\xf4\x8f\x7f\x78\x66\x4b\xf8\xe1\xe9\xc3\xbb\x0f\xdb\xb3\x2b\xf3\xca\xe0\x1c\xa6\xaf\xbd\xd6\xd2\x46\xcd\x9c\x9b\x5d\x42\x69\x96\xe7\xb4\xa8\x75\xad\x43\xb2\x7c\xaf\xf7\x15\x25\x25\x93\x8e\x3b\x3b\x4d\xbc\x3d\x45\x81\xb2\xf6\x7a\x74\x7d\x38\xce\x3d\xa5\xa9\x42\x62\x0b\x5d\x24\xd2\x13\x73\x78\x6c\x75\x30\xdc\x94\xaf\x03\x79\x39\xc7\xd9\x4f\x34\x0e\xfe\x48\x63\xa2\x7f\x42\x3a\x3e\x06\x41\xf0\x67\x50\x07\xd9\x21\xdf\xc6\xf4\xfe\x99\x31\x74\x8b\xa2\x7b\x17\xe3\x19\x89\xf5\xe5\x39\x57\xf4\x3a\x98\xf6\x37\xf0\xad\x38\x3d\xcc\x60\xac\x61\x74\x69\x28\x7f\x52\x21\x77\xa9\x8f\xc3\x86\x01\xb0\x6b\xb6\x53\x5f\x95\x8d\xf0\xb5\xbb\x3f\x47\x3c\x4c\xe8\x14\xaa\xf1\x54\x5d\xce\x7b\xad\xb5\xbb\x54\x52\x56\x1c\x21\xe4\xc4\xac\xa1\x23\x23\x1e\xf1\x91\xe3\x52\xe6\xa8\xa8\x24\xf2\xb5\x37\x09\xd8\x80\x1e\xe8\x5e\xbf\x8a\xf6\xfd\xfb\x3b\x83\xf1\x33\x86\xeb\xbe\x28\xbe\x7c\x7a\xfa\xf0\xc3\xf6\x73\xff\xfe\x25\xea\xec\xdb\xe7\x1d\x5b\x0e\xe3\x62\xf1\x39\x95\x1b\xdc\xe8\x5a\x02\x23\x0f\xd5\xac\xc6\xe5\x40\x37\xe3\x08\x97\xed\xc3\x6c\x4d\x6e\x15\x57\x0a\x53\xd5\x85\xe3\x8b\x3f\xec\x75\x99\x65\x9a\x69\xd1\xb4\x5c\xd5\x9d\xc2\xcb\xd5\x2e\x97\x6f\x53\x89\x30\x95\x14\x33\xcc\x55\xf3\xe2\x73\x10\xc2\x10\xf0\x43\xb5\x5f\xf6\xcd\xe3\x4b\x8f\x6f\xff\x73\x41\xac\x65\xb7\xfe\x47\x78\x0b\xa7\x30\xcf\x0a\x5b\xe6\x61\xfa\xb5\x88\xfa\xbc\x12\x55\x62\x13\x79\xaa\xb1\xd3\xa9\x69\x44\x2d\x92\x5d\x43\x71\xc9\x84\x69\xe6\x73\x91\x63\x5b\x0c\x0a\x73\xe8\xdc\xf9\x16\x50\x45\xcf\xb0\x71\xff\x9d\x6f\xfc\x60\xbd\x36\xd6\xb2\x5f\xbf\x7f\xfb\xfe\xb9\xc0\xee\xce\x69\xe7\xdb\xf5\x1b\x6a\x17\x34\x50\x8e\xd2\x9d\x9d\xae\x8c\x90\xb4\x4a\x9a\x02\x73\xd7\x92\x8e\x0b\x46\x54\x1d\x93\x99\x9e\xa1\x60\x4e\xdf\x82\xd9\x54\x45\x92\xa8\x09\x3b\x55\x54\x94\x87\x18\x95\x1a\xad\xbc\xdf\x21\x0a\x78\x7c\xde\xd3\x3f\x6d\xaf\x9f\xef\x86\x9e\xab\x6b\x57\xd7\x61\x50\xef\xd8\xac\x29\x4b\x6c\x82\xa1\xbf\xda\x88\xcf\x24\x42\xd3\x14\x00\xd8\x40\x1f\xe8\x9e\xfa\xb3\xe1\x05\xe2\xcc\x57\x4e\x3f\x7c\xf7\xbb\xbf\x83\xcf\x2f\x0d\x90\xc3\xc7\x2f\x0f\x9f\x1e\x7e\x78\xf8\xf4\x10\x77\x4c\x22\x9c\x23\x9c\x97\xa9\x6b\xac\x1b\x18\xe4\x90\x9e\xf3\x3c\xad\x17\xb3\xe3\xe8\x54\x6d\x8b\xbe\x86\xca\xee\x06\x97\x9c\x53\x93\x08\x48\xc8\x3c\xc2\x05\xbb\xa2\xcc\x92\x34\xb7\x74\x28\x33\x24\xe0\x5c\xe8\x12\x90\xbb\x10\xa8\xdc\xb8\xea\x23\x79\xdf\x2c\x5b\x6b\xbb\xa2\xd7\x3a\x22\x8f\x6f\xbf\x31\x83\x1f\xa3\x80\x41\x91\x63\xd4\x89\xba\x18\x04\xcd\x8a\xcc\x1d\x99\xbb\xa4\xa6\x56\x46\xa5\x26\xce\xe6\xf3\xf5\x7c\x6a\xcb\x0e\x89\x36\x24\x61\x3e\x07\x73\x33\xfa\x92\x5a\x7f\xde\xca\x1b\x0e\xcd\x4e\xdf\x75\x64\x36\xce\x2e\x98\x6c\x45\x6b\x4c\x08\x24\x3b\x5d\xd6\xf5\xb5\x0c\xcf\x9c\x58\x28\xb7\x3a\x26\x7c\x50\x3b\xec\x51\x0e\x1f\x9e\x3c\xce\xe1\x05\x1e\x64\xeb\x5b\xd4\x5e\xa2\x8e\x02\xcd\xb4\x25\xaa\xa8\x69\x85\x52\x67\x98\x33\x79\x3d\xa8\xce\x44\x9d\x71\x7c\xee\xdc\x94\x75\x85\x05\x05\x76\x9e\x1c\x6e\x85\x05\x13\xc4\x01\xb9\x91\x7d\x12\x8b\x20\xdd\xd8\x2c\xaa\x80\xbc\x60\xba\xbb\xd7\xa6\xbc\xe4\xb2\xb8\x53\xd7\x1e\xb6\xdb\xe8\x65\x9a\x6e\xff\x3e\x3e\x78\x7d\xc0\x4d\x13\xc5\xe3\xca\x9e\x1e\x3f\x36\x70\xf4\x49\x38\x7b\xbc\xe0\x63\xeb\xda\x48\x7b\x44\xf2\x5c\x93\x4c\x67\x24\x6c\x1a\xcd\x54\x3d\xf7\x2a\x87\x22\x1b\x47\x02\xaa\xec\x92\x1c\x55\xa4\xaa\xb2\x9c\x99\x30\xd5\x79\xd9\xba\x11\x52\xc3\x58\x5d\x1b\x77\x2a\xf6\x19\x50\xd7\x68\x67\xa0\x1c\xa8\x24\x16\xce\xd8\x52\xc6\x99\x94\x85\x16\xae\x20\x82\x0b\x72\xcc\x84\xab\x9d\x14\xa2\x83\x36\x43\x88\x70\x5c\x15\x39\xeb\x51\x2e\x15\xa0\xe5\xe6\x70\xbd\x99\x26\xb5\xda\xc5\xfc\x46\x0e\x64\x9f\xbe\xe6\x26\x7e\xfc\x6d\x6e\xe2\x37\xfb\xa7\xc7\x77\xf0\xf4\xf8\xce\xab\xb2\x9c\x6d\x5e\x40\x9b\x15\x75\x55\x84\x66\x56\xcf\x99\xe7\xfa\xa7\xb6\x41\x48\x8c\x61\x3b\x4f\x61\xb2\x3e\xfb\xb4\x64\x14\xa3\x92\x32\xdb\xf9\xff\x92\x08\x11\x24\x20\x6b\xbb\xce\xad\x4f\x10\x07\xf6\x56\x1d\xe8\x3e\x78\xce\x5f\xfd\xd5\xa6\x1f\xb6\x65\x18\x1e\x3c\xea\xf3\x6e\x57\xc2\xe2\x7c\x6e\xdc\x26\x91\xb4\x9e\xda\xa5\xfd\x49\x86\xc8\xb1\x1d\xfe\xda\xdd\x1f\x28\xe8\xc9\x51\x04\x34\x4a\x21\x03\x44\x5c\xe7\x4e\xfb\x80\x6a\x7e\x6d\x23\x32\x09\xd7\x08\x57\x4b\x37\x72\x86\x4d\x81\x0b\xaa\xe5\x56\x37\x99\xdf\xe8\x21\x87\x7e\xe5\xce\x7f\xd8\x94\xb3\x9f\x93\x99\xef\xbe\x9d\x0a\xbb\x69\x1e\x08\x50\xa8\x79\x5a\x17\x14\xb9\xc4\x21\x1d\x49\x42\x2a\x9a\xb3\x7c\xd9\x74\xe7\x22\xad\x64\xd5\x54\x05\x12\xd0\x9d\x09\x49\x74\xb2\xc6\x30\x41\xdc\xe8\x81\x87\x89\xf7\x01\x5f\x22\xe9\x7e\xde\x5c\xcc\x58\xcd\x54\xa6\x59\x95\xa7\x57\x2a\xc0\x84\xb9\x4e\xeb\x92\x93\xd9\x4b\x23\x24\x6e\x92\xa9\x4e\x0b\xec\xda\x22\x43\xaa\xea\xcb\x12\x8b\x55\xc3\x30\x0a\x78\xc8\x0f\x2a\xa6\xc1\x5f\xdf\xf9\xb5\xdf\xbd\x12\x46\x8a\xb6\x60\xe3\x16\x6b\x3c\xdc\x15\xd9\xde\x3e\xbe\x7b\x04\xbe\xbb\xd8\xae\x28\x87\x46\x74\x1d\x07\x22\x1c\x3a\xe7\x46\xa3\x9c\xca\x73\x77\x2d\xfa\xb0\xee\x5c\x49\x41\x37\x2e\x3d\xed\x4e\x5f\x8b\x98\x5a\x82\xab\x12\x09\xc5\x90\x94\x7a\xf1\x7b\xdc\x11\x63\x93\x01\x23\x44\x18\xd7\xf7\xb2\xbe\xb8\xcc\xd7\x17\x47\xcd\x4d\x1e\x74\x9c\xad\x63\x0f\xbf\x6d\x6f\xef\x8f\x7d\x7e\xfb\x3e\xdc\xf8\x56\xe2\x89\x1b\x2a\x72\x45\xcb\x22\x9d\x47\x5a\x43\x2e\x72\x9b\x31\xed\x3a\x77\x51\x71\x36\x27\xee\x92\xd9\xcc\x86\xf8\xa7\x53\x91\x33\x28\x4a\x37\xb5\x15\x61\xfb\xd1\xf3\x5f\xca\x43\xb3\xc3\xbf\xd6\xc6\xeb\xf9\x9d\x68\x4f\x44\x2e\x09\x29\xd2\xb9\x43\x10\x00\xa3\x49\x5d\x90\xca\x11\x67\xc4\x0e\xcf\xa3\xe7\xe9\x34\xc0\xae\x4d\x91\xd1\xb6\x9a\x70\x89\xe5\x2e\x0d\x02\xd8\xa9\x1b\x3b\xd8\x1d\x59\xfd\xf8\x97\x54\xab\x7e\x9d\x7c\x7b\xab\xb1\x71\x9a\x98\x0e\xa7\x26\x43\x95\x1b\x6f\x81\x0c\x1b\x66\x10\xcd\x18\x2a\x8b\xa8\xbf\xca\x22\xc7\x43\x71\x0b\x50\x85\xd9\x0e\xcf\xfd\x29\x33\x99\xf0\xf5\x90\x78\x87\x76\xf6\x25\x47\xfa\xdb\x7f\x01\x47\xba\x04\x63\x41\x3b\xb9\x9c\x1c\x5e\x44\xce\x31\xa8\x5d\x03\xd4\x89\x93\x07\xae\xce\xd3\x86\x5f\x65\xcc\xf0\xf9\xc2\xcd\xe5\x62\x78\x98\x71\xd7\x73\xce\xdd\xc0\x39\xbf\xf3\x13\xa2\xb0\xdd\xe1\x5f\xe3\x27\xf4\x82\xd3\x9f\x41\xb4\x5a\xd8\x3a\xa9\x95\xd0\x35\x34\x5a\x8f\x76\xda\x61\xcc\xb5\x20\x03\x66\x9a\x93\x33\x5d\x3c\x1c\xb1\x69\x6b\x56\x37\x76\xd0\xd1\xe8\xe7\xed\xe1\xe7\x58\x81\x17\x97\x64\x74\xe2\x1d\x70\x91\xdb\x9c\x13\x87\xdd\xd1\x44\x8d\xa8\x99\xca\x35\xc3\x65\x1a\xb1\xeb\x29\xcf\xb1\x29\x4f\x55\x89\x59\x74\x99\xa7\x21\xb5\x29\x07\xb4\x9e\x6f\x2a\xac\x0e\x6a\x77\xf1\x7d\x7e\xa1\x9b\xbd\x32\x90\x7f\xab\xc0\xdb\x9a\xdd\x68\x64\x5a\xc9\x39\x17\xae\x54\xd2\x8a\x06\x8a\x9a\x35\x17\x9c\xd6\x29\xae\x5c\xeb\xce\x7a\x97\x58\x23\x55\xbb\xbb\x78\x11\xf7\x8c\xb8\x4b\xad\xda\x93\x6b\x8a\x1c\xd7\xe5\x80\x10\x66\xa0\xec\x51\x0e\xfd\x3a\x67\xd5\xa1\xdd\x72\xd5\xf7\x0a\x2b\x2f\xa3\xf6\xde\x9b\x7c\x9b\xca\x94\x2f\x6b\x85\x53\x5d\xee\x93\x9f\x1a\xad\xf9\x59\xef\xce\x5f\xf3\xcb\x5e\x95\x65\x96\xdb\xca\x0a\x9d\x7c\xcd\x63\x55\x48\x7b\x94\xf2\x68\x8c\x71\x85\x2b\x20\x2d\x1c\x07\x1b\x56\x2b\x3f\x6a\xb9\x2f\xc3\x66\xe5\x06\xfd\x19\xba\x75\xbb\x2d\xbf\x3c\x9e\xa2\x96\x41\x92\x0a\x49\x64\x6e\x68\x91\x27\xee\xc2\xdc\x90\x76\x27\xd1\xd7\xa9\x3b\x87\x8d\xbb\x38\xde\xe5\xa6\xa0\x5e\x0a\xc3\xb5\x4a\x4a\x48\xa6\x65\x1c\xf2\x86\xf6\x49\x94\x06\xd1\xc6\x5b\xe8\x59\xd4\x52\x9f\x4f\x5b\x3e\xef\x84\xb5\x73\x66\x55\x27\xac\x04\x6e\x6d\x94\x5e\xcb\xe8\xe8\x90\xd3\x56\x0a\xc0\xc0\xaf\x8d\x7f\xe7\x3b\xcf\xb3\x14\x25\xfe\x4d\x3c\x6b\x78\xbc\x7b\x71\x98\x6e\x85\x54\x9e\x79\x2b\x3f\x10\x54\x0f\x1e\x4b\x21\x9c\xc1\x4c\xb2\x5c\x88\xc2\x29\x50\xae\x05\xe2\x86\x02\x4c\x94\xa8\x2c\x95\x8a\x6b\x2e\x68\x61\x4b\x8a\x35\x57\xdc\x13\xb3\x83\xc7\x09\x5c\xfe\xd9\x6d\x45\xf5\xff\x97\xb6\x78\x94\xfa\x38\xf7\x87\x6f\x5c\xb0\xbf\xd5\xd6\xee\xf1\x63\x1e\x1b\xec\xce\xae\x09\xeb\x99\x45\xd5\x75\x20\xda\x73\x27\xd0\x6b\x1d\xb1\xb9\x0a\x07\x77\x74\x75\x11\xf6\xb1\x54\x79\x2a\x14\xd3\x05\x27\xb9\x29\x48\xa2\x99\xe2\xa9\x5a\xee\x26\x72\x13\xfb\x36\x16\x6b\x7b\x61\xf4\xf8\x63\xf4\xe5\xcd\xdb\xc3\xc7\x17\xe4\xc4\x0f\x1f\xee\x06\xdc\xe1\xe3\x9b\x88\xe9\x82\x00\xa9\xb4\x30\x2d\x27\x09\x57\x15\xca\x48\x55\x26\x05\x4f\xac\x15\x46\xa5\x65\x69\x9a\x98\x64\xee\xe8\x26\x01\x1d\x9e\x27\x37\x31\x3d\x07\x6e\xca\x6c\x46\xfa\x90\x3a\xe2\x70\x23\x6b\x50\x20\x55\xe5\x05\xe1\xc3\x7d\x19\x05\x87\xdc\x73\x0b\xff\x7a\x0e\x4f\x5b\x2c\x09\xca\x09\x2e\x32\xd7\x18\x13\xcb\x19\x71\x92\xea\x34\xaf\xc2\x72\x1e\x36\xce\x99\xf0\xbc\xeb\x63\x1d\xfc\xc3\x56\x8f\xf7\x32\x8c\xfd\xee\x9b\x57\xba\x98\x64\x1f\xee\x21\xaf\x27\xbf\x81\x80\xca\x34\x6d\xac\x17\x7f\x38\xba\x12\x0c\xa5\x45\x99\x8b\xe2\x16\xd8\xd1\x80\x72\x19\x5c\x6e\x41\x51\x72\x13\xeb\xbc\xc8\x39\x57\x5c\xf2\x13\x26\x89\xac\xd0\x2d\x80\xe0\x02\x8c\x4b\x5e\x15\x44\xf9\x7c\x64\x19\x5e\x0e\x3a\x2e\x83\x37\x1e\x1b\xbc\x78\xec\xdf\xbd\x12\x22\xdf\x7f\xfe\xf2\xf8\xbb\x5d\x8d\xc3\xa9\xa1\xb2\x17\xbd\xac\x07\xdc\x69\x0b\x89\x46\x4e\x96\xfb\x46\xf3\xcc\xf5\x0c\x13\xcd\xa8\x42\xa6\x64\x0d\xd6\x5d\xbb\xd5\x2b\xd7\xe1\x71\x5d\x83\x7f\x7a\x5d\xec\x3f\xe6\x71\x8b\xdd\xd1\x19\x2f\x48\x8d\xaf\x1d\x51\x5a\x64\x5a\x97\xd7\x21\xaa\x56\xda\xc8\x32\x1c\xc3\xa3\x4e\x13\xae\xa8\x92\x8c\x2c\x37\x09\x53\x54\xb1\x54\x05\xbb\x60\x08\x2f\xbb\xcc\x73\xcd\xdf\xab\x66\xbe\x5d\x10\x0f\xef\x3f\x3d\xf9\xe9\x5b\x6c\xb7\x5d\xea\x8e\x90\xbb\x11\x8a\x6b\x6b\xa7\x29\xcc\xe6\x8b\xc7\x0e\x20\x25\x9d\x95\x2a\xa2\x93\x74\x56\x39\xe3\xc5\x6c\x56\x5e\x20\x13\xf9\xb5\xfd\x76\x5b\xc2\x2b\x6d\xc5\xaf\x0f\x47\x44\x68\xe6\xa1\x75\xbd\xbb\x14\x11\x85\x56\x8e\xce\x2c\xee\x69\x84\xae\x3d\xe1\x9c\xe6\x9c\x95\xd7\x1e\x72\x61\x74\x96\x98\x94\xc8\x32\xb3\x46\x58\xc3\x49\xae\x73\xba\xf9\x5f\x53\x38\xf9\x5a\x9a\x62\xb5\xfe\x56\x0a\xb6\xd5\xc3\xfc\xf8\xf4\x2b\x22\x05\x5f\x3e\x3c\x3d\xee\xb4\x01\x5a\x14\xa8\x50\x99\x60\x92\x25\xc3\x62\x71\x72\x42\x78\xcf\x1b\x86\x09\xc5\x38\x4f\x46\x08\x62\xd9\x3b\x89\x90\xcd\x6b\x21\x9a\x49\xf3\x0a\x0b\x5c\x29\x22\x30\x2f\x0b\x9e\x17\x88\x1a\xcf\xed\x7c\x8e\x50\x2c\x83\xbf\xd9\xee\xda\xc5\xa2\xf7\xf7\xc4\xbb\xd7\x10\xc3\x1f\x9e\x1e\x2d\x94\xe6\x72\xe1\x34\xe3\x82\x08\x46\x73\xc6\xb0\x31\x25\x10\x77\xdc\x77\x7d\xaf\x55\x9a\xa9\x3c\xd3\x7c\x79\x59\x14\xe7\x99\x29\xeb\x20\x0a\xd8\x8d\x45\x7d\x1c\x04\x87\x8d\x43\x6b\x73\x2b\xe1\x53\xea\x77\xed\x7f\x09\x2b\x11\x58\xd4\x58\x47\x2d\x14\x06\x9d\x1b\x66\x7b\x74\x54\x52\x72\x1d\x07\x5f\xab\x5d\xf9\x75\xd8\x1d\xdd\x71\x36\x6e\xf1\x0a\x15\x85\x14\xb0\x33\xc2\x0a\x63\xfc\xef\x47\x51\x15\x27\xff\xe4\xef\xaf\x8c\x33\x16\x12\x8b\x5a\xc3\x64\x5d\x1e\x19\x66\x84\xc6\xc9\xd7\x6c\x47\xbe\x76\xbb\xb3\x1b\x66\xed\x94\x3b\x72\xff\xfb\xa9\x53\x88\x29\x81\xbd\xff\x84\xa3\x32\x2e\x9e\xb9\xd6\xb7\x5a\x84\x35\xda\x72\xb7\xcf\xa3\x17\xee\x53\x13\xea\x59\x1a\x9f\x77\xda\x9e\x54\x73\x2d\x34\x58\x56\xc9\x8a\xc6\xc5\x4f\x53\xa4\xc7\xd9\x4c\xb3\x19\x1d\xc7\x93\xe2\xb6\x13\x0a\x6f\x7a\x4a\x61\x73\xc3\xbb\x73\xac\x82\xef\x36\x9d\xaf\x4f\x0f\x1e\x01\xba\x1c\x0b\x61\xf4\xf1\xcd\x43\x94\x69\xa1\x88\xeb\x47\xcd\x13\x25\x44\x8c\x5c\xb1\x2c\x6b\xed\xba\xd9\xc2\xd9\x51\x77\x66\x90\x79\x52\xa7\x70\x67\x6e\x95\xd7\x6a\xfe\x3e\xf8\xbb\x20\xd8\x7f\x7c\xf3\x97\xf0\xfd\x17\xcf\x4d\xfe\x32\x23\xf9\xf4\xf1\xc7\xdf\xc3\x8f\x4f\xdf\x1d\xe2\xbf\x80\xf8\xed\x9b\xf7\x9f\xdf\xee\x13\xa9\x21\x3d\xb3\xe3\x08\x7d\xa6\x98\xe6\x9c\x52\x43\x0c\x4d\xf2\xac\x2c\xd3\x24\x4d\xb3\xba\xa2\x28\x1b\x08\x74\xe1\x19\xfa\x92\x71\x56\xba\xce\xe5\xae\x6f\x8d\xd6\x75\x2b\x95\x3c\x26\x29\xc6\xb6\x4e\x8a\x56\x11\x39\x44\xd6\x9d\x87\x13\xa4\x41\x10\x46\x72\xc3\x07\xfd\x3b\x1f\x5b\xf1\xe4\xe6\xaf\xf2\xa3\xe1\xc7\x0f\x6b\xb2\xf9\xfb\x68\xe9\x4b\x7c\x51\xae\x73\x32\xec\xf2\x41\x76\xa4\xd5\xfc\x42\x4f\xb2\xac\xf3\x32\x31\x5a\x83\xc5\x95\x96\x79\xac\x34\x2b\xdc\xe0\x32\xd7\x36\xca\xc8\xae\xd6\x4a\x76\x18\xcc\x71\x26\x8e\x30\x18\xc2\x01\xba\x72\xd6\x9e\xee\x22\x5b\x35\x74\x89\xe7\xd7\xfe\xb7\x3e\xd2\xb2\x35\xf7\xc3\x2f\xfa\x12\x46\x9f\x96\x2e\xec\x64\xda\x9a\x16\x2c\x90\xa5\x2b\x2a\xec\xf2\x5e\x0e\xa4\x37\xe6\xc4\xce\xba\x45\xa6\xd2\x22\x8f\x9a\xd9\x38\xca\xa0\x0e\x1b\x68\x4a\xa6\x58\xe9\x4e\xae\x70\x5d\xab\x8c\xe8\x7b\xa9\xe5\x00\x08\x88\x9b\x2e\xe7\x55\x8f\x25\x84\xc9\xf3\xde\x8b\x4d\x7b\x3c\x84\x8f\xc1\xcb\x3e\xec\xef\x08\x8f\x8f\xff\x00\x1f\x7d\x2f\x22\x93\xdc\x02\x03\x41\x18\x40\x2b\x1d\x73\x69\x24\xca\xb1\x83\x40\x8e\x5d\xe7\x06\x0e\xf9\xc0\x31\xcf\x2d\xee\x9a\x32\x6a\x66\xe5\x10\x83\x2e\x6c\xa1\x2d\x99\xe2\x85\x3b\xb9\xd2\xf5\x9d\x36\x7a\x18\x8c\x15\x83\x11\x93\x71\xe3\x34\xc2\x9a\x5f\xd4\x5b\x5f\xfe\xe4\x7c\x7c\xff\x3c\x1f\x59\x3a\x9a\x11\x7a\x90\xd2\xd5\x8e\x44\x41\x7e\xae\xcf\xf2\x68\xdb\x89\x41\x50\x9f\x50\x5d\xd5\xa6\x88\x9a\x59\x2c\x93\xdf\x84\xfd\xb7\x3e\x60\x57\x77\x5a\xab\x7e\x50\x46\xac\x13\x72\x19\x2f\x90\x7b\x9b\x7b\xb1\x61\x6a\xcf\x95\xf4\x37\xc1\x0f\x2f\x38\x37\x7d\x8d\xdf\x9d\xa4\xf4\xf3\x1f\xe0\xf1\xed\x0b\x90\x96\x81\xa2\x86\xcc\x5d\x12\x28\x5d\x4f\x2e\x6a\xc0\x6e\x00\x92\xb8\x13\x27\x95\x29\x71\x68\x2c\xc2\x9a\xac\xdc\x2d\xe6\x84\x90\x71\xf5\x85\x0f\x90\x19\x84\x4e\xa1\x6a\x06\x74\x6c\xaa\xf2\x62\x71\xb7\xe6\xc9\x93\x6d\x5d\x6c\xef\xe4\x57\xe6\xe1\xe0\x11\x94\x2f\x56\xc6\xd1\x1c\xc1\x2c\x2b\xa3\xf7\x2b\x63\x50\xcb\xca\xe0\x95\x21\x6c\x34\xcb\xda\x50\x72\x59\x1b\xd2\xe1\x6f\x53\xe1\xd7\x46\xe5\x9a\x46\x1b\xd9\x8b\x4a\x14\x5a\x1e\x01\x01\xbe\x05\xe3\xc5\xf3\x5d\x85\x22\x30\x07\x15\xf3\x55\x4b\xe0\x1b\xfd\xff\xd6\xa1\xf8\xc8\x9c\x72\x49\x34\xb8\xb6\x71\x65\xd6\xaa\x26\x2c\x62\x6e\x58\xea\x4e\xf6\x7a\x89\x32\xc7\x5d\x2b\x80\x83\x86\x73\xb2\x9e\x29\x75\x40\x0f\x6a\xc5\x86\x6c\xec\x3f\x2f\xa1\xfc\x5e\x2d\xf8\x64\xf2\x22\x4a\x1d\x83\xd1\xa5\xf5\xec\x8b\xfd\x10\x91\x6d\x2c\x0b\xce\xac\x23\x76\xf9\x2b\x0b\xad\xe1\x74\x5c\x7d\x1a\x76\xa3\x9e\x47\xe3\x5b\x6e\xca\x8b\x46\xfc\x8c\xdb\x69\xfb\xdb\xa7\xc7\x7d\xea\x85\x6a\x2f\xd6\xa9\x8a\xdd\x45\x52\x8f\xcc\x59\x73\x72\x04\xda\x98\x0e\x7a\x2e\xc2\x64\x16\x4e\x7b\x8d\xd4\x8b\x29\xfd\x94\x99\x79\x0a\x4f\xda\xef\x59\x74\x68\x63\x14\xfc\x1b\x3f\x2b\xeb\x54\x3c\x3e\xac\x38\x06\x8f\x1d\x54\xc9\x59\x74\x11\xb9\x05\x0c\x72\xea\x3a\x05\xc1\x3c\x86\x69\x94\xcf\xca\xd5\x1a\x8a\xb0\x09\x9b\xeb\x79\x6e\x4f\x2d\x04\xe1\x29\xd4\x2e\xbd\x6b\xb4\x54\x7e\xed\xff\xcd\x8b\xb9\xbe\x27\x8b\xfc\x8d\xfb\x4c\x32\xf7\x7d\x3c\x32\x77\x74\x22\xbc\xb8\x73\x63\x15\xe5\x56\x29\x46\x88\x3b\x5e\x64\x0f\x5d\x2c\x34\xcd\x5c\x6b\x1d\x96\x5a\x33\xea\xca\x10\x33\xa2\xaa\x12\xb0\xeb\x1c\xf3\x1a\x97\x40\xa3\x3e\xb9\x6b\xf0\x9a\xed\x7d\x84\x87\x8f\x6f\xde\xfe\xe2\xa5\xec\x0c\x96\xb2\xa6\x36\xcd\x42\xeb\xec\xe2\xcc\xd6\x2e\x87\xf3\x3e\xb8\x05\x9d\x80\x04\xba\x9c\x33\x33\x8f\xf6\x3a\x46\xa9\x0d\xd3\x20\x82\xe5\xac\x57\xb1\x0e\x7e\x1f\x90\xe0\x7f\xff\x05\xba\xfb\xdd\x0f\xbf\x02\xeb\xfe\xe1\xc9\x0f\xed\xf3\x9b\xa7\x87\x47\xf0\x04\xc0\xcb\xae\xba\x13\x17\xfc\xcc\xd8\xd9\xca\x09\xa8\xcf\x30\x86\xb2\xc2\xb2\xcc\x5c\x01\x38\x75\x0d\x25\x27\x94\xea\x4c\xb8\xd3\x91\x4f\x19\xa4\xae\x1b\xb5\xe2\x70\x76\x3d\x5c\x5c\x5d\xc1\x04\x0d\x1a\xce\x8c\xe4\xb6\x2c\x4f\x2e\x27\x0a\x57\x19\x26\xa5\xcb\xa0\x28\x32\x9d\x16\xb1\x26\x9a\x6b\x4e\x69\x59\xa9\x42\xe7\x59\x9e\x15\xb4\xd0\x04\x91\x32\xd3\x99\x9e\x8f\xae\x70\x35\x39\x01\xbd\x84\xfa\xeb\x79\xcc\x75\x56\xc9\x3c\x9b\xa4\x28\x39\xd1\x3d\x5d\x0c\xed\xaa\x01\x8c\x70\x49\xd0\xca\xd9\x5d\xdc\xf0\xce\x3e\xe3\xa6\xff\x72\x53\x7e\xda\x18\x02\xa2\xcd\x94\xdb\x3f\xf8\xac\x8f\x47\xe0\x44\xac\x2a\x4e\xb3\xb9\xe4\xa5\x67\xc5\x5f\x1f\x3b\x58\x3b\x0c\xb1\x12\xda\x18\x4e\x5d\x6a\x6a\x53\xcf\x94\xf1\xb0\xf5\x94\x96\x01\xec\xcc\x56\xe7\xf3\xbc\xaf\x3e\xbc\x78\x85\x1f\x7c\x10\x91\x9a\x2c\x87\xee\x02\xa9\x1b\xad\x3b\x43\xbe\x18\x61\x26\x56\x85\x60\x76\x1e\xcd\x75\x8a\x12\x13\xa6\x8d\xa4\x90\x06\x21\xf4\x37\xba\xaf\xbc\x0e\xd6\x5f\x7f\xd3\x66\xfb\xa6\xf0\x1e\x1c\xee\x9a\xcc\x9f\xbf\x3c\x46\x03\x4a\x6d\x86\x2e\xe1\x28\x72\xaa\xb9\xc5\x34\xbb\x05\x3d\x87\xaa\xd1\x8d\x96\xbc\xca\x5c\x16\x2b\xa5\x4b\x2b\xdd\xd1\xba\xf6\x16\x9c\x27\xd4\x35\xd8\x35\x46\x5d\x40\x4e\xa7\xca\xb6\xdd\x39\x08\xc3\xf5\x3e\x26\xc1\xc1\x33\x00\xdc\x29\x0f\x36\xef\xfd\x05\xd8\xe6\x8e\xae\xd9\x68\x40\x0e\xb2\xbe\xb2\x1a\x8e\x86\x86\xcd\x9c\x70\x05\xc2\xc2\xc9\x15\x61\x31\x9f\xec\x5c\x87\x6c\x1e\x73\x23\xdc\x04\xac\x8a\x89\xb3\xa7\x23\xb0\x4b\x7e\x34\x9d\x19\x47\x75\xb4\xce\x80\xb0\x47\xad\x3b\x23\x36\xbd\x0b\xe4\x6b\xae\xff\xf5\x86\xb6\x79\x21\x6d\x09\xbf\x44\xe9\x3e\x6d\x38\xdd\xa8\x88\x8a\x6b\x1b\x8d\xd7\x34\x22\xd7\xe5\x38\xf7\xe4\x7c\x8a\xe2\x9c\xb1\x62\x0e\xa2\xc0\x51\x5a\x36\x25\xd9\x8d\xad\xb9\x4e\xa6\x75\xca\x18\x87\x05\x4b\x9b\x8c\x80\x35\xbd\x6e\x2a\xcf\x23\x1b\x86\xd5\xad\xdd\x71\xcf\xe5\xf5\x17\x2f\x34\xf1\x36\x68\x54\x94\x71\x64\x2b\x4e\x80\x48\xce\x6a\xd1\xc7\x44\xd7\xb4\xd6\xae\xbc\x9a\x96\x76\x0d\x8b\xbc\x5f\xec\x79\x9b\xed\x6f\x9d\xb1\xbe\xb8\x65\x37\x9a\x2c\x0f\x73\x77\x04\xe6\x6a\xe3\x24\x68\x8b\xa8\x6c\x62\x59\x32\x6a\xe6\x8b\x59\xf6\xb2\x09\xb3\x46\xb1\x69\xc3\xf8\x2e\xe7\xd2\x6f\x9e\xd9\x6f\x76\x81\xcd\xf2\x28\x71\x1c\x06\x57\xd5\x5e\xcf\x62\xe4\x4c\x0d\xb1\x28\x29\xb5\x2e\xa8\x97\x5f\x58\x87\xc1\x24\x99\xbf\xe7\xd7\x38\x01\xbd\xf7\xf1\x70\x67\x6d\xdf\xba\x78\xf0\x68\x6c\x64\x4a\xa8\xcf\xd3\x64\x5d\x0f\x88\xa2\xbc\x92\x75\x2c\x8b\xde\xcc\x17\xbd\xdc\x2d\x3a\xcc\x1a\xc2\x98\xbf\xb3\x21\x4a\x5e\x9c\x63\xf1\xaf\x9f\x63\x94\x49\xd9\x53\x9b\xe6\xe1\xe0\x14\xf4\x0e\xd5\xcb\xa9\xbc\x9b\x26\x2b\x20\x05\x93\x73\x66\xe7\x69\x3b\xc6\xfc\xdd\x77\x81\xf1\x20\x63\xbe\x32\x40\xec\x1f\xee\xb4\x89\x5b\x6d\xa5\x37\x02\x9e\x16\x6b\x64\xcf\x91\x1b\x81\xd8\xa5\xab\x4d\x7e\x0b\x78\x5f\xb8\x09\xd2\x84\xd1\x0a\x70\xcc\x0d\x71\x23\x9c\x5d\x6e\x3c\x8b\x5c\x53\x2b\x09\x81\x29\xfa\x2c\xbd\x73\x05\x9e\x6f\xf8\xa0\x63\xf6\xcc\x13\xfd\xb2\x21\xaf\x75\xf4\xf4\xc9\xab\x9c\xec\x31\xe6\x12\x50\x3d\x4d\xb5\xeb\x93\xe5\x5e\x29\x92\x71\x24\xac\x82\x22\xa6\xa6\x2a\x5d\x16\x5e\xe6\xcc\x5e\x75\x24\xe7\xc1\xd5\x0a\x10\x9c\x2c\xb4\x79\x66\xb1\xcf\x97\xd3\xa8\x8e\x9b\xb8\x7a\xad\xd9\xb7\x45\xf5\xe9\x9e\xfc\xd4\xd6\xbb\xf4\xeb\xb8\x3c\x71\x35\x73\x5f\x9a\xa4\x37\x0d\x9c\x83\x8c\xd4\x8a\xc1\xd8\xbf\x7b\x41\x4b\xb7\x06\xad\x57\xc6\xf6\x5d\x8a\x5c\x1b\x92\x1a\xb4\x93\xf5\x5c\x2f\x7e\x11\x94\xc4\x55\x70\x72\x4d\x09\x7d\xa4\x34\xea\x40\x38\xb3\x5c\xa3\x89\x6b\x8f\xba\x9e\x8c\x2d\xf5\x36\x07\xdd\x36\x07\xff\xf6\xc5\x1c\xdc\x1b\x81\x6f\x38\x89\x7d\x85\x85\x04\x52\x2f\xae\x73\xed\xda\xc4\x35\x0a\xaa\xe4\x16\x40\x50\xaf\xb3\x80\x8a\x97\xb3\x70\x74\x56\x01\x86\xa3\x85\xa6\x5c\x26\x01\x22\xe2\x75\xf1\xd6\x98\xd1\xab\xad\xec\x11\x10\xde\xba\x7c\xb3\xe2\xf7\x3c\x50\xfe\xc0\x95\x2a\xab\x82\x15\xdc\x9d\xd3\xd4\x18\xc9\x24\xd2\xea\x9c\xbb\x73\x0d\x43\x62\x93\x3d\xfe\xa9\x67\x2c\xb1\x09\xd9\xe9\x5e\x0d\xb7\x40\xf6\xdd\xb9\xe1\x90\x86\xd9\x4f\x3a\x4e\x74\xd3\xac\xb8\xc7\x90\x6c\xfc\xd0\x9b\x8e\xff\xe7\x87\x4f\xe9\xe1\x35\xcf\xc2\xb6\xd9\x13\x68\xd2\x3a\x0d\x03\x57\x69\xb0\xd4\xe9\x56\xcc\x17\x12\xe6\x95\x63\x61\x4e\x2b\x55\xd1\x9d\xf4\xb2\x8a\xe7\x7a\xce\xdd\xd4\x40\x10\xea\xb9\x75\x47\x03\x28\xec\xae\xe3\xe6\xbd\x45\x51\xe7\x6b\xde\xcc\x3f\xa9\x63\xb8\x23\x02\x1b\x24\x40\x85\x15\xa5\x54\xe6\x8a\x54\x8e\x39\x61\x6d\x6c\x84\xa6\x5a\xa6\x7f\x3c\x31\x9e\x98\x84\xef\xb9\xfd\xa9\x5a\xed\x94\xd6\xf3\x52\xfc\x3a\xb7\xe5\x05\xf8\x5a\x56\x55\x5f\x73\xa8\x9d\xdd\x95\x21\x9e\x3b\x7b\xb5\xd6\x46\x3c\x88\x22\xcf\x2f\xbb\xbf\xf8\x98\x8f\xcf\xf1\x84\xf0\xfe\xaf\xe1\xfd\xe1\xc7\x28\x5e\xf6\x54\x18\x7d\xf8\xf4\xe6\xed\x9b\xb7\xdb\xb1\xda\x47\x6a\x39\x49\x50\xcd\xe9\xe9\xd4\xb9\x89\x4d\xc3\x44\xab\x81\x75\x43\x71\x0b\x70\x6e\x72\xbc\xbf\xcc\xd4\x95\x92\x68\x6c\x0d\xa4\x53\x63\x0c\x24\xa0\x43\x36\x5f\xdc\x11\x34\xf4\xdc\xb4\x65\x67\x36\xfd\xc5\x9b\xf1\xbc\x9a\x9b\x0a\xcc\x73\x01\xc8\x03\x3c\x2c\x66\x4e\x94\x5e\x49\xa4\xe7\x6c\xb1\xd0\xe1\x08\xc6\x59\x1b\xd7\xd6\x99\x99\x87\xc9\x72\x4d\xac\xda\x95\xbe\x26\x40\xfa\xbb\xe1\xd3\x72\x6d\xbf\x88\x66\xbf\x36\x33\xb7\x89\xf9\x14\x0b\x6b\x87\x92\xda\x6a\xb9\x23\x8b\x69\x60\xae\xad\x5b\x27\xc0\xd4\xcb\x2d\x35\xec\xd0\x9c\x48\xc7\xf3\x1c\xd5\xe5\xa9\x2c\x11\x85\x21\x54\x2e\x09\xad\x5d\xd6\xb8\x9d\xd7\x3c\x40\xe4\x39\xf8\xfc\x9c\x7f\xe3\x66\x59\x56\xe9\x72\xcf\x3f\x7c\x7a\x80\xc7\x87\xbf\x5b\x46\x71\x10\xb5\x9b\x96\x2f\x68\x6a\x47\x3d\xec\xa3\x81\x64\x9f\x5c\x99\xf1\x78\xd2\xa8\x5e\xb6\xe0\xac\x16\x03\x18\x2e\x41\xe8\xf1\x90\x75\x9c\x79\x7e\x74\x8f\x88\xf4\xb9\xe2\x15\x9a\x04\xbf\x7b\x7b\x08\xa3\xa8\x8d\x2e\xce\x14\x55\xdd\x1c\x19\xa8\xd6\x95\x61\x5b\xd7\x4a\xb5\x71\x66\xb5\xfe\xe9\x14\x9d\xdd\x79\x90\x50\x87\x85\xa3\xa3\xeb\x24\x54\x50\x6c\x5c\xc9\x34\xce\x82\xd4\x5b\xe5\x3f\xcf\xe6\xbf\x22\x31\xd9\xa2\x49\x07\xca\x19\xa6\x85\x42\xe5\x8c\xeb\xd0\x18\xc2\x98\x27\xb4\x13\xda\x0a\xa1\x34\x23\x38\xce\x7e\x4a\x56\x48\xe7\x1e\xfd\xb1\x8f\x8f\xee\x58\xdd\x82\xf3\x70\x46\x8d\xe9\x1b\x7a\x9c\x8e\x3d\x32\xb6\x5d\xd7\x68\xe7\xef\x83\x2d\xcf\xfe\xf4\xfc\xaa\x5f\x66\xb4\x97\x17\xb5\x27\x8e\x47\x27\xc7\xfd\x92\x15\x29\x37\xf4\x98\x5f\x68\x55\xa4\x73\x5a\x9f\xf6\xda\x18\x77\xb1\xee\x3c\x9b\x5b\x90\xd7\xb9\x86\x2e\x14\x2e\xf7\xf1\x8c\xe4\x56\xfd\xc6\x7e\x0e\x5f\xed\xe7\x5d\x05\x65\x62\x13\xe0\xae\xc5\x80\xf9\x24\x90\x3b\xf1\xc5\x54\x3d\xc1\x11\xe5\x3a\x47\x3b\xed\x25\xb1\xcf\x76\xe6\x4e\x6a\x28\xe1\xec\xd0\x72\x76\xcb\xb0\xbf\x1e\xa5\x29\xbc\x5d\xb2\xce\x67\xfd\xcf\x39\x3f\x6a\xe0\x49\x9d\x40\xe7\x04\x05\x29\xdc\x49\xa3\xe5\x20\x56\xb9\xab\xe1\xc4\x2a\x59\xb1\x5d\x73\x5c\x56\xd6\xd1\xce\xd4\x09\x03\x24\x2c\xe7\xc9\x69\x05\x3c\x3c\x5f\x3b\xa1\xb1\x12\x41\x10\xfa\xba\xf1\xc6\x73\xc2\x64\xbf\xca\x0a\xb3\xb6\x16\x8a\x30\xaf\x43\x3a\x0f\x1d\xd4\xca\x99\xae\x9e\xcf\x34\xa4\x78\xbe\x84\xda\xcb\x8a\xee\x7a\xaf\xeb\x35\x17\xce\xd6\x20\x43\x36\xb7\x4e\x1a\xe8\x43\x73\x3d\x2b\x8b\xb5\xcf\x87\xef\x03\xee\x35\xd6\x74\xf0\x67\x9e\x7b\xfe\x7b\x5f\xa9\xe5\x53\xe1\x4f\x8f\xde\xfa\x79\x7d\x6a\x7d\x59\x8e\x99\x17\x41\xae\xd0\x54\x19\xa8\x2b\x02\x9d\x15\x53\x94\xb9\x0e\x0b\xaf\x35\x56\xb9\xc1\x2c\x2e\x64\xa5\xa5\x12\x3a\xb4\x92\x18\x2c\x63\xcd\x95\xb5\x8c\xba\x74\xee\x5c\x22\x59\xd6\xe4\x6c\xb9\x1e\xb2\x79\x24\x93\xe1\xcd\x50\x77\xb4\x6b\x7c\x9f\xd0\x2e\x88\x91\xbf\x2b\xff\x62\x3d\xab\xde\x3e\xae\x8d\x3f\xeb\x47\x6d\xb9\x98\x15\x8b\x38\x86\xa7\xb9\x30\x9e\x0a\x49\xd9\x79\xac\x81\x98\x69\x42\xe7\x7e\xe2\x5c\x50\x19\xa3\x79\x52\x90\xcc\xe3\x9c\x86\x6c\xb6\xe1\x74\x76\x99\x53\x85\x2e\xa0\x2c\x99\x11\xda\xdf\xb3\xf4\x56\x44\xf4\x9b\xd6\x5c\x7c\x78\xfc\x57\xe0\xef\xff\x2d\xf4\xea\x4b\x27\x4c\x38\xb8\x36\x2b\x40\x66\x93\x1b\x25\x74\xe5\x94\x17\x92\x50\xcc\xb0\xec\xe8\x29\xce\x6c\xad\x9d\x9c\xad\xeb\x79\x18\x84\xa5\xe0\x25\x52\xa8\xb4\x12\x38\x1c\x17\x7f\xa4\xbd\x95\xde\x77\x7d\x31\xae\x7b\xed\xf0\x8b\x78\x65\xb0\xff\xf8\x7d\xb0\x9d\xc1\xc7\xa8\xbc\x1e\xad\xf7\x43\x4e\xf5\xbc\xbc\xc7\xc6\x75\x4e\x21\x60\x10\x40\x3a\x0c\xaa\xb9\x2c\xa3\xd3\xd3\x3c\xce\x45\x48\xe6\x3a\xbc\xdc\x02\x87\x9c\x28\x6c\x01\x15\x51\x8d\x6a\x3d\xaf\xfb\x1e\x9a\x80\xc7\x78\x8f\xb7\xb6\xff\xf2\x5e\xf1\xf3\xb2\xed\xfd\xa7\xef\x0e\xe9\xfe\xe3\xf7\x9f\x9f\xd6\xd6\x43\xe5\x2b\x41\x3d\x62\xac\x33\x73\x6d\x80\xd7\xc9\xdc\x33\x28\x4f\x90\x1c\x7b\xd1\x5c\xf6\xd8\x71\xad\x5d\xed\x7c\x05\x09\x8c\x5d\x97\xb8\x0b\x97\xa5\x15\x0d\xa2\x82\xb2\x60\x1f\xd4\x37\xb4\x6b\xe2\x7b\xbb\xbe\xe6\xee\x57\xc6\xfc\x6f\x3c\x82\xea\x69\xd3\x84\x80\x22\x9c\xe6\xc4\x7a\x28\xaf\xad\xe7\xa3\x01\x56\x93\xf3\xc0\x2e\x43\x02\x49\x53\x2b\xdd\xc5\x78\x9e\xcc\xe8\x82\xfb\x1b\xbd\x05\x4e\x9c\x8f\x48\x91\x69\x48\xdc\x24\x8c\xb6\x36\x88\x83\x01\xd0\x01\xed\xb1\xd7\xfc\x7d\xdc\x2a\xd0\x9f\x6f\xe3\xa7\x57\xd8\xe2\x3b\xbe\x18\x9e\x1e\xdf\x7d\x5c\xbc\xc2\xa7\xc7\x77\x3f\xbc\x7b\x7c\xda\x4d\x14\x63\x42\xaf\x79\x78\xa9\xbd\x5a\x90\xa8\x5d\xb9\x7c\x85\x62\xce\xf6\xd4\x7f\x86\x63\x28\x5c\xb9\xdc\x5b\x7b\x5c\x54\x0c\x15\x92\x10\x49\x67\xcb\x29\xe5\x21\xa7\xee\x4c\x29\xa5\xc3\xf2\x8d\xde\x31\x28\xf4\x60\x21\x7d\xe6\xfb\x0a\xee\x45\xd5\x6f\x37\x96\x2f\xcf\xf4\x75\x1c\xa6\xe3\x60\xbd\xd4\x75\xe3\x99\x35\x5a\xff\x39\x75\x27\xe3\x45\xc2\xea\x7a\xd5\xf2\xde\x05\x75\xc4\x0f\x78\x5f\xfa\x9c\xaf\x8f\x9a\x6d\x63\x5c\x23\x64\x9e\x89\xef\x1f\xef\x68\xab\xbf\xfd\xf8\xb7\x3f\x3e\x7d\xf4\x5b\x38\x1a\x71\xa1\x0b\x1c\x76\xb5\x66\xda\x5e\x95\x29\xea\x11\x95\xa9\xcd\x09\x73\xc3\x39\xad\xca\x46\x88\x9a\xd5\xfb\x92\xf2\x52\x90\x94\x1b\x51\x73\xda\xe5\x69\x9a\x28\xd4\x64\x79\x82\x71\x8b\x1b\x2e\xb9\x5f\x5f\xd5\x8d\xc4\x8d\xaf\xab\xbc\x57\xf8\xbe\xbc\x79\xfe\x00\x77\x1c\xd9\x7d\x88\xcf\x84\x66\x0d\x63\x25\xca\x69\x59\xba\xd2\xba\xc2\xae\xee\xa3\x80\xa3\x9f\xd1\xe7\xcf\x51\x71\xbd\x78\x5b\x0f\x97\x6e\x5c\xce\xec\xe8\xe4\xce\xd6\x5a\x87\xfc\x24\x40\x50\xef\xec\x81\x79\x4d\xa0\x9f\x69\xea\xed\x92\x32\x8f\x12\xfb\x13\x37\x51\x92\xe5\xb1\x46\xd8\xd9\xd3\x09\x78\x59\x6c\x79\xcc\xf6\x50\xc4\xda\xaf\xcb\xd7\xec\x68\x5f\x3e\xac\x16\x76\xbc\x7e\x3f\x7c\xfc\x3e\xc4\x36\x2b\x76\x9a\x59\xa6\x33\xcd\xab\x22\x19\xa5\xe3\x02\x98\x70\xa3\x70\xa9\x80\x46\xba\x51\xb7\x12\x70\xac\xf3\xb2\x74\xa4\x49\x75\x4a\x47\x37\xf6\xbc\xe9\xa7\x5e\xd8\x56\x12\xb1\x58\x85\xfa\x86\xe2\x63\x24\x37\x4c\xe7\xf7\x41\x11\x04\x3f\xf8\xf0\xdb\x5f\xbe\x26\x85\x5d\x8d\x8c\xc7\x4f\xbe\x28\xfa\xaf\x60\xfd\x50\xbb\xb2\x30\xa6\xdf\x6b\xc6\x10\xcf\x39\xae\x5c\x5a\xbb\x0a\x06\x8f\xec\xfc\xf6\xe9\x78\x6a\xe9\x04\x05\x74\xd7\x46\x88\xa4\x4e\x84\x72\x4d\x24\x8d\x71\x23\xcf\x75\x10\x06\x26\xaa\x0f\x26\x4e\x83\x3f\x0f\xde\x6c\xea\x9a\xab\x88\xe7\x97\xc7\x95\x69\xaf\x89\xdb\x39\xab\xdd\xe4\x12\x04\xe3\x79\xc6\xbb\x16\xaa\xc5\x73\x0c\xdc\x31\x4e\x17\x6f\xca\x4c\xd2\x88\x9e\x08\x2b\xac\x08\xc2\xc0\x46\xd9\xc1\xc4\xf9\xab\xdf\x17\xf8\xaa\x82\xfd\xee\xfd\xe1\xc7\x1f\x9a\xb8\xbb\x4e\xb5\x1b\x1d\xe5\x61\x32\xcd\xe9\x4e\x81\x98\xe8\xe8\x6c\x9c\xdb\xd9\x40\x7f\x0b\x1a\x79\x82\xa4\x56\x9d\x6a\x95\xaf\x75\x94\x07\x1b\x4e\xcb\xee\x78\xfb\x02\x94\xb5\xe9\xb9\x3e\x0e\xb1\x9c\xb3\x90\xcd\x75\x84\xa6\xe3\xe2\x93\x90\x39\x0f\x27\x7b\xb6\x27\x6b\xc1\x3a\x1e\x92\x60\xe7\x35\x65\x75\x2c\x83\x7d\xf0\x1f\x82\x2f\xc1\x1f\xd6\xc8\xde\xc7\xef\x61\xb3\x7e\x5e\xde\x6c\xde\x16\xf2\xd1\x6d\xaf\x61\xf4\xf9\xcb\xfb\x60\xff\xfd\x0f\xab\x3c\x4d\xb8\xf2\x17\x7f\x8e\x35\x75\xd2\x15\x18\x1a\x38\x29\x62\xb2\xdc\x58\x66\x39\xc9\xb9\x60\xa7\x73\x39\x9e\xda\x3e\x83\xa0\xd5\xf2\xd8\x1b\xce\xed\x72\x4e\x03\x86\x24\x2f\xb5\x44\x75\x25\x67\x62\xb0\xd2\x2a\x96\x52\x11\x53\xcd\xaa\x3d\x55\xb8\x4a\x33\x97\x78\xbd\x00\x0c\xc7\x2c\xd5\xa2\xce\x53\x5d\x4f\xc5\xd1\x24\x19\xe5\xc8\xf5\x7d\x56\x60\xe4\xf8\x71\xaa\x20\x38\xe6\xd5\x2d\x68\x69\xbb\x62\x53\x44\x54\x1d\x64\x2c\x7d\xb6\x6b\xb9\x47\x36\xff\xfd\xb9\xc2\xfa\xc3\x4b\x28\xdf\x4e\x5c\xea\xb9\x8b\xd2\xac\xa8\xab\x3c\x9c\xe6\xb6\x9e\x89\xa9\x3b\x7d\xdc\x9d\xda\x56\xd6\xc3\xbe\x70\x18\x3a\x8b\x51\x49\xb8\x75\x18\x24\x1e\xa5\x30\x8d\x6a\x54\xd3\x04\x10\x0d\x1e\xc3\x20\xfe\x14\x27\xfe\xd3\xe7\x2f\x8f\xbb\x2c\x4a\x94\x47\xdc\x70\x86\x71\x56\x61\xb2\x58\xda\x5a\xcc\x43\x24\xac\xe0\xa5\x71\x06\xe1\x54\xa7\x19\x50\x23\xc9\xc6\xed\x25\x6f\x28\xea\xa3\xf6\x7e\xcb\x7b\xc0\xf8\xb7\xd2\xd6\xc5\x3e\x5d\xeb\x72\xde\x7f\xfe\x22\xa1\x24\x36\x2f\x40\x16\x83\xe4\x94\x1b\x7d\x0b\xd8\x28\xa5\x26\xd5\x08\xb6\xaa\x3a\x93\x87\xc7\x73\x2a\x98\xeb\x46\x4a\x35\xe3\x8a\x1b\xc2\x08\x31\x46\x31\xd1\x34\xde\x07\xd7\x7f\xda\x07\x6f\x76\xc1\x35\x58\x9e\xb8\x9a\x09\xd4\xda\x71\xbd\x72\x92\xe3\x83\x0a\xab\xe5\x6c\xf9\x61\x39\x13\x82\xb7\xef\xe3\xc3\x9b\xfd\xe1\xfb\x9d\xb4\xae\x20\x50\x41\x9e\x37\x69\x76\x86\x91\xb8\xe2\xe4\x4e\xdc\x56\x90\x41\x92\x32\xe2\x26\x55\x4b\x3f\x4e\x7c\xc3\x91\x8d\x93\xd5\xd6\x7f\xfb\xc2\xd6\x7f\x73\xb7\xf5\x45\x94\xba\x53\x9a\x59\x21\xc4\xc9\xba\x2e\xc4\x42\x48\x2a\xe3\xc4\x60\xfc\x13\x8b\xce\x6e\x1c\x24\xf0\x10\x3b\x36\xb9\x7e\xb5\xf4\x97\xdf\x5b\xdf\x6c\x34\xc4\xe5\xc6\x33\xbc\xf9\x55\x1f\xb6\x12\xf3\xef\xb6\x62\xa7\x87\x34\x7a\xfb\xe1\xe1\xf3\x03\x94\x21\x9d\xb3\xa8\xe8\xb3\x22\xe5\x15\xa7\x88\x35\x85\x94\x50\xb8\x49\xc7\x56\x5f\x05\x29\xba\xfc\x2c\x30\x8f\x7a\x97\xbb\xca\x5d\x76\xfd\xd7\xe3\x04\x34\x08\x76\xd1\x10\xe2\x03\x79\xe6\x43\xf8\xe8\x23\x47\x77\x32\xe1\x0f\xef\xbe\x3d\x9e\x4c\x78\xff\xf4\xe1\xdd\xfb\xa7\x0f\x7f\x15\x7e\x7a\xda\x9d\x14\x1a\xf2\x52\xe2\x6a\x98\x86\x61\x18\xa6\x39\x47\xbc\x03\x72\x3e\x9f\xcf\xb1\x2a\x1a\x84\x08\x13\x52\x49\x25\xa5\x0e\x11\x21\xa7\x46\xa9\x49\x29\xb9\xe6\x41\x77\x01\x0d\x71\x74\xfe\xcf\x68\x17\xf8\x73\xbb\x63\xdf\xf7\xfd\xb8\xb4\xdb\x03\xfe\x79\xbb\x52\xad\xed\x5e\x3a\xa5\xc6\xe5\x4f\x72\xdd\x5f\xcb\xfb\xc2\xf1\x7a\x97\xfd\xf8\x5a\x5f\x71\x5d\xf3\x77\x0d\x3f\x7f\x6d\xdf\xb5\x77\xc3\x0b\x63\x18\x57\x3c\x17\x45\x71\x0b\x94\x51\x8c\x19\x1f\x2e\x29\x32\x95\x15\x71\x36\x27\x7a\xe6\x94\xa5\x75\x5a\x85\x92\xb9\xdc\x8d\x15\x24\x70\x2e\xb5\x57\x9f\x14\x46\x35\x45\xa3\x9e\x35\xad\x6c\x5c\x6c\x56\xf9\xaf\xb4\x1f\x46\x9b\x88\xd9\xb7\xd6\x0f\x81\xb5\x84\x50\x5d\xd4\x55\xe9\x48\x5a\x1b\x9b\x36\x8d\xe7\xf6\xa8\x85\x94\x4c\xc5\xc5\x75\x34\xb3\x61\x2c\x6b\xb2\x2a\x24\xae\x74\x86\x82\x02\xbe\x78\xdf\x63\x28\xb9\xe9\x69\xdb\x04\x51\xa8\x6f\xd5\xfe\x14\x17\xff\xc2\xb1\xef\x15\xa5\x04\x63\x51\xe8\xb2\x70\xbd\xb6\x4a\x29\x2f\xc3\xa2\x18\x52\x15\x8d\x8b\xeb\xe4\xc7\x9e\xd5\x99\x1f\x7b\xe6\x2e\xcb\xd8\xc7\x52\x47\xc9\x75\x0a\x05\xe9\x4e\xe8\xd4\x7b\x5d\xb5\xd6\xf3\x1f\x91\x67\xdc\xdd\x7b\x1f\xf2\xf3\x67\xf0\xdb\xf7\x21\x7c\xfc\x7c\x08\xb4\xbc\x05\xec\x22\xb5\x3a\xb3\xa3\x32\xd6\x4d\x7c\x8a\x09\xbe\x05\x83\x1a\x5c\x8b\x5d\x7f\x54\x27\x77\x22\x4e\xdf\x02\x3d\xdd\xf3\x8a\x3b\x19\xe7\x7e\x1d\xfd\x70\xd7\x3d\xfd\xd5\x61\x7d\xf8\xe1\xe1\xf1\x61\xcd\x2e\xb2\x36\x3c\x5a\x4b\x30\x62\x85\x28\x4a\xc7\x4d\x6d\xda\xf0\xe2\xf8\x09\xe7\x26\x43\x51\x12\x65\xd7\x8b\x9d\x0d\x65\x79\x9d\x57\x21\xa9\x5c\xe1\x2e\x08\x02\xb8\xac\xf4\x62\x69\x33\x94\xc7\x66\xd5\x72\x36\x3e\x26\xf4\xcf\x79\x9f\xf0\xdc\x7c\x7c\xb1\x96\x31\x66\x73\xcb\xd0\x7c\xca\x4f\xf6\x98\x37\x6d\xd8\xcf\xe7\x49\x21\x8b\x44\x5c\x5c\xcf\x76\x6e\x05\x4f\x6d\xca\xc3\xc2\x15\xae\xa1\x20\x81\xd9\x28\xbf\x9e\x43\x3d\xcb\x30\xad\x8f\xe5\xb1\xbe\xaf\xe7\xdd\x25\xce\xbd\x25\xfc\xf1\xb7\xde\xe9\xe7\x5f\xbc\xd4\x1d\x6a\x1a\x42\x88\xce\x4d\x55\xba\xa0\xab\xb1\xd0\xba\x5e\xfc\x91\x41\x4a\xc5\x54\x9c\xcf\x81\x9d\xe5\x36\x01\x9c\x2c\x2b\x1a\x31\xd0\x10\x64\xab\x8a\x2a\xe7\xba\xa3\x8d\xf7\x41\x12\xdf\x07\x1d\x93\xe0\x5f\x6f\x38\xe7\xff\x14\xfc\x8f\xc1\xff\x12\xfc\x6f\xfe\x24\xfe\xb0\xf2\xa0\x3c\x3d\xfe\xf0\xe2\xf3\x4b\xe6\xfb\xb7\xef\x0f\xef\x1e\x7f\x13\xa6\xfd\xf9\x4e\xcc\xb7\xd8\x95\x61\x03\x9d\x16\xaa\x6a\x94\x3b\xba\x04\x7a\x2d\x74\xd5\x68\x37\x84\x1a\x97\xbc\xc0\x4e\xe0\x82\x17\x98\x9b\x12\xf2\xd2\x14\x19\xe4\xae\xf7\x06\xf6\x62\x5e\x97\x73\x69\x4a\xc4\x1a\x18\x56\x3b\x73\x79\x62\x32\x0b\x4b\xb0\x24\x64\xd4\xcf\x9f\x72\x42\x11\x23\x95\xff\xee\x48\xae\x52\x59\x60\x2a\xa5\x50\x42\x29\x19\x8e\xa8\x12\x75\x2b\xe5\xa8\xd4\xa8\x82\x60\xff\xcc\xf3\x9a\x7b\x36\x94\x7f\x58\x39\x04\xa2\x4f\xcb\x4d\xf0\xe6\xfd\xb2\xac\xa3\x37\xf7\x32\xe2\x68\x43\x1d\x6c\x7e\xbe\x77\x97\x3e\xf9\x0b\x7d\xff\xf1\xfb\xa8\x0e\xd3\xc4\x24\xc0\x5c\x93\x66\x0c\x6b\x69\x50\x95\xa4\x89\xca\xb4\xe4\xaa\x21\x47\x85\xd2\xf9\x12\x61\x5c\x8a\x12\xcf\x64\x71\x89\x75\xd3\x00\xcd\x2e\xee\x94\x01\xda\xe3\x55\xff\x68\x52\x27\xc8\x90\xa3\x6e\x72\x5d\x5d\x67\xae\x04\xda\x2b\xdd\x1e\xa1\x86\x0e\x3a\x42\x31\x25\xf3\x69\xbe\x28\xc8\x5c\xa1\x14\xb5\xc4\xaf\x21\x74\xc3\x11\x8f\xe5\xe6\x4b\x05\x6f\x3f\x6d\xe5\x5d\xf1\xe1\x17\x66\xab\x27\xc8\xfd\x00\xdb\xed\xca\x27\xa4\xd3\x1c\x84\xe3\x65\x0a\x03\xa5\x25\xce\x71\x81\xdc\x60\x8b\x9c\x5b\x76\x84\xdc\x8b\xeb\x57\x6e\xd8\xab\x29\x17\xdc\xd6\xf9\xd7\x89\xfb\x65\x5d\x3b\x1a\xe9\xaa\xe2\x13\x14\xf3\xa5\x9f\xc7\x7e\xb9\x13\xd0\x0d\xef\xfa\x58\xfa\x2a\xaf\xff\x29\xf8\x5f\x5f\x67\x39\xbf\x3c\xbe\xfb\xf2\xfe\xb0\x26\x39\x9f\xee\x45\x3a\x2b\x7b\xd5\x87\x3b\xb9\x55\xf4\xf8\xee\x71\xf1\x11\x0e\x5e\xed\x6a\x8d\x81\x7d\xf9\xfc\xc5\x7b\xa5\x61\xea\xfd\x6d\x98\x4a\x2c\xb0\x6b\x2e\xe9\x54\x32\x4a\x93\x44\x27\x64\xec\x99\x49\xeb\xa3\xd2\x12\xa8\x89\xd0\xb5\xcf\xc3\x09\x13\x96\xb9\xc6\xd1\xf2\xe2\x89\x1c\x6c\x99\xcf\xa3\xf7\x5b\x62\x89\x24\x53\x9c\x12\xce\x32\x99\x65\x59\x96\x26\x49\x59\x88\x0a\xe1\x22\x55\xa9\x9c\x3b\x57\x3a\x45\x40\x42\x17\xda\xb9\x96\xc4\x35\x4d\x2a\x51\xa9\x33\x8c\x30\xe5\x19\xf1\x8e\xd5\x9f\x05\xf2\x86\x77\xf7\x98\xc1\xe2\x2d\xfe\xcd\x37\x56\x5f\xf8\x59\x01\x55\x74\x87\xbe\x6d\x29\xba\x9f\xe3\xa2\xc3\xe3\xd2\x2f\xd3\x75\x73\xb9\x7d\xa0\x51\xb3\x66\x63\xec\x2a\xb2\x63\xa7\x09\xcc\x65\xd6\xfe\x47\x8c\x9c\x94\x56\x2e\xdf\x9c\x9e\x89\xf6\xdc\x86\x46\x83\x35\xc6\x38\x66\x8c\x09\x5e\xbe\x8b\x7f\x08\xfe\x10\xfc\x0f\x2b\xeb\xd6\xeb\x8c\xf3\x97\x7b\xc6\xf9\xe9\x57\x5f\xc5\xdb\x4f\x0f\x5e\x0d\x72\xd3\x1d\x7b\x69\xb5\x7e\x7b\x13\x48\x96\x99\xab\xa7\xd4\x4d\x25\x37\xa5\x4e\xd8\xb9\xe3\x3a\xdb\xde\x04\xd6\x44\x4b\x91\x39\xe5\xca\xd2\x18\x38\xeb\xaa\x52\x78\xee\x50\x21\x8b\x2a\x96\x4c\x2b\xc5\x19\xad\x2a\x9d\xcb\xa2\xc8\xd3\x1c\x17\x12\x23\x84\x53\x99\xd9\xf9\xec\x90\xb3\x04\x18\x34\xa1\x98\xe9\x7c\x4e\xc3\xc4\x65\x79\x26\x05\xd5\x59\x1e\x26\x79\xab\x0a\x4b\xef\xf9\xc1\x24\x50\x37\xba\xd3\x1e\xff\xf9\x8d\x81\x6b\xd5\xf2\x78\xe5\x71\x46\x8f\x2b\xc7\xf2\xc3\xe3\xd3\x87\x9f\xbf\x83\x57\xe3\x33\x65\x06\xad\x9d\x4b\x0b\x6d\x96\x37\x21\x9b\x40\x5c\x2d\x88\x73\x72\x3a\x01\x3b\xcf\xbd\xff\xe1\x0a\x6e\x06\x7a\x82\xbe\x6d\x69\xdb\xc6\x92\x10\xd7\x0c\x47\x60\x08\x39\xa9\xe5\x9c\x87\x67\xe9\x48\xdb\xb6\xae\x6c\x9a\xc6\x35\xa2\x21\x9a\x09\x64\x75\x8d\x83\x20\x38\xf8\xf8\x1e\x8d\xab\x67\xcc\xda\x33\x9e\xfe\x5b\xde\xc0\x4b\x65\xbf\x40\xd3\xbc\xfd\xc6\x3d\xee\x77\xaf\x89\x6a\x37\x42\x75\x4d\xa1\xb8\x05\xa0\xb4\xbe\x05\x28\x53\x19\x8e\x90\x22\x74\x31\xb0\x5d\x66\xcc\x1a\xd4\x76\x59\x5c\xd9\xf9\x64\x4c\x58\xcc\xa7\xb0\xe0\xc6\x16\x8d\xce\x71\xc3\xa9\x9c\x8f\xd7\xa3\x10\x51\xe9\xce\xd6\x79\x6e\xa4\x83\xbf\x93\xad\x8f\x0d\x7d\xe7\xe7\xf2\xae\x49\xfe\xf8\xce\xd7\x2d\x7e\xfe\xf2\xf1\xcb\x73\xa0\x1a\x36\x6d\xd9\x2f\x77\xaa\x11\xd8\x72\xf7\x2f\x7b\xaa\xa3\xf1\x9a\xd6\x1a\x51\x42\x0b\x5e\x95\x32\x4d\xea\xa6\x10\xa1\xd0\x84\x10\x9a\x66\x1c\x15\x32\xad\xdb\x42\xce\x7c\x57\x7d\x1d\xa2\x93\x9d\x1b\x6b\xef\xaa\xd6\x31\x36\x79\x71\x94\x49\xae\x4a\xdb\x55\x65\x51\x64\x4a\x41\x52\x9c\x79\x92\xe3\x6a\xf9\x2b\xba\xfc\x8d\xeb\x0c\xbf\x4e\x08\x45\x89\x3b\x1b\x47\x4d\x10\xc4\x01\xbd\xe1\xdd\xaa\xab\x75\x57\x85\xff\xfd\x5a\x31\x7d\x27\xe8\x59\x15\x1c\x9f\x36\x8e\x98\xc7\x87\xe5\xfc\xd9\xbf\x7b\x7c\x7a\x39\xd3\xa1\xaa\x31\x04\x47\x7e\xba\x9c\x6e\x01\x01\x85\x92\x56\x33\x02\x2c\xcb\x75\x95\x43\x61\x66\x5f\xed\x18\xa6\x9d\x71\xd2\xfa\xfa\x86\x58\x55\x54\x5a\xd5\xa8\xb3\x31\xe7\x2b\x75\xc6\x8d\xa4\x85\x64\x08\x03\x54\x62\xca\xe6\x16\x8e\x42\x08\xe1\xec\x7c\x66\x2c\xcc\xdd\xd0\x79\x6e\xfd\xc5\x0e\xe0\x41\x1a\xfc\xb7\x4b\x1f\x57\x3e\xb2\x8d\x95\x2c\x8c\x7e\xf0\x30\xe0\x0d\xc0\xf0\xdd\xea\x86\xad\xdc\x00\xf7\xec\xf5\x33\x73\x49\x38\x52\x5e\x4a\x22\x09\x41\x92\x08\xa5\xba\xd1\x95\xd0\xc8\x12\x2e\x27\x50\x4e\x26\x63\x2f\x9a\x41\xbb\x0b\x05\x8a\x5c\x0d\xfc\x88\xc9\xf2\x8f\x99\x42\xa8\xc8\xdd\x39\x2e\x25\xc7\x8c\x53\x59\x71\xc6\xc9\x45\x81\x5d\x76\x72\xe6\x1a\x62\xdc\x68\xb3\xb4\x1e\xd4\x60\xdc\x54\x9b\x01\x12\x0b\x29\x23\x52\x1a\xce\x29\x22\x62\x31\xd0\xe3\x80\xdd\x9a\xdd\xaa\xa9\xb7\xee\xc4\xbf\x0f\xfe\xc3\x6b\x9e\xf3\x87\x4f\xcf\x0c\x6d\xcb\xfa\x7e\x59\x45\xb5\xaa\x6f\xf8\xb5\xae\xb5\x85\xc6\x2a\xd5\x5c\x4f\xa1\xbc\x5e\x78\xab\x21\x87\xc6\xb3\x9d\xaf\xcf\x99\x55\xba\x64\x67\x83\xb8\x16\xfb\xb3\xb5\xd6\x9a\x99\x18\x57\x98\x90\x9b\xb0\xf5\x27\xe1\xf2\xd5\x29\x4b\x8c\xc6\x55\x2b\xc9\xda\x3f\x75\x43\x51\x1d\x97\xff\x7c\xbc\x68\x1f\x36\x33\xad\x5f\xe2\x45\x33\xc3\x85\x92\x70\x91\x78\x31\xf6\xca\x9f\x2e\x91\xbd\xcc\xfe\xcb\x11\x72\x96\x42\xb7\x75\x4b\xd7\xf8\xee\x2e\xa8\x6f\x78\x27\x62\xf4\x5c\x75\xfb\xcb\xbc\xcf\xdb\xf5\xd2\xf3\xb6\xc4\x4e\x50\x46\x65\x51\x93\x62\xa6\xe6\x1c\x26\xf3\x54\x2c\xa6\x82\xb1\x36\x46\x7f\x3c\x31\x9e\xd6\x29\xd9\xf3\x3f\xd6\xf1\xe4\x6a\x33\x78\x62\xca\x20\x0c\xc8\xad\xde\xe5\xb1\x0c\xfe\xfc\x95\x4a\x44\x78\xf8\xf8\xa2\x0c\xe8\x99\x8c\xe0\x5b\x20\x2d\xe4\x2a\x2b\x8e\x0d\x6f\xba\x7e\xa4\xc0\x40\xbb\x26\xe3\xc7\x2a\xa9\x33\x54\xb9\xf3\x09\x87\x86\x0b\x4c\x32\x4a\xf2\x2c\x96\xb8\xaa\xb8\x56\x86\xb9\xa9\x95\x90\xbb\x6a\xce\xcb\x14\xd7\xd5\xa5\x2c\x91\x8c\xb4\xa3\xc7\xcc\x64\x55\x10\x06\xfa\x76\x89\xfa\x2d\x27\xf7\xac\xe0\x74\x3f\x83\x97\x9b\x10\xac\xcf\x86\x03\xa9\x1d\xaa\x21\x15\x5e\x17\x57\xba\xa3\x71\xc3\x95\x0b\x11\xd9\x79\xab\x17\x0b\xa3\x3b\x9f\xd0\xdf\xae\xe8\xeb\xf4\xfd\x0f\xef\xf7\x6f\xde\xfa\x9a\xa6\x7b\xb9\xca\x33\xf4\x71\xff\xf1\x87\x1f\xb7\xa0\xca\xd0\xa4\x30\xa5\x2e\xc8\x90\xe2\xda\x34\x02\xe7\xa9\x2d\xea\xaa\x26\xfd\x48\x20\x6b\x58\xee\x8e\x19\x54\x29\x70\x23\x85\xd0\xb1\x74\x97\x33\x32\xd8\x4d\xb7\xa0\x9f\xb0\x6b\x4f\xee\x0c\x49\xe1\x68\xd7\xf6\x52\xdb\x0e\x10\x90\xd2\x94\xe3\x85\x49\xa5\xd7\x7a\x83\xdc\xfb\x41\x6a\xeb\xd7\xfb\xfd\x9b\xf7\x2f\xfa\x14\x7f\x33\x14\x0f\x1f\xbf\xfc\xf8\xf0\x29\x7d\xff\x2c\x37\xed\x8e\x49\x86\x4a\xcd\x44\x99\x67\x89\xc9\x28\xa2\x44\x28\xd2\x30\x9c\x8a\x54\xa6\x4d\x62\x49\x29\x4a\xb2\x3b\x99\xca\x4d\xc7\x7a\x40\xce\x9c\x6f\x01\xa4\xa5\x1b\x2d\x94\x56\x18\xd3\x81\x81\x3c\x33\xd9\x05\xd2\x5b\x70\x82\x46\x68\xac\xd4\xc6\x41\x46\x76\xf5\xae\x0c\xde\xdd\xf9\xa5\x9e\xf1\x12\x1b\x59\x49\x73\xb1\xe7\x7a\x9a\xea\x73\xe6\x3a\x06\x49\x76\x0e\x87\xfb\x82\xb6\xfe\x0c\x9b\x4e\xaa\x85\x76\x8d\xfd\x60\x5f\x2b\xe4\xc7\xf7\xf6\xf1\xc7\x8f\x2f\xcd\xe1\xbf\x86\x9f\x0f\x73\xb3\x87\xe5\xae\xc8\x92\x26\x0b\xf1\x3c\x94\x95\x64\x46\xd5\x85\xca\x49\x62\x52\x4e\xeb\xd6\xb4\xb8\x57\x14\x7f\x3d\xee\x2f\x1c\xa9\x8a\xef\x91\x6d\x5c\x6f\x5d\x36\x8c\x40\xb0\x43\x6e\xe2\x2d\xa4\xe5\x2d\x68\x00\x77\x4a\xd7\x1d\x04\xa1\x80\x23\x65\x98\xd1\x8d\xff\x1d\x1d\x8e\x2f\xfa\xf4\xf4\xe9\xbb\xc5\xe3\x78\xf3\xf6\x6e\xa3\xbf\x5e\x0e\x5b\x9f\x78\x34\x25\x4d\x12\x9a\x59\x66\xbc\xd3\xa6\x3d\x19\x4a\x73\x5b\x9e\xd1\x40\x86\x11\x43\xd2\xda\xfc\x1a\xec\xa7\xc5\x3e\x44\x7b\x62\xea\xda\x58\x87\xdd\x71\x02\x8a\x1d\xbe\x05\xee\x04\x65\xe1\x50\xd7\x74\x6a\x59\x09\x0a\x26\xe8\x09\xc3\xfc\x99\xff\x1e\xef\x8e\x31\x7b\x5e\x07\xbf\x7b\x5e\x07\xab\x79\x1b\x7d\x5b\x9b\xe1\xb2\x0e\xb6\xec\xa7\x4e\xe7\xbe\x20\x7a\x59\x9b\x9a\x17\xb9\xce\x19\xe9\xda\x61\xc2\x90\xb5\xa2\x58\xdc\x81\x22\x6f\x32\x48\x38\x13\x54\xee\x6c\x4d\x2f\x97\xe6\x84\xdc\xa9\x77\xdd\x58\x9e\x14\x88\x5a\x18\x55\x43\x09\x41\x59\x97\x90\x40\xe9\x4e\x13\x5c\x98\xa2\x52\x04\x10\x5e\x6e\x64\xb7\xf8\x33\xaf\x6a\x9c\xdf\xec\x72\x53\x11\x53\x96\xe4\x14\xcb\xe2\x7c\xfc\xa9\xdd\x65\x14\x1b\x2f\xaf\x1a\x44\x3b\x7a\x23\x87\x7a\x3f\x6d\x0c\xa6\x3e\xb3\xf9\xee\x0e\xe8\xf1\xa7\xf4\xf2\x3c\x3e\x7c\x7a\x88\x1e\x3e\x3d\xec\x86\x50\x51\xea\xda\xc2\x9d\xe9\x25\x6f\xbb\xcb\xa5\x86\xb2\xef\xfb\xfd\xe4\x4a\xb3\xd8\xce\x93\x1a\xa0\xd4\x80\x8d\x17\xa9\xc0\xae\x58\xbe\xdf\xeb\xf6\x0e\x66\x97\x7a\xfd\x98\xc7\x3b\xb3\xdd\x37\xc0\xcc\x8a\x5c\x7b\xfa\x3b\xf8\xee\xf0\xf8\x04\xf1\xf2\x0d\xef\x31\x04\xb7\xe0\x3a\x19\x97\x50\xe0\x8b\x55\x7c\xca\xd3\x19\x85\xa7\x64\xbe\x84\x5d\x02\xd3\x3c\xa5\x59\x58\xee\x52\x37\xd4\x6e\xb8\x05\xbd\x56\x9d\xc5\xb4\xc6\x94\xe2\xda\xf5\x14\xd7\xcf\xed\xd2\xff\x9c\x76\xd5\x3c\x51\x50\xd6\xc9\xdf\x68\x97\xba\xd6\xba\xd6\x8d\x47\x6d\x06\x4b\xb8\xa5\x8c\xd1\xce\xb5\x9c\x74\x01\x84\xc5\x8d\xf8\x73\xf9\xf5\xbb\x88\x8c\x41\xcc\x54\x88\x4c\xb1\x2c\x4f\xa7\x9f\xba\x5d\x4e\xc9\xfd\x5d\x84\x95\xcf\x69\x27\x3e\x07\xb1\xf5\xf5\xe9\xdb\xfb\xf8\xfe\x8e\xb2\xfe\xe1\x61\xb1\x56\x1e\x16\xb3\xa0\x82\x8b\x53\x3b\x6e\xed\xac\x94\x33\x14\x4a\xee\xce\x40\x32\x97\xed\x4a\x47\x53\xe8\x1c\xdd\x95\x80\xac\x2b\x6a\x57\x38\x3d\x99\x13\x24\x96\x32\xed\x63\x40\x2e\x07\xb4\x6a\xda\x4f\x37\x7a\xb0\xfb\x29\xf8\xdd\x16\xb1\x7c\x5c\xf9\x48\x7c\xbb\x87\x75\x1d\x7c\xfe\xf2\xf8\xc3\xc3\x87\x87\xe8\xd3\xc3\x87\xef\x76\x01\xa4\x7d\xd8\x5a\xeb\x14\x3e\x8a\x06\x35\x7d\x9a\xb8\x31\xe4\x7d\x76\xea\x77\x05\x20\xb3\x2e\x06\x7e\x12\x1d\x60\x63\x5a\x4f\x44\xec\x4a\x40\xad\xaf\xe3\xc1\x87\x76\xc7\xb6\x2a\xc8\xc7\x77\xc1\xfe\x77\x7f\x07\x87\xfc\x87\x1f\x7f\x0f\x1f\x7e\xfc\xf0\xb7\x7f\x01\x1f\xff\x23\x7c\xfa\xc7\xf7\xdf\x83\x0f\x9c\xef\x82\x2a\x0f\x8d\x53\x73\x7b\x0a\x09\x88\xd2\x65\xee\x3c\xd8\x63\x92\x27\x05\xad\xf5\x59\x57\x79\x1e\x96\x40\x7f\x1a\xc3\x4b\x5e\xee\x18\x57\xc6\x35\x17\xd9\xe5\x19\x12\x09\xeb\xd5\x48\x93\x01\x52\xcb\x56\x0e\x07\xc0\x37\x1c\xeb\xdd\xc9\x23\x38\xdf\x87\x3e\x13\xe2\x8b\x88\xbc\x40\xcd\xcb\x1c\xc3\xe7\xfd\xb9\xc1\xf3\x30\x5b\x1a\x4e\xa3\x63\x2e\x2d\xa1\x80\x64\xbc\x05\x39\xa4\x6d\xab\x4e\x53\xab\x64\xe3\x96\x15\xc9\xa0\x28\xa2\xa0\x70\xda\x21\xda\x30\x28\x78\x65\xec\xb9\x48\xad\x85\xa0\x1a\x4c\x9a\x0b\x85\x1c\xbf\x54\x98\x05\x41\x18\x9e\x6f\x6c\xe3\x45\xf6\x18\x76\xaf\x31\x7b\x08\xf6\x87\xef\xf7\x9f\x56\xf6\xb2\x9f\x15\xa0\xee\xcb\xc1\x1d\x29\x88\x41\xe7\x10\x40\x4e\xdd\x34\xab\x1a\x0a\x08\xb8\x3b\x39\x4b\x0c\x04\x24\xb5\x39\xa9\x5c\xeb\x26\xb9\xe7\xae\x3b\x4b\x28\xc1\x60\xe4\x9a\xd6\xb6\xad\xab\x55\xad\x5b\xe5\xce\x45\x4e\xea\xe2\x82\x4a\xbc\xe9\x08\xa2\x0d\xb3\xf3\xe7\x1e\xf5\xb5\xf6\x23\x7e\xee\xc8\x97\x5f\x76\x64\x37\x8e\xae\xe1\x30\x1c\x4d\x9a\x41\x01\x88\xba\xd3\xcc\x1b\x28\x26\xb1\x74\x84\xd6\x90\xb0\xb4\xce\x09\x76\xb5\xbb\xe8\x3d\x77\xf5\x45\x01\x05\x45\xf2\xdc\xd9\xde\x76\xc2\x29\xd5\xd8\x56\xfa\x9e\x74\xe5\x88\xfc\x7c\x44\xfe\xae\x49\x23\xe9\xa3\x5f\x7f\xff\xcb\x5c\xdf\xe3\xc3\xcf\xfe\xf4\xf9\xed\x16\x7c\x79\xf7\x18\x05\x4d\x9a\x87\x86\x37\x05\xca\x50\x89\x8b\xf4\x3a\xec\xce\xbc\xc1\x2c\xe3\x04\x15\xe9\xd7\x1c\x70\xa1\x70\x61\x0b\x34\xeb\xdd\xe5\x6b\x16\xc9\x2a\x2f\xdc\x28\x53\x95\x96\xd4\x9d\x9c\xb1\x89\x4a\xd0\x10\x16\xc2\x8d\x84\x96\x94\x38\xaa\x3c\xf6\x42\x47\xc9\x8e\xc4\xf6\xb7\xb1\x17\xaf\x90\xd7\x5f\x9e\x11\xaf\xab\x9b\x16\xca\x22\x03\x7b\xa5\xc0\xd3\xfc\x1c\x05\xae\xab\x78\x55\x64\x15\xca\xdd\xa0\x60\x72\x09\x9c\x04\x23\x8c\xbb\x82\x63\x49\x79\x6c\x2b\x22\x44\x59\xb8\x8b\x1b\x25\x41\xa9\xcc\x2a\xc6\xc8\xb1\x44\x8c\x54\xa8\x12\x7c\xcd\x4d\x2f\x7d\xc2\xbe\x4f\x89\x3f\xa3\x3f\x78\x4b\x6f\xeb\xd3\xc7\xc3\x3f\xdd\xa5\x3c\x83\xfa\x4a\x81\xae\x3d\x42\xec\x4f\xf6\xa8\x2c\xa5\x2c\x2f\x6e\x64\xd4\xf7\x87\x70\xd4\x17\x88\xe1\x0a\x55\x9c\xaf\xfb\x28\xdc\x95\x11\xf3\x39\xbc\x35\xaf\xfd\xac\xf6\xf4\xee\x35\x05\xcb\x87\x55\x70\x63\xbb\xf8\x4a\xc8\x52\x95\x40\xe3\xa6\x34\x47\x79\xa2\x32\xa2\x04\x2a\x2b\x37\xe2\xa1\xba\x05\x21\x61\x98\x61\xb6\x57\xcc\x1a\x2e\xc7\x3c\x2b\x45\x59\x13\xc4\x20\x71\xa3\x92\xac\x03\x51\x55\x0c\xa3\x20\x0a\x89\xe7\x4b\x97\x9e\x33\xc3\xe3\x91\xdf\x7e\xf2\xf1\xae\xad\xce\xf4\x8e\xfa\xf9\xf4\x9a\x0f\x26\xb4\xd0\xe6\x75\x92\x86\x6c\x36\xe5\x38\xaa\xd3\xa5\x70\x2c\xc2\x76\x31\x12\x59\x5d\x08\x81\x12\x9b\xcb\x6e\x10\xbb\x16\x86\xe9\x68\x5d\x31\x9f\x4e\xa2\x0b\x03\x68\xc3\x92\x49\x65\xd8\xac\xaf\x97\x22\x63\x2d\x9a\x24\xe5\xc1\x3e\x2c\x6f\x78\xbf\x9c\xef\xaf\xd7\xc9\x33\x8e\xfd\xe1\x55\x20\xf7\x83\x8f\x15\xbe\x78\x29\xd1\xa5\xca\x8e\x73\x7f\xca\x0b\x19\x26\x3d\x16\x55\x91\x23\x54\xf6\x7a\x9a\x00\xe3\x42\x16\x95\xd3\x86\x50\xcd\x63\xc9\xa5\x31\x8c\xb8\x62\x1e\xe6\x81\x93\xd4\xa4\x38\xcc\x0c\x64\xae\x20\x0c\x51\x52\x94\xe7\x9a\xb4\x41\x00\x1e\x47\xc8\x42\xec\x73\xed\x3e\x8e\x7e\xe7\x94\xda\x17\x35\x04\xd6\x5e\x7b\x0b\x49\x88\xe7\x13\x98\xd9\xd0\x30\x73\x62\xc5\xd1\xf1\x90\xf9\x9a\xaf\x7d\xf0\x9d\x8f\x81\x7f\x53\xf0\x5a\x2e\xca\xf5\xda\xd9\x7f\x7a\xf8\x6e\x45\x2b\xac\xb3\x19\x1b\x52\xc9\x92\xcc\x18\x44\x62\xc3\x74\x3e\xe7\x4e\x61\xc8\x4b\x67\xc3\xc2\x50\x99\xa4\x89\x4e\xc8\x60\x68\xac\x7c\xd4\xf2\x24\x6b\x77\x31\x8e\x1d\x55\x03\x98\xba\xb6\xca\x4b\x5d\x9c\x38\x26\xcb\xda\xa6\x37\xb2\x0b\x7e\x31\x8f\xff\x6c\xac\x13\xaa\x72\xe0\x57\x0d\x2c\x2b\xce\xe1\xe8\x8e\x84\x11\x94\x63\x52\xba\x93\x5d\x9c\x0b\xac\xb9\x10\x32\x54\x0c\xe9\x8a\xc5\x92\x0b\x6b\x29\x71\xd9\xdc\x7f\xc3\x3a\x19\xc8\xef\x58\x27\xdd\x60\x6b\x82\x28\x6a\x36\xac\xd7\x7f\x11\xbc\xf5\x73\xb2\xa1\xbd\x5e\xc1\xca\x3e\x3d\x7c\xf7\xfe\xe5\x0a\xdb\x25\x90\x5a\x38\xba\x22\x73\x82\x2e\x57\xf0\x14\x1a\x8e\x14\x62\xd8\xa6\x49\x8e\x8a\x54\x67\x4c\x4b\xba\x6b\x3c\x15\xcb\xb5\x71\xc6\x00\x0a\xa7\x30\x63\x12\x0b\x3e\xeb\xeb\xb1\x48\x12\xd4\x55\x17\x41\xf8\xa6\x31\x1c\xa9\x9d\x5a\x6b\xab\xe3\xc3\xef\x1e\xbe\x11\x47\x6c\xb2\x12\xaf\xc0\x82\x51\xa0\x78\xab\xad\x41\xb2\x90\x1c\xe1\xfa\x44\x2e\x5d\x9e\xd5\x82\x29\x43\xa5\x16\xa4\xde\x29\x2c\x65\xbf\x98\x49\x6e\x4a\x9b\xac\x6b\x69\xc3\x2d\x3b\xf1\x82\x96\xb2\x22\x0c\x63\x4c\x97\x33\xd9\xf3\x35\x36\x3b\x1a\xec\x83\x77\x2f\x50\x2b\x8f\x9f\xbf\xac\xdb\x2c\x84\xfb\x82\x78\x39\xf8\x58\x57\x99\xca\xcb\xb9\x00\x9e\x26\x75\x92\x85\xd5\xdc\x72\xa7\x19\x60\xe6\xda\xb0\xb0\x39\xe5\x55\x6a\x72\xd1\xb6\x6c\x47\x09\x2f\x38\xb9\x48\xad\xa5\x99\x1b\x37\xaa\x11\x26\x3a\x1f\x8b\x0c\x37\xd5\x85\x13\xee\xf7\x38\x3f\xa8\x5d\xeb\x3d\xf4\x1f\x5f\x9e\x30\x3f\x7f\x03\xaf\x90\xa6\x61\x0d\x26\xa9\x93\xb0\x99\x71\xe9\x72\x06\x75\xe9\x54\xc4\x3c\x44\x98\xd7\x39\x32\x65\x52\x27\x55\x39\x59\x1e\x09\xd3\xb6\xc6\xce\x8d\x9b\x24\x04\x70\x81\x13\xe3\x84\x33\x17\xcc\xa7\x3c\xab\x9a\xf2\x5c\x95\x68\x99\x8b\x9d\xf2\x3a\xe6\xcc\xf7\xc3\xd7\x52\xdd\x51\x86\x2b\x0a\xfd\x5b\x3f\x56\x8a\x6f\xdf\x8b\x7d\xa6\x12\x93\x00\x71\x6d\xe6\x7a\x02\x41\xa6\x60\xa0\xa5\x28\x69\xae\x8b\x32\x13\x09\xe6\x8c\xec\xec\xb0\x58\x98\x83\xb9\x5a\x57\x6b\x40\x51\x00\x67\xc6\x11\x63\xf3\xf9\xda\x60\x3c\xe5\xee\x28\xd7\xbb\x3a\x0a\x6b\x5f\xff\xb7\x62\x0a\x3e\xae\x0a\x35\x7f\xea\xc0\x7b\xbb\x75\x23\xaa\xa0\x5c\x5e\x45\x1a\xe2\xb9\x2d\x2e\x47\xd5\x9f\x72\x77\x0e\x7b\x23\xb9\xd2\xb8\xc9\x29\xae\x92\x26\xe7\x4d\xc7\x77\xed\x71\x5a\x4e\xbc\x72\x3e\x1d\x45\x1b\x06\xd0\x84\x15\x93\x52\xd3\xb9\xb9\xf6\x45\xc6\x21\x41\xae\xd3\x94\x07\x51\x60\x6e\xd5\x01\x45\xc5\xcf\xeb\x79\xf7\x9f\xde\x7d\x17\xec\x3f\xfe\x7b\x78\x5a\x61\x2a\xb1\xae\xaf\x45\x1d\xa6\x8b\x85\x54\x70\xf8\x7f\x59\xfb\x7b\x20\xcb\x75\xfe\x4c\x0c\x27\xc8\xf3\xc1\xff\xee\xdf\x12\xfb\xce\x9d\x3b\xd4\xca\x96\xd0\x9a\x7b\xdf\xe1\xae\xd7\x12\x56\xad\x99\xe1\xd6\xae\x5e\xc3\x55\x6b\x2f\xca\x65\x97\xe1\x72\xb9\x0a\x0e\x5c\x85\x10\x21\x42\x84\x08\x11\x22\x44\x88\x90\x21\x43\x86\x0c\x19\x32\x64\xc8\xf0\x84\x27\xa4\x6e\x37\xd1\xae\x03\x9e\xfe\x9a\x3b\xaf\x5e\xa9\x76\x67\x9a\xdd\x1d\xcc\xf0\x00\x20\xf8\xc3\xef\xeb\x79\x9e\x1e\x20\xc0\x40\x0d\x90\x0e\x4b\x70\x59\xb5\xd2\xb4\x5a\xfb\x74\x38\x2d\xed\x63\xc2\x0c\x19\xdd\x28\xb4\xb1\x57\xae\xe4\x25\x72\xd4\x16\x51\x1f\xfb\xee\x4a\x9f\x18\x6d\xd9\xe2\xd3\xe2\xf2\xe5\x7f\xf5\xa0\x0d\x0d\xe8\x02\x01\x7c\xb5\x2a\x39\x44\x6e\x92\xe2\xa0\x62\xbe\xe9\xeb\x4b\xce\xfb\x19\xa1\xfb\x1d\x96\xd4\x18\xac\x7d\xda\xa8\x4d\x3f\xbf\xa1\x58\x7a\x8d\x61\xdc\xc0\x3d\x40\x1b\x69\xce\xc1\x02\xc1\x58\x55\xc3\x8b\xd1\x35\x27\x0c\x15\xaa\xa5\x01\x32\x48\x50\xa6\xa5\x42\x44\x92\x55\x44\xbb\xd8\xb3\x5a\xd6\x2c\x35\x8a\x52\x4e\x73\x04\x55\x89\x0e\x2a\x48\x60\x83\xd4\x61\x7a\x18\x18\x2f\x4c\x4e\x52\x17\x11\xf5\xcb\x38\xc2\x30\xf7\x30\x8c\xd9\x02\x2a\x0d\x68\xe5\x44\xad\x05\x57\x58\xf2\x20\xa8\xc0\x9c\x62\xac\x30\x23\x41\xf4\xa7\xea\xdc\x27\xc9\x61\x57\xc5\x3d\x71\xb1\xd9\x5b\xdd\x6a\xe3\x12\x7d\xea\x68\xbf\xaa\x81\xbe\xae\xfe\x3c\x33\xc3\xfe\xb6\x00\x71\xe8\x28\x52\xd5\xe5\x5c\xb8\xea\x36\x10\xce\x20\x82\x04\x56\xed\xe6\xb9\xbb\xee\xb5\xec\xc4\x41\x5f\xce\x1d\x36\x82\x3c\x2c\xd6\xdd\xf7\x8c\xe5\x26\x27\x53\x10\xc0\x05\xba\x5b\x5c\x48\xa6\x69\x5a\x87\x69\x9a\x92\x43\x22\x1f\x69\xd6\xfd\x57\x1a\x67\xba\x90\x38\xce\x13\xe0\x36\x92\xc8\x60\xc6\x61\x55\x11\x58\x35\xb6\x71\x00\x07\xdf\x35\x0d\xa8\x9b\x00\xe3\x8f\xeb\xd1\x33\xfc\x93\xc6\xa9\x1f\xe9\x4e\xc5\x71\x6e\xfd\x88\xff\xee\x5a\x3f\xf8\xde\x38\xff\xc8\x30\x33\xc3\xb1\xae\xf9\x2a\x41\xe7\x62\xae\x52\x0b\x51\x21\xa8\x22\x79\x38\xd0\x81\x8c\xa7\x13\xd0\xa7\xd5\xc5\x1f\xdf\x1b\x25\x19\xe2\x56\x61\x6f\x07\x99\x24\xc9\x21\x75\x89\x39\xca\x83\x49\x76\xdf\x8e\xf3\x75\xeb\xe4\x77\xfa\xfb\x2e\xe3\xfc\x46\xbf\xea\x50\x0a\x46\xfb\x87\x31\x2d\x7d\x0a\xd7\x19\x4c\x8c\x63\x0a\x65\x5d\x85\xde\x87\xce\x81\x79\x3d\x8d\x31\x86\x3f\x01\xfc\x30\x3d\xfd\x76\x30\x75\xcd\xa5\x99\x26\x6b\x1e\x5a\xc6\x72\x9b\x13\x1e\x66\x10\x37\xaf\x09\xd4\x39\x17\x48\xec\xfd\x3b\x64\xc3\xf3\x1e\xfd\x2f\x5e\xd3\x43\xcb\xb0\x46\x6c\x35\xc0\x79\xe0\x82\x00\x92\x8b\x0a\x55\x1a\x4d\x7e\x72\x40\x06\xd1\x4f\x13\x50\xd3\xda\xc6\x1f\xff\xac\x35\xcd\x12\xf6\x88\x33\x15\xeb\x04\x4f\x9d\x2c\xcf\xa0\xea\xec\x59\x29\xe4\x9a\xc3\xbc\x7b\x12\x21\xbe\xb9\x05\x93\x43\xde\x51\xe7\x7c\x4b\x41\x8e\x41\x67\x2f\x9f\x77\xb6\xa1\x71\x4b\x58\x40\x6e\xd1\x65\x93\x1e\x34\xa2\xcc\x99\x86\xcd\xc6\xcc\x61\xb1\x9d\xe9\x56\xa2\x75\xda\x75\xa6\x7b\x60\xa0\x4a\x40\xb6\x44\x0e\x7b\xb4\xd9\xf6\x4d\xab\xf5\xe2\xcf\x6f\xf4\xe4\x6f\xfb\xb9\x9e\xb2\xfc\x3b\x98\x25\xc2\xa2\x0a\x81\x0a\x23\x57\x57\x03\x95\x4a\x42\xa5\xea\x60\xc1\xec\x1b\x21\x98\xc0\x6b\x7f\x40\xae\x6f\x2a\x84\x4d\xb1\x48\xe4\x9a\xb5\xdc\x1c\x9e\xb4\xb7\xad\x11\x84\x2a\xfd\x3c\xff\x5d\xf1\x47\xe6\xff\x86\xeb\x77\x9b\x7f\x5a\xbb\xba\xef\x58\xd7\xb5\x67\x0a\x28\x4f\xf3\x2e\xee\x11\xe8\x02\x75\x20\x66\x7d\xba\x0a\xb4\x81\x3e\xaf\xc0\xe8\xec\xf4\xb4\x02\x4a\x3d\xad\x40\xc4\x97\xa7\x2c\x72\xa0\x9b\x57\x63\x48\xae\xbc\xb6\xc9\xf1\x0f\x8c\xe1\xe2\x19\xee\x7a\x57\x81\x12\x70\x16\x36\xbf\x66\xa4\xa0\xc1\x29\x1b\xc1\x1c\x20\x30\x6e\x55\x0e\xc4\x1a\xea\xb9\x48\xcd\xaa\x0e\xe6\x12\x6d\x38\xe7\x01\x0a\x53\x6b\x40\x7e\xfa\xce\x60\xb2\x44\x03\x16\x7b\xf8\xfe\x34\xf9\x10\xab\x17\xaf\x60\x96\x9f\xb7\xfe\xe8\x38\x0c\x70\x79\x48\xfb\x4f\x3f\x7f\xf9\xfb\x97\x34\xfb\xe6\x0b\x35\xe9\xc9\xc7\xce\x21\xf3\x2b\x4f\xd5\x5a\x1e\x98\xbf\xcf\xfd\x2e\x09\xd5\x18\x3a\x06\x50\x93\x15\xb5\xb0\x24\xb7\x85\x3e\x8f\xfc\x90\x4b\x69\x84\x31\x22\xf8\xd0\x0d\x23\xa0\xc1\x95\xc6\x43\x03\x85\x14\xe1\x0c\x61\x2d\x2a\x27\xf0\x16\xb7\x27\x0d\xb0\x87\x79\x67\x92\x77\x5b\x47\xfc\x6f\x45\x83\x37\x66\xd1\xd3\x7e\x91\x2d\x15\x50\x51\x86\x8a\x50\xaa\xb5\xa0\x69\xcb\x57\x74\x76\xd2\x58\xbf\x33\xeb\x69\x2a\x5d\xa1\x01\x09\x85\x76\x0c\x68\x8c\xac\xa0\x32\xd9\x67\xc9\x23\x8f\xbe\xc6\x56\x19\xb9\xbd\xcc\xff\x5b\x3c\xd3\x53\x17\xf3\xbb\xa7\x0e\xcc\x1f\xbe\x7e\xe3\x0b\x66\x0c\x34\x3e\x9a\x3e\xf3\x40\x2e\x2f\x1d\x38\x45\xe8\x03\x38\x1b\x6e\x99\x59\xa5\xc5\xd4\x89\xd9\x43\xa2\xa3\x12\xc9\xdc\xf0\x6b\x07\x44\x18\xac\x05\x75\x48\x8c\xa7\xde\xe0\x29\x2c\x04\x24\xa7\x02\x85\xee\x44\x41\x7e\x0e\x14\xc2\xba\x47\xe7\xb8\x1a\xbb\x74\x79\xe4\xc7\x26\x4d\x9e\xc7\x1a\xb9\x7f\x5e\x8f\x03\xbc\xd1\x3f\x8f\x04\xfa\xcc\x21\x29\xea\xdc\x95\xa2\x1f\x24\xc0\x82\x48\xc2\xc1\xc4\xb1\xad\xf9\x5a\x5a\xcc\x9c\x48\x93\x50\xc1\xb2\xe6\xd8\x32\xca\x2f\x4e\x99\x50\xa2\x6c\xc7\x7a\x6c\x50\x1d\xe6\x9e\x6e\x7c\xbc\x36\x65\x47\x71\x80\x51\x93\x24\x86\xdf\x3f\xdd\x5e\xc1\xdb\x91\x35\xec\xf3\x6d\x66\x33\xbe\x32\x02\xea\xbe\xce\x7d\x29\xc2\x1c\xb8\x4e\x9b\x15\x1f\xe0\xba\x9c\xab\xb2\xf6\xf5\xc4\xb0\x04\xcd\xbc\xe5\xa5\x8a\xd8\xc7\x57\x45\xac\xe6\xf5\x7e\x6f\x68\xc8\x3e\xdf\x82\x62\xcf\xef\xa5\x00\x6d\x5a\xe9\xc2\x23\xc9\x56\x1f\x92\x6e\x67\xef\xf1\xa1\x5a\xcf\xe7\xaa\xc4\xb6\x1e\x30\x22\xea\xe9\x9e\x89\x7d\x34\x47\x99\xd6\x5b\x4f\xe5\xab\xe7\x07\xf7\xc3\xca\xb3\xea\x1f\x60\x56\xae\x2a\xad\x5d\xd0\xce\x81\xab\xef\xc5\x52\x1d\xe3\x9e\xf7\x2f\xfb\x3e\xbe\x88\xcf\x6d\xc3\x36\x83\x4d\x56\xae\x06\x14\xc0\xb3\x80\xc2\xd4\x84\xd3\xc5\xc5\xeb\x96\xd5\xec\xfd\x34\xb9\xd0\xdb\xa6\x07\xcd\xea\x52\x1e\xe4\x6c\x06\x50\x27\x49\x9a\xe9\xab\x0f\xfb\xfe\xca\xfa\xfc\x43\xf2\x54\x46\x48\x62\x7e\x3c\xbb\xfb\xf3\x2b\x8f\x9b\x2c\xd6\xa1\x06\x09\xa2\xb9\x2d\x39\x33\xa1\xa7\xe1\x54\x82\x12\x96\x0d\x9a\x2d\xb3\xcc\xec\x9c\xa7\xa1\x0a\x18\x94\x28\x2c\x1e\x9c\x52\x86\x3c\x02\x09\x20\xeb\x98\x26\xc6\x31\x67\x92\x34\x43\x57\xae\x88\x7f\xf1\x14\x3d\x5d\xe9\xce\xde\xdd\xbe\x07\x87\xf7\x3f\xfe\xf4\xa2\x59\x03\x7f\xf7\xf9\xef\xbe\x82\xdb\x5d\x44\xc1\x8e\x0f\x27\xa6\xd4\x90\xa7\xe7\xf5\x2c\xd8\xac\x24\x2e\x9a\x42\x4f\x6d\x98\x63\xc3\x5e\x7e\x90\x90\x33\xdf\x6b\x79\x0a\xa3\x5e\x95\xc6\x65\xc9\x47\xb4\x78\x2e\x68\x9f\x96\x91\xcb\x54\xc6\x7e\xa2\xff\xe1\x0d\xcf\xdf\xcd\xf1\xe6\xe3\xcd\x31\x6e\xce\xdf\x83\x2b\x27\xdf\xa7\xbf\x06\x4f\x04\xab\x97\xeb\x48\x85\x84\xb4\xc0\xb0\xaa\x4e\xbe\xa9\xe7\xce\xc1\xc2\x43\x42\x83\x0b\xa7\x12\x13\x86\x9d\x6f\xfc\x1e\xae\x3c\x4c\x85\xcf\x07\xa0\xd8\x9a\xa7\x3d\x7e\x98\xaa\x12\xd6\x23\x09\x67\x54\xe7\x39\xa5\x59\x01\x6d\x9d\x96\xa1\xaa\xd3\x2a\x94\x1b\xee\xcb\x3e\xca\x63\x77\x40\x57\xd4\xd2\xc7\xcf\x2f\xc4\x86\xcf\x82\x78\x97\xed\xea\xfc\x3a\x53\x07\xa8\x28\x1d\x54\x24\xa8\x70\x56\x69\xbf\xe6\x07\xf4\xa0\xc5\x4a\xaa\x4a\x83\xa4\x0a\x8e\x62\x2a\x32\x03\x4e\x11\x53\xfd\x8f\xdc\x77\xc3\xfd\xdd\xee\x92\xac\xf6\xa1\xa4\x1a\x14\xaa\x74\x50\x90\xe0\x16\x95\x9a\x55\x3c\xdf\x96\x03\x58\x05\xc7\xea\xeb\x6d\xa3\xa6\x8b\x8a\x7b\xe5\xff\x7f\xb5\x3f\x4f\x32\x18\x17\x2b\xf4\xee\x4a\xcd\xfd\xfe\xc7\xd7\xef\xf9\x37\x16\x7a\x57\x59\x09\xfd\x48\x1c\x48\xa8\x75\x5c\xd9\x19\x8b\x2a\xb7\x05\x1d\x2c\x0e\x15\x90\x3e\x7a\xb9\xa7\x7b\x07\xe6\x60\x77\x2e\x34\xa8\xb6\x04\x93\xcc\x87\xde\x83\x39\x78\xa1\x44\xa3\x16\x82\xfb\x6a\x91\x98\x07\xb6\x2c\x76\x71\x6e\xb9\x9c\x53\xdd\xf3\xd8\x3e\x46\xbe\xe7\xef\x8f\xed\xa7\xd7\xa2\x06\xdf\x8e\x2e\x1b\x1a\x5d\x36\x27\xe2\x40\x29\x4c\x2b\xb4\x5f\x20\xd2\xa8\xb0\x25\x42\x93\xc3\xeb\xe9\x6a\x3b\x53\x78\x0f\x53\x18\xd8\xce\x05\x5f\xff\x76\x7c\xfa\x8c\x4a\xd2\x55\x8f\x49\x8d\x08\x7b\x35\xc4\x88\x1b\x56\x47\x97\xda\x0d\x8b\xfa\xcd\x67\xa3\x6f\xee\x0e\xdc\xd3\xff\x04\x89\x7c\x34\x47\xbb\xfd\xbf\x6f\xcf\xbc\x31\x9d\x7d\x3a\xaf\x30\xc3\xcb\x9c\xe1\x15\x82\xe6\x74\x72\x67\xe7\xce\x97\x35\xe9\x93\xf6\x88\x62\x4e\x7b\xc3\x61\xbe\x62\x49\xcd\xae\xb5\x96\xf8\x54\xb0\x8f\x0a\xb5\xe5\xfd\x00\xf4\x1c\xcf\x47\xba\xb6\xd1\x43\x50\xc2\x36\xf7\xd3\xae\x7a\x90\xe9\xd2\x04\x6a\x22\x97\x79\x9a\x3c\xe2\x7d\x75\xed\x0b\xff\xf8\x84\x4f\xba\xb9\xcd\xee\xfe\xee\xeb\xdd\x8f\x6f\x04\xf3\xaf\x14\x73\x5f\x3f\xa6\xdd\xe5\x9e\x91\x74\x66\x18\x2e\x41\x38\x66\x16\x33\xc8\x49\x85\xf2\x0e\x3a\xaf\xad\x83\xdd\xa1\x5e\xad\x01\x7c\x2d\x19\x63\x6c\x35\x4b\xe9\x2e\x11\x7a\x18\x43\x6f\xa4\x00\x55\xe4\x19\x34\x8f\x78\x27\xae\xfd\x5d\x7f\xf5\xf2\xd9\x97\xf5\x7c\xfd\xd1\x5f\xbf\xdc\x3c\x91\xc2\x83\x3c\xc3\x0f\x7d\x6c\xc2\x7c\x4c\x00\xf5\x39\x98\x64\x4f\x69\x25\x38\x2b\x60\x18\x8a\x76\x94\x80\x96\xa1\x3b\xe0\xd5\x38\x40\x56\xd8\x71\xb6\xca\xb9\xf4\x25\x56\xc0\x84\x53\x68\xad\x1a\x41\x9b\x64\x51\x9b\x95\x5e\x3f\xfb\x15\xc6\x2e\xbb\x7b\xff\x06\xab\xb9\xcd\xf9\x9c\xf1\x07\xef\xd3\x72\x3d\xc1\x26\xad\x0b\x6d\x88\x85\x9e\xd6\xa8\x08\xa2\xb0\x5e\x7b\x7d\xc0\xab\xf6\x00\xaf\x73\xbb\xb6\x61\x2a\x9a\xa2\x01\x26\x9c\x43\x67\xb5\x02\x5b\x4f\x04\x7b\xc4\xe9\xf4\x5d\x0e\xad\xbb\x9b\x8f\x37\xd7\xeb\xdd\xab\xee\x8c\x38\x49\x3b\xc7\x3f\x8b\xc4\x1a\x8b\x5e\x13\xa6\x36\xf2\x2c\x0d\x92\x55\x83\x7c\xd5\x20\x09\xd4\xf7\xa4\x6b\x08\x39\x6b\x11\xf1\xc6\xff\x32\x9d\xae\xba\x90\x6f\xb9\xd3\xff\xfb\xd8\xaf\xf5\x1f\x7e\xbb\x5f\xdf\x5d\x7b\xe8\x6e\x9f\x34\x22\xbf\xe9\xd4\x78\xc3\xa3\x3e\xa5\x45\x5c\x08\x30\xde\x0f\x60\x58\xcf\xd5\x4e\xdc\x3b\xdb\xf7\x80\xf4\xa6\x7b\x10\xd9\xf9\xa1\x70\xe9\xb0\xd6\x4f\x57\xc3\x86\x91\xce\x29\x1e\x06\xdc\xf7\x87\x8a\x52\x45\xa5\xa4\xe1\x1c\x8c\x68\x2e\x7f\x82\x5f\x15\x18\xe9\x63\x42\xc3\x42\x47\x21\x90\xa9\x48\x45\x0c\xa9\x92\x7f\xb9\x61\x2f\xfe\xf9\xf3\xb8\xfb\x27\xcc\x63\x97\x00\x6d\x23\x9d\x20\x7e\x38\x01\x12\x74\x9e\xc9\x07\x6b\x94\x3a\x69\xa5\x57\x9a\x95\x0f\x27\x1b\xd3\xf6\xd7\x8b\x51\x37\x92\x19\xf8\xd6\xd7\x4d\x7b\x99\x86\xbc\x4e\xc3\x4b\x13\x69\x96\xbb\x95\x83\x13\x0d\x67\x16\xce\x74\x94\x1c\x69\x44\x10\xd1\x0c\x25\x49\xba\x27\x8f\xf8\xd8\x65\x55\x52\x6c\x9e\xcc\x1b\x08\x72\xf6\xf1\xee\x12\x6c\xec\x3d\x98\x4a\xcd\x34\x97\x4c\x1b\xec\x85\xa8\x60\x53\xd6\xb8\xcc\xaa\xe0\xce\x5e\x29\xe9\x5a\x2a\x79\x33\x83\xa2\xb7\xbe\x4d\xc0\x9e\x67\xf4\xd8\x1e\xaa\xc8\x04\x74\xf3\xe3\x7f\x00\xef\xb7\x5a\x40\x14\x5c\xfa\x33\x70\x24\x15\x66\x84\x18\x29\xe5\xa1\x0a\x15\x16\x18\x03\x33\x2f\x86\x4b\x90\x83\x78\x5e\x9d\x1f\x49\xe4\x94\xfc\xb3\x6b\xdd\xf4\xca\x64\xbd\x19\xd7\xcb\x41\xfa\xe9\xeb\xcd\x97\x3d\x63\xd2\x8c\xe3\x38\x6a\x5e\x2a\xad\x51\x49\x9a\x83\xe4\x18\x86\xb3\x0a\x27\x15\x86\x12\x2a\x04\x83\x02\xb2\x30\xc5\x6e\x80\x1b\xbe\x8f\x64\x63\xf4\x41\xfe\xdb\x2b\x5b\xff\xe5\x7e\x5f\x7f\xfa\x70\x73\x65\xa3\xfb\x7a\xb1\xe4\x5f\xde\x1d\x7f\xf7\xe9\xe6\xeb\x97\x5f\x36\x92\xa1\xdb\x17\x52\xe2\x8f\x97\x7f\x0b\x66\x2c\x5c\x8d\xa0\xae\x5b\xcd\xac\x20\xb8\x6e\x29\x2e\x2b\x0e\x41\x87\x8b\x4a\x03\x59\x63\x02\x09\x54\x04\x16\x07\xa5\x6a\x14\x9a\x42\x2a\x70\x5a\xeb\xa0\x42\x2b\xa4\x5a\x60\x45\x76\x73\xf5\x30\x94\x56\xae\x2d\x36\xbe\x74\xfa\x9e\x1e\xba\x7b\x4a\xa8\x46\x3b\x18\x9a\x82\xc5\x1a\xcb\x7e\x87\xe2\x1e\x13\xd7\x7e\xfb\x0f\xdb\x88\x77\xfb\x4f\x3f\xef\x5f\x72\x55\x7f\xb3\x79\x4d\xef\xfe\x11\xfc\xcf\xb1\xc6\xc1\x07\x82\x40\x03\x2a\x47\xb8\x95\xe1\x4c\x2a\x55\x11\x45\xa0\x81\x04\xa6\x27\x65\x01\x0d\x2d\x67\x08\x95\x10\xd1\xa0\x81\x56\x7c\x9d\x0e\x42\x63\xa4\x2b\x57\xcf\x8e\xb6\xc2\xf8\xca\x9b\xd2\x78\xd4\x98\x60\x9d\x35\xa5\x0d\x8e\x90\xdc\xe6\x25\xa0\x56\x48\x71\x5d\xdf\x98\xc7\xff\x31\xf9\xf3\xe4\xdf\x26\x7f\xfb\xdb\xf5\x7d\xf7\xc7\x97\x37\x4d\x6a\xd1\xd4\x75\xa5\x71\x6b\x99\x17\xb6\xee\x18\x29\x91\x2c\xc1\x58\x97\xc8\x00\x83\x31\x86\x18\x6a\x02\xcb\xa7\xd5\x55\x26\x4d\x56\x1a\x78\xe8\xa4\x54\x20\xa1\x71\x75\x47\x68\xd5\xda\x60\xd3\x14\x56\xdf\x93\x37\xab\x4b\xe9\x86\x2b\x26\x47\x9d\xf2\x88\x1c\xbf\x7b\x1f\x2b\xaf\x6f\x65\x82\xff\x1e\x5c\xdc\x52\xd9\xa4\x12\xcc\xe5\xba\xac\x5e\x9f\x00\x13\x65\x03\x29\x09\x75\x70\x4d\xc8\x61\x5a\xa6\x7c\xc2\xd4\x31\xdc\xc3\x8a\x1a\x34\xe0\x9a\xf2\x09\x35\x28\xf6\x50\xba\xac\x88\x7e\xc2\x0f\xb1\xa6\xfe\x17\x4f\x5d\x22\x51\xec\xe7\xee\xe6\xf6\xe6\xd3\x97\x0f\x51\x56\xf9\x49\x02\xf7\x49\xfe\xf6\xdd\x06\x86\x23\x16\x81\xb2\xaa\xdb\xb5\xe5\x6e\xc0\xa8\xab\x11\x12\x62\x96\xa1\xbd\x7c\x17\x65\x38\x87\x06\x01\x7e\x50\xd0\x2b\x29\x1e\x86\x74\x10\xd3\x28\x85\x66\xc1\x9f\x4e\xa7\xb5\x3b\x9d\x4e\x01\x29\x4e\x6d\xd4\xcb\xde\x67\xec\xca\x21\xf7\x21\xf9\x8b\xe4\x2e\xf9\xf7\xc9\xff\xf8\xa2\x3c\xf4\xd3\xfe\xf8\xf3\x13\xa8\x2b\x32\x02\xc7\x0c\xc3\x01\x7c\x4f\x82\xf3\x2f\x41\xfa\x62\xa7\xbc\x2b\x4a\x30\x72\x63\x40\x49\xc2\xa9\xeb\xc3\x42\x97\xa6\x96\x18\xf3\x4e\x11\xad\x48\xf0\x65\x38\x03\xed\x22\x91\xad\xc0\x35\xc4\x18\x05\xed\x95\xd2\xca\xa5\x8d\x66\x86\xe8\x83\xac\xea\x5a\x9d\x1d\x23\x86\x68\x4b\x0c\x56\xd0\x11\x2c\x7b\x24\xa4\xf6\x70\x45\xd6\x9a\x80\x15\x2b\x5d\xc9\x80\xe7\x24\x2c\x4e\xb4\x63\x3f\xd2\xb1\x4f\xf6\xb1\x4e\x61\x77\xcb\x77\xe7\xf4\xe1\x32\xa7\x97\x12\xc9\xfe\x32\xa3\xe3\x4f\x7f\x60\x4e\xaf\x6c\x2f\x35\x45\x91\xd6\xd6\x4d\x67\x1c\xc6\xf3\x72\xae\x87\x8e\x11\x8c\xf9\x08\x88\x11\x81\x16\x05\x0f\x16\x74\x1e\xf4\x01\x53\x11\x31\xf5\x28\x90\x41\xea\x8e\x77\xe9\x68\xb5\x92\x76\xb7\xc0\x0a\x6a\xcb\x71\x65\x6b\x61\x2a\x5d\x31\x44\xea\x8a\xdb\x9e\xf2\xa2\xa4\x01\x5f\xa6\x34\x28\x5a\xd8\x82\x81\x12\xd3\xcb\xae\x35\xaa\x65\xce\x5f\xfb\x9c\x48\x7a\xda\xcd\xc9\xbf\x48\xfe\x64\x63\xed\x89\x75\xf9\x9b\x8f\x91\xe8\x98\x10\x42\x41\x2e\x1d\x66\x0e\x14\xd6\xa6\x9a\x11\x0b\x2a\x40\x50\xe3\xef\xe7\x9d\x7f\x88\x18\xa9\x63\x62\x32\x14\xf3\x17\xfb\xe4\xff\xf7\x1c\x1b\x7f\x7a\xca\xbc\xfd\xf2\x4d\x19\xf2\x97\x2b\x0f\xf5\x95\x4a\xf5\xf8\xe9\x0b\x70\x4e\x71\x6d\x33\xe3\x1c\xf0\x8d\x34\xbc\x59\x47\xcd\xad\x32\xab\xd5\x42\x72\xb9\x6f\x68\x58\x42\x82\xd3\xe2\x61\x12\xdd\x2c\xcf\x07\x85\x99\x16\x44\x04\x0a\xa4\xef\x68\xd7\x60\xd2\x77\xca\x43\x4c\x35\xc7\x25\x5b\x88\xe0\x82\x77\x52\xa9\xe4\x98\xa8\x47\x7d\xf4\xd9\x9c\xfc\xc9\x9b\x73\xf3\xe9\xbd\xb8\xea\xd1\xfc\xfc\xe1\xf6\xcb\xd7\xdb\xec\x3b\x7a\xfb\x69\x2f\xab\x54\x97\x10\x34\xbf\x6a\x46\x28\xa8\x4d\x4a\xaa\x72\x9d\x2e\x9e\x3c\x4c\x25\x98\xee\xbb\xa7\xdf\x7e\x85\xc7\x6a\x99\xb2\x99\x55\x02\xa1\x75\x02\xae\xae\x8c\xad\x10\x7a\x61\x13\x0f\x5d\xe4\x97\xda\x5d\x62\xb6\xe6\xa0\xff\xd1\x58\xf1\xf3\x93\xbe\xe9\x25\x56\xdc\x13\x5b\x42\xb0\xac\x13\x13\xb2\x41\x69\x15\x28\xc5\x0d\xa3\xa8\x29\xa5\x37\x93\x55\x40\x84\xe6\xa0\xa1\x94\x76\xb4\x72\x09\xb3\x5c\xb5\xaa\x61\x89\x35\x1a\x18\x93\xb4\x4b\xf3\xd8\x83\x21\x1e\xe9\x1e\xc5\xe7\xf4\x96\x4f\x6c\x3b\x83\xa3\xa0\xfe\xbb\xf4\x29\xe1\x57\xa0\xc2\x15\xf5\x94\x3a\x5e\x22\x4a\x14\x42\xd4\x68\x03\x2a\x1a\xc1\x6c\x65\x11\xf8\x41\x29\x8d\xac\x0c\x93\x0b\xe2\xec\xbd\x96\xdc\xf5\x52\x9e\x00\x01\xc9\xc2\x7c\xd7\x9d\xe3\xfe\x92\x8f\x34\xc6\xf7\xd1\x3e\xbf\x78\xf9\x57\xc4\xcb\xd6\x4d\xf7\xd3\xeb\x06\xb6\xd8\xe1\xf7\xf9\xa9\x3d\xf7\x53\x07\x7c\x4c\xc0\xa6\x55\xe1\x0b\x30\x86\xba\xa8\x39\x71\xbc\xc1\x35\x2d\x4c\x29\xb9\x11\x84\x33\x45\x29\xbc\x27\xe0\x14\xf8\x7e\x16\xd8\x61\xb6\x1f\xda\xd6\x74\xe0\x14\x4a\x1b\x4e\x61\xee\x40\x51\x07\x17\x96\x79\x29\xcf\x1e\xe4\x94\x68\x2e\x40\x05\x06\xdb\x01\xa8\x3d\xf6\x7a\xcb\x75\xb1\x47\x92\xc1\x1d\xbd\xbe\x0b\xcf\x1d\x54\x5f\x2e\x5b\x38\x4d\x0c\xa1\x8e\x52\x3e\x03\xea\xdc\x8e\x12\xe7\x1e\x64\xda\x72\x66\xc7\xf6\x61\xfb\xff\x51\x57\xc4\xef\xea\x2b\xbb\xc1\xc6\x00\xf7\x27\xe0\x4f\xc1\x6b\x14\xeb\xe1\xf8\xe9\x87\x8b\xc1\x7b\x77\xbb\x93\xae\x28\x53\xa5\x4a\x8a\x68\xbb\xc8\x53\xd7\x84\x45\x2c\xde\xc8\x0a\xe9\x89\x49\x67\xeb\x20\x76\x35\xc2\xb5\x35\x33\xd5\x5a\x58\xe9\x2e\x2f\x87\x33\x0d\xae\x39\x28\xc5\x68\xa2\x74\x5c\x02\x32\x93\xda\xb8\xc6\x4f\x3c\xeb\xcf\x34\xc1\x91\x31\xf4\x6b\xb4\xae\xc7\x4f\x5f\x76\x8d\x85\x29\x91\x95\xea\x1d\xf7\x43\x1b\x26\x0e\x12\xdf\xd4\x27\x5e\x05\x43\xac\xec\x0f\x0a\x4a\x37\x58\x21\xad\x11\x96\x69\x22\xa9\xe2\xca\xb7\x46\x0c\x49\x9a\xf0\x54\x64\x24\xe6\x37\xde\xac\x4d\x12\x5f\xef\xd9\x21\xe2\x18\xa7\x20\x07\xc4\xb9\x83\x44\x4a\xaf\x10\x2c\x8a\x5b\x00\xe5\x2a\xaf\x76\xe6\xe8\x52\x7d\xd5\x9c\xfc\xf0\x2c\xc4\xf0\x21\x8a\xab\xc7\xd6\xb8\x2f\x4f\x7d\x0a\x17\x6f\x8f\x4c\xd6\xb6\xed\xd0\xf6\x74\xf5\xcb\xb8\x5a\x02\x86\xa9\x0d\xd4\x11\xee\x64\xaa\x4b\x27\x31\xb2\x9e\xf6\x8a\xa2\xaa\x51\xa0\x0c\x93\x70\xa4\xb1\x13\x1a\x2d\xf5\x97\x67\x01\xc1\x39\xf2\x23\x95\x1b\x93\x63\x7c\x16\xe9\xf3\xd1\xf3\xf3\x9b\xa3\xe7\xc7\x1d\x71\x25\x4c\x9b\xa6\x6e\x3c\xa8\x48\x98\xc6\x36\x9c\x38\x48\x5a\x8f\x51\x2d\x3b\x29\xad\x45\x97\xfd\x0e\x39\xb3\xe1\xd4\x09\xe2\xa9\x33\x4c\x53\xd5\x30\x8c\xe5\x84\x5b\x65\xe7\xfc\xb2\x7f\x40\x9f\x25\x7f\x68\x8d\x46\x57\x33\x4b\xd8\x65\x8d\xf2\xb8\x46\xde\x3f\xf4\x29\x16\xcc\x02\xac\xd6\x7c\xc3\x86\xb1\x23\xde\xcf\xcf\x7c\x10\x1f\x92\x64\x1f\xb9\x85\x3e\x7e\xfe\x33\xf0\xf1\x26\xfb\x78\x73\x07\x6e\x3e\xde\x80\x9b\xbb\x9b\x5d\xed\xb3\xc6\x9f\xed\xe9\x04\xf4\x39\x98\x53\xee\x0f\xe6\x1f\x94\xcf\xea\x4b\x3c\x72\xb9\x56\x96\xc2\x75\xde\xae\x24\x39\x64\x79\xd4\x12\xaa\x62\x1e\xf7\x2f\x5f\xa2\x86\x57\xd2\x10\x1f\x5f\xe7\x73\xaf\xb9\xb1\xdf\xe4\x37\x9f\x73\xb0\x5f\x32\x99\x79\x61\x6a\x52\xb1\xba\xae\xf2\xb9\x0e\x35\x07\x0e\x05\x85\x0d\x94\x46\x81\x89\x61\x5b\xd3\xde\xd5\x5c\xa1\xdc\xe5\x7c\xee\x54\xda\x4a\x62\x88\x58\x2b\x53\x4a\xcd\x0f\xd5\x8a\x1e\x93\xc2\x17\x26\x2d\x57\x77\x36\x13\x58\x4c\xd5\x79\xec\x43\x6e\x5b\xdc\xd9\x22\x24\x10\xe2\x1e\x9d\x24\x66\x29\x9c\x1e\x93\x1a\x24\x63\x09\xc3\x38\xd3\x31\xd9\x65\xe2\xca\xc5\xb3\x7f\x9e\xcb\x2b\x4c\xff\x77\x21\xfd\x5f\x9e\xdb\xed\xd2\xfd\x97\xaf\x9f\x36\x81\xd3\xed\x34\x3a\x30\x76\x89\x87\x09\x40\xa0\x17\xc4\x16\x70\x66\x9a\x12\xc8\x59\xed\xda\xaa\x6f\x8c\x85\x93\xb6\xbc\x33\x92\x52\x7b\x0a\xfd\x32\xe0\x90\x58\xd1\x98\x26\x9d\x24\xf6\xb5\x3c\x28\xa9\x99\xa9\x57\xd3\x8e\x98\xd4\x70\x5d\x24\x2b\x3d\x24\x60\x2a\x0b\xad\x3c\x2c\x4c\x03\xf2\x6a\xf2\x79\xc9\x78\x1d\xa6\xa9\xac\x4c\x10\x28\x2c\x1d\xeb\xe6\xe1\x54\x2f\x7d\xb2\x4b\xab\x38\x1f\x98\xc0\xe4\x97\x58\xb7\x7c\xee\x8a\x8d\x4a\x8d\x9f\xaf\xf0\xc6\x9f\xaf\x7d\x91\x9f\x6f\xbf\xfe\x6b\x70\x78\xff\xd4\x3e\x7a\x09\xd6\xf3\xec\xd4\xb6\xab\x84\x28\x83\x7e\xf5\x5e\x19\x01\x12\xd3\x2f\x65\x11\x49\x95\xc2\x04\xfa\x1c\xd8\xc0\x8b\x02\xf4\xeb\x9c\xf2\xd5\x1f\x60\xf0\x3e\x34\x9c\xad\x35\xa5\x60\x69\xa5\x3a\x03\xec\x88\xf2\x83\xe0\x43\x70\x92\xf6\x0f\x05\x20\x49\x92\xa5\xe5\xb5\xff\x69\x43\x58\xbc\x51\xbe\x8f\xda\x7c\x37\x1f\x6f\xae\xc2\x91\x5b\xe4\x19\x59\xb0\x52\x9f\xe6\x5b\x74\xdc\x07\xd5\x01\xa1\xc2\xdc\xfb\x31\xb4\x12\xa8\x36\x78\x30\xac\xcb\x0c\xaa\x30\x81\x01\xc0\x7d\xd7\xf7\xae\x5f\xfb\xc7\xe4\x64\x66\x90\xaf\x4d\xaa\x43\xd7\xeb\x11\x94\x29\xee\x57\xb7\xc1\x2f\x93\x34\x4d\x2e\x6b\xb4\x6b\x93\x7d\xf4\xa2\xaf\x7d\x79\x4f\x7d\x1a\x9b\x4a\xe0\xd6\x3b\x34\x1a\x29\x85\x5e\x93\xb4\xc8\x9b\x3c\xa5\xeb\xc9\x81\x86\x05\xd9\xcb\x75\xa0\x69\x85\x43\xbe\x6b\xa9\x54\x92\x86\xc5\x8f\xa3\xf7\xa1\x6c\x9b\xcb\x31\x4e\x2e\x1f\xbf\xe5\xb2\x53\x19\xfb\x71\x64\x64\x8b\x78\x9a\xef\xdd\x97\x17\xa0\xe3\x35\xfc\xf9\x96\xcf\xfe\x6a\x6a\xbf\x7e\xbc\xb6\xf9\x7e\xbe\x4d\x27\x40\x3d\x60\xa1\xe9\x46\x6f\x8d\x07\x34\x40\x57\x82\xc9\x0d\x97\x50\x5a\x48\xce\x4b\xca\xf9\xea\x52\xe1\x74\xe0\xfd\xc0\xa4\x70\x80\x29\xb2\x5a\xd0\x85\x76\xdf\xf6\xbd\x1d\x86\x89\xb4\x8d\xb5\xb9\x33\x0a\xd9\x65\x53\xa5\x9c\xac\xe1\xcc\x2a\x53\x13\xc3\xb0\x1d\xa2\xee\x69\xf5\x28\x62\x3e\x6d\x7f\xd5\x76\x4a\xde\xbc\xc5\x5f\xa3\x4f\x71\xfb\xcd\x6b\xbc\xcf\x2f\x96\x4c\x4f\x4d\x2d\x9b\x12\xfa\x5c\x86\x65\xd4\x59\xae\x89\xa5\xe2\xc1\x5a\x68\x9c\x49\x6d\x74\xb2\xca\x90\xc3\xb2\x44\x2d\x3a\x4b\xc2\xd2\x7c\x7c\x4c\x30\xc8\x07\x08\xc3\x38\xb1\x21\xfa\x17\x2e\x25\x47\x74\x40\x5b\xad\xe8\x8d\x6d\x79\x53\x2b\x4a\x97\x5d\xad\x1a\x22\x4b\x49\x49\x5d\x84\x89\xac\x27\x0e\x2e\x06\xa4\x36\x50\x6b\x75\x40\x6b\xfd\x98\x40\x5b\xf9\x34\x5f\xfd\x59\x47\xc3\xd0\x7a\xe2\xb6\x7a\x54\x8a\x0f\xcb\xa1\xbe\xe6\xf5\xdf\x7e\x46\x64\x4c\x7a\x77\xbb\x45\xab\x20\xd9\x2f\xd2\x71\x03\xad\x40\xa8\x58\xe7\x3a\xe8\xa0\x29\x60\x80\x55\xab\x06\xd0\xe8\x4e\x74\x87\x7a\x45\x61\x29\x1d\x74\x29\x0c\x3a\x48\xe6\x08\x60\x00\x19\xd6\x4b\xbd\xf1\xaf\x27\x33\x98\x8f\x45\xe6\x2e\xb6\xf8\xdd\xdd\xfb\xab\xde\xf0\x8b\xc6\xe1\xe5\xfb\xec\x52\x74\xd9\x62\xda\x02\xe5\xd7\x53\x8a\xdd\x3f\x8c\xa9\x67\x72\xe0\x4a\x89\x51\xb2\x88\x55\xed\x1e\xeb\xa3\x04\xfd\xd5\x0b\xfd\xab\x67\xe5\xbe\x8f\x5b\x18\xb0\xff\x04\x7f\x79\x51\xef\xcb\x7e\xf7\xe9\xeb\xed\xfb\x2f\x80\xa6\xd2\xa6\xb2\x94\x8c\xd7\x68\xd5\x0f\x2d\x04\x16\xa8\xd5\xea\x48\xc5\xa4\xc1\x09\x16\x25\x0c\xf8\x04\x2c\x42\xa1\xc5\x4c\xd6\x55\x5d\x9a\x82\xab\x8b\xaf\x79\xca\x0b\xc8\xf2\x27\xbd\xf8\xa3\x03\x11\xab\xf1\xf5\x3a\xee\xcb\x41\xf8\xcb\xfb\x8f\x9b\xa0\xc1\xad\xcb\x4a\x9b\xa1\xd5\x2f\xc0\x8a\x80\xc2\x6c\xc3\x7c\x31\xe7\x18\xd4\x6b\x37\x08\xa1\x30\x56\x42\x9d\x17\xcb\x54\xc5\x92\x2c\x31\x19\x3d\xca\x67\x2e\x86\x6f\x34\x79\x5e\x6a\xa6\x37\x1b\xb5\x4f\x9c\x91\xcd\x4a\x9f\x55\x0f\x53\x6a\x56\x95\x55\xee\x57\xe2\x32\xb8\xca\xd4\x3e\x9c\x00\xbc\xbc\x08\xa9\x03\xe7\x03\xc6\x98\xe3\xc7\x04\x87\xb3\xf7\xa0\xc0\x20\xc1\x27\x42\xc8\xb5\x4e\x74\x79\x1f\x81\x7d\x5d\x27\x8a\x73\xb8\xd2\xd5\xfc\x72\xeb\xb3\xc2\xa7\xcb\xda\x2e\xa0\xa3\xa1\x0a\xa3\x0f\x53\x40\x1c\x48\x50\xaf\x1e\x24\xd6\x2a\x51\x3b\xd1\x86\x19\x94\x0d\x57\xb5\xbe\xec\xa5\x0e\xb0\x83\xc9\xaa\x2b\x76\x28\x82\x27\x22\x4d\x5d\x8c\x0b\x22\x06\xb8\x6e\x34\x03\x45\x1f\xce\xfb\xe2\xa1\x81\x55\x66\xee\x07\x9b\x95\x0f\x27\xb0\x08\x28\xa9\x15\xa2\x82\x61\x16\x34\xc9\x12\x9b\xba\xc8\x0d\xf8\xa4\x0e\xfb\x76\x19\x3e\xbf\x5e\xa2\xcf\x57\xca\xa3\xa3\xf4\xbf\x72\x1f\x6b\x62\x91\x4c\xd5\x3f\xe1\xf5\x2f\x8f\x77\x95\x97\xef\xd9\x14\xfa\x71\x04\x98\x02\xc4\x22\x9b\x54\x18\x69\xc7\x39\xdf\x34\x65\x86\x68\x97\x69\x64\x0d\x8c\x7c\x9d\x1b\xfe\x66\xcb\xd3\xfe\x19\xf8\xf9\x88\x69\x77\x02\xad\xb3\x26\xa7\x54\x53\x02\xaa\x03\x35\xac\x0a\xa3\xbd\x1f\x76\x75\x48\x02\xf3\xc2\x80\x26\x85\x60\x40\x1b\x76\xac\x3e\xca\x74\xf8\xe7\xed\xd1\x3a\xd5\x3e\xd5\xd6\x1b\x89\xf0\xb6\x47\x1d\xd0\xab\xf6\x31\x2c\xd2\x60\xae\x61\x55\x07\x31\xa5\x82\xf3\x50\x0b\xa3\x70\xcd\x4a\x5f\x36\xa6\xeb\xba\x40\x60\x89\x7d\x11\xdf\x6b\x9e\xce\x47\x15\xf9\x6d\xff\xcd\xab\x1d\xf5\x4a\xb1\x3e\xaa\xd2\x45\x21\x91\x8d\x94\xf5\xf8\xe9\xf7\xe0\xef\xc1\xcf\x0e\x10\x77\xb1\xae\xbd\xe5\x4a\x39\xd5\xf0\x41\x87\xf3\x81\xd3\x70\x0a\x26\xed\x47\x17\x7c\xee\x14\xc5\xa0\xdb\xf7\x6d\x6b\xa1\xe0\x86\x93\xa0\x40\x33\x68\x6d\x67\x80\x0c\x82\xc6\xc6\x46\x8d\xb3\xe6\xa4\x3f\x4f\x65\x02\xd2\x31\xe2\xc0\x74\xf2\xef\x93\x04\xdc\xbd\x92\xf3\x8f\x58\xc8\xab\xf9\xff\xa6\x02\x7f\xf3\xf1\x89\x21\xf5\x8a\xee\xb8\xcd\xf8\x82\x6a\xcd\xb0\xc2\xa8\xad\x6b\x90\x04\x95\x03\x19\x74\x5e\x80\x3e\x9c\x4b\x4c\x50\xee\x20\x77\x8e\x23\x19\xb8\x02\x4a\x84\x16\xc8\xb2\x08\x0e\xa8\x3c\xd0\xbd\x94\x8c\x68\xab\x4d\x7d\x89\x70\xb8\x91\xcc\xae\x4b\x55\x60\x8b\x47\x46\x44\x5a\x05\x1c\x7a\x0d\x20\xe0\x96\x49\xc3\x45\x02\x52\xfd\x58\x47\x7f\xb7\x7e\x56\xa8\xfc\xe7\x8e\xf9\xeb\x6d\x96\x80\x1c\xd5\x86\xd6\x67\x5c\xb5\x08\x81\x64\x3d\xe7\xa0\x0f\x28\x2f\x52\x1a\x18\x12\xac\x2e\x5c\xa9\x9a\x41\x56\x22\x48\x0d\xb8\x0c\x0d\x50\x65\x1e\x3a\xc0\x8a\x40\xf7\x4a\x50\x2c\x8d\x32\x48\x72\xcb\xb9\x15\xdc\xae\x0b\x2c\x49\x83\x4f\x3c\x8e\xb9\xbe\x8c\xb9\x04\xd2\x72\x61\xfb\x8b\xbf\x4b\x1f\xc9\x51\x1c\xd8\x35\xdf\xf8\x4b\xac\xbd\xbd\xaa\x9d\x5f\xe5\x07\x3f\xfc\x56\xf4\x64\xff\xdc\x1d\x73\x73\xbb\xc7\xac\xb6\x35\x4d\x4b\x47\xa4\x91\x6b\xad\xa9\xa5\x32\xf5\x16\x73\xc9\x14\x61\x5c\x69\x23\xe5\xc5\x1f\xc0\x20\x71\x6e\x65\xce\xa5\xcd\x81\x75\x13\x9e\x3b\x88\xc2\x69\xa0\xc3\xd8\x9f\xf1\xd2\x07\x58\x8d\xbd\xf7\xca\x99\xc6\x70\x3f\x34\x9e\x6a\xe3\xd8\x03\xa6\x3c\x9b\xd6\x22\xf2\x88\x0f\x91\xff\xf3\xbf\x70\xbc\xbb\xb3\x20\x0e\x8b\x54\x39\x6a\x8c\x7e\x18\x8c\x70\xcc\x66\xb9\x23\x52\x09\xc5\x2e\xc1\x97\xd7\xda\x29\xad\x18\x80\xde\x3f\xcc\xde\x67\xf0\xc0\xda\x89\xcc\x6d\x55\x87\x53\xcf\xfa\xb1\x3f\x91\x73\x1f\x2a\x34\xf4\xce\x6b\x67\x5b\xc3\x7d\xdf\x3a\x66\x8c\xa3\x0f\x98\xb0\x6c\x5a\xa3\x8e\x43\x72\x59\x5f\xb9\xcb\xb7\x48\xe2\xca\x66\xf8\xda\x97\xbc\xbd\x38\x8e\xee\x30\xdd\x8f\x54\xed\x78\xf3\x50\x35\xca\x32\x60\xdb\x90\x83\x3e\x9b\x1e\xaa\x5d\x6e\x9d\x7e\x38\x29\x95\x4a\x86\x5d\x03\xca\x87\x11\x98\x64\x97\x5c\xe2\x14\x1d\xfd\xb0\xdb\xa8\x43\xfb\xe2\x67\x24\xe0\x43\x02\xde\xe6\x35\x23\x3b\xf3\x57\xf0\x21\xcd\x3e\xfd\xf0\x4b\x74\x3c\xb2\xce\x31\xcb\xac\xf7\x80\x01\xe8\x42\x13\x08\xed\x41\xc5\x8b\xa6\xb8\xbc\x9a\x61\xb6\xc3\x89\x00\x38\x85\xd9\x55\xd6\xd9\xbd\x50\xcc\x51\xb5\x6b\x5d\xcb\x5a\xdf\x5d\x8c\x79\x9a\x90\xd5\x86\x73\x05\x21\xed\xeb\x05\xd7\x94\x4a\x66\x94\x49\x45\x15\x86\xb0\x50\x50\x34\xa7\x70\xc2\x00\xce\x51\x83\x93\x1f\xed\xae\x8f\x3d\xbd\x1f\xf6\x4f\xbc\xf7\xf0\xf7\xe0\xda\x3b\x11\xd3\xae\x9f\xb7\x6b\xcb\xca\x1e\xba\xe2\xe1\x9c\xb9\xe2\x81\xf1\x8b\x81\xa8\x73\x5f\x0c\x97\xf7\xad\x59\x75\x99\xba\x75\x28\x53\x1a\x8a\x3a\x9d\x52\x41\x42\x17\x6c\x86\x9d\xe8\x94\xd3\x2d\x84\x25\xb3\xe8\xac\x28\x9d\x98\x63\x1d\x71\x74\xc6\x0e\x6b\x43\xd0\xe9\x1a\xff\xb2\xdd\x94\xfc\x69\x72\x7b\x79\x16\x4f\xef\x66\x12\xdf\xc0\xfd\x87\xf4\xf8\xf3\x2f\x97\xbd\xf2\x6e\x33\xb4\x89\x4f\x6b\x8c\x1a\x84\xb2\xe1\x7e\x79\x4c\x82\x37\x80\x8e\xa1\xcc\xa4\x9b\x47\x40\x81\x65\xdc\x9e\x9d\x43\xf5\xba\x84\x04\x03\x9e\xf5\xda\x55\x5a\xba\x90\x3c\x26\x0a\x24\xc0\x70\x1c\xe8\x50\x0a\x29\xd8\x12\x26\xc6\x99\x29\x7c\xec\x7b\x3a\x24\x53\xb4\xf1\xed\xdb\xda\xdb\xb7\xd5\xa1\x6b\x76\x2e\x76\xd6\x02\xbe\x67\xbf\x36\x7e\x07\xef\xe7\xa7\x0b\x14\x75\x58\xc2\x80\x40\x9d\x9e\x41\x0d\xea\x3a\x8c\x61\x4c\xdb\x55\x83\x81\x3e\x26\x97\xaf\x41\xd2\xca\xc0\x1a\xd6\x1a\x57\x5b\xcf\xff\x9c\x76\x31\x1f\x7c\x89\x6d\xfe\xd3\xf7\xd8\x21\x8e\x6f\xa0\x1c\x7f\x0f\x8e\xef\x8b\xa8\xd5\x7c\x7b\xfc\xfc\xf1\x3d\xf8\xf8\x63\x24\x86\xbc\x7d\xff\xe3\x0b\x83\xc4\xe7\x3d\xd7\x80\x86\x16\x18\x88\x68\x59\x84\xd3\x94\xcf\x04\x9b\x3a\xe7\x05\x1d\x3a\x6a\x8c\x50\x20\xcf\x0d\x30\x4d\x4b\x39\x02\xae\x2a\x0b\x99\xd7\x5c\xa2\x83\x44\x14\x31\x8c\x31\x84\xa4\x60\x79\x5e\x16\x65\x55\x32\x84\x6a\x98\x97\x61\x39\x5d\x0e\xcd\xd2\x13\x1a\x6c\x57\xf1\x92\xa9\x16\x95\x04\x0a\x82\x68\xe4\x5b\x4b\xbb\x1d\x3c\xc8\xa8\x76\xfd\x1f\xbf\x3b\x8f\x1f\xdf\xce\xe2\xc7\x97\x59\xbc\x3b\x5c\x27\xb1\xd5\xf0\x3f\x83\x45\x45\xdd\x35\xbd\x8d\x7f\x19\xf2\xd1\xd8\xaa\xe0\x25\x1e\x3b\xea\xb4\x10\x00\xe6\x6e\xca\x1b\xc2\x10\x70\x10\x92\x5a\xd0\x83\xac\x68\xcd\x08\xc6\xb0\xc2\x05\xcb\xab\x1c\x96\xa4\x42\x75\x59\x14\xe7\x13\x6d\x66\x50\x5c\xc6\xed\x47\xc8\x4b\xae\x07\x88\x38\x21\x51\xcc\x24\x4b\x8b\x47\x7a\xe4\xe9\x12\xb9\x6b\xe1\x4b\x4c\xf3\x96\x8b\xfa\x35\x84\xc7\x83\x53\x73\xf1\xcc\x28\xa7\x14\x32\x0a\x43\x99\xa9\xc6\x4b\xdb\xaf\xbd\x71\xa3\x9c\x53\x61\xad\x0d\x44\xb1\xc2\x97\x1c\x58\x62\x07\xd9\x75\x94\x2d\x46\xf9\x4b\x2c\x50\xa5\x53\x3c\x43\x3f\x6c\xc8\xb7\x57\x99\xff\xdd\x73\xfa\xe5\xe7\x6b\xe6\x3f\x9b\x7c\x59\xa5\x46\x77\x1d\x60\x24\xd8\x25\x9c\x43\xc3\x00\x99\x0d\xa7\x5c\x80\x5c\xca\xa6\x95\xeb\xa9\x38\xe8\x0a\x63\x3d\x69\x56\x3b\xa2\x0d\x36\xb5\x60\x9c\x61\x39\x20\x25\xa4\xbb\x9c\xdb\xee\x5a\x23\xad\x5e\xcd\xef\xe9\xfa\xe9\xee\xf6\xf8\x11\xfe\xfc\xe9\x89\x97\xfe\xa7\x0f\xdb\x66\xcf\x04\xb0\x1e\x5c\x5c\x80\x53\x48\x40\x17\x88\xb4\xa0\xac\xe7\xe0\xc3\xc2\x88\x50\x53\xe5\x0a\x24\x4c\xa8\xc0\x39\xc8\xbd\x9b\x67\x17\x66\x17\x16\x17\x74\xe1\x55\xd3\x39\x05\x28\x68\x60\xef\x07\x94\xe5\x2e\xbe\x62\x49\x16\x75\x20\xea\x74\xbe\x62\xf0\x7f\xcb\x7f\xf9\xf4\xaa\x1d\x6b\x2e\x10\xa9\x44\x5d\x6f\x1d\x51\x51\x74\x4f\xa7\xf3\x5a\xf1\xd8\xe7\xca\xc2\x90\xb9\xc7\x44\x07\x17\xb9\xe3\x76\x30\xcb\x23\x4e\xfa\xc3\x4b\x4e\xeb\xed\x59\xb3\xa5\xb4\xfe\x12\x7c\xf9\x7a\x7b\xdc\x97\xb6\x80\x60\xe2\xce\x8c\x64\x6e\xdc\xc0\x7b\x43\x6a\x58\xa9\x96\x55\x15\x97\x34\xf8\xfc\xa0\x11\xc1\xb6\xd1\x14\x99\x5a\xc9\x5a\xd5\x8c\x90\x1a\xb1\x99\xd5\x88\x32\x9d\x6f\xba\x44\x63\xac\xb1\xe9\xa7\x9c\x56\xfa\x84\x2a\xfd\x7a\x77\xf3\x31\xab\x2c\xe6\x16\xd5\xf4\xdc\x19\x73\xd0\xe8\x31\x59\x7e\x3d\x67\x13\xa7\x16\x34\xfa\x9e\xc6\x3a\x50\x19\xf3\x1a\xdb\x3e\xf8\x39\xf9\x37\x09\x7a\xce\xbd\xff\x05\xf8\xf0\xb6\x0e\x74\x19\xf6\x5f\xbd\xff\xe9\xa9\xe4\xb8\x7d\xbf\xc4\x74\x3b\xea\xea\x94\xa9\x46\x34\x0d\x09\xf3\x34\x84\x01\x9d\x3b\x2e\x11\x32\x23\x10\x8e\x85\x32\xd7\xa0\xe0\x8f\x49\x50\x0c\x78\x60\x78\x68\x43\xc1\x53\x08\x3a\x1e\xec\xca\x58\x3a\x1c\x34\xd2\xb6\x57\x35\x82\x16\x2b\x49\x6d\xcd\x6a\x83\x6b\x31\x86\x51\xe8\xdc\x06\x2b\x3d\xb3\x4c\xc9\x59\x5a\x5d\xcb\xd0\x73\x23\xe3\x79\x2f\x1e\xdd\xb1\x39\x88\xa8\x61\xfe\xaf\xae\x1c\x68\x57\xd0\x62\x44\x30\x66\xb7\xef\x6f\xb3\xdb\x1f\xde\x7d\x48\x2f\xbf\x81\x48\x11\x79\x8c\xdf\x77\x97\x1d\x0d\x20\xa0\x2c\x0c\x61\x38\x87\x81\x82\xb6\xcd\xd0\xc3\x38\xa7\x7d\xcb\x5b\x6d\x80\xb8\x87\x69\xc5\xa0\x87\xb4\x17\x95\xaf\xf8\x41\x20\x84\xc2\xd9\x39\x07\xea\x30\x75\x16\x94\xa1\xb9\x44\x47\x1c\xb0\x3a\x98\xb0\xb8\xac\x3e\x9d\x10\x48\xe6\xe2\x7c\x46\x20\x3f\x6d\x5a\x88\x17\xff\x1f\xc7\x7a\xc6\x5b\x32\xac\x27\x95\xdb\x0f\xc7\x9f\xb3\xdb\x58\xc7\xde\x7f\x8a\xb0\xea\x23\x7e\xd0\x97\x71\xc4\x6b\x5a\x9b\x9a\x5b\xae\x95\xb3\x13\x0b\x45\xf7\x98\x2c\x7d\x79\x0a\x3d\x69\xc7\x03\xf6\xc6\x5a\x6b\x9c\x57\x42\x09\xcb\x0c\x6d\xc6\xb4\x5e\x3b\x84\x1d\xc1\x24\x6d\x5d\xb6\x61\x45\x92\x31\xa3\x87\x73\xd4\x56\x79\x17\xb1\xdc\x4f\xde\x4f\x4c\xe6\x7e\xfb\x5b\x5a\x36\xda\x1a\xe1\x55\xd7\xef\xda\x46\xbb\x46\x79\x3b\x0e\xc1\x78\xed\x9c\x6a\xf4\x38\x1e\x74\x3d\x7a\xeb\xd9\xd8\x0e\xa7\xba\x33\x4d\xc7\x4e\x43\xdb\xd7\xbd\xb3\x0d\x9b\xda\x3e\xc9\x32\x1e\xb5\x03\xf4\x5b\x3d\xce\x48\x22\x74\x13\xb5\x17\x07\xef\x57\xee\x66\x3d\x00\xea\xdc\x41\x2f\xc3\xb1\xbe\x9f\x43\x11\x46\x01\x4a\xe0\xb3\xee\x1f\x86\x27\x0d\x56\x72\x6c\x0f\x57\x2e\xcb\x6b\xbf\xe9\xfb\x8d\x5e\xfb\xe7\xec\x59\xed\xe0\x36\x3b\x81\xda\xc7\x37\x73\x08\x8c\x01\xa5\x42\xaf\x4d\xf0\x0c\x68\x1a\x3c\x50\x61\xd8\x84\xa9\x5d\x38\x61\x17\x68\x58\xec\x02\x4c\xd0\x8f\x89\x05\x10\x38\x17\xf5\x22\xc1\x8e\x5c\xeb\xea\x45\x92\x80\x1f\xde\x1d\x2f\x16\x30\x6e\x9a\x2f\x5f\xd3\x4f\x87\x4e\x73\x5f\x85\x73\xe8\xd0\xd4\x35\xed\x70\xea\x6b\x9a\x95\x81\x87\x92\x8c\xb4\x76\x29\xde\x25\xf8\xa1\x5a\x17\x54\x83\x6a\xb9\xe2\x4e\x74\x5c\xef\x9b\x2b\x7e\xfe\xf6\x35\x7a\xed\x29\xee\x7c\x77\x45\xd0\x5f\xd7\xe7\x63\xaa\x11\x04\xed\xfd\x09\xf4\x25\x4a\x6b\xb7\xce\xce\x0d\x03\x60\xc3\x3a\xc7\x1f\xc3\x41\x6b\xef\x9c\x96\xeb\xe9\xbe\xd0\x7a\x77\x0e\x45\x04\x3c\xb0\x87\x7e\xfb\x19\xd7\x6c\x89\xb5\x1c\x1d\x7b\xae\x36\x38\xd2\x8b\x5a\xd1\x8f\xe9\xf1\x87\x0f\xc7\xdf\x1d\x72\x17\x46\x02\x46\xbd\x48\x29\x07\x66\x21\x04\x8a\x21\x7e\x52\x3d\xe8\x83\x0f\x67\x0b\xfa\x0c\x86\xc1\x08\x50\xa6\x09\x74\xda\x94\x41\xdb\x80\x4e\xf6\xfc\x8c\xa9\xf9\xe7\xcf\x8d\x57\x25\x90\x0f\x0c\xb8\xb2\x4a\x73\x17\x2a\xef\xbd\x07\xa8\xb9\xfc\x02\x50\xd3\xfc\x13\xe6\xb6\x4b\xea\xc8\xaf\xa5\x92\xff\x33\xf9\xbf\x93\xff\x27\xf9\x7f\xff\xb0\x62\xd2\xd7\xab\x64\xd2\xa7\x17\x0a\xab\x1f\x8f\x5f\xbe\x7e\x38\xde\x3d\x91\xd2\x3d\x91\x51\x3e\x93\xd2\x5d\xd5\xa9\xde\x5d\x59\x29\xc1\xdd\xe7\x8f\x69\xe9\x22\x4d\x79\x52\x63\x81\xca\xa0\x40\x59\x84\xa9\x94\x1e\xc1\x42\x95\x2c\x2c\x6d\x8e\x2a\x53\xb8\x2e\x57\xb5\x81\x0e\xf1\x1a\x81\x32\x9c\x2e\x7f\x40\xb1\x5a\x03\x21\x2a\x85\x36\x80\x2d\xb1\x27\xea\xa0\xa8\x62\x52\x44\x95\x71\xa8\x20\x82\x79\x9e\x53\x24\xea\xbc\xc6\x75\xa1\x0a\xb1\xf6\x42\xb4\x5d\x2c\x0c\x63\x25\x2f\x7f\x14\x4d\x2b\x54\x91\xc7\xe4\x31\xa1\x40\x80\x2e\x35\x0f\x4a\xca\xf9\xf2\xb5\xe1\x6d\xdb\x47\x7a\xd4\x91\xb7\xa6\xdc\xba\x79\xdf\x5d\x16\xff\x36\x7b\xdb\x8a\xb6\x5b\x52\xb6\x36\xa2\x4d\xc7\xa0\x08\x68\x99\x12\xb2\x32\x02\xe5\x45\xa8\x0f\x28\xf2\x41\x85\x76\xed\xc6\xd2\x96\x58\x02\x92\x24\xbb\x5d\x1e\xdf\x3b\x93\xec\x23\x72\xea\xff\x7a\xd1\x25\xde\x3f\x15\x84\xfe\x02\xdc\xfd\xed\xd7\x0f\x87\x8f\x7f\xf5\xa4\xae\xf6\xbb\x4f\xc7\x4f\x5f\x7f\xf7\xe9\xee\xa7\x2b\xb1\xc9\xcb\xbf\xfd\xe9\xe9\x5f\x5e\xcf\xbf\x27\x0e\xb7\x03\xc3\x95\xae\x6a\xe0\x8a\x00\x51\x25\x29\x63\x82\x96\xa8\xcc\x73\x5b\x1a\xd5\x8a\xca\x0a\x3a\x35\xa4\x9a\xcb\x01\x16\x3e\x87\x0d\x41\xba\x22\x60\x28\x42\x0d\xb1\xe6\x5c\x1a\x51\x17\x85\x81\x46\x7a\x77\xa2\x53\x83\xeb\xb0\x94\x27\x58\xba\x12\x1e\x4c\x8d\x29\xc6\xca\xd4\xbc\x26\x84\x33\x4c\xca\x42\xa3\xb9\xc5\x45\x5d\x19\x42\x85\x28\x4d\x29\x95\xe2\x6b\x5b\x13\x4a\xb0\xb2\x84\x4a\x2e\x85\x16\x5a\x56\xa7\x51\x70\xcd\x84\x32\xc8\x56\x42\x20\x2d\x92\x88\xfb\xdc\xf8\x00\x7f\x4a\xfe\x3a\xf9\x9f\x7f\xb3\xeb\x9e\xd8\xd1\xc0\x6f\xdd\xe3\x4f\x5f\x3f\xdf\xbd\x7f\xf7\x31\x8d\x3e\xe5\xcd\xed\xcd\x1b\xc7\xb8\xb6\x51\x4c\xa1\x81\xb5\x28\x8b\xf5\xe4\xb4\x05\x09\xb0\xf9\x82\x98\x80\xb9\x2e\x68\xdb\x32\x5e\x2a\x2d\x7d\xce\x18\x27\x18\xb4\x75\x59\x98\x9c\x48\x85\x0e\x4a\x1a\xa9\x29\xae\xab\x6a\x8d\xb2\x74\x1b\x2d\x9a\x0a\x67\x55\x11\x58\x56\xbc\xba\x1c\x00\xbc\x50\xa5\x51\x6b\x1f\x86\xa9\x52\xa8\x07\x34\x14\x18\xb7\xd5\xa8\x6a\x11\x39\x26\x69\x76\x8e\xb9\x9c\xbf\x4e\x7e\xff\x8f\xcc\x69\xff\xc7\xe6\x14\xdd\x64\x30\x58\x20\x83\xbd\x78\xf9\xa2\x2c\x42\x6e\xb5\xbe\x4c\xa6\x78\x4c\x30\xa1\x55\xae\x0b\xd2\x74\x94\x15\x42\x33\x97\x53\xca\x08\x02\x2d\x45\x94\xf3\x83\xe4\xcf\x33\x89\x7a\x0e\x97\x99\xf8\x38\x13\x84\x21\xac\x44\xe5\x48\x4d\x59\xae\x0a\xab\xd6\x2e\x0c\x23\x92\xb8\x07\x24\x40\x2a\x28\x65\x97\x67\xa3\xae\xfe\xe4\x87\xe4\x6f\x92\xff\xe5\xd5\x3c\x7e\x7c\x9e\xc7\xa6\x95\xf6\xcf\x7c\x38\xc5\x36\x9f\x9e\x29\x58\xae\x83\xd3\x14\x83\x1c\xb0\x62\x44\x4c\x5e\xa6\x43\xfb\x96\xd1\x52\x68\xe5\x73\x2e\x38\xc7\xa0\xc3\x45\x19\x1f\x0e\xde\x1e\x0e\xea\x09\xa5\xd7\x29\x8d\x00\x9f\x2f\x53\xd2\x70\x7b\x38\x96\xc6\x87\x73\x99\x52\x13\xa6\x11\xa9\xba\x07\x75\xa8\x70\xdd\x54\x83\xdc\x30\x1d\x91\xa7\x2c\xf3\x07\xf9\xdc\xe7\x75\xed\x9d\xda\xed\x3f\xc1\x2d\x77\xfe\xe9\x95\xc2\xf9\x93\x0a\xec\x9b\x48\x61\x23\x05\xcd\x10\x0d\x53\xa0\x08\x30\x40\x35\x17\x52\x9e\x30\xb4\x10\x1b\x8a\x0c\x22\x05\x18\x5c\xdb\x12\x4d\x71\x49\x19\x0a\x75\x13\x35\x6e\x0e\xd2\xaa\xd2\x1a\x32\x1b\xe1\xb8\x6e\x50\x63\x0a\xed\xa8\xd3\x01\x7b\x6f\xd7\x49\xb0\xd2\x41\x92\x16\xdc\x38\xe6\x6c\x92\xa4\x59\x12\x71\x3a\x2a\xf9\x9b\x37\x9c\x82\x3f\x7e\xc3\x29\xf8\x5b\x7a\xc7\xf8\x64\xde\x7d\x8c\xb0\xa6\xdf\x83\xdf\x20\x66\xf6\xc9\x95\xa9\x8e\x09\x58\x84\x66\x29\xc2\x82\x09\xaf\x72\x5b\xb0\xae\x67\xaa\xb4\x5d\x6f\x04\x05\x64\xe9\xa5\xa6\x9c\x82\xb9\xc0\x55\x99\x9b\x9c\x58\x43\x2e\x4f\x41\x9b\xca\xd1\xba\xf6\x95\x81\xb2\x2c\x2b\x5d\xb5\x14\x53\x55\xe8\xb2\x5d\xcf\x81\x86\x86\x8e\xa0\x9e\x53\xf1\xc0\xea\xd3\x80\x4c\xe5\xba\x26\x54\xb0\x44\xae\x1c\x44\xcd\x9e\x78\x28\xf4\x6e\x8e\xef\xc8\x7f\xfe\x83\xef\xc8\xfe\xc3\x73\x97\xd8\xab\x6c\xc5\xdd\x7b\x70\xf3\x26\xca\xbc\x7d\x9e\x66\x46\x6d\x74\xed\x0c\x13\x12\xa3\xfb\xc4\x5b\x9b\x92\xd4\x14\xeb\x2c\x46\x60\x78\x6e\x8b\x26\xd4\x61\xb0\x61\x28\x01\xb5\x60\x91\x0a\x17\xa6\x54\x5d\x2b\x02\x76\x13\xed\xd4\x6e\x26\x52\x0a\xcb\x29\x26\x41\x84\x2e\x2c\x0c\xe4\xa0\x06\xe3\x29\xb2\x26\x22\x81\x2c\x23\x35\x2d\x54\x29\x45\x10\x61\x41\x88\x43\x2b\xea\x7a\x2c\xac\x85\xa6\xe4\x42\x24\xd9\x4e\x26\xf3\x51\x1c\xc8\xb3\x4e\xce\xdd\x15\x51\x7b\xb7\x15\xb3\xc1\x93\xda\x8f\xe4\x16\x94\x96\xf3\x75\xe0\x69\x1e\x4e\x97\x13\x6e\x5f\x3c\x51\x80\xda\x07\x9e\xf9\xd0\x47\x1e\x97\xfa\xf2\xfd\x89\x8f\xf9\xa9\xaf\xec\xdf\x25\xff\xeb\x77\xd7\xed\xed\x3b\xf9\xf9\x2d\xdf\x64\x5c\xba\xeb\x82\xa6\x11\x8b\x70\x7d\x49\xdf\xa5\xc5\x46\xb8\xa6\x2b\x2c\x60\xb1\x9e\x5b\xcd\x29\x28\x01\x29\x86\x8a\x11\x92\xeb\x9c\xb7\x2d\xa7\xa5\xb0\x80\xe2\x11\x58\x5a\xfa\x92\xe9\xc0\xc2\x20\xfb\x42\x28\x21\x69\x1e\x0d\x8e\x61\x84\xa0\x6a\x3d\x05\x12\x37\x01\x99\x53\x11\x26\x55\x91\x48\xfc\x89\x2b\x53\x63\xcc\x0a\x55\x7a\x13\x50\x80\x65\x51\x5b\xa4\x6d\x89\x05\x90\x61\x99\xa8\xa4\x3d\x40\x1b\x5f\x0a\x8b\x1a\x78\x2a\x41\xdf\xd9\x1d\xaf\x7c\x91\xcf\x2f\xf2\x8d\xaf\x37\x3e\x78\x63\x71\x6e\x6e\xaf\x73\xdc\x79\x07\xc6\x80\xd2\xba\x22\xba\x2a\x03\x05\xa8\x08\x3d\x56\x73\x09\x6d\x2e\xc3\x38\x49\x5b\x36\x73\x67\x39\x05\x0e\x4c\xa4\x2a\x6d\xce\xa4\xa6\x61\xce\x95\x15\x86\xe5\x07\xa5\x8c\x32\x42\x12\x82\x6d\xa5\x11\x86\x45\x01\x39\xb2\xb4\x26\xbc\xd0\xa5\xdf\x26\xcd\x06\x40\x4e\xa9\x58\x93\x50\x20\xac\x60\x27\x10\x06\xed\x63\x72\xa2\x8a\x44\x68\x4e\x92\xed\x69\x62\x8e\xe6\x39\x8f\x9a\x6c\x3d\xde\xef\x22\xbb\xf3\x5f\x5e\x02\xab\x9f\x0f\xb3\xe6\x1d\xf7\x52\xdb\xc7\x84\x9f\x9c\x6e\xc2\xc8\x41\x75\x60\x64\xf0\xda\x84\x85\x84\xa9\x57\xfd\x48\xc2\x30\xe9\x39\xc9\x80\x8a\x5a\x97\x17\x3b\xfd\xd7\xdf\xb1\x12\x6f\xf7\xc4\x77\xcc\x74\xdc\x10\x2f\xba\x18\xbf\xfb\x7b\xf0\xf1\x9a\xb5\xc9\xe4\x46\x2a\xd5\x5e\xac\xc4\xda\x9f\xb4\xe6\xa0\x04\xb8\xe8\x04\x8f\x07\x4f\xe7\xa9\x2a\x8c\x59\x6a\x0a\xca\xb2\x2a\x6c\x89\x51\xb0\x2d\xc4\x9d\x57\xf6\xa0\x84\x32\x1a\xb5\x94\x90\x75\x0e\xf5\x8b\xad\x5e\x14\x24\x35\xe2\xd0\x91\x9a\xb0\x52\x95\x56\x85\x3a\x38\x87\xcb\x6a\xac\x16\x8c\x10\x99\x67\xbd\x9c\x58\x3b\x81\x3c\xd6\xbc\xb7\x7d\xf0\x1b\xef\xe0\x0f\x88\x78\xfe\xf1\x5d\x70\xb3\x93\x51\x19\x22\x65\x88\x68\x72\xd5\xec\xc4\xe6\x44\x72\x5b\xc8\xd0\xcd\xca\x17\xed\x32\x58\x49\x41\x0b\x16\x82\xa0\xcd\xb9\x34\x2c\x0c\x85\x72\xc2\x88\xe7\x3d\x60\xae\x5b\xa0\x12\x6f\x76\x00\x0e\x2d\x1b\x01\x7e\xda\x01\x44\x5e\x77\x40\x58\x66\xaa\xc8\x08\x50\x92\xa5\x6d\xac\xad\xeb\xe4\xaf\x92\x4f\xc9\xbf\x7d\xc9\x64\xdc\xde\xdc\xbd\x29\xe3\x7f\xbe\xbb\xb9\xbd\xd6\xd3\xc1\xcd\xed\xe1\xf8\xf1\xf2\x30\x77\xd4\x95\x15\x68\x30\x01\x52\x84\x4a\x03\xce\x82\xf2\x3c\x08\x0d\x84\x08\x94\x83\x13\xad\x43\xc7\x95\x9c\xd2\x36\x9c\x0b\xd8\x56\x65\x38\x1d\x34\xa4\x44\x3b\xb9\x9e\x5c\x98\x54\xe3\x80\x0f\xdd\x2c\x3b\x50\xb8\xb4\xd4\x4a\x73\xd9\x3e\xb4\xc0\xcc\x8d\x3f\x05\x75\x89\x73\x92\x47\x76\x34\xa9\x88\x55\xec\x57\xbd\xba\x7f\xfb\xc6\x0a\xef\x78\x03\x18\x28\xca\x30\x85\x86\x9a\x16\x17\xbe\x94\xe1\x14\x16\x15\x7a\x08\x78\x2a\x3a\x84\x1c\x46\x73\x05\xb1\x45\x03\xc7\x7c\x81\xbe\x4a\xb2\x8c\xa5\xee\x58\x1c\x54\x92\xc7\xac\x42\xcc\x85\xdc\xdc\xde\xdc\x7e\xc9\xae\x39\xa1\x5d\xdb\x12\xb0\x3c\x10\x50\x54\x3e\x72\x77\x9b\x55\x1d\x14\x8a\x4a\xbe\x3c\xb0\x2e\xe4\x7d\xb2\x71\x98\xb0\x0c\x1e\xf2\x6b\x1e\xf7\xaa\x9a\x70\x25\x76\xbc\xbd\x89\xec\x02\x57\x2a\xdd\x1f\xb6\xd3\x5c\xa4\xdd\x4a\xaa\x94\xaf\x3e\x72\x63\x81\xd2\x55\xb5\x29\xc3\x29\xb8\x7a\x68\xc8\x80\x4a\x57\xa2\x43\x6e\xdc\xda\x19\x50\xaf\x0b\x3c\xf7\x48\x6b\xee\x50\x0d\x92\xd3\x34\xa1\xf3\xb8\xf1\x4b\x9a\x47\x79\x54\xbb\xf2\xfa\xb9\x7f\xfe\xfa\x53\x3f\xdf\xbe\xfb\xe9\xc3\x73\x66\xfb\x12\xb1\xf5\x07\xfd\x0f\xda\x3d\xab\x1a\x6a\x8e\xc1\xcc\x60\x53\x61\x30\xfc\x43\x01\x46\x84\x77\x97\xdd\x5f\xd8\x31\x68\xa5\x1d\xab\x39\x73\x8e\x92\xab\x1e\x15\xcb\xe6\x7f\xc2\xfc\x7e\xfe\x7a\xad\xbb\xc8\x4c\x3e\x58\xfc\x2c\x18\x04\xac\xaf\x68\x57\x06\x1b\x70\x0d\xf2\x13\x0b\x03\x29\x7d\x49\x0e\xb9\xb5\x6b\x6b\x01\x0a\xc9\x65\x86\x46\x71\x8f\xea\x25\x4e\x70\x88\x78\xf7\x3e\xe6\x54\x44\xf2\x53\xf2\xdf\x25\x75\xf2\x1f\x13\x1c\xdf\xbb\x0f\xaf\x75\x57\x2f\xc6\x2a\x0a\x41\x7d\xf8\xe9\xc3\x0f\xef\x3e\x1e\x7e\xd9\xea\x67\xef\x0f\xc7\xcb\x01\x17\x01\x59\x91\xb9\xfc\xee\xe6\xe3\x87\xbb\xcf\x1f\x6f\x2e\xd7\x97\xaf\x37\x1f\xf7\x8b\x41\x00\x93\x4a\x72\x2b\x05\x63\x52\x18\x86\x50\x25\x2d\x83\x35\x2e\x6d\xfe\xe0\x00\x46\x55\xe8\xc1\xb9\xaa\x3b\x46\x50\x8d\x4d\x7f\x2a\x85\x38\x8f\xe3\x38\x4a\x3e\x1e\x44\x15\x4e\x26\x14\x61\x3c\xf7\xc6\x4f\x43\x2b\x07\x90\x37\x23\x67\xc0\xdb\x53\x0b\x12\x80\x48\x43\x99\x56\x8c\x99\x07\x52\xa8\x32\x5f\x66\x98\xbb\x2c\x76\x67\xcf\xab\xce\x0b\xf0\xc4\xdd\x6d\x0e\x3a\x79\xb7\xe5\xe2\xde\xbd\x64\x8a\x9e\xb3\x88\xe0\x89\xb7\xfb\x59\x40\x2f\xd6\x61\xb7\xe0\x6b\xf2\x56\x12\xcf\xb4\x51\x52\x19\xd7\xf3\xce\x58\x07\x26\xcf\x9d\x1a\xc5\x63\x02\xea\x08\x85\x6a\x8d\x10\x05\x23\x8c\xd2\x03\x66\x5c\x2b\xd8\x18\x2e\xb4\x14\x4e\x48\xa9\x38\xbd\x57\x21\x4f\xab\xb9\x53\x27\x00\x23\x86\xdd\x52\x6b\x9c\xce\xca\x9a\x48\x86\x93\xab\x9e\x85\xd8\xf9\x43\x1d\x59\x1c\xbe\xe1\x30\x7d\x19\xec\x93\x48\x64\x7c\x85\x7e\x3c\x46\xdd\x67\x2f\x65\x55\x57\xec\x12\xdb\x42\x23\x38\x17\xd4\xb1\xb9\x0c\xb3\x07\x63\x1e\x74\xc6\x43\x97\x07\x9d\xa2\x75\xcc\xf8\xc3\xc0\x79\xe1\x0a\x9a\x6a\xaf\xb4\x31\xc2\x0b\xd5\x80\xf2\xc1\x65\x0b\x61\x69\xbd\x0e\x8c\x80\x0a\x54\x4f\x98\x75\xb2\x1b\x0e\x75\x54\xe9\xf9\xb7\x5b\xc5\xe4\x0d\x73\x58\x2c\xa6\xfe\xbc\x35\xd1\x7d\xdd\x18\x72\x3f\x3e\x8b\x8a\x94\x19\x5b\x17\x58\xa7\x9d\x6c\x30\xad\x74\x5d\xd7\xa8\x0d\x46\x00\xd2\xe8\x36\x78\x01\x90\xd7\x8c\xf3\x91\x37\xfe\xa9\x7d\xef\x50\xaf\x05\xa5\xab\x3d\x17\x4d\xe1\x81\x09\x38\x9c\xf5\x02\x58\x68\x07\xdd\x9c\x19\x96\xae\x07\x5d\x13\x90\xbf\xda\x02\xba\xcf\x0f\x2a\x7a\x5b\xd7\xfe\xe6\x37\x0c\xb8\x1b\x0e\xf7\x23\xd8\x74\xd3\xde\x32\x25\x47\xa6\xcf\xf3\x19\xa0\x7b\x0a\xe0\x19\x18\x80\xc2\x98\x72\xb7\x5a\xe7\x52\xb9\xda\xcb\xb5\x37\xe7\xf3\xf9\x6c\xc2\x62\x4c\x14\x33\xcc\xd7\xf9\x41\x2a\x95\xd9\xd0\xf5\xeb\xd2\x6f\x7c\x61\xfc\x71\xda\xcd\x07\xfd\x6d\xae\xf4\x35\xb0\xff\x12\xf1\x7d\xfa\x25\x66\xbe\x5e\xe7\x4a\xd3\xc1\x56\x70\x99\xe4\xb4\x9c\x66\x05\x34\x4f\xd5\x6a\xb2\xa4\x78\xa8\xca\x54\x69\xec\x28\x0f\x33\x2b\x6d\xc9\x2c\x83\xae\x64\x07\x4d\xab\xca\xf6\x6a\xb0\x93\x95\xe7\x30\xd9\xb5\x76\xca\x11\xc0\x01\x45\xc1\x87\x25\x55\xe7\xa5\x02\xf9\xa9\x38\x5d\x7e\xcc\xf1\xd9\x89\x47\xb2\xf3\x71\x7d\xb6\xfc\xf3\x77\xf6\x7c\xf6\x7a\xa7\x7f\xda\x14\x59\xbe\x3c\x11\xdd\x80\x6a\xec\x35\x6f\x84\x6d\x9d\xf4\x6d\xbf\xc8\x53\xd3\x76\x15\xe8\x62\xdd\x60\x69\x84\xf3\xde\x9f\xc5\xd2\x06\x97\xce\x9c\x30\xca\x0e\x98\x0b\xad\x2b\x6f\x85\x54\x4a\x7a\xa9\xa5\x12\x74\xad\x2e\xab\xe7\x50\xd3\xb8\xc6\xac\x53\x2a\x43\xd7\xdb\x16\x08\xe0\x2e\xdb\xbe\x8e\x1c\xdd\xf8\xa8\xb2\xf6\xda\x43\xf2\xaf\x5f\x3a\x1b\x63\x43\xca\x76\xf4\xa7\x6f\xd9\xe9\x8e\xef\x6f\x3f\xef\xdf\xdf\xbe\xe1\x13\x7f\xfd\x3d\x9d\x6c\x5e\x64\xe5\xbd\xd9\x9b\x5f\xd5\x9e\x14\xc2\x95\x75\x89\x4b\x52\x95\xbf\xb6\x80\x97\x53\x36\x3d\x54\xd9\x74\x4f\x15\xe5\x4a\xee\x20\x43\xba\xa6\xeb\x82\x4b\x5b\x62\x70\x26\x97\x1f\x59\x0b\xcb\x32\xf0\x5a\xd4\x61\x36\xb9\xc9\xa9\x48\xe7\xca\x21\x64\xeb\x3a\x94\xc4\x31\xc9\x18\x57\xb5\xe2\x48\xca\x4a\x89\x4a\x5e\xbe\x92\x63\xd2\x65\xed\xd1\x1f\x7c\xf4\xf1\x7e\x4e\xfe\x4d\xe4\xc7\xf9\x3f\x5e\xea\xe5\x71\xb4\x5b\x57\xee\xf7\x4a\x18\x1f\xbe\x7c\x8d\x52\xcf\xdf\x25\x6a\x79\x5d\xa6\x02\x98\xd7\xaa\x66\xe9\x59\x52\xce\x39\xe8\x6d\x51\x82\x59\x55\xc2\x38\xdc\x7b\xd5\x72\x2b\x69\x0d\x21\xf7\x8c\x08\x0e\xc3\xe9\x61\xd2\x40\x33\x0a\x21\xac\x21\x3c\xeb\xb3\x05\x1a\x24\xa8\xe4\x05\x0a\x93\xa8\x6a\x81\x0f\x9e\x50\x42\x09\x26\xbc\x66\xb8\x82\x08\x69\xcb\x11\x34\x15\x25\x48\x41\x54\x63\x58\x0a\xc3\x68\x4d\x04\x48\xc6\xe0\x29\xc9\x55\x8e\x87\x70\x09\xe8\x0d\x38\x3b\xca\x20\x27\x25\xd4\x14\x89\x24\x39\x64\xe6\x91\x1e\xc5\xa1\x4a\x3e\x25\x75\xf2\xfb\xe4\x3f\x25\x24\xf9\xdf\xae\xbb\x6f\x3b\x2e\xae\xfe\xfc\xc7\xd7\x4d\x84\x9b\x87\xff\xf9\xf6\xd3\x6f\x78\x9b\x5f\x81\xb0\x22\x03\xdf\xd7\xbb\xcf\x1f\x77\x23\xa3\x92\xad\x2e\x63\xa6\x05\xb2\x66\xa2\xae\x86\x5a\xa0\xaa\xac\xeb\xb2\x3d\xb3\xde\x87\x0e\x28\x9f\x9e\xd9\xa6\xad\x56\xaf\x97\xf0\x45\x30\x49\x25\x40\x8a\x33\x2e\x97\xcb\x59\xa9\xa6\x69\xef\x20\xaa\x6b\xc9\x14\x53\x5a\x50\x42\x5b\x46\x0a\x5d\xd6\xba\x63\xaa\xd6\x0a\xaf\xd3\xc3\x44\x69\xa1\x73\x9c\xea\x87\x2e\x1b\x1c\x11\x98\x11\x52\x13\xc1\x70\x17\x9c\x34\x49\x92\xfc\x8b\xc4\x3c\xd6\x47\x9b\xe9\x37\x58\x8b\x97\x5d\x7c\x85\x5a\x7c\xdd\xaa\x3f\xbf\x1c\x6f\xbf\x7c\x7d\x56\xd9\x7b\x7f\xfb\xf9\x43\xac\x3b\x7f\x7f\x17\x1f\xfa\x5f\x3b\x82\x18\x90\xbd\xc6\x29\x86\x70\x55\x32\xad\x21\x04\x36\x60\x1b\xea\x78\xdc\x0f\x16\xf4\x01\x3f\x9c\x8c\x10\x5a\xed\x47\x45\x2c\x96\xa1\xe5\xd0\x43\x16\x7a\x5a\xf9\x8a\xa4\x24\x94\xc0\x56\x85\x74\x3d\xc1\xa2\x82\x84\xc0\x2a\x2c\x94\x52\x2a\x18\x63\xac\x67\x86\x48\xca\x18\x67\x82\xd5\x42\x20\x29\x20\x13\xb5\x64\xf1\xbd\x14\x47\x9b\xc9\xe4\x4f\x5f\xa9\xda\x55\xdb\x19\x70\xf3\xa4\x15\x76\xfb\xfe\xb0\x4d\xe9\x3b\x20\x92\x3d\x05\xfc\x57\x4f\x6a\x0e\x58\xab\xcb\x22\x9d\xaa\x87\x13\x4f\x0d\xae\x1e\xe6\x2b\x78\x64\xbe\x6f\x9f\x7e\xfb\x15\x1f\xab\x65\x4a\xab\x90\x03\x85\x4a\xd5\x4f\xa4\x84\x02\x55\x0c\x55\x61\xe6\x9c\x47\x15\xc1\x70\x52\x97\x18\xd1\x3e\x92\xa3\xdb\x55\xc9\x31\x32\xf0\x7d\xd8\xfa\xbe\x40\x14\x08\xdd\x15\x1e\xf7\x5e\xfb\x26\x85\x0c\x10\x1a\xb4\xd8\x55\x55\xc8\x43\xd2\x9b\x01\x0c\x60\x78\x58\x42\x6f\x01\xcb\x68\xc4\x6f\xef\x2e\xf1\x93\xfe\x8e\x66\xde\x42\x50\x5a\xf8\x07\xe5\xc1\xb9\x42\x07\xcd\x78\x90\xcb\x02\x2c\x89\x71\x5c\xac\xa1\xb8\xeb\xb9\xf3\xe7\xdf\xc4\xf9\xdb\x3d\xe2\x99\x13\x71\xd9\xb5\x75\x69\xee\x9c\x73\xeb\xe2\x2c\xa8\xd2\x7c\x5d\x2e\xd7\xbe\x8a\x15\x7c\x1a\x5a\xf7\x6b\xe7\xdc\x9e\x5c\x1e\xe5\xfd\x09\xf4\x31\x47\x92\xda\x74\x79\xce\x53\x3d\x75\x99\x5c\x73\xc0\x87\xfd\xa7\x9f\x41\xd3\x68\x69\x3c\x6b\x8c\xb0\x3e\xe5\xf0\x1c\x66\x0c\xea\x83\xe4\xda\x38\xd1\x30\xa5\x0d\x3b\x39\xcd\xfd\xd6\x2f\x97\x4e\x59\x72\xa4\x07\xb6\x61\xf0\x6e\xbe\xe7\xd7\x1f\x8e\x9f\x7e\xd9\x25\x1e\x28\x00\xcb\xd0\x07\xcb\xdc\x40\x0a\x5f\xaa\x30\x86\x93\x32\x1a\x5e\x82\xd0\x30\xd5\xd8\x11\xd4\x43\x88\x34\xea\x38\xe1\x53\x91\xbb\xc8\xe3\xe2\x92\x32\xab\x9e\xfb\xf7\x93\x97\xb3\xf6\xba\x06\x95\x0b\xde\xb9\x98\x99\xe5\xc1\xef\xe7\x5f\x95\x6c\xf7\xc3\xda\x83\xf6\x21\x07\xdd\xc6\xbd\x56\x3d\xf2\x7d\x7d\x90\xc9\xef\xae\x59\xb9\xd7\x16\xf0\x98\x66\x5f\x7f\xfa\x70\x35\x83\xf1\x1c\xdd\x10\x8d\x77\x37\xef\x5e\x43\xab\x6a\xca\x60\x05\x31\xac\x30\xc4\xac\x82\x9d\x1e\xea\x92\x57\x15\x37\x80\xea\x4e\x51\x26\x78\xc0\xac\xd6\x88\xed\xe8\xfd\xc0\x78\x6e\x73\x62\x4b\x40\x41\x8e\x9a\x16\x9c\xee\x9b\x1d\x5b\x19\xc8\x41\x02\x83\x79\x4c\x50\xf0\xbb\x73\xa4\x6b\x1a\xc9\xa8\xb9\x75\xae\xa1\xad\xdb\x7c\xa2\xe6\x51\xec\x68\xd4\x61\xfe\x23\x63\x7d\xc5\x7c\x76\x77\xf3\x46\x90\x8e\x70\xb6\xa9\x3e\x92\x9a\xc9\x1a\x2d\xee\x5c\x43\x55\x13\x6a\x81\x76\x20\xb1\x98\x1a\xb6\xba\xc8\xa4\xb8\x63\xf7\xe3\xa6\xf2\xed\x20\x20\x20\x41\x4d\x0f\xce\xf7\xed\x8e\xae\xe3\x38\x54\xc1\x2d\x55\x70\xd7\x91\xce\x68\x76\xb4\x35\xb6\xa5\x8d\x4b\x92\x2c\x72\xf0\xf6\x69\xf5\xdb\xe7\xb2\xf9\x40\x87\xde\xdd\xb7\xd6\xee\xe8\xe5\x6e\xf7\x6d\x5a\xad\x90\xd2\x74\x0e\x8b\x09\x17\xc3\x96\xed\x48\x82\x8f\x5d\xe4\x1e\xbd\x62\xc7\x62\x1f\xd5\xcd\x8f\x1f\x7e\xfc\x0d\xf7\xe8\xbb\x8f\x37\x77\x4f\xf7\xdd\x5b\x07\x21\x20\xae\x80\x35\xcc\x6d\x49\x8d\x22\xb8\x7a\x4c\xd8\x04\x95\xc9\xaf\x64\xd5\xdd\x41\x55\xa4\x5e\xcb\x80\xab\x3c\xc7\xa6\xee\x39\x11\x60\x0a\x65\xaf\x1a\x60\xd2\x53\x18\xda\x50\x35\x97\x77\x3d\x4f\xf8\x6e\xe3\xb6\xda\x70\xc4\x31\x57\xb2\xb9\x31\x2f\xcb\xfe\x65\x13\x4c\xfa\xdd\xf6\xe3\x55\x07\xda\xc5\xc3\x99\xd9\x14\x16\x7c\x6a\x71\x05\x39\x61\x52\xca\x8a\x40\x8a\x61\x65\x07\x7c\x6a\x73\xd7\xd1\xb1\x81\xb6\xc1\x94\x56\x48\xa2\x4a\x5d\xde\x77\xd9\x08\x43\x2f\x0e\x97\x60\x64\x08\x6e\x9e\x0b\x57\x1a\xed\xb9\xe6\x23\x42\x96\x6b\xde\x52\x4e\x0d\xac\x08\xae\x31\x66\xb8\x4e\xb2\xac\x8a\xfc\x85\x97\xd8\x7e\xf3\xdc\x9f\xd7\xea\x6d\xe7\xe1\x95\x49\xf0\xe3\xcd\xdd\x4b\xe4\x7b\x6e\xaa\x0a\x4c\xa7\x22\x2f\x45\x5d\x78\xa8\x3a\xcd\x5c\xee\x26\xd6\xaa\xbc\x5b\x90\x49\xf1\xda\x5f\xae\x83\x46\x8c\x3c\xb4\xeb\x84\xf2\x9c\x78\x3c\x09\x2a\x52\x12\x5c\x18\xb4\x15\x20\x07\x30\xa3\x22\xa0\x79\xed\xa7\x68\xa3\xe8\x63\x7d\xec\xf6\xc5\xb3\xcd\xfe\x03\xe3\xd9\x38\xeb\x5f\x8d\x66\x9f\x37\x10\x82\x76\x2e\x8a\x8a\xa3\xc2\x42\xd1\x18\x6a\x50\xe8\x38\x28\xab\x76\xae\xe4\x26\xc2\xb1\x9e\xf7\x05\xc2\x68\x25\x41\x5e\x9e\x9f\xab\x07\x41\x04\x68\x42\xdd\x69\x0b\x64\xda\xd1\xe0\xa2\x38\x08\x88\xf1\x6c\xbf\x2f\x93\xaf\x6f\xd0\x4f\x6f\x9f\xdd\xb5\x31\xe6\x05\x9e\xf4\x24\xb2\x71\x75\xa1\x13\x26\x04\xaa\x30\xe6\x52\x7b\x63\x10\xad\x18\xad\xf1\x1c\x26\x02\xe8\x92\x17\x43\x38\x53\x50\xcc\x25\x6c\x27\xac\x44\x85\x54\x5d\xf1\xaa\x42\x4d\x47\x00\xd9\x97\x0a\x55\x97\x27\x2b\x38\x69\x43\x3f\x4e\x79\x53\x28\xe5\xb9\x61\x7d\x8d\x2c\x37\xd4\x41\x48\x89\x81\x97\x3b\x52\x56\x95\x9c\x61\x64\xc9\x86\xdb\xa2\x47\x93\xfa\xe4\xb8\xe1\xb6\x62\x8f\xfd\x0f\xe0\xee\xe6\xc7\xbb\x9f\xee\xfe\xf6\xeb\x13\xb9\x4c\xe4\xc2\xec\x7d\x1e\xce\xc1\x6b\x40\x17\xd0\x37\x75\xc1\x18\xa3\x65\xde\x42\x4c\xc3\x4c\x3c\x4f\x7d\x11\x86\x60\xac\xd6\xa0\x06\xe5\xda\xd1\x22\xcf\x79\x4f\xc2\x00\x11\x13\x97\x67\x05\x78\x4a\x0e\x26\xd6\x7f\xff\x9b\xa7\xbc\xe0\xdb\xe4\x48\xba\xb4\x15\xc9\xe8\xaf\x13\x80\x64\xc8\xce\x0f\xc5\xe5\x3a\xe8\x8a\xb3\x87\x26\x63\x32\xa0\x61\x9d\x62\x9e\xe2\x72\xaf\xe6\x9f\x7c\x2f\x3a\xbe\xba\x17\xa5\x0f\xe7\xac\x10\x81\xb5\xa1\xd8\x6c\x72\x22\xb2\xfe\xe8\xa2\xa6\xec\x86\x6c\x78\xab\xf2\x13\x4f\xa2\xad\x57\x6e\x07\xab\x32\xcb\xfd\xaf\xc2\x67\x65\x51\xce\x66\x0c\x92\x03\x95\x11\x40\x01\x94\xe1\x14\xba\x83\xc1\x34\xf4\x5d\x0b\x6a\x84\xc2\x42\x7a\xa3\xb5\x12\x56\xb9\xcb\x01\xb5\x03\xc9\x23\x39\x9c\x76\x2a\x8e\xf8\x53\xc4\x00\x7d\x78\xe9\xd8\xbc\xfd\x72\x39\x4b\xf7\x9b\xf7\xf4\x16\x50\xb8\xa1\x8d\xdf\xff\x94\xb1\x16\x93\x4c\xf8\x7b\xe6\x41\xcf\x82\xd9\x35\xf7\x0c\x78\x87\xd2\x9c\xea\x46\x0a\x39\x84\x33\x1e\xbd\xb8\x38\xba\x23\x50\x0a\x07\x5a\xda\x9d\x42\x8c\xdc\x7b\xce\x77\x5c\x3c\xc0\xf4\x5c\x56\x4c\x1b\xce\x15\xc1\xbc\xb2\x65\x8d\xaa\x0a\x4a\x3b\x60\x56\xe6\xf5\xb5\x0f\x9f\x66\xe5\xa1\x48\x3e\xc7\x7c\xcc\xc7\x97\x9d\xbc\x45\x4e\x3f\xbd\x7f\x09\x89\x37\x67\xf6\xdd\x1b\xd7\xfe\xeb\x47\x97\x8a\x73\x55\x55\x90\x22\xcd\x54\xa1\x18\xab\xaa\x42\x49\x4c\x21\xa7\x55\x65\x3a\x32\xf9\xbc\x30\x9a\xb6\xaa\x28\x05\x65\xad\x98\x0e\x85\x65\x84\x50\xce\x69\xc3\x4b\xc8\x98\xae\x91\xeb\xc2\x30\x41\x0f\xdb\x4e\x2f\xfa\xe2\x4e\x30\x3c\x32\xa3\x67\x84\x4c\xad\xcc\xf4\x34\x4e\x7b\x28\xaf\xe3\xbc\x7d\x19\xe7\x87\xef\x8c\x33\x3d\x7e\xfa\xf9\x9b\x71\xde\xaa\xf4\x1c\xce\x75\x5d\x57\x8a\x28\xe1\x8a\xdc\x0a\x56\xe3\xd2\x58\xca\x4b\xc9\x70\xed\xcf\x14\xe4\x7d\x51\x5e\xec\xa6\x2d\xa0\x62\x7c\x30\x61\x3c\x94\x8e\x53\xc2\xb8\xa4\x5e\xc0\x92\x10\x53\xa3\x26\x8e\xb5\x81\x5d\xeb\xc3\xe2\xbc\x03\x48\xd5\x27\x69\xf4\xa9\xaa\x54\xad\xf5\x98\x80\xd8\x07\xdd\x1e\xca\x4d\x0b\xee\xd5\x58\x3f\xfc\x70\x19\xea\xfb\x57\x26\xe2\xef\x36\x15\x9e\xbf\xfb\x94\xbe\x1e\x6a\xd6\x65\x3e\x30\x8c\x25\x76\x58\xf3\x21\x6f\x4f\xb4\x93\xd6\x12\x5d\x19\x81\x71\x3e\x3c\x26\x12\x54\x4b\xd5\xcd\xf4\xdc\x41\xe4\x15\x5b\xfa\xd0\x1e\x4a\x27\xa8\x69\xad\x24\x9d\xaf\xc2\x2c\xbd\x70\x7c\x59\xa0\xaf\xda\x56\xb0\xb0\xf4\xb6\x03\x75\x6e\x1f\x13\x65\xf4\x82\x63\x23\xeb\x12\xfb\x66\x12\x11\x35\xfd\xef\xbe\x19\xeb\x6f\x56\xf5\xf3\xdf\x45\x4b\x06\x5e\xad\xea\xcf\x5f\x6f\x77\x49\x46\x83\xc6\x84\x63\xcb\xb4\x69\x66\x2b\x85\xca\xad\x25\xbc\x14\x0c\xe3\xfc\x14\x4e\x02\x10\x50\xc0\x61\xe6\xa7\xa9\xac\xbc\x14\x20\x6f\xc2\x7c\x28\x1d\xa3\xdc\x28\x2b\x3a\xd9\x9d\xcd\x78\x09\x3e\x97\x0e\xfa\xd2\x98\x0a\x9d\xb4\xb2\x20\x57\x23\x97\x62\x46\x95\xa9\xb5\x89\x39\x89\x1d\x80\x60\x3a\x74\x57\x1b\xb0\xb1\x3c\x5f\xb3\x93\xd7\x1c\x62\x1c\xd9\x6f\xda\xe8\x3e\xc5\x29\x01\x08\x16\x04\x1b\x58\xa5\xe7\x5f\x85\xdf\xb1\xfb\x06\xa0\xaa\x66\x1d\x57\x45\x01\x4e\x4c\x71\x46\x94\xea\x17\x3c\x3a\x5a\x6a\xcd\xf1\xfe\x44\x49\x55\xd7\xf7\x67\x9b\x9e\xc3\xc5\x5f\x77\x53\x55\x41\x6e\x19\xaa\x15\xc5\xa2\x52\x10\x4f\x15\xaa\x31\x4d\x40\xec\xcb\x6e\x0e\xc9\xc5\xa2\xbe\x8b\x22\xad\x3f\xdd\xc2\xaf\x2f\x64\x6e\x4f\x9a\x68\x1f\x45\x3a\x3b\x0d\x54\x9a\xd4\xb0\xb4\xd0\xac\x4d\x80\xad\x9a\x54\xe7\x0f\x89\xfb\xb5\xaf\x60\x99\x6b\xea\x08\x11\x7b\x11\xcc\x5a\x05\xc4\x41\x9f\x9a\xc8\xb1\xb3\x8b\xb8\x6b\x0b\x54\xf4\x9d\xff\xfc\xda\x47\xf3\x12\x55\xdd\x6d\x45\xb0\xcf\xd7\x8f\xdc\xe8\xad\x77\x85\x66\x86\xea\x2c\x77\xdc\x31\xf7\x80\x3c\x1b\x01\x16\xbe\x68\x82\x0c\xa3\x9b\x8d\x52\xda\x02\xa5\x0c\x35\x0a\x45\xc5\x21\x12\xc6\x12\x52\x8b\x26\x41\x09\x60\xf4\x6c\x65\x13\x7b\x06\x13\xe0\x8f\x4f\xba\xfd\x2f\x4c\x46\xc9\x21\xf9\x35\xb1\xbb\xe9\xbe\x3a\xe0\x7b\xae\xb2\x36\xf2\xd0\x9d\x52\x7c\x20\x7b\xf9\x7a\x3f\xbd\xdd\x51\x3f\xbe\xb6\x27\x11\xd0\xfc\xca\xb9\xb9\x05\xcb\x0e\x86\xaa\xaa\x48\x8d\x2a\xc5\x25\x53\x56\x71\xeb\x73\xa1\x6a\x52\x32\x8c\xaa\x31\x9c\x08\xa8\xce\xb0\x5d\xc8\xa9\x45\x9d\x66\xfd\x1c\xe4\x5e\x2a\x58\xd6\xb4\x28\xa9\x62\x82\x50\xae\xac\xa8\xb1\x16\xa5\x2e\x6b\x54\x6b\xaa\xb1\x41\x82\x68\xc4\x20\x83\xb2\x62\x4f\xba\xf9\xee\x40\xf7\xfc\x7a\x9e\xbc\xdf\x10\x6e\x4f\x2a\xcb\x2f\x5a\x94\x57\x45\xfb\x26\xcd\x73\xe4\xeb\x1c\x2c\xf7\x8c\x65\xf3\x03\x8c\xd7\xe9\xa1\x74\x69\xb7\x92\xdd\x88\x11\x24\x44\xf3\xcb\xdf\x20\xb4\x4d\x00\x68\x12\x7e\x60\x3b\x1a\xbb\x65\x9f\xef\x7b\x38\xbe\xc9\xf7\x6c\x65\x11\xd0\xa7\x25\x42\x8a\x11\x30\xac\x34\x2f\x52\x55\x68\x23\x14\x34\x1c\xe3\x22\xe4\xe2\xe2\x05\xd4\x28\xb4\x99\xa9\x31\x65\xd2\x10\x1c\x9a\xae\xd4\x25\x6b\xc3\xc8\x8d\x04\xcd\xd6\xd7\xd9\x67\xdd\x01\xed\x37\xae\x97\x37\x59\x99\xdd\xd9\x7b\x61\xfb\xd0\x98\xb6\x57\xd3\x5e\x68\x2f\xbd\x27\x6c\xd4\xc2\x5d\xde\x29\x9b\xc8\x03\xdf\xab\x2b\xc2\xf0\x85\x61\xe4\xa7\x0f\xc7\x4d\xd4\xe2\x4d\x0e\xe7\xaa\x44\xb4\xdb\x1f\x7f\xf7\x4b\x96\x5b\x98\x26\xdc\xcc\x67\xfa\x98\x84\xe5\x14\x7a\x0a\x60\x7f\x31\x97\x62\x36\x5c\x2b\x12\x04\x9f\x07\x3c\x4d\x1c\x28\x90\xb0\x25\xb8\xbd\x82\x58\x37\x42\x20\x83\xb5\xaa\x35\xe2\x98\xd2\x9a\xbb\x9c\x53\x26\x02\xc4\xd4\xf2\x9a\x46\x5d\xbf\x24\x05\x6d\xd2\x1f\xe8\x9e\x5d\xb1\x5c\xaf\xe0\x56\x31\x01\x7b\xd9\x7f\x6d\x9a\x44\x1e\x29\xa0\x1e\x34\x10\x21\x01\x28\x25\x6b\xb7\x93\xa7\x93\x3b\xad\x63\x8a\x4e\xab\x06\x11\x2f\x07\xda\xc4\x1c\xf0\x9e\x3f\x21\xd5\xe3\x9d\x76\x4f\x79\xc1\xab\x88\xcb\xe7\xfd\xa7\x9f\xf7\x96\xb4\x3d\xf0\x81\x83\x62\x10\x6d\xef\x9b\x70\x62\x00\x99\x60\xc1\x18\x2c\x02\xd3\x9e\x9b\x0a\x4e\x8e\x38\x6b\x9d\x0c\x3c\x2d\x1f\x93\xce\x0c\x27\xd7\x23\x5d\x5f\x3e\x67\x4a\xcc\x21\xd9\xf3\xb7\x98\xda\xdf\x24\xf9\x9e\xf8\x47\x2f\xf3\x38\x01\xe7\xc1\x14\xaa\x48\x49\x3b\xe7\x42\x57\xac\xe4\x75\x05\xf3\xd0\xfb\x28\x54\xe6\x80\x08\x62\x37\x6b\x6d\xb5\xd3\x61\x6c\x4a\x5b\xd6\x2a\x08\xe0\x9c\x76\xfa\x62\x17\x2e\xfe\x70\x7b\xa0\xd7\xba\x4a\xf5\x56\x8b\x0c\x3c\x8d\xe0\xa7\x7f\x0d\x8e\xb7\xcf\xdd\xd2\xc7\x9f\x3e\xdc\xdd\xdc\x9e\xd3\xf3\x5a\x44\x86\xfb\xcb\x15\xce\x59\x1f\x1a\x50\x84\x73\x9b\x4a\xd0\xa2\xa0\x57\x1b\x88\xad\xa9\xf4\xa5\x85\x5c\xe4\x01\x1d\xe8\x0a\x41\xdb\x04\xd4\x04\x62\x27\x33\xd5\x5e\x39\xaf\x25\x28\x00\x86\xa3\xac\xc1\xf2\x4f\x1b\xcf\xdd\xfb\x8f\xdf\x8c\x67\xeb\xde\x9e\x53\xbf\xf2\xc8\xf5\x72\xb9\x1e\x93\x4c\x87\x61\x59\x5c\xda\x6c\xa3\x71\x81\xba\x9a\xc9\x06\xda\xbc\x24\x34\xb0\x6f\x46\x33\x62\xaf\xac\xd3\x12\x24\x80\x40\xc9\x19\x8a\xc0\xdf\xff\xaa\xe3\x61\xe1\xfc\x5f\x3a\x1e\x90\x9d\x13\x1a\x71\x85\xdb\x1e\x79\x05\x24\xbc\xfc\x2d\xbe\xb3\x4f\x76\x45\xd4\xb1\xc5\x5b\x9e\xe1\x12\x65\x36\xcc\x22\x52\x92\x1a\xc1\x3c\x2c\x2e\xb6\x54\xcc\x3b\xd1\xdb\xbe\xb7\xbd\x1d\x82\x75\x85\x2d\x70\x73\x79\x05\x22\x8e\x18\x64\x43\xec\xb1\xfd\xa3\x9f\xf9\xee\xe5\x33\x93\x08\xe5\xae\x7c\x9c\x3d\x0d\x2d\xf0\x42\x21\x54\xd6\x08\x95\x45\x58\x7c\x4c\x78\x4c\xbb\xe4\xec\xce\x67\x77\x36\xe7\x00\xa7\xdc\xe5\x18\x90\x95\xa6\xad\x3b\x5f\x31\xaa\xd9\x18\xf3\x1e\x6f\xb8\x00\xbf\x41\x28\xbc\x7e\x19\x34\xa8\xb6\x4a\x26\x0c\x33\x70\x94\xd4\x02\x0a\x54\x3d\x26\x51\x9f\x34\x2c\x20\x0f\xd3\xde\x9c\x4e\xf6\x6c\x4f\x01\x31\x56\xb8\x02\x81\x6a\x25\x69\x67\x4f\x36\x72\x93\x80\x26\x51\x07\xb6\x67\xd7\x3e\xd3\x57\xa8\xde\x9b\xab\x7a\x6a\x7a\x4d\xc6\xde\xdc\xc6\x9e\x95\x11\xe4\x1e\x40\x1f\x8b\x20\x30\xcc\x3e\x8c\xe8\xa4\x86\x2a\xcc\x00\x85\x25\x1d\xc2\xbc\x53\xf3\x3c\xcf\x2e\x9c\x5c\xa0\xa0\x0d\xe7\x86\xb9\xc1\x45\x39\xe1\x32\x9c\x36\xde\xd5\x26\xf1\x87\x7a\x4f\xae\xbc\xab\x5b\xcd\x61\xf7\x52\x73\xb8\xd8\xf7\x19\x0c\x1e\x8c\x01\x01\x38\xca\x6e\xf0\xcd\x49\x82\xdc\x05\xb7\x8b\x12\x51\x8e\x8d\xbd\x1b\x7d\x48\x52\x1f\x4c\x6f\x86\xd8\xbe\x9a\xa4\xc0\x27\xcd\x41\xed\x8b\x24\xdb\xd0\x1d\xef\x6f\x37\xbc\xdf\x77\xc2\xee\xdf\x83\xaf\xb7\x69\x9d\x89\x07\xc7\x77\x38\x4c\x45\x8e\xae\x42\x09\x96\x0d\x85\x9f\x59\xa7\x8b\x70\xde\x17\x6e\x74\x41\x6f\x49\x89\x81\x53\x01\xdc\x63\xf2\x98\x08\x43\xc7\xfe\x3a\x8f\x76\xbf\xec\xe5\x33\xd3\xc9\x6b\x72\xc4\x6b\x6f\x70\x4c\x87\x44\x2c\xc9\xd9\x41\x94\xf6\x42\x63\x0e\x05\x41\x55\x8e\x7d\xd0\x12\xd0\xd6\xeb\x30\xcb\xb3\x12\x4c\x89\x69\x2f\x21\xe7\x2b\x5a\x4a\x57\x46\x33\x1d\x5a\x01\x2a\xd0\x07\x7f\x12\x23\x28\x34\x17\x7d\x7c\x3f\x45\x5a\xc5\x5c\xe5\xbf\x4a\xfe\xfa\xca\xb9\x1f\x1d\xb8\xcd\x2c\x6f\x3e\xdc\x73\xcd\xe9\x97\xbb\xf7\x77\x91\x4e\xf0\x63\x7a\xc5\xe4\x47\xe0\x6d\x2c\x8a\xbd\x01\xee\x5f\x85\xcb\xa1\x2c\x21\x38\xcf\x6b\x59\xa7\xb6\x0f\x02\x2b\x58\x95\x10\x96\xb2\x80\xa8\xa2\x20\x7f\x70\xf6\xe4\x9c\x2f\x66\xd6\x16\x0d\x18\x83\x49\x59\x7a\x76\xc3\x80\xa5\x14\xa5\x90\x68\x2d\x16\xc1\x18\xe5\x07\x8d\xcb\x52\x87\x99\x6b\xd2\x51\x54\xa3\x22\x47\x08\xa1\xaa\xbc\x04\x3b\x0b\x40\xf7\x03\xb0\x61\xe4\x92\x4c\xca\x8c\xd6\x2a\x2b\x48\x6e\x0a\x2a\x2b\x84\x19\x46\x49\xb2\x4b\x4f\x91\x4b\xd6\x25\x3f\x24\xff\xea\xaa\x2b\xfb\x94\x31\x48\xf6\xd7\x7e\xd8\x9f\x8f\xd7\xbc\x00\xf8\x5e\x7b\xde\x56\x21\xd9\x77\x1a\x53\x46\x39\xd1\xc1\xad\x33\x15\x8a\x10\x4b\x81\x29\x29\x76\x90\x32\x12\x8a\xac\xf0\xcb\xc2\x8c\x96\xd0\x18\xfc\x70\x06\x58\x33\x47\xf4\xc1\x09\x8c\x09\x23\x58\x84\x66\x30\x55\x2d\x48\x6d\x9c\xa7\x8c\x96\x9c\xd4\x6b\xef\xbd\x5b\x27\xc9\xcb\x06\xd2\x34\xc7\xb6\x23\xad\x4b\x92\x7f\x09\xda\x2b\x16\xe1\xf8\x9c\xfb\xff\x77\x31\xef\xff\x3f\x25\xff\x39\xf9\xdf\x63\xbe\xb5\x38\x7e\xfa\x72\x03\xde\x7f\x7c\x7f\x77\xb3\x09\xf5\xbf\x8b\xc5\xf1\x9b\x8f\xef\x3e\xbe\xbf\x7b\x6a\x92\xfc\xfa\xe1\x4f\xd2\xb8\x55\x3f\xc4\x4c\x61\xfa\xfd\xa2\x16\x33\x8d\xb4\xe9\xd9\x18\x6d\xd6\xb3\xd6\x7a\x59\x8c\x31\x59\x19\x7a\x8e\xab\xdc\x16\x55\x6d\x3d\x31\xdd\xbd\x75\x54\x38\x95\x61\x56\x35\x15\x4e\x4b\x41\x3c\xe6\xab\x27\xa5\x2f\xeb\x03\x5e\x9b\x20\x17\x36\x03\x9a\x52\xbd\x04\xb8\xe8\xdd\x18\xcc\xb2\x3a\x90\x07\xb3\xec\xc8\xea\x82\xc1\xf8\x54\x4d\x1a\x61\xb6\x2b\xf4\xe5\x64\xbd\x17\xe8\x31\x69\xe8\xd0\xf8\xa1\x1e\x9b\xaa\x19\xc9\xd4\xa0\xae\x47\x63\xb7\xf5\x46\x88\x47\x9e\xc1\x83\xba\x7a\x46\x7f\x7d\xe5\xc9\x8f\x41\xf0\xb5\xc3\xe9\xca\x3f\x92\x5d\x1e\xdd\xd5\x37\xfa\xe9\xfd\xf1\xef\xfe\x66\x9b\x69\x2a\x08\x34\x45\x3f\x57\xd6\x28\x0d\xbd\xb4\xcc\x73\x5a\xd7\xb6\x1b\x24\x2f\xe0\x48\xa0\x86\x98\x62\x5b\xf5\xa6\xc4\x1a\x67\xcc\xf7\x88\x52\xa4\x5b\x90\x57\xa5\x9d\x81\x42\xa1\x9f\xf2\x52\x99\x3a\xe0\xb0\xc0\x8a\x92\x20\xda\x11\xcd\x6d\x31\xcc\xc5\xb9\xcb\xe1\x63\x32\x93\x39\x49\xd3\xee\x91\xec\x44\xcc\xab\x17\x1b\xa6\xe7\xd3\x97\xbf\x04\xcf\x6c\x47\x59\xa7\x45\xcb\x5b\xa5\x11\xb3\xb0\xe4\xc3\x41\x92\x30\x0e\x7a\x1a\x88\xb5\xf7\xe7\x0c\x57\xa5\x3e\x6d\x38\xa7\xe2\x91\x1c\xed\x95\x2f\xb0\x7a\xba\xd3\x2f\x4f\xbc\x52\x57\xdc\xd5\x7f\x00\xc7\xab\x4e\xe2\x0f\x37\x77\x3f\xc6\x93\xf2\xd0\x59\x22\x8c\x0c\x56\x10\x8b\x79\x99\x25\x61\xb8\x18\x48\x26\x4d\x4d\xc7\x33\x83\xb5\xd1\xb6\xa8\x79\x18\x0f\x71\xc1\xc9\xd8\xb5\x23\x9e\xda\x50\x9b\xa0\x4d\x20\xa5\x37\xbe\xd7\x0c\xc0\x94\x9c\x7b\x4f\x33\x19\xf9\xdc\x13\xb5\x83\xcf\xdc\x85\x57\x8f\xf6\xaa\xdd\x15\xb1\xa7\x59\x65\x24\x97\xa6\x52\x9c\x0b\x05\x72\x2d\x7a\x3b\x1c\x04\x53\xca\xf0\xd0\x53\xa1\x35\x0d\x0d\x0b\x53\x38\x0b\x90\x27\xbb\x6c\x4a\x78\xec\xbb\xca\xae\x9c\x66\x1b\xd2\xe4\x09\xed\x9b\x7d\xfa\x01\x7c\xb8\xd8\x9c\xbd\x76\x0e\x08\x81\x4d\x2d\x02\x35\x58\x6a\x99\x0a\x77\x5a\x2d\x4d\xeb\x83\x7a\x28\x32\x3a\x2d\x74\x99\x30\x0a\xfe\x31\xa1\x20\x09\xe7\x7a\x9d\x7b\xef\x36\x0c\xca\x9c\x25\x47\x76\x80\x9b\xc7\xfa\x5b\xb6\x8c\x6c\xc9\x38\xef\xa9\x84\x9a\x92\x3a\x0f\xa7\x2a\x4c\x02\xe4\x65\x58\x0e\x70\x5d\xc2\xa9\x30\xb9\x06\x3a\xa0\x4e\x7b\x20\x36\x9e\x87\x74\xc9\x86\xa8\x53\x95\x80\x0f\xfb\x27\xa6\xe0\xad\x63\x34\xeb\x8a\xc0\x3a\x5f\x2d\x13\x7d\x4c\x4a\x50\xfa\xfd\xe4\x71\xe8\x6b\x62\x25\xa6\xc0\x55\xbe\x5a\xe6\xcb\x3a\xba\x98\xd3\x2f\xfe\x91\x75\x94\x4a\x48\xa1\xa0\x16\x91\xfe\xd0\xf0\xc6\xb5\x87\x82\x1b\xe3\x44\x70\x4c\x19\xc3\x43\xc7\x82\x0d\xad\x04\x24\xd9\x65\xdd\x23\x8d\xfd\xed\xdb\x3a\x7e\xb8\xae\xe3\x0f\xef\x8e\x69\xf6\xbc\x8e\x91\xb7\x63\xef\xbd\x07\x42\xd6\xbe\x16\x81\x3b\x26\xad\x4e\xa9\x6d\x82\xbe\x84\x09\x08\x88\x83\xba\xef\x32\x1a\xce\xa1\xad\x63\xdb\x15\x0a\xfa\xb2\xa2\x28\x58\x12\xfa\xe0\x8c\x35\x20\xf2\x2c\xc6\xbe\xda\x0c\x6d\xcc\x6a\x91\x2e\xe0\xf6\x7b\x3c\x2d\x97\xbf\xbb\xfd\x27\x78\xe8\x68\x18\x82\x4d\xdd\x2a\x32\xf8\x30\x33\x79\x09\x03\x75\xf5\xd0\x65\x64\x65\x69\x13\xfa\x60\xaa\xf4\x94\x21\x03\x4b\xad\x85\x15\x92\x95\xae\xa4\xc4\x0a\xad\x8a\xdc\x44\x3c\xe8\x39\xb5\x07\xf5\x07\x6a\x54\xc7\x4f\x5f\x00\x8f\x8a\x5f\xa5\x53\x42\x5b\xd0\xc8\xe1\x2c\x96\x83\x22\x5c\x4b\x62\x08\xd3\x92\x38\xd1\x49\x61\x2e\x76\x5f\x67\x45\xf4\xbb\xbe\xbb\xe7\x62\x9e\x6f\x83\xc3\x59\xef\xc1\xe4\xb9\xe6\x6e\x95\x96\xda\x8b\xe9\xe3\xa1\x5f\x0d\x4d\xcd\x41\x85\x02\xb8\x66\xa0\x43\x8b\xeb\xd9\x53\x2f\x64\x38\x51\x23\x22\x9e\xad\x8f\x58\xbc\x2d\x2e\xff\xd3\xc8\x03\x75\x8d\xce\xa3\xc6\x40\xf4\xae\xc0\x5d\x71\x2c\xf6\x9f\x7e\x9f\x6e\x47\x48\xe6\x33\xf6\xd0\xd8\xd8\x2e\x93\xb8\x95\x7b\x60\x9b\x7c\xf5\xe2\x7c\xa2\xa0\x1a\x06\xd5\x9c\x0e\x78\x3d\xdb\xff\x8f\xb5\xbf\x07\x92\x54\x59\xd3\x04\x61\x1c\x08\x82\xee\xdb\xdd\x43\x56\x9d\x3a\xc5\xed\xf9\xee\x5c\xf2\xcb\x73\x4e\xb1\xdb\xf3\x83\x6d\x76\x56\x61\x6b\x3b\x6d\x98\xed\xae\xad\x9b\x8d\xe2\x2b\x2d\xa2\x8b\x88\x2e\xba\xe8\xa2\x8b\x2e\xba\xe8\x22\x22\x22\x22\x22\x22\x22\x22\x62\x88\x88\x74\x55\xf0\xc6\x1a\x4e\x44\x56\x66\x55\x9d\x3b\xb7\xd7\xa6\x4e\x45\x64\x65\xda\x09\x78\xd3\xf1\x9f\xf7\xe7\x79\x9f\x67\x5e\x97\x35\x71\xc9\x5a\xbb\xa7\x8b\x03\x73\x08\xa5\x91\xb9\x69\x25\x37\xdc\x98\x9d\xbf\x43\x5e\x0a\x57\x07\x99\xf5\x7b\xde\x79\x3f\xbf\x4e\x6a\xbd\x7d\xd8\xbc\x1f\xdd\xd4\x9c\x25\x59\x5c\xa4\x69\xda\xb4\x93\x0e\x32\x09\xd9\x32\xeb\xcd\x3f\x25\xe4\x74\x42\xa7\x7f\xd5\xc1\xec\xb8\x7e\x66\xf9\x19\x72\xe7\xef\x76\x24\xce\x5e\x4e\xff\xe9\xf8\xb8\xcb\x85\x5b\xc6\x03\xdb\xca\xf5\x52\xb5\xfa\xc9\x7a\x22\x3e\x41\x53\x1a\x41\xe9\x92\xa2\x3b\x77\x46\xc5\x11\x9a\x61\x0e\x37\xef\xb4\x98\x59\x5f\x96\x30\x51\x94\xa7\xd0\x22\x2a\xb3\x42\x08\x7f\x2a\xb9\x14\xb9\x51\x69\x56\xe4\x6a\x8a\x42\x75\x71\x8c\x34\xf3\xc5\x91\x5c\xa2\x44\x2d\x15\xb5\xdc\x37\xc8\xa9\x9c\xd8\x1d\x82\x68\xfb\xfd\x6c\x4e\xe7\xca\x1f\x6b\x11\x78\xbb\xa0\x29\x77\xcb\xa9\xeb\xaa\x32\xbe\x38\xd0\x25\x82\xf5\xfd\x14\x44\x1a\x32\x05\x71\x9a\x69\x51\x9a\x24\x75\x63\x85\x06\xe7\x99\x97\x71\x09\xe4\x77\x5c\x62\x56\xd5\x6d\x50\x39\xd1\x05\x26\xc8\x59\xb4\x0e\x64\x3a\x0d\x9f\xb5\x9f\x70\xaa\x91\xa9\xbf\x58\x3e\x0d\xf7\x64\x6b\xb3\xdb\x18\xfd\xd3\xcb\x31\xb2\x92\xea\x5f\x87\xe8\xe7\x17\x68\xcb\xeb\x10\x79\xa9\xab\x93\x64\xad\x3d\xa7\x40\xce\x97\x6e\xd2\x99\xdb\x02\x0b\xd1\x09\x72\x83\x30\x81\xd6\x30\x20\x25\xea\x72\x28\xd0\x34\x66\x58\x6a\x7f\xa4\x16\xe9\xaa\x92\x8c\xab\x53\x18\xaa\x45\xd4\x12\xc5\x30\x2b\xa9\x50\xa8\x16\x5a\x52\xdb\x83\xec\x34\x97\xca\xa3\x41\xf8\x9c\x3f\xb9\xbb\xbf\xdb\x4b\x1c\x6f\x77\x87\xed\xee\xfd\xbb\xfb\x27\xcb\x2d\x82\x21\x32\x22\xc9\x55\x85\x75\x18\x75\x33\xa9\xf7\x2a\x71\x10\x9e\xab\x75\x28\x29\xab\x8a\xe1\xe2\xe0\x3c\x97\x9c\x04\x44\xcf\x33\x88\xd3\xd5\xbf\xce\x2f\xf4\x58\xb8\xa5\x9d\x67\x5f\xb1\x9b\x56\xdb\xc0\x0d\xee\x93\x0f\xbf\x3d\xa1\xdc\xb8\xd4\xa5\x78\x9d\xd7\x90\xa3\x01\x4d\x3c\x6e\xb2\x6e\x1d\xd6\x91\x30\xb7\x6c\xc3\x46\xd5\x49\x9b\xc7\x79\x9b\x5f\x1c\x92\xa4\x96\xdb\xef\x60\xf9\xb9\xb4\xd5\x8c\xfb\x7b\xe7\xce\xf9\x64\x7d\x9a\x6b\x4d\xe1\x6b\xd1\x08\x59\x92\xb9\x3d\xa5\xf7\xd2\xef\xde\xfb\x09\x3f\xbc\x7d\xef\x3d\x7e\x7c\x7b\x8f\x1e\xdf\xbd\xa2\x6d\xbf\xca\x05\x2e\x2a\x4a\x50\xb8\xf6\x2a\x4d\x77\xc6\x2b\x98\xd1\xc9\xdd\x4e\x74\xe4\x0c\x61\x92\x26\xa1\x8c\x09\x63\xb8\x84\x93\x44\xac\xb8\x38\x99\x12\xcc\x24\x21\xd4\xab\x56\x9d\x66\xe3\x9c\x62\x5e\x44\x22\xa1\xbd\xa1\x01\x4f\xaa\x72\xcd\xdc\xa1\x82\xaa\x81\xac\x71\x43\x09\xe3\xa4\x56\x9c\x46\x79\x9f\x2d\xb4\xa0\x88\x5a\xb4\x2a\xca\xd0\xcc\x51\x97\x81\x1c\x51\xb6\x86\x27\x26\xaa\x56\xe0\x24\xca\xab\xcc\x94\xb8\xb4\x3d\xbc\xe9\x95\x43\x7b\xef\x16\xb9\xaa\x63\xdf\x3d\x2b\xfd\xbc\x2c\xe8\x6e\xfb\x47\xe0\x7c\xdd\x40\x0e\xa9\x41\xdc\xac\x9d\x41\x15\xd2\x9a\x50\xc5\x56\x43\x0b\x9d\x51\xa4\x4c\x9c\xda\x90\x62\x9c\x08\x72\xda\x56\x98\x31\xe0\xeb\x78\xd6\xee\xb8\x26\x1e\x43\x5d\xd6\x09\xa2\x04\xd7\x58\xc9\x55\x42\x59\xb6\x17\xa7\x14\xb8\x9b\x3b\x51\xcb\xc6\x6c\xcf\xc4\xee\xf5\x56\x47\x66\xb3\x6b\xc7\x9c\xbd\xb4\xeb\x25\x4e\xe8\xf1\x2e\xda\x4e\x99\xab\x44\x87\x3f\x1a\xa4\xcd\xca\x0d\x52\x30\x32\xa2\x0b\xe6\x49\x4d\x98\xe2\x50\xd6\x2b\xab\x10\x46\x21\x8a\x87\x41\xb4\x73\x20\xd6\xe1\xd9\xa6\x41\x37\xb8\x36\x79\xde\x0b\x6c\xd6\x01\x5a\x88\x5a\x41\x51\x3c\x41\xc7\x6b\x59\x1b\xe7\x8a\xe1\x92\xde\xfc\x3f\x14\xc3\x35\x98\x28\xf6\xd2\x2f\xe2\xa0\x3f\x57\x87\x32\x62\x5f\x31\x5c\x35\x2a\xe3\x61\xcf\x2f\x7e\x21\x82\x52\xce\xfd\x84\xe4\x22\x27\xeb\x8c\x63\x1d\x17\x68\x29\x62\x99\x14\xde\x9c\xa4\x09\x94\x79\x95\xc3\xa0\x43\x19\xe6\xc6\x3d\x65\x26\xcf\x75\x9e\x43\x48\x34\x65\x94\x56\x22\x17\x34\xe3\x2c\x15\x55\x6a\x91\x5c\x8e\xeb\x94\xd7\xba\xd7\x2f\x96\x55\xc6\x16\x79\x5e\x6d\xdb\x36\xa5\xff\xaa\x52\xf9\xf8\xa2\x07\xf9\x16\xa7\xbb\x03\xc1\x84\x49\x51\xf0\x84\xd3\x2c\x0f\xfb\xb1\x40\x49\x1d\xa5\x4d\x5b\x34\xa2\x20\x92\xe2\xf2\xe4\x3b\x80\xf7\x26\xfc\x2f\x0a\xcd\xc0\x91\x04\x12\xc8\x32\x4b\xaa\x46\xc8\x58\x24\x18\x47\x71\x99\xb2\x8c\x24\x69\x1e\x55\x71\x92\x24\x38\xcd\x52\x2e\x98\xe0\xdb\x9b\x83\x5c\xe2\x48\x5f\x06\xdc\x6a\xe6\xbd\x0f\x8e\x6f\xee\x7e\x72\x5f\x5b\xfa\x8d\x78\xa1\x1f\x8a\x82\x73\xce\xd2\x22\x25\x45\x9a\x86\xc4\x54\x03\x4f\x22\x46\xca\xaa\xca\x4b\x81\x33\x12\x70\x2c\xf5\xc5\x01\xb6\x5c\x9c\x50\x47\xb5\xc9\xb1\x14\xdc\xf4\x75\xce\x73\x4e\x04\xa3\x18\xdb\xba\x25\xf2\x8d\x33\x1d\x69\x10\xed\x7e\xdc\xbb\x2b\x6f\xdf\x8e\xb9\x7c\x7a\xbc\xbb\xf7\x1b\xd7\x5c\x9c\x69\x42\xd1\x5a\xa0\x78\x1c\x61\x09\x22\x09\x99\x84\x5c\x4a\xd4\xcb\x6d\xc7\xdf\xf6\xfb\xc6\xed\xad\x1f\x11\x7d\xe5\x66\xbd\xb9\x70\x0f\x48\x32\xac\x0b\xa6\x10\x2f\x8a\x8a\xd6\xec\x14\x70\x5d\x97\xb5\x86\xf0\xcc\x8a\x92\x6a\x59\x79\xbb\x9e\x8a\xab\x2e\xc4\x9f\x02\x7e\x63\x96\x7d\xf3\x55\xc3\xf1\xcd\xdd\x93\xfb\xaa\x1e\x67\x87\x81\x0a\xcc\xb9\x52\x69\x99\x51\x82\x0b\x69\x70\x2f\xa3\x84\x11\xca\x18\xe6\xb2\xc4\xdb\x28\x18\x03\x23\x10\x30\xa0\x93\x3a\x45\x11\x8a\xd5\xc5\x91\xca\xa0\x42\x61\x51\xf0\x52\x29\x81\x29\xe7\x0e\x72\xe3\x0b\xf6\x59\xf0\x52\x3f\xf2\x2b\x3c\xf6\x29\xf8\xee\xde\xde\x2c\x0a\xc6\x98\xc8\x76\xbd\x04\x61\x70\xa7\xa3\x64\x9b\xc5\xb2\x28\x79\x91\x93\x40\xe0\xa6\x99\x21\x83\x74\x49\x54\x7c\x42\xa1\x99\xb8\x52\x28\x17\xa4\x21\x9c\x77\x8c\x61\x5c\x4a\x07\xf9\xe5\x45\x1f\xf5\x8b\xf1\x7f\xa1\x3d\xb3\xbd\x7c\xe5\x0e\x70\x42\x56\x25\xe1\xdc\x21\x72\x71\x90\x03\xa7\x20\xd2\x6b\xbd\xfd\xd5\x6e\xa9\xdd\xd2\x71\x02\x77\xb2\x7b\xbc\x70\x62\xcb\x55\xf0\xbf\x3a\x85\xed\xfa\xbb\xff\xed\xe9\x4a\x56\xfb\xf3\x73\x37\xc5\x87\x67\xc5\xf7\xfd\xfd\xfd\xb5\x20\xfe\xf4\x4c\xdc\xfb\xe1\xab\x1c\xd0\xce\x6a\x5a\xb9\x49\xa8\x43\x94\x43\x1f\xd1\x2c\x8e\x23\x1d\x93\xa2\x2a\x54\xba\x8e\xde\xde\xad\xba\x76\x46\x56\xdc\x60\x19\x85\x09\x8e\x37\x9f\xc7\xa4\x59\x9c\xa6\x28\x2b\x73\x96\x95\x20\x45\x4c\x04\x39\x44\x4d\x07\x4a\xad\x03\x88\x89\xf3\x7c\x12\x0d\x62\x5e\x8c\x06\xca\x0a\x56\x41\x58\x29\xa6\xd8\xbc\x36\x45\x18\xa6\xb2\xe8\xb3\x10\x17\x2e\xd6\x75\x51\xab\x2c\x99\x87\x62\xb0\x58\x5d\xe3\xc4\x1e\x7b\xcd\x33\xfa\xb2\xb7\x1a\xbd\x78\x79\x4c\x03\xd5\x5a\x4a\x14\x29\x05\xf3\xfe\xf5\x30\x7d\xd6\xe4\x8a\x5c\x02\xb2\xa3\x97\x00\xa3\x76\xbb\xb6\x76\x12\x8f\x1c\x26\xcb\x05\xbd\x57\x4a\xb6\x73\xfe\xdd\xc3\xdd\xe6\x61\x7a\x0f\x77\x8f\xc7\xbb\x47\x7b\x17\x8f\xac\x93\x76\x13\x29\xec\x1f\x29\x0f\xd3\xe7\x53\x7d\xe8\x6e\xd7\x04\xb2\xe7\xd0\x08\x6a\x2c\xb7\x6e\x76\xd5\x47\xfd\xd3\x55\x77\xe9\x2b\xd2\xec\xf1\x4a\x08\x86\x76\x76\xcc\xbd\xbf\xcc\x6b\x7a\x83\x1c\x33\x8e\xf3\x6c\x60\x49\x40\x11\x14\xa7\xc3\xd8\xbb\xd5\xc5\x39\x44\xb6\xd1\xab\x02\x6d\x20\x34\x2b\x77\x25\x70\x58\xd4\x80\x32\x73\x93\x38\xd8\x7b\xb0\x52\x1b\xdf\x7e\x7b\xcf\x97\xf9\x41\xb4\x7b\x4e\xfb\x3d\xdd\xe9\x64\x10\xdd\xd3\x83\x29\x8c\x06\x4c\x0e\x25\x45\x34\x87\x19\xc5\x27\xf7\x04\xe6\x10\xde\xd2\xc3\x1a\x42\xbd\x56\xae\x86\xea\xe2\xc8\x01\x15\xfa\xeb\x9d\x77\x1e\xe2\xf6\x76\xdf\xb7\x57\x4d\xc9\x17\xbf\xeb\x83\xeb\xdd\x94\xf2\xb7\x51\x95\xb5\xec\x55\x5d\xd7\xb5\xea\x93\x9e\xb7\x49\xdf\xd7\x68\xe9\x0f\x8e\x15\x9d\xe1\x20\xe5\x3a\x4b\x7b\x2f\x06\x0b\x9d\x11\x96\x37\xec\xca\xe6\xb7\x0e\x17\xec\xe5\x96\x37\xde\xb1\x72\x32\x36\x5f\x16\x1c\x3f\x0c\xa6\x96\x5a\x37\x23\x0e\x92\x2f\x24\xcd\xfc\x66\x19\xd0\x29\xcf\xf1\x36\x2e\xd2\xe6\xa7\xb6\xbd\xf6\x7f\xda\xc6\xe5\x9f\x3f\x3d\xee\x4c\x18\xef\x7e\x72\xaf\xf5\xf5\xff\x72\x95\x8b\xf5\x5c\x64\x61\x3e\xe8\xcd\xfb\x8f\x6f\xbd\xbc\x0b\x4d\xe4\x0e\x6b\x1a\xb9\xda\x54\x26\x26\xa2\xd4\xba\x6a\x4e\xf4\x64\x24\x29\xe0\xc4\x4d\x9d\xb4\x48\x61\x29\xf0\xa1\x12\x0a\x66\x0d\x27\x91\x02\x53\x22\xca\x72\x83\x79\xd9\x97\xaa\xac\x5b\xe4\x40\x06\x75\xd5\xbb\xa1\x9b\x42\x09\x73\xd3\x21\xe7\xca\x35\x8d\x8f\xc6\xed\x9d\xff\xb0\xb3\x12\x7e\x7a\x3c\xee\x79\xd0\xe0\xb8\xa3\x33\xbe\x12\xcf\x7c\xba\x47\x1f\x3f\xdd\xff\x2c\xd0\x10\xd5\x91\x5f\x7d\x61\x99\x1f\x55\x2d\x0a\x51\x48\x40\x41\x0f\x35\x64\x29\x62\xd3\x54\x8b\x8e\xa1\x9c\x41\xe5\xa7\x2d\x5f\xa3\x93\xcb\x09\x91\x15\x53\x65\x1e\xeb\x9c\x54\x89\x8a\x72\x42\x15\x17\xcd\x02\xbc\xa0\xcc\x71\x1d\xba\xc5\xbb\x3e\x77\xfe\xbc\x9d\x44\x37\x1b\x6c\x86\xf2\xab\x11\xbf\xfe\xf6\xc1\x3d\xee\xaa\xb2\x87\x8f\x9f\x9e\x8d\xe0\x51\xe2\xc7\x62\x42\x11\x2a\xc8\x16\xf7\x42\x07\x49\x86\x24\x0a\x4f\xb5\x9c\x24\xa2\x0c\x88\x8b\x07\x14\x4e\xdc\x0f\x19\x53\x94\x48\x98\x75\x55\x18\xac\xea\xcc\x24\x5c\xf6\x17\xa7\x97\x28\x43\x0d\xb4\x03\xdf\x6b\xe0\x08\x8d\x97\xf2\x48\x51\xb9\x47\x93\xaf\xfd\xe1\xbd\xf6\x8b\x46\xe3\x52\xc4\xe3\x75\x80\x42\x21\x8a\x7a\x91\xa8\xb4\x5b\x67\xc8\x7b\x84\x25\x26\x92\x66\x69\x12\xe7\x2c\x33\xb4\x20\x37\x2e\x46\xe2\x67\x9e\x78\xe6\x7e\x7c\x59\xb0\x7d\x09\x68\xba\xd2\xf6\x29\x54\xe9\x38\x12\x84\x57\x8a\x37\x65\xab\xa8\x4a\x93\x24\x4d\x8b\x4c\xd5\x55\xcf\x2e\x8e\xdb\xf6\x43\x9a\x56\x8c\x6a\xda\x32\x23\x16\x90\xac\x8c\x54\x94\xe4\x88\x2f\xb2\x6a\x2c\x86\xdf\xad\xaf\xf1\xcc\xdd\x95\xd9\xf4\xe6\xe4\x7d\xbc\x51\x36\x7a\x5b\xe4\xea\x1c\x3e\x7c\xfc\xe5\x8d\x9d\x82\xbf\x1e\x33\xb3\x32\x8d\x68\x14\x42\xee\x97\x10\x85\x51\xa5\x43\x18\xa0\xa9\x16\x14\x96\xe3\x34\xf1\xee\xe2\x1c\xc2\x2f\xb3\x27\xce\xdc\x8f\x09\x51\x8a\x10\xe8\x41\x47\x30\x81\xe4\x92\x4c\xc8\x59\x64\x2b\xda\x66\xfb\x9d\x4f\x4e\xe2\x8e\x36\x9e\x7a\xad\xc1\x84\x58\xa7\xe2\x76\x29\x24\x2a\xbd\x71\x75\x48\xa9\x18\xc5\x87\x01\x32\x75\xd3\xbd\xe7\x47\x7e\x88\xbf\xe5\x7a\xff\xc5\xfb\x46\x17\xec\xfe\xe1\xaa\x0b\xe6\x75\x26\xcb\x3d\x72\xc6\x25\x17\xc8\x89\x3d\xbd\x1a\x5e\x2e\xa2\x29\xa3\x3a\xd1\xb0\xb4\xd0\xd7\x0d\x1a\x57\x71\x88\x73\x5a\x2a\x56\xd1\x09\x26\x06\x05\x49\xe3\x88\xd4\xd9\x89\x97\x34\x97\x88\x5a\x5f\xa0\xbc\x34\x47\xe1\xc7\xdf\xea\xb1\xb9\x9d\xcf\x21\x74\x8b\xcf\xa3\x8b\x21\xf1\x63\x7d\xee\xb5\xf6\xf2\xdd\x7f\xe8\x2e\xc5\x31\xf5\x43\xab\xa5\x72\xff\xf4\x9a\xed\xe1\xee\xc1\x5b\xa0\xf7\x2b\xaa\xad\xcc\x50\x1e\xc5\x10\x1a\x8f\xe9\x35\x3f\x45\x3a\xca\x19\x1a\xbf\x58\x5f\x86\x5e\x88\xd7\x7a\xc6\x79\x63\xb9\x23\xf6\x68\xe7\xca\x82\xee\x1e\x3e\x7c\x7c\xb3\xc3\x0d\xd0\xa8\x05\xe1\x72\x08\x1b\xc5\xb8\xac\x60\x26\x43\x3d\x48\xcc\xb8\xf0\xcc\x42\x4a\xaa\x58\x25\x6a\xa9\xb7\xad\x59\x32\xc4\x51\x99\x9e\x24\xd5\xdb\xb3\x18\xbd\xc1\x9b\x02\x6a\xb9\x40\x1f\xdf\xfd\xf2\xe9\x7d\xf0\xba\x0f\xf2\x69\xd4\x28\xea\xaa\x19\x5a\xac\xdb\x22\x54\x21\x83\xd3\x49\x05\x74\xdc\x2e\x5e\xe2\x1b\x70\xb7\xdc\xd6\xc7\x70\x91\xc7\xca\x37\xbb\x76\xd5\x6b\xdd\x41\x17\xa3\xc5\x2a\x95\xba\xf2\x73\xe5\x32\x08\xbd\x68\xf3\x51\xaf\x3e\x83\x83\xd0\x74\x61\x47\xe5\xe3\x97\xbc\x2e\xce\xdb\xf7\x8e\xb7\x2d\xf0\xc0\x99\x4d\x8d\xd7\x6e\xed\x31\xe2\xa3\x81\xd3\x82\x0c\x5a\x98\x70\x25\xb4\xc0\x71\xcb\x22\x83\x94\xcb\x8a\xb5\xb8\x38\x51\x35\x6c\x73\xcc\xcd\x2f\xe4\x48\xbd\xc1\x5e\xef\xdb\xca\x97\x9b\x1f\xd2\x75\x28\xb9\x16\x89\x52\x78\xad\xbd\x41\x9f\x4f\xbc\x8c\x4d\x52\xba\x8b\xed\x59\x64\x47\xe1\xb3\x3d\xee\xdd\xb1\xcd\x37\x75\xb4\xbd\xd1\xd9\x73\x0c\x6a\x51\x45\xa0\x82\x94\x8d\x88\xc8\xc4\x24\xb4\x05\x03\x8d\xf6\x19\xe4\x55\xa3\x06\x0a\x24\x49\x4b\xe4\x64\xb3\xce\xc9\x8e\x99\x76\xb4\x1f\x1e\x2b\x8b\x7d\xfb\x16\x1b\x1e\x96\x99\x3b\xd6\x9f\x45\xed\x15\x19\x09\x24\x57\x20\xa7\x09\x71\x46\x77\x5c\xc7\x45\x1e\x73\x3f\xbb\x66\xfc\x6e\xf6\xdc\xef\xc4\x7b\xd6\x20\x74\x6a\x5c\x82\x32\x06\x6c\x35\x1c\x15\xa8\x92\x45\xd8\x44\xd5\x00\x14\x68\xef\x67\x50\x70\xc5\x3b\x0a\x3a\x49\x12\xda\xe4\xa3\xce\x4b\xea\x20\xbf\x76\xcc\x95\x93\x61\xbb\xae\x65\x36\x7a\x66\x37\xbe\xca\xc0\xf9\x75\x7d\x1a\xaa\x05\xc6\x8c\xb7\x49\x6a\x42\x9c\xc3\x69\xe4\x01\x5f\x6b\xdd\xeb\xc9\x40\x98\xc4\x49\xda\x67\x17\xa7\xc8\xed\x1c\x70\xaa\x4b\xef\x35\x5e\x65\xf5\x9f\xb7\x71\xdf\xf3\x36\xbf\xde\xdd\x0b\x77\x82\xa5\x51\x31\x68\x28\x12\x84\x61\xf0\x2a\xb9\x8e\x49\xaa\x28\xae\x53\x17\x3b\x0e\xf2\xf4\x85\x1c\x89\x57\x5b\x0e\x56\xcb\x90\xf2\xa2\x14\xf6\x2f\xe8\xe9\xde\x2f\x3b\xaf\x5d\x5b\xe2\x52\x35\x31\x91\x69\x41\x71\xb6\x56\x5e\x22\xe5\x0c\xce\x14\xab\x38\xed\xc6\x9d\x8f\x88\x1c\x59\xe0\xd8\xeb\xec\x3c\x2b\xee\x8b\x95\xf7\xf6\xde\xcb\xfd\x7c\x15\xdc\x6d\x64\xcf\x45\x66\x44\x95\xa4\x6b\xaa\x61\x09\x1c\x0d\xc5\x79\x82\x3e\xd6\x31\xaf\xdd\xd0\x2d\x9d\x2b\xe7\x6f\xe5\x8d\x87\x65\xbb\xde\xdb\x1f\x5c\xef\xa1\xf2\x18\xa4\x15\x9a\x55\xc7\x65\x66\x04\x8b\xd3\x75\x96\xa7\xc3\xa2\x01\x9f\x67\x18\x12\x93\x30\xe3\x3a\xf6\x77\x74\xb4\xdf\x1d\x2b\x5b\xdb\x79\xf6\x13\x8f\x95\xf9\xcc\x4c\x50\x80\x98\x67\x24\xac\x9e\x71\x71\xcc\x0e\xf8\x99\x57\xf0\xde\xf9\x2f\xdf\xf3\x0a\xde\xa2\xf3\xe8\xf0\xe1\xe3\x93\x2d\xc7\xa1\xc7\x9b\x2f\x65\xfd\x29\xe2\x55\x67\x2d\x5c\xba\x9a\xdb\x0b\x72\x83\x16\x73\x71\x60\x2c\xa6\xc5\x15\x10\x1e\x4a\x03\xa1\x9b\x2a\xa8\x34\x9a\x0f\x78\xcd\xd1\x42\x61\xa2\x30\x52\x94\xaf\x66\xcd\x10\x85\xa9\x64\x45\xcf\x85\x3b\xae\xa9\x84\x04\x55\x50\xbb\x83\xe3\x04\x0e\xbd\x14\xc7\xd2\x2f\x7e\x6c\xe3\xbb\xeb\xeb\x66\xe3\x4f\x37\xa0\xc7\xb7\x36\xa6\xde\xe9\x1c\xcb\xed\xe2\xb7\x17\xe4\x6a\x33\x68\x86\x1a\xa3\x30\x82\xc5\x35\xeb\x78\x98\xd4\x3a\xb9\x89\x06\xae\xdc\xc4\x2f\xd6\x1a\xd5\xc5\x84\xc7\x02\xe1\xb5\x5d\x0d\x8a\x07\xcc\x53\xce\xa9\xdb\xae\x98\x82\x40\x21\x9c\x5c\x6a\xf3\xd7\x7e\x72\x24\xb6\xbe\xf9\xb5\x0e\xfe\xb2\x09\x6a\x27\x3b\x6e\xfd\x42\xa0\x11\x52\x22\x8a\x3c\xc6\x98\x84\xa0\x57\x5c\xba\x14\xe5\xe7\x3a\x48\xcb\x52\x9a\x12\x47\x22\xca\xe5\x64\x24\x93\xce\xf3\xf3\x71\xfe\xf2\xf3\xf9\xf5\xbf\xf7\x7c\x98\x97\x9e\x47\x79\x6b\x52\xdc\x5e\x10\xfd\xc5\xe7\xe3\xac\x15\x1a\xaf\xa4\x90\x25\xa8\xb5\x40\x25\x9c\x4a\x56\x74\x9c\xa1\x19\x12\x09\x29\xa2\xd0\xb8\xd7\x1c\xaa\x37\x1c\x45\x40\xed\xda\xbe\x7f\xba\x3f\x3e\xbe\x4c\x94\xec\xf0\x27\x97\x40\x11\x14\xc5\x1c\x51\x96\x93\xa4\x2a\x92\x24\x84\xa5\x38\x77\x14\x4a\x86\xe4\x61\x12\x27\x18\x45\xac\xd2\x8c\xcd\xd0\xf7\x5c\xdb\xeb\xd2\x0b\x3e\xe6\x5e\xbf\x2b\xd8\x7a\x2f\xd2\x2f\x6f\xef\xdf\xde\xff\x2d\x3a\x7c\xf8\xe5\xcd\xdb\xfb\xee\x50\x52\x24\x12\xd5\x62\x96\x48\x42\x8a\x18\xaa\x6a\xd5\xd1\x02\x53\x89\x42\xdb\x3a\xda\x83\x5c\x4f\x73\x6a\x32\x85\x30\xe2\x50\x41\xa1\xa4\x44\x0c\x55\x5b\xdc\x23\x2f\xd8\xe7\x41\xe2\x78\xce\xdb\x6b\xde\xc7\xae\xbb\xc3\xb3\xdc\xf4\xae\x02\x7f\xff\xcd\xf7\x7b\x25\xe4\xde\xbe\x4b\x6f\x3e\x47\x68\x22\x24\x49\x13\x9a\x8e\xc2\x9b\x4a\x12\x27\x09\xc9\x06\x81\xc2\x38\xac\xc2\x18\xca\x38\xa4\x51\x1c\x24\xb2\xf9\x12\x12\x12\x8a\xc2\x2f\x3f\x8f\x07\xf3\x25\x2e\xed\x37\xe4\xf3\x74\xd0\xd0\xc0\x0c\x53\x82\x32\x14\xc2\x0c\x73\x82\x52\xeb\x1e\x3b\x9e\x5f\xdb\x7c\x19\xb7\x19\xbc\x6b\x0f\xeb\xeb\xf3\xfd\xf1\xd3\xab\x52\xfe\xa7\x2b\x11\xcc\xe6\xdd\x07\x1a\x3a\x37\xa5\x2a\x27\x51\x99\xe7\x51\xba\xf6\x3a\xd3\x71\x8a\x08\x11\x69\x1e\xe7\x59\x12\x45\x22\x8d\x44\x94\x9e\xd0\x09\xe2\x43\xb2\x16\x6b\x37\x46\x32\x2a\x34\x4a\xbd\xa9\xcf\x08\x5e\x87\xed\xfb\x9c\x2c\x15\x4f\x79\x75\xe6\xd2\xe6\x84\xcd\x25\x3f\x46\x3e\xb3\xd9\xbb\xff\x79\x47\x93\xbd\x42\xb5\xbc\xc6\x9b\xdc\x7f\xbc\x96\xa2\xb6\x2d\xcd\xa9\x73\x57\x57\x75\x5a\xc4\x45\x86\xd3\xe8\xdc\xfb\x13\xef\x09\x8f\x37\x17\x28\xfa\x92\xa2\x22\x95\x38\xd5\x69\xb1\x36\x7e\xf7\xa5\xf0\x59\xce\xa0\x55\x9b\x09\x12\x24\xe4\x5d\xac\xe2\x12\xc5\xae\xda\x76\x0f\x96\xf3\x6a\x9d\xa4\xe3\x3a\xd2\x1b\x8e\x3a\x50\xce\xc1\xa2\xbf\x9e\xf9\xa6\xfc\x9b\x44\xcd\x2f\x1f\x0e\x1f\x7e\xb5\x64\x54\x7e\xc7\x2b\x4a\x99\x3b\x46\x2b\xa1\x08\x97\x34\x94\x51\x55\x9d\xa0\xa4\xe7\x31\x76\x4f\x38\xd5\x45\x11\xa8\xb4\xa8\x8a\x94\xc9\xac\xa8\x64\x26\x68\xcd\x33\x99\x31\x6d\xf1\xde\x9b\x1f\xcd\xbc\xe4\x56\x33\xb8\x76\x97\xbb\xcf\x22\x3c\x9f\x3e\x7e\xba\x17\xae\x8a\x44\x89\x79\x96\xeb\xa5\x44\x8e\xd0\x2d\x57\x32\x4d\x22\x88\x82\x08\x22\xa8\xb4\xe6\xac\x02\x35\xca\x09\x69\x14\x2f\x65\x3f\x4e\x72\xef\x7b\x48\x2e\x85\xd5\x6d\xbf\xb7\x2a\x81\xdf\x61\x34\x36\xf7\xe6\xe5\x77\x8f\x2f\x06\xd6\x37\x4d\x92\xba\x4e\x29\x31\x4d\x2a\x92\x26\xe1\x7a\xf2\x92\x88\xab\x5c\x24\xaa\x28\x92\xe4\x3c\xd5\x69\xcb\xb1\x2c\x18\x50\xcf\x59\x9d\x40\x66\x14\xaf\x53\x1f\xc9\x88\x22\xb6\x56\x6b\xb3\xc4\x3a\xa6\xa8\xf5\xba\x0a\x7a\x26\x30\xe7\x67\xae\x1c\xcf\x6b\x2e\x3b\x96\xe9\xf7\x6d\x8a\x7e\xcf\xa6\x43\x64\xd2\x0c\x75\x55\x9d\xe1\x84\xe4\x45\x16\x41\xec\x4e\xbc\x25\x2c\x66\x25\x29\xa2\x35\x6d\xf3\x8a\x15\x3c\x67\x30\xb8\x62\x15\x01\xb7\x13\x6e\x88\x55\xcc\x10\x5b\xf1\xda\x8d\xa1\x0e\x39\xe2\xde\x48\xa1\x2d\x59\x41\xe9\x59\xaa\x6d\x9c\x4e\x17\x62\xb5\xab\x92\x17\xfd\x2a\x7f\xc9\xa6\xf7\x5f\x4d\x2a\x4c\x92\x22\x55\xa9\xac\x88\x71\x96\x65\x21\x60\xb7\x66\xb5\x1d\x34\x92\x85\x2b\x6d\xeb\x32\xe7\x19\x85\xde\xad\x56\xbd\x5b\x34\x8e\xaf\x2d\x52\x88\x7a\xe3\xe9\x85\x3d\x7e\x65\x39\xb1\x5f\xad\x51\xf7\xf5\x1a\xfd\xf8\x7a\x91\x7e\xf4\xbe\xae\x51\x0e\xc6\x25\x21\x55\x05\x89\xca\x22\x8f\xb2\xb5\x36\x49\xac\x93\x14\xd1\x52\xa4\x79\x52\x64\x69\xa2\xd2\x58\xc4\xe9\xde\x7b\xb7\x2d\xd2\x76\xd8\x16\xa9\x41\x89\x37\xd1\x6a\x33\xb1\xdf\x7e\x20\x90\xf3\xbc\x4a\x7d\xa7\xbe\x60\x3f\x09\xa8\x73\xb0\xda\x72\xff\xf1\x85\xa6\xfe\xb3\x96\xde\xfd\x61\x4f\x18\x59\x70\xdc\xfb\xe3\x8d\xb3\xfd\xed\xc3\xd3\x23\xc2\xb4\x10\x39\x45\xc4\x75\x08\xa9\x62\x9a\x83\x04\x29\x04\xe2\xb2\x6d\x19\x29\x2b\x99\x61\xaa\xf2\xa6\x0b\x28\xe3\x98\xb3\xf4\x73\x54\x96\x82\x1e\x0a\xf9\x99\x1e\x34\x2c\x82\x9a\x5a\x2c\x6b\xe1\x0a\x2d\xd8\x82\x92\xab\x6e\x34\xb9\x14\x5e\x1f\x30\xeb\x2f\x3d\xde\xfd\x7a\x0b\xc9\x8e\xae\xf7\x61\x73\xc5\x3f\x21\xac\x50\x5a\x14\x58\x53\xaa\x93\x49\x8e\xb1\xca\xfa\x80\x41\x45\xbe\xf4\x59\xc1\x4c\x21\xbc\x53\x76\x1e\x21\xa9\xd0\xe4\xea\x54\x5a\xfe\x7b\x7c\x91\xde\x64\xeb\x1c\x37\x5e\xeb\x1f\x28\xd3\xdf\xdd\x8a\x7a\xb6\x62\xf6\x32\x67\xef\x86\x3a\xed\x6a\xa6\x1b\x3d\x55\x28\x29\xdc\x6c\x40\x39\xf4\x43\x0c\x03\xc8\xbc\xad\xa1\x41\xa4\x47\xb3\xca\x72\x59\x00\x26\xa9\x4a\xcb\x80\x67\x98\x29\xa1\xd8\xa4\xd9\x08\x8b\xea\x25\xa4\xb9\xac\xc8\x36\xb1\x16\xd9\x03\x4f\x0d\x4b\x25\x57\x6d\xd6\xaa\xab\xa6\x75\xf3\xac\x69\x7d\x8d\x56\xde\xa0\xa3\x6b\x15\x58\xbc\x3d\xa3\x60\x27\xc3\x8c\xa8\x46\x02\x54\x8b\x9c\xaa\x33\x5a\xf6\x02\x25\x02\x06\xb7\x21\xa9\x48\xb1\x3f\xa0\x1a\x4a\xb5\x2e\xa0\x34\x2a\x50\x7b\x4e\x3d\x03\x12\x06\x81\x24\x9a\xd1\x42\x19\xde\x9c\x78\xdf\x72\x8c\x98\x80\x39\x7f\xf7\x8c\x67\xf9\xa6\xa3\x7f\x1f\x90\x67\x77\xf9\xdb\x01\x41\x93\x8e\xe2\x56\x33\x65\x64\x5b\x21\x07\xbb\x61\x87\x32\x18\xb4\x48\xa0\x86\x32\x41\x25\x74\xa8\x68\xd1\x49\x65\x85\xc4\x50\xe0\x54\xa5\x24\x60\x59\x9a\x72\x2d\x34\xef\x65\x35\xc0\xa4\x3a\xb5\x9e\x92\x44\x97\xb9\xc9\xdc\x4c\x75\xc0\xd2\x86\x25\x9a\xe9\x2e\xeb\xb4\x83\x5e\xe4\x05\xf7\x79\xf0\xba\xf0\x76\x7c\x17\xa1\x0f\xce\xdd\xd3\xf1\xe9\x93\xcf\x0d\x62\x71\x92\xc5\xa1\x0e\xa9\xd0\xc5\x00\x5a\x20\xdc\xf7\x01\x87\xa4\xf8\x52\x66\x71\xde\xa7\x27\x81\x2b\x3f\x4e\xf2\x35\x03\x52\xa1\xda\x65\x49\xa2\x93\x1d\xff\x2d\x2f\xea\x20\xfc\xf9\x9a\xd5\xfc\xa3\xbd\xdf\x77\xf8\xef\xb7\x3b\xc1\xd5\x7f\x75\xef\xdf\x21\x89\x9a\x30\xd6\x49\x88\xea\x73\x98\x78\xcd\x99\x6c\x2f\x65\xbc\xde\xac\xdc\x27\xb8\x88\x71\x29\x2b\x51\xc9\xf5\x84\xd1\x02\x21\x96\xc6\x38\xce\xc1\x13\x28\x3c\xaa\xe7\xbe\xa5\xdf\xc1\x99\xdf\xf4\x29\x3c\x81\xea\x38\x55\x79\x82\xba\x2f\xb3\xf4\xf2\x73\xbf\xbd\xc2\xed\x4d\xdb\x15\xde\xe3\x22\x2b\xa9\xaa\x24\x93\x0c\x52\xd5\xed\x39\x89\xf1\xaa\xe7\xf3\x23\xc6\xc1\xbf\x44\x2a\x64\x59\xfb\x5e\x73\x0a\xdd\x28\xee\x0e\x8e\xb2\x90\xc5\x39\x2b\x58\x12\x83\x44\x61\x08\x73\x5e\x35\x79\xa8\xc2\x0a\xe6\xbe\x62\xb1\x6c\x5b\xd9\x20\x8e\xea\x2c\x89\x74\x44\x28\x27\x73\xc8\x78\xc5\x48\xc0\x99\xe2\x62\xdb\x34\x33\xbd\x4d\x4f\xcb\x29\xa4\xb1\xe5\x14\x8a\x1a\xcb\x29\x64\x59\x08\xb5\xcb\x7e\xc4\x2a\x35\xa0\xec\xda\xef\x93\xec\x3a\xf2\xe8\xd1\x7b\x7c\xae\x9c\xd8\xfd\xe0\xe1\xe9\xf1\x23\x4a\x54\xb8\xa4\x49\x8e\xab\x92\xc5\x1d\xaf\x63\x21\xc2\x80\x83\x38\x3b\x49\xca\x09\xa6\xde\x78\x96\x40\x2b\xc4\xbd\x5c\x5d\x7b\x71\xf3\x2b\x37\xe3\x9f\xac\x47\xe7\x5c\x7d\xe1\x97\x51\xf9\x87\x37\x6f\x6d\x68\xeb\x1e\xef\x2d\x3a\xe6\xa3\x95\xd6\xf1\xfc\x51\x6f\xde\x79\x51\xd1\x32\xa1\x34\x05\x4c\xf2\xc8\xcd\x10\x2f\x80\x43\x16\x25\x88\x42\xab\xd4\xc4\x07\xaf\x32\x46\x89\xd6\x9f\xa1\x12\x6b\xc6\x2c\xcd\x85\xdb\x50\x44\x11\x4e\xb8\x64\x29\xcc\x33\x2c\x04\x46\x4b\xfe\x11\x8e\x30\x30\x14\x59\x8c\xba\xe7\x8e\xcf\xf3\xfe\xaf\xb5\xed\xcd\x6e\xdb\x21\xd6\xc8\x00\xcd\x4b\x2b\x26\x19\x81\xc1\x59\x8c\x46\x54\x14\xd0\x82\x88\x13\x14\x5e\x1c\x25\x7b\xd1\x79\x91\x10\xaa\x52\x37\xdb\xac\x7e\xa4\x5b\xff\xc8\x36\x8e\x1c\x14\x4e\x30\x5e\x8d\xf3\xbc\xea\x9a\x1f\xfe\x6b\x6c\x7b\xf4\xae\xa8\x31\x6b\x1b\xd6\x88\x83\xc4\xd4\x6a\x77\xa6\xd0\x6c\xb6\xb5\x28\xcb\x61\x04\x1d\x27\xcb\x2c\xa9\xe1\xda\xed\x2b\x2a\xcb\x6a\xb7\x2c\x67\x24\x54\x61\xe9\x9a\xef\x2c\x3b\x2d\xfc\xb4\x0c\x30\x5d\x65\x7e\x6d\x2f\xe8\x3e\x66\xef\x9d\x3f\xed\x67\xab\xf7\xaa\xb0\xb3\x9d\xb3\x2f\x0a\x3b\xf7\xaf\x10\x1c\x5e\xe5\x46\xa1\x09\x91\x00\x19\x95\x59\x9c\xc4\x26\xaa\x48\x85\x45\xb6\x9e\xbc\xaa\xcc\x64\x4a\xd6\x0c\x8d\x86\xd1\x04\x16\xe8\x62\x56\x99\x43\x8c\x28\x18\xbd\x0e\x20\xc6\xa6\xce\xe1\xd4\x76\xa8\xf4\x12\x34\x57\x8c\xb0\x6a\xcd\xe5\x3a\xa7\xa9\x62\x56\x7a\x2e\xdf\x75\xd4\x1d\x75\x14\x41\x72\x63\x5c\xfd\x6e\xd4\x2c\x21\x71\xe8\xa7\x50\xb8\xd1\x3a\x63\xa1\x44\xa2\x75\xb6\x85\x99\x90\x05\x89\x86\x4a\x83\xc3\xca\xc4\xa4\x18\x9d\x34\xb2\xb1\x8f\xab\x1d\x7e\x94\x01\xb9\xf5\x40\xde\xa2\xb9\xa7\xfb\xbb\xc3\x87\x5f\x82\xa1\x9a\x6c\xcb\xb4\x59\x07\x37\x03\x46\xd0\x12\x10\x91\xa5\x50\xea\xb5\x70\x3b\x8d\x54\xa6\x77\x3e\x3a\xbf\xbd\xe2\x1f\x7e\xb2\xdd\xf3\xb7\xda\xcb\xf7\x9c\x90\x7e\x8b\x94\x69\x1a\x42\x79\x95\x72\x9e\x02\x93\xb6\xbc\xee\xcf\x48\x02\xd7\x5f\x3a\x9b\xb2\xa2\x7e\xdc\x0d\x73\xb9\x73\x4a\x21\x0f\x5f\xf0\x91\xfb\xa1\xf5\xb8\xbf\xc3\x7c\x3f\xd3\x7e\x3c\xdd\x7b\xd8\xcf\x20\x47\xba\xaa\xd2\x22\x29\xd3\x7c\x31\xb3\x41\x0a\x72\x3f\x54\x0d\x84\x3b\x97\x0f\x2a\xd6\xc8\x9d\xd7\xde\xed\x6d\xdd\xc8\x69\x2f\xc4\x1d\xfc\xd0\xee\xa7\x16\x85\x6a\x85\x63\x2c\x77\xb0\x9b\xeb\x69\xc6\x7d\x0b\xb5\xd6\x7e\xb8\x2e\xd0\x41\x97\xa9\x74\x46\x21\xaa\xd7\xd8\x71\x2d\x4f\x99\x0c\x0a\xe7\x0f\x7b\xef\xd8\x8b\x3e\x8c\x77\x36\xd5\x73\x73\x7f\x76\x56\xf7\xeb\xb8\xbe\x7b\x78\xf2\x32\x5b\x92\xc7\xe7\xc5\x0b\xcf\xad\x5f\x6a\xe0\x68\xa8\x14\x49\x74\x0e\xbd\x86\x41\xa3\x1e\xb8\x0e\x8a\x95\x0b\x21\xc4\x2a\x17\xde\x81\xac\x88\x22\xbd\x7d\x0c\xd8\x2d\x3a\xbe\x38\xae\xa3\x2e\xd8\x2d\x03\x6e\x23\x76\x6b\xfb\x76\x96\xd9\xca\x5c\x6b\xa0\x17\x28\x86\xd1\x98\x80\x9f\xd9\xda\x83\xae\x10\x41\x27\xf7\xf4\xe5\xaa\x65\x39\x5e\xb0\x3b\xfc\xe8\xb3\x6e\x66\xc0\x08\x54\x40\xfd\xbb\x9f\x6d\x2e\x95\x5b\x07\xe5\xb5\x7f\xeb\xc6\xb2\x1c\x69\x0d\xc6\x98\xa0\xfc\xd7\x28\xc0\x9f\x47\xc7\xf5\x7b\xbb\x9e\x2a\xcb\xfd\xed\x6c\x7b\x8c\x0d\x63\xdf\x7c\xfd\x57\xe0\x48\x6e\x1a\xa1\x45\xd7\x22\x25\xb9\xae\xb9\x66\x5d\x13\x54\x19\x44\xa0\x80\x03\x26\xe8\x84\x0c\xaa\xd1\xb4\xfd\x64\xf3\x41\x2a\x82\x7a\x24\x6d\x93\x12\x72\xf0\x05\xfb\xb1\xe5\xc6\xb5\xf9\xfe\xbd\x66\xf2\x8a\x93\xca\x6d\x0c\x9f\x18\xca\x38\x68\x64\xb5\xd5\x9a\x41\x57\xc2\xcb\xcf\x91\x37\x42\xbb\x30\x44\xd0\x60\x5b\x32\x34\xed\x3b\xdd\xee\x3a\x52\x9e\x0c\xb8\xf3\x1f\x6c\x67\xc7\xbe\x33\x7d\xfc\xf4\xfe\xf0\x8d\x62\xe0\xaf\x77\xf7\x12\x61\x83\x22\x98\x25\xb7\xd8\xd4\x8a\x26\x55\x55\xe8\x3a\x47\x1c\xda\x9d\xb6\x42\x43\x95\x65\x4a\xac\x23\xa7\x51\x1d\x53\xd4\xe7\x59\xcd\x2c\x80\xcb\x75\xcb\x8b\x39\xec\x7a\xed\xc9\xf7\xea\xec\x77\x8f\xd7\x3e\x83\x5f\x77\xcf\xe9\xc1\xed\x90\x63\x6c\x85\x3a\x3b\x2f\x28\xbf\x38\xcb\xfe\x5d\x1a\x83\x06\x9c\x20\xba\x1c\xe4\x3c\xeb\x59\xeb\x79\xc5\xa7\x93\x86\xd3\x76\x40\x9a\x0c\x65\x3b\x37\x15\xb1\x7e\xeb\x4f\x4e\xbc\xed\x6b\x5f\xd5\x45\xbe\x0a\x8f\xde\xbf\xbd\xb6\x04\xbc\x8c\x1c\x9e\xee\xdf\x3e\x48\x44\x12\xab\xaa\x4d\x41\x75\x5d\x65\x7a\x06\x4b\x31\x55\x70\x6a\xb7\xf3\x7c\xf4\x08\xa4\x29\xea\x58\x53\xd2\x94\x53\x92\x43\x8a\xa7\x43\x4f\x68\x82\xb1\x14\x75\xa5\x74\xc7\x25\xab\xa1\x96\x46\xd6\xc0\x9a\x50\x86\x74\x44\xa9\xe5\x35\xae\x6c\x2d\xfd\xa7\x97\x71\xd5\x33\x24\xe3\x6e\xd7\xbb\xbd\x7b\xc9\xbe\xf1\x74\x77\x6f\x0b\xc4\xbe\x54\x71\xe2\x56\x94\xa7\x79\x52\xa6\x71\x02\x4e\x4e\xb8\x92\xd9\x38\x17\xa1\xde\xbc\x58\xe8\x2b\x34\xe9\xa6\x09\x44\x5e\xe2\xb3\x86\x3e\x54\xe1\xe4\x1a\x51\xd1\xe1\x5c\x41\x95\xc4\xa5\xc9\x16\x5a\x30\x6f\x59\x5b\xd4\x41\x7f\xd5\xca\x22\xc7\xd2\xe2\xb7\xb6\x19\xed\xbc\x3f\xba\x1f\xee\x1e\xfc\xde\x5c\x9b\x2c\x02\xbe\xca\x8b\x33\x1b\xe4\xf4\xe7\x78\x3b\x5f\x87\x4b\x65\x75\x0b\x7e\x7a\x19\xab\xbe\xb6\xff\xcd\xe1\xee\xfe\xee\xb5\xd6\xcd\x5e\xd9\x5e\x64\x14\xbb\x03\x15\x49\x92\xe2\x24\x49\x56\x45\x19\xef\xdd\x1c\x44\xb1\xa0\x14\x87\x26\x29\x72\x10\x60\xb8\x99\xa6\x40\x24\xb4\xb4\xbf\x83\x0e\x27\x57\xcd\x8a\x21\x67\x5e\x1b\xe0\x69\x84\x75\xde\x17\xf9\xf6\x6b\x40\x81\xd2\x7d\x3d\x14\xbe\x13\x3c\xf7\x5c\xbc\x10\xc7\xfa\x05\x59\xbe\xbd\x4f\x3f\xbf\x7f\x7c\x17\x1c\xdf\xfd\xfc\xfe\xa3\xc7\x65\x59\x55\x25\xd5\x5a\x1b\x45\x91\x44\xce\x3a\xa1\x34\x2b\x14\xc9\x17\x21\xf3\x8c\x7a\x1d\x91\x94\x52\xd5\xa9\x73\xeb\x09\x85\x55\x8f\x6a\x45\xcb\x82\x49\x35\xd5\x69\x9a\xb1\xfd\xcc\xd4\x96\xf3\xfd\x2b\xae\xda\x22\x50\xf7\xf7\xc3\x7b\x07\x7d\x70\x02\xa9\x2e\x0e\x64\x0c\x0d\x28\xd4\x17\x07\xd2\x0a\xf5\xa8\xd0\xd0\xae\xa6\x72\x49\x50\x11\x68\x26\x39\xc3\x5c\x42\x3f\xca\x71\x29\xa1\x82\x59\xa2\x78\x8f\xbd\xb7\x58\x37\xfa\x3d\xbe\x94\x63\x65\xd6\xce\x98\x67\xde\x87\xe8\x5f\x73\x29\x83\x7e\x4d\xdd\xe2\xf3\xec\xee\xf5\xaa\x6d\x4c\xbc\x26\x60\x37\x45\x8c\x97\x63\xf2\xf6\xd5\x98\xbc\xff\xe8\xa5\xb2\x2c\x29\xa9\x84\xd0\x52\x50\x54\x4d\x10\xa3\x34\xc7\xaa\x2c\x3a\xce\x4b\xe2\x75\x44\x95\x94\xaa\x56\x9d\x3b\x8f\xcb\xd7\x03\x92\xe1\x6a\xc7\xf8\x73\x37\x3c\x6e\xfb\xc7\x3f\x5c\xf5\x2c\x9c\xb7\xf7\xd7\xc5\xb6\x83\xfc\x0e\x8f\x3f\x1d\xdf\xdd\x64\x66\xff\x23\x7a\xfa\x4a\x75\xf5\xe1\xa3\x41\x75\x62\xc2\xc8\xcf\xbf\x18\x09\x0d\x47\x19\x03\xe9\xd5\x26\x1c\xd1\x40\x21\x6f\x04\x38\x25\xaa\x50\xe8\x66\x92\x2a\x26\xd6\x48\x94\x92\x89\x43\xd7\x26\x04\x2b\x20\xd0\x30\x94\xa3\xb2\x98\xc2\x68\xa1\x5a\x0c\x43\x25\x8b\x5e\x0a\xac\x25\xe3\x15\x36\x8a\x89\xed\xbc\x6f\xdc\xf0\xa8\x83\xec\xc7\x3e\x84\xc5\x3e\x5b\x1f\x22\x07\x6a\xa3\x0e\xca\x59\xc2\x79\xb2\x36\x2e\x81\x30\xc8\x34\xcc\x1a\x66\x51\xc6\x75\x42\x4f\x1a\x45\x3b\xff\x01\x43\xbf\x8b\x71\xde\xc3\x3d\x54\x19\xc9\xa4\x89\x8d\xac\x94\x41\x82\xf3\x49\x4e\x01\xb7\x60\xf0\xb6\x64\x52\x96\x17\xa7\x1c\x7a\xb6\xed\xbf\xd2\xed\xec\x9e\x7e\xf7\x62\xff\xfd\xf5\x16\x51\xf7\x08\x6b\xdb\xb2\x56\xc6\xc0\x20\x49\x86\x16\xda\x03\xde\x62\x46\x05\x53\xa6\x70\x66\xa2\xd8\x12\xe4\x22\xbf\x77\x9b\x23\xb9\xad\xe7\x5b\x07\x95\x5d\xcf\x7d\x65\xd7\xf3\xdc\xd6\xba\x95\xeb\xe4\x20\xd7\x5c\xb0\xdd\x8b\x7f\xbe\xa2\x38\xae\x49\x8a\xdb\x44\x79\xf3\xf6\xc1\x0b\x4f\x6a\x9e\x0d\xaf\xca\x52\x51\xc1\x16\x32\xed\xf0\x09\x55\x76\x8d\x6e\xe4\xd9\xf1\xd8\x6c\x18\xc2\x48\x39\x0e\x3a\xcc\x17\x6c\xf9\x60\xf6\xbd\xe4\xcd\x7e\xa5\xc3\x2c\x5b\x59\x55\x4c\x6e\x01\x25\x2c\x8b\x3c\xb5\x5f\xf4\xce\xb7\xdd\x5e\x64\x90\x1d\x62\xe7\x37\x27\x73\xfe\xf9\xca\x2a\xf9\xdc\x8b\x6e\x41\xb8\xbf\x7d\xb8\xbb\xff\x86\xc9\xfa\xfe\xce\xf6\x2c\x1d\x7e\xfb\xf0\x10\x1c\xb7\xf3\xe3\xf0\x2d\xb3\x14\x47\x2c\xcf\x54\x92\xa0\x05\xc6\x1a\xc5\xb8\x24\xc0\x08\x56\x59\x28\xa3\xf2\xd4\x53\x60\x0a\x9f\xfa\xd9\x23\x86\x2a\x56\x23\x47\x01\xb3\x67\x8a\x42\xce\xfa\xfc\x2f\x5f\x60\x92\x16\x99\x30\xa5\x4a\xb2\x75\x2c\x93\x38\x29\x52\x8e\x8b\x52\xb8\x49\x21\x49\x3d\x73\x2e\x2b\x4a\x17\xce\x39\x68\xce\x6d\x6f\xb9\xd5\x61\xd5\x96\xeb\xef\x57\xcb\xe2\xff\x9d\x2a\xca\xc3\x77\x8d\x7b\x4f\xf7\x4f\x0f\xde\x8b\xfe\x10\xbf\x31\x71\x8c\x52\x44\x28\x74\x30\x4e\xd0\x33\x64\x32\x97\x2d\x6e\xb6\x0e\xa5\x2a\x49\x52\x51\xbc\x9e\xdc\x78\x24\xaa\xe9\xe4\xe4\xd1\x5e\x28\xde\x07\x22\x4b\x52\x98\x8c\xa9\x51\x0e\x7d\xcb\x50\x7c\x71\xd4\xa8\xd7\x85\x6d\x07\x30\x41\x27\x3d\x42\x41\x60\xac\x79\x3f\x74\x63\x39\xee\x5a\x1f\x3e\xbe\x90\x63\xe5\x16\x57\x0f\xd0\xb6\x84\x59\x2f\xe2\xf1\x20\x75\xab\xd4\xca\x64\xeb\x16\xeb\x80\x86\x95\xe5\x6e\x09\x99\xad\x79\x5d\x88\xd7\xfe\xe8\x33\x68\x52\xf6\x33\xea\xfb\xcf\xcc\x17\x12\x2c\xa8\xba\x7e\xe6\xfe\xe9\xfa\x99\x77\xf7\x5e\xad\xdc\xc4\x98\xcf\x5a\xbb\x09\xaa\xa0\x9b\x21\xc7\x48\x58\xfc\xcd\x72\x21\xc7\x08\x0d\xb7\xcf\x3c\xdf\xe7\xde\x6b\x6a\x37\x36\xe6\xb3\x34\x6e\x8c\x06\xe0\x28\x5d\x27\x8a\x3a\x18\xf7\x3a\xfd\x74\xc1\xc7\xd0\x9b\xaf\x9f\xbb\x7e\x66\x7b\x05\x95\xb1\x84\x5d\xa9\x41\x89\x3b\x9d\x2b\xe2\xe1\x95\x78\xdd\xb9\xd8\xf1\x20\xd9\x05\x07\xa3\x37\xfe\xe0\x73\xb9\x31\x9f\x17\x83\xa6\x1a\x4d\xae\x39\xd7\xa5\xe7\xac\xda\x33\xe7\x1b\x77\xd6\x85\xd8\xf5\xf6\xfd\xe7\x1a\x63\xce\xa9\xd9\x9c\x25\xe2\x0f\x9f\x05\x3b\x44\x5f\x64\x90\xfc\xeb\x74\xed\x89\x42\xca\xe6\xd3\xff\xf0\x42\xfd\xe7\x19\x08\x73\xfc\xbd\xee\x0c\xb4\xfd\x2f\xff\xc9\xd2\x1c\xfd\xe2\x3b\x22\x47\x1a\xb5\x25\x14\x90\x43\x0b\xb4\x72\x71\xe5\xa5\xd0\xba\xa7\x35\xc6\x2c\x49\xb3\x22\x4f\x6c\xb3\x46\xeb\x9e\x10\x41\x31\x83\x19\xba\x55\x0a\x1b\x92\x16\x81\x22\x69\x53\xaa\x6a\xe8\xb8\xac\x07\xc5\xf5\x52\x6d\x11\x63\x31\x69\x0e\x1d\x57\xdc\x54\xbc\x6c\x99\x60\xb6\xb7\x30\x3f\xea\x40\xbf\x9e\xd7\xff\x46\x63\x23\x91\xa4\x48\xa0\x81\x40\x0a\x18\x3a\x20\xd4\x95\xf5\x57\x6b\xb3\x34\xc3\xc5\xef\x58\x3b\x54\x08\x07\x1a\xc7\x91\x24\xb2\x6c\x4c\xc5\xeb\x5e\x52\xd9\x51\x12\xaa\xa8\xa8\x25\x85\x99\x72\x2e\x4b\x56\x6a\x2a\xe8\xb6\xaf\x34\x17\x73\x2c\xfd\xe4\xb9\xa6\xb7\x23\xf9\x6e\x1d\x1d\xd7\xaf\xbf\xde\xbe\x17\xfe\xfc\x25\x32\x5e\x73\x26\xa0\x9e\x69\x72\xbd\xc8\x73\x56\xc7\xa0\x0e\x0a\x3f\xb1\x4c\xbc\x0e\x44\xf2\x24\xb6\x37\xbb\x77\x6d\xe7\x49\x19\xe4\xff\x83\xee\x11\xe4\x90\xaa\x16\x72\x48\x65\x2f\xb7\xb7\x9d\x5f\xc7\x9e\x59\xfb\xf9\xf2\xe7\x67\x1f\x63\xdb\x50\xfe\x06\xfd\x80\x00\xc1\x9d\x18\x2c\x20\x2b\x54\x7a\x04\x25\xa8\x2a\xa1\x86\x6e\x2d\xfc\x3c\x14\x3a\x25\x31\xcd\x8a\x3c\x84\x84\x42\x56\x22\x59\xc2\x1c\xf0\x12\xc6\x4e\x69\x14\xc3\xac\xb5\x41\x19\x68\x28\xc7\x50\x85\xec\x04\x94\x2a\x82\x12\xc7\xf1\xfc\xc4\x99\x8e\x2c\xc8\xbe\xe6\xdc\x5e\xaa\x25\x3e\x5a\x07\xfa\x4a\x53\x95\x78\x04\x54\x14\x23\xaa\x20\xd3\x73\x1c\x41\x6f\x5d\xe5\xed\x15\x64\x8a\x92\x2f\x73\x55\xf9\x51\x59\xae\xfd\xb2\x8a\x65\xf3\x25\xc9\xb3\x56\xf9\x1f\x2c\x92\xf0\xcd\xfb\xa3\xe3\xfd\xfa\x7e\x73\x18\xbc\x57\x7d\x5f\x37\x56\xac\x43\x77\x5a\x24\x2c\x03\x0c\x5a\x41\xcd\x50\x9a\x7b\xb4\xe2\x98\xc6\x14\xa7\x69\x08\x26\x9a\x66\x76\x6a\xe3\x3e\xe0\x10\x9f\x18\x8a\xd1\x54\x24\x10\x41\xcb\x50\x02\xed\xea\xc0\x12\xe9\xa8\x71\x53\x30\xc0\x14\x97\x88\xd8\x33\xd3\x73\xdb\xef\xed\x70\xff\xb2\x1d\x4b\x3f\xc9\xa9\x87\x49\x09\x18\x38\x0a\x53\x2f\xa1\x3c\x2f\x13\x5a\xa4\x71\x08\x5d\x38\x8c\xac\x6f\xe2\xe6\x6a\x46\x88\x4e\x38\x81\x10\x3a\x6b\xc6\x79\xb9\x38\x91\x8e\xb4\x5b\xdc\xcc\xc0\x96\xfe\xdd\xf1\xae\x9a\x60\xec\x07\x76\xbc\xf1\x5e\x95\x5b\x6e\x76\x04\x49\xd7\xc9\xbe\x85\x93\xaa\x60\x62\x73\xea\xce\x25\x2b\x48\x52\xe2\x38\x0e\x61\x0a\xdb\x9e\x35\x26\xd2\x01\x83\x68\x62\xc8\x41\x33\x4e\x20\xde\xdc\xa5\x14\xda\xf3\xbc\x0d\x06\x77\x29\x68\xe0\xcf\x56\x6c\x73\x8e\x3c\xcf\xb9\x3f\x7d\x3f\xe7\xfe\x09\x7d\xf8\x5f\x6c\xa3\xf4\xef\xcc\x38\x03\xfd\x3e\xe3\x14\x4f\xda\xed\x99\x24\x14\xd2\x12\x6d\x8b\x74\x9b\x6f\xd3\x36\xdf\x22\x98\x95\x36\x28\x85\x06\xd8\xa0\x92\xaa\x01\x59\xaa\xe2\x8a\x55\xe4\x17\xe2\xeb\xa0\xda\x73\xf9\x6f\xbf\xcb\xa7\x7c\xb4\x09\x95\xb7\x47\xf7\x03\x77\xa5\x59\x16\x2a\xad\xa3\x96\xa7\x2b\x6f\x6a\xa6\xab\xfa\xe0\xa0\x0a\xb4\xfe\xd2\xd9\xd8\x33\xcd\xfd\xb8\x9d\x60\x29\x91\x73\xda\xaf\x4f\x2f\xcc\x9f\xad\x6e\xdb\x2b\xdc\x99\xf3\xf6\x1b\xdc\xd9\x3f\xa1\x2b\xee\x0c\x4d\x26\xc9\xdc\x66\x8d\xd4\x16\x83\xc4\xee\xb0\x76\x55\x39\x0b\x85\x23\x13\xcb\x53\x03\x63\x5d\xa3\x01\xe2\x40\x24\x8c\xa9\x45\x56\x28\xbc\x38\x7c\x15\x3c\x4f\xe2\x42\x64\x0d\xa3\x15\x69\xdd\x67\xbd\x69\x9f\x07\xf9\x8b\xac\xc0\x6f\x1f\xac\x77\xec\xa2\x4f\x6f\xde\xbe\xf1\x98\xa1\xa2\xd1\x5c\xea\x66\xf3\x82\x69\x3d\xc1\x22\x4e\x3d\x0b\xf2\x74\x1d\xa0\x81\x05\x66\xb1\x9c\x40\xc1\x24\x50\x81\xf8\x36\x7d\x29\xcc\x70\x42\x99\xe3\xba\xf5\x25\x3f\xd6\x41\xe8\x44\x36\xd3\x7b\xef\xa2\xaf\x84\xf1\xae\xf7\xf0\xf8\xe6\xed\x9b\xb7\x1e\xf3\x4c\x06\xa7\x06\x65\x25\x4c\xc3\x0c\xaa\x44\x62\x9a\x4b\xb2\xe0\xae\xcf\x82\x70\x55\x90\xc3\x38\x98\x0e\x15\x30\x74\xb2\x45\x05\xea\xd0\x04\x16\x98\x8b\xac\xe6\x08\xbb\xe0\x23\x0e\x62\x27\xda\xbb\xf4\x23\xf7\xf8\xfc\x58\xde\xdc\xdd\xef\x53\xc5\x6b\x3c\x9d\x93\x82\x57\x34\xe5\x3c\xc7\xe9\xea\xb8\x3c\x83\x11\x44\x81\x74\x10\x9f\xf3\x55\x95\x45\xa4\xa3\xd2\x35\x6e\x0d\x52\xc2\x3c\xea\x69\x1b\x9b\xfa\x52\x1c\x43\xef\xb4\x2b\xb2\x46\xaf\x4a\x7b\x37\xfd\xf2\x31\xc8\x72\x59\x0b\x9e\x2a\x25\xe2\x6c\x55\x31\xb4\x20\x39\x62\x28\x4e\x56\xe9\x9d\x56\x01\x5c\x24\x75\x52\x1a\x97\x00\x87\xb4\x11\x35\x92\x88\x3a\xae\x3b\x3a\x99\xbf\x04\xe2\x5a\x1f\xb2\x6d\xc6\xd6\x3d\xff\x74\xeb\x3e\xfe\xf4\xf1\xed\x7e\x4a\x55\x4a\x34\xbc\x4a\xdb\x53\xca\x19\x17\x89\xa2\x8a\xa8\x3a\x95\xf1\x04\x73\x82\xb2\x43\x98\x83\x82\x25\x49\x39\xc9\x44\xb3\xa4\xb1\x3c\x21\x91\x42\x3d\x26\xf4\xac\x45\x99\xeb\x7c\xaf\x23\x2c\x97\xc6\xf2\x4e\xff\xb8\x67\xc1\x1b\x78\x21\x71\x55\xa2\x32\xcd\x28\x51\xbc\x0d\xb8\x69\x49\x63\x20\x3c\xab\x0c\x97\x5a\x5d\x7b\x16\x6c\x9e\xcd\xef\x6c\xae\xea\xef\xbf\xe6\xaa\x3c\x9b\xb3\xf6\x53\x0d\x4c\x20\xde\xab\x18\xcb\x22\xe0\xe7\x7a\x35\xdb\x42\xa4\x6e\x84\xfa\x18\x34\x8c\xf9\x16\x4b\x22\x37\xbf\x94\x7e\x1f\xc4\xfb\xac\x78\x11\xa8\x3f\x6c\x57\x7b\xf3\x47\xf4\xe0\x2e\x68\xa0\xb2\xc0\x49\x49\xd2\x94\xc1\xcc\x97\x3c\x88\x3f\x8f\xc0\x22\x15\xcd\x7e\x0d\xce\x5a\x41\x45\x91\x72\x0b\xd7\x71\xbc\x83\x73\xed\x2d\xfa\x1b\xe7\xcf\x96\x07\xe3\xaa\x03\xbd\xeb\x60\xd9\x5f\xf1\x71\xe7\x02\xb9\x7b\xb8\x7b\x78\x7a\xdc\x8b\xb0\x87\x70\xb2\xe5\x98\xd3\xaa\xc6\x09\xd1\x2c\x96\x71\xaa\x2e\xce\x38\x9a\xb6\x4d\xf2\x48\x46\xe9\x41\x55\x65\xc6\x84\x5a\x67\xd9\x34\x49\xa3\xe4\x28\xd7\xd6\xc5\xd2\x6d\x98\xca\x34\xbb\x71\x8d\x13\xf7\x64\xef\x6d\xf3\xe7\x6f\x9f\xef\x7d\xb0\xb7\x7d\xf8\x69\x7b\x73\xaf\xe5\xd5\x8f\x9b\x0b\x72\x05\x6a\xb0\x29\x49\xb5\xbd\x3d\x32\x32\x49\xf5\x1c\xf6\x63\xb2\xb0\x21\xed\x86\x10\x16\x54\x65\x83\x35\xe9\x66\x44\xba\x19\xc0\xa9\x04\xd1\x49\x8d\x12\x49\xb9\x6c\xcc\xb3\x1d\xc8\xa3\x97\xfc\x58\x06\xf1\x7e\xe2\x7f\x5d\x04\x9f\xde\xdc\x6d\x6b\xe2\xc3\xc7\x37\x77\x0f\xde\xe4\xf1\xb0\xc8\x74\x25\x23\x55\xe5\x51\x0e\xaa\x1e\x99\xec\x87\x20\xfe\x3c\x9c\x9a\x44\x27\x12\x11\xaf\x5b\x9d\xb5\x9e\x85\x72\x43\x6f\x73\x00\xbd\xee\x82\x8f\x34\x88\xf7\xd5\xf5\xb7\xe8\xd5\x65\x3d\xbb\xe1\xfb\xb1\x87\x43\x61\x4a\x16\xf1\xb2\x88\x0b\xe8\x54\xcf\x8c\x0a\xa7\x20\xfe\xdc\x81\x88\x55\xc4\x11\xf5\xda\x35\x5d\xcd\xc5\xe1\x9d\x9b\xbb\xfd\xde\x83\x59\x78\xe6\xd0\x3b\xff\xf0\x0a\xc7\xb7\x05\x96\xc2\xed\xe1\xd4\xe9\x6d\xc2\x90\xc4\x48\x98\x0f\xbd\x3e\x47\x59\xae\x44\xa9\x93\xc4\x8f\xf7\xdf\x97\x5f\xc8\x51\x5e\x31\x78\x37\xb5\xb3\x97\xa8\x39\x9f\x9e\xfc\x68\x55\xd4\x55\xf5\xc9\xa2\xe6\x54\x9a\xaf\xf8\x50\x69\x0d\xf8\x7c\x82\x36\x36\x31\x35\x6e\x7a\xcd\x4b\x10\x4f\xee\x63\xf7\xcd\x3a\xb7\x33\xd2\xf9\x23\x7a\x68\xdc\x31\x93\x0c\x17\x69\x59\xe2\x28\x5d\xe0\x24\x91\xb3\xed\x1d\x78\x55\x2a\x6e\x92\x6a\xf1\xe3\xf5\xb4\x72\x60\x0c\x09\x37\x75\x77\x4d\x67\xb1\xc5\x5e\x5e\xee\xbc\xb7\xd9\xf2\xc7\xe0\x35\xbc\xfd\xd7\x17\xba\xaa\x6e\xdf\x93\xd2\x53\xf5\x09\x15\x88\x11\xc8\xa0\x01\x0d\x09\x45\x0d\xca\x5a\x51\x6f\x6b\x68\x90\xc3\x2c\xbd\x9c\x57\x72\x90\x34\x35\x58\x2a\xac\x0b\xca\x1a\x59\x48\x9d\x19\xca\x2c\x6f\xa5\x3b\xd9\x5a\xce\xfb\x6f\x79\x59\xbe\x36\x78\x0d\xee\x64\x2c\x14\x4e\xad\xcc\x2b\x96\xd1\xc3\x2b\x75\xcd\x9a\x1c\x46\x63\x54\xad\x8c\x52\x46\xd5\x8e\xe3\xfa\xd4\x8e\x6f\x78\xb5\xdd\x66\x27\x9e\x9f\xfe\xc7\xfd\x0c\xbc\xbb\x47\x8f\x1f\x9f\x1e\x7c\xea\xa5\x60\x10\x09\x2b\x55\xa9\x48\x57\x69\x1a\xad\x4a\xd5\xd0\xa3\xbe\x09\xdb\x20\x94\x50\x9f\x31\x4c\x09\x8f\x38\xca\xbc\x68\xe5\x1e\x3f\xcb\x7e\x74\x90\x37\xd9\x7c\x15\xff\x91\xae\xe3\x6f\x2f\x74\x1d\xfd\x0a\x25\xca\x4a\x0d\x09\x30\x18\xa5\x7c\xa6\x1c\x06\x4b\x95\xdc\x23\x0c\xd3\x5e\xbc\x51\x70\xc2\x0a\xc8\xc5\xb1\xb2\x8e\xfc\xe2\x48\x94\x22\xad\xd0\x55\x7f\x3f\xf5\x53\x1b\x07\xff\xed\xcb\x13\xf6\xe3\xc1\xd1\x71\xea\x16\xab\xc8\x31\xd3\xfb\x71\xc9\x49\xd5\x6f\xff\xff\x85\x1d\x6b\x6f\xbc\xe6\x66\xbe\x39\x86\xff\xff\xfb\x31\xec\xd7\x2e\x87\xb8\x24\x5d\x55\xe5\x61\x1d\x8b\x56\x2f\x46\x21\x05\xd4\x1b\xd9\xf3\x69\xdb\xd1\xeb\x69\x8b\x10\xbb\x14\x47\x8d\x76\xcc\xdc\xdd\x37\x19\x84\x7f\xb0\x6c\x2f\x4f\x41\x1c\x17\x65\x16\xea\x88\xf6\x8a\xac\x3c\x94\x9a\x2a\x8a\x28\xf4\x69\x92\xb1\xb8\xa1\x45\x35\xf6\x4d\x22\x52\x39\x3b\xa1\xb3\xad\x79\x1e\xa8\x17\x0c\xde\x1f\x9c\x7f\x71\xfe\xdb\x55\x61\xf4\xee\xfe\xdd\xb5\x0e\x6c\xb7\xa4\xb7\xb6\xdc\x71\xff\xa7\x5b\x4a\xe2\xf1\xdd\xfd\xd3\xdb\x17\xac\xca\xc1\x0e\xc8\xbd\x7b\x7c\xf7\xf1\xd7\x7d\xea\x58\xb0\xf6\x87\x23\x5f\x4f\x68\xf8\x8c\xb5\x10\x6e\x17\xc5\x3a\x4d\xf8\x36\xd8\xbb\x00\xd3\x82\xa8\x42\x05\x29\x2f\x0e\x4c\x18\x0f\x45\x24\x22\x9c\xc1\xa9\x2f\xd5\xfc\xa5\xdb\xf9\xa7\x9c\x2e\x9e\xa1\xc7\x41\x2c\x39\x34\x7a\x3d\x6d\xd3\x5a\xbb\x8e\x7b\x4a\x93\x2c\x2f\x2e\x0e\xe7\x9c\x4f\x56\xe7\x10\x46\x5e\x64\x24\x4e\x32\x92\x8a\x2c\xc9\x09\x62\x22\x23\x84\x35\x71\xca\xd3\x34\x77\x5c\x07\x5f\x94\x47\x0f\x8b\xd5\xea\xb5\xbb\x86\x6b\xfb\x34\x1f\xee\x6c\x5e\x68\x0b\x75\x85\x3b\x41\x93\x97\x48\x41\xa3\x19\xeb\xab\x05\x15\x6d\x7b\x58\xf4\xc5\x99\xce\x5d\xe3\x65\x23\x43\x25\x6a\xbe\xf0\x6d\x81\x22\x8f\x7b\xd4\xe6\x8d\xff\x60\x23\xdd\x37\x87\x6d\xd6\x1d\x3f\x38\x07\x62\xd2\x01\x85\xd5\xdc\x37\x27\x86\xb2\x40\x64\x14\xa6\x41\x0f\x28\x81\xbe\xe3\xdb\x11\x66\xb1\xc4\xf8\xd8\x7a\xd3\x35\xfe\xd8\xb7\xd8\xa7\xbb\x6f\x94\xcb\x82\x04\x4e\x4c\x08\x4e\x5d\x12\xa5\x71\xb4\xc5\x86\x92\x63\xaf\x98\x60\x84\x6d\xf7\x46\xe9\x8c\xc4\x99\xe4\x51\x66\x92\x81\xe6\xd4\xf1\x9d\xc9\xd3\xc7\xd0\x6a\x39\x5e\x33\xad\x6f\xaf\x9c\x7c\xbf\x5e\xbf\x4e\x6e\xb3\x12\x4b\xde\xe4\x8e\xdb\x3f\xeb\xed\x41\x04\xd9\x5a\x69\x54\x69\xfb\xfe\x8c\xa3\xd4\x5e\xf4\xfd\x5c\x7b\xba\xbb\xb9\xea\x07\x99\xa9\x6d\xe2\x46\xec\x34\x55\x6b\x17\x0d\x0b\x5b\xea\xd0\x8b\xd6\x22\x4b\x70\x93\xcc\x82\x54\x6e\x09\x12\x3a\x2e\x18\x4a\x6d\x6f\x97\xef\x54\x17\xe6\xe7\xcf\x71\xec\xff\xef\xb5\xa6\xcc\x9d\x45\xc2\xbd\xbf\xa9\xd9\xfc\xf6\xa1\xf2\x86\x73\x56\x78\xf8\xdc\x1a\x5b\x06\xcd\xc7\x3c\xd1\xb9\xda\x33\x86\x94\x66\xb9\x9f\x28\x0e\x58\xd6\x60\x2a\x95\x54\x2c\x17\xb1\x2a\x73\x13\x85\x65\xb9\xf9\x5f\xbe\xf6\x1d\x8b\xf1\x71\xde\xee\xf4\x40\x8f\x4f\x8f\x77\xf7\xb5\x1a\x74\xaf\xcf\x75\x90\x2c\x88\x40\xb3\x00\x77\x90\xa7\xec\x5e\x12\xbf\xf8\x7d\xbf\x6a\x29\x5d\xf1\x10\x81\x4a\xb2\x38\x32\x61\xc9\x15\xbe\x38\x27\xb1\x1d\x7c\x79\x9a\x64\x75\x36\x30\xcc\x0e\xf4\xbc\x00\x01\x41\x51\x8e\xb4\xa7\xb7\x3d\x63\xf3\x2b\x86\x20\xba\xea\x42\xbf\xff\x5a\x79\x7e\x41\xfc\x18\xcc\x61\x18\xc6\xb1\x0e\x4b\xce\xf2\x65\xae\xda\x20\xfa\x9c\xe6\x61\x88\x4f\x29\x9c\x44\xc1\x0e\xd5\xda\xad\x15\xd4\x12\x25\xae\x72\xd5\x8e\xd3\xbf\x70\x4f\x7b\x6a\x3f\xfb\xee\xee\xef\x7e\xb1\xe3\xb5\x05\xac\xda\x73\xd6\x11\xa5\x53\x02\x33\x28\xe2\xa6\x6b\xed\xa9\xf5\x04\x0d\x26\x9a\x12\xec\x92\xd3\xce\xcf\xe0\x67\xde\xb8\x8f\xcb\x35\xdf\x75\xcd\x76\x99\x5e\x9d\x1b\xdd\x05\x1c\x08\x22\x10\xa3\x09\x5a\xc7\x71\x91\x44\x61\xb0\x04\xca\x22\xa5\xbe\x45\xcd\xbd\x86\x6d\x7e\xfa\x0a\xdb\xf4\xb0\x89\x33\xb7\xae\x74\x8e\x63\x92\xe7\x69\x74\x16\xfe\x40\x65\x56\x24\x38\x4f\x93\xe8\x4b\x86\x78\x1a\xd5\x8a\x49\x13\xa8\xac\x28\x81\x9b\x48\x46\xb8\x87\x08\xaa\x3a\x52\x11\x1e\xbd\xa8\x84\x9e\x54\x9c\xe1\x6d\xde\x98\x8b\xf1\xba\x20\x7d\x91\x97\xd8\x09\xff\xee\x76\x76\x21\x5b\x93\xbd\x7f\x7b\xf7\x70\xe7\x75\xb6\xe7\x73\x39\xad\x8e\x9e\x67\x74\x82\xf8\x74\x0a\x52\x05\x6a\xe5\xa0\x54\x20\xc1\x41\xec\xac\x51\x75\xb6\xb5\x42\xbb\x16\x2b\x5f\x1f\x8b\x6b\x8e\xf7\xfd\x6d\x6b\xf7\xa9\xca\x5c\xb1\x66\xb8\xac\x9a\x80\x67\x95\xaa\x48\xd9\xec\xbe\x43\x67\xb1\x22\xd4\xb2\x35\x3c\xde\xfd\x64\x43\x5a\xf7\xf0\xe1\xe3\x3f\xa2\x03\x33\xfd\x28\x4f\x94\x82\xa1\x7a\x2c\x02\xba\x62\xba\x56\xb3\x40\x29\xaa\x21\x5d\x04\x43\x15\xb2\x9c\x5a\xae\xb1\xb1\xcd\xce\xdf\xe2\xa2\x0f\xbf\xbc\xb9\x7b\xfc\xe9\xdf\xa1\x9f\xfe\x11\xbd\x3f\x3a\x87\x8c\x40\xc6\x50\xbe\xd4\x61\xd4\x4c\xad\x84\xda\x15\x90\x82\x12\x27\x57\x7b\xc5\x3c\xf5\xf9\x3a\x43\xaf\xc4\x1e\x63\xbb\xde\x76\x2d\xe5\x77\xce\xbf\xb7\xdd\xfa\x3b\xed\xd0\xe1\xc3\x2f\x9f\x6e\xfa\x12\xcf\x14\x93\x87\x67\x4c\xd7\x16\x18\xb4\x46\x64\xa9\x18\x21\x26\x28\x69\xea\x36\x66\x25\x9c\x50\x9d\x66\x9c\x64\x88\xaf\x0b\x46\xbd\xa2\x42\x31\xc6\x45\x03\x6d\xe9\xa6\x2e\x8d\x12\x4c\x72\xc8\x3a\xce\xba\x34\x92\x95\x96\x25\x2e\x2a\x2e\x95\xca\x3a\xc1\x95\xac\x85\x11\xe2\x5a\xe7\xaf\x7c\xe7\x58\x07\xd2\xf6\x50\xbd\xbf\xaa\xc1\x6f\xee\xca\x81\xf1\x28\x9e\x50\x48\x60\x99\xfa\x99\xa0\x24\x90\x55\x1c\x8f\x5c\xc9\xd3\x22\x85\xdd\x23\xbc\x6d\xef\xd9\x7e\x9f\xff\x60\x4f\xa4\x6b\x45\xee\xf1\xea\x17\xbf\xfa\x6f\x47\x1e\x1e\x9e\x1e\x8e\xef\xde\x3e\x3d\xbc\xbb\x7b\x7c\x7a\xf0\x5b\x9d\xa4\x23\x11\x38\x5f\xa0\xb5\x7c\x71\xdb\x8b\xac\xa9\xca\xb2\xea\x84\xaa\x53\xb4\x2c\xcb\xe2\x77\x49\x55\x72\x42\x2b\xd9\x8a\x4e\xb4\xb2\xf4\xe2\x22\x67\x4b\xd3\x26\x1a\xba\xae\x83\xbe\xdd\x7c\x62\x6f\xb6\xfe\xd0\xeb\x33\xdf\xdf\xdc\xed\x2d\x78\xc6\xaa\xea\x03\x9e\xd2\x52\x2a\x45\x27\xc7\xdb\xf6\x4c\x8f\x5a\x7f\xe4\xcf\xcf\xfd\x72\xf7\x37\x8e\xb9\x77\xcf\x84\x76\xdb\xfb\x2d\xc3\x54\xa1\x4c\xa3\x0c\x06\xdb\x48\x9a\xc1\xa0\xad\x20\xe2\x82\x42\x18\xba\x9b\x48\xfc\x61\xa8\x6b\x5d\xaf\x49\xa3\x60\x44\xa9\x6a\xdc\xa9\x86\xd4\x40\x5e\x5f\xf5\x6e\xbc\xfa\xdf\x7a\xcf\x52\x59\x35\xe4\xcd\x25\x2a\xa1\x56\x50\xa3\xd2\xf2\xd6\xd5\xc3\x8d\xf2\xf1\xd0\x37\x8d\x6c\xd7\xb4\x91\x30\xa0\x4c\x36\xee\xd8\x42\x5c\xdb\x7b\x22\x74\x72\xf4\x61\xf6\xf5\xed\xd9\xfa\x56\xd9\xe7\xf8\xc1\xf1\xba\x3a\xce\x51\xd4\xb3\x61\x94\x27\x81\xb4\xaf\xd3\xda\xcc\x27\x83\xa2\x01\x4e\x93\x40\xca\xf6\xbe\xcf\x5e\x14\xec\x9c\xa2\xb7\xb8\x75\xdb\xec\x5f\xb2\x66\xbd\xb5\x62\x5f\xae\x50\xfd\xdc\xe9\xf4\xe2\xc0\x90\xd5\x5a\xca\xa4\x66\xba\x32\xbc\xc4\x2c\xd9\x7e\x56\x20\x7c\xc8\x2c\xfd\x55\x96\xf3\x2a\x17\x0d\x72\xe2\x48\x9d\x10\xcf\xc0\xf4\x61\xc4\xcf\x42\x55\xb8\xc6\x36\x47\x51\x1c\x6b\x37\xbb\x9e\xd3\xb6\x78\x61\xc3\xfa\xae\xce\x51\xe4\x56\x78\x15\xb0\x5c\x9c\x75\x22\x2e\x77\x33\x5c\xc1\x49\x1a\xeb\x2f\x2a\xad\x6f\x31\xeb\x51\x06\x95\xf3\x87\x5b\x87\xf3\x0d\x98\x80\x1e\xdf\x59\x77\xfc\xee\xc1\xef\xdc\xfe\x4b\x8a\x98\x71\xcb\x35\x34\x88\xa3\x88\x5d\x1c\x38\x19\xbf\x85\x93\xd6\x5b\x44\xa2\x21\x1e\xb4\x36\x35\x5f\x97\x6d\x0c\xdb\x4b\x79\xd4\x7e\x73\x8d\x82\xdf\xbd\x39\x1c\x1d\xeb\xb2\xde\xf9\xa9\xe9\xdd\x90\x41\xd2\x2a\x88\x4a\x97\xf9\x0d\x74\xf9\xda\x2d\x35\x4a\x50\x0b\x18\x26\x85\xd8\x1e\x1f\xb8\xfc\xba\x0f\xfd\xfd\x55\x91\xe3\xba\x13\x79\x3b\xfa\x63\x2f\x7b\xd9\x6b\x1e\x8c\xea\x5b\x3a\x53\xbe\x94\xa8\x82\x44\x8b\x52\x66\x05\x86\xa9\x44\x38\xa0\x6b\x4e\x57\xda\x69\x7b\xf9\x1c\x66\x89\x5a\x57\xb9\xc5\x3a\x36\x4d\x4f\x38\x07\x67\x3b\x7b\x7a\x57\x5d\x7b\x6e\xa5\x4f\x9d\x7f\x6f\x99\x17\x9e\x7b\x41\xdf\x5b\x75\xff\x97\x1a\x36\xe8\xfe\xdd\xde\x2e\xed\xb5\xa6\x64\x46\x32\x6d\x64\xd9\x55\x25\x10\x18\xf1\x15\x28\xb7\x26\x2e\xef\x21\x27\xa8\xd6\x90\xfa\xf4\xa4\x25\xad\xa5\xa6\x9c\xf0\xcc\x8c\xa8\x5d\x3b\x4e\xe3\x3a\xa1\x6e\xad\x20\x87\x85\xcf\xd6\x2f\x09\x6c\x6f\x68\x63\x7b\x98\x13\xe7\x57\xe7\x3f\x59\xe6\xb9\xaf\xb9\xfb\x6d\x5f\xf3\x6e\xfb\xdd\xc3\xb3\x36\xdd\xc3\xe1\xf1\xe3\xa7\xef\xf4\xb0\xfc\x45\x47\x31\x72\x10\xa6\xd0\xc1\x32\x42\x4f\x90\x19\x50\x19\x67\x3a\x8f\x51\x59\x26\x19\xaa\xbe\x64\x88\xa6\x29\x41\xd9\x54\x44\x20\x5c\xad\x56\xa1\x94\x2b\x56\x71\x05\x9e\xc7\xf1\x64\x64\x3d\xcf\xb5\x38\xc1\x40\x70\x4a\xa9\x64\x54\x4a\x46\x07\x89\x21\x5f\x49\x96\xb9\x0d\x2c\x02\x94\xd5\x1a\x14\xb6\xe6\x70\xab\xab\xdc\x92\x59\xff\xe2\x1e\x62\x25\x10\xe3\x30\xf2\x12\x9a\xd2\xb4\x45\xc0\x81\x82\xea\x58\x83\x62\x18\x15\xc3\xc3\x7c\xcd\xb5\x89\xa3\x72\xe3\x5d\x0b\xff\x75\x64\xe6\x35\xf5\xe6\xcc\x79\xb9\x0d\xc9\x88\xdb\xb8\x71\xab\x5a\xad\xdb\x2d\xae\x5b\xdc\xc4\x6b\x02\xf2\x3b\x7c\x4c\xdb\x1e\xe1\x35\x4d\x23\x05\xae\x12\x5e\x66\xf9\xd8\x81\xd6\x01\xb1\xcc\x0f\x82\xc7\x3a\xc9\xb3\xcd\x81\x3b\x53\x3f\xdb\xeb\x43\xc4\x8b\xac\xa6\xe3\xdf\x7d\x53\x0d\xf4\x07\x13\x27\x68\x1b\x3b\xe8\xa1\x5f\xa0\x2b\x51\x1b\x88\x2c\xcf\xa0\x69\xeb\x6e\x3b\x6e\x4f\xd7\x78\xca\x77\xf0\x85\xf9\x45\x20\x7f\x80\xbf\x3e\xec\x02\x62\xef\x5e\x55\x8b\x9f\xee\x9f\x1e\xde\xbe\xa0\x58\x70\x73\x9d\x4d\x1d\x6b\x07\x7d\x71\x2a\x84\x4b\x97\x5d\x9c\xaf\xd5\xe4\x38\x19\x9b\x2d\xc2\x18\x22\x8b\x33\x76\x6b\x9d\xe5\xb2\x08\x64\x5a\xca\x5a\x36\x72\x32\xd5\x09\x16\x8b\x36\x2e\x74\x99\x9b\x38\xb6\x68\x63\x62\x71\xc6\x59\x5a\xf3\xd4\xfa\x05\x7e\x6c\xfb\x05\x6e\x5c\x13\xc1\xf1\x65\x95\xf3\xe3\xa7\x7b\x3f\xf6\xa8\x6a\xaa\xaa\xa2\x31\xa9\x2a\x23\x56\x12\x44\xf5\xd0\x9c\x1d\x4c\x22\x13\x27\x7e\x56\xeb\x6b\xfd\xce\x11\x47\xe7\xb0\xfc\xde\x75\xdc\xc9\x4f\xba\xb9\xa2\x25\x89\x8b\x92\x8e\xf5\xd9\x1c\x96\x66\x68\xd7\x72\xbf\x8e\x3b\xd6\xf5\xad\x2e\x47\x83\x93\x9f\xfd\xee\x75\x46\x3f\xaa\x07\x42\xaa\x2a\x26\x3c\x6b\xe5\xb9\xf5\x33\x6d\xd4\x2a\x31\x8e\x55\x1c\xbb\x8d\x2d\xe9\x5e\xf1\xa4\x3a\xc8\x9d\x7f\x77\x65\x0b\xbf\x01\xda\xf6\xf6\x6a\xdb\x5d\x1d\xd8\xfc\xe4\xdd\xd5\x97\x3b\x66\x7a\x35\x1a\x15\x09\x60\x3f\x85\x2c\xa9\x74\x9c\xc2\x09\x66\x86\x72\xe4\x84\xd3\x30\xf0\x76\xfe\xda\x5d\x6d\x94\x32\xd0\x43\x56\x75\x30\x50\x69\x39\xde\x43\x60\xd7\xee\xea\x3d\x5f\xdd\x79\x43\x90\x3a\x91\x3d\x03\x6e\xf0\x8d\x77\x3f\xed\xce\xc9\x61\x7f\xf0\x16\x65\xee\xe6\xf5\x44\x50\xa3\x21\x76\x15\x2b\x8c\xc2\xf5\x7a\x72\x3b\x98\x51\x16\x9d\x4f\x31\x22\x30\x7b\x27\x55\x08\x81\xa4\x14\xd1\x8c\x09\xd5\x62\x50\x20\x32\xa5\x75\x81\xcc\x3e\xcf\x36\xbf\x71\xd7\xaa\x8b\x6f\x2c\xcf\xaf\x94\xea\x6e\x40\x6e\x4b\xeb\xe0\xe8\x38\xe9\x35\x93\x8d\x1a\x2b\x94\x4a\x97\xaf\x52\x69\x97\x6b\x68\x03\x91\xe6\xb9\x32\x4c\xcb\xc1\x54\x0b\x68\x79\x1e\x8d\x17\xad\x8e\x92\x5b\x10\x61\xb9\x36\xf0\xa5\xf1\x23\x5b\xff\xbc\x73\xfe\xd1\xaa\xa2\xd8\x0a\xe8\xed\x66\xef\xaf\x72\x5e\x57\xf4\xf5\x37\xf7\x2d\x50\xd8\x94\xfd\x49\x8e\x14\xa5\x7d\x16\xf3\x38\x1f\x5d\xab\x1e\x89\xa1\x10\xda\x6d\x15\xb0\x40\xa5\x4c\x75\x6c\x14\xad\xac\x3a\x4e\x68\x4a\xc9\x49\x2a\x41\x28\x3d\x9b\xd2\xe5\xab\x22\x56\xb4\xef\xaa\x83\x57\x78\x83\xf5\xf1\xed\xea\xfa\xca\x2c\x71\x77\x7f\x65\x29\xb8\xce\x9e\x87\xaf\xa8\x4b\xbb\x47\x6e\x93\x49\x1a\x63\x6a\x73\x1e\x13\xaf\x02\x19\xc5\x88\x13\x9c\x16\x31\x2e\x39\xd1\xdb\x21\x0b\x8d\x4b\xd2\x2c\x70\xc0\xf6\x16\xa0\x0c\xb0\x91\x25\x5e\x2b\x52\x86\xd4\x32\xc3\x95\xdb\x4e\x84\x4b\x18\xd7\x31\x43\xcf\xf6\xf8\xe9\xff\x57\x7b\x94\xe9\x4d\x6f\xce\x2a\xf5\x3a\x28\xa3\x18\xd5\x84\xa4\x38\xa6\x54\x52\x8d\x92\x38\x02\xe9\x9a\x2c\xfd\xb7\xd8\xe3\xba\xd2\xd9\x71\xcb\x7f\xb0\x7b\xcf\x16\x44\xec\x55\xfc\x6f\xac\x79\x89\x4a\xbd\xd9\xe4\x39\x0a\xa5\x1a\x25\xfa\xcb\xc2\x0f\xe1\xaa\xa3\xd8\xcd\x31\xb6\x08\xb6\x46\x35\xb2\x51\x88\xc7\xd1\xba\x3c\x87\x97\x42\xc8\xa2\x58\x47\x42\x42\x99\x22\x09\xf1\x2e\x46\xbe\x8e\x6e\x53\x14\xb6\x46\xa6\xae\x78\xdb\x3f\xd8\x5a\xf4\x2d\x26\x7b\x1e\x9b\x1f\x0d\xcd\x6d\x64\xbc\xce\x4c\x66\x32\x67\x9a\xf9\x21\xe4\x19\xea\x31\x49\x8a\x48\x31\xc5\x34\xca\x33\xa0\xee\x90\xe7\xaf\x07\xc6\xac\x9c\x94\x21\xf9\x3a\x2e\x06\xc6\xf5\x94\xa1\x9d\xe7\xd3\xab\x2c\xdf\xde\xfe\x9c\xfe\xf3\xf7\xb6\xfc\xfe\x73\xb2\xbb\x90\x67\xf4\x62\x66\x73\x2e\x72\x3f\x83\x24\x4a\xd0\x84\x49\x8a\x23\xc9\x35\xdf\xb6\x8f\x08\x88\x3b\xe7\xf1\x7f\xf7\x51\x11\x02\xe3\x3a\x85\x5f\xe7\x8e\xf1\x62\x1b\x9f\xfd\xbc\x67\x0c\x6e\x01\xcd\xe1\xab\xff\xf8\xe9\xcd\x8e\x43\x65\xc8\x49\x32\x55\xa4\xc8\x59\x4b\x34\xa9\x9c\xb3\x32\x86\x13\xd4\xb9\xd1\x7c\x2e\x62\x19\x67\x87\x5c\xf3\x4c\x35\x8a\x66\x50\x40\x95\xa4\x42\x52\x9d\x66\xa8\x47\x0d\x28\x10\x29\xd2\x88\x5e\x75\x24\xcb\xaf\xe3\xf0\xd7\xcf\x57\x3b\x0e\xda\x8c\x66\x34\x67\x96\x79\x33\x14\x51\x8c\xda\x6d\x01\x45\xa2\x52\x95\x46\x59\x1c\x01\x73\xbb\xf4\x07\xc3\xc0\x48\x19\x91\x6f\x86\xe1\x14\x66\x68\xde\xe3\xbc\xe4\xf9\xd9\xfc\xa7\x67\x04\xc9\xfd\xf7\x16\xfd\xfc\xdd\xa4\xfd\x74\xef\x95\x35\x0a\x0d\x8a\xcc\xd9\xc9\x7d\xbe\x2e\x51\xe2\x86\x04\x27\x59\x92\xc5\xa9\xda\xfe\x68\x54\x66\xf0\xe3\x35\xad\xb6\x07\xb1\x36\x2f\x66\x8c\xe3\xba\xe2\xd9\x96\xff\xfc\x6f\xb3\x65\x3b\xa8\x06\x0b\x21\xc1\xe6\x8b\x22\x87\x78\xad\xe3\xc4\x2d\xc9\xb6\x80\xf2\x24\xed\x54\xab\x3a\x8d\x54\x12\xaf\xd3\x5f\x67\x0d\x2e\x77\x4e\xad\xe2\x10\xdf\xec\x79\xfb\x6f\xb3\xa7\xb1\x4c\xdf\x89\xf9\x32\x61\xbf\x59\xa7\x38\x71\xd3\xdd\x9c\x38\x33\xca\x28\xa3\x51\x95\xc4\x10\xfd\xf5\xe6\x58\x8d\xd4\xc2\x2f\x02\x6e\x99\x37\x6f\x08\x93\xab\x53\xba\x6d\x36\x7b\xf2\xe7\xf1\xb7\x0f\x0f\x9b\x7f\xfa\x76\x73\x4f\x7f\xde\x51\x25\x7f\xb6\xca\x17\x3b\xfb\xa7\x4b\x8b\x14\x11\x9a\xe4\xfd\x9a\x73\xc9\x9a\x34\x63\xa8\x4a\x72\xd2\x66\x31\xd4\x39\xc2\xa5\x86\xbe\x40\xd1\x89\xb6\xa0\x72\x94\xa3\x94\xc2\x02\x9c\x20\x1d\x70\xca\xa4\xe6\x12\x0a\x50\x70\x22\x28\x46\xd4\x0d\x95\xd8\x8c\xee\xa5\x14\xd0\x57\xad\x14\xac\xaa\x7a\x25\x58\x56\xc1\x22\xb9\xde\xb5\x65\xad\xcd\x7f\x6f\xd9\x7e\x76\xcf\xfa\x2b\x09\xc4\xa7\x9f\xdf\x1f\xbe\x13\x50\xf9\xed\xc3\x71\x17\x27\xbb\x7f\x89\xe8\xf4\x43\x2b\xbc\x5c\x25\xa9\xce\x12\x98\x75\x1c\x21\x8d\x79\x6f\x48\x3b\xb6\x27\x32\xc8\x92\x16\x7c\x2c\xa6\xaa\x80\x16\x2d\x0a\xb8\x52\x48\x02\x3f\x74\x70\x52\x06\xa5\xb6\x8f\xa9\xcd\xb2\x4c\x72\x56\x56\x9c\x51\x51\x32\x52\xa6\x49\x51\xf6\x9c\x94\xe5\xda\xaf\xba\xaa\xdc\x0a\xc4\xde\xeb\x1c\x38\xe5\x25\xf7\x73\xeb\xcf\xec\x99\xec\xcc\xf9\x3f\xae\xcc\x9c\x9f\xde\x1f\xdf\x3d\x3c\x1d\x3e\x7c\xba\x7b\x38\xdc\x7a\xdf\x7f\xdd\x22\xe1\xab\xac\xd2\x0b\xdd\xad\x87\x5f\xed\x0f\x5f\xfd\xec\x5e\x79\x55\xc5\x23\x29\x57\x11\x29\x8e\x9e\x19\x9d\xb6\xd7\x84\x74\x54\xaa\xb2\x28\xd4\x80\x7b\x5e\xd1\xb2\x2c\xd3\x68\x81\x08\x35\x51\x51\x95\x98\x19\xac\x28\x21\x65\x91\xc7\x11\x9c\x82\x5c\xae\x53\xc8\x43\x25\x33\x1e\xba\x5b\x58\x65\x04\x98\x98\x02\x9b\x0d\x63\x45\xd6\x51\x51\x6a\x9c\x97\x59\x4e\x2a\x39\xab\x92\xe1\xb6\x12\xa5\x29\xb2\x32\x49\x09\x71\x9c\xe3\xf6\x3b\xda\x9c\xdd\x6b\xb5\x4d\x8b\x48\xbd\x9e\x11\x96\xd1\xde\x9e\x0c\x4f\xf7\x7f\x72\xef\x9f\x6e\x01\xc2\x71\x27\x69\xb2\x6e\xb3\x42\x34\x56\x31\xca\xa0\x4d\x10\xc6\x67\x55\xa0\x28\x86\xce\xa5\x40\xad\xb4\x85\x7d\x61\x29\x88\x94\x27\x21\x1a\xaa\x0f\xb3\x8c\x99\x14\x67\x2c\xa5\xd7\x0a\x90\x8c\x71\xc6\x4e\x4c\xb0\xa6\xe0\x4a\x15\xbc\x12\xa5\x2c\xec\x7c\x2f\x2e\xc4\xc7\x41\xe9\xbc\x73\xfe\xc9\x29\x9c\xff\xdb\xf9\x7f\x5e\xa9\x9f\xbe\x50\xdc\xf1\x7e\xf8\xd3\x5f\x7f\xf4\xc3\x1b\x94\xfe\x8a\xf1\xfd\x74\xe5\x3a\x47\x42\x54\x24\x83\xc8\x35\xb8\xac\x08\xae\xa4\x1c\x33\x59\x49\x45\x49\x96\xc0\x88\xda\xac\xc8\x73\x92\xe3\x52\x64\x65\x21\xdc\xb4\xce\x13\x18\x50\x97\xe1\x22\x27\x45\x41\x45\x4a\xb0\x5c\x17\x54\xdb\xf6\x23\x6d\x66\x82\x1c\x09\x8d\xdb\x6a\x51\x31\x75\xe8\x92\x34\xcb\x39\xa7\x45\x96\x55\x45\x8e\x53\x96\x24\x19\x90\x34\xcd\x31\xe7\x8c\xa4\x19\xcb\x33\x9c\xf1\x38\x2b\x2a\xf2\xdd\x8f\x40\x13\xb2\x5d\xda\x8c\x42\xa8\x26\xa3\x82\x49\xea\x38\x7f\xe3\x54\x17\xea\xc7\x81\x7c\xd1\xe7\xf7\x27\xe7\xfe\x7a\xd6\xdb\x73\x6c\xdb\x03\x6e\xda\x39\xef\xaf\x72\xaf\x2f\xf9\x1a\x0e\x7b\x42\x04\xa7\x31\x52\x67\x82\x64\x1c\xc3\xe4\x15\xe7\x4e\xb9\xe9\x3a\x5a\x32\x45\xa1\x14\xf4\x9e\xb3\x3a\x0a\x4d\x90\x58\x7d\xd1\x3a\x82\x12\x8a\x0c\x0d\x81\xcc\x0a\x29\xd3\x04\x4e\x2b\xe7\xc8\x10\x58\x28\x06\x02\x31\x4a\x09\x2c\x78\x16\x65\xa2\x62\x67\x9b\x63\xf4\x52\x78\x53\x50\xbc\x98\x63\xff\xd5\xf9\x3f\xf7\x0c\xfd\xf6\x10\x9e\xec\x8e\xf9\xce\x66\x94\xde\x3e\xbe\x7b\xf8\xf5\xf1\xdd\xc3\xe1\xf6\xf5\x2f\xf8\x29\x0f\x76\xd3\xed\xdc\x1e\x26\xc4\xe5\x2c\x67\x85\x04\x4c\xa5\x31\x68\xb3\x9a\x76\x1d\xaa\xdb\x76\x3d\x79\x19\x34\x11\x22\x04\x27\x69\x42\x4a\x4e\x24\xb2\x9e\x26\x0e\xd3\x38\x0e\x0a\xc1\x60\x68\xa1\x40\xdd\x09\x51\x06\x2d\x63\x8c\x32\xc6\x4a\x29\x21\xa5\x65\x24\x91\x00\x8e\xe4\x3a\xbb\x52\x5e\x1c\x10\x21\x46\x16\x03\xf9\x37\x0e\xb1\xfd\xcc\x2f\xd7\xcd\xff\xee\xfc\x5f\xce\x7f\xb3\xfa\xc4\x8f\xef\x1e\xaf\x02\x01\x0f\x4f\xf6\xf5\xf4\xe8\x5d\x47\xff\xd7\xdb\x53\x78\x1f\x1c\x1f\x6f\xee\xc6\x0f\x52\x8f\xef\xdf\x3d\x3e\x1d\xaf\x2f\x44\xf5\xa8\xdb\x56\x8f\xba\xeb\xea\xed\xa1\x28\xc6\x50\xb1\xed\x6c\x92\x73\x28\x44\x14\xeb\x28\x96\x49\x8c\x0a\x98\x76\x71\x6d\x58\x50\xba\x56\x3a\x49\xa8\xd1\xd3\xf6\x27\xe0\x55\x55\xc9\x6a\x7b\x83\x13\x28\x2e\xf8\xf6\x06\x73\x96\xe5\x59\x96\x16\x58\x70\xce\x38\x93\x85\x8b\xd3\x84\x76\x11\xe7\xf3\xb6\x1c\x99\x83\x1c\x66\x73\x8f\xe9\xce\x44\xf6\x2e\x38\xbe\xbf\x09\x0e\x7f\x03\xcd\xbd\xed\x6c\xc2\xad\x99\x2e\x90\x53\x94\xa2\x48\xeb\x82\xe2\x22\xc1\x38\xb9\x38\x28\x67\x82\x91\x82\x63\x08\x83\x54\x8d\x1d\x51\xb5\xc1\x5c\xac\x91\xa0\x91\x89\xa8\x3b\x68\x4e\x59\x81\xb5\x72\x3c\xdb\x8f\xdb\xfc\xf7\x78\xba\x2c\x43\x2c\x7a\x73\x0d\x7e\xb0\x59\x27\x8d\xd2\x28\x84\xca\x5b\xa0\x08\xa3\x4a\x45\x29\x2c\xb0\x54\xd3\xa9\x1c\xfb\x8e\xd7\xa7\x1f\xd0\x74\x5d\x43\xc9\x97\x2c\x5d\xdb\x9e\xc3\x5c\x79\x94\x81\x74\xfe\xd1\xa2\x4d\x3f\x3a\xff\xdb\xfe\x4c\x77\x48\xf2\xbb\x9b\x84\x82\x75\xeb\x1f\xef\x1e\x77\xa1\x8c\xaf\xb1\x2e\x7a\x74\x6d\x7b\x83\xcd\x20\xef\xb9\xb2\x44\xce\x33\xc2\x60\x78\xc9\x61\x59\xa7\x62\x31\xdb\xd9\x24\xd0\xe0\x29\xa0\x29\x12\x0a\x42\x85\xc2\x0c\x34\x62\x2a\x82\x1c\x23\xf9\x65\xae\x4a\x55\x8a\x83\x50\xb2\xe2\x75\x20\x2b\xce\xf8\x09\xd3\x1c\x3a\xc1\x73\x82\x72\x6e\xc1\xd7\x11\xab\x80\xa1\x08\x4e\x48\x57\xd0\x03\x49\x79\x84\x70\x2e\x05\xad\x4a\xc2\x2a\x56\x39\x81\x53\x5d\x88\x37\xbe\xc2\x5e\x7e\xb8\xd6\xee\x1e\xef\xae\xb3\xf1\xee\x01\x3d\x37\xf6\xfc\x83\xf7\x70\xfc\xf0\xe9\x5f\xd0\xa7\xfb\xb7\x0f\xfc\x3a\xc5\x10\x41\x02\x6c\x97\xd9\xe0\x2e\x6b\x98\x7b\x0c\xa2\x08\xd5\x51\x56\x94\xe5\x90\x9c\xf2\x22\x82\x3c\x1b\x82\x7c\x9d\x24\x8a\xa4\x7d\x07\x47\x4a\x29\xda\x13\xcd\x23\x1d\x86\xa4\x47\xe1\x9e\x67\x22\x5e\x1c\x24\x4e\x74\xc5\x56\xbc\x9c\x41\x95\xdb\x5c\x9c\x82\x31\x9a\x70\x1e\xc1\x1c\x24\xfa\xb3\xb2\x44\xe9\xf8\x50\x3a\x4e\xe0\x85\x97\xe2\x58\xdb\x3e\xba\xfd\x34\xfe\x93\xc5\xa4\x5d\xfb\x98\xb7\x61\x7f\xc9\x41\xf3\x52\xca\xd6\x23\x7e\x0c\x34\x43\xe6\x5c\x20\x9e\x41\xd6\xb9\x6a\x65\xb7\x17\x17\xcd\xa9\x1a\xdd\x7c\x6c\x79\x3d\x04\x85\x6c\xbf\xf4\x7e\xde\x42\xd8\x42\x64\xff\x2a\xaa\xa9\xc4\xa2\x64\x42\x90\x3d\xc7\x40\x2e\xdc\xe6\xc5\xff\xf6\xd6\x2d\x72\xcd\xde\xbf\xbd\xfa\x33\xef\x9e\xc1\x4b\xf7\x4f\xf7\xa8\x55\x69\x86\x1a\x70\x4a\xc9\xe6\xba\x71\x73\x9b\x8b\x57\x3c\x36\xc3\xe6\xa2\xe0\x80\x67\x15\x55\x8a\x57\x33\x30\x29\x61\x50\x50\xe4\xb9\x2a\x0b\xec\x66\xca\xf2\xf8\x90\xa3\x0c\x84\xf3\xf6\x96\x7f\xbf\xe6\xe0\x1f\xf6\x92\x39\x47\x27\xe3\x3a\x66\x0b\xfb\x0c\x38\x06\xe2\x43\xdb\xf7\x7d\xaf\xc6\x71\x1c\xaf\x7c\xe9\xe4\x28\xbc\xf1\x87\xe3\x2d\x83\xe5\x3c\x52\x53\x95\x09\x63\xf4\x3c\x78\xa3\x3e\x4f\x6c\x5b\x8a\xd8\x0b\x1d\xc7\x77\xf4\x45\x7b\xf8\x30\x3f\xcf\x9a\xef\x3a\x6b\xac\x1a\x31\xd6\x20\xb4\xbe\x15\x14\x6c\x51\x61\xfe\xd7\x91\x99\xa0\x04\x8c\xd2\x35\xd9\x5f\xb6\x2f\xf5\x42\x8e\xdc\x8f\x7f\xcc\x4b\xd6\xfa\x1d\xa4\x54\x13\x12\xd3\xb2\x5c\x5b\x3f\xd6\x67\xcd\xca\x48\x47\xd8\x23\xb6\x2e\x89\x8f\x95\x2b\xf7\x7e\x8f\x97\x9f\xfd\xf8\x74\x77\xaf\x83\x61\x8d\xa9\xb2\xc9\xdf\x22\x3d\xb7\xae\xd4\x90\x32\x1a\xe9\x28\xcd\x6d\x6d\x18\xf9\xa1\x8d\x29\xa2\x1f\xde\xdb\x0f\x3d\x05\x86\x70\x56\x26\x9c\xa5\xc0\x82\x48\x7d\x96\xac\x8c\x4c\x8c\x0f\xd4\x39\x38\xc2\x89\x3d\xf9\x57\xf2\x9c\x4a\x05\x89\xd6\x75\x8d\xf2\xba\x86\x7e\xff\xfa\x97\x78\x4e\xa5\x13\x7b\xed\x5f\x79\xed\x56\x83\xa3\x75\xdb\x22\xdc\xb6\xd0\xee\x5f\x7f\xff\xda\x96\x4b\xde\xe3\xcf\x5c\xf2\xf7\x77\xaf\xb1\x4c\xdb\x32\xa9\xdc\x09\x26\x2b\xbe\x25\x63\x68\x80\x5a\x4c\x13\x8a\x60\xb4\x8c\xf2\x1a\x92\xbc\x50\xba\x32\x69\xea\x86\x7a\xe7\x17\xc6\x17\x62\x73\x3f\x7b\xff\xae\x7b\xfc\xe0\xfc\xf1\xca\x9f\x76\x7c\xf7\x93\x75\xb0\xf6\x06\x76\x37\x2d\x17\x89\x84\x56\xa5\x50\x63\xd4\x29\x26\x21\xd5\x09\x57\x0c\x29\xa8\x4f\x15\x62\x6e\xe4\x15\xeb\x89\x4b\xda\x2b\x26\x78\xdf\x99\xc1\x4f\x13\x30\xb0\x94\x8b\xf3\x5c\xef\x0a\x9d\xa3\xe5\xe4\x76\x5e\xe8\x0a\x58\x84\xc0\x3f\xa2\x6b\x25\x38\x57\x20\x15\x0a\x65\x51\x4b\xca\x75\x3e\xca\x52\x62\x11\x84\x5f\x32\x1f\x7f\x69\xfc\x11\xfa\x55\x82\x80\x81\xf2\x12\xc5\xa8\x04\x5e\xb7\xa4\x6d\x9c\x83\x97\x5c\xf1\x3d\x7f\xe7\x44\x5f\xb3\xc4\x36\xdf\xfc\x1b\x72\xaf\x69\xe2\xe3\xb7\x13\xe5\xcf\xe8\x6b\xe7\xc9\x21\x51\x36\xc3\x9f\x94\x33\x4c\xad\xcd\x14\xe7\x2e\x5d\x8d\xf1\x5a\x10\x58\x90\x22\x26\x65\x06\x94\x2b\x2a\xb9\x72\x4f\x0c\xab\xa2\x0a\x78\x9a\x26\x30\x18\xa9\x50\x01\xa7\xa6\x5a\x2e\x8e\x9a\xd4\x3a\x57\x24\x52\x51\x81\x96\x32\x83\x45\x50\xdd\x36\x43\x3e\xec\x79\x59\x47\x5d\xb0\xa7\x6e\xbd\xab\xb6\x4f\x78\x9b\xf1\xcf\x3e\xd0\xdd\xe3\x9d\xa7\x28\xcd\x93\x32\x6f\x54\x23\x51\xae\x0e\xe5\xb9\x20\x44\xc4\xa9\x17\x7f\xe6\x07\x79\x4e\x7d\x8a\x12\xb0\x98\x51\x71\x21\xee\xe2\xb3\xeb\x5e\xf0\xfa\xf4\x16\x2e\x9f\x30\x2f\x71\x4c\xcb\xf4\xe2\xf8\x4c\x9d\xd3\x8a\x84\x2a\xc2\x5e\xb7\xc5\x41\x9e\xb3\xed\xbd\x3e\xfb\xeb\xf6\xde\x3f\xa3\x57\x7b\x6f\x0a\x61\x86\xa6\x33\x41\x59\x06\xac\x77\xe5\xca\x6f\xaf\x8a\xd7\x33\x1d\xdd\x62\x6a\x58\xd3\xfb\x4c\xf2\x35\x72\x67\x0e\x0d\x85\x61\xfb\xbb\x50\x46\x64\x5e\x16\x44\x32\xec\x20\xb7\xbf\x90\x03\xb6\xfa\xd9\xcf\xfd\x57\x77\xdb\xc4\xfb\xa6\xe7\xf6\xe3\xa7\xbb\x07\x77\x9c\x4c\xdf\x8f\x31\xe7\x98\xb0\x2a\x61\x2c\x22\x34\xe7\x6c\xba\x35\xdc\x32\x2a\x70\xbe\xb6\x9c\x24\x3a\x2d\xd1\x94\x26\x3a\xcd\xd0\xe0\x20\xff\x74\x21\x47\xbd\x9f\x4f\xe8\xdb\x31\xf2\x4f\x6e\x33\xd8\x41\x2a\x69\x02\xdd\x76\x3e\x69\x5e\xc6\x75\x82\x0f\x56\x33\x64\x76\x68\x90\xf9\xe3\x8e\x03\x3f\x3e\x33\x48\x3f\x3d\x5e\xa1\x04\x96\xe1\xd7\x56\x18\x4a\x53\xb8\x0b\x64\x2e\x59\x1b\x94\xe9\x2f\x8d\x41\x78\x8b\xf3\xe7\x92\x55\x83\x3f\xa6\x5c\xc3\x62\x39\x3a\x1b\x84\x1b\x14\x6a\x14\x32\xc2\xcc\x35\x5f\xd5\x05\x91\xaf\x2d\x36\xf7\xfe\x6b\xef\x9b\x7f\xf8\x2a\x2b\xf8\xf6\x15\x93\xfe\xe4\x56\xda\x4d\xd7\x09\xa5\xc8\x61\xc3\xac\x17\x90\x0c\x99\x69\x5d\x7c\x26\x84\x62\x66\x8d\x05\x96\x98\xbb\xd3\xb6\x6f\x08\x33\xf0\x56\x81\xe3\x26\x30\xb4\xb2\x43\x89\x9b\x91\x96\x55\x42\x0a\x45\x94\xd8\xb5\x06\xab\x43\xef\x9d\xec\x7c\xbc\x22\xb4\x5e\xf6\xad\x3e\xde\xfd\x72\x20\x14\x24\x14\x55\x8b\xa2\x2a\x36\x49\x89\x41\xc1\xa0\x0c\x92\xde\x49\x36\x7c\x4e\x13\xdc\x64\xa7\x22\xc7\x95\xdb\xc1\xc2\x1d\xc7\x45\x95\x13\x1f\x94\x9f\xbe\xd4\x90\x44\x7b\x54\x32\x0e\x35\x6b\x7a\x77\xc9\x80\xac\x03\x76\x89\x9f\x32\x23\x6a\x0e\x4a\x9d\xda\xba\xdb\xec\xc1\x8e\x3a\x68\x5f\x7d\xc3\x9d\xe9\x1e\x7f\xf9\xf5\xb7\x0f\x3e\xee\xa5\x29\x80\x03\xce\x50\xd8\xd6\xed\x88\x12\x94\xd3\xca\xc3\x30\x41\x83\x0d\x8e\x35\x8a\xdc\x38\x5b\x97\x29\xca\x77\x2d\x7a\x17\x95\x28\x0f\x62\xaf\xb9\x69\x8e\x5a\x3a\xe2\x7b\x74\xf2\xea\x73\xa9\xfc\xee\x4b\xe1\x35\x1a\xba\xab\x16\xc9\xec\xe0\x20\xf3\xaf\x9c\x31\xef\xee\x7f\x04\x65\xb2\x54\xd2\x1f\x5d\xa1\x50\x17\x93\x22\x09\x55\x44\x6a\x43\xa0\x8f\xc7\x8e\xa2\x32\x39\x2d\xa1\xcf\xbb\x95\xa7\x49\x6e\x92\xa1\x2a\xa8\x9b\xc0\x04\x75\x25\x7a\xa4\x15\xdd\x9e\xf7\x7c\x21\x01\xf5\xb1\xd5\x71\xf9\xf7\x2f\x7a\x31\x77\xee\x85\xfb\xc3\x4b\x9a\x1c\xe3\x63\x88\xb7\x3d\x48\xaf\xd2\xe5\x90\x7b\xad\x21\x44\x57\xe7\x89\x13\x85\xb9\x8f\xd5\x3a\x2b\xc8\x51\xaf\xdc\x88\x64\x9d\xcc\x8c\x11\xba\xd4\xf2\x86\xb5\x3f\xe6\x57\xde\x93\x57\x3d\xca\x9f\xde\xec\x4d\xd6\xa8\x37\x71\x7a\x88\x54\x5f\x99\x74\x2c\x69\x9c\x7d\xc1\x95\xe4\xa7\x80\x27\x84\x7c\xc1\x80\x93\x3a\x51\xc8\xf1\x4c\xcd\xd8\xb0\xf7\xdc\x1f\xab\xa0\xb2\xf3\xc4\x72\x91\xd9\x8b\x7a\x2f\xf0\xab\x6e\x52\xf7\x15\x8a\xb4\x89\xe2\x83\x43\xf2\xce\x26\xb9\xcb\x24\x3b\x10\x38\x19\x7e\x42\x2c\x4d\xb3\x2f\x18\xe6\x31\x52\x21\x9f\xfd\x70\xef\x3b\x3b\x39\xc9\x61\xf2\x95\xb5\xf3\x1a\xed\x5f\x19\xcf\xae\xa2\xa1\x6e\x5f\x37\x22\x59\xb5\x17\xa7\x5d\x53\x73\x55\x37\xd0\x53\x94\xd5\x75\xef\x09\x61\xba\x49\x81\x80\x93\x69\x79\x53\x0f\x4a\xf2\xbe\xde\x9f\x25\x6a\x2e\xa7\x20\x3a\x84\x7b\xfd\xf3\x99\xbd\xd5\xee\x32\xde\x6c\xac\x2c\xa1\xf8\x62\x3a\x33\x1d\x42\x60\x7a\x35\xfa\x6b\x4f\x1b\xaa\x2f\x32\x08\x0f\xd9\x8e\x19\xbf\xb2\x29\x1d\x8e\xbf\x79\xcf\x5c\x03\x6e\x8c\xb8\x41\x1c\x9a\x1a\x85\x64\xaa\x8d\x99\x2a\x94\x6a\x68\xbc\x13\xc2\xd0\x4a\x20\xbd\x6e\x11\x59\x33\x77\x04\xdd\x4b\x14\x5d\x39\x37\xf2\x0b\x39\xb4\x07\x7c\xc5\x78\xfd\x80\xca\xe2\xee\xf1\xee\xd0\x96\x24\xdb\x46\x2e\x39\xa9\x93\x42\x5c\xf9\xc5\x9a\x94\x34\x54\x21\x76\xb3\x2f\xc6\xa7\xe7\xc5\xd3\xb6\x72\xb3\xeb\x05\xb7\xc1\xce\xa5\x1a\xbd\x79\xc1\x55\xb2\xc3\xd0\x3e\xbe\xf9\x23\x0a\x4c\x96\x85\xb1\x8e\x4b\xcc\xb2\xf2\x4b\x3d\x28\x56\x06\xd9\xf9\x74\x9e\xb5\x4e\xe0\x54\xd7\x88\xfa\xc5\xca\xd6\x11\x68\xb9\x20\x89\x12\x77\x76\x8e\xee\xb2\xed\x99\x07\xfd\x57\x6a\x55\xbc\xbd\xa9\xa7\xff\x09\xdd\x3f\x79\x2f\xea\xae\xbf\xee\xc9\xa4\x9f\xdf\x1d\xff\xf9\x83\x3f\x9a\x38\x45\xc3\x66\xfc\xb9\xf2\x78\xc4\x54\xc6\x62\x9e\xe7\x59\x7c\x56\x28\xc9\x3a\x97\x6f\x53\x9c\xe0\x84\x27\x78\x6d\x79\x5c\xf2\xd2\x0d\x2d\x55\x25\xcd\x45\x7a\xd0\x49\x91\x41\x48\x19\x85\xbc\x8f\x64\x58\xa1\xd4\xd3\x18\xe6\xb2\xa3\x74\xad\x2a\x91\x8a\x2a\x4a\x5a\x53\x18\x2d\x64\xa2\x44\xa4\xeb\xa8\x91\xfb\xb3\xdc\xce\xdb\xf2\xa0\x6f\xb8\x9c\x6b\x67\xaf\x3b\xc8\xbc\x94\x59\x5a\x4e\x07\x9d\x76\xfd\x17\xea\xd5\x45\x21\xf7\x3c\xc0\x11\xb1\x0b\x39\xca\x43\xf5\x9c\x07\xf8\x67\xcb\xf9\xef\xa0\xc7\xab\xbf\xbe\x33\xae\xdb\x3e\xce\xf7\x2f\x59\x4c\xdf\x07\x07\x1b\xec\x3f\xdc\x3d\xec\x20\xcd\x3f\xa2\x5f\x5e\xf1\x5e\x0d\x5c\xa0\x50\x56\x15\x3f\x9f\x14\x5f\x9e\xe3\xfa\x10\x16\xbf\x24\x3d\x2c\xe8\xa4\x75\x4b\x2b\x5e\x96\x08\x9f\x33\x2e\x1a\xda\x22\x53\x16\x3c\x2f\xfd\xb6\x69\x9a\x46\xae\x54\x08\xd7\x48\x09\xff\x2f\x6b\x7f\x0f\x64\x39\xae\xe7\x07\xa2\x04\x79\x3e\x38\xd2\x7b\xba\xac\xae\xae\x2e\x6a\xbe\x84\x54\x76\x75\xf1\xce\x1b\x69\x20\xe5\x64\x15\xa4\xab\x99\x07\x8d\x42\xf1\xa0\xa7\x95\x02\xbb\x5a\x29\x10\x6b\x6c\x20\x64\xc1\x58\x03\x11\xeb\xc0\x84\xb1\x06\x4c\x98\x30\x69\xd2\xa4\x49\x93\x26\xcd\x63\x1e\x93\x26\xcd\x63\x9e\xee\x4a\x22\x37\x08\x9e\x93\x95\x59\x5d\x7d\x6f\xc7\xac\xaa\xf2\xe4\x61\x9d\xcc\x28\x02\x20\x3e\xfe\x1f\xbf\xff\xef\x27\x5d\x90\x2e\xab\x2c\xad\x46\xfb\x20\x33\x1f\x44\x70\x46\x2a\x20\xc0\x00\x74\xf5\xe9\x4c\x7b\xa9\xb4\xe4\x82\x4a\xbe\x6a\x5e\x8f\x8f\x78\xdf\x6c\xcb\xe4\x2f\x93\xbf\x4d\xfe\x2e\xea\x17\xdc\xbe\x5f\xd6\xf0\xdd\xea\x80\xaf\xf8\x87\xfd\x67\xb9\x82\x27\xf0\xf1\x72\x04\xc5\xc2\xbe\x8b\x26\xcf\x25\xe4\xf6\x14\x6e\x6a\xce\x95\x73\x98\xb8\x32\x0f\x7d\x7a\x38\x17\x25\x40\xa1\x2f\x44\x91\x43\x5c\xe6\xb9\x29\x88\xab\x04\x11\xe1\x64\x00\x7f\xd0\x29\x0f\xc4\x69\x88\xbc\xaa\x7c\x5e\xb4\x47\xba\x02\x9a\x50\x38\xa4\xcc\x00\x02\xad\xed\x4e\xce\x9d\x3a\x27\x02\xa5\x79\x5e\x59\x7c\xc0\x94\x03\x1c\xc6\x51\x81\x7c\x23\xe7\x24\x08\x42\x19\xad\xfa\x43\x85\x91\xe0\x2c\x3b\x2c\x3e\xdd\x72\xe6\x2c\x6b\x61\xab\x93\x3f\x49\xfe\xd5\x67\x75\xde\x6f\xde\x3e\xad\xda\x6f\x16\x67\xee\x7e\xff\xfe\xfb\x65\x6e\xbe\x79\x5e\xe9\x7d\x29\x98\xb8\xb9\xdf\xed\xdf\x7f\xbf\x1b\xa9\xb1\x80\x86\xd1\x8d\xbc\xb3\x4e\xf7\x62\xb2\x47\x90\x1c\x31\x60\x01\x53\xa5\xc7\xd1\x6b\xc9\xb8\xe3\xb5\x3e\xb0\x23\xa8\x84\x40\xa0\xda\x6a\x83\xaa\xf3\xb2\xec\x9b\x0e\xd0\x99\xa6\x7d\xe8\x0e\x16\xe4\xa0\xb6\x07\xe4\x30\x37\x15\x3c\xdb\xca\x68\xa7\xc4\x9c\x67\x49\x18\x07\x75\x06\xdc\x1e\xca\xc2\xa1\x24\xd9\x2e\x73\x74\x8f\xb6\x3c\xf9\x2e\xf9\xf3\x98\x09\xfe\x8b\x5f\xac\x47\xff\x9a\xc3\x06\x4e\x47\x7f\x3c\x5a\x21\x31\xf5\x54\xeb\x03\xeb\xb7\xc4\x05\xe5\x7d\x14\x4e\xb9\xbc\x36\x68\xd9\xf2\x7c\xed\x9c\x53\x72\xae\xb2\xf2\xd4\x29\x90\x03\x09\xf4\x4f\xd8\xda\xed\x10\xd4\x5a\xfd\xbd\xbc\xa2\xae\x11\x7f\x24\xbb\x63\x3a\x3d\xd9\x87\x7f\x92\x24\xef\xd6\x24\x74\x74\x54\x5f\xdd\xbc\xf9\x2d\xb8\xbf\x79\xb3\x7d\x73\x73\xbf\xbd\xbf\x79\x93\x9e\xeb\x8d\x71\xa1\xf6\xa1\x01\x1c\x9c\x43\x1d\x8a\xf5\xbd\xa2\x59\xfe\x30\xf1\x69\x4a\x49\x5d\xd7\xb6\x5e\xfe\x44\x4c\x53\x96\xec\xf5\x56\xaf\xac\x41\xb1\xe0\xfd\x5a\xcc\x12\xb5\xa7\x6e\x57\xe1\x4e\x70\x4a\x2b\xe8\xf2\x02\x90\x12\x9a\x0a\x4e\xf3\xa1\x07\x06\x87\xea\x58\xda\x90\x13\xb0\x38\x67\x9b\x93\x2d\x09\x42\x55\x85\xa9\x69\xb0\x63\x00\x86\x89\x1b\xd2\x26\x29\x18\xe2\x3e\xc6\x93\xdf\xac\x8a\x66\xf7\x77\xd7\x53\x36\x2a\xb7\xde\x7d\x46\xbe\x2d\xe7\x2f\x38\x03\x57\xd7\x11\xd1\xe6\x81\x0c\x2a\x2b\x56\x45\xe5\xc5\xfb\x3a\x85\xa2\xde\xd8\xc3\x8f\x67\xa0\x3c\x48\x3c\x48\x80\x18\xfc\x63\xe2\xcf\x3e\xd8\x64\x0b\xc6\xc5\x17\xdd\x8a\x38\x4e\x2b\x32\xfe\x67\x98\x9b\x2b\xd2\x0e\x5c\xc6\xf0\xd5\xfd\xcd\x9b\x38\x7e\xa4\x8e\x5a\xb5\xdd\x4f\x14\x98\xd0\x83\xcb\x3f\xc9\x7c\x76\xd9\xe4\x66\x9c\x0e\x33\xde\x8a\xc1\x36\xd6\x36\xb6\xef\x6d\xf3\x40\x55\x86\x1e\x0e\x0a\x34\xce\x85\xd1\xfb\x65\xfe\x1c\x1e\xed\xde\x6d\x65\x9c\x39\xff\x3c\xf9\x97\xc9\x87\xb8\x02\xe2\x5e\x14\x67\xfa\xdd\xb3\x96\xdc\xdd\xdf\xc6\xd7\xcd\xfd\xee\xe6\x3d\x04\x6b\xd4\xe1\xcd\xab\x0b\x50\x7f\xd7\xd3\x29\x8c\x29\xeb\xce\xe7\x7e\x6e\xd2\xfc\x13\x4e\xe1\xec\x0f\xe7\x73\x9b\xd2\x29\x9c\x51\x4a\x80\x79\x4c\xea\xc7\x24\x86\xaa\x6a\x90\x6c\xa5\x85\xa5\x75\x43\xfc\x7b\x79\x33\x85\x9d\xdb\x61\x18\x86\xd0\x0c\xc3\x90\xa4\x60\x7a\x24\x7b\xbe\x95\xc9\x1f\xad\xca\xc1\x4f\x19\xd9\xef\xde\x3e\x71\x1d\x3c\xc7\x1f\xde\xdf\xfc\xf0\x3e\xad\xd2\xb2\xac\x1c\x2a\x53\xfc\xa9\x04\x8a\x40\x80\x24\x6e\x08\x03\x7a\x8e\x81\xec\x7a\x3e\xa6\xd5\x5c\x03\x5d\xd1\x4d\x17\x4b\x65\x1c\x76\xce\x3b\x6c\xa5\x3f\xbb\xe0\x80\x72\x67\x6f\xf4\xc5\xc6\x78\xa4\x7b\xb6\xb1\x5f\x8d\x15\x80\x69\x2b\xe7\x81\x69\x67\xa0\xb5\x64\xd6\x1b\x5b\x3f\x60\x2d\xaa\xba\x12\x59\x9d\x6c\x81\x7c\x64\x11\x7b\xbf\x32\x34\xfc\x4d\xf2\x6f\x97\x9d\xf3\xca\xee\x72\x21\xc2\x5b\xe7\xea\xab\x4b\x67\x16\x97\xe0\xcd\xf3\xad\xf2\x43\x2c\x83\xd8\xdf\xdc\x83\x9b\x0f\xeb\xc5\xd6\x34\xcc\x83\x62\xf1\xc7\x6c\xa8\xcf\xa6\x0d\x05\x49\x0b\x19\x24\xe8\x2a\x58\xc3\x2a\x25\x3d\x42\xae\x28\x04\x45\xb2\x28\x9a\x0e\xd2\x79\x45\x61\x9e\x73\x60\x1f\x2c\xc0\x45\xe8\xc0\x54\x80\x1a\x14\xe1\x0c\x0b\xa4\x50\xcd\x09\x6d\x1f\x13\x64\xf1\x39\x2d\xb9\xa8\x18\x99\x27\x8e\x72\x58\x16\x15\x97\x08\x96\x55\xa1\x30\x68\x38\xe7\x61\x42\x15\x5f\xb9\xc0\xc1\x98\xb1\xbd\xfc\xc5\x35\xf8\xfe\x36\x5a\x60\x37\x69\x99\x16\xd0\xe6\x39\xa8\x8a\xd2\xc0\x72\x9a\xa7\x1e\x08\x14\xc8\x01\xda\x00\x09\x50\x26\xd0\x6d\x21\x4b\x04\x61\x59\x21\x64\x2d\x32\xf4\x34\x31\x8b\x4c\xc4\xe0\xe5\xcb\xde\x96\x55\x2f\x72\x19\x91\xc5\xf9\x79\x1d\xf5\xcd\x07\x70\xf7\xea\xf6\x6a\xa0\x6d\x2f\xf3\x61\x53\xce\xa7\x6d\x35\x9b\x12\xa6\x9d\x7f\x58\x96\x23\x0c\x4d\xdb\x02\x0c\xb4\x6b\x43\xbf\x8a\x98\x00\x9d\xb6\x5a\x53\x32\x43\x84\xd2\x91\xcc\x16\xf4\x8c\x2d\xab\xb8\x63\x92\x25\x29\x38\x66\x78\x2f\x76\xf9\xd5\xda\xfe\x70\x7f\xf7\xed\xe7\x6e\xae\x1d\xdc\x46\x38\x20\x38\xa7\x65\xe9\x0a\x90\x97\x50\x91\x6a\x9a\x29\x0d\x85\x02\x4e\x86\x2a\xa3\x00\x82\x84\x84\x53\x38\x6f\x11\x37\x5a\x40\x48\x29\xb1\x43\xad\x85\xab\x98\xb2\x8e\x25\x5b\xe0\x1f\xd1\xbe\xc9\xce\xc9\x9b\x04\x26\xdf\x27\x55\xf2\xd7\x4f\x48\xc3\xc8\xe1\x71\xa5\x21\x7d\xff\xfd\xe5\xee\x37\x3f\xbc\xdf\x5d\xe5\xe1\xb6\x57\x70\xe4\xfe\xfb\x77\x1b\xee\xcb\x62\xd9\x97\x19\xe7\x0f\xbc\xb3\x65\x77\xa2\x42\x81\xbe\x02\x65\x59\x2a\x52\x01\x7c\x9c\xdc\x31\xcb\x23\x87\xd8\x19\x34\x4d\x83\x2b\x03\xab\x13\x0b\x3e\xd8\xec\x8c\x8a\xb2\xe5\xa6\x84\x41\x8e\x25\x34\x08\x92\xb4\xae\x74\xed\x61\x45\x29\x65\x46\x87\x33\x7b\x4c\xd8\xa1\x42\xa8\x62\xb0\x14\xa6\xe6\x17\xae\x9c\xbd\xda\xb1\x88\x69\x7f\xca\x37\xef\xd5\x4f\x79\x63\xeb\x1d\x73\xb3\x98\x87\xc0\x19\x68\xd3\x3c\xcb\x17\xfb\x68\x78\x44\x7b\xbf\x55\x91\x57\xea\x4f\x63\x7f\x57\x06\x87\x4b\x7e\x71\xf7\x95\x04\xe3\xf2\xc4\x97\xcd\x26\x66\xac\x3f\xbc\x8b\x38\xa7\x14\xa5\xb4\x68\xf2\x14\xce\x43\x5e\x80\x73\xf3\x13\xea\xc1\xa1\x98\x87\x4d\xf9\x30\x65\xcf\x5e\x5c\xf5\xe1\x2c\xce\xe9\x00\x92\x91\x9c\x4e\xdb\x44\x55\xd4\x62\xf4\x30\x1a\x93\x41\x19\x06\xc6\x14\x63\x61\x62\x61\xe2\xdc\x33\xc3\x2c\x66\x98\x5b\x19\xb9\xf3\x80\x7f\x5c\xe6\x78\xb2\x9e\x00\x3f\xe7\xce\x8b\xd5\xdd\x6b\xfe\xff\x26\xad\xb6\x79\x68\x81\x0d\xfa\xc2\xea\xc5\x42\x3f\x9f\x24\x98\x00\x9a\x87\x26\x45\x0f\xc7\x6d\xe2\x82\x71\x73\xaf\x44\x51\x97\x02\x9c\x82\x9c\xec\x01\x30\xd0\x86\x11\x98\xeb\x5e\xc3\xe3\x5e\xfc\x4f\x9f\x22\xc9\xab\xf3\xb1\x12\x78\x2c\x86\xe3\xab\xcb\x01\x14\xd5\x9f\xb0\x2b\xab\xac\x9d\xa7\x54\xcd\x0e\x28\xef\x1f\x8c\xf7\x40\xcf\x22\xad\x43\xc7\xb4\x19\xb7\x12\x51\xea\x42\xeb\x42\x09\xd4\x25\x97\xed\xc0\xe4\x00\x73\x5a\x4e\xc9\x3e\xb1\x8f\x24\x3b\xed\xe8\x8b\xba\xac\x7f\xf3\xf5\x3c\x1c\xf8\x22\x0f\x77\x51\xc1\xb9\xd9\xed\xaf\x96\xdd\xca\x09\x76\x3b\xa6\x43\x38\x00\x6d\xce\xfa\xac\x81\x0a\x23\xe8\xdb\x36\xb8\xa6\x01\x6a\x7d\xc7\xa9\x9b\x95\xca\x78\xa8\x08\xa9\x9b\xb2\xd0\x0c\x5b\x78\x0a\xa7\x8a\xe3\x71\x47\x8d\x0e\x7e\x0a\x39\x38\x4f\x40\xea\xe0\xd5\xfa\xa7\x36\xca\x76\xac\xc0\x55\x45\x7d\xc3\x34\x2d\x8c\xe8\x92\x24\x4f\xd4\x23\xda\xbb\x6d\xfe\xa2\xfd\xf7\x2f\x7a\x10\xcf\x85\x4b\x0f\x6e\xde\xdc\xbc\x5b\x4e\x8e\xcb\xfb\xb5\x07\x4b\xd3\x63\x14\xf4\x66\xfb\xc3\xfb\x9b\xdd\xfe\xfb\xf3\xae\x98\x59\x06\xeb\xd9\xb4\xb3\xa9\x33\x38\xb3\xac\x5d\x4e\xf3\x87\xe3\xf2\x3d\x43\xf1\x7a\x00\x63\x80\x7c\x3b\xfc\x84\xdb\x3d\x0c\xd6\x0a\x4f\xe7\x6e\xd6\x95\x53\x81\x6e\x29\xa1\xf3\x80\x2c\x68\xb6\xb9\x61\x61\xe8\x82\x06\xb6\x03\x98\x85\x51\x6b\x4d\xb5\xd6\xcc\x50\x6b\x1c\x93\xa4\xd4\xcc\x1a\x42\x88\x2d\x92\x64\x9f\x2d\x6b\xc9\xed\xd8\x8b\xfe\xfc\xee\x89\xbf\xf0\x65\x6f\x7e\xcf\xf3\x58\x1f\xc7\xda\xa7\xac\xcd\x6c\x30\xe0\xe8\x43\xef\x42\xef\xc1\x31\xd8\x14\x4d\x53\xc0\xe3\x08\x86\x69\x0a\x68\x1c\x49\x46\x1e\x7a\xbb\xa1\xb3\x26\xfc\x38\x62\xed\x98\x25\xa1\x0d\xae\x52\x2c\x9c\x76\xcc\xea\xe0\x2e\x8f\x44\xe9\xe0\xb4\xd6\x4a\x6b\x6d\xad\x74\x4e\x16\x88\xb2\xe5\x89\x90\xd2\x88\x98\x2b\xdb\x2f\xb6\x5f\xe4\x86\x7c\xde\x87\xbf\xf9\x85\x3e\xfc\xc2\x13\xd9\xed\x3f\xbc\xbb\x1e\x81\x6b\x2f\xd2\x7e\xa3\x42\x9e\x32\x1f\xa8\x0b\xd4\xa7\x2c\x94\x69\xbf\x18\xa5\x73\xac\xbc\x48\x69\xbc\x6e\x16\x5f\x80\x6c\xca\x4f\x93\xdd\x56\x33\x5c\xbc\xd2\x1c\x42\x53\x0b\x57\x55\x41\x05\x52\x79\x15\xcc\xef\xed\x10\x2f\xaa\x0a\x32\xdf\x70\x8a\x49\x69\x79\x93\xec\xa3\x76\xcd\x97\xfd\xf9\xa5\x67\xf2\x7b\xfa\xf3\xe2\x99\x90\xec\x14\x68\x5a\xf8\x60\x7d\xb0\x2e\xcd\x83\x48\xd5\xe2\xc8\xcd\xe7\xc5\x34\x4a\x13\x50\x84\xd3\x7a\x4d\xb3\xe6\x81\xfb\x4d\x3f\x53\xa4\x27\x90\x10\xe3\xb8\x23\xc1\x07\x59\x19\x11\x9a\xdf\xd7\x17\xe1\x0b\xc4\xa8\x6b\x99\xa1\x97\x87\xb3\xcb\xea\x47\x1d\xb9\xfa\x7f\x13\xfb\xf2\xdb\xe4\x9f\x25\x77\x3f\xe7\x11\xbc\xba\x09\x6f\x2f\x69\xcc\xcf\xe0\xf6\xc8\xc6\xf2\xe1\xe3\xcd\x77\x6f\xb3\x16\xb8\xd5\x45\xe0\x0f\x03\xa0\x41\x65\x07\x37\x63\xdb\x2d\x3b\x11\xcf\xa0\x84\x15\xc8\x1f\x2a\x50\x14\x95\xb6\x69\x3e\x9f\x01\xab\xca\xc7\x04\x96\xbb\x42\x4a\xa3\x8c\x51\xa1\x09\x87\xb6\x05\xe8\xa4\x64\x50\x46\x1a\xa3\x95\xf6\x21\x57\x5a\xab\x64\x97\xc1\x47\x15\xf9\xd3\xd7\x76\x56\xc9\x5f\x46\x54\xd3\x1f\x68\xe7\xcb\x66\xc6\x56\x22\x70\xa8\xc1\x10\x70\x04\x33\x98\x80\x36\xd4\x3e\xf4\x6e\x48\x0f\x33\xe2\x99\xd1\x14\x54\x9f\x5a\x80\x8b\xca\xbb\x54\xcc\x35\x70\x24\x1c\xab\xe2\x45\x1b\x9b\x06\xa0\x93\x16\x41\x4d\xd6\xae\x4d\x9c\xb4\x8a\x58\x20\xf9\xc8\x63\xde\x6f\x6d\xe3\x62\x3b\xff\xf5\xcb\x6a\xe6\xaf\x8f\x65\xcc\xb8\x7c\xbc\xb4\xf2\x75\x2c\x43\x54\x11\xa3\x16\x3a\x00\x67\x04\x8a\xd0\x65\xd8\xcd\xa3\xeb\x96\x6d\x46\xa6\x1d\x2b\x61\x53\x86\x36\x70\x7c\x80\x15\x75\xc0\x07\x49\xab\xc5\x96\xda\xe5\x4a\xe9\xd8\xce\x3a\x4c\x75\x0f\xf0\xa4\x64\xd0\x8c\x42\xc3\x89\x87\x5a\xa8\x26\x4c\x42\x96\xab\xbd\xb6\x4b\x87\x17\x63\xfa\xff\xe0\xd9\xa7\x47\x70\xf6\x69\x12\x12\xd0\x3d\xe4\xa0\x09\xf9\xc6\xbb\x07\xed\x0e\x8b\x49\xc1\xb3\xde\xc1\x0a\xb0\x4f\x0c\xb0\x72\x19\xd6\x7a\x16\xa0\xad\x60\x68\xd1\x2f\x8c\xab\x15\xd7\x81\x8d\xcf\x3e\x4b\x78\xd6\x44\x6e\xa7\xb7\xc9\x9f\xae\x71\xa3\x7d\x0c\x30\x3c\x47\x82\x45\x3c\xc4\x62\xf6\xbc\x7b\x5e\x3c\x1e\x7f\xe3\xcd\xed\xfd\xb5\x18\xed\xfe\x66\x9b\x3b\x94\x22\x83\x94\x6e\x70\x5f\x1f\x7a\x3a\xd4\x8c\x60\x2a\x7c\x47\x38\xab\x7e\x92\xa0\xf2\x51\x02\x58\x84\x7a\xb0\xcc\x18\xef\x0e\xfc\x6c\xc3\x11\x88\x70\xdc\xb9\x4a\x6a\xad\x48\x65\x91\xd4\x95\x86\x9c\x09\x4a\xa4\xc7\x9c\x32\xe6\x38\x57\x42\xe5\x94\x49\x46\xea\xce\x52\x4d\x95\x8a\xdc\x49\xec\x51\xec\x7d\x66\x93\x3f\xba\xd8\xaa\xbf\x8d\x99\xa4\x37\xd7\xfa\xe6\xed\x93\xc7\xf8\xb9\xce\xfd\xf5\x17\x04\x6c\x7b\xfb\x53\x79\x30\x2d\xc8\x37\xc7\xf9\xb8\x2c\xa7\x74\xfc\xb1\x4f\x0f\x11\xf4\x37\xba\x65\xc9\xa5\x10\xf8\x07\x7a\xbd\xca\xac\x3e\x07\x1f\x5a\x01\x12\xc0\x81\x1a\x02\x62\x92\x2b\xc5\x25\x03\x25\x63\x8b\xc1\xc6\x58\x92\x24\x7f\x94\xe1\x47\xb5\x77\x17\xfe\xd5\xc5\x2f\x5f\x2b\xde\xfe\x6a\x9d\x05\x9f\x11\x40\xd9\xa5\x4a\xf6\x67\xed\xbc\xbb\xbf\xbd\x79\x73\x77\x0f\x2e\xef\x99\xcb\xdc\x83\xaa\x53\x16\x21\x89\xed\x71\x83\x3f\x0d\x38\xab\x83\x89\xbb\xc2\xf8\xa9\x01\xc7\xa8\xb8\x6a\xea\x71\x04\x66\x9c\xd7\xb7\x1d\x9f\x47\x40\x44\x38\x8a\x70\x34\x6c\x3e\x73\xc5\xac\x65\x8a\x03\x1c\xbd\x0b\x1e\x27\xeb\x2e\xc6\x8b\xfd\xce\x5c\xc6\x70\x59\x59\xff\xfe\x1a\x41\xbc\x8d\x82\x4f\x1f\x9f\x65\x19\x6e\xd7\x0a\xa0\x57\x77\x1f\xb2\xa7\x36\x7e\x58\x2e\xbe\xdd\xdf\xdd\xbf\x7e\xfb\xdc\x40\xb9\x46\xae\x01\xf3\x06\x10\xd0\xcb\xaa\xf0\x90\xe1\xb9\x0d\xcc\x43\x1c\x3a\x05\x2a\x12\xce\x63\xa5\x9d\x03\xa5\x0f\xcc\xe6\x0e\x94\x79\x2d\x25\x42\x55\x55\xe4\x1c\x96\xbc\x60\x1c\xe2\x9d\x41\x94\x3c\x74\x73\x57\xc1\xb2\x90\xdc\xc2\x92\xc8\x54\xcd\x87\x70\xd6\x23\x18\x33\xca\x03\x9d\xa6\x69\x6e\xa5\xce\x99\x1d\x83\x82\x07\x9e\x17\x15\xac\x64\x24\x22\x17\x2a\x49\xb6\xd9\x21\x61\x91\x37\x09\x5e\x3c\xef\xbf\x5e\xb9\xa3\x97\x91\x7f\xfd\xe1\xe3\xdb\x74\xff\x39\x7f\xb0\xce\xfb\x67\x24\xd2\x2b\x48\x63\x05\x35\x64\x07\x70\xce\x1d\x20\x61\xa8\x38\xd1\xd2\x54\x55\x5e\xe4\xb6\x60\x54\x12\xd3\xd0\x41\xe3\x32\x24\x59\xc9\x90\xaa\xd8\x6c\x81\x0c\xde\x28\x35\x95\xbe\x2f\x0f\x5b\xbe\x9c\x9d\x36\xe4\xed\x88\x43\x7d\x6c\x18\x2b\x3b\x3d\x34\x5a\xfb\x1e\xe4\xa0\x01\x9e\x71\xc2\x59\x40\xf3\xa8\x01\x0a\x48\x33\xec\x62\x5d\xce\x26\x3b\x27\x66\x6f\x77\x30\xf9\xcb\x04\x25\x1f\x23\x1a\x66\x99\x2b\x77\xcf\x39\x21\xd7\xd5\xfa\xcd\xab\xfb\xdb\x4b\x26\x38\x6a\x71\xdf\xbe\xba\xbb\xbf\xd9\xde\xdf\xbe\x79\xfd\xdd\xdb\x57\xb7\x6f\xbe\x05\x1f\x5e\xdd\xdf\x66\xe7\xcc\x85\xd3\x91\xf1\x0a\x41\x5a\x55\x08\xc2\x8a\x0a\x63\xf2\x0a\xd2\xa2\x40\xac\xb2\x53\x18\xd3\xc2\x8c\xb8\x62\x81\x08\xb1\x83\xf6\xf0\x20\x19\xcf\x6d\x4e\x27\xca\xc8\xe0\x18\xc8\x81\x45\x42\x0a\x42\x05\xae\x3a\x05\xc3\x79\x43\x0f\x87\xc3\x21\x10\x42\x40\x87\x6c\xa8\x5b\x90\x8b\x95\x17\xa6\x7e\xa4\x7b\xbd\xcb\xa3\x47\x7e\xb1\xea\x5f\x84\xd3\xd7\xe6\x5e\x1a\x7f\xf3\x67\xe0\x2a\xa0\xb2\x74\x65\x2d\xfe\x8d\x75\x14\xf5\xe6\x18\x5a\x80\xa4\xa4\x12\x5a\x82\x1d\x64\x84\x73\x22\xf5\xf1\x31\x91\x94\x61\x8c\xb4\x6e\xfa\x1a\x88\x60\xb3\xe4\x31\xd9\xe5\x2e\x1c\x3f\xb5\x82\x97\xb6\xa0\x59\x5d\xf5\xad\x52\xe6\x30\x39\x01\x08\x38\x56\xc2\x0a\xae\x05\x09\x87\x56\x80\x1c\x38\xf1\xc9\x6e\xf3\x98\x64\xa8\x22\x31\xdf\x0e\x88\x47\xb5\xd3\x99\x7b\xf2\x99\x7e\x58\xdb\x7e\x89\x26\xbf\x88\x48\x3c\x2b\x72\xbf\x88\x65\x7f\xf7\xf6\xc3\xdd\x87\x8f\x6f\xbf\x7d\x3a\x7a\x36\x15\x20\xce\x18\xa6\x38\x2b\x39\xa3\xa1\x9f\x59\x6a\x67\x8d\xd2\x6a\x3e\x9a\x68\x4e\x19\x86\x35\x62\xf3\x99\x20\x08\x11\x34\xd8\x96\xe1\x18\x6c\xd9\x42\x9c\x4e\x4d\x63\xe7\x41\xb2\xc2\x16\x2c\x2d\x41\x61\x44\xac\x88\xf7\x0d\x6e\x5d\xaf\x74\xce\x6d\x55\x5a\x68\x08\xb2\xa5\xe0\x49\xb2\x59\x7c\x8c\xa8\xcf\x92\x25\xaf\x92\x77\xc9\xbf\x8a\x98\xe9\x5b\x70\xf7\x1c\xb3\xb1\xce\x9e\x15\x4d\x75\x8d\x31\xbd\x7b\xfe\xd9\xcd\xfa\x99\xf5\x7e\x47\x6b\x66\x20\x2c\x21\xac\xe0\x4f\x3a\xb5\x8f\xc9\x34\x81\x7c\x56\xe7\x71\x3c\xa7\xe3\xe5\xdf\x31\x10\x39\x8e\xe7\x9d\x3e\x0f\x7b\xfc\xa3\x57\x3c\x77\x39\xc4\xbb\xca\x5a\xed\x8c\x71\xda\xda\xa7\xab\xe8\x77\x99\x47\xbb\x63\x99\xb9\x72\x0a\xbf\xdc\xf9\x5e\xdd\xbc\xf9\xf6\x79\x2a\xef\x12\x5d\x7c\xf5\x21\x53\xc2\x75\x80\x84\x3e\x1d\x63\x18\xba\x01\xa7\x30\x70\x59\xe5\xbe\xe0\x83\x67\x8e\x04\x23\x01\x27\x61\x3a\x66\x46\xa2\x42\x2c\x07\x9c\xd4\x73\x7f\xc4\x48\xa3\x9a\x61\x06\x92\x30\x2a\xc3\xfa\x14\x96\x6b\x9c\xbd\x7e\x6c\x76\x3c\xb3\xcf\x72\xea\x77\xcf\x50\x3e\x97\x91\xd8\x2e\xbb\xf4\xf3\xc4\xc0\x69\x74\x00\xba\x18\x54\xa3\x9f\x28\x40\x23\x50\xcb\x53\xe4\xda\x0d\xb2\x4b\x45\xeb\x94\x6d\xd2\x93\xf7\xde\xdb\xce\xda\xae\xeb\x82\x17\x4e\x3a\xaa\xb8\x34\x9a\x2d\xfd\xaf\x1f\xe5\x8e\x65\x75\xf4\x3b\x2f\x00\xc4\x17\xfc\xae\x9f\x89\xc8\xef\xa3\x48\x1f\x82\xe0\x1c\x12\xd0\x0a\x81\x29\x94\x08\x87\xd1\x87\xa3\x05\x8b\x2b\x9a\x97\x30\xab\x09\xb7\x36\xb4\x9c\x15\x26\x27\xcd\x7c\x4e\xf3\x60\xd3\xc4\x5a\x8c\x7e\xf5\x7c\x78\x8a\x3d\x5e\x9f\xfd\xbb\x9f\x7f\x76\x73\x9d\x0f\x6b\x9d\x27\xfc\xc9\xa6\x66\x99\x07\xb3\x06\xc9\x34\x9d\xd3\x43\x6a\x4e\xe3\x78\x9a\x35\xc8\xa7\xe9\x31\xf9\x3c\x1b\x4a\x57\xfe\xd2\x6c\xd8\x24\xee\xd2\xbe\xff\xf7\xb5\x7d\x5f\xb4\x6d\xd9\x78\xbf\x32\x37\xbf\x36\x5f\x77\xa3\xa3\xa2\x82\x25\xac\xca\xf2\xc7\xd6\xb9\x21\xd5\x71\x7e\x16\xb3\x04\xf9\x32\x61\x8f\x5f\x7c\xb0\xd3\x3f\x5a\xc9\x72\xbb\x4c\x56\x76\x1e\xf6\xa5\xa4\x82\xca\x97\xdf\x56\x9e\x37\xb5\x77\xe9\xda\xc6\xd5\x42\xca\xe2\x6d\x3f\xde\xbc\x7f\xf7\xf1\x66\x9f\x6a\xcf\xb3\xfa\x90\xe6\xe7\x69\x23\xd9\x83\x21\x9b\x9c\x3c\x74\x24\xd5\xd8\xea\xd0\x68\x6d\x64\x21\xa2\x2e\x9c\x01\x7a\xaf\x52\xff\x42\x83\x4f\xf9\x9f\x88\x4f\x7d\x18\x9b\x06\xc0\xe4\x37\x49\x97\x1e\xf7\x68\x27\x5f\x70\x35\x5e\xfd\xa0\xd5\x7e\xf8\xb8\xfa\x43\xaf\x9e\x6c\x99\xed\xd3\xfb\xab\x27\xbb\x61\x7b\x79\x7f\xfd\x95\xcf\x80\xdc\xc2\x9f\x46\x07\xfa\x40\x52\x0a\xfa\x4f\xe7\xeb\xd5\x4f\xdd\x62\x54\x9a\x61\x00\x64\x98\xcf\xf1\x6d\xfa\xd9\x27\x3b\x19\x38\x48\x08\x21\x47\x42\xc8\x74\xb9\x1e\x29\xa5\x20\x79\xf6\x8f\x4b\x5e\x9b\xed\x8b\xf4\x18\xb9\x50\xee\x76\xfb\x17\x79\xc8\x15\x2c\x71\x7f\xf3\x21\xd3\x4d\x5e\x64\x79\x61\x6b\xde\xc2\x5e\x30\x52\xcc\xca\xcd\x56\xa5\xd4\xcc\x36\x6d\x8a\xf4\x48\x71\xc8\xcf\x85\x2b\x3c\x40\xa1\xb4\x5e\x01\x19\xc9\xcb\xfe\x61\x42\x1f\xd9\xa6\x8b\xf8\x9c\x75\x54\xfe\xbf\x11\x03\xfc\x9f\x92\xff\x92\xfc\xf7\x44\xfe\x4c\x15\xe5\xaa\x7e\xb2\x8d\x70\xa9\x67\xc7\xfd\xaa\x8f\xf2\xe1\xe3\xfd\xdd\x9b\x0f\xe0\xd9\x78\x5d\x6d\xaf\xfd\x73\x35\xff\xbb\x17\xbb\xd3\xfb\xb5\x68\xb5\xac\x41\x1d\x44\x9a\x20\xaa\x2b\x38\x57\xca\x08\xa0\x80\x29\x8d\xad\x1a\x5d\xe5\xae\xa4\xc7\xb1\x40\xb8\x2d\xa5\xb0\x36\xa0\xac\x7c\x98\xfc\xe2\x8d\x75\xa1\x8c\x6f\x13\xc3\x0c\x53\xa0\x08\x91\x98\x06\x66\x25\x87\x8b\x49\xd1\x34\xd4\x48\xca\x19\xdf\x69\xac\x99\xe6\x9c\x22\x34\x77\xa1\x0c\x96\x01\x03\xba\xb4\xee\x14\x2c\x4b\x58\x14\x14\xab\x2a\x27\x04\x42\x53\xe4\x9c\x94\xc1\xcc\xe7\xcf\x16\xde\x19\x13\x4e\x11\x23\x8b\x25\x5d\x4d\xa8\xe2\x95\x25\x98\x9e\x49\x2b\x85\x4a\xb6\x00\x65\xe5\x6e\x7a\xc6\x2b\xf3\xfa\xe5\xdc\x7a\x22\x2a\x46\xdb\xee\x27\x1a\xb1\x8e\xa9\x05\xa7\x4f\xf6\x7a\xb5\x43\x0f\x13\x18\x96\x5d\xae\xe8\xba\x2e\xb9\x70\xcc\x0c\xd9\xf4\x99\xcf\xfb\xee\x42\xe1\xb4\x1c\x9e\xef\x9e\x64\x86\x22\x1a\xe7\x1b\x00\x7d\x09\x8d\x5b\x3c\xf0\xf3\x19\x90\x48\x95\x8f\x81\x5a\x36\xf8\x06\x63\x6b\x76\x39\x92\x22\x6a\x70\x04\xef\x83\x60\x56\x8b\x9a\x81\xde\x03\xd9\x98\x0b\x16\x1c\x64\xf6\xd1\xc5\x9a\xa5\x88\xfd\xc9\xee\x9e\xe9\x7b\x7f\x56\x90\x8f\x77\xdb\x70\xcf\xfa\x3a\x32\x14\xe1\x30\x00\xff\x50\x80\x2e\x0c\x00\x9f\x10\xd1\x7e\x07\x51\x38\x80\x6e\x0d\x79\x04\xea\x3d\xe8\x96\x2f\x25\x00\x8e\xf5\x73\x74\xdf\xee\xf8\x35\xbf\xf6\x42\xbd\x7c\x5d\xca\x11\xd9\x1f\x51\x99\xb2\xab\x41\x53\x37\x4d\x1d\x78\xdd\x01\x1e\x6b\x8b\x9a\xc0\xb7\x30\xde\x15\x87\xc1\xff\xd4\x5b\xbb\x25\x01\x83\xe1\xd3\x11\x1c\x92\x24\x4b\x7c\x56\xed\xe5\xce\x5c\x56\x7b\xfc\xff\xaf\x29\x8a\x67\x85\x3a\x77\xdb\xab\x6a\x50\x53\x4f\x96\x5a\xc2\x80\xaa\x7f\x52\x35\xd0\x8c\x4b\xa7\x8e\xf3\x69\x33\x7c\xc2\x75\x66\x1f\xf4\x4e\x3f\x26\xda\x71\xc1\x82\x1f\x47\x20\x19\x95\xca\x4d\xc1\xaf\xb5\xc2\x29\x60\x8f\x78\x6f\x53\x7e\x61\xc6\xbb\xa0\xfc\x5f\x52\x4f\xc5\x12\xbc\x98\x70\xbd\x18\xc2\x6c\xcb\x1f\x20\xcc\x70\x41\x15\xce\xeb\x42\x8d\x9e\xcd\x84\x1f\x8e\x30\xf4\x67\x92\x37\xc7\x54\x3a\x25\xb4\x4d\xb9\x16\xa1\x41\x25\xb2\xb0\x97\x44\x9e\xc3\x54\x22\x47\x4a\x55\xa4\x55\x38\x63\xaa\x39\x89\x7b\xe1\x69\xaf\x32\xfc\xf3\xbd\x30\xc3\xa1\x1f\x0e\x80\x26\xdb\xc4\x64\x2e\xc6\x4f\x3e\xef\x81\x5f\xc5\xe1\x5e\x0c\xb0\x27\xf6\x2a\x03\x4e\x3e\x7e\x85\xc2\xc7\x2f\xb3\x4b\x7e\x4a\xea\x98\xbd\x1e\x22\x2f\xc7\x0e\x72\xce\xb9\x15\x42\x08\x13\xb4\x5e\xce\x6a\x9f\x80\x44\xa7\x76\x6f\xb2\xfe\x45\x9b\x8c\xff\xa9\xf2\x59\x1f\x86\xae\x03\x38\x49\x01\x8d\xe3\x36\x44\xe6\xf8\xaf\x8d\xdb\xfd\xab\xeb\xb8\x3d\x0d\x1b\xdd\xca\x87\xf2\xab\xc3\xd6\x9d\x48\x3b\xa6\x6a\x1d\xb5\xc1\xea\x20\x2a\x48\x1a\x38\x6a\x2a\x01\x09\x1e\x62\xcb\xa0\x4a\x7d\x38\x52\xa1\x15\x8b\xf5\xf5\x5d\x36\x46\x0e\xe7\x6f\x9e\xaa\xcf\x5e\x68\x33\xef\xf6\xef\xbf\xbf\x7f\xf7\x95\x8f\x9e\x51\xd8\xa7\xd0\x59\x21\xfc\x90\x77\x56\xf8\x5a\x7a\x01\x68\x26\x9c\x11\xc2\x5d\x3f\xaa\x39\xa0\x9f\x3a\x53\x4a\x23\x32\x6d\x97\xb7\x9d\xee\x10\x55\x82\x44\x5d\x37\xa6\xa8\xb6\x87\xe1\x67\x9f\x70\xd8\x68\x26\x6d\xfc\x1e\x39\xe7\xd3\xd3\xde\xec\x6c\xf2\x4d\x44\xf1\x27\xe0\xee\xdb\xfd\x67\x91\xf1\xdd\xf6\xfd\xf7\xdf\x3c\x99\x7f\xcf\x52\xe7\x6b\x34\x21\x72\xca\xac\x18\x7e\xe5\x60\xad\x95\x6d\x5d\xcf\xc6\x9a\x87\x5e\x81\xbc\x0f\x90\xb8\xf8\x44\x5b\xc3\xa5\x72\xa6\x17\x93\x0d\x3d\x50\xd6\x61\x60\x53\x64\x89\xd0\x62\x67\x0f\x9e\x59\xab\x79\x2b\xbc\x3e\x8d\xce\x2a\x40\x00\x33\xb0\xb4\xb6\x10\xc2\x08\x1a\xce\xa0\x72\xda\x68\x6f\x75\x59\x58\x58\xa1\x83\x67\x2b\x1f\x06\xdb\x37\xe9\x71\x5d\x1b\xaf\x5f\x3c\xe3\xdd\x7e\xf7\xf2\x21\x5f\x9c\x44\xb5\x2f\x3f\x41\x94\x19\x88\x35\x29\x5c\x41\xf1\xb1\xa6\x73\x22\xba\x1e\x86\xe3\x48\xfa\x20\x33\x23\xb9\xe0\x32\x3d\x5a\x1f\x64\x55\xb2\xa1\x9a\x18\xa5\x02\x90\xd0\x40\xe2\x68\x19\xb3\x08\x42\x29\xb3\xfa\x4d\x59\xf3\x34\x76\xe5\x57\x47\xee\xfd\x2f\x8f\xcd\xf9\x17\x7b\x3f\xae\x3d\x5c\xf6\x68\x95\x25\x11\x4b\xfc\x67\xcf\x6c\xf0\xaf\x3e\x84\xcc\xfd\x9e\x91\xde\xe9\x5f\x1e\xce\x95\x5f\x0f\xc5\x7a\x6c\xb5\xea\x97\xbf\x7a\x52\xa2\xdd\x20\x20\x6b\xc0\x43\x53\x07\xbf\x61\x29\x9c\x47\xff\xe0\x33\xb9\x62\xfc\xd5\x23\xd9\xbb\x94\x27\x65\x02\x2f\x4a\x28\x6b\x58\x77\xb3\xdd\xff\x10\x29\x12\xff\x19\xf8\xf0\xf1\xb7\x60\xb7\xdf\x7e\xfc\x5b\xf0\x51\xa5\xbc\x82\x0d\xde\x14\x41\x71\x0f\x4a\x90\xc8\x29\xd8\x70\x9c\x07\x0a\x2c\xc8\x03\x57\x3c\xe4\x69\x43\x19\x68\x24\x16\x15\x98\x30\x2e\xb9\x6d\x25\xc6\x8e\x72\x53\xb9\x82\x70\xa5\x05\x61\xb8\xe2\x78\xcd\xaf\xa5\x6a\x67\xe2\x9d\xaf\x9c\x9d\xdf\xa6\xfb\x37\xcf\xe5\xf1\x2f\xba\x88\x37\xb2\xa9\xb0\x25\x95\x15\x55\x81\x4a\x4d\x30\x41\x02\x61\x87\x91\x18\x6c\x38\x6c\x95\x12\xc4\x38\x9b\x87\x93\x10\x90\x4b\x6a\x97\x2d\xc7\xe9\x87\x29\xab\x18\xb2\x3d\xe8\x62\xfc\x5e\x5d\xf8\x9c\xcb\xe4\xcf\x93\xdf\x25\xff\x36\xa1\xc9\x7f\x4e\xfe\xd7\x24\xfd\x17\x68\xcd\x48\xdd\x5e\x01\x76\xcb\x0d\x57\x1f\xff\xed\x37\x6f\x3f\xbc\xbe\xdd\xbf\xf0\xfe\xd3\x0b\x38\x66\x05\xa6\xfd\x63\xf0\x71\xf1\xf7\xc1\xeb\x0f\x1f\xdf\xbe\x54\xf3\xdb\x9e\x4d\x5e\x80\x0a\x41\xc1\xb4\x62\x94\x19\xe1\x38\x46\x45\x29\x34\xaf\x30\x2a\xec\x29\xaa\xd5\x62\x08\x19\x44\xa6\xaa\xb8\x01\x95\xa1\x18\xd6\xe1\x88\x60\xce\x1a\x70\x36\x42\x48\x19\x2a\x81\x0d\xe6\x3b\x0d\x9b\xda\xcd\xa7\x30\x1d\x5b\xeb\xfa\xc1\x1a\x0f\xf2\xfe\x84\x10\x07\x92\x85\xd3\x70\x02\x04\x7d\xea\xb8\x58\xd6\x43\x5f\x81\x62\x7c\xe8\xb3\x3c\x9c\x06\x14\xf4\x36\x5f\x1e\x79\xe8\xe0\x30\xa6\x74\x71\x20\x3c\x2b\xbb\x94\xd2\x41\x09\x6b\x6d\xcd\x6a\x97\x24\x79\x52\x2f\x67\x6e\x7a\x48\xfe\xec\x82\xb4\x59\xf1\x12\xff\x3a\x49\xb6\x9f\x71\x4f\x37\xb7\x30\x0a\x2d\xc4\x73\x7e\x3d\xf3\xb3\xdb\x57\xdf\xbe\xcd\xee\x57\xd4\x0b\xb8\xbc\x2f\x86\xc0\xf6\xfe\xe6\xcd\xc6\x9c\xb4\xb1\xb8\xd0\x95\x0d\x95\x0e\xe7\x7a\xf6\xa9\x9c\x0f\xdb\xf3\xdc\xa6\x66\x36\x46\xa9\x73\x10\x59\xb9\x98\xc4\xc1\x86\x32\x13\xcb\x31\xb2\xbc\x96\x7f\xd1\x3c\x87\x04\x0b\x8c\x69\x05\x6a\x12\x13\x06\x41\xa7\x7a\xd6\x28\x4f\x15\x63\x2c\x28\x4a\xe9\x91\xac\xf6\xef\x3e\x69\xd2\x71\x6f\xb7\x2e\x62\x6b\x6f\x93\xdf\x26\x7f\x17\x9f\xee\x05\x65\xbb\xee\xc5\xe0\x12\x65\xfd\x32\xec\x0a\x6e\xf6\xdf\xbd\xfd\xb0\x22\x5b\x9f\x29\x47\x5f\xc1\x87\xdb\xe7\xff\x05\xa3\x48\x57\x24\xb5\x0a\x51\xc9\xd2\x9c\x62\x08\x79\xcd\x2c\x04\x47\x89\x94\xf5\xf8\x50\xcb\x9e\x18\x60\xc2\x01\x32\xa9\x3f\x0d\x76\xb1\x16\xca\xaa\xc4\xb0\x3a\xdb\xb3\x01\x1a\x24\xb8\x14\x05\x0a\x47\x81\x10\xc7\x5b\x47\x19\x62\x14\x42\x4e\x30\x09\xa2\x22\xb0\x14\xa6\x85\x4c\x2b\x5e\x95\xb6\xa2\xa4\x52\x25\x48\x20\xc1\x0c\x94\x3e\x74\x84\xe4\x32\xc7\x6d\x68\x01\x0b\x0d\x38\xd4\x98\x42\x4a\x8a\x4a\x51\xb4\xea\xb2\x6f\xcd\xde\xed\xec\x2f\xd5\xd0\x48\x30\xd5\x8b\xf9\x3c\x85\xb2\x9e\xa7\x3a\x94\x3b\xcc\x18\x63\x06\x63\x8c\xd7\x31\x7c\x24\xfb\x7a\xd3\x5d\xc6\xf0\x2f\x92\x7f\x9f\xfc\xc7\xe4\x7f\x7e\x39\x86\xef\xde\x7e\xb1\x50\x3e\x5e\x16\xca\x77\x6f\x3f\xbc\xbe\xd9\xbd\xfb\x12\xbe\xf9\xb4\x4e\x5e\x81\xb8\x40\x2e\xd5\xa7\x94\x63\x8b\x79\x3a\x1a\xc2\xb5\x00\x8d\x85\x60\xe4\xc8\x9a\x83\x6a\x6d\xe7\x79\x6f\x05\x2d\x4b\xe5\x38\x93\xa2\x0a\x63\xb1\xac\xea\x0a\x43\x56\xe1\x93\x23\x44\x39\x60\x5c\x30\x0c\xa9\x53\x9a\x90\xca\x40\xb2\xe9\xb4\xc3\x4e\x11\xd4\x48\x62\x74\x55\xdb\x50\x87\x73\x63\xad\x69\x47\x66\xc5\xe0\x5a\x5c\x31\x80\xd8\x58\x1f\x40\x41\xd0\xc3\xc0\x63\x80\x2d\x75\x0f\x87\x54\x3c\x26\x6d\x15\x0e\x9b\x62\xd9\x1f\x67\x32\x1e\x4b\xaf\xbb\xb1\x9a\xba\xd5\x17\x45\x7b\x9b\xda\x64\x1b\xad\xd0\x8b\x86\x6b\x8c\x37\xad\x2a\x24\xdf\x83\xdd\x66\x45\x4a\xd4\x56\x09\xa5\x3f\xd1\xf4\x0c\x73\x5f\x66\x64\x2e\x4f\x69\xce\xe6\x2e\x9c\x71\x90\xa1\xe3\x69\x3e\xcc\x2c\xb5\x08\x2b\x52\x39\x26\x0a\x4e\xed\x41\xd4\x1a\x54\x72\x42\x96\x8e\xc9\x26\x39\x6e\xf1\x1e\x3d\x8b\x61\x5f\x38\x27\x3f\x6b\x05\x1c\xd3\xe3\x5c\xf9\xc5\xb6\x4d\xc7\x74\x9c\x61\xf4\x29\x77\x3c\x8c\x92\xc9\xe5\x5b\x92\x27\x91\xd7\x29\xad\x63\x84\xfe\xc5\x1a\xbe\x72\x91\x7e\x75\x29\x47\x9c\xda\xbb\x57\xdf\xbe\x8d\xe0\x04\x70\x59\xbb\xdb\xcb\xfb\xee\xb0\x2e\xd6\xeb\x4a\x76\xa1\x52\x8f\xc9\x65\x25\xa7\x28\x88\xb4\xd4\x26\x32\x9e\x9d\xa2\x48\x59\x99\xf1\xeb\x55\x5a\x9f\x49\x30\x28\xcf\x21\x42\xb2\xc2\xb4\x04\x96\x9c\x6b\x42\xc8\xdc\xa2\x3c\xb5\x84\x04\x47\x08\x21\x96\xd0\xc8\xe1\xb1\xee\x41\x7d\x46\x63\x25\xe4\xcb\xf6\x5f\x1c\x8c\xbb\x9b\xbb\x9f\xef\x44\x20\x06\xce\x5f\x5f\x00\x77\xe0\xf2\x7e\x05\xe0\xed\x0e\xf3\x31\xd5\xb3\x95\x20\xe1\x96\x16\xba\x6a\x02\x8c\x1d\xa8\x53\x31\x1f\x32\x6a\xe9\x01\xb8\x87\x21\xc8\x8c\x80\xe9\x41\x05\x98\xd9\xcb\x3b\x0d\x23\x0b\x54\x54\x0c\x39\x44\x28\x01\x07\x0a\xe0\x83\xce\xaa\xb9\x84\x30\xab\x16\xa3\x96\x87\x69\x59\x40\x8c\xc7\xaf\x98\x23\x4e\xba\x4c\xef\xeb\x9d\xfd\x7d\xfb\xd0\xbb\xf5\xb4\xf9\x19\x05\x40\xcc\xfb\xdc\xfc\xe2\x3e\xb4\x7f\x1e\x18\x43\x92\x68\x2c\xb3\x5c\x71\x21\x24\xe8\x5c\x51\x82\x51\x57\xd2\xd4\xa4\xf7\xa6\x15\x5e\x52\x42\x44\xcd\xd6\x05\xf4\x70\x34\xc0\x70\x06\xe3\x69\x73\x32\x27\x07\x8c\x91\x15\x96\x04\xd4\x08\xca\x12\xed\x2c\x65\xcb\x46\x4a\x05\xe6\x04\x43\x8c\x4d\xad\x30\xb4\x88\x31\xa4\xab\xa5\xef\xb2\x16\x9c\x72\x0d\x8a\x29\x18\xca\x72\x9d\x93\xd3\x5a\xe9\x9e\x16\x1e\x5a\x81\xa5\xe4\x12\xca\xb8\x07\xa9\x68\xb3\xd7\x91\x41\xe2\x42\x60\x7b\xe5\xb7\xbd\x5f\x71\x61\xf7\x91\x4f\x62\x8d\x49\xdc\x7e\x1e\x82\x1b\xbd\x2f\x66\x03\xaa\x83\x7c\x4c\x42\x4d\xcc\x48\x7d\xa1\xc3\x30\xea\x40\x24\xe8\xba\x59\xe2\x94\xd4\x41\xe7\x14\xb9\x0a\x71\xc2\xda\x3e\xf8\xb4\xb6\x13\x55\x46\x2f\x86\x26\xd5\xa8\x13\x94\xa6\x95\x56\xc1\x1a\xc7\x41\xc1\x38\x61\x14\x43\xc3\xbb\xe5\xb9\x80\xf1\x49\xcb\xe1\xfb\xe4\x2f\x92\x7f\x97\xfc\x87\x58\xbf\xfc\xf3\xe7\x92\x7e\x3d\x21\x17\xa5\xfd\xbf\x8a\x4e\x7f\xf1\x60\x70\x14\x6f\xce\x72\xc3\xa5\x5c\x1e\x4c\x09\xc1\x49\x55\xd6\x35\xb4\xf3\xba\x13\xad\xe2\x14\x56\xf1\xc9\xc8\xe5\xc9\x1c\xfe\xc0\x93\xd1\xd2\x30\xa3\x28\xad\xb9\x90\x1a\x2a\x69\xc3\xf9\xa0\x88\xa5\xc6\x30\x43\x95\x70\x04\xc9\xb3\xac\x95\x1f\x81\x09\x76\x76\x9c\x17\x36\x27\xe0\x30\xcb\xd4\xcf\x22\x83\x07\x78\xf4\xb8\x6d\x6c\x03\x1b\xbb\xda\x7b\xf2\x91\xa4\xe8\x89\x83\x3e\x2a\x0c\xfd\x13\xf0\x84\xff\x06\x56\xab\x81\xf7\x56\x23\xe6\x10\xe2\xe3\x4e\x93\xd0\x4d\xea\xd4\x12\xef\x3f\x9d\xb3\x92\xa2\x95\x7b\x77\x9f\x92\x0b\xdf\x4e\x99\xfc\x93\xe4\xdf\x24\x7f\x17\x47\xf3\xbf\xfe\x0a\x5b\x6a\xb7\xfd\x15\xc6\xd4\xc7\x9f\x1b\x53\x27\x9b\x97\x00\x93\x52\x32\x2d\x39\x63\x86\x3b\x46\x50\x59\x08\x4b\x11\xc6\x85\xcb\xc3\x99\x32\x58\x41\x02\x21\x42\xd4\x22\x8a\x0c\xa8\x2c\xc5\x55\x13\x0e\x18\xe6\xb4\x49\x2b\x23\xa5\xd2\x21\xe7\xd8\xa0\xc5\x9c\x6a\xbd\x0d\x65\xa8\x0f\x8d\x71\x5d\x6f\xb5\x07\x49\x7f\x46\x58\x00\xa5\xc3\x79\x38\x03\x81\xf2\x4f\x0d\x63\xb9\xc9\x49\x5f\x02\x38\x3d\xb8\x0c\x85\x53\x5f\x06\xb3\x4d\xa2\x3d\x35\xc0\xba\x03\xd3\x7c\x18\x0d\x2d\xeb\x54\xd0\xa3\x11\xbe\xf6\x0d\x8b\x85\x16\xe9\x96\x3e\x1b\x9f\xe4\x0f\x8e\xc9\x1f\xea\xdd\xaf\x69\x6f\x72\x89\x03\xe2\xbd\x4f\xd1\xca\x3f\xbe\xa2\xfa\x9e\x08\x20\x2e\x81\x40\x99\x96\x79\x9d\x83\xb1\x06\xe7\x90\xd7\xa1\x20\x81\x10\x20\x51\x48\x80\x27\x8c\x11\xef\x7d\xa0\xa0\x0b\x0a\x7b\x04\x62\x2d\x16\x7b\xa4\x59\x71\xc1\x52\xfd\xe9\x17\x35\x1a\x37\x69\x8c\xf4\x5d\x81\xd7\x6f\xb2\x42\x70\xc2\x2b\x41\x70\x38\x17\xca\x9b\x55\x97\x31\x79\x4c\x76\xf4\xc7\x49\xca\xdc\x17\x0a\x0c\x41\x87\x86\x83\x16\x9c\xb3\x24\x20\x40\x1e\xce\x80\x1c\x92\x4d\xd4\x9b\xf5\x91\xa3\x68\x8d\x50\xff\x8c\xd9\x21\xe6\x70\x77\xfb\x37\x2f\x39\xdb\xb6\x1a\x95\xe0\xf8\xa9\x03\x7d\x59\x85\x53\xc6\x1e\x5a\xbf\x3c\xa1\x31\x1b\xea\x41\x08\xc6\x4a\xc2\x48\x6d\xe6\x6a\xa7\xb9\x72\x8e\xd1\x20\x03\xb2\x7d\x20\xb5\x55\x27\x46\x0b\x5f\x94\x00\x71\x9e\x6c\x12\x9b\x0c\x7b\xf5\xc4\x31\xf1\xfd\xd7\xee\x0f\x6e\xde\x2c\xdb\xd9\xe7\x19\xfc\xee\x66\x53\x56\x30\x2b\x7e\x2c\x33\x58\xc2\x79\xda\xa2\x9f\x0e\x4d\x36\x3e\xc0\x70\xdc\x95\xe1\x14\x5a\xa5\xbd\x2d\xb5\x57\xc0\x7d\xe2\xcb\x46\x6b\x2d\x46\xa1\x0d\xc6\x98\xe0\x1d\xe7\x86\x32\x58\x57\xb0\x93\xc9\x26\xea\xbc\xfc\x7d\xfa\xcf\x10\x04\xe7\x4f\x06\x1c\x61\x15\xc6\x4c\x3f\xd8\x3a\xc5\xf3\x30\x65\x53\x73\x10\x82\xf1\x92\x70\xda\x98\x39\xdf\x69\x2e\xbd\xa7\x24\xa8\x28\x2a\x44\xbf\xe8\xff\x16\x34\x8f\xa7\x5d\xb9\xd5\x2f\xf2\xe7\x17\xb6\x9a\x9b\xaf\xe8\xad\xdd\x7c\xf8\xb8\x56\x4c\xdd\xbe\xf9\x5d\x7a\x7f\x9b\x5d\xde\xca\xba\x22\xa0\x45\x18\x94\xc1\x55\x4a\xa3\xc2\x42\xd9\xf5\x32\x78\xe0\x49\x15\x9c\x50\xe2\x0c\x8a\xe3\xd1\x8d\xa3\x8b\xdf\xb7\xba\xa2\x54\x31\x32\x0b\x05\x4b\xc4\xb1\x65\x94\xbb\xb4\x26\x94\x61\xe9\x82\xb1\x36\x9c\xad\x8d\x3a\x6a\xfc\x51\xec\xfd\x8e\x27\xbf\xb9\x64\xcf\xd7\xca\xbc\x9b\x27\x68\xe6\xf7\x20\x92\x7f\xdf\x5c\x5a\x09\x7f\xb8\x7f\xf5\xf6\x42\x38\xb5\x3b\xf1\xa0\xe7\x53\xd6\x3f\x90\x49\xf5\x29\x06\xc7\x59\x4b\x50\x58\x56\x3a\xa8\xa7\x50\xb7\xbe\x75\xed\x8e\x5b\x56\x78\x1f\x86\x90\x04\x2e\x81\x03\x6d\x7a\xca\x67\x33\x1f\xc3\x01\x96\xd4\xe2\x56\x31\x9e\x29\x1b\x69\x5e\xa7\xb8\x0f\x6e\xd3\xc3\xa3\x8d\x75\x94\xcf\xe2\x66\xe0\x57\x60\x21\x22\x4e\x2a\x46\x2a\xd3\xe2\x13\x4e\xcb\xf5\x3a\x6a\xe0\x80\x16\x14\x33\xb9\x5e\xed\xe0\x83\x9c\xfc\xe4\xfd\xe4\xa7\xb4\x38\x9d\x4e\xb3\x9f\xa6\xc8\x33\xb6\xcd\xca\x5f\x79\xef\x2f\xf1\x0d\x2a\xeb\x23\x80\x41\x83\xd3\x27\x03\xa6\x78\xad\xea\xd3\x09\xf8\xd3\xac\xe3\xdb\x2f\xdd\x15\x6c\x30\xf0\x7b\xb3\xa3\x97\x48\x66\xe4\xc8\xf8\xf6\xf7\x92\x64\x6c\x44\x7a\x6a\x1d\x02\x84\x54\x1e\xc3\x03\xd5\x04\x43\x46\xab\x30\x00\x2e\x8d\x26\x48\xcb\xf9\xb4\xa3\xa6\xe3\xd8\xe4\x0d\xad\x84\x0c\x72\x2d\x49\x07\xc6\x0a\xce\x2a\x84\x79\x92\x6c\x93\x1a\xd4\x1b\xb2\x23\xc9\x77\xc9\x1f\x5f\xaa\x41\xa2\x85\x7c\x65\xa9\x88\xe8\xb3\xaf\x77\xf7\x90\xa1\x15\x08\x73\x68\xca\x20\x43\x51\x1e\xda\x48\xd6\xdb\xba\xbe\x07\xac\x9f\x4f\xf1\x6d\x47\x66\x2f\xad\x29\x4b\x4d\xb1\x2b\x4a\x67\x25\x50\xcb\x1a\xb5\xc6\x98\x75\x5f\x55\xfb\x1a\xf4\xb1\x6e\xee\x4b\x64\x51\x92\x5e\x98\x43\xe9\x79\xc8\xe8\xcc\x40\xe5\xbd\xad\x9d\xab\x93\x6d\x3a\xfc\x3d\xe7\x07\xca\xce\x81\x81\x36\xb0\x14\x7e\x42\x69\xf1\xf7\x98\x1f\x69\x22\x33\x14\xe3\xdc\x7f\x1a\x57\xf2\xb5\xcd\xeb\x21\xf0\xe6\xb3\x91\xf3\x76\x7f\xf7\xee\x6b\x84\x42\x3f\xbc\x4f\x89\x8b\xe8\xad\x64\x9c\x47\x06\x8e\x7d\x10\x9c\x0a\xc2\x31\x62\xbd\xd4\x48\xa6\xac\x75\x06\x85\x24\x6d\xb8\xf6\x9a\x7b\xaf\x1c\x53\x4c\x9b\x9d\xa1\x8a\x9b\xd0\x48\xc9\x41\x9e\x23\x2c\x08\xc6\x50\xb9\x9e\xf0\x9c\x50\xcd\x8c\xa9\x25\x13\x4a\x31\x46\x34\x42\x18\x45\x1e\x12\x9e\x26\xfb\x6e\x67\x93\xdf\x24\xdf\x7e\xa9\x26\xf7\xfe\xcd\xcd\xfd\x66\xff\xfe\xfb\xed\xd2\xae\xed\x97\x8a\x72\xdb\x17\x6a\x72\xae\x2c\x96\x75\xcb\xc3\x69\x9c\x51\x18\x7b\x99\xea\x94\x7a\xab\x6c\x60\x5b\x3b\x1b\xaa\x31\x2a\x09\x81\xb3\xcf\x4e\x80\x80\x42\x85\x73\x18\xe6\xd6\x9e\x43\xa3\x80\xda\x59\x56\x14\x83\xf4\x54\x0a\x6e\x88\x3d\x48\xc2\x28\x3d\xd9\x66\x55\x94\x73\x50\xd7\xba\x51\x92\xd7\xc2\x8a\xa5\xcd\x00\x3f\x92\x5d\x9d\x56\x5f\xe5\x34\xf8\xfc\x3c\x6f\x16\x57\x6a\x57\xd7\x9f\x8e\x75\x44\xec\xa5\x22\x66\x22\x2e\x57\x01\xa7\xd5\x5c\x22\x94\x4e\x61\x74\xce\x05\xee\xbd\x5f\xf6\x3a\x11\xb5\xa2\xcd\x0b\x1d\xc0\x27\x92\xd8\xfd\xaf\x92\x8c\x3c\x7a\x08\x0a\x80\x45\x38\x86\xd3\x10\x8e\x0a\x68\x98\xd2\x71\xf1\xce\x84\xe1\x14\x0a\x41\xe6\x73\x9a\x0f\xcc\xd6\x8d\x1d\x32\x7c\x55\x8c\x24\xe1\xb8\x0a\x46\x1e\x7a\x05\x8a\x73\xd4\x8b\xd4\xfc\x67\x7a\x91\x87\x89\x8d\xc7\x8b\xcd\x91\x91\x67\x1a\x0e\x57\x6e\xe8\x24\x1b\xeb\x0a\x78\xd0\x8a\xc0\x82\x08\x75\xa8\x58\x2a\x77\x06\xe1\xd0\x34\x75\x0f\x64\x70\x27\x0f\xe8\x85\x67\x24\x6d\x7f\x99\x67\xe4\x6e\x15\x96\x8f\x20\x9b\xfb\x3b\x50\x2d\x36\x35\x0a\x1e\x0b\x61\xad\x00\xce\x77\x1d\xa7\xa5\xf2\xf4\x78\x7c\xe2\x18\x39\x06\xbb\x72\x8c\x30\x84\xae\x1c\x23\x9b\x74\x8a\xf8\x18\xf3\xe4\x5b\x26\xe0\xd5\x87\x8f\xdf\xbc\xba\xbf\x8d\xe5\x15\x2f\x94\x75\x6e\xdf\x14\xe0\xfd\x87\x8f\xbb\xed\xfb\x0f\x77\x2b\x35\xfe\xf2\xfa\xf8\xea\x76\x73\xae\x2a\xe9\x9c\x07\x28\x57\x8e\xf0\x42\x10\x52\x54\x3e\x9c\x75\x05\x4f\x61\x82\x10\xda\x2e\xfe\xd9\x95\x3f\xf5\x79\x01\x18\xe8\xb9\x5d\x3c\xa5\x4f\x43\xe8\x4b\x57\x18\x20\x52\xcd\x67\x18\x2a\xc1\x18\x45\x3e\xdf\x36\x01\x01\xfa\x30\x01\xfa\x70\x80\x60\xe5\x01\x8b\x7a\x5a\x1b\x99\xfc\xc9\xa5\xa5\x71\xf5\x7e\xb8\xbf\xdb\x3f\x13\xc6\xf9\xf0\x24\x21\x71\x9b\xbd\xfa\x70\x77\x21\xbb\x78\x22\x27\x58\x36\xc3\x4d\x72\x5e\xec\xbc\xb6\x12\x4a\xa9\xca\x9a\xaa\x0a\x27\xe8\xbd\xb1\xae\x3c\xf1\xaa\xca\x83\x0a\x65\x49\xa9\xbb\xd2\x99\x1c\xda\x60\xb2\x5a\xc8\x61\x6e\x83\x33\xb0\x86\x6d\xca\x83\x0e\xc2\x4b\x03\x0c\xe0\x80\x3d\xf0\xdc\x72\xea\xf3\x62\x53\x86\xae\x0b\x79\x37\x1f\x4a\xd8\x5d\xed\x4e\x9a\x25\x3b\x13\x19\x77\xae\x8c\x50\xd7\xd7\x8b\x48\xee\xa5\xce\xea\xee\xfe\xb6\x39\xb8\xd3\xe9\x70\x98\x26\x27\x25\xa5\x8e\x33\x69\xed\x34\xf5\xfd\x61\xdb\xf7\xbd\x5d\xfe\xe6\x4d\x6d\x9d\x9e\x15\x38\xb6\x5c\x7b\x80\xe9\xf2\xe9\xca\x7d\xcc\x1f\xfb\xec\xb8\x2b\x92\x3c\x32\x5b\x7c\xbb\x3c\xcb\x15\x04\xf4\xb9\x06\xf0\xdd\xab\x9b\xcc\x90\x32\x98\x00\xa1\xac\x9f\x13\xb7\xec\x8a\x9f\xa6\xc2\x29\x5a\x17\xdb\x3a\x20\x80\x1f\xce\x00\x3f\x8c\x14\xe4\xab\x9e\x94\x89\x1a\xf8\xe6\xa5\x7e\x6f\x76\xd5\xef\xdd\xbe\xff\x1e\xe8\xde\xab\xba\xad\x3a\xa7\x7c\x03\x5a\xe3\xc2\xd9\x81\x7c\x63\xa4\xb3\x8d\x0a\x93\xd0\xd6\x89\x70\xe4\xd3\x51\x1e\x96\xb5\xec\x1e\xd5\xbe\xd9\x5c\x63\x3b\x7f\xf2\x25\x2a\xf1\xe5\x69\x92\xe5\x1b\xf8\x69\xac\xd3\x69\x2e\x97\x57\x07\x8e\x75\xa4\x22\x23\x3f\x4d\x29\x0e\xd5\x86\xcf\x0e\x68\x15\x6a\x19\x84\x94\x11\xf5\x12\x6d\x23\xfa\x28\xf7\xcd\x53\x6e\xf9\x17\xee\x71\xcd\xd1\xa6\xa7\x4d\xf5\xe9\xf8\x74\x8f\x01\x8c\x6d\xcc\x31\xb3\x9f\xea\x54\x04\xb8\x43\x0f\x0d\x38\x0f\xf3\x71\x98\xdd\x10\x05\xf8\x3d\x40\x49\x96\xe5\x17\xce\xe3\xe5\x1e\xf0\xaa\x6a\xf9\xea\x06\x5c\xc9\xaa\x62\x5c\xec\xb3\xbe\xdc\x4d\xe6\x33\xfe\xd0\xf8\xb4\x9a\x8f\xe1\x0c\xba\x48\x58\x75\x08\x3c\x4f\xf3\x80\x1b\x80\x78\x18\x3a\x1a\xd5\x9a\x48\x10\x3b\x3c\x1f\x2d\x28\x1f\x98\xd4\xcb\x02\x76\x61\x54\xde\x01\xfc\x98\x0c\xa6\xbe\x3c\x97\xc8\x95\x55\x7f\xf5\xfe\xf7\x5f\xbf\xff\x90\xa1\x87\x83\x5f\xdc\x9c\xc7\x04\xd4\x45\xb0\x59\x1d\x54\x0e\xa6\xc0\x6a\x50\xf1\x70\x68\x58\x30\x0a\x68\x12\xf4\xcf\x6e\x3f\xe9\xa5\xd3\xcb\xed\x1b\x90\x24\x59\x2a\xbf\xde\xf7\xd7\xd7\x8a\xad\x17\x37\xbe\xbf\xf9\x90\xc1\xec\xf0\x80\xea\xd4\xcd\x6a\x0a\x6c\x53\x06\x52\x94\x29\x9d\xcf\x07\x20\x78\xb0\xa3\x0b\x9c\x2e\xae\x1b\x07\x47\xb8\xc3\xf3\xc1\x81\x62\xc6\xde\x6b\xe1\x97\x8e\x7b\xc0\x82\x37\x5e\x01\xe8\x45\x92\x65\x51\xb3\x68\x87\xa2\x5f\x10\xf9\x24\x2f\xe8\x8a\x57\xd9\xcd\x9b\xc8\x41\xf2\xe6\xdd\xdb\x6d\x7c\xbd\xc8\x9c\xfd\x0d\xd8\xbf\xff\x78\xbf\xbc\x76\xfb\xf7\xdf\x6f\xac\x75\x36\xe3\x7e\x3e\xa4\x08\x12\xeb\x00\x2a\x42\x0f\x64\x11\x2c\x24\xaa\xca\x7d\x89\xaa\xa1\x61\x03\x9c\x9a\xb2\xa7\x14\x03\xbc\x21\x61\x98\xc7\xc0\x39\xe8\xc0\x94\x9e\x43\x01\xc4\xa1\x37\x08\x1a\xec\x88\x67\x8e\xf7\x10\x12\x5f\x8d\xb8\xa2\x62\x40\x0e\xd5\xd0\x55\x26\x2f\x6c\xf4\x43\xb3\x58\xdb\xb8\xb4\xf9\x1f\x24\xff\x28\xe6\x23\x97\x36\xff\x31\xf8\x03\x8d\x8e\x55\x83\xdb\xf7\xef\xee\x97\x57\x4c\x88\x89\xc9\x19\xb1\xe1\xf5\xc3\x98\x41\x44\x86\x03\xe8\x8a\x80\xd3\xa4\x98\x4f\x84\xf6\xb4\x88\xd2\xf0\xe3\x20\xc2\xa1\x04\xf4\x31\x29\x41\xa9\x34\x06\xdd\x06\x87\x43\xac\xdd\x07\x09\xb0\xa0\x4c\xcf\x21\x07\x62\x18\x0c\xaa\x0c\x71\xd4\x73\x27\x1a\x08\xb1\xaf\x8e\x18\x51\xd1\x63\x47\xea\x2a\x36\xde\x55\x91\xdb\xbb\xf9\x4a\xdb\x3f\xfc\xca\x01\x7f\xf7\x79\xc0\x93\xc1\x49\x96\x1d\xfd\x2c\xd2\xba\x22\x4d\x07\x74\x11\x74\xec\x00\xa2\x9e\xe4\xbe\xc4\xf8\xd4\xf1\x73\x09\x8a\x43\x39\x71\x81\x81\x7e\x1a\xf2\x33\x70\xb1\xd9\xcb\x98\x0f\x06\x41\x4b\x1c\xa9\xb9\x13\x6d\x1c\xf3\x09\x55\xb1\xd9\xb8\xa9\x9e\x8d\xf9\x36\x5b\xf3\x5b\xd5\x93\xad\x89\x2e\x28\xd0\x7f\xf9\xf1\xa9\xc2\xff\xc3\x85\x63\xe9\x7a\x9c\x81\xbb\x8b\xa8\xce\xc7\x8b\xa8\x4e\xa6\x36\x49\x20\xb0\x2c\xab\xca\x35\x5d\x09\x2b\x03\x8a\x58\x9c\x5c\x83\xda\xe7\x39\x84\x65\xae\x0b\x2a\x34\xdb\x55\xee\xd3\x90\xdb\xbc\x08\x06\x88\x0a\xfa\x7c\xe3\x17\xa7\x68\xa6\x00\xce\x25\x04\x30\x3d\x7c\xca\xab\x3c\xa7\x03\x0a\x67\x45\x23\x2e\x98\xc7\x35\x54\xc5\xfd\xba\x4c\xfe\x34\x22\xc8\x97\xf6\x7d\x7c\x7b\x69\xdd\xc7\x57\xb7\xaf\x7f\x6f\xe3\xc4\x26\x09\x15\x29\xb9\xeb\x06\xc8\xd9\xb8\x1e\xb5\x60\x70\x45\x0e\xab\x32\x37\x25\x95\x86\x2e\x0d\xeb\x0b\x5b\x5e\xda\x55\x6c\xdc\x1f\x6a\x17\xbc\xb4\xeb\x5a\x8b\xf9\xcf\x9f\xda\xb5\xfb\xb5\x0d\xab\x36\x38\xe4\xbc\xc4\xd8\xf7\xc7\x92\xb3\xa9\x8f\x7f\xc0\xe4\xd6\x7a\x7f\x53\x32\xb5\x0e\x59\x5f\xd8\x22\xff\x59\xd3\xca\x19\xae\x4d\x2b\x50\x9e\x93\xc3\xd2\x34\x26\xa3\x0d\x6f\x1f\xe9\xde\x6c\xec\xc5\xdf\xfd\x82\x40\xf1\x1a\xd3\xf9\xf8\xe4\x47\xdc\x5f\xea\x09\x41\xbe\x4b\x66\x96\x8a\xb9\x4e\xa7\x10\xe3\xf3\xf5\x7c\x44\x01\x51\x20\x68\x40\x60\x0c\x22\x9d\x62\x08\x9c\x6f\xca\x79\xda\x58\xa7\x8c\x76\xad\x8b\xb5\xa3\x07\xea\xaa\xde\xb5\x4e\x1b\x35\xf3\xb6\xbd\x6a\x57\xa2\xbd\xd9\xa1\xe4\xf5\x97\xed\xb8\xde\x35\x7b\xce\x02\xb1\xb6\xeb\xc3\xc7\xdb\x4c\x44\x3f\x57\x07\x0b\x0e\x9f\x0e\x60\x2d\x4e\xe5\x78\xac\x01\xf3\xa7\x93\x0f\x6d\x19\x7a\x7e\x2e\xc7\x1d\x72\xbd\xed\xbd\xef\x6d\xff\x20\x9a\xa6\x69\xfc\x3c\xa6\x30\xd4\x47\xd7\xae\x5c\xe3\x87\x47\x14\xd7\xe4\x1f\xbe\xff\xf3\x71\xb9\xcd\xc8\x06\x06\x12\x81\xfb\xa7\x4f\x0e\x8c\xb1\xea\x9f\xe0\xa9\x06\x32\x46\xa6\xea\xe0\xcb\xd0\x72\x90\x97\xd3\x2f\x34\xa1\x19\xd7\x26\x24\x69\x42\x1e\xfb\x74\xd8\x9e\xe3\x3c\x79\xa1\x7d\xb6\x7b\x12\x3f\x93\xa9\x78\x4c\x30\x01\x2c\x8c\xae\xaa\x84\x67\x3d\x28\xad\xdd\x9e\x7d\x98\x86\x87\xde\xa4\x83\xc4\x06\x40\x70\x5c\xe5\xcf\x12\x90\xe8\x47\x96\x2e\xe7\xf6\xaa\x8a\xb2\x1c\xce\x2f\x25\x7d\x5f\xa7\x79\x30\x29\x0c\xbe\x04\x5a\x58\x26\x2b\xc3\x16\xd3\x4d\xe3\x8d\x04\xc8\xcf\x4d\xe8\x67\x3f\x96\xbe\xd4\xa0\x49\x45\xb2\x4b\x5d\xe4\xa3\xb9\xd6\x3d\xae\x18\xc6\x2f\x58\x55\xd6\xd3\xe3\x3a\x9f\x5f\xfe\x2c\x7d\xf1\xb3\xbd\xa4\x94\x28\xa8\x51\x75\x94\x5e\xfa\xe3\xf1\x78\x0c\x67\x4a\xa9\x8c\x1f\xe5\xe2\xf2\xd9\x8e\xfe\xd8\x71\x5e\xb8\x02\x81\x73\x60\xe1\x44\x40\x0e\x4e\xd9\x10\x2a\x40\x16\xc3\x36\x95\x5f\xfe\xb8\x00\xd3\xe7\x1f\xaf\x35\x3c\x55\xc4\xa6\xfe\xbe\x76\x7f\x11\x69\xfc\xea\xcf\x2e\xed\xde\xf4\x94\x32\x53\x5a\x5c\x3d\x26\xa5\xd6\xc6\x5e\x83\x90\x1b\x42\x29\x35\x70\xfd\x81\x32\xc6\x9d\xcf\xe7\xf3\x8b\xe6\xdb\x65\x36\x08\x50\x67\xed\x57\x9b\x1f\x7f\xcc\x41\xf3\xf9\xc7\x49\x96\xe2\x47\xb2\x39\x3c\xb5\x3d\xf9\x7d\x23\xba\x39\x50\x4a\x35\x34\xb8\x3a\x41\x6d\xac\x3b\x9d\x4e\xa7\x17\xf7\x57\x61\xf8\xf2\x06\xcb\x99\xb4\x39\x3e\x92\x67\xcf\xf5\xf7\xde\x63\x79\x6a\x54\x97\x06\x55\xa7\xd2\x68\xeb\xa6\x69\x9a\x5e\xdc\x43\x87\x9e\x03\x06\xda\x2f\xee\x91\x90\x88\xc7\xf8\x55\xf7\x48\x15\xa5\x88\x43\x01\xab\xb6\x90\x5a\xba\x65\xbd\xec\xe8\x8f\x2d\x7b\x71\x8f\x6b\x3f\xe8\xc3\xb8\xde\x63\xf1\xf5\x6c\xd4\x0f\x7c\xbd\x46\xa8\xd7\x35\x14\xa9\x63\x9f\xad\x22\x93\x8e\xa1\xa3\x6c\xf1\xed\x1c\xc5\xa2\x7f\xd2\x10\x5c\x56\x91\x62\x5d\x86\x1d\x35\xa0\x02\x87\x4f\x2a\x8d\xd8\x97\x5d\x8c\x1d\xdb\x18\x3b\x7d\x9d\xfc\x59\x8c\x5e\xfe\xbb\x67\x3a\x15\x31\xb7\xf3\xe5\x15\x78\x0e\xf9\xfb\x90\xdd\xbc\xba\x79\xfb\xdd\x33\xe8\xc9\x25\x06\xb2\x55\x8e\x72\xcd\x9d\xf0\x3a\x9c\x3c\xe3\x92\x3a\x66\x54\x56\x78\x2e\xb4\x70\xd2\x9b\x20\x5c\x59\xa6\xc8\xcf\xd4\x03\x08\x9b\xb4\x9b\xa9\x53\x8a\x53\x43\x05\x67\x42\x70\x6d\xb8\x92\x52\xed\x34\xee\x9c\xaf\xd9\xd0\x76\x07\xdc\x59\xdf\xd0\x43\xdb\x1e\x70\x6b\xe3\x67\x6d\x40\x15\x45\x0f\x25\x63\xd9\x44\x1f\x9a\xd4\x32\xba\xdc\x4a\x4a\xca\x8c\x60\x92\x19\xc2\x19\x59\x6b\xdd\x68\xac\x75\xfb\x1f\xdf\x4f\xec\x98\xb4\xc2\xa9\xc6\x86\x83\x67\x4a\x73\x2f\x9c\xcd\x94\x17\xca\x09\xa7\x5a\x17\x2a\x5f\xc2\x54\xd5\x0f\x53\x0d\x48\x35\x64\xe5\xc3\xd4\x18\x2d\x99\x61\x72\xe9\x9f\xb6\x35\xb7\x5a\xe9\x2f\xfb\x59\xb3\x2f\xfa\x89\x08\x7a\x28\x29\xcd\x26\xf6\x50\xa7\x96\x11\xc6\x05\x15\x92\x72\x23\xb9\xe2\x86\x08\x4a\xae\x9c\x8e\xe5\xae\xb8\xec\xb4\x4f\x41\x80\xe8\xe1\x2d\xfe\xfa\xad\x4c\xed\x69\x1c\xad\x2e\xc3\x31\x78\x78\x1e\xc7\xf3\x85\xcb\xb1\xc2\xd8\x79\x59\xd3\xb4\x88\x54\x8e\x91\x4f\xf5\xf9\xdc\x58\x3c\xea\xbf\xfb\xc3\x63\xf6\x6b\x86\x8c\x7b\x26\xcd\xb2\x0b\x9a\x30\x3a\x26\x14\x73\xdc\x99\x8c\x78\x2e\xad\xf0\xb2\x36\x81\x78\x94\xb2\x7a\x86\x35\xa8\xaa\x36\x1d\x67\xe8\xb5\x12\xd4\x30\x21\xa5\x94\xca\x3a\x6e\xb4\x92\x7f\x68\xc4\x30\xd2\x2f\x06\x8c\x32\x41\xa4\x60\xcb\x80\x49\x61\x09\x67\x38\xd9\xc5\xd8\x86\xdf\xe9\xe4\x8f\x93\x9b\xe4\xff\xf3\x84\x5c\x8f\xb1\x94\x6f\xd3\xfd\x77\x37\x77\xfb\x5b\xf8\xb3\x9c\xe6\xed\x6e\xbb\x2c\xe7\xe8\xa0\xbf\xfe\x52\xd9\x29\xb1\xf9\x62\x4f\x33\x0f\x4c\x8f\x6d\x90\x07\xd3\xf2\xda\xe0\xaa\xaa\x64\x47\x11\x91\xb0\x2d\x53\xee\xbd\x57\x9c\x33\x3f\xfb\xba\x4e\x65\x44\x05\xf8\x9d\x86\x94\x28\x14\x46\xa1\xeb\xc6\x19\xad\x1c\xe1\x18\x89\x49\x0a\xea\xeb\x8a\x86\x26\x1d\x47\xbd\x18\x17\xfd\x9c\x33\x96\x9e\xc3\x64\x83\xb2\x51\xc7\x99\x46\x8d\x8a\xef\x56\x2e\xe4\xd7\x5f\xe7\xfa\x79\x2e\x61\x64\x4f\x6e\x1c\xad\x90\x84\x38\xaa\x64\xc7\x47\x81\x2b\x5d\x91\x14\x6b\x4c\x35\xcf\x4e\xa9\x9d\xb5\x6d\xbd\xf5\x46\xce\x22\x3d\x8c\xbd\x01\x05\x10\xa9\x6d\x0f\xf8\xd8\xe0\xea\xd4\x90\x3e\xd9\x45\x6d\xb2\xfa\x7f\xe4\xd8\x65\xa3\x2b\x4a\x50\x69\x56\x03\x37\x60\x17\xc8\xe0\x3a\xde\x58\x8c\x2a\x24\x07\x8a\x89\x82\x7d\x99\x1a\xef\x1b\x2d\x04\xaf\x67\x59\xd7\xa9\x8f\x29\x5b\xb9\xd3\x90\xd0\xe7\x63\x67\x29\xc7\x48\x8e\x52\xd2\xba\xc6\x28\xd4\xe9\x78\x34\xda\xea\x79\x98\x13\xc6\xb2\x24\x8c\x36\x28\xb3\xf2\x79\x6d\xd4\x4e\x25\x7f\x1e\xe3\x15\x77\x2f\xb4\x98\x3f\xbc\xbe\xbd\xe8\x44\xdf\xdf\xfd\xf0\x3e\x43\x14\x1e\x43\x57\x00\xaa\x7c\x54\x92\x24\xa8\xe8\xe0\x68\x8c\x2a\xcc\x11\xe2\x9d\xb2\xb5\x0f\x87\x87\x53\x98\x72\x5f\x74\x29\x9b\xeb\xd0\xa9\x0e\x9c\x52\xe6\xad\x8a\x38\x43\xf7\xc8\xf7\x6e\xc3\x2e\x3c\x7d\x2b\xa0\xf1\xcb\x50\xe4\x87\x8f\x37\x5b\x94\x56\x52\x83\x32\x4c\x42\x72\x0e\xa9\xe0\xa1\x05\x4c\xf2\xe0\x36\xac\xf1\x76\x59\xaa\x94\x16\xbe\x84\xa0\xf3\x46\xad\x1a\xda\x1b\xb9\x81\x11\xc3\xf8\x42\x47\x72\xcb\x3d\x01\xe3\x3c\x62\x66\x9a\x9d\x42\x8d\x33\x52\x4c\x6b\x1c\xc8\x3e\xe2\xbd\x49\xd1\xe7\xba\xa2\x17\xc8\xa7\x8b\x7d\xb8\x8d\x3c\xc9\x51\xf0\x39\x72\x9a\x4c\x40\xf8\x14\x7b\x20\x42\x0d\xfa\x1f\x21\xe8\x42\x0d\xce\x29\x9e\x87\x12\x87\x31\xb4\x18\xf0\xac\x02\x04\x60\x1e\x86\xd0\x83\x91\x31\xc6\xb4\x36\x46\x6b\x1d\x4e\x5a\x21\x57\xb1\x8a\x3b\x85\x92\x24\xcd\xda\x8b\x96\xda\x5f\x5d\x62\xec\x4f\x1a\x27\x6f\x2e\x85\x45\x6b\x2b\x7e\x06\xf7\xbc\x89\xb1\xcc\xfb\xdb\x37\x1b\xec\x95\xb3\xb6\x69\x82\x50\xa9\x0b\x35\xb0\xa1\xf5\x23\x3b\x5a\xe7\x06\x39\xb9\x70\x04\x2a\x0c\x4a\xa5\xd0\xee\x50\x77\xb5\x63\x6c\xcc\x60\x60\xd7\x9a\x51\x7a\x33\x06\x01\xfc\x68\xad\x1d\x4d\x9b\x72\x1b\x9a\xc3\xe1\x12\x23\x13\xfb\x3a\x3d\x45\x6c\xed\x5f\x24\x7f\xb5\x2a\x29\x6d\xf7\x3f\xbc\x5f\x51\x61\x4f\x05\xd0\xf7\x4f\x20\xe0\xbf\x02\xbb\xdf\x80\xd7\x77\xf7\x37\xdf\x45\xb5\xb7\x0d\x95\x04\x48\x30\xb0\xa1\x0f\x36\x1d\x4e\x0c\xd4\x3f\x16\xa0\x81\xe8\x9c\x0e\xc1\x1c\x5b\x96\xe2\xb4\x66\x67\xe3\x10\x3a\x86\xb1\x02\xfe\x88\x60\x38\xa6\x27\x0e\x0d\xb5\x15\x26\x4a\x1b\x63\x28\xd6\x8a\xe2\xca\x28\x09\x05\xc6\x45\xa8\x0c\x8e\x80\x9f\x3c\x31\x8f\x34\x1b\x63\xdd\xf6\xeb\xe8\x77\xdd\x3e\x65\x1d\xbf\x7b\xbb\x22\xf2\x23\xee\xff\x87\xf7\x8b\xd5\xf1\x36\xf2\xe5\xbd\x7b\x75\xf7\x6a\xc5\x5b\x7c\xb9\xe6\x00\xa3\xb8\xa6\xb8\xc6\xf4\xf0\x50\xb7\x88\xd0\x69\xf2\x50\x42\x80\x26\x23\x4b\x22\xc8\xc9\x85\xca\xb9\x48\x5d\x75\x0c\xd5\x4e\x2b\xab\x0d\x52\x7c\x56\xa9\x13\x7c\x46\xa0\xc6\xce\x15\xb5\xa1\x41\x80\x1a\x97\xde\x62\x13\xaa\x87\x83\x52\x19\x0a\x93\x0f\xb4\x4e\x40\x36\x3d\x9a\xb8\xc7\xfe\xe6\x39\x5b\xd3\x8a\xb2\xcd\x26\x30\x20\xe6\x04\x02\x34\x12\x31\xe1\x7a\x9b\xb7\x16\x37\x83\xff\xd4\xd6\x9b\x8b\xf6\x8c\x78\x64\xfb\x2e\x62\x2f\xfe\x7c\xcd\x5d\xbe\x87\x6f\x97\xff\xe3\xc5\x26\x13\x05\xb7\x7f\x78\xbf\x4f\x58\xd0\xf3\x01\x83\x43\xc1\x20\x20\xd3\x41\x03\xed\x30\x0f\xd8\x2b\xa3\xd2\xaa\x9d\x09\xb0\x90\xec\xb4\x33\xb0\x1e\x9d\x73\x28\x54\x47\xd9\x34\x8a\x19\xa0\xd3\xa4\x36\x3a\xd6\xf1\xd3\x6c\xda\x91\x38\xbe\x30\xa9\xa2\xd2\xdf\x8a\xca\x79\x22\x5d\x59\x4b\x56\xb3\x9b\xfb\xb5\xfe\xef\x4d\xb1\x7f\x0f\x5e\x7d\x7b\xf7\xdd\xef\xc0\xab\x58\xc0\x1a\xb5\x2e\x33\x13\xc6\xc9\x85\xc4\x4e\x61\x02\x13\x1b\xd3\x24\x37\x94\x79\x0a\x9a\xb2\xa8\xf2\x90\x08\x91\x26\x21\xd9\x11\x37\xfc\x24\x8c\xd9\xd6\xc3\x30\x0c\x0f\x75\x43\x25\xd0\x32\xd4\x47\x9c\xca\xd0\xe2\x1c\xb8\x79\x6a\x41\x22\x3f\x9d\xdb\x18\xcb\x93\x9b\xe3\x4e\x5f\x7c\xee\x4b\xed\xca\x85\x9a\x65\x69\xd8\x87\xec\xee\xd5\x6d\xd4\xa2\x3d\xfa\x12\xb5\x61\x04\xd0\x7a\xab\xaa\xc2\x7b\xbf\x9c\x30\x82\xcd\xdd\x30\x17\xa6\xdf\x11\x39\x1f\x01\xfe\x14\x89\xa0\xd6\x71\x2e\x22\x7f\xba\xfa\xbc\x26\xef\x9f\x54\x0a\x5e\xac\xc9\xed\xfe\xfb\xf7\x4f\xba\x18\xcf\xd7\x64\xd6\x7b\x63\x7b\x77\x38\x84\xca\xa4\xa7\x20\xc0\x10\x4c\x03\x0a\x1a\xa6\xda\x35\x67\x09\xf2\x26\x34\xa0\x0d\x8d\x31\xa9\xe8\x77\x55\xbb\x78\x11\xeb\x92\x44\xae\xb1\xa3\x72\x6e\x0a\x14\xb4\x27\x6b\xcd\x68\x9b\x54\x5c\x97\x64\x92\x66\xe4\x57\xb6\xed\xf3\x7e\xf1\x65\xdb\x26\xb7\x78\xea\x7d\x1f\x90\x4e\x0f\x41\x83\x36\xb8\xf6\x4c\x4f\xad\xf3\x93\x02\x49\x1d\x3a\xe0\x43\xa7\x75\x4a\xdb\x9f\xb5\x6c\x92\xce\x9c\x02\x03\xcd\xf4\x45\xcb\x76\x89\x49\xc7\x98\x1b\x79\x1b\x73\x0e\x4b\xeb\xf0\x2f\x2b\xd8\x67\x77\x1f\x6f\xde\x44\x0a\x90\xdb\x8f\x37\x1f\x6f\xdf\xed\x6f\xde\xdf\x7d\xf7\xf6\xe6\xe3\xf6\xe6\xfd\x6f\xc1\x72\x31\xa5\x43\x9d\x0e\x33\x4e\xf5\x6c\xb3\xea\xc7\x3c\x43\xb1\xca\x1f\xf3\x73\xb5\x19\x0a\x50\x84\x23\xa9\x8b\x4f\x87\x6a\x02\x3e\x07\x2d\x72\x65\x01\x4c\xf9\x50\x00\x8f\x42\x03\xa6\xf8\xaf\x1d\x21\x84\x23\x86\x39\xc7\x0c\x05\x58\x0b\xc2\x0f\xa8\xf6\x84\x40\x48\x8e\xcb\xb7\xd5\x67\xf1\x8f\x64\xaf\xd3\x63\xcc\x18\x7e\x5c\xe7\xd1\xf7\x1f\x3f\xbc\x7b\x9b\x6c\xbf\x7f\x46\xb4\xf2\x3c\x63\xb8\xb9\x79\xff\xfd\xbb\xdd\xed\xfb\x0f\x60\xf3\xf6\x29\x73\x98\x0e\xd2\x18\xa0\x9c\x00\x89\x09\x78\x9e\x52\x0f\x08\xe5\x6e\xac\x3d\x22\xe1\x14\x4e\xcc\x30\x5a\x72\x8e\x82\x5b\x3c\x71\x05\x92\xf3\xa9\x38\xa5\x27\x50\x9e\x49\x38\x87\xf3\xdc\xcb\x63\x38\x08\x50\xa6\x07\xca\xaa\xbc\x2c\x3c\x7f\x4c\x74\x49\x28\x26\x75\x4f\x29\xa9\xca\x83\x60\x85\x2b\x49\x53\x1a\x2a\x0a\x45\x02\xa2\xc2\x2a\xa2\x22\x2d\x53\xac\xdf\x78\xc4\x7b\x9e\xf9\x8b\x0a\x43\x02\xbe\xff\x18\xb5\x17\xae\x9d\x78\xbf\xd9\x3e\x3f\x61\xd7\x3e\xc4\xe4\xed\x0e\x3c\x4b\x80\xa6\x0a\xe4\xbd\x51\x26\xc8\x80\x53\x09\x16\x2f\xb8\xef\xac\x78\x4c\xc2\x99\x39\x42\x4a\xca\x70\x68\x42\x53\x02\x01\x92\xe9\x54\x8e\xce\xf3\x14\x83\x1c\x24\x7c\xf9\x95\x59\x89\x36\x78\x02\x70\xda\xe7\x05\x65\x3c\x4c\xa6\xc0\x84\x70\x37\x48\x05\x8b\x30\x2a\x9e\xd7\x05\x05\x49\xe9\xb9\x2e\x72\xc5\x6c\xc5\xe7\x81\x75\xb6\xe7\x5c\x3a\xed\x58\x92\xfc\x83\x44\x3e\xca\xbd\xdb\x9c\x9f\xb0\x9b\x7f\x9b\xfc\x5d\xf2\xff\x4f\xfe\x73\xf2\xbf\x24\xff\xed\x65\x95\xe0\xc7\x9b\x4b\x00\xf5\xe6\xc2\x18\x07\x2f\xb1\xdf\x0b\x47\x6b\xac\xf8\xfe\x5c\x6c\x74\x2d\xbc\x7c\x1b\xab\x64\xef\xee\xdf\xde\xdd\xdf\x6e\x2f\xaf\xcc\xf8\x54\xcd\x2e\x23\x15\xd6\x68\xae\x52\x9c\xcf\x3d\x05\x15\x48\x64\xe1\xa0\x0c\x26\x68\x1d\x86\x02\xd0\xa0\x06\xab\x58\xca\x43\xbf\x51\x9f\x9c\x8b\xb5\x69\x13\x90\x0f\xed\xf5\xea\x64\x7e\x3c\x3a\x77\x3e\x03\xb3\xbc\x4e\xa7\xcd\x19\x73\x2c\x28\xa5\x84\x95\xa2\xcc\xcb\xa2\xa0\x98\x57\x15\x2d\x0b\x99\xf3\x80\x83\x0d\x23\x6b\x41\xde\xa7\x49\xa8\x82\x99\x08\x21\x87\xe5\xd5\x6b\xdd\xf7\x11\x20\x7a\xc9\x27\x25\x49\x6a\xa3\xae\xd6\x5a\xf3\x77\xd9\xeb\x96\x5d\xee\xf5\xab\xdb\x7f\x1c\x79\xef\x79\x5d\xe2\x31\x38\x6f\x51\x1f\x35\x4c\x2a\x61\x3f\xe1\x7a\x2b\xd5\x1c\x91\x1a\xf3\x08\x5c\x8c\x4d\xb7\x8f\x6c\x6f\x36\x22\xb2\xc5\xff\xc9\x97\xdc\xdd\x1f\xee\x5f\xdd\x6c\x5f\x5d\x4f\xc5\xb4\xdd\x1c\x06\xa6\x19\x2d\x29\xad\xe0\x83\x4f\xbb\x80\x7d\x24\x16\xdd\x08\xff\x40\x15\x8b\xa5\xe3\x99\x9b\x42\x2e\x52\x1e\xdc\xb4\xf8\x97\xe5\x23\xdd\xf3\x1d\x7d\xe2\xa4\xfb\x6d\xf4\x2f\x57\x08\xd0\x05\x47\xfe\x54\x21\xf7\x21\xd2\x98\xbd\x79\x7f\xf3\x26\x42\x85\xdf\xbd\xb9\xb9\xcf\xee\xbe\x7d\x5e\x7b\xfa\xf1\x29\x3c\xf9\x21\xed\x36\xaa\x1e\x80\xaf\x43\x53\x87\xba\x4e\x73\x69\x8c\x96\x56\x3e\xd8\x4d\x12\x3f\x02\x02\x9c\x43\x13\x12\x20\x68\x9d\xa7\x34\x37\x9e\xb8\xd2\x33\x84\xf3\x40\x75\x48\x04\x68\x55\xc0\xe0\x5c\xec\xa8\xf2\xf2\x61\xea\xa4\xec\xb2\x12\x23\xb1\xcc\xd0\x50\x2d\x0e\xd5\x29\x32\x6a\x05\x89\x71\x68\xba\xd2\x95\xbc\x0e\x35\xf2\xe5\x68\x57\x8d\xef\x14\x5f\xb8\xf0\x2f\x9c\x77\x6b\x85\x4c\x02\xf6\x49\xe4\x42\x05\xcb\xd1\x7b\xe1\x44\xa8\xc1\xb9\x4e\xcb\x79\x5a\xbc\x05\x15\xa6\xa9\xee\xc2\xd1\x00\xdd\x04\x9a\x39\x41\x2c\x16\x9b\x23\xa8\x83\xf0\xf3\x39\xf8\x1a\x10\xd0\x3d\x54\xd9\x14\x48\x68\x0c\xf0\x69\x9e\xe6\x52\x31\x25\x22\xb7\x71\x1e\xf3\xf8\x6b\xed\xcf\xcd\xe7\x6a\xc9\x6f\x5e\xdc\x75\xcd\xc9\x81\xd6\xaf\x99\xbe\x80\x46\x00\x65\x18\x27\xdf\x85\xc6\x02\xd9\x06\x93\x26\x81\x6d\x69\x54\xd4\x08\x07\x1f\x54\x98\x6a\x80\x41\xff\xd0\x64\x32\x90\xd0\x5a\x80\x81\xf3\x20\xe6\x01\xfe\x61\xda\xc7\x18\x20\x4b\xb6\x31\x63\xb4\x32\xd1\xad\xd5\xba\xab\xa6\x54\x3c\x68\x96\x05\xf4\xea\xee\xfe\x65\xfc\xef\xe6\xd5\xdb\x6b\x00\xf9\xb9\x08\xf6\x0b\xeb\xf5\xa2\x5d\x74\x7f\xbb\xca\xd1\xbc\x7b\x73\x77\xbf\x5a\x64\x9b\x63\xd0\x2e\x46\xd4\x36\x25\xa5\x58\x40\x59\x55\x41\x3f\xc5\xde\xe6\x06\x70\x1d\xd9\x1a\xab\x70\x3c\x58\xaa\x6a\xad\xbc\x38\xf2\x13\xa8\x42\xd3\xb4\x2d\xaf\x20\x2b\x2b\x50\xb6\x82\x96\x15\xad\x76\x6c\x3e\x7e\x82\xfb\x7c\x94\x61\x90\x80\xfe\x58\xaf\xa1\xa5\x0d\x4c\xab\xf8\x91\x7c\x4c\x18\x53\x3c\xb0\x92\x08\x25\x48\x98\x00\xf6\x42\x29\x03\x5a\x1e\xc4\x08\x31\x83\x0c\x93\x71\x84\x25\xc3\x15\x5e\x73\xd4\x8b\x7f\x99\xef\x64\xd4\x3f\xbc\x0a\x12\xad\xa0\xcc\x2c\x5d\x31\x99\xeb\xa4\x96\x27\x84\x1d\x45\xa0\x60\x15\x17\x42\x3b\xd5\xea\x4e\x6b\x67\x84\xc4\x65\x60\xdb\xb2\x36\xc8\x77\x3e\xd4\x61\x6c\xfa\xc5\xbf\x39\x8d\x66\x02\xe4\x78\xe4\xae\x39\x9c\x92\x34\xed\xb3\x36\x72\xbc\xfc\xf9\xaa\xa6\xb3\x9e\xee\x7f\x06\xee\xde\xdc\x7e\xfb\x2c\x7e\x70\x7b\x7f\xf7\xe1\xfe\x16\x3c\xbb\xbe\xbf\x26\xce\xbf\xdd\xdf\xbd\x89\xd0\xe8\xf4\xd4\xd9\xb6\x3b\x9e\x72\xa3\xb8\x90\x4c\x33\x87\xea\x3e\xef\x32\x45\x3d\xb3\x95\xef\xf3\xae\xb3\x6d\x9b\x1f\x5b\xe6\x84\xd9\x41\x21\x74\x49\x75\x91\x13\x26\x19\x91\x58\x50\xad\x11\x0a\x93\xa5\x92\x48\x8d\x90\x16\x42\x17\x55\xa5\x79\x9c\x9c\xbb\x54\x45\x5b\xc4\x24\xff\xaf\xcb\x1c\xf9\xcb\x15\x67\xf2\x4c\x07\x7a\x31\x4f\x63\x70\x35\xee\xc7\x3f\xbc\x07\xcb\x52\x7f\x73\x73\xff\xdc\xf8\xde\x16\x75\x01\x41\x01\x4a\x16\x4e\x61\x3a\x84\x83\x02\xee\xc0\x30\x10\x0f\x63\x3e\x3a\x23\x41\x53\x21\x30\x5c\xb5\x10\x8e\x75\x48\x7c\xe4\x58\xda\x19\x58\x95\x47\xe5\xf4\x79\xb4\xa6\x55\x52\xcd\x4d\x70\xe1\xc4\x1b\x50\x76\x69\x4e\x69\x98\xa4\x96\x32\xb8\x79\xa4\x34\x85\xa1\x8d\x3e\x4d\xd4\xae\xae\x77\xe6\xa9\x4a\x3f\xd9\x5e\x23\x87\x4f\x3c\x9d\xcf\x0a\x92\x5f\xdd\xbc\x59\x66\xfb\xf5\xb5\xc9\x6b\x8c\xd9\x28\x6a\x84\x01\x47\xd4\x73\x04\x54\x90\x71\xf7\x5f\x5e\xcd\x83\x8c\xf3\x33\xbe\x90\xdd\x58\x4e\x96\xc5\x2d\xb1\xb3\x5e\x63\xdf\xfa\x70\xb6\xe1\xe4\xc2\xd9\x6d\x86\x48\x4f\xad\xa2\x88\x88\x58\xae\x97\xb6\x29\xb0\xd6\x15\x7f\x66\x2b\x5e\x1b\xf6\xb9\x5d\x2f\xd5\xaf\xc0\x85\xec\x36\x86\x0c\x24\x61\xf2\xa4\x3d\x01\xb0\x42\x8e\x40\xa0\x82\x8d\xd8\xab\xe5\x65\x1f\xbc\x07\xa7\x6b\xcb\x42\x93\x9d\xa5\x90\x80\x80\x86\x75\x8a\x23\x65\x6d\xbd\xfc\x75\x34\xab\xea\x3a\x1c\xe3\x2b\x49\x40\x06\x7f\x8f\xbf\x02\x53\x88\x79\x2d\x31\x68\x1e\xfa\x2c\x7f\xe0\x7e\x9b\xb7\x0e\x2d\xfe\x4a\xed\x56\x7f\xe5\x1f\x44\xbe\x6f\xbf\xe5\x17\x85\xf0\x7f\x15\x59\x5e\xff\x43\xdc\x45\xfe\xeb\xd7\xce\xf2\x6f\xbf\xbb\x83\xf7\x9f\xcf\xf2\xfd\xf5\x2c\xff\xe6\x1f\x83\x9b\xec\x2b\x1c\x0a\x5f\x3d\xca\x3b\x97\x76\x33\xcd\xaa\x12\xa9\x6a\xd6\x29\xca\xe7\xc1\x78\x00\x8b\x5c\x17\x32\x0c\x61\xb4\xa7\x02\x24\x61\xf0\xd6\x81\xae\x8e\x6a\x05\x91\x2a\xdc\x82\x7c\x56\xd7\xab\x93\xfa\xa9\x97\xae\xef\x01\x19\x06\x40\xfb\x7e\xcb\x2b\x4e\x05\x21\x04\x33\xc4\x51\x59\xc0\x1c\x57\x02\x63\x54\x14\xbc\xe4\x21\x0f\x22\xf4\x0c\x50\xa0\x53\x14\x50\x60\x20\xa7\x94\x4e\x94\xd2\xd3\x49\xeb\xd3\x29\x2a\x7b\xae\x1c\x26\x7d\x42\x77\x78\xab\x92\xb7\x17\x7c\xec\x0b\x24\xe0\x73\xfb\x38\x9e\xca\xcf\xe5\x6f\x2f\x64\x9f\x67\xd0\xd6\x91\x38\xd9\x04\x73\x29\xec\xb7\x40\x07\x96\xa1\xb9\x75\x99\x92\x02\x33\x58\x93\xb9\x4d\xd9\x16\x11\xa2\x89\xa2\x4a\x51\x45\x1e\xcc\x29\xed\xe7\x91\xb1\xdc\x10\x80\x19\x13\xb1\xd8\x64\x9b\xe2\x47\xba\xa9\x77\xfa\x19\x67\xc5\xd3\x6e\xb3\x78\x78\x97\x4c\x5c\xc4\xda\x2c\x3b\xfd\xb2\x67\xdf\x5d\x80\x91\xcb\x7b\x8a\x4f\xe6\x7c\x1e\xc7\x69\x32\xd3\x34\x8e\x27\x27\xc4\x28\x42\xbf\x7c\xdf\x4e\xce\x19\xf7\x70\x72\x26\x38\xa0\x8c\xcb\x0a\x17\xaa\x61\x18\xe6\xd3\x21\x3a\x32\x7f\x94\x88\x47\xba\xc5\x17\xdf\xfd\xdd\x53\xad\xce\xbf\x89\x91\xd5\xeb\xc1\x71\xb1\x15\x16\x47\xe1\xa9\xc6\xfb\xfd\xf7\x1f\xd7\x0d\x06\x2c\xcb\x15\x3c\xa3\x89\x7f\x4e\xfc\x92\x12\x1f\x65\x7e\x26\xff\x70\xf6\xa0\x1b\x53\x37\xab\x2c\x71\xf3\xe8\x35\x01\xbe\x31\x45\x09\x20\x80\x64\x6e\x84\x4c\x93\x3a\xe8\x14\xce\xe3\xf5\x85\x99\x6a\xe9\x90\x0e\xc6\x50\x63\x77\x9a\x58\x11\x4e\xce\x81\xe2\xa0\x43\x35\x97\x94\xa6\x23\xd2\xfa\x5c\x55\x50\x1e\x14\xa0\x1c\xf3\x30\x2c\xe7\x49\x38\x88\x4c\x09\x89\x04\xa5\x95\x50\x12\xaf\xfa\xb5\xdb\x62\xa7\x23\x9f\xd2\x67\x5d\xb4\xbb\xcf\xde\x59\xba\x46\x73\xee\xae\x5b\xf7\x35\x90\x02\xdf\x5d\xcb\x7c\xef\x9e\x40\xb7\x83\xeb\x3a\x17\x7c\xd7\xa8\xa6\xf3\xc3\x24\x4e\x87\xa0\x97\x8f\xa2\x20\x5f\xd3\x23\xd0\x81\x96\xb6\x07\x70\x0c\x55\x37\x9f\xbb\x0e\xb0\x6e\x83\xbd\x9b\x9c\x6d\xed\xb1\x99\x4f\xe0\x14\x26\xeb\xcc\xc9\x4d\xce\xfb\xd1\xb9\x22\x77\xc2\x56\x65\xed\xc6\x60\x23\xe2\x73\x03\xce\xbf\xb0\x37\x26\xbf\x66\x6f\xcc\x7c\xcd\x39\x03\xa5\xae\x2b\x0a\x64\xc5\x6a\x8e\x40\x7f\x99\xaa\xcb\x6b\xf8\x74\xbe\x92\x2b\x80\x06\xd9\x8d\x31\xb2\x06\x12\xf8\x5f\xb5\x39\x82\x98\xdf\xfb\xc2\x0e\x5a\x6d\xa0\xcf\x22\x1f\xab\x2d\x94\xda\x34\xaf\xd3\x2a\x90\x01\x50\x1e\xda\x03\x80\x61\xac\xc3\x04\xca\x2e\xf4\x0a\xd0\x2e\x88\x6d\x19\x49\x2a\xe6\x26\x4c\x2d\xa0\xa9\x9d\x4b\xbb\xb4\xd1\xa6\xd3\x5c\x87\xc5\xac\x4f\xab\x55\xa3\x5d\x44\x5b\xf9\x14\xf9\x03\xfe\x62\x45\xfb\x45\x14\x61\xe4\xba\xff\x76\x19\x8b\x3f\x06\x6b\x12\xff\xf6\x9f\x26\x19\x58\x0e\xb8\xdd\x45\x6e\x29\x91\xa2\x6a\x3c\x4b\x1b\x80\x4d\x7d\x2c\xc1\x21\x50\xd4\xa3\x82\x96\x9a\x36\x2a\x9c\x48\x40\xa0\x2b\xf2\xae\xe7\x51\x1b\xbf\x0c\x39\xac\x2c\xad\xf8\xc6\x41\x6d\x08\x3c\x78\xf7\x98\x84\xd1\x19\x14\x34\x10\x40\x82\x2e\x1c\x7d\x5b\x3e\x9c\x5c\x8b\xa2\x00\x4b\x96\x9e\x1e\xc9\x13\x47\xda\x5f\xae\xe8\xb5\xa7\xa6\x7d\xb3\x34\xed\x9b\xd7\x9f\x01\x06\xef\xd3\x97\xad\x73\x5d\x55\x3b\x96\x5a\x00\x8d\x3f\xe6\x05\x68\x82\x84\x92\xe2\x12\xe6\xb6\x14\xcc\x48\x87\x83\x04\xae\xc8\x9b\x8e\x23\x87\x58\x46\x1f\x7a\xe2\x30\xe4\x3b\x5a\x0a\x8b\xe0\x63\xd2\xfb\xe5\xc1\x34\x5d\x0b\x43\xd7\x0d\xa0\x48\x51\x5a\x05\xd5\x4f\xc5\x27\xee\xda\xaa\x89\xfb\xdd\x16\x74\x8f\x6a\x47\xb6\xec\xc5\xfe\xf2\x2c\x32\xf7\x9c\x9b\x7c\x69\x5d\xf6\x25\x86\xb9\xe2\xb8\x61\xb0\xae\xc8\x31\x48\x70\x0e\xb9\x0f\x39\x38\x07\x01\xf2\x8a\xe4\x71\xaf\xae\x41\x3e\xf3\xeb\xd5\x96\x2d\xe7\x3d\x14\x6c\xa6\xd6\x86\x01\x60\x6b\xd3\x8e\xb3\xc5\x67\xf1\x81\x45\x7a\xfc\xc8\xe9\x3e\xec\xd8\xd6\x24\xdb\xcb\x1e\x7c\xff\xb9\x32\xf3\x87\x75\x33\x8e\x89\x9a\xc8\x31\xf7\x05\xc5\xdc\xdb\xcf\x7a\x94\xdb\xf7\xdf\x6f\x3d\x86\xae\xc4\x0f\x43\xca\x72\x0f\x58\xe8\x72\x44\x91\x65\x1a\x41\x04\x0d\x14\x8c\x31\x61\x59\xcd\x45\x39\xb7\x08\x1c\x02\x32\x87\x03\x90\xc5\x39\x4c\x10\xe0\xad\x61\x02\x49\x76\x96\xea\x68\xcf\xc7\xe6\x88\x42\x77\x74\x03\xea\x74\x6b\x95\xb2\x35\x80\x80\xeb\x20\x55\x1b\x8c\x26\x91\x59\x6e\x07\xfc\xe3\xb4\x23\x5b\x99\xfc\xf6\x19\x7f\x4e\x02\xae\xf5\xf6\x8b\x87\x7f\xad\xb0\xb8\xff\xeb\xa7\x1a\x8b\x4b\x56\xf4\xfb\x8f\x37\x11\x53\x79\xf3\xc3\xfb\xdb\x5d\xf6\x05\xbc\x3d\x4d\x80\xac\x0a\x03\xc1\x29\x0c\xf5\xc4\x6c\xe8\x10\xe7\x3c\x77\xb9\x18\x5b\x3e\x18\x42\x08\x28\x74\x18\x87\xa3\x01\x89\x15\x8a\xfb\x78\x26\x46\x82\x21\xda\x6f\x3a\x26\x4a\xaf\x5b\xe6\xd9\x7c\x66\xb0\x28\x8a\x1c\x23\x4d\x08\x35\x32\x95\xb0\x34\xb2\x5e\xf6\x4e\x55\x37\xa1\xd5\x5a\x87\x5a\x6b\x9d\x6c\x63\x5c\xb1\xd8\x89\x88\x8f\x7c\x7b\xc1\xb4\x5f\x04\x72\xd7\x7a\xb2\x67\xb5\xd5\x97\x78\xde\xeb\xbb\x57\xb7\x29\x13\xc4\x61\xde\x3a\x5a\x0b\x3d\x18\x54\x6b\xa9\x94\xf2\x7c\x00\xda\x45\xf6\xae\x9d\xb0\x0d\x69\x6d\x05\x1f\x93\x46\x3a\x53\x99\xb6\x75\x87\xe6\xe4\xc5\x29\xf8\x39\xd7\x3a\x3d\x87\x64\xe5\x93\xfe\xa3\x88\x91\x6d\xb6\x49\xe4\x14\xff\xcb\xe4\x5f\x26\x1f\x93\xff\x92\xfc\x1f\xc9\xff\x99\xfc\x5f\x4f\x7a\x2c\xfb\xbb\x57\x5f\x32\x0f\x45\x81\x9e\xdb\x95\x58\xfd\xfe\xf6\xcd\xfb\xdb\x37\x77\xd9\xdd\x87\xbf\x01\xd1\xf4\x78\x73\xe5\x66\xf8\x19\xdb\xe6\xfe\x3d\x04\x57\x46\xfe\xcf\xbc\x10\x1f\x3e\x2e\x86\xfb\xcd\xf2\xc1\x87\x8f\xef\xde\x3e\xb1\x13\xff\x75\xec\xf8\x96\xd4\x25\x04\x3c\xd4\x85\x28\xa5\x41\xb9\x29\xd8\xb1\xc9\x51\xc5\x27\x05\x2a\xe4\x0c\xc8\x21\xa0\xbd\x6d\x9a\xa6\xce\x1b\x80\xfa\x7e\x6e\xa8\x6d\x00\x0b\x87\x5a\x73\xa5\x8c\x69\xf8\x41\x87\x09\xb0\x33\x02\x34\x58\x90\x94\xb1\x50\x27\x52\x70\x33\xe1\xeb\xc7\x04\x75\x66\x22\xb8\x07\xbc\xaa\x38\x97\x24\x93\xaa\xaa\x10\x2a\x18\x2e\x65\x2e\x55\x89\xb6\x49\x85\xab\x59\xa8\xd0\xc0\xa2\xe0\x58\xe3\x9c\xd0\x73\x38\x7b\xdd\x01\xc1\xd2\x13\x09\x4d\x5d\xd7\x75\x38\x51\x9a\x7b\x5f\xa6\x50\x97\x85\xd2\x9c\x1b\x41\x5d\xe3\xb8\x12\x56\xcb\xc2\xce\x39\x42\x05\x82\xc6\xc9\x0a\x6b\x4c\x24\xd1\x88\x72\x2e\x28\x2e\x2b\x2e\x39\x34\xb8\x28\x71\x29\x14\xac\x60\x55\x70\x96\x80\xe4\xb4\x85\xfb\x22\xc6\x3a\x92\xd7\x97\x3c\xcc\xfd\xdd\xab\x9b\x53\x9d\xc2\xe5\xeb\xc7\x71\x87\xfd\xf1\xe8\xc3\xb4\xfc\xee\x66\xba\xfe\x2e\xb8\xfb\xac\x1f\x96\xb5\xeb\x6f\xfa\xb4\xda\xe9\xc7\xa4\x0f\x2d\x60\xfd\xaa\xdf\x4c\xf6\xf5\xe6\x90\xfc\x49\xf2\xd7\xc9\xef\x92\xff\x96\xfc\x6f\xc9\xff\x9e\xfc\xf7\xb5\x4a\x6a\x65\x8f\xb8\xaa\x26\x7c\x96\x06\x07\x5f\xab\xb5\x7d\x96\xc3\x7b\x77\x73\xad\x7b\xb8\x7b\x92\xba\xde\x44\xd0\xf7\x67\x09\x9b\x77\xf7\x37\x60\x10\x04\x08\x44\x8c\xa0\x67\xcd\x2c\xc1\xa0\xf8\x29\x31\x56\x4f\x88\x6c\xa0\x29\x0b\x30\xe8\x52\xaa\x5a\x58\x65\x06\xd6\x4b\xc1\x8a\x52\x3a\x46\x25\x2d\xcf\xc5\x43\x0e\x8e\x10\x86\x22\x75\x10\xf6\x5a\x16\xda\x84\x31\x1c\x2b\x4a\xc5\x18\x13\x50\x97\xd7\x66\x90\x9a\x11\x26\xb5\xd2\x8c\x13\x15\x58\xf0\xe1\xc4\x40\x01\x18\x98\x16\x67\xa8\x22\xd8\x9c\x7b\xc1\x0c\x97\x8e\x5a\x62\x94\x83\x90\x4d\xb2\xd1\xbe\x2d\xab\x0a\x69\x5d\x21\x19\x44\x21\x0b\x6f\xaa\x42\xe7\xe0\xc8\x79\x38\xb3\x30\xc5\x40\x69\x96\xf9\x4b\x7e\xf8\x85\xe5\xba\x66\xa9\xde\xfc\x4c\x67\xe2\xe9\xef\x6f\xc1\x62\xba\x2c\xaf\x23\xa0\x1e\x48\xad\x83\x8f\x85\x43\x7d\x20\x3e\xd6\x0d\x2d\xfe\x48\x0f\x48\xb4\x63\x3b\x30\x0e\xc3\xb0\x5d\x1c\x90\xc1\x86\xa1\xb1\xb5\x5b\xf6\x71\x57\xdb\xc6\xb6\xcb\x54\x0f\x87\xb6\x8d\x35\xa8\x34\x5b\xfc\xce\x37\x31\xc6\xbc\x12\xe8\x6c\x5f\x94\x97\xdd\xff\x13\x10\x6b\x1c\x22\xa2\x77\xf7\xac\x56\xe5\xe6\xfe\x66\x59\xaf\xcb\x75\xef\x4f\x07\x71\x0e\x47\x64\x3c\x2f\x1c\x34\xa7\x83\x96\x0e\x82\xc3\x54\x00\x18\xfa\xbc\x6b\xb4\xad\x45\x67\x27\x1e\x61\xae\x16\x11\xa3\x77\xa6\x8f\x9c\x48\xa2\x2a\xa9\xc4\xb5\xa0\xa2\x43\xd2\x11\xce\x5c\x59\x68\x6f\xbd\x1e\xbc\x6d\x8f\x6e\x19\x7f\x2e\xea\x95\x53\xe5\x82\x0d\xfc\x17\x97\x28\xd8\x77\x6f\xf7\x77\x57\x55\xe0\x65\xf4\xbe\xfb\x1d\xd8\xdf\xfe\xd3\xb5\x9a\xf3\xf5\x5d\xb1\xff\xee\xed\xa5\xf8\x29\xd6\x3e\xb5\xa9\x15\x06\x55\xf0\x80\x99\xc0\xd0\x1c\x8f\x4c\x1b\x4c\x87\x23\xab\x88\x6b\x73\x0b\x11\x0e\x23\xd0\xda\x08\xcd\x48\x40\xbb\x4a\x75\x1a\xa2\xca\x1a\x49\x19\x0b\x8d\x0d\xa2\xf4\xca\x7a\x25\x40\x9e\x96\xe1\x3c\x48\x9c\x21\xab\x98\x60\x5c\x24\x49\x9a\x26\x8f\x72\x53\xef\x16\x7f\xe4\x5f\x3f\x71\x13\xed\xdf\x7c\xfb\xdd\xef\xc0\x33\x9d\xa2\xa7\x91\xbc\x7b\xb9\x0c\x6e\x3f\x8f\x64\xca\x7d\xed\x44\x77\x84\x42\xa0\x22\xb7\x25\x1f\xb0\x65\xc2\x22\x20\xbb\xfc\x38\xe5\x85\xe6\x82\x31\x69\xf4\x11\x9f\x41\x91\x73\x84\x95\xd9\xa9\x03\x13\x46\x51\x82\x4a\xa4\x48\x8b\x08\xab\x2b\x6d\x19\xc1\xb6\xaa\x98\xd2\x82\x1d\xb4\xee\x27\x8b\x09\x63\x8c\xb7\x8b\x2d\x0d\x7c\x4a\x2f\xf5\xd7\x4f\x98\xfa\xd5\x9c\x59\xa9\x87\x00\x74\x5a\x6a\x5b\x38\x25\x8c\x05\xdc\xea\xa3\x3b\xee\x34\x93\x5a\xb3\x30\x52\xa1\x25\x1b\xf9\x78\x94\x43\x92\xa5\x08\x34\x7b\x11\xb9\xaa\xfe\x7f\xc9\x7f\xbc\xce\xe5\x97\x5c\x17\xfb\x9b\x2f\x93\xd2\xd7\xd8\xcb\x3f\x8a\xfc\x73\x2f\x23\x31\x71\xe6\xc7\xb9\x9e\x72\x40\x1d\x58\xcb\x9e\x5c\xe8\x5d\xe8\xaa\x2d\x0a\x0a\x08\x29\x10\x86\x0c\xe1\x43\xce\x98\x40\x98\x20\xac\xea\x6a\xcc\x09\xe6\x25\xc4\x5c\x9a\xf2\xe0\x81\x0c\x34\xc5\xd3\xf6\x64\xad\xb5\x26\xb2\x5e\x19\x15\x18\x63\x85\x29\x28\x28\x60\x49\x05\x25\x58\x62\xc4\x75\x0b\x61\x45\x08\x84\x96\x32\xdd\x06\x9c\x12\xb5\xe6\xbf\x37\xe9\xb5\x6e\xf8\x75\x8c\xd8\xfd\x4f\x5f\xef\xdd\xcf\x79\x2c\xaf\x65\xc5\xcf\x29\x69\x3f\x5c\x68\x5d\xd7\x9e\x45\x5a\xda\x94\x02\x5e\x2f\x5f\x22\xd4\x31\x10\xdb\x54\xdb\x08\xe0\x55\x12\xb3\x4a\x61\xca\x29\xc7\x52\xb7\xf9\x39\x67\x54\xc2\x6a\xb9\x8e\x1d\x33\x69\x7e\x36\x52\xc5\xc5\x5d\xd7\xd1\x27\x1e\x9c\x7b\x68\x84\x28\x5c\xce\x26\xc2\xc5\x41\x8b\x11\x30\xc8\x08\xe5\x0c\xa1\x5e\xf3\x23\xa8\xe0\x83\xda\x94\xce\xb9\x80\x84\x8e\xf1\xeb\x6d\x7a\xb8\x60\x2d\x5e\x47\x0b\xe8\x3f\x44\x6e\x84\xbf\x77\x0f\xbf\xe8\xdd\xca\xb9\x9b\x1e\x00\xaa\x01\x8a\xb4\x73\x3e\x1c\xea\x70\xa8\x36\xcb\x3e\x45\x84\xc4\x14\x4a\x8c\x18\xa6\x58\xa9\x2e\x3f\x16\x94\x88\xa5\x8f\xc2\x03\x1a\x1a\x70\x3c\x2a\xc1\x9b\x59\xb7\xed\xda\xcb\x65\xc7\x6a\x0e\xd6\x3f\xd4\x7c\xe9\x25\x9d\x30\x17\x83\xe5\xa7\xa5\x97\x94\x71\x86\x71\xa3\x68\x30\x9b\x72\x31\x50\xab\xa5\x87\x22\xa8\x0e\x94\x30\x49\xb6\xd9\xf2\x1c\x5d\xec\xe7\xdf\x46\x0e\x88\xff\xf4\xf7\xec\xe7\x2f\x76\x33\xa3\x51\x30\x33\x6a\xde\xad\x32\x9a\x70\x93\x87\x23\x28\xb9\x40\x04\x72\x5c\xb1\x0a\x13\xaa\xeb\xbc\xcb\x31\x16\x88\x50\xe1\x00\x0c\x47\xd0\x74\x8a\x51\x3b\x77\xce\xfd\x62\x2f\xd9\x51\xae\xbd\x64\x94\x33\xde\xf0\xcf\x9d\xe4\x0a\x18\x11\x74\x07\x0a\x98\xec\x16\x1b\xec\xa2\x0b\x8f\x2f\x1c\x00\xff\xf9\x5a\xfd\xf3\x52\x13\xfe\x6d\x64\x38\xfd\xa2\x97\xdf\xee\xf6\xef\x3f\x7e\xe6\x4e\x5e\x29\x34\x63\xff\xb6\x6f\x3f\x7e\xb8\xbf\x7d\x93\x2d\xdd\x54\x47\x7f\xa8\x0f\x87\xfa\xe0\x8f\x30\x53\xa7\x13\x67\x15\xae\x78\x05\x29\xac\x48\xa5\x08\x42\x90\x71\x7f\x3e\x01\x65\x35\xc6\x22\x9c\x54\x5e\xd8\x51\x88\xaf\xf7\x6d\x44\x94\x96\x03\xe5\xff\x37\x6b\xef\x0e\x6d\xb7\x8e\xa6\x89\x11\xe4\x7e\x70\xca\xd3\x53\x3c\x57\x57\x57\xec\x1e\x4f\x15\x4f\xe9\xea\x8a\xe3\x69\x7b\x38\xad\x96\xc4\x71\x7b\x7a\x30\x5e\x5e\x36\xec\xe5\x00\xcb\xcb\x01\x42\x84\x08\x11\x22\x44\x88\x10\x21\x42\x84\x0c\x19\x32\x64\xc8\x90\x21\x43\x86\x0c\x19\xb2\xaf\x36\x71\xbc\x08\xee\x7d\x1e\x92\xee\x74\x75\x8f\x75\x6b\xef\xf3\x50\x69\xf3\x07\x08\x80\xff\xeb\xfb\x3e\x0d\x4b\x2b\xa1\x53\xd7\x51\x61\x0a\x18\xc5\x9c\x52\x9a\x39\x5c\x83\x20\x0b\xa2\x43\x7e\xc5\x7b\xdc\xed\xfa\xa3\x37\x5d\xde\x0f\xcf\x75\xd9\xc3\xd3\xf9\xb9\x2c\xbb\x71\xd4\x2e\x49\xec\x9a\x08\xba\x2a\x4e\xb8\x41\x8d\x65\xba\x2a\x07\xa3\x85\xa8\xbe\x23\xc9\x1e\xb8\x6e\x21\x0a\x8d\x20\x5e\x54\x2b\x9a\x66\x7b\x4e\xd7\x41\xe2\x75\x32\x7e\xef\x59\xaa\x9e\xf4\xe0\xf7\xcb\x9e\xa3\x0f\x77\xc9\xf1\xfd\xdf\x87\xd7\x6b\x96\xc6\x21\x0b\xe2\xc4\x55\x11\x73\x3a\x11\xc6\xc5\xac\xed\xe0\x50\x19\xa1\xda\x63\x71\xa1\x51\x72\x99\xa2\x6a\xdb\xae\x6e\x71\x8d\x0b\x1a\x89\xda\x69\x11\x46\x5a\xb3\x63\x6a\x9a\xeb\x38\x93\xe0\xaf\x3c\xae\xe5\xe5\xf5\xfc\x30\x7f\x07\xfc\x30\xf7\xc3\xfa\x0c\xfd\x25\x83\x74\xbf\xe4\x36\x4c\x3c\x76\xac\xe9\xd0\x60\xad\xd0\xcd\xd3\x30\xed\xe3\x28\xfb\x87\x80\x28\x3c\x80\xe4\x21\xb8\x2a\xcf\x9f\x02\xfc\x80\x0e\xf1\x09\xbf\xd0\xca\x79\x44\xf4\x3e\xb2\x7e\x7d\x0f\xcf\x7b\xe7\xed\xa8\xa3\xd8\x75\xdb\x31\xa6\x45\xcb\x66\xee\x5a\x20\x5d\x6b\xad\x05\x85\x75\x85\xff\xa2\x89\xc2\xea\x84\x2f\x83\xd6\x2b\x04\xf3\x68\x55\x07\x02\xad\xc1\xd0\x75\xdd\x3a\x6d\x6f\x85\xae\xf0\x1e\xeb\x46\x1e\x3b\xb1\xcd\xc3\xef\x83\xbf\xf4\x28\xc4\x6f\xe6\xfd\x36\x0d\xb7\x99\xb7\x2e\xb3\x20\xc9\x9c\x8a\x2a\xc7\x12\x61\xf1\x32\xb0\x6e\x40\x63\x5d\x0b\xd3\xbf\x98\x05\xeb\xba\x75\x71\xa3\x5b\xfc\x24\xc4\x37\xf5\xfd\xdd\x0f\xea\x7d\x3d\xea\x83\xf7\x83\x7e\x7e\xe9\x07\xdd\xff\xe9\x97\x8f\xc7\xef\xf1\xc5\xbd\xba\xf5\xeb\x74\x16\xc4\x1d\x9d\x5c\x53\xf2\x11\x26\x3a\x91\xae\xef\x45\x68\x90\x32\x00\xba\xb6\x95\x94\x09\x2d\x6a\xd6\x8a\xcd\xcb\xd0\xba\x04\xf2\x24\x5a\xb4\x3d\x52\x51\x96\x16\x3c\xaf\x08\x42\x5b\xbc\xd5\xea\x8c\x73\x49\x89\x2b\xc2\x60\x32\x4a\x83\x40\xdb\x2c\xd1\xf9\x66\x63\x78\xe3\xfb\xfc\xdb\x6f\x30\xc4\xcf\x1e\xa1\x6f\x4e\xe7\x0f\xef\x5e\x46\x47\xb7\x6a\x4a\x58\xec\x8d\x56\xb0\x59\x09\x0c\x49\xe5\xd2\x98\x51\x8e\x69\x99\x93\x0e\x8b\x24\xa5\x61\x11\x8e\x44\x58\x45\x75\x5d\xb9\xa5\x6c\xb5\x54\xb0\xb2\xac\x5c\xc7\x93\xa0\x8a\x2b\x27\xa4\xc6\x20\x8f\x21\xe6\x04\xc2\x8c\xb7\x2d\xca\xf3\x41\xd5\x92\x32\x2d\x99\xc0\xba\x24\x08\x0a\x84\x99\xb8\xea\xbb\xea\x70\xf2\x7b\xf6\xa7\x37\xbe\x13\xeb\x16\x15\x1c\x8e\xe7\x9f\xb7\xfb\x1a\x5c\x4b\x92\xbf\xbc\x0f\x11\x67\xca\xf6\x0c\xe9\xb2\x04\x62\x15\x20\x03\x86\xb8\xd2\x0d\xd6\x2d\x2e\xa7\x60\xe8\x57\x0d\x6a\x88\xc2\x81\xf9\x32\x96\x50\x88\x61\x3d\x30\xab\x41\xea\xfb\x88\x46\x6d\x65\xa7\x31\xda\x7b\xd1\xe8\x03\x3a\x14\x8f\x3a\x14\xff\xee\x3b\x9a\x19\xd7\x63\xdf\xab\xbc\x5d\x33\x3e\x6f\xf7\x53\xe4\x4e\x01\xba\xc7\x02\xd9\x9a\x83\xd4\xd9\x88\xea\xb5\xd5\x8d\xa7\x44\x5b\x34\x63\x0d\x1f\x63\x2e\x19\x27\xa7\x40\x08\xb9\xfd\x71\x72\x11\x62\x59\xa4\x70\xa4\x21\x75\xc5\x40\xed\x96\x09\x0b\xdc\x01\x5f\xef\x3a\x05\x02\xa8\xf3\xae\xe3\x71\x1f\xfc\xdb\xe0\xef\x02\x18\xe0\x6f\x6d\x7a\x77\xf7\xe3\xdf\x81\xd7\x7b\xba\x21\xdc\x2c\xf9\x1c\x5d\x73\xb5\xc7\xaf\xe1\xe0\x6f\x3f\x6c\x37\xf4\x66\xf8\xfd\xbf\xf2\x1b\xe2\xb3\x00\xc6\x00\xe3\x18\x28\x2e\x0b\x80\x8e\x9d\x08\x34\x2d\x21\x73\xd2\x52\x02\x63\xad\x57\xa9\xa3\x3e\xec\x30\x57\x0d\xec\x2b\x33\x17\x8d\xe4\x04\x8d\x90\x92\x72\x0d\xaa\x4c\x4b\xf4\x10\xc4\x54\x50\x8e\xe2\x53\x46\x88\x22\x42\x90\xc6\x2d\x58\x61\x52\xbb\x81\xf0\x52\x0d\x2e\x75\x8b\xb1\x20\x29\x94\x61\xa8\x50\x05\x63\x50\x17\x98\x19\x8a\x30\x49\x5c\x8f\x39\x2e\x11\x48\x5b\x0b\x19\x34\xc3\xde\x2f\x9f\x02\x7b\xae\x4e\x38\xb8\x0b\xde\x06\xb9\xef\x65\xff\x7a\x94\xdf\x1f\xdd\xa9\x7f\x6e\x3d\xfd\xbe\xdd\x27\xfc\xd2\xbe\x75\xfa\x8e\x61\xbb\x5e\xe4\xf0\x80\xce\xf4\xc4\x83\xd7\x8f\xf5\x74\xcf\x37\xbb\x77\xb5\xbe\x7f\xd2\xe0\xfc\xf0\x3d\x09\xcb\xa8\xd5\xd6\x32\x4c\x89\x2e\x10\x57\x50\x55\x91\x35\x6e\x36\x3b\x0d\xc0\xf5\x75\xe2\x8e\xe9\xb6\xae\xe4\x72\xb1\x91\x75\xe3\x2c\x01\x04\xb5\x06\xe8\x1f\x72\x6b\x4f\x83\x4b\x01\xb9\xb4\x80\x5e\x5a\xe0\x79\x14\xb6\xfd\x51\x1c\xd4\x73\x4d\xcd\xc7\x15\xf1\x42\xf9\xf3\x1e\x7c\xd5\x60\xb7\xbd\x2c\x28\xcd\xb6\x11\xbc\xd8\xa7\xe1\x86\x0d\xc2\x4d\x27\x6d\xd7\xd6\xda\x10\xae\xed\xed\x15\xe9\x65\xd1\xa4\xaa\x8c\x91\x2b\x0f\xad\x9b\xad\x1a\x01\x05\xf8\x4b\x20\xe4\x31\x76\xb6\x5f\xc7\x7e\x1d\xfa\xe0\xe8\x73\xd6\xc4\xf7\xfc\xfe\xb6\xc6\x67\xf8\x9b\x1a\x9f\x61\xb6\xe8\x71\xd4\x9c\x21\xac\x31\xa7\x0d\x9d\x8f\xa5\x71\xda\x18\xc0\x9d\xbe\xbd\xf6\x5a\xbd\x6e\xea\x4a\x69\x71\xd1\x11\x7d\x08\x7a\x3f\x49\x60\xf8\xee\x1c\x01\xf1\x80\xce\xf8\x18\xfc\x93\x74\x47\x9f\xc9\xdd\x8e\xf3\x66\x93\xc7\x34\x53\xcd\x46\x36\x1e\xb9\xfd\x5a\x77\x34\xf2\xf7\x4e\x0b\x63\xb4\xe2\x6b\x1e\xf6\x53\x2b\x41\x0a\x08\x60\xbf\x4a\xa5\x8e\xd2\xc9\x79\xb5\xf3\x6a\xe6\x6d\x0d\x8d\x57\xcd\x90\x3c\xf8\x1f\x83\xbf\x09\xca\xe0\xef\xf7\xcc\xe1\xfd\x23\x9b\xe1\xf7\xf8\x59\xae\x5c\xfe\x9f\x3f\xec\xf4\x9d\xf7\x1f\x7d\x9f\xd0\xbb\xbd\xb6\x1b\x21\x30\x95\xb9\x6b\x08\xa3\x1d\xb7\x10\x88\xbc\x04\xd8\x35\x08\xb2\x22\xd6\x09\xe9\x5a\x92\x0b\x27\x31\xc8\xa5\x6b\xcd\x98\x26\x6e\x01\x36\x49\x41\xb1\xf6\x20\x05\xa9\x97\xfc\x53\xa0\x06\x0a\x3a\xea\xe8\xa1\xc3\x18\x97\x4c\xb4\x39\x17\x14\x39\x58\x67\xd9\xf6\x6c\xc1\x10\x8f\x6e\xa0\x12\x76\x92\x30\x46\xda\x95\x43\x21\x39\xe2\x4c\x1a\x4b\xfc\xde\x68\xfe\xff\x1f\x57\x16\x06\x65\xee\x2a\xc2\x58\x2f\x0d\x04\xaa\x28\x01\x71\x35\x42\xbc\x88\x75\x4a\xba\x8e\x66\xca\x09\x0c\x0a\xe5\x6a\x3b\x65\x89\x9b\x40\x9d\xa4\x00\xae\x35\xc8\x40\x56\xba\xc9\x4d\x1a\x74\x40\x43\x87\x1d\xd9\xc7\xc5\xf9\xcb\x71\xd5\xe8\x3a\x2e\xd4\xde\xc6\x85\xf8\x36\x2e\xaa\xf6\x71\x45\x81\x7e\x40\x07\x78\x62\xc1\xeb\xe0\xff\x0a\xfe\x9f\x2b\xe7\xab\xe7\xcf\xbf\x69\x8c\xde\xdd\xdf\x7d\x02\x1f\xfe\x0a\x7c\xf8\x9b\x8f\x6f\xc2\xb7\x7f\x8a\xb6\x25\xb5\xb7\xaa\xdd\x4a\x14\xcf\xbe\xfd\xf0\xfa\xf3\x4f\x6f\x3e\xfa\xf7\xbf\x05\x3f\xbd\xf1\x7f\x05\x5a\x2a\xf4\x30\x84\xf1\x3c\x0f\x80\x5e\xa6\x1a\xb4\x32\xce\x93\x8c\x26\x5c\x67\x38\x2f\x11\x2a\x58\x56\xa2\x22\xa5\x02\x6e\x71\x40\x91\x12\x59\x2a\x5c\x7a\x4a\x2c\xc7\x7d\x70\x70\x62\xac\x48\x6b\xd1\x34\xbc\x15\x6b\x1e\x36\xd9\x65\x71\xc6\xb5\x3a\x75\x53\x98\x14\x04\x3f\x04\x05\x65\x90\x62\x57\x15\xa5\xc0\x08\x02\x5c\x50\xe2\x4c\x5e\x70\x8c\xca\xa8\xd2\x05\xc4\x8b\x29\x20\xe6\x0f\x01\xc2\x20\x28\x09\x76\xcb\x5e\x37\x58\xae\xb1\xcf\x5f\xf8\xbe\xde\x3f\x7a\xcf\xe1\x39\xb5\xf6\x1f\x1f\x59\xd7\x8e\xef\x3f\x1d\x6f\xbc\x8a\x9e\xab\xea\x05\x8c\xfa\x4c\xaa\x0b\xaf\xc2\x24\xc9\xaa\x3c\xad\x6b\xcb\x75\xe7\xb8\x52\x0f\x01\x1d\x43\x81\x4b\x55\xa0\x35\x08\xe3\xb8\x8a\x43\xbc\xce\x06\x58\xe2\x58\x23\xd7\x89\x84\x09\x76\xc9\xb1\x71\x4d\xd3\x83\x2d\xe4\x26\x6c\x30\x9d\xe8\x1a\x84\x96\x5a\x5a\x4a\x18\x66\x64\x14\xd6\x0a\xe3\xac\xac\x0d\x10\xce\xd6\xa6\x02\x78\x8b\xdb\xba\x6b\xfc\xbd\xdb\xfe\x3f\xfd\x86\xed\xff\x7e\xe7\x26\x8b\xee\x3f\x7d\xfe\xc6\xea\x7d\x70\x67\xa2\xd7\x4e\x03\x92\x65\x26\xcf\xb0\x56\x4c\x54\x9d\xe4\x3d\x6d\x1b\x80\x93\x58\x27\x40\xbb\x86\x82\x84\xb8\x45\x62\xd7\x73\x90\x97\xae\x0f\x4d\x99\x89\xb4\x3c\x36\xae\x6d\x3a\x80\x31\x2c\x08\x1b\xa5\xe5\xd6\x22\xd4\x4b\x29\x1c\x34\x75\x6d\xb4\x33\xda\x58\x50\x39\x3b\x8b\x09\x94\x40\x42\x0c\x11\x0a\x82\xf3\xd5\x76\xe9\xf9\x2a\x6f\x15\x9b\xff\xf0\x9c\xe3\xee\x9b\xa2\xcd\x27\xf0\x95\x73\x7d\xad\xa5\x28\x54\xaa\x1c\x83\xc6\x96\xcc\x3a\xe3\x5b\x9d\x1c\x03\xc6\xd9\x30\x11\x2e\xe9\x3a\x40\xfb\xb5\xdf\xbf\xd8\xed\x46\xe0\x93\x94\x06\x6a\x55\x14\x55\xb3\xa6\x95\xc7\x91\xea\x2a\x9c\x86\x75\xa9\xeb\xda\x65\x75\x5d\x47\xa5\xb2\xd0\xea\xcd\xce\xc0\xdb\xa9\xfe\x49\x76\x7e\xcd\x91\xbf\xdb\x99\x50\x64\x4a\x1a\xa6\x35\x16\x8d\xc3\x61\xbc\x2e\x7b\x8d\x09\x87\x52\xaf\xca\xd3\x34\xd5\x20\x5d\xcb\xc7\xef\x12\x06\x35\x64\x27\xb5\x59\x2b\x8b\xb2\xb6\x6b\x62\xcd\x66\xad\xb1\xe1\xdc\xba\xf8\xc9\x5a\x69\x91\xd9\x63\x83\x60\x7e\x40\xe7\x34\x62\x8f\xcf\x82\x47\xbd\xf7\xef\x0b\x89\xdc\xdd\x7f\x3a\xde\xef\x2c\xb8\x91\xb5\x49\x1a\xaa\xb5\x09\x5b\xce\xbd\xa0\x08\x5a\xc7\x6a\x1d\x6d\xd8\xae\x75\x98\xa6\x8e\x1d\x92\x2f\xf3\xf6\x8a\x58\x9e\xa5\xae\xc0\x57\x72\xd2\xd2\xcb\xae\x2c\x40\x60\xd0\x17\x13\x9a\xd1\xe6\x5f\xb2\xb0\x38\xeb\x93\x0c\x7e\xef\x19\x72\xfe\xfe\x3b\xbe\xdc\x37\xba\x39\x9f\x3e\x7a\xe8\x92\xdf\x61\xd7\xff\xef\x13\x5b\x52\x7b\x53\x67\x93\x17\x02\x94\x6b\x22\x0b\x26\x5b\x55\x58\x48\x91\x49\x99\x65\x2e\xd5\x02\x69\xc8\x2f\x25\xe0\x16\x60\x57\xb7\x36\x75\xc4\x05\xd9\xd4\x39\x7d\x4a\x38\x57\x5c\x29\x5e\xb4\xad\x59\x27\x41\x33\x9b\xe5\x25\x98\x89\x94\x44\x09\xc6\x98\xe2\x49\x2a\x71\x61\x93\x54\x06\x07\x5f\xaf\xd1\x07\x1e\xfc\xde\x47\x7a\xff\xcb\x9f\x63\xfb\x6f\x99\xfe\xee\x1f\xb3\x1c\x7e\x63\x78\x5f\x65\x0e\xaf\x53\x0a\x2a\xa7\xa3\x51\xef\x7f\xf2\x79\x36\x2b\x92\x34\xaf\x0a\x1a\x1a\xa9\x2b\x6c\x8d\x51\x4a\xd7\x69\xa6\x51\x61\xb3\x36\xf0\x35\x0a\xfb\xdd\x1a\x45\x55\xf9\x1a\x85\x0d\xd3\x93\x70\xed\xe4\x24\x90\x53\xe0\x7b\x06\x60\x54\x5e\xf3\x9c\xbf\xbc\xe4\x97\x3c\x5e\x75\x54\xfc\x81\x71\x53\x57\xff\xec\xe5\x5e\x40\x0e\x73\x95\x97\x61\x20\x31\xe5\xcc\x25\x61\xe3\xa6\x71\x4c\x40\xee\x3a\x3c\xf0\x1a\xce\x20\x4e\x86\xe1\x21\x38\x09\xae\xa0\xe6\x25\xac\x08\x61\xb3\x9e\xb5\x64\xc6\xa9\x56\x58\x90\x99\x49\xcf\xc1\xe1\xea\x2b\x6c\xf6\xfe\xe5\x55\x07\xef\xc3\xdd\x87\xab\xd5\x1f\xc0\x87\xbd\xdc\x18\x46\xde\x79\x09\x8f\xef\x83\xbb\x8f\x1f\xfe\x0d\x78\x82\xb6\xed\xe7\xda\x31\x33\xb3\xbd\x60\x33\xbb\xb2\x4a\x4c\x12\xf6\x6b\xca\x6b\x59\x11\x15\x2a\xe6\x26\x0c\xb8\x29\x70\xa1\x28\xa1\x16\xcd\x0e\x89\x84\x0a\x7c\x12\xae\x5e\xb6\x59\x58\xdc\x20\x32\xa2\x57\xe5\x06\x0e\x8a\x30\x58\xad\x9b\x6a\x05\x02\xc0\xbb\x0e\x2b\x53\xa1\xd9\x18\xa2\x65\xd8\xa4\x4b\x03\xeb\xe0\xd6\xb7\xb0\xdb\xfc\x57\x37\xf6\xfa\xa7\x99\x06\x1f\x3e\x7d\xcf\x68\x9f\x1d\xbb\x99\xfd\xf3\x5e\x78\x3c\x98\x0a\x94\xf6\x8b\xb5\x00\xae\x7d\x9f\xc4\x36\x89\xf8\x45\xc8\x5e\x36\xbc\x89\x62\xed\x2a\x0c\x06\x1b\x67\x39\x47\x8a\x0b\x5b\x23\x57\xbb\x40\x65\x52\x8a\xdd\x78\x01\xd4\xe2\x86\x12\x6e\xd6\x1b\xd7\xed\xd6\xd7\x6e\x6c\x36\xeb\x65\xd3\x94\x05\x86\xb6\xc6\x93\xae\xb0\xd6\x61\x95\x3e\x04\x35\xaa\xf6\xf3\x41\x9c\xf9\xc1\x04\xe7\xe0\xaf\xbd\xaa\xce\xb5\xbf\xc2\xab\x2a\xbf\xf6\x59\x94\x97\xe0\xc1\xcd\xe2\x9d\x59\xfe\xf3\xfd\xad\x58\x7a\xde\xe6\xfd\x4c\x7f\x2d\x8f\xc3\x3f\x48\x90\x85\x79\xac\xc3\x60\x5d\x92\xac\x80\x0c\xaa\x24\x15\x94\x61\x9a\x17\xcd\x0c\x1d\xea\xb4\xa3\x04\xa0\x39\x5b\x47\xa9\x32\x84\x68\x51\xc6\x25\xe2\xea\x60\xf4\x97\x45\x1d\x33\x37\xe7\x39\x56\x8a\x95\x85\x68\x32\x58\x20\xb2\xc5\xcd\x25\x2b\x34\x5d\x7a\x2d\x19\x88\xa7\x3c\x63\x05\x64\x65\x11\x53\x48\x85\xcf\x3b\xf7\x0f\xe2\x2c\x4e\x28\x38\x07\x7f\x08\xfe\x07\xdf\x49\x7f\x1d\xc5\x6d\x9f\x5e\x69\x51\xb7\x79\xfe\xe1\xee\xa3\x67\xc1\xb8\x09\xcf\xbd\x7b\x8e\x8b\x3c\xb3\x4b\x70\x48\xbe\x90\x09\x48\x0d\x84\x53\x71\xbe\x0c\xbc\xed\xe5\x44\xba\xce\x49\x29\xd3\x0c\x15\x18\x17\x05\x63\xa1\x90\x49\x4a\x10\x81\x30\x2f\x29\x3f\x21\xfd\x2b\xd6\xa7\xde\xc9\xa6\x51\xae\xaa\x6c\x2f\x7b\xfb\x10\x48\xc1\x81\x04\x04\x16\x39\x25\xb0\x14\x82\x62\xda\xcc\x05\xc6\xbe\x50\x49\x31\x6b\x83\x28\xcc\xbd\xbf\x21\x83\x7f\xe1\xfb\x90\xbe\x62\x4d\x7c\xb6\x4a\xa2\xb7\xa7\xf3\xcd\xab\xda\xcb\xea\x5e\x4b\x2c\x28\x32\xaf\xe8\x9e\x64\xb9\x33\x87\xc0\x89\x1c\xd6\x8a\x57\x95\x1a\x89\x2b\xab\x98\xb0\xca\xe4\x53\x8f\x39\x65\x20\xaf\xdd\xac\xc3\x61\xcd\x4f\x92\x50\xad\x51\xe9\xe8\x3a\x2b\x81\xa5\x94\xb8\x66\xd5\x10\x32\xc5\x1c\x81\x50\x72\x84\x81\x26\x85\xd6\x83\x9e\x7d\xbf\xc7\x74\x7d\x36\xff\x8b\xab\x72\xe2\x6f\xda\xf8\x95\x89\x5e\x9d\xf2\xc8\xf3\x14\x34\x5f\x66\x50\xa7\x99\x6b\x22\xe5\xea\xac\xd4\x9c\x29\x23\x5a\xe2\xa4\x26\x44\xcb\xbc\x6b\x20\xc1\x0c\xc4\x7a\x31\x21\x59\xab\x17\x06\x72\xf4\x68\x20\x56\xd4\xf1\x72\x37\x50\xe2\x5c\xe9\x71\x33\x30\x0c\xcd\x15\x23\xfb\x1f\xbd\xa2\xed\xde\xac\xf8\x82\xd1\xe1\x37\x58\x89\x7d\x89\xe1\xc6\x8f\x72\x6d\x10\xb5\x45\x0a\xec\x85\x1a\x0d\x72\xdd\x34\x2d\xa0\x3e\x25\x4d\x8b\xbc\x37\xbd\x06\x74\x36\x9d\xe2\x18\x4c\x9e\xc6\x6b\x00\xf9\x49\x60\xa2\xdb\xed\x44\x56\x6e\xb4\x8e\x5d\xf3\xd0\xab\x09\x99\xcb\x43\x6a\x41\xe6\x26\x17\x3b\x81\x67\xc0\x40\x1c\xb6\xb0\x5c\x6b\xbb\x9f\xb5\xe8\x2c\x8e\x38\xf8\xfd\xb5\x3f\xeb\xb1\xf0\xbb\x97\x83\x8f\x4f\x7c\x10\xbf\xad\xfa\xe5\x75\xc6\xef\x5f\xdf\x9f\xc5\xaf\x45\x65\x6c\xd8\xa7\x99\x2e\x53\xa7\x2c\x18\x2d\x28\x5d\xe7\xba\xb0\x60\xb4\x44\x39\x2b\x73\x27\xac\x13\x55\x58\xb8\x66\x7b\x3a\x87\xd2\x65\x60\x3c\xb4\xca\x05\x8e\x6c\xce\x1c\x04\x2a\xc4\x45\x51\x20\xd4\x70\xce\x95\x5b\x94\x1b\x28\x49\x54\x8c\x84\xef\x9b\x32\x60\x51\x20\x56\x4a\x05\xc1\xe1\xd1\xcf\x7c\xf5\xb2\x73\xef\xeb\xbc\xf9\x4b\x47\xe8\x11\x5f\xda\x0f\x7a\x67\xcf\xd4\x03\x8a\x32\xd7\x01\xe3\x98\xf5\x1e\x5a\x63\x6e\x24\xfa\xc7\xc9\x4f\xa9\x94\x52\xb6\x6b\xae\xb5\xb3\x80\x6a\x0d\x6a\xeb\x4a\xbb\xe7\x26\x66\x8f\x5d\x94\xc1\xab\x6b\x17\xc5\x7f\x78\x56\xa3\xd8\xad\xb8\xd5\x28\x9e\x95\xc6\x3f\xdf\x79\x99\x36\x3f\x77\x3f\x7f\xfe\x78\x1f\x05\x20\x30\x80\xd9\x65\xb1\xce\x98\x87\x20\x3f\x30\x6d\xd2\xda\x3a\xee\xca\xb4\x55\x20\x0b\xd3\x75\xf2\xbd\xf4\xf9\xbc\x4e\xc7\xbe\xae\xeb\xfa\x5a\x3f\xba\x4c\x89\xca\xe6\xb1\xcc\x4d\x12\x89\xb6\x5d\xe7\x76\x9d\xd2\x6c\xaf\x13\x3d\xd5\xc1\xbe\xb5\xed\x65\xfd\xe4\xb7\x6c\x7b\xf7\xf1\x3e\xe4\x20\x33\xc0\x18\x90\xb9\xd1\x38\x66\xdc\x18\x1f\x96\xba\x4d\x07\xe3\xa0\x0b\xb2\xb1\x06\xe8\x06\x5a\x06\x18\xa4\xab\x39\xf6\x55\x55\x55\x37\xf3\xc6\x54\x65\xf3\x50\x16\x36\x89\xe4\x6e\xde\x98\xe6\x7b\x6f\x94\xef\x43\xde\xed\xdb\xe2\x9b\xff\x39\x80\xcf\x14\xed\x9e\xe6\xee\xed\xf1\xcd\xf9\xa7\x2b\x6b\xdf\xcf\xb7\x6e\xd1\x17\x1e\xce\x1f\xc1\x13\x63\x5f\x38\x8d\x16\x70\x3b\x8e\xd6\x69\x3b\x86\xa9\x2d\x16\x50\x50\x37\xb9\x65\x76\x03\x01\xd6\x2d\x40\x5b\xb0\x05\xb0\x8c\xe0\x14\x93\xc2\x71\xa9\x95\x95\x75\xb8\x28\xa5\xb8\xb9\x16\xe7\xda\xb6\x69\x50\x01\x67\x69\x34\x88\x1f\x02\xab\x26\xa7\xc6\x51\xbb\x42\x90\xc4\x24\x14\x54\x10\xbb\x51\xf3\x7a\xa8\x27\x36\xf4\x3b\xff\x9e\xf7\x59\xbe\xe2\xdf\xfb\xe1\xca\xbf\xb7\x99\x7c\x3d\x92\xee\x3f\xde\x03\xa1\xb3\x1c\x70\x87\x10\xe7\x9d\x56\x60\xea\x7d\x66\x94\xa6\xb2\x41\x6e\x06\xc9\x23\x07\x1f\x08\x1c\xdd\x49\xf8\x50\x51\xde\x48\xf8\x82\x1b\xdf\xdf\xe2\xf1\xf8\x7f\x78\x8e\xf2\xfd\x3e\xdd\x1f\xd6\x10\x60\xc7\x21\xe5\x56\x0b\xd0\xd6\xe3\xc8\x70\x2a\x2a\x34\xcf\x27\x51\x74\xdb\x85\x26\x27\x9e\xae\x83\xd1\x8b\xeb\x44\xf9\x6f\xf3\x0a\x7e\x35\x2e\x66\xfc\xb8\x30\x66\xbc\x95\x02\x8c\x7e\x5c\x9c\xa6\xaa\x46\x0f\x01\x08\x6e\xe3\xe2\x8b\x23\x5a\xbb\xe1\x76\x39\x1c\xe6\xda\x73\xc6\xc9\xa8\x3d\xa9\x2b\x6e\x26\x78\x75\xd5\xce\xbf\xdb\xf3\xe0\xaf\x6e\x72\xdf\x77\xf7\xef\xae\x27\xa7\x01\xa9\xdd\xc2\x12\x8c\xb3\x42\xf3\xcc\xc4\x89\x1b\x5d\x9d\x55\xca\x4d\x21\x54\x56\x1d\x93\xed\xe9\xb9\xc6\x8e\x25\x29\xe7\xd9\xf2\x10\x14\x18\xe2\xd2\xa6\x19\x68\xbc\x22\xd8\xf6\xba\xf1\xd5\xa9\x08\x9f\xd4\x4d\xcf\xea\xf1\xda\x2f\xd4\xeb\x9f\xae\xac\x41\xe0\x25\x15\x79\x9a\x09\x5c\xe8\x78\x76\x63\xae\xe5\x43\x10\x06\x5c\xf3\xc7\xcb\x56\x10\xa1\xdc\x34\x05\xd4\xd4\xe6\x25\xd0\x0a\x8c\xdb\x79\xe7\xb2\x1d\x4b\x73\xe3\xff\xfe\xdb\x47\xbd\xce\x17\xbd\xd0\x2f\x41\x25\x8f\x02\x5e\x77\xcf\x9a\x4c\xb6\x9d\x1a\x4a\x90\x58\x20\xad\x4f\x66\xa2\xd5\x86\x39\xa3\x98\xe5\x1a\x15\x4e\x08\xb3\x22\x23\x9c\xb4\x61\xb6\x6e\x4e\xfc\x0c\x6a\x20\x9d\xbc\x2e\xf2\x4e\xeb\x4b\xed\xab\xcf\x28\xb4\x2e\x03\xcc\x1f\x7a\x06\x8c\x17\x71\x48\xb5\xee\xba\x6e\xe7\x05\x09\xae\x7c\x38\x4f\x78\xa6\xff\xf2\x4f\xc3\x33\x7d\x1f\xce\x14\xe9\xa8\x11\x0a\x64\xc6\xcd\xd6\xcd\x06\x54\x88\x2a\x4a\x09\x5e\xf3\x08\xfa\x5f\x81\x04\xd4\x6e\x76\x18\x24\x85\x8e\xc1\x1c\x73\x55\xf2\x54\xc2\x2c\x8b\x5d\x4d\x1c\x26\x80\x12\x67\x80\x3e\x21\x6e\xd9\x65\x6e\x38\x6f\xa2\xa4\x2c\x48\x09\x31\x76\x39\xe7\x9c\x4f\x57\x30\x13\x77\x55\x9b\xaa\x14\x37\xce\xe4\x3a\x9d\x54\x70\xf2\xdc\xa0\xf8\xc5\x98\xfe\xd7\x7f\xda\x98\x4e\xaf\xbf\x3f\xa8\xe0\x90\x2b\x03\x90\x71\x8d\x75\xad\x01\x23\xe5\x4a\x30\x4e\x2f\x6d\xd4\xf8\x5f\x01\x08\x26\xd7\xb8\x0c\xc0\xd2\xc4\x61\x1e\x0b\x53\xaa\x54\xa3\xa2\x88\x1d\x63\x2e\xa3\x40\x73\x47\x40\x7f\x42\xdc\xf0\xcb\x5c\x73\x5e\xef\x83\x42\x98\xec\x83\xba\x22\xb4\x38\x2c\xf6\x51\x91\xfa\x36\xaa\xcd\x47\x5a\x3c\x57\xae\x0c\xfe\x22\xf8\xd3\xce\xce\xf9\x7c\x20\x60\x57\x9b\xff\xfc\xcb\x0b\xb9\xf9\xaf\x82\xc8\x33\xb3\x6b\x60\x41\x97\x15\x06\x65\x6b\x1b\x75\x2e\x67\xa2\x1f\xf3\x42\x1a\xa2\xa1\xab\x9c\xc8\x6b\xe5\xba\x04\x54\x76\x7b\x64\x86\xc1\x17\x1a\x06\x8e\x1c\x2b\x37\x29\x05\x52\x8a\x73\xce\x5c\xa3\x6b\x9e\x64\x10\xe2\xba\x23\x1a\xa5\x8a\x77\x6b\x23\x84\x1e\xb5\x1e\xb7\x35\x15\x47\xe5\x43\x79\x56\x87\xf6\x05\xc6\xf1\x7f\x7f\xea\x44\xb9\x69\x65\xde\xdd\x5f\x7b\xcf\x8e\xe7\x77\xa7\xe3\xfb\xbf\xf9\xfc\xce\x77\xdd\x7c\xde\x55\x37\xde\x7e\xfc\xbb\xf0\x2b\xad\xc8\x5b\x6e\xe3\xd3\xe7\xfb\x73\x54\x01\xa9\x80\xc4\xd8\x49\x60\xd7\x29\x49\x42\x56\x95\x18\x94\xdc\x55\x8d\xb3\x70\xb2\x6e\x28\xf3\x19\xc0\xdc\x4d\xc0\x3a\x89\xb1\x9e\x67\x20\xe6\xd5\xec\x5f\xb8\xcf\x78\x6c\xfb\x6a\xa4\xa5\xb3\xc5\x41\x42\xd8\x92\x16\xba\x25\xcf\x38\x83\x58\x08\x9c\xc9\x1c\x95\x90\x23\x10\xc3\x96\x60\x8c\x17\x8c\xb1\xc3\xdb\x5b\x56\x60\x14\x04\x21\x50\x0f\x38\x12\x5e\x0f\xe6\xf7\x5f\x69\x05\x9c\xdf\x7f\x0a\x3b\xad\x67\x3c\x4a\x8d\x98\xa6\x78\x39\x34\xb9\x9b\x6b\x55\x35\xb9\x96\x2b\x0c\x33\xac\x3a\x7f\x06\xa3\x07\x78\x26\x27\xec\x91\x68\xcf\x98\x0b\xb7\xf5\x08\xb8\xd1\xfa\x24\xed\xaf\xcd\x11\x1d\x26\x07\xd7\x6e\xdb\x17\x75\x18\x44\xb1\x33\xd3\xae\x4f\xe5\xfb\x28\xcc\x41\xdd\xf0\xd2\x1f\x5f\x20\xa6\x5f\x6f\xee\xe7\x7f\x85\x61\xc1\x63\xdb\x25\xd1\x4a\x4e\xaa\xaa\x5c\xa2\xc2\xc9\x31\xd0\x39\xa3\x16\x3e\x6a\xad\x67\xba\x18\x57\x81\xca\xd5\x24\x1c\xa6\x43\x20\x76\xc1\xd4\x69\x72\x9d\xa4\x4a\x0a\xa9\x2b\x67\x01\xac\xb9\xa4\x56\x51\xd0\x08\x21\xb6\x79\xa9\x1f\x50\x54\x1f\xcc\x6d\x5e\x4e\x2f\xe6\x25\x0a\xa4\xed\xb0\x6d\x15\xa6\x9a\x91\xe1\x60\xd0\xac\x3c\xe9\x8b\x58\xf3\x10\x12\x69\x6e\xcf\x26\xe8\x71\x96\xbf\x0b\xfe\xd5\x37\x0c\x83\xa0\xee\x0c\x23\x27\x64\x7f\x5d\x8e\xf1\xa1\x76\x7c\xed\x1d\xa6\x0b\x50\x20\x8f\x02\xc7\x40\x22\xf7\x7a\x23\x7e\x80\xfe\xf9\xf6\xaf\x3d\xc3\xc3\xbf\xbb\x21\x4b\xf7\xa3\xf7\xcd\x8d\x16\xeb\x95\xa7\xb7\xfd\xf4\xea\xee\xfe\xee\xd5\xb5\xeb\xea\xf5\xf9\x6f\xdf\x83\xce\x26\xf9\x82\x11\xa4\xb9\x29\xdc\x18\x6b\xa5\x62\xce\x9b\x6c\x70\xa3\xc4\x85\xc8\xb1\xcd\x74\x7a\x12\x19\x27\xbf\x4a\x42\x62\x13\x17\x21\x77\x89\x33\x18\x08\xa0\x4d\x48\xc5\x9a\x83\xde\x15\xc0\x28\x0d\x95\x5a\xdb\xa6\x4b\xfa\xea\x86\xb3\xfc\xb3\xf1\xf7\x1e\x03\x79\xfc\x06\xe3\x9e\x9b\x5e\x2f\xba\xef\xd7\xa9\x8f\x84\x4b\xc3\xd4\xa1\xde\x33\x76\xf6\xba\x77\x0d\x07\xb0\x77\x3c\x8c\x1d\xb3\x36\x9c\x97\x6f\x60\xee\x3d\xab\x14\x88\x5d\x01\xfa\x87\x40\x2b\x39\x3c\x01\xdd\xc3\x90\x78\x6e\xc7\x3f\xdb\xb6\xd3\xb7\xb6\x95\xa6\xd5\x93\x1e\x86\x75\x69\x23\xea\xf2\x30\x76\xa4\x05\x19\x71\x63\xa7\x3b\xd7\x71\x90\x0f\x4e\x80\xc5\x71\xad\xc3\x7e\xfa\xc6\xb6\x81\x56\x12\xc4\xae\x04\xdd\xa2\x95\x78\x8e\xc1\x3f\x04\xe4\x81\x1d\xda\x43\xf9\xac\xdb\x7e\xbb\x9f\xdf\xc7\x8e\xf9\x75\x7e\x7c\x06\x20\x03\x4a\xa7\xd9\x92\xe6\xba\xcc\x00\x74\xbe\x01\xc0\xbf\xe8\x65\x36\x79\x41\x3b\x50\xb9\x71\xf3\x83\xb7\xd7\x21\xcf\x20\x44\x30\xc7\x54\x49\x2d\x95\x54\x22\x9c\x8a\x9c\xd7\x46\x4a\x37\x4b\xe9\x16\x79\xd5\x86\xdb\xf1\x24\x7f\xbd\x9d\xc6\x4f\xf9\xba\xe8\xc3\xab\xfb\xd7\xf7\x3f\xbc\xf9\xf4\xea\x79\x9b\x7d\x74\x6b\xb3\xf7\xc9\x3c\xbf\xd0\x1a\x60\xaf\x62\xad\x89\x4d\xc2\xc0\xc5\x59\xc9\xb1\x16\x16\x23\x98\xa8\x94\x11\xc3\xb8\x25\x0d\xa7\xf9\x17\x0e\x26\x47\x8f\x3d\x47\x06\xb2\xe3\xe6\xcc\x6a\x5f\xb2\x73\x64\x1e\x01\x2c\x5c\x31\x4f\x4b\xba\x18\x10\x68\x21\x74\x05\xca\x30\xd3\x7a\x11\x12\x69\xbe\xd9\x79\x48\x1e\xb0\x7f\x6e\xfc\xc9\x57\x7a\xdf\x84\xe7\x1f\x1e\x0b\x46\xbb\x55\xbf\x44\xe7\xf7\x9f\xa3\x0f\xc9\x9b\x77\x6f\x8e\x9b\xdd\x7b\xb2\x62\x54\x42\xc1\x22\xf5\x1d\x8f\x48\xd2\x7a\xc2\x73\x57\xa4\x75\xda\x24\x36\xf1\x5c\x9d\x49\x46\x20\xce\x4d\x86\x23\x0c\xdd\xd0\xba\x8e\xb1\xac\x97\x00\x37\xc2\xc8\x71\x04\x32\xd3\x79\x98\xb9\x71\x42\x1a\xb9\xb9\xd3\x51\xad\x6c\x61\xbd\xce\x4a\x1c\x10\x8f\x1d\x62\xbe\x43\xfe\xdf\x04\x6f\x7d\x5e\xcb\xa3\xa3\x5e\x6d\x2b\xc9\x5b\x75\x77\xff\xee\xd9\xf7\xc7\x67\xca\xb7\x9b\xd5\x1e\x09\x72\x78\x73\xfe\xe5\xdd\x0e\x57\xd8\xe9\x6b\xde\x04\xc7\xf7\x3f\x6b\x30\x29\xa5\x51\x5d\x3b\x1b\xa6\x60\xd2\x52\xa3\xba\x72\x95\xd3\x65\xaa\xd2\x32\xb4\x45\xa6\xd2\x92\xf4\x0b\x06\x10\x24\x34\x49\x01\x9a\xc8\xec\x26\xda\xba\x0e\x81\x12\x10\xfa\x10\x38\x81\x80\x01\x15\x75\xdd\x5a\xe1\x90\x9e\xd8\xca\x24\x2a\x55\x41\x40\xa0\x9e\xbe\x2d\x08\xcb\x19\xde\xdf\x57\x69\x98\xe2\x23\x4a\x13\x61\x65\x05\x59\x4d\x05\x4b\xf9\x20\xa5\xda\x9e\x49\x5c\x89\xdd\x17\x45\x0f\xf2\x60\x4e\xe8\xb6\x82\xdf\x5d\x13\xb6\xdb\x7f\x37\xb2\xf9\x9b\x7a\xdc\xf5\xbf\x4f\x37\x10\xd8\x41\xa6\xae\x5c\x87\x0c\xf4\x5e\xb9\x75\x41\x48\x98\x52\x67\xbd\xab\xa2\xdc\xf5\x1e\xfb\x58\xba\x6e\x58\x3b\xb0\xf8\x24\x7f\x6c\x14\x29\x4d\xd1\xe8\x5a\x63\xda\x0d\x05\x6d\xc2\x76\x85\xdb\x8f\x36\x3d\xd4\xc6\x61\x13\x44\x51\xf7\x20\xce\xcf\xec\x79\xce\xbd\xff\x0c\xb1\xf7\xd6\xb7\xf4\xbe\xda\xb6\xdb\x53\x94\x7d\xa0\xe1\xe2\x46\xaf\x23\xbb\x3d\x4c\xe9\x45\x01\xe1\x26\x90\x8e\x05\x94\xa2\xd4\x71\x5a\xbb\xce\x78\xe9\xab\xd6\xc1\x13\x5a\xf3\x4e\x75\x3b\x81\x64\x17\x2b\x4a\x1b\x10\x14\x65\xd9\x81\xaa\xda\x03\xee\x28\x1c\xae\xb6\x3c\xaa\x57\x9c\xef\xbf\x9a\x8b\x67\x18\xc2\x5b\xa3\x8f\x8f\xf7\xad\xc9\x40\xec\x64\xa4\xf7\x62\xcc\x95\x4f\x73\x0b\xf5\x35\xe0\xae\x2d\xb0\x52\xfd\x2d\x92\x8d\x50\xc1\xbb\x70\x78\x6e\x8e\x62\xac\x0d\xdb\x47\x3b\xe8\x3f\xdb\x0e\xa8\xb6\xc3\x05\x1d\x02\x47\xfd\xe1\xbf\x6d\xee\xf8\x4b\x1e\xe6\x5e\x0e\x4a\x42\x24\x6d\xe7\x79\x3f\xba\xb5\x8c\xca\x9c\xb5\xe1\xb8\x66\xad\x6e\xf4\x66\x87\x6e\x0c\xa6\x6d\xd8\x59\x07\xbd\x46\xce\x41\x5d\x39\xee\xef\x83\xf7\x9b\x15\xdb\xd6\xfc\xbc\xef\xde\x8f\x5f\x6f\xde\x5f\xee\x3e\xfc\xeb\x6b\x61\x4d\x27\x8e\x26\x39\x43\x4a\xe8\x2d\x02\x4b\x29\x96\x54\x55\xa8\x13\x65\xde\xa6\x7d\x62\x92\x01\xe5\x3a\x47\x87\xce\x20\x37\x2f\xed\x82\x9c\x9a\x1e\x82\x7e\xdb\xb9\x49\xc5\xb5\xae\x17\xd0\x64\x3a\x9f\x41\xe1\x02\xd0\xef\x5b\xf6\x14\xb0\x07\x75\xa8\x4e\x65\xf0\x3e\xf8\xeb\x47\x9f\x2e\x78\x75\x1f\x7d\x08\xff\x15\x38\xbf\xdf\x49\xb4\x5e\xf6\x8b\x7c\x7e\xf3\xe9\xf3\xdb\xbd\x35\xe1\xfe\xc7\xf3\xfd\x67\xb0\x45\x5c\xdb\x72\xff\x1b\xf0\xf6\xee\xf3\x16\x6c\x45\x6f\xef\x3e\xd7\x11\x85\x6d\x5c\xe2\x2a\x2d\xf3\x3c\x8f\xdb\xb4\xc8\x73\x92\x67\x4c\x12\x41\x61\x89\x79\x96\x2c\x50\xa9\x3e\x31\x20\x4f\x00\xcf\x57\x1a\x69\x98\xba\x7c\x6d\xb2\x02\x94\x42\x80\x91\x4b\xce\x4f\xa5\x9b\x5d\x3b\xa2\x58\xc7\x0c\x04\x92\x64\x39\xcb\x32\x0e\x29\xa4\xc5\xae\x1c\x38\x0f\x18\x64\xc0\x12\x5c\xfd\xaa\xc2\xd4\xe9\x54\x69\x5a\x03\xe3\x54\x42\x41\xec\xcf\xfc\x3a\xd9\x79\x36\xc5\x03\x3f\x9b\x13\x0c\x7e\x79\x64\x3a\xfb\xcf\xdb\xae\x88\x3e\xfc\x0e\x9c\xde\x3e\x8e\xf3\x9a\xd8\x7d\xea\xe1\xf2\x7e\xc4\xf1\xfe\xf3\xfd\x8f\xe0\x6e\x87\x74\x5c\xb5\xed\xfd\x2b\x5c\xa2\x0a\x2d\x09\x64\x4d\xee\xb5\x2d\xa7\x0c\x32\x4a\x84\x25\x86\x21\x84\x11\xca\x53\x37\x94\xd2\x74\xb1\x01\x39\x30\x85\x83\x51\xc0\x7f\x1d\xa5\x35\x06\xe4\xd6\x82\xc2\x98\x13\x74\xbd\x53\x6e\x46\x26\x16\x00\x5a\x4e\x38\xd1\x98\x61\x59\x16\x24\x2f\x10\x71\xed\x43\x80\x01\x06\x73\xdf\xb3\x4b\xed\x02\xad\xc3\xc0\x05\x4f\x4d\x1e\xde\x1f\x3a\xe6\x3e\xd6\xcb\x9e\xa9\x6b\x7f\xa7\x65\xe4\xcc\xbe\x6d\xa1\xc9\xfe\x21\x6f\x9a\x6b\x1f\x48\x0f\xf0\x65\xf0\xb5\x60\x50\x3c\x94\xa7\xf1\xca\xdb\x7e\x8d\xeb\x1f\x75\x80\x9e\x95\xd8\xf6\x7c\xe2\x0d\x2e\x02\xf8\xb1\xf8\xb5\x37\xd1\x72\x89\x0f\x83\x52\x54\xe4\x15\x86\xe5\x17\x6d\xed\x81\x7f\xd1\xfe\x45\x9c\x92\xc2\x55\xab\xa0\x34\x31\x49\x9e\xa7\x0f\x41\x84\x26\xea\x5a\x76\xe3\xd2\x97\x67\x13\xb1\x5d\xc7\xf1\x85\xba\xb6\x8f\xeb\xbb\x93\x58\xd3\x90\xae\x36\x82\x4b\x0f\xb0\x05\x78\xcd\x22\x3f\x2a\x3f\xb0\xc1\xe5\x61\xe3\x39\xb8\x8b\x2d\x4e\x8c\x16\xdf\x5f\xf9\xce\xf3\x3e\x78\x47\xe2\x0f\xe0\xf6\xcc\xfe\xf9\xfd\xfd\xdd\xcf\xfe\x88\xbe\x7b\xb3\x05\x1e\xbf\xbc\xbf\x7f\x7d\x1a\xd6\x21\x49\x43\xbe\x0e\x70\x82\x59\x6c\x53\x8a\xb9\x6b\xe8\x4a\x01\x05\x69\xea\x3a\x87\x91\x3d\xb0\x75\x49\x93\xb5\x8b\x16\x07\x31\x32\xa2\x6e\x8a\x9a\x2f\x9d\x9b\x20\xd2\x04\xa1\x03\xd3\xd6\xba\x12\x61\xef\xeb\x82\x90\x3d\xe0\x63\xec\x7b\x7c\x7e\xab\xb7\x27\xec\x5b\xd3\xb6\x8a\xb0\x12\x1a\x24\x58\x47\xdb\x63\xbc\xdd\x59\xb3\x54\x95\x56\xfc\xd2\x46\xe2\x21\x18\x24\x80\xa0\x0d\xc2\x80\x3e\xcc\x5e\x2f\xe2\x27\xaf\x46\xf5\x26\x8c\x3c\x80\xe4\xfd\xa7\x57\xfb\x21\x1e\x9e\x3f\x7d\xde\xce\xf2\xe3\xfb\x9f\xc3\x4c\x57\xbd\x95\xf9\xe8\xe6\x5c\x4b\x2e\x52\x4d\x35\x55\x04\x95\x22\x1d\xdc\x52\x82\xf4\x58\x96\x0e\xba\xb9\x28\x39\x2f\x65\x0d\x82\x2c\xd1\x13\x90\xb9\xd3\x5d\x9c\x88\x8b\x56\x1c\x5b\x74\xd5\x4d\x9b\x7d\x8e\x6c\xe7\x0e\x79\x13\x82\x6b\x19\xf5\xd9\x35\x77\x86\xb9\xb0\xd2\xdd\x43\xd0\x55\xb9\x9b\x5d\x5d\xd4\x56\x99\xac\x11\x86\x57\x92\x4d\x99\x1b\x9d\x85\x40\x6c\x17\x25\x6e\x2c\x4a\xc9\x4a\x55\x6d\x17\x35\x23\x90\x85\xab\x87\x38\x59\x03\xcd\x70\x85\x7c\xee\x82\xfa\xba\x06\xf2\xfe\xfd\xce\xce\xf0\xb7\xfb\x0a\x7c\x76\x1b\x4f\x6f\xff\xb4\xdd\xb5\x7d\x06\xb6\x73\xda\xdf\xc4\xaf\xfb\x92\x22\x1a\x0d\x4e\x25\x31\xd0\xae\x2a\x78\x96\xc7\x3a\x57\x78\x84\x4e\x37\x3a\x6d\x1e\x02\xe4\xf9\x07\x01\x4c\x62\x37\x44\xa5\x5d\x95\xb5\xa1\x58\xd5\xf6\x3a\x21\x27\x61\x21\x31\x95\xb0\xaf\xb5\x2d\x0a\x05\x4b\x18\x72\xe9\x74\x59\x72\x97\x5e\x46\x42\xa3\xdc\x0d\xfe\x69\xbb\xd9\x2c\x7d\x5e\x08\x5d\x2b\xfb\x37\x3e\xb7\xdf\xb4\xf9\xbc\xdb\xfc\x3d\x93\x65\xd4\x38\x1b\x27\x40\xb8\x36\xe7\x49\x9e\xaa\xcd\xe4\xd2\xd9\x5a\xa5\xf5\x82\x6c\x28\x57\x09\xca\xcc\x4d\x51\x66\x57\x63\xcc\x23\xfb\xe4\xcd\x60\x5e\x76\x8d\x7a\x6e\x30\xff\x8e\xbd\xa1\xbd\xda\xfb\x57\xc1\x1f\x5e\xda\xfb\xc2\xdc\x9f\xff\xf1\x29\x0e\xed\x81\x3b\x92\x81\xc1\x09\x68\xb3\x2c\xd1\xb9\xa2\x6e\xc2\x2e\x9b\x9a\x74\x74\x03\xb6\x51\x71\xe9\x41\x95\xc6\x4e\x44\xbd\xbd\xf4\xd6\xff\x62\x7b\x6d\x16\x73\x89\x98\x2a\xc7\x5a\x9b\xa2\x54\xa8\x84\x21\xfb\xee\x0c\xfb\xfe\xd6\x43\x17\x1a\xbf\xf2\x3d\xf7\xa2\x87\x9a\x3f\xab\x6d\x9c\xce\xef\xdf\x7d\xfc\x7c\x0f\x70\x58\x73\x05\xaa\x74\x98\x30\x86\x65\x5a\xc0\x62\x9a\xcb\x30\x69\x5d\x1a\x1a\xc5\x48\x41\x64\x99\x77\x10\xc5\x2a\x4e\x75\x9e\x29\xac\x7d\x0e\x26\x10\x21\x3b\xf4\x27\x11\xbc\x0b\xfe\x63\xf0\x7f\x06\x01\x78\xd1\xb8\xb4\x37\x2f\x3d\x92\xc7\xed\xd9\xd3\xd7\x1f\x5e\x83\xaf\x88\x51\xb7\x87\xc6\xe6\x4c\xed\x8f\x91\xfd\x59\x09\x50\x55\x85\xb5\x31\xc6\x68\x90\x10\x79\xa9\x15\x96\x84\x62\x56\x81\x14\x66\x79\x96\xa1\x2c\x2f\x60\x59\x14\x79\x01\x8b\xa2\xc8\x61\x96\x43\x84\x0a\x58\xd2\xbc\x80\xb4\x38\x8c\x8c\x73\xce\x99\xe0\x62\x25\xae\x6f\x1a\x50\x84\x3c\x47\x0c\x66\x44\x00\x81\xcb\x3c\xcb\x71\x9e\xe5\x39\xde\x3e\x0a\x67\x79\xe9\x26\x5c\x16\x10\xa3\x22\xc3\x30\x4f\x09\x2e\x83\xf0\xd0\x5e\xf9\x4e\xf6\xce\xfa\x2b\x17\xcf\x0b\x2d\xdb\xe8\xed\xc7\x0f\xe7\x1f\xde\x7c\xfe\xf4\xf9\xd8\xeb\x3d\x5a\xca\x1b\x5a\x51\xcb\x44\x4d\x5a\x26\x4b\x38\x66\x05\xcb\x71\x76\x92\x6e\x50\x0f\x81\x2b\x5d\x2b\x95\x94\x52\x33\xc9\xf4\x0c\x8c\x52\xae\x6b\x70\x33\xf9\xdc\x05\xbb\x62\xbc\x53\x8f\x7a\xbf\x36\xb5\x84\xe0\x51\x58\xdc\x5f\xef\xfe\xbc\x45\x24\x87\xc5\xeb\xf2\x82\xb6\x74\xb3\x59\xf8\x62\x6a\x37\x50\x90\x34\x2d\x26\xa0\x40\xb0\xee\x8a\x93\xd8\xfe\x66\xbb\xa0\x90\x4a\xa9\x4a\x68\x66\x26\xa0\x8c\x71\x5d\x37\x83\x64\xf3\xa7\xe8\xb5\xc6\xf8\x9b\xe3\x0b\xfd\xf5\x7e\xfa\x23\xf8\xf4\xea\xa8\x8d\x6f\xa0\x28\xb3\x9e\x37\xbc\xe6\x64\x21\xbd\x34\x25\x05\x49\x96\x41\xa8\xb6\x01\x8e\xe6\x21\x70\xc8\x5f\x4f\x4a\xa9\x14\x35\x20\x00\x5c\xeb\xc1\xf0\x11\x04\xc1\x29\xa8\x1f\xd0\x81\x7c\x73\x3e\xdd\xdd\xff\xf8\x1b\x5b\xfd\xfa\x90\xf9\xf8\xed\xe6\x39\xe4\xae\x4b\x00\x71\x5d\x8e\x93\x2c\x91\x99\x80\x5d\xe1\x3a\xc1\xf2\xc6\x62\x1b\x42\x37\x24\x6e\x09\x47\xb3\x76\xc6\x84\xe5\xda\x6d\x2f\xbf\xcf\x4b\x81\xa9\x2a\xa6\x5a\x57\x79\x2e\x61\x81\x22\x2e\x94\x72\xb2\x84\xc2\xa5\x97\x89\xd0\xc8\x93\x07\xa0\x1d\xeb\xe0\xf5\x65\xe9\xb1\xf0\x11\xd9\xa7\x6b\x95\xf3\xed\x33\x6e\x64\x4f\x85\xf9\xcb\xfb\xe8\xfe\xd3\xe7\xfb\x9f\xc0\xf7\x0b\x86\x1f\x5e\x1f\xd2\x3c\x0d\xeb\x19\x96\xa0\xb5\xbf\x4a\x0b\xda\x12\x4f\x61\x97\x66\x02\x4c\x65\xb1\x42\x18\xf5\x42\x78\x30\x15\x71\xd8\x3a\x6c\x42\x64\x8f\x05\xc4\x4a\x10\x37\x6c\x0e\x0f\x63\xaa\xcc\x1d\x62\x8c\x39\xe8\xf4\x9e\xc2\xee\x3c\xd5\x3c\x09\x0b\x7d\xd5\xc4\x3f\x04\xbe\x56\xfc\xe9\x79\xa5\x38\x7a\xc2\xde\xbf\xfd\xf8\xf6\xf5\xf7\xc5\x48\xf7\x9d\xf9\xcb\xfb\x10\x96\x29\x60\x17\x03\x68\x96\x63\x52\x5a\x98\xeb\x14\x4f\x6a\x02\x88\xb1\x34\xcf\xca\x0c\x35\xaa\xd6\x00\xba\x59\x8d\x05\x3c\x49\xca\x95\x22\xc8\x35\x42\x09\x5d\x40\xe3\x9a\x6e\x72\xd0\xe3\xc8\x11\x48\x36\x87\xde\xc5\xa1\x9c\x3a\x80\xa8\xef\x71\xf4\x5a\xea\xd2\x6b\x25\xee\xc8\x80\x47\x7a\x89\x97\x59\xdb\x1d\x36\x0d\x3e\xee\xa2\xb6\xff\x0e\xbc\xdf\x0b\x02\xfb\x6c\x86\x1a\xcc\x79\x69\x51\x11\x66\x5f\xca\xc3\x6c\x2f\xb9\x01\xb0\x40\x92\x41\x50\xd0\xcc\x66\xc4\x29\x03\x06\x8c\x55\x26\x73\xd7\x19\xd7\xd9\x63\x8f\xca\x92\x50\xe3\x26\xd7\xd6\x35\x80\x18\x23\x2e\x14\x2d\x30\x73\xbc\x6d\x5d\x8e\x89\x2e\x40\xb9\xc2\xb0\xdd\xcc\x0d\x82\x28\x12\xbe\xae\xfd\x5f\xb1\xf3\xc3\x33\xe8\xf0\x33\x3b\xff\x1e\x3c\x4d\x6a\x64\x81\xc8\x0a\x03\x33\x60\x2f\x30\x9a\xf4\x9a\x9a\x25\x2b\x04\x2c\xc6\x32\x37\x59\xe9\x1a\x03\x18\x46\x38\x23\x69\x6f\x7a\x73\xec\x7c\xe3\x9e\xde\x6c\x6c\x9a\xab\x8d\x44\x17\x94\xec\x36\x12\xac\xe2\x24\x7b\x6e\xe5\xee\x5f\xd4\x3e\x97\xb7\xe7\x14\xf7\x2c\xc0\xfd\xad\xd3\x1e\x18\x45\x0c\x56\x16\xd4\x15\xe3\xad\x70\xd3\x49\xd8\x9a\xd4\xd6\xc5\x17\xda\x50\x63\x58\x24\xaf\x9f\x11\xf6\xbf\xf9\x19\x5a\x62\x83\xa4\x01\x96\x51\xa2\x85\x5b\x9e\x3e\x43\x6b\x52\xed\x9f\x11\x85\xe2\x5a\xd7\x79\x13\xfc\x7b\x1f\x19\x3c\x63\xf9\xf9\xf4\xf9\x19\x35\xdf\x9b\x97\x40\x95\x5d\x6b\xe6\xc3\x6b\xf0\xac\x04\xf4\xf6\xe3\x87\xbb\x83\xb6\x61\xbc\x2e\x21\x2c\x90\x28\xb2\xcb\x58\x2b\x8a\x00\x07\x63\xe2\x6a\x28\x9a\x32\xd6\x31\x77\xf3\xc0\xfa\x64\x54\x60\x59\x6d\xd8\xaf\x45\x28\x2e\xb3\x52\x27\x41\x15\x95\x9c\x41\x84\xd6\xde\x15\xce\xe2\x01\xe0\x39\x94\x6e\x92\x19\x4c\xd3\x42\x14\x86\x94\x88\x24\x22\xb5\xc6\x61\xa5\x95\x51\x20\x53\x20\x0d\x82\xd3\x21\xf5\x71\x25\xbd\x62\x4d\xdf\xec\xf9\xab\x9d\x6f\x75\xc7\x9a\xbe\xdf\x23\xc9\xeb\x0c\xfd\x66\xdf\xd9\xb9\xc0\xae\x76\x69\x01\x34\x28\x35\x44\x12\xcf\x3e\xb2\x94\xb8\xd0\x39\x4e\xc3\x42\xf7\x3d\x92\x04\xa7\x94\x96\x6b\xbf\xe0\xdc\xe4\xe8\x44\xb5\x48\x0d\x2b\xe6\x0a\xb5\xc2\xb4\x45\x6b\x53\xdd\x14\x8d\x71\xa9\x31\x7a\x6d\x39\x4e\x4d\x86\xc2\x9c\xe8\xba\x6c\x4c\x70\xe5\x68\xb5\x57\x8e\xd6\x3f\x5e\x99\x74\x7e\x8b\xa3\xf5\x39\x45\xeb\x4f\x1f\xee\xc0\xa7\xff\x04\xae\x04\xad\xa5\x5b\x06\xed\xa0\x1e\x1e\x02\xd0\xa0\x06\xb4\x02\x21\x59\x02\x91\x16\x0e\x22\xe4\xf3\x13\x50\xb7\xbf\x12\xc6\x8e\x55\xdb\xb6\xed\x45\x36\x25\x03\xb6\x77\x53\x55\x84\xd4\xc9\x3c\x01\x8d\x4b\x44\xd5\x7f\x19\xec\x8e\x9f\xc8\x1e\xe0\xb9\x8c\xd2\xab\x56\x4b\xf0\xcd\x69\x78\x4b\x3b\x9e\x4b\x4a\x4b\x9a\xd1\x12\xba\xcc\x84\x62\x2f\x11\x46\xe9\x65\xa6\x2c\x36\x09\xc3\xae\x89\x06\xb7\x48\xf9\x10\x6c\x0b\x1d\x44\xe3\x55\x2b\xee\xbf\xbf\xad\x50\x5f\xc8\xb9\x61\x88\x3e\xfd\x67\xf0\x26\x3c\x7a\x8c\x7e\x2f\xb1\x4e\x33\xd7\x38\x91\xb7\x95\xb1\x59\xa7\x34\xd3\x9a\x5b\x3d\xb8\x6e\x6c\xb3\xfc\x30\xd9\x16\x22\x48\x4a\xc9\x4d\x96\x2a\x35\xe6\x2d\x4f\xb2\xba\x70\xf3\x98\x17\x65\x79\xc3\x3a\x98\x48\xfb\xb9\xfd\x93\xef\x22\x08\x80\x6f\xcc\x7c\xe2\x26\xfa\x3b\xf0\xf1\xed\xf6\x3b\xdf\x59\xee\xeb\xa4\xbe\x4c\xf6\xe3\x87\xed\x97\xe1\xb4\xca\x73\xb1\xd2\x30\xb6\x5f\x4a\x0b\x66\x3d\x8e\x2e\x3b\x74\xce\x60\x3c\x17\xae\x29\x86\xc2\xf5\xdb\x8f\xc5\x85\x1f\xba\x2f\x65\x14\x2b\xc5\x2f\x35\xc6\x11\xe6\xeb\x44\xca\x92\xf6\xb9\xc8\x28\xa5\x30\x73\x94\x7a\xbc\x24\x3c\x54\xd1\xf4\x78\xaf\x7d\x27\xd0\xab\x17\xf6\xec\xf7\x1a\x78\x3e\xde\x1d\x9d\xfd\xee\xf5\x8f\x7f\x07\x3e\x1e\xaf\xbc\x7b\xfc\x50\x3a\x0b\x52\xbd\x52\x05\x72\x67\x43\xc4\xdc\x18\x5a\x85\x10\xcf\x2a\x1c\xa6\x39\x5d\x29\xcf\x74\x68\x57\x1a\x4d\x52\x5c\x48\x09\xa3\x5a\x08\x21\xd6\x45\x94\x50\x8f\x94\x8e\x3c\xd3\x1d\x92\xab\xdd\xeb\x2b\x3b\x8f\xc6\x49\xee\x7d\x77\x4f\x39\xde\x5f\x3e\x7e\xf8\x71\x67\xa1\xf1\x8e\x5c\xf4\xc3\x23\x17\xcd\x77\xf3\xbc\x3b\xad\x55\x08\x13\x1b\x83\xda\xd1\x24\xe7\xc8\x40\xac\x71\x91\x65\xb1\x4a\x19\x56\x94\x6b\x52\x73\x9c\x7e\xc9\xc0\xe2\xf0\x29\xa6\xd0\x96\x64\xcf\xf4\xb6\xc3\xd8\x68\x57\xbb\xb1\x07\x45\x39\xb7\x0f\xc1\x43\xa0\x54\xf6\x10\x58\x90\x4a\x2e\xb5\x05\x04\x0c\x5a\xcf\x42\x21\xe3\xe3\xfc\xf0\x10\x3c\xe0\x33\x3f\x89\x2b\xf3\x88\xaf\xeb\x87\xc7\xdb\x14\x9e\xce\x2f\xa1\x69\x5b\xec\x7f\x64\x36\xcd\x81\xad\x5d\x0b\x16\xeb\xa4\x85\xb0\x00\x4b\xeb\x7a\x46\x20\x45\x38\x2f\xd8\x4c\xbd\x2c\x9c\xc8\x08\xd6\xae\x98\x2e\x13\x63\x61\x95\xa5\xaa\x0d\x53\x5b\x22\x81\x60\x99\x8b\xf9\x4b\xe1\x31\xcc\x87\x03\xf6\xcf\xbe\x27\xcc\xca\x76\x4a\x3e\xe9\x9c\xff\x3d\xb8\x81\xf7\xbe\xf1\x72\xb0\x05\xc9\x4c\xdd\xe4\x9a\x0c\xcd\x2c\x8f\x6d\x52\x39\x6d\x59\xb8\x58\x87\xad\xf5\x8c\x57\xb5\xc3\x27\x31\x23\xa6\x38\x96\x79\x9a\x52\x5d\x2c\x02\x52\x37\x5e\x0a\xce\xa3\xde\x99\x61\x6d\x87\xeb\xb9\x71\x48\xfe\x1b\xb8\x9d\x1f\x8f\x8e\xca\xf5\x8b\x59\x67\x3d\xb9\x11\x2c\x64\x08\x93\x58\x23\xa2\x11\xa8\xb3\x24\x8f\xd7\x99\x90\x30\x59\xe7\x13\x34\xcd\x7e\x7a\x34\x4d\xd3\x5c\x64\x8d\x38\x50\x9d\x9b\xeb\x32\xc4\xce\x94\x31\xa8\x5c\x2a\x6d\xf7\x65\xb4\x9b\x6d\x3c\x9c\xcf\xe6\x54\x05\x7f\x11\xfc\x10\xa4\xc1\x5f\x07\xff\x25\xf8\x3f\xae\x7d\x1e\x5e\x14\xe8\xfd\xf9\xfd\xa7\xe3\xe6\x62\x9d\x3f\x6f\x87\x30\xd8\xf3\x49\x6f\xef\xde\xde\x78\x09\x7c\x6f\xc0\x95\x09\xf1\xb9\xd2\xe7\x7e\x5e\x4c\x3c\x0f\xe3\x61\xcd\x4b\x4e\x49\x81\x67\x20\x14\x76\x86\xf4\x1a\x33\x8c\x2e\xc4\x80\xc0\x18\x9b\x8d\xa4\x4e\x1b\x30\x39\x16\x8a\x28\x91\x6d\x0b\x09\xc6\x19\xc1\xc5\x65\x06\x09\x43\x18\xb3\x53\x55\xe6\xdc\xcd\x58\xc6\x09\xc9\x04\xae\x0a\x58\xca\x0c\xc1\xa2\x04\xe9\x3c\x5f\x14\x28\x46\xcc\x0b\xad\x68\xab\xb5\x80\x14\xa7\x2a\x45\x59\x02\x4b\x82\xe0\x75\x0d\x86\xe3\x99\x9f\x68\x70\xe7\x6b\x0e\xaf\x1f\xd1\x65\xf7\xa7\x1d\x5d\xf6\x7d\x41\xd5\x53\x53\xa8\x0a\x21\x37\x26\x35\xa1\x30\x4e\x6b\x83\x8b\x75\x09\x1b\x88\x15\x27\x5a\x57\x13\xb6\x82\xb1\x13\x55\x58\x62\x5c\x36\x25\xc9\x99\x5a\xa7\xed\x3c\xe3\x8c\xc1\xa2\x64\xb0\x20\xb9\x4c\xf3\x2c\x7d\x3a\xdf\xd2\x7f\xfe\xf9\x36\xaf\xe2\x5c\xac\x24\x4c\xec\x97\x42\x83\x59\xce\xb3\xcb\x0e\xbd\xd3\x08\x2d\xdb\xf9\x36\x16\xae\xdd\x7e\xcc\x2f\xe2\xd0\x7f\x29\x42\x2b\x04\x5d\x63\x84\xc2\x85\xba\x0c\x15\x25\xa9\x0b\x91\x62\x42\x60\xea\x34\xb9\xd9\x13\x76\x7f\xae\x3d\xf7\xff\x04\x7b\x1e\x82\xc2\xb5\x45\x07\x5d\xf7\xdc\x20\x2c\x04\x5a\x61\x59\x86\x2d\x72\xa4\x2c\x0a\x6c\x73\x9e\x20\x8c\x8b\xcc\xd5\x68\xaf\xc3\xc8\x08\x9d\xc5\x49\x7b\x9f\xe8\xb5\xc7\x72\xbf\xbf\xb2\xd4\x79\x7f\xe0\xdd\x87\x5b\x05\x06\x3c\xe3\xa2\x78\xb7\x63\x3c\x76\x27\xe0\xb7\x97\xe2\x69\x86\x8e\xad\x4d\x01\xa6\x35\x37\xa6\x6e\xe1\x76\x7a\x11\xa8\x4a\x72\xec\x64\x51\xf2\xd2\x8d\x45\x2a\xd3\xa2\xf5\x05\x19\x1e\x05\x7a\x9a\x20\xc3\x28\xc5\xa8\x58\x03\x40\x70\x21\x0b\x74\xd2\x9c\x24\x12\x5e\x86\x99\x21\x45\x18\xa0\xd2\x40\x2b\x92\x9c\xc1\x12\xc7\x10\x17\x18\xa5\x10\xe7\x18\x56\x65\x29\x18\x41\xb1\x4c\x10\x4a\x31\x41\x04\xef\xba\xb9\x0f\xe8\xac\x8f\x41\xf0\xa3\x67\x39\xdb\xfb\xd0\xfc\x89\x18\xf8\x8e\xb3\xc7\xc5\xb7\x0d\x74\xaf\x8d\x5f\x85\x2c\xbf\x69\x46\xf3\xe4\xc1\xfb\x16\x2b\x3c\x6a\xc1\x99\x15\xa3\x10\x03\xb8\xce\xb0\x50\x59\x81\x30\x9f\x5c\xae\x75\x55\xc3\xb1\x59\x18\xd2\x88\x85\x34\x4a\x7d\xf3\x0e\x51\x8c\xe4\x8c\x15\xf9\x65\x02\x88\x96\xba\x24\xc7\x20\xcb\x73\xe9\x04\x91\x18\x24\x84\x20\x04\x61\xc9\x4c\xf5\xab\x00\x1d\x27\x96\xaa\x50\xd4\x1d\xec\xab\x75\x19\x06\xed\x1a\x41\x62\x9b\x64\x10\x64\x25\x13\x44\x3c\xe6\x41\xd1\x59\x87\x28\xf8\xd1\x6b\xd9\x5f\x51\xbc\x3f\xdd\x90\x36\x9f\xef\x79\x94\xa7\x89\x8d\xd3\x08\xaf\x45\x17\xc6\x78\xad\xa7\x7a\x25\x28\x2c\xea\x35\x07\x35\xc2\x29\x2a\xf5\x48\xac\x02\xd8\x59\x66\xf0\xe8\xd7\x03\x58\xce\xcc\xf7\x9e\x3d\xad\x87\xff\xe4\xb9\xb8\x1e\x27\xc8\xaf\x8c\x9f\xef\x7f\x63\x3d\x44\xdf\xac\x87\x4f\x8f\x0b\x22\xcc\xad\xad\xba\x72\x6a\x0f\x1d\x73\x7c\xd5\x30\x94\x5f\xb4\x44\x1a\xf1\x53\xa0\x11\x55\xcc\x75\x28\x37\x19\x5c\x68\x29\x0b\x52\x86\xb3\xe9\x7b\xc4\x28\xc9\x28\x4d\xd3\x35\x01\x01\x27\x8c\xf0\x93\xf8\x62\x01\x13\xd4\x32\x11\x62\x4e\x72\x99\x6b\x4b\xac\x4e\x4a\xcb\x90\x40\x5c\xe5\x8a\xc7\x5c\x60\xe9\x19\x70\xd5\xc4\xb6\xc3\x29\x2b\xdb\x94\x52\x26\x68\x10\x00\xd0\x04\xed\x09\x1d\xfd\xbc\xdd\xb8\xf6\xae\x9c\xae\x57\x84\x52\x07\x46\x13\xc6\xeb\x14\xa7\x20\x07\x09\x7b\x08\xdc\x6c\xdc\x48\x81\x46\xae\x3c\x64\x20\x77\x83\x81\xb0\x59\xf4\xd2\xb8\xb9\x52\x33\xc0\x3b\xff\x65\x72\x68\x4e\xe3\x09\x5f\x35\x46\x7f\xff\x98\x0d\xf7\x5d\x2b\xdb\x29\x0e\x92\x63\xff\x6b\xe1\x29\xa6\x41\x0b\x72\x0d\x8a\x13\x76\x4c\x9a\xed\xcf\xf6\xef\xa3\xf9\x34\x9d\xe0\xd7\xff\xfe\xee\xdf\x82\xbb\x3d\xb5\x0d\x92\xe3\xf0\x6b\x6e\x7d\xe2\xa5\x01\xb9\x01\xd9\x09\xae\xb5\xf2\x25\x38\xff\xba\xd9\x91\xfd\x79\x9f\x93\xbb\x61\xfb\x1c\x0d\xf2\x13\x5c\x47\xf5\x94\xf3\x0f\x1e\xb5\xf5\x78\xd4\xdf\xb4\xa8\x3e\x7e\xc5\x5b\xf9\xd1\x13\x90\xab\x28\xab\xa2\xec\x32\x86\xd8\x5e\x12\x1b\x96\x97\x11\xa8\x68\xbe\x24\x51\x5e\x55\xa6\x5e\x19\x42\xa1\xa9\x57\xeb\xe5\xe0\x7d\x0c\x66\xc2\xc9\xf7\x85\xbe\x09\x82\x77\x3e\x4b\xb6\xcb\x0b\x7f\xd8\xbf\xff\x4f\x60\x73\x9e\x73\xd3\xcd\xb3\x59\x96\xd6\xcc\xa4\x8d\x04\x60\x9e\x80\xd6\x38\x73\xa9\x77\x30\xf5\xb5\xc7\x6e\x39\x0c\x27\x76\x55\x96\xde\xf3\x39\x4f\xc9\xb7\xfb\x8f\xf7\xaf\xee\xee\xef\x22\xe8\x11\xb9\xa3\x75\xb3\xdd\xdc\xff\x60\x70\xf3\x89\x39\xa3\x9d\x5e\x11\xa9\xa2\x18\x70\x7d\xc9\x01\x72\x8d\xcf\x49\xf1\xc7\xbe\xd5\x37\xcf\x19\xa9\x6f\x63\xde\x49\xd7\x23\x0e\x5a\xaf\x55\x0d\xb8\x5d\x07\x0b\x88\x83\x20\x0e\xf3\x75\x38\x4c\x40\x3b\xae\x1d\xbf\x48\xa5\x22\x09\xf4\x25\x01\x9d\xdf\xab\x2a\xe4\xde\x27\xbb\x7f\x16\x33\xfa\x4e\xb4\xed\xbf\x2b\x71\xd3\xe7\x6b\xab\xe7\x7d\x34\x59\x9f\xc6\x99\xd6\xd4\x5e\x6c\x44\xd7\x2a\x13\xd4\x29\x30\xc1\xc2\xe0\xa8\xfd\x32\x12\x0a\xf4\x61\x11\x4a\x29\xdf\x92\x43\x98\xc2\x34\xd3\x8a\xe3\x47\xad\x61\x72\x12\xc1\xcf\xcf\xcf\x85\xf0\x7c\x2b\x2d\x5c\x65\x1b\xf7\xa6\xc7\xf7\x9f\x5e\xbd\x65\x20\xc8\x33\x9d\x66\x00\x3a\x8d\xf9\xa8\xbb\xae\x49\x29\xd7\x4e\x67\x43\xe3\x74\x26\x48\x7f\x14\x42\x65\x82\x19\xb7\xb4\x5e\x5e\x65\x29\x74\x96\x3a\x04\x0c\xb4\x59\x06\x12\xd5\x81\x20\x38\x45\xe9\x43\x76\xae\xaf\x1a\xb0\x7b\x3d\xe8\x97\x67\x15\xa1\xbd\x13\xd9\x5f\xfa\x7b\x6d\xd2\xfd\xb6\x88\x7c\x73\xb6\xeb\x0e\x50\x37\x29\x63\xda\x29\x47\xd2\xda\x80\xe2\xd6\xb3\x0d\xe2\xc9\x25\xa7\xd2\x15\xb2\x77\x48\xad\x28\x91\x49\xec\x26\x10\xe7\x99\x4e\xc2\xc5\x5a\x87\x8c\x2b\x92\xd4\xf7\x18\x80\xa8\x8a\xe4\x59\x9e\x58\xf0\xbb\x47\xa6\xe1\x6d\x26\x0e\x03\x66\xa2\xc1\x36\xcd\x42\x76\xe8\x3a\xc9\x41\x00\x44\xce\xb9\xf1\xff\x66\x7a\x40\x67\x72\x40\x3e\xa6\xfb\xf0\xea\x43\xf4\x4c\xf5\xfa\xd3\xdd\x7d\x08\xb6\xf9\x3a\xa4\x4b\x62\x13\x50\xc5\xbc\x22\x3c\x11\x04\xa6\x85\x9b\x73\x37\xc9\x25\x9b\xa2\x7c\xdb\x9d\x6b\xfe\x10\xa4\x26\x25\x1d\xd0\x6b\xe7\x26\xbe\x80\x29\x08\x43\xfb\x40\xce\xfa\x94\x05\x47\xbf\xb6\xf6\x0a\xcf\xfd\xdd\x1f\xc0\xbf\x05\xe7\xfb\x3f\xfd\xf2\xfe\xfc\xcb\x36\x2b\x91\x84\x5b\x10\x0d\x12\xd4\x03\x04\x4a\xe8\xc4\x38\xa0\xb6\x28\x7b\x75\xca\x74\x55\xd4\x6a\xed\x2e\x3d\x86\x96\xf2\x1e\x23\x19\x36\x41\x74\x28\x02\x7a\x66\x27\x7e\xd3\x85\xba\xad\xda\x97\x9c\x18\x6f\xc1\x33\xfe\xd8\x03\x07\xa9\xd9\xb6\x7f\xab\x28\x17\x86\x2a\xde\xf1\x25\xc4\x7a\xf3\xe5\x5d\x46\x0a\x59\x90\x43\x1c\xb2\xd5\x28\xd9\x54\xba\x56\x2e\x0d\xd3\xa1\x56\x03\x28\x42\x5a\xf4\x06\x55\x56\x5b\x6c\xf5\xee\xd3\x84\xb5\xcf\xc5\xfd\x45\x70\xe7\xef\xfa\x8d\x3b\xfc\xc3\xeb\xfb\x5b\x5b\xce\xf1\x19\xcb\x21\x1b\x7d\xaa\xa8\xdd\xfc\x82\x6b\xc7\x2c\x98\x75\x6f\x4c\xdf\x1f\x35\x25\x25\x97\xc6\x6a\xab\xed\x8a\x19\x0b\x37\x8f\x3f\xf3\x35\xb2\xe0\xba\x2f\xff\xfd\xad\x8b\xeb\x91\x2a\xfe\x2b\xa9\xd1\x47\xdd\x6f\xbf\xba\xb6\xdb\x1e\x21\x93\x15\x8b\xf5\x85\xbf\xd2\xc9\x2c\x86\x0c\x26\x26\x13\x4d\x45\x1e\x82\x64\x98\xc4\xd0\xa6\xce\x84\xd0\xf5\x88\xaa\xee\x04\x0b\xc1\x01\x76\xb5\x71\xb5\x59\x55\x1e\xc7\x6c\x2a\xdd\xa4\x31\x0d\xf5\x16\x6d\x6b\x29\x01\xda\x66\x6f\x73\x45\xb7\x53\x6d\xdb\x6f\xf0\x5c\x45\xc3\xde\x5b\xfc\x69\xcf\x91\x5d\x4d\x3a\x5f\x6d\x0a\x37\x77\x23\xf8\x7c\x3f\x80\x29\x36\xa1\xca\x21\x87\xb1\x4d\x50\x39\x54\xd8\xc5\xb9\x1b\x5c\x47\x41\x0a\xe2\xdc\xe5\x51\x42\x59\xb7\x96\x79\xc6\x97\xc2\x8d\x14\x6f\x4e\x84\xeb\x9c\x94\x4a\x00\xb8\xec\x9a\x98\x87\xd4\xc7\x57\xaf\xbe\x52\x73\xba\xf6\xb6\x0a\x30\xda\x30\xf6\xaa\xd8\x76\x5d\xac\xcb\x8e\x72\x59\x96\x45\x0f\xc3\x30\xf8\x3c\xaf\xda\xe2\xc3\x70\xbe\x3e\xdf\x1f\x4f\xf6\xaf\x5c\x9d\x37\xe1\xf9\xfd\xcf\x7e\xb9\xbc\x53\x51\x69\xa3\xe4\x32\x13\x89\x60\x86\x50\x9e\x5f\x3a\xd0\xe8\x7e\x94\x20\x88\xe6\x69\x94\x9d\x5b\x42\x2e\xa5\x71\x58\xd0\xd8\xc6\x19\x04\x0a\x63\xb7\x68\x5e\x37\xba\x95\x6d\xf3\x38\x47\x49\xf0\x87\x6f\xe6\x68\x27\xb4\xfb\xad\x29\x12\xe3\xcb\x19\xca\x5c\x11\x4a\x84\xf4\xda\xe6\x19\xb2\xf9\x20\x11\x07\xfd\x43\xe0\x5a\xa6\x28\x08\x5a\x5f\xd7\x25\x0f\xe8\x54\x85\xf6\xf1\xe9\xf7\x55\x98\x79\xaa\xec\x97\xd9\xda\x1b\xb2\x34\xb4\x97\x8a\xd2\x88\xb8\xae\x72\x79\xe5\xef\x67\xd8\x78\x5e\x90\x3f\x6e\x67\xc0\x8f\xe7\x6f\x2c\x3d\x05\xc7\xf7\x7f\x0d\x76\xd5\x86\xde\xc4\xa1\xca\x0a\x89\x12\x13\xab\xd9\xa0\x97\x77\x13\x81\x3e\x3e\x09\xb2\x8d\x20\x83\xaa\x68\xc4\x16\x17\x4e\xae\x67\x92\x2c\xb5\xc1\x01\x38\xf4\x41\x75\xc6\xbe\x26\xb1\xd7\x7e\xef\x93\xf3\x93\x84\xfd\xdb\x6b\x5f\x41\xa2\x35\xc8\x8a\x5c\x15\x45\x06\x61\x9e\xa9\x78\xe2\x6d\xac\x8e\x64\xdb\xc1\x17\xdb\x98\x44\xc7\x75\xd8\xaf\xa9\xeb\x19\x48\x42\xbb\xed\x97\xe4\x9a\xb7\xf8\xc3\x7e\x8e\x5d\x47\xe1\xa5\x44\xc2\xfb\x6c\x8b\x77\xb7\x6d\xf2\xc3\xab\xb7\xa1\x15\xb1\x8e\x41\x02\x35\x28\x61\x62\x52\xc8\x9c\x7d\x08\xa8\x4c\x95\x14\x53\xca\x8f\x09\xe0\x5d\xf5\x45\x90\xa2\x90\xb9\x90\x29\xb5\x87\x60\x1d\xd6\xae\x67\x40\x45\x70\xf7\x43\xbd\xa6\xea\x21\xf3\x3a\x45\xdf\xa0\x89\x3e\x7d\xdc\x61\x44\x40\x1f\x86\x75\x8a\xd2\xcb\x44\x04\x67\x19\xe7\x79\x76\x19\xa3\x6c\x1d\x0f\x99\x71\xa3\x5f\x3a\x89\x77\x71\x95\xf1\x5b\x3e\x00\x01\x7f\xa0\x67\x76\x30\x3b\x3a\xe1\x70\xbc\x7b\xf7\xe6\xe8\x07\xf1\xf9\xd3\xc7\x6d\x67\xf9\x61\x1c\xdf\xbf\xbb\x3b\xbe\xff\xf9\x94\x23\xd7\xbb\x2a\xe2\xc9\x45\x92\x0e\xe0\xa2\xac\x12\x4a\x1c\x73\xa3\x5d\x61\x1a\x0e\xae\x28\xc3\xea\x60\x14\x2c\x5d\x47\x2c\x75\x32\xcb\x8a\x72\x28\xdc\x00\x21\x22\xa0\x42\x76\x3b\x6a\xed\x75\x3c\xbe\xef\xe6\x60\x3c\xdf\xd3\xf3\xfb\xff\xd5\x6e\xf6\x3a\xe6\xe1\x68\xe3\x50\xa4\x85\x40\x71\x15\x63\x38\x19\xe8\xd2\xdc\xf5\x6e\x64\x20\xd9\x57\x40\x17\x1f\x8c\xd5\x97\xbe\xc8\xe8\x5c\xb8\x99\x62\xcc\xc3\xce\x35\x0e\x29\x25\x01\x03\xa9\xd1\xdb\x35\xc7\x07\x74\x4e\x22\x14\x24\xdb\x58\xaf\xba\x36\xc1\x2b\xdf\xc7\x1d\x44\xb8\x7a\x08\x1e\x02\xd0\x80\x91\x71\x03\xe2\xa6\xe2\x6b\xbd\xb2\x02\xf0\x08\x15\xeb\xd0\x67\x4c\x0a\xe4\x66\xd7\xa0\x4e\xe4\x76\xf3\xde\xb6\x35\x9c\xfd\x57\xd7\xf0\x6d\xb7\x6d\x43\xe8\xac\x5f\xc3\x02\x25\xf6\x71\x0d\xf7\x6e\x60\x20\x05\x41\xee\x30\xe8\xe2\x93\xe0\x6c\x35\x45\x86\xeb\x62\xd4\x98\x87\x81\x5b\x9c\x11\x8a\x81\x6c\x30\x6c\x3f\x9f\x83\xe9\x9c\x1d\x26\xdf\x55\xf2\xb2\x27\x63\x57\xef\x28\x0f\xcd\x3a\x6f\x2e\x53\x08\x7f\x1d\xc3\xd2\x95\xa0\x73\xc1\x61\xf2\x40\x91\x41\x6b\xef\x84\x06\x41\x08\x96\x60\x3e\x17\xfe\x73\xfe\xf2\xfb\x9f\x74\x55\x20\x29\x0e\xdd\x3a\xf9\x23\x1d\xff\xda\x85\xd0\x15\xa0\x5f\x97\x48\x13\x44\x31\xd9\x3e\x76\xd1\xae\x33\x06\x94\x1a\xc4\x0e\x95\x48\xe0\x72\xc7\x25\xa1\x40\x9e\xe4\x31\x79\xec\x81\xd9\xbd\x3c\x5f\x71\x79\xf5\x15\x86\x3e\x44\x87\xd2\x95\xd6\xed\x54\x79\x60\x00\xe5\x65\xbe\x7d\x77\x4c\x2e\x9d\xab\x00\xf1\x8c\x9e\xeb\xd4\xb6\x6d\x70\x04\x55\x40\x0f\xec\xc8\x5e\xf0\x41\xdf\xce\xe6\x0f\x77\x6f\x9f\x79\x7c\x3e\xfb\xf4\x35\x71\x17\xa8\x41\xa2\x36\xef\x61\x59\x36\x2f\x5c\xb9\x09\xa4\xcb\xe2\x66\x23\x04\x08\xb8\xd3\xfe\xcb\x31\x60\x4c\xd2\x75\x60\xb2\xae\x25\x0b\x73\x4f\x48\x4f\x5d\xcf\x18\xdb\xf9\x38\x03\x7c\xb6\x47\xee\xf3\xc7\x3b\xa0\xe4\xf6\x78\xbc\xde\xf9\xb7\x57\x1f\xa6\x12\x1a\xa4\x71\x1c\xa7\x49\xac\x13\x24\x58\x29\x13\xb7\xb0\x31\x11\x07\xba\x5d\xfd\xd2\x97\x71\x5c\x88\xbc\x22\x90\x86\xfd\x2a\x1e\x02\x36\x86\x7e\x7f\x9c\x40\x13\xa0\x73\x72\x9c\xae\xf3\xf7\xc7\xe0\xbd\x47\x6c\x7e\x78\x7d\xed\x90\xdb\x29\x09\x8e\x57\x08\xcb\x8d\x29\xec\xf8\xe6\xb4\x85\x8d\x57\x3e\x8b\x43\x6a\x7c\x46\x94\xfe\x5a\x85\xd4\x21\xd0\xb8\xc1\x47\x23\xad\x7f\xaf\xcd\x5a\x58\xd0\xe9\xdc\x8d\xae\x81\xa0\x9c\x40\x3c\x0e\xbc\x5d\x8e\x53\xed\x3a\xa2\x14\x01\x65\x47\x08\x71\x81\x93\x9e\x1d\x5b\xea\xb4\x1f\x73\x9e\xd7\x19\x62\x7c\x9b\x08\x00\xea\x40\x9c\xba\x23\xf7\xfe\xf6\x9b\xf3\xb3\x53\xf5\xf3\x27\x3f\x05\x3f\xbf\xf2\x44\x29\xaf\x7c\x52\x2d\x4a\x0d\x8a\x28\x2c\x07\x22\xb2\x0a\xf1\x2c\xaf\xd0\x2a\x69\x48\x4a\x63\x9d\xa6\x00\xea\x8a\x2b\x36\x1f\x79\x56\xad\x79\x63\x33\x93\x71\x0b\x96\x95\xbb\x45\xcd\x61\xe6\xd8\xc8\x3b\x00\x35\x63\xed\xf5\xdc\x6d\x3d\x6f\xb9\x8f\x48\xee\x5e\x08\xe0\x7f\xbc\xbb\xff\xf1\x9c\x04\x1e\x22\xec\x61\x8a\x16\x8c\x49\x4e\xcb\xd8\x24\xb0\x6c\x15\x72\x5d\xfc\x10\xcc\x6c\x18\x9d\x05\xec\x24\x1c\xff\x82\x8a\x94\x74\xf9\x8c\x11\x62\x07\x94\xc7\x2e\x5d\x9b\x4a\xe9\x30\x05\xc3\xde\x3b\xe4\x35\xe3\xdb\x13\x0f\xfe\xea\xe9\x7e\x6f\x67\xee\xf3\xbb\x1d\xbc\x7a\x7b\x08\x2a\x0d\x44\x9e\xe7\x26\x26\x46\xc0\x21\x76\x86\x03\x18\xdb\xc3\x04\x94\x13\x5f\x10\xc2\x7d\xbe\xe8\xed\x1a\x17\xba\xfd\x15\x8a\x70\x00\xbc\x4e\x0e\x3d\x25\x9b\x4f\x77\x3c\xef\xfa\x98\xf7\xd1\x7d\xf8\x6c\x2a\x5f\xdd\xbf\xda\xdc\xad\x08\xc7\xca\xc8\xd4\x46\x25\x02\x59\x4a\xe0\x90\x97\x39\x29\x78\x56\x64\xae\xc3\xae\x4b\xb5\xad\x63\xd1\x85\x59\xd8\x9b\xb5\x5e\xf3\xb1\x8e\x9b\x94\x99\x30\x0f\xf1\x1a\xaf\xf5\xb4\xeb\x94\xa1\x33\x8b\xb2\xe0\x5f\xfa\x9c\xe8\x36\x96\xa7\x7a\xd3\x0e\xad\x00\x3f\xbd\x3a\x87\xef\xa3\xce\x12\xc3\x48\xca\x38\x76\xa5\x51\xa3\x99\x0e\x55\x2b\x6b\xde\x44\xd9\x65\xe1\x34\xb5\x29\x0e\x93\xd2\x75\x23\x19\x41\x32\xb9\x09\x81\x6c\xdc\xce\x43\xea\xe3\xaf\x72\xdf\xef\x7e\x18\xcf\x00\x3e\xaf\x36\xc7\x3e\x08\xb9\x53\xc7\x94\x80\x26\xb7\x63\x89\x72\x06\x39\xcd\x5c\x4e\xd6\x81\xb9\x42\x80\xfa\x68\xac\xeb\x1c\xeb\xe3\x3a\xe5\x2d\x28\xb6\x38\x45\xfa\xb3\xd6\x63\xbd\xd4\x29\xf1\xf7\xe0\xc5\x04\xdd\xe6\xc7\xcf\x5d\x38\x45\x06\x03\x92\x11\xd4\x43\x92\x0b\x44\x69\xea\x2a\xe4\x74\x5a\xb5\xba\xd5\x69\x7b\x4a\xd6\x7a\x4d\xfb\x3a\xa9\xd3\x31\x44\x21\x5e\x93\xb5\x9a\x44\x1f\x16\x9b\x8f\x1f\x51\xdf\x97\x2f\x82\x37\x57\x44\xd9\x8d\xb7\xed\xc3\xcb\x32\xad\xef\xe1\xfb\x2d\x2c\x72\xb4\x6d\xc9\xd2\x10\x58\xda\xa2\x6c\xed\x1a\xdb\xae\x80\x0a\x97\xdc\x2d\xa1\x59\x80\x21\xb4\x80\x39\x2d\xd3\xc5\xcc\x16\x68\xbe\x85\xdc\x27\xe1\x46\xaf\x03\xe9\xea\xae\x03\x98\x52\x28\xd4\x9a\x6d\xe7\xb8\x76\x9a\xd0\xd8\xc4\xa8\xbd\xd5\xe6\x41\xd2\xed\x5c\x81\xc9\x03\xf4\x58\xe9\x7f\xc4\xd6\x57\xd7\x9e\xda\xef\x36\x12\x78\x5b\x03\x4b\x71\x51\x95\x70\x30\x97\xc6\xf4\x05\x52\xa4\x94\xb1\x9b\xc2\xd6\x2d\xa0\x26\x3b\xea\x38\xf3\x70\x32\x0b\x6a\x05\x8c\x63\xff\x1c\x7b\x03\x13\x4a\xcf\x97\x7b\xc5\x07\x3e\xda\x7b\xff\xa2\x54\xff\xe1\x16\xc9\x46\xd6\x2e\xb8\xac\x20\x04\xc2\xfe\x2a\x2c\xe0\x05\x54\xb4\x9c\x5c\x79\x80\x5f\x5a\xb3\xf9\xc9\x5f\x59\xc1\x28\x14\xda\xcd\xae\x54\xad\xc7\xa5\xb0\x07\x7e\x36\xc1\xf8\xd4\x87\xf9\xee\xa6\xf4\x72\x3d\x33\xb7\xd7\x69\x68\x97\xbe\xda\x73\x34\xf5\xd3\xfb\x38\x4b\x39\xcf\x42\x78\xa8\x4d\x10\x06\x3c\x0c\x0e\xa5\xef\x47\x7a\xc9\xa7\xf7\xf6\x74\xfe\xf0\x32\xc9\xf0\xf1\xc3\x55\xca\x14\x7c\xf8\xf4\xf9\xfe\xa7\x47\x8a\x10\xa1\xf2\xb4\x71\x9e\x7d\x6b\x27\xb1\x31\x6d\x9a\x7b\x91\x44\x50\xb6\x69\xe1\xda\xec\x94\x52\x2a\xa9\xa2\x85\xe2\xda\x18\xcd\x15\x42\x8a\x3a\x95\x8a\x5d\xb3\x3c\x5a\xc0\xf0\xac\x8f\x67\x67\x14\x0f\xbf\x66\x14\xff\xc1\x33\x8a\x1f\x53\x9d\xe6\x61\x26\x32\x23\x3b\x5c\x35\x7a\x60\xbd\xe6\x65\x01\xf9\xc0\x4a\x21\xd3\x93\x28\x30\x56\x6e\x68\x39\x31\xd8\x28\xa2\x91\xd4\x0d\x86\x04\x24\xe5\xa4\xed\x10\x9c\x83\x26\xdc\x62\x1f\x1d\xfc\x0b\xaf\x8b\xf9\x6f\x82\x7b\xaf\xbd\xf3\x0c\x25\xfb\xfe\xe9\x61\x7b\xb7\x3d\x61\x7d\x1e\x68\xaf\x19\xfa\x49\xb8\xe6\xb0\xfc\x9d\x3c\x18\x9d\x85\x6c\xc5\x25\x94\xa6\x7a\x08\xa6\x09\x04\x6b\x60\xfa\x7e\x7b\x34\xf5\x7d\x14\x80\xc2\x69\xc0\xf7\x1e\xda\x62\x4d\x34\xe8\x5d\x71\xd2\x05\x36\x04\x51\x23\x74\xe3\x68\xa3\x0f\x85\x6b\x1a\x97\x5b\x97\x37\x0d\x88\xa5\x12\x42\x49\xc7\xa5\x0e\x4e\x41\x1b\x42\xcf\xbb\xf0\xbb\xe0\x27\xdf\x3f\x77\xc5\x5f\x3c\xe2\x87\xdf\xdf\xb0\xf7\x3b\x8d\xc4\xde\x1e\xfb\xf1\xfe\xf5\x35\xd5\x4e\x6d\x56\x80\x71\x1d\x11\x91\x5d\xed\x6a\xdf\x64\x8f\x2e\xd4\xc7\xed\x21\x5a\x9b\xed\xeb\xa1\x31\xd4\x10\x73\x92\x85\x60\xc6\x72\x06\xb2\x45\x5b\x47\x2b\x7d\x88\x5d\x6f\x1d\xd2\x0e\x56\x15\x28\xab\x96\xb4\x55\x10\x04\xff\x32\xd0\xe1\x76\xa6\xa3\xc7\xdc\xe0\xab\xeb\xaa\x7f\xf7\xa8\x10\xb9\x2b\x11\x3d\xd1\xb5\x7d\xf5\xf3\x73\x1c\xc6\xce\xdb\xb2\xbf\x1f\x50\xd8\xad\xa5\xbc\xf5\xfb\x6f\xaf\x4b\x16\xf6\x6b\xa1\x9e\xff\x0a\x68\x8e\x05\xe2\xd1\xa2\xb0\x44\xca\x35\x92\x72\x2e\x2e\x83\xd8\xbe\x9c\xd0\x5a\x82\x85\xb8\x69\xfb\x1f\x58\x9e\xfd\x30\x61\x8a\x28\x46\x54\x20\x4e\x11\x54\x90\x22\xea\xdf\x83\xdf\x85\xcb\x95\x2b\xa9\xb8\xaa\xd0\xc0\xe0\x7f\x0b\xfe\xef\x00\x07\xff\x6f\x40\xbe\xe9\xce\xb8\x0a\x2a\x6e\xcf\xc7\x27\xbe\xb4\xf3\xfb\xcf\x1f\xdf\xbe\x90\x61\xfa\xca\x2d\x7b\xf5\xd8\xd0\xfd\xf1\xed\x9b\xeb\xeb\xd0\x79\x9c\x41\x98\xe5\x90\x67\xa9\xe3\x20\x4b\x5c\x5f\x72\x82\xe3\x58\xc6\x64\x68\xb9\x49\xaa\xc6\x48\x0d\xa0\x08\x87\x35\x97\x55\x05\xf2\xca\x15\xfe\x4b\x85\x2f\x39\x55\x94\x0e\x94\x8e\x94\x9e\x14\xe2\x84\x53\x8c\x8a\x82\x16\xa2\x88\xb3\x34\x49\xe2\x32\xe7\xb0\x44\x59\x2a\x52\xb1\xd6\x2e\x76\x1a\x03\x01\xda\xb0\x5a\x5b\x97\x81\x0c\x6f\xb1\xf5\xe6\xfe\x2c\x6e\x94\x72\x73\x18\xeb\xed\x8f\xd7\xa4\xba\xe2\xee\xd5\x3f\xae\x2f\xf9\x62\x3e\xfe\x1b\x67\xc3\x7a\x98\x47\x88\x8a\x92\xfb\xb4\x60\x99\xb8\xa6\x94\x26\xdf\x26\x63\xea\x79\x95\x34\x83\x95\x16\x10\x15\xc5\x97\x45\x35\x0d\x80\x8d\x8b\xfd\x97\x8a\x7c\x99\x98\xe2\x7c\x12\x62\xe6\xfc\xd9\x64\xb0\xd2\x4f\x46\x06\x73\x0e\x21\xbc\x4d\x45\xe2\x14\x06\x12\x34\xff\xd8\x54\x84\x01\x3f\xe8\xb3\x3e\xa9\xe0\xf7\xfe\x44\x7f\x64\xcc\xbb\xbf\xae\xdb\xc7\x6f\xbd\xff\x07\x5a\x64\x59\xcb\x6c\x01\x16\xb7\xe4\xa9\xce\xcb\x90\xd8\x2c\xe4\xae\xdd\x7e\x80\x5d\x89\xa9\x38\x4a\x21\x84\x99\x72\x2a\x21\x2c\x28\x5e\x32\x22\xcb\xb2\x20\x88\x40\xce\x83\x30\x20\x0f\x38\xec\x7c\x4e\xe6\x2f\xfd\x13\xc4\x3f\x40\xee\xf6\x14\x5c\x18\xbd\x0f\xee\xa2\xdd\x89\xa1\xba\xcc\x05\x91\x9c\x50\x08\xcb\x5e\x80\xb8\x96\x09\x16\xf0\x24\x1c\xc2\x84\x6a\xee\x16\x41\x88\xc2\xd0\xf1\x87\x80\x02\x1c\x06\x60\xca\x5c\xb3\xa0\x39\xf8\x1d\xa8\xbd\xaf\xf7\x67\xdc\xdb\xaf\x6f\xed\x63\x03\xd2\x53\x83\xd2\x73\xc1\xb1\x5b\xc0\xf3\xfc\xde\xde\x04\xc7\x0e\xf9\xde\x51\xd8\x97\x88\xc1\xb5\x03\x26\x71\x04\x9b\xb1\x8c\x65\xc2\xdc\x30\xcb\x21\x9d\xdd\x38\x48\x4e\x41\x65\x23\x7d\xe1\xbb\x9c\xa1\x04\xc1\x2a\x6f\xdf\x35\xe2\x4b\xa0\xd4\xbe\xf6\x41\x56\x55\x8f\x77\x99\xbe\xbc\xc9\x79\xf6\xb4\xde\x47\x40\x97\xeb\x4d\x4e\xfd\xfd\xfd\xfe\x7a\x3f\x04\x33\x58\xce\xb9\xe7\xa3\x7b\x1f\x7c\xf0\xdc\x2c\x4f\xbc\x05\x77\x1f\x5e\x6f\x7e\xe4\x87\x27\x6e\xa1\xe7\x4e\xe5\x87\xdb\x89\x76\xf7\x16\x78\x8d\xe9\xf7\x9f\x3e\xbf\x05\x12\xa4\x8e\xb4\x9a\xab\x6a\x02\x42\xc7\xac\x94\x98\x71\x2e\x18\x47\xa2\xcc\x33\x08\x0b\xd0\xce\x6e\x02\xb5\x23\x20\x99\x2f\x35\xa0\xb5\xc6\x0d\x1e\xa2\xc9\x0d\x26\xea\x0a\x22\x70\xee\x66\x1d\x6a\x47\x63\xc2\xb0\xc2\x42\x49\xa3\x5d\xcd\x49\x62\x53\x04\x2a\x50\x9a\x2f\x83\x01\x05\x60\xba\x74\x3d\xe7\x7a\x08\x40\x58\x87\xdc\xf7\xa5\x3e\x3e\x3d\xf7\xed\xf9\xe3\xf9\x91\x35\xef\x87\xcf\x7b\x9c\xd2\x9a\x24\x8d\x82\x82\x18\x58\xb8\x31\xe9\x81\x20\xce\xb6\xdc\x71\x0a\xb2\x3e\x19\x10\x53\xed\x49\x16\x65\x69\x94\xcc\x19\x47\xd0\x75\xc2\x28\x90\x3c\x04\x5a\x13\x10\x8c\x86\xb3\x61\x9b\xb3\x2a\x0c\xce\xe4\x8a\x07\xdc\x19\xfc\xbc\xb3\xf3\x75\x11\xf7\x51\x06\xe1\xa3\x27\x98\xbb\xbb\x7f\xfd\xe3\xbb\x67\xb2\x04\x11\xab\xb2\x2c\xac\x87\x81\xd2\x92\xe4\xb4\x84\x17\x54\x4a\x25\xf2\x11\x04\x09\x60\x85\x5b\x22\x73\x11\x80\x53\xcc\x11\x43\x8c\x0a\xcc\x4f\xb2\x44\xb9\x83\xaa\x66\x3c\x36\x31\x97\x63\xcd\x8c\x56\x18\x83\x0c\xaf\x33\x28\x34\x6e\x21\x21\x18\x3b\x85\x28\xdd\xb5\x61\x41\x50\x85\xcc\xdb\xfa\xc4\x50\xf1\x35\x00\xeb\xe3\xad\x93\xf2\xc8\x6a\x8c\x41\xb5\x16\x5e\x0d\x2d\xfe\x07\x1c\x05\x2b\x0f\xf5\x9a\x83\xa6\xc4\x4a\x60\xc0\xe9\x49\x14\x82\x98\xca\x54\x5a\x57\xa6\x32\x84\x10\xa9\x76\x3f\x8a\x01\x76\xae\x4e\x2a\xc8\x03\xb8\xf9\x51\x8f\xa5\x98\xeb\xdb\x4f\xc7\xf3\xfb\xbb\xfb\x47\xf0\xf4\xed\x0d\xbc\x7e\x66\x84\x87\xdf\xbf\x39\x1d\x5f\xdf\xbf\x1e\xc2\xa1\xd4\x59\x38\x5e\xc6\x34\x8b\xe2\x8b\xcd\xf2\x03\xde\xee\x12\xe2\xd5\xaf\x23\x65\xb0\x33\xae\x05\x63\x0a\x1d\x0b\x83\x2c\x5d\x05\xc8\x0f\xb1\x7f\x40\xe6\x40\x95\xf9\xca\x30\xed\x2d\x1d\xdc\x02\xda\x53\xc6\x72\x28\xf3\x9c\x17\xb9\x60\x48\x42\x87\x40\x5b\xe6\x92\x70\x91\x20\x9e\xe7\x97\x8a\x31\xc1\x44\x01\x11\xcc\x0a\x06\x33\x2c\x3c\xee\x19\x45\xca\xf7\x1d\x3f\xc3\xc9\x7e\x17\x03\x7e\x7c\x9f\x7d\x83\x2b\xc8\x91\x34\xa0\x70\x63\x25\x08\xe3\x5a\x6a\x56\x2b\x37\x03\xec\x96\x02\x20\xa0\xb4\x13\x5a\x7b\x89\x13\xe5\xc4\x09\xc9\x2c\xd5\x4a\x0a\x29\x99\x1b\x40\xd1\x0a\x2e\x7b\x25\x13\x7d\x51\x97\x96\xb1\x08\xba\x61\x67\xd3\x09\xbd\xbe\x8a\xf5\xdc\x7c\x57\x0f\xfb\x4a\x2f\xf4\xf6\xe3\x87\xbb\xb7\x8f\x42\x2b\x77\x6f\x7d\x8d\x2a\x6a\x27\x63\xdc\x0c\x92\x71\x9c\xc2\x6e\x18\x36\xd7\xc7\x98\xe5\x58\x02\xb4\x74\x40\x2b\x40\xd5\x16\x9c\x28\x67\x95\xe3\xe7\xd2\x35\x6a\x3b\x0b\x76\x2c\xbc\xe7\xa4\xdf\x7c\xc3\x3f\x5c\xd5\x7f\xb7\x83\xff\xb1\xe6\x04\x6e\x38\xa7\x4f\x9f\x3f\xde\x47\xf8\x80\x2c\x84\xa9\xb1\xae\x76\xa2\xac\x2b\x80\x6e\x7e\xca\x34\x38\x78\x2a\xcd\x05\xa7\x89\x2a\xd7\x19\x8c\x8c\x54\xd9\x81\x3f\x04\x20\x58\x39\x08\x56\x54\x40\x8f\x21\x8a\x82\x07\xe6\xc7\xf5\xe3\xd3\x4c\xdf\x27\xe1\xae\x6b\xf8\xf9\xd3\x5e\x80\x38\xde\x3d\x26\x5f\x4f\xd7\xb4\xe5\xab\x0f\x77\x6f\x0f\x81\x49\xd2\xb0\xe5\x26\xcb\x72\x56\x26\xd9\x5a\x11\x26\xea\xb0\x70\x55\x39\x81\x04\xc6\x36\x2b\x4b\x67\x5c\xcd\x6d\xdb\x9e\x64\x4e\xc8\x45\xbb\x36\xd6\xc8\x86\x66\x32\x1c\x04\xf3\x5a\x3b\x91\x27\xc8\x94\x1d\x2c\x21\x8f\x16\x07\xc1\xe6\x60\xfa\xbe\x7a\x7e\x52\x4f\xdd\x5f\xf7\x77\xdf\x6f\x86\xde\x5b\x8a\x0e\x72\xf3\xc9\xad\xe3\x40\x33\x96\xc3\x8c\xe4\x70\x31\xb3\x01\xaa\x41\x4c\xb4\x27\x95\x13\xa2\x5d\xbb\x26\x74\x0b\x9f\x70\x58\x7c\x59\x0e\xf1\x65\x88\x5a\x00\x8d\xa0\x53\x10\x45\xe8\x01\x9e\xd9\x49\x5f\xbd\xdc\xe0\x2b\xc5\xdc\xb7\x77\x7b\x0d\x32\xf2\xf2\x62\x77\x6f\xcf\x4c\x70\xc2\x72\x8d\xe9\x1a\x68\x90\xa0\xbc\xca\x4b\x5f\x9c\xd1\x75\x7d\xa4\xbf\xb6\x94\x25\x36\xc1\x07\xf9\xab\x38\x65\xb2\xce\x2d\x73\xcd\xc5\xc8\x90\xdd\x78\x01\x48\x38\xfb\x75\x94\x6e\xa1\xf7\x55\x3f\xf4\xf5\x8f\x7b\x67\xc2\xf5\xb9\xfb\x1e\x48\x2c\x98\x25\xba\x00\x08\x97\x02\x66\x0f\x81\x56\x2c\x33\x1d\x3c\x8c\x6e\xea\x39\x80\x60\xc8\x27\x1d\xf7\x04\x71\xf1\x10\x5c\x30\x26\x56\x30\xbc\xad\xd3\xe0\x8a\xcd\xff\x93\x67\xdb\x7d\x73\xbc\x51\x8f\x3d\x26\x55\x6e\x21\xcd\xf1\xfd\xbb\x1b\xed\xc6\x9e\xe4\x79\xca\xb9\xec\x4c\xf8\x9f\xef\x4f\x4b\xe2\xb2\x3c\x6f\x05\x51\x95\x20\x59\xae\x13\x4a\xeb\x7a\xea\xc9\xd4\xc3\xcc\x4d\x29\x48\x32\x1b\x27\x2e\x3e\x70\x57\x65\x25\xc9\x6d\x4c\x5a\x4d\xaa\xa4\xe9\x69\xa3\x13\xd7\x9e\x12\xc3\x04\xdc\x5c\x63\xc6\x08\xc9\x6a\xd9\x72\xa8\x11\xe5\x0c\x9a\x72\x4c\x38\xb9\xf4\xc6\xe1\x2c\xcd\x6d\xd1\x51\x84\xc1\xe8\x66\xd7\x53\x4d\xe6\x2e\x08\xa3\xec\xaa\x27\xb8\x33\x87\xbe\x39\xbe\x7a\xf7\x7c\x2c\xaf\xae\xf8\x51\x0f\xb2\xd8\x86\xb2\xbf\x7d\xfc\xf0\xe3\x9b\xab\x8c\x41\x9c\xb8\x22\x09\xd3\x64\x9d\xd3\x52\x71\xad\x6b\x89\xf2\xc4\xe6\x0c\xe9\x7a\x70\x33\x01\x45\x8b\x72\xc7\x52\x60\x93\xd8\xf5\x29\x80\xb1\x8d\x07\x4c\x04\x62\xc7\xd4\xe0\x87\x80\x1b\x6e\x8c\xac\xd0\x64\x3b\x90\xa0\xc9\x80\x4c\x53\xcb\x94\x19\x89\x21\x42\x17\xa6\xe8\x97\xb9\x01\x96\x08\xca\x59\x70\xed\xd5\x3a\xc0\xab\x5e\xe6\xcf\x5e\xe5\xfd\x1b\x06\xcc\x57\xf7\xaf\xbd\x6e\xcd\x8b\xe5\x75\x7c\x16\x88\x08\xa0\x3d\x6d\x09\x20\x97\x06\x60\xc7\xc9\x16\x8b\xb3\xa8\x75\x12\x0b\x04\x53\x8c\x73\x47\xa3\x8c\x94\xa6\xc0\x2e\x30\x88\x68\x76\x9c\xb4\x36\x5e\xfd\x01\x6b\x65\x5c\xce\x69\x5c\x25\x18\x34\x50\x55\xa8\x56\x65\x39\x59\xdc\x04\x57\x9e\x0e\x74\xc0\x27\x19\xfc\x6b\x1f\xc3\x7d\xfa\xfc\xe9\xf3\x1b\xdf\x64\x73\x3b\x4a\x6f\x6d\xf3\xa7\x27\xac\xcf\xf1\x7d\x00\x70\x23\x61\x61\x26\x97\x10\x00\x6d\xdb\x65\x9a\xba\x05\x98\xac\xb0\x30\x03\x6a\x9d\x08\xb0\x86\x4a\x41\x19\x63\x93\x6b\x68\x88\x23\x1e\xa7\x5c\x96\x6b\xbd\x88\x7a\x2e\x12\x65\x26\x2d\x58\x21\x8c\x1e\x1f\x82\x72\xb4\x84\x2a\x4e\x66\xa3\x40\xbc\x63\xc9\xf1\x21\x38\xf1\xe0\xc7\xeb\xbe\x7b\x3a\x7b\xf6\xdc\xd3\x76\xf6\x80\x5d\xee\xfc\xc3\xdd\x5b\xc0\x75\x96\x87\x88\x4b\xc4\x32\x8e\xf3\x22\x71\x69\xa9\x79\x07\x06\xd7\x68\xdd\x34\x27\x9e\x0b\xfe\x85\x38\x93\x9a\x74\x3c\x04\x75\xc3\x40\xee\xda\x15\x89\xa8\x58\x7b\xe0\xf5\x18\x74\x10\x47\xfd\x29\x09\xce\x1e\xe3\x77\x63\x71\x7c\xc9\xdd\xe8\xf7\x46\xd4\xad\x34\x54\x97\x11\x94\x9c\xa3\x52\x21\xc6\xa9\xc0\x84\x49\xa1\x85\x50\xa7\xc4\x7c\xc9\xf4\x29\x76\xa3\xa9\xea\xba\x58\xfa\xb6\x15\xb5\xed\x2a\xdc\xcf\xfd\x53\x0f\xc6\xf6\x2c\xf6\xd5\xc2\x67\x95\xfb\x7d\x93\x1f\xdf\x44\x3f\xee\x8e\x11\x78\xff\xe9\x87\xc3\x00\xb5\xe8\x98\xd9\x86\x46\x4b\x09\x73\x27\x4d\x3c\x83\x40\xb9\x51\x10\xd7\x88\xa9\x3b\x34\xfd\x20\x00\x04\x6d\xa1\xa4\x8e\x17\x8e\xb4\x96\x89\x5b\xf0\xda\xb4\x72\x01\x95\x63\x6e\x91\x0d\x18\xfc\xd9\xc2\x23\x7b\xa2\x57\x1f\x3e\x7a\x36\x97\x5b\x1c\x14\xdd\xbf\xde\x95\x11\x41\x5d\x84\x99\x6e\x28\x2b\x14\xa3\x78\xed\xa4\xcd\x40\xef\xfa\x62\x74\x23\x02\xe5\xa1\x71\x6a\x45\x6e\x4a\x6c\xda\x81\x21\x6a\xdc\x6c\x56\xa8\x28\xf2\x38\x49\xe0\x9f\xcd\xfd\x89\xf9\xde\xa3\x37\xa7\x5d\x8c\xfe\xed\xad\x66\xfd\x97\xe0\xe7\x88\x93\xc5\x35\x21\xb2\xd6\x2d\x31\xd9\xa6\x0d\xa8\x13\xd3\x28\x77\xda\x7c\x99\x0e\xa9\xcb\x1c\xb3\x4c\x82\x36\xcc\x41\x5f\xec\xf9\x17\xe3\x79\xea\xc4\x75\xbe\x9e\x4d\xd5\xce\x52\xb6\xcd\xd7\x9b\x73\x70\x9d\xaf\xd1\xe4\x45\x08\x49\xa9\x60\xee\xf2\x12\xab\xae\x31\xc9\xb4\x28\x37\x31\xe2\x5a\x31\xb6\x27\x51\x48\x71\x9b\x27\xca\x40\xec\xe6\xe4\x21\x20\x6b\xdb\x49\x10\x03\xed\xf8\x75\xba\x82\x30\xca\x5f\xdc\xa7\xaf\xaf\xfb\xfc\x3e\xfd\xfc\xc3\x41\x9a\xac\x08\x15\x2b\x15\x2a\xd6\x99\x18\x31\x82\x78\xbb\x51\xa9\x72\xbd\xa4\xce\x08\x10\x0c\x27\x95\x2b\x75\xbd\xf4\xd8\x49\x50\xea\xc4\xcd\x64\xed\x3b\x7f\x9f\xb8\x9b\x65\xeb\xef\x13\x7f\x90\xa1\x39\xa5\x1e\xbf\x70\xed\xa3\x00\x6f\xb6\x20\x0b\x64\xad\x15\xb6\x01\x44\xeb\xc5\x82\xe0\x94\xea\x4e\x0f\x66\x25\xd4\x31\x27\x05\x60\x41\x18\xa6\x57\x9b\x7f\xff\x64\xf3\x73\x93\x7f\x3c\xff\x10\x1c\xf7\xb9\xfa\x39\x88\xc6\xcd\xe6\x85\x08\x45\xe1\xaa\x99\x12\x23\xc8\x4d\xca\x40\x06\x62\xed\x78\x25\x5c\x2e\x00\x01\xe9\x6e\x76\xd3\x20\xad\x97\x5a\x02\x68\x52\xab\xdc\xe0\xb4\x56\x20\x00\x95\xa3\x6e\x91\x2d\x18\xfd\x99\x5c\x7a\x3f\xff\x77\x1e\x6d\xfc\xb4\xae\x8f\x1f\x7e\x7c\xc6\xa2\x75\xed\x33\xf9\xd9\x97\x17\x0f\x02\x53\xdd\x71\x9b\x15\xe1\xb0\x42\x1b\x87\x41\xcc\x2d\xe1\xa9\x24\x45\x9a\xbb\x2a\x75\x19\x06\x32\x77\x33\x48\xe3\x43\x5f\x29\x02\x32\xc0\x4a\xc1\x8c\x30\x72\x8d\x97\xd4\xa4\xb8\x02\xdd\x6a\xdc\xa2\xc7\x30\x30\xf2\x56\x33\x50\xe7\xcd\x3f\xfc\x69\x9f\x81\xaf\x2a\x6c\xa7\xf3\xfb\xec\x9c\xe0\x66\xf2\x0d\x4e\xd5\x25\x01\xf6\x26\xc1\xdb\x9d\x90\xce\xd3\xb5\x31\xab\x32\x26\x14\x26\x2c\x93\x78\xc7\x43\x44\xf9\x43\x79\x6e\x4e\xd2\xe7\x94\xfe\xf4\xe8\x77\x9c\x7d\xe2\xcf\x9f\xdb\x27\x1f\x8e\xbe\xda\xbb\x34\xee\xfe\xf6\xf3\xfd\xa1\xb4\x59\x16\xda\x35\x27\x19\x94\x0d\x0f\xab\x95\xd4\x11\x4c\x92\x34\x4f\x65\xc2\x10\x65\xc9\x4a\x4f\xb2\x64\xc4\xb4\x88\x50\x90\xb7\xda\x8c\x76\x9e\x41\x99\xbb\xc5\x2e\x40\x32\xe9\x7b\x7c\x1e\xa8\xaf\x73\xbf\xbd\x45\xc0\x77\x4f\x55\x90\x67\x65\x97\xfd\xb7\x1f\xef\x8f\xa5\x7f\x42\x0c\xc6\x69\xaa\xcb\xd8\x26\xb0\x98\x6b\xec\xb4\x19\x36\xf7\xe7\x24\x27\xb3\x96\x61\xba\x12\x67\x50\xa9\x8b\xae\x2c\x10\x03\x26\xac\xd6\x29\xec\xcc\xf5\x39\x40\x22\x76\x92\x41\xe2\xcf\x88\xe7\x6b\x7e\xf3\x45\xde\x3c\x3a\x20\xdc\x26\x39\xd0\xa4\x54\x28\x77\x13\xd1\xa2\x67\x46\xd0\x4c\x37\xe8\x24\x73\xc1\x75\x32\x33\x2c\xb5\x9b\x3a\x09\xf0\x74\xa1\x98\xd4\x82\x91\xcd\xa1\x59\x1e\xf0\xb9\x3a\x25\x57\x4c\xc9\x0b\xbf\xe2\xfe\x2e\x09\xcf\xef\x83\xbf\x04\x27\x9b\xe4\x49\x5a\xc5\x58\x29\xe8\x9a\xaa\xe2\x20\x3b\x25\xbf\x92\x22\x2b\x4d\xd1\x09\xcc\x8f\xe5\xda\x39\xed\xca\x5a\x81\x3c\x54\xa1\xda\xb9\x73\x36\xbb\x79\xf0\xdf\x3d\x2a\xea\xbe\x79\xa6\x42\xea\x59\x48\xae\xb4\x5b\xf7\x57\x76\xae\x57\xcf\xfa\x85\x40\x63\xb2\x4a\x73\xa5\x79\xcd\x26\x30\xa4\xae\x77\x3a\x03\xa5\x1b\x40\x5e\x81\xc9\xa7\x26\x95\x29\x0a\x0d\x1d\x43\xa9\xce\xe0\x89\x17\x58\x18\x69\x78\xab\x58\xff\x25\x35\xa8\xb4\x45\x58\xe8\x56\xeb\x56\xaf\x13\x18\xf2\x9a\x67\x86\x9b\xb6\x68\x8d\xc7\xa0\xc9\x6b\x6d\x63\xd7\x5e\xbc\x69\x49\x5d\x4b\x1a\xb7\x74\x3c\x78\xbb\xd7\x36\x9e\x87\x7f\xd1\xfd\xc7\xfb\xb3\x32\x6b\x6e\x2b\x88\x15\x47\xd8\x50\x02\x2d\x82\x8e\x4f\x21\x9b\xbc\x5e\x4c\xf7\x65\x04\xad\xb3\x80\x62\x50\xb8\xfe\x58\x3a\xe6\x7b\x1c\x0d\x63\x78\xd7\x01\x52\xba\x90\xec\xd2\x85\x81\x0b\x6a\x55\x1b\x53\x2b\x50\xce\xbb\x06\xf1\x9f\x67\xd7\x0b\x6e\x90\x67\x76\x49\x7b\x69\x6c\x87\x88\x12\x98\x19\xc9\x90\xc5\xd8\x61\x37\x85\x9d\xf3\x6d\x82\x61\xf2\x85\x84\x81\x63\xc0\xf8\x60\xea\xcf\xb7\x6c\xbf\x9f\x22\x82\x9e\x13\x7a\x8f\xe2\xbf\xbd\x9f\x9f\x3e\x7f\x75\x43\x3f\xbd\xb8\xa3\xd6\x64\x56\x31\xa9\x84\x61\x3d\x68\x53\x37\xbb\x26\xd3\xd2\x4d\x20\xb5\xa0\xb7\x20\x76\x0b\x4b\x74\x5e\xc8\xdc\x29\x98\xea\xac\x3c\x89\x02\xc9\xed\x96\xf6\x92\x77\x5f\xb0\xa6\xd0\xa4\x59\x98\xea\x56\xa9\x56\xbb\x24\x05\x3a\xaf\x44\xae\xff\x3f\xd2\xfe\x1d\x48\x72\x5d\x4f\x13\xc3\x09\x32\x1f\xbc\xbb\xff\xff\x0c\xeb\xf4\xed\xd3\x9c\xd1\xcc\x0e\x6a\xea\x9c\xd3\x18\xed\x4a\x83\x9d\xde\xee\x86\x34\x31\xbb\xd8\x90\x56\x82\xa4\x8d\x0d\x28\xe4\xc0\x52\xc0\x51\x04\x4c\x98\x30\x61\xc2\x84\x49\x93\x26\x4d\x9a\x34\x69\xd2\xa4\x99\x66\x9a\x69\xd2\xcc\xdb\x9d\x44\x29\x08\x66\xd6\xa3\x4f\x9f\xbd\x77\x57\x55\x95\x8f\xca\xca\x2c\x02\x24\x1e\xbf\xc7\xf7\xfb\x3e\xb3\x5e\xd4\x24\x49\xf2\xf4\xf4\x48\xf6\xf5\xce\x27\x1f\xa3\x32\xfe\x7f\x78\xa1\x8d\xff\xf6\xfe\x05\x0d\xdc\x77\x69\x73\xe3\xf7\xdb\x22\x7b\xff\x97\xe0\xc6\x57\xbb\x5f\x17\xa8\x8f\xdb\xb7\x1f\x3e\xee\xaf\x21\xc9\xed\x87\x8f\x0f\xb7\xc7\x7d\x15\x0c\x60\x8c\x85\x0e\x08\x21\x21\x86\x0c\xa1\xc1\x77\x1e\xb0\x98\x5c\xb6\xde\x71\x02\x86\x12\x56\x18\xaa\x28\xda\x7d\x00\x5d\xdb\xb6\x31\x12\xc9\x86\x21\x74\xeb\xe3\x2e\x71\xea\x60\x0e\x72\x56\x9c\xe7\x36\xa7\x6c\x05\xc5\x66\x54\x1a\x39\xce\x53\x10\x1c\x24\x40\x03\x98\x9e\x30\xc6\x94\x4f\x2a\xf4\xd2\x98\x18\xcf\x9d\x0f\xc6\x98\xd0\xae\x62\x85\x59\x2a\xe2\x5e\xe3\xa3\x72\xd8\xbf\x7d\x51\x4f\xfb\xf6\x39\x0c\x77\x2d\xa9\x7d\x13\x53\x32\xd9\x13\x03\xd0\xf7\x54\xf3\xb7\x14\x43\x70\x6e\x30\x07\xf8\x52\xf4\x4e\x71\x80\x89\x68\xc0\xa9\x44\xe8\xbc\xec\xe5\xbc\x44\xc8\x1b\x52\xe1\x7a\x55\x77\x59\xce\x43\xfd\xf5\x00\xa6\x30\x02\xbc\xf3\x42\x7b\xa7\x5d\xc0\xc1\x85\x03\xef\x40\x31\xa4\xa5\xd3\x5e\xb0\xf9\x60\xac\x99\x0d\xa7\xac\xef\x88\x69\x1a\x7b\xb0\x07\xe7\x0e\x76\xd5\x09\x02\xa7\x3f\xbd\x0f\xf7\x7f\x42\x1f\x12\x8a\x52\xd8\x11\x01\xf8\xd7\xee\xe0\xb4\x04\x8c\xca\x2e\x2d\x21\x46\xa0\x5c\x0c\x03\x5e\x22\xec\x1d\xf5\xb8\xf7\x51\x0a\x46\x85\x0a\x0c\x5f\x6d\x8a\x42\x03\xc4\x8b\x4e\xf8\x30\xf2\x0e\x94\xfd\x9f\xd0\x09\x90\x34\x8f\x43\x76\xde\x89\x88\xad\xf9\x70\xf7\x39\x62\x84\x37\xdb\xf7\xb1\x40\x3f\x4d\xea\xae\xae\xc3\x14\x1a\x56\x4b\xb1\x13\x5f\x34\xde\x90\x2f\x07\xce\x18\xdb\xc2\xaf\xac\x28\x23\x1e\x68\x48\xa7\x9d\x88\x58\xb2\xdb\xe7\xa3\xf2\xc8\xdd\x67\x60\xbc\xf0\xbe\x3d\xb2\x2a\x7e\x16\x6d\xe8\x97\x03\xe7\x34\x7e\xb6\x5c\xb1\x51\x43\x56\x3e\x1d\xfb\xd3\xeb\x0f\x7b\x4f\xb0\xf7\xfd\x99\x7a\xbd\x7c\xba\x28\x97\x8f\x0b\x1e\x0f\x4d\xe1\x35\xbe\xc0\xe2\x1c\xfa\x8b\xe4\x6f\x9e\x98\xa7\x1f\x5e\x8a\xf8\x7e\x33\x84\x22\x45\xd3\xf7\x4e\xfd\xc3\xfe\xfd\xa7\xad\x63\x08\x78\x8f\x29\xc8\x2f\x55\xed\x2a\x90\x20\xe6\x41\x87\x08\x1d\x08\x0c\x8e\x50\x5f\x94\xba\x8e\xf0\xf4\x3c\x9c\x81\xb8\x48\xd0\x3c\x26\x20\xa9\x99\x95\x2f\x4e\xbe\x0d\x47\x0e\x08\x10\xf1\xe4\x73\x36\x1f\x8d\x35\xa1\xc2\x84\xbc\x38\xf1\x6e\x8d\x8f\x44\x4d\x62\xb7\xcd\x6f\xed\x7f\x13\xa5\x5f\x6f\x51\xb5\xbb\x62\x1f\x0b\x89\xef\x7f\x79\x7f\xbf\x5d\x87\xcf\xbb\xfd\xfd\x77\x9b\x1f\xa3\x91\xa7\xb4\x2d\x61\x25\x33\x18\x7a\x4c\x41\xff\xa5\x8c\xd3\xc0\x62\x1a\x86\x54\x82\x8e\xa3\x59\x11\xee\x09\x60\x75\xba\x38\x2d\xe7\x90\xa7\xfa\x0b\x4a\x87\x48\x06\x2b\x09\x71\xcd\xc6\x42\xc8\x5c\x25\xb8\x0d\x55\x38\x4c\xc2\x1f\x2a\xd0\x08\xde\xf0\xa8\xe7\x22\x94\x72\xd6\x39\xef\x9d\xb3\x8c\xb0\x26\xd9\x27\xf6\xb1\xde\xe4\x2f\x38\x73\x6e\x39\xe2\x27\x0e\xfb\x6b\x4e\xf8\x1a\xdc\xf8\xf9\xfa\xb8\x49\xe6\x32\x3d\x5d\x2c\x28\xd2\x62\x9e\x62\x50\x7c\x58\x56\x74\xc3\x18\x48\x96\x27\x96\xd2\x1d\xf4\x5f\x6a\xbf\xb3\xe1\x1c\xa8\xed\x02\x9b\x0f\x16\x20\x1b\xef\x97\xb9\xb7\x4f\xdc\x63\xbd\x91\xff\x15\xc7\x26\x97\x53\x56\x5e\x38\x40\x29\x9d\x7b\x07\x50\x38\x44\x76\x30\x2b\x25\x40\x80\x87\xd6\x48\xf9\x47\x8e\x9d\x6d\xf8\x23\x8d\x58\xee\x1f\x62\xcd\xed\xb3\x3e\xd8\xc7\x27\x41\xb6\xec\x3e\xdd\xbf\xfb\x17\xe0\x25\x39\x44\x54\x08\xdb\x27\x54\x58\x29\x0e\xb9\x54\x4a\x52\x96\xf6\xb0\xe3\x50\x31\x51\x57\x4d\xcf\x07\x5b\x51\x3c\x12\xad\xca\x1d\x09\x50\x38\x2e\x80\x0d\xc7\x93\x30\xe2\x04\xe8\xe5\x18\xf4\x44\x4b\x82\x6a\xee\x3c\xab\x98\x39\x82\xe2\x50\xd5\x63\x12\x39\x6d\xf8\x86\xed\x6c\xd4\x44\x7d\x9a\x05\x1f\xbe\xd5\x0e\x78\x51\x74\xf2\xf1\xdf\x5c\x39\x24\x3e\xbe\x50\xb5\xfe\x7c\xcb\x82\xdf\xe6\x4b\x8a\x09\x02\x52\x10\x39\x85\x1e\x21\x86\xb4\x50\xd2\x34\x46\x68\x6d\x2c\x11\x48\x71\x8c\xf3\xe1\x31\x61\x00\x8f\x65\x3f\xb2\x73\x5d\x94\x8d\x91\x87\x26\xf8\x03\x24\x12\x70\x88\xb9\x65\x38\xb4\x74\x67\xb5\x73\x95\x73\x08\xca\xa8\xe1\xc4\xa5\xb4\x92\xd5\x55\x5d\x36\x90\x33\x42\x3a\xe9\xd5\xc0\x8b\x9a\x19\xe1\x21\x54\xc8\x52\xbd\xbc\x5d\x89\xb9\x72\xab\x8e\xca\x2e\x62\x60\xc4\x16\x5f\x2d\xb4\x35\xc7\xb3\xce\x98\x1f\xaf\x53\xe6\x57\x91\xb5\x17\x13\xe7\x79\x6f\xdf\x5e\x07\x46\x95\x9e\x4b\xd4\x10\x98\xe5\xc1\x51\x0e\xbc\xd6\x18\x23\x81\xd8\x57\x5d\x03\x4b\x78\xf0\x69\x03\x24\x25\x73\xcb\x0a\x63\x7b\xd9\xa7\xa8\xf3\xb2\x6a\x03\x4b\xeb\x59\xc6\x4d\x64\xd3\x60\x84\x29\xf3\x8a\xdf\xa4\x6c\xd3\xfa\x62\x36\xa5\x14\x9d\x90\xe2\x31\xe1\x5e\x68\xa1\x98\xb0\x9a\xb5\x81\xdb\x76\xe5\x14\x26\x57\x7d\xa3\x57\xfd\x78\x66\x93\xf8\x75\x1f\xbe\x59\xc0\x9e\x6c\x94\x38\xa0\x3f\x3e\x6c\x15\x2a\xc1\xe9\x84\x30\x80\xeb\xbe\x0e\xd1\x5c\x56\x20\x2f\xd1\x69\xd9\xcf\x51\x87\x60\x18\x20\xd4\x5c\x0b\x0d\xa4\x91\x42\xe9\x70\x02\xa7\x50\x56\x5d\xb7\x33\x5c\x54\x5e\x7f\x1d\x57\x22\x89\xcc\x7d\xad\x36\x93\x33\x15\x25\xf3\x64\xad\x09\x3d\xaf\x85\x52\x5a\x68\x6d\x45\x38\x07\x68\x8f\x2b\x0f\x58\x77\xc5\x9b\xff\xba\x0f\xbf\x75\x1d\xfe\x48\x1f\x4a\x02\x53\x14\xce\x98\x00\x2a\x25\xc2\x88\x23\x7c\x69\x6b\x80\x21\x0e\xe7\x34\x2f\x11\x3a\x60\x14\x1c\x2a\xb4\xb4\xd2\x01\xe3\x8c\xb0\x36\x8c\xcb\xea\x51\x1d\x8f\xaf\x7b\xc1\x33\xfb\x9d\x5e\x68\xf9\xba\x17\x29\xf0\x89\xd8\xe9\xed\x62\xf3\xff\xab\x2b\x3e\xef\xaa\x1b\x12\x5d\xb3\xef\x86\x84\x1f\x56\x4d\x4f\x70\xf6\x00\x2f\x3f\x5f\x27\xb5\x39\xce\x0d\x4c\x21\x65\x98\x41\x51\xa2\xd6\xb5\xb6\x75\xc0\xc0\x90\x6f\xc9\x10\x17\xb6\xd0\x29\xab\x83\xe0\x2c\x77\x39\x02\x45\xcc\x0d\x28\x50\x05\x96\x12\xbd\xcc\xdd\xfe\x91\xed\xe9\x8e\xc4\x75\xec\x15\xe7\xd8\x9e\x56\x5f\xda\xaa\xda\xf2\x2f\xed\x8e\xfc\xa1\x60\x6c\x37\xfd\xe1\xb4\x75\x49\xb2\x4d\x45\x22\xf7\x36\x72\xef\xff\x45\xac\x03\xff\xd7\x2f\xb8\x29\xd6\xfd\x6f\x39\xdf\x0f\xb1\x4e\xf6\xdd\xf6\x66\x7f\x5f\xa1\x2e\x4f\x9c\x43\x1d\x38\x2e\xf6\x5e\x09\x8e\x07\x54\x02\xf3\xe5\x00\x54\x01\x0f\x69\x87\x8b\x60\x60\x11\xea\x4d\x1e\x68\x8a\xe6\x43\x3d\x1f\x52\x14\x44\x94\xae\x58\x6e\xdb\x23\xa5\x90\x73\xab\xa1\xb5\x8c\x79\x89\x19\x3b\xcc\x47\x69\xab\xca\x4a\xc0\x54\x64\x22\xfb\x5d\xe6\x1e\x49\x8c\x25\xbc\x4d\xfe\x32\x2a\x1f\xad\x79\xd9\x6b\xf5\xe4\x1a\x59\xd8\xde\xd4\x3e\x9f\x45\xf5\xc1\xf3\xc6\xf6\xb0\xff\x06\x5c\xf1\x37\x60\x77\x03\xdd\xbf\xdf\x1c\x4d\x09\x53\xc8\x0d\x28\xe8\x54\xf5\x8f\x09\x69\x5d\x4d\x18\x3f\x48\x6b\x1d\x9b\x87\xb4\x0a\x27\xd0\x5d\x4a\xd0\x9c\x75\x26\x2f\xb5\x4d\xf9\xdc\xde\x6e\x15\xf7\xe7\x65\xa7\x71\xc3\x48\x86\x7e\xe7\x20\x42\x5a\x31\x64\x21\xa1\xc8\x15\xa5\xc2\x88\xdb\x65\x08\xb2\xe0\x35\x53\x8a\x4d\xb3\x04\x47\x1e\xce\xcb\xcf\x41\x31\x6c\x11\x41\xd4\x32\x14\x63\xb3\xf2\x91\x65\xed\xce\x45\x64\x1e\x8a\x3c\x36\x2f\x57\xe0\x8f\x1f\x5e\xcd\xdf\xdf\xba\x14\x09\x86\x00\xcb\x12\x8d\x97\xb6\x87\x06\xe0\x12\x91\x1a\xe7\x8f\x49\x39\xa5\x5d\x98\x96\xfd\xa9\x8a\x42\xff\xd3\x93\x0e\xe0\xce\x71\xe1\x14\x77\xae\x73\x94\x06\x6a\x89\x08\xd5\xec\x8c\x3b\x1c\x9c\x01\xc6\x05\x73\xad\x3f\xd9\xf4\x3b\xfb\xeb\xb6\x3d\x0d\x91\xe7\xb6\x81\xdf\x6a\x9b\xc7\x25\x68\x9c\x04\xf0\x6b\x0b\x4a\x88\x2a\xe0\x4b\x58\x9e\x10\x0c\x15\x0c\x53\x26\x43\x05\x8e\x01\x56\xb1\x58\xa5\xf6\x37\x0d\xc7\x9d\xe5\xdc\x75\xce\x49\xe1\x08\x09\x9c\x2b\x11\xea\xd9\xbe\x6a\x5e\x02\x36\xe7\x88\x85\x2b\x63\xac\xe5\x6d\xf6\xe3\xeb\x0d\xea\xcd\xb2\x76\xec\xdd\x30\x18\x43\x24\xd4\x0c\xa1\xe3\x21\x34\x7e\x57\x56\xf3\x34\x4d\x75\x5d\xd6\x25\xe7\xa7\x43\x8a\xff\xd0\xef\xa2\x3d\xbe\x5d\xfc\xf8\x4d\xbb\xc3\x57\x5b\xe0\x21\x79\xff\xac\x0a\xfc\xb2\x32\x6f\xf9\xbe\xd9\x06\xef\xae\x4b\xd0\xb4\xd8\x4d\xb1\xde\xc6\xfb\x59\x79\xe0\xa2\x44\x6b\xef\x17\x3b\x89\xa5\xd5\xac\x14\x18\x02\xb1\xc3\xb0\xc3\x81\x1a\x6b\x2e\x42\x88\xac\x31\xd6\xb8\xf6\x8b\x4f\x99\x0a\x2e\xd6\x48\xe5\x09\x7d\x64\xd9\x79\x47\x9e\xf8\xd5\x57\xe4\xd0\x3f\xdd\xfc\xba\xeb\x77\xfa\x02\x05\x79\x07\x3e\x3e\xbc\x7d\xf3\xf1\xe1\xaf\xd3\xa8\x61\xfd\x44\x2e\xf2\xf3\x8b\x95\x32\x1b\xc3\x31\x42\x06\x96\x1b\x2b\xb4\xe1\x15\x6c\x19\x41\xe5\xcc\x80\x39\x1e\x8f\xc7\x96\x40\x05\x09\x65\xa5\x2e\x17\x4b\xaa\x20\x86\x80\x82\x94\x26\x27\x3b\xe2\x1a\xdb\xda\x66\xf6\x67\xe8\x4b\x07\xfa\x4d\x11\xc6\xa6\x09\x63\xdb\xda\xa6\x09\xce\xd6\xa8\x71\x79\x53\x97\x4d\x95\xc3\x63\x47\xbb\xb6\x6e\xcb\xb6\x5e\xfc\x68\xf7\x58\xa5\xcd\x76\x7a\xcd\x89\x78\xab\x55\xba\xbb\xde\xd2\xa6\x9a\xaa\x6a\x8a\x5f\xdb\xe9\x4b\xc2\xea\x9d\x08\x0c\xa0\x19\xae\xb7\xe4\x77\x57\x1c\x12\x7b\x65\xa9\xad\x9c\xb6\x09\xb8\x22\xce\x9e\xd8\x2b\xae\x50\x9a\x0f\x91\xd3\xfc\x3b\x39\x8d\xb8\x0a\xdc\xce\x0a\xd9\xc8\xd0\x00\x74\x49\x00\x0a\x4d\xaa\xdd\xca\xc4\xee\x2a\x77\x39\x66\xee\x62\xcc\x46\x05\xc4\x0d\xa3\x50\x70\x18\xca\xda\x89\x4a\xbb\x8c\x18\xe6\x98\xd9\x31\x1f\x35\x58\xa2\x18\x6e\x33\x2e\x5f\x01\x59\xeb\x43\xaf\x44\x59\x95\x14\x20\xca\x0e\x56\x9b\xae\x6e\x79\x5b\xaf\xb1\x41\x77\xe5\xc8\xfa\x9b\x97\x5c\x40\xd9\xab\xb4\xc2\x1a\xab\xbe\x7b\xc8\x06\xd0\x22\xda\x30\x04\xf4\x5c\xe7\x69\xa2\x2a\x69\xa1\x97\x04\x17\xa1\x2a\x2a\xaf\xbd\x3b\x6c\x99\xd7\xc4\x37\x3e\x8c\x97\x53\x38\x95\x55\x59\xa7\x3a\xd4\x81\xd5\xb6\x01\xa7\x54\x26\xbb\x27\x7d\xed\xdb\x79\xfb\xeb\x18\xc9\x5b\xf7\xa7\x68\xc6\xbc\xc2\xa2\xbd\xd4\x16\x9c\xb2\x2a\x58\x08\xd4\xe5\x00\x4a\x18\xfc\xf8\x54\x23\xb8\xdc\x3a\xef\xb5\x6d\x4f\xd2\x9c\xd9\xb8\x23\xbe\xf9\xda\x6f\x68\x13\x60\x13\xca\x36\x14\x6d\xa8\xa5\xd5\xd6\x08\x6d\xa5\xa7\xab\xad\xcd\xa2\xde\x36\x8b\x55\x6c\x6f\xe3\x6a\x7e\x65\xfc\xb8\x32\xf3\xc5\x04\xff\x53\x8e\xfc\x9b\x84\xea\x3a\xd5\x5e\x8c\xe5\x36\x2b\x43\x5d\x16\xc0\x5c\x04\x70\x45\xb9\x2c\x6a\x57\x45\x8a\x2a\x2b\xc2\xc8\xf4\x35\x1d\xd5\xfa\xa5\xb5\xd4\x0b\xe5\x4c\xaa\x0d\x77\x4c\xef\xd8\x7c\xc0\xd8\x39\x8c\x81\xe0\xe1\x20\xe6\x43\xd0\xa1\x93\xbc\xf4\x90\x02\x6c\xea\xd0\xe2\xde\xb2\xca\x69\xc3\x23\x04\x34\xe2\x49\xd9\x46\xec\x74\xf2\xe7\x09\x4c\x70\xf2\x3f\xfd\x3a\x73\x96\xdd\xf8\xe0\x63\x6c\xf2\xf3\xc7\x87\x9f\x6f\x2f\xac\xb8\xd3\x07\xb0\x2c\x1c\x4f\x6a\x1f\x0f\xe9\xf6\xfd\xa7\x09\x90\x95\x24\x5b\x5f\x3c\x50\x61\x90\x8b\x57\xe4\xca\xee\x84\x6b\x9f\xe6\xce\x3b\xb7\x9c\x4f\x17\x8e\xa7\x6c\x08\x27\x23\x51\x5b\x33\x47\xc2\xc0\xa6\xed\x64\xd7\xaf\x20\xb4\x76\x35\xd2\x8c\x38\xd8\x3b\xad\x5d\xeb\x5c\x3b\x9f\x9c\x0b\x27\x4c\xac\xa2\x1c\xb8\x60\xc4\x72\x05\x76\x9b\x43\xcc\x61\x7c\x6f\x1c\x44\x69\x8c\xcf\x0f\x2f\xc7\xc1\xcb\x40\xd6\x66\x4a\xfd\x63\x52\x9e\xe7\xa6\x2f\xa7\x15\xd1\x7a\xbd\x95\x46\x3a\xe9\x00\xb3\x8e\x3b\xf7\x3c\x08\xca\x3e\x24\x5d\xc8\xfb\xe0\x79\x25\xb5\xd4\xd4\x5a\xcf\xe2\x79\x64\x8f\x7c\x73\x8c\xba\x8b\xff\x21\xf9\x3f\x92\xff\xf3\x96\x5b\xd8\x5e\x69\x5e\xd2\xec\x87\x5f\x91\x79\x47\xb8\xc2\x7a\x22\x5f\x31\x24\x45\x36\x91\xc5\x3b\xff\xf8\xe1\x6d\xf6\x62\xa9\xdb\x20\x4e\x04\xe5\x20\x09\xc7\x1c\x32\x6c\x88\x47\xa8\xcc\x4d\xc9\x08\x67\x5c\x4a\xc7\x59\x11\x92\xce\x55\x55\x5f\x53\x46\x30\x24\x04\x1e\xb9\x13\xa9\xf1\x0d\x2e\x4d\x81\xc2\x51\x15\x54\xd1\x9d\xa3\x54\x70\xd2\xf8\x60\xc2\xe9\x04\xca\x32\x54\x41\x84\xf1\x88\x26\x0b\x70\x63\x65\x3f\x81\x01\x8c\xa1\x00\xbd\xb7\xad\x99\x9d\xe2\x85\x2b\x78\x2a\xaa\xc0\xce\x04\x24\xa0\xcd\xc4\xe9\x74\xa9\x97\x75\xd1\x16\xe5\xa1\x27\x7d\xd4\x8b\x02\xf5\xde\xed\x6c\xf2\x3f\x27\xff\x7b\xc2\xe3\x6a\xfe\x22\xfb\xfd\xf9\x5d\xfa\x94\xfc\x8e\xe3\xff\xd9\x4b\xff\x16\x34\xf4\x17\xe0\xfe\xfd\x87\x77\x6b\x98\xf4\x65\xd5\xe9\xde\x04\x52\x22\x41\x9c\x32\x9c\x14\xb8\xb4\xdc\x69\x23\x98\x10\x82\xc1\x8b\x04\xd4\xc5\xc8\x43\x15\x0c\x15\x8c\x96\x8c\xc1\xd0\x94\xca\xd9\x0d\x2c\xaa\xa2\x83\xc8\x50\xfc\xb5\xd4\xc2\x08\x93\x96\x8a\x0b\xa1\xb6\xbd\x1f\x6b\xe7\xf8\xe4\x7b\x67\x70\xf0\x93\x22\x96\xeb\x11\xe0\xd0\x00\x2c\x8c\x74\x93\xe2\xb9\xcb\xc5\x70\xaa\xf9\x04\x4a\x50\xf7\x3d\x27\x44\xa8\xd9\x30\x2f\x94\xa4\x54\x68\x45\x93\xcd\xb5\x56\x6e\xb1\x26\x6e\x3d\x7f\xba\xee\xef\x6e\xd7\xfd\xcd\x6f\x5c\xf7\xfb\x6f\xae\x7b\x9a\xdd\x2e\xfb\xcb\x9e\xef\x0e\x8c\x48\xc2\x23\xcf\x30\x64\xc4\xf3\x0a\x63\x58\xd8\x52\x50\xc9\xa4\x56\x95\x12\xc5\x5c\x77\x7e\x9a\x40\x79\x64\x82\xb2\x92\x31\x74\xce\xeb\xaa\x4e\xcf\xd5\x2c\x4c\xc1\x34\x05\x27\x52\xba\x12\xed\x3c\x65\x82\xd3\xd6\x07\x7e\x3e\x2e\x17\x5e\x05\x1f\x06\x90\xa0\x93\x07\xa8\x75\x72\x9c\xc0\x08\x86\x50\x82\xc6\xda\xc6\xcc\x5d\x64\x3f\x10\x29\x0c\x45\xa8\x04\x30\x60\x4c\x9b\x69\xba\x34\xf0\xd8\xd3\xbe\xf7\x2d\xee\x56\xbd\x85\xcd\x4d\xaf\xe9\xf7\x6b\x15\xc3\xb5\x20\xff\x35\xe7\xd7\x9b\x7d\xfa\x7e\xd3\x80\x61\x39\xe7\x46\x30\x24\x04\x0d\xa4\x36\xbc\xa2\x66\xd5\x90\xae\xbe\x1e\x63\x15\x9f\xcc\xce\x6e\x0a\x27\x01\xca\xf3\xe2\xd7\xf2\x47\xb6\x39\xee\xc8\xb5\x46\xf8\x16\xaf\x7e\xd2\xba\x88\x92\x0e\x7f\x2c\xb7\x0f\x94\xf3\x36\xab\xab\xd9\xa7\x7a\x9e\x16\x6b\x05\xa5\x53\x18\x99\xa1\x18\x32\x86\xc2\x21\xf5\x9a\x7a\xaa\x02\x72\x50\x59\xb9\x61\x61\x98\x0f\x41\x0a\xd0\x80\x73\x7a\x0e\x05\x10\x7d\x38\x7a\xe7\xe7\xb3\x16\x45\x55\x30\x30\x89\xfe\x44\x4f\x3d\x45\xc7\x81\xf5\xcb\x39\xf8\xdd\x5a\x83\xb2\x69\xbf\xb7\x87\xbf\x79\xb5\x87\xdf\xbf\xdd\xbe\x64\x75\xb8\xb6\xfd\x35\x03\x4a\x4c\x15\xff\x1c\x09\xea\x9b\x5d\x3b\x0f\xa0\xfb\x42\x41\x3f\x8f\xd9\x29\x1c\x16\xdb\xe1\x89\x7a\xe1\x6b\xb2\x15\x5f\x9a\x76\x37\x5e\xce\xc2\x49\x5e\x4a\x45\x2f\x07\x30\x9a\x21\x9c\x14\x48\xb2\x01\x14\x47\x3d\x3e\x26\x9b\xd6\xf1\xe0\x81\xe6\x9c\xf3\xf3\xba\xbc\x76\x56\xd8\x21\x72\xef\xd0\x16\x2e\x6b\x1d\x53\x42\x1b\x2b\x96\xbe\xc8\x47\xb2\x29\x77\xf4\x8f\xf7\xe5\xe1\x6d\xf6\xe1\xe3\xc3\x87\x3f\xd5\x1e\x31\xd9\xe2\x76\xe4\x17\x07\xf2\x70\x4a\x73\x33\x99\xe5\xc7\xcc\x3c\xcb\x2f\x67\x91\xb5\xc1\x70\x4b\x70\x49\x29\x09\xba\xb5\x42\x6b\x9d\x1a\xc3\x1c\xd5\x3b\xea\xd5\xb2\x05\x2a\xa5\x54\xa8\x4e\xcb\x57\x40\x56\xf9\xa0\xaf\x7b\x9b\x21\xf4\xa0\x95\xf5\xda\x72\xbb\x6c\x6c\xbf\x4b\x93\x98\xdb\x33\x4f\xed\x7f\x48\xfe\x2e\xb2\xee\xfd\x87\x5b\x5d\xdd\x35\x73\xf9\xb0\xee\x0a\x9f\xbf\xab\x81\x7b\x45\xaa\x7f\xb8\x7b\x89\x86\xfd\xb8\x6e\xd6\x69\x07\x0e\x15\x18\x03\x4e\x93\x90\x54\xf3\x94\x16\x01\x45\x55\x3b\x30\x02\x7c\xe9\x81\x09\x2e\x2d\x80\x0a\x58\x09\xcd\x64\x2a\xb5\x76\xc2\xce\xb8\x66\x55\x45\xf2\x3a\xd7\x8f\xc9\xd9\x8d\x9e\x49\xaf\x77\xb9\xd6\x41\xe8\xc0\xb4\x06\x9d\x76\x55\x55\xcd\xb4\x69\x9a\x40\xb9\x34\x8a\xf1\x6a\x54\x7d\x27\x42\x0b\x4b\xec\xf0\x20\xa8\x04\x02\x9f\x5b\x3e\xac\x36\xfd\x01\x0c\x7b\xf8\xaa\x9f\x7f\x5a\xff\x60\xea\xda\xd4\xce\x36\x1d\x66\xd2\xce\x38\x1d\x67\x13\x59\x52\xd3\x0a\x1c\xbf\xd2\x14\xcf\x63\x7a\x4c\xd1\xae\x50\x2a\x30\x15\xa8\x52\xa0\x57\x3e\x36\xad\xae\xeb\x64\x93\xc2\x18\xa7\x59\xb5\x67\x56\x5e\xdf\x57\x73\x72\xfb\xc4\xa7\x79\xdd\xdf\x1e\xee\xee\x23\x41\xd5\x95\xec\xf6\x97\xf7\xe0\xe3\xfd\xdb\xcc\x1f\xfd\x71\x63\xaa\x4b\x9b\xf1\x79\x50\xac\xa6\xb8\xc1\x64\xec\x0f\x87\x2a\x9c\x61\x98\xe4\xb1\x3c\x1c\xba\x03\x66\xe0\x1c\xce\x1b\x1d\x9a\x79\x0c\x92\x5f\x65\x6c\x20\x60\xed\xa0\x6d\xac\x95\xf1\x67\x1f\x8d\xb7\xb1\xf7\xd5\xe0\xcf\x31\xaa\x7f\x3e\x27\xc9\x36\xb3\x8f\x3c\xe6\x96\xb7\xb1\xd6\xe3\xa6\xc0\xb8\xff\xe5\xfd\x9b\x77\xe9\xfe\xf7\x7f\xb3\x7a\x53\x51\x28\x7c\x25\xf0\x59\xf6\xa7\x9b\x60\x4c\xf6\xe1\xf7\xef\x3e\xbc\x7d\x78\xf3\x69\x19\xd9\xef\x6e\x10\x34\xc8\x90\x44\x4c\x38\xae\x8b\xbc\x28\x8a\xdc\x15\x5e\x63\x55\xcb\xd1\xc0\x22\x0f\xb6\x72\x82\xa6\x79\xee\xf3\xd3\xa9\x20\xf3\x61\x19\x11\xf9\x32\x63\x35\x63\x3b\x2b\x24\x11\x62\x3e\xc0\x40\xce\x50\x73\xa1\x0d\x0a\x1e\xe0\xda\xa9\xfe\x04\x68\x0f\xf4\xdc\x07\x14\x11\xcc\x0c\x24\x69\x05\x4a\xef\xdc\xdc\xb4\x20\xb7\xcd\x7c\x32\x00\x5d\xb5\x0d\x57\x5e\xff\x5f\xae\xca\x7d\xef\x76\xfb\x1f\x62\xfc\xf2\x61\xb9\xe0\xcb\xd3\x2b\x85\xcf\xdd\xfd\xc7\x87\x8f\xfb\xf7\x3f\xbd\xbb\xff\xe5\xfd\x2e\xfb\xf0\xe9\x9f\xc0\xc3\xfd\x5f\x83\x0f\x1f\xb7\x95\x2f\xca\xe1\xc8\x39\xef\x00\x0f\x43\x35\x89\x53\x63\xc2\x24\x40\xc1\xc3\x11\xf0\xca\x1b\x40\x4a\x20\x85\xe4\x7d\x9b\x77\x80\x77\x3b\x8b\x10\x0c\x67\x57\x11\x46\x9b\xf9\x1c\x26\x5b\xd7\x00\x86\xa9\xf5\xdd\x29\xcd\x1b\x6a\xcd\x54\x0b\x67\x2e\x27\x82\xbd\x57\xe7\x68\x13\xdb\x47\x96\x75\x11\x5b\x7d\x17\x73\xa0\x37\x2f\xef\xa9\x86\xe6\xed\xc3\x0a\x24\x5f\xe9\x20\xbf\x45\x01\x7d\xfe\xf1\xdd\xa7\xfd\x4b\xd5\x8e\x35\x20\xd6\x54\x51\x9e\x41\x45\x8a\xbe\x3a\x2d\xe7\xd3\x11\x21\x82\xd0\x51\x52\x21\x04\x67\x4c\x6a\x62\xb8\x90\x54\x70\x7a\xc6\x88\x42\x0c\x2a\x0c\x09\x42\x2a\xde\xef\x8c\xb1\xfe\xcb\xd1\x6d\x9b\xaf\x6a\x53\x42\x2a\xb8\xa2\x04\x1f\x0f\xdd\x20\xba\x66\x68\x64\x7b\x6c\x2b\xee\xaa\xb6\xa5\x82\x29\x5a\x52\xc1\x24\x0b\x87\xf8\xb6\xa5\x4f\x8b\x9f\x06\xb7\x2b\x27\xd8\xaa\x00\xfc\x3f\x44\x1e\xcf\x67\xe7\x39\x1a\x36\xe0\xfe\xba\xfd\xfc\xfd\x6b\x7c\xd3\x0a\x98\x7b\xf7\xa2\x57\xd7\x7a\xd6\x24\x2b\xaa\xaf\x85\x4f\x55\x9d\xc1\x2f\x6a\x33\x7d\x2d\x52\xa8\x05\x97\xea\x74\x1c\x7a\x6f\x7d\x37\xb4\xaa\x1b\x5d\xd0\x02\x24\xd3\x78\x28\xe2\xdf\xb2\xde\x08\x2e\x75\x18\xe3\x6f\x1b\x2c\xbf\x1a\x4a\x37\x0e\x30\xe9\xbe\x1e\x33\x02\x09\x53\x9c\xa2\xa5\xc3\xb4\xf2\xd6\xab\xca\xeb\xde\xc9\xda\x68\x4d\x98\x12\x84\xc4\xfb\x16\x33\xc9\x71\x92\xec\x63\xbd\xa6\xbe\xc6\xd9\xee\xae\x73\xe5\xdf\xbd\x8e\xb8\x6d\x9f\x04\xa3\x97\x59\x71\x15\x94\x58\x56\xf9\x77\xbb\x9b\x75\x97\x66\x4f\x11\x83\xd5\xce\xde\xeb\xea\x62\xab\x2a\xb3\x17\x9b\x8e\x94\x30\x42\xe6\x1a\xf4\x3a\x3f\x9d\xf2\x92\x20\xcd\x24\x84\x85\x2a\x94\xc4\x4c\x2c\xdb\x71\x1e\x48\x09\x54\xa8\xac\xd6\xe7\xbc\x3d\x96\xd3\x8e\xfc\xa1\x50\x6a\x37\x7d\x49\xb6\x1a\x21\xc2\x29\x72\x7d\xef\x1e\x93\xd6\xf7\x38\x8c\xbd\xb3\x70\x72\x8b\x19\x64\x41\x0e\xa4\x09\x5a\xb7\xa1\xd6\x8a\x59\x9e\x24\x69\x62\x1e\x59\xac\xab\xb8\xbb\x72\xfc\xac\x75\xa1\xef\xaf\xa1\xca\x0f\x6f\xa2\xd1\x05\xa4\x3d\x51\x86\x88\x55\xf6\x64\x65\xae\x76\x26\x8c\x17\x29\x44\x1e\xd8\xd6\x5c\xd0\x46\x5e\x28\x4b\xa7\x65\x4c\x67\xc5\xab\x73\xb4\xc6\x75\xe9\xf7\xcf\xd1\xfb\x68\xe1\x5d\xcf\xd1\xef\xff\xe8\x49\xf2\x97\xde\xfb\x8c\x5e\xfa\xb4\x26\x98\x62\x32\x0f\xa0\xc9\xf5\xf1\x90\x97\x08\x29\x2a\x50\x91\xab\x42\x4a\x44\x19\x53\x14\x15\x41\x94\x40\x84\xc6\x28\x75\x2a\xda\xb1\x3c\xbd\x38\x49\x06\x63\xbc\x9e\x24\x1b\xce\x8d\xeb\x51\x18\x7a\xa4\xdc\xd3\x59\xc2\x80\xda\xa0\x55\x1f\x2a\x2d\xb9\xe1\x6b\xee\xa0\x7b\xa4\x7b\xb6\x69\x63\xbf\xbe\xdb\xab\x77\xf7\xbf\x2c\x3b\xfc\x95\x99\xe5\xd9\xb0\xff\xfc\x12\xd5\xfa\xdc\xab\x15\xea\xb6\x67\xf5\x97\xb6\xae\xb7\xfc\x4b\x4b\xd2\x2a\xf7\x35\xd6\x08\x56\x81\x15\x94\x53\x2b\x0c\x45\x04\x1a\x28\x84\x92\xca\xb1\x2a\x22\x76\xd8\xb2\x01\xd9\xd3\x09\xe8\xe2\x1c\x0e\x05\x20\x9b\xf6\x8b\xa7\x74\xab\xbf\x8a\x0d\xac\x29\x31\x02\x51\x6a\x86\xda\x34\xf8\xe4\x4d\x8d\x2a\x55\x4b\xa6\x84\x3c\x80\x84\x87\x46\xb9\x70\xd0\x18\x59\xf8\xa2\x4f\xe7\xd8\xa7\x55\x8b\xe3\xdf\x7f\xb7\x4f\xbf\xfc\x7f\xec\x54\x59\xbe\xec\x95\x65\xaf\x7b\x25\xe1\xac\x7e\xdd\xab\xf3\x17\x46\xe9\xb6\xfb\x5a\x6e\x64\x4b\xa9\x25\x08\x51\x66\x0e\x8d\xed\xf0\xb9\xb6\x2d\xae\x74\x23\xb9\x12\xfa\x00\x4a\x11\x2a\x55\x85\x41\x13\xec\xd0\xba\xdf\x2f\xfb\x99\xdf\xe2\xe4\x9f\x47\xed\xd6\x8f\xc9\x3f\xae\x55\x77\xb7\x4c\xe7\x53\x98\xf2\xa5\x3d\x79\x0b\xe8\xfd\xbc\xfc\xe1\xa6\x1a\x74\xc5\xbe\xe1\xad\xfc\x52\x6f\xc6\xaf\x6a\x53\x7d\xc5\x59\x9e\xc1\x70\x5e\x3c\x77\x61\xb5\x80\x46\x93\x2f\xe3\x16\x07\x17\x23\x10\x97\x24\x4b\xc2\x00\x44\x11\x7c\x60\x25\x60\x61\x00\xbd\x57\x4a\xfb\x2d\x9e\x4f\x5a\x1a\x19\xca\xd0\x6a\xe3\xb4\x28\x6b\xc8\xb4\xd1\xca\x2a\xa3\x4a\x83\xa0\x2b\x4c\x28\xb8\xd0\xea\x5a\x97\x61\xb7\x65\xac\xf1\xfd\x0d\x0e\x1a\x0b\x0e\xcd\x33\x07\x4d\x13\xd0\xae\x94\x52\x4a\xf7\x5c\xb7\xba\x19\x62\x7d\x56\x11\x2b\xe5\xaf\xd4\x75\x4f\x05\x59\xbf\x2a\xd0\xea\xea\x12\x82\x63\x38\xa3\xb2\x82\xc4\x4b\xa3\x0f\x59\xeb\x71\x4a\x42\x8f\xa1\xc7\xcc\x53\x69\xbb\x9d\x83\x04\xaf\xd5\x59\x8a\x1b\xd7\xdf\x4a\xb5\x14\x57\x3e\x59\xb9\x9b\xab\xab\xc6\xf4\x95\x5d\xe2\x16\xdf\xda\xbe\x4b\xb3\x18\x2a\xf9\x01\xfc\xf0\x66\x9f\x66\x69\x97\x26\x98\x35\x1c\x83\xf3\x57\x91\xf9\xce\x57\xa0\xff\x72\x4c\xdb\x66\x3e\x5b\xd4\x22\xbb\x85\xb5\x23\x75\x5f\x31\x32\x0f\x41\x56\x15\x98\xc0\x39\x88\xc0\x31\x18\xc0\xaa\xad\x9a\xba\x6b\x0e\xec\x77\x11\x0d\xf7\xac\x66\x7d\x05\xa6\x3d\x41\xba\x62\xdd\xd1\x0f\x1f\xef\x36\x27\x8e\xc0\xf4\xd5\x80\x09\xb1\x34\x61\x14\xe5\x3e\x97\x8d\x67\xc1\xb8\xca\x58\xb3\x33\x55\x53\x55\xde\xcc\xee\xa2\x19\xf1\xa8\xd3\x54\x65\x28\x54\xa7\x70\x30\x4e\x82\xf2\x08\xea\x15\x0b\xea\xae\x58\xd0\xdf\xc5\xf3\xfa\xdc\xc3\x6f\x8f\x5b\x44\x3f\x3d\xeb\x81\x43\xb4\x66\x08\xf8\x0b\x4d\xcf\x18\x96\xb9\xcb\x99\x33\x34\x0c\x27\x33\x6e\x89\xb7\xd8\xb7\xd5\xe1\xa2\x18\xad\xd1\xa0\xa9\xcc\x70\xa8\x82\x38\xda\x0e\x34\xcb\x11\xd3\xd4\xc7\x1c\x08\x4c\xb2\x88\x58\x8b\xb1\xc2\xb7\xf7\xe9\x3e\xf2\x97\xfc\x70\xe5\x2f\x79\x73\x9f\xc1\x4d\xf1\x75\xf2\xdb\x64\xae\x8e\x07\xa0\x40\x2b\x74\x35\xb8\x86\x86\x22\x94\x0c\xa0\x26\xc0\x1d\xac\x02\xae\xe7\xe1\x58\xa8\xa1\x65\xa1\x0f\x8e\xb5\xa6\xa8\x00\x07\x63\xd4\x5f\xa7\x51\x2b\x60\xf1\xd1\x17\x1f\xe0\xff\x7a\xf2\xd1\x5f\xa2\xda\xd7\xee\xfd\xfc\xf0\x12\xd6\xfe\xf9\xc7\x2b\xa2\x7d\xfb\x6e\xbb\xbe\xf1\x59\xde\xe5\xe7\x7d\x94\x10\x7f\x7e\xe7\x16\x6a\x29\xa4\x4e\x45\x31\x37\x88\xd5\x4e\x5a\x5f\x0b\x54\xfa\x52\x8a\xfa\x31\xc9\xcf\x61\xa4\x00\x9e\x14\x0c\xae\x04\x14\xe3\x8a\x10\x62\x17\x97\x2b\x1d\x8a\x59\xdb\xae\x92\x55\xc3\x5b\x84\xcb\x0a\x2a\xd1\x87\xf3\xd9\x1d\x29\xa0\x67\x85\x96\xc5\x5e\x63\x5c\x61\xba\xf3\x88\x2a\x4a\x64\xc5\x08\x63\x5c\x73\x6a\x2b\x54\xeb\x83\xe0\x8e\x72\x83\xb1\x47\x52\x63\xab\xe6\x01\x73\xc5\xa9\xa9\x78\xc3\xa5\x92\x9c\x89\x0e\xb5\xf6\x2c\x11\x71\x4c\x3a\x46\x2b\xac\x0c\x76\x66\x39\xff\xfc\x1a\xaf\x5d\xeb\x6a\xee\x9f\xea\x6a\x96\xdb\xdf\x81\x27\x8e\xac\x48\x88\xf7\x36\x75\x80\xd6\x75\x70\xc0\x44\xc2\xc0\x3e\x5b\x23\x2e\x2e\x98\xba\x06\x62\xbb\x34\x76\x00\xae\x02\xbc\x5a\xf3\x31\x6d\x15\xcc\x9e\x84\x15\xcf\x95\xa6\xfa\xbf\xe8\x58\x0d\x20\x75\x1d\x05\x88\x46\x80\xc3\x90\xe9\xe8\xf3\xda\xb0\x18\x9e\xfc\x8f\x1c\x6b\x93\x1e\xae\x36\xf2\x8f\xc9\x5f\x3f\xab\x70\xbd\xdd\x45\xb5\xe8\x9b\x19\xb6\x5c\xbd\x98\x52\xbb\xdf\xbd\xdc\x15\x36\xca\xd3\x94\xbb\xee\x00\x72\x16\x0e\xd3\x31\x34\x04\xc0\x5e\x4b\x42\x2c\x48\xa8\xf6\xad\x0c\x65\x99\x0e\xf5\xec\xeb\x3a\xd5\xb3\xdf\x59\xec\xfd\xb9\xb6\xcc\xf3\xba\x92\x9e\x1b\xe5\x29\x91\x93\xaa\xb4\x6f\xd1\x0c\x67\x28\x65\x7a\x0c\x05\x10\x6b\x8c\x50\xef\x9b\x14\x46\xec\xf1\xdf\x44\x1c\xef\xd5\x16\x7c\xb3\x4f\x6f\x5e\xe6\xe7\x2b\x59\xd0\xfd\x43\xf4\x34\x97\x19\xbe\x29\x0d\xaf\xb8\xce\x50\x25\x1b\xe1\x2f\xa8\xc6\xae\xaa\x0c\x29\x6a\xcc\x75\x90\xac\x51\x67\x67\x9d\xad\x53\xe8\x5b\xda\xba\xe2\xf0\x98\x30\x90\x8f\x34\x58\x8c\x72\x51\xb1\xc7\x04\x22\x21\x41\x2d\xc2\xd8\xea\x71\xb9\x16\x2c\x9e\x1f\x93\xfc\x79\xac\x47\x78\x22\x43\x5b\xa9\x14\xdf\xad\x48\xd8\x1f\xff\x11\xec\x1f\xe0\x4f\xb1\xfa\xfe\xcd\x87\xdf\xef\x7f\x7c\xb7\x39\xac\x2c\xca\xe7\xaf\xbc\xae\x0f\x79\x64\xa5\xf6\xe3\x40\x7c\x68\x82\xd3\xcc\x54\x53\x5e\x97\xaa\xdd\x99\xc7\xa4\x7a\x4c\xaa\xb8\x67\x9c\xa6\x2a\x74\xb0\xae\x9b\xa3\x93\x20\x4f\x93\xb6\xee\xa2\xcd\x91\x6f\xc6\xa8\x2b\x68\x5e\xf0\xdd\xfc\xeb\xe4\x7f\x49\xfe\xe3\x0b\xd6\x9b\xfb\xbb\x87\x9b\xdd\xfc\x0f\x9f\xaf\xb1\xdb\x6b\xb4\x01\x5c\x1f\xdf\xfc\xf2\xfe\xe1\xed\xa7\xed\x6f\xb3\xcc\x6f\x0e\xa0\x34\x71\xec\x24\x98\x20\x59\xe4\x53\x18\x4a\x6f\x1f\x13\x90\x84\x53\x65\xed\xd9\x04\xbf\xdc\xe7\x25\x64\x34\x20\xd0\x7b\x63\x98\x61\xa4\x64\x1c\x07\x5a\x0b\xa2\x31\x5f\x76\x1f\x27\xe7\x4e\x28\x02\x4b\x9a\xdb\xdc\xa6\x4c\x86\xd6\x18\x13\xea\x18\x49\xc1\x48\xe7\x67\xce\x4d\x38\x49\x56\xd8\x82\x82\x04\x33\x41\x78\xe4\x90\xcd\xda\xa8\xbb\x0b\x5f\xfb\xe7\xdf\x22\x3e\x7f\xcd\xe7\x93\x9d\x33\x11\xd6\x88\x74\x73\x29\x41\x13\x35\x2e\xeb\x6a\x18\x80\xec\xe7\x63\x7c\xd8\xc1\x8b\x3a\x55\xa7\xaa\x3a\x55\xa7\xb4\x98\xa6\x69\xae\x4e\xa7\xd3\x72\x4c\x7d\xad\xdf\x59\x59\x58\x3f\x44\xf4\xc1\x37\x51\x7d\xf0\x22\x3c\xf6\x37\x60\xcd\x37\xbf\xf4\x52\x5e\x4c\x8f\x4d\xb2\xcc\x33\x1e\x5a\xd0\x5c\x10\xa8\x42\x9b\xaa\xd6\x6b\x57\x07\x6d\x65\xad\xfd\xd9\x43\x0c\x1c\x33\xdd\xc8\xce\xfd\x18\x8e\x0c\xe4\xad\x58\x0c\x55\x90\x70\xae\xe4\xe2\xfe\x6e\x87\xb6\xf5\xad\xf7\x6d\xa8\x4c\x6d\x5b\xa3\x59\x53\x69\x07\xa1\xe0\xae\xb7\x9a\x56\xcc\x57\xac\x26\x5a\x28\x4a\xf4\x20\xb4\x90\x2e\x4f\x56\xdf\xdd\xc6\x7e\x64\xc9\x3e\xf2\x43\xfc\x77\x2b\x93\x6c\xf6\xe1\x2e\x26\x1d\x5e\xd1\x44\xbc\xfb\xf4\xf9\xe1\xc7\x27\xe2\xdd\x2b\x22\x7d\x53\x7b\x3f\x39\x07\xce\x24\xcd\x4b\xcb\x0d\x97\x4a\x18\xe1\x98\xea\x48\xd9\xc0\xb9\x02\xd2\x47\x98\x6f\xf7\x75\x02\x43\xa8\x77\xe6\x52\x66\xcd\xc5\xa5\x27\x1f\xdc\x51\x09\xc7\xac\xe1\x96\x9b\x1e\xe9\xbe\xbd\xb4\x75\xed\xe3\xb8\x8e\x6d\x8b\xfc\xb9\x71\xef\xfa\x31\xf9\xab\xe4\xef\x23\x8f\xc4\xba\x57\x3e\x1b\x5e\xfb\x34\xbb\x7b\xb8\x7b\xf3\xf9\xc7\x77\x77\x0f\x3f\xbf\xfe\xc3\xfb\xf8\x87\x1f\xde\xdc\x3d\x64\x6a\x83\xbe\x1e\xc0\x91\x0b\x88\x20\x45\x50\x14\xd4\x39\x46\x61\x93\x71\xce\x23\x60\x05\xca\x92\x39\x87\x25\xee\x77\xb0\x6a\xbf\x96\x5c\x14\xae\x60\xa7\x12\x60\x90\x5f\xd0\xd6\x87\xa6\x3c\x4d\xa9\x77\xcb\x5f\x96\x2d\x78\x82\x20\x9f\x2e\x6a\xeb\x43\x5b\x84\x53\x38\xa6\x53\x92\x65\xd3\x62\x37\xee\xf0\x15\xc3\x9d\x80\x2b\xd3\xd2\xca\xe9\xf1\xab\xd9\x73\xa3\x6a\xd8\xb0\x54\xcf\x32\x23\x97\x21\xad\x67\x9f\x26\xbe\xeb\xb8\x8f\xf9\x27\x3e\x37\xa9\x08\x46\x31\x47\xd5\x66\x6a\xfd\xe5\xec\xdb\x60\xbd\x0f\x5c\x8b\xbc\xca\x19\xa8\xfc\xc1\x3a\xee\x6c\xb2\xcd\xba\x38\x1e\xd1\xd3\x4c\xff\xfb\xe7\xbc\xe6\x6d\x51\x7e\x29\x88\x77\x9b\xe9\x2f\xf1\xb9\x59\x97\x8d\x41\x2d\x73\x20\x72\x5b\xe2\xd0\x9c\xcc\x40\x6a\x69\xb9\x65\x12\x17\xa1\x01\x32\x88\x65\x5e\x88\xae\x0b\xcd\xfa\xb8\x43\xbe\x99\x93\xa3\xb7\x45\x5d\x54\x96\x78\x2c\xb4\xe7\x86\xab\x26\x4b\x9a\x50\xb6\x6d\x1b\x60\xdb\xb6\xc9\x26\xf3\x57\xed\xa2\x95\xb7\xf8\x5f\xbe\xd2\x85\x89\x2b\xf0\xb5\x74\xf9\xe6\xc9\xef\x77\xdb\xf7\xff\x16\x5c\xdb\xbb\x6d\x28\x04\xf6\xa2\x80\x81\x44\x58\x5d\xeb\x3a\xe5\xb5\xac\x84\xa7\x4e\x98\x7e\x90\x87\x36\x6f\xc3\x49\xf6\x53\x69\x84\xe5\x52\xef\xac\xf5\x55\x65\x64\xe0\x22\x4c\xb5\xed\x86\x76\xe4\x43\x1b\x46\x79\x6a\x47\xd1\xd8\x31\xef\x9d\x97\x3d\x6a\x0f\x72\xa8\xea\x75\x3f\x3b\x3e\xae\xba\x0e\x6b\xfb\xfe\xdb\xdf\x6a\xdf\xcb\x68\xc3\x4f\x1f\x6f\x86\x0c\xa7\x10\x0c\x5f\x47\x30\x40\xa2\xac\x1f\xd4\x90\x56\x9d\xae\x54\x17\x1a\x61\x0c\xf7\xd2\x1e\x27\xd5\x87\xd3\x10\x1a\x09\x44\xeb\xe4\xeb\xf6\x99\x6e\x6c\x07\x31\xb4\x61\xe8\xab\xba\x97\xc7\xe6\x20\x5a\x39\xe5\xa3\xf3\x55\xd7\x8c\xc9\x3e\xe1\x8f\x6e\x93\xec\x4c\xf2\x67\x51\xcb\xe2\xaf\x12\x18\x2b\xf0\x6e\x3b\xee\x87\x6b\xdd\xf3\x36\x16\xc9\xfc\x8a\x0f\x22\x92\x41\x83\xd6\x13\x20\x31\x3d\xcc\x10\x23\x76\x06\x09\x23\x61\x22\x42\x54\x15\x58\x1c\xab\xf8\xd0\x96\xc1\x07\x4c\xc0\x71\x67\xb0\x71\x5a\x5e\x9a\xac\x40\xc8\x9f\xa7\x35\x22\x7c\x38\x1c\xe6\xe1\x78\x3c\x06\x66\x8d\xa8\x17\xdf\x3f\xea\x94\x2c\x36\xf4\x5f\xdf\x2a\x59\x9f\x43\xa2\xf7\x2f\x4c\x8f\xfb\x8f\xf7\xb7\x34\x8b\x6e\x18\x3b\x87\x35\x84\xab\x83\xaf\x43\x05\x54\x58\x13\x42\x1d\x0f\x3d\x27\x1e\xf3\x9d\xc1\xad\xab\xc2\x29\xfe\x60\x30\x56\xa0\x5c\x7e\x9a\x4e\x3b\xea\x55\x92\xec\x13\xf5\xa8\xf6\x55\xd6\x47\x7e\xfe\x17\x38\x8b\xeb\xf9\xb8\xbf\xbb\xbf\x8b\x11\xb9\x4f\x9f\xef\xb7\x6f\x6f\xf9\x80\xb7\xf7\x91\xbd\x27\x5a\xc0\x42\xe1\x34\x29\x4a\xc0\xbf\x54\x8a\x83\xda\xa4\x09\x2c\xc3\x62\x68\x8d\x81\x6c\x70\x20\xb3\x07\x63\xa4\x0f\xbe\x14\x7b\x7c\x1e\xb3\x5e\x60\x45\xd0\x3c\x02\x81\x6d\x87\x11\x3e\x2c\xae\x92\x54\xcb\x5d\xe8\x6f\xfa\x37\xa9\x89\xe3\xfb\xca\xf3\xb3\xf2\x13\xdd\xb8\x7d\x9f\x88\xbf\xdf\x5f\x39\xe3\xd7\xe2\xf4\x78\x4e\xfa\xd4\x2f\xdd\x26\xa0\xd0\xb4\x22\x0c\xc8\x8b\x45\x68\x53\x06\x7c\x00\x50\x04\x77\x0a\xc9\x14\x5a\x76\x6a\x83\x4d\x21\x46\xf3\x00\x84\xa6\x96\xea\xad\xb4\x35\x31\xda\x78\xa2\xa5\xa3\xd8\x39\x52\x9b\xd3\x64\x3c\x77\x0e\x53\x50\x73\xc9\x25\x4f\x92\x4d\xac\x35\x6e\x76\x2e\xae\xed\xf7\xd1\x4e\x7b\x81\xd2\x7a\x19\x0d\x5c\xa1\x5a\xab\x22\xe6\xdb\x62\xfb\xfe\xd3\x5d\xd6\x00\x07\xb1\xe5\x18\x74\x42\xd7\xf5\x81\x9e\x87\xf6\x2c\x8f\x95\xd7\x3a\x4d\x9c\x0c\x58\x02\x54\xd7\xa1\xac\xc2\xd9\x9d\xb7\x03\x21\x5c\xa8\xaa\x77\x02\x57\xc4\x6a\xe6\x18\x77\xfd\xa4\xad\x9d\x0f\x97\x21\x23\x53\xa8\x26\x35\x00\x94\xac\xe3\x39\xf2\x1f\xff\xff\x5f\x65\x0e\xd6\xeb\xf7\xfb\x38\x9e\xf7\xef\x7f\x58\x36\x9b\x75\x38\xbf\xb2\x46\xd6\xe1\x2c\x3c\x06\x48\xb6\xb3\xc7\xb4\x3b\x12\x34\x0a\xc8\x95\x3a\xe9\xd0\x2c\xf7\x1e\x86\x31\x78\x02\xec\xce\x20\xeb\x60\x77\xe9\xd2\x89\x38\x90\x9c\xb5\x6a\x51\xa8\x8f\xc7\xe3\xdc\x9d\x4e\xa7\xdb\x40\x06\x9b\x3a\x59\xeb\xbe\xee\x5f\xb0\xff\xdc\xc8\x98\x9f\x86\x72\x64\x81\x7e\xf8\xf8\x61\xdb\xfa\x12\x02\x1b\x04\x15\x4d\x4c\x08\x86\x93\x0f\x2d\xe0\x61\x84\x92\x55\xfd\xce\x42\xad\xdc\xa9\x59\x5e\xb7\x67\xb7\xd8\xf1\xee\xec\x9a\xa3\x8b\xb5\xcb\x7c\x7f\x88\xfc\xc2\xe5\x53\x84\xfc\x05\xbf\xf0\xee\x4a\x30\x3c\x31\xe8\x21\xcf\x41\x4e\x07\x40\x01\x62\xc1\x1f\x46\x26\x15\x26\x47\xfb\x2d\xc5\xb0\x56\x9c\xdb\xb4\x4b\xd2\x74\x8c\x75\x49\x7f\xf4\x7f\xf7\x91\xbc\x38\x07\x09\x7b\xf5\xbf\x09\x3e\x98\xdf\xfa\xdf\x20\xf3\x8f\x6c\x6b\x76\x26\xf2\x34\xaf\x04\xd1\x8b\xc5\xba\x39\x56\x54\x78\x42\xd9\x69\x67\xf0\xf1\xf0\xa5\xdb\x14\x5a\x54\xab\x7f\x0d\xb2\xee\x91\xef\xcd\x0e\xad\x9a\xa3\x2f\x31\x99\xbf\x42\x33\x7e\xfa\x7c\x9f\x75\x59\x1f\x24\x44\x60\x10\x12\x61\x68\x90\x76\xda\x69\x0f\x4a\x54\x06\xb7\x43\x55\xed\xbf\x56\x82\xe7\x96\x66\xdd\x85\xad\xb7\xaf\x6e\x9b\xfb\x7a\xc5\x86\x2c\xe3\xc9\x5d\x6d\xb1\x67\xcc\xd3\x13\xc6\xef\xb6\x40\xfe\x67\x47\x94\xf6\x05\x04\x04\x91\x7e\x56\x25\x64\xc3\x44\xd1\x91\x52\x6e\xcc\xd9\x06\xb7\xdc\x57\x65\xe8\x83\x26\xa0\xde\x19\x4c\xe8\xb2\x3c\xb6\xe9\x19\xc2\xb8\x3c\x1a\x11\xaa\x6f\x47\xd5\xad\x5d\xfd\x6f\x8c\xf3\xdd\x75\x9c\x2f\xcb\xf6\xc3\x6f\x2e\xdb\xde\x13\xc0\x31\x1d\x66\xce\xd8\x01\x24\x14\x9f\x19\x15\xce\x81\xdc\x05\x1d\x1f\x9a\x32\x34\x41\x10\xd0\xdf\x16\xed\x36\x4b\x58\x6c\x94\xe5\xdf\x69\xd4\x3e\xf2\x8e\x56\x3b\x97\xfc\x59\xf2\xc3\x13\xeb\xd5\x95\x05\x3c\x4a\xcf\x44\x62\x8d\xdd\xcf\xfb\xfb\xcf\xe0\xdb\x74\xd6\x62\x7a\x09\xa0\xbe\x38\x86\x97\x6d\xcc\xe2\xf4\x88\x2e\x47\x91\x7a\x79\x59\x99\x3e\x15\x38\x7c\xed\x6f\xcf\xbe\xb0\x65\xed\xdc\xa2\xf9\x00\x3c\x82\x66\x3c\x33\xaa\x09\x5e\x56\xcc\x65\x3b\x19\x96\xbb\x75\xed\xbc\xf2\x01\x83\xe1\x5b\x3e\xe0\x77\xdf\xe7\x03\x06\xc3\x6c\x19\x4b\xed\x51\x86\x51\xc6\x1a\x06\xf2\xc8\x36\x68\xe7\x6e\x8a\x44\xcf\x95\x56\xf7\x4f\xa4\x7b\x57\xcb\x67\x35\xbe\x57\x8d\x9d\xa5\x4b\x6f\xef\x3f\xa6\xa8\x82\x63\xa7\x9b\xde\x75\xa0\x8c\xcb\xdd\x38\x9f\x3a\x8f\xb0\x75\xc2\x95\x70\x0c\x27\x8a\xa0\x01\xb4\x8c\x59\x11\xb3\x73\x98\xfa\xce\x74\x76\xf0\x94\x70\xa1\x67\x12\x3c\xe5\x84\xf0\xba\xe5\x04\x6b\xc9\x36\xbe\x2c\xcd\x31\x48\xef\xc3\xc9\x2f\x93\x61\x1f\xfd\x72\x19\x63\xe4\x3f\x47\xa4\xec\x2d\x47\xb6\xcc\xa5\xcf\xb7\x66\xed\xdf\xdf\xfd\xf4\x77\xa0\x78\x06\xe5\x3d\xa4\x2b\x2d\xf8\x33\xff\xc7\xed\x72\x44\xfe\xb9\x0d\x55\xdd\xe9\x40\xad\xa0\x3e\x2f\xda\x9a\x83\x02\x88\xd4\x49\x8b\x28\x64\x18\xc3\xfc\x50\x1c\xdc\x98\xdb\x54\xd6\x97\xa1\x5e\xbd\x9c\x09\xb0\xcb\x70\x7b\x16\xba\x9d\x31\x02\x07\x67\x1d\xa9\x7b\x8a\x91\x13\x3c\x35\x64\x1e\x0e\x45\x55\x68\x60\x02\x3f\xf0\x11\xa8\x99\x5d\x0c\xe7\x99\x0b\x6d\xdf\xf7\xf3\x69\x18\x86\xd5\x5e\xaa\x1f\x45\x8c\x63\xfd\xbb\x84\x25\xff\x31\xf9\xbf\x6f\x1c\x35\xeb\xee\xff\x8f\xe0\x1f\x3e\x5e\x73\xb9\xab\x0e\x54\x44\x31\xdd\xaa\xdd\x22\xfb\xdb\xb3\x1e\xe7\xdb\x48\x8a\xf8\xe9\x4d\xd4\xfe\xbb\xbf\xfb\xfd\x9b\x65\x5e\xbc\xfb\x56\xc3\x79\x63\xab\x12\xa6\x3a\x58\xd0\x04\x81\x1d\x66\x28\xb7\xa5\x0c\x03\xef\x34\x0d\xcd\x10\x4e\xa0\x1c\x80\xa0\xcb\xf3\xf3\x79\x79\x16\x3c\xc0\xf0\x04\xd4\xe5\x0c\xc4\x00\xb0\xe6\x25\x22\x14\x23\x48\x10\x42\x88\x20\x58\xee\x0c\x62\x38\xd8\xf6\x72\x1e\x72\xa4\x48\x4d\x19\xf7\x83\x92\x5a\xaa\x01\x1c\x6f\x4f\x4a\x60\xf9\x1f\xba\xcd\xe4\xfd\x57\x4e\x33\x3e\x9f\xd2\x12\x23\x29\x1d\x37\x1c\x31\x2a\x05\x23\x84\xd2\x88\xf1\x02\xc7\x6c\x39\x1f\x7f\xf5\x5c\xbf\xf9\x0a\x87\xfe\x4f\xe0\x7e\x65\x30\xfa\xf8\xe1\xee\xc3\xa7\xe7\xa4\xdc\x1a\xfc\x4a\x61\x0d\x11\x20\x9c\x33\x05\x35\xc3\x41\x95\xde\xba\xc2\xba\x11\x1b\x50\x05\xd5\x32\x62\x30\xb3\x0c\x1b\xc4\x96\xf5\x07\x5f\x46\xa9\x0a\x5f\xa8\xf1\x31\x19\xf9\xd8\x3a\xd0\xb0\x50\x00\x04\x99\x24\x42\x04\x17\x1f\xd6\xeb\x44\xe2\xbe\xc0\x92\x32\x8e\xb9\x7f\x9f\x24\x20\xbd\x2b\x7e\xb8\x25\x64\xd3\xbb\xe2\xcd\xad\x50\xe9\xcd\x87\x8f\xbb\x87\xf7\x30\xea\xb1\x7e\xb8\x7b\x78\x3d\x65\xfe\xe1\xf3\xdd\xc3\xe7\x0f\x77\x0f\xcb\xb6\xb8\x9b\x8a\xa2\x2c\x4a\x03\x2d\x57\xf9\x4c\x0e\x76\x18\x8f\x42\x61\x50\x80\x9c\x69\x7b\x3c\x62\x54\x40\xc3\x89\xcb\x8b\x29\x8c\xb0\xf1\x47\x27\xc4\x41\xec\xd8\xdc\x07\x1a\x8e\xe1\xa8\xd4\x62\xef\x41\x70\x00\x06\x9c\x67\x1e\x8a\x40\x24\x30\xe0\x98\xd1\x59\x8d\x85\x55\x06\xc1\xd3\xdc\x3d\x26\x79\xc1\x08\x69\x06\x42\x88\xc8\xab\x12\x94\xee\x59\x43\x63\x9b\x8c\x8f\x74\xdb\x6d\xca\xab\xaf\xf3\x21\xf9\x7c\x8d\x73\x7f\xb8\xe5\xe5\x5f\xf0\x87\xc6\x8d\x26\xda\xea\x57\x4a\xad\x2b\x96\xe2\xe3\xc3\xdb\x87\x8f\x0f\xfb\x23\x30\xb6\xf7\xf1\x9f\xfb\x82\x4b\xca\x4a\x8e\x51\x99\x9f\xfd\xc8\xc2\x68\x01\xa2\xa1\xc5\x80\x06\x07\xce\xbd\x6f\x43\xdf\xdb\x21\xcf\x58\x04\x6b\x56\xd5\x63\xe2\x73\x9f\x23\x19\x0c\x70\xe7\x4a\xda\x16\xc4\x10\xba\x09\x26\x6a\x86\x6c\x63\xfc\x6f\xb1\x91\x6f\xed\x24\xd7\x38\xc1\xb5\x9d\x77\xaf\x78\x4e\x97\x76\xae\xa5\xe5\x6f\x62\xc4\x2e\x1a\x21\x77\x60\x79\xf9\x9f\xc0\x43\x96\x7a\xc0\xab\xd1\xc7\xa2\xbb\x2e\x97\x92\x89\x52\x50\x54\x16\xe1\xe8\x8f\x3c\x78\x01\x30\x8b\xf7\xa1\x05\xa7\xd1\x0f\xa1\x19\xab\x16\x6d\x23\xb0\x74\x1e\xc3\x39\xe8\x6e\xf1\x1a\xc7\x59\xa7\x3e\x98\x70\x76\x47\x80\x52\xf2\x04\xe9\x4d\x66\x09\xf2\x70\xc6\x87\x70\x8e\xb8\x5b\xb6\x37\x69\x9e\x64\x11\x71\x04\x6f\x98\xcf\xdf\x46\xd1\xbc\x07\x7c\x2b\xbf\xd4\xc3\x6e\xba\x1c\x84\xe3\xb4\xe4\x82\x5e\x0e\x60\x92\x4d\xa8\x28\xc0\x59\x0f\x92\x83\x1e\xcf\x69\x6e\xb8\x39\x46\x1d\x20\x3a\x20\xe5\x64\x24\x1b\xb3\x96\xaf\x36\xc3\xf6\xbc\xc3\xc9\xdb\xc8\x12\xb6\x2c\xfe\xd9\x7d\xf1\x92\xab\x75\x2b\x82\x4a\x49\x70\x25\x70\xca\x71\x03\xad\xc0\x28\x0f\x8a\x6e\x14\xc0\xd5\xdc\x84\x7e\xae\x4f\x65\x55\x1a\xd0\xa4\x32\x49\xb3\xc3\x15\x33\xf5\x17\x37\xe6\xae\x6f\xb5\x42\x3e\xde\xdf\x6d\xdf\xff\xb4\x4c\xc6\x7d\x49\xeb\x36\x02\xdb\x59\x1d\xf2\x1a\xf0\x08\x71\x1f\x08\x68\x27\x70\x0e\xf9\xce\x38\x82\x43\x53\x85\xf1\x72\xd4\x3a\x83\x00\x57\x00\xd3\x9a\x7e\xe1\xe0\xa6\x65\xf1\x48\xa3\x9e\xe8\x9f\xca\xe9\x53\xfb\x12\xa6\x2e\x18\xa0\x6e\xd5\x26\x63\x75\xf0\x40\xd5\x4c\x98\xe6\x4f\xe0\xf4\x31\x8f\x2a\xf2\xe0\xfc\x9a\xd7\x68\xe5\xc3\x88\x59\x99\xdf\xe0\x35\x6a\x1a\x08\x53\xae\x1c\x24\x50\x40\x84\x42\x22\x9c\x1a\xc0\x21\x78\x72\x00\x39\xcd\xeb\x92\xe2\x50\x85\x5e\x55\xe3\xb8\xd3\x48\xb0\x8b\x0d\x7d\x5e\xe7\xc7\xb4\xa9\x8c\xee\xc3\x71\xe5\x35\xa2\x96\xb6\x04\x3f\xf3\x1a\x65\x89\xcb\x48\xac\x09\xf9\xdb\x15\x87\xf0\xe6\x9b\x4a\xc1\xb7\x57\xc9\xf1\xcf\xcf\xcc\x60\x3f\xff\x76\x58\x71\xb8\x45\xc4\x6c\x30\x40\x84\xe6\xd0\x96\x41\x86\xa4\x1c\xdb\x18\xa7\x33\xc0\x87\x36\x73\x60\xf2\x6d\xcb\xa4\x96\x50\x6b\x14\x0a\xcf\x89\x26\x7c\x87\x39\xd7\xcb\xb7\x2c\x4a\x83\x91\xcb\x0b\xb5\xfc\x5a\x34\x8d\x0d\x9d\xe6\x85\x2f\x04\x80\x58\x69\xaa\x65\xcc\xc9\x9c\x32\x17\x79\x40\x5f\xf2\xa3\xee\xbe\xe5\x47\x5d\x8b\x43\x36\xbd\x2b\x8a\x94\x5b\xe8\x7c\x4b\xc7\xb6\x3b\xf2\x93\x53\x0c\x21\x55\x19\x61\x34\xda\x59\x04\x4b\x6b\x2a\x86\x3d\xd1\x06\x5b\xcc\x85\x41\x50\x2c\xdb\x85\xd0\x31\x2f\x27\xb3\xc5\x97\x57\x09\x8a\x38\xaf\x27\x7a\x8b\x57\xcc\x6e\x4f\x42\x72\xd7\x60\x4d\x97\x15\x5a\x82\x9c\x33\x89\x90\xa1\x82\xe0\x92\x60\x48\xcd\x51\x74\xe2\x04\xb8\xd7\x82\x4b\x3e\x37\x3b\xa5\x2d\x57\x86\x08\x48\x1a\x4e\x73\x5d\x30\xd7\x1b\x25\xb5\x12\x0c\x53\x2a\x12\xb0\xab\x63\x9d\x8f\x4d\xb2\x35\xc6\xb7\xab\xeb\x7a\x67\xcf\x43\xb2\xe2\xec\xf1\xde\x66\xd3\x8b\x3c\xee\xf3\xd5\x8b\x7e\xd0\xea\x16\x45\xbc\xdc\x66\xfb\xfe\x5f\x81\x0f\x3f\x7f\xbe\xa6\x3c\x9f\xbf\x17\x2f\x7b\xb9\x81\xdd\x7e\xfb\xe9\x33\xc8\xd3\xb6\x8a\x8a\xa8\x6a\x18\x2e\x03\xde\xa0\x20\xa8\x04\xc5\x24\x4e\xc1\x84\x3a\x24\x14\x14\x40\xe7\xc1\x9a\xc0\xd2\x12\x07\x95\x9a\xcb\x98\xe1\x28\x83\xce\x33\xb6\x18\x92\xe0\x70\xe9\x61\x09\x5a\xcd\xb2\x96\x52\x4d\x5b\xd5\x52\xc5\x31\x42\x96\x50\x05\x75\x81\x89\x51\x54\x31\xc5\x14\x6d\x18\x6b\x19\x0b\x4d\x59\x12\x44\x93\xab\x8e\x06\x49\xdb\x74\xba\xea\xa8\x5e\xbd\xa2\xfd\x0b\x5d\x2c\xa0\xbd\x56\xc6\xa2\x78\x0f\x06\xd9\x8e\xea\x98\x4e\x4c\x1a\xcd\x2a\xa6\x8c\xe6\x56\x9c\xbc\xae\x96\x4d\x73\x59\x0f\xeb\xf4\x18\xd7\xa6\xeb\x99\x89\x0e\xfd\xe2\x0c\xc5\x9d\x25\x3d\x80\x53\x95\x26\x81\x35\x40\x98\x70\xea\xaa\x26\x1c\x35\xa0\x75\xd0\x29\xf7\xde\x8f\xbd\x1f\xa6\x79\x4a\x8b\x73\x6f\xfa\xd3\x1a\x33\xb0\x8f\x74\x6f\x32\x9a\x3c\xac\xa3\xe1\xa9\x8c\x70\x73\xfd\xc7\xcb\xb8\x5b\x49\x8c\x96\x45\xf6\x97\xf7\x7f\x17\xa3\x4f\x6d\x7a\xc6\x1e\xc3\x2c\x09\x8a\x77\xa0\x00\x2d\x7a\x4c\x86\xda\x1b\x2e\x50\xa0\x02\x48\x3a\x86\x33\x05\x15\x28\x3a\x13\xba\x14\xba\xba\x93\xe9\xc0\x11\xa1\xce\x4a\x9e\x57\x39\x0c\x2d\xd0\x08\xc3\x32\x38\xe8\x8a\x23\x46\x8e\x50\x65\x24\xa5\x72\x19\x07\x76\xe9\x67\x96\x27\x7f\x7e\xad\x1b\x59\x46\x4a\x91\xdc\x1a\xf1\xf9\xd3\x47\xf0\xe1\x6e\xb3\x8d\xa5\x9c\x4f\x78\x3d\xf8\xcb\xc7\x97\x60\xda\xf4\x54\x87\x21\x18\x06\x06\x7d\x7c\x4c\x28\xe0\xe7\x1c\x88\x1a\x14\xa0\xa0\xa7\x33\x6b\x7b\x59\x7a\xe4\xc2\x29\x9c\x7d\xaa\x74\x35\xca\xee\xcb\xf9\x58\x09\x3f\x66\x79\x38\x85\x43\xe8\x48\x45\x8e\x8c\x38\xc6\x30\x06\x45\xf0\x58\x78\x4e\x46\x58\x42\x4c\x14\xe3\x32\x3d\x08\x2f\x2c\xc3\x84\x5b\x7e\xbd\xce\x37\x1d\xc1\x55\x0d\x6d\xd5\xa2\xf8\x75\x7e\xfe\xee\x59\x3f\xf7\x09\xf4\x1b\xba\xa0\x33\x7e\x69\xb9\xae\x1c\xf4\x15\xb9\xf4\x19\x0d\x5d\xf0\x38\xcb\x53\xec\x85\xb4\xea\xc2\x39\xb1\x58\x64\xa5\x83\x45\xe8\xbd\x36\x12\x36\x48\x32\x0f\x48\x91\x7b\x8f\x35\x67\x9c\x30\x41\x39\x4f\x00\xa8\x1f\xe9\xee\x98\x96\x6b\xee\x7a\x8d\xfd\x3c\x6f\x5f\x1f\xef\x57\xc4\x18\x18\x41\x5f\xe4\x55\x5e\xa4\x9d\xa8\xac\x81\xde\x61\x34\xf7\x3a\x30\x0a\x94\x0c\x0a\x78\xca\x0a\x4a\x82\xa8\x4b\x57\x8a\x63\xf0\xa2\xe2\xc7\xc8\x4b\x44\xf7\x2a\x3d\x25\xbf\x5b\xb1\x50\xc5\xfe\xfd\xa7\x8f\x77\x7b\xf5\xa5\x6c\x5c\x9d\x9e\x5c\xe8\xc2\x79\xe4\xc7\x33\xb0\xc9\x2e\xa1\x8f\x6c\x73\xde\xd1\xe4\xaf\xa3\x6d\x7e\xe3\xda\x7d\x7b\xab\x69\x59\x81\xd1\x0f\xab\xf5\x73\x33\xfe\xbe\x61\xfa\xfe\x78\x77\xff\xf6\x1f\x9e\x0d\xc0\x65\x3d\xfa\x78\x25\x7e\xf8\xd6\x55\xdd\x9c\x2f\x7c\x70\x47\x37\x8e\xee\xe8\x06\xeb\xcc\x94\x9e\x43\x07\x1c\x17\x84\x42\x89\xd1\x63\x82\x51\x51\x2a\x82\x54\x91\xb7\x63\x29\xf8\xd1\x01\x15\x06\xd7\xb6\x00\x75\x01\xc6\x87\x1d\x75\x9a\x52\x4a\xcd\x72\x17\xd8\x7c\x0a\x8c\x83\x26\x4d\xb2\x24\xc0\x90\xe8\xf9\xcc\x79\x61\x73\x0a\x54\x9f\x63\x84\x8d\xc7\x08\x22\x68\xf3\x62\x9c\x8f\x69\xa5\x01\x5e\xbc\xc9\x51\x4a\xb9\x62\xa5\xeb\x6b\x8e\xfd\xcf\xd7\xf5\x3c\xbb\xb1\x87\xae\x74\x4b\x31\xa1\x7f\xb7\x92\x2e\xfd\xb2\x55\x35\x06\x1d\x45\x35\x85\x61\xa4\xd2\xf8\x89\xb7\xda\xfa\x2a\x6f\x5b\xdd\xed\x0c\x0c\x67\x9b\x87\xb3\x42\x55\x7b\x6e\x14\x28\x2e\xe7\x50\x4f\xb6\x4b\x0b\x50\xe7\x61\xa4\xf3\xa9\xf7\xc7\xd5\xce\x96\x89\xda\xb3\xc8\xf1\xf4\x8d\xca\xd3\xdd\xc3\xdd\x55\xb5\xee\x65\xd5\xe9\x3a\x51\x6c\x5a\x34\x69\x31\x4f\x4d\x17\xce\x1a\x14\x4d\x50\x9b\xdc\x1b\x6f\xfc\x5c\x2c\xd7\xdd\x67\xb4\xaf\x75\xd3\x65\xe7\xd4\xce\xb6\x9a\xf3\xd4\x85\x6a\x74\x23\xe0\x69\xc3\xce\x4e\x57\x6d\xdd\x89\xae\x9e\x51\x35\xda\x63\xb5\xe2\x8c\xd4\x23\xcb\xcc\x77\xf4\x98\x1f\x5e\xe8\xaa\x3e\xfc\x51\x3d\xe6\xe2\x3c\xb8\xc0\xed\x30\x81\x9a\x76\xcb\xf2\x4b\x35\x03\xba\x44\x81\x33\x16\x25\x5e\xa3\x1a\xb3\xd6\xbf\x52\x63\x26\xa9\xb8\xaa\x31\xe7\xb6\x19\xbf\x8e\x6d\x92\x80\x0d\x7c\xb4\x51\x07\xf1\xcf\x5f\x55\xa0\x45\x6a\xc9\xbd\x9c\xc7\x54\xce\x75\x4a\x66\xa4\x75\xca\xbc\xf7\xce\x83\xd2\x03\x98\x80\x74\x8a\x31\x24\xfb\x1a\x8d\xfe\x0d\x45\xf2\xe7\x27\xca\xe8\x97\x3c\xba\x9b\xdc\x3b\x0b\x7c\xcc\x9f\x82\x03\x62\x06\xc1\x50\x9d\x8b\x70\xc6\xaa\xc5\x3e\x57\x8f\xc9\xa0\x54\x69\x37\xcd\x7c\x08\x28\x34\x02\x28\xd0\xa4\x16\x30\x51\x09\x17\x35\xbb\x1d\xb4\x88\x94\x25\xe2\xd8\x51\xca\x78\x61\x8b\x15\xbf\x91\x44\x3b\x0f\x1c\xaf\x78\xb7\xe5\x8c\xee\xb6\x51\x9a\x70\x13\xd7\xe8\xed\xe7\x18\x45\xb5\x76\x7b\x6c\xc2\x08\x72\xa0\x49\x80\xa1\x09\x6d\xe0\x0a\x28\x50\x4c\xe0\x70\xf4\xea\x22\x1b\x20\x9c\x69\x2d\x81\x15\xd2\x8a\x54\x88\x28\x2c\x28\x77\x6b\xbd\x90\x4e\xd1\x9e\xed\xfc\x35\x36\xf3\x94\x8b\x78\xf5\x1d\x63\x70\xc9\x9b\x77\xfb\xfb\x5f\xde\xbf\xf9\x78\xff\x76\x7b\xd5\xb3\xde\x10\x86\x52\x3b\x9b\x5b\x15\x64\xda\x7c\x69\x6b\xc6\x39\xc8\x8d\xa7\xa0\x81\x58\xcd\xe7\xa8\x68\x9e\xcf\xe7\x9d\x17\xd2\x19\x6b\x9c\xb1\x24\x15\x82\x79\x90\x80\x12\x39\x46\x82\x35\xe6\x6c\xcc\x63\x62\xa2\x6d\xeb\x97\xf9\x94\xd6\xaf\xf6\xbe\x77\xfb\x5f\xb2\x65\x68\x47\x85\xe2\x6c\x00\x95\x07\x75\x18\xf4\x49\x8f\xd6\xbb\x93\x3c\xb8\x70\x48\x05\x63\x6e\x1a\xed\x09\x94\x73\x97\xb2\xd0\x0f\xb6\x59\xae\x6b\xd6\xa6\x87\xbd\xdb\xd1\x17\xd1\xe8\x9b\xd6\xec\xdb\xef\x99\x43\x6b\xc8\x3c\x1b\x81\x61\x9c\x0b\xae\xe4\xdc\x65\xa8\xab\x80\xc3\x42\x13\xd4\x52\x85\x50\x89\x49\xd9\x3c\x26\xa2\x6f\x42\xb7\x39\x50\xa8\x10\x25\xdc\x9a\x8a\xe7\x46\x4b\x4e\xc9\x41\xb2\xdc\x15\xa4\x19\x8c\xa5\x75\xe4\xed\x80\x91\x3f\xc1\x5c\xa3\x85\x2f\x33\xe2\xf7\x3f\x6c\x57\x16\xd6\x75\xda\xae\x4b\x5e\xe4\x40\xbd\xcb\x1c\x68\x7d\x4c\xd0\x9b\xd0\x3b\x80\xf4\xb1\xf2\x4d\x38\x2b\x40\x5c\x38\x02\x13\xf8\x78\x3c\x02\x7d\xdc\x76\x7d\x5f\x0d\xf3\x18\xa6\x93\x3d\x9c\xe7\x3e\x15\x61\xec\xec\x01\xc0\x14\x0f\x73\x75\x53\x70\x5c\xf6\x2d\x1a\xb9\xaa\x7e\x77\x8d\x0b\x3e\xa3\x90\xd6\x5c\xca\x2e\x96\x69\x6e\xdf\x7f\x7a\xf3\xf0\xf1\xc3\xa7\xc5\xc0\xba\x2a\xbf\x83\x13\x81\x20\x9f\x29\x28\x4a\x0c\x50\x8d\x49\x17\x0e\x39\x48\xc2\x04\xc3\x49\x1f\xe1\xf1\x9c\x87\x01\xd4\xf4\x4c\x91\x87\x64\x67\x8d\xaf\x2a\xad\x82\xc6\x8d\xad\x8c\xac\x42\x77\xb0\x35\x48\x2a\x69\xaa\xba\x56\x86\x18\x95\xec\x63\x3d\x7d\x1b\x73\x4c\x6f\x12\xf8\x32\x46\xb5\x5f\x77\xfb\xfb\x8f\xcb\x78\x5b\x46\xdb\xee\xb5\xf6\xc7\xb7\xf4\x40\x91\xd3\x3f\x66\x15\xef\x1e\x36\x53\x05\x41\x0e\xa8\xd0\x6a\x36\xda\x72\xe0\x61\x0a\xd5\xa0\xc0\xc9\x33\x29\x39\x94\x02\x87\xea\x4a\x19\x40\x26\xe7\xa6\x69\x9a\xc0\x64\xed\xce\x60\x7c\xf6\x15\x61\x52\x4a\x6e\x41\xd1\xd2\xc1\x07\x77\x51\xab\xed\x9e\xa9\x88\x1d\x75\x39\x6b\x83\xd9\x88\x70\xa8\x03\xad\x80\x9a\xe1\x55\x5b\x31\x3d\xc4\x3c\x4c\xf2\xe6\x86\x8e\xff\xb5\xb6\x62\x1c\x64\x57\x71\xc5\x23\x84\xbe\x2c\x4f\x61\x62\xd2\xfb\xba\x76\x25\xe7\xde\x55\xb0\xf5\xe1\x08\x15\xef\xb6\xc6\x78\x68\x9f\xa5\x15\x4f\xd0\xc3\x22\x50\x50\xa1\xb2\x2d\x21\xc8\xa3\xb6\xe2\xaa\xe9\x98\xac\x3c\x67\xf1\xb8\xdf\x3d\xec\x0b\x49\xc7\x09\x41\x4f\xce\xe1\xc8\x55\xe3\xdb\xb6\x2a\x17\x7f\x6f\x80\x5d\x1d\x06\xa8\xc5\x10\x0f\x7a\x7a\x3a\xe6\x84\x6e\x72\x8e\xcf\x87\x4c\xf2\x88\x53\x37\x57\x3d\xc7\x7f\xfe\x1a\xfd\x70\xc5\xd2\xaf\xfa\x3e\x6b\xfc\xf0\xc5\xb6\x1d\xb3\xbd\x87\xcc\x5f\x34\xce\xf0\x65\xac\x23\x13\xcb\x18\x01\x37\xd3\x04\xec\x34\xfb\xf8\x30\xed\x88\xf7\x01\xfb\x2e\xe0\x8b\x53\x2a\x33\x31\x08\x18\xf2\xae\xeb\xae\x9c\xa0\x7a\xef\x37\xfd\x35\xee\x7a\xd5\x79\xd8\x6c\xbf\x59\xa9\x5e\x79\x08\x57\x4e\xe3\x15\x84\xb8\x2c\x58\x31\xa6\xb9\xeb\x78\x18\x82\xcb\x48\xb0\x2b\x08\xe9\x32\xa4\xc7\x3f\x34\xe9\xe1\xd2\x82\x2a\x92\x43\xa9\x8c\xcf\x1e\xa7\x23\xf0\xe1\x58\x87\x63\x54\x58\xed\x01\xdc\xf4\x1e\x16\xce\x57\xae\xaa\x7c\xfc\x71\x95\xb7\x85\x9f\x0f\x55\x55\x55\xe1\x58\x55\x55\x92\x64\x60\x99\xeb\x7a\xa3\xe3\xd9\xf9\x29\xc6\x16\xe2\x4c\x7b\xaa\x1a\x4b\xde\xdf\xdf\xfd\x14\x31\x9b\x77\xef\x16\xef\xe5\x97\xf7\xf7\x6f\x77\xe3\xdc\x15\x30\xad\xe7\x6a\xac\x38\x6c\x4a\x67\x74\xe8\xd5\x6c\x01\x07\x79\x19\xc6\xa0\x58\xbd\xd1\xf3\xa1\x2c\xe6\xe3\x46\x07\xa8\x84\x0f\x0d\x48\xc8\x58\x83\xf2\x14\x7a\xca\x2a\xc1\xd8\xe6\xe0\xfb\x7e\x9e\xa4\xec\x57\x4c\xa6\x7c\x24\xfb\x76\x53\xc4\x75\xf4\xdd\xf6\x07\xb0\x4f\xb2\x75\x58\xbc\x2d\xc0\xb2\xb9\xfd\xb4\x6b\xe5\x63\xc2\x80\x10\xc1\x88\xba\xa9\x83\x0c\x27\x33\x65\xe5\xa6\xf0\x70\x6e\xc2\xa1\x01\x34\x3d\x16\xf9\x25\xcf\xa6\xe2\x1c\x74\xa8\x2d\x40\x80\x01\x9f\x27\x59\xb4\xdb\x8b\x8d\x7c\xaa\xcc\x8c\xc6\xe7\x4b\x51\xa5\xfb\x3f\x03\x8b\x13\x1b\x1d\xb8\xed\x9a\x5d\x38\x36\x25\xdc\xf4\x94\x0c\xc2\xa1\x8e\x8b\x12\x7d\xf5\x8a\x73\x7d\x9a\x00\x1a\x65\x1f\x4e\x59\x89\x03\x9f\x47\x96\xf2\x8d\x44\x8c\x5e\xce\x7d\x0d\x1b\xa8\x9a\xb4\xac\x05\x35\x07\x25\xac\xd5\xa2\xaf\x1a\xd7\xb8\xa8\x6d\x55\x3c\x2e\x7e\x74\x1e\x59\x24\x5e\x22\x44\x70\x86\x42\x0f\xcc\xc5\x02\x15\xba\x5d\x7e\xe5\x94\xb8\x69\xc8\x99\xbd\xcb\xca\x6f\x3f\x03\xd4\x16\xcf\x7d\x86\xcf\xa7\x8c\xcc\x7d\x56\x56\xb3\xaf\xaa\x54\xdf\xce\xa3\xdb\x57\x19\x5f\x3e\xf3\xe6\xc5\x67\xce\xbb\x72\x66\x19\x3d\x0f\x19\x9f\x59\xc6\xab\x59\x55\x55\x5a\x45\x4d\xdb\x66\x5f\xa5\x53\x9c\x27\x4f\x18\x48\x20\xb6\xe6\x8b\x9b\xf6\xf8\x3c\xa6\x53\x35\x9f\xaa\x9b\x2f\x41\xd3\x61\xc7\xae\xb3\xe9\x35\x57\xf2\xb5\x78\xf0\x56\x79\x9e\x0e\x5c\x60\x86\x38\x26\xc7\x92\x3b\x15\xf5\x1b\x77\xec\x0f\x47\x25\x73\x9f\x4b\x30\x06\x1e\x46\x0e\xda\x34\xcf\x92\x40\x00\xb9\x9c\xd7\xd8\x65\x9a\x0c\x8f\x78\x8f\x37\x2e\xf9\x31\x7a\x2b\x1f\x8a\x74\xb3\x5f\x99\x6a\xd7\x51\x78\xf7\xe9\xf3\xc7\x4f\xbf\x22\x69\x4e\x4f\xb5\x08\xd3\xa4\x80\x55\x4d\xcf\x01\x03\x98\x87\x53\x38\x55\x5d\xbe\x61\x4a\x0a\x8d\x2a\x8e\x83\xab\x33\x19\xca\xc7\xe4\xcc\xad\x9d\x30\x92\xe9\xb9\x10\x8e\xa1\xf9\x04\xb1\xce\xc1\x74\x39\x4b\x59\x54\x05\x4f\xd9\xd7\x66\x33\x45\x2d\xe2\xe9\xb1\xdf\x0c\x99\x7c\xa1\xb6\xb6\x9a\x8a\xbf\xd2\x67\xd9\x74\xe7\xd3\x09\xe4\x33\xb2\xc3\xb0\x6c\x81\xc3\x90\x49\xe7\x83\x73\x2e\xab\xc3\xc9\x07\x55\x05\xed\x5c\x5c\x17\xf4\x23\x8d\xf8\xe9\xbf\xbc\xda\x2f\xff\x7d\xdc\xdb\x3e\xbc\xd4\x77\xb9\x26\xc6\x23\xf7\x43\x8c\xc5\x3d\xfc\x13\xb8\xbb\x8f\xf0\xc0\x65\xd1\x4a\x39\xc3\xa7\x59\xa5\x55\x9d\xb6\x33\x07\x25\xaf\x11\x06\xfe\x7c\x04\x2d\xc4\x45\xbd\x75\xf5\xd7\xae\x7f\x92\x33\xd9\x40\x21\x0f\x4e\x29\x77\xe8\x30\x27\xce\x51\xf2\xb5\xa1\x19\xbe\x0c\xcc\xc5\xaa\x6e\x1f\x06\x69\x92\x64\x9f\x8c\x8f\x64\x6f\x36\xa7\x6b\x9d\xe3\xbf\x88\x71\xfa\x7f\x7c\xca\x5c\xc4\xb0\xfc\xb5\x8e\x7d\x59\xae\xaf\xc5\xd6\x9f\x7e\xbe\x8f\xa4\x2c\x0f\xe0\xc3\x62\x10\x44\xc1\x02\xf8\x5c\xa7\xd6\xd4\xb0\x04\x68\x56\x23\xd6\x6b\x82\x28\xb8\x30\x71\xe7\xa4\x24\xb6\xe3\xed\x26\x07\x2e\x98\x69\x9a\x55\x05\xe7\x51\xa5\x09\xe8\x2a\x02\xb0\x28\x1c\xf4\xc1\x7b\xba\x39\x21\x59\xce\x24\x1d\x64\xb0\x55\x60\x15\x38\x5b\x0c\x03\x2b\x90\x25\x48\xa4\xb6\x2c\xe6\xd2\x81\xc3\x2c\x82\xf7\x3e\x72\xbd\x32\x62\x50\x27\x17\x5f\x7d\xd9\x73\xf8\xbe\xde\xa2\x88\xf5\x79\xaa\x81\x7e\x96\x0b\x79\xaa\x84\x78\x66\x82\x7b\x42\xe3\xef\x65\xe0\x39\x97\xb4\x12\x15\xc5\x25\x2a\x1d\x54\x42\x0b\x2e\x85\xe6\xae\xbc\xf8\xd6\x49\xb6\x49\xf2\xba\x41\x48\x73\xbc\x31\x2e\xd4\xe1\x30\x02\x4a\x82\x0e\x53\xc3\x5b\x3c\xb9\x41\x71\xa3\x0c\x90\xe0\x10\x60\xd0\x91\xee\x0d\x8e\x29\xc6\x58\x12\xcc\x84\x48\x92\x1d\x68\x1f\xd9\x66\xcc\xf4\x93\x96\xcd\xdb\x38\xa3\xbe\x47\xa9\x72\x8b\x1c\x24\x69\x33\x0b\x77\x23\x18\x59\x6e\xb9\xd5\x4e\x39\x70\x30\xcc\x30\x95\xe9\x19\x81\xb3\x0a\x07\x15\x0e\xf2\xcc\x2a\x2e\xa4\x52\x9a\xe9\x55\x6f\x7d\x9b\xc7\x78\x6f\x1e\xb5\xf5\x56\x8d\xe9\xef\x04\x60\x3f\xdc\xdd\x6f\xf3\xd4\x9f\x4f\x9c\x17\x65\x89\x0a\x28\xbd\x72\x53\x38\xef\x72\x1f\xa6\x8b\x5d\x39\x05\xd3\xc3\x57\xb5\xa9\x2e\x7c\x43\x56\xad\xed\x2c\xea\x62\x9f\xa3\x86\xd2\x5f\xc5\x68\xf8\x8f\xef\xf6\x2b\x71\xcc\x4a\x89\x7f\x77\xcb\x98\xbc\xb9\x1e\x26\x6d\x49\x61\x8b\x63\x38\x97\x5e\x1f\x0e\xfe\x78\xc4\xb8\x28\x4b\xee\x19\x30\x87\x23\xb4\x9c\x54\x25\x04\x6d\x7a\x06\x2a\x54\x73\x1e\x4c\x5e\x48\x0e\xe8\x8d\x1f\x21\xb9\x72\xb3\xd5\x59\xf1\xac\x7b\xb5\x62\xa0\x7f\x7d\xd8\xa7\x43\xca\x02\x3a\x5a\xfa\x7c\x0a\x13\xac\x4c\x3c\x2a\xe7\x9e\x1d\x04\x87\x5d\x87\xb8\x66\x35\x44\xc0\x3f\x1d\xb3\x06\xc7\x57\xc7\xcb\xce\x8f\x62\xdf\x44\x4e\xb1\x1f\x63\x95\xf1\x2d\x78\x7c\xd3\xf2\xbc\xbf\x03\x0f\x77\x1f\x96\xdb\xc6\x93\x23\x28\x69\x5e\x43\x46\x43\x13\x3a\x95\xb1\x50\xf4\x3d\xe0\x7d\x9f\xea\x79\x40\xa5\x18\x48\x38\x62\xc2\xcc\x0e\x5e\x48\x46\x66\x99\xd6\xb3\x5c\x8e\x31\xfe\xc6\x31\xae\xaa\xa7\x2f\x0e\xa1\xe9\x09\x40\x96\xd7\x25\x73\xe1\x10\x1a\x9d\xa9\x90\x0c\x03\x90\xc3\xf0\x74\x88\x83\x43\xd7\x23\xe0\x65\xb1\x98\xd5\xea\x8b\xeb\xab\x96\xc1\x36\xf9\xe7\x57\xff\x29\x56\xec\xfd\x1c\x19\xc1\xb3\x65\x31\x7d\x05\xb6\x7f\x58\x09\x33\x3e\x3f\x7c\xbe\xbf\xbb\xdf\x9e\xc6\xa3\x3c\x8e\xe1\xe0\xea\x30\x4a\x00\x55\x26\x1a\x6a\x50\x5e\xe5\xf2\xe0\xf8\x58\x1c\xce\xea\xd4\x16\x4d\xac\x8b\xdb\xd9\xc7\xc4\x54\x1e\x94\x92\x85\x73\x6b\xba\x30\xcc\xfd\x7c\x26\xb8\x25\xa3\xa2\x22\x25\xe1\x10\x5a\x5d\x09\x90\x4f\x0e\xe0\x64\x93\x8e\x57\x1b\x7b\x69\xd7\x2d\x6a\xbf\x7d\x41\x44\xf5\xf0\x8d\x08\xe8\xab\x86\x6d\x9c\x73\x8f\x89\x9c\xc0\xa1\x9b\x96\x06\x92\x0c\xd7\x25\x94\x4b\xcb\xc4\x60\x45\x57\x0c\x27\x35\xb6\x79\x55\x2f\xd7\x73\x67\xd8\xd4\xd8\xa6\xed\x74\x6d\x4e\x41\x2d\xcd\x82\x25\x6e\xc9\x41\xc6\x76\x8d\xa1\x7b\x6e\x57\x96\xf8\x47\xbe\xd7\x99\xfd\xd3\xf5\x86\x7d\x86\x9a\x55\x6f\x58\x72\x24\x05\x86\x97\x03\x68\xbf\xd1\x1b\x3e\x55\x55\x35\x1f\xae\xa2\xb1\x69\x62\x79\x38\xb4\x7a\x3c\x34\x47\x77\x3c\x3c\xe1\xe2\x4d\xf2\xf7\xc9\xff\xfa\x9f\xd7\x3d\x4a\x7f\xad\x7b\xf4\xe6\xc3\xdd\xed\xfb\xe1\xc6\xd4\xb4\xfc\xb6\xa9\xfd\x72\x59\x52\x4a\xa8\x46\x65\x20\x40\x14\xa1\x62\xec\xc0\x0a\x9b\xe3\x66\xec\xb4\x2f\x9b\x53\xe3\x6a\xd0\x96\x6e\x71\x7a\xcf\x40\x7c\xed\x80\x3a\x5b\xb3\x33\xd2\x49\x6b\x04\xa7\xc4\x23\x8b\x30\x84\xa5\x80\x9a\x42\xc6\xd9\xe2\xfa\xcf\x63\xc0\xa1\xe6\xc0\x80\x3a\xb5\x33\x99\xab\x54\x86\x16\xa0\xc0\x9d\x73\x1e\x34\xe1\x98\x3c\xf9\x94\xcd\x4e\x26\xbf\x24\xff\x29\xf9\x7f\xe2\x1a\x11\xf7\x90\x57\xfc\x77\x2b\x4b\xdf\x3f\x81\x87\x95\x5a\xf1\xfe\x97\xec\xef\xc0\xdb\xc5\x51\x78\xd8\xbf\x96\x3c\xfc\xf0\xf1\xe1\xe3\x2b\xc8\x26\xb8\xb9\xc9\xbf\xdf\xed\x5f\xa6\x26\x92\x1c\x22\x64\x28\x23\x94\x28\xcc\x99\x94\x10\x22\x69\x18\x77\x56\x10\x08\xc8\xc4\x42\x02\x8e\xe6\x70\x3e\x95\x20\xcf\x85\xa2\xbc\xe4\x0c\x96\x45\x38\xf0\xb1\x2f\x4b\x69\x38\x26\x1a\x63\x86\x42\x97\x22\x25\x49\x19\xea\x34\xe1\xb8\x57\x42\xaa\x4a\x7a\x29\xe4\x4e\x32\x8a\x18\x35\x94\x73\xc5\xb5\x24\x44\x17\xe5\x01\x1b\x4a\xbb\x70\x12\x8a\xb8\x71\x00\xc2\x86\xc9\x07\xd2\x06\xd9\xe7\x3e\xe7\x67\xd0\xb7\xb2\xc8\x15\xa1\x8c\x32\x4c\x05\xff\x5a\x51\x26\xa4\x35\xc5\xc0\x5a\xa3\xb8\x12\x86\x0b\x4e\x6f\xf1\x2a\x7a\x8d\x57\xc1\xe4\x97\x15\xb9\xfa\x1b\xf1\xaa\x87\x97\x01\xab\x7f\x04\x2f\x02\x56\xe9\xe1\xd4\xbb\x60\x6c\x77\x00\x8e\x36\xc0\x41\x46\xa8\xa2\x80\xa3\x22\x18\x42\xa2\x14\xca\x37\x11\xab\x9e\x30\xd0\xdd\x22\x56\x9a\x80\x21\x94\x7a\x0d\x58\x81\x74\x99\x0f\xfd\x0e\xad\x59\x90\x17\x14\x86\x3f\xbc\x89\x16\xfb\x8f\x77\xbf\xdf\xfd\x4b\xf0\xfe\xca\x11\x95\x2c\x46\xc1\x72\x35\x9e\x23\xa5\xef\x3f\xbf\xbb\x26\x8d\x7e\xfa\x7c\x9f\x4e\x1b\x1b\x94\x75\x9a\x76\x5e\x33\x8e\xce\xea\x31\x21\x98\x10\xe7\x6b\xa8\x04\xa5\x79\x98\x96\xa1\x15\xe9\xf2\x18\x87\xa5\x2d\xa0\x56\x5c\x6b\x6e\xa8\xa4\x10\x79\x23\x01\x3b\xcd\xe3\x0e\xf9\x4a\x9b\xda\x1e\x8d\x14\xf3\x39\x4c\x0e\x94\x69\x81\xd0\xf8\x98\x1c\x8f\x55\x5e\x55\x4a\x04\x33\x54\x07\x50\x69\x21\x39\xa5\x51\xae\xcc\x51\x6e\x98\x14\x72\x79\x6e\xcd\xaa\x4d\x4e\x1f\x59\xda\xec\xec\xb2\x47\xbe\xf9\x70\x45\xfc\x44\x25\xa6\x87\xb7\xcb\xde\xb2\x86\x74\x7e\x78\xf3\x60\x0f\x82\x13\x90\x1f\xa9\x50\xc3\x60\xb8\x54\x8e\x29\x55\xf3\x76\x23\x41\x0e\x4b\x47\x9d\x25\x38\x0c\x8e\xd5\x95\x3f\x5d\xaa\x8c\x87\xe9\xe0\x40\x09\xdc\xe2\x07\xd8\x47\x11\x6b\xcf\xfe\xf2\x85\xd2\xd6\xeb\x95\x6d\xb7\x7f\xff\x79\x4b\xaa\xb1\xc1\xfd\x09\x62\x4b\x4b\x0f\xed\xe0\x05\xa1\xb4\xdb\x99\x99\x59\xeb\x2b\x37\x43\x54\x32\x4f\x47\xc9\x55\xda\xc0\xd2\xc9\x68\x5b\x9a\x47\xb6\xd1\x31\xb6\xfb\x4b\xd4\x94\xfb\x8f\x2f\x56\x8f\x6b\x75\xc5\x9b\xe5\xbf\xaf\x57\x62\x99\x7d\xb7\xc9\xf7\x73\x24\xaa\xb9\x7b\xf8\xb8\x05\xf7\x77\x3f\xbf\x7f\xfd\xa6\xa7\x29\x9a\xf2\x15\xae\xee\x2f\x79\x5d\xd5\x2d\xa1\x12\x73\x4c\xa4\x24\x3a\x2f\x34\xd7\x45\x49\x88\x84\xb3\xf2\x69\xed\x7d\xcc\x56\xc9\xb4\xee\x5f\xbf\x0b\xa1\xeb\xdb\x76\xa6\x72\xb5\x8f\x4c\xbf\x81\x0b\x2a\x30\x55\x4c\xe8\xb6\x44\x90\x35\x25\x21\x8c\x4a\x3a\x85\x0a\xc8\xaf\x9e\xb1\xd4\x85\x02\xd7\xaf\xdf\xc4\xe4\xf5\x5d\xc9\x76\x23\x1e\xd9\x5e\x45\x3e\xe9\x1b\x5f\x44\xb2\x5d\xab\xa1\x63\x42\xfb\x2f\xc0\xc3\x5d\xf6\x70\xf7\x61\x7f\xc5\x0b\x6c\xa6\x0a\x30\x07\xa8\x6f\x5d\xdb\xb6\x2d\x20\x2d\x76\xdb\x1e\xe8\xe0\xbf\x50\x97\x1e\x6e\xca\xfe\x66\x25\x3d\x5a\x6e\x6b\xce\x7f\xc3\x76\x32\x79\x1b\x33\xb8\xff\xe9\xaa\x4b\x14\xb3\x7f\x37\xb0\xce\xdd\xfd\xdd\x27\xf0\xa1\x78\x13\xab\xb9\x76\x0f\x7f\x9b\x82\x0f\x6f\xd7\x1c\x41\x7c\x78\x7f\xb7\xb2\xab\xbf\x7a\xf1\x97\xf7\x37\xd2\xf5\x51\xb9\x7a\x9a\x52\x72\x3a\x1d\x81\xba\x74\x03\xe8\x6d\x59\xe4\x30\x97\x50\x71\x39\x1b\x4f\x29\x52\x25\x22\x14\x49\x6a\x4a\xe1\x28\x60\x8e\x11\x24\x4b\x4c\xd8\xf2\x07\x46\x4a\x69\xe9\x4e\x6a\x54\x74\xba\x69\x74\x67\x66\x9a\xb6\xe5\x65\x0a\x34\x4c\xde\x95\x13\x30\xa9\x72\x88\x4b\x42\xe9\x84\x84\x20\x3a\x1c\xa8\xa1\x84\x65\xd5\xcb\x57\x09\x09\x07\x08\x97\xd7\x23\x0f\x07\xdf\x98\x1d\x8d\xc8\xc1\x1b\x83\xc5\xc7\x35\x03\xfa\xc4\xdb\xb6\xe6\xad\x7f\xbe\xb2\xb6\x7d\xb8\x7b\xb8\xd6\x97\xdf\x7d\x88\x40\xa5\xf7\x9f\xc0\xad\x12\xfd\xf9\x3e\xbe\xbe\x78\x63\x1e\xf0\xd0\x0e\x55\x19\x54\x28\x4a\x50\xad\x45\x26\xf6\x78\x74\xa8\x50\x39\x02\xec\x68\x15\x42\x02\x01\xc8\xb1\x25\x4c\xd1\xd2\x97\x58\xa1\xc2\xe7\x70\xb0\x84\x3a\xbe\xa3\x33\x75\xae\x2a\x4b\xcb\x90\x43\x8d\x73\x0e\x74\xdc\x7b\x58\x3b\x15\x18\xe8\x18\xec\x2c\xae\x2e\xbc\x6e\x49\xe7\xf3\xaa\xc5\x5d\xb5\x98\xed\x5d\x55\xe2\xc1\xb3\x18\xeb\xdc\x14\x8f\x32\x62\xfe\xbe\x8f\x15\x88\x3a\x24\x9f\xde\xbc\x50\x42\xbe\x5a\x62\xcb\x78\xda\x16\x1e\x42\x70\x96\x1e\x33\xc8\x09\xc6\x45\x60\x44\xe8\x1e\xa3\xfe\x48\x72\x5f\xd2\x28\xa5\x2e\xc0\xe0\xda\x76\xe7\x30\xa7\x17\x17\xea\xc2\x17\x5d\x96\x68\x29\x4e\x17\x16\x08\x2a\x98\x27\x03\x45\x54\x6d\xd0\xdc\x83\x2e\x8c\x57\xce\x42\x1a\x75\x51\xdf\x25\x3f\x25\xff\x3a\xf9\xdf\x12\xfe\xc2\xee\x58\x87\x4e\xdc\xfe\x7e\xfa\xbc\x58\x1e\x2f\x16\xd7\x9f\x5f\xfe\xf2\xe6\xdd\xeb\xaa\x9a\x57\xa9\xfa\xfb\x5d\x05\x7c\xd4\x06\xed\x6b\x65\xac\x6f\x07\x0e\xf2\x3e\xe8\x74\x34\x05\xe4\x84\x12\x06\xa1\x90\xf3\xd9\x16\x25\x41\x1c\x22\xc2\x94\x3b\xb8\xbc\x04\x9a\x6a\x1d\xd1\x5f\x61\x22\xe7\x5a\x48\x42\xd4\x81\x6b\x25\x48\x38\xc2\xed\xb1\xaa\x5c\xa8\x95\xd3\x46\xd4\xba\xe5\x56\x8f\x40\xa2\x92\x51\xc2\x14\xa3\x18\x72\xed\x20\xa5\x08\x9b\xc5\x71\x92\x55\x50\x08\x22\xdb\x59\x26\x8c\xe4\x15\xf5\xd8\x50\x42\xb0\xea\x25\x61\xd2\x91\x24\xd9\x67\xc7\xc7\x55\x83\xf4\xbf\x79\x35\xfa\x9e\xd1\x74\xbf\x62\xea\xfb\xf0\x69\x7f\xcd\xb2\x67\xdf\x52\xf4\xfd\x3d\xf8\xf1\xed\xfe\xdf\xbc\xdf\xc2\x06\x22\x50\xcf\x43\xea\x67\x9d\x36\x85\x34\x58\x95\x1a\xe3\xb2\x9c\x45\x05\x21\xa8\x83\x04\x75\x81\xa1\x2e\x71\x20\xa6\x64\x96\x83\x86\x94\xa6\x40\x18\x9a\x72\x67\x11\x23\x73\x6d\x8c\x09\xf9\x01\xda\x82\x01\xbb\xa1\x7c\xb0\xf6\x6c\xcc\x65\x32\x0e\x39\x0d\xe1\xd4\xb2\xa6\xaf\x3c\x6a\x5c\x5e\x35\x79\x67\xa3\xbe\x22\xcb\x4e\x3b\x19\x99\xb9\x56\xac\xcd\x87\xec\xc3\x9b\x0f\x6f\x1f\x8a\x27\x0e\x83\x15\x72\x76\xf3\x4a\x1f\x6e\x1b\xc3\x0b\x23\x73\x0d\xcb\x3e\x7c\xfc\xb0\x16\x34\xac\x76\xf1\x24\x28\x6f\x73\x9b\x9f\xa7\x82\x60\xc3\x0d\x2c\xca\x52\x97\x4e\x22\xc6\xa4\x11\x28\xef\x28\x46\x8c\x53\xc5\x29\xe4\xbc\x2c\x19\xa7\x46\x0e\x03\x26\xfc\x9c\xe6\x14\x19\x44\x76\x5c\xa1\xc5\xba\x29\xe6\xc9\x85\x73\x57\xd5\x30\x74\xa7\xb3\xd2\x30\x34\x67\x2d\x44\x53\x03\x09\x68\x38\x94\x70\x71\xbd\x73\x2d\x90\x87\x25\x01\x15\x2c\x3d\x44\x40\x3a\x50\xe4\xa5\xa5\x85\xad\xf0\x55\x9f\x23\xb1\x8f\x64\x5f\x03\x15\xa3\x25\x77\xaf\x45\x1c\xef\xff\x0c\x6c\xdf\xff\xf4\xe9\xe3\x56\x63\x57\x91\xa2\x2a\xcc\x63\x32\xaa\xf9\x50\xf4\xe1\x2c\x41\x52\x03\x15\x3a\x5c\xd2\x0a\x0e\x86\x89\xa9\xef\x91\x45\xd5\x14\x71\xb9\xa0\xd8\xbb\xc8\xe3\xfe\x2f\x9e\x74\xff\xfe\xc7\xef\x8e\x83\x15\x29\x76\xff\xe9\x09\x6c\xf1\x22\xaf\xf8\xf2\x3e\xcb\x5b\x88\xb3\xfc\xab\xdd\x56\x5f\xd4\x56\x14\xba\x2a\x49\x29\x18\x2a\xbf\x34\x40\xd2\xc7\x24\x3b\x5e\x60\x76\xfc\xca\xad\x94\xc6\x6c\x18\x27\x96\xf0\x79\x62\x65\x55\x30\x70\x66\x85\x2f\xe9\xce\x23\x8c\x02\x14\x8a\x07\x5f\xe7\x96\x1d\x32\x41\x1b\x21\x7a\xce\xe7\x26\x72\xb3\x19\xa1\x88\xe2\x58\x4a\xac\x25\x14\x0a\xa9\x65\x8f\xfe\x67\x57\x7d\x20\x1f\x73\x09\xef\xa2\x4f\xf1\x73\xf2\x2f\xaf\xc8\x92\xa8\xab\xf2\xd3\xe7\x2b\x44\xf7\xed\xfd\xcf\xcb\x8c\xdd\x5e\x79\x5f\x7e\xb5\xae\x7e\x83\x04\xde\x74\xda\x71\x20\x7c\x0d\x8f\x13\xb7\x26\x08\xa0\x05\xa7\x3c\x4c\x99\xbe\x78\x7f\x3a\x69\x82\x04\x24\x80\x9d\x8c\x44\x58\x60\x90\x54\xa1\xac\x9e\xa8\xfd\xb6\x85\x64\x76\x38\x62\x3c\xc8\x8a\x4a\x6e\x18\x63\xec\x38\x4f\x16\x14\x25\x13\x44\xf0\x28\x24\x00\xa1\x62\x84\x07\x3d\x2b\xc6\xd2\xea\xa4\x43\x63\x62\x2d\xda\x39\x62\x78\x69\x64\x04\xf8\x57\xd1\xf2\x48\xc0\x73\xde\xea\xc7\x77\xdf\x97\x49\xf8\xe5\xfd\xaf\xb2\xe5\xa3\x14\x5a\xcc\x43\x7a\x52\x1e\x61\x90\xa8\x15\xfd\x45\x0f\xd5\xc1\x03\xa9\x4c\x71\x38\x00\x7d\x98\xbb\xf8\xb0\x15\x88\x70\xed\x6c\xad\x21\xfc\x5a\x09\x59\xb8\x9c\x1d\x63\x90\x89\x6e\x11\xc3\xa1\x3c\x1e\x8f\x73\x1b\x2b\x12\x93\xe4\x9f\x45\x8e\x44\xb8\xb3\xdf\xd4\x09\xdd\x58\x2e\xff\xa4\x6a\xa1\xeb\x92\x92\x7e\xb3\xa4\x80\xc6\x61\x20\x30\x19\x66\x04\x11\x9f\x62\xfd\xd0\x19\x2a\x56\xd7\xb1\x7e\x28\x3e\xd4\x04\x1a\x48\x66\xef\x30\xf1\x2c\xa5\xac\xf4\x05\x15\xc4\xa3\x9d\xc5\xda\x2a\x71\x39\xa5\x23\x82\xfe\x78\x94\x02\xbb\xd0\x8e\xe3\x18\xd1\xc4\xc1\x29\x8d\x8c\xcc\x51\x98\x3a\x3e\x8e\x6d\x0f\x87\x36\xef\x8e\xf9\x54\xdd\xb8\x13\xe9\xbe\x4d\xc7\x6b\x56\xfd\xc3\x0b\x54\xd9\x6b\xb1\xc4\x97\xc5\x96\x8b\xab\xfa\xe9\x06\xac\xde\x6c\xdf\x7f\xaa\x01\x8b\xaa\xcc\xad\x11\x4a\x55\xba\x51\x67\x13\x86\xed\xe0\x3b\xde\x36\xa1\x33\xb6\x97\x2d\x80\xde\xda\xb6\x93\xda\x73\x5b\x94\xe1\x10\x7a\x34\xa4\x45\xdf\x3b\xaa\x94\xd5\x7c\x39\xe9\x8d\x37\xed\x11\x24\x9d\x76\xfa\x20\xd8\xd0\xc9\xa6\xc4\x61\x32\x05\x76\xb4\xe9\x38\xc1\xb4\x30\xf5\x9a\x17\x49\xf5\xde\x46\x3f\xff\x6f\xaf\x2b\xfa\xea\xe9\xff\xf4\xf3\xeb\x14\xee\xda\xbe\xfb\x95\xf6\xfc\x0e\x44\x2e\x85\x9f\xd6\x77\xfe\x0d\xd8\x6c\xdf\xff\xb4\x9b\xe4\x31\x08\x0a\x74\xe0\xb3\x88\x69\xf2\xe5\x36\x8e\x9a\x19\x88\x43\x15\x5c\xa1\x74\x98\xaa\x94\x61\xd4\x0a\x0d\xd0\x46\x8b\x29\x18\x0e\xfc\x24\xc3\x39\x70\x01\x86\x9d\x51\x5a\x38\xc2\xf4\xe2\xba\x71\x65\xec\xb2\x53\x39\x24\x55\x4a\xe6\x04\x63\x49\xf2\x94\xab\x46\x3a\x51\xe9\x5e\xda\x18\x5f\xcf\x63\xdd\x65\xbd\x73\x49\x9e\xfc\xff\x92\x22\x8e\xa5\x1b\x86\xe4\x9a\xa1\x7c\x62\xcd\xfe\xf9\x46\xdc\xf1\x12\x59\x72\x2d\x9b\x79\xae\x94\xfb\x29\xdb\xed\xdf\xae\x26\xe0\xc7\x1b\xcb\xfb\x6a\x50\x6e\x3f\x3e\xfc\x75\x4c\x48\x39\x54\x82\xf6\x52\x02\x8f\xc3\x00\x9a\x20\x5c\x55\x01\xbd\x3c\xb1\x4d\x33\xfb\xd1\x9f\xfc\xe9\xd4\xf7\x20\x09\x02\x31\x41\x35\xd5\xc2\xc7\x6a\x1f\xae\x24\xac\x1d\x23\x58\x8e\x75\xe8\xcf\x4d\x33\xa6\xec\x74\x3a\xed\x1c\xa6\xce\xd1\x70\x0a\x8d\xb6\x6a\xb9\x0b\x0d\xa5\x94\x6a\xa5\x95\x91\x82\x70\xc1\x18\x25\xb6\x02\x52\xe1\x01\x22\x4d\x31\x1b\x60\xa1\xa9\x35\x4a\x2b\xa5\xd4\x41\x25\x49\x9e\x90\x88\xa5\xf8\x2e\x8f\xee\xc3\x73\x4f\xff\x74\x1e\xdd\x75\x40\x66\x7c\x19\xf7\x03\x28\x0a\xa9\xa8\x83\x35\xc1\xb0\x98\x5b\x40\x9b\xe5\x0b\x15\xa2\x44\x18\x17\xb2\xc4\xe1\xa8\x73\x64\xf0\x19\x17\x3a\x87\x91\x41\xb7\x71\xcd\xec\xa6\x57\x0c\xba\x87\xa6\x71\x91\x41\xb7\x81\x8d\xcb\xeb\xe6\x99\x41\xb7\x69\xca\xb6\x89\xf5\x31\x59\x13\xaf\x27\x79\x51\x7b\xb0\xb2\xf4\xc7\xda\xd0\xab\x54\xde\xd3\x7c\xd9\xbf\x0c\x9a\xc6\x56\xaf\x97\xec\x57\xd5\xd3\x2f\x3a\x96\x9d\x32\x1d\x84\x70\x4e\x09\xee\xce\xe1\x3c\x0d\xd8\x28\x66\x4b\x78\x62\x9a\xa0\x92\x50\x58\xb7\xa8\xa9\x5d\x55\x56\x2a\x9c\x7c\x4c\x92\xcf\x6d\x7c\x28\x2b\xe1\xb8\x0b\xc4\x28\xad\xed\x8e\xcc\xd6\xcb\xbc\xe4\x02\x87\xa9\x86\x98\x93\xaa\xc5\x94\xe0\xd0\x28\x5e\xb8\x9c\x02\x54\x16\x5a\x3a\x58\x18\x55\x81\x48\xb1\x67\x9d\x73\x17\x5a\xb5\xac\xa9\x11\xeb\x54\x8c\xf3\x67\xe7\x47\x1f\x39\x6b\xff\x0b\x75\x19\xf6\xfe\x72\xce\x8a\x8b\x04\x30\x2d\xe7\x93\x03\x79\x38\x8f\x00\x87\xd1\x30\x06\x9e\xe8\xc5\x48\xf5\xc5\x55\xbb\x26\x9c\x03\x31\x63\xa0\x73\x63\x81\x34\xf1\x3e\x79\xe2\x5e\xee\x7e\x8b\x7b\xf9\xbf\x62\xcc\x5c\xf7\xf2\x2a\x44\x72\x63\x80\x0b\x69\x98\x87\x0d\x25\x51\x96\x56\x2c\x23\xa9\x25\xa5\x2a\x31\x21\xa5\x2e\x49\x18\x97\x41\x83\x40\x81\x0b\x5d\xa0\xd7\xbc\xcb\x06\x8c\xdf\xe5\x5d\xbe\x8e\x9a\x43\xff\xcc\xbb\x9c\x66\x6d\xf4\x37\x75\xf2\xe7\xcf\x95\x79\x2f\x30\x54\x57\xbf\x30\xba\x9e\x31\xaf\x73\xdd\xa8\x3f\x6d\x93\x0a\x83\xc1\x71\xa3\x48\x68\x64\xab\x0e\x95\xb5\xd5\xe9\x94\xb2\x69\x7a\x4c\x40\x55\xcd\x9d\x6f\x76\x1a\x7b\x57\x84\xd1\x88\xb6\x99\x7a\x0d\xf2\xd0\x5a\x8e\x0e\x3e\x9c\x41\xee\xc7\xea\x52\x0a\x91\xf5\x38\xf9\x5d\xb4\x29\xdd\xf7\x39\x9b\xaf\x11\xa2\xfb\xa7\xe8\xd0\x37\x1c\x89\xe0\x5a\x4c\xf2\x34\x94\xdf\xbf\x38\x9b\x2a\x2b\xcf\xa7\x39\x3f\x4e\xa0\xe5\x3d\xe7\x3d\xd7\x62\x3e\xa4\x6e\x36\x20\x09\x6d\x06\xc3\xc0\x54\xd4\x92\x2e\x3b\x23\xa4\x52\x29\xa2\x48\x43\x1a\xd9\x9a\x11\x38\xc4\x71\x57\x1f\x97\xaf\x00\x6d\x98\xbc\x0f\xdd\x3a\x3c\x27\x32\x28\x61\xfc\xe2\xea\xc7\xda\x4b\x1c\xf5\xc0\x59\xf2\xee\xc9\xf6\x59\x6b\x2f\x22\x4f\xd5\xcb\xd2\x8b\xed\xad\xe6\xe2\xf3\x35\xc2\xbf\x7f\x1f\x03\xfc\x1f\x97\xb9\x75\xad\xba\xd8\xc3\xa2\x28\xa1\x5a\x3c\xe5\x62\xae\xad\xb3\xa9\x22\x42\xb6\x2d\xc7\x8a\x21\x53\x0c\xa7\xf2\xd4\x75\x1e\x4f\x86\xb1\x8e\x5d\x8b\x2d\xc6\x30\x1a\x34\x81\x12\x9c\x80\x05\xd3\xc5\x87\x22\x4c\x04\xe4\xe0\x9c\x0d\xa3\x86\xe5\x30\xcb\xc7\xa4\xa8\x50\x77\x5c\x4c\x5f\x07\x41\x91\xd6\x2d\xb4\xf0\xd2\x44\x8c\x4b\xbb\xf8\x8e\x35\x28\x62\x5d\xeb\xba\x0f\x24\x20\x6e\xad\xd7\x44\xc4\xb2\xb5\xc6\x49\x74\x7f\x77\xbf\xed\xbc\xb5\x5d\x8f\xa9\xf6\xc2\xe0\x30\x85\x03\x6a\xe2\x96\xe5\x62\xa9\x91\xc5\xc1\xd6\x05\x95\x82\x8f\x27\x66\x59\x69\x86\xc0\xe6\xa3\x05\xe5\xca\xd9\xb1\x72\x73\xbf\x7b\x42\x9d\xdc\x15\xc9\x53\xb8\x28\xf9\x0b\xf0\xa2\x44\x65\x35\x1e\x63\x86\xf2\x65\x7d\xca\xa7\xcf\x1f\x9f\xea\x53\x36\x06\x88\x1e\x21\x58\x21\x23\xa7\xc0\x66\x69\xbc\x39\x0c\x1d\x06\xe5\x44\x8e\xe3\x58\x95\xd0\x49\xe8\xf2\xf2\x1c\xc6\xd2\x9b\x41\x0b\x31\xca\x1d\xbb\xa8\x20\xc3\x48\x14\xa9\x14\x30\x60\xca\x92\x4b\x15\x50\x38\x52\x90\x80\x73\xd6\xcf\x43\x05\x2d\xa4\x06\xb7\x33\x3f\x95\x84\xc0\xb6\x45\x94\x52\x5c\x15\xe5\xd9\xad\x1e\x55\x8c\x01\xa7\xed\x95\xf7\xe3\xc7\xe4\x6f\x63\x2d\xda\x53\x2c\x7d\xff\x03\x58\xb5\x16\x97\xfe\xbc\x59\x9a\xfe\x66\x2d\x70\xfa\x79\x25\xe2\x89\xeb\x28\x05\x7d\x2c\x3c\x2e\x6a\x60\x78\xa8\x9b\x2a\x70\x91\xf2\x40\x19\xc4\xd6\x49\x47\x11\x35\x2a\xfb\x7f\x39\xfb\x7b\x20\xcb\x71\x36\x3d\x10\x25\xc8\xf3\xc3\x6f\x46\xa3\xcb\xec\xec\xea\xe2\x48\x9a\x11\x73\xb2\xab\x8b\x33\x57\x37\x2e\x63\x52\xd5\x85\xd8\xd1\x48\x90\x66\x57\x0b\x69\x63\x43\x58\x6d\x48\x81\xdd\x35\x16\x6b\x2d\x9c\x8d\x80\x09\x13\x26\x4c\x98\x30\x61\xd2\xa4\x49\x93\x26\x4d\x9a\x34\x8f\x49\xf3\x98\xa7\x2b\x93\xc8\x0d\x82\xcc\xcc\x53\xd5\xfd\x7d\x33\xbb\x95\xc5\x73\xd8\xe7\x64\x35\xf8\x87\x17\xef\xcf\xf3\x3e\x4f\xc4\xa4\x13\x9a\x94\x95\xa4\x7b\x75\xb9\x58\x7f\x66\x6c\x1e\x9f\x23\x37\x81\xc9\x63\x7f\xd2\xc0\xc5\x1c\x64\xfe\x44\x31\x3c\xfb\x11\x76\x9c\x62\xa3\x3a\xe8\x27\xdf\xc0\x89\x22\xac\x22\x10\xbb\xa0\x9d\x46\x36\xcd\xa4\x87\x9b\x37\x86\x92\xbb\xa4\x76\x67\x17\xce\xa9\x7b\x4c\x41\xba\xeb\x1f\xc9\x01\xce\xd6\x3e\xf5\x36\x68\xec\xc5\x2b\x17\x74\x1e\x25\x2b\xcf\xcc\x5a\x4f\xff\x75\xed\x62\xff\xf1\xe7\xef\x6e\xef\x92\x3a\x51\x4f\x8a\xee\xb0\xef\xf2\x0a\x97\x99\xc9\xb9\x31\xb4\x4b\x5b\x7f\xa1\x27\x9b\xfa\xcb\x21\xb7\x5e\xd8\xa7\xb1\xcc\x91\x81\x03\x23\x3c\xc1\xbe\xf4\xdc\x69\x03\x18\xb0\xab\x3e\x14\x4a\xc8\x01\xfe\x01\x8e\xfe\x84\x8c\xb5\xd6\x15\x2e\x28\x82\xb0\x3b\x79\x67\x0f\xd0\x79\xd4\x0f\xae\xce\xea\x9c\x92\xae\x03\xe3\x2f\xf5\xe1\xb2\xfa\x94\xf0\x99\xc7\x97\x83\x8a\xfe\x51\xc0\x0b\xff\xff\xd6\x28\xeb\x35\xa9\x90\xdc\x6d\x74\x9a\x9f\xaf\x54\xf7\xae\x57\x3b\xe0\x4c\x5e\x6a\x41\xb9\xe4\x0d\x9b\x4a\xa0\xf4\x30\xf4\xf9\x73\xe4\x7b\x08\xb2\xe7\x08\x44\xb2\x40\x95\xa8\x50\x9c\xea\x0a\x4a\x74\x50\x15\xc2\x4c\x09\xcd\x5a\xcd\x86\xe7\x48\xb7\x7a\x1e\xa1\xe4\xc4\xa2\x18\xeb\xd6\xf3\x66\x84\xa7\xa6\x2c\x7a\x55\x6e\x5c\x04\xdd\xc6\xe3\x93\x47\xff\x22\xfa\xb7\xa1\x3e\xb2\xd8\xdf\x68\xff\xf1\xc7\xdb\xfb\x90\xfa\x7f\xcd\xff\x83\x87\xd0\x32\x94\x04\x88\xd8\x62\x86\x1f\x6e\x1e\x6e\x7f\x7f\x4f\xc5\xfe\xa2\x2b\x80\xfd\xc9\xdb\x0a\xd0\x6e\xca\x04\xa9\x60\x25\x08\x84\x59\xce\x06\x6f\x8c\xc1\xa9\x96\x2a\xa3\x20\xf7\x17\xa5\x07\xe0\x8c\xd6\x68\x71\xb1\x38\xcf\x3d\xab\x49\xa5\x4b\x7a\x50\x25\x17\xf3\xa0\x65\x0d\x6c\x21\x28\x2c\x2b\x46\x61\x95\x67\xbc\x05\xe9\x65\x48\x72\x9f\xfa\x33\x39\x83\x5e\x5d\x62\xec\xa1\xaf\x2e\x17\xe3\x73\x49\x72\x93\x53\xd0\x63\xed\xaa\x5a\x2d\xeb\x4b\xf0\xeb\x0f\x64\xd3\x08\x0d\x58\x98\x0f\xef\x97\xd9\x71\x60\x18\xa4\xd4\xf7\xc4\x4f\xa6\xf0\x35\x07\xd5\x81\x3c\x0a\x5f\xb8\x38\xdb\x9d\xd2\xec\x91\xcf\x8d\x8e\xcb\x50\x1f\x45\xa1\x76\x20\x42\x64\x50\xbe\x75\xf8\x7c\x15\x19\x84\x52\xf3\x71\x71\xa8\xaf\xca\xcc\x23\x57\x76\x59\xde\xad\x64\x94\x1a\x21\x45\x67\xfc\x04\x8a\x33\x05\x75\xaf\x20\x92\xd8\x13\x5c\xc9\x0a\x1f\x84\x40\x95\x2f\x34\xb4\x46\x1b\x31\xa7\xb1\x3b\x6b\x39\x00\xa1\x41\x5b\x69\xdc\x95\xbd\x46\x8e\x49\x0d\x8d\x7c\xd5\xd5\x71\x07\xf4\x5a\xef\x7e\x65\x8e\xfb\xfc\x95\xa2\xc0\x6b\x5f\xc5\xaa\xcf\x71\xad\x78\xb1\xa9\x1f\x7d\xba\x03\xab\x68\x90\x4c\xce\x4f\x99\x5e\xc2\x2b\xa7\xed\x53\x07\x8c\x09\xfa\xc9\xa3\x2b\xab\xda\x8b\xc0\x57\x1f\x62\x5b\xdd\x56\xc8\x82\xd1\x0b\x40\x41\x5a\x15\x1e\xc1\x03\xf2\x48\xac\x8b\x54\x49\x88\x52\x8a\x53\xa5\xcc\xe9\x64\xd6\x3d\x8f\x18\xa3\x2b\x36\x97\x1c\xc9\xd6\x73\x15\x1a\xae\xfe\x08\x5c\x35\x5c\xdd\xdd\xdc\xed\x50\x3c\xcd\x53\x19\x73\xe8\x9c\xe4\x45\x8d\x91\x28\x67\xc5\xe2\x74\x6e\x0f\x55\xe8\xb9\x1a\xfc\x94\xda\xac\x03\x2c\x16\xa0\xdc\xec\x79\xd2\xbd\xe6\xb4\x3e\xfe\xaa\x17\xf2\xd3\x4d\x68\x28\xb8\xdb\x5a\x21\xaf\xf4\x03\x46\x97\x97\x40\x2b\x85\x48\x29\x21\x7f\x8e\xbc\xa2\xc0\xf4\x73\xcf\xfa\x8a\x06\x2c\xef\xb6\x1d\x54\x81\xd1\x97\x6a\x45\xb3\x00\xe2\xfb\x56\xf7\x93\x49\x14\xf5\xd2\x7a\xb4\x6a\xda\x1f\x62\xf7\x0c\x8f\xdd\xc1\x44\xbf\x8b\x7e\x88\xca\xe8\xbf\x89\xfe\x43\xc8\x69\xbf\x71\xae\x6d\x11\x4a\xe8\xb4\xd8\xaf\x15\x9e\xf7\xc7\x9f\x92\xc3\xf1\xe6\xf3\xfb\xe3\x47\x70\x97\x1d\xfe\xbf\xe0\x63\x68\x20\x5c\x5b\x37\x6f\x03\x8d\xde\x12\xd7\xaf\xc9\xc7\xbb\x4f\x77\xdf\xc7\x17\x30\xe6\x85\xab\x8a\x38\x7a\x14\x60\xc0\x90\x14\x0c\x73\x09\x29\x70\xad\xa6\x10\x55\x82\x4a\x58\x14\xa4\x68\xe0\xd3\x05\x28\xc4\xaa\x1c\xe6\x79\x4a\xd2\x86\xea\x0c\x09\x1b\x2b\x6b\x67\x56\x39\xde\xa6\x26\xd6\xb3\xda\x9f\x51\x55\x61\xaa\x0a\xca\x24\xc6\x4e\x7a\x07\x8c\xe2\xaa\xa4\xbc\xc8\xfd\x45\x30\x0d\xaa\x2c\xf5\x53\xc1\x30\x02\x93\x37\x46\xa2\xc1\x9f\x25\x15\x9d\x87\x52\x3e\xf5\xa0\xea\xa5\xd0\x40\xb7\x1a\x87\x3e\xc9\x18\x87\x9a\x24\x89\x7e\x17\x2c\xdd\xdf\x44\xff\x71\xeb\x1f\x78\xf5\x3b\x1e\xde\xdd\x67\x01\xa7\xb8\x9d\x64\x90\xcd\x5c\xdc\xb9\x0d\x6b\xfa\x61\xcd\x1b\x7c\xfc\x1c\xba\x92\x6e\x1f\x6e\x02\x6e\xfe\x63\x40\xd1\xdf\x1e\xcd\xe3\xd4\xa8\x3a\x86\xba\x22\xcc\x66\x58\x8d\xa5\xa3\xaa\xac\x15\x4c\x07\x90\x92\x3e\xe4\xdf\x62\xa1\x2a\x90\x56\x88\xe3\xba\x84\x5c\x2e\x41\x16\xe7\x10\xf7\x4c\xeb\xf4\x40\xf4\xcc\xe6\xc1\x93\x8d\x71\xb8\x2f\x9c\xd6\x1e\x13\x20\x7d\xe4\x5b\xcb\xcd\x14\x47\x5e\x0b\x60\xb5\x73\x5c\x41\xc5\xab\xb2\x97\x92\x61\xad\x18\x99\xfc\xe8\x27\xed\x6b\xa5\x9a\xf1\x39\xd2\x9c\x82\x12\x64\x51\x14\x47\xf0\xb9\x0e\xfa\xc3\xef\xa2\x3f\x8d\xa2\x0f\x4b\x3c\xfd\xf9\xe6\xe1\xe6\xf3\xda\x7d\x17\x4c\x63\xf0\xaa\x62\x52\x8e\xfe\x84\xb9\xc1\x03\x38\x1b\x29\xcb\x73\xdf\x5f\xb4\xa0\x2e\x8f\xd5\xdc\xe4\xf1\x39\x56\xb3\xba\x68\xdf\x65\x09\x02\x3c\x3a\xc4\x2c\xd8\x2c\xf5\x4d\x5e\x25\x3c\x4b\x37\x0f\x1b\xc7\xe2\xe6\x15\xbf\xdb\xa4\x60\xef\x56\x85\xa9\xc5\xfc\xc6\xbf\x91\x57\xd9\x4b\x58\x00\xf7\x64\xac\x01\x91\x69\xdb\xf9\x64\xad\x15\x20\x05\x5d\x5e\x02\xb4\x2c\x25\x67\x8a\x0c\x24\xb3\xd5\xcb\x0a\x12\x63\x94\x9b\x0c\x91\xc2\x64\x07\x45\xa8\xf1\xc3\x38\x8e\x63\x90\x89\x91\xde\x7a\xd4\x28\x90\xc7\x2a\x56\x18\xcd\x95\x6f\x86\xe1\x82\x40\x34\xe4\xa5\x9f\x3a\x7c\x6a\xfb\xb1\x3c\xf5\x79\x7f\xca\xcf\xed\xaa\xd3\xcf\x93\xea\x50\xac\xd7\xe8\xf6\xe5\xba\x6c\x0d\x7a\xe1\x6a\x05\xb7\xae\x8b\x45\xd7\xb6\x75\xee\x07\xaf\x21\x84\x4e\xf8\x73\x60\x6f\x39\x14\xb3\x3c\x5b\xaf\xa0\x96\xac\x4e\xb3\xb8\x9d\x79\x91\x54\x16\xd0\x28\x4a\x12\xb8\x71\xe9\xbc\xac\xae\xd7\x3c\x28\x71\xb2\xd1\xfb\xbc\x36\xd6\x7d\x77\x1b\x4a\xdb\xb7\x5b\x0a\x27\x51\x20\xcb\x53\x97\xe6\x31\x99\x5d\x5e\xc4\x55\x31\xb9\x33\xba\xf4\x35\x57\xe4\xa4\x25\x23\x8c\x5f\xc8\x73\x04\x72\xe6\xea\xc2\x53\x60\x71\xae\x0b\xbc\xcf\xea\x3e\x6b\x6b\x63\x94\x47\x7e\x92\xc8\x61\x27\x10\x34\x54\xe8\xce\x4a\x0d\x30\x38\xf9\xe8\xe4\x46\x90\x26\x4a\xc8\x52\xad\xfa\x9f\x43\x98\x1b\x74\x8b\x8a\x03\x4b\x5b\x28\xa7\x85\xc5\x73\x39\xc2\x4d\x29\x22\xf9\xf8\xdd\xcd\xa7\xdf\xfa\xe8\xc3\xa6\x38\x1b\x8f\x02\x0c\x12\x0c\x18\xc3\xa2\x2d\x65\x55\x0b\x2b\x24\x2c\xba\x42\xc0\x46\x58\x29\x40\xd3\xc4\x97\x3a\x91\xf1\x69\x2e\x96\xcd\xcc\x90\x57\x45\xaa\x59\xec\xac\x4f\xfd\x04\x41\x1a\x47\x7c\x86\x1c\xe6\xd7\x1f\xe6\xe0\xcc\x4d\x4c\xe7\x7a\xd9\xa2\x24\x66\xcf\x24\xf0\x08\xfc\x93\x8d\xb3\x21\x78\x6d\xaf\xf6\xfa\xbb\xdb\xfb\x6c\xed\x6d\xf9\x74\x7f\x2d\x92\x93\x94\xdc\x82\x2c\xe5\x12\x91\x8c\xa2\xa2\x4a\x65\xdb\x30\xe3\xf8\x0e\x06\xbe\xb0\x66\x5f\x00\xea\xeb\x47\xe7\xdb\xcc\xa4\x40\xc5\x97\xb9\x99\x5b\x27\x6d\x9c\x82\x4b\x09\xf0\x2f\xad\x36\x07\xf2\x65\xd8\xb9\x4d\x5f\xb9\x8e\xc7\x97\xb9\x05\x5e\xe6\xd6\xcf\xd7\x93\x6b\x09\x09\x62\x5d\x5d\x7c\x8f\x98\xad\xca\x73\x5c\xd5\xd6\x9e\x43\x8f\x71\xa6\x15\x33\x45\xac\xe7\x26\xcd\xe3\x29\xcc\x2f\xe3\xc7\x04\x2d\xd1\xf3\x2e\x71\x11\x0f\x79\xa7\x3f\x0e\xdd\x15\x7f\xf6\xca\xe4\x90\x1c\x8e\x1f\x7f\x5c\x5b\x8d\xf7\x01\xc3\xb3\x7f\xbf\x2c\x20\x7b\x69\xab\xfe\xc2\xfa\xc9\x9d\x04\xa8\x40\xca\x1b\x3f\x11\x50\x00\xc8\x2f\x5e\x12\xa0\x81\xe0\x7e\x9c\x4f\x24\x86\x07\x5d\xd1\x93\x72\x02\x64\x93\x15\x53\x2f\x3a\xa1\x05\x16\xfe\xa2\x95\xcd\xa5\xb7\x54\x05\xfc\x6a\x84\x83\x1e\xae\x5c\xbb\xf1\xde\x58\xce\xc2\xf6\xc3\x5f\x82\xe3\xdd\x0b\x57\x5f\x70\x17\xd7\x45\xeb\x04\x0a\x07\x72\x3f\x01\xe2\x87\xe5\x14\xeb\x58\x83\xa6\xf2\x6a\x76\x1e\x9b\x0a\x6b\x83\x4c\x5e\x50\xe6\x25\x60\xfe\xb4\xb8\xeb\xe6\x39\x5a\xfe\x7a\x89\x9d\x69\x46\xa3\x40\x11\xa7\x79\x5f\x2b\x14\xf7\x06\x44\x7f\xf0\x38\x96\x8b\xfb\xfb\x8e\x63\x00\x69\x10\x05\x06\xc8\x9f\x4f\x27\x1b\x37\xbf\x3e\x0a\x42\xbc\x06\xc8\x5f\x5e\x8e\xc2\x4f\xc6\x5b\xf2\xd5\x51\x70\x14\x37\xcb\x51\x80\x1d\x8c\xec\x51\x1e\xa2\x55\xe7\x3a\x8c\xf0\xe2\xe0\xc7\xc7\xc3\xdd\x5f\x7c\x0c\x55\x7c\x3e\x0f\x71\x3f\x8f\x65\xd3\xd3\xcc\x16\x25\xf6\xfd\x39\x85\x30\x99\x80\xd1\x33\xf5\x79\x99\x57\x23\x7a\x8e\x4a\x98\x52\x12\xbb\xb5\x3f\x89\x3c\xe3\xa4\x3a\x54\x5f\x63\x02\x6f\xbf\xc1\x04\x5e\x4b\xf5\xd4\x4b\x10\xe9\x02\xe0\x7b\xdb\x2a\xc3\xa4\x92\xa0\xe3\xc8\x42\x76\xa8\xbe\x4c\x89\x9d\xe6\xf0\xd7\x13\x7c\x92\x52\x39\xd7\xa2\x2e\x8c\xb7\x0f\xfa\x45\xed\x81\x06\x3f\xf3\xfd\x86\x8e\xbf\xe2\xf3\x4a\xde\x54\x99\x7f\xfc\x8a\x63\x3a\xd7\xb6\x51\x3d\xe8\x6a\x27\x4c\x4b\x4c\xd5\x5d\xf8\xa9\xad\x27\x01\x70\x5c\x58\x2f\x9c\x0b\x0a\x68\x14\xfb\x93\x15\x4d\xa7\x5b\xd9\x36\xcf\x51\x49\x4f\xb5\xad\xcf\x97\x5a\x5c\xbc\x98\x21\x17\xf1\xe0\x2b\x80\xa2\xe8\x8f\x93\x6c\xbb\xa7\xff\x9f\x2b\x9c\xfe\xca\x09\xb0\x79\x89\x5f\x73\x07\xde\xfe\xca\x6b\xfc\xfd\xa8\xc9\x24\x03\x97\x00\xe1\x07\xed\xe3\x05\x34\x3e\x2d\x77\xf0\xb1\x37\x4d\x03\x60\xad\x9b\x27\x93\xf4\x4f\xd0\xc6\x6e\xc5\xe0\x05\xe9\x48\xd6\x77\x64\x88\xcb\xae\x43\x6d\x73\x28\x09\x91\x44\x08\xe2\xcf\x5e\xf3\x90\x84\xf4\x6e\x96\x60\x20\xcf\x11\xf1\x17\x32\x70\x5e\xe9\x12\x97\x58\xe3\x32\x3a\x04\x0c\x9b\x3d\x98\xe8\xaf\x36\xd6\x85\x7f\x13\xfd\xdd\x1b\xf3\xd6\x96\xd2\xde\xfa\x97\x6f\x5e\x3d\xad\xcd\xdd\x08\xd3\xf8\xe7\xcf\x77\xc7\xdb\xed\x4c\xf7\x57\xf5\x9d\x9d\x30\x55\x9c\x16\x15\xc8\x1a\x58\x2a\x44\x07\xc6\x39\x86\x35\x90\x59\x61\xcb\x02\xf0\x27\x61\x95\x2c\x0a\x0a\x0a\x70\x86\x85\x47\x82\xc6\xd3\x9c\xaf\x9b\xf1\xd0\x98\x25\x6e\x3e\x98\x8a\x2a\x8c\x14\xc6\x58\x70\x43\x18\xc4\xfe\xb2\xfa\x53\xcf\x91\x77\xbe\xe1\x20\x05\x28\x96\x45\x2e\x4f\x06\x61\x3d\x5b\x41\x05\xf3\x18\x63\xd0\x5e\xd4\xd6\xd3\x80\xe3\x73\xe0\xe7\xfd\x93\xe8\x66\x65\x0e\xb8\x7d\x25\xb0\x7e\x7f\x75\xdc\x2f\xe6\x95\x9f\x8a\xd2\xc1\xe2\x32\x4b\x14\x67\xf3\x39\x6c\xc5\x2a\x47\xb6\x37\x8c\x40\x21\xad\x33\xce\xb8\x99\x70\x1e\x37\x9e\x80\xe2\x65\x9c\xa3\xdd\xb5\x5f\x8d\xf3\xe6\x99\x7e\x73\x7d\x6e\x43\x53\x1e\xae\xa0\xc5\x30\x81\x97\x01\x44\xfb\xea\xcb\xb0\x2f\xbf\x8c\xfb\xd2\x3c\x45\xd6\xee\xa2\xa7\xc5\xef\x46\x15\xe1\x9a\x6b\xae\xb8\xcf\x10\x02\x67\x3f\xba\x28\xda\x81\x6c\x27\x0e\xa7\x03\x7e\x9d\x73\xd1\x96\x01\x7d\x53\x48\xc9\xf6\xc3\x97\xca\x06\xb2\xd9\x0e\x94\x06\x54\x07\xec\x4b\xb5\x78\x17\x63\xb4\x8b\x5c\xe8\xaf\xad\x5e\x73\x9a\x2b\xbb\xe6\x37\x85\xcf\xf8\x85\x5f\xe3\xcd\x9b\xb7\xbb\xc1\x3b\x62\x46\x94\x9a\x54\xfa\xe1\xa2\xfc\x24\x7d\x46\x80\x91\xfe\x6c\x13\xf7\xc4\x5e\xb7\x6a\xc6\xac\xc8\x2b\x59\xd6\x14\x61\xe3\x2f\xa5\xc9\x0c\x98\xa8\x3f\x53\x3f\xad\x1c\x3f\x26\xee\x8e\x22\x70\xfc\xfc\x1c\x22\xe2\x5f\xb7\x96\xdc\xbc\x02\xc6\xd6\xca\xf2\xbb\xbb\x77\xb7\xef\x3f\xbf\xff\xaa\x8f\xff\x1a\x4a\x10\x60\x5a\x20\x10\x75\xed\xea\x57\xeb\x32\x80\xce\xb8\x2f\xcc\xe9\xa9\x66\xae\x03\xb9\x6d\x0d\x15\x08\x11\x4c\x24\x87\x98\x20\x0c\x38\x2e\x2a\x8c\x08\x21\x54\x41\x2d\x50\x8d\xf7\x29\x15\x84\x08\x2a\xa8\x9c\x6b\x3f\xf4\x3d\xa8\xe2\xbc\xa4\x9c\x16\x90\x03\x82\x39\xa6\x45\x49\xaa\x12\x95\x2c\x2f\x8b\x7c\xa4\x45\x1e\xfe\xbb\x2c\x69\xe0\x91\x5f\xf3\x46\x97\x90\x6f\x85\x5b\x7d\x71\xcb\xcd\x5f\xb5\x0f\x6f\xc4\x20\xf7\xe1\x32\x6f\x13\xec\x55\xee\xac\x4d\xe8\x7c\x2e\xaa\xb8\x95\x0e\xd1\x42\x41\x08\xab\xc6\x6b\x0e\x70\xad\x1a\xef\x38\x28\x9d\x22\x8c\x0d\x6c\x85\xad\x06\xe8\x2a\x9c\x33\x42\x66\x73\xce\xea\xcc\x01\xed\x91\x3f\xab\x0b\xa0\xbe\xe9\x55\x7d\xa6\x48\xd8\x0e\xb4\xb5\xaf\xdc\xb6\x1e\xa1\x84\x1f\x44\x54\xbc\x3e\xa3\x0f\xef\x0e\xc7\x77\xd7\xc2\x0b\x6b\xb4\xfd\xe3\xed\x9d\x5b\x3c\x7d\x83\x61\xc3\x45\x51\x90\x4a\x53\x02\x2b\x4e\x88\x95\x9c\x01\x34\x78\xbc\x97\x8c\x22\xa1\xcd\xa9\xc6\x45\xce\x38\xd6\xa4\x82\x5a\xd2\xa7\x31\xe1\x0a\x99\x1e\xd4\xa1\xbf\x03\x1f\x35\x38\x05\xb4\xf8\xfb\x57\xfd\xe0\xfd\xf1\x47\x70\x38\xbe\xfb\xf0\x52\x46\xfa\x31\x99\x08\x62\x82\x57\x1a\xd1\x09\x90\x6a\x96\xbe\x16\x12\xa0\x72\x1a\x70\xed\x48\x4c\xc1\x49\x94\x1c\x13\x4a\x28\x62\x99\xcb\x81\x43\x55\x43\x25\xae\x48\x07\x0b\xad\x22\x10\x89\xbd\x3e\x9a\x10\x1f\x5e\xf5\xde\xed\x8a\x32\x4f\xaa\xcb\x29\x81\x59\x7e\x30\x10\x6b\x5d\x96\x51\x12\xf8\x3d\xcc\xab\x06\xcc\xe6\x7b\x6d\x2a\x4c\xeb\x63\x77\x1f\x38\xb4\x96\x18\xba\xb6\x0e\x48\x67\xad\xf3\xda\x59\x00\x5f\xfa\x02\x56\x47\x2b\xb0\x29\x7f\x69\xad\xdd\x63\x0f\x41\xff\x38\x81\x2e\x8a\x40\x62\x9f\xab\xd0\xeb\xfa\xc3\x15\x7f\xc8\x2b\x93\xe2\x7d\xe0\x5b\xab\x6d\x51\xc6\xca\x97\x41\x3d\x5e\x7b\xe9\x20\x66\xba\x3b\xa8\xca\x6a\xeb\x4f\xc6\x9f\xcc\x7c\xd9\xf3\xd1\x71\x40\xa3\xad\x66\x4d\x8e\xf4\x6b\xcc\x18\x78\x53\xd1\xb8\x01\x5b\x57\xe3\xca\xf9\x77\x73\x7f\xa4\x66\xee\x0c\x60\xce\x9b\x61\x00\x62\x98\xbb\xf0\x36\xec\xd3\x2f\x58\xca\x7d\xbb\x8c\x3b\xd7\x8b\x99\x05\xfd\xe3\x69\x7d\x7f\xe9\xbf\x4f\xf0\xa1\x0c\xf6\x65\x5b\xcd\x3f\x87\x5c\xc2\xbb\xbb\xe3\xd7\xf9\x84\xfb\x66\x71\x65\x03\xd7\xce\x18\x9f\x3c\xaf\x80\x2b\xb4\x21\x2c\x17\x84\xc0\xdc\x43\xd6\x1c\xca\x50\x7a\x99\x47\x6b\x7d\xf4\x1c\x65\x26\xb3\x00\x83\x55\xe7\x54\x3f\xf3\xa3\xdc\xd5\x51\x12\xfd\x49\xf4\x3e\xba\x5b\x62\x8b\xdb\xc0\x0e\xbf\x3d\x84\x6f\xe0\xa0\xab\xbd\x2b\x39\xd7\xbb\xfe\xc0\x7f\xb1\x00\x29\xca\x25\x93\xa6\xed\x62\xa5\x16\x83\x29\x5d\xd7\xc5\x52\x51\xa6\xa5\xac\x87\xee\x11\xef\xfb\x99\x27\xd5\x2f\x59\x52\xcc\x62\x57\xdb\x92\x73\x4a\x98\x74\xda\xe9\x65\x8f\x4a\xbb\xec\x31\x42\x99\x74\xc6\xfa\xcc\x9e\xac\x3d\x45\xc7\xa4\x7a\xe6\x01\xd3\xbc\x2a\x97\xbc\xf5\x50\xfe\xfd\xba\xb8\x7f\x88\xa5\x58\x02\x57\x94\x06\x15\xa0\x31\x45\x09\xa2\xc7\x16\x44\x65\xa5\x62\x5d\xe4\x9e\x57\x85\xaf\x93\xd6\x87\x4a\x29\x18\x1f\x2d\xb8\x78\x02\x1a\x2f\xec\xe5\x02\xcc\x79\x56\xe1\x6d\x7f\x82\x55\x85\x89\xa2\x58\x6b\x42\x5c\x10\xa8\x9a\xad\x54\x52\xeb\xc5\x8f\x12\x52\x4a\x6f\x57\xde\xff\x7d\x82\xb7\xdc\xe3\x7e\xf3\xc2\x1f\xd6\x9e\xbe\x37\xe6\x84\x25\x6c\xdd\xfc\x8e\xbb\x4f\x57\x7d\xbb\x5f\x93\x07\x1c\x23\xe2\xf5\x7c\xaa\x40\x07\xac\xc5\xd4\x70\x3f\x40\x53\x3e\x47\x14\x9a\x8a\x56\xe0\x62\xe4\x4c\x13\x69\xda\xe5\x29\xe2\x8c\x90\x1c\x11\xe6\xd3\x83\xd2\x3c\x77\x75\x35\x6a\x5c\x0b\x57\x67\x8d\x49\xb5\x85\x4e\x3e\x4d\x9c\x73\x6d\x8d\xce\x9c\xaf\x31\xc9\x6c\x56\x6c\x3c\x50\x49\xfd\x0f\x38\xde\xff\xff\x0b\x1f\xe2\x6f\x1d\xe9\xa7\x70\x16\x47\x84\xbd\x9a\x87\x20\x10\x60\x96\xe3\x7d\x8e\x2a\x53\x5e\x18\x32\x90\x96\x09\x52\xf5\xe2\xee\x51\x86\x71\x0e\x31\xf1\x15\x18\x34\x9f\xf5\x41\x69\x96\x99\xed\x70\xad\xcb\x1a\xb5\x1e\xae\xaf\xbf\x39\x54\xc7\x39\x8f\xfe\x24\x81\xcf\xf0\xd8\x06\x7b\x73\xbb\xad\xa4\x3f\x07\xfe\xb4\xff\x12\xfd\x6f\xd1\xff\x11\xfd\x9f\xd1\xff\x75\x95\x89\xfe\xcd\x67\xf9\xb5\xd8\xf2\xb6\xaa\xad\x45\x90\x17\x98\xed\xc7\xab\x9d\x2b\x96\x2f\xf0\x2b\x3d\x9c\x8d\x01\xa3\xe3\x08\x13\x44\x85\x36\xfe\x1c\x96\x37\xc6\xb5\xf1\x17\x8e\x30\x45\x4c\x28\xa3\x92\xf3\x53\x66\x02\x87\x4b\x45\x38\x84\x15\xe3\xd2\xc0\x9a\xd2\x4a\xeb\x79\x32\x8c\xe4\xd2\x21\x60\x5f\x76\xb4\xc9\xf3\x2c\x13\x99\x62\x6c\x3e\xa3\x92\x17\x08\x5c\x50\xc9\x4b\xe8\xbb\xeb\xff\x3a\x18\x4a\x50\xb5\xd8\x6e\xc9\x7f\x63\xcf\x9b\x79\xe0\x80\xe5\x04\xe5\x05\xab\x4a\x58\xb0\xaa\xc8\x59\x09\xbd\x98\x6d\x51\x2a\x08\x51\x3c\xbc\xee\xf5\xfe\xe4\x4f\x18\x17\x7e\x04\x12\x90\xe5\x64\x30\x0c\xaf\x2d\x22\x88\x60\x18\x5e\xa3\xdd\x2e\x7a\xc6\x47\x15\x0f\x6f\x96\xf0\xc3\xfb\xe3\xbb\xfb\x4f\x4b\xf8\xba\x5a\x44\xf0\xe2\xb5\x7c\xba\x7b\x77\x14\x99\x32\x73\x9d\x2b\x96\x40\xea\xb3\x00\x08\xde\x36\x23\xb3\xae\xa1\x32\x8b\x2b\x29\x7d\x09\x24\xf3\xe3\xf2\xd7\x6c\x3a\x9f\xc9\xf4\x0f\x1d\x23\x19\xff\x5f\x8d\x51\x27\xe9\x51\x1d\xe8\x95\x45\x7f\xbf\x0f\x63\x7c\xd8\xf8\xf3\xbe\x39\x0f\xdf\xbb\xc7\x2c\x03\xf0\x39\x3a\xf0\xe7\xe8\x29\xf4\xfb\xbe\x6e\x67\x99\x31\x5a\xc9\x2c\x2e\xa5\xf4\x11\x70\xcc\x0f\xcb\x5f\xbd\xad\xf9\xed\x41\x46\x3f\x85\x18\xf4\xaa\x73\x6f\xfb\x79\x59\xf5\xe3\x2d\xc7\xfe\xe9\xce\x81\xd2\xf7\x2f\xa2\xa4\x8b\x27\x49\x7c\xd3\x1b\x2e\xa5\x55\x0d\x19\xac\xef\x01\xf1\xe3\x4e\xb4\xae\x69\x5c\x6b\x1a\xcb\xb4\x34\x92\xcd\x5d\xcc\x9f\x23\xeb\x6a\x80\x6c\x13\xc5\xc9\xf4\x8c\x8f\xcd\xfe\x1c\x25\x2b\x8b\xca\x8b\x5e\xc5\xcf\x9b\x5e\x45\xc0\xf3\x7c\x77\x7b\xb7\x23\x49\x34\x47\x24\x31\x9e\x38\x77\x06\x25\xa6\xa6\xa1\x2e\xcb\xbd\xf3\x0e\x8d\xd2\xf7\xfb\x73\x68\x49\x8c\x2e\x19\xed\x9b\xd2\x77\x5e\x41\x4e\x59\xe6\x00\x02\xed\xe2\xd3\xd0\x8d\x97\xed\xc7\xb0\x5e\xad\xd5\xaf\x87\x38\xf9\x61\x77\x77\x5c\xa3\xeb\x9f\xff\x0d\xf8\x29\x79\xa1\x26\xb8\xb9\xe3\x20\x0d\x9d\xfb\x97\xbc\x71\x71\x1a\x37\xc5\x4c\xe7\xbe\xa1\x23\x75\x3c\x93\x44\x61\x2a\x0b\x9f\x2e\x01\xf8\x9e\x2f\xbf\x66\xfd\xe4\x89\x1f\x24\xaf\x95\xd6\x5a\x53\x95\x5b\x50\xc0\x49\x4d\x17\x13\x6a\x9e\x49\x16\xe9\x23\x0d\x79\x94\x15\x21\xb0\x45\xd9\xdf\x1f\xbf\x06\x5f\x7c\xf8\xcd\x4f\xaf\xe7\xf3\x4e\xf9\x01\xf4\xb8\xa8\x2b\x58\x2a\x02\x8d\xc5\x43\x7c\x7a\xf9\x08\x95\x3a\x7c\xd4\xcf\x86\x56\xaa\x22\x71\x4b\xa0\xaa\x48\xd2\x80\xc1\x3e\x12\x0d\x8b\xd4\xa5\x02\x90\x5a\x39\xd3\xfd\xfa\x23\x70\xd2\x86\x58\x8d\xc3\x6b\x04\xe2\xf6\x19\xef\xfa\x78\xdc\x14\x53\xb6\x2e\xf7\x37\x24\xcc\xfd\x06\x12\xdf\xc4\xe7\x12\x52\xe5\xa8\x2c\x14\xe2\x5d\xd3\xd4\xb5\xee\xfb\xba\xee\x68\x5e\xc4\x23\xa1\x84\x94\x92\x73\xc1\x65\xdf\x07\xc4\x0d\x86\x51\x94\x46\xf8\xb9\x3c\x36\x07\xbb\x71\x93\xfe\x8b\x08\x5d\xe9\x7d\xbe\xac\x92\xf7\x2f\xe8\xa3\xe5\x11\xbf\xdf\x64\x52\xee\x6e\xde\xad\x04\x20\xf7\x7f\xf1\xd3\x37\x8c\x04\xab\xde\xe9\xfb\x87\x4f\xf7\xc9\xc3\xa7\xfb\x77\xdf\xaf\x0b\xd8\x2e\x2a\x8b\x04\x7e\x51\x3b\xf3\x65\x98\x92\x12\xf9\x68\x5f\x7c\x39\xb9\xc5\xda\xed\xc4\x49\x0b\x05\x4e\x45\xae\x32\x4c\x29\x7c\x4a\x21\xaa\x48\x4e\x8b\xa2\xcf\x84\x90\xaa\xeb\xd2\xbe\xdb\x9d\x33\x99\x1d\x2c\xc4\x9a\xc9\x51\x93\xf9\xec\x1b\xc9\x3d\xf1\x27\xdf\xd6\xdc\x00\x0c\xf0\x0c\x8b\x52\x15\x8e\x57\x30\xbe\xcc\x10\xe3\x4c\xa6\x85\x3b\xe9\xf0\x25\x1a\xb9\xef\x38\xca\x5b\xd7\x65\xa7\x0d\x53\x2a\x77\xed\x51\x85\x73\xff\xf6\x6c\xbf\x3d\xd6\xb7\x61\xa3\x28\x49\x70\xd0\x77\x91\x61\xf5\x0b\xfc\xc5\xc7\xef\xf6\xab\x3a\x5d\xf4\xfe\x45\xd5\xed\x0d\xa5\x78\xfc\xe9\xc3\x1e\x9b\xe2\x0c\x22\x7a\xbe\xd4\xfe\x22\x00\x1e\x19\xd4\x15\x55\x8a\x5b\x3a\xeb\xa4\x92\x35\x67\xf2\xe2\xc7\x83\xac\xa8\xb7\xad\x5b\xbc\xbe\xf6\x24\x40\x65\x85\xc2\x52\xcc\x10\xa1\xb6\x35\xfa\x32\x22\xac\x47\xf3\xda\x33\x9d\xb0\xad\xaf\xed\xa7\x57\xc5\x8d\x15\x8a\xb7\xf1\x87\x1d\xc3\x2c\x5e\x4d\xc5\xcf\xe1\x19\xb9\x03\x10\x57\xba\xc4\x71\xaa\x28\xe7\xdc\x47\xf1\xc9\x8f\xd3\x94\x01\xe8\x1b\x7c\x16\x2d\x7e\x8e\x40\x9e\x9d\x26\x3f\x1d\xa4\xd0\xc8\x08\x88\x6a\x4a\xf9\xd9\x9c\xcd\x64\xbd\xe9\xa5\x03\x85\xe5\xca\x9c\xd7\xeb\x47\x9f\x55\xc0\x3e\x16\x5b\x36\x62\x75\x9d\x3f\xaf\x0d\x1f\x6b\x3e\xfb\xd3\xdd\xcd\x7d\xc8\x3b\x03\x68\xaa\x18\xfb\xc0\xf7\x67\x9d\x9b\xb5\x73\x5e\x02\x6d\xd2\x8a\x28\x73\x50\xd0\x5a\x6f\xec\x4c\xb3\x38\x9a\x53\xbe\x2c\x36\x43\x1e\x37\x16\x88\x54\x09\x36\x2e\x73\x77\xd3\x7e\xb8\x7d\x65\x3d\xf8\x0d\x85\xa5\xf7\x6b\x04\xb7\xd2\x84\x25\x6b\xdc\xb6\xf2\x7e\xbf\x86\x6d\x18\x44\x66\x89\xb6\x53\x7f\x31\x7e\x34\xcf\x11\x4a\x3a\xcf\xd2\x3c\x8e\xbc\x64\x00\x0b\x6f\x79\xaa\xbd\x26\x00\x72\x6f\x81\xcb\x53\xaf\x6c\xac\x67\xb9\x6c\xfb\x49\x6b\x63\x94\x31\xc6\x0c\xb3\xc2\xd8\xb4\x52\xd7\x20\xf3\x0d\x37\x64\x34\x18\x83\x00\x8e\x5a\x71\xa1\x2c\x70\x97\x9d\xa3\x2a\xfa\xef\xa2\xff\x10\xfd\x8f\xd1\xff\xf4\xad\xc7\xb1\xa1\xc0\x0e\xc7\x37\xce\xcf\xe3\x35\x03\xcb\xfe\x05\x05\xb6\x84\x5d\x1f\x02\x05\xcf\x57\xdc\x5a\x0f\x37\xfb\x4f\x77\x7f\x16\xdf\x7d\x7a\xb7\x31\xd1\xec\x7f\x85\x60\x5a\xf7\x8f\x45\xd5\x9f\x30\xd1\x1c\x63\x31\x4e\x43\x9d\x2d\x21\xa0\xc8\x8a\x13\x64\x55\x99\xa3\xaa\xf0\x4d\x51\x5b\x6d\x33\x46\x38\x2f\x41\xe3\x23\xea\x2d\x5e\x09\x5e\x2a\x2f\x49\x1c\x62\xa6\x75\xdb\x57\x92\x53\x26\xbe\x74\x22\x80\x74\x28\x5b\x42\x72\xd0\x0b\xac\xa8\x88\xcf\xac\x2a\x69\x95\xe6\x10\x55\x9d\x28\x8a\x3c\x47\x42\xa1\xb2\xaa\x1a\x8a\x32\x99\x41\x5d\x30\xcc\xf3\x8c\x42\x9c\x66\xbc\x44\xf3\xc4\xd4\xfa\x05\x67\x71\x6e\x20\xc4\x10\x76\x10\x2a\x08\x31\xa6\x8c\xa1\x12\x4a\xcc\x10\xae\x10\xa7\x15\x29\x14\xa6\x28\xe0\x24\xd3\x67\x18\xfa\x2a\xfe\xe4\xb5\xcf\xfd\x5f\x7e\xad\xeb\xb6\x3a\xfe\xfb\xad\x87\xe4\xb0\x7f\x25\x59\x5e\x97\xe7\xe5\xa2\x85\xe5\xfa\xfd\x4b\x33\xc3\x9b\x12\xb3\x7a\x1a\x14\x68\xf3\xd2\x56\x85\x67\x71\xe3\xcf\xb5\x92\x9d\x97\x71\xf5\xa4\x31\x2e\x40\x79\xf2\x97\xd8\xce\x4d\x4c\xd6\x8d\xf1\x06\xab\x33\xb3\x27\x72\x8e\xb3\x56\x4b\xd5\xec\xcf\x7e\x72\x0e\xe4\xc1\xf7\x1f\x65\x0d\x11\x11\x62\x2e\x62\x93\xa5\xaa\x42\xe3\xdc\x73\x3e\x70\xde\xb3\x04\x13\x0a\x45\xf1\x54\x70\x0e\x15\xc4\x18\x4b\x46\xa3\x5d\xc0\x5e\xf1\xc0\x67\xfb\xa2\x07\xbc\x02\x05\x93\x9f\x3f\x5f\x93\x82\xad\x07\xfe\xe2\x60\x6e\x89\xd5\x80\x18\x2e\x14\xc3\xd8\x0e\x17\x25\xa0\x62\x48\x67\xc5\x78\xa9\x5c\x20\x56\x11\xb5\x00\x25\x2d\x4c\x41\x3c\x35\x39\x31\x04\x48\x68\xcb\x5d\x99\xe6\xda\x42\x5f\xf9\x4b\x5e\x08\xe4\x3a\x8c\x17\x03\x51\x9f\x8b\xdc\x4c\x40\x56\xbe\x7e\x52\xae\x2f\xbb\x3a\x2d\x9f\xa3\x13\x3e\x8d\xe3\x94\x5d\xba\x70\x1f\x68\xe8\xd7\x83\xd1\x3f\x0d\x95\xb9\x17\x7c\x36\x0c\x6b\x6a\x30\x04\x5f\xb3\x11\xaf\x09\x2a\x70\x73\x7f\xf3\xfd\xed\xbb\x87\x4f\xfb\x4f\xf7\xef\x6e\xef\xdf\x3d\x7c\x58\x82\xae\x77\x0f\x9f\x96\xa0\xeb\xc8\x03\xa5\x7b\x63\x71\x95\x9a\x42\xf9\x0e\xd7\x6c\x95\x49\x8a\x2b\x7e\x69\xe7\xae\xae\x9d\x03\xba\x9d\x8b\xe5\xf5\x00\x3d\x92\x4f\xdd\x29\xad\x04\x6a\x11\xa1\x43\x02\x25\xe8\x7e\xa9\xf7\xe3\x17\x45\xf6\x43\xb7\xfc\xf1\xb2\xef\xfb\xde\x37\x7d\x3f\x0c\xd1\x3f\xec\xfa\xee\xff\x41\xd7\xd7\x2a\xa4\x18\x36\x59\x3e\xf9\xf3\xf5\x05\x26\xa5\xaa\x7e\xf3\x02\x43\x7f\x2e\x4a\x85\xea\x11\x21\x44\xbe\xbe\xc0\xd2\x75\x65\x67\xf3\xaf\x2f\x70\x1a\x62\xc2\xf6\xc0\x43\x06\xfd\xcf\xa2\xfb\xad\xf2\xf9\x77\x21\x4b\xb5\x35\xa9\xde\xdc\x7d\xb8\xda\xbf\x8e\x31\x92\xf7\x57\xa2\x50\x2f\x45\x9c\x40\x96\xf5\x3e\xda\x7f\xfc\x17\x20\xc1\x60\x32\xca\xe0\xa6\xf6\x75\x5c\xbd\xed\x7b\x09\x73\x9d\xc3\xb8\x0d\x6f\x25\x4b\xb3\x1e\x40\xe2\xfb\xb1\x7b\x8e\x08\x40\x20\x62\x9d\x1f\x08\x80\x80\x32\x7f\x59\x8c\xa4\x05\x35\xf3\xfd\x5c\x13\xc0\x80\x3a\xf0\x99\x1a\xbc\xac\x6c\x20\xd2\x6f\xbb\x15\xe5\x25\x27\xeb\xab\xa7\x38\xcb\x24\xb2\x64\x71\x45\x05\xe3\x0d\x93\xbc\xe0\x27\xa9\x14\x14\xbe\x16\x1a\x77\x51\x04\x76\xec\x99\x05\x2c\x77\x16\x72\x3e\x21\xe7\x79\xfb\x3e\x5e\x3d\x8d\x1d\x73\x58\xb5\x38\xab\x73\x24\xce\x17\x71\x90\xbf\xf4\x65\xb1\x8c\xf2\x1c\x99\x0a\xf3\x68\xbb\xcf\xbb\x7c\xd3\xc8\xf8\xcb\xc0\xd4\x10\xee\xf3\xf2\xf6\xd3\x15\x42\xfd\x0f\xdc\x68\x58\x2b\x4a\xed\x73\xe4\x87\xa9\x2b\x2b\x25\xa9\xc9\x0b\x3f\x78\x5b\xf5\x4d\xd3\x16\x27\xed\x24\x90\xac\xb2\x25\x9d\x2f\xa6\x10\x56\x02\x87\x5c\xb5\x2b\xb2\x70\xb3\x4b\x7f\x29\x2b\x8a\x51\x37\x61\x82\x29\xbc\xba\xdb\xcd\x13\x6f\x86\x6a\xac\x8b\x6f\xa6\x53\x74\x88\x4c\xd2\x86\xbc\x51\x16\xfd\x18\x14\x4a\xd7\x9e\x9e\x0d\xde\xfd\x72\x97\x43\xba\xeb\x78\xf7\x8f\xc1\xda\x0a\xbb\x2e\x6b\xfb\x55\xf1\x66\xf9\xf8\x85\x79\xe6\xee\xf6\x7a\x01\xd8\xe8\xae\x87\x49\x4f\x93\x26\x9c\xd5\x74\x98\x4f\xe0\xe4\x9b\x0c\xc8\x82\x92\x3a\x93\xb0\xcc\xbc\x42\x00\xfa\xfa\x90\xfa\x1a\x4c\xcb\x57\xa2\xa0\x8c\xd1\x4c\x21\x98\x7b\x85\xe6\x1a\xe6\x32\x2f\xc1\x24\x32\xc4\x51\x81\x4b\x51\xe0\xbd\x3e\x9f\xb9\x77\x03\x23\x8c\x4b\x80\xfd\x89\x8c\x5c\xa4\x12\xe4\x94\x52\xe6\x4f\xb4\x17\xa9\xc8\x04\x28\x1a\x44\x4a\x82\xca\x62\x89\x0c\x7d\xbb\x21\x35\xa3\x68\x1f\x99\x67\x7c\x94\x89\xdc\x72\xe4\x7f\xb5\x75\x21\xbf\xb2\x28\x05\x94\xd9\xd7\x74\xde\x2b\x78\xe7\x3e\x80\x76\xde\x3f\x7c\xbe\xfb\xc1\x1c\xa6\x5f\xf2\x69\x9f\x7e\xb9\xd8\xe4\xf4\x54\x38\xdf\xd8\x83\xe6\x0c\xe2\x82\x57\x95\xaf\xcb\xe2\xec\x89\xf3\x7c\x2c\xba\x13\xf2\x75\x91\x48\x81\xfd\x99\x11\x6f\x3c\x8d\x0b\xbf\x32\x4f\xe0\x13\x84\xa2\xef\x05\x42\x02\x6e\x1c\x10\x38\x81\x01\x4f\x18\x58\x05\x5f\x62\x95\x6b\x8c\xd3\x77\xb7\xf7\xb7\x57\x97\x58\x83\xd4\x80\xe8\x39\xb2\x42\x60\x62\xa8\xe4\x3d\xbb\xa8\xaa\x90\x05\x8c\xa1\x84\x58\x90\xe4\xbc\x38\x10\xba\xb6\xc6\x1a\x31\xe3\xb8\x1b\x5b\x05\x32\xc0\x62\xdd\x0c\x70\xac\x61\x79\xae\x51\x17\x45\x71\x92\x06\x2c\xe3\xb2\xbe\xfd\xdb\x6f\xd7\xb4\xc0\x06\xfd\xd6\x16\x1d\x27\x87\xe3\x35\x2e\x2f\x90\xb6\xfd\x78\xfb\x2f\xb7\x7e\xe8\x15\x41\x7e\x14\x76\x86\x16\xb8\xa2\x72\xa8\x98\xcf\x89\xf2\x90\x10\xd8\x5a\x4e\x39\x1c\xe4\x00\xcb\x12\x4a\x51\xd1\x82\x92\xb2\x3c\x2f\x73\x5b\x4c\x45\x33\xd1\x73\x87\x74\xcb\xa6\xe6\x39\xda\x0f\xfe\x22\x25\x48\x43\x9d\xc3\x37\x26\xb0\x95\x70\x8a\x7c\xef\x7b\x01\x10\x60\x79\xd6\x4e\x75\x9d\xd9\x9c\x31\x75\x91\xc6\x80\x28\x15\x0d\x37\xac\x65\x92\x48\xd6\xac\xfe\xf2\xca\xc1\x70\x1b\xfd\xf9\x5a\xf3\x7f\x41\x6d\x6c\x7e\xdb\xfd\xa7\x87\xdb\x37\x8e\xb0\xdf\x6c\x5f\xfe\x5b\xb0\x9c\xce\x8e\x3b\x50\xb9\xae\x73\x7e\x70\x5d\x07\x35\xc4\x16\x56\xac\x01\xad\x93\x58\xeb\x2e\x5f\xdc\x0f\x93\x73\xa7\xa9\x62\x42\x1c\x16\xf3\x6f\xeb\xba\x69\xac\x37\x58\xab\x27\x1a\x0f\x08\x99\x1a\x54\xde\x68\x8d\x2f\x9d\x37\xaf\xdd\xce\x17\xa6\x08\x5f\xef\x3d\x4a\xc4\xdf\x77\xef\xef\xae\xef\xbd\x01\x85\x01\xb9\x9f\xea\xc5\x35\x32\xcc\xf0\x51\xf8\xb3\x82\xa5\x2c\x51\xcc\x25\x44\xea\xe5\xe6\x3b\x67\xac\x91\x33\x8c\xc7\x53\xa7\x40\x0a\xf8\xf5\xcd\xef\x43\x3f\x9f\x38\xba\x1d\x8d\xfe\x51\xf0\xa8\x03\x5d\xd4\xfb\x95\x99\x76\xff\x1b\xd4\x5e\xc9\xc9\x9f\xe7\x91\xc4\x12\x44\x36\xcb\x80\x01\x3d\xf3\xec\xa9\x4f\x88\x0f\x15\x87\xa4\xf8\x25\x4d\xca\x79\x8a\x73\xdf\x25\xf6\xa2\xad\x06\x45\x95\x67\xa3\xb0\x32\x35\xad\x6e\xad\x6d\x75\xbb\x6a\x41\x64\xcf\xe2\xa8\x77\xd1\x5b\xbe\xfa\xee\xe6\xfb\x1f\xee\x8a\xcf\x57\x9d\xa9\x8b\x1b\xf5\xb0\x78\xd7\xd3\x97\xde\x81\x31\x26\xb0\xcc\x6d\x49\xd1\xcc\xe6\x61\x8a\x9d\x8f\xe2\xc8\xc6\x91\x8f\x76\xd1\xac\x7d\x57\x16\x45\xd6\xd3\x01\x96\x48\x24\xa7\xa0\xd4\x12\x30\x96\xe7\x67\x7c\x54\x07\xb4\x71\x97\x3d\xbc\x55\x5c\xe2\x2b\xca\xac\xab\xda\xd1\xb7\x25\x97\xe0\xeb\x27\x75\xc2\xe7\xa1\xa8\xe2\xb3\x5a\xc2\x6f\x5e\x92\xac\xf4\x6d\xa1\x05\x63\x12\x51\xee\xaa\x89\x70\x79\x12\xd6\xbc\xb0\x31\x76\x36\x26\x73\x7e\x40\x33\xc5\x68\x46\xfe\x92\xd9\x8c\x1a\xd0\x0a\xc2\x39\xc7\x9c\x70\xe3\x28\x91\xa6\x05\x56\x79\xa9\x9e\x2e\x93\x0e\x36\xa0\xde\xd1\x23\x09\xf3\x70\xd5\x45\xfd\xda\xbb\x7c\xa3\x60\xff\x70\x24\xf6\x8b\xb6\x49\x9a\x17\x0e\x96\xbe\xa5\x83\xef\x09\x40\x31\x03\xc5\x99\x4e\xfe\x74\xc8\xfc\x64\x35\x48\xcb\xa2\x82\xa8\xe6\x02\x4a\xc8\x30\x65\x14\xbd\xf2\xfe\xf6\xbf\xe6\xfd\xbd\xfd\x86\xf7\xf7\xe6\x0f\xf2\xfe\xb6\x5e\x63\x70\x62\x27\x7f\x79\xe5\xfd\xcd\x41\x8a\xce\x67\xdc\xf4\xf4\x8d\xf7\x97\x2a\x33\xf0\xc0\xfb\xcb\x4c\x9f\xf4\xcb\x3f\xf3\x0a\x59\x0c\x20\x23\x96\x31\x88\x00\xf2\x18\x49\x27\x91\x1f\x8a\x02\x12\x68\x28\x65\x89\x62\x8d\x34\x94\x62\x6e\x38\x59\xec\xd3\xf0\xcc\x8e\xf5\x7e\x08\xd9\x82\xe8\xc3\xcd\xdd\xb7\x74\xe7\xb7\x77\x37\x77\xc9\x90\xd0\x19\xd3\x06\xe4\x3c\xb7\x05\xc5\xde\xf8\x93\x0e\x0f\x65\xba\xef\x9f\xf4\x3c\x95\x05\xe9\xab\x0b\x81\x38\xc1\x31\x5e\x6b\x71\x75\xc0\x79\xd1\xe8\xfb\xe8\xdf\x07\x1e\x8f\xf7\x87\xe3\xbb\xaf\x18\x63\x1e\xde\xfd\xfc\x61\x0d\xa8\x1f\x36\xbe\xca\x15\x9b\xf1\x37\xe0\x78\xff\x17\x3f\x5d\xe9\x39\xde\x84\x6c\xff\xc6\xdf\xb1\x12\x8b\x1f\x97\x68\xf8\xad\x83\xf9\xfe\xd3\xc3\xfa\x6c\xed\x04\x33\x3d\x67\x65\xaa\x33\xd2\x3a\xa2\x0d\x88\x62\x26\x05\xac\x1a\x88\x79\x55\xa8\x71\x24\x5c\x56\xb8\x1d\x70\x45\x64\x93\xaa\xa2\x42\xfe\x02\x4a\x2e\x08\x42\x94\x78\xe2\xa1\x4a\x33\x90\xab\xcc\x35\x19\xc1\xac\xaa\x90\x16\x5d\x39\x9c\x32\x5c\x96\x92\x1d\xa0\x60\x88\xa0\x4a\x95\x0d\x45\x14\xd4\xae\x42\x6a\x10\x55\x25\x25\xc5\x08\xfa\x46\x7b\x9a\x1b\x65\x1a\x49\x40\x1e\x17\x97\x5e\xa2\xa4\xd2\x0c\xf3\xb2\x62\xca\xe3\xb2\xaa\xd4\xa0\x39\x26\x02\x43\x2b\x99\x03\x91\x1e\x18\x46\x5d\xb4\x4f\xe0\xa6\x79\xb7\xae\x9b\xab\x2e\xd9\x15\x56\xe1\x15\x4c\xfd\x4d\xca\x7d\xb3\x5a\x49\x9d\xe8\x27\x69\x5f\x5a\xdb\xc6\x5d\xda\x0c\x03\x92\x82\xe5\x42\xe6\xa1\xba\x8f\x27\x81\x34\x12\x87\x6a\x16\x40\x2b\xaf\x94\xe7\xda\x68\x5f\x0b\x9a\xb9\x1c\x03\xa4\x8d\x6f\xa5\x21\x5a\x45\x71\x92\x07\x3f\xb5\x78\x51\x0a\x0c\x71\xea\x46\xc1\xf2\xe7\xe0\xfd\xf1\xc7\xe4\xe6\xab\x15\x6a\xed\x2e\x7f\xad\xbb\xac\x07\xd4\x26\xd9\xe0\x97\xa8\xd4\x08\x81\xa0\xc6\xc4\x9f\x6b\xaa\x11\x2c\x10\x82\xe5\x70\x46\x20\x9f\x7c\x94\xe4\x81\xa4\x5c\x17\x8a\x4a\xaa\x0e\xc5\x6c\x4d\x6b\x95\xa6\x8d\xc4\x90\x15\xce\x81\xcc\xd7\x82\xa5\x36\x2d\xd0\xd0\xe8\x5a\x37\x40\x98\x5a\xd7\x33\xe6\x42\x28\xb1\xe5\x2b\x68\x62\x0e\xf2\x4d\x5d\x79\x2d\x0e\xad\x4f\x46\x7c\xfc\x18\xb2\xae\x9b\xd9\x01\xc2\xe6\x15\xa8\x87\x2c\x05\x99\x3f\x15\xad\x12\x42\xd1\xb3\x02\x10\x7a\x07\x44\x9e\x2a\xc2\x45\x77\x90\xa5\x10\x76\x6c\x6c\x5d\x3b\x5b\x1b\xdf\x8f\x02\xe4\x60\xb4\xcd\x58\xcb\x8d\xfb\x63\x19\x13\x7f\x33\xe6\xc3\x2b\xd5\xfd\xcb\xa0\xb7\xeb\x98\xd0\xe6\x25\x10\x4d\x9a\x4d\xe7\x34\x6b\x94\x10\x02\x0f\x0a\xa4\xa5\x3f\x01\x98\x51\x4c\x84\x7d\x1d\x91\x92\x65\x48\xed\xc7\x93\x00\x05\x18\x2c\xd0\xb5\x94\xd3\xca\x89\x53\x6e\xfa\x63\xff\x2c\xfa\x97\x2f\x7d\xed\x1b\x7f\xec\x8f\xc9\x6b\xf3\xe6\xa7\xc0\x2e\x5a\x80\xbb\xa0\x3e\x74\x7f\x38\xee\x8f\x3f\x7d\xd8\xc4\xf5\x7e\xfe\x7c\xbf\xf6\xaa\xfe\x70\xb8\xe0\x66\x04\x8d\xef\xcc\x19\x3f\x47\xb5\xd5\x67\x7a\xe6\xbe\x03\x6d\xdd\x56\xa0\x9d\xcf\xa0\x42\x0e\xc6\x41\x33\x45\x33\xe7\x2f\xbd\x77\x04\x64\xb5\x69\x30\x9c\x62\xa8\x4b\x5f\x97\x50\x1f\xb4\xaa\xf2\xce\xf4\xdc\x28\xb0\xf8\x97\x64\x72\xda\xd6\xa6\xc9\x53\xfb\x14\x99\x4c\x99\x5a\x39\xc3\xb8\x86\xba\x22\x10\x0a\x7e\x5e\x1c\x8c\x72\xd5\x6e\x0e\xe7\x12\xb7\xd1\xfb\xe8\xcf\x97\xe7\xeb\x0f\x1e\x6c\x02\xff\x41\x87\x13\x97\x7f\x70\xcc\x24\xc9\x9e\x49\xd0\x95\xf8\x93\x2d\xd3\xf4\x8d\x17\xf6\x1b\x99\xf9\x57\x7d\x8b\xed\xb9\xbe\xfb\xb4\x78\x5e\x4f\x83\x05\x75\x5e\x9a\xb2\xf0\x25\xd0\xbe\x05\xd8\xbe\x68\x0b\xaf\x24\x79\x76\x96\x16\x98\x40\x07\x26\x4d\xc8\x30\x5d\xfc\x59\x29\x90\xc1\xaa\xc4\x78\x6e\x95\xa6\x54\x2b\xa5\xb4\x9a\x6b\x4a\x63\xba\xec\x44\xe7\x70\x8c\xed\xd6\xf3\x72\x1f\x7d\x5c\xb1\x0b\x2f\x46\xf1\x05\xed\xb9\xe9\xbc\xaf\xb8\xc9\x40\xe2\x0c\x1e\x6e\x16\xa7\xf5\xe7\xcf\x87\x0a\x30\x44\x05\x2a\x3b\x50\x16\x4e\x38\xa1\xa5\x6c\x69\xcf\x0d\x44\xc6\x18\x40\x8d\xaf\xfb\x7e\x28\x39\xcb\xf7\x52\x3a\x49\x18\x5d\x96\x0a\x3f\x1a\xa1\x85\x75\x5c\x73\x77\x02\x88\xfa\x62\x89\x00\x15\x68\xe3\x1a\x44\x73\x04\xa4\x4f\xa7\xba\x1d\x23\x10\x0d\x4b\x9c\xbd\xcb\xa2\xef\x57\xbb\x74\x45\xb2\x74\x1b\x2e\x0d\x20\x71\xe4\x45\x05\xc6\x4a\x1b\xce\x72\x83\x45\xe5\x73\x0e\xa4\x77\xbb\xcc\x23\xe7\xf9\x90\xd9\x0c\x60\xd0\x34\xeb\x33\x20\x9f\xe1\x11\xed\xca\xe8\x26\xe0\xda\xaf\xf8\x9c\xe2\xe3\xc7\x7f\x0d\x3e\x7f\x93\x6d\x5d\xcf\xfc\xc3\xa1\xac\x4e\x17\x4a\xbb\x6c\xe0\x1c\xa7\x45\xed\x38\x9c\x4f\xf1\x48\x44\x6d\x45\x5d\x77\x17\x32\x18\x7f\xda\x95\x17\xa8\x31\xb6\xfe\x42\x05\xd4\xdd\x9c\x23\x4c\xb9\x16\x8d\xa0\x54\x0b\xaa\xa0\x2d\xc9\x8b\xd6\x60\xa2\x36\x1f\xf6\xfe\x8d\x65\xea\xba\xdd\x76\x7f\xf7\x2e\xde\x5f\x51\x47\xed\xea\x02\xd6\x5a\x38\x47\xf3\x5a\x0b\xa5\x75\x27\x67\xe5\x9e\x9a\x24\xbb\xcc\x1d\x6c\x34\x63\x42\x72\x43\xe6\xf6\x20\x29\x41\x4c\x31\x48\x53\xc4\x25\x45\x18\x9a\x11\x5c\x32\xe3\x99\x36\x25\xc2\x95\xc4\x94\xcb\x0d\x07\xba\xea\x9d\x7c\xbf\xb2\xb8\x5d\x41\xbd\xc0\xc7\xef\x6e\x43\x1f\xcd\x4a\xdf\xd0\xc6\x4d\x51\x59\x54\xc6\xfc\xcb\xe8\x2f\xe6\x94\x59\x45\x4e\x25\x2e\x5d\x89\x92\x34\xee\x08\xaa\x28\x37\xb3\xf5\xa9\xe7\x14\x70\xc0\x14\xae\x59\xac\x5c\x0f\x07\x17\x45\x07\x30\x3c\xa3\xe3\x10\xb4\xf8\xdf\x07\x3e\xf3\xbf\x0c\x79\x9d\xd7\x58\xf4\xe6\xfe\xc3\xc3\x86\x90\xbc\xbf\xb9\xdf\x3f\xac\x08\x58\xf0\xb0\x3c\x68\xc9\x8a\x6b\x58\x57\xee\xc5\xf2\xff\xf4\x29\x2e\x27\x3d\x8e\x7a\x8a\xcd\x59\x81\xc2\x9f\xd4\x79\xd6\x1a\x61\x01\x61\x6c\xb4\x50\xfc\xa2\x54\x6c\x55\x0e\x8b\x94\x63\x45\xd1\x8e\x0d\x83\x7e\xe4\x3b\xab\xb7\x77\xe3\x85\x3f\x29\x41\x41\x06\xe8\xdc\xf8\x13\x01\x69\x9c\xcd\x3a\x16\x73\x8d\xcb\xba\x68\x15\x66\x01\x7f\x8e\x03\xae\xe4\xd7\xd7\x26\xd9\xae\xcd\x4a\x71\x02\x68\x5c\xe7\x85\x29\x8b\xf8\xfc\x85\x8d\xa6\xce\x99\x40\x01\xce\xbc\x5c\x99\x13\x82\x15\xa1\x66\xd6\x3e\xf2\x9c\x00\x02\x28\xc3\x0d\x8d\x4d\xd3\x96\x5d\xb3\xc6\xac\x36\xca\x93\x74\x7f\xba\xea\x73\x8d\xde\xd8\x7e\x6f\xee\x6f\x37\x1d\xdf\xf0\x9e\x6a\x5f\x1b\xc3\xf9\x24\xc4\x14\x5e\xf7\xa7\x2f\x96\x34\xfb\x7e\xee\xd6\x66\xbf\xa7\x74\x6d\xae\x08\x9a\x51\xd5\xb1\xdd\x57\x41\xdb\xfb\x5a\xb1\x2e\xf0\x9c\x5f\x89\x17\x83\xcd\xd4\x85\xcf\xd7\x6f\x93\xb3\xab\x62\xc2\x5b\x90\x81\x9c\x7a\xe7\xcf\x97\xc5\x21\x84\xa3\xe4\x98\x4a\x50\x00\xd1\x50\x9f\xe7\x99\xcc\x41\x0e\x22\xe2\x2f\xfe\x62\xe3\x0c\x70\xe6\xdd\x7c\xd9\x57\x25\xb7\xad\x12\x95\xa3\xda\x30\x4b\x38\xa6\x18\xca\xf6\x39\x12\x2a\xcf\xb9\x67\x88\x39\x81\x84\x74\xc6\xc9\xd5\x4f\x73\xa1\xdf\x46\x06\x1c\x62\xc0\x59\xfc\xfc\xe9\xe1\xfb\x57\xbd\xcd\xe3\x6f\xb9\x1e\x6f\x2b\xeb\xa6\xc1\xf9\xe9\xee\xb8\xd5\x49\x18\x10\xa9\x4b\xe3\x68\xbe\xa4\x19\x38\xcf\x97\x2a\x36\xfd\x30\x10\x45\x49\xc1\x19\xf4\xa5\x6a\x35\xc8\xb5\xbf\x00\x98\x67\xfe\x02\x8a\x2c\xf5\x36\x1e\x7d\x8d\x24\x85\xaa\x62\xfb\x81\x50\x4a\x0c\x25\xba\x36\xb5\xf6\x8c\xd3\xcc\xa4\x08\x68\x7f\x99\x08\x40\xc0\x18\x42\x35\x25\x4f\xe7\xba\x1e\x98\xc0\x9c\x45\xfb\xc8\x44\x45\x12\xed\x4f\xd1\x7e\x43\x01\xae\xba\x47\xef\xee\x43\x6e\xf2\x85\xcd\x29\xdc\xbd\xc8\x17\x06\x9c\xb8\x14\x42\x08\xc9\xf9\xfe\xf4\xe5\xdc\xec\xbb\xb9\x05\x9d\x47\xcb\xa6\x5f\x5a\x63\x02\x0f\x6f\x14\xe9\xa3\x39\xd0\xe8\xbb\x2b\xd5\xa3\x55\x8e\x75\xb9\x6b\x87\x0b\xb3\x35\x90\x5e\x07\xa1\x79\xa5\x09\x10\x07\xaa\x31\xf4\xd8\xce\x3a\x96\x16\xa8\xb2\xb0\x38\xd8\x99\x80\xad\xc8\x56\x1d\xf5\xdb\x50\x8b\xfd\x96\xae\x31\xf9\xf9\xf3\xfb\xdd\xf1\xe3\xed\x3d\xd8\x3a\x6b\xed\x3c\x96\x71\x44\x27\x60\x68\x5e\x17\x54\x7b\xea\x9d\xf2\x46\x36\x75\xe1\xcf\x3d\x6a\x06\xd0\x51\x26\x88\x38\x64\xd6\x9f\x9e\x0a\x52\xa1\x1a\x76\x22\x67\x2e\x61\x4f\x55\x89\x2c\x2d\xe4\xbe\x9d\x8d\x30\xc2\xe8\x28\x02\x71\xf9\x8c\x0f\x69\xd0\x14\x5a\xcf\x25\xbb\x3d\xfe\x14\x27\x37\xc7\x57\x79\xb2\x8f\xc7\x8f\x37\xc7\x0d\x60\xfa\xe3\xee\xc2\xcb\xf2\x22\x95\x4c\x69\x51\xa4\x39\x45\x19\xcb\x34\xa1\x9d\x6c\x40\x79\x50\x3c\xcf\xfc\xf8\x64\x3c\xe3\x53\xcc\xe2\x02\xa4\xc5\x17\x91\xe5\x84\x64\x6d\x5f\x48\x42\xf7\x6d\xe6\xed\x9c\xfb\x92\x80\x26\x1e\x41\x57\x45\x51\xb2\xa7\x1b\xbe\xe4\x77\x21\x32\x0a\x75\xcf\x77\xa1\x4d\x6b\xf5\x17\x6f\xef\x3f\xdd\x6d\x2c\xe3\xf7\x2f\x16\xe9\xd3\xc3\x41\x57\x79\x3f\x77\xa7\xbc\xcc\xab\x5c\xe6\x55\x3d\x82\x02\xe5\xba\x80\xaa\x6d\x5b\xdb\x34\x07\xb5\x18\x61\xce\xbc\xd6\x4d\xd9\x18\x9f\xeb\xb6\x2b\x5a\xa7\x5b\x33\xb7\x31\x36\x6b\x4d\x8d\xc4\x2f\x7a\xc9\x1f\x7f\x3d\xee\x87\x75\xc8\x65\x8b\x5f\xc3\x88\x4f\x77\x3f\x03\xfb\xf5\xc8\x00\xeb\x02\xb2\x36\x75\x75\xde\x08\x9b\x35\x5d\x3a\x82\x0a\x7e\x33\x7e\x5e\x74\x56\xb7\xc6\xbb\x13\x6b\x41\x69\xb6\x58\x3c\x70\x9a\x1f\x5d\x0c\x43\x1c\x7e\x55\xc0\x7a\xff\x2a\xac\xb8\x16\xb7\x76\x51\x59\xcf\x0a\xc7\x85\x99\x69\x7c\x2e\xb2\x3a\xcb\x63\x9a\x17\x0a\x95\x62\xae\x86\x38\x47\xb3\x03\x91\x77\xd4\xd2\xde\x60\x96\x11\x5c\x16\x04\x13\x33\xa0\x1a\x6f\x1c\x1f\x60\xdc\xb8\x6f\xaa\x4d\x9f\x3e\x78\xa7\xeb\x88\x57\x1d\xf1\xa1\xfa\xf4\xc2\x7a\x7a\xff\xee\xfb\xe3\xc7\x9f\xff\x16\x84\x76\xb9\xfd\x8b\x13\x74\xed\xe0\x6f\x69\xe8\x3d\xd4\x79\x0e\x74\x3f\x53\x1a\xb3\xc6\x3b\x58\xe9\x02\xd2\xaa\x50\x65\x59\x14\x04\xc8\x27\x68\x2f\xc6\xd4\x23\x75\x1d\xb8\x78\x11\xb3\xb8\x35\x20\xf3\x67\xa2\x30\x2c\x30\xaa\xca\x19\x83\x12\x43\x0e\xc9\xc1\x94\x59\xce\x7c\x5b\x4b\x33\x41\x04\x21\xac\x2a\x08\x51\x95\x66\x4a\x14\xfe\x02\xf0\xa3\x01\x92\x0c\x5a\x53\x49\x8c\x1d\xbb\x4e\x2a\x41\x33\x9b\x17\x90\x15\x10\x86\x1a\x77\x1c\x70\x28\xed\x01\x46\x7f\x1c\x3a\x16\x83\xde\xed\xbb\xa0\xa3\x74\x1b\xaa\x96\xcb\x4f\x28\xe0\x1e\xb6\xcb\xfd\x69\x0d\x0e\x75\x2c\xd0\xe9\x49\x81\x0b\xf2\x90\xeb\x2a\x8e\xfc\x08\x84\x6f\x08\x28\xc5\x45\x08\x3f\x51\x90\x63\xdf\x00\xa1\x20\x11\xe6\x00\x55\xd5\x18\x33\x78\x51\x71\x73\xb6\xcf\x91\xd5\x0e\x44\x97\xda\xd4\x93\x3d\x33\x42\x5d\x04\x62\xf9\x8c\x77\xd5\xaf\x34\x5d\x13\x6b\x2b\x64\x4b\x48\xfa\x83\xac\xba\xee\x8b\xda\x45\x8c\xba\x4d\xd3\x35\xa2\xcf\x38\x5e\xe6\xc2\x8f\xeb\xbf\xf9\xee\xe6\x35\x59\xf2\xdd\xcd\x9a\xea\xbb\xfd\xe9\x5a\xb3\x31\xce\x34\x12\xc2\xe8\x8a\x96\x8c\x20\x94\x4a\x4b\x3a\x9d\xe5\x82\x30\x2e\xb0\xd0\x14\xe1\x83\x22\xd6\xf9\xd1\x13\x6f\xbc\x2d\xeb\x12\x44\x20\x22\xf4\xac\xac\x03\x95\x26\x0a\x4a\xa6\x8d\xc2\x4c\xc8\xd7\xf1\xcf\xff\x4f\xc6\xe7\x9a\x68\xad\x35\x56\xa5\x12\x10\xa6\xa6\x23\xa7\x65\xc1\x65\x4c\x29\xaa\x34\x27\xfc\xa0\x88\x73\xfe\xf4\x36\x7e\x0e\x72\x8c\x2f\xc6\x3a\x00\x25\x37\x50\x52\x63\x14\xe6\xf2\x75\xfc\x04\xfd\xde\xf1\xe3\xe3\xc7\x1f\xbf\x19\xbf\xd5\xcc\x59\x63\x88\xa9\xac\x44\x28\x75\x13\x01\x51\x57\x16\xb5\x60\xc6\x72\xab\x15\x53\xcb\x01\xd4\xfe\xec\xf1\xd5\x01\x10\xf2\x1c\xd9\xe5\x08\x2c\x31\x68\x3d\x02\xa1\x74\x94\xc4\x7d\x88\xb5\x57\x9d\xdb\x0f\x6b\x5f\xd5\x43\x58\xea\x62\xb0\xac\x6a\x5b\xff\xd4\xc3\xd7\x9d\xd8\x49\x0a\x4c\x9e\xba\x2c\x8f\xab\xb9\x93\x5e\x73\x40\xb8\xd7\x49\xa4\x25\x97\x1a\xb9\x02\x13\x98\x99\x9c\xd7\x8e\xef\x9a\xf1\x7c\x1e\xed\x53\xe7\xa5\x06\x3c\x1e\xe3\x8a\x0a\xa5\xe9\x5c\x3f\x35\x45\x4e\x1a\x34\x09\xc2\xc3\x75\x20\x5b\x5e\xf8\xfd\x8a\x37\x88\xf6\xc7\x1f\x37\x26\xfb\x57\x43\x9c\xf4\x54\xe6\x40\xc7\x0c\xcf\xc6\xa3\x02\x22\xab\x5b\x61\x40\x73\xd0\xba\x7a\xb2\xf3\x44\x1b\x1e\xf3\xc4\x64\xe9\x2f\xed\xa1\xca\x66\xe5\x33\x4f\x39\x30\xc0\x25\x69\x16\x38\xeb\x38\x68\x8e\xcd\xa1\x0c\xab\xe2\x9f\x7e\xcd\xb3\xf5\xca\x13\xfc\x37\xf1\xcd\xfd\xee\x52\x75\x67\x98\xda\x82\xfb\xce\x9f\x58\x7c\xf6\xc8\x39\xed\x5c\xa2\xfd\xb9\xcc\x4a\x0e\x1d\x46\x22\xe9\x67\x16\xe7\x5e\x84\x07\xf9\x10\x47\x21\xbf\xf3\x92\x4f\xfb\xab\xa8\x8a\xfe\xdb\x97\x1e\xd5\xb5\x9f\xeb\xee\xe7\xeb\xbc\xd6\xf1\x55\xc9\x67\x63\xaf\xd9\x88\xc9\x16\x53\xf8\x5a\xe0\x5f\x8d\xd5\x0e\xba\xbc\x88\xad\x79\x72\x16\xe0\x12\x0c\x02\x62\x41\x7d\x49\xa0\xa8\x48\x0a\xa0\x04\xc8\x77\x92\x1b\x6a\xd5\x73\x14\x63\x4a\x39\x16\x4f\xe7\x38\xcb\xd2\x3a\x8b\xcd\x3c\xd5\x40\x53\x0f\x5b\xe3\x53\x02\x8c\xf2\xf0\xa0\x0b\x04\x9f\xb2\x44\x3c\xe9\xe4\x42\xfc\xb9\x54\x0c\x71\x46\x39\x62\x6c\x5a\xdc\x57\xe9\xed\xd9\x72\xc1\x1d\x62\x92\x2b\xe1\x05\x42\x39\x37\x0d\xae\x25\x28\x7d\xcf\x2c\x0a\xf5\xd1\x38\xda\xf8\x15\xde\x70\xc0\xab\x16\x65\x04\x36\xc5\x93\x9b\x50\xba\xb9\x7f\x07\xbe\xe9\x38\xb9\x6e\x4d\x7e\xc9\xe8\xc4\xd5\x1e\x79\x01\xc4\x63\x0a\x84\xe7\x49\x71\xf1\x6e\x18\x00\xbb\x98\xe1\xf1\xbc\xe3\x3e\x5b\xa5\x8a\x54\xac\x7c\x61\x12\xf4\xd4\x2d\xdb\x01\x2b\xee\x39\xb0\x41\x49\xfe\xe4\x96\x3f\x5e\xce\x27\xa1\x2f\x17\x2d\x00\xe6\xbe\xe3\x8b\x3f\x87\x42\x4e\x56\x47\xbf\x8b\xfe\x59\xa8\x38\xbd\xf5\x43\xbc\xff\x8a\xf2\x76\x99\x5b\xfb\xad\x59\xef\xeb\xbe\xe2\xc0\x67\x73\x5d\x56\xbb\xdb\x14\xa6\x63\x1c\xa3\xbc\x74\xb0\x8c\xe1\x97\x3e\x11\x12\x8b\x91\x29\xd5\x29\xaa\x14\x13\xc4\x68\x39\x97\x36\x21\xd6\xa7\x55\xac\xa4\xc0\xac\x50\x88\xcc\x53\xc5\xea\x06\x19\x01\x4d\x96\xfb\x8b\x3f\x95\x14\xf9\x93\x03\x97\x22\xf3\xe5\x7e\x82\xb0\xc2\x54\x97\x08\x63\x25\x28\x62\x95\xa8\x50\x55\x71\x88\x70\xea\x25\xd0\xf3\x59\xcf\x2d\x63\x99\x49\x09\xb0\x4a\xa4\x15\x2f\x6d\x57\x21\x88\x72\xcd\xdd\x2c\x93\x0c\xe1\xc0\xbf\xbf\x72\xf3\x54\xa1\x6e\xfd\xb7\xa1\xa6\x1a\xa2\xe4\x7f\x02\xfe\xf4\x45\x0e\xe1\x3a\xb0\xdb\x48\xf3\x3e\x26\xc1\x19\xfb\x96\xa6\xf9\xb5\xcf\x3f\x69\xec\x59\x49\xbe\xbb\x3c\xda\x1d\x9f\x27\xc4\x08\x52\x25\x13\x0e\x7b\xd8\x29\xc5\x72\xd3\xe1\x22\x91\x4f\x9a\xc7\x4d\xe0\xc5\x22\x4a\xd0\x5c\x08\x38\x93\x36\x80\x29\x92\xa1\x9b\x27\x4f\x08\x88\x80\x01\x59\x7c\xd1\xbe\x56\x14\x57\x18\x57\xa4\x2a\xb5\x04\xd4\x8f\x45\xa9\x60\x05\xe3\x8b\x7c\x3a\x19\xa3\xfd\x89\x91\xdc\x14\x08\xa4\x25\x66\x4a\x6c\xbd\xc7\xd9\xd6\x07\xfa\x82\xcd\xfd\x8f\xdf\x62\x73\xdf\xaa\xc4\xab\xed\xda\xff\x26\x60\xe6\x15\x79\xb2\x9c\xfa\x87\x9f\x3f\xbf\x8f\xf6\x3f\x7e\xf8\xe9\xe3\xa1\xc3\x1e\xce\xa2\x8a\x8b\x38\xb7\x44\x1a\xe5\xa5\xc0\x0a\x49\xdf\x09\xac\x91\x48\x54\x2b\x74\x51\xf9\x36\xcb\x63\xe5\xf3\xa0\xa6\x6f\xce\x59\xed\x2b\x02\x84\xf6\x30\x2e\x8a\x6c\x3c\x95\x6d\x53\x37\x39\x48\x6b\x2d\x7b\x50\x2a\xa9\xfd\xe0\x1b\x40\x40\x06\xd1\x41\x29\x95\x1b\x04\x1b\x45\x25\x61\x1c\x33\x56\x31\x41\x38\xf7\xdc\x75\x04\xc1\x8a\x61\xed\x70\xad\x41\xea\x47\x66\x71\xad\x11\xc9\x33\x49\x44\x96\x4a\xd1\x95\x96\x67\x8c\x57\xfe\x5c\x97\x25\x82\x9b\xcd\x8c\x8b\xd0\x57\xf4\xb2\xde\x1e\x3f\x7e\x07\x94\xab\xb0\x15\x64\x78\x59\x6d\xb3\x7e\x5d\x6c\x93\xd8\x84\x39\x5b\xbd\xb1\xe6\xbf\x36\x03\x84\x79\x18\xd8\xb8\xbf\x03\xa1\xf4\x16\x5f\x76\xcc\xa7\x31\x9c\x7b\x3b\xf7\x31\xf4\x55\xd2\x59\xa6\xb4\x9e\x2b\x51\xda\x52\x1e\x2a\xfb\x74\xb1\x33\x89\x1b\x9b\xa4\x02\xfa\x6e\x5c\xee\x6b\xe4\xcf\xfe\x5c\x82\x22\xb4\x1c\x46\x49\x7c\x0a\x36\xbd\xba\xd2\x48\xf9\x7e\x99\x79\xff\x04\x3c\xfc\xf5\xe7\xf7\xf1\xfd\x5f\x44\xc9\xdd\xcd\x72\x03\xf6\x1f\x6f\xde\x2f\xd6\xf7\xa7\x8f\x77\x37\x47\xe8\x79\x06\x4e\xbe\xaa\x9a\xaa\x2a\x34\x72\xfc\x39\x82\x9e\x82\xa8\xcf\xcf\xbe\xc5\x2e\xc9\xbd\xca\x52\xaf\x0e\xd5\x5c\x3b\x65\xfd\xc5\x0f\x13\xf2\x2d\xe0\x40\xcc\x13\x44\x96\x60\x72\x30\x41\xdf\x65\x2e\xb4\xf5\xa7\x28\x8a\xc3\x71\xd8\xad\x4f\x2e\x74\xe4\x5e\x2b\xb6\x26\x77\x37\x77\x3b\xe1\x02\x06\x2a\x75\x73\xea\x80\x39\xc7\x97\x39\x3d\x48\xef\xac\xd7\x4f\x48\xeb\xa4\x9b\x59\x9c\x06\x7f\x25\x86\xe1\xff\xc5\x42\xee\x67\xd3\x04\x5c\xae\xdf\xca\xaa\xfe\xa7\xe0\xc7\xc3\x85\x78\x35\x5f\x92\xd1\xb7\xce\x67\xa9\xd0\x5a\x8a\x98\x1e\x98\x21\xa5\x77\xf6\x71\xda\xe5\xbe\xf2\xbc\x16\x0a\xb4\x71\x01\xfa\x72\xb9\x4e\xd5\x33\x0c\xb9\x97\x17\x95\xb7\x9b\x87\xe0\xb0\xad\xcc\x2e\xb7\x77\x9f\x56\xb3\xb4\x84\xa2\x37\x7f\x09\x6e\xbe\x3f\xde\xdd\x1c\x53\x3b\xb7\x13\x10\xd4\xeb\xb3\xf5\x4c\x83\x5e\xcc\xa3\x05\x9d\xf3\x08\x64\x99\x3f\x81\x2e\x05\x70\x8f\x66\x63\xbd\x6c\xeb\x13\x70\x5e\xf8\x0b\x07\x05\x90\x36\x16\x00\xfa\x7e\x36\x18\x01\xe2\x1b\x8c\xc0\x18\xf8\x57\xf0\x73\x1b\xb8\x5b\x56\x5d\xdb\x17\x2a\xf4\x97\x6e\x94\x70\x8e\xcb\x99\x82\x9b\xbb\x9b\x18\xf7\x6e\xb4\x20\xb2\xa7\xd3\x3c\x8c\xc9\xf0\x68\xfa\x64\x7c\x8e\x76\x2c\xf0\xbb\x6c\xec\xff\x01\x47\xf4\xa4\xed\x2e\x5b\xa3\xc9\xe5\xda\xd5\xcf\xf0\xf8\x92\x9f\xde\x3a\x50\xbf\x55\x24\x59\xb7\xbb\x4f\x77\xbb\xc1\xc5\xc5\x7c\x02\x93\xe0\x90\x96\x12\x55\xbe\x73\xbe\xb5\xe0\x34\x8f\x71\x79\x90\x17\xf7\x1c\xcd\x05\x63\xa9\xcb\x48\x5c\x3d\x9e\x76\xc5\xd3\x98\x34\x20\x72\xab\xb6\x18\x3a\xca\x6d\x9c\x97\x75\xf6\xf7\x08\xe7\xde\x25\x06\xd4\x36\xb4\x3a\x18\xce\x2a\x54\xb2\xaa\x3a\xdb\xb3\x03\xc6\xd3\xbd\x04\xd1\x73\x64\xfc\x65\x2e\x38\x4b\x5d\x4a\xe2\xf2\xf1\xbc\xcb\x9e\xc6\xa4\x05\xe9\x12\x4f\x89\x2d\x0f\xbd\x44\xda\xff\xf4\x05\x23\x18\xb8\x62\x43\xaa\x60\x79\xce\x6f\x03\x56\x3e\xb9\x03\x83\xab\xf6\xf9\x17\x2b\x6a\x3e\x99\xdd\xf4\x98\x4f\x7b\x9d\xe2\xa2\x48\x75\xa9\xa5\x4e\x1f\xb3\x83\x2e\xb8\xb2\x52\x34\x5c\xd1\xa7\xce\x0f\x20\x2d\xbd\x02\x32\xc9\xa2\x24\xb2\x1b\xf7\xe5\x3f\x8a\xb2\x90\x25\x5e\x7b\x79\x8e\xab\xf8\x4e\x18\x2a\xfb\xee\xab\xa1\xf2\x62\x9f\x7f\x71\x24\x27\x90\x0f\x72\x19\xed\xb4\xd7\xa4\x28\x53\xf5\x32\x98\x29\x30\x52\xbc\xc4\x95\x6c\x8c\x12\x4f\x53\x60\xa9\xf4\x12\xd0\xf8\x14\x1d\x92\x28\x82\x47\x7a\x70\x9b\x2f\xf3\x71\xab\x65\x3e\x7c\x1f\x94\x5a\x03\xe6\xe6\xbb\xcd\x97\x59\xb9\x6b\x42\x59\xea\xe5\x9b\x0f\x57\xdf\xec\x53\x5b\x82\x74\xe4\xc3\x28\xfc\x20\x40\xde\x02\xa7\x98\xe5\x7a\x56\x36\x43\xba\x02\xd4\x56\xb5\xe1\x4a\x2b\x5f\x0b\x80\x46\x40\x0c\x65\x82\xcd\x8d\xc9\x2a\x5d\x1e\xdc\xd9\xa9\x46\x35\x6a\x94\x9a\x83\x12\x44\x58\x0a\xce\xb2\xbc\xd1\x50\x79\x74\xae\x99\xd6\x9a\x8d\x52\x0b\x50\x4d\xc4\x10\xce\xaa\xbc\xd6\x50\x06\x9f\x9a\x87\x35\xe2\xaf\x36\x66\xd0\x0f\xef\x57\xfa\x8d\x9b\x0f\xef\xf7\x37\xdf\xff\x70\xf7\xd7\x9f\x03\x5e\xe6\x1f\x83\xbb\xfb\xc5\xef\x3b\x7e\xfc\x70\x73\xfc\xf8\x19\x70\xc6\x31\x28\x41\x49\xa5\x9a\xb2\x0b\x28\x32\x3f\x18\x60\x4e\x63\x5b\x54\xb9\x43\xd3\xdc\x58\x5f\x0f\xe7\x1c\xa4\xa7\xfc\xb2\x67\x65\xae\xb1\x59\x9e\xcb\x06\x1b\xec\x3b\x6a\xa9\x97\x55\x99\xa6\x45\x69\xf0\x44\x28\x03\x16\x5b\x0c\x2a\x6c\xf1\x8a\xc5\x7d\x86\x49\x7f\xc8\xa3\x7c\xcd\x7a\x1c\x8e\x9b\x83\xbd\xe5\x74\x43\xd5\xdd\x24\xd0\xeb\xa2\x04\xaa\x9c\x7b\x09\x2e\xd5\x73\x04\x4b\x41\x19\xe6\x84\x0f\xdc\x9f\x0e\xb9\xb5\x66\x2e\xe7\x96\xc7\x51\x5c\x18\x02\xb1\xc6\x48\x2b\x40\xc2\x14\x7e\xd5\x0a\x80\xd1\x77\xab\xfa\x6b\x20\xb4\x7f\x17\x8a\x8b\x77\xf1\xe1\xf8\xf1\x5f\x83\xdb\xe4\x2e\x3e\xfe\xb0\xdf\x6e\xd5\xe7\x9f\x92\xfb\x87\x90\x2f\xaf\x91\x69\x19\xf5\x63\xca\x38\xa7\x38\x35\x09\x2b\xce\x0a\xe4\xb4\xbf\x4c\xbe\x27\xa0\x1c\x1a\x42\x2f\xc4\xd8\xf2\x00\x7d\x41\x35\xa1\x40\xf9\xd3\x44\x25\x39\x01\xf2\x74\xf2\xfa\xcc\xb9\xc3\xad\x63\x16\x9b\x0e\xe4\x93\x76\x43\x38\x9e\xf1\xef\x3b\x9e\x9b\xe4\x35\x9b\xbf\x5f\xb3\xf9\xeb\xf1\xf4\x50\x3a\x4a\x9f\xa3\x94\x32\x4e\xa1\x4c\xf2\x7c\xe0\x17\xda\x75\xf5\x73\x44\x4e\xae\x41\x64\xc2\x5a\x5e\x1f\xcc\x78\xa2\x92\x8e\xeb\xc1\x3c\x47\x94\x3b\x62\x0d\xb5\x58\xf5\xa0\x38\xd9\x7a\x88\x7e\x17\x55\xcf\x78\xf7\xd6\x6b\xf7\xcf\xa3\xfb\xe8\xdf\x45\xff\x3e\xfa\x8f\x81\xbd\xe5\x57\x02\xa6\x9f\x1e\x92\x6f\xc9\x28\xdf\x1f\x1f\x5e\x3c\xc7\x5f\x6b\x26\xfe\xfc\xfe\xdd\xc3\xa7\xe3\xb6\x01\x6d\x4f\xf6\x72\xb1\x27\x3b\x4d\x3d\x68\x3d\xd6\x75\x0d\x24\x68\x3c\xd1\x75\xed\x0b\x5d\x75\x59\xae\xca\x3c\x74\xdc\x91\x15\x12\x08\xe4\x1c\xd9\x0a\xb2\xc1\x5c\x96\x3f\x07\xc9\x39\xd7\x8b\x63\xab\xfd\xe4\x8d\x54\x72\x79\xf1\xe7\x52\x54\x55\x89\xb0\x12\x52\x4a\xa1\x51\xcc\x61\xc5\xbb\x5c\x88\x49\xca\xb3\x10\x2b\xcf\xd3\x12\x87\xb4\x07\x14\xfd\x2e\xfa\x29\xfa\x77\xd1\x7f\xfe\x96\x99\xe5\xdd\x46\xca\xff\xc6\x72\x7a\xff\x29\x50\xc2\x81\xed\xfd\xf3\xf6\x4b\x5f\xf1\x1d\xbd\xf1\xe0\x87\xfa\xe7\x51\x3d\x9e\x4e\xaa\x8f\x19\xc4\xc4\x18\x86\x71\x55\x49\x44\x88\x46\xb6\xd1\xd5\x08\x5a\xdb\xe8\x72\x6c\x21\x21\xbd\xa5\x12\x71\x2a\x19\x22\x2a\x05\xfd\xa3\xea\xcc\x68\x80\x3c\x20\x33\xd7\xf3\xe8\x33\x06\x9a\x38\x8d\xa7\x56\x14\xb9\x93\x29\x21\x1c\x57\xbe\x06\x39\x27\xcc\x38\x29\x0b\x55\x78\x13\xde\x48\xf8\x85\x8e\x28\x56\x7b\x0b\x2a\x0b\x85\x98\xeb\xde\x98\x20\xe8\x73\xae\x55\xf4\x47\x41\x6b\xd0\x05\x1b\xf9\xdd\xc6\xa4\x02\xa3\x7f\x15\xd0\xfe\xff\x25\x70\x6b\xae\x00\xea\xe0\xc6\xaf\x5c\x29\x0f\x9b\xc4\xe7\x6b\x50\x7b\x0d\x29\x0b\x4b\xf0\xa7\x87\x20\x56\xb5\xdf\x36\xf0\xad\xfc\xef\x51\xda\x27\x6b\xe3\x08\x69\x58\x04\xa4\x30\x1b\x74\x25\x28\x4d\x53\x99\x92\x53\xc7\x63\x27\x38\xa7\x72\xce\x25\xa1\x82\x27\x17\xf5\x98\x1b\x6d\x2d\xc8\xd7\x6d\x8e\x76\xcc\x57\x44\x71\x5a\x48\x0e\x7d\xba\x9f\x2e\x52\x5e\x64\x45\x68\x0d\x31\xa7\xa8\x1c\xf3\x2c\xcd\x52\x58\x72\x04\xd1\x89\x1b\x6e\x4c\x8e\x2d\x65\xfc\x39\xf2\x9d\x0c\x61\xdf\x8a\x02\x65\xba\x5b\x3d\xe5\x3a\xfa\xa3\x98\x6f\xb6\xef\x8f\x82\x16\xce\xca\xfb\xbc\x22\x57\xff\xd5\xeb\xca\xb1\x1a\xed\xe0\xfc\x05\x49\x8c\xe4\xfe\xdd\xc3\xf1\xdd\x5d\x40\xaa\x6e\xae\xf3\xeb\xf9\xaf\x6d\x9c\x41\xda\x3b\xb2\x79\x01\xa0\x77\x10\x49\xe9\x4f\xe3\x2c\x62\x35\x58\x63\xac\x0d\x55\x3f\x1b\xa3\x46\x73\xe3\x00\x94\x5f\x7a\x63\xea\x1a\x54\x75\x0d\xa0\x73\x07\x95\x1b\x61\x2d\x17\xfd\xdc\xeb\x5d\xaa\x1b\xcf\x63\xdc\x28\x6b\xfd\xd4\x34\x8c\x1b\xe9\xb8\xa7\xbe\xd0\x3a\x08\x08\xbc\xcc\x08\x12\xfd\x2e\xe6\x9b\xdf\xf6\x36\x67\xff\x2e\xfa\xef\xa3\xff\x21\xfa\x4f\xaf\x18\xab\x2b\x6c\xfc\xa7\xbb\x5f\x11\xc8\xbe\x26\x15\x7f\x7b\xd2\xee\xaf\xe0\xd2\xbb\xc8\x80\xca\x2e\x9e\x91\xf5\x83\xf1\x3d\x80\xcf\x51\x1c\xf9\x48\x9f\xcf\xe0\xb4\xec\x98\x69\x9a\x3b\x9d\x17\xa0\xc8\x0a\x5b\xe6\xa0\xf5\x70\xa5\xe8\xf3\x0c\x8c\x4f\xd8\x60\x42\x26\x70\x7a\x39\x78\xdf\xfc\xde\x39\x0c\x21\x2c\x2b\x44\x5e\x27\xb1\xa4\x48\x8f\x4e\x88\xb3\x94\x53\x98\xc3\x87\xb8\xdf\xf0\x64\x2f\xeb\xef\x1a\x57\x7f\x8b\xd0\x79\xcb\x25\xbc\x3f\x1c\xbf\xdb\xf2\x05\x3f\x5f\x31\x4e\x7c\xba\x3b\x2a\xf7\x74\x76\x60\xc8\x0a\x57\xe5\xbe\xd3\xea\xcc\xc6\x38\xed\x6b\xd6\xf4\xc2\x64\xf9\x08\x20\xf1\x6d\xd7\x7b\x85\x27\x90\xc5\xd8\xce\xbd\x31\x8b\xcf\xbf\xef\xfd\xe0\x1c\xa8\x30\xac\x08\xeb\xf1\x60\x95\x36\xaa\x91\xad\x86\xb8\x28\x9e\x23\x6e\x15\xc8\xfc\x64\x0c\x9d\x3c\x99\x15\xe7\xb1\xf2\x01\x0e\x10\x1d\x92\x62\x8b\x31\xfe\x38\x64\x59\x5e\x94\xda\xae\xfa\xe8\x57\xff\x3b\x4c\xa8\xaf\xa0\x8f\x37\xeb\x21\x2f\xbe\xdf\x31\xb2\xe6\xa9\x36\x16\x9c\xdb\xf9\xb2\x5c\xcc\xae\x8b\x0d\x65\x88\x15\x0a\x96\xbe\xb4\x76\x95\x71\xf7\xe5\xa1\xf2\xe9\x5a\x50\x0e\x54\x15\x42\x5e\xa4\x57\x4f\x23\xa3\x99\x4e\x31\xf5\x7d\x32\xf9\xc9\x78\xa6\xa3\x7d\xdc\x3e\x8b\xe0\x7b\xbe\xe4\x2b\x3e\xae\xcf\xd0\xe2\x1d\x7e\x0a\x21\xff\x15\x2e\xf3\x87\xf7\xaf\xec\x42\x9f\xee\x7e\xfa\x98\x54\x16\x94\x16\x14\xf6\xf1\x8c\x76\xee\x91\xf1\x95\xfc\xc2\xce\xbc\x60\x08\xe4\xa8\x68\x0a\x04\xf2\xc7\x12\xa0\x0a\x1f\xb2\x69\x39\xe0\xc9\xeb\x25\x78\x2c\x4c\xe7\x85\x50\x42\x42\x4a\x8d\x21\x38\x8a\xe3\x26\x82\xbb\xcb\x41\x6e\x95\x99\x4d\xcb\x33\xf8\xa8\x41\xff\x6f\x99\x70\x71\x33\xda\x71\x74\xde\x99\x76\x6c\x86\x61\x5f\x2e\xff\x47\xe3\x9b\x99\xcb\x24\x03\xe4\xa9\x06\x6b\xad\x2a\x68\x52\x8b\x80\x29\xca\x83\xd7\xfe\x75\x55\x6a\x0d\xf8\x5f\x84\x05\xdf\x1d\x05\xc1\x44\x16\x1a\x96\xcf\x51\xa1\x0d\x23\x61\xad\x39\xd0\x5f\x1a\x4a\x73\x9b\x57\x60\xf2\xca\x77\x14\xa4\xc0\x80\x22\x89\x96\xa9\xf8\x34\x00\xd2\x45\x49\xd2\x3f\xa3\x23\x39\xd0\x57\xfc\x5c\xbc\x55\xdc\xaf\x86\x5b\xe2\x82\x65\xdb\x67\xa5\x53\x5d\xdc\x53\x4a\x64\x21\x09\xf4\x3c\x90\xcb\xd9\x38\xf5\xca\xb7\x1c\x70\xd0\x27\xea\x97\x13\x17\xa9\x4d\x05\x70\x49\x17\x66\x4b\xb1\x41\xe8\xa2\x43\xe0\xba\x6c\x42\x8d\xe2\xaf\xa3\x7f\x1b\xfd\xe7\xe8\xbf\x46\xff\xeb\x75\xa5\x62\xe3\xdb\xbd\xfa\xd9\x84\x9a\x0f\xc7\xc3\xea\x59\x7c\x5a\x31\x3a\xfb\xb5\x99\x2c\x00\x6a\x3f\x3d\x7c\xfc\xbd\x92\xb2\x49\x0f\x8b\x71\x6e\xc7\xbc\x8a\x0d\x70\x9e\xac\x87\xbb\x6e\xa5\xd6\x85\xcd\xca\x62\x3a\x93\x25\x42\x70\xa0\x79\x6c\x51\x85\x61\xa9\xca\x52\xcd\x8d\x20\x71\x4a\x68\x85\x0a\x56\x15\x17\xb3\x5e\x4e\x45\x98\x52\x18\x3e\x47\xda\x0b\x2e\x85\xe4\x8a\x97\x59\x89\xa1\x2c\x0b\xc8\x93\xd6\xc4\xa5\xd5\x15\x15\x94\x95\x04\x69\xad\xbc\x7a\x6a\x29\xcb\x4d\x4e\x98\x6f\x76\x99\x3f\x39\xbf\x6a\x09\x47\x36\x2a\x62\xf9\x5a\x87\x8d\x5e\xc8\x97\xc0\xcd\xfd\xcd\xbb\x9b\x87\x9b\x58\x9a\xce\x00\xd2\x75\xfb\xd3\x17\x29\x5f\xeb\x76\x6a\x09\xb6\x82\x1f\xb0\xc4\xfa\xfa\x55\xe7\xed\xbf\x7e\xd3\x4f\xf4\xf0\x86\xe7\xd8\xaf\x88\xaa\xbb\xdb\x17\xd8\xcc\xb2\x3e\xfc\x39\x78\xf7\xc6\xc3\x70\xfc\x86\x1d\x73\x55\xa5\xde\x5c\xc8\x78\x00\xb9\x05\xc4\x82\xdc\x4f\x17\xfb\xd4\x58\x90\xfa\x09\x04\x13\xd8\xc4\xf5\x4c\x5b\x33\xd2\xa1\xf1\x76\xe7\x66\x97\xa5\x84\x59\xc5\x18\xa3\x1d\x6f\x44\x51\x08\x8e\x65\x21\x79\x5e\xa4\x8b\x89\x44\xcb\x83\x97\x67\x27\x3f\x60\x50\x9e\xcb\xfd\x59\x6b\xad\x57\x5a\x5c\xc0\x94\x52\xde\x4a\xdf\x12\x24\x4b\xa2\x54\x9a\x62\x9d\x12\xc1\x09\x6c\x9c\x6c\xc7\x8c\x2b\x6d\x72\x53\x2c\x9e\x48\x4b\x15\x6d\x49\x66\xa8\xc2\xea\x0a\xef\x62\x0f\x3c\xfa\x21\xac\x87\x61\x15\xfc\x8a\x9c\x74\xe5\xde\xbb\xa6\xea\xd9\x65\x2e\x2f\x7b\x17\x90\x2c\xdd\xa3\x8b\x23\x7f\xc6\x44\x35\x89\x76\xb3\x73\x01\x56\x76\x80\x85\x10\x61\xdd\xf3\x83\x31\xa0\xd2\x5c\x8e\x73\x35\x17\x42\xc4\x27\x5f\x02\xf4\x72\x0f\xdd\xaf\xef\xe1\xab\xd6\xa7\x33\x93\x31\xd3\x34\x4d\xcb\x4d\x14\xf5\xbe\x9b\xbb\xb5\x66\x1e\x25\x3b\xbd\xad\x01\x7f\xbc\xa9\x82\xbf\x5f\xb5\x7e\x3f\x2c\x16\x74\xad\x12\xae\xf7\xa6\x4e\x7b\xeb\x59\x01\x3a\xeb\xa1\x11\x4c\xea\xca\x28\xa6\x4d\x2c\x6d\x35\xdb\x18\x71\xcb\x77\xf4\x71\x48\xac\x70\xaa\x59\x96\x20\xa7\x5a\x19\x45\x87\xa0\x95\x82\x43\x0d\xf4\xba\xb7\x25\x18\xbd\xe3\xaf\x35\x0e\xe3\xd0\xf1\xb8\xc4\x52\xc7\xbb\x9f\x3f\xdf\x1d\x92\x6f\x08\x05\xc0\xc5\x16\x39\xa0\xf4\x4c\x30\xd5\xa5\x43\x65\x6f\xba\x4c\x18\x55\x56\x04\xe4\x19\x40\xb0\xf4\x67\x9a\x76\x1d\x20\xfd\x3c\x85\xb7\x83\xaa\x20\xd4\xcd\x23\xa1\x2c\x73\x19\x04\x55\x60\x4a\x69\x3b\xd4\x03\x15\xab\xb2\x30\xe7\x91\x50\xe1\xe9\x38\x8e\x73\x3f\x8e\x63\x14\xc5\x11\x0b\x9c\x10\x32\xfa\xa3\xd0\xd1\xf8\x5a\x61\x8a\x3e\x2c\x17\x33\x72\x90\x5a\x2a\x08\x28\x40\xe9\xdc\x41\x56\x5d\xfb\x45\xee\xa8\xd3\x0e\x38\xf6\xe8\xa2\x68\x1f\x57\xcf\x28\xd4\x5d\x57\x9e\xa4\xbf\x8b\xfe\xf7\x97\x67\x61\xe5\x96\xdf\xaf\xf0\xb1\xf8\xb5\x4a\x76\xf3\xf0\x73\xb2\x99\x89\xe3\x46\xa1\xfc\xda\x54\x71\x0c\x9d\x35\xa1\xb9\xed\xc3\x1f\xf8\x6e\x37\x9a\x3c\xd7\x2a\x86\xbe\x1a\x40\x41\xfd\x30\x98\x93\x6f\x29\xa0\x9d\x2f\x63\x24\x78\x91\x4a\x29\xe5\x54\xe5\x22\x93\xa6\x14\x8c\xb0\x42\x11\x85\x05\x2f\x72\xa9\x14\xac\xd2\x2c\x39\x95\x2f\x5f\x52\xfa\xf6\xa5\xd4\xcb\x97\x07\x55\x10\xf8\xd4\x59\x33\xf1\x7a\x99\x82\x39\x38\xf9\x8b\x35\xae\x33\x36\x41\xc4\x93\x71\x1e\x46\xae\x6d\x49\xca\x82\xdb\xa9\x48\x65\x0b\xaa\xd2\x5f\xea\x0c\xe3\xd2\xbb\x2e\xcb\xcb\xb2\xfc\x7d\x5f\xd7\xfd\xf2\x75\x14\xc5\x71\x9d\xd0\x70\xdd\xfe\x3c\xf8\x90\x2f\xb1\xd2\xf7\x5f\xa3\x4e\x3f\x07\x3d\xf1\x7b\x70\xb5\xff\xe9\xab\x5f\x5d\x7e\x33\x3e\xb7\xba\x69\xd2\xf1\x9c\x69\x41\xb9\x20\x92\x5a\xe4\xba\xb4\x4d\x04\x6e\x88\x85\xcb\x6e\x6b\xea\x26\x1d\x6b\xa2\x99\x3a\x2c\x17\x27\xaf\x2a\x59\x61\x2a\x18\x16\x90\x63\x23\x21\xf2\x7d\x4d\xd6\x3d\xb9\x7d\x2f\x99\x10\xd1\x3e\x36\xcf\xe8\x68\x92\xee\x8a\x09\xeb\x2b\x0d\xf6\xeb\xca\xc3\xcd\x5a\x7d\x08\x6c\x45\x60\x7b\x8f\x27\x30\x99\x38\x9d\x2f\xa0\xf7\x30\xae\xe6\xc1\xcc\x5d\x8c\x42\x63\x60\x5e\x87\x0e\xf4\x01\xa0\xa7\xf3\xcb\x5e\x22\x08\x51\xd8\xe7\x44\x35\x8d\x22\x60\xc2\xfe\x42\x29\xf5\x13\xa5\x34\xf0\x84\xa2\xa3\x4e\xe0\xdf\xab\x53\xba\x7f\x63\xdc\xda\x45\x4f\x91\x0d\xbc\x08\xdb\xd6\x92\xe1\x39\x42\xa7\x58\x8d\x0d\x6f\xfb\x04\xce\x10\x5c\x96\x01\xfc\x44\xcf\x9c\x23\x5d\x52\x48\x14\x43\x9b\x3e\x25\x3a\xba\xc0\xad\xfe\xcf\xa3\x6a\xad\x74\x7c\xcd\xfe\x05\xde\xa4\x14\xc2\xc3\xfd\xe1\xe5\xbf\x43\x02\xf6\xf3\xa7\xfb\x95\x70\xf9\xfd\xd7\x8c\xcb\xab\x5e\x7d\x92\x83\xc6\x2e\x11\x6c\x9c\x3e\x4a\x30\x79\x12\x97\xbd\xe9\xfb\xcb\x2c\x41\xd4\xcf\xaa\x35\xe3\xd8\xe7\x17\x3f\x54\x53\x5b\xec\x26\x2f\xf3\x0c\x31\x98\x99\x82\x37\x8e\x9d\xa0\xe7\x18\xd0\xd2\x37\xfb\xb3\x5a\xff\x78\x2a\xa5\x6e\xb4\x6e\xb4\x10\xda\x95\x02\x43\x5d\x74\x5e\x68\x7f\x29\xd3\x14\x29\xd8\x32\xc2\x40\xe1\x05\xd5\x18\xe4\x11\x88\x4f\x1b\x4f\xce\xf2\xf4\x05\x42\xa0\x6f\xea\xf7\xa1\x64\x16\xef\xdf\x08\x6e\x3e\xbd\xba\x9b\xef\xd6\x6b\xbd\x22\xed\x93\x53\x87\xe2\xa9\xf7\x1c\x43\x89\x38\x09\x6d\xeb\x45\x21\x40\xae\x2d\x8c\x69\xeb\xab\x22\x76\x9e\x2d\xde\x3e\x80\xd6\xce\x99\xb5\xa0\x98\x2f\x71\xda\x63\x26\x49\x95\xe4\x95\x15\x40\x51\x8a\x85\x20\x01\x6e\x93\x67\xbc\x1e\x2b\xaa\xbc\xa9\x91\x7e\x8e\xf4\x73\xd4\x79\x89\x20\xd0\x3d\x88\x34\x88\x28\x66\xb0\x5a\xec\x0e\xda\xb0\x8c\x7f\xbe\x59\xdb\xbf\xfe\xfa\xb9\x7c\x31\x3c\xdb\xc5\xbe\xd9\xa8\xda\x5e\x84\x6b\xee\x36\xe1\x9a\xb8\x8f\x33\x1b\x67\xf3\x19\xf4\xbe\x76\xa0\x94\xfe\xdc\xd8\x74\xf0\x35\x07\xc5\xe0\x4f\xa0\x9f\xcf\x13\x28\xfd\xb8\x6a\xa6\x00\x0b\x4a\xa7\x2a\x2c\xf0\xbe\x6f\x1a\xd3\xcc\xec\x32\x9a\x0b\x28\xe6\x3a\x76\x5e\x9f\x74\x0d\xca\xd8\x35\x33\x06\xa2\x0c\x1c\xa8\xcc\x1b\x20\xaa\x52\x33\x28\x42\x3e\x58\x6d\x7a\x1d\x7f\x12\xb2\x68\xbf\xea\xd3\x59\xf9\x0b\xff\x06\x1c\xef\xbf\xe1\x0d\x3c\x32\xfb\x34\x5a\x30\x16\xa5\x45\xc5\x7c\x49\x88\xaf\x97\x55\xd4\x0c\x1d\xd4\xbe\xf6\x4e\x62\xae\x2e\x95\xc9\x10\xb3\xbe\xde\x8f\x8b\x6f\x0f\x48\x88\x33\xfc\xf2\x89\xf1\x2a\x77\xda\xb4\x56\x02\x01\xc6\x72\xea\x0c\x4a\x96\x85\x29\x89\x82\x3f\x53\xad\x35\xea\x77\x87\xe3\xfb\x17\x61\xcf\xaf\x15\x45\xdf\xa0\xf1\x09\x4b\x1a\x77\x92\x40\x61\xae\x70\xe5\x47\x6e\x30\x2a\x30\x46\xd5\x7c\x89\x4b\xeb\x04\xa3\x8d\x9e\xb3\x43\xa5\xce\x35\x37\xb5\x23\x42\xcd\x69\x50\x16\x2d\x61\x3c\x58\xc1\x04\x44\xaa\x5e\xb1\x91\xe4\x19\xc7\xf4\x20\xa3\x34\xac\x3b\x61\xf1\xfe\xe1\xfd\x11\xbc\x5f\xfc\x60\xd0\x19\x43\x11\xf1\x5a\xa4\x95\xac\x92\xcb\x23\x39\x56\x1e\x6b\x25\x41\x9d\xfb\xde\x5f\x50\x10\xfb\x4d\xe2\x72\x7b\x06\xfe\x53\xf4\x3f\x47\xff\xcb\xf5\xfd\xff\xe9\xe6\xe1\xf6\xee\xdd\xdd\x77\xab\xa4\xd5\x9f\xbf\xd4\x46\x5e\x85\x96\xdf\x5d\xd3\x21\xbc\xa8\xc6\x5d\x91\x22\x7c\x5a\x63\xdf\xcf\x37\x1b\x5c\x2a\xd6\xa0\x08\x05\x38\x20\x03\xca\xd4\xb7\x59\x81\xa1\xa6\xaa\x28\xb2\x2c\x35\xb9\xe1\x98\x2a\xea\x28\x2a\xfc\xb9\xef\xfb\x7e\x1c\x39\xcb\xbd\xf1\xa8\x02\xe9\x34\x8d\xe3\x38\x4e\x80\xf9\x13\xa8\x38\x4f\x4a\x8e\x14\xe4\xfb\xa1\xae\x4d\x3d\x82\xd4\x17\xda\xbb\xa9\x39\x57\x5e\x4d\x06\xb5\x85\x6f\x27\x25\xe4\x12\xf2\x83\x49\x29\x25\x95\x94\x59\x2e\x19\x36\xa5\x96\x46\x5a\x69\x74\xfd\x88\xb2\x44\xc5\xb9\x34\xc4\xa8\x60\xa7\x96\xe7\xaa\x01\xd9\x6b\xfd\xee\xab\xce\xfe\x17\x1a\xdb\x30\xb1\x2f\x9c\x58\x24\x9e\x06\x4d\xb9\x12\xf1\x99\x94\xb6\xc4\x35\x2a\x5c\x8e\x40\xe6\x3a\xdc\xd5\x25\x9e\x94\xd4\x8d\xed\xab\xde\xe6\xb6\x85\x9d\x8d\x0e\xb1\x7d\x26\x47\x77\x20\xaf\x76\xf7\x36\x44\x7a\xdf\xa8\x72\x80\x15\xca\x77\x77\x4d\x86\xb6\x4c\xba\xa4\x58\xa2\x4a\xd3\xb6\xa0\x01\xa7\x25\x7a\xeb\x66\x9c\x4c\x4f\xb9\xdb\xa7\x4f\x67\x14\x0f\x6a\xe0\xa2\x32\x5c\xe2\xa7\xb3\xf0\xed\x81\xcc\x67\x0d\x22\x1d\x5e\x7d\x6a\x84\xb1\x9e\x77\x85\x2d\xf9\x00\xca\xb5\xde\xb1\xf2\x24\x7f\x7c\xe5\x96\x7b\xf9\xf9\x75\xfd\x75\xff\x31\x68\x94\x1d\xd1\xd3\x39\xee\x67\x18\x77\x33\x4a\xb8\x4f\x4b\xa2\xb8\x50\x5a\x0c\xc4\x57\xfa\xd4\xb9\xbc\xf7\x17\x3c\x4e\x07\x62\x8d\xd1\xc6\x58\xad\x88\x54\x12\x1b\x6e\xa7\xb8\x9c\x2d\xc4\x86\x62\x1c\x0f\x36\x61\xd1\xee\xb5\xee\xf5\xbb\xe8\x87\xe8\x3e\xf4\x89\xbe\xa6\x43\xfe\x39\xb8\x02\x13\x7f\x45\x55\xff\xaa\x2e\x70\x7f\x73\x97\x60\xe0\xca\xaa\x46\x25\xe8\x1f\x4f\xb5\xcb\x0b\x45\x05\xa6\x54\xc8\x36\x76\x36\x2f\x0c\x17\x8c\x23\x2a\xdd\x1c\xc5\xd9\xe2\x24\x47\x6e\x3e\xef\x1d\xc5\x90\x49\x53\xe5\x9c\x70\xa5\x14\xed\x85\xe8\x00\x2f\x04\x15\x5a\x5b\x66\xa8\xa8\x7d\xe5\x9c\xf5\x19\x38\x6f\x35\xc9\x3e\xf4\xb2\x6e\x2c\x80\xbf\xb6\x8b\x5f\x99\xc5\xbf\x5c\xa2\xcc\x24\x02\x67\x1b\x56\xea\xda\xb7\x0e\x20\xb5\x98\xc2\xce\xf7\x1c\x50\xe7\x3b\x50\xfb\xec\x04\x32\x7f\x06\x35\x48\xf7\x6d\xd7\xd9\x7e\xee\x2f\x27\x7b\x06\xd9\x6c\x63\xee\xbb\x4e\x8d\x20\x8f\x61\x3f\x87\xbe\xb6\xc0\x9d\x12\x72\x2e\x6f\x3c\xeb\xff\xf4\x57\x1d\x27\x77\xef\x5e\x2b\xa5\x9f\xee\x12\x9e\x34\x4f\xc4\xc6\x6a\x56\xcb\x36\xee\x2a\x5f\xc6\xc5\x7c\xb2\xf3\x29\x2e\x3c\x3a\xa0\xb9\x02\xb5\xf3\xd0\x79\x6c\x86\x10\x4c\xda\x21\x70\x3c\x2c\xf1\x3a\xda\x74\x2f\xfe\xd9\xb7\x11\x7b\xc8\x80\x6c\x69\x88\x87\x9b\xfb\xa3\x90\x82\x88\xd2\x62\xf2\x74\x72\x81\x37\xba\x0a\x63\x4c\xd3\x01\xfd\x32\x32\x9e\xb9\x8c\xec\xf9\x2f\xee\x70\xf1\xce\x76\x33\x36\xc0\x2e\x3e\x72\x5c\xc4\xf6\x80\x37\x0e\xfc\x35\x99\x17\xba\xb9\x40\xd9\x18\x61\x6b\xd0\x54\xa3\x9f\x30\xa8\x0e\x58\x58\x5d\x4b\x9f\x99\x46\xd7\x81\xab\x36\x36\x71\x11\x9e\x97\x3f\x7b\x51\x67\x59\x2d\xec\xf7\xaf\xd9\xa5\x1f\xbf\x5b\x9b\x47\x92\xc6\x56\x49\x4e\xa1\xc3\xd0\x0f\xd9\x08\x14\xf5\xb6\xe7\x9e\x32\x50\x8d\xe9\xc8\x98\x1e\x0e\xb2\x52\x26\xed\x69\x29\x15\xc5\xbe\x51\xce\x81\xdc\x5f\x6a\xc3\x41\x7e\x69\x05\x3f\xbf\xea\x5a\xb4\xa1\x4e\xf7\x53\xc0\xf8\xaf\x21\xd9\xb7\x2e\xc8\x5a\x5a\x0d\xb8\xfa\xab\x46\xe6\xdd\xc5\x82\x8b\x37\x59\x5a\x28\x9c\x99\x42\xf5\x92\xf6\x59\xdb\xcb\xa6\xce\xfd\x18\x47\xbe\x36\x54\x53\x9d\x38\x4b\xa5\x92\x07\x39\xe7\x76\x46\x65\x9a\x62\x03\x47\x46\x78\x3c\x7a\xe5\x85\x53\x1a\x30\x80\x6d\xcc\xfb\x09\x9f\x7a\x58\xf9\x4b\x83\x87\xd5\xe6\xab\xb8\x3a\x46\x07\xb5\xd5\xbe\x96\xf9\x1a\x78\x3e\x7e\xbc\xfd\x46\xe8\xf2\xfe\x0a\x45\xb2\xbd\x86\x08\xe9\x08\xce\x8c\xc3\x62\x62\x44\x49\x50\x6a\x97\x97\x3b\x21\x1d\xb7\x85\xe3\x18\xa6\xe7\x92\x0e\x8c\x09\xd5\x4a\xc7\xa7\xf6\x2c\x27\xed\x62\x47\x4a\x7f\x29\xd0\xae\xcd\x72\xca\x38\x25\xa2\x03\x79\x81\xd0\x4c\xfd\x25\x77\xb9\x01\x53\x63\xb0\x29\x8b\xda\x48\xa9\x60\x6f\x84\xd6\x85\x36\x92\x05\xce\x69\x71\xb4\x87\xe2\x15\xef\x1b\x3a\x09\x57\x74\xcd\xed\x1d\x58\xec\xda\xb2\xc1\xe4\xc2\x87\x47\x08\x32\xe4\x47\xb0\x78\xd1\xc0\x02\x53\x7a\x6d\x40\x5d\x7a\x71\x28\x7e\x99\xac\x8d\x85\x8d\xe5\xac\x63\xf9\x45\xc5\xc1\x0f\x48\xc4\x86\x0f\x7b\xf1\x5f\xd7\x7c\xd5\x57\x6b\xee\xfb\x1f\x6e\x8f\xf1\xc7\x44\xc4\xc6\x9d\xcf\x54\x28\x59\x28\x55\x14\xb3\x98\x2c\x77\xcc\xec\x46\xe0\x3c\xb3\x8f\x93\x64\x45\x5d\x16\x28\x39\xeb\x8b\x3f\x61\x50\x9d\xc3\x7a\xc0\x9f\xd9\x6b\x0d\xf5\x26\x58\x80\x55\x9d\xf0\xe6\xee\x95\xc5\x3f\xf9\x8d\xe6\xd0\x5d\xe3\xf2\x3c\x4e\x1f\x4f\x40\x94\x97\x17\x0a\xec\xcb\xae\x9f\xcf\x60\xf0\x55\x8c\xbe\x74\x31\x5b\x3c\xf7\x79\x3a\xe8\x92\x95\xcb\xf7\xc4\xab\x30\x25\x2b\x5d\xeb\xda\x98\x5a\xd7\xeb\xda\xbe\x62\x62\xf7\xa1\x1b\x3f\x30\x41\xdf\x2e\x31\xe5\xda\xb0\x0b\xce\xca\xf9\x13\x03\x59\xca\x09\x03\xd0\x6a\xc4\xdc\x41\x61\xdf\x9e\xd4\x69\x2e\x05\xd2\x20\x07\x08\x1b\xf3\x78\x5e\xfc\x3c\x15\x72\x8c\xc5\x35\x97\x20\xb8\xb6\xb5\xbf\x97\x4b\xf0\x25\x0d\x11\x8f\x3b\xfb\xc8\x47\x43\x85\xa4\x96\x1a\x0d\x86\x75\x97\x19\x0d\xa6\xed\x53\xab\x9f\xf4\xce\xcd\x97\x18\x7e\x39\xc7\xd0\xa7\x87\xc2\x40\xd8\x5b\xd7\x90\xb1\xeb\x4e\xbf\xb1\x37\x73\xe3\x1b\x63\x42\x82\x2d\x09\xbd\x75\xcd\x01\x6f\x5a\x7e\x11\xb8\xb9\xbb\xe2\xc2\x8c\xde\x16\xa3\xf7\xa1\x1e\x70\xf7\xe9\x70\xf1\xa4\xa4\x8d\x54\xba\x53\x20\x95\x7e\xf0\x13\x1a\x4f\x4d\x3e\xfa\x11\xbb\xd5\x00\x1e\xf0\x93\xe8\x14\x57\xdc\x72\xad\x6d\x0d\x14\x40\x33\x81\xc8\x52\x84\x0f\x8d\x9d\x26\xaf\x4e\xa7\x70\xaf\x87\x67\x7c\x24\x87\xf4\x75\x65\x8e\xae\x53\x2e\xb7\x2f\x66\x8f\xb8\xa7\xce\xb9\x04\x3d\x75\x26\xd8\xbb\xf3\xf9\x90\xfe\x82\x8c\x39\x74\x5f\xf8\x3e\x7d\x8e\x9e\x2e\x06\x4c\xab\xfd\x88\x68\x78\x36\x57\xce\xe3\x6d\xed\x58\xf1\x0a\x6f\xa9\xfe\x4f\x77\xdf\xfc\xac\x31\xdf\xbb\xbb\x4f\x09\x03\xcc\x82\x56\x29\x8f\x43\xc4\x17\xc0\x2e\xe7\x38\x0b\x74\x87\x16\x70\x9f\x82\x8b\x77\xe0\xb2\xb2\xb8\xee\x27\x63\xfc\xd9\xf8\xb3\xd6\xc6\xd6\xb5\x35\x5a\x6b\xbd\xbc\xf8\x49\x07\x4e\x9c\x5d\xc2\x40\x7a\xa4\x57\x3c\xd4\x1b\x27\xee\xcd\xab\x49\x4f\x58\x72\x79\x4a\x5d\xdc\xce\x58\x82\xce\x23\xe3\xdc\xa1\xfa\x32\x9a\x5d\xda\xce\x5c\x03\x13\xed\x92\x1c\x44\xa1\xf7\x71\xf9\xf7\x45\x60\x3e\xba\xc6\xd3\x85\x32\xd4\x95\x66\xf9\xcf\x7f\x0b\xee\x03\xe9\xc8\x43\x92\xef\xa4\xb7\xa0\x7a\x3c\x83\xca\x3b\x70\x36\xc6\x0f\xf1\xc9\x60\x6c\x9c\x50\x2e\x3e\x99\xf2\x50\x99\xe9\x09\x27\xed\x34\x4d\x8f\x53\x87\x30\x60\x85\x1f\x5b\xea\xa6\x22\x30\xc4\xf5\x81\x0f\x33\x21\xd1\x74\x84\x07\xf9\x55\xff\xc7\xca\x60\xff\xba\xfa\x82\x97\x55\x98\x04\xe8\xc4\x53\xbe\x2e\xa3\x0d\xc8\x67\xf8\xb2\xb7\xaf\x16\xcf\xf3\xb1\x8d\xc5\xf2\x0e\xf0\xd3\xb8\x55\x75\xde\xf4\x8c\x50\xc8\xe3\x84\xca\xc6\x0b\x38\xed\x26\x09\x32\x5b\xef\xde\x20\x77\x1f\xd7\xd6\xbe\xab\xa9\xbf\xe6\x17\x76\x69\x6f\x04\x49\x26\x33\xa3\xb8\x9b\x55\x92\x7b\x4c\x48\x33\x20\xc9\xb1\xaa\x08\x09\x83\xea\x27\x08\xea\xff\x9b\xb3\x7f\x07\x92\x5b\xd7\xf3\x04\x61\x82\xcc\xcc\xe2\x9d\x27\xeb\xe8\xea\x8a\x37\xa6\x3b\x9a\x35\x75\x74\xc5\x9e\xf9\x3a\x1a\xdd\xfa\x24\x31\x76\x5e\xd8\x9e\xd8\x08\xac\x35\x30\xc6\x40\xc4\xae\x01\x13\x11\xeb\xc0\x84\x09\x13\x26\x4c\x98\x30\x69\xd2\xa4\x49\x93\x26\x4d\x9a\x34\x69\xa6\x99\x2d\x25\x51\x1b\x04\x99\x55\x25\xe9\xdc\xde\xde\x8d\x73\x98\x99\x55\xca\xca\x64\x32\xf1\xf8\x3f\x7e\x8f\xf5\x4d\xb5\xae\x34\x19\x0e\xda\x9b\x65\xf0\x8c\x82\x08\xa8\x50\xe2\xc6\x00\xd6\xfe\xa2\x1d\xcf\x2a\x56\x99\xba\xe2\x79\x36\xe8\xce\xda\x4e\xb7\x59\xaa\x84\xdd\xfa\x19\x22\xf0\x76\xdf\x3c\xab\xc0\xa0\xdf\xe6\x47\xfd\x35\xd8\xdd\xcc\x9e\xb9\xb9\x21\xc0\x7c\x6e\x29\x7c\x7c\xdd\x52\x38\x4e\x59\xc1\x09\x13\x32\x2f\x04\x65\x82\x53\xc3\xbd\x60\xcb\x19\x4c\xe7\x8e\x72\x8c\x09\x27\x15\x2e\x7c\x0b\xd0\x9a\x3c\xf5\x49\x76\x3d\xdb\x35\x22\xcd\x70\x79\x26\x85\x2b\x30\xc8\xbe\x35\x20\x2a\xaa\x13\x65\x0c\x71\x21\xd6\x0c\x6a\xbd\x13\x54\x5e\x62\xa4\x89\x27\x4e\x11\x46\x30\xaf\xb0\x50\x9e\x1b\xed\x2b\x53\x7b\x2b\x8d\x63\x90\x09\x63\x24\x8f\xee\x12\xb6\xe7\x78\xb7\x58\xfc\xb9\x4b\x78\xd8\x64\x55\x7e\x88\xc8\x93\x5d\x12\xf9\xed\x8f\xaa\x15\xeb\xaf\xdf\x7f\x7a\x7c\x7b\xff\xf1\xd3\xe3\xa9\xe7\xbe\x5f\x5a\x1c\x43\x50\x1a\x84\x15\xf1\x03\x2a\x54\x81\x46\x52\xca\x12\x23\x50\x7b\x93\x38\xce\x3d\xc7\x0a\x57\x05\x21\x70\xcd\x3b\x3d\x4d\xaa\xcb\xe5\x72\xd2\x82\x22\x03\x35\x74\x02\x29\xcc\x54\x29\x79\x4a\x28\xa6\x64\x99\x3a\xed\x5b\xed\x1b\x7f\x16\x34\xb3\x19\xbe\x98\x4e\x77\x9d\x6f\xbb\x90\xab\xc2\x27\x76\x67\x92\x21\xf8\x3e\xdf\xdc\xe1\x8f\x01\xdc\x7b\xa3\xf8\x07\x09\xb7\x7d\x65\x5b\xa3\x8c\xc3\xe8\x2e\x0d\x9f\xfc\x50\x92\xae\x28\x53\x93\x22\xe4\xe7\x5a\xf8\x68\xa8\xd7\x5c\x9a\xd4\xc0\x24\x83\xb7\x54\x2b\xcb\xbd\x28\xf3\xa2\xec\xe0\x05\x55\x88\xc5\x85\x8f\x2a\x6c\x29\x21\x87\xcc\x5f\xec\x0b\xa7\xc1\xc6\x62\xc7\xd4\x9d\x8e\x6f\x7f\xec\x14\x6f\x7a\xa0\xc0\x1d\xea\xe1\x29\x4a\x8a\xeb\xc4\x85\x10\x19\x15\xec\x6a\x12\xd1\xda\xab\x8c\x85\x61\x34\xd3\x1d\xc2\xb9\xce\xf3\x5a\xb3\x0a\x05\x7d\x6a\x78\xc7\x83\x3e\x75\x75\x73\x40\xfe\x79\x27\xfc\x51\xa6\xfa\x3b\x33\xeb\x75\x30\xbe\x0b\x2a\x50\x3f\x40\x5d\x63\x2b\xdc\xa6\xa8\x08\xfd\x70\xa8\xfd\x08\xca\x9b\x54\xb5\xb6\x5f\xa9\xd5\x53\xec\x18\x44\x08\x51\x8c\x25\x43\x98\x62\x8c\x5b\x5c\x31\x88\xd4\xab\xdf\x30\x8a\x4f\x5a\xe2\x92\x28\xa1\x85\xd0\x42\x49\xbd\xe4\xbe\x6f\x1a\x50\xc5\x0e\x22\x5c\x55\x45\xc9\x60\x49\x0a\x56\x54\x45\x49\x49\xe5\x3b\xb2\xa6\xfa\xb0\xc4\x25\x2b\xaa\xb2\x60\x25\x0c\x9a\xab\xbf\x0b\xba\x20\xe6\x95\xcf\xd1\x8b\x96\x7d\xf4\x53\x5f\x77\xaf\xe5\xdd\xa2\xf1\x1f\xeb\x78\x09\x04\x17\x9f\x9a\x71\x04\xcd\xfe\x60\xe1\xc9\xe4\x59\xb0\x36\x5a\x2e\x71\xea\xa9\xbd\xa5\x07\x0b\xb9\x3d\x3a\x21\x2f\xa5\x95\xeb\x8d\xd7\x0b\x56\xc6\x77\x00\x19\x05\x9c\x31\xc6\x33\x63\x02\x5f\xe1\x2e\x76\x4f\x22\x60\x1a\xd7\xf3\xfc\xfd\xee\x87\x5b\xbe\xac\xf4\xe0\xe6\xfe\xbf\x7e\x05\x9b\xf9\xc7\xdb\x87\xf7\xcf\x80\xb3\xc7\xfb\x84\x26\xee\xca\x82\xfb\x06\xc8\x10\xe5\x8e\x98\xbc\x10\x8c\x93\x05\x8a\x03\xe4\x5f\x2f\x87\xc8\x5a\x63\xed\x09\x5e\xcf\x3a\x8e\xfc\x40\x11\x33\x4d\x59\x55\x88\x72\xfc\x6d\x5c\xa3\xb3\x17\xf7\xe1\xe0\xb1\xbf\xe9\xd5\xe2\x5d\x8b\xfd\xb6\xaf\xdf\xe4\x0c\xff\x5c\x8f\x35\xe9\x13\x72\x6d\x5c\x90\x96\x9f\x38\xc7\xac\xd4\xa8\xba\x35\x37\x42\x83\x03\xfb\xcc\x0c\x3e\xbf\xa2\xcd\x11\xc9\x7a\x79\xd0\xbe\xab\x7d\xb9\xc6\x4d\x21\x97\x71\xa7\x72\x47\xd2\x3f\xbc\x7d\xbc\x21\x21\x77\xcc\xe2\x8e\x15\x4c\x74\x32\x74\xc1\x16\xcb\x9f\x0b\xdf\x6b\x50\x14\x4f\x11\x48\x87\x58\xfa\xcb\xa9\xb4\x8b\xb3\xd7\x26\x21\x3e\xf2\x0d\x07\x10\xb4\xcf\xac\xfd\xb0\x17\xa1\x50\xd3\xcc\x02\x8e\xe1\xd7\x5d\xe9\xe8\xe3\x2f\x6f\x1e\xb2\xe4\xe3\xdb\xc7\xf5\x78\xd6\xd5\x78\xf8\xe5\xcd\xe3\xfb\x37\x0f\xc9\xd6\x14\x01\x6f\x1e\xe2\xbb\x7d\xcd\x42\x32\xcf\x12\x91\x31\x5e\x48\x5d\x0e\xc4\xe4\x8e\xe2\xec\x7a\x86\xa5\x48\x58\xb6\xf4\xc5\x59\x48\x4d\x35\x68\x8a\xa5\xc9\x0b\x90\x09\xa1\xa9\x4a\x34\xa8\xd6\xed\xca\xf7\xd6\xe7\xd6\x0f\xb9\xcd\x2d\x80\x80\xd8\x00\x6e\xac\xb9\xe1\x5a\x5d\x21\x98\xfd\x65\x02\xb5\x30\x7c\xdb\xff\xe3\x44\x85\x58\x96\x47\xff\x2a\x74\x99\xb6\x6c\xe6\x7b\x09\xdd\x67\xbf\x8b\xd0\xac\x4c\x94\x5b\x47\x9f\xe6\x85\x1d\x30\xb8\x58\x67\x78\x37\x16\x15\xab\x32\x5b\x88\xc6\xb0\x13\x5f\x1a\x7b\x75\xb0\x72\x18\x91\x53\xbb\x48\x69\x75\xa3\x96\xa8\xcc\xe9\x58\xf9\x59\x06\xea\x44\x74\x8a\xcd\x93\xba\x73\x3f\x60\xf1\x7f\x03\x87\xbf\x29\x73\x7f\x0c\x50\xd2\x17\x07\x90\x10\x77\x4e\x07\xeb\x2d\x40\xdf\x5a\x80\xbc\x8d\x5d\xbd\xb5\xff\x6b\xe3\xae\x0c\x74\x2e\x84\xd4\xf0\xeb\x39\x46\x1e\x9d\xb0\xe9\xd6\x04\x21\x20\x4f\xf2\x9b\xf8\x38\xa0\x0b\x5a\xe7\xc9\xc5\x18\x90\x6e\xbc\x96\x48\xc6\x7c\xe3\x0b\xbe\xb9\x75\xb9\xb7\x05\xf8\xf3\x97\xfb\x47\xde\xd8\xb6\x25\x38\x9f\xfc\xa5\xe0\xb4\x39\x38\xd0\x7a\x6c\x17\x53\x94\x46\x51\x57\x14\x71\x13\xfa\x0e\x3b\x17\xf3\x3e\x68\x87\xbc\x8b\xef\x7e\x7d\xbf\x79\x1c\x6e\x40\xfc\xe4\xd9\x00\x68\x87\xcb\x9e\x9e\xe1\xdd\x1b\xc1\xa9\x76\x46\x83\x08\x64\x88\x98\x4e\xbb\x12\x7a\xe9\x31\x9c\x73\x9b\x15\x71\xed\x75\x9a\xc5\x99\x2f\x0d\xe0\xc4\x9b\x86\x79\x48\x41\x43\x3c\x01\x53\x96\xce\x84\x89\xfa\x24\x83\x11\x73\xc9\x29\x1a\xfd\x05\x53\x82\x72\x63\x7d\x5b\xa0\xca\x28\x61\xfd\x85\x39\x09\xaa\x4b\xab\xdd\x64\xb9\x16\x44\x86\xf5\x21\x8e\xb7\x31\x2b\x5f\x70\x0f\xcf\x69\xf4\x3a\x35\x6e\xd8\xbb\x97\x28\xe1\x6d\x06\x3e\x7c\xfe\xe5\xd3\xd6\x75\x9c\x1d\x98\x48\x69\xab\xd2\x0f\xc0\x95\xfe\x52\x83\x48\x9e\xdb\xee\x29\x22\xe7\xda\x0a\x29\x6c\x0b\x17\xe9\xcf\xc6\xca\x20\xf0\xb8\x03\x54\xd3\x91\x42\xa5\xbc\xf4\xca\x4f\x92\x5b\x61\x2d\xb3\x44\x99\x81\xf6\xba\x9b\xa1\x2f\xbd\xa6\x13\x60\x97\xd8\x2d\x13\xd0\x5b\x3f\x14\xdf\xd9\x93\xf8\x67\xe9\xce\x67\x4d\x0d\xa6\x60\xe0\x51\xd4\x0d\xa0\x01\xa3\x33\xf9\xe2\x58\x84\x10\x8b\xf8\xc6\x7e\xed\xb5\x39\x22\x8f\x40\xb7\xe9\xce\xc7\xc9\xc6\x0d\xc9\x03\x7e\x25\x8c\xc3\xbb\xfb\xc7\xfb\x38\xd9\xf8\x44\x6f\xee\xe2\x24\xa9\x0e\xd4\x23\xe8\x9a\x41\x01\x74\xf6\x69\x12\x35\x8d\xb4\xdd\x29\xb7\xf6\x2b\x3b\x40\xef\x9e\x22\x09\x44\xac\x3c\x3d\xfb\x56\x82\x6a\xd3\x6a\x4f\x8a\xa0\x4b\xaa\x77\x27\x9f\x2f\xd1\x7f\xbd\x55\x38\xd6\xd1\xb0\x6e\x72\x9f\xdf\xbf\xe6\x32\x7e\xf8\x7c\x0c\x23\xe4\xf7\xf1\x0b\x3c\x75\x63\x19\xff\x57\xf0\x2e\x5c\xfc\xd3\x49\x39\xee\xf2\xc2\x1b\xcf\x60\xa7\x9c\x14\x17\x90\xc2\xaa\x1c\x1a\xe1\x7a\xcf\xb4\x68\xb9\x03\xa9\xcb\x4b\x30\x58\xd2\x4c\xe4\xd2\x87\xda\x49\xda\x04\xba\x59\xdd\x54\x5c\x29\xec\x65\x76\x2a\xda\x89\x20\x84\x72\x6d\x40\x06\xcf\x3c\x2b\x29\xf1\x5c\x38\xe1\x04\xc5\x4d\xcd\x2d\x2a\x51\xa5\x73\x3f\x52\x81\x2d\x31\x96\x38\xa8\xb8\x61\x58\xa9\xbe\xb1\x42\x75\x45\x88\x23\x92\xe2\x89\xdc\xa1\xa4\x09\x2b\xea\x4b\x77\xe3\xcd\xf6\x21\xee\xfe\x0d\x38\xac\x3f\x1d\xe6\x8a\x73\x41\x39\x65\x12\x94\x6a\x1d\xcb\x99\xa1\x93\x9f\x6b\x1a\xb3\x21\x56\x8c\x70\xc9\x28\x23\xe2\x0c\xe8\xfa\xa6\x68\x52\x83\x85\xba\x8e\xa3\xed\x3d\xda\x64\xba\xe3\xa1\xaf\xfc\x82\xf2\xfe\x78\xff\x90\xb4\xf6\x62\xcf\xf6\x4a\x4e\xb9\xa7\x5b\x65\x6d\xe9\xa3\xe8\x10\x35\x40\xdc\x91\x90\x1f\x7f\x88\xfe\x66\xd7\xcd\xbd\xfb\xd3\x87\xe3\xbb\xe3\xae\x82\xb2\x2e\xbf\xa1\x56\xf3\x3e\xe0\x02\x3e\x1c\x3f\x84\x49\xfa\xee\xcd\xcf\xcf\xfb\xfc\x9b\x4f\x4c\x2e\x9a\x21\xaa\x12\x9a\x5d\x07\xd7\x37\x44\x19\x5b\x41\x5c\xc9\x5c\xf2\xce\x8f\x9e\x79\x8b\x81\x01\x85\x5d\x4c\x1e\x67\x15\x54\x98\xe8\xdf\xf8\x83\xb2\x2a\x6e\x7f\x31\xf8\xf2\xc7\xbf\x38\xa9\xbc\x64\x45\x51\x28\x4c\x4b\xc4\x60\x09\x53\x5d\x68\xae\x71\x26\x8a\x52\x54\xba\x44\xa4\x64\xd8\x8b\x57\x4f\xa2\x55\x09\xb3\x8a\x95\x86\x69\x54\xc8\xed\x59\x18\x17\x14\x47\x20\x32\xa0\xb9\x73\x27\x1a\xfc\xfa\xf7\x6e\x62\x50\xd0\x7a\xce\xa3\x3f\x7c\xc7\x19\x0d\x1f\xf7\xd3\xd6\xb4\xda\x8a\xf5\xe6\x90\x7f\x6b\x0f\x13\xc8\x97\x88\xaa\x86\x29\x6e\x5a\x50\x68\x9f\xf6\x54\x32\x5a\x30\x56\x16\xbe\xf1\x1c\x81\x0e\x70\xcf\xaa\x42\x55\xb4\x3b\xa6\xdf\xe6\x23\xe7\xda\x97\x3a\xe3\x04\x53\x4e\x2a\x52\xad\xe3\x47\x90\xcc\xe4\x45\xa5\x5a\xe3\x4c\x43\x10\xc1\x82\x6b\xbe\xc7\xa5\x49\x14\xea\x79\x7f\xb1\x29\x7a\x3f\xbc\x7d\x38\x1c\xef\x7e\x0d\xf0\x97\xc7\x68\x3d\xa9\xf5\xe4\x8f\x1f\x7e\x3d\x09\xbc\xd8\xa4\x5a\x2c\x88\x80\x24\x1e\xfa\x29\xad\x53\x7f\xf6\x88\x03\x06\xd2\xc5\x25\xd5\x32\x54\xf1\x70\x92\x1a\x1a\x5b\x53\xab\x41\xb6\x06\x8e\x4f\x91\xd5\xac\xb1\xba\xb0\xf9\xfe\x7e\xf1\xd6\x5f\xff\x8b\x2d\x87\x78\x7e\xc3\xfb\xc7\xfb\xe7\xb7\x3b\x1c\x3f\x14\x27\x41\xfc\xec\xeb\xa4\x5a\x04\x48\x81\x25\xbe\xf4\x53\xed\xcf\xbe\xe2\xc0\x80\x68\x91\x49\xe5\x2f\xbe\x87\xb1\x3d\x29\x0b\x8b\xde\x9e\x85\x75\x00\x7b\x06\xac\x1f\x1b\xa5\x67\xdb\x66\xa9\x8d\x12\x90\xc7\xf5\x69\x3c\xa9\xe7\x6a\xc2\x96\xff\x87\x9c\xff\xcb\x2d\x57\xcd\x63\xe3\x62\xb3\x08\xb7\x08\xb7\x6e\xdf\xb1\x01\xe7\x63\xd7\x75\x4b\xdd\x75\xc1\x33\x22\x88\xfe\x83\x83\x0e\x7b\x77\xd0\x26\x0f\xc8\x82\xf7\xef\x8e\x3b\x5c\xfc\x75\x31\xf2\xee\xc3\x97\x70\x04\xce\xfb\xcc\x4c\x0d\x50\xea\x5b\x20\x73\x2f\x4a\x42\x61\x6a\x0a\x6e\x1b\x36\xe6\xe7\x3e\x9f\x08\xc1\xa0\x3c\x49\x85\x90\xef\xa8\x61\xbe\xe7\x96\x7b\x56\xe6\x38\x38\xd2\x32\x60\x2b\x5b\x01\x58\x59\x04\xaa\x2c\x37\x28\x02\x89\x7c\x92\x77\xee\x50\xef\xf5\xd7\x57\x10\x95\xdb\x3e\x7d\x83\xaa\x1c\xa8\x45\xdd\x26\xed\xbe\x6e\xbe\xe6\xdb\x08\x2e\x21\x8f\xba\x54\x84\xdb\x83\x2c\x06\x50\xf8\xc9\xf9\xc9\xfa\xc9\x5a\x50\x58\x50\x48\x2a\xfb\x28\x68\xb0\xa1\x3b\x17\xcf\x3b\x62\x2c\xf4\x02\x4e\xc7\x20\xb3\xb0\xc3\x7a\x42\x7e\x0a\xfe\xf0\xee\xd7\x2f\x07\x08\x8b\xf8\xe2\x0d\xf5\x67\x00\xc1\x80\x96\xb3\x37\x5e\xac\x09\x74\x0b\x8a\xd1\xf9\x3e\xa1\x79\xe1\xfb\x7a\x04\x91\x88\x67\x44\x6d\xed\x28\xac\x61\xed\x2a\x0b\xb9\xea\x6d\x55\xf9\x8b\x63\x7c\x4d\x92\x8e\xa0\x7b\x42\x47\xf4\x5c\xe7\xff\xeb\x50\x1b\x7b\xee\x48\xdf\x3f\x7e\x27\xfd\x1e\x10\x17\x6f\x76\xf7\xed\x00\x31\x79\x7c\xfb\x31\x6e\x47\x3d\xcf\xf3\x5c\x2b\xc6\xb8\x36\x23\xbf\x18\x3b\x8d\x92\xb1\x99\xf9\x96\x31\x80\x19\x3b\xf6\x4d\xa3\x9b\x85\x48\xa1\x04\xf5\x51\x1c\xf9\x73\xad\x1b\x50\xc4\x4d\xe3\x2b\x6b\xad\xa7\x36\x78\xff\x9a\x27\x1c\x9b\x13\xbc\x79\xff\xde\x7f\xef\xfd\xbb\x4e\x8f\xd8\x34\x8a\xb1\xa2\x2c\x50\x99\xe7\xba\x19\xcd\x09\x1a\x5f\xce\x4f\x91\x31\x6b\xfa\x89\xce\x67\x30\xfd\x63\x7d\x9a\x37\xcc\xb5\xdd\xe3\x94\x17\xbc\xe3\xb3\x6a\xc4\xdb\xa0\xa1\xb6\x05\x26\xc9\xc3\x8f\x06\xba\x37\xd3\xf8\x14\x74\xa9\x4b\xc1\x79\xb9\x80\x62\x60\x9d\x3f\x4b\x3f\x10\x00\xa9\xe7\xe2\x98\xb6\x44\x4b\x5e\x28\x55\x5d\x89\x88\xf9\x62\xcd\xba\xf3\x1e\x7b\xcc\x19\xb1\x05\x53\x46\x73\xc7\x0c\x6d\x7d\x65\x17\x24\x68\xe1\x4a\x1c\xd7\xda\x67\x7a\x8a\xb6\x9a\xe4\x86\xc7\xfc\x33\x5a\x5a\x6b\xe4\xfe\x5b\xf6\x15\x37\xe9\xaa\xea\x19\xeb\xb8\x1e\xfe\x7c\x68\xa6\x35\xf2\xc0\x22\x90\xfb\xf2\x35\x7f\xbd\x0e\xb3\xc2\x1a\xcb\x13\x5c\xe4\xa6\x10\xed\xb9\x36\xc6\x3b\x41\x73\x9b\x63\x80\xd7\xc7\x4a\x13\xad\xd6\xf3\xb1\xcf\xfa\x8f\xf7\xcf\x2a\xb5\x3f\xab\x40\xfe\x78\x46\x7f\x05\xe2\x57\x3a\xc6\xee\x3a\x38\x30\x15\xa5\x45\xa5\x27\xb1\x5b\xd8\xf9\x60\x97\x0b\xd1\x0c\x07\x55\x8d\xac\xd7\xba\x13\x7d\x92\x5b\xab\x65\x73\x74\x5e\x9e\x67\xa0\x82\x6d\x96\xaf\x6d\x6b\x97\x46\xd0\xc2\x16\x38\xae\x04\x7b\x8a\xac\xaa\x3b\x37\xa8\xa1\xdf\xf8\x85\x34\xf4\x24\x70\xf4\x1f\x83\xaf\xe9\xff\x11\xfd\x5f\x37\x9e\xdc\xae\x0c\xf1\x5b\x84\xa5\x5b\xce\xb7\xe6\x7f\x21\xd5\x7e\xc9\xbd\xdf\xbf\x7b\xfe\x31\x58\x43\xfd\xf0\xcf\x21\x5b\x7f\xfd\x84\xb8\x3f\x18\x1f\x01\xc6\x38\x6d\x5b\x8c\x18\x43\xa4\x10\x55\xe5\x5b\xe3\x5b\x53\x14\x74\x10\x02\x11\x40\x7c\x94\x70\x52\x94\x04\xa3\xa2\x20\xb0\x2c\x2b\x82\x3d\x23\x84\xe0\xaa\x28\x31\x2c\x19\xc6\x05\x98\x7f\x78\x42\xee\x31\x29\xcb\xd7\x4f\x39\x61\xf3\x14\xa1\x52\x60\xa3\xe0\x37\x4d\x68\xa6\x33\x7c\x28\xbe\x55\x87\xfe\x5b\x76\xcc\xf3\x8c\x49\x45\x30\x02\x91\x27\x25\x27\x16\x4b\x54\x06\xd3\x2a\xc8\x25\x6c\x0d\x96\x08\x62\x84\x1d\xe4\x95\xc7\x3f\xfc\x7b\x05\x4b\x4e\x6e\xcf\xb0\x95\x40\x21\x77\x8e\xda\x78\x7a\xae\x37\x3d\x46\x7f\x1d\xfd\x43\x84\x03\xff\xe2\x75\x07\x78\xd7\xbf\x7a\x5d\xc1\x08\x04\x8b\xad\xa4\xf6\xf1\xcf\xf0\xb8\xee\x5e\xc1\xa1\x41\xc5\x2b\x55\xb1\x24\x5d\x17\x0a\x0e\x5a\x03\xc1\x2c\x4a\xa9\x1d\x6e\xad\x6c\x99\x13\x04\x95\x05\x73\x84\x70\x56\xfa\xe9\x3a\x2a\xa0\x28\x29\x8a\xa2\x2a\x8a\xb3\x3a\x1b\xa0\x14\x2f\x2b\x8e\x80\x83\x05\xcf\xe1\x49\x53\x8a\x29\x21\x44\x20\x4a\x70\x61\xd5\xa0\x49\x69\x2a\xce\x90\xac\x30\xe6\x65\xc9\x3a\x2a\x09\x77\xa0\xf2\xb3\x87\x94\xa6\x3a\xc5\x00\x86\xc5\x27\x8a\x55\x53\x3a\x51\x29\x25\x64\xa1\xf8\xa6\x6b\xaf\x12\x7e\x27\x4e\xea\xd9\x8d\x72\x13\xf1\xd9\x89\x6f\x61\xe9\x7d\xf5\x51\x0e\x51\x55\x24\xd1\xd2\x3b\x3f\xbb\x65\x4e\xa2\xa2\xf4\x42\xb9\x91\x4d\x07\x39\xb5\xa2\x19\x4e\x8a\x0a\x13\x64\x5a\x10\xe8\x0c\x45\xbe\x21\xbd\x10\x5a\x50\xa9\x34\xbd\x5d\x73\xfe\xcc\x97\xfd\x53\xf4\x37\x3b\xeb\x25\x02\x3f\xc8\xa8\x87\x8b\xfe\xe7\x2e\xfb\xe9\xc7\xeb\x1e\x4e\xf6\x6e\x2f\xc7\x24\x43\x10\xdb\x5f\x6a\x86\x54\xc5\x0e\xca\xe4\x05\x38\x8b\x1c\x65\x48\xd7\xdb\x25\xaf\x05\xbd\x5d\x72\x5e\xf8\x39\xbb\x9e\x25\x90\xb7\x6b\xbe\x38\x03\x8c\x03\xb5\xa7\xb2\x69\x4e\x8a\x68\xcc\x28\xa3\x9c\x70\x86\x0b\x46\x95\x91\x05\xa7\x95\xae\x04\xc7\x12\x51\x2a\x21\xe4\x13\xd7\x4c\xb5\x25\x50\xbe\x5d\x66\x4a\x52\x9d\x61\x20\x97\x36\xee\x47\x3f\x32\x16\x81\x53\xf1\x84\x4f\xdd\x49\x46\x49\x88\x71\x1f\x4f\x85\x73\x27\x79\x19\x42\x8c\xa2\x77\xed\xdb\xfc\x87\xee\xeb\x0b\x25\xf0\xe3\x7d\x52\x51\x9a\xe5\x05\xcc\x4a\xad\x95\x01\x99\x3e\xe2\x2b\xa3\x34\x35\x29\x8e\xa7\xaf\xf6\xc8\xaf\xd5\x81\x01\xe8\x87\xe8\x2e\x70\x14\xda\xef\xf0\x06\xef\xb6\xbe\xcf\x5e\x7f\xf9\xa9\x76\xb5\x65\xde\xb7\xde\xf6\xbe\x33\xb0\x84\x5e\x37\x23\x35\xdf\xaf\xd1\xb7\x1d\x47\x70\xde\x1f\x5c\x87\x38\xb7\x31\xf4\x65\x0f\x20\xf1\xe3\x68\x3b\xdf\x71\x50\x8d\x1e\x9d\x88\x67\xda\xac\x59\xad\x6e\xd4\x7a\xe3\x21\x63\x7a\xe6\x56\x83\xd4\x57\xa0\x9b\xac\x52\x63\x04\x0e\x32\xba\xdc\x89\x93\x0c\x79\xc5\xf7\xfe\xae\x5f\x3e\xbf\x09\xfd\xd5\x5f\xde\x3c\x1e\xfa\xc6\x02\x96\x31\x4d\x44\x26\x49\x99\x15\x69\x9f\x1a\xc3\xe7\xac\x3e\xae\x03\x7a\xb8\x76\xc1\x39\x8b\x4c\x6b\xa8\xe1\x49\x2d\x41\x16\xa3\x5d\xe7\x38\x3a\x1f\xd6\x31\xbd\xed\x7e\x7f\x1f\x7d\x7e\x8e\x37\x9f\x61\x77\xef\x37\x13\xe0\x17\xf0\xdd\x16\x79\x82\x1f\x8d\xa9\x2e\xc4\xab\xc0\xc6\x54\x5e\x05\x8f\x33\x96\x79\xe1\xa3\x7c\x1e\xbc\x0a\xbf\x53\x9e\x82\xda\x3b\x04\xea\xa7\xe8\x72\x01\xf2\xbc\xd8\x70\x77\x52\x02\x32\x49\x7c\x4a\x04\x2d\x44\x05\x6d\x9a\x31\x41\xc0\x85\x48\x52\xc8\x62\xa9\x09\x21\xfe\x42\x08\x89\xa2\xdf\x45\xe4\x09\x1d\x74\xf0\x42\xfd\xff\x85\xb3\xfd\xcf\xfb\x4a\xf4\x3f\x5f\xd7\x58\xf7\x13\xbf\x21\x6e\x5e\x9f\x78\xd0\x15\xfc\xf8\xe9\x71\x47\x68\xbd\xfd\xf8\xe9\xee\x45\x88\xfa\x6f\x7f\x02\xb4\x7c\x38\xe4\x9b\xc8\x20\x09\x78\x62\xed\xe5\xe4\xf2\xe5\xec\x05\x02\x5d\x00\x9a\x0b\x60\x3c\x04\x43\xdb\x97\xa0\xf5\x97\xcb\x45\x97\x39\xcb\x4b\x40\xcf\x92\x55\x08\x57\x35\x41\x0c\x51\x49\x2b\x03\xb1\x47\x06\x12\x89\x01\x47\xb9\xcd\xe1\x49\xca\x22\x17\x9a\xfa\x9c\x0a\x91\xe7\x82\x94\xba\x50\x82\x82\x99\x6a\x96\xa5\xfa\x3a\x5d\x0a\x4c\x0a\x8a\xd0\xe5\x52\x94\x0c\x56\xd5\x52\x21\xca\x28\xc9\x82\xf9\x45\x01\xad\x08\x10\x8d\x52\x07\x9f\x4a\x90\x82\xf1\x74\x3e\xe1\x9d\x37\xf4\xa7\x2d\x56\x78\x7b\x38\xbe\xdb\xc9\xd2\xaf\x76\xe9\xdd\x72\xe2\x18\x86\xf8\x7e\x9f\x1e\x67\x7f\xf6\x2d\x03\x17\xe7\xd3\xf5\xff\xb8\xb5\x8e\x49\x3e\xb7\xdf\x74\x0b\x2e\x3e\x8d\xed\x7a\xbb\xf0\x97\xc7\x27\xcc\x35\x85\x4b\xaa\x85\xd0\xf1\xa5\x82\xac\x80\x15\xf2\xb9\x10\x62\x73\x0f\x0b\x9a\x32\x77\xfa\xc4\x7f\xe4\x5b\xdf\xca\x26\xbf\x9e\xce\xcc\x37\xbe\x4a\x88\x1f\x1a\x6f\xfc\x9a\xc4\x83\xf3\x89\x5b\x96\xf9\xda\x7e\x1b\x0f\x25\x5c\x26\x0f\xe5\x05\xe8\x4b\xdc\x6e\x1c\xee\x48\x44\x32\xd1\x27\x16\x6a\x53\x37\x7e\xf0\xe7\x9b\x4d\xf5\x83\x01\x59\x0d\xa2\xa7\xc8\x99\xcc\x3b\xcf\x0b\x67\xfc\xf9\xe0\x40\xe7\x91\x5d\x9a\x0a\x59\xa7\x6a\x08\x63\x1d\x81\x50\xb3\xde\xea\x1c\x5b\x8c\x70\xd8\x83\xd8\x87\x24\x3d\x98\xa5\x03\xe4\x2c\xa6\xb3\xf3\xe4\x94\x5b\xdf\xcc\x93\x9b\xdb\x6f\xd3\xa9\xda\xea\xc8\x7a\xaf\x13\xbd\xb8\x76\xfd\x2f\xa1\x9e\xf1\x1b\xae\x1f\xc7\x67\x1f\xc1\xdf\xa8\xea\x6e\x8b\xf1\x71\xff\x87\x0d\xfc\x55\xdb\x35\xfc\x5f\xc3\x5d\x3f\xc5\x75\x99\xc7\xe9\xb7\x32\x2e\xb2\xdc\xd7\x89\xbd\x72\x13\xcb\x45\x27\x8e\x32\x4c\x0b\x89\xca\xab\x70\xa0\x58\x33\x24\xbd\xce\xaf\x53\x2a\x84\x10\x5a\x4a\x29\x4b\x44\xa4\xac\x4a\xdf\x07\x1f\x9a\x7e\xa9\xb7\x00\x01\xb4\x8b\x48\xd2\xd1\xd7\x3c\x68\x69\x05\x1d\xff\x98\x6e\xb8\x83\xdf\x5a\xdb\xe2\x36\xce\x6c\x9c\x7b\xd2\x83\x92\xf8\x61\xb4\x83\x6f\x18\x20\xa3\xc7\xe0\xcc\xf9\xb6\x5a\x45\x1e\x81\x66\x36\x2a\xc4\xac\xff\x32\xce\x77\x0e\xc8\x1f\x5f\x65\x0b\x7f\x17\xf4\xd8\xfe\x7b\xf4\xbf\x3f\xeb\x8c\x6e\xc4\x99\xcd\x3d\xff\xd3\xc7\x4f\x3b\x84\xff\xf6\xdf\x1f\xc1\x2b\xea\xda\x9f\xc3\x98\x25\x4c\x67\x45\x62\xa8\x52\xee\x5b\x64\x95\xca\x0b\x55\x27\x58\x19\x65\x94\x52\x20\xdb\x8f\x54\x12\x8d\xe5\x55\x6b\xae\xa4\x4a\x0a\x5a\x6a\x48\x7b\x52\x9a\x92\x9c\x54\x89\x91\xf5\xc6\x78\x63\x2d\x10\x66\x86\x25\x1b\x7d\x15\xa8\x9d\xfb\xe1\xa3\x97\x9f\x96\xd6\x36\xa4\xb6\x04\x4f\x52\xa8\xda\xb5\xb0\xb3\x65\xb8\x8d\x92\x35\x4e\x3f\x16\x27\xb5\x63\x97\x5f\x70\x50\x1f\xef\x5f\x69\x80\x05\x2c\xfa\x8b\x6a\x8a\x02\xa9\x5d\x47\xea\x30\x5f\x2e\xe6\x72\xe9\x47\x7f\x69\x6f\x3d\x9d\x63\xdf\xb6\xba\x5d\xca\x56\xfb\x11\x94\xba\x8d\xc7\xd6\x17\xc1\x7d\x13\x1c\xea\x35\x06\x3f\xa8\xdd\xdb\xe7\x21\x00\xb4\x1f\xde\x3e\xfe\x12\x2e\xcc\x66\xb9\xf9\xe9\xe1\xf3\x6e\x74\x74\x74\xba\x04\xb4\x4f\x41\x74\xae\x46\xda\xe1\x94\xf6\x12\x44\x95\x9f\x01\x4c\x11\x42\xd2\x1c\x54\xc9\xcd\x5c\x94\xc6\xf7\xda\x9a\x73\x36\xd7\x6c\x02\xb9\x29\x8b\x59\x50\xda\xae\xb9\xb5\x4a\xe6\x1d\x87\xf6\xc2\x91\xff\xe5\xc8\x0c\x02\xf3\x32\x55\x58\xd6\x27\x09\x07\x6b\x38\x0b\x58\x49\x00\xce\x3b\x57\xf7\xaf\x6e\xcc\x9f\xb7\xdf\x21\x6e\x76\x40\xd0\x66\x08\x65\x50\xa9\xfd\x05\xe4\xd4\x54\xb8\x20\x15\x84\xa9\xce\xb4\xe2\x4a\xa4\xb4\x2f\xaa\x93\xd4\xb5\x9d\xae\x93\x6f\x72\x9b\xd7\xb1\xf5\xc2\xe3\x5a\xd4\xe0\x1c\x33\x6b\xc4\x3a\x0f\x55\xf0\x5b\x51\xaf\x38\x86\x5b\x9f\x61\x53\x62\x5d\x83\x9c\x6d\x88\x3d\x04\x5d\xbf\xe0\x47\xb3\x37\xe0\xee\x6e\x83\xea\xf8\xe1\x73\x92\x83\x39\xaf\x73\xd0\xf9\x22\x07\x8d\xfc\x86\x05\x90\xb9\xaf\x12\xbe\x88\x75\x6a\x6d\x87\x1d\x7a\xda\x8f\xbe\x51\x9d\x9f\xd9\xf9\x78\x36\xb9\xd4\xea\x8a\xb5\x4e\x5a\xe5\xb5\x10\x52\x88\x59\x28\xd1\x20\x69\x0c\x92\x5c\x51\x8d\x36\xcd\x89\x34\x78\x40\xaa\xa0\xd5\xba\x7b\x64\xdd\xea\xde\x2f\x37\xaf\xa8\x2c\xbf\xbe\x56\x23\x0c\xfe\xa3\x0a\x43\x47\xcb\x9a\x81\x6c\x99\xd2\x2c\x8e\x96\x39\x2f\xe2\x66\x29\xca\x2a\x1e\xbc\x01\xc3\xb7\x16\x8c\x7e\x72\x33\x07\xcc\xf9\x0b\x40\x45\xee\x27\x80\xb2\xd4\x33\x50\x95\xe8\xa4\xa4\xd1\xb2\xea\x0d\xa3\x86\x31\xcd\x98\xf1\x67\x63\x40\xd6\x6b\xd5\x03\xba\xfe\x4c\x99\x11\x2c\xda\xae\xe7\x96\xdf\xad\xb1\xd0\x1f\xa3\xc7\xa0\xa3\x18\x34\x7a\x83\x96\x23\x88\x8f\x1f\xa2\xbb\xa0\xbe\x13\xdf\x85\x52\xf0\x06\x3e\x0c\x8f\xde\xef\xab\xda\x8d\xa2\x05\x3e\x3d\xfe\x65\xfc\xf1\xd3\x31\x32\x25\x88\x00\x22\x7e\xf4\xd3\xd9\x37\x04\x74\x28\x46\x4b\x07\x66\x8d\x89\x66\x86\x19\x06\xa8\xc2\x4c\x51\xc5\x34\xf7\x9c\xd1\xb2\x2a\x24\xbc\x18\xa0\x2f\x97\x93\x2e\xd1\xc5\x1a\xb3\x2e\x88\x9d\x06\xe9\xa0\x38\xf4\x97\x3e\x20\x90\x10\xc8\xcf\x20\x82\xe7\xf6\xe2\x67\x04\x10\xc8\xc6\xf3\x55\x51\x96\x69\x6c\xbc\x39\x54\x7e\x74\x4e\x39\x17\xf0\x55\x38\xf8\x04\xff\x2e\xfa\xcb\xad\xe6\x77\x43\x51\x7e\x9f\xb9\x6e\xa4\x41\x10\x8a\x50\xbf\x3f\xfd\x47\xf0\x21\xa0\xa3\x6e\x76\xfe\x17\xd0\x95\x95\x21\x10\xcc\xdf\xea\x83\xb4\x57\x63\x41\x09\x2b\x49\x2b\x90\xe1\xd2\x15\xc4\x3b\x0b\x6a\x82\x65\x4e\x2b\x7f\xb6\xfe\x6c\x8e\xfd\xa6\x63\xea\x67\xdf\xb5\x2d\x40\x84\x60\x21\x99\x86\x94\x79\xd1\x75\xbe\xa4\x44\x67\x25\xa8\x16\x14\x77\x3e\x8d\x55\x14\xc7\x6d\xe0\xb7\xc8\xe8\x5f\x6e\xd5\x95\x4d\xcc\xe8\x7e\x67\x37\xde\xfd\x66\xe6\xf4\xb8\x6b\x19\x25\x91\x03\xd0\x81\xca\x7d\x6b\xf1\x61\x5a\x3a\x18\x57\x04\x17\x55\x0e\xf3\xb2\x31\xb5\xa9\x1d\x50\x45\xe6\xa3\x53\xe4\x87\x10\x9e\x41\x8f\x9d\x76\x0b\x27\x6b\x54\x0c\xc1\x25\x38\x06\xd5\x31\x5d\x48\x52\x61\x1a\xf6\x6d\x7a\x38\x9f\xc4\x56\x0b\x3c\xdd\xdd\xff\xc0\x3b\x0f\xd3\xf7\xfe\xee\xc3\xaf\x07\x8b\x18\xb7\x56\x31\x01\x91\xc1\x8c\xd5\x6c\x9a\xda\x0a\xe4\x27\xa1\xcb\xc2\x77\xa6\x96\xd2\x70\x7a\x3d\xc7\xe7\xce\x49\x10\x01\x61\x40\x0e\x0d\x0c\x1e\x3d\xd1\x13\xba\x63\xaf\x3c\xa8\xdf\xbc\x76\x3a\xfe\xb1\x2b\xfc\xe6\xcf\x76\x42\xa3\x03\xfb\xe6\x4c\xa8\xa4\xcd\x80\x5c\xfb\xdb\x23\x21\x04\xe1\x85\xc6\x78\xa9\x9c\x0b\xa0\xdc\x7e\xa9\x4e\x78\x61\xc0\x18\x63\x3c\x5f\x6f\xe4\xb5\x67\x34\x33\x19\xe6\xbe\x4d\x2e\x3b\xdb\x34\x8a\x8e\x41\x1f\xab\x09\x79\xd7\xcd\xb5\xf5\x56\x39\x0f\x58\xef\x37\xef\xe2\xe4\x97\xad\x15\xf8\xf8\xef\x93\x1b\xd6\xfb\x3e\x4b\x42\x54\xf3\x90\x7c\x7c\x03\x5e\x41\x41\x4f\x23\x81\xba\x24\xa0\xf4\x4d\x96\x93\x4a\x33\x8d\xab\x2c\x4b\x75\x6e\x35\x95\x35\x1d\x24\xce\x96\x6e\xd0\x82\xc6\x7d\x6a\xd3\x45\x82\xd6\xe3\x6c\xfd\x9e\x54\x5d\x9f\x14\x61\x98\x92\x41\x7b\x36\x75\x20\x85\x9e\xfb\xb3\x6f\x94\xca\x3d\x07\xa4\x35\xb2\x9b\x00\x8b\xb3\xa5\xf3\x85\xb7\x64\x02\xf4\x1c\x07\x2e\x9f\x1f\xb5\x5d\x46\x0d\xf2\xe8\x10\x97\xbb\x1f\x5c\x16\xd4\x67\xff\x76\xcb\x5a\x6f\x31\xd8\x1f\x41\x08\x4c\x6e\xeb\xe1\xf1\xb9\xf4\xf5\x0c\x1a\x7d\xf3\x78\xac\x70\x09\xcc\xd5\xfa\xd9\x58\x09\xfa\x12\xc6\xd1\x52\xc6\x63\x51\x15\xaa\xa8\x96\x0b\x48\x53\x93\x82\xc6\xd7\x14\x30\xe1\x5b\x01\xbd\xa6\x80\x94\x97\x93\x64\xdc\xa7\x17\x1f\x79\x49\x67\x20\x41\x14\x77\x04\xf9\x79\x6e\x29\x87\x82\xcc\xc2\x18\x61\x7c\xdb\xe9\x11\x30\xef\x26\xd3\x6e\x1c\xd2\x43\x2c\x9f\xd8\x5d\x1d\x47\x3b\xeb\xe6\xe1\xc5\x65\xe7\x56\xc7\xfd\xde\x11\x67\xcb\xb4\x1d\x54\xaa\xca\x6c\x21\xfb\x51\x02\x2c\x08\xa7\xc2\x53\x47\xb8\x93\x87\x48\x60\x83\x45\x1c\xf9\xb2\xc8\x2b\x86\x2c\x21\x0c\x74\x8c\x0b\xc9\x61\xe5\xa7\x8e\x4c\x43\xd3\xa3\xa1\xde\xb0\x4d\x60\xde\xd7\xbf\xfb\xa0\xd4\xfb\xee\xc5\xa8\xe8\xdd\x7e\x81\x76\xe2\xc2\x31\xd7\xe5\x05\x54\xcc\xf7\x97\xc9\x8f\x0c\xb8\x9a\x13\x46\xb9\x6f\x92\xd6\x4a\xc9\xe9\x92\x9d\x34\x29\x7b\xad\xcd\x38\x1a\x35\xba\x8a\x48\x8a\x07\x3d\x09\xc1\xd4\xd6\xf7\x75\x7b\x0c\xb9\xf1\xc4\xcb\xe0\x15\x16\x81\x8f\xd9\xdd\x73\xd1\xf1\x3b\x35\x96\xf5\x2a\xbc\x40\x79\xef\xbf\x17\x6a\x71\x15\x28\x2f\xe2\xfc\x14\xc9\x5d\x8b\xa5\x33\x88\x5b\xbe\x14\xb6\xaa\x1c\x01\xac\x4e\x27\x80\x89\x6f\xfa\xda\x73\x1a\x57\x60\x70\x84\x5b\xb9\xe4\x4d\x85\x6a\x7c\x92\x7e\x6a\x74\xab\x5b\xdd\x18\x25\x40\x75\x81\x7d\x4d\x6c\x5d\x0e\x06\x36\xcb\xc5\x77\x15\xf4\x83\x76\x76\x83\x00\x4f\x80\xb4\x70\xb6\xa4\x35\xe5\x68\x60\x13\x9d\x92\x4d\x83\x70\x9d\x2b\xb7\x58\xef\xd3\xf3\x6c\xb9\xf9\x93\x3c\xfc\xb0\x39\x3c\x6e\xf5\x92\x1f\x9d\x8d\x4f\x0d\x85\x12\xd2\xc5\x00\x67\x83\x3a\x04\x67\xac\x84\xe5\x1a\x5f\x8c\x06\x70\xcf\xfa\x71\x0c\x36\xd4\xe1\xee\xa4\x02\xbc\xa8\x0f\x6e\x79\xf6\x5b\x47\x69\xaa\x71\x1f\xf2\x31\x7a\xb8\x58\x1f\xbd\xb0\x0f\xa3\x28\x3e\x6c\x78\xfa\x34\x4a\x36\xe5\xef\xb7\x3f\x57\x74\x8f\x65\x5c\x2e\x23\x8e\xdb\x89\x19\x82\x0a\x4a\x89\xef\x4f\xa9\xf5\xc6\x5e\x6b\x41\x53\x97\x91\xa4\xda\xfa\xc4\xf5\x13\x3e\x8c\x27\xf1\x8c\x3b\x5d\xd3\xc7\x17\xdc\x69\x72\xb6\x72\x16\x5d\x8a\x21\x03\xb9\x55\x48\xba\x93\x80\xde\x8e\x62\x58\x52\x5c\x2a\x90\x02\x84\xeb\xfa\x8a\x36\xdc\x01\xfc\x8d\xf3\xfa\xbe\x5e\x93\xa8\xa4\xbf\x56\xe4\xc0\xfd\x48\x8d\xe2\x85\xd2\x68\xe1\xfb\x89\x35\x82\xe5\x2e\x27\x09\x7c\xf6\x30\xb1\xa7\x6a\x5f\x4d\xff\xc3\xad\xfa\xf9\x6c\xf1\xfd\x10\xe2\xe9\x87\xfb\x57\x18\xc4\xfb\x4f\x3b\x06\x31\x3e\x1f\x6a\x6f\x00\x72\xd7\x8b\x03\xd8\xeb\x38\x75\xce\xf7\x49\xea\x30\x76\x8d\xb4\x75\x92\x3a\x78\xaa\xac\x3f\x7f\x6d\xb5\x3e\xe2\x80\xbc\xc9\xbe\xf6\x80\x20\x0c\x5a\xeb\x9b\x91\xb5\x20\xb3\xa1\x9e\x25\xca\x28\x8e\xbb\x27\x15\x70\xcd\xbb\x32\xe5\xdb\x87\x1f\x11\x00\x6f\x1e\x9e\xf3\xb7\x3d\xfa\x49\x8a\x03\xf4\x91\xb3\x20\x05\x39\x26\xb6\x91\xae\x28\xbd\xf6\x14\x8e\xce\xab\x0c\xd4\x01\x68\x10\x17\xdf\xca\x38\xf7\xf4\x54\x58\x5f\xeb\xbc\x92\x02\x9d\xfd\x8c\x29\x26\xb9\x6e\x00\xbe\xd2\x4d\xf7\xa9\xb7\x16\x54\x37\xcf\xa2\x2d\x7e\xfd\xf0\xbd\x82\xe0\x26\x1a\xf7\xec\x21\x1b\xbd\xb9\x11\x40\x3f\x7f\xf9\x9c\x64\xe0\x1c\x44\xca\xc1\xfc\x4d\x26\xd0\x78\xed\x1b\x50\x02\x52\x61\x63\x85\x2d\x0a\x8f\x3c\x46\x80\xf5\xf3\x05\x8e\xa6\x36\xa6\x1b\xc9\xd1\x30\x0a\xb9\x32\x33\x5a\xd0\x39\x27\x46\x21\x7f\xf6\x1d\xe6\x54\xa4\x06\x64\xa0\x84\x99\x6e\x01\x87\xbe\xb3\x59\xa5\xc3\x18\x42\x77\xcd\xa9\xd8\x51\xdf\xcf\x42\xf8\x8f\x9f\x1e\x7f\x01\x77\x51\xb2\xee\x82\x87\x72\xb6\x53\xd2\xd5\x23\x05\x86\x7b\xc4\x81\x5a\x74\x2c\x13\x42\x96\xd9\x53\x06\x1c\xb8\xc4\xf3\x75\x60\xcb\xe0\x1b\x03\x54\x6c\xe2\xca\xb3\x10\x73\xea\x27\x7c\x87\x4e\xf9\x86\xff\xcc\x9e\x05\xee\x3f\xff\x72\x1f\xe4\xd8\xa3\x3f\x82\xc7\x44\x27\x6d\xe5\x1c\x46\x25\xa5\x94\x94\x41\xc4\x03\xf4\xfd\x29\xbf\xda\x85\xb8\xac\xc9\x58\xac\x62\xe3\xd3\x85\x79\x26\x80\x89\x11\xb8\x6c\x3d\x68\x13\xf8\xd8\x45\x18\xf9\x3f\x8d\x54\x73\x48\x7d\xc3\x6c\x50\xc8\xa6\xcb\x7c\x2a\xec\x57\x2b\x58\xe6\x32\x7c\x24\x21\xe7\xfe\x27\xfe\x36\x3d\x18\x2f\xb9\xe3\xb4\x10\x82\x2f\xf6\xfb\xbf\x4d\x80\x78\x22\x77\xea\xc8\x77\x4f\xc5\x90\x63\xfd\xfe\x45\x21\xe4\xfe\xd7\x2f\xef\xa2\xe3\x2e\x45\x0d\x1e\xfe\xfd\x5e\x08\xdd\x08\x08\xd1\x9b\x87\xe3\x0d\x52\x70\xfc\xf0\x19\x4c\x20\x73\x29\x50\x10\x6b\x86\x81\x59\x30\x90\x67\xe5\xad\x77\x45\x0b\x32\x9c\x9a\xd4\xf8\x7a\xd2\xb9\x90\xc4\x1a\x99\x4e\x23\x05\x22\xf3\xe7\x43\xa4\xd4\x40\x1a\x50\xa8\xde\x0f\xf8\x72\x30\x83\x60\x18\x11\x2e\xcc\xd5\x76\x1d\xf6\xa3\xcd\xb1\x86\x3d\x2f\x21\x2c\x65\x85\x92\xda\x47\xcb\xd9\x19\x90\x26\x79\x81\x2d\x17\x94\xe0\x41\x0b\x1e\x6a\x6e\xf4\x09\x1f\xdc\x89\x86\xba\x6e\x1e\x50\x68\xfb\x2a\xf2\xca\x21\xef\x86\x20\x78\x0d\xb3\x06\xbd\x69\x06\x35\xc5\x69\xd3\x48\x3b\x40\x53\x14\xd3\xa4\xda\xb9\x9f\x14\xa0\x31\x73\xbe\x72\x0e\xf4\xbe\x3a\x51\xec\x27\x2b\x9b\x56\x37\xaa\xad\xfd\x99\x14\xa5\x69\x65\x5d\x0f\x4a\x8c\x5e\x2e\x99\x52\xf1\xd9\x17\x61\xc3\x05\x87\xf1\x09\xdf\xd1\x53\xb4\x23\x9e\x5f\xd0\xa1\xef\xfe\xfe\xd3\xa9\xf5\x9d\x8b\x15\x21\x44\x96\x1d\x3c\xf2\x7f\x9c\x4e\xed\xb7\x94\xd2\xd4\xa6\xeb\x42\x98\x86\xcf\xa1\x83\xde\xc3\x9b\xe8\x2f\x9f\x35\x7b\xf0\x6f\xbb\x96\x7f\x78\x85\x9a\xbf\xff\xde\x33\xfa\xd9\xf4\xe3\xa7\x2d\x01\x54\x0a\x61\x8a\x34\x96\x3c\x1e\x54\x85\x49\xa5\xb0\xe0\x97\xe7\x5f\x7a\x93\x18\x2f\xd7\x0f\x3d\x18\xa6\x94\x71\x03\xbf\x18\xef\x40\xe3\xb5\x99\x67\x20\x2f\xcb\x76\x77\x52\x90\x53\xca\xb0\x16\x52\x42\x86\xc3\x23\x2e\x20\x23\xdb\x23\x6f\x96\x5a\xc8\x94\x51\xcd\x89\xb7\x40\x8d\xd2\xc8\x4e\x8a\x5d\xba\x40\xa9\xdd\x93\xd7\x3e\xe1\xbb\x12\x8c\x7b\xbf\xfa\x15\xff\xec\xcd\xc3\xba\x2b\xc7\xd3\x32\x9e\x04\x77\xba\xcb\x3b\x83\xca\x6c\x49\xc5\x32\x50\x70\x06\xd8\xf8\xaa\x2d\x4c\xc1\x40\xe4\x39\xb7\x78\xcd\xb5\xf0\x3f\x13\xbf\xfb\xe2\xad\xff\x4f\xe1\x77\x1f\xde\xae\x1b\xea\xc9\x49\x8f\x16\x82\xe3\x16\x18\x43\xb9\x12\x5e\xa3\xc2\x14\xc8\x8f\xb4\xd2\x90\x8a\xb8\xf4\xe5\x41\x58\xeb\x23\x62\x28\xc9\x19\xc3\xbe\x04\xe3\x32\x1e\x36\x14\xb9\x3b\x69\x45\xa1\x81\x1a\xd6\x1c\x2b\xcc\x25\x94\x3c\xa7\x94\x50\xba\x8c\x9d\xf1\xcd\x9f\xc3\xf0\x46\xfc\x49\xc4\xf9\x09\x7d\xcf\x5b\x0a\x04\xcb\xdc\x72\x4b\x1d\x48\x35\x6b\x5c\x7b\x42\xed\x44\xc7\xee\x3a\x50\x2f\xbd\x95\x80\x46\x51\x0c\x86\x5d\x2b\xe1\x8f\x3b\xfe\xf7\xf7\x6f\x36\x0f\xb9\x75\x11\x7c\xb5\x40\x80\x87\xb7\xbf\x4f\x36\xb1\xfe\x83\x74\x74\x68\xf8\x30\xb5\x80\x08\x5f\x0f\x44\x04\x72\x68\xb5\x4c\xa0\x77\x72\xe0\x80\x30\x3f\x9e\xa4\xb7\xc5\x53\x64\x26\x75\xd1\x9e\xf9\x8b\x01\x55\x1c\x5d\xbb\x40\x12\x65\x07\xa1\xb5\xd7\x7e\x9c\xd7\x95\x2d\xda\xea\xe0\xec\x09\xdd\xd5\x47\x15\xf6\xcd\xbf\xdd\xd7\x98\x50\xab\xda\x18\x2d\x2f\x6a\xc3\xaf\xa8\xd5\xf7\x77\x6b\x42\x1c\x34\x15\x82\x77\xc0\x9a\xc1\xef\x44\xce\xde\x15\x30\xb6\x84\x00\xe7\x0b\xec\x2e\x24\x75\x99\xf1\xcd\xc5\xe0\x6e\xa9\x45\x5c\xd6\x1e\x09\x0a\x54\x11\x57\x0c\x2d\x3d\xab\x00\x2f\x33\xcf\xe2\x0c\x9c\xd7\xe0\xdf\x31\xa4\x2b\x76\x54\x55\x85\x34\x25\x4b\xef\x87\xa2\x40\x16\x8e\x1c\x53\xc0\xbd\xaa\x8d\x02\x39\x68\x89\x01\x51\x47\xa8\xf0\x85\xb2\x7e\x06\xb9\xf5\x1d\xe5\x84\xd3\x7d\xac\x1e\xf4\x1d\x3f\xc1\xe8\x6e\x63\xbd\xae\x53\xfb\x8e\xbb\xaf\xc2\x9d\xa0\xa7\x81\x15\x11\x62\xde\xa0\x0f\x53\x87\x7a\xcd\xe6\xec\xf0\xc2\xe1\x7b\xdc\x9d\x32\x9e\xd5\x59\x6e\xe4\xe6\x24\xac\x55\xc9\x05\x08\x17\xca\xfc\xc5\x00\x69\x99\xda\x0c\x96\xad\xc6\x9e\x03\xec\x4d\xbf\x4e\xc9\xd4\xa2\x51\x74\x37\x12\x9f\x4f\x51\xd5\x97\x97\x0a\x22\x1a\x97\x71\xd5\x2f\x16\xa4\x1e\x16\x1e\x76\xb2\xdd\x3d\xa3\x87\xd0\xdb\xd9\x74\x34\x6f\xf5\xfa\x97\xb3\xb9\x29\xdd\xde\x4e\x20\x5e\xdf\x2b\xf5\x1d\x40\x2e\xe0\xd9\xaa\x5a\xd0\x42\xb7\xf8\x02\x9c\x67\x99\x45\x9d\x68\xe2\x22\xae\x7a\xbb\xbf\x3f\xab\x90\x65\x84\xc4\xed\xf6\xbe\x65\x2b\xdb\xe8\xdf\x86\x79\x68\x5e\xf1\x3e\xde\xbc\x52\x20\xd8\xea\x1f\xff\x6d\x77\x36\xfd\x29\x2b\x7d\xf1\xd6\x78\x41\x3b\xbc\x0b\xda\x48\xbf\xfd\xfb\x78\x3e\x94\xdf\xc6\x0d\xb8\x32\x80\xea\x7a\xb9\x3d\x02\x99\xf2\x56\x6b\x29\x67\xe5\xed\x7a\xab\x7c\xa9\xc3\xba\xa3\xce\x72\xbd\x3f\x4b\x79\x82\x6b\xee\x6a\xad\xf5\x64\xbd\x11\x57\x24\x44\xd2\x79\x7b\x3e\x9f\x17\x77\xb9\x5c\xc0\x74\xad\xa4\x4c\x7a\x6f\xe7\x79\x5e\xea\xf3\xf9\xbc\xd5\xaa\xab\x67\xfd\xd4\x3c\xfa\x35\xfa\x2f\xc1\xf1\xf9\x7f\xfc\xac\x30\x90\xdc\x32\x9b\x77\xdf\xff\x72\xa3\x2e\xff\xb8\xe0\x1c\x9f\xd5\x50\x3e\x3d\x1e\x77\xe6\x72\x9c\xdb\x38\x5f\x66\x30\x7d\x6b\xc0\xb8\xcc\xd5\xb1\x80\x58\xc1\xfc\x9b\x51\x89\xf1\x75\x4c\xbf\x9e\xe3\xc2\x33\x7b\x64\x5d\xdb\x12\x01\x61\x5e\x21\xe8\x19\x70\xdf\xce\x31\xd4\x83\xd6\xc3\x10\x63\x5c\x4a\x88\x4e\x25\x21\x92\x28\x45\xfc\x24\x09\xc5\x10\x52\x41\x84\x20\x7e\x96\x44\x5d\x18\x49\x4d\x86\x26\x45\xe8\x32\x51\x1a\x17\xbe\x19\x0a\x42\x2b\x4a\xa2\x28\x8d\x37\xbf\x2f\x1d\xb4\x36\x7f\xbf\xa3\xa9\xff\xe6\x36\x93\x6f\x25\xac\x5f\x43\x09\xeb\x37\xe4\xc6\x7e\x9b\x52\x7b\x68\x5c\x5e\x80\x12\x48\xb6\xae\x18\xe7\x35\xcf\x1d\x50\x4c\x96\x66\xd3\x18\xb3\xc3\x00\xe6\xfd\xc1\xd2\x9a\xa2\x34\x52\x08\x49\x85\x9c\x93\xc8\x14\x65\xad\xb9\x5e\x57\xe2\xf9\xa4\x61\x59\x9c\x6b\xb3\x0e\xbe\x4b\x6b\x2e\xa3\x5e\xbf\xe3\x5e\xaf\x37\x5e\x43\x4a\xa8\x54\x82\x69\xce\x46\x90\x41\x4a\xb8\xd2\x9a\xaf\x3f\x45\x51\xf4\xaf\xe3\x2a\xe0\xd6\xf1\x77\x7d\xca\x7f\xf7\x0a\x65\xbf\x2b\x77\xbf\xfb\xad\x31\xfa\x4f\xfc\x3e\xae\x0f\xf5\x37\x5a\x1e\xe8\xb7\x7a\x53\x33\xdc\x2a\x28\xfb\xa3\x6f\xc3\xb1\xfc\x3a\xb2\x83\xf8\x66\x6c\xa8\xaa\x9c\x01\xbd\xb6\xb7\x47\xdf\xcc\x51\x7c\x35\x27\x2c\xa9\x8f\x00\x64\x8c\xf9\x89\x52\xea\x27\xf5\xf2\xf3\x7a\x33\xaa\x35\xc6\x98\x43\x1f\x1b\x05\x7c\xd6\xdd\xc6\x01\xfa\xf0\xe5\xdd\x5d\x70\xa8\xd8\x0d\xf0\x3e\xbe\xfd\xfd\xbb\x57\x49\xfe\xa9\x4a\x91\x15\x43\xd1\x95\x54\x22\x91\xcd\x31\x1e\xb3\x61\xca\x58\x56\x14\x59\xaa\x72\xc4\x38\x4e\x5c\xee\x14\x73\x17\xde\xe5\xf6\x2c\xe5\x59\xd2\xa1\x48\x0b\x0a\x35\x42\x24\x8a\x63\x16\x8b\xc3\xf9\x84\xa2\xb7\xa1\x53\xff\xf0\xf6\xf1\xf7\x37\x6f\x8c\xe7\x37\x07\x1f\xdf\x86\x25\x25\xb6\x71\xd9\x65\x6d\x5f\xce\xa2\x87\x43\x41\x64\x25\xb2\x09\x50\x45\x4b\xce\xaa\x13\x92\x9a\x4b\x3f\x74\xcc\x9d\xc3\x5b\x79\x3c\x40\x8e\x20\x8e\x92\x78\x7c\x42\x77\x69\x5c\xbd\xd6\x08\xba\xa9\xb7\x05\x29\xb4\xd4\x2d\x99\x73\xf1\x79\xc9\xc2\x51\x2d\x29\x63\xf1\xc5\x5f\x94\x97\xea\xa6\x01\x8d\x7f\xf2\x5c\x00\xb5\x83\xd8\x62\x42\xce\x27\x09\xdb\xe6\x2b\x3f\x60\x23\x76\xcf\x85\x53\x4c\x76\x2d\x82\x6d\x14\xbc\x0f\x19\xf7\x4f\xb3\xf9\xcd\xf7\x6a\x68\x1b\x73\xe9\xc3\xeb\xf3\x8b\x55\x0c\xed\x9a\xef\x82\xe9\x9b\x05\xe7\x65\xa0\x87\xea\x5b\x6f\x92\xfc\x3a\xeb\xb2\x00\xae\xc8\x6d\x09\xca\xaf\x35\xa8\x60\xd2\xdb\xeb\x6c\xed\xfa\x4f\xa7\x9c\x31\xcd\xa5\xe4\xbe\xf1\x5a\x49\x3f\x21\x84\x10\x24\x5a\x13\xdf\xf9\x9c\x52\x30\xfb\x8b\xde\xd6\x1d\x16\xb8\x8a\xaf\x31\x63\xff\x10\x22\xc3\xe0\xae\x7a\x73\x0b\x79\xfb\x5d\x73\xf2\x67\x36\x08\xf8\xc9\xc6\xe3\xd9\xc5\x23\x2c\x38\x43\x59\x32\x8a\xba\xa5\x07\x93\xf5\xad\xdd\x34\x86\xe7\x21\x6c\x07\x53\x20\xae\xed\x8f\xbe\x4d\x49\x28\x61\xcc\x54\x33\x92\x33\x8e\xaf\x0c\x14\x5a\x30\xa1\x8e\xa3\x73\xb0\xc4\x98\x6a\xb9\x14\x5a\x6b\x1d\x4f\xd2\x1b\x29\xc3\xba\xab\x7c\x4a\xa9\x1e\x05\xcd\x5d\x81\xbb\x8a\x70\x29\xc9\xae\xcf\xd5\xec\x9c\xdd\x3f\x86\x9a\xda\xfd\x2b\xb3\xb5\x10\xaa\xbf\xdf\x11\x7f\x3f\x58\x9e\xdd\xfc\xb7\x06\x4f\x6f\x42\x65\x36\xf0\x59\xe2\x28\x86\x4b\x70\x5f\x8b\x69\xd1\x72\xc7\x8d\x90\x0d\xab\xa5\x24\x12\x33\x51\xae\xf9\xee\xa2\x27\x33\x19\xaf\x4e\xa3\xcf\x01\x35\x01\x4c\xb6\x38\xaf\xfd\xc4\x99\x66\x52\x51\x43\x84\x1b\x69\xaf\x9b\x31\x4a\xc2\x38\x31\xcf\x1a\x62\xbb\x66\xf3\xdb\x1f\xd8\x37\xf7\x0f\x37\x9e\xee\x81\xb9\x40\x6b\xb9\x78\x12\xe3\xa5\xad\x97\x26\x26\x1e\x01\x35\xc5\xe3\x52\xae\xc7\x49\x2a\xeb\x96\xcc\x5a\x5f\x03\x6a\x6d\x7c\xf6\x83\xf3\xb0\xde\x6b\x76\xdb\x1e\xf3\x6e\x67\xd9\x7d\x37\x1e\x5f\xf3\x9d\xfe\x2c\xa3\x25\xee\xc0\x1c\x20\x14\x60\xf4\x65\x4c\xbe\x4e\x31\x0c\x57\x27\x3f\x20\xc1\x31\x2d\x15\x42\x0b\x76\x81\x7c\xb9\x1e\xa7\x48\x4a\xad\xb4\xd2\xeb\xcd\x22\x96\x62\xa3\xb9\x54\x7e\x4a\xdc\x53\xa4\x7c\x08\xd8\x4f\xf1\xc6\xad\xc9\xf7\x75\xf3\x86\x98\x7f\x8d\xa0\xfb\x61\xc6\xc6\x97\x43\x74\x8d\x5c\xdc\x05\x66\x22\x4a\x1a\x77\x75\xce\x25\xec\x1a\x8e\x53\xbe\x94\xa0\x59\x37\x60\x8f\xae\x96\xf3\x84\xfb\xbe\xf6\x45\xb3\x73\xa1\x71\xd0\xad\xfe\xff\xac\xd7\x10\x8f\xa0\x87\x55\x8d\x21\x38\x7f\x33\x9d\xcb\x0b\xc5\x04\x61\x4c\xc9\x3e\x1e\x5c\x5e\x3a\x21\xb9\xc0\x5c\xb6\xd7\x2e\xae\xea\x75\xe6\xd6\x4b\xff\x4a\xaf\x81\x32\xa5\x34\xe9\xe4\xae\xd7\xc0\xb5\x09\x7a\x0d\x8d\x2f\x6f\x7a\x0d\xeb\x39\xaa\xd0\x8b\xda\x6a\x8e\xef\xf7\x5a\xf0\x73\x1b\x24\x84\xae\xef\x3f\x04\xc5\x81\xe4\x55\x5d\xe6\x30\x12\x18\x17\xee\x4a\x5d\x9c\x95\x08\xa8\x79\x54\xdd\x53\x74\x66\xbd\x9f\x28\xa8\xda\x43\xe5\x61\x8c\xbf\x8e\x31\xf4\xf8\xa4\xb8\xf2\x66\x3c\x03\xcd\xa8\x87\xae\x57\x7d\x4f\xf4\x2c\xac\xf4\x6b\xcc\x62\xed\xba\x8a\x6d\x7d\xe7\x75\x6d\xf8\x9b\xd7\x98\x8d\x67\x3e\xdc\xc3\x0f\xb8\xdd\x67\x11\x81\xfb\xcf\x87\x4a\xb7\xdd\xba\x41\x25\x41\x75\xd0\xaf\xe3\x75\x2c\x89\xa8\x32\x57\xc8\xae\x11\x63\xda\x4d\xa2\xaf\x53\x3f\x9f\x4f\x52\xb1\xb2\xb3\x97\x8b\x1d\xed\x95\x2f\x6d\x91\x63\x87\x46\x4e\x78\xcc\xbc\xf1\x4e\x58\x06\x0a\x50\x26\xb4\x8c\x0e\x71\xb6\xeb\xd3\xfc\xf1\x45\xc9\x22\x4e\xb6\xf2\xf8\xfd\x0f\x1e\x8a\xeb\xbe\x79\x7c\xfb\xf0\x69\x0d\x43\x8f\x91\xa7\x59\x6d\x18\x39\x48\xcf\x37\xd3\x44\xb7\xb4\x0e\x50\x60\x37\x9b\x0b\x50\xb7\xeb\x64\x8a\x7b\x9f\x7a\x4d\x2f\x40\x82\x22\x3e\xfb\x6c\xb2\xe3\x42\xa5\x8c\xeb\xa4\xee\xec\x34\x5d\xf3\x4d\x73\xff\x18\xd3\x27\x1d\xea\x23\x2f\xfb\x7b\x04\x5e\x49\x26\x7e\x7a\x71\x70\xfc\x5e\xfb\x6a\x38\x60\x0f\x03\xd1\x87\x7c\xed\x62\x12\x58\x1e\xa5\x0b\xd1\xe5\x08\xe0\x1e\x67\x8e\x00\x9e\x8a\x2b\x9f\xed\x6c\xed\x6c\xe7\x38\x5f\xe3\xc4\x35\x58\xdc\xea\xee\xf9\xee\x6b\xf5\x3e\xfa\x8f\x11\x0c\x35\xdc\xdf\xca\x7e\x76\x61\x29\x10\xb2\x9f\xd3\xdd\x87\x5f\x37\x77\xcb\x37\x0f\x9f\xbf\xfc\x35\x58\x9f\x9b\x8c\x2e\x2f\xe3\x8a\x72\xa0\xbc\x2e\x89\xc4\x99\x2d\x54\x5f\xf3\x5c\xf8\x54\x82\x5e\x78\x59\x42\x0e\x4a\x60\x25\xf3\x10\x0b\x02\xf2\x62\x0d\xe1\xc7\x34\x07\x2c\x74\xe4\xb5\xe2\x4b\xed\xcb\x32\xa7\x4d\x75\x91\x44\xac\x2b\x92\x3f\xab\x0b\xc0\x71\x56\xe6\x72\x1a\xb8\x14\xc2\x23\xed\x9c\x06\x65\xd0\x95\xe3\x01\x0f\xf2\xaf\x02\x42\xea\xdd\x6b\xef\xd2\xd7\x3f\x80\xd6\x66\x79\xe7\xa4\x36\xac\x93\xa0\xc4\x36\x2b\x1a\x23\xa4\x66\x83\x04\xd5\x89\x15\x92\xd7\x83\x6a\x8d\x3f\xcf\x12\x30\xdf\x14\x4a\xda\x56\xd5\xca\x4f\x17\x09\xf8\x7a\x7d\x68\x58\x4f\xab\xd7\x63\x64\xbd\x30\xdb\x75\x89\x5f\x09\x6e\x3d\xbe\x16\x09\x4b\xd2\x64\xf4\x67\xae\x60\xea\xb2\x8a\x74\x0d\xad\xb1\x97\x0c\x90\x6a\x74\x37\x5c\xee\x7a\x9c\xaa\x6f\xd2\x6b\x5c\x39\xd8\xf0\x12\x73\x50\x7b\xdc\x28\x03\x68\x02\xbb\xe5\xd2\x2e\x97\xe0\xbf\xf5\x2f\xe3\xe8\x49\x84\x9e\xc1\x4b\xaf\xfb\x53\xf4\x9f\x5e\xe9\xea\x6e\xab\xc9\xc7\x0d\x15\xfc\xf6\x27\xde\xfc\x3a\x6e\xc1\x4f\x95\x85\xed\xf6\xf8\x1b\xa2\xc1\x71\x0b\x06\x0b\xce\x5a\xfb\x2c\x96\x5f\xeb\x38\x0c\xb2\x20\xab\x06\x63\xbe\x51\xc2\xaf\x4c\x09\x21\xd4\x81\x0b\x6c\x10\x5b\x5a\x5a\x69\x48\xc0\x99\xac\x77\x71\x2a\xbf\x2a\xed\xda\x16\xa0\xae\x03\xb8\x6d\x4f\x19\xe7\x93\x9e\xb8\xd6\x5c\x31\xcd\x18\x9b\x19\xf3\x39\x36\x98\x31\x4a\x79\xc5\x69\x45\x45\x25\x28\x24\xbc\xe2\x64\xf2\xdc\x98\xb0\x47\x06\x99\x97\x4d\xea\x25\xf8\x2d\x6c\xfb\xda\x16\x55\x04\xcf\xa3\x5d\x52\xff\xe1\xc7\xcd\x25\x94\xe4\x03\xc4\xe9\x7e\x83\xd7\xa8\xaa\x74\x45\x19\x0f\xd7\x33\x4f\x22\xc6\xa8\x2e\x34\x45\x8b\x76\x94\x49\x10\x19\xdf\x03\xb9\x09\x68\x2c\xfa\xa8\xa4\x2a\x04\xb7\xdd\x35\xe2\x22\xb3\x99\xb0\x9e\x26\x93\xa0\x02\x44\x20\x5f\xe6\x6e\x39\x77\x51\x12\xf0\xd0\xf6\x94\x3d\x7b\x12\x6d\xed\xfc\xdb\x52\x11\x60\x56\x1b\x13\x2b\xb6\xc7\x68\x69\x8a\x32\x2e\xdd\x12\x39\x20\xca\x62\xb9\x9c\x93\x68\x89\xd6\xe3\x94\x59\x2d\xbf\x0e\xce\x1d\xa1\xd4\x4b\x04\xf8\xd5\x01\x16\xe6\x64\xc0\xe7\x9c\x58\xf4\xf6\x19\x6d\xfd\x71\xc7\x29\x7d\xdf\x11\xfb\x18\xaa\xba\x9b\x08\xe8\xeb\x42\xe2\xb1\x72\x20\x6d\x79\xdd\x14\x44\xa1\xdc\x16\x6a\xa8\xb9\xef\x8c\x37\x1a\x90\xac\x6e\xf1\xb9\x4b\x52\xab\xac\xb4\x57\xac\x89\x21\xea\xc4\xae\x73\x6d\xad\xd3\x8b\x2b\x72\x6c\xd1\xc0\x09\x3f\xa1\x6b\xee\x33\xdf\x71\x90\x01\x6b\xa4\xd3\x75\x6c\xb0\x1f\x9c\x68\x9b\x6e\xa2\x53\x1f\x45\x71\x6c\xf6\x1e\xd0\xbf\x0e\x0e\x07\x3f\xeb\x8d\xbd\xae\xf3\xde\x49\x77\xe5\x2e\x4e\x4b\x64\x09\x5c\xaa\x63\xb4\x5c\xa8\x91\xac\x50\x12\x2f\xf5\x51\x78\x79\x3e\x03\x2d\x39\x94\xd6\xa7\x76\xa9\x36\x5b\xe7\xb8\x09\x7d\x97\xf6\x49\xdc\xa9\xd0\x33\x7b\xff\xd3\xfb\x7c\xbc\xff\xf5\xfd\xbb\xc3\xc6\xf9\xf8\xaf\xe0\xcb\xbb\x78\x33\x87\xbf\xe3\xee\x6a\x5c\x5c\x40\xe4\x08\xf4\x91\x03\x1c\x44\xc2\x0f\x9e\xb2\x61\x92\x65\xea\x52\x4a\xbc\xf6\x83\x3b\x32\x6f\xc6\x11\x08\xc5\xa1\xb2\x5e\x7b\xc5\x6b\xdd\x28\xaf\x8a\x3c\xa7\x75\xf5\x14\xa1\x0a\xd3\x30\xfe\xf8\x13\xb9\xa3\x27\x11\xba\x93\x7f\xb5\xaf\x92\xd9\xdd\xed\x03\xfe\xf2\xe6\x61\x1d\x75\x9b\x6b\xe3\x26\x46\x6a\xcb\x2a\xc9\x30\xec\xb8\x29\xac\x20\x38\x5b\x90\x72\x02\xe4\x31\xf1\xd5\x26\xbe\x7d\x12\x50\x88\x6f\xcd\xa5\x2f\xea\x02\xa0\x44\x0f\x46\x80\xc2\xf7\x0b\x92\x49\xb5\xf4\x60\xd3\x31\x0b\x35\xfd\x9b\x06\xfe\x6b\x67\x8c\x97\xde\xce\x3a\xce\x74\x0c\x5d\xbc\xfe\x55\xe7\x16\xe4\x80\x5b\x06\x00\xd7\x48\xe6\x30\x03\xe3\x85\xf1\xe2\xaa\xb4\x4e\x14\x30\xd7\x0c\xf4\xa1\x9e\xcf\xc2\x18\x26\xd1\xfd\x4f\xde\x90\xc7\x0f\xbf\x9e\xce\xac\x0d\xa5\x1c\x17\xf6\x97\x0e\x03\x77\x22\x12\x41\x9f\xda\xab\x48\x8c\x05\x23\x32\x3b\xce\x45\x7c\xf7\x3a\xc7\x1f\x5e\x67\x62\xf3\x53\x14\xa3\xa5\x73\x4b\x1b\x63\x4f\x70\x9c\xfd\xe6\x0b\x1d\x22\x01\xa6\x30\x96\x7e\xb7\x47\xd7\x3b\xca\xfa\x7b\x04\xdd\xf6\xa1\x0f\x05\x2a\x92\xec\x32\x25\x24\x2f\x97\xf9\x98\x7e\xbd\xd8\x64\xbc\x96\x47\x6e\xbf\x62\x7b\x0a\x5c\xb3\x0a\xfa\x3a\x64\x2a\xce\x8f\xae\x09\x74\xa1\x08\x44\xee\x89\xdf\x89\x98\x6c\xdf\xdf\xe1\xf8\xf6\xfd\xbb\xe3\xdb\xdf\xff\xe1\x63\xf1\xe5\xe6\x27\xf6\x5f\xc0\xf1\xc3\xfb\x4f\x61\x7f\x3b\x23\x3f\xf9\x2e\xbe\x64\xd7\x0b\x3a\x03\x4c\x60\x6e\x0a\xe3\x91\xaf\xe5\xa2\xf3\xd8\x0c\x23\x8c\x55\x4c\x64\x91\x4b\xa8\x2b\x59\xe4\x79\xaa\xd7\x20\x8e\x9b\x52\x97\x32\xcd\x54\x11\x81\x48\x1c\xd9\xfe\x99\x5e\x7d\x9a\xd7\x67\x7f\x3b\xd9\x08\x44\xfc\x50\xff\xfc\xdc\xe4\x42\xcb\x24\xbf\x8c\x09\x2b\xd1\x49\xd9\xda\x5a\xa3\x22\x10\xa9\x27\x72\xa7\x93\x69\xc7\x43\xff\xe1\xfb\x6a\xdd\x1e\x35\x1d\x5d\x89\x25\x4e\x9b\x8c\x54\xe7\x96\x2e\x53\x3a\x5e\xe4\xa5\x4e\x93\xe9\x2a\x61\x41\x3a\x78\x26\x98\xc8\x24\xf7\xa5\x17\x5a\x6b\xc0\xe3\x9d\x0f\x26\x8e\xf9\x6f\x9c\x73\x8e\x8a\x24\xbf\x4c\x09\x5a\xcf\x99\x09\x6b\x29\x8a\xc0\x91\x3c\xd1\xc0\x9d\xfe\xb7\x5b\x05\xf7\xd5\x9e\x78\x24\x0e\x1b\x94\xda\x0c\xd1\xde\xe1\x13\xff\xc7\x1e\xe3\x0e\xf6\xb2\x44\x3c\x4a\xe2\xf4\x09\xde\x35\x01\x67\xf2\x39\xf8\xb5\xbe\x3b\x3d\xf3\xce\xde\xbf\x7d\xfc\xf4\x6c\x79\x78\xf3\x02\xdf\x01\x53\x21\x4c\x3d\xdc\x0c\xb6\x1f\x76\xd7\xd9\xd3\x19\x9f\xfd\x14\x13\x9f\x81\x08\x94\xd4\xcf\x7e\xb6\x83\x6f\x38\xa0\xa3\xcf\x62\x3c\x5e\x60\x0c\x17\x09\x2c\xa9\x8b\x32\x89\x9e\x22\x2c\xa7\x81\xb5\x7e\x7c\x8a\x3c\x21\x40\xf5\xdd\x44\xb1\xef\xe2\x49\x56\x9e\x57\xa8\x3d\x09\x05\xf3\x56\x77\xc2\xa9\xf3\x3c\x8f\x5a\xcb\x4e\xd7\x59\x6a\xae\x95\xcd\x30\x52\x83\xa4\xcc\x70\xe1\x90\xae\x38\xc6\x42\xf8\x0b\xab\x29\xda\xf0\xa1\x81\x0b\xda\x9e\x64\x74\xdc\x31\x2d\x7f\x17\xf6\xe9\xbd\x32\xfe\xf0\xee\x74\xf7\x31\x0e\x5f\xd7\xa7\xe0\xfa\xf2\xac\xd2\xbb\xc6\x9b\x9f\xf7\xce\xc7\x97\xf5\xfe\xed\xfb\xb7\x1f\x77\xbc\xc3\x11\x92\x52\x97\x04\xcc\x16\x09\x93\x65\x19\x14\x85\xa2\x74\x34\x43\xc9\x95\x8e\x4b\xb5\xcc\x7d\x0f\xe8\x94\x2e\xdd\x7a\x3f\x2e\x2e\x3c\xfd\x24\xb5\x83\xb5\x2e\x7a\xe7\x91\x77\xfd\x30\x94\xbe\x0e\x5e\x4f\xeb\x6c\x1e\x67\x0a\x4a\x40\x63\xd7\x2d\x43\xa8\x19\xce\x75\x3d\xcf\x89\x90\x06\x5a\xb9\xcf\x13\x7c\xb2\x89\xbe\x45\x56\x3f\x35\x3c\x02\x54\x2d\x29\xeb\x34\x8b\x27\x6e\xa8\x2c\x14\x83\x65\xba\xd4\x7a\x99\x08\x98\xb9\xa7\xa0\xcb\x13\x5d\x08\xb6\xb8\x39\xb3\x99\x02\xf5\xd2\x2a\x6b\x80\xd3\x22\xf0\x29\xea\xa4\xb8\xa3\x27\x1e\x1d\x43\x3e\xf2\x8a\x4b\xf2\xb2\x87\xee\xdd\x8f\x4e\xe0\x06\xb1\xf8\xd2\x72\x01\x68\xfd\xd5\xba\x83\x36\xdf\x66\x45\x2c\x51\x27\x6e\x5b\xd2\xdb\x02\xce\x8d\x77\x43\x07\xc8\x38\x6a\x4b\x8d\x8e\x92\x9d\xcb\x2c\xa3\xbf\x0b\x38\xf1\x57\xcc\xae\x3f\x6b\x07\x1c\xd0\x4d\x1b\x0b\xfd\xd3\x86\x1a\x3c\xbd\xd8\x01\x93\xd4\xa5\x71\xb1\x8c\x79\x9c\x2d\x63\x11\xbb\x61\x18\x88\x0c\xbd\xce\xd2\x57\x54\xe9\x9e\x3f\x45\xa0\xcc\xb3\x33\x48\x33\xbf\x46\xfd\x75\x5e\x20\x8e\x14\x62\xc7\x8e\x32\x46\xad\xd5\xce\x38\xe3\x19\xa7\xb9\x2d\x30\xd0\x7d\x83\x41\x06\x88\x21\x44\xdb\x25\x73\x84\x8c\x42\x12\x25\x76\xdd\x4a\x1e\x9f\x4f\x79\xa8\x63\x46\x6f\x1e\x76\x24\x69\x00\x3a\x7f\xb9\xff\x78\xff\xe5\xfe\xf1\xcb\xc3\xfd\x43\x13\xa3\xb6\xae\x6d\xee\xcf\xbe\xa9\x98\x65\x97\x50\x4c\x38\xe5\x8b\xba\x18\xaf\xa1\x96\xcc\xe5\x71\xb7\xf0\x22\x81\x66\x0d\x2a\xc2\xeb\x26\x6b\x4e\x1c\x22\x96\xef\x5f\xf7\xf3\xf6\xc2\x41\x0b\xa3\x8d\x69\xdb\x34\x43\xe1\x3b\xaf\xaa\x0a\x5a\xfe\x14\x05\x61\xca\xfd\xa5\x25\x5a\x5f\x3a\x4b\xe3\x6e\x61\x45\x52\x85\xd7\x3e\x24\x1b\x7e\x50\x05\x76\xcc\x16\x9d\xed\x39\xc4\x1f\xde\x6d\x30\x9a\x1f\x18\x41\xaf\x45\xbb\x1b\x97\x17\x71\x2a\xea\x6e\xc2\x4f\xd1\xd0\xfa\xa9\x9a\x6b\x46\x2a\xcc\x06\xc6\xa4\x21\x5e\xc4\xc8\xfa\xc8\x98\x38\xf2\xd1\x49\x95\x04\x9b\x8b\x93\xd8\x12\x6b\xa8\xc1\x92\x2b\x8c\xc4\x84\x8d\x30\xf5\xf5\xb2\x0b\x79\x17\x80\xee\x9f\xd7\xfe\x74\x1d\xdf\xbf\x5c\xc7\xf0\x71\xfb\xd8\x8c\xe3\x08\xa2\xdc\x3b\x4f\x2a\x69\x8d\x1f\x43\xd1\xf3\xbb\x8f\x9b\xbf\xfe\xb4\x41\x23\x3c\x56\x41\xe3\x25\x0b\xee\x5f\xd1\x9b\x87\x5b\x37\x7a\xa7\x04\x1d\x5f\x41\x95\x6c\x92\x13\xbb\xae\xf8\x4b\xe3\xfc\xe4\x96\xe9\xa8\x1c\x77\xcc\x5e\x0b\xc3\x95\x75\xc7\xce\x42\xc6\xed\x42\xe3\x7a\x3d\x54\x3f\xe3\x73\x87\xa0\xbf\xb4\x64\xdc\xe3\x8e\x0d\xc7\xf5\xaf\xa2\x5f\x36\xec\xef\xe9\x2e\xba\x81\x32\xf7\x11\x7a\x7c\xe5\x34\xff\xeb\xfb\xc3\x68\xb3\x1c\xe4\x00\x53\xbf\xce\x75\xdf\x0b\x60\xce\x92\x58\x24\x1d\x28\x5b\xb1\x44\x49\x67\x7a\x25\x95\x1f\xbc\x3d\x49\x58\x96\xde\xf5\xae\x03\xd2\xbb\x51\x82\xd2\x72\x45\x24\x5f\x90\x6a\x5b\xa3\xcf\x03\x26\x7a\x30\x51\x14\xfd\x8b\x08\x3f\xe1\xc4\x9d\x54\xf4\x6f\x9e\x2b\xec\x9b\x63\xcb\xe7\x17\x8f\x92\xd3\xdd\xc7\xfb\x87\xfb\xf5\x6b\x0e\x62\x0e\xaf\xdb\x20\xeb\xfd\x9b\x1f\x01\x5c\x7f\x0b\xfe\xf0\xf6\xee\xff\xff\x01\x50\x93\xe5\xa0\x2c\x61\xb3\x68\x48\xba\xb9\x2a\x7a\x88\x30\xe7\x67\xee\xeb\xf5\x56\xe1\x52\x15\x68\x39\xeb\xb2\x52\x55\x1c\x55\x99\xca\x60\x05\x4d\x11\xd4\xc8\x15\xa7\xd7\x39\x6e\xa1\x99\x26\x46\x29\xf3\xcd\x30\x0c\xeb\x9a\xd8\x7b\xad\x5c\xe9\x54\x56\xfa\x73\x87\xa7\xbe\xe9\x8a\xbe\x49\xdb\x29\x3d\x6f\xfa\x3f\x09\xdd\xeb\xa9\x6f\x5f\xa2\xaa\x5f\xc0\x5d\x9c\x6c\x7c\xd6\xe8\xcd\xc3\x21\x05\xa5\x03\xd4\xf7\x04\x70\x35\x49\xe7\x3a\x09\x8a\xda\xcf\xc7\x14\x08\x6f\xac\x27\xbe\x92\xa0\x00\xe8\xca\x13\xe7\xc5\x68\x00\x8a\x8b\xe8\x14\xf2\xe9\x2e\x7c\x5f\xd9\x2b\x5c\xd4\xed\x5b\x8b\x6e\x50\xda\x67\x64\xd4\xe7\x17\x68\xd4\x66\x71\xf0\xa2\xf8\x71\xe8\x5c\x96\x03\x08\x28\xf5\x8d\xef\x9e\x22\x6f\x08\x18\xab\x98\x2e\x75\x62\x38\x2f\x8a\x12\xa1\xbc\x33\x9d\xe9\x9c\xeb\x3a\x40\x3a\xd3\x9d\x24\x2c\x72\x3f\x5b\xeb\x00\xf2\x73\x67\x40\x34\x5b\x7d\x6d\x19\x4b\x4d\x01\x2f\x1b\x8f\x05\x68\x9f\x1f\xb2\xd0\x42\xbb\x6c\x47\xa8\x99\xa1\x88\x05\xbf\xb2\xbf\xdb\x7b\x5f\xff\xdb\xa6\x47\x7d\xcb\xb2\x5e\x54\xb3\xfe\xf4\xe1\x47\x5e\xd9\x0b\x33\x72\x2b\x06\xac\x11\xdb\x9e\x06\xbf\xca\x3a\xe3\x16\x48\x58\x9a\xbc\x88\x91\x1f\x30\x86\xa5\x82\x15\xa3\x84\x11\x5f\x13\x89\xaa\x1c\x63\xe8\x25\x42\x82\xd3\xaa\x22\x0a\x21\x3f\x82\x19\x73\x70\xa6\xc8\xcb\x98\x04\xac\x6a\x93\x09\x33\xf0\x2e\x81\xd6\x2a\x55\x1f\x67\x42\x4b\x84\x94\x44\x65\x85\x30\x44\xa5\x2e\x91\x57\xbe\xe7\x24\x33\x39\x06\x05\x10\x55\xc9\x31\x2d\x0b\x4e\x10\x13\x92\x69\x0f\xb9\xef\xb9\x9f\x59\x2d\x34\xd5\xd2\x31\x6b\x36\x0d\xb8\x66\xf7\xdf\xf9\x8b\x67\x06\x4d\x50\xd2\x0c\xc3\xf9\xfb\x06\xf0\xba\x4f\xbc\x0b\x9d\xdf\x77\xbb\x25\xfb\xa1\xb7\x10\x38\x36\x2f\x9a\xd4\x23\x4e\x5d\x6a\xfd\x78\xb1\x45\x49\xba\x1c\x54\xa8\xf0\x13\x2e\x6b\x53\xd7\x27\x05\x95\x2a\xfb\x85\x79\x59\xe4\x95\xab\x26\x8a\x69\x32\x43\xa8\x41\x31\x0a\xe9\x86\x9b\x81\xc5\xae\x4d\x25\x13\x1a\xd6\xea\xe8\xcd\xad\x8e\x1c\xc0\x66\x71\xf2\xe5\x0f\xef\x3e\xbf\x79\x50\xb1\x2d\x84\x60\x0a\x13\x33\xb3\x8b\x74\x8d\x34\xba\xca\x7d\x7e\xca\x97\xd9\xcb\x6e\x90\xce\x7a\x37\xe8\x11\x18\x90\x81\x88\xf6\xc3\x00\x44\xe8\x75\xe3\x43\x71\x92\xa1\x73\xb4\x7e\xcb\xff\x6b\x14\xbd\xf9\xb8\x73\x57\x82\x93\xd6\xad\x4e\x1c\x36\xcb\x67\xe3\xcd\x67\x1e\xd5\xe3\xa7\xc7\xe3\xa7\x87\xb7\x37\x23\x81\xed\xc4\x44\x67\x41\x64\xdb\x76\x04\x3c\x08\xf0\x99\x14\xd4\x1e\x51\xef\x30\xc8\x88\xaf\x81\x4a\x7d\x0d\x98\xaf\x01\xed\xbb\x98\x3e\x45\x76\x0d\x54\x06\x6d\x25\x97\xe6\x38\x3a\xe7\x9c\x9e\xa9\x57\x54\xc1\x52\xfb\x9e\x6a\xd4\xeb\x12\x2a\x0a\x14\x9d\xa5\x94\xbe\x52\x4a\x2d\x69\x30\x20\xde\xfc\x80\x9f\x48\xf0\x27\xbb\xd5\xb7\xef\x5f\x0d\xcd\xe8\xd9\x17\xf5\x59\x0a\xf1\x0e\xfb\xba\x40\x92\x72\xea\x58\x2b\xbc\xe1\xd4\x8a\xdc\x8d\xd8\x6d\x46\x40\xa7\xea\xaa\xac\xa1\x5a\x68\xde\x4a\x05\xd2\x98\x2c\x04\x22\x43\x30\x3e\x39\x7d\x3e\x7b\x7d\x3e\x47\x49\x62\xc3\x7b\xfe\x96\xfe\xe2\xbb\xdf\xd4\x5f\xbc\x4b\xbd\x2c\xb1\x16\x8a\xb7\x72\x96\xfe\xfc\x14\x55\x4d\x67\x8b\xce\x9f\xb1\x8b\xe1\x32\xc4\x70\x93\x5f\x64\x9a\x1b\xa9\xb4\xad\x81\x04\xf8\xb7\xe4\x17\x83\xff\x01\x0d\xb5\x9f\xdf\x85\xcf\xfb\x7e\x53\x09\xba\x55\x98\xdf\x7d\xe7\x91\xf8\xf9\xd3\xb6\xa9\x25\xaf\x4a\x01\xb1\x03\x73\x51\xd6\x55\x1e\x57\xdf\x20\x4f\xce\x9e\xbc\xc8\x55\x30\x17\x37\x0b\xa9\xb4\xab\x55\x9f\xa8\x56\x58\xde\x1c\x1d\x23\x25\x17\xd6\x2d\xad\xcf\x24\xcb\xea\xbc\xac\x40\x6f\x41\xee\x23\xe2\xfb\x46\x0e\xd3\x30\xd3\x79\x0c\x58\x69\xb4\xf7\x97\xd7\x8c\xf8\xe3\x0d\x9b\xf5\x5d\x37\xea\xd5\xec\x3f\xde\x22\x82\x9b\x6a\xc1\x16\x11\xfc\xba\x93\x55\xe3\x0e\x0c\x76\xef\x01\x0c\x31\xf6\xb0\xd3\x7a\x14\x7d\x3c\xcc\x9d\x68\x47\xdf\xd7\x15\x8e\x53\x66\x2f\xa0\xc4\xde\xf9\xb3\x9f\xbd\xc2\x80\x9e\x15\x67\x42\x00\x8e\xa5\x35\xc4\xc3\x7c\x53\x4d\x37\xa6\xf1\x0e\x37\x56\x68\xa3\xac\xaa\x65\x51\x32\xaa\x3b\xc5\x91\xc3\xd6\x61\x57\x09\x2a\x31\x92\x3d\x5b\x23\xf9\x6c\x5d\xfb\xc0\x65\xd7\x02\xf8\xfb\x1d\xcb\xb4\x79\xcf\xff\xbf\x5a\xfb\xfe\xf0\xff\xb0\xf8\x09\x60\x60\x69\xf3\x32\x66\xbe\xc5\x14\x96\xba\x42\x9c\x53\x4e\xbd\xc2\x1a\xe3\x82\x52\xe8\x35\xc2\x42\xd0\x0a\x51\x84\x08\xf2\x5d\x1c\x09\x1e\x63\x41\x3c\x8f\xc5\x62\xd6\xa3\x94\x6e\xe4\x7d\x22\x9c\xd5\xaa\x39\xb6\x8c\x15\x84\x68\x4d\x2b\x84\x69\x45\x4a\x03\xb1\x2f\xbd\xe2\x34\x5f\x57\x3f\x0e\x7a\x04\x39\xe5\x10\xf2\xb2\xa2\xbc\x13\xaa\x59\x06\x19\xec\x58\x58\xa7\x0d\x77\xba\xe5\x8d\xdb\x7a\x91\x81\x5b\xfb\x57\xeb\x5a\x73\xeb\xcf\xfd\xfe\xee\x35\xdd\xf4\xfe\x31\x4e\x3e\xfc\xf2\xe6\x51\x81\xaa\x44\x8e\x94\xc3\x3a\xc7\x45\xca\x34\xa2\x39\x47\x65\x5a\x8e\xb0\x36\x63\xda\x1c\xb1\x16\x95\x59\xcf\xee\xea\x9e\xa2\xdc\xe6\xa4\x8d\xcb\xc5\xf8\x9a\x81\x21\xa9\xa2\x38\xa9\xf6\x3d\xf7\x5f\xdc\x9c\xd3\x6f\xb4\xa2\x17\x59\xc6\x5f\x8e\x77\x7f\x8a\x93\xbb\x75\x46\x1d\x3f\xdc\xff\x7a\x10\xb6\x28\xe3\x76\x89\x88\x50\x53\xdc\x56\xca\xe5\x85\x11\xdc\x39\x06\x22\x31\x4e\x65\xa7\xd4\xba\x6b\x00\x7d\x92\x90\x11\x5b\x4b\x06\xd2\xd6\x54\x55\x63\x89\x92\x9a\xf8\xcb\x59\x0f\xa0\x07\x1a\x5e\x7b\x88\x8c\xa5\x87\x02\xed\x9f\x99\x9d\xc4\xce\x55\x0a\xd8\xdb\x97\x52\xce\xe7\x37\x8f\xa1\x09\xf0\xe6\x31\xd4\x1e\x66\x04\x41\xea\x59\x0a\x14\x86\xb6\x42\x05\x46\xa8\x2c\x2f\x79\xaf\x38\x4b\x2d\x28\xcb\xea\x24\xb4\xb3\xfe\xb2\xe4\xa3\xcb\x5d\xae\x63\xb7\x28\xdf\x8a\x06\x8c\xb1\xb0\x5b\xbe\x13\x74\xaa\xf9\x09\xee\xe8\x84\x50\x41\xfe\xae\x5c\x18\x26\x6d\x10\x6e\x3a\xa4\xbe\x82\x31\x76\x57\xe7\x40\x9b\x67\x9e\x07\x0e\x03\x0e\x5d\x28\xb8\xe0\xf1\x5a\x4b\x99\x50\x2e\x2c\xd0\x5f\x3b\xd0\x44\x71\x24\x9f\xaa\x3b\x0d\x4c\x40\xf9\x07\xdf\xd9\x3f\xd3\x37\x95\xc7\x3c\x08\x8f\x60\xae\x65\xa1\x74\xf9\x75\x06\x8d\x53\x5c\x1a\x90\x29\xa5\x2d\x5f\xf3\x46\x2a\xca\x8a\x08\x5a\x45\xd1\x29\x92\x60\x9d\xdf\xfa\x95\x23\xdd\x96\xc9\xde\xfa\xca\x9b\xde\xef\x46\x55\x7a\x5d\xf9\xbe\xc9\x4e\xde\xff\xe1\xf0\xd7\xe0\xee\x61\x73\x1a\xf8\xfc\xe5\xfe\x31\x51\x02\x03\xcc\x90\xa6\x20\x5b\x5c\x19\xe7\xdf\x7a\xa0\x8a\xe5\x0c\xaa\x0a\x91\x5b\x4d\x74\x3d\x96\xda\x08\xa6\x54\x06\x38\x05\x39\x18\x63\x8a\x16\xe1\xad\x1f\x15\x97\x4c\xf2\xfe\xa4\x29\xa3\x8c\x70\x45\xd7\x80\x99\xaa\xaa\x5a\x66\xea\x2f\xeb\xff\x09\x24\x42\x4a\xea\xc7\xa5\xc1\x95\x42\x84\x31\x8b\x10\x18\xd6\x39\x1e\xf1\x18\xdf\xb5\x27\x13\xfd\x12\xbd\x8b\xfe\x5b\x44\xa2\xff\x19\xd1\xe7\x11\x1f\x88\xf4\x9b\xe7\xd4\xe3\xf1\xe3\xe7\x2f\x0f\xef\xbf\xf7\x1f\x79\x65\x5b\x55\xbc\xb2\x9e\xff\xf4\x70\xf7\x5d\xe9\xf9\xed\xe3\xfd\xbb\xe0\xc5\xf4\xe9\xc1\x81\x2a\xcb\x65\x99\x03\x2e\x8a\x72\xbe\xf2\xa9\x12\xa0\x6a\x8a\xdc\x4f\xb1\xd1\xeb\xaa\x1b\xf3\xc5\xdc\x8a\xce\xeb\xdc\x86\x33\x28\x49\x2a\xf2\xf5\x93\x0e\x34\x66\x8b\x91\x8c\x12\x5e\x18\x5c\x2d\x17\xad\xe3\x74\xb9\xac\xc7\xa9\x2c\x8a\x12\x56\xbc\x82\x52\x72\x0e\xab\x0e\xb1\xea\x29\xaa\x68\x45\x10\xc9\x8a\x34\x2b\x4b\x5a\x42\x12\x43\xe4\x3c\x22\x38\x95\x29\x4a\xfb\x98\xd5\xd5\x80\xd6\x75\x2e\x60\x82\x8e\x30\xfa\x5d\xf4\x31\xfa\xef\xe1\x0a\xfc\x9f\x51\x04\x9e\x3d\x32\xff\xec\xa7\xfe\x4f\x60\x0f\x81\x6e\x6e\x5d\xef\x6f\x1e\x5d\xdb\x82\xf1\xf9\x27\x9e\xce\xbb\xdb\x68\xe8\xcf\x59\x66\x8a\x1c\x14\x0b\x4e\x52\x13\x1c\xdf\x66\x9f\x83\x6e\x33\x18\x06\x83\x87\x50\x59\x54\xa6\x2a\xa7\x7e\xc4\x86\xae\xff\xea\x07\x9d\x16\xf5\xd5\x9c\xf3\x5c\x56\x79\x9b\x4d\x9c\x55\xa8\x60\x10\x79\x6d\x4c\x40\x9e\x49\xaf\x0f\x0d\x2c\x20\x42\x72\xc6\x9c\xfb\x86\xf1\xf5\xbf\x12\x16\x05\xac\x24\x24\x34\x29\x85\x82\x25\x54\xaa\x2a\x4b\x84\xcb\xa7\x68\x81\x84\xe4\x2a\x43\xd4\xcf\x09\xbf\x48\x5f\x8b\x28\x89\x8b\x50\x87\x92\x41\xa9\xf0\x3f\xbc\xaa\xae\xfe\x40\x85\x09\x31\xd0\xb3\xb7\xc7\xe6\xeb\x31\x81\x3e\x88\xe7\xa7\x31\x5e\x86\x0b\x60\xd4\x9b\x73\xe3\x21\x05\x83\xf2\x30\x8e\x52\x5f\x59\x8e\x0d\xe6\x89\xae\xa9\x30\x72\x53\x7d\xb3\xbe\xac\x2a\xeb\x95\x6b\x06\x60\xbc\x39\xdb\x0b\x40\xb6\xaa\xc0\x48\xeb\x1e\x0d\x0e\x55\x93\x23\x6d\x74\x08\x9e\x47\x2e\xf0\x4a\x37\x2e\xde\xbe\x4a\xdd\x90\xf4\xcf\xea\x69\x5b\x8d\xf0\xdd\x56\xf1\xdb\x2a\x70\x5f\x5e\x77\x07\x1e\x0f\x13\xa9\xe2\x6c\x61\xda\x02\x08\x70\x85\x74\xc3\x4d\x11\x40\xdf\x65\x67\xbd\x89\xa3\x12\x4d\x36\x75\x8d\xaa\x75\xac\x6c\x81\xd2\x22\xb5\x39\x33\x02\xfb\xce\xda\x93\xe2\xca\xf8\x8b\xca\x2a\x4a\xe8\x30\x13\x8c\x50\xae\x0c\x48\x0d\xa3\x57\x56\xf8\xda\x1b\xad\x14\x80\xa0\x58\x1c\xca\x72\x85\x1a\x82\x45\x2c\xaf\xdd\x96\x5f\x89\x27\x1e\x6a\x83\xff\xb4\x36\xd3\xf1\xc3\xfb\x70\x04\x6d\xa6\x81\x0e\x67\xd0\xe7\xbe\x88\x8b\x6c\x19\x2a\x69\x49\x66\x4b\x3d\x8d\xd2\xf7\x05\xa0\x7e\x2a\x00\x52\x9a\x80\xe6\xc4\x25\x46\xbe\xe7\x56\xf8\x41\x58\xb9\x46\xd4\x48\x57\x3d\x23\x1c\x28\x64\x30\xa8\xb0\xc5\xa0\x2a\x72\x83\x82\xe6\xe5\xc6\xb7\xf9\x37\x61\xb5\x5f\x57\xaf\x64\xbd\x94\xe0\x43\xf4\xe6\x11\xfc\xf2\xe6\xee\xc3\xe9\xf8\xe1\x97\x37\xef\xe2\x64\xdd\xc6\x13\x07\xd2\x2c\xad\x8b\xb8\x5c\x3a\xe1\x07\x05\x20\x39\x27\x91\xe5\x0e\xcd\xfe\x0c\xad\x76\xca\xb6\x16\xe1\x23\xb2\x2e\xf5\x83\xbd\x76\xcb\xc4\x63\x14\xb7\x0b\xf2\xb3\x6f\x71\xcf\x2a\x03\x78\x6c\xaa\xa5\xf5\x0d\xac\x8c\x0e\xf8\x46\x17\xfc\xaf\x7e\xb7\xa9\xb1\xbf\x79\xc5\x44\x88\x93\xbd\xfc\xb2\xfb\xb7\x0b\x50\x14\xd0\xe0\x02\x64\x4b\x09\x2e\x0e\xf3\x36\xf7\xa3\x77\x55\xe3\xd4\x53\x54\xe5\x26\xab\x8e\xc8\x48\x68\x6a\xcb\xa0\xcf\xbd\x45\x5a\x31\x57\x42\x30\x00\xe7\x8d\x57\x25\xb0\xa1\x40\xb1\xbd\xa7\xf8\xe7\xbe\x67\x55\x56\x16\x97\xa0\x58\xa2\xb8\x70\x44\x4c\xb9\xef\xbc\xac\xba\x5a\xfb\x19\xe5\x26\x43\xbf\xfd\x9e\x67\xa0\x5e\xbf\x27\x08\x7a\xa6\x76\xd7\xa8\xbb\xcd\xa3\xc7\xfb\x87\xa4\x06\xce\x81\xc6\x13\xe7\xd9\x21\x5d\x57\xba\x40\xf0\x8f\x9e\xcf\xf3\xe6\x75\xf1\x17\x3f\x9e\xe7\xe7\x9f\x4e\x74\x63\x66\xa0\xeb\x18\x23\x87\xb5\x92\xb9\x6f\x3c\xab\xfa\xc6\xf8\x11\xe7\x26\x7f\x7d\xa6\x95\x17\x45\xb9\x9f\x6a\x0b\xda\xd7\xa7\x1a\x81\x08\x3f\xe1\xd8\x6e\xb9\xff\x4d\xe7\xf2\x6d\xd0\x09\xba\xd1\x1c\xc5\x64\x8c\xe1\x84\x13\x83\xa8\x68\xaa\xee\x18\xad\x4b\x8e\x11\x4a\x98\xfa\x5a\x24\xcd\xa5\x16\xa0\x02\x62\xfd\x0c\xd5\x13\x49\xa2\x93\x79\xc9\x1c\x9f\x61\x1e\x1f\xc3\xda\x78\xff\x70\xff\x22\x8b\xfd\xe1\x3e\x38\xf3\x7e\xfc\x94\xbc\xfd\xf8\x09\x18\x93\x65\x5a\x0a\xc6\x99\x6c\xa1\x2e\x72\xeb\x0d\xa3\x54\x0a\xac\x72\xed\x18\xe4\x13\x9e\xa6\xe9\x64\x60\x59\x28\xa3\x8c\xe8\xb5\x2c\x31\x5d\x90\xb7\x15\x92\x58\x3b\x5c\x71\xca\x0f\x14\xb2\x8b\x97\xd6\xae\x59\xff\x9a\xcb\x9a\xe0\x4b\x6f\x76\xed\xbf\xff\xf1\x4a\xfb\xef\x16\xc6\x7e\xfc\xfb\x2f\xef\x4e\x8f\xff\xfe\x56\x97\xbb\xfb\xf0\xe5\x4f\x1f\x3e\xbe\xd2\xfe\xfb\x33\xcf\xbb\x49\xff\x9d\x22\x5c\xaa\x12\x81\x73\xb6\xb4\x10\xd9\x60\x11\x82\x8b\xcc\x14\xce\xb6\x8d\xbf\x90\xb9\x21\x70\xcc\xdb\x22\xb7\x79\x31\xa0\x52\x15\x28\xce\xb3\xe5\x52\x22\x2b\x99\xb6\x02\x95\xb9\x2e\x6a\x55\xaf\x4f\x3d\x77\xb4\xf0\x5d\x0e\x8a\x32\xb7\x79\x79\x32\x08\x63\x5c\x49\x5d\x31\x4c\x29\xe3\x98\x2b\x38\x35\x8c\x68\x44\x98\xcc\x74\x26\xa4\x64\x8b\xab\x2a\x82\x2a\x6e\x30\x67\x5c\x08\xc5\xb5\x2a\x2f\x13\x67\x9a\x72\xcb\xa0\x81\x4c\xc0\x50\x47\x3d\x26\x6a\xf7\x79\xdf\x6a\x74\xcf\x75\xf8\x17\xd9\xc9\x2f\xdf\xcb\x4e\xfe\x15\xf8\x4e\x76\xf2\x27\x39\x9d\x5a\x53\x0b\x7d\xe3\x0d\xac\xa5\xe5\x7c\x3c\x97\x55\xd5\x5a\x61\x1a\x2f\x35\xb7\xc2\xcc\x2e\x2f\x40\x63\x48\xdd\x93\xa9\x6d\x2f\x78\xb6\x0c\x13\x2a\x2f\x8a\x0a\x81\x7c\x13\xd4\x26\x65\xb5\x89\x4d\xce\x22\x88\x4d\x4a\x61\xa5\x13\xf8\x37\xc4\x26\x0d\xb6\x95\xe0\x9a\x62\xd5\x43\x23\x64\x17\x1d\x12\x1d\x72\x50\xb9\xeb\x81\xc1\x50\xa3\xf8\xe5\xdd\xdd\x9f\x92\xf8\xee\xc3\xaf\x6f\xff\x8c\x22\xd8\xe3\xeb\x1c\xe4\xc8\x5c\x31\x5c\xe8\x3c\xba\x49\x80\x02\xf4\x61\x2b\xc5\x12\xa3\x82\x92\xc2\x0b\x60\x6c\x2e\x64\x2d\x5c\xac\x94\x92\xc2\x9e\x64\x41\xfd\x54\xdb\x1a\x94\x7e\x6e\xe4\x3c\xd9\xc9\x2c\x33\x27\x99\xcd\x31\xb8\x98\xc9\x63\x36\x1b\x23\x3a\x33\xc8\xae\xdb\x38\x6d\x74\xf7\x06\xf9\x87\x1b\x17\xe4\xfe\x63\x9c\x04\xa7\xa4\x3f\x6c\x4e\x49\x7f\xf8\x91\x3d\xfb\x18\x2c\xde\x5f\x9d\xf5\x1e\x2c\x6e\x3c\xe3\x5b\x37\x1b\x13\x3a\x67\x69\x30\x46\xea\xb2\x1c\x41\x43\x65\x09\x37\x2e\xad\x20\x4c\xd1\x9a\x55\xf9\xd9\xc2\x9e\x70\x82\x0b\x42\x10\xa5\x48\x89\x69\xaa\x2b\x10\xc5\x9a\x23\x5d\xf1\x13\x57\x65\xe1\x0d\x88\x00\x5e\x5a\x3b\x8f\xa6\xab\x7c\x3b\xcc\x84\x16\x7e\x00\x91\x60\x52\x5b\x90\x03\xe1\x67\x6c\xb8\x27\x92\x66\x2e\xa7\x80\x14\xa5\x85\x10\x50\x0b\x10\xb4\xb0\x34\x2d\x6a\x6c\xc0\xce\x4f\x4f\xe8\x8e\x9f\xc4\x1e\x1b\xef\xee\x17\x3f\x4a\x2d\x7d\x4e\x76\x22\xf0\x91\xd4\x45\x05\x7a\xce\x11\x2b\x15\xc2\x8b\x35\x20\x43\x01\x06\xa8\xb5\x3e\x89\x52\x8a\xaf\xed\x86\x63\x3b\xe8\xaf\xf2\x54\x68\x0f\xaf\x4e\xc6\x9b\x37\x78\xa2\x9f\xf0\x1d\xfb\xe7\xfb\xcf\x30\xca\xa8\x2c\x1d\x29\x17\x6a\xe7\x35\x62\x84\xc1\xcd\xdc\xda\x9f\xfd\x67\x4c\xbf\x60\x0d\xea\x08\x24\x3c\xe4\x65\x74\xe3\xbe\x6e\xbd\xe0\x5b\xf4\x13\xed\xd1\xcf\xf1\xc3\xaf\x77\x05\x1e\x27\xd0\x79\x26\xd7\x70\xa7\x33\xcc\x77\x12\x70\xe8\x25\x30\xa9\x77\x55\x9c\x9e\xa8\x46\xa5\xc7\x76\x69\xc6\x7a\x00\xb3\xaf\xce\x0a\xa4\x31\xb6\xb0\x5c\x2f\xe0\xde\x83\xd5\x11\x4e\xe6\x13\xda\x38\xe6\x11\xd8\x93\xe7\x5b\x44\xb3\xb9\x92\xc5\x77\x9f\xbf\x24\x99\x7b\x8a\x7c\x3f\x36\x65\xa5\x05\x31\x59\xee\x27\x5f\xc3\x50\xc8\x9d\xad\x33\x63\xad\x0e\x4d\xb5\x8c\xbe\x81\x90\x33\xd4\xcd\x68\x8d\x8a\xcd\x04\x28\xcc\x1d\xc8\x40\x0f\x3d\xbd\x64\xf9\xc6\x01\xbd\xc5\x53\xbf\xec\xd9\xd7\x4b\xb5\x77\x2b\xf5\xee\x82\xb4\x0c\x14\x16\x10\x3f\x10\x90\x8b\x41\x90\x8b\x04\x30\xf7\x73\x2c\x03\x2b\xe3\x40\x62\xb8\x0c\x76\x51\xde\x68\x50\x82\xde\xa7\x17\x01\xaa\x78\x88\x95\xb2\x38\xf8\x64\x81\xa3\x08\x58\xc0\x28\xf0\xdc\x1e\xef\xbf\x63\xec\x7c\x3a\x4d\xa3\x8d\x53\x82\x2b\x52\xd0\xb2\x3c\x8a\x7f\x1c\x4f\xed\xb7\x8a\xd2\xcc\x66\x30\x8a\x0e\x11\x7f\xc2\xc9\x25\x60\x7c\x1e\xc2\xca\x1d\x81\xf7\xeb\x54\x39\xde\x2e\x50\xb8\x3e\x37\xb3\xca\xef\xb9\xd0\xa1\x88\x8e\x40\x44\x88\xbb\xf8\x4b\x5f\x17\xa5\x12\xd8\xc0\x35\x24\x81\x4d\xed\x5c\xd9\xab\x5a\x00\x45\x4a\x57\xe0\x65\xb6\x39\xb5\x14\x58\x5c\xc3\x43\x59\x68\x5b\xf9\xe2\x52\x42\x82\x51\x37\x63\x4b\x2b\xe3\xce\x65\x66\x27\x20\xa1\x6f\xaf\xac\x1e\xe1\x58\x17\xe5\x53\x34\x91\x71\x1c\xa7\xfc\xd2\x3d\xcf\x73\x16\xc6\xff\x5f\xfc\x84\x84\xf8\xf2\x79\xef\xa6\x6d\xd7\xb4\x75\x25\x8a\x05\xae\x06\x6e\xca\x9e\xb2\x1c\x2e\x33\x13\xf2\xdc\x48\x62\x89\x3c\x89\xc2\x9a\x6f\x53\x40\x40\x88\x31\xa1\xb5\x10\x20\xf5\xbc\x19\xf1\xd4\xac\x63\x3f\x7a\x42\x41\x03\x2b\x8b\xfe\x72\x67\xa9\xec\x55\xa4\x0f\x9f\xbf\x3c\xdc\x85\xca\xc1\x6b\xdb\xd3\x2d\x50\x78\x1f\x18\x48\x07\x64\x0a\x18\x9f\x11\x95\xa8\x58\x34\x29\x89\x9a\x40\xe5\xb0\x50\x3c\x57\x2a\x07\x1d\x2f\x6c\xc9\x97\xd6\x94\x8d\x6d\x4e\x12\x6a\xa5\xad\xa6\x9c\x76\x54\x70\x40\xba\x6f\xf3\x8e\x3f\xb9\xf8\x35\x92\x03\x1c\x54\x65\xe9\xb5\xef\x08\xc0\x41\x77\x14\xdf\xd1\xc4\xdd\xb4\x28\xbf\x77\xda\x7d\x13\x28\x37\xb4\x69\xb4\xc6\xa2\x50\xb4\xaa\xa6\xde\x2b\x9b\xb8\x20\xc0\xa1\x74\xee\x8a\xaa\x5a\x03\xe7\x6b\x75\x08\x9c\x9d\x43\x64\x9e\xf0\x81\x24\x2e\xfa\xe5\xb6\xa2\xbc\x79\xd8\x94\xb7\xef\xde\x3e\x7e\xda\x1a\x74\x8f\xc7\x5b\x8e\xfd\xfe\xd3\x43\x9d\x58\x85\xaa\xdc\x58\x3f\xfa\xa6\xa0\xc4\x80\xf2\x45\xd4\xdb\xd7\x89\xd3\x4b\x93\xa5\xba\x38\x0f\x55\xe9\xd2\x2c\xae\xb5\xf6\x4a\x79\x0e\xc5\x36\x07\x69\x32\x84\xbd\xe4\xe1\x16\xaf\x84\x41\x76\x08\x3a\xd7\x77\xaf\x75\x45\xd7\xb0\x3c\x9e\x14\xe5\x76\x18\x1b\xce\x05\x48\x41\x41\x05\xb7\x0e\x10\xc0\xa9\xcf\x7d\xed\x89\xc7\x04\xb4\x20\x77\x8a\x4b\x01\xe0\x49\x32\x04\x09\xc2\xac\x2c\x04\x32\x16\x41\x8a\x49\x61\x31\x97\x48\x57\x18\xe1\xb2\xb4\x78\x3b\x07\xf6\x44\xe2\xe6\x30\x7d\x8f\x81\x8f\xe2\xdc\x62\xe6\x28\x23\x00\x1e\x26\xd8\x77\xd7\x32\xee\x14\x77\xc1\x3c\x7b\xe3\x4c\xaf\x39\x45\xfe\x5c\xb9\x79\x8c\x93\x67\xaa\xfe\xba\x9d\x84\x6a\xc4\x97\xcf\x6f\x1e\xfe\xf0\xcb\x91\x32\x08\x1a\x8d\x26\x07\x72\xee\x67\xd7\xfb\x91\x83\xb2\x1b\x88\x06\x1d\x24\x03\xa3\x95\xcf\x4b\x71\xe2\xa6\xb6\x3e\xf2\x75\xd3\xe9\xb6\x1d\xad\xd1\x13\xc0\x71\x66\x8d\xfc\x66\xeb\x1a\xc8\xb3\x1f\xb7\xef\x88\x3e\xe1\xc4\x04\x5d\xde\x1b\x26\xeb\x73\x70\x8c\x4d\xfe\xb9\x13\xb4\x50\x9c\x60\x3b\x5d\x1a\x5b\xe4\x8a\x21\x57\x3c\x45\x7e\x2c\x9d\x35\xb6\x68\xa5\x15\x80\xe0\xd2\x94\xc8\x43\x93\x53\x4d\x80\x42\xb6\x3c\x14\x59\xbe\x4e\x50\xe8\xcf\x25\x24\x64\x9d\xa1\x86\x42\x5d\x9f\x8b\xdc\xcc\xeb\x0c\x6d\xae\x3c\x34\xed\xf3\x75\x86\xe2\x69\x1c\xe7\xec\xd2\xed\x1e\x72\xcd\xae\x95\x06\x77\xc5\xe3\xd7\x3e\xd2\x9b\xf8\xcc\x1f\x6e\x09\xee\x2e\x3a\x73\xff\xf1\x66\x2c\xbd\xd7\x2f\x0b\x90\xdb\xf0\xbf\x9f\x5b\xcf\x83\xf4\x3a\xd6\x00\x53\x6f\xac\xf6\x14\x01\xc9\x3c\x03\x43\x9e\x7a\xd9\x6e\x06\x32\x7e\x6e\x63\xbd\xc8\xf5\x38\x4e\xd6\x5a\x6b\xec\x22\x30\x36\x03\x71\x12\x94\xbe\x25\x9a\x0d\x06\x91\x38\xd0\x99\x98\xf2\x2a\x70\x06\xc0\x81\x04\xad\x1c\x19\x10\x4e\x1f\xef\x7f\x7d\xf3\x2e\x7a\x71\x02\x89\x37\x27\x90\x03\x71\xa0\xb8\x70\x3f\xfa\x1a\xe9\xa9\x84\xa9\xcb\x30\xf6\xdd\xa4\x4f\x72\xc9\x3a\x10\x19\x3f\xf5\x0b\xcf\x8b\x12\xce\xd0\x8f\x08\x61\x1a\xea\xf6\x28\xf4\xa5\x6f\xc8\xcd\xa0\x80\xf1\x9b\xed\x82\x35\x8f\xde\x8b\xf7\x47\x84\x4a\xc0\xbd\x5a\x03\x56\x6e\x8c\x1a\x85\x87\xa2\x75\xb2\xa8\x67\x02\x78\x51\xf1\xbd\x82\xaf\x84\xbc\x0e\x46\x12\x25\x15\xae\xa5\x01\x10\x5c\x96\x1a\x05\xaa\xd9\x29\x62\xc4\x77\x7d\xef\x9b\xbe\x8f\xa2\xdf\x05\x8c\xb8\xfd\x41\x6f\xf0\xdf\x45\x7f\xb3\x79\x8a\xbe\x76\xac\xdb\x48\x49\x0f\x6f\x83\xc8\xee\x27\x70\x2b\x98\xdf\x54\xd0\x1f\xc3\xc9\x27\xd1\x21\xba\x46\xe6\x95\x81\xd6\xb7\xca\x0e\x03\x60\xa3\x19\xbe\x4d\x07\xad\xce\x35\x80\xa5\x17\xe7\xb3\xef\x19\x48\x3b\x6b\x29\xc8\x54\x37\x89\x13\x59\x46\x80\x43\x0f\x6c\xdd\xc5\xeb\xa0\x10\xaf\x44\xa3\xaa\xd4\x66\x82\x95\xa6\xa8\x68\xab\x08\x13\x6b\x3e\x37\xaf\xd7\xee\x30\x3f\x3b\xde\xef\x5a\x53\xc9\xb3\xde\xef\x41\x5f\x2c\xc0\x17\xd5\x91\x56\x5b\xd1\xf1\x41\xd6\xc9\xbc\x91\xf0\x69\x57\x0f\x40\x5f\x5d\xc2\xbc\x99\xf5\x05\x98\x08\x00\xb5\xae\x71\x87\x39\xac\x99\x0f\x2f\x39\xd7\x4d\x40\xf8\x97\x37\x8f\x60\x02\x91\x1d\x06\x2e\x04\xac\x2c\xb1\x72\x22\xc3\xfe\x82\x92\x6b\x8e\xd1\x52\xc5\x97\xa7\xa8\x5b\x17\xa1\xbd\x0f\xcf\x9e\x68\x32\x3d\xcf\xc9\xe7\xea\xe7\xfd\x8b\xd2\xd3\xb6\xbf\xaf\x97\xf7\x35\xb5\xb6\x06\xe5\x46\x1d\x14\x5e\x65\x83\xe5\xd6\xca\x33\x05\x39\xf2\x0d\xe0\x7e\x8c\xb9\xa9\xb0\x26\xbe\xa2\xa5\x29\xe9\xd1\xcc\xb3\xf5\x25\xb6\xa4\x69\x4c\x6f\x7c\xdf\x6b\x10\x01\x66\xe3\x82\xc0\xd1\x92\xda\xda\x0e\x76\x6e\xc3\xea\x91\x7d\xde\x85\x5a\x2c\x78\xf8\x7c\xff\x31\xbb\xdb\x22\x8d\x28\xd9\x2c\x36\xf6\xea\x68\x04\x5c\xe6\xb2\xb8\x5a\x2e\x1c\x8c\xd2\x0b\x47\x7d\x26\xe2\xb4\xf2\x22\x41\x86\x5a\x6c\x0e\xe4\x0c\x2a\xdf\x9f\xed\x62\xbc\xb5\x80\xc4\xb9\xcf\xbc\x51\x80\xc7\x2a\xe6\x7a\xcd\x10\xa2\x28\x09\xbd\x66\xb9\x6b\x1c\xfd\xe7\xef\x70\x63\x37\x61\xa3\xef\x51\xfe\xa1\x6c\xfb\x22\x0b\xf0\xe5\x21\x3e\x7e\xf8\xfc\xcb\x2e\x37\x35\xa2\x32\x2e\xbf\xa5\x71\x51\x40\xc3\x11\x80\xb8\xaa\x61\x05\xa0\xbb\x66\x0e\x50\x88\x40\x57\x95\x71\x71\xbd\x64\x71\x9f\x9a\x9a\xb6\x45\xcf\x11\x4a\x97\x81\xf8\x5a\x4e\x6d\xee\x4d\x8c\x8b\xf2\xa4\x31\x33\x06\x55\x7e\xe4\x92\x0b\xc8\xb0\x3f\x6b\x0d\xd6\x99\xda\x10\x6a\x6a\x2f\xc6\xc2\x15\x62\xf0\x53\xa7\x24\x28\x2e\x06\xa1\xe7\xb5\x35\xfd\x61\x6d\x7d\xf3\x6a\x69\xfd\xd3\x77\x4e\xdd\xb7\x84\xf6\xd5\xda\x9a\x71\xa2\x75\x37\x28\xf1\x7f\xb3\xf6\xf7\x40\x92\xe3\x7c\x9e\x18\x4c\x90\xf9\xc1\xbd\x7d\x63\x97\x35\x3d\x3d\xcd\x67\xe3\x9e\x7d\x58\x6f\xcd\x4c\xf3\xe2\xee\x14\xbc\xab\xeb\x6e\x48\x17\x7b\x82\x4e\x17\x17\x90\xe2\x14\x01\x29\xce\x40\x28\x64\xd0\x52\xc0\x84\x09\x13\x26\x4c\x98\x30\x61\xd2\xa4\x49\x93\x26\x4d\x9a\x69\xd2\xa4\x99\x26\x9f\xa9\x24\x52\x41\x90\x59\x95\xdd\x33\xf3\xec\x9e\x42\xdd\xc5\xcc\x8c\x9a\x9e\x24\xc1\x0f\xe0\xff\xf1\xfb\xc8\x52\x41\xa1\x4c\xd2\xee\x9c\x6b\x29\x65\x66\x98\x2e\x41\x0a\x53\x99\x16\x8e\xcb\x04\x4b\x0c\x48\xa1\xf2\x5d\x16\xa7\x20\x2f\x5c\x7a\x0d\xb2\x1c\x42\x68\x5a\x84\x10\x2d\x64\x3d\xe5\xa9\x1a\x81\x2c\x9c\xbd\x18\xa1\x72\x25\xe2\xcc\x4d\x03\x1a\x86\x75\x6a\x0d\xa2\x50\x6d\xbd\xe2\xef\x37\xaf\xea\xaf\xad\x05\xd7\xd8\x67\xef\xfb\xc6\x8f\xd9\x66\x64\x94\xfd\xbc\x5a\x45\x44\x95\x49\xb2\x28\x61\x3a\xcd\x33\x94\xe5\xc5\x4c\x89\xe6\x6d\x58\xba\x12\x83\x04\x60\x12\xdb\x0c\x43\x57\x3a\xc9\xbd\x42\xdc\x41\xe6\x94\x5e\x8c\xeb\x62\x13\x8f\xa1\x3a\x55\x1c\x04\xe7\xb9\x76\x22\x4f\xb0\x81\x3d\x2a\x10\x8f\x26\x87\xbc\xcf\x42\xe4\xe3\xc7\xfe\x20\x83\xbf\x0d\xfe\xce\xf7\x28\x7d\x47\xd7\x33\x39\x7c\x85\xe3\xe8\xcd\x4c\x96\xeb\xfd\x65\x63\xd1\x26\x66\x18\x40\x7e\x69\xa4\xe1\x89\x29\xa1\xe9\xe6\x01\xf5\x7a\xd0\x94\x29\x71\x90\x93\xba\x06\x4a\x81\xd1\xa5\x67\x87\x55\x03\xe7\xa6\x57\x58\x85\xa8\x70\x43\x83\x87\x00\x84\x26\xa8\x8e\xc9\x7e\x7b\x9e\xdf\x9a\x45\xdf\xbd\x02\x10\x1f\xc3\x71\x97\xc7\xc2\xc8\x2a\x6d\x24\x4a\x0b\x97\xc5\x6d\xc7\x1b\x9b\xb8\x71\x3f\xbe\x4c\xae\x4b\x6d\xca\x41\x10\x1a\x97\xcd\x53\x23\x1a\xd0\x80\x26\x38\x44\xc9\x15\x1e\x99\x1f\xc7\xbb\x3b\x65\x52\x2f\xb2\xf4\x87\x5b\xe3\xf3\xe1\x55\x1b\xea\xe3\xbf\xfd\xf2\xf9\x6b\x61\xac\x77\x1b\xe9\x76\xd9\x76\x01\x35\x25\x30\x59\x61\x51\x06\xd4\xa5\x0d\xeb\x86\x9b\x4c\xc5\x29\xe3\x4c\x30\x29\x19\x1b\x18\x3b\x31\x16\x35\x0e\x3b\x78\x0d\xe0\x19\xf4\x91\xa0\x18\x32\xee\x12\xc0\x86\x61\x9e\x2e\x3d\x83\x32\x8e\x0b\x90\x6e\x56\x4b\x85\xcb\xa3\xde\xe9\x69\xf9\xb3\x6a\xf5\xae\xd8\xfc\x9b\x56\xef\x7f\x0e\xfe\x4b\xf0\x7f\x7c\xab\x8f\xfc\xdf\xaa\xd5\xfb\x3b\x1a\xc9\x5e\xac\x37\x8a\xbd\x74\x2f\x68\xfe\x09\x9a\xbd\xc3\x3f\xa2\x93\x2c\x56\xcd\x5e\x2c\x49\x49\xcb\x7f\x54\xb9\xb7\x5d\x95\x7b\x63\x04\xc4\xdc\x86\x68\x6e\xc2\xae\xcd\x5a\x09\x8d\x16\x3a\xd3\xc2\xaf\xe5\x20\xb9\xe2\xc3\x14\x16\xdf\x68\xf5\xfe\x03\x78\xd3\x4b\x7e\x7e\x7f\x98\x04\xc7\x3c\xd3\x18\xcf\x93\x75\x81\x0d\xad\x05\xad\x93\x6b\x12\xdc\x79\x8b\x24\x12\x22\xbe\xac\x43\x9b\xc7\xab\x08\xbe\x5b\x82\xc6\x77\xc7\x55\xb2\xe5\x43\x18\x85\xd1\x8f\x3f\x85\xd1\x21\x00\x81\xb5\xd0\xe5\x2e\x27\xc0\x9c\x2b\xd5\xa8\x1a\x94\xa0\x16\xd6\xbb\x85\x92\x52\x93\xd8\x86\x32\x3a\xa1\x79\x72\xc8\xd5\xd7\x20\x5e\x9e\x35\xcf\xbb\x89\x23\xe4\xfb\x72\xf0\x2b\x9e\xd8\xc6\xbe\x79\xff\x2a\xf4\x7e\xc7\x15\xbb\xb1\x6f\xd6\x30\x09\xed\xf2\x97\x13\x8e\xcc\x85\x99\x90\xcd\x26\xc2\x76\x4e\x57\x64\x37\x68\x41\x3e\xa7\xb7\x4f\xee\x74\x80\x5a\x3b\xa8\x1a\x57\x5c\x14\x63\x91\x70\x75\xdb\xb6\x2e\x6e\x9a\x66\x8d\x7f\x02\x3f\x46\xec\x6b\xe5\xe1\x5b\x22\xf5\xe5\x77\x58\x84\x4b\x7e\x51\xc4\x25\xa3\x2c\x65\x2c\x8d\xe3\xc4\x25\x61\x9f\x75\xc2\x72\x25\xb9\x25\x86\xa9\x52\x50\x21\xb2\x79\xb0\x07\xec\xca\x2e\x35\x69\x0e\x87\xb9\x76\xd4\x0d\xbc\x54\xa5\x50\x44\x11\x51\x4d\x74\x30\xdd\x74\x11\x87\x69\x99\x3f\xc8\x15\x87\xe3\x01\xfb\xb3\xf0\xc7\x6f\x75\x96\x43\xaf\x52\xf3\xee\xf9\xe1\x29\x7a\x7e\x78\x7a\xff\x7d\x38\x96\x65\x41\x72\x5a\xa0\x31\x2d\x8d\xb0\xc3\x10\x8f\xc3\x01\xff\x79\x64\x6c\x09\x25\x40\xe7\xa8\xeb\x28\xa8\xc2\x20\x0a\x5c\x01\xd0\x65\x02\xa8\x47\xc1\xaa\xcb\x43\x7c\x5d\xee\x83\x67\x2f\xfb\x27\xc3\x2b\x21\x6e\x42\x38\x5f\x1e\x57\x7e\xdc\x37\xb8\x9b\x3b\x08\xea\xae\xd2\x69\x1e\xc6\x12\xa4\x17\xad\x8c\x0a\x0b\xe5\x10\x61\x62\x08\x99\xb3\x05\x1b\x70\x6c\x13\xe9\xda\x46\x84\x92\xca\x02\x65\x18\x16\xd9\x41\x15\x10\xaa\x4e\xbb\xd4\xb1\xe5\xb8\x10\x10\x21\xec\x4a\x5c\xda\x39\x9f\x69\x96\x16\xaa\x68\x4b\x54\x46\xa5\x43\x55\x6c\x63\xba\x9c\x8f\x65\x4d\x62\x07\xec\xab\x2e\xdf\x9e\x8f\xc7\x70\xf5\x3e\xbc\xd1\x3c\xde\x47\xac\x2c\x31\xcf\x7d\x5b\x22\x13\x96\x62\x7b\x93\xf4\xfc\xea\xa4\x94\xae\xa5\x20\x00\x1a\xa4\x77\xa7\xc5\x7b\x4e\xe3\x8d\x33\xfb\x56\x3b\x7f\xff\x5a\x84\x01\xaf\x45\x98\xc7\xa8\x04\xd2\x7a\x89\xac\xc1\xe5\x15\x90\xc2\xd5\xb5\x71\xac\x04\x6d\xe9\x10\xe8\x63\x27\xf7\xd9\x92\x01\x1a\x37\x22\xe3\x8a\xd1\x4c\xc0\x3a\x76\x0d\x96\x04\xd1\x98\x2c\xf3\x5c\x9a\xd0\xd7\xaf\x2a\x1f\x6f\x67\x2b\x47\xfa\xeb\xbb\x6c\x75\x86\x7f\xf7\x78\x38\x7e\xf7\xe1\xf3\xbb\x4f\x7b\x1a\xa6\xb4\xa8\xf5\x20\x1a\x6b\x47\x7e\xb6\xbc\x44\xb2\xa3\x36\x9b\x5c\x13\x17\xa5\x60\xc5\x3e\x37\xf3\xb2\xa8\x5b\x63\xfa\x93\xd1\x7a\x6c\xcf\xaa\x5c\xae\x7e\x61\xdc\x90\x6b\x37\xf4\x03\x40\xf1\x5a\x8b\x69\xbd\xd7\x37\xdf\x72\xb8\x75\x66\x0c\x8f\xf7\xfb\x8f\x8e\x1f\xbf\xfb\xb0\xec\xf9\xe9\xfb\xbd\x5d\x26\x39\x4b\xd3\x9c\x96\x86\x8b\x92\x19\x56\x31\x82\x0b\x61\x4b\x48\x70\x7a\x3a\xf0\x42\x2b\xe3\xc6\xc1\xb5\x7d\xa5\x75\xd7\x2b\xa5\xa7\x1e\x24\x82\x02\xcd\x5d\x3f\x4c\x80\xc5\xc1\x21\x20\x57\xb2\x93\x1e\xd3\xfe\x93\xaf\x9d\x6e\x2a\x1f\x1b\xfc\xe0\x73\xf4\xec\x0d\x93\x9f\xd7\x2e\xf0\x9d\x41\xd9\xe7\x2f\x4f\x3f\x7d\xfe\x74\xe7\x50\x16\x6d\x22\x27\x5c\xa3\xb0\xba\x4c\xb4\xa4\x5d\x2d\x93\x38\x0a\x62\xc6\x93\xb8\x6a\xd2\x8e\xa8\xd4\x50\x98\xcc\x22\x4b\x45\x78\x8e\x1d\x4a\xce\x30\x53\x19\x02\x38\x75\x30\x03\x19\x4c\x55\x06\x0f\x32\x57\x5a\x10\x53\xcf\xc9\x70\x3e\x0f\xaa\xb2\xda\x0d\x99\xc9\xd4\x30\xa9\xca\xb8\x16\xa4\x94\x17\x82\xce\xc8\x07\xa9\x29\x2d\x0b\x46\x82\xe0\x10\x34\x57\x74\xa4\x91\x7e\xcd\x23\xde\x7f\xcb\x6b\x7d\x58\x51\x37\x4b\xf2\xee\xd3\x78\x80\xf7\xe5\x2f\xd6\xee\xb2\x97\xe1\xb6\x4d\x7c\x74\x0d\x03\x45\x94\x81\x1c\xe4\xc4\x9d\x5c\x1f\xe9\xcb\x39\xcc\x99\x6b\xb9\x6b\x99\x3b\x53\x81\x75\x41\xf2\x52\xf1\x22\xd8\x85\xe3\x1d\xb6\xf7\x71\xcd\x58\x7e\x7e\x78\x4e\x96\x58\xf2\xef\xc0\xf3\xbf\xfd\xec\xb1\xec\x1f\xc3\xe8\x66\xf4\xfc\xf8\xfe\xf1\xdd\xea\x4a\xf5\x86\x59\x8e\x70\xc8\x62\x13\xfb\xf2\x2d\xcb\xd2\x54\xa7\x95\x40\x34\x9f\x4d\x54\x97\x48\x41\x36\xc7\xa0\x77\xc5\xd9\x28\xd5\xa4\xae\x77\x12\x0a\xc3\x77\x6a\x04\x89\x1b\x07\xed\x62\x17\x1b\x9d\x3b\x74\x02\x59\xd8\x84\xd9\x32\x7b\x89\x54\x3b\xec\x06\xed\x6c\xa1\x18\xb6\x49\x38\xcd\x79\xba\xe6\xe9\xe4\x8a\x76\xf5\x01\x06\xdf\xbf\xea\x4a\x7e\x5d\x2f\x4d\xb6\xa9\xec\x66\x63\xb2\x04\x48\x9f\x9e\xde\x6d\xa9\xd7\xae\xa6\x94\xca\x5c\x51\x38\x13\xa5\xe5\xd8\xe8\xa6\x39\xcd\x5d\xdf\xc4\xe0\xec\x12\xdd\xf7\x07\xf8\xe7\xa1\x64\x89\x4e\xd8\xbe\x9c\xd9\xdc\x39\x46\x81\x0d\xe3\x70\x72\xa2\xaa\x54\xa5\x54\xe5\x88\x4b\x95\xc7\xee\xee\x83\x2b\xf2\x3a\xf3\xab\xd6\xcf\xcd\xa9\xf8\xf6\x0a\x3e\xfe\x78\x98\x74\xe3\x0c\x03\xd4\x9a\xd6\xd5\x1c\xc0\x93\xe9\x9d\xe2\xa0\x3c\x10\x72\x0d\x5a\xd5\xb8\x86\xb8\xa1\xd5\xb5\x6b\x89\x53\xd7\x40\x4f\x1e\x03\x87\xfc\x1c\xca\x7e\xeb\x7b\xf7\x1f\x02\xf0\x31\x38\x58\xdd\x3b\xc9\x80\xec\x4c\xe7\x04\x03\x25\x48\x8c\x9b\x5c\xcc\xc0\x78\x60\xc4\xd5\x83\x9a\xdc\x48\x5d\x77\x52\xfd\x99\x3a\xee\x46\x05\x32\x1f\x87\xd3\x9d\x78\xd5\x18\xf8\x78\x87\x27\xf9\xb5\xbe\xc0\x92\x9b\x1f\xbf\xbc\xdf\xf9\xb6\x10\x07\xb5\x17\x69\x03\xec\xa2\x00\x77\x04\x45\xe2\xa2\x3c\x21\x09\xe3\xa2\x82\xb9\xc5\xbd\x2b\xe7\x33\x04\x59\x8e\xf7\xa3\xd6\x5a\x1b\xb3\x5c\xc1\x44\xf7\x8e\x2a\x93\x49\x5d\x34\x85\xe1\xa5\x2d\x8c\x08\xa2\x5d\x1d\x48\x9f\x2f\xbf\x8e\x6f\xb9\xa3\xff\x04\xde\x46\x79\x68\x74\xe5\x3a\x06\xb2\x5e\xb7\x4e\x33\xc0\x1a\x3d\x3a\xc6\x80\x3e\x10\xd2\x1b\xa5\xce\xe4\x1a\xd4\xaa\x71\x23\x71\x6d\xbf\x5c\x8c\x30\x40\x5b\x7f\xf2\x5f\x7b\x35\xea\xdb\xa8\x0e\xc7\x8f\x5f\x1e\x57\x1e\xd0\x5b\x5b\xfa\x1f\xc0\xf1\xe3\x97\x4f\x4f\xaf\xc2\x9e\x9e\x63\x93\x7d\xb9\x8b\xe6\x9f\xbc\x3f\xdc\x7f\x00\xff\x00\xc2\xd2\x7a\x46\x64\x83\x30\x5f\x1e\xd6\x38\x71\x23\x57\x30\x56\x29\x1d\x6a\x6a\xd2\xba\x57\x1a\x17\xa0\x02\x15\xb4\xc0\x66\x28\xb5\x59\x09\x5d\x70\x0d\xf8\xc4\x38\xa5\xe8\x20\x88\x52\xaa\x24\x84\xf6\x99\xcc\x0b\x94\x91\x5c\x21\x48\x49\xaa\x92\x71\x1e\x1c\x72\x96\x9e\x00\x9c\x42\x7e\xe9\x1c\xce\xd3\x34\x6b\x8b\x33\xca\xb0\x04\x05\x1c\xdb\x42\xe7\xaa\xb1\x6b\x9f\x20\xdb\xb0\x55\x1f\xbe\xae\x95\x86\xaf\x18\xfc\xaf\x11\x77\x91\x9f\x1f\xb6\x62\x5f\x6d\xd3\x1c\x0c\xcc\x0e\x03\x75\xd3\xe9\xe4\x06\x0a\x92\x46\x50\x84\x04\x88\x09\x13\x9a\x38\x95\x82\x0c\x04\xd8\x9d\xdd\xd9\x80\x09\xd0\xd2\xd5\x2e\x3d\x88\x8c\x10\xed\xce\x95\x42\xa6\xd4\x15\xd1\x58\x31\x8e\x20\x1f\x4a\xc9\x74\x3b\xa7\x94\x5b\x45\x94\x6e\x74\xa3\x83\x9b\xfe\x59\xb4\xcc\xfd\x6b\x54\xbf\x6a\xa7\x7f\xd8\x3f\xac\x2e\xbb\xcf\xef\x1f\x6f\x08\xbb\x1b\xb7\x6d\xd3\x07\xdb\x50\x26\x0f\xfb\x8f\x59\x74\xa7\x13\xb6\x7f\xfe\xf4\x14\x51\xec\x5a\xe4\xcd\xbe\xa8\x3b\x5b\x4e\x19\x03\x99\x74\x58\x83\x8c\x37\xb4\x13\xd7\xc0\x9b\x85\x15\xc8\x4d\x05\x28\x1b\x63\x40\x6a\x1d\xf6\x6f\xf6\xc0\x45\xe1\x26\xc6\xf2\x12\x2b\xc6\xa4\xa0\xae\xbb\x74\x84\x44\x10\x90\x86\x73\x51\x29\x8c\x20\x65\x20\x48\xd4\xcb\x12\xaa\xb9\x74\x8b\xd7\xc2\xc8\x7a\x8c\x37\x0e\xfe\x79\xf0\xbf\xfb\xf5\xf3\x1e\x20\xf8\xfd\xab\xb7\xda\xcf\x0f\x9f\x1e\x5f\xdb\xc1\x7f\x0f\xb6\x76\xea\xcf\x7f\x58\xf1\xde\x5e\xf9\xef\xe1\xd3\xda\xe9\x5a\x9e\xa5\x0d\xf4\xfd\xc3\x87\xcf\xd1\x29\xec\x92\xb4\x48\x65\x86\x10\x24\xb4\xcc\xf2\x34\x55\x19\x41\x54\xcd\x5d\x94\xc8\x1c\x12\x44\x18\x8f\x11\x2c\x52\x55\x18\x66\xa9\xe4\x5a\x28\x29\x69\x61\x14\x24\x5c\x9e\xd2\xa4\x38\xe0\x29\x4e\xca\x32\x95\x65\x96\x73\x04\x6d\x25\x0b\x49\x4f\x20\x98\x2e\x5d\x2a\xca\x7c\x09\x55\xba\x56\x17\xe3\x04\x72\x50\x5c\xea\x88\x64\x2e\x5e\x42\xa3\x1c\xd4\x99\x04\x65\x21\x91\x10\xc8\x91\x90\xcc\xb5\xeb\xe3\xa4\x5c\xeb\xc6\x1e\x37\xc7\x56\xaf\xab\xb5\x4f\xf4\xb5\x3e\xf0\xb2\x04\xf9\x9a\xf1\x19\x0b\xb5\x44\xbe\xaa\x64\x08\xe9\x52\x88\x33\x71\x23\xc8\x85\x80\x80\x1c\x98\xca\x52\x57\x6b\xa8\x95\x16\xe5\x45\x85\xd3\xd9\x08\x90\x02\xa9\x41\x91\x26\x66\xc5\x06\x44\xc4\x3f\xaf\xf9\xdb\x2a\xb7\xb9\x6a\xad\xdc\x42\xaf\x45\xfd\x71\x83\x06\x44\x26\xea\x1d\x01\x83\xcb\x8c\x27\x38\x89\xa8\xd0\xa4\x54\x7c\xd6\x2c\xb7\x59\x79\xc8\xd5\x65\xd4\x33\x09\x6b\x1d\xa5\xac\x70\xf5\x40\x40\x0c\x02\x77\x76\x63\x0e\x72\x0f\x7f\x0f\x76\x51\x7e\xd5\xde\x23\xf6\xce\xe7\x7c\x63\x46\x6f\x41\xde\xf2\xf7\x98\x98\x17\x59\x9b\x1b\x1a\xcb\x23\xb2\x8a\x3f\x4f\xc6\x1c\xe2\x79\x02\xe2\xa2\xfc\xc6\x6f\xe7\x4a\x6d\xe7\xea\xdb\xd3\xf3\xd3\xfd\xc9\x0b\xb1\xc5\x5a\x9c\xa9\xeb\x00\xe2\x12\x02\x0a\x72\x2c\x25\x40\xae\xad\x25\x2b\x43\x75\x69\xa3\xa0\x6f\xef\x4f\x10\x5e\xcf\x9f\xac\x6b\xbd\x6a\x50\x8c\x57\xba\xf1\xce\x6e\x4a\xe8\xeb\x55\x79\x7e\xf8\x6e\x59\x67\xde\xdf\xd5\x52\xfd\xf4\xe6\x9f\xab\x68\x55\x6a\xf3\x67\x70\x37\x28\xa9\x98\xb1\x67\xa9\x1b\xd7\x64\x44\x27\x69\x6c\x92\x02\x0e\x96\x2b\x43\x7a\xdb\x28\xc2\xb4\x88\x2c\xc7\x1a\xb3\x83\x30\x3d\x6b\x1b\xa7\xe7\x12\xd4\x21\x83\x97\xca\xd1\x2a\x4b\xf3\x7c\x2c\xbc\x30\x4c\x59\xe8\xd2\xca\x36\x6c\x0b\x47\xdc\x89\x00\xea\xcf\x75\x83\x00\x59\xcf\x75\x08\xe2\xd0\x1e\xc5\x41\x7e\xe5\xb9\xfa\xa3\x0f\x17\xc0\xf3\xfa\xe1\xfd\x1b\x4c\x28\xfb\xf9\x13\x88\x2b\xef\xe2\x9a\xf4\x99\x9b\x5c\x4d\x22\x64\x41\x3a\x95\x6e\x70\x35\x1d\x05\x4a\x54\xc6\x5b\xd7\xda\x83\x74\x83\x71\x12\x23\x4d\x31\x8e\x8c\xd3\x54\x48\x5d\x8e\xaf\xe8\x20\x7f\x0f\xcb\x2b\x3e\xca\xd0\xae\x5e\x8a\x6f\x9a\x28\x51\x6d\xa3\xe2\xd2\xdb\x4b\x1f\x15\xa1\x3d\x99\x25\x09\x35\xcb\xba\xa1\xc2\xde\x1f\xeb\xdf\xae\x08\x59\x6f\x5c\xf0\xa6\x6b\xf2\x95\xda\xc9\xfb\xa7\x2a\xcc\xed\xca\x74\x4d\xc0\x79\x3e\x45\xa3\x87\x7b\x83\xd1\xa5\x21\x9e\x1b\x7b\x08\xe4\x85\x30\xa3\xb4\x02\x89\x5c\x56\x41\xed\xf9\xde\x01\xbb\xf2\xa3\x01\xcd\x6f\xdf\x7b\x60\xdb\x0e\xa7\x76\xea\x5b\xbb\x99\xb5\xaf\x06\xc8\xcb\xe7\xc6\x11\x63\xbc\x51\x89\xb7\xbc\x5f\xb6\xe5\xf9\xe9\xc1\x70\xac\x0e\x69\xf0\x9d\x77\xe1\x0d\xc0\xfb\xef\xff\x3d\x78\xef\xaf\xfe\xe3\xfb\xef\xbd\x09\xbd\x9f\x66\xbf\x2a\x49\xec\x3f\x7f\x79\xfc\xe1\xd0\x41\xdd\x10\xe2\x06\x23\x64\x19\xe5\xa5\x16\x3d\x9e\x4c\x3b\xe1\x93\x15\x20\x90\xd8\x49\x7c\x48\x07\x2c\x30\x51\xa9\x35\x65\x29\xcc\xac\x15\xb3\xac\xc8\x15\xa4\x65\xa1\x32\x54\x66\x98\xb2\x20\x88\x03\x16\xd6\x5e\x5b\xe2\x9f\x05\x8f\x41\x1e\xfc\x0f\x5e\x51\x0d\x07\xff\xdb\x3d\xf6\xf7\x37\xcd\xa3\x5e\x0b\x23\xdf\xff\xf4\xb8\xa9\x44\x3d\x1d\x9f\x3e\x3d\x7e\x79\xfa\xf4\xef\xc3\x9f\x3f\x3e\x3d\x7f\x78\xfe\x12\x7d\x79\xfa\xe1\xc3\xd3\xcf\x1f\x9f\x8e\x80\xca\x24\x0e\xcd\x9c\x62\xc2\xeb\x5d\xa2\x50\x98\x70\xa8\x54\xcb\x96\x47\x84\xd7\xb2\xc4\xa4\xac\x09\x65\x2c\x77\xcd\x25\x0d\x9b\x8c\xcb\x04\xe1\x58\xcd\x55\xa1\xac\xee\xf3\x9c\x8d\x84\x25\x30\xed\xf2\x4c\x14\x39\x4b\x0f\x32\xcf\x52\x51\x42\xaa\x74\x6e\x54\x6b\x4a\x22\x29\x67\xa5\x20\x8c\x8a\x92\x75\x54\x31\xa1\xe2\x74\x94\x42\x14\xc5\x59\xe2\x42\x08\xa7\x05\x44\xb8\x10\x9e\xbb\x11\xa4\xe1\x74\x48\x82\x1f\xb6\x2e\xde\xe6\xa1\xbb\x75\xf1\x96\xdb\x87\x85\x6c\xe8\x7b\xc9\x53\x37\xba\x2a\x13\x62\x18\xce\x87\xc4\xb8\xc2\xa3\x03\xb5\x61\x36\xcb\xc3\xc4\x78\xd8\xaa\xd7\xe9\x34\xde\x4f\x79\x73\x65\x7d\xb8\x55\xf5\x1e\xfd\x97\x3d\xee\xa6\x50\x5f\x83\x71\xf4\x3e\xfe\xd9\x38\x5e\x83\x43\x62\xe6\x6a\xf9\x31\x21\x35\x21\x0d\x82\x30\xec\x7c\x4c\x2c\x82\xa3\x77\x3d\x59\x55\x03\x1e\xd6\xe7\x7f\x97\x1a\x67\x24\x20\xbd\xce\x4a\x4d\x0f\x62\xae\xe6\xc0\x65\x0c\xf4\x61\x05\x82\xcc\x95\xae\x2e\x00\x5e\xee\xa7\x72\xc3\xfb\xbf\x0b\xfe\xb0\x22\xe9\xee\x9c\x0e\xb7\x39\xf9\x5e\x63\x22\xaa\x80\x5a\x33\xd5\x57\x16\xb9\x88\x52\x03\x4b\x4d\x67\x21\x89\x41\x72\x97\x84\x6c\x36\xc6\xd5\x66\xae\x43\x62\x00\x09\x2b\x78\x6a\x48\xd5\x57\x3d\xee\x9a\x9b\x47\x7b\x44\x7d\x3d\xfd\xd5\xf7\x74\xe5\xbe\xaf\x15\x89\x07\x10\xe8\x93\xa1\x0e\x02\x69\xc6\x54\x4b\x73\x20\x2e\x0d\x93\xf9\xac\x5d\x73\x69\xc2\xc6\x91\x6b\x50\x82\x0c\xd8\xad\x3e\x1a\xf6\x5e\xbb\x79\x8d\x29\xfd\x51\xbe\xbb\xd7\xac\x24\x7d\xcd\x9b\x2e\x69\x2b\x5e\xb5\x80\x29\x79\x36\xe7\x03\x67\x4a\x19\xee\x74\x29\x95\x66\x8e\x31\xa7\x9c\xe5\x80\x06\x20\x4a\xaf\xe2\xd8\x1d\x6e\xb5\x81\x2d\x3e\xdc\xc4\x07\x1e\xee\xad\x2f\xa2\x96\xf5\xc0\x40\x94\x56\x85\xa0\xae\x70\x8d\x89\xce\xa2\x62\x3a\x33\x0c\xc3\x64\x2f\x5e\x82\x3c\x47\x78\x2c\x9c\x25\x88\xf2\xfd\x69\x8e\xdd\x98\x55\x59\x15\x66\x9b\x7e\x35\x3c\x56\x51\x1e\x3c\xac\x95\xd6\x2d\x53\x3f\x6e\xa9\xf2\xd3\xf3\xf2\x9c\xec\xce\x21\x49\x8d\xb0\xa5\xe1\x8c\x50\x62\x4b\x55\xc0\x36\xa7\x24\x89\x72\x9f\x35\x30\xc9\x34\x27\x50\x53\x73\x02\x49\x67\x4c\x17\x80\xdd\x18\xe1\xa3\x3e\x60\x5f\x57\x7b\xd8\xe6\x86\x9b\x38\xf4\xa7\x87\x63\x50\x94\x92\x50\x2d\x44\x79\xc0\x2e\x20\x8a\x50\x50\xa9\x6b\x70\x2e\xeb\x01\x24\x41\xb0\x03\xe7\x2b\xda\x75\x9b\x26\xc9\x4f\xaf\x95\xf0\x87\xef\xff\x06\xfc\x2d\xf8\xf8\xd9\x73\x51\x92\x68\xb3\x0c\x78\x5e\xd6\xce\x0f\xbe\x54\xff\xce\xbf\x46\xd8\x24\x29\x48\x32\x88\x54\x8e\x69\xe6\xc6\x8e\x57\x31\x44\x72\x99\xd0\xaa\x42\xe4\x14\x8a\xe2\x20\x32\x8a\x7f\x51\x98\xc2\x38\xb6\x31\x84\x21\x9e\x3b\xd7\x72\x10\x84\xb1\x47\x4d\x83\x33\xae\xea\xb8\xd1\x33\xb1\x75\xd2\xea\xb5\xa7\x8c\x43\x7a\x90\xbe\x83\x7e\xf3\xaf\xfe\x6d\x7c\x11\xeb\xb5\xd6\x3c\x55\x88\x63\x98\x62\x92\x11\x02\x39\xeb\xf7\xf9\x5a\x3c\xe9\x90\x62\x33\x29\x49\xa2\x12\x14\xa2\x22\xb7\x05\x04\x3a\x88\xbc\x4f\xf4\x7f\xc3\x33\x10\x9a\x30\x5e\xcd\xda\xe9\x5c\x59\xef\x91\x3e\x45\xa3\xc1\x5c\xb3\x39\x15\xd4\x60\xf1\x8f\x3e\x03\xc7\x48\x6c\xfa\x0f\x5f\x6b\xbf\x6c\x67\x7b\x5b\x78\xc2\x3b\x7e\xf6\xc3\xf3\xe7\xe3\xa6\xf9\x12\xfd\x86\x83\xce\x72\xf6\x77\x43\x9d\x66\xa0\x9d\x45\x38\xcd\x71\x14\x24\x5c\x17\x3c\x95\x39\xce\xd3\x39\x68\x32\xe4\x97\xda\x73\x06\x73\x9e\x43\x17\x0b\x88\x24\x05\x23\x4c\x44\x52\xa0\x42\x66\x07\x91\x23\x38\x1b\x21\xb8\x8b\xfb\x54\xa5\x25\x28\x77\x98\x74\x4a\x4d\x52\xce\xb1\xd4\xd0\x8a\x38\x1f\x2b\xdc\xd4\x5a\xe5\x56\xc5\xa6\x4e\x7a\x11\x80\xa0\xbf\xe2\x28\x58\x75\x05\xde\x2d\x51\xae\x8f\x1a\x7b\x73\xae\x98\x31\xe6\x20\x5d\x3c\x0d\xe6\xdc\xbc\xa8\x20\x38\x7a\x4d\x09\xfe\xff\xf1\x98\xcb\x3a\x2b\xc2\xf4\x72\x8e\xaa\x0b\x8d\x6c\x22\x2b\x24\x53\x0d\x29\xcc\x2e\xe5\x58\xc8\x50\xce\x32\x94\x18\xe7\x22\x47\xb3\xd4\x98\x6a\x16\x52\x9c\xaa\x14\x95\x48\x17\x77\x63\x4e\x4e\xa9\x4a\x29\x60\x6f\x63\x0e\x84\x86\x46\x24\xc5\x60\x49\x5d\xf9\x25\x23\x59\xc7\x7c\xf4\x1a\x1b\x2b\x66\xe0\xd7\x6c\xd9\x5f\x8d\xe3\xcb\x3f\x71\x20\x55\x9d\xe5\x60\x9c\x51\x84\x2e\x6d\x44\x13\x61\x0b\x9e\xa9\x82\x24\x59\x7a\xa9\xba\x9c\x86\xf9\x7c\x0a\xf3\x18\xe6\x3c\x83\xf3\xa0\x20\x54\x38\x0c\x50\x2a\x13\x88\x0a\x99\x7f\x3b\x12\x44\x40\x71\x37\x14\x26\xa1\x62\x49\x3e\x2e\x43\x91\x2a\xd3\x72\xbb\x7c\xc1\x31\xb4\x9b\x4e\xd4\x3f\xf9\x9a\x3c\x7e\x8e\x1e\x3f\x3d\xfe\x11\xbc\x0d\xe5\x5b\xe2\xef\xee\xb4\xdc\x87\xa7\x39\x8b\xc8\xa5\x8e\x50\xcc\x04\x52\xa9\x81\x45\x96\x5e\x6a\x10\x64\xd2\x6b\x68\x61\x4a\xa0\x80\x78\x96\x12\x93\xed\xa2\x24\x90\x17\x2a\x3b\xc8\x1c\xc3\xb9\x16\x82\xcf\xd3\x29\x51\x89\x00\x6c\x97\x13\xd7\x8a\x51\x88\x39\x96\x16\x56\x22\x2f\xae\x41\x4d\xba\xda\xda\xbc\x36\x89\xed\x92\x41\xbd\xae\x2b\xe4\x90\x05\x7f\xbb\xad\xd1\x6f\xcf\xef\x93\x09\xd5\xb4\x24\x2e\x76\x89\xa3\xce\x87\xcc\xcc\x8d\xb9\xd8\xa8\x34\x21\xbe\x61\x87\x49\xb4\x9c\x87\x65\x7d\x7f\xfe\xfc\xe9\x39\x7a\xbc\x61\x08\x6e\xb4\x21\x65\x62\x13\x83\x14\x23\xc4\x55\xa9\x93\x93\xa4\x2c\xd1\xbb\xa9\xe9\x9d\x78\xe9\x31\x16\x52\xb0\x5d\x7a\xd1\x8e\xb2\x26\x4c\xc0\xb8\xc6\xa4\x51\xf2\x8f\xf9\x1b\x26\x84\x26\x49\x5e\xa4\x99\x50\x42\x83\xf8\xf7\xfd\x0d\x0f\x11\xf4\xba\x3c\x22\xc8\x7d\xad\x73\xe5\xb4\x6d\x78\xcc\xaf\x53\xed\xa7\x6f\x52\xec\x55\x71\xe3\x77\x1a\x1e\xc7\x04\xb7\x23\x43\xb9\xca\xf2\xce\x71\x3b\xa1\xa9\xd2\x76\x2c\xcf\xda\xe9\x2e\x2f\x38\x81\xbc\xed\x0b\x70\x0a\x13\x3b\x73\x63\x3c\xb5\x58\x83\x60\xe6\xb7\x4f\xd7\xe0\x20\x44\x91\x5e\x83\xb2\x2c\x08\x92\x15\x51\xac\xbe\x06\x20\xeb\xb8\x28\x2b\x89\x21\xa4\xe5\x94\xc4\xea\xc2\x2e\x5d\x59\x46\xd0\x9d\xaa\xaa\x72\x45\x55\x55\x41\x10\xfc\xb3\x30\xf3\x39\xb7\xba\x1b\xd1\x7f\x0a\xfe\xcb\x8d\xc7\x73\x5f\xcf\xf9\x7c\x2b\xe8\x78\x3c\xd6\xad\x85\xb0\xd6\x74\x5e\xdb\x0c\xd1\xe3\xc3\xaf\x34\xc7\xdf\xbd\x4a\x61\xad\xb5\x85\x65\xdb\xb1\x35\xd9\x33\x05\xe2\x79\xea\x02\xc0\x12\xa7\x90\x16\x3c\x8e\x65\xcc\xdc\x34\x8a\x36\x3d\x5d\x83\x56\xb5\x40\x99\x88\x5e\x2a\x35\x8e\x80\x8d\x73\xed\xdf\x6a\xf6\x52\x4a\x69\x0c\x48\xb4\x06\xb1\xd6\x07\x85\x39\xe5\x25\xc1\x45\xc1\xa0\x28\xe2\x2c\x4d\x92\xe5\x49\x45\x08\xe5\x99\x48\xc5\x5c\xbb\xd4\x49\x02\x24\x68\xc2\x6a\x6e\x5d\x06\x32\x6f\x81\x48\x29\x75\x93\x1b\xa4\x5c\xc2\xfb\x7a\xf9\xb3\xd6\x21\xda\x2b\x3a\xb6\x07\xb4\xe5\x0c\xaf\x5e\x02\x8f\xdf\xed\x37\x27\x81\x7d\xd0\xa8\x2a\x3c\x5f\x03\x0a\x12\xea\x7a\xe1\x4d\xdb\xda\x28\x3b\x39\xee\x54\x09\x0a\x20\xa2\xe9\x32\xcc\x76\xb0\x20\x08\x87\x50\xb9\xc4\x7f\x6f\x7f\x85\x9e\xc3\xfe\xce\x7b\x27\xdc\x57\x37\xb6\x00\x1d\x7c\x78\xb3\xe7\x5f\xc2\x90\x2f\xdf\x7d\xf8\xbc\x13\x4d\xad\x38\x67\xb2\xb2\xc2\xda\xa9\x27\xf5\x60\xeb\xb0\x56\xc2\xb6\x1d\x1d\x9a\xea\x1a\xd0\xc9\xd4\x42\x72\x5b\x1d\x10\x13\x4a\x53\xad\xa5\x96\x56\x9e\xb8\xa2\x9d\x28\x67\x45\x5d\x7b\x6a\xa8\x11\x4d\x25\x95\x34\x27\x90\x96\xee\xdc\x0d\xde\xff\x9a\x84\xd3\xb6\xee\x2e\x91\xa0\x3f\x9e\x87\xb5\xf4\x10\x46\x6b\x2c\x7b\xfc\xf8\x19\x94\x9a\x16\x92\x1b\x4e\x4b\x84\x60\x2f\x40\x5c\xcb\x84\x08\x74\x10\x0e\xd2\xb2\x34\xfc\x1a\x08\x4a\x15\x41\x8e\x2f\x81\x21\x09\x03\x30\x66\xae\x99\xf0\x39\x38\x78\x0f\xac\xe6\x80\xee\xd4\x75\xff\xeb\xaa\x8c\x7f\xcb\xee\x56\x11\x17\x3f\xe0\x5b\xfe\xf7\x2a\xf9\x06\xd6\x89\xee\xf1\xdd\xf3\xfb\xf5\x64\xed\x8f\x3f\x7f\xbc\x27\xe1\xdd\xf7\xef\x22\x1c\x55\x8d\x4f\xd4\x4a\x77\x12\x3d\x9b\x94\xab\xed\x35\x28\xeb\xca\x55\x80\x2f\xf3\x4e\xa5\xd7\xf5\x68\x96\xa0\x77\xa7\x65\x3a\xa2\x9a\xc0\x5c\x14\x05\x88\x59\xdd\x60\x0e\x8b\x0c\xe1\xbc\x9f\x60\xa5\xb3\x42\x14\x59\x9e\x1f\xd0\x3c\x0a\x21\x94\xe4\xb2\xea\xce\x4a\x92\x4a\x09\x21\x00\x2e\x5d\xc7\x5c\x2d\xc4\x59\xb8\xfa\x94\x41\x88\x51\x6e\xa5\xe6\xb6\xc4\xb1\x8a\x21\xe7\xa5\x82\x08\x42\x0c\xf1\x8a\x95\x8d\x22\xe4\x3d\xd5\xb3\x0d\x8b\xb8\xa9\xdd\xfd\xf0\x98\x79\x8b\x0c\x1f\xdd\x2e\xbf\x7a\x7e\x7c\x78\x8c\x50\x34\x5d\x2a\x05\x62\x90\xb2\xd4\x66\x0c\x3b\xe3\x64\x0d\x6a\x77\x06\xc9\x2a\x47\x92\x5d\xe4\xdc\xe4\x79\x09\xe2\xc2\x55\x04\x52\xb6\x67\x4b\x9c\xe3\xf3\x1a\x79\xa5\xc7\x2a\x6c\x36\x7c\xd1\x6f\x24\xfd\x3b\x69\x40\x7a\x2e\xdd\xe8\x6a\x7a\x12\xc8\xbb\xfc\xb8\x93\x0d\x1b\x37\x62\xa6\x38\x3e\x7b\x65\xc7\x9e\x91\x72\xfd\xbe\x28\x3e\xaa\x03\xfe\xcb\xdf\x17\x8f\xcb\x83\xd4\x92\x9e\xe1\x44\x67\xa2\x71\x83\x39\x60\x77\x26\x54\x72\x7c\xca\x32\xa2\x51\x57\x12\xcf\x33\x0f\xce\x57\x1c\xf5\x51\xff\xca\xd9\xfc\x5d\x27\xaa\x9e\x95\x54\x64\x86\x14\xae\xb4\x1b\xab\xdc\x95\x51\x7f\x41\xb4\x4c\x74\x82\x6b\xc7\x76\xca\xb5\xf5\xaa\x17\x0a\x02\xb5\x4b\x76\xc4\x7b\x09\x6f\x39\xc8\x4a\x48\x08\x3d\x21\x21\xc2\x96\xa9\x34\x73\x95\x13\xf9\x68\xad\x91\xfd\x09\xa2\xfd\xd4\x9e\x08\x84\x30\x55\x06\x14\x85\x1b\x59\x92\x13\xf2\xca\xb9\xe1\x1b\x8e\xf3\x1b\x39\x9b\xdb\xd3\xfa\x9d\x87\xa3\x3e\xbe\x7b\x8e\x8e\x9c\x31\xcc\x72\x8d\xd0\x35\x48\x12\x2d\x58\xc9\x10\x93\x6d\xea\x26\x0d\x6c\x62\x92\x3d\xfa\xa5\x2b\xcb\xd4\xa4\x64\x27\x4f\xaa\x19\x54\x6b\x7b\xcb\x41\x12\x26\xbf\x98\xbd\x97\x92\x0c\x96\xb8\x5f\x87\xfa\x50\xde\xf5\xa0\x5e\x5d\x73\x7f\xba\xf5\xcb\x75\x98\xcd\x83\x58\xee\xda\x30\x0f\x8b\xb9\x17\xcb\xff\x1b\xe9\x6b\x40\x71\xb9\xbc\x04\x9b\x06\x50\x7a\x2c\x0f\xea\xb5\xe3\xfe\xf0\x2a\x06\xfc\x8d\x00\xfc\xe3\xfb\x4f\xb7\x05\xa8\xd4\xbf\x30\x1d\xc5\x3e\x92\x4e\xc2\xb3\xf1\xea\xca\xe5\x6c\xc1\xc9\xe5\xb3\x02\x83\xcb\x76\xd0\x8d\x75\x03\x32\x0c\x12\xcc\x30\x66\xd8\x9d\x71\xe5\x1d\x64\x97\x7d\xf2\x2b\x3c\x96\x61\xbb\xd5\x9e\xc3\x7f\x53\xbc\xbb\xc7\x45\xbe\x3e\xe7\xaf\xd4\xfe\xe8\xe9\xf8\xde\x47\x60\x5e\x12\xec\xa7\xd7\xb2\xcf\x7e\x7b\xdc\x47\xa0\x15\xa8\x95\xef\x7c\x08\xa7\xc2\xfc\x72\x16\x96\x22\x81\xa0\xe9\x8a\x59\x4d\x99\x05\x49\xd6\xd5\xf8\x5c\x97\x40\x80\x60\x6e\x41\xef\x5a\x80\x1c\x8f\x3a\x47\x40\xed\x48\x88\x85\x10\xa2\x44\x25\x62\x65\x01\x11\x29\xb2\x34\x95\x10\x14\xa5\x44\x0c\x66\x48\x94\xb9\xc0\x9c\xa1\x12\x21\x84\x2c\xf2\xfa\xca\x68\xc3\x34\xfe\xf3\x2d\x9a\xbc\xf9\x71\x2f\x71\xd8\xca\x6a\x7b\xbd\xf8\xaf\xf7\xc0\x7e\x49\x86\xde\x3f\xbe\x7f\xfa\x6e\x7f\xfc\x79\xb3\xf7\xba\x4f\x80\x7f\xc3\x64\xd3\xaa\x34\x03\x30\x77\x05\x07\xba\x68\xd3\x94\x40\x52\xc0\x34\xc3\x88\x42\x98\x66\x7c\x02\x67\xab\x40\x72\x86\x20\x60\x6d\x49\xdc\xc4\x41\x51\x68\xd0\xd3\x42\x16\x44\x30\x6c\x51\x79\x39\x69\x5c\x1a\x11\xf6\x18\x9a\x02\x19\x94\xd8\x04\x1e\x64\x5e\xd2\x59\xbb\x94\x01\x0b\x3a\x98\x17\x85\x28\x72\x58\x14\x90\xc1\x3c\xcf\x28\xe0\x10\x58\x67\x91\x76\x7a\x50\xcb\x89\xaa\x6b\xde\x01\x1b\x26\x4c\x62\xc1\x5f\xa0\x07\x86\xc3\x62\xaa\x48\x6b\x4c\x8b\x5a\x53\xd4\x75\xd1\x56\x9b\x6e\xd2\x8a\x21\x5b\xb1\x77\xdb\x1a\xf1\xfe\xfb\x37\x18\xe0\x6d\x91\x90\x9a\x14\xa2\x34\xb9\xe1\xac\x2c\xa9\x95\xa0\xe8\x74\x4a\x14\x3e\x08\x57\x96\xac\xb4\x92\x8c\x7d\x65\x4c\xad\x5c\x75\x62\xa0\x0a\x05\x48\x97\x45\x82\x8c\x1b\x67\x0d\xd4\x47\xed\xb5\xe6\xbf\xf3\x75\xe9\x60\xff\xf1\xc7\x9b\xbc\xcb\x86\xd3\xb9\x85\x21\xd1\xc9\x55\x0e\xd1\x30\x00\x5a\x24\x09\x50\xa0\x29\x1d\x71\x0a\x67\x36\x43\x0e\xee\x2a\xa1\xb5\x24\x97\x6c\x6f\xdc\xa9\xd6\x2d\x10\x65\x92\x5e\x03\x6d\xad\xf5\x61\xb8\x1b\xd4\x50\x95\x46\x06\x20\x1a\x83\xd3\x71\xc9\xb5\x7f\x5e\x46\xb6\x5a\x15\xfe\xf0\xfc\x6f\xdf\x7d\x08\xb7\x7e\x82\x1f\xe5\xaa\x10\xe2\x65\x58\x3e\x3d\xed\x8a\x5e\x03\x94\xa6\x79\x26\xd3\x92\x94\x65\x9d\x52\xc2\x4a\xdc\xf0\x06\x96\xac\x94\x49\xbf\x97\xd3\x34\xdb\xa6\x05\x59\x76\x0d\x6c\x07\x08\xe8\xdb\x96\x96\x52\xba\x53\xc3\x1b\x00\x19\xe1\x5c\xa8\x60\x17\x94\xc1\xb4\x0b\x5e\x75\x1e\xfe\xd5\xaf\x7b\x82\xf7\x48\xa7\xe3\xed\xbf\xfd\xb4\x19\x30\x57\x00\x19\x80\x5c\x0b\xe4\x85\x01\xe9\xda\x90\x6a\x4e\xa5\x74\x35\xe7\xa6\xb4\x10\xe4\xde\xf5\x16\xa0\xc4\x29\x97\x67\x40\xb9\xd3\x7e\x5c\xc2\x02\xa5\xb4\x6b\x31\x15\x1c\x97\x58\x61\x46\xc6\xb6\x55\xaa\x90\x04\x9a\xdc\xde\xb8\x83\x78\x97\x1d\xd2\x8d\x9b\x1e\xbc\xbb\xf7\x3b\x7a\xb7\x3c\x09\x9f\x37\x43\xd4\x65\x46\xf9\x17\xe0\xe1\xf1\x01\xbc\xff\xfe\xf8\xf8\xce\x46\x32\x97\x92\xb1\x5c\x0a\x54\x24\xae\xa3\xd7\x40\x0e\xd4\x8d\x00\x26\x5e\x6f\xb4\x07\x1d\x48\xdd\x98\x80\x2c\x3e\xa4\x17\x3e\x8b\x2a\xa9\x12\x01\xb8\xe3\xee\xcc\x26\x80\xb4\x92\x50\xf9\x21\x21\x07\xa1\x92\xc0\xeb\x20\x46\x80\xee\xe4\xa1\x3a\xd0\x6d\x5e\xfc\x5a\x6d\x9a\xee\xc9\x2f\xb5\xdd\x25\x2f\xe7\x65\x3b\x50\x97\x83\x94\xba\x89\x06\x41\x1c\xf0\x6b\x71\xd4\x3b\xf8\x95\xb6\xbf\xcf\xac\xde\xbd\xea\x0f\x7b\xef\x64\x3f\x35\x7a\x96\xb6\xb7\x31\x78\x7b\x5f\x15\x2a\x36\xf8\xf9\xe3\xfe\xe7\x8f\x8f\xc7\x1f\x87\x03\x9c\x61\x94\x99\x59\x2c\xb1\x78\x94\xcf\x85\x05\xbd\x2b\xa2\x7c\x99\x29\x2f\x9d\xff\x8c\x96\xf9\xf2\xc2\xf7\xdd\x2f\xb0\x3e\x66\x4e\xa9\x52\x91\xb9\x99\x79\xae\xb9\xc3\x7b\x8c\xf0\xdc\x56\xa0\xda\x41\x8e\xdc\xa9\xf1\xf2\x2d\x00\xa2\x33\x63\x0c\x2d\x1b\x47\x82\x73\x52\xc2\x94\x23\xce\x60\x61\x93\x15\xc7\x29\x22\xe4\x39\x6a\x37\x0e\xcb\x87\x7b\x01\xec\xcd\xab\x79\x09\x9c\x3e\xdd\x08\x6b\xf7\x1a\x21\xc0\x9a\xcc\x2a\x26\x95\x30\xac\x07\x83\x67\xfc\x64\x5a\x2e\x97\xc5\x82\xde\x2e\x79\x84\xd0\x79\x21\x73\xa7\x50\xaa\x33\x78\x10\x05\x96\x46\x1a\xde\x4b\xde\xbd\x10\x5d\x22\x93\x66\x61\xaa\x5b\xa5\x5a\xed\x62\x50\xe7\x95\xc8\xb5\x30\x6d\xd1\x1a\x5f\x4b\xcb\xb7\x1e\x69\xf2\x86\x3d\xf9\xde\x3b\x03\x78\xd4\x26\xf0\xb3\xc4\x87\xe8\xfb\x0f\x7f\x0f\x3e\x1c\x7f\xde\x67\x36\xcd\xc0\x99\x14\x16\x17\xce\x10\x2e\x6b\x10\xd3\x13\x07\xd8\x24\x0c\x5a\xca\x4f\x07\x91\x69\x21\x63\x37\xb1\xdc\xd4\x53\xc5\x40\x32\xc7\xce\x4c\x12\xe8\xf0\x14\xbb\x0a\x9d\xf5\x40\xf4\xb0\xec\x17\xfd\xa5\xfd\x7e\x7e\xf7\xcd\x7e\xd1\xb2\xdf\x7e\xdd\x6f\x05\x4b\x61\x86\xdf\xdf\x6d\xad\xf8\x70\xe9\x7e\x6b\xaf\x4b\x7c\x50\x6f\xdc\xe7\xd5\xad\x0e\xdc\x7c\xcf\x3c\x86\x6e\x5f\x57\xd3\x12\xa9\x01\x4c\x94\x1d\x48\x9d\x39\xe3\x0c\x01\xf8\x20\xd0\x4b\xe3\x8a\x04\x4d\x43\xee\x94\x13\x85\xc1\xb1\x09\xfd\xf9\x0b\x73\x5f\x03\x60\x5e\x0b\xf9\x4e\x1f\xe5\x0d\x66\x7c\x53\xde\x7d\x78\x0c\x19\xe8\xf2\xb4\x4a\xf3\xb0\x9d\x53\xc4\xa2\xcc\xce\xda\x32\x55\x82\x52\xba\x12\xd4\x21\x9f\xf5\x3e\xb6\x6d\x5a\x59\xd3\x37\x97\x52\xca\xb0\x93\x5c\x01\x0c\xe4\xcb\x19\x9c\x03\x00\xa6\xab\xf6\xb5\xb6\x7f\x7e\xbf\xa7\xf0\x1b\xd3\xdc\xe0\xdd\xb2\xa3\x2a\x4b\xaa\x24\x0b\xbb\x39\x25\x34\x22\x0e\x86\xd9\x2f\x43\x48\x5c\x27\x6b\x06\x24\x77\x72\x4f\x95\x49\x95\xb4\x6e\xaa\x96\x74\xde\x84\xb8\x35\x1a\x30\x50\x2d\x63\x82\x57\x76\xd4\x5e\x6b\xf7\xe3\x5d\x6e\xb1\x45\x8e\x7e\x82\xfd\x04\x9e\x1f\xbe\x3c\xdc\x61\x5a\x3e\x7f\xd9\x23\x6b\xa4\x6c\x86\x8c\x52\x98\x98\x8c\x57\x35\x9b\x4b\xad\x6c\xd3\xd8\xd4\x75\x4e\x66\xb0\x38\x94\x73\x29\x8d\xe8\xe5\x0c\xf3\x94\x36\x70\xc9\x3d\xd8\xae\x79\x29\xb3\xfd\xe0\x12\x73\xe9\x0a\xcd\xb0\x8d\x93\xe5\x18\x56\x2d\xb2\xd4\x6b\xab\x6d\x6a\xc2\x0f\x4f\x0f\x37\xc4\xf8\xbb\x63\x18\x85\xe7\x9d\x71\x41\x9a\x55\xb5\xeb\x18\xe8\x5a\x97\x44\xb8\x69\xa4\x3d\x1d\x52\x43\xe9\x2f\x62\x07\x5d\xed\xce\x0a\x54\x61\xe1\xe8\xd9\xb5\x12\x14\x1e\x17\x0c\x42\x7e\x45\x47\xba\x71\x2b\x7c\xbd\xf2\xae\x34\xfd\xe8\x1b\x01\x8f\x61\x07\x94\x0d\x99\xaa\x09\x4b\x19\xa1\x38\x71\xd0\xc5\x4b\x38\x25\xf6\x09\x60\xce\xbc\x74\x4e\x25\x26\x19\x23\x73\xe9\xe7\x89\x81\x29\x5c\xbd\x15\x43\x7e\x3d\x1f\xcd\x7e\x8d\x05\x5f\x3d\x0c\xc3\x71\x87\x5f\x1a\xb1\xcf\x7f\x39\xed\xb5\x79\xd1\x9b\xde\x5a\xe0\xaf\x67\xba\x32\xf0\xde\x83\xc3\xfb\xef\x7f\x78\xdc\xce\xf1\xbf\x04\xd9\xcf\x9f\xfe\xdd\x3b\xf0\x18\x65\xd1\x79\xce\x15\x03\x85\xa9\x48\x5a\x65\xd5\xb9\x77\x4d\xd7\x85\xfc\x32\x1e\x52\x79\xc9\xda\x12\x15\x7c\x28\x5c\xaf\x84\x96\x20\x8b\x70\x00\xc2\xf2\x5a\xfa\x5a\x87\x5f\x1b\xfd\x6c\xf9\x26\x88\xba\x42\x07\xd7\xf2\xf3\xa7\xd7\x62\xed\x21\xb7\xd6\xf5\x90\x8d\x34\xa9\x32\x02\x5d\x7d\x62\x8e\x58\x90\xb8\x18\x4c\xab\x19\x42\xb1\xcb\x66\x42\x9c\xcc\x33\x5c\x15\x23\x2a\x30\x03\x75\x48\x1d\x0e\x85\xf5\x26\xf3\xb3\xba\xf1\x0f\x48\xc8\xef\x70\x38\xbf\xee\x29\x64\x46\x72\xa5\x33\xab\xb8\xb2\x40\x29\x39\x9a\xf1\xc0\x08\x97\x82\x3a\x49\xb9\x52\xd4\x29\xea\xa4\x33\x1c\xd0\x60\x1f\x78\x2d\xdd\x28\x0f\xfe\x2e\xf8\x93\x47\x2f\x2d\x33\xe8\x0a\x4c\xfb\x15\x2e\xed\xd3\xf3\xe7\x0f\x8f\x3f\x7f\xfc\x17\xe0\xc3\xe3\xe7\x4f\xd1\x97\xc7\x0f\x4f\xcb\xc4\x0f\xe4\x1e\xc6\xe3\x39\x69\xfb\x64\xa4\x26\xad\x4a\x9c\xbc\xe4\x79\x3a\x9c\x53\x0d\xc6\x02\x3a\x1d\xc6\x25\xd0\x71\x96\xb8\x84\x6b\x84\x9c\xcc\xa2\xdc\x68\x55\x49\x37\x25\x2a\x91\xca\x2a\xad\x4b\x5c\x51\xe2\xf2\xaa\x2a\x71\x15\x80\x80\x45\xe6\xc6\xcd\x79\xf7\x3b\xee\x0e\xe7\xb0\x59\xcd\x4e\xea\x99\x44\x64\xea\x23\xe4\x75\x4d\xf0\x21\xe6\x5c\x71\xc9\xd5\xf2\xb2\xe4\x0e\xea\x6a\x76\x38\x52\xdb\x1a\xf9\xc7\xaf\x71\xb6\xd1\x8a\x29\x3a\x1c\xd7\x6e\xd9\x97\x9f\x3f\x82\xca\xab\x1e\x2d\x39\x84\x5e\xf2\xc9\x14\x41\x9a\x27\x36\x29\x10\x4a\x5d\xef\x74\x66\x72\x18\x29\x41\x9d\x15\xcb\xe2\x2c\x62\xc6\x8b\xa2\x4c\x62\x89\x0a\x9d\x50\x72\xd3\xcf\x5a\xfd\xd6\x3e\xbe\xaa\x9e\x6d\x3c\x89\xb7\x5e\xda\x5b\xea\xb1\xfc\xbd\x95\x51\x7e\xfe\xf8\x6e\xcb\x45\xf6\x37\xc2\xfe\x12\xfa\x13\x98\x7b\x05\x13\x21\x84\x53\x40\xea\xb9\x5f\x02\x9c\x0e\x40\xc7\x7b\xd5\x85\x71\x56\x30\xef\x45\xda\x81\x7e\x18\x86\x79\x58\x8e\xfe\xa0\x48\xa9\xa4\x1b\x95\x1b\xc4\x5c\x53\x1a\x12\xa1\x0c\x99\xcf\x4e\x10\xa0\xc1\xb0\x84\xc8\x4e\x48\xc7\x96\xb0\x47\xbb\xd1\x98\xcb\x34\x06\xc1\x1e\xb4\x1e\x3f\xa6\xee\xbc\x54\xee\x7d\xba\x56\x78\xe8\xc3\xd3\x83\x0f\x41\x1f\x7f\xcb\x47\x25\x64\x21\x34\x5e\x17\x7a\x74\xaa\x07\xa8\x74\xcd\xc9\xb8\xd1\x59\x06\x38\x08\x9c\x04\xe7\xb9\x1b\x7f\x6d\x01\xb4\x3f\x1b\x63\xcc\x9c\xba\xb3\xaa\x6b\x40\xe7\x2a\x24\xce\xd6\xca\x00\x18\x8e\xc6\x41\x6b\xad\x83\x6b\x5d\x2e\x0c\xa7\x2b\x3e\xea\xfd\x74\xd3\xa7\x7e\xff\x18\x46\xbf\x5e\x0d\x22\xb9\x4b\xe6\x1e\xc9\x50\x1b\x57\x98\x92\x2f\x4f\xb8\x6b\x01\x5e\x02\x91\xfd\xb4\x1c\xd1\xf9\x92\x30\x16\xa5\x56\x0a\xa0\xfc\xfc\xcd\x82\xdd\x56\x73\x16\xdf\x8e\xfe\x37\xd7\x9d\xcf\x6b\x7a\xb6\xff\xfc\xe5\xe9\x95\xc0\x86\x01\xb5\x80\x15\x85\xd4\x27\x20\xe6\xb3\x96\x61\xbd\x2c\x00\x8c\xd0\x11\x04\x8e\x81\xda\x55\x60\x92\xe5\x30\xad\x95\xe6\xb9\xd9\x57\x7d\x0f\x11\xee\x7a\xc5\xe9\x85\x2a\x15\xe5\x28\xe7\xb2\x55\xa7\x9e\xb1\x8b\x6a\x67\xcf\x7f\x8d\x43\xb4\xf1\xb9\xfe\x7a\x43\x5b\xfd\xc7\xe0\x3f\x07\xff\xab\xcf\xc2\x96\x03\xf2\xc1\xbf\xcf\x87\x5f\x3f\xef\xef\x14\xf7\xc1\x87\x37\xfb\xca\xaf\xd1\x03\x7e\x18\xfb\x4f\x8f\xef\xf7\x9b\xaf\x5f\xd8\x86\xa9\xb6\x1d\x3c\xd7\x4e\x84\x3c\xcc\x8c\x6d\xe1\x58\x3b\xe1\x10\x4c\x45\x06\xc3\x33\xcc\x64\x8a\x1c\x52\x08\x64\x49\xaa\xf3\x14\x74\x0e\xf9\xa6\xab\x87\x08\x5f\x52\x8d\x31\x99\xc0\xe8\x34\xe0\xeb\x76\x20\x33\xae\x29\x92\x84\x4c\xea\xf5\x13\xc6\x34\xa7\x38\xf7\xaf\xae\xcc\x55\x9e\x17\x08\x49\x25\xa4\x50\x0a\x86\x9a\x20\x35\x36\xbe\x41\x70\x0d\x94\x8f\x75\xcf\x57\x78\x54\x07\x18\xfc\xb3\xe0\x6f\x3c\xaf\x6e\x79\x64\xfe\x0e\xfc\x01\x3c\x3e\x44\xab\xd9\xec\x9b\x24\xfb\x5b\x53\x34\x12\x67\x23\xd9\x0e\x59\xaf\xf2\xd4\x58\x00\x41\xc2\x5c\xe7\x14\x56\x03\x4d\x6c\x4a\x90\x6b\xaf\x01\xdf\x05\xd3\x7c\x72\x94\x82\x00\x18\x90\x44\xc1\xdc\x01\xeb\xa6\x6b\xe0\x6a\xa6\xb4\x61\xae\xce\x33\x3a\x16\x6e\xc0\x08\xb3\xcd\x4b\x69\xe3\x8b\x04\xe0\x0d\x46\xbe\xf2\x86\xd8\x2f\x99\x35\x36\x0a\xd2\xdc\x16\xd9\xfe\xa4\x67\xed\x02\xc7\x4b\xa0\xc1\x29\xec\x10\x2c\xf0\xa6\x07\x72\xfb\x8e\xe4\x36\x37\xac\xd0\x3f\xff\x3d\x3b\x52\x64\x61\xf7\x0b\xe9\x0d\xa7\xe1\xc9\x4b\x76\x97\xb7\x2f\x1a\x81\x00\xf1\xf2\x4d\xc1\x5f\x85\xf8\x0a\x7d\xac\xf5\xb5\x4b\xd7\xbf\x5e\x3d\xba\x7c\xce\xf6\x3a\x67\x7e\x79\x7d\x4a\x7f\x1f\xb9\xeb\x05\x86\x40\xe7\x60\x48\x7f\xa9\xc2\xd2\x41\xbd\x99\x79\xc0\x0b\x59\xd6\x57\x6f\xcb\x74\xdb\x3a\xde\xbb\xa1\x04\x71\x98\x82\x04\x24\xe8\x1a\xb8\xe9\x90\x96\xa5\xab\x4a\xa5\x4a\xc1\x18\x9b\x4f\x73\x1c\xa6\x9e\xf9\xd7\xb1\x6b\x40\x05\x55\xb0\x84\xa5\x62\xc8\xeb\x93\xe5\x9b\xef\xf9\x5a\xf7\xbc\x1d\xef\x36\x3b\xbe\xff\xca\x39\xe8\x5b\x6f\x09\x3f\xcb\xb4\xa0\x35\xe0\x6c\x8c\x4b\x96\xb9\x26\x34\x33\x33\x73\x15\x2e\x69\xce\xc9\x41\xd0\xcd\x5d\x08\x1d\x0a\xe9\xca\x4f\xde\x0f\xd6\xba\x4e\xb9\xd6\x2a\xab\x97\x34\x4a\x5b\x65\x4d\xa5\x96\x59\xe5\xb4\x4c\x2a\x3b\xef\x89\x5f\x7b\x7c\xd0\x77\xde\x27\xd5\xc7\xcc\xaf\x7a\x4c\xfb\x1b\xd0\x75\xfd\xbc\xbc\x05\xfb\xdc\xa4\xd9\x19\xc0\xd2\xf5\xe7\xde\xb5\x0c\x68\x90\xca\xde\x49\x0a\x38\x90\xea\x1a\xb8\xb4\x04\x27\x50\xeb\xd6\x21\x27\x30\xe0\xa0\x3a\xc8\xbc\xc8\xdd\xd4\xea\x0e\x24\x6e\x68\xf8\xa4\x88\x1b\x7a\xd9\x25\xc4\xd9\x49\x4e\x09\x76\x67\xd7\x0b\xcd\x41\xb6\x62\x96\xce\x1b\x0f\x25\x5d\xb2\x4d\xef\xac\x18\x46\x9e\x4e\xf5\x79\x2b\xb1\x79\x8d\xe9\x87\xe7\x37\xf3\xc4\x25\xfa\x38\x12\xeb\x44\x6e\x6a\x67\xca\xa6\x55\x32\x75\xc6\x86\x49\x6c\x63\x8b\x2b\x18\xdb\x0c\x16\xd7\xc0\xe2\x7d\xee\x30\xc8\xe6\xde\x4d\xae\x1f\x34\xef\x35\xa8\x00\x5a\x12\x51\x5b\xd7\x76\x6e\x67\x8a\xb0\x2a\x86\xc2\x6b\xa7\x47\x89\x9f\x7b\xb8\xf7\x2b\x7c\x7c\xc5\x30\xdd\xae\x90\xef\x7a\x83\xed\xa4\xac\xbd\xe8\x3d\x59\x6d\xdc\x2a\x97\x59\x17\xb7\x66\x00\xf5\x72\xa5\x1c\x23\x40\x80\x6e\xd6\x86\x6a\x63\x0e\xbc\x37\xd7\xc0\xb8\x0c\x0c\x5e\x86\xd1\x0d\x4b\x40\x59\x0a\xcb\x00\x03\x05\x9c\x2a\x5a\x05\x3b\xef\xa9\x4c\xff\x5f\x63\xab\x8f\x94\x52\x6f\xbd\x01\x67\x2c\x14\x1f\x1a\xe3\xb1\xd5\x5d\x93\xfc\x36\xb6\xfa\xe4\x4a\xf2\x7b\xd8\xea\xbd\xef\xe1\xa5\x5e\x3b\x68\xf5\x0b\xf8\x63\x10\xbc\x7b\x7e\xd3\xc5\x5c\xef\xda\xfd\x9d\xd2\x34\x3b\xfb\x69\x00\x24\x33\x41\x6b\x93\x74\x3e\x85\x70\x19\xb5\x67\xdb\xed\x75\x49\x20\x17\xc6\x6a\xab\xed\x4c\x18\x0b\x3d\xa4\xca\x6b\xc9\x10\x3f\x6e\x71\xc7\xdd\x7d\xab\x57\x3e\x3c\x3f\x80\x5b\x81\x61\x7b\x3f\x52\x3b\xe7\x1a\xd4\xd6\x21\x5f\xdd\x68\x41\x3a\xe7\xb7\x4f\xfb\xe4\x17\x68\xcc\xbe\x5b\x02\xeb\xb9\xf6\xa5\xc3\xe6\x65\x5a\x05\xd1\x96\x67\xb1\xdd\xf6\xf5\xb7\xdb\x8a\x7a\x5f\x00\xb8\xdb\xd7\x91\x5a\x67\xad\xab\x2c\x98\xac\x8b\xfd\x05\x9e\x40\xb9\x8f\x2f\xe5\x86\x74\xb4\xcb\x74\xbf\x16\x45\xc1\x10\x44\x5e\x7b\x91\xfb\xfe\xd9\x67\xcf\x7e\xd8\x54\xef\xbe\xd6\x2d\x59\x2f\xdb\xb2\xa3\x4f\x4f\x9f\x9e\xd7\x1d\xff\xfc\x71\x65\xd5\x3f\x7f\xfe\xf2\xf8\x83\xef\x8d\x51\x98\x81\x56\xe7\x18\x04\x9c\x21\x9a\x09\x88\x5d\x7f\x3e\x37\xf3\xd4\x9c\xcf\xae\x37\x20\x46\x44\x81\x2e\xcb\xd1\x09\xe5\x0e\xe1\x7c\x1c\x7d\x00\xc4\xc5\x8b\x29\x69\xa2\x62\x1c\xb5\xb5\xaa\x1c\x05\x55\xa5\xea\x17\xb6\xcf\x04\x57\x18\xba\x84\x0b\xfe\x72\x6e\x82\x28\xe2\xde\x57\x00\xbe\xf6\x20\x6e\x64\xca\x57\x78\xcd\x03\x78\x7a\x78\x5e\xb6\x5d\x82\x40\x0c\x08\x8d\x6d\x46\x90\x2b\x9d\x16\x51\x3d\x0f\xe7\x33\x90\xe7\x73\xc8\xe7\x2e\x4f\xcb\x16\x5e\x03\x02\xb1\x38\x64\x17\x18\x15\xab\xef\x4e\x00\xc2\xf3\xe6\xa9\xb3\x44\x15\x77\x29\xd1\xfe\xe1\xe9\xe1\xf8\x8a\xe7\xf9\x9b\xf0\x31\xfb\xf8\xdf\x81\x4f\x0f\xc7\x4d\x34\xfc\xf9\xe1\x08\x39\xcf\x49\x82\xf2\x3c\x8f\xaf\x81\x6d\xe0\x19\x14\x28\xf5\x3e\x71\x6e\x74\xa7\x04\x63\x86\x2a\xdb\xd8\x7d\x36\x53\x37\x24\x36\xee\x80\x2c\xe7\x38\x6c\xd1\xe5\x94\xa7\x79\x3a\xe2\x91\xe5\x71\x4c\x48\x94\x64\x1a\x86\xa9\xcb\x70\x98\xb9\x74\xc5\xd7\x06\x22\xac\x0e\x34\xf8\xee\x0e\xbf\xb2\x4a\xcb\x7e\xfe\xf2\xf0\xc4\x3b\x73\x3a\x31\x92\x4e\xae\xcf\x04\xeb\x76\x1e\x71\x6f\x66\x95\xe7\x5a\x52\x9b\xe5\x61\x75\xfb\x8e\xd3\x81\x2e\xf9\xc8\x1d\x06\x66\x83\x9f\xf1\xd1\x8c\x63\x97\xba\xb3\x6b\x32\x25\xc6\xd7\xaf\x20\x6f\xdf\x10\x04\x7f\x15\xf2\xab\x38\x9a\x83\x0e\xe2\xaf\x1c\x35\x7f\xf4\x33\xdf\xe3\x9d\xf4\xec\x97\xc7\x87\x37\x9a\xdc\x7d\xc1\x6b\x09\x03\x35\x98\x0a\x0b\xb3\x10\xbd\x04\xe5\x0e\xbd\xb4\x3a\xca\x2e\x03\x0b\xc9\x5c\x4b\x80\x5d\xe3\x9a\x68\xb8\x64\xfa\x66\xb9\xe6\xda\x25\x61\x3c\xc4\xb4\x80\x44\x91\x99\x71\xd0\x10\x77\x2e\xc9\x92\x8a\x82\x82\xba\x91\xba\x51\x2d\x39\x57\x73\x85\x47\x12\x25\xaf\xda\x3b\xb7\xb5\xf5\xa7\x37\x19\x99\x9f\x56\x67\xe4\xe5\x01\x05\x45\x28\xad\x6f\xa4\x9d\x90\xd4\xd4\xa4\xd9\xcc\x2f\x43\x1a\x4e\xb3\xdc\x07\xcb\x84\x98\x85\x75\x59\xba\xa2\x4b\x08\xd1\x15\x85\x30\xcf\x4c\xda\xab\xb6\x6d\xdb\x00\x04\x32\x1c\xbc\xaf\xfe\xe3\xea\xfb\x7c\xeb\x2e\x7b\xe4\xee\xf3\xe3\xab\xb8\xe5\x6a\x38\x15\x35\x73\x72\x90\x88\x88\x22\x9d\x7b\x30\xb9\xd8\x74\x60\x80\x8e\x3a\xe1\x78\x87\x2a\x3e\x30\x9d\x66\xa7\x76\x5f\x69\xc5\x09\x81\x45\xa5\x74\x62\x4a\x69\x2d\x1b\x00\xc9\x96\x99\xd1\xc7\xd3\xed\x95\x1e\xf5\x81\x07\xff\x2e\xf8\xef\x5f\x11\x46\x6f\x01\xef\x7b\x1f\x59\xbd\xbf\x4b\x71\xb3\x9f\x37\x50\xd3\xa7\x67\xdf\x98\x7c\xf0\xbe\x18\x0f\x11\x06\x81\x05\x31\xc1\x5a\x5a\x60\xe6\xb3\xb2\x80\x83\x82\x38\xeb\x38\x35\x43\xb9\x64\xbe\xc8\x35\x6e\x14\x84\x50\x29\x04\x82\x2e\x07\xe2\x1a\x80\x81\xd1\x6b\xb0\xe7\x5e\xad\x50\x4a\x72\x3a\x99\x4a\x97\x44\x19\x43\xba\x2c\x27\x4d\x31\x21\x88\x19\xe0\x08\x6b\xca\x05\xc4\x7e\xea\x5c\x02\x43\x8f\x43\x56\xde\xff\x42\x6e\xfd\x95\xff\x78\xab\x56\x6f\xcb\x81\x5f\xa7\xfe\xb8\x99\x25\x6d\xf2\x13\x4f\x77\xfa\x13\x9f\x6e\xbd\x9f\x55\x64\xfa\x96\xc2\x34\xa3\x06\xbd\x1d\x47\xd7\x2e\x0b\x13\x18\x5c\x1a\x27\x21\x75\x50\x81\x92\x3a\x56\x25\xca\x61\x0c\xa8\x70\x04\x4c\x49\xec\xb0\x0f\x81\x5b\x77\x1a\x23\xec\x0a\xe5\x67\xdd\x06\xc0\x43\xee\x17\x9f\x33\x73\x3c\xa1\x4b\x7e\x68\x50\xc5\x40\xea\x7a\xa2\x51\xad\x0b\x24\x19\xd0\xec\xcc\x39\x77\xb1\xd6\x3a\x08\x0e\xbe\xb7\x26\x0e\xf7\x75\xd9\x7f\xb3\xe6\x37\xef\xfd\x9d\xb5\x4e\xc9\x9f\xb6\x9b\xfd\xa7\xad\x0e\xbb\xd6\x64\xef\x11\xc2\x51\x15\xb5\x8e\x81\x4a\xb9\x41\xb9\x51\x01\xeb\xca\x90\x81\xdc\x9d\xe6\xd3\x72\x6c\xb1\x6f\x93\x15\xfe\x17\xe7\x08\xad\x3e\x00\x38\x6c\x66\x7a\x80\x4a\x9c\xf9\xb2\x4c\xf1\xb3\x70\xa5\x10\x82\x72\xce\xe5\x65\xc2\x4a\x2b\xb3\x9e\x6f\x74\xad\x8e\xcd\x21\xfb\xba\x17\x77\xc3\xab\xfb\x7a\x4c\xf0\x95\xaf\xa1\xb3\x7b\xf1\x8b\x3a\x64\x2f\x59\xd8\x00\x7d\x21\x40\x5d\x06\x13\x1c\xc2\x65\x5d\x97\x07\xf4\x15\xb6\xc2\x7f\xd7\x57\xdc\xf6\x77\x6b\xa0\x71\x2f\xd8\xf4\xd3\x2a\x0b\xbe\x5a\xbb\x7e\x25\x5d\xb1\xe1\x27\xc2\x6a\x67\x2f\x6d\x56\x44\x9d\x30\xa2\xca\x6a\x89\x60\x32\x0f\xcb\xd2\x34\xa4\x29\x27\x48\xc6\x89\x13\x2e\x2f\x96\xfc\x14\x88\xa9\x94\xf4\xcc\x1a\xdd\xf7\x80\xf6\xaa\xbf\x98\x71\x04\x62\x1c\x0f\xc8\x25\x08\x5e\xac\xeb\x13\x93\x9c\x42\xa3\x9d\xaa\x92\x3c\x83\x4c\xa2\x2c\x83\x85\xce\x1a\x20\x74\x89\x85\x31\x6a\x5c\xfe\x5c\x62\xef\xdc\x7e\x04\xc5\x15\x1d\x75\xf4\x6b\x1c\xd9\xf3\x6f\x62\x96\x96\xd9\xec\xf3\xfe\xf7\xfc\xd2\xb6\xc6\xd8\x2e\xb1\x69\x16\xca\x97\x7a\x37\xbe\xa4\xbb\x36\xa6\x32\xc7\x29\xcd\xf2\x34\x7e\xc1\xa0\xcf\x5c\x1d\xd5\x17\x12\xd5\x2f\x52\x16\x5c\x09\xa0\x49\x66\x13\x12\x76\x38\xd5\x29\x96\x38\xb3\x29\x8a\x04\x2c\x9c\x40\x18\x5d\x03\x11\xcb\x38\x97\xa1\x2d\x14\x42\x06\x21\x97\xa3\xe5\x71\x24\xb4\xcc\x19\xcd\x28\xcd\x4b\x9a\x50\x5a\x30\xba\xc4\x3b\xab\x5f\xb5\xd9\x3c\x4d\xd6\x2b\xf4\x16\xe8\xbc\x86\xe9\xeb\x14\xb5\x55\x31\x97\x8c\xf2\xfd\x5d\x46\xf4\x27\xf0\xf1\xe9\x70\xdc\x7f\x7a\x3c\x1c\xff\x18\xae\xe3\x3c\x6a\x17\x67\xc0\x3a\x0a\xa4\x93\x7e\x6b\x5f\xda\x34\x23\x15\x9d\x4f\x96\x73\x88\x34\x44\x95\xae\xc2\x3e\xc9\x2c\x4c\x75\xd6\x24\x29\x88\x5d\x13\x27\xa0\x74\x16\x94\x87\x5c\xa2\x12\x63\x44\x50\x09\xd2\x2c\x61\x52\x5f\x03\x26\x10\x82\x4e\x80\xa4\xc8\xcf\x4b\x10\x47\x81\x05\x53\x78\xce\xb2\x02\xc2\x16\x65\x59\x85\x93\x24\xc7\x08\x69\x84\x36\x7e\x77\x7b\x90\x1e\xa1\xf4\xc3\x87\xe7\xcf\x77\x6e\x3f\xab\x20\xf4\x87\x63\x18\x1d\x8e\x3f\xbc\x7f\xbb\x11\xff\xc1\x33\xc1\xc0\x3d\xa9\x69\xd3\xb0\xc8\x19\xe9\x0c\xd5\x98\x81\xcc\xc5\x18\x31\xd8\x6a\x5e\x32\xda\xf0\xb6\xcc\xf3\x4c\x9b\x82\xe6\x25\xc1\xe8\xec\xaa\x25\xf8\x4d\xf2\xc6\x9d\x31\x48\xdb\x2c\xaf\x74\x09\x82\xde\xe1\x25\x76\x39\x48\x6d\x55\x05\x15\xd7\x04\x71\xad\x2c\xe3\xc4\x15\x67\x0d\x52\x70\xca\x52\x6d\xdd\xd9\x9d\x13\x93\xb4\x5d\xe1\x06\x6b\x2c\xc0\x66\x10\x86\xf7\xb0\x90\x50\xd1\x56\x0b\xbe\xd6\x06\x45\x38\xf9\x3e\xe1\x3e\xf8\xa3\x5f\x37\x5f\xd5\x15\x77\xaf\x44\xb3\x1f\x5f\x35\x15\xdf\x14\x90\x7e\xdc\x4b\x51\x52\xc6\xc3\x38\x99\x6b\x02\x02\x9e\xe7\xb1\x8a\x79\x59\x39\x5b\x3a\x9e\x02\xee\xa5\x12\xe7\x4a\x63\x6e\x19\x29\x01\x3c\x28\x88\x38\x81\x4a\x11\x6d\x89\xce\x3a\x73\xee\x0a\x55\xa8\x3a\xa9\x15\xc8\x89\x10\x73\x0f\x0c\x2d\x64\xbf\x72\x23\xf9\xb1\x02\x83\xaf\x57\xfe\x69\x53\xc4\x79\x43\xe6\x3d\xaf\x9a\x3b\xff\x01\xac\x0b\x8b\xaf\x7c\xaf\xcd\xe0\xae\xd6\xdc\xd8\x79\x54\x42\x2a\x03\xa8\x85\xd2\x18\x95\x27\xb6\x20\xdc\x95\xb8\x62\x3b\x52\x71\x5b\x56\x60\x28\x95\x32\xbc\x20\x6e\xb0\xa2\xed\x5d\x03\xb3\x38\xc6\x02\x0d\x59\x46\x28\x50\xed\x48\x86\xde\x9f\x9b\x3e\x4c\x8e\xd8\xf7\x25\x56\x6c\xc5\x87\xc3\xaa\x6c\xbb\x5b\xdb\x58\x3f\x46\xb7\x92\x60\x6a\xab\x16\x58\xd0\x52\x26\x40\xda\x09\x3b\xeb\x19\x15\x80\xda\x7d\xf0\x12\xd8\xa8\xbd\xa0\x83\x28\x7a\x91\x16\x04\xd3\xa6\x93\x96\x66\x4a\x39\xe3\x62\xe5\x7b\xb5\x61\xc0\xae\xf0\x68\xa2\x53\xf0\x77\xcb\x0a\xfe\xee\xae\x8b\xb0\xdb\xbf\x3a\x49\xfd\xb4\xea\xb6\xff\xf0\xe1\xf3\x3b\x16\xd2\x22\xab\xb2\x7c\x97\x3b\xce\x3a\x90\x83\xb8\x1c\x9d\x72\x8d\x4b\x28\x18\xc6\x93\x9b\x44\x39\x9f\xc3\x8e\xd2\x53\x37\x90\x28\x5b\x9e\x4e\xa2\x5d\x57\x33\xa1\xa5\x6a\xb1\x59\x9e\xde\xa6\xae\x04\xc2\x16\xc4\xcb\xf9\xee\x22\x79\x4c\x5e\x31\xe7\x1f\x56\xd7\xb1\x8f\xd9\xfe\x4e\x9f\x7f\x7d\x3d\xb4\x64\x96\x17\x56\x84\x53\xa8\x2a\x61\x74\x35\x4f\x82\x68\x2c\x1c\xd2\xa5\xa6\xfa\xc0\x75\x99\x1a\x01\xdd\xb9\x25\x43\xa5\x2d\xb5\x26\xb7\x35\xad\xab\x60\x1f\x9e\xae\x62\xab\x7f\xbf\xa9\x65\xac\xde\xaa\x2b\xf7\xe0\xf9\xad\x61\xe2\xb9\x2b\x2b\x7f\x65\xc3\xf9\x2d\x7f\xff\x00\x36\xcb\x91\xc3\x84\xbb\x29\x8c\x9b\xa6\x69\xe7\x33\x18\x5f\x54\x18\xcc\xe7\xb6\x6d\xbb\x30\xed\x87\x02\x9c\x01\x6a\x75\xeb\x8d\x46\x0e\x42\x65\xe9\x69\x59\xcf\xdc\xd9\xab\x9a\x81\x44\x83\x44\x81\x54\x75\x49\x6c\xe6\xf4\x66\xdd\xe8\x98\xe7\xa9\x24\x41\x10\x87\xca\xe3\x16\xd0\x57\x1a\x48\x7f\xbc\x39\x9d\x7e\xd9\xd4\x8f\x7e\x55\x0d\xb9\xb1\x09\x68\x64\x2f\xa5\x97\x59\xf0\x24\x66\x13\x4e\x73\x7c\xdb\xb4\x6c\xdc\x99\x9d\x43\x76\x3e\x21\xbf\x58\x94\xca\x38\x71\xe1\xa1\x12\x4e\x0b\xa7\x84\x3b\x31\x45\x35\x12\xa4\x34\x02\x07\xc1\x5f\x7b\x7d\x2c\xb3\x79\xea\xdd\xfb\xa9\xaf\xce\x27\x9b\x57\xf5\x5b\x9d\xf5\xc1\x43\x3e\x9e\xde\x83\x6f\x16\xb8\xdb\xe7\x77\xdf\xba\x09\x0f\x80\x9b\xca\xf8\x9a\x5b\xf1\xd2\x81\xc2\xe9\xb0\xae\x5c\x67\x2d\x80\x95\xb1\x97\x71\xfb\x50\x9a\x99\x1b\x13\xea\x99\x2f\xdb\x21\xe6\x9c\x73\xc5\x67\x15\x8a\xe5\xd3\x35\x10\xc2\xdb\x51\xaf\x6f\x7a\xce\xca\x32\x1c\xae\xc1\x32\xa8\xcd\x43\x7c\x38\x88\x15\x87\xfa\x8d\x9e\xd2\x2a\x62\xab\x4f\xa6\xef\x65\xc9\x20\x32\x88\xf1\x0e\x75\x9b\x73\x0d\x6b\x2a\x63\xc4\x25\x8f\xf0\xa9\xe5\x80\x02\xef\xb1\xb8\x79\x66\xa1\xe0\xaf\x37\x25\xec\x37\x8e\x93\x0f\xa4\x97\x3c\xf1\x5f\x82\x8f\x5f\x2b\x79\x2c\x11\x50\x24\xa2\xea\x52\x46\xf1\x0c\xc3\xee\x72\xde\x65\xc6\x19\x50\x33\x85\x33\x5d\xb8\xd1\xb8\xb3\x01\x95\x33\xe6\x80\x66\x21\xa5\x94\xb3\x9a\x44\xeb\x14\x23\x9a\x74\x73\x1f\x16\x0e\x87\xa8\x15\xd3\x86\xc9\x1d\x0f\xc9\xd7\x9e\x27\xfb\x8f\x3f\xbe\x7a\x9e\xa8\x28\xc8\x94\x16\xb2\xe4\x95\x3b\x95\x20\x37\xed\x49\x34\x15\xce\xe6\xe6\x90\xcc\xa3\x13\x7d\x2f\x9b\xca\x89\x41\x0f\xc0\x82\x14\x04\xe5\x69\xe8\xbc\x79\x7a\xb8\xe9\x80\x25\x41\xb2\xba\xfd\x84\xd1\x2a\x9c\xba\x7e\xfb\xd3\xe3\x77\xef\xbe\x7b\x17\xf5\x91\x28\x26\x73\xa6\x63\x55\xb9\x91\x81\xdc\x9e\x68\x09\x02\x54\xdb\xe2\x90\xcc\xdc\x65\xd7\xa0\xb5\x15\x48\xaf\x41\xa3\x1b\x90\x02\x1b\xe6\xae\x74\x0a\x94\x60\xe5\x84\xee\xa9\xcf\xdb\xb9\xcf\x98\xbc\x1b\xde\x9b\x2c\xe1\xf3\xc3\xd3\xa1\xb1\x94\x69\x99\x69\x05\x9d\xb5\xf6\xc0\xff\x5c\x09\x9a\xd9\xbc\xdc\x97\x2f\xc2\xd7\x94\xab\x2b\xf1\x78\xa8\xbf\xf5\x28\xc7\xe5\xc9\xb8\x39\xfc\xbf\x69\x39\x3d\x7a\x9d\xb2\xc7\x57\x29\xf2\x87\xc7\x87\x55\x20\xe6\x5b\x3f\xeb\x5d\x4c\x20\x88\x69\x5e\xa7\x25\x48\x5e\x30\x80\x05\xca\x81\x70\xaa\x25\xd0\x16\x04\x0c\x40\x74\x26\x2b\x35\x05\xc8\x5c\x26\xad\xa3\xf8\x32\x2d\xdb\x41\x71\x29\x39\x44\x62\x09\x41\x29\x99\x73\x50\x41\xae\xb0\x66\x72\x49\xd6\x8b\xac\x96\x44\xb8\xf4\x32\x70\x1e\x65\x6e\xd4\x8e\x9a\x9b\x96\x1f\xf6\xba\x04\xff\xff\x15\xb5\xf0\xf0\x8d\x12\xed\x53\xe0\x55\xd4\x3f\x6e\x83\x18\x0f\x85\xd3\xa0\x76\x84\x6a\xc5\x33\xad\x70\xeb\x4e\xb3\xc2\x61\x31\xcd\x1d\x54\x3a\x2f\xa2\xe2\x65\x88\xb4\x72\x93\x76\x9a\x91\xcc\xe4\x18\x10\x27\x2b\xa3\x41\x20\xbb\x1c\x63\x10\x7b\xfc\x58\x77\xa4\x07\xb5\x79\x5a\x7f\xed\x0a\xfa\x27\xb0\xdb\x30\x29\xfb\x8f\x3f\x1e\xbd\x6f\x5c\x94\x66\xb9\x45\x19\x01\xc1\x89\xf7\x93\xeb\x59\xe7\x7a\x0a\xd0\xfe\xb4\x7a\xc7\x61\x58\x90\xb2\xa5\x52\x48\x2a\xb8\x22\x8a\xac\xbd\xd3\xd0\x1e\xd5\x41\xae\x88\xa2\xf7\xaf\xae\xbf\xe0\xce\xf5\x77\x39\xd9\x89\x01\xb2\x44\x79\xac\x13\x26\x0d\x3b\xe7\x0e\x13\xc0\x72\x37\x80\xe2\x20\xfb\x79\x2c\xb0\xc9\x4e\x02\x22\xd0\x3b\xd4\x2a\x0b\xa8\x5e\x3d\xc4\x44\xb8\xe4\x4a\x5f\xf5\x0e\x8f\xaf\x5e\x29\x1f\x3f\x03\x5e\x69\x64\x0d\x35\x0a\x2b\x0d\x6a\x6e\x46\x3e\xfa\xe2\xb3\x40\x06\x51\x23\xa0\x22\xa7\x96\xb7\xeb\xf9\x47\x47\x1b\x0e\xeb\xb3\xb3\xce\x5b\xde\x6d\xea\xb5\x37\xa4\xa2\xcc\x46\xf9\x8c\x41\x0e\x5a\xea\x32\x37\x2c\x51\x4c\xc1\x40\x03\xd2\x99\x86\xd8\x18\xed\xce\xb2\xaa\x01\xf1\x2e\xbf\xdd\x72\x94\x71\x10\x86\xf5\x55\x1f\xeb\x83\xf2\xd1\x42\xe0\x1d\xc7\xde\x7d\xf0\x40\xa7\xfd\xed\x2a\xdf\x56\x96\xc7\x87\xa7\x7d\x3e\xb8\x9e\x01\xdd\xcb\x14\x04\x00\x52\x37\xce\x75\xa8\xdd\x04\x8c\x63\x61\xfa\x82\xc2\xc4\x71\xa0\xcf\x7b\xe5\x9a\x5e\x82\x02\x30\x52\xb8\xae\x31\x35\xd2\xae\xd2\xae\x36\x06\x10\x0d\xa8\x7f\x16\xb8\xc7\x2d\x50\xef\xaf\xbb\xcc\xcc\xff\x63\xf0\x3f\x07\xff\x8b\xd7\xb2\x7e\xff\xb5\x7c\xfc\xe3\x43\xf4\xf4\xfe\x79\xff\x9b\xbf\x05\xdf\x60\xfb\x6e\x28\xc2\xaf\x24\x91\xfb\x84\x54\x79\xac\x12\x3a\xd5\x10\x0c\xba\xeb\x2e\x5d\x42\xaa\x22\x56\x29\x9d\x2a\xe4\x7f\xe3\x0c\x08\x0c\x60\x2b\xa0\x1d\xff\xd2\x03\x72\x0d\x80\x01\xcc\x19\xc8\xeb\x91\x0d\x21\x3b\xf7\xbc\x1b\x77\x42\x67\x71\xce\x0a\x83\x8b\x32\x54\x2e\x03\xe5\x20\x75\x16\x17\x65\x61\xd1\xeb\x6f\x66\xa5\xb5\x52\xaa\x56\xaa\xae\x6b\x57\x51\xcb\x14\x91\xa5\x58\xbd\x8d\x8e\x01\xbd\xe2\x1d\xf6\x3c\xde\xb7\x55\xe9\xdf\xdc\x6b\x49\x3d\x7f\x6b\xe3\x7f\xb3\x8d\x7c\x5d\x8f\xd6\x7f\x1b\x66\x04\xaa\x02\x83\xce\x62\xa2\x9c\x05\x95\xa3\x4b\x88\x5f\x39\x1b\x42\xea\x82\xbe\x07\xbc\x9b\xbb\xf5\xcd\x50\xa4\x20\x39\x08\xae\x90\xe6\x45\xd1\x9a\x39\x6d\xb4\xd3\x80\xeb\x26\x1c\x1b\x97\x2c\x47\x9a\xd7\x75\x1d\xc5\x42\x43\x2d\x7c\x0d\x26\xe2\x47\x74\x60\x41\x14\xfc\xd5\xe6\xfd\xf9\xb4\xda\x0f\x6f\x7c\xec\xaa\xaa\x1c\xd5\xb6\x91\xdd\x4e\x74\xd2\xf0\xee\xc0\xe6\x22\xa4\xd8\xe9\x8e\x9f\x41\x76\x0d\xdc\x40\x41\x06\x6e\x5c\x8c\xa3\x89\xb2\xe0\xfb\xfb\x08\xed\xce\x7b\x41\x44\x49\x9a\x54\x71\x1a\x91\x39\x3e\x85\x45\x39\xb7\x53\x3d\x97\x38\xa4\x66\xce\x42\x4e\xca\x94\x60\xe3\x2a\xd9\x58\xd0\xba\x42\x57\xdc\x4b\x85\x06\xe1\x4e\xfa\x9e\xc6\xdd\x9c\xff\x0a\x44\x5a\xe6\xfc\xe7\x65\xce\xdf\xf5\x61\x95\xb5\xac\xe6\x96\xa9\xbe\x6c\xad\x42\xf8\x54\x30\x99\x1e\x92\x39\x70\x65\x77\x52\x6d\x3b\x68\x65\x40\x0c\x58\x68\x5d\xe0\x3a\x00\xc3\xf5\x98\xc1\xd9\x7b\xa3\xfc\x7b\x9f\x83\xbd\xe9\xa5\xaf\xda\xd6\x37\x19\x9b\x6f\x92\xcb\xe5\xfc\xf8\x3c\xec\xf9\x87\x0f\x6b\xa1\xfa\x58\xce\x1a\x12\x59\x2a\xa1\x45\x99\xc0\x44\x13\x53\xd5\xa6\xc1\x8d\x12\x70\x26\x61\x9e\x32\x4e\x58\xc6\x49\x91\x27\x8e\x67\x4a\x99\x08\x26\xb1\x8d\x93\x21\x2f\x14\x81\xfb\x93\x1a\x8c\x6e\xd0\x64\x8c\x96\xd0\xc9\x9e\x13\x4d\xca\x0e\xe4\x9d\x93\x6d\xa2\x92\xb2\x77\xe3\x54\x8e\x20\x07\x4b\x52\x89\x21\x44\xa4\x0c\x40\xa8\xae\xfa\x2b\x3e\xe9\xed\x29\xde\x58\x7a\x51\xb2\x63\xae\xf0\xfd\xc3\xe9\x97\xb1\xb5\x4b\x22\x75\x48\xcc\x6c\x3d\xa3\x34\x1a\x2f\xe9\x7e\xc5\x1e\xe7\x57\xe9\x63\xa8\x4d\xff\xfa\xf9\x8e\x0a\xf7\x36\x29\x78\x5c\xd5\x2e\x35\xd9\x92\x3f\x2d\xdf\x29\x9c\x02\xcd\xcb\x00\x4e\xde\x87\x6e\x40\x58\xd6\x87\xb8\x30\x0a\xb4\x0e\x69\xff\x63\x0c\x68\x35\x68\xad\x60\xa0\x58\x63\x78\xe4\xfd\x13\x7e\x58\x55\x07\xa2\x6f\x14\xb1\x3c\xc1\xf0\xdd\x77\xef\x9e\xc2\xe3\x0f\xc0\x68\x08\x60\x6a\x39\x53\x98\xd6\x55\xd9\x68\xa1\x09\xec\xce\x96\xa7\x35\x42\xf4\x20\x32\xd7\xcc\xd6\x69\xa9\x98\x60\x93\x50\xf2\xac\x25\x48\x40\x66\x2e\x0d\x88\x41\xe5\xc6\x91\xae\x9c\xdb\x04\x0c\x9e\x4f\x9f\x7f\x83\xb7\xf4\xf3\xcb\x1f\xc0\x37\x6c\x65\x0f\xea\x7f\xda\xd1\x46\x83\x22\x49\xf3\x44\xa5\x25\xa6\xa5\x8d\x53\x82\xcb\x02\x42\xcb\x14\xa2\x25\x83\x30\x89\x9b\xbd\x3d\x9d\x5c\xa0\x35\x08\xb2\xd1\x54\x20\x05\xbc\xd1\x88\x70\x98\xd7\x8a\x89\x16\x43\x96\xe5\xa5\x5c\xb9\x1d\xdc\x5f\x27\x18\x1c\x7d\xb7\x61\x3b\xb3\xe0\xc3\xaf\x77\x7d\x94\x17\x15\x99\x97\x3e\x1c\x0d\xe4\x46\x0a\x21\x54\xc5\x1b\x61\x6a\x61\x14\x3e\x40\xfd\x8b\xd0\x87\xca\xf5\xf9\x34\xf6\x27\xd1\x35\x53\xc5\x4e\xe7\xbe\x2b\xab\xba\xbe\xad\xdd\xe1\x69\xf5\x7f\xf2\x59\xe8\x6f\x6a\xb1\xaf\x65\xe4\xb0\x49\x4b\x8e\x4b\x4a\x33\x5a\x66\x65\x89\x94\x18\x06\x7b\x3a\x45\xb9\x86\xc5\x7c\x16\x65\x5a\x65\x25\xb0\x59\x5e\xe5\x05\x38\x1b\x40\x5c\x6d\x1c\x5e\xc6\xd2\xbd\xe2\xdf\xfe\xfe\x1b\xfc\x9b\x9f\x34\x96\x97\xef\x1e\x3e\x7c\x7f\xfc\x0e\x1c\x7f\xde\x8d\x55\x96\x85\x19\x45\x86\x40\x57\x0a\x26\x5b\x00\xd9\x99\xab\xb3\x4e\x24\x80\x7c\xfc\x0a\xfe\xe6\x4e\x92\x4d\x73\xee\xf4\x59\xea\x30\x01\x5d\x3c\x18\x57\x5c\x83\x1b\xfe\x4d\x2d\x73\x40\xb4\x72\x02\xb6\x95\xe0\x4e\xc3\xf4\xc7\x77\x4f\xbb\x02\x14\x16\x70\x77\x12\x67\xd6\x0b\xab\x06\x0e\x62\x39\x84\x95\xb5\xfa\x1a\x8c\x72\x04\xc9\x6c\x43\xe2\xce\x27\x3e\x80\xcd\x1f\x99\x5e\x71\xd4\x45\x78\xe5\x77\x6f\xab\xcb\x9d\x8e\xe9\xe7\x77\x8f\x1a\x94\x1a\x60\xd7\x68\x2d\x70\xa9\x65\xc5\x5b\xed\x46\xff\x9d\x48\x58\x21\x98\xcb\x42\xe8\xa6\x96\x37\x00\x06\x20\x10\x11\xf6\x31\xc6\xef\xac\xdd\x3f\x3d\x9e\xc3\xd6\x86\xed\xbc\x04\x9d\x15\x71\xc8\x9d\xac\x1b\x1d\x66\xa0\x06\xc1\xdc\xed\x47\x63\xf4\x35\xe0\xc6\x82\xc2\x4f\xf0\xa7\x5a\xe9\x69\x19\x7b\x7b\x25\x47\x73\xa0\x1e\x51\xf6\x61\xb7\xf7\x0d\xa4\xa7\x9b\x38\xe3\x1f\xc0\x8f\x47\x44\xdc\xe4\x4c\x28\x5a\xed\x4e\x31\xe3\x92\x95\xa0\x3e\x50\x85\x73\xa7\xd5\xcb\xb4\x8b\x5d\xe6\x98\x65\x1a\x54\x61\x0e\xba\xfc\xa6\xd3\xb9\x2b\x0e\xca\x6b\x74\x7a\x0d\xad\x6f\xfc\x93\x7e\xcb\x82\xc0\x17\x66\x9e\x80\xef\x1e\xdd\x2f\xbd\x35\x28\x33\xa8\x51\x01\x18\x45\x64\x72\x62\xb9\x5d\x88\x20\x28\xa3\x34\x77\x16\x94\x4e\x80\x24\x47\x02\x70\x85\xa0\xb3\xb0\x91\x5c\x71\x1d\x32\x8e\x25\xe2\xfb\x8e\xe0\x9c\x32\xd5\x68\xd5\xa9\x79\xe4\x24\x35\x19\x0e\x03\xd5\xa9\xda\xb8\xc6\xd4\x66\xce\xd0\x24\x4b\xd3\x48\xbd\x4a\xb3\x07\x7b\xef\xd9\x4f\xbe\xea\xcf\xff\x46\x6f\xed\x6b\xf4\xcc\x91\x58\x67\xac\xd3\x36\x4c\xec\x7c\x5e\x72\xa7\x30\xd9\x14\x8e\xfc\xa7\x7d\xf2\x32\x8a\xf9\x14\xe6\x62\x97\x2e\xf1\x80\x13\xd3\x34\xcd\x72\x9a\xa6\x60\xb7\x2b\x36\x9d\xd0\x3f\x6e\xeb\xf8\xed\xbe\xff\x0b\xa6\x92\x4f\xaf\xa6\x92\xfb\xd4\x24\x29\x60\xa4\x9b\x47\xa4\x2d\x8a\x4d\x5c\xba\x71\x94\x69\x8e\xab\x0c\x04\x30\x9b\xf2\x4c\x2a\x29\x0f\x32\xc7\x48\xc0\x6e\x66\x8e\xa7\x19\xac\x8a\x4e\x60\x12\x0d\x45\x21\x41\x71\x12\x42\x9e\x5f\x5d\x25\xff\xda\xe3\xa5\xc9\x57\x3d\xcc\xb7\xbc\xf7\x7f\xda\xee\xbd\x75\xae\x7b\xbc\x19\xb7\xde\x9b\xb7\x6e\x7a\xc4\xaf\xed\x9e\x77\x37\xb4\xd6\xd6\x5b\xfa\xf9\xa3\x05\x81\xe4\x0a\x04\x17\xa5\x84\x98\x96\x44\xd6\xae\xef\x2b\xe7\x96\x44\xf9\xe5\x64\xc0\xe4\xe2\x14\xc3\x1e\xa6\x3a\xc9\x9a\xcc\xd1\xf9\x5c\x08\x91\xc3\x43\xc2\x18\x63\x73\x03\xe8\x9a\xed\xda\x25\x59\x94\xae\x56\xa5\x53\x42\xb9\x9e\xf1\xb4\x2c\x0b\x88\x32\x49\xa0\x4a\xe2\x12\x6f\x7a\x42\x68\x17\x1f\xc4\x36\x8a\xd5\x29\x69\x99\xaf\xb6\xa1\x3c\xfb\x2e\xfd\xdb\x12\xbc\xfa\x6d\x7b\x64\xf8\x3b\xb0\xc9\xed\x44\x6b\x11\x24\x02\xbc\xef\x15\x55\xe3\x08\x8a\x84\x90\x2c\xcf\x8a\x2c\x4d\x63\xab\xca\xdc\x9d\xcb\x31\xbf\x06\x04\x20\xaa\xe8\x40\x15\xce\x76\x31\x48\xd4\xe9\x74\x3a\xcd\x83\x1b\x9d\x68\x13\x93\xd0\x7e\x66\xa1\x71\xe5\x35\x90\x27\x80\xc3\x7c\xad\x7b\x2c\xdb\x4c\x6e\xd5\x90\x55\x67\x66\xdc\xee\x8b\xbf\x7f\xed\xa1\xff\xfa\xbe\xb8\x41\x17\x7f\xc3\x6d\xf4\x64\xd2\x04\xe8\x72\x9c\x2d\xae\x3a\x14\xdb\x18\x43\x77\x9a\x74\x9a\x2d\x77\x46\x8a\x32\x77\x46\xb9\xd1\xd6\x1e\x64\x81\x90\xcc\xfa\xd5\x70\x14\x19\xd8\xc3\x02\xd3\xa8\xcf\xb3\x5f\x39\x8e\xee\x22\x74\x65\x1e\x6f\x71\x77\xaf\x7a\x99\xfd\xc7\xed\x90\x6e\x25\xc1\xec\xe7\x4f\x0f\xbf\x3e\xa4\xd2\x16\xa0\x87\x10\xa4\x73\x4a\xfb\x41\x64\x89\x4d\x28\x76\xca\x0d\x16\xe1\x2e\x05\x25\xce\x5d\x55\xe6\x83\x1e\x06\x6f\x82\xaa\xcb\xe5\x98\xd2\x2c\x21\x62\x3b\xa8\x13\x59\x8f\xa9\xad\x5f\x8f\x69\xad\x07\x94\x9e\x03\x1e\xbc\x7b\xad\x09\x6d\x41\xc6\xf3\x1b\x67\x97\x01\xe4\x6d\x6c\x07\x90\x79\x80\xf8\xf9\xbc\x9c\x6a\xeb\xda\x30\x07\xb1\x01\x89\x0f\xdb\x8d\x3b\x1b\x37\x99\xb9\xf1\x24\xde\x28\x3c\x6d\xeb\xd1\x1f\x82\x3f\x79\xb5\xe1\xc7\x9f\x3f\x3d\x7f\xff\x61\x59\x1d\xde\xfd\xb0\x4a\xda\x1d\xee\x35\xed\xc0\xe3\x57\x1a\x1e\x51\x1a\x16\xb1\x8d\x41\xed\x68\xc2\x60\x96\x65\x55\xca\xa8\x20\x3a\x9f\xbb\xc8\x50\xa8\x0a\x7a\x19\xc3\xb8\x51\x3c\x75\x83\xb3\x99\x14\xcd\x3e\xad\x9a\xd6\x9a\xb9\x75\x76\xa8\x2a\xe8\xc6\xe6\x04\x44\x38\x82\x33\xe3\x84\xb3\x19\xaa\xf9\x9c\xe7\x9a\x63\x93\xa5\x21\x0c\xf6\x21\xbb\x6a\xdf\x03\xfc\x4a\x91\xf4\xb5\x1e\xb5\xb2\x54\x7d\xe7\xe9\xad\x5a\xe6\xeb\x4e\x3d\x38\x5b\x6f\xb1\x66\xcc\x2f\xa7\x01\x08\x97\x80\xf4\x66\x1e\x79\xdb\xf6\x4d\xd3\xe8\xe6\xa5\x52\x6a\x47\x1b\x97\x1b\x47\xac\x23\x66\x49\xe5\xa3\x80\x05\xe3\xd1\xec\xba\x20\xbb\xa1\xed\xde\xbf\x96\xe1\x3d\x1d\xea\xab\xe8\xe0\xf3\x97\xc7\xe5\x26\xf1\xfd\xbb\x25\xeb\x07\x76\xa7\x84\xc6\xd4\x72\xa9\x94\xea\x99\x23\xa7\xb2\xa4\x18\xa5\x10\x91\x53\x75\x61\x53\xa8\x1b\x87\x28\x10\xc6\x15\xe3\xce\xbc\xb0\x5d\xa7\x09\xa6\xb0\x64\x58\x52\x02\xa5\x05\x69\x71\x0d\x30\x4a\x54\x92\x02\x58\x96\x46\x8d\x5a\x32\xed\xb0\xda\x34\x72\xd0\xb1\x0a\xda\xb7\x5a\xea\x4f\xdf\x76\x68\x6e\xf8\x3a\xa2\x85\x50\x7a\xdf\x1a\x6a\xa8\x72\x0d\xc3\x16\x51\x77\x62\x59\x9d\x96\x2d\x6d\xb8\x90\x4a\x59\x6a\x34\x51\x16\x57\x2a\x37\xba\xb0\x3a\xd8\xfb\x9a\xa0\x3d\x28\x5f\x4d\x58\x7d\x9b\xdf\x30\x12\xab\xa8\xb6\x87\x41\x44\xcb\xbd\xff\x03\xb8\xb5\x8f\xb6\x4e\xdf\xad\xee\xb2\xc7\x45\x06\x3a\x93\x41\x50\xbc\x60\x90\xa4\xb9\x06\x6d\x9a\xa7\x80\x64\x99\x83\xb9\x1b\xa2\xda\x89\x30\x99\xcf\x76\x9e\xc2\xd8\x09\x7b\x73\x00\x3c\x28\x42\x55\x49\xd5\xb2\x21\xe8\x30\x61\xa5\xab\x66\x29\xd4\xe9\xa4\x04\x10\xda\x71\xbd\xf9\xf2\x87\xd3\xa1\xf8\x0b\xbe\x13\xe1\xd4\x56\x42\x14\x28\xa3\xb0\x28\xea\xc6\x9d\xf4\xa1\xd0\x2e\x1b\x4e\xd6\x26\x36\xa5\xa4\xef\xc1\xf4\xe7\xea\xe0\xe7\xa2\x9b\x9e\x64\xfe\x97\xf5\x24\xff\x04\xfe\x11\x3d\xc9\xb3\x6b\x19\x80\x51\xfa\xa6\x27\x99\xcf\x05\x98\x4a\x37\x2c\x3f\x13\x2d\x91\xca\x71\x8e\x55\x59\x04\x41\xe4\x75\xea\xc8\x21\xf3\xf8\x25\xaf\xa1\x91\xdc\xd3\x76\x7c\xca\x77\xef\x0f\x1f\xa1\x5d\x22\xec\xa6\x96\x12\x3b\x55\x38\xc5\x00\xce\x5d\x1d\x8d\x76\x16\xd6\x86\x6a\x16\x87\x6c\xb6\x63\x6a\x53\x05\x94\x4b\x5a\x5d\x01\x31\xc7\x97\x46\x88\x08\xcf\x1d\xb0\x41\x14\x2c\x6b\x3f\xdb\x25\x1b\x9e\xec\x9b\xea\xdc\x9d\x0c\x56\xd4\x56\xa5\x66\x34\x65\x1c\x3b\x64\xd4\xc9\x8e\xbb\xaa\x95\x35\x6f\x76\xc9\x25\x16\x34\xa9\x52\x12\xf6\xd0\x71\x37\x30\x90\x02\xea\x4e\xce\x12\xc0\x41\xee\xf9\x3f\x57\x7c\xa8\x80\x79\xed\xc4\x6e\x63\xb8\x19\x21\x1e\x2a\xfb\x72\xb6\xaf\x1c\x20\x60\xe6\x3a\xcf\x43\xd2\x97\xae\xf3\xba\x54\x20\x05\xd3\x11\x47\xbe\x9e\x0b\x9e\x5f\xdb\xfc\x8f\x37\xbf\xc9\x8f\x3f\x7f\x02\xa9\x0d\x71\x88\xa0\x8b\x67\xc8\x40\x1f\x42\x91\xea\x62\x98\x9b\xb9\xc7\x65\x54\xc2\x18\x33\x9c\xa4\x69\x9a\x13\x24\x8b\x34\xa3\x41\x14\xd8\xa8\x39\x72\xaf\xdd\xb9\x9e\xeb\x57\xec\xec\x7d\xb1\xec\xc3\xf3\xfe\x56\x81\xaf\x2c\x08\x04\x91\x10\x02\x62\x7f\xe1\x16\x30\x4c\xa4\x2e\xbb\xd9\x5b\x0c\xd8\x48\x5d\xc4\x41\xb6\x94\x61\x5c\xb8\xea\x34\x80\x12\x16\x84\x96\xbd\xeb\x18\xf3\x31\x96\xf7\xe7\x20\x5e\x1b\x3d\xbd\x69\xf2\x7f\xad\x6c\xbd\x15\x8f\x6f\x13\xd7\x7d\x93\x75\x1f\x68\xd0\x30\x56\x8a\xbc\x22\x70\xa6\x06\x98\x6b\xb0\x7a\xe2\xcf\x34\x6c\x0c\x61\x8a\xcf\x05\x2b\x79\x29\x0e\xd2\xa5\x2f\x7c\xa5\xaa\x9e\x5d\xbe\x27\x4e\x9e\x67\x7b\x8e\x3a\xd8\x48\x6c\x94\xb0\x54\xab\xb5\x3f\x9e\xf9\x9a\xb6\x0a\xfe\xc6\x23\x89\x96\x6c\xdd\x2f\x69\x5e\x6f\x6f\x79\xac\xc1\x1d\x5e\xe5\x70\xbc\xbb\x13\xb7\xe2\xde\x8a\x4e\x78\xda\xd8\x7c\x02\x45\xcd\x25\x21\xa2\x25\x26\x49\x23\x7b\x81\x61\x3f\x17\xcb\xe6\xea\x3d\xbd\x88\x34\x8f\x24\xd3\x98\x67\x06\xc1\xc2\x4a\xd7\x50\x90\x88\x5a\x3a\x43\x41\xaa\xbb\x52\x8a\x93\x70\xfd\x5e\xb3\x79\x04\x3d\xa1\xcd\x58\xe4\xb9\x70\x2d\x73\xcb\x2d\x20\x60\xe1\x8a\x26\xd1\x09\x03\x99\xab\x6b\x29\x41\xe0\x46\xab\xe8\x49\xd2\x52\xb7\x3e\x97\x81\x41\x7b\xb4\x1b\x7f\xe2\x1b\x13\xc5\xa7\x87\x64\x2d\x2e\x1c\x58\x8a\xf3\x34\xd6\x09\x36\x86\x4c\xda\xf0\xe9\x90\xbe\x98\x22\xc9\x64\x56\x53\x54\x46\x93\xc3\x6e\x74\x56\xab\x01\x4c\x60\x5a\x7b\x64\xe8\x75\x2d\xcc\xd6\x75\x3f\x8c\xbc\x73\xeb\x53\x06\x6e\x22\x43\x87\x55\x90\xf7\xbb\x77\x8f\x07\xa0\x6c\x01\x54\x3e\x70\xd0\x81\x13\xc8\xe0\x78\xb1\xd7\x20\x11\x03\x3d\xe9\x12\x41\xcc\x4f\x1c\x52\x9b\xbb\x73\x76\x10\xd9\x79\x56\x0e\x1b\x5d\x01\x92\x36\x56\xe9\xa1\x06\xb9\xe2\x12\xa8\xdc\x55\x3d\xa0\xc0\x2e\x37\xcd\x21\xd2\x5b\x5f\xe8\x9b\x9e\xd0\x9b\xc1\xec\x37\x3d\xa1\x3b\x85\xa9\xe8\xec\x78\x0e\xf8\xc5\x2e\x13\x02\x1e\x56\x5f\x8e\x75\x23\xd2\x74\xac\x09\xe3\xc6\x0a\x5d\x1d\x90\x6a\x5e\xba\x1d\x6c\x5c\xdc\xb8\xc4\xff\xe8\xd2\x94\x8a\x08\xca\xa5\xa0\x6b\xbf\x96\x7a\x4d\x10\x71\x7b\x7e\xdf\x3d\x7b\x34\xe3\x83\xaf\x6d\x3d\x3f\x3c\xd5\x86\x4b\x1a\xc6\xc6\x5c\x03\xad\x0f\xe2\x22\xe7\xce\xcf\x44\x61\x10\xc9\xa9\x3f\x74\xbf\xc4\x41\x14\xf2\xa0\x3a\xf2\x43\x1e\xfc\x55\xf0\x6e\xad\x56\x84\x91\x9f\x57\xbe\xfb\xad\x4f\x91\x36\x42\x1b\x6e\x78\x5d\x85\xb1\xe1\xba\x12\x46\xb4\x36\x4c\x8c\x50\x95\x30\xb2\xb1\x87\x1c\x3a\xed\x26\xd7\xbb\x9a\x00\x09\x30\x40\x40\x40\x67\xfc\x6f\x1a\x02\x04\x40\xb7\xdf\x9c\xef\xfe\xcd\x8a\x0b\x21\xfe\xbe\x5f\xb1\x91\xff\xfa\x5b\xc7\xf0\xb5\xdb\xf6\xfe\xb0\xff\x95\x55\xf0\xa7\xc7\x4f\x4b\x52\xce\xc3\x34\x49\x6d\x9e\x86\xe8\x97\x33\xdf\xe5\x2f\x27\xdf\x6f\xeb\x76\xbc\x77\x53\x48\xe6\x9a\x73\x56\xa6\x84\x97\xb3\x09\x59\x67\x2f\x76\x3f\xc2\x25\x90\x53\xc2\x95\xd2\x3a\xa6\x79\x99\xea\x01\x93\xcc\x64\x59\xab\x19\xc6\xcb\x31\xc5\x5e\x3b\x89\x6d\x51\x6f\xb1\x66\xa5\xef\x1f\x7f\x05\xe5\x5f\xd6\xd7\xf7\xfe\x7e\x5e\xb2\xd4\xfb\x10\xe7\x08\x89\x43\x73\x05\xc6\xcc\xc4\x09\xb0\x0e\xa6\x19\xa8\xed\xdc\x69\x90\x66\xa9\x43\x4c\x28\x56\x86\x8d\x1b\x3d\x06\x79\xdb\x0e\x4c\xc1\xb4\xd6\x19\x84\x8a\x92\x17\xc3\xd8\x8e\x11\x8a\xe6\xc6\xe5\x0d\xd7\xa0\x0d\x0b\x30\x64\x17\x6a\x1d\xb4\x0e\xd9\x8d\x2f\x82\x7c\x1c\xb0\xfa\x06\x3e\x6f\x58\xc9\x37\xdf\xc0\x1f\x7f\xfa\x9a\x35\xbd\xff\xf0\x97\x7c\xcd\x0f\x41\x23\x2d\x72\xc4\xa5\xf9\xc9\x58\x29\x41\x06\x20\xc2\xf9\xd8\xf1\x66\x70\x50\xaa\x9e\xb5\x20\xb6\x28\x44\xac\x3e\x83\x0c\xbb\xda\x4d\xee\xec\x14\x06\x74\x94\x8c\x09\x0e\xa0\x14\xd6\x52\x97\x24\x87\xa2\x1d\x89\x44\x6f\x06\x82\x25\x75\x6c\x35\x10\x24\x75\xc5\x0c\xcc\x85\x3a\x6b\x89\x2d\xb5\x15\xb1\x48\x70\xc5\x88\xec\x73\xc3\x45\x93\x2e\xb9\x12\x5f\x62\x3b\x7f\x4f\xac\x18\x9f\xff\xeb\xde\x2f\xe4\xa7\xe7\xe3\x63\xf8\xfe\x4d\xba\x34\x7c\xf8\x77\x5f\x6e\x55\xae\x1b\xad\xd8\x57\xb9\x3e\xbd\x2d\x16\xcb\xa8\xdf\x6f\x2c\xeb\x6f\x84\x2e\xfc\x4d\x44\xf2\x0c\xb0\x8b\x06\x65\x9a\x45\x4c\x25\x20\x4f\xd2\x24\x4f\x65\x4a\x09\x2d\x63\x93\xa4\x18\xd1\x3c\x27\x95\xa8\x09\xa5\x14\xc2\x24\x3e\x0d\x2f\x5d\x78\x9e\x13\x0d\x7a\x57\xd4\x51\xa1\x9b\xaa\x4a\xea\x9a\x10\x8c\x13\x88\x8b\xa6\x29\xfa\x5e\xb0\xb9\x3b\x28\x44\x39\x87\x45\x36\xb9\xa9\x9d\xa6\x53\xd6\x4b\x10\x00\xa5\x9a\xc1\x60\xcc\x8a\xdc\x9d\xdb\xb2\x05\x05\x41\x34\x2f\x84\x56\xc4\xd5\x4c\xb9\x56\x60\x5c\x24\x29\xcb\x53\x09\x61\xc2\xe2\xa4\x4c\x62\x19\x27\x3a\xcf\x03\x10\xea\x2b\xfc\x2d\xef\xd2\x50\x87\xd0\x0b\x38\xda\xb9\xbb\x79\x97\x76\x3b\xb8\xea\x4c\xb3\x30\x3f\x62\x9f\xc7\xbd\x3a\x7f\xfe\x25\x5e\xc7\x8f\x37\x5e\xc7\xb2\x85\xb1\x41\xc0\xa6\xb9\x2e\x32\xdf\xfd\xbd\xa1\x91\xab\x5f\x3a\xef\x7d\x95\x85\x4b\xe8\x7e\x5e\xb7\x83\x2c\x04\x84\x05\x21\x8a\x4b\x21\xb8\x22\x21\xa7\x58\x9f\x0d\xe7\x93\x10\x23\xe7\x7e\xee\x22\x3b\xea\x7b\x49\xff\xca\x2b\x74\x6f\x59\xcb\x36\x92\xf5\x1a\xad\x35\xaa\xaf\xab\x7b\x3f\x7e\xb9\xb5\x12\x23\x41\x91\x2a\xca\x59\x01\x6b\x97\x14\x4c\x60\x29\xdb\x4e\x33\x21\x08\xe7\x65\xc6\x38\xd4\xad\x00\x69\xed\xca\x8a\x63\x03\xd9\x41\x96\x02\xf3\xf2\x1a\xf8\x42\x97\xeb\x29\x2d\x35\x17\x82\x1b\x4e\x9c\x11\x34\xb5\x59\x09\x64\x5d\x89\xf3\x08\x06\x62\x5a\xdc\x54\xcb\x1a\x46\x37\x2e\xa2\xf7\x04\x7e\x78\x7e\xf8\xf2\xc3\xdb\xeb\xd3\xc3\x31\xfc\xb8\xbd\xae\x90\xa5\xf0\xf8\xf1\xbb\x68\x24\x8a\xe2\x5c\x51\x9c\x29\x55\xa6\x58\x95\x19\x6e\x65\x53\x40\x51\xee\x74\x0a\x46\x87\x92\xd3\x10\x21\x57\x2e\x6f\x6a\xea\xa2\x34\x03\xe9\xf4\x02\xc3\x21\x03\xd9\xe4\xca\xf9\xe4\x6a\x06\x10\xe8\x97\x34\xb0\x45\xa0\xf0\xfc\x95\xf4\x8a\x0f\x63\x94\xbf\x62\x5a\x9f\xdf\x6f\xba\x48\xdf\xda\x79\x3f\xdf\x02\xa4\x8d\x50\x54\x55\x27\x45\x24\x44\x03\x17\xde\x91\x9a\xbc\x70\x3b\x60\xc2\x25\x1f\x5d\xb2\xd3\x2f\x7c\xd9\xa2\xac\x2b\x39\xc1\x70\x36\x84\xc4\x32\x46\xf9\x39\x4a\x10\x22\x54\x2c\x2b\x7d\xb9\xc4\xf1\xf5\x15\x1d\x49\x58\xaf\xa8\x14\xbf\xd2\xdd\x45\xf2\x0f\xaf\xfd\xf5\x65\xfb\xf2\x58\x1f\xec\xa5\x2d\xa2\x9c\xb1\x02\x67\x28\xc7\xa9\xeb\xed\xf2\x73\xb2\x21\xce\x67\x14\xd6\x4a\x39\x4c\x68\xac\xe2\xb4\x00\x89\x2f\x02\x2e\x5b\x11\x12\xb5\xcc\xbb\xe5\x95\xed\xe5\x6b\xdd\x2b\xbf\xcb\x24\x57\x78\xfe\xab\xa6\x77\xf4\x55\x45\xe7\xcb\xcf\x1f\xc3\x0a\x04\x1e\xdf\x79\x9a\xdb\xfe\x1a\xc0\x65\x3e\xd5\x4b\x76\x5d\x94\x10\x91\xcc\xe4\xa8\xf6\x06\x70\xe9\x00\xf1\xbe\x69\x5b\xd5\x2a\xd5\xba\xc2\x15\xba\x71\x52\x57\xb1\x31\x85\xe0\x99\xc2\xb9\x4e\x95\xf4\xba\xe5\xa9\xc7\x7a\x89\x37\x34\xcc\xf1\xe1\xc9\xdb\x3f\x3f\x3f\xdc\x73\x27\x8f\x75\x72\x36\x2e\x4b\xc1\x64\x5c\x62\x15\xd3\x26\xae\x35\x33\x55\x28\x0c\x9c\x6d\x88\x98\xe1\x3b\xf2\xd2\x47\x86\x1b\x55\x0b\xa7\x85\x95\xb5\xb8\xd5\x27\xa1\xe7\x8d\xfc\xb4\x75\xce\xee\xea\xe5\x3f\x46\xbf\x6f\x92\xfa\x86\xc7\x09\xa1\x49\x92\xbe\xe6\x55\xd3\x4e\x04\x10\x1a\x16\x27\x40\x5d\x85\x18\x41\x29\xa1\x89\x33\x80\xb5\xb9\xa2\x4c\xcb\xb0\x2e\xb1\x81\xf4\xb0\x04\xdb\xc2\xaa\x5a\x4e\x56\x8d\xae\x57\x83\x9a\xeb\xcd\x3d\x10\xaa\xc1\x15\x85\x3b\x37\xf8\x74\xea\x27\x7c\x1e\x82\x28\x10\xd7\xf2\xa8\xf6\x99\xd7\x93\x2d\xee\x94\xab\xb6\xea\xc6\xfe\x95\xcf\xb1\x71\x39\xee\xf4\x14\x56\x2d\xfd\xd6\x84\xed\x8c\xa2\xfc\xcf\x09\x80\x06\x94\x60\xd4\x1e\xe4\x4a\x2e\x45\x6d\xaa\x8b\xf4\x76\x6d\x20\x49\x9d\x72\xb0\x50\x56\xed\x33\xad\xac\xf2\x8a\x05\x5d\xaf\x5c\xad\x54\x98\xcd\x43\x68\x1b\x75\x46\x5c\x52\x95\x85\x89\x8b\x3d\xc7\xe5\xff\x17\x90\x2b\x3b\x56\xfb\xc0\xe7\xd8\x37\x2f\xa6\xff\x10\xfc\xa7\xe0\xbf\x06\xff\x67\x50\x06\xff\xf7\x6b\x27\x72\x7d\x7d\x7e\xf5\x68\x5b\x0d\xf1\xd7\xea\xee\xfd\x3f\xd9\xaf\xff\xe4\xf3\xa7\x9b\x25\xf9\xfd\xff\xf8\xed\x6f\x5f\xad\x72\x3e\x7e\x8e\x7a\xc5\x19\x57\x51\xee\xd1\x4f\x17\x62\x49\x35\x79\xcb\x37\xe5\xac\x3b\xab\x51\x0a\x21\x34\xf8\x7f\x58\xfb\x77\x20\xc9\x71\x3f\x4f\x0c\x27\xc8\x7c\xf0\xee\x7f\xb7\xcb\x9a\x9a\x9e\xe6\xef\xf6\xf1\x63\x6d\x4d\x4f\xe3\x7f\x1b\xa7\x83\xd4\xdb\xdd\x50\xac\x76\x97\xa7\xd5\x4a\x50\x48\x8a\x80\x42\x0e\x4c\x84\x2c\x78\x82\x09\x13\x26\x4c\x98\x30\x69\xd2\xa4\x49\x93\x26\x4d\x9a\x69\xd2\x4c\x93\x66\x4e\x57\x12\xa5\x20\x98\x59\x8f\x9e\x9e\xf9\xdd\x6c\xa8\x67\x32\xab\xab\xb2\x2b\x41\x32\x41\xe0\xfb\xf8\x3c\x30\xc3\x12\xf3\x0d\x5c\xbe\x88\x87\xd1\xe6\xd0\x14\x2e\xe5\x07\x43\xe2\x82\x22\x8d\x48\x1c\xd9\x1c\x2a\xb4\xfc\x4c\xd3\x18\x12\xa4\x21\xfd\x12\xe9\x9c\x68\x92\x74\xc1\x0c\x6a\x1b\x51\xa5\x34\x85\xcd\xc0\x86\x16\xfb\x2e\x2f\x0a\xd4\xa1\x49\x13\x0a\x04\x1d\x8d\x74\xbe\x37\x55\xe9\x0c\x09\xcf\xd2\xe3\x22\x27\x0a\xf5\xac\x64\xe0\xa4\x2b\x5c\x69\xbc\xfc\x08\xd9\x97\x3f\xca\x8b\xd3\x81\x1c\x86\xf0\x1c\x74\x2a\xca\x7d\xbb\xe9\xa3\x7f\x77\x51\x66\x0e\xea\xab\x3f\xde\x86\x9c\xfa\x42\x37\xdf\xbe\xd9\xac\x8b\xf3\x0f\x1f\x8a\x67\xc7\xbb\x4b\x27\xb7\xaf\x66\xc5\xe2\x1c\x9e\xfc\xa1\x04\x14\x64\xc0\x56\x83\x32\xad\x3f\x02\x7c\x10\xcd\xa9\xd4\x20\x62\x69\x95\x51\xe2\xeb\x83\x39\x4f\x55\xa5\x6d\xb7\xe9\xe7\xc8\xab\xc7\xc8\x76\x20\x97\xb4\xa5\x22\x96\x5e\x2b\x23\x3a\x83\x99\x76\x8a\x79\x95\x17\xa4\x47\x8f\x51\x89\x09\xdb\xa4\xd2\x1a\x17\xea\x0b\xf2\x51\xed\xed\x46\x05\x64\x60\x08\xca\x9e\xfd\xe6\xb7\x5f\x91\x7e\x57\xb5\x09\xe0\x36\xc3\x5c\x18\x0d\x24\x30\x08\x9b\x41\x5b\x54\x7a\x11\x57\x33\x4f\xca\xd3\x98\xe0\x99\xc7\x95\x9f\xfc\x88\x0e\x95\x3f\x6c\x94\x1d\x58\x86\x11\x62\xdd\xc0\x18\x45\xa3\xeb\x9d\xeb\xdd\x90\x67\x56\x0e\xa1\xb7\xe2\x36\x6c\x2f\x02\xa6\x63\xf5\xea\x7b\xca\x52\x37\x19\x2e\x92\x68\xc9\x49\x93\x02\xc2\x9d\x61\xc2\xdb\x71\x04\x92\x96\x21\x66\x1b\x2e\xfe\x29\x9f\xa3\x7f\x88\xfe\x4b\xf4\x2f\xd1\xff\xb6\x5c\xe7\x75\xe9\x0e\x9d\x89\x8b\x09\xf1\x6d\xb8\xb8\xdf\x3d\x31\xfb\x93\x0b\x58\x76\xd9\x22\x7f\x4a\x82\x08\x5e\x68\x54\xdc\xff\x70\x65\x90\x5e\xed\xda\xc6\xbc\xb0\x28\x3f\x95\x59\xd1\x5f\x7d\x88\x0b\x0c\x0d\x93\x08\x66\x59\x6a\x32\x5e\x0a\xaa\x3b\x0a\xa1\xcf\x63\xa4\x28\xca\xce\xa7\x3a\x2b\x08\x88\x14\x4c\x87\x1c\x2f\x8b\xe8\xf2\x48\x68\x28\x0f\x6e\x2d\x21\x90\x71\xa7\x2c\xc8\x81\x9c\x95\xf1\x46\x39\xec\xa7\xee\x31\xaa\xeb\xdc\x0f\x2d\x28\x2a\xad\x8a\x3c\x1e\x67\x2e\xcc\x08\xb8\x31\xda\x9f\x1a\x66\x66\xdc\xfa\xbc\xdd\x1c\xeb\xbe\xec\x9a\x28\x89\xa7\x10\x53\xeb\xe8\xcf\xa3\xbf\x8d\xfe\xe5\x05\x52\xe8\xc3\x1a\xd5\x2d\x47\xff\x77\x6b\xcb\xfb\x62\x9d\xb6\x7f\xb2\x55\x7b\x77\x31\x24\xff\xc5\x4b\xef\x37\x25\xc3\x20\x67\xb8\x2e\xcb\xd3\x83\x05\x11\xa2\x80\xe1\xdc\x65\x75\x0f\x8d\x52\xa6\x70\xc2\x32\xd7\x4a\xd3\x76\x92\xa5\x59\x1c\x4a\xf9\xe1\x35\xfd\xfc\x5a\xdd\x09\x56\xec\xb4\x6d\x5c\x8d\xad\xb2\xd6\xa9\x2f\x4d\x3f\x40\x4a\x29\x54\x3d\x80\x45\x66\x8e\x40\x42\x5f\xf7\x19\x20\x68\x1e\xfc\x08\x61\x59\x16\xfd\x00\x1d\xb9\xfe\x83\x11\xa8\xa7\x7f\x30\xf9\x0e\xc2\xb5\x2f\x1a\xe1\x47\x13\x4f\x57\xbe\xf1\xed\xaa\x09\x71\x73\xff\xf1\xfe\xcd\x15\xf6\x06\x82\xc4\xb2\xf1\x47\x4c\x00\xb3\xce\x22\x28\x2a\x3e\x80\xc2\xb9\xc0\x34\xee\xcf\x92\xb6\x49\x26\xcb\x25\x16\x3f\x3c\xc8\x78\xe5\xf7\x45\x34\xc4\x26\x24\x70\x5a\x2f\x7e\x63\xdf\xad\x8c\xd6\x37\x77\xa0\xe9\x9d\x60\x3b\x52\x7d\x39\x6d\xd3\x8d\xf5\x76\x1e\x3c\xe5\x27\x60\x00\x4c\x22\x4f\x00\x0a\x9a\x34\x3b\x30\x3d\xd2\x3d\xd9\xfc\x89\x7a\xda\xd3\x72\xb7\x7d\xff\x63\xcc\x36\xfa\x41\x57\x41\xff\xf2\xf2\x88\xcd\x69\x90\xfd\xe4\xad\xec\xfc\x91\x81\x68\x03\xcf\x26\x96\xda\xdb\x00\x66\x1c\x99\xd0\x8a\x2a\xa9\xa9\x2d\xd7\xbe\xd6\xb2\xa7\xa6\x9b\xe6\x5f\x55\x73\xd9\xa0\x3a\x46\x4a\x72\x5d\xd4\x94\x9e\x69\x15\xe7\xde\xac\xf8\xf5\x33\x4d\x2a\xad\x8d\x70\xe7\x4e\x08\x4d\xe5\xa6\xf1\xfa\x3c\x70\x56\xd8\x82\x68\x5f\x27\x47\x3f\x19\x2f\x4d\xdc\x12\x45\x38\x65\x44\x70\xce\x57\x9e\x64\xf3\x48\x92\x66\x43\xa2\xed\xaa\x3a\x72\xb5\x56\xbf\x48\x4d\x26\xa9\x32\x03\x6d\x2a\x43\xb8\xc5\x25\x1d\x36\x84\x74\x5a\xf1\x8a\x48\x31\xcb\x38\x42\x50\x99\x28\x0e\xba\xa9\xf5\x06\x46\x7f\x15\xf4\xe1\x9f\x2a\xdf\x17\xcd\xc1\x3f\x03\xfb\xd5\x0d\xf3\xe3\xda\x87\xfa\xf4\x39\x69\x81\x72\x01\xbc\x2e\xe0\x54\x1f\xe5\xb1\x75\xb5\x15\x20\xb7\x1d\x25\x40\x7b\x73\xa0\x75\x83\x13\xd5\x34\xb6\xf1\xc7\x8e\x96\x86\x4a\x56\x42\x87\xa9\x6d\x4d\xe3\xfb\x8a\xcb\x80\x13\x04\xcb\x3a\x62\x36\x24\xba\xbf\x20\xb6\x9f\xf0\x28\x4f\x19\xc1\x95\xad\x12\x72\xe5\x9f\xde\x83\x9b\xbb\xbf\x02\x09\x17\x04\xf0\x12\x05\xbb\x44\xdf\x01\xe5\x4d\xe5\x15\xf1\x9a\x82\x82\xfa\x0e\xf0\xd4\x77\x00\x22\x12\x3b\x6f\x37\x64\x09\xe2\x91\x60\xd6\x9f\x02\xdb\xd2\x1b\x56\x95\x93\x23\x54\x5a\x46\xe6\x1e\xa4\xd2\xad\x7a\x42\x6e\x59\xd3\x36\x79\xc0\x02\xdd\x5d\xaf\xe4\x35\xa6\xff\xe1\xc2\xfc\x5f\xeb\xa5\x6b\xd4\xb4\x53\xc6\x18\x55\x3d\x4c\x71\x69\x63\x35\x1f\x0f\xa0\xd2\xde\x1e\x6d\x60\xfb\xab\x83\x2f\x7a\xc3\x0c\xb5\x9b\x9c\xf6\x52\x6a\x3f\x2e\x71\xa2\x39\x0e\xee\x08\xd2\x79\x88\xa1\x3f\xb4\xb6\x06\x59\x8c\x4c\x45\x9d\xf9\xbd\xf7\x44\xe9\xc7\x97\xf7\xc4\x7c\x02\x7a\x5a\xe7\x03\x0f\x1c\x8c\xf1\xca\x84\xbe\xe4\x23\xdb\x17\xb1\xc3\x8a\xd9\x5a\x41\x01\xcb\x67\x7b\x51\x80\xbf\xbd\x03\x9f\x3e\xdf\xef\x7f\x00\x7c\x57\x78\xd8\x39\xd9\xf9\x13\xe2\x26\xcf\x53\x97\x8a\x63\x2b\xbd\x2e\x0a\xc0\x2a\x53\x73\x61\x39\xa1\x54\x1e\x84\x57\x71\xc4\xcb\x13\x65\xc9\x68\xfd\x40\xa4\x51\xcc\xd7\x45\x5e\xc0\x16\x4d\xb2\x64\x09\x63\xc4\x42\x3f\xb6\x8e\x58\x26\x28\xe5\x72\x02\xc5\xdc\xa8\x5a\x93\xdf\x7b\xbe\xca\xd7\xaf\xd6\x00\x04\xc8\xc5\x1b\x24\x0b\x7d\x04\x1d\xfd\x45\x98\x43\xc1\x23\x38\x5a\x66\xcd\x45\x68\xf5\x29\x45\xdc\x6d\xaf\x1a\x9a\x9b\xed\xfb\x68\x03\x0f\x55\x89\xab\xc7\x68\xee\x18\xa0\xc3\xe1\x58\x54\xca\x0f\x60\x80\x65\x4d\x20\xe8\xe6\x5a\xc4\x69\xa5\xdb\xae\x56\x75\xf7\x18\x79\x47\xe2\x26\x11\x59\x21\x74\x39\x37\x93\x76\x27\x98\x19\x37\x3a\xc5\xb1\xb6\xee\xd0\x2f\x7b\x89\xed\x74\xef\x46\x67\x82\x0c\x4c\x04\x22\x13\xeb\xc0\x67\x0a\xfd\xb4\x8f\xe1\x50\xbe\x55\x01\x32\x09\x39\xd4\x67\xb8\x39\x1c\xfc\x94\x64\xe7\x89\x33\xa5\x32\xa6\xe8\xb9\xdd\x48\xcd\x99\xad\xb4\x42\xae\x27\x24\xb5\x69\xde\xbc\xc4\x6f\xfd\x87\xf0\xbe\xef\x7e\xe5\x6d\x45\xc2\x81\x3c\x8b\x4d\x73\xf0\xa7\x04\x9e\x0f\x6b\x05\x49\xf0\x73\x05\xb8\xa9\x5c\x2d\x45\xe9\x46\x4a\x8b\xaa\x28\xba\xe8\x19\x17\x16\x1f\xfe\xe4\xfb\x0a\x20\x7e\xf9\xbe\xe2\xec\x80\x60\xc6\x56\x82\xa7\xee\x48\x69\x5e\xe5\x45\xbf\x62\x7b\xda\xa0\xf7\xa3\x2e\xb8\xb5\x57\x64\xed\x4d\x5b\x91\x89\xae\x52\x04\x6d\x45\x76\xea\xe7\x81\xd0\x16\x4d\x04\x93\x50\xa3\xdf\xa8\xaf\x7e\xb7\x78\xf1\xbb\xaa\x12\x20\xe2\x4b\xd8\x5f\x7a\xdb\xb0\xeb\x2f\x8f\x74\xd5\x29\xd8\xa6\x17\x8f\xe3\xcb\xef\xbe\x2c\xe0\x6e\xd3\x0a\x0a\x49\x32\x57\xe8\xae\x93\x3b\xf5\x73\x57\xe4\xb4\xc5\x27\x49\xf9\xf5\x5a\xd0\x0d\xdc\xa1\x8b\x33\xf8\xb5\xec\xf2\x32\x8f\x09\x9d\xc9\x4f\x9f\xef\xba\x84\xd5\x87\xa1\xce\xbb\x41\x70\x25\x73\xa6\xb9\xd7\xc5\xd8\x75\x6e\xe6\x3b\x54\x1f\xda\x0e\x61\x57\xe2\x99\x11\x9a\xbb\xbc\x88\x05\xad\x20\x04\x38\x48\x79\x04\x6f\xbe\x95\xe3\x7e\xf1\x0f\xda\x86\xde\x5f\xbc\xff\x6b\x10\xc4\xe6\xee\xff\x66\xd5\x7b\xfd\x27\x10\x27\xdb\xf7\xef\x7e\xba\xf9\xf0\x17\x17\xd4\x2a\xcf\xe6\x29\xc7\x56\x3a\x3b\x94\xba\x40\x99\x83\x4d\xd9\xb1\xa3\x1f\xe8\xa1\xa9\x28\xf4\x26\x07\x26\xab\xb2\xb6\xd2\x52\xdb\xcd\xe0\xe8\x69\xac\x27\xe4\xbb\x43\xd5\x80\x14\x7a\x36\x0c\xbd\xb1\x5c\x1b\x10\x81\x12\x3b\x3c\x81\xc2\xa7\xa0\xbb\xe2\x22\x03\xd6\x3d\x60\xc0\xfe\x2a\xf4\x82\xaf\x9c\xd6\xed\x2f\x2e\xc0\x9d\x00\xb0\x3a\x9d\x4e\x85\x3f\x52\xae\x65\xa1\x34\xf4\x27\x5c\x3b\x7f\xd8\xc2\x15\x8e\xc4\x85\xd5\xf3\xe1\x02\x55\xea\xf8\xb2\x64\x07\x2d\xa3\x5d\x2c\x1f\xe9\x5e\xed\x50\xf4\x67\x17\xff\xa4\xff\x1c\x7d\x0c\x7b\xf7\xcb\x64\xf1\xdd\xeb\x6f\x5f\xab\x7a\x84\x36\x52\x78\xde\xb2\xb8\xa0\x94\x37\x45\x47\xa0\xd7\x33\x8f\x21\xa5\xa2\x2e\x5a\x82\xbc\x4a\x0a\x2d\x84\x54\xf3\xa0\x84\x10\x3a\x91\x8a\x77\xb6\x9b\x0f\x5a\x74\xa6\xdb\xa1\x9f\x0f\x8c\xe5\x2e\x47\x5b\xe5\x7e\x1e\x2e\x7f\xd5\x15\x93\xc6\x70\xc1\x96\xcb\xe1\x2b\xe6\x5b\x7f\x10\xa0\x00\x98\xfa\xd6\x0f\x62\xd5\x27\xd8\xc4\xc7\xc7\xf2\x72\x7f\x2f\x51\xf0\x3f\xaf\x71\xc7\xfe\xd9\x99\x75\xb5\xcf\xfd\x7c\x1b\x62\x91\x77\xbf\xf1\xda\xcb\x04\x2e\x49\xe3\xd4\x1f\x0a\xc0\x52\x61\x99\xcc\x14\x83\x30\x6b\x1c\x39\x55\x99\x37\x04\xe4\xde\xc6\xec\x4f\xfc\x83\x79\xd2\x82\x49\x15\x37\xe1\xcb\x0e\x7b\x34\x9e\x3b\x7f\x2a\x5c\xc1\x7a\x55\x3a\xce\x81\x04\xe3\xa0\x9f\x7f\xcc\xbb\xe7\x1f\xcf\x29\x15\x52\x51\x1e\x9e\x57\x2c\x60\x3c\xbd\xc6\x02\xde\x5e\x41\x9d\x17\x28\xe0\xa7\x2b\x16\x90\x5b\x04\xf2\xdc\x76\x16\x97\xba\x66\xd6\x48\x5d\xe2\xaa\x2b\x14\xcf\x0c\xc6\x64\xc5\x02\x5a\xef\x1e\x23\x21\xf8\x60\xb4\x04\x91\x35\x01\x0c\xd8\x9c\x33\x90\x82\xca\x1f\x8f\x34\x8a\x92\xb8\x09\x1a\x3c\x2a\xd4\xac\x3f\xbd\xd6\xdf\xf9\x2b\x70\x17\xaf\xa4\x88\xcf\x9f\x3e\xbf\xc4\xac\xde\x3e\x51\x27\xee\x3e\x82\x25\x56\xd8\x27\x19\x68\xab\x25\xf1\x0e\x92\x1e\x30\x65\x9c\xe7\x65\x99\x66\xa9\x17\x0d\xa8\xb9\xe7\xce\xf9\xc6\x00\xc7\xbd\x28\x03\x48\x52\x79\x12\x33\x80\x7d\x91\x3e\x46\xe9\xf6\x68\xad\xb1\x9e\x8a\xd2\xf7\xd6\xe4\x85\xf2\xb6\x72\x7d\x48\xe9\xc5\x09\x10\xd0\x39\x6b\xfd\xe8\x9c\xc7\x45\x21\xea\x2b\xf7\xa9\x0c\x5a\x7c\xf9\x13\xe6\xee\x4a\xaa\x78\x75\xb5\x3e\x2d\x57\x0b\x28\x9b\x17\x00\xe5\x5a\x0a\x53\x52\x33\xb2\x41\x69\x5b\x96\xed\x00\x0d\x2d\x2a\x8c\x77\xaa\xa8\xab\xb9\xf7\x8d\x10\x9c\x12\x7f\xaa\x75\x05\x52\x25\x40\x0a\xa0\x6b\xce\x78\x0c\x57\x6b\x5d\xb3\x37\xea\x49\x57\xfd\x95\x2f\x42\x9d\x58\xaf\x41\xe7\xcb\x2a\x28\x9f\xda\xaf\x94\xd5\x41\xe2\x42\xaf\xae\x58\x59\xac\xaf\x7f\x37\x69\x93\xc6\xab\x40\x55\x0f\xbf\x2c\x5f\xff\xf2\x7a\xae\x6d\x38\xd7\x3f\xfe\xf2\x5c\x03\x48\x74\x89\xd9\xae\x33\xe3\xe0\x0a\x08\x58\xd1\x18\x6d\xb8\x68\x8f\xfc\xd0\xd8\x8a\xd1\xc7\x08\x14\x48\x6b\x38\x96\x54\xac\xe7\x6b\x7d\x6d\x8c\xd0\xea\x31\x32\x46\x9f\x8c\xbe\xcc\x8e\x08\xa4\xa0\xb9\x62\x45\xd7\xb1\x55\x98\x93\x7f\xf9\x6b\xf8\xd4\xbb\x75\x64\xd0\xda\x12\x90\xa2\x56\xca\x50\xde\xf4\xbc\xab\xb4\xa3\x64\x04\x51\xad\x8a\xae\xbc\x4c\x49\xed\x1b\x6d\x84\x92\x27\xbd\x8e\xb9\x5c\xe2\x73\x0b\xa2\x30\x64\x14\x81\xa0\x53\x5d\xed\xd0\xc5\x13\x2b\x10\xbd\xbe\xae\x68\x2d\x1b\x41\x92\x6d\xa2\x76\x8a\xf1\xdc\x0b\xbe\x6e\xb5\x73\x1d\xb3\xa1\x3e\x77\x3b\x54\x0f\x4d\xeb\xe6\x82\x90\xcc\x66\x79\xdc\x3b\x90\x56\x55\xe0\x3b\x64\x8f\x7c\xd7\x25\xfa\xea\xc3\x7f\x15\xf1\x79\x69\x6d\x12\x67\x35\x38\x80\x42\x78\xe7\x53\x39\x00\x8b\xcb\xbc\x86\x82\x7b\xe8\x1b\x97\x68\x7f\xe4\x56\xb5\xcc\xcb\x02\x22\xdc\xa0\xc7\x88\xe0\xcb\x1e\x06\xa6\x47\xbe\xc7\x49\xb5\xea\xf9\x5d\x4b\x1d\x57\x50\xd1\x0b\x94\xd6\x16\xcf\xac\x3c\xc5\xd8\x64\x15\x92\x74\xd6\xde\xc9\xe4\x98\x0a\x25\x64\x2e\x25\xcc\x93\x74\x46\x30\x67\x35\x3e\x96\xb8\x54\x89\xf1\x78\xcc\xaa\x2c\xe4\x42\x20\xc6\x8f\x72\x6f\x77\x62\xd5\x74\xd8\xbd\xd2\x74\x58\x4e\xe4\x6e\x25\x37\x2e\x67\x72\xbf\x42\x99\x3e\xdf\x7c\xb8\x79\x77\xf3\xe1\x66\x9f\x33\x4e\x68\x41\x48\x0e\x53\xdf\x5a\x3f\x4a\x80\x8d\xe5\x65\xe6\x20\x15\x5e\x6b\x3f\xd5\x0e\x76\x16\x14\x76\x33\xcd\xe4\x98\xd5\x59\x0b\x14\x9d\xb3\xb8\x27\xe7\x13\x82\x69\x4a\x9a\xd2\x4f\x05\x62\x3c\x29\xa0\xc6\x60\xf0\x8c\xc4\x85\x4f\x23\x10\xb1\x24\x0b\x7a\xbd\xff\x6e\x9d\x99\x01\xdb\x19\x6d\xdf\x47\xc9\xa1\xca\x73\xa0\xc1\xc8\x3d\xf1\xcc\x57\x1e\xb2\x58\xee\x34\x82\xb9\x37\x87\xfa\x00\x6a\x2f\x4f\x2e\xf0\x21\xe2\x38\xf0\x6b\x76\xe9\xc5\x99\xf7\x2e\x4b\x5e\x7a\x46\xc4\x11\x78\xff\x63\x74\x7b\xf7\x47\xb0\xec\x3d\xf1\x61\xa3\x29\x3e\x70\x53\x58\x2e\x0b\x94\xf9\x2a\x7d\x8c\xbc\x91\xcb\xd6\x9a\x7a\xa4\x2b\xa1\x9d\xdb\xa5\x0f\xa5\x9f\xc6\xbc\xce\xab\x43\x72\x9a\xcb\xd9\x3d\x46\xda\xc5\x45\x3c\x4d\xd8\x1b\x7f\xa2\x00\x87\x71\xdb\xc0\x39\xd6\x4f\x79\xec\x87\xd7\xcc\x9e\x4f\x1f\x6f\xee\xde\xfe\x70\xbb\x8f\xdf\xc7\x6d\x92\xd5\xa0\xf0\x23\x37\x4a\x14\x52\x21\x78\x9e\xa6\x46\x3a\xd1\x6c\x96\x33\x61\xee\xe1\x20\x79\x5e\x15\x10\x6f\x22\x33\x2d\x79\x6d\x76\x8a\xe2\x4d\x14\xfa\x94\x4f\x7e\xf9\x97\x9d\xfd\xe5\x64\x5e\xbb\x13\x9b\x28\x46\x55\xdf\x53\x65\x64\xa1\x75\x39\x0f\xbd\x61\x8e\x9a\xcd\x01\x54\x9e\x57\x0f\x93\x66\x59\x95\xf1\xe4\x58\xf5\x23\x1b\xd7\x38\x2f\x16\x17\xaf\x96\x17\x9e\xba\x6f\xb2\x64\x49\x9c\x56\xde\xf0\x4a\x2b\xfb\x07\x70\x17\xd7\x71\x13\x9c\x8a\x9a\x01\x68\xee\xdd\xe9\xe0\x3b\x06\x48\x3b\x91\xaa\xec\xcc\x4c\x37\xa7\x25\xb3\x74\xbd\x1f\xfc\x69\x70\xb5\x9d\xa6\xca\x36\x3d\x28\x00\x84\xa7\xe3\xe1\xd8\x07\x0d\xc2\xea\xa2\xfd\xf4\xca\x13\x66\x59\xbb\x62\x1e\xd3\x2a\xa6\x73\x13\xe7\x0f\x28\xce\xe7\x66\x03\x97\xef\xdc\xb9\x76\x2e\x61\x01\xd7\x84\xf7\xd5\x06\x47\x77\x4f\x7c\xaf\xb7\xfb\xcd\x76\xff\xfe\xe6\xa5\x10\xf5\xbb\xe0\x69\xb0\xd9\xbf\x0f\x5d\x9b\xfd\xaa\xc1\xf1\xe3\xbb\x1d\xb8\xb0\xd5\x37\xb9\x24\xc0\x81\x9e\x8e\xbe\xe8\x3b\x49\x14\x61\x9c\x53\xaf\xbc\xa4\xf3\x01\x2c\x51\xd0\x91\x68\x03\x63\xa4\x41\x8d\x2c\xca\xc1\xd1\xd7\x7e\x94\xbe\x4b\xda\x33\x49\xda\x0d\xa6\xd8\x10\x83\x7c\x0e\x4b\xca\x08\x2b\x0b\xa8\x1b\xc6\x07\x6e\x4a\xc4\xe2\x03\x2a\x9c\xae\x18\x2a\x09\x57\xe4\x31\xa2\xb4\x5d\xf5\xb4\xe3\x24\x0f\x6b\x91\x8d\xb6\x11\x7e\xc1\x70\xfe\xfe\xed\xbb\x25\x74\x7c\x77\x89\x1f\x03\x33\x22\x84\x8f\xc9\x85\xb0\x1d\x58\xcf\xdb\xf7\xef\xde\xaf\xa5\xff\x5d\xc6\xb9\xa2\x02\x98\xcc\xc3\x14\xd4\x99\x67\x69\x06\x0e\x99\x47\x45\x21\xa8\x51\x86\xe2\x32\x77\xa8\x13\xae\xf2\x94\x00\xdb\x63\xe8\x61\x0e\x86\x2c\xf5\x75\x0e\x78\xe6\x9b\x1c\xf0\x7a\x67\x97\x23\x27\x8d\x45\x9c\x61\x8b\x39\x21\x96\x18\xc1\x14\x69\x54\x07\x10\xf4\x04\xe4\xd6\x58\x55\xd9\x86\xb8\x92\x32\x68\x51\x0b\x2d\x04\xc8\x8f\x97\xf8\x32\xfb\x15\x2e\x65\xbc\x72\x29\x27\x37\x8e\x56\x08\x42\x1c\x95\xf2\x40\xc6\x0b\x97\x92\xb7\x8d\xab\xd4\xb9\x48\xb8\x3f\xd5\x12\x50\xd0\x46\xd1\x36\xb1\x2f\xf8\xa5\x2b\xca\xf6\x95\x12\xc6\x05\xc1\x77\x1f\x9c\xdd\xbe\x62\xee\x25\x7d\x53\x81\xa8\x6a\xdb\xf1\xe1\x74\x6c\x00\x05\xd1\x63\x14\xc3\xca\x47\x55\x15\x47\x3e\x5a\x1e\x5b\x33\x4d\xd3\xf4\x24\x5c\x04\xa2\xf9\x78\x96\xc6\x24\xd6\xf7\xb5\xcf\x9b\x08\x84\x38\xde\x06\x4c\xc7\x37\xef\xaa\x08\xbc\x8f\xc0\xdd\x26\x05\x53\x75\x3a\x51\x61\x54\xa1\x0d\xf2\xa3\x77\x02\x38\x40\x7d\xbe\xaa\x7e\xba\x87\x46\xf3\xbc\xca\x79\x92\xf9\xc2\x1f\x35\xc0\x31\x0f\xfe\x27\x24\x19\xd6\x6b\x05\x9e\x10\x99\x2f\xaf\x56\x04\x7a\xdf\x01\x56\x01\xec\xfb\xde\x08\xa9\x2a\xd9\x4a\x00\x37\x32\x10\x62\x5d\xe5\xac\x33\xf2\x5c\x26\x95\x3f\x8c\x22\x78\x25\x6e\x6c\xd0\x9f\xc8\x2f\xb8\xb6\xe8\xe5\x0a\x93\xfd\x9b\x50\xbe\xda\xab\x13\x88\xac\x25\xa2\xd0\xb4\x2c\xfd\x08\x22\x2f\xab\x5d\xee\x3c\x0c\x96\xa4\x55\x51\x15\x94\x80\x14\x44\x60\xfa\xb9\xdf\x0d\x11\x88\x5c\xe0\x35\xfc\x26\x56\xee\x70\x6c\xa5\x80\xa8\x20\xa8\x28\xfa\xc9\x4f\x01\x2b\x87\x4e\x27\x6b\x43\x1a\x37\x4d\x60\xbc\x62\xe5\xf6\x31\x7d\xf2\xe8\x86\x01\x1d\xf8\x52\x77\xfd\xcd\xf7\xc9\x2e\xf0\x09\x2e\xdd\xa6\xcb\xf3\xfb\x4f\xe0\xed\xc5\x61\xef\xc7\x04\x7c\xfa\x7c\xff\x03\xb8\x68\x36\xbf\x5a\xe3\xfe\x08\x5e\x80\x5a\xa4\x4d\x33\x90\x57\x66\x64\x80\xca\x3a\x4b\x11\xa2\xb0\x40\x45\x41\xf3\x1c\xb3\x26\x76\x19\xb0\x54\x8a\x96\xfa\x52\x83\xbc\x44\x3d\xf4\xd9\x12\x56\xfa\xe3\x86\xf9\x82\x6a\xce\x0a\x29\x90\x87\x9d\xaa\x27\x7a\x48\xb2\xa1\x16\x4d\xbb\x53\x05\x44\x9a\xf8\xd3\x50\xeb\x09\xb0\x3c\x2f\x20\x87\x39\xcd\x0b\x5e\xe4\x58\x1c\x40\x84\x75\xed\x8c\xb0\xa7\x98\xf9\x96\x71\xee\x4b\x63\xad\xa7\x92\xe5\x55\x41\x80\x63\xfc\xa0\xb4\xec\x2a\xab\xdd\x73\x6c\xb9\x77\x09\xba\xec\x0b\x6f\xbf\xbf\x80\x44\xb7\xa1\x2c\xb5\x7b\xa1\x3d\x96\xf4\x55\x06\xf1\xa9\xd6\xb5\x9f\x8e\xc0\xd2\xd9\xf5\xd4\x33\xdf\x08\xd0\x02\xe7\xa1\x15\x4a\xeb\x04\xe5\x42\x48\x6a\x3b\xd1\xbb\x81\xd6\x35\xb0\x9d\xef\xca\x8a\x82\x0a\x44\xe4\x64\xd4\xc5\x3b\x76\xad\x33\xe8\x27\x3d\xa2\x0f\x97\x18\xf3\xf3\xdb\xfd\x9b\xfb\x8f\xa1\x3b\x76\x7f\xed\xd3\xde\xbc\xfb\x78\xf7\x2e\x00\x30\xbe\x76\x38\x7c\x2f\xf6\xe8\x8c\x45\xae\x9d\xef\xbc\xc9\xab\x0a\x3c\xeb\x25\x5a\x2f\x93\x54\x58\x5d\xce\x53\xdc\x71\x5b\xf7\x64\x6c\x6d\x8f\x9d\x52\x3c\xd1\x7a\x6e\x32\x9b\x1d\x3a\x54\xb8\x2c\xae\x8c\xf1\xca\x7a\x8e\xe4\xa1\x96\xb6\xb6\x76\xaa\x18\x76\xa5\x92\xc4\x60\x16\x0a\x78\x09\x60\xc9\xb4\x7b\xe6\xbb\x7f\x53\x0f\x3c\x7f\x38\x2e\x8f\x5d\x39\x37\x40\x08\xdf\x8a\x65\x9e\xa5\x17\x7d\xff\x6f\x6a\x08\xfe\x52\x7b\xf5\xf6\xb7\x34\x04\x45\x9c\xd7\xc1\x80\x72\xf2\x59\x2c\xbe\x98\x58\x78\x08\x0e\xf3\x11\x6f\xc4\x83\xab\x12\x78\x3e\x5c\x1f\x07\xde\x7a\x4b\x00\x8a\x19\xc8\x40\x5a\x3e\x46\x8f\xd1\xae\xe0\x5c\x09\x25\xd4\xf2\x34\x8f\xe7\x29\x86\xc1\x4c\xa4\xe7\x8f\x91\xe4\xc4\x41\x8a\xa8\x65\x38\xd4\x7c\xa3\x69\x47\x37\xa7\x0b\x13\xf7\x1b\x34\xb0\x0b\x22\xa1\xdf\x48\x9f\x2f\x71\x7c\x1c\x3d\xf0\x38\xf5\x04\xb4\x3e\x4b\x6c\x20\x20\x6e\x4e\xf6\x31\xb2\xbe\xb6\x16\x30\x0b\x22\x5f\x32\x51\x8a\xb5\xa6\xbc\x35\x8f\x64\xcf\x77\xea\xd7\xb8\xd5\xbd\x23\x42\x8b\x42\x6a\xe4\x3b\xe7\x76\xea\xe7\x5a\xf1\xa2\x0e\xdc\x6a\x19\xb0\x5d\xd5\x23\xd9\x8c\x3b\x1c\xfd\x65\xf4\xd3\x37\x54\xeb\x56\xe6\xdb\xfa\xbc\x2c\xc4\x17\x28\xc0\x35\xf6\x18\x05\x67\xba\xa8\x28\xf6\xad\xd0\x73\xa3\xa4\x6f\x9d\x03\x15\xc1\x0e\x97\xc3\x79\xea\x08\xd2\x90\xec\xf0\xcf\x03\xe7\xb9\xcd\x68\xa2\xe7\x1a\x8c\x41\xfe\xb0\x88\xd9\x83\xdb\x4d\x3e\xb2\x15\xb2\x12\x48\xcc\x25\x16\x3c\xda\x45\x22\x2e\x83\x36\xc8\xb3\x76\xdd\xdd\x4b\x34\xce\x15\x62\xb3\x32\xef\xef\x3f\x3e\x41\x6e\x4e\x45\x96\xe0\x9f\xcb\xf8\x98\xe5\xf3\x69\x4b\xbe\xb4\x75\x72\x3a\xa7\x5b\x5b\x7d\x29\x6a\x90\x6f\xa3\x87\xa8\x4e\x9a\x33\xdd\x19\x84\x85\x28\xf2\xc9\x4f\x9c\x3e\x46\x93\xb5\x53\xbb\xfc\x35\xcc\x4b\xfc\x58\xee\x1a\x30\x7d\xdb\xd7\xe4\x25\x60\xb5\xe1\x82\xca\xc2\x12\xf8\x70\xa8\xeb\x0d\x7c\x38\x2c\x0f\x30\xcd\x47\x42\x33\x95\x62\x74\x8c\x9b\x96\xf9\x89\x45\xdb\xc0\xd7\x6d\xc2\x7e\x77\x1f\xfd\xed\xc5\xd7\xf9\x25\xfb\x76\x3d\x8d\xbb\xed\x13\x36\xe6\x26\x60\xa9\xc1\x87\x2c\xde\xbf\xff\x47\xf0\x54\x87\xbb\xf4\x83\x3f\xdc\xdc\xc7\x0d\xc8\x1d\x90\x0e\x40\x7f\x70\xde\x3a\x7f\x8c\x1d\x2e\xc0\xe1\x6c\x92\xec\xcc\x74\x9c\x16\xd0\xf7\x4e\x35\xd2\xca\xd8\x56\x45\x59\xa4\x26\x23\x4e\x97\xcb\x67\xb3\x1d\xea\xba\xae\xad\x73\xce\x95\x94\x9b\x83\x01\xdc\x94\xe5\x8c\x7d\xe7\x8f\x52\x93\x09\x64\x3e\x2f\x91\x85\x3d\x2d\x69\x9c\xcd\x64\xed\xa3\x34\xc1\xff\x17\xbe\xd0\xa7\x78\x52\x27\x0e\x2e\xac\x1f\xef\xde\x5c\x14\x95\xe4\x83\xe5\x49\x7d\x66\x55\x2c\xe6\x20\x49\xe1\x9b\xcd\xe9\x21\xdd\x41\x37\x9e\x59\x9c\x83\x68\x56\xa7\x93\x5f\x75\xaf\x37\x81\x83\xe6\x76\x28\x70\x99\xd7\xcf\x79\x45\x7c\x84\xab\xb3\xe4\xe0\x9f\xef\x5e\xc7\x01\x37\x77\x49\x93\x54\x1e\x42\xd0\xda\x87\x69\xc0\xed\x01\xfa\x03\x20\x40\xf9\x2e\xce\xaa\x79\xac\x42\x1d\x61\x87\xec\xe0\x99\xb5\x20\xb7\xc3\x6c\x40\x3e\x77\x33\x91\x32\x6e\x3d\x09\x05\xdf\x6d\xc4\x2f\xfc\x89\x97\xfa\x88\x77\xbf\xa5\x8f\xc8\x01\x2c\x60\x85\x0b\x00\xe7\x88\x5e\x4f\x2d\x96\xce\x0f\x55\x05\x90\x1f\x7e\x55\x20\x11\xc4\xd1\x63\xbd\x2d\x76\x32\xfa\xf1\xc2\x1c\xb9\x2a\x8f\xbc\x60\x4d\x7c\xb8\xf9\xbc\xd2\xc4\xc3\xb6\x50\x18\x04\xdc\xb8\xfc\x51\x7c\xc5\x90\x90\xd2\x58\x7f\x04\xb9\x28\x89\x76\x3b\x89\x94\xf5\x07\xeb\x8f\xc6\x37\x79\x6e\x29\x76\x69\x16\x9b\xd9\x64\x49\x6a\x01\x14\x9c\x06\x4c\xec\x76\xd9\x87\xf4\x2e\x0a\xab\xc2\xd7\xbe\x69\x7b\x4d\x08\x66\x05\x87\x70\x72\xbb\xe8\x21\xe2\x2c\xb3\x29\xde\xb0\x9f\x87\x5d\xd0\x59\x7c\xde\xcf\xd7\x6a\xe7\x65\xae\xde\x5c\xd9\xc7\x4f\xdd\x95\xd5\x6d\xfa\xc5\x16\x1d\x81\x2e\x68\x64\xc6\x85\x47\x23\x80\xd4\x77\xbd\x3b\xfa\x9e\x02\x32\x7a\x14\xe7\xbe\x4c\xb4\xe1\x42\x8a\x59\x8a\xd2\x62\xbe\xb5\xc7\xa3\xf3\xd9\x32\x8b\x5d\x0b\xe4\x4c\xe3\xda\xbb\xd6\x35\x80\x39\x30\x95\xb4\x95\x42\x5b\xe3\xd8\xda\x73\xd9\x86\xd8\x8d\x07\x0c\xf5\x7f\x78\xc6\x27\xdd\xbc\x8e\x18\x42\x3f\xef\xa5\x71\x42\x50\xd8\xbc\xb9\xdf\x8c\x0d\x18\x84\x2c\x19\xd4\x18\x9f\x4f\x4b\xa6\x3e\x59\xa9\xb5\x99\xb1\xa2\x8e\x48\x90\xad\xba\x74\xfd\x4e\xcf\xcd\xc3\x81\xf3\xcc\x65\x34\x91\x0f\xf5\xe6\x08\x46\x3a\x6a\x65\x9d\x6d\x48\x6b\xe7\x72\xee\xcd\x65\x1e\xb9\x47\xb2\x61\x97\x1c\xed\xf7\x1e\x4f\x5c\x54\xc0\x0a\x51\x52\xa8\x30\x9e\x5d\x05\x14\x68\x8c\x10\x4a\xcd\x8e\x97\x0e\x33\x90\x03\xe7\x43\x42\xaa\xe6\xf6\x61\xe4\x3c\xb3\x29\xb9\x1e\x0f\x19\x95\xb0\x75\xd5\x96\x9d\x9b\xe1\x7c\x50\x6b\x4e\x1a\x74\x4f\x44\xe0\xc8\xaf\xae\x06\xaf\xfa\x8b\x11\x68\x8d\x3d\xf2\xd1\x99\x92\x3b\x82\x39\xc8\x76\x8a\xf8\xae\xd7\x43\x47\xaa\xea\x9c\x27\x19\xc3\x66\x99\xb3\x71\xc4\x82\x57\xe8\xab\xf7\xb9\x7d\x56\x61\xba\xbc\x8f\x31\x98\xb9\x12\x73\x10\x5d\xdf\xc7\x1f\x89\xd2\x67\x98\x40\x02\xf5\xb8\xcc\x23\x12\xf0\xa2\x4b\x7e\xff\x87\x35\x7b\x7b\x8e\x37\xbe\xfa\x66\xcd\x0b\x7f\xf8\x7b\xb0\xbf\x2f\x7e\x0c\x0e\xae\xdf\xdd\x7e\x58\x62\xa7\x5d\x5a\x15\xb4\x73\xd2\x39\x6e\x24\x28\xe7\xb1\xca\xa0\x14\x8a\x30\x52\x29\x90\x2d\xa1\x74\xe3\xa9\xe9\x06\xec\x7c\xe3\x8d\x4a\xb1\x74\xc7\xb4\xca\x65\xbb\xd3\xc5\x50\x4b\x67\x9c\x74\x5a\x82\x12\xe8\xc2\x69\x26\x0c\x27\x7d\x27\x01\xf5\xe4\x31\x72\xbe\xca\x9b\xaa\x2e\x3a\xc3\x41\x1e\x17\x7d\xdd\xd1\x28\x09\x5a\x2f\x75\xc8\xeb\xff\xb0\xea\xfd\x5e\xfb\x9c\xab\xe9\xd1\x4a\xcd\x05\x4f\xfe\x22\xf1\x7e\xb7\x5f\xeb\x9c\xff\x08\x3e\xdf\xdd\xde\x27\x05\x30\x18\xba\x62\xb9\x03\x5a\x33\x29\x3f\x1a\xd5\x8c\x7a\xd0\x7e\x00\x18\x8c\xbe\xf0\xc3\x46\xce\x05\x8c\x5d\x8e\x20\xc1\x07\x9b\xd7\x0e\xc3\x6c\x16\x64\xda\xd6\x42\x16\x9c\xd9\x4e\x9a\x0a\xe4\x7e\x74\xca\xb4\x7e\x34\xb5\xad\xfd\xa8\x38\x84\xa6\x90\x35\x40\xab\xcf\x62\x99\xa0\x9d\x8c\x8a\x27\x5d\xd7\x0f\x6f\x02\x8c\xf1\xd9\x8c\xee\xf2\x59\xdd\xde\xb9\x11\x22\x5b\xc2\x9a\xf2\x2c\x2d\x91\x26\x84\x13\xce\xb9\x13\x82\x83\xbc\xf3\x6a\xab\x38\x2b\xa5\xb1\xbd\xb3\x69\x16\xe8\x46\x8c\x1a\x2d\xcf\xa7\x44\x19\x62\x3b\xd0\x44\x41\x87\x6c\xad\xf3\xde\xaf\x9f\xe1\x7f\x00\xb7\xfb\x7f\x0b\x92\xdd\xfe\x66\xe5\x59\xdf\x06\xb4\xc4\xcd\xfe\x82\x4d\xfc\x71\x57\x29\xca\x72\xe7\x64\x55\x17\x94\xd1\x12\x22\x25\xa9\x41\xca\x90\xaa\x35\x35\xe8\x76\xca\x64\xf9\xdc\xce\xd2\x1f\x0c\x28\xe2\x21\xd6\x79\xfa\xa5\xcb\x0b\x25\xf0\xe4\xc7\xb2\xc3\xa8\xdc\xda\xcc\xd7\x73\xea\x21\x03\x6d\x3c\x82\x0e\x5e\x7b\x3d\x49\xbe\x7b\xaa\xda\xfe\x92\x8f\x7d\x8d\x6a\xdf\xc4\x87\x42\x69\x21\x28\xc9\x31\x65\x9c\x63\xad\x9c\xf2\x59\xec\xb4\x4b\xac\x25\x78\x16\x94\xa4\x2e\xcd\xe3\x12\x16\x0e\x41\x40\x9b\xda\xb8\x43\xd7\x45\xbb\x48\x3d\xe2\x3d\x4b\xd2\xdf\xc1\xfb\xa1\xbf\xe0\xfd\x4c\xa2\xf7\x25\x01\x36\xee\x00\x01\xa4\xf4\x9d\xef\x93\x74\x2e\xc1\xc4\xfc\x44\xfd\x44\x47\x49\x4a\x57\x94\xb0\xb4\x04\xae\xda\x90\x64\xcf\x76\x30\x8c\xf8\xcc\xbe\xbd\xec\x3d\xb7\x77\xaf\xd5\x96\x96\x9f\xed\x99\x3b\x73\xe7\x92\xea\xcc\x09\x28\x6d\xb0\xdc\x89\x66\x09\x22\xdf\x0d\x41\xca\x1c\xfe\x5c\x08\xb1\x1b\xbf\xe4\x5b\xe6\x87\x71\x34\xe3\x7c\x88\xe1\x38\xeb\x70\x7f\x6f\x70\x52\x04\x3d\xa3\x8b\x6f\xf2\x57\x69\xc0\xc5\x37\x99\xc5\xa3\x30\xe2\x48\xda\xce\x1d\x50\xa3\x1d\x2e\xfb\x52\xa9\x72\x57\x9a\xd1\x52\x6a\x4a\xa3\x88\xc1\xbc\x1a\x6a\xa1\x6d\xb4\x09\xbe\xb4\x6e\xa7\x83\xca\xd6\x1a\xe5\xbc\xdd\x5f\xe5\x2c\x77\xbf\x85\xfe\x0d\x05\xe8\x95\x48\x12\x02\x89\x8b\xbe\x7b\xd2\x1b\x94\xe4\x3e\x2d\x60\x5c\xcd\x10\x96\x20\xcf\xa1\x2d\x73\x20\xbc\x5c\xe5\xf5\x7c\x05\xea\xb3\x72\x84\xa8\x53\xe5\x8f\x80\xd1\xbe\x24\xba\x03\x83\x6f\x01\x59\x1f\x3b\x0d\xb9\x11\xc2\x30\x59\x62\x44\x99\xb1\xda\x6a\x6b\x48\xdc\x32\x22\x41\x04\x88\x19\x18\xe1\xd5\x59\xd8\xa0\xd3\xe5\x27\x7b\xd5\x8b\x71\xb1\x7a\xc9\x39\xdf\xbc\xe2\x9c\xeb\x04\xd5\x49\x31\x73\x90\x81\x86\x7a\xe4\xc7\xda\x1f\x3d\x96\xa0\x06\xd9\x2c\xc0\xa1\xaa\xcc\x51\x55\x4b\x86\x9f\x83\x93\xef\x1b\x1b\x04\xd7\xe2\x0d\xb9\xf8\xcd\xbc\x7d\xe6\xf9\xdf\xbf\x2a\x87\x27\xcf\x4c\x92\x2d\xb7\x05\x04\x93\x84\x56\xb5\xca\x2a\xdd\x8b\x41\x0b\x5a\xea\x8e\x11\xc1\x0a\x7f\xca\x77\x0a\x39\xe3\xfc\xf2\x71\x37\xd6\x0d\x07\x6b\xdc\xe9\x00\x72\xc5\x81\x14\xbe\x1d\x41\x0a\x14\x8e\xe2\x0d\xbf\x8c\xf9\x54\x7f\xff\xd5\x21\xb7\xdc\x96\xe0\xc8\xa0\x53\xb5\x32\x4a\xb5\xa2\x57\x82\x21\xdd\x52\x2a\x44\xe1\xc7\x9d\x42\x7e\x74\xf3\xc1\xf7\x5d\x65\x6d\xd7\x1b\x63\xc7\x01\xe4\x42\x00\x63\x7d\x7b\x04\x19\x70\x51\x04\x40\xf3\x58\x6e\x0e\x09\x0c\x33\x78\x59\x93\xee\xbe\x7f\x49\x1c\xfa\x78\x1f\x22\xda\x35\xbe\x4d\x1c\xca\x4f\x5e\xa4\x40\x51\x55\xb2\x42\xe3\x3c\x3f\xe6\x27\x69\xa4\x05\x45\x5e\x24\xb0\xa4\xc1\x8b\xd2\xe5\x3a\xa3\x83\x9f\x1a\x4d\x4f\x20\x35\x18\x06\x8e\x2a\x4a\x58\xf0\x6c\x5f\xe3\xb7\xab\xcf\xee\xcd\x87\x4f\x4f\xee\x06\xc8\x15\x10\xa0\x59\xb7\x88\x5d\x67\xcb\x4e\x15\xb4\x9c\x6d\x2c\x99\xaf\x95\x77\xea\xff\xb3\xf7\x89\x93\xd3\xa5\x16\xbc\x22\x8c\xde\x6e\xbf\x7b\x1b\x50\x63\xdf\x5d\x29\x03\x2b\x98\x2e\x4e\xf6\xef\x3f\xff\x74\xf3\xe1\xbb\xb7\x17\x28\xaf\xca\x3c\xce\xa1\x64\xd6\x54\xa4\x24\xa9\xc9\x05\xb3\xa2\x1e\xe8\xc9\x91\x7c\xcc\x8f\x99\x4b\xb3\x23\x85\x16\xb2\x4d\x67\x89\x6f\xba\x0e\x44\xc4\xbb\xa3\x9f\x86\x62\xd0\x00\x36\xda\xba\x0e\x64\xc0\x42\x0b\x27\x80\xfc\x61\x04\x07\x53\xa1\xca\x3c\x79\x80\xb1\x27\x9f\xe8\xe8\xe5\x2a\xf2\x5a\x26\xe7\x99\xa1\xa9\x81\xa9\x80\x09\x72\x03\xed\xb3\x2c\x4e\x03\x88\x57\x87\xe0\xf4\x9a\xce\xa7\x25\x81\x70\xf5\x5c\x34\xd6\x1f\x00\xb4\x4d\x3c\xd6\x1e\xd6\x1e\x55\x4b\x2e\xda\x5c\xf4\xb9\x7f\x25\x17\xed\x1c\x33\x9c\x14\x5c\x90\xe5\x7e\xdb\xa9\x9f\x5d\x28\xa3\xd0\xad\x0c\x3a\x5f\x49\x24\x1f\xc9\xd6\x04\xff\xe0\xff\x26\xe2\xbf\x70\xae\xbd\xfa\x17\x6c\xdf\xee\xdf\xbc\x14\x09\x58\xed\x6b\x3f\xbc\x01\x2f\xa5\x31\xc3\x15\x7e\x51\xd8\xfa\x07\xf0\xac\x88\xf9\xe9\xf3\xfa\x7c\x17\x57\x76\xd9\x92\xe3\x1c\x97\x0a\xe6\xe7\x51\x1b\x05\x5a\xa0\xb2\x53\xe9\x1c\x49\x4d\xca\xfd\x69\x52\x63\x7e\xb2\x5e\x27\xd6\xeb\xbc\x60\x48\x30\xce\x78\x25\x0d\x95\x52\x20\x52\x50\x52\x14\xbd\x3f\x11\x50\x1c\xd3\xac\x39\x91\xa9\x83\xb5\xe4\xbd\xf3\xcd\x4e\x33\xcd\x95\xa0\x0c\xc1\xb9\xf7\x85\x77\x74\x89\xf0\x62\x33\xa8\xa2\xc8\xf3\x9c\x41\x59\x62\x8c\x72\x59\xb0\xd2\x1b\x95\xe7\x44\x10\xa1\x68\xa9\x2d\x55\xb2\x74\x2e\xb3\x39\x63\xa9\x66\x8a\x55\x45\x61\xa8\x2e\x35\xe4\x85\xc4\x34\xe4\x63\x4b\x6c\xbf\xcc\xb7\xab\xf7\xc7\xbf\xfc\x29\x86\xc5\xa7\xcf\x1f\xc3\xe2\x7a\x25\x59\xec\x97\xc8\xe5\x85\xfe\xce\xe7\x0b\xbb\x34\x69\x5d\x09\xb2\x25\xd5\x81\xc0\x7a\x76\xe9\xb6\x1a\xd0\x9c\x85\x2d\xa0\x34\x0c\x01\xfd\xbc\xbe\x9e\x92\xbe\x04\x30\x97\x56\xb8\xa2\x15\x18\x65\xbe\x2d\x7d\x9d\x79\x26\x81\xcc\xfd\xb4\xd3\xc8\x91\x12\x73\xae\x45\xa8\x95\x60\x30\x22\x48\xeb\x21\xe5\xbe\x15\x62\x5c\xff\x3f\xf9\xa6\x2a\x5c\x51\xba\x93\xa7\x9d\xaa\x01\xbd\xc4\x9f\x1b\xbd\x83\xab\x9a\xfc\xed\x35\x67\xba\xbf\xb9\x7b\x13\x4c\x99\x3e\x06\xa5\x46\x70\x73\x77\x53\x25\x7d\x77\x38\x04\x18\xad\x06\xd1\x34\xb5\xb1\xf0\xd3\x0e\xba\xb9\x72\xe7\x26\xa1\xb9\x4f\x7d\x27\x41\x0e\x9a\xdc\xc5\x3c\x58\x63\x56\x81\x4f\x9a\x90\xdd\x14\xf8\xcc\xe1\x9e\xdf\xbc\xbd\xf0\x93\xde\xfd\xf8\xee\xf3\x66\xfb\xe3\x0e\xcb\x7e\x04\xd9\xc8\x1f\x23\xdf\xfb\xca\xf3\x12\x08\x00\x7d\x40\x19\x0b\x80\x40\xb6\x33\xaa\xd1\xda\x9a\xda\x36\xc6\x0a\x27\x85\x56\xc6\x5d\xb5\xc6\x92\xf2\xb7\xb4\xc6\x60\x95\x14\x73\x09\x20\xe8\x99\xc7\x7e\x58\x0e\x1d\x0a\xd0\x81\x6c\x66\xb1\xee\x3a\xeb\x07\x57\x2f\x99\x90\x8b\xa5\x6f\x06\xd3\x00\xf8\xa4\x61\x56\xfe\xfa\x9e\x74\x79\x5f\x0e\x72\xd0\x32\x0f\xfd\x58\xf9\xd1\x63\x11\xf6\x24\x09\x3a\xad\x4d\xc7\x6b\x0b\x32\x8f\xc0\xc1\x9f\x9c\x95\x5d\xc8\x17\x4c\x7c\xd8\xeb\x9d\xb8\x68\x98\xbd\xa8\x48\x24\xdf\xa8\x50\x00\x18\xdb\x2a\xb6\xb3\xac\x66\x59\x01\x5e\xc5\xa7\xb0\x1c\x56\x73\x5a\xf9\x6a\xdb\xd5\xb5\xad\x6b\x7f\x6c\xdb\xae\xb3\xab\x0b\x73\x1c\x89\x4d\x1a\x6a\x39\xd9\x8a\xd2\xdb\x5f\x9d\x82\xef\xf7\xab\xe9\xdd\xee\xf9\x27\xe1\x07\x6d\x85\xc1\xd1\x1f\xcb\xb2\x2e\x19\x67\x88\xda\x63\x52\xbb\xbc\x88\xb1\x6f\x30\xb2\x25\x55\x92\xdb\x71\x67\x90\x71\x4c\x70\x67\x5c\xc9\xe4\x11\x40\x44\x4a\x17\x94\xba\x3b\x2e\xc6\xe8\xf5\xb8\xf7\x7f\x6a\xdc\x7d\x40\xd5\x3d\x8f\x5c\x11\x2a\x5e\x8f\x4c\x70\x55\x32\x45\x72\x82\xcd\xf1\x9b\x63\x87\xef\x25\xe4\x58\x4e\x17\xdc\xf1\xaa\x0b\x77\x13\x22\xc7\x78\xff\xa4\x0c\xf7\xfe\xaa\x98\xf0\x7d\x50\xd8\xb9\xdb\xc2\xfe\xa4\x80\x68\x2d\x04\x29\x40\xcb\x62\x43\x61\x5d\x50\xef\x92\x7e\x3a\x09\x00\xf5\x79\xdc\x0a\xdf\x76\x0a\x40\x60\x28\xf1\x43\x5d\x55\xb9\xae\x50\xa5\xbd\x75\xd0\xa3\xce\x1e\x96\xfb\x65\x13\x4d\x8f\x64\x9f\x6d\xaa\x10\x3f\xde\x85\x8e\xca\x8b\xf8\x71\xfb\x76\x7b\x59\xf0\xaf\x30\xbb\x8f\xcb\x5c\x5c\xb7\xa0\xac\x7a\x28\xaa\x6a\x33\x3e\x14\xc9\xa9\xf4\x1a\x0c\x1e\x59\x37\xf2\xa3\xf5\x06\x1c\x7c\x85\xc0\x01\x14\x9a\x1a\xa2\x37\xd5\x97\x9a\xd2\x2d\x7b\x30\xc9\xb1\x54\xc8\x69\x4f\x00\xef\x94\x16\xb5\xb6\x85\xce\x3d\x96\x86\x1a\x19\x81\x48\x6d\x0e\x7b\x13\xea\x5d\xd1\xed\x37\x66\x91\x02\x63\x1d\xa7\xd5\xb2\xec\x56\xf3\xa9\xf6\xc5\xf6\x68\x97\x3f\x3a\xc8\x52\x47\x9b\x18\x07\x7d\x7d\xf5\xc2\x91\xea\x2b\xad\xba\x9b\xbb\x6f\xd5\x7a\x9f\x04\xd2\xef\x5e\x09\xa4\x6b\x90\x55\xcb\xae\x96\xf9\xc9\x1f\x42\x93\x08\xce\x87\x4b\xc9\xb7\x8a\x99\x2f\xc0\x38\x8f\x71\xe1\x73\x70\x7c\x8c\xfc\x94\x60\xaf\x4e\x17\xc3\x08\xb9\x9d\xcc\xf2\x67\x52\x5e\x29\x23\x8d\xb2\x36\x7c\x01\x46\x4d\x4a\x29\x9f\x29\xa5\xa2\x34\x52\x8f\x64\x2f\x12\x72\xa9\x54\xae\xdc\x9a\xcf\xd1\x3f\x04\x5d\xaa\xe7\xff\x9e\x16\xdb\x7f\x02\x77\x37\x2f\xe9\x6e\xfb\x5f\xd1\xd2\xde\x67\xb3\x88\xd9\x5c\x87\xc7\x94\x09\x53\x90\x82\x15\x65\x56\x7c\xe1\x71\x33\x1f\xe3\x7c\x7d\xb4\xa6\x64\x9a\x83\xae\xcc\x5c\x86\x93\x94\x97\x1a\xb3\x86\xe6\x36\x27\x09\x91\x54\x50\x41\x7d\x67\x33\x93\x15\x5d\xec\xba\xd0\x9d\x6c\x29\xb5\xb0\x96\x44\x4b\xa3\x91\x53\xb9\x90\x58\x71\x2c\x25\x54\x81\x73\x1c\xb1\x44\x85\x9c\xfd\x0f\xd1\x1f\xa3\x0f\xd1\xff\x1a\xfd\x1f\xd1\xff\xf9\x14\xaf\xbe\xc8\x13\xfe\x09\xac\x5f\x57\x2e\xe7\xbb\x27\x59\x99\x37\xf7\x6f\x02\xe0\xfc\xe3\xfd\x1f\xc1\x2b\xda\xf8\xc7\xbb\x70\xf3\xbd\xbd\x18\x9e\x6c\x03\xbe\x22\x92\x48\xbb\xa6\x3c\xd4\x6d\xb5\x24\x13\x04\x43\xc8\x1d\xa3\x42\x41\x3f\x3c\xf0\xa3\x99\xcc\x31\x3c\x69\x99\x66\xb1\x23\x32\x2b\x0a\x9c\xe7\xf9\xdc\xe2\xa2\x64\x9a\x81\xd6\x13\xdd\x34\x3b\x5d\x60\x2c\xad\x2a\xa1\x41\x4c\x40\x55\xe4\x08\x97\x08\xca\x9a\x51\xcc\x64\x87\x71\x59\x0a\x42\x10\x2a\x60\x9e\xfb\xca\xa4\x32\x25\x1d\x85\x88\x4a\xee\x4f\x9c\x46\xdb\x90\xf3\xd5\x89\x0e\x35\xda\xf7\xd1\xdf\x86\x8e\x6d\xe8\x34\xff\xf4\xfe\x26\x18\xe6\x5f\x7b\xcb\x3f\x5d\x9a\xcb\xfb\xdd\xfd\x7e\xf7\xe7\xd7\x0e\xf3\xf6\x65\x37\x7a\x93\xa9\x12\x68\x30\x52\x2d\x1f\x3a\xa0\xa1\xcf\x88\xd2\x30\xc6\x2d\x70\x79\x61\x71\x01\x3a\x3f\xf8\x13\x42\x69\x9b\x41\xb2\x02\xca\xbd\x3a\x8c\x8a\x8a\x65\xcd\x23\x5e\x7b\x99\x68\x82\x04\xb1\x79\xe1\x65\x43\x35\xa3\xb1\x82\xb9\x95\x35\x84\x10\x97\x44\xe4\x39\x49\x53\x1b\x44\xd1\xdb\x02\x13\x46\x08\xce\x0a\xa5\xcb\x75\x9f\x88\xfb\x9d\x08\xd1\x7e\x40\xd7\xc6\xc9\xa7\x7f\x02\x6f\x83\x59\x62\xb8\xf9\x2f\x7c\x06\x10\x31\x4a\x88\x6d\x47\x2d\x0a\x4b\x3d\xe1\x00\x71\xd7\x42\x2d\xa5\xce\x6b\x61\x45\x72\x4a\x33\x5b\x23\x4f\xfd\xa9\x28\x9a\x6c\xe6\xbe\xd2\x20\x05\x04\x17\xda\x0e\x79\xa6\x27\x60\xa0\xb7\x2b\x16\x9b\x3c\x96\xbb\x36\xb6\xbf\x5a\x33\xdf\x7e\xbc\xfb\xab\xf8\xee\xe3\xae\xbd\x94\xcc\xf1\x43\x6b\x37\x87\x87\x76\x43\x62\x3b\x73\xc6\x52\x9b\x92\x62\x4a\xc8\x24\xa5\x96\x17\x7d\x70\x11\x57\x61\xfd\xfe\x43\x84\xa2\xff\xe5\xb9\x06\xf3\x67\xcf\x98\xbc\xbb\x55\x5b\x25\xb9\xfb\xfc\xe1\x1a\xc9\x5c\x7f\xbc\x4c\xc7\x6f\xff\x18\xa4\xb1\x2c\x32\x9b\x65\x71\x93\x0a\xcd\xfb\x7c\x90\x45\x91\xce\x4d\x35\x1f\x4b\x50\x69\x9f\x69\x20\x33\x9b\x01\x99\x73\x49\x45\xde\x22\x98\xfa\x93\xf2\x23\x1d\x84\x3f\x26\xee\xc5\x8b\xbc\x58\x5f\x34\x7e\xa2\xbd\xf4\xc7\x5d\x8e\xca\x0c\xc3\xa3\xc9\x75\x0e\xc9\x80\x0d\x64\xbe\x21\xe4\x31\xb2\xa9\x42\x7c\x60\x0a\x2b\x5d\x96\xd7\x6f\xa9\x42\x2a\x60\x66\xa3\xc7\x25\x0e\x51\x01\xff\xf2\xe1\x26\x54\x82\xef\x6f\x76\xdb\xf7\x9b\xa8\x3a\xf6\x55\x75\xf4\x23\xd9\x15\x0f\x04\x97\x1b\x77\x1a\xe2\x88\x94\x64\xc5\x63\x46\x97\x1e\xfa\xaa\x49\xf4\xdf\x07\x66\xcf\x72\x8f\x6e\x9f\x37\xb6\x37\x77\x1f\xaf\xcb\xfd\xa7\xcf\xdb\xf7\x45\x72\xf7\xd3\xfb\xbb\xdd\x92\xd7\x80\x5f\x10\x2a\xaf\x3d\x94\x9d\x23\x07\x7f\x82\x28\x6e\x7c\xe3\x4e\xc4\xc8\xf3\x24\x34\x5f\x62\x14\x60\x31\xf4\x2d\x02\xe3\x11\x1c\x4b\xe8\xa7\x8c\x2d\x6b\x68\x82\x05\x2f\x69\x51\x22\x96\x9f\x5b\x0b\xb2\x27\xff\x92\x9d\xd2\x45\x5e\x96\xc6\x11\x87\xc9\x78\x62\xa5\x52\xc6\x94\x38\xb3\x3e\x43\x65\xee\x3b\xe9\xeb\x59\x5d\x69\x99\x87\x99\x25\xe8\xe8\xad\xd2\x17\x5d\x8a\x72\xaf\x76\xe2\x95\x06\xf6\xda\x83\x7a\xd1\x37\x0b\x5d\x81\x1f\x6e\x9f\xf4\xd9\x63\xb5\xac\xf3\x6b\x5f\x1d\xb0\x2f\x07\x80\xfd\x04\x9a\xb0\x90\xb7\x7d\xe7\xaa\x83\x67\xae\x1b\xcd\x69\x73\xba\x9a\xbd\xb9\xf9\xe4\xdc\x25\xa9\x29\x3a\x7f\x52\xa7\x89\x11\xdf\x36\xaa\x8f\xe2\xd8\x3e\x92\xbd\xf9\x93\xbe\x7d\x68\xc3\xe6\x8a\x98\xf8\x50\xfb\xa8\x16\x5a\x00\xee\x7c\x0d\x58\x80\x21\x04\xdf\xbe\xd3\x39\x95\x32\x29\x6a\xad\x80\x8d\xf3\xe0\xdb\x07\xa2\xf2\x82\xa7\xf8\xe3\xca\xf1\xfc\x45\x09\x6b\xc5\x0d\x84\xfe\x40\x7c\xca\x8f\x94\x07\x8a\x31\xd4\x16\x37\xce\x9f\x40\x5a\x8d\xa3\x48\x2a\xab\x67\x7b\x41\xea\x9e\x30\xae\xcb\x12\xb8\x8b\xa8\x60\x8d\x57\xfc\x09\x7f\x34\xa1\xb7\x72\x51\x5c\x79\x6a\x3c\xde\x2c\x71\xf3\x26\x4a\xdc\x43\xbf\xc9\xcf\x26\x41\xe7\x21\xb6\xc0\x7a\xeb\x76\xb5\xf3\x76\x16\x71\xba\x5c\xa1\x27\x5d\x38\x19\xf6\xf2\x1f\xa3\xff\x78\xc1\x78\xbe\x7d\x61\x7b\xf1\xdd\x6d\x30\x9a\x4d\x9e\x79\xe1\xab\xdf\xc0\xab\x7a\xf7\xda\x29\x4c\x1d\x4d\x0a\x69\xb8\x29\xac\x40\x30\x9d\x91\xd0\x0a\xa4\x0e\x08\x0b\x84\x77\xd6\x1e\x04\x88\xac\x3f\xc4\xed\x12\xe6\x51\x0f\x09\x92\x88\xc6\xdc\x2c\xb1\xc7\x4e\xa1\xf6\x01\x79\x93\x55\x19\xc8\x37\x51\xad\x39\xc8\x66\xb3\xc4\x2a\x66\x66\x71\x7e\x74\xc6\x4d\x71\x86\x96\x4d\x0d\x72\x51\x72\xe6\x4b\x53\x51\x67\xc3\xfa\x74\xba\xd4\xa0\xff\x18\xfd\xdf\x91\x78\xcd\x5c\xf9\x65\x0c\x11\x1c\x08\xdf\xac\x3a\xa4\x77\x2f\xd5\x4b\x5f\x8a\x97\xbe\xbf\xfb\x26\xb5\xff\x5d\x78\x8b\xfd\xfb\x1f\xaf\x12\x1c\x0c\x03\x4c\x60\x0d\x4b\x50\xcc\x63\xc8\x33\xf1\x97\x21\xa6\x6b\x9b\x19\x40\x88\x81\xc2\x27\x80\xb3\xd4\xa5\x19\x68\x3d\xcf\xa1\x64\x5c\xe8\x12\x23\x68\xa8\x95\xcb\xc6\xd8\x2e\xf7\x5d\x63\x75\x6e\x1d\xd5\x8c\xe4\x8c\x97\xd6\x21\xc0\x7c\x03\xe8\x01\x81\x32\xc9\x4a\xa4\x51\xb9\xd3\x5c\x70\x5e\x30\x62\xb8\x16\x5a\x0b\xcd\x0d\xc1\x73\xaa\x0a\xa1\x8c\x51\xda\x08\xc6\xb9\x66\xb2\x45\xfe\xd0\x31\x6a\x08\x33\xad\xc9\x72\x55\xe4\x2d\xa7\x85\x85\xa5\xce\x72\x83\x2a\x4d\x33\x95\x23\xc2\x30\x23\x51\x12\x8b\x50\x07\x37\x11\x8e\xfe\xaf\xe8\xff\x59\xd6\xa7\x4f\x1f\x97\x35\xf5\xe6\x43\xf6\x54\x72\x7e\x75\x7d\x76\x2f\xae\xcf\x0b\x71\x84\xfb\xcb\x46\xb4\xff\x1c\xc8\x92\xef\x9f\xb6\xa1\xcf\x6f\x77\xdb\x57\x2f\xfd\xf4\xea\xb5\xd8\x0d\xa9\x4d\x41\x5a\x3a\x5c\xe7\x85\x2a\x51\xe3\x73\x08\x09\x36\x94\x13\x04\x0b\x8b\x6a\x66\x5c\x4f\xa6\xa0\x94\x9c\xd5\x8a\x73\x55\xb6\xbc\x43\x5d\x52\x95\x18\x16\x5a\xd7\x55\x26\x51\xae\xb2\xaa\x2b\xa4\x60\xbc\x50\xd4\x94\xe7\xae\x44\xb0\x30\xba\x76\xcb\x6b\x32\xcd\xaa\x16\xaa\xe5\xca\x2d\x2f\xc6\x25\xc2\x02\x94\x49\x7a\xee\xfd\x04\x21\x25\x4c\x6b\x4e\x38\x31\x5c\xba\xf2\xd4\x4a\x62\x28\xb7\x0d\x23\xc2\x08\xfa\x18\x55\xa6\x02\x34\xc1\x69\x46\x08\xf2\x63\x87\x70\xa1\x2b\xa8\x70\x21\x75\x53\x64\xc6\x9e\xe0\xa0\xd7\xd7\xa6\x61\x7d\xad\xc4\x2f\x5f\x5c\xd7\xf1\x3e\xe4\x0a\xcf\x5a\x66\xef\x82\xbe\xdc\x37\xd0\x50\xdb\x5f\xa2\x18\xd6\x49\x56\x3a\x07\x7a\x67\xed\xf0\x40\x26\x07\x10\xe8\x3d\xbe\x3e\x32\x51\xf9\xae\x04\x69\x5c\x1e\x5b\xd1\x1f\xb6\x7a\x9a\xa6\xc9\x9e\xad\xb5\x89\xec\xfb\xf9\xd8\xcf\x63\xef\x8d\xac\x94\x65\x56\x58\x53\xa9\x95\x4f\x41\x1e\x49\x02\x2f\x78\xaf\xbb\x6f\xe2\xbd\x0c\x88\xdc\x34\x39\x29\x28\x75\x4c\xc9\x23\x99\x5e\x00\xbe\x6a\x7d\xce\x12\xe1\x4f\xcd\xaa\x9e\x0f\x62\xfd\x48\x83\xbe\x7c\xf0\x6b\xfb\xfe\xb5\x14\x75\xb6\x24\x47\x7f\x00\x3b\x55\xc2\x3c\xad\x53\xee\x6c\xe9\x6d\xd3\x4b\x40\x76\xd9\x17\x46\xb1\x43\xbd\x22\x6a\x8b\xe7\xde\x3b\x8f\x5b\x03\x8a\xd8\xc6\x66\x3d\x4e\xf4\x48\x2e\xd8\xe2\xf5\x38\xbf\x46\x5a\xdd\xde\x69\x00\x2b\x90\xfb\x63\xa3\x85\xe0\x15\xaf\x25\x48\xb9\x3f\x5e\x8e\x95\x76\xad\x6b\xcc\x39\x4a\x8c\x9f\x96\x01\x41\x77\xe1\xd5\xe8\x8d\x8e\xfe\xe3\x4b\xbd\xe5\xdd\x6a\xdc\xff\x0b\xd2\xe0\xd3\x6a\xa7\x63\x4c\xb0\x2d\x8a\xe4\xf4\x50\x69\x06\xfa\x2a\xe6\x42\x10\x0e\x4d\x89\x7d\x59\x79\x52\x19\x2e\x40\xd6\xfb\x32\xe9\x38\xa7\x25\x72\x15\x6b\x5b\x4f\xb9\xc8\xaa\x8c\x9e\x02\x1a\x22\x03\x27\x55\x9a\x6e\x8a\x00\xc8\x37\x70\x77\xdc\x99\xe8\xbb\xa7\x7e\xd9\x8f\xef\x96\x0f\xfc\x3f\x81\x50\x9a\x40\xb2\xee\xa7\x3e\x54\x26\xfa\x79\x28\x01\x06\xa9\x2f\x4a\xc0\x2f\x65\x09\x41\x29\x33\x52\x30\x6d\x4b\xaa\x35\x65\xe2\x82\x91\x2d\x83\x8e\xd1\x85\x33\xf8\xb4\x97\xc6\x41\x9a\xe5\xfd\x2a\xcd\x92\xdc\x5f\x0d\xb2\x7e\x88\xeb\x38\xab\x96\xf4\x02\x54\x6e\x38\x80\x92\xfb\xee\xe4\x4f\xbe\x61\x80\x8c\x83\xa6\x60\x98\xa7\x98\x37\x6a\xee\xf8\x96\x00\xe4\x07\xe7\x7b\xe7\x0f\x07\xc7\x6b\xd1\x0f\xbc\xa2\xcd\x01\x40\x07\xf0\xb9\x6a\xc6\x63\x14\xed\x36\x28\xd4\x47\xf1\xaf\xe8\x18\x7d\xf8\xfc\x4b\x0e\xe8\x7f\x5e\xb7\x90\x0d\x4f\x0a\xdf\x15\x00\xcf\x68\x2a\x7c\xdf\x5e\xf4\x1b\xd6\x87\x95\x4a\x0a\x3b\x0a\x71\x28\xab\x1d\xb6\xf5\x43\xb7\x29\x6b\x9f\x37\xcb\xff\x59\xe3\x2b\xae\xa5\x56\x4c\x6a\x6e\xcb\xa0\x87\x49\x36\x62\x87\x2f\x9a\x24\xab\x16\xc8\x9b\xfb\xfd\xf2\x31\xbe\x46\xbc\x3c\x15\x1a\xaf\xac\xd0\x97\x12\x08\x9b\xec\x88\x40\xd6\x13\x85\x71\x4e\x4a\xf4\x18\x35\xc8\x0f\xda\x28\x20\xae\x45\x31\xa2\x29\x57\x32\x46\x04\x2b\x44\x77\xd8\xf5\x73\xe1\x53\x41\x97\x30\x17\x1c\xe2\xb1\x9f\xe5\x3c\x78\x41\x41\x1d\x47\xf1\x69\x96\xb5\x47\xb5\xb7\xf0\x31\xaa\xcb\xbe\xab\x3b\x3c\x54\xd1\xbf\x49\xb2\x47\xbe\x6f\x5f\xe1\x2d\xfe\xf0\x82\x75\x13\x34\x48\x7f\xa9\x6b\xbe\xff\x8a\x39\xf5\xd2\xbf\x26\xd1\x4b\xa6\x51\x1d\x8f\xc0\x1c\x67\x1b\xbe\xf8\x53\x90\x68\xe8\x6c\x59\x2a\x94\xb9\x9c\x1f\x5a\x16\x57\x9a\x5a\xa2\x67\x68\x72\x66\xf9\x0e\x9e\x65\x9c\x1d\x8f\xc7\xb9\x1e\xc7\xd1\x53\x53\x93\xc6\x42\x8f\x60\x01\x1d\xea\x38\xe1\xa0\x1f\x8e\xec\x78\xc0\x85\x3f\x1d\xc9\x31\xda\x5f\xbc\xda\xd9\x8b\xe3\x5e\x75\x47\x2f\x39\xdf\xdd\x57\x5a\xa9\x2f\xe5\x13\xef\x77\xfb\x9b\x20\x70\xf0\x31\xdc\x54\xf7\xab\xc5\xcd\x06\x3d\x0c\xae\xaa\x00\xaa\xac\x3b\x93\x8d\x79\x50\x64\x13\x79\x81\xa8\xe1\x8c\x49\x59\x29\x4f\x25\x26\x14\xe4\x70\x68\x89\x11\x02\x44\xc3\xe4\xe2\x61\x46\x3b\xe6\x51\x70\xaa\xeb\x3c\x35\xc2\x0b\xc1\x30\x93\x14\x53\x62\x47\x20\x97\xf5\x9b\x29\x82\xe8\x20\x90\x96\x07\xed\xae\xb1\xce\x72\x8f\xdc\x5c\xe6\xe7\xe7\x17\x4a\x9f\xeb\xdd\xbe\x7f\xff\xe3\x76\xc9\x25\xf6\xdb\x17\x33\x34\xe4\x26\x4f\x96\x6d\x2b\x07\x76\x83\x5c\x19\x67\x88\x00\x54\xcd\xa5\x63\x02\xa4\x60\xc0\xc8\x8b\x92\xc4\x50\x94\x1a\x8b\xce\x60\xa1\xb9\x97\x60\xca\xb3\xaa\x88\x0b\x0f\x1b\x80\x99\x6f\x07\xeb\x31\x01\x5a\x7b\xb2\x53\x48\x4b\x49\x67\x16\xb4\x6f\x4a\x22\xa6\x9a\x08\x4e\xdb\x25\xa4\x36\x25\x6a\x35\xd1\x9e\x53\x9e\x3b\xd3\x8a\xda\x82\xc8\x1f\x84\xa3\x63\x14\xc5\x9b\xf1\x91\xec\xd1\xaf\xd7\xe0\x6d\xc5\xad\x96\x85\x31\xd4\xd3\xaa\xda\xa9\x9f\x2b\xc5\x60\x8d\xe8\x56\x84\x1a\x7c\x9c\xf4\x8f\x32\xf4\xbf\xff\x7f\x2b\x62\x25\x2c\x81\x6b\x3f\xfe\xe2\x4c\xff\xf7\x60\x9d\x63\x7f\x0b\xfe\xe6\xa7\x8f\x7f\xf7\x19\xdc\x6d\x4e\x55\x5e\xc4\x78\x36\x1c\x13\x35\x14\xb1\xf0\x39\xa3\x9d\x10\x38\xad\x73\xdd\xba\x53\x15\xe4\xcd\x77\xba\x90\xc2\x75\x92\x0a\x90\x3e\x46\x6a\xd6\x0a\x17\x79\xa9\x51\xc7\xb9\xa0\x6d\x9c\x5e\x7b\x16\xd1\xef\xed\x59\xf0\xb5\x17\x88\xfc\x00\xb4\xd7\x55\xa8\x58\x0f\x00\xf9\xaa\x5f\x22\xc4\xe0\xa2\xdd\x37\x8d\xfd\x76\xcf\x22\xec\x77\x7b\xba\xae\xf9\xe0\xee\xcd\x66\xfb\xf6\xa9\xdd\xf0\xb5\x4b\x07\xb8\x32\x54\x97\x54\x12\x6d\xab\x25\x8f\x87\xb1\xe5\xd6\x08\xe2\x11\xd3\x46\x17\xc6\x90\xdc\x1f\xe6\xa3\x04\x23\xc8\x66\x92\x50\x63\x85\x14\xe3\xf0\x60\x36\xda\xf6\xbc\xb0\x4d\x4d\xb5\xf6\xa9\xe4\xc8\x21\x0e\x06\x2f\x8e\x66\x00\xd0\xd1\x52\xa0\x92\xc8\xe5\x78\xf4\x16\xfd\x56\xfd\x4c\x83\xc3\xab\xfa\x19\xdc\xe5\x9c\x73\x6e\x08\x09\x24\xf3\x38\xa6\x61\xbf\x55\xd1\x9f\x07\xcd\xba\xaf\x5c\x9f\x6f\xbf\xbb\x0d\x6a\x5d\x51\xd0\x33\x78\xf7\xd3\xfb\xbd\x3b\xe3\x93\x19\xc1\x14\x6a\xfe\x6d\x2d\x1d\xf2\x95\x77\x25\x88\x5c\xd5\xf7\x27\x80\x08\xdf\x6a\xe7\x91\x4f\x3d\x12\x40\x83\x31\x16\x82\x23\x69\xce\xa3\xef\xbd\x23\x95\x4e\x1d\xa8\xe2\xaa\x9c\xa1\x3f\x64\xaa\x6b\x56\xbe\x5d\x1d\xee\x25\x7c\x59\xed\xcb\x90\x7f\xdc\x7c\x7a\x8e\x00\x6f\xde\xde\x7c\xf8\x43\xb0\x29\xbd\x7b\x73\x1f\xef\x3f\xbc\xb9\xdb\xbf\x86\xb9\xad\x3b\xf8\xfd\xaa\x45\xf8\xe1\xd3\xed\xdd\xa6\xf6\x95\x60\x54\x4b\x62\x0a\xd7\xd2\xaa\xeb\x3a\x90\xc6\xbc\xcd\xf2\xe9\x31\x2a\x18\x84\x79\xaa\x33\x2a\x24\x95\x07\x0d\x28\x3e\x42\x02\x4d\x81\x4d\x9e\xf9\x69\x87\xcf\xd8\x97\x25\xb1\xb8\xe9\x4b\xa1\x04\xdd\xe5\x36\xc8\xe2\x0a\x3f\x25\xd8\xfa\x66\x32\xcd\x7c\xc4\xb8\x42\xc3\xb2\xa6\x11\x7f\x38\x48\x80\xc1\x64\xdc\x54\x1c\xec\x04\xe8\x7a\x4e\xc3\xe5\x9c\xd6\x3a\xc7\x3f\x5f\xcf\xe9\xa7\x57\x27\x75\x93\xdc\x7c\xb8\xb9\xbd\x9e\xd4\xee\xeb\x25\xf9\x97\xa7\xd5\xf9\x86\xd3\x02\x6a\x5e\x9a\xdc\x36\xa4\x6a\xdb\xf6\x14\xd3\x26\x9c\x56\x9a\xb1\x34\x2f\x96\x13\x23\x42\x12\xd9\x6b\x50\xe2\xb1\xc0\xd0\x14\x48\xe5\x99\x3f\x85\x13\x23\x25\x2d\x4b\x5c\x75\x98\x69\xf9\xf2\xcc\x40\x16\xc3\x70\x6e\x9c\xce\x47\x98\x95\x0e\x0d\xbc\x14\x00\xfb\x71\xf8\xfa\xec\xb6\xc1\xe3\xbb\x4d\x68\xf4\x97\xd1\xdd\xc5\x2b\x2b\x02\x6b\xd5\xf8\x87\xed\xfe\xfd\x25\xf3\xbd\x38\xc9\x7d\xdc\xbe\x2f\xc0\xdd\xc7\xfb\xdd\x36\x68\x97\x5f\x11\x91\xbc\x9c\xdb\x24\xf2\x68\x04\x94\x8c\xd5\x39\xab\x5a\x06\xd8\xc9\x17\x49\x34\x1f\x60\xac\xbc\x02\x5c\x4a\xa0\x00\xb7\x8a\xcd\x75\x32\x9d\xb3\xf0\xa0\xb2\xa0\x82\x23\x5b\xfa\x02\x63\xd0\x63\x45\xa4\xa0\x99\xf4\xcc\xd2\xb2\xa4\xbe\xe6\x7e\xe4\xab\x1e\x2b\x8f\xab\x8b\x9e\xc7\x5d\xf4\x39\x78\xfc\x91\x97\x2b\xc4\x9a\xc5\xbd\x7b\xf3\xfd\xdf\x83\x37\xf7\x7f\xf3\xd3\x3f\x80\x25\x33\xfd\x47\xf0\x31\x79\x8d\x6e\xb8\xdc\xbe\xdb\xe5\x9b\x25\x8e\x7b\x77\xd9\x92\x2c\x30\xab\x09\x03\x3d\x1f\x00\xf1\x6a\x07\x61\x3b\x94\xc4\x8f\xa9\x63\x14\xb1\xb8\x21\xc2\x5a\xd2\xb6\x76\x84\x9a\xd7\xc4\x1a\x81\xe7\xd3\x1c\xe5\x5c\xc9\xa4\x98\x65\xa7\xbb\x1d\x26\x44\x10\xce\x89\x71\x50\x60\x44\xab\x52\x14\x54\x2d\xb3\x16\xe3\x52\xf1\x12\x43\x99\xe7\x88\x15\x10\xa1\x93\x56\x4c\xd9\xd1\xb7\xa3\x94\x52\x46\xf1\xa6\x5d\xe6\xd6\x16\x5f\x30\xc2\x1f\x6e\x3e\x7c\xbf\xbf\x7b\x73\xff\xdd\xed\xfe\xa7\x24\x4e\x82\x6e\xc7\x1a\x7c\x1c\xc6\x2a\x05\xf9\x84\x4f\xa2\x63\xe8\x20\x8e\xd9\x21\x2e\x78\xa9\x11\x4f\x5a\xa0\x87\xc6\xce\xa3\xef\xf4\x09\x58\xef\xfc\x51\x01\x14\x23\x30\x09\x45\x94\x58\xf5\x37\xc8\xa6\xda\xe2\xcb\xde\xbc\x7a\xd6\xbe\x46\x5e\x7f\x1d\xe1\x5e\x2a\x77\x71\x14\x9b\x59\xe9\xab\x07\x62\x5c\x08\x01\x71\x41\x21\xf1\xd2\xc6\x85\x97\xc0\x6e\xf1\x3c\x81\x92\xf9\x91\xf9\x6e\x2e\x19\x4d\x4d\x5a\x32\x7f\x48\xe4\x51\x08\xb5\xd6\xf4\x56\x6c\x9a\x0d\xbd\xf6\x55\x01\xf6\xe6\xc3\xcd\x72\x52\xef\x56\x6e\xf0\x68\xad\x20\x0c\x7a\xab\x32\xac\xf1\x46\x7e\x39\xec\x91\x6f\x85\xd0\xb4\xcd\x7d\xef\x4f\x25\xc8\xa2\x38\xf8\x21\xba\xdf\xad\x1f\x90\x1c\xa7\x86\xe0\xca\x1f\xe7\x8a\x01\x35\x4c\xa7\xa2\xd1\xbe\x89\x23\x58\xd6\x04\x81\x71\x96\x2a\x26\x95\xed\xfa\x46\xb6\x83\x9f\xbc\x26\xf1\xe1\x85\x7e\x40\x35\xad\xfa\x01\x52\x3c\xeb\x07\xb8\xf6\xa2\x1f\x50\xac\xb9\x88\x7a\xd4\x9b\x7c\x27\xaf\x7e\x7d\x77\x6f\xbe\x8f\xa3\xd0\xe1\x79\x01\x71\x8b\x53\x57\x40\xd0\x1d\xbc\x39\x91\x98\x59\xdf\x94\x48\x4b\x21\x04\xc2\x06\x64\x3b\x89\xb4\x76\x6c\x96\x1e\xc9\xfa\x94\x98\x9a\x73\xa5\x15\x63\x54\x00\x1b\x25\x91\x8d\xa2\x24\xdb\xc9\x80\x52\x78\x13\x45\xef\x96\xc4\xf0\x49\xac\x76\x45\xc8\xde\xdd\x00\xe8\xea\xb2\xa8\x8b\x12\x20\xe7\x1b\x40\xd7\x47\x55\x6d\x85\x74\x50\xf3\x2f\x23\x8b\x1b\x60\xce\x6c\x99\xe6\x51\x12\x99\x28\x8a\xc7\xe7\xf7\x04\x2f\xa4\x6f\x3f\x7c\x4a\xae\xef\xe9\x96\xf7\x8b\xac\x1f\x5c\x53\xb2\xb0\xc7\x22\x3f\xec\xe4\xfa\x7e\xcb\x5b\xcf\xea\xe9\x3d\xe3\xb8\x7e\x95\x67\x3c\xd9\x29\x04\xae\xe4\x2b\xee\x67\x9c\x7c\xf8\xee\xed\xa7\xdb\x0d\x4a\xa5\x31\x4a\xc6\x39\xa0\xd4\x37\x1e\x27\x05\x1a\x6c\x2f\x5b\xdb\x75\xfc\xa4\x87\xd2\x95\xce\xa0\xa4\x9a\x27\xcf\x6a\xe9\x40\x1d\x17\x60\x40\xc2\x70\xec\x47\x9f\xf9\xa6\x36\x46\xb7\x83\xb0\xaa\x01\x04\x70\xdf\x0c\xa7\xa0\x37\xbc\x5c\xaf\xf8\xb8\x93\x4f\x58\xe5\x15\xd7\x11\xce\xec\xf6\xe6\xee\x0f\xe1\x8a\xe9\xaa\x80\x20\xf3\xa5\xab\xd1\x71\x09\x0b\xfc\x61\x27\xa1\x61\x0f\xf8\x7a\x56\x5e\xcd\xe3\xea\x91\xb6\x89\x22\x1c\xf6\xe4\x15\x21\xff\xe4\xc3\xb9\xbf\xfb\x85\xe3\xc8\xe7\x10\x20\xbe\xb8\x65\xf3\x63\x9e\xb9\xac\x00\xa7\x79\x42\xa0\xcb\xa8\x12\x9c\x09\x31\xb0\x9e\x29\x85\xb5\x48\x61\xe6\x1b\xc2\x65\x55\xf6\xb1\xe2\x58\x63\xb6\x85\xae\x4d\x1b\x67\x9b\xe9\xc8\xb8\x64\xf4\xa0\xb5\x6a\x29\x96\x98\xa4\x4a\x37\x26\x70\x10\xc0\xc8\x25\x95\x6b\xbf\x86\x5f\x74\x09\xfe\xf8\xa4\x1e\x5a\xae\x91\xeb\x92\xd8\xfc\x70\x57\x3c\x6b\x90\x05\x7d\xff\x20\x18\xff\x29\xf9\xf0\xe9\x9a\x42\x7c\xbe\xbf\xdb\x7f\xf8\x78\xfb\x76\xb7\x7f\xb1\x41\x7f\x02\x5d\x85\x80\x6c\x25\x28\xe2\x88\xc3\xcc\x42\x33\x1b\x2f\x2d\xc4\x7e\x54\x20\xc5\x7e\x02\x51\x61\xaa\xb4\x06\xa8\xf1\x85\xc9\x1c\x80\xf9\xa0\x14\x46\x65\x09\x39\x86\x22\x53\x1a\x96\x4b\x0c\x7b\x1e\x67\x0b\x8b\x3c\x97\xd4\xe1\x92\xc7\x6e\x9e\x7c\x23\x40\x01\x0e\x49\xc1\xfc\x72\x21\x86\xf9\x30\x0c\x83\x97\x70\x20\x69\xc1\x91\x32\x08\xa3\xec\xba\x66\xf0\x08\x27\x68\x7b\x8c\x92\x65\x5d\xbc\xbd\x7b\x73\x17\x10\x4c\xfb\x70\xad\xbf\x0b\xec\xf6\xed\xfb\x4f\xb7\xf7\x2e\x46\xf3\x00\x63\x73\x92\xb6\xee\x20\xb6\x02\xd9\x34\x9b\xfc\x09\x19\x79\xdc\x1e\xad\xef\x9c\xc7\x87\x9c\x54\x4b\x9a\xe5\x07\x54\x62\x5a\xd8\x09\x74\x6b\x0d\x66\xb8\x68\x9b\xaf\xd7\xef\x3f\x45\xff\xed\xa5\x96\xfe\x24\xf0\xff\xa4\xc5\x16\xae\xdf\x8f\xb7\x01\x1f\xb4\x5c\xbf\xed\x87\x8f\xf7\x20\xfc\xe5\xee\xe3\x3d\xf8\xea\x02\x6e\xea\x1a\x96\x71\xe4\x4f\x90\xd8\xa2\xca\xf8\x58\xf1\x9c\x78\x44\x81\x62\xbe\x39\x95\xd5\x98\x1e\x81\x9a\x26\x6f\xfa\xec\x00\x38\x48\x4f\x20\xd7\x25\xc4\xa4\x10\x38\x57\xa9\x32\x45\xb9\x33\x05\x23\xe7\x7e\x36\x45\x8e\x05\xae\x68\x49\xe3\x7a\x3e\xf8\xd1\x8e\xe0\x90\x60\xee\xc9\x7a\xf5\xb8\x1c\x06\x2f\x8a\x96\x64\x05\x2b\x94\x2d\x4a\x98\x09\x11\x25\x1b\x1e\x35\x17\xdd\xce\xdf\xd6\x13\x34\x59\x6b\x3d\xca\xc1\xd1\xfa\xdc\x69\x6e\x2c\xac\xb4\xd0\x2e\x41\xa6\xf0\x10\xb4\xd4\xb0\x44\x9f\x5d\x12\x71\xad\xac\xf0\x47\x6e\x94\x15\xd7\x79\x57\x07\x8f\xa3\xbf\x89\xde\x87\x79\xf7\x5f\xfe\xe4\xbc\x4b\x96\xd9\xf6\xfd\x7e\x99\x76\x9f\x5e\xce\xbb\x9f\x5e\x4c\xbc\xb1\x42\x40\x77\x02\x64\x71\xc4\x60\x6e\xa0\x99\xad\xd7\x06\x23\xdf\x29\x00\x91\x1f\x41\xae\xdb\xb4\x03\x24\xed\xe7\x93\xcb\xd2\x06\xe0\x6c\xd4\x0a\x63\x42\xb2\x9c\x11\x24\x33\xed\x0a\xf2\xeb\x53\x0f\x82\x21\x29\x7c\x33\x08\x71\xbd\x76\xa4\x68\x79\x5a\x20\x04\x95\x81\x18\x65\x42\x3d\xc7\xb0\x74\x07\x83\x3e\x76\x7e\x65\x66\xbf\x28\x14\xec\x03\x45\xe0\xda\x64\x8f\xc7\x8d\x64\x5c\x38\x58\x73\x7c\x46\x38\xc1\xe7\x3e\x3e\xfa\xc8\x05\x2f\xb4\x1d\xfc\xf9\x24\x64\xea\x52\xb9\x25\x83\x3d\xcc\x4e\xc4\x83\x2f\x02\x7f\x79\x93\x2c\xf9\x9a\xf8\x8d\x71\xde\x3c\x8f\xf3\xe1\xe6\x3e\x19\x13\xc3\x39\xaf\x8a\x8a\x97\x73\x1e\x58\x08\xa5\x37\x55\x35\x8e\x2f\x07\x39\x98\x97\x83\xac\xbe\x3c\x72\x87\x03\x5e\xf8\x8a\xa6\x79\x31\xc6\x5a\x2e\x7b\x7f\xfb\x76\x59\xf6\x6d\x7c\xa8\xea\xba\x14\x41\xea\x3d\xd3\x93\x00\x91\xf6\x03\xd4\x46\x80\xcc\xf3\x1d\xb6\x3e\xb7\xe7\x51\x32\xe8\x20\x8d\x99\xaf\x26\x0d\x32\xc0\x0d\xa8\xa1\xb7\x60\xd5\xce\x0f\xdc\xe8\x95\xe3\xf9\xe1\xe2\x1b\xfa\xcf\xdf\x66\xbd\xbc\xbd\x7b\x73\x1f\x7a\xc6\xd7\x3c\xef\x92\xe1\x7d\xfc\xf0\xf1\x7e\x79\x6c\xd7\x56\xf2\x9b\x9b\x4b\xf5\x20\x3e\x80\xc2\x81\xd2\x81\xc2\x8f\x6e\xb9\xaf\x47\xbc\x61\xae\xef\xad\xcf\xe3\x62\x1e\xdd\x7c\x8c\x73\x0f\x55\xdf\xcb\x04\x76\xae\xef\x7b\xc0\xbb\x27\x80\x81\x52\xad\x69\x4d\x67\x5a\xfb\x18\x81\xc8\x86\xbf\x86\x3f\xbe\xed\xba\xee\xaa\x71\xe5\x76\x28\xfa\xc3\x5a\x27\x7b\xf3\x2c\x58\xb0\x56\xc8\x62\xf0\xfe\xd3\xb2\xb4\x7f\x77\xfb\x69\xb9\x5e\x77\x49\x9e\x28\x0d\x38\x9b\xaa\x41\x75\x75\xeb\x27\x0e\xb2\xba\xb1\xa5\xb7\xa6\x3d\x41\x0b\xb2\x6a\x6a\x88\x1f\x91\xf6\x62\x87\x8c\x97\x3e\xf5\xbd\x55\x56\x57\xb5\xb2\xca\x76\x20\x9f\x27\xef\x64\x1d\xa7\x09\xf6\xdc\x0b\x7f\x1a\x01\xd1\xc0\x5d\xfc\x84\xd8\xbe\x06\x4d\xd0\x9b\x5c\xeb\x65\xbf\xd0\x97\x2c\x3e\xbd\x14\x98\x0c\x75\x9e\xc1\x2a\xa9\x4c\x92\x56\xce\xaa\xe6\x8c\x2b\x36\x80\x4c\x66\x59\x5a\x65\xce\x73\x7f\xa8\x46\xab\x8c\x76\xa0\xa1\xd2\x68\x46\xaa\x41\xb4\x1d\xf3\x4d\x51\x14\x45\xa6\x70\x2b\x09\x03\x92\xfa\xc9\xc8\x2a\xac\xbf\x0e\x4c\x7b\x11\x72\xc9\x3f\xbe\x66\xd9\x05\xf7\xf6\xaf\xbe\x07\x45\x6c\xea\x25\x54\x4c\xb2\x9f\xcb\x24\x9d\x55\x16\xd7\x55\xdc\xcc\x34\xc9\x7e\x46\x49\x31\xb3\xed\xe8\x9c\x76\xd6\x3a\x5f\x68\x1d\xe0\x14\x2b\x5f\x92\x85\x9c\xff\xcf\x57\x87\xcc\xd7\x7d\xbe\x9b\x2b\xf3\xe4\x89\x2b\x73\x57\x03\xbc\x26\xfb\xea\x2c\x81\xf2\x3d\x40\x55\x10\xfb\xa8\x0a\x2f\x7d\x5e\xf4\xb5\x1f\xb6\x2a\x58\xf4\xaf\x24\xe0\x19\x2f\xd3\x63\x44\xc8\x69\xd6\x14\x05\x28\xa3\x38\x86\x8f\xea\x92\x23\xff\xf1\x97\xac\xf4\xaf\x8f\x21\xae\xc1\xb1\x02\x47\x9f\xc7\xe4\xcb\x21\x2e\x7d\x9e\x2d\xdf\x8f\xbe\x88\xc5\x17\x1d\x2b\x9f\x6f\x83\x93\xaf\xf3\x93\x73\x20\x3b\x4f\xeb\xdc\x3c\x3a\x07\xf2\x35\x1f\x57\x17\x6d\xa3\xff\x9a\xb1\x7a\x30\x54\x60\xf0\x28\x46\x0f\x59\x5c\x78\x94\x5d\xbf\xa7\x5f\xda\x98\x79\xf4\x7a\xac\x13\xc8\xfd\xd1\xf9\xd1\xb9\x80\xeb\x8e\x8f\xbf\x67\xac\x84\x01\x1b\xb8\xfd\xe0\xf8\xe0\xc0\xe8\x65\x0a\x9c\x0b\x86\x94\xe9\x03\x8d\x33\x2f\x7e\x73\xac\x04\xff\xae\xb1\x2a\x20\xab\xd0\x7a\xed\x1e\x8e\xa0\xf5\x36\x5d\xbe\x57\xde\x80\xf1\x61\xb9\x96\xf6\xb7\xc6\x4a\xc2\x5a\x6c\x77\x69\xd0\x1d\x0f\x6a\x08\x5f\x29\x21\x80\xe7\x75\xb8\xde\x1c\x2b\x2a\x39\x2b\x38\xc7\x67\x16\x77\x1e\x3b\x17\x62\xd6\xd4\x7d\xa9\x25\xcf\x5d\xce\xb7\xc8\xf7\x73\x29\x13\x34\x0f\xa0\x0e\x35\x13\xf6\x14\xb7\xfe\x78\x75\x04\x7b\x79\xe3\xc7\xc9\xfd\x53\x2c\x9b\xfc\xf0\xf6\x87\xb7\xdf\xdd\xee\x8e\xd4\xab\xf9\x94\x18\x34\xd5\x93\x1c\x9b\xda\x1f\x39\xc8\xeb\x89\xf2\x94\x49\xcd\x58\xcc\x7b\x48\x21\x6f\xd0\x4e\xad\xd1\x6a\xee\x9b\xc6\x18\xd3\x75\xc6\xaa\x16\x64\xc0\xfa\xc8\xd3\x5a\x1a\xd0\x84\x98\x76\xb6\x9d\x23\x06\x44\x4b\xfc\x0a\xe2\xc3\x23\xdf\xeb\x9d\xba\x6a\xdb\x3d\x8b\x11\x7d\xfe\xee\x76\xdd\x4c\x2f\xcf\xc1\x42\x10\xbb\x02\x25\x51\x66\x07\x6e\x72\xc7\x65\x51\xa6\x82\xcc\x8e\xc7\xa8\xb4\xd8\x17\x0c\xd4\x58\x09\x2b\xa7\x9d\x2a\x94\x7a\x50\x5e\x67\x2e\x6b\x81\x8c\xbb\xb3\xf3\xa5\x06\x2e\xc9\x66\xe3\x5b\x05\x60\x5c\x1c\xac\x04\xe9\xa5\x07\x94\xae\xfe\x85\xb7\x17\xff\xc2\x0b\x61\xed\x49\xac\xf0\x73\x60\xab\x7d\x77\xb0\x59\x2e\xea\xaa\xa2\x34\x67\xbc\xd6\xa6\x6c\x9c\x86\x58\x8b\x5d\x81\xb4\x5e\x62\x68\xe7\x4b\x84\x1d\xc1\x33\x8f\x09\xc1\x55\x49\xe3\xbc\x77\x02\x94\xc1\xb7\x41\x3c\xba\xcb\x7d\xf8\x8b\x19\x94\xf4\x40\x55\x21\xe7\xec\x1f\x3a\x70\xf0\x66\x83\x62\x32\xb7\xee\xec\x9c\x4b\xc4\xe5\x18\xeb\x8b\x86\xc5\xdb\xe4\x37\x0e\x11\xa4\x16\xd9\xea\x74\xd2\xb2\xd0\xb6\xaa\x5a\x3c\x74\x2d\x2e\xb5\xdd\x15\xe8\x31\x5a\x0f\x11\xe1\xd2\xd1\x72\x96\xaf\x0e\x71\xf5\x3b\x4c\xb2\x47\xf7\x4d\x4f\xc8\x4b\xbf\x22\x21\x1b\xe4\x11\x68\x3c\x05\xa7\x07\x19\x47\xa1\x37\x81\x77\x99\x9b\xeb\xe0\x0a\x19\x33\x17\xb3\xc0\x85\x8a\xf8\x65\x2d\x5d\xeb\x2b\x5f\xad\x9e\xb7\xc1\x10\xf2\x25\x90\xe8\xa9\xbf\xb4\x64\xb6\xf1\x01\xf4\xeb\x42\x00\x1f\xd2\x18\x79\x9c\x6d\x32\x8f\x11\xb2\x9a\x97\xaa\x24\x5a\x4a\x7f\xf4\xbd\xeb\xad\x00\x78\xf2\xca\xc5\xe3\x5c\xec\x52\x29\x8d\x32\x46\x79\xe3\x25\x82\x18\x13\x4a\x69\x59\x12\xdd\x29\x3f\x00\x28\x91\x61\xb5\xd1\xcf\xfe\x41\xc7\xff\x6a\xff\xa0\x64\x0a\xc6\x41\x31\x0b\x36\x42\x73\x1a\xfc\x83\x8e\x6c\xd0\xca\xba\xaa\x21\x9d\x2d\x5d\xcd\x6a\x47\xea\x1a\xb5\xc1\xaf\x2a\xce\xf6\xe9\xae\x5c\xf9\x54\xc9\x5d\xfc\x67\xe0\xfe\xfd\x6a\x6a\x73\xbb\x6a\x1b\x7e\xc3\x34\xf2\xea\x77\x93\x6e\x11\x01\x79\x86\x79\x0f\x39\x46\x30\xf3\x1d\x9b\x61\x5a\xc4\x94\x63\xad\xa4\xd4\xf5\x11\xb7\x46\x4a\x6a\x34\x45\x3e\x37\x7e\xa4\x80\x13\x7f\xda\x95\xde\x7a\x3d\x91\x2a\x93\x00\x02\x29\x85\x49\xfb\xb2\xa4\x8a\x11\x8d\x0d\xa4\x25\x94\xb8\x64\xca\xf3\xca\x1c\xe2\x32\x8a\xb6\xb1\x0a\xdc\x42\x1c\xb8\x7c\x6b\x8f\x28\x02\x37\x1f\xbe\xa6\xf2\x7d\xb8\x59\xa9\x6a\xe0\xee\x59\x1c\x7c\xd7\x34\x4a\x52\x09\x1d\xa1\x67\x56\x99\x98\xf4\xb3\x0d\x0d\xaa\xd4\x9f\x8a\x20\x68\x12\xb2\x4b\x3c\xb3\xb3\x59\x9b\x7e\x71\x7f\x2e\x37\x24\xb8\xb7\x64\x8d\xaf\x0e\xf3\xe4\x33\xbd\x7a\xa0\x45\xc3\x63\xb9\xaf\xb6\x79\xf4\xd7\xd1\xc7\xe8\x7f\x8a\xfe\xf7\x4b\x17\x70\xbb\xff\xf1\xdd\x95\x45\xf3\xe1\xcd\x2a\x62\xfb\x79\x45\x1b\x7c\x5b\xc0\x01\x5c\x81\x40\xab\x18\xf1\xf6\xa7\xf7\x4b\x62\xfa\x69\x9b\x55\x59\x3e\x01\x48\xfd\xe4\xa7\xaa\x03\xb8\x40\xae\x2c\x4e\xf4\x78\xce\x63\xc6\x66\xcb\x18\xd0\xbe\xef\xb4\x94\xb0\xcc\x09\x86\xd0\xb6\x7e\x74\x31\xdd\x28\x3f\x5a\xee\xf2\xc2\x1b\xcf\x0a\x23\xfd\x90\x40\x84\xa4\xaf\x18\x99\xb6\x39\xce\xb3\x46\x1a\x71\xa8\x55\x59\x22\xca\xa5\xd1\x5a\x33\xac\x0f\x8d\xf5\xaa\x6b\x8c\x49\x6d\x46\xca\xae\x01\xe6\xcb\x69\xeb\xce\x4c\xdb\x8a\x60\x84\x73\x4d\xad\xc3\x08\x19\x92\x45\x20\xd2\x9b\xfe\x77\xd5\xbd\xb7\x27\xad\xb5\xb6\x8c\xad\xfa\x4c\xff\xda\xba\x39\x63\xa1\x6e\xbe\x8c\x5f\xff\xbe\xf1\x03\x93\xda\x2d\xa1\xe5\x65\xfc\xf4\xf7\x8d\x1f\x2c\xed\xad\x10\x21\xd9\x5d\xc6\x3f\xfd\x6b\x7e\x9f\xf3\x80\x9b\xfd\xd7\x9e\xbf\xa5\x94\xb1\x6b\x7d\x2e\xe8\x08\x5e\x5d\x8b\x2f\xbd\xf4\x64\xad\xcf\x55\xae\x92\x82\x32\x37\xb9\x9c\x5a\xba\x53\x7e\x50\xd2\x0a\xf6\xa5\xdd\x56\x85\xef\x1f\x23\x02\xd2\x68\x13\x1d\xe3\x68\x5f\x26\x7d\xb4\x0d\x8c\xa3\xbf\x79\x8a\x59\x3f\xbc\xb9\x3a\xe5\xad\xae\x8e\xef\x5e\xa8\x9a\x27\x07\xcd\x99\x50\xfe\x50\x95\xfa\x64\x8a\xd4\x65\xd6\xf3\xa3\x4a\x26\xc7\x0d\x73\x0f\x07\xcd\xb9\x92\x49\x8f\x89\xa0\x98\x74\x45\x9e\x61\x82\x2c\x23\xe4\xa0\x2b\xea\x4c\x41\x1b\x21\xd4\xba\x86\xf1\x7d\x05\xf0\x65\x0d\x7b\xf7\x55\xbc\xbc\xae\x67\xeb\x71\x7c\xfe\xf4\xf9\x59\x5e\x6b\xd7\x6b\x56\x51\x35\x1f\x71\x61\x8b\x72\x1e\xb4\xd2\xca\x02\x54\x91\xa1\x4b\x9b\x2c\xcf\xaa\xbc\x84\x1e\xf9\x56\x02\x5c\x0f\xe4\x50\x97\x5c\x20\xc9\x0a\x72\x34\xd2\xb9\x1e\x15\x69\x9a\x16\x86\x35\xa8\x20\x2b\x76\x11\xe0\x18\xed\xba\x1d\x0a\x75\xd6\xbf\xbe\xf4\x3e\xef\x6e\xee\xde\xde\x7d\xfa\x18\xca\xba\x77\xdf\xef\x9f\x23\x8b\x3b\x80\xb7\xe6\x8b\x72\x1b\xf6\x50\x0b\xa0\x53\x97\x02\xe5\x65\x7a\xac\x45\xdd\x09\x3f\x72\x40\x4b\x5f\xed\xd0\x39\x32\xf1\xd4\x60\x8c\xb1\x29\xf2\x20\xfd\x68\x98\xe6\x4d\xc0\x4a\x9e\x02\xf6\x7b\xf5\xe6\x29\x5e\x23\xbf\xdf\x5e\xe6\xc0\x6e\xbf\x59\xd7\x8f\x65\xc4\x7d\x56\x3d\xc0\xaa\xda\x1c\x1e\x20\x07\xbd\x03\x8d\x2f\xb3\x1c\xa4\x4b\x92\x18\x3d\x46\xf5\xc4\x80\x64\x9e\x6e\xd4\x97\x81\xb1\x2d\x7a\x68\x93\xf6\x58\x55\x16\x23\xde\x9b\x5e\x76\xcb\x7a\x1b\xce\x33\x68\xd2\xf1\x1d\xf9\xd6\xb8\x57\x9d\xa0\xef\x9f\x56\xf5\xef\x6e\xee\xf7\xdc\xcd\xc2\xb9\xd8\xcd\x02\xf5\xee\x70\x48\x8d\x14\x8c\x13\x2b\xc7\x7e\x47\x7e\x8e\x94\xda\x47\x5f\xb2\x2d\xf3\x4d\x08\x04\x29\x99\x0e\xa6\x6d\x4f\x95\x5c\x62\xa5\x65\xff\x1c\x02\xb7\x68\x1d\xef\x17\x0c\xc9\x35\x76\x08\xe3\xad\x80\xfb\xbb\x3d\xab\xce\x6d\x55\x25\xe4\xdc\x96\x20\x0b\x09\x63\xda\x58\xe1\x4f\xac\x93\xa0\x48\xfd\xf4\x8d\x41\x09\x39\x1d\x0c\x70\xfe\x58\x5f\x46\xbd\xea\x63\x2c\x7b\xd7\x32\xee\x5f\xff\xda\x79\xde\xee\x93\xb5\xea\xb7\x49\xdd\xdc\x59\x1b\x97\x73\x87\x6a\x5b\xd7\x69\x2f\x4c\x29\x64\x93\xd6\xbb\xf2\xe7\x54\xeb\xdd\xe9\x4b\xbe\xe5\xbe\x5e\xc6\xb3\x8c\x2d\x01\x18\x3b\x59\x01\x0a\xe0\xa2\x24\x68\x3b\x5f\xaf\xe9\xaf\x8c\xb5\x7b\x03\xf6\xc9\x8a\xc3\x59\xae\x28\xae\xaa\xb8\x9f\x31\x3e\xb8\xe3\x31\x05\xa9\x18\xa8\x93\x53\x7a\xf8\xe6\xc9\x79\x64\x80\xf1\x53\x25\x41\x1a\x72\x4c\xb0\x61\xa1\xc6\xb1\x6a\x04\xac\x5d\xee\xe7\xed\x6e\xd7\x78\x52\xc5\xa7\xab\x3a\xe7\x56\xfc\x3c\xee\xda\x87\x68\x15\xde\x0c\x5e\x0d\x78\xaf\xb7\x30\xfa\x8b\xe8\x53\xf4\x3f\x5c\x1d\x8b\xd6\x36\xf8\xbb\x55\x74\xe6\x45\xbb\xe8\x19\x4b\xb3\x79\xbb\xff\x69\xe5\xda\xfc\xf4\xfe\xd3\xe7\xff\x3f\xd8\xed\xb7\x9f\x3e\xef\x6a\xe2\x07\x6f\x93\x62\xae\x4f\x61\xfa\xf9\x43\xf5\x18\x2d\xb1\x6b\xd5\xcd\x6d\x52\xcc\x15\x8a\xbb\x73\x13\x13\x0c\x6b\x08\x93\xd1\xb7\xdc\x81\xec\x24\x26\xaf\x7c\x3b\x1f\x29\x70\x20\x3b\x9c\x34\xf7\x28\xb6\x25\x01\x5d\xc7\xb6\x50\x17\x99\x36\xaa\xac\xe4\x38\x8e\x07\x69\xa8\x32\x2a\x33\xe7\x53\x59\xe6\x18\x99\x9a\x97\xa5\xa5\x4c\x23\x53\x94\x08\x49\x41\x11\xa3\xe6\xaa\x75\x41\x82\xdf\xe7\x36\xfa\xc7\xe8\x7f\x8c\xfe\xe7\xb0\x03\xaf\xea\x5d\xd7\x59\x76\x89\xd1\xde\xac\x5f\xbf\x0d\x11\x5c\x9b\x4d\xcb\x53\xb2\xda\x4a\x05\x1b\xf8\xe5\x9e\xdf\xd5\x1c\x5b\xcc\xce\x7d\x4c\x96\x80\x0e\x67\x6c\x09\xcf\xd3\x4c\x4b\xa9\x06\xe8\x98\xb4\x55\x59\xc0\xcc\xc2\x8a\x68\x2b\xa8\x31\x79\x56\x62\x4a\x69\x41\x68\x59\x16\x73\x83\x96\x14\xcd\x18\x03\x50\x31\xf9\xa1\x00\x64\xa7\xb9\x2c\x25\x3f\x01\xec\x7b\x6b\x95\xe0\x65\x6b\x20\x24\xb2\x2b\x0f\xad\xb3\xa6\x3c\xea\x6a\x80\xbe\x3e\xa9\x52\x52\x45\x28\x2e\x24\x2e\x1d\x96\x08\x03\x57\xcd\xdc\x00\x3b\xd7\x4e\xd2\x9a\x46\xbb\x04\x5e\xb0\x92\x3f\x84\x18\xe8\x3e\xd4\x43\xaf\x9d\x81\xa7\xf2\xcc\x87\x7f\x04\x21\xf0\x0d\x25\x99\xbb\x4b\x29\x6f\xb7\xbf\xfb\x08\x3e\xde\xef\xf6\x9b\xa9\x29\x20\x18\x4f\x2b\x35\xc8\x68\xa5\xfd\x08\x90\x9b\x26\x60\x41\x34\xcb\xae\x48\x8f\xc0\xa4\x05\x40\xfe\x44\x4b\xb1\xd3\x88\xe0\x73\x75\x72\x9e\x83\xca\x91\x2a\x4b\xb8\xb7\xc7\xe3\x71\x6e\xb8\x56\x62\x9c\xab\x93\x15\xd1\x2e\xe4\x67\xee\xdb\xc7\xf5\x5c\x36\xfa\x10\xec\x0a\x3e\x5d\xa9\x1f\xcb\x71\x2d\xd3\xeb\x7a\x5c\xa6\x81\x28\x86\xfe\x10\xa4\x32\xe7\xac\xaa\xb5\x6f\x01\xc3\xe1\xb2\x81\x1e\xa0\x39\x3d\x15\x99\x3f\x80\x3e\xcb\x01\xf3\xa3\x24\xe6\xf5\xc1\xb1\x2a\xe1\xcc\xe3\x71\x1c\xe7\x56\xa8\xf5\xe0\x1c\x5f\xf5\x97\x34\x10\x7b\xb3\xb3\xa1\x7f\xb7\xb2\x40\x2e\x8a\x35\x4f\xfe\x98\x77\xaf\xfd\x31\xaf\x3d\xb7\x4d\x5e\xe6\xb1\xf3\xa7\x82\x80\xe9\x74\x02\x07\x58\x3e\x46\x71\x9b\x17\x02\x1c\x30\x9c\x25\xf6\x62\x4b\xbe\xb4\xd5\x26\x7d\x38\x2d\x8f\x9d\x25\xd4\x10\x65\x0c\xe7\x06\x23\x4f\x99\xe0\xbe\x99\x6b\xc0\xa5\x6f\x54\x94\x44\x2e\x2e\x02\x5e\xf7\xdf\x07\x77\x92\xa7\xf5\x63\x0d\x1b\x5f\xdd\x85\x57\x47\xae\x97\x77\xe1\x1e\x55\x5f\x0e\x55\x7c\xca\x8b\x1a\xe5\xe7\x22\x66\x18\x2d\x77\x5b\xe7\x35\x69\x41\x0e\x90\xf0\xce\x0f\xbe\xf5\x05\x01\x06\xa4\xa7\x41\x72\x8f\x63\x87\x30\x10\x35\xd9\x8e\x8f\x91\x52\x20\xc2\x10\x13\xea\xbb\x92\x14\x18\x69\x25\x09\x5f\x22\x73\x64\x0a\x52\x42\x4a\x31\x64\x8c\x47\xd1\x26\x1e\x1f\xf1\xbe\xde\x91\x4b\x2f\xf2\xbf\xfb\xaa\x0f\xf9\x95\xe1\xe0\xe7\x4f\x37\xf7\xbb\xd0\x4e\x7b\x6d\x39\x68\x12\x75\x36\x6e\x49\x0a\x97\x87\x1f\x37\xf5\x0c\x0b\x14\x8f\xb2\x22\x02\xba\xb2\xcc\xf3\x92\x7a\x73\x60\xa0\x6a\x74\xe5\x1b\x06\x72\x5d\x31\x21\x06\xe5\x0f\x3b\x32\x6b\xa0\x83\x69\x80\x35\x25\x9e\x87\x43\x51\x15\x84\x83\xb2\xf7\x86\xab\x01\x30\x3f\x59\x25\x5b\x5a\x6a\xe9\xae\xba\x23\xab\x3f\xd8\x1f\x2e\x9c\xcb\x17\xae\x71\xdb\x17\x88\xe2\x55\xf7\xfe\x2b\xd5\x3a\x08\x86\x02\xd5\x18\x82\xee\xa1\x05\x29\x2b\x41\x46\x70\x85\x4b\x90\x3f\x48\x90\x21\x92\x98\x6a\x6e\xaa\x55\x07\x91\xce\xcd\x76\x20\x25\x62\xdc\x61\x5d\x59\x8b\x8c\xb0\x56\xf3\xf9\x74\xb6\x9c\x27\xd2\x77\x8d\xcf\x02\xc6\x22\x89\x0f\x8f\x74\xcf\x2e\x5a\x28\x57\x46\xf9\x13\x30\xfb\xd3\xed\xdd\xb2\x47\x3c\xd7\x45\x36\xa9\x2b\x60\x12\xe9\x8a\x6b\x68\x45\x59\x66\x33\xd7\x44\x75\x31\xf7\xcc\xb9\x65\x7f\xd8\x69\xa4\xd4\x83\xf4\xba\xa8\x8b\x29\x39\x3c\x46\x5c\x82\xdc\x0f\x73\xa9\x12\x3c\xf7\xa1\x4e\x92\x44\x26\xca\xe3\x76\x3b\x7e\xed\xe3\x79\x1b\x2a\x75\x37\x77\x71\xfb\x42\x78\xef\x31\xda\x8e\x5f\x94\x6c\xb6\xfd\xdc\x81\xe6\x9c\x82\x76\xcd\xa7\xa3\x4b\x0f\xf7\x87\x95\x1b\xf7\xdd\xed\x0b\x17\x81\xf5\x56\xde\x10\x21\x54\xcb\xaa\x1c\x26\x70\xb6\x01\xa3\x8f\xe6\xa1\xda\xf4\xfe\xe8\x34\x40\xa0\x85\x46\x59\x3f\x84\xff\xa3\xad\x0e\xfd\xbe\x3c\x9e\x7e\xe3\xb8\x26\xe7\x87\xb5\x0c\x14\xc4\x7a\xbe\x75\x5c\x41\xbf\xa0\x7d\xad\x89\x19\xf4\x6e\xc0\x3e\x0a\x7a\x37\xa1\x85\xb1\x66\xfc\xc0\x54\xa0\xf3\x65\x9c\x7b\x3c\x82\x5c\xf8\xd3\xa1\xaa\x7d\xaf\x01\xad\xbc\x03\x07\xaf\x56\x50\xa4\xf5\x83\xf3\xca\x8f\xd5\xb2\xb9\x9f\x8f\x09\xf4\xc2\xf7\x06\x60\x60\x5d\xb0\xda\x5a\x8e\xfb\xf1\x14\x37\xdb\x31\xda\x06\x06\x7a\xb4\x7e\x5c\xe0\xe6\xfe\xe6\xcd\xcd\x87\x9b\xb8\xf1\xca\x01\x33\x4d\xdb\xf1\xcb\x71\xd8\x1e\xe7\x76\x59\xba\x8c\x27\xcb\x11\xff\xdb\x50\xff\x38\xec\x74\xf4\xef\x5f\x38\x21\xaf\x18\xc1\xbf\xbf\xa8\xd0\x04\xae\xcf\xfe\xee\xcd\x6e\xc9\x1c\x3f\x7d\x06\x5f\xa1\x06\x6f\x5f\xe0\x03\xaf\xcc\xb3\x37\xfb\xbf\x7b\x1f\xf7\xed\x4c\x10\x1d\xb8\x45\x80\x42\x6f\x71\x09\xa2\x12\xf9\xc1\x18\x90\x99\x65\xeb\x01\x99\xb1\xb8\xd0\x05\x9e\x3b\x83\xb0\x2e\x63\x58\xe6\x26\x5f\xc2\xf2\x62\xe3\xce\xc7\xb8\x43\x76\x04\x11\x92\x86\x87\x3f\xf3\xa9\xef\xfb\x79\xea\xfb\xde\x6b\xae\xa0\xe2\x39\xf4\xc7\x96\x1c\x86\xa6\x83\x43\x9d\xb6\x87\xec\xe4\xa2\x6d\xd0\x82\x6a\x77\x36\xca\x9e\x38\x74\xd1\x8b\x9e\xda\x9a\xc7\x26\x77\xcf\x5a\x2c\x3f\x25\xf7\x81\xd5\x73\xbf\x5d\xf1\xd0\x6f\xe3\xf0\x1c\x6d\xdf\xff\xb8\x85\x95\x14\x6d\x47\x95\x61\x26\x2f\x7c\xe7\x2b\xd8\x1d\x01\x41\x2e\xcb\xc0\xe8\x4f\xce\xb1\xbe\x93\xd6\x9f\x48\x2b\x27\x70\xe2\x8d\x9f\x28\xc8\x41\xc9\x8f\xbe\xa2\x40\x01\xce\xfd\x38\x8f\x24\x86\x3b\x8b\x3a\x91\x21\x89\x5d\x4b\x4a\x4c\x72\xa3\xbc\x15\x10\xe6\xa6\x62\xd6\x80\x68\x32\x5a\x58\x29\x8e\x4a\x99\x54\x2c\x73\xb3\xce\x85\xd7\x52\x2f\x81\xc4\xfa\xf9\x8c\xbf\xfa\xf9\xac\xc8\xc2\xcb\xa7\xf4\xf6\xd3\xb2\xa8\x7d\x8d\xea\xfc\xb5\xcf\x07\x28\x8b\x40\x09\x71\x3b\x73\x4c\x87\x53\x09\x8f\x88\x10\xad\x41\xa4\xbd\x0e\x5f\x0c\x85\xa6\x28\xe7\x7e\xfd\x70\x0a\x9c\x99\x0c\x95\xd0\xc0\x9d\x46\x52\x0b\xb6\x7c\x42\xd8\x8e\x23\x67\x8c\xfb\x66\x18\x86\xf9\xb8\x7c\x36\xc6\xd4\xb0\x36\xd9\xd3\x67\x53\xf4\x4d\xda\x8e\xe9\xe4\xa2\x64\xe3\xa2\x69\x8f\xb6\x87\xd7\x7a\x7d\xeb\xbd\xb5\x09\x11\x7d\x15\xa8\x36\xcc\xd7\xdb\xc3\x43\x1e\x77\xc0\x9e\xc9\x35\x7e\x66\xe1\x73\x35\xd1\x36\xfa\x31\xd4\x7f\xd6\xae\xe3\xdd\xcd\x25\x8c\xfa\x2e\xba\xdb\xff\xf8\xfe\xc7\xe4\xeb\xde\xda\xf7\x6b\x40\x7d\x17\xe7\x63\x23\x9a\xe1\x18\xc3\x5c\x73\xa1\x2a\x1d\x47\x60\x2a\x7d\x7e\xf2\xa3\xa2\x84\x9a\xc2\x96\xd0\xcb\x12\x68\xc5\x2a\x7a\x64\x8f\xd1\xce\x70\xad\x0c\x3f\xf9\x2e\xe5\xcc\x6a\x2b\xbd\xf0\x95\x4b\xab\x0e\x88\xf9\xa2\x20\xbf\x51\x9d\x93\x7e\x38\x76\x0a\xe4\xa0\x8d\x40\xb4\xcc\x3d\x1d\xf7\x57\x7d\xed\x97\x9d\x28\x10\xed\xf2\xb9\x4c\xe0\xf9\x50\x9f\x0f\x09\x9c\x69\xdc\xbb\xc1\x79\x0d\xb4\x1b\x9e\xbc\x18\x6c\x5c\x47\xdf\xaf\x98\xf1\x0f\x61\x7e\xbe\xd0\x3b\x57\x49\xfa\xff\xb2\xf7\xef\x40\x92\xe3\xdc\x9e\x18\x4e\x30\xab\xb2\xb8\xfb\xbf\x77\x2f\x7b\xfa\xeb\x19\xc6\xfe\xf7\xae\x58\xb7\x67\xa6\x79\xf7\xae\x62\x11\x5f\x7f\xdd\x43\x29\x76\xaf\xa0\x5d\x29\x02\x92\x22\x14\xd0\x23\x14\x90\x07\x43\x06\x4c\x98\x30\x61\xc2\x84\x09\x13\x26\x4d\x9a\x34\x69\xd2\xa4\x49\x93\x66\x9a\x69\xe6\x4e\x17\x51\x0a\x82\xcc\xac\xac\xea\xaa\xea\xc7\x3c\x76\x76\x43\x35\x9d\x5d\x53\xd5\xe4\xf9\x1d\x1c\x1c\x1c\xbc\x7f\x27\x4b\x5c\x92\x6e\xd8\x94\x74\x71\x49\xa7\x6a\xdf\x4c\x86\xc5\x79\x3d\xa1\x38\xc3\x18\x63\xeb\x47\xe1\x0c\xb0\x9e\x28\xc7\x01\x8c\x36\x80\xc6\x87\x6d\xb5\xce\x21\x9f\xe0\x47\x5c\x73\x25\x6f\xe1\x4d\x07\xc6\x76\x3a\xb4\x0b\xaf\x22\xdd\x56\xdb\xf2\x73\xde\x2b\xa7\x1c\x34\xc6\x63\x1b\x45\x9b\x8b\x34\xda\x6f\x77\x4f\xd4\x6f\x1a\x0f\x53\xe1\x96\xd4\xf3\x9e\x7f\x5c\xbf\xd5\xa6\x08\x9c\x5c\x97\x47\x36\xf5\x79\x58\x71\xd7\x27\x1e\x87\x20\xeb\x44\x7c\x3b\xa0\x09\xdf\xb8\x72\x83\x7d\xc4\x50\xdc\xb1\xb2\x46\x08\xe4\xee\x67\xed\x00\x62\xb1\xa4\xa5\x81\x74\xab\x14\x2b\x6d\x31\x32\x6e\x6d\x69\xb8\x6f\x9b\x1e\x50\x61\xc9\xfc\x15\xd6\x2a\xe4\x2d\xbe\xaa\x62\x1a\x7d\xbb\x70\x6c\x86\xb6\x74\x3e\xa4\xd9\xae\x47\x75\xbf\x8d\xb1\x84\x17\x91\xd9\x03\x08\x38\xf6\xd0\x6b\x6f\x7d\xc1\x80\x01\x59\x6d\xa8\x60\x20\x8a\xd9\xa0\x6f\x0e\x4d\x4c\x09\x11\x46\xa0\xc2\x96\x5c\x40\x9b\x23\xc2\x18\x96\xcd\x1e\x73\x3e\xcf\x09\xca\x5b\x12\xe6\x04\x7f\x15\x6e\xc5\xfe\xab\xe8\x7f\xb8\xcf\x65\xf5\xcd\x83\x1f\xee\xf3\x6e\xbd\xff\xe1\x8c\xdc\xea\xef\xbe\x0f\x29\x7a\x56\x72\xab\xcb\xd4\x66\x39\x29\x59\x51\x60\x2a\x1a\x50\xeb\xb4\x94\x94\x11\x52\x12\xd1\x4d\xa5\x16\x3d\xef\xa8\xc6\xd4\xc1\x92\xf5\x71\x63\xe6\x5e\x85\x4a\x53\xd2\xf1\x36\xa2\x30\x87\xa6\x4e\x4c\x5a\xca\xad\xca\x9d\x26\x58\xe1\xb2\xd1\x1c\x14\xc0\xe4\x5d\xc5\x98\xe6\xd4\x88\xf9\x47\x85\x7d\x37\xe8\x71\xc4\x55\x75\x83\xe2\x01\x21\x33\xe4\x7e\x6f\x02\xc3\x67\xdb\x30\xca\x40\x1e\x17\x8d\x6b\xc3\xbe\x77\x1c\xd7\xb7\x2c\xdc\x49\x49\xc3\x0a\xe8\x31\x9f\xc4\x31\xc3\xde\x9a\x95\xed\xea\xfe\xb9\xc6\x8b\xd4\x3a\xe7\x32\x3f\x78\x9b\x33\x23\x80\xb2\x96\x2a\x33\x16\x88\x16\x89\x4d\x48\x67\xf9\x56\x4c\x8d\xbd\x19\x0b\xcb\x50\x95\x5e\xa6\x1f\x92\x6c\x5b\x4c\x9a\x4b\xee\xe4\xcd\x90\x67\xe5\xae\x3c\xe8\x92\x47\xd1\x15\xd8\x87\xf3\xc7\x8b\xef\xbf\x3c\xf1\x7c\x9e\xd6\x51\x96\x24\xaa\xdf\x05\x73\x87\x5e\xee\xed\xab\xeb\x1f\x02\xa9\xdd\xf2\x5f\xdc\x5f\x44\x37\x91\x8b\xdb\x09\x01\x4c\x04\xef\x98\x41\x52\x72\x7e\xd3\x99\x8b\x4a\xfd\x8c\x2f\x6c\x6b\x5b\xdb\x6c\xe1\xcd\x5e\xc7\x91\x1f\x28\x66\xa6\x2e\x04\xa2\x9c\x7c\xe8\x63\x39\x69\x6b\xc1\xce\x67\xc7\x4f\x74\xe2\x18\xaf\xb7\x32\xb0\xbc\x45\xe0\xfa\xfd\xbb\xf5\x96\x5e\x40\xff\xe6\xf2\x2a\xda\x2c\xc3\x83\x1f\xe6\x19\xf4\x55\xdc\x80\x3e\xf1\x2d\x40\x0e\x34\xf5\x34\xd6\x40\x4b\xaf\x5a\xe5\xa5\x01\x15\xf3\x64\x63\xfc\x2e\x89\x77\x25\x04\xd8\x02\xec\x9b\xa9\x71\x5e\x0c\x16\x44\xa0\xf2\xcc\x1f\x04\xc8\x81\x70\xa0\xf6\x0d\x2c\x8f\xeb\x72\xe8\x99\x75\xb9\xe5\x1e\xce\x69\x5d\x4e\x56\x56\x1b\xf9\x21\x3b\x5b\x97\x0b\x7c\x1a\x9b\xe8\xa9\xb3\x77\x71\x62\xad\xe1\x0c\x7b\xac\xd3\x52\x97\x17\xd5\xcf\xee\x0a\xfa\x9d\x92\x5a\xd8\x20\x03\x81\x34\xba\x0a\x77\x4e\xe7\x36\xb0\x30\x8e\xfc\x39\x7a\x1f\xfd\xcf\xd1\xff\x13\x5a\xdf\xdb\x57\x7f\x3a\x65\x07\xfd\x6e\x65\x18\x7c\xbd\x24\xdd\xbe\x7e\xbf\x0c\xd7\xe7\xbe\xed\xed\xda\xb7\xbd\xfa\x69\xee\xdc\xce\x53\xdb\xbf\x5e\x6e\x8a\xbd\xfc\xee\xea\xed\xe9\xda\xd3\xeb\x35\xc1\xc1\xc2\x89\x88\x14\xdc\xa3\x1a\x21\xc4\x73\x57\x48\x25\x53\x25\x0c\x28\x60\xde\x20\x4c\x74\xca\xf9\x4e\x7a\x37\xff\x6d\x63\x41\x04\x44\x19\x86\x45\x96\x54\x45\x45\x75\xd6\x70\x95\x12\xdd\xf7\x87\x83\x9e\x87\xa5\x22\x2b\x04\xda\xaa\x42\xc8\xbc\xfe\xc0\x08\x49\x74\x02\x41\x11\x4e\xcd\xee\x46\xb1\x03\x87\x38\x61\x9c\x61\x65\x27\x1a\xe6\xa1\x3b\x4a\x77\xbb\x8d\xf4\xb8\x4a\x75\x8a\x41\xe2\xad\xe2\x02\xa4\x53\x0f\xa9\x73\xfa\x36\xd2\x5e\x80\x79\x30\xc0\x31\x0d\x67\xc5\x02\x77\x9e\x78\xf2\x9c\x63\x67\x0c\xc3\xb4\xf0\x4e\x26\x85\x2a\x1e\x3f\xe7\xf8\x4f\xc0\x10\xe6\x47\xea\x34\x72\x38\xae\x44\xfc\xef\xc7\xf3\x85\xcb\xd0\xe1\x64\xdd\xf3\xdb\x33\xc7\x5b\xf8\x6f\x5f\xdc\xbb\xb7\xf5\xfe\xe5\xeb\x17\x6f\xdf\xbd\x7e\xf9\xf6\xc5\xeb\xb7\x2f\xde\xbe\xb8\x97\x5d\xbe\x31\x59\x0e\x72\x88\xaa\xa9\x01\x11\x86\x3d\x42\xcc\x94\xa0\x58\x4e\xc5\xcd\x9f\x9b\x7a\x1f\x6e\x8f\x55\x8a\x71\xa6\xa4\x63\x3b\xd6\xee\xf7\x4a\x88\x3d\x07\x4c\x71\x2b\x0c\xb0\x9a\x48\xa2\xb6\x2a\xc7\x48\x0a\x7a\x93\x6f\x46\xca\x29\xe2\x76\xf6\x6e\xe4\x3c\xaa\x36\xfb\xaa\x32\xd5\x34\xa4\x95\xd1\x56\x4e\x36\x66\x7e\xef\xe4\x38\x07\x9f\x6a\xaa\xc2\x2c\xbc\xbc\x91\xd8\x68\x21\xa5\x34\xd8\xc8\xf5\xcc\x28\xd9\xca\x28\x59\x72\x4e\xad\xb6\x5c\xd3\xc9\xb4\xc6\x10\x44\xbd\x15\x09\x94\xf0\x02\x7f\x88\xae\xa0\x37\x94\x4a\x90\x9c\x2c\xb9\xf0\xf4\x9b\xab\x26\x70\x5d\xff\x18\x7a\xf7\xf5\xce\xd3\xca\x06\xb4\x6c\x35\xbd\x3c\x23\xb8\x0c\x43\xfc\xe2\x22\x31\x43\x07\x0a\xe1\xc7\xdd\xc1\xb7\x04\xe4\x7d\xa3\xa5\x69\x7b\x71\xd3\xa4\xa0\x71\x21\x53\x49\xfa\xa1\x88\x0b\x8f\xb7\x50\xf8\xae\x66\xd4\x30\xed\xb0\x2b\xa5\xaa\x69\x23\x6d\x7f\xc3\xfa\xde\xfa\xd6\xda\xb0\xd7\xf9\x4f\xc2\xba\x12\xdf\x96\xa7\x3d\xb6\xbf\x8d\x5e\xaf\x1c\x17\xeb\xda\xdb\x0f\xe1\xef\xf3\xbc\x39\x97\x67\x69\x3f\x2f\xbf\xbb\xeb\x4b\x8f\xec\x54\x71\x1b\x43\xe3\x59\x2c\xe2\xd2\x78\x3a\x75\x96\x63\x66\xe2\x2a\x7c\xf3\x63\x56\x69\x3c\xc6\xfb\xbc\xd6\x78\xf4\x7d\x05\xc1\xce\xcd\x1d\xb9\xde\xcd\x1d\xfa\xfc\xd9\x96\x53\x12\x73\x33\xff\x05\x4b\xcc\x51\x29\xc2\xdf\x4a\x59\xac\xb9\x08\x7f\x1f\x20\xbd\xa9\x19\xdb\x10\xdf\x57\xbe\xa8\x8e\xfe\x3d\x3e\x19\x4b\xa2\x79\xba\xca\x90\x67\x4b\x2c\xd1\x3f\xb7\x57\xd0\xf7\x42\x68\x5a\x9f\x62\xc9\x45\x88\x69\xe6\x74\x96\xfe\x5f\xac\xa7\x92\x7e\x0a\x47\xd4\xb6\x81\xad\x1a\xac\xc3\x8f\x17\x3f\xbc\xbb\xe6\x9b\x42\xa2\x9c\xb9\x9d\x3f\x94\x8a\x83\x04\x24\xa1\xb9\x86\xcf\xb6\xb4\x37\x34\xd7\x70\xda\x81\x9e\x91\x2a\xbf\x10\x81\xf4\x5d\x80\x68\x22\xac\x3d\xc6\xcf\xfc\x63\x7d\x17\x27\x8a\x33\x3b\x07\x50\xec\x91\xce\x88\x22\x17\xe5\x87\xf4\x0a\x7a\xe9\x9c\xb6\xa0\x38\x05\xd0\x70\x4e\x0b\xdf\x8a\xd0\x2f\x5e\xae\x6c\x9f\xeb\x48\x76\xb3\x5c\x5c\x38\xe5\x6b\x0d\xf9\xeb\x2f\x97\x54\x47\xa4\xb5\xc2\x35\x89\xc3\x1c\x56\x09\x1b\x34\x8b\xe7\xb9\x44\x29\x27\x6b\xa1\xb6\x7a\x2b\x4c\xaf\x47\xeb\xcd\x87\xba\x2c\xfb\x72\x2f\x31\xdd\xec\x7c\xe7\x15\x04\x0a\x94\x69\xe6\x91\x37\x08\xd0\xe8\x22\x6e\xc3\x9d\x0e\x1a\x5d\xae\x79\x67\x57\xec\x17\x6f\x5f\x44\x2f\xbf\x8b\xc1\x71\x57\xe3\xbb\x78\x1b\xe8\xb0\x42\x17\xb9\x76\x10\xb3\x3e\x6f\x2e\x06\xad\xa5\x74\x0e\xe4\xda\x75\x5e\x15\xc4\x65\x79\xe2\x12\x79\x1b\xd5\x5c\x5b\xb9\xab\x77\x26\xc5\x06\x6d\x2a\x8e\x5c\xc9\xb6\xd4\xb4\xaa\x6d\xbc\x9b\x1a\xb0\x03\x43\x3e\x91\x69\xb7\xcf\xb3\xa2\x18\xa0\xdf\x2b\x4c\xa9\x55\xa2\x1b\xe3\x32\xf3\xce\x0f\x25\x48\x01\xba\x8d\x7c\x8f\x41\x79\x38\xe6\xa3\xca\xb6\x3a\xca\xce\xb8\x29\xe3\x07\x9c\x94\x6a\x28\x0a\x5b\x16\x03\x13\x4e\x70\x4a\x2d\xa7\x14\xe4\xad\x27\x97\x5a\x30\x28\xb5\xf5\x87\xd6\x28\xab\xc5\x4d\x1f\xef\x25\x32\x63\x1c\x2d\xfd\xf0\x72\xaf\x24\x5b\x18\x7b\x43\xab\x39\xe5\x28\x3b\x3b\xa0\xf9\x7a\x1e\x27\x6c\xf4\x46\x0c\x4c\xe4\x89\x49\x61\xd1\x3a\xea\xa0\xa7\x1c\x48\xd8\xd9\x18\x4d\xed\x36\xbb\xe9\x26\x8a\x89\x85\x03\x82\x98\xc5\xc3\x24\xfc\xc1\x8c\x71\x61\xe2\x6c\xcd\xd5\x93\x6d\x55\x28\xc3\x71\x9d\xe7\x7e\x19\xc0\xb5\x06\xa4\x28\x2b\x54\x80\x52\x9b\xc1\x72\x6d\x9c\x33\xf3\xc8\x32\x9d\xd4\xa5\xe6\xb4\x94\xca\xfa\x43\x63\x8d\x75\xea\xa6\xd9\xe4\x96\x84\x62\x04\xd9\x61\x5e\xf8\xb4\xec\x97\xd7\x1a\xc0\x1c\x56\x65\x0e\xa0\xd6\xbd\xe6\x52\x3b\xad\x19\x90\x87\xa9\x7e\x20\x5a\xde\xb4\x9b\xcc\x62\xb3\x03\x87\x28\x8a\x2f\xc2\x99\xb1\x6d\x16\x6e\x12\x87\x99\xcc\xe6\x3a\x7e\xf5\xa7\x85\x85\x6e\xb9\xae\xf5\xf2\x7a\x13\xec\xf5\xe6\x74\x40\x99\x6e\x22\x9f\xe7\xc0\xe1\xa2\xc8\x4c\x46\x59\xc2\x28\xf2\x07\xc6\x59\xde\x68\x64\x0c\xd0\x79\xa2\x92\x7c\x9b\x69\x3f\x7e\x38\x90\xb2\x82\x8e\x61\x82\x37\xd5\x4d\x9a\x41\x8d\x32\x7e\xd9\x4f\xaa\xef\x8a\xb1\x8d\xfe\x2a\x32\xb1\xbd\x22\xa7\x75\xbd\xbf\xb9\x77\xaf\x39\xcc\xe8\x1f\x32\xb2\x3f\xe4\xd5\x3c\xe3\x12\xfe\x37\xe7\x5d\xd4\x38\xc7\x2b\x03\x9a\xc0\x8a\x1e\x3e\x71\x1f\x1f\xa6\xc4\x80\xc1\x17\xc7\xcf\xcd\x20\x54\xc5\x9a\x8b\x83\x51\x54\xea\xbd\x90\x96\x55\x3e\x33\x92\x0a\xbd\xc5\x13\x05\x3b\xe2\x0f\xf3\x1f\x30\x9e\xfd\x30\x62\x8e\x44\x89\x11\x66\xa4\xa4\x98\x41\x0e\x51\x39\xff\x7f\xe8\xcb\xc5\xdc\xee\x62\xbd\xd8\xf3\x98\x8d\xfc\xdb\x7b\x2e\x17\xec\x79\x71\xf5\xe6\xe5\xca\xe3\x2e\xae\xb2\x0f\x79\xb1\x91\x79\x29\x51\x6a\x52\x84\x06\x87\xa7\x88\xb5\x4d\xee\x87\x11\xb5\x9e\x6f\x14\xa7\x8c\xf2\x58\x2b\xe5\x6d\x91\xe1\x1a\xf6\x33\x3a\x48\xfd\x90\x97\x06\x65\x2c\xa6\x7e\x20\x4c\x4a\xb2\xdc\x7b\x31\x31\xbe\xa2\x61\xed\x71\xb9\x99\xf3\xe7\xe8\x7f\x3d\x67\xab\x9e\x2d\xf6\x28\xf1\xdb\x8b\xb9\xd3\x38\x23\x1a\x02\xeb\xae\x67\x88\x13\xa7\x4b\x13\x97\xe1\x2e\x52\x15\xf7\x69\x5a\x15\xe9\x26\xff\x8f\x64\xc3\x65\x96\x83\x28\xcb\x45\x09\x41\xe9\xf5\xf1\x22\x01\xd0\x37\xbc\xe0\x35\x10\x77\xc1\x77\x52\x9c\x20\xa8\xaa\xc3\x2e\x4b\x14\x9e\x86\x12\x14\xb2\xaa\xb3\x79\x58\x94\x35\x52\xe1\x6d\x91\x67\x05\x84\x32\x2f\xca\x22\xcf\x09\x22\x82\x30\xca\x08\x07\x55\x41\x9c\x23\xa4\xa1\xb4\x26\x04\x34\x49\x5a\xa2\x7c\xa7\xf3\x02\xe6\x7e\x50\x02\xb1\x22\x15\x98\xe7\x82\xb9\x5c\x9e\xd5\x43\x11\xfd\xcb\xe8\xfb\x87\xf5\x10\xc2\xee\xbf\x03\xd7\x57\x8f\x57\x43\x56\x6a\x94\x98\x54\x8e\x0e\xdf\x1c\x68\xd3\x9e\xd7\x02\x65\x3c\x2e\x14\xf7\x43\x91\x21\x55\xd4\x02\xd3\x61\x97\x42\x03\x53\x06\x0e\xb7\x11\x22\x82\xa1\x90\x87\x67\x6e\x53\x79\x94\xaf\xe3\x87\x67\xda\xd4\x5f\x4e\x8d\x2a\xda\x90\x69\x97\x81\x8e\x14\x65\x66\x33\xc6\x72\x46\xb1\xef\x85\x94\x59\x67\x91\xab\x40\x5d\x24\x3a\x29\xb6\xb9\xf5\xbb\x0f\x07\x02\xdd\xda\xa8\xdc\x4d\xb6\x34\x2a\x74\xa9\x27\xdd\xf5\xc5\xd8\xac\x77\x32\x1f\xd7\xe1\xfd\x33\x0d\x7b\xd3\x6d\xd4\xd4\xe5\x60\x47\xcb\x22\x4f\x6d\xc6\x28\x62\x94\xf8\x4a\x28\x9d\x0d\x15\xaa\x6b\xd0\xc2\x54\xa7\xf0\xa4\x04\x14\x0f\xb5\xb8\xec\x4e\x4a\x5c\x6e\x16\x7e\x57\x11\xfd\xff\xc3\xcd\xa1\xbf\x5f\xee\x88\x85\x1d\x98\xf5\x82\xfc\x83\x6d\x98\xbb\x1b\x06\xc7\xfd\xa1\x4b\x58\x15\xc5\x3c\x72\x42\x02\x44\x0e\xe4\x7e\x74\x93\x15\x0d\xf6\x03\xc8\x61\xb3\x4f\x0e\x40\x8f\x93\xed\xd2\x74\x07\x64\x92\x82\x64\x2b\x20\x45\x37\xbb\x9a\x37\x4d\x58\x7d\xb0\xbc\xde\x64\xcc\x53\xca\xdb\x76\x3a\x60\x29\x48\xbb\x72\x02\xcb\xad\x58\xef\xeb\xae\x07\xa8\xbe\x79\x71\xef\x44\xcc\x3c\xd8\x7b\xb9\x2c\x0b\xfc\x74\xef\x90\xd1\xf2\xbb\xd8\xb1\xae\x84\xa8\x64\x4c\x5a\xa5\x4b\x56\x70\x5a\x96\x49\x3f\x87\x0a\x34\x24\x69\xbd\x63\x20\xea\xa1\xeb\x11\xa7\x05\xd2\xa8\x28\x30\xc4\x42\x61\x90\x6d\x85\x14\x8c\x97\xa5\x90\xd4\x1f\x7c\x36\x0c\x59\x95\x1b\x53\xc0\x9d\xb2\x1a\x24\x14\x36\xd2\x8a\x96\x72\x62\x0a\x48\x29\xa1\x2c\x2d\x25\x87\xd0\x90\xb9\x2f\x1b\xd6\xf5\xe6\x7f\x1a\xc6\x12\xa7\x53\x6b\xdf\xfc\xb4\x2e\x3e\x7f\xf3\xdd\xd5\x8f\x9b\x23\xe7\xc2\xf5\x45\xa9\x31\x32\x05\x94\xbb\x16\x94\x06\x40\xbf\xd7\x1d\xad\x84\xe1\x96\x8f\xcc\xef\xb7\x12\x8e\xd5\xcf\xfa\x82\x10\x4c\x01\x2b\x81\xf6\x52\x4f\xe3\xa1\xda\x01\x7d\x03\x37\x55\x38\xa5\xcd\xc1\x78\xe4\x50\xc6\x5b\x11\xee\x92\x3f\x6a\xaf\x30\x7e\xf8\xfe\xe5\xd9\x4e\xe6\x03\x6b\x49\x5a\xc3\xa2\x84\x9c\x0a\xa3\x14\xa4\x05\x23\x25\x6c\x0f\x04\x14\x7d\x5a\x8d\x74\xdf\xa6\x99\x6b\x50\x03\x4b\x85\x0a\x9c\x15\x88\x4b\x3c\xd7\xa5\x14\x8c\xc1\x52\x88\xd9\x52\xe9\x6c\xa9\xc2\x58\xba\x18\x4a\x37\xd2\xf2\x0e\x16\x9c\x18\xc2\x66\x3b\xc1\xec\x68\xa7\x45\xdf\x7e\x2b\x16\xee\x99\xed\xd5\x77\x4f\x54\x2f\xf8\xcb\x9b\x73\x82\xcf\xe5\x32\xce\xaa\xf0\x9e\x0a\x21\x0d\x13\xa6\x36\xa6\x14\x85\xa4\x08\x27\x3b\xdf\x61\x40\x41\x94\xf5\x7e\x4f\x41\x3e\x66\x59\xbb\x43\x92\x97\x58\x93\x52\x23\xa2\x0c\x06\xe5\x56\x48\x04\x3b\x21\x24\xbd\x8d\x16\x9d\x73\xad\x51\x79\x50\x56\x81\xac\x60\xad\xb4\xa2\x29\x0b\x46\x8f\xd5\x8b\x8f\x5a\x47\x11\xd8\xf4\xb7\x24\x9c\xc7\x79\x34\x7b\xd7\xfb\x77\xeb\x86\xc2\xc5\x3c\x2c\xef\x7b\xa6\x03\xcb\x4f\x59\x34\xbe\xa3\x40\x5a\x4f\x2e\xf6\xe1\x68\xe2\x87\x3e\xb0\xfc\x14\xe5\xa6\xf0\xc4\x77\x06\xa8\x75\xbf\x22\xe4\x3d\x4d\xb7\x62\xe1\x2a\xdb\x3e\xe3\xf8\xe0\xc7\x8f\x2d\xf3\x3e\x64\x9a\xfa\x7e\x93\x53\xa9\x08\x22\x98\x2b\xdb\x18\x8b\x64\x21\x39\xc6\xc9\xc1\xd7\x04\x48\x90\xa6\xe9\xe8\x07\x0a\xe0\x21\xcb\xfb\x03\x52\x12\x11\x4d\x11\x26\x88\xf9\x01\x03\x32\x5b\xa7\x64\xbc\x44\x42\xb2\xdb\x68\xf5\xfe\x3b\xfb\x50\xd8\x4a\xcb\xdb\xd9\x4f\x56\xfb\xf0\x1c\x4a\xce\x56\xfb\x44\xfc\x56\x6d\xec\x96\x07\x86\xcf\x90\x5f\xe4\xdd\x31\x8a\x2c\xd9\x46\x42\x30\x7b\x71\x6d\x8d\x99\xfb\x9f\xb0\x52\x62\x8c\x1f\x77\xc8\xb6\xdc\x8f\x17\x64\xda\xc5\x9d\xed\x7b\x3b\x95\x71\x36\x51\x6f\xcc\xec\x60\xa0\x9b\xfb\xcc\x90\x63\xaa\x7a\x92\x6f\xe2\xfa\x09\xbe\x89\xcb\x37\xef\x37\xdd\xa6\xf3\xa2\x00\xf2\xa6\x05\x79\xe1\xc5\x18\xa7\xd3\xfe\xf8\x01\x9d\x75\x52\x37\x7b\xa6\xfc\x01\x0f\x77\x8c\x13\x79\xf5\x18\xe3\x44\x14\x5d\x84\x3c\x13\xc9\x56\x87\x3d\xe1\x37\xc7\x3d\xeb\xf3\xa5\x92\xeb\x57\xe9\xe6\xcd\xfb\x85\xd0\x74\xb9\x75\xf7\xdd\x7a\x37\x27\xac\xf4\xd7\x55\x5e\x1c\x30\x46\x2c\xb7\x85\xef\x99\xa6\x84\x34\x30\x5c\xc3\xd3\xa4\x94\x05\x71\xb9\xce\xb6\x3a\x97\xec\x67\x49\x49\x62\x12\x18\x4b\xe7\xa9\x3f\x94\x3b\xd0\x71\x1b\x33\x39\x15\x60\x40\xda\x20\xa3\xa6\xb6\xe9\xd2\xc1\x2d\x67\x77\xf0\x7a\x67\x6c\xb6\xcc\x7f\x73\xb7\xa6\xf0\xed\x77\xcb\xc4\xf8\x78\x80\x01\xbc\xff\xe9\xfa\xea\xdb\x87\xd9\x75\x5e\xbd\xbe\xe3\x4b\xba\x70\x26\xcb\xe3\x8c\xb9\xae\x23\xb7\x51\xdf\xfa\x3d\xda\x39\x41\x11\xa1\x3b\x40\x0c\xf5\x28\xe3\xbe\x05\x2a\x64\xb7\x0a\x83\x88\x90\xa7\x12\x82\x3e\x8c\x29\xd4\x56\xe6\x65\xa9\x1a\x49\xa1\xc1\x42\x10\x85\x09\xa1\x08\xf2\xfa\x36\x22\x36\x17\x3e\x35\x46\x1b\x65\xcc\x6e\x67\x8c\x32\xeb\xbc\x91\x6f\xf5\x89\x67\xf1\x8c\x41\x6b\xb6\xe6\xe5\x6a\xcd\x90\xbb\x70\xcd\x54\x73\xf5\xe2\xfa\xc5\xcb\x33\x9b\x6e\x68\x4a\x08\x46\xac\x70\xb3\x45\x0d\xc5\x39\x6f\x8b\xb4\xca\xf2\x83\xf5\xbd\x41\x50\x16\xc8\xe5\x3a\xdf\x30\x95\x4c\x25\xa5\x89\x4d\x60\x6c\x8b\x93\x55\x69\x62\x92\x58\x2a\x99\x4b\x36\x75\x19\x68\x7d\x0e\x2a\xa5\xb0\x96\xc1\xbe\xfd\x9a\x2b\x78\x1f\xf8\x3b\x78\xf4\x57\xe1\x0c\xdc\xd9\xc9\xe4\x37\x0f\xd7\x4f\xe3\x30\x8a\xdc\xec\xdd\x6e\x27\x68\xae\x1b\x0c\x5a\xa7\x25\xaf\xda\x0c\xe2\x32\x31\x19\xb7\x86\x6e\x79\xc8\x89\x07\xa1\xc3\x88\x6c\x9b\x49\x4a\x6b\x6a\x35\x25\x45\x46\x87\xd2\xef\x24\xe1\x47\x5f\x73\x0f\x7d\xed\xfa\xbe\xaf\x5d\x3d\xed\x6b\x71\x56\xe5\x25\x28\x09\xa6\x3a\xef\xa1\x67\xd2\x48\x21\xf6\xa5\x05\xce\xb3\x5a\x20\x89\x78\x5d\x98\x7c\x71\x36\xb5\xda\x45\x38\x8f\x4f\xbe\xa6\xa6\x1c\xf4\xa5\x36\x48\xeb\x33\x5b\x2c\x7a\xf1\xaf\xd7\x0b\xec\xab\xbc\x00\x19\xc1\x58\xe5\x6d\xe1\x8d\x30\x82\xf3\x01\xca\xd9\xa3\x2a\x8a\x64\x49\xdd\xd7\xe8\x15\x5f\xa6\x6b\x2e\xa9\x53\xbe\xdc\x7b\xdc\xe8\x2f\x7f\x7c\x33\xf7\xbb\xef\x5f\xbe\xde\x7e\xf7\xed\xe5\xa0\x21\x90\x34\x67\x44\x73\x4e\xb9\xe3\x2d\x47\x10\x4a\x35\x94\x69\x95\xa4\xf9\x56\x85\xdd\xde\xc2\xb7\xbb\x4e\x57\xfd\x68\x75\x05\xf2\x66\xaf\x29\x30\xd3\x6e\x04\x30\x41\xfb\xc0\xcd\x88\x37\x87\x90\x2b\xf7\xde\xad\xf5\x57\xd7\x0f\x58\xd2\xc3\xce\x7d\xf4\xf2\xd4\xc8\x1c\x60\xcb\xee\x5a\xa0\xb6\xf3\x79\x02\x3a\xee\x4a\x92\x13\x84\xca\xc4\xb7\xb8\xb1\x20\xc9\xf6\x40\xf8\x0e\x94\xde\x5d\x0e\xce\x19\x67\x2a\x43\xc9\xb4\xef\x53\x97\xf2\xc0\xde\xcd\x40\x1e\x67\xa6\x32\x6e\x89\xbd\xe6\x56\x6c\xca\x6d\x58\x55\x0b\xfb\x3c\xdf\xff\x34\x47\xbf\x17\xe1\xf6\x57\xe5\x73\x10\x75\xd9\xde\x37\x04\x8c\x3e\xda\x26\x37\xfb\xb9\x21\x58\xc9\xc8\xa6\x07\x81\x5f\x77\xc3\xd7\xfb\x12\xd9\x23\x5c\xf6\xcb\x4d\xa9\xed\x89\x59\xfe\x42\xbb\xac\x88\x2b\x55\x76\xd5\x5e\x0e\x55\xed\x0f\x02\xa4\x95\x91\x45\xa1\x5a\x26\x9d\x85\x9e\x6e\x25\x34\xc6\x4e\x3b\xdf\xb4\xd6\x06\x36\x7b\x33\x76\x20\xa5\x98\x01\x2d\x7c\x33\x82\x1c\xd4\x61\x2e\xc4\x43\x7e\x3d\x78\x3f\x37\xc3\xc3\x39\xe5\xe6\x6c\xde\xd8\xc6\xfd\x04\xdd\x79\x16\xb3\x54\x0b\xa5\x4c\x9c\x4a\x62\x91\xdc\xc2\x9f\x77\x1b\xbb\x9b\xc2\x1f\x4f\xf0\x28\xa5\x72\xae\x41\xad\x5b\xda\x71\xbd\xf2\xe7\x3f\x56\xce\x85\x40\xff\xac\x9c\x9d\xcd\x8a\x58\x70\xd8\xda\x5e\xd5\xd6\x8e\x7c\xb4\x5a\xe4\x85\xea\x28\xb7\xba\xf0\x72\xe1\xec\x9f\x76\xbe\x6e\xac\x35\x5d\xaf\x8d\x1e\x86\xd9\xb3\x19\x70\xca\x57\x3b\x90\x81\x7a\xb9\x57\x79\x99\x86\xbd\xa6\xe5\x8e\xfe\xbf\x8e\xe0\x89\xa5\xfa\xc7\xc0\x04\xb5\x09\xb9\xf7\xdf\xad\xc7\x7a\x96\x0c\xfc\x97\xaf\xae\xdf\xbd\x3c\x3b\x78\x12\xb7\xe1\x7a\xf3\x8e\xef\x6f\xa3\xc1\xf7\x04\x54\xb4\xd3\x82\x00\x95\xe7\xa6\x2c\x00\x32\xcb\x61\x93\x98\xb4\xc6\xcf\xb3\xfc\xd6\xa3\xad\x2a\x61\x21\xad\xaa\xd4\x60\xcd\x78\x43\xbd\xf1\x7b\x52\x83\xa4\x8b\x23\x04\x31\x65\x53\x0d\x7a\x21\x84\xf0\x76\x1a\x19\x8b\x73\xdf\x35\x4b\xbe\x84\x65\x3d\xf0\x5f\xde\xe5\x87\x7c\x71\x3f\x03\xfb\xfb\x77\x2f\xae\xde\xfc\xf0\xe2\xb5\x38\x38\xe7\x9a\x9c\x0b\x22\x19\xc9\x29\xcb\xf3\x0e\x81\xe4\x70\x4c\x3f\x2e\xa9\x41\xe5\xd4\x2b\x96\xbb\xbc\x28\x41\x47\xaa\xa5\x3b\x5f\xef\x2f\xa6\x2b\xc6\xf5\xbd\x9b\x1e\x67\xbb\xc6\x33\xc6\xb5\x5a\x08\x12\x79\x26\xe4\x91\x39\xf1\x50\x02\xe8\x4f\x28\xa2\x80\x01\xe6\x2e\xcd\x39\x07\xc3\xb2\xae\x29\x40\xb3\x45\x61\x7d\x36\x5a\x7b\x8c\xb0\x84\xb6\x0b\x9c\x48\x9d\xc6\xd2\xaa\x2d\x6a\x07\x3a\xb4\x37\x3d\xf5\xd2\x5b\xb1\xdc\x11\xb9\x88\xf3\xf5\x2e\xec\x5f\xa2\x32\xfa\xb7\xd1\xbf\xbf\x77\xbb\x63\xd6\xf5\xfa\x8c\x3d\xf7\x87\xe3\xca\xf3\x72\x82\xff\xec\xbf\x23\x9d\xec\x72\x1a\x2b\x96\xe0\xb0\x9c\x6e\x4a\xb4\x9e\x6c\x96\x6f\xca\x03\x96\x63\xc7\x1a\x3f\xee\x7d\x8e\x01\x1d\x9b\x5e\xf9\x0a\x38\xe4\x5b\x50\x4f\x43\x5c\x84\x04\xd0\x49\x6c\x16\x8e\xcb\xa9\x86\x10\x08\x4d\x2e\x0f\x4a\x69\x75\x90\xb7\x11\x2e\x4d\xc5\x31\xd6\x84\xe9\xc2\xa4\xa4\x2c\x3b\xa3\x94\x92\x52\xa9\xdb\x48\xca\xbd\x52\xd3\x1e\x97\x8c\x98\x75\x8f\x55\x80\xfd\xd1\x1e\xe0\xcc\x1e\x20\x57\xc4\x62\xd9\x6b\x6c\x9c\xdd\xa2\x66\xbc\x33\x88\x5c\xee\xb4\xae\x39\x10\xe9\xca\xa6\xfb\x6f\x1e\x9c\x48\xbf\xe3\x70\x7e\xfd\x14\x6f\xb3\x05\xcc\xc4\x3b\x0b\x98\x77\x1e\xc5\x6c\x72\x1b\x72\x53\xbb\x9b\x76\x83\x26\x17\x33\x4f\xbc\xbb\x18\xa6\xac\x0e\x17\x62\x04\xe8\x36\x19\x42\x08\x89\x9a\xf8\x1d\x51\x4a\x29\x02\x32\x52\x13\x42\xbc\x25\x84\x44\x97\x11\x8f\x87\x2b\x7b\x5a\x97\x0a\xa7\x07\x5f\xae\x99\xbe\xe6\x2a\x38\x26\xcb\x0f\xc4\x17\x57\x6f\x57\xc5\xde\xfe\xf8\x26\xb0\x60\xfc\x74\xfd\xed\x77\xfc\x0a\x1e\xfa\xfd\x25\xf9\xb9\xb6\x17\xf9\x87\xf1\x12\x73\x9e\xe5\x19\x2b\xfc\x9e\x0e\xbe\x34\xbe\xec\x0b\xe8\x0f\x76\xd3\x53\x9f\x17\xc5\x16\xb3\x72\x4f\x51\xef\xbb\x12\x25\x14\xb6\x94\x1b\xc3\x61\xe1\x1b\x50\x35\xb4\x80\xd1\x9d\x8d\xe2\xf1\x17\xd9\xc8\xc6\xe3\x27\x6c\x94\x37\x47\x1b\xc5\x55\x59\x96\xa5\xb0\xe8\x36\x42\x92\x73\x89\x40\x84\x6c\x59\x96\xbe\x2b\xcb\xf2\x54\x67\xc9\xef\xa7\xcf\x00\x21\x84\xc2\x61\x7f\xc0\x4a\xcc\xd3\xe9\x04\x3b\x84\x90\xaf\x31\xc6\x41\x1f\x1c\xf2\xd9\xdf\xe9\x73\xc6\x31\xfd\x62\xd9\xdf\x3a\x6d\x13\xbe\x0b\x9b\x5b\x2f\xc2\x7d\xe1\xcd\xba\xd7\xc8\x99\x6e\x34\x63\x36\xd0\x1e\xde\x46\x20\x3a\x1c\x1c\x03\xae\x21\x9c\x1f\xf8\xdc\x4f\x3a\xa7\xfd\xe8\x7c\xe1\xb4\x6f\x00\xd6\x0e\x0c\x0e\xe4\x55\x55\x4d\x66\x18\x86\xb5\x8e\x96\x3c\x71\x4f\xe9\xf0\x31\x2f\xd5\x99\x0e\xd7\xb3\x0e\xc2\xec\x8c\x10\x35\xc8\xfd\xb8\x10\xe5\xf5\x00\xfa\x1d\xc8\x5a\x01\x76\x3b\x66\x0c\x28\xcc\xa2\x8a\xf1\xa3\xf5\x85\x33\xbe\x05\xc8\x38\x30\x58\x90\x5b\x6b\x27\xbd\xa8\x12\xfa\x5c\x7c\x55\x87\x35\xa0\x37\x4b\x9e\xeb\x40\xb1\x79\x22\x44\xfe\xf1\x4d\x98\x50\x2e\xb3\xbb\x17\xaf\xc1\xb7\xdf\x7d\xf3\xe2\x75\x7c\x51\x6c\xa2\xbc\xa2\x10\x66\x07\xc4\x32\x8e\x61\x99\x69\x55\xfa\x46\x00\x58\x1a\xa1\x10\x4d\x7b\x40\x48\x95\xed\x93\x6d\x3e\xa5\x9e\xd0\x70\xc3\x27\xb3\x29\x1f\x98\xf6\xd2\x37\x0a\xe4\xa0\xef\x0e\xcc\xe9\x0e\x24\x13\x13\x0a\xd4\x60\xf4\x7c\xb5\xcd\xee\x23\xdb\x5c\x7f\xca\x36\xd7\x77\xb6\xb1\x06\x14\xd6\xda\x31\x4c\x0c\x84\x37\x36\x30\xf3\x36\x00\x0f\x36\x26\x7e\x10\x4d\x03\x48\x7b\x66\x9d\xdc\x2e\xd6\xb1\x60\x3c\x5a\xa7\xef\xfb\x63\x3d\x55\xbf\x48\x17\x6d\x40\x62\x8c\xe9\xc2\x28\x2b\x74\x14\xf3\x04\xa5\x07\xb0\xd3\x71\xee\x0f\xa2\xaa\x00\xaa\x3f\xa3\xa6\xe2\x0d\xbd\xc5\x57\xe2\x72\xbf\xe6\xdc\xb9\x77\x75\xf3\x3a\x8d\xae\xde\xbc\x8f\x5e\x5c\xbf\x0c\x47\x44\x2e\xb2\x0d\x4d\xa5\xe3\x3a\x35\xbc\xcc\xca\xe4\x36\xf2\xbb\xbd\xe8\x40\xe6\xc7\x52\xe7\x52\xcb\xcb\xfd\xcf\x83\xd7\xb9\xcd\x35\x60\x1b\x73\x33\x4c\x43\xa7\x4c\x9c\x6c\x22\x7f\xc8\xfd\x78\xc0\x87\x28\x02\x00\xdf\xa2\xab\x24\x56\x81\xc3\xe5\xfa\xc5\xf5\x7d\x96\xec\x97\xcb\xc9\x1f\xfc\x41\x24\x97\x51\xca\x95\x6b\xb3\xde\xa0\x3c\xfd\x79\x44\x17\xf2\x03\x8d\x95\xaf\xd8\xc1\x24\x3a\x81\x04\x30\x1a\x2d\xf2\xf0\x55\x12\xd7\xcb\x7d\xc7\x17\x4b\x9e\x90\xeb\x37\x77\xd2\xd8\x25\x5a\xa4\x09\xe9\x5d\xd6\x0e\xc5\x2a\x8c\xc5\xb5\x37\xec\x36\xb2\xa6\x60\x80\xf3\xe8\xa4\xdb\xa6\xbc\xd3\xed\x3c\xe7\xc8\x43\x69\xae\xcd\x3a\x83\x8f\xba\xb1\x4d\xe9\xb9\xf6\x7d\x95\xda\x14\x49\x60\xf5\x9d\xbc\xfc\xeb\xe4\xe5\x5e\x28\x3f\x04\x79\x02\x18\x15\xee\x4c\xdd\x92\x98\x6f\x8b\x20\x6f\xbd\xce\x79\xef\x0c\xed\x4b\x50\xfb\x01\xb4\x7e\x9f\x02\x44\x14\x62\x39\xc7\x79\x96\xf8\x06\x5e\x70\x00\xcd\x54\xfb\x76\x6a\x6e\xa3\xcc\x66\x0a\xb8\x98\x1d\xc7\xd6\x64\x93\x6c\xe1\x7d\x99\x67\xa3\xfb\x97\x31\x9f\x03\xa0\x67\x39\x68\xb8\xa5\x3a\xd7\x1c\xc2\xc4\x97\xf8\x42\x80\xc2\x4e\x95\x6f\x27\xb7\xcb\x5c\x26\x81\x8d\x45\x04\xa2\xea\x96\x6c\xf8\xb3\xf2\xba\x69\x8c\x5b\x9f\x17\xe0\x20\x1d\x37\xb9\x15\xa8\x4c\xa7\x3d\x79\x20\x4f\x01\x13\xe4\xb5\xb7\xe4\x02\x3f\x27\x6f\xa3\x26\xba\xc1\x93\x29\xe3\x5e\x77\xaa\xc9\x5b\xcd\x51\x36\x65\xfc\x81\x3c\x0d\x74\x90\xa7\x6f\x49\xdc\x3d\xab\x1f\xf4\x3c\x86\xde\xe4\x40\x53\x43\x45\xae\x68\x51\x24\x9e\xa3\xd9\x86\x27\x79\x36\xd3\xc0\xc6\x2c\xb4\x65\x71\x65\x63\x7e\x97\x69\xf4\xa7\xd3\x29\x9f\x23\x11\xe3\xf5\x0b\xde\x5e\xd6\xed\xa1\xbf\xec\xfd\xce\xfa\xbd\xf5\xbb\x64\xee\x70\xac\x3d\xe7\xbf\x3d\xca\x02\xe5\x59\xd6\xd2\x95\x50\x77\xf6\x95\xcb\xf5\xb3\x1d\xda\x43\xdf\x06\xa6\x58\x10\xae\xca\x80\x2a\xfc\x7f\x79\x3c\x33\x3c\x37\x7a\xb7\xf6\x07\xb3\x3c\xfe\x75\xf2\xb8\x9f\x15\x64\xde\xf5\x7d\x08\x5b\x27\x79\xdd\x63\xf2\x56\x8e\xf3\xeb\x17\x4f\xca\xeb\x3c\xb2\x76\x1e\xb8\x1f\xcf\x35\x03\x78\x92\x19\xe7\x5f\x25\x33\xce\xa7\x9d\xb5\x81\xf8\x55\x7b\xb9\x7c\xee\x64\xa2\xaf\x93\x89\xa6\xce\xda\x38\x1c\x22\x3f\x92\xb7\x46\x4b\x0e\xf2\x2b\x08\x0e\x27\xce\xac\xf4\xac\x29\xc7\xeb\xe5\xa1\x8d\x76\x49\xba\xc9\xb9\xd3\x6d\x1e\xda\xf2\x84\xed\x64\x51\x9c\xca\xc9\xc6\x35\x38\x64\x25\xf4\xc2\x65\x26\xa3\xad\xaf\x89\x21\xed\xca\x0d\xbc\xc8\x6e\x16\xd9\x8f\x8b\x7e\xbf\xd1\x2e\xdd\x64\xab\x68\x54\xa4\x13\x36\x93\x41\x71\xa4\x27\x1b\x37\x29\x68\x32\xec\xb5\xcd\x4c\x86\x6b\xdf\x61\x83\x6a\x5d\x04\xd9\x17\x87\x5b\x7c\x25\xd7\x75\xdd\xb0\x52\x99\x5e\x9d\x9d\x64\x5a\xd9\x16\x5f\x5f\xe6\xda\x82\xb2\x2c\x0c\xc4\x39\x29\x21\x4c\xab\x4e\xd5\x7a\x49\x1e\xff\x61\xd8\xb9\xc4\x24\xbb\x4d\xe5\xfb\x49\x7b\xc1\x81\x8c\x0b\x00\x23\x70\xc1\x56\xd9\xdf\x9d\x64\xdf\x31\xad\xaf\x37\xfe\x2f\xba\xda\x01\xc6\x25\x95\x99\x9c\x1b\x52\x9b\xf8\x4e\x82\x34\xa9\x2f\xb3\xd9\xb7\x3e\x58\x5f\xe7\x36\x07\xd1\x46\xdf\x94\xde\x48\x40\x36\x62\xd1\x3b\x5f\x65\x67\x1f\xeb\x7d\x27\xdc\x74\x0e\xa8\xb2\x30\x4c\xe5\x9a\x41\x98\x8c\x89\xaf\x24\x80\x49\xb7\x4a\xef\xc7\x6a\x96\x9e\x6c\xd4\x0d\xf2\x5a\x02\xba\xe1\x51\x04\x36\xdd\xca\x13\xff\x88\xec\xf7\x2f\xaf\xd3\x45\x36\xed\x1c\xa8\x51\x61\xe7\x10\x15\x92\x45\xed\xbd\x92\x80\x9c\x64\x0f\xe3\xac\x79\xbf\x69\xce\x15\x0f\x7d\xfb\x05\xfa\x45\x7d\x7b\x6d\x00\x35\x75\xbd\x0f\xd3\x22\xeb\x79\xb8\xcf\x33\x8f\x35\xf6\x75\x6c\x7d\xa5\xc6\x11\xc8\xf1\x33\xc6\x19\xe1\x6c\x43\x6c\xc3\x9e\xcd\xd9\x8e\x4d\x04\x0e\x0e\x11\xc7\x38\x01\xc5\x56\xc2\xa6\xf9\x59\x5c\x30\xab\x1c\x58\xee\x05\xcf\xef\x94\xe1\xfc\xc9\xf1\x9d\xab\x70\x6e\xaf\xa4\x56\x90\xdd\x56\xc2\x71\xf8\xb9\xb9\x88\x9a\xf3\xe7\xd5\xc7\x18\xa3\xc3\xcc\x61\x42\x40\x7a\x7c\x25\x13\xec\xfc\x9d\xe1\xa3\x77\xe2\xd2\x51\x19\xf4\xa2\x5b\x09\x77\xe3\xcf\xdd\x45\xa9\xc4\xf2\x4e\x1c\xf1\x0b\x1b\x72\x6c\xfc\xcd\x9a\x89\xe0\x5e\x26\xa6\x1f\x96\x63\xf6\xe7\x99\x99\x20\xe8\x6f\x23\x54\x1a\x44\x15\x53\x6a\xbf\x71\x36\xcd\xe2\xc2\xb7\xd8\x40\xa4\x09\xd7\xdd\x56\x43\xaa\x11\x22\x9c\x2b\xc6\x9a\x01\x16\x50\x53\x42\xa8\xa0\xac\xba\x8f\x97\x3f\x8f\xf7\xea\x13\x80\x42\xe3\xb9\x1f\x51\xc3\x23\x80\x8a\x70\x9e\x28\x12\xae\xc6\xce\x98\x9b\x36\x60\xbe\x38\x65\x5f\x3e\xcf\xfa\xf4\xcd\xc7\x89\xa0\xbe\x01\x8d\x43\x60\xef\x07\x82\x2a\xc4\x08\xce\x31\x34\xfb\x8d\x0d\xfc\xb6\xbe\x22\xc8\xe1\xb3\x4c\x50\x95\x15\x8a\xd5\xce\x40\x56\x72\x90\x01\x0c\x29\x59\x7f\x53\xf0\xf9\x37\x47\x1d\xd8\x79\x2e\xaa\xfb\x29\xaf\x9e\x50\x61\xee\xcb\x7d\x4f\xf0\xac\x03\x53\x66\xb7\x71\x2e\x2b\x62\xe4\xab\xf0\x2b\x89\x33\x02\x83\x06\x9c\x5b\x6d\x59\xd7\xec\x2a\x01\x4a\xa0\x4e\x3f\xd7\x50\x20\x11\xce\x9d\x6d\x22\x75\x6b\x37\x2a\xb4\xcd\x7f\xb1\xf0\x3f\x85\xdd\x95\x33\xea\xd2\x95\x57\xe7\x78\x88\xd6\x80\x3c\xc4\x70\x54\xe6\x85\xa6\xb9\x9e\xdb\x69\x97\x57\xda\x8f\x31\x52\x6e\x0d\x61\x53\xe4\x75\x9a\x71\x9a\xf7\x7d\xc1\x18\xb2\x79\x0e\x96\x54\x7a\xf3\x27\x3a\xe1\x56\x77\xb8\xe0\x0c\xea\xc5\xb9\x0e\x2f\x57\xdc\x4d\xc1\x72\x93\xfa\xd1\xd7\xd9\x0c\xb6\x6a\x41\x50\x56\x40\xe5\x34\x90\x5d\x57\x30\x52\xda\x2c\x07\xd5\x26\x5a\x75\x90\x69\x46\x09\xc0\x67\xc0\xf1\xa6\x9a\xfb\xaa\x2d\x3b\x32\xff\x5d\x2c\xdc\x59\x4b\x77\xf5\xfd\x66\xee\xa7\x76\xc6\x2b\xdf\xc7\x4d\x3b\xdc\xa4\x0a\xe8\x1d\xa0\xbe\xda\x32\xc3\x52\x6f\xec\x4d\x65\xcc\xe5\x98\xff\x1c\x6d\xe8\x5a\x06\xba\x95\x67\x59\xe8\xaf\xfe\xb2\x6c\x90\x3c\x51\x88\x78\x8f\x73\x9b\x1c\xfc\x90\x19\x39\x4f\x39\x2d\x48\xfc\x01\x95\x69\x5e\x08\xcb\x81\x6c\xfb\x02\xc2\x4f\x16\xe2\x6a\x23\xc3\x7d\xc7\xbb\x71\xcb\x31\x0f\xf7\xfd\xac\xb0\xc7\xdd\xab\xf5\xde\xd9\x26\xec\x60\xfd\xb0\xa6\x96\xb4\x53\x69\xd9\xa6\xbc\xe9\x8e\x49\x4e\x0e\x00\xe6\x19\xa8\x3f\xec\x41\x93\xe6\x88\xcb\xdb\x08\xf5\x60\xdf\x3a\x51\x35\xdb\x72\xb9\xbc\xe7\xbb\x89\x03\xad\xbd\xd4\xbe\xc1\xd4\x98\x72\x9e\x29\x5a\x61\x88\xe5\x5a\xbb\x79\x48\x1f\x5d\xc5\xbb\xaf\xd6\x6d\xcd\x59\x70\xc5\xed\xcd\xde\xb2\x8d\xba\x51\xf6\x78\xe9\x0d\x60\x98\x83\xe1\x83\x06\xfb\xac\x28\xb9\xf1\x1d\x06\x51\x9c\x0f\x8d\x68\xbb\x67\x95\x33\xf2\x4c\xb9\x8b\xc8\xdc\xda\xb8\xb9\xdc\x9f\x8f\x53\x42\x32\xaa\x40\x9d\xf6\x62\xfd\xc4\x8d\x3d\x58\x7b\x08\x5f\x97\xfb\x9f\x23\xec\xb6\xd4\x63\x50\x4c\xf9\xf2\x89\x2e\x22\x77\x6b\xe3\xfe\xa1\x9c\xf3\x1b\x65\xe1\x56\x59\x6f\xfd\xc1\x98\xf3\xd3\x88\x97\xfb\xff\x38\x88\x87\xe2\xa2\x38\x5e\xf2\x83\xca\xe8\xbf\x0f\x99\x1a\xef\x7a\xaf\xeb\x53\x5a\x81\xb0\xef\x7e\x75\xc7\x51\xbb\x12\x8e\xdf\xed\xd8\xbe\xb8\x3e\x1e\x88\x7e\xf7\xf6\xf2\xfa\xd5\xf5\x66\x6f\x80\x72\xfb\xbd\xdf\x83\x1d\xe7\x25\x2a\x28\x85\x88\x14\x25\xc1\x85\x10\x9c\xfb\xca\x20\x52\x16\x18\x15\xb0\xe4\xf3\x8f\x16\xec\xfd\xfe\x70\x88\x53\xaf\x80\xda\xca\xa6\x69\x8c\xdf\xeb\x1b\x4e\x59\x62\x32\x68\x61\x23\x28\xe5\xaa\x25\xf5\x08\xfa\x1b\x0e\x30\x6c\x4c\x49\x99\x66\x6c\xf9\x4d\x79\x41\x34\x48\x17\xae\x8b\x8b\x95\x2f\x69\x1e\xf3\xff\x43\xf4\xef\x23\x3a\xcf\xc6\x1e\x63\x70\xf9\xe1\x3a\x7e\xe4\xb7\xe0\xe3\xdf\xbe\x5b\x1e\xde\x3c\x42\x02\xd3\xc6\x65\x2a\x09\x66\x08\xab\x9a\xd4\x8c\x0b\xc6\x59\x99\x79\x11\xeb\x38\x4d\x15\x0f\x1c\x16\x0e\x3b\x2e\x05\x93\x1c\x65\xde\x4e\x15\xd8\x65\x94\x51\x4a\x49\xd5\x93\x51\x30\xc1\x29\x2d\x52\xdf\xc5\x30\x46\x59\xc3\x6b\xe6\x24\xd7\x58\x32\x55\x98\x9c\xf2\xcc\x8b\x2d\xdc\x77\x25\x12\xa8\x74\x44\x11\x81\x4b\x5e\x22\xc1\xcd\x6d\xd4\x11\xa2\x28\x71\x48\x61\x4e\x10\x2f\xb1\x90\x13\xf2\x87\x86\x30\x41\xf1\x9e\x1b\xde\xce\xbf\x45\x09\x13\xda\x3b\x7f\x10\x44\x62\x29\xb1\x41\xac\x69\x0b\xab\xeb\x66\xd9\xaf\xbc\xc8\xb6\xf3\xfc\xf7\xef\xa3\x7f\x1b\xfd\x6f\x73\xf4\x7d\xcc\x22\xb3\x9d\xbe\xbb\xba\xf7\xbb\xd7\x2f\xc3\xdf\xef\xce\xfe\xe5\xcd\x6a\xb8\xfb\xcf\x39\x50\x65\xb4\x84\xb4\x80\x54\x63\x8d\x30\xa1\xb8\x2c\x52\x7f\x00\x3b\x20\x53\x6e\xd8\x5c\x22\x59\x62\xc2\x50\x09\xd3\x01\xa2\x32\x4f\x76\xc0\xa4\x8c\x70\xc8\x0d\x31\xcc\x79\x0e\x64\x8a\x51\x49\xa9\xd2\xd8\x61\x84\x29\x84\x59\xd2\x6f\x4b\xbf\xab\xcb\x52\x94\x50\x53\x45\x05\x46\x0c\x22\xa2\xb5\xdf\xf5\xad\xa8\x25\x56\x84\x51\xcc\x4a\x2c\xe5\x8d\x24\x84\x0b\xed\xc7\x41\x71\x52\x33\xcd\x9a\x3d\x48\x7d\xef\x08\xe5\x6a\xa4\x5a\xb4\x04\x33\x58\x72\x16\x05\x7b\xa0\x0b\xb5\x85\xd1\x37\xd1\xdf\x47\x28\xfa\xbf\x16\x7b\x7c\x77\x75\x8f\x9a\xf9\x9e\xd3\xfc\x77\xe0\x74\x44\xfb\xdb\xef\xfe\xf2\x36\x90\xfc\xde\x33\xc2\x23\xce\xf4\xfe\xa7\xd7\x15\x18\x52\x26\x18\xe3\x8a\xd8\xb2\x61\x14\x17\xa9\xef\xe3\x0c\x54\xa9\xa4\x98\x61\xcc\x24\xc1\x90\x10\xca\x08\x2a\xd3\xdb\x08\x61\x9c\xe4\xc9\x3c\xa5\x9a\x4d\x29\xf0\x6c\x18\x4a\x85\x47\xc0\x65\x38\x94\x5c\x56\xa4\x62\x64\x36\x62\x9e\xec\xb7\xd0\x1f\x1a\x21\x98\xc1\x8a\x32\xcd\x21\xe2\xdc\xf8\xb1\xa3\x5c\x30\xaa\x90\x2a\x20\x09\xa6\x61\xfa\x46\x11\x9a\xcc\xb6\x19\x7a\x42\x38\xaf\x98\x61\x95\x54\x20\xf5\xbb\x9a\xcc\x26\x1d\x56\x27\x82\x25\x5b\xe2\xd7\x6c\x1f\x11\xec\xf3\x26\xfa\xc7\xe8\xff\x7c\xce\x3e\xf7\x3d\xe8\x57\xb2\x0e\x47\x25\x67\xc4\x12\x49\x29\x65\x04\xc3\x5f\xc9\x36\x87\xae\x44\x52\x28\xa2\x90\x08\x44\xf7\x4c\x7e\x91\x65\x82\x5d\x2e\xf1\x16\x46\x2f\xa3\x22\xfa\xc7\xe8\xff\xb8\x6f\x97\xfb\xad\xe8\xc7\x8f\x0c\x73\x67\x96\x1f\xef\xec\xf2\x20\x5c\xcd\x0f\x35\x71\x96\x0a\xc3\x94\xac\x70\x85\x8f\x71\xc6\xc4\x34\x8e\x32\xd1\x72\x4a\x45\x8d\xb5\xe0\x82\x33\x5e\x66\xbe\x22\x9c\x15\xf3\x3f\xe7\x99\xa0\x44\x20\x2c\x6b\x52\x73\xa1\xa6\x3d\xe8\xd3\xd9\x7a\x98\xb8\x96\x74\x92\x31\xe6\x8a\xc4\x8f\x5b\x78\x1b\xb5\x42\x08\x4b\x14\xe1\x78\x8e\x1b\x54\x19\xbf\x6f\x9c\xa2\x58\xaf\x86\x59\x5c\x86\x72\x6e\xb4\x1f\x06\xc6\x05\xa5\x0d\x33\xcc\x29\x05\xd2\x43\x47\x98\x20\x78\xb7\xda\x45\x30\x11\x45\x17\x9b\xe5\x4e\x4e\x19\xfd\x29\xfa\x57\x4b\x7b\x02\x8f\xd9\xe0\xd4\xa2\xae\xce\xfd\xe8\x51\xdf\x78\x22\x64\x6f\x18\x38\xa4\x5c\xb1\xb2\xe4\x16\x6b\xca\x39\x63\x14\xa6\xbe\x8e\x21\x18\x33\x4e\x09\xc7\x84\x61\x8a\x2d\xee\x38\xa5\x65\xea\xbb\xe9\x00\x9a\x8c\xcc\x4e\x81\x65\x47\x66\xeb\x31\x8c\xf2\x39\x2c\xed\xe3\x28\x73\xd4\x72\xc5\xa8\xc4\x21\x23\x60\x86\x71\xe6\xeb\xb9\x9b\x6f\x85\x2c\xa1\x21\x0a\x07\x6b\x20\x26\x8d\xdf\x35\x84\x48\x82\x39\x82\x8a\x70\x13\x4c\x34\xa1\x39\x34\x53\x49\xf0\x20\x34\xef\xe6\x47\x4b\xc6\x8d\xd7\x07\x41\x04\x12\x02\x69\xc4\x9b\xb6\x30\xca\x36\x73\x5f\x35\x9c\x6c\xf4\x0f\x77\x36\xfa\xa8\x01\xdd\xd9\x28\xe4\x83\x7d\xd2\x48\xcf\xd8\x08\xc5\x49\xc6\x31\x62\x52\x5a\xec\xf0\x6c\x23\x56\xe4\xde\xc5\x08\xec\x32\xce\x08\x27\x84\x66\x0c\x61\xcd\x3a\xc6\x18\xcc\x7c\x3b\xed\x40\x9b\x11\x8a\x29\xc6\xa6\x25\xb3\xe9\x98\xc9\x53\xbf\x07\x87\x38\xcd\x1c\x75\x5c\x73\x2a\x89\xa0\x72\xb6\x11\xc9\xbc\xdb\x96\x7e\x5f\x97\xa5\x5c\xbc\x28\xd8\x88\x68\xe3\xc7\x1a\xcf\xd6\x60\x79\x99\x2b\x2c\x8e\x46\xf2\xfb\x86\x50\x49\xd1\xc8\x17\x23\x89\xd9\x46\x6a\x1f\x6c\xc4\xf1\x6a\x23\x6d\xdb\xd9\x8f\xe4\x6a\xa3\x57\xd1\xbf\x8e\xfe\x43\xf4\x7f\x9f\x6c\xf4\xbc\x23\x3d\xd3\xa1\xff\x23\x78\xf7\x94\x99\x42\xf4\x41\x25\x83\x50\x4a\x62\x30\x63\x8c\x62\x38\x77\xcf\x09\xe8\x32\x16\x7a\xfa\x94\x18\xac\x08\x5d\xff\x65\xf4\x11\x68\x52\x8c\x11\x2d\x4b\x69\xb1\x25\x8c\x31\x82\x92\x62\x1e\xf9\x80\x5d\x66\x88\x9e\x5b\x0a\x27\x1c\xf3\x4c\xa7\x08\xa7\xbe\x5b\x0c\x85\x44\x09\x2d\x9e\x3b\xc0\xd9\x52\x92\x1d\xbd\x09\x25\xf2\xe4\x63\xc4\x4c\xc8\x0f\x35\xa6\x02\x97\x3d\x37\xbc\x66\x98\x97\x38\xa9\xf3\xa3\x3f\x71\xbe\xfa\x93\x56\xae\x7a\x62\xec\xf3\xf9\x0d\xe9\x8b\xc7\x3e\x99\x98\x2d\x42\x64\x4d\x2a\x26\x25\x17\xe2\x57\x1f\xfb\xdc\x46\xcd\x6c\xa9\xd2\xce\x36\x99\x2d\x85\xe5\xaf\x31\xf8\x09\xbc\x28\xfc\x16\x6f\xe0\x29\x9f\xcb\x9b\xe8\x1f\x3e\x91\xd3\xe5\xc1\x0d\x78\x01\x52\x13\x76\xce\xe6\xe1\x75\xea\xf7\xc6\xef\x40\x36\x4f\xab\xfc\xde\x09\x01\x22\xe9\x75\xf8\x76\x39\x38\x67\xed\x94\x39\xeb\x5b\x80\xac\x8b\x77\xd6\xc3\xba\xae\x7d\x1e\xf2\x50\x5f\x6c\xb2\x50\x67\x2c\xba\x8c\xde\x45\xff\xed\xc2\x8f\x7e\x71\xf9\x26\x3f\xdd\x52\x7e\xfb\xea\x7a\xcd\xf4\xf5\xea\x7e\xc7\xb0\x90\x3a\x85\x8d\xfa\xb7\x21\x95\xe1\xfb\x9f\xd6\x0b\xec\x05\xf1\x62\x6a\x20\x18\xfd\x8e\x95\x00\x73\x58\x95\xac\x9a\xfa\x2c\x96\x13\x4f\xb3\x18\x61\x65\x3a\x32\x56\xed\x01\x8f\x56\x10\x66\xd4\x9e\x1e\x40\x96\xde\x46\x0e\x22\x50\x12\x25\x90\x3f\x60\x28\x0b\xbc\x65\x9a\x64\xa6\x11\xca\x55\xd0\x68\x6d\x0d\x41\xba\x93\x18\x5a\x24\x64\x69\x0b\xca\x55\x57\x31\x50\x00\x62\xac\xa6\xf8\xc6\x6a\x46\xcd\xa6\x9f\xc3\x46\xb8\x0b\xbd\xe9\xcf\xf8\xdf\xc3\xfa\xc2\x37\xdf\x85\xd3\xc3\xdf\x2e\x47\xd4\x5f\xff\x5d\xbc\xb9\x5e\x0f\x9f\xbd\xf8\x7e\xf3\xe3\xe6\xea\xc5\xb6\x57\xae\x4e\x52\x00\xfd\x90\x13\x58\x14\x89\x4e\x19\xe6\x1d\xf4\xbb\x4a\x67\xf5\x1e\x83\x2e\x4b\x93\xc3\x56\x6a\x04\xfd\x30\x5a\xaf\x47\xd3\xe5\x83\x02\x15\xd8\x4f\x05\x2c\x2d\x41\x64\x9b\xa1\x49\x0f\x20\x85\x1e\x2f\x5c\xc5\x4b\x2e\xb6\xbf\x5d\x39\x0e\xee\xb2\xcf\xae\x8b\x0c\x0b\x53\xfb\x29\xfd\xec\x3d\x66\x83\x70\xca\x2b\x57\x0c\x63\xdb\x1f\x6a\x93\x15\x92\x21\x9d\x66\x7b\x3f\x40\x67\xb4\xcd\x6b\x51\x09\x80\x51\x6e\xf2\xd2\x97\x26\x23\x86\x80\xd9\x30\x17\x45\x92\x69\x5b\xfa\xd2\xef\x8b\x82\x92\xb2\xdd\x61\x82\x69\xa9\xab\x7d\x9e\x99\x1d\x90\xd0\x57\x37\xa2\xee\xe1\x50\x67\xc5\x6d\x34\xe2\x71\x18\x76\xe9\xa1\x8d\x8e\xfa\x92\x5f\x45\x5f\x23\xb3\x42\x53\x6c\xd2\x6c\xf4\x87\x33\x7d\xf3\x45\x5f\xf6\xa8\xbe\x79\x8e\x31\x6e\x06\x84\x10\x81\xf7\xf4\x55\xca\xc1\x4a\x25\x0f\xf5\x0d\xe7\xad\xec\x56\xad\xfc\xfe\xef\x4e\xeb\x48\xc7\xe3\xf7\x1f\x7b\xed\xfb\x9f\x96\xbb\xe7\xc7\xa9\x78\x18\x07\x5d\x48\x9b\x66\xb1\x9d\x0a\x58\xc4\xa3\x4f\xb3\x3c\x2e\xa9\x96\x2d\x6d\x9b\xe6\x80\x3a\xcb\x31\x22\xbc\xa1\xb2\x80\xbc\x71\xc7\xe5\x08\x88\x8d\xc6\x5b\x95\x23\xa8\x49\x39\x39\x84\x54\x27\x4b\x68\xa1\xe0\xa5\xcb\x11\x53\x14\xc9\x6a\x88\x21\x84\xa2\xf1\x92\xfb\x5a\xf8\xc4\x30\x6a\xef\xda\xbf\xfa\x25\xed\xbf\xb4\x00\xf9\xf6\x6e\xf7\xbc\x05\xc8\x8f\x20\xf7\x5d\xad\x35\xc8\xb5\xa7\xe1\xdb\x72\xe8\xed\xbc\xfd\x3b\x0f\xab\xaa\x5a\xdb\xff\xa2\xc7\xf0\xf5\x7a\x48\xc0\x02\x8f\x7b\xd0\x05\xfb\xe6\xb4\x51\xed\x5d\x53\x55\x00\x55\x3e\x0b\xdf\x2e\x47\x6b\xad\x9d\x12\xbb\xe8\x61\xe3\x83\x5d\xf4\x28\xc2\x06\x52\xd0\xe3\x42\xfc\x12\x3d\x2a\x1b\xee\x3f\x29\xaf\x96\x93\xb4\x18\x34\x21\xdf\x15\xed\x87\x01\x88\x71\xaa\xc3\xb7\xa0\x87\x9b\xd2\x93\x1e\xfb\xa3\x3d\xaa\xaa\x8a\x22\x10\xc3\x95\x9f\xfd\xdb\x93\x27\x9d\xd1\xef\x84\x75\xc9\x8d\xab\x72\xb8\x71\x13\x8a\xd1\xd4\xc6\x74\xaa\x9c\xe2\xb5\xd8\x6f\x65\xa1\x84\xf5\x9d\xf1\x9d\xf5\xd9\xa5\x3a\x74\x6a\xe5\xb2\x89\xf3\x5b\x16\xce\x53\xfe\xbb\xe8\x3f\x44\xff\xd3\x5d\xce\xe6\x25\xaa\xbe\x0e\xee\x79\xfd\x60\x9b\x27\xe4\x09\xb8\xa3\x62\x3c\xe5\xa7\x0f\xc3\xf6\x13\x6b\x63\x5c\x83\x06\x66\x2e\x2b\xe2\x7c\xaa\x73\x18\x0f\x23\x6f\x64\xaf\x3c\x27\x3c\xae\x98\x9c\x47\x55\x34\xcf\x52\x4f\x10\x48\x40\x46\x92\x2a\x47\xa5\x57\x5e\x0b\xc6\x79\xa7\xfd\x1e\x48\xe6\x65\x87\xa1\x2e\xf0\x26\xb7\x10\x69\x74\x09\x6d\x93\x39\xab\x39\xd3\xce\x9a\xfe\x30\xfb\x6d\x95\xda\xb4\x74\x1e\x15\x19\x72\xa8\x45\x10\x89\x38\xa7\x58\xdb\x4a\x77\xa0\xa5\x1c\xb1\x79\xc0\x42\x31\x0b\xeb\x1f\xc9\x9a\x33\xe2\xff\x17\x78\x62\xff\xe1\x98\x2d\xfc\x7b\x10\x5d\xbe\x89\xae\xd6\xda\xfc\xe6\x2e\x21\xdc\x8b\xeb\x77\xaf\xc3\x31\x99\xbf\x05\xd7\xef\x2e\x2a\x57\x80\x1c\x30\xe2\x1b\xdf\xf8\xbd\xaf\x08\xe8\x71\xac\x6e\x23\xb0\xf7\xa4\x06\x4a\x78\xdd\x5a\xcf\x35\xa8\xa5\xa7\xa0\x1f\x59\x70\xbb\x11\x90\xad\x86\xe5\xc1\x98\xb9\x4b\xdc\xd5\x81\x7f\xc6\xf9\xc4\x1f\x8c\x6e\xe6\x06\xd2\x88\xe6\x00\x0e\x6e\xda\xef\x1a\xb8\x8b\x36\x51\x19\x38\xff\xf5\x9a\x15\xe4\x9c\xaf\x62\x65\x91\x7d\x98\xbe\xea\xea\xcd\xf7\x2f\x5f\x5d\xbf\x0b\xdc\x69\x3b\x9b\xa6\x56\x72\xa1\xa4\x06\x51\x5e\x0a\x02\x9d\x87\x5a\xe6\x85\x14\x58\xe7\xf5\x88\x91\x00\x79\x11\x14\x43\x5b\x0d\xf3\x42\x68\xa9\x59\xaf\x10\xc2\x54\x4c\xc8\xeb\xb2\x44\x88\x54\x0d\x61\x94\xe0\x0b\x85\xc4\xc1\x0b\x63\xfc\x3e\xac\x1f\x2d\xba\x91\xad\x3e\xb6\x01\xf0\xdd\x51\xb5\xb7\x67\xaa\xdd\x25\x85\x7d\x71\xf5\x26\x3a\xa9\xd6\xda\xdc\x2a\x21\x24\x57\x63\x5e\x08\x04\xad\xc7\x5a\x10\x25\x88\x49\xb3\x6a\x40\x50\x80\xa4\x08\x01\x23\xdf\x6a\x88\xa4\x95\x86\x77\xfa\x4c\x2f\x45\xea\x9e\x20\x34\xeb\x25\xa0\x00\x91\xe7\x47\xc5\x16\xbd\xaa\x4f\xda\xec\x71\xc5\xe2\xcc\xa6\x99\xd5\x42\x6a\x69\x41\x56\x94\x92\x94\xd6\x67\x46\x11\xa9\x88\xce\xb2\x66\x87\xa8\x00\x28\x5b\xae\xd3\x6d\x35\x2c\x72\x69\x8e\xba\x31\x3e\xeb\x06\x67\xdd\x5a\x82\x20\xc5\xf8\x42\xe3\x47\x74\xeb\x1e\xb3\xd9\x63\xd5\x79\xf9\x50\xb5\xa2\xb2\x42\x59\x75\xd4\xac\xf2\x89\xd3\x05\x94\x96\x6a\xd4\xde\x46\xab\x6a\x73\x88\xe3\x5b\x0d\xf1\xac\x99\xe8\xef\x34\x2b\x4b\x5c\xce\x66\xd3\x8c\x7c\xa4\xd9\xdc\xf6\x49\xb8\x9f\xa6\xc2\x59\xc1\xe2\xc4\xbc\xba\xe6\x47\x5c\x03\x4b\xa0\x3f\xc9\xbf\x0f\xb9\x90\x5e\x06\xc3\xbe\xb8\xde\xf4\x7a\x1e\xea\x6f\x12\x43\xb5\x36\x53\x7a\x91\x7a\x32\x07\x37\xd3\x77\xa5\xf1\x95\x37\x92\x5a\x06\xd2\xcc\x26\x90\x3b\x8f\xb6\xaa\x6a\x48\x5d\x91\x72\x74\xd4\xf9\xda\x7a\x63\x3d\xc9\x5d\xd5\xf4\x46\x83\x34\xce\xd2\x7d\xd3\x90\x8d\x5e\x73\xc7\xdc\xa2\xb0\x27\x76\x19\xd8\x2d\xc3\x95\xc7\x3b\x4e\x96\x28\x4e\xb4\xf5\x03\x03\x59\xa7\x89\xb6\x0c\x33\x80\xb6\x12\xfb\x61\x50\xc3\x80\x5d\x75\x93\x6f\x10\x2b\x15\x58\xef\x1d\xd3\x5b\x1b\xe2\xe5\x65\xc8\xcf\xb5\x30\x61\x3f\xc2\x05\x7e\xd1\x48\xac\xb1\xf4\xec\x62\x37\x0d\x21\x43\x00\xfe\xb9\x8d\xe9\xdc\x91\x4e\xe3\x56\x0a\x4d\x94\xf0\x83\xf5\xd0\x78\x68\x2d\xe8\x0d\xe8\x97\xfd\x6a\x75\x8b\xaf\x44\x2c\xa3\xbf\x5e\xce\x25\xbe\x0a\x5c\x36\x73\x4f\xa0\xb6\xfb\x9b\x0e\x08\x80\xb1\xef\x7c\xe7\x6e\x76\xb1\x34\x94\x1b\x67\xa9\x67\xb1\x0b\x7d\xac\xde\xd0\x2b\xb9\x65\x67\x2c\x53\x8b\x8c\xc0\x16\x30\xcb\x78\xf5\x7a\xc9\x97\xf8\xea\xfa\x87\xf5\x24\xdf\xfc\x7d\xdc\xa2\x09\x6e\x0a\x37\xc9\xf9\xcf\xa6\x98\x60\xe0\x3d\xd9\xe4\xe0\xe0\x13\xb0\xf7\xe9\xcd\x30\xff\xbc\x65\x9a\x79\xb3\x9b\x3b\x99\x11\x70\xe6\x3b\x29\x25\x51\x52\xae\xbc\x87\x17\xd1\xe7\x60\x5f\xae\x98\x97\x67\xd8\xc5\x06\xba\x49\xd8\x49\xb8\x0d\x9c\xe0\xa6\x9d\xcd\x75\xd3\x87\xac\xf2\x70\x06\xbe\x69\x67\x45\xb6\x4c\x96\xbe\xda\xcd\xe3\xfe\x1d\xa0\xe5\xc8\x18\x2f\x19\x65\x4b\xb9\xe1\x95\xdc\xd2\xc7\xb0\xef\x0e\x8a\xdc\x95\xfb\xf2\x73\xca\xbd\x94\x79\x53\xcc\x6a\x6c\xa9\x16\x5e\x80\xc4\x53\x50\xdd\x46\xe1\x20\xba\x92\x92\x48\xb1\x96\x5d\x6f\x92\xe7\xf1\x5f\x7d\x11\x7e\x11\x0a\xdd\xdf\xfd\xff\x96\x6a\xe9\x25\x88\x7c\x09\xba\x03\x50\xd2\x3b\xa5\x14\x93\x72\xf6\x42\x1d\x8f\x0f\xb1\xc1\xf5\xbb\x8f\xd0\xc1\x03\xec\x4d\x3d\xc1\x87\xf0\xdd\x47\xe8\xe5\xfc\xf7\x65\xaf\x57\xf8\x1c\x8c\x07\xa0\x6e\x23\xa5\x94\x54\x81\x6b\xfa\x32\xe4\x79\x15\x5b\x15\xfd\xb3\xe8\xe5\x7a\x27\x39\x02\x0b\x35\xdb\x8b\x95\x99\x3c\x1c\x84\x01\xc7\x33\xa3\xeb\xb9\xd1\x37\x3f\x85\xc3\xa3\x73\x17\xff\xf2\xea\xfa\x5d\x3c\x00\x94\x57\x49\x1a\xa7\xf6\xe7\x1d\x60\xd0\xef\x81\x02\x83\x67\x99\xc7\x17\xd8\x8b\x30\xd2\x39\xf8\xa4\x9a\x06\xc4\x79\xcc\xa7\x7d\x15\x1f\xa6\x24\xa7\xc0\x5d\xee\x4d\x51\xc2\x39\xfe\x28\xa5\x90\x6f\x3c\x97\xc6\x99\xb6\x95\x8d\x91\x5a\x4f\x3b\xe7\xd6\xbd\xd7\x5b\x7c\x65\x36\x63\xf4\xcf\xc3\xdc\xe8\xf5\xbb\xeb\x57\x57\xd7\xff\x0c\xfc\x0d\xf8\xf6\xc8\x15\xf5\xd3\x8f\x6f\xe2\xcb\x37\xd1\xe5\xfb\x9f\xae\x03\x3f\xfa\x37\x71\xb4\xbb\x18\x19\x30\x85\xa1\xa6\x01\x04\x7b\xeb\xf7\xfe\xe0\x05\x05\x7c\xdc\x77\xc2\x0f\x02\x88\x4d\x32\x0a\x3f\x42\x3e\xb1\x24\xdd\x6f\x88\xd1\x3b\xd9\x23\x89\xb0\xc3\x4a\x50\x83\x88\x1e\x3c\xe9\x2d\x88\x0a\x59\xab\xbd\x60\x3e\xdc\x99\x08\x67\xc4\xdb\xad\x8c\xfe\xc7\xe8\x7f\x59\x77\xe9\xaf\x43\x16\xb4\x30\x59\x0b\x69\xd0\xff\x74\x37\x67\xdb\xac\x59\xd2\xae\x03\x29\xc6\xd9\x21\xf7\x25\xaf\xc1\xbd\x44\xf3\x17\x06\x33\x01\xca\x34\x71\x21\x8d\x3c\x4d\x21\x25\x86\x5b\x54\xe4\x28\xd1\x19\xa3\x46\x68\x47\x1a\x85\x33\xdf\x74\xf0\x80\x05\x25\x39\x67\x99\xd4\xb8\xb6\xf3\x18\xb6\x2d\x41\xb1\x49\x05\x36\x48\x6c\xa1\x29\x72\x3f\x80\x08\x60\x5f\x1f\xec\x6d\x34\x98\x01\xfa\xae\x87\x0a\xd9\xbc\x96\x20\xd3\xcc\x08\x0b\x10\x40\xbe\x67\x46\x79\x2a\x68\xe6\x72\x02\x10\x84\xb6\x44\x40\xda\x03\xb4\x25\x77\x2d\x6e\x96\xbb\x3f\xf1\xee\x34\x4e\xfa\x9b\xe0\xa9\x73\xaf\x75\x1c\x16\x45\xe1\xda\xc2\xd9\xbe\xda\x65\xe2\x8a\x3d\x80\xdc\x8f\xfb\xde\x8f\x04\x48\x16\x8b\xc9\x6c\x92\x13\x3b\xe6\x56\x43\xe2\xbb\xc1\x8e\xa0\xf4\xf5\x30\x8f\xc6\x9d\x1d\x6e\xf6\x5a\x6f\x52\x9f\x02\x16\xc5\xa7\x1c\xbe\x4b\x1e\xa5\xef\x2e\x97\x00\x7d\xa4\x4d\x09\x41\x3a\xe4\x71\x7d\x71\xbd\xdd\x61\x8f\xc2\xa1\xa4\xd6\x4d\xb9\x03\xed\xd4\xc5\xa5\x97\x28\xce\xbc\x09\xb9\x13\xa4\x16\x73\x0f\xd3\xdf\x8c\x42\x6c\x72\x00\x2d\x80\xc8\xa1\x9f\x09\xd0\xd1\xe5\xa6\x0c\xfe\xaf\x43\xce\xa6\x25\x5b\xc0\x91\x85\xec\xcd\x92\xff\xed\xfd\xe6\xed\x8b\xd7\x0f\x37\x0d\x2f\x9c\x85\x71\x2a\xd4\x3c\xf7\xe7\xa2\x12\xbb\xda\xb9\x8b\xc8\x7a\x69\xed\xf1\xb8\xd5\x56\xe7\xda\xf4\x8e\x1a\xd5\x5b\x35\x7a\xf9\xc1\x5c\x88\x0f\x46\xca\x0b\xe1\x09\xc8\xa7\x02\x14\xc1\xaf\x71\x38\x13\x28\x03\x13\x49\x74\xbc\x52\xf6\xea\x4f\xa7\xb4\xfb\xd1\x8b\xc0\xfe\xf1\x1e\x38\x23\xb1\x94\x6d\x5a\x29\x2e\x24\x6b\x35\x20\x3b\x9b\x31\x43\xb7\xd2\xcf\xbf\x68\xcc\xce\x98\xa1\xb3\x43\xed\x9b\x9e\x03\x11\xa7\x60\xc8\xbd\xf3\x07\x7a\x08\x5c\xe6\x87\x60\xcf\xb9\x5f\xbf\x0e\x63\x8e\xd0\x2f\x5d\x5d\xbf\x3a\x72\xf7\x5d\x5e\x45\x1f\x13\xf7\xcd\x63\xe0\x97\xd7\x1b\x0d\x28\x28\xf1\x3c\xc6\x55\x71\x83\x7b\xa5\xdd\xa1\x02\x11\xf5\xfb\x8e\x50\x5e\xe5\x0d\x29\xa6\x3d\x8b\x33\x7f\xf0\x3b\x06\xa8\xf6\x7a\xab\x10\xb3\x02\xed\x76\x49\x63\x6b\x31\x1a\x2f\x87\x1a\x44\x60\x37\x09\xce\xf3\x2a\x2b\x2f\xd0\xe8\xe0\xb4\x1b\x34\x48\x56\xee\xb9\x4d\x7a\xc6\x09\xfe\x90\x2f\xfb\xc4\x09\xbe\xf0\x65\x07\x4a\x70\x7b\xb3\xb3\x76\x93\xdd\xec\x4a\x10\x05\xd6\xd3\x04\x40\xb1\x0b\x99\xe1\x93\xdb\xe8\x49\xd2\x6c\xe3\x77\x47\xd2\xec\xc0\x67\x18\xb3\x2d\x5f\x79\x7c\xa2\xf3\x5c\x6a\x2b\x31\x51\x5e\x1b\xee\xaa\xdc\x69\xa1\x1d\x28\x34\x6b\x5c\xbb\xe5\x4c\x6b\xcb\xbd\xa2\x42\x6b\xea\x25\xf3\xda\x3b\x01\x48\xb4\x0d\x73\xb1\xd9\xc6\xff\x74\xbd\xd3\xb8\xb2\x69\xaf\x53\xa7\x37\xef\xbf\xbb\xde\xbc\x7d\xf5\x7a\x7b\xf5\xf6\xd5\xeb\xe3\x61\xb0\x9f\xae\xdf\xff\xf4\xfa\xdd\xdb\xf7\xdf\x5d\xbf\x7f\x77\xbd\x5d\x33\x73\xbc\xbc\xde\x5e\xad\x37\xff\x45\x95\xe5\x1b\x71\x83\x98\x11\x03\xde\xb4\x69\x55\x27\x59\xd3\xe6\x23\xd1\x99\xa5\x38\xbd\xb1\x30\xaf\xbb\x4c\xc7\x36\x99\x64\x02\x12\x46\x38\x61\xa0\xcd\x27\x96\xe5\x00\x73\xca\x18\xdb\xaa\x02\x63\x53\x29\xd9\xb5\x1e\x9a\xca\x69\xbf\x4b\x75\x6a\x86\x83\x19\xc7\xca\xd5\xba\x24\x92\xa1\x89\x03\x5c\x5b\x50\xa0\xf9\x87\x30\x8e\x99\xc7\xa8\x74\xab\x16\x46\x9f\xc0\x65\xf2\xc3\xd2\x08\x5f\x9d\xf1\x9b\x7c\xf3\xf2\x9a\x83\x52\xaa\x12\x70\x50\x60\x1f\xf2\x25\x39\xc9\x29\xb5\xcc\x8a\x39\xb2\x5e\x30\x90\xe4\x99\x41\x4a\x33\xdf\x99\xa2\xaa\x8c\x95\x37\x62\x93\xef\x3b\x0d\x72\x20\x97\xfb\x40\xa1\x9d\xe7\xb3\xf7\x6f\xc2\x3c\xf2\xcf\x3f\xad\xac\x1c\xd7\xaf\x8f\x29\xe7\xde\x7f\xf3\xf2\xf5\xbb\xb7\x40\xb9\x04\x60\x09\xa8\xb1\x1c\x27\xb6\x20\x3c\x9c\x2b\x6e\xea\x3c\x70\x9c\x65\xfb\xc3\x56\x7a\xfb\x81\xc0\x22\x29\x35\x1e\xb2\x82\xb2\x0b\x7c\xa3\x3d\x11\x4d\x9c\x80\x83\x8b\xa2\x0b\xa0\x6e\xcb\xed\x18\xab\x95\x93\xee\xbf\x0a\x79\x95\x97\xab\x3a\xf9\x8f\xef\xfe\xf2\xfe\x3a\xff\xf6\xd5\x9f\xb6\xe0\xef\xb6\xaf\x96\x7c\x81\x7f\xf9\xf1\x92\x4e\xd5\x66\xfc\xd9\xc5\xb5\xdf\x1d\x0e\x20\x03\xe9\xe1\xe0\xf7\x4b\xb6\xb1\x26\x56\xd6\xf6\xc6\x4c\x5a\x33\xaa\x35\x65\x1a\x94\x45\x01\xc3\x9f\xe8\x02\x90\xdb\x72\xdb\x7c\x11\x16\x0c\x58\x36\xae\xfd\xfe\xb0\x07\x19\xc8\x0e\x07\xbf\xfb\x2c\xac\xdf\xbb\x5c\x75\xdc\x3c\x81\xf5\xfd\x23\x58\xc5\x09\x6b\x7f\x00\xd1\x3c\xb9\x3f\x2f\x58\x63\xcc\x68\xcc\xc4\x0c\x97\xd2\x30\x6e\x00\x85\xb0\x0c\x7f\x42\xdf\xb3\x96\xad\x7b\xb6\x6c\x17\x9f\x28\xdb\x6d\xe4\x0f\x47\xbc\xce\x98\xde\xda\x09\x59\xce\xed\xfc\x01\xa2\x5c\xbf\x16\x3c\x1a\xca\xf7\x25\x78\x73\xbd\x0d\x3f\x57\x71\xe5\xf7\x87\x03\x48\x41\x36\xe3\xed\xcf\xf1\x8c\x99\xf1\x84\x79\x0c\xef\x37\x28\x5f\x67\xed\x54\x3e\x55\xbe\x05\x2f\xff\x82\xfa\x3b\xc7\x03\xc9\x5c\x7f\xfb\x33\x67\xc9\x8d\x69\xb5\x9e\x06\x49\x18\x13\x84\x48\x10\xe5\x59\x9e\xe7\x79\x96\xdf\xd9\xb3\x89\xcb\xc7\xf0\xbe\x7f\xae\x1d\xcc\x78\x07\x7f\xd8\x83\x1c\xa4\x87\xfd\xe2\x2f\x75\xd3\xc4\xa5\xb5\xad\x31\x53\xcb\x19\x95\x92\x12\x09\xd2\xbc\x98\xf1\x8a\xfc\x33\xcb\x77\xf1\xc9\xf2\x25\x20\xba\x5f\xc0\xc6\x98\xa9\x9f\x0b\xc8\xd8\x83\x02\xae\x78\xe0\xf0\x3c\xde\x0f\x9f\x8f\x07\x0e\x5a\x57\xf3\xe0\x57\x84\x9d\x33\x22\x0e\x79\x96\x67\xd9\x3d\x7b\xd6\x71\xf4\x05\x78\x47\xff\xac\xfd\xb8\x5f\xd0\x40\xb2\xe2\xcd\x06\x8d\x8c\xa9\x9f\xc1\x5b\xec\xf9\x25\x78\x9f\xb0\xe7\x27\xf0\x96\xf8\xf2\x25\xf5\x57\x3c\x83\x57\xd7\x71\x6e\xed\x27\xeb\x2f\xa6\xbf\x56\xec\xa4\xd6\xce\xcd\xaf\x52\x94\x28\x45\xa8\x02\x79\x91\x17\x45\x51\xe4\xc5\xa9\xee\xf8\x17\x94\xed\x3c\xb6\x84\xd8\x99\xcc\x75\x77\x0a\x9e\x7c\x41\xb3\x8a\x71\x21\x38\x53\x00\x9e\x22\xf5\x5d\xd9\x9e\xc1\xfb\xc2\xb6\x7e\x0e\xa7\xe8\x03\xb8\x53\xf9\x9e\xea\x87\xbe\xa2\x7c\xa7\x9e\x88\x0a\x21\x04\x9d\x7b\x22\x38\x5b\x13\x9e\x97\xcf\xfd\x5a\x75\xe7\xac\x9d\xbb\x06\x6e\x18\xd7\x9a\x33\x03\x08\x5c\xbf\x4e\x65\x7b\x1e\xeb\xe9\x7e\x61\xe9\xcf\xcf\xfb\x85\x67\xc0\x7e\xe7\xb2\xc5\x40\xdc\xf2\x6d\x1b\xda\xf8\xdf\x2c\x38\xf3\xe7\x7a\xf3\xf6\xe5\xf5\xcb\xb7\x9b\xad\xf9\x90\x5c\x16\x3f\xd7\x00\x97\x0e\x02\x55\xba\x32\x8e\xac\x0d\x39\x71\xd7\x0b\x2b\xf3\x5c\xe6\x0f\x23\x83\xde\xf2\x6d\x15\xc3\x27\x64\xc8\x0f\xe9\x65\xbe\xc8\x28\x81\x44\xb6\x8c\xa1\xb5\x53\xbf\xe4\xf7\x9d\x3f\x67\x7a\x94\x9f\xd6\xa3\x04\x72\xd6\xa3\x74\x6e\xea\xfe\xb0\x32\xd4\xb6\x05\xf5\x03\x19\x6f\xde\x7e\x77\xfd\xd3\xdb\xab\x3b\x19\x85\x81\x40\x97\xb6\x04\xb5\x31\x9e\x19\x33\x8e\xe3\x78\xf6\x7e\xff\x29\x1d\x4e\xef\xf7\x66\x61\x22\x58\x8f\xd2\xfe\x8a\x32\xf8\x23\xe5\x78\x5a\xc6\x5c\x0e\x6c\xcc\x31\x89\xc5\x1f\x4a\x46\xf0\x51\xd0\x7e\xda\x47\x57\x19\xad\x31\xbe\x7c\xd4\x1e\xe3\x67\xea\x81\xc0\x68\x8c\xcf\xcc\x72\x0e\x23\xf7\xe3\x97\xc8\x80\xae\x00\x1a\xba\xf2\xd7\x91\x61\xad\xcf\xad\x0d\xd7\xcb\x32\xbf\x3b\x6b\xb3\x4f\xb5\xfb\x8f\xec\x71\x6a\xf7\x61\xdf\xca\xb7\x7f\xb0\xf6\xf6\x4b\x65\x00\x50\xdd\xb2\x6d\x15\xe7\x81\xb1\xe1\x8c\x09\x72\xab\x3e\x74\x17\xe5\x87\xee\x82\x7d\x88\xe2\xdc\x0a\xab\x6d\xdc\xde\x3d\x4f\x9f\x7d\x9e\x5a\x6d\x2b\x1b\x1f\xbe\xe6\x79\x7d\xcb\xb6\x3a\x96\x1f\x3d\xcf\x3f\xb4\x17\xe8\x43\x1b\x9e\x97\xd6\xda\xc6\x6e\xb2\xe3\xf3\x55\xcc\x1f\x91\x5f\x5d\xd0\x0f\xd5\x85\xfa\x79\x9c\xc7\x12\xb6\xb2\x9b\xe4\x4e\x9f\xc7\x9e\xbf\xd3\xe7\x97\x3d\x3f\xb7\xb7\xfd\x73\xcf\x83\xbd\x61\x5a\xeb\x58\xff\x7e\xcf\xb7\xcf\x3e\xdf\x1a\xa2\xb9\x8e\xe9\xef\xf1\xbc\xbe\xe5\x5b\x0d\x0e\xcf\xd5\x2f\x38\x18\x66\x94\x89\xcd\x9d\xfd\xa3\x67\xed\x1f\x59\x66\xa5\x8d\xdd\xdd\xf3\xe5\xb3\xcf\x97\x46\x59\x6b\xe3\xe1\x6b\x9e\x5f\xfc\xf3\x63\x7f\x38\xf7\x4f\x6e\x8d\xad\xef\xf9\x0f\x7e\x56\x3e\xb6\xca\x3a\x1b\xef\x7e\x8f\xe7\xf9\x2d\xdd\xaa\xb8\x08\x77\x0b\x03\x57\xc9\x9b\x1f\xde\x5d\x03\x71\x99\xba\x0f\x2e\xbb\x90\x1f\x4c\x5c\x4c\x10\xe4\xc4\xc2\x90\x23\x75\x7d\x1e\x3e\xf3\x3c\x9c\x8a\xf0\x7c\x15\x7d\xad\x7c\xf1\x88\xfc\xc8\x7d\xa8\xb3\x0b\xfe\xc1\x05\xf9\x19\xbe\x2f\xff\x4b\xf5\xf9\x8d\x9f\x07\xed\xf1\xf9\x77\x1f\x3d\x0f\xda\xc9\x0e\xc4\xc2\xe5\x9e\xf1\xfa\xfc\xee\x99\xe7\x77\x93\xd8\x61\x0b\xed\x2f\x79\xbe\x79\xe6\xf9\x66\x72\x23\xb1\x50\x46\x9f\xaf\xff\xfc\xbc\xfa\xfa\xe7\x05\x18\x3f\x7a\xfe\x54\xbf\x60\x9c\xe4\x8e\xb8\xc2\x9c\xcb\x3f\x3c\x6d\x7f\x70\x98\x18\x48\x88\x2d\xf5\x59\x7d\x25\xcf\xd4\x57\x32\x91\xf0\xbc\x39\x7b\x3e\x7b\xe6\xf9\x6c\x42\xe1\xf9\x2f\xf1\xcf\x9c\xda\xf2\x8b\xfc\xe7\x77\x7a\x3e\x06\xc5\x6d\xb9\x3d\xc4\x26\xda\x44\xdf\x9c\xc6\x08\x77\xd9\x0c\xae\xdf\x5d\x16\x53\xbf\xa9\xa6\xb6\x8c\x19\xf5\x91\xd1\xd3\x81\xc6\x04\x4f\x5d\x6c\x9c\xf3\x07\x3b\x62\xc3\xba\x46\x18\x3c\xda\xe8\x37\x91\x87\x6f\xcb\xab\xf4\x39\x79\x78\xea\x36\x6e\xea\x82\xbc\xc4\x6a\x1f\xd1\x18\x3f\x23\x2f\xbf\x2d\xb7\x43\x58\x33\xbe\x93\xf7\xcd\x51\xde\xcb\xeb\x77\x97\xd9\xd4\x6d\xaa\xa9\x23\x71\x49\x7d\xa2\x8d\x4f\x68\x5c\xb0\xa9\x8f\x1b\x6b\xfd\xc1\xde\x46\xc4\x88\x71\x90\x86\x80\xc8\xce\xf2\xe0\x6d\xb9\xdd\xc7\xfd\xd3\xf2\xe8\xc4\x37\xc3\xd4\xe1\x18\x53\x9f\x98\x20\x0f\xd2\xa9\x8f\x7b\x6b\xfd\xb8\xc8\x1b\xfa\x87\xf2\xba\xa7\xe5\xcd\xf6\x73\x8f\xc8\xeb\xac\xf5\xbb\x8f\xe5\x91\x60\xbf\x67\xe4\xad\xf6\x23\xb3\xbc\xc8\x18\x9f\xd2\xb8\x78\x46\x1e\xbc\xa5\xdb\x7d\x9c\xde\xc9\xbb\x7c\xa4\x7e\xdd\xd4\xd1\xd9\x7e\x91\x0e\xf5\x11\xec\x97\x5a\xdb\x6b\x57\x6a\x6c\x0d\xd1\xa5\xd3\x27\x59\xc5\x27\x65\xb1\x18\x9e\xca\x9a\xf1\x69\x88\x0b\xad\x3b\x5b\x97\x9a\xd4\x15\xd5\x65\x6d\x43\x39\xe9\x55\x12\xd6\xea\x9e\x90\xb5\x94\xb3\x9f\xad\xe5\xa3\xb9\x5e\xc9\x2c\xab\x8f\xf3\x59\x56\x55\x6a\xe2\x2c\xd5\x65\x65\x4f\x75\x90\x7c\x4a\xaf\x9e\xc7\xf9\x2a\x8b\xc6\x89\x9c\x86\x38\x31\x66\x96\x65\x68\xe5\x98\x46\x67\xb2\x9e\xd1\x6b\x91\xd5\xa2\x98\x9e\x64\x21\x7c\xd4\xab\x41\x8b\x2c\xdc\xd8\xb5\x2e\x3f\xa3\x8c\x1d\x8a\xc9\x6a\x7b\x12\x97\x64\xea\x1e\x93\x95\x85\x76\xf0\x8c\xed\xd7\x76\x10\xca\x98\x68\x1b\x6c\x2f\x66\xdb\x1b\x33\xd8\xa6\x34\xac\x69\x98\x46\xcd\x52\x46\xbe\xdd\xc7\xf8\x93\x65\xc4\xb3\x5e\x89\xb1\xb3\x8f\x95\x64\xea\x63\x6c\xcc\x68\x1d\x5a\x7d\xe2\xcc\x5e\xfc\xf3\xfc\xeb\xe8\x13\x62\xea\xe7\x41\xf6\xce\x8e\x28\x34\x77\x3d\x37\xf7\xa3\xef\x3f\x23\x6b\xf5\x09\x76\xf4\x89\x88\xc4\x39\x9f\xba\xc7\x64\xcd\x71\xad\x0f\x6b\xb3\xcf\xda\xab\xc7\xb3\xac\x6c\x69\x47\xf9\xec\xf7\xd4\xda\xd1\xf6\xd8\xb0\xa6\xe6\x06\x0d\x47\x59\xfb\xf3\x98\xf6\x58\x19\xab\xa9\x25\x31\x9a\xcb\x18\x62\x64\x39\xb7\x49\xe3\xdc\xde\xee\x89\xe1\x43\x27\x0d\xd9\xff\xda\xb2\x70\xf0\xaf\x67\x64\x9d\xb7\xa1\xd5\xf6\x05\x5f\x62\xed\x22\xab\xef\x44\x90\x05\xd6\x7a\x4c\x43\x96\x9d\x35\x79\xdd\x1a\x71\xb6\x76\x8e\xd6\x34\x68\x13\xa2\x35\x9a\xba\x38\xb5\xbe\x61\x56\x83\x68\x6f\x8d\x00\x68\x99\x7b\xfe\x1a\x32\x82\x0f\x80\xc3\x63\x32\xea\xb9\xb6\x30\x0b\x32\x92\xa5\xb6\xc0\xc1\xfa\xfe\x28\x83\x03\xb8\xc8\xc8\xc3\xfa\xe7\xa3\x7a\x98\xb9\x27\xa3\xa7\x48\x87\xf0\x03\x3d\x38\xc0\x9f\x2c\x8b\x5b\x65\xdc\x95\xa5\xff\x62\x7b\x7c\xb6\x8c\xa5\x8e\x1f\x95\xd1\x3c\x90\xb1\x96\xa5\x15\x46\x83\xe4\x70\x4f\x0f\xb2\xdd\x83\xee\x4c\xc6\x9b\xbb\x7a\x99\x7b\x76\xe2\x13\x6b\xe7\x08\x4b\xd0\xd4\x81\xce\xde\x46\x54\xf3\xb1\x97\x9a\x86\x5e\xe4\x4e\x46\xbd\xca\x38\xf7\xb2\x59\x46\x11\x8b\x59\x46\x68\x91\xb4\x9c\x3a\x50\xdb\x3d\xd1\xac\x6b\xb9\x9e\xdd\x2b\xd4\x2b\xbd\x4a\x81\x7d\xec\xfd\x7a\x8e\x80\x94\x4e\x87\x25\xca\x23\x32\xb5\xc0\x9a\x81\x68\xda\xd4\x4c\xe3\xd1\x9c\x6c\x09\xcc\xe3\xf8\x73\x74\x39\xe1\xcf\xbd\x17\x30\x6e\x1e\x49\xf4\xad\xd0\x64\x74\x77\xef\xd7\x8f\xdb\xa0\x67\x71\x71\xb2\xc1\x1c\x9d\x40\xbd\xf4\xa4\xbb\x41\x9d\xd9\x60\xf1\xcd\xa7\xca\x40\x63\x34\x97\x21\x44\xf1\xe0\x9b\xd6\xec\x89\x11\x7d\x27\x35\x39\x98\xb5\x2e\xb7\xcd\xe3\x3a\x88\x69\x64\x71\x42\x7d\xa1\xad\x87\x04\x1c\xf8\x34\xae\x3a\xc8\x71\x3c\xaf\x87\x10\x3f\xc0\xf8\xb8\x4f\x75\x6b\x4b\x0f\x51\xa3\xe0\x53\x0f\x46\xeb\x47\x66\x14\x88\xf6\xc6\x30\x90\xdb\x5f\x4d\xc6\x62\x8b\x47\x65\x34\xe7\xbd\x36\x0d\x11\xfa\x71\x19\xe8\xb6\xdc\xb6\xf7\xdb\x7a\x7c\xb2\xc7\x0e\xc5\x05\xf5\xb9\xd6\x3e\xa7\x71\x46\xa6\x5d\x68\xeb\x7c\xf6\xed\xdb\xc8\xac\x8d\x7d\x2d\xcb\x93\x31\x07\x2d\x3d\x98\x09\xed\x83\xac\x6d\x9d\x3f\x6c\x1f\xbf\x86\x8c\x67\xda\x69\xfd\x20\xf6\x3d\xd1\x4e\x63\xa0\x6f\xcb\xad\x0b\x6b\x23\xdf\x45\xd1\x65\xfe\xfd\x71\xdf\xeb\xde\xde\xd0\x45\xe6\x2b\xdf\x81\x12\x50\x40\x40\xe9\x3b\x5f\x1f\x0e\x87\xc3\xfe\x70\xe8\x3a\x6b\xfb\xde\xda\x2e\x86\x9c\x73\xc6\x38\xe7\x5f\x21\x13\x03\xf4\xb1\x4c\xd3\xcf\x32\x59\xf8\x73\x94\x19\xd6\x7c\xbe\x56\xcf\xf0\x89\x8b\xa0\x25\x63\x3c\xac\x7d\x96\x5b\x1d\x17\x9f\x90\x19\xf9\xda\xb7\x27\x3d\x5b\xdf\x2c\x1c\x1e\x87\x6e\x70\x55\x3f\x38\x37\xc4\x4c\x48\x21\xa5\x90\xe2\x54\xf6\xfc\x93\x7a\xce\x32\x11\x20\xe7\x32\x67\x3d\xfb\x20\xd3\x0e\x31\x11\x82\x87\x3f\x27\x99\xd9\x27\x64\xa6\xbe\x0e\x65\x27\x80\x82\xd2\xb7\xbe\xde\x07\x91\xb3\x4c\xd7\xf7\xab\xcc\xe5\xeb\x37\xd3\x93\x6c\x1d\x68\x3e\x29\xd3\xf9\xfe\x54\x47\xbd\xaf\x56\x99\x75\xad\x55\x5d\x2b\xd5\x80\x1e\x87\x9c\xab\x04\xff\x01\x64\x42\xc0\x40\x48\x7d\xf0\x88\xcc\x81\xac\x5f\x27\xff\xfc\xb4\xcc\x27\xfc\xb3\xd1\xba\x99\x3f\x60\x4f\xd7\xaf\x3f\xb8\xcc\x1d\xa1\x84\x52\x42\xc9\xb1\x1d\x81\xee\x93\xed\xe8\x09\x99\xad\x36\x4d\x63\x74\x0b\x0e\x1f\xe9\xf9\xeb\xb6\xf7\xcf\x93\x79\xd7\x8e\x48\xf0\xf9\x53\x3b\x3a\xc9\x9c\x63\x5d\xf8\xfa\x8d\x64\x2e\x71\x29\xf9\x1a\x7b\x86\xf6\x6e\x5d\xd7\x5b\xdb\xc7\x88\x2f\x6d\x93\xff\xa6\x71\xe9\x0f\x2f\x33\xda\xdd\xe2\x2b\x1c\xe3\x90\x47\x39\x0a\x44\xe8\x2f\xdf\xbd\x7d\x95\x5e\x5e\x7d\x0f\x8e\x3f\xfc\xe9\xbb\xab\x1f\x2f\x1d\xf1\x23\x03\xb4\x70\x80\xf2\xdb\x68\x2a\x98\xaf\x38\x70\xd0\x8d\xac\xea\x76\x56\x3a\xa0\xb8\xf0\xc6\x48\x39\x0f\x97\x95\x05\x54\x9b\x03\x55\x34\x9c\x8d\xfe\x1d\x30\x40\xf2\x75\x18\xf8\x4b\xca\x31\xde\xe2\xab\x2c\x26\xcf\x61\xa4\x33\x86\x20\x7e\xe0\x80\x41\x07\x28\xf3\x87\x09\x52\xdf\x72\xa0\x4b\xb7\x67\x6d\x3b\xce\x18\x52\x2a\x6f\x67\x8c\xe4\x30\x63\x08\xa9\xfc\x81\x29\x72\xc4\xc0\xb1\xf8\x64\x39\x2c\xf1\x3b\x06\x30\x74\x80\x71\xbf\x9f\x10\xf3\x96\x83\xaa\xac\xf6\xac\x59\xcb\x61\xec\x5d\x39\x0c\x60\x75\x73\xaf\x1c\xff\x05\x60\x80\xe4\x96\x5d\x61\x30\x3e\x82\xf1\xc3\x23\x18\x4b\x9d\xfb\xfd\x44\xe8\x5c\xe7\x16\x56\x23\x77\xa6\x91\x52\x03\x48\xa8\x1f\xa5\x64\x63\xa7\x95\x06\x65\x59\x8e\x44\xa1\xe8\xbf\x30\x0c\xfc\x79\x18\xf8\xae\x7d\xf8\xfd\xdc\x3e\x1a\x0e\x34\x74\x07\x5e\x89\x5a\x4a\x05\x0a\xa9\xfc\x4e\x48\x36\x74\x4a\x29\x80\x30\x19\xa8\xfc\x1d\x31\xd2\xaf\xc3\x60\xdc\xd7\xb3\xad\xdc\xc8\xdc\x03\x8c\x5e\xce\xb6\xc2\xa4\x27\xaa\x8c\x4e\xf1\x2a\x0b\x18\xff\xfc\x11\x8c\x7f\x04\x3f\xcd\x20\x97\x4b\x43\xef\x39\xe0\x4b\x43\xdf\x4f\x25\xf3\x3d\x6f\xc6\xd4\x81\x88\xb5\xa6\xd5\x77\x28\xa2\x69\xa5\x2a\xf7\x8a\xf3\x0e\xcf\x28\xb3\xad\xca\x2b\x1c\x47\xcf\x96\x63\x86\xb0\xd4\xef\x38\xa0\xa7\xf6\x41\x7d\xcd\x80\x86\x16\x44\xac\xb1\xbd\x51\x1a\x10\x21\x7d\xaf\xa4\xd8\x8f\x46\x1a\x40\x28\xdd\x31\x89\xa3\xdf\x0b\x23\xd4\x47\x5c\x7c\xb1\xef\x86\x3a\x0f\xf5\x51\x57\xfd\x2c\x94\x2a\xed\x1b\x25\x45\xd7\xa9\xb9\x3e\xac\xeb\x8f\xbe\xbb\xd4\xc7\x67\x60\xdc\xab\x8e\xc3\x84\xb8\xef\x38\x50\x73\xdc\xad\xeb\xc1\x48\x0d\x90\xab\x7c\x2f\xa5\x18\xc7\x19\x03\x6b\x33\x12\x85\xa3\xcf\x2e\xc7\x6a\xab\x9e\x05\x0c\xc6\x97\xd8\x3e\x63\x14\xa1\xca\x1f\x80\x0c\x5a\x19\x80\x4e\x20\xbf\x0f\x46\xf6\xb9\x18\xe7\x71\xf7\x30\xd7\x79\xcb\x81\x82\x0e\x44\xbc\xb9\x8f\x31\x0c\xb3\xb1\x90\xb1\xc3\x52\x21\x00\xf0\xdb\xf2\xaa\x88\x8b\x30\xb7\x8e\x2f\xdf\x7c\x1f\x85\x06\x11\x5d\x5e\x7d\x7f\xa1\xec\x34\x32\x40\x00\x4f\x2b\x90\x81\x92\x79\x04\x12\x3f\xd6\xb6\x04\xb0\xc2\xd8\xfa\x3d\x36\xfa\x0f\x25\x23\xbb\x45\xdb\x31\x2e\x1f\x93\x11\x19\x1f\x51\x00\x01\x4d\xaa\x79\xaa\xc3\x7c\x0e\x52\x3f\x54\xa6\x04\x45\xc5\xd8\x99\x0c\x7c\x8b\xae\x8a\x98\x3d\x26\x83\xbb\x3b\x3d\x20\x40\xcc\x17\xf3\xfc\xb3\xb1\x08\xe0\x16\xa1\xda\xf7\xc4\x2c\xeb\x15\xe2\x16\x5d\xe5\x8f\xcb\xd0\x6b\x59\x58\x5a\x81\x1c\x14\xcc\xcf\xe3\xba\xa6\xb1\x18\xa0\xae\x2c\x6b\xdf\x11\xe3\x7e\x45\x19\xe4\x2a\x5f\xd6\x91\x66\x87\xf9\xd7\x4b\xb0\xbb\x38\xda\x94\x02\x0a\x68\xea\x40\x0a\x10\xf5\x65\xb3\x53\xa6\xdc\x69\x4a\xc5\x00\x0d\x3f\xbd\x9f\x81\x7d\x78\x3f\x7e\xf0\xbe\x9b\x76\x77\xef\x97\xd4\xa3\xf1\x36\x32\xa6\x3c\x58\x8c\xe5\xae\x34\xf2\xd7\x79\x1f\x5d\x65\xa0\xfd\x94\xfe\x19\x80\xb3\xfe\x7b\x6d\xca\xbd\x29\x4b\xb5\x43\x5a\x46\x77\xef\x9f\xf0\x1f\xfa\x14\x0d\x36\x74\xb3\x0d\xa9\x47\x7b\xbf\x77\xa6\x04\x99\x83\xd0\xf8\x03\x32\xeb\x19\x84\x5f\x43\x46\xf0\x4b\xd0\x3f\x56\x8e\xc5\x2f\x11\x20\x89\x05\x10\x70\xea\xa3\x7a\x34\x06\xee\x34\x63\x72\x2c\xcf\xcb\x11\xc3\x47\xdb\x86\x99\x86\xfb\x3a\x80\xc8\xef\x2a\x83\x00\xac\x11\x72\x7e\x3c\xfa\xf5\x1f\x45\xc6\x73\x6d\xd4\xfa\x84\xce\x93\xc7\xd4\x82\x12\x30\xea\x93\xb9\x9d\xcf\x32\xca\x20\x63\xc0\x66\x39\x97\x40\x6f\xd1\x55\xf4\x78\xdb\x10\x6e\x1a\xe6\xc9\x12\x3f\xfa\x05\x06\xb9\xef\x66\x19\xa8\x25\xa4\xf6\x03\x59\x65\x2c\x65\x79\x54\x86\xa9\x1e\xd4\x2b\xb9\x2f\xa3\xc7\xbf\x9a\x8c\x0d\x28\x6e\xc9\x15\x8b\x51\xb8\xc3\xfb\x2f\x8e\xec\xb5\xcb\x45\xcb\x90\x3b\xe9\xde\x68\xbb\x70\x40\x3a\xe7\xb5\x73\x40\x7a\xbd\x19\xb1\xdf\x73\x40\xf2\x6a\x0e\x68\x87\x18\xd5\xf5\x04\x8b\xa2\x6b\x8b\xdd\x3c\xba\x26\xc6\xf8\x4a\xc9\xc0\x4f\xff\xfb\xe1\xe0\x2f\xc1\xc1\x0e\x70\xe7\xbc\x75\x0e\x70\x6f\x37\x2d\xf2\x7b\x06\x70\xb1\xf4\xf9\xcf\xe3\xf0\x80\x23\x9e\xc6\xb9\x3a\xc3\xe1\x0e\x30\xe7\xbc\x73\x0e\x30\xef\x36\x0e\xed\x39\x80\x47\x18\xd1\x75\x53\x54\x14\xdd\x80\xf6\x66\x86\x69\xdb\x05\xe6\x68\xb3\x67\x30\x3e\x69\x33\xfa\x31\xc8\x52\x96\xba\xfe\xa8\x6e\x7e\x7b\x1c\xfc\x25\x38\xcf\xd7\xcd\x27\xcb\x33\x8f\xeb\x3f\xab\x6e\x1e\x94\xa7\x45\x07\x0e\xe0\x3a\x7c\x05\xa3\xb5\x93\x81\xb0\x35\x59\xaf\x95\x04\x85\x90\x7e\x14\x92\xff\x52\x0c\xbc\x7f\x0c\x23\xef\x55\xc0\x10\x7e\x10\xa1\xfe\xf1\x97\x60\x3c\xb0\x97\x43\x3b\x0e\x8a\xe2\x93\x18\xbf\x9f\xad\xf6\xd1\x5f\x2d\x37\xf7\x7f\xb8\x27\xf3\x21\xa0\xc1\x67\x42\x3f\xd0\x7b\x88\x55\xaf\x95\x02\x25\xe7\xbe\x93\x92\xc7\xd9\x11\xf1\x64\xab\xcf\xc4\xb0\xf8\xc0\x96\x06\x38\x63\xc8\x7b\x96\xbb\x87\x21\xe2\xf4\x0c\x83\x7f\x11\xc6\x5c\x01\xf9\x11\xc3\x3a\x40\x9d\xf3\x95\x0b\xc9\x3e\x1f\x62\x18\x73\xc2\x08\xb6\x8a\xd3\xa7\xea\xe3\x87\xe7\xda\x62\x8f\x6f\x23\x0e\xd0\x82\x79\x88\xd3\xba\x9e\x58\x51\x74\x26\x59\x02\x0b\x63\x73\x1b\x91\x4b\x1b\x11\x01\xe7\x99\x38\x79\x5e\x36\xe1\x00\x71\xce\xd7\xce\x01\xe2\xeb\x8d\x3e\x2b\xda\x53\x61\x52\x86\x3a\x41\x9f\x8f\x81\xef\xc7\xc8\xfa\xac\x8a\xce\x31\xf6\x4e\x59\x40\xef\x30\xf8\x2d\xba\x62\x31\xfb\xaa\x38\x5c\xcf\xae\x56\x16\x0e\x90\x39\xa4\xb0\xae\x9b\xd2\xa2\xe8\x3a\xb8\x60\x2c\x21\x45\x86\x3a\x41\x5f\xdd\x77\xed\xb1\x1f\x97\xf9\x30\x61\xcf\x14\x64\x8d\x5b\xbf\x0f\x0e\xfe\x12\x9c\x07\xf5\xd2\x93\x10\x87\x3f\x03\x27\x06\xd5\xad\xd8\xaa\xb0\xc6\xfc\x37\x1f\xa3\x80\xaa\xda\x18\xe7\x6e\xc4\xfc\xfd\x46\xc4\xb9\x73\x13\x29\x8a\xae\xfe\x4f\xfb\xae\xbe\x15\x5b\xb1\xda\xe6\xe3\x77\xb5\xdb\x54\xce\xdd\x50\xe7\x36\xd5\x0d\x8d\x51\xdb\x86\xd2\xdf\xc3\x2d\x3f\x0f\xb7\x6c\x9a\xa9\xfc\x83\xbc\x1b\xee\x04\x7c\xfa\x5d\xd0\x2a\x35\xd5\x45\x51\xdb\xf3\x77\xbb\xcf\x7b\xb7\xd3\x7a\xaa\x7e\xcd\x77\xff\xf3\xd2\x79\xf1\xab\xf4\xf3\xfc\x2a\x75\x6e\x62\x79\xde\x34\xe7\xf5\x1b\x7d\x5e\xfd\x46\x5a\x4f\xa2\x28\xba\xea\xfc\xdd\xa7\x70\x1f\xbc\x3b\x77\x44\xec\xa1\x5f\x65\x9f\xf7\xee\xdc\x19\xd3\x3f\x4a\x3b\x7a\x0a\xf7\xc1\xbb\x8f\xe2\x7e\xed\xbb\x32\x9c\x85\xbf\x0a\xb7\x3b\xce\x98\x6a\xb6\xca\xdd\x70\xe7\x36\xf6\x86\x83\xc3\xa4\x8a\x22\x56\x1e\x85\xbc\x21\xbf\xdb\x3b\xe6\x56\x86\x73\xf1\x1f\xbf\x23\xdc\x0d\x73\x6e\xe3\x6e\x58\x0c\x27\x5c\x14\x71\xe3\x13\xc0\x4e\x38\x8f\xbe\x73\x87\x73\xf6\x0e\x3d\xe2\x3c\xf9\x0e\x71\x6e\x53\xdf\x90\x87\xef\x7c\x0d\xce\x62\x83\xe6\x79\x1b\x34\x53\x9b\xe7\x31\xf2\x02\x44\x7f\xf4\x77\x42\xfd\x3c\xfa\xce\x5d\xfd\x3c\x8e\x53\x3f\x7c\xe7\x5d\xc0\x39\xc6\xa0\x7a\xea\x20\x8c\x4b\xaf\x77\x67\x38\xc3\xf3\x38\xc3\xe4\x20\x8c\x99\x67\x20\xb9\xc3\x59\x72\xe5\x44\x97\x81\x67\xeb\xf5\xbf\x03\x2f\xae\x5f\xc4\xa4\xba\x18\xdc\x8d\xa0\x30\x96\x93\x86\x06\x14\x7e\xf8\x9c\xe7\x59\x31\x3f\x5f\xd8\xaf\x7c\x7e\xf1\xe5\xf4\x79\x5f\x4e\x27\x5e\x14\xb1\xf5\x05\x40\x5f\xeb\x97\xbf\xba\x2f\x1f\xe3\xc6\xbd\x77\x2e\xe7\x31\xdf\x76\x08\x67\x99\x5f\x44\xaf\xa2\xeb\xe8\xbf\x5e\x4f\xfb\x5e\xbf\xb8\x7e\xf5\xe7\x9f\x42\x7e\xab\x77\x21\xfd\x3b\xf8\xbb\x1f\xdf\xfd\xe5\xfd\xdb\x3f\x7f\xfb\xea\x4f\xdb\xcd\xd9\x1e\xfd\x36\xf7\xe8\xa6\x8f\xa9\x47\xe3\x3e\xf3\x9d\xaf\x41\xeb\xf1\x65\x75\xd3\x01\xe7\xea\xda\x55\x75\x5d\x31\x4a\x19\x63\x2c\xa6\x52\x66\x9e\xbb\x4c\xe7\x09\xe8\x44\x3a\x77\x50\x8a\x52\x35\x7f\x40\x71\xfc\x0a\x3a\xd1\xed\x10\xeb\x47\x75\x7a\xff\x0b\x75\xaa\xe6\xaf\x33\x9d\xb4\xd6\x85\x67\x55\x92\xeb\x22\x01\xbd\x08\xc9\xd0\x15\x65\x4a\x31\xaa\x00\x5c\x68\x1d\x96\x9c\xda\xb3\x5e\x78\x3b\xc4\xe2\x49\xbd\xae\x7f\xb1\xad\x1a\x77\xd4\x4b\x68\x9d\x7a\x5c\x27\xb9\x29\xc0\xa0\x73\xad\x27\xa7\x16\xde\x23\x05\xca\xa0\x17\xcc\xcb\xdf\xdf\x56\xa9\xc7\x47\x5b\x05\xa5\x9e\xb1\xd5\xd3\x7a\xfd\x52\xbf\x7a\x54\x2f\x52\x15\xa6\x48\xc0\xa0\x9e\x52\xeb\xff\xd3\xe9\xf3\x75\x2a\xb7\x43\xb8\xf7\xfe\xb4\x9f\x87\x9c\xec\x5f\xe5\xe7\xf7\x75\x8a\xa4\x4c\xbd\x56\xc1\xcf\x2b\xa2\xf5\x34\x08\x4a\xa4\x24\x54\x2c\x84\x38\x45\x96\xe5\x77\x71\x0a\x3e\xdf\xf6\x7e\xf8\x75\xda\x1e\x54\xaa\xf0\x5c\x06\x9d\x1c\x9f\xe3\x54\x2b\x17\xa5\x24\x48\xf3\xbc\x08\xcc\x4e\x27\x9d\xf2\xdf\x48\xa7\xfb\x76\xca\x95\x82\x5e\x8a\xa0\x93\xa5\x99\xd6\x53\x2f\x09\x11\x12\x1f\x99\x83\x82\xa1\x8e\x75\xf7\xdb\xe8\xf4\xd0\x9f\x3e\xd6\xa9\x3b\x55\x5e\x92\xaf\x5f\x7f\x14\x9d\x88\xfc\xe3\xe9\xf4\x87\xb1\x53\xaa\xd4\xd4\x3f\xa3\x53\xf9\xdb\xc5\x82\xaa\x0e\xed\x8e\x72\x1e\x97\xf3\xf8\x80\xe9\xa0\x53\x2d\xe6\x79\xf3\xfd\xf0\x04\xf3\xbc\x8c\x4e\x3a\xe1\xdf\x48\xa7\xfb\x63\x16\xac\x75\xee\x99\x09\x3a\x35\x62\x19\xb2\xdc\xd7\x09\x16\xbf\x9f\x4e\x8c\x52\xfe\xa8\x4e\x6c\x1e\x46\x2d\x43\x83\x02\xc2\xd0\x0b\x1f\x75\xe2\xbf\xe1\x78\xe5\xce\x4e\x5c\xeb\xe4\x6e\xbc\x52\x84\xbe\x85\x31\xad\x19\x53\x00\x41\x08\x8b\x32\x2f\xca\x93\x4e\x4f\x8f\x57\x7e\xa9\x4e\xae\x99\xe3\xf8\x62\xa7\x30\xb6\x3b\xe9\x34\x0f\xed\xa4\x5e\x78\xa6\x34\x20\xb0\x2c\xca\xb2\x28\xd0\x6f\xab\x53\x68\x73\x41\x27\xc6\xd8\x7f\xde\x3a\x6d\x40\x11\xf8\x70\x16\x1f\xff\xdb\x45\x9f\xbf\x07\xb3\x3e\x3f\xac\xe3\x94\xf9\x37\x6f\x37\x6f\x5f\xbe\x7d\xf9\x76\xb3\x55\x93\x9e\x8a\x58\xfa\x7c\x04\x51\xe6\x5b\x5f\x81\xc1\xc3\x4b\x39\x21\x5b\xd8\x5c\x40\x5b\xc6\xd8\x5a\x4f\xab\x24\x8c\x47\x7a\xe9\xe9\x1d\x51\xf1\x71\x3d\x7a\xc6\x63\xbf\x1a\x1e\x73\x6e\x2e\xe6\x32\xfe\xd1\x21\xbf\xfd\x3d\x3c\xbc\xe2\xfd\xf5\x8a\x77\x6f\x0c\xfd\xc3\xca\x99\x73\xc4\x03\x38\xe6\x1e\x8e\xfb\xdc\xb7\xbe\x01\x9d\x2f\x2f\xcb\x49\xc7\xee\x1c\xce\x93\x66\x01\x1b\x95\x75\x6e\xaa\x1e\xe2\x91\xc0\xc9\x23\xee\xe3\xfd\xf0\x14\x1e\x0d\x78\x20\xca\x7d\xe3\x2b\xd0\xfb\xf2\x12\x2d\x80\x2a\xb3\x99\x82\x06\xc6\xc2\xa3\x23\xa0\xb1\xd6\x4e\xd6\x5a\xe0\x42\x36\x72\x16\xf0\xf2\x50\x3e\xf1\x85\xf6\xcc\x76\x8b\x3d\x1d\xd8\xf9\xe2\x9e\x3d\x85\xb5\x1e\xb7\x0b\xe2\x4e\x87\xa4\x03\x77\x70\xff\x09\xf0\xf0\x8a\xf7\x2b\xd5\xdf\xf3\xe6\x0c\xe5\x13\xdb\x0a\xec\xee\xe1\xfd\xf9\x49\xbc\x22\x56\x3e\xdb\x1d\x16\xd7\xdc\xf9\xfc\x92\xae\xd5\x97\x9b\x42\x17\x16\x82\x9d\xb7\x1a\xce\x53\x2b\x4b\xb5\x31\x81\x8d\xaa\xf0\x43\x58\x77\x58\xb1\xc2\x3d\xf4\x93\x2d\xef\xcf\x11\x3e\xb2\x65\xfe\x10\x4f\x4d\xc8\xe4\xa1\x6c\x30\x4e\xac\x4d\xbc\x36\x01\xce\x71\x6f\xce\x58\xab\x36\x00\x05\x3b\xa6\x9f\x69\x47\x12\x33\x0f\x87\x7d\xe6\x7b\x5f\x83\xde\xa3\x4b\xb8\x94\xeb\x84\x95\x7a\x69\x16\x3b\x36\x74\x6e\x07\x07\x6b\x01\x0e\xf9\x8d\x9a\x63\x3b\x17\xdb\x1a\xf4\x9f\x69\x47\x18\xda\x78\x28\x57\x0d\x46\x5f\x5c\x92\x49\xc7\xd5\x04\x6d\xae\xf3\xb9\x19\x80\xde\x57\x2a\x14\xcc\x20\x63\x8c\x2f\xb4\x3e\x31\x83\x1d\xb1\x86\x5f\x0b\x6b\xf0\x6e\xc1\xb2\x01\x2b\xd7\xfa\xac\xce\xd0\x17\x61\x3d\x6a\xc7\x6a\x82\x2e\xd7\x85\xf8\x24\x16\xb9\x65\xdb\x2e\xf0\x9d\xdd\xf7\x8f\xc7\xdb\x9a\x9b\xe4\x84\x3e\x8a\x27\x62\x82\x26\x37\x99\x29\x0c\x04\xa3\x31\x89\x77\x26\x29\x14\x4c\x40\x85\x7d\xa5\xf5\x19\x9f\xe1\xd2\xb6\xeb\x38\xf9\xcc\xd8\x05\x3f\x6a\xd7\xab\x21\x4d\xae\x8b\x10\xbb\x12\xaf\x6c\x92\xab\x22\x01\x95\xd0\x5a\x4f\x07\x63\x00\xf5\xd5\xfc\x39\xc3\x2b\x7f\x51\x2c\x51\x13\x74\xc5\xea\x94\xa5\x73\x9e\x1c\xdd\x52\x7a\x61\x2d\x10\x21\xef\xd6\xc2\xfd\xbe\xb6\x01\xf4\x31\xde\x93\xed\x0d\x3f\xac\x3f\x7a\x8a\x25\x30\x46\xd6\x7a\x62\x17\xb8\x56\x79\x66\x2d\x90\x21\xb5\x96\xfe\x4f\xd6\x0f\x7c\x69\xbf\xfa\x74\x5c\x9e\xfb\xd5\xbb\xae\xee\xe3\x7e\xf5\xf7\xc6\xfb\x7d\xfb\xf1\x38\x8c\x53\x5c\x8c\xa3\xbf\x0e\xf9\x7b\x66\xb4\xef\x7f\xb8\x5b\xb9\x39\x25\x5f\x03\x73\xcd\x14\x20\x02\x59\xee\x9d\xd7\x61\x78\x42\x3c\x02\xe3\xa4\xe7\x61\x5a\x8c\x3d\xab\x13\xa8\xcb\x04\x0c\xc2\x58\x6d\xe3\xd1\x9a\x33\xf9\xec\x97\xca\x67\x9e\xb6\x8b\xfc\x9d\x34\x2e\xe4\x8f\x33\x2b\xaf\xce\x43\xf9\xef\x1f\x95\x3f\x7b\x78\x79\x00\x59\xe6\x2b\x6f\x41\xeb\xd1\x65\xe9\x09\xe8\x27\x13\x13\x4f\x9e\x12\x1f\x78\x14\xd9\xb6\x0b\xf9\x87\x8e\xf2\xff\xfc\xa8\x7c\x1a\x53\x8f\x0f\x20\xc9\x83\xfc\xc6\xe3\x4b\xec\x4b\xb0\x9f\x44\xcc\x7d\x19\x4b\x4f\x7a\x64\x50\x12\x47\xca\xd9\xca\x6e\x52\xeb\x02\x87\xcf\xac\xbb\xf8\x2c\xdb\xe4\x77\xb6\x19\x83\x6d\xee\x94\x17\x9e\xf6\x8b\xf2\x07\xb9\x10\xf4\x59\xbb\x72\x04\xfd\xb6\xf2\xf1\x47\xf2\x9f\xb2\x3d\xf7\xf0\x00\xd2\xcc\xd7\xde\x2e\x6e\xfa\x69\xf1\xc1\x77\xc4\xd6\x85\x31\xca\x51\x7e\xfe\xac\xef\xa4\xb3\xf1\x8f\xbe\x03\x83\xf1\x85\xbf\x37\x36\x91\x9a\xeb\x58\x6a\x79\x26\x3f\xf4\x03\xbf\x44\xfe\x1c\xfe\x8f\x83\x91\x39\xfc\xc7\xd6\x88\x23\xe7\xd3\x43\xf9\x8f\xfb\xce\x63\xf6\x29\xc1\x6e\x52\xb3\xcf\xde\x89\xaf\xb8\x0c\xe2\xb5\x3c\xd9\xa6\xff\xa4\xec\xa0\x7b\x90\x3d\xfb\xe5\x9d\xea\x72\xc6\x04\xbd\x77\x72\x19\x6e\x60\x36\x9b\x86\x69\x76\x92\xbd\xff\xa4\xec\x79\x54\x98\xef\x8f\x7a\x0f\xbe\xb8\xa4\x67\x66\xdf\x7b\xb3\x9a\x9d\x49\x2d\x74\xac\x82\xde\xc1\x26\x61\x5c\xf1\x19\x36\x59\x65\xbb\x87\x36\xb9\x1b\x4e\x18\x4c\x67\xd9\xdc\xd0\xd0\x56\xc5\xb6\xbb\x27\xfb\x71\x7f\x64\x31\x99\xdb\xea\x6a\x93\xc6\x93\x4b\x74\xd7\x56\xc1\xe0\x8d\x58\x86\x0e\x9a\x10\x13\x84\x93\x73\x7f\x89\x7e\x99\x5d\xe2\xc8\xab\xd5\x2e\x5c\x68\xa5\x63\x63\xc4\x49\x76\xf9\x55\xb2\xef\xc2\x64\xe9\x65\x13\x64\x77\x52\x1b\xa7\xe3\x4e\xeb\x93\x1f\x7e\x5a\xf6\xb3\x36\x7f\x42\x36\xbd\xe5\xdb\xee\x33\xe2\xef\x6a\xf3\x53\x7c\xbc\x67\xf3\x25\xfe\x96\x66\x89\xbf\xd6\x9d\xc5\xdf\x8f\xfb\x8f\xc7\xe5\x3f\x6f\x97\x7b\xf1\xfd\x77\x95\xff\xf9\xfd\xd3\x73\x31\xf2\x39\xfd\x59\xb8\x6f\xfb\xd7\x21\xdf\xd1\x7d\xf9\xf7\xcf\xbc\xc5\xd6\x27\xbb\x65\xe8\xe5\xc0\xc1\x27\x17\x82\xf8\x1d\x07\xac\xa8\x00\xe1\xfe\x10\xe3\xb3\xf5\x8c\x71\x34\xca\x00\x6c\x6c\xc8\xec\x76\x87\xc3\xbe\x12\x27\x1c\x73\x5e\x71\x42\x59\x96\x79\xb0\x3c\x2c\x38\xd6\x9d\x70\xf0\x2d\x0b\x67\x12\xcf\x70\x7e\x7a\x14\x07\xc7\xda\xa7\xbb\x43\xbe\x4e\x11\xb3\x19\x66\x5c\x6e\xfb\x2e\x47\x12\x83\xc9\x0c\x3c\xc2\x68\x40\x4e\x30\x81\x9f\x8b\x5d\x65\xa1\xef\xfa\xa8\x3c\xe0\xde\xb9\xc7\x72\xc6\x39\x2d\xcb\xec\x7d\x76\x51\x9e\x8e\x3e\xf2\xdb\x28\x16\xf3\xb4\x7e\xa9\x1a\xed\xd7\xf2\x34\xed\x03\xbb\xa9\x47\xee\x30\x3e\x30\xa2\x5d\x0f\x21\x2e\x56\xfa\x40\x66\x33\x9e\x46\xca\x07\x9f\xf4\x8b\xe8\xae\x0f\xa2\x63\xeb\xcb\x23\xac\xf9\x32\x9c\x7b\xb5\xfe\xc5\x38\x4b\xfd\x7c\x06\x4e\x73\xef\xb0\xe3\x07\x32\x9b\x71\x7f\x74\x8b\x9d\xcf\xfa\xa5\x4e\x9e\x2f\x4f\xf4\x14\xce\x5d\x00\x73\x6b\x79\xdc\x52\x1e\x1a\x9b\x7b\xee\x97\xd6\x5d\x38\x51\xad\x74\x38\x51\x1d\x67\x5e\xab\x42\x85\x5e\xe9\xac\xfd\xa4\x9f\x85\x33\x2c\x97\x1a\xef\x70\x4e\x6e\x71\x87\x63\xec\x82\x53\x78\x6d\x02\x8e\xe3\xd1\xd1\x6e\xcf\xe1\xfc\xf4\x44\x79\x64\xac\x7c\x3a\xcf\xe2\x3b\x5f\x83\x9d\xcf\x1f\xc0\x40\xaf\x6d\xa1\xf3\x04\x54\xec\x2c\x1e\x80\xdd\x67\x94\x27\x5c\x36\xe5\x0f\xed\x96\xad\x7e\x90\x56\xbd\x54\x12\xe4\x42\x04\x20\x70\xf0\x86\xc3\xb9\x53\x54\x64\xc5\xa1\xeb\x79\xee\x4f\xf8\xc1\x47\xf5\x63\x7d\xb4\x03\xc9\x8c\xe3\xe2\xc8\x27\x75\x38\xcf\x7d\x3c\xf1\x1e\x27\x5e\xaf\xbd\xaf\x62\x77\x76\xfb\x1c\x3f\xc0\xfe\x20\xfe\x5f\xf6\xde\x1e\x58\x56\x24\x49\x17\x24\x02\x32\x0f\x66\xb3\xef\x3d\x6e\x57\xdf\x6e\xd6\xd6\xc6\x1e\x77\xaa\x6b\x0a\x11\x9b\x9a\xdb\x85\xb4\x8b\x88\x88\x88\x88\x88\x88\x88\x88\x88\x18\x62\x88\x21\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x52\x27\x93\xb8\x6b\x11\x01\x24\x99\x49\xfe\x9d\xfa\xe9\xee\xb5\xbd\xdd\x67\xcc\x7a\xd2\xfd\x73\x0f\xf7\xcf\x3d\x82\x20\x00\xe0\x9d\xe2\x96\x2e\x3c\xe0\x65\x7b\xc1\x03\x66\x87\xe7\x27\x09\x96\x7e\x70\xc7\xce\x69\x3c\xa9\xf7\x4d\x0a\x97\x07\xe5\x0f\xe1\x65\xdc\x70\x15\x25\x31\xd0\x11\xa6\x7d\x14\x07\x50\xa3\x49\x28\xba\x1d\x72\x97\xb8\xf1\xe7\x42\x1f\xd9\x71\xe9\x10\xf2\x87\x36\x42\x51\xa7\xe4\x2c\x6e\x52\xd9\xf0\x83\xe9\x51\x4c\xcb\x34\x0e\xa1\x47\x83\x79\x47\x20\x9a\xed\x38\x7c\xce\xdf\xe8\xd7\x6f\x97\xfd\xba\x67\xc0\xf9\xd4\xaf\x03\x6f\x10\x27\xe1\x03\xd6\xae\x6d\x1a\x10\x01\x5c\x45\xad\xb0\x99\xa4\xcc\x66\xb4\xe2\xb5\xfb\x4c\x7f\x63\x71\xb3\x2d\x71\x2a\xfd\x10\xb1\xb8\xf1\x7e\x90\xf3\xfc\x68\xf5\xd9\x94\x03\x7d\xea\x4f\x66\xeb\xe8\xd4\xaf\xc3\x9b\x76\x96\xfa\x89\x78\xdc\x9c\xe9\xc5\x12\x87\x94\xf5\x9d\x66\xaa\x9f\x5e\xb4\x1d\x04\xdc\xbc\x10\x66\x62\x76\x7d\xcc\x67\x89\x36\x59\xf1\xe0\xb6\x9d\x75\xbf\xee\x43\xe0\x4c\x0f\xee\x1e\x02\x3e\x1d\x4d\xf9\xe1\x86\x1a\x1c\x23\xe0\xe5\x05\x8b\xd5\x6c\x88\xf5\x37\x66\xe8\x35\x3b\x9c\x07\x53\xbf\x9e\xed\x18\x3c\x5d\x37\x06\x34\x5d\xf0\x9f\xfa\xf5\x13\x76\x0a\x3e\x9e\x55\xbf\xe6\xf9\x59\xec\x68\x53\xbf\xde\xb6\x23\xf6\x26\xe7\xf3\x9f\xff\x2e\x49\x60\x3e\xfe\xf9\xe9\xa7\xcf\x7c\x4e\x3d\x2f\xd6\x96\x10\x5a\x11\x02\x6c\x5a\x1d\x53\x71\x85\xc2\xaf\xcc\x11\xbb\x42\x01\x51\x3d\xda\xa6\x09\xd9\xd4\x50\x02\x9f\x46\x85\x9d\xd8\x2a\xa8\x56\x76\xbc\xdf\xc4\x4e\x52\x8f\xa6\x69\xc2\xa6\xa6\x59\xc5\xec\x94\xdc\x4e\x9d\x88\x7d\x98\x57\xed\xd4\x84\x00\x8b\xd6\x47\x2c\x56\x72\x7c\xa5\xcb\x57\xd1\x77\xed\xf8\x7c\x7d\x28\xf6\x17\xae\xf6\xcf\x76\x2b\xab\xe0\x2b\x5f\x45\x47\xd4\x5c\xad\x42\x2d\x85\x9c\x2c\xc3\x98\xdf\x61\x48\x2d\x0d\xf4\xa9\xd7\x8d\x92\xae\xcb\x52\x47\x49\x59\xf2\xb8\x05\xfb\x64\xba\x56\xff\xf7\xab\xab\x80\x4b\x3b\xd6\x65\xac\x94\x7c\x65\x87\x5d\xb1\xb3\xc5\x3a\x94\x62\xbb\x1a\x35\xdb\x86\x7d\x45\xb3\xb2\x94\xfe\x40\x3b\xee\xb7\xf4\xca\xce\xed\xb8\x5d\x5d\xd9\x28\xf8\xdc\x4e\xce\xe2\xa6\x82\x86\x19\x32\x4c\x13\xb6\xc2\xd0\x34\x1e\xd0\x6d\xf1\x80\x23\x9f\xdb\x65\x3c\x28\x09\x01\x0e\x2d\x39\x0f\xd8\x95\xb7\x41\x09\xcf\x95\x0d\x5c\x32\x22\xd3\x84\x11\xa1\x2d\x42\xa0\xa4\x69\xaa\xda\x89\xad\x01\x12\xcc\xf7\x12\x82\xe5\xac\xfa\xaf\xb6\x55\x8c\xb1\x69\xc2\xb4\xe0\xb6\x1a\x9a\x60\x61\x2b\x0b\x85\x2d\x8b\xdb\x52\x3f\x68\x8b\xc5\x52\x5c\xc9\xd5\xd4\x06\x5e\x31\x46\xa6\x09\x51\x41\x1b\x42\x40\x4b\x13\x22\x6c\xe5\x8b\xad\x70\x39\xfb\xff\x6b\x6d\x99\x64\xcc\x4d\x13\x7a\xe4\x9b\x14\x45\x80\x50\x12\xab\x16\xab\xa6\xd4\xfd\x47\xd9\xaa\x3f\x6a\x6b\xba\xda\x43\xdc\x96\x45\xc6\xcc\x34\xa1\x4f\xe8\x90\x24\x20\xa3\x24\x11\xb6\xb0\x23\x6c\xf9\x7c\xdf\xa4\x7d\xb2\xae\x02\xb1\xdb\x39\xed\x70\x54\xd4\x59\xf7\x09\xd0\x52\x14\x89\x81\xf8\x46\x36\x66\x9a\x06\xfd\x8c\xf6\x69\x3a\xdf\xb7\x4e\xf8\xbb\xc2\x6e\x8f\xe9\x7e\x7f\x65\x1c\x14\xfd\xd5\x27\xe2\x2c\x3d\xa1\x75\x96\x81\x9a\x22\xcc\x1b\x5f\x16\xcc\x76\xa6\xe7\x14\x9e\x8b\xdd\x6d\x3b\x41\x33\x3a\xa6\x09\xcb\x86\x56\x79\x0e\x35\x1a\x64\x22\x76\x65\x72\xda\x53\xbf\x31\x37\xdd\xb0\x75\xd1\xcb\x4f\x57\xe5\x20\x68\xc5\xdc\xd4\x72\x5b\x3a\xbb\x66\x16\xb6\xd2\x39\x4f\xc9\x72\xbd\xff\x4c\x3f\xe7\x79\x9a\x76\x45\x2e\xf2\xc4\x2e\x61\x89\xe8\xe7\x75\x6c\xd7\xa3\x65\x18\xb0\xae\x69\x5e\x14\x4b\xfc\x9e\xb5\x63\xad\xe6\x24\xce\x6d\xde\x67\xa7\x88\xc2\x80\xba\xf3\xe6\x7d\xea\xf7\xa3\x6e\x18\xb0\xeb\x69\x99\x65\x2b\x3b\x1f\xc9\xd3\x85\x4d\x10\xad\xb1\xa1\xb5\xb2\xba\xce\xd3\xb3\x63\xba\xda\x31\x39\xeb\xe9\x67\x63\xea\x46\xc3\x30\x60\xdb\x2d\x63\x12\x6b\x95\xff\x21\x7d\xbe\xde\x11\xfb\x61\x75\xf6\x1c\x98\x30\x66\x5c\x33\xf4\x89\x6b\xe6\xce\x3f\x99\x70\x4e\x2b\x93\x54\x90\x62\xec\x00\x5a\xf0\xfd\x33\xfc\xbf\xdf\xc3\x5f\xb8\x7c\x86\xef\xd3\xa0\x14\xe4\xaa\x53\x24\x66\xa5\xb1\x06\x64\x8e\x15\xb3\xe1\x3e\x31\x06\xf7\x72\x3d\xb2\xb3\x09\x6f\xd4\x26\x6d\xa0\x4b\xc3\x69\x0c\x69\x3a\x5a\xa6\x09\xeb\xb1\x05\xf8\x6c\x5d\xf2\x68\x0c\x3e\x8c\xa6\x3c\x88\x3c\x5b\x3b\x77\xbd\x24\x71\xd8\xfa\x9a\x5f\xd6\xe3\x51\x32\x0c\x59\x1a\x0b\x90\x8b\x31\xe8\x3c\xdf\xd1\x99\x0d\xe3\x66\x9c\x74\x20\x89\x44\xa4\xfc\xa6\x9a\x7f\xe2\x6f\x44\x9d\x5c\x2c\xad\x11\x1e\x55\xc3\x80\xc3\x58\x82\xec\x63\x36\x54\x61\x23\x79\xc5\x86\xbb\x61\x63\x3b\x56\x1b\xbb\x7c\xa7\x5c\xf0\x5b\x9f\xb7\x6c\x88\xbe\x2c\x9e\xf5\xf8\x3f\xcf\x9f\x90\xf8\xe1\x2c\xf7\xfb\xe4\xaa\x55\xf2\x29\x4d\xb4\xca\x7e\x4c\x0d\x03\xc6\xd4\x06\x4e\x4a\x09\xe1\xa9\xcf\xbd\xa5\xce\xd5\x5f\x89\x0f\xd5\x31\x32\x0c\x88\xa8\x01\x3c\x44\xd3\x09\x3f\x58\x62\xf4\x22\x3e\x11\x53\xf2\x74\x11\x52\x51\xfb\x36\xbe\x98\x8b\x9b\xd7\xf0\xd1\x94\x0e\xe1\x3f\x6b\x51\xcd\x48\x0c\x03\x06\xd4\x03\x06\xa2\x28\xb6\xc5\x2c\xf9\x07\xe0\xbb\xaf\xe0\x4f\x8c\x99\xf1\xf5\x79\x9a\xbf\x83\x1f\x2c\xf7\x5d\x1e\xf5\x0b\x76\x8d\x61\x2d\xd7\x18\xac\x9e\x9d\xd3\xd2\xa1\xa1\x28\xe2\xa0\x89\x8f\x46\x62\x9a\xc2\xd4\x6a\xdd\xf0\x11\xfe\xac\xa6\xf2\x61\x4c\x0c\x03\x26\xd4\x02\x6e\xba\xb9\x5e\xb8\x85\xff\xf7\xa7\xf0\xa1\x3d\x3a\x86\x01\xcb\xb1\x07\x09\xba\xb9\x4e\x78\xca\xc6\xcd\x1c\x40\x67\xb4\x75\x9d\x4f\x06\x09\xa6\x61\x21\x6c\x54\xc9\xbc\x3e\x98\xef\x07\x3c\xea\x15\x57\x6b\x83\x55\x1e\xce\xa6\x37\x2c\x66\xd5\xb1\x06\x78\xd5\x2b\x9e\xb2\x71\xb5\x2e\xd8\x79\xff\x44\x36\xdc\xa7\x6d\xdc\xed\xab\x77\x6c\xf0\x7d\x32\x9e\xf3\x9d\xf4\xdd\xf4\xa5\x21\x91\xeb\xe5\x4e\xb9\xc2\x17\xe5\xee\xa8\x42\x32\x0e\xc0\x04\x8e\x41\x63\x1a\x40\x95\x4a\xd0\x19\x75\xe8\x61\x4e\x23\x86\x5e\xc5\x0b\x9e\xfb\x3c\x9e\xa7\xd3\x98\xfa\x1c\xcf\x1d\x35\x18\x20\xea\x12\xd5\x4e\x1d\x15\x54\x88\xef\xdf\xf8\x7c\x1f\xe2\x36\x9e\x05\x3d\x42\xbd\x51\x87\x98\x4a\xcc\x3f\x9d\x26\x34\x04\x03\x55\xa1\x37\xaa\x30\x44\xec\xe2\x96\xfb\x57\xa7\x12\x04\xc1\xb7\x80\xcf\xeb\xb7\xf1\xbc\x19\x0f\x51\x15\x18\xc0\x65\x78\x01\x18\xa8\x06\xe3\x63\x07\x13\xbc\x9a\xd1\xf9\x7b\xee\x7c\x3e\xf7\x5d\xe2\x19\x97\xe3\x95\x60\x36\x76\xc0\x62\xe3\x8d\xa8\x0f\xf5\x71\x80\xd1\x84\x97\xf3\x3b\x7f\x2d\x3a\xe5\xe3\x1e\xde\x34\x5e\x86\xd7\x03\x93\xf9\xc7\xf2\xa1\xdd\xc0\x73\x9f\xc5\xdb\x88\xdf\x4d\xff\x40\xf3\x38\x1f\xd2\x94\xdf\xc9\x3f\x95\x4a\xa0\x19\x13\xd0\x23\x8a\x12\xd5\x4e\x1c\x15\xa0\x60\xc1\x1b\x9e\xc1\xcb\xc7\xee\xc4\x3f\x7d\xec\xc1\x30\x06\x50\x43\x34\x4e\x04\x5f\xb2\x60\x19\xaf\xf6\xec\x78\xa7\xfc\x8a\xf1\x6a\xa3\x0b\x0d\x4c\xe3\xd4\x62\xd7\x1c\x85\xff\xdc\x78\x6f\xd6\x07\x1f\x6f\x87\x29\x8a\x54\x0e\x88\xdc\xdf\x00\xaf\x47\x14\xc7\x02\x0f\xbb\xf3\x78\x9f\xc9\xc7\x75\x7e\x37\xf1\x82\x6f\x3e\x9f\x27\x9f\xae\x0f\xdb\x98\xf0\xb4\x33\x3c\x76\xe9\xbe\xf8\x07\xa5\x0f\xe5\x43\x1a\x7d\xa8\x23\x9a\x4e\xf9\xf0\x4e\xf5\x61\x7e\xa8\xbf\x98\xa3\x05\x1d\x44\x03\x2c\xfc\x2b\xe3\xc5\xbf\x7b\xfd\xef\x76\x7d\x6c\xf5\x3f\x1e\x3f\x18\x7c\xa8\xbf\x04\xc7\x01\x46\x78\x75\xab\x9b\x9f\x61\xf2\xf9\x1c\xf0\x70\xbc\xa2\x1f\xcc\x78\xbc\x1f\x6c\xe1\x99\x0f\xf1\x2e\xfa\xcb\xc4\xbf\x5b\x78\xee\xb3\x78\x1b\xf1\xbb\xc6\x13\xdf\x0d\xcd\xf8\xbe\xb3\x98\xef\xf8\x01\x81\xaf\x5f\x00\x52\x7a\xf1\x95\x57\xc5\x3f\xe4\xd0\xa3\x2e\xc6\xa0\x9a\xde\x51\xc8\xbf\x4d\x3a\x7d\x7b\x76\xad\x93\x2b\xb5\xf8\x32\xa6\x62\x1f\xd8\xe5\xa4\x4b\x30\x9b\x04\x56\x3a\xc1\x03\x9d\x80\xba\x19\x9e\xae\xcf\xa7\x6f\x9a\x4e\xdf\xac\x3d\xf7\xad\x3d\x14\x5c\xc7\x3d\x94\xfc\x92\x0f\x83\x16\x9f\x74\xb6\xec\x9c\x8f\xe7\xdc\xce\x47\x7c\xfb\x88\x0e\xe1\xdf\x74\x6d\xaf\x74\x32\xa5\x39\x94\x4a\xf8\x3e\x28\xce\xa1\x02\x2d\x8d\x03\x04\x92\xf0\x57\xea\xf0\xf7\x88\xdc\xd1\x81\x1a\x0d\x13\x04\x48\xbc\x8a\x1b\xdf\xc7\xbc\x13\x37\x50\xd1\xd4\x47\x20\xf6\xd7\xbe\x5d\xeb\x9c\xfb\xb6\xa5\xf3\x78\x3c\x69\x84\x80\x38\x07\x35\x7f\xdb\xf6\x5a\xe7\x8c\x07\x1b\x3a\x5b\x31\x38\xe7\x81\x46\xc3\x18\x4f\x7b\xd4\x73\x4e\x8d\x07\x39\x35\x68\x90\x60\x90\x47\x6b\x1d\xfb\x81\x8e\x4d\x7d\x84\x41\x15\xad\x79\xbd\xc5\xd1\x35\xaf\xaf\x6b\xe1\x9f\x95\xd7\x68\xfa\x96\xf0\x1b\x3f\xaf\xfc\x69\xfa\x4e\x6e\xae\xc4\xef\x1d\x94\x30\x45\xfc\x13\xc2\xab\x6f\x0e\x9f\xcb\xd5\x8a\xcf\xbf\x35\xfc\xba\x9c\x88\xa3\x76\x26\x17\x4e\xdf\x0a\xd6\x30\x4d\x31\xcc\x56\xfe\x59\x9b\xfe\x59\x98\x06\x18\xd6\x2f\xc9\x65\x9b\x72\xc2\xbf\x2b\x3c\xfe\xde\x8f\x2b\x3c\x90\x63\xda\x62\xe8\x9d\xf0\xae\xe4\xc4\x37\x9e\xcf\xe5\xc2\x0d\x39\x6e\x97\xc9\x75\x18\xba\x93\xdd\xf8\x9e\xdd\x01\x43\x7b\xc2\xdb\x92\x5b\xf0\x5e\x96\x4b\xbf\xc5\xfb\xf4\x42\x6e\xca\xc7\x99\x9c\xf0\xaf\xdd\xf4\xaf\xc5\xb4\xc2\x30\x5c\xd9\x1d\x36\xe3\x32\x60\x9a\x63\x98\xdc\x91\x13\xfe\xad\xe5\x84\x7f\xc3\xa6\x7f\x97\x72\xd7\xf9\x15\xdf\x3c\xb7\x30\x8d\x31\x2c\x4e\xe3\xb8\xcd\x97\x45\x2e\xdb\x94\x5b\xf8\x32\xc9\xed\xa6\x6f\xc0\xa6\x92\xcc\x77\xbf\xff\x2f\xe9\xc7\xe9\xd9\x94\x9f\x3e\xfd\xd7\xcf\x7f\x55\xbe\x3c\x78\x22\x56\x1d\x25\xd2\x34\x1a\xed\x69\xbe\xab\x8f\x3e\xa8\xf3\xaa\x2c\x8a\xaa\x2a\xf8\xe7\x8d\xe2\x08\xa6\x69\xea\x8d\xb5\x95\x38\xd0\x3d\x7f\x6c\xd1\x31\xa7\xc7\x16\x7f\x47\x1f\xc2\x28\x7c\xda\x07\xf7\x57\xf9\xa0\x8f\x1a\xa9\x6b\x9d\xf6\xb4\xd8\xe5\xc7\x08\x54\x79\x59\x14\x79\x59\xe6\x51\xc8\xbf\xfd\xf2\x9c\x0f\xd1\xaf\xf0\xc1\xa4\xd6\xa8\x93\xba\xd2\xe9\x40\x8b\x5d\x7a\x44\xa0\xc8\x8a\x22\xcb\x8a\x92\x84\x01\xff\xf6\x0e\xf3\x41\x1f\x91\x9d\xb8\xd0\xfb\xbd\x72\xa1\x1d\x07\xd2\xb6\x3a\xed\x28\xd9\xd5\xc7\x90\xc5\xa1\xcc\x8b\xb2\xca\xc5\x37\x60\x22\xe1\x03\xde\x88\x83\x78\x8c\xd5\xb6\xfe\x59\x7c\xf8\x75\x7c\x30\x47\x89\xb4\x2d\xe3\x24\xd9\xe5\xc7\x04\x94\x79\x51\xe4\x59\x59\x66\x61\x18\x86\x41\x14\xde\xf6\xe1\x2a\x17\xa0\x7f\xd6\x87\x1f\x2f\x38\x79\xec\x57\x71\x88\x40\x55\xf0\x7f\x0b\x27\x41\x1f\xc7\x26\xb5\xad\xc4\x01\x6d\x9a\x8e\x5d\xe4\x7a\x71\xec\xb9\xd1\x60\x18\x3a\xff\xef\xaa\x3f\x58\x1f\xad\x8b\x6b\x1f\xca\x7c\x5d\x17\x56\x1c\x7b\xd4\x60\x71\xd0\xd2\x74\x2c\x62\xdf\x8f\x13\xcf\x8f\x81\x6e\xe9\xa6\x61\x98\xfa\x2a\x17\xfa\x47\xeb\x62\xe5\x43\xce\xea\x22\xe7\xff\x8a\x4c\x7c\x8f\x2a\x84\x3a\xf3\xc1\xb6\x13\x17\x0c\x69\x3a\xbf\x66\xe1\xec\x75\x14\xbf\x8f\x0f\xac\x3e\x3f\xe0\x83\xf1\x7b\xf9\x60\xa4\xa9\xff\x2f\xe1\x43\xf4\xeb\x7c\xb8\xec\x93\xdb\x3e\xb0\xba\x78\x18\x07\xf7\xb7\x8a\x83\xe8\xd5\x27\x1f\xdc\x24\x71\xc6\x81\xd5\x85\x71\xfd\x4e\x0b\xd3\x14\xef\xb4\x10\x3e\x78\xbf\x97\x0f\x5e\x9a\xba\xff\x12\x3e\x44\xbf\xce\x07\xc6\x87\x46\xa3\x03\xcd\xd7\xf3\xe6\xa5\x0f\x6c\xde\xbc\xe3\xc3\xaf\x9b\xb3\xae\xfa\x24\xeb\x91\xa2\x4f\xb2\x4e\x39\xad\x1f\x2a\x16\x87\xdf\x6d\xee\xfe\xff\x8a\x0f\x10\x98\xfc\x1b\x3e\xaa\xf4\x26\xe9\x92\x04\x84\xe5\x1d\xf8\xfc\x85\x1f\x09\x15\x9f\xdd\xfd\xfa\xe5\x2b\x30\xf9\x14\xdd\xd1\x6c\x97\xd2\x0a\x90\x90\xd6\x9e\x4f\xdb\x00\x04\x26\xad\xa0\x3a\x0e\x61\x12\xa9\x30\xc5\x2a\x6d\xa3\x24\xaa\x8a\x24\x89\x81\xae\xe2\x05\xdf\x7e\x02\x9f\x2f\x4b\x19\x7e\x0d\x70\x48\x2b\x57\x7c\x10\xce\xa2\x25\xb4\xc7\x8a\xe3\x97\x58\xa5\x45\x92\xa4\x1d\x3f\x7a\xea\xa8\xe2\xdb\xde\x4f\xe1\xbb\xa4\xe1\xa1\xca\x76\x21\x6d\x41\x1a\xd2\xc6\x9d\x9e\x42\xa1\x35\xc3\x8f\x92\x98\xe1\x6b\xb4\x4c\x92\xa4\x6b\xf9\x67\xba\x34\xcc\xbf\x6b\xf8\x14\x7e\x44\x2a\xde\x26\xcb\x9d\x4b\x6b\x80\x42\x5a\x3b\xd3\xf3\x0e\x02\x7f\xf2\x9f\xe3\xa7\xed\x0a\xff\xe3\xf1\xe1\xe7\xf5\x83\xf3\xf8\x5c\xfb\xff\x3c\xfe\x92\xdf\x75\xfc\x03\x53\xe0\x47\xe9\x59\xfc\xd3\xf8\xd7\xc7\x7f\xfa\x10\xd8\x59\xfc\xaf\xf3\x2b\xfc\x97\xa4\x37\xe9\x2f\x67\xf8\xeb\xaf\x42\xaf\xbc\x47\xb4\x54\x67\xf7\xbb\x10\x78\x0e\x2d\xa0\x44\x25\x1e\x1e\x84\x69\x1d\x25\x49\xdb\x24\x71\x0c\xcc\xe5\x7e\xdf\x73\xf8\x8d\x7e\x85\xdf\x06\x0b\x3e\x0f\xcf\x26\xbe\xbb\xe0\xff\xf5\x56\x7c\x44\x78\xa6\xab\xb2\x88\x56\x0c\xbf\x11\xfe\xfb\x36\xad\x56\xfe\xab\xb4\x89\x92\xb8\xae\xf8\x77\x07\xf0\xc9\x7f\x7e\x4e\xe0\x81\xff\x82\x3d\x88\x96\x1a\xa7\xa7\xa0\x8f\xeb\xd2\x12\x34\xd4\xe4\xf8\x21\xa1\xac\x8e\xeb\x32\x8e\x43\xa0\x12\xe9\x0c\xff\x7f\x72\xfc\x73\xdc\x2f\x93\xb9\x7d\x31\xa3\x7a\xfc\xeb\x55\x8e\x43\xab\x31\x9e\x63\x06\x1a\x4c\x87\x48\xe0\x46\x40\xc5\xc2\xda\x12\x9b\xc7\xd8\xb5\x0e\xe2\xa9\x60\x03\x60\xb9\xb4\x1e\x93\x39\x5c\x0c\xbb\x0f\x93\xb8\xba\xc2\xe6\x75\x0b\xba\xfb\x71\x89\x48\x55\x6b\x73\xd5\x6a\x20\x39\xb3\x02\x3a\xaa\x73\x5a\x86\xdc\xff\xc5\xc6\x3a\x2e\x0f\xf0\xcd\xa5\x41\xa7\xb4\x3a\x8b\x90\x4d\x2b\x86\x2f\xe2\xce\xc7\x10\x55\xc5\x15\x3e\x34\x5f\xee\x0b\x93\x01\x9f\xd5\xad\x39\x36\xdc\x40\x86\x4d\xd6\x97\xe3\xb2\x88\xe3\x18\x18\x86\xa8\x5b\xef\x4d\x87\xc6\xe3\xba\xad\x1b\x9d\x13\x33\xa4\x0d\x1b\x00\xab\x5b\xfe\x5c\x00\xad\xa1\x31\xb6\x1c\x9f\x60\x8d\x36\x71\xcc\xfa\x7e\x9c\x00\x63\xd5\x37\x1f\xe2\x47\xa4\x2c\xf5\x6f\x12\xad\xb6\xfa\xa6\x31\xb6\x41\x12\x0a\xfc\x7a\xca\x40\x0c\xcc\x55\x5f\x7b\x88\x6f\x92\xa6\x16\xfe\xaf\xe2\x23\xfa\x7e\x75\x89\x1f\xd5\x2b\xff\x3f\x8c\xef\xfa\x1c\x9f\xf5\xe5\x2b\xfc\x32\x5e\xf0\x1f\xc4\xff\xed\xd4\x37\xf9\x72\x2b\x3b\xc5\xdf\x1b\x42\x60\x5b\xb4\xe1\xe1\x4f\xc3\x55\xf8\x17\x78\xbe\xf7\x15\xee\x6b\x40\xa4\x1d\x47\xff\xf2\xf9\x0b\x40\x44\x21\xef\x25\x20\x34\xc0\x4f\xfc\x9e\xf1\xdf\x8b\xd5\xef\x19\x51\xd2\xf7\x06\x14\xd4\x9d\xf5\x53\x90\x9f\xeb\xfb\x07\x15\xe4\xd4\x63\xbf\x63\xae\x5f\xad\x7e\xc7\x44\xc1\xef\x15\xa8\xa8\xfd\xcc\xef\xc2\x7e\xbd\xb6\x9f\x29\xc9\x7b\x03\x6a\x6a\xcd\xf6\x33\xe0\x9e\xdb\x8f\xdf\x3b\xe0\xd2\xe2\x99\xdf\xc5\x5e\xad\x77\x8e\xef\x1f\x24\xe0\xd1\x5c\xf8\x97\x5c\xe8\x63\xa2\x44\xef\x3d\x70\x69\x2d\xf0\x2f\x7f\x5f\xf0\x6b\x81\x7f\xf9\xfb\x84\xbf\xd2\x4f\x41\x70\x1d\xbf\x40\xf8\x27\xec\x67\xd7\xf6\x33\x1a\x9d\xec\x67\xd7\xf6\xa7\xdf\xb3\xab\xdf\x27\xfb\x2b\xfd\x14\x94\xd7\xf6\x4b\xea\x9f\xec\xd7\xd7\xf6\x6b\x91\xff\x47\xbf\x67\x57\xbf\x4f\xf6\xf9\xef\xe2\x9b\xa4\x01\x7f\xfe\xf1\x4f\xd7\xcf\x21\x7d\xff\x69\x7e\xbe\x32\xb0\x32\x10\x86\xb4\x3f\x18\x30\x23\xe3\x90\x37\x28\x4d\x81\x13\x27\xb4\x8a\x93\x08\x1a\x63\x08\x55\x69\x7a\x4e\xcb\x7b\xf3\xa1\x75\x1b\xaf\xe0\x75\xcf\x9f\x07\x0c\xbe\x49\x07\x1b\xe6\x64\xec\x1b\xfe\xed\x5a\x3f\x8e\x69\x96\xc6\x09\x34\x46\x1f\x6a\x6b\x3c\xf5\x1a\xef\x3f\x67\x3c\x97\x2f\x30\xcc\x0c\xb8\xc1\x70\xb0\x38\x5c\x29\x9e\x89\x0a\x42\xfe\xc5\xcc\xc9\x3d\x08\x8c\x6f\xee\x9b\x07\xed\xbb\x63\xed\xc4\x13\xd1\xfc\x59\x38\x87\x8f\xb5\xea\x70\x8a\x80\x97\xa6\x34\x4f\x92\x04\x3a\xa3\x0d\x2d\xe1\x9b\xc4\x63\x77\x1f\xef\x14\xbb\xee\x60\x70\xe7\xce\xf0\x62\xe8\x9e\xf0\xb4\x47\x78\x99\x78\x94\xda\xcc\xc4\xb3\x6d\xc6\xb5\x7f\xbf\x2b\x1e\xcf\x05\xff\xee\xeb\xad\xdc\x4e\xb9\x38\xcb\x2d\xa9\x93\x24\x01\x56\x10\xd0\x3a\x8e\x43\x28\x8d\x08\x34\xff\x4a\x78\xcd\xc7\xf0\x7c\xff\x5f\x6e\xbc\xfa\x37\xef\xcd\xbb\x87\x87\x3d\x3a\x84\xf3\x47\x6a\x87\x09\x2f\x2d\xe3\xd5\xa7\xb1\xae\xfc\xdb\xaa\xdd\x67\xfc\x4b\x53\xe1\x9f\x79\xd9\x5b\xfe\x79\xf1\x0c\x16\xbf\xbb\xfd\x60\xe9\x55\xab\xfe\x92\xd5\xec\x2a\xd1\xca\x73\xf1\xe1\xac\xb3\x5e\xea\xdc\xaf\xdf\xa9\x97\xce\xcf\x86\x0a\xff\x6a\xf1\xd5\xa2\x34\xe5\x5f\x2d\x3a\xaf\xdf\x7f\x76\xbc\xf9\x4c\xd6\xbf\xad\xce\xec\x7c\xcf\xcf\xaa\x62\x42\x55\x59\xe2\x47\x76\xf8\xf9\x2b\x0d\xaf\xe7\x88\x3f\x5e\x2f\x85\xc6\xa6\x1e\x21\x54\x92\x25\xe8\x63\xea\x40\x83\x0d\x0d\x5f\x8e\x4f\x7f\x68\x4f\x1f\x1d\x68\x62\xf6\x7f\xfe\x81\x7a\x00\xdf\xd4\x83\x03\x3f\xda\x05\xf0\x58\x82\x0c\xcf\xcf\x42\xfc\xff\x7a\xf7\xf4\xd2\x3b\x7a\x13\x5f\x6e\xd8\xeb\x1e\xe5\x0f\x74\x63\x04\x06\xcc\xfe\xcf\x3f\x4e\x2f\xbd\x5f\x47\xbc\x1e\xb6\xeb\xef\x9f\xbd\x1e\x00\x88\x96\x3e\x31\x69\x81\x68\xa7\x91\x03\x12\x03\xfa\xed\x65\x22\xde\x5b\x4e\x32\x12\x39\x10\xd1\x4c\xfe\x31\xfe\x08\xce\x9f\xcb\x80\x85\xa7\xaf\xc8\xe4\xd7\x32\xf9\x98\x81\xf2\x1f\x65\x8b\x5c\xcb\x90\xf9\x39\xb8\x59\xa6\xbd\x96\x69\xc7\x18\x74\xbf\xbd\x4c\xc4\x6b\xef\x3c\xef\xa2\xd8\xfe\xf0\xbc\xef\x3a\x98\xed\xd3\x7d\x24\xc9\xfc\xba\xf1\xfb\x5d\x47\xc8\x3e\x3a\xf2\x73\x49\xbb\x16\x66\xfb\x64\xf5\x5b\xfb\xf4\x6f\xda\xf5\x6f\x07\xf2\x2b\x7f\x4b\x36\xec\x69\xbf\xea\xb7\x0e\x98\xd7\x63\x7f\x2f\x84\x1e\x30\xaf\xf5\x9e\xf8\xad\x63\x3d\xf2\x12\x73\xe8\x84\x1e\xcb\xc7\xa5\xde\xc3\xdf\xa0\x14\xc3\x70\xfa\xed\x4d\xfc\xfa\xe3\xe7\xdd\x8f\x4c\x22\x3a\x18\xfa\x3e\x3a\x0c\x4d\xea\x20\x2e\x87\xee\xc9\x1d\x8d\x3e\xf5\x52\x2e\x67\xde\xc5\x2b\x5a\x64\x0b\x39\x7c\x17\xcf\x1c\x66\xbc\x0b\x39\xf9\x42\x0e\xd8\xd8\x13\xfb\xac\xd7\x3e\x5e\xc8\x1a\x40\x62\xa0\x4f\xca\x3a\xc8\x43\x93\x2c\xc8\xef\xc9\x1e\x1c\x10\x9e\x7c\x00\xdd\x5d\xd9\x18\x44\x2b\xd9\x47\xb8\xd6\x0b\xb8\xf1\xca\xdf\x47\xb2\xe8\x05\xd9\xe4\x05\x1f\x8a\x13\xee\x25\x0f\x2e\x64\x0b\xa0\x31\x22\x6c\x73\x70\x96\x0d\x0e\x1a\xe7\xe0\x59\x2e\x1e\xf9\x60\xae\x7c\xb8\x81\x3b\x73\x1b\x18\x2f\xc8\x5a\xbf\x93\xec\x8a\x0f\xd0\xb8\x5b\x3b\xf9\x80\x6c\xf4\x14\xa6\xb4\xb2\xaf\xde\xc7\xac\x98\x28\x93\x8b\xb6\x31\xc3\x83\xce\xea\x41\x02\x12\x72\x17\xcc\xc7\xb2\xce\x2d\xd9\x1f\x2f\x64\x3b\xe4\x3c\x67\xdf\x3f\x61\x02\xfd\xde\xf8\xdf\x33\x50\xac\x38\xfb\x40\x16\xae\x62\xf5\x10\xd7\x7d\x41\xf6\x05\x1f\x40\xff\x02\x6e\xfd\xbc\x2c\xf4\x4e\xb2\xcb\x1c\xb0\x19\xdf\xa1\x83\x36\x0e\xf1\xb3\xb2\xd1\x0b\xb2\xab\x1e\xf6\x0f\x97\x05\x52\x06\xeb\x37\x5f\x0e\xf8\x5c\xf8\xf9\xcb\xd7\x37\xff\x17\x4f\x0e\x10\x9a\x7e\xeb\xde\x7c\x39\x3e\xfb\x2d\x5e\x7e\x0b\xde\x7c\xd8\xaf\x7f\x83\xfd\xf2\xdb\xf0\xe6\xcb\xe9\x99\x5e\x3a\xff\x26\xab\x6f\xbe\x8c\xcf\x7e\xc3\x8b\x5e\xff\xe6\xcb\xe8\xec\x37\x44\xc8\xa4\x67\xbd\xf9\x72\x75\xf6\x5b\xc5\x5f\x9e\xcc\xf4\xd2\x37\x5f\x36\xce\x7e\x33\x96\xdf\xb2\x37\x5f\x76\xce\x7e\x73\x96\xdf\xbc\x37\x1f\xb6\x67\x63\x68\x17\x5f\xf2\x6b\xbd\xe5\xb7\xea\x3a\x66\x0b\xe6\x1d\x3d\x59\x7f\xf3\xe5\xfc\xec\xb7\x7c\xd1\x2b\xdf\x7c\xd9\x3b\xfb\xcd\x7b\xca\x97\xf8\xcd\x97\xd5\xb3\xdf\xd4\xa7\xfc\x64\x79\x0f\xcf\x7e\x0b\x9f\x89\x99\x6c\xbf\xf9\x72\x7d\xf6\x5b\xbd\xe8\xe1\x37\x5f\xb6\xce\x7e\xb3\x9e\xca\x03\xe3\xd2\x70\x96\x87\xe1\x29\xbd\x7b\xbf\xb1\x78\xfa\x67\xbf\xf9\xcb\x18\xee\x71\x49\x7a\xf3\xe1\x19\x3f\x21\x5e\x7e\x33\xde\x7c\x58\x9c\xfd\x56\xcc\xbf\x81\xf6\xcd\x87\x67\xb5\x02\xe3\x45\xcf\x7e\xf3\x61\x73\xf6\x5b\x33\xf3\x1a\xba\xd7\x1c\x7c\x66\x7c\x92\xf7\xe6\x4b\x1d\xfb\xed\x87\xe9\xb7\x0e\xcf\x35\xfd\xaf\xf2\x1b\xb4\x78\x7f\xe1\x3b\x07\x5f\xbf\x7c\xfe\xf2\x99\x3f\xe6\x0e\x2d\x1a\xef\x73\x1a\x91\x31\x23\xb0\x43\xa8\x10\xdf\xb7\x66\xf2\xda\x33\xf2\x4d\xd3\x4c\xf2\xa0\xe4\xbc\xba\x27\x1f\x60\x4c\x78\x2a\x3e\x82\xcf\xe5\xd1\x3d\x79\x59\x42\xa8\xef\xfb\x8f\xca\x3b\x6f\xbe\xbc\xf2\xff\x13\xff\xec\xed\x99\x7c\x80\xf1\xf4\xcd\x14\x36\x5e\xc2\xeb\xef\x9e\xff\x18\xe3\x61\x18\xe6\xf8\xb0\xfe\x9e\xdc\x95\x6f\x09\x59\xc9\xb3\x5e\x23\xdd\x95\x0f\x31\x3e\xf9\xff\x32\xfe\x1f\x21\xdf\xdd\x8d\xa7\x87\x31\xc5\x20\xa4\x78\xc9\x97\x7b\x17\xbf\x40\x28\xcb\xb2\x19\xbf\x7f\x86\x3f\x2b\x7f\x58\x0f\xd6\xef\xca\xa3\x34\x2d\xcb\x72\xe6\x83\xfe\x0c\x7e\x5d\xd7\x6b\xfe\x64\x77\xf9\xa6\x61\xbc\x92\xd7\x9e\x89\xe7\x4a\x3e\x38\x8f\xe7\x06\xbe\x77\xc5\x87\xfb\xf1\xcc\x31\xae\xaa\xea\xa3\xf9\x65\x3d\x5f\xbb\x2b\x1f\x63\xbc\xea\x27\x12\x9f\x03\xef\xc9\xd7\x67\xf1\xf1\xde\x7c\xb9\xbc\x3b\x5e\x13\xe3\x55\x7f\xb0\x1f\xd5\x3b\xec\x09\x59\xf9\xe3\x3d\xc3\xcf\x6f\x12\x90\xbe\x89\xde\xca\xfa\x5b\x7e\x25\x9f\x51\x69\x9f\x53\x8b\xd0\x30\x83\x3a\xc6\xfc\xeb\x3c\x35\x97\x6f\xcf\xfb\xe1\x99\x7c\x44\xa8\x99\xb1\x7e\x48\x13\x90\xd0\x6c\x91\xc7\xe7\xf2\x9f\xcf\xe5\x25\xd1\x7f\x06\x11\x7f\xf5\x29\x7c\xe6\x4f\x35\xcb\xcb\xfe\x5d\xf9\x12\x63\xea\x82\x82\x86\x8b\xbc\x75\x57\x1e\x63\x4c\x23\x80\x28\x5a\xe4\x6f\xc5\x87\xcb\xcb\x3a\xc6\x63\x0f\x35\xaa\x31\xf9\x6f\x21\x9f\xc3\xef\xc4\x1f\xb4\x18\x8f\x29\x8c\xc7\x72\x91\xaf\xee\xc9\x43\x0b\xe3\xd1\x86\xd5\x18\xfd\x61\xf8\xe2\x59\xe5\x59\xf8\x13\x9b\x73\x85\x2c\x8d\x61\x8b\x47\x03\xb6\xa3\x0f\x33\xfc\x51\xfc\x29\xfe\x9b\xf8\xb2\x85\x8f\xb5\x6c\x8d\x2a\x1c\x30\xbf\x86\x9d\xaf\xc7\xfe\x4d\x5c\x87\xfc\xb0\xfb\xf1\x87\xcf\xbb\xcf\x7c\xc7\xed\x58\x8f\xad\xbe\x93\xc6\x86\xec\xa3\x43\x56\xea\x89\x9d\xea\xe5\x7c\x8d\xec\x3e\xa9\xd7\xd4\x46\xea\x24\x46\x73\x79\x6d\xff\x48\x0f\x23\x3d\x71\x53\x9d\xcc\x7a\xfe\x1d\xbd\x6a\xec\xb8\x5e\xb6\x8f\x0e\x5d\xa9\x27\x4e\xaa\x57\x2f\xeb\x35\x7a\x6a\x27\x46\x3b\xeb\x05\x4f\xea\xf5\x39\x1f\x5f\x31\xeb\x25\x5b\x7a\x9f\xae\xf4\x8e\xda\x60\x20\x0f\x99\xdf\xe6\xeb\xe2\xea\x8e\xde\x3a\x2e\xfe\xa0\x23\x07\xe9\x74\x98\xf4\xfa\x73\x3d\x70\xc3\xde\x21\x01\x86\xc1\x15\x1b\xa1\x57\x3e\x99\x07\xaf\xd6\x93\x55\xfe\x96\xbd\xac\x47\xf6\x62\x60\x1a\xc8\x45\x06\xed\x5e\xd5\x73\xc4\x00\xab\x57\xf5\x0c\x61\xaf\x7f\x55\x8f\x30\x7b\x06\x8d\x84\xde\xf0\x64\x5c\xd2\x8a\xbb\xb9\xf0\xda\x7e\x92\x2f\x55\xc3\xd3\x30\xf3\xec\x79\x7b\x98\xe7\x81\xfc\x4a\x7b\xcf\xeb\xf5\x3c\x9c\xc3\xcb\x7a\x35\xd7\xbb\x15\x97\x9b\x79\xa8\x80\x27\xf2\x90\xfd\x41\x79\x38\xf7\xf3\xae\xbd\xb5\x5e\x8a\xb8\x1e\xfe\x8d\xe3\xf2\x74\x1e\x9e\xee\x4b\x19\xd7\xcb\x2f\xf7\x34\x1f\xe4\xe1\x28\x01\x55\x47\x36\xd2\xa7\x3a\x92\x2e\xea\x48\x66\x4a\x9f\xa6\xbd\xaa\xb1\x21\x63\xab\xef\xa3\xf7\x18\xaa\xa9\x41\x5b\xa0\xeb\xab\x7d\xbe\x74\x53\xaf\x23\x24\x5a\xf4\x32\x68\x21\x83\x96\xc0\x36\x66\xbd\x4d\x7b\x5f\xaf\xec\x81\x1e\xeb\xdf\xa4\x41\x4f\xcf\xf6\x14\xef\xfa\x98\x41\xc6\xae\x9c\xb5\x97\xcb\xbd\xc8\xdf\x49\xef\x72\x6c\x97\x7a\xe0\xb2\xc7\x2b\xc3\xd8\x12\xbe\x63\xca\x27\x07\x83\xba\xf3\x5e\x61\xba\xa9\xd7\xf1\xdc\xb5\xba\x52\x53\x95\xdf\x1f\x83\xb1\x81\x5d\x6c\x50\xf5\x39\xbd\x9d\x3e\x96\x42\xaf\xe6\x7a\x63\x7e\xbe\x37\x79\xd3\xcf\xc5\x9e\x2b\xec\x49\xcf\xe9\x4d\x35\x3b\x74\xb0\x12\xf6\x8a\x57\xf5\x06\xa1\x97\xbe\xaa\x57\x1b\xd8\xc3\xc6\x98\xbd\xa8\x27\xfb\x26\xd7\x33\x25\x49\x96\xe2\xe5\x7e\xec\xbf\xf1\xb7\x2b\x31\x4d\xfe\x12\xe0\xaf\x5f\xd6\x55\x48\xab\x2c\xa3\x35\xb0\xc6\x84\x86\xba\xdc\xd0\x98\xdf\xb5\x55\xec\x43\xeb\xa6\x86\x9e\xd8\x89\xce\x6b\x59\x5e\xdd\x3b\xb9\x8f\x37\x10\xc2\xf1\x02\xea\x69\x8a\x4a\x3d\xbc\x8f\x0e\xb9\x62\x1e\x06\x2f\x36\x8d\xd8\x4b\x8c\x19\x6f\x35\xe7\x3d\xe7\x5f\xa0\xcd\xfe\xc5\x4a\x70\x20\x5e\xac\x19\xb1\x9b\x88\xb9\x42\x5e\xdd\x0f\xbb\x81\xf7\xe9\xf6\x78\x0b\xc5\x38\xb4\x61\x62\xb2\x35\x95\x4e\xdb\xdf\x04\xaf\x0f\x52\xd7\x48\x9d\x94\x2f\x0d\x7e\x0b\xff\xbc\xc4\x12\x78\xc3\x84\x17\x3c\x85\x57\x4f\xf9\x48\x68\xc0\xf0\x12\x86\xd7\xcb\xdd\x51\x8f\x13\x57\x4f\xad\x44\xa7\xe5\x94\x8f\xfc\xc3\xfe\x39\x0a\x3e\x10\x2f\xb1\xd9\x9c\xaf\xd3\x7c\xc2\x6b\x9f\xc2\x3b\xf1\xc5\xd7\x67\xbe\xb0\xfc\xb6\x6e\x62\x8b\xf1\xe6\xcf\xf9\x77\x87\xcf\xdc\x3f\x2b\xd1\xf9\x1a\x7d\xe1\xdf\x73\xfe\x6d\xe1\x31\xff\x7a\x2f\xd5\xcf\xfd\xfb\x95\x78\x41\xea\x18\xa9\x9b\xf0\xa5\xdd\x6f\x81\x67\x27\xb6\x91\x78\xa9\x2e\xbe\xa3\xfb\xeb\xf1\xe2\xd4\x61\x78\x86\xf8\x96\xec\xe3\xfe\xb2\xe2\x5f\x05\xec\x33\xfe\xf1\xfe\xe2\xb1\x7a\xb3\x52\xed\x9b\xf4\x12\xde\xcc\x17\x9f\x06\x9c\x2f\xa7\x7e\x95\xd8\x1a\xbb\xe6\x9b\xeb\xe3\xd1\x78\x3f\x9f\xfb\x17\xaf\xfa\x4b\xa4\x84\x87\x9c\xf1\x25\xb6\x62\xad\x9e\xfd\x73\x9e\xc6\xbb\xac\xb7\x5a\x51\x0f\x43\x90\x6a\xfc\x9a\xb4\x7f\x12\xef\x4e\xfd\x72\xbc\x30\xb5\x18\x9e\xb6\xf4\xab\x0f\xe4\xa3\xa6\xe9\x12\xbf\x88\xf9\xe7\x24\xfc\x92\xe4\x99\x7e\x7f\x27\xbf\xac\xdf\xf7\x28\xb1\xb4\x64\xdd\x5f\x1e\xf4\xfb\x3b\x78\x8c\x7f\x85\x9f\x38\x02\xaf\x7b\x7a\xbc\x1d\xc6\xb4\x5f\xf3\x45\xa2\xfe\x32\x5e\x27\xb5\x39\xff\x16\xbe\xbc\x36\x1f\xa5\x17\xfe\x11\x2b\x31\x78\x3f\x6d\x5e\xe3\xf3\x16\x1e\xf3\xaf\xf3\xf9\xfc\x7b\xf2\xef\xd7\xe2\x45\x89\x7b\x96\x8f\x5f\x8b\xe7\x24\xce\xb9\x7f\xee\x87\xf1\x1a\x45\x3a\x1a\x71\xea\x88\xf9\xa8\x10\x78\xd2\x6b\xfd\x6a\x85\xf7\x1e\xed\xc2\xf7\x96\xa4\xb6\xe0\xf3\x34\xff\xae\xd6\xb3\x2f\xcc\x47\x3e\x5f\xe1\xee\xac\x83\x96\xb1\xfe\xcc\xd6\x07\xcd\x87\xfc\xc3\xd4\x63\xfe\xa1\xc5\xbf\x94\xcf\x97\xa9\x2e\xbe\xab\xfe\x32\xde\xaa\x3f\x0b\xbc\x8a\xf1\xd9\x5e\xd5\xdb\x73\xe3\xdd\xc2\xe3\xe3\x6d\x53\xcf\xe4\xf3\x11\xfe\x6d\xf0\x0a\xb6\x7e\x61\x78\xdd\x3d\xbc\x4f\x4f\xe3\x01\x15\x7b\x62\x82\x0b\x38\xde\x6a\x9d\x7c\x0f\xef\xd4\xef\x43\x5d\x6e\x69\xc4\x57\xce\xfb\xfe\x17\x0f\xc4\xd8\xd5\xb1\x83\xf5\xb1\x7b\x01\xef\x9b\x84\x31\xc7\xf3\x4e\xf3\xd1\x84\x47\xb0\xcf\xf1\xa8\xf4\x8a\x7f\x67\xe3\x3d\xf3\xcf\x47\x96\x81\xd9\xd5\x9d\xf5\x5b\xe0\xc5\x20\xc7\x81\xb8\x3e\xa9\xfe\x39\xf1\x62\x1c\xb2\xf8\x19\xe3\xf0\x9b\xe0\x41\x0d\x27\x22\xbf\xce\x7a\x6f\xf7\x4d\xfa\x5f\x92\x04\x3e\x09\x2a\x9f\x75\x7a\x9f\xc6\xec\xea\xb1\xa1\x12\x81\x8d\x8c\x0f\xd8\x4b\xf8\x0c\xa9\x8b\x3d\xc2\xa9\x7f\x6e\xe8\x7f\x9a\xf5\xa3\xb1\xd3\x77\xda\x58\x12\x38\xc8\xf1\x81\x84\x6c\x46\xb4\x53\xfd\x9b\xb8\xbe\x6e\xaf\xf5\xbf\xdc\xb2\x5f\xca\xf9\x21\xf6\x52\x3d\xb5\x53\xbd\x3b\x3b\xff\x77\xcf\x7e\x3c\x5f\x1d\xca\x92\x1c\xb1\x19\xd4\x64\x2b\x60\x83\x0e\xab\xbd\xf4\x47\xfa\xdc\xbe\x6c\xca\xee\x21\x4b\x53\x43\xac\x00\xbb\xdf\xc4\x7e\xf0\x50\x3f\x18\x07\x5d\xa9\xc7\x9e\xc8\x81\xac\x1d\x86\x10\xb9\x62\x53\x38\xe7\xf1\x2b\x9e\xf3\x9f\x5d\xfd\xc3\x4a\xce\x0e\x6e\x82\x74\x03\x39\xa9\x41\x9b\xd5\x9e\xeb\x73\xf9\xeb\xe5\xe4\x10\x27\xa9\x2d\xec\x97\x2f\xdb\x4f\xe5\xee\xe0\x3a\xc8\x12\x9b\xbe\xc3\xad\xfc\xdf\xd4\x6f\x65\x74\x88\x2f\xc6\xff\x82\xbe\xac\xcb\xfe\x21\x26\xc8\x14\xfa\xf8\x05\x7d\x91\x3f\x55\x0e\x0f\x31\x42\x96\xd8\xf4\x24\x4f\xc6\x8f\xe7\xaf\x19\x3b\x22\x3b\xb2\x75\x88\xeb\xd4\x13\x9b\xe5\xe1\xfd\xfa\xb9\xe4\xbf\x9a\xf1\xf1\x13\x37\x55\x8d\xc4\xe5\xbb\xfb\xa2\x7e\xd3\x9b\xfa\x1d\x21\xd4\x13\xf9\xd3\xc7\x42\xd4\x1f\x8e\x26\xfe\x0d\xd2\x2d\xff\xff\x07\xb8\xb6\xcf\xe3\x3f\xd5\x9f\x6a\xa4\x6e\x3a\xdb\x97\x5e\xac\x1f\x84\x91\xd0\x9f\xea\xe7\x03\xfa\x9a\xce\xf5\x9b\xfb\xfd\xeb\x3c\x7f\xea\x58\x8b\xfa\xc3\x21\x32\xf4\xd4\x45\x53\xff\x99\xd6\xf7\xcf\xd7\x5f\x9e\xf3\xfc\xa7\x06\x4d\xee\xe7\x7f\x23\x7e\x85\x5c\x1c\x62\x37\x35\x8c\xd4\x43\x46\xf7\x6c\xff\x3d\xd5\x5f\x27\xa7\x07\xec\xa7\x16\xf3\xdf\xe8\x6f\xe6\xef\xa6\xfd\x4c\xae\x0e\xb1\x85\x54\x5e\x7f\xf5\xb3\xe3\x3f\xd5\x0f\x8b\x5f\xee\x21\xd3\x48\x7d\x64\x3c\x1d\xbf\x93\xbe\x21\x7b\x87\x3c\x42\xcb\x4d\x9f\xe7\xe6\x8f\xa5\xfe\xc4\xfc\xe1\x23\x53\x4f\x3d\xac\x4f\xfd\xd3\x7f\xa8\xef\x53\x89\xe5\xaf\x23\xb2\x2f\xeb\x87\x2e\x42\xb6\xb0\x5f\xf3\xbd\xeb\xe6\xa9\xfe\xa7\x34\xe3\x40\xa0\xad\xd8\xef\x61\x85\x1d\x3d\x75\xb1\x4e\xa3\xd5\xfe\xf0\x43\xfd\x76\xec\x09\x8c\xe5\xe1\x3d\xab\xb0\x67\x20\xa6\x9f\xbe\x62\xbf\x66\xf3\x9f\xa6\x04\xef\x21\xc1\x86\xe8\x3f\xc5\x93\xf6\x4f\xf9\xdf\xb0\xff\x4f\xa7\xff\xe9\x42\xdf\xa5\xd1\x5c\x7f\xac\x7e\xde\x33\xa0\x62\x71\x3b\x87\xaa\xe7\xe7\x72\x05\xc6\xd6\x6a\xc8\x03\xf9\xf9\x1e\x38\x48\x70\x28\x56\x69\xc3\x16\xc6\xb6\x1f\xc9\x5c\x87\xa0\x50\x8a\xa1\x03\x15\x8e\x04\x46\xf6\x2c\x86\x47\x63\x91\x4b\x35\x03\xe1\x4e\x1d\x3a\x10\x63\x5b\xec\xc6\x5b\xaf\xf9\x21\x30\x88\x52\x0f\x1d\xc8\x71\xfa\xa2\x1f\x6b\x8c\x46\xc1\x43\x07\x3a\x1c\x8b\xdd\xf6\xf8\xc5\x78\xa8\x63\x9d\x7d\x38\x1e\xeb\xdc\x6a\x4a\x30\x74\xd0\xc0\x44\xec\xde\x1b\xe7\x67\x19\xdf\x4e\x67\x7d\xe4\xfc\x38\xec\xf3\x63\x8f\xf9\x21\xc6\xd5\xf9\xc2\x5b\x32\x0d\x3f\xb3\x52\xf0\x33\x34\x9b\x32\x21\x42\xf9\xb3\x38\x5c\x26\x3f\xc9\x7c\x3a\xc9\xc8\x3a\xc6\x74\x38\x3f\x93\xb8\x89\x35\x60\xdc\xcd\x67\x54\xe5\xe5\xdd\xd5\xe2\xcc\xc7\xb1\xc7\xc7\x41\x1e\x30\xed\x80\x3e\x9f\xe7\x04\xe2\xfc\xef\x86\x9c\xc5\x4f\x2d\xe1\xf5\xb9\xa8\x70\x92\xfb\xcc\x2a\x71\x96\x0b\x31\x3f\x6c\x3b\x9d\xa7\x95\xa5\x2d\x19\x09\xa7\x29\x5e\xce\xce\xca\xc9\x96\x4c\x42\x30\x26\x1f\x91\xb9\x8a\x41\x4b\x08\x5e\x64\xba\xad\xb1\x75\x98\x0e\xd3\xbb\xad\xe6\x78\x3a\xe7\xf6\x46\x29\x1f\x25\xd9\x49\xb3\x2c\x5d\xce\x11\x5f\x8d\x7f\x20\x7c\xfc\x79\x8e\x4f\x67\x03\xcd\x2d\xbf\x4d\x54\x55\x48\xe0\x98\x0b\x0f\x2e\x64\x62\x5c\x14\xf8\x24\x93\x6d\xc9\x64\xb8\xeb\x56\x32\xb7\xc7\x5f\xbc\x32\x7e\xee\xb7\xbb\x65\xcf\xc5\x6d\xbb\xca\xed\x8d\xfc\xf7\xfd\x24\x43\xf8\x59\xbe\x0d\x19\x0d\x37\x0d\x3e\x9d\xb7\xbc\x81\xb3\xd8\x1a\x56\xe3\x3f\xf3\x3b\x3b\xe3\x2e\xaf\xdf\x1b\x75\xd0\x13\xc2\xcf\x63\x41\x7f\x15\x83\x33\x7b\x1d\x1e\x06\x61\x4f\x6a\xf8\x99\xbc\x75\xdd\x55\xc7\x76\x9f\x8f\x2a\xe6\x87\xf1\xe6\xb3\x9c\x40\x5a\xea\x7c\xf1\x6b\x54\xf1\xb1\x85\x03\xa6\x04\x04\x78\x25\x27\xfb\x1b\x72\x32\x7f\xbe\xbd\x3c\x93\xb3\xb6\xe4\x2c\x4c\x43\x80\xcf\xe4\xf2\x2d\xb9\x1c\x8f\x1d\x5c\xe2\xf1\xcd\xe7\x67\xd5\xae\xe3\x06\x63\x3c\xc6\x30\x3d\x93\xab\xb6\xe4\x2a\x3c\x9a\xb0\xf9\x90\x5c\xbb\x25\xd7\xe2\x51\x83\xfd\x47\xf0\x6e\xf5\xa4\x63\x29\x3b\x78\x7d\x96\x55\x9c\xed\xfc\xe9\xf3\x97\xaf\x3f\x7d\xfe\xf2\xf9\xcb\xd7\x2f\x30\x24\xa0\x23\xa0\xfa\xc5\x03\xa5\x5c\x56\x55\x75\x3a\xbb\x8e\xde\x7c\xc5\x9c\xee\xf2\x7e\xf9\xc4\xdf\x03\xf5\xf5\x0b\x8c\x08\x50\x09\x24\xbf\x78\xa0\x52\x4c\x71\x52\x13\xe3\xf9\xd9\x88\x59\x7e\x1b\x5f\x31\x87\x61\xc0\x17\x3d\xf2\x9e\x3f\x21\x21\x84\x3f\xea\xb1\xf8\x63\xdc\xc5\x37\xce\xf0\x5f\x95\x2f\xdf\x7c\x25\xb8\x1a\xef\x5a\x3e\x60\x7d\x80\x0e\xd3\x78\xd3\xcd\xf8\x9c\x8d\xf7\x4c\xbe\x78\xf3\x95\x62\x92\xff\x69\x96\x97\x23\x82\x09\xd4\x7e\xf1\x60\xa5\x14\xe2\x60\xf6\x34\x3f\x70\xf9\xf2\x6e\xfc\x4b\x8a\x40\x44\xd1\x84\x5f\x2e\x67\x6b\x6f\xc5\xb3\xc3\x18\x9f\xe2\x59\xbf\xf9\x8a\x7d\x25\xbf\xc6\xb7\xeb\xba\xc6\xeb\xe7\xa8\x1e\xc5\xb3\x28\x8a\x93\xbc\xfb\x38\xbf\x88\xfd\x5b\xc7\xff\x01\x7f\xae\xfc\x71\xef\xca\xbb\x6d\xdb\x9e\xcb\x47\x77\xf3\x15\x9d\xe5\xab\x7e\xec\x4f\x59\x96\x0b\xbe\xac\xbf\xf9\x4a\x7b\x2f\xbf\x2d\xad\x81\x45\xeb\x29\xbf\x67\xf2\xdb\xf9\x3d\x29\xcc\xcf\x1e\x3d\xa8\x5f\x84\xd0\xf9\x78\xad\xbb\xf9\xb5\xce\xea\xfd\x77\xa8\x5f\x2c\x56\x3b\xcb\xb3\x3e\x8f\xf0\xbb\xae\xfb\xb8\x7c\x7d\xaa\xdf\x1b\xf2\xc1\x99\xff\xaf\xe2\xb7\x4b\x3d\x32\xc1\x4f\x22\xc9\xfc\x79\xa6\x8a\x60\x22\xc7\x18\x03\x97\x16\xec\xef\x52\xfe\x76\xfd\x72\xf1\x29\xbf\xea\x9b\x2f\x47\x77\xe3\x19\x9d\xf1\xdf\x3e\xd5\xfb\x36\xbe\xdc\xb1\xf9\x9f\x76\x2b\xfc\x6b\xbe\xad\xf1\x5b\x5a\x02\x87\x96\x42\x9e\xaf\x73\xd4\xbb\xfe\xa8\x84\x90\x93\x3f\x06\x7f\xe6\xec\x1e\x7e\x45\x7b\xa0\xd1\x7e\xf2\x87\xc9\x37\x77\xe5\x1b\xf1\xe4\xcf\x24\xef\xbc\xf9\x8a\x7e\xb7\x7e\xf5\xb5\xff\x50\x3c\x87\x79\xcf\x7f\x7c\xc9\x67\x25\xbc\x57\xbf\x21\x5b\x66\xd0\x70\xee\xcf\x4c\x3e\xbe\x9b\xdf\x98\xfa\x20\xa3\xbe\xf0\x47\xf2\xde\x7c\xf1\x5d\xb7\x1f\x26\xfe\x7c\x99\xf8\x03\x6a\x02\x6a\xd2\x61\xcc\x9a\x39\xfb\x5b\x9e\x2b\x93\xed\x2b\x7c\x8f\x00\x89\x40\xe6\x7f\x26\xdb\x63\x0e\xbd\x31\x5f\xe1\x87\x57\xf2\x31\xe1\xf0\xcc\x0a\x0c\xf9\x93\x0f\xc9\x49\x1e\x6c\xf2\xa7\x15\xf1\xa9\x40\xb7\x9e\xdf\x39\x7e\x7e\x17\x3f\xa7\x36\x7f\x05\xe8\x49\x1e\xdd\x95\x47\x57\xf1\xc9\xee\xca\x67\x6c\x3d\x48\x9d\x8f\xcb\xcb\xd7\xf9\xf5\x08\x21\xd0\xfc\xc5\x83\x99\x1c\x8e\x09\x4c\xc6\x64\xca\x2f\x97\xbf\xc6\x5f\xc7\x3f\x1b\x1d\x58\x8e\x0c\x1f\x4a\xc9\xea\x3c\xd0\x74\x37\xe8\xf3\x0f\x9f\x77\x3f\xfe\x20\xce\xc5\x11\xa8\x1f\x4c\x0d\x5a\xfc\x2d\x0f\x5d\xcd\x0f\x28\xf2\x6b\xf3\x64\x75\x2e\x64\xbe\x8b\x74\xd2\xf3\x09\x44\x07\x53\x03\xc5\x3e\x3a\x44\xd0\xa5\x9d\x89\xdc\xd4\x10\x7a\xf5\xc5\xf9\xc4\xd9\x5e\x8f\xf1\xb1\x24\xd0\x3c\xe8\xc2\x5e\x00\x3a\x62\xa4\x3e\x32\x27\x7b\xcf\xfb\x59\x14\x7c\x7b\xe7\x09\x3f\xd7\x7a\x11\x0c\x68\xc5\xef\x0c\x3e\xa5\xa7\x1d\xac\x59\xcf\xa6\x1d\xdf\x90\x7f\x55\x2f\xa6\xf5\x34\xc0\x4d\xbd\x1b\xe3\x8b\x40\x5f\xf1\xa7\x08\x1e\x8f\x6f\xd4\x30\x68\x99\x5e\xc4\xed\xd5\x34\x9e\x14\x9f\xc8\x5f\x7a\xb0\xe6\xfc\x75\xd4\x37\x91\x27\xc6\x77\xf5\x0c\xc8\xa5\x9f\xc6\xc1\xd0\xa1\xbd\x8f\x0e\x0d\x48\x4b\xbe\xcf\xb8\xfd\x8c\xc4\x99\x5e\xc0\xf8\x62\xe8\xa0\xda\x47\x47\x0d\xe4\x9d\x89\x1c\xa4\x2d\x7a\xb7\xf9\x52\x64\x8c\x2f\x3a\x8b\xcb\x51\x03\x3e\x5a\xe5\x7d\x75\xee\xe6\x7e\x3c\x4b\x10\xe4\x2b\x5e\x2f\xef\x5b\x79\xa0\x77\x34\x40\xde\xaf\xed\xa5\x4f\xea\xe9\x20\x6b\x0c\x6c\xb3\x70\x6e\xeb\x6d\xf3\xf3\xa8\x43\x95\xb6\x93\xa3\xaf\xd9\xf3\x90\x89\x96\x3a\x5a\xde\x53\xb3\xc9\x17\x02\x9a\x89\x2f\x47\x13\xea\xb4\x31\x50\x80\xac\x87\x7a\x2c\x7f\x29\xab\xf7\x92\xeb\x59\x34\x33\x53\x7f\xf6\xf3\xf2\xfc\xf3\xad\x3c\x64\x00\x15\xeb\x3c\x84\x4f\xf2\x73\x00\xe5\x37\x69\xe1\x67\x72\xf9\xec\xcf\xa5\xbd\xa5\xbf\x74\xc0\x4f\xf9\x7d\x94\xa9\x8e\x2e\x9f\xa9\xb9\xed\xa7\x57\xac\xea\xef\xda\xde\x8d\xfe\xd2\x81\x96\x36\x53\x41\xbc\xa6\x57\x7e\x93\xf8\x0d\x57\xa1\x17\x3c\xa9\xd7\x83\x61\xdd\x5f\xae\xf5\x6e\x8c\xaf\x07\xfe\x19\x5f\xee\xd8\x3b\xeb\x2f\x3d\x8c\x68\xba\xe2\xcb\x3d\x3f\x03\x02\x13\x96\xbf\x92\xeb\x85\x34\xb1\x50\x30\xf7\xdd\x27\xeb\xf6\x3d\x87\x4e\x67\xa4\xc1\xd2\x07\xaf\xf4\xb6\xf9\xf2\x9e\xc3\x9c\x56\x16\xf2\x4f\xf6\xb6\xfb\x0b\x3f\x2f\x7f\xe2\xcb\x7b\x0e\x2d\x64\xa2\x3b\xf6\x3e\x6f\xf6\xf9\xf7\x1c\xf4\xdd\x5d\xbd\xed\xfc\xbd\xe7\xb0\xa2\x99\x25\x14\x9f\xd0\x3b\xd9\x83\x84\xb6\xe6\x47\xf4\x06\x9a\x4d\x89\x7f\x2d\x0f\x6e\x67\x22\x3f\xb5\x1e\x8f\x6f\x54\x59\x7f\xb1\x34\x18\x32\x3d\xd9\xa3\x9e\xb9\xf0\xe5\xae\x9f\x2b\xbe\x70\x3d\xf7\xc4\x97\xcb\x73\xfd\x32\x53\xfa\xf4\xd3\x27\xa6\x97\x1c\x6c\x1d\x9a\x19\x7f\x18\xc0\xc1\x09\xb6\x41\x40\xa7\x67\x63\x1e\xea\x81\xe9\x21\x89\x04\x27\xd8\x02\x84\x1f\x27\x9e\xf4\x2e\x9f\x71\x11\x7a\x1d\xd3\xb3\x16\x7b\x16\x8e\xb0\x05\x42\x9a\xdd\xb7\xf7\xf9\xd2\x4f\x9d\xfb\xa9\x0e\xaf\x8f\xad\xa4\xde\x93\x63\x3b\xd3\x83\xf6\xd8\xdc\xd0\xbb\x9c\x1b\x6a\xa6\x1b\xf1\x67\x24\x02\x9a\x5b\x38\xc1\xce\x73\xf6\x22\xcc\xed\x05\x4c\x03\xba\x63\xf5\x84\x3d\x91\x73\x96\x07\xa6\xaa\x84\x63\xc1\xbc\xe5\x5c\x89\xa6\xb5\xe0\x7c\x82\xe9\x27\x7e\x6b\xe8\xfb\x13\x47\x95\x94\x14\x84\x14\xfc\xc1\xdd\xf4\x68\x31\x0c\x7f\x24\x30\x3e\x38\x20\xa7\x84\xad\x4b\x52\x2f\x15\xf5\x18\x4d\xf7\xbf\x37\xb0\x3e\x9d\x63\xb9\x04\x54\x47\x4f\x07\xc1\xde\xa7\x36\x68\x0f\x31\xd4\xa8\x03\x7a\xd6\x9b\xdd\x69\x6d\x74\x1b\x6b\xf2\xab\xc6\x09\xc6\x09\x1e\x03\x02\xca\xa3\xa4\x83\x62\x1f\x8c\x35\x74\x0e\x31\xc8\x68\x06\xfc\xec\xb4\x9e\x88\x5f\x1b\xa3\x2d\xb0\x08\xe4\xeb\x5f\x9a\x00\xd2\x9c\xe6\xa8\xf9\x8c\xca\xe3\x31\xae\xb0\xa8\x04\xb5\x43\x04\x3a\x1a\x82\x9a\xad\x3b\x5c\x51\x6f\x77\xc6\x78\x1b\x6b\xcc\x60\x78\x88\x41\x4a\x2b\x50\xd1\x96\x3f\x69\xf6\x61\x2c\xaa\x42\xf5\x10\x33\xbf\xa0\x44\x6b\x1d\xd9\xa9\xf1\x60\x8c\x53\xbc\xf2\x2c\x25\x24\xcd\xc6\x84\x00\x72\x34\xce\xc7\x18\x81\xb4\x5a\xc7\xfe\x51\xbc\x66\x2c\xcc\xfc\x32\x74\x50\xaf\xe3\x05\x7d\x9a\x6a\xa7\x31\x3e\x1b\x7b\x95\x40\x8d\xf1\x4b\xdf\x07\xd4\x02\xed\x21\x82\x3a\xb5\x61\x40\xb1\x21\x16\xc3\x50\x8a\xa6\xb5\xf7\x53\x9c\x48\x8e\xb6\xe0\x7d\x0f\xcd\x43\xc3\x2f\xd1\xe3\xfc\x34\xc6\x68\x5a\xe7\x3e\xc6\xba\xe0\xfd\xd1\x00\x21\xc5\x20\x2d\x4d\xec\x2d\x6b\xfb\xf8\x79\xde\x17\x47\x55\x70\xa2\x81\xf6\x51\x05\x26\x6d\x00\xaa\x0c\x71\xf9\xb4\x3a\x4f\xf7\x3a\xef\x4b\x60\xd3\x0a\x04\x85\x7e\xca\xe3\xd3\x63\xbc\xe0\xd7\xd1\x00\x0e\x2d\x41\x36\x53\xf5\x37\xc0\x42\xd5\x53\x58\xf7\x79\x2f\xb0\xa0\xc4\xd6\x91\x33\xbf\x1e\xfa\xb5\xc5\x7b\x6b\xc9\x63\x98\xeb\xab\xd8\xe3\xe7\x79\x9f\x1c\x4d\xc1\x7b\x86\x65\x82\x80\x12\xa8\xb2\x7a\x9c\xd6\xb7\x8f\xb1\x56\xbc\x57\x8f\xfe\xc2\xfb\x09\x4b\xa7\xb9\x81\xec\x99\xf7\xda\x07\xfa\x7d\x06\xa3\x03\x01\x3e\x2d\x41\xda\xe8\xcb\x3a\xff\x4e\x0d\x3d\xe8\xf7\x0d\xc8\x69\xc4\xd7\xe2\xf3\xb5\xcd\xfc\xec\xc9\x6b\xfd\xbe\x81\xf6\xa1\x01\x3e\xad\x80\x45\xf8\x39\x96\xb3\x67\x91\x5f\xe7\x3d\xe2\x79\xf4\xb3\xf5\xb5\xf6\x4d\xbf\xee\xf0\x8b\xf5\x9c\x1a\x14\x34\x00\x15\xed\x4e\xfd\xeb\xe9\x78\xad\xfd\x3a\x8d\x31\xa7\x83\x8e\xac\xf4\x11\xd6\x9d\x1a\x62\x7d\xb5\x01\x09\x25\xa0\x62\x50\xcb\xbe\xc0\xa3\xd8\xaf\x78\x8f\x19\x57\xe7\x31\x0e\x00\xd1\x08\xf8\xd5\x9a\xf7\x8f\xe2\xb5\xe2\x7d\xc4\xfc\xaa\xd7\xf1\x82\x2e\x4d\x57\xbc\x7f\x36\xf6\x2a\x01\xc3\x31\x3c\xf5\x7b\x81\xe5\x53\xb4\xf0\x3e\x9e\xd6\xc4\xb7\xc7\x88\x48\x4e\x48\x4e\x46\xb2\xc4\xcb\x1f\x5d\x58\xbf\xe7\xa0\xa3\x1e\xd4\xfa\x15\x27\x80\xff\xc0\xaf\x19\xcb\x61\x3d\x3a\xd4\x81\xbf\xf7\xc7\x06\x3a\xef\x1d\xb4\x29\xbb\xa6\x2f\x4f\x7b\x40\xb7\xb1\x26\xbf\x0a\x82\x11\xc2\x64\x8c\x09\xc8\x8e\xba\xf0\x6b\xc1\x02\x38\x5d\xcf\xb5\xd6\x07\xc6\xe8\xc0\xe6\xbd\x04\x0d\x8d\x40\xdd\x1a\x98\x2f\x01\xee\x63\x7d\xba\x8d\x95\xc1\xe8\xbd\x84\x36\xd5\xa0\xc7\xd6\x26\xce\x3c\xc6\xdf\x0e\x2b\x7a\x05\x2b\x60\xbd\xb0\x9c\xe2\x55\xc2\x70\x6c\x61\x48\x3b\x1d\x5b\xdb\x7e\x71\x1c\x86\xb8\x5b\x5d\x9f\x21\x42\xd0\xd1\x5b\x62\x1f\x09\x1c\xa5\x1d\x9b\x72\xa1\xfd\x3d\xac\x1f\x56\xeb\x70\x8e\x15\x12\x80\x18\x56\xbd\xc6\xb2\x69\x7c\xe2\xd7\xf3\x63\x94\x08\x94\xd8\x18\x8d\xf5\x18\x65\x8d\xda\xcb\x35\x79\xf4\xed\x11\x57\x31\xc9\x08\xc9\x08\xab\x47\xff\x18\xb0\x78\xb9\xa3\x24\x9b\xec\xba\x64\x54\x65\x8d\x56\x26\x0e\xb0\xf9\x1c\xd6\x19\xef\x03\xd6\xef\xd7\x58\x01\x8d\x2c\x1c\xe0\x27\xfd\x6a\x70\x8c\x71\x8c\x47\x9f\x80\x9c\xad\x73\xce\xfc\x82\x2d\x2d\x4c\xe2\x3f\xf4\xeb\xba\x17\x5e\x8f\x11\xa2\x61\x82\x7a\x69\x8c\x64\x33\x5e\x1e\x75\x9f\xf1\xeb\xba\xdf\x6f\x60\x05\xd4\xfe\xcd\xb0\xea\xb1\x7a\x01\x6b\xee\xd1\x84\x80\x98\xad\x73\xda\x0b\x4e\xa4\x1f\xc0\xe2\xeb\x1c\x43\x07\xcd\x19\x56\x37\xe6\x2f\x60\x9d\x78\x0f\x06\x36\x46\xe3\x62\x8c\x85\x4d\x7c\x3c\xdd\x3b\xc8\xdf\xf2\xd5\x39\x54\x7e\x4a\x69\xb5\xef\x02\x2c\x5a\x9f\xed\xd9\x8c\x2d\x1e\x87\xd5\x6d\x19\xb1\xaf\xbf\x85\xf1\xe9\x1c\x63\xb5\x1f\x36\x36\x98\x5a\xab\x5b\x34\x1c\xa3\x58\x61\xf0\xd3\x39\x3f\x7d\x9a\xfb\xcb\x5b\x4e\x1b\x8c\x8f\xe6\xec\x85\x22\x61\xea\x29\xc5\x88\xdc\xe9\x6e\xcd\x47\xc6\x81\xf8\xcb\xc4\x96\xdb\x36\x4f\x8f\x63\x8d\xc1\xc7\x71\xba\x85\xf3\x71\x8c\xd3\xed\x9c\x8f\x63\x9c\x6e\xed\xdc\xc6\xb8\x13\x0f\x86\xb1\xba\xcd\xf3\xac\x1f\xa3\x86\xc5\xfe\x5a\x34\xfb\x71\xba\xe5\xf3\x71\x6e\x9c\x6e\xff\x88\x35\xdc\xd3\x63\xe1\xf7\x81\xc6\x01\xd3\x78\x75\x2b\x48\xdc\xd3\x79\x02\x43\xec\xf9\xf1\x7b\x42\x0c\x23\x5f\xdd\x16\x7a\x88\xd1\x63\x76\x61\xc9\xef\x0f\x71\x3f\xac\x19\xc3\xc7\xc6\x69\xfe\x4b\xa0\xf1\x3a\x4f\xab\xd5\xed\x22\x71\xbf\xe8\x45\x8c\x01\xd3\x12\xe4\xfd\x2a\x1e\x09\x4c\x5f\xc7\x28\x56\xb7\x91\x6e\x63\xdc\xe1\x29\xc3\x58\xdd\x52\xfa\xb8\x1f\xa7\xdb\x4b\xe2\x3e\xd1\x33\x3c\x25\xa0\x9e\x79\x3a\x60\x5a\x41\x9d\xd6\x7a\xba\xba\x47\xf5\xc4\x58\x56\x7b\xc2\x02\xe3\x74\xdb\x49\xdc\x77\x7a\xbd\xe6\xc2\xd5\x2d\x28\x71\x0f\xea\xf5\x7a\x29\x56\xb7\xa3\x26\x8e\x65\xf7\xfc\x30\x69\xc3\xfd\xb0\xa6\xfb\x98\x8c\x63\x05\xc0\x89\xb9\xee\xe9\xfd\xeb\x3c\xcd\x57\xb7\xa9\xc4\xfd\xa6\xd7\xfb\x58\xb6\xba\x65\xf5\x71\x8c\xd3\xed\x2b\x71\x5f\xe8\x75\x8c\x7c\x75\x2b\xeb\x36\xc6\xfd\xdc\xe6\xab\xdb\x5a\xcf\xfa\x71\xd9\x4f\xf3\xd5\x2d\xae\xa7\xc7\xb2\xe6\x29\xc7\x38\xdd\xee\x12\xf7\x3d\x5e\x1c\x4b\x88\xc7\x76\x75\xeb\xeb\x36\xc6\x1d\x9e\xc6\x78\xac\x57\xb7\xc1\x3e\xe4\x47\x44\xc6\x76\x75\x4b\xec\x43\x18\x36\xa6\xda\xea\xf6\xd8\xd3\x63\xb9\x8a\xc7\xe9\x56\xd9\xc7\x31\x4e\xb7\xcd\x3e\x8e\x71\xba\x85\xf6\xf1\xdc\x9e\x6e\xa7\x3d\xeb\xc7\xfa\xbe\x1a\xc7\x58\xdd\x5a\x7b\x7a\x2c\xab\xfb\x2d\x33\x86\x6b\xe1\x80\x18\xf3\xbd\x9a\x67\xe3\x61\x8b\xf3\x18\x25\x3e\x96\x72\x40\x89\x4d\x62\x6c\xbf\x80\xb1\xf2\xe3\x38\xe0\x63\x2a\x57\x34\x9e\x6e\xfd\xfc\xa1\x7e\x5c\x62\xc0\xe6\x9b\x64\xe3\x18\xfd\x1a\x0c\x39\xa3\x81\x8d\x93\x97\xfc\xa8\x32\x81\x61\xce\x18\x25\x75\x7f\x2d\x86\x62\x8c\xdd\xab\x18\x1b\x31\xcd\x5e\xc4\x10\xfd\x54\xdc\x43\x14\x7e\x84\x63\x35\xdd\x46\xfc\x10\x3f\x26\x8c\xf9\xd6\xe0\xf4\xbc\x80\x27\x37\xd3\x73\x05\x5f\xbf\x7c\xfd\xe9\xf3\x9b\xf7\x8b\x2f\xab\x04\x0e\x18\xb7\xed\x7c\x66\xd8\x53\xcc\x4b\x19\x58\x10\xd9\xc2\x78\x10\xef\x4c\x86\xd1\x9b\x27\xd7\x1b\x38\xb2\x8a\x71\x55\xcd\xcf\xe7\x78\xcb\x73\x3e\x67\xb6\x4a\x8c\x8b\xe2\x64\xcb\x5e\x64\x3e\xfd\xf4\x69\xc6\xb1\x30\x06\xea\xe9\x79\xaf\x57\xe4\xa2\x5b\x72\xce\xf2\x1c\x0b\x4c\xdf\xbc\xe9\xd9\xb0\xe9\x0c\xa9\xdc\x13\x58\xfe\xe2\xcb\xae\x3c\x34\xcb\xd9\x7e\x4f\x29\xa7\xaf\x91\x70\x19\x45\x25\x30\xfb\xc5\x97\x03\xa5\xa4\xab\x33\xd9\xd5\x9b\xa7\x48\x5b\xb1\xf0\x11\xca\x32\x21\xd3\xbc\x79\x8a\xb7\x15\xd3\xe8\x14\xf7\xfa\xcd\x93\xfb\x2d\x9c\x40\x9c\xa8\x17\xe7\xef\x6f\xc4\xb4\x41\xfc\xa3\x23\xb3\x3f\x57\xf9\xe3\x38\xa7\xdc\x30\x7f\xdc\x2d\x99\x08\xe3\xa6\x39\xc9\x6c\xc6\x32\xc2\x98\xbf\xcc\x5b\x3a\xc9\xe9\x37\xb0\xa6\xf1\xcb\xfa\x9b\xa7\x74\x57\x58\x01\x91\x73\x8c\x81\x4d\xab\xd3\x79\xfb\x0d\x39\x98\x67\x17\x72\x3c\x7f\xd5\x96\x4d\x63\xb1\xc9\xe2\xa9\x38\x5b\x31\x0f\x4f\x63\x4c\x6e\xe1\xe8\x18\xe7\xf9\xfc\x8c\xd5\x8d\x98\x57\x27\x99\xf2\x56\xcc\x7d\x8c\xeb\x7a\x3e\x9b\xbe\xe6\xf0\x4a\xc6\x39\xd5\x15\xc3\x89\xb7\x62\xee\x63\xcc\x3f\x98\xb0\x9c\x73\xf7\xe4\xf6\x06\xd6\xcc\x83\xf6\x1e\x7f\x8b\xf5\x19\xf8\x59\xee\x22\xe6\xd3\xe9\xf7\xd3\x7b\xe7\x6f\xc4\x01\x9f\x38\x6c\x2f\x75\x75\x8e\x05\x6b\xcc\xaf\x3a\x67\x2c\xf5\x16\x16\x59\x72\x03\xaa\x37\x4f\xde\xe2\x15\x0c\x4e\xfd\x43\x7b\xf3\xe4\x6b\x5e\xb1\x71\x9e\xd7\xbb\x71\xd6\xf7\x56\x72\xc5\x79\x5c\x99\x5c\xb2\x65\xb3\x38\xd5\x4e\xf0\xe6\x29\xe1\x06\x97\x59\x0f\x15\x27\xbd\x97\x58\x5c\xe7\x72\x8e\x45\x46\x7d\x69\xf9\xd6\x88\x07\x53\x26\xf7\xc3\xb9\x6f\x1d\xc6\x80\xd0\x60\x91\x89\x6e\xc8\xa4\x34\x9e\x65\x40\x7f\x43\x86\xb5\xc8\x19\xa7\xdb\x96\x81\x12\x5d\xfc\x11\xcf\x70\x6e\xc8\x38\xe2\x1d\xef\x1c\xa7\xb8\x61\xab\xa6\xd6\x82\x93\x5c\xc9\x58\x1c\x07\x8f\xe1\x22\x73\x35\x2e\x98\x73\x99\x74\x8c\x25\x28\xe7\xcb\x3b\xc4\xfe\xd7\x72\x0e\xe6\xfb\xaf\xdf\x7f\xfd\x89\xfd\xf1\xe7\x9c\x4b\x42\xfa\xbe\xef\xc5\x3b\xc3\x8e\x46\x85\x5d\x24\x41\x39\xd8\xd4\xfb\x22\xfe\xc3\xf5\x32\x42\x68\xc3\xef\xb1\x9b\x93\x6e\xd0\xe2\x1c\x49\x50\x91\xa0\x36\x9d\x63\x9a\x75\x3f\x9d\x8c\xf2\xf7\x7e\xf4\x84\x34\x4d\xc3\xd4\xe0\x00\x9c\xa3\x31\xa0\x54\xbc\xd3\x56\x8e\x1f\xda\x2d\x31\xbe\xb0\x6b\x84\x38\xc6\xb7\x74\x3f\x5d\xfa\xcc\x9f\xb7\x00\xda\xa4\xab\x03\x1f\x25\xe2\xdd\xcb\x72\x74\xcb\xf6\xa7\x59\x9f\x5c\xe9\x07\x05\x9e\x9e\x83\x85\xb2\xf6\xd0\x3e\x62\x18\x20\x60\x7f\xb3\x3e\x70\x99\xf3\x5c\xbf\xda\xd4\x5f\xe7\xaa\x39\xcf\x15\x08\x51\x34\xc5\x6d\x3b\xcf\x6b\xdb\x0d\x21\xe2\x59\x2e\xa0\x4e\xfa\x76\x8b\x13\x7c\xcb\xef\xab\x5c\xa7\x20\x5e\xeb\x16\xb8\xc5\xdc\x6e\xf4\x2c\xbf\x8e\x92\xdc\x1c\xcd\x56\xf0\x2b\x5a\xbe\x6f\x7a\x2f\x57\xfc\x59\x1d\xa0\xef\xa3\xa3\x2d\x93\x63\x00\xd4\xe9\xd9\x38\xc6\xb1\xec\x49\x8e\x1d\x6d\x98\x02\xfd\x18\xa4\xb8\x9e\xe2\x4c\x96\xf3\xbf\x37\x39\x46\x88\x78\xce\x03\x48\xfb\xe8\x30\xc8\xed\xd1\xf0\x30\x22\x12\x94\xd1\xa6\xdf\xeb\xf1\x66\xfc\xeb\x24\xc3\xe2\xb3\x81\xe7\x1c\x85\x5b\xba\x57\x71\xe6\xcf\xf7\x00\x63\xd6\x2f\x45\x9c\xf5\x87\xf1\x62\xdc\xca\x80\xcf\xfe\x16\xdb\x2e\x8e\xd1\xcc\xad\x47\x7e\x2f\xdc\x9a\x74\xd9\x35\xaf\xd0\x2d\x36\xfd\x66\xba\x2b\x6e\xf5\xbd\x88\x96\xd0\x4e\xf0\x80\xa6\x9a\xb8\x35\xe6\x55\xbc\x18\xb7\x4e\x11\x2b\x45\xa2\x18\xb7\xdc\xa7\x7b\x17\x7f\x3f\x61\xc9\xbf\xe3\x28\xfb\xcb\xf9\xe0\x5b\xb1\xca\xc5\x1b\xe6\xd8\xdf\xf4\xae\x5d\x0b\xe8\x28\x5f\xb8\x75\xc9\x8f\x35\xb7\x7a\x84\x68\xc7\xbf\xf8\xc2\xa8\x01\x2b\xa0\x1f\xed\x7c\xc5\xad\x2d\x9f\x6f\x73\x8b\xfb\xbd\x70\xeb\x52\xf7\xeb\x29\x49\x2b\x6e\x31\x35\x59\xef\x8e\x06\x08\x56\xdc\x7a\x66\xcc\xa7\xbe\x29\xc6\xac\xe2\x4e\xf8\x0d\xbb\x87\xfa\x8c\x5f\x31\x9b\x2d\x41\xba\xe8\xc7\x24\x5a\x7a\xd7\x96\xfe\x76\xef\x12\xba\xc1\xc2\x2f\xb2\xa5\x7b\xd5\xbb\x3a\xa0\x4f\x31\xe3\xfa\x39\x1e\x58\x5d\x58\x0f\x75\x33\x51\x17\x6b\xdd\xa9\xa6\x72\xb0\x91\xab\x4f\x9b\xfc\x7a\x6f\x76\xd2\x81\xcd\x15\xd3\x37\x1f\x65\x1f\x3c\x33\xd7\xf0\x67\x55\x81\xb5\x8f\xde\xc9\xce\x3e\xe8\xa0\x99\x79\xa2\x48\xc0\xba\xe8\x5f\x93\x6d\xf6\xb7\xea\x5f\xcd\x3e\x7a\x2f\x77\xfa\xc1\x04\x11\x16\x2f\xd3\x60\x7e\x5b\x77\xf8\x79\xf2\x9b\xa9\xca\x12\xd4\x0f\x66\x83\x8b\xc9\x6f\x74\xa5\x7b\xb3\x7f\x71\xbb\x2e\x68\x70\xb6\x8c\x79\x4b\xf7\xf6\x98\x99\xbe\x05\x32\x96\x28\xce\xb1\xfe\xa1\x3e\xe3\x18\x7f\x1e\x0f\x24\xf3\xb8\xa1\x85\xf3\xc9\x7e\xb7\x9c\xe3\xbe\xc3\xb1\xba\xae\xeb\x7d\xf4\x9e\xef\xcc\x83\x03\x86\x65\x7e\xcc\x36\x75\xd7\x73\x7b\x23\xe6\x76\xc1\x93\x49\xdf\x9f\x26\x77\x28\x5b\xb7\x7c\xff\x74\xc1\x33\x31\x47\x4e\x39\x3b\xe9\x17\xcb\x79\xe4\x75\xce\x3e\x9d\xe7\xac\xeb\x3a\x7e\x20\x39\x85\xe1\x2f\x31\xf4\xc5\x83\xc2\x50\xf6\xaf\x74\xb7\x6c\x2f\x71\x9f\xde\xa5\x98\x62\x60\x63\xc1\xb5\x9b\xb6\x3f\x4d\xb6\x87\x69\xae\x1c\xba\x9d\x01\xea\x5f\x62\xa8\x62\xc0\x56\x45\x50\xae\x9f\xf1\x9b\x87\x7c\xe8\x14\x1f\xe2\x5f\x62\xd0\x88\xa6\x02\xe5\x64\x5b\x57\x24\x7c\xf1\x9b\xaf\x49\xb8\xe9\x10\xa4\xbf\xc4\xb0\x9b\x7b\xd2\xc6\xb8\x3f\x9d\x06\x7e\x3e\x6e\xae\xef\x03\xbc\x1e\x37\x6c\x6f\xc5\xed\x8c\x6f\x11\x3f\xb3\x85\xe6\xb8\xc9\x3a\xae\x26\xfb\x37\x72\xb6\xb2\xdf\xcc\xbd\x7c\x15\xba\x74\xa9\x53\xf2\x8c\xbe\xe8\x6b\x2b\x7d\x6f\xf6\x5f\xb6\x9e\xca\x3b\xe3\x1c\xef\xe9\x53\xde\x67\x7d\xa0\x10\x38\x9f\x9b\x91\xae\x67\x21\x7e\x72\xd4\xd9\x47\x87\xb2\x11\x0b\x50\xa0\x38\xcb\x59\x48\xe9\x2a\x52\x01\xe0\x7f\x6c\xf5\x07\x32\xb6\x6c\x94\x80\x12\xdf\x91\xc7\xe2\x04\x28\x97\x0f\x11\x41\xdc\x9f\xe5\xbc\xf2\x3d\x7f\xa2\x4a\x34\xab\xd7\xfd\xf1\xef\xc8\x9f\x66\x2e\x02\x22\xde\x91\xc0\xb2\x66\xde\x90\x1f\x6b\x68\xb1\x3f\x7e\x89\x22\xe1\x88\xe3\x17\x77\xf0\x57\x57\x24\xa0\x40\x09\x1f\x6f\x70\x47\x7e\xe9\x72\x07\x02\x4c\xd4\x73\x79\xe9\x8e\xbc\x01\x5a\xc1\xd2\x03\x01\x1a\x9f\x45\x58\x7e\xd3\xc7\xf1\x3c\xea\xa5\xf8\x00\x32\x50\xdc\xe9\x39\xc9\x2d\x7c\xfe\x18\x37\xc0\xfc\x59\x47\x13\x13\x8e\x9f\x40\x72\x13\x7f\xb9\x8a\x61\x33\x71\x31\xf3\xcd\x7d\x22\xbf\x4d\x8a\x91\x90\x4f\x97\x73\xbc\xd7\xfe\x9c\x56\xb2\x26\xb0\xa6\x78\xfa\xe7\xf2\x5f\x37\xf3\x7b\x34\x2b\xd1\x40\x58\x7e\xc9\xe3\xfc\x1e\x2d\x10\x89\xf7\x8b\x28\xf3\x3a\xf7\x6e\x7e\x8f\xf6\xe2\x4f\x70\x27\x3e\x4b\x7e\x8f\x16\xbf\x52\x12\xf9\xbd\x2d\xbf\xe4\xf7\x68\x91\x59\x1e\xdd\x89\x67\x0e\x3c\xf6\xc7\xe2\x59\x72\x7a\xf2\xfc\xc6\x4f\xe4\x57\x05\x26\x9f\xd1\x59\x7e\xe3\x27\xf2\xab\x36\x2f\xe6\x37\x12\x0b\x06\xd6\x1f\x6e\xfb\xb3\xf4\x87\xa3\x0a\xac\x29\xfe\xc1\x1d\xf9\x53\x3c\xd5\x69\xd5\xca\xf2\x7b\x53\x7e\x95\x5f\x15\xa4\x13\x9f\xb3\x3b\xf8\xcb\xd5\xc0\x51\x05\xee\xd2\x4f\x92\xcb\xf1\x7e\xba\xe6\x9b\x56\x88\x86\xcf\xf2\x7b\x5b\xfe\x94\x5f\x8d\x60\xfe\x06\x2a\xa0\x24\xc0\xba\xe9\xcf\x12\xff\xf7\x12\xa4\x48\xc4\xc7\x02\xe6\x4d\x79\x0f\xe4\xec\x6f\x1f\xbd\x17\xd0\xc4\x25\xe7\x67\x0c\xae\xfa\xc9\xa7\xab\xf8\xbf\x13\x50\xf3\x01\x30\xfc\xdb\xfe\x9c\xf0\x4b\x68\xe0\x52\xc4\xf3\x1a\xff\x3a\x9e\xef\x04\x3a\x53\xfc\xfd\x6b\xfc\xb3\x78\xce\xe3\xc5\x18\x98\x58\x02\xf2\x70\x47\x5e\xe7\x4f\xd6\x20\x2e\x1f\x62\x60\x31\xff\x4f\xe7\xe5\xae\xfd\x41\xe2\x45\x12\xfc\x51\xb1\x86\xaf\x28\x81\x62\xaf\xe4\x2f\x67\x66\xfe\x16\x06\x05\x81\x76\xe8\x60\x8f\x81\x81\x58\x3c\xef\xc8\xf3\x78\x4e\xf2\x05\x06\x3e\x93\x27\x77\xe4\x79\xbd\xb0\xab\xf2\xa1\x83\x36\x11\xf1\xf7\xee\xc8\xf3\x55\x8a\x52\x03\x32\x74\xb2\x89\x81\x81\x5f\xf7\x5f\xce\x37\xe4\xa7\x95\x98\xa8\x17\xa5\x03\xe9\xd0\xc9\xb1\xa8\x2f\x25\xb9\x83\xcf\xf9\xa9\x14\xa0\x18\x3a\xd9\x9a\xf8\xe3\xde\x91\x67\xfd\x07\x2b\x18\x34\x43\x07\x33\x0c\x42\x9e\xdf\x3b\xf2\x3c\xbf\x8a\x07\x8d\xa1\x83\x31\x06\x1e\xbb\x5e\x4b\x2f\xbf\xf5\x38\x67\x99\x6b\x14\x62\xfd\xbe\x8f\x0e\x58\x71\x8e\x06\x70\xb1\xb8\xb6\xdc\xd2\x59\x5d\xeb\xb0\x25\x37\xd7\x08\xc4\xb2\xe9\x6c\xff\xf2\x52\x67\xb9\x2e\x5b\x76\xe0\xe6\x6b\xa3\x4d\xdf\xbe\xde\xf0\x6d\xc0\xd3\x5e\xe7\xbd\xf1\x64\x17\xe3\xe9\xb1\xb8\xce\x7f\xa4\xc3\xf7\x8e\xb8\x8e\xcf\xbd\x83\xb0\x7d\xa8\xe3\x83\x6c\xd1\x69\xc5\xba\x7f\xf5\xed\x89\xeb\xb8\x35\x53\xdc\x44\x0c\xe6\xbd\x8f\xfe\x6e\xac\x1b\x42\xaa\x6a\xb1\x32\x5f\x47\x3b\x0f\x7d\x2b\x80\x7b\xa6\xc5\xe2\x76\xfd\xbe\x80\x93\x4e\x29\x66\x6b\xb6\x12\x90\xf3\xa3\xc7\x7b\x2d\x94\xf1\xb2\x0f\x75\x83\x07\xab\x9d\xaf\x13\x0f\xb2\x0b\x1e\x4c\xd7\x3e\x0b\x0f\xf8\xee\xa2\x01\x92\x63\x00\xd2\xe9\x9a\x67\xe3\x9d\x0b\x27\x1e\x94\xe2\xcb\xb9\x6c\x55\x26\x97\x47\xa7\xc1\xd3\xbe\xf3\x96\x6f\xeb\x7d\x9b\xd5\x7e\x20\x20\xf8\x7c\x2f\xf1\x96\xce\xb4\x5a\xe1\x3a\x9c\x07\xab\xbd\xb8\x5b\x3a\x62\x86\x15\x3a\x33\x0f\xee\xc5\x6d\xe2\xc1\xa4\x81\xa6\x9c\xbe\xa2\xe3\x4e\x3a\xc1\x5d\xdf\xb2\x8b\xf1\xd8\x13\x0f\xae\xde\x17\xb2\xc5\x03\xb1\xc7\x36\xf5\x83\x6c\xe3\xdd\x01\x27\xdf\xf2\x89\xd7\x62\x87\x2a\xc4\xa7\xfd\xc0\x47\x3c\x38\x0c\x30\x00\xc9\xd1\x06\xf9\x5c\xdb\x1b\xbe\x7d\xbd\xe1\xdb\xd4\x0f\xc2\x2b\xdf\xa6\xae\x78\xca\x29\x7f\xa7\x41\x0a\x82\xa3\x05\x1a\xbc\xad\xb3\xc9\x83\x69\x44\x5c\x67\xb5\xd7\x77\x4b\x47\xf4\x03\xae\x03\x35\x7c\xbe\xbf\x77\x23\xa7\xab\x9d\xbd\x52\x7c\x53\x54\x1e\x1e\xe9\x94\xe5\xa2\x43\x16\x1e\xdc\xf3\x2d\xbb\x18\x0f\x16\x3c\x00\x4f\xf1\x60\xda\xc3\xeb\xc4\xbc\x00\xee\xf5\xb7\x69\x5e\x10\xbb\x76\xd0\xba\xda\xb3\xbb\x33\x2f\x4c\xbb\x56\xe6\x34\x9e\x78\xd9\x37\xba\xef\x9b\xd8\x2f\x8a\xb9\x6f\xc1\xa6\x6f\x57\x31\x98\xbc\x2b\x26\x9d\x7b\x76\xb2\x73\x3b\xfc\x4d\x9e\xeb\xfd\xb8\x2d\x1d\x34\xf7\x83\x49\xa7\xe4\x76\x9a\x8d\x77\x29\x9c\xe5\xb4\x6d\xe7\xdd\x33\x38\xdf\xd7\xca\xee\xda\x69\xe6\x79\x6e\xb2\xe3\x73\x3b\xde\xc3\xf1\x88\xd5\xa5\xd0\x71\x44\x0c\x36\x9e\xf9\xdf\x88\xc1\xb4\xcf\xa3\x72\x9d\x7e\x53\x87\xe7\x54\x7c\x99\x4a\x6c\xc9\x71\x8d\x79\xaf\x7b\xeb\xdd\x02\xab\x9c\xce\x3d\x7e\xda\x8f\x11\xbd\xf7\xbe\xce\xb4\x0f\xb6\x58\xca\xf1\xf9\xfe\xd7\x2d\x9d\xd5\x7e\x9f\x1c\x8a\x9c\xde\xd5\xc1\x62\xa5\xbd\xe8\x08\xdf\x9a\x9b\x31\x58\xe5\xf4\x22\x06\xf6\x43\xdf\xf8\xd5\xe9\xa4\xe5\xe1\xf5\x7e\xc8\xdb\x69\x7d\x3e\x5f\xdb\xf1\x7d\x8d\xe9\xbd\xb6\x8a\x7b\x43\x8e\x5f\xbf\x1e\x08\x18\x26\xb9\x74\x5a\xa7\xad\xe5\x3a\xb1\x36\x3d\x93\x43\x37\xf0\xc4\xf5\x33\x99\xe6\x2d\xa0\x18\x37\xe4\x1c\xfe\x2e\x19\x32\xf5\x01\x20\xf7\x37\xe4\x34\xc0\xef\xcc\xc2\xe9\xfd\xb2\xcb\xfd\xe4\x0b\xb9\x11\xf1\x77\xda\x10\x88\x56\xe3\xd8\xc2\xe3\xfb\x1f\x07\x02\xbd\x49\x8e\xac\xe4\xd6\x33\x43\xa9\x64\xa0\xe2\xfb\x54\x42\xce\xbc\x21\xe7\x2a\x29\xe8\x0e\x84\xcf\xec\xeb\xfd\x8b\xcd\x7c\x1c\x2d\x60\x4c\x72\xf6\x0d\x39\x3e\x4b\xf0\xfd\x13\x21\x97\xdc\x90\x9b\xf6\x89\xe6\xf7\x1b\x2b\xf8\x86\x1c\x5f\xe9\x1d\xad\xf9\x9d\xe1\x8a\x71\x43\x8e\xe7\x63\x99\x33\x1e\xfb\x97\x4c\xf9\x28\xb6\xe5\xc6\x86\x9f\x5d\xb4\x96\xf8\xa5\x37\xf0\xc4\x7e\x94\xb5\xf0\x34\x9b\x9e\x8f\xbf\x94\x13\xfb\x08\xc6\x6c\x77\xd9\xf7\xb9\x94\x33\x40\x7b\x16\x97\x60\xba\xef\xb8\x5d\x1f\xc3\xb4\x1e\x61\xe3\x4d\xee\x8c\x57\x03\xe9\x92\x8f\x60\x93\x07\x44\x21\xa0\x3e\xf4\xd3\xb5\x0b\xe3\x55\xb0\x89\x27\xf6\x73\x7a\xe0\x2c\xf9\xd8\xc6\x73\x94\x06\xe0\x43\x3f\xf3\x4a\xee\x6f\xf8\xc7\xeb\xe3\xa8\x81\x6a\xc9\xc7\xa6\xdc\x94\x0f\x0d\x1a\x4b\x3e\x92\x4d\xbb\x99\x32\x80\xf8\xa8\x2d\x7c\x26\x37\xe4\x78\x7d\x1c\xb5\xa5\xce\xcd\x1b\x72\xbc\x3e\x8e\xda\xc2\xe7\x79\xbf\xe2\x52\x2e\x96\x07\x18\xbf\x97\x73\x3f\x50\xec\x1b\x72\xbe\x12\x42\xf5\xbd\x84\x33\x4f\x93\x69\xfd\xb0\x96\x63\xfd\x0a\x2b\x11\x94\xde\x4b\x98\x2d\x72\xf6\x3e\xd9\x87\x9b\x75\x14\xbe\xd7\xd3\xda\x02\x28\xe6\x0d\xbb\x2e\xcb\xef\x7b\x39\xbf\x0f\x5b\x2e\xb6\xe5\xc6\x86\x5d\xef\xbf\x97\xf2\x12\xe7\x1b\x78\x19\xbb\x6e\x7f\x2f\x61\x3d\xd7\xef\x0d\xb9\xe2\x62\x1c\xb7\xfd\xf3\xa0\xf1\x5e\xce\xef\x13\x57\xfc\xe5\x5b\x0c\x97\x71\x0e\x65\x95\xef\x47\x08\x39\xeb\x86\x9c\x27\xc7\x70\x18\x3a\x79\xc6\x9b\xbf\x53\x7d\x19\x67\x74\x81\x97\xdc\xc0\x23\x17\x78\xe6\x0d\x39\x97\xf1\x60\xe8\x94\xe9\x3d\xf8\xcb\x7e\xc6\xa5\x9c\x2e\xe7\xb0\x1c\x3a\xb9\x9c\xf3\xb1\x2d\x37\x36\x8a\x0d\xed\xa1\x53\xdc\x87\xfe\xb5\x10\x0d\x9d\xdc\x3f\x8c\xdf\xb9\xdc\xed\x71\x64\xb0\x1a\x3a\x79\xba\x47\xac\xd4\x90\xf0\xf8\xfd\xdb\x74\xdf\xe9\x27\x71\x7b\xf9\xf3\xf7\xdf\xfd\xf4\xf5\x7b\xa5\xc6\x09\x21\x09\xc6\x49\xb2\x77\x69\x0f\xec\xa3\x95\x65\xc0\xa9\x24\xa8\x90\x65\x7f\x7b\x4b\x8f\xe0\x8c\x90\x0c\xe3\x2c\xbb\xd4\x0b\xee\xea\x05\xa4\x25\xfc\xbf\xed\xa5\x5e\x0d\xa5\x6b\x3f\x3f\x71\xbd\x4f\xcc\xcf\x14\xf3\xff\xa6\x42\xef\x80\x80\x96\x01\x07\x88\x31\x92\xe9\xdb\x4e\xdb\xba\x64\xf9\xb7\xa5\x1b\xdc\xd5\xbd\xf4\xf7\x5c\xb7\x86\xc1\x0b\xb1\x3d\xf4\x65\x0e\xdc\x9e\xfb\x1b\xbc\x10\xdb\x93\x5e\x70\x57\xef\xca\xd7\x45\xaf\x9e\x7a\xd5\xc5\x18\x3f\x4d\xb1\xe5\x4e\x12\xc2\xfd\xcc\x40\xf2\x5e\x82\x88\x36\xa0\x04\x06\x8f\xed\xb2\x6f\xbb\xa5\x7b\x16\xdb\x2b\xdd\xe0\xae\xee\x99\xbf\x57\xba\xf5\xb2\x9f\xb8\xed\x73\x44\xf8\x7f\xa3\xbd\x4b\x2d\x30\x0c\x1d\x4c\xc7\x16\x16\x20\xe4\x3e\xdf\xd5\x3d\xf3\xf9\x4a\x37\xb8\xab\x7b\xe6\xf3\x85\x2e\xd8\xb5\x90\xf0\xe7\x12\xc4\x2a\xfa\xcb\x67\xf1\x9f\xef\xa7\x27\x12\xf8\x53\x09\xfb\x88\xb6\x78\xc0\xa9\xf4\xc7\xc8\x4b\xe7\xf2\x9f\xb6\xe4\x0b\x4c\x07\xdc\xff\x31\xf2\xf1\x13\xfe\x17\xb8\xc7\x48\x7a\x45\xbe\xc5\x64\x5b\xfe\x86\x3f\xdf\x24\x94\x72\x79\x60\x5d\xcb\x7f\xba\x94\xf7\x31\x6d\x30\x2d\x7f\x37\xf9\x08\xd3\x0e\x53\xcc\xe4\xa7\xe7\x5a\xee\xca\x8f\x1d\xa6\x39\x1e\x93\xdf\x5f\x5e\xa9\x21\x9e\xfa\xc6\x59\x25\xcc\x9d\x6d\xef\x53\x07\x34\x47\x13\x84\x74\xbe\xa7\xb8\x2d\x4f\xc4\x5b\x38\xf6\x3e\x35\xc0\x70\x34\xa7\x83\xf4\x6c\x8d\xbc\xbe\x07\x7c\x92\x9f\xaa\xec\x0a\xff\x34\x47\xdc\xf2\x47\x83\xea\x01\x81\x9a\xa6\xd3\x9a\x5e\xe3\x6b\xaf\x4b\xf9\x0c\xb3\xea\xc7\x7b\x6f\xec\xa0\x75\xc8\x00\xe2\x0f\x53\x80\xd5\x5c\x70\xcb\x1f\x03\x0c\x07\x04\x5a\x1a\x4f\xfe\xf8\x37\xfc\xe1\xb3\xd5\x24\xdf\x81\x94\xa2\x29\x3e\xfe\x26\xfe\xd4\xf1\xf7\xfe\x38\x40\xe3\xd0\x81\x60\x89\xcf\xb6\xfc\xe2\xcf\x85\x7c\x0d\xd4\xfb\xf1\x19\x53\x88\xde\x31\x74\xe8\xb4\xc6\x3e\xbb\x27\xb7\xce\x97\x68\x8f\xfc\x5d\x88\x6c\x6d\x4c\x75\xe1\xcf\x0d\xf9\x93\x3f\xe7\xf2\xf5\xb7\x1b\xf1\x21\x31\x21\x31\x59\xbf\xdf\x42\xf8\x73\x43\x7e\xe6\xcf\xa5\x7c\xf0\xed\x7e\x7c\xdc\xe3\x20\x5b\x43\x27\x7b\xa3\xbe\xf4\xcf\x6c\xb9\x46\x59\xb8\x6f\xd2\x86\xd5\xa1\x3a\x7f\xdb\xe7\x77\x90\x93\x6e\xcb\x8d\x19\xa6\xc9\xeb\x72\xf9\xb5\xdc\x54\xbf\x2d\xa6\xae\x74\xd6\x0f\x6f\xca\x95\x27\xb9\xdb\x76\x3f\x20\x07\xfc\x3b\x76\x23\x4c\xb5\x59\xce\xba\x2b\x37\x76\x2f\xca\x7d\xbb\x67\x57\xc5\xc7\xf8\xf7\x90\x53\x24\x2c\xbb\x8a\xbf\x77\x25\x59\x7a\x93\xbe\x93\xfe\xb7\x78\xca\x65\xf7\xf9\xcb\x57\xf0\x1f\xff\xf9\xf5\xbf\xff\xfe\xd3\x7f\xfd\xe5\xf3\x9f\xf7\xf2\x7f\xec\x3f\xff\xf9\x2f\x3f\xfd\xd7\xdf\xbf\xfe\xf7\x7f\xca\x3e\x75\x61\x71\x74\x40\x5b\x94\x65\x51\x96\x55\x11\x46\x51\x18\xb1\xd5\x4c\x92\x94\x49\x32\x96\x89\xef\xc5\xb1\xe7\x27\xc0\x30\x0d\xd3\x34\x4d\xc3\xe4\x76\x4c\xc5\xdf\x3b\x1f\xb7\x53\x96\xb3\x1d\x27\x49\xca\x34\x1d\xb3\x24\xf0\x93\xc4\x0f\x12\x60\x5b\xa6\x65\xd9\xa6\x69\x49\x8a\x54\xcb\xfe\xce\xda\xfb\xcf\xdb\x51\x24\x2a\xc9\xd6\x81\x40\xab\xad\x9b\xa6\x6e\x9b\x26\x15\xff\xf6\x7e\x92\x14\x69\x3a\x16\xb1\xcf\xec\x78\x09\x30\x4d\x8b\x8d\xc7\x32\xb9\x1d\xe3\xa3\x76\x84\x95\x33\x3b\x55\x92\x8c\x08\x05\x7e\x9a\xfa\x01\x02\xae\x65\x9a\xb6\x18\x0f\xf0\x64\x7b\x9f\xef\xe3\x0d\x3b\xc6\xdf\xbe\xfe\xf7\xdf\xbe\x18\xca\xe7\x3f\x2b\x60\x65\x67\x67\x8e\x99\xdc\xbe\x13\x98\xd3\x81\x0e\x40\x02\x1a\x50\x81\x4a\xfb\x6f\x52\x99\x17\xec\xdf\x3e\x46\xa8\x4a\xd3\x31\x45\x7e\xc0\x6c\x22\xe0\xda\xa6\x65\xda\x86\xe1\xfc\xf1\xf6\xa4\x04\xfa\x8a\xfb\x12\xff\x5c\x6a\xc3\xea\x68\x83\x36\xaf\xeb\xbc\xa8\xeb\x22\x8c\xe3\x30\x8a\xe3\xbd\x9b\xa6\x5d\x9a\x1e\x87\x2c\x49\xf2\x3c\x49\x32\x50\x05\x8e\xe3\xfb\x8e\x13\x70\x3b\xe1\x4e\xdd\x07\x2f\xd8\xa9\xc7\x56\xf6\x0f\x31\x74\x9a\xae\x6b\xd8\x1f\x12\xff\xf6\x01\x42\x1d\x42\xc7\x3e\x8f\x99\x9d\x38\x67\x76\x6c\xdf\xb7\xb9\x9d\x0c\x86\x3b\xeb\x15\x3b\x8a\x34\xb6\xb2\x77\x88\xa1\xdb\xf4\x7d\x53\xf7\x7d\x8d\x30\x46\x29\xc6\xf7\xed\x10\x39\x50\xfc\x97\xc6\x23\xea\xc9\x05\xcd\x65\x3d\x05\x08\xb1\x7a\x2a\x63\xdf\x8f\x13\xcf\x63\x75\xcb\xff\x19\x16\xb7\xa3\x7e\xa8\x3f\xb8\xa0\xc9\xab\x8b\xfe\x90\xa6\x05\x42\x63\x8c\x82\x10\xa1\x30\x40\xc0\xb7\x6c\x5e\xb7\x0e\xaf\xa7\xe0\xd5\xb8\x9d\xea\x56\xd4\x13\x4a\x44\x3d\x9d\xc6\xe3\x25\x89\xe7\xc7\xc0\xb0\x75\x36\x1e\xdd\xe6\x76\xb4\x8f\xda\x61\x36\xea\xb6\xad\xe7\xba\x0d\x10\xaa\xd3\x74\x4c\xd2\x80\xf1\x3a\x48\x81\x6b\x4d\xff\x78\x1d\x45\x77\xea\xe8\xef\x77\xeb\xa8\xff\x26\x0d\x40\x07\x1a\x90\x58\x49\xb1\x1a\x2a\xf3\xa5\x8c\xca\xc4\xf3\xd2\x74\x4a\x93\x61\x5a\xba\x69\x4a\xdc\x9e\xf9\xe1\xba\xe5\x4f\xcc\x30\x73\x40\x63\x06\xab\x2c\x2f\x57\x75\x1b\x23\x31\x3e\x04\x7c\xc7\x34\x6d\xc7\x30\x45\xdd\x46\x8a\xbb\xf7\x3e\x52\xb7\x45\x55\x15\xeb\xba\xf5\x30\xee\x30\x1e\x55\x92\xc4\x59\x16\x27\x04\xe4\xbe\xed\x78\x9e\x63\xfb\x4b\xdd\x86\x2f\xd5\x6d\xc7\xeb\xe9\xaa\x6e\x43\x6e\xe7\xd8\xdd\xa9\xdb\x17\xec\xdc\xae\xdb\xbb\x76\x08\x9f\x07\x3f\x54\x4f\x97\x75\xeb\x22\x54\x22\x34\x92\x24\x08\x92\xd4\xf7\x53\x60\xdb\x86\x65\x9a\x96\xc1\x78\x4e\x60\xfd\x6b\xec\xb0\x1c\xad\xec\x54\x18\x8f\x1e\x0e\x23\x84\xc3\x10\x83\xc8\xb6\x4d\xd7\x35\x6d\x5e\x4f\xb0\xff\xf5\xf5\x94\xa0\x55\x3d\x05\x88\xdb\x09\x30\x08\x6d\xdb\x74\x9c\xd9\x0e\xd9\x59\xaf\xf0\xed\xda\xce\xdc\x1f\x3c\x84\x7a\x84\x46\x07\x47\x21\x21\x61\x84\x41\xe2\x99\x8e\xed\x5a\xa6\xc7\xea\x08\x0e\xbf\x55\x1d\x95\x79\x56\xf1\xc2\xc5\xb8\xe6\xf1\x0b\x42\x84\x83\x00\x83\xc0\x31\xd9\xb8\x4c\x3e\xdf\xc2\xe6\xb7\x9b\x6f\xa7\xba\x15\xf6\x2c\x12\x46\x84\x44\x21\x01\xc8\xb3\x4d\xcf\x33\x6d\x8f\xd5\x13\x18\xae\xeb\x16\x7c\x68\xbe\xf5\x30\xa6\x03\xc6\xc7\xbc\x48\x51\x51\xa0\xb4\x00\x7d\xe0\xb9\x61\xe8\x7a\x81\x58\x5b\x66\x60\x78\x35\x67\xb7\x6a\xca\xc3\x98\x99\x22\x65\x8a\xca\x12\xa5\x25\x94\x42\x61\x2a\xe4\x5c\x4f\x15\xff\xa5\x5e\xb4\x9a\xa3\xaa\x7c\xcd\x75\x4f\xc4\x4e\xcd\x44\x2f\xca\x40\xee\xd9\x9e\xeb\x3b\x3c\x76\x04\xf4\x8a\xbf\x37\x3f\x62\x27\xab\xab\x9c\xc5\x2f\x88\xa3\x30\x8c\xe3\xbd\x89\x71\x8f\xd0\xb1\x28\xd2\x94\xff\xb1\xd0\x79\x01\x0b\x1f\xe7\x7a\xf2\x6a\x2f\x9a\xb9\xce\x78\x5e\xb5\x6d\xc5\x88\x9e\xa4\x29\xeb\x45\x0d\x21\xc7\x3e\x17\x6b\xa2\x1c\x54\xbe\xe3\xfa\xbe\xeb\xb0\xde\x5a\x83\x7a\x67\xbd\x32\x9e\x6b\x3b\xac\x72\x93\x14\xf1\xf1\x60\x7c\xc4\x2c\x37\x2c\x47\x50\x62\xb9\x09\xf9\x78\x80\x07\xab\x5f\xc5\x71\x15\xa8\xbc\xa6\x26\x8e\xe7\xe5\xc2\x71\x23\x8b\xf8\x4e\x6a\x06\x88\x6f\x59\x3e\xfb\x63\xf6\x40\xbd\xcf\x37\xc7\xb5\xb2\x27\x6f\xda\xfb\x26\xd1\x7e\xb1\xd7\x0d\xc2\x5c\xc9\x86\x37\x10\x72\x24\x65\xc2\x86\x97\x94\xa0\x0f\x5d\x27\x0c\x1d\x37\x64\x3c\x4f\xa4\x46\xd1\xf7\xea\x0b\x35\x65\x51\x1b\xe6\xc7\x10\x54\x8c\x13\x79\xd3\xe4\x41\x92\x04\x61\x92\xec\x55\x8c\x69\x8b\xf1\xa1\x6f\xf8\xff\x3b\x6f\x60\x92\x46\x51\xca\xfe\x44\x4d\x25\x52\xb3\x53\x5f\xb2\xb5\xac\x63\x59\x3d\x55\xc3\x50\xa5\x18\xa7\x09\xc1\x27\x5b\x6d\x96\x37\x6d\x96\xb5\x30\x41\x61\x98\xa6\xe1\x6c\x2b\x93\x9a\x9d\xf5\x8a\xad\x53\xfd\xd6\x43\xdf\x54\x7d\x5f\xa5\x84\xa4\x09\xbe\xb0\xd5\xe4\x97\xb6\xa0\x54\xca\xad\x62\xef\xad\xe9\x19\xa3\xcf\x5f\xbe\xfe\xf5\xa7\xbf\xfe\x3f\xe0\xa7\xb7\x9f\x3f\xef\x7e\xfc\x59\x31\x8e\x4d\x80\xcd\xc2\x22\x56\x75\x24\x7a\xb9\xb7\x08\xa9\x3a\xb5\x6d\xd4\xd4\x42\xea\xa4\x5f\x5e\xea\x7f\xf7\xf3\x77\x6b\x7d\x62\x94\xe6\x5a\x9f\x0e\x2a\x90\x06\x0d\x9b\x48\x93\xa0\xd4\x2a\xea\xce\xe1\x3d\xe4\x64\xff\x87\x9f\x7f\x7a\xfb\x81\xe9\xef\xcc\x43\x4f\xb0\x01\x34\x8b\x58\xc0\x38\x14\xfa\xb0\xf7\x08\x29\x7b\xb5\x6b\x55\x64\xa4\x2a\xd3\x97\xdb\x9d\x7a\xae\xff\xdd\x0f\xdf\xfd\x24\x0b\xfb\xed\xd1\xca\x26\xfd\xee\xd0\x0b\xf5\x8a\xf6\x1a\x90\xbe\x49\x6a\x6a\x8a\x31\x80\x48\xd1\xf6\x29\xbf\xa6\xfc\x5f\xa7\x58\x7f\xf9\xf1\xa7\xbf\x7e\xf9\xf9\xa7\xb7\x7d\xfa\xde\xed\xa4\x83\x01\x34\x9b\x58\x20\xb5\xb1\xbd\xf7\x09\xa1\x3e\x21\x6d\xdb\xb6\xbf\x85\xbe\xe4\x42\xbc\x15\x43\x99\xc7\x40\x6e\x8f\x8d\x47\xac\xdc\xc1\x36\xd0\x8e\xa6\x3e\xb0\x20\xb6\x54\x55\x41\x4f\x0d\x1d\xfb\xd3\x3b\xde\x19\x46\x7b\x81\xf1\xc3\x84\xf1\x83\x52\x1c\x25\x42\x4c\xa0\x32\x10\xfd\x90\xe8\xc0\x11\x28\x92\xc6\x50\x34\xec\x61\x9d\xbf\x73\xae\xdc\x45\xb7\x30\x76\xfa\xa1\xc5\xc4\x02\x16\xc3\x70\x0e\x96\x31\x63\x98\x1a\xa8\xa8\xa3\x4f\x18\xa5\x22\x29\xf6\x45\x3e\xcf\xf9\xb4\xe6\x03\xcb\xe6\xa0\xf6\x9d\xc8\xa6\xe0\xd3\x76\x2c\xd6\xfa\xe7\x7c\xa4\x8d\x0a\x0c\xda\xa9\xd8\xc4\xaa\xe0\x74\xa5\x48\x37\x39\xf5\xc3\xce\x3c\x34\x05\x36\x81\x6e\x10\x13\xe8\x07\xa2\x03\x8d\xb3\xa2\x55\x9b\x7a\x8d\x21\xe3\x9b\xbc\xfa\x41\x69\x8f\x46\x4e\x4c\xa0\x99\xc4\x6c\x0f\xcd\x0c\x41\x0b\x0d\xd8\xb4\x56\xb1\x45\xd4\xdf\x84\x57\x72\xff\x82\xbe\xc5\xf5\x6d\xf1\xc4\xf2\x53\xbc\xaa\xfd\x85\x57\x86\x36\xf3\x4a\x03\xdd\x25\xaf\xba\x9b\xbc\x2a\x0f\x7d\x86\x6d\x20\x31\x10\xe3\x10\x69\xdb\xbc\x42\xb0\x7a\xc4\x2b\x13\x38\x36\xb6\x80\x7d\xb0\x75\x60\x09\x0c\x4b\x03\x25\x75\x35\xec\x62\x8d\xf3\x22\x7d\xc4\x0b\x33\x3f\xe7\x45\xa5\x02\x8b\x36\xab\x9c\x96\xb2\xf3\x2a\xb7\x12\x15\xc4\x14\x5d\xf0\xc2\xd9\xe0\xc5\xc2\xad\x9c\x58\x40\x35\x67\x6e\xe9\x2b\x62\x54\x1a\x27\x06\xc3\xf0\x77\xce\xcd\x78\x70\x0c\x13\xa8\xa2\xe7\x71\x7e\x5a\x84\xd4\x94\xa8\xc0\xa7\xd9\xd4\x37\x41\x24\x37\x1b\xdc\x90\x7f\xfa\xee\xcb\x77\x3f\xc9\x37\xb8\x65\x10\x22\xde\xff\xc1\x5f\xf8\xc5\x30\xb2\xe7\x30\x6c\x90\x4c\x18\x63\x4f\x88\x78\xb2\x87\xdf\xff\x60\xfc\x60\x31\x55\x37\x39\xf6\x83\xe8\x5d\x36\x71\x89\x0b\xf4\xa3\xa9\x03\x69\xaf\x12\xd2\x8d\x8d\x06\xf5\xb1\xd7\xb0\x4b\x34\x81\xa1\x2b\xfd\x05\xc6\x79\xef\xe2\x1c\x23\x0e\x30\x0f\x11\xeb\x5d\x1c\x24\xd7\xa0\x33\x56\x8c\x1f\xa2\x77\x59\xbb\xe8\x16\xc6\xce\x3c\xd4\x98\xd8\xc0\x64\x18\xbc\x77\xb9\x02\xa3\xd4\xa0\x35\xb6\x27\x8e\x19\xcf\x70\xcc\xae\x4f\xfc\x08\x54\x80\x69\xb4\xe6\x18\x4c\x15\x7b\xd7\xdd\xc4\x68\x7d\x62\x66\xb6\xc0\xa8\x76\x1d\x4b\xac\xa1\x82\x86\x5a\x2a\xb6\xb0\x36\x73\xcc\x79\x99\x1f\x2d\xc5\x2a\x08\x68\x26\x5c\x81\x52\x05\xd3\x9d\x73\xe1\xc7\x16\x86\x0d\x4c\x8e\x21\x5c\xd1\x35\xd0\x50\x53\xe3\xae\x30\x7e\xa4\xaf\x72\x6c\xac\x09\x11\x4f\x6e\xf2\x8f\x93\x41\x10\xc1\x7c\x9f\xee\xfa\x07\x18\xba\x43\x6c\x10\x3b\xd8\xde\xf5\x84\x8c\x01\x21\xa0\x14\xdf\xa9\x15\x1c\x93\x5a\xc5\xde\x55\x27\x8c\xef\xae\xe7\xc7\xcc\xc3\x82\x63\xc3\xae\x22\x84\x0e\xc7\x46\x93\xf5\xe3\xa0\x63\x7f\xe2\x98\xd4\x2a\xfd\x0d\x0c\xd6\xc7\x06\x82\xed\x81\xf1\xd4\xe2\x14\xe3\x20\xdd\xb1\xd3\x65\x69\x54\x05\x08\x94\x12\xa9\xdd\xc5\x17\x18\xe7\x7d\x0c\xdb\xc0\x62\x20\xee\xc1\xd0\x81\x3b\x81\xf4\x3a\x1c\x46\x4d\xc7\x01\x11\xf7\x30\xa4\x5e\xae\x15\xb6\xfe\xff\x37\x8e\x32\xff\xe7\x93\xa2\x8e\x29\x8c\xc7\x14\x92\x63\xb9\x37\x91\x87\x3c\x0c\x7d\x21\x8f\x9f\x90\x8f\x50\x88\x21\x92\x24\x00\x34\xb9\xd8\x19\x7b\xf7\x4a\xbe\x3f\x96\xb2\x73\x2c\xe5\xe8\xd0\xef\x5d\x14\xe2\x08\x09\x79\x53\xc6\x3b\xeb\x5a\x7e\x27\x1d\x2b\xd9\x3e\x56\x72\x78\x18\xf6\x2e\x8a\x71\x8c\x61\xce\xe4\x53\xb9\xdc\xa3\x7d\x70\x29\xbf\x8f\x0e\x85\xe2\x1e\x0a\x25\x7c\x1f\xf6\x01\x0a\x99\x3c\xf9\x80\xbc\x94\xc3\x5a\x91\xf6\x96\xf4\x3f\x24\xe9\xbb\x59\xdc\xf8\xe1\xaf\xca\x97\x1c\x36\x63\x05\x3a\xaa\x83\x10\x98\x06\x4d\xa9\xb9\xb7\x48\x8e\x5b\x1b\xdb\x42\xaf\x50\xc8\xa6\x9e\xec\x8f\x2e\x44\x63\x04\x4a\x10\x19\x54\xa2\x1a\xd7\x1b\x5c\xec\xf2\xf8\xc2\x62\x97\x6c\xe9\xf5\x32\x1e\x55\x58\x8f\x16\xd4\x41\xa9\x8f\xed\x88\x84\x9e\x8f\xfd\x53\x1e\xbd\xbb\x79\xf1\xb0\x87\x43\x0c\x13\x21\x9f\x28\xd6\xde\xba\x2b\x6f\x91\x08\x47\x53\x9c\x35\x39\xe7\x6b\x90\x4b\xf9\xf6\x58\xcb\xd6\xb1\x96\xfd\xa3\xba\x67\xe8\xd1\x14\x67\x53\x8e\x9f\xc8\x63\x8a\x53\x0c\x6b\x91\x17\xf2\x38\x2f\x38\xc6\x09\x86\xa5\x90\xc7\x7b\x74\x8d\x7f\x26\xef\xa2\x08\x25\x84\xfb\x2f\xe5\xd3\xfa\xe3\x4e\x1e\x33\x60\xea\xd4\xe3\x79\xac\x71\xef\x88\x7c\xe4\x10\xef\x2e\xf2\xff\xe9\x3c\x8f\x50\x07\x89\x3e\x56\x63\xb7\xb7\x48\x89\xbf\x49\x2e\xf6\x78\x1e\xf1\x65\x1e\x3f\x5d\xe4\xd1\x06\x84\xe9\x65\x93\x9e\x4f\x7c\x9e\x97\xe8\x89\xbc\x84\x2c\x6e\xa5\xc8\xa3\xfe\x84\x3c\xc6\x39\x96\x75\x91\x47\x7f\xa7\x6e\xd4\xe3\x3a\x8f\x2e\x42\x98\x60\xd8\x8b\x3c\x9a\xbb\x0d\xfc\x9d\x3a\xd5\x2f\xcb\x23\xc3\x27\x58\x56\x45\x5e\xbc\x27\xf2\x88\x49\x86\x65\xed\x24\xff\x28\x8f\x29\xc9\x30\x1c\x44\x3e\x2c\x3e\xc7\xff\xcf\x55\x5c\xff\xeb\x6f\x3f\xaf\x13\x49\x40\xe3\x19\x3c\x91\x2a\xee\x08\x6d\x2d\x03\x7b\xd2\xa4\xbb\x93\xb6\x75\xe7\x64\x36\xd0\x4a\x8d\xb1\x1d\xeb\x49\xd7\x31\x71\x28\xfa\x24\xb4\x76\xc9\x5e\xbd\x97\x4f\x5e\x97\xcd\x88\x27\xd5\x08\xc5\x3c\x3f\xc6\x53\xf9\x99\xe2\x21\xf5\x10\x29\xea\x6e\xb8\x94\x97\x5b\xf1\x2d\x79\x18\x1f\xbb\xdd\x80\x4b\xdc\x62\x39\x14\xf9\xb4\x76\xea\x06\xfe\x3a\x9f\x16\x61\xf9\x94\xd9\x38\x80\x0e\xa3\x9d\x75\x8d\xbf\x53\x8f\xb9\xec\x1d\x73\x39\x3e\x30\xfc\x1a\xf7\x58\x4e\x3f\x90\x1f\x90\xc2\x68\x8f\xae\xf1\xd7\xf2\xbb\x01\x37\xb8\x13\xf8\x52\x2e\xb5\x8a\xb5\xeb\xe6\x9c\x7c\xda\xc8\x67\x0e\xf2\x50\xa7\x3e\x35\x77\x1d\xa6\x04\x53\xc3\x31\x70\x30\xe9\xee\xd4\x6d\xdd\x39\x9f\x2d\xcf\x67\x37\x96\x97\xba\xbd\xd4\xee\x92\x4d\xdd\x25\xa1\x03\x74\x31\x4f\xe8\xa5\xee\x20\x3b\x4a\xb9\x77\xa5\xff\x43\x92\xc0\xdf\x7f\xde\xfd\xf8\xc3\xdf\xbf\x7e\xf9\xfa\x45\x7b\x93\x5b\x43\x3b\x0e\x9a\x6c\xa8\xc7\x56\x2e\x3d\x39\x88\xb2\x08\x7b\x7e\x84\xc6\x8e\xd7\x52\x24\x9b\xfb\x70\x8a\x25\xd7\x13\x6a\xbb\xc4\xd2\x0e\xa5\xa6\xf8\x87\x4a\x69\x3c\xd9\x4d\xaa\x00\xbb\x04\x8f\xcd\x20\x01\xa9\x91\x33\x45\x9d\xe6\xdb\x95\x8e\x6c\xeb\xda\x98\x6a\x10\x8d\x48\xd6\x1c\xb9\xf2\x53\x1f\xd9\x31\xa6\x6e\xc5\xe2\x22\x23\xb9\xdf\x9b\xd7\xfe\xa9\xa6\x36\x26\x1a\xc4\xea\x98\xc8\x86\x2b\x17\x7e\xe2\x63\xc7\x76\x31\xb5\x6b\x31\xae\xf4\xa9\x71\x65\xac\xcd\xfb\x8e\x87\xa8\xde\xb0\x71\x49\x32\xda\xd6\x6b\x4c\x6d\x94\x34\x59\x57\x47\x55\xc6\xbe\x9c\x87\x28\x24\x2e\xd3\x33\x1a\x11\x0f\x7b\x33\x1e\xa9\xa5\x2e\xf1\x70\xe4\x20\x69\x02\xe4\x26\x78\xec\x06\xae\x83\x36\x75\x90\x71\x8a\xa1\x2d\x17\x01\xe1\x3a\xcc\x10\x90\x02\xa8\xca\xf9\x12\x8f\x2f\x5f\xbf\x40\xf0\xe3\xdf\xbe\xdb\xfd\x08\x0b\xd3\x18\x0b\x38\x84\x63\x1c\x80\x30\xa7\xba\xa6\x94\x61\x88\x47\x8d\xd6\x09\x01\x46\x80\x25\x20\xb9\xd3\x7e\xef\xa5\xae\xec\x5a\xc6\x68\xc8\x24\x39\x36\x21\xa8\xdb\x11\x6b\x4a\x19\x44\x78\x94\x68\x95\x12\x60\xfa\x4c\x37\x05\xbd\x82\xb6\x74\x13\x9b\xe9\xe2\xe4\xd8\x04\xa0\x6e\x46\xa2\x5f\xeb\x0e\xb2\xb1\x15\x53\x99\xc5\xf4\x94\x0b\x5f\x76\xd2\x32\xc0\xae\x17\xa0\xb1\xf9\xc6\x63\x0a\xfb\x8d\xf8\xc8\xbb\xd4\xd4\x56\x31\xd5\xd3\x26\xc0\x4e\x89\xc7\x82\xf6\x62\x1d\xd8\xc8\x44\x51\xaf\xe3\x2a\xdb\x86\x3a\x22\x7d\xe1\x59\x40\x7c\x6c\xc7\x88\x5a\x0d\xe7\x59\x2a\xf7\x5b\x79\xbf\xe0\x59\x16\x32\x2d\xd7\x9d\xf8\x22\x0d\x77\xf8\xb2\x1e\x5b\x1e\xa2\x89\x67\xc6\xa4\x17\x3f\xc1\x4f\x57\x26\x21\x0e\xb1\xeb\xfa\x88\xea\x9d\xe0\x99\xb3\xc9\x99\xd8\x3e\xc5\xc4\x97\xc3\xa4\x16\x3c\xeb\x05\xcf\x92\x6d\x6e\x9e\xc5\x31\x0b\x33\xc1\x33\xbd\xe5\x3c\x93\xe4\x62\x6f\x31\xff\xbe\xe3\x89\xfe\x41\x64\xbd\x0c\x40\x94\x53\x4d\x83\x8e\xa1\x8f\xa5\x2c\x85\x50\x62\x79\xf6\xb0\xe3\x87\x58\x9c\x05\x93\x5c\xa8\x2a\xde\x16\x57\x1c\xcb\x18\x4d\xc6\x95\x36\x04\x55\x3b\xe6\xba\x52\xfb\x27\x8e\xba\x9c\x67\x50\x55\xd2\x4d\x9e\x59\xfa\x68\xc9\x28\x39\xb6\x01\xa8\x9a\x4d\xdd\x01\x66\x4a\x79\xdd\x2b\xe4\x8b\x98\xc2\x3a\xad\x43\xec\x85\x09\x1e\x31\xed\x24\x20\xb5\x72\xb8\xd9\x97\x2c\x53\x1d\xb1\x0e\x53\xc1\x97\x34\x24\x01\xe6\xf1\x61\x7c\x29\x64\x49\x6e\xaf\x74\x64\x59\x32\xb5\x95\x8e\x99\x30\x46\x67\x98\x13\x9a\xc7\xa6\x95\xa5\x1b\x3e\x9a\x2a\xbb\x2c\xb2\xd5\x63\x23\x57\x1e\xd3\x0c\x59\x2d\x08\xd5\x7b\x7a\x86\x76\xd2\x73\x2f\xf5\x40\x24\x6b\x9b\x35\x74\xde\xa7\xed\xa4\xf6\xb1\x93\xe1\xb1\x9a\xfc\xfc\xa8\x9e\x14\x80\x4c\x2e\xf6\xd2\x16\x6f\xc2\x8c\x6a\x3a\xf4\x4c\xc1\x1b\x90\xa5\x19\xe7\x4d\x18\xe3\x63\xc7\x75\x7d\x90\x2a\xde\x86\x6e\xc1\x3b\x4b\xa2\xc3\xd6\x14\xfc\x01\x69\x5a\x00\xd7\xc3\x76\x18\xe1\x63\xcd\x75\x53\x90\x2a\xe9\x86\x6e\x1f\x82\xa6\x19\x63\x0d\xb6\x96\x7e\x4b\xb7\x05\x48\x29\x77\x9d\x88\xed\x77\xab\xd8\x12\xcf\x98\x62\xdb\xca\x65\x02\x8a\x0a\xd8\x3e\x76\x12\xcc\xda\x5b\x36\xc5\x49\x42\xfb\x48\xe8\xfe\xf0\xa7\x95\xee\xce\xf3\x75\x1e\x28\xf5\x50\x2a\x6d\x52\x00\x15\xe4\x01\x76\xb2\x12\x1f\x7d\xf1\xcd\x6f\x20\xb5\xb0\xda\xe0\x9d\x2c\x6b\xb6\x36\x92\x89\x43\x3e\xec\x50\x1d\x60\xb7\xc2\x63\x36\xbf\x4f\xbe\x80\x96\x5c\xef\xba\x4b\x3d\xd8\xda\xda\x98\xe9\x30\x1e\x89\x2c\x79\xd0\x27\x43\x80\xdd\x16\x8f\xd1\xfc\x7e\xeb\x16\x16\xb7\xb8\xa7\x1d\xdb\x85\x43\xb0\x45\x9d\x8f\x1d\x3f\xc0\x23\xa1\x3d\xd7\x33\xb7\xe3\x53\xd9\x2b\xee\xf9\xd0\xcd\x80\xe6\x23\x27\x8c\xf0\x18\x4e\x36\x41\x04\xf1\x89\x47\xdf\x9d\x78\x14\x3a\xfa\xc2\xa3\x00\x96\x04\x48\x3e\x72\x6b\x3c\xc6\x5c\x11\x80\x08\x94\x73\x5c\xcf\x6c\x2e\x8a\x3c\xae\x11\xe8\x0a\x36\xb9\xf1\x9c\x98\xe2\x3b\xf1\x40\xf2\x24\x2c\x93\x5d\xc5\x74\x7f\x5e\x73\x21\xf3\x01\x21\xe3\xa0\x41\xd7\x52\xc7\x12\x76\x26\x4e\x6a\x80\x1d\x6c\x21\x8c\x8f\xe1\xa2\xab\x78\x9b\xba\x50\x6a\xc6\x48\xe7\x41\xd6\x64\x6c\x71\xdd\x00\x7b\x2b\xdd\x44\xc2\x4a\xb2\xa1\x5b\x7b\x50\xad\xc7\x40\x83\xbd\xad\x32\x5d\x61\xd7\x43\xee\xa2\x0b\xa5\x50\xce\x94\x80\x9f\x6f\xf8\xd3\x72\x7f\xef\x2f\xbb\xb7\xbf\xfd\xb8\xdf\xfd\xf8\xb7\x9f\xbf\x7c\x95\x7d\xea\xc0\x90\x56\x36\x08\x3c\x5a\xfa\x3e\xc5\x1e\x08\x3d\x9a\x8b\xd3\x0c\xa1\x99\xda\x09\xf2\x12\x0b\x61\x8e\x15\x2b\xd1\x3d\xac\x80\xda\x30\xa6\x85\x09\x12\x8f\x56\x61\x48\x89\x07\xb0\x45\x89\xc0\x42\x56\x62\x23\xe2\x27\x4e\xce\xb0\x32\x39\xdb\x05\xfc\x3c\xc4\x36\x96\xa2\x52\x03\x36\x34\x74\x40\xe1\xd1\x24\x8e\xa9\xef\x81\xda\xa5\xde\x3e\x40\xa8\x42\x89\x95\xda\x29\xf2\x53\x2b\x43\x12\x94\x90\x1c\xed\xbc\x3b\x58\xf2\x40\x35\xfe\xe5\x32\xd0\xfa\x34\x0a\x13\x1a\x78\x60\x30\xa9\xc3\xb0\x1a\x94\x59\xc8\x43\x99\x9f\xb8\x25\x92\x20\x30\xe5\x62\xdf\xf0\x7b\xb0\xdb\x58\x3b\x7d\xac\xe4\x6c\xac\x3d\x68\xf9\x54\x43\x88\x6a\x3e\x34\x82\xb1\xda\xc7\x18\x57\x88\xd8\xc8\x43\xc8\x4b\x1d\xf2\x1b\x63\x49\x2e\xf4\x14\xe9\x62\x8c\x7f\x62\x58\x70\xf7\xe3\xdf\xbe\xfb\xf2\x55\x76\xa9\x0b\x1d\x5a\x69\xc0\x0f\xe8\xe0\x06\xb4\x0c\x41\xec\x52\xc2\x2e\x24\x5b\x42\x73\x14\xc7\xfd\x37\x89\x24\x04\x44\x84\xf1\x22\x80\xb1\x52\xaf\xf1\xc0\xe7\x2f\xda\xec\x1b\xc3\x2b\xa9\x0e\x73\x1a\x83\x3a\xa4\x24\x08\x69\x1a\x82\x92\x87\x1f\xe3\x6f\x12\xa6\x55\x92\x24\x6d\x87\x62\x24\x5e\x08\x02\xa5\x18\x7a\x3b\xf3\x02\xef\x4f\x6b\xbc\x96\xea\xb0\xa3\xb6\x0e\x86\x90\x26\x51\x48\xe3\x10\x14\xbe\x00\xa4\x03\xa6\x65\x9c\xc4\xfd\x90\x25\x88\x3f\x5d\xcb\xb8\x46\x94\x7b\xfc\x98\x78\x5b\xda\x8c\xad\x65\x10\xd0\xcc\x03\x91\x43\x8b\x85\x1f\x0e\x22\x41\x6a\x73\x7e\x44\xb2\xaf\x84\x9c\xb7\x7f\x59\xb0\x3e\xff\xf9\x2f\x7f\x15\x68\xff\x37\xf8\xf9\xeb\x84\x17\xd3\xbc\xe8\x19\x9c\x4f\x89\xd7\x34\x2a\xcd\x38\x75\x91\xea\x24\x46\xe2\xa2\x2c\x48\x0c\xec\xab\x48\xe2\xfc\xc5\xbb\xf0\x3e\x7f\xd9\x78\x23\x0f\x10\x9f\x26\x71\x44\x7d\x1f\x94\x3e\x75\xf9\xe9\x1d\x94\x5a\xa9\x7b\xf2\x0f\xcb\xd6\x63\xfe\xf6\xd4\xd7\x40\x1f\xd2\x28\x88\x58\xec\x2a\x8f\xda\xe2\xe4\x63\xe9\x26\x3e\xce\xa3\x38\x68\x19\xe7\x74\x39\xdf\xb7\x8f\x39\x57\x19\x30\xf2\xc7\x21\xc1\x54\xf5\x61\x68\x8d\xa5\xe0\x5c\x66\x23\x0f\x23\x1f\x71\xbf\x9e\xc5\xaa\x5d\xe8\xf8\x54\x45\x88\x4a\x3e\x74\xbc\x99\xbf\x33\x96\xe0\xaf\x07\x35\x45\xba\xe8\x1d\x17\xfc\x75\xa0\x4b\x2b\x15\x04\x21\x1d\x1c\x9f\xf3\xd7\x11\xbd\xa3\xc5\x14\xa1\x24\x1d\x68\x9f\x27\x99\x78\x87\x88\xe4\x43\x73\x93\xbf\x32\x3c\xe3\x6f\x04\x9a\x90\x62\x3f\xa4\x49\x08\x6a\xe7\x44\x37\x8c\xe2\x14\x48\x74\xc8\xe2\x0c\xc4\x98\x7f\x0b\xdc\x9b\xce\x67\xfd\x79\xc1\xfb\x7c\x2a\x88\xaf\x0b\x83\x1d\xa8\x85\x34\x0a\x79\x12\x5a\x7b\x41\x34\x68\x1d\x25\x71\x37\xe0\x04\x01\x57\x17\x35\x11\xc9\xde\xa3\xde\x6b\xc3\x88\x16\x06\x48\x7d\x4e\xba\xdc\x03\xa9\x39\xf7\xde\xcc\x4e\x1d\x92\x85\xa9\x53\x8b\xde\xab\x3d\xea\xbd\x0e\x8c\x68\xae\x82\x2c\xa4\xa5\xe7\xd3\x3c\x04\xa9\x23\x08\xdc\xe2\xd2\x4b\xfc\xac\x88\x93\xa0\x15\xbd\xd7\xda\x85\x77\xb0\x26\xee\x06\x06\x68\xd9\x50\xd9\x9f\xe0\xae\x8b\x50\x8d\x39\xdf\xb2\x28\xf1\x1b\x86\x45\x64\x69\x77\x77\x8c\x03\xd5\x61\x4b\x03\x15\xaa\x0b\x56\xe5\x51\x87\x61\xf5\xb8\xf2\x12\x9f\xe4\x91\xf0\x0b\xe8\xb2\x73\xce\x37\xb0\xcd\x37\x9f\xf5\xcb\x89\x6f\x66\x28\xf8\xf6\x4d\xc2\xb5\x83\x82\xb2\x08\x91\x33\xbd\xdf\xea\xb7\xc6\x93\x3c\x80\xf8\xba\x6a\xe1\xc8\x6e\xe2\x88\x20\xdd\xd7\x85\xc5\x0d\x23\x71\xef\x04\xb4\x0a\x01\xb2\x28\xe6\xe7\x62\xb0\x47\x71\x9a\xa6\x40\xa5\x5d\x91\xe6\x20\x75\x05\x8f\x01\x52\x6a\x1e\xbf\xcf\xe7\xbc\x63\x98\x7f\x97\x78\x6b\x4a\xa9\x37\xb7\x62\xec\x47\x14\x45\x3d\x90\x0c\x91\x0e\xda\x62\x93\xc6\x24\xc1\xc0\xa4\x75\x99\x04\xc0\xae\x0c\x2c\xbe\xe7\x5c\xee\x74\x8e\xfb\xe7\x6b\xdc\x33\x3e\xb3\x86\x1c\xb3\x0e\x1f\x89\x0a\x99\x51\x31\x4a\x98\xb3\xbc\xe6\x52\x43\xd4\x48\xa6\xb8\x7c\xfc\x1b\xb9\xfe\x6e\xe1\x73\xae\x02\x14\xd2\xc6\xf3\xd9\xf0\x23\x87\xe6\xe2\x58\x50\x17\xc4\x7e\x51\xc6\x49\x08\x24\xf1\xbe\x21\x29\x85\x8e\xe2\xac\xf1\x2e\xe7\x0c\x9b\xc6\xd0\xa1\xb5\x06\xa2\x90\xf6\x9e\xcb\x7a\x42\xe8\x50\x7e\xcc\x88\x4d\x42\x7d\x94\x84\x45\x83\x93\x54\xbc\x2b\x4a\x22\x10\x9f\x73\xf1\x02\x6f\x5a\x53\xf8\x1a\x1b\xf2\xc4\xc5\xc2\xa7\x01\x1f\xf2\x80\xe8\x10\x26\x61\xdd\xa4\x69\x0c\x74\xd1\xe3\xa1\xbd\x0b\xee\xf8\xa7\x68\x9c\xdb\x2e\xe7\x76\x1c\xb1\x79\x0d\x54\x2e\x0d\x98\x7f\xac\xc9\xd4\x71\x12\x75\xdd\xe2\x1f\xd0\x65\xe3\x19\x3e\x56\x2e\x74\xaf\xfa\xe9\x37\x09\xb7\x1e\x0a\xeb\x2a\x42\x5e\x3b\xf3\x1b\xda\xfb\x76\x63\xbc\xf2\xe4\xdf\x8c\xa7\xc3\x98\xe1\x11\xb6\xbe\x88\xcc\xb1\xe4\xe3\xad\x30\x2d\x42\x14\x03\x69\x48\xd2\x18\x38\x2c\xbf\x9e\xd4\x28\xe2\xcc\xd4\x4d\xce\xf8\xd4\x82\x1e\xad\x40\x18\xd2\xce\xe1\x09\x4e\x2d\x9a\xf1\x63\x4b\x05\x36\xa8\x55\x24\x19\xb0\x68\x55\x25\x35\x68\x39\x67\x7c\xa9\x55\xea\x75\xcd\x5c\x63\x8a\x4e\x9d\x82\x32\xa4\x59\xc0\x83\xd8\xda\xd4\xe5\x41\x2c\xb0\x46\xf5\x32\xe1\xb7\x27\x9b\xa4\x05\x83\x86\xa7\xfb\x7a\xd6\x7d\xcc\x9e\xaf\xf8\x3c\xbe\xd8\x60\x13\x66\x04\x5a\x87\x3a\x13\xa6\x49\xcd\x3c\x21\xc0\xa6\x65\x9d\x34\xa0\x33\xb9\x9f\x72\xa9\x24\x7b\x4b\xfa\x9f\xd2\xbf\x33\xcc\xef\xff\xf2\xd7\xb7\xff\xfc\x71\xff\xf6\xe3\xdf\x7f\xfe\xfe\xeb\x97\xf3\xff\x09\xe3\x58\x8b\x7d\x5f\xb7\xeb\xa0\xb3\x2b\x39\xc1\x5a\x13\x64\xa6\x53\x85\xbd\xed\xef\x2d\x12\xdb\xa1\xe9\xa1\x30\xf6\x2b\x42\x1a\x2f\xf6\x48\x1e\xc5\x61\x4f\xb8\x8d\x5c\x89\xb9\x8d\xff\xbd\x65\xe3\xf3\x9f\x97\xff\xfd\x95\x59\x49\x54\x66\xc5\xaa\x82\xd6\x2a\xe4\xac\x6c\x03\x62\x9a\x49\x58\xe8\xc1\xde\x22\x85\x1b\x39\x71\x11\xc5\xd1\x40\x88\xd1\xf8\xb1\x97\x22\x3f\x0e\x5a\x83\x88\xb5\x53\xb5\x4b\xf7\xee\xc5\x58\x58\x68\xb8\x9d\x3f\xef\x84\x19\xf6\x3f\x65\x0d\xab\xb9\x87\x4c\x8f\xf6\x01\x70\x9d\x41\xf1\x2b\x20\x05\x85\xe5\xf4\x01\x30\x4c\x36\xfb\xe6\x6e\xe4\x24\x65\x1c\x87\x40\x42\x68\x08\xe2\x20\x2b\xa2\x28\x06\x2a\x9a\xaf\x2f\x30\xb7\xa5\x4d\x63\x9a\x06\xc1\xf3\xc0\xad\xfd\xe9\xcc\x1a\xc1\x7e\xac\xbb\xcc\x98\x6f\xf6\x8a\x5f\xab\x40\x0a\x4a\xdb\xae\x02\x20\x71\x6b\x5a\xe5\xc5\x4e\x94\x27\x71\x02\x74\xb6\x22\xee\xc2\xd8\x2f\xb2\x60\x36\xc8\x6a\xa8\xda\x77\x9b\x63\xfb\xf2\xf5\x0b\xa7\xff\x12\x52\xb9\xce\xb4\x32\x44\xa6\x4b\x87\x08\x98\x2e\x6d\x76\x36\xed\x75\xe0\x86\x83\xe3\x54\x61\x6b\x15\x7b\x17\x55\x7e\xe2\xe1\x22\x49\x22\x36\xba\x6f\x52\x90\xf8\x25\x89\x92\xb0\x47\x7f\xb0\x2d\xc9\x86\x01\xe7\xc6\x27\xe9\x3f\x44\x1c\xb5\x99\x0c\x7f\xfa\x59\x04\x52\xfc\x7f\xe0\x9b\x88\x2c\xf4\xe2\x3c\x88\x74\xbb\x0a\x63\xa2\xe6\x32\x2e\xfa\x80\x98\x6e\x1b\x00\xc3\x48\xf6\x16\xd1\x68\x15\x47\x3e\x1e\x48\xec\x01\xbb\xd2\x08\x71\x69\x82\xa3\xb0\xf9\x26\x91\xb8\x04\x85\xc3\x79\x62\x41\xc4\xeb\x48\x93\xbe\xac\x6d\x4e\x35\xc4\x4d\xb2\x21\xc2\x29\x99\xb0\x42\x45\x90\x1a\xee\x37\x29\x02\xbe\xf9\x4d\x52\xdc\x1a\xa8\x61\x6e\xbb\xdf\xa4\x10\xb8\x26\xd9\x9b\x58\xa7\x4d\x14\xfb\x59\x87\xd9\x75\x86\x8e\xb1\x41\x63\x94\x44\xed\x37\x09\xc7\x05\x28\xf4\x69\x1e\x8d\x21\xda\xa5\x8f\xed\xce\x24\x92\x35\x5c\x06\x48\x77\xe9\x10\x02\xcf\xfa\x26\x29\xfe\xb6\xdd\x80\x5c\xda\x1d\xc8\x64\x76\xae\xef\xcb\x5c\x5e\xd5\x37\x63\x29\x8c\x23\x2d\x12\xf5\x5d\x3b\x85\x9c\x12\xb5\x0d\x32\xd3\xae\x43\x20\x99\x6c\xae\xc0\x4e\x68\x47\x79\x1c\x07\x1d\x42\x83\x1f\x7b\x38\x8b\xe2\x99\x9f\x53\x8d\xbb\x4b\x8d\x2f\x35\xfd\xdd\x56\x8d\x27\x69\x22\x4a\xbc\xb3\x4a\x39\xaf\x96\x12\x0f\xf7\x2e\x6a\xbc\xa9\xc4\x81\x81\x90\x7b\xaa\x71\x17\xfd\x4b\xd6\xb8\x55\x2f\x35\xde\xfa\x91\x93\x9e\x6a\xbc\x89\xa2\xa0\x2c\xd8\xff\x34\xe7\x1a\xef\xb6\xeb\xee\x67\x5e\x77\x62\xca\x5c\xea\x4e\x2f\x42\x6c\x72\x52\x1a\xde\xa9\xee\xbe\x49\xae\x55\x87\xad\x53\xf2\xe1\x25\x6e\x9a\xc7\x29\x4b\x58\xe7\x27\x7e\x4e\xa2\x24\xe8\xfe\xf0\x7e\x32\xd5\xb8\xba\x70\x43\xbb\xe0\xc6\x8d\x02\x1f\xcc\xcb\xfa\x56\x31\xad\x23\x51\xde\xec\x7a\x08\x9b\x67\xc5\xcd\xe7\x5d\x1b\xa2\x9d\xbd\xb7\x36\x6b\xec\xfb\xad\xda\xc6\xa5\xa8\xed\x10\x78\xc6\xa0\x38\x15\xd0\x82\xf2\x54\x62\x16\x99\x4a\xac\xe5\x5b\x08\x3a\x21\x06\x0d\x48\x92\x0c\x73\x69\x93\xa9\xae\xd1\x13\x36\xdf\x96\xba\xce\x83\xd8\x14\x36\xcd\x81\x95\xb5\x16\x96\x96\x37\x84\xc0\xb1\x84\xc9\x2a\x8a\xfc\xbc\x67\x55\x1d\x73\x93\x67\xdd\x84\x88\x7a\x8b\xcf\xe6\xd4\xb9\xbe\xfe\x76\x31\xa7\x8a\x51\x26\x71\xea\xfb\xba\x53\x07\x40\x35\xea\xa9\xe0\x5c\x66\xcf\x0c\xf7\x16\xc1\x4e\x64\x07\x45\x14\x87\xcb\xa4\x9a\xc7\xac\xb2\x8d\x69\xbd\xea\xc9\x11\xb7\xb5\x8c\xef\x0c\xfc\xcb\xba\x69\x0b\x6b\x49\x14\x38\x9a\xb0\x56\xcd\xe5\x8d\x82\x52\x67\xc6\xac\xd2\x8f\x9c\x30\x0b\xa3\x04\x48\x16\x21\x1a\x6d\xe3\x38\x2c\xf2\x28\x4a\x81\xa1\x92\xe9\xfa\xd1\xdf\xa5\xab\x35\xc9\x9f\xcf\x6b\xfc\xd4\x24\x79\x2c\x8b\x20\x31\x3c\xd6\x23\x5d\xab\xe7\x2d\x32\x28\x6c\xde\x33\x5d\x13\xef\x2d\x52\x7a\xb1\x13\x97\x6c\x3c\x3a\x21\x62\x5e\xad\x93\x24\x01\xb6\xb0\x15\xc8\xfe\x79\xee\x2e\x6b\x7c\xea\xc9\xa7\xdc\xa1\x20\x34\x5c\xda\x87\x20\xe0\x55\xce\x72\x67\x3b\x65\x08\x54\x83\x99\xd3\x9a\x20\x62\xf6\x92\x04\x58\x2a\x4b\x5d\x1b\xc5\x7e\x99\x87\xac\xe8\x75\x32\x5f\x9f\xe1\x07\xb5\xf7\xb7\xb9\x3c\xe4\x3a\x57\x9b\x88\xf5\xb0\x21\x04\xb6\x43\xeb\x9d\x43\x5b\x0d\xf8\xac\xce\xed\x2a\xec\x2d\x56\xe7\x6d\x90\xf8\xb8\x8a\x13\xb6\x7e\x47\xb4\x8b\x92\xb0\xaa\xd8\xe2\xd6\x40\xb3\x3d\x97\xdb\xbb\x35\xef\xcc\x17\xfc\x53\xfe\xe4\x3a\x6b\x02\x22\x4c\x7a\x26\x37\xd9\x81\x80\x77\x96\x22\xea\x0d\x66\xd1\xe0\x25\x9e\xb5\x28\x4d\x81\x63\x20\x64\xd0\x3a\x49\xc2\xa6\x8c\x93\x14\x98\x3a\x62\x75\x08\x6a\x5e\xf3\xe7\x36\xe1\x25\x67\x4e\x55\x1f\xa2\x20\xd4\xed\x22\x02\xaa\x9e\xcb\x38\xef\x82\xcc\x72\xea\x10\xe8\x46\xbc\x57\xb1\x49\x53\x14\x87\x0d\xed\xcb\xa4\x06\x95\x81\x31\xa2\x01\x4e\xe2\x81\x76\x79\x52\x81\x5a\xbc\xd3\x98\xd9\xdc\x99\xd7\x36\x2f\x72\x29\x2f\xb5\x5f\xa7\x79\x90\x18\xbc\xad\x05\xe6\xa0\x98\x15\x90\xc2\xdc\x76\xe6\xda\x57\xb1\x46\x63\x12\x45\x1d\x6d\x98\xd9\x56\xc5\x38\xa0\x4e\x16\xa7\x40\x67\x2b\xfd\x06\xf4\xbe\xb0\x1b\x80\x7a\x97\x3e\x61\x77\xe1\x10\xdf\x51\xfb\x7f\xa9\xfb\x1b\x30\xc9\xad\xf2\x4e\x14\x3f\xef\x39\x92\x5a\xfd\x31\xdd\xaa\xfe\x98\xa9\xf1\xd7\x54\xbb\x3d\x33\x65\x66\xa1\xcb\x5d\x9e\x71\x4d\x58\x32\xda\x0d\x0b\x5a\xfe\xf9\x83\xc2\x65\x89\x62\xe8\x8c\x58\x12\x47\x64\x73\x6d\x11\x27\xb1\x7c\x59\x76\xb4\xf1\x05\x34\x81\x2c\x22\x0e\x58\x09\x04\x04\x61\x9d\x5a\xe2\x90\x5a\x42\x26\x85\x0d\x89\x12\x6e\x36\x95\xeb\x1b\x10\x4b\x20\xc5\xde\x00\x9a\x4d\x00\x39\x6b\x12\x65\x37\x1b\x0a\xbb\x74\xfa\x3e\xe7\x48\x55\x5d\xfd\x39\x63\xd8\xbd\xcf\x73\xc7\x4f\xbb\x55\x5d\xe7\xfc\xce\xd1\xfb\xfe\xde\x8f\x73\x74\x74\x8e\xce\x39\xd4\x18\x14\x9c\xed\x35\xb4\x81\x0d\x5a\x63\xdc\xac\x93\xb0\x66\xfb\xd0\x3f\xa0\x59\x6e\x97\xb2\xe0\x4c\xe6\x13\x07\xd8\xe5\xe8\x7e\x5d\xd7\x35\xcc\x2a\x4b\x3a\x47\x76\xd9\xae\xf1\xbb\x55\xeb\xba\x54\x0f\x94\xd8\xb4\x5b\x4e\x69\x89\x41\xa0\xd0\xbe\xe3\x58\x51\x16\xd8\x21\xd8\x32\x1f\x27\xe1\x48\xb0\xc5\xf4\x39\xf8\x01\xd3\xd0\x94\xed\xf6\xfa\xa6\x5f\xaf\x87\x66\xaf\xaa\x8b\x69\xa0\x25\xa6\xad\xba\xb1\xe7\x04\xa0\xaa\x41\xa0\xd1\xc8\xb5\xad\x3e\x8f\x8e\x0d\xb5\x94\x2b\x4e\xaf\xc7\xaf\x4a\x93\x7e\x75\x24\xd7\x6d\xdb\x64\x72\x55\x1b\xdc\x36\xe9\xc0\x74\x8c\x20\x0d\xdc\x00\x4c\x39\x0c\xeb\x34\x72\x1d\x2b\xc9\x98\x6b\xb7\x6a\xa5\x3f\xc0\x81\xe8\x4f\xde\xe3\x35\xdb\xf4\x4c\xb3\xba\xbb\xcd\x82\xb9\x81\x98\x06\x0d\xde\xa6\xcf\xdb\xb0\xeb\x41\xd0\xa0\x1d\xc7\xb5\x93\xd8\x73\x7c\xd0\xf9\x06\x79\xa3\xf9\x9a\x6b\xf8\x83\xd2\xdf\xc5\x6d\x25\x63\x39\x20\x23\x6d\xab\xc5\x63\x71\xaa\x80\xce\xac\x53\xa7\x7d\x0b\x4c\x1e\xf9\x63\xc3\xd5\x82\x7e\xc0\xdc\x9c\xef\xd3\x88\x8d\xc7\x07\x21\xbb\x6b\x1e\x8f\x53\xec\x4d\xd5\x77\xdc\xe3\x76\x48\xdc\xe9\x0f\x8a\x7b\xec\xf7\x01\x59\xdd\x86\x46\x53\x0b\x8c\x3a\xed\x89\x6d\xda\x07\xc7\xa2\x99\xd6\x4a\x2d\xa8\xd5\x12\x31\x65\x99\xa8\xeb\x58\xbd\x62\xda\xc4\x57\xd8\x8d\x06\x9e\xeb\x64\x5c\xc1\x46\x9d\xcf\x53\xb4\x50\x2c\xb8\x62\xb4\xd7\x27\x9c\x2b\x65\x5b\x61\x7f\x20\xdb\x3e\xc1\x0e\x4c\xab\xda\x88\xec\x41\xad\x4b\xc2\x76\x66\x76\xea\x5a\x62\x41\xad\xee\x89\x51\x10\x52\x3b\x70\xec\xb8\x70\x09\x69\x10\x04\x5b\x88\xaa\x1d\x3e\x75\xd3\x8b\xdc\x04\xa3\x41\x31\xcf\x84\xfa\x62\x7d\xbf\x36\xf7\xb7\x4d\x1c\x7b\x2c\xd7\x57\x99\xb7\xad\x65\x42\x83\x65\x8c\x51\x83\x85\xca\x16\x6f\xd5\xa1\x46\xdb\x71\x53\xda\x4e\xdc\x01\xae\xdb\x41\xd0\xa7\x4a\xd7\x0d\xa0\x41\x3b\x3d\x27\xc3\x55\x3e\x67\x69\xa2\x9e\xe8\xed\x6d\xf3\x10\x7f\xc0\xda\xd4\x99\x78\x99\x3f\xd0\x7b\x20\x5b\x11\xf7\x07\x6a\xdd\x1f\x35\xea\x25\xac\xd1\x0c\x37\x78\xa3\x35\xd6\x68\x8d\xb6\x63\x37\xc3\xb5\x72\xbf\x43\xe4\x92\x94\xaf\xbf\x9d\xe7\xb3\x03\xbb\x66\x23\x7b\x35\xd0\x4d\x3a\xd0\x0c\xda\x35\xd9\x55\x5b\xaa\x07\x91\xee\x18\x9d\x8e\xe3\x18\xfd\x80\xd5\x0f\x48\xca\xd7\x19\xec\xad\x2f\x28\xac\xbe\x31\x9e\xfc\xd0\x4d\x3e\xbb\x15\xe9\x3c\x65\xde\xae\x3f\x10\x8b\x31\xc0\xee\xfa\xa2\x4c\xf5\x3a\x9f\x7d\xb2\x2d\x6a\x58\x10\xd9\x7c\x26\x34\x32\x5c\xa3\xdd\x71\x5c\x23\xf5\x8b\xfa\xf1\x7e\xf5\x97\x8a\xfa\x55\x2c\x5b\xd4\xb2\x6c\x6a\x5a\x10\x9b\xbc\x7e\xa2\xbb\x66\xa7\xe7\xba\x2c\x7f\x47\x00\x35\x92\x48\xb1\xa4\x95\xab\x9e\xa7\x26\x3b\x20\x79\x79\x24\x77\xa1\xaf\xd3\x56\xd4\xa5\xaa\x89\x65\x8f\xcf\x07\x55\x59\xd8\xec\x45\xae\xe3\xf5\xf9\x3e\x46\x50\x23\x03\x8e\xb1\xf7\x1e\x18\x44\x17\x62\x9d\xaa\x51\x97\xb6\x4c\x8c\x7c\x8e\xd0\xb3\x5d\x27\x8a\x5c\xd7\xe9\xf1\x7b\xd0\xb1\x2f\xd4\xa4\x3a\xaa\x14\x6b\xdc\x14\x71\xea\x05\x30\x36\x2d\x92\xd2\x0e\x78\x96\x1b\x57\xcd\x72\x0a\x29\x60\x7e\x97\x5a\xa1\xdb\xca\xac\x22\x98\x75\x64\x2e\x4b\x13\x7b\x62\x75\xac\x8b\xc5\x89\x19\x7e\xa1\x4b\xf5\xf1\xac\xb2\x6b\x43\xa4\xf3\x49\x23\x06\xe2\x43\x95\xc6\x3d\xb7\xc7\x77\x7e\x05\x14\x62\x4f\xb4\xf6\xc5\x10\x11\xc3\x28\x27\xf4\x6d\x0b\xfa\x1a\x9f\x24\x1a\x61\xf4\xa2\x31\x86\x4f\x52\xa1\xb5\xaf\x3c\x04\x44\x23\x99\xcf\x50\x6a\x3a\xed\x99\x60\x16\xb3\xee\x89\x51\x70\xca\x1c\xf8\x05\x27\xfd\x89\xfa\x3b\x66\x11\x11\x8d\xaa\x7c\xc2\x58\xe3\x9c\xb2\x34\x5e\x9f\xa6\xb6\x63\xf6\x63\x9f\xc5\x81\xf2\x8c\xe5\xc3\x79\x55\xc3\x68\xcc\xab\x92\x17\x91\xe6\x6a\x61\xdb\x71\xcd\xa4\xe4\x55\x74\x08\xaf\x14\x26\x07\xcb\xe2\xf5\x13\x83\xb6\xd8\x10\x94\x0d\x96\x62\xb7\x18\xdd\x5e\x83\x13\xdd\x49\x56\xed\xcb\x89\x31\x2f\xaf\x5d\xbf\x64\x65\xdf\xf1\xbc\x38\x76\x1d\xb7\x5f\x72\x2a\xe4\x9c\x52\xc6\x9c\xda\x31\x9b\x1d\x81\x6b\xd1\xb8\x9c\x95\xac\xd3\x50\xaa\x07\x0d\x36\x62\x08\x40\xa6\x59\xd7\xed\x80\xcf\x37\x80\x2d\x38\x55\x3f\x88\x53\x46\x95\xc9\xd1\x2a\x9e\x50\x4e\x70\xca\x83\x3a\x8d\xe3\xeb\xe3\x94\xa1\x30\x0c\xb3\x7c\x52\x67\x14\x9c\x32\x83\x11\xa7\x22\xbe\xa3\x2e\x20\x87\xd8\x42\x6b\x07\xc6\x04\x27\x7a\x4a\xc1\x09\x9d\x76\x4c\x30\x75\xee\x67\xe8\xc0\x72\xac\x88\x73\xa2\xdc\x53\x16\x39\xfc\x1d\x98\x1d\x18\x78\x1b\x43\x06\xab\xe0\x55\x34\x9e\x89\x67\xb1\xde\xcd\xb6\xd0\xe8\x51\x2b\x5f\x73\xe4\xf0\xe7\x41\xfb\xf4\x63\x40\xcd\xf1\xbd\xf8\x16\x74\x74\x6a\x30\x6e\x66\x16\x9f\x5d\x71\x5d\x50\x4b\x6e\x76\x49\x6d\x97\x3c\xc6\xfd\x18\x50\x43\x1e\x71\xcb\xb3\xa0\x53\xcc\x90\xd3\xc4\x76\x9d\x94\xc5\xc9\x51\x3f\xa0\x46\xba\x13\x7e\x6b\x65\xb7\xd3\xe9\x70\x82\x74\x23\x46\x10\xc5\x2d\xdc\x56\xea\xba\x5e\x92\x78\x4e\x90\x15\xfd\x80\x1a\x09\xf7\xf5\x7d\x4b\x3b\x7d\x5f\x44\xb5\x31\x48\x23\x71\x3d\xbf\xdf\x67\x44\x41\x7e\xb1\xce\xac\x2a\x14\xf9\xf3\x01\x3c\xf3\x2c\xda\xd3\x4c\x1a\x5b\xe0\x36\x28\xcb\x54\x5b\x54\xeb\xb8\x21\xd4\x8b\x99\xef\x7e\xc9\x33\x03\x32\xb1\x2a\xc9\x13\x3e\x70\xe2\xa9\x8e\x10\x51\x15\x57\x2d\x6a\x32\xef\x65\x25\x20\x57\xa9\xc9\x91\x6a\x91\xcb\x0f\x0b\xeb\xbb\x16\x38\x59\xb9\x67\x31\xf2\x70\x55\x34\x0e\xe8\x93\x88\xa8\x86\x15\x93\x1a\x66\xe1\xc4\x54\x6a\xf0\xec\xb9\x1a\xb9\x5d\xd0\x68\xb7\xcf\x92\x65\x25\x28\x63\xa3\x79\x30\xe7\x62\x36\xa2\x2a\xfc\x98\x0d\x86\x46\xbb\x5c\x4f\x96\x6b\x31\xe9\x38\xe5\x39\x2b\x80\x6c\x1c\x09\x3a\xcf\x9b\xd0\x9e\xa7\xa4\x0c\x85\xd9\x61\x9f\x05\x58\xfe\xf4\xab\x2d\xa6\x41\x8d\x32\x2f\x90\xa4\x2c\xf7\x32\x6a\x01\x02\xd4\x26\x0a\xe7\xcb\xbe\x18\x03\x6a\x73\x67\x66\x59\x7c\xe6\xbe\x45\x79\x5a\x4e\x7b\x8e\x6b\xf7\x33\x96\xb5\x1a\x4a\x30\xb2\xc1\x62\x7d\xf2\xae\xa7\xbf\xc2\x80\x5a\x2c\x34\x94\x26\x18\x6b\xd4\x10\xd3\x80\x7a\xac\x6e\x95\xc6\xcc\x19\x04\x23\xce\xe9\x93\x9c\x9b\x34\x64\xc9\xcb\x7b\x9d\x22\xd0\x4d\x72\xae\x4e\xd3\xc0\x6b\x03\xda\x42\x1d\xb7\x3b\xf2\xcd\x50\xc3\x6d\xa9\x2f\xa6\x07\xe3\xf4\x35\xda\x28\x70\xea\x4e\xde\x11\xd3\xa0\x45\x7b\x6d\xaf\x0b\x35\x9a\xb0\xcc\xcd\x28\x65\xab\xa2\x58\xa8\x8b\xbd\xdd\x7a\x46\x65\xd8\xe4\x3e\xae\xa7\xf2\xe5\x1d\x7e\x83\x86\x62\x2f\xe8\xe4\x09\x73\x4b\x16\x75\x33\x17\x10\x6e\xf1\xb3\xe2\x78\xbe\x87\x0e\xc0\x11\x22\xaa\xc1\xc0\x1e\x3d\xf5\xeb\x37\xa8\x21\xf6\x82\x20\xef\xa6\x6e\x1f\x02\xea\x0c\x18\x8e\x1a\x14\xb9\x0c\xea\x8b\x2d\xb1\x37\xc1\xe1\x53\xe8\x34\x86\x02\x88\x11\x0f\x32\xab\x43\xd3\x9a\xcd\x4c\x3b\x6e\x71\x24\x2f\xef\x25\xae\x01\x46\x9b\xda\x5b\x88\x61\x19\xfc\x6c\x52\xd4\x23\x99\xd0\x90\x54\x34\x8b\x8e\x21\x74\xd0\xbb\xf1\xd8\x89\x93\x24\xee\x27\x09\xdf\xf7\xcb\xf7\x3c\x92\x75\x1c\xb7\xdd\x76\x9d\x0e\x44\x46\xb1\x41\x8c\x31\x7a\xef\xae\x5f\xbe\x67\xf5\x9c\xf0\xfa\x6d\xd7\x65\xd9\x56\x1b\xba\x0c\x8b\x61\x16\x78\x19\x19\x88\xf2\xb8\x7f\x07\xec\x81\x40\xd0\xc4\x5e\x0b\x32\xcd\xf8\xde\x07\xdd\x4e\x87\x0c\x3a\x8e\xdd\xe9\xd8\x4e\x87\xc1\xb6\x4c\xb3\xd5\x32\x38\x66\xcc\xf7\xd3\x9a\xc4\xdc\xd8\x8b\xc9\xf7\x53\x50\x00\x0d\x40\xa1\xd9\xa0\xdb\xed\x44\x9d\x6e\x97\xc4\x91\xc7\xf7\x51\xe8\x61\x64\x6b\x9a\xcd\x7e\xd8\x38\xc9\x22\x89\xe4\x49\xce\xde\x7e\x42\x8d\x63\xd6\x38\xe6\x80\x76\x69\x17\xb4\xe2\x3f\x76\xbd\x85\xb2\xc1\x00\xd0\x60\x40\x92\x9e\xe7\xf6\x7a\xae\xd7\xc3\xb2\xad\x69\x8e\xa3\xa9\xce\xff\x04\xdc\x51\x7f\x99\xbf\x20\x3d\xbe\x56\x6f\xa7\x9e\xf0\x0e\x3d\x55\xbb\x59\xd6\x8d\xb2\x2c\xb2\x83\xc0\x76\x82\x00\x47\x03\xbe\x0d\x43\x6f\x0b\xe1\x41\xdb\xf3\xc3\xd0\xf7\xda\xc5\xbc\x18\xee\xf1\xbd\xd0\x4a\x3c\xd6\xcf\xe6\x06\xda\x25\x53\x6c\x26\x34\x03\x39\x4d\x40\xa6\x83\x24\xe8\x76\x03\xbf\xdb\xc5\xbd\x41\xaf\x37\xd8\x42\x51\x6f\x80\xb3\xb6\xe7\xb5\xdb\x9e\xdb\xe1\x98\x1d\xdc\x13\xbc\x6b\x62\x86\x29\x53\x7d\xda\x67\x5a\xea\x1f\x8c\x59\xf6\xb3\x27\x20\xa1\x31\xd6\xfd\x35\xf9\xc9\x77\xf7\xf1\x7d\x01\x4d\x6e\x42\xa2\x9a\xa6\xba\xcd\xf7\x8e\xd0\xd8\x47\x8e\xbb\xf0\x7a\x69\x12\xc7\x69\x1a\x7b\x9e\xef\x7a\xbe\x4f\x3a\x3b\x36\x83\xb1\x6d\x4d\x2f\xd7\x06\x66\x02\xba\x1e\x6e\x8e\xf8\xbe\x83\x9b\xac\x97\x4e\xb7\xeb\xb8\x1d\x88\xcd\xa2\x97\x66\x61\x43\x9d\xf2\xdd\xa9\xe7\xc0\x77\x06\xc8\xf8\xce\x7b\xda\xf3\xbc\x08\xcb\xb6\xce\x78\xa9\x97\x7c\x1f\x1c\xc6\xcb\xd5\x03\x78\x49\x07\x69\x06\x08\xd0\x20\x23\x83\xc8\x75\x59\x22\x1a\x41\x66\xab\xaa\xcd\x7e\x38\x6e\xff\x3b\xc1\xdd\x42\x59\x81\x3b\x20\xfd\x9e\xe7\xf5\x62\x46\x78\xc5\xe1\x86\xa4\x39\xff\x9f\xe5\x3b\xba\x16\xdf\xc3\x4e\x27\x0c\x3a\x1d\x86\x19\xb1\xf0\xb7\x0b\x94\xf1\xb3\xfb\x9d\xf0\xb3\x5b\x78\x39\x2f\x82\x81\x55\x78\x0d\x6b\xc4\x77\xf3\xfa\xf0\xd2\x5e\x9c\x66\x3d\xd7\xf7\x5d\x37\xf0\x89\x19\x87\x61\xbf\x1f\x86\x31\xd6\x5d\xd3\x74\xd9\xcf\xc8\xbf\xff\x0f\xe7\x26\xca\x88\xf5\x5c\x31\xd3\xac\xdb\x2d\x30\xad\x7e\x10\xc6\x71\x18\xf4\x59\x4f\xf9\xa6\x96\x6e\xc1\x77\x5f\xf2\x0f\xf1\xc3\x1b\xb7\x15\xbc\x8c\x68\x07\x74\x50\x41\x63\xe9\x62\xe9\x87\x07\xfc\xd5\x91\x7e\x10\x24\x49\xe0\x27\x58\xf7\x0c\x86\x6b\x78\x05\x8f\x54\xd2\x93\x6a\x23\x79\xe2\xb3\x77\x2e\x36\x37\x16\x0f\xe0\xe5\xa0\x3b\xe2\xa5\x0a\x4a\x92\xb2\x50\x97\xf4\x69\x4a\xf4\x28\x0c\xbb\xdd\xb0\xdd\x45\x25\x8f\x74\xc1\xdb\xc6\x44\x23\x1e\xa1\x1d\x98\x41\xc2\x78\x94\x24\x4c\xa2\x49\xd0\xe9\xfa\x7e\xd4\xc5\x3a\x28\xfd\x82\x59\x7d\x9a\x11\x35\x0a\x82\x88\xfd\xfc\xcf\xd1\x7d\x0f\xb7\x85\x86\x24\x5f\x0b\x8f\xd9\x63\x2f\xcb\x7a\x4e\x10\x38\x6e\x10\xe0\x76\x16\xb1\x3f\x45\x19\xee\x05\x2e\xdf\x40\x3f\x18\x71\xa9\xf5\x9d\xe9\xbd\x1d\x45\xa4\x95\xb4\xdb\xc9\x78\x27\x21\x9f\xfd\x70\x4c\x1c\xf0\x3d\x8b\x76\xd8\xb9\xb0\x4b\x96\x04\x0d\x68\x0a\xd5\x41\x06\x55\x9a\x66\x9d\x28\xea\x84\xbd\x08\x07\x83\x28\x1a\x0c\xa2\xee\x16\xc2\xc9\x28\xbd\x41\x05\x97\xac\x03\xb8\x74\xeb\xd8\xc7\xdd\xb6\x8b\x4b\x6d\x1a\x0d\x06\x85\x8b\xdb\x42\xc4\x4a\xc2\x76\x9a\x85\x41\x8a\x9d\xa0\xd8\xe1\x30\x60\xb8\x38\x90\xfc\x71\x5f\x6b\x4c\xef\xab\x35\xa6\x77\x8e\x2b\x70\x8e\x32\xdc\x1e\x6d\x73\x5c\x15\x8c\x02\x17\x50\x36\x60\xde\x03\x07\x80\xba\x5d\x76\xd5\xed\xd0\x01\x4e\x46\xd9\x13\xc2\xc8\x41\x19\xe9\xf1\xf7\x23\x8f\x21\x74\xf2\x56\x5c\x51\x18\x4f\x2b\x0a\x26\xb7\xe2\x91\x1c\x30\xae\x31\x9e\x76\x06\x83\x0e\xe3\xa9\x15\x86\x19\xe8\xd0\x80\x16\xef\x7f\x4c\x63\xda\x11\x6c\xe6\xa9\x07\x03\xe6\xad\x8b\x75\x07\x28\x13\xb4\x6d\x5c\x54\x51\x18\x57\x2b\x0a\xe2\xb8\xac\x0d\x86\x6b\xc6\x34\x05\xa5\x1f\x33\xf9\xc6\x7c\xc3\xb6\x28\xca\xc0\x80\x3a\x34\xf8\x3d\xc4\xb4\x4f\xdb\x1c\x3b\xdd\x42\x80\xd2\x14\x64\x66\x07\x28\x13\xdc\x6b\x62\x07\x93\xd8\x85\xd3\x3b\x14\x9b\xf5\x1c\x23\x93\x04\x42\x5b\xaa\xa1\x39\x74\x1c\x21\x28\xa6\xa3\x9b\xfc\xa1\xc3\xc9\xd1\x07\xe5\xd8\xd4\x29\xc8\xb4\xcc\x80\x56\xcd\x73\x74\x13\x5c\x35\xd3\x41\xa9\x05\x7d\x3d\x14\xab\x3d\xd7\xf2\xa1\x55\xab\xa7\x86\xa5\xe9\x3d\xcf\xf2\x40\xd7\xf4\x2d\x64\x59\x7a\x21\x17\x12\x1d\x82\x7f\x6e\xf4\x01\x23\x35\x33\xa0\xc6\xf0\x75\xb0\x1b\x5d\xbd\x5f\x0d\x62\x3d\x14\xe5\xd8\xb1\x3c\x68\xb5\x5a\x7d\xc3\x52\xd5\xd0\xb2\x1c\x50\x2c\x7b\x60\x5a\x1a\x7f\x86\x59\xac\x53\x28\xb1\xc5\x7d\xb0\xd9\x98\x02\x6b\x3a\xed\x9b\x60\xd4\xc3\xb6\xee\x42\x5f\xed\x1b\x83\x5a\x08\xc8\x88\xc4\x6a\xec\xda\x3e\xb4\x34\x2d\x35\x2c\xd5\x8a\x2c\xcb\x83\xba\x61\xd2\xc4\xb2\x4d\xf4\xff\x02\x7e\x42\x92\xa9\x9a\x64\xec\xc2\x57\x38\xfe\xe8\x83\x38\x75\x1b\xee\xe9\x7c\x3a\xa0\xde\x8e\xac\x00\x3b\xea\x16\x32\xa1\x5e\x6f\xf3\xc5\xcc\x62\xa3\xe7\xb9\x2e\x34\x98\xc8\x4d\xc7\x08\xf8\x52\x87\xaa\x69\xd2\xcc\x72\xad\xa2\x8d\xc1\x3e\x6d\x2c\x5f\x7f\x1b\x5b\x48\x6c\x74\x5d\xd7\x81\x9a\xa6\x0d\x4c\xc7\xf0\xda\x8e\xe3\x80\x62\x98\x5b\xc8\x72\x0c\x54\xac\xf5\x31\xb9\x9f\x9e\xd0\x71\xa5\xc9\x9f\x33\xc0\x24\x87\x88\xaa\xa6\x16\x54\xeb\xed\xcc\xea\xd2\x16\x5f\xf3\x52\x6b\x07\xa6\x4d\xfa\xa9\xef\x84\xe0\x40\x83\xf6\x28\x5f\xc4\x59\x4d\x7c\x37\x04\x37\x8a\x68\x66\x39\xc5\xbe\x1f\x2a\x9f\x57\x1b\xb5\x81\xb7\xbb\x7e\x6a\xfb\x03\x6b\x23\xd6\x58\xd7\x5b\xb5\x36\x20\xb3\x47\x51\xf1\xd0\xba\xde\xf6\x4c\x5b\xa8\x6f\xa1\xd0\xe9\x80\x97\xa6\x34\xf0\x1c\x07\x1a\x5b\x28\x74\x3b\x10\x3a\x2e\xed\xba\x4e\x99\x17\x98\x7c\xfd\xd0\x9e\x76\xf8\xbd\x4c\x7c\x10\x54\x8d\x0e\x4c\x68\xd5\xc3\x81\xd9\xcd\xbb\xfc\xb1\x8d\x59\x0f\x43\xd3\x15\x54\x36\x78\xef\x40\xd0\x8b\xa9\xe7\x3b\x0e\x54\xd3\xc0\xed\x80\xeb\x07\xb4\xe7\x38\x25\xaf\xda\x42\xb8\xcd\xab\x03\x6d\x6e\xa0\xa5\x06\x54\x6b\xbe\xa3\x1b\xe0\x68\x09\xb7\xb9\xd8\x08\x19\xad\x2c\x1f\x54\x4d\xef\xeb\x96\xd6\xe8\xd9\xa6\x07\x2d\xc7\xa1\x03\xd3\xd4\xca\x35\x35\x91\x10\x48\xea\x61\x36\x57\xe0\xf3\x55\x3a\x25\x7e\x2b\x34\x7a\xb5\xa0\xa7\xb7\xb9\xcd\xf9\xd0\xd2\x75\x66\x73\x5a\xc7\xb2\x5c\xa8\xd9\x0e\xcd\x6c\xab\x1c\x2b\xd8\x24\x12\xfd\xc3\x39\xb5\xbc\x6d\x17\x66\x23\x08\xb9\x5d\x6c\x21\x03\xea\xf5\x00\x90\xd1\x13\xab\x1d\xc7\x76\xa1\x66\x18\x89\x6e\xab\x7a\x97\x19\x79\xc3\x71\x06\xa6\xad\x73\xfc\xee\x81\xf8\x93\x76\xd7\xd2\x69\xca\xed\xce\x37\x1c\xc8\xd4\x78\x6c\x77\xa8\xe7\xd8\x3e\x34\x0a\x47\x61\x73\xbb\x6b\xb8\x2e\x1d\x58\x96\x56\xd8\x44\xff\xba\xec\x2e\xe2\x4f\xfb\xec\x46\xbb\x67\x86\xbb\xed\xae\x1a\xb9\x8e\x07\x2d\xee\xea\x8a\xc5\x1c\x1e\xa8\xaa\x46\xfb\xb6\x6b\x6c\xb7\x61\xff\x8f\x68\x83\xd9\xe0\x76\x1b\x86\x39\x6e\xa3\x81\x75\xc1\xdf\xe3\x5b\x95\x49\x1e\x2d\x4f\xda\xdd\xc0\xea\xd2\x46\x69\x77\xbe\x69\x93\x64\x10\xb8\x5d\x68\x67\x03\x1a\x78\xae\x35\xe8\x7b\x6e\x08\x56\x92\x0c\xcc\xd2\xe6\x1a\xd8\x9d\xb0\xb9\xfd\x7d\x07\xe7\x91\xc1\x57\x7f\x35\xda\xa1\xe9\x40\x8f\xaf\x0b\x69\xd5\xdb\x03\xb3\x2b\xe8\x69\xe0\xf8\x60\xa6\xd9\xc0\x74\x74\x2b\x6b\x3b\x6d\xf0\xb3\x01\xed\xb8\x8e\xc9\xd7\xf4\x78\x13\xb6\xb6\xbf\x8c\x8e\x15\x7a\x66\xf8\xf5\x76\x68\xd9\x90\x8e\xf1\xad\x8e\x60\xf1\xd7\x84\x8c\xb8\xcf\x1c\x85\x69\xf1\x35\x4b\x7e\x9a\xd1\xf6\xb6\x3d\x13\x5f\x08\xaf\x1d\xdf\x30\xd2\x07\x2c\xbe\xf9\x96\xae\x83\xa3\x65\x3a\x54\x6b\x61\xcf\x08\x84\xac\x67\xdb\xcc\xbf\x6a\xb1\x6e\xab\x5a\xe4\x5a\x1e\xa8\x4c\x21\x76\x19\xdf\x4c\x62\x5d\x2b\xbe\x71\x19\xf5\x5b\x7d\x0b\xe4\x5a\xdb\x36\x75\x70\x1b\x5d\x33\xad\xb6\xfb\x46\x57\x88\x13\x8f\xdd\x80\x61\x32\xea\x9b\x5d\xd7\xf6\xa0\xee\xfb\x34\xb1\x1c\xb3\xcc\x2b\xf8\xda\x19\xf5\x1a\x3c\x1a\xc9\x48\xad\xb7\xdb\x86\x0b\x09\x77\x82\x8d\x7a\x08\xb2\xd1\x13\xb2\xc4\xb7\x03\x30\x0d\x83\x66\x96\x6d\xd8\xc5\x27\xd7\xa5\x7d\xdb\x36\xca\x36\x4c\xd1\x3f\x40\x0f\xbb\xec\x8d\x2f\xbc\x6b\xdb\x86\x05\x59\xab\x6f\x32\x7b\x93\x8d\x48\xe8\x27\xbe\x13\x80\xa1\xeb\x1c\xd3\x89\x1c\xdb\x03\xd5\xf3\x69\xc2\x5a\x60\xb6\x10\x4c\xd5\x0f\xb0\xb7\xa9\x09\x5b\x88\x75\xda\xe3\x31\x28\xb1\xda\xd8\x6e\xa5\x16\x28\xb5\x36\x58\x26\xcd\x44\xb9\xcf\x5a\xd0\x0b\xf2\x5b\x51\xc2\x02\x86\xdd\x52\xb9\x23\xe7\xf7\xd0\x27\xd6\xf5\xb5\x61\xd0\xc8\x04\xb7\x51\xb6\x91\x14\x6d\xb0\x80\x29\x64\x59\xe0\xb4\xc1\xd5\x0d\xda\x75\x5d\x2b\xe1\x41\xc9\xd6\x34\xea\xf8\x8e\x5b\xd8\x03\xc4\x13\xf6\x86\x27\xe2\xdc\xc9\xc9\x0f\x10\x6e\xdb\x18\x78\x63\xdb\xeb\x10\xbe\x88\xae\x0b\x21\x54\x69\xc2\x17\xb3\x6a\x34\xeb\x38\x3d\x88\xa1\x45\x23\x6a\xfb\xae\x8d\xca\x35\x36\x3d\xb1\xb5\x53\x1f\xe3\x76\x46\x1f\x58\xe0\x4b\xb5\x62\x61\x49\xbb\x6d\xba\xd0\xe3\x1f\x5a\xf5\x10\x14\x2b\x22\xbd\x41\xe0\x74\xc0\x87\x06\x8d\x59\xd8\xd1\x6d\xd6\x52\x0c\x3d\x50\x69\x97\x5a\x81\xc3\xc7\x97\x16\xf4\x76\xc7\xba\xfd\xee\x07\x97\xab\x12\x1a\x61\xdb\xf4\x20\x29\xd6\x7a\x84\x03\x33\x22\x29\x1d\x74\xdd\x08\xba\x7c\x93\xf4\x8e\xe7\x58\x01\xed\xf5\xca\x66\x22\x6a\x06\x8e\x57\xda\x48\xed\xfa\x72\xcc\x52\x56\x96\xa1\x83\xd5\x4a\x4c\xa6\x1a\x66\x24\xdd\x34\x70\x02\xb0\x6c\x3b\x33\x6c\xad\xd1\xf3\x6c\x1f\xd4\xa8\x47\x53\x9b\xa5\x51\xc5\x1a\x16\xc1\x17\x07\x07\xf8\xc1\x09\x1b\xe4\x4b\x46\xea\x6d\xdd\xd0\xc1\xab\x07\x66\xb7\xda\x8e\x8c\x40\xd0\xfa\x7c\xa1\x48\x37\xa2\x99\x69\xeb\x2e\x67\x6f\x23\x49\x19\x7b\x0b\x7c\x03\x67\x62\xb1\x8f\xc4\xe1\x36\xd8\x30\x8a\xe5\x05\xed\xd0\x74\x21\xe5\xab\x7e\x8a\x44\x24\x12\x3a\x03\x76\x0b\xfc\x75\x2e\xd3\x31\x9c\x8c\x25\x22\x2c\x25\xe8\xba\x5c\xe9\xec\x1e\x3a\x62\x20\x66\xdb\xf7\x30\x36\xbb\x1d\xbe\x50\x68\xb4\x22\x6b\xc0\x0c\xdb\xea\xb1\xb4\x23\xb3\x40\xaf\xb7\x5d\xd3\x14\xea\x05\x5f\xbb\x5d\x1a\xba\x8e\x9d\xa4\x81\xdb\x06\x8f\xb5\xe0\x39\x06\xb7\x0f\xed\xba\x62\x5e\xac\xd3\x2e\xb7\x8f\xcc\xea\x62\x6b\x44\x30\x30\x2c\x3a\x10\xfa\x03\x66\x20\x9e\x65\xd3\xc4\x76\xf4\x20\x0d\x9c\x10\x5c\xc7\xa5\x6d\x9f\x19\x21\x46\x7d\x1c\x4e\xd5\xc7\xf7\x30\x99\xa3\xed\xb4\xc1\xae\xc1\xf3\x82\x7a\x1b\xaa\x56\x8c\xdd\xd2\x33\x32\x43\x4f\x05\x83\x66\x6d\x66\x23\xae\xc7\x7a\x6e\x75\x0a\x4b\x0f\xdb\x34\x60\x8d\x60\xd4\x40\xb1\xe0\x88\x31\x5f\xf7\x81\xef\x68\x2c\x9d\x3e\x37\xa2\xe9\x3a\x4c\x49\x53\x93\xc6\x82\xcf\xb2\x3f\x84\xf6\xa0\x1e\x7a\x96\x56\xab\xca\xb5\x56\x0b\x1a\x16\x28\xf5\x76\xdf\x32\x6c\xb9\xae\x6a\xa0\x7a\x8c\xbe\x3e\xb5\x68\xc7\x75\xb5\xc0\x6c\x78\x96\xdd\x73\x33\xdc\x00\x93\x06\x54\xee\xba\x06\xd4\xcd\x56\xdb\xf1\x8a\xb5\x35\x91\x58\x17\x63\x34\x87\x6e\x62\x6d\xc3\xa4\x31\x6e\xb7\xfb\x02\x38\x3b\x35\x0f\x24\xd1\x68\x66\x73\xd9\x21\xab\x33\xf4\x79\x16\xda\x31\x55\x4b\x69\xb4\x71\x4c\x7b\x7d\x37\xc1\x32\xb4\xa9\x4e\xd5\xb6\xeb\x05\x6e\x0c\x19\x6f\x32\xf4\xbc\x56\xa2\x69\x41\xc6\xec\x13\xc5\x62\xf1\x4e\xf8\x5e\xfb\x9c\x68\x1a\x37\x74\x3a\xb0\x19\x0f\x62\x2b\x80\x44\x2f\x74\x16\x42\xd5\xea\x91\x06\x8d\x7a\x6e\x0f\xfa\xe0\x52\x87\xb6\x3d\xd7\xb1\x68\x1c\xb9\x7d\x48\xa1\x4b\x55\xaa\xb5\x5d\x8f\x3f\xb7\xeb\x0b\x16\x8f\x31\x13\x51\x9e\x29\x2a\xb0\x68\xd7\x82\xa0\xd5\x06\xdb\xa2\x89\x58\xeb\xb9\x8e\x0d\xb2\xe3\x24\x86\xa3\xb3\x7a\x02\xda\x53\x8f\x2b\xd8\xe3\xcf\x90\xca\x7a\x7d\x51\xed\x39\xac\x9e\xce\xc7\x28\x66\xf1\x2c\x2a\x24\xa9\x68\x71\x3e\xee\x6c\x93\x54\xf9\xe2\x93\x54\x0d\x31\xb2\xa8\x2b\x36\x7a\x6c\xec\xa1\x58\x76\x66\xba\x26\x5f\x67\xd0\xdf\x53\x8f\x3f\x80\xaa\x3a\xac\xde\x40\x0d\xf9\x7b\x39\xa2\x96\xb2\x71\x51\xdd\x30\xe8\x80\x55\x44\xc5\x5e\x4d\x03\x29\xe5\x39\x19\x82\xa6\xb4\xfd\xfc\x96\xc4\x81\x52\x4d\xf8\xc3\xf4\x38\xa2\x0d\x13\x9b\x92\xad\xa9\x89\xe9\x7b\x71\x3f\x74\xbb\xc5\xbe\x4d\x7c\xdd\x78\x71\x56\x14\x6f\xb7\xc9\xeb\x93\x41\x44\x5b\x06\xd6\xad\x76\x2b\x82\x54\xa7\x75\xd1\xce\x02\x37\x02\xcd\x49\x5d\xcf\xe3\xcf\x7b\x3b\x82\x52\xca\x08\x4f\xca\x48\x2f\x9f\xb3\x85\xfc\x7d\x27\xa1\x43\x7b\x4c\x51\xb1\xe3\x32\xad\xf0\xf3\xe8\x50\x03\x07\x42\x6f\xbf\xba\x41\xf9\xd6\x51\x1b\x62\x8b\xfa\x42\x40\xe3\x98\xf1\xb8\xdd\xa1\x56\xe0\x16\xcf\x62\x2d\x1c\x88\x4c\x37\x47\xca\xba\xe8\xae\x51\xe5\xcc\xa1\xa6\x0d\x32\xd4\x6a\x6d\xac\x58\x54\x17\x5c\xda\x8f\x3c\x13\xb4\x5e\x87\xd7\xf7\xca\x67\xb9\x89\xb0\x9f\x7e\x70\x60\xd2\xce\x24\x27\x22\x97\x0d\x07\x1d\x27\x33\x1d\x83\xd7\x73\xf7\xe7\xc4\x0e\x2e\xf5\x45\x94\xf9\xae\x0f\xaa\x6d\xd3\xd4\x2e\xe2\xde\xfe\x9c\x50\xb6\x39\x91\x8d\x75\x1b\xfb\x6c\x3c\x3a\xa9\x5b\x14\xf2\x77\xa6\xaf\x5d\xb7\xc1\xd7\xe8\xb1\x54\x25\xb6\x3d\x67\xc4\x8b\x6c\x7f\xdd\xf6\x98\x6e\x8d\x09\xdd\xa6\x4c\xb7\xaa\x93\x7a\xcc\x6e\xbe\xd3\x7a\xa8\x85\x7d\xa1\x7e\x00\x27\xba\x36\x84\x8d\x90\x3f\xe5\x16\x3a\xc5\xe3\xf5\xc4\x71\x69\xa3\xc3\xe7\xdc\x18\x27\x5c\xa1\x23\xa9\xfc\xb9\x74\xf9\xbc\xbf\x8c\x3e\xd8\xb7\xa8\x6d\x65\x2c\x71\x85\xae\x15\x0e\x84\x0e\xed\x24\xae\x05\x4e\xea\xb8\x54\xe9\xba\x3a\x34\x38\x2f\xdc\x83\x78\xe1\x52\xcb\x06\x04\xf5\x11\x2f\xda\xc5\x3a\x01\x3b\x75\xbd\xed\xf6\x5d\x62\x0b\x06\x8f\xe5\x07\xea\xd7\x34\x69\x22\x24\x29\x0b\xaa\x2d\xdb\x2e\x67\x22\x8a\xba\xc6\x75\xd5\xed\x17\xdc\x70\x1c\x9a\x4c\x70\xc3\x15\x8d\x7d\x78\xc5\xec\xde\xb2\x30\x52\x03\x48\x2c\xea\x0a\x83\xd4\x77\x3d\xd0\x2d\x8b\xbf\xf5\x3f\xaa\xab\x8a\xe6\x3e\xf2\x26\x35\xe6\x33\x78\xdd\xd4\xa2\x9e\x88\x68\xd6\x71\xbb\x10\x34\x5a\xd4\x0d\x79\xee\xc2\x74\xdc\x9b\xf4\x19\x8b\x3b\x7c\x46\x1f\x62\xe6\x33\x3a\xb4\x56\xfa\x0c\x3a\xb0\xfd\x20\x4b\xbb\x6e\xaf\xa8\xeb\xee\xae\xcb\x9f\xdb\x6f\xfb\x9b\x56\x6f\xe4\x6f\x74\x95\xc6\xae\xd7\x01\x99\x66\xb1\x97\xa0\x52\xd7\x55\xa1\x26\xd5\xc6\xba\x1a\x27\x1a\x58\x2b\x89\xd2\x06\xc7\x72\xfb\x82\xc6\x34\x9d\x40\x1a\x45\xb4\xde\x75\x35\xa8\x6f\xd7\xef\x94\xf2\xde\xc7\x7f\x64\xad\x36\x74\x2c\xda\x16\x7c\xea\x0e\xdc\x0c\xd7\x1c\x37\xcf\xfa\x6e\x5c\xfa\x8f\xaa\x68\x4d\xb4\xbd\xdb\x7f\x8c\x79\x62\x08\x26\x0d\x53\xd7\x06\x6f\x10\x84\xb4\x1a\xf1\x67\x40\x4c\xd7\x2d\xc1\xda\xb7\xed\x1d\x31\x45\xc8\x68\xd6\x76\xdb\xe0\xaa\x2a\x6d\xbb\x5c\x61\xdc\x77\x09\xfa\x7e\x75\x1d\xfe\xea\x79\xc0\x6e\xdb\xa6\x99\xe0\xd3\x7e\xec\xf6\xa0\xe7\xb8\xd4\x6c\xbb\xfe\x77\xab\x6b\xbe\xe6\xc3\xdc\xa7\xdd\xd2\x87\x0c\xd4\x76\xc1\x31\xaf\x5c\x8a\x63\x3b\xcc\x57\x07\x25\x4f\xcc\x83\x75\x5d\xf2\xa4\x4b\xeb\x85\xae\x35\xda\xf5\xfc\x2e\xd4\x68\xda\x77\xcb\xfd\xbf\x32\x1c\x4c\x29\x52\x75\x67\x7d\x38\x8d\x4a\xae\x64\x3a\xad\x25\x11\x55\x4c\xec\x4a\x55\x5d\xa3\x56\xe4\xa5\x60\xd1\x0e\x1d\xb8\x50\x2d\xf6\x80\x49\x84\x6a\xb9\xf7\x0c\x5f\x42\x51\x24\x07\xb7\xe1\x96\x51\x4e\x30\xf0\x15\x6c\xc4\xa5\xe6\x16\x72\x41\xc6\x16\x1b\x85\xe4\x61\xea\x16\xfb\x18\xb1\xbc\x2a\x2a\xd7\xbb\x60\x38\x7d\x6e\x04\x70\x0a\x61\xdf\xa6\xae\x9d\x72\xbf\x12\x5b\xed\x2d\x44\x3c\x6a\xd0\xcc\x75\x21\x86\x06\x07\xe9\xa4\xae\x09\xa5\x8d\x3b\xa8\x2f\x1a\x62\x5a\xf0\x66\xbb\x1f\xa7\x10\x4e\x6d\x6a\x31\x47\xdc\xc6\xb2\x15\xd1\x84\x78\xd4\xa4\x99\x0b\x4a\xd9\x93\x31\x88\x80\xba\x02\x12\x98\x1e\xa6\xd0\x2c\x5a\xe2\xcf\x00\x9a\x67\x9b\x95\xd5\x4a\x73\xe9\xec\xda\xca\x8e\x6b\xdd\x0e\xa9\x11\xd8\x36\x46\x4e\x40\xf5\xd0\x71\xc4\xc0\xcb\x13\x5c\xa3\xb6\x6d\x83\x3c\xbe\x64\x98\xa4\xc7\x7d\xcf\x73\xc1\xb4\x03\x6a\x84\xb6\x2d\x3a\xed\xbc\x8d\x0d\xaa\xba\x2e\x54\xc7\x97\x48\x40\x89\x80\xc4\xaa\xa4\x5e\x07\xa6\xdb\x09\xa9\x12\x76\x3a\x58\x6f\x87\xb4\x1a\xb6\xdb\x62\x3b\xc8\x23\xac\x52\x9d\x61\x8e\x2f\x19\x26\xc9\xbe\x1b\xcc\x0e\xd6\xa9\xe6\x79\x50\x1b\x5f\x22\x01\x2c\xa1\x2a\x05\x3b\x30\x57\x0b\x1c\x38\xbb\xba\x32\x79\x8d\x65\x90\xc3\xbc\xcb\x77\x06\xc7\xe9\xf6\xb5\x18\xdb\x79\x1f\xd7\xa9\xcd\x90\xc7\x97\x4c\x57\x60\x09\xf2\x77\x89\xdd\xf5\xf2\x1e\x6e\x51\x93\x49\x62\x7c\xc9\x79\xd0\xc1\x11\xf7\x21\x13\xb2\xa8\x14\xf7\x5f\x59\xab\xec\xb8\xd6\xdd\x90\xaa\xa1\xeb\x62\xe4\x06\x54\x0b\x5d\x57\xac\x01\x1a\x86\xc4\xcc\x5b\xfc\x68\xda\xde\xe4\xa7\x12\x3b\x11\xd2\xeb\xc2\x36\xda\x21\x55\xda\xed\x36\xd6\x46\x72\xae\x02\xdf\x7d\x35\x37\xf8\x0e\xea\xe1\xe4\x27\x8e\x9d\xe0\x44\xac\x5e\x17\xf6\x5e\x1d\x5e\x0b\xbb\x4b\x52\x9e\x5f\x5d\x07\x8f\x9d\x80\x1a\x81\xe3\x60\xb9\xbc\x10\xc3\x90\x93\x57\x63\x92\x1e\x5f\x72\xcc\xce\xf5\xda\xdb\x08\x73\x6c\x6f\x76\x27\xf7\xb1\x4d\x6b\x41\x00\x8d\xf1\xe5\xff\x1c\x1e\xa3\x84\xf4\xbe\x63\x4c\xbf\x93\x7b\xd8\xe1\xdb\xde\x37\xc6\x97\x8c\xbf\x24\xf9\x2e\xf9\x1b\xb9\x79\x88\x4d\xda\xea\x74\x40\x1b\x5f\x16\xb6\x41\xd2\xef\xde\x36\xb8\x9a\x98\x74\xc7\x97\x25\x7f\xf7\xe8\xec\x20\xdb\x28\x55\xb5\xad\x33\x05\x94\xa1\x4f\xec\xbc\x5e\xda\xc6\xc4\xa7\x12\x3b\x16\xb2\x9d\x72\xbe\xa6\x6d\x94\x02\x17\xeb\x50\x2d\xd1\xea\xfc\x30\xf6\x89\x4f\xa5\x6d\xf4\xc4\xda\x73\xb4\x8d\x11\x36\xb3\x8d\x36\x31\x72\x15\x6a\x34\x81\xee\xe4\xa7\xd2\x36\x82\xdd\xfe\xe2\x00\x7e\x18\x7b\x64\x62\x75\x73\x07\x7b\x54\x09\x43\x68\x8d\x2f\xf9\x99\xa9\xce\x75\xc6\x8d\x86\x17\x50\x2d\xf0\x3c\x2c\x97\x17\xa2\x19\xe5\x06\x6e\xe7\x59\xb7\x0b\xfa\xf8\x92\xf3\x38\xfc\x8e\x79\xec\x46\xb9\x89\xc3\x7c\xc0\xd8\x36\xbe\xe4\x98\xd6\x6e\x9f\x73\xdd\x98\x66\x94\x6b\xb8\x9b\x27\xbd\x1e\x6c\x5f\x72\xfe\xc6\xdf\x25\x7f\xc3\x90\xbb\x84\x3a\x93\xea\xf8\xb2\xb4\x8d\xe0\xbb\xc4\x0e\xda\x85\x48\xe3\x18\xac\xf1\x65\xc9\x5f\x4d\xb0\xc5\xc1\x75\xd9\x46\x48\xb5\x90\xfb\xc8\xe2\x42\xe8\x43\x6d\xa8\x93\xce\x30\x05\x93\x86\x30\x98\xfc\x54\x62\x3b\x42\x76\x7d\xd8\xbb\xf9\x2b\xa4\xa0\x0c\x5d\xe2\xe6\x55\xd0\x68\x17\xfa\x93\x9f\x4a\xdb\x70\xc4\xda\x75\x61\xef\xb1\x8d\x6b\x62\x77\x89\x25\xd8\xd7\x69\x1b\xa5\x4c\x50\x79\x21\x1a\xbd\x82\x14\x51\x04\xdb\x97\xfc\xbc\xc6\x44\x30\xc4\x64\x1f\x4c\xde\xdf\x89\x6b\xd5\x09\xa9\x1e\x4c\x62\x56\x7b\x39\x22\x28\x0f\x01\x6d\x21\x08\x26\x3e\x70\x2e\x6b\xdf\x0d\x97\xeb\xb8\x9f\x47\x69\x0a\xee\xf8\x72\xe4\x77\xae\xab\xaf\x7b\xfd\x0e\x4a\x86\x29\xa9\xe6\x6e\x11\x92\x27\x3e\x70\x1e\x5b\xdf\x25\x8f\xed\xb8\xe8\x66\xbf\x0f\xdb\x97\x85\x8d\xe0\x48\x0a\x76\xf4\x79\x84\x57\x59\xad\x4c\x5e\x0b\xd9\x36\x5e\x5e\x9d\xc0\x96\xfb\xc3\x84\xd4\x72\x07\xaa\x34\x85\xce\xc4\x87\x82\x13\x20\x0b\x96\x18\xa1\x59\xb4\x80\x6e\x44\x27\x10\x5a\x2a\x4f\x41\x3f\xbb\xb6\xb2\x76\x57\xb3\xb2\x06\xbb\x3e\x77\x03\x27\x0c\x9d\x20\x70\x1c\x30\x8b\x33\xd8\x99\x2a\x23\xea\x80\xf7\xac\xa1\xea\x09\x74\x58\x66\x08\x7e\xf9\x81\xdb\x0b\xc8\x42\xf2\x5c\xda\xe8\x14\x87\xb5\x87\xed\x36\x74\xc2\x76\xc0\x8f\xb6\x6f\x1f\xde\x46\x0a\xb2\x58\x7d\x2e\x6d\xa4\xe1\xe8\x1f\xb4\xc7\xcd\x1d\xd6\x06\x5f\xcf\x2a\x28\x25\x27\x77\xea\xd8\x87\x24\x1c\x26\x21\x24\xb4\x36\x1e\x7d\x14\xf3\xe1\x19\xe9\x5f\x47\x1d\x37\xcc\xbb\x58\xa3\xaa\x5f\xec\x0b\x23\x20\x21\x29\xf9\xb4\xb3\x4e\x17\xfb\xc1\xb0\x15\x62\x3f\xb7\xc5\x8e\xcf\x87\x0c\x86\xcb\xd7\xf4\x29\x64\x30\x8e\xd7\x3b\xeb\x74\x70\x18\x0e\x6b\x21\x0e\x73\x93\xd5\x61\xed\xe8\x2c\x71\xc7\xe0\x09\x55\xc9\x96\xb4\xbd\x75\x70\x9d\xb4\xc3\x67\xab\x21\x69\x0f\x0d\x31\x76\xf2\x18\x37\xa8\x35\xaa\x23\x5f\x47\x9d\xc8\x2b\xfa\xc6\xeb\xb0\x5c\x82\xf8\x7b\x64\xc0\xf8\xab\x43\x18\xe6\xb5\x10\x42\x6a\x8a\x8d\x6c\xd8\x21\x7a\xae\x95\x69\x02\xaf\x97\x4c\xca\xae\x32\x51\x0f\xd7\xc2\x61\x18\xe2\x5a\x9e\xf0\x2c\x9f\xe5\xc7\xe6\xe8\x1c\x23\x94\xe1\x44\xd0\xf6\xad\xe7\xe3\x6a\x38\x6c\x87\xb8\x9a\xa7\xfb\xd5\xe3\xfa\xdd\x4f\x86\x93\xba\x0a\xc3\x62\xa8\x36\xd2\x6f\x47\x50\xa4\xfa\xb5\xf4\xdb\x2e\xd2\xcd\x20\xd8\xd6\xef\x3e\x32\xdc\xa9\xdf\xa0\xd0\xd5\x48\xbf\x1d\x21\xdb\xb7\xce\xa4\x7e\xbd\x28\xb7\x70\x40\x51\xbb\xcd\x75\x45\x92\xeb\xd0\x55\x27\xc8\x03\x6c\xd1\x56\xd1\xb7\xeb\xab\xd3\x0e\x8b\x3a\x9c\xaf\xa5\x7e\xeb\xfb\xe9\x69\x42\xbf\x55\x50\xca\x5c\xad\xf0\x3d\xbc\xde\xa4\xec\x0e\xd0\xaf\x02\xd5\xb2\x9e\x42\xb3\x52\xbf\x31\xdf\x27\xee\x70\xfd\xee\x53\xef\xb9\xeb\x0a\x65\xc4\xbc\x8e\x3a\x66\x2f\x6f\xe1\x5e\x1e\xb3\xe4\x03\x43\x95\xc4\x42\x7a\x90\x7e\xc3\x61\x63\xac\x5f\xde\x0e\x1b\x28\x30\xfd\x9a\x42\xb6\x6f\x3b\x93\xfa\xdd\xd9\x8e\x47\xe2\xeb\xd3\xef\x44\x3b\x1e\x09\xaf\xa3\x8e\xdf\x1d\xa7\xaa\x5c\x4f\x26\xf1\x25\x74\xb8\x7e\x85\x18\x1a\x43\x93\x84\xc3\x01\xa8\x34\x2a\xf5\xe4\x08\xda\xbe\xf5\x26\xf4\xc4\xeb\x39\xc4\xcb\x95\xd2\xf0\xbf\x23\x99\x73\x9b\x57\xc4\xf4\x1a\x75\x94\xfe\x70\x40\xe4\x3c\x18\x0c\x0a\x3d\x99\x42\xba\x6f\x3b\x93\x7a\x2a\xdb\xe9\xb1\x80\x8c\x41\x61\xe3\xa2\x3d\xed\xb0\x7b\x9a\xd4\x93\x3c\x99\x20\xa0\x42\xee\xd6\x75\xc8\xdd\xee\xe7\x35\x9c\xe4\xdd\xa2\x2d\x0f\x17\x7b\x49\xef\x69\x6b\xb2\x8e\x30\xc8\x86\x7d\x52\xcf\xed\x71\x5b\x2c\xde\x12\xbf\x8c\x85\x2c\x0e\xae\xf2\xb8\xb7\xba\xb2\x76\xd7\x6a\x65\xb5\x13\x42\x18\x86\xd4\x0c\x0b\xab\x8c\x68\x00\xd6\xb3\x56\x43\x4f\x21\x2e\xeb\x0a\xca\xc1\x75\x71\x2d\x0c\xf3\xa4\xb4\xcc\xdd\x75\x33\x90\x05\xfd\xa0\xba\xd9\x35\xea\x0a\x35\xae\x73\x82\xa6\x10\x5a\x5a\xad\xac\x9e\x3c\xbb\xba\x92\x91\xda\x30\xc1\x2e\xad\x49\xf5\x7c\xe0\x27\x09\xe7\x46\xb2\xab\x5c\x65\xb5\x32\x59\xae\x1b\x8c\xfc\x0b\x54\x85\x86\x90\x94\xe7\x11\x33\xfe\x71\x4c\xa8\x92\xde\xb0\x45\x1a\xb9\x2d\xe9\x79\x12\xf0\xa3\x11\x99\x5e\x05\x99\xfb\xd7\xed\xb2\x4c\xa7\x0a\x49\x86\x35\x16\x23\x24\x2d\x8f\x4a\x60\x0c\x7e\x19\x37\x77\x96\xf5\x85\xe4\xd9\x9a\xa0\x0e\x59\xd9\x38\x28\xb4\xf1\x9c\xca\x72\x3f\xea\xf1\x73\xde\x26\xee\xad\x83\xfb\x79\x1d\xab\xd4\x92\x1a\xc3\x30\xc0\xf5\xbc\xb0\x91\x36\x4e\x05\x79\x77\xd9\x36\x31\x87\x21\x8e\xf2\x54\x6a\x0c\xbb\x01\x56\xf2\x91\xbf\x4c\x05\x7d\x77\xd9\x8c\x97\xed\xee\x29\xcb\xf5\xa0\x1d\x24\x5f\x2d\xef\x07\x3c\x43\x47\x63\x5d\xec\xc1\x1d\x95\x6d\xe4\x9d\x49\x5d\xd4\x85\x64\x87\x1c\x76\xea\x42\xcb\x13\x6e\x95\x85\x2f\x4c\xae\xa1\x8b\x20\x28\x9c\xcc\x73\xd5\x05\xba\x46\xd9\x6e\x50\x4c\x24\x30\x5d\xa4\x87\xeb\x62\x42\x66\x9d\xfd\x74\xd1\x21\xc6\xb0\xbd\x8f\x7c\x9f\x8b\x2e\x48\x7c\xb8\x7c\xc3\x60\xc2\x67\xba\x87\x97\xd5\x03\x70\xa8\x87\x46\xf1\x29\x1b\x95\x1d\xcb\xa1\x4a\xfa\xc3\x3a\x69\xe5\xd6\x04\x30\xd3\x85\xbf\x4f\xd9\x6d\x5d\x34\x72\x33\x00\x8b\xf2\xdc\xc1\x2f\x73\x87\x83\xe5\x3b\xa1\x37\xd2\xbd\x46\x59\x7b\x84\xcb\xe3\x8f\x57\x9e\x7f\xbc\x47\x17\xa6\x24\x0f\x8d\x00\x3b\xb9\x37\x8e\x39\xfa\xee\xb2\x59\x69\x17\x89\x24\x0f\xed\x00\x9b\x79\x38\x21\xb3\x43\x7c\x89\x31\x96\x19\xd7\x9b\xc2\xcf\x4f\xdc\xaf\xac\x98\xe6\x28\x80\x98\x36\xd0\x28\xae\x24\x23\xdc\x09\xf9\x32\xae\xd7\x73\x47\xaa\xe7\xad\x00\x02\x6a\x15\xf1\x24\xe1\xf1\xe4\x00\xf9\x8a\xe9\x70\x10\x40\x9f\xd6\x0b\x99\xf9\xd7\x90\x99\x16\x82\x47\xf9\xbb\x96\x3e\xee\xf1\xd8\x71\x40\x59\x31\x1d\x26\x01\x64\x54\x29\x7c\x3e\x22\x9e\x18\x95\x71\xa6\x70\xd9\x15\x76\x8f\xc4\x0b\xb6\x03\xc5\xb3\x66\xcb\x10\xa2\x61\x83\xb4\xca\x3a\x3c\x4e\xec\xa9\x23\x28\x13\x4e\x7e\x67\x9d\x0c\x90\xa0\xed\x5b\x47\x0b\xf3\x34\x2c\xd2\xb6\x1d\x75\x80\xfb\x98\xf2\xac\xc3\x25\x7e\x42\xd4\xca\x6a\x65\xf5\xec\xea\x80\x45\x57\x1c\x0e\x23\xec\xe6\x9e\x54\xa7\x81\xee\x83\xc5\xcf\x7c\x23\xed\xeb\x29\xef\xb9\x1e\xf8\x26\x7f\x66\x17\x8d\xcf\x62\x9b\x28\xcf\x6c\x64\xd8\x23\xc6\x50\x26\xad\x61\x2c\x69\xd4\xb6\x3d\x28\x9f\x25\x43\x9d\xb4\xc7\xe7\xea\x4d\xd6\x69\x90\x64\xd8\x25\xd6\xb3\x03\xa2\x0d\x23\x56\xc7\xf5\x21\x28\xeb\x78\x24\x92\xbc\xf2\x4c\xb6\xc9\x3a\x4c\x23\x5d\xc1\x7c\x16\x09\xda\xb3\x91\x64\x52\xdb\x09\xa0\x6d\x7e\xc7\x75\xf8\x99\x87\x48\xaa\x17\x67\xa4\x55\x56\x2b\xb7\x9d\x3c\x26\x88\xac\x56\x17\xc7\x79\x0c\x2d\x30\xaa\xd4\xa2\x1a\x6e\xe5\xb1\x54\xa7\xf5\x2d\x24\x37\x3c\x55\xc6\x8d\x76\x59\xd7\xdd\xb7\x2e\xd1\x73\x1d\x6c\x08\x6a\xb4\x4e\x65\xdc\xcd\xf5\x3d\x75\x33\xdc\x15\x9d\xfd\xea\x0e\x88\x9f\xcb\x10\x63\x54\xcd\xe3\xbc\x8d\x07\xb9\x52\xd6\xd5\x7d\x5d\x29\xeb\x72\x1d\x6b\x7b\x75\xa6\xe4\x2e\x6e\x0f\x23\xec\xe4\xbe\xa4\x51\xcf\x08\xc0\xd3\xc7\xe7\x26\xee\xab\x63\x87\x97\x2f\x74\x6c\x3a\x3e\x84\x76\x79\xfe\xe5\xf5\xe9\xd8\x07\xdf\x1a\xe9\xd8\xbd\x2e\x1d\xeb\x9e\x0f\x1d\x77\xa4\xaf\xf0\xba\xf4\x65\x7a\x01\x74\xed\xc9\x3a\x7b\xdb\xd9\x59\x87\x71\x29\x80\xce\x58\xc7\xc1\xc1\x3a\xee\x41\x0b\xcc\x42\xc7\x6a\xde\x93\xea\x54\xde\x42\x72\xcb\x6f\x29\xb8\xc1\xcf\x25\xc3\xa1\x28\x4f\xd4\xad\x6d\xeb\x98\x0d\x95\xba\x90\xf0\xa3\xda\x70\x94\x6b\x52\x9d\x2a\x5b\xa8\xc5\x55\x1c\xa1\xf1\x79\x8a\x87\xe9\xb8\x96\xc7\x79\x58\xea\x58\xa1\x03\x59\xf7\x0c\x05\xb7\x22\xae\x33\xe7\x7a\x74\x66\x31\x71\x5a\xe3\x33\x15\xaf\x59\xbe\xd5\x09\x20\x09\x76\x9d\xa9\x78\x98\x8e\xb5\xb6\x0f\xb1\x37\xd2\x71\x5d\x1c\x9d\xa3\x7a\xb0\x8e\xeb\xb4\x15\x06\x50\xee\xfd\xc4\xcf\xe2\xbb\x1e\x1d\xab\xdd\x00\x52\x7f\xb2\xce\xb5\x75\xac\xb3\x9b\x71\x47\x3a\xae\x0b\xb2\x84\x0e\xb1\xe3\x1a\x35\x4b\x3b\x46\x79\x4a\x13\xb9\x11\xb4\x64\x6c\xa4\xe5\x39\x89\xf6\x7e\x75\x0b\x3d\xf5\x98\x2d\xf6\x4b\x5b\x44\x79\x46\xfb\xb2\xe6\xeb\x32\x36\x92\xf1\x59\x89\xd7\xf4\x9f\x0d\x26\x92\xb0\x3c\x2b\xb1\x3c\xcb\xf0\x40\x3d\x89\x03\xaa\x24\x01\x56\xa2\xf1\x59\x89\x7b\x65\xbe\x53\x4f\x75\xda\x0a\x02\xbe\x8b\x0d\xd7\x13\x76\xc6\xe7\x25\xee\xd4\x53\xbf\x38\xfd\x92\xa8\xc3\x9e\x38\xa0\xf2\xc0\xc7\xb5\xde\x77\x2c\x73\xf0\xb0\x23\x79\xfb\xb4\xb3\xa3\x8e\x38\xa0\x28\xf3\x71\x35\x2e\xf5\x84\xfa\x82\x5c\xac\x75\x98\x94\x75\xa5\xb4\x45\x95\xd9\x62\xa9\x27\x31\xcd\x2d\x5a\x67\xb2\x56\x88\x32\x5a\x2b\xd1\xe1\xfb\x68\xec\x57\x9f\xcf\x85\x75\x21\xa9\xe6\x59\x1e\x31\x9f\x5b\xd6\xd7\x7d\x63\xa2\x7e\x86\xfa\xfc\x0c\xc5\x3d\xf5\x77\xda\x24\x41\xb9\xbc\x4f\x7d\x8c\x3a\x82\xc2\xe7\x52\xa6\x51\x85\x9f\xc2\xb8\xb6\xb2\x71\xd7\x31\x69\xad\x3c\x37\xb2\xd2\x01\x3b\x76\xcd\x5a\x1c\x13\x8b\x0e\xa0\x45\xeb\x52\xdd\x1f\x34\xfc\x06\xae\xfa\xa9\x8f\xcb\x33\xae\x63\xd2\xe7\xe7\xf3\x8d\x31\x2a\x23\x0c\x7e\xa4\x63\x0c\x5e\xea\xda\xb5\x5e\x4a\xec\x2d\x04\x55\xaa\x49\x75\x9f\xc6\x2d\xbf\x85\x75\x9f\x26\x3e\x56\x8b\x71\x47\x55\x34\x24\x6d\x8c\xb1\xca\x30\x84\x31\x46\x06\x3d\x1a\xf7\xbc\x1a\x4d\x52\x41\xa5\x01\xf8\x79\x2c\x69\x1e\x4d\x59\x57\x1a\x1e\x65\x8a\x1f\xed\x39\x20\xef\x83\xb3\xba\x03\xa7\x1b\xd4\xb6\x10\x1d\x4c\x02\xc5\x2d\xbf\x81\x55\x8f\x75\xa7\xc5\x73\x38\x5d\x90\xa5\xde\x08\x07\xf8\x49\xa3\x93\x38\xa0\xe3\x16\xb5\xa0\xda\xab\xd1\x0e\xed\x88\x06\xad\x61\xc4\x46\x26\x3e\x4d\x5b\x41\x0b\xab\x3e\xcd\x7c\xdc\xf8\x1f\x87\xc3\xc7\x18\x16\x97\xf1\xd2\x0e\x19\x97\x77\x28\xad\x76\xc0\x89\x3d\xab\xd6\x4f\xa0\x07\xe1\x16\xea\xba\xd5\x94\x0e\xa4\x7a\x90\xa7\x2d\x4f\x25\x6a\x90\x0f\xea\x5e\x7d\x34\xaf\x9a\x8a\xda\x04\x56\x89\x00\x63\x69\x75\x20\xa6\xfd\xae\x5f\x1d\xd0\x0c\xd7\xb1\x42\xfd\x41\xb7\x46\x63\x7e\x30\xc2\x36\x5c\xcb\x6f\xf0\x1c\x1a\x89\x5d\x8e\xb5\xbc\x43\xde\x13\x67\x79\x42\x4c\xe3\x36\x13\xf9\x16\xc2\x35\x86\x66\x43\x4b\xab\xd2\x0e\xdf\x1a\x8f\xa2\x86\xdf\x20\xf5\x80\x2a\x8d\xaa\xaf\x95\xfd\x23\x99\xa0\x4e\xe8\x70\x17\x9f\x3a\xe0\x24\x9e\x55\xeb\x25\x9c\x93\x0d\xda\x92\xb4\x80\xf6\x5b\xbe\x8a\x8d\x80\xa6\x25\x9f\xfa\x24\x3a\x8c\x93\x7d\x70\x19\x27\xe3\x3e\xc7\xa8\x15\xbb\x70\xf5\x18\x86\x15\xd0\xbe\x8f\xf5\xeb\xe5\x52\xec\xd6\xe8\x60\x0b\x6d\x73\x69\x5b\x73\x03\x1f\xd7\x47\xe3\x38\xd1\x90\xf4\x9d\x38\xd2\x4e\x9c\x28\xa8\x65\x34\x19\xc3\xe8\x01\xed\xa8\x81\x8a\xdd\x80\x46\x01\x2e\xde\x09\x29\xb9\xa4\x5f\x07\x97\x22\x1a\x8e\xb9\xa4\x07\x34\x69\x05\x0d\xac\x05\x34\x0b\xb0\xca\x70\x48\x76\x9d\x38\x5d\xda\x9e\xc4\x89\x1b\x41\x03\x9b\xa5\x80\x30\x5f\x9b\x13\x1c\xcc\x49\xa1\xe0\xa4\x5d\xeb\xa7\xd0\x83\x36\x1d\x44\x61\x8d\x0e\x68\x2a\xd5\xfd\xbc\xab\xfa\x2a\xb1\xfc\x3c\x56\x7d\xb5\xe4\x64\x77\x2f\x27\x85\xdd\x9c\xec\xf8\x5c\xda\x05\x29\xfb\xfd\x1a\x4d\x19\x89\xfc\xbc\xc3\xe0\x6c\x3f\xef\x15\x70\x7c\xbc\xd6\x2f\x79\xb9\x97\xe3\xb5\x49\x5a\xa6\x34\x2d\x58\x09\xb5\xb8\x24\xa5\x9f\xc7\x8c\x94\xba\x9f\x27\xba\xaf\x17\x78\x6d\x12\xf1\xb3\x44\x0e\xe0\x53\x1b\x5c\xc6\xc9\xb4\x47\x6c\x9a\x41\x8b\x36\xf8\x4e\x68\xcc\xc7\x59\x01\x8d\x03\x6c\x16\x18\xbe\x50\x97\xea\x68\x06\x2d\x8e\x30\xce\xed\x04\x71\xfa\x8d\xb0\x56\x8b\x13\x8e\x52\xb2\xd2\xaf\x2b\x7e\x0b\x07\x01\x0d\xf9\x71\xee\x9c\x4f\x3d\x71\x92\xdb\xfb\xfa\x4a\xbf\x46\xd3\x6d\x17\x57\x0f\x68\x5c\x0f\xea\x5c\x79\xfc\x14\xf9\x02\xc7\xdb\x8b\xb3\x8b\x97\x3d\xaf\x36\xa0\xd9\x24\x8e\xcf\xe8\x1d\x06\x34\x0c\x71\x79\x4e\x88\x4e\xe2\xeb\xe0\x93\xdc\x67\x3e\xc4\x9f\xe4\x53\x87\xf1\xc9\x0d\x68\x37\xc0\x0e\xc7\x69\x5f\x27\x2f\x7b\x34\x98\xc4\x71\xd5\xa0\x85\xdb\x01\xf5\x03\x1c\x72\x2e\xd9\x42\x20\xc9\x63\x9f\xb4\x83\x97\xe7\xc6\xc4\x74\x6a\xfd\x0c\x62\xe6\x2c\xf5\xa4\xce\x22\x42\x2a\xc9\x41\xee\x33\x2a\x05\x41\x1e\x4e\xf8\x23\xac\x89\x1a\xc7\x3b\xcc\x5f\x76\xfc\x5a\x46\xd3\x6d\x7f\x19\xd1\x98\xe1\x59\x0c\x2f\x0a\x72\x47\xf3\x55\xce\x4b\x5b\xec\x4e\xf4\xed\x00\x7f\x19\xb9\x7b\xfc\x65\x8f\xfa\xbc\x7f\x2d\xbf\xc5\xfb\xd7\xaa\xf9\xc6\x88\x9b\xfe\xe1\xdc\xf4\x33\xdf\x64\xac\x72\x68\x06\x8d\x82\x9b\x01\x13\x7d\x10\xd0\x76\x80\xbd\x62\x3e\x31\x11\xea\x62\x7a\x0d\x8c\x28\xe3\x18\x55\xaa\x89\xa9\x4f\x6b\xad\xa0\x45\x64\x9f\xd6\xf9\xb9\xd6\x8c\x4f\x3e\x3f\xcf\xe6\x30\x3e\xf5\xdd\xda\x80\x16\x31\x3c\x60\xc3\x93\x80\x06\x8c\x97\x41\x40\x83\x00\x8f\xf6\xbe\xc0\xb1\x68\x4e\xf4\xe5\x1a\xfe\x32\xc8\x7b\x62\x1a\xd0\x2a\xeb\x4d\x35\xa0\x35\x7e\x8a\x77\xc1\x4b\x8f\xf3\x89\xdb\xdb\x84\x84\x77\x12\xca\x86\x86\xba\xc7\x63\x5a\xf5\x6a\xa0\xe2\x5e\x40\x6d\x7e\xc6\x3b\x06\x1d\x77\xa5\xde\xa8\x4f\x87\x72\x7c\x22\x8e\xb3\x6e\x21\x2d\xd0\x48\x23\xa0\x72\x40\xea\x7c\xde\xa4\x26\x04\x62\x74\x98\xcf\x74\x13\xcf\xae\xf6\x52\x88\xa0\x4b\xd3\xbe\xcf\x98\xd9\x17\x23\x7f\xe8\x36\xfc\x86\x10\xfa\x43\x5f\xf3\xb5\x72\x9e\xbf\x26\xaa\x13\x58\x7b\x7c\x5c\x87\xfb\xb8\x76\x35\xa5\x49\xe9\xe3\x50\xa7\x46\x13\xda\xe1\x70\x2d\xbf\x35\x01\xc7\xe7\x67\x6a\x62\x97\xe3\x2d\xef\xe5\x79\xc9\xcd\x1e\x8d\x3b\x21\x27\x7a\x15\x57\xa9\xe7\x40\x4b\x65\xe6\xe8\xed\x40\xe4\xd4\x04\x3e\x97\x2c\xf3\xe7\x2b\xa3\x73\xc8\x2b\x24\xcb\x43\xec\x0c\x59\x0c\x18\xe5\x8f\xc5\xf8\x7f\xbb\x5c\x65\x57\x39\x9a\x04\x58\x2b\xde\xbf\x11\x1a\xe5\x33\xd0\x31\x9e\xd0\x1f\x26\xa4\x35\xac\x4b\x9a\x3f\xf0\x71\xb5\x7c\x97\x43\x90\x45\x34\x2e\xc7\xf1\x84\x6c\x18\x11\x7d\xa8\xb0\xf8\x5c\xa4\x9c\x2c\xdf\x17\xaa\x7c\x8c\x30\x51\x8e\x9f\x91\x6e\x3e\x8b\xf8\x26\x94\x2c\xf3\x7a\x0e\xe5\xf8\xf3\x4c\x99\xf3\xbf\x90\x1e\x3f\x9b\xbe\x38\x42\xdd\x82\x56\x95\xba\x2c\x7d\x0e\xf2\xb8\xe5\xa9\x65\xf9\x44\x68\xef\x29\x4f\xc2\x1c\x41\x1f\xcc\x1a\x6d\xe4\x7d\x56\x3e\xd1\x3c\xbd\x94\x53\x95\x8f\xbf\x67\x46\xda\xd9\x3e\x2b\x3d\xc3\x86\x5f\xcd\x7b\x39\x4f\xa9\xaa\x6a\xc3\xb7\xc7\xf2\xd7\xf6\x95\xab\x36\xce\x4f\x80\xcf\x33\x1f\x28\xff\x71\xc0\x00\x3e\x87\x7f\x88\xfc\x83\x22\x07\x67\x63\xbc\x64\x8f\xfc\xd3\x61\x6f\x24\xff\x28\xc0\xd6\xf5\xc8\x75\x10\x8c\xe5\x8f\x0e\x2b\x37\xe2\x07\xdf\x73\xea\x40\xf9\x37\x6a\xd4\xe2\x1b\xa5\xe6\xbd\x6d\xf9\xb7\x0f\x92\x7f\x0a\x46\x95\x22\x2a\xb3\xf2\xed\xc2\x40\xd8\x58\x37\xe5\xf2\xdf\x51\xbe\x38\xaa\xbe\x06\xdd\x6a\xde\xcd\xbb\x3c\x43\xb6\xf8\x24\xd2\x48\xae\x8d\x7d\xe5\xda\x18\xa5\x05\xbc\x9c\xbf\xa7\x5c\x9a\xb7\x47\xe5\x78\x54\x2b\xde\x3f\x4b\x84\x4c\xd2\x77\xc8\x75\x24\x7f\x7d\x9c\x28\xb2\x72\xbe\x88\x76\xe2\x09\xe9\x30\x26\xda\xb0\x2a\x35\x42\x16\xb8\xc3\x72\x8c\x9c\x1c\x26\xd7\x6d\x3d\x91\xee\x61\xe5\x82\x22\x2f\x61\xf2\x54\xf9\xf9\x5e\xfb\xc8\xdf\x81\x7a\x95\xda\xb4\xc5\x23\xa2\x16\x8c\xf4\xd5\x10\x3c\x49\xde\xc5\x67\xae\x80\x0e\x96\xad\x2a\x6d\xe5\x19\xab\x60\xb4\x6a\x01\xf7\x27\xd8\x16\xdd\x3d\xe5\xb9\x02\x12\x6c\x7b\x55\x36\xd0\x65\xe5\x03\xad\x1e\x70\xfe\x93\xe0\x30\x5e\x87\xa3\x7e\x67\x38\xe3\x63\xf8\x7d\xca\x31\x0f\xde\x0a\xf0\xa0\x94\xeb\xe8\x19\xfd\x5e\xf9\xd7\x03\x6a\x05\xb8\x57\xf0\x1f\x27\xe2\x2e\x3c\xee\x7f\x8c\xa1\xcc\xf0\xea\x01\x91\x4b\xb9\xfa\x92\xbf\x8f\x5c\xad\x67\x06\x4c\xae\x4e\x88\xbb\xe5\xbc\x44\x4f\xf2\x76\xe2\x8d\xe4\xcf\xf0\x94\x80\xd4\x0a\x79\x42\x5d\x68\x88\xd1\x6e\x79\x32\x05\xb4\x21\xe2\x13\x46\x35\x31\x0a\x86\x41\x29\xcf\x0e\x34\x44\xb4\xb7\x3c\x93\x7f\x82\xeb\x5e\x2d\x4f\xf2\x98\x95\x0f\xd5\x7a\xc0\xe7\xe4\xa0\x21\x3a\x7b\xca\x97\xfe\x47\xe7\xe5\x83\xa2\x7c\x2d\x30\xb9\xff\xd1\xf8\xb3\x44\xb1\x78\x1a\xbc\xb2\x9a\x85\xd8\x1d\x26\x92\x46\x8b\xbd\x3f\x33\x41\x39\xe0\x7b\x83\xef\xe7\xdc\x10\x74\x21\x93\x2c\xf6\x3d\xf0\xef\xa1\x11\x92\xda\x50\x95\x2c\xea\xf8\xc5\xf7\xa2\xb2\xfb\x7b\x75\x58\x1b\x7d\xef\x09\x2a\xdf\x9b\x6a\xfb\x7b\x2f\xe4\xc2\x75\xa8\x19\x5c\xfb\x7b\xee\x9f\x4b\x3f\xb6\xd4\x2c\x66\x4a\x3b\x21\xe8\xa0\x2b\xd4\xa3\x75\x49\xcb\x1b\xaa\xab\x8f\x62\x18\x4e\x84\x48\x32\x27\xcb\x66\x21\xf8\xe0\x2b\x54\xcf\x13\xc9\xcc\xab\xba\x6b\x6e\x97\x15\x9d\x3d\x65\x33\x48\x15\x8a\x72\x87\x95\xb5\x1c\x77\x54\x56\xd0\x04\x24\xc9\x3b\x64\x64\x0f\x33\x49\xa6\xfd\x52\x86\x32\x3f\xb7\x77\xf7\xf7\x26\x55\x83\x91\x0c\xfb\xc5\xf7\xdb\x32\x92\x87\x86\x64\x52\x2f\xe0\xdf\x57\x45\xb4\xfb\xfb\xc6\xb0\x21\x99\x54\x2f\x64\x64\x1e\x24\x23\xf7\xfa\x64\x18\x1f\x2e\xc3\xda\xa4\x0c\xe3\xc3\x65\x88\x8c\x09\x19\x0e\x0e\x97\x61\xdd\x76\x9d\xb1\x0c\xe5\x83\x78\x56\xc8\x90\x04\xfb\x7f\x9f\xa7\x41\x31\x4f\x9c\x88\xca\x0e\x19\xd5\x43\xee\x4c\x4d\x5a\xe5\x32\x24\xb1\x58\xd6\xdf\xc9\x43\x8d\xd6\x82\x32\xce\x1d\x20\xa3\x16\xff\x9e\x0c\x0e\xfa\xbe\x5a\xc8\x50\xe7\xf3\xfd\x07\xc8\xb0\x3e\xec\x9a\xae\x35\x96\x8b\x2e\x74\xc7\xf2\xbe\x6d\x2c\x43\x8f\xc9\x30\x95\xb4\x61\x20\x97\x44\xe4\x65\xf9\x7e\xed\x3b\xcb\x8e\x65\xc8\xca\xda\xae\x5b\x96\x25\x1d\xa1\xba\x4b\x46\xde\xb0\x2f\x69\x14\x95\x32\xd4\xf9\x9e\xd6\x93\xdf\x07\xc3\x9e\x24\xe7\x49\xc1\x43\xd2\xe6\xb9\xc3\x1e\x5b\xd6\xf2\x41\x21\x43\x53\x54\xa4\xfa\x5e\x19\xd6\xf3\x38\x28\x73\x80\x83\x64\xc4\x6d\x1d\x27\x92\xbf\xa3\x7e\xf9\x7d\x3d\xd7\x83\xc2\xd7\x09\xa8\xf0\xa1\xa3\x7b\x9d\x90\xa1\x98\x3e\xdb\x97\x8d\x42\x88\xdc\xcf\xf1\xf7\xe0\x76\xcb\xb0\xe0\x21\x2f\xbb\x2d\x43\xee\x13\x77\x97\x1d\xc9\x90\x97\xb5\x0a\x22\x62\xd4\xe7\x73\xdf\x4c\xde\x0b\x08\xc1\xb9\xca\xea\xd9\x55\x65\xea\x64\xf9\x1b\xfa\x36\xf5\xb1\xe2\x42\x68\xd2\x0c\x3a\x16\x31\x62\xf0\xfd\x3c\x19\x68\x11\xb8\x7e\x3e\x28\xd7\xa9\x34\x88\x5b\xc6\x8c\x7d\x30\x70\xdb\xa1\x0a\xf6\x3d\x6c\x1a\x54\xc5\xa6\x45\xc2\x2e\x98\x3e\xad\x26\x8d\x0e\x18\x3e\xad\x25\xa3\xf9\xb5\xbe\xd0\xe2\xf9\xc1\x7e\xfd\x70\x35\x9a\x42\x47\x03\x4d\xa3\x03\x08\x34\x01\x79\xa0\x04\xd4\xec\x36\x3c\x90\x03\x6a\x8d\xf6\x65\x24\x9d\x1d\x18\x6b\x3b\x30\x1a\x66\x02\x8e\x09\x81\x4a\x7b\x10\x6b\xa4\x1f\x40\x3d\xa0\x5a\xaf\x11\x40\x2d\xa0\x7a\x8f\xcb\x22\xe6\xe7\xc7\x1e\x20\x0b\x93\x86\x18\xd9\x10\x19\xb4\x0b\x89\x49\x06\x01\xd4\x7d\xaa\xf7\x74\x0f\x14\x9f\xda\xe5\x1e\x8e\x7d\xd2\x3e\x04\xa3\x57\xd4\x85\xd8\xa0\x3e\x96\x4d\x12\xb7\x41\xf5\x69\xab\xaf\x97\x58\x23\x79\x76\xca\xdc\x66\x3f\x79\x3a\x0e\x55\xb1\xe1\x60\xcf\xa0\x0a\xf6\x8c\x11\x46\x5c\x2b\x7f\x8f\x30\x92\x43\x74\xa2\xdb\xd4\xc6\x0d\x17\x77\xac\x3c\xc3\x6d\x4b\x90\x7d\xa8\xf9\xd4\x88\xea\xe5\xef\xf2\x8c\x21\xec\x95\x39\xe0\x02\x42\x4b\xc5\x11\x5c\x78\xf4\xbb\x63\x42\xb5\x95\x41\xa8\x9a\x26\x28\xad\x3e\x78\x2d\x1c\x3b\x5d\xf0\xc3\x3c\xa0\xc5\x11\x12\xb9\xc5\x31\x02\xa1\x37\x89\xb1\x5a\x62\xac\x16\x18\xb6\x4e\x43\xac\x68\x86\x09\xa6\x46\xfb\xd0\x57\x09\x72\xdb\x60\x85\x79\x97\xf2\x13\x31\x82\xbc\xd8\x47\xc7\xe7\xfb\x44\x1e\x80\x93\x99\x60\x6b\x1c\xc7\x34\xc1\xd0\x69\x0c\x89\x76\x00\x4e\x9f\xd4\x0f\xe1\x7b\xec\x30\xbe\x3b\xfc\x2c\x5f\xe8\x59\x44\xeb\x43\xe0\xe7\xfd\x81\xd6\x63\x7c\xcf\xc6\x7c\x37\x0e\x91\x6d\xc7\x66\x7c\x77\xb0\x66\x16\x7c\x77\x23\x70\xfc\x7c\x90\xd6\xcb\xdf\x23\xae\x46\xfc\x6c\x8c\xc3\xf9\xae\xb7\xb6\x10\x04\x2a\x49\x43\x68\xf8\x54\x8b\xb5\x1d\xfa\x29\xf8\xae\x5d\x27\xdf\xc3\x82\x1e\x8d\x10\x5a\x3e\x55\xe3\x62\x3e\xfa\x10\xae\x26\x16\xe3\xa8\x0d\x1d\x93\x71\xd6\x3a\xa0\x0f\x7d\xd2\x39\x04\x23\x32\xf7\xe5\x7b\xac\x86\xd7\xcf\x77\xdb\x2d\xf8\xee\x9a\xb4\x8a\x5d\x63\x7c\x23\xf5\x70\x27\xdf\xd3\x43\x30\x34\x87\xf1\xdd\xc1\x1d\x3d\xcf\x70\x47\x17\x14\x8f\xdd\x83\x19\x35\x3c\xa8\xfa\xd4\x8a\x46\x7b\xec\x69\x07\xf3\xbd\x6b\x80\xd2\x1a\x40\xd0\x32\x0d\x4e\x7c\xbf\x85\x3d\x46\xf3\x30\x37\x69\xd7\x49\x20\x0b\x72\x95\xf3\xdd\x3c\x94\xef\x96\x46\x3b\x58\x66\x3c\x2d\xf9\x8e\x7b\x2e\xb7\x1a\x9f\x86\x6e\x1f\xfa\x41\xae\x97\x7c\x37\x0f\xe5\xbb\xa5\xd1\xf6\x0e\xbe\x1f\x80\xd3\xc7\x3d\xb1\x18\x6f\x6c\xcb\x85\x94\x72\x21\x85\x8e\x15\x1b\x42\x9d\xf1\xdd\xc0\x59\x0a\xdd\x20\xef\xd0\xac\x91\x32\x93\xe9\xd2\x8c\xcb\x16\x67\x7b\xf8\x3e\xc6\xd8\xc3\xf7\x6a\x0a\x5d\x9f\x55\xad\x8f\x2e\x0a\xae\xb6\xf9\xf3\x93\xfd\x79\x62\x99\x34\x85\xae\x09\x86\xba\x85\x20\x54\x49\xbb\xc3\x62\x44\x23\x56\x3a\xa0\x73\xb2\x96\x7c\xd7\xf9\xf3\x93\x03\xf8\x6e\xa5\xe0\x39\xd0\xd1\x68\x04\x89\x4e\x9c\x2e\x98\x01\x55\xd2\x7a\xf9\xbb\xd8\x8b\xeb\x10\xae\xb6\x6d\x56\xd1\x82\xbe\x4e\x03\x2c\x6b\xc4\xea\x81\xe7\x53\x39\xad\x75\xc1\xd9\x8e\x53\x7d\xd2\x12\x6b\xbb\xe4\xb9\x8d\xd1\xb1\x4a\x0c\xc6\x77\xc5\x20\x66\x04\x76\x40\x51\x56\x2f\x7f\x8f\xb8\xda\x38\xc4\x7f\x68\x21\xd5\xb0\x11\xe2\xc0\xa6\x55\xec\x39\xe3\x98\xdb\x62\xfd\xc9\xb3\xc1\xf5\xf8\xa0\x96\xc7\xf8\xee\xe3\xb6\x93\xa7\xb8\xeb\x1c\xe0\x83\x5a\xd0\x13\xaa\x92\xbc\x97\x63\x8c\xef\x81\x09\x75\x95\x0e\x20\x6a\xa9\x26\xd4\xd4\x04\x82\x16\x6e\xb9\x7d\x48\x82\x5c\xa3\x8e\x3b\xc0\x8d\x60\x38\x18\x9d\x11\x1f\x0b\x7d\x49\x29\xfb\x72\x1a\x71\x9c\xf2\x08\x33\xcc\x48\xef\x68\x34\x81\x54\x1b\xd6\x4c\xb0\x74\xda\xc6\x55\x0d\x62\x07\x10\x87\xe8\x79\x71\xc1\x56\x8c\x1c\xf0\x45\xe5\x40\x9c\xcc\x02\x87\xd1\x34\xd5\x86\x8a\x09\x2e\xc7\xd1\xc1\x77\x41\xc1\x46\x30\xec\xc5\x6e\x8a\x51\x90\xd7\x99\x8e\xa0\x5e\x8e\x75\x19\xce\x62\xc1\xd3\xd5\xf2\x37\x89\x03\xc6\x75\x3f\x97\x7b\x4c\x47\x11\xd4\xc1\xc2\x51\x30\xec\x52\x6f\x7c\xc1\xe4\x8b\x3a\xe5\xf8\x76\x01\xa1\x93\x65\xdd\xd1\x6f\xd1\xf4\x98\x8e\xbc\xa1\x1d\xd0\x3a\x76\x83\x0e\xf8\x44\x09\x86\x16\x35\x65\xf0\x89\x1c\x0c\x6d\x6a\x72\xbe\x1a\xfb\xfa\xf8\xb5\x1d\x9c\xd7\xd4\x14\x7c\xb5\x54\xf3\x20\x55\x38\xed\x50\xc2\xe7\xf8\x55\xa1\xc5\xd7\xaa\x17\xf7\xb1\x36\xd9\x87\x82\xef\x16\x0b\x15\x7d\xe8\xe9\xd8\x02\x19\x06\x41\x6e\xd3\xb8\x01\x32\xf3\x46\x0e\x2d\x7c\x3c\x3a\xd0\xfe\xa7\x20\x61\x52\x44\x3a\x78\x2c\x2f\x49\x75\x82\x12\x66\xf6\xfd\x2d\xd4\x88\xc1\x0f\x8a\x04\x8f\xf9\x10\x4d\x94\x27\xfa\xb1\x43\x16\x63\xce\xf7\x74\xda\x86\x81\x81\xed\x71\xf3\xf5\xed\x8e\x94\x9c\x95\xf7\xfa\x91\xd5\x91\x1f\x71\x3d\x26\x4b\x1f\x5b\xcc\x8f\x58\x26\x91\x53\xa6\xa5\x1e\x1d\x8c\x7e\x17\x18\x90\x49\xde\x81\x7d\x19\xf4\x18\xef\x63\x9c\xd9\x79\x8a\x3b\x36\x6e\x40\x15\xd7\x18\x61\x7b\x32\xd4\x70\x23\xc8\x5b\xb4\xcc\x15\x75\xe4\x09\x48\xec\x8d\xb8\x8f\x4a\x5f\x5f\xfc\x6e\x1b\xd0\xa8\x0f\x20\xa8\xca\x3a\x18\xb5\x0c\x7c\x05\x1a\x2e\x20\xec\x06\xc3\x38\xcf\x5c\x68\xe1\x2c\x18\x96\x7b\xb0\x21\x4f\xe8\x4d\xe2\x30\xae\x56\xca\xdf\x1d\x03\xfc\x06\x0d\xb0\x52\xd5\x21\x6c\xd0\x1e\xf4\xab\xd0\x62\x40\x4e\x09\xd4\xc0\x83\x60\xc8\x9f\xeb\xfa\xc8\x13\xe5\x83\x70\x52\x03\x82\x3a\x0d\xb1\x5c\xd5\xa1\xdd\x60\xe2\xae\xed\x83\x63\xb0\x31\x0d\x22\x86\xd0\x29\xe7\x6f\x4a\x2d\x93\xae\x31\xcc\x48\xc7\x18\x53\x8c\x95\xb3\x88\x27\xd9\xe5\xbc\x5d\x59\x4e\x74\x8c\x67\x03\x51\x36\x88\xd7\x05\x27\xa0\xd5\x84\x8d\x25\xfa\xa4\x4f\xb2\x72\xde\x6e\x84\xa7\x68\xb9\x4b\xaa\x2a\x4b\xa1\x6b\x21\x35\xbb\x45\xb9\xce\x9e\x72\xb2\xce\xca\xe9\x24\x0e\xa0\x1e\x52\xad\xc7\xca\xa5\x24\x15\x3a\x3b\xdb\x25\xb1\x3a\xec\x93\x9e\xc6\x33\x8c\x80\x67\x16\xac\x5c\x7f\xcf\x7d\x24\x0d\x56\x4e\x15\x90\xcf\x53\xf6\xa8\xb8\x8f\xa0\x7c\x87\x61\xfb\x3e\x2c\x8b\xdd\x87\x4d\xa2\x36\x8b\x1e\xf5\x7e\x51\xae\xbf\xa7\x9c\xab\xb3\x72\xba\x80\x02\x9e\xd1\xf4\x8a\x73\x90\x7c\xd2\x2e\xc7\xb5\xa5\xe7\x69\x9b\xb8\xe1\xe4\x11\x1e\x98\xd8\x77\x7b\x2c\x40\x96\x7b\xff\x68\xd8\xe7\x67\xe6\xed\x2c\xdb\xf5\xf3\x1a\x09\xdd\x5d\x65\x6d\xec\x09\xfe\xce\xb2\xb1\x89\x7b\x7e\x5e\x67\x65\x3d\x37\x66\x65\xcb\x75\x7e\xfb\xe9\xb0\x63\x32\x1d\x9a\xbb\x74\xe8\xee\xb9\xa7\x91\x0e\xb9\xc7\x9f\xd0\xe1\x60\x97\xcc\xb9\x0e\x6b\x3a\xcf\xa6\x02\xaa\x45\x45\xb9\x80\x64\xbb\xda\x1d\xe9\x30\x6a\x83\x16\x14\xb2\x3c\x4c\x37\x6c\x54\x34\xd2\x0d\x4a\x49\x77\x4f\xb9\x7e\xab\xd0\x75\x3f\x84\x56\x40\x5b\xbd\xe2\x3e\xfc\x03\x74\x63\x90\x2e\xcf\x00\x6a\xa5\x0e\xa3\x83\x74\x48\x92\x22\xad\x2d\x75\x68\xec\xaf\xc3\x2e\x41\x16\x36\xca\x20\x36\xd2\xa1\x51\xe6\x14\x3b\x74\x18\xe4\x0a\xe9\xb8\xbb\xca\xda\x7c\x5f\xdb\x3d\x3a\x0c\x0a\x7d\xeb\x6e\xc2\xca\xaa\x23\x1d\xca\x42\xa7\x9c\x97\x1d\xdd\x7b\xa4\x33\x1d\xea\xa4\xde\x67\xce\xb5\x3f\xe0\xf7\x84\xd3\x5d\x76\x48\x46\x3a\xc4\xe9\x80\x45\xc6\x36\xcd\x10\xa0\x98\xb4\x49\x7f\x27\x1e\x1e\x68\xb9\x4f\x64\x95\xb4\xdb\x5c\x87\xfc\xde\x23\xd2\x20\xf1\xae\x72\x99\x96\x7b\x44\xd1\x88\xde\x03\xa7\x70\xea\x4c\x37\xee\x1e\xdd\x14\x76\x38\xca\xbe\x0a\xee\xa4\xa4\xbe\xe7\x3e\x46\xe5\x0a\x3c\x36\x2a\x62\xba\xd1\xf7\xe8\xc6\x36\xd9\x7d\x98\xc4\x19\xcf\x16\xb0\x72\xea\x81\xe5\x78\xc6\x95\xa7\xbc\x7f\x1a\xb4\x49\x9b\xfb\xf9\xb1\x37\x1c\xdb\xa1\x05\x6d\x0f\x10\x6e\x05\xc3\x62\x8f\x20\x0d\xda\xe5\x3b\x5d\x93\x65\xb9\x1d\x06\xee\xae\xb2\x36\xb4\x05\x6f\x67\xd9\xbe\x55\xd8\xe1\x9e\xb2\x03\x50\x47\x73\x2e\xa3\x48\x43\x22\x63\x98\x90\x9e\x01\x2a\x58\xb8\x1d\x0c\x63\x5a\xae\xdb\xb4\x50\xb7\x7c\x2f\x6a\x9c\x2d\x94\x7e\xc8\xea\x6e\xe7\x04\x4c\x3f\x3a\x49\x77\xeb\xc7\xc8\x1d\x52\x37\xc7\x29\x2b\xd7\x23\x36\x49\x5c\xb6\x3d\x8a\x90\x99\x9a\xfb\x44\xd1\xb0\x97\x31\x5e\xf8\x34\x65\x7d\x24\x0d\x21\xda\xa5\x9f\xbe\x56\xd8\xd8\x76\x10\x07\x94\x61\x6b\x7c\x2f\x25\x1e\xe9\x19\xc3\x98\xc4\x26\xf6\x06\x10\x07\x79\xc0\xf0\xc0\xc2\xbd\x5d\xfa\x21\xa2\xa7\x71\x1b\xe3\x7c\xf4\x47\xe5\x60\xf4\x1e\xd8\x58\x36\x23\xbf\x0b\x29\xd4\xb1\x1a\xe4\x75\xda\x29\xec\xc6\x40\x11\x09\x79\x6c\x43\x77\x8d\x23\x23\xd6\xb5\x3c\xc2\x59\x3d\x72\xa1\x86\xe3\x60\xe8\x8e\xca\x06\x82\xb9\xbb\x2c\x41\x46\xae\x90\xb0\x11\xb0\x48\x97\x06\xc3\xd1\xbe\x6d\x28\x10\xbc\x9d\x65\xfb\x06\xf3\x58\x0a\x09\xeb\x3b\xcb\x42\x55\xe8\x13\x43\xb4\x11\x29\x9e\x94\x43\x15\xab\x79\x24\xda\xfc\x1d\x91\x6f\x6c\xfd\x05\xfe\x9a\x78\x05\x11\x34\x8b\xee\x54\x6f\x02\x44\xa4\xf7\xe0\x99\x99\xb9\x23\xeb\x08\x10\xc2\x2b\x02\x48\x02\x08\xef\x95\xdb\x98\xa0\x0b\x17\xae\x6e\x6e\x56\xce\xaf\x6f\x56\x16\xe1\xfc\x7a\xf3\xea\xc6\xf9\xf3\x77\x34\x60\x8d\x34\xc9\xc6\xca\xf2\xda\xad\x67\xef\xc4\x1f\x7e\xb0\xf9\xd5\x37\x5e\xba\x74\x09\xde\x2f\x54\x9f\x7d\xf1\xdb\xdf\xf1\x8e\xb7\xb3\x36\x6e\x26\x8f\x92\x0e\x6f\x63\x0a\xbd\x40\xbd\x49\xf8\xec\x14\x84\x53\xf0\x8a\x29\x98\x42\x35\xd2\x20\x3e\x09\x89\x40\x24\x78\xff\x14\x22\xe8\xc2\xc6\x37\x37\x60\x7d\xf3\xf7\xd7\x37\x37\x37\x7f\xff\x8e\x06\x90\x35\xb2\x4a\xd6\x08\x9e\xb9\xfd\xbd\xb7\xe3\x87\x6f\x7f\xef\xed\xe2\x95\x3c\xc3\x0a\xfb\xe1\x39\xc8\xf3\x11\x12\x42\xf1\x0a\x7f\xc7\xbc\xab\xde\x7f\x93\xbc\x3c\xfd\xeb\x33\x8b\x0b\xf3\xb3\xc2\xcc\xd2\x47\x96\x05\x40\xc7\x85\xaa\xf8\x11\xe9\xe8\x2d\x37\x4f\x09\xd2\xb1\x5f\xaf\x9e\x58\x99\x59\x56\xb1\x8e\xb1\x32\xb3\x2c\x55\x31\xae\x4a\xcb\x33\x8a\x14\xdf\x90\xdd\x80\x2f\xdd\xf0\x81\x1b\xf0\x0d\xc9\x5c\x36\x87\xe7\x64\x61\xee\xa3\x47\x6e\x82\x23\x27\x90\xf2\xd1\xca\xf1\x95\xca\x85\xca\x2b\x2a\x97\x2a\xef\xac\x7c\xa0\x22\x5e\x38\xf2\x8a\x23\xf8\x48\xe5\x48\x45\x3c\xb6\x44\x66\xc4\x45\x74\xa1\x79\xa1\xb9\x78\xfe\xfc\xfa\xfa\xe6\x66\xa5\xd9\x54\xae\x6e\x6c\x94\xbf\x60\x7d\x73\x7d\x73\xf3\xd8\xf9\x75\xfe\x6f\xb3\xb2\x78\xfe\xbc\x72\xb5\x72\x6c\xe7\xff\xb8\x0c\x49\x73\x65\x95\xac\x2d\xb1\x9f\xb5\xb3\x4d\x96\x87\x2d\x35\x09\xfb\x69\xae\xc0\xea\xd2\x2a\x69\xab\x19\xfd\xfb\x57\xfe\xe2\xab\xe8\x57\x5e\xe9\xbf\xfc\x4b\x7f\xf7\x8f\x9e\x02\xfc\xca\x87\x5f\x09\x27\x5f\xe5\xbf\xea\xcb\xf9\x32\xac\xa9\xf4\xcb\xe4\xcd\xb4\x7b\x99\xbe\x0a\x1e\x63\x3f\x97\x41\xbb\x0c\x1d\xaa\xb3\x9f\xcb\xb4\x0b\xcc\x89\x13\x74\x65\xeb\xb2\xb0\x2c\x2d\xa2\x9b\xd0\xad\xe8\x34\xfa\x13\xf5\xad\x4b\xb7\x81\x70\x1b\x2c\xad\x81\xb0\x06\x4b\xd3\x20\x4d\x03\x91\x97\x64\x8c\xc9\x22\xc1\x18\x2f\x62\x2c\xc0\x32\x60\x01\x2d\x23\x7c\x5b\x75\x11\xec\x9b\x17\x64\x8c\x45\xed\x94\x71\xca\x39\x45\x4e\xdd\xbb\x7c\xa3\x5a\x59\xd6\xd4\x1b\xf5\x1b\xf1\x8d\xb7\x8b\x62\xed\x5e\x34\xe7\xcf\x85\x73\xf1\x9c\x30\x77\xec\x96\xfb\x17\x4e\xad\x4d\x57\x6f\xae\x49\x64\x65\x71\xe1\xa2\x72\x9f\x72\x49\x21\x8a\xb2\xb0\xb0\xbe\x70\x61\xe1\xe2\x82\xb0\x70\x9b\x7c\x3f\x91\x08\xc6\x88\x74\xb7\xa2\xdf\x9a\x99\xd7\x08\x5a\x3f\xd3\x6c\xae\x57\x98\xe8\xd6\x37\x9b\xeb\x4c\x98\x8b\x4c\x44\x4c\x8e\x57\x9b\xeb\xca\x57\x36\xcf\x6c\x5c\x65\xfc\x6b\x36\x9b\x57\x37\x36\x36\xee\x68\x6c\x6e\xff\x3b\xb9\xb2\x76\xf6\xd6\xd3\x67\x8f\x36\x2b\x2f\x80\xb3\x77\x9e\xbb\xeb\x6c\x73\x85\x1f\x27\x5d\xb9\x05\x56\x14\xa8\x48\x2b\xcb\x47\x8f\x55\xce\x9d\xbd\x13\x3f\x76\xf9\x2f\x2f\xff\x1f\xff\xee\xf7\xdf\xdb\xfd\xf0\xe5\x27\xde\xfd\x8f\xdf\xf1\xb3\x7f\xf4\x41\xba\xf0\xd8\x0f\xfc\x65\xf7\xbe\xaf\x7f\xf9\x25\x8f\xbd\x16\x3e\xa6\xfe\xea\xcf\x3d\xf4\xd8\xf2\xc7\x3b\xd3\xff\xe4\x5d\xdf\x3b\x43\xef\x7e\xf1\x07\x7f\x96\xa6\xb8\x03\x6f\xbc\xf9\x5d\x2f\x7f\xf5\x33\xf4\xed\x37\xbd\xef\x12\x42\x48\x44\x68\xeb\xaf\x85\x3f\x11\xff\xa8\xdc\x05\x62\x0d\x9d\x41\x9f\xfd\x04\xba\x75\x2b\xf9\xad\xe9\x23\x5a\xad\xbb\x95\xa8\xf3\xd3\x47\xb4\x9b\x6a\xd3\x47\xb4\x1b\xd8\xff\x66\xba\xc5\x57\x32\xfb\x6a\x75\xfa\x88\x26\xb0\xbf\x62\xf6\xbf\x1f\x7b\xde\x23\xcf\xfb\xb5\xe7\x91\xe7\x7d\xfc\xc6\xdf\x5e\x5d\x39\x7a\x6c\x19\x1d\x85\xa3\xdd\xad\x48\xbd\x61\xa5\xaa\x2d\x2c\xc3\xb2\xba\x52\xd5\x8e\x2e\x1f\x5d\x26\xd6\xa9\xe0\x54\xfb\x14\x39\xf5\xf1\x55\xf6\xf5\x0b\x56\xaa\xda\xea\xf3\xad\xf9\x60\xbe\x3d\x4f\xe6\x3f\x3e\xfd\xdb\x3f\xb6\xf8\xc8\xe2\xaf\x2d\x92\xc5\x8f\x93\xfa\x95\x5b\x7e\xe7\xb6\x2b\xd5\xe3\xc7\xa4\x95\xea\xdc\x15\xf4\x3b\xca\x15\x69\x0a\x5d\xb8\xfa\x77\x57\x2f\x5c\x60\xff\x87\xf5\xab\x9b\x7f\x77\x75\x53\xf9\xd3\x33\x57\x37\x39\x6f\xcf\x6c\x9e\xd9\xac\x34\x2b\x4d\xe5\xef\xae\x6e\xde\xd1\x38\x53\xfe\x9b\x3c\x34\xe7\xf4\xc6\xd9\x3b\xd7\x6e\x5d\x59\x9e\x86\x35\x58\xda\xe7\xef\xb0\xf6\x50\xf8\xfe\xcb\xff\xfa\x43\xbf\xe2\xbd\xfd\xed\x3f\x4f\x2e\xe7\xa7\xdf\x8f\xbf\xb4\xf6\xb3\x1f\xdc\xfe\x93\xf2\xa9\xf0\xc3\x57\x1e\x0f\x3f\xf4\xc4\x03\x5f\xbf\x7a\xf5\xeb\x78\xfd\x99\x97\x89\x57\x9e\x69\x7d\xea\x03\xec\x8f\x1f\x7c\xe2\x67\xd8\x1f\x11\xe7\xe8\x8b\xb6\x9e\x16\x9e\x14\xff\x04\xdd\x80\x4e\xa2\xe7\xa3\xaf\xa9\x0b\x95\xd3\xa7\xa6\x05\x79\x49\xbe\x11\x81\x24\x4c\xdd\xd6\xdd\xca\xd4\xc6\x7c\x45\x53\x6f\x83\x3b\x6f\x83\xdb\x5e\xba\x74\x8b\x32\x5f\xd1\x5e\x71\x0b\xbc\xf0\x16\x90\x6e\x79\xe9\xf1\xda\x52\x63\x09\x47\xc7\xe3\xe3\x78\xe9\xf8\xd2\xf1\xf9\x07\x09\x90\x97\x0a\x4c\x5e\x37\x4d\x2f\x6a\x82\x30\x35\xb5\x7e\xbb\x36\xaf\xce\x28\xda\xfc\x4b\x24\x78\x09\xbc\x1a\xf0\x5d\x00\x37\x76\xb7\x06\xea\x5d\xb3\xf3\x1a\x6f\x44\x5e\xd5\x8f\x1a\xd3\x60\x9c\x82\xd6\x69\xe3\x34\xbe\xfd\x34\xd4\x2b\x50\x74\xe3\xe8\x02\x39\x41\x5e\x41\x2e\x11\x81\x90\xa3\xc2\x3f\xf8\x81\xd9\xa3\xf2\x0a\x73\x8b\x17\xb8\x53\x3c\x76\x9e\x53\x91\x5b\xf6\x99\xcd\xcd\x4d\x58\x3f\x73\xb5\xd2\x5c\x6f\xae\x8f\x04\xcd\xbe\xbb\xb8\xb9\x79\x46\xb9\xba\xb9\x79\xa6\x72\xec\x7c\x93\xd5\xb9\xa3\x31\x0d\xe7\xee\x6a\x4a\x53\x4b\x6b\xa7\xa5\x35\x2e\xdc\xbb\xc6\x12\x16\xbf\x17\xce\xde\x79\x6a\xed\x56\x89\xc9\xbe\x38\x14\x08\xdf\x0d\xc7\x5f\xba\xda\x3d\xfb\xe6\xbf\xfa\xd2\x43\x1f\xfd\xeb\x4f\x7d\xe9\xd2\x63\xbf\xfa\x7b\xbf\xd5\xfe\x04\xfd\x91\xb7\xbe\xfe\xf5\x3f\xf0\x83\xaf\x87\x87\xe9\xa7\x9e\x7c\xeb\x66\x48\x64\xfa\xe1\x07\xdf\xf5\x57\xff\x8e\x7e\xf9\xd1\xc7\xbf\xf8\xc4\x43\x9f\xbe\x27\xfa\xf0\x2f\x3e\xf6\xeb\xef\x7e\xf2\x1f\xbd\xe2\x81\x97\xbd\xec\xb5\x3f\xf4\x03\x3f\x93\xcb\xf0\xae\x37\x7d\xec\x0d\x3f\x5f\xc4\x88\x8c\x3c\x8a\xbf\xcc\x7d\x74\x55\x3d\x82\x42\x92\x90\x8c\x10\x02\xef\x67\x2e\xf9\x9b\xcc\x21\x17\xbe\x18\x7f\x79\xec\x82\x8b\x7a\xa7\xe9\x27\xc9\x87\xc5\x2b\x68\x1a\x9d\x56\x57\x24\x51\x44\x00\xb3\x24\x3b\x21\x5f\x92\xdf\x29\x13\x59\xfa\x36\x1a\xa0\x0b\x17\x98\x01\x33\x41\x34\x2b\xcd\x3b\x1a\xd0\x44\x15\x05\xd6\x50\x45\xc1\x7f\xf1\xfb\xf4\x02\xfc\xde\xef\xd1\x17\x8b\x57\xa8\x97\x3f\x9b\x7f\x8b\xbe\x03\x5e\x87\x6f\xc0\xcb\x05\xf6\xed\xf4\x93\xe4\xd1\x11\x36\xc9\x14\xd9\x96\x5d\x99\xc8\xf2\x2c\x02\x90\x44\x69\x80\xbe\xcd\xb1\x9b\x7c\x27\x91\xf5\xcd\xab\x2c\x18\x31\x6c\xde\xc0\x53\xbf\x0b\xbf\x4b\xd5\x08\x3e\x45\x3f\x09\xf7\xe3\x19\x2c\xc1\x03\xf4\x91\xfc\xaf\xf2\xbf\x2c\xe2\xe7\x5b\xf0\x03\x82\x26\x2d\xa3\x79\x74\x9b\xba\xf2\x77\x53\x30\x25\x4e\x4f\x09\x33\x64\x16\x8e\xe0\xb9\x59\x59\x92\x10\x42\x17\x36\xd6\x9b\xc7\xce\xc3\xf1\xf5\x4d\x76\xef\x27\x8f\x89\x4b\x53\xb3\x70\x7a\xe9\xe4\x5d\x22\xc1\x4f\x9e\x81\x9f\xbf\x91\xbe\xe5\xef\x7f\xab\xf3\x2b\x9f\xf8\xaf\xf4\xf2\xcd\xf0\xb6\x33\xd2\x32\x7d\xe0\xbe\xdf\xbf\x89\x3e\x6e\xc2\x3d\xf4\x97\x4d\x78\xc9\x4d\xbf\x7f\x1f\x5c\xe6\x67\x6a\x82\x24\x34\x85\x0f\xa1\x59\x74\x42\x55\xa6\xa5\x8f\xa0\x88\xc4\x04\x93\x69\xf4\x1b\x12\xf9\x2d\x74\xa1\xc9\x3d\x5c\xf3\xea\xc6\x1d\x0d\x58\x3d\xcb\x5f\xcb\x5f\x59\xad\xac\xe1\x1b\xe9\x9b\xe1\xa1\x77\xc3\x43\xf4\xcd\xef\xc6\x6f\x7b\x0f\xbc\x85\xbe\xe9\x3d\xf4\x12\x93\x4b\x97\x7e\x95\x2c\x82\x84\x24\x74\x41\x3d\x7e\x5c\xba\x5d\x7a\x4a\xfa\xb6\x24\x48\x01\xfc\x92\x2d\xb8\x42\x2c\x24\x42\x26\x88\x9c\xf4\x0b\xd3\x73\x8c\xf4\x32\x79\xff\x09\x69\x5d\xc2\x12\x5a\xdf\xfc\x26\x0f\xde\x67\x36\x73\x66\xeb\x70\x4c\x22\x6b\x8b\x77\x11\xac\x9c\xbf\x1c\x7c\xff\x1a\x48\xd5\x84\x7e\x0e\xbe\xaf\x90\x11\xdc\x0c\x9f\x23\x1d\xfc\x20\x22\xa8\xa6\x2e\xba\xd8\xc7\x18\x63\xb1\x86\x1a\x08\x23\xf4\x09\xf8\x14\xba\x70\x15\x98\x97\xe6\xf2\x39\xbb\xba\x02\x37\xe3\x87\xe1\x73\x6d\xbe\x27\x2d\x7c\x76\xeb\x2a\xa6\xf0\x7c\x34\x85\x6e\x56\x17\xf0\x23\x0d\xa9\x23\x61\x49\x92\xa7\xd1\xfb\x84\x36\xba\x50\x74\x62\xf3\x9b\x77\x34\x60\x94\x3a\xdc\x13\x04\x8f\xc0\xf3\x1f\x7d\xf4\xd1\x47\xb9\x7e\x3e\x8f\x10\x19\x70\x3e\xde\xa4\xce\x11\x84\x44\xc0\x58\x20\x04\x16\xd1\x85\x0b\x15\x68\xae\x33\x8d\x6f\x30\xd3\x59\x03\x32\xc8\x7f\xfe\x63\xf8\x7e\xf1\x0a\x73\x2a\x2c\x27\x78\x78\xeb\x69\xe1\xbc\xf8\x27\x68\x1a\xad\xa0\x73\xea\xe2\x91\xfb\x62\x19\xe4\x63\x4b\xf7\x21\xa2\x90\x1a\x21\x53\x2c\xe2\xa8\x73\x2b\x55\x8d\x28\xf7\x8b\x53\x33\xf7\xa3\xe3\xe8\xc2\x55\x76\x33\x67\x7e\x78\xf3\xaa\xf2\x15\x46\x24\xf1\x56\x5c\x51\x56\x37\x16\x2b\xca\x49\x7e\x12\xd5\x1a\x3f\x95\x0a\xff\xc8\xd7\x9e\x86\xcf\xa5\xdf\xa4\x67\x1e\xfe\xb9\x9f\x7b\xf8\x5d\x6f\x7b\xdb\x32\x3c\x04\xf7\xe2\x8c\xbe\x99\x3e\x9c\x2f\xbc\x17\x8e\xc3\x8b\xe0\x85\x70\x9c\x3e\x45\x3f\x4d\xff\x80\xf2\x5c\xf6\x2a\x42\xf8\xef\xc5\x2b\x68\x06\x9d\x51\x8f\x4e\x83\x2c\xa3\x7b\x11\x28\x80\x25\x80\xb9\x59\x61\x6a\x5a\x42\x55\x74\xe1\xc2\x9f\x9c\xe7\x02\xf9\x61\x16\xe7\x98\x8d\xac\xae\x55\xee\xbc\x4b\x5a\x80\xd3\xd0\xc4\x7f\xdf\x91\x4f\xbf\xf2\xe1\xd7\xc1\xa5\xf7\x90\x77\xfd\x6f\x7f\x73\xe6\x25\x0f\xbe\x09\xce\x14\x1c\x7e\x3f\x42\xc2\xf3\xc5\x27\xd1\x31\xf4\xcf\xd4\x9b\xfd\x63\xe1\xb1\xce\x31\x72\xec\x98\x74\xdf\x56\x05\x2a\xea\xc2\x92\x56\x39\xfe\x85\xa3\x5f\x3b\xfa\xdf\x8f\x92\xa3\xdd\xad\x54\x3d\x36\x3d\xa7\x1d\x9d\x43\xd0\x01\x0c\x12\xcc\x4e\xdf\x3f\x3f\x85\x8f\xfe\x14\x54\xd1\x85\xab\x1b\x17\xae\x36\x17\xcf\xc3\xfa\xe6\xc6\xc6\x99\x4d\xe5\x2b\x67\x58\x37\x36\xef\x68\xdc\x0e\x67\xa1\xf4\x3f\x53\xa7\x4b\x8f\x3f\x05\x2b\xab\xc2\xf3\x87\x6f\x84\x1f\xfe\xf4\xbf\xbc\xf4\x13\xe1\xfb\xef\x89\xbe\xfe\x07\xc9\xcf\xa4\xf4\x1b\xb8\xf3\x3e\x78\xf3\x17\x3e\xf7\xaf\xde\xf8\xd0\xe5\x07\x1e\xfb\xd3\xdf\x7a\xe0\x99\x67\xe8\x17\xca\x67\xe0\x0f\x6d\x3d\x2d\x9c\x10\x9f\x44\xb7\xa2\x8b\xea\xf7\xcc\x2e\xdd\xb8\x84\x91\xb2\x72\x5f\xad\x46\x2e\x2a\xa0\x28\xf2\x91\xfb\x3e\x40\x7e\x93\x60\x72\xdb\x8d\x9f\x95\xbf\x2a\xff\x8d\x4c\x90\x0c\x32\x52\xee\xb7\x2a\x50\xa9\xcc\xde\x50\xbd\xff\xe6\xa9\xd9\xfb\xa7\xa5\xe3\xcc\x52\x78\x47\xd7\x37\xaf\xb2\xce\x6e\x36\x99\xae\x78\x3e\xda\x5c\xbf\xba\x78\xfe\x8e\xc6\x26\xac\x08\x95\x65\x61\x95\x27\x02\xb5\x8a\xb2\xba\x76\xb6\x38\x44\x6d\xe2\x06\xf0\x15\x78\x03\x7d\x9a\x3e\xfb\x5f\xdf\xd5\xfd\x23\xf8\xe7\xf4\xa1\xb7\xbc\x25\xec\x78\x3f\xf9\xb1\x47\x5f\xfb\xc4\xb7\x3f\xf3\x8d\x0f\x13\x2c\xad\xd3\xcf\x3f\xf9\xd4\x2b\x3e\x62\xc2\x2a\xe0\x47\x82\x37\xdf\xf3\xc0\x83\x6f\x7e\xcf\x7f\xf8\xb7\x3f\xf7\x78\x31\x77\xf6\x22\x84\x84\x7b\xc4\xdf\xe5\x6b\x58\x5f\xad\x56\xa7\x94\xe9\x05\x6d\x76\x8a\xdc\x3b\x8d\xb0\xaa\x2c\x69\x08\x03\xc6\x4b\xcb\x8b\x2c\x4c\x55\x67\x17\xb4\x45\x91\xc5\x1a\x11\x84\x9f\x9a\x96\xe6\xa7\x66\x67\xf1\x94\x84\x99\xc2\x17\xcf\xaf\x2f\x9e\x6f\x72\xcb\x3f\xd3\x3c\x53\x61\xf7\x74\x86\x67\x35\x77\x34\xce\xc0\x5a\x65\xad\xb2\x7a\x16\x9a\x95\xe6\x6a\xe5\xce\xa5\x35\x69\x0a\x84\x7b\xbe\xd0\xc9\x5f\x8b\x83\x4f\x7e\x81\xbe\xe9\xc8\xf4\x6d\xe7\xe8\x8f\xf2\x2d\xc5\xb4\x0f\x90\x3f\x1b\x36\xe0\x47\x3a\x80\xee\x79\x79\x1e\x32\x59\x3f\xc6\x65\x7d\x05\x55\xd1\x2b\xd5\x3b\x8e\xa8\xb3\x0b\xda\x91\x23\x48\xbc\xef\x03\xcb\xbf\xb9\x8c\x97\x6f\x98\x5f\x58\x98\x9d\x9e\x99\x41\xc8\x47\x21\xea\x20\x01\x4d\x4f\xdd\x5f\xa9\xcc\x92\xfb\xe1\xd8\xf1\xf9\x9f\x9a\x95\x98\x1d\x34\x99\x48\xaf\x36\x99\x4b\x62\x99\x56\x85\x4b\x79\xf1\xfc\xfa\x99\x3b\x1a\x77\x95\x62\xbd\x75\xea\xf4\xd2\xea\xca\x2a\x39\xc7\x8f\xab\x13\xd6\x6e\x7d\xcc\xef\x83\x4e\xdb\x3f\xf4\x6f\xee\xbe\x0b\x7f\x2c\x7f\xfa\xf4\xbf\xb8\xe7\x3f\x02\xa1\x4f\x3f\x9b\xbc\xf0\x31\x13\xbe\x07\x4e\xdd\x70\x1e\x77\x1e\xa5\x9b\xcb\x5f\xfb\xa3\xbf\x2a\xf7\x2a\xf8\xe5\xad\xa7\x85\xa6\xf8\x24\x5a\x41\xab\xe8\x15\xea\x51\x60\x3d\x05\x58\x3c\x7a\xef\xef\xcd\xc1\xdc\x9a\x74\xd3\x7d\x68\x11\x16\x99\x9d\x1e\x5d\xae\x6a\x8b\xd2\xf1\x9f\xbe\x34\x0d\xd3\xd3\x27\xc8\xfd\xb0\x3c\x75\xe2\xfe\x85\xe3\x45\x4f\x39\x17\x98\x0c\x37\xaf\x6e\x6c\x77\x13\x56\x4e\xad\xdd\x8a\x49\xb3\x3c\x85\x73\xed\x56\xc4\x6c\x79\xa9\x8c\xa3\x47\x9b\x1b\xe7\xc8\x1f\xbe\xf4\x62\x72\x75\x66\xee\xe2\x9f\x7e\xfa\xcb\x7f\xfb\xe4\x7f\xa2\x39\xbe\x64\xe1\xcb\x97\x2e\x3d\xf6\xa1\x87\x2e\xbd\x53\xec\xbe\xb7\x4a\xbf\x4e\x3f\xf3\x91\xbf\xfe\xcc\x5f\xd2\x6f\xc3\x0f\xc0\x9d\xe4\xee\xe1\xdc\xbb\xde\xf7\x21\x2b\xf8\x72\x87\xc9\xf8\x9d\x08\x09\x2f\x14\xaf\x20\x09\xbd\x54\x6d\x3c\x28\x5d\x96\xf0\x4b\xa5\x1f\x94\xf0\x94\x74\x4c\x3a\x2d\x11\x09\x21\x2c\x43\x15\xea\x40\x40\x94\x11\x8e\x71\x82\x33\x2c\x60\x11\xff\x14\x29\xac\x9d\xfb\x7b\xe5\x33\x1b\x3c\x97\xdd\x64\x69\xec\x2a\x73\xfc\x2b\x00\x2f\xc7\xcd\x7c\x9e\x3c\x96\x7f\x41\x54\x1e\x7d\xd7\x33\xff\x37\x22\xe8\x7d\x5b\x4f\x0b\x77\x88\x7f\x82\x96\xd0\x2d\xe8\x76\xf4\x2f\xd5\x13\x33\x27\xe6\x4e\xdd\x8b\x97\x11\xbe\xe9\xde\xb9\xa3\xf7\x2e\xce\x2d\xce\x2d\xca\xbf\x87\x01\x9f\x59\xbd\x97\xd9\x4d\x77\x2b\xfa\x9d\xe5\xaa\x26\xff\xd9\x32\x2c\x33\x12\xde\x3a\xb7\xa0\x4d\x2d\x1f\x5b\xc6\xe7\x4f\xfc\xd0\x89\x37\x9c\x78\xf0\x84\xf0\xbc\x13\x70\x62\x06\x2d\x0b\x6b\xc7\xef\x5f\x98\x5a\xbb\x5f\x2c\x9c\x5f\x91\xbc\x9c\xd9\xe4\xb2\x54\x3e\xb3\x59\x61\xf9\x8a\x72\x95\x0f\x50\x46\xa3\x14\x61\x65\x99\x27\x28\xca\xc9\xed\xfc\xe4\xdc\x28\x3d\x39\x7a\x4c\x5a\x59\x5e\xe5\xd6\x76\x1a\x0f\xe1\xec\xf0\xb3\xfd\xff\x0a\x37\xfc\x97\xa7\x3e\xd6\xfd\x4b\x7a\x4f\xfa\xaf\xee\xfd\xf1\x37\xbf\xfe\x27\x28\x2c\x7b\xef\xfe\x57\x8f\x10\x29\x7c\xea\xb7\xff\xfc\xb3\x8f\x03\x78\xbf\xf0\xd5\x0f\x7e\xea\x77\x3f\xf4\xf5\xbb\x7e\xec\x37\x7f\xf4\xc7\x7f\xfc\x47\xef\x7e\xf3\x9f\x3d\xf8\x7f\x65\x0f\xfd\xf4\xdd\x6f\x7f\xd9\x6e\x8e\xbc\xfc\x13\x08\xb6\x22\x75\x99\xd3\x64\x4e\xba\xe9\xbe\xdf\x5b\x84\xc5\xb5\xa3\xf7\xa2\x39\x98\x63\x34\x59\x5a\xae\x6a\x73\xd2\xf1\x9f\x9e\x9e\x5e\x20\x3f\x0d\xcb\xc7\x4f\xdc\xbf\x30\xb5\xcd\xe6\x82\x22\x8c\x21\x1b\x05\x45\xc4\xb3\x47\x9b\x1b\x8b\x4b\x6b\x45\xc2\xb5\xc8\x8f\xee\x5b\xbd\x95\x8c\x0e\x5d\x5c\xbb\x55\x02\xf9\xfb\x5e\xcf\x28\x62\xfe\xe9\x1f\x7c\xf9\x6f\x9f\xfc\x73\x80\xfc\x5f\xbf\x01\x18\x45\xc2\xb7\xb8\xff\x06\xbf\xef\x38\xdc\x00\x1b\x1f\x79\x3a\xfe\x4b\x90\xe9\x47\xe8\xe7\x86\x8f\x92\xff\xf6\xae\xf7\xfd\xea\x8f\x3d\xf2\x95\x8f\x16\xf3\xfd\x7c\x5c\x2d\xdc\xc3\xe7\xb4\x9f\xaf\xde\x38\x83\xdf\x33\xdf\x90\x4c\xa9\x23\x25\x52\x26\x89\x92\xa4\x54\xe4\xf7\xce\xb5\x85\xf7\x22\x05\x5d\xf8\xe6\x28\x1e\x36\xbf\xb9\xb1\x1d\x11\x97\xc6\x91\xf1\x52\xf1\x4f\xb8\xe7\xed\x6f\x7f\xfb\xdb\x87\xbf\x58\x0c\xab\x11\x86\x5f\xa6\x03\xfc\x34\x6f\x63\x1e\xbd\x58\x7d\xc1\xf1\xf9\xdb\xe7\x9f\x9a\xff\xf6\xbc\x30\x1f\xcc\xfd\xd2\xf4\x34\x7e\xcf\x8e\x06\x17\x94\xd9\x5f\x39\x31\xbf\x3e\x7f\x61\x9e\xcc\x97\xcd\x8e\x92\x81\xcd\x6f\x6e\xac\x7f\x93\xa7\x03\xa3\xa6\x8b\xb4\x00\xff\xaf\x97\x2e\x5d\xfa\xb3\xf9\xe6\x9b\x2f\x7f\xef\xa9\xb2\x71\xef\xd8\x1f\xd2\xaf\xa3\xad\x6f\xa1\xe2\xac\xf0\x2f\x0b\x4d\xe1\x8f\x91\x84\x5e\xa7\xbe\xe8\xc7\xa4\x07\xa4\xb7\x49\xc4\x12\x1c\xc1\x13\xc8\xcf\x88\x6f\x15\xb1\x28\x80\x80\x64\x80\x29\x0c\xa2\x48\xa4\x04\xc1\x57\x11\xa8\x08\x2e\x20\x60\xd5\x91\x50\x23\x11\xc1\x0b\x04\x08\x62\xde\xbc\xb9\xce\xd3\xe7\x8d\xc5\xf3\x95\x66\x93\xc5\x78\xe5\x33\x1b\x95\xc5\xf3\x9b\x77\x34\xd0\xe6\xe6\x49\x38\x0b\x2b\xd3\x20\x34\x87\x3f\x4a\xde\x9b\x9f\xc5\x4f\x7e\x19\x3e\x7d\x0f\x7c\x3a\xa4\x1f\xa1\x1f\x61\x5c\x09\xe0\x71\xa1\x49\x9e\xe2\x73\x0c\xaa\x7a\x7a\x0a\x4f\x0b\x08\x00\x40\x16\x7f\xc3\x16\xe0\x15\xc2\x45\xe1\x3e\x81\x20\x01\x04\x01\xfd\xc6\x3b\x01\x74\x80\x05\x00\x60\xed\xf2\x60\xb7\xb9\x79\x95\xb5\xb8\xd9\x54\x3e\xb3\x71\x47\x63\x89\x19\xe3\xd9\xd5\x95\x80\xbc\x97\x35\x47\x5e\xf5\xee\x77\xd3\x7b\xde\xf3\x9e\x9d\xf7\x7c\x51\xfd\x87\x16\x76\xb0\x87\xc9\x8f\xa1\x07\xd0\xdb\x10\x79\x10\x2e\xb3\xd0\x2a\xc8\x58\x92\xa6\x44\x01\x80\xa0\x44\x82\xaf\x4a\xa0\x4a\x70\x41\x02\x24\x81\x24\xe1\x7d\x6f\xb9\x39\xbe\xe5\xa6\xf2\x99\x4a\x79\xc7\x4b\xd3\xec\x96\x21\xc0\xff\x67\x7e\x8e\xf5\x03\xde\x0c\xaf\x86\x57\x87\xf4\x45\xf7\xd0\x17\x95\xef\x99\x6c\xfd\x85\xb0\x26\x3e\x89\x8e\xa3\x55\xf4\x32\xf5\x79\xc7\x11\xba\xe9\x3d\xb5\xda\x91\xa9\x97\x2e\xae\xd5\xd6\x00\x1d\x81\x23\x53\x0b\x7c\x1a\x67\x61\xe5\x06\x90\x6e\x80\x1b\xde\x7b\x4b\x7b\x6e\xe6\x07\x16\x04\x74\xe1\x6a\x73\x34\x97\xc3\xe3\xfe\xa6\xf2\x15\x66\x27\x5f\x2b\x12\x74\x36\x02\xd9\x13\xf7\xe7\xe1\x66\x98\x2a\xf9\x01\x9f\x7b\xed\xfd\x3f\xfb\xbf\xbc\xfb\x7f\xff\xe8\x1f\xfe\xa3\xcf\x7d\xe9\x8b\xcf\xfe\x8b\x77\xfe\xcc\x3f\xd6\xf8\xac\xcf\x49\xe7\x3d\xaf\x7c\xdd\x4f\xfd\xc8\x6b\xef\xbf\xfb\x97\x5e\xf7\xe9\x0f\xbf\xe5\xd1\x9f\xf8\xc1\x9f\xb8\x7b\xf1\xc3\xe5\x3c\x10\x3a\xb1\xf5\x32\xe1\xa3\xe2\x15\xf4\x02\xd4\x42\xef\x54\xef\x3e\x7a\x27\xdc\xf9\x79\x09\xad\x57\x5b\xd0\xfa\xfc\xfc\xec\x2d\xf3\x37\x49\xf0\xa7\xf3\x60\xce\xc3\xf1\x79\x10\xe6\x41\x9a\x97\xe6\x6f\x9b\x5e\x82\xa5\xff\xf8\xbc\xef\x91\x8e\xc3\xf1\xff\x78\x5b\xe5\xdc\x17\xc8\xf3\xc9\x1d\x5f\x98\xbe\x40\x5e\x41\xde\x49\x3e\x4b\xbe\x4a\xc4\xc6\xb4\x3a\x1d\x4f\x13\x32\x4d\xa6\x6f\x3a\xfa\xc5\xd3\xe4\xa6\x2f\xde\xb2\x8a\xd6\x59\xa6\x30\x1e\x72\xf1\x29\x05\x36\xea\x55\xbe\x78\xb5\x70\x6c\x5c\xea\x95\xf3\x4d\xe5\xea\xe6\xc6\x79\x85\x53\xbf\x74\x05\xe7\x9a\x1b\xc7\x88\x74\x33\x2c\x37\x37\x46\x69\x1f\x6a\x6e\xdc\xb5\x22\xad\xd5\x50\x45\x41\xab\x1b\xa8\xc2\x22\x0a\x29\x9c\x5e\x73\x63\x89\x9c\x10\x5e\xf6\x3e\xe7\x1d\x7f\xf0\xfe\xcb\x0f\x1c\xc5\xda\x8f\x7c\xe5\x93\xff\x39\x07\xf2\x37\xbf\xfd\x6f\xdf\xff\x07\xf4\x8b\xf4\xdf\xc3\xcb\xa1\x36\x80\xdb\xdd\x9f\x74\xbf\xff\xdc\x1d\x3f\x74\xf1\xd2\x43\xf3\xf0\xae\x8f\x7f\xae\xf3\x99\x7c\x9d\x9a\xa7\x4e\x4c\x75\xe0\x12\x1c\x85\x7f\x48\x5d\xfa\xef\x69\x8f\xfe\xfa\xcb\xdf\xf2\x4a\x78\x3f\xfc\x24\xfc\x3c\x7c\x96\x3a\xf4\x37\xbe\x41\x9f\xc2\x57\x56\x9e\x78\x78\x08\xfc\x1d\x58\xb4\x8a\x90\xf0\x98\xf8\x49\x6e\xef\x6d\x75\x06\xcf\x13\x19\xd0\xef\x48\x20\xb1\xe1\xeb\x3f\x9f\xaf\x68\x2f\x95\xe0\x94\x04\xc7\x18\xd1\x40\xea\x8a\x20\xca\xf3\x15\x4d\x13\xe1\x76\x11\xaa\x22\x4c\x8b\x20\xce\xce\x0a\x06\x02\x0d\xc1\xf3\x10\x4c\xa3\xe3\x08\xa3\xa9\x29\xe5\x07\x09\xbc\x94\xc0\x49\x02\x12\x39\x4a\x30\x11\xf0\xc5\x59\xa5\xb2\xac\xcd\x2a\xb3\xf3\xda\xcd\xb3\x30\x2b\xce\xcf\x8b\x44\x40\x8b\xe8\xc2\xc6\x05\x96\xb7\x6c\x9e\x39\x73\x15\xd6\x9b\x5c\x86\xcd\xe2\xf7\xe2\xf9\x17\x15\x17\x67\x36\xcb\x5f\x8b\xe7\xcf\x2f\xb2\xa8\xb1\x4a\x56\xc9\x1a\x34\xa7\x81\x9c\x3a\x2d\x4d\x11\xf2\xb4\x4f\x57\x7e\xe1\x77\xe1\x2f\x3e\x0d\x5f\xa3\x6f\x7a\xcb\xe9\x63\xcb\x37\xf8\xf0\x87\xf4\x85\xe2\x27\x9f\x79\x31\xfe\x71\x68\xff\xcb\x7b\x5e\xff\x2a\xfa\xfc\x62\x2e\xe0\x6d\x08\x09\x6f\x14\xaf\xa0\x79\x74\x0c\xdd\x82\x5e\xa9\x6e\x2c\xbd\x66\x79\xea\xb6\x29\x3c\x25\x08\xf3\x37\xbd\x66\xa6\xb6\x70\xfc\x6e\x34\x0f\x68\x5e\x99\xcf\xe6\x89\x3c\x3f\x55\x35\x3f\xb0\x00\xd6\x02\x2c\x2c\xa0\xe3\xe6\xfc\xe2\x31\x93\x0d\x5e\xaf\x5e\xe0\x29\x22\x4f\x19\x7f\x78\xf3\x8d\x2c\x4f\x60\x69\xc2\x79\x96\xe5\x2f\xad\xd6\x38\xb7\x59\xd6\x28\xad\xad\x2e\x15\xe1\x6b\x6d\xf5\x38\xac\xd6\x2a\x77\xae\xbe\x0d\xba\xb0\xf8\xad\x5f\x79\x2b\x7c\xff\xd6\x9f\xe7\x7f\xfb\x04\xdc\xf4\xbe\x77\xfe\xd2\xa3\x74\x00\x4d\xb8\x8b\x7e\x52\xbc\xf2\x9b\x9f\x76\x3f\xb2\x38\x73\x8e\x26\xff\xe1\x3f\x93\x97\xdd\x7b\xc9\xb1\xf2\x47\xf2\x0c\x16\x29\xf7\x8d\xff\x7a\xeb\x69\xe1\x7d\x3c\x76\xdd\xa1\xde\x04\xea\x72\x55\x03\x90\x66\x8f\x55\x5e\x83\xa4\x4c\xc2\xd2\xdc\xfc\xc5\x69\x01\x2d\x5f\x24\x4b\x45\xfa\xcd\xe7\xb8\x98\xed\xb3\xe0\x74\x72\x9b\x6d\xc7\xa6\x4e\xf1\xf4\x65\xb1\xb9\x21\xfc\xc8\x2f\xfc\x29\x7d\x92\x76\xe1\x1e\x38\xf7\xe7\xbf\xfa\xf2\x5f\x7e\xe4\xcf\xb6\x50\xf6\x8d\x9f\xfd\xe3\x0f\xbd\x10\x3c\x78\x03\xdc\x0d\xbf\xf8\xea\xf7\xbd\x9c\x7e\x9a\xfe\x2d\xbd\x4a\x3f\xcf\xf9\xc2\xe4\xf7\x26\xf1\x0a\x92\xd1\x02\xfa\x07\xea\x0d\x47\x5e\x23\x56\x66\xee\xe6\x9e\x57\x41\x19\x22\x32\x9a\x36\x81\xcc\x98\x4c\xb1\x7c\xf8\xc3\xc4\xa3\x7c\xe5\xea\x1d\x8d\x66\x65\xb5\x68\x9f\x54\x78\xbe\xf7\x36\x78\x35\xbc\x08\x5e\x47\x7f\x81\xfe\xda\x4f\x9a\x78\x99\x2e\x89\x57\xe8\x5b\xe9\x6f\xd0\x47\xa8\x2b\x1e\x7b\xf6\x32\xfe\x3e\x7c\x27\x83\xfd\x12\x42\xc2\x9a\x78\x05\xcd\x22\x55\x3d\x29\xcb\x20\x20\x75\xf1\xa8\x86\x8e\x48\x33\x77\x67\x00\xcc\x1d\x4f\x5f\xb4\x18\x39\x67\xc4\x8b\x98\xcc\x5c\x84\xa2\x61\x9e\xc4\x31\x27\x74\x75\x43\xf9\xcc\x99\x8d\xca\xf9\x75\x36\xf4\xe0\x83\x60\xfe\x23\xac\x0d\xaf\x90\x97\xe5\x36\x7e\x43\xfe\x08\xf6\xc5\x2b\x1f\xa6\xff\xf0\x43\xf9\x00\x01\xfa\x3b\x84\x84\x17\xf1\xf9\x81\x1f\x54\x8f\xca\x32\x7c\x95\x40\x44\x80\xcc\x4a\xe8\x6e\x04\x2a\xe8\x40\x80\xa5\x06\xb5\x95\xaa\x56\xb4\xbc\x2e\x5d\x94\xfe\x46\xda\x92\x04\x49\x55\x56\x34\x49\x42\xac\x1f\xec\xf6\x79\x27\xce\x6c\xb2\x6e\xf0\x54\xf2\x33\xdc\x37\x36\xee\x58\x5d\x1b\x75\x03\x3e\xfa\x38\xf9\xa7\xf9\x1b\x59\x1f\xc4\x2b\x1f\xce\x87\x1f\x46\x80\x7e\x7a\xeb\x69\xe1\x25\xe2\x93\x2c\xa7\x53\x4f\xa2\xa9\xa3\x77\xcf\xe1\x1b\x16\x5f\x83\xa6\x60\xaa\x7a\x71\x1d\x5d\x44\x18\xa9\x4a\x55\x43\x68\x79\xe1\xe2\x91\x19\x61\xf9\xa2\xb0\x34\xce\x5a\xcf\xf0\x3b\xbe\xaa\x7c\x65\x83\x0f\x5c\x60\xb5\xb2\x53\xe5\x7c\xf4\x79\x57\x65\x0d\x87\xf0\xe8\xa7\xaf\xd2\x67\xe8\x97\xe0\xc5\x70\x53\xf4\xcb\xda\x2f\xbc\x35\xfa\x22\xfc\xdc\xeb\xde\xf0\x4d\x22\xe4\xcd\xff\x1f\xbc\x13\xfe\x39\x5c\x84\x77\xbe\xfa\x43\xaf\xa2\x7f\x4c\xff\x4b\xfe\xf1\x9b\xe1\xe3\xc5\x98\x8b\xe9\xfe\x25\x5c\x17\x17\xd4\x53\xd3\x70\x37\x3a\x22\x0b\x77\x2b\x62\x4d\xc4\x35\xb1\x21\x62\x91\x5c\x0c\x64\x58\x90\xd7\x65\x2c\xc9\xf2\x8c\x44\xc4\xc2\xbc\x9b\x6c\x10\xca\xfb\x56\x58\xca\x06\x1f\x8b\xae\x56\xd6\x8a\xcd\x02\x85\x97\x3c\x91\xff\xce\x13\x4f\xe0\x7f\xfa\x04\xfe\x48\xfe\x6a\xf1\x4a\x5e\xbc\x92\x52\x8c\x73\xc9\x53\xbc\xbd\xef\x53\xeb\xb3\xf2\xcc\xdd\x22\x8e\x09\x7c\x88\xc0\xc3\x04\xc8\xbf\x21\x20\xbc\x9e\x80\xa8\x10\x9d\x60\x32\x2d\xbc\x4e\x22\x64\xe6\x75\x9c\x77\x25\xf7\x2f\xf2\xff\x58\x44\xe4\x63\xa0\xdb\xe1\xec\xc9\xca\xc9\xb3\xab\x2b\x62\x45\x24\x4f\x0d\x07\x70\x9a\x7e\x89\xc8\xf4\x3f\xc1\xa9\x37\x2d\x0b\xc1\xf2\x9b\xde\xb4\xfc\xac\xb5\xcc\xdb\xbd\xbc\xf5\x34\xf9\xbc\x78\x05\x1d\x41\x67\x3e\x26\xdd\x3d\xcd\xf4\xbd\x3c\x3d\xa7\x4d\x2f\x20\x94\x30\x92\x23\x72\x11\xe6\x96\xa6\x08\xba\x70\xa1\xc9\x6e\x4b\xf9\xca\x99\xab\xc5\x40\x66\xe3\xdc\xd9\x4a\xb3\xc2\x46\x2f\x97\x3f\xf4\xf0\x07\x1f\x7f\x9c\x7e\xe3\x9b\x5f\x3a\xfd\xe8\xf7\x7e\xe0\x61\xf2\xdf\x87\x47\xfa\x5b\xc5\x1c\x04\x8f\x57\x73\xe8\x8f\x7f\xe7\xd4\xdc\xb9\xb9\x97\xcc\x91\x39\x96\x53\x5f\x56\xaa\xda\x60\x06\xbe\x34\xf3\xd4\x0c\xee\xcd\xc0\x27\x66\xa0\x3d\x03\x97\x67\x60\x46\x9e\x53\xb4\x07\xa7\xc1\x98\x86\xe3\xd3\x30\x33\x0d\x1e\x4b\x40\x98\xe9\xcb\x73\x0b\x5a\x8a\x01\x2b\xb3\x47\xb5\x97\x62\xc0\x73\x48\x16\xee\x46\xa2\x29\xda\xa2\x2b\x0a\xe2\xac\x32\x3b\x1b\xa3\x0c\xe1\x4b\x85\x71\xaa\xc8\x44\x02\x52\xd0\xa3\xf2\x15\xf9\x3f\xc8\xe4\x01\xf9\x6d\x32\x3e\x25\x9f\x93\x5f\x2d\xdf\x23\x0b\x04\xcb\x73\x82\x38\xa1\xb2\x22\x75\x87\xf5\x16\x93\xdf\x7a\x8b\x8d\x88\x2a\xe7\x79\x12\x71\x66\x13\xce\x9c\xd9\x2c\xfc\x71\xf9\x6b\x75\x0d\xa6\xb8\x36\xef\x82\x26\x08\x1f\xfd\x3c\xfd\xde\x77\x3c\xfe\xf8\x83\xf0\x87\x9f\xcb\xbf\x85\x1f\xff\xc9\xbc\x2b\x5e\xc9\x4f\xb6\x71\x33\x7f\x08\x01\x7a\x0a\x21\x3e\x96\x14\xd1\x0b\xd4\x13\x22\xb3\x65\x71\x8a\xdc\x8d\x90\x8e\x4c\x64\xa3\x98\x0b\x78\x0a\x01\x21\x17\x0b\x17\x52\xf8\xb0\x33\xcc\x7f\x34\x2b\xab\x2b\x4f\x3d\x81\xdf\x24\x5e\x79\x26\x7b\x94\xe9\xe9\x8d\x08\x09\xaf\x15\xaf\xa0\x25\x74\x45\x9d\xfb\xd6\x12\x5c\x59\x82\x47\x96\x7e\x6d\x09\x2f\x31\x81\x9e\x3c\x52\xd1\x4e\x2f\x81\xb4\x74\x74\x09\x3f\x35\xfb\xed\x59\x3c\x5b\x3b\x72\x54\xfb\x9e\x59\x98\x9e\x3d\x3e\x7b\xfb\x2c\xf9\xba\xfc\xf7\x32\xe6\x53\xe7\xff\xff\x23\x47\xb5\xb3\x32\x48\xf2\x51\xf9\x94\x4c\x06\x08\x3e\x81\x20\x40\x6d\x84\x91\x72\xa4\xa2\xd5\xcb\xa0\x56\x99\x7f\x26\x39\x92\x1d\xc1\x0b\x47\xe0\xc8\x0a\x16\x9f\x41\x92\x22\xa9\x92\x2e\x09\xd2\x2c\x4c\x91\x45\x3c\xff\x43\xd3\x30\x2d\x71\xf1\x6d\x6c\x6e\xbc\xa0\x79\xa1\xc9\x86\xbb\x7c\x08\xb9\x79\x95\x3f\x57\xd8\x96\xda\xe8\x67\x15\xd6\x16\x57\x98\xe4\x96\x9a\x4b\xcd\xca\x1a\x1b\x98\x03\x5e\xa6\x7f\x25\x2f\x3e\xf2\xad\x81\xf4\xcc\xf0\x97\xe6\x65\xfa\x35\x11\xd1\xbf\x7f\xc7\xf0\x3d\xe2\x95\x67\x0d\xa1\xfd\xcc\xcb\xc8\x03\xf7\xc0\xea\xb3\x78\x64\x8f\x2f\x16\xaf\xa0\x05\x74\xff\x27\xd0\xf4\x56\xa6\xbe\x5c\xa9\x6a\xff\x64\xfa\x9f\x4d\xff\xe8\x34\xb9\x73\x1a\x56\xa6\x4f\x4e\x63\x69\x1a\x40\x51\xaa\xda\xcb\xe0\x6e\xf8\x71\x20\x2f\x04\xb8\x01\x9e\x07\x78\x1a\x00\xe6\x9f\x5d\xa8\x4c\x4b\xcf\xa2\xa9\x64\x2a\x9b\x22\x53\xf3\xff\x14\xff\x10\xc6\x58\x26\x2f\x99\x79\xf5\x0c\x9e\x99\x2a\x6f\xe5\x42\x73\x73\x74\x23\x57\xcb\xc7\x23\xfc\x46\xce\xac\xae\x8d\x7a\x0f\x4d\x7c\xb6\xd2\x14\x5e\xfc\x67\xf9\x27\xe5\xc5\xc7\xbe\x80\xff\xb1\x34\xff\x51\xe1\x71\xfa\x5f\xde\x31\xfc\x86\x78\xe5\xd9\xef\x87\xf5\x1f\x25\x35\x16\x3b\x5e\xb5\xf5\xb4\xf0\x26\x3e\x87\xb6\x84\x6e\x53\x97\x8f\xbc\x66\x6a\x65\xf1\x35\x27\xf0\x3a\xc6\x58\xb9\x28\x08\x33\x17\xd1\x52\x19\x35\x36\x8b\x98\x21\xb2\x40\xc1\x5d\xd8\xe9\x62\xc6\xac\x56\x51\xb0\x95\x3f\x8d\x8f\x02\x82\x0a\x7d\x7a\xeb\x37\x3e\xf8\xab\xff\x8e\xfe\xe6\x32\xfe\x6f\xf8\xaf\xe9\x83\xf4\x11\xfa\x08\x75\x7e\x15\x6e\x85\x7f\x00\xeb\x70\x73\xfe\xf1\xfc\x63\xe5\x3a\xc7\xd2\x6f\xfd\x3f\xac\xfd\x7b\x7c\x54\xd5\xf5\x37\x8e\xef\xb5\xf7\xb9\xcf\xe5\x9c\x33\x73\xe6\x96\xc9\x65\x26\x43\x26\x84\x11\x27\xcc\x10\x42\xe4\x92\x51\x91\x0c\x01\x42\xa0\x14\x30\x10\x12\x15\x10\x85\xca\xcd\x1b\x52\x1a\x90\x22\x52\x44\x50\x10\xaf\x05\x4a\xa9\xf5\x83\x17\x50\x63\x8c\xa0\x5c\x44\x51\x3f\xfc\x14\x2d\x5a\x4b\xad\x42\xaa\xb6\x55\x51\xa3\xf5\x56\x4d\xce\xfc\x5e\x67\x9f\x93\xc9\x24\xf0\xf4\x79\xfe\xf8\xbe\x90\xcc\x44\xf6\x59\xfb\xb6\xf6\xda\x6b\xbd\xd7\xe5\x88\x48\x45\xc3\x53\xc5\xce\x99\x86\xbc\xc6\x9c\x5b\x82\x06\x84\x37\xe3\x9d\x98\x60\xd4\xbc\x43\x02\x49\x02\xb5\xd9\xc2\x03\xb3\x37\x88\x09\x02\x0c\x29\x07\x35\xa2\x86\x43\xaa\xc6\x84\x4b\x8d\x63\xae\x84\x23\x70\xed\x7e\xd8\x8a\xb1\xfe\x99\xfe\xc3\xa1\x3d\xc7\x1e\xd5\x9f\x78\x0d\x57\x75\xbf\xc2\xb6\xe9\x53\xdf\xfb\x6e\xfb\xe6\xfb\xc1\x47\xe7\xac\x5f\x49\xe7\x2c\xa3\x00\xfa\xf9\x73\x08\x65\x3a\x53\xe5\x0e\x35\xcd\x22\xd1\x3d\xd3\xb9\x90\xfc\x92\xdc\x41\x08\xf1\xdb\x9c\x69\x82\xb1\x33\xe8\x9f\x59\x24\xc6\x45\x2c\x7a\x9b\x6c\x8c\xd2\xc4\xb3\x3c\x21\x88\x77\xa3\x6a\xcb\x87\x65\x2d\xcd\x1b\x89\x78\x32\xd6\xa8\x74\x50\x5d\x28\x56\x42\x7d\x52\x5c\xa4\x67\xad\xd8\xec\x52\x91\xd9\x3f\x7f\x71\xf9\xd9\x59\x03\x06\xf6\xac\x58\xf7\xe7\xe6\x82\x95\xb6\xae\xb9\xf3\xd1\x8f\xb9\x9e\x65\xeb\xfe\x3a\xd5\x6f\xd1\x30\xda\x8f\x10\xb3\x85\xca\x5e\x0d\x2d\x4b\x8d\x8f\x39\x21\xcf\x09\x36\x41\xf1\xa7\xcb\x6c\xe0\xb7\x81\x24\xb8\xfc\xe9\x32\x09\x04\x09\x24\x51\x11\xc5\xb1\x02\xd8\x04\x50\x66\x72\x29\xb7\x37\xcd\x79\xed\xc6\xd2\xae\xa2\x8b\xcb\x60\x81\xa0\x66\xbb\x1d\xb4\x66\x42\x24\xa0\xbe\x4d\x63\x75\x3b\xd4\x2a\x6b\x79\x63\xc6\x4c\x0c\x31\x93\xb4\x8e\x49\xac\xb1\xd1\x5a\x6e\x85\x85\x08\x94\x9a\x06\x74\x0c\xe0\x86\x03\x30\x17\x0b\xfa\x69\xd8\xf8\x9e\xbe\xeb\xe3\xdd\x8f\xee\xda\xf9\xd4\x0e\x3c\xab\x7b\x37\xdb\xa6\x5f\xa1\x77\x5c\xd3\xbd\x04\xcf\xda\xfe\xeb\xcd\x1b\x7f\x69\xde\x1f\x1b\x33\x67\x99\x6a\xf6\x38\x2a\x42\xc3\x53\x45\x8a\xc2\x36\xec\x0b\x1e\x0e\xe2\x60\xd8\xd3\x60\x43\x08\xd9\xc0\xe6\x61\x9d\xa4\xb9\xd0\xed\x6e\x72\x32\x96\xd6\x50\x45\x21\x2a\x85\x9a\xf5\xc9\xb8\x85\x4e\x55\x0c\x8d\x96\x5e\x08\x15\x43\x07\x24\xe9\x45\x1a\xf2\x68\x5e\x5f\x21\x78\x34\x26\x12\xda\x78\xf2\x38\xcc\xde\xf8\xee\x9b\xcf\x00\x9c\xf9\xf8\x40\xea\xc8\x1f\xf5\xf7\xd6\xbc\xfe\xdd\x1f\xf4\xcf\x32\xfa\xf7\x43\x9e\x9a\xd6\x39\x7f\xf1\xc4\x71\xc7\x77\x3d\xf1\x72\xdd\xee\xba\xb7\xe6\xfd\xb2\x66\xc6\x81\x2d\x87\xdf\xa3\x63\x9b\x87\x10\x33\x87\x6d\x43\x3c\x1a\x99\x1a\xc0\x71\xa8\x81\xbc\x09\xb0\x0b\x60\x0b\x00\xb9\x13\x80\xb9\x0a\x80\x55\xa0\x1e\x30\xf0\xa4\x89\xb1\x14\x8a\xdc\x5b\xed\xd8\x57\x2f\xc6\xcd\x8b\xb4\x22\xec\x09\xe3\xa3\x07\xf4\xd9\x44\xd7\x9b\x58\xd7\xee\xdd\x06\xfd\x95\x99\xb3\x4c\x3d\xdb\x8e\x9c\xa8\x34\xe5\x75\x34\x9c\x81\x4e\xc0\xa0\x88\x0d\x86\xc5\x68\x6b\x62\xdc\xa6\x5f\xbc\xe7\xac\x99\x0c\x6e\x70\x4d\x00\x92\x06\x1f\xb9\x55\xa6\xbe\xeb\x1b\xbd\x60\x3f\x24\xa1\x94\x65\xdb\xbb\x26\xe8\x5d\xfa\x59\x9c\x4f\x9e\xe8\x9a\xa5\xaf\x84\xb5\xc4\xd0\x55\x4c\xdb\xa1\x0d\x49\xe8\xfe\x94\xff\x6a\x16\xda\x09\x10\xc1\xa1\xa6\xcb\x08\xf8\x09\x88\x04\x9e\xc5\x80\x0d\x3b\x62\x84\x43\x4d\x47\x31\xf8\x30\x70\x18\xe6\x23\xf8\x17\x01\xf2\x4f\x0c\x58\x10\x98\x34\x9a\x81\x70\xd6\x70\x00\xb0\xd7\xb0\xd3\x59\x5c\xc2\x02\xc7\x7a\x0d\x6b\x5f\x30\x64\xb9\xd3\xe6\x4f\xbb\x04\x10\x08\x30\x04\x93\x1e\xef\x78\x63\xcc\x34\x18\x2c\x7b\xc1\x34\x17\x4c\xec\xab\x47\x46\x35\x36\x42\x12\x22\x90\x04\xaf\x6f\x58\x25\xf9\xf8\x15\xdd\x77\x40\x0f\xbc\x04\xa5\x65\xf1\xa2\xd1\x26\xb6\xdf\x75\x45\xcb\x89\xbb\x8e\x9a\xfc\x82\x11\x62\x8e\xb3\x6d\x28\x00\x57\xa5\xa6\x96\x05\xaa\x02\x58\x08\xf8\x03\xb8\xd4\x03\x1e\x0f\x70\x1e\xe0\x35\x9f\x56\xaa\x91\xa8\x32\x4c\xc1\x65\x52\x95\x84\x07\x72\x10\xe0\x40\xe0\x20\x8a\x87\x61\xcc\x63\x1f\xc6\x69\x75\xbe\xfa\x88\xda\xae\x32\x65\x6a\x95\x8a\xd5\x7f\x2a\xdf\x2b\xf8\x98\xf2\x67\x05\xb7\x2a\xa0\x18\x73\x09\xcb\xee\xf4\x54\x05\x2e\x53\x40\xf1\xfd\x03\xe0\x15\x78\x17\xf0\x1f\xe0\x19\xc0\xdb\x00\x6e\x82\x75\x80\xc1\x68\x75\x87\x28\xa7\xe1\x13\x04\xaf\xa2\xbf\x20\xbc\x07\xed\x47\xf8\x7e\x04\x37\xa3\xdb\x8d\x4b\x49\x94\xd3\xc8\xf1\x2f\xe9\x07\x09\xbf\x26\x9d\x92\xf0\x01\x09\x6e\x97\x1e\x91\xf0\x35\xd2\x72\x09\xcf\x94\xa0\x56\x02\xe9\x6a\xf1\x8f\xe2\xb3\x22\x89\x8a\xc3\xc4\xb1\x22\x11\x99\x01\xbe\xa1\xbe\xad\xbe\xdd\x3e\x86\x61\x34\x66\x0e\xf3\x12\xf3\x36\xc3\xfa\x1c\x0c\xe3\xf0\x11\xd7\x40\x1e\x78\x45\x00\x41\x08\x96\xba\xc1\xed\x62\x7c\xe3\x1d\x33\x1d\xd8\xe1\x53\x11\xe2\x25\xd5\xe5\x32\xf4\x1c\xba\xde\x71\xe3\x94\xaa\x49\x63\xd1\xd5\x64\xbc\x31\xd9\xe8\xf2\x55\x8d\x8a\x9b\x21\x0a\x8d\xa6\x89\x46\x77\xc3\xbc\xe7\xac\x0f\xe3\x9f\x8c\x6f\xc9\xc6\xc6\x3e\xbe\x75\x63\x67\xdc\x5e\xdf\xb0\x20\x24\x49\xc4\x34\xe3\x22\x24\xe9\xf6\xba\x3c\xc3\x2a\xb1\xf2\xe4\x5d\xa3\x6c\xb8\x7a\xec\x9e\x03\x07\x1f\x19\x98\x17\x0a\x3f\x74\xf0\xf8\x9e\x19\xbe\x62\xff\x85\xa4\xb3\xfb\xfb\xf7\x66\x54\xe0\x61\xf8\xde\x1f\x6b\xf1\x98\xdf\x6c\x7e\x7c\x51\xf7\x41\xb6\xad\xfb\x9a\x7d\xfa\xc2\xd2\x7b\x7f\x87\x00\x55\x20\xc4\x6c\xa3\x72\xeb\x60\x6a\x80\x20\x88\x36\x9b\x84\x78\xc4\xb2\x0c\xc6\x04\x38\x10\x04\x9e\x65\x39\x46\x64\x6c\x36\x84\x31\x10\x89\x37\xf8\xd3\x67\x97\xd3\x1c\xef\xe5\xa3\x3c\x11\x0d\xb5\x4a\x14\x03\x62\x99\x48\x88\xf1\x6f\x23\x8d\x7f\x23\x5e\x12\x25\x84\xaa\x5c\x22\x04\xa0\x0c\x88\x4d\xc0\x2c\xc3\x88\x12\x48\x7b\x0d\xfd\xca\xc1\x73\x84\x63\x30\x6b\x13\x18\x5e\x94\x08\x47\x80\x98\x87\xd6\x97\xa8\xf6\x25\x7d\x55\x10\x4f\x9a\xfe\xa5\xc6\x44\x22\x9e\x54\x7d\x55\x8d\x31\xf3\xcf\x90\xf2\x75\xc2\x61\xe1\xb0\x72\xce\xcf\x70\x44\x84\x88\x68\x18\xb9\x49\x60\xb6\x9d\xd4\x7f\xab\xdf\xfd\x02\xbc\xac\x37\xbc\x02\xe3\xa1\xee\x90\xde\x80\x57\x74\xaf\xc5\x5d\x78\x7f\xf7\x5b\x38\xde\x3d\x81\xf2\xaf\x71\x1e\xf7\x50\xdb\xec\x99\xe7\x90\x90\xf9\x21\x35\xc0\xa1\xa4\x0d\x1d\x0f\xfb\x04\x98\x0f\x37\x03\x6e\x00\x48\x03\x94\x41\x15\x60\x3f\x40\x29\x7a\x16\x61\xd4\x9e\xf9\xe1\x69\x87\x9a\x16\x8c\xc9\xd6\x6a\xfe\xb4\xb0\x97\xcf\xf0\xf8\x72\x1e\x78\xd6\x54\x34\xcf\xe0\x4e\x8c\x57\x60\xa8\xc7\x80\x31\x62\x1a\xde\x64\x61\x17\x0b\x5b\x58\x20\x77\xb2\xc0\x5c\xc5\x02\xab\xb0\xf5\x2c\x66\x39\x6e\x28\x02\x44\x08\x30\x2e\x1e\x28\xd3\xb8\xaa\x8c\x13\x19\xcf\x91\x5a\x5f\x55\xbd\x18\x6f\x6c\x6c\x4c\xc4\x94\x63\xc6\x4f\x53\x9f\xb4\x18\x22\x66\x4c\x95\xbe\xa5\x03\xcf\x81\x95\xaf\xe9\x81\x03\x7a\xe0\x38\x3e\x89\x3f\xec\x5a\xd3\xfd\x0a\x8e\x93\x75\xb9\x72\x53\x44\x63\x52\x03\xa3\x02\xf0\x82\x4f\xc0\x65\x04\x04\xe2\x27\x98\xf0\x3c\x35\x45\x6d\x02\x66\x18\xcc\x33\x4d\x2c\xc1\x82\x69\x12\x9a\x36\x81\x71\x8d\x52\xde\x8d\x27\x4d\x6e\x2c\x83\x0a\x13\x26\x0f\x33\x73\xba\x30\x09\x74\x75\x91\x77\xba\xfe\x49\x06\xdf\xc5\xb4\x3c\x7c\xd7\x4f\xab\x4d\x9f\xe5\x43\xfa\xf3\xe4\x31\x2a\xab\x93\xa9\x10\x43\x7b\x10\xb9\xaf\x5a\x60\x13\x1c\x82\x13\x70\x1a\x58\xc3\x0c\x65\xbf\xc5\x3f\x70\xdf\xc2\x7f\x7a\x34\x18\xea\x9d\x6e\x4c\x52\x3b\x8c\xda\x7b\xe4\xb1\xee\x4e\xac\xe8\x0f\x43\x83\xfe\x3c\xf7\xe3\x3d\x3f\x0e\x39\xd7\x27\x89\x01\x58\x44\x08\x83\x5d\x86\x74\xce\xfa\x24\x93\xa6\x4f\x12\xd6\xe2\x65\x4f\x75\x6f\xec\xf1\x49\x02\x84\xf5\xe7\xc9\x10\x3a\xae\xa1\xcf\xc2\x57\x8b\xb9\x55\x1c\xe6\x0c\x63\xc5\xa3\xf9\xd3\x1c\x27\x12\x43\x97\xc6\x08\xbe\xe5\xfe\x83\xbf\x65\x7f\xe8\x19\x98\x41\x31\x46\xfd\x91\xb4\xf2\x9d\x1a\x86\x30\x34\xe8\x0f\x63\xa5\xbb\xf3\x09\xf6\xc4\x3d\xff\xe1\xe8\xb8\x16\xe1\x12\x66\x36\x7b\x04\x71\x28\x99\x0a\x60\x60\x43\x9a\x3f\xcd\xb2\x88\x21\x34\x70\x9d\x41\x88\xb5\xb0\xce\x64\x32\x9e\x30\x06\x9a\x50\xde\x48\xa8\x55\xa3\xe2\xb1\x64\x72\x48\xb9\xdb\x10\xbb\x22\x2c\x82\x47\xe6\x41\xc7\x2e\x7d\xb3\xfe\x22\x2e\x21\x0f\x75\xcd\xc1\xa7\xbb\xc3\x74\x4d\x33\x9d\xfa\xf3\xcc\x7b\x99\x34\x22\xc8\xd5\x86\x10\x0b\xb0\x1f\xa3\x78\x07\xc4\x55\xe3\xd6\x35\xb6\x84\x79\xef\x27\x0f\xf3\x99\xfe\xfc\x1d\xe6\x1e\xec\x62\x4e\x91\x18\x17\x46\x3c\x2a\x4a\x29\xec\x3a\xe6\x36\x63\x13\xd8\xbb\x65\x68\x02\x0c\xd4\x05\x6d\x2c\x56\x37\xf5\xd7\x47\x4b\x2b\x92\x5e\x1f\x89\x2d\x7f\xf8\xda\xf7\xa6\xcd\x60\x4e\xdd\xf9\x07\xcf\x53\x2b\x10\x46\xeb\x32\x67\x19\xcc\xcc\x46\x3e\x14\x46\x97\xa4\xa2\x36\x08\xd7\x6c\xf2\xed\xf0\x61\x5f\x24\x3f\xad\x22\x41\x11\xb0\x20\xf8\xa7\xd8\x6c\x85\x8a\xb3\xde\xad\x40\x61\x1d\xeb\x45\x34\x14\xc3\xf4\x65\xc6\x29\x9c\x91\x34\x21\x7f\xc3\x88\x2d\x8d\x38\xc1\xf4\x5d\x54\x56\x0c\xcd\xe2\x9a\x2a\xe1\x9d\xe0\xd1\x0c\x9d\x85\xb4\x94\x08\x13\x77\xad\xfa\xfd\x73\xa0\x1f\xff\x66\xcb\x33\xd5\x2f\x1d\xf8\xf0\x78\xeb\xae\x97\x76\xbf\xba\x65\xef\x7d\x57\x8c\x7f\xec\x41\x98\xa0\xf0\x97\x9d\x9d\xb2\xbe\xf9\x89\xc3\xdd\x0a\x0e\xf0\xc2\x82\xeb\x9e\xfa\xfd\x56\xaa\x7f\x6d\xcf\x9c\x65\xc6\x70\x1a\x72\xa1\x7c\x74\x51\xaa\xd8\x9f\xfe\xd2\x99\x71\x62\x67\x21\x08\x9c\xbb\x06\x91\x7d\x04\x13\xf0\xd6\xab\x5e\x21\xaf\xde\xa6\x30\x88\x18\xe3\xec\x45\x7d\x12\x89\x2a\xf3\x52\x2f\x89\xf0\x86\x61\xa6\xf1\xc9\x61\x49\xcb\xe9\x4c\x34\xcb\xe1\xc6\xc1\x54\x7b\xc9\xda\x36\x41\x58\xf0\xee\x6b\x1f\xff\xe3\xd5\x13\xcb\x36\xdc\x07\x8a\xfe\xc5\x83\xb7\x6d\xd8\xc0\x69\xfa\xed\x93\xef\xda\xad\xbf\xa3\x7f\xa3\x7f\xad\x9f\xc4\x23\x3e\x3c\x02\x0f\xc3\xf6\xe7\xcd\x7b\xf2\xb1\xcc\x59\xa6\x84\x99\x8d\xdc\x28\x96\xf2\x21\xb4\x49\x04\xd1\xc3\xa6\x91\x0c\x32\x99\x0c\x2e\x45\xe4\x27\xdb\xbd\x14\x0e\x4e\x5a\xfa\x6a\x63\xc2\xd8\x54\x43\x75\xa2\x10\x44\x2f\x14\xc5\x94\x8c\xde\x76\xa3\xbe\x11\xae\xf9\xed\xee\xdb\x8e\xea\x19\xfd\x23\x28\x06\xfe\x29\x26\xb2\xbd\x4a\xbf\x4a\xbf\x76\xf4\xce\x51\x10\x01\x05\x02\x10\xa5\x6b\xb2\x3e\x73\x96\x89\xd3\x35\x29\x40\x17\xa5\x22\x1a\x72\xd6\x6c\x56\x77\xaa\x58\x2d\x0a\xa4\x11\xf5\x49\x10\x4e\x46\x36\x5f\xbd\xa8\x40\xb0\x9e\x78\x5d\x3d\x9b\x97\xa8\xee\x51\x73\x8c\x7d\x2b\x89\x70\xa6\xeb\x3d\x99\xf0\x25\xa3\x86\xc1\x1e\x21\x15\x43\xad\xc1\x0d\x23\xab\x85\x25\x6f\x19\xeb\xf1\xc6\xf5\x76\x7b\xdb\x96\xc8\x86\xfb\xf4\x4e\x70\xdd\xb7\x76\xcb\x1f\x21\x06\x76\x70\xc2\xe0\x9d\xab\xc3\xd0\xfa\x9f\xb3\xf0\x63\xd9\x87\x47\xf4\x06\xfd\xca\x27\x8d\xb1\xad\xcd\x9c\x65\xd2\xcc\x6c\xa4\x22\x2f\xaa\x49\x5d\xe0\x4e\xb3\x32\x2a\x42\x18\xf9\x5d\x90\x46\x36\xc5\x86\x15\x5b\xc8\x86\x6d\x50\x2f\xbb\x8a\x5c\x98\x77\xb9\x88\xa7\xde\xa9\x90\xc9\xac\xe0\x35\x7d\xd0\x2e\xea\xaa\xef\x01\x49\x96\x24\x0c\x4e\x0e\xbb\xcc\xd5\x2a\x46\x14\x31\x76\x79\x4a\xc2\x4a\x38\xc4\xa4\xbb\x7e\x14\xa0\xfe\xe8\xde\x87\x8f\x7d\xab\xff\x15\xe4\x0f\xdf\xee\xee\xd2\xf1\x28\xbd\x53\xff\x1c\x63\x7d\xfd\x84\x9d\xe3\x21\x06\x1c\x48\x50\xa9\x7f\x73\x3a\x02\xa6\x9c\x79\x08\x21\xa6\x81\x2b\x42\x1e\x34\x36\x35\x10\x21\x87\xc3\xa7\xe1\x1a\xc2\x93\x4d\xec\x97\x2c\x66\x59\x83\xa3\x3a\x09\x21\x0c\xd4\xf1\x9c\x26\x2b\xf5\x4e\x1b\x60\x0f\x05\x38\xaa\x93\x56\x30\x49\xbc\x91\x82\xde\x6a\x32\x5e\x45\xcf\x28\xf5\x28\x97\x98\xf0\x36\x1f\x8d\x14\x73\x05\x10\x66\x34\x7d\x45\x9b\x7e\x14\x46\xb5\xbe\xb5\x7a\x45\xd9\xfc\xab\x57\xcc\x80\xb5\xe4\x48\x57\x35\x39\x72\x5d\xb8\xf9\xc8\x13\x91\x4d\xf9\x73\x96\xcd\x47\x88\xa0\x79\xba\xc6\xcc\x63\x66\xa3\x01\xe8\x02\x34\x0c\xad\x4a\xc5\x87\xaa\x2a\x1e\x20\xe6\x33\x45\xa5\x63\xa1\x89\x39\xcd\x7c\xc9\x64\x18\x86\x19\x6e\xcb\xcb\x2b\x2a\xaf\xf6\x4e\xf2\x36\x79\x89\xd7\x1b\x1b\xbb\xaa\x68\x73\xd1\xce\x22\x52\x64\xc8\xb9\x02\x4e\x4c\x17\xe5\x33\xc5\x25\x53\x78\xfe\xc2\xb2\x49\xc5\xfe\x0b\x27\x3b\x1c\xc5\x4a\xa2\xce\x1d\xc4\x48\xa6\xea\x6d\x75\x55\xbc\x23\xa1\x50\x7f\x1d\x55\xee\xcd\x30\x84\x23\x6a\x32\x7e\x44\xf9\xa0\x31\xd1\xe1\xf2\x55\x25\xe3\x47\x86\x94\x83\x87\xf7\x52\x4f\x64\x29\xe7\xd1\x46\x40\xc2\xeb\x51\xc2\xc5\xd1\x8a\xa1\x95\xc6\x5f\x1a\xfd\x97\x4c\xf8\x48\x36\x32\xad\xd8\xa3\x85\x0d\xb3\x80\x99\xf7\xd2\xc5\xef\x1c\xac\x2c\x9a\xf3\xbb\x03\x4f\xb4\x77\x1f\xff\xeb\x87\x9d\xcd\x6b\x2f\x9f\xf7\xce\xcb\xd3\x52\x0f\x9c\xee\xe8\x80\xcb\x9e\xff\x07\xc8\xb0\x61\x0e\x53\xbb\x24\xf8\xf3\x55\xbf\x3b\xc4\x0d\x9f\x38\xf5\x81\x4d\xfa\xba\xdf\xdd\xf5\xf6\x45\xf1\x05\x8b\xeb\x4b\x1e\x9d\xdb\xf6\xb2\xd6\xfd\xfc\x3f\xbe\xfc\xfa\x43\xdd\x7e\xec\x89\xd3\x33\x46\xd1\xf7\xd3\x22\xc4\x0c\xe6\x34\xa4\xa2\x91\xa9\xe8\x00\x79\xa8\x8c\x51\xcd\x3e\xf5\xb0\x8a\x55\xb7\xc4\xd5\x20\x5e\xe1\x43\xfc\x9b\x3c\xc3\xf3\x0c\xa9\x77\x2a\x02\xe2\x0d\x29\x95\x30\xed\x83\xd9\x59\x83\xb5\x31\xac\x2a\x86\x3e\x6f\x9c\x7f\xe3\xf8\x87\x02\x40\x6e\xfa\x42\x7f\xbd\xad\x4d\x90\xae\xfe\x04\xd6\xe2\xa3\xc0\xe8\x4b\xbb\x5f\xe1\x34\x3d\xb1\xf9\x11\x7d\x51\x77\xd2\xe0\xe3\x97\x11\x62\x92\x9c\x13\x09\xc8\x85\x92\xa9\x7c\x27\x76\xd4\xf0\x92\x4a\xa6\xb9\xc0\xe5\xd2\xdc\x0e\x57\x9d\xe2\x11\xeb\x6c\x32\xfb\x33\x84\x50\xf5\xe7\xc6\x95\x92\x30\xfd\x7d\x3e\x13\x65\x83\x04\x5d\xc6\x8a\xa1\xee\x92\x8a\xb0\xca\x7a\xc2\x15\x25\x78\xf9\xb5\xd5\xb1\x05\xb2\xfe\x6f\x38\x0a\xcd\x5d\x77\xc3\x0c\xce\xb9\xf4\xa2\xaa\x65\x4b\xbb\x1f\xf3\xac\xe8\xba\x4c\x5b\xb1\x42\x33\x64\xb3\xae\x91\x69\x9c\x13\xf1\xc8\x87\xaa\x52\x21\x45\xe0\x9c\x35\x78\xb3\x7b\xa7\x1b\xbb\xdd\x01\x3f\x12\x40\xb0\xd5\x8b\xde\xa0\x5c\xe7\x92\x19\xda\xf7\xc7\x14\xf6\x04\x1a\x02\x4b\x23\x9d\xd4\xaa\x5e\x67\x23\x58\x58\x9c\x31\x06\x63\x38\xf8\x9f\x0b\x16\x5c\xab\x4b\xb7\x3d\x78\xc3\x1a\x7d\x16\x6e\xf8\xfb\x1b\xbb\x39\xe7\xd2\x65\xcb\x96\xfe\x50\xf6\x40\xe9\xd2\xb9\x4c\x95\x67\xc5\x4f\x17\xb7\x1e\x35\xd6\xfe\x5d\x84\x98\x0d\x34\x86\xeb\xc6\x94\x2d\xc0\x95\x71\x55\x1c\x11\x38\x60\xda\x33\x67\x52\xa3\x15\x2d\x3d\x96\x99\xc6\x60\x11\x83\x08\x10\xe4\x63\xfc\x08\x9e\x30\x3c\x26\x84\x63\x43\x8a\x3b\x8d\xd8\x66\xe3\x30\x29\x76\x24\xd6\x20\xa9\x59\xc2\x92\x0d\x31\x3c\xe2\xb1\xc4\x7a\xb0\x6c\x9c\x26\x57\x55\x95\x9a\xac\x36\x45\xb4\xa1\x1f\xc4\x0c\xb5\xd0\x30\xe3\x11\x55\x83\x0c\x83\xa5\xd2\xd0\xf9\x7a\x10\x35\x02\x2d\xeb\x60\xc3\x07\xba\x0b\x4b\xef\xe8\xd3\x56\xb7\xb6\x2a\xb8\xec\x3e\x58\xaf\x97\x74\xdf\x05\x3f\x4c\xd1\x1b\x38\xad\x7b\x98\x7e\x1a\x01\x7a\x1e\x21\x26\xc6\x69\x48\x44\x83\x53\x7e\x96\xa9\x11\xa0\x51\x84\x49\x22\x88\xa2\x4d\x12\x99\x3a\xce\x83\xea\x30\x42\x39\xfb\x45\x61\xd1\x21\xe5\xd0\xbb\x4d\x9a\xfe\x0d\xdd\xa1\xbb\x60\x06\xbb\xd6\x73\xcb\x8f\x2b\xe8\xd6\x20\x40\xb3\x10\x62\x96\x31\xb3\x51\x08\x2d\x48\x5d\x16\x58\x2b\xc0\x8d\x02\xcc\x15\x60\x9a\x00\x95\x42\x8d\x80\x85\x9a\x0d\x22\xdc\x62\x74\xa5\xa2\x9a\xcd\xa1\x9d\xa1\xc3\xa1\x37\x43\x8c\x1c\x82\x50\xb1\xa6\xd4\xa4\xd4\x7a\x15\xab\x79\x9a\xca\xd8\xeb\xf3\x7d\x8a\x4b\x56\x45\xca\xae\x09\x43\xb6\x24\x4c\x8b\xdb\x42\xc9\x4c\x9f\x8a\xe9\xb0\x1d\x52\x1e\x56\xcd\x28\x00\x35\xa2\x2a\xd6\x67\xd2\x67\x5c\x63\xbe\xa4\x75\xcf\xbe\x55\x31\x7a\xfa\xa4\xdf\xad\x9c\x9a\xde\xd5\x12\x94\x2e\xbd\xed\xf7\x09\x6e\xc2\xa6\x55\xd7\xe3\xa3\x77\x2f\x7d\xf8\x68\xf7\x2e\x83\xbf\x77\x7c\xd9\xfd\x0a\x53\xbb\xf5\x91\xb6\xb6\xe7\xfe\x62\xf0\xb7\x75\xb6\x98\xd9\x48\x41\xc3\x52\x61\x54\xb3\x4f\x39\xac\x60\xc5\xd5\xf7\x58\xd9\x48\xbd\x43\x11\xe4\xf3\x1f\xab\xde\x53\xe5\xcb\x3d\x54\x5b\x82\x7d\x0e\x95\xd1\xa9\x79\xa4\x10\x46\xcb\x32\x67\x99\x19\xcc\x6c\x1a\xd7\x5b\x9c\x72\x39\xd3\xa2\xc7\x95\x46\x04\x88\x52\xcf\x29\xf6\x7a\xe4\xed\x87\x7a\x59\xe2\x9e\xe2\x5e\x14\xd5\x51\x15\x7c\xe5\x5f\xf4\x4f\x40\xfe\xc7\x5f\xc1\xab\x7f\x71\x06\x86\xe9\xaf\xea\xc7\x35\xa8\x04\x06\x78\x28\xd7\xff\x57\xcf\xe8\xdf\xeb\x6f\xdc\x0b\xbb\x61\xa7\xde\xac\xcf\x32\xf4\x07\x5d\x63\xc6\x30\xb3\xe9\x5d\x39\x3a\x15\x0d\xa4\x65\x67\x91\x13\x3b\x8b\x34\x60\x6a\x10\xab\xb0\x21\xf6\x4d\x96\xe1\x59\xe4\x33\x74\x88\x60\xbd\x4d\xe1\x64\x26\x98\xa3\x43\x18\x13\x36\xee\x21\xaa\x43\x78\x7b\x17\xdf\xd2\x21\x3c\xb9\x4a\x84\xbd\x6d\x4b\x50\xb8\xee\xed\x5c\x25\xe2\xbe\xb5\x1b\x56\x87\xf5\x18\x37\x6c\xeb\x23\x59\x25\x62\x4e\x99\xa9\x45\xd0\xf7\xac\xad\xd7\x35\x26\x6e\x8d\x6f\x64\xaa\x04\x04\x37\x61\x6b\x36\x33\x3b\x19\xcc\x18\xb7\xb9\xf3\x8c\xb3\xd3\x49\x9c\xc6\xc8\xbc\x4c\x10\x7c\xf5\xaa\x42\x0f\x50\x87\xb5\x1f\xe6\x6d\xee\x33\x18\x38\x59\x49\xa1\xd3\xca\xde\x5b\xdd\x9d\x73\x9b\x2f\x17\x82\x5b\xda\xec\x76\xf3\x4a\x37\x46\x67\xde\xe6\xa4\x6d\xeb\x7f\xfe\x17\xde\x29\x5b\x9d\xbd\xd5\xbb\x1f\xea\xbd\xce\x11\x80\x80\x10\x13\xa1\x7c\x32\x24\x15\xdc\x6c\xa8\xfc\x2e\x1b\x5f\x13\x17\x80\x8a\x22\x9e\x4c\x06\x59\x11\x65\x9e\xaa\x5d\xc9\x0e\xd3\xe1\x4d\xef\xc6\x46\x53\xd3\xc9\x32\xec\x68\x48\x26\x98\xc8\x90\x15\x73\x7f\xff\x64\xdb\x56\xaf\x30\xe1\x89\x96\x1b\x99\x21\x0f\x0f\x7e\x6e\x6f\xf7\x3e\xa6\xf6\xb5\x9b\xe6\x21\x40\xc7\x2d\xbd\xb4\x08\x8d\x4c\x15\x2b\x0a\x3b\x36\x18\xf6\x8c\xa5\x10\x55\xbd\xad\xd9\xd6\x69\x63\x28\x50\x55\x0f\x85\x5e\x77\xbd\xea\x54\xa8\xbe\x90\xec\x03\x56\x9d\x8b\x55\xf5\x5c\xca\x3d\x58\x15\x17\x29\x3e\x7e\xe4\x49\x70\x5f\xf9\xe4\x27\xcb\x4f\xbf\x7c\xec\xd1\x91\x6d\xeb\xcf\xce\x6d\x3b\xb9\xe1\xd3\x3f\xff\x30\xe4\xe1\x69\xbb\xaa\xa6\xa6\xa6\xdf\x75\xd5\xed\x0f\xd6\xde\x93\x5e\x3b\x6a\xdc\xc5\x13\xef\x59\xb8\xed\x51\xaa\x37\x6c\x30\xc6\xc6\x2e\x42\x6e\x74\x79\xaa\xd2\xae\xd4\xb0\x22\x1b\xe2\x81\xe7\xe3\x6c\x35\xdb\xc2\x6e\x62\x4f\xb0\xa7\x59\x0e\xb1\xc0\xb2\x9a\xc7\xe9\x34\x6c\xa2\xbd\x40\xc0\xc3\xc9\x75\x36\xc3\x94\x76\xd5\x23\x62\x2a\x38\x34\xc0\x1e\xa8\x2e\x48\x25\x76\x56\x9f\xb0\x7c\x93\x01\x08\x57\x94\x98\x65\x65\x54\x2d\x99\x20\x5d\xb7\xde\xa2\x6f\xd3\xbf\x05\xdb\xc4\x6b\xa0\x4d\xaf\x3d\xdc\xb8\xed\x37\x21\x98\x81\x57\xce\x1e\x02\x45\xfa\x7b\xeb\xbb\xd7\x1c\x35\xdf\xe5\x9e\x39\xcb\x0c\x66\x6a\x91\x8a\xca\x53\xf9\xd0\xa3\x10\xba\xc5\x1a\x44\xa3\x43\x65\x5e\x06\x5b\x3d\x93\xd5\xe3\x93\x59\x45\x90\xea\xef\x9c\x05\x78\x59\x8e\x1b\xf2\x40\x50\xba\xe6\x63\x7d\x79\xdb\xd9\xdf\x6d\x6d\xdb\xf2\x47\xb8\x0b\xbf\xde\x3d\x4a\xef\x7a\xee\x6d\x7c\xd1\x4f\x6d\xa6\xee\x3b\x05\x21\x66\x39\x53\x8b\x6c\x68\x59\x6a\x78\xd4\x06\x65\x08\x2a\x6d\x57\xdb\xfe\x69\xfb\xde\xc6\x70\x36\xaf\x0d\xdb\x86\xa3\xf9\xe8\x5f\xe8\x07\xc4\x98\x90\x16\xcb\x82\x28\x88\xf6\xb4\xa8\x48\x21\xa9\x5c\x22\x92\xe4\xa0\x98\x98\x47\xb4\xa7\x71\x1c\xaa\x01\xc3\x58\x76\x1a\x8b\x59\x11\x64\x3a\xca\x64\x55\xa3\xb1\xaf\x31\x6a\x3e\xc6\x2c\x27\xb8\x05\x9f\x84\x29\x68\x92\x1c\x16\x84\x24\xc0\xd7\x7a\xf3\xf3\x9d\x3f\x97\x39\x7e\xf6\x97\x2f\xe8\xcd\x4c\x6d\xf7\xf5\xff\x9c\x7d\x01\x04\xf0\x1d\xd6\x58\x33\x5d\x08\x31\x6f\x31\xb5\x28\x00\xb1\xe7\x50\x20\xd3\xd9\xa6\xf9\xd3\x7f\x0c\x40\x80\x06\x12\x3a\x5c\x69\xd1\x1b\xf0\x96\x79\x49\x99\x07\x4a\xd5\xe9\x2a\xe6\x54\xaf\x8a\x29\x46\x75\x89\xc3\x9f\x2e\x55\x2a\x15\x2c\x2b\x0e\x7f\x7a\xa0\x3c\x5c\xc6\x03\x9d\x33\x9c\x58\x74\x06\x9c\x78\xa0\x03\xa2\x12\x70\xa2\x57\x8c\x8a\x84\x53\x34\x7f\xfa\x11\x0e\x96\x73\xeb\xb9\xfb\x39\x32\x90\x4b\x73\x33\xb8\xf9\x1c\xc3\x1a\x64\x24\xa3\x3f\x16\xa2\x2c\xd0\x5f\x07\x39\x5c\x69\x9e\x05\x44\x1f\x41\xc6\xca\x21\xc5\xe1\x4a\x0b\x08\x38\xd6\xa6\xc8\x38\x80\xb4\xad\xb6\xdd\xb6\x56\x1b\xb1\x19\xb7\x6d\xb9\xcd\x99\x7e\x50\x7b\x54\x3b\xa0\x11\x2d\x64\x73\xa6\x6d\x58\xd3\xb0\x8d\xf0\x3e\xc5\x0f\x7e\x81\xd7\x6c\x33\x31\x4c\xb5\x01\xb6\x71\x3e\x99\x97\x11\xe7\xa1\x30\x95\x71\xc3\x36\x9a\x28\x55\xbc\x31\x69\x21\x54\x66\x32\x42\xd2\xfc\x6f\x48\xb9\x09\x31\xc7\x7a\xfd\x30\x8d\xd6\xef\xf4\x23\x6c\x83\x88\x0d\x28\x18\xe5\x4b\x0e\xab\x74\x67\x3f\x09\x19\xbc\x66\x0c\x77\xf1\xba\x17\x4e\xef\xba\xb2\xd8\xc7\x15\x95\xac\x3d\xd2\x12\xf3\x73\x45\x05\xf3\xb6\x77\xe0\xa9\x50\xab\x3f\x65\x1c\xe9\xee\x8e\xfd\x27\x9e\x7b\x1c\x5f\xd2\x7d\xf0\xe8\xef\xbf\xbe\x17\x17\xd1\xcd\x00\xd4\x8c\x10\x73\x2d\xe5\x9b\xff\x79\xf6\x25\xe9\x6d\xe9\x23\x89\x48\xc6\xa2\x0c\xb0\x39\xd3\xc7\x85\xf7\x84\xcf\x04\x22\x28\xc6\x77\xe6\x3d\xe6\x33\x86\x30\xc6\xf7\x97\xf0\xdb\xf8\x23\x4c\x38\x6c\x34\xd4\x6c\xce\xf4\x38\x11\x44\xc5\xe5\x4b\x4b\x62\x9e\x88\xc7\x12\x20\xc6\x3f\x0c\x76\xf9\xd2\x2c\xf1\x10\xcc\xb0\x2c\x47\x44\xc4\xd8\x04\xe3\x2e\xc3\x3c\xef\xc0\x20\x15\xd9\xc0\x26\x72\x88\x30\x60\xe3\x3d\x0c\xc8\x26\x96\xe7\xa3\xa2\x23\x49\xe5\x95\xf1\x1b\x8d\xd1\x41\xe6\x92\x40\xac\xc9\x02\xa7\x4c\xf4\x89\xc2\x50\x11\xd0\xf5\x9b\x4e\x40\x31\x44\x4e\xe8\x37\xc0\x6f\xdf\xd0\xff\x57\x7f\xed\x04\x4e\x62\x9f\x3e\x0f\x1e\xe8\xfe\xa4\xfb\x75\x68\xd5\x27\xd0\xf3\xa1\x6b\xf4\x7c\x78\xd1\x92\x54\xe1\x70\x01\x44\x21\x20\x94\x09\xa4\x12\x80\x03\x2f\x44\x81\x78\x15\xd1\x9e\xf6\x32\x8c\x40\xfd\xaa\x2e\xe3\x64\x88\x7e\x59\x86\x22\x14\x47\xd5\x88\x20\xa6\x67\xb2\x0c\xa3\x31\x98\x41\x5e\xaf\xab\x5e\x71\x04\x05\x53\xa1\x4f\x76\x54\x9b\xc0\x6f\x63\x22\x11\x57\x93\xf1\x58\xd2\x38\x1f\x31\x13\xcc\x71\x27\xc1\xda\x2a\x30\x0c\xf3\x52\xaa\x04\x56\xc3\x94\xe7\x81\x9b\xc2\x73\xbe\x4b\xbf\x7c\x41\x2f\xb9\xf4\xa9\xdf\x4e\x9b\x32\xba\xb6\x79\xc1\xa0\x8b\x98\xda\xee\xa5\xaf\xff\x7c\x71\x2b\xbe\xe3\xa7\xd2\x27\xf6\xaa\x77\xd9\xa7\xcc\xd9\x46\xf7\xaa\x0d\x21\x46\x63\x6a\x91\x88\xc6\xa6\x9c\xc4\x38\xbc\x84\xe7\x17\x23\x40\x36\x0a\x92\xf9\x45\x7b\x5a\xc0\x0c\xd3\x82\x01\x61\xc0\x3c\x53\xc7\xca\x58\xa8\x03\x4f\xaf\xeb\xb9\x31\x19\x57\x93\x31\x2a\xec\x8c\xc1\xe5\xa0\x4c\x5a\xd7\x2e\xbc\xb5\x7b\x23\x89\x75\x2f\xc7\xf7\xaf\x24\x63\xd6\xdf\xdd\xf5\x16\xf5\x75\xeb\xcf\x53\x5f\x77\x00\x5d\x99\xaa\xd6\xd0\x57\x76\xaf\x68\x02\x3a\x9c\xa8\x34\x11\x48\x11\x20\xc1\x33\x62\xa7\x88\x8b\x44\x10\xbd\xe2\xb7\x5f\x4a\x19\x09\x9f\x92\x40\x96\xe2\xd2\x5e\xe9\x90\xc4\x48\x12\x51\xbe\x95\x7f\x20\xdf\x32\xff\xc9\x46\x40\x34\x5a\x41\xcd\xca\x1b\x8d\x8d\x09\x33\x30\x8b\x2a\x7d\xac\xe6\xf5\x79\x06\x04\x60\x68\xb8\x22\x54\xa1\x2a\x25\x1e\x27\x78\x54\x8d\xf7\x78\x3d\xf8\x93\xc5\x9b\xf5\x5a\xfd\x09\x98\x02\x6d\x9b\x17\x7f\xf2\x89\x32\x79\x3c\xde\xc6\x41\x11\xd4\xbd\xf0\xe0\x0b\x30\x11\x8a\xb8\x7b\xf0\xf8\xc9\x7a\xeb\x89\x32\x7b\xd9\x09\x84\x00\x07\x75\x0d\xef\xe3\x34\x44\x90\x27\x25\xe1\x3d\x93\x08\x10\x1c\x34\xf4\x73\xaa\xe4\x1a\xd7\xb3\x1a\xc1\xc1\x7b\xee\xe1\x34\x5a\x5f\x11\x7d\xa8\x3f\x4f\xce\xd2\x79\x36\xa7\x46\xb3\x81\xaf\x1c\xa4\xc5\xbd\xc9\x50\xf2\xc5\x2f\xe5\x8c\x8c\x15\x19\xe4\xa0\xa7\xde\x54\x5d\x89\xf2\x2d\xfd\x9f\xa7\x64\x90\xe5\xb8\xbc\x57\x3e\x24\x33\xb2\x2c\x79\xbf\xf5\xfc\x47\xfc\x56\xfa\xa1\x37\x0e\x27\x1b\xbb\x6d\xc6\x58\x34\x9a\xb3\x84\xa1\x95\x15\xd1\x0a\x75\x68\xb4\xb4\x82\x09\x80\x16\xf6\x84\x3c\xaa\xc2\x56\x8c\x86\x0a\xf8\xf0\xd3\x4f\x97\x6c\x82\x67\x61\x8a\xfe\x84\x3e\x6e\xd3\x12\x18\x41\xe7\x03\x13\x26\x4f\x80\x7b\x38\xbd\x43\x7f\xfa\x85\x07\x5f\xd0\x9f\xd2\x3b\xb8\x6d\x30\x61\xb2\x19\x97\x88\x6b\x99\x24\x69\x40\x2a\x8a\xa7\xf2\x44\x37\x05\x01\x5d\xca\xe3\x22\x79\x8a\x7f\x1c\x9d\xb6\xc3\x62\x3b\x54\xdb\xc1\x4e\x83\xff\x92\x1d\xdd\x09\x33\xf4\x4f\x79\x63\x48\xb9\xbb\xc2\xb8\x8b\xbd\x66\xc0\x57\x71\x69\x34\x52\x7c\xdf\x55\x5b\xe7\x6c\xbd\xb5\x66\xe1\x4d\x57\xdd\x33\x67\xcb\x9a\xb1\x0b\x71\xed\xae\x85\xd5\xc3\x97\x1b\x3f\xcc\x38\x4f\x7d\x03\xfe\x98\x99\x4d\xdf\xa1\x54\x92\x52\x05\x51\xe2\xb6\xd9\x30\xb6\x3b\x04\x41\x42\x0f\x32\x34\xcc\xb2\x2a\xde\x27\x61\xb2\xb8\x62\x68\x32\xe1\xd1\xf8\xa4\x3b\x42\x63\x3b\x9f\x5f\x9e\x3c\x4d\xd2\x1b\x36\x6c\xd8\xb0\xfb\xa7\x7f\x66\x31\x1b\x1a\xd7\x5f\x97\xf2\x23\xe7\x58\x4f\x48\x2d\x57\xb1\xaa\xba\xf1\x26\x3b\xd8\x03\x7c\x1a\xb9\xc1\x4d\x4f\xa4\xc7\x9f\x76\xb3\xf5\xc8\xe3\xf1\xf2\xaa\x38\xd9\xe9\x94\x8d\xfb\x3b\xde\x91\xac\x4e\xc6\x93\x1d\x3d\xa1\xbc\x94\x9b\xcc\x55\xf6\xfa\x72\x80\x1d\xde\x13\xa9\x18\xa0\x2a\x25\x15\x49\xfc\xcf\x5d\x0f\x59\xe0\xce\xfd\x8f\xdc\xf2\xe4\x7a\xbd\x0e\x9e\x5a\xcf\x96\x92\xe1\xdb\xab\xf4\x2b\xf5\x05\xa3\x76\x8c\x20\xaf\xbe\x71\x19\xfc\x0b\xbe\xa8\x7d\x0c\x01\xba\x09\x21\x66\x1a\xfb\x1a\x0a\xa2\x29\xa9\x21\x9c\xb4\xc8\xeb\x12\x5c\x82\x8c\x1c\x05\x1a\x92\x41\x16\xb5\x1b\xb8\xb8\xa7\xc9\xd3\xe2\xd9\xe4\xd9\xeb\x39\xe4\x39\xed\xe1\x3d\x1e\x3b\x59\x06\x79\xbc\x62\xbf\x5e\x36\xf3\x0d\xcc\xd0\x6d\x0b\xac\xa0\x68\x64\x55\x3c\x6e\x8e\x91\x6a\x42\xf4\x6d\x1f\x1a\x1f\xf6\x84\x2b\x86\x8d\x82\x48\x45\x52\x35\xb4\x24\xa6\xf4\x92\x8d\x6b\x4e\xc3\x72\x7d\xdd\x1d\xf8\x6c\x57\xf8\xd5\x63\xc7\x4e\x3d\x73\x98\x5d\xbe\x39\xfd\x9d\x7e\x6a\xfd\xc9\x97\xea\x1e\x7e\x60\xc8\x67\xef\xac\x87\x31\x8f\xbc\x46\x75\xf9\x27\xa0\x80\x29\x62\x36\xa0\x20\x2a\x45\xb3\x53\x52\xc9\xa3\x28\x6f\x5f\xde\x99\x3c\x92\x47\x01\x09\x9b\x9c\xce\xcb\x2b\x7a\xf4\xb0\x1d\x26\xd9\x9b\xec\x8b\xec\xc4\x5e\x96\xff\x04\x72\xef\x73\x9f\x71\x13\xba\xba\x1e\x9b\x9c\x76\xbb\x8b\x9f\x28\x62\xab\xd9\x49\xec\x22\xf6\x10\xfb\x25\xcb\xb1\x88\x26\x23\xc6\x1a\x3b\x80\xda\x41\x16\x3e\x0b\xa5\x95\x3e\x83\x75\x2a\x7d\xbc\xd7\xa3\xf1\x3e\xbe\xd4\xe0\x1f\xbe\xb4\x32\x5a\x31\x14\x12\xbd\x41\xd2\x10\x5f\x7d\x65\xcb\xdc\xa5\x4b\xaf\x5a\x7d\xd5\xea\x4b\x2f\x6d\xb9\x62\xf5\x55\x4b\x6f\xbc\xa2\xa5\xb9\xe5\x62\xb8\x79\xce\xe6\x4d\x73\xaf\xba\x63\x23\x79\x64\xf5\x95\xab\xc7\x8c\x59\xdd\xbc\x7a\xee\xd2\x9b\x9b\x5a\x9a\x5b\x2e\x19\xd3\xd2\xdc\xd2\x74\xe3\x52\x7d\xfb\x1d\x73\xe6\x6e\xba\x73\xde\x9c\x3b\x0c\x1e\xa9\x43\x88\x59\xc9\xb6\x21\x2f\x7a\xe1\x39\xe4\xcd\xfc\x90\x12\x25\x47\x1a\x04\xc9\x91\x46\xed\x99\x7f\xa5\x46\x7a\xfc\xe9\x79\xe8\x46\x84\x5d\x4e\x97\xd3\xee\x3d\xe1\x81\x0d\x1e\xb8\xde\x03\x1e\x8f\x9d\x15\x59\x11\x30\xbe\x1a\x01\xe2\x89\xed\x3a\x4d\x39\x6c\x7f\xd3\x8e\xaf\xb6\x83\x62\x07\xbb\xdd\xe7\xe7\xe5\x76\xe0\x5b\x9d\x92\x93\x73\xb5\x03\x9f\x2a\x70\x13\xe4\xde\xe1\x84\x72\x67\xca\x89\x65\x77\x91\x7b\x87\x9b\x38\xdd\x4e\x37\xd8\x5c\x5e\xe0\x4c\xcf\x81\x19\x51\x69\x66\xbd\x9a\xb8\x93\x69\xb6\x9a\xe1\x3c\x55\x86\x64\x35\xda\xa8\x34\xdc\xd5\xcc\x95\xa5\x57\x18\xc4\xa8\x1f\x21\x69\x15\x2f\xa6\xfe\xd1\x8a\x70\x45\x92\x7a\x15\x1a\x0e\xe9\x2d\x9d\xfa\x9f\xe0\x42\xfd\x4f\x4f\xe9\x27\x61\xb0\x7e\xf2\x53\x7d\xed\x61\x7c\x12\x7f\xd8\x8d\xd6\x6f\x5f\xaf\xff\x08\xdc\xfa\xed\xeb\x09\xa2\x71\x03\x39\xb2\x8d\x47\xe1\x94\x82\xb9\x3d\x64\x12\x0f\x3c\x43\x18\xc2\x99\x32\xce\xe8\x35\x9b\x67\x95\xa4\x16\x3b\x95\x76\x86\xbc\xeb\xfa\x46\x0f\x74\xfd\xdb\xe0\x99\x6f\x32\xdf\x91\x53\x5c\x11\x2a\x45\x09\xb4\x32\x15\x33\x14\x1e\x0d\x44\x04\x03\xb5\xb8\x17\x0d\xc6\xe9\x41\x30\x68\x9c\xcb\x15\x1a\xcb\x7b\x87\xd6\xc4\x21\x3e\x2e\x6a\x1f\x8b\x71\x10\x45\x21\x4a\x73\x36\xed\x72\x3a\x1a\x4d\x6a\x03\xd1\x60\xfb\xe0\x81\x21\x86\x2d\xac\xcb\x0f\x78\xa5\x3a\x81\x05\xcb\x12\x50\x7d\x55\xf4\xbd\xd7\x60\x30\x4e\x32\x19\xef\x50\x3a\x1a\x95\x0f\x12\x1d\xc9\x38\x0d\x4d\x55\x5d\x26\xc0\xd0\x08\x8d\x10\x3d\xd7\x32\xe8\x01\xbe\x8c\xdb\xb2\xc7\x7a\x00\x1a\x72\x4f\x23\xf0\x61\xf7\xce\x37\x1f\xdf\xb5\x7b\xf8\x43\x37\xbf\x76\xd5\x96\xdf\x6e\xbd\xeb\xae\xf7\x5f\xfe\xff\xdd\xf4\xe8\x7d\x9d\xd3\xee\x7b\x79\x31\xbc\xbc\x74\xcb\xda\xb5\x4b\xee\x65\x62\xf5\x0f\xdd\xbc\x39\xbd\xe1\xd2\xeb\x87\xd5\x8d\x1a\xfd\xe0\x92\xb6\x19\xf5\x77\xfd\xe6\x77\x17\x6f\x9f\xb2\xb1\xaa\x7e\xf4\xd4\x6d\xf3\x9f\xd6\xaf\x98\xf0\x8b\xcb\x17\x95\x97\xb7\x8c\x5b\x50\x6d\xc6\xb2\xd7\xb2\x76\xb2\x9a\x3d\x45\x63\xd9\x2b\x53\x03\xf0\x5a\xc4\x2d\xe6\xce\x70\x84\xe3\x9c\x6b\x25\x49\x15\xd0\x16\xfb\x24\x66\x11\xd3\xc2\xec\x60\xf6\x32\x27\x98\xd3\x0c\xcf\x20\x1a\xcc\x6e\xcc\xb2\xc3\xca\xcc\xb3\xd0\x9e\x70\x0f\xea\xb3\xa7\xb9\xb9\x19\xde\x6d\x6e\x6e\x66\x4f\xcd\xbb\xfa\xea\x79\xc6\x5f\x84\x08\xe2\x32\x67\x99\x57\xd8\xe3\xc8\x86\x7c\xe8\x02\xb4\x28\x35\xb6\xec\xe5\x48\xa0\xa8\x30\x5e\x58\x5d\x48\x0a\x03\x85\x01\x51\x3e\x4a\x2e\xf4\x1c\x15\x63\xaf\x05\xfd\xc1\xe8\x6b\xe1\x01\xe1\x45\xc1\x96\xe0\xa6\x20\x71\x04\x0b\x82\xb8\x39\xbc\x38\xbc\x2a\x4c\x70\xd8\x15\xc6\xc1\x70\x30\x8c\xec\xaf\x72\x6e\xd7\xab\x88\xb1\xee\x1f\x2b\xf4\xd7\xe0\x51\xe3\x2f\xc4\x3b\x94\x3f\x5b\xff\x5b\x4d\x1a\xa3\x34\xb1\x6e\xfa\x13\xa8\x51\x6f\xe2\xb9\xe0\xe9\x8d\x0e\x36\x0d\x46\x25\x99\xc0\xf3\xa0\x10\x2e\xd5\x9f\xd7\x3f\xd4\xff\xae\x1f\x84\x8b\xa1\xa8\x13\x18\xbd\xab\xb3\x53\xef\x06\x02\xdf\x2c\x58\x7a\xf4\x4f\x7f\x3b\xb4\xea\x57\xa3\xae\xfb\xd9\xf2\x5b\x7f\x9a\xcd\x1e\xd7\xe7\xeb\x8f\xe8\x7f\xd4\xaf\x85\x7b\x61\x06\x4c\x87\xfb\x7f\xdc\x08\x3f\x87\x0b\xe1\x42\xf8\xb9\xbe\x47\x3f\xa9\x9f\xd4\xf7\xc0\x2f\xd6\x24\xbe\xff\xf3\x5b\xdf\x8d\x6e\x19\xf6\xe8\xbd\xfa\x0b\xc6\xda\x6b\x44\x21\x1b\xd9\x57\x90\x86\x0a\x51\x4d\xaa\xa4\x10\xc4\x33\x87\xdd\x10\x77\xb7\x18\xf7\xb0\xff\x8c\x5c\xce\xee\x64\x31\x5b\xf8\xb1\x28\xe6\x39\xed\x1f\xa9\x1f\x40\xde\x47\xa4\x1d\xd0\x93\x28\xd3\xd7\x19\xd2\x98\xa4\x61\xee\x26\xee\x57\x4a\x51\xbf\x61\xd5\xd0\xe3\x0a\x09\x79\x54\x62\x39\x42\x46\x01\x29\x0a\xcf\xdf\xfd\xc1\x9e\x43\x2b\xef\x5b\xbc\xb6\xec\x37\x0f\x41\xe4\xfb\xa5\x37\xcf\xbf\x66\x25\x29\xb8\x71\xcd\xeb\xd7\x5f\xcd\xb1\xd2\xda\xe4\x75\x17\x7d\xa1\x8f\x81\x6a\x3c\x74\x7c\xc3\x75\x33\x35\x13\x8b\x5c\xc6\x70\xe4\x15\xc4\x21\x07\xaa\x49\x0d\x92\x3e\xe3\xcf\xda\x36\x89\xd0\x2c\x82\x28\x93\xcf\xd0\xd9\x14\x83\x70\x39\x6e\xa6\x31\x26\x76\xf6\x0b\x01\xbe\x08\x21\x4e\x22\xe4\x4b\x14\xa8\xf6\x25\xf3\x3e\x4f\x7c\x9e\x00\x7f\xbc\x31\x99\xd7\x6d\x98\x7c\x8d\x89\xee\x8e\x21\xe5\x6e\xf0\x11\x37\x0f\x25\xe6\xc7\xcb\x50\x71\xc3\x17\x5f\xdc\xa0\x1f\x87\x7b\xa1\xe2\x86\xcf\x3f\xbf\x41\x3f\x8e\xcb\x60\x7b\x9d\xbe\x5b\xdf\x5d\x07\x0f\x06\x7b\xbf\x66\x73\x2e\x49\x01\x62\xd1\x05\xcf\x92\x3d\x88\x47\xd4\xb0\x39\x9c\x72\x78\xfc\x69\x43\xf7\x7e\x1c\x01\xa0\xa7\x51\x75\x22\xae\x74\x98\x87\x91\xe2\x39\x34\x94\xa5\x82\x49\xde\xd3\xf5\x23\x29\xe8\xfe\x04\x56\x6f\xcb\x64\x7a\xf2\x20\x5d\xdc\x41\x8e\xbe\xa3\x3f\x97\x47\x23\x28\x86\xb6\xa5\x66\xfb\x8b\x07\x14\xbc\x5c\x98\x17\x08\x94\xbe\x5c\x1c\x2c\x6e\x2e\x84\xe6\x62\x08\x16\x43\x61\x71\x61\xb1\xc1\xb1\x83\x3d\x47\xc5\xbc\x42\xcf\x00\x18\xf0\x5a\xbe\x3f\x3f\xf6\x5a\x51\x67\x21\x2c\x2a\x6c\x29\xdc\x54\x48\x1c\x85\x05\x85\xb8\x38\x1f\x9a\x8b\x16\x17\xad\x2a\x22\xb8\xc8\x55\x84\x0b\xf3\x8b\x8a\xf2\x0b\x49\x3f\xee\xa5\x85\x04\x1a\x7b\x52\x8c\x93\x4a\x07\x35\x9d\x7a\x39\xb8\xb1\xd1\x55\xa5\x74\x24\x4d\x01\x5c\xf5\x5f\x98\xd9\x1d\x21\x11\x43\xfe\x85\x54\xad\x84\xca\x91\x18\xfc\x77\x5e\xbe\xf1\xf3\xa7\x4e\xcc\xde\xfe\x29\x5c\xa6\x2f\x4a\xef\x99\x7a\xf9\x65\xff\x2f\xbc\x8c\xeb\xf5\x1b\xa0\x59\xdf\x49\x56\xea\xdf\xff\xde\xb5\xb1\x76\x84\x69\xe7\x9e\xe5\x34\xa6\x83\xdb\x89\x08\x92\x9f\x01\x44\xf6\x1b\xa2\xb9\x03\xe2\x3d\x8e\xc4\x8e\x9f\x6c\xcc\xb7\x9c\x76\x07\x95\x3b\x31\x32\x8d\xec\xb2\xd6\x79\x7d\x2a\xef\x7f\xa4\xe7\x24\x2c\x29\xa2\x9c\xfe\x1f\xe1\x39\x01\x0b\xc6\xb7\x87\x99\x36\x06\x53\x33\x44\x34\x7e\xc3\x6d\x18\x53\x0b\x2c\x2c\xca\x69\xf9\xd1\x1d\x64\x2f\xc9\x10\x42\x02\x9e\x47\x91\x18\x12\xcb\xc5\xcd\xe2\x4e\x71\x9f\xd8\x29\xf2\xa2\xbd\x1d\x70\xca\x8e\x38\x85\x0b\x59\x19\x32\xed\x99\xc3\xad\x8a\x27\x6d\xdc\x7a\xf8\x49\xba\xe6\x6f\x67\xa3\x74\x0d\x09\x66\x05\x01\x34\x42\xc2\x6b\xe5\x41\x0d\x1d\xe6\xce\xb9\xda\xf1\xbc\xd5\x07\xf6\xdf\xba\xa6\xfd\xb9\x5b\x27\x2d\x5d\x56\x37\x69\xc9\x62\xf6\xf8\x81\xd5\xab\xdb\x9f\x5b\xb5\xfa\x80\xce\x2d\xae\x9b\xbc\x74\x59\x7d\xdd\x62\xaa\x97\xdc\x87\x90\x95\x0f\x2c\xa3\xb2\x94\xd7\x29\x72\x7b\x1c\x56\x4e\xb0\xe3\x71\xbb\x3f\x27\x2f\xd8\x74\x02\x5b\x68\x7d\x4e\x6e\x30\x7d\x51\x75\x4e\x7e\xb0\xbe\x92\x3c\xd8\x9b\x23\xac\xff\x48\x73\x55\x60\x16\xde\x49\x16\xb1\x2f\x23\x0f\x9a\x98\x4a\x7a\x3c\xdc\x19\x59\x29\x52\x26\x29\x4d\x4a\x8b\xb2\x49\xd9\xa1\xf0\x8a\xa2\xd9\x6c\x08\x9a\x61\x31\xac\x02\x06\x38\x90\x14\xd5\x9f\x96\x84\x8f\x1c\x1f\x60\xed\x23\x78\xdf\xca\x0c\x8d\x99\xa9\xa1\xf1\x44\x22\x6e\x06\x5a\x41\xb8\x82\xe6\x87\xe4\xa4\x87\xc8\x10\x26\x8b\xba\x3f\x3f\xb0\x68\xd4\xa2\xc9\x3f\xab\xbb\x61\xcd\x8d\xb7\x8e\x5d\xbd\x0e\x16\xe0\x9d\xf3\x5e\xb9\x71\x6e\xd5\xb2\x09\xd3\xae\xbe\x79\xfe\x25\xb7\xaf\xbe\x9d\xe2\x75\xd3\xf0\x26\x52\xc7\xbe\x8c\x0a\xd1\xaf\x53\x93\x90\xe2\x3e\xe3\x2b\x80\x82\x02\xac\x28\xbc\xfd\x8c\x8c\x8b\xf0\x24\xdc\x84\x5b\xf0\x26\xbc\x03\xf3\x18\xf3\x7e\x3f\xe2\x9b\xf9\xc5\x3c\xe1\x91\xfc\xf1\x8f\x0a\x7c\xa2\xc0\x23\x0a\x2c\x52\xc0\xa6\x04\x15\xac\x28\x92\xcf\x18\xb5\xcf\xf3\x51\xde\x07\xd2\x47\x42\x7b\xa6\xf3\x19\xd5\x9f\x16\xd8\xd3\xa8\x3a\x19\xeb\x30\x87\x6f\x9e\x9a\x0e\x13\x83\xa3\xa9\xe2\xae\xaa\x9e\x4f\x43\x2b\xce\xbd\x54\x63\x50\x91\x4c\xe4\xce\x0d\x6f\xdf\x77\xcf\x1d\x6b\xa6\x5e\xd7\x78\xcf\x96\xf4\xd8\x15\x57\xd4\x34\x5c\xb2\xa8\xe5\x17\xab\x98\x51\xa5\x5b\xae\x5f\x95\xf8\xe5\xc5\xeb\x57\xce\x6f\x59\x34\x76\x5a\xe3\x2f\x66\x6f\x38\xc7\xf7\xcd\xf1\xb7\xe1\x75\x84\x88\xf8\x6e\x99\x6b\xea\x49\xbf\x36\xee\x44\x9a\xe7\x35\xac\x32\xe9\xe1\xf8\x08\xec\x9a\x5d\xff\xde\xe2\x9d\xcb\x99\x6f\xd6\x3e\xe2\x79\xfc\x36\x04\xa8\x55\xd7\x98\x00\x53\x8b\x3c\x68\x54\x4a\x91\xd8\x9a\x4d\x02\x08\x3e\x19\xb9\x6a\x7a\xf4\x7e\x45\xd5\xd2\x6e\x57\x50\xc2\xf5\x0e\xaf\x68\xac\xbe\xa1\x86\x99\xae\xd3\x98\x89\x05\x53\xd0\x0c\x7a\xb0\xb2\x48\x69\xc4\x98\xa0\x09\x0d\xc3\xb5\x7f\xdd\xfa\x9b\x67\xb7\x06\xa5\xe6\x57\x36\xd4\x72\x6d\x6d\xb0\x4e\xef\x6a\x7b\x17\x5f\xf4\x53\xdb\x96\x3f\xce\xb8\x7f\xba\x7e\x98\x1b\x86\x00\x5d\xa2\x77\x31\x95\xd4\xb7\x32\xf1\x59\xe6\x81\x66\xb6\x93\xc5\x54\x7e\x96\xb8\xbc\xe9\x62\x36\xc1\x62\x86\xd5\x58\xcc\xb2\x12\x3c\x80\x14\x29\x25\xc9\x69\x49\x92\x05\x01\xe1\xc9\x4e\xc4\x22\x14\x4f\x50\xab\x96\x4a\x56\x33\xb7\xa8\xb1\xd1\x54\x94\x0d\xc9\x13\x51\x69\x08\xa4\x2b\x19\x66\x2a\x97\xbf\xb1\x7c\xd4\xcf\xf5\xc6\x53\x9f\xe0\xa4\xde\xc5\x2d\xff\xcf\x3a\x92\x74\xc1\xb7\x40\xe8\x4b\xad\x01\xfe\x89\xd3\xf8\x63\x62\xd8\x57\xc5\x29\xad\x5f\x4a\x9b\x20\xa2\x07\x19\x14\x3f\x5f\x32\x79\x4b\x4b\x0b\x99\x6d\x98\x54\x06\x8d\xc7\x74\x8d\x84\x11\x42\x32\xba\xf4\x39\xe4\xc8\xec\x4b\x85\x6d\xee\x34\x5f\x2e\x3a\xd3\x02\x2f\x4a\xbc\x84\xd8\x5f\xdb\x9b\x0c\x23\xd1\x6e\x57\x25\x5e\x20\x1b\x9d\x02\x8a\xc7\x0d\xa9\x4a\x03\x15\xe2\x8d\x34\x01\x52\xa5\xc0\x4b\x2c\x06\x26\x9f\x94\x56\x26\x0d\x6d\x2c\x5c\x0c\x8f\x85\xe3\xf7\x3e\x36\xf3\xe6\xaa\x9d\xfa\xfb\xc5\x7a\xc1\x42\x6e\x56\x6d\xe9\xbe\x65\x25\xeb\x5e\xa7\xe3\x5f\x84\x77\xe2\xb7\xd8\x56\x24\xa1\x70\x4a\x96\x24\x7c\x06\x11\x62\xb3\xe3\xf7\x39\x11\xfd\x0d\x55\xbf\x5e\x55\x6d\x99\x86\xf4\x5c\x99\xe0\x38\x27\x43\x29\xae\x5d\x77\xb7\x58\x16\x1e\x3b\x8e\x6d\xed\x3a\x0b\x6f\x5d\xb6\xe6\x02\x4f\x72\x86\x21\x13\x03\x44\x21\xad\x56\xdd\x91\xf2\x54\xd0\x79\x66\x9f\x08\x34\x35\xd6\x75\x26\x44\xca\xc9\x4e\x42\x88\xf2\x0f\xee\x03\xfb\x3f\x50\x3b\xa0\xac\xaf\x82\x5e\xfd\x86\xe9\x79\x6e\xe9\x0e\x3c\x67\xf3\x81\xd6\x07\xef\x3a\xd0\xbe\xed\x99\x67\xda\x88\xb2\xff\xf7\xbb\xda\x9f\xfb\xdd\x1f\xda\x69\x9d\x8e\x73\xef\x75\xcc\x9c\x25\x9f\x55\x73\x9b\xb8\x1d\xdc\x5e\x8e\xe1\x64\xd1\x76\x36\x25\x7d\xb6\xc3\x41\xb3\xcd\xfe\xcb\xbd\xde\xd8\x91\xf7\x39\x65\xcb\xcf\x69\xd2\x7e\xa9\x9b\x54\x02\x6b\x7e\x30\x9c\x7e\xdc\xb8\xd8\xa1\x42\xbf\x46\xff\xdf\xeb\x3f\xff\xfc\x7a\x18\x86\x9d\xfa\xdc\x3a\x98\x05\xb3\xea\xf4\x2b\x83\xbd\x5f\x33\x19\xe4\x45\x88\x69\x67\xdb\x5c\xa5\x07\x97\xe8\x7f\x44\x48\x89\x1e\x19\x81\x90\xca\x1f\xb9\x06\xaa\xba\x2f\x47\x23\x53\xa5\x04\xbb\xfc\x04\x77\xba\xe0\x8c\x0b\x56\xb9\xa0\xc5\x05\x8a\x0b\x5c\xa8\x13\xc1\x19\x04\xfb\x10\xd4\xd3\x14\x44\xa4\x52\x91\x50\x61\x7d\x54\xa0\xea\x8a\x0a\x84\x32\x19\x44\x10\x62\x5e\xb3\xe8\x6f\x35\xe9\x1f\x42\x2a\x7f\xf0\x5a\x68\xe8\xbe\x02\x8d\x49\x0d\xc6\x8a\x1f\x77\x2a\x70\x46\x81\x37\x15\x38\xac\x80\xa2\x00\x52\x40\x81\xbd\x0e\xd8\xe4\x00\x87\xd5\x51\x6e\x2f\x46\x27\x56\x47\x8d\x46\x47\xb4\x1f\x0f\x42\xcc\xeb\xec\xcb\xae\xd2\x83\x0b\xf4\x43\x66\x3f\x15\xe6\x3c\xea\xba\x2f\x47\xc3\x53\x03\x08\x8e\x1a\xf3\x88\xc2\x99\x28\xac\x8a\x82\x12\x85\x28\x7c\x13\x86\x8f\xc2\xf0\x76\x18\x5e\x0a\xc3\xbe\x30\x84\x73\x27\xd1\x33\x07\x84\xd1\x23\xfa\x4d\x4c\x11\xc5\x24\xc2\x68\x66\xaa\x32\x2c\x08\xdc\x36\x5a\xf3\x08\x63\x79\x87\x07\x3c\x91\x50\x04\xe4\x9a\x1d\x79\x80\xf2\x20\x4f\xf6\x85\x04\x10\x04\xa4\xb9\x26\x97\xfb\xc0\x97\x87\x0c\x6b\xc7\x44\x2e\x3a\x1a\x1b\x0d\xde\x71\x65\xb3\x04\x3b\x1a\x69\x66\x70\xbc\xf1\xe3\x04\x4d\x14\xec\x41\x32\xcc\xfc\x40\x9a\x5a\x5d\xe9\xeb\xa9\x61\x32\x1a\x46\x01\xde\xd5\xd2\xd2\x52\x7a\xf9\x8d\xab\xa7\xde\xf3\xeb\x67\x5e\x18\xfd\xde\xf1\x53\x3f\x2c\xd8\x74\xd3\xc5\x16\xda\x51\x72\xd3\x3d\x53\xaf\xb8\x7e\x6e\xe3\x92\x86\xcd\xd7\x1e\xfd\xfd\x6d\x0f\x2f\x9c\xbe\xa0\xc1\x9d\xc9\x98\xb1\xaa\xfc\x32\x57\xf4\x60\x9e\xb1\xb7\x07\xab\x32\x4f\xc3\x14\xe4\x69\xc5\x32\x1b\xc5\xed\x99\xa7\x5b\x5d\x32\xc3\x97\x40\xac\x02\xc5\x2a\xd0\x79\xda\x2f\x44\xf3\x60\x0a\x72\xa7\x6c\xd8\xc3\x46\xf1\x3c\xd9\xd5\xdb\x1a\x9d\xa7\xfd\xa1\x1a\x84\xac\xf6\x46\x07\xc8\x23\x9f\xb7\x7d\x45\xb6\x7d\x5d\x26\x93\x3b\x1e\xbd\x55\x09\x9c\x67\x3c\xb1\xec\x78\x9a\x29\xfd\x40\x1b\xc1\x6e\x36\x4a\x70\x7b\x26\xd3\xea\xb1\x9e\x30\x1e\xc9\x79\x86\xb1\x9e\xe1\x0e\x4d\x40\x2b\xd1\xd0\x54\x1e\xc1\x5f\xe6\xc1\xe9\x3c\xa8\xcf\x83\x54\x1e\x84\xf2\x40\x31\x77\xcd\xa4\xe2\xf2\xf7\x50\xb1\xd8\xcb\xe0\x02\x6c\x28\x5a\xcc\x7e\x9a\x6b\xe0\x46\xb7\xa5\xa6\x72\x82\xcd\x99\x56\x88\x9b\x79\xcd\x7d\xca\xfd\x89\x9b\x54\xba\xc1\xcd\x49\xce\x06\x50\x41\x06\x98\x04\x4d\xd0\x02\x9b\xe0\x4b\xc8\x00\xc7\x81\xcd\x06\x1c\x61\x05\xe4\x61\x58\xd2\xa4\x38\x9a\xa4\x1d\xca\x09\x05\xcf\x97\x40\x91\x14\xc9\xe9\x16\x9b\x38\xe2\x6c\x62\xc0\xcc\xb0\x4c\x64\x53\x2c\x0d\x5b\x8a\xe2\x38\xa6\x92\xba\xc4\x8a\x3e\x69\xa4\x45\xaf\x62\x66\x3e\x17\x31\xdf\xaa\x45\xff\x1a\xa2\x8e\xd9\xdf\xbd\x4c\x3f\xdd\xfc\x18\x4c\x21\xf3\xf5\x08\xb4\xe9\xb5\xf0\x7e\xd7\x4d\x5d\xd7\xd2\x74\x40\x2b\xcb\x0b\x8e\xe1\x47\xe8\x1e\xac\xd6\x35\xe6\x21\xf6\xb8\x2b\x7a\x30\xdf\x58\x9f\x83\x8b\xeb\x11\xb2\xb5\xc1\x40\x6f\x31\x67\xa3\x4b\x9f\xc9\x98\xf9\x67\x74\x5f\x0b\x2d\xbe\x79\x96\xee\x13\xd8\xd9\x28\xb4\x67\x76\xb6\xca\x76\x40\x39\xfb\xd4\xbf\xfd\x42\x54\x6d\xf2\x01\xb8\xd8\x28\x94\xda\xe5\xde\xd6\xe8\x3c\xed\x0f\xd5\xa0\x88\xd5\xde\xe8\xc0\xe6\xb2\x9f\xb7\x7d\x2c\x4b\xbf\x19\x05\x60\x0a\xf2\xa5\x1c\x18\x14\x36\x8a\x01\xb9\xbc\xe6\x13\x26\x17\xd0\x67\x68\x1e\x15\xed\xa3\xd8\x9a\xc3\xd6\xdc\x39\x6c\xeb\x3f\x87\xfe\xed\x17\xa2\x9b\x72\xe6\x70\xf3\x39\x73\xe8\xd7\xbe\x97\xf7\x69\x07\x70\xce\x1c\xcc\xf6\xb1\x2c\xfd\x66\x84\xfb\xcc\x01\xf7\x9f\x83\xc5\x7f\x2b\x68\xde\x94\x0f\x8d\x4b\x5d\xa0\x20\xcf\x4c\x31\xe0\x74\x35\x30\xb8\x27\x29\x4b\xc5\x4d\xce\xf9\x04\xe2\x64\x07\x39\x41\x08\x21\x2e\x47\x33\x4b\x5c\x3d\x99\x88\xa6\xcb\x91\x62\x83\xc7\x92\x34\x99\xc5\x30\x67\x92\x6a\xa4\x22\x27\x31\xd1\x60\x23\x33\x39\x71\x5d\x6e\x7a\x22\xfc\x52\xff\x35\x4d\x51\xc4\x5b\x76\xe1\xd5\xbd\x59\x8a\x7a\xe1\x2e\xdd\x81\x2f\xc5\x43\x33\x19\x33\x17\x87\x9e\xe7\x52\xf3\x3c\x23\xc6\x5a\x03\x85\x8d\x02\xa3\xe6\xf1\x7d\xd7\x80\xe6\xc2\xd0\x35\x1b\x68\xed\xc9\x5e\xf3\xfc\x6b\xf4\xfc\x3f\xd1\xea\xd3\x70\xee\xf9\xef\xdf\x7e\x21\x6a\xb0\xe4\x4b\x1e\x1b\xc5\x97\x6b\x3e\xcc\xff\x37\xfa\xd6\x9e\x64\xe9\x67\x5a\xf3\xce\x47\xbf\x22\xdb\xbe\x0e\x09\x16\x7d\xe3\x01\xce\x53\x78\x5e\xfa\xb1\xec\x78\xb2\x7b\x48\xb0\xdf\x10\x48\x28\xcf\x7a\x22\xbb\x87\x80\x0e\xc2\x60\xc6\xc9\xac\x40\x36\x34\xeb\x39\xc4\x65\x3a\x9f\x96\xbd\x69\x9a\x67\xec\x97\x9c\x69\xa4\xc8\xde\x34\x12\x24\x67\x5a\x34\xbe\x89\xc6\x37\xd2\x6e\x36\xa2\x81\xd8\x9a\xe4\x4c\xaf\x22\x86\x49\xd3\x49\x98\x22\x02\xe4\xb4\xa1\x5e\x05\xe2\x8d\xc6\x2d\x32\xa4\x1c\xd1\xfa\x62\xc6\x0f\x11\x2a\x45\xf0\x89\xc0\x8b\x50\x0a\x5d\xfa\x8b\xd7\xc0\x28\xb8\x64\xbe\x7e\x08\xaa\xe7\xe9\x07\xf5\xa3\xf3\xf0\x49\xa8\xbe\x46\x7f\x11\x46\x5f\xad\x1f\xd2\x0f\xcf\x83\x51\xfa\xcb\x57\xd3\xdc\xe0\xfa\x4c\x2b\xb3\x96\xed\x42\x2e\x9a\xfd\xde\xfc\x1c\x72\x67\xce\xa4\x86\x8b\xbe\x74\x5e\xc8\xf8\xa1\x05\xdd\x8c\x3f\x34\xd3\x2e\x22\xc2\xb0\x36\x67\xc4\x3f\x13\x17\xb1\x71\x16\xb3\x41\x77\x9e\xc6\x78\x0b\x9a\x10\xb1\x8b\x0c\x0f\xaa\xdb\xdb\x24\xf1\x8c\x09\xce\xb9\x7c\x55\x86\x95\x4d\xc1\x12\xe5\x03\x43\x96\x19\xbf\xd2\xe1\x96\xf0\xa5\x95\x51\x55\x09\x9b\x08\x2f\x35\xa5\x09\x44\x23\x21\x55\x13\xc1\x9b\x4c\xb8\xd4\xa1\x50\x31\x6b\xfd\xf2\x1b\xb0\x77\xff\x2f\x67\xad\x5f\xb9\x4c\x3f\x9b\x79\x61\x21\x26\xf5\xb7\xeb\x7b\xf1\x2d\x3a\xaa\x5f\xfb\xf8\xef\x6a\xb7\xd5\xbd\xdc\x0e\xcd\xf8\x8b\x6b\xee\xab\x7b\xed\x79\xbd\x55\xbf\x57\xbf\x19\x1e\x24\x63\x66\x77\xb7\xbe\x8d\xf3\xbb\x0e\x4f\x83\x62\xb8\xe0\x2d\x63\xbf\x68\x3e\x08\xe5\x87\x0b\x2d\x7e\x3b\x60\xca\x00\x99\xca\x80\x03\xad\x2e\x99\xcb\x95\x01\xfd\xdb\x2f\x44\x13\x2c\x7e\xf6\xb0\x51\x98\x20\xbb\xb8\xbe\xfc\xdc\xaf\x7d\x8e\x0c\x30\x3a\x40\x1e\xf9\xbc\xed\x63\x59\xfa\x39\x32\xc0\x6d\xc8\x00\xf0\x04\xb8\xfe\x72\x8c\xc6\xb7\xd3\x3e\x12\xfd\xc6\x64\xf4\x31\x51\xb4\xf3\xb8\xb7\x8f\x9c\xbc\x2f\x43\xaf\x1d\x9d\x1a\xa0\xcc\xfc\x52\xc8\x08\x58\xf0\xd8\xd9\xde\xc4\x2f\x7b\x33\x72\x37\xb3\x88\x45\x2c\x58\x99\x5f\xae\x9e\x2a\x25\x66\x94\x56\x6f\xf6\x57\xd2\x93\xec\x9f\xff\xb5\xff\xaf\x7d\xf2\xbf\x60\x94\x7e\x94\x6d\xeb\xea\x4d\x00\x03\xb4\x3b\x73\x96\x69\xe1\x8a\xd0\x20\xb4\x34\x35\x5e\xf1\x82\x6d\x6c\x48\xae\x09\x16\x20\x90\x11\x4c\x0a\x35\x85\x70\x41\x08\xe4\x10\xc8\xc1\xa2\xe0\xa1\xe0\x89\xe0\xe9\x20\x8b\x42\xc1\x60\x08\x11\x0f\x5b\x13\xbd\x40\xab\x41\x9e\x9d\x9e\x7d\x1e\xe2\x61\x43\x32\xf1\x93\x7a\x28\xf3\xaa\xf5\x7e\xf0\x98\x15\xe2\x92\x1d\xa6\x27\xb7\x43\xf9\xc0\xf8\x96\x03\xe5\x28\x1d\x43\xca\x51\x63\x49\x2e\xa6\x5b\x39\x8c\x2a\xe7\x6a\xc4\x60\x39\xaf\x47\x33\xb5\xab\x9e\xe0\x10\x38\xbd\xe9\xb6\x77\x66\x5e\xb9\x62\xce\xea\xd5\x1f\x7e\xdd\x06\x8f\xbc\x78\x6a\xed\xd4\x21\x17\xdd\xb2\x79\xf6\xab\xcf\xb6\x0d\x79\x78\xda\x13\x93\xe7\x8d\xaa\xbb\x65\xfa\x0d\xd7\x5e\xdb\xb0\xfb\xdd\x9f\xea\x98\x7d\xb0\x68\xc7\xd6\x5f\xdf\x50\x3b\x3a\x5c\x3a\x72\x72\xd3\x43\x57\xee\x7a\xd4\x90\x81\x99\xb3\x0c\xe6\xc2\xae\xe8\xc1\x8b\xe8\x7d\x5a\xf5\x28\x32\x24\x4e\xb1\x6a\x48\x9c\xd7\x5b\x4b\x8a\x05\x6f\x1f\x1e\xe8\xdf\x7e\xe1\x54\x84\x7c\x29\x27\x1e\xa8\x46\x71\x7d\x31\xdc\x58\x5c\x42\x1f\x68\xec\xe1\xc9\x7e\xed\x0f\xd5\x08\x66\x7b\xa3\x83\xe6\x81\x30\x68\x60\xf1\x79\xda\xb3\x1f\x66\xdb\xd7\x49\x08\x15\xa5\x34\xda\x7e\x55\x04\x16\x47\xa0\x39\x02\xb1\xc8\x05\xe6\x53\x8d\xfd\x9e\x3b\x95\x1d\x57\xb3\x1d\xa1\x48\xca\x4b\x70\x54\x8d\x12\x5c\x3f\x10\x52\x03\xa1\x7c\x20\x0c\x1e\xd8\xfb\x64\x56\xe7\x32\xc7\xb8\x2e\xdb\xe7\x84\x0c\x32\xa5\x62\xb1\xf1\x6c\xa8\x24\x66\xae\x81\xc5\xd5\x04\x0d\xce\x9c\x65\x76\x31\xb3\x51\x31\x2a\x43\x49\x34\x3f\x35\x32\x28\x45\xd4\x1a\xa4\x24\x0f\x27\x71\x32\x19\x1a\x30\xd6\xa7\xa4\x24\x6f\xda\xa6\x80\x52\x31\xb8\x86\x3b\x13\xea\x0c\xe1\xd0\x20\xb5\x1e\x45\x22\x42\x50\x2b\xaf\xf7\x06\x02\x05\xde\x52\x89\xd4\xdb\x59\x41\x41\x34\x56\x37\x51\x9d\x54\x8d\x0f\x95\xba\x07\x2d\xc9\xd3\x18\x4b\x74\x58\x3e\x3b\xea\x30\xcc\xa2\x11\xbe\x61\xc9\x84\xab\x00\xc2\x85\xd0\xe3\xa1\x34\xeb\xf1\x0c\x86\x30\x45\xa1\x08\x6f\xd5\x37\xaa\xc0\xd2\x86\x05\xf3\xab\xd6\xdc\xf5\xfc\x45\x75\xbb\xd6\x3f\xa6\x2b\x64\xd5\x35\x8b\x6e\x59\x70\xdb\x07\xb3\xaf\x79\x69\xd9\x46\x48\xc3\xc5\x30\x72\x72\xcd\x98\x86\xd6\x19\xa7\x52\x95\x53\xe6\xe3\x6d\x34\xb2\xfd\xa9\xa7\xf4\xaf\xfe\xb6\xe4\xf0\xb3\x13\x76\x8d\xfb\xf8\xe3\xc7\x1f\x80\x09\x0a\xbf\x71\xf7\x43\xfa\x17\xbc\xfa\xe6\xcf\x9a\xfe\x70\x37\xe5\x83\xc7\x74\x8d\x29\x61\x66\xbb\xa2\x07\x47\x9a\x7a\xd8\x10\xaa\x87\xc5\xb5\x90\x8c\x7a\xf4\x30\x1a\x5f\x4d\xf7\x7e\xb4\xc9\x5b\x6f\x53\xde\xf2\x51\xde\x7a\xbb\x35\xcf\x67\xeb\x2b\x5f\xfa\xb7\x5f\x38\xc5\xdc\xfb\x02\x35\x8a\x77\xfa\x40\xf1\x01\xf2\xc1\x14\x5f\x1e\x7d\x2c\x67\xef\xfb\x3d\x77\xa8\x46\x41\xf4\x16\x34\x3a\x52\x0a\x72\x7a\xe9\x69\x4b\xf9\xc4\xec\xa3\xd9\x65\xed\x75\xd0\xd8\x6b\xb5\x20\x6c\x43\x7d\xf4\x71\x33\xb6\xd6\xa0\xfd\x49\xce\xf9\x00\x49\x35\xb5\x30\x87\xc4\xb3\x7d\xe6\xd0\xbf\xfd\xc2\x25\xc8\xd4\x28\xd4\x28\xcc\x94\x1c\xbd\xad\xcf\x6d\x6b\xc8\xdf\x5e\xda\x9f\xb5\x2a\xe7\xa5\x4d\xc7\x6e\xd2\x6e\x46\x08\x05\xda\x30\x38\xd5\x28\x86\xf6\xcc\xa7\xad\x8a\x66\x3e\x91\xa3\x83\x19\xbc\x3d\x96\x8b\xa0\x3c\x34\x00\x2d\x7e\x0e\xd9\x32\x67\x52\x17\xcb\x5a\x9a\x0b\xc9\xee\x34\x14\xa7\x15\xa7\x8d\x70\x02\xeb\x30\xfe\x78\xbf\x54\x32\x0a\x56\xa2\x05\x69\xe4\x3d\xe3\xed\xf4\x12\x2f\x0a\xd6\x07\x9c\x9c\x8d\x94\x07\x80\x09\x30\x01\xb1\xa8\xde\xed\xb5\xdb\x45\x40\xd5\xc9\x78\x4f\x5d\x95\x6c\x65\xd6\x9e\x62\x51\x66\xad\xd6\x21\xe5\x31\x14\x83\xca\x68\x29\x5b\x5a\x19\x2d\xad\xf4\x1a\xf7\xa5\x05\x3d\xd3\x3a\x4b\xbc\x19\xeb\x57\x31\x34\x4a\x96\x0b\x17\xb5\x67\xd0\xb8\x53\xf3\xc7\x5c\xb6\xe9\xea\x0f\x6b\x5f\x84\xc1\x7a\xa6\xe3\x1d\xfd\x87\xaf\xfe\x7c\xf2\x80\xfe\x77\x08\x3d\xb0\xee\x41\x32\x95\xf9\xfb\x1f\xee\x5f\xba\xa6\x26\xba\x62\x6c\xdd\x6f\x96\xdc\xa0\xbf\xaf\x0f\xd6\x3f\xd3\x5f\x02\xdb\x3f\x3e\x05\x66\xab\xbe\x53\x7f\xec\x95\x97\x56\x3f\x92\xc9\x98\xb1\xa2\x54\x7e\xd4\x98\xf2\x83\x33\xd7\x5f\x55\xa3\xc0\xba\x82\xbc\x9c\xb3\xfe\x34\xc6\x93\xae\x7f\xda\xdc\xdb\xbf\x50\xfe\xd4\x28\x7f\x9e\x6a\xf5\x69\x44\xec\xb3\xfe\xfd\xdb\x2f\xac\x37\xf9\x2c\x4f\x8d\xe2\xc9\x9a\xaf\xb7\xf5\xb9\x6d\x0f\xd5\xfc\x94\x43\xbb\xab\x35\xef\xbc\xb4\xe9\xb8\xcd\xf6\x75\xc8\xa4\x6d\x3c\x80\x3c\x85\xe7\xd2\xa6\x7c\x60\x8e\xa3\xf9\x3f\x88\x5a\x95\x7e\x95\x5a\x95\xff\x69\xcd\xb3\xda\x67\xf9\x80\xa0\xfb\xd0\x0f\x4c\x92\x79\x8c\xc6\x27\xb8\xd1\xcf\x52\x95\x29\x09\x64\x09\x24\xc9\xe9\xe2\xea\xc5\x4e\x11\x8b\x22\x7e\xac\x88\x6b\xe2\x76\x70\x84\xb3\xef\x45\x4a\x4a\x59\xac\x6c\x56\x76\x2a\xfb\x94\x4e\x85\x57\x14\x81\xd9\x8b\x84\xc7\xc5\xa7\x51\x75\xc7\xdf\x3a\x94\x57\xad\x3c\x6b\x1a\x0f\x98\x48\x50\x65\xae\x37\x8e\x3b\xec\x61\x7b\x00\xb8\x39\xcb\x96\x2d\xd5\x1f\x26\x0f\xea\x43\x96\x2d\x5b\xca\x3c\xb6\x72\xe5\xca\x95\xdd\xef\x6d\xdb\x76\x8f\xf1\x85\x8e\x6b\x59\x66\x0f\x33\x83\x79\x08\xb9\x51\x10\x45\xd0\x75\xcf\x78\x14\xd1\x93\x2e\x30\x74\x48\xd1\x93\xa6\x95\xcb\x86\xc9\x5a\x3a\x5f\x31\x7e\x78\x0a\x34\x26\xaf\x38\xed\x90\x0c\x65\xce\x2e\x97\xe4\xa5\x31\x62\x81\x2d\xd0\xf2\x3d\x8c\xaf\xa8\x5e\x72\x10\xc4\x08\xe0\xf2\xfa\xea\x6d\x82\xf2\x7f\x55\xe5\x20\xab\xcd\xa1\x64\x3f\x75\xce\x2c\xb3\x6a\xd6\x00\x83\xe5\x13\xd6\x4c\xdd\x00\xd2\x67\xab\x16\x4e\x58\x33\x75\xbd\xfe\xef\x4f\x56\xaf\x84\x6d\x97\x34\xfc\xee\x4e\x5c\xa5\x2f\x18\xd5\xf8\xbb\x3b\xc3\x37\x4d\x5d\xb3\x1d\x04\x90\x60\x70\xd5\x4d\x53\xd7\x3c\xa4\xeb\xfa\x57\xfa\xdb\x30\x10\x6f\x8e\x9c\x78\xab\x15\x0e\x76\x2f\x0b\x9f\x7c\x6b\xb7\xc1\x9b\x99\xb3\xcc\x60\xca\x13\x75\x26\xbf\x3d\x4d\xcf\xbb\x8b\x9e\xf7\xa7\x5b\x3d\x2e\x4e\xe9\xc3\x13\xfd\xdb\x1b\xf2\xd0\xe0\x65\xbf\x1a\x85\x29\x2e\x4f\x6f\xeb\x73\xdb\xd2\x7b\x96\x5a\x7f\x6a\x14\x04\xbf\xeb\xdc\xb6\x94\x7f\x4c\xba\xcd\x18\x99\x5a\x9c\xd7\x10\x24\xe0\xcf\x37\x5b\x67\x65\x20\x8d\x0f\xa3\xb4\xa7\x98\xe3\x98\x60\xd2\x2e\x50\xa3\x30\xd1\x97\x87\x7a\x39\xd9\x8a\x61\xe6\x34\x5a\xa7\x6e\x44\x6a\x40\x5e\xfa\x4b\x36\xc3\x62\x36\x64\x53\xdd\x1e\xc6\x59\x83\xe4\x7d\x32\x96\x15\xe4\x0c\x4a\xfe\x7a\xc1\x8b\xf2\xeb\xb1\x62\x85\x60\x99\xd1\x47\xbe\x1e\xe5\x2d\x1b\xb7\x5c\x6a\x85\x32\xab\xbc\x3b\x37\x82\xb9\x27\x76\xd9\x6e\x6f\x6b\x13\x84\x9e\x08\x66\xd2\x96\x8d\x5d\xde\xb1\x3a\xac\xc7\x04\xa4\x0f\xdb\xaa\x3f\xd0\x1b\xc5\x9c\x9d\x0f\x9d\xbf\x39\x9f\x66\xc1\x9a\x7f\xd0\x98\xbf\x50\x10\x46\xe2\xb9\x98\x0c\x77\x24\x8b\xfb\x8c\xeb\xb1\xcb\x54\xcb\x2e\x93\x95\x3e\xb8\x8f\xa9\x8b\x2c\xca\xea\x13\xe3\xbe\x37\xcf\xf2\x00\x35\x8a\xfd\xc5\x91\x5e\x8d\x2a\x8b\xf7\xa4\xb2\xb4\x6b\x33\xdd\x26\x6d\x17\xa5\xdd\xdd\xaa\xc9\xe7\xa1\xfd\x45\x96\x76\xed\xb7\x26\xed\x12\x35\x8a\xbd\xa5\xc5\x7d\x69\xeb\x55\xcc\x41\xf6\xf9\x2c\xed\x89\xb0\x09\x21\xe4\x4f\x29\x38\xd4\x73\x9b\x22\x9f\x0f\x65\x6f\x53\x4a\x5f\xaf\x62\xa6\xd0\x7b\xfd\x22\xeb\x99\x08\x42\x68\x40\x2a\x80\x57\x0d\x82\xc5\x83\xa0\x79\x10\x84\x06\x81\x32\x08\x90\xf1\xdf\xa0\x9e\x87\xb3\xcf\xd3\x7a\x47\x54\xdf\xcf\xb7\xf4\xfd\xaf\x2d\x7d\x3f\x9f\x8d\xc2\xff\x7a\x03\x16\x4c\xd3\xc3\xe3\x34\xc6\x89\xf2\xd6\x48\xab\xfd\x4e\x53\xf2\x41\x9e\x1a\x85\xed\x9a\x4f\xee\xab\x23\xf4\xa3\x7f\xa8\x06\xed\x84\x29\xa8\x34\x95\x07\x5e\x36\x0a\x6f\xe6\xc3\xbe\x7c\x58\x95\x0f\x8b\xf3\xa1\x3e\x1f\x6e\xce\xf7\xd2\xee\xac\xf1\x9d\xbf\x4f\xee\x50\xcd\x54\xb3\x47\xcd\x38\x57\x79\x9a\x9c\xab\x2f\x98\xfd\x55\x66\xfb\x1b\x8f\x76\x5b\xf3\xc9\x63\xa3\xf0\xcb\x7c\xff\xf9\xe6\xc3\x7e\x9c\xa5\x3d\x7e\x6a\xce\x99\xcd\xf3\x9e\x87\x76\xef\x5c\xd2\xe8\x81\x1c\xda\x4b\x0b\xbd\xff\x75\xad\xb8\x43\xe9\x59\xbd\xb4\x1b\xf2\xfb\x8e\x9b\xd6\x7c\xa2\xb4\x0b\x4c\xda\x99\xef\x73\xb1\x84\xf7\x5b\xfd\x0a\xca\xd5\x45\x26\x65\xce\xb2\x11\x4e\x53\xa2\x07\x47\x1d\x43\x2a\x7f\x64\x2e\x1e\x83\x10\x2a\x4c\xd9\x30\x6e\x29\x84\x45\x85\x30\xa9\x10\xda\xf1\xed\xad\x85\xc5\x54\x38\xd0\xf5\xac\xc8\x64\x7a\x30\x1e\x17\x77\xf0\xf6\x6c\xbe\xdf\x71\x4e\xa3\x75\xbb\x2f\x4f\x55\x2a\x1c\xb2\xcb\x2e\x26\x58\xe3\xf3\x6c\x0e\xec\x0c\xe0\x40\x69\x38\x9b\xf6\xe7\x57\x26\x79\x54\xd5\x6d\x2f\xaa\x47\xa2\x22\x86\x44\x22\x8a\x6e\x14\xa9\x27\xde\xbc\x6c\x2d\x6d\x5a\xa6\x31\x99\x4d\x1e\x48\x24\x3a\x7c\xd4\xa5\xdd\x37\x1d\x70\x14\xd0\x68\x21\x4f\xd2\x13\x39\x7f\x5a\xe0\x9b\x4b\xed\x76\x7d\x2d\xac\x68\x7b\xe8\xa1\x9e\xe4\xc0\x7b\x6f\xdb\xf2\x47\x08\x01\x06\x06\x22\x3b\x7e\x15\xd9\xbe\xbe\xad\x6d\xfd\x4f\x31\xf8\x67\xe9\x5f\xda\xf5\xeb\xf4\x9b\x1e\xce\xe2\x76\xf4\xdc\x17\x5a\xe7\x5e\x32\xed\x6f\x27\xb5\xbf\xbf\x6e\xb5\x3b\xe0\x5c\xdd\x72\x51\x56\x0f\x1d\xa7\x99\x67\x33\xa0\x46\xb1\xdb\xe7\xb7\x9d\x8b\x39\xa6\xb2\xb4\x6b\x51\x41\x8e\x5d\xcc\xaa\xfd\xf1\x37\x93\xf6\x17\x59\xda\xb5\x4a\xaf\xee\x21\xe7\xfb\xce\x43\x3b\x2f\x4b\x7b\x3c\x8a\x40\x45\x16\xd7\xb2\xb9\x9c\xe7\xa5\xfd\x71\x96\xf6\x78\x9f\x49\xdb\x10\x87\xbe\x82\x40\x5f\xda\x7a\x15\x13\x61\xdb\xb2\xb4\x27\xa2\xd7\x11\x42\xce\x67\x01\x9e\xc9\x62\x86\x06\x5f\xac\xd5\x67\x30\x69\x2a\x47\x46\x5b\xed\x3e\x44\x45\xc8\xf9\x2c\xc6\x1f\x66\x35\xf2\x8a\xf3\x60\xa9\xe9\x2c\x96\x4a\xc7\xaa\x9d\x77\x1d\x72\x74\xfd\x74\xa0\x77\xac\x81\xa2\xbe\xeb\x40\xeb\x72\x51\xda\x21\x4b\x56\xd4\x5b\xb4\x03\x6c\x14\x2e\x2f\x0a\xf0\xd0\x87\x36\xcd\x6f\xa4\xb4\x53\xa6\x5c\xf8\xde\xb8\x9f\x49\xa5\x1a\x25\xed\x99\x1f\x5a\x47\x55\x7a\xfb\x8e\xc5\xa4\x9f\xca\xd2\xaf\x45\x57\xc2\x14\x14\x4c\xa9\x54\xd6\x29\x85\x80\x0a\xe1\xda\x42\xb3\x97\x5c\xf9\x43\xfb\xa1\x7b\x69\xf6\x53\xfb\x6f\xda\xcf\x45\xb4\x9f\x7f\xb7\x8e\x3c\x7f\x3f\x95\xd9\x7e\xc6\xa3\x5f\x58\xf3\x28\x60\xa3\x70\x63\x51\xf0\x7c\xf3\xa0\xfb\x69\xd2\x1f\x9f\xa1\x6b\x44\x46\xa8\x51\x82\x46\x55\x79\xfb\xac\x91\x3e\x82\x19\x4b\xf1\x74\x83\x36\x77\x64\x5e\x95\x29\x53\x82\x5a\x29\x5c\x1c\xc8\xef\xa5\x7c\xee\xfa\x1c\xb9\x7a\xb0\x49\xb7\x4a\x8d\x92\xc1\x17\x55\x7a\xfb\xcb\x1f\x73\xed\xc3\xe7\xc1\x97\x91\xcb\xce\xf6\x9d\x23\xd5\xdb\xf9\x3d\xae\xe8\xc1\x8b\xad\xf6\x4e\x58\x6f\x6a\x30\x38\x0a\x4e\xbf\x8b\x57\xfa\xe0\x44\x88\xfa\xcd\xda\xe8\x5b\x17\x66\xa4\xca\x35\xc6\xde\x20\xf2\xb6\x80\x8f\xc8\x0d\x2e\x74\x46\xe9\x54\xb0\xe2\x6c\xf2\x79\xa5\xf9\x2e\x70\x35\xbb\x79\xe2\x9e\xef\x03\x9f\xdb\xe7\x06\xc5\xe6\x62\x81\xe4\xbc\xac\x83\x86\x2b\x36\x26\x12\x4a\x36\xc6\x42\xf9\x20\x91\xa0\xa1\x16\xee\x8a\xa4\x27\x2b\x58\x68\xf5\xb3\x48\x85\xa1\xde\xae\x3b\x80\xc7\x1d\x58\xb7\xee\x40\xf7\xb3\x07\xd6\x91\x0d\xdd\xcf\x32\x47\xff\xfd\xef\x7f\xff\x7b\xdb\x4f\x27\xf1\x9e\xee\x69\xcc\xe0\x6d\xfa\x86\xd3\xa7\x11\x20\xc6\xca\x09\xa5\xf1\xb1\xaa\x80\x6a\x36\x07\x77\x06\x71\xb0\x40\x76\x6b\x84\xaf\xb1\x4b\x48\xd8\x27\x60\xc1\x25\x4d\x92\x6d\x36\x87\x46\xea\x91\x4f\xf1\x85\x7c\xc4\xe7\x73\x20\xc1\xcc\x63\xeb\x2b\x02\x93\x49\x4b\x3d\x72\x55\x99\x39\x6d\x66\xc2\x52\xa4\x22\x59\x61\x86\x4e\xf2\x3d\x59\x76\x37\x9d\xdd\xb5\xa5\xed\xa1\x87\xda\x61\x97\x3e\x4b\x92\x16\x7e\x71\xf8\x05\xfc\x00\x30\x07\x4e\x76\x77\x32\xef\x18\x92\xae\x7d\xf3\x23\x87\xfe\xd4\x3d\x2b\x8b\xeb\x57\x64\xfd\x00\x75\x7d\xf7\xc9\xe1\xed\x77\xfe\x4c\x1b\xf4\xc3\xac\xcd\x5a\xd7\x9d\x63\xb3\xfe\xb3\xd5\xa6\xf5\xb3\x59\x29\x7d\x2a\x43\x8b\x2d\x19\x8a\x2d\xfa\x86\x10\xc5\xb9\x12\x34\x87\xfe\xa2\x2c\xfd\x71\xa6\x4d\x6c\xa7\xf4\x3f\x6d\x95\x6c\xe7\xa3\x4f\xcf\x60\xb1\x75\x06\x73\x31\x4c\x38\x47\x8e\x9a\xf4\xbf\xc8\xd2\xaf\x35\xe5\x07\x38\xd4\x28\x10\x19\x91\xdc\x3b\xb1\x43\xaf\x22\x9f\x50\x59\x57\x4c\xdb\x4e\x14\x4c\x49\x27\xf6\x4a\x3a\x93\xa6\x5e\xc5\x24\x39\xa7\x2b\x7a\xf0\x12\xb3\x5d\x00\x51\x49\x47\x02\x6e\xc5\x99\xd3\xce\x1c\x6b\x65\x76\xac\xe3\xb3\x63\x55\xa8\xcf\xa5\x8f\x5c\x46\x60\x8e\x95\xe6\x34\x94\xa5\x3c\x34\x3f\x74\x9a\x08\xa2\x28\xd9\x18\xb1\x8e\xf7\xa0\x3a\x2c\xe7\x26\x87\x9e\x93\x1b\x5a\xd0\x9b\xbd\x4b\xf6\x67\xd3\x76\x11\xa6\xb5\xa4\x23\xb4\x7e\x85\x8c\x2e\x49\x0d\xc4\x0d\x20\x35\xd8\x8a\x18\xd8\x61\xdb\x6b\xc3\x08\xce\x40\x27\x10\x60\x6c\x36\x06\x88\xa2\xf2\xcd\xac\xd3\x2d\x81\x59\xcd\x28\x59\x9d\xec\x50\x5d\xd0\x03\x5b\x9a\x98\x65\x52\x4d\xaa\xb4\x90\x9e\x59\x87\xa8\xf8\xa1\xfd\xdb\x1a\x1b\x5f\x3c\xa0\x6f\x59\xcb\xb6\xfd\x58\xeb\xfb\xfd\x60\x08\x32\xce\x9f\x74\x7d\x38\x42\x0c\x7a\x5e\xd7\x18\x27\xcd\x55\x56\x91\x07\x0d\x40\x33\x52\x09\xac\xd5\x78\x78\x8f\x12\xac\x09\xd9\x42\xa8\x10\x90\x17\x90\x07\x3c\xde\xc2\x50\xa8\xd0\xeb\x61\x4a\xa2\x81\x7a\x5f\x24\x98\x5f\xe7\x2a\x94\x3d\x1e\x27\xfb\x33\x91\xbe\x92\xe1\xe3\x44\xb5\x15\x48\x6b\x0d\x27\x6e\xc5\x73\x26\xac\x04\xb5\x6c\x52\x73\xb8\xe7\x0b\x24\xd5\x88\x19\xb4\xa1\x96\x5a\x39\xc6\x50\x7a\x6d\x75\x6c\x01\xfe\xc8\xf8\xd9\xbd\xad\xad\x0d\x62\x33\xe6\xed\x7e\x17\x36\xee\xb9\x77\x85\x95\xf0\x4c\x7f\xe8\x23\x7f\x6a\xd3\x2b\x1f\x28\x7d\xd7\xcc\x3a\x6e\x3b\x62\xf2\x92\xa1\xeb\x1c\xa4\x32\x2e\x62\xca\x2c\xb0\xe7\xf0\x36\xd2\x9c\xbc\xd0\x17\x3b\xd5\x35\x72\xcc\x90\x9f\x87\x6a\x34\x43\x7e\xce\x31\x79\x3b\xe0\x2b\x85\xf6\xcc\xf5\xad\x4a\x5e\x3f\xbc\xfd\xa4\x3e\x82\x79\x82\xf2\xdf\x00\x53\x36\x07\x69\x7b\x59\x33\xda\x1f\x69\x75\x28\xfd\x64\xe8\xbb\xfa\x08\x66\x03\xa7\xb9\xa2\x07\xc7\x98\xed\x31\x6d\xaf\x52\xfa\xcf\xb6\xca\x2e\x89\xed\xc3\x5f\x34\x6f\x9a\xa9\x45\x4e\x74\xd3\xff\x63\xde\x34\xcf\xb0\xe7\x24\x4e\x3b\x90\x38\xd6\x4c\x9c\x66\x78\x1e\x61\x89\xf5\xd8\xb0\xdc\x23\x5f\xd5\x64\xbf\xbc\x69\xf5\xbf\x27\x4e\xaf\x87\xbb\xdf\xc9\x49\x9c\x86\xae\x87\xe1\x11\x1d\x77\xb7\xc2\x3b\x53\xf4\x95\x4c\xad\xfe\xbe\xfe\x8e\x39\x57\x5a\x93\x90\xae\x7d\x89\x69\x37\x64\xe6\xe6\xfa\x47\xd3\xad\x9c\x88\x98\x9c\xb3\x4c\x73\xad\xf9\xc7\x5c\xd1\x83\x97\x59\x76\x46\x1d\x6c\x30\xcf\x1e\x8e\xc2\xc5\xb9\xc8\x9c\x49\x5f\x1f\xc1\x14\xd1\xb5\x2f\x31\xd7\x52\xa0\x6b\x29\xd0\xb5\xff\xb4\x0f\x75\xda\xfe\x79\x7d\x04\x13\xa3\x6b\x7f\x99\xd9\xfe\x53\x53\x6e\xd1\xb5\x7f\xbf\xf5\x5c\xfa\xb4\xa6\xe2\xb3\x3d\xe3\x3f\x32\x17\x50\xe6\xf7\x54\xba\xfc\x9d\x93\x2c\xda\x15\xd6\xb8\xa7\x64\xe9\x1a\xed\x96\x21\x84\xd4\x27\x01\xda\x61\x5e\xab\xe4\xb4\xc8\x56\xf4\xd2\xec\x19\xb3\x21\x5f\xbe\xee\xde\x4a\x69\xbe\x6d\x17\xfa\xd1\xac\xec\xa5\x79\x68\x3c\xcc\xeb\x1e\x6e\x8c\x16\x5a\x14\x68\x87\xcb\x5b\x15\x3b\x25\xdb\x48\x05\x17\xa0\xb4\x55\xb3\xd0\x81\x56\xa6\x86\x49\x80\x45\xcc\x33\x44\x20\xcb\x85\xf5\xc2\xfd\x02\x91\x84\x3c\x61\x90\x40\x6e\xc4\xb7\xe1\x6d\x98\xb0\xd8\x83\x4b\x30\x11\x45\xe4\x90\x79\x5b\x03\x22\x0c\x31\x48\xd0\x3c\x0a\xbb\x9c\x46\x20\x31\x3c\x83\x05\x2c\x60\xc4\x12\x9b\x55\x30\xd2\x65\xe1\x86\x60\xc6\xc2\x2b\x1d\x09\x5a\x02\xd7\xcc\x10\x53\x56\xae\x63\x5e\x7a\x49\x59\xf7\xd2\x4b\x61\x95\x2f\xad\x54\x93\x6a\x89\x8f\x55\xc3\x1e\x70\xae\x1c\x77\xec\x00\xc4\xea\xf4\x75\x78\x05\x9c\xad\x5b\xb9\x92\x14\x76\xcf\x78\x61\xe5\x17\xfa\xd8\x87\x4d\xfe\xee\xc9\xaf\x57\xd1\xc6\x94\xf7\x1a\x1b\xcc\x23\x60\x43\x20\x81\x40\xb0\x88\x25\xbf\xc3\x9b\xc6\x34\x47\xc2\xe1\x4d\x3b\x16\x49\x2d\x12\x96\x24\xc1\x5e\xa3\x12\x56\x21\x6a\x8a\xd6\xeb\x27\x18\x37\xaa\x30\x49\x05\x55\x75\xb9\x55\x7b\x9d\x13\xd9\x88\xc0\x80\x08\x22\x70\x4e\x0f\x53\xc7\xa1\xdc\xe1\xf7\x26\x3c\x24\xe3\x8d\xaa\x8f\xbe\xfb\x2b\xde\x98\xa0\x68\x93\xb2\x72\x9d\x39\x09\xd4\xd8\x08\xc6\x34\x0c\x39\x5d\xe9\xe3\x7b\xf2\xf8\x37\xd6\xbd\xa7\x7f\x03\x47\x77\x4f\xfc\xca\xcc\xe6\xc7\xf5\xb3\x96\x6f\xc2\xeb\x3d\xb7\x74\x37\x2d\x5c\xbe\xa3\xfb\x55\x2a\xbb\xb3\x3e\xeb\x65\x3d\x3e\xeb\x83\x0b\xa9\xce\x69\xf0\xb1\x61\xff\x5e\xa5\xb8\xf9\xf3\xe8\x55\x54\x67\xab\x31\xb1\x9b\x45\xe6\x7d\xe7\x53\xa3\xb0\x48\xd5\xfa\xe0\xa1\xeb\xf4\x11\xc6\x3e\x5b\xb4\xb9\x23\xf3\xde\x30\xf1\x29\xca\xf3\x27\x5a\xcf\xa5\xad\x8f\x60\x06\x53\x1d\xbf\xc6\x6c\xff\x11\x6d\xef\xa6\x3c\xff\x51\x6b\x2e\x75\x74\x9e\xb1\x1f\x4a\x5b\x58\x07\x68\xf4\xcc\xea\xad\x7e\x85\xcf\xd5\x21\xfb\x8d\xfd\x50\xda\x6e\x8e\xdd\xa3\x46\xc1\x1e\x50\x73\xa8\xe3\x4c\x27\x42\xcc\xb5\xf4\x5d\x0c\x7e\x54\x99\x2a\xe4\x6b\xfc\x79\xaa\xa3\x26\xee\x04\x27\x07\x5d\x84\x51\xa5\x7a\x8f\x22\xcb\x7e\xa7\x87\x74\x73\xb4\x0a\x46\xd2\x4c\x4a\x4f\x7e\x9e\xb0\x0a\x65\x5a\x6f\xc1\x19\xe6\x86\x9c\x6a\x01\xa3\x21\x19\x0a\x00\x04\x9d\x89\x5f\xad\x1f\x39\x90\x34\xbf\xa7\x7f\xd8\xb6\x35\x4f\x1a\xf4\xf8\xd5\x70\x1d\xdb\xe6\x7d\x59\xff\xc7\xd7\x40\x7e\xac\xcd\x29\x21\x50\xd7\x60\xd5\x10\x00\xb4\x4e\x5f\x41\xcf\x8d\x1f\x5d\xf9\x8c\x5f\x70\xfa\xd3\x3c\xc5\x33\x15\x7f\xfa\x32\xfe\xe7\xfc\x5c\x9e\x0c\xe5\xc1\xc3\x97\xf0\x98\xe3\xc1\xed\x66\xfd\x82\xfd\x27\x47\x1e\x0f\xcc\x4f\x88\x3d\xc3\x76\xb2\x84\xf5\x36\x69\xaa\x1d\x71\xc4\x2f\xd0\xd7\xcb\x25\xab\x93\x66\x3e\x97\xe9\xe3\x34\xdd\x45\x56\xe9\xbc\x58\xdf\xc2\x9e\x6a\x6f\x24\x2b\x94\x99\x05\x3e\x25\xd7\x13\xaf\x1e\x98\x3d\x7a\xe2\xe4\x93\xbd\x75\x3e\xef\x03\xd7\x6a\xfc\xce\x8f\xb3\x8f\x9d\xf4\xef\xd4\x3a\x68\x6e\xb6\xae\xd1\x5a\x0b\x7e\x34\x32\x15\x71\x3a\xc1\x5d\xb3\x59\xda\x29\x61\x29\x8f\x41\x35\xe6\x3b\x63\xd4\x7a\xd9\x1e\x64\xbc\xf5\xbc\x82\x65\xe8\x29\x61\x94\xec\x2d\xbb\x49\xc7\x14\xee\xad\xb5\xa0\x84\xad\x81\x18\xcb\xaa\xc2\xb4\x9e\xb2\x0b\xfa\xfb\x93\x87\x0e\x1b\xd5\xf2\x85\xfe\xba\x59\x78\xa1\xeb\x1e\xfd\xa9\xc0\x56\xcf\x1e\xf2\x0b\x63\x2d\xb3\xf1\x0a\x54\x77\x1c\x68\xe9\x8e\x56\x7c\x06\xf6\xb2\x51\x8c\x35\x4f\xbf\xf8\x06\x13\x17\x5f\x94\xc5\xd0\xc7\x59\x18\xba\x57\x8d\x62\xa4\x79\xfa\x60\xe8\x66\x2c\x44\x2a\x4b\xbb\xb6\x27\x96\xcb\x67\xc5\x72\x05\xfa\xc6\x5a\x98\xb4\xbf\xc8\xd2\xae\x45\xbd\x3e\x26\x14\xd0\xce\x43\xbb\x37\x8e\x63\x12\xb5\x3b\xa9\x97\x29\x8f\x8d\x12\x5c\xa7\x15\xf5\x8d\xb3\x38\x8f\xbf\x60\xd2\x14\xcb\x2f\x95\xa7\x46\x09\x9e\xa2\x15\xf5\x41\xf4\x31\xd2\xac\xf7\xa3\xb9\x51\x3e\x1a\x97\x2a\x73\xba\x1a\x14\x0d\x34\x45\x53\x38\x3b\x2a\x0c\x34\x70\x6a\xd3\x7c\x27\x38\x9d\x6e\x7b\x93\x8d\xf8\x9a\x04\x26\xd8\xc4\xb8\xdd\x96\xb8\xed\xc8\xa9\xb6\xdd\xd1\x93\x74\x47\x23\x85\xcb\x80\x37\x8b\x92\x26\x7c\xd9\x10\xad\x12\xd5\xc2\x53\x98\xe3\xdd\x2f\x96\x27\x2f\xd4\xfd\x18\x4d\x49\xe3\x02\x7d\x29\x5c\xad\xdf\x0f\x77\x76\x1f\xbe\x68\x9c\xfe\x1a\x54\x8c\x95\x24\xfc\x6f\xfc\x85\xcf\x0c\xd8\xb2\x33\x33\xc2\x66\x61\x52\x82\xaa\x32\x67\x99\x6d\xcc\x6c\xea\x83\x2a\x43\x0b\x53\x65\x12\x2a\x53\x6b\x94\x82\x54\x41\x7d\xc1\xe2\x82\x55\x05\xfb\x0a\x0e\x17\xbc\x59\x20\x14\x14\xb0\x25\x63\xbd\x59\xd7\x69\xac\xb8\x86\x46\x1a\xfb\x5d\xfe\x34\xab\xd6\x97\x95\x05\x4b\xa5\xa2\x7a\xbb\xa0\xb8\x51\xb0\xde\xef\xc1\xde\xac\xe7\xb4\x23\x91\x30\x93\x5b\x62\x39\x4e\x53\xd3\x67\x5a\xd2\x8b\x13\x59\x3e\x53\x97\xe5\x32\x8d\x96\x24\x4c\x0b\x4a\xf3\x82\x12\x29\x26\x78\xc3\x8c\xa7\xee\x6e\xdb\xf7\xc0\xa3\x97\x4f\xdd\xbe\xe6\x01\x7d\x1c\xd9\xbf\xb0\x79\xf6\x8a\xe9\x9b\xf4\x8f\x1e\xd9\xd3\x50\x37\x09\x3f\xbd\x62\xa5\xfd\xb5\xf7\x21\x09\x02\xd8\x21\x76\xea\x94\xfe\xed\x99\x25\xfa\xfa\x09\xbb\xc6\xdd\x18\x86\x07\x60\xcf\x1b\x7f\x3a\xf9\x16\x76\xc3\x10\xfd\x84\xb9\x9f\xb4\x16\x2b\xe5\x81\x98\x25\xa7\x0b\x4c\xfe\x0a\x5a\xf8\x9b\xc7\x8f\x73\x78\xc6\xac\x5d\x41\xf7\x7f\xbc\x29\xa7\x67\xf5\xca\xe9\xc1\xaa\x26\xe4\xca\xc5\xfd\xfa\x08\x66\x0b\x95\xd3\x31\x53\xee\x76\x9b\x7e\x55\xad\x14\xb7\x67\x5e\xe8\x43\x99\x8e\xe5\x80\x3e\x82\x89\x50\x39\x3d\x9e\xea\x10\xf3\xf4\xbf\x20\x84\xa2\x29\x95\x8a\xea\x26\x15\xaa\x55\x28\x52\x41\x56\xa1\x5d\xff\x9f\x56\xab\xb3\x1e\xc8\xf4\xdc\xb9\x1c\x4a\x67\xfe\x6e\xce\x25\x40\xe7\xb2\xab\xb5\xc0\xf3\xdf\xe6\x42\xe5\xb6\xa7\x95\x8a\x6d\x63\xe6\x01\x55\xe8\x7b\x8f\xd0\x9a\xaf\x94\xfe\x05\xd6\x5a\x35\x5b\x77\x5a\x94\x8d\x42\x73\x28\x82\x82\x7d\xda\x1f\xcf\xc6\x14\x4c\x30\xd7\x6a\xb6\xb9\x56\x51\x35\x0a\xb3\x73\x5b\x9f\x4b\xfb\x50\x0d\xd2\x2c\xda\x21\x36\x0a\x5a\x34\xf4\xdf\x69\x1f\xaa\x31\xb1\x30\x08\xa9\x51\xf0\xe5\xb6\x36\x68\xeb\x1a\x53\x4d\xb1\x93\x0b\x4c\x1f\xf8\xa7\x08\x39\x9f\x43\x90\xf9\xac\x35\x74\x81\xd5\x92\xd2\xd4\x35\x06\xd3\xf5\x37\xc7\xbb\xf8\x7b\x4b\x83\xcb\x7c\xdf\xdb\xf0\xfc\x6b\x71\x28\x8d\x8a\xac\xf1\x0e\x60\xa3\x50\x34\xf0\xff\x36\xde\xb4\x64\x8e\x77\x80\x1a\x05\x69\x60\xdf\xf1\xce\xd3\x47\x30\x73\x28\xdf\x0c\x36\xf9\xe6\x03\xd3\x76\xa7\xf7\xfb\xe9\x56\xc1\x46\xfa\xea\xa8\x1b\xf4\x11\x96\x1f\x63\xa2\xd9\xde\xf2\xa5\x7a\x7d\xa5\x50\xa2\xf9\x78\x47\x2e\x6d\x84\x98\x39\x74\xdc\x83\x2d\x1e\xc9\xe4\xe2\x08\x8a\xd0\x9f\x76\xe6\x2c\xa3\x50\x1d\x74\xa2\xa5\xd7\x0e\xc9\xea\xb5\x93\x5b\x35\xbf\x45\xbc\x22\xb7\x7e\xa4\x8c\x2e\x4f\x25\x45\xd1\xc6\xb2\xbc\xad\xc1\xee\x74\x62\xf4\xa6\x1d\x76\xd9\x61\x8b\x1d\xc8\x9d\x76\x60\xae\xb2\x03\xab\xd8\xeb\xed\xd8\x2e\x39\x9b\x79\x59\x26\x36\x17\x87\x9b\x08\xa1\x0e\xa6\x2c\x8a\x92\x2d\x31\xff\x52\x55\x5c\xf9\x2a\x71\x38\x4e\x2f\x2c\x30\x6b\xf2\xaa\x3d\xf9\xa7\x58\x30\x6b\xf3\x42\x54\xff\xeb\x01\xfd\x5d\x92\x84\xd3\xbb\x77\xeb\xe1\x7b\xba\xaf\xc4\xdb\xef\xc9\xa9\xb1\x12\x44\x8b\x53\x97\x7a\x5d\x9a\xe2\xaf\x61\x79\x36\x64\x03\x9b\xcd\x21\x9e\x5b\x68\x25\xbf\xc0\xe5\xea\x29\xb4\x52\xc0\xf9\xea\x44\x4d\xcb\x93\xdc\x75\xb2\xc3\xae\xc8\x79\x7d\xeb\xad\x58\x03\xcd\xad\xba\x92\x4c\xc6\x69\x4e\x57\xc2\x04\xbf\x3d\x86\x8c\xae\x88\x54\x24\x2b\xb2\xe5\x57\xe8\x9f\x6c\x09\x96\x5d\xbb\x7a\x8b\xb0\x40\x52\x7f\xdd\x2a\xc4\xf2\xd3\x6f\x7e\xb0\x2a\xb1\xfc\xf0\x9b\x9f\x8e\xe6\xc6\x74\x55\x64\x63\xc0\xea\x10\x97\x8b\x43\x2b\x81\x7e\x36\xa9\xe9\x3b\xfc\x30\xeb\x67\xac\xc3\xbd\x7e\x46\x70\xe7\xf7\xf1\x33\x52\xda\xf4\xfe\xbe\xb0\x8f\xdf\x0c\x54\xaa\xef\x65\x5a\x65\xa5\x4f\xfc\x9a\x49\x7b\x51\x96\xf6\x38\xdc\xeb\x97\x01\x97\xfb\x5c\xda\xf4\xfe\xbe\xb0\xcf\xfd\x4d\xc3\x5d\x0d\xda\x9a\x7c\x1e\xda\x5f\x64\x69\x5b\xf7\x37\x15\x4a\xc8\xe7\x3a\x0f\xed\x53\x59\xda\x13\x7a\xe3\xdc\x64\x1a\xe7\xe6\xf2\x9f\x13\xe7\x66\xfa\x5f\xd7\x65\xe9\x4f\xe8\x36\x63\x33\x5c\x66\x6c\x46\x57\xab\x27\x98\xeb\x55\x3d\x6f\xfc\xdd\x24\x1a\x1b\x47\xfb\xf1\x18\xfd\x8c\x97\xf3\xfe\x0f\xfd\xf4\xfa\x79\x27\xd5\x5b\xbe\x4b\xbf\xd1\xd1\x24\x57\x41\x3f\xdf\xed\x4a\xbd\x8a\xa9\x67\xdb\xad\x3e\xb8\x43\x13\x83\x26\x86\x15\xcc\x46\xf7\x55\x58\xba\x7c\x15\x33\x87\xa9\xb5\xe8\xf2\x87\x26\x82\xd1\xa1\x2f\xe5\x04\x2b\xd4\x1c\xe5\xe5\x59\xce\xbe\xac\xac\xa2\xb5\x97\xe9\xf8\xcb\x2d\xd9\x8a\x73\xfc\x57\x38\x94\xe7\xea\x83\x7f\x98\xb5\x6d\xe8\xd8\xeb\x4d\xd9\x6a\x62\x87\x79\xf4\x5e\xe8\x6e\x0d\xe5\xf1\xfe\x92\xfe\xf1\xf6\x39\xb1\x83\x87\x6a\xb2\x32\x45\x34\x64\x8a\x2c\xe6\xc6\x0e\x9e\xeb\xa7\x3e\x54\x83\x7b\xef\x50\x52\xe0\x43\x62\x3f\xbf\xeb\x1e\x1a\xcb\x98\xe8\x1f\xcb\xe8\xa0\xf1\xcc\xb2\xdb\xa4\x9e\xb3\xf6\xbd\x32\x2e\x69\xdd\x53\x55\x39\xf8\xdd\x45\x52\x7f\x2c\x93\xd6\x24\xa1\xe3\xf9\x99\x79\x4f\xd5\xf5\xc6\x02\x4d\x92\xfa\xfa\x8e\x4c\xda\x95\x3d\xb4\x0f\x8d\x47\x4a\x0e\x96\xa4\x2a\xfd\x71\x4c\x4a\x9b\x62\xfc\x3f\x33\x31\x7e\xd3\x1f\x04\x4e\xb5\x5f\xeb\x73\xc7\x9d\x23\x9b\x29\x4e\xe5\x92\xfe\xfb\xb8\xb3\x76\x97\x41\xdb\xd1\xa7\x35\xc0\x1c\x84\xc8\x8f\x5c\x11\x72\xa0\x0b\x53\xf9\x7c\xcd\x24\xa1\x49\x38\x24\x7c\x29\x64\x04\x56\x10\x9c\x21\x04\x48\x26\xf5\x60\x07\xde\xac\x4b\x69\x48\x35\xaa\x78\xe6\x16\xdc\x1a\x3a\x2c\x99\x20\x3f\x96\x5d\x73\xcb\x4d\xb3\x9e\x6d\x7d\x6b\x25\xdb\xb5\x29\xbf\xf9\xa6\x9f\xea\x98\x7d\x07\x9f\xb4\x70\x2a\x5d\x23\xdf\xd1\x9a\xf0\x53\x52\x83\xbc\x85\xde\xc2\x30\x72\xf2\x4e\x3e\x54\x80\x16\x39\x9c\x4e\xa5\xc8\x01\x0e\x47\x28\xec\x40\x37\x28\x05\x05\x62\x60\x99\x4f\xe3\xc5\x65\x3c\x13\xcc\xd6\xdc\x32\xe4\x69\x0f\x46\x1a\x57\xac\x6c\x05\xd5\x2a\x3f\x00\xbd\xa6\xd2\xb0\x0a\x35\x52\x51\xd9\xa7\x38\x66\xd2\x83\x1f\xba\xff\xe9\xe4\xd8\x11\xc3\x67\x55\xbf\xf8\xe2\xfd\x4f\x5f\x31\x27\x3e\xe9\xe2\x59\xd5\xdf\x92\x31\x5d\xd5\x07\x9f\x94\xef\x77\xcd\x5b\x42\x8e\x8e\x1f\xb3\xfe\xe0\x93\x25\x1b\xf3\xe7\x2d\xb9\x6b\x7d\xcf\x3b\x13\xbe\xe3\x34\x14\x42\x43\x51\x32\x95\xef\x9b\x19\x88\xcd\x2c\x74\xa1\x61\xe1\x99\x45\x52\x5c\xc2\x52\x61\x79\x93\xcf\x25\x33\xd1\x26\xd6\x7c\x11\xcc\x1b\x3d\x0e\xce\x44\xa2\xe3\xcf\xc6\xd2\x68\xd8\x09\x91\xe2\x0b\x01\x57\x0c\x75\x8d\x86\x64\xc2\xeb\x1b\x4d\x2a\x93\x3e\x27\xe1\x0b\x81\xd5\x0a\x71\x32\x31\x1a\x57\x0c\xbd\x10\x47\x8a\x9d\x98\x59\x91\xfa\xf5\xab\xeb\xee\x7c\x6d\xf5\xc8\x91\xab\x8f\xdf\xf9\xcb\x03\x97\xb8\x7c\x0e\x0e\x1f\x93\x6d\xe1\x21\x63\x2e\x1c\x34\xa8\x6b\xfb\x80\x49\xab\x66\x35\xae\xaa\x8b\x44\xea\x5a\x66\x35\xae\xaa\x1f\x80\xdf\xff\x1f\xfd\xd3\x63\x0b\x17\x1e\x03\xdf\x9e\x3d\xe0\x79\x69\x41\xc3\x34\xf7\xd0\xea\x71\x03\xbd\x43\xaf\x9a\x5e\x9b\x3f\xf3\x93\xf5\xeb\xdf\xbb\x7f\xf2\xe4\xfb\xdf\x5b\xff\x9b\xbf\xde\x3b\x79\xf2\xbd\x7f\x45\xd9\x7a\x78\xdf\x31\x5f\xa3\x10\x8a\xa1\x8a\x54\xbe\xab\xb0\x10\xf9\x6a\x03\xd1\x34\x1a\x1c\x4e\x23\x09\xa4\xc2\xb2\x7a\x9f\x4b\x56\x06\xd4\xb3\xb4\x32\x5e\xf2\x58\xcf\x9c\x3a\xfe\xd6\xa1\x26\xd5\x64\xf9\x10\xd0\x9c\x38\x52\x7c\x21\xae\x18\x3a\x1a\x9b\x53\xaa\xc8\x4e\xc9\x9b\x0c\x99\x95\x03\x99\x19\xb5\x6b\xdb\x17\x5d\xdd\x7a\x5b\xdd\xb8\x5f\x3f\xb7\xe8\x8a\x47\x2f\x89\xc6\x3c\xec\x31\x59\x1e\x54\x35\x7e\x48\x74\x50\xd7\xbb\xbf\x7d\x00\x86\xfd\xf6\xc1\x07\x1e\xc4\xa5\xeb\xdf\xb9\x6b\xc2\x84\xbb\xde\x59\x7f\xfb\xc9\xbb\xc6\x5f\x72\xb1\x32\x3c\x3d\xbd\xdc\x77\xd9\xd2\x99\x97\x7a\x2e\xf9\xc3\x55\x27\xdf\x82\xdd\x7f\x7a\xe3\x0d\xab\xa6\x3e\xeb\xe3\x34\x14\x45\xc3\x52\x85\xdc\xcc\x66\x61\xb1\x80\x85\x92\x06\x70\x0e\x0c\x36\x20\x3f\xf8\x1d\x00\x51\x2e\x40\x42\x4d\x6e\xba\x17\x6f\x18\x16\x76\xcf\x1b\x79\xfe\x46\xf9\xd4\xd3\x33\x50\xb5\x67\x02\x86\x79\x6d\x6d\x82\x4a\xda\xe2\x95\x05\xe2\x31\x59\x2e\x9f\xb2\x7c\xfa\xe0\xab\x76\x2c\x5b\xf8\xc0\x55\x17\xee\xf7\x0f\xbb\xfc\xe2\x4b\xa7\x0d\x71\xb3\x6d\x2f\x0a\x43\x27\x5e\x31\xcc\x7b\x59\xcb\x35\xe3\xd5\xee\x79\x4b\x9f\x5d\x7d\xd9\xc5\xbf\xda\x7f\x0b\x79\xb7\x2b\x39\xfd\xd6\x69\xb1\xf2\x86\xd5\x53\xc8\xff\x5a\x35\xd1\x58\x1f\xf3\x35\x2a\x45\xd3\x9f\x2d\xaa\x45\x61\x25\x8c\xc3\xed\x99\xc3\x4f\x6b\xbe\x34\x7d\xcd\x77\xc4\xa9\xa6\xc3\x80\x7c\x35\x79\xd1\x32\x67\x0d\x72\xec\x73\x60\x47\x34\x2f\xcf\x51\x54\xe4\x77\xc8\xd8\x55\xcf\xf7\x96\x4b\xa3\xa9\xad\xd9\x49\x24\x12\xef\xc7\x62\x8d\x1d\xe5\x43\xc2\xa5\x11\x27\xc9\x8e\xdf\x6b\x0e\x3f\xd9\x3b\x3b\xe2\xca\x13\xbc\x23\xd3\xf5\x65\x93\x6e\x9a\x34\xb0\x6d\x6a\xc3\x25\x0d\xc3\xfd\x6d\x43\x47\x87\xa4\x63\xb2\x9c\xf8\x79\xcb\xac\x2d\xb1\xea\x32\xed\xc2\x2b\xef\xbb\x06\xbf\xde\x3d\xea\xd6\x5b\x87\xce\xdd\xda\x8c\x2f\x5a\xc1\x25\xea\xe6\x0e\xf7\x8d\xbd\xfd\xba\x34\xdf\xb5\xcf\xc2\xb8\xff\xc7\x90\x1d\x47\xe6\x98\xb2\xe3\x7b\x1a\x17\xba\xc8\xaf\x20\xa9\x27\x2e\x94\xc6\xbc\x08\x56\xde\x95\x12\x3d\x34\x01\xaf\xa4\xd2\x34\x8d\xa7\xa0\x29\xa9\x72\x66\xdf\x40\x68\x1e\x08\x66\xcc\xee\xc0\x31\xff\xa7\xd4\x27\xa6\x30\x5a\xe6\xf2\x97\xf4\xcb\x80\x8a\xe5\xe6\x40\x55\xf7\xc6\xa5\xd0\xb8\x19\x01\x99\x71\x2d\x46\x9f\x96\x04\x9f\x0d\xa7\x51\x3a\x35\x84\xe9\x4c\xc1\x97\x29\x38\x9d\x82\x13\x29\x68\x4e\x41\x51\x0a\x52\x04\x77\x16\xc3\x99\x62\x78\xb3\x18\x8a\xd5\x28\x53\x98\x1a\x59\x12\x2b\x21\x38\x9c\x8d\x07\x36\x84\x20\xed\xa7\x27\xa9\xcf\x8a\x87\xd8\x4f\x65\xed\xaf\xac\x1e\xde\xc9\xc9\xf9\xf8\x40\xf3\xf5\xc3\xec\x69\x2c\x31\x95\xb5\xdb\x73\xe3\x45\xa9\x33\x78\xf1\xd0\xca\x50\x2e\x3e\x47\x73\x1d\x28\xed\xcd\x7d\xef\x1f\x32\x90\x8d\x92\x8a\xe2\x12\x6c\xeb\x87\x87\xec\xb1\x30\x85\x7d\xb9\xf1\x8a\x64\x90\x1a\x25\x93\x07\x94\xb2\x72\x1f\x5b\x66\x44\xae\x2d\x73\x64\x9e\xa5\x1f\x15\x6b\xa5\x80\xfa\xd9\x54\xc7\x0d\xbb\xa0\xd7\x9e\xe9\xc1\xfd\x8a\x2d\xdc\xaf\xbf\xbd\x06\x07\xc9\x11\x62\x67\xdb\x5c\xdc\x91\x18\xcd\x85\x0d\x32\xa7\xc8\x53\x5c\x18\xc9\x28\x96\xf2\xd8\x6d\x84\xb0\xdc\x3d\x80\x90\x4a\x6c\x77\x73\x32\x7d\x5f\x16\x8a\x37\x26\x3e\x37\xb3\x6e\x3f\x4a\x54\x05\xe2\xc9\xa4\x59\x23\x9c\xe3\x23\x15\xc3\x2a\x87\x55\x26\xbd\x45\x40\x9e\x5a\xfe\xf3\x5f\xad\xad\xbb\x39\x50\xbc\xa1\xe4\x48\xc9\x86\x11\xcc\xa9\xe1\xb7\xde\x9e\x08\x16\x44\x1f\x9c\x34\xe9\xc1\x4b\xcf\xe9\x87\x65\xec\x76\x49\xbc\xc7\x29\xcb\xaa\xdd\x29\xde\x2d\xb3\x4d\x2c\x66\x51\xbc\xf1\xa3\x44\xff\x7e\x38\x9e\xe3\x23\xd1\x38\x54\x24\xbd\xbe\x61\x95\x49\xf2\x54\xa0\x78\x63\xe4\x48\x64\xe3\x88\x9b\xa7\xac\xbe\xe5\xf2\xe5\x1c\x57\x10\xdd\x3e\x61\xc2\xf6\x4b\x83\xc3\xd6\xae\x1a\x61\xf4\x33\x96\x39\x45\xd6\xb2\x8b\x10\x41\x17\xa7\xfc\x45\x70\x9a\xe6\xd0\x31\x00\xec\x62\xb4\xca\x7a\x3d\x12\x4b\x11\x70\x55\xb4\xa7\x11\x62\x60\x93\x8c\x01\xa7\xec\xfe\x34\x46\xf1\x58\xa3\x55\x77\xc2\xaa\x43\x19\xf6\x84\x61\x2c\xae\xee\x3e\xc2\x2e\xda\x86\x00\xaa\x98\x53\x64\x0b\xfb\x05\xb2\xa1\x09\x29\x17\xb7\xc6\x2c\x03\x6a\xbe\x2f\x6a\x27\xcb\xb3\x3d\xef\x35\x63\x59\xdb\x9a\x22\xb4\x09\xed\x45\x5f\xa2\x0c\x62\x11\x72\xd8\xd8\xad\xe2\x26\x99\x34\x11\x4c\x50\xbc\xb1\xc3\x2c\xc2\xd2\x5b\xa7\xc8\x09\x91\x10\x49\xd2\x00\x72\xb2\x45\xdc\x79\xbb\xfe\x2f\xf5\x17\xfc\xa4\xf9\xcf\x48\xec\x17\x2d\xdb\xc0\x33\x61\xc8\x4a\xb3\x86\x7b\x17\x8b\xf0\x5b\xec\xc7\x88\x47\xb5\xa9\xa1\xff\xe0\x80\x5b\x8b\xdf\xc3\xf0\x1a\x86\xc7\x31\xac\xc7\x30\x13\xc3\x25\x18\xa2\x18\x82\x18\xb0\x88\xb6\xf4\xad\xff\xf2\x25\x23\x30\x56\xae\x7b\xcf\x1b\x24\x94\xdc\xf7\x8b\xe2\x79\x0b\x16\x5c\xcb\x7e\xbc\x74\xd9\xb2\xa5\x08\x61\x58\xc3\x9c\x22\x69\x6e\x1d\xb2\x21\x2f\xda\xf8\xcc\x6e\xa9\x55\xc2\x52\x7b\xe6\x4c\x4a\xb4\xcb\xe9\xdd\x42\xab\xf5\xea\x27\xbf\x5d\x4e\x3f\xca\x1c\x60\x30\x13\x32\xbe\xe1\x03\x18\x63\xe3\x9b\x4c\xeb\x15\xba\xfd\x69\x79\x8d\xf5\x82\x6f\xa2\x29\x6e\x7f\x5a\x5b\x23\xfa\xed\x82\xc7\x9f\xb6\xdf\x21\x73\x45\x5c\x9c\x6b\xe1\x4e\x70\x2c\xa7\x1a\xcd\x6d\x1e\x7f\x5a\xbd\x23\xcb\x73\x1d\xb1\xbf\x35\x76\xc4\x40\xf9\xc0\xfc\x92\x53\xeb\x21\x27\x61\x9a\x98\x2f\x7c\x1c\x56\x31\x34\x8a\xaf\x9c\xb7\x7c\xf9\xbc\xb9\xab\x5b\xae\x1e\x52\xbd\x38\x51\x5d\xcd\x9c\xba\xfe\xaa\xab\xae\xbf\xb1\xe9\xca\x9b\x20\x3d\xb2\x62\xc9\xc8\x8a\x8a\x91\xc6\x1a\x6e\xd7\xab\x48\x1c\x21\xe4\x44\xc3\x53\xc5\x83\xf9\x51\xfc\x44\x9e\xb0\xe5\x36\x77\x5a\x10\x91\xed\xd7\x93\x68\x49\x00\x0e\x21\x45\x70\xdc\x19\x32\xdf\x08\xda\x11\xb7\x32\xce\xcd\x37\xee\xc6\x1a\x7b\x0a\xcf\x54\x26\x69\xe7\x24\x3e\xee\x67\x37\xfd\xea\xe0\x9a\x3d\x2d\x97\xe8\x47\x96\xf8\x7e\x31\x7b\xf3\xc2\x95\x4b\x9a\x8d\x7b\x44\x67\x4e\x91\xd7\xd9\x0f\x91\x8a\x92\xa9\x42\x74\x2b\x82\xcd\xb0\x0f\x0e\x1b\xdc\x28\xde\x2a\x49\x6e\x65\x93\x48\xb6\xf2\x9b\x90\x6c\xd6\x3d\xcb\x56\x3d\xeb\xa9\xce\x13\x71\x59\x75\xcf\x92\xd8\xac\x7b\x06\xf3\xe6\x07\xf6\x5f\x74\xf5\xbc\xe2\xfa\xbc\x6b\x82\xed\x55\x73\xe6\x0c\x9c\xc2\x9c\x02\x61\xf8\xf0\xa5\xfa\x0f\x55\xc3\x4d\xdd\xe0\x3b\xe6\x14\x79\x87\xd6\x3a\x90\xd1\xa5\xa9\x41\x4e\xf9\x36\x1b\xad\x78\x90\xa2\xaf\x79\x23\xd2\xba\x49\xb6\x26\xdb\x22\xdb\x5e\xdb\x69\x1b\x6b\xb3\xa9\x12\xbe\xdb\x99\xad\x83\x90\xec\x65\x4c\x83\x49\x95\xcf\x13\x43\xca\xdd\x56\x45\x84\x12\xeb\xf3\xbb\xd9\xf5\xc7\x16\xef\x9c\x03\xd7\x4e\x9f\xfe\xca\xe2\x9d\x73\xad\x02\x09\xc1\x1b\x9f\xf5\x3c\x7e\x1b\xe5\x9b\xee\x77\x48\x3a\xb3\x06\xb9\x51\x11\x9a\x98\x52\xac\x5d\x97\x51\x11\x8a\x23\x82\xf2\xda\x33\x9d\x6d\x6e\x7f\x3a\x6f\x8d\x54\xd0\x9e\xf9\x21\x15\xf0\xf8\xd3\x05\x77\x98\x07\x69\x31\x7b\x98\x65\x59\x9f\xc1\x1d\xbe\x3b\x64\x14\xb7\x18\x20\xde\xb3\xff\x7d\x75\x96\x42\xcc\xe7\xbe\x3b\x3a\x1d\x19\x3d\x75\x48\x62\xca\x88\x50\x68\xc4\x94\x44\xf9\xd4\xd1\x03\x6e\xa8\x4e\x0c\xa9\xae\xaa\x4c\x54\xeb\x4f\x24\x27\x0f\x2f\x28\x18\x3e\x29\x99\x9c\x34\xbc\xa0\xa0\x72\xd2\xd0\x8a\x91\x06\x33\x8c\x34\xe5\xa1\x55\x1b\xc2\xc5\x1d\xac\xea\xf7\xfb\x42\x2a\xb7\xad\x3d\x74\x99\x51\xe0\x00\x8f\x31\xed\x24\xcc\x6d\x42\x41\x74\x61\xca\xc7\xb3\x82\xe0\x71\xfc\x1a\x21\x0f\x2b\x08\x9c\x6b\xa3\x1c\x28\x0a\xe0\x00\x87\xe2\x7f\xa3\xd5\x2c\x68\x11\xcd\x0e\xb5\x2a\x9e\xb4\x54\x2e\x19\x22\xa5\xa3\x89\xa9\x2d\x72\x7c\x05\x55\x27\x49\x38\x38\x78\x64\xb1\xb4\xc4\x59\x32\x62\x90\x4f\x1b\x90\x28\xc8\x1f\xaa\x28\x89\xb2\xb5\x6b\xd9\x93\xa5\x17\x95\xe5\x09\x8b\xf6\x71\x8a\x3f\xec\xf7\x87\xdc\x3c\x21\x0b\x09\x3b\xd3\xdc\xe7\xd7\x99\x53\xe4\x31\x2e\x8c\x1c\x28\x88\xca\x53\x7e\xf9\x56\xa7\x53\x83\x5b\x11\x12\xd6\x36\x71\xc0\x71\xde\xb5\x9a\x87\x5f\x25\x23\x14\x4f\xe4\xbd\x9e\x00\x93\xa7\x8c\xc1\x24\xe3\x1d\xe5\x43\x20\x72\x21\x29\xad\x48\x16\x12\x1f\x9b\xfd\x46\x1e\x9b\x53\x3c\x65\x62\x4a\x79\x45\x89\x5d\x58\xee\xd1\xb7\xcd\x2d\x9e\x32\xb1\x5a\x39\x66\xfc\xe6\x65\x4e\xe5\xff\x6c\xc6\xe4\xa0\xa7\x78\xf2\xe4\x09\x05\xc1\x9c\xef\x96\x5c\xd2\xef\xc3\x6f\x65\x56\x22\x07\x92\x9f\x31\x44\xc6\x5d\x04\xc5\x3f\x87\xf8\xe7\xe5\x43\x58\xeb\xa0\x1a\x3b\x17\x85\xae\x51\x83\x2f\xa8\x56\x0b\x4a\xbd\x83\x47\x7d\x37\xb2\xb2\x72\x64\x41\x2c\xdf\x59\x89\x00\x4e\x33\xa7\xf0\x59\x2e\x8c\x44\x14\x4a\x29\x82\x28\x92\xb5\x0c\x63\x23\x77\xcb\x42\x93\x80\x85\x6c\x7d\x0e\xfa\x1e\x0f\x30\x2e\x1c\x8f\xc6\xf1\x11\x38\x5d\x58\x28\xbd\x72\xd5\xa8\x5f\x30\xdf\x2c\x58\x5a\xef\x51\xde\xfc\x19\x42\x88\x40\x8c\xb5\x93\x9d\x5c\x2b\xe2\x91\x82\xfc\x68\x7a\xaa\x8a\xe3\xf1\x3a\xc2\xf1\x5e\x1e\xf3\x84\x27\x6e\x69\x2d\x92\x15\x39\x24\x9f\x91\x3b\x65\x56\x96\x7d\x6b\xdd\xf8\x6e\x8e\x53\x85\x2d\x9e\x49\x8e\x45\x8e\x16\xc7\x0e\xc7\x5e\xc7\x09\xc7\x69\x07\xef\x30\x0f\x44\x95\x31\x93\x0e\xb3\x2c\x49\x55\x9c\x96\x9d\x48\xf6\xd6\x09\x29\xcd\x0d\x6c\xa0\x52\x54\x4b\x94\xbd\xd1\x78\xcb\x94\xf5\x57\x0c\x2f\x6b\xc6\xda\x15\x57\x34\xb3\xeb\x36\xec\xd2\x76\x6f\x5a\x38\x6f\xc8\xb0\x9e\x8a\x5a\x59\xbd\x2b\x27\x1e\x78\xba\x7e\x59\xe6\x5e\xe4\x6f\xc3\x2e\x82\x15\x19\xda\xf5\x31\xad\xb2\x9b\xea\x51\x56\x7d\x82\xff\x2f\xea\x6e\x64\x32\x99\x3b\xe9\xfb\x40\xdb\xb3\x31\x7e\xd3\xbb\xf7\x66\xee\x45\xe1\x94\x03\x64\x02\x21\x5a\x70\x0e\xd9\xa1\xbd\xfb\xde\x56\xbb\x02\xd9\x68\xe4\x6a\x43\xd7\xc8\xcc\xa5\xf9\x80\xed\xd9\x38\xb2\xe9\xdd\xb7\x9d\xf7\xd9\xb5\xad\x76\x33\x1c\x22\xe7\xd9\xdf\xd3\x77\x51\xb6\x67\xe3\x6d\xa6\x77\xbf\x44\xe7\x6b\x3c\x4a\x1f\x7a\x39\xdb\x61\x4f\x3d\x86\xcc\x2f\xcd\xf7\xdd\x65\x7d\x37\xd3\xbb\x7f\x9b\xb9\x17\x69\x4f\x63\x1f\xc1\xed\xdd\x0f\xb6\x6a\x7e\xcb\x2d\x64\xb5\x77\xd3\xf7\xf7\xb4\x67\x31\x8a\xe9\xdd\x43\x69\x7b\xb0\x13\x68\xef\x1e\xda\x2a\x3a\x2c\x90\xc2\x6a\x7f\x0b\x42\xcc\x3a\x83\xfe\xa1\xe5\x56\xfb\x07\xcd\xf6\x05\x46\xfb\xfb\x5a\xf3\x0a\xb1\x9c\xd3\x1e\x7d\x95\x39\x4b\x7e\xe0\x5a\x5d\xd1\x43\xeb\xa9\x3e\x3d\xe3\x18\x42\xae\xa7\x08\x86\xf6\x4c\x43\x6b\xb0\xc8\x8c\xe8\xb0\x6a\x56\xf4\xec\x2f\x67\xec\xaf\xe5\x6f\x5d\x42\x63\x73\x83\xd4\x8e\xfe\x0e\x21\x26\x4e\xdf\xe3\x58\x95\x52\xcc\x77\xb2\xf2\xa4\xa1\x9e\x01\xc4\x00\x63\x18\x1b\x1e\x7f\xda\xf8\x4c\x49\x0e\x25\xcd\xe0\x26\x96\x10\xfa\x0a\x33\x88\xc7\x62\x8d\x4b\xcc\x57\x3a\x02\xc5\x47\x99\x78\xf7\xea\xfd\x6c\xdb\xc3\x3f\x76\xb2\x6d\xa6\x6c\x18\x43\xe7\x65\xd0\xb6\xa3\x77\xcc\x37\x1b\x06\x65\x77\xba\x9d\x01\x86\xbe\x7c\xf8\xff\xcf\xd9\x9b\xc0\x47\x55\x9d\xfd\xe3\xe7\x39\xe7\xee\x73\x67\xee\x32\x7b\x96\x49\x26\x93\x85\x30\x84\x49\xe6\x92\x8d\x40\x32\x02\x26\x93\xa0\x30\x28\x06\x08\x0c\x09\xc8\xee\x82\x88\x0b\xe8\x4b\x01\x17\x10\xa9\x82\xbb\xa0\x55\xa4\xc8\x4b\xad\xaf\xa6\x14\x23\x82\x05\x5c\x5b\x6b\x55\x5a\xcb\xcf\x5a\xb5\x9a\x5a\xab\x56\xb4\xd4\xb7\x2a\x05\xe6\xe6\xff\xb9\xe7\xce\x24\x41\xed\xef\xff\xfe\xde\x8f\x86\x61\xc2\x7c\x92\x73\xcf\x79\xce\xb3\x3f\xdf\x2f\x03\x95\x0c\x04\x18\x10\x19\x78\x9a\x42\x70\x9d\x4c\x14\xbb\xb4\x64\x1b\x85\x1a\xf6\xb3\xc0\xb1\x20\xa9\x8a\x3b\xf9\x09\x03\x1f\xb3\xc0\x32\x1c\x07\xa2\x65\xa1\xa7\x7b\x02\xc9\x19\x22\xb4\x89\x50\x26\x52\x00\x63\x2c\xf6\x60\xc0\x92\xea\x09\x24\x67\x4a\x90\x94\x60\xa4\x04\xa2\x14\x94\xb0\xb4\x0e\x76\xc0\x09\x20\x31\x98\x0a\xcb\x81\xc0\x6c\x0e\x2a\xb9\x46\xae\x9d\x23\x9c\xaa\x79\x92\x85\x1c\x70\x0c\x41\x44\xec\xc6\x3a\x6a\xe9\x6f\x6c\x6c\x31\x68\x07\x4a\x2c\x4b\x83\x15\x8d\x65\x5f\x29\x7a\x33\xc5\x6e\x8e\x0e\x31\x66\x46\xd3\xd1\x32\x6f\xb8\x16\x0c\x9e\xe3\x49\x98\x94\x33\x1b\x4f\xff\x02\x9e\x3f\xd8\x6d\x94\x99\xf8\x89\x33\x63\xd6\xac\xb9\x99\xad\x79\xed\xfd\xcb\x33\x12\x3e\xf1\xc0\xd0\xcc\x3f\xdd\xfb\xd0\x50\xee\x88\xbe\x37\x06\xcf\xa6\x95\xbe\x0f\xd3\x39\x98\xe1\x3c\x8b\x7e\x34\x2f\x91\xb8\xca\x7b\x93\x17\xc7\xbc\x2d\x5e\x7c\xbd\x67\xb3\x07\x17\x7b\xaa\x3d\xd8\xeb\xf1\x7a\xf0\x4c\x27\x38\x67\xf3\xc1\x19\x3a\xe4\x88\x18\xfd\x3d\x0f\x7b\xde\xf0\xe0\x25\x1e\xf0\x78\xa4\xb3\x58\x19\x69\xfa\x98\x96\x66\xd3\xea\x9f\xfa\xd3\x39\x84\xc6\xf4\xf7\xd3\x34\xba\xc3\xde\xf0\xf7\x50\x35\xae\x87\x07\xcc\x85\xff\x9e\xaf\x11\x3f\xf6\x48\xae\xb7\x8d\x3e\x4f\x89\xdd\xbb\x64\x73\xa6\xea\xdc\xa1\xd2\x41\x9e\x2b\x9b\x77\xee\xd0\x33\x88\xcf\x49\x87\x08\x22\x95\x0e\x11\x2a\x45\x08\x88\x20\x8a\xf0\xb4\x04\x92\x25\x1d\x45\x96\x74\x48\x50\x2e\x81\x5f\x02\x4e\x02\x4c\xa5\x43\x84\x8f\x25\x90\x44\x86\xa1\xa5\xf4\x49\x96\x70\xf0\xd0\xc6\x43\x19\x0f\xb6\xbe\x15\x80\x4a\x06\xe5\xcc\x1a\x09\x20\x42\x10\x30\xc4\xd0\x5a\xf4\x06\xfa\x3b\x62\x10\x63\x89\x02\x05\x6a\x2e\x64\x80\x11\x89\x90\xe5\x4e\x4d\x47\x29\x3e\xb1\x2d\x08\xb6\x1c\xfc\x1b\x31\x08\x47\xc0\x8a\x43\x20\x02\x06\xf3\xf8\x2f\xcd\x77\x5b\x42\x55\x51\xf3\xed\x17\xe1\xe3\x83\x64\xfb\x2f\x6f\xfb\xd5\x86\x33\x3d\x6c\xdf\xc0\x40\x8e\xe7\x54\xe7\x0e\x95\x0f\xf5\x3e\xd0\xf7\x15\xf4\xbc\x97\x67\x79\x50\x09\x9d\xc8\x6a\x4b\x54\xc6\xd8\x16\x16\x17\x33\xd5\x0c\x66\x58\x86\x95\x00\x44\x27\x05\xac\x95\xf8\xee\x25\x94\xae\xde\xd1\x2d\xe9\xa4\x7b\x18\x95\x75\xbf\x65\xea\x57\xa8\xaf\xc7\x63\x59\xdc\xb7\x9a\x6a\xeb\x04\xad\x2f\xf0\x86\x6b\x29\x69\xfd\x34\x7c\x32\x23\x90\x95\x67\xdc\x39\x20\x8d\x5d\xbb\x86\x61\x01\xb0\xaf\xe9\x9c\xa5\xe7\x86\xf1\x04\xf3\xa8\x2c\xe1\x85\x2e\x24\x32\x5d\xb9\x2e\x04\xd2\x3d\xc8\x31\x3b\x44\x78\x90\x65\x03\x0e\xdb\x4c\xc0\xe4\x30\xab\x9f\xfa\x82\xea\x82\x81\x81\xdc\x0c\xb7\xce\x1d\xaa\xa4\x3f\xfb\x46\x84\x98\x24\x9d\xe9\x5e\x97\x98\x51\x2f\xbe\x25\x7e\x2c\x7e\x23\x32\xe5\x22\xf0\xa2\x5f\xc4\xf5\xfc\x5b\xfc\xc7\xfc\x37\x3c\x53\xce\x03\xcf\xfb\x79\xdc\x80\xff\x80\x3f\xc1\x27\x31\x13\xc4\x95\x18\x0b\x18\x04\x8c\x11\x47\xc1\x93\x25\x27\x4f\x88\x88\x28\x47\x16\xe1\xbb\x19\x01\x63\x86\x80\x68\xd7\xb5\x1b\x5b\xac\x23\x53\xfb\x1b\x29\x80\xa0\xa1\x19\x59\xcc\x5b\x63\x18\x89\x9d\x51\x2b\x42\x6d\xd8\x1b\x16\x21\xec\xbd\x11\x1e\x32\x2f\x27\x6b\x32\x33\xe1\x66\x73\x31\x3e\x79\x3f\x5e\x84\xcb\xee\xda\x95\xf9\x22\x93\xdb\xa3\xa1\x3b\x5b\x35\x94\x8f\xa6\xef\xe3\xf4\x0c\xf3\x07\x8e\x33\xfb\x28\xb7\x77\x08\x55\xa0\x7d\x89\x59\x9c\xdb\xe7\x2e\x77\x13\x51\x09\x2a\x95\x0a\xc9\xc2\x68\x73\x8c\x8f\x29\x67\x88\x0f\x3b\xba\x2a\xbc\x3f\x91\x61\xbb\x0c\x9b\x65\x20\x57\xca\xc0\x26\xe4\x94\xdc\x23\x93\x31\x32\x70\xb2\xac\xe5\x09\xb2\x96\xcc\xeb\x52\xb8\x18\xd7\xc2\x2d\xe7\xb6\x70\x87\x29\x49\xb5\xc0\x55\x46\xac\x0b\x51\x2a\x6b\xc9\x48\x97\x56\xe1\xeb\x71\xa6\xa4\x0f\xa4\x13\x12\x91\x24\x87\x3b\x54\xd4\x83\x7b\xbc\x57\x78\xd7\x79\x89\xd7\x8b\x18\xd4\x12\xa7\xf3\xc2\x2d\x46\x16\x55\xb7\x3f\xaa\xfe\x29\xdd\x1f\xd5\x1b\x63\xdd\xe9\xb3\xb9\x95\x91\x4d\xe8\xe7\x35\xe2\xba\xd7\x83\xa3\xe0\x8d\xd4\x46\x4a\x70\xed\x18\xbd\x09\xdc\x59\xf2\x4e\x1a\xea\xf8\x9a\x00\x7b\x76\xc7\x8e\x7d\x9d\xf9\x4b\x70\x77\xe0\xaf\xa7\xbf\x3a\x16\xdb\xcd\x3f\xf0\xf8\x43\x5b\xc2\xbb\x8b\xb7\x3c\xf4\xf8\x03\x1c\xfb\xea\x3e\xf3\xd5\xe3\xc7\xcd\x17\xfa\xfb\xa1\xf9\xb3\xcf\xa0\xee\xcc\x85\xc7\x0e\x3e\xfe\xdb\xdf\x3e\x7e\x30\xdb\xab\x97\xe5\xf7\xd3\xb9\x43\x36\xaf\x51\x63\x96\xef\x2f\x1f\x5d\x9d\x98\xe2\x65\xbb\xf4\x9f\x70\xc0\xf9\xf4\xf6\xcd\x1c\x90\x2b\x39\x60\x53\x5c\x0f\x87\xc7\x70\x93\xac\xb0\x88\x73\x04\xbb\x14\x0a\x33\xbe\x1c\x6d\x41\x2c\x2a\x74\x75\x6d\x75\xec\x70\x1c\x71\x1c\x75\x30\x0e\xef\xb5\xfa\x46\x1d\xeb\x3d\x0c\xcf\xb3\x79\x6e\x99\xb0\xb4\x47\xd5\xa0\x19\xdf\xf4\x20\xe3\x84\x36\xf8\xec\xd1\x2c\xea\xab\xca\x45\x41\x8b\x68\x91\x92\xf2\x20\x18\x9a\xf5\x84\x9a\xa1\xd9\x18\x69\xcc\xbd\x9f\x7c\xa8\xed\x56\xff\xfa\xd1\xe3\xb7\xde\xa3\xee\xd6\xee\xd9\xf4\x5f\xe4\x2d\xb3\xff\x94\x39\x01\x0e\x9d\x86\x3c\xf8\xd0\x0c\x7f\x7c\x37\xe9\x3a\xb3\x7b\xeb\xc7\xf0\xa1\xf5\x2c\x1d\xb6\x3d\x47\x41\x74\xed\x33\xc8\x35\xf0\x49\x62\x8a\xe4\x49\xba\x8e\xe8\x47\x75\x3c\x55\xef\xd6\xd7\xea\x5b\xf4\xc3\x3a\x2b\xea\x41\x1d\xeb\x4c\x40\xf2\x24\x99\x04\x4a\x21\x4c\x90\xdb\x0a\x39\xb9\x99\x1e\xf0\xcc\x56\xe4\xfc\x19\x01\x08\xcc\x26\x56\x74\x8a\x39\x5f\xb7\xc8\x20\x97\x4e\x48\xb7\x66\x99\x2a\xa3\xdf\x9f\xc5\xff\xb3\x11\x62\xd3\x76\x4d\x30\xfa\x72\xda\x66\xe3\xb3\xec\x52\xb8\x3c\xc7\x3e\xc2\x86\xbd\xe1\xda\xd2\x2c\x01\x49\xa1\x59\x05\x92\x09\x81\x53\xa7\x20\x38\x80\x40\x36\xa3\xc0\x98\xbd\xe6\xcf\xee\xba\x6b\xd7\x67\xf0\x18\x34\xc0\x1c\x73\x97\xf9\x2b\xf3\xc2\x4f\x76\xdd\xf5\x31\x1c\x84\x7f\x9a\xb2\x79\xee\xff\x06\xeb\xe5\x7f\x59\x4f\x59\x3d\x70\x9c\xd9\x4e\xfb\x61\xd7\x53\xdf\x66\x86\x4a\xfb\x18\x46\xd3\x19\xd9\xe3\xfb\xca\x47\xfa\xce\xce\x67\xbd\x32\x70\x9c\x11\xe8\xe7\x6f\xb6\x3f\xdf\x63\xe7\xa8\x46\x68\xe5\x90\x2e\x2e\x75\x05\x86\xd7\xfb\x4c\x8f\x5d\x27\x3b\xbc\xd1\xfe\xac\x9d\xfb\x82\xa0\x56\x0e\x53\x35\xef\xf0\xbe\x37\x78\x9c\xfa\x58\xe1\x41\x1f\x6b\xc6\x37\x43\x75\xc7\x91\xb2\xec\x70\x7c\xab\x8e\xd8\x44\xfd\xb1\x7b\x6c\x7f\x2c\x83\x50\xf0\x29\x82\x81\xba\x64\x5f\xed\x0b\x97\x21\x39\xeb\x92\xd5\xe6\x66\xb0\xe9\x73\xd2\xfe\x97\x32\x34\x3e\x51\xa2\xa2\x82\x36\xc7\x5a\x7e\x0b\x8f\xf9\x8a\x70\x12\xf9\xc0\xa7\x8a\x91\x94\xc3\xe5\x72\xfb\x50\x51\x2a\xa8\x92\x2c\x69\x8a\x8d\x08\x40\xa5\xf8\xdd\xb4\x3d\x90\x00\x46\x5d\xbd\xc1\x05\xc1\x93\x9b\xfb\xff\x7e\x02\x95\xb9\x72\xa8\x7c\x8b\x31\xbd\xb0\x68\x4c\xcb\xc3\x23\xe4\x4b\x5f\x7b\xe1\xfd\xbf\xbe\xfe\xbb\x8b\x36\xdc\x65\x9e\x02\xe1\xee\xb5\xa4\x6f\x71\xd5\x6e\xf3\xef\x66\x7a\xb9\x74\x73\xde\x7f\xfe\x27\x54\x82\x0b\x34\x18\x99\xe9\x53\x6c\x32\x95\xfd\xb9\x39\xce\x14\x57\x84\xdc\xa8\x1c\x4d\x4b\x8c\x1e\x59\x04\x48\x53\x0a\xa1\xb0\x50\x0c\x27\x35\x2d\xd0\x46\x46\x78\xc4\x36\x24\xf5\x4a\x58\x42\x05\xa9\xc2\x42\xce\x25\xe6\xfb\x52\x1e\xce\x57\x9a\x72\x81\x4d\x6f\xdf\xa2\xe9\x8d\xb1\xfe\x1c\x57\x90\x15\x09\xda\x08\x62\x35\xd5\x69\xf0\x32\x76\xd9\x25\x5b\xfe\xf1\x79\x3d\x1c\xd8\x45\x00\x8a\xbb\x58\x67\x3f\x0c\x7e\x13\xd6\x7c\xf5\x87\x03\x57\xf7\x7d\x71\xf4\xe5\xe3\x8f\x64\x3e\xde\xb8\x1d\xca\x0e\x3d\x3c\xb7\xf5\xf6\x47\x36\x5c\x69\x9e\x24\xe3\xb9\x6a\xf3\xbe\xd7\x3e\x6a\xc9\x7c\xca\x8d\xf9\xf3\x57\xbf\x7b\xfa\x96\xbe\xcc\xea\x14\x44\xef\x7c\xf4\xfe\x7b\x7f\x70\xcd\x4d\x66\xdf\x70\x6e\x03\x05\x5d\x92\x28\xc3\x49\xc2\x22\x32\x49\x9a\x2e\x5d\x25\xdd\x24\xed\x93\x58\x49\xe2\x5c\x82\x28\x27\x5d\x56\x78\x56\xad\x10\x45\xd1\x28\xb9\xa8\x2a\xca\x49\xde\x52\xc3\x98\xe3\x54\x17\xa7\x48\x36\xb2\xa8\x9c\x94\x10\xeb\xc5\xf9\x54\xcb\x44\x5b\x28\x7a\xf3\x30\xd6\x8f\x60\x2c\xdd\x68\x18\x6a\x7f\x4d\x75\x19\xd6\x22\x63\xdc\x30\x48\x43\x81\x3f\xbc\xfc\xf0\x42\xb3\xfe\xc8\x97\x6d\xa5\x5c\x5e\xf2\xa3\x5f\xb4\x98\x9f\x98\x9f\xbf\x01\x95\x4c\x73\xa6\xf7\x89\x3b\x97\x1c\xc6\x4b\x87\x66\xf5\x8b\x50\x10\x95\xa0\xa9\x89\x9a\x68\x96\x61\xd7\xd9\x8a\xf2\x30\x0e\x84\x93\xfc\xdf\xf5\x01\x1d\xeb\xa5\x05\x49\x14\xf8\x20\x70\x22\x40\x02\x2a\xca\x23\x6c\x51\xca\xeb\x93\x52\x39\x68\xe9\xec\xb8\x33\x1d\x97\xb3\x54\x5f\x63\x63\xbf\x65\xff\xe0\x2c\xd4\x62\x8f\xcf\xcf\x68\x1e\x14\x29\x29\xad\x55\xcb\x18\xcd\xae\xbf\xe0\x2a\xb3\x6f\xc7\x2f\x9f\x6f\xff\xc9\xc3\x1d\x9d\xd3\x1f\x87\xa5\x66\xa6\xff\x98\x79\x0a\x97\x99\x0f\xde\x7f\x03\x54\x90\xc7\xee\x78\xf5\xe6\xbb\x2f\xbb\x63\x59\x7b\xa2\x65\xf1\x82\xd7\xcd\x5f\x7d\x6d\x9e\xf8\xe6\x4d\xb8\x6a\xd4\x02\xf3\xc8\xc6\x3d\x30\xf7\x9f\x76\xad\x8e\xde\x51\xca\x8b\x33\x2d\x11\xd3\xdc\x08\xb9\x02\x6b\xc5\x2d\x22\x16\xc3\x85\x6d\x6e\x37\xd3\x86\x5c\xe0\xd2\x70\xea\x70\x11\xac\x2e\xda\x54\x84\x8b\x8a\xb8\xfc\x54\xd0\xa7\x72\x29\xc1\xe1\x1b\x2a\xd8\x65\x41\x3a\x2d\x99\xc9\x1a\x71\x0a\xd0\xe9\x8d\x14\x7b\x3d\x59\x7a\xbd\xf2\x5a\x4a\x15\x30\x0c\x1a\x3b\x4c\x92\x3b\xcc\x37\x21\xff\xc5\xc7\x36\xfc\xf7\x9b\x7f\xff\xfc\xd7\x1f\xfc\xe2\x0f\xff\xd9\xf2\xc8\x03\xff\x0d\x1e\xbc\x71\xdb\x33\xfb\x3a\x77\x4c\xde\x73\xdf\x73\x93\x1d\x13\x9e\xde\xf8\xe0\x79\x77\x25\xb7\xef\xa6\xeb\xdd\x69\x2e\xa7\x3d\xc2\x05\x68\x53\x62\x86\xe4\xc9\xf3\x8c\xf4\x90\x2c\x4f\x8a\x23\x98\x1f\x8c\x06\x49\x10\x63\x55\x15\x5d\x49\xb5\xd5\xb5\xd5\x01\x8e\x50\x01\x9b\x44\xbe\x1d\x3e\xec\xdb\xe6\x86\xeb\xdd\x9b\xdd\xf8\x32\x37\xb4\xbb\xa1\xc9\x0d\x55\x6e\x58\x2d\x6c\x12\xf0\x25\x02\xb4\x0b\xd0\x24\x40\x95\x00\x6e\x01\x39\xf7\x03\xb7\x0f\x17\xa4\x28\xc4\x6d\xbc\x85\x92\x9d\x0c\x31\xea\x5a\x4f\x49\xcf\x2a\x6a\xc4\x8c\x34\x35\xcb\xee\xb0\x57\x00\x2d\x07\xf5\x1d\xa9\xcb\xa2\xc1\xa8\xa8\x8c\x8b\x84\xdf\x27\xad\xe6\x55\xe6\x4b\xbb\x3f\xfa\xe9\x7d\xab\x1f\x5b\xbd\xf8\xf9\x8f\x7e\x0b\x13\x60\xd5\x5b\x9b\xcc\x0f\x39\xcf\x6d\xe6\x07\xe6\x35\x03\x68\xdb\xfa\x8a\xd0\xc2\xe5\xf7\xec\xde\x39\xbf\xf1\x9c\xc2\xc8\xfb\xaf\x00\xc0\x81\x6f\x64\xfb\x7c\x72\xfd\x9d\x2a\xaa\x49\x14\xa2\xb6\xad\xea\x0e\x15\xab\xba\x83\x6b\x43\x7c\x2f\x8f\x07\x69\xb4\xbc\x88\x12\x4b\xe5\xa8\x29\x07\xd9\xa6\xff\x0d\x8d\xd6\xa2\xbf\xc1\xcd\xa6\x87\x79\x72\x38\x91\xd6\xe9\x36\xcb\x47\xba\x6b\xe0\x38\xd3\xc8\xbe\x80\x24\xa4\xa1\x00\x9a\x9a\x88\xcb\x4d\x3a\x70\x23\x74\xd0\x93\x62\x9e\xa3\xc2\x5d\xef\xc6\xee\x36\x44\x80\xb8\xa7\xfe\xda\xf1\x37\x07\xbe\xdf\x01\x31\xc7\x80\x03\x3b\x1c\x3e\x25\xc5\x31\xbe\x1c\xd3\x56\x96\x1a\x83\x86\x32\x96\x36\x49\x77\xa7\xe3\x35\xd5\x6c\x56\xf9\xe9\x9a\x0a\x61\x09\x22\x25\x1c\x84\xf3\xc0\x88\xeb\x78\xc1\x47\xc7\xff\xf2\xf9\xc7\x5f\x64\xdc\xd8\xe0\x6f\xde\xb2\xf9\x66\x1c\xcd\xbc\xc6\xdd\x74\xfb\xed\x1b\x3d\xb0\x16\x2e\x87\xff\x80\xcb\xcd\x1b\xcd\xbb\x32\x6e\xd2\x04\x0c\xa0\x53\xe6\x65\xe6\xdf\xcc\xd3\x60\xe7\x96\xa8\x3d\xa0\xbc\x2f\xe5\x09\x0f\xb4\x21\x09\x24\x49\x5e\xce\x02\xeb\x64\x49\x4a\xf0\x21\xaa\x9f\x8d\xe1\xb5\x6c\x2d\xab\x90\x8b\x83\x80\xe7\x3f\x77\xc5\xc2\xf4\x4d\xe6\x3d\x4c\xc7\x99\x53\x2f\x78\x6f\x2d\x86\x99\x84\xcb\xce\x67\xd8\xf3\x16\x3a\x77\xe8\x04\x3d\x8b\xf1\x03\xc7\x99\x1d\x5c\x18\x15\xa1\x8b\x12\x86\x13\xf2\x03\xae\x7c\x17\xd2\x3d\x7a\xa9\x8e\x39\x1d\xf4\x70\x11\x8f\x8a\x9d\x6a\xd2\x72\x7e\x30\x2a\xf2\x26\xf3\x21\x1f\x9c\x44\x52\x53\xba\xd7\xc7\xa6\xa4\xac\x9a\xd5\xfc\x8d\xe9\x16\xa0\xe3\x15\x39\xa0\x3d\xcd\xe6\xcc\x31\xa0\x62\x34\x44\x4a\xf8\x5a\x4b\xc3\xfa\x21\x47\x67\x51\x5e\x41\xca\x2b\x22\x1c\x0f\xe3\xe1\x64\x6d\x49\x67\x7b\x43\xf5\x39\xcd\xb7\xdf\xde\x0a\xad\x65\xe7\x14\x16\xc5\xcf\xb9\x60\x46\xc1\xc6\x73\x83\x5c\xe9\x85\xe6\x3f\x99\xa6\x1d\x4b\x92\xf2\x1d\xda\xc6\x37\xcf\x54\x5a\xc6\x22\x35\x03\x76\xfe\x9f\xeb\x6e\x7d\x3a\xf3\xec\x30\x59\xea\x40\x5e\x34\x36\x11\x91\xd8\xb6\xad\xc2\x0e\x01\x0b\x7e\x0a\x50\xdb\xeb\xc6\x6e\x3d\x1f\xb1\x92\xc2\x7c\x0b\x9d\xd6\x6f\x33\x7b\xfe\xff\x80\xd3\x76\x7e\xb1\xe3\x2e\x4b\xb2\xe6\xfd\xe6\xbf\x26\x67\xc1\x69\x0f\xbc\x79\x36\x38\xad\xbd\x87\x08\x31\x1d\x4c\x07\x72\xa2\xab\x12\xad\x4e\x55\x52\x93\x82\x13\x6a\xe5\x73\xe5\x8b\x64\x52\x2a\x83\x57\x86\xec\x60\x8b\xf3\x1e\xf9\x51\x19\x6f\x90\xe1\x62\x79\xa5\x8c\x59\x19\x64\x0f\x33\x89\xb9\x8a\x21\x0c\x83\x84\x36\x51\xe1\x01\x00\x25\x24\x35\x89\xf6\x0f\x9c\xe8\x43\x8c\xd3\x9b\xa3\xaf\x81\x58\x43\x34\x6e\xc5\xcf\x7a\xe3\xf8\x6c\x92\x20\x17\x52\x44\xdd\x86\x5b\xf7\x1b\x75\xba\x66\xa8\x98\x8f\x8c\xff\xc5\xfb\x97\x3b\xb8\x1f\x3d\xf4\xf4\x2b\xfd\x07\x99\x8e\x4c\x9f\xf9\xfe\xb9\xbb\x60\x3b\x5c\x69\xde\x65\xfa\xfe\x3b\xcb\xc3\x9a\xd5\x37\xa3\xd0\x7d\x89\xee\xca\xd6\x92\xbc\x22\xf4\x70\x29\x74\x17\xc0\xc3\x08\x0a\x50\x69\x29\x2a\x20\x3e\xad\x75\xab\x0c\xf2\x68\x96\xfa\x06\xd7\x7b\xe0\x32\x0f\xb4\x7b\xa0\xc9\x03\x55\x1e\x10\x3c\x01\x0f\xf6\x08\xde\x40\x72\xb5\x08\x97\x88\xd0\x2e\x42\x93\x08\x55\x22\x78\x44\x57\x24\x0f\x4f\x8d\x8d\x82\x51\xa3\x5c\x65\x25\xa9\x08\x72\xed\x07\x8e\x7a\x12\x54\x4a\x29\xa5\x40\x7a\x28\x94\x4d\xe7\xdc\xe3\x41\x10\x2a\xbd\xb1\x91\x62\xdf\x7b\xa9\x85\x08\xc1\x70\xf5\x53\xaa\x8d\xa9\xb3\xd5\x6d\x3d\x17\xb5\x22\xa8\x48\x09\xe3\xf5\xf8\x0c\xf2\xf6\x2b\x6f\xbc\x7d\xde\xe6\x9f\xef\xb4\x94\xd1\xc5\xcf\x9a\x1d\xf7\xdd\xf4\xd6\xbd\xcf\xf4\x2e\x69\xc6\x67\xce\x7d\xdb\x7c\xfb\xe9\x17\xc9\xb5\x9b\x7e\x7c\xcf\xec\xa5\x0d\xc5\x85\x0b\x2c\x8d\xb4\xa0\xf6\x9c\xc2\x49\xd0\xb5\xe1\xcd\x91\x72\xd3\xbb\x57\xde\x6b\xc8\xdb\xb6\xed\xd8\xbc\x62\xc9\xb0\x1e\x68\x66\xae\xce\x1d\x4a\xd2\xbd\x72\x0d\x1c\x67\x0e\x31\x1d\xc8\x83\x56\x27\x6a\x27\x3b\x66\x3b\x2e\x71\x90\xb1\x0e\x18\xe1\x00\x87\x03\x1c\x42\x9b\x38\x5d\x81\x73\x15\xa8\x53\xa0\x42\x01\x46\xf1\x28\x58\x41\x88\x6d\xd3\x90\x98\x10\x53\x62\x8f\xc8\x68\xfb\x07\x8e\x24\xfc\xba\x2f\x29\x6a\xa2\xe6\xf5\xc9\x2a\x2f\xa5\x9c\x8a\xe8\x75\x0f\x76\xdc\xb5\xf4\xc7\xe3\x8d\x9a\x0e\x56\x00\x1d\x4d\x53\xd4\xf4\x6c\x99\xca\xb0\xf3\x24\x65\xd6\x8d\x09\x82\x3d\xfb\x59\x1f\xf6\x46\xac\xab\xce\xec\x18\x73\xd1\x9f\xcd\xcb\xfa\xfe\x74\x2b\x53\xfe\xbb\xae\xd1\xf7\x6e\xcd\x03\x0e\x1f\x3a\x93\x22\xbd\x1d\xa9\xed\x99\x29\x6b\xb2\xfe\x53\x13\xd5\xb3\xf9\xa8\x36\x51\xe4\x4b\xca\x09\x6f\x20\x29\x17\x6a\x94\xcb\xaf\x97\xc5\xac\x86\xdc\x29\xc5\x17\x4c\x89\x2a\x25\xf1\xeb\x6f\xc9\x3a\x7b\xf1\xb8\xfa\xa7\xe8\x10\x85\x5f\x56\xbd\x61\xeb\x6a\x0c\x3a\x46\x30\x9d\xe3\xfa\x32\x7f\x7c\xfd\xe4\x37\x6f\xed\x59\x71\xc5\x4f\xb7\xae\xbb\x61\xab\xf9\x71\xeb\x13\xf3\xcc\xf7\x18\x37\x65\x17\x7c\xcd\x3c\x63\x7e\x69\xbe\x79\x7a\xc1\x9b\xbf\xfd\xed\x1b\xe6\x55\x43\xb2\x57\x49\xb9\x94\x17\x27\x26\xc8\xa4\x15\xb6\xfa\xc0\x17\xd4\x92\x48\x00\x61\x1b\x07\xd7\x73\x9b\x39\x7c\x19\x07\xed\x1c\x34\x71\x30\x8a\x03\x81\x0b\x70\x78\xb5\x67\x93\x07\x5f\x92\x93\xc0\x51\x1e\xe0\x3c\x48\x99\xe6\x94\x54\x64\x8b\x17\x25\xb5\x4b\x7f\xcb\xa2\x51\x83\x46\x6b\xb6\x59\xe9\x51\xc3\x71\x9b\x72\xc6\xf2\x3c\xbc\x1e\xf2\xf8\xee\xd5\x37\xfd\xd8\x9c\x8e\xeb\x77\x3d\xd4\xfc\xd0\x95\xe6\x1d\x0f\x1c\x81\x45\xe6\xf2\x1f\x5f\x3c\xae\xa9\xa0\x0d\x9e\xc2\x5d\x4d\x0f\x35\x9a\xc9\x83\x1b\x22\x13\x0e\xdc\x66\xfb\xd0\xeb\x69\x0f\x79\x07\x92\x51\x00\xc5\x13\x21\xec\x4f\x82\xcd\x37\x4b\x98\x3c\x2d\x89\xa4\x13\x12\x96\xb0\x2b\x25\x2b\x9e\x14\x6f\x5b\x8c\x41\xd0\x80\x7e\xea\x3a\x84\x7d\x5e\xcb\xe1\xc1\x9a\x1a\xf6\x0f\xd6\x70\x6a\x55\xe6\x5e\xf3\xab\xbd\xe6\xc0\x07\xef\x99\x38\xda\xd4\xf4\xcb\x3d\xdb\x6e\xdf\x7c\x27\xd3\xb1\xfd\x85\xaf\x3e\x33\xdf\x87\x22\x00\xdc\xbc\xfd\x85\xfe\x67\x8e\x1e\x7e\x02\x9c\x74\x0f\x97\x0d\x7c\xc4\x34\x32\x1d\x48\x45\x17\x26\x0a\x25\x57\x9e\x0b\xbb\x48\x5b\x46\x06\x39\xe1\xf1\x27\xc7\xcb\x10\xa3\xf9\x68\x59\xd6\x60\xff\xc0\x27\x09\x8f\xa8\x27\xa1\x9b\x07\x5e\x57\xb0\x33\xa5\x2a\x3c\x9b\x92\x6c\x9a\xe5\xfe\x78\x23\x6d\xf1\xcc\xa2\x92\x47\xd3\xfd\x96\xf1\x07\x9b\x48\xaf\x3e\x47\xae\x57\xcf\x34\x9a\x65\xbf\xbd\x64\xfa\xf4\x5b\xcc\x7b\xcd\xe7\x37\x30\x1d\xdb\x33\x3b\xdf\xf2\x6c\x8c\xc0\x4c\xbc\xb2\x23\x95\xe3\xd2\x6b\xa2\x5c\x7a\xc6\xcf\xa5\x56\x51\xdc\x3f\x70\x34\xe1\x57\x03\x49\x91\x6f\x93\xdd\xb8\x0d\x69\xbd\x1a\xd6\x98\x94\xe2\x13\xb3\xec\xba\xd9\x0c\x8e\x11\x55\x3f\xaa\xa9\x76\x1b\x59\x14\xa6\x0a\xc3\xe7\xa5\x49\xc0\x1d\x7d\xa0\xdf\xbb\xb1\xa5\xaf\xe5\xaf\xff\x6d\x36\x33\x1d\x99\xbd\xe6\xcd\x9f\x7c\xf3\x79\xe6\xab\x8c\xf9\xbc\xf9\x3b\xcc\xd1\xb3\xe8\x30\x3d\xcc\x8d\xcc\x5c\xe4\x45\x05\x68\x4e\x62\xac\xaf\xd3\xbb\xc8\x8b\xdb\xbc\xe0\x6d\x77\x70\x08\x91\x40\xab\xa2\x81\x16\x12\xdb\x53\x64\x2b\xd9\x41\xd1\x1f\xd9\x18\x69\x21\x98\x70\x79\x29\x17\xcb\xba\x54\x9f\x23\xe5\x01\x1f\x75\x31\xec\x5c\x85\x6a\x93\x41\xe5\xc2\x75\xc3\xe8\xa7\x74\xa2\xa0\x95\x6a\x6a\xbd\xdf\x05\x5e\x95\xb5\x16\xaa\x7b\x55\xcc\x07\xa1\x54\x53\x23\x25\x5e\x2c\x9b\xcd\x6f\xac\x9a\x37\x09\x8a\x21\xb8\xeb\xc0\xa9\xf7\xa1\xa6\x77\xbd\xe9\x81\x3f\x06\x71\x01\x8c\xfd\xaa\x6b\xfd\xeb\x1b\xcc\xf5\x61\x3c\x17\xd6\x98\x6f\x9f\x31\x4f\x9a\xaf\xb8\xcc\x72\xbc\xbc\x10\xb6\xc1\xed\x7f\x41\x80\xa2\xa6\x87\xb9\x8d\x99\x82\x42\xe8\xaf\x89\x39\x24\xc4\xa8\x1e\x45\xc3\x1a\x0a\x31\x6e\x8f\xa2\x83\xae\xba\x3d\x8a\x87\xa0\x10\x13\xe2\x42\xbe\x50\x79\x88\xb4\x7b\x66\x79\x5e\xf1\x10\xaf\x06\x9c\x56\xae\xbd\xac\xe5\x92\x3c\xad\x4c\x27\xf3\x32\x43\xf2\x00\x44\xa8\x84\x57\x80\x78\x42\x8c\x12\x52\x82\xa2\x5b\x45\x84\xd1\x01\xef\x1f\x38\xf2\x94\x53\x4d\x62\x4c\xb9\xd3\xa2\x94\x3b\xad\x58\xd3\x75\x14\x84\x60\xb0\xc8\xa3\xc8\xbe\x54\x88\x11\x03\xf9\x0a\x72\x13\x95\x01\x4d\xcf\x17\xf9\x94\x9c\x8f\x6d\xda\xb7\x7e\x9b\xf9\x8d\xce\x52\xe6\x80\xc8\xd3\x36\xc3\x7c\xd4\xfa\x5f\xf7\x37\xe6\x0c\xfe\x60\x85\x3d\x37\x69\xa6\x6e\x14\x5e\x14\xb2\x7f\xd6\x54\x8b\x60\x80\x7b\x10\x30\xae\xbc\x82\x40\x04\x48\xf9\xa0\x77\x80\xd7\x40\xfd\x5e\xb3\xfb\xc0\xe8\x54\x62\x54\xe9\x84\x31\x8b\x36\xb6\xdd\x65\x3e\xf4\x02\xbc\xb3\x6f\xd2\xf4\xc2\x92\xda\xf3\xa6\x5d\x5e\x0f\xa7\x70\xea\xcc\x49\xd3\xb8\x72\x96\xb0\xd9\xdd\xf5\x33\x58\x9d\xf9\x0f\xd2\x0c\x87\xf6\x48\x5b\xb4\xcb\x36\xd3\xbb\x91\xb2\xe4\x82\xd3\x91\x0f\x2d\x4d\xf8\xa0\xd3\xb1\xc8\x81\xdb\x1c\xe0\x68\xf7\xca\xb2\x4a\x5a\x05\xae\x95\x65\x2d\xf1\x8c\xaa\x81\x24\xab\x08\x20\x04\xdc\xad\x09\x35\x45\x51\xa6\x8e\xa8\x47\x55\x2e\xa6\xb6\xa8\x58\xe5\x34\x05\xbc\x29\xc9\xe9\x73\xd8\x7c\x3d\xb6\x88\xd8\xe2\x61\x5d\x18\xf5\x23\xca\x0d\x3d\x4c\x44\xc6\x10\x43\xb7\x24\x24\xa2\x95\x63\x3a\x83\xcc\x6a\xf8\x31\xa8\x6a\x79\xbc\xc5\xac\x78\xe8\xd3\x37\x1f\x07\x95\xd3\x4f\xad\x2c\x80\xfb\x4f\x81\xdf\x3c\xfe\x4d\xe6\x95\x3c\xb3\x1c\xfe\x28\x80\x0b\x2a\x70\x51\xe6\xef\x66\x97\xca\x6e\xb1\xd6\xdf\x35\x70\x9c\xb9\x9a\xe9\x40\x45\xe8\xb1\x84\xda\xe9\xfe\xab\xfb\x6b\x37\x69\x73\x43\x9d\x1b\xdc\xba\x6e\x45\x80\x17\x2b\x7a\x72\x86\x0e\x75\x7a\xab\x8e\x75\x6f\x70\xe8\x09\x05\x21\xa4\xb6\x2b\xde\x16\x2f\xf6\x86\x67\xa1\x4f\xd1\xbf\x10\x49\x22\x68\x44\x80\x00\x54\x45\x4f\xce\x04\x68\x84\x76\xc0\x40\xda\xab\x43\x89\x50\x2a\xb4\x35\xb4\x23\x74\x24\x74\x34\xc4\xc7\x42\x10\x12\x45\x14\x74\xb1\x29\x7f\x81\x4f\xcf\x31\xe6\xd1\xd1\x2e\xfa\xcc\x46\x3a\x1d\xa5\x87\x9b\xbd\x1b\xfd\xe9\x74\xa3\x36\xf8\x4d\xeb\x0a\xe3\x41\x2e\x4c\x4b\xa7\x69\x2a\x31\x74\x4d\x0d\xd3\xdc\x40\xb1\xa6\xbe\xf0\xe8\x92\xcd\x13\x27\xff\x68\x6a\xcb\xe6\xa5\xbb\x97\x9a\xef\x3f\x15\x77\xc4\x9f\x32\xdf\x67\x3a\xcc\x53\xe6\x51\x73\xf9\xed\x3f\x80\xb8\xf9\xfa\x0d\xb7\xc2\x1d\x10\x07\xc6\x34\xcd\xdf\x64\xfe\xb0\x77\x2f\x1e\x01\xa3\x07\x06\x80\x58\x7e\x30\xfb\x76\x2e\x2f\x72\xa8\xe7\x99\x6c\xaf\xb1\xaa\x95\x63\xf0\xeb\xbe\x6f\x61\xe5\x51\x5d\x44\x3f\x7f\xcf\x59\xf8\x74\x3e\xbb\x07\xfa\xe4\xbe\x40\x41\x36\x39\xf2\xef\xe7\x9e\x66\x24\xed\xb9\xaa\x02\xad\x1c\x27\x3d\x81\xb3\xe6\xaa\xec\xdc\x4b\x78\x30\xf7\x32\xa3\x62\x08\x29\xa8\x48\xf7\xd9\x3f\x3b\xfb\x59\x7a\x96\xf4\xb3\xdb\xec\xcf\x1a\x43\xb9\xa2\x9a\xe2\xd2\x90\x77\x18\x66\x95\x34\x70\x9c\xd9\xcb\x45\x91\x8c\xa6\xa2\x74\xa2\x5e\x68\x9d\x38\x31\x0f\x35\xb5\x9d\x6f\x07\x47\xea\x34\x65\xda\x93\xd3\xb0\xd1\xba\x35\x0f\xf2\x9a\xa7\x4e\x9d\x82\xa6\x94\x4c\xa9\x44\x95\x6a\x25\x9e\x52\x39\xa5\xb2\x81\x9d\x92\x84\x86\x29\xde\x5c\x98\x92\x2b\xd8\x66\x51\xf1\x68\x5b\x0f\x65\xba\x8e\x59\xbe\xd5\x68\x62\x3b\x57\x98\xb5\x9c\x2b\xbb\xcd\x93\x76\x17\xd8\xf4\x21\x7c\x45\x33\x18\xf1\x10\xf6\x7a\x5c\xd8\x4b\x7b\x0c\x75\xcd\x0a\xfe\x48\xae\x01\xc1\x6f\x78\xc9\x32\x67\xe3\xf9\xb3\xab\xcf\xeb\x1c\xbd\xec\xa7\x30\x0e\xe3\xc4\xfa\x17\x6f\x5c\x7e\x67\x67\x89\xe4\x90\x8a\x8a\x02\x75\x6a\x59\xd9\x82\xba\xf8\xb9\xa3\xdc\x92\x43\xf2\x56\x4f\x19\xbb\x6b\x17\xc6\x4f\x7c\x79\xef\xc4\x8a\x69\x6b\x67\x2d\x79\xe4\xea\xc9\xfa\x16\xf2\xdb\x4b\x1f\xbb\x6a\xfc\xcc\x64\xc3\xd2\x0b\x8c\x5b\x7d\x63\x8b\x1e\x36\xbf\x78\x65\x65\x7d\xf7\x9a\x73\x47\xa4\x67\x4d\x0e\x54\x85\x15\x69\xad\x96\x57\x10\x9f\x34\x22\xd2\x99\x9e\x57\x35\xb2\xa3\xae\x08\xe2\x50\xed\x6f\xf6\xe0\xc9\xab\xb6\x4f\x9b\x78\xc5\x05\xa3\xa7\x3f\xf8\xfe\xe6\x4d\xb6\x4f\x51\x44\x71\xf8\x5f\x40\xc5\xe8\xb6\x67\x50\xf1\xc0\xc9\x9f\x7b\x02\xc9\xe2\xfd\x03\x27\x2d\x67\x3c\x59\x5e\x5c\x57\x8c\xfd\xc5\x50\xfc\x64\xd1\x40\x11\x9e\x55\x04\x45\x68\xba\x13\x2a\x9d\xe0\xcc\xef\x3a\x1a\x82\x9d\x21\xb8\x2b\x04\xe4\xf6\x10\x30\x17\x87\x80\x55\x43\xa9\x10\x0e\x69\x92\xd4\x94\x0f\x4d\x21\xa8\x40\x4f\x23\x8c\xac\x1f\x25\x3b\xb5\x24\x0a\xe5\x93\xc2\x22\x52\x48\xd1\x5e\xfd\x8d\x96\x0f\x6b\xd0\xe1\xf2\xdc\x38\x47\x7f\x3c\x9d\x6e\x7c\x2d\x9d\x8e\xa7\xd3\xd1\x68\x4d\x35\x34\x93\xfa\x66\x62\x69\x36\xaf\x15\x03\x71\xbc\x8b\xe5\xb5\x88\x06\x06\x5e\x10\x9c\x3c\xa5\x3d\xe0\x1b\x5d\x97\xa8\x2c\x89\x6a\x72\x58\x2e\x68\x8e\xc8\xb1\xb1\x13\x5a\x1a\xdc\x07\xcd\xe0\xaf\xf1\x3b\x93\xf7\xec\xd8\x34\x6a\xc4\xf8\x0a\x8f\x28\xdc\x41\xd8\xd8\x38\xef\x85\x97\xaf\xbf\x65\xc3\xb8\xcc\x87\x38\x46\x36\x5a\xf2\xa2\x0f\x1c\x67\xf6\x31\x1d\xa8\x18\x25\x50\x77\x62\x5c\xa8\xb0\xb3\x61\x51\x03\x6e\x6b\x80\x86\xf6\xfa\x7a\x36\xdc\xae\x7a\x8b\xbd\xd8\xeb\x9d\x30\xaa\x3d\xc1\xa6\xd8\xad\xec\x0e\xf6\x08\x7b\x94\xe5\x62\x2c\xb0\xf5\xf5\x35\x15\xaa\xe5\x84\x8e\x0b\xd5\xa4\xf2\xac\xd8\x36\xde\x1f\x8f\xb7\xd8\x13\x6c\xf4\xbe\x6b\x76\xd7\x0f\xbd\xe7\x8d\x56\x84\x6b\xcb\x47\xbd\xed\x7d\x86\x48\xb6\xb1\xa1\x22\xe2\x02\x18\x33\x1a\x57\x84\x5d\xc4\x9b\xed\x46\x1d\x0f\x86\xd7\x6e\xec\x84\xeb\xa7\x5e\x7e\x6e\x91\xe4\x8b\x04\x77\x6d\x60\x0a\x1e\x08\x44\xfc\x52\xd1\xb9\x97\x4f\x9d\xbb\x3c\xcf\x91\xb7\x1c\xbe\x96\xfc\x91\x40\xe6\xd3\x60\xc4\x27\xa9\x91\x31\xa5\xa5\x75\x11\xed\x47\x53\x5b\x4a\xc7\x44\x54\xcf\xa4\x75\x4f\x5d\x39\xf1\xaa\xcb\xaf\x9c\xd0\x91\xda\x3e\xe1\xca\xcb\xaf\x9a\x78\xe5\x53\xeb\x26\xcd\x98\x3d\x7b\x06\x7c\xd6\x7c\xe5\x15\xd7\x4c\x9c\x78\xcd\x15\x57\x36\xcf\x5e\x7f\x41\x79\x65\x72\x7e\xe3\xab\xaf\xde\x70\x6b\xf9\x05\xeb\xbf\x0f\x13\xfd\x7f\x88\xb9\xfe\xff\x80\x89\x8e\x00\xf9\x07\x8e\x33\xb7\xd1\xba\xc1\x9a\x3e\x5d\x55\xd7\xa9\x58\xb5\x6c\x6a\xbb\x37\x90\x54\x55\xa9\xcb\x31\xe0\x04\xa7\xf3\x03\xc7\x09\x07\x6e\x75\x74\x3a\x70\xbd\x03\x68\xe8\xec\x40\xe0\x40\x0e\x54\xc0\x76\xf9\x0b\xc5\xee\x84\xbe\x43\xef\xd5\x8f\xea\x1f\xe8\x27\x74\x4e\xd7\x5d\xa4\x1b\xf2\xdc\x9a\xdc\xed\x22\x0e\x3d\x9b\x77\xcd\x56\xd7\x68\xc4\x97\x2d\x98\xa6\x29\xfb\x47\x3c\x16\xb5\x6c\x0e\x85\xe8\x1d\x0f\x63\xa2\x36\x4b\x14\x1d\x1b\x8a\xfb\x0a\x81\xb2\xd6\xdf\x3f\x69\xe2\xbe\x0f\xff\x79\xc0\x3c\x46\xda\xcd\x07\x41\x38\xf8\xfa\x2f\x7e\x3a\x93\xd9\xe1\xfd\xf3\xcd\x1f\x67\x22\xac\xbe\x6b\x97\xb9\xfc\xb9\xbd\x9b\x5e\x3c\x66\xed\x01\xad\xc7\x5b\x7b\x76\x78\x41\xb6\x9f\xf3\xb2\x61\x33\x53\x63\x39\x91\x39\x1b\x0f\x84\xe2\x85\x51\x3e\xc8\x49\x89\x0a\x3e\xe1\x09\x24\x79\xe0\xc1\xa9\x07\x11\x99\x8d\x9c\x27\x9c\xd8\x49\xba\x97\x20\x40\x88\xf5\x76\xbb\x55\x86\xed\xe6\x25\xf7\xb0\x9c\x5a\x76\x44\xf7\x75\x5a\x2d\x8c\xda\xad\x86\xba\x9d\x4d\xb3\xc1\xd4\xb3\xd9\x41\x38\x0f\x5f\x9d\xb9\xd9\x0f\x47\x6e\x78\xe9\xce\xdf\x9b\xaf\x9a\xfb\x61\x11\xd4\xbd\xfb\xe3\x29\xdb\xef\x7b\xf6\x14\x99\xb2\x33\xf3\xe1\xd8\x9d\x4d\x70\x0b\x2c\x85\x2e\xb8\xbb\xf3\xc1\x29\xff\x1a\x9a\x5b\x63\x5f\xd5\xb9\x43\xa3\x86\xb0\x4e\x86\xd5\x83\xff\x37\x35\x85\x4d\x03\xc7\xc9\x9b\xf4\x67\x44\x6c\xcc\x9f\x81\xe3\xcc\x7e\x3a\x4f\x5d\x8c\x6e\x4a\xcc\x04\x41\x74\x25\x61\x15\x82\x19\x68\x31\xc2\xe8\x94\x4b\x16\x3c\x81\xe4\x36\xf9\x27\x32\x5e\x25\xdf\x22\x63\x59\x15\x95\xa4\xec\x52\x83\x5d\xfe\x1e\xd7\x56\xd7\x0e\xca\x4f\xce\xb6\xf9\xc1\xe5\x77\xf9\xb9\x82\xd3\xee\x12\xc4\x01\x57\xdc\xad\xaa\xae\x60\x8f\x5f\x47\xdd\x2e\x22\xce\xe3\x19\x7b\xcb\xec\x1a\xab\xb5\x65\x43\xbc\x5a\x14\x5c\x24\x9a\x4e\x47\xd5\x7e\xbb\xf4\x02\x04\xe7\x66\x07\x9a\x41\xaf\xa7\x40\xf4\x1e\x2e\x0a\x9a\x3b\x9b\xca\x86\x6b\x3d\x9e\xb5\x57\x34\x8c\x28\x2e\x8d\xd4\x06\x2b\x09\x7c\x59\x01\x87\xfe\xf2\x87\x37\x76\x57\x81\x7c\xeb\x03\x1e\x56\xcf\xbc\x9b\x79\xe1\x25\xfd\x0e\x57\xeb\x7e\x32\xef\xff\x64\xee\x37\xe7\x1e\x7d\x97\xd5\x4f\xdf\x0e\xf2\x86\x55\x08\xa3\x09\x08\x31\xbd\x6c\x1f\xd2\x51\x1e\x9a\x98\x28\x73\xb8\xbb\x04\x84\x18\xdf\x69\xa5\x80\x27\x5d\x4c\x42\x52\x92\x4c\x1e\xee\x76\x2c\xe1\x81\xe7\x45\x96\xb8\x7b\x28\x48\x4b\xbc\xbf\xc5\xc8\x71\x6a\x46\xfb\xe3\x74\xf9\x36\xa5\x66\x98\x96\x6c\x0d\x2d\x4c\xab\x5d\x94\xed\xa8\x22\xbb\x50\x5c\x66\x3e\xff\xe8\xa3\xd0\xbc\xbb\xe2\x9d\x0f\xff\xf2\x87\x4a\x7b\x7d\xf8\xb1\x4c\x27\xdb\x97\xb9\x1f\x2f\xc9\xdc\xff\xd6\xab\x47\xdf\xdd\x41\xd7\x05\xc8\x8f\x10\xbd\x87\x3a\x5a\xfa\x94\xaa\xad\xd3\x30\x8d\xb3\x9b\xbc\x81\xa4\xa6\x21\x47\x97\x3c\xe0\x02\x97\xeb\x03\xf9\x84\x8c\x5b\xe5\x4e\x19\xd7\x5b\xf1\x90\x9b\xeb\x62\x3d\xba\xb3\x5b\x91\xba\xab\x51\x02\xed\x40\xbd\xe8\x28\x62\x11\x92\x15\xc2\xc9\xba\x4d\x1f\x69\x45\x26\xfd\x71\xfb\xde\xc5\x06\xef\x9c\x75\xe9\x2c\x61\x8d\xd3\x70\x78\xd8\xa5\x83\x33\xd6\xf5\x3a\x30\x78\xd9\xc8\xfa\xe7\xf6\x66\xbe\x84\xaf\xb3\x17\x0d\x0d\xf5\x21\xd0\x3b\xf6\x6c\xf6\x8e\x3d\x98\xbd\x63\x1a\x5b\x0e\x13\x1c\x2e\xe6\xec\x7e\xec\x4d\x39\xdc\xaa\xc3\x07\xb2\x7a\xec\xa9\xe1\x33\x6b\xfb\xf6\x79\x34\x24\x0c\xd3\x63\xf9\x03\xc7\x99\x5e\x7e\xa9\x5e\x7e\xf8\x25\x3a\xc7\x78\xf1\xe0\xfc\x5c\x1e\x5b\x0e\x5c\x61\xc0\x75\xf6\x1d\xde\x68\xae\xcd\xe2\x9b\x4f\x4c\x8c\xc4\x5d\x88\xa8\x83\x41\x12\x47\x08\x2b\x76\x21\xa7\x30\x58\x79\x97\x38\x22\x74\xb3\x84\x00\x8b\x62\x74\x74\x25\xc7\x85\x6e\x6b\x28\x4a\xa7\x11\xa1\xc7\x19\xd6\x0c\xa6\xd5\xbc\xa6\xd7\xbc\xfe\x20\x6e\x3f\x68\xae\x85\xf5\x6c\xdf\xa9\x13\xac\xfa\xdd\xbe\x20\x84\x69\xad\x7f\x79\x16\x63\xdd\x48\x14\x2a\xb3\x89\xe0\x65\xe5\xae\x1c\x29\x83\xbb\x9b\x65\x65\xa6\x1b\x88\x3c\x8c\x88\x21\x37\xdf\x1f\xa7\x80\x3f\x54\xe5\x15\x6b\x1e\x26\x52\x16\xb6\x05\x68\x23\xd9\x9a\x89\x82\x8a\x0b\xcd\x7f\x9d\x36\x8f\x41\x1e\x5c\xf0\xd3\x97\x4f\xd3\xa6\x03\x4b\xa8\x77\x80\x7c\xf3\xea\xef\xf6\x24\xe5\x74\xa0\xf5\xde\xd2\x81\x08\x23\xce\x5c\xcb\xbc\x44\xb1\x46\xdc\x68\x7d\x22\x28\xaa\x7a\x20\xe9\xd0\x41\x2f\x76\x04\x92\x0e\x01\x04\xeb\x35\x28\x81\xdb\x72\xc7\x9d\x62\x20\xe9\x9e\xcd\xab\x5d\x92\x87\x07\x89\xb2\x52\x49\x81\x24\x96\x80\x97\x78\x89\x95\xe1\x34\x42\xae\x2e\xd9\xcb\x9c\x66\xd5\x6e\x89\xb8\x65\xae\x9b\x20\x96\x25\x96\xb4\xc5\x28\x38\x47\x0b\x1d\x80\x7f\x97\x36\x29\xda\xaa\x3e\x4a\x31\x8d\xa2\xe9\x6c\xeb\x2f\xd8\x5d\x0e\x46\x9d\xee\x0e\x6b\x46\x58\x8b\x48\xc0\x33\x2f\xfd\xec\xcc\xce\xde\x15\xeb\x9f\x90\x71\xea\x05\xf3\xc6\x2f\xb5\x1f\x5f\x62\xed\xb7\xb9\x16\x57\x1c\xc7\xbf\x81\x99\xa7\x4e\x30\xcb\xcc\xaf\x33\x97\xbc\xfa\xdd\x3e\x20\x04\x83\xb8\x65\x1a\x7a\x35\x71\xde\x62\xf1\x5a\x71\xa3\x48\xeb\x0d\x75\x62\xab\xd8\x29\xb2\x22\xcb\xb6\x3a\x3b\x9d\x5f\x3b\x49\xbd\x13\x58\xa7\xd7\x89\x9d\x5d\x4b\xd0\x2a\x74\x0b\x22\x22\x0a\xa2\x46\xd4\x8e\x66\x21\x16\x31\xcc\x62\x17\x50\x66\x77\x97\x4b\x93\x16\x63\xb0\xfc\xeb\x13\x09\x11\x60\xb1\xba\x51\xc5\x2a\x6d\x6e\x8e\x6b\x4b\xf8\x5b\x78\xcc\x0b\xaa\x20\x2c\x71\xdc\xe2\xc0\x0e\x55\x4a\x48\x29\x69\xab\xb4\x43\x3a\x22\x1d\x95\x78\x49\x95\x64\x85\x23\x0a\x01\xcd\x25\xe9\x3c\x43\x61\xd1\xb2\x7c\xec\x1a\xf5\xae\x1a\xd2\x46\xda\x88\x35\x18\x69\xeb\xcb\x88\x35\xc4\xd3\xd9\x89\x54\x2b\xf8\xe8\x4f\xa7\xd3\x94\xdb\xc5\x0e\x2e\x29\x99\xa9\x08\x11\x4b\x24\x21\x02\x57\x9b\xf7\xed\x85\xf4\x03\xd0\xb9\xd7\x7c\x10\x56\x3e\x63\xee\x7c\xc0\x7c\xa0\x0f\x7f\x89\x5f\xcc\x8c\xcb\x7d\x65\x5c\xf8\xa3\x4c\xbe\xf5\x65\xdf\x8d\xcd\x03\xc7\x99\x18\xfb\x2a\x8a\xa0\x69\x89\xd1\x1c\xf2\x21\x8c\x34\xdf\xec\x70\x98\xd1\x34\xd1\x35\x9b\x29\x2b\x40\x22\x88\x48\xeb\x59\xa2\xc3\xc3\x3a\xe8\xba\x9c\x1f\xec\x09\x31\x72\x8f\xc4\x67\x75\xb6\x31\x54\x3a\x32\xec\x4b\xa2\xd1\xaa\x23\xcd\xac\x58\x0e\x37\x63\x63\x51\x14\x6b\x6a\x38\x92\x2b\x33\x96\xf0\x15\x75\x14\x5c\x9f\xc3\x87\xf6\x1e\x36\xff\x62\x9e\xfe\xf2\x8e\xfd\xbf\x84\x8b\xcd\x6b\x0e\xf5\xee\x7b\xe5\x87\xd7\x1c\xd8\x93\x7e\x1e\xd8\xdf\x7e\xf6\x73\x82\x39\x7f\xdf\x96\x57\x3f\x9d\xfa\x58\x0f\xe4\x83\x70\xdf\xdd\x6b\x16\x5f\xb7\x7a\xcd\xbd\x2f\x3f\xba\xe9\x80\xbd\xfe\x4d\xd9\x1e\x1a\x15\xcd\x7f\x06\x29\x03\x27\x12\x09\x57\x20\x59\xab\x9c\xab\x60\x5e\x75\x05\x92\x63\xf9\x0e\x1e\x3b\x45\x3e\xc8\x57\xf2\x84\x97\x4e\x53\x6a\x70\x71\xa9\xce\x29\x3e\xa5\x5c\x21\x0a\x6b\x09\xac\x7d\x05\x55\x56\xd4\x9d\x3c\x22\xa8\x25\x1e\x6f\x31\xb2\x18\x4a\x69\xd5\xb4\xbc\xdc\x38\x25\xc3\x8f\xba\x0d\xcd\xa3\x80\x61\x73\x85\xb9\x23\x10\xd9\xf4\x04\xcf\x73\x78\xc2\xb1\xc7\x75\x21\xf3\xec\x5b\x6c\xdf\x99\x0f\x6e\xbf\xe2\x5e\x66\xdf\xa9\x0e\x12\xfc\x21\x78\x4f\xb7\x0e\xd7\x6f\x4b\x73\xfa\xed\xb9\x8b\x73\x33\xb9\xee\xec\xdc\xac\x6f\x98\x7e\x43\x90\xeb\xe3\x42\x12\xba\x21\xd1\xc3\xf2\x5e\xbe\x8c\x3f\xc6\x7f\xc4\x7f\xc5\x73\x12\xce\xc3\x23\xf1\x1f\xf1\xdf\xf0\x29\xcc\x55\x48\x20\xf1\x3c\xe9\x42\x4c\x0f\x73\x05\xb3\x8e\x61\x98\x4a\xe1\x6d\xe1\x53\xe1\x5f\x02\x23\x88\xaa\x28\x56\xc2\xdb\xf0\x29\xfc\x0b\x18\x38\x8a\x4e\x20\xbc\xd6\xba\x09\x2a\x4a\xa0\x1e\xc4\x20\x15\xf1\x58\x60\x09\x93\x6d\xc5\x6a\x6c\xb4\xe4\xce\x72\xe4\xe3\x54\xf2\xd2\x94\x40\x88\x16\xc6\xc2\x54\xb8\x2c\x39\x03\xe6\x89\x77\x32\x07\x0e\x1c\xc0\x75\xaf\x67\x5e\xb5\x24\x88\xed\xa3\x32\x35\xc1\x5a\x33\x33\xf0\x29\x3d\x07\x05\x2d\x4f\x84\x9d\x96\x9f\xf4\x5f\x4e\xf8\x0f\xe7\x0f\x9d\x0f\x3a\x49\x97\x73\x99\x13\x57\x39\xc7\x3b\xcf\x77\x12\x87\x33\xdf\x89\x59\xeb\xaa\xa8\x62\x20\xc9\x04\xc4\x40\x92\x74\x21\x97\xea\xc2\x2e\x4b\x99\xf8\x9c\x81\xa4\xcb\x25\x40\x17\xd2\x04\x62\xf9\x87\x3d\x22\xe7\xb6\x61\xd0\x28\x9d\x9a\x6d\xa7\xe8\x38\x45\x34\xdb\x1e\x16\x8e\x68\xb4\x0c\x45\x5d\x02\xdd\x1d\x66\x5a\x0f\x9a\x6f\x5d\xfd\xb3\x27\xdb\x26\x34\x36\x2c\xba\xfc\x07\x78\x2d\xab\x9f\x89\x99\x7b\x82\xf7\x06\x61\x29\x79\x1d\xfd\x9b\x3e\xb1\xc1\xbe\xc0\x6f\xf7\x69\x0d\xff\xf7\xc3\x2b\xbe\xdb\x6b\x95\xc3\x94\xa5\x7e\x58\xc1\x77\x7b\x98\x10\xd8\xf6\x8a\xed\x43\x7e\xb4\x33\x21\x0a\xce\x80\x13\x3b\xc1\xe3\xd9\x3f\xf0\x81\x15\xb8\x59\xaf\x89\x59\x8a\x9e\xe4\x3d\xbc\xc7\xf5\x89\x1f\xda\xfd\xb3\xfc\xb8\xc1\x0f\x95\x7e\xc8\xf3\x83\xe8\x07\x3f\x42\xc1\x8f\x15\x68\x55\x3a\x15\x5c\xaf\x40\xb9\x02\x5e\x05\x38\x05\x94\x22\xd7\x54\x57\xb7\x6b\xb9\x8b\x71\xb9\x02\x0b\x3d\x50\xe7\xf9\xab\x07\x97\x79\xc0\x09\x1e\x82\xa4\x6e\x81\x75\xbb\xa8\x34\x67\xeb\x55\xe9\xb4\x9d\xc8\xb2\x33\x56\x9a\x11\xcb\xfe\x4d\x6f\x6c\x1c\x1f\x0b\xc4\xa2\x51\xcd\x30\xa8\x5a\xb1\x62\x1d\x7b\x36\xb3\x1e\x0c\xf0\xf9\x7d\x7e\xa3\x1e\x98\x5e\x73\xfa\x79\xab\xf6\xfe\x60\x49\xc7\x45\xe9\xcb\x57\xd7\x65\xbe\xf8\x0d\xac\x95\x05\x41\xc4\x15\xd0\xc0\xf6\x9d\x3e\xf5\xf4\x4f\xe7\x87\x9e\xa9\x5a\x7c\x1d\xd3\x72\xe6\xad\xa0\x2f\xe8\xb9\x8c\x04\x50\xce\x56\xef\xb3\xf6\xe6\xf0\x35\xdf\xdb\x97\x64\xd9\xe6\x03\xd4\x2e\x8e\x4d\x94\x90\xd3\x18\x8b\x5d\x6b\xd1\x16\x84\xbf\x65\x92\x11\xb5\xc9\x14\x91\x27\xa6\x66\x73\x53\xfd\xea\xbb\xb4\x5a\x5d\x53\x5d\x66\x0c\x33\xc9\x52\x6f\xef\x99\x35\x07\xb1\xeb\xc0\xee\xcc\xdb\x43\x26\x79\x78\xbf\x9d\x8a\x62\x89\x3c\x17\x74\x21\x5d\xec\xca\x01\xe3\xba\xe4\x6e\x86\x01\x85\xb7\xb9\x4d\x28\x71\x6f\xce\xee\xc7\x69\xe7\x1d\xcd\x0e\xdb\xe9\x9e\x7a\xcb\xf0\x1f\xfc\x70\xb7\x79\xf3\xc1\xc5\x97\x6f\x7b\xe7\x20\xee\xec\x82\x95\xb8\x2d\xf3\xdb\x1b\x16\xa6\xf0\xcb\xf6\xef\x5a\x4d\x79\xda\xad\xe7\x9a\x93\x48\x2c\x14\xa0\x53\x80\x7a\xa1\x4d\xf8\x46\x20\xd7\xb3\x9b\x59\x2c\x74\xb1\x2c\x88\x5d\x47\xd0\x51\x84\x15\x5a\x6b\x74\x32\x5d\x08\x54\xa8\x86\x04\xa4\x60\x2b\xec\x00\x1e\x24\x0e\x13\x81\xe9\xb6\x56\xd4\x9f\x53\x49\x94\xf8\xdc\x0e\x55\x2d\x23\x50\x49\xbb\xa8\xec\xff\x98\xce\x33\x91\xdd\x5f\xed\xfe\x7a\xb7\xfd\xcc\x43\xcf\x3d\xde\x5c\x4b\xed\x9f\x82\xd6\x26\x66\x2d\x94\xa1\x53\x86\x7a\xb9\x4d\xfe\x46\x26\xd7\x8b\x9b\x45\x2c\x77\x89\x22\x8b\xc8\x69\x9b\xea\xa5\x17\x7f\x80\x4f\x60\x0e\x63\x67\xd7\x61\x3a\xd8\x44\xac\xf5\x3d\x8c\x9e\x44\x0c\xd2\x84\x2e\x2b\xb2\xc6\x31\x76\x39\xbb\x96\x25\xac\x4b\xe2\x88\xfc\xad\xa3\xc9\x2e\x34\xdd\xaf\xbe\x97\xb6\x27\x4c\x68\x4b\x4a\xb6\xb2\x93\x3b\xa8\xdc\x92\xf3\xf7\xf6\x9e\x29\xde\xfd\xf5\xee\xaf\x77\x0f\x3b\x2d\x7b\xe5\x18\xe5\x23\xc4\x5c\x4d\xb9\xac\x3c\xa8\x29\x11\x66\x9d\x5d\x45\x68\x0b\xa2\x3c\x81\x58\x9d\x2d\xfa\x30\xf6\x7a\xba\x59\xd6\x89\xbb\x09\x71\x0e\xf7\x9b\x2c\x41\xcf\x39\x6c\xb6\x0f\x5e\x6b\xc5\x09\x8c\x97\xb2\xd2\x64\xc3\x84\x56\xf3\x18\x7c\x34\x09\x5c\x10\x31\x3f\x33\xcd\xb9\xf3\xe1\x82\x9f\xbe\x34\x89\xd5\x77\x65\xee\xff\xe3\xaf\x7e\xfd\xe7\x1d\x20\xdf\x74\x1d\x22\xa8\x07\x21\xe6\x32\xb6\x0f\x89\x14\x3b\xf1\xc2\x44\x6d\xbb\x13\x9c\xa7\x11\xa7\x72\xd5\xdc\x15\xdc\x3a\xee\x04\xc7\x71\x1c\xd2\x4f\xdb\x89\x48\x3f\x91\xba\x8a\x51\xb5\x15\x37\xf9\xb4\x6e\x42\xdc\x40\xa4\x1e\x7d\x28\x42\xe8\xb7\xe7\x6e\x72\x98\x4d\xe9\xfe\xb4\x0d\xe5\x48\x09\x73\x06\x03\x03\xeb\x4c\x7b\x76\xc7\xa8\x5f\xd7\x31\xc5\xf2\xea\x62\xf8\xb9\xdd\x56\x54\x30\xe8\xd7\x59\x41\xc2\xa9\x8e\x61\xdc\x3d\xd6\xfa\xc6\x25\x54\xe7\xec\xbf\x73\x03\x1c\xe6\xdc\x44\xea\xca\x61\xc0\xa9\xba\x2f\x89\x90\x6e\xad\xc7\x5a\x8e\xbd\x4f\xd9\xb5\x44\x07\x1b\x0d\xbe\xbb\x8c\xde\x03\x87\xe9\x12\xfe\xf8\x8a\xb5\x84\xc7\xce\xfa\xfd\x54\xae\x26\x0d\x1c\x67\xce\xa3\xb1\x71\x47\x22\xba\x56\xdb\xa2\x61\x4d\x73\xb8\xd5\xd9\x03\x1c\x70\x41\x28\x72\xc4\x1c\xd8\xe1\x08\x68\xdd\x4b\x2c\xc7\x81\xb8\xba\x65\xd1\xed\xeb\x46\x84\xc9\xd1\xb1\x5b\x1b\x60\xeb\x24\x5a\x97\xb6\x1c\x89\x9a\x6a\x77\x45\x9d\x61\x87\xc6\xb6\xdb\xe0\x0e\xd7\x86\x47\x43\xa4\xe4\x8e\xf3\x1f\xf9\x13\x54\xc3\x2c\xf3\x31\xf3\xc5\xdf\xdf\xf9\xd2\x8d\xf0\xb6\x9a\xd9\x8c\x57\xb8\x3f\x3f\x74\x3f\xf3\xf6\x83\x9d\xe6\xf5\x66\xaf\xb9\xd9\xbc\xa4\x69\xe7\x58\x5c\xb8\xf3\x4f\xa7\x2d\xf9\x99\x3f\x70\x9c\xf6\x09\xea\x28\x84\x2e\x4f\x44\x0b\x4e\xf3\x0a\x8a\xa1\xa9\xa8\x1b\x59\x2a\x86\x43\x09\x6f\x20\x89\x10\xf1\x9d\x76\x26\x44\x57\xd2\x59\xcc\xd5\x63\xc0\x5d\x8b\x08\x10\xca\x27\xef\x70\x25\x09\x29\x82\xee\x25\x1c\x70\x9c\xe4\xee\x56\xdd\xc1\x6e\x89\x61\x08\xd6\x29\x00\x57\xcb\xd0\x03\x44\xed\x06\x89\xa8\x6d\x9b\x8c\x1c\xd5\xaa\xa1\x19\xb4\x31\x82\x56\x12\x31\x1b\xaf\xd3\x54\x2b\xd6\xd7\x54\x1f\xdc\xb5\x79\xf7\xee\xad\xfa\x93\x4f\x1f\x79\x7a\xff\x73\x87\x7e\x0e\x2b\x96\x75\xf7\x2c\xbd\x74\x6e\x3a\x17\xfd\x41\x1a\x4a\xcc\x87\xcd\x15\xe6\x4a\xf3\x41\x68\xba\xff\x53\x58\x08\x4b\xfe\xf2\xb9\xf9\x88\xb9\xeb\x4b\x84\x69\x2f\xa7\x9e\x8d\x25\x56\x24\x8a\x1c\x4c\x3e\x83\x1d\x5c\x3e\x87\x89\x2a\x6b\x49\x82\x58\xb7\xd4\xb5\x45\x7c\x58\x7c\x52\x24\xa2\xd7\x72\x52\xf7\xc9\x5a\x12\xf0\xfe\x81\x13\x4f\x63\xac\xcc\xce\xd1\x71\xbb\xdd\xbe\x24\xcb\x7a\x08\xea\xd1\x75\x70\xf6\xf0\x44\x02\x1a\x14\xd2\x2b\x14\xcf\x3e\x97\xe5\x89\xd2\x76\xd6\xb8\x46\xc9\x04\xd3\x69\xcb\xdd\x2c\xd5\x54\x2b\x0c\x0a\x02\xad\x2e\x36\x01\x9e\x6f\xee\x7d\x07\xd6\x98\x27\xe0\x24\x5c\x75\xe0\x59\xf3\xd7\xbb\xb6\xef\xc3\x73\x32\xbb\xf0\x96\xf9\x50\x07\x5b\x4e\x75\xe0\x39\xf8\xe0\x00\xda\x74\xf7\xd0\x5c\x30\xad\x39\x8f\xa5\xf1\xc7\x16\x9a\x63\x8e\x20\x1f\x2a\x42\xcd\x89\xb2\xfc\x24\x38\xac\xa3\x71\x84\x59\x7f\x12\x69\x47\xb5\x0f\xb4\x13\x1a\xa3\xf9\xd9\xc2\x94\x20\xa0\x60\xca\xe5\x03\x04\xb4\xae\x66\xe9\xc1\x78\xae\x5b\x26\x1a\xa7\x70\x72\x8c\x0b\x28\x24\xaf\xee\xa5\xbb\xae\x8d\xd1\x9b\x31\xd0\xd6\xcc\x48\x09\xc7\xa8\x61\x73\xe5\x6b\x6b\x05\xf9\xaa\x77\x0f\x1c\x3b\xf5\xde\x3b\xa7\x9a\x97\xdc\xfa\x6b\xf3\x05\x28\x03\xe9\x44\xf7\xcf\xb8\xc8\x8e\x89\xe7\xbc\xfd\xbb\xc7\xcc\x7f\x7d\x64\x9e\x31\xff\x04\x4b\xa0\xe5\xf7\x50\xdc\xbb\xac\xf1\xcc\x53\x99\x7f\xc2\xb5\x70\xe9\x5a\x9b\xd7\xc3\xba\x73\xd3\x69\x5d\xd4\x83\x0a\xd0\xec\xa7\x18\xc6\xc3\x60\x69\xff\xc0\xd1\x44\x8d\x28\x27\x91\x4b\x6f\x75\x38\x82\xad\x24\xe4\xf2\xb5\x21\x7e\x2b\xbf\x83\xef\xe5\x19\x1e\x79\x53\x87\x5d\xb0\xc9\x05\xab\xac\x48\xdd\xe7\x4c\x09\x8a\x2f\xc5\x7b\x87\x37\xda\x9c\xdd\xb6\x67\x8f\x20\x32\x5e\x0f\x17\xb1\x03\x3f\xd0\x68\xd9\x30\x62\xbd\x5a\x4e\x34\x39\x0f\x84\xdf\x1f\x35\x11\x98\x70\x63\xa6\x16\xca\x36\x5c\xf9\xb6\xf9\x2c\x34\x9b\x37\xac\xc3\xad\x7c\xe4\xfd\x7b\xf6\x30\x1d\xe6\x67\x2f\x41\xc2\x7c\x2b\x39\xfd\x36\xb3\xd9\xdc\xb3\x6f\x0e\xad\xf1\x43\x04\x21\xc6\xc5\x74\x20\x16\x8d\x4e\x14\xe0\xb6\x22\xb2\x9c\xac\x25\x5b\x08\x43\x0d\x2f\x41\x04\x71\x3c\xa4\x18\x05\xd3\xe1\xf6\x6c\xa1\xde\xe6\xb0\xb5\xdb\xcf\x5d\x99\x57\xfb\xf0\x67\xa4\xf7\x4c\x8a\xe9\xb0\xce\x2f\x6c\xde\xc8\x2c\xa1\xfb\xa1\xa1\xab\x12\xe2\x08\x01\x44\x21\x28\x60\x8d\xb2\xd2\x05\x92\x9a\xe5\xe1\xd4\x3a\x5c\x49\x8d\x57\xc4\x94\xb8\x4e\xc4\xba\x08\xbc\xc8\x8b\xac\x03\x5a\x11\x72\xb6\xd9\xa3\x8a\xc4\xe1\x66\xda\x58\x65\x8a\xa8\x68\x0e\x2e\x45\x80\x61\x88\xf7\xdb\x51\x63\x7a\x58\xd8\x98\xb6\xee\x57\x94\x8a\x64\x2e\x64\x44\xd9\x88\x11\x13\x66\x49\x6f\x26\xd8\xdb\x09\x1c\x83\x53\xf7\x99\x3f\x3f\x55\xfa\xb2\x79\x23\xac\x31\x6f\xc4\x7e\xb8\x19\x47\xcf\xa4\x48\xa9\x59\x64\xfe\x22\x87\x6d\x4e\x65\xb1\x79\x28\x56\x64\x3a\x90\x06\x42\xe2\x87\x4b\x95\xd5\xca\x26\x85\x4c\x56\x66\x2b\xb8\x52\x69\x54\x70\x9e\x02\xa2\x02\x8b\xb8\x6b\xb8\x0d\x1c\x99\xc4\x4d\xe7\x70\x39\x57\xc7\x61\xaf\xa5\x21\x60\x37\x07\x1c\xf9\x46\x82\x4e\x69\x91\x84\xfd\x52\xbd\xd4\x26\x11\x4e\x02\xa9\xed\x27\x0a\x28\x28\xe0\x00\xd1\x01\x0e\x87\x8b\x5f\xc2\xac\x62\x6e\x61\x08\x9d\x88\x60\x58\x95\x65\x6f\x11\x40\x50\x1d\x6a\x52\x50\xf9\x04\x9f\xa2\x12\x73\x84\x3f\xca\xf3\xbc\xca\xf3\xee\xc5\xda\xb5\xda\x46\x8d\x58\x9b\xb9\xcf\xda\x43\x75\xff\xc0\x89\xa7\x54\x75\xa3\x13\x9c\xf4\x5b\x6a\xd2\xe9\xb2\xdc\x69\xdd\xe5\xd2\x45\x99\x20\x19\x81\xcb\xc1\x7b\x55\x86\x16\x33\x87\x45\x96\xd6\x85\x6e\x30\xa2\x69\xfb\x4f\xcd\xb0\x02\xcd\xc1\x77\x59\xcc\x23\x1a\x5f\xa6\xe3\xf1\xf4\xb0\xf6\xfd\xf4\xb7\xa2\x4c\x11\x0c\xec\x7f\x18\xe6\x3e\x63\xde\x01\x97\xbd\x60\x3e\xf1\xb0\xf9\xc4\x0b\xb0\xdc\xdc\xb2\x1f\xd7\x62\x6f\xe6\x33\xeb\x2b\xf3\x2a\xae\xca\xbc\x49\xbf\x6a\xb1\xf7\xac\x1e\xc5\x62\x34\x23\x61\x28\xce\xe2\x62\x81\xb4\x3a\x9d\x05\xad\x7a\x89\x80\xfc\x3d\xfe\x2b\xfc\xeb\xfc\x8c\xdf\x1f\x56\x8a\x52\x87\x8b\x61\x53\x31\xac\x2a\x86\xe2\x62\x29\x2f\x15\xf0\xfa\x78\x36\x25\xa9\xb4\x80\x6f\xdb\x0c\xeb\xa6\xe4\xcc\x46\xbf\x3d\x78\x49\x3b\x15\xe9\xe5\x18\xa4\x0e\xe7\xbd\x43\xd4\xe2\xc5\xb5\x63\xc2\x91\x5a\x38\xf5\xf8\x1d\xa7\x36\x3c\xd9\xb2\xe3\x77\xaf\xbd\x77\xe4\xc3\x7f\x7c\xf0\xd9\xda\x7d\x07\x20\xdf\x7c\xe5\x5e\xbc\x71\xea\x8c\xed\xc9\xbb\xce\xbb\xe7\x87\x07\x1a\x1d\xe7\xbc\x71\xdf\xe3\xe7\xee\xee\xdc\xf7\xcc\x36\xbb\xdf\x0a\x21\xda\x6f\xe5\x40\x37\xd1\x09\xab\x9f\xeb\x81\xa4\x68\x09\x74\xca\xe1\x4a\xb2\xa2\x57\xc4\x44\xd5\x03\x49\x52\xec\x70\x25\x25\x92\x47\xf0\x66\x01\x96\x0a\xab\x05\x7c\x13\x86\x45\xf8\x1a\x8c\x85\x5b\x08\x2c\x25\x40\xb8\x56\xea\x3a\xb1\xce\x8d\x22\x2c\x12\x41\xc4\xa8\x15\x39\x7a\x1d\xd8\x21\x10\x87\xc2\x61\xc9\x9b\x3d\xad\x6c\xdc\x49\x4b\x8f\x71\x5a\x6e\xb5\x87\x06\xd2\xd1\x68\x3a\x1a\x05\x8d\xa7\xd1\xa7\x1b\x22\x1a\x9c\xe7\xc4\xec\xa7\x8f\x4b\x19\xf3\x53\xa6\x23\xb3\xe0\x0c\xb9\xff\x74\x1f\xde\x08\xca\x99\x65\xd6\xb5\x1c\xc4\xf2\xf4\xeb\xe5\x87\xff\x48\x31\x03\x2e\x2e\xa3\xdc\x5e\x14\x53\xa6\x57\x83\x75\x1a\x5c\xa1\x41\xa9\x26\x4b\xcc\x30\x6e\xaf\x2c\x46\xf1\xbd\x4c\x07\x92\xd0\xe6\xc4\x94\x99\x0c\x30\xaa\xe4\x4c\xfe\x15\x7f\x8d\xf1\xef\x31\xdc\x8b\x77\xe3\x97\x31\xb9\x19\xc3\x35\x18\x16\x62\x68\xc5\x9d\x18\xd7\x62\xf0\xe1\x72\x8c\x79\x0c\x33\x11\x20\xeb\xf3\x9c\x04\x22\x0b\x08\x80\x21\xb2\x84\xb9\x36\xc4\x9f\xe0\x31\x6f\xd9\x1d\x97\xe2\x49\xf2\xac\x84\x09\x4f\x06\xfb\xbd\x6c\x1c\xda\xfe\x78\x5c\x7d\x3d\x1e\x8f\x19\xf4\xa1\x73\x24\x27\xd9\x06\xaa\x41\x11\x34\x34\x72\xc7\x9f\x32\xff\xc0\x75\x9f\x64\xde\xdb\xb7\x8f\xe9\xc8\xfc\x23\xf3\x92\x25\x6b\x4c\x47\xe6\x33\xbb\x3e\x36\xf0\x25\xa3\xd2\xfe\xe3\xd7\x13\x0e\xb9\x38\x97\xa0\xa6\x51\xe7\x72\x6f\x20\xf9\x14\x0b\xbb\x59\xb8\x87\x85\xe9\xec\x02\x16\xc7\xd9\x09\x36\xa3\x7a\x29\x4b\x98\x62\x39\x90\x14\x99\x20\x53\xc9\x10\x86\x6c\x23\xb0\x8a\xdc\x42\x70\x23\x69\x27\x4b\x09\x21\x9f\x39\x4f\x3b\xf1\xaf\x9d\x7f\x74\xe2\x6d\xce\x9f\x38\x9f\x71\x92\x5b\x9d\xe0\x2c\x76\xaa\xc9\xa0\xb3\xd2\xd9\xe8\x24\x82\x13\x9c\x47\x5c\x47\x5d\xf8\x11\x17\xa8\xae\x62\x57\xb5\x8b\xd0\xa0\x36\xa8\xe8\x34\xa8\x6d\xdb\x82\xc0\x8a\x6b\x53\x2e\xc5\x31\x55\xe4\x6c\xf4\x90\x5c\x5c\x9b\xb6\x9d\x07\x3a\x19\x47\x1f\xdc\xa0\x51\x5a\x3a\x9a\xbb\x8a\xd1\xef\x09\x75\xd5\x3e\xf3\xf1\xb2\xbd\xfb\x9a\x43\xde\x82\xe5\x1b\x4b\xf1\x6e\xd2\x6b\xba\xcd\x98\x7c\x23\x07\xef\xc0\x3f\xe9\x5e\xac\x44\x88\xe9\x62\x3a\x50\x00\x1d\x4c\xe4\x07\x84\xa4\x80\xfd\x7c\x1b\x8f\xff\x26\x9c\x12\xb0\x20\x68\x9e\xa4\xf0\x11\xff\x15\x3d\x98\x93\x89\x7a\xcd\x93\xe4\x75\xdd\xf9\x47\xff\xdf\xfc\xa7\xfc\xc4\xaf\x6a\xde\xe4\x1c\xff\xa5\xfe\xff\xf0\x93\xb1\xfe\x0e\x3f\x0e\xfa\x2b\xfd\xd8\x0f\xed\xbd\x94\x95\x11\xe5\x1d\x53\x3e\x52\xbe\x52\x08\x05\x01\xa8\xd6\xbc\xc9\x0b\x95\x8b\x95\x95\x0a\xa1\xd9\x17\x9f\x52\xae\x60\x45\x6e\x47\x4e\xd5\x99\x70\xa6\x9c\x57\x38\xd7\x39\x39\x27\x76\x38\xfc\x2e\x45\x17\xc0\x49\xc5\xdd\x92\xf7\x2c\x5a\x35\x7d\x40\x1a\xdc\xd8\x7f\xa5\x13\x81\x51\x4b\x43\x59\xcf\x6f\xc5\x5f\x3c\xc7\x93\x08\x29\xaf\xb0\x24\xc0\xed\xf3\xd7\xd5\xd7\xd5\xbb\x0d\xa6\xeb\x3e\x21\xe8\x73\x1e\xdb\x78\x4c\x18\x77\xdf\x9b\x6f\x05\xab\xd9\x6a\xc9\xf1\xce\x1b\x64\x7d\xfe\x82\x8b\xca\x33\xab\xf1\xc6\x60\xff\x99\xb5\x4c\x47\xe6\x8a\xf3\x0f\x3b\xf7\x56\x94\xe0\xbb\xcf\xbe\xd3\x2d\x89\x72\xcc\xb5\x65\x2f\x26\xe4\x9a\xeb\x85\xd4\x61\x80\x4d\x00\xab\x00\x00\x24\xd6\x4b\xb2\x42\x3a\xd4\x0e\x3b\xd8\x48\x49\x83\x19\xdb\xfa\x40\x27\x0e\xf7\xf5\x65\xde\xef\x63\x3a\xcc\x46\xf8\xe5\xe9\x3e\xf8\xd4\xf4\x33\x1d\xdf\xd3\x63\x97\xfb\xfd\x3c\xaa\x4c\x04\xd8\xb6\xad\xcc\x0e\x06\x33\x62\x0e\xeb\x95\x4f\x61\x85\xb5\xa9\x08\xfa\x73\xfd\x82\x43\xb3\x5f\xd0\xd9\x47\x6e\xeb\xcb\xbc\xcf\x74\x9c\xee\x23\x59\x6e\x25\xca\xff\x44\x7f\x7e\xfb\x10\x67\x0d\x7d\x3f\x6e\x30\x16\xbd\x80\xfe\xbe\x71\x89\x32\x2b\x92\xc3\x08\xe1\x36\xf2\x01\x0b\x2c\x3b\x94\x0a\x67\x09\x11\x44\x60\x53\x5c\xd6\xf0\xe7\xe0\x9b\xec\x22\x5c\x3a\x67\xfd\x6b\xc3\xcc\x05\xe6\xf2\xa7\xcd\xe5\xe4\x6d\xcb\x03\x20\xbd\xdb\x87\x70\xc0\x68\x9f\xed\x05\xd4\x47\xea\x30\x3d\xcc\x7a\xce\x83\x9c\x48\x47\x7e\x94\x4e\x34\x79\x50\x27\xbb\x88\xc5\x6d\x2c\xb0\xed\x2e\x07\xc7\x89\xbe\x76\x05\x03\x0e\x6a\xed\x29\x71\xab\xb8\x43\x3c\x22\x1e\x15\xd9\x98\xd8\x22\x62\x51\x46\x6e\x25\x85\x1c\xaa\xc7\x95\x62\x78\x1f\x3b\xd8\xb2\xd4\x4f\xbb\x58\xbf\xd5\xb1\x64\x9d\x02\xa3\xd1\x4e\x94\x52\x4d\x2d\xd3\x0c\xa2\x31\x9a\x4a\xbb\x98\x70\x1f\xbc\x6a\xd6\xfe\xc8\xac\x81\x37\x7e\xf4\x23\xf3\x6d\x78\x11\x22\x4c\x57\x3c\x33\x90\xf9\xef\x91\x66\x29\xbc\x5b\x85\x25\x2c\x55\xc2\x81\x53\x2b\xc9\xb8\x42\x73\xbd\xf9\x03\x52\x70\xe6\xe5\x30\xac\x85\xd5\x03\x03\x34\xee\x5b\x46\x9f\x67\x1a\xdd\xc3\xfb\xcd\x1b\x99\x07\xa9\xcc\x34\x24\x8a\xa1\x0d\x21\xbe\x6d\xb9\xb4\x56\xda\x22\x11\xc9\xc9\xd1\x66\x6a\x81\x51\x24\xcb\x6f\x01\xdb\x6d\xf9\x6e\x96\x02\x06\x73\x14\x9a\xc1\x3c\xd8\x7b\xe6\xf1\x3e\x38\xd9\xb7\xc3\xf2\x4b\x98\x0e\x6b\x23\xcf\xa4\xac\xdf\x83\x10\x53\x46\x7b\xdd\x62\x89\x20\x2b\xb6\x6d\x15\x40\xd0\xa1\x0d\x29\xa0\x48\x2c\x49\xc9\xb2\xe0\xe5\x6c\x71\x1c\xf4\x7d\x07\x65\xd1\x43\x53\x13\x5a\x44\xa3\xad\xfa\x1a\x4c\x79\xed\xa7\x3f\xe9\xeb\x7b\xea\x57\x3b\x0e\x30\x1d\xe6\xa2\x27\x56\xc2\x31\x4b\x28\xd7\x3e\xb9\x19\xec\x3e\xfc\x35\x59\xb9\x70\xa0\xae\x44\x4b\x2b\xea\x44\x8b\x10\x41\xed\xa2\xc8\xd6\xc3\x37\x80\xa1\xfd\x08\x73\x94\xc1\x0a\xd3\xc2\x60\xc6\xd9\x20\x9c\x14\xb0\xd0\x8e\x58\x95\xad\x66\x73\x25\x76\x9e\x45\x42\x8a\xf5\x4a\x1c\xb6\x7d\x8d\x6c\xfb\x05\xbd\xc6\x69\x9a\xa4\xa0\x21\xbf\x91\x0b\xf9\xf1\xfe\x93\x3b\xcf\x44\x77\x9e\x7c\x64\x3b\xe9\x3d\xdd\x67\x3f\x35\x02\x74\x99\x79\x23\xb3\x9f\xea\xeb\xcb\x12\xed\x7c\x3b\xc7\x31\x83\x8b\x71\x3a\xc5\xec\x62\xfe\xce\x0c\x30\xf8\x08\x03\xf6\x7a\xb4\x06\xf9\xa4\x8c\xe5\x76\x55\xac\xa6\x8d\xa7\x96\x04\x71\x22\x83\xe4\x94\xc8\xf3\xa2\xd7\x25\x65\x57\x64\xa7\x24\xec\x55\xbd\x9b\x1e\x5c\x96\x96\x4b\x1b\x19\xda\xb0\x8c\x04\xde\x73\x72\xe7\x35\x8f\x9c\xe9\x7c\xe4\xe4\xce\xed\xd6\x71\x64\x3e\xcd\x1d\x8d\xdd\x0f\x19\x45\x88\xb9\x91\xda\x45\x1d\x4d\x4c\x54\x22\xb9\xad\x97\x3b\xc2\x1d\xe5\x08\xc7\x09\x4a\x3b\xf1\xbc\x21\xbc\x2f\xfc\x5d\x20\x82\x23\x75\xd8\xf2\x24\x65\x21\x25\x2a\x72\x8a\x1b\xf2\xf1\x69\x69\x73\x28\x2f\x01\x46\x31\x8d\xa3\xc2\xb5\xe1\x20\x50\x02\xda\x08\xee\xd8\x06\x3b\xcc\x39\xe6\x3e\xf3\x7e\x5c\xb4\xc9\xbc\xe6\x87\x78\xa3\xf9\x8a\xd9\x4b\x7a\xb7\x67\x76\x99\x7b\x1e\xef\xba\xc0\xba\x5b\x2b\xb2\x3a\x5d\x40\x2a\xf2\xa0\x8b\x13\x13\xda\x9d\xb3\x9c\x4b\x9d\xc4\xd9\xde\x43\xae\x20\xeb\x08\xe1\x08\x10\xc2\xd5\xeb\xdf\xe8\x58\x6f\x6f\xd0\x40\xf3\xa1\x06\xe9\xa4\x84\xa5\xf6\x7a\x0e\x10\xa7\x72\x98\x13\xed\x35\xba\x79\x45\x4a\xe9\xd6\x12\x0d\xbb\x84\xd9\x4f\x6f\x58\x9a\x2a\xb8\x34\xf5\xb6\x28\x78\x4c\x76\xa5\x46\x6e\x9d\x10\xd1\x0c\xd0\x37\xc0\xc3\xe6\x1c\xf3\x4f\x8f\xdc\x6a\x2d\xf4\xf9\x9d\x3b\xed\xc5\x32\x1d\xd9\xb5\x9a\xba\x1d\x1f\xbc\x8d\x10\x33\x29\xbb\xde\xe6\x84\xee\x6c\xfd\x3b\x19\x20\x98\xe8\x48\x6a\x43\xdc\x09\x0e\x73\x14\xa7\x47\xf1\x24\x73\xab\xb2\x16\x65\x6f\x9b\xbd\xa2\xa1\x2c\x05\x84\x07\x17\x62\x07\x41\xb0\x05\xbc\x74\xc7\x1a\xfb\x80\x19\xdc\xaf\xc1\x25\x20\x3b\x09\x42\xf5\x21\xf2\xa1\xa5\x7d\x75\x00\x8d\x32\xd0\xe4\xab\x28\x27\x55\xcb\x93\xb3\x82\x36\x9e\x47\x02\x9b\xdc\xaa\x83\x1e\x70\x22\xb4\xce\xd2\x90\x7e\x6e\x5a\x8c\x3f\xcc\xe3\x4d\x3c\xac\xe2\x81\xe7\x15\x32\x0d\xbc\x3e\x59\x9a\xa6\x7c\xcb\x19\x3d\x3b\x85\x51\x53\x1d\x8d\xa2\x74\xba\x3e\x97\xbb\xc0\x61\xea\x92\x66\x53\x1a\x87\x7e\xbc\x0d\xba\xb5\xcc\x5f\x71\x20\xdf\x7c\xf2\xd2\xed\xcd\xdb\x7e\x0e\x0e\xf0\x99\x7f\x36\xbf\x39\x58\xb9\xa3\x19\xe6\x6c\x87\xf1\x8d\x0f\x35\x99\xef\x9a\x1f\x99\xff\x30\xdf\x45\x18\x5d\x3f\x70\x9c\xb9\x8d\x99\x8b\x14\x94\x8f\x16\x25\xc2\xc1\x76\xb4\x96\xdf\xc2\xbf\xc1\xbf\xcf\x33\x3c\x4f\xdc\xed\x72\x42\xd4\x92\x72\x21\xd7\x80\x4f\x62\x8c\xdb\x69\xe6\x22\x24\x6a\x49\x02\xa9\xc3\x1c\x6c\xe2\x60\x95\x15\x9b\x88\x6a\xca\xe5\xf3\xa5\x44\x95\x51\x88\x77\x58\xf6\x82\x9a\xb3\xe8\x50\xf2\xe2\xac\xdc\x85\x1e\x8e\xeb\x9a\x1a\x2e\x2e\xcb\xd6\x6c\x28\x6c\xf3\xde\x7b\x76\xee\xbc\x2f\x02\xe7\xfd\xf4\xb0\xb9\xd5\xfc\x19\x5c\xb8\x38\x3d\x67\xd9\x92\x74\xda\xb6\x75\x66\x23\xbc\x63\xfe\xc1\xfc\x47\xe6\xa5\xfb\x5e\xe8\xff\xe3\xcb\x47\x3e\x78\xef\x97\x14\xc7\x0e\x21\x46\xa2\xf1\xa1\x1b\x2d\x4f\x94\x62\x41\xd1\x93\x95\x18\x02\x18\x44\x0c\x58\x66\x9c\x52\x9b\x3d\xaf\xe4\x9d\x81\xae\x45\x1b\x11\x41\xb4\xb2\x56\xfc\xa4\x65\x7f\xeb\x35\xd0\xda\x10\x63\x19\x49\xc2\x60\x5e\x4e\xb9\xdd\x48\x49\xf1\x8a\x94\x35\x91\x34\xdf\x47\x23\x67\xcb\x54\x35\x18\xe9\x5c\xb2\xc2\x72\x23\x2c\xbb\x69\x4f\x61\x51\xdb\x55\xa6\x85\x4b\xbc\x1e\x03\x1a\x5f\x86\xc8\xdf\x7e\xf3\x5f\xf0\x51\x9f\xf9\x21\x14\x9a\x6f\xbf\xf9\x05\xbc\x36\xf1\xe4\xbd\x8f\x9f\xee\x83\xde\xed\xb0\xe8\xf1\x03\xdf\xcf\x8d\xfb\x3f\xe2\xd2\xfd\x9f\xf2\xdc\x22\x40\x0c\x9d\x97\xf4\xa0\x12\x34\x3f\x31\xd6\x57\xe4\x44\xc8\xc9\xb6\x6d\x2d\xda\x51\x84\x8b\x4a\x3d\x81\x20\x91\xdb\x34\x1b\x74\x8e\xa4\xc2\xf9\x41\x21\x55\xe0\x57\xa6\xaa\x1e\x15\x15\xa8\x05\xc5\x05\xa4\x40\x2d\x50\x9d\x3a\xb2\x3c\xa9\x96\x1c\xab\x92\xda\x1f\x57\xfb\x8d\x96\xcf\xe9\xe4\xaa\x3f\x97\x66\xd4\x68\x78\x94\xc3\x83\xff\x3e\x02\x23\x1b\x32\x1e\xdf\x5c\x37\x7e\xad\xcd\x62\xd4\x07\xd7\x9b\x37\x0b\xd2\xb2\xbf\xc0\x46\xf3\xbd\x69\x66\xd5\xdd\xde\xc7\xc8\xa4\x6f\xb1\x19\x99\xcb\xcf\x1c\x32\xf7\x0e\x0c\xd8\xf9\x04\xda\xf7\x77\xcc\xc6\x3c\x5b\x62\xf7\xfd\xc9\x5a\x39\xd4\x71\x22\x19\x86\x5d\x99\xf3\x4d\x90\x0f\xa5\x13\x63\xed\xcb\xe8\xf0\xe4\x7b\xb0\x43\xcd\x57\x31\xcf\xeb\x68\x8b\x13\x9c\x01\x56\x48\x22\x1d\x74\x61\x5a\x8c\x3d\xcc\xe2\x4d\x2c\xac\xb2\x7c\x15\xc9\xba\x81\xaa\x34\x4d\x56\xce\x1a\x5b\x1b\x6c\xb2\x49\xe7\xb0\xf9\x29\xdf\x43\x79\xa4\x98\x7c\xa7\xdb\x86\x29\x6b\xbe\xf7\x0a\xf3\xd1\x10\x0e\x66\x3e\xf2\x40\x7a\xdb\xce\x9b\x0f\x98\xdf\x98\x7f\x86\x08\xc8\x7b\x99\xc8\x43\x8d\xe6\x0b\xdb\xcd\x5d\xcd\x3b\xc6\x43\x29\x28\x90\x0f\xa5\x43\x78\xcf\xd4\x9f\x3a\x6f\x18\xdf\xb0\x4b\xe7\x0e\x4d\xf8\xdf\x71\x04\x67\x31\xfb\x3a\xe9\xcf\x98\x98\xed\xb3\xf9\x92\xfa\x17\x3e\x14\x42\xab\x13\x53\xfe\x20\x7e\x22\x9e\x14\x89\x68\xb9\xe0\xd7\x89\x20\xaa\xa2\x2b\x29\x0a\x82\x27\xa0\x07\x92\x1e\x55\xd4\x92\x1e\x2f\x0a\xb4\x71\x3d\x5e\xf0\x72\x5e\xce\x95\xdf\xfe\x06\x79\x9f\x60\x52\x8c\x5c\xe0\xf2\xa7\x10\xd2\x84\x94\x57\xd1\xa6\x2a\xb2\x2f\x90\xd5\xa4\xc6\x50\x4f\x81\xfa\x7f\xd2\xd9\xf6\x1a\xbb\xbb\x26\x6a\x68\x46\x94\x56\x38\xc1\x2e\xd3\x6a\x11\x09\x06\x01\x3a\x75\xf7\x90\x75\x7a\xc5\xb0\x74\xed\x6f\x0f\x84\xc7\xcc\xe9\x69\x0e\xf9\xf2\x2b\x6b\xaa\x22\xf0\x45\xfd\x30\x3b\x65\x96\x9b\x1b\x2f\x91\x6f\xe4\xa6\xc3\x0f\x20\x33\xa8\x84\x31\x5a\x86\x10\xf3\x38\xf5\x6b\x02\xa8\x33\x11\x64\x1b\xf4\x93\x96\x71\xc2\x0e\x87\xe2\x6d\x17\xf2\xa0\xc1\x75\xd2\x85\x5d\xed\x0a\x9d\x1e\x91\x9c\x49\x45\xf1\x6a\xce\x14\x7b\xd8\x52\x01\x48\x4f\x39\x72\x4e\x78\x8e\x9c\xbb\x25\xab\xb7\xb2\x9d\x36\xe9\x41\x67\x3c\xfb\x04\xd4\x23\xd7\xb2\xc6\x4a\x86\xe8\x4e\x7b\xe5\xe6\xb1\x9d\x78\xb9\xb5\x5e\xdb\x49\x37\xc7\x5b\xab\xb6\x95\x57\x76\xb1\x03\x03\x39\x0e\x31\x9d\x3b\xf4\xfe\xd0\x0c\x19\xd5\x03\x27\x6c\xf9\xee\x1a\xc2\x31\x56\x86\x33\xfc\x0c\xe7\xcf\xb0\x63\xee\x1c\xdf\xac\x9c\xe5\x9b\x55\xec\x60\xfb\xdb\xf8\xb9\xfe\x1c\x7e\xee\x73\x17\x4b\x43\x33\xd3\x52\xc1\x30\xfc\x5c\x3a\xfb\x75\x63\x36\x6e\x99\x94\x88\x5a\x11\xb5\xca\xf7\xd2\x4c\x11\xcb\xf3\x22\x64\xe3\x08\x27\x6a\x43\x62\xaf\x88\x45\x9e\x67\x51\x4a\xf4\xda\x9e\x50\x4b\xbf\x61\xc4\x86\x0d\xe7\x5b\xb6\xb4\xcc\xf6\x46\xa9\xfb\x43\x83\x17\xf3\xa1\xa7\xcd\x1f\xf6\x51\xdf\xcc\xf6\x4a\x11\xa0\x0b\x68\x2d\xf4\x15\x34\x0e\x5d\x9d\x28\x92\x15\xe7\x61\x27\x76\x26\x64\x2d\xe9\x74\xba\x0b\xd1\xe9\xb1\x63\x2b\xf8\xd3\xee\xe6\xd1\xa8\xaa\xb7\x0a\x57\x59\x67\x57\x22\x6b\xc9\xaa\x2a\xe3\x74\xac\x02\x2a\x9a\x9a\x1a\x46\xca\xa3\x47\x4b\xd5\xdd\xea\x48\x06\x8d\x1d\x5b\x88\x1b\xba\x03\x25\xb4\x6f\x20\x1e\x8f\x6b\x46\x8b\xf1\x8f\xf8\xf3\xb1\xb8\x66\xb7\x61\xd2\x4e\xbf\x6c\x0b\x41\x7f\xa3\x66\x58\xef\x6a\xaa\xcb\x6c\xd0\x4c\x15\x47\x4a\xec\x46\x5d\x5d\xcb\xb5\xf0\x56\x50\x68\x4d\xc0\xb5\xaa\x6e\xc4\x7d\xb4\x8f\x0e\xdb\x20\xa1\xf5\x9a\x81\x9f\xad\x68\xa8\x9e\x38\xd2\x3d\x65\x42\x7d\x65\xac\x64\x66\xf5\x9d\x77\x95\x4c\x59\x37\x37\x5c\x37\x3a\xea\xf7\x8d\x1c\x5d\x1b\x9e\xbb\x6e\x6a\xe4\xae\x3b\xab\x67\x96\xc4\x2a\x1b\x26\x9c\xef\x8e\x4e\xaa\x6e\x2c\x7b\xec\x40\x74\xd6\xae\x8f\x6e\x03\x37\x78\x0a\xef\xf7\xeb\xe6\x36\x73\xfb\x11\xf3\x9d\x97\x17\x3a\x03\x65\x81\x40\x59\xc0\xb9\xf0\x65\x28\x3b\x02\x8b\x60\xb1\xee\xbf\xbf\xd0\x3c\x6e\x7e\x7e\xdb\x47\xbb\x66\x45\xe1\x5d\x84\x80\xe2\x2c\x6f\x62\x3a\xd0\x48\x74\x5d\x62\x34\xef\x04\x67\xb9\x2b\xec\xcd\x94\xc0\xc1\x12\x28\x29\xc9\x57\xda\xbb\x5d\xe0\x72\x41\x7e\xbb\x5c\x00\x05\xa3\x46\x72\x08\xc1\x6e\xd4\x87\xf0\xdd\xd9\x1a\x8d\xdf\xa1\x24\x11\xc2\xed\x50\xee\x74\xa2\x7c\x17\x28\xde\x92\x12\x7e\xaa\x65\xe2\xfa\x0d\xcd\x4e\xe2\x59\x81\x32\x85\x12\x4c\xaf\x30\x8c\xc1\x63\xd4\x0c\x9a\xb8\xd3\x1b\x1b\xd3\x35\xd5\x61\x30\xdc\x21\xf0\x1b\xcd\xa4\xde\x4d\x0c\x77\x88\xf8\x8d\x66\xac\xd7\x1a\x1e\x09\x38\x3e\x42\x46\x43\x85\x0b\x78\x02\xf9\x66\xff\x8e\x1f\x7b\x4a\x04\x86\x55\x74\x8f\xd4\x79\xd9\xbd\x9b\x04\x9f\xdf\xc7\x73\x2d\x53\xab\xd4\x6d\x79\x13\x56\xcc\xfc\xf1\x74\xde\x41\x58\x55\x58\xc6\x74\x64\xe6\x5c\xf4\x23\x43\x6f\x38\x67\x62\x08\x54\x78\x2d\xd3\x1b\xee\x59\xdc\x13\x5e\xf2\xbb\xbf\x02\xbe\xef\xc7\xe6\x07\xe6\x57\x99\xb5\x30\x3d\xaf\xc1\xe3\x69\xf6\x99\x4f\x50\x8e\x0c\x84\x98\xab\x39\x0f\xf2\xa1\x30\x3a\x27\x11\x76\x23\x7f\x97\x2a\xcb\xae\xfc\xd9\x5e\x2e\xe2\x0a\x77\x23\x9f\xab\x5b\x71\x2b\x48\x41\x8a\x86\xfc\x3d\xb2\x5d\x8b\x6a\x8c\xc5\xb2\xb6\x0b\x62\xea\x9f\x7e\x93\x6d\x9e\x8b\x57\xd7\x0c\x36\x66\x47\xb2\x35\x3c\xda\x05\x45\x9b\x48\x46\xe3\x28\xc0\xa9\xb9\xf7\xbf\xb1\xb6\x7e\xdc\x0f\x9e\xdf\x60\xfe\xc6\x3c\x06\xd1\x83\xb0\xc9\xbc\x76\xc9\x93\x3f\x1e\x3d\xfb\xd6\x74\x07\x99\x32\x61\xc5\xfd\x33\xe6\x3d\x74\xc5\x78\xa6\x67\x17\xa8\xe6\x89\x5d\x67\x12\x37\xdd\xd2\x3a\x6f\x5c\x7e\x76\x9d\x33\xd9\x0a\xe4\x41\x61\x34\x31\x51\x82\x50\x81\x1b\xfb\xda\xac\xa5\x16\xb4\x72\x11\x17\x38\x53\xaa\x37\x85\xb1\x5b\xd5\x34\x55\xf1\xa5\x64\x5b\x87\xc6\x34\xa3\x31\x46\x1b\xe6\xb2\xf5\xc5\xec\xd4\x40\x75\x0d\xd0\x7e\xd4\xec\x52\xb3\xc6\xd5\xd2\x3f\x59\xd0\x60\xfc\xa1\x79\x0c\xd0\xef\x7f\x13\x5b\xf8\xf0\x0a\x73\xca\x17\x5f\xf4\x41\xd4\x3c\x76\xa2\x3e\x3d\xa9\x3c\x7c\x4e\x4f\x82\xf4\x9a\x6f\x3d\xf8\xc0\xf9\xff\x31\x33\x46\x7a\xb7\xbf\xf7\x9e\xa5\x89\xb4\xca\x09\xd5\x35\x13\x46\x68\xd6\xbd\x9f\x3f\x70\x9c\xe9\x63\x5f\x45\x55\xa8\x33\x51\xcd\x0a\x25\xf9\x09\x51\x4e\x2a\x3c\xe4\xf3\x9a\xc6\xe7\x93\xd0\xc8\x58\xb8\xf0\x74\x48\x28\xe8\x66\xc3\x61\x67\x14\x75\x8f\xac\x60\x8a\x48\x48\x57\x9d\xdd\x9a\xcf\xbe\x6d\xf6\x44\x47\x0e\x8e\x9f\x36\xa4\xda\x13\x88\x51\xe3\x15\x6b\x9b\x4b\x5c\x98\x0f\x7b\xc3\x21\x62\xc4\xeb\xea\xbd\xd9\x7b\x55\x91\xf5\x03\xed\x96\x6e\x7e\x34\x90\x3b\x26\x5d\x79\x51\xbd\x08\x6f\x9a\x95\xa4\xea\xa2\x35\x17\x4c\xb8\xaa\x31\xd4\x94\x68\x1f\xb5\x6a\xef\xaa\x66\x66\xf3\xee\xdd\x5b\x1d\xe7\xad\xdb\x7b\xc5\xf4\x7b\xc6\xb5\x57\x2d\x63\x2b\x12\xd7\xf5\x2e\xdf\x79\xc3\x2b\xb7\x26\x23\xfe\x9d\x8a\xdf\xc5\x2f\xd8\x0f\xe4\x61\xbb\xbc\xb5\xe5\xb3\xff\x9c\x33\x6a\xe4\x83\xc5\xa3\xb3\xf3\xd1\x96\x8e\x61\xe6\xa2\x2a\x74\x51\x22\x56\x54\xd2\x2e\x2b\x6c\x11\x8b\xd9\x30\x1b\x16\xa2\xbe\x98\x83\x6f\x47\x02\x08\xfe\x82\x69\x5a\x09\x97\x2a\x72\x38\x7c\x9a\x2a\x2a\x82\x77\x64\xc5\xb4\x68\xb6\x99\xdb\x7a\xbc\xc6\x98\xf1\x79\x5c\xcd\xcd\x4e\xe7\x08\x56\x8c\xfe\x78\x75\x0d\x6b\x29\x8b\x61\x0f\x13\xc2\x7e\x9e\x0e\x05\x0c\x7f\x66\x20\x6b\x2f\xba\xe7\xca\x56\xce\xf2\x6f\x1d\x93\xaf\xbc\xeb\xc2\x92\x49\x89\x46\x6f\xcc\x1b\x1f\x63\xf8\xaf\x5f\x2f\xc3\x4e\x73\x0e\x53\x9a\x48\x8f\x4f\xae\xac\x8e\x5d\xee\x19\x7b\xfd\x73\x1b\x6d\x8f\x77\xdd\x53\x57\x8e\x11\x55\x9f\xbc\x5d\x72\x2b\xe2\x7d\xbb\xb7\xcf\xb9\x69\xfa\x88\xb2\xe0\xce\xc2\xd0\xd9\x9c\x99\x0e\xe4\x41\x3f\x49\x14\xab\x8a\xcb\x29\xf0\x1a\xef\x52\x54\xa2\xf1\x02\x1f\xe0\x31\xcf\xf1\x2c\xfc\x92\x7d\x8b\xfd\x98\x25\x14\xa3\x2b\x21\xa9\x49\x56\xd3\xdd\x1e\xc0\x1a\xf6\xb8\x75\x82\x05\x06\x7e\xc5\xfc\x81\xf9\x84\x21\x8c\x20\xa9\x49\x46\xd3\xbc\x9c\x74\xda\xeb\x00\x87\x83\x70\x98\x88\x02\xf4\x38\x65\x19\x6b\xdd\x0c\x71\xf0\xd8\xa6\x2d\xca\x62\x70\xc7\x21\x66\xc4\x68\xec\xa9\x59\x2a\x24\x9a\x5e\xa1\x23\x7f\xa3\xba\x66\x23\xfb\xe2\x8b\x2f\xbe\xa8\x81\xf5\x1d\xcd\x48\x6b\xf4\xbb\xf6\x37\x5f\xb4\x42\x00\x12\x01\xc3\xfa\x53\x8b\x90\x70\x85\xad\x38\xb0\x7a\xc5\x17\x7b\xb1\x70\x10\x4b\x7d\x5f\xac\xdc\x5d\x0f\x85\x15\x65\x86\x5b\x1f\x57\x60\x17\x2d\x4f\x75\x58\xaf\x64\xd2\xe5\x4b\x1f\x9b\x3c\xf9\xe9\x39\xd6\xb3\x8f\x47\x88\xb9\x8d\xda\x2b\x3f\xfa\x5d\xe2\x52\xdd\xed\xf1\xfa\x04\x51\xf3\x7a\xdc\x3a\xa3\xb5\x89\x20\xb6\x49\x6c\x3b\xb7\xc7\xb1\xdf\x81\x6f\x75\x6c\x77\x60\x87\x20\xab\x49\x87\x5f\x76\xba\x14\x0d\x6b\x8a\xcb\x29\x33\xf8\x65\x04\x3f\x47\xf0\x28\x82\x0d\xe8\x5e\x84\xaf\x46\x90\x4d\x0d\xd4\x23\x40\x9a\xb6\x81\xbb\x97\xc3\x5e\xae\x8c\xc3\x1c\x07\x52\x12\x03\x06\x86\x08\x29\xbf\xcf\xd2\xa9\x1e\x51\x4e\xfa\x7c\xe0\x50\xb5\x0b\x1c\x8a\xe8\xc5\x5e\x89\x03\x3b\xcb\xde\xd2\xf2\x8f\x17\x2d\xab\x13\xb5\x37\xe8\xb9\x34\xdd\x21\x7b\xc6\xc7\xee\x89\x19\xb6\x47\x2f\x5a\x7b\x94\x56\xfb\xd5\x7f\xa4\x35\xe4\x6f\xcc\x7e\x93\x4e\x77\xd1\xfd\xd1\xac\xbd\xd2\x2d\x09\x73\x11\xde\xc0\x6f\xc3\xbe\x67\xf7\x5f\xbc\x73\xc9\xfe\xa7\xe1\xa9\xfe\x48\xa4\x50\x90\x85\x50\x49\x89\xf3\x0c\xd3\x61\x67\x04\xb3\x91\xd2\x9c\xae\x74\x67\xa8\x70\x46\x7a\x76\x89\x2d\x27\xf3\x11\x62\xce\x50\x6e\xd5\x02\x60\x12\xb7\xbe\xec\x84\xa7\x9d\xb0\xdb\x09\xd7\x3a\xc1\x19\xbc\xc5\x0b\xb3\xbc\x4b\xbd\x38\xe0\xf7\x79\x55\x25\xa8\xf8\xfc\x01\x12\x54\x3a\x3d\x8b\x3c\x1b\x3c\x24\x2f\xbf\xc0\x03\x38\x88\x0b\xf2\xf3\x08\xfe\x83\x0c\xaf\xc8\xb0\x4a\xde\x23\xef\x97\x89\x1c\x0c\xba\x08\xa7\x83\x7e\xda\x0d\xbf\x71\xc3\x53\x6e\xd8\xed\x86\x2e\xf7\x32\xf7\xad\x6e\xc2\xba\xc1\xed\xe6\x15\xea\x2f\x62\xc0\x71\x02\x95\x04\x02\x04\x08\x91\xb8\xd3\xbc\xa6\x42\x8f\xc7\xeb\x49\x79\xac\x48\xd9\xde\x49\x0f\xc3\xf6\x38\x24\x09\x07\x65\x81\xb8\x95\xac\x94\x19\x2d\xc6\x11\x5b\xce\x68\x49\x49\xfd\x3c\x4e\xd5\x4b\xdc\xf2\xca\x9f\x4b\xc7\xd2\xcf\xd9\x0e\x3a\x7d\x47\xe5\xef\x3b\x7b\x7b\xb6\xe4\x01\x4d\x79\xa7\xd3\xe9\xea\x1a\x6b\x73\xdd\xd9\xde\x69\x77\x4e\x14\x8d\x9c\x28\xbe\x15\xdb\xb3\xa7\x77\x00\xed\xde\x0d\x15\x3b\x9f\x80\x35\x7b\x1e\xaf\xda\x25\xf4\xe9\xbe\x11\xb2\x5c\x4e\x5b\xa8\xb3\x85\xf4\xbb\xf1\xa5\x59\xb9\xec\x98\x3e\x6f\xdb\xe4\xc9\xdb\x66\x5b\x7b\x7d\x3d\x42\xac\x15\x8f\xba\x51\x11\xfa\x55\xe2\x3a\xcd\xd9\xee\x5a\xc4\xc2\x74\x16\xd8\x76\x86\xf3\x70\x63\xb8\x49\x1c\xf3\x4f\x0e\x5e\xe5\xe0\x59\x0e\x1e\xe5\x60\x19\x07\xb3\x38\x38\x97\x03\x83\x83\x7c\x5a\xea\xb3\x1b\xd6\x74\x87\xe4\x96\xdc\x42\x20\x24\x92\x60\x08\xa3\x05\x21\x08\x85\xb0\x78\x44\x02\x45\x02\x24\x81\x84\x11\xa4\x00\x43\xc8\x12\xc9\x40\x30\x10\x70\xc8\x29\x5d\xd3\xc0\xad\x28\x22\x76\xe5\x84\xd1\x88\xc5\x5a\x8c\xec\x1e\x6a\x36\x7d\x1d\xc4\xd2\xcf\xc5\xd2\x2b\x56\x3c\xa7\x35\x06\x63\x69\x63\xe3\x91\x23\x1b\x8f\x1c\x01\x83\x0e\x19\x42\x20\x96\x1e\xdc\xd4\x74\x3a\xbd\xa2\x9f\xf6\xc8\x9f\x25\x8d\xee\x48\x76\xdb\x7c\x2e\xcc\x1b\xa3\x49\x45\x84\x3c\x04\x97\xee\x79\x60\xec\x23\x63\x1f\x7a\xf4\xc7\x5f\xed\xdc\x09\x15\xf7\xcd\xf1\xe6\xe5\xcb\x4f\xcb\x05\x79\x5e\x06\x0f\x17\xcd\xc1\x40\xfe\x97\x5b\x3b\x7b\xe6\x46\x22\x73\x7b\x3a\x83\xc3\xf5\x58\x04\x95\xa3\x0b\x13\xa3\x4a\x1d\x79\xa7\xb9\x8e\xfc\xae\x7c\xec\xcb\x87\xfc\xfc\x11\xa8\x4c\x92\xf4\x11\xe5\x3c\x1f\xa9\x40\xc1\xc2\x79\xa5\x0e\x8e\x43\xe5\xdd\x02\xc9\xb7\x9b\x5f\xec\x38\xdd\xa0\xd6\x47\xa3\x94\x94\xf4\x0f\xbb\xea\xd8\x1f\x6f\xac\xae\xa9\x71\x37\x93\x7a\xa8\x0d\x7b\x21\x44\xfc\xee\x08\x19\x4d\xb2\x70\x51\x2e\xcc\x13\x11\xc2\x2b\xbc\x35\xe7\x5d\xd9\x69\xee\x25\xc7\xcc\xbd\xb3\x56\x74\xc4\xbc\x2b\x1e\x5b\xa1\x97\xd4\xb4\xd6\xf9\xf7\xf8\xea\x5a\x6b\x4a\xf4\x15\x70\x04\xca\x32\x4f\xc1\x4b\x17\xdd\x32\x7f\x2c\x07\x1f\x6f\xde\x6c\x06\xb9\x86\xf9\x9b\x3a\xcd\x26\x78\x2e\xd9\xdd\xe8\xcf\x24\xf1\x7e\x7f\x63\x77\xd2\x6c\x21\x3d\xb0\x97\xce\xa0\x21\xc4\xbc\xc0\x74\xd0\x67\xba\x3a\x31\xa9\x74\x91\x03\x1c\x79\xed\xdc\xd3\xf9\xf0\x68\x3e\xdc\x9d\x0f\x9b\xf3\xe1\xba\x7c\x98\x95\x0f\x93\xad\x67\xac\xd0\xca\x11\x0f\xd6\x13\x96\x29\x12\x48\x92\x26\xf1\xbc\x10\x2c\xb8\xc0\x7e\xd6\x94\xa0\xe4\xeb\x34\x25\x31\xf4\xac\x76\x3f\xaf\x11\x4b\xd3\xc7\x4d\x67\x9f\xd7\x1e\x6d\xe9\x8f\xa7\x1b\xab\x6b\x8c\xff\xdb\x53\x83\x3b\x2c\x5d\xeb\x1d\x39\x61\x41\xca\x7c\x8b\x3c\x65\xfe\x2e\xb5\x60\xc2\x28\xdf\xb5\x4f\x5d\xe3\x29\x8d\x4d\x30\x98\x5d\x8c\x31\xa1\xba\xd4\x73\x2d\xec\xf9\xda\x0c\xc2\xf4\xf1\x0b\xcf\xaf\x11\x61\xc1\xd2\xa5\xe6\x83\x42\xcd\x79\x8b\x9a\xcd\xc7\x21\x55\x97\x8c\x6a\x99\xaf\xb1\xa4\x45\x93\x75\x66\x2f\xbe\x11\xaa\x6c\x5d\x33\x07\x21\xe6\x53\xb6\x0f\x8d\x40\x51\xb4\x32\x91\xa8\x54\x8b\x4e\x3b\xd8\x62\x28\x2e\x46\xfe\xd3\xbe\x91\xb3\x15\x05\xf9\xc0\x17\xed\x92\xe5\x11\xa7\x99\x18\x02\x84\xb8\xd3\xc5\x7c\x35\x8f\x79\x45\x96\x9d\x4e\xa1\x24\xc4\xf6\x54\x4a\x12\x8a\x0a\xa4\xd8\xcf\xdb\xe7\x1b\x6f\xb1\xf4\xc0\x8b\x9f\xc7\xe3\x76\x2a\xd5\xf6\xe7\xd3\x46\xbf\x11\xeb\x8f\xa5\x0d\xcb\x67\xca\x06\x6e\x8d\x35\xd5\x61\x77\x33\xd4\x67\x65\x94\xfc\xfb\x87\x87\x9e\x06\xd1\xed\x7f\x65\xf7\x6e\x58\xfb\x35\x19\x6b\x9a\xe7\x5c\x38\xa6\x50\xaa\x7f\xac\x5e\x54\x0b\x46\x97\x0b\xbb\x84\x8a\xaa\x02\x55\x6c\x80\xfc\xf7\xcd\x09\xf0\xd2\xb4\x4b\x47\xd8\x37\x1e\xfa\xed\x93\x9f\xb7\x69\x86\x75\xf2\xed\xdd\x0d\xf6\xc9\x37\x74\xb7\x9b\x2d\xa4\x0b\xf6\xdb\x7b\x90\xd3\x01\xd6\x1e\xdc\x93\x98\x5d\xa9\x16\xb5\xe7\xd9\x15\x7a\xb6\x18\xbe\x2a\x86\x17\x8b\xa1\xaf\x18\xae\x2e\x86\x25\xc5\xc0\x59\x7b\xe3\x43\x23\x93\x8a\xe2\x6f\xa7\x7b\x93\xec\x91\x41\x96\x47\xb4\x8f\x64\x80\x79\x92\x22\x06\x72\xed\x56\x38\x86\xf9\x50\x49\x09\x9b\xa2\xbb\xe3\x14\x14\x6b\x7b\xbc\xf6\xf6\xd8\x7a\xf2\x1f\x47\x62\x59\xbc\x81\x58\xda\xb0\xbb\xe3\x62\xb9\x9e\x86\xac\x68\xac\x30\xd2\xe9\xef\xdd\x25\xf2\x6f\x76\x69\x65\xbb\x23\x4f\x3b\xb6\x73\x27\xac\xff\x2b\x71\x7c\x31\x7e\x8a\x51\xec\x6a\xdf\xd5\x2e\xbb\x0b\x2a\xc3\xe2\x23\x62\xb8\x32\xdf\x23\x9f\x07\x95\xcf\x99\x6b\x60\x7a\x7c\x62\x71\xf6\x76\xcf\x5d\xba\xd4\x7c\x48\xa8\x39\x7f\x31\x15\x94\xda\xb6\x51\xba\x25\x28\xfa\xa8\xb6\xda\x41\x41\x01\x74\xb5\xd9\xca\x54\x70\xc7\xd0\x35\xe8\xc6\xc4\xa4\xf9\x6d\xd3\xa6\x9d\x3f\x6b\xd6\xa5\x8d\xb3\x17\x2f\x1e\x35\xfb\x4a\x5d\xbf\x72\xd5\x14\x74\x3e\x9c\x7f\xfe\xc4\x49\x93\x4a\xe2\x71\xb6\xab\xa4\x2b\x9d\xe8\xec\x9c\xb2\x6e\x62\xf3\xbc\xf9\x97\xc6\xe7\x19\xc6\xb4\xb6\x49\xf3\x99\x8a\x1e\xa4\x2b\x52\x77\xc0\x5d\x58\x88\xdc\xa8\x25\x1e\xb3\xd9\xbe\x29\xef\x92\x15\xe7\xa9\xfd\xf1\xbc\xdf\xc4\x63\x39\xf0\x62\xcd\x88\xd1\xab\xa2\xbe\x1e\x8f\xa9\xd6\xc6\xc4\x2d\xef\x45\x33\x0c\xcb\x8b\xcb\xcd\x67\xda\x5c\x16\x5e\xcb\x85\x1b\x0e\x15\x6d\xbb\xda\x14\xcb\x6a\x88\xaa\xc3\x0a\x1a\xeb\x6d\xec\x63\xf0\x0f\x1b\x4e\x74\x61\xde\x9e\xeb\xe3\xbd\xf6\x2b\x2e\x6c\x9b\x3d\xc6\xe3\x2a\x1d\x1f\x3b\x67\xde\xf4\x69\xf1\xce\xb9\x41\xa1\xb8\x76\x4a\x6d\x4d\x5b\xc7\x9c\xd6\x25\x1b\x53\x45\x35\x8b\x7e\x74\xc9\xac\x75\xd3\xca\x1b\x96\x6c\x9d\x75\xa8\x77\xce\xed\xf3\xe2\xe5\x93\xba\x1b\xeb\xe7\x75\x4e\x2d\x9f\xd3\xf4\x9f\x8b\x02\xf5\x75\x71\xcf\x6a\x63\x7e\x5d\xde\xd8\x89\x93\x47\x16\xc5\x5c\x8e\xb0\xe6\xab\xa9\x1e\xed\xb9\x70\xcd\x45\x51\x63\xf6\x9a\xc9\x33\x37\x75\xd7\x4c\xb8\xe9\x05\x8f\x5e\x5c\x19\xf0\x95\xe6\xb9\x18\x86\x09\x28\x7d\xbc\xae\xca\x84\xe0\xca\x64\x4f\xfd\xb8\xf9\xad\xe5\xe5\xc9\x65\x13\xdb\x16\xb6\x14\xde\x57\x91\x5c\x38\xbe\xee\xc2\xb1\x21\xbd\xa8\x2a\x7f\x4d\xf5\x64\x2d\x34\xa1\xa5\xd1\x9f\x5f\x32\xaf\xa1\xb4\xb5\x21\x22\xb2\xd7\xb2\xbc\xbf\xb2\x21\xec\x6c\x99\x73\xcd\xb9\xed\xab\x66\x36\xca\x9c\xa3\x71\xd6\xb5\xc9\x9e\x1d\x57\x25\x10\xa0\x2d\xe6\x4a\x46\x60\x2f\x40\x97\xa3\xdd\x89\x1e\xcf\xe4\xd6\xbc\x5b\x7a\x60\x69\xcf\xea\x1e\x3c\xb6\x07\x2a\x7b\xa0\xe7\x25\x09\x16\x4b\xd7\x4a\xf8\x5c\xe9\x22\x09\x57\x48\x20\x2d\x5b\x96\xee\x6c\x55\x18\x46\x51\x6a\x6a\xf2\xae\x48\x2c\x5e\xb4\x68\x4e\x3a\x7d\xce\xd4\xa9\xa5\xed\xe7\xf0\x17\x20\xb4\x78\xdd\x9c\x59\x53\x7a\xbc\x53\x53\xa9\xd4\xb2\xb4\xd4\xa3\xb6\x4e\x29\xaa\x19\x5d\x99\xaa\x8f\x8f\x1b\x57\xe4\xa3\x2d\x3a\xdf\x3d\xd3\xd7\xe2\xb1\xfe\x61\x27\x6a\xe4\x59\x27\x1a\x8f\x19\x31\xb5\x3f\xeb\x07\xd8\x9d\xc8\xaa\xe5\xa0\xc3\xd0\xc8\xe8\xd9\x87\x12\xf9\x9f\x9c\x79\xf9\xe0\x91\xe7\xc6\x79\x87\x1d\x38\x59\xe3\x2b\xd2\x5c\x3e\xd7\xe8\x39\x23\x9b\xe6\x9f\x5b\x5e\x10\x6f\x8b\xc6\x2e\x1c\x5f\x5a\xbf\xfa\xf0\xc6\x8e\x59\x31\x45\x29\x4b\x54\xd7\x5d\xb6\xa8\xab\x34\x39\xc5\x25\x95\x46\x47\x7b\x4b\xe6\x5c\x7a\xed\xb8\xee\xeb\xce\xcd\x8b\x5c\x74\xc7\xe5\xd3\xd6\x5c\x54\xb5\xfd\xe1\xbb\x57\x37\x2d\xef\xac\x5d\xbf\x7a\xea\x5d\x17\xb6\x34\x5f\xd3\xea\x8d\x55\x57\x79\x56\xd7\x2d\x6c\x28\x18\xdf\x76\x21\x7b\x01\xc3\x5d\x4d\xc8\xe4\x66\x79\xf4\xa4\x39\x4d\xf1\x29\x4d\x95\x4e\x87\x33\x3a\x61\x4e\xf3\xc4\xab\x3b\x6b\x5c\x79\xe5\x7e\x5f\x24\xe0\x24\x0c\xf1\xb9\xef\x93\x14\x89\x23\x84\x44\xcf\x9d\x51\x65\x74\x4d\x1c\xe1\x8e\x9e\x6b\xcc\x9d\xbd\xcd\x11\x99\x50\x77\xfe\xf9\xe5\x25\x77\x15\x94\x08\x05\x8d\x0d\x86\x37\x3f\xd2\xd3\x50\xd2\xda\x58\x3a\x30\x90\xc3\x6c\xd4\xb9\xc3\xab\x68\xae\x28\x3b\xeb\xaf\x73\x87\xef\x3f\x0b\xbf\xd6\x8d\x42\xa8\x12\x45\x13\xbe\x60\xd9\x6c\x14\x2d\xcd\x9b\x2d\xe5\xf5\x94\x96\x7a\x8a\xba\x15\xc6\x93\xe5\xbb\xc9\xa6\xfe\x68\x77\x99\xb5\xe1\xdf\x66\xbb\x09\x81\x0e\xf1\x66\x5c\x1f\x0e\x11\x37\x0d\x06\x47\x93\xb3\x49\x6e\x36\xfe\xf2\xc6\x44\xe6\xf3\x19\xd7\x4f\xad\x60\x32\x8b\x99\x11\xa9\xeb\x67\x5e\x74\xdd\xb4\x91\x2c\xde\xc6\x8e\x9c\xba\xea\x3b\xf4\x36\x97\xbc\x64\x7e\x96\xe1\xdb\x36\x3c\x7f\xdd\x75\xcf\x6f\x68\x63\xb6\x4f\x5c\xb7\xff\xea\xab\xf7\xaf\x9b\x68\xf7\xcf\x65\xeb\xe1\xc8\x8d\x82\x28\x64\xad\xbb\xd0\x97\x44\xc5\x05\xfe\xa4\xe4\x4f\x15\x14\x78\xf2\x52\x8a\xea\xc9\x72\xda\x7c\x67\xdd\x67\x63\xc3\x43\xb1\x3b\x1c\x02\x77\x31\x09\xe3\xb3\x59\x6c\x16\x3f\xb5\x61\x8a\xe9\x82\xbc\xbc\xcc\x7d\x8e\x07\x7f\x68\xfe\xbd\x18\x2f\x8c\x9c\xcd\x5f\x33\xf9\x8e\x37\x33\xbf\x87\x05\x3f\xff\x19\x99\x64\x1e\x80\x56\x4b\xdf\xb5\x20\xc4\x86\xd9\x17\x50\x01\x9a\x9a\x88\xe5\xe5\xb1\x41\xae\x9e\x83\x72\x0e\xb8\x00\xdf\xc0\x63\xde\xa9\x39\x05\x14\xac\x0e\xa6\x82\x3d\x41\x26\x28\x0a\x79\x68\x5e\xd0\xc7\x08\xc4\xc9\xeb\x9c\x4d\xd4\xde\x42\x1d\x1c\x4a\x1c\x67\xc9\xb8\x8d\x0c\x15\x8f\x65\x03\x6c\xb0\x42\x2a\x4b\x28\xa1\xde\x3d\xa8\x89\x98\x7d\x91\xda\x91\xa5\xba\xf9\xd6\x6f\xcd\xf1\x2f\x81\x94\x57\xa5\xb9\x46\xe6\xdd\x5e\x3c\xee\xbc\xc5\x93\x23\x93\xf2\xfc\x75\x6c\x55\x59\x72\xf1\x84\xd3\x9f\xb2\x7d\x67\x2e\x4b\x3f\x33\x75\xca\xb3\xf3\x30\x5a\xf1\xe0\xfc\xa8\x53\xb8\x4f\x74\x22\x40\x17\x20\xc4\x3c\xc1\x5c\x80\x22\x28\x95\x30\xc2\x81\x92\x45\x25\xd7\x94\x60\x7f\x49\x7d\x49\x5b\xc9\x8c\x12\xa6\x24\x10\x19\x11\x69\x88\x90\x88\xa8\x8a\x28\x16\x80\x00\x50\x24\x4c\x54\x22\x46\xbc\x05\x53\xbd\x8a\x0d\xab\x65\x77\x1d\x7d\x6b\xd9\xd5\x35\x6e\xc3\x1d\x62\xed\x64\xd2\xd9\x8a\x13\x22\x17\x3c\xfb\x81\xe0\x0d\x04\x3c\x2a\xe1\xf8\x60\xa8\x48\x5e\x14\xaa\x3d\xe7\xc2\x71\x79\xa3\x5c\x8e\x62\x3d\x6f\x44\x71\xa1\x62\x7e\xfd\x31\xd3\x91\xd9\xe9\x6b\x69\xed\x98\xd8\xa8\x87\xd2\x8b\x17\x96\x41\x22\x7d\xf5\xc4\x00\x4f\x36\x12\xd6\x3d\xe2\x9c\xd1\x67\xfa\xa9\x4c\xd3\x3d\xe7\x57\xea\xe5\x47\x7c\x14\x9b\xfb\xa2\x81\x0f\xe0\x02\x9a\x3d\x2f\x64\x69\xf6\xfc\xb2\x7d\x35\x85\x42\xf0\x2c\xcc\x03\xfa\xcc\x5c\x58\x2f\x3f\xe2\xa7\x38\x03\x17\xfd\xde\xce\xb7\x97\xda\xf9\xf6\x3b\xf6\x35\x94\xa2\xc0\x59\x73\xcc\x04\xb5\x9a\x1e\xe6\x2d\x7a\x57\x2a\x50\x12\x2d\x4f\x4c\xba\x25\x79\x7f\x12\x27\x55\x87\x9a\x4c\xc6\x46\xd4\x9f\x73\x4e\x45\x25\x70\x95\x50\x79\x8a\x1b\x01\x23\x46\x84\x4e\x29\xd4\xaa\x8f\xa8\x03\xb1\x0e\xea\x4e\x9d\xa8\x87\x7a\xcf\x29\x29\x19\x6b\x9f\x34\xbe\xa0\x6e\x84\x12\xe9\x56\x98\xa0\x75\xb3\x9e\xb3\x76\xaf\xe5\x35\xcd\xda\x41\xcb\x94\xa7\x6d\x78\x32\x83\xfe\xd5\xa0\x84\x57\x74\x92\xf2\x7b\xee\xdb\xb7\x49\xa5\xca\xb2\x09\x3b\x52\xef\x36\x88\x8b\x44\x4a\xca\x2b\x6a\x43\x60\xc4\xeb\x5a\x00\x2f\x53\x1b\x2e\x4b\xa7\x2f\x6b\x50\xd5\xc6\xcb\xe6\xa6\x2f\x6d\x50\xcc\xd5\x52\xde\xe8\x48\xe9\xe8\xa0\x24\xe6\x55\x45\x4a\x47\xe7\x4b\xd0\xfb\xe0\x02\x46\x14\x05\xc2\x60\x96\xe7\x99\x65\x0f\x7e\xa9\x54\x36\xcf\x6c\x2e\xab\xf6\x7a\x62\xc1\x9a\x16\x77\x00\xbf\xd7\x67\x7e\x7c\xf8\xe2\xf9\x47\x20\xef\xe9\x9f\x81\xff\xb9\x85\x0b\x9f\x33\x3f\xd9\xfb\x2d\xe2\xa9\x0f\x33\x0f\xfb\x1b\xc6\xb7\x84\x82\xcd\x89\x71\x3e\x3c\xef\xb4\x6b\xca\xaa\x0b\xa3\x0e\xee\x0e\x96\x9f\x71\xf1\x2d\xd6\x3e\x5a\x3a\xe8\x35\x7a\x77\x0b\x51\x33\xba\x2f\xb1\x60\x66\xf3\x92\x66\xdc\xd8\xdc\xde\x8c\x47\x34\x43\x59\x73\x95\xb7\x08\x8a\xda\x43\x28\x04\x21\x84\xea\xa0\xae\x6e\x53\x10\x66\x06\x97\x04\x57\x05\x49\xb0\x7d\x96\xdd\x38\x84\xa4\x99\xa3\xa0\x7d\x14\x34\x8c\x82\xe0\x28\x10\x46\xc1\xa8\xf6\xaa\x9b\x3d\xb0\xc8\x73\x8d\x07\x7b\xda\xa5\xb2\xe6\xd0\xd8\x94\x91\x3f\x2a\xa4\x14\xa4\x14\xd5\x9f\xd3\x04\x2d\x46\x4b\xbf\xd6\xd8\x08\xb1\xfe\x74\xda\x9e\x27\xb0\x03\xa1\x7e\x9b\xfa\xdb\x48\xab\x14\x6c\xdb\x0e\x1e\xbf\xa5\x27\x58\x8a\xd2\x61\xd9\x87\xff\xdb\x2e\xaf\x2c\x6f\x5b\x94\x18\xbf\x20\x59\x31\xa2\x7d\xe1\xb8\xc6\x05\xed\x51\xf3\xfa\xa6\xc6\xab\xc7\x35\x5e\x05\x0f\x0c\xed\x2d\x27\x0c\xdb\x5b\x9f\xa7\xda\xde\xdb\x8a\x3d\xef\xdd\x30\x66\xcc\x0d\xef\xed\xd9\xf3\xce\x7a\xc3\x58\xff\xce\x1e\x9b\x0e\xeb\xc6\xff\xfb\x76\x52\xde\xb2\xcd\xcc\xf5\x5c\x25\x2a\x42\x2d\x68\x6e\xa2\xb6\xcc\xe1\x68\xf2\x46\x59\xb6\x36\xdf\x9b\xaf\x56\xcf\x46\xe7\x14\xcf\x2e\x52\x63\x2a\x56\x9b\xa6\x36\x74\x37\xe0\x86\x86\xda\xee\x80\x37\x9f\x44\x13\x23\x52\x23\xf0\x88\x11\x65\xdd\x02\xeb\xb0\x22\xf1\xd7\x2c\x6f\x3b\x9e\x7b\xcd\x0e\xae\xd0\xeb\x4c\xdd\xf1\x41\x32\x30\xde\x12\xc3\x1c\xb8\x45\xbd\xcd\x73\x16\x22\x96\x28\xfa\x73\xa4\x67\x96\x3c\x56\xd8\x1f\x73\x11\xe6\xfa\xea\x79\x77\x5d\xec\xea\xa8\x1b\xdb\xe6\x5a\x7c\xe7\xdc\x51\xa3\xe6\xde\xb9\xd8\xd5\x36\xb6\xae\xc3\x75\xf1\x5d\xf3\xaa\xcf\x3c\xe4\x8b\x4d\xae\xd3\x26\x1a\xd5\xe7\x6a\xf5\xe7\x57\xfb\x7c\xd5\xe7\xd7\xab\xad\xd5\x63\x26\x69\xb5\x1d\x31\x1f\x7e\xef\xce\x6f\x0e\xfd\x20\xaf\xb9\xb6\xb6\x39\xef\x07\x87\x4e\xde\x75\xe7\xd7\xbf\x58\x13\x6c\xae\x89\x37\xe5\xfd\xe0\x17\xdf\xdc\x75\x69\xdf\xed\x0b\x0b\xaa\xca\x2a\xaa\xf2\x16\x6c\xd9\x7f\xf9\xe5\x4f\x6f\xb9\x38\xaf\x7a\x44\xf9\xe8\xfc\x85\xb7\xed\xb3\xb9\xcf\xee\x67\x66\x32\x4f\xa0\x30\xaa\x43\x33\x13\xb1\x52\x87\xa3\xd6\x3b\x92\x65\x63\x85\xde\x42\x75\x54\x12\x35\x94\x24\x91\x0a\x6a\x6d\x77\x1c\xe2\xf1\xd8\xb4\x80\xb7\x50\x49\x55\x40\x45\x45\xe9\xc8\x69\x0e\x81\xf5\xa2\x96\xd7\x0c\xea\x64\xff\x6f\x76\x24\x84\xad\x2d\x51\xb3\x1b\x52\xa7\x8d\x29\xcf\x6e\x07\xc7\xcc\xac\x9b\xbf\xb9\x53\x1c\x57\x37\xb6\x49\x98\x76\xcb\xc5\x0d\xb5\xf3\x6e\x9d\x2e\x8d\x6d\xcc\x1f\x19\xf2\x30\xd3\x36\x2f\x68\x3c\xf3\xd6\x61\x47\x83\x51\xdd\x28\xbf\x70\x71\x8f\xdc\x58\x6d\xd4\xcb\x87\x71\xc5\xd5\xcf\xde\x36\xc7\x5d\x37\x6a\x54\x9d\x67\xce\x6d\xcf\x5e\xb5\xf2\xe0\x6d\xb3\xdd\x75\x23\x44\x6f\x69\x81\x7b\xf6\x6d\x07\x57\x9a\xfb\xdb\xca\x0b\x8b\xca\xdb\xa0\xe3\xd1\x97\x22\x23\x0b\x8b\x46\xb4\xd9\xfa\x8a\xd6\x5d\x84\xf1\xc8\x8b\x2a\xd0\x22\xb4\x2f\x71\x49\xad\x52\xd7\x52\x37\xb5\xae\xbb\x6e\x6d\xdd\x96\x3a\xae\xae\xae\xfa\xf4\xb8\x11\xad\x85\xbe\x92\xa0\x43\x6e\x2d\x81\x12\x59\x2e\x01\x92\x1a\xb7\x64\x06\xea\xac\xee\x4c\x74\xa6\x3a\xaf\xe8\x5c\xd7\xc9\x75\x76\xce\x39\x9d\xaa\x9d\x31\xc3\x98\xd5\x7d\x61\x5d\x67\xe7\x85\x85\x65\x79\x79\x53\x83\xdd\xc1\xe5\x41\x12\xbc\xb0\xac\x0c\xf3\xaa\xea\x40\x53\x31\x60\xdc\x78\x21\xb3\x68\x51\x74\x5e\x77\xeb\x39\x93\xdd\x59\x92\xe7\x58\x0b\x75\xc5\xed\x70\x3d\xa6\xbe\x9c\x8e\x53\x57\xdc\x4e\x52\xd0\x6a\x44\x9c\x7a\xea\x76\x2a\xd9\xfa\xa7\xb8\xfa\xde\x6b\xf4\x9f\x63\x69\xc3\x06\xb5\xa3\x0c\x28\x85\x10\xa1\x98\xa1\x21\x6c\xf0\x1e\xca\x87\x62\xc9\x98\x4d\xee\x43\xac\xcb\xf7\xff\x5c\xe0\x69\xc6\xf5\xe4\x3d\x57\x6a\xe3\x95\x73\xcb\xa3\xf5\x37\x5f\xb3\xb8\x6e\xd9\x15\x6b\x3a\x3e\xb9\xf6\xba\x71\x0d\x45\xa5\x45\xf1\xd1\x4d\x93\xd6\x94\x76\x19\xff\x6f\xe5\x9f\xfc\xaa\xca\x11\x5e\xfe\xd5\xf5\xa5\x23\x4b\xab\x6a\xd5\xc8\x25\x0b\x4b\x47\x96\xfe\xf9\xfc\x95\x45\xe7\xf9\xaa\x82\x6e\x5d\xcd\x2b\x28\x2b\x6f\xfd\xd7\x27\x8d\x13\xbe\xb7\x42\x24\x7a\xc2\x81\x40\xd8\x23\x7e\x6f\x85\x48\x2b\x1e\x5d\x40\xcf\x74\xe6\xc0\x71\x66\x25\x2f\xa0\x26\x34\x0d\xcd\x47\x0f\x26\x2a\x95\xd8\xe1\xd8\x40\x8c\xc4\x12\x0e\x2d\x19\x8b\x55\xb6\x87\x89\xa3\x7e\x41\x6b\xfb\xcc\x0b\xd2\xe9\x8b\x2e\x1a\x3f\x3e\xe9\x40\xee\x5e\xf7\x09\x37\x71\xef\x1f\x38\x92\xa8\x72\x68\x49\xb7\x3b\xd8\xee\x98\xd9\xd3\x79\x51\x4f\x4f\x72\xe2\x79\xe3\xc6\x8f\x57\x92\x90\x4c\x5e\x34\x7a\xd4\x28\x8f\x6f\x5a\x3c\xe6\x56\xd5\xf2\x70\xc1\x34\x82\xb8\x21\xa2\x6e\xfa\xa2\x19\xaf\xc7\x29\x86\xd5\x6b\x71\xeb\x28\x5f\xd3\x1a\xe9\xe9\x45\xd3\xea\x8b\xb6\x57\xfe\xde\x2b\x31\x43\xfd\x93\xd6\xd8\xd8\x6f\x8f\xfe\xb3\x25\xb6\xd0\x0f\x51\x07\xf2\x83\x2c\x3c\xcd\xb8\x9e\x26\xcd\xb3\x83\xbc\x43\xe8\x39\xee\x7f\x77\xe0\x75\xc3\xce\xbb\xb0\x79\x76\x71\xf1\xcc\x71\xe7\xad\x9d\x1d\x1f\x71\xde\x65\x93\x46\x77\x47\x8c\x9a\xe6\xf6\x49\x8b\xba\xf3\x46\x8f\x28\x51\xd4\xc8\x88\x58\xc1\xdc\x85\x93\x3a\xc6\xc6\x8d\xc8\xdc\xaa\xd6\xcb\x26\x57\x18\x5d\x3f\x58\x2a\xa4\xd6\x5f\xde\x33\x3a\x5a\xbf\xe1\x9a\x25\xcd\x97\x5e\x7a\x6d\xc7\x27\xab\x56\x5f\x95\x3d\x69\x4f\xa4\xb8\x38\x32\xee\xe6\xb7\x1e\xf8\xd1\x3b\x9b\x9a\x3d\xc1\x3b\x42\xaf\xfc\xfe\xcd\x17\x5c\x81\x90\xaa\x86\x02\xae\x17\xde\xfc\xfd\x2b\xa1\x3b\x82\x9e\xe6\x4d\xef\xfc\xe8\xde\x63\x9b\x5a\xb8\xc7\x6e\x28\x8d\x96\x8e\x1e\xa3\xf9\x2f\x5d\x91\x3b\xdf\x4a\xc3\x3a\xde\xfc\xf2\xf2\x56\x4b\xef\xd0\x7b\xc7\x33\xc8\x89\x3a\xd0\x7f\x25\x16\xe4\xe7\xbb\x4e\x27\x51\x53\x71\x13\x6e\x6a\x62\x93\xf0\x52\xf2\xff\xe3\xec\x5d\xe0\xa3\xaa\xae\xfd\xf1\xfd\x38\xe7\xcc\xfb\x3c\xe6\xfd\xcc\xcc\x64\x32\x33\x49\x26\xc9\x4c\x66\x98\x3c\x08\x49\x86\x87\xc9\x24\x40\x32\x60\x04\x0c\x0c\x89\x82\x02\x2a\x60\x44\x44\xa5\x88\x14\x11\xf1\x85\x54\x45\xa4\x88\x94\xcb\xa5\x96\xfa\xd7\xd4\xc6\x88\xd0\x0a\x2a\x62\x2d\xe2\xa3\x6a\x2d\xd7\x8b\x35\xb7\xaf\xdb\x8a\x15\xbd\x5e\x6b\x89\x39\xf9\x7f\xce\x3e\x67\x26\x93\x40\xfb\xbb\xf7\xea\x87\x40\x92\x33\xeb\xb5\xd7\xde\x67\xaf\xbd\xd6\xfe\xae\x0f\xd2\x88\x49\xef\x4c\x1f\x4c\xe3\x74\x3a\x69\x19\xa6\x10\xa6\x19\x46\xad\xd2\x68\xb5\x3a\x9d\x0a\x63\x3d\x07\xbd\x10\x41\xff\x2c\xa0\xe7\xf5\x48\x3f\x75\x38\xd9\xd6\x56\xd7\xe2\x9c\x32\xc5\xde\xd4\x53\xe7\x6a\x68\xa8\x33\xd0\x1a\x15\xd6\x15\xd5\x51\x6c\x3a\xcd\xb7\xf4\x44\x42\xb1\xdc\x74\x13\x12\xcd\x89\x8f\xe3\xf1\xb3\xf1\xd3\x63\x73\x4c\x4e\x8d\x0e\x9d\xc8\xf2\x1f\x9f\xc8\x0a\x36\xb9\x8e\x5f\x59\xc0\xe4\x02\x9e\x3e\xa5\x3e\x53\x9a\x6e\xaa\x40\x38\xa0\xfc\x49\xc2\xff\x63\xde\x14\x9f\x9d\x1b\xa8\xde\x5e\x1d\xa8\x7e\xa8\x3a\xd0\x09\xdf\xfc\x3f\x24\x51\x55\x94\xeb\xe9\x65\xcb\x96\x2d\x7b\xda\xf5\xf7\xc1\xff\x6b\x3e\x15\xc9\xf9\x54\xfa\x00\x30\x80\x3a\xf0\x66\xca\x61\x8d\xc2\x68\x20\xe6\x69\x63\xea\xac\x75\xc8\x5a\x17\xaa\x6b\xa9\x9b\x57\xf7\xeb\x3a\xba\xee\xf0\xe8\xf9\xd4\xb5\x82\x39\x5d\x67\x66\xd5\x31\xb8\x2b\x76\x38\xf6\x9b\xd8\x7f\xc6\x28\x47\xac\x2c\xd6\x16\xbb\x32\xb6\x22\x46\xbb\x26\xc5\x70\x19\xcb\x95\xba\xeb\xdc\x48\xeb\x86\x6e\x37\x57\xd6\x76\x89\x61\x83\xb0\x7c\x32\x20\x8d\xac\xf9\x36\x2e\x10\xb3\x4c\x72\xb9\x38\x56\x1e\xad\x32\x37\xc7\x99\x59\x0b\x68\x4e\x34\x27\x72\x43\x24\x2d\x77\xcd\xd2\x1a\x78\x32\xcb\x7f\x7c\x72\xe2\xd8\x7c\x46\xc6\xc6\x58\x6f\xb4\xd5\x67\xb3\x7d\x42\x22\x11\xc9\xf6\x0d\x09\x89\x84\xb4\x35\x19\x37\x4c\xa6\xff\x51\xc6\x16\xbf\x2d\x0d\x4a\xbc\x38\xbe\xbd\x3a\x90\x99\xfc\x3f\xce\xde\xd2\x07\x72\x23\x71\x61\xd1\xff\x36\x93\x4b\xb0\x6f\x44\x33\xc1\xbe\x09\x80\x49\x29\x17\xdf\x2d\x08\x76\xbf\xcf\x17\xa4\x17\x02\x3b\xb4\xfb\x41\x8f\xcf\x43\x71\xda\x1e\x93\x89\x07\x51\x19\xc2\x87\xbc\x65\xa5\x78\x5f\x0a\xda\xe4\xa0\x27\x17\xbc\xd7\x92\x23\xab\xc2\xee\xaa\xaa\x2a\x88\x3d\xd7\x3f\xb3\x7e\x7a\xc3\x2d\xfd\xb7\x78\x2a\x4b\x83\x96\xa3\xfc\x81\xf3\x4f\xcc\x9a\x7f\xe8\xef\xfb\x6f\x38\xd1\xd9\xd1\xfc\x08\x1d\x9e\xb3\xeb\xdf\xb6\x3d\xf0\xd1\xce\x0e\x4a\x63\xd0\x8c\x5c\x0d\x7f\x73\xc3\x49\x68\xfd\xd1\x41\x68\x3e\xb9\x4a\xc9\x1e\x42\xf0\xb4\x68\x26\xf5\x44\x5e\x90\x4c\xb9\x3d\xad\x45\x45\x34\x6b\x30\xf8\xcd\x69\x40\x43\xda\xe3\x62\x85\x39\x06\x2d\xef\x76\xcc\x21\x88\xc6\xf9\x12\xe2\x02\x21\xe9\xc2\x25\x8e\x1c\x41\xc8\x22\xd7\x48\x12\xa3\xd7\xfa\x4e\xec\xb8\xbc\xeb\xd1\xb7\x6e\xef\x7e\x7a\x5a\xd3\xe4\xcd\x9d\x2f\x3d\x5f\xbd\x78\xeb\xfc\xe4\x15\xc5\x83\xe6\xe6\x6d\x1f\xec\x94\x96\x9c\x62\xc7\x5e\x6b\xe0\xcd\x77\x57\xec\x5e\x12\x33\xb1\x23\xcb\xe1\x6f\x64\xdb\x2d\x1e\xbd\x40\xad\xa6\xb5\xc0\x04\x9e\x4a\xcd\x64\x34\x5a\x03\xc5\xd2\x2c\x06\x26\x9e\xa2\x38\x0e\x35\xc3\x4e\xd8\x03\x9f\x85\x14\x84\x46\xc1\xa2\x8f\xe9\x52\xba\x8c\x6e\x9f\x8e\xd2\xe9\x54\x14\x4d\xab\x55\x06\x5e\x2f\x68\x4d\x3a\xa3\x4e\xcf\x60\x15\x52\x69\x00\x54\xab\xf5\x29\x8b\x33\xad\x97\xde\x04\x1a\xbd\x9e\x63\x05\xa3\x0c\x74\x38\x68\x71\xa6\x11\xa2\x29\x82\x56\x12\x91\x5e\xd6\xd2\x3f\xea\x22\x89\xa8\xb1\xbe\x3e\xa1\x00\x15\x4a\x5f\x8d\xd2\xde\x59\x79\x99\x93\x03\x36\xe9\x8d\x10\x8f\x1a\x6d\xd2\x53\xb6\xfa\x58\x35\xa4\x55\x41\x1c\x36\x05\x6b\x69\xf2\xc7\x86\x69\x55\x10\x4d\x83\xee\x56\xf1\x77\x03\x9b\x06\xc4\x3f\xb4\x40\xef\x49\xf1\xf7\xad\xd0\x33\xb8\x71\x10\x7a\xdb\xc5\x3f\xc0\xfe\x83\xeb\x0f\x88\xaf\xb7\xc3\x86\x03\xeb\x0f\xc0\xee\x03\x1b\x0e\xc0\xfa\x36\xf1\xc4\x81\xf5\x07\x64\x1b\x7c\x49\x6d\xc7\x67\xe8\xc3\xc0\x02\x6c\x29\x0d\xa5\xe5\x81\x89\x7b\x80\x52\x81\xe8\xd9\x91\x37\xa5\x28\x99\x6c\xc0\x98\x80\x9f\x6c\xae\xc8\x18\xf8\xe5\x4e\x69\x67\x22\xf5\x62\x33\x53\x11\xab\x2b\xd5\xd8\x42\x6e\x78\x9c\xae\x8a\xd5\x95\xd3\x99\xfa\xb2\x8a\x44\xa2\xce\x1d\xb4\x6a\x2a\xab\xe3\x32\xfd\x3f\xe0\xb3\xf4\x19\x60\x01\xde\x14\x6b\xd6\xde\xc5\xa9\xa1\xda\x62\x36\xb3\xf4\x9d\x5a\x10\x75\xbe\x19\x57\x3a\xb2\x4a\x6b\xa3\x7c\x7e\x44\xde\x4b\x21\x29\xd8\x8a\xc0\x24\x04\x1d\x5b\xd6\xdd\x38\x79\xe5\x77\xb6\x4c\xae\x2a\xbf\xe6\xb6\x1d\x57\xf0\xf4\xb5\x25\x91\x92\x6b\x6e\x08\x08\x93\xaa\x4a\x22\x25\x9b\xc8\x5d\xb9\x21\xea\x43\xf4\x1e\x93\x04\x02\x08\xa4\x8c\x1c\x49\xbc\xeb\x18\xa0\xc3\xec\xfd\xdc\x46\xb9\x6f\x60\x74\xc8\x58\x0f\xa3\xa7\x4f\x9f\x8e\xc4\xaa\x61\xbe\x0f\x9a\xc5\x4c\xe2\x65\x38\x34\xa3\x21\x1a\xf7\x06\xbd\xf5\x53\x6e\xbf\x95\x1e\xac\x6f\x09\x85\x5c\x4e\xde\x68\x72\x54\x59\x66\x79\xd7\x8c\xa3\x1f\x7a\x4e\xaf\x22\xe5\x9b\xac\x46\x9f\xc6\x40\x85\x37\x72\x90\xa3\xee\xc7\x40\x0a\x2c\x09\x8b\xc8\xe9\xd3\xc4\x64\xe3\x77\x50\xe8\xbd\x5b\x6f\x9f\x52\xaf\xbc\x0d\xe9\x41\xe9\x95\x66\xa9\x72\x8c\xbd\xd3\xd4\xa0\x0c\x44\xa9\x03\x54\x92\xf4\x90\x2b\x03\xb5\xe0\x32\x70\x39\x58\x02\xfa\x00\x80\x71\xab\x2d\x20\x9f\xbb\x05\x9a\xa0\x69\xdc\x77\xc1\x71\xdf\xf9\xc7\x7d\x07\xff\x9f\xbf\xc3\x97\xfc\x1d\xea\x9d\x3a\x8d\xb9\x8c\x0e\x3a\xdd\x3e\x9c\x46\xd3\xa7\x8d\xfb\x0e\x3e\xd4\xd4\x82\xdb\x28\xbf\xc3\x5d\x84\xdb\xf1\xf4\x91\x1f\x4e\xbd\x8c\x49\xd3\x41\xa7\xcb\x8b\x5b\xa8\x26\xf4\xd1\x3f\xfb\x2d\x4e\x37\xb7\xe2\x76\xa8\x17\xac\x3a\x8f\x1b\xb7\xe1\xa9\xdf\xbe\x3f\xf5\x32\xdc\x46\x05\x1c\x4e\xf2\x38\x95\x9c\xdd\xe4\x13\xb8\xe2\xe6\x59\xdf\x6e\x9e\x29\xff\xab\x7d\x7f\x67\x53\xb1\xc0\x07\x9a\x3b\x72\x7f\xa3\xfa\x4e\xf9\x57\x1d\xb9\xbf\xc5\xff\xec\x98\x2a\x98\x75\x98\x0f\x4c\x9b\xdd\x31\x55\x7a\x6a\xda\x6c\xc9\x9e\xa3\x7f\xa2\x0e\x50\x57\x03\x35\x30\x91\xde\xcc\x35\xa0\x19\xb4\x83\x2b\x40\x53\xaa\x28\x52\x62\x00\x1a\xaa\xc6\xe9\x6d\x9f\x91\x8c\x9a\xf4\x4e\xbf\x39\x78\x45\x93\x8a\xeb\xf4\x76\xa2\xce\xc9\x14\x88\x9e\x3c\x91\xfd\xf5\xc9\x93\xef\xc7\x4f\xc7\xa3\xa7\x4f\x9c\x38\x79\x02\x46\x73\xdf\xc5\xaa\x83\x2c\x94\x8c\x54\x9b\xc0\xd2\x17\x16\xab\x02\xb0\x08\xdb\x2c\x55\x38\x9c\xa4\xab\x60\x38\x29\x7d\x03\x9b\x60\xad\x8d\xc5\xaa\x30\x64\x21\x39\xe9\xb4\x49\xef\x88\xda\x22\x6c\x53\xc1\x22\x68\x53\x55\xe1\x70\x2d\x3a\xac\xaf\x74\x74\x0a\x36\x7a\xe9\x0e\x5d\xa5\xad\x4b\xc5\x1a\xb4\x78\x29\x3c\x60\x4d\xd6\x4f\x76\x15\xa5\x9a\xea\x6d\x23\xb3\xaa\xd6\xd6\x39\x9b\xa7\x4e\xb1\x20\x53\xcd\xea\x8a\x66\x4b\x6d\xdd\x24\x63\x8b\xb8\x31\xda\x97\x48\x95\xad\xac\x4d\xaf\xf3\x24\x8d\x8d\x42\xb0\xc4\x67\x68\x45\x19\x6f\xdc\xd4\x60\x0c\x95\xf8\x0d\xed\xaf\x46\xd7\xd5\xcc\xbf\x29\x80\x06\x62\x6b\x6b\xdc\xcd\x4d\x93\xed\xa2\xc8\x08\x16\xbb\xbe\x4b\xc5\xb2\x5a\xb4\x74\x87\xbe\xd2\x31\x97\x31\x18\x74\x68\x19\x5c\xe1\x9d\x24\x34\xb0\x25\xa1\x00\xdb\x3a\xd2\x6f\xaf\x35\x35\x38\xda\xc3\xed\xf0\x6c\x72\x75\x65\xb3\x6b\x72\x32\x2a\xa4\xc5\x4d\xc9\xd5\xd1\x66\xd7\xe4\x9a\xa8\x31\x4d\xe2\xe0\x6d\xe2\x46\x5a\xad\x5a\x0e\xdc\x20\x0e\x80\x5f\x98\x54\x53\x5b\x53\x4b\xaa\xcc\x05\x33\xc3\x91\xf6\xb0\x09\x98\x10\x12\x38\x60\xc2\x72\x47\xe5\x70\x42\xda\x84\x4a\x81\xc0\x6e\x9a\xa2\x68\xf5\xc8\xcf\x3e\x7c\x06\x42\x04\x11\x85\x19\x34\xed\x83\x57\xb6\x9f\x39\x78\x15\x13\xcb\x3e\xb8\x74\xd9\xfd\xf3\xcb\xe9\x43\xb4\x2b\x31\x33\x59\xd1\x56\x13\xa0\xb1\xa3\xfe\xc1\xa9\xb3\x66\x0f\xb7\xd0\x83\xdf\x7e\xe2\x6c\x2a\x9e\x56\xec\x6b\x9f\x45\x0d\x5c\x38\x3f\x72\x06\x6e\x52\x2d\x9f\xbd\x2e\x53\x16\xee\x5c\x97\xa9\x4f\x97\xf1\xc6\x8a\xd6\x24\x40\xe0\x39\x71\x33\xf5\x32\x63\x03\x1c\x08\x82\x03\x2f\x02\x2c\xdf\x02\xc4\x87\x47\x3f\x49\xf5\xea\xd8\x74\x10\x27\x31\x22\xa0\x49\x1a\x9f\x8e\x4d\x97\x6b\x26\x6b\xd0\x8f\x11\xdc\x86\x1e\x47\xe8\x80\x1a\xde\xad\xde\xa9\x46\x06\x96\xe3\xf4\xba\x60\x0b\xcf\xbb\x5a\x9c\x4e\x4a\x03\x5a\x74\xe1\x14\x66\x5a\x00\xc5\x53\x3e\xaa\x9f\x3a\x4e\xbd\x43\x31\x2a\x2a\xe8\xba\xd3\x67\xd1\x20\x86\x53\x63\x0b\xcb\xea\x32\x72\x01\x58\x54\xd9\x78\x38\xdf\x8c\xc3\xe8\xe2\xec\x50\xdc\xc9\xff\xbb\x8c\x6e\x99\x88\x0e\xf1\xa7\xe3\xfc\xe9\x09\xb7\x04\xfd\xe4\x7e\x60\x82\xdc\x15\xbc\xa4\xc9\x16\x6b\xc5\xc9\xe7\x9f\xd6\xc3\x37\x3e\x7f\x61\xfd\x0b\xeb\x83\x97\xb4\x53\xee\x2a\x21\xb9\x59\x28\x5f\x86\x60\x6c\x1d\xb7\xcc\x29\x0b\x67\xd6\x65\xea\xdb\xca\x78\x53\x24\x9d\x24\x63\x17\x55\x30\x08\x94\x9a\x2f\x8b\xc5\xe6\x5a\xc8\x04\x48\xe9\x17\xab\x1f\x5f\xf3\x85\x2f\x59\xf3\x75\x92\xe4\x0f\x48\x41\xd5\xf8\x9a\xaf\x7c\x95\x72\x41\xcd\xd7\xa6\xa7\xf2\x35\x5f\x9b\x77\xed\x3a\x02\x3b\xc4\xe7\x9e\x7b\xf6\x5f\xaa\x16\xde\x97\x7d\x78\x5c\xc5\xd7\x73\xcf\x15\xd6\x7b\x35\x02\x40\xcd\x60\xcc\xa4\xde\xab\x2d\x15\xe6\xa4\x98\x97\x75\xb7\xa8\x03\x14\xb0\xb6\x1a\x79\xd6\x92\xa1\x30\xdf\x29\x00\x21\x4a\x41\x4a\xa0\x04\x13\xb0\x66\x58\x4b\x4e\xd2\xec\xa5\x44\x95\x36\x73\x0a\x0e\x61\xa1\xb8\x0e\xe8\xcf\x9d\xea\xc1\xed\xd0\x26\xfe\x19\x5a\x94\xba\xaf\xfa\x3d\x7b\x06\x21\x55\x97\x9d\x4e\x8a\xbe\x68\xff\xb6\x91\xcf\xe5\xaa\x2f\x6a\xd7\xb6\xff\x1a\xfe\xb7\x82\xa2\xaf\x31\x5c\x07\x33\x08\x80\x1b\x52\x0d\x0e\xb5\x53\xa5\x72\xd3\x2e\x86\xf1\x2e\xfc\x1c\x8c\x02\x04\x82\x2e\xa7\xd3\x62\xe8\x06\x04\x65\x0f\xb3\xd2\x03\x4e\x37\xcd\xb8\x5c\x16\x46\xa5\xd2\xf7\x5a\x2d\x16\x43\xa0\x97\xc3\x06\x02\xb0\x28\xd7\x17\x90\x57\x7f\x6e\x57\xa0\xa4\x21\x49\x25\xe1\xd8\x4f\x95\x33\x11\x9b\x2a\xcc\x42\x19\xf5\x2d\x5e\x84\xa0\xb4\x1d\x0a\xd7\xda\xa4\xb7\x4e\x28\x02\xa9\x16\x7b\x62\xee\xe4\xe5\xd7\x6d\xa8\xb8\xba\xfe\xd8\x11\xf8\xc8\xdd\xaf\xdc\x31\x65\xa4\xe4\x90\xaf\xc1\xb9\x78\xe5\x2d\x53\x1a\xfe\xe5\xd9\x37\x28\x6d\xe3\x9a\x6b\xaf\xf0\x3d\xdc\xd1\xaf\xd3\x8e\xbc\x4e\x0f\xd6\xaf\xdc\x27\x2e\xc3\xf4\xd6\x59\x87\x8a\x6f\xcb\x3e\xb8\x2d\xd7\xeb\x66\x06\xb5\x18\x04\x40\x3d\xb8\x35\x35\x3d\xee\x4f\xf8\x7c\xc9\xa2\x49\x5e\x6f\x6d\x9a\x73\x79\x5d\xc8\xd5\x30\x29\x91\x28\xe7\x39\x46\xdf\x0a\x0c\xbc\xc1\x67\x78\xc7\x40\xa9\x0c\x25\x19\xde\xca\xb3\x9c\xde\x25\x3d\x9f\x48\x16\x79\x27\x4d\x8a\x66\x80\xd7\xe7\xa3\x49\x25\x58\x9c\x5c\x16\xcf\x2b\x43\xaa\xde\xe4\x19\x23\xfd\x27\xe9\xda\x37\x4e\x57\xb9\x30\x8c\xf4\xfc\x10\x48\x87\x0d\xb9\x3a\xcc\x62\x66\x64\x0b\xe0\x62\x16\xa9\x72\xfb\xc1\x70\xad\x8d\xf4\x1f\xde\xd9\x78\x75\x67\xa3\x4d\x8f\x31\xa2\x06\x1f\x76\xa9\x6d\x53\x3a\x97\x34\x5e\xb5\xb7\xaf\xa9\xa7\xeb\xfa\xeb\x6f\xf6\xcd\x98\xd1\xb9\x72\xba\x0f\xb9\x67\xac\xee\x32\x16\x73\xd7\xdd\xb0\x7a\xd1\x5d\x66\x67\x64\xb2\xaf\xd8\xeb\xac\xe5\xc5\x08\x53\xf3\x48\xa0\xb1\xd2\x95\xde\xfe\xfe\xfd\x3f\xf9\xf2\xb2\xc7\x3a\x0e\x6a\x74\xf8\xa3\xaa\xc5\xf7\xf7\x94\x5d\xf3\xc4\xf5\xb5\x98\xde\x35\x6b\xdf\xf2\x2f\xdf\x79\x0b\xe4\x7b\x47\x06\x98\xdf\x01\x15\x68\x4a\x71\x60\x18\xa7\x8c\xd6\x34\xd6\xd0\xdd\x80\x81\x8c\xd2\x3a\x92\x5c\x9d\x31\x18\xf8\x34\x43\xf5\xa8\x20\x54\x29\xed\xb8\xa2\xbc\xdc\x40\x72\x48\x86\xb5\x87\x4a\xa1\x2f\x5e\xd3\x3f\xf2\xc0\x11\x7a\x10\x56\x8a\x95\xa4\x8d\x24\xc1\x02\xc0\x17\xe8\x6d\x40\x05\x2a\x53\x2e\xba\x75\x35\x81\xc6\xc0\x40\x83\x5a\x37\xe2\xed\x18\x61\x86\x81\x9d\x39\x28\x80\xb1\x0a\xe2\xdc\x65\x40\x21\x81\x2f\x8c\xfc\x76\x10\xf9\x07\xf1\xcb\xdf\x36\x53\xed\xb0\x59\x92\xfb\x61\x19\xff\x08\x18\x40\x75\xca\x4e\xd3\x6a\xc0\x61\x55\xb7\x5e\xab\x66\xb4\x3d\x58\xa7\x53\xa1\x1e\x03\x56\x15\xb8\xa5\x3c\xa9\xf8\xb7\xe4\xd9\x2f\x4d\x28\x8b\x0c\xfd\x9f\x10\xa8\xa5\x23\x9b\x60\x46\xec\x3f\xb2\x6b\x17\x3d\x78\x50\xb4\xec\x1f\xd9\x80\x36\xef\x47\x3b\xc6\xf0\x7c\x58\xd2\x87\xa2\x3a\x65\xd7\xe9\x00\xc3\x69\x0c\xad\x14\x02\x7a\xd4\xa9\xc1\x18\xa8\x33\x34\x27\x37\xe8\xbf\x04\x1f\x32\x59\x65\x4c\x3d\x8b\x5f\x80\x81\x3d\x7b\xd0\xa7\x23\xa7\xc8\x74\x1d\xda\x06\x3f\xd9\x2d\x1e\xd9\x26\x7a\x49\xcd\x35\xc1\xce\x03\x21\x50\x97\xf2\xa8\xd5\xc5\x0b\x8d\xa5\x5a\xaa\xdb\x4d\xc2\x0b\x5f\x8f\xdb\x06\x0c\x06\x5a\xd3\xc3\xc8\x76\x97\x18\xbd\x2c\xb3\xca\x9e\x1c\x8a\xf3\x1f\x7f\x71\x9c\x24\x7f\x18\x95\x64\x2c\x8b\x5f\x18\x3b\x2b\x21\xeb\x71\xb2\x08\x26\x7c\xc2\xa4\x2a\x04\x3f\x08\x4e\x71\x1e\x41\xdf\x8c\xbc\xe2\x49\x57\x3e\x7e\xfe\x5f\xe7\xcf\xfd\xde\x1b\xb7\x54\x77\xcc\x98\xe2\x6b\xde\x98\x86\xeb\xa6\xaf\x7f\x06\x6d\xa6\xe9\x91\xad\x92\x11\x74\x34\x5e\xf4\xe3\x2f\x1f\x3b\xf4\xcd\xfe\x4e\x46\x6f\xd2\xef\xb7\xd9\xe1\xe7\xb7\xbd\x78\x47\x4a\xb6\xc9\x87\xa2\x96\x5a\x40\xb5\x83\x32\x29\x1e\x72\xb9\xf8\x74\x30\xe2\xb1\xb5\xd0\x52\xc8\x66\x9a\xe3\xf3\xd9\xdd\x19\x07\x67\xb7\xe8\xe6\x00\x10\x1d\x6a\xce\xdf\x08\x90\x84\xfd\xb5\x22\x2c\x91\x0b\x17\x24\x54\x2f\x92\x1d\x6d\x2c\x9b\x5a\x5b\xed\x74\xc4\x26\x35\x86\x5a\x56\xcd\x2e\x7d\xfe\xa4\xef\xf2\xc0\x00\x7a\x4a\xd4\x17\x77\x94\x6f\x78\xe7\x91\xb9\xb3\x36\x3d\x2d\x6a\x55\x9c\x8d\xfb\x81\xc1\x2a\x68\x62\x4b\x1e\x5f\xf1\xde\x29\x86\x11\xa3\x54\xfb\x6e\xf1\x55\x9a\x6e\xba\xf7\xa3\x27\x1e\xfb\xf5\x56\xe2\x2b\x40\xc1\x26\xb2\x80\x9b\x52\x29\x81\xc5\x17\x74\x6a\x9e\x82\x14\xa5\xb2\x0c\x9b\xcd\x9c\x8c\x4e\xce\xc3\x1f\x1b\xe1\x0a\x23\x9c\x66\x84\x3a\x23\x34\xda\x18\xab\x56\xa3\x51\x09\x34\x52\xab\x19\x4e\xaf\xc5\x16\x0b\xc5\x18\x8d\x32\x4e\x52\x73\x42\x7a\x5d\x92\x72\xe9\x04\x29\xbe\x49\x08\x09\xfe\xb4\x8c\x6a\x40\xe2\x1d\xb9\x0e\x45\x6e\xc7\xe7\x1f\x83\x34\xc8\x81\x1c\x24\x84\x00\xe5\xa9\x16\x07\xf7\x88\xfd\x83\xb0\x57\x7c\xfa\x39\x98\xde\x03\xa7\xfe\x54\xec\x87\xfc\xba\xfe\x1c\x74\xde\x04\x48\xbd\x81\x91\x33\x32\x76\x84\x72\x8f\xd1\x02\xae\x4e\x25\x69\x2b\x6f\x40\x6d\x5a\x15\xc6\x6a\x73\x1b\x70\x09\x50\xe0\x1e\x32\xed\x33\xa1\x8d\x26\xc8\x9b\xa0\x49\xc3\xa8\x79\x83\x4a\xab\x55\x9b\x4c\x56\x56\xa7\xe6\x84\x0c\x00\x98\x91\x82\x38\x92\x47\x17\x94\xb2\x87\x04\x8c\xca\xd5\x74\x89\xd3\x72\x6b\x29\xe5\xa8\xa8\x3a\xe6\x9f\x20\x3a\x34\x25\xa4\x19\xfe\x5b\xf1\xd5\x7d\xe2\xab\xaf\xc2\x6e\xf1\xc0\x61\xd8\xbe\x0f\xb6\x1f\x16\x0f\x5e\xb8\xf9\x07\x85\x78\x0c\x32\x46\x83\xf4\x47\xbc\x46\x7a\xab\x93\x3c\xdc\x7d\xe2\x34\x2a\x4a\x9f\x32\x86\x8e\xbd\x48\xee\x21\xdc\xfa\x37\x00\xd8\x17\x20\x04\xf1\x0a\x8d\x7c\x63\x41\xee\x77\xfb\x86\x38\x8d\x52\x53\x8b\x8d\xa1\x63\x67\xe4\xe7\xfe\x1b\x00\xe1\x27\x10\x1e\x1e\xfd\xaf\x81\x68\x99\xda\x98\x7b\x94\xe0\xd8\x29\xd8\x5e\x2c\xb8\x35\x35\x7b\x2b\x0b\xd7\xb2\xb0\x86\x9d\xc7\x22\x56\xa7\xea\x06\xea\x5e\xf5\x8d\xea\x3b\xd5\x94\x5a\x3f\xdf\x00\x53\x06\x18\x34\x40\x95\x01\x1a\x0c\xa5\x34\xa4\xaf\x00\xb0\x06\xc0\x12\x00\x69\x00\x01\x1e\xde\x88\x20\x62\x58\x56\xa5\xd7\x62\x5a\x85\x31\x90\x16\x8f\x13\x89\xa8\x90\x68\x56\xca\xe2\xb3\x43\xf2\x08\x67\x13\x51\x05\x37\x98\x40\x28\xe4\x00\xa7\x0a\x10\xec\x22\xdb\xfb\x6b\xf3\x18\x76\x04\x72\x6a\x1c\x90\x9d\x34\x7f\xe4\x7b\xbe\x2c\x98\x9d\xaa\x50\xa9\xd5\x40\x6b\x68\xb9\x53\x0f\xf5\x1a\x06\xb5\xca\x2d\xee\xef\xc4\xef\x48\x62\x40\x8d\x06\xa9\x68\x4e\x9b\x01\x00\x19\x0c\x88\xdc\xf9\x15\xc8\xe0\xc9\x32\x2d\x96\xab\x7c\x86\x4e\xcb\x78\x06\xfe\x9c\x0c\xc4\xc5\x04\xfc\xcc\xc8\xd9\x81\x01\xc4\x7c\x3c\xf2\x05\xdc\xbb\xb7\x3f\x07\x5f\x80\x2c\x23\x5f\x88\x3d\xf2\xa0\x8c\xe1\x00\x1a\xc1\x7d\x2f\xe8\x54\xdd\x6a\x23\x87\xf0\x61\x88\x53\x6d\x7a\x3a\x44\x41\x3d\xe5\xa6\x10\x45\x81\x31\x4b\xf2\x82\x70\x49\xa8\x3f\x64\x34\xd2\x8c\x80\x39\x3d\xaf\xe3\x75\x0c\xa3\x51\x53\x06\xca\x90\xef\xc3\x4a\x76\x62\xe4\xf4\x9e\xbc\x33\xc9\x81\x81\x8c\x06\x48\x0e\x13\x94\xd6\x87\xe4\xca\x06\x29\xd6\xf0\x07\xa0\x25\x20\xa8\x88\x3a\xb5\x42\xc2\x42\x80\x01\xdf\x13\x9f\xd9\xb2\xee\xc8\x91\x75\x5b\xe0\xb4\x77\x47\xfe\x06\xbf\x3a\x0d\x97\x5e\x3d\xf2\x21\x3d\x38\xc2\x1c\x80\x4b\x7e\x0a\x0f\x8e\x5c\x53\x80\x2b\x61\x04\x1b\x53\x33\x0d\x5a\xa1\x4d\x65\x35\x42\xbd\x0c\x0e\xa5\xd3\xeb\xb9\x03\x2c\x5c\xcf\xde\xc7\x7e\x9f\xc5\x80\xed\x65\x11\xcb\xb3\xc4\xe8\xbd\x18\x61\xad\x4a\x67\xd0\x51\x3c\xe0\xa0\xc1\xa0\x6e\x36\xc2\x98\x1a\x1a\xd5\x46\x35\xa2\x38\xf2\x6e\x4a\x28\x37\xe0\xb2\x92\x1e\xf9\x23\x0f\xb9\x08\x2d\xa7\x49\xbe\xda\x30\x5e\x1d\x83\xe1\x02\xf1\x35\x50\xd2\x08\xf1\x5b\x06\x06\xb6\x6c\x80\x94\x0c\x2d\x21\xfe\x76\x03\x3c\xb8\x55\x1e\x95\x6d\xb0\xee\x45\x68\x18\xf9\x62\xe4\x35\x18\x3e\x0d\x20\x68\x50\xc6\xc5\x0c\xd6\xa5\xda\x59\x96\x06\x66\x64\xe2\xf5\x54\xb7\x46\x05\xe8\x5e\xfa\x46\xfa\x4e\x9a\xa2\xd3\xc6\x05\x46\x64\x34\x99\x2e\x39\x20\x66\x1e\x61\x4e\xd5\xa3\xc7\x4f\xaa\x9f\x55\x23\xb5\xda\xa8\xcd\x35\x7b\x4d\xd4\x47\xb3\xf5\xa4\x74\x30\x51\x30\x08\xd9\x68\xf6\xa4\x7c\xd3\xa0\x5e\x20\x57\x4c\xfd\x01\xa8\xca\x5f\xe2\x4b\x58\x02\x42\xad\x32\x0a\x4d\xf7\x1f\xd9\xb5\xeb\xc8\x07\x1f\xdc\x06\x5f\x7b\x77\xe4\x6f\xe8\xc8\x4d\x23\x87\xe5\xad\xb0\xb8\xfe\x29\x94\x18\xd9\x4c\xe6\x65\x03\xb9\xcf\x64\x06\x56\x70\x7b\xaa\xed\x16\x76\x27\x8b\xae\x61\xe1\x3c\x16\x5e\xc6\x42\x56\x60\x18\x83\x0a\x9b\x5a\xad\x10\x98\xa1\x59\x6f\x30\xf0\x9c\x8f\x37\xa5\x01\xd7\xcb\x21\x8e\xe7\x58\xe1\x4a\x01\x0a\xb7\x68\xa0\xc6\x68\xd4\xf3\x26\x0b\x63\xed\xa4\x20\x44\x7a\x0e\x01\x72\x0d\x31\x9a\xf8\x2c\x2e\xcf\x80\x6c\x22\x2b\xfb\x91\x7c\x26\x95\x4d\xbc\x25\x5f\x95\x90\x1b\xd7\x54\xc7\x4c\xb9\x9d\x3d\x4e\xd4\xca\x63\x40\x34\x6a\xd8\x33\x00\xd7\x8b\x5b\x78\x6a\x2b\xbc\xef\x63\xd1\x88\xb4\x1f\x88\xf3\x36\x0d\xec\xa1\x17\x0f\x0e\x6e\x13\xd7\x8a\xbf\xdd\x05\xb7\x89\xc1\x91\x1d\xf0\x9b\xb9\x62\x37\xf5\x81\x82\x51\xae\x8c\x07\x0b\x7a\x9e\x57\xb1\x36\x02\x25\xf9\x4d\xaa\xca\x60\x4c\xb3\xc8\xa0\xa5\xba\x69\x1a\xa8\xf4\x06\xb5\xc1\x00\x01\x0f\x58\x74\x18\xc1\x1f\x21\xb8\x00\x41\xa4\xc5\x98\xd6\xab\x7a\xd4\xf9\x56\xbb\xf2\x7b\x83\x00\x6f\xc0\x68\x5d\x22\x11\xad\x23\xc5\xf3\x32\xf8\x55\x1f\xf1\x7d\x95\x0c\x82\xa0\x58\xfc\x94\xb8\x7f\xdb\x11\xf1\x03\xf8\x87\xe5\x70\xed\xab\xe2\x52\x74\xf8\xf1\x91\x21\xda\x78\x60\x44\x7d\x08\x75\x8c\x6c\x05\x90\xdc\x19\x3f\x45\xee\xbe\x2e\x4a\xd5\xfc\x10\xc0\x9d\x00\x02\xc8\x43\x58\x4a\xd5\x51\x88\x62\xf5\xba\x65\x08\xce\x43\xb0\x55\x5a\xe2\x5a\x49\x7d\x29\xd6\x60\x1e\xd3\x08\xa9\x34\x19\xa0\xe5\x54\x58\x3e\x77\x1e\x92\x57\x95\x3a\xb9\x96\x3f\x4e\xde\x67\x82\x02\x14\x2b\x05\x22\x39\x70\x14\x49\x34\xfc\xdb\xd7\xc4\x5e\xf8\xfa\xdb\xe2\xac\xe7\xc5\x5d\xc8\x33\x86\x90\x82\xfb\x77\x13\x88\x94\x02\xdc\x45\x0e\x74\xa4\xa2\x7a\x75\x37\xd0\x40\xa0\xe1\x35\xe7\x35\x58\xad\x31\xd0\xdd\x32\x4a\x04\x35\xbc\x11\xbe\x0d\x11\x64\x7a\xf4\x7a\x35\xab\xc5\xb4\x5a\xda\x56\x19\x41\xf3\xf1\xdc\xea\x2b\x63\x14\x9f\x95\xe6\xd9\xe2\x6c\x9f\xb4\x3c\xc8\x2b\xee\x18\xea\x35\xa5\xed\xef\x3f\x32\xf2\xe5\xd1\x3c\x22\xe3\x18\xc2\x75\xee\x4e\xdb\x1e\x72\xf7\xff\x8a\x54\x52\x0d\x5a\x75\x5c\x0b\xa7\x87\x9f\xeb\xe1\x3e\xfd\x71\x3d\xea\xd4\xaf\xd6\x23\xbd\x0a\xb7\xca\x71\xf2\x3b\x14\xa5\xa2\x60\x46\xa5\xd2\x30\x9c\x4e\x7a\x61\xb2\x2c\x2e\x58\x78\x89\x34\x8b\x49\xe1\x69\x36\xdb\x37\x74\x96\xac\x56\x85\xf8\xdb\xd2\xc2\xdb\x22\xf2\x83\x83\xf0\xfc\xe0\xbe\xfe\xb1\x52\x67\x39\xba\xcd\xef\x29\x07\xc9\xde\x75\x66\x2a\xaa\x81\xdd\xcd\xa0\x13\x1c\x03\x18\xa4\x9c\x9e\x34\xd8\xae\x83\x3a\x35\xd5\x0d\x68\x08\x68\x9e\x3e\x4f\x63\x35\x8d\x7b\xd4\x6a\x60\xd0\xe6\xbb\x35\x93\x3a\x4f\x22\x46\x9f\x24\xc7\xbf\x47\xb2\x0a\x7e\x64\x4e\x0c\xbf\xc5\x8f\xf7\x1c\x15\xaf\x3a\x7a\x14\x3e\x09\x3f\x10\xff\x38\x66\x8e\x03\x39\x6c\x90\x41\xb2\xa7\x6d\x48\x15\x6b\x60\x2b\xe8\x24\x3c\x5b\x25\x86\x3e\xfa\x1d\x9a\x52\xd1\x38\x23\xb3\xcc\xa1\x84\x8c\xb1\x24\x1c\xe5\x35\xba\x80\x5f\x00\xbf\xfe\x82\xd8\x32\x38\x08\x8f\xc0\x83\x9f\x8f\x29\xbd\x5b\xee\xad\x24\x02\x6a\x0f\x3d\x08\x4a\xc0\x8c\x54\x88\xe7\x81\x67\xb8\xa8\xa8\xd8\x36\xac\x4e\x69\xd8\xb4\x3a\xe4\x1f\x8e\x15\xc3\x62\x27\xc6\x7e\x5f\x4f\x00\x17\xf9\x8d\xe6\x1e\x03\xa9\x27\x93\xef\x97\xbc\x21\xc7\x03\x11\x69\x63\xf2\x45\xfc\x78\xb4\x3a\x06\x0b\x77\xb8\xb9\xd2\x0a\x39\x51\xa8\x38\x85\x1f\x9d\x32\x56\x3b\xae\x7e\x60\x61\x24\xb1\xf8\xee\xae\x9a\x2b\x22\xa1\xb6\xe8\x9a\xa5\xcb\x6e\x4c\xb8\x0e\x8a\x9f\x1e\x44\x57\x61\x1b\xad\xca\xed\x6f\x4d\xe6\xfd\xbc\xe5\x6f\xdf\xfc\xd7\x88\x7e\x64\x5b\xbe\xd9\x35\x04\x1b\x45\x2d\xc1\x61\x28\x03\x1d\xa9\x0a\x8f\xa5\xcd\x8a\x71\xaf\x15\x5a\xad\x4e\x7d\x1b\x17\xf4\x06\x51\x30\xe2\x68\x03\x4e\xe8\x14\xe6\xf8\x7c\x4e\x7b\xc6\xc5\x59\x9d\x16\x4a\x35\x07\x03\x10\x8d\x0f\xc5\x73\x08\x77\x85\xb7\x21\x09\x4c\x44\x75\x0c\xe6\x44\xce\x55\xe5\x30\x79\xa9\x0b\xb6\xbf\xb8\x7e\xca\xa2\xd2\xf2\xb9\x75\xf1\x96\x0a\xb3\x39\x3a\xab\xde\x56\x69\xde\x2f\x8a\xfb\x51\x8b\x25\x66\xeb\xd8\x9c\x9d\x14\x9b\x7f\x9b\xa8\xb5\x5a\xf6\x5b\x6d\xd1\xab\x1f\xbf\xfe\xfa\x3d\xd7\x56\x53\x8c\x58\x29\xc3\xa5\x89\x61\x86\xa9\xdf\x72\xf6\x5f\xbf\xff\xe1\x96\x29\x4a\xfd\xc7\xd3\xd4\x7e\xfa\x34\x98\x0a\x2e\x07\xd7\xa7\x1a\x13\x46\xba\xb3\x13\xcc\x5a\xc8\xd7\xf9\xea\x50\x5d\x9d\x33\x50\x5c\x3c\x6d\x21\x00\x3a\xdd\x15\x91\x85\x5e\x67\xd4\x89\x9c\xad\xbd\x37\x36\xde\xd9\x88\x1a\x1b\x43\x3d\x5e\xaa\x33\x11\xeb\xb1\xe8\xd4\x3d\x7a\xce\x48\x5b\x48\x22\xf1\xdf\xe3\x43\x71\x02\x98\xf6\xc5\x2f\x95\xee\x03\x82\xb4\xfc\x92\xe0\xbf\x3e\xda\x37\x24\xef\x2a\xab\x63\x24\xcc\x27\xa3\x53\x6b\x51\x8a\x3d\xe0\x45\x09\x9a\xb1\xf2\xcb\x9a\xda\xb1\x7e\x28\x2a\xa5\x60\xc9\x62\xb6\xda\x9a\x30\xb5\xde\x5b\xd3\x1a\xb6\xd5\x06\xbc\x0d\x5e\xcf\x0c\xdf\x65\x9b\x9b\xca\xae\x68\xb8\xe3\xc4\xdd\x2d\x97\xdd\x7d\x62\x63\x3c\x1b\xaa\x73\x37\x16\xcf\xf9\x4e\x57\x79\xd5\x82\x3b\x32\x66\x13\x1f\xac\x0b\x99\xca\x32\x6b\xda\xdb\xd7\x64\xca\x5f\xd3\xb9\x2a\x7c\xbe\x0a\xa7\xae\x2e\x56\x54\xe5\xe5\xd1\x4b\xd7\x1d\x7e\x6c\x4d\xd0\xa0\x65\x75\x87\x0c\xfa\x8a\x49\x02\xd7\xf3\x33\x68\x79\xe1\x65\x58\xf4\xf3\xc5\x66\x6e\xb7\x8e\x9d\xb1\xe3\x77\x7b\x9f\x38\x7b\x5f\x33\xa6\x6a\xd6\xde\xf5\xe8\xbc\xbb\x8e\x7f\x67\x4a\xed\x2d\x3f\xdb\x3e\xef\xae\x2b\x2b\x27\xf5\xde\xd3\xf5\xd0\xef\x3b\xfd\xd7\x7c\xe7\x3e\xb9\xbe\x7b\xcd\xe8\x6b\xd4\x1a\x82\x9b\x90\x01\xdb\x52\xf5\xe9\x49\x26\x9a\x9e\x3e\x1f\x40\x90\xf6\xd5\xc3\x2b\xeb\x61\xba\x1e\xd6\xd7\xbb\x4a\x02\x01\x75\x7a\x7a\x47\x07\x37\x1d\x4e\x9f\x5b\x91\x06\x2e\xde\x85\x5c\x86\x8e\x4c\x13\x7c\xa8\x69\x5f\x53\x7f\x13\x6e\x22\x97\x33\x35\xfa\x74\x53\x53\x75\x49\x38\x13\xf0\xf1\x74\x75\xc6\x9a\x6e\xcf\xf0\x26\xab\x15\x34\x27\xde\x27\xd6\x56\x2e\xd7\x45\xb2\x7d\xb2\x57\xbd\x95\x8d\x4b\x0e\x45\x4c\x4e\xae\x68\x8c\x59\x9d\x14\xda\x28\xce\x05\x2f\x4e\xb2\x17\xd8\x7c\x32\x2c\xb0\x39\x29\x8a\xb5\x2a\xa3\x85\x9e\x36\xf9\x23\xf6\xfa\x69\x06\x4f\x85\xb7\xa9\x19\xce\x9d\xfa\x9d\xfa\xd0\xe5\xd1\xd5\x83\x9b\x5a\xa7\x6f\x7c\xf1\x96\xfa\x4e\x5f\xa5\xa3\xae\x7c\xce\xda\x99\x25\xe1\xd9\x6b\x66\x69\xb5\x9a\xe2\x49\x25\xa6\x58\xd7\x4d\x53\xa7\xae\x9a\x5b\xe5\x8a\xa5\x82\xe1\xa4\xb3\xde\x6d\x6b\x86\x5f\x4d\x5a\x38\x3b\xe5\xac\xdc\x77\x7d\xa2\x6b\xb2\xef\xf6\x91\xe5\x45\x41\x96\x9d\xb5\xe3\xdd\x2d\x9b\xde\x7f\xec\x72\x4e\xf7\x3d\xb5\xa1\xee\x86\x27\x97\x5d\xb5\x6b\x45\x1d\x0a\x67\xba\x97\x35\x2e\xbe\xe7\xca\x48\x78\xde\xbd\x4b\x5a\xd6\x2d\xe9\x2c\x32\x31\xea\x87\x35\x2a\xf9\x0e\xf3\x26\x71\x1a\xc1\x3f\x0e\xbd\xe4\x26\xf8\xd6\xb7\x82\xbd\x40\x8e\x1e\x6e\x29\x29\x62\xe4\x4e\xce\xc9\xd1\x51\xf0\xb4\x38\x8d\xe0\x12\x85\x5e\x9a\x22\xc7\x0e\xb5\xf2\x53\xc9\x62\x37\x07\xf2\x81\x03\x04\xd7\x8a\x1b\xc9\xf9\x81\x0e\xb4\xa7\x2a\xb4\xc3\x3a\xc8\x30\xea\x6e\xfc\x0e\x84\xfb\x21\x7c\x18\x42\xfc\x20\x84\xd4\x12\x08\x69\x9e\x5c\xaf\x51\xe1\x1e\x0a\xeb\x74\x6a\x39\xfe\x4b\x44\x65\x14\x9a\x5c\x8b\x9a\x93\x5f\xbc\x12\xe5\x3f\x1e\x92\x97\x44\xd2\x36\x24\x21\x04\xd0\xab\x47\xc5\xc5\x58\x14\x7b\xfa\xfb\x69\xe3\x81\x03\xc3\x8f\x48\x01\x1c\x04\xb7\x89\x9b\x15\x3c\x9c\x9a\x94\x4f\xd3\xaa\x05\x34\xad\x6a\x45\x3c\xc8\x80\x87\xc0\x3e\xd2\x3a\x81\x41\x19\xcc\x69\xb5\xaa\xfc\xc1\x2c\xe1\xf5\xd6\x17\xbf\x8c\xca\x0d\xfa\xc7\x58\x08\x48\x2b\xae\xc6\x67\xc4\xd5\x4f\x0e\xe2\xfe\xdd\xbb\xbf\xfd\x8b\xf4\x86\xb9\xa8\x9f\xfd\x58\xaf\x64\x13\x58\x92\x6a\xaa\xa5\x5a\x29\x14\xa2\x20\xf5\x00\x86\x18\xa6\x05\x58\x26\x40\xe1\x6d\x69\x83\xac\x05\xad\xef\x40\xb8\x4f\xd6\x7f\x3d\x84\x63\xea\x9b\xb4\x08\x41\x01\x73\xd0\x25\xe3\x16\x93\x52\xc4\x2c\x69\xbe\x9e\xcd\x7e\x51\xff\xcb\x68\x36\x9e\xcd\x4a\x1e\x29\x6d\xba\x60\x40\x80\x05\x05\x70\x10\xbd\xfc\x82\x98\x7e\xe9\xaf\x7a\xaf\xdb\x4e\x33\x8c\xcd\xe3\xd5\x7f\xfe\x73\x31\x2d\x9a\xe1\x39\xaa\x7d\x64\x87\xaf\x3b\x3b\xcf\xe3\x99\x97\xed\xf6\xa1\xd5\xc3\x83\xf2\xbe\x41\x91\x1f\xf0\xe0\x97\x2f\x02\x7e\xf4\x9b\x54\x89\x81\x4f\x87\xf8\x1a\x1e\xd9\x78\xb8\x1c\xde\x0a\x51\x37\x84\x69\x08\xcb\x60\x3d\x44\x76\x38\xd6\x51\xe8\xa7\x06\x21\xcd\x4b\xfb\xb2\x2e\xb3\x3d\xcd\x3f\xcb\x8d\x72\xe8\x4a\x0e\x72\x1a\xa8\x36\xdb\xd3\xf0\x13\x74\x1e\xa1\xf5\x08\x66\x10\x44\x48\x0d\x34\x6a\x86\xa1\xd4\xdd\x06\xdd\x3b\x1a\xb8\x5f\x03\x1f\xd6\x40\xfc\xa0\x06\x52\x4b\x34\x90\xe6\x35\x19\x0d\xd2\x60\xc0\xb2\x2a\x5d\x0f\xa5\xd7\x43\xb5\x91\x23\x20\xfa\xcd\xf9\x4b\x54\x85\x2d\x8a\xde\x4a\x7c\x11\xff\xa5\x14\xdf\xf0\xbf\x88\x92\xe6\xed\xfc\x9b\xd2\xd7\x58\x35\x88\x64\x61\x0e\x5b\x4e\x0a\xa2\x2d\xf2\xa9\x93\x3f\xe9\x4f\xc2\x04\x5a\x0a\x37\xbc\x21\x3a\x60\x48\xfc\xb7\xa3\xe2\x19\x18\x16\x1d\xa7\xd0\x7b\xe8\x77\xdf\x6e\x6e\x3c\x20\x3e\x05\x17\x1c\x48\xe0\xad\x05\x63\xe7\x00\xf7\xa4\x74\x5b\xb5\x8f\x69\x7f\xa8\xc5\xb7\x68\xa1\x56\xd2\xb2\x55\xc7\xa5\xb5\x1a\xea\x29\x1b\xbc\xcd\x06\x6d\x6a\x1d\x97\xb6\xbd\x6d\x87\x76\x3b\xe6\x29\x07\x86\x10\xb7\xaa\x99\x77\x28\xb8\x9f\x82\x0f\x53\x10\x3f\x48\x41\x6a\x09\x05\x69\x9e\xca\x50\x88\x42\x4c\xa7\x83\x57\xa9\xb0\x4d\xc3\x61\x65\x50\x95\xab\x53\x85\x5a\xfd\x32\x2a\x45\x3a\x92\x56\xf1\x48\x36\xcb\xbf\x29\x7d\x8d\x55\xe7\x95\x18\x37\xcc\xf8\x94\xf8\xf5\x0b\xe2\xd7\x50\x7b\x89\xc1\xde\x26\x3e\x01\x97\x6c\xbb\xc4\x70\x43\x90\xcc\xef\x11\xf7\xa5\x2c\xad\xdc\x7c\xee\x87\x1c\xe6\xd2\x9a\xe5\x9a\x5b\x35\x58\xc3\xe8\xf5\xac\x4e\xd2\x94\xd5\x73\x69\x46\x67\xd5\x85\x74\x58\xa7\xd5\x12\x20\xb9\x94\xf4\x23\x95\x55\x15\x52\x61\x95\xda\xa0\xd6\x73\x69\x8d\xc1\x61\x28\x33\x60\x03\xcb\x42\x9a\x7c\x4f\x3b\xe8\x32\x1a\xd3\x00\x50\xc3\x90\xd3\x33\x1a\x8d\xca\xa0\xc5\xa0\x87\x96\x02\x7c\x95\x71\x7c\x30\x4d\x8a\x6b\x13\x42\x22\x1b\x21\xa8\xe5\x11\xe9\x0f\xf9\x87\xbc\x5b\x4f\x64\x73\xbb\x4e\x0d\x39\x0f\x91\x46\x93\x4a\x6c\xed\x6f\x15\x9f\x10\xbf\xf7\x73\xf8\x9a\xd8\xfd\x3a\x9c\x09\x3b\x8e\x89\xdd\xf2\xfe\x73\xfd\xc8\x16\xf4\x2d\x3a\x32\xf2\x2e\x8a\x8e\xcc\x92\x7c\xba\x37\xbf\x07\xfd\xf9\x0b\x27\xd8\xf7\xd9\xdf\x13\xdc\xbe\xf3\xa9\x12\x1d\x9b\x3e\xa5\xff\x48\xff\xa9\x1e\xeb\x79\xe9\xdf\xd4\x47\xd4\xa7\x0a\x70\xe7\x09\xf4\x3e\xfa\x3d\xc2\x0c\x92\x1e\x34\xeb\xd8\x74\x9b\x01\x1a\x78\xa3\x2d\xad\x35\x38\x0d\xa8\x85\x60\x08\x9f\x4f\x25\x8c\xb6\x34\x8d\x2d\x18\x19\x18\x80\x31\x8d\x20\x64\xbd\x1c\xe4\xf4\x2a\x95\x9a\xa2\x69\x5d\x8b\x5a\x95\xd1\xeb\x59\x03\x83\x01\x80\xac\x56\xcb\x5a\x64\xd4\xce\xe6\x84\x1c\x91\x27\x48\x21\x10\xb9\x46\x41\xea\x4a\xa2\x24\x1a\x94\x7f\x13\xab\x06\xd9\x08\xc1\x45\x8c\xf4\x64\x49\xe3\x8c\xac\xac\xbb\x7c\xc0\x20\xd9\x02\x8a\xe2\xba\xb7\x61\x31\x0c\xbc\x2d\xae\x85\x95\xfb\xfb\x33\xe2\x2f\xc5\x37\xde\x46\x09\x64\x13\xaf\x85\xbb\x47\xfe\x2c\x2e\x93\x16\x25\x38\x20\xce\x52\xe2\xa8\xfc\x78\xd7\xa7\xbc\x80\x8d\xb1\x88\x65\xb9\x6e\x9d\x16\x76\x53\xaa\x61\x86\xd3\xf6\x20\x3d\xa6\x40\x8f\x46\xa5\xd2\x8c\x01\xb1\x93\x0b\xe5\x67\x87\xa2\xa7\xbf\x78\x23\x2a\x0d\x84\x3f\x8f\xa9\x15\x48\xfa\x2d\x01\xf8\x33\xf8\xc8\x91\xfe\xfe\x6f\xbf\xf9\x14\xed\x38\x77\x90\xe6\xe5\x34\x9b\xd2\x2b\x06\x40\x60\xce\xdb\xbe\x39\x55\xa2\x6b\x35\xa0\x96\x7d\x5c\x3f\x87\xb8\x94\x1a\x42\x35\x54\xab\xb5\xad\x34\xd6\x53\x19\x86\x63\xb5\xe3\xb1\xd5\x86\x12\x30\x2a\x2d\xbc\xd9\x6c\x34\x3b\x24\x2d\xf0\x30\xcf\x33\x0f\xb1\x36\xc2\x7c\x8c\x6e\xfb\x03\xdc\x2b\xa3\xac\xc9\xeb\xb0\x82\xb3\x96\x8b\x7f\x1c\xa0\x31\x55\xcc\x75\x03\x3d\xd4\xdb\xe8\x6e\x72\xd8\xf4\x36\x42\xc8\x66\xee\x61\x34\x1a\xbb\x41\x72\xc9\x31\x70\x73\x72\xcb\x5c\x2e\x73\x39\x2b\xed\xb5\x87\xf2\xe1\x8e\x5c\xc3\x20\x24\x84\x5c\xf1\x88\x1c\xf7\xcc\xf9\x51\xd7\xd1\xe3\x47\xcd\xf1\xb9\x8d\xb3\x77\x75\x29\xe1\x4f\xb3\x27\x74\x6c\x00\xb5\x8e\xbc\x5b\x3f\x7f\xb2\xc7\xeb\x46\x1f\x8d\xc3\x97\x73\x81\xa9\xa9\xa0\x19\xb6\xda\x5c\x2d\xfb\xec\x30\x6a\x87\x76\xb6\x15\xe8\x8e\xeb\x90\xce\x2c\x64\x20\xc3\x00\x8b\x9e\x73\x3a\x6d\x63\x99\x41\x63\x5e\xa4\x68\x36\x9b\x8b\x79\xe4\x7c\x5f\xae\x3d\xa1\x24\x8e\x12\xfc\x84\x3b\xe6\x76\x27\xe6\x6e\x5a\x10\x1d\x5c\xb1\xb4\xe3\x91\x36\x29\x0a\x7a\xdb\x11\x74\x1a\xa2\x5d\x6b\x66\xc0\x83\xe2\xb5\x0b\xe6\x55\x46\xe0\xf9\x09\xf1\x50\x0b\x3d\x08\x3c\x60\xce\x4f\xec\xcc\x61\x88\x53\x21\xab\x4a\xa5\x77\xc1\x6e\xe0\x95\xcc\xc6\xeb\x91\xde\x65\xb7\x5a\xcd\x3d\x1a\xb5\x46\xa5\xa2\x91\x46\x03\xdd\x86\x31\x14\xfd\x44\x82\xcc\xe4\xcf\xe2\xd1\x1c\x58\x1d\xc9\x5c\x26\x94\xa8\x88\x95\xa3\xfe\xbc\xed\x1a\xa0\x90\x10\x9a\xa0\x8c\xb0\x3f\x75\x65\x72\x8b\x5f\xb1\x9f\x7e\x4b\xa2\xaf\xf9\x28\x9a\xe7\x28\xd1\x89\xaf\xc3\xf0\x98\x05\xe1\x02\x71\x40\x53\x62\xcb\xe1\xee\xe7\xf0\xf3\xdc\xa0\x27\x55\xab\x36\xb5\x31\x29\x73\xc6\x7c\xa3\xf9\x4e\x33\x65\x36\xbb\xb4\x6c\xab\xa1\x08\xb6\xca\xdb\x3c\x8b\xd5\x6c\x36\x72\x54\xc6\x6a\x65\x75\x6e\x8e\xb5\x68\xd5\x34\xc7\x40\x86\xa1\x89\x8b\x65\x85\x44\x22\xd7\x07\x80\xa8\x50\x20\xbc\x8c\x2a\x00\x09\xf2\xb5\x90\x10\x6a\x64\xd0\x3d\x16\xaa\x2c\x81\xa4\x6c\x77\xd8\xb1\x62\x29\xb3\x61\xf9\x8a\xc1\xc1\xe4\x35\xb5\x1b\xa2\x92\xc1\xa9\x76\xc9\xba\xb0\x52\xfc\x9d\xa7\x45\x06\xe2\x0b\x26\x78\xf1\x4f\xb2\xe1\xc7\xf7\x27\x30\x81\x48\xca\xaa\xed\xd6\x58\x90\xb1\x1b\x98\xa0\x49\x60\x7b\x10\x4d\x9b\x34\x46\x80\x41\x73\x81\x0f\xc6\xc9\xc6\xc6\x94\x20\xb1\x89\xdc\xa9\x49\x39\xb0\xdf\x7a\x74\xd5\xcf\x7a\x5e\x38\x71\x74\xe9\xda\x79\xcf\x5e\x7f\x94\x1e\x1c\x39\x54\x59\xf9\xb3\xc1\x91\xc3\x28\x7a\xf3\xcd\xa5\xa5\x23\xf5\x32\xbf\xa7\x00\xa0\x92\x54\x3b\xb0\x81\x86\x54\x09\x68\xed\xb7\x1d\xb7\x21\x9b\x43\xaf\x6e\x05\x1a\x5e\xe3\x93\x11\x19\x55\x1a\x15\x95\xd1\x0b\x82\x96\xd3\xc8\xd1\xa6\xc2\x7d\xb1\x02\xc9\x26\x79\x5b\x3e\x4d\x90\x10\x94\x04\x9a\x80\x37\xae\x58\xda\x7d\xb0\x6b\x70\xb0\x62\xfe\xa2\x6b\xea\x25\xfd\xe1\xee\x05\xf3\x26\xd7\x8b\x11\xaa\x5d\xb4\x7a\xa3\x3e\x21\x7a\xf9\x9a\x19\x62\xb7\xb4\x57\x1f\xfd\x46\xb9\xc7\x54\x09\xea\x40\x57\x2a\x3a\x69\x21\x6d\x34\xd2\x93\x03\x77\x87\xe0\xb2\xd0\xba\x10\x0a\x0d\x7b\x13\xaa\x85\xa5\x5e\x37\x74\x17\x7b\xdd\xaa\xde\x44\x71\x69\x29\x10\xf4\x3d\x46\x9b\xa9\xaa\x07\x50\x32\xb8\x91\x34\x2e\x6f\xca\xd7\x6f\xce\x66\x49\x0c\x94\xcd\xc6\xe5\x5b\x84\xb1\x6a\x18\x2f\x82\x46\x0f\xf4\x2b\xe9\x6f\x8b\x92\x0e\xaf\x82\xc9\x49\x35\xb5\x09\x16\x5a\xcc\x0d\xb0\x09\xdb\xc8\xc5\xa7\x49\x55\x08\x9d\xdd\xb0\x2f\x5b\x32\xd2\x4b\x97\xcc\xbc\xb5\x3b\xda\xd9\x3a\xd5\xef\x9f\x3a\x6b\xd1\x94\x3b\x7e\x7a\xcb\x14\xf5\x43\xdb\x05\xdd\x1e\x86\xbd\xd6\xa2\x9b\xb2\x72\xff\xaa\xd4\xa2\x26\x3f\x0d\x7f\xcb\xc7\xe6\xd3\xa7\xaf\xf9\xb9\xf8\xc5\xa1\xee\xdb\x5f\xb9\xbb\x55\x6f\x76\xf3\x87\x38\xa7\x51\x9b\xfd\x89\xb8\x0f\xdf\x74\x7b\xf9\x34\x1b\xd7\x14\xb8\x6a\xf7\x57\x3f\x5e\x78\x60\xea\x1d\x2f\xde\x2a\xdf\x84\x42\xa3\x1f\x28\xf7\xa0\x2a\x40\x12\x2c\x4e\xd5\x55\xa7\x8b\x4a\x4b\x8b\x6a\xf5\x8f\x72\xf0\x5a\xee\x16\xee\x6e\x0e\x73\x6d\xea\x98\x37\x6d\xf2\xd2\x51\x1a\xd1\x3a\x75\xca\xee\x4a\xab\x69\x6f\x26\xa6\x33\x1a\x8b\x2b\x33\x76\x3e\x5c\x3c\xa7\x34\x07\x81\x21\xc5\xb4\xb2\x01\x22\x97\xb0\x00\x3d\x41\x5f\xab\xa4\xb0\x34\x54\x92\x55\x60\xce\x2a\xb8\x98\x91\x0d\xf0\xe1\x0d\xcf\x6d\x9e\x49\x6d\x79\x40\xd0\x3e\xca\xb0\xb1\xb8\x8b\x9d\xb9\x76\x57\xf7\x92\xbd\xab\x1a\x46\x66\xd1\xbb\x76\x25\xe6\x67\x66\x87\x4b\x67\xcf\x99\xdf\xbb\xe6\x2e\x1d\xfc\xd4\x55\xb7\xc0\xdc\x72\xcf\xeb\x9b\xd0\xea\x9b\xc2\xcd\x16\x76\x72\x71\xb4\xfa\x86\x43\x6b\x1b\x5b\x37\x3d\xbf\xaa\xef\xe5\x41\xad\xc9\x63\xdc\x6f\x72\x1b\xd5\xf8\xa3\x3d\x8f\xce\xe8\xcb\x54\x00\x79\xcc\xc5\x8d\x64\xcc\x63\xa0\x01\x2c\x4b\xd5\xdb\x87\x1d\x0e\x6f\x2d\x19\xf8\xc6\xd0\xdd\x65\x70\x59\xd9\xba\x32\x54\x36\x5c\x5c\xa3\x5a\x58\xe1\xf5\x42\x6f\xb0\xd8\xab\xea\xad\x09\x46\x22\xd2\xc0\xdb\x9c\x36\xbb\xdd\x68\x33\x55\xe7\x46\x5f\xde\x2c\xfc\x13\x17\x50\x0a\x12\x2f\x72\x03\xc9\x69\xab\xf0\xff\xc2\x11\x8a\x1a\xa6\x77\x54\xf7\x77\x7f\x77\x5e\x15\xf3\x3f\xf6\x04\xd6\x66\xd4\x23\xf1\x61\xb8\xc1\xb6\xfa\xd0\x7f\xdc\xfb\xcf\xfc\x41\xdc\x4c\xfc\xa1\x12\xd4\x80\xbe\xd4\x34\x73\x8b\xc5\xe2\x8a\xa7\x19\x9e\x67\xea\x8a\x1f\x0d\xc2\x6b\x83\xb7\x04\xef\x0e\xe2\x60\x5b\x51\xb5\x2a\x5d\xe6\x75\x45\x5d\xc8\xe5\x2f\x92\x9c\xa2\xc8\xa5\xca\x54\xfb\x4b\x4b\x01\xa7\x9d\x63\xb2\x9a\xcc\x66\xde\x64\xad\xca\x00\xfe\x92\xc6\xb9\xd8\x3d\x8c\x72\x9f\xd4\x09\xde\x00\x2f\x36\x8e\x55\xb6\x8e\xe2\x24\xcf\x8c\x77\x88\x69\x5b\x3a\xfa\xbb\xee\x59\x52\x8f\xc7\xbb\xcd\xbc\x9c\x8f\x50\x8b\x0b\x3d\xc2\x57\x4c\x8b\x8f\xc2\xb5\x42\xd7\x5d\xcf\xad\x9e\xe0\x38\x8f\xe5\xfd\xe4\x12\x3d\x0d\x09\x0e\x01\xe9\xa5\x74\xb8\xa0\x97\x92\x29\xa5\x83\x66\x3a\x04\x81\xcd\x28\x68\xc7\xe1\x6b\x91\xe7\x09\x06\xf6\x6f\x64\x7c\x2d\x20\xe3\x6b\x99\x05\xf2\x34\x4f\x17\xe0\x6b\x6d\x15\x01\xb5\x80\x1e\x04\x41\xb0\x20\x55\x7d\xb7\x0e\xda\x74\xb5\xba\x65\x3a\xbc\x4e\x0d\x35\x5a\xad\x7f\xa1\x10\xd6\xa9\xa9\x6e\xda\xe5\x02\x34\xa4\xd5\xba\xab\x30\x00\x94\x86\xc1\x6e\x6f\x8f\xcb\x6a\xa5\xe4\x0e\x67\x43\xf1\x82\x37\xb2\x0c\x3e\x4a\x40\xca\xc9\x76\x0d\x66\xb3\x30\xb7\x50\xc2\xc4\x3f\x4a\x05\x9f\xaf\x9f\x1b\x38\x7a\x14\x25\xdf\x1e\x79\x97\xd9\xf8\xab\xc7\x2e\x9f\xfb\xbd\x5f\xac\xab\xee\x98\x31\xc5\xdb\x7c\x47\x1b\xbc\xe5\xb2\x35\xbb\xd0\x06\x8e\x1d\xd9\xa7\xe4\xac\x16\xcc\xf9\xc1\x67\x7b\xc6\xe5\x82\x37\x1d\x59\x57\x37\x3e\x17\x5c\x0c\xae\x48\xc5\x8a\x79\x87\x1f\xfa\x8b\x8b\xcd\x69\xba\xc4\x67\x05\x35\xa0\x05\x60\xe0\x6e\xf1\x18\x0c\xc0\x03\x3d\x3e\xd0\xe1\x72\x38\x3c\xfe\x22\x8e\x94\xcc\x6a\x3d\x96\x7f\xa0\x4e\x56\xd1\x27\x5b\x17\xab\x86\x63\x9d\x51\x73\x07\x7d\x55\x48\x3e\xe9\x93\x14\x44\xd7\x2d\x1d\xd8\xda\xd9\xbe\xa9\xff\xda\x59\x2b\xa2\x15\x2b\xa6\x3d\xfa\xc4\xa4\xab\xb6\x5d\x71\xf9\xcc\x81\x01\xf8\xfb\x0f\xd1\xd5\xa8\xf1\xbb\x6f\x3f\xba\xf3\x83\x7b\x52\x5e\xcf\x0f\xec\xc1\x57\x7f\x75\xdd\xae\xab\xab\x3c\xe2\x2c\xaa\x5d\x64\xe0\x05\x20\xe3\x23\x6e\xa4\x4e\x11\xcc\x89\x99\xa9\x72\xbd\x59\x75\xc1\x63\x06\xc5\x0f\x15\xef\x2b\xc6\xc5\xc5\xb4\x19\x2f\x44\x90\xee\x06\x14\x54\xf5\x14\x63\x8b\xfd\x2a\xb3\x60\xc2\xd2\x76\x4d\x39\x05\x90\x64\x1f\x92\x96\x82\x21\xfe\xec\x10\x39\x35\x37\xd6\x0f\x09\xf5\xd2\x8e\x4d\x46\xc8\x60\xb1\xaa\xe0\xfe\x17\xb9\xfb\xe3\x84\xb5\x7e\x4a\xfd\xea\x43\x67\x0e\x1e\x39\xc7\xfa\xfc\xc5\xbc\x39\xd9\xb9\xaa\x23\xd0\xee\xb6\x36\xf8\x62\xa9\x72\xa7\x56\xe7\x0f\x47\xac\x68\xaa\xdc\xab\xc6\xd8\xf7\xd5\xb9\xf7\xe7\x2c\xdb\xbf\xba\x81\xd5\xed\xd4\x72\xcd\x57\xaf\xad\xa9\xff\x05\x64\xe0\xe4\x43\x00\x02\xaf\xb8\x99\x7a\x86\xe0\x6e\x37\xa7\xfc\x1a\x4e\xd5\x66\xe6\x6c\x36\x9a\xc3\xad\x08\xd2\xad\x92\xd0\x19\x1b\x67\xec\xd4\x5b\x31\x06\x19\x3a\x77\x98\x30\x5e\xe0\xf1\xf2\xfa\xb5\x50\x3e\xa7\xcb\x77\xbe\xc4\xdf\x0c\xae\x1f\x5c\x3f\x28\x9e\x30\xa7\x7a\xbe\x3b\xcf\x5d\xcd\x59\xdc\xb5\x57\x5e\x96\x30\xa2\x07\x77\x4b\xdb\x37\xdc\x2f\x8e\x88\x8f\xfc\x71\x05\xc3\x6c\x66\xd6\x7e\x01\x57\x5f\x00\x39\x1f\x6f\x21\xfd\x5c\x3b\x52\x55\x66\x7d\xb7\xcd\x63\xe2\xba\x79\x9a\xe6\x79\x1f\x8f\x7c\x7c\x8c\x47\x3c\xdb\xb3\xcb\x04\x39\x53\xd4\x84\x18\x93\x89\xb7\x08\x98\x37\x32\x9a\x1e\x5a\x39\x3d\x25\x0e\xb1\x58\x06\x5d\xec\x23\x2e\xa1\x5c\xcd\xcd\x79\x71\xbc\x26\x59\x70\xe6\x6e\x66\x11\x5a\x50\xd9\xda\x58\xe3\xa9\x5b\xd5\x7c\xe0\x99\x91\x17\x8e\x1e\x45\x6d\x47\xdb\xef\x7a\x5e\x04\x8a\xc7\x9e\xff\x1b\xf2\xe6\x8e\xc0\x2f\x9c\x95\x5c\x59\xce\x0b\x68\x09\xd6\x9d\x0b\xa4\x53\xe5\x66\xbd\xb2\x39\xf1\x98\xb8\x56\x1e\x63\xc0\x4b\xe2\xbe\xc3\x53\x2a\x9e\xcd\x10\x19\x39\xbe\xf0\x84\x37\x97\x99\x58\x9c\x55\x04\xcc\xca\x12\x8e\x9d\xee\x4e\x90\x70\xc7\xcc\x15\xd1\xc8\x75\xd3\x1a\x16\x36\x7a\x47\x7e\x3b\x38\x88\xfc\x83\xcd\xab\x1f\x13\xb5\xc4\x33\x2b\xaf\xda\xb9\x02\x3e\x97\x3b\x35\x1f\xfe\x2f\xc9\x65\xc7\x72\x28\xa7\x48\xbc\xd4\x95\xaa\xd6\xab\xbb\xa5\x4d\x13\xf2\x69\x62\x1a\xa4\x91\x9c\xd3\x40\xbc\x93\xe9\xd9\xa5\x87\x9c\x3e\xaa\x47\x8c\x5e\xaf\x61\xb5\x18\xd0\xb4\x06\x63\x4d\x2e\xc6\x3d\x5d\x60\xd0\xc4\xd9\xa1\xb8\x34\xf8\xb9\x4c\x8a\x3c\xf0\xf9\x4c\x8a\xec\x99\x23\x5f\x1d\x3d\x8a\xf4\xff\x28\x97\xf2\x0c\x89\xa5\xda\x52\x65\x6c\xab\x41\x4f\xf2\x29\x13\xd2\x27\x28\xa3\x52\x51\x1a\x9a\xe4\x4f\x28\x96\xa5\xc6\x25\xae\xf3\x69\x04\x59\x92\xcf\x26\xe4\x4f\x70\xc0\x84\xa7\x89\xe6\xc1\x41\x78\x6e\x50\xf2\xbd\x8b\x32\x28\x63\xbd\x36\x3d\xa0\x31\xe5\x73\x0f\xbb\x5c\x56\xd0\xed\xf0\xea\xbb\x81\x06\x6a\x20\xd3\x63\x15\x04\xad\xa7\xc7\xe9\x72\x39\x8d\x36\x2d\x96\x43\x5d\xa5\xb5\x7c\x3e\x3c\x88\x4b\xef\xea\x20\x89\x61\xc6\x42\xaa\x26\x24\xef\xb2\x03\x02\xbe\xaf\xfe\x9a\xc5\x8b\xaa\x95\xb8\xa0\x72\xde\x95\xbd\x75\x47\x8f\xf6\x1f\x84\xfd\xd6\x62\xab\x7e\x2c\x2e\xd0\x9a\x8b\xcc\xe8\xe4\x85\x76\x71\x23\x0a\x2b\xf1\x55\x90\xf8\xd3\xcc\x54\xa5\xa3\xc5\x6e\x37\xb9\x5a\xfb\xad\xd0\xea\x31\xb4\x02\x2d\xaf\xf5\x69\xdf\xd1\x52\x2a\x2d\x9d\xe1\x78\x2f\x8f\x78\x5e\xe7\xcc\xd8\xec\x76\x9b\xc5\xac\xe3\x0a\x84\xcc\xca\xe6\x21\xfe\x44\xa4\x84\x97\x08\xb4\x08\x64\x07\x5e\x9d\xdf\xf8\x0e\xae\x58\x7a\xe5\x0f\xbb\x06\x0f\xf6\xef\x83\x7f\x2e\x8a\xf9\x84\xb1\x50\x6b\x72\xbd\x14\x08\x88\x9b\x91\x4d\xf6\xa7\x3e\xc5\x9f\x3c\xe0\xa3\xd4\x14\x17\x0b\xb5\x2c\xfc\x96\x85\x9f\xb1\xf0\xdf\x59\xf8\x22\xfb\x06\x8b\xee\x65\x77\xb3\x87\x58\x7c\x03\xfb\x1d\x16\x2d\x64\xe1\x64\xb6\x9d\x45\x0e\xb6\x8c\x45\x58\x67\xd2\xa1\x2f\x74\xf0\x3f\x74\xf0\x7d\x1d\xd4\x1d\x1e\xfd\xcf\xd4\x02\xc1\x92\x5e\xa2\x5b\xa3\x43\x5d\x3a\x98\xd4\x5d\xa6\x43\x56\x5d\x48\x87\x4c\xc3\x46\xc1\x03\xf4\x7a\xb5\xcb\xaa\x65\x21\x6b\xb9\xc0\xf1\xf0\x18\xff\x36\xff\x5b\x1e\xf3\x02\xad\x83\x3a\x15\x52\x5f\x90\xb6\xff\x48\xc3\xf7\x58\x8c\x6e\x16\xe9\x30\xad\x87\x58\x6f\x00\x10\x02\xb5\xc9\xa4\x56\xfc\xb6\x27\x1b\xef\xc9\x12\x04\x28\x19\x7d\x35\x1e\xcf\x46\xcf\x4a\x7e\x9b\x8d\xc7\x85\x7a\x21\x91\x20\xde\x23\xf7\x2d\xc8\x66\xfb\xc6\xf0\x8a\xfa\xfc\x70\xac\xe2\xce\x94\x30\xc9\x6e\x15\xc8\x55\xfc\x42\x51\xbc\xa0\xa6\x29\x8a\xde\xf1\xd9\x39\xe6\xf3\x2f\x77\xbf\xd8\x7f\xf0\x06\x0a\x53\x58\x2d\x7e\x43\x83\xf6\xb6\xe6\xfb\xea\xbf\xdd\x49\x0f\x0e\x2f\xa0\x9e\x92\x4f\x12\xf0\xba\x49\x77\x37\xb6\xb6\x0d\x23\x00\xc1\x1a\xc5\xff\x4b\xc0\x9b\xa9\xfb\x0f\x97\xfc\xa2\xe4\x37\x25\xf8\xf1\x92\x1f\x95\xa0\x7b\x4b\xe0\x8a\x12\xd8\x5d\x02\xd3\x25\xb0\xac\xa4\xbe\x04\x39\x4b\xa0\xa6\x04\x7e\x60\x87\x27\xed\xf0\x5f\xed\xcf\xdb\xd1\x4e\x3b\xbc\xc2\x7e\x8d\x7d\x8b\x1d\xb7\xd8\x61\xad\x1d\x86\xec\xd0\x62\x87\x8c\x1d\xaa\x39\xa8\x66\xa1\xca\x00\x55\x7a\x88\x59\x43\x51\x11\x63\xb7\xb4\x51\x56\xb3\xb5\xc4\x8a\xad\x14\x46\x25\x4c\x1b\xa4\xd7\xa3\x53\xe8\x23\xf4\x29\xa2\x90\xaa\xa4\xc4\x6c\xe7\x8a\x58\x8e\x85\x88\xb5\x50\x94\xc5\x02\x73\xf8\xab\xc4\x68\x42\xbe\xe5\x81\x3c\xc3\x4e\x93\x56\x8b\x32\xc0\x49\x4f\xf6\xd2\xff\x41\xc5\x42\x2c\x56\xe1\x00\xae\xc2\x72\x07\x84\x22\x6c\x6b\xc2\xb5\x26\xca\xb3\x63\xfd\x53\xeb\xd7\x53\xbc\x20\xd0\xaf\x6f\x3e\x41\xf1\x46\x23\xb3\xe3\xcd\xd7\xb4\x16\x23\x47\xd1\xac\x60\xd2\x9e\xa2\xda\xe5\xc9\x89\x37\x59\x2e\x6b\x9f\x61\x1c\xb9\x0d\x6d\x65\x9b\xda\x66\x3a\xe5\xbe\x08\xc5\x73\x66\x36\xf1\x42\x63\x7b\x47\x31\x7a\xe4\x52\xfb\x2d\xd2\xc7\x56\xda\x6f\xbd\xe4\x94\xf7\x5b\xa3\xa3\xa4\x77\x25\x12\xe8\x10\x3a\x3c\x3a\x3a\x60\xe6\x28\x55\x01\xfe\x29\xe9\xed\x44\xf0\x4c\x27\xcb\xfb\x2d\x8a\xec\xb7\x50\x89\x10\x42\xc1\x70\xb1\xda\x5a\xf0\xac\x4c\x3b\x92\xa3\xfd\x52\x2f\xd9\xcb\x39\x06\x31\x32\xd1\x21\x4c\xa8\x5b\x1c\x32\xf5\xfc\xdd\x7f\x42\x9f\x60\xed\x4e\x96\xb1\x76\xf5\x0a\xc6\x72\x48\x08\x61\x54\x59\x5a\x21\x73\xc8\x3f\x2f\xed\xff\x8e\x10\x7d\xee\x20\xfa\x54\x8e\x9e\xa3\xf6\x13\x2c\xdf\xbd\x05\x3d\xd4\x57\xe4\x7a\xa2\xbf\xbc\x04\xd8\xe4\xde\x9c\xac\xd2\x9b\x53\x18\xdf\x43\x5d\xc6\x84\xb6\xe5\x30\x9e\x5f\x5e\xc2\xcb\xfa\x39\x84\x10\xe2\xdc\x85\x88\xd0\x28\x8f\xcf\x51\x04\xca\x40\x73\xaa\xa4\xc4\xb9\x90\x8d\x04\x17\xda\x7d\x38\x86\x11\xc6\x5e\x7b\xd4\x8e\xec\xc1\x1e\x87\x43\xe3\xed\x31\x99\x30\xe8\xa1\x34\x94\x8c\xd6\x98\x6b\x83\x4d\xee\xf6\xe5\x5e\xaf\x8c\x2a\x49\x42\x36\x68\xb4\xe4\xd1\x04\x1a\xa1\xbf\x0a\x63\x05\xb8\x03\x05\x56\xff\xb4\x33\x94\xc9\xae\x9e\xfe\xc0\x99\x87\x67\xb6\x3d\xf0\xce\xd6\x6d\xc7\x6f\xaf\xc5\x57\x33\xb5\x4b\x77\xc4\x66\x6f\xe8\xae\x61\x46\x96\xa0\xc0\xcc\x75\x74\x59\x85\xef\x10\xe7\x34\x69\x6f\x38\x29\xfe\xf9\xc7\xcf\x88\x9f\xbe\xb2\x7c\xd9\x71\x28\xfc\x78\xee\xed\x2f\xdf\xdd\x3a\x7c\xad\x1c\x91\x6c\x9c\x21\xe7\xd1\x94\xfe\x48\xa0\x08\x84\x41\x5b\x2a\x52\x2c\xa4\x39\x1a\x8e\xd2\x90\x2e\x0b\xa4\x39\x87\x03\x70\x10\x70\x3c\x77\x9e\xc3\x6a\x2e\x90\xe1\x79\xe0\xcd\x68\xad\x0e\xf3\x1c\xa7\x14\x7c\xc4\xc7\x54\x59\x2c\xef\x15\xf8\x8f\xa5\x25\x42\x8e\x35\x72\x5b\x5f\x49\x07\x19\x57\x22\xd9\x84\x4d\xf1\x9a\x5a\xbf\xb9\x08\xa1\xca\x75\x27\xb7\x77\xa6\x37\x1f\x5e\x7d\xc3\xff\x77\x6b\x0a\x33\xf4\x8f\x9f\xaa\xbb\xea\xca\xae\x8a\xc8\xe5\xf3\x7b\x97\x6e\xd9\xa3\x1f\x79\xd5\x37\x6d\x19\xb5\xb8\xfd\xc1\x5f\x6d\xbd\xe7\xd7\x8f\x74\xca\x91\xc5\xf3\x5a\x93\xdb\xf8\xa4\xd9\x6d\xd2\x7c\x1b\x2c\x8c\x21\xc8\x38\x48\x7e\x76\xfc\xb6\xf1\x7d\xd0\x31\xaa\x92\x1c\x0d\xc4\x26\xd9\xd9\x09\xf8\xcc\x79\x2c\xef\xe3\xb7\xcb\x7e\x86\x14\x3f\xab\x90\xfc\x0c\x56\xc5\x39\xfa\x22\x3f\x3b\x2d\xf1\x90\xe3\x92\xbc\x2f\x23\x68\x95\x71\x2c\x46\x07\xec\x6e\x39\x36\x19\xff\x19\x89\x87\x1c\x9b\xe4\x71\xa3\xad\x42\xfe\x13\xfc\x44\xdc\x68\xd2\xaf\x97\xf0\x79\x51\xe6\x33\xfa\x99\xc2\xa7\x54\xe6\xf3\xf5\x40\x79\x95\x5c\xb1\x97\xe7\x43\x7a\x2f\x11\x3e\x67\x64\x3e\x23\x32\x9f\xa0\xcc\xe7\xc2\x40\x38\x22\x17\xee\x15\xf4\xfd\xdf\x3b\x7a\x8e\x9a\x46\x0f\x02\x1f\x98\x99\x2a\x9b\x0f\x60\x0b\x80\xee\x85\x3e\x1f\x0d\x16\x3a\x9d\x06\x2b\x5d\xec\xf1\x00\x03\x34\xf8\x3c\x3d\x45\xe0\x2a\xa7\xb3\x08\xb3\xa6\x5e\x83\x56\x01\x1b\xcd\x41\xa4\x4a\xbb\xaf\x8f\x5f\x96\x1c\x40\x48\x48\x6f\xcb\x6c\x76\x5c\xc4\xa0\xdc\x21\x8e\xc0\x24\xf4\x27\xfd\x16\xd4\xbe\xe6\xc8\x5d\xad\xd3\xef\x39\xbd\x6d\xd5\xf1\x2b\x22\xbd\x4b\x96\x54\x3d\xd7\xff\xf6\x91\xf5\xf0\xe0\xc8\x41\xdc\x88\x1b\xa8\x9a\xa5\x8f\x5d\xdb\xbb\xef\xe6\x54\x71\xe5\x21\x5b\x89\xdd\xf0\xc8\xd6\xad\x9b\x1e\x83\xef\x1e\x54\x6a\x81\x0f\x89\x66\xaa\x81\xac\xfd\x2d\xa9\x90\xaf\xbd\xa4\x84\x06\xed\xa0\x08\x16\x15\x19\xec\x2d\x74\xc8\x2f\x09\xeb\x05\x1d\x45\x45\x26\x7f\xa6\x98\x63\x4d\x19\x83\xd6\xa5\xcc\x35\x52\xdf\x33\xd6\xbd\x38\xab\x08\x5b\x20\x6a\x6d\xae\x1c\x96\xa0\x4b\xc9\xc2\xa6\x97\x0f\x6e\xed\x98\x75\xdf\xc9\xf5\xb7\xbf\xdc\x84\xfc\x5d\x57\xaf\x6e\x98\x7d\xe7\xa2\x44\xc3\x0d\x8f\x2d\x5c\x07\x07\x47\x76\xe2\x46\xf8\x81\x2a\x75\xd3\x81\x1b\x56\xbd\x78\xf7\xcc\x92\xe2\x83\xbc\xd7\xce\xc5\xae\xdc\xd8\x31\x6f\x7d\x26\xb8\x01\x7e\xb6\x7b\x4b\xbe\x2f\x30\xf3\x72\xae\x2f\xf0\xb1\x36\xe2\x97\x52\x74\x6a\x92\x62\x59\xc1\x58\xd0\x15\x38\x8f\x2d\x4d\xaf\xce\x61\x4b\x1f\x6b\x43\x72\x2c\xcb\x0a\x21\x08\xf5\x86\x31\x64\xe9\x7c\xcf\xe1\x48\xbe\xa7\x7a\x41\xef\x7f\x8b\xe4\x28\xc0\xe6\x92\xa9\x17\xf8\x96\x4c\xff\x4c\x1e\xbb\x5a\xf1\x79\x04\x79\xc9\x51\xa0\xd1\xaa\x1d\xef\x57\xf9\x79\xf5\x52\xe9\xc4\x79\x65\x27\xf3\xca\x59\x84\x54\x13\x78\x10\xec\x1f\xb2\x7e\xa7\x65\x1e\x7f\x07\x64\xc5\xb7\x0b\x64\xc5\xff\xfb\x80\xb3\x08\x6b\x26\x7c\x26\xdf\x8f\xf7\xb8\x79\x8c\x86\xb4\x86\x1f\xb7\x4c\x98\xdf\xe6\xf1\x72\x50\xb8\x8a\x0e\x51\x18\xc4\x26\x69\xc1\x3f\x92\x43\xa2\x91\x97\x83\xc2\x01\x21\x44\x61\x49\x8e\x60\xd9\x45\x9f\x21\xfd\x2e\x89\x4d\xdf\x56\xe6\xde\x3d\xca\xdc\x73\xcb\x73\xef\xe0\x40\x51\x31\x64\xc6\xd9\x88\xf4\x9e\x20\x36\xfd\x5c\xe6\xf3\x8e\x3c\xf7\x5c\xf2\xdc\x7b\x7d\xc0\xe3\x37\x18\x27\xf0\x21\xfd\x82\x89\x5f\xbc\xa6\xf8\x85\xba\xa0\xbf\xbd\xda\xee\x60\xc1\xc5\x18\xe2\x92\x5f\xc8\x18\xe2\x79\xbf\x70\x08\x21\x88\x6c\xf6\x31\x0c\xf1\x7c\xef\xfc\x48\x8e\xf6\x4b\xbd\xe4\x7d\x5e\xa0\xc3\xe8\x40\x51\x31\x0b\xc6\xe3\xed\x10\xfa\x67\x72\xf4\x5f\xea\x55\x2b\x7e\x41\x94\x50\x7b\xfc\x40\x33\xee\x79\x99\xc7\x9a\xbc\xfc\x9d\x60\x6e\xce\xf7\x8a\x24\x26\x73\xed\x01\x76\xa2\x6d\x65\x1c\x74\x7f\x5e\x87\xce\xc5\x0a\x0f\x8f\xc4\x63\xb1\xad\x78\x02\x8f\xad\x79\xff\x7e\xe3\x92\xfe\x0d\x6d\x2e\x66\x22\x0f\x92\x1b\x20\x63\xa1\xe0\xf4\x0f\x2b\x3c\x2c\x12\x0f\x64\x73\x71\x85\xde\x0a\x61\x44\xa9\x43\xd0\x80\xba\x54\x00\xe8\xe8\x61\x86\xc1\xdd\x40\x0d\x81\xda\xa7\x8e\xa9\x1f\x52\xef\x53\x9f\x57\x33\x6a\xd4\xa3\xc1\x34\x8d\x7b\xd4\xb9\xf2\x03\x48\xe2\xb7\xe8\x10\xff\x56\x75\x0c\x2a\xd5\x00\x01\x72\x95\xe1\x27\x3f\x39\x42\x0f\x1e\x1c\xde\x29\xb7\xba\x95\x7b\x31\x8a\x9b\xc9\x1d\x06\x0d\xa8\x4a\x39\x91\x4e\xd5\xa2\x56\xd3\xad\x80\x14\x1c\x60\x40\x65\x20\xa7\x52\xd1\x63\xd5\x06\x72\x45\xeb\x10\xff\x16\x09\xcc\x14\xda\x30\x80\x3e\x1d\x39\xb5\xaf\x9f\x6a\x57\xca\x0c\x80\xd2\xbf\x68\x25\xb1\xcf\xe9\x89\x73\xc2\x29\xcd\x09\xe8\xf6\x01\xf3\x04\xfb\x90\xbe\x32\xc4\x3e\x9f\x15\xce\x7f\x0a\x3b\xa4\x49\x81\x5c\x5e\x46\x18\xd7\xbf\xe2\x61\x71\x25\xb1\x8f\x07\xa4\x53\x21\x8e\x54\xed\x03\x2f\xaf\xb9\x60\xb3\x21\x55\xb7\xdb\x69\x37\x31\xce\x1e\xec\x72\xa9\x50\x8f\x07\xab\x7a\xec\x46\x53\xaf\x1e\x44\x87\x14\x54\x2f\x12\xf0\x45\xdf\x22\x40\x23\x43\x6f\x91\x5b\x19\xd9\xb1\xeb\x1f\x09\xc1\xcc\x8c\x9d\x2b\x35\xc2\xf1\xd7\x41\xf6\xac\xda\x90\x3b\x30\xcc\xdf\x0c\x11\x03\xe2\x99\xbb\x1e\x14\x34\x3b\x55\x6c\x75\xf5\x4e\xe5\x96\x88\x14\x8f\xae\x24\xf6\x95\x64\x0c\x6a\xb5\x06\xc6\xeb\xb0\x72\x6d\x1e\x8f\x7c\x53\xc4\xea\xc8\x58\x8c\xf2\x75\x11\x83\x3a\x43\x73\x86\x39\x20\xdf\xad\x87\x5c\x98\x92\x84\xcc\xc9\x18\xbd\xe4\xd5\x91\x89\x92\x16\x5e\x25\xd9\xb3\xea\x8e\x50\xb3\x95\x6d\x28\xae\x8a\x8f\xdd\x2a\x79\xad\x50\x4e\xb9\x27\xb6\xb8\x92\x3a\x4d\x0f\x1a\x43\x2f\x55\x93\x3d\xe8\x6d\x70\x00\x00\x60\x1b\x84\x10\x58\xfa\x2d\xe8\x30\x1c\x18\xb0\xe8\x29\xc9\x9b\xb3\x72\x89\x8c\x34\xbe\xe2\x4a\x6a\x1d\xd5\x6e\x0c\xbd\x34\x87\x7c\xe6\x76\xb8\x18\x00\x50\xf4\x3c\x84\x19\x0b\xb4\x1c\x1e\x3d\xfe\x9c\x46\x5f\x73\x18\x2e\x1e\xb0\xe8\x75\x92\x57\xcb\x1f\x85\xb9\xfe\xdb\x40\x00\x07\x5e\x04\xba\xd1\x6f\x52\xb6\xb1\xf4\x7d\x61\xa6\x9e\x3a\x3c\xfa\x4d\xca\x27\xfd\x8e\xb2\x52\xd2\xe8\x93\xdf\x21\x07\x2a\x43\x98\xd3\x30\x18\xe8\xf5\xac\x4e\x7b\x78\xf4\x7c\x4a\xab\xd5\xd2\x2a\x41\x25\x40\x8a\x34\xd8\x73\xd0\x06\x96\x67\x59\x04\x79\x88\x81\xaa\x87\xd3\xab\xd5\xd0\xa0\xc5\xb4\xdc\x5b\x36\x57\xcb\x10\xcf\x97\xd7\xd6\x25\x8c\xf2\x5d\x40\xf2\x2f\x21\x21\xfd\xa7\xe4\xb3\x23\xb1\x6a\x92\xd1\x0f\x40\x52\xd0\xa0\x81\x09\xe8\xb7\xa0\x0b\x70\xcf\x7b\x72\x66\x7f\xb7\xf8\x5b\x68\x11\x77\x28\xd9\xfd\x07\xa0\x07\x0d\x8c\xcc\x22\xe9\xfd\x81\xfd\xa8\x97\xe4\xf7\xf7\xed\x07\x30\xd7\xcb\x0b\x08\xe0\x95\x7f\x9e\xdf\xa7\x3f\xa2\x3f\xa5\x31\x4d\xf2\xfb\xf8\x7d\xfc\x7b\x8c\x19\x7c\xe9\xfc\x3e\x05\x29\xe9\x17\xb5\x46\x5b\x9a\xa6\x2c\x14\x12\x34\x82\x86\xd3\xf1\x06\xad\x0a\x52\x14\x83\x11\x22\x79\x7e\x9a\x61\xf4\x40\xc7\xeb\x90\xce\xa0\x15\x3a\x55\x14\x00\x88\xd3\x59\x68\xb9\x23\x43\x81\x29\x94\x4a\xfb\xb1\xe4\x7e\x22\x21\x37\x39\xbd\x44\x92\xdf\x94\xb7\x84\x5f\xb1\xcd\x41\x58\x26\x1e\x54\xf2\xfc\x07\x60\xa5\xf8\x36\xbc\xe9\x2d\x92\xe9\x87\x6b\xc4\xf7\xd0\x7a\xf8\xb6\x78\x2d\xdc\x2d\x56\x6f\x13\x59\x38\x20\xce\x82\x5f\xca\xf7\x6d\x01\xc0\x5f\x93\x9a\x69\x07\x28\x4f\x59\x19\x47\xb7\xc6\x65\x59\x28\xcd\x18\xbe\x87\xa6\x55\xf6\x5e\xad\x51\x85\x49\xff\xd7\x7c\xa9\xa4\x14\x86\x98\x26\x35\xc9\x39\x5a\x7f\x71\x15\x52\x6a\xd5\xac\x0d\x70\x5b\xed\xc6\xb7\x77\x3d\x7a\x54\x7c\x74\xcb\x2b\x77\x34\xa2\xe7\x36\x65\xef\x5d\x58\xf5\x2f\xcf\x3e\x09\x9f\x9e\xbf\xab\x6f\x1a\x5a\x7e\xa1\xbd\xf1\xc6\xbd\xb0\xc7\x35\xe5\xaa\x96\x7b\xee\x92\xfd\x77\x9b\xb4\x8f\x25\x3d\x36\x1a\x89\x3c\xd5\xa3\xe7\xa8\xcd\xf4\x20\xf0\x83\x18\x68\x4c\xf9\x35\xf6\x61\x4b\x2c\xc6\xf9\x86\x39\xd8\x0c\x11\x8c\x97\x76\x73\x81\x1e\xbf\xd9\x6c\xc5\x2e\x4d\xa4\x97\xd1\x2b\x4d\x24\x48\x36\x12\x46\xf3\x1d\xe1\x86\xea\x49\x1f\x34\x79\xdb\x96\xc7\x15\x20\x02\xcb\xc8\x35\x49\x81\x56\x84\x26\xdf\x51\x9b\x8b\xa6\xaf\xec\x5c\xb4\xb2\x38\x70\xfb\x55\xff\xfa\xc3\xea\xe5\x3f\xb8\x71\xee\x33\x53\x67\x14\x55\x78\x58\x71\x41\x66\xda\xe2\x29\xee\x8e\xc5\xb1\x29\x01\x03\xce\x88\xf6\xae\xfb\xaf\xa9\x9d\x3f\xbf\x33\xfb\xee\x87\xcb\xfe\xe5\xa6\x29\x68\xf9\xf0\x73\x37\x2d\xb3\x25\x2e\x9f\x02\xff\xf3\x60\xd1\xf4\xeb\x67\xdf\xf9\xdd\xc0\x94\xce\x08\x18\xd3\x85\x31\x83\x0a\xd0\x08\x9a\x52\x7e\xb6\xb4\x25\x18\x8f\xdb\x70\x0b\xc7\x40\xa6\xb9\xa1\xc5\xe6\xad\xcb\xb8\x79\x8a\x0a\x01\x16\x54\x66\x74\x66\x6b\x5e\x17\x52\x4e\x56\xa0\x4c\xac\x3a\x18\xaf\x49\xca\x67\x94\x92\x46\x01\x16\x93\x96\xc6\x72\xb1\x60\x22\x14\xae\x82\xca\x01\x99\x5f\x8a\x01\x95\xb2\x42\x8b\xd9\x8a\x17\x4c\x6b\x78\xa6\x78\xc6\x35\xd3\x57\x6d\x2a\xa6\x4c\x91\x29\x97\x37\xec\x7e\xa0\x7c\xf6\xf5\x53\xe7\x2e\xf7\xaa\x11\x42\xe8\x19\x8d\x33\x2e\x5e\x51\xd5\x1c\x36\x41\x21\x9c\x8a\x5d\x3e\x7b\xf6\xe6\xef\x7c\x17\x36\x88\x2f\xaf\xd8\x75\x75\xd5\x92\x65\x65\xed\xb5\x3e\x58\x04\x1d\x0f\xfc\xfa\xa1\x74\xfb\x54\x72\x75\x11\x3e\x39\xfc\xbd\xc6\xeb\x3b\x2a\xab\x16\x3f\xb0\x98\xdc\x55\x3c\x73\xfa\xdd\xd3\x00\x82\xc0\xe8\x39\xaa\x8b\x3e\x05\xea\x41\x26\x55\x1e\x1c\x06\xc0\xeb\x1c\xd6\xe9\x8c\x95\xc3\x5c\x0c\xc6\x1a\x04\x23\xc3\x18\xbd\xcc\x55\xaa\xaa\x2a\x95\xca\x52\xde\x93\x34\x19\x05\x81\xed\xb5\x50\xa0\x79\x28\x2e\x10\x40\x37\x02\x09\x5a\x0f\xa3\xe4\x10\x52\xd6\x7c\x28\x21\xef\xc0\x73\x68\xae\x35\x63\xc8\x9e\xf9\x5a\x48\x02\x10\x4a\x6a\x2d\xf2\xf6\xa9\x42\x50\xe4\xcb\xd3\x75\x7b\xf6\x5c\xbe\x70\xc1\xbc\x29\x8b\x93\x73\xa7\x3e\xb6\x6c\xce\x6d\x9d\xe1\xa2\xba\x4c\x75\x7d\x57\x9d\x9b\xf5\x46\xfd\xd3\x1a\x9e\x29\x9d\xbd\xf2\xb2\xcb\x6e\xec\x8c\xc0\xad\xb3\x57\xb6\xf8\x1f\xbb\x7b\xc3\x77\xd6\xf8\xcb\xd6\xd6\xd4\xd7\x5c\xb5\xa5\xb3\xed\xe6\x2b\x26\xf3\x8c\x21\x71\xf9\x6d\x5d\xed\xcb\xa6\x7a\xd6\x6c\x81\x6f\x88\x95\xd7\xef\xba\xaa\x32\xb4\xf8\x49\x12\x67\x44\x46\xcf\x51\x8b\xa9\x45\xa0\x1e\xb4\xa6\x82\x41\x67\x8b\x17\x48\xda\xb6\x14\x6a\x9b\x21\xba\xce\x49\x5a\x05\xb6\xc3\x68\xe1\xc7\x42\xfa\x13\x13\xf4\x4c\xc8\x75\x04\x55\xf8\x9f\x69\x69\x93\xe3\xa4\x31\x25\x91\x16\x1b\xcb\x5a\xea\xee\xbb\xef\xf2\x85\x33\xe7\x4f\xeb\x6b\x6e\x9c\xba\xe7\x9a\x39\xb7\xca\x5a\x26\xe7\xd4\x79\x29\xcc\x79\x2a\x89\x9e\xb3\x56\x5d\x76\xd9\xf5\xb3\x22\xd0\x55\x97\x49\xd8\x1f\x9f\x97\x99\xdb\x5e\xe2\x7b\xa0\x24\x54\xde\xb6\xb4\xbe\x76\x5e\x2a\xc2\x52\x4c\x51\xdd\x15\x8d\x35\x33\xa3\x96\x35\x5b\x60\x52\x7c\x59\xd2\xd3\x7d\xd9\x5a\xa2\x67\x58\xdc\x48\xad\xa5\x4f\x81\x6a\x90\x49\x45\x60\x77\x55\x55\x75\x98\x5b\x58\x5c\x5c\x3d\x0c\xa2\x99\x28\x8a\xda\xec\x6a\xb5\xdd\x6e\xb3\x99\x7b\x3d\x61\xf5\x55\x1a\x8d\x87\xaa\xea\x81\xb1\x18\xcc\x15\xca\x28\x30\xb0\x32\xfe\xb5\x90\x90\xb7\x2d\x71\xb9\xed\x9e\x3f\x20\x4c\xc4\xe9\x95\xb4\xc6\x85\x5a\x7b\x60\x42\x08\xe0\xd7\x8e\xd6\x2d\x7b\x34\x7b\x8c\xa0\xed\x06\x67\xf4\x4c\x5e\xf5\xa3\x99\x8b\x42\x57\xdf\xbc\x39\xbd\xf2\xe0\x8d\xf5\x89\x85\x1b\x66\xce\xbf\x77\x71\xbc\xbf\x1f\xee\x9b\xb1\x64\xaa\x2f\x8f\x99\x3b\xbd\x66\x83\xb7\xa6\xcc\x4e\x86\x73\x0c\x1b\xf7\x82\x5c\xe3\x99\x11\x37\x53\x8b\xa8\xc5\x20\x0a\x3a\x52\x65\x25\x6c\x8b\xd7\x0b\x5a\x23\x91\x68\x4b\x45\xb5\xd5\xa6\x56\xdb\x6c\x31\xab\x90\x71\x96\xa8\x32\x31\x35\x54\xab\x6d\x4e\xbe\xb2\x32\x32\x56\x6b\x23\x45\x87\x44\x2d\x98\x50\xc6\x51\x52\x2b\x11\x95\x8b\x6e\x0a\x95\x0a\xe5\xb0\x87\x2f\x52\x4a\xc0\x8c\xab\xe9\xda\x99\xe7\x4e\x35\x2d\x4d\x87\xef\xdf\x1c\x9d\x9b\xc9\x54\x36\x67\xdf\x58\xb3\x64\x5f\x5f\xa3\x3b\xd1\x1a\xa9\xe9\x9a\xec\xdd\xd7\x0f\x23\xd1\xb6\x6a\xe7\xe3\xc6\x70\xaa\x72\xf6\x6c\xad\xd1\x25\x3c\x1c\x0e\x96\xa4\xaf\x6b\x49\xce\x69\x28\x63\x75\x86\x8a\x69\x0b\x9b\x76\xe4\x6b\x74\x80\xb2\x76\xc6\xc0\xe5\xa9\x2a\xab\xc1\x75\x01\x7a\x86\x63\x8c\x01\x40\x1e\x22\x18\x83\x31\x43\x60\x98\x0b\xc1\x50\xdc\xe0\xeb\x89\x98\x4a\x4a\x04\xd8\xe3\xc2\x2c\x2b\xf4\x1a\x74\xf2\x32\x1a\x25\xfb\x9d\x5c\x1b\x5a\xb9\x71\x86\xb1\x9e\x1f\xe2\x3f\x13\xea\x63\xd5\x30\x97\x29\x9b\x90\x28\x93\x4f\xbc\x0b\x1c\x33\x89\x2a\x0f\x68\xcc\x16\x93\x46\xeb\x8a\x75\x34\x25\xc2\xac\x53\x70\x78\x2d\x2c\xa3\x32\xd9\x9c\x1c\xfc\x53\xc3\xb4\x19\xf5\xcf\x94\x77\xac\x9c\x31\x7d\x55\xa6\x82\x36\xde\xfc\xdf\x7f\xf9\xd5\x9c\x65\x3f\x58\x35\xd9\xba\x5b\xad\x99\x92\xed\xab\x69\x38\x01\x11\xac\xff\xc9\xf0\xbb\x9b\xd6\xad\xdb\x24\x4d\x3b\x69\x2d\xaa\xe8\x7d\xfc\x86\x31\x1d\x49\xcd\x7f\x5b\xaa\xd4\xdc\x06\xad\x2d\x65\xb2\x7e\x65\xb0\x4c\xe7\x6e\xe1\xbc\xd0\x1b\xd1\x79\x3c\x1c\xcc\x98\x39\x87\x5e\xcf\x75\x96\xe8\xd4\x0a\x08\x9a\x20\x17\xfc\x17\x6a\xc7\x0f\xf1\xa4\xd1\x1d\x83\x0a\x53\x80\xd0\x78\x69\xad\x9e\xd1\x7a\x42\xb1\xc9\x97\x95\x39\xab\x39\xb5\xa0\x0e\x36\xc6\x82\x06\xf8\x75\x6d\x7a\xea\xe4\x67\x4a\xda\x56\xb5\xb7\xf6\x75\x96\xe3\xfe\x23\xe2\x7f\x7c\xb0\xe3\xca\x30\xc3\x6c\xc6\x98\x64\xdb\x46\x1a\xb7\x6e\x58\xbf\x4d\x9a\x56\x92\x1e\xc1\xf9\x0f\x2e\x97\x7b\xb1\x2a\x63\x25\xed\x47\xcb\x5d\x60\xd8\x64\xb2\x31\xc3\x75\x1a\xc8\x69\xa0\xc6\xeb\xb4\x0e\xb7\xda\x20\xb0\xf1\x36\x64\xb3\xf4\xa8\x9c\x4e\xb7\x1d\xdb\x8c\xb8\x87\x25\x77\x2e\xe4\xca\x1f\xd2\x9f\x31\x4e\x5a\x6c\x92\xa5\x32\x56\x0d\x2f\x12\x79\x2c\x67\x83\x3e\x6a\xba\xec\xb2\xc9\x07\x83\xed\xab\x67\xce\x5c\x95\x2e\x11\xff\x72\xf0\x20\xb4\x1e\x84\x5b\x27\xda\x18\x56\xe6\x13\x49\x90\xf4\x1c\x5c\x4f\xf6\xcc\x99\x54\x35\xdd\x86\x5a\xed\xf3\xed\xc8\x6e\x77\xeb\xda\xd2\xec\x02\xf6\x29\x16\x73\x2c\x64\xbd\xd0\xd5\x06\xdc\xbc\x1b\xb9\xdd\x16\x67\x46\x0f\x21\x50\x67\x4c\xd6\x82\x2e\x5d\x27\x86\x9a\x73\xad\x72\x95\x4b\x16\xd2\x9a\x2e\xa7\xdc\x26\x08\xdc\x48\x6e\x93\x43\x0f\x2c\xde\x5f\x9b\x6e\x9e\xbc\x3f\xd0\xb2\xa2\x75\xfa\x0d\xb3\x4a\xc5\x8f\xf7\xcb\xe9\xa5\x91\xc6\xcd\x9b\xbe\xfb\xdd\x42\x63\xde\x27\xda\x48\x7f\xaa\xb5\xa3\xe7\xa8\xd5\xf4\x29\x50\x0a\xda\x52\xe5\xa5\xa5\xfa\x70\x37\xb2\x98\xcd\xa8\xdc\xb3\x10\xe8\xa1\xde\x62\xef\x11\x4a\x7b\xa2\xa0\x07\x20\x90\xe2\xed\x69\x00\xcc\x02\x55\xdc\xa3\x92\xef\xb0\xd4\x47\x23\x59\xe5\xa4\x6a\x88\x7f\x8b\x80\x07\x28\xbd\x7c\x94\xb3\xc9\x7f\x74\x1b\xa2\x09\x25\xfd\x68\x1f\x7c\x7b\xd2\xea\xff\xef\xb6\x7b\x7f\xf5\x40\x3a\xf3\xd8\x6f\xee\x59\xf3\xfc\xcc\xf4\xe4\xc7\x17\xcf\xbb\x7f\x69\x6d\xe5\x95\x77\xcd\x9f\xbb\x72\x9a\x4b\xfc\x0b\xfa\xfa\xc1\x1f\x7e\xf1\xfd\xb6\x15\xaf\x42\xdb\x33\x4f\x43\xeb\xab\x2b\x2a\xca\xf7\x17\xc7\xe7\xec\xfa\xb7\x6d\x77\x9d\xd9\x7d\x45\xed\xea\x43\x6b\x48\xde\x67\xf4\x1c\x59\x93\x4a\xc1\xd4\x54\xa0\xb4\x54\x0f\x2d\xcd\x66\x68\x36\x87\x5b\x61\xb9\x27\x2d\xab\xd1\x21\x94\x66\x24\xe1\xf9\xe2\x0e\x95\x55\x11\x3e\x2f\xfa\xc7\x43\xb9\xee\x02\x05\xb2\x5f\xf2\x4e\x81\x2c\xf9\x7a\x38\x14\xef\xfb\xe9\xa6\xad\xbf\xb8\x6b\x6a\xeb\xfd\xef\xdc\xbb\xfa\xe9\xd9\x8d\x53\x1e\x59\xb8\xf0\xbe\x45\xd1\xe0\xe5\x77\x2d\x9e\xb3\x6a\x9a\x5b\xfc\x10\xb5\xcf\xf8\xee\x2f\xb6\xb5\x76\x3e\xfc\xde\x5d\x9b\x7f\xf5\x48\x26\x18\xde\xe1\xa9\x9c\xbc\xf2\x89\xab\xb3\xdf\xbf\xb1\xa9\x32\xd3\x37\x9d\xd4\x6e\x2a\xbe\xec\x00\xa9\x54\x88\xe9\x96\x5c\xd8\x15\xb3\x43\xbb\x1d\x74\x3f\x69\x81\x96\x98\xe9\x4e\xd3\x43\x26\x6c\x72\x58\x7a\xac\x2a\x95\x15\xe7\xfc\xb8\x3e\x2a\x0b\xfe\x56\xf6\x8b\x5f\x46\xb3\x72\x11\xd9\xa5\x7c\x38\xe9\xb7\xf8\x51\xdf\xdc\x45\x8b\xe6\x0e\xc6\xb3\x77\xcd\xc9\x6c\xe9\x49\xca\x55\xfb\xe3\xdd\x37\x9c\xdd\xbd\x06\x3f\x9a\xab\x27\x2d\x93\xfc\x81\xe4\xf9\xa6\xa4\x02\x86\x56\xde\xb3\x1d\x3f\x89\x11\xc6\x74\xab\x57\x5a\x45\x9c\xbc\x13\x39\x59\x16\x6a\x33\x16\x2b\x05\x32\x90\x23\xb0\x60\xd2\xb0\x17\x08\x34\x14\xab\x36\x91\x3a\xfe\x8b\x36\x18\x49\xa1\x0c\x27\xc5\x97\x2d\xd5\x99\x86\x15\x3d\x2f\x44\x7b\xb6\xf7\x2e\xfc\xde\xb5\xb5\xb8\x7f\xf7\xee\x91\x0f\xa7\x5e\x3d\xd5\x37\xe6\xa3\x55\x57\xef\x5c\x81\x94\xb3\xd4\x83\xa3\xe7\xa8\x19\xf4\x29\xd0\x00\xda\x52\x61\xb7\xbb\x3a\x1c\xd6\x69\x1b\x2d\xdd\x00\xf8\x16\x82\x6a\x58\x5d\xe3\xb9\xea\x49\x27\x74\x3a\xe9\x50\xa0\x37\x5c\x61\xd2\xf1\xbd\x5a\x5a\x49\x04\xc8\x75\x6d\xd9\x21\x72\x95\x35\x21\x05\xfe\xf1\x78\x94\xf8\xa8\x49\xb9\x18\x22\x77\x32\x92\x87\xb7\x01\x5a\x72\x18\x8d\xb9\x2e\x4e\xc4\x0b\x6a\x93\x55\xf8\xbd\x29\x6b\x7e\xb4\xb2\x75\xfd\x8a\xee\x70\x36\x38\xfb\xf2\x85\x93\xea\x7b\x66\x84\x2a\xe6\x6f\x9e\xff\xca\x4b\x47\xde\x39\x74\x60\xe5\xa9\xae\xf2\x05\x4b\x56\xa7\xee\x7c\x75\xf3\xb4\xf8\xe2\x6d\x0b\x66\xde\xda\x55\x49\xf5\x76\x6e\xb9\xaa\xc6\x5e\x56\xe3\xdd\xe0\xaa\xf4\x1a\x8b\x26\x5f\x5e\xd3\x78\x4d\x3a\xfc\xd8\x96\xad\xdb\x1e\xac\x8e\x1c\x32\xb9\x4d\x9a\x29\xab\xf7\xf4\xa6\xd7\x2f\x6e\xd4\x31\xfa\xfa\x05\x32\x46\xb9\xd2\xe7\xdf\xc8\x1c\xdb\x42\xbe\xa7\x46\xff\x4c\xb5\x10\x0c\xf3\x9f\x93\xef\x95\xde\xec\x46\xe6\xd8\x59\x39\xbf\x34\xf2\x01\xf5\x34\xfd\x33\x25\x07\xc4\x1c\xcb\xe4\xce\xd9\x8b\xcc\x61\x8c\xa0\x83\x9b\x98\xff\x19\xf9\x80\xf4\x62\x54\xf2\x3f\xc7\x32\xc3\xca\xf3\xd5\xb6\x30\x46\xee\x8a\xe2\x09\xf9\x9f\x3e\x00\xa8\x45\xaa\xb5\xc6\xd0\x4b\x21\x72\x0e\x72\x03\x58\x0a\xbb\xf2\x67\x69\x4b\xcd\x36\x46\x3f\xee\x2c\x6d\x11\x00\xd4\x1a\x72\x0e\xd5\x22\xf7\xfa\xdb\x28\x9f\xa5\x85\x85\x10\xbc\xc3\x5f\x22\x78\x0b\xce\xd2\x10\x00\xd4\x29\xd5\x1a\x63\xe8\xa5\x18\xa1\x5d\x3f\xfa\xac\x9c\x3b\x72\x92\xdc\xd1\xb3\x03\x1e\xa7\x51\x3d\xf6\x3c\xc1\x34\x7c\x97\xd0\xce\xc8\xbd\x01\x1f\x24\xbd\x01\x9d\xa4\x37\xe0\x83\x03\x1e\xa7\xca\x3e\x4e\x96\x89\xf4\x6f\x20\xe7\x68\x92\x34\x3e\x3a\x04\xe7\x3a\x3d\xc6\x71\xe7\xc3\x17\xd1\xcf\xf5\xe1\xf4\x09\x21\xb8\xdc\xe9\x19\xa3\x9e\xa7\x1d\xc9\xd3\xee\x05\xd4\xb8\x33\x3a\xec\x2b\x31\x4e\x38\x1f\x96\xe9\x93\x73\x40\x99\x7e\xef\xa8\x7c\x96\x59\x24\x9f\x65\x8a\x03\xbe\x12\x95\x7d\xc2\x99\x92\x5f\xdc\x35\x6e\x7c\xe7\xc9\xf5\x57\xc8\x68\x0e\x23\xc0\x59\xc6\xe7\x0e\xc5\x5d\xe3\xc6\x76\xde\x67\xf2\xb3\x41\x5b\x18\x71\xc5\xa5\x97\xc8\x1d\x0e\xe5\x72\x87\xc7\xba\x80\x5f\xb6\x0d\xb2\xd0\x21\xe4\x2f\x29\xc8\x4a\x82\xb1\xbc\xe4\xf6\x3c\xed\x2e\x87\x4c\xbb\x54\x08\xa1\x86\xda\x4b\xe5\x25\xdf\xcd\xe7\x3c\x6f\x04\xb7\xe5\xce\xb5\x39\x3a\x84\xd1\xad\xb6\x10\x35\xf1\x5c\x5b\xa2\xff\x00\xb3\x31\x9f\xf7\xbc\x71\x83\xe2\x97\xc5\x42\x08\xa3\xbd\xe5\xf5\x13\xfc\x72\x22\x8f\xbe\xd1\x47\x94\xdc\xa7\x4d\xce\x7d\x3e\x32\x50\x62\x9d\xe0\xfb\x57\x10\x1d\xc6\x78\xf4\x3d\x2e\x9f\x9d\x97\xcb\x67\xe7\x47\x07\x6a\xcb\x0a\xb9\x8c\xe5\x6f\xd5\xed\x79\x3e\x37\x81\x05\xe3\x74\x59\x60\xf3\x5d\x52\x97\x59\xcc\x37\x79\x3e\x37\x2d\x2a\xd4\xe5\x8e\xf2\xc4\xa5\x74\x51\x5f\x9d\xe7\xb1\x86\x9c\x57\x93\x4f\x10\x65\x54\x65\xb5\x97\xe4\x81\x54\x7c\x9e\xc7\x9a\x5c\x1e\x97\x28\x53\x39\xa5\x7d\x22\x0f\xc9\x8f\xc8\x5c\x70\x02\xc0\x87\x8f\xb5\x02\x00\xe7\x2a\xfe\x54\x9c\xb2\xe2\x62\x73\x98\x28\x04\xbc\x41\x4a\x15\x44\xc0\xa2\x38\x00\x19\xd4\x48\x12\xe4\xfd\x8b\xcc\x8f\xc9\x00\xf0\xa1\x63\xad\xea\x9c\x97\x49\x14\x92\xb6\x30\x51\x90\x8b\xd7\xa9\xad\x41\x54\x5e\xaa\x38\x85\x42\x21\xaf\xa7\x29\xaf\xe7\xcd\x24\xc7\x47\xa4\xf6\x91\x7c\x47\xc0\x75\x69\x3d\x99\x97\xf3\x7a\xde\x3c\xaa\xe8\x99\x90\xf4\xf4\xd5\x54\x5d\xd2\x96\x63\x3c\xd6\xfe\x1f\x78\xac\xfd\x1f\xf1\x58\x90\xe7\x71\xcb\x18\x0f\x33\xe1\x61\xe3\xfe\xc1\x78\x31\x79\x1e\xb7\xe4\x78\x84\x09\x8f\xf2\x89\xeb\xee\x44\x9f\x58\x97\xcf\xed\x9b\x73\xb9\xfd\x8a\xc9\x97\xca\xed\x17\xf8\xc4\xba\xf1\x3c\x9a\x67\x5f\xd2\x27\x52\x79\x9f\x68\x1f\x1d\xc9\xfb\x44\x30\xc5\xe3\x22\x73\x18\x19\x25\x9f\x70\xf9\x25\x9f\x38\x3c\x3a\x92\xaf\x56\xc8\xbb\x45\xde\x2f\xe8\xbf\xe6\xfd\xa2\xfd\xbf\x0b\xfd\xa2\xda\x16\x46\x41\xc9\x2f\xaa\x26\x49\x7e\x61\x0d\x5f\xe4\x17\x67\xc4\x5d\x54\x80\x9c\xdf\x16\xc9\xeb\x96\x4d\x5e\x77\x39\x73\x18\x02\xbd\x71\x7c\xfd\x80\xb8\x8b\x4a\x93\x35\xae\xa9\xf0\x59\xe4\xb4\x85\x91\xcd\xe6\xd1\x15\x3e\x2b\xd7\x26\x0c\xe5\x6a\x13\x8e\x75\x81\xb0\xb2\xfe\x1b\xe9\x10\xe4\xfc\x05\x95\x09\x05\xfd\xaa\xb7\xe7\x69\x77\xd5\xcb\xb4\x3d\x42\x08\xd5\x57\xd8\x2e\x41\x3b\x99\xa7\xdd\x01\x1c\x0a\x6d\x3d\x1d\x82\xc0\x60\xbd\x14\x6d\xfa\x77\x79\xda\x1d\x7e\x99\xb6\x4d\x08\x21\x9f\xdd\x7f\x11\xed\x1d\x64\x6d\x2b\x52\xd6\xcf\x4d\xb9\x77\x8b\x5e\x7a\xb7\xac\x30\x07\xe0\xc4\xdc\x8c\x44\x7f\x0b\x59\xdb\xe4\xba\x8a\x1b\xd7\x2a\x63\x6f\x93\xc6\xfe\x66\x6f\x95\x6e\x7c\x4e\xea\x4a\x22\xff\x18\x8f\xbe\xd1\x27\x94\x3c\x96\x59\xce\x63\x6d\x19\xf0\x9b\xe0\xf8\xcf\xcc\x22\xf6\x19\xe3\xd1\xf7\x90\xbc\x7e\x7a\xe5\xf5\xf3\xa1\x81\x8a\x22\xdd\x44\xb9\x24\x5d\x32\x64\xfd\x2c\x52\xd6\xcf\xde\x71\xba\xa4\xcd\x9e\x4b\xea\x92\x26\xeb\xa7\xcc\xe7\xa6\xae\x42\x5d\xba\xbc\xa5\x13\x74\x21\x63\x41\xe6\x4a\x91\xb2\x7e\xf2\xe3\x75\xf9\x66\x20\x34\x69\x82\x2e\x84\x07\x99\x2b\x32\x8f\x35\x94\xc2\x83\x28\x83\xab\x9b\x27\xf2\x90\x7c\x94\xac\x9f\x45\xca\xfa\x19\x90\xe7\x8a\x8d\x78\x39\xf2\x9a\xc3\x44\x21\xe0\x2e\x96\x38\xe9\x8c\x8a\x73\x15\xae\x9f\xc4\x77\x73\xfd\xd0\xa5\xf5\x93\x07\x63\x14\x70\xb9\xe4\xc1\x42\x08\xdb\xc2\x95\x3a\x10\x44\xbc\x47\x71\xb8\xb1\x79\x42\x6a\x8b\x88\x3f\x17\x2b\xfe\xec\x2d\xf0\x67\xdf\x45\xfe\x2c\xf7\xd9\xde\x9e\xeb\xab\x7d\xac\x2b\x2a\xcf\x2b\x5e\x08\x41\x87\x57\xab\x2a\xec\xbb\x3c\x24\xee\x22\x75\x4b\x32\xed\xfc\x3e\x83\xcc\x41\x38\x61\x0e\xbe\x26\xee\x22\xfd\xbb\x43\x2f\x4d\x93\x9f\x35\x93\xbe\xee\x56\x5b\x98\xac\x4b\x26\x07\xcf\x8e\x93\xa3\x4b\xdc\x45\xf2\xcf\x72\x9e\x5b\xa6\x6d\x19\x40\x36\xb3\xfc\xbc\xd9\x89\xc6\xef\x35\xd6\x88\xbb\x48\x7e\x5a\xc9\x71\xe7\xf7\x3c\x36\x5b\x18\x41\xb3\x13\x17\xe6\x63\xe5\xdc\xf5\x50\x2e\x87\x7e\xac\x8b\xd4\x1f\x91\x15\x81\x0e\x21\x6b\x99\x79\x22\xed\xd1\x73\xd4\x02\x62\x13\x99\x76\x97\x57\x59\x3f\xa4\x79\x58\x66\xbe\x88\xf6\x66\x32\x47\x4a\x95\x79\xb8\x66\xdc\x3a\xdf\xe7\x8e\x5c\x32\x3f\xbf\x99\xcc\x91\xb4\x3c\x0f\xd7\x28\x7e\x65\x96\xfc\x6a\x8d\x3b\x82\xc7\xe7\x61\xdb\x89\xfc\x63\x3c\xfa\x46\x1f\x54\xd6\x79\xb7\xbc\xce\x3f\x30\x50\xe6\x42\xaa\x8b\x3e\xb3\xa0\x80\x47\xdf\x83\xf2\x3c\x74\xcb\xf3\x70\xfb\x40\x99\xeb\xd2\x35\x00\x64\x1e\x96\x2a\xf3\x70\xee\x38\x5d\xe6\xb8\x83\x97\xae\x35\x20\xf3\x50\xe6\x73\xd3\xdc\x42\x5d\x2e\x77\x07\x27\xe8\x22\xf3\xb8\x3a\xcf\x63\xcd\x58\x3d\x03\x51\x06\x54\x4d\xb9\x34\x0f\x32\x0f\x65\x1e\x6b\x72\xf1\x0b\x51\x06\x55\x4d\x99\xc8\x43\xf2\x25\x32\x0f\x4b\x2f\xda\xc7\x94\xa6\x34\x38\x6c\x0e\x13\x85\x0e\x8f\x8e\x3e\x5f\x52\x8e\xc8\x6b\x6b\x74\xc0\xa9\xb8\xc1\xd8\x5c\x22\x3e\x46\xe6\x62\x5a\x9e\x8b\x79\x4f\x93\xe6\x62\xd8\x16\x26\x4a\xc2\x92\x72\xac\x09\x22\xe8\x54\x1c\x63\xec\xf3\x92\xae\x5f\x93\x1c\x7d\xbd\x12\x5b\x74\x2b\x7e\xd7\x40\x87\x90\x2b\x59\xa7\x75\x5c\xe4\x77\x5f\x93\xbe\xe6\x72\xdd\xdd\x0d\x19\x00\xd8\x17\x10\x42\x15\x51\xe5\xc9\x64\x7e\x9c\x0a\xe9\xe6\x62\x22\x94\x24\xf5\x82\x7d\x03\x75\xc9\x31\xca\x97\xa0\x5b\xff\x1b\x00\x84\x9f\x20\x74\x78\xf4\xde\x81\x68\xc5\x18\xe9\x31\xda\x43\x39\xda\xca\x5c\xb1\x0c\xa0\x29\x84\xf6\x99\x81\xf6\x4b\xd1\xde\x9e\xa3\x4d\xe6\x8a\x65\x40\xda\x15\xa1\xc3\xa3\xef\x0e\x4c\xad\x98\xa0\xa3\x4c\x3f\x99\xa7\xdf\x41\xf6\xb1\x79\xd9\xdf\x18\xa8\x69\xbe\x98\xbe\xf4\x4e\x54\xe8\x77\x80\x9c\xec\x3f\x19\xa8\xac\x99\x20\xbb\xb8\x8b\xfa\x9a\x31\x2b\xb4\xf3\x6b\x48\x1d\x59\x43\x5e\x19\x48\x36\x4c\xb4\xb7\xf4\x3c\xf5\x65\x9e\xb6\xf2\x7c\x94\xac\x51\xcf\x0d\x54\xc4\x27\x3c\xbf\x41\xdc\x45\x65\xe8\xc3\xc6\xd0\x4b\x55\xe3\xd6\x3f\xa3\xb4\x07\xe1\x2c\x4c\xe1\xfa\xb7\x4f\xdc\x45\x55\x92\xdc\x71\xc7\xb8\x67\x2d\xb6\x30\x04\x46\x3b\xc3\x17\x3c\xbb\x61\xf4\x1c\x95\x21\xeb\x53\xd5\xf8\xf5\x09\x5a\xe8\x10\xb4\x95\x70\xcc\xf8\x35\x7b\xdf\xe8\x39\xaa\x92\xac\x4f\x32\xed\x2e\x8f\x4c\xdb\x2e\x84\xa0\x27\x6c\x9c\x48\x9b\xb6\x11\x5f\x69\x90\x7d\x50\xa9\x2d\x85\x95\x24\x7e\xde\x33\x10\x2e\xb7\xab\x0b\xe5\x96\x9e\x27\xbe\x32\x45\xf6\xc1\xd1\x1c\xf6\xdc\xbd\x03\xa5\x11\xbd\xbf\xd0\xde\x13\x69\xd7\x8f\xae\x92\x69\x87\x09\x6d\xdd\x40\x79\xf8\x9f\xd0\x96\x9e\xbf\x1e\x28\xd4\xc5\xaf\x07\x22\xa5\x79\xea\x79\xda\x43\x39\xda\xc7\xba\x46\xff\x4d\xa6\x5d\x45\x68\xaf\x1b\x98\x72\x29\xda\xdb\x73\x72\x1f\xeb\xfa\x0f\x12\xf7\x57\x91\xb8\x7f\xe5\x40\x63\x8e\x78\x64\x9c\xec\xc9\x3c\xfd\x8e\xd1\x93\x8a\xcd\x25\xe1\x4b\x4a\xab\xed\xec\x44\x9b\xd3\x36\xe2\x87\x32\xfd\x8e\xb7\x64\x5c\x0d\x7f\x59\x5c\x1f\x2e\x98\x9b\x1b\xc4\x5d\xb4\x8d\xf8\x60\x83\x3c\xee\x2f\x12\x39\xca\xcd\x61\x78\x78\x74\xde\x40\xb8\xd2\x3e\xa1\xde\x4c\x7a\x9e\xf8\xa0\x4c\x77\xde\xcf\xc9\xf3\x11\x9b\xf4\x7c\x7a\xa0\xb4\x6a\x82\xdc\x04\x1b\x82\xac\x6d\x71\xc5\x86\x0f\xca\x76\xd1\x10\xbb\x6c\x1f\xd0\x6b\x54\xa8\xc0\x2e\x13\x6a\x7e\x5e\xaa\x7f\x8c\xd0\xb7\x11\xbb\xec\x1a\x70\xda\xc6\x2a\x97\xf2\x67\x09\x87\xc8\x3b\x3e\x2e\xcb\x33\x2a\xfb\x96\x5e\xf2\x71\x0d\x77\x31\x6d\xe2\xe3\x73\x89\x0d\xe7\xc1\x68\x6e\x3c\x61\x6c\xc0\xe6\x51\x48\x27\xc7\xe4\x1e\xca\xc9\x7d\xac\x0b\x98\x15\x7b\x73\x74\x08\x5a\x8a\x0a\xa4\x2e\xa8\x55\xda\x9e\xaf\x55\xea\x32\xcb\x72\x78\x84\x10\xb4\x54\xd8\xc6\xd5\x5b\xc9\xb4\x93\x79\xda\x1d\x40\xaf\xd0\x96\x8c\xa2\xd7\x9a\x2e\x45\x9b\xec\xb3\x65\xda\x1d\x7a\x99\xb6\x64\x14\xbd\xdd\x5f\x48\x5b\xfc\xc5\xe8\x39\x5a\x4f\x9f\xe6\xc3\x2f\x95\x82\x1d\xe4\x8d\xb5\x7a\xe4\xfb\x00\x80\xca\x94\x05\xa3\x08\xc6\xa8\x37\x01\x33\x09\x98\x4a\x40\x5f\x02\x82\x04\x3c\x3c\x6a\x1f\x48\x24\x90\xc4\x90\x14\x96\x27\x93\xa0\x39\x57\xef\x79\x18\xbe\x4b\x99\xd1\x6d\x00\x03\x7b\x4a\x87\x10\x4d\x72\x2e\x2f\xc2\x9f\x03\x52\x74\x24\x24\xa2\xd5\x31\x53\xd2\x6f\x39\x8c\x17\xc1\x77\x9f\x7a\x8a\x7c\x66\xf4\x02\x7c\x97\x7a\x8f\x7c\xc6\xf4\x02\xf9\x48\xee\x79\xf2\x38\x4e\xfa\x2d\x0c\x75\x86\x3c\xfe\xbf\x79\x16\x8d\x9e\x13\xab\xa9\xa1\xd1\xf7\x00\x06\x2a\x30\x25\x15\xa4\x80\x86\x86\x7f\x23\x9d\xf8\x6c\x0c\x64\x8e\xf8\xe8\xf3\x34\xa2\xbf\x81\xb0\x0c\x42\x3b\x84\xf0\xc8\xe7\x08\x22\x40\x3a\xae\x65\xe5\xaf\x30\x9a\xe0\x4f\xc4\xab\x63\xb4\x3f\x49\x20\x59\xa8\xa1\x61\x1d\xf5\xdf\xd2\x9f\xc3\xf7\x89\x8b\xef\x03\x00\xc2\x97\xf0\xcb\x58\x4f\x0f\x02\x06\x94\xa7\x9c\x56\x26\xc4\xfc\x91\xf9\x9a\xa1\x98\x5d\xd4\xe3\xab\xe1\x31\x88\x20\x54\xa9\x99\x27\xf0\x8f\x40\xf3\x67\x82\x11\xd6\x47\xb3\x9f\x0d\x65\xab\x63\x30\x5c\x63\x4a\x30\x2a\x78\x9a\xab\x59\xff\x44\x53\x08\xbf\x6c\x7d\x0b\x0a\xa3\x5f\x8f\xa7\x57\x97\x2a\x75\x30\x65\xcc\x9f\x99\xbf\x4b\xf4\xe0\xe3\x80\xf2\x51\x31\xea\x46\xea\x4e\xea\x21\xea\x1d\xea\x13\xea\x3c\xa5\xa1\x28\x95\x1a\x3f\xc1\x8c\x51\x1f\x21\xd4\x6d\x0c\x0e\x18\x6b\x91\xc8\xd6\xde\xb6\x77\x6a\x09\x3d\x68\xfd\x40\xfc\x1a\x6a\x3f\x25\x75\x62\x6f\x88\xdf\x60\x04\xfe\x0a\x18\x30\x3d\x55\xfd\x3f\xa2\xbf\xf7\x5d\x06\x7a\x99\x28\xd3\xcc\x60\x06\x44\xb3\xd9\x42\x56\x41\x85\xd5\x57\x6c\xed\x6d\xdb\x5a\x3d\x7f\xb5\x49\x9c\x4a\x7e\x35\x4e\x8f\xd2\x94\xdd\x0a\x42\xe0\x8f\xe0\x6b\x40\x81\x5d\xe8\xf1\xd5\x34\xa4\x69\x49\x6e\x30\xd1\x2a\x46\x5b\x00\x85\x6b\xd1\x53\xa5\x53\x9e\xf8\x4e\x92\xa3\x07\xc5\x91\x2f\xa1\xf1\xb4\x95\xd4\x42\xfc\x19\xbf\x8c\x87\x08\x3d\x03\x68\x4f\xc5\xc7\x59\x3a\x0a\x37\x4a\x96\xb6\x1a\x42\x86\x3f\x1a\xbe\x36\x50\x86\x5d\xba\xc7\x81\xfa\x13\xf5\x79\x35\x56\xab\x39\xd6\xc0\x3c\xa1\x95\x46\x20\xf1\x59\x3c\xcf\x2d\x31\x7e\x24\xfc\xf2\x5f\x68\xbf\x3c\x20\x23\xeb\xc7\x0f\x4c\x6e\x78\x26\xc8\xb1\x28\x35\xd5\x61\x28\x33\xfc\xd9\xf0\x77\x89\xa7\xfa\xf1\xa8\x6e\xa3\x0e\xe9\x74\xd4\x38\xb3\x4a\x86\x44\xc7\xa8\xb7\x29\x04\xa8\x14\x95\x21\x06\xa6\x29\x8a\x63\xb5\xf8\x09\x03\x53\x28\x56\x56\xb2\xa9\x90\x18\x3f\x8a\x7e\xc5\xc2\x65\xf2\x60\xa2\x2d\x13\x06\x75\x6c\x6c\x11\xf8\x4a\xfc\x06\x7f\x48\xc6\xd6\x00\xb2\xa9\x94\x24\x1b\x92\xe4\x6a\xd6\x41\x45\x2a\xf4\xff\x90\x68\xaf\xe1\x9d\xf1\x83\xfd\x0f\x84\x0b\x8e\x17\xce\x2b\x0f\x3f\xea\x63\x13\x1b\x0a\xdc\xc0\xf6\x9a\xf8\x47\xc9\x1b\xa4\x35\xe0\x3c\x00\xf8\x2c\x63\x06\x3a\x10\x4d\x39\x34\x00\xbd\xa4\xa6\x9f\xc4\xcf\x62\x84\xb1\xde\x00\xe8\x63\x3a\x46\x54\x03\x82\x0e\xfd\x75\x7c\x48\x61\xa9\x80\xeb\xc2\xa0\x29\x60\xa2\x93\x34\x4e\xe0\x20\x3e\x2b\x0e\xd4\x9d\xa9\x15\xdf\x80\xb5\xb5\x67\xea\xe0\x2c\x7c\xd6\xfb\x2d\x85\xbf\xf5\x0e\x14\xc1\x1f\x88\x3d\x45\x00\x82\x3f\x00\x80\xff\xc4\x98\x81\x05\xd4\xa6\xdc\x26\x1e\x51\x2f\x71\x7a\x15\x4d\x5b\x6d\x26\xfd\x31\xa3\xe1\x15\x0e\xa8\xe1\x31\x15\x7a\x85\xb2\x00\xc2\x69\x8c\x9d\xdc\xe0\x8a\xf0\xb3\xe4\x38\xe6\xd8\x5a\x82\x26\xb4\x07\xce\x14\x9f\xaf\x3d\x53\x2b\x0e\xc0\x59\xd1\xa8\xf4\xb5\xf6\x4c\xad\xf4\xb3\x28\x3c\x5f\x34\xe0\x15\xb7\xc2\xdb\x24\x31\x8a\xa1\x49\xfa\xeb\x56\xf1\x1e\xe9\x87\x9f\x91\x39\xb7\x1e\xfe\x01\xcf\xc5\x5f\x02\x0d\x28\x4f\xb9\x79\x75\x46\xdd\x4b\x8a\x3e\x3f\x51\x33\xea\x1e\xb4\x1a\x3d\x8b\x70\x0a\x41\xa4\x03\x34\x88\x9e\x86\xfc\xc7\xd9\xec\x69\x69\xfc\xe3\x72\x41\x60\x92\x47\xd7\x9e\xdb\xb8\x72\xf5\x77\xf0\x97\xe2\x85\x3b\xb7\xde\xbd\x09\x32\x00\x60\xd0\x31\xfa\x3b\x6a\x23\xb8\x00\x54\x80\x03\x36\xd0\x93\x6a\x9c\x64\x84\x41\x23\x64\x8c\x56\x23\x32\xee\xb4\x5a\xd9\x49\x08\x06\x11\x64\x90\x15\x21\xb4\x93\x61\x26\x69\x61\x50\x0b\x19\xad\x55\x8b\xb4\x3b\x3f\x61\xcf\xb3\x88\x65\xed\x0e\x1e\xa8\xbf\x6f\xa6\xf4\x4f\xe5\x5a\x47\x11\xbb\x0f\x11\xe8\xdb\x21\x82\x5e\x49\xfe\xaa\x8e\xd5\xc6\x2d\xe6\x40\x71\x72\x92\x7f\xc2\xdf\xa7\x37\x6e\xdc\x88\xec\xd2\x17\xc7\xc6\x8d\x1b\x2f\xdc\x77\xff\xfd\xf7\xe5\xfe\x00\x15\xa0\x00\xa0\x0e\xd3\x6f\x00\x0d\xb0\x00\x07\x08\x80\x28\xa8\x07\x97\x81\x81\xd4\x2d\xd3\x07\x40\x82\x4f\xa0\x44\x5d\xe5\x00\xf0\xf0\x1e\xe4\x09\x0f\x38\xac\x0f\x15\xef\x2b\x46\xab\x8b\x37\x16\x6f\x2f\xc6\xdb\xad\x4f\x5a\x9f\xb5\xbe\x6d\xa5\x8a\xad\xc5\x56\xdc\x38\xc0\xd5\xc1\xba\x56\x9b\xdd\x8e\x0d\x03\x9c\xda\xab\x46\x6a\xd3\x00\x9e\x5c\x32\xe8\x4c\x95\x0f\x26\xbd\x4e\xab\xc3\x6e\xbb\xd1\x71\xa7\xe3\xb8\xe3\x13\xc7\x79\x07\xfd\xac\xed\x98\xed\x73\xdb\xa8\x8d\x72\xd8\x1c\x36\x3a\xe6\x74\x68\x07\x01\x3f\x48\xab\x40\xf3\xd0\xfb\xe4\x76\x22\x41\x78\x25\xcd\xb1\xde\x97\x51\xee\x60\x74\xe8\x7d\x19\xe0\x8e\xff\x38\x3b\xa4\x3c\x90\x15\x12\xd2\x4f\xf9\xf7\x09\x4c\xb9\x34\x10\x89\xb8\xd5\xc2\x87\x73\x05\x36\x16\xb3\x95\x86\x61\xcd\x3f\xf8\xcd\x25\x7f\x0a\xa9\x9b\xee\xf8\xaa\x6f\xe3\x97\xcd\xe5\xd1\xc9\x0d\xd1\x08\xf2\x8d\xb4\x94\xa1\x23\xe2\x57\x37\x6d\xf8\xaf\x82\x9f\x66\xd6\x6c\xf8\xea\xc6\x8d\x5f\x34\x97\x55\x4c\x99\x12\xad\xc0\x8b\xfe\xe5\x11\x58\xf3\x83\x47\xc5\x37\xae\x5f\xba\xfc\xe6\x2b\xae\xbc\x71\xf9\xd2\xf5\xe2\xd0\xd5\xd0\xff\x6d\x26\xf7\x8b\xeb\xae\x91\x7f\x71\xcd\x75\xd2\x4f\xf6\x3f\x42\x7e\x72\xd3\xfc\x05\x7d\xcb\xaf\x91\xf6\x02\xf0\x3c\x3e\x88\xce\x92\xbb\x4b\x64\x6f\x00\x3d\xf8\x20\xee\x97\xbe\xff\xf9\x30\xf1\xcf\x1d\x60\x0d\x6e\xc0\xaf\x03\x06\x34\xa7\x42\xf8\x53\x70\x8e\xfa\x1c\x8d\x22\x74\x1c\xc1\x27\xd1\xb3\x08\xdd\x88\x60\x27\xea\x41\x08\xa9\x53\x0c\xfd\x57\xf8\x57\x1f\xc0\x9f\x03\x47\x73\xc2\xf9\xd9\x67\x09\xe8\xb4\x4b\x0e\x9b\xcd\x66\xe3\x23\x43\xd5\x31\x0d\xb4\x61\x93\x0a\xc2\x1d\xb0\xe6\xe6\xcf\x3e\xbb\x59\xfc\x25\x2a\x83\x7b\x3b\xc4\x03\xe2\x81\x0e\xf8\xfd\x09\xbc\x82\x29\x01\x51\xe7\xf0\xa7\xe0\x1f\x91\x1d\xfa\x2c\x2e\x51\x0c\x9b\x70\x2d\xc4\x0d\xe2\xa9\xb5\x7f\xfd\xeb\x5a\x98\x44\xac\x78\x4d\x07\x5c\x04\x17\x75\x88\x57\x8f\x8e\x82\xd1\xd1\xdf\xe1\x37\xe9\x41\x63\xf8\xe7\x17\xc0\x9f\xa4\xbd\xcb\xcf\x2f\x8c\xda\x01\x00\x3e\x69\xef\xf2\x8e\x15\x1e\xb7\xc2\x7e\x2b\x4c\x59\x61\xcc\x0a\x7d\x56\x68\x15\xb2\xb9\x2d\x0b\x04\x87\x00\xa0\xfc\xf4\x20\xc0\xc0\x97\xe2\x30\x00\x34\x04\x08\x22\x44\x61\x06\xda\x41\x73\xb3\x00\xe5\x96\xfb\x51\x22\x46\x00\x52\xfe\x91\xf0\x5e\x74\x86\x1e\xbc\xd0\x4e\x0f\x4a\xba\x34\x62\x0f\xde\x4e\xbf\x0e\x8c\x60\x4a\xaa\x14\x7c\x12\x35\x36\x1b\x91\xd1\xa8\x53\x7d\xc2\x93\xc2\xee\x3b\x95\x59\x7e\x5e\xad\x56\xeb\xf0\x1f\xd9\x8f\x35\xff\xae\x02\xa3\xa0\x39\xde\xdc\xac\xe0\xae\x24\xa2\xc4\xb7\x84\x49\x92\x7b\xc8\x9d\x03\x48\xdf\x1f\x01\x7d\xbb\x71\x69\xfa\x91\x0d\x82\x7a\xc6\x7d\xab\x36\x62\x0f\x7c\x62\xe7\x75\xeb\xc4\x67\xd0\xe3\xcb\x6f\xfb\xee\xad\x62\x86\xf4\xd4\x52\x64\x17\x40\x6f\x6a\x32\xa2\x78\x9e\x7e\x52\xf7\xac\x0e\xe9\x4c\x2c\xa0\x56\x69\x54\x77\x92\xbd\x8d\x06\xac\xc5\x0c\x16\x6e\x66\xa3\x6c\x0f\xfb\x39\x3b\xca\x52\x6c\x8a\xb7\xa4\x31\x8b\x59\xca\x70\xb3\x16\x53\x0a\xd8\x7c\x7d\x34\x1a\xc9\xf2\x43\x04\xdf\x01\x2a\x18\xc1\xfc\x5b\x59\xa1\x3e\x6a\xac\xaf\x8e\xc1\x31\x1c\x7d\xa5\x58\x19\xfe\x0e\x06\xc5\x8f\x9e\xeb\xef\x47\xe7\x47\x5e\x41\xb6\x91\x3f\xc3\xed\xdb\xc4\x0b\x90\xd9\x46\x85\x0f\x8c\x7c\x4b\xf0\x47\xd7\x01\x40\xcd\xa3\xdf\x00\x01\xb0\x25\x35\x47\xc3\xb0\xab\x8b\x5c\x36\xbd\xca\xa6\xb2\xa9\x4c\xc0\x18\xf4\xd8\x79\x60\x82\x26\x8d\x7b\xad\x87\xf1\x68\x1d\x6b\xed\xac\x9d\xf3\x78\x3d\xcd\x9e\x4e\xcf\x46\xcf\x76\xcf\xb3\x9e\x63\x9e\xb7\x3d\x9a\xbb\xed\x3b\xed\x68\x9d\x1d\xae\xb6\x43\x8f\xdd\x63\xe7\xf1\x1a\x58\xac\x32\xf3\x37\x9b\xec\x4a\x13\xae\xdc\x4c\x95\xdb\x6a\xe4\xc4\x4f\x24\x12\xfc\x5b\x71\x41\xae\x06\x16\x72\x6f\x11\x55\x28\x50\xec\x91\x54\x21\xff\x9b\x55\x7e\x8b\x3f\x59\xd3\x08\x03\xc9\x44\x52\xfa\x33\xa9\x26\x11\xa7\xc2\xd3\x1e\xd8\xfc\x5b\x78\x9b\xb4\x96\x8b\x5b\xef\x47\xe7\xbe\xf5\xff\xe2\xe4\xc9\x93\x27\xcf\x3c\x7f\x9c\xbe\xed\xa1\xf4\xd7\xc7\xb7\xed\xdd\x66\x3a\xd1\x71\x70\x77\xf5\xa7\x96\x6d\x7b\xb7\x9d\x7d\xea\x8d\xb1\x1e\x9b\x07\x49\x7d\x3f\x0f\x4a\xc0\xed\xa9\x99\x4c\xb7\xc1\x69\xb7\xde\xe8\xf7\xf8\xfd\x29\xde\x94\xf6\x19\x62\x06\x64\xf0\x1b\xfc\xc8\xeb\x15\x52\x1a\x36\x2d\x84\xb4\xb0\xdb\x8b\xa2\xa8\x19\x61\x14\x58\x2b\x98\x1d\x36\xdf\x5a\x87\xd3\x8d\x3d\x1e\xb0\x96\xd3\x7a\xb5\x48\xab\x45\x7c\x2f\x66\x90\x5d\xe9\x06\x90\x1d\x4a\x44\x6d\x72\x26\x5f\x2e\x86\x79\x2b\x12\x8f\xca\x35\x48\x11\xb9\xc9\x1f\x3f\x54\x1d\x33\x49\x3e\xe4\x93\xde\x1b\xe1\x84\x4f\xe0\xfd\x01\x68\x61\x02\xc5\x0e\x18\x48\x36\x43\x19\xdf\xd9\x9c\x88\x9f\xdf\x7b\x1a\xbe\xf2\xc7\xff\x28\x2b\x83\x25\xe2\x57\x53\xf1\x60\xea\xda\xb3\x6b\xd6\x4c\x9d\xf7\xee\xbb\x7d\x4d\xa8\x7e\xe4\x75\x7a\x50\xec\x3a\xfb\xd5\xf7\x60\x12\x06\x86\xaf\xdd\xe0\x83\x4e\xb8\xb4\x25\xf1\xe1\x7b\x1b\xc4\x03\x8f\x4b\xba\x6e\x13\x7f\x46\x9d\x62\xcc\x00\x83\x08\x98\x02\x6e\x49\xb5\xfa\xfd\x5c\x3c\x12\x70\x52\xbe\xd6\x70\x59\x10\xe3\x87\xca\xf6\x95\xa1\xb2\xa6\xc9\x69\x0e\x21\xc0\x7d\xc2\x9d\xe7\x30\x17\xb1\x94\xf9\x3a\x43\x81\x80\xb9\x04\x38\x6a\x33\xc0\xcc\x9b\x7d\xe6\x7e\xf3\x71\x33\x6d\xe6\xa8\x8a\x8c\x16\x76\x20\xad\x15\x34\x7f\x3c\xc4\x0f\xc5\x9b\xb3\x43\x71\x05\x80\xaf\x59\x81\x8a\x20\x28\x98\x71\xfe\xb4\xdc\x7c\x43\x29\xac\x49\xfa\x71\x60\xac\x30\x81\x14\x30\x90\x32\xd6\x46\xe9\x57\x0a\x96\x75\x20\x38\xbe\x98\x95\x8a\x7e\xbb\x0b\x2f\x7f\x46\x6d\x6b\xec\xb8\xba\xe9\xaa\xbd\x7d\x4d\x4d\x7d\x7b\xaf\x1a\x6b\xc2\x21\x6e\x81\xeb\x07\xf7\xec\x79\x58\xfc\x59\xbe\xf3\xc6\xfd\x77\xdd\x25\xfe\xec\x7e\x38\xb3\xb8\xb1\xca\xd9\x72\xef\x9b\x77\x6f\x7d\xeb\xbe\x56\x47\xc5\x64\x9f\xdf\xeb\xac\xe5\xf7\x6e\x1b\x1c\xdc\x36\x1c\xd9\x5c\x71\xe5\x96\xee\xf0\x55\x8f\x5e\x3b\xe9\xad\x13\x27\x5f\x25\x7b\x9d\xde\xd1\x73\xd4\x75\xf4\x29\x10\x06\xd7\xa5\xcc\x3a\x84\x54\xc5\x42\x99\xcb\x6a\xd5\x03\x55\xb7\xc7\x61\xb1\x6b\x6c\x87\xa1\x6a\xc0\xaa\xb7\x62\xd7\x61\xa8\x4a\x79\xdc\xc0\xcd\xb9\xbd\xee\xa8\xbb\xc7\xfd\xa4\xfb\xb7\x6e\xc6\xea\xb6\xba\xd9\x60\x8f\x8f\x62\x7b\x4c\xb9\xa6\xeb\xf9\xde\x31\x8a\x93\xcb\xbb\x15\xe9\x85\xf5\x16\xb9\xf6\x2b\xcf\x52\x33\x07\x2d\x66\x9b\xdf\xe2\x37\xfa\xe3\xb5\x16\x26\xe0\xc3\x81\x64\x22\x5c\x1b\x48\x26\x8c\x20\x11\x97\x5b\x6f\xc2\x23\xb0\x5f\x9c\x06\x21\x82\x9b\xc4\x1d\x6d\xb0\xf4\x9e\xbb\x6e\xdf\x27\x4e\x5d\x7c\xe0\x11\x84\x1e\xd9\x17\x86\x8e\x8f\x8e\x3d\xd4\x79\xfb\xad\xf7\xbc\x82\x0f\x6e\xe3\x58\x47\x93\xd9\xba\x4d\x7c\x7c\xf2\xfe\x06\xa4\xdd\x16\xba\x75\x1b\x64\xa0\x77\xd1\xf7\xda\x5f\x27\x57\x0e\x81\x7a\xf4\x1b\xea\x75\xfa\x65\x60\x02\x36\x10\x00\x11\x70\xe0\x45\x50\x3c\xfa\xc9\x4f\x35\x86\xb4\xef\xf0\xe8\x27\xa9\x22\x8d\x21\xed\xf6\x69\x0c\x69\xa7\xf4\xe5\xda\xf2\x9d\xe5\x07\xcb\x71\xf9\x80\xeb\x79\xbf\xc5\x6a\x33\x5b\x0f\x8f\x1e\x4f\x5d\x66\xb1\xa7\xcd\x29\x8b\x3d\x6d\x35\x5b\xcd\xdc\x8a\xd0\xe3\xa1\x1f\x85\x70\x68\xc0\x5f\x09\x78\x8d\x4f\x93\xd1\x3c\xa4\xd9\xa7\xa1\x35\xd7\xd2\x3b\xe9\x83\x34\xa6\x07\xb8\xd2\xc1\xa2\x17\x4a\x06\xed\x0e\x1b\x63\xb1\x6b\x54\x83\xfa\x17\xf0\x20\x34\xaa\x40\x73\x62\xe8\xab\xa1\x44\x73\x73\xf3\xd0\x57\x43\x30\x3a\x94\x3d\x91\x8d\xf3\xbf\x26\x5d\x9c\xa3\xd1\x48\x84\xbc\xe9\xbf\x92\xb6\xad\x91\x48\x24\x42\x16\x02\x8b\x39\x41\x0c\x54\x1c\x22\x13\x9f\x86\x01\x68\x52\xfe\x6d\xb5\x98\x99\x70\x3c\x39\x49\x7a\x08\x99\x7d\x73\x67\x9c\x7c\x65\x59\x5b\xfb\x0d\x7b\xfa\x07\xf6\x2f\x41\x73\x46\xc2\x4f\xa0\x33\xfe\xbb\x0e\x1d\xbc\x7f\xf3\xa1\x03\xf7\x7d\xff\xfb\x7b\xe9\x3d\xd7\xfb\xff\xf2\x07\xff\xf5\xc1\x67\xff\xe5\xc7\xfd\x3a\xe9\xcd\x70\x61\xda\x8b\x4f\xfc\xe0\xf9\xa3\xdf\xdf\x7b\xf8\x86\xbf\xfc\xe9\x4f\x7f\x01\x08\xfc\x6e\xf4\x1c\xfe\x13\x7d\x0a\x38\x80\x1f\x5c\x97\x6a\x72\x5a\x57\xfd\xff\xec\xbd\x09\x7c\x94\xd5\xd5\x3f\x7e\xce\xbd\x93\x49\x26\xfb\x24\x13\xb2\x13\x92\x90\x65\x08\x90\x90\x85\x10\x21\x10\x79\x11\xa3\x52\xc5\x88\xa8\x08\x82\x88\x88\x2c\x22\x88\xb8\x55\x41\xe0\x61\x71\x43\x05\x11\x1f\xb5\xa2\x55\x5f\xaa\x38\xf5\x6f\x15\x10\x2d\x4a\xaf\x75\xab\x54\x6d\x5f\x7b\x6b\x91\xcd\xb5\xb6\xb7\xd6\x5a\x3a\xb5\x0a\x73\xfe\x9f\xe7\x3e\x77\x26\x93\x04\x50\x5b\x6d\x7d\x7f\xaf\xe6\x13\x0c\x21\x79\x9e\xbb\x9c\xed\xfb\x3d\xe7\x9e\xeb\x4d\xf5\xfa\x7c\xde\xa2\x8b\xb3\xe1\x62\x1c\xe1\x45\xf0\xe2\x88\xec\x7b\xb2\x7f\x9c\xfd\x4c\xb6\xa7\x0f\xa2\x37\x1b\x31\xdb\xcb\xcb\xca\x7d\x89\x39\x0b\x53\x93\x0b\x0a\xf2\x7a\x2f\xcc\xf4\xe6\x5d\xca\x11\x79\xbe\x29\x8c\xdd\x1f\xad\xfa\xf7\x67\xa1\xbe\x37\xd7\x31\x83\x99\xfb\x1d\x23\xee\xf6\xe9\x19\x54\x87\x0d\xac\xb4\xac\xb2\x15\xbd\x89\x4d\x83\x9b\xfd\xee\xdc\x32\x13\x1c\x13\x80\x83\x5d\x97\xc3\x2f\x9d\x9f\x15\x39\x70\xbd\x3d\x7e\x56\xfb\x15\xab\xac\x8b\xae\x89\x6c\xba\xe5\xe6\xc8\xde\x57\x2f\x68\x6a\xc0\x31\x91\x0d\x5b\x1e\xf9\xa0\xa4\xe0\x8a\xec\x6a\xfc\xe8\x86\x7b\x1e\x58\x19\xb9\x7b\x5b\xe4\xd7\xbb\xd9\xf5\x57\x60\xf1\xd3\xa7\xce\xd2\xfb\x9f\xaf\xe3\xbb\xcd\x90\x01\x05\x50\x09\xfd\xe0\xe3\xb6\x9c\x40\x7e\xdf\x7c\x16\xc8\xed\x9b\xcb\x0a\x03\x35\x01\x56\x98\x55\x93\xc5\x7c\x5b\xe9\xb5\xb6\xea\xac\x9c\xf6\x05\xbe\x65\x3e\x36\xde\x37\xdd\xc7\x9a\x7d\xc7\xfb\x18\xd6\x65\xe5\xb4\x5f\x85\xd7\x23\x3b\x0b\x2f\x44\x36\x04\xdb\x91\x55\xf5\xdd\x8a\xfc\x27\xd9\x29\x98\xbe\x15\x79\x5b\x5e\xc6\x5c\xbd\x2c\xaf\x66\xef\xcd\x4e\xc8\xce\xc8\xce\x48\xec\xe7\x08\x4b\xbf\xde\x5b\x91\x3f\x9e\xd7\xdf\xc7\x75\x23\xb9\x41\x89\x85\x9b\x33\x4b\x37\xe7\xb8\x2d\x17\x72\x32\x73\xd2\x4f\x62\x67\x33\xc6\xda\x7c\xa9\xed\x2c\x89\x5b\xd5\x38\xbe\x7a\x7a\xf5\xc2\x6a\x5e\x7d\x6e\xd5\xa8\xe4\x71\xc9\x2c\x79\x2b\x3d\xbb\xd9\x97\xda\x9e\x8c\xba\x43\x64\x43\xcd\xa4\x86\x7d\x93\x26\x8d\x70\xfe\x1f\xab\xea\xc4\x5a\xc7\xa6\xfe\x66\xff\x73\x35\x59\xe6\x7b\x8e\x89\x7d\x6e\x50\x9d\xe9\x44\xa0\x99\x8f\xd2\x72\x2c\xd7\xfd\xd2\x1a\xb0\x81\x35\xf9\x1b\x62\xb1\xa0\x23\x42\x9d\x61\x1f\x6f\x2a\xcd\x61\xab\x42\x91\xa7\x7c\xd9\x2b\x1e\xc5\xff\xf2\xa6\x5b\x38\x68\xfe\x8a\x43\xf3\x57\x2e\xbb\x7c\x44\x5d\xdd\x88\xb6\xba\xba\x35\xf8\x03\xcf\x2d\x87\xee\x3f\x94\x99\xb0\xf9\xf3\x4b\xb1\x76\x1a\xfb\xf4\xf3\x89\x4f\xdd\x87\x13\xb6\xfc\x70\xe3\x13\x57\x5c\x32\x6f\xfe\x9c\x8b\xe6\x5d\xbc\x20\x72\xe9\x9a\x35\x1a\xe7\x01\x7b\x4f\xf7\xda\x4e\x84\x7c\x98\xd5\x36\x22\xcf\x1f\x78\x2e\x3b\xc3\x97\xfa\x5c\xda\x33\x69\xe8\x4d\xf3\xa6\x61\x49\x36\x66\x17\x6e\xe6\xcf\x73\x76\x27\x7f\x98\xb3\x2b\xf9\x75\x9c\x71\x78\x0e\x10\x31\x91\xbf\xe8\xc9\xf4\xe5\x71\x4f\x20\x2d\x09\xd1\x9f\xee\xe1\xce\x0a\x34\x38\x06\x25\x2b\xb7\xc5\x54\x02\x36\x4c\xd2\xad\x5e\xfd\x71\x33\xd7\x3e\xb4\xdc\xf4\x62\xe4\xe5\xb9\xce\xa4\x0b\x75\x1d\x72\x63\x73\x39\xc7\xda\x45\x8f\xe2\xfe\xc7\xf0\xa3\x5b\x53\x93\xaf\x7a\xea\xfa\xdb\x7e\xb2\x28\x39\xd5\x66\xef\xb1\xf3\x67\xcf\x3e\x74\x27\xab\x78\x3c\xb2\x9a\xbd\x7e\xe8\x0f\xac\xd7\xa1\x5a\x1c\x7f\xc6\xe5\x87\x76\xb9\x1c\xd5\x89\x00\x9e\x15\x09\x3b\xb3\xbc\xcf\x5c\x01\xee\x9d\xb9\xbb\x3d\x97\x79\xda\x21\x1b\x0a\x60\x58\x5b\x41\x20\x11\x8a\x0a\xb0\x24\xad\x36\x6d\x44\x1a\x4f\xc3\xcb\x0a\x0a\x3c\xb9\x97\x65\x66\x78\x2e\xf3\x6e\xa5\x7d\x4f\xf8\x52\xdb\xbd\xc9\x8e\x36\xd4\xec\x8f\xf5\xe1\x6e\xa8\xcf\xfc\xa5\x1e\x68\xa9\xbf\x57\x43\x7d\x73\x6e\x3a\x96\x97\x41\x53\x26\x34\xd4\x43\x4e\x95\x5f\x37\x0f\xf7\x5c\x76\xf0\xb9\xab\x42\x91\x9b\x8e\x3f\x77\xd7\xed\x1f\x47\xf6\x60\xc3\xde\x0f\xb0\xff\xef\xaf\x78\xfc\xe1\xef\xb3\xac\xc8\x5d\x57\xfd\x21\x78\xd7\x55\x38\xea\x2f\x98\x80\x83\x22\x2f\x7f\x7e\x2a\xe6\x5c\x76\x69\xe4\x43\x67\xac\x59\x14\xf6\x6c\x76\xe2\xcc\xed\xf3\x22\x3f\x04\xc8\xac\xdc\x31\xf4\x45\xf0\x27\xee\x98\x83\xe3\x0f\x5d\x00\xe3\xda\x9a\x3d\x9c\x05\xf2\x3c\x9c\x7d\x1c\xc0\xc5\x01\xcc\x0c\xe8\x7b\x0f\xf0\xe1\x34\x5c\x9b\x86\xd3\xd2\x70\x5c\x1a\x8e\x4a\xc3\x34\xf8\x18\x70\x1f\xe0\xa3\x80\x63\x01\xdb\x00\xc1\x8d\x47\x9b\xe2\xff\xd7\xe4\xf2\x69\x2e\xd7\x9a\x42\x61\xcf\xcb\x09\x3f\xcf\xaa\xda\x3e\x2b\xf2\x84\xfb\xde\x3f\xbb\xef\x9d\x79\xe8\x02\x18\xd3\x36\xc8\xc3\x59\xb5\x7e\x6f\x35\x3e\x5a\x8d\x8b\xab\x31\xb3\x1a\xa1\x1a\xab\xf1\x40\x29\xfe\x4f\x29\x3e\x57\x8a\x8f\x97\xe2\xda\x52\x2c\x85\x67\x01\x17\xb9\x6f\x6c\xea\xfa\xd6\xf8\xf7\xe5\xe9\xf7\x6d\xce\xaa\xda\x31\x33\xf2\x62\x8f\xf7\x8d\x6d\x6b\xf4\x70\x56\xa6\xdf\x57\x86\x8f\x96\xe1\xe2\x32\xcc\x2c\x43\x28\xc3\x32\x3c\x50\x88\xff\x53\x88\xcf\x15\xe2\xe3\x85\xb8\xb6\x10\x0b\x61\x1f\xe0\x6b\x80\xcf\x9a\x49\x1e\xe5\x9d\x45\xb1\x77\xce\x8e\x3c\xe2\xbe\xf3\xc7\xdd\xdf\x99\xa9\xdf\x99\x89\x8f\x66\xe2\xe2\x4c\xcc\xcc\x44\xc8\xc4\x4c\x7c\xd8\x87\xb3\x7c\x78\xb6\x0f\x4f\xf2\x61\xa3\x0f\xfb\xfa\xd0\xd7\x73\x9a\x3d\xdf\x09\x4c\xd7\x4f\x77\x24\xfc\x1c\x02\x50\x02\x2d\x6d\xbd\xbd\xde\xcc\x1c\x1c\x9d\x52\x5a\xa8\xaf\x83\xcf\x81\xbc\x93\xb3\xb3\x7d\xc5\x63\xd3\x7b\x79\x3d\x63\x7d\x1e\x18\xb1\xdf\x3d\x63\xb2\xbf\x4b\xf3\xc9\x41\x75\xd8\x3c\xd8\x91\xaa\xa6\xc1\x4e\xb8\x05\xa5\x7d\xfc\x8d\xd0\x50\x9f\x3d\x10\xcb\xcb\x98\xe3\x62\xb2\xf8\x5d\xcc\x67\xdd\xb1\x74\xd1\xf2\xdb\xf0\xd1\xc8\x8f\x23\x6f\x47\xd6\x61\xe0\xc0\xd6\x91\xbd\x16\x8d\xd9\xf0\xf3\xa7\xae\xdb\xc5\xcf\xa9\x7e\xe2\x93\x71\xa1\xe1\x87\xf6\x47\xae\x3a\xf4\x0b\xbc\xfe\x1f\xb8\x24\xb2\xf9\xf4\x0b\x23\xcf\x3e\xa1\xb0\xde\x3d\x03\xe4\xe8\xc8\xd2\x84\xcd\x90\x00\xa9\xf0\xe2\x13\xa9\x99\x19\xd9\xed\x29\x5b\xe9\xe3\xcd\x19\xd9\xed\x5b\x18\xb2\xad\xf4\x69\xdb\xa8\x34\x7f\x7b\x25\xc3\x5c\x07\xed\xe3\x56\x44\x4c\x4a\xf3\xb7\xbb\x9c\xa6\x0f\xf1\x03\x86\xec\xf7\xce\x37\x93\x20\x35\x33\x90\xd7\xde\x9e\x7a\x66\x2a\xeb\x97\x8a\xbe\xd4\xfc\x54\x96\x3a\x99\xcf\xe5\x8c\xf3\x74\xe7\x99\x6d\x83\x03\x79\xed\xc7\xa7\x9c\x91\xc2\x2a\x52\xd0\x9b\xd2\x2b\x85\xa5\x8c\x85\x29\xb0\x0f\x3e\x76\x90\x3c\x4f\x99\x9c\x90\x95\x94\xe9\xcf\x6b\x3f\x3b\x09\x83\x49\x2d\x49\x27\x24\xf1\xe2\x24\x4c\xd2\x3d\x93\x1d\x83\x38\x62\xbf\xbe\x29\x45\x7f\xad\x5b\xcc\x3a\x5f\x64\xb5\xb4\xd6\x36\x4c\x6a\x98\x14\xb3\x9b\x93\x6a\x26\xd5\xd4\x34\xeb\x3e\xc9\x58\x59\xe5\x4d\xe4\xa5\x27\xe2\xf6\xa7\xf0\xd9\xcf\x5f\x60\x97\x0d\x2d\x1b\x50\xf3\x19\x7b\x70\x5e\xc2\x71\x9f\x3d\x39\x97\xdb\x9b\x7f\xf0\xe2\xf2\x43\x1e\x40\xb8\x2b\x12\xd0\xfd\xd4\x12\x61\x50\x5b\x06\x4c\xd8\x97\xf8\x71\x22\x4b\xf4\xf1\x09\xa0\x4f\xcf\x3d\xdb\x96\x12\xc8\x6b\xf7\xb0\xc9\x09\xdc\x03\x85\xba\x6a\x1c\x75\x41\xb6\x7b\xbf\x98\x69\xbb\xcf\x7f\x70\x68\xeb\x36\xfe\x74\x24\xe0\x3d\xf8\x0f\x4f\xe2\x7d\x9f\x9e\x03\x08\x27\x46\x02\x9e\x5b\x74\x7f\xf0\x2b\xdb\x3a\x9a\x7d\xd2\xf7\x81\xef\xef\x3e\x4f\xa5\x0f\x13\x7d\xb9\x3e\xd6\x9c\x28\x13\x3f\x48\xfc\x7b\xa2\xa7\x32\x11\x13\x13\x73\x13\xd9\x10\xf6\x5b\xf6\x7b\xf6\x29\xf3\xe4\xb3\x20\x63\x49\x0c\x93\x18\x03\x6f\x72\x5a\x22\xe7\x3e\x68\x4b\x4e\x6b\x07\x9e\x38\xd9\x93\xe4\x00\x48\xf4\x4d\x76\x86\xb2\xbf\x65\x84\x33\xff\xcc\xfd\x2d\x98\x57\x5b\xa3\xbb\xf0\xfe\x52\x77\x2d\xd5\xcb\xe1\xfe\x97\xdd\xe4\xc3\xa6\xd2\x9c\x52\x1f\x96\xe6\x9c\xc8\x8e\x3f\xf4\x12\x0f\x1f\x4a\x67\xfe\x43\x6f\xf0\xef\x45\x02\x97\xf0\x5b\x79\xcd\xfc\xfb\x0f\xf9\x0e\xde\x6d\xea\x92\xd7\xb3\x15\x9e\x06\x5e\x0c\x1c\x0a\xda\x52\x59\x82\x63\xd2\xd1\x03\x8f\xe0\x4f\x60\xc4\x7e\x0d\x58\x33\x7f\xe9\x32\xec\xeb\xf9\x9d\x6c\xc5\xba\x75\xba\x1f\x2f\x7d\xe2\xd9\xec\xdd\x00\x49\x30\xb0\x2d\x07\xc1\xeb\x4d\x4c\x4a\x4a\x4e\x60\x8c\xf3\x90\xc7\x93\x91\x88\x89\x00\xb5\xb5\x93\xb4\x09\x75\xef\xf6\x6b\x68\xc9\xaf\x6d\x68\x18\x54\x97\x50\x8e\xe5\x4d\xa5\xd9\xd8\xc0\xa6\x59\x11\xf5\x38\x56\xbf\xcf\xe0\x96\x74\x9e\xbc\xfa\xd0\x85\x09\x9b\x5c\xec\x33\x1a\x6f\xf1\x58\x9e\x74\xc8\x86\x62\xa8\x82\xc9\x4f\x42\xa6\x13\x01\xa6\xb6\xa7\x3b\x11\x60\xbd\x63\xa4\xfb\xf8\x52\xdb\x3d\xce\x1f\xbd\x93\x21\xe0\x49\x28\x7f\x38\x23\x03\x33\x82\xf9\x0f\x27\x54\xf6\x0a\x25\x03\x4b\x4d\x4a\xea\x53\x14\xca\x1a\xc1\x56\xb3\xbd\x8c\x33\xd0\x5d\x51\xf5\x01\xc6\x96\xce\x53\x6c\xb9\x2d\x26\x78\x8b\x85\x6c\xb9\x26\x54\x2b\x2f\xe3\xb1\x0b\xe5\x9b\x7b\x45\x4f\x3f\xb1\xa9\x0b\xed\xcb\x6e\xbb\xed\xb2\x07\x67\x2f\x78\x60\xe1\xad\xb7\xcf\x7b\xf8\x89\x8e\x39\xc7\x8e\x1d\xfb\x5f\x33\xde\x1d\x3f\xeb\xd8\xb1\xe3\xda\x2e\x60\x73\xde\x08\xdd\xb8\xfc\x89\x5d\x6f\x6c\x5a\xbd\xf4\x49\x1c\xb9\x75\xd6\x29\xa7\x9e\xff\xd8\x93\x73\x4e\x3e\xe5\x02\x40\x50\x91\x00\xdf\xaf\xef\x78\x0c\xb6\xe5\xa0\xf7\xa1\xd4\x4c\xc7\xe2\xe4\xf4\xe2\x21\xcc\x86\xf4\x50\xaa\x4f\xb7\x7c\x18\xd1\xb0\xdf\xf0\x94\x3a\xd8\xca\x71\xc2\x4a\x4d\xd9\xe9\xce\x6a\x4d\xfe\xcc\xd2\x7a\xbe\x7f\xc8\x31\x9b\x1e\xdb\x70\x72\xf3\xb0\x21\x8f\xe3\x89\x67\x7a\xd9\x9a\x82\x0f\x3f\x93\xa1\x27\xb2\xd7\xe4\x7d\x98\x50\x85\x53\x81\xc1\x7a\xbc\xca\xd3\xe0\xa9\x00\x3f\x94\x43\x7b\x5b\xb0\xc8\x57\x91\xa5\x53\x26\x7d\xcb\x1e\x29\xcc\x79\xac\x77\xe6\x23\x3e\xfe\x58\xe2\x23\x30\x22\x15\x53\x53\xf3\x1f\xc9\xda\xdb\x1b\xc7\xf6\xde\xd0\x9b\xf5\xd6\xe4\xac\xae\xd7\xdf\x7f\xa8\x7e\x7f\xe6\xa1\x7a\x77\xf7\x1d\x01\x73\xf6\xdf\x59\xa1\x5e\x26\xc6\xad\xaa\x2c\x2f\xe3\x3d\xbe\xb3\x7e\xea\x6d\x53\xd7\x2d\x3a\x71\xce\xc2\x73\x6f\x9f\xb6\x66\xf1\x09\x17\x5f\x72\xde\xda\x69\x6b\x97\x1c\x3f\xfb\xb2\xf3\x6e\x9b\xb6\x66\xe9\xe8\xd9\x3c\x70\xdf\x9c\xb6\xe6\x2b\xee\x9b\x3d\xa2\xf9\xd0\x47\xf7\xcd\x1e\x31\xc4\xf9\x72\x88\xe9\x8d\x7b\xbf\xa7\x21\xc1\x03\xd9\x70\x51\xdb\xb1\x89\x1e\x0e\x9e\xec\xa4\xa4\xe4\xb4\x74\xbf\x27\xcb\x97\x95\xed\xcb\xf6\x65\x7b\x33\x52\x72\x18\x78\xd1\xeb\x0d\x64\xb0\x47\x32\x2f\x46\x7d\x4f\xf5\x5c\xe4\x5a\x5e\x53\x13\x1e\x49\x59\xed\xc5\xb1\x5e\xcc\xf0\xa2\xa6\x99\xdd\x3d\x77\xff\x1f\x9b\x47\x14\xc1\x47\x6f\x96\x76\x02\x90\xa6\xd2\xec\xd2\xa6\xd2\xec\xdc\xc4\x86\x9c\x52\x5e\x9a\x53\xca\xab\x70\xf5\xdf\xb1\xf5\x8a\xc8\x89\xf8\xf9\xf2\x55\x17\x7e\x16\xd9\x71\x15\x6e\x8b\xc0\xb5\xab\x70\xdb\x3a\xf4\xdc\x86\x85\x43\xf7\xdd\x16\x39\xb8\x2e\xf2\x87\x16\x67\xad\x01\x3c\x0d\x9e\x97\xc0\x0b\xc9\x70\x7e\xdb\x88\x0b\xbc\x97\x79\x57\x78\xf9\x0c\xcf\xe5\x9e\x95\x1e\xbe\x30\x61\x79\x02\x4b\xf0\xa0\xc7\x07\xa9\x49\x88\x29\x0c\x13\x12\xb8\x77\x1f\xe0\x5e\xed\xa8\x47\x38\x9b\x82\x00\x9e\x3e\xfc\x59\xce\x32\xdc\x2b\x9b\x27\x35\xb8\x17\x85\x4d\xaa\xd7\xc7\x6d\xf5\x71\x2e\x27\x02\xf1\x67\xb5\x4c\xd2\x37\xa9\x56\x60\x13\xe6\xf8\x58\x53\x69\x8e\xa7\xe1\xe0\xf9\xfc\xce\x43\x4d\xec\x17\xce\xff\x77\xa3\x98\x8e\x62\x43\xe4\xa1\xc8\x43\x91\xa5\xeb\xd6\x75\x1b\xdb\x79\x6d\xc3\x67\xb0\xcb\xd9\x4a\xc6\x2f\x80\xcb\x60\x05\xf0\x2b\x70\x15\x32\xf4\xfa\x3c\xa9\x49\xcc\xeb\x4d\x49\xf0\x20\x72\xd8\xe7\xc5\xbd\x5e\x6c\xf3\x1a\x00\xe1\xf5\xb2\xc3\x0e\xad\xa1\x73\x68\xee\xa2\xba\x23\xcb\xf6\x39\x43\xc3\x1c\xc7\x52\xb0\x97\x0f\x0d\xe6\x77\x3a\xe3\xc2\xab\x71\x3c\x8e\xdf\x10\x69\x9d\x1e\x69\xdd\xad\xc7\x75\x35\x80\x67\x6c\x82\x80\x04\xf0\xc1\xa8\xb6\x12\x86\x3e\x5f\x82\x27\x31\x91\x7b\x21\x25\x09\x38\x72\x9e\x0c\x5e\x2f\x4f\x4a\xc2\x44\x0f\xf7\x21\xd4\xea\xf3\xc8\xad\xb5\xfa\xfe\x7a\x6c\xc8\x8b\xee\x64\x6b\xad\x1b\x64\x6a\x26\xcd\x87\x0d\x3e\xee\x19\x1b\x19\x3a\x26\x32\x1c\x7f\x36\x06\xd3\x22\xbf\x8c\xbc\x8a\x83\xd8\xfe\x43\x25\x6c\x2f\x7b\xf7\x50\x6f\x06\x11\x38\x14\xd1\xf6\x65\x10\x80\xa7\xc6\x5b\x02\x39\xd0\x1b\xca\xa0\xa3\xad\xa6\xb8\xcf\xf1\x25\x69\x00\x3c\xaf\xa4\x6f\x80\x1d\xcf\x13\x79\x42\x02\x2f\x3c\xed\xc7\xbd\xb0\x57\xaf\x14\x0f\x9e\x52\x9a\x18\xc8\xc8\x1c\x9b\x9e\x82\x7d\x98\xb9\xf0\x48\x53\xdb\x59\x2d\xb5\x93\xfe\x64\x0e\x4d\xee\xaf\x77\xad\x70\x8b\x8b\x92\xca\x35\xb7\xd5\xec\x5a\x15\x0d\x91\x8b\xb1\x01\xeb\xb5\x6d\x69\x6a\xcc\x2e\xf7\x37\xb0\x0d\xe1\xcd\x42\xdc\xf1\xd8\xb9\xd3\x6a\x4f\x69\x9b\xd8\x16\xc6\xd2\x99\x23\x6a\x66\xfd\x7c\xcb\x16\xbe\xe3\xe0\x08\xbe\xe3\xa4\x51\x53\xb6\xff\x7f\x15\x37\x16\x9d\x3f\x7f\x06\xde\x39\xff\x98\x96\x4b\xe6\x7f\x56\xe8\x39\x11\x98\x1e\x7b\xa1\x1e\x7b\x3e\x8c\x6c\x2b\x4b\xeb\x05\xc0\x73\x8f\xef\x55\x18\x1b\x77\x1e\x78\xf0\x94\xe8\x80\x73\x3b\x07\xac\xc9\x8f\xe8\x58\xf7\xec\xcf\x32\x3c\xdc\xe1\x47\x7a\xb8\x01\x5e\x75\x98\xb1\x7d\xbe\xd9\x1b\x70\x63\x8a\x91\x00\x9e\xa0\xb7\x04\xaa\xa0\x11\xce\x6b\x6b\xee\x15\x2c\x2a\xaa\xaa\x62\x41\x6f\x25\xe7\x5e\x6f\xf2\x5e\x86\x8c\x0d\xae\x4e\x4c\x4c\x83\xe4\xcc\xe4\xb1\xc9\x1b\x92\x1f\x4d\x4e\x48\x4e\x4e\xe4\x1d\xd5\x69\x95\x19\xb5\x7d\x4e\xce\xce\x47\x5f\x02\x3a\x83\x6d\x70\x0f\x97\xc4\x0e\x9f\xbb\xbd\xe5\x1d\x64\xea\x8f\x7e\x38\x03\x2f\xd5\x03\xf7\xc7\x86\xef\x9e\x27\xea\x72\x1e\xaa\x18\x83\xd8\xd0\xd4\xd8\x6c\xce\x18\x79\x82\xf7\xff\xe2\x87\x3b\xef\x9f\x36\xad\xfa\x7b\x17\xb7\x0f\x3a\xa3\xac\x72\xfa\x88\xc6\xb3\x2b\x82\xc5\xc7\x55\x54\x36\xf7\xf5\xe3\xdc\x43\xa5\x3b\xf3\x02\x03\x72\xcb\x9b\xca\xb3\xf8\x2f\x0e\x36\xb9\x9f\xc7\x0e\xef\x98\x79\xe3\xb8\xf2\x5e\x69\xc5\x85\xb9\xe9\x4b\x53\xfc\xbd\x1a\xcf\x68\x9b\x31\xfd\x92\x93\xbd\x49\xce\x57\xdd\xe6\x7d\x6e\xdb\xe0\xfe\x81\x60\x41\x41\x71\xd0\x53\x89\xe8\xf1\x24\xed\x2d\xc6\xe2\xe2\xc1\xd5\x09\x09\x29\x90\x94\x99\x34\x36\x69\x43\xd2\xa3\x49\x09\x49\x49\x09\xd8\x51\x9d\x52\x99\x91\xc8\x8b\x72\x6a\xfb\x9c\xec\xcf\x45\x73\xa0\xa6\xe1\x68\xd3\xce\x6a\x89\x6d\x57\xcf\x39\xe7\x3a\xa0\x29\x3a\xeb\x86\xd2\xb8\x59\xf3\xf6\x9b\xba\x4d\xba\x6e\xe0\xd2\xfb\xd3\x8b\xd3\x9d\x49\xdf\x14\x61\x47\x9f\x73\xca\x3f\x54\xc2\x8d\x9c\x77\x9b\x35\x40\x16\x34\x47\xae\xf5\xac\x4b\xf8\x08\xb2\xa1\x42\x67\x60\x4e\x82\x53\xe1\x0c\x98\x04\xe7\xc2\xf9\x70\x21\xcc\x81\x79\x70\x29\x5c\x01\x57\xc3\x72\x58\x8d\xde\xb6\x81\x53\xaf\x3c\xff\xea\x2b\xaf\x1e\x33\x69\x44\x76\xf6\x71\xbe\x15\x8b\x16\x55\x5c\xbf\x74\x69\x5e\x46\xe9\xe4\xd2\xb9\xa5\xbc\xb4\xb4\xa2\x5f\xf3\x29\xbe\xc9\x3e\x96\x59\xd1\xa7\x62\x4a\x05\xaf\x70\x02\xb0\x69\x39\x79\xed\x6d\xcd\x63\x9b\xf7\x35\x73\x5f\x45\x73\x73\x85\x8f\x8f\x3e\xfd\xf4\x85\xf3\x2f\x9a\x34\x7a\xd6\x05\x93\xc7\x2c\x98\x71\xf1\x94\xcb\x67\xcf\x98\x32\x7b\xf6\x94\x19\x7c\xcc\xf1\xc1\x96\x96\xca\xc2\x6b\xae\x59\xd1\x27\x23\xbb\x7d\xc5\x8a\xc0\xa2\x45\x53\x2a\xb0\xa2\x62\x75\x20\x90\xfe\x71\x25\xce\xad\xc4\xca\xca\xc6\x01\xc3\xc8\x83\x1e\xcf\xc8\xf4\x01\xe9\x03\xd2\xcf\x3c\xed\xcc\x2b\xc7\x9c\x76\xde\xf1\x50\xab\x2d\x88\xdf\xb4\x79\x70\xb9\xf9\x06\x7d\x57\x5f\x6d\x43\xf4\xe0\x5a\x8d\x36\x77\xae\xd3\xa8\x75\xf9\x5f\xbf\xbe\xfb\xb2\xbe\xbe\xd6\x6d\x87\xe0\x92\x25\x35\x6e\x02\x28\xba\x7b\x9a\x27\xd6\x57\xfb\xe9\xdf\x1e\x54\x07\xf1\x67\xdf\x7a\xb3\x1c\xee\x46\x1b\xee\x71\x71\x6f\x0d\xe6\x96\xe6\x94\xe7\x74\x6b\x2d\x02\xb1\xf0\xc3\x9b\x53\xe1\x77\x7e\x80\xfb\x1b\x72\x1a\x72\xb0\xa9\xd4\x5f\xde\xc4\x9b\x1a\x9a\x1a\xfc\x8e\xb6\x3a\xe1\x9e\xbe\x56\xdb\xf9\xda\xfc\xdf\x6f\xbe\xcf\x73\xcc\x33\xaa\xa2\x4d\xad\xd8\x86\xfc\xc6\x93\x07\x0f\x3e\xa5\x21\x3f\xbf\xe1\x94\xc1\x83\x4f\x6e\xcc\x5f\xb5\xea\xcc\x33\x2b\xca\xb3\x4a\x72\xd3\xcf\x38\xe9\x81\xbd\x98\xdc\x7e\xe6\x71\x25\x35\xa9\xa9\x55\x79\xc5\x55\xe7\x44\x66\x37\x0d\x69\x69\x68\x68\x19\xd2\x14\x79\x03\x6b\x9f\x9d\x3b\xf7\x59\x06\x58\x37\x47\x88\x39\x07\x33\xe7\xce\xc5\x16\xcc\x38\xb4\x75\xee\xdc\xb9\x73\xf9\xc7\x73\xf4\x7f\x87\x4e\xc0\x8c\x4b\x87\x56\xf6\xee\xdd\xaf\xb9\xa1\xa2\xb8\xb4\xa2\xd6\x93\x70\x66\x5b\x79\x79\xdb\x99\x83\x9b\xcf\x1a\x51\x5e\x3e\xe2\xac\xe6\xc8\xbe\xa6\x91\xd5\x83\x13\x3d\x3c\x3d\xbf\xb2\xe8\xd8\xf6\xc6\xef\x7d\x32\x76\x4c\x02\xef\x60\x9e\xe2\xe0\x01\xde\xff\xb4\xd3\x4e\x3c\xe9\xb4\xd3\x4e\x5a\x8a\x75\x73\x77\xfc\x43\x60\xed\xcf\xe6\x78\x23\x73\x23\xaf\xed\xf8\x07\x9b\xf3\xb3\xc8\xeb\x7c\x00\x66\xb2\x1d\x73\xe7\x7e\xb6\x11\xd3\x19\xc3\x8c\x43\x33\x30\xf3\xd0\x85\xee\xd7\x9f\x0d\x9d\x33\x87\xdf\x72\x65\x59\x49\x7e\x9f\xb1\x85\xf9\x85\x79\xc0\xc1\x13\xd9\x61\xb8\xe5\x20\xb4\xc0\xc9\x6d\x95\x9e\x60\xb0\xdf\xbc\x7a\x1c\x5b\x3f\xa5\x9e\xd5\xd7\xf7\xcb\xcd\x5d\xd4\x0f\xfb\xf5\x63\xbd\x33\x32\x58\xf3\x80\x60\x70\xc0\x00\x5e\x98\x95\xc5\x21\xbf\xb6\x21\xcf\x8d\x5b\x6b\xfd\x0d\x18\xfb\xdb\x24\xf7\xc4\xf8\x24\xe7\x1f\x06\xd5\xf9\x78\x82\x3e\xc3\x36\x9c\x47\x4f\x55\xbb\x16\x48\x1f\xaa\x4e\xe7\xc5\x98\x68\x7a\x39\xb8\x7c\x31\x9b\xce\xce\x3f\x74\xe7\xa1\x1f\xb0\xf5\x89\x81\xf2\x22\x47\xe9\xd6\xaf\x28\x6f\x1f\x7d\x6c\xd1\xc8\xe6\xe9\x03\x9a\xea\x53\xf2\x2a\x8b\x4a\x6a\x0a\xd3\x72\x8e\xad\xcf\x09\xf6\xc9\xce\xee\x13\xcc\xa9\x3f\xd6\x1b\x38\x38\xfe\xe0\x19\xfc\x47\x1f\xd6\xe4\x96\x95\x96\xe5\x96\xb6\x0c\x3f\x7e\xe0\xf7\x57\xa6\xe7\x97\x66\x6d\x28\x09\x36\xf5\x2b\xa8\xee\x5b\x91\x57\xd4\x30\x78\x68\xdf\xe6\xf0\xb1\xc7\xa4\xf7\xae\xed\x53\x56\x5b\x9c\x36\xc4\xb5\xc9\x3b\x00\x3c\xc9\x3a\x17\x95\x08\x55\x6d\x39\x09\x53\x1c\x2b\xec\xf3\x00\xbf\x98\x2f\xe6\x9c\x7b\x78\x22\x70\x18\x51\x5f\xab\x5b\x3e\xea\xc9\x0d\xaa\xcb\x2e\xf5\x97\x36\x97\xfa\x4b\x77\xf0\x13\x0e\x6e\x99\xc1\xae\x38\xb4\x22\x61\xf3\x67\x27\xce\xf0\xbc\x0f\x08\x1f\x78\xde\xe4\xef\x79\x73\x21\x05\x06\xb4\x65\x7a\x57\x42\x02\x26\x24\xa4\xac\x04\x48\x4b\x80\x5b\x7d\x5b\x11\x9f\xc8\xd0\x29\x3d\xa8\x9d\xb4\xff\x5d\x1d\x72\xed\x37\xc9\x28\x56\x5a\x56\x59\xd5\xe0\xc8\x74\x33\x7f\x2f\x10\x59\x2d\x36\x25\x3f\x94\x34\xee\xb2\x9f\xf9\xbd\xb9\x91\x9f\xad\x7d\x68\xfa\xe9\x4f\x99\x9e\xb5\x01\x3e\x5e\xf7\x88\xad\x6d\x2b\x48\x02\xef\xf1\x37\xa7\x6c\x48\x61\x29\x29\x99\x7e\xe7\x5f\xf9\x58\x4c\x2f\x4c\x3c\x39\x39\xc3\x6d\xaa\x8f\xb5\x93\xf4\xad\x99\xfb\xfd\x2d\x4e\x70\xea\x1e\xd1\xac\x68\x2a\xd5\xe1\xf2\x8a\xe5\x77\x5e\xba\x34\x32\x91\x4d\x78\xfb\x97\xf7\x47\x9a\xed\xaa\xf9\xe7\x7b\x5a\x72\xae\xfa\xfc\xd8\xc7\x05\x00\xe2\x47\x9e\x9d\x6c\xaf\x37\x00\x3e\xe8\xd5\xe6\xf3\xf9\x3c\x9e\x94\xa4\x5b\x39\xc0\x88\x3f\xb9\x67\xe7\x35\x04\x6f\x6e\x70\x54\xb3\x1c\x3f\x2a\x28\xf0\x3d\x3e\xae\x75\x8a\xe7\x83\x59\x0b\x4e\x0e\xa4\x3f\x3f\x19\x10\xdf\x89\x0c\x65\x1f\xd2\x52\x48\x82\xc2\xb6\xb4\xa4\x24\xce\x93\x13\x6f\xcd\x60\x25\xee\xd4\x3b\x1f\x12\x7b\xc6\x3b\xc3\x7b\x3d\x36\xe5\xbf\xce\x8b\x8c\xbf\xe1\xde\x40\xaf\x57\x3a\x74\xce\xf2\x1d\xcf\x9b\xec\x43\x6f\xa9\xfb\x0c\xce\x93\x92\xf4\x33\x26\x77\x7f\x86\x37\xb1\x5c\x77\x38\x67\x1f\x8e\x08\xfc\xe4\xec\x13\xa6\x7a\xbd\x77\xac\xcd\xf1\xbf\x74\x96\xb3\xbf\xd8\xc2\x5a\xf8\x9a\x84\x17\xc0\x07\x7e\x28\x6b\xcb\x4a\xdd\xa7\x1b\x03\x64\xee\xe3\xe9\xef\x27\xec\x49\x7e\x1f\xf6\x82\xdb\xb6\x39\xba\x0d\x65\x95\x4d\x99\xa5\xf5\xbd\x72\x32\x2b\xea\xfd\x99\xe5\x65\xfe\x4c\x36\xed\xa6\xbb\xb1\xe6\x36\x3b\xf2\xfa\x5d\x77\xdd\xce\x5a\xfe\xb0\x17\x7f\xae\xde\x8c\x34\x2f\xc5\xd1\x38\x2a\xf2\x74\x64\x1b\x30\xac\x60\x1b\xf9\xa2\x04\x01\xc9\xe0\x87\xf1\x6d\x8d\xfe\xc9\xde\x57\xbd\xcc\xeb\xf5\xcd\x80\xcb\x81\x41\x9f\x94\xf4\x76\x60\xfb\x52\x12\x4b\xf4\x85\xdc\x3c\x2b\xdb\x83\xef\xfa\xbd\xe9\x89\x29\xbe\x42\x1f\xf3\xf9\x58\xe2\x1e\xb6\xd7\xbd\x7c\x73\x52\x56\x8b\x3e\xf0\x1e\x2b\xc3\xa8\x99\x54\xef\x8a\x1c\x96\xe7\x94\xeb\x9b\x8d\xfc\x0d\xe5\x4d\x8d\xcd\xde\x0c\xe4\x8b\xc6\xad\x8e\xac\xc2\x2b\x6e\x1c\xf7\x8e\xb7\xba\xfa\x2e\x3e\x3e\x14\x9a\xca\x52\x22\x9e\x47\x3b\x26\x9c\x70\x8c\xbe\xcf\x18\xc7\xb2\x5b\xf8\xa8\x84\xcd\x90\x07\x13\xdb\x5a\xd2\x33\x32\x52\x52\xdb\x32\xf3\xda\x93\x53\x93\x53\x21\x61\x5f\x46\xa0\x24\x70\x4a\x60\x72\x60\x51\x60\x75\xe0\x9e\x40\x62\x20\xf0\x2a\xe0\xc5\x80\x90\xec\xf3\x25\xbe\xe7\xf7\xa7\xf0\x77\x31\x77\x6f\xfa\xbb\x29\x6f\xb9\xa2\xa4\xcf\xaa\x67\xb5\x60\xad\x7b\x3d\xaf\x4b\xf1\x37\x68\x9b\x8d\x1a\x77\x35\x96\x97\x25\x56\x65\x97\xe6\x94\x26\xc6\x10\x22\x8e\x9d\x7e\xe1\x7d\x0f\x36\x9e\x30\xbc\x04\x6f\x8c\xec\xf3\x97\xb7\x2e\x5c\xb3\xee\x96\xef\xb3\x1d\xd7\x8e\x5a\x73\xab\xbf\x0a\xaf\xbe\x68\x87\x77\xc9\x9c\x45\x37\xc5\xed\xd3\x1b\x90\x09\x85\x30\xa4\xad\x37\xef\xb5\x2f\x03\x33\xfc\xfb\xea\x7c\xe8\xf3\x65\xf0\xec\x77\x75\xa4\x0d\xf9\xef\xa7\xee\x45\xd8\x13\x3d\xa2\x3e\x49\xa7\x64\xf4\x70\xdc\x98\x32\xd7\x93\xd8\x10\x7b\x7d\x65\x53\x26\x36\xc6\x0e\xd4\xf2\xe2\x01\x91\x2d\x8d\xc9\xad\x37\x5c\xbc\xf4\x81\xe5\x2b\x36\xe2\xce\x35\x27\x4e\x9d\x74\xd2\xa8\xd3\x12\xde\x98\x73\x91\x9c\x78\xc7\x62\x6b\xe3\x53\x77\xe3\xed\x91\x61\x9b\xce\x68\x1b\x3f\x6f\xa2\x5e\xbf\xb9\x6c\x03\x5f\xa3\x6b\x8e\x9a\xda\xca\xbc\x00\x98\x91\x70\x4a\xc2\xa2\x04\x9e\x90\x00\x6c\x2c\x9b\xc2\x2e\x66\x8f\xb2\xd7\x98\x97\x25\xb0\xf7\xf9\x5b\xb0\x1b\x4c\x7e\xb9\xbe\x76\x52\x83\xe6\x1a\x7c\xba\xd5\x20\xa2\xc0\xa6\xc8\x65\xac\x6f\xe4\x17\x6c\x03\xbb\xfb\x8a\x69\x87\x4e\x06\x8e\x83\xd8\x6a\x3e\x25\x41\x40\x36\x14\x42\x5f\xb8\xba\xed\xb4\xe4\xa2\xd4\xb2\x7d\x2c\x00\xac\x60\x5f\x6a\xaf\x7d\x59\xa9\x59\xa9\x59\x49\x19\x6c\x11\x7b\x86\x71\xc6\x7a\xef\x2b\x49\xfa\x73\x12\x4b\xba\x30\x80\x5b\xe1\x45\xf8\x2d\xf0\x0b\x01\xb7\x26\xbf\x98\xfc\xdb\x64\x7e\x61\x32\x5e\x58\xf4\x64\xd1\x4b\x45\x6f\x16\x79\x8a\x34\xd4\xcf\x7b\x2f\x63\x4f\x9f\xf7\x12\x5c\xd1\xce\xca\x6d\x31\x6d\x68\x75\x32\xd3\x4d\xce\xe8\x84\x45\x4b\x8b\xfe\x63\x50\x1d\x46\xd7\xab\xb1\x39\x96\x8b\x49\x1c\xec\xa6\x62\x72\xbd\x39\x01\x67\x77\xab\xd8\xb6\x07\xd7\x7f\x7f\xe5\x9a\xeb\xe7\xdf\x7c\xf1\xdc\x1b\x0f\xce\x9c\x3d\x6b\xe2\xc2\xa5\x2b\x56\x78\x46\x9e\x7e\xe5\x05\x57\x2f\x9c\xb1\xe4\xc4\x53\xe6\x9f\x7d\xd1\xec\x49\x0b\xb2\x07\x8d\x9b\x32\xe5\xd4\x7b\x47\x4c\xb8\xf4\xd2\xb3\x8e\x89\xed\xeb\x4b\x86\xef\x2b\x49\x28\xd8\x87\x29\x75\x7e\xf4\xfb\x73\xf6\xa5\x24\xe4\xbe\x9b\xe1\x68\x63\x3a\x7f\x17\xb3\xf7\x16\xbf\x9f\xbe\x27\x26\x6b\x7a\x67\xdd\xe1\xea\x8d\x6d\xea\xd5\xd0\x27\xbb\x3c\xc6\x42\xf4\xca\xc9\x2c\x2d\xcb\x0e\xc4\xfc\x3e\xae\xa8\x1a\x8e\x99\xe9\x49\xc7\x5f\x73\xe5\x75\x1b\x96\xde\xf4\xa3\xc8\x79\xc3\xd3\x6e\x3b\xe1\xdc\xb3\xbe\x37\xea\x74\xd6\x7e\x75\x2e\x0e\x9d\x7a\xdb\x35\xd6\x43\x3b\xb7\x1d\xfa\x3b\x3b\xef\xfe\x33\x86\x8c\xbd\xea\x1c\x47\xe6\x06\x78\x66\xf0\xeb\x13\x5e\x00\x3f\x94\x40\x5d\x5b\x41\x1b\x20\xb4\xa5\xa6\x66\xf5\xf1\xa5\xb6\x67\x2d\xce\xcb\xed\x9d\xdb\xfb\x14\x3e\x99\x33\x9e\x01\xb5\xaf\x4c\x72\x96\x0d\x6b\x0b\x76\xd6\xd4\xd7\x16\xe8\x3a\xa1\x46\x7d\x97\x5f\x4e\xa0\x37\x73\x57\x2f\x61\x38\x6f\x6e\xc8\x49\xe7\x89\xe5\x38\xe0\xf2\x2b\x87\xb5\x94\xf4\x2d\xa9\x1f\x38\x74\x14\x36\xa5\xe4\xe7\xf5\x4a\x7a\x35\xab\x6e\xc8\xf0\x92\x0e\xcf\x07\x27\x5f\x52\x32\xa6\xd7\xc0\xbc\xec\xac\xcc\x82\xa2\x8a\xaa\xd1\x15\xbd\x4f\x3a\xe5\xd4\xbe\x81\x3e\xdf\x1b\x7b\x6a\x85\xe3\x8f\x9e\xf6\xbc\xe9\xc9\xf4\x2e\x82\x4c\x28\x82\x51\x6d\xe5\xbd\x56\xe6\xe6\x16\x2e\x19\x51\x74\x4a\xd1\xdc\x22\x5e\x54\x94\x96\x96\xea\xf1\x24\x21\x40\x62\x52\xaf\xc5\x85\x6d\x9e\xd4\xc5\x89\x00\xb5\xf5\x05\x3b\xeb\x0b\xf6\x14\xec\xc4\xda\x58\x07\x2a\xdd\xb2\xc5\xed\xc2\x53\x3e\x10\xab\xd2\x31\xb1\xbc\x69\x38\x36\x37\xf4\xc6\xdc\x2a\x77\x9c\x98\x58\xce\x6b\xa6\x35\xcc\x6e\x1c\x3c\xb3\xe1\xfc\x86\x05\x75\x3b\xea\x16\x34\x9c\x1c\xe8\xd3\xbb\x38\xf3\xf1\x01\x33\x9b\xcf\xf7\xbc\x59\x36\xae\xae\x6e\x5c\x59\xe1\xd0\x65\xc7\x1d\xb7\x6c\xe8\xcf\x0a\xfa\x0f\x6c\x2c\xcd\x19\x76\x41\x4d\xcf\x31\xe6\xae\xec\xd5\x96\xb5\xa4\xce\xdf\xe6\x9f\xe2\xe7\x7e\x3f\xe7\x9e\xd4\xd4\x4c\x5f\x52\x52\x46\x66\xee\xe2\xac\xb6\x54\xbe\xd8\x97\x01\xb5\x0d\xce\x18\xdf\xea\x39\xc6\x82\xdd\xce\x18\xcd\xd0\x72\xa2\x63\x6d\x76\xbe\x68\x6a\xe8\xcd\x73\xf1\xbe\x86\x05\x75\xcf\xd6\x2d\x68\x98\xd6\x30\x73\x70\xd3\xac\x86\x69\x27\x9f\xdf\x3c\x6b\xc0\x13\x99\xc5\xc5\xa5\x01\xcf\x01\x77\x70\x85\xee\x50\x45\xcd\x05\xc3\x72\x4a\x1b\x07\xf6\x2f\x00\x06\xbb\x3d\x6f\xf2\x8f\xbd\x9f\x42\x26\x04\x61\x72\x5b\x63\xee\x92\xbc\xbc\xbe\x45\x4b\x32\xfc\x25\x7e\xe6\xf7\x67\xf4\x2d\xe9\xcb\xfa\xb6\xa5\x66\xb4\xf7\xed\x1b\xbf\xa4\xf9\xf9\x79\xa5\x37\x54\x55\xe5\x39\x0b\x8b\x89\x66\xd0\xaf\xd4\xd7\xfe\xc9\x09\x75\xbb\x8e\xbc\x46\x9b\x41\x7f\xcb\x61\x97\x38\x3b\x90\xce\x32\xb0\xbc\x2a\x76\x53\x64\x62\x93\x23\xb4\x7c\xcc\xf9\x0d\xb3\x9a\x06\x5f\x18\x5b\xef\xfb\x03\xe5\x03\xf2\xbd\xe3\x53\x86\x1c\x9b\x51\x58\x91\xd3\xab\x2a\x25\x67\xe8\x79\xd3\xba\xad\x3c\x2e\x2c\xae\xe9\x9d\xe3\x3d\x75\xa9\xaf\xa4\x22\x3b\x2f\x3d\x81\xf3\x0e\xef\x71\x3a\x76\xc1\x72\xcf\x9b\x7c\x63\x62\x26\x64\x42\x7f\x98\xde\xd6\x37\x50\x50\xb5\xa4\xba\x2c\xbf\xda\xc3\xcd\xfa\x57\x97\x54\xd7\x56\xf3\xea\xea\xfc\x25\x05\x19\x99\x99\x05\x55\x55\x25\x25\x5b\x11\x7f\xd2\x2b\xbf\xad\xef\x56\xc4\x2d\x7e\x7f\x7e\x6c\x73\x76\xd7\x3f\x5f\x5f\xbb\xbf\x20\xf3\x77\xfb\x6b\xeb\x6b\xf5\xb5\xfb\x99\x7f\xd2\x91\x9c\x99\x70\x56\x4b\xe6\x9f\x9c\x20\xa2\xc7\x4e\x61\x99\x3b\xc1\x72\xb7\xff\x4f\x43\xfd\xe0\xe6\x86\x74\x8e\x03\xcc\x0c\xcf\x6f\x98\x39\xb8\x71\x76\xc3\x34\x7c\xa6\x6f\xfb\x71\x23\x8a\xab\xfb\xa5\x4f\x4c\x28\xaa\x1b\x19\xac\x3c\xf1\xb8\xe1\x05\xce\xdf\x3c\xc5\x75\x23\xbb\xed\x23\x4e\x28\x2a\x2b\xea\x57\x5f\x77\xea\xd0\xd2\xa2\xb2\xa2\x9a\x41\xce\x17\xae\x8f\xf0\xbc\xc9\xd7\x78\x77\x40\x0a\x94\xc0\x80\xb6\x5e\x90\x82\x29\x6d\x89\x25\x4b\x53\x53\x73\x96\x06\x12\x16\xa7\xa4\x94\x04\x0a\x56\xfb\xa1\xf6\xd0\x2b\xf5\xf5\xb5\x05\xaf\x68\xfb\xb1\xff\x37\x05\x3b\x27\x39\x02\x16\x95\xf9\x0a\xb7\x61\x4c\x83\xb9\x43\x86\x55\x44\x45\x7e\xc8\x34\xbc\xc8\xd3\x7f\xcc\x45\xc7\xdf\x7a\x73\xe2\x1c\x4f\x61\xdd\xa8\x9a\xbe\x23\x1b\xca\x3c\x09\x9f\xe6\xf7\x1f\xd8\xe4\x48\x7e\x7f\xef\xb0\xf3\x8e\xab\xbc\x7e\x51\xcd\xa0\x82\x44\x5f\xe1\xa0\x6a\xe8\x31\xa6\xda\xb6\x5c\x67\x34\x81\x0c\xc7\x90\x78\xf4\xa0\x10\xbb\x0c\x6a\x27\xba\x23\xf2\x77\xaa\xa6\x23\xe5\x25\xd8\x6d\x54\xeb\xcf\x1f\x32\xd3\x08\xf9\xe7\x87\x1b\xd4\xee\xfe\x8e\xa8\x37\x0d\xec\x9f\x9f\xd3\x63\x50\x66\x4c\x89\x5e\xc8\x86\x1a\x18\xdf\x56\x57\x50\x50\x58\x58\x51\x51\x12\x68\xf3\xa5\xb6\x07\x02\xe0\x5b\x9a\x94\xbd\xb4\x04\x10\xf2\x8b\x8a\x0a\xcb\x6e\x08\x2e\x5e\x5d\x78\x4f\xe1\x8f\x0b\x79\x61\x61\x7a\x76\x52\x52\xfa\xea\x04\xa8\xfd\xcb\x8b\xb5\xf5\x99\x2f\xd7\x4e\x2a\x78\x6b\x7f\xf4\x82\xfe\xda\xfd\x0e\xca\xdb\xd1\x50\xdb\x52\xdb\x50\x6b\x1a\xe7\x77\x0e\xb8\x2a\x4e\xe0\x75\x13\xac\x26\x1d\xe3\xf3\x35\x87\x19\x7c\x4d\x4c\xe8\x5b\x6a\x7a\x55\xa5\xa4\x54\x96\x9c\x37\x2d\xe1\x9d\xae\xd3\x58\x57\x5c\x53\x12\xf0\x06\x27\xf8\xfa\x54\x54\xe4\x71\xde\xc1\xf9\x71\x71\xf2\x9e\x0d\xb5\x70\x66\x5b\x5e\x7e\x59\xa0\xaa\xac\xaa\xa6\x68\x49\x71\xb1\x6f\x69\x52\xbf\x25\x35\x35\xd9\x4b\xa1\x5f\xbf\xb2\xad\x88\x8f\xe5\x17\x57\x6d\x45\x6c\x4b\x6d\x0b\x04\x8a\x93\xb2\xb3\x93\x16\xeb\x79\xed\x2f\xd8\x59\x5f\x9b\xf9\x7c\x7d\x6d\xc1\x9f\x32\xdf\xfa\x93\x23\xe8\x8e\x88\xe8\x3f\x62\x08\xb4\xfb\xcc\x0e\x2b\xdf\xfc\x7a\x77\x62\xb7\x78\x9d\x89\xfd\x57\xff\xbe\xc7\x36\x94\x25\xd4\x1e\x45\xc4\xbb\x4f\x70\xec\x61\x45\x1c\x10\x5f\x88\x8c\xe4\x5e\x00\x08\x38\xd1\x2a\x77\x22\xe6\x5a\x27\x00\x48\x4f\x5a\x06\x59\x37\xa5\x30\xa8\xad\xdd\x8f\xb5\x7f\x7a\xc5\xd1\xcd\xba\x41\x09\x8d\xce\x38\xbb\xe0\x61\x36\xef\x86\x6b\x0b\x5a\x6a\x7b\x4f\x3b\xbf\x78\x44\x41\xfa\x80\xfc\xb2\xc6\x8f\x66\x2e\xcb\x6e\x6c\x3b\xa9\xdf\x84\x19\x49\x49\xf3\x3c\x09\x35\xee\x7b\x1e\x8b\xcc\xe1\xf9\xf0\x20\xf8\x21\xaf\x2d\xd9\x87\x27\x64\x26\xa7\x8d\xf5\x79\x01\x6a\xdd\x9e\x99\xfb\x5f\x89\x5d\xe1\x10\xbb\x14\x84\xe7\x63\x41\xcb\x59\x23\xa2\x1d\x31\x1f\x8c\xbc\x39\x72\xfa\xe8\xbe\xa6\x13\x26\x0e\x8b\x7f\xae\x7d\xb8\xe7\xfe\xe9\xcb\x3d\xd7\x8e\xbc\x17\xff\xdc\x3a\x37\xff\x02\x90\x0c\xbd\xa1\x3f\xe0\xec\x73\x17\x5c\x04\x49\xe0\x01\x37\x97\xed\xfc\x0b\xce\x3a\x7f\xbe\xf3\x3d\xf7\xe7\x10\x3c\xc0\x20\x09\xd0\xf9\xbc\xaf\xda\xf9\x49\xfc\x88\xbf\xcf\xdf\x4f\x6c\x4f\x1c\x9f\xf4\x5a\xe2\x78\xdf\xc0\xe4\xa7\x53\x7a\xa7\xa6\xa6\x1d\x93\xde\x27\xc3\x9b\xa1\xfc\x57\x66\x6d\xcc\xbe\x26\xb0\x29\xf0\xbb\xfc\x89\xf9\x7f\x28\xbe\xa1\xb4\xbe\x7c\x5a\xd5\x35\x89\xed\xd5\xd3\xaa\xa7\x55\xcf\xac\x9e\x56\xfd\xfd\x60\xaf\x60\xff\x60\xbd\xf3\xf7\xe0\xa8\x60\x47\xf5\xcc\xe0\x6b\xc1\xf7\x83\xef\x07\x0f\xf6\xfb\x4d\x3f\x95\xd8\x5e\xb3\xb9\xe6\xb9\x9a\x5f\x0d\xec\x33\xb0\x4f\xcd\xaf\xea\xa6\xd6\x6f\x4c\xe9\xdd\xf8\x59\xd3\xbe\xc6\xcf\x1a\x3f\x4b\xef\xe3\x7e\x0c\xde\xde\xdc\x16\xfd\xf0\x5f\x39\xc4\x76\x3f\x5a\xee\xd7\x6f\x30\x1f\xc1\x51\xd5\x33\x87\x9f\x63\x3e\x66\x0c\x5f\x18\xfd\x08\x8e\x1a\x7e\xb3\xf9\xb0\xdb\xfa\xf8\x06\x56\x4f\x73\x3e\xdb\x86\x57\x4f\x4b\xe9\x5d\x3d\xd3\xf9\x70\xfe\x7f\xec\x6b\xee\x53\x46\x9e\xec\xfc\x99\xde\x67\xe4\x38\x67\x6e\xc1\xfa\x0c\xe5\x7c\x1c\xfb\x9a\xf3\xa7\xfb\x13\xfe\x2b\x83\xa3\x82\xa3\xdc\x3f\xdd\xdf\xff\xaf\xe1\xd5\x33\x47\xb5\x8f\x6a\x3f\xf6\xb5\xfc\x89\xee\x47\xf1\x0d\xc1\xf7\xcb\xa7\xf5\xfb\x4d\xfb\xf6\xaa\x6b\xaa\xae\xf9\x5e\xe3\xd8\x13\x4f\xcd\x3b\x75\x82\xf3\xde\xea\x99\xa7\xde\x75\xea\xcb\xa7\xfe\xb6\xc3\xdb\xb1\xbe\xe3\xc1\xd3\x52\xc7\x9d\x38\x6e\xe3\xf8\x8b\xce\x1a\x72\xd6\x84\x09\x0b\x26\x5c\x77\x76\xe3\x39\xf3\xcf\x59\x3c\xd9\x9e\xb2\xe0\xdc\x82\x69\xcf\x9e\xbf\xf0\xfc\x0d\xe7\x47\xa6\xd7\x4d\x1f\x3e\xfd\xe3\x99\x0f\xcd\x7c\xb4\x7a\xda\xcc\x97\x67\x3e\x34\xab\x68\x56\xd9\xac\xb1\xb3\x26\xcc\x5a\x59\x3d\x6d\xd6\x67\xb3\x87\xcd\x9e\x3a\x7b\xfd\xec\xcd\xb3\x9f\x9b\xfd\xbb\xd9\xcf\xcd\x56\x73\x92\xe7\x8c\x9a\x33\x3e\x38\x6a\xce\xa6\x39\xdb\x9d\x11\x5e\x94\x7a\xd1\x47\x73\xdf\xbd\x64\xf0\x25\x8f\x5f\xf2\xf2\x82\xc6\x4b\xb3\x2e\x7d\x77\xe1\x43\x97\xf5\xb9\xfc\x37\x57\x2e\xf8\xbe\x7d\xf5\xa8\xab\x5f\x5e\x9c\x74\x6d\xd6\xb5\xbf\x5d\x32\x7f\xe9\xfd\xcb\x22\xcb\x03\x2b\x7a\xdf\x30\xe3\xc6\xf0\x4d\x1b\x56\x4f\xb8\xb9\xe8\x96\x5e\xb7\xdc\x7c\x6b\xd6\xad\x1b\xd6\xf4\x5a\xf3\xfd\xb5\x6c\xed\xda\xb5\x8f\xad\x3d\x70\x5b\xbf\xdb\x36\xad\x2b\x5b\xb7\xf1\xf6\xfa\xdb\x17\xdf\xbe\x67\xfd\x86\x3b\xea\xef\xb8\xdf\x2e\xb0\x2f\xb6\x5f\xae\x9e\x79\x67\xdd\x9d\xf7\xdd\xf9\xfb\xea\x99\x6b\x0f\xdc\xd5\xef\xae\x21\xce\xba\xdc\xf5\xd0\x5d\x8f\xdf\x7d\xcc\xdd\x5b\xef\xde\xfe\x83\xba\xa5\xf7\xaf\xdf\x70\xcb\xcd\xeb\x36\x2e\x0f\xdc\xbe\xf8\xca\x05\x57\x2e\xb8\x36\xeb\xb6\x7e\xce\xe7\xd2\xfb\xd7\x6d\x5c\x16\x71\xfe\xbc\x61\xc6\xfa\x0d\xce\xa7\xf3\xe1\xfc\xdd\xfd\x5c\xbf\xe1\x07\x0f\xae\x9e\x60\x17\x38\xbf\xbb\x2c\xb2\x6e\xe3\x0f\x1e\x5d\xbb\x76\x45\xef\xdb\xf7\x2c\x7c\xc8\xf9\xee\xba\x8d\xce\x9f\xd1\x67\x39\x9f\xce\xdf\xdd\x7f\x77\x7e\xdf\x79\x9b\xf3\xb7\x15\xbd\xd7\x6f\x70\x3e\x9d\x7f\x8d\x7e\x3a\x3f\xb1\xf4\xfe\x4b\x5e\x76\x7e\xcb\x7d\x5a\xf4\xf3\x92\x97\x9d\x11\xae\x3d\xb0\xf6\x40\x74\x1c\xd1\x91\x3a\xbf\x11\x1d\x99\xfb\x19\x1d\xb5\xf3\xe9\xbe\xe9\xf6\x3d\xd1\x31\xb9\xff\xee\x8e\xb1\xfb\xef\x39\x23\x73\xbe\xef\x1b\xe8\xc8\x4a\xf4\xd3\x37\xf0\xf0\x1f\xf1\x72\xee\xca\x67\x7a\x1f\x47\x02\x8f\xf4\x79\x6a\x5e\xf4\xc3\x91\xc6\x53\x27\x44\x3f\x1c\x99\x8c\xff\xbc\xaf\xe0\xbe\x02\xdf\x40\xf8\x2d\x54\x52\x08\x06\x6a\xf6\xaa\x03\x86\x42\x07\x0c\x83\xe9\xd0\x0a\x41\x18\x0e\x1d\x30\x02\x82\xd0\x4e\x02\x4e\x20\x01\x27\x92\x80\x31\x24\x61\x1c\x09\x18\x4f\x02\xce\x82\x20\x9c\x0d\x41\x98\x08\x01\x38\x07\x82\xb0\x8c\x42\x60\x51\x08\x96\x53\x08\x56\x50\x08\x56\x52\x08\x56\x51\x08\xae\xa3\x89\x70\x33\x04\xe1\x16\x08\xc2\xad\x10\x84\x35\x10\x84\x7b\xa1\x03\x1e\x22\x01\x0f\x93\x80\x4d\x24\xe0\x11\x12\x10\x22\x01\x3f\x26\x01\x9b\x49\xc0\x16\x12\xb0\x95\x04\x3c\x49\x02\xb6\x91\x80\xa7\x49\xc0\x0e\x08\x82\x80\x20\x3c\x47\x21\x78\x9e\x42\xf0\x22\x85\xe0\x17\x24\x60\x27\x09\x78\x95\x04\xbc\x4e\x02\x24\x09\x78\x93\x04\xec\x22\x01\xbb\x49\xc0\x5e\x12\xf0\x11\x04\xe1\x13\x08\xc2\x01\x08\xa2\x9f\x04\x66\x93\xc0\x1c\x12\x98\x4b\x02\x2b\xa1\x03\xab\xa1\x03\x87\xc0\x74\x6c\x81\x00\x1e\x03\x1d\x38\x14\x82\x38\x0c\x3a\xb0\x15\x82\x38\x02\x82\x78\x2c\x04\xf1\x38\x0a\xe1\xb9\x14\xc2\x59\x14\xc2\x4b\xa0\x03\xaf\x22\x81\x8b\x49\xe0\x12\x08\xe2\x32\x12\x78\x03\x04\xf1\x26\x12\x78\x33\x09\xbc\x95\x04\xae\x81\x20\xde\x46\x02\xd7\x41\x10\xd7\x93\xc0\x3b\x49\xe0\xdd\x24\xf0\x1e\xe8\xc0\x07\xc9\xc6\x8d\xd0\x81\x0f\x41\x2b\x6e\xa2\x10\x3e\x4a\x16\x3e\x06\xad\xf8\x13\x08\xe0\x16\xb2\x70\x3b\x74\xe0\x33\xd0\x8a\x3b\x20\x88\xcf\x43\x07\xbe\x4e\x02\x7f\x47\x02\x77\x93\xc0\x3d\x10\xc4\xbd\x10\xc4\x7d\x24\x50\x91\xc0\x3f\x93\xc0\x83\x30\x1d\x0f\x41\x00\x23\x30\x1d\x09\x02\x0c\x60\x3a\x43\x08\x30\x06\x1d\x8c\x43\x90\xf5\xa3\x10\x9b\x40\x21\x36\x95\x04\x9b\x4d\x82\xcd\x85\x20\x5b\x40\x21\x76\x39\xb4\xb2\x6b\x49\xb0\xa5\x10\x64\x16\x04\xd9\x0a\x12\x6c\x15\x09\x76\x3d\x09\x76\x23\x04\xd9\x6a\x12\xec\x5e\x68\x65\x0f\x43\x07\xdb\x04\x41\xf6\x38\x09\xb6\x99\x04\xdb\x02\x1d\x6c\x2b\x04\xd9\x93\xd0\xc1\xb6\x41\x90\x3d\x05\x1d\xec\x69\x08\xb2\x9f\x42\x2b\x7b\x06\x3a\xd8\x2b\xd0\xca\x5e\x23\x8b\xed\xa2\x10\xdb\x4d\x21\xb6\x97\x42\xec\x6d\x12\xec\x03\x68\x65\x9f\x90\x60\x07\x48\xb0\x30\x09\xf6\x0f\x68\x65\x9f\x41\x90\x7d\x0e\xad\xec\x20\x04\xd9\x21\x68\x65\x11\x08\xf2\x44\x68\xe5\x3e\x68\xe5\xa9\x24\x78\x3a\x09\x9e\x09\x41\x9e\x05\x41\x9e\x4d\x16\xcf\x23\xc1\xf3\xa1\x83\x17\x40\x90\x17\x91\xe0\xc5\x64\xf1\x12\x0a\xf1\x52\x0a\xf1\x72\x0a\xf1\x0a\x0a\xf1\x2a\x0a\xf1\x20\x85\x78\x0d\x85\xf8\x00\x0a\xf1\x5a\x0a\xf1\x41\x14\xe2\x0d\x14\xe2\x4d\x14\xe2\x43\x48\xf0\x63\x48\xf0\x61\x24\xf8\x70\x12\xbc\x8d\x04\x1f\x49\x82\x8f\x22\xc1\x47\x93\xe0\xc7\x43\x90\x9f\x00\x41\x3e\x86\x04\x3f\x99\x04\x1f\x4b\x82\x77\x90\xe0\xe3\x48\xf0\xf1\x24\xf8\x99\x24\xf8\x04\x12\x7c\x22\x09\x7e\x0e\x09\x3e\x85\x04\x9f\x4a\x82\xcf\x83\x0e\x3e\x1f\x82\xfc\x12\xe8\xe0\x0b\x20\xc8\x2f\x85\x0e\xbe\x10\x82\xc0\xa1\x16\xae\x82\x4f\xe1\x2a\x7c\x00\xae\x82\x73\xa0\x9a\x04\xf4\x27\x01\x8d\x24\x60\x30\x09\x68\x21\x1b\x8e\x21\x09\x43\xc9\x86\x61\x14\x82\xe1\x64\xc3\xf5\x24\x60\x1d\x09\xb8\x9d\x04\xac\x27\x01\x77\x90\x00\x9b\x04\xdc\x45\x02\xee\x26\x09\x3f\x20\x09\xf7\x90\x84\x0d\x24\xe1\x5e\xb2\xe1\x65\x12\xf0\x1a\x09\xd8\x47\x02\xde\x26\x01\xef\x92\x80\xf7\x49\x60\x26\x09\x0c\x38\x72\x4e\x36\x56\x93\x8d\x03\x49\x62\x3d\x49\x6c\x24\x89\x83\x49\xe2\x10\x0a\xe1\x31\x64\xe3\x30\xb2\x71\x06\x09\x9c\x4b\x02\x2f\x21\x1b\xb7\x91\xc0\x9f\x92\xc0\xed\x64\xe3\x41\x0a\x61\x84\x42\x0c\x28\xc4\x18\xd9\xec\x5c\x12\xec\x3c\x92\xec\x22\x12\x6c\x31\x09\xb6\x9c\x04\x5b\x49\x82\x5d\x47\x82\xdd\x40\x82\xdd\x44\x82\x3d\x4c\x36\xfb\x09\x09\xf6\x84\x23\x2f\x64\xb3\x27\xc9\x66\x4f\x91\xcd\x9e\x21\x9b\xbd\x43\x82\xbd\x47\x82\xfd\x85\x04\xfb\x2b\x09\xf6\x37\x12\x3c\xd7\xd9\x57\xb2\x79\x21\x09\x7e\x12\x09\xfe\x3d\x12\xfc\x14\x12\xfc\x54\x12\xfc\x34\x12\xfc\x74\x12\xfc\x0c\x12\xfc\x2c\x12\xfc\x6c\x12\x7c\x12\x09\x3e\x99\x04\x3f\x97\x04\x3f\x8f\x24\x3f\x9f\x24\xbf\x80\x24\xbf\x90\x24\x9f\x45\x92\xcf\x21\xc9\xe7\x92\xe4\xf3\xc8\xe6\x97\x90\xcd\x2f\x25\x1b\x72\x9d\x95\xd6\xb3\x5b\x40\x02\x1f\x23\x89\x5b\x48\xea\x19\x3e\xef\x68\x03\x49\x76\x2f\x49\x3d\xf2\xf8\x11\xff\x94\xa4\x1e\xf5\x2b\x24\xd9\x6b\x24\xd9\x07\x24\x79\x22\x49\xee\x23\xc9\xb3\x49\xea\x51\x17\x93\x84\xf3\x20\x91\x42\x90\x4a\x21\xa8\x26\x05\xfd\x49\x41\x23\x29\x18\x4c\x0a\x5a\xc8\x82\x63\x48\xc1\x50\x12\x30\x8c\xa4\xd9\x5f\x05\xeb\x48\xc1\xed\xa4\x60\x3d\x29\xb8\x83\x14\xd8\xa4\xe0\x2e\x52\x70\x37\x29\xf8\x01\x29\xb8\x87\x14\x6c\x20\x65\xf6\x57\xc1\x6b\xa4\x60\x1f\x29\x78\x9b\x14\xbc\x4b\x0a\xde\x27\x85\x99\xa4\x30\x40\x0a\x7b\x91\xc4\x4a\xb2\xb0\x9a\x2c\x1c\x48\x0a\xeb\x49\x61\x23\x29\x1c\x4c\x0a\x87\x90\x8c\xdb\x63\x85\x73\x49\xe1\x25\x64\xe1\x36\x52\xf8\x53\x52\xb8\x9d\x2c\x3c\x48\x12\x23\x24\x19\x90\xd4\x7b\xec\xa3\x10\x4b\xa3\x10\x3b\x97\x14\x3b\x8f\x14\xbb\x88\x14\x5b\x4c\x8a\x2d\x27\xc5\x56\x92\x62\xd7\x91\x62\x37\x90\x62\x37\x91\x62\x0f\x93\xc5\x7e\x42\x8a\x3d\x41\x8a\x6d\x21\x8b\x3d\x49\x16\x7b\x8a\x2c\xf6\x0c\x59\xec\x1d\x52\xec\x3d\x52\xec\x2f\xa4\xd8\x5f\x49\xb1\xbf\x91\xe2\xb9\xa4\x78\x3e\x59\xbc\x90\x14\x3f\x89\x14\xff\x1e\x29\x7e\x0a\x29\x7e\x2a\x29\x7e\x1a\x29\x7e\x3a\x29\x7e\x06\x29\x7e\x16\x29\x7e\x36\x29\x3e\x89\x14\x9f\x4c\x8a\x9f\x4b\x8a\x9f\x47\x8a\x9f\x4f\x8a\x5f\x40\x8a\x5f\x48\x8a\xcf\x22\xc5\xe7\x90\xe2\x73\x49\x75\xd9\xeb\x3c\x18\xa8\x57\xde\x59\x75\x05\xad\xa4\x60\xb8\x5e\x49\x85\x95\xa4\xb0\x9a\x14\x1e\x43\x0a\x87\xe9\x95\x70\x56\x40\x31\xa6\x67\xe2\xcc\x40\xb1\x27\x49\xb1\xa7\x48\xb1\x67\xf4\x48\x15\x3f\x9e\x14\x3f\x41\xbf\x41\xf1\x4b\x48\xf1\x4b\x9d\xe7\x42\x22\x04\x21\x15\x82\x90\x0e\x41\xa8\x26\x09\xfd\x49\x42\x23\x49\x18\x4c\x12\x46\x42\x10\xa6\x42\x10\xae\x27\x09\xeb\x48\xc2\xed\x24\x61\x3d\x49\xb8\x83\x24\xd8\x24\xe1\x2e\x92\xf0\x32\x49\x78\x8d\x24\xec\x23\x09\x6f\x93\x84\x77\x49\xc2\xfb\x24\x31\x93\x24\x06\x48\xe2\x0c\x92\x38\x97\x24\x6e\x23\x89\x8e\x14\xfa\x20\xc8\xd2\x20\xc8\xce\xd5\xba\x27\xd9\x62\x92\x6c\x39\x49\xb6\x92\x24\xbb\x8e\x24\xbb\x81\x24\xbb\x89\x24\xfb\x09\x49\xf6\x04\x49\xf6\x0e\x49\xf6\x1e\x49\xf6\x17\x92\xec\xaf\x24\xd9\xdf\x48\xf2\x5c\x92\xbc\x90\x24\x3f\x89\x24\xff\x1e\x49\x7e\x0a\x49\x7e\x2a\x49\x7e\x1a\x49\x7e\x3a\x49\x7e\x06\x49\x7e\x16\x49\x7e\x36\x49\x3e\x89\x24\x9f\x4c\x92\x9f\x4b\x12\x4e\x02\x3f\x09\xc8\x26\x01\x95\xa4\xcc\xda\x0a\xbd\xb6\xc3\x62\xeb\x2b\x61\x04\x29\x58\x46\x0a\x2c\x52\xb0\x9c\x14\xac\x20\x05\x2b\x49\xc1\x2a\x52\x70\x1d\x09\xb8\x99\x14\xdc\x42\x0a\x6e\x25\x05\x6b\xf4\x7e\x48\x78\x8e\x14\x3c\x4f\x0a\x5e\x24\x05\x1f\x91\x82\x4f\x48\xc1\x01\xbd\x4f\x02\xab\x49\xe0\x10\xbd\x57\x12\x87\x91\xc4\x56\x52\x38\x82\x14\x1e\x4b\x0a\x8f\x23\x85\xe7\x92\xc2\x59\x7a\x0f\x05\x6e\xd2\xfb\x28\xf0\x20\x29\x8c\x90\x62\xa0\xf7\x54\xb2\x7e\xa4\xd8\x04\x52\x6c\x81\xde\x5f\xc7\x1a\x09\xf6\x24\x09\xf6\x14\x09\xf6\x0c\x09\xb6\x8b\x14\xdb\x4d\x8a\xed\xd5\x7b\x2d\x78\x09\x29\x5e\x4a\x8a\x97\x93\xe2\x15\xa4\x78\x15\x29\x1e\x24\xc5\x6b\x48\xf1\x01\xa4\x78\x2d\x29\x3e\x88\x14\x6f\x20\xc5\x9b\xba\xc8\x86\xe4\x97\x90\xe4\x97\x92\x84\x16\x48\x84\x56\x48\x85\x56\x2d\x1b\x7e\xb2\x21\x9b\x6c\xe8\x0b\x41\xa8\x74\xec\x3c\x04\x60\x18\x04\x60\x38\x04\x62\x72\xb2\x8c\x24\x58\x24\x61\x39\x49\x58\x41\x12\x56\x92\x84\x55\x24\xf5\xaa\xdd\x0b\x01\x78\x8e\x24\x3c\x4f\x12\x5e\x74\x6c\xb6\x8e\x53\x02\x38\x0c\x02\x78\x1c\x49\x3c\x97\x24\xce\x22\x89\x9b\x48\xe2\x41\x1d\x07\x38\x31\x80\xe3\xff\x03\xcc\x07\xad\x2c\x0d\x5a\x59\x3f\x92\x6c\x02\x49\xb6\x80\x24\xdb\x45\x92\xed\x26\xc9\xf6\x92\xe4\x25\x24\x79\x29\x49\x5e\x4e\x92\x57\x90\xe4\x55\x24\x79\x90\x24\xaf\x21\xc9\x07\x90\xe4\xb5\x24\xf9\x20\x92\xbc\x81\x24\x6f\x72\xec\x29\x04\xf8\x25\x10\xe0\x97\x42\x40\xcf\xd2\xd5\x80\xee\x16\xef\x68\xd6\xed\x8b\x2d\x99\x8a\x59\x29\x63\xa1\xe2\x24\xff\xe8\x96\x28\x6a\x85\x8e\x64\x75\xfe\x09\x8b\xd3\x65\x96\x5d\x75\xfc\x5f\xd1\xed\x5e\xdf\x32\xfd\x76\xbc\x97\x0d\xa9\x64\x1f\xc5\x7b\x85\x60\x18\x89\x6f\xc8\x7b\xa9\xa3\x78\x2f\xf1\x25\xbc\x97\xc0\x08\x09\x06\x24\x8c\xf7\xb2\x59\x9a\x8e\x54\xfe\x77\x7a\xaf\x23\x59\x5b\x69\xac\xad\xfc\x12\xd6\x56\xfe\x9f\xb1\xb6\x4d\xe0\xa7\x06\xc8\xa6\x06\x8d\x64\xab\xe3\xfc\xfd\x08\x92\x47\x41\xa5\xf3\xb4\x1c\xdf\x4b\xaa\x0b\xa2\x34\xb2\x1a\x8b\x0f\x5a\x49\xe2\x08\x92\x78\x2c\xc9\x2e\x28\xd0\x41\x6e\x3f\x35\x71\x43\x14\x61\x39\xa8\x2a\x0e\xf5\x7c\x65\x64\x12\x1f\x5f\x7c\x1d\x32\xf0\x7f\xc7\xe3\xa6\x38\xb1\x5e\x2c\xb6\x8b\xc6\x74\x47\x88\xe7\xb0\x0f\x24\x42\x07\xa4\x42\x87\xf6\xcd\x59\x5d\xfc\xb3\xd5\x03\x9f\x0d\xd1\x5e\x20\x00\xa3\xc9\x82\x76\xb2\xe0\x04\xb2\xe0\x44\xb2\x60\x0c\xd9\xd0\x41\x21\x38\x8d\x42\x30\x8e\x2c\x38\x9d\x42\x30\x9e\x2c\x38\x83\x42\x70\x26\x59\x30\x81\x42\x70\x36\x09\x98\x48\x02\x26\x91\x80\x73\x48\xc0\x64\x12\xb0\x8c\x2c\xb0\xc8\x82\xe5\x64\xc1\x0a\xb2\x60\x25\x59\xb0\x8a\x2c\x23\x91\x47\xc6\x7d\xf7\x93\x05\x0f\x90\x05\x0f\x92\x05\xff\x4d\x16\x6c\x24\x0b\x7e\x44\x16\x3c\x44\x16\x3c\x4c\x16\x6c\x22\x0b\x1e\x21\x0b\x42\x64\xc1\x8f\xc9\x82\x27\x28\x04\x9b\xc9\x82\x2d\x64\xc1\x56\xb2\xe0\x49\xb2\x60\x1b\x59\xf0\x34\x59\xf0\x53\x0a\xc1\x76\x0a\xc1\x33\x14\x82\x67\x29\x04\x3b\x48\x80\x20\x01\xcf\x91\x05\x3f\x27\x0b\x9e\x27\x0b\x5e\x20\x0b\x5e\x24\x0b\x5e\x22\x4b\xe3\xcb\x5f\x90\x05\x3b\xc9\x82\x57\xc9\xd2\x58\xf3\x75\xb2\x40\x92\x05\x6f\x92\x05\xbb\xc8\x82\xdd\x64\xc1\x5e\xb2\x7a\x60\xd0\x24\x0a\x61\x32\x85\x30\x95\x42\x1a\x8f\xfa\xc9\xc2\x6c\xb2\x34\x2e\xcd\x21\x0b\x7b\x69\x2e\xc6\xc2\xde\xa4\xb0\x84\x2c\x2c\x25\x0b\xcb\x48\x61\x39\x59\xd8\x97\x14\x56\x90\x85\x95\x10\xc0\x6a\x08\x60\x0b\x09\x1c\x4a\x02\x47\x92\xc0\xe3\xc8\xc2\xd1\x64\xe1\x18\xb2\xf0\x5c\xb2\x34\x7e\x9d\x45\x96\x8b\x61\x21\x80\x57\x91\x85\x57\x53\x08\x17\x93\x85\x4b\x48\xe0\x32\xb2\x70\x39\x85\xf0\x06\x12\x78\x13\x59\x78\x33\x59\x78\x2b\x59\xb8\x86\x04\xde\x46\x16\xae\x23\x81\xeb\xc9\xc2\x3b\xc9\xc2\xbb\xc9\xc2\xfb\x48\xe1\x26\xed\x69\x0c\x16\x86\x00\xbe\x42\x16\xbe\x4e\x16\xfe\x8e\x2c\xdc\x4d\x16\xee\x21\x81\x7b\x49\xe0\x3e\xb2\x50\x91\x85\x7f\x26\x0b\x3f\x26\x0b\x0f\x91\x40\x22\xc1\x90\x04\xe3\x24\x98\x87\x42\x2c\xc1\xf1\x4c\xd0\xc1\xd2\xa0\x83\xf5\x23\x8b\x4d\x20\x8b\x9d\x4d\x96\xc6\xd3\x53\xc9\x62\xb3\xc9\xd2\x98\x7a\x2e\x09\xb6\x80\x2c\x8d\xad\xaf\x25\x8b\x2d\x25\xc1\x2c\x83\xb3\x57\x90\xa5\xb1\xf6\x2a\xb2\x34\xde\xbe\x9e\x2c\x8d\xb9\x6f\x34\xb8\x7b\x35\x59\xec\x61\x08\xb0\x4d\x24\x34\xfe\x7e\x9c\x2c\x8d\xc1\x37\x93\xc5\xb6\x40\x80\x6d\x75\x74\x11\x02\x6c\x9b\xa3\x8f\x10\x60\x4f\x3b\x3a\x09\x01\xb6\x8b\x2c\xf6\x16\x59\x6c\x37\x59\x6c\x0f\x59\x6c\x2f\x59\xec\x6d\xed\x01\x3b\xb1\xfa\x27\x64\x69\xbc\x7e\x80\x2c\x07\xb3\xb3\x30\x59\xec\x33\x12\xec\x20\x09\x16\x21\xc1\x53\xc9\xe2\xe9\x64\xf1\x4c\x12\x3c\xcb\x60\xfa\x3c\xb2\x78\x3e\x04\x78\x01\x09\x8d\xed\x8b\x34\x5f\x63\xf1\x3e\x64\xf1\x52\xb2\x78\x39\x59\xbc\x2f\x59\xbc\x82\x2c\x5e\x49\x16\xaf\x22\x8b\x57\x93\xc5\x83\x64\xf1\x7e\x64\xf1\x1a\xb2\x78\x7f\xb2\xf8\x00\xb2\xf8\x40\xb2\x78\x2d\x59\xbc\x8e\x2c\x3e\x88\x2c\x5e\x4f\x16\x6f\x20\x8b\x37\x92\xc5\x9b\xc8\xe2\x83\xc9\xe2\x43\xc8\xe2\xc7\x90\xc5\x87\x91\xc5\x87\x93\xc5\xdb\xc8\xe2\x23\xc9\xe2\xa3\xc8\xe2\xa3\xc9\xd2\xdc\xc2\x18\xb2\x34\xbf\x70\x32\x59\x9a\x63\x18\x4b\x96\xe6\x19\x3a\xc8\xd2\x5c\xc3\x38\xb2\x34\xdf\x30\x9e\x2c\xcd\x39\x9c\x49\x96\xe6\x1d\x26\x90\xa5\xb9\x87\x89\x64\x69\xfe\xe1\x1c\xb2\x34\x07\x31\x85\x2c\xcd\x43\x4c\x25\x8b\x4f\xa3\x10\x9f\x4e\x21\x3e\x83\x42\x7c\x26\x85\xf8\x6c\x0a\xf1\x8b\x28\xc4\x2f\xa6\x10\x9f\x4f\x82\x2f\x20\xc1\x17\x92\x80\x72\xf0\x93\x84\x6c\x92\xda\xba\x1f\xcd\x8b\xc7\x59\xeb\x2e\x16\x78\x93\xf6\x3b\x9d\x96\x36\xde\xaa\x7e\x45\x8b\x0a\xbf\xef\x62\x0f\x3b\x6d\xa1\xe8\x11\xf3\x8e\x26\xd1\x8d\x0f\x16\xd0\x41\x12\x4e\x33\xbc\xf0\xe9\x24\x35\x37\x7c\x06\x49\x38\x93\x24\x4c\xd0\x1e\x58\x80\x45\x02\x96\x93\x80\x15\x24\x60\x25\x09\x58\x45\x02\xae\x23\xeb\xa8\x31\xf4\xfd\x24\xe0\x01\x12\xf0\x20\x09\xf8\x6f\x12\xb0\x91\x04\xfc\x88\xc4\x11\x79\xe3\x27\x48\x1e\x91\x3b\xfe\x29\x49\xd8\x4e\x12\x9e\x21\x09\xcf\xea\x55\x15\xf0\x73\x12\xf0\x3c\x09\x78\x81\x04\xbc\x48\x02\x5e\x22\xa1\xe3\xf6\x78\x4e\xd9\x89\xe1\x8f\xc4\x2b\x77\x8f\xed\x93\x48\x62\x32\x49\x4c\x35\x71\x7e\x94\x6b\x76\xe2\xfd\x1c\x12\x3a\xe6\xcf\x25\x81\x25\x24\xb1\x94\x24\x96\x93\xc4\x0a\x1d\x55\x08\x1c\x4d\x02\xc7\x68\x2c\x27\x34\x2e\x98\xa5\xb9\x38\xa9\x79\xe6\xab\x49\x6a\xae\x79\x19\x09\x5c\x4e\xb2\x0b\xcf\x7c\x9b\xb6\x59\x9d\xfc\xf2\x26\x12\x51\x3c\x81\xaf\x90\xe8\xc2\x1d\xc7\x73\xc6\x1f\x6b\xbc\x11\xb5\x45\x82\x4d\x20\xc1\xce\x26\xa1\xb1\x47\x94\x27\xbe\x48\xe3\x45\xa1\x71\xc8\xb5\xda\xfe\x48\xcd\x11\x3b\x78\x64\x95\xe6\xfb\xa4\xe6\x8a\xa3\xb8\x64\xb5\xb6\x39\x52\xf3\xc4\x0e\x3e\xd9\xac\x7d\xbd\x60\x6f\x91\x60\xbb\x49\xb0\x3d\x24\xd8\x5e\x12\x9a\x0b\x8e\xc7\x2e\x9f\x68\x1e\x50\x6a\x5e\xf8\x6f\x24\x59\x58\xdb\x12\x97\xfb\x75\xf0\x4c\x9e\xb6\x1d\x52\xf3\xbd\x25\x24\x78\x1f\x12\xbc\x94\x04\x2f\x27\xc1\xfb\x92\xe0\x15\x24\x78\x25\x09\x5e\x45\x82\x57\x93\xe0\x41\x12\xbc\x1f\x09\x5e\x43\x82\xf7\x27\xc1\x07\x90\xe0\x03\x49\xf0\x5a\x12\xbc\x8e\x04\x1f\x44\x82\xd7\x93\xe0\x0d\x24\x78\x23\x09\xde\x44\x82\x0f\x26\xf1\x85\xbc\xb0\x83\xa9\xc6\x68\x6e\x52\x6a\x5e\xd8\xc1\x56\x63\x35\x47\x29\x35\x3f\xec\x60\xac\x71\x9a\xab\x94\x9a\x27\x76\xb0\xd6\x99\x9a\xb3\x94\x9a\x2f\x76\x30\xd7\x44\xcd\x5d\x4a\xcd\x1b\x3b\xd8\x6b\x8a\xe6\x30\xa5\xe6\x8f\xa7\x91\xe4\xd3\x49\xf2\x19\x24\xf9\x4c\x92\x7c\x36\x49\x7e\x11\x49\x7e\x31\x49\xf8\x10\x12\x61\x3a\xa4\xc2\x74\xf0\x53\x08\xb2\x29\xa4\x99\x84\xee\x58\x6d\x34\x49\x68\x27\x09\x27\x90\x84\x13\x49\xc2\x18\x52\xd0\x41\x0a\x4e\x23\x05\xe3\x48\xc2\xe9\xa4\x60\x3c\x49\x38\x83\x94\xd1\x4e\x05\x93\xb5\xfd\x39\x12\xfb\x10\x3a\x2a\xd6\xbb\x9f\x24\x3c\x40\x12\x1e\x24\x09\xff\x4d\x12\x36\x92\x84\x1f\x91\x84\x87\x48\xc2\xc3\x24\x61\x13\x49\x78\x84\x24\x84\x48\xc2\x8f\x49\xc2\x13\xa4\x60\x33\x49\xd8\x42\x12\xb6\x92\x84\x27\x49\xc2\x36\x92\xf0\x34\x49\xf8\x29\x29\xd8\x4e\x0a\x9e\x21\x05\xcf\xea\x98\x5c\xc2\xcf\x0d\xeb\xf1\x82\xcb\x7c\xc0\x4b\x1a\x59\x2b\xf8\x05\x49\xd8\x49\x12\x5e\xd5\x28\x5b\xc1\xeb\x24\x41\x92\x84\x37\x49\xc2\x2e\x92\xb0\x9b\x24\xec\xd5\xe8\xbb\x2b\xde\x4c\x22\x85\xc9\xa4\x30\xd5\x60\x4f\x3f\x49\xcc\xd6\x88\x5c\x61\x8e\x46\xe5\x0a\x73\x49\xf6\xd0\xd0\x91\xda\xf6\x4a\x1c\x4d\xd2\x68\xa9\xd4\x58\x74\x96\x46\xf0\x0a\xaf\x22\x89\x57\x93\xc2\xc5\x24\x71\x19\x49\x5c\x4e\x0a\x6f\x22\x89\x37\x93\xc4\x5b\x49\xe2\x6d\x24\x71\x3d\x49\xbc\x93\x24\xde\x6d\x98\x9a\x28\x7e\x7d\x85\x24\xbe\x4e\x12\x7f\x47\x12\x77\x93\xc4\x7d\x24\x51\x91\xc4\x3f\x93\x34\x5a\x3a\x9d\xa5\xc1\xf4\x18\x83\x73\x36\x49\x8d\x6b\xa7\x92\x64\xb3\x35\x53\xa0\x34\xab\xe3\xe0\xdb\x6b\x35\x63\xa0\xd8\x0a\xcd\x1a\x28\xb6\x4a\x33\x07\x8a\x5d\xaf\xd9\x03\x17\xef\xae\xd6\x0c\x82\x62\x8f\x6b\x16\x41\xb1\xcd\x86\x11\x7a\xcb\xb0\x42\x7b\x5c\x66\x88\xbd\xad\x19\x86\x4e\xfc\xfb\x89\x66\x19\x14\x3b\xa0\x99\x06\xc5\xc2\x24\x79\x2a\x49\x9e\xae\x59\x07\xc5\xf3\x34\xf3\xa0\x78\x91\x61\x95\xfa\xc4\x31\x4b\x7d\x0d\xbb\x54\x69\x18\xa6\x6a\xc3\x32\xf5\x33\x4c\x53\x7f\xc3\x36\x0d\x34\x8c\x53\x9d\x61\x9d\xea\x0d\xf3\xd4\x68\xd8\xa7\xc1\x24\xf9\x10\x92\xfc\x18\x92\x7c\x18\x49\x3e\x9c\x24\x6f\x23\xc9\x47\x92\xe4\xa3\x48\xf2\xd1\x9a\xf9\x50\x7c\x8c\x66\x3f\x14\x3f\x59\x33\x20\x8a\x8f\xd5\x2c\x88\xe2\x1d\x9a\x09\x51\x7c\x9c\x66\x43\x14\x1f\xaf\x19\x11\xc5\xcf\xd4\xac\x88\xe2\x13\x34\x33\xa2\xf8\x44\xcd\x8e\x28\x7e\x8e\x66\x48\x14\x9f\xa2\x59\x12\xc5\xa7\x92\xe4\xd3\x48\xf1\xe9\xa4\xf8\x0c\x52\x7c\x26\x29\x3e\x9b\x14\xbf\x88\x14\xbf\x98\x14\xdc\x70\x44\xae\xa8\x9d\x14\x9c\x40\x0a\x4e\xd4\x9a\xe8\x68\xa1\x3a\xaa\xef\x7b\x88\x14\x3c\x4c\x0a\x36\x91\x82\x47\x48\x41\x88\x14\xfc\x58\x6b\x8f\x82\x2d\xa4\x60\x2b\x29\x78\x92\x14\x6c\x23\x05\x4f\x6b\x56\xcd\xf1\x5b\x0a\x76\x92\x82\x57\x35\x82\x75\xfc\x96\x02\x49\x0a\xde\x24\x05\xbb\x48\xc1\x6e\x52\xb0\x57\xb3\x30\x3d\x39\x29\x3f\x29\xcc\xd6\x6c\x8c\xe3\xab\x94\xf1\x55\x2a\xc6\x51\x5d\xa5\xa5\x5b\xe1\x32\x2d\xd9\x0a\x6f\x26\x85\xb7\x92\xc2\xdb\x48\xe1\x7a\x52\x78\x27\x29\xbc\x5b\x33\x76\xae\xef\x79\x9d\x14\xfe\x8e\x14\xee\x26\x85\xfb\x48\xa1\x22\x85\x7f\xee\xc2\xe4\x39\x7e\x46\xb1\xd9\x9a\x9d\x91\xc6\xc7\x28\xe3\x63\x94\xf1\x31\xca\xf8\x18\x15\xe7\x63\x94\xf1\x31\xca\xf8\x18\xc5\xde\xd6\x8c\x5f\xbc\x3f\x51\xc6\x9f\x28\xe3\x4f\x14\x4f\x25\xc5\xd3\x35\x7b\xe3\xf8\x13\x65\xfc\x89\xe2\x43\x48\xf1\x63\x48\xf1\x61\xa4\xf8\x70\x52\xbc\x8d\x14\x1f\x49\x8a\x8f\x22\xc5\x47\x6b\x86\xc7\xb1\xf9\xca\xd8\x7c\x65\x6c\xbe\x32\x36\x5f\x19\x9b\xaf\x8c\xcd\x57\xc6\xe6\x2b\x63\xf3\x95\xb1\xf9\xca\xd8\x7c\x65\x6c\xbe\x32\x36\x5f\xa1\xf7\x08\x91\x97\xdd\x43\x82\x86\x68\xfb\x6e\x43\x3b\xd9\x70\x02\xd9\x70\x22\xd9\x06\x81\x0a\x38\x8d\x04\x8c\x23\x1b\x4e\xd7\x99\x79\x1b\xce\x20\x01\x67\x52\x08\x26\x68\xe4\x29\xe1\x1c\x6d\xe7\x1d\xe4\x69\x83\x45\x36\x2c\x27\x1b\x56\x90\x0d\x2b\xc9\x86\x55\x64\x1b\xe4\x79\xb4\x48\xcc\x86\x07\xc8\x86\x07\xc9\x86\xff\x26\x1b\x36\x92\x0d\x3f\x22\x1b\x1e\x22\x1b\x1e\x26\x1b\x36\x91\x0d\x8f\x90\x0d\x21\xb2\xe1\xc7\x64\xc3\x13\x3a\x8b\x6f\xc3\x16\xb2\x61\x2b\xd9\xf0\x24\xd9\xb0\x8d\x6c\x78\x9a\x6c\xf8\x29\x09\xd8\x4e\x02\x9e\x21\x01\xcf\x92\x80\x1d\xa4\x40\x68\x7b\x6f\xc3\xcf\xc9\x86\xe7\xc9\x86\x17\xc8\x86\x17\xc9\x86\x97\x34\x77\xe8\x48\xb6\x0d\x3b\xc9\x86\x57\xc9\x36\x92\x6d\x83\x24\x1b\xde\x24\x1b\x76\x91\x0d\xbb\xc9\x86\xbd\x64\x1f\x26\x22\x13\x98\x4c\x02\x53\x75\x26\xd4\x91\x72\x1b\xb3\xc9\x36\x52\x6e\x1b\x29\xb7\x0d\xf2\x0c\x61\x29\x85\x0c\xf2\x0c\x19\xe4\x19\xc2\xa1\xa4\x0c\xda\xb4\x71\x34\xd9\x38\x46\x73\x40\xb6\x89\xd2\x6c\xa3\x1d\x36\x5e\xad\x2b\x02\x6c\x5c\xa2\xb5\xc4\xc6\xe5\x24\xf0\x06\xad\x2d\x36\xde\x4c\x36\xde\x4a\x36\xde\x46\x36\xae\x27\x1b\xef\x24\x1b\xef\x26\xdb\x20\x4c\x3b\x2e\x62\xb3\xf1\x75\xb2\xf1\x77\x64\xe3\x6e\xb2\x71\xaf\xd6\x1e\x1b\x15\xd9\xf8\x67\xb2\xf1\x63\x0a\x31\xae\xb5\x28\x1a\xb9\xd9\x6c\x02\xd9\xec\x6c\xcd\x75\x3a\x1a\x65\xb3\xd9\x64\x6b\x8d\x9a\xab\xfd\x82\x6d\x34\xcb\x66\x4b\x49\x31\x2b\xa6\x61\xb6\xd1\x30\xdb\x68\x98\xad\x35\xec\x46\xed\x23\x1c\x2d\xb3\x8d\x96\xd9\x46\xcb\x6c\xb6\x8d\x14\x7b\x5a\xe3\x0c\x9b\xbd\x45\x36\xdb\x4d\x36\xdb\x43\x36\xdb\x4b\x36\x7b\x5b\x67\x75\xe3\x35\xd0\x36\x1a\x68\x1b\x0d\xb4\xd9\x67\xa4\xd8\x41\x52\x2c\xa2\xb5\xd1\xe6\xe9\x64\xf3\x4c\x52\x3c\x2b\xa6\x95\xb6\xd1\x4a\x9b\x97\x90\xcd\xfb\x90\xcd\x4b\xc9\xe6\xe5\x64\xf3\xbe\x64\xf3\x0a\xb2\x79\x25\xd9\xbc\x8a\x6c\x5e\x4d\x36\x0f\x92\xcd\xfb\x91\xcd\x6b\xc8\xe6\xfd\xc9\xe6\x03\xc8\xe6\x03\xc9\xe6\xb5\x64\xf3\x3a\xb2\xf9\x20\xb2\x79\x3d\xd9\xbc\x81\x6c\xde\x48\x36\x6f\x22\x9b\x0f\x26\x9b\x0f\x21\x9b\x1f\x43\x36\x1f\x46\x36\x1f\x4e\x36\x6f\x23\x9b\x8f\x24\x9b\x8f\x22\x9b\x8f\x26\xdb\x68\xbc\x6d\x34\xde\x36\x1a\x6f\x1b\x8d\xb7\x8d\xc6\xdb\x46\xe3\x6d\xa3\xf1\xb6\xd1\x78\xdb\x68\xbc\x6d\x34\xde\x36\x1a\x6f\x1b\x8d\xb7\xf9\x34\x12\x7c\x3a\x09\x3e\x83\x04\x9f\x49\x82\xcf\x26\xc1\x2f\x22\xc1\x2f\x26\xc1\xe7\x93\xe2\x0b\x48\xf1\x85\xdd\xf2\x0e\x5f\x67\x76\x45\x7e\xab\xb2\x2b\x08\xa9\x24\xc1\x13\xcd\x97\x45\xf3\x55\x50\x19\x8b\x77\xcf\x86\x80\xa9\x30\x0a\xc0\x0e\x08\x80\x80\x80\xae\xd4\x19\x0a\x01\x5c\x02\x01\xbc\x01\x02\xb8\x06\x02\xb8\x0e\x02\xb8\x07\x02\xb8\x17\x02\xba\x1a\x86\x20\xa0\xab\x60\xb8\xce\x82\xb9\x31\xd4\x5c\x08\xb0\xa5\x10\x60\x16\x04\xd8\x8d\x10\x60\x9b\x20\xc0\xb6\x42\x80\x6d\x83\x00\x7b\x1a\x02\xec\x33\x08\xb0\x83\x10\x60\x11\x08\xf0\x4c\x08\xf0\x2c\x08\xf0\x02\x08\xf0\xf9\x10\xe0\x0b\x20\xc0\x17\x42\x00\x12\x62\xfb\x32\x46\x3f\x59\xaf\x9d\x9e\x87\xd0\xf3\xd0\xff\x16\xfb\x3e\xd7\xf6\x77\xb2\xb6\x21\x0a\x4a\x62\xb3\x1a\x4d\x4a\x47\xe7\xf7\x93\x82\x07\x48\xc1\x83\xa4\xe0\xbf\x49\xc1\x46\x52\xf0\x23\x52\xf0\x73\x52\xf0\x02\x29\x78\x89\x14\x8e\xd6\x51\xa2\x8a\xcd\xe2\x6c\x52\xec\x2d\x52\x6c\x0f\x29\xde\x87\x14\xef\x4b\x8a\x57\x92\xe2\xd5\xa4\x78\x3f\x52\xbc\x3f\x29\x3e\x90\x14\xaf\x23\xc5\xeb\x49\xf1\x46\x52\xdc\x91\x9b\x84\x98\xaf\x39\x4b\x8f\x5c\xdb\x90\xb8\xef\x9e\x14\xf7\xdd\xc1\xb1\x59\x8e\x33\xf1\xfc\x11\xe2\xf6\x58\x0c\x9d\xa3\x6d\xa9\x3c\x6a\xdc\xfb\x3b\x37\xbe\x8d\x49\x5c\x34\x86\xbd\x56\xdb\x24\xa9\xe3\xd5\xeb\xb5\xfd\x91\x3a\x3e\xdd\x6c\xe2\xd0\x4f\xb4\x2d\x91\x5d\x62\xce\x3c\x6d\x2b\xa4\x8e\xf5\x4e\xd6\x3a\x2a\x75\x7c\x37\x4e\xeb\xa5\xd4\x31\xdd\x04\xad\x8b\x52\xc7\x71\x53\xb4\xfe\x49\x3d\x5f\x37\x37\x7b\x52\x67\x7e\x14\xea\x75\x54\xf6\xd0\x91\x23\xac\x58\x84\x94\xa3\x31\xc2\xd1\xa3\xa0\xdf\xb9\x51\x4f\x2c\xc2\xb9\x56\xc7\xe4\x4a\x47\x34\xd7\xeb\x18\x5c\xe9\x08\x26\x1a\xbd\x7c\xa2\xe3\x6a\xd5\x25\x52\xc9\xd3\xb1\xb4\xd2\xd1\xc7\xc9\x3a\x86\x55\x3a\xe2\x18\xa7\xe3\x56\xa5\xa3\x8c\x09\x3a\x56\x55\x3a\xb2\x98\xa2\xe3\x53\x05\x1c\x2f\x21\x89\x57\x92\xc4\x35\x8e\xfc\xc5\xea\x5d\xae\x24\x01\x6b\x62\x35\x2a\x19\x64\x81\x1f\x46\x41\x1f\x18\x05\x7d\x35\xcf\xe3\xda\x98\x5a\x38\xe7\xa8\x75\x2b\x23\x60\x28\x9c\x44\x0a\xce\x22\x05\x67\x93\x84\x89\xa4\xe0\x1c\xcd\xf1\xc8\xaf\x9c\x15\xdc\x41\x12\x84\x41\x74\x87\xb1\x59\xf0\x29\x9c\xf3\xa5\xeb\x5b\x5a\x74\xce\xc2\xc6\xa1\x3a\x6f\x61\x63\x2b\x0c\xc5\x11\x30\x14\x8f\x85\xa1\x5d\xb2\x86\x4b\x48\xe2\x0d\xce\xda\x90\xc4\x75\x24\xf1\x01\x38\xa7\x4b\x26\x71\x0f\x49\xdc\x4b\x52\xd7\xc3\x1c\xd2\x79\x0d\x89\xa4\x73\x1b\x92\xa1\xce\x6f\xd8\x8c\x3b\x12\x7c\x98\xfa\x98\xb9\x06\x85\x2d\x25\xc9\x2c\x83\xc4\xe2\x6d\xe8\x8d\x3a\x86\x75\x33\x8e\x9b\x0c\x0a\x8b\x66\x1d\xb7\x92\xd4\x99\xc7\x6d\x24\x75\xf6\xf1\x69\x5d\x75\x74\xd8\x0c\x24\xfb\x8c\x24\x3b\x48\x92\x45\x48\xf2\x4c\x92\x3c\xcb\x20\xb0\x7c\xb2\x78\x81\x41\x61\x5f\x77\x66\x72\xbe\xce\xb5\xd8\x7c\x81\xce\xb7\xd8\x7c\x21\x49\xb8\xf9\x0b\xa5\xe9\x9f\x91\xa4\xaf\x59\x8a\xbe\x93\xa0\x6f\xb1\x04\xdd\x12\x27\x41\x8b\xe2\x24\x48\x7e\x25\x7b\x74\x16\xbd\x07\x67\xd3\x1b\x30\x91\xde\x83\x73\x68\xd7\x3f\x21\x41\xbb\x40\xd0\xae\xaf\xc9\x0e\xbd\x67\xa4\x68\xd7\x17\x48\xd1\x2e\xbc\x81\xde\xc0\x35\xf4\x06\xae\xa3\x37\x0e\x23\x45\x6f\xe0\x5e\xda\x65\xa4\xe8\x3d\x23\x45\xef\x19\x29\x7a\xcf\x48\xd1\xae\x23\x48\xd1\x2e\x23\x45\xbb\x98\x45\xbb\x0e\x23\x45\xbb\xe2\xa4\xe8\x8d\x6e\x52\xf4\x86\x91\xa2\x5d\x46\x8a\x76\x1d\x45\x8a\x76\xb1\x83\xb4\x8b\x45\x68\x17\xcf\xa4\x5d\x3c\x8b\x76\xc5\x49\xd1\x1b\xdf\x90\x14\xed\x32\x52\xb4\xcb\x48\xd1\x2e\x58\x0b\x89\x34\x1d\x52\x69\xfa\x77\x52\xf4\x4f\x4a\x51\x12\x4d\xd7\x92\x94\x4a\xd3\xb5\x34\x95\x75\xab\x9d\xf9\xbf\x26\x51\x9d\xd8\x2b\xcb\x48\x51\x54\x7a\x96\x1b\xfc\x75\x83\xa9\xab\xf8\x22\x1c\xf6\x29\xb4\xc6\x76\x3d\xba\x73\x0f\x40\xeb\xb7\x02\x7b\x35\x1f\x71\x96\xce\x0c\x6f\xfc\x5f\x3e\xbb\x3e\x47\xcd\xac\xfe\x3b\xb2\xaa\xe3\x21\x9d\x64\x8f\x2a\x9e\x5a\x0a\xbb\x15\x25\x47\xa8\xe6\x19\x49\x12\xa6\xea\x88\xfa\x6b\xa9\xec\x82\x4f\x29\xac\xf9\xad\x32\x52\x9a\xd3\xfa\xaa\x55\x3e\xf7\x39\x7b\x4a\xe1\x6f\x55\xb5\xcf\xc8\x2e\xd9\xf3\x7a\x5d\xe9\xa5\x34\xa6\x3e\xda\xaa\x1d\x09\x6b\x3f\x67\xf0\xf6\xf3\x06\x73\xbf\x68\x70\x77\xf7\x55\x19\xdd\x55\x4e\x34\x26\x8f\xce\xfe\xec\x38\x79\x79\xcb\xcc\x78\x4f\x9c\xdc\xf4\x89\x9b\x75\x5f\x33\xf3\x4a\x33\xfb\x6a\xb3\x02\xfd\xcc\x2a\xf4\x37\x2b\x31\xd0\xac\x46\x9d\x59\x91\x7a\xb3\x2a\x8d\x66\x65\x1c\x6f\x31\x50\xa3\xf7\x14\x12\x1a\xc1\xa7\x43\x2b\x64\x98\x8a\xe3\xac\x23\xf0\xc9\xb5\xb4\x1d\xea\x75\x75\x53\x27\xaf\xdc\x02\x55\x30\x14\x82\xba\x2a\x79\x24\xb4\xf6\xe0\x99\x4f\xa2\xf7\xbe\x14\xd7\x1c\x8d\xe3\xe3\x39\xe7\xa9\xd0\xfa\x7f\x8d\x77\x86\x4f\x69\xfb\xd7\xc2\x3d\x57\x42\x15\x56\x43\x95\xae\xf8\x76\xf0\xc9\x97\xe1\xa2\x2f\x81\xaa\xa3\xf0\xd1\xb2\x0b\x1f\xbd\x46\x73\x34\xb6\xc6\x31\xdd\x79\xe9\x07\x68\x7b\x17\x6e\x7a\x3b\x54\xf5\xe0\xa7\x5d\xac\xd3\x83\xa3\xd6\x55\xe8\x1a\xfb\x40\xc0\xc5\x3e\x10\xd0\xd8\xe7\xdf\xc5\x5d\x3f\x0c\x55\x06\x1f\x75\xe5\xb0\xb7\x40\x95\x8b\x93\xa0\x4a\xf3\xd9\x4f\x41\x95\xe6\xb4\x9f\x81\xaa\x6f\x94\xd7\xce\x87\x2a\x83\xab\xbe\xe3\xb7\xa3\xfc\x36\x83\x44\x5a\xaf\xd9\x5f\x1e\xfd\x8a\xa5\x91\x04\x2f\x24\xd2\x5c\x48\xa5\xb9\x70\x12\xed\xea\xc2\x9e\x3a\xbf\xb1\x1d\x52\x69\x3b\x9c\x1b\xe3\xf0\xfc\xb4\x1d\xb2\x69\x3b\xf4\xa5\xc7\xa1\x9d\xc2\x70\x02\x85\xe1\x44\x0a\xc3\x49\x10\x80\x31\x14\x86\x71\x14\x86\xf1\x14\x86\xb3\xc0\x0b\x0f\x51\x18\x1e\xa6\x30\x6c\xa2\x30\x3c\x42\x61\x08\x51\x18\x7e\x4c\x61\xd8\x4c\x61\xd8\x42\x61\xd8\x4a\x61\x78\x92\xc2\xb0\x8d\xc2\xf0\x34\x85\xe1\x17\x14\x86\x9d\x14\x86\x57\x29\x0c\xaf\x53\x18\x24\x85\xe1\x4d\x0a\xc3\x2e\x0a\xc3\x6e\x0a\xc3\x5e\x0a\xa3\x9f\xc2\x98\x4d\x61\xcc\xa1\x30\xe6\x52\x18\xaf\xa2\x30\x2e\xa6\x30\x2e\xa3\x30\xde\x44\x61\xbc\x99\xc2\x78\x2b\x85\xf1\x36\x0a\xe3\x7a\x0a\xe3\x9d\x14\xc6\xbb\x29\x8c\xaf\x53\x18\x7f\x47\x61\xdc\x4d\x61\xdc\x47\x61\x54\x14\xc6\x3f\x53\x58\xf3\x91\xc9\x74\xa3\x3e\xb3\x91\x4e\x37\xb2\x2c\xba\x96\xe5\x42\x2a\x9b\x4a\x61\x36\x9b\xc2\xec\x5a\x0a\xb3\x15\x14\x66\xab\x28\xcc\xae\xa7\x30\x5b\x4d\x61\xf6\x38\x85\xd9\x66\x0a\xb3\xb7\x29\xcc\x3e\xa1\x30\x3b\x40\x61\x16\xa6\x30\x4f\xa5\x30\x4f\xa7\x30\xcf\xa3\x30\x2f\xa2\x30\x1f\x42\x61\x7e\x0c\x85\xf9\x30\x0a\xf3\xe1\x14\xe6\x6d\x14\xe6\x23\x29\xcc\x47\x51\x98\x8f\xa6\x30\x1f\x43\x61\x7e\x32\x85\xf9\x58\x0a\xf3\x0e\x0a\xf3\x71\x14\xe6\xe3\x29\xcc\xcf\xa4\x30\x9f\x40\x61\x3e\x91\xc2\xfc\x1c\x0a\xf3\x29\x14\xe6\x53\x29\x0c\x89\x3d\x76\x21\x9e\x51\x9d\xd6\xe3\x3c\x5c\x2d\xec\xff\xee\x4c\xdc\x7f\xf0\x54\x41\x67\xf6\x21\x1d\x56\x43\x5f\xb8\x1f\x46\xc2\xfd\x70\x3c\x74\xc0\xf7\xa0\x03\x4e\x86\x56\x38\x05\x5a\x61\x2c\x74\xc0\xa9\xd0\x01\x53\x61\x2b\x3c\x0a\x61\x78\x0c\x76\xc2\x4f\x60\x27\x7c\x08\x1d\xf0\x47\xb8\x1f\xfe\x84\xc9\xf0\x67\xd8\x09\x7f\x81\x30\xfc\x15\x82\xf0\x77\x68\x85\x7f\xc0\x7e\xf8\x1c\x3a\x20\x02\x1d\x08\xd0\x81\x0c\x3a\xd0\x03\x1d\xe8\x85\x0e\xe6\x83\xd5\x2c\x0d\x56\x03\x42\x2d\x4c\x87\x63\x7a\x64\xb5\x6a\xa1\xe3\xff\xc9\x73\x43\x23\x63\x33\xad\x87\x80\x89\xf8\x65\xdc\x89\x39\x37\xe2\x3f\x5b\xb3\x9e\x6e\x04\x6f\x22\x92\x2e\xd1\x7a\x85\x8e\xd8\x25\x56\xeb\xb3\xba\x6e\xc4\x3e\x54\x9f\x4c\x90\x9a\xe7\x77\xbc\xfb\x0d\xa4\x70\x0d\x29\x5c\x47\x4a\x7b\xee\xed\x24\x71\x0f\x29\xed\x99\xbb\x47\xeb\x3c\x6e\x55\xe6\x6a\x44\xef\x7a\xd6\x1b\xb5\xcc\x4a\xb6\x49\xcb\xab\x64\x5b\x75\xd5\xbc\x74\xbd\x24\x49\xd7\x4b\x92\xec\xe2\xed\xa2\x5e\x2e\x9f\x24\x2f\x30\x11\xfa\x7c\x7d\x82\x41\x6a\x2b\x7f\x29\x49\xc7\xd2\x63\xf1\x11\x6a\x1c\xbe\xab\xb4\xff\xae\xd2\xfe\xeb\xaf\xb4\xff\xae\xc2\xfe\xbb\x0a\xfb\x85\x24\x8c\xd5\x39\x3c\x32\x9e\x78\x14\x64\xac\x7a\x20\xe3\x7f\x05\x11\x7f\x87\x84\xbf\x5e\x24\xfc\xaf\x23\xe0\x2f\xae\xc8\xfa\x32\xc8\xf7\x8b\x2a\xb3\xfc\x9a\x19\xfb\x66\x11\xee\xe1\xd0\xed\x7f\x02\xd9\x7e\x87\x6a\x3b\x51\xed\xcf\xe3\x38\xf5\x9e\x79\xf0\x21\x24\x35\xea\x39\x5c\x35\xb0\xcb\x9d\xc9\xaf\x9c\x03\xff\xaa\x95\xc2\xf1\xf9\xf2\xae\x15\xc3\xea\x28\x15\xc3\x3d\x63\xee\xce\x8a\x61\xd5\xa5\x62\xb8\x37\x49\x2c\x23\x89\x7d\x49\xf6\x40\x5d\x2d\x3a\x7a\xed\xac\x40\x8b\x56\x15\x2f\xd1\x75\xf3\xca\xf0\x53\x9d\x75\x35\x2e\x3f\xa5\x0c\x3f\xd5\x59\x5f\x73\x5f\x5c\xfd\x7c\x7c\xa5\x71\x34\xf7\x1e\x57\x71\x8c\x87\x74\xce\x4b\x32\xd4\xd1\xaf\xec\x82\x09\xa6\x1a\x24\x37\xbb\x5b\xfe\xfd\xda\x6e\x39\xf8\x15\x06\x33\xac\x32\xb8\xe1\xfa\x6e\xf9\xf8\xd5\xa4\x62\xf9\xf8\xc7\x0d\x96\xd8\x4c\x4a\x73\x4d\xdb\x74\xf4\x2c\x4d\x95\x72\x7c\x3d\xbd\x32\xf5\xf4\xca\xd4\xd3\x77\xcd\xcb\x47\xeb\x80\xe2\xf3\xf3\x79\xa4\x62\xf9\xf9\x2f\x57\xbd\xac\x4c\xf5\xb2\x32\xd5\xcb\xca\x54\x2f\x2b\x53\xbd\xac\x4c\xf5\xb2\x32\xd5\xcb\xca\x54\x2f\x2b\x53\xbd\xac\x4c\xf5\xb2\x32\xd5\xcb\xca\x54\x2f\xeb\x5a\xa3\xa3\x22\xcf\xf9\x1a\x05\x48\x9d\xe7\x6f\xf8\x46\xaa\xab\xd2\x20\xf0\x1f\xa9\xb0\xca\x84\xe3\x75\xf5\xd8\x74\xf8\x1e\xb4\xc6\xe1\xe6\x56\x38\x15\x5a\xe1\x2c\x5d\xb3\x38\x1d\x26\xc2\x74\x98\x04\x41\x38\x07\xa6\xc3\x64\x08\xf2\xf9\x30\x9d\x2f\x80\xe9\x7c\x21\x4c\xff\xd2\x4f\xe8\x88\x7b\x42\xa0\xcb\x13\x52\x70\x1a\x04\xdd\x33\x28\x10\x8c\xb1\x17\x0b\xc8\xc6\x4b\x49\xe2\x65\xba\x02\xcc\xc6\xeb\x20\xe8\xc4\xdc\xc0\x63\x1a\x77\x29\x29\x48\xd1\x59\x8c\xe9\xa4\xf0\x42\x52\x78\x11\x29\x9c\x6f\x72\x3d\x0b\x48\xe2\x42\x92\x78\x05\x29\x5d\x41\x76\x1d\x29\xe8\xab\x2d\x99\x13\xe9\x3b\x7e\x76\x5a\xdc\xf9\x34\xe7\x4d\x97\x9b\xea\xe7\xef\x1b\x7f\xbb\xc8\xf8\xdc\xa5\x14\xd2\x3e\xd7\xd2\xa7\x61\x04\xae\x20\x89\x2b\x49\xe0\x2a\x12\x78\xbd\x46\x05\xae\x0f\xbe\xc5\xf8\xe1\xb5\x1a\x19\x84\xb4\xa6\xdf\xae\xd1\x41\x08\x6d\x5d\x39\x68\xe3\x5d\xfa\x6c\x5b\x88\x79\x48\xb0\x04\x3d\x1b\x77\xac\x6e\x4d\x5b\xbe\x3e\x7d\xb3\x48\x9f\x91\x93\xda\x92\x2c\x25\x89\x16\x29\xf3\x4e\xa9\x57\xc1\xb1\x2c\x37\x9a\x53\x39\xab\x49\xe1\x2d\x5a\xb6\xa4\xc6\xcd\x6b\x4d\xa5\xa2\x83\x9f\x6f\x37\x96\xc6\x36\x55\x8b\x77\xb9\x95\x8b\x70\xca\xff\xba\xee\x4e\x9d\xb2\x20\xb4\x2c\xac\xd1\xb9\xbb\xa3\x32\x5a\xdf\x18\xf3\x94\xfb\xa5\x3a\x31\xb9\xd2\x28\x8d\x34\x2a\x5c\x40\x0a\x17\x92\x32\xd2\x18\xe3\x38\x18\xeb\xd6\x89\x69\x5e\xac\x77\x49\x7c\xde\xeb\xcb\xf4\x31\x99\x4b\x36\x2c\xfa\x82\x33\x6e\xdf\x64\x3f\x13\x07\x4b\x4f\x33\xfb\xe6\x46\xaf\x8e\x86\x86\x8c\x56\x59\xf8\xfd\x6e\xb8\x7a\x29\xd9\x06\x5b\x8b\x2e\xda\x14\xc5\xd9\xab\xf5\xc9\x50\x47\xab\x3a\xf1\xf6\xda\x38\xcc\xed\x6a\x96\x8d\x77\x40\x10\x6d\x7d\x6a\xd4\x32\xda\x65\xf7\xe8\xa1\xe2\x21\xdb\x3d\xb1\xde\xb5\x97\xca\x37\x26\x23\x8f\x7d\x77\x06\xf9\x5b\x72\x06\x79\x1a\x04\x62\xe7\xbe\xa2\xd5\xc3\x9d\x5e\x45\xe8\x33\xc9\x8e\x4d\x5d\x7d\xf4\x33\xc4\xff\x67\xcf\xea\x26\xc5\x7b\x5b\xed\x5d\x1c\xaf\xe2\xea\x9c\xf6\x28\x30\xfa\x5b\xdb\xdf\x67\x1a\x49\x6d\x87\x67\x1d\x21\x32\xb8\x52\x57\xb6\x1e\xb6\x02\xe4\x6b\xa9\xec\x48\xe8\xb2\x76\x4b\x49\x39\x92\x06\xfd\xbe\xf1\x1e\x5c\x8e\xd5\x5d\xe3\xee\x52\xfc\x19\xc5\xaf\xdc\x47\xeb\xd5\x58\x9c\xd0\x69\xbd\xbe\x38\x5e\xf8\xfa\x2d\xda\x57\xf3\x67\xff\x19\x2b\xa7\xba\x59\x39\x75\x14\x2b\xd7\xfd\x1c\x77\xbc\x95\x53\x71\x56\x4e\x1d\xd5\xca\x7d\x99\x18\x2a\xde\x12\x1e\x3d\x9e\x92\x47\x8c\xa7\xba\x5a\x43\xa5\x3b\x2a\x9c\xa7\x35\xe4\x3f\x69\x11\x95\xb1\x88\xca\x58\x44\x65\x2c\xa2\x32\x16\x51\x19\x8b\xa8\x8c\x45\x54\xc6\x22\x2a\x63\x11\x95\xb1\x88\xca\x58\x44\x65\x2c\xa2\xd2\x16\xd1\x99\xdf\x34\xdd\x89\x55\x69\xcb\x78\x81\x3e\x23\x2d\xb5\xcf\x9f\xa9\xbb\xb2\x2a\x6d\x25\xe7\xe8\xf3\xd2\x52\xfb\xff\x8b\xbb\x75\x68\xed\xc4\x29\x8e\xd6\x7f\x7b\xad\xe4\xd1\x2c\x64\x14\x3b\x7d\x93\x56\x72\xf0\xbf\xbd\xe3\xd9\x34\x0a\x69\xc4\x38\x8b\x42\x3a\x26\xbf\x52\x5b\x67\x07\x21\xea\xd3\x5e\xf1\x5d\xd0\xfe\xa5\xae\x67\xc1\x7f\x83\xa5\xd7\x88\xf0\x5f\xb2\xf2\x1f\xfe\x47\xfb\x87\xb9\xa8\x45\x7e\x97\xdd\xfc\x86\xb2\x9b\xd3\x4c\x2f\xec\xf8\x0c\xe7\xa5\x24\xf0\x72\x1d\xfb\x76\xa2\xb2\x45\x5d\x90\x59\x28\x96\xf5\x5c\x49\x21\x5c\x45\x21\xbc\x0e\x02\x78\x7d\xb7\x2c\x68\x57\x64\x16\x8a\x43\x66\x21\x9d\x11\xbd\x03\x5a\xd1\xa6\x90\x41\x66\x21\x9d\x1d\xed\xd9\x4b\xcc\xfe\xa2\x5e\x62\xdf\x65\x00\x49\xc0\x00\xa3\x9d\x42\x6b\x67\x4f\x06\xcb\x36\xf6\x40\xc4\xb1\x58\x21\xcd\x62\x5d\x43\xca\x30\x4a\x36\x5e\xab\x19\x25\x07\x77\x87\x0e\xcb\x66\xb9\xbb\x2c\x0c\xbb\xd4\x95\xd5\x72\xd9\x25\x11\xab\xb1\x8c\x32\x5b\x9d\xf8\xbb\x27\xbb\x95\xac\xbb\xcb\x74\xc6\xe1\x32\xc6\x76\x2d\x24\x81\x57\x18\x0c\xe6\x78\xb6\xdc\x38\x9b\x26\x34\x97\xee\x8e\xdb\xe5\xd4\x97\x6a\x06\x4c\xe1\x4a\xed\x4d\x03\x9a\x51\xbd\x25\x8e\x57\x5f\x6b\xb8\xf5\xae\x8c\x97\x32\x8c\x97\x82\xd4\x68\xa7\x21\xdd\x93\x6a\x9a\xe1\xfc\x96\xc6\x4e\xf7\xf6\xe0\x65\x63\xbc\x9c\x46\x09\xd0\xff\x1b\xef\x0e\x7c\xa9\xa9\x7f\x59\x6a\x66\xb8\xa6\x6b\xc5\xcf\x57\xae\xd8\xf9\xe8\x5b\x99\x31\x9e\x4b\xc2\x58\xfb\xef\x32\xc7\xdf\x44\xe6\xf8\xcb\xdb\x03\x11\xb3\x07\xae\xd4\xd9\x5d\x18\xee\xae\x7c\x9c\x8a\xd9\x83\xd5\x5a\x63\xe2\x6d\x82\x3c\x8c\x4d\xb0\x0f\x63\x13\xec\x2f\x93\x51\xfe\x2e\xeb\x4a\x0a\x50\xe3\x05\xaf\xce\x04\x44\x6d\xdf\x4d\x9d\xd9\x23\x5d\xa1\xd4\x69\x1d\x97\xf4\xb0\x8e\xc1\x58\xe6\x71\x75\x0f\x2b\xe9\x58\x48\x85\x77\x68\x0b\xa9\x8c\x85\x74\xde\xe8\x58\xb0\x94\xf8\x5e\x02\xfa\x99\xab\x21\xa8\xf3\x56\xd1\x8e\x14\xeb\xe3\x2a\x62\x99\x61\xb0\x65\xe7\xef\xe9\x11\x2f\x35\x79\x89\x68\x4e\xe2\x36\x37\xf7\x10\xfb\xbd\x22\xbc\x8a\x42\xf8\xfd\x58\x96\x43\x98\x2c\x87\xd0\xbd\xc6\x5c\xf9\x93\xb1\x6c\xc7\xaa\xb8\x19\xdd\x68\xba\x05\xae\x26\x81\xb7\x44\x6f\xa6\x89\x71\xc2\x51\x3e\x58\x18\xb9\x13\x46\xee\x04\x64\x46\xe3\x5b\x93\x5b\xe9\xcc\xd2\xba\x6f\xe9\x7c\xc3\x6a\x73\x12\xda\x19\xf3\x1d\x9d\xd2\x0a\xbe\xa8\xf5\x37\x7b\xe2\x66\x65\x4c\xf7\xa8\x58\x77\x8c\xb4\x2e\xeb\x17\xdd\x9b\x15\x3a\x42\x6f\x8d\x7b\xbe\x70\x56\x2d\xb6\x1e\x89\x5d\x7e\x6b\x35\x04\x9c\x15\x8f\xfd\x2b\x87\x3e\xd0\xaa\xc7\xeb\xc8\x44\x42\x7c\x05\x79\x6c\xfd\x3d\xee\x7c\x74\xf7\x90\xa0\xb3\x57\x90\xd8\xe5\xe7\xa2\x7d\x45\x56\xeb\xde\x22\x41\x48\x8f\xef\x91\x01\x8b\x20\xa8\x7f\xc2\xd9\x37\xf7\xde\x1f\xa9\x7f\xf2\x16\xe3\x17\xd7\xc4\xf5\xd1\xf0\x74\x79\xae\x23\x33\x39\xf1\xcf\xd2\xab\xf3\xfd\x68\xee\x4a\x3f\xd3\xed\x20\xb7\x22\x26\x13\x6e\x27\x8d\xb5\xc6\xdf\xae\x83\xa0\xf1\xd8\xda\x5b\x1f\xe1\x3d\x4b\x20\x00\xd9\x5a\xe6\x17\x99\xae\x74\x4b\x8c\x9c\xad\x30\xf9\x30\x57\xd6\x65\x0f\x59\x8f\xe6\xc0\xe2\x64\x5d\xfb\xf6\x21\x3d\xce\x0a\xd6\x42\xeb\xd7\x72\x2a\x32\x9a\xc7\x7f\xf6\x3f\x5c\xaf\xdb\x0a\x89\x8e\xe7\x27\x81\xf7\x90\x85\x1b\xc9\xd2\x37\xc4\x6c\x27\x0b\x9f\x21\x89\x3b\x48\xa1\x20\x81\xcf\xc7\x2a\x11\x15\xee\x27\x85\xef\x90\xc0\xf7\x29\xc4\x7c\x24\x58\x9a\xae\x2c\x54\xfa\x26\x99\x6b\x48\xb0\x45\x24\xd8\x12\x12\xba\xb6\x67\x99\xae\x30\x74\xeb\x6c\xdd\x5b\x66\x2c\x5d\x41\xe8\x9e\x90\x15\xe6\x84\xac\x32\x27\x64\x95\xb9\x75\xc6\x62\x3b\x48\xb0\x9f\x91\x60\x82\x04\x7b\x8e\x84\xbe\x85\xe6\x37\x24\x98\x24\xc1\x3e\x20\xc9\xfe\x61\x6a\x72\x3f\xd7\x95\x03\x8a\x1d\xd2\xd5\x03\x8a\x11\x09\x0e\x24\x62\x37\xd5\x64\x90\xd0\xb5\x3b\x7e\x5d\x39\x18\x3d\x51\x2b\xe0\x7f\x62\xd2\xe8\xc4\x38\xdf\xe6\xde\xff\xf7\x92\xd2\x37\x67\x6d\x22\x4b\xdf\x98\xb5\x45\xd7\x8b\x4a\x23\x3b\x42\xd7\x8b\xee\x24\x89\xbf\x24\x81\xaf\x92\xc0\xd7\x68\xa2\xae\x1f\xfd\x15\x09\xfc\x35\x09\xfc\x1f\x12\xf8\x06\x09\xfc\x0d\x09\x94\x34\x11\x7f\x4b\x02\xdf\xd4\xdd\x51\x2d\xdc\x45\x02\xdf\xd2\x5d\x52\xbb\xd6\x99\xee\x27\x81\x6f\x93\xd0\xbb\xfc\x2e\x09\x7c\x4f\xef\xb6\xc0\x0f\x48\xe0\xef\x49\xe0\x87\x24\xf0\x0f\x24\xf0\x8f\xba\x12\xcc\xc2\x8f\x74\x77\x55\x4b\x9f\x81\xfa\x04\x5a\xf1\x00\x4d\xc4\xbf\x91\xc0\xbf\x93\xc0\x7f\x90\xc0\xcf\x75\x0e\xb6\xdb\x5d\x05\xc6\xbf\x9f\x1b\xab\x45\xb1\xd8\x1c\xd3\x7d\x35\x5a\xa7\xba\x28\xd6\x85\x35\xbe\x56\x55\x9a\x5a\x55\x69\x6a\x55\xa5\xa9\x55\x95\xa6\x56\x55\xea\x5a\xd5\xf5\x24\xd8\x5d\x24\xd8\x7d\x24\xd8\x83\x24\xd8\x46\x12\x5a\xf2\x42\x24\xd8\xa3\x24\xd8\x63\xb1\xae\xad\x96\xa9\x24\x73\x25\x72\x1b\x09\x5d\xbb\xba\xdd\x48\xa0\x23\x7d\xcf\x93\x60\x2f\x50\x88\xbd\x48\xf3\xd8\x4b\x14\x62\x3b\x49\xe8\x9b\xbe\x5e\xa7\x89\xec\xd7\x24\xd8\x1b\x46\x32\xdf\xd4\xe7\x3e\x8f\x54\xef\xea\x56\x9d\xfd\x9e\x04\xfb\x88\x04\xfb\x58\xd7\xbe\x4a\x53\xfb\x2a\x4d\xed\xab\xec\x51\xfb\xea\x48\x33\x23\xc1\x93\x48\xf0\x64\x12\x3c\x85\x26\xea\x7a\xd8\x34\x9a\xd8\xa5\x26\x36\x9b\x2c\x1e\xa0\x89\xbc\x57\xac\x7b\xac\x65\x6a\x63\xa5\xae\x8d\x2d\x26\x8b\xf7\xa6\x89\xdf\xe8\x29\x0b\xd7\xf3\xdd\x1b\xab\x52\x92\x8e\x75\xd3\x9d\x3d\xdf\x89\xab\x40\x72\x2c\xdc\x22\x53\x71\x74\x34\x2b\xf7\x33\x92\xec\x39\x92\x4c\x76\xeb\xc8\x19\xb5\x78\x60\xaa\x83\x0a\x49\x41\x82\xae\x60\xdc\xa3\x2b\xf9\x25\xdb\xaa\x2b\xf3\x25\x14\x68\xed\x89\x9e\xd6\x7b\x87\x24\xbe\xaf\xab\x9d\xdc\xf7\xc7\x9f\x01\x30\xbf\x15\xeb\xf6\x16\x7d\xf7\x0b\x24\xd9\x4b\x66\x0c\xf1\x75\x81\xa0\x3b\x88\xb8\x35\x81\xce\x9b\x9a\xbf\x31\xd4\x77\x6f\xdc\xb9\x8e\xff\x94\x8f\x68\x8c\x56\x1a\x68\xff\xf0\x10\x49\x73\x8b\x98\x32\x7e\x42\x19\x3f\x11\x32\x7e\x42\x9a\xb5\x16\xb1\x2c\xba\xeb\x1b\x42\x7a\xdd\x97\x50\x88\x2d\xa3\x50\x9c\x3f\x90\x5d\x3a\xb9\x38\xbe\xa0\xd3\x0f\x84\xf4\x5e\x08\x0a\xe9\xfd\x70\x6f\x23\x53\xec\x37\x14\xd2\x7b\xe2\xfa\x02\xc7\x0f\x38\x3e\xc0\xb1\xff\x21\xbd\x37\x9d\xf6\x3f\xc4\xfd\x14\xe2\xd9\x71\x5d\x5e\x8a\x49\xc1\xa0\xd8\x8c\xa2\x5e\xcf\x9d\x95\x8a\x79\xbe\xf8\xd9\xb8\x1e\x4f\xe1\xfb\xba\x7f\x4d\x74\x46\xca\xcc\x48\xc5\xcd\x48\x1d\x65\x46\x2a\x6e\x46\xca\xcc\x48\xb1\x57\x62\xb3\x51\xec\x03\x52\xda\xb3\x39\x5e\xcd\xf1\x68\xee\x6c\x14\x4f\x24\xc5\x7d\xa4\x62\xb3\x31\x33\x81\x62\xbc\x47\xef\x89\x1d\x1b\x69\xa7\x9c\x0b\xfc\xf4\x1b\x92\xf5\x39\xdf\x18\x57\xed\x58\x8e\x07\x21\x88\x5b\x20\x18\xab\x42\x7e\x96\x42\xb8\x93\x14\xbe\x06\x81\x2e\xfd\x82\x3b\x6b\x1e\xa5\x89\x46\x62\xfd\x83\xbb\x74\x5b\x9d\x6d\x6e\x15\x9a\x4b\x32\xce\x9f\xc8\xb8\x3a\x47\x69\xfa\x06\x4b\xd3\x37\x58\x9a\xbe\xc1\xd2\xd4\x39\xba\x7d\xd9\x3a\xcf\xd5\x4a\xe3\x2f\x64\x97\x3a\xc7\xa8\xaf\x78\x0d\x82\xda\x17\xbc\xdd\xed\xa6\xa2\x4f\xcc\x6d\x45\x6e\x1f\x61\xdd\xd3\xad\x4b\xdd\x23\xe8\x73\x0e\x6e\x8f\xb7\x68\xed\x63\x36\x04\x8d\x2d\x97\x71\xe7\x68\x25\x2f\x86\xe0\x57\xe6\xee\x2f\x88\x61\x9b\xce\x68\x62\x1e\x6e\x21\xdb\xd4\x7a\x07\xf1\x59\x92\xf8\x3c\x04\xf0\x17\xfa\x8c\x7f\x08\x7f\x49\x12\x5f\x25\x69\x22\x8a\x10\xfe\x9a\x24\xfe\x0f\x49\x7c\x83\x24\xfe\x86\xa4\x89\x26\x24\xbe\xa9\x77\x25\x84\xbb\x48\xe2\x5b\x7a\x77\x42\xb8\x8f\x42\xf8\xb6\xb1\x03\xef\x92\xc4\xf7\x48\xe2\x07\x24\xf1\xf7\x24\xf1\x0f\x24\xf1\x8f\x66\xb7\x3e\xd2\x3b\x16\xc2\x8f\x49\xe2\x27\xd0\x81\x07\x68\x1e\xfe\x8d\x24\xfe\x9d\x24\xfe\x83\x24\x7e\x1e\x57\x6b\x31\x9b\x42\x6c\x8e\xee\xcd\x6e\x69\x99\xbe\x96\x42\x6c\x05\x85\xd8\x2a\x0a\xb1\xeb\x29\xc4\x56\x53\x88\xad\x27\xc9\xee\x22\xc9\x1e\x24\xc9\x36\x3a\xf6\x05\x82\x2c\x44\x92\x3d\x4a\x92\x3d\xa6\x77\x2f\xc4\x36\x53\x88\x6d\xd1\xf7\x78\x06\xd9\x53\x10\x64\xcf\x40\x30\xa6\x03\xcf\x6b\xfb\x62\x1b\xcf\x2e\xd9\x1b\x46\x1f\xde\xd4\xdd\xa2\x1d\xcf\x1e\x32\x9e\x3d\x64\x3c\x7b\x88\x7d\x44\x92\x7d\xac\x77\x38\xc4\x0e\x50\x88\x85\x8d\x0d\x62\xba\x9a\x35\xc4\xd3\xb5\xfd\xb1\x8d\x77\x76\x76\x33\xc4\xf3\xf5\x3d\x9e\x21\x5e\x4c\xb6\xe3\x95\x61\xd5\xff\x8a\x3a\xbb\x7b\xa2\xf1\x28\xb4\x6a\x9b\xf9\x68\x4c\x57\x3b\x4f\x8f\x3e\x1b\xb3\x9d\x36\x4a\x08\x1a\x6f\xe0\xc6\x8f\x1f\x42\x10\x0f\x40\xf0\x4b\x9d\x30\x75\x6d\xab\xd0\x7e\x2e\x6a\x5f\x8f\x74\xe2\xf4\x48\x3d\xc1\xa2\x27\x4f\x5d\x9b\x2b\x8c\xcd\x8d\xc6\x72\x42\xc7\x72\x8e\xbe\xbe\x0e\x41\x63\x83\xc5\x61\xfb\xf3\xb8\x76\x58\x74\x7a\x13\x08\xf2\x80\xd6\xcd\xae\xbd\xc3\x1c\xbd\xec\xad\x75\xf3\x9b\x89\xb1\xfa\xe1\x3d\x1a\x9b\xc9\x6e\xd8\x4c\xe2\xaf\x4c\x9c\xe3\xda\xfe\x28\x0e\x93\x1a\x87\x2d\xd3\x51\x70\xf4\x9c\xa3\x34\xe7\x1c\xa5\x3e\xe7\xf8\x14\x49\xb6\xdd\x9c\x71\x74\x31\x97\x34\x98\x4b\xb2\x9d\xda\x33\x09\x2d\xff\xbf\xef\xe1\x99\x84\x96\xf1\x24\x52\x3c\x59\x7b\x26\xa1\x31\x56\xbe\x89\xbc\x4a\xbf\x54\xe5\xa3\xeb\x6f\x55\x34\x82\xd0\xd9\xd4\xcb\x35\x52\xec\x79\x87\x91\xeb\x3f\x5d\x7f\xe9\xfa\xc9\x98\xd7\x8f\xf9\xc7\xfc\x6e\x15\x92\xab\xe3\x51\xde\x11\x91\x54\x14\x45\x7d\xcb\x11\x54\x9c\x1d\xfc\x0e\x29\xfd\x1b\x90\x12\x8c\xd4\xda\xf6\x00\x84\x75\x4c\xb2\x91\x24\x6e\x82\xc0\x61\x6c\x9e\x8b\x72\x84\xe3\x3d\x1d\x6f\x09\x41\x6d\xf7\x1c\x4d\x74\xec\xdd\x5f\x61\xba\x63\xf3\xdc\xfb\x0a\x20\xc0\xae\xd1\x71\x88\x34\x76\x4d\xb2\x65\x87\xe9\x77\x78\x93\xd1\xd6\x4e\x9b\xd6\xa9\xad\xae\xa6\x4a\xa3\xa9\xae\xd7\x7a\xd1\xf1\x5a\x31\x3b\xe6\x7a\xac\x5d\x10\x60\xbb\x21\xc0\xf6\x42\xe0\x08\x36\x4d\x6a\x0d\xce\x20\xc9\xfd\x26\xd6\xe8\xb4\x69\x5d\xec\x99\x13\x2d\x1b\xe6\x31\xeb\x88\x51\x9a\xd0\x2c\x44\xa7\xc5\x0f\xe9\x59\x47\xef\xe1\xbc\x48\xcf\x3a\x74\xc4\xbb\x1d\x37\xc5\xdd\xef\xb8\x55\xcf\xce\xb1\xd4\x21\xf6\x02\x09\xf6\x22\xd9\xec\x25\x13\x59\xbd\xae\xa3\xab\xd0\x61\xef\x80\x84\x2e\x96\xb9\x33\x62\x8a\xce\xa2\x32\x86\x50\x7f\x42\xca\xdc\x81\x2c\xb5\xed\x79\x56\xdb\x1f\xc7\x6f\x29\x7c\x9e\x14\xbe\x14\xc7\xc9\x5d\xa3\xf7\x49\xb1\x65\xa4\xd8\x0f\xcd\xbe\xf4\xdc\x0f\x27\x9e\x57\xfa\x9e\xe4\xdf\x90\x62\x1f\x92\x62\x7f\x24\xc5\xfe\xde\xd5\x4e\x31\xd2\x96\x52\x71\x3f\x29\x73\x87\xb2\xd4\x77\x28\x8f\xe9\xc6\x32\x7e\x13\x51\x75\xeb\x61\xa2\x6a\x69\x24\x35\xa4\xa3\xe7\x03\x5d\xab\x43\xbe\x70\xcf\xa2\xfb\x15\xdd\xab\xaf\xba\x3f\x71\x7b\xf3\x95\xa3\xd9\xf1\xdf\xca\x1a\x29\xc7\x5e\x3c\x48\xd2\xb5\x15\xa4\xf0\x51\xed\xe3\xa4\xee\x1f\xb6\x43\xcb\xd6\x11\xeb\xa3\x74\x17\xad\xce\xbb\xb8\xbb\xf6\x13\x73\xd1\xb0\xcb\x82\xc6\xf5\x15\xeb\x72\x27\xf7\xd7\xd5\x63\xec\xb8\xb8\xee\x26\xff\xbe\x5a\xab\x07\xcd\xcd\x92\x8f\x92\x6d\x30\x89\xc2\xd7\x9c\x08\xd2\xb1\x23\xfa\xfe\x75\x15\x77\xa7\x6f\xe7\xad\x93\x6e\xac\xde\xf5\xf6\xc9\x14\x0a\xf1\xb4\x58\xcc\x1d\x8d\xb1\xff\xb5\xfa\xac\x91\xdf\xf8\xad\xd7\xf7\x76\xde\x88\xab\xad\xe9\x3b\xda\xe3\x77\xd7\x46\xf1\x25\xb4\xd1\xf5\xc4\x2f\xc6\xe2\xd9\xc3\x69\xa2\xf8\x67\x6f\xcc\xc5\x8e\xef\xee\x90\xfc\x7f\xac\xf6\xeb\x5e\xd3\xed\xd0\xd5\x41\x2b\xa6\x83\xf1\x5d\x29\x1c\x89\x7c\xde\x74\xa7\xe8\x8c\x93\xe7\xf5\x88\x93\xdd\x18\x79\xde\x3f\x1d\x23\x47\xe3\x63\x37\x36\x16\x3a\x36\xfe\x13\x04\xe3\xe2\x63\xcb\xf0\x04\x56\x8f\x0c\xc3\x57\xed\x88\xe1\xc6\xd0\xa2\x5b\x0c\xfd\xcf\x75\xc6\x38\x5c\x0c\x1d\xed\x96\xd1\x35\x8e\xfe\x72\x9d\x33\xb6\x9b\xee\x19\x5d\xe3\x6a\x47\xab\x2d\x1d\x0b\xb9\x71\xb5\x63\xfb\xe6\x7d\x85\xb8\xda\xed\xb8\xd1\x35\xae\xfe\xe2\xee\x1b\x3d\xe3\x6a\xcb\xc4\xd5\x56\xb7\xb8\xda\xb1\xb7\xf3\x4c\x5c\x7d\xf8\x0e\x1d\xae\x2d\x9e\xf7\x5d\x9d\x1e\x09\x38\xaf\x67\x54\xad\x35\xd0\x36\xe8\xd4\x8e\x65\x50\x9e\x87\xa0\x61\xe4\xe2\x35\xaf\x3b\x32\x8d\xd7\x3a\x3b\x4e\xeb\x84\x61\xe3\xbe\x48\xd3\x84\xd1\x32\x81\x1f\x93\x30\x28\xb4\x87\x96\xc5\xbc\xf0\x6c\xb2\xb5\x06\x2d\x20\x5b\x6b\xce\xb5\x64\xeb\x0e\x0e\xab\xc8\xd6\x9d\x1b\x56\x93\x1d\xd3\x8a\xa8\x46\xc4\x6b\xc2\xe3\x64\xeb\xee\x0d\xf1\x12\xfe\x62\xcc\xa3\x1f\x4e\xaa\x6d\xc3\xbe\xd9\x86\x7d\x73\xbb\x39\x44\x25\xf9\x13\xb2\x75\x17\x87\x30\xd9\x31\x89\x75\x25\xd5\x36\x92\x6a\x77\x91\xd0\x3c\xb2\x75\xf7\x06\x23\x91\x86\x5b\x71\xa3\x37\x81\x0f\xe9\xce\x3c\x12\x1f\xd5\x59\x01\x61\xd0\x82\xd0\x28\xe1\x79\x12\xf8\x92\xe6\x45\x9d\x55\x17\x78\x40\xaf\x82\x64\x97\x93\x60\xf7\x92\x60\x3f\x3c\x6c\x04\x27\x4c\x04\x27\x34\x4a\x78\x5d\xcf\xc8\xbd\x79\x6e\xaf\xce\x63\x08\xf6\x21\x49\xf6\x47\x92\xec\xef\x3a\xaa\x13\xdc\xa7\x75\x4a\xf2\x80\xe6\x55\x84\x83\x14\x78\x6f\x12\x30\xb0\x4b\xa6\xcd\x89\xec\xbb\x62\x52\x69\x38\x38\xd5\x25\x86\x70\x39\x35\x15\xc7\xa9\xb9\x98\xe6\x68\x39\xa4\x1d\x3a\x3b\x20\x34\xb6\x89\x72\xdb\x0e\xbe\x39\x32\x4f\xa6\x0c\x4f\x66\x30\x8e\xc1\x93\x06\x4b\x42\x5d\x0c\x4d\xc7\x23\xe9\xed\x51\x04\x06\x01\x3d\x6a\x17\x41\x07\x7a\x20\x68\x17\x3d\x2b\xc3\x6b\xb9\xa3\x3f\xcc\x4d\xd7\x66\xd4\xd2\x8c\xda\xcd\x6b\xbc\x68\x72\x1b\x2e\x46\x09\x98\x59\x74\x45\xc9\x64\x72\x1d\xf1\xa3\x0f\x40\x40\xb3\x4a\x2e\x4e\x09\xc0\x70\xbc\x47\xf7\x7a\xde\xaf\xd7\x7d\x13\x04\xbb\xcc\xe2\x19\xcd\xa2\x77\xce\x44\x63\x49\x08\xe0\x6b\xd0\x8a\xbf\x86\x80\x41\xc7\xb1\x4c\x64\xb7\xd9\x05\x7b\xcc\xee\x87\x10\xd0\x33\xdc\x64\x66\xb9\xf5\x0b\x66\xda\xc9\x01\x44\x67\x17\x64\xbb\x21\xc8\xf6\x42\x90\x7d\x08\x01\xf6\x47\x08\xb0\xbf\x43\x80\xfd\x03\x82\xec\x73\x08\xb2\x43\x10\x3c\xc2\xac\x83\x7a\xd6\x05\x71\x1c\x40\xef\x6e\x75\x22\xf3\x74\xc6\x6c\x3b\x59\x71\xf5\x21\xd2\x64\xc8\xdc\x9a\x90\x6b\x4c\x1d\xc8\x32\xc7\x17\x1e\x21\x2b\x16\xad\xf5\x10\x24\x34\xd7\x48\x5a\x7a\xa2\x5c\xa2\x9b\xe5\xea\x73\xd8\x5c\xdd\xe1\xdf\xec\xe6\xe6\xbe\xea\x9b\x5f\xd0\x5c\xf0\x91\x47\x50\xde\x05\xd9\x3d\x14\x67\x17\x5c\x26\x41\xc4\x98\x84\x1d\x3a\x2f\x22\xf1\x40\x9c\x3d\xe8\xce\x18\xb8\xb6\x40\x1a\x5b\x20\xd8\xeb\x46\xff\xbb\x32\x9a\x51\xfd\x17\x3c\x10\x63\x0a\x04\xef\x6d\xb2\x7e\xf1\xa3\x51\x66\x34\x32\xc6\x6b\x44\x47\xf2\x5a\x97\xd1\xb8\xd8\xf2\xa7\xb1\x2c\xaa\x34\x6f\x96\xdd\xde\xec\xe2\x49\xd7\xf2\x48\x63\x75\x24\xe4\x43\x6a\x2c\xeb\x16\xcb\x86\xe2\xa7\xa6\xa7\xcf\xa2\x6e\x3d\xf5\x7a\xe6\x18\x95\xce\x76\x4a\xdd\xed\x23\x3e\xb7\xa8\xba\xe4\x16\x4b\xf5\x98\x7f\x15\x97\xdf\xdb\xaf\xd9\xa4\xf8\xb7\x49\xf3\x36\x37\x7f\x77\x23\x49\x76\x5f\x67\xde\x3f\x96\x8f\xdb\xae\xb1\x90\xfb\xd6\x9d\x9a\x13\x53\xec\xf7\x3d\x72\x6e\x8a\x27\x91\xe4\xc9\x71\x39\x37\x67\x14\x7d\x63\x75\x8a\xbf\x8a\xeb\xae\xd2\x7d\x24\x51\x4f\x78\xf8\x11\xa9\xc3\x8c\x48\xc5\x8d\x48\x99\x11\xa9\xc3\x8c\xc8\xe5\xd4\xe3\x47\x94\x68\xd0\xb0\xad\x7b\xbb\x1c\xd0\x3e\xd2\xf1\x65\x8e\xef\xb2\x21\x13\x5f\xd1\x56\x26\x18\x9f\x7b\xc7\xbf\xc2\x55\xda\x9a\x6c\x8a\x71\x6a\x9d\xf5\x14\x6f\x41\x80\xed\x81\x80\xd6\x7c\xe7\xf9\x69\x7a\x77\x7f\x65\x3a\x28\xee\x27\x65\xd6\xd4\xb5\x39\xdb\x75\x36\x40\x3a\xeb\x17\x5b\xaf\x02\xdd\x6b\x3e\xea\x89\x3a\x33\xb3\xb1\x7a\x8f\x1e\xd9\xd8\xd9\x86\xf9\x3c\xda\xad\x57\xf1\x63\xec\x7e\x03\x16\xf4\xbc\x05\x0b\x8a\x63\x3b\xf5\x6b\xbd\x53\x2a\xae\x42\x4d\xea\x0c\x78\xe7\x2e\x1d\x2e\x13\xee\xce\xaf\x7b\x26\xfc\xe8\x19\x70\x05\xa5\xb1\x79\xef\x3c\xcc\x2d\xb6\xff\xae\xb9\x97\x75\xa9\x7d\x74\xf6\xce\x59\x03\x19\x57\xf1\xb2\x5f\xeb\xbe\x8a\x55\x02\xc4\xcf\xbd\xab\xce\xb8\xf3\x8f\xee\xf3\xeb\x31\x5d\xe9\x5c\x83\x4e\x3d\x71\xd7\x21\x60\x7a\xf2\xf4\x26\x05\xd9\xdd\xde\xee\xee\xc0\xfb\x5a\x52\x0f\x2f\x49\xe6\x0d\xb1\xa7\x06\x8c\xb7\x71\x9e\x96\x1b\xdb\xd3\x68\x8f\xa3\x3f\xc7\xed\xe3\xbf\xd8\xf5\x06\xea\xba\xd4\xa1\xbe\xa2\xad\xa4\xad\xdf\x24\x75\xe4\xec\xee\xe3\x5e\x08\xe8\xbd\xfc\xb3\x5e\x41\x1b\x3f\xed\xac\x6d\xd5\x7b\x39\x17\x02\x6e\x15\x81\xb9\x55\x2f\x7e\x4f\x6f\x84\x40\x97\x7d\x8d\xde\xb2\xf7\xba\xbe\x13\xdc\xbd\x69\xb8\xdb\xfe\x76\xb9\x81\x2f\x56\x05\x60\x6e\xe2\x0b\xe8\x68\xd5\xcd\xfc\x3b\xf1\x5f\xdf\x2e\x75\xc0\xaf\x68\xa6\x4c\x98\xd1\x2b\x7d\x17\xe0\x3e\xbd\xf2\xe2\x0b\xd7\x6c\x13\x04\x62\xeb\xb6\x35\x36\x42\xb7\x83\xff\x91\xd6\xd1\x1d\x8d\xd2\xf7\x03\x16\xe9\x1d\x13\x50\x74\x54\x49\x8c\xab\x9e\xd1\x9e\x68\x51\x37\xe9\xeb\x6e\xa9\x5f\x8f\xd9\xc6\xae\x16\x3a\x5e\xe2\x8a\x75\x4d\x48\xf7\xdb\x76\xdf\x89\xbb\x71\x77\xb6\xf1\x4a\x47\x93\x95\x78\xaf\xd4\x7d\xbe\x70\x18\xd9\xc9\x89\x65\x77\xf6\xc4\xcd\xc9\x89\xe2\xfe\x08\x81\x68\x24\xa7\x65\x65\x51\x9c\x75\x89\xbe\xc5\xe5\xc6\xdd\x27\x3b\x11\x96\x96\x77\x08\x42\x2f\x1d\x1f\x76\x7d\xaa\x13\x1b\x06\x62\xbd\xbc\xfe\xd9\x27\xe7\xe3\x1e\xdd\xb3\x4f\xc6\x2c\xe2\xfb\x34\x0f\x3f\xd5\x9c\x87\x34\xd6\xb0\xd3\x67\x6d\x22\x9b\x6d\xd5\x37\x9e\x46\x2b\x5a\xe2\xad\x61\xbc\x8f\x8a\xf7\x96\x36\x14\xc5\xf4\xf5\x30\x6f\xeb\xe6\x25\xbf\x9e\x37\xfa\x63\x51\x42\x54\xce\xf6\xc7\xe4\x4b\x69\xdf\x7c\x9f\x91\xab\x23\xd9\x1a\x47\x86\x32\x8f\xf8\x94\x4f\xff\x7f\xf6\xfe\x06\x4c\xb6\xab\xaa\x13\xc6\xd7\x39\x75\xaa\x6f\xc1\x38\xd0\xdc\x89\x43\xa3\x66\x68\x0c\x99\x74\x04\x4d\x41\x1c\x53\xfc\x31\xa4\x84\x18\x8e\x20\xc9\x31\x7c\xe4\x10\x3e\x72\x80\x90\x1c\x02\x97\x9c\x9b\x88\x14\x1f\x57\x8b\x2f\x53\x19\x44\x4a\x11\xa8\x7f\x06\xaf\x25\x46\xde\x1a\xc4\x6b\xbf\x0c\x6f\xa6\xf5\xd5\xb1\x79\x51\x6e\xf3\x22\x63\x33\x3e\x91\xf6\x03\x6d\xd4\x48\x33\x83\xd8\x22\x32\x2d\x5f\xf7\x7d\xf6\x3e\x6b\xd5\xf9\xf5\xca\x3e\xa7\xaa\xef\xed\xdb\x9d\xb4\xb7\x9e\x67\x3d\xe7\x6b\x7f\xac\xbd\xf6\xda\x6b\xad\xbd\xf6\xda\xbb\x98\x43\x27\x95\x30\x3e\xc1\xdd\xe4\xa4\xef\x62\x49\xf2\x19\xab\xa7\x51\x1b\xe6\xda\x20\xd7\xdb\x93\xfe\xf7\xf1\xd3\x76\x5e\xeb\xfe\xef\x47\xa3\xef\x0b\x49\x70\x17\xf9\xde\xdf\xd1\xe5\xde\x57\xe9\x72\x7a\x0c\xeb\xee\xbb\xd8\xbb\xf6\x45\xe8\x83\xbb\xd8\x6e\xfa\x18\xd3\x3f\xf7\x6c\xbd\xc3\x7a\xab\xb0\x0f\x64\x35\xb7\xe8\x87\x4f\x71\x5f\xe4\xba\x00\x3d\x42\x9f\x01\x7d\x90\x7b\x7f\x4c\xbf\x3c\x7a\x1b\x16\x80\xc1\x9e\xd4\xee\x99\x76\x5a\x6e\x14\xdd\xfc\xc5\xfb\xd9\x25\xf2\x0f\xf3\x5b\xb0\xc2\x77\x86\xff\xc4\x49\xe7\x5b\x2d\x82\xf2\xf7\x2b\x36\xee\x6c\x27\x32\x57\xb4\xc2\xf4\x32\xd7\xb7\xde\x8d\x7f\x7d\xea\x6d\xf4\xa7\x07\x22\x96\x3d\x8f\x1d\x7a\x50\x44\x62\x3c\x20\x62\xd9\x65\x27\x45\x55\x94\xc6\xf6\x5d\x16\x1f\xe3\x5d\x16\xec\x5d\x3e\xf5\xb6\x07\x7d\xd4\xc6\xa3\xf6\x38\xc6\xbd\x46\x4f\x3a\x75\x97\x9c\x0d\x45\x3e\xbd\x97\xea\x54\x27\xa2\x87\xd2\xbf\x22\x8f\x1e\x4e\x8f\xa0\x1a\x3d\x96\x2e\xa2\x19\xba\x98\x2e\xa6\x87\xd2\xe3\xe9\xf1\xf4\xaf\xe8\xfb\xe8\x12\xfa\x36\x7a\x22\xfd\x07\x7a\x18\x5d\x46\x4f\xa1\xc3\x74\x25\x5d\x45\xdf\x41\x21\x3d\x93\xce\xa7\xab\xe9\x6a\x7a\x8c\xfd\xf7\x81\xef\xa6\xe7\xd2\x75\x74\x21\x3d\x9f\x5e\x4c\x0b\x74\x84\x8e\xd0\xf7\xd1\x31\x3a\x46\x97\xd0\x9b\xe9\x0e\x6a\xd2\x9d\xf4\xf3\xf4\x03\xf4\x0b\x34\xa0\x36\xdd\x45\xbf\x44\x3f\x4c\xef\xa7\x5f\xa7\x67\xd2\x7f\xa1\x25\xba\x8e\x7e\x8b\x7e\x97\x5e\x44\x1f\xa5\x4f\xd0\xcb\xe8\x93\xf4\x49\x7a\x15\x7d\x8a\xfe\x90\x8e\xd0\xa7\xe9\xd3\x94\xd1\xbd\x74\x2f\x1d\xa5\xcf\xd0\x67\xe8\x36\xfa\x13\xfa\x33\xba\x9d\x3e\x4b\x9f\xa5\x9f\xa0\x2f\xd2\x17\xe9\xb5\xb4\x49\x9b\xd4\xa1\x2f\xd3\x97\xe9\x75\xb4\x45\x5b\xf4\x7a\xfa\x1a\x7d\x9d\xde\x40\xdf\xa4\x6f\xd2\x31\x3a\xe5\x79\xf4\x93\x5e\xcd\xab\xd1\x9b\xbc\x19\x6f\x86\xde\xec\x35\xbc\x06\xbd\xc5\x7b\xa8\xf7\x50\x7a\xab\xf7\x30\xef\xe1\xf4\x36\xef\x11\xde\xbf\xa1\x3b\xbc\x6f\xf7\xbe\x9d\xfe\xa3\x77\xbe\x77\x3e\xbd\xdd\x7b\xb4\xf7\x68\xfa\x19\xef\x31\xde\x63\xe9\x1d\xde\xbf\xf7\x2e\xa2\x9f\xf3\x1e\xef\x3d\x9e\xde\xe5\x35\xbd\x26\xfd\x82\xf7\x44\xef\x89\xf4\x6e\xef\xfb\xbd\xef\xa7\xf7\x78\x3f\xe0\x3d\x99\xde\xeb\x5d\xee\x5d\x4e\xbf\xe8\x5d\xe1\xb5\xe9\xb8\x77\xa5\x77\x25\x0d\xbd\xab\xbc\xab\xe8\x97\xbd\xc8\xfb\x31\x7a\xbf\x77\x9d\x77\x1d\xdd\xed\xdd\xea\xdd\x4a\xbf\xea\xdd\xee\xbd\x81\x3e\xe0\x1d\xf3\x8e\xd1\x6f\x78\x3f\xe5\xbd\x99\x16\xbd\xb7\x79\x3f\x4d\x1f\xf1\x7a\xde\xbb\xe9\x1e\xef\xbd\xde\x2f\xd2\xef\x79\xbf\xe4\xfd\x32\x7d\xd2\xfb\x15\xef\xff\xa0\xff\xee\xfd\x67\xef\x83\xf4\x47\xde\x87\xbc\x45\xba\xd7\xfb\xb0\xf7\x61\xfa\x53\xef\x23\xde\x47\xe8\xcf\xbc\xdf\xf4\x7e\x97\xfe\xdc\xfb\xa8\xf7\x7b\xf4\xd7\xde\xc7\xbd\x8f\xd3\xe7\xbd\x15\xef\x0f\x68\xc3\xfb\xef\xde\x1f\xd2\xdf\x79\xff\xc3\xfb\x1f\xf4\xf7\xde\x1f\x7b\x7f\x4c\x9b\xde\x9a\xf7\x17\xf4\x0f\xde\xe7\xbc\xbf\xa2\x2d\xef\x6f\xbc\xbf\xa5\xaf\x79\x1b\xde\xdf\xd3\x37\xbd\x2f\x7b\x5f\xf6\xea\xde\x57\xbd\xaf\x7a\x33\xde\x96\xf7\x2d\xef\x90\xef\xf9\x0f\xf1\x1e\xe6\xff\x2b\xff\x5f\x7b\x8f\xf4\x1f\xee\x3f\xdc\xfb\x0e\xff\x11\xfe\x79\xde\x77\xfa\xff\xd6\xff\xb7\xde\xa3\xfd\x39\xff\xdf\x79\xf3\xfe\xbc\x3f\xef\x5d\xe4\x7f\xb7\xbf\xe0\x2d\xf8\xdf\xe3\xb7\xbc\x4b\xfc\x1f\xf2\x9f\xe9\x3d\xc5\x7f\x96\x7f\xb5\xf7\x23\x7e\xe4\xbf\xc8\x7b\xa6\x7f\x83\xff\x6a\xef\xf9\xfe\x51\xff\xa8\xf7\x0a\xff\x76\xff\x76\xef\x16\xff\x35\xfe\x6b\xbc\x57\xfa\xaf\xf5\x5f\xef\xbd\xca\x7f\xa3\x7f\xcc\xcb\xfc\xae\xff\x26\xef\x36\xff\xad\xfe\x1d\xde\x8f\xfb\x77\xfa\x77\x7a\x1d\xff\x67\xfc\x9f\xf1\x5e\xe7\xff\xac\xff\x5e\xef\xf5\xfe\x2f\xfa\x1f\xf4\xde\xea\xff\xba\x7f\xc2\xfb\x79\xff\xff\xf4\xef\xf1\x7e\xc1\xff\x4d\xff\xff\xf5\xee\xf2\xff\xc0\xff\x03\xef\x43\xfe\xaa\xff\xc7\xde\xaf\xfb\x6b\xfe\x9a\xf7\x11\xff\x4f\xfd\x3f\xf5\xfe\x2f\xff\xcf\xfd\x3f\xf7\xee\xf1\xff\xc2\xff\x0b\xef\xbf\xfa\xeb\xfe\xba\xb7\xe4\xff\x95\xff\x57\xde\x6f\xfa\x7f\xe3\xff\x8d\xf7\x5b\xfe\xdf\xfa\x7f\xeb\xfd\xdf\xfe\x86\xbf\xe1\xfd\xb6\xff\x3f\xfd\xff\xe9\xfd\x8e\xff\x45\xff\x8b\xde\x7f\xf3\xff\xde\xff\x7b\xef\x77\xfd\x7f\xf0\xff\xc1\x5b\xf6\xff\xd1\xff\x47\xef\xa3\xfe\x3f\xf9\xff\xe4\xfd\x3f\xfe\xff\xf6\xff\xb7\xf7\x31\xff\x9f\xfd\x7f\xf6\x7e\xcf\xff\xba\xff\x75\xef\xf7\xfd\x6f\xfa\xdf\xf2\x3e\x5e\xa3\x1a\x79\x2b\x35\xbf\xf6\x70\xef\x13\xb5\x47\xd4\x1e\xe1\x7d\xa6\xf6\x6f\x6a\xff\xc6\x5b\xab\x7d\x7b\xed\xdb\xbd\x3f\xa9\x3d\xb2\xf6\x48\xef\x4f\x6b\x8f\xaa\x7d\x87\xf7\x67\xb5\xef\xaa\x7d\x97\xf7\xd9\xda\xa3\x6b\x8f\xf6\xfe\xa2\xf6\x98\xda\x63\xbc\xbf\xac\x5d\x50\xbb\xc0\x5b\xaf\x5d\x58\xbb\xd0\xfb\x5c\xed\xa2\xda\x25\xde\x5f\xd5\x9e\x5a\x7b\x9a\xf7\xbf\x82\xef\x0c\xbe\xd3\xfb\x3b\xf2\xec\x38\xfc\x2e\xfa\x77\xe4\xbd\xea\x25\x3f\xfe\x6a\x6a\x50\x40\x44\x74\xea\x14\xe5\x3f\xf3\x9d\x2e\xbd\xf4\x47\xaf\xba\xf8\xe3\x37\x3c\xfc\x07\xff\xc9\xbf\xa2\x61\x5f\x7f\xfc\x8a\x8f\xff\xb2\x5c\xbf\x7e\xe7\x37\xef\x7d\xc8\xf5\x8d\xdb\x89\xa8\xc1\x39\x3c\xa2\x43\x3f\xf9\xad\xf3\x89\x1e\x72\xe3\xd7\xef\xfc\xe7\xf6\x43\xae\xcf\xcb\x29\x7e\xbf\xf3\xb5\x06\xf9\xb1\x49\x1e\x9c\x47\xe4\x1b\xb8\x88\xde\x55\xbb\x8c\xde\x56\x7f\x1c\x5d\x1a\xa4\xf4\x86\x99\xbb\xe8\xa6\xfa\x71\x3a\xe2\xfd\x21\xbd\xcd\x4f\xe9\x5a\x3f\xa5\xcb\x83\x94\xae\x0d\x52\xba\xc9\x27\xba\xc2\x7f\x17\x5d\xeb\x5f\x48\xef\x32\xf3\xbf\x20\xa5\x97\x06\x29\x7d\x38\x48\x29\xe1\x34\x8f\x0c\x52\x7a\x4b\x90\xd2\xd1\x20\xa5\xeb\x83\x94\x6e\x31\x60\xd3\x5f\x48\x57\x98\x32\x04\x6a\x29\x5d\x38\xf3\x25\x3a\x12\x7c\x96\x28\xd8\xa2\x93\xc1\x1f\xd1\xb1\xfa\xeb\xe8\x64\xf0\x24\x3a\x59\xfb\x12\x9d\xac\xbf\x8d\x8e\xd5\xdf\x47\x27\xfd\x7b\xe8\x5a\xff\x71\xa7\xc2\xe0\xfd\xf9\xfb\x99\xaf\xd2\xc9\xfa\xbd\x74\xb2\xbe\x49\xc7\x82\xf7\xd1\xc9\xfa\x97\xe8\x58\xb0\x44\x27\x83\x8b\x28\x0d\x2e\xa2\xf3\xea\xef\xa1\xa5\xe0\xed\x44\x87\x0e\xd3\x79\x41\x42\x14\x5c\x46\x14\x44\x74\xad\x7f\x84\xee\xf6\xbf\x41\x8f\xf4\x8f\xd0\xa5\xc1\x53\xe9\xe2\xda\x33\x4e\x7d\x23\x38\xee\xdd\x19\x5c\x41\x2f\x0e\x16\xe9\x44\xed\x23\x74\x34\x58\xa4\xa3\x41\x48\x47\xfd\xf7\xd3\xf9\xc1\x85\x74\x61\x70\x0f\x9d\xf0\x0f\xd3\xd0\x3f\x7c\xea\xb7\x6b\x5b\xf6\xfe\xc4\xa1\xc7\xd1\x09\xf3\x3e\x38\x6e\xd3\x9f\x30\x79\x6a\x4f\xa0\x13\xb5\xf7\xd1\xf5\xfe\x3d\xf4\x98\xe0\x1e\xba\xbb\x76\x2f\x51\x7d\x8b\xce\x0b\x88\x2e\xa8\x7d\x81\x1e\x5a\xbb\x83\xae\xf5\xef\x35\x74\xf4\xbe\xe0\xdf\x6b\xe9\x7c\x93\xd0\x3e\x48\xe9\xb7\x83\x94\xae\x34\xb4\x0f\x52\x3a\xdf\xa4\xa9\xfd\x35\xbd\x2e\x38\xee\x5d\x3a\x33\xa2\x1b\xfd\x0f\xd0\x95\xb5\xfb\x98\xfe\xef\xa2\x6b\xcd\xbb\x80\x4e\x7d\xad\x76\xc4\xa6\xbf\xc9\x1f\x51\xd3\x1f\xd1\xbc\x6d\xcb\x47\xe9\x44\xfd\x72\x3a\x6a\xe8\xed\xdd\x4d\x17\xf8\x23\x6a\xfb\x9f\xa2\xa7\xd6\xee\xa3\xe7\xd4\xef\xa3\x76\xfd\x3e\xfa\xde\xfa\x7d\x5e\x58\x33\xf5\x19\xba\x3b\x60\xe6\xd3\xa7\xbe\x65\xfa\xc2\xf4\x03\x82\x7f\x0f\x3d\xc5\xf6\xc5\x3d\xf4\x08\xff\x1e\x6a\xd7\x5f\x47\x97\x48\x3f\x68\x08\x52\x7a\x87\xbd\x7f\x0f\x2d\x21\xd8\xbe\x78\x1f\x9d\x0c\x3e\x4d\x27\x2c\xdd\x1d\x30\xf3\x41\x7a\xb1\xed\x8b\x70\x3b\xf8\x87\x4f\xfd\x85\xa1\xbf\x7f\xf8\xd4\xef\xf8\x87\x4f\x7d\x29\x38\x4e\xb7\x8e\xfb\x41\x83\xe1\xb1\xe3\x74\xbb\xe9\x0b\x04\xd3\x17\xb6\xaf\xcd\xd5\xb4\xd7\xd4\xa9\xaf\x7f\x44\xc7\x6c\xfd\x25\x57\xcb\xa3\x8b\xf6\x7a\x89\xe5\x17\x43\x9f\x70\xf2\xd5\xf0\xb3\xe1\xa9\xd2\xab\xa1\xcb\x3d\x74\xa2\xfe\x3e\xa2\xe0\x1e\x3a\xec\xdf\x73\xea\x9f\xfc\xc3\xa7\x7e\xc5\xbf\x87\x2e\xf7\x0f\x9f\xfa\x5f\xfe\x3d\xd4\xb4\x34\x30\x7d\x70\x98\xae\xe4\xeb\x89\xe0\x73\x74\x6d\x70\x21\x0d\xcd\x18\x31\x7c\x6a\xc7\xc9\x16\x9d\xb0\xf0\x25\x3a\xe9\x1f\xa6\x5f\xe3\xeb\x4d\x7c\xcd\xdf\xdf\x64\xaf\xe7\xfb\x87\x4f\x7d\xd5\xf4\xa3\xad\x5b\x5f\xaf\xa2\xe1\xf8\xde\xf4\xeb\x71\x3a\xaa\xaf\x87\x1e\x4d\xc7\x0e\x99\x76\x2e\xd1\x49\x33\x0e\xf8\x9a\xf0\xf5\x36\x33\x2e\xcd\xd8\xa8\xb8\x9e\x67\xc7\x8d\xba\x5a\x7e\xb9\x87\xee\x9e\xf6\x6a\xc6\xbb\x1d\x73\x97\x11\xd9\xfe\xe5\x71\x6f\xc6\x9e\xbe\xfa\x3f\x4a\x27\x82\x94\x3e\x69\xdb\xf0\x41\x3a\x5a\xff\x0a\x2d\xd5\x2f\xa1\xbb\x83\x36\x91\x3f\x4b\x14\x0c\x89\x82\x25\x03\xde\x42\x7e\xcd\xc1\xd2\x97\xf9\xc4\x8c\x13\xc3\xab\x4c\x87\xdb\xa5\x3d\xde\x4d\xb4\x14\x1c\xf7\x7c\x0b\xaf\xf1\xbe\xd3\x96\x35\x24\xa2\x77\x7a\x73\xfe\x1c\x45\xc1\x71\xef\x31\x46\xa6\x04\xc7\xbd\x23\xde\x1b\xe8\xd1\x79\x5a\xfa\x4b\xff\x83\x74\x3b\xd1\x37\xde\x49\xf4\xcd\x90\xe8\x1b\x57\x11\x7d\x33\x20\xfa\xfa\x9f\x11\x7d\xf3\x09\xc1\x71\x6f\x2b\x38\xee\x9d\x17\x7c\xf6\xd4\x17\xcc\xd8\x0e\x3e\x71\xea\xf3\x33\x8f\x3c\xf5\xf9\xda\x87\x4f\x7d\x7e\xe6\xa9\xa7\x3e\x5f\x7f\xce\xa9\xcf\xcf\x3c\xe3\xd4\xe7\xfd\xe3\xa7\xfe\x46\xe4\xa9\xe9\xe3\xe0\xed\x74\xa1\xe5\xbf\x88\xae\x35\xfc\x65\x70\x35\x7c\x63\x78\xc4\xc8\x48\x91\xa5\xc1\x15\x74\xad\x1d\xaf\x77\xd0\x49\x3b\x3e\x9f\x4a\x57\x9b\x7e\x30\x34\x9c\xb9\x80\x52\x23\x47\xcd\xb5\xbe\x49\x57\x9b\xb1\x6f\x69\x6b\xe4\xde\x90\xae\xb7\x32\xf2\x38\xdd\x1d\x2c\xd1\xdd\x76\x3c\x7c\x9a\xc7\xd7\x71\xba\xd5\x7c\xaf\xdd\x4d\x47\xed\x38\xbd\x83\x8e\x9a\x74\x86\x2f\x83\x47\x9e\xfa\xb2\x91\x55\xc1\x05\x44\xf6\xbb\xe1\xa7\x87\xd2\xa3\x02\xf3\xdd\x3c\x7f\x84\x8e\xd6\x06\x74\xd8\x94\x59\x7f\x0f\x1d\x0d\x9e\x70\xea\x8b\xf5\x2f\xd2\xdd\x33\x33\xb6\x8c\x6f\xb7\x75\x1d\xb7\x3c\x67\xdf\x05\x9f\xa2\x87\x06\xd7\x12\xcd\x0c\xe9\xb0\xc8\xab\xfa\x90\xce\xb3\x34\x30\xb2\xec\x22\x4a\x59\x76\xb5\xcd\x38\x39\x14\x12\x1d\x7a\x4d\x9e\xc6\xd0\xa2\x7e\x2f\x7d\x22\x38\x41\x8f\xb2\xed\xff\x2c\xcb\x28\xa6\x61\xfd\x52\x7a\x98\x29\x6f\xe6\x6d\x14\x04\x2f\xa4\xd0\xa4\xb5\xe9\x4d\xbe\xeb\x99\x86\x4c\xdb\x31\xfd\xf2\x3a\xcf\x33\x65\x0a\xfd\xea\x77\xd1\xc9\x7a\x48\x1f\x38\xf4\x35\x3a\x69\xa0\x7e\x39\x9d\x37\xf3\x1e\x4e\xff\x51\x7a\x72\xe3\x7c\x3a\x19\x2c\xd1\xa3\xac\x0c\x7a\x27\xbd\x26\xb8\x93\x4e\xd4\x2e\xa5\x13\x41\x42\x17\x5b\xf9\xf1\x31\x0a\x6a\x27\xe8\xca\xe0\x0b\x74\xc2\x40\xed\x4b\x74\x22\x78\x31\xcd\xd6\xff\x5b\xfe\x6c\xe9\xf1\x51\xab\x8f\xac\x2e\xab\xdd\x41\x17\x9b\x7e\xa8\xbf\x8b\x8e\x1a\x3d\x64\x65\xee\x87\xe8\xae\x99\xaf\xd0\x89\x43\x01\x9d\xa8\x1f\xa1\x8b\xeb\xdf\xa2\x13\xb6\x9e\x0f\xd3\x65\x33\xaf\xb3\x32\xf9\x82\xb1\xcc\xbd\x87\x0e\x9b\xfa\x6d\x59\x46\xb7\xe5\x7a\xf0\x4b\x66\x0c\xcc\xbc\x85\x66\x67\xee\xb3\x7a\xf0\xb0\xc5\xe3\x0b\xdc\xe7\x1f\xa5\x13\x87\xfe\x8c\x8e\xcd\xdc\x4a\x54\xbf\x90\xce\x0b\x3e\x4b\xe7\x1d\xba\x88\x4e\xd6\x8d\xfc\xb8\x84\x28\xb8\x91\x1e\x7a\xe8\x62\x3a\x39\x73\x98\x4e\xd4\x7f\x8a\xce\x0b\x36\xe9\xa1\x87\xde\x4e\x27\x67\xde\x6f\xdb\xf2\xa4\xda\x09\x7a\xa4\xe5\xb3\x2f\xd2\xdd\x22\x5f\x82\x8f\x12\xd5\x4c\x9f\xf0\xf5\x21\x37\xd2\xb1\x46\x4c\x47\x67\xae\xa0\x63\xf5\x47\xd1\xd1\x43\x1f\xa6\x63\x33\x11\x1d\x95\x7a\xc7\xf2\xfa\x2f\x29\x0d\x5e\x43\x9f\x08\x8e\xd3\x57\x82\xe3\xde\xe7\x0c\x1c\xfa\x02\x5d\x7c\xe8\x03\x74\x71\xfd\xf3\xf4\x89\xe0\x1b\x74\x22\x78\x1f\x5d\x12\xdc\x49\x87\x6d\x1f\x2c\xe6\x72\xd1\xb6\xf9\x4b\x74\x49\xed\x52\x3a\x5c\x27\x3a\x19\x34\xe8\xc4\xcc\x17\x28\x98\xb9\x20\xef\x7f\xd3\x07\xf5\x87\xd2\xc9\xe0\x19\x74\xc2\x8e\xa3\xc7\xd9\xeb\x25\xb5\x2d\x3a\x5c\xbf\x92\xce\x0b\x3e\x4d\x17\xd7\x3f\x45\xf7\x05\x5f\xa3\x13\x33\x2f\xa4\xfb\xea\x1f\xa2\x13\x8d\x2b\xe9\xe4\xcc\x12\x9d\xa8\x7f\x91\x8e\x05\x5f\x06\x9d\x72\x11\x9d\x67\xfa\xc9\xca\xac\x7b\x73\x5b\xc5\x5e\xff\x88\x28\xb8\x9c\x2e\x98\xb9\x93\xce\xab\xbf\x9d\x2e\x36\x7c\x13\xfc\x36\xdd\x65\xaf\x1f\xb2\xd7\x93\xc1\x87\xe8\xc4\xcc\x6b\xe9\xf2\xfa\xf9\x74\xa9\x5c\x0d\x8f\x1b\x3e\x35\xbc\x52\x7f\x06\x9d\x0c\xbe\x97\x4e\xd4\x6f\x21\x0a\x8e\xd2\x6c\xfd\x7d\x74\x9f\xe9\xa7\xfa\x27\xe9\x3e\xd3\x76\x29\xeb\xd0\x0c\x9d\xac\x7f\x9a\x4e\x58\xb9\xa0\x74\xa1\xc8\xb8\xb1\x0e\x7b\xa7\xe5\x8d\x9b\xe4\x2a\x75\x09\x5d\xec\x75\x89\xbe\xd3\x8e\x8f\x2f\x58\x3d\x92\x5f\x4b\x74\x87\xe1\x7b\xc3\x7b\x66\x9c\x58\xfe\x51\x57\xc1\x51\xfa\xc5\x8c\x17\xc3\xb3\xd2\x3f\xc1\xc7\x88\x82\x4b\xe8\x02\x6b\xe7\x19\x1e\x7f\x1f\xdd\x69\x64\xd0\xcc\x57\xe8\xce\x99\x6f\xd1\xd1\x99\x6f\xd0\xd5\x33\x57\x51\x14\xfc\x3e\x5d\x1d\xcc\x52\x74\xe8\x6e\xa2\x99\xbb\x69\xf6\xd0\x7d\x74\xf2\xd0\x25\x74\xa2\xfe\x31\x3a\x16\x7c\x8e\x8e\xd6\xdf\x44\xe7\xd5\x0f\xd3\xc5\xc1\x0b\xe9\xd6\xda\x09\x7a\xa1\x19\xd7\x66\x6c\x05\x29\xf5\xc7\xb4\xf8\x2a\x9d\x34\xb6\x9f\xe8\x19\x7d\x2d\xb5\x27\xf2\xeb\xe1\x09\xdf\x27\x5f\x27\xdb\x19\x17\x05\x21\xcb\x3f\xc7\x77\xb6\x17\x5e\xca\xd7\xe3\x65\x7d\xc2\xd7\x4b\x2b\xbf\x7f\xb0\xe4\x8a\xdf\xb5\x9e\x66\x1d\x3b\xe9\x8a\xfa\xdb\x75\x9d\x79\xea\xb7\xfe\x28\xe0\x29\x8f\x5c\xfd\x5f\x23\xf2\xcd\xf4\xe7\xb9\x44\x41\x4a\xe4\x5f\x48\xe4\xdd\x45\x44\x9f\x22\xe7\xcf\xef\x53\x14\x10\x5d\xdb\x60\x08\xe6\xbc\x86\x99\x0f\x34\x68\x66\xa1\x41\xb4\x14\x10\x75\x02\xa2\xe5\x06\x05\xfd\x06\xd1\x62\x40\x34\xac\xfd\x35\xbd\xa1\xb6\x45\x6f\xa8\xf9\xf4\x9e\x06\x79\x69\x83\x68\xdd\x5f\xa0\xbe\x2e\xfb\x21\xd7\xd3\x4d\x66\xee\x64\xe6\x54\xde\x2a\x35\xfd\xab\xe9\x5a\x03\xf5\x01\xa5\xb5\xaf\xd2\xbb\xec\xe4\xee\xa1\xdf\x1a\xfa\x23\x9a\xf5\xb7\xe8\x16\x6b\xa3\xb3\x0d\x6f\xde\x05\x29\xb5\x82\x94\xba\x0c\x09\xcf\x0d\xda\x41\x4a\xf3\x33\x44\xef\xa9\xf7\x28\xb5\x7a\x36\xb5\xf3\xa9\x79\x93\x7e\xa6\x7f\x6a\x23\x48\x6d\xde\x79\xce\x37\x27\xf7\x86\x3e\x33\x29\xbd\xc3\x5c\x6b\x3d\x6a\x06\x44\xaf\x3d\xf4\x79\x3a\x19\xac\x52\x3c\xd3\x26\x33\x17\x1c\xd5\xbf\x45\x17\x1a\xdd\x6e\x69\xfa\x15\xba\xa9\xb1\x41\x73\xf5\x8c\xfa\xf5\x0d\x6a\xd7\x37\x68\x61\xe6\x61\xf4\x9c\x99\x87\x79\x8f\x9b\x79\x18\x5d\x33\xf3\x30\x3a\xda\x20\x3f\x6d\x90\x97\x34\x88\x42\x43\x9f\x46\xde\x0f\x86\x26\xad\x06\xd1\x1c\xbc\xeb\x34\x88\xa2\x06\xf9\x61\x83\x3c\xf3\x3c\xcc\xbf\x79\xcb\x0d\xa2\x5e\x83\x68\x81\x61\xb5\x41\x9e\x01\xd3\x2f\x61\x71\xa5\x2d\x7e\x5e\x55\x10\x69\xd0\xf9\xf2\xfa\xbc\x06\xbf\x37\xed\x0e\xf9\x7e\xd6\xf4\x1d\xe3\xb3\x92\xe3\x47\xfd\x80\x28\x33\xe9\xb9\x6d\x7c\xa5\x7e\xde\x06\x6f\x9e\x71\x34\xf4\x5c\x6a\x90\xd7\x66\xe0\xba\xbd\x55\xa9\xff\xfe\xcf\xb6\x2e\xc6\xd3\xf4\x07\x5e\xc7\xef\xfb\xee\x76\x8c\xaf\xa6\xce\x16\x83\xa1\xdd\x86\xbd\xcf\x68\xad\x91\xd1\x66\xd1\x36\xe2\x7a\x69\x85\xaf\xeb\xdc\x06\x83\xc3\x1a\xe7\x5f\x03\x30\x7d\x31\x2c\x9e\x2d\xdd\xda\x0d\xa2\x4d\x7e\x27\xb4\x6a\x29\x5c\xe7\x99\x26\x69\x4e\x43\x7b\x6f\xd2\xa4\xc1\x07\xe8\xa5\x0d\xf2\x9b\x26\x6f\xf0\x76\xba\xb8\x41\x9e\xc9\xdf\x43\xa8\x1b\xbb\xea\xdb\xe8\x19\x66\x9e\xd6\x20\x7f\xce\xe0\x11\xdc\x48\x17\x36\xc8\x9f\xad\x8f\xe8\xb5\x0d\xf2\x32\x5b\x16\x79\x4b\x81\xed\x27\xbf\x91\x83\xc5\x75\x58\x7b\x14\xcd\x36\xc8\x33\x63\xd4\xd0\x71\x23\x87\x1a\xdf\x1b\xbe\xf3\x86\x41\x4a\x69\x5e\xbe\xc9\xe3\x37\xb9\xae\xa6\xf8\x1f\x72\x1c\x73\x3c\x73\x18\x3f\xf7\xdc\x40\x6b\x00\x1b\x16\xbf\x55\x9f\x82\x55\x2f\x0c\x56\x69\x49\xae\xe6\x7b\xb0\x7a\x6a\x4d\xa5\xdf\x0d\xe8\xef\x26\x78\xe4\x2d\x7b\xe4\x99\x6b\xcf\x23\xaf\xe5\x91\x37\xe4\xfb\xbe\xbc\x37\x7c\xea\x91\x95\x11\x5d\x1e\xaf\x19\x5c\x3b\x7c\xcd\x78\xdc\xef\x2a\x7e\x15\x70\x36\x68\x7b\x3f\x08\x56\x4f\x6d\xe4\xe0\xcf\x06\xab\xde\xd2\xe4\x67\x73\x95\x7b\xfc\x8e\xe9\x76\xf2\x5d\x83\x4e\xff\x40\x04\x2f\xe1\x36\x24\x39\xe8\xf6\xed\xe4\xfd\x34\x60\xf2\xe2\x3d\x51\x01\x67\xda\x16\x2c\x27\x68\x06\xab\xb4\x38\x19\xbc\x76\x2e\x0b\xac\x3c\x98\xcb\x41\x9e\xa9\xcb\xd0\x1f\xc3\x07\xe9\xc8\x94\xe5\x2e\x04\xab\x56\x4f\x2e\x32\x98\xf1\xd8\x3d\xd4\xa5\xf4\x50\xd7\x8c\x43\x3f\xca\xc1\xca\x7b\xa3\x2b\x8c\x1c\xef\xe4\x3a\xcb\xcf\xf8\xfd\xf2\xfd\xdf\x5b\x7d\xb6\x95\x5f\x2d\x24\xfc\xdc\xe3\xfb\xc5\x06\xd5\x8c\xec\x5d\x68\x90\xb7\xd0\x20\x7f\x29\xaf\xc7\x9b\x2b\x81\x4d\x2b\x97\x37\xa8\x1f\x6c\x90\xa4\x23\xb6\x05\x9a\x39\x58\xbd\xba\xc5\xba\xa5\xdb\xa0\x80\x72\x1d\x61\xae\x66\xec\xe1\xb3\x17\xf3\xb5\xcb\xfa\x76\x90\x3f\xfb\xb3\xc5\xf7\xfa\x02\xdb\x1c\x73\x0d\xaa\x2d\x36\xc8\xef\xe4\x32\x9f\x46\xac\xd3\x52\x86\x0e\xeb\xb2\x4e\x5e\x8f\x95\x6f\xab\x39\x4d\x2c\x3e\x31\xd3\x28\xce\x69\x68\xee\x2d\xb0\xdc\xb1\x7a\x6c\x3d\x4f\x6b\xd3\x37\x73\x30\xba\xc0\xea\x83\x2d\x2e\xab\xcb\x20\xb2\x51\xe4\xd6\x12\x83\xa4\x4f\xf3\xfa\x2d\xf0\xb7\xb1\x8e\x5d\xe4\xb2\x57\x58\xde\x0e\x0b\x3d\x65\xe9\x36\x04\x48\x00\xb2\x02\xac\xfd\xc3\x60\xeb\x5c\xe4\xf6\xac\x70\x3b\x17\xd8\x0e\xe9\x32\x5d\x7a\x8c\x57\xdc\x20\x8f\x75\xbc\xfd\xde\x64\x9b\x60\xc8\xb2\x51\x74\xe1\x6a\x4e\x87\xfa\xa0\x41\x33\x8d\x06\x19\x9d\x4c\xf3\x0d\xf2\x19\x6c\xb9\x6c\x73\x58\x1b\x61\x29\xaf\xd3\xf2\xd5\x10\xe8\xbc\x52\xe0\x64\x81\x79\xd5\xf4\x9f\xed\xc3\x36\xe3\x32\x60\x10\x19\xcd\xdf\xc7\x63\x62\x23\xb7\xdb\x8c\xed\x82\xf4\xb6\xf5\x2d\x43\xdb\x57\x1a\xe4\x1b\x3e\x19\x15\x34\xb1\x34\x1a\x70\xff\x76\x0b\x30\xb6\xd6\x18\x5a\x05\x60\x1a\x4b\x0f\x81\x95\x9c\xe7\x2d\xad\xc4\x4e\x6b\x32\xff\x84\xdc\xee\xb5\xfc\xde\xe0\xea\xad\x70\x5f\xad\x32\xdd\xa5\x5f\xc4\x4e\x9e\x67\x1a\x36\x73\xde\x37\xbc\x51\x6b\xe7\x75\x8c\xed\x15\xe2\x71\xc6\xb6\x8c\x6d\xff\x1a\xf7\x99\xf0\xf5\x3a\xbf\x5b\xca\xfb\x46\x9e\x6d\xda\x4d\xc6\x87\xf8\xfd\x7a\x51\x86\xed\xe3\xf5\xfb\xa7\x27\x19\x07\xeb\xc0\x5f\x62\x73\x37\xb9\x2d\x0d\x86\x3e\xe3\xb5\x95\xf3\xbc\xe5\x81\xfe\x76\x7e\xb6\xf6\xe4\x1c\x3c\xf7\xb8\xbd\x4d\x68\xd7\x12\xf3\xd0\x1c\xf3\xc5\x1c\x97\xd7\x63\x1e\x09\x1b\x54\x33\x72\x70\xad\x41\xb5\xb0\x41\xbe\x91\x71\x2d\x6e\x73\x33\xaf\xd3\xf6\xb7\x8c\xc7\x65\xe6\xa7\x21\x8c\xcd\x01\xf3\xd4\x30\xbf\xaf\xf1\x3c\xc6\xe2\xdc\x60\x1a\x08\x7d\x36\xb6\x83\xc5\x6b\x8d\xfb\x66\x96\x69\xb7\x06\xbc\x37\xca\xd3\x59\x7b\xb7\xc5\xe5\x20\xef\xa4\x3c\xf6\x57\x38\x3f\xf2\x2f\xcb\x80\x31\xee\xab\x5c\x1e\xe3\x5f\x6b\xe5\x73\x2c\x3b\x06\xf7\x1a\xe6\xa7\x84\xc6\x3e\xc2\x90\x75\x90\x0b\xe6\x59\x76\x86\xac\xa3\x5a\x3c\x97\xc9\x72\xd8\xd6\x86\x8c\xd3\xb4\xb9\x0f\xba\xa0\x5b\x42\xbe\xc6\x5c\x9e\xd0\x26\xe2\xe7\x39\x90\x59\x09\xbf\x8f\xb9\x6f\x3b\x9c\x76\x8e\xe7\xc3\xf3\x5c\x47\x93\xd3\x8c\x38\x4d\x87\xdf\x85\x5c\x46\xb7\xb8\x17\x7d\x7a\xbf\xe7\x25\x2e\x73\xad\xd0\x93\xc4\xf3\xb5\x71\xbb\x70\x8e\x31\xe0\x7a\x7a\x9c\x26\xe2\xfb\x59\xd0\x2f\x0b\xfc\xad\xc3\xf4\x4d\x80\x1f\x7a\x5c\xe7\x90\xcb\x6e\xf2\x77\x91\xf7\xdc\x46\x91\x93\x56\x3e\xf1\xfc\xd2\xe2\xb0\x90\x97\x33\x96\x83\x6d\x8f\x28\xf5\x72\x7a\x8c\xa0\x4d\x86\xee\xbf\xd3\x20\xfa\x73\x98\x8f\xa4\xa0\x17\xfb\xfc\x3e\x56\xfa\x92\xc7\xda\xf8\x7b\x02\x79\x53\xa0\xb3\x8c\xbb\x01\x97\x61\xde\xbd\x00\xbe\x77\x0a\xff\x86\xdc\x5b\xfb\xe3\x19\x9c\x77\x23\x9f\x5f\xdb\x71\x9e\x32\xce\x7d\xd6\x41\x1b\xcc\x3f\xe6\xfb\xff\xbf\x41\xbe\x69\xd3\xaf\xc2\xdc\x6a\x91\xcb\xec\x16\x3c\x66\x6d\x20\x43\xdf\x3f\x04\x3c\x5f\x07\x3c\x97\x82\x9c\x60\xbd\x62\xeb\xc4\xef\xa6\x2d\xb7\x43\x3f\xa6\xcc\x2f\x5d\xb0\x21\x8c\xfc\x79\x3d\xd3\x56\xf2\x31\x8d\xac\xac\xdf\xe2\x7e\x78\x07\xe8\x54\xd1\xb7\x2f\x66\xdc\x45\x9e\xb1\x0f\xc8\xf3\x1b\x44\xb7\x31\x6e\x1d\xa0\xb9\x81\x37\x71\x79\x06\x9f\x17\x42\x3f\xfc\x02\xe3\xda\x85\x77\x11\xb4\x93\x71\xf3\xbb\x60\x97\x0c\x00\xdf\x14\xe6\xab\xa8\xaf\x3b\x30\x76\x44\x7f\xbf\xab\x41\xf4\x2b\xc0\x1f\x09\xd4\xa9\x41\x78\xe5\xdd\x9c\x0e\xf9\xac\xbb\xdd\x06\x1b\xe3\x6a\xee\xdf\xca\xcf\xd7\xc0\x3b\xc4\xd5\xf0\xf7\xf3\x8b\xb2\xac\x0e\x88\x19\xfe\x96\xdb\xae\x21\x2e\x79\x1f\xc2\x98\x8b\xd4\x15\xc1\x95\x57\xd2\x65\x15\x75\xbc\xbc\xa8\xc7\xea\x45\x73\xff\xa2\x8a\xf2\xa6\x85\x6c\x17\xca\x38\x5d\xc0\x76\xa6\x15\xdf\xf6\x13\xc7\xb3\x0d\xa9\xa3\xed\xd3\xe4\x39\x5d\x3a\xef\x26\xde\xae\xf7\xd3\xf6\xd5\x4e\xdb\xb0\x5b\x30\x0d\x7e\xa8\x67\x4e\x17\x92\x3d\xc0\x73\x27\xf4\xbd\xe6\x2c\xe2\x5e\xc6\x5f\xe9\x94\x65\x69\x5c\xf7\x8b\x37\x34\xbc\x7c\x0f\xea\x78\x20\xb4\x75\x3f\x71\x78\x20\xb4\x1f\xe1\xa2\xd3\xc8\x73\xa6\x63\xfd\x5f\x12\x7d\x77\x1b\x5e\xad\xfa\xee\x65\xbb\x58\x76\x1f\xec\xb2\x1f\x57\x36\xae\xd8\xa5\x7d\xb0\x39\x53\x65\x8f\xfe\x10\xdb\xd9\x62\xdf\x3e\x13\x7c\x0f\x92\xe6\x65\x6c\x3b\xe2\xbc\x20\x64\x30\x38\x3c\x51\x7d\x17\x7b\xe1\x6f\xd9\x27\x12\xc3\xbc\x31\x01\x7c\x52\xfe\xde\x05\xdc\x3a\x60\x8f\xa7\x30\x07\xef\x3b\x6c\xee\x77\x28\x9b\xda\xcc\x3b\xee\xe5\xf6\x6c\xf2\x5c\x92\xfd\xb7\x63\xbb\x77\x19\xe6\x77\x9b\x3c\x6f\xd9\x04\x3f\x56\x87\xe7\x2a\x29\xf8\x85\x84\x1e\xef\x87\xb9\x44\xca\xe5\x0d\xc0\xee\x37\xf7\x57\x73\xd9\x38\xe7\x18\x14\xf3\x79\x5f\xfc\x00\xb7\x55\xcc\x25\xb2\x8a\x6f\x7a\xbe\xa1\xef\x71\xae\x9a\xc2\x5c\x6d\x52\xde\x58\xcd\x5f\x33\xe8\x07\x7c\xd7\x81\x7c\x58\xb6\x69\xdf\x4f\x33\xbd\x84\x37\xdb\x15\x63\xdd\xd0\xe0\xb9\x9c\x4f\xbf\x47\x1f\xf8\x40\xf9\x1a\xbb\xe0\xf3\x1d\xc0\xbc\x78\x25\xf7\xf1\xdb\x79\xa7\xc9\xff\x7a\x45\xc7\x04\xf0\xec\xc0\xdc\xf2\x16\xe6\xaf\x0c\xe6\x94\x19\xe0\xd2\x81\x79\xf0\x22\xa4\x0d\x61\xbe\xd4\xe5\x39\xe2\xd3\x1a\x44\x6f\x06\x1a\xc4\x40\xdb\x04\xe6\x9d\xaf\x54\xe3\x31\x51\xb4\x7c\x09\xdc\xb7\xc0\x2f\x91\xc0\xf8\x4a\xa0\x4d\x23\x35\x6f\x97\xbc\xeb\x8c\xff\xfb\x19\x9f\xa1\xea\xaf\x14\xde\x27\x20\x47\x90\x17\x06\x90\x2e\x83\xb4\x5d\xa0\xd3\x8b\x60\x1c\x76\xa1\xad\xd7\xf1\xfd\x11\xc5\x3b\x38\x76\x86\xf0\xdc\x87\x72\x44\x5f\x89\x9f\xe8\x2d\xca\x86\x0b\xb7\xcf\xf7\xed\xb5\x0d\xb4\xf9\x09\xf6\x19\x65\xd0\x2e\x49\x27\x3e\xaa\x36\xd4\x85\xf9\xdb\x0e\x1a\x9b\xf4\x97\x82\xec\xc3\xf1\x14\x2a\x79\x6b\xf0\xbb\x83\xcb\xbc\x04\xea\xc5\x3e\x8a\xa1\x8d\x3d\x98\x9b\x77\x94\x3f\x04\xeb\x78\x02\xf7\x75\x0a\x3c\x88\x3c\x1b\x43\xfd\x6d\x1e\x0b\x03\xf6\x61\x20\xbe\xcf\x86\x3c\x2f\x51\xfc\x37\xe2\xfe\x4a\x60\x7c\x21\xdf\x99\x74\xc7\x94\xee\x89\x80\x27\x62\x75\xdf\xe4\xf4\x29\x97\x1b\xb1\xcd\x9a\xc0\x38\x68\x41\x3b\xa4\x6f\xdb\x40\x83\x08\xfc\x6e\xc9\x14\x80\x34\x4b\x1c\xe3\x22\x05\xfd\x15\x43\xfb\x40\x87\x79\xc8\xf3\x1b\x7c\xbf\x7a\x06\xb0\xc2\xd7\x57\xc3\xbd\xeb\xbb\xeb\xb9\x33\xa1\xcc\x55\xf0\xcd\xf6\x94\x6c\xee\x2a\x59\x8f\xba\x52\x64\xc0\x2f\x39\x64\x7a\x4f\xe9\x5c\x18\x07\xb5\x05\xe0\x95\x65\x5e\xcb\x12\x5e\xd9\x02\xbf\x71\x0a\x6b\x6b\xbc\xfe\x67\xeb\xd8\x84\x32\x59\x76\x8f\x79\x70\x95\xaf\x26\xff\x55\x8a\x07\x52\xe0\xb7\x75\x90\xa7\xb1\xe2\xc3\x9d\xcc\x4b\x43\x9e\x77\x86\x13\xd2\x4c\x53\x8e\xbe\x9f\x26\x5f\xa2\xd2\xcb\xf3\x4b\x99\x4e\x6f\x67\x1d\x85\xbc\xfb\xeb\x2c\x73\xc5\x46\xfb\x1d\xa5\x47\x62\xe0\xeb\x17\x40\x3f\x6b\x7b\x40\xf4\xeb\xad\x80\x8b\xc8\x97\x5b\xf9\x2a\x32\x3a\x6a\x90\xf7\x3d\x9c\xe6\xf9\xaa\x4f\x40\x27\x78\x21\xf8\x56\x17\x61\x2d\x56\xd6\x2a\x96\x21\xcf\x32\xf0\xd1\x50\xc9\xa1\xd5\xe2\xbb\xf5\x25\x2e\xc3\x5a\xf5\x32\xa7\x3f\x05\x6b\x68\xcb\xa0\x87\x0d\x4d\xfe\x0b\xa4\x13\x3c\x37\xc0\x37\x9d\x28\x9d\xb6\xbe\x7d\x3d\x60\x1c\x97\xb8\x0c\xef\x7f\x15\xf4\x65\xa4\xd6\x10\x44\x6e\xea\x35\xf8\x91\x82\x4c\xe5\x89\x55\x3d\x31\xd0\x67\x04\xb4\x19\xaa\x72\x50\x97\x0b\xce\xb2\xa6\x75\x0b\x7c\x8f\xc0\x86\x4d\x15\x7e\x08\xad\x92\xba\x86\x4c\xd7\x0d\x45\x6b\xcc\x3b\x28\xc1\x4f\xd2\x22\x9d\x96\xd5\x77\xa4\xc9\x48\x95\xab\xf1\xc1\xfc\x09\x3c\x2f\x3b\xd2\xdf\xe2\xc0\x47\x20\x04\x1d\x3b\x52\xeb\x6f\x65\x34\x1f\xaa\x7e\xc2\xf7\xc2\x97\x9d\x92\xfc\x09\x3c\x67\x0e\xda\x57\xf5\xf1\x48\x8d\x11\x9e\xdb\xdc\x8f\x0f\x16\x1d\xbc\x86\x75\x48\xdf\xbf\xdd\x51\xb7\x0b\xca\xbe\x1d\x29\xc1\x53\xf7\x41\xea\x28\x0b\xeb\xcc\x1c\xef\x90\x7e\x4d\xf5\x6d\xb9\xa4\xbc\x4e\x05\x4f\x0f\x61\xbc\x56\xb5\x2f\x82\xfb\xae\x23\xdd\xf3\x15\xae\x19\x7c\xbf\xa3\xa4\x3f\x5d\xfd\x30\x02\x19\x85\xfc\x36\x98\xd0\xff\xae\x77\xef\x82\x67\xc9\x7f\xa7\x4a\x3b\x80\xd8\x05\x57\x1d\x2e\x7e\xcf\xe0\xbd\xa4\x3d\xce\xe3\xe9\xed\xf0\x6e\x00\x65\xbc\xdc\xc1\x6f\xba\xae\xf7\x2b\xde\x70\x8d\xad\x21\xf0\xe8\xa0\x84\x86\xfd\x29\x78\x34\x85\xeb\x60\x42\x7f\xbb\xe8\xa2\xdb\xa8\xf3\xa7\x15\xfd\xa4\xe5\xfb\xc8\xc1\x5b\x51\xc9\x18\x19\x3a\xf8\x7b\xc4\xfa\x0a\xcb\x41\x19\x9a\xa8\xb1\xe4\x1a\x1f\x65\xe3\x7b\x1a\xd9\x53\xf5\x6e\x08\x38\xc8\x73\x4f\xa5\xd5\x7d\x2d\xb0\xea\xc0\xb7\x0c\xb7\xfe\x14\x69\x06\x50\x37\x96\xf9\x53\x8a\xd7\xdf\x53\xc2\x2b\xae\x72\xf1\xf9\x29\x8a\x27\x5c\x3c\xae\xdb\xf3\x76\xbe\xbe\xaa\x82\xfe\xae\x3e\x28\xbb\x0a\xdc\x56\xc1\xfb\x3a\xcf\x2f\xa9\xb2\x2f\x72\xa4\x4f\x1d\x38\xbc\x7e\x4a\x5e\xa8\x92\xaf\x32\xb6\xe2\x8a\x31\xa3\xe9\x20\xf4\xed\x94\xf0\x94\x94\xeb\xb2\xad\x5c\xe5\xf6\x4a\xd2\xe9\x76\xb9\xda\xd0\x57\xb8\x2d\xaa\xf4\x7d\x85\x7f\xa6\x6c\xac\x41\x89\x4c\x1c\xc2\x1c\x19\xcb\xeb\xc2\x9c\x1a\xeb\xed\x41\xda\x0f\x38\x68\xd6\x83\xb1\x8e\x31\x04\x9a\xd7\x32\x25\x37\x4c\xda\xe7\x01\xdd\x5d\x3c\xb9\xb4\x3d\x16\x75\x1b\x48\xcc\x9b\xeb\x9b\xd8\x65\xe6\xfe\x33\x7c\xbf\x55\x92\x76\x69\xc2\xb7\x2a\x58\x2e\x81\xf5\x8a\x6f\x2e\xd0\x65\xfd\xfe\x94\xf9\x32\xe5\x1b\x95\xeb\x8b\xa1\x1f\xda\xe0\x9f\x89\xd5\x7e\x89\x4c\xc5\x61\x68\x7f\x55\xa6\xde\xa3\xbf\x2b\x76\x7c\xcb\x1c\xf1\x1c\xfa\x5b\xaa\x9e\xb1\xee\x23\x2a\x46\x45\x7c\x38\xa9\xc2\xd7\x55\x9e\xab\xec\xd3\x01\xdd\xbe\x69\xca\xcb\xc0\xe7\xa4\xf3\x27\x0e\x1f\xa0\xeb\x7b\x0a\xfe\x5c\x43\x93\x9b\x1d\x71\x31\x65\xf5\xeb\xb9\xb7\xc6\xc3\x45\xab\x69\xe0\xa5\x25\xe5\x62\x39\x1d\xf5\xfd\x75\x25\xf4\x4a\x2b\xca\xdd\x29\x5e\xa7\x0b\xcd\x1d\xa4\xd5\xfd\xa5\xe9\xaf\xe9\xd0\x77\xd0\xb9\x3b\xa1\x8d\xa1\x23\xdd\xe9\xd0\xe3\x74\x78\x36\x9e\x82\x37\x5d\xf5\xdc\x36\x45\xfd\x37\x97\x7c\xeb\x3a\x68\x19\x55\xd4\x5d\x85\x53\x57\xf9\x0d\x75\xfa\x69\x69\xa8\xfb\x11\xe9\xf2\x52\x48\xe3\xea\x7f\x57\x79\x61\xc9\x37\x7c\xf7\xaa\x92\x32\x5c\xe3\x78\x5a\x9a\x94\xf5\x37\xfa\x4f\x31\xbf\xf8\xab\x1f\xeb\xc8\x73\xdd\x14\xf5\x6b\x3c\x42\xd5\xfe\x2a\xfe\xbb\x61\x02\x3f\x4e\xcb\x03\xc9\x0e\xf0\xbd\x0e\xec\xcd\xae\x5a\x23\x1b\xaa\x75\xe9\x17\x83\x3d\xd4\x85\x3d\x33\x31\xf8\xa5\x35\xff\x8c\xa0\x1f\x32\xf0\xef\xa5\x6a\x3d\xb3\x0f\xf6\x10\xae\x33\x67\xb0\xde\xb5\xe2\x88\xe9\xc5\x78\xd8\x37\x80\xaf\x36\x56\xf5\x0e\xc1\x9f\x1a\xf3\xfa\x79\x06\xf4\xd2\x3e\x75\x04\xb4\xdf\x7e\xcc\xd1\x8e\x32\xd0\x65\xa7\x8a\xf7\x32\xf8\x1e\xa9\x74\x89\x7a\x17\x3b\xd2\x3c\xbd\xe4\xdb\xcb\xa0\x7f\x74\x7f\xb8\x70\x8c\xa1\xff\x5d\xe3\x5f\xee\xe7\x27\xb4\x17\x41\xc7\x06\xc4\x25\xed\xac\xa2\xfb\x34\x6b\xee\x52\xf6\xb3\x1d\xe3\xf0\x4c\xe0\xd9\x3b\x48\x9b\x94\xd0\x73\xb7\x61\xb7\xca\x7d\xd9\x59\xc2\x4f\xe3\x39\x89\xef\xce\x84\xe6\x3b\x05\xe1\xa5\x9b\xd5\xfb\x17\xf3\xf5\x8e\x1d\x96\x33\x0d\xe8\x18\x90\x69\xf2\x6b\xfc\x76\x2b\xed\x4e\xfa\xc1\xf5\xae\x0c\xef\xb3\xc5\xeb\xd9\x0e\xfa\xe4\x6c\xe3\x22\x50\x26\xbb\xf6\x1b\x5c\x7d\x23\xb8\x56\xed\x8f\x38\x93\xf2\x35\x68\xdd\xa0\xfb\x62\x9a\xb1\x7d\xb5\x7a\x3e\xb6\x83\x3e\xde\xc9\xb8\xac\x02\xb4\xd3\x70\x0e\xaa\x63\x15\x52\x88\x23\x39\x7a\x06\x38\x69\x5b\x54\x80\xfd\x16\xe3\xfd\xb4\x29\xd8\xf6\x18\x63\xa3\xeb\x40\x3c\xab\xe2\xd9\xbe\xdf\x51\x9f\x7e\xc6\xb2\x7e\xc6\x51\x87\xcb\x4e\xb8\x19\xfc\x8f\x03\xd8\xa7\xd6\x03\x5b\xae\x0f\x7b\x7a\xfe\x2b\xd4\xd7\x87\xf6\x98\x74\xef\x84\x78\x27\x89\xa1\x19\xc0\xfe\xa1\x81\x8a\x35\x84\x98\xbe\xf1\x73\xa2\xf6\x8f\x0d\x80\x9e\x7d\xc0\x2f\x86\x38\xb6\x37\xc2\x3d\xc6\x46\x0e\xa0\x0f\xd0\xbe\x19\x70\xdc\x4c\xa6\xfa\x52\xec\xaf\x01\xf4\x5b\x06\x76\xb3\xe4\x6d\xab\x18\xc6\x14\xec\xda\x58\xb5\xb9\xa3\xec\xd9\x9f\x01\x1f\x51\x54\xe2\xab\x4a\xc1\x16\xd5\x7b\x14\x32\x15\x27\x96\x2a\x9a\xe2\x1e\x3b\xed\x27\xc5\xf6\x0f\x80\x8e\xe6\xfb\x87\x21\x7f\x4f\xc5\xa6\x4a\x9b\x22\xb0\xe1\x63\xb0\xfd\xbb\x40\x0f\xe4\x31\x3d\x46\x24\x5e\xf4\x79\x9c\x4e\xd6\x0e\x22\x15\xc7\xf5\x0e\x48\x2f\x3c\xd0\x84\x67\x8c\x71\xc4\x98\xa5\x18\xf8\x26\xe1\xf9\x99\xa4\x6d\x43\x1f\x45\xaa\x4e\x0d\x4f\xd8\x41\xec\x4b\x55\x4c\x8a\xeb\xf9\xd5\x53\xc6\xbd\xb8\xee\x05\xbe\xaf\xb8\xb7\xf1\x0a\x5d\xd8\x3f\xfe\x29\xe0\xdd\x0e\x8c\xdf\x32\x60\x1f\xbc\xf7\x70\xd8\x73\x7d\x12\x7c\xf3\x06\xfe\x1e\xee\xb7\x60\x7c\xf6\x99\xae\x7d\x88\xad\xec\xc3\x58\x49\x8a\x33\x92\xb6\xc5\xb9\x6d\x71\x3d\x43\x28\xa7\x0f\xbe\xe0\x3e\xc4\x5b\xe0\xf8\x4d\xd4\x3e\xf3\xbe\x4a\x8b\xb2\xa3\xa7\xbe\x77\xd4\xdc\xb7\x0f\x73\x63\xd9\x73\xbe\xb2\x9d\x26\xe3\x72\x61\xde\x6c\xe3\xb4\xb0\xec\x4d\xb8\x7f\x96\xaa\xf3\xf5\x50\x46\x1f\xea\x97\xf1\xb0\x09\xbc\x8a\xed\x7d\x15\xe4\x19\xa8\xbe\x32\xef\x6f\x54\x65\x46\xaa\xec\x18\xca\xdb\x02\x7a\xa4\x0a\x9f\x1e\xd0\x65\x53\xc9\xd8\x9e\x92\xb7\xef\x57\x31\x30\x3a\x8d\x94\xd1\x53\x69\x52\xd8\x43\x9a\xaa\x58\xf0\x3e\xe8\xc6\x9e\xa3\xaf\xf4\xf7\x14\x62\x9d\x45\x36\x6e\x28\x9e\xc1\x3c\x7d\xc7\xb7\x04\xde\x65\xaa\x5f\x30\xc6\xbf\xa7\x74\xc2\x7f\x50\x78\xc7\x90\xe7\xdd\xd0\x36\x3c\x47\x06\xd3\xf6\x40\x17\x67\x2a\x36\xf0\xc9\xd0\x6e\x4d\x1b\x3d\x16\x5e\x5d\xf2\xfd\x87\xd5\x9e\x83\x1e\xc4\x27\xf6\xd4\xd8\xb9\x5d\xd1\x49\x9f\xb5\x21\xb4\x7d\xa7\xaa\x7b\x05\xfa\xa6\x07\xf9\x7f\x18\x64\x79\x5f\xf5\xd5\xbb\x15\x4e\x29\xd7\xdf\x81\x75\x45\x3d\xce\xae\x07\x3d\x76\x8d\x63\x1c\x0b\xbe\x6b\x6a\x3f\x86\xe0\x7e\x0d\x3c\xb7\x14\x5d\x5b\x1c\xaf\x2b\xf9\x2e\x87\x3e\x5e\x00\x7d\x3d\x0f\x6d\x40\x3b\xee\x47\x95\xaf\xea\x72\x48\xd3\x53\x3a\x1c\x79\x57\xec\xa7\x2b\xf9\x2c\x8b\x1b\x1d\xfe\xac\xa4\xb0\x85\x64\x7f\xb7\xc8\x0a\x4f\xe2\x45\x3f\x0e\xf8\xbc\x61\xbb\x6e\xb5\x7b\xd8\x97\xd9\x06\xdd\x50\xfe\x45\xc9\xf3\xab\x7c\xfd\x3c\x5f\xb7\xf8\x7a\x44\xed\x69\xef\x03\x7d\xdf\x06\x67\x18\xf4\x60\xdf\xfd\x6b\x14\xdf\x64\xbc\x7f\xa6\xe7\xe0\xdd\x41\xf1\xce\x9b\x85\xf5\xd6\x17\xb2\xdd\x3c\xeb\x18\x77\x23\xc5\x6b\x3d\xe0\x99\xae\xb2\x43\x25\xdd\xad\x90\xae\xab\xec\x93\x97\x01\x1f\x62\x9f\x75\x00\xdf\xc4\xf1\x2d\xe5\xbc\x31\xd4\x8b\x7b\xdc\xbb\xb0\x9e\xa0\xf7\xc2\x63\xf9\x5d\x75\xf6\x40\x47\xed\x0f\xe9\xc2\x19\x0c\x4b\xbc\x27\x28\x76\xe4\xc3\x32\x75\x79\x03\xb8\xcf\x94\x7f\x36\xe5\x33\x21\x52\xa0\x63\xa6\x6c\x8b\x9d\xc4\xeb\x46\xe0\x83\x9e\x26\x6e\x57\xbf\x6b\xed\xa0\x9e\x2a\xd8\x49\x19\x21\xf3\x28\xbe\x4b\x4f\xb3\xde\xe7\xec\x02\xee\x65\x70\xd5\x2e\xd8\x9f\x1d\xb0\x2f\xf4\xd9\x10\x1d\xb5\xc7\xc9\xe5\xfb\x2a\x03\x1c\x93\xd7\x80\x1e\x8b\xd9\x1e\x5c\x67\xde\x5a\x86\xb4\x23\xa5\x93\x9a\x0e\x5d\xa1\xf5\x5a\x4f\xbd\xcf\xe0\xfd\x5b\xa0\xde\xae\xd2\x9f\x1d\x87\xcc\xe8\xa8\x71\x8f\x3a\xaf\x0d\x38\xbc\x49\xd1\x66\x89\xe9\xd9\x01\x59\x83\xf9\x79\x0c\x58\xf9\x25\x67\x68\x6d\x39\xce\xc5\x40\xfa\x66\x0a\x5e\xce\xe7\xe5\xae\x2b\xff\x42\x08\xfc\xd9\x83\x79\x4c\xc4\x57\x93\xf6\xa9\x80\x3f\xf3\xb1\x37\x98\xb0\xb7\xa3\x6a\x8e\x52\x96\x1e\xef\xe3\x33\x2c\xa3\xec\x7d\xac\xea\x48\x54\x5d\x91\xa3\xfe\xb8\x04\x8f\x58\xad\x61\xb8\xf2\x21\x20\xfe\x19\x9f\x11\x92\x42\xda\x14\xf8\x20\x52\x32\x33\x56\x7e\x00\x8d\x6f\x5a\x82\x47\xec\x90\x41\x38\xe7\xce\x78\x3f\x1c\xca\x2e\x17\x3d\xb0\xdc\x3b\xe1\x3e\x54\xed\xd3\xed\xd7\xe5\x85\x25\x79\x34\x8d\xf0\x5d\xa8\xde\x85\x25\x6d\x4c\x1d\x34\xd7\xf5\xbb\xbe\xb9\xd2\xea\x72\xca\x70\x29\xa3\xb5\xa6\x73\xec\xa0\x6f\x59\x19\x65\x74\xd5\x79\xa5\xbc\x57\x54\xd0\xdb\x55\xb6\xab\x2c\x17\x9d\xca\x70\x14\xc8\x00\x87\x76\x49\xfa\x18\xd2\xba\xfa\x41\xd7\x15\x56\xf4\x19\xbe\xff\x51\x47\xde\x17\x71\x0c\x9c\x2e\xbf\x8c\x77\x5c\x7c\x17\x29\x3d\xe4\x4a\x17\x42\xdb\x23\x58\xcf\x8e\xe1\xbd\xce\xe3\xa2\xad\x8b\x27\xcb\x70\xaf\xe2\xff\x32\x79\xa3\x21\x2b\x91\x1b\xba\x6d\x37\x28\xb9\x58\xd6\x16\x7c\xaf\xe3\x11\xaa\x64\xa0\xa6\x6b\xe4\x90\xaf\x31\xcf\x8f\x5c\x79\xaa\xe8\x76\x3d\xd8\xa3\x93\xe8\x1b\x37\xe8\xd4\xe7\x4a\x68\x15\x39\x6c\xbe\x18\xe2\x27\xe4\xdd\x75\x4a\x96\x96\xb5\x39\x84\x34\x65\x34\x89\x54\x5f\x4d\xa2\xdb\x24\x5a\xa7\xaa\xdc\x49\x7d\x52\xf6\xad\xac\x0f\xaa\xbe\x6b\x3a\x61\xf9\x62\x53\x5d\xc9\x73\x29\xdd\x8e\xb2\x71\x17\x57\x7c\x7b\x95\x83\x6e\x4f\x54\x3a\xf1\x16\x07\xff\x97\x8d\xcd\xaa\x31\x99\x96\x8c\x3d\xbc\xd7\x31\x27\xae\x32\x2e\xab\x68\x67\x38\x41\x16\x7f\x8f\x1a\x77\x8f\x71\xd0\x66\x5e\xf1\x66\x0c\xe3\x4c\xcf\x47\x1c\x7c\x75\xea\x5b\x25\xfc\xe8\xea\xfb\xaa\x71\x8d\xfd\x96\xf1\x1a\x19\xe2\xd2\x85\x38\xf1\x4d\x7e\xdf\x57\xf3\x8a\xd4\x21\x9b\xc5\xef\x25\x63\xbd\x07\x71\xec\x3d\x5e\x2b\x84\x33\xf8\xc6\xe5\xa1\xff\x04\xfb\xe8\x05\x40\xcf\x36\xd8\x5a\x31\xec\x73\x16\x5d\xa7\x63\xd7\x52\xb0\x97\xa5\x9e\x8f\x29\x3d\xe2\xe2\x5d\x5d\x06\xdc\xdb\x33\x28\x86\x3b\x18\xef\x2e\xbe\xd6\xe3\xdf\x65\x5f\x6b\xde\xc2\xb4\x2e\x9b\x5c\xd7\x89\x76\x75\x1b\xe8\xe0\xe2\xfd\x58\xf1\xad\x96\xf9\x31\xf8\xd7\x62\xa5\x57\xf4\x3a\x0c\x96\xdf\x56\x7a\x44\x70\x49\x4a\x74\x55\xd9\xd8\xd5\x65\xc7\xaa\x6d\xba\xbc\xa8\xa2\x1d\x1a\x48\xe1\x1f\x4d\xa8\x17\xbf\x65\x8a\x1e\x91\x83\x26\x89\x4a\xd3\x2d\xe9\x4b\x81\xe7\x41\xbb\xe2\x92\xb9\x9b\x2e\x37\x71\xd8\x46\x2e\xdc\x91\x5e\x89\xe3\x8c\x80\xb6\x83\x16\x1d\x78\xef\xea\x7b\x59\x77\x7b\x72\x49\xba\x04\xca\xd1\xba\x58\xf3\xf1\x24\xda\xb9\xf8\xed\x3a\x85\xc7\x24\xde\x6c\x3b\xea\xd0\x78\x97\xf1\x74\xbb\x82\xae\xae\x7a\xcb\xfa\x01\xcb\x73\xd1\xc1\x55\x9e\x8b\x46\xb1\x6a\x43\xd9\x78\xd6\xb4\xd1\x34\xd0\x6d\xd3\xf5\xc9\xb7\x27\x38\xf8\x01\xdb\xf1\x5c\xb5\x1e\x5e\x86\x67\x19\xed\xb3\x92\x31\xa1\xf9\xa9\x8c\xc6\x98\xe7\xfa\x12\xba\xba\xfa\x64\x9a\xbe\xaa\xaa\x6b\xd2\xb8\x77\xf1\x93\x7e\xd6\x31\xc0\x99\x83\x96\x65\xf4\xe9\x4e\xa8\xc3\x85\xd3\xf7\x3b\xd2\x47\x30\x9e\xaa\xe8\x5f\xd5\x27\x9a\xaf\xe3\x12\x59\x3f\x4d\x3f\x27\x8a\x36\x7a\xdd\x1f\xf9\x27\xac\xe0\x29\x29\xef\x56\x47\x7f\xba\xc6\x82\xa6\xe1\x4b\x14\x8d\xaa\xe4\x6b\xcc\xe7\x80\xe9\xb2\xc3\x09\x7d\xe3\x1a\x83\x38\x16\x6f\x71\xf0\x42\x3a\x65\xdf\x97\xc9\x37\x4d\x53\xb4\x27\x91\xf7\xba\x8e\xb2\x6f\x98\xc0\xef\xd3\x8c\x9d\xb2\xf1\x24\xcf\x97\xc1\xbb\xd4\x51\x76\xab\x82\x8f\xaa\xc6\x79\x15\x2f\xea\xef\x7a\x8f\xcb\xb7\x95\xe4\x35\xcf\xaf\xad\x18\xdf\xc8\x3f\x55\xb8\xea\x78\x15\xcd\x3f\x55\x7d\x5d\x25\xb3\x26\x8d\xb1\xe3\x15\xb2\x0f\xf9\xb0\x8c\xae\x65\xe3\x47\x9e\x5f\xe1\x90\x35\x65\x78\xba\xda\xe4\xaa\xa3\xa7\xce\x63\x8a\xf9\x7c\x7f\x62\x9f\x13\xc6\xa2\x48\x9c\xd2\x7b\xc0\x4e\x4a\x60\x7d\xe2\x52\xbe\x7f\x06\xe4\x7b\xb2\x3a\xe7\xe8\x65\x6a\xce\x14\xb1\x0f\x3f\x06\x7f\x42\xa2\xce\x4e\x12\xbb\xed\x7a\xf8\x26\x7b\x46\xaf\xe5\xf9\xf0\xed\x2a\x7d\xa6\xce\x1b\xea\xc1\x3c\x0b\xe5\xc1\x22\xcc\xc3\x74\x2c\x58\x5f\x9d\x27\xd6\x03\xda\xdd\x08\x63\x3f\x86\x79\x52\xa6\xe6\x73\x93\xe6\xe5\xb7\xa9\x72\xf0\x0c\xb0\x84\xd7\x7c\x9e\xc2\xdf\xb0\xfe\x8e\x23\x6e\x33\xe5\x58\x0b\xbd\xff\x24\x56\x67\x26\xa6\xb0\x27\x5d\xea\x7d\x1e\x94\x81\x7e\xc0\x5e\x85\x6f\x5e\xdb\xf9\x55\xdf\x5f\x3b\xe1\x3b\xae\xd9\x3d\x8d\x63\x0c\xab\xd2\x23\x48\x5f\x4b\xfc\xc8\x55\xfc\xff\x14\x29\xff\x6f\x47\x0b\xd6\x77\x5d\xb1\x76\xb8\x76\xce\x31\x43\xf2\xdf\x2b\xe3\x18\xa2\x91\x8a\x8d\xe9\xf1\xfe\x7a\x5c\x6b\x5b\x66\x7c\xa4\x8c\x48\x9d\x17\x28\xf5\x6e\xf2\xf3\x12\xc4\x77\xf5\x55\xfc\x48\x1f\xe2\x63\x3e\xac\xe2\x38\xbb\x2a\xae\x52\xaf\xfb\x0d\x80\x8f\x31\xfe\xe3\xa7\xf9\xfb\xa7\xc0\x0f\x11\x41\xff\x4a\x5b\x57\x54\x4c\x54\x1f\xd6\xc6\x13\x38\x0f\x33\x53\xdf\x30\x9e\x4a\xc7\xd8\x20\xee\x88\xa3\xd0\x6e\xc3\xd1\x86\x3e\xc4\x9d\x60\x3b\x32\xe8\x4f\x53\xdf\x4d\xb0\x4e\xa9\xe3\xbb\xfa\x80\xef\x40\xad\x6b\xa6\xdb\xfb\x7c\x5b\x0c\x43\xa6\xc6\x48\x5f\xa5\x1d\x38\x70\xd5\x31\x50\x3d\x15\x0f\xdb\x87\xff\x73\xd1\x31\x1e\xa9\x8a\x79\xe9\x97\xc4\x6f\x0c\x54\x3b\x06\x10\x6b\x3c\x54\xff\x93\x11\x39\x62\x88\x53\x38\x93\x2b\x56\xe5\xf4\x20\xae\x75\xa0\x78\x37\x81\xfb\x25\x85\x07\xb6\xe7\x27\x21\xae\x38\x02\xdc\x06\x25\xf9\x3b\x2c\x1b\x32\xa8\xfb\x31\x0a\x67\x1d\x5b\x8d\xef\x8e\x38\xf0\x43\xf8\x35\xf8\xde\x53\x72\x00\x62\x6a\xbc\x9f\x80\x78\x38\xe1\x8b\xa1\x3a\x5b\xb1\x07\xb2\x93\xff\x6f\xeb\x7e\x6b\xff\x31\xc4\x66\x62\x59\x1d\x87\xaf\xa9\x4c\x3f\xe0\x7b\xf9\x2f\xd0\x5f\x60\xbf\x5f\x07\xce\x63\x8b\x95\x9e\x11\x7f\xe0\x7f\x86\xf7\xa2\x4f\x8e\x38\x6c\xb2\x04\xf8\x40\xde\x35\x61\xbc\x24\xf0\x1c\x3a\xee\x9b\x20\x03\x44\xaf\x34\xe1\x8a\x10\xaa\xbc\x11\xb4\x41\x97\x89\xe9\x45\x46\x35\x1d\x69\x64\x2f\x77\x13\x6c\x4b\x2c\x5f\xe7\x09\x59\x96\xe0\x7d\xe8\xb0\x95\x9a\x60\x8b\x68\x68\x3a\x68\xf1\xf3\x25\x69\x42\x65\xcf\xb4\xd4\xf7\x08\xf0\xd4\x6d\xd7\x65\xe0\xbb\x54\xe1\xd7\x54\xb6\x53\xe2\xc0\xb5\xa3\xe2\x8b\x62\x47\xec\x52\xa2\x70\x4b\x20\x7d\xa4\xfe\xe3\xe7\x16\x07\x7e\xc8\xc3\xba\xfe\xa6\xc3\x4e\xd0\xf4\x41\xfb\xb4\xa5\xea\x0e\x1d\xf7\xae\xfe\x0d\xc1\x57\xe6\xc2\xad\x05\xf5\x09\x74\x1c\x74\x68\x95\xf4\x7f\x56\x82\x0b\xd6\xd1\x57\xf5\xb8\xda\xd1\x52\x6b\xc2\x2d\x47\xfd\x91\xea\xa7\x88\xe7\x73\x2e\xba\x61\xb9\xba\xee\x08\xca\x73\xd1\xef\xe2\x12\x3c\x35\x4d\x9b\x8a\x0e\x09\xd8\xa9\x65\xf1\x68\xc8\x8f\xa9\x83\xaf\x5a\x8e\x74\x52\xd7\x25\x25\xf5\x6b\x7e\xd0\xed\xd2\xef\x13\x47\xff\xea\x3e\xd4\x65\xeb\x76\x34\x95\xbd\x99\x39\x78\x58\xe7\x69\x95\x8c\xaf\x2a\x5c\x43\xc7\xbd\xe0\x76\x09\xac\x07\x24\x20\xf3\x75\x59\x2d\x90\x65\x91\x43\x2e\x96\xd1\xb0\x05\x7d\x12\x3b\x78\x2b\x56\xe3\x52\xf3\x71\xe8\x98\xb3\x95\xc9\xd1\x50\xc9\x2c\x57\xbb\x23\x88\x31\x6b\x55\xd8\xff\x2e\xda\x87\xea\x7b\x4b\xd5\x89\x6d\xd4\x63\x43\xd7\x95\x38\x64\x62\x02\xf9\x23\xe8\x0b\x4d\x1f\xe9\xbb\x17\x4c\xc1\xb7\xed\x92\x34\xba\x9e\x08\xce\x4d\xd6\xf2\xa2\xac\x8e\x8b\xa1\x8f\x5b\xaa\xdf\xf4\xd8\x6d\x41\x79\x2d\xc5\x57\xad\x92\x73\xd5\x5d\xed\x71\xf1\x39\xca\x35\x3d\x56\x5c\x7c\x88\x7c\xa7\x65\xa1\xce\x5f\xc6\x23\x2e\x7e\x4f\x1d\x3a\xa6\x59\xd2\xef\x2d\x47\xda\xc4\xd1\x26\x91\x8b\x9a\xd7\xb4\x2c\xd0\x6d\xd0\xed\xd1\x34\x4a\x4a\x68\xe4\x6a\x5f\x4b\x8d\xab\x32\x99\x54\x35\x2e\xca\xfa\xd2\x35\x9e\x11\xbf\x76\x89\x6c\x47\x99\xe4\xc2\x3f\x82\x35\x7d\xac\xe3\x46\x07\xdd\xcb\x68\x56\xc6\x4b\x09\xd4\x8d\xf1\x9f\x9a\xa7\x51\x7e\xe9\xe7\x76\x45\x3b\x34\x4f\xb4\xa0\xfc\x50\x8d\xb7\x32\x3e\x9f\xc4\xbf\xba\x8f\xf5\xd8\x71\xf1\xb6\xab\x7c\xbc\x5e\xe3\x18\x6b\x2e\x3a\x26\x0e\x3a\xb5\x14\x1d\xcb\x74\x48\xe6\x68\x57\x8b\xd7\x22\xb4\xfd\xe3\xc2\xd1\xc0\x0f\x38\xe8\x53\x26\xab\xda\x15\xf6\x0f\xc2\xd3\x1c\x3c\xaa\xe5\xb6\xd6\x79\x82\xef\x33\x27\xc4\xde\x6b\xb9\xd0\x62\x1f\x8e\xe0\xf7\x12\x07\xee\x2d\x90\x3f\x21\xe0\xaf\x75\x54\x4b\xb5\x31\x2c\x19\xe7\xae\xbe\xd2\xdf\xdb\x53\xec\x21\x68\xa9\xf4\x5a\x16\xf6\x1d\xb2\x5d\xeb\x8d\xb6\x83\x17\x75\x1d\x99\xa3\x0c\x84\x6b\x15\x3e\x28\x6f\x70\x6c\xb6\x1d\x34\xd5\x36\x8a\xd0\xf3\x2d\x90\x27\x52\x74\xd6\x34\x76\xf1\xc6\xb3\x95\x5d\xd2\x56\x63\x51\x9e\x17\x1c\x6d\x6f\xc3\x38\x0d\x15\x1d\x5a\xd0\xae\x10\xea\xd0\xd7\x14\x9e\x31\xee\x27\x82\xbe\x69\x43\x1f\xc5\x1c\xdf\xfc\x58\x7e\x1e\x2a\xdf\x41\x02\x7e\x9f\x11\xf8\x0e\x22\xf0\xd5\xa7\xca\xee\x15\x1c\xde\x00\x76\x5f\x87\xfd\x14\x89\x8a\x55\x68\x43\x3f\xa3\x4c\x16\xbf\x4a\xc8\x79\x9b\xd0\x26\xa9\xf7\x6d\x80\xa3\xd0\xe5\x56\x90\x1b\xe8\x77\x48\xc1\xdf\x9d\x41\x1d\x29\xf8\xfe\x25\x66\xe3\x39\x9c\x66\x9d\xed\x33\x5c\x57\x79\x3d\xe0\x2b\xbe\xc0\xcf\x02\x2d\x35\x74\x94\xac\x98\x57\xdf\x5b\x8e\xfb\xd6\x84\xf5\x22\x2c\x6f\x52\x5e\xd7\xb8\xd1\xe9\xf5\x7b\xd7\x73\x57\xf9\x73\x84\x66\x77\x02\x2d\x45\xc6\x5d\x04\xe9\x7a\xea\xfc\xac\x44\xf9\x58\x75\x3c\x58\xa6\xfc\xaa\x61\x71\x1d\xef\xcb\x66\xf0\x9a\xe0\x2b\xc6\xff\x88\xe8\xa8\x78\xb9\x18\xfa\x36\x2e\x89\x49\xc5\x33\x1a\x71\x6d\xec\xd9\xc0\x4b\x98\x7e\x50\x42\xe7\x8e\x1a\x3b\x1d\xe0\xed\x84\xd7\x21\x62\xb5\xb6\xd3\x51\x31\x26\xcf\xe3\xff\xf0\x9e\x2f\xfe\xd7\x7e\x4c\xb7\xae\xda\x6f\x83\x67\x87\xe9\xf3\x20\x06\x0e\x3f\x6b\xe6\xb8\xcf\x80\x8e\x03\xf0\xa5\x77\x61\x4d\x8f\xe9\xea\x27\x8a\x46\xff\xa9\x41\xf4\x8f\xd0\xe6\x54\xad\x01\x62\x9f\x26\x8a\xc6\xba\xef\x53\xf5\xcd\x55\x96\x96\x39\x3a\x8f\xab\x0f\x63\xf5\xec\xe2\xbb\x54\xe5\x77\x7d\x4b\xd5\x99\x0f\xba\x4c\xcd\x53\xfa\x9d\x2e\x57\x7f\x73\xad\xc3\xc6\x6a\xdd\x2f\x55\xeb\x33\xba\xfd\x51\x09\x1d\x13\x07\x4d\xca\xe8\x95\x96\xc4\x72\xb9\xda\xe8\x02\x4d\xdf\xb8\xa4\x1f\x31\xed\x6f\xc1\xf7\xeb\x54\xfb\xf5\x55\xcb\xd6\x58\xb5\xd5\x85\x0b\xb6\xf1\x32\x45\x5b\x4d\x7f\x17\x7d\x62\xa0\xad\xce\xab\x79\x4c\xe3\x81\xf8\xeb\x3e\x2e\x83\x49\xdf\x35\xdf\xc4\x3c\x2f\x2a\xeb\x63\x2c\xf3\x8e\x0a\x9a\xba\xca\x9d\x06\x87\x9d\xe0\x3c\xac\x18\x33\x08\xb7\x94\x94\x5b\x45\x3f\x2d\xdb\xab\xc6\x59\x55\x5b\x35\xbf\x4e\xd3\xb6\x2a\x19\x53\x86\xcf\xb4\xfd\x9e\xec\x80\x37\xaa\xea\xd0\xe7\xc9\x56\x8d\xf1\x3b\x78\x3f\x7a\x59\x1f\x4c\xc2\xb1\x2a\xcf\x4e\xc7\x40\xd9\xb8\x99\x96\xe7\xa6\xc5\xab\xaa\xbe\x49\x7d\xd0\x72\xd0\x73\x52\x19\x65\xcf\x93\xc6\x67\xcc\x67\xae\xbb\xde\xff\xca\x0e\x69\x33\x6d\xbf\x21\x6f\xe8\xf3\x92\xa7\x95\x6d\x55\x34\xd4\x7a\xe1\xb6\xd3\xe0\x11\x57\x59\x55\x63\x2a\x71\xd8\x85\xd3\xd0\xde\x05\x2e\xd9\xa2\x65\xff\x34\xed\x28\xa3\x49\x0c\xb6\x9a\x2b\xef\xe9\xe8\x94\x6c\x0a\x1c\x5c\x78\x4c\x93\x67\xa7\xf4\x2b\xab\x0b\x69\x17\x4d\xd1\x76\x17\x3f\xbb\xe8\x38\x09\x8f\x69\xe5\x95\x2b\x3e\x3c\x76\xe8\x8d\x2a\x7a\xb8\xce\x1f\x2f\xa3\x79\x58\x61\x7b\xc4\x53\x8c\xc3\xb2\xb9\xea\xe9\xc0\x24\xbe\x2d\xa3\x4d\x32\xe1\xfb\xe9\xd4\x5f\x25\x6b\x77\xfa\xae\x8c\xbf\xa6\x1d\xcf\x65\x65\x4d\x1a\x83\x93\xd2\x96\xbd\x7b\xd1\x14\x6d\x71\x41\x7f\x87\xf4\x70\x7d\x4f\xe0\x7f\x45\x77\x93\x97\xa6\x95\x89\xbb\x09\xd3\xe2\x10\x9d\x26\xbd\x4f\x17\xa7\xaa\x73\xcc\xcf\x14\x50\xa6\x5e\x07\x76\x4c\x59\xfa\x69\xce\x54\x9f\x04\x3a\xee\x68\x1a\x1a\xb8\xe4\xd6\x4e\x79\xc1\x65\xcb\xc4\x20\xab\x33\xe6\xe5\x10\xea\x7c\x63\x83\xe8\x3f\x6e\xf7\x45\x8d\xe7\xc8\x91\x4a\x9b\x82\xdf\x52\xa7\x47\xdf\x6e\x15\x94\xa5\x41\x5f\xf3\xcb\xa0\xbc\x9e\xe3\xcc\x21\x4c\xff\xf4\x92\xf7\x7a\x7d\x08\xeb\x8e\xc0\x07\xa4\xd3\x22\x64\x8e\xf2\x5c\xe5\x86\x8e\xf5\xe1\x4c\xf5\x6b\xa4\x74\x9b\x6b\x9d\x2b\x76\xc4\xf0\x68\xda\x61\x1e\x7d\xb6\x48\x59\x9b\x33\xf0\xd9\xa5\x2a\xcd\xcd\x8e\x7c\x91\xc3\x57\x1f\x2a\x5f\x61\xa8\xf6\x1b\xe8\x7e\xbd\x41\xf9\x18\x90\xa6\x49\x09\xcd\xb1\x6e\x1c\xbb\xa3\x92\x74\xc8\x77\xcf\x52\xeb\x24\x48\xa7\x18\xd6\x07\xe2\x12\xfa\x61\x99\x6d\x28\x1b\xbf\xdd\xc6\xcf\xf8\xdf\xb5\x6d\xb5\x66\xe0\x5a\x53\x42\x1e\x49\x15\x2d\x43\xc0\x05\x69\x1b\x29\x7f\x97\xab\x4f\x22\x88\x3f\x46\xbe\xd3\x7d\xa1\xcb\xd2\x7d\xea\x5a\x13\x2a\xeb\x8b\xc8\x71\xf6\xc4\xd5\x0e\x7a\xc7\x25\xf8\x63\xbf\x5d\xe3\xf8\xe6\xea\x5f\x57\x99\x2e\x3a\x47\x6a\xfd\x23\x52\xe3\xe0\x88\x2a\x3f\x81\x31\xaa\xdb\x1c\x41\x3c\x71\xe4\xa0\x93\xee\x6f\x5c\x37\x6e\x2b\x1d\x5a\xc6\x1b\xb1\x03\xc7\x50\xc9\x6d\xcd\x17\x37\x29\xbe\x75\xd1\x22\xae\x88\x57\x49\x1c\xb8\x5c\x07\xf7\x97\x43\x1b\xba\x8e\xb4\x65\x7d\x19\x39\xda\x5c\x35\x26\xe4\xfd\xb5\x8e\x34\x9a\xdf\xca\xf8\xa3\x0a\x50\x36\x48\x3c\xf1\x08\xde\x75\x81\xae\x57\xb1\x3f\x6e\xe0\xf8\x5f\xa7\x18\xd2\xcb\x7e\x90\x55\xf5\xfd\xf7\x4b\xf2\xb8\x7c\xd5\x3f\x08\xcf\x89\x4a\x77\xb3\xd2\xd7\x29\xac\x27\xe1\x78\x46\x1d\x3c\x98\x42\xb7\x86\x4a\xce\xb8\xf4\x77\x58\x52\x57\x59\xbd\x51\x85\x6e\x8e\x27\xe8\xb0\x2a\xfc\x7a\x0e\xfd\x15\x41\xbc\xa6\x6e\x73\x55\x3d\x19\xc8\xdd\xb8\x41\xde\xfa\x0e\xed\x45\x84\xf0\x34\xed\xcf\xde\x2e\xd8\x75\x02\x57\x9f\x66\xbe\xb3\x09\xd3\xf8\x1e\xaa\xda\xbb\xc4\xd7\xdb\x1c\x3e\xb2\xb2\xf2\x76\x82\x8f\x06\xed\x23\x9e\xa6\x0c\xbd\x56\xa2\x21\xab\xf0\x89\x57\x95\x9d\x96\xc8\x9b\x58\xc9\xfd\x33\x6d\x73\xac\xc6\xa6\x0b\x7e\x4e\x3d\xe3\x5c\xa2\x55\xd2\x37\x78\xdf\x07\x1a\xb8\xf6\x61\x2d\xb2\xbf\x3d\xdd\x21\x64\xa7\x91\x67\x5a\x48\x1c\x32\x58\x43\xff\x0c\xca\x76\x5d\xa7\xc9\x53\xf6\xac\xdf\xeb\xff\xd3\xd8\x09\x5e\xa7\x53\xef\x34\x65\x55\xa5\x99\xa6\xee\x49\xe5\xea\x35\x6a\x57\x1a\x1d\x83\x31\x0d\x8e\xb1\xe3\x3f\x65\xa7\xa5\xc3\x34\xb4\x9c\x96\x1f\xda\x53\xa4\x9b\x16\xbf\x45\xb8\x7f\xc1\x84\x32\x7b\x3b\x68\xc3\xd0\xf1\x5d\xf7\xb3\x2e\x23\x63\xfb\x26\x51\xb6\xb7\x4e\xa7\x6d\xf8\xb4\x44\x06\xb8\xf2\x26\x0e\x1f\xa6\xfe\x76\xeb\x04\xbc\x75\xfb\x71\xfc\xc7\x53\xd2\x27\x85\xb6\xa6\xaa\xad\xae\xb3\x38\xb0\x0f\xf4\xb7\x32\x3a\xc5\x10\xf7\x93\x82\x8c\x5f\x2e\xe1\x05\xb4\x7b\xb1\x4d\x1d\x5e\x53\xc3\xf8\xe0\x84\xdf\xe3\xff\x6d\xe0\xde\xeb\xbe\x9a\x47\xe0\xfe\xf1\x17\xc0\x3c\x1b\xe3\x2c\xba\x6a\x5f\x79\xa8\xce\x87\x08\xd5\xfa\x4f\xaa\xe2\xaa\x52\x4e\x83\xff\xd9\x8c\xfe\x15\x49\xd7\x52\x71\x6d\x49\x4e\x57\xbb\xb7\xb9\x57\xf0\xaf\xd7\xc8\xdf\xd9\x7d\x90\x06\x9e\xca\x76\xfd\x9f\x40\x9f\x75\x1c\xfb\x27\x57\x95\x0c\x1a\xf2\xff\x9d\xe3\xfb\xa1\x8a\x4b\x92\xff\x54\xc1\xff\xc6\x59\x06\x3b\x95\xff\x1f\xc6\x3b\x1f\xe8\xb9\xc4\x7b\x33\x43\x38\xab\x38\xe5\xb8\xda\x0e\xc7\x8b\x45\x60\xcf\x0f\x55\x5d\xb8\xb7\xb4\xa7\xf0\x92\xf2\x24\x56\x01\xdf\x8d\x54\xbc\x55\x17\xf6\xb7\x62\xf9\xb8\x5f\x7b\xa0\xf6\xda\x0e\x60\xbf\x72\x4f\xed\xc7\x4f\x95\x0c\x31\x6d\xff\x64\x89\x0d\x8f\xf1\xa0\xed\x29\x6c\x7e\x57\x9e\x49\xf9\x74\xdc\xba\xab\xbe\xaa\xb2\x74\xdc\xea\xb4\xdf\x5d\x78\x4e\x9b\x2e\x54\x31\xb3\x3a\x6f\x19\xfe\x2e\xdc\x5a\x53\xd0\x25\x54\x34\xc2\x3a\xde\xc4\xd7\x1b\x1c\xf8\xb4\x55\x0c\x6f\x59\x9b\x77\x02\xae\x98\x70\xdd\x3e\x17\x6d\x04\x9e\x5e\x82\x97\x8e\x37\x9e\xf4\x4e\xe3\x14\x2a\x9c\x04\x34\x5d\x74\x59\xd8\x86\x67\x94\xb4\xcb\x15\x0b\x5d\x06\xcf\x2d\x29\xbb\xec\x59\xe3\x86\xb2\x16\xaf\x7c\xae\x84\xfc\xbf\xbd\xd7\x52\x71\xa5\x7c\x56\x84\x4d\xd3\x55\x7b\xf9\x45\x06\xfd\xb3\x3a\xcf\x40\x9f\xdb\x2e\xf1\x9f\x8f\x07\xf9\xde\x87\xff\xd7\xc9\x54\x5a\xc9\xfb\x4e\xbe\xde\xc1\xef\x5e\x02\x32\xb0\xaf\xfe\x5b\x05\xfc\x01\x63\x9d\xf5\x24\xd0\x37\x68\x3f\xb4\x41\xbf\x68\x1b\x60\x1a\x5b\x4e\xe0\xaa\x8a\x6f\x51\x89\x6d\x53\x55\x5e\x15\xc4\x0a\x47\x03\xcf\x87\x3e\x8c\xd4\xb9\x09\x29\xd0\x77\x08\xef\x9b\xea\xdd\xd0\x71\xf6\x7e\x0a\xe7\x74\x22\xf4\x95\x8e\x11\x9f\x1c\x96\xa3\xf3\xfc\xa4\x7a\x4e\xd5\x19\x07\x43\x78\x96\x72\x97\xa0\x5c\xd4\x75\xa8\x0b\xab\xa0\x5f\x72\x9f\x96\xe0\x2a\xba\x6c\x08\x6d\xbf\xa2\x22\x6d\xdf\xf1\xbe\x5f\x52\x6f\x5f\x7d\x4b\x54\x1b\xf0\x3c\x91\x21\xf4\xc1\x90\xe9\xf1\x46\x35\x96\xfa\x30\x97\xd1\xe5\x2f\x41\xda\xa1\xca\x37\x50\x65\xf7\x54\xba\xae\x9a\x2f\x85\x15\x79\x52\x75\x8e\x07\xf2\xd0\x71\xa8\xf7\x0e\x75\x9e\xcc\x40\xb5\x43\x97\xdb\x73\x9c\xc1\xd2\xe3\x76\xe9\xfa\x86\x8e\xbc\x3b\x85\x01\xd8\x81\x4b\xaa\x5d\xba\x6c\xdd\xaf\x3d\x3e\x33\x67\x08\xf2\x0c\xdb\x14\x41\xde\x04\xfe\x13\x15\xcb\x44\xbf\x36\x9e\x49\xd4\x04\xdb\xb4\xa7\xe6\x3f\xd3\x42\x04\xf6\xf7\x6f\xc0\x1c\x20\x52\x6b\x5b\x91\xc3\xa6\x88\x94\xce\x6d\x29\x3f\x7d\xa2\xbe\xeb\x72\xda\x6a\xde\xd1\x86\xb5\x14\x2c\x47\xeb\xd9\x48\xad\xbb\xb8\xca\xd5\x7b\xa2\xda\x30\x1f\xc1\xf4\x2d\x85\x83\x2e\x37\x84\x3c\x3a\xad\xb6\xc5\x5a\x7c\xde\x50\x4b\xd1\xa7\xa5\xca\x75\xed\xd3\xd2\x6d\x0f\xd5\xbe\x8b\xb2\x36\xb7\xf8\xff\xfd\xf4\xbe\xad\x48\xe9\xb0\x50\xf5\x65\x02\x69\x35\x0d\xb1\xec\x10\xca\xd1\x69\x12\xb5\x4f\xad\x05\x69\x5b\xaa\x7d\xba\x3f\x5c\xcf\x9a\x46\xfa\x5b\x0b\xf0\x6e\x29\x9a\x60\x5f\x24\x53\x94\xd5\x76\xe0\x15\xc2\xde\xa0\xe7\x3a\xe8\xe1\xe2\xaf\x1f\xab\x28\xab\x0d\x36\x54\xa4\xbe\x25\x25\x76\xad\xc6\x45\xda\xf3\xef\x55\xba\xc8\x61\xcb\x45\xb0\xc7\x35\x52\xdf\x92\x0a\x7b\x50\xf3\xe5\x24\x7c\x74\x5b\xcb\xa0\x0d\x32\x40\x97\x95\x38\xd2\xc7\x15\x38\xe2\xb7\xcb\x1c\x74\xd6\xf9\x74\xf9\x9a\x17\xda\x8a\x57\x5b\x25\x36\xb6\xb1\x99\x96\x1d\x36\x71\xa8\xfa\x16\xe7\x48\xfa\xb9\xec\x5d\xe8\x58\xd3\x9c\x94\x3e\x04\x9d\x10\x57\xe4\xef\x3a\xd6\x4c\x63\xde\x9b\xa9\xeb\x2d\xab\x47\xaf\xa9\xe2\xfb\x54\xad\x2b\x94\xb5\xa5\x2c\xbf\x7e\xef\x4a\x8f\xef\xfa\x25\x74\xd6\x65\x27\x25\x69\xca\xd2\x97\xc1\x26\xaf\x1b\xaf\x72\xdd\xef\x55\x7e\xb8\xce\xf6\xb9\xd1\x98\x47\x63\xb8\x17\x5b\xd5\x35\x66\xe2\x92\x31\x16\xab\xb2\x62\xf5\x4d\xd7\x81\x80\xb1\x6b\x4f\x55\xf5\xe8\x7c\xae\x6f\xb1\xb2\x1f\x5c\x63\x1e\xaf\x9d\x92\x31\xec\xc2\x59\xe3\xef\xaa\xc3\xd5\xb6\x96\xea\x97\x18\xc6\x76\xac\x64\x6b\xea\x48\xdf\x52\xf5\xeb\xbe\x90\x6f\x3f\xed\xe0\xe7\xd0\x81\x47\x5a\xc2\x67\x6d\x95\x1f\x6d\x17\xc4\x25\x55\xf9\x52\x07\xef\x6a\xdf\x4b\x5b\xe1\xa2\x75\xba\xa6\x73\xd5\xb8\x76\x95\x1d\xc3\xb9\x77\x78\xfe\xdd\x08\xee\x8f\xc0\x1c\x24\x81\xff\x02\xec\xaa\x7d\x97\x23\xb0\xc9\x87\x90\xa6\x0b\x7e\x82\x2e\xcc\x25\xba\x60\x4b\x74\x2b\xe6\xc5\x5d\x95\xde\x94\xfb\x52\xf8\x3f\xc3\x54\xfd\xaf\x5b\xaa\xfe\x87\x33\x51\xff\x1d\x31\x50\x7e\xe3\x9e\x3a\xa7\x51\xcf\xf5\x53\xf0\x87\x8f\xa0\xdd\x68\xab\xeb\xe7\x57\x42\x3b\xae\x28\x99\xaf\xeb\xb9\x7e\xb7\x64\x4e\xaf\xe7\x53\xae\xff\xdf\x73\xad\x93\xb8\xca\x2b\x83\xd7\x2a\x19\xa0\xfb\xc0\x85\xbb\x2b\xcd\x91\x12\x1f\xc9\x85\x8e\x76\x9d\x89\xaf\xc3\x05\x11\xe0\xa4\xd7\x76\x74\x7f\x96\xf5\xc1\x6e\x43\x58\xe2\x37\xda\x29\x2e\xae\xbd\xfd\x67\x02\x65\xf4\x98\x84\x9b\xab\xcf\xab\xd6\x29\xf1\x3b\xee\x6f\x96\xf1\x77\x91\xa3\x8c\x69\xd6\xfd\x25\xcd\xb3\xa7\xc4\xdb\x45\xc3\x8c\xd7\x04\xa7\x59\xbf\x74\xed\xcd\x4e\x61\x4d\x51\xbf\xd7\x6d\x46\xb8\xa9\x64\x1d\x37\x9c\x82\x06\xda\xef\x98\x41\x7f\xba\xf2\xe8\x36\x5f\xaf\xda\xa4\xf3\xb8\x68\x94\x4d\xa0\xc5\x35\x50\x7f\x54\xc2\x23\xba\x9c\xa4\x24\x6d\xc2\xf1\x78\x65\xf4\xce\x4a\xf0\xd7\xfc\x8c\x67\xd6\xa5\xe0\x13\x76\xf5\xf1\xcd\x8e\x7c\xba\x9d\x7a\x5d\x52\xec\xe9\x14\xea\xd1\x79\x33\x8e\x6d\xca\x94\xbe\x49\x54\x7f\x65\x7c\x6e\xb8\x5e\xf3\x44\x9c\x42\xf5\xdf\x58\x19\xfc\x1f\x75\xaa\xf0\x73\xb5\x43\xaf\x3d\x3f\x5d\xe1\x30\xc9\x47\x74\x3a\x50\x55\xee\xb4\x90\xa8\x72\x3a\x8e\xf2\x75\xbf\xc4\xd0\xb6\x2a\xdc\x52\x47\xda\x27\xed\x32\x0d\x26\xc1\x2b\xa7\x48\x13\x29\xdd\x8c\xf0\x76\xbe\xee\x74\x1f\x4d\x13\xca\x8c\xe0\xaa\xfb\x2d\x55\xfa\x53\xf7\x87\x1e\x77\xbb\x41\x37\xdd\x4e\x57\x7d\xb1\xe2\xe9\x3b\x1c\x7d\xee\xca\xb7\xd3\x98\xc2\x32\xba\x57\xf1\x54\xaa\xd6\x92\xca\x68\x5a\x55\xee\x0d\x8e\xb8\x91\xf8\x34\xfa\x5a\xff\x97\xf0\xa4\xf6\xe9\x98\xc4\xa4\xe4\x5e\xd3\x56\xbe\x3d\x0b\x9e\x5d\x6d\x9f\x86\xd6\x9a\x76\x65\x38\x48\xd9\x1d\xe0\xb7\x2a\x9a\xea\xb2\x93\x92\x33\x39\x76\xe2\x4b\x2f\x6b\x1b\xce\x33\x34\xfe\x38\x67\xab\x8a\xeb\x9d\x34\xee\xca\xd2\x27\x8e\xf4\x65\xed\x29\xa3\x19\xbe\x73\xc5\x31\xbb\xe0\x3a\xc5\x73\x55\xf4\xd2\xb8\x6a\x5a\xba\x7c\x1c\x02\x19\xe0\x8e\xb2\x31\x55\x63\x23\x51\x78\x69\x7b\x4b\xd7\xad\xe9\x95\x28\x19\xa6\xf9\x5f\x9e\x07\xea\xbd\x4b\xaf\xe8\xbe\x76\xf1\xb6\x8b\x47\x6f\x9c\x20\x4b\xe4\xdd\x73\x4b\xe4\x9d\x8c\x8d\xee\x04\x3e\x70\xe1\x51\x95\xbe\xac\x8c\x32\x9e\xd3\xe7\x4a\x95\xd1\xcb\x55\x66\x52\xf8\x2a\xc6\xff\xb5\xbd\x57\x70\xa6\x73\xae\xb2\xfc\x3b\x7d\x5f\x05\xcf\xda\xc7\xf6\xea\xf1\x54\x56\x86\x6b\x5e\x75\xb6\xf0\xd2\x69\xcb\xf0\x71\xe1\xa6\xc7\x6d\xd5\xb8\x48\x21\x4f\xa8\x74\x47\x02\x3e\xab\xbe\xfa\x2f\x91\x24\xf7\x2f\xdb\x78\x99\x4d\x5e\xf7\x16\x9f\x91\xf8\xcd\x5e\xcc\xfe\xe7\x0c\xe4\x69\x08\x71\x36\x29\xf8\xeb\xde\x0a\xb1\x37\xf3\x5c\x7e\x07\xfc\x63\x23\x78\xbe\x0b\xf0\x41\x7a\x74\xf8\xff\x1d\x06\xea\x7f\x84\x62\xf0\x6f\xad\xf3\xbb\x77\xf3\x35\x83\xb4\x99\x23\xf6\x5a\xf0\xc6\xf7\x23\xc8\x9b\xc2\x3d\xfa\xcf\x22\x5e\x5b\x4c\x2b\x7c\x58\xf8\x3e\x74\xd4\x5b\xe6\x4b\x73\x95\xf5\x6a\xf5\x1c\x2a\xbb\x49\x3f\x63\xfd\x21\x94\x2d\xff\x9f\xa2\xf7\x0d\x48\xda\xb6\xc2\x61\xa4\x68\x80\x3e\xee\x97\x36\x88\xde\xc7\xf7\x23\x90\xef\x1d\xa0\x79\x0c\x34\x13\xfa\xe1\x7f\x25\x6b\x3a\x77\x00\xc7\x08\xf8\x5c\xbe\xdf\xaa\x68\xf9\x72\xe8\x7f\xf4\x81\x47\x6a\xce\xa0\xed\xd4\x57\xab\x71\x95\x41\xbe\x4c\xcd\xc3\xab\xd6\x61\xb4\x3f\x3f\x55\xf7\x65\xfd\x5f\xf5\x0d\x9f\x9f\x0e\x7d\x87\x73\x1f\x3d\x57\x8e\x55\x3b\x63\x87\x4d\x5e\x66\x4b\x69\x7a\xc7\x6a\x2d\x2a\xab\x98\xdf\xe9\xf2\x64\x1c\x5f\x03\xef\x9e\xed\xb0\xbf\x62\xc7\xdc\xeb\x1a\x87\x0d\x95\xa8\x7d\xd1\x69\x89\xfe\x7d\xab\xa2\xa1\x9e\x63\xa5\xb0\xde\x9d\xb0\xff\x66\xc5\xd1\x96\x9f\x55\xfc\x13\x6d\x8f\x71\xf1\xe6\x0a\xbc\xbd\x96\xb2\xef\x62\xb5\xee\x39\x09\x74\x3d\x92\x17\xe3\x29\x86\x8e\xb4\xba\xfc\x37\xc3\xfd\xa6\xa3\xcc\x4d\x96\x8b\xae\xba\x12\x58\xbf\x74\x8d\x9b\xc8\x61\xcb\xba\x70\x77\xb5\x39\x51\xcf\xae\xff\x2b\x8b\x15\x8f\x9d\x2e\xdd\x22\x90\x31\xd8\xcf\xf2\x4d\xef\xe5\x4e\x01\xc7\x1f\xae\x28\x53\x8f\x81\x69\x71\xd1\xe3\x59\xde\xe3\x1e\x93\x49\x75\x4e\x9b\xa6\xac\xee\x49\xe9\xbe\xc7\xd1\x6f\x4b\x90\xb7\xbd\x83\xb6\x46\xea\xac\xfe\x74\x02\xed\xd2\x29\xda\xd7\x76\xe0\xe1\x4a\xaf\xfb\xb5\xed\xe8\xf3\x2a\x9a\xe0\x78\x0b\x2b\xd2\xa6\x0e\x5c\x92\x29\xe9\x9d\xaa\xb8\xa4\xb6\x03\xb7\xb6\x2a\x4b\xd7\x95\xb2\xed\xa4\x75\x5c\xea\x28\x0f\x75\x7e\xbb\xa4\x7c\xdd\xe6\x32\x1e\x6a\xab\x98\x14\x8d\x9f\xae\xbf\x0d\xb6\x65\x9b\x6d\x36\x8c\x73\x0c\x0b\x99\x6e\xcf\xd8\x45\x7f\x32\xfa\x82\x7f\x9e\xf1\xef\xab\xb9\x6e\xa6\xec\xe1\x84\xf7\xa2\xfc\x2a\xe0\xbd\x02\xf7\xf7\x40\x19\x38\x2e\x71\x8e\xdc\x75\xd8\xff\x99\x92\x4f\x19\xd8\xd1\x31\xfb\xba\x3b\x90\xaf\xa7\x6c\x8c\x44\xe1\x2d\xdf\x5c\xff\x31\x5b\x06\xd1\x0e\xd2\xba\xf2\xea\xfc\xae\x67\x81\xeb\xe1\x7b\xe4\xf8\x5e\xf6\xde\x85\xa3\x2b\xdf\x0d\x2a\xad\xf6\x25\x18\x7e\x60\xb8\xdf\xd8\x42\xfd\xaf\xed\xc5\x8e\xb2\x7d\x13\xf5\xbe\x03\xf5\xbe\xa6\x41\x74\x54\xe5\xed\xc2\xb5\x0b\x73\x86\x0e\xf4\xef\x50\xa5\xe9\xa8\x67\xb4\xc9\x32\xd0\xe3\x7a\xde\xa6\xd3\xe2\x73\x47\xc5\x00\x74\x54\x5b\x32\xe0\x53\xa4\xcb\x92\xa3\xbd\x9d\x92\xb9\x2e\xd6\xd1\x29\xa9\x33\xad\xc0\xdb\x55\x0f\xd2\x50\xea\xe9\x2a\x48\x1c\x71\x0f\x9a\x8e\x1d\x47\x1a\x57\x1c\x81\xae\x2b\x52\xb4\x4a\x1d\x65\x89\x9c\xd3\xf4\x7b\x33\x94\x97\x38\x70\x4f\xf8\xdc\xf9\x54\xc9\x88\x4c\xa5\x75\xf1\x4f\xea\xa0\xbb\xa6\x71\xa6\x70\x46\x5c\x32\xc7\x7b\xdd\x6f\x38\x77\xd7\xe3\xa0\xa3\x78\x11\xcb\xd3\x7d\xab\x79\x3e\x75\xec\x65\x0e\x95\xbe\xcd\x4a\xc6\x81\x8b\x86\xba\x4c\x1c\x2b\x2e\x1a\xa6\xa0\xbf\x75\x3b\x3a\x8e\x31\x11\x43\xf9\x31\xfb\x9b\xba\xe0\x5b\x44\x3a\xba\xe4\x07\xf2\x5a\x06\x32\xa3\xab\x7c\x08\x1d\xa5\x37\x52\xc5\x7b\x9a\x66\x09\xf0\xa7\x8b\x07\x90\x17\x5e\xa9\xda\x85\xf4\xc1\xbc\x7a\x6c\xdd\xac\xfc\xd9\x7a\x9c\x74\x94\xac\xe9\x3a\xe8\xd7\x81\xf1\xd1\x61\x9f\x2e\xd2\x00\xcb\xe8\x28\xbe\xed\x2a\xfe\xea\x2a\xba\x74\xd5\x9a\xaf\x4b\x1e\x69\xbe\xd5\x7d\xd3\x56\xf5\x66\x6a\x3c\x76\x55\xbf\x48\xde\xdb\x1d\xf4\xd0\xba\xbe\xab\x70\xee\x3a\xe8\x28\xeb\xe4\xdf\x0b\xf9\x5d\x7c\xd4\x55\x36\x45\xaa\xe8\xa6\xfb\x1d\xc7\xa0\x6e\x17\xca\x81\xac\x44\x26\x6a\xda\xa5\x4a\x47\x86\x4a\x0f\x69\x48\x1d\xbc\xab\xfb\xaf\xa3\x64\x88\x96\x11\x5d\x47\xdf\x25\x0a\x47\x9d\x56\xd3\xdc\x25\xeb\x63\x47\x5f\xe0\x18\x4e\x54\xdd\x22\x23\x6e\xe7\xf7\xaf\xe1\xeb\xeb\x95\xed\x9b\x28\x59\x23\xf5\x34\x15\x4d\x91\x77\xf5\xd8\xe9\x2a\x5e\x89\x14\x3f\xc5\x0e\x99\xdd\x05\xff\x55\xe2\x90\x87\xd8\x6e\x8c\xc9\xba\x55\xf9\xa3\x5c\xe3\x0b\xfd\x42\x5d\x35\x16\x5f\x5b\x22\x9b\x53\x87\x5c\x4e\x4a\xc6\x68\xaa\xe8\x90\x2a\xfe\xd1\xbc\xa3\xaf\xb7\x3a\xec\xeb\xb4\x24\x8e\x45\x8f\x13\x4c\x23\xcf\x47\x54\xba\xc4\xd1\x2e\x97\xac\xd4\x72\x25\x06\xde\x4e\x95\x3e\xd2\x63\xa9\x0b\x7a\x10\x7d\x61\xd7\x43\x19\x5d\xd0\x8d\x31\xfc\x27\x8e\xae\x5b\xeb\x3c\xad\x33\x23\x87\xef\x33\x55\xfc\xa8\xaf\x1d\xd0\x37\xa9\x43\x3e\x62\x39\x91\xd2\x4d\x5d\xa0\x87\x4b\xae\x77\x14\x3d\x74\x9e\x18\xe6\xf9\x7a\x9c\x0a\x1e\x2d\xe5\xb3\x4f\x54\x1f\x97\xf5\xbf\xee\x8b\xac\xc4\xc6\x12\x3a\xff\xb8\x4a\xab\xc7\x7d\x04\x7d\x18\x39\x6c\x0f\x4d\x73\xd7\x18\xd0\xb2\x5f\xcb\x97\x18\xfa\x31\x84\xf7\x6d\x25\xe7\x71\x8c\x5c\x0e\x7c\xd3\x75\xd8\x23\x7a\xac\xa5\x4a\x2e\x74\xd4\xbb\x58\xe9\x91\xae\x43\x46\x69\xd9\xa3\xdb\x1e\xab\xf2\x52\x25\x7b\x35\x5f\x75\x1c\x32\xad\xab\xf0\xd6\x73\x39\xfc\xf6\x4a\x65\xa7\x37\x79\x9d\x21\xe3\xf8\xb3\xb6\xa2\x91\x96\x47\xa1\xea\xa7\x96\xa2\x51\x0a\x76\x6c\x57\xe9\xb8\xeb\xf9\x2c\xe7\xa3\x90\xff\x05\x80\xdf\xcb\x38\x7f\xcb\x31\x4e\x53\xfe\xef\x2a\xad\xb3\xb2\x92\x71\xfb\x53\x8a\x6f\x74\x3e\xed\xbb\xd6\xe3\x58\xd3\x34\x75\xc8\x65\xf3\xed\x85\x40\xaf\x97\xab\x3e\x7a\xad\xa3\xaf\xdb\x8e\x79\x00\xfa\xa4\xd1\xcf\x8d\xe9\xf4\xfa\x84\xf6\xd1\xcb\x9a\xc8\xd3\x20\x6e\x42\xc6\xc6\xc0\xa1\x97\x5c\xfa\xaa\xcb\x67\x01\x6b\x39\x29\x69\x56\xf9\xbe\x0f\x3c\xd4\xe5\xf9\xb1\xd6\x03\x5d\xe0\x81\x69\x61\x27\xe9\x35\xde\x2e\x39\xdf\xd9\x41\x59\xba\xbc\xaa\xba\x76\x02\x98\xb7\x5f\x92\x26\x53\xcf\xbd\x0a\x5d\xdf\x05\x3e\x2e\xab\xf3\x56\x28\xb7\xaf\x78\x79\xe8\xa0\xcd\xe9\xb4\x0f\xe5\x53\x58\xd2\x17\x65\x80\xfa\x2c\x56\x73\x4b\x9d\xa6\x07\x6d\xa9\xe2\x0f\xed\xb3\x71\xd5\xa9\xcb\xae\x4a\x33\x9c\x92\x0f\xb0\x2c\x57\x1e\x4c\x37\x89\xce\xad\x0a\x7c\x27\xd1\xb3\xab\xe4\x92\xd6\x1f\x65\x34\xbb\xd2\xc1\x87\x55\xf5\x21\x3f\xc6\x0e\xfe\x8c\x95\x3d\xf6\x64\xb8\xef\x94\xcc\x09\xcb\xea\xec\x40\xff\xbb\xf0\x88\xd4\x7f\xe9\xe9\x72\x52\xa5\xd3\xbb\x20\xbf\xf4\xfc\x73\x04\x34\xc1\xf9\x81\x8b\xe7\x27\xd1\x58\xdb\x87\xf2\xfd\xf5\x8a\x3f\x53\x85\x83\xd0\x6e\x04\xdf\x97\x14\x5f\x2f\x4d\x29\x0b\x34\xfe\x65\xe3\xab\x5b\xd2\x9f\x89\x1a\x6f\x09\xc4\x29\xe3\x59\x14\x29\xd8\x04\x5d\xc7\x18\xd4\x7c\x9c\x2a\xda\x97\xd1\x42\xe0\x07\x61\x6c\x68\x1d\xac\xfd\xdc\xb1\xb2\x0f\x63\x35\xd7\x7a\x9e\x6a\x77\xa2\x70\x49\x95\x1c\x49\x94\xdd\x17\x3b\xea\xd2\x7e\x7a\x7d\x1e\x37\xe2\x14\x29\x1d\x1f\xab\x77\x99\x43\xaf\xbb\x74\x7d\xac\xe2\x48\xe2\x06\x79\x2b\x8e\x7d\xaf\xae\x78\x8a\xb4\x64\xff\x62\x59\x8c\xc5\xb3\x54\xda\xc8\xb1\x5f\x11\x6d\xf0\xa7\x3b\xf6\x19\xb6\x1d\x69\x4f\x07\x64\xde\x17\xb2\xdd\x88\xdf\x32\x47\xf9\x1a\xd7\x08\x62\x4a\x52\xc8\x97\x9e\x26\x6e\xa9\xca\xa3\xf7\x56\x6a\x5a\x96\xc5\xb0\xb8\xd2\xa5\xca\xd6\x0e\x15\x9e\x37\x97\xe0\x3c\xe9\xb9\xac\x1d\xa9\x83\x27\x5c\xfd\x8b\xdf\xd1\xc6\x74\xd5\xe3\x7a\x97\xaa\x72\xa2\x09\x65\x60\x5d\xba\xec\xc8\xd1\x77\x7a\x7d\xd6\xb5\xee\x1c\x82\x5c\x98\x44\xb3\x54\xcd\xf9\x5d\xe9\x52\x07\x7e\xa1\x63\x0d\x58\xe7\xc3\xeb\xd3\xa7\xa4\x61\x5c\x91\x4e\xde\x5f\xe3\x18\x07\x9a\xce\x2e\xfa\x95\xe1\x1b\xaa\xf5\x9d\x8e\xfa\x9f\xc3\x14\xf6\xc7\xeb\xb9\x92\xd0\xef\x9e\x92\x6f\x91\x9a\x53\x48\xdf\xf4\xf8\x7f\xc7\x47\xd0\x6e\x6d\xe3\xa1\x6c\x0e\x79\xfd\x33\x86\x98\x1e\xc9\x77\x04\xc6\xb9\xc4\x1a\x3d\x59\x9d\x77\xfe\x5c\x96\x0b\x3d\x1e\xc7\xaf\x00\x79\x7e\x05\xbf\x1b\x82\xfc\x6d\xc2\xbc\xea\x2d\xa0\xb7\x42\xb0\x59\x52\xb5\x2e\xde\x83\x71\x95\xa8\x33\x69\x12\xf5\x4d\x83\x5e\xf3\x16\xba\x0e\x2a\xf2\x4c\x02\x5d\xa6\xd4\x8f\x67\x6b\x76\x14\x5e\x7a\x5c\x24\xaa\x3f\x32\xf5\x5d\xfb\x06\x5c\x6d\x70\xe9\x5c\x79\xb7\x0a\x32\x10\xdf\x67\x25\x71\x00\xda\xbf\xe2\xf2\x35\x65\x0a\xbf\x32\x7c\x5c\xb8\x67\x13\xf0\x76\xf1\x7e\xcb\x61\x5b\xa4\x15\xfd\xe0\xa2\x11\xe6\xd1\x31\xb6\xf2\xfd\x27\x54\x5f\xb8\xe8\xef\xc2\xcf\xf5\x2e\x53\xb6\x8b\x8b\x6e\x65\xb4\x98\x04\xba\x6d\xda\xf7\xe9\x4a\xe7\xf2\xc3\x55\xd1\xd4\xc5\x27\xfa\xbb\x94\x79\xa9\xc3\x97\x59\x86\xcf\x08\xee\x63\x55\x4f\xdb\x51\x4e\x56\xc2\x97\xb1\x03\xd7\xb2\xba\x5d\x78\xa5\x25\xed\x73\xf5\xd7\xa4\x32\xca\xf8\x41\xf3\x8e\x6b\x6c\x65\xf0\x5f\x3f\x58\x46\xe8\x28\xfb\x74\xcf\x52\x9f\xc4\xaf\x65\xfd\xf5\xd2\xd3\xac\x43\xcf\x47\xb0\xcf\xa6\xa9\xb7\x0c\x5c\x34\x39\x13\xb8\x59\x3d\x77\x14\x8e\x7a\xcd\x2b\x55\xfc\xd9\x9d\x92\x4f\x62\x5e\xaf\xd6\x73\x30\x17\x44\x70\xaf\xff\x8b\x5a\xbe\xff\xe0\x84\xb2\xaa\xe8\xc4\xe3\xc5\x5f\xd8\x65\x5a\x9e\x83\x73\x20\x10\xf1\xde\x1b\xd7\xbc\x5b\xe0\xa2\x12\x9f\x86\xe8\x26\xf4\xe1\xa2\xfd\xda\x55\x3e\x8f\xcc\x11\x7f\x10\xa9\xf5\xad\x32\x1c\x70\xdd\x28\x56\x6b\x04\x98\x66\x92\x5f\x61\xf1\xfe\xdf\xbd\xe8\x0c\x69\xb8\xdb\xb2\x2e\x55\x67\x70\x0e\x94\x8f\x50\xc7\x43\xf6\x95\xff\x25\x05\xdd\x11\x71\x9b\x23\xe5\x9b\x6a\x83\xcd\x9f\x40\x79\x28\x2f\x23\xae\x3f\x83\xb2\xb4\xbf\x27\x63\xfc\xae\x81\x77\x1d\x35\xe7\xc2\x3c\x3d\xf6\x0d\xa2\xff\x30\x52\xf6\x85\xbc\x1b\xaa\xbc\x1d\x85\x5b\x0c\x38\x8b\x2d\xfe\x73\xaa\x2d\x2e\x9c\x65\x8e\x77\x15\xc7\x05\xa7\xaa\x3c\xc9\x3b\x84\x7a\xe5\x7f\xb5\x1a\xc0\xfb\x58\x47\x0c\xfc\x2f\xcf\xf8\xdf\x79\x09\xe4\x49\x81\x27\x43\x3e\xef\x30\x83\x74\x11\x9c\x53\xdf\x57\x76\x58\x0a\x7b\x6c\xf4\x5a\xae\xcb\x66\xc5\x77\x3d\x15\x07\x24\x38\xe1\xb9\xd1\x09\xbc\x1f\xa9\xb9\x52\xa6\xec\xc9\x32\x7b\x33\x83\x33\xb3\xe4\xfa\x4a\x68\x1b\xce\xaf\xf4\xdc\x26\x85\xb3\x76\x7b\xea\x3b\xce\xcd\xf4\x18\xaf\xf2\xa1\xa0\x6c\x9a\x06\x5e\x35\xc1\xaf\x73\xba\xe0\xf2\x4d\xe8\x3a\xf0\xfb\x1b\x2b\xfc\x1e\x3b\xb9\x8f\x26\x8c\x89\xb4\x62\xbc\x9e\x29\xb8\xda\x9e\x54\xa4\xad\xc2\x7d\x1a\xd8\x09\xfe\x8f\x3f\x83\xb2\x76\x9b\x4e\x93\x68\xb8\x1f\x79\xa7\x29\xe7\x74\xe8\xe0\xea\x7f\xd7\x3b\xe4\x87\x96\x03\x0f\xb9\x9f\xab\xe0\xa9\x32\xfc\x13\xd8\x6f\x59\x56\x6e\x59\x39\x71\x89\x6f\xb1\xaa\xfe\x56\xc9\x7d\x3c\x81\x0e\x21\x94\xfd\xc3\x8e\xfc\xae\x76\xed\x54\x2e\xa5\xbb\x24\xdf\xd0\x7e\xe9\x94\xc4\x92\x96\xc1\x7b\xa7\x4c\x37\x4d\x99\x31\xfc\xc7\x5e\xba\x03\x7f\xc0\x6e\x40\xd5\xbc\x79\x27\x10\xa9\x67\xd7\xfc\xde\x35\x97\xd5\xf3\xe4\xbd\x84\x4b\xce\x30\x3f\xfa\x3b\x5a\xaa\x5d\x65\x74\x9d\x86\x1f\x76\xc2\x87\x3b\xe5\x19\xb4\xc9\x4f\xa7\x9d\x65\x20\xfd\xd8\x6c\x10\xfd\x27\xbe\x7f\x3a\x7c\xd7\xff\x61\x18\x2b\xbb\xa8\xa7\x78\xa9\x0b\x72\xcb\xbc\xfb\x10\xd8\x52\xed\x0a\x9f\xac\x86\x97\xef\x20\xed\x5e\xc0\xb4\xf8\x3c\xd0\xf0\xde\x4d\xd0\xfe\xd5\xb3\x09\xcf\x83\xfb\xef\xde\xe7\x3e\xbf\xea\x01\x40\xfb\x2a\x78\x75\x71\x6f\xff\x93\xed\x67\x21\xa6\x64\x1d\xe6\x75\x5d\x47\x9c\x74\xaa\xe4\x5e\xac\xfc\x9a\x65\xf2\xe2\x7b\xf9\x1a\xaa\xf3\x36\x84\x47\xfa\x2a\x26\xe8\x1d\x10\xd3\x28\x69\xf5\x7c\x33\x85\xf5\xfe\x04\xec\x8c\x14\xee\x2f\xe3\xef\xcb\xec\x3f\xbd\x81\xdb\x28\xb4\x30\xf3\xd9\x3b\x19\xf7\x16\xe4\x4b\xd4\x19\xc3\x09\xe0\xbb\xa1\x62\x4f\xba\x6a\xff\x08\xfe\x27\x8c\x96\xaf\x06\x7e\x04\xe6\x8f\x11\xf8\x2b\x24\x4e\xf6\x9d\xaa\x8d\x11\xd4\xb7\x00\xff\xa1\x1d\x02\xdd\xd1\xb7\x25\x79\x04\xef\x17\xf0\xfd\xf3\xa1\x0d\x91\xf2\x9f\x1c\x81\x33\xfb\x31\xde\x15\xe5\xb7\x5e\x8f\x8a\xe0\x9b\xe8\x1c\xb4\x01\x97\x00\xcf\x0e\xfc\x57\x4a\x02\xf9\x23\x47\x7d\xa1\xe2\x27\x59\xd3\x39\x0a\xfb\x57\x52\xe8\xf7\x90\xdb\xdd\x84\xfe\x48\xe0\x7e\x92\xae\xdd\x2d\xdb\xe8\x74\x75\xf5\x34\x70\x64\x17\xcb\x7b\xd9\x2e\x94\xb1\x1b\xeb\x48\xbb\x01\x2e\xfb\x26\x02\x5f\x22\x42\x4f\x8d\x95\x08\xfa\x5f\xfb\x66\x5c\x90\x38\x7c\x39\xa9\xca\x1b\x3b\x7c\x3d\x2e\x7f\x50\x06\xcf\xfa\x7c\x9d\xb0\x22\x5f\x59\xb9\xf1\x84\xf7\x65\x69\x5c\x65\xea\xf9\xd7\xa4\xf2\xca\xca\xd7\xed\xd0\x73\xb2\x9d\x96\xbb\x9b\x30\x4d\xbb\x5c\xff\x01\xd1\xde\x41\x1d\x51\x49\x59\x9d\x92\xf4\xc9\x1e\xb5\x3d\x01\x59\x5f\x46\x8f\x2a\xfa\xb8\xf0\xac\x3a\x27\xb2\x2c\xbf\xe6\x03\x5d\x6e\x74\x9a\x74\xd1\xfa\x2a\x06\xbd\x34\x6d\x5f\x23\xbc\x7a\x8a\x34\x97\xa9\xef\x2e\xfa\x3d\x73\xca\x7a\x2f\x71\xbc\xcb\xa6\xa4\xf3\xe9\x8c\x2b\x4d\x97\xf4\x34\xce\x31\x3e\x5d\x28\xeb\xdb\xf3\x4a\xde\xbf\x48\xd1\x42\xe8\x71\x5d\x49\x5b\x5c\x34\x9c\x96\x6e\x7a\x8c\x4c\x4b\x4b\xc1\xe5\x29\x0d\xa2\xc7\x42\xdd\xfa\x7f\x67\x5c\xb8\x95\xc9\x0c\x17\xe8\xf2\x2e\x99\x32\x9f\xab\xfc\x32\xba\xe9\xff\x85\xd1\x6d\x6d\x29\xfc\x35\xbd\xca\xda\xbb\x13\x79\xe1\xfa\x5f\x1a\x19\x5f\x4f\x52\xef\xa5\x1d\x4d\xf8\x9f\xaa\x49\x7c\xe1\xe2\x49\xdd\x6e\x57\xfe\xb2\xff\xf4\xc1\xf7\xed\x29\xda\x2f\xfd\x76\xd9\x84\x3a\x5c\xe5\xbb\xf8\x28\x51\xdf\xa3\x09\x7d\xe8\xe2\x05\x9d\x7e\xc1\x51\x6e\xec\xf0\x1d\xc7\xca\x87\xec\xaa\xb7\xc5\xb1\x9f\x2e\x5c\x26\xf5\x93\xab\xed\x6d\x85\x73\x19\xcf\x55\xf5\x89\xd6\x0f\x65\xff\x0f\x55\xd6\xcf\x55\xff\xf3\x84\xfc\x5a\x86\xa3\xce\xd7\x52\x38\x5d\xa3\x68\x9e\xc0\x7c\x47\x78\xfd\xff\xd7\x20\x4f\xef\x7d\xa8\x5a\xbb\xc0\x77\xae\x75\x3f\x7d\x9d\x66\xcd\xc6\x95\x4e\xdb\xb5\x93\xd6\x32\xaa\xd6\x48\x5c\xf9\x26\x95\x35\x4d\x5d\x3f\xd0\x20\x7a\xdc\x0e\x71\x39\x1d\xd8\xad\x75\xaf\xbd\x82\x69\xd7\x9f\xfe\xa5\x41\x7c\x96\xcb\xed\xab\xff\x70\x72\xf9\x16\x46\x0a\xde\xe9\x78\xb7\x1b\xf0\xe3\x67\xa9\xdc\x2a\x88\xf7\xa1\xce\xdd\x86\xd5\x03\x06\x9d\x06\xf9\x29\xb4\xaf\xea\x7f\xbd\x47\xea\x7e\xa4\xee\x5d\xdf\x5d\x69\xca\x60\x58\xf1\x1f\xe3\x2e\xdc\x74\x3a\x5d\x5f\x59\xda\x69\xca\xc2\x73\x1f\xab\xe8\xe2\xfa\xcf\xf5\xc1\x94\xff\x93\xee\xaa\x7b\xe0\xc0\x71\x30\x01\x47\x17\x2e\x65\x69\x5d\x75\x0d\xd5\xff\xbb\x0f\x54\x1b\x46\xf0\xdf\xe0\x7d\xf8\xf6\x3a\x95\xaf\xa7\xf2\x25\xf0\xae\xaf\xd6\x2b\x52\x87\x0f\x3e\x51\x31\x43\x68\x63\xa1\x4f\x3a\x56\xe7\x69\xe8\x72\xd0\x7e\x94\xe7\x2e\xf8\xfa\x62\xd8\x7f\x93\x42\xd9\x28\xab\xe5\xfd\x3b\xf9\xdd\x15\x6c\x8f\x75\x20\x7e\x4d\xca\xbc\x19\xfe\xc7\x23\x02\xdf\x77\x04\x69\x3a\xb0\x4e\x9a\x00\x6d\x04\xef\xae\x2a\xb7\xa7\xf2\xa4\x90\xa7\xab\xf6\x6f\x27\x8e\x34\xf2\xfd\xf5\xe0\x9b\x42\xfa\xff\x10\xe8\x22\xfc\x9f\x74\xac\x4f\xef\xd1\x6e\x43\x39\xa9\x63\xff\x33\xe6\x4b\x14\x6e\x3d\xb5\x8e\x81\xe7\xe4\x24\xe0\x07\x7f\x83\x2a\xab\xc3\xf3\x94\x8e\x8a\x23\xec\xc2\x1a\x53\x0a\xf1\x00\xb1\xa2\x05\xf2\x5b\xd9\xda\xd9\x6d\x50\x17\xfa\x9f\x97\xd5\xf3\xcd\x8e\xd8\x93\xfd\x86\x2a\x7b\x62\x1a\xbf\xfa\xe9\x42\xb2\xc7\xf9\x5c\xd0\x2d\xe9\xe3\xaa\xbe\xc6\x35\xae\x9d\xc0\x5a\x05\x2d\xbb\x8e\xf7\xd8\x4e\x1d\x1f\x8b\xd7\xa7\x43\x1d\x52\x8e\xec\x7f\xdc\x80\xf2\x62\x28\x1f\xdb\x88\xeb\xa4\xb1\x8a\xed\x4d\x79\xbf\x65\x0f\xc6\xaf\xde\x17\x19\x2a\x19\x1b\x01\x6e\xf2\x5f\xb3\xaf\x53\x6b\xbc\x91\xf2\xab\x24\x7c\xde\x05\xca\xeb\x48\xcd\x93\x43\x58\x33\x34\xdf\x5e\xc2\x65\x85\x2a\x2d\x96\xdb\x81\x35\xd4\x88\xe7\xcb\x09\xac\xb5\x60\x5e\xa4\x4d\x08\xb4\xd4\x6d\x8a\xd5\xd9\x45\x91\x92\xff\x09\xfc\x7f\x1b\xae\x97\x34\x95\x6f\x02\xf7\x1e\xbe\x11\xce\x70\xe8\x29\x19\x11\x01\x2e\x1b\xf0\x1e\xf5\x4c\xe4\x58\xe3\x0e\xa1\x3f\x5b\xaa\xef\xb0\x5d\xd8\x77\x21\xf7\x57\xca\xfb\x2c\x22\xb5\xa6\x15\x29\x7c\x52\xe5\xff\x41\xfa\x84\xf0\x7f\x17\x89\x5a\xd7\x2e\x8b\xe3\x73\xbd\x9b\x14\xc3\x87\xd7\x96\x63\x4d\x2e\x2e\x59\xc7\x7b\x1a\x5f\x0d\xae\x35\xc7\xfa\x73\xea\x98\x83\xbd\x5c\xf1\x97\xf4\xc3\xd5\xa0\x47\xf0\xff\xae\x11\x42\xe0\x49\x7c\xff\x13\xd0\x3f\xa1\xf2\xfd\x84\x8e\xff\xc5\xae\xaa\xa3\x05\xfe\xcd\x96\x23\xaf\xf6\xfb\xa5\x15\xe5\x57\x81\x2e\x73\x12\x4c\x53\x66\x54\xf2\xfe\x82\x29\xdb\x35\x0d\x2d\x26\xc1\x31\xc7\x3b\xec\x33\xdd\x77\x55\x78\xb7\x1c\x67\x7f\x9c\x29\x44\x70\x8e\x47\x55\x9a\x69\xee\x11\xf4\xfb\xd0\xe1\xcf\x48\x95\x6d\x14\xf1\x79\x56\x67\xea\xdb\x68\xa9\x73\xfa\x5d\xd0\xe5\x6b\xb3\xe4\x7b\x0f\xe8\xde\x56\xe5\xb5\x2a\xca\x6d\x2b\xbd\xd6\x86\x73\xe0\x5a\xea\x19\xbf\xb7\xd4\x3d\xd6\x1d\x95\xa4\x2f\x1b\xb7\xba\x9c\x36\xf0\x95\xe6\x2d\x9d\xae\xed\x78\xef\x4a\xab\xf3\xb8\x70\x2f\xcb\x83\xe3\xa0\x5d\x82\x53\xe4\x18\x0b\x3a\xdd\x05\x0e\xbc\x23\x35\xae\x22\xa0\x4f\x19\x2e\x11\xd0\x31\x82\xf1\xdd\x06\xb9\xa0\xc7\x69\xbb\x64\xfc\xba\xc6\x6e\xc4\xfb\xce\x75\xfd\x91\x92\x3b\xb0\x3e\x70\xea\x0b\xaa\xcf\x32\xd0\x93\xad\x92\xfe\x8c\x1c\x76\xa1\x3e\x47\x2b\x2d\x39\x23\x4a\x9f\x1d\x95\xc1\xbe\x3b\x01\xfd\xec\xca\x37\x0d\xe8\x33\xe3\x96\xd4\xde\xbc\xfe\x94\x65\xfe\x98\x9a\x0b\x26\xca\xfe\x73\xad\xc9\x24\x8e\x98\xb3\x49\xe9\x63\x25\xa7\x74\x5c\x45\x13\x64\x59\x0c\x73\x79\x2d\xdf\x52\x47\x7c\x58\x07\x68\xdd\x03\xb8\x15\xe2\x88\x5a\x8e\xf9\x34\x3e\xdf\x52\x72\xe6\x80\x7e\xce\x80\x97\xaa\xe6\x3d\xae\x39\x41\xc6\x73\x4d\x3d\x6f\xb8\x05\x68\x9a\x56\x9c\xab\xe0\x82\x14\xf6\xf0\xa1\xdf\x24\x83\xf7\x68\x07\x76\x20\x6d\xaf\x02\xfa\x00\x18\x83\x39\x84\x72\xfa\x40\x7f\x9c\xef\xf7\x55\xec\x20\xce\x67\x12\x98\xdf\x27\x0e\x1d\xe8\x02\x93\xee\xd1\x15\xfa\xf4\x35\xaa\x7c\x79\xff\x86\x29\xed\xd4\x10\xe6\x16\x21\xcb\x19\x3d\x87\x9a\x64\x03\xbc\xb4\xc2\x4e\xae\xb2\x0d\x32\xf5\x7c\xa9\xb2\x2f\xcf\x04\xca\xf0\x89\x1d\xf5\x56\xd9\x2b\x3a\x6f\x15\x6e\x9a\x56\x2f\xdd\x81\x0d\x15\x82\xbf\x4d\xd3\x8c\x76\x50\xe7\x6e\x00\xce\x5d\x9e\x52\x91\xee\x02\x47\x5f\xdf\xa0\xe6\x7a\xdf\xe7\xe8\xdf\xdd\x86\x78\x07\x7c\xa3\xd7\xb9\x5d\xe7\xb0\x95\x95\x8f\xff\x6b\x1c\xed\x80\xfe\x2e\x7e\xbb\x4e\x3d\xf7\xce\xa0\xdd\x55\xef\xa5\xdc\x2b\x4e\x93\x67\x1e\xbb\xc3\x7c\xdf\xa7\xe6\xac\x65\x73\xd7\x69\x40\xef\x5f\xdf\x09\xbc\x64\x07\x75\x8a\xff\xe6\xc9\x25\xdf\x5d\xed\xd9\x09\x5c\x33\xe5\xf7\xa4\x82\x56\x55\xef\x24\x9f\xfe\x8f\x38\x04\xfc\x3f\xb8\x23\x20\xcb\x4c\x19\x37\x71\xdf\xad\xaa\xf1\x1f\x73\xbc\x41\xaa\xfc\x33\x43\xe5\xab\x7c\x05\xe0\x83\xb6\x50\xaa\xca\x92\xff\x5b\x18\x2a\xdb\x21\x74\xd8\x4a\xd7\xb0\x9e\xbc\x05\xf4\x7c\x9b\x7d\x52\x62\x8f\x8f\x94\x0f\xec\x5a\x68\x8f\xcc\xb7\x96\x14\x3e\xe6\xfe\x47\xb9\xce\x84\x71\xea\xc3\xdc\xac\x0f\xeb\x63\xb1\xb2\x75\x9e\xcf\xef\x5e\xa1\xca\x6b\x83\x2d\xa3\xfd\x85\x48\x4f\xf4\x53\xb6\x15\xcd\x70\xbd\xc7\xa4\xbd\x10\x62\xe9\x33\xc0\x07\xd7\x78\x16\xa1\x8e\x48\xf9\x3b\x63\xb0\x7f\xf4\xd8\x4d\x1c\xbe\x46\xec\x03\x59\x13\x79\xa2\xb2\xfd\xd0\x96\x8c\x1d\x67\x8b\x09\xee\xaf\x54\xe5\x86\x6a\x9e\xa9\xfd\x7d\x19\x9c\x49\x91\xaa\xf9\xae\xd4\xf9\x32\xf8\x9e\x02\xbd\x22\xb6\x7d\xa5\x9f\xfa\x60\x63\x49\x5b\x07\xa0\x1b\xda\xaa\xcf\x92\x92\x31\x94\x32\x6f\x68\x9b\x16\x69\x19\x01\x8d\xf1\x4c\x8d\x36\xf4\x11\xda\xfb\x99\x5a\xb7\xc2\x32\x5f\x03\x7d\x1b\x2a\x5f\x2a\xe2\x1d\x71\x6c\x69\xaa\xda\x9b\x42\xdd\x68\xf3\x6a\x3b\x13\xc7\x5d\xd3\x61\xc7\xe3\x1a\x63\x06\x38\xfc\x18\xd4\xd7\x07\x9a\xa5\xca\xe7\x19\xc3\x7e\xcb\x96\x43\xdf\x86\x8e\xb9\xcd\x0d\xfc\xfe\xd9\x80\x67\x1b\xce\x89\x6c\x2a\x5f\x85\xd0\x48\xce\x62\x7b\x89\xa2\x0f\xd2\xa1\x0f\x75\xf7\x40\xf6\xc8\x1e\xae\xc7\xab\x3e\x1e\x72\x3d\x7d\x45\xd3\x25\xa8\x63\x00\x69\x3b\x6a\x7f\xd2\xb3\x94\x3f\x1f\xe7\x8c\x22\x57\xd0\x0e\x19\x29\x7a\xa7\xca\x97\x2b\x73\x7e\xe1\xaf\x27\xc0\x19\x2a\x2d\x25\x73\x3b\xd0\x2f\x3f\x02\xe5\xe1\x39\x31\x6d\x35\xbf\xd4\x7a\x0e\xfb\x26\x54\x3a\xe6\x7c\xbe\xbf\x94\xf7\xe3\xbd\xb0\x64\x0e\x9f\x2a\xbe\x4a\x1c\xf3\x4e\xbd\x16\xa5\xe7\xa6\x2e\x88\x1d\x69\x26\xe5\x09\x41\xe6\x24\x4c\xbf\x58\xe5\xc5\x79\xfc\xd3\xa6\x98\xd3\xeb\xf9\x3d\xe2\x5f\xa6\x7f\x51\x5e\xa4\x4a\x7f\xa7\xea\xbf\x85\x35\xad\xc2\x8a\xf6\xe9\xf3\x63\xb2\x92\x74\x57\xa9\xef\x7a\x0e\xed\xfa\x86\xf9\x23\x25\xb3\x74\x5e\xad\x07\x96\xf8\xcc\x1f\x9c\x17\xbf\x9b\xef\x5f\xa0\xf8\x62\xa8\x64\xe4\xc0\xc1\x4f\xb7\xaa\x79\x85\x8e\x93\xd0\x78\xbc\x82\xaf\xaf\x84\x7d\x90\x65\x73\xfd\x2a\x5f\x80\x4e\x83\xbe\x81\xae\x3a\xfb\xa7\xa7\x78\x22\xaa\xe8\x37\xd7\xf8\x88\xd4\x77\x6d\x7b\xa6\xca\x87\x51\xb6\x06\xab\xfd\x26\xa9\xa2\x97\xfe\xe6\x82\x33\x39\x07\x41\xe7\x95\x71\x74\x1b\x8c\xe1\xaa\x31\x85\x63\x49\xaf\xfd\xbe\x08\xf2\xbf\x4a\xf1\x6a\x0f\xc6\x57\x1b\x6c\xbf\xb4\x62\xbe\xf2\x1b\x6c\xf7\xde\x0c\x34\x8e\xc1\x27\x2a\xf8\x2c\xf3\xb3\xe8\xc1\x5f\x81\xfe\x58\x54\x78\xc7\xca\x06\xc3\x3e\xce\x3c\xa2\xae\x97\x5f\xf7\x0a\x62\x8f\x28\xdc\x43\x38\xd0\xed\x6b\xdc\xbf\xbe\xec\x2c\xd7\xb9\xdf\xed\x3b\xdb\xb0\xd7\xf5\x8d\xf6\x18\xba\x7b\x0c\x86\x1f\x3b\x00\xfa\x79\xb7\x61\xaf\xdb\xb7\xd7\xfd\xb7\xd7\x70\x36\xfb\xea\x5f\x22\xec\x77\x7f\x1e\x34\x7e\x39\x53\xfd\x1e\xee\x30\x7d\x5f\x41\xc7\xf1\x6e\x37\x21\xf2\x88\x12\x80\x16\x5f\x23\xb8\x56\x41\xa2\xd2\x27\x8e\x77\x78\x3d\xe8\xed\x8b\xa7\x28\x73\xb7\xe1\x5c\xfb\x76\xaf\x7d\x7b\x2d\xcf\xf6\xdb\x5e\xda\x0b\xf9\x79\xce\x5e\x7a\xf0\xea\xbf\x83\x0e\xfb\xdd\x9f\x07\x8d\x5f\xe2\x3d\xd6\xef\x9b\x7b\x0c\x8b\x7b\x0c\xe7\xda\x77\xae\x7d\x0f\xe4\xf6\xed\xb5\x3c\xdb\x6f\x7b\xe9\x9c\x7f\xe9\xc1\x05\xfb\x6d\x5f\x1c\x34\xd8\xef\xfe\x3c\x68\xfc\xb2\xd7\xfa\xe1\xa0\xeb\xa3\x83\xde\xbe\x73\xf0\xe0\x86\xbd\x96\x67\xfb\x6d\x2f\x9d\x6d\x38\x67\x2f\x3d\xb8\xf5\xdf\x41\x87\xfd\xee\xcf\x83\xc6\x2f\x8b\xfb\xa0\xdf\x0f\xb2\x3d\x71\xce\x5e\x3a\x07\x0f\x64\xd8\x6b\x79\x76\xce\x5e\x3a\x67\x2f\x3d\x90\xf5\xdf\x41\x87\xfd\xee\xcf\x83\xc6\x2f\x7b\xad\xdf\x0f\xba\x3d\x71\xd0\xdb\xe7\x6a\xef\x7e\xe3\x70\x0e\xa6\x87\xbd\x96\x67\x65\x7a\xbf\x03\xd7\x69\xec\x11\x97\x6d\xd2\x71\x5c\x75\xbc\xa4\xeb\xdd\x6e\xc2\x5e\xb7\x6f\xbf\xf5\xd3\x41\xd3\x7f\x07\x1d\xf6\xbb\x3f\x0f\x1a\xbf\xec\xb7\x3d\x73\xd0\xec\x89\x83\xde\x3e\x57\x7b\x45\x0f\x4f\xa3\x8f\x17\x55\x7a\xad\xcb\x5d\xd7\x07\x02\xec\x46\xfb\xca\xda\xb9\xd7\xed\xd8\x4b\x38\xe7\x5f\x3a\xe7\x5f\x7a\x20\xeb\xbf\x83\x0e\xfb\xdd\x9f\x07\x8d\x5f\xce\xa6\x8e\xdf\x0f\xfb\x61\xbf\xed\x89\x83\xde\x3e\x57\x7b\xf7\x1b\x87\x73\x30\x3d\xec\xb5\x3c\x3b\x67\x2f\x9d\xb3\x97\x1e\xc8\xfa\xef\xa0\xc3\x7e\xf7\xe7\x41\xe3\x97\xbd\xd6\xef\x1b\x1e\xd1\xfa\x1e\xc2\xd2\x1e\xeb\xa3\x83\xde\xbe\xbd\x86\x73\xed\xdb\x5d\xd8\x6b\x79\xb6\xd7\xeb\x55\x0f\x14\x7b\xe9\x6c\xb5\x6f\xbf\xf5\xd3\x41\xd3\x7f\x07\x1d\xf6\xbb\x3f\x0f\x1a\xbf\xec\xb5\x7e\x37\x75\xa6\x7b\x08\x11\x9f\x69\x23\xd0\xe4\x6b\x08\xd7\x2a\x68\xa9\xf4\x2d\xc7\x3b\xbc\x1e\xf4\xf6\x35\xf7\x18\xce\xb5\x6f\x77\xdb\xb7\xd7\xf2\x6c\xaf\xfd\x2f\xe9\x1e\xcb\xcf\x73\xfe\xa5\x07\xb7\xfe\x3b\xe8\xb0\xdf\xfd\x79\x10\xf9\x65\x2f\xf5\xbb\x96\x67\xf2\x9c\xc0\xb5\x0a\x3a\x2a\x7d\xc7\xf1\x0e\xaf\x7b\xad\xff\x0e\x7a\xfb\x5a\x25\xcf\x6d\xb8\x56\x41\x53\xa5\x6f\x3a\xde\xe9\xeb\xb9\xf6\xed\x1e\xec\xb5\x3c\x4b\xf6\x38\xfe\x3a\x51\xb2\x26\x81\x31\x38\x8d\x2d\x95\xaa\xf4\x5a\x6e\xe9\xeb\x5e\xb7\x6f\xbf\xf5\xd3\xd9\x86\x78\x1f\xf8\xc5\xf5\x8c\xd7\x2a\x28\x2b\xa7\xac\xac\xbd\x6e\xdf\x7e\xf7\xe7\x41\x93\x2f\x7b\xad\xdf\xf7\x7a\xbd\xe3\x6c\xd3\x4f\xc3\x41\x6f\x9f\xae\x6f\x71\x8f\xeb\x3b\xd7\xbe\x33\x83\xbd\x96\x67\x7b\xed\x7f\xc9\xf6\x78\xae\x79\xce\xbf\xb4\xbb\xb0\x1f\xfe\x82\x83\x0c\xfb\xdd\x9f\x07\x91\x5f\xaa\xf4\x71\xb6\x43\xfd\x3d\x29\xfd\xc0\x23\x1a\x02\xf4\xd4\xf3\x6e\x43\x5b\xfd\x7f\x44\x78\x96\xff\xdb\xe2\xa0\xb7\x2f\xe6\x7a\x13\x98\x2f\xa1\xfd\x3c\x9c\x60\x5f\x4f\xfa\xae\x61\x3f\xda\x97\x54\xb4\x6f\xb7\x61\xaf\xdb\xb7\xd7\xf2\xec\x9c\xbd\x74\xce\x5e\x7a\xa0\xeb\xbf\x83\x0c\xfb\xdd\x9f\x07\x8d\x5f\xe2\x3d\xd6\xef\xda\x0f\xe5\xf2\x4b\xed\x26\xe8\x98\x8e\xb3\x0d\x07\xbd\x7d\x71\xc9\xfb\xa6\xba\xaf\x5a\xef\xd2\xe9\xf5\x3b\x7d\x7d\x20\xb5\x6f\x9a\xf5\xbc\x07\x72\xfb\xf6\x5a\x9e\x95\xad\x8f\x9d\xcd\x78\xbe\x18\x40\x3f\xef\x36\xec\x75\xfb\xf6\x5b\x3f\xed\x35\xbf\x64\x7b\xcc\x2f\x67\x1b\xf6\xba\x7d\xfb\xdd\x9f\x07\x4d\xbe\xec\xb5\x7e\xef\x96\xac\x47\x74\xa6\x9c\x1b\x56\xad\x63\xb8\xca\x2a\x9b\x67\x87\x70\xad\x82\xaa\x79\x7f\xe8\xb8\x1e\xf4\xf6\x55\xc9\x81\x69\x7c\x31\x98\x3e\x83\xf5\x7c\x5d\x86\x5c\x1f\xcc\xed\xab\x2a\x63\xbf\xda\xb7\xd7\xf2\xac\xcc\x4f\xd2\x81\xeb\x24\x79\xd1\x55\xf7\xae\x32\xba\x25\x63\x26\x75\x5c\xab\x40\xe7\x9b\x54\xd6\x5e\xb7\x6f\xbf\xf5\xd3\xd9\x86\xb3\xa9\x7b\xca\xe4\xed\x5e\xda\x2f\x7b\xdd\xbe\xfd\xee\xcf\x83\xc6\x2f\x93\xf4\xfb\x24\x1d\xbf\x53\xfd\xde\x65\x1f\xd6\x5e\x41\x74\x96\xd7\x53\x34\x1c\xf4\xf6\x69\x1d\x1e\x4f\xa1\xd3\xcf\x04\xce\xb5\x6f\x77\x61\xaf\xe5\xd9\x7e\xdb\x4b\xae\x77\xbb\x09\xe7\xec\xa5\x07\xb7\xfe\x3b\xe8\xb0\xdf\xfd\x79\xd0\xf8\x65\xaf\xf5\xfb\x41\x3f\xcf\xf1\xa0\xb7\xef\x1c\x3c\xb8\x61\xaf\xe5\xd9\x39\x7b\x69\x77\xdb\xb7\xdf\xfa\xe9\xa0\xe9\xbf\x83\x0e\xfb\xdd\x9f\x07\x8d\x5f\xf6\x5a\xbf\x9b\x71\xdf\x07\xe8\x3a\xae\x55\xa0\xf3\x4d\x2a\xeb\x6c\xfa\x06\x5c\x70\xd0\xdb\x77\x0e\x1e\xdc\xb0\xd7\xf2\x6c\x12\xbf\xef\x36\x9c\x8b\xf7\x7e\x70\xc3\x7e\xdb\x17\x07\x0d\xf6\xbb\x3f\x0f\x1a\xbf\x84\x7b\xac\xdf\xf7\x9a\x9e\x07\x5d\x9e\xed\x75\xfb\x5c\xed\xdd\x6f\x1c\x1e\xe8\xed\x7b\x20\xd1\xe8\xa0\xf3\xe7\x39\x7b\xe9\xc1\x0d\xfb\x6d\x5f\x1c\x34\xd8\xef\xfe\x3c\x68\xfc\x32\x69\x0c\x9e\xe9\x77\x0d\xbd\x46\x11\xb7\x1f\x37\x88\xd6\x1a\x44\xdd\x06\x51\xd2\xe0\xf8\x91\x46\x1e\xd3\x31\x94\xfd\x0b\x8d\xdc\xa6\x93\xd8\x20\x93\x36\x6c\x6c\x8f\xaf\x0d\x55\x4c\x5d\xdb\xc8\xcd\x46\x9e\xbe\xc5\x31\x22\x5d\x88\x6f\x8f\xf9\x7e\xdb\x1e\x1a\x2e\xb3\x07\xef\x07\x8d\x22\x06\xb0\x0f\x7b\xa7\x24\x6d\xda\x28\xf2\x63\x0c\x6f\x0b\x70\xec\xf0\x7d\xa4\xf6\x47\x64\x4c\x8b\x21\xec\xd3\xe8\xf1\xf7\x10\xf7\x6d\x34\x8a\xf7\x03\xc0\x5b\xda\x2a\xb4\x31\x7d\x39\x6c\x14\xf1\xd3\xd8\xce\x90\xe9\xd1\x51\xfb\xd7\x05\x9f\x1e\xe7\xeb\x72\x7b\x53\xee\x8f\xa8\xe1\xa0\x93\xd0\x85\xf1\x1a\xd3\xd4\xf4\xa5\xd0\x9f\xf3\xb6\x81\x66\x23\xee\x4b\x5b\x67\xa3\x88\x13\x4a\x1d\xf1\xd0\x42\xcf\x8e\xf0\x05\xe3\x2e\x3c\x12\xf3\x37\x73\x1d\xf1\xf7\xb8\xb1\xbd\xdc\x44\x95\x69\xf0\x5d\xe2\x72\x84\xbe\xe6\x5d\x5f\xc5\x2e\x49\x7b\x5a\x10\xcb\x94\xc1\x77\xa1\x09\xd2\x6f\xdc\x2e\xc6\x31\x83\xbd\x29\xa9\xea\x4f\xe9\xff\x45\xc0\x33\x05\x3a\x0f\x01\x8f\xd8\xbb\x7f\x5d\x19\xa7\x09\x15\xdf\x63\x3b\xa5\xbf\x05\xb7\x1e\xdf\xaf\x70\x3f\xa5\x50\x47\x97\xf9\x2a\xe4\xfc\x4d\xbe\xf6\x1b\x45\xd9\x31\x94\x8d\xfd\x93\x02\xcd\xe3\xc6\xf6\xd8\xfd\x18\xf0\x1a\x32\x3f\x24\xcc\x37\x22\x77\x84\xbf\xfb\xcc\xfb\x2d\xc0\x23\x86\xb1\x8d\xe7\x81\xa6\xd0\x06\x69\x73\x97\xcb\x8d\x41\x8e\x20\xde\xa3\x46\xd1\x77\xe6\xda\x0c\x3e\x42\xe7\x1b\x38\xf4\xbc\x1c\x1a\x54\xeb\x36\xa8\x66\xf8\x83\x1a\xe4\xa5\x2c\x93\x4e\x03\x02\xe2\xfb\x01\x03\x31\x8c\x9f\x03\xf2\x0c\x6d\xc3\x80\xbc\xc5\x80\xbc\x1e\x5f\xe7\xf8\x9a\x31\x84\x0c\x71\x0e\xd4\x0f\x88\x46\x01\xd1\x7a\x40\xb4\x71\x7f\xf0\x16\x02\xf2\x28\x20\x6a\x07\x44\x4d\xb2\x75\x9a\x36\xf9\x1b\x0d\xf2\x86\x0d\xf2\x4d\xdb\x37\x1b\xe4\x2d\x35\xa8\x36\x6c\x50\x6d\xb6\x41\xfe\x7c\x83\xbc\xd5\x06\xf9\xcd\x06\x79\x51\x83\xbc\x85\x06\x79\x49\x83\xfc\xd9\xfc\x9d\x3f\x68\x90\xdf\xe2\xef\xeb\x0d\xf2\x43\x7e\xbf\x00\xef\x47\x0d\xf2\x7a\xfc\x5e\xc0\xc8\xbf\xad\x9c\x8e\xb6\x8e\x95\x06\x79\x1b\xc5\x77\x83\x8f\xad\xd7\x94\x43\x79\x1a\xbf\xcb\x38\x0c\x19\x87\x10\x70\x31\x7d\x32\x68\x90\xb7\xc8\x7d\xd3\x6b\x90\x67\xd2\xf7\x1b\xe4\xad\x35\xa8\xd6\xe2\x74\xfd\x06\xf9\x8d\x9c\xde\xb6\x7d\x0b\x5c\x67\x94\xa7\x33\xdf\x4c\x3a\x7b\x3f\xc7\xed\x31\xe9\x52\x4e\x33\x9b\xbf\xf7\xb6\x18\xcf\x35\xa6\x41\xca\xe5\x98\x6f\xcb\x0d\xf2\xe6\x72\xfc\xcd\xbd\xc9\x67\xbe\x1b\xde\xc9\xeb\xcb\xfb\xc0\xf4\x2b\x45\xdc\x1f\x1d\x86\x8c\x61\x91\x9f\xbb\x01\x51\xca\xd7\x25\xbe\x37\x60\xca\x58\xe0\x34\xe6\xbe\x15\x58\x7e\xb1\x65\x99\xeb\x3c\x97\xb3\xc0\xef\x66\x21\xcf\x3c\xdf\xcf\x33\x1e\x4d\x7e\x0e\x19\x66\xb9\xbe\x79\xbe\x46\xfc\x6e\x9e\xeb\xc9\xf8\xde\x94\x15\xc3\x7b\x93\x36\x61\x1e\x9c\xe5\xfb\x0e\xe3\x2b\x78\xb4\xf3\x7e\x14\xfe\x31\x74\x32\x74\xb1\xfc\x6e\x74\xc2\x73\x0c\xd4\xe7\x28\x09\xe6\x28\x0e\x36\x68\x31\xe8\x50\x3b\x58\x31\xb2\xca\x9b\x37\x3c\x1b\x1c\xa7\x3f\xf4\x0f\x9f\xfa\xed\x80\xbc\x3b\x02\xf2\x6e\x0d\xc8\x3b\xe6\x7f\x80\x2e\xf4\x3f\x40\xdf\xe6\x7f\x80\x9e\xcc\xf7\x97\xf8\x1f\xa0\x27\xf8\x1f\xa0\xc7\xd4\x2e\xa5\x77\x11\x7d\xe3\x16\xa2\xaf\xdf\x99\x5f\xbf\x71\x23\xd1\x37\x6e\x07\xb8\xd1\xbb\x9b\x9e\xe0\xdd\x4d\xb3\x06\x1a\x44\xcd\x5c\x16\xd5\x0c\x8f\x84\x39\x18\xd9\x21\x38\x8f\x65\x08\xcb\x13\x7f\x91\xaf\x26\x4d\xd6\x20\x7f\x39\x1f\xdf\xfe\x2a\xa7\xed\x37\x0a\x39\xd8\xc9\xdf\xd5\x46\xfc\x6d\x29\xe7\x5d\x2b\x77\x32\x4e\x67\x78\xa5\x99\x8f\x4b\xfb\x6e\xc4\x7c\xb8\xce\x79\xa4\xac\x45\xe6\xb9\xc5\x22\xdf\x58\x17\x66\x79\x5a\x4f\xde\x67\xb9\x8d\x61\x79\xbf\x05\xf8\x47\x90\x27\xca\xd3\x78\x1d\xee\x0f\xd6\x99\xb6\x3d\x9d\x1c\x6a\x73\xf9\x7b\x3b\x36\x46\xf9\xd8\xb6\x63\xd9\xb4\x7d\x8b\xf9\x7e\x3e\x4f\x63\xd2\x9a\x31\x6d\xc6\xb6\xed\xdb\x14\xca\x8b\xf8\xb9\xcb\xba\x27\xdb\x4e\x53\x79\xb6\x6d\x4e\x72\xf9\x61\xe5\x88\xa1\xd5\x50\x6c\x0b\xc6\xab\x07\xf9\x58\x9e\x6d\xd3\xf7\x29\xcb\xa2\x76\xde\x17\x96\x06\x03\xa0\xe7\x26\xd4\xcd\x7d\x60\xfa\xd1\xdc\x9b\x7e\xc8\x75\x63\x83\x82\x51\x4e\x73\xf3\x6c\xdb\x3c\xca\xd3\x18\x99\x20\x79\xbd\x06\xd0\x32\x03\xda\x4a\xdf\x74\x19\x67\x93\x76\x33\x97\xbf\x06\xa7\x40\xca\x18\xb2\x0c\xeb\x72\x7b\x11\xcc\x78\x89\xe1\x39\xca\xf9\xc7\xc8\x20\x93\xde\x96\x99\x70\x9a\x36\x5f\x4d\x5f\x32\xff\x1a\xdc\x3d\xe6\x45\xdb\x2f\x6b\x8c\x8b\xd0\x33\x64\x7a\x74\x72\x1d\x60\x9e\x6b\xf3\x5c\x56\x1b\xda\xb8\xc4\x6d\x19\x71\xbf\x86\x05\xef\x48\xbf\xd4\xb2\x5c\x87\xe4\xba\x1c\xe8\x30\x60\x1d\x9a\x30\x1f\x66\x45\x3e\xd3\x26\xe9\x47\x6f\xa3\xa0\x9b\xc7\xf8\x58\x5a\x19\xbd\x64\xc6\x4f\xbb\x41\x81\xf9\xbe\xd2\xa0\x60\x9d\xc7\x50\x3f\xc7\xd7\x8e\xdb\x16\xa7\x9b\x65\x5c\x8c\xdc\x61\x7e\xf0\xcc\xb7\x35\x96\x3b\x06\xd7\xcd\x06\x05\x8d\x5c\x2f\x07\xcd\x06\xd5\xb6\xf2\x6f\xc1\x1c\xc3\x6c\x83\x82\xb4\x41\x41\x2b\xc7\xdf\xd2\x6d\x9d\xe9\xcb\x7c\xe2\x71\xfd\xb9\x8d\xc3\x6d\x20\xa6\xd1\x12\xe8\xff\x0e\x5f\x61\xac\x8f\xbf\xf5\xf9\x3d\xa7\xf1\x47\xdb\xc7\x32\xe1\x58\xee\x02\x7f\x01\xaf\xd6\x0c\x2f\x99\x36\x35\x1a\x85\x3d\x6b\xc6\x62\xc4\xdf\x5b\xf9\x38\xad\xf1\x37\x3b\x56\x96\x58\xde\x99\x32\x3a\x4c\xb7\x38\xd7\x6b\xc2\x1f\x41\xcc\xe3\xc5\xd8\x40\x2c\xef\xcc\xbb\x60\x81\x61\x8e\xdf\xa5\x4c\x33\x83\xc7\x12\xa7\x99\xcb\xfb\x28\xe0\xb1\x63\xdb\x12\x01\xbf\xc5\xdb\x65\x90\xa9\x57\xf0\xaf\xb1\xdc\xb5\x7a\x7c\x04\x34\xe0\xf7\xd2\xfe\x60\x89\x71\x4d\x15\x9d\x52\x78\xbf\x0c\x63\xd1\xe4\x1f\x02\xef\x8f\x60\x8c\xc6\xcc\xd7\x09\xe3\x6b\xe4\xc3\x2a\xdb\x66\x2b\x9c\x77\x85\x65\xd9\x96\x1a\xdf\x3d\xe8\x37\xec\x5f\x94\x03\x9d\xa2\xad\x56\x76\xc4\xa0\x1b\xba\xcc\x37\x2c\x83\x45\xfe\x19\x19\x6f\x74\x46\x6d\x83\x75\x4c\xca\xf7\x2b\x0c\xcb\xb9\xbe\x31\xfd\x6b\xc6\x8a\x27\x72\x61\x85\xe5\xc9\x22\xcb\xd0\xb5\x5c\x0e\x5a\xfb\x25\x61\x39\x32\x64\x5b\x6a\x9d\xf3\x6d\xb2\xcd\xd5\x66\x1b\x66\x8d\x6d\xb3\x3e\xa7\x59\xe6\xab\x29\xa3\xc3\x65\x2e\xf0\x38\x5d\xe4\x3a\x47\xf9\xd8\xb0\xef\x96\x59\x9e\x0d\xf8\xdd\x62\x5e\x87\xc5\x67\x19\x64\x7b\x0f\x70\x1e\xf1\xb7\x01\xdb\x76\x31\xe7\x5f\xce\xcb\x0c\xe6\x59\x1f\xb7\x58\x96\x75\x39\xff\x22\x94\xbb\xc6\xcf\x1b\x5c\x5f\x87\x6d\xd4\x18\xda\xda\xe3\x36\xa6\x80\x07\xeb\x64\x8b\xc7\x6a\x7e\xb5\x7a\x76\x95\xc7\xc5\x72\xde\xef\x16\x4c\x9f\x24\xcc\xe7\x06\x9f\x25\xe6\x8f\xcd\xbc\x5f\xac\x1e\xdf\xcc\x65\x12\xb1\x0e\x37\x32\xc6\xf2\x5b\x8f\xfb\x35\xcc\xc7\xac\xbf\xc6\xf9\x56\xd9\x36\x65\xfd\x64\xdb\x1b\xb1\xde\x4c\xf3\x7e\xb1\x76\x49\x27\xa7\xbf\x8c\x73\x93\xdf\xca\xde\xc5\xc2\xbe\x36\x32\x5f\xe4\x82\x1d\xdb\x3d\xc6\x77\x99\x9f\x33\x1e\x03\x19\x8f\x49\x9e\x27\x59\xb9\x10\xb3\x9c\xc8\x40\x5f\xaf\xb3\xee\x5f\xc8\xf9\xc7\xda\x72\x49\x4e\x53\xfb\xbe\x01\xb6\x70\xca\xcf\x5d\xfe\x16\x81\x4d\x1d\x15\x36\xb5\xbd\x26\x0c\xa2\xab\x17\xc0\x4e\xec\xf0\x73\x94\xb7\xdd\xd6\x35\x9b\xd3\xde\xa6\x49\xf9\xfb\x22\x5f\xa5\x8c\x04\xca\xc8\xa0\x9c\x2e\x97\x61\xa0\xc7\xef\x9b\xfc\xcc\x63\xcd\xe2\x98\xe5\x7d\x61\xd3\x2f\xe4\xf2\xc2\xce\x43\xe4\x5b\x06\xf7\xd2\x77\x71\x31\xbf\xb1\xf9\x7a\x8c\xf3\x80\xbf\xad\x31\xff\x44\xfc\x2d\xe3\x32\xd3\x3c\xbd\xed\xf7\x0d\xc6\xa3\xc5\xf7\xf3\x9c\x37\xe2\xef\x29\xe7\x15\xdc\xd7\xa0\xfc\x3e\xe3\x9c\xf2\xfd\x0a\xdf\x8f\xb8\xae\x84\xd3\x47\xfc\xdc\xce\xf9\xcc\xf2\xf1\x02\xcb\x9f\x90\xcb\x90\x79\x1a\xf3\xb0\x95\x51\x43\xd0\x61\x1d\xb0\xd5\x7a\x45\x1a\x7b\x35\x7a\xa0\x0b\xf2\x2e\x66\x59\x2a\xf2\x7f\xc0\xe3\x67\x95\x61\x9d\xe9\xbb\xc9\x3c\xbd\x92\xe3\x6f\xc6\x94\xb5\x23\x64\xdc\xf5\xb9\xcd\x1b\xdc\x4f\x9d\x1c\xf7\x20\xe4\xb1\xb9\xc2\x76\x41\xbf\x90\xd3\xbe\xd8\xae\x11\xdb\x05\xcd\xbc\xad\x86\xb7\xed\x35\xe6\x71\xd1\xcc\x6d\x56\x3b\xcf\x5f\xe0\xf4\x6b\x9c\x6e\x89\x6d\x8b\x36\xa7\x1f\xf0\xf8\x59\xe2\xef\x9b\x9c\x76\x8d\xbf\x67\x3c\xe6\x46\x6c\x4b\xcc\xb3\x1e\x34\xb8\x76\x38\x8f\xf8\x29\x59\x06\x59\x5b\x87\xc7\x52\x60\x74\xcd\x06\xe3\xcd\xe3\xde\xc8\x32\x3b\x3f\x97\x31\x2a\x7a\x2b\xcc\x65\x97\xd8\x04\xd6\x46\xef\xb3\xbe\xcb\x58\x8e\x64\xb9\x9c\x47\x3d\x65\xf5\x59\x04\xba\x72\x03\x6c\x0a\x99\x8f\xb1\x4d\x4d\x38\xc7\x90\x39\x0d\x97\xe3\xc5\x85\xdd\x67\x75\xf4\x0a\xe3\xb5\xc5\x34\x58\x65\xde\x1c\x71\xff\x35\xb9\xaf\x51\x4e\x2e\x14\x73\x2e\xcb\x9f\x2b\xf9\x5c\xc2\xd8\x16\x32\xff\xb0\x72\x6d\x31\x97\xb1\x56\xc7\x0e\xf3\x72\xac\x5d\xc6\xf6\x92\xd5\xc7\x61\x31\x77\xb0\x7c\xb2\x95\xeb\x03\xdb\x2f\x4d\xe6\xc7\x45\xb6\x8b\x96\x99\xc7\xb8\x7d\xa6\xbf\xac\x0d\x1f\xf3\xfc\x4a\xe6\x17\x23\xb0\x79\xb7\x80\xaf\x17\x19\x8f\x15\x1e\xaf\x1d\xbe\x5f\xe4\xf1\xb9\x9e\xb7\x7f\xec\xc7\x4e\xd9\xd6\x6c\xb1\xfd\xb1\x08\x7d\x24\xfd\xb0\x0e\xe3\x4a\xec\xaf\x34\x6f\xb7\xe1\x73\xe9\x67\x6b\x27\x70\x9f\x78\x6c\xd7\xc9\x3c\x8c\xd8\xe6\x1d\xcf\xaf\x3a\x85\xed\x3b\xb6\xab\xd7\x59\x36\x8a\xdc\x66\xb9\x6c\xf1\x69\xf2\xbb\x1e\xd8\xb5\x03\x28\x9f\xe7\x64\x96\xd7\x52\xc6\x5f\xc6\x76\x0b\xec\xd5\x90\xf3\xf7\xc1\xbe\xdb\x2a\x74\x96\xb1\x07\xac\x7e\x9c\x67\xbb\xb4\xc9\xf3\xed\x21\xf0\x66\xc2\x3c\x3e\x00\x3b\x9b\xdf\x59\x3d\xd5\xcd\xfb\xcd\xd0\xd4\xea\xb5\x76\x41\xbf\x31\x2d\xe6\xf2\xf9\x93\xe5\x0b\xe1\xf3\x25\xe8\xc7\x0e\xcb\xad\x88\xe7\x59\x03\xb6\x39\x07\xec\x6f\xca\xc0\x96\xeb\x33\x2d\x32\xc0\x0f\xed\xce\x01\x8c\x21\xb0\xfd\x6a\x6b\x30\x7e\x62\xb0\xeb\x47\x60\x73\x76\x0a\x79\x2a\x76\xbe\x91\x1d\x63\xda\x8e\x20\x7f\xa4\xe6\x0d\x38\xbf\x4c\x60\x6e\x1c\x02\x9e\x2d\x48\x1f\x02\xee\x23\xce\x2b\x78\xb5\xd9\x0f\x92\x38\xca\x60\xfe\x18\xf7\x4f\xef\xfe\xf3\xe7\x71\x79\x38\x7f\xc9\x40\x9e\x48\xda\x55\x35\xbf\x49\x8a\xfe\x0d\x42\xc8\xcf\xe9\xed\xdc\xbd\x0f\xfd\x06\xf3\xa5\x71\x1d\x29\xd8\x31\x21\xf8\x1e\x42\xa0\x19\xf6\xd9\x9a\x9a\x33\x2c\x3a\xe6\x0e\xf2\xad\xcf\xef\x22\xae\x4f\xca\xec\x6c\x9f\x8b\x8d\x71\x84\x39\x80\x3f\xdc\x8e\x9f\x9d\x07\xf3\x73\x2d\x53\xfa\xb4\x05\xfd\x99\xc1\x18\x8e\x80\x56\x43\xa0\x41\x0a\x76\x65\xcc\xf3\xe1\xa4\xe8\x23\xaf\xa7\x7c\x3e\x29\xf0\x30\xf6\x4b\x87\xdf\x2f\xf2\x1c\xa4\x09\xb4\xe5\x79\xe1\x58\x1e\xc6\x40\x83\x04\xf8\x4a\xcf\xbf\x70\x5e\x2c\x34\x5d\x61\x59\x33\x02\x1a\xf7\x80\x6f\x3b\x2c\x53\x96\x0b\x99\x38\xb6\xab\x62\xc0\x3b\x03\x1a\xce\xaa\x79\x16\xcb\x2b\x4f\xe4\x49\xc2\xf3\x2d\xf1\x75\xa7\xdb\x79\x7a\xcc\x37\x03\x18\x3b\xdc\x26\x2f\x04\xb9\xc3\x7d\xed\xf7\xa0\xfd\x71\xd1\xe6\x5a\x0c\xf2\x69\x9e\x75\x55\x37\x9f\x83\x58\x1d\xb7\xc2\xf6\x12\xcf\xd7\xc6\x63\x4c\xfa\xbb\x5d\xf8\xfd\xb6\xcd\xfb\xd5\xfc\x77\x4c\x37\xf0\x29\x8d\xe7\x92\x3d\x18\x1b\x09\xf3\x38\xd3\xc6\x97\xb6\xae\x00\x7d\x37\x40\x1e\xf6\x59\xf7\x85\xa0\xf3\x96\x54\xdd\x6c\x03\x18\x9b\x95\x96\x81\x8e\x03\x18\xdf\xfd\xed\x73\x7b\xd1\x2d\x16\xd6\x60\x5c\x82\x9d\xe8\xc7\xa0\xb3\x52\x25\x5f\x33\xd0\xc3\x8b\x2c\x0b\x7a\xb9\x8d\xb1\x6d\x8c\x48\x1f\x74\x58\x97\x76\xb8\xdf\x79\xce\x55\x03\x19\x62\xf4\x8e\xc5\xbf\xaf\xe8\xca\xbe\x3e\x6b\x97\x2c\x32\xad\x56\x0b\xfc\xfd\x10\x7c\x07\xfd\x82\xcf\x3c\xf6\xb3\x8c\xfb\x24\x05\xde\x46\xfe\x4e\x1d\xfe\xce\xcd\x5c\xbf\xd9\xb9\xc6\x2a\xdb\x4a\x43\x90\x65\x11\xd3\x1c\xc7\x2b\xca\xbd\x2e\xcf\x03\x37\xc1\xbe\x13\xff\x45\x5f\xf9\x1e\xd0\x8f\xc2\x7e\x68\x29\xc3\xe2\x9f\x2a\x7d\x27\xf2\x77\x15\xf2\x2f\x6e\xef\x27\xf1\xaf\xd2\x6a\xa1\xdf\x91\x1f\xfc\x81\xea\xd3\x08\xe4\x2f\x3e\xa7\x0e\xf9\xd9\x81\x3a\x53\x90\x4d\x9d\xed\x63\x7d\x6c\xe7\xcc\xb3\x1f\x5a\xec\xa3\xa8\x90\x6d\xd6\x47\x4d\xaa\x0f\x86\xea\x5e\xca\x5d\x87\x74\xda\xcf\x9e\x81\xfc\x12\x9b\x8a\x94\x4f\x18\xfd\x4a\x89\xea\xaf\x04\xc6\x61\xaf\x18\x6b\x06\x3f\x5b\x06\xac\x87\xd6\xe6\x0b\x3b\xcf\x8e\xd5\x4d\x90\x7b\xec\x5f\xf4\xfb\x85\x2d\x66\x6d\x4f\xb6\x85\x0d\x0f\x19\x5b\xc6\xd8\x9d\x76\x0e\xc3\xeb\x76\xd6\xe6\x5a\x67\xff\x06\xaf\x91\x79\x6d\xf6\x55\xb0\xcd\x66\xc7\xca\x26\x8f\x27\xa4\x51\xbf\xb0\x9f\xed\x9c\x29\xe4\x3e\xc1\x75\x5c\xa6\x4f\x20\xbe\x59\xfe\x66\xe7\x55\x23\xd5\xb7\xac\xfb\x3c\xb6\xe9\xc7\xe3\xa5\xa3\x74\x49\x06\x36\x72\x56\xd8\x45\x42\x77\x9b\x7e\x0b\x64\x77\x07\x6c\x11\xe9\xa7\x79\x90\xf3\x5d\xb0\x6d\x3a\xca\x26\x61\x3c\x6a\x21\xc8\xb2\x6e\x6e\xe3\x8b\xaf\x67\x3c\xdf\xde\x84\x79\x09\xfb\x15\x02\xf6\x3f\xdb\x39\xc1\x22\xcb\x19\x6e\x8f\xb1\x05\x7d\xae\x47\xfc\x44\x66\x6e\x68\xec\xcd\x20\x2d\xe6\x42\xe3\xf5\x88\x61\x3e\xef\x33\xfd\x61\xee\x6b\x61\xe1\x1b\x34\xe5\x8e\xfd\xa5\x8b\xa0\x87\xd9\x8e\x0d\x78\x5d\x77\x9b\x9f\x75\xc0\xf8\x0c\xd9\x0f\xd0\x02\xfd\xd1\x03\xfa\xc6\x50\x1e\xda\x98\x5d\xc5\xd7\x31\xe8\x1c\xe9\x97\x88\x79\x1b\xd7\xc0\x44\x6f\x2c\x16\xf2\x78\x2c\xbb\x70\xed\x4a\xc6\xeb\x92\xb2\x27\x78\xec\xd8\x75\x55\xed\x13\x1f\xc2\x18\x8d\x0a\x3e\xac\xad\x03\xcf\xb2\xbc\xf2\x41\xde\x89\x1d\x84\xf3\x29\x4a\x60\x5d\x2b\xda\x2e\x4f\xbd\x85\x62\x8e\x6b\xfd\xc0\xb2\xc6\xa4\x6c\x4f\xd2\x73\x83\x15\xc6\xb9\xcf\xfd\xb1\xa4\xd2\x6d\xf0\xfd\x56\x81\xaf\x95\x71\x19\xf0\x76\x67\x7b\x9e\x5a\xa3\xa0\x69\x0d\x68\x61\x7d\xb5\x0b\xdb\x71\xd0\x32\xcf\xa3\x62\x5c\x98\x39\xfc\x78\xae\xcb\xe3\xc7\x7c\x1f\xaf\x1d\x81\x0e\xc8\x63\x92\xd4\xfb\x10\x6c\xd0\x9e\xa2\x01\xea\x9d\xbe\x1a\xf3\xd2\xdf\x03\xe8\xb7\xc5\x42\xa6\x9b\xb9\xb8\xc5\xa3\xc9\xb4\x18\xb2\x4c\x59\x60\xfc\x23\x98\x5f\x66\xb0\x3e\xc8\xba\xd0\xd2\x25\x04\x5d\xd8\x6f\x6c\x8b\x07\xf2\x12\xf0\x6b\x89\x2e\x13\x7b\x20\x62\xdd\xb4\xc9\x32\x39\x2d\xea\xf3\x52\xa8\x77\x1d\xe4\xcf\x10\xde\x4b\x2c\xc2\x1a\xf4\xe1\x22\x7c\x23\xfe\x36\x2a\xc6\x94\x19\xe3\xe2\xe7\x42\xd9\x3f\xb6\x67\x46\xcc\x8f\x32\x0f\x1b\x30\x2c\xf3\xda\xce\x1a\xac\xe9\x24\x2c\x7b\x96\x72\x3c\x82\x36\xfb\xdc\x98\xbe\x1e\x8f\x7d\xe9\x4f\x3f\x61\xbf\x17\xeb\x07\xcb\xe3\x03\xae\x3b\x65\x39\xb7\x98\xeb\xb6\x60\x8e\xfd\x1c\xbd\xed\x3e\xe8\xf1\xda\x66\x5f\xe9\xba\x95\x62\x4e\x3f\xa6\x95\xd0\x7b\x13\x78\x83\xfd\x9c\x63\x9f\xb4\xd8\x39\x2b\xb9\x2d\x1d\xac\xf3\x5a\x84\xf8\x2c\xda\x1c\x3f\x32\xe2\x6f\xab\x3c\x5f\xdf\x62\xff\xfd\x16\xdb\xe0\x0d\xf6\xe9\xaf\xf2\x5a\xc0\x1a\xc3\x3a\xcb\xf0\x36\xaf\x81\xc8\x5a\x01\xaf\x5b\xdb\xf7\xe2\xa3\xed\x70\x39\xf3\xfc\x8e\x7d\xd2\x76\xbd\xa4\x09\x3e\xe7\x26\xc4\x90\xc8\x5a\xf9\x1c\x7f\x9f\xe7\xb5\x95\x05\x96\x61\x0d\xc6\x71\xae\x88\x83\xb1\xbe\xd9\x3e\xe3\xba\x01\x6d\x08\xc1\x7f\x3e\x0f\x7e\x60\x89\x8f\x69\xb3\x3f\xa7\xcd\xdf\x52\xe6\xa5\x90\x71\x6f\x83\x9f\x3d\xe6\xf7\x6d\x2e\xa3\x55\x80\x6d\x0f\xd7\x61\xef\xe7\x38\xff\x1c\xeb\xb9\x05\xee\x83\x15\x28\x3b\xe1\xba\xc4\xb7\xce\xbe\x66\x4f\xd6\xa6\xc4\xd7\x2c\x7e\xfc\x0e\xb7\x71\xad\x58\x57\x1a\xfb\xd3\xdb\xfc\x5d\xda\xbc\xc9\x7e\xbc\x11\x97\xdd\xe5\xba\x63\x87\xed\x17\xb2\x1c\x5d\x2d\xf8\xce\xfa\xdf\x42\xf0\xbb\xcd\x73\x1f\xf1\x3c\x49\xd6\x2e\xc7\x7d\x2c\x6b\xa4\xc3\xc2\xef\x1e\xf0\xd8\x32\xb2\xc1\xe7\xf9\xb1\x1d\x6b\x8b\xc5\xba\xc6\xcc\x5c\x8e\x4b\xbd\xd1\xa0\x7a\x4b\xe9\x56\x9e\xe7\xd9\xf6\xc3\xdc\xc9\x1f\xc2\xba\x03\xaf\xc9\xf9\xa0\xf3\xad\xae\xa7\x06\xd5\x9b\x79\xb9\x7e\x0f\xec\xbe\x39\xb6\x17\x7b\x3c\xbf\x67\xfd\x5a\xdb\x04\x5f\x2c\xaf\xff\x58\x7f\x3b\xaf\x0b\x99\x32\xec\xba\x5a\x87\xe7\xa2\x09\xc4\x34\xb0\x1d\x6a\x74\x87\x9d\x57\x0d\xd9\xc7\xbd\xae\x6c\xa4\x24\x97\xf5\x56\x96\xf0\x38\xf7\xfb\x85\x9d\x6a\x6d\x93\x45\x35\x3f\xda\x02\x9d\x8b\xeb\xd7\xec\x1f\xb5\x3e\xba\x16\xeb\xa3\x85\x9c\xd6\x96\xff\xd9\x46\xf5\x78\x9d\xdf\x5b\xcc\xaf\x46\xae\xdb\xf5\xba\x2d\xe0\xc9\x59\x1e\xc7\x5b\x39\xdf\x58\xfe\x23\xf6\x01\x33\xd8\x31\xb7\xc8\xb1\x2b\x73\xf9\x38\xb1\x6b\xfa\x12\x5b\xc6\x6b\xa6\x76\xac\x73\xbc\xc5\xb8\xde\x39\xf8\x2e\xf1\x71\x6b\x10\x23\xc6\x63\xd8\xda\x6f\x82\xd3\x02\xd7\x2d\xb2\x67\xb3\x90\x45\xb2\x36\x66\xfd\xd3\xeb\xf9\x9a\xae\x5d\xbb\xdc\x64\xdf\x28\xeb\x3c\x89\x83\xb3\x71\x10\x6c\x93\xda\x72\xd7\x99\xff\x08\x70\x26\x96\xed\x09\x97\x31\x57\xc8\x1a\x4b\x8b\x26\xdb\xe0\xdc\x16\x89\x67\xf3\x56\x8a\xb5\x51\x1b\xa7\x35\x57\xa4\xb7\x6b\xa5\xdc\x16\x9b\x9e\xdb\x31\xa6\x0d\xaf\x75\x8c\xe3\xba\xd6\x0b\x5a\x5b\xfe\x6e\xe4\xfc\x65\xed\xd7\x85\x9c\xef\xc6\x72\x59\xd6\x06\x17\x0a\x1a\x8d\xeb\x5c\x2d\xd6\xf4\x2c\x8e\x2c\x27\xac\xec\xde\x2c\xfa\xc0\x67\x7f\xb6\xb5\xb7\xa5\x6f\xd8\x47\x2d\x72\x93\x44\x3e\x6f\x72\x3c\x43\xc4\xb4\x66\x5c\xac\xee\x6d\xb2\x0c\xd8\xe2\x7c\x5d\x88\x59\x24\x06\x5e\xeb\xb4\xeb\xf3\xf3\x2c\x8b\x12\xb6\xb3\x57\xc1\xd6\x10\x7b\x54\xfc\xd6\x03\xb0\xaf\xfa\x60\x67\x2c\xb3\x7c\xdb\x60\xfa\x6c\xf1\x5a\xa0\xd8\xf4\x1c\xb7\x61\x6c\xa1\xda\x8a\xb2\xab\x32\x98\xc3\x80\x9f\x44\xd6\xdb\xc7\x7e\xb7\x2d\x65\x1b\x0f\x98\xb6\x43\xd0\x15\x0d\x90\xe5\x0d\x96\x5d\xb2\xde\x96\x15\x7e\x45\x3f\x2a\xe6\x38\x3e\xaf\x63\xc8\x3a\xa7\xac\xff\xd5\xb6\xe0\xba\x5a\xb4\xcf\x13\x7d\xb4\xc4\xe5\xb3\x4d\x1a\xc8\x5c\x9d\xd7\xd9\x6d\x9f\xf3\x3a\x90\x2f\xb2\x72\xab\xf0\x61\xdb\xf9\xeb\x88\xf1\x5e\xcf\xbf\x07\xcc\x8b\xb6\xec\x90\xed\xa2\x25\xc6\x75\xc0\x31\x56\xcc\x67\x22\x7b\x2c\x0e\x4b\x8c\x3b\xd7\xe1\xf3\xfc\xdf\xc6\x18\x48\x6c\x67\xbb\x90\xd3\x35\xf1\x43\x08\x0d\x9a\xbc\x06\x95\x15\x36\x19\xf1\x1a\x78\x4d\x62\x5a\xbb\x39\x4e\xb5\x79\x88\x5b\x11\xbf\x98\xd8\x57\xd2\x9e\x21\xd8\x4e\x03\x6e\xbf\x8c\x3d\x4e\x33\xb6\x27\xd9\x37\xe7\x75\x98\x6e\x9d\x9c\x6f\x6a\xec\xe7\xf7\x25\x3f\xc7\xaa\x8d\xf9\x67\x58\xc4\x2d\xda\x71\xb4\x9e\xdb\xd4\xe3\xf9\x85\xcc\xa3\xb7\xc0\x3f\x21\x76\x3e\xc7\x8b\xd8\x34\xab\x6c\xeb\x2d\x72\x5d\xcd\x62\xed\xcc\xbe\xd7\x73\x1c\x5e\xb3\x1f\x97\x05\x6b\x01\x66\xec\xda\xf9\x46\xa6\xfc\xb0\x12\x23\x32\xcb\xfa\x4c\x6c\x82\x75\xf6\x3d\xc8\x9a\xec\x1c\xaf\xbb\x6e\xf1\x3b\xb6\x9b\xed\x5a\xab\xac\xb9\x0e\x73\x3b\x60\xdc\x1e\xbd\x16\x30\x84\xd8\xbd\xae\x9a\xa7\x80\xdf\xc7\xca\x99\x98\xf9\xa2\xc5\xfc\x26\xf2\x65\x08\x72\x82\x63\xed\x2c\x8f\x89\xdf\x20\x2b\x7c\x7b\x62\xd3\xd4\x12\x1e\x0b\x23\xa6\x11\xda\x09\x21\x97\xd5\xc9\x75\xfb\x78\x4c\xb6\xc1\xd6\xe2\x34\x63\x5f\x90\xac\x7f\x71\x8c\x9e\xf8\x55\xad\xdc\x62\xbb\xc2\x96\xd3\x02\x7f\xc2\x12\xf3\x5e\x52\xc4\x2c\x58\x7e\x59\x2b\xfc\x2c\xbe\xc4\x30\x6f\xb1\x5d\x37\x28\xe2\x60\x7c\x8e\xc9\x1e\xfb\x2e\xc4\xfe\x64\x7b\xd4\xc6\xe5\xa5\x2c\xcb\x16\x21\xc6\x9a\x63\xb8\xad\x8d\xc0\xb1\xb3\x36\xde\x70\x2b\xb7\x07\xbc\x4e\xe1\x13\x90\x31\x68\x7d\xc5\x12\xaf\x2a\x71\xf5\xdd\xa2\x4f\x84\xb7\xac\xce\x59\xe1\xb8\xb8\x16\x97\x91\x16\x73\x54\xbb\x36\x9d\x15\xb2\xc1\xe2\x90\x6d\x5f\x7b\x31\x7a\xd9\x6f\xab\x38\x06\x91\xb3\x71\x31\x66\xc6\x7c\xbd\x06\x31\x7c\xad\xed\xeb\x9e\x9e\xf8\xb9\xfb\xdb\xe7\xbb\xbe\xac\x7b\x73\xfc\xa8\x5d\xf3\x96\x78\x45\x5e\x4f\xf4\x21\x5e\xae\xd6\x80\xf8\x99\x26\xfb\xd2\x97\x8b\x75\x9b\x6d\xf3\xfc\x01\xd8\x5b\x10\xd3\x42\x42\x07\xb6\x95\x6d\x0c\x02\xaf\x53\xf8\x6c\x0f\x7b\x18\x8b\x12\xb1\x4e\x5f\x66\x3e\x1b\x71\xde\x5e\xde\x66\x89\x7d\xb2\xfd\xbc\x00\xf1\x72\xdd\xc2\x7f\x62\xed\xbb\xf5\x7c\x5c\xda\xb5\x55\x89\xb9\x1a\x70\x6c\x98\xc4\xbf\xf6\x21\x8e\x8b\x69\x30\x8e\xff\xea\x17\x71\x59\x36\x6d\x52\xc4\x8a\x8d\xe3\xce\x56\xf8\x59\xe6\x83\x4b\xb9\x3f\x55\xe6\x5b\x1e\xef\x4b\xb0\xcf\x62\xe3\x89\xdd\xb2\x58\xc4\xc5\xd9\xba\x86\x60\x87\x2e\x16\xf3\x4a\x8f\xd7\x85\xec\xf7\x65\x88\x27\xeb\x01\x6e\xd2\x46\x89\xcf\x69\x15\xf3\x53\x6b\x37\x71\x7c\x92\x2d\x6f\x8d\xcb\x58\x66\x1b\x8f\xfd\x52\x86\x96\x63\x7f\x00\xac\x8f\x59\x79\x28\xb1\x7e\x12\x97\xcd\x3a\xdf\xc8\xbe\x80\x65\xb1\x1d\xdf\x9b\xc0\xbf\x7a\x1d\x60\x0d\xf4\x16\xf8\x97\x7c\x59\xf7\xe8\xc0\x9a\x28\xc4\xb7\x6e\xf3\xe9\x75\xb6\xaf\xa3\x5a\xdf\xbb\xc4\xa2\x0c\x61\x1d\xa2\xc3\xf6\xf1\x3a\xdb\xf8\x1b\x1c\x7b\xc7\x3e\x3d\x1b\xd7\x36\xc8\xed\x53\x23\x1b\x6a\xb2\x1e\xbf\x0a\x34\xde\xca\x63\x68\x64\x6e\x6a\xaf\xac\x57\xc7\x76\xe7\x2c\xf7\x2b\xf3\x86\x1d\x7b\x03\xb6\xb1\x06\x45\xbc\xb4\x95\x1b\x1c\x1b\x60\x71\x5e\x02\x9f\x7e\x47\xf9\x9c\x53\xb5\xe6\x18\x81\x9f\xb2\x03\x7e\x50\xed\xaf\x16\x59\xbc\x08\xf9\x16\xc1\xa7\x17\x83\xbc\x49\x61\xfd\x0f\x7d\x24\xc3\xed\xeb\xdb\xfe\x1a\x94\xcf\xbe\x16\xdb\xde\x45\x88\x3b\x60\x39\xea\x45\xd0\xe7\xbd\xa2\x6e\x2b\x5b\xbb\x60\x93\xe2\xba\x75\x17\xd6\xbc\x62\x88\x53\xc2\xb5\xda\x0d\x9e\x37\x4a\xec\x4b\x1f\xe2\x5e\x56\x58\x27\x0c\x81\xf6\xcb\xfc\x8e\xd7\x1b\xac\x6c\x61\x1f\xbf\x8d\x9b\xe2\xf8\x5c\xbb\x86\xb0\x5c\xcc\xf1\x25\xc6\xcd\xca\x95\x88\xbf\xb1\x5f\xd4\xea\xfa\x39\xf0\x53\xb2\x4d\x64\xe5\xd3\x10\xec\x88\x11\xf3\xd9\x02\x43\x8b\xc7\xce\x1c\xfb\xba\xbb\xb0\xae\xdd\x2b\xf6\x26\x79\x62\xa3\x88\x8f\x6f\x5d\xad\x31\x8b\xaf\x8f\xeb\xf2\x24\x06\xa7\xc3\xf7\x31\xcf\x75\x92\x5c\xc7\x6f\xf3\x95\x4b\xdc\x3b\x8f\x3f\xab\x8b\x20\xce\x48\xfc\x7c\x1e\x8f\x4b\xaf\x0d\xf6\x9c\xe8\x73\xf1\xc1\xb0\xcf\xc3\xe7\x18\x79\xbb\x57\xaa\x51\x8c\x7f\x3f\x01\xbb\x74\x13\x62\x09\x96\x78\x9e\x44\xcc\x03\x03\x88\x85\x1d\xc2\x1e\xaa\x1e\x5f\x25\xbe\x36\xe1\x7b\x49\x23\xb2\x5b\x64\x66\x5f\xc9\xf6\x2e\x7f\x1b\xb0\xac\x5b\xe6\x31\xbd\x5a\xc4\xf7\x5b\x9a\x49\xbc\x23\xe3\xeb\x0b\xbd\x86\x45\xbc\x6f\x2d\x2b\xe2\x39\x3d\x99\x63\x2c\x82\x3d\x16\x17\x7e\x3b\x4a\xc1\x36\xeb\x82\x9f\x6c\x0e\xe2\x3f\x97\x0b\xff\xbd\xec\x09\xab\xf1\xfe\x2e\xeb\xe3\xe8\x31\xcd\x07\xe0\x23\x97\x75\xa2\x21\xd3\x9d\xe7\xfc\x76\xde\xb4\x5a\xd8\x03\xa2\xa3\xc7\x76\x7e\xc6\xef\x97\x99\xee\x1c\x5b\x6e\xfd\xaa\xab\x39\xbf\x05\x71\x31\x2e\x4c\x9b\x6b\xec\xf7\xb1\xfb\x6d\x56\x41\x0f\xb1\x1f\xda\x5e\xd9\xd7\x36\xee\xa3\x01\x3f\x8b\xcc\x1c\x14\x71\xdc\x36\x96\x62\x9d\x6d\x8d\x95\x5c\x2e\x5b\x5d\xb4\xce\x73\xda\x59\x88\xcb\x1e\x40\x6c\xb6\xc4\x65\xaf\x31\x6f\x71\x2c\xb6\x27\xf6\xb4\xc4\x29\x36\x78\x8e\xe4\x5a\xbf\x83\x75\x22\xe1\x1d\x7f\x58\xe8\x40\xbb\xde\x26\xeb\xc6\x32\x86\xc1\x77\xef\x53\x21\xb7\xbd\x15\xf0\x5b\xca\xbe\x3c\xf6\x01\xdb\xf2\x36\x99\x66\x1c\x9b\x49\x19\xf8\x33\xc5\x6f\x20\xfb\x0b\x1b\x2c\x9b\x1a\x85\xff\x08\x7d\x35\x63\x1f\x00\xef\x77\x94\xb9\x89\xdf\x29\xe6\xc3\xd6\x76\x5d\x52\xeb\x3e\x7a\x4d\x68\x04\xfb\x8e\x3a\x6c\x27\x27\x85\x9f\x50\xda\x60\x74\x80\xf5\xd1\x74\x59\x3e\xb4\x0a\xb0\x31\x95\x5d\x58\xa7\x5b\xe2\xd8\x60\x8e\x95\x14\xfb\xcb\xc6\x9e\x66\x85\xdc\xac\x75\x8a\x35\x45\x7f\xa5\xd8\xbb\xe3\x6f\x14\x7a\xc6\xce\x99\x78\x9e\x62\xe3\x56\xc5\x66\x9f\xe7\x39\xd7\x32\xef\xa9\x99\xe5\x38\x3b\x5e\xd7\xb7\x7a\xbb\x55\xc8\x38\x4b\xa3\x76\x01\xc1\x6c\xb1\x3f\x64\x1c\xdb\xc0\xb2\xdb\xf6\x01\xcf\x6d\xad\xad\x9e\xc2\xba\xe9\x80\x6d\x49\xb1\x7f\x96\x14\xa0\x3e\x6e\x36\xa8\x4e\x30\x47\x9b\xe7\x7a\xd8\x96\xae\x2d\x72\xd9\x0d\x6e\x4b\x94\xdb\x02\x96\x1f\x16\x79\xae\x38\x9f\x8f\x35\x1b\x87\xda\x2b\x68\x6e\xc7\xdf\x90\xbf\x2f\x71\x7b\xe7\x58\xde\x0e\xb6\xc7\x2b\x58\x9b\x9c\xe3\x28\xec\x38\x5b\xe3\x34\x43\xb5\x6e\x97\xf2\xbc\x2b\xe6\xf8\xe5\x05\x4e\xcf\xb6\xbe\x0f\x7b\xf0\xc6\x79\xb4\x4d\xe2\x00\x89\x1f\xb0\x34\x10\x7f\x47\x5a\xcc\x37\x24\xf6\x49\x7c\x57\xb6\x2f\xe7\x99\xe6\x3c\x1e\xed\xd8\x1a\x30\x9d\x46\x1c\xab\x34\xcf\xfa\x56\x64\xdc\x22\xd8\x3e\x9d\xed\x71\x5b\xb2\x66\x47\xbc\xfe\xe1\x8d\x60\x1e\xb4\xa4\xe2\xab\xc2\x62\x7f\x82\xbc\xaf\x2d\x16\xfa\xd4\x97\x58\x5e\xb6\x95\x7c\xf1\x1d\x72\x8c\x83\xc4\xad\xcb\xfc\xcd\xf2\xae\xd4\x83\xf3\x7b\x8c\x4b\x4a\x54\x6c\x55\x97\xf7\x4d\xad\xb2\x5f\x69\xbd\x88\xed\xb7\xf1\xe0\xed\xdc\x26\xb7\xb8\x2d\x00\xae\x09\xf7\x61\x9f\xfd\x5d\xbc\x2f\xb0\xc6\xb1\xfb\x12\x5f\x2e\xb6\x5c\x8d\x65\x60\x5d\xf6\x2e\xf4\x1b\x54\xe7\xf9\xa9\xd8\x59\xb5\x4d\x15\x0b\xe3\x00\x9f\xe3\xed\x6d\xdf\x25\xdb\x6d\x54\x8b\xeb\x2c\xe8\x78\x18\x6f\x76\x8c\x35\xf9\x2a\xfc\xde\xcc\x6d\x2f\xeb\x9f\x58\x2f\x78\xdd\xce\x4b\x97\x21\x16\xa3\xb7\x7d\xfd\x50\xe6\x94\xb2\x6e\x60\xca\xaa\x47\x0d\xaa\x0f\x8a\xbd\x77\x12\xe3\x2d\x71\xdd\x42\x2f\x2b\x93\x78\x9f\xd8\x38\xd6\x64\x89\xe3\xb1\xb7\x38\xff\x1a\xcc\x9f\x13\xd8\x33\x96\x28\x7d\xd2\x51\xfb\xc9\x24\x8e\x89\x98\x67\x78\x9c\xd7\x92\xa2\x8f\xfc\x35\x88\xa5\x8c\x60\x2f\x09\xcf\xed\xc4\x57\x54\x63\x9f\x98\xcf\x36\xb7\x4d\xc7\xfb\x0f\xc6\x7a\x69\xc0\xfb\xd4\x16\x8a\xfd\x3c\x35\x88\xb3\xad\xcd\x42\xbf\xcc\x73\xdd\xbc\x4f\xde\xd2\x68\x58\xc4\x4f\xd7\xd9\xef\x69\xd3\x6d\x80\xdc\x95\x3d\x12\x5b\x85\xff\x5f\xe4\xba\x5d\x17\x9d\x85\x7d\x87\x2b\x6c\xc3\xb4\x59\x7f\x6c\xb1\x7d\xd5\xe3\xb9\x13\xb1\xce\xe8\x73\x5b\x17\xf8\x1c\x00\xf1\x4b\x2c\x33\x1f\x76\xb9\xfc\x35\x1e\x87\xfd\xc2\xbf\x63\x71\x11\xbf\x1d\x15\x3e\x70\x9f\xf7\x14\xf8\x6c\x2f\x8c\xed\x21\xd9\x83\xc1\xfb\x1e\x6a\x18\x1b\x33\x82\xfe\x64\xff\x8c\xd5\xd9\x19\xc3\x3c\xc8\xec\x11\xec\x5d\xe1\xf5\x04\x03\x1e\xef\xcf\xb1\xcf\x4d\x9e\x6b\x2e\xb3\x6c\xef\xc1\x1a\x83\xc4\xeb\xcb\xfe\x91\x61\xb1\x7e\x30\x8e\x6f\x1f\xb0\x8d\xb8\x94\xcb\xe6\xfa\x7a\x83\xea\xdd\x06\xd5\x93\x06\xd5\xe7\x1a\x54\x87\xd8\x4a\xb1\xf5\xc6\xfb\x4e\x63\xd8\x27\x32\x5b\xf8\x2c\xad\xbd\xb7\x9e\xf3\x85\xe9\xab\x7a\x8b\xfb\x31\xcd\xc7\x80\xcf\xfb\x1e\xfd\x75\xa0\x2d\xdb\xa4\x81\x19\x53\x6d\x58\x63\x66\x1f\xe5\x78\x7f\xd2\x6c\x31\xd7\x10\x1b\xcd\x8e\xef\xf5\x62\xde\x68\xd7\x75\x96\x0a\x7d\x6c\xca\x09\x64\x6d\x63\xc4\x34\x12\x9d\xc4\xf3\x06\xd3\xde\x1a\xac\x09\xda\x36\xf3\x18\xb3\x7d\x3e\x2a\xe2\x29\xec\x5e\x41\xde\x17\x68\xe5\xcb\xb2\xf2\xa7\xf6\x0a\xfb\x67\x1c\x6f\x95\xaa\x75\x0b\x00\x3b\xcf\x6c\x17\xbe\x0c\x92\xbd\xbc\x31\xf3\x7e\x9a\xd3\xcf\x8e\x07\xd9\xe3\xdb\x2b\xe6\xa3\xb2\x9e\x58\x93\xf5\x50\xf4\x9d\x35\x0b\xbe\xb5\xf3\x1e\xd9\x7b\xd7\x87\x79\xab\x8c\x01\xb6\x75\x6c\x3d\x62\x3b\x25\x30\x4f\x19\x31\xcf\x2d\xb0\xfd\xb3\xc0\xf5\x8a\x4d\x94\xc0\xbe\xa2\x05\x1e\xd3\x21\xcb\x96\x21\xdb\x65\xf3\x0c\x6c\x3f\xd9\x3a\xc3\x42\x2f\xdb\x3a\x78\x1d\xd8\x6f\x6e\x97\xc9\x76\x7c\x35\xd9\x57\xb7\x5c\xf8\x41\xcc\xfb\x60\x08\x6b\xbe\x6c\xef\x06\x3c\x7e\x82\xb0\xf0\xd7\xdb\x3c\xad\xe2\x8c\x0d\x63\x43\xf9\xe2\xcf\x5f\xc9\x71\xb6\xeb\xdf\xa2\x17\xfb\xcc\xdf\x73\xb0\x26\x2f\x6b\x91\x12\xd7\x30\x57\xec\x49\xb5\x36\x80\xa4\x1b\x30\xdf\xca\x7e\xae\x56\x41\x2b\xbf\x57\xd8\x47\x3e\xef\x37\xf6\x39\x56\x43\xe4\xf8\x78\xbd\xa9\xcb\xb6\x57\x5c\xc4\x17\x58\xb9\xbe\x0a\xfd\xc8\x7b\x71\xea\x1c\x8b\x16\xac\xaa\x78\xb5\x16\xc7\x07\x34\xc0\xae\x18\x16\xfb\x7a\xfd\x4d\xe5\xef\x52\x20\xeb\x72\x12\x67\x64\x75\xce\x5c\xb1\x6e\x35\x96\x3f\x11\xcb\x4d\xdc\xe7\xd8\xe1\x79\x85\xc4\xf1\x44\xec\x23\x60\x5e\x11\xbb\xc5\x93\x3d\x98\xb2\x4f\x1f\xe2\x62\x82\xa5\x9c\x27\x02\xb6\xc9\xc7\x73\x8a\x35\xf0\x31\xf3\x1c\xb4\x26\x6b\x50\x19\xec\x1b\x64\xfb\xc1\xd2\x55\xd6\x22\x64\x0d\x63\xa1\x58\x17\x1f\xf3\x18\x9f\x69\x21\x7b\x5a\x65\x7e\x6e\xe6\x5b\xd6\x6e\x62\xd9\x3b\x5e\x0f\x90\x35\x82\xb9\xc2\xbf\x65\xc7\x12\xef\xab\x1d\x8f\x3b\xa1\x77\x9f\xe7\x50\xab\x85\xad\x10\xcc\x43\x9c\x80\xd8\x5b\xb8\x16\xc5\x7b\xf8\xea\x46\xa6\xce\x17\xfb\xf1\xec\x5a\x21\xef\xe3\x93\x3e\xb7\xe3\x7e\x91\xc7\x19\x9f\x1d\xe3\x85\xb0\x7f\x64\x04\x6b\x67\xb2\xd7\xa6\xcf\x63\xb7\x5f\xec\x8b\xb7\xf3\x2a\xb1\x0f\x78\xdd\x5b\x62\xf5\xc7\x7e\x28\xf1\xed\xc4\xbc\xf7\x6f\x56\xad\xaf\xa5\xc5\xfa\xde\xd8\x2e\x61\x3f\xef\x58\xce\xb5\x99\x3e\xab\x6c\xe3\xa5\xc5\xdc\x31\xe0\xf1\x25\x73\x02\x99\x8b\xd5\x38\x36\x2b\x68\xf0\x3c\x85\x65\xb5\xc4\x97\x8e\x65\x54\x0a\xe7\x22\xac\xb0\x9e\xdf\x00\x59\xd6\xe6\x79\x7d\xa7\xf0\xf3\x8d\xe3\xd4\xfa\xec\xab\x8b\x0b\xbb\xd5\xe6\x9d\x2d\xfc\x5a\x56\x66\xb1\xbf\x44\x74\x5a\x30\x0b\x31\xab\xb2\x0f\x33\x2b\xe2\x73\x64\x7f\x74\xad\x03\xf2\x98\x63\x67\x65\x8f\xea\xd8\xf6\x5f\xe5\xb8\xd7\x79\xb0\x95\x71\x3f\x0a\xc7\x87\xfb\x3c\x37\xb6\x7e\x8f\x3e\xcb\xfc\xb0\x38\xbf\xc9\xe3\x3e\xb2\xfe\x41\xe0\xad\x5a\x0c\xb1\x67\x6c\x6b\xfb\xec\x0b\x0c\x78\x1c\x06\x6d\x18\x8f\x43\xc6\x9f\xd7\x1b\x64\x9f\xbe\xc7\x7e\x53\xb1\xf3\xec\xba\x32\x15\x73\xb8\xf1\x5e\x65\x8e\xbb\x1a\xc7\x98\x2c\xc2\xda\xe2\x3c\xdb\x6d\xbc\x5f\xdf\xc8\x72\x63\x13\x04\x3c\x3f\xb7\xe7\x1b\x0d\x0a\x39\x6f\xda\x6a\x6d\xe7\x2c\xf7\x93\x5b\x7c\xdb\x5c\xfe\x16\xcf\xc1\x37\x0b\x99\x34\x8e\xd7\x8e\xb6\xaf\x13\x8d\x6d\x6a\x53\xd7\x1a\xf7\x09\xef\x3b\x0e\x64\xaf\x26\xfb\xb5\x7d\x2e\xdb\xe7\xb8\x92\x60\x93\xed\x58\xae\xdb\xf0\x47\x9d\x7d\x0b\xdb\xe4\x87\x9c\x95\x33\x28\x7c\xba\x62\x0f\xfa\xb0\x7e\x3d\x9e\x83\xb0\x5f\x29\xc0\xd8\x87\x95\x62\xfe\x67\xf4\x39\xee\xab\x92\x39\x5e\x80\xfb\xa1\x24\xf6\x2d\xe4\xf9\xce\x72\x83\xea\x12\x57\x26\x6b\xaf\x12\x87\xb6\x58\xac\xc7\x8b\x7e\xb2\xf2\x71\x89\xed\xb6\x2d\x2e\x73\x83\xc7\x56\x1b\xe6\x68\xe2\x0f\xdf\x82\x75\x31\x91\x2f\x1d\xf6\x67\x31\x4f\x5a\xd9\x37\xcf\xe3\x90\xe5\x9c\x9d\xc7\xae\x15\xed\xaf\x53\x31\xa7\x12\x9e\xb7\xf9\xc5\x6f\xb9\x56\x8c\x41\x1b\xa3\xb9\xc5\x7d\x26\xfa\x68\x04\xbe\xfb\xce\xf6\xb9\xb0\xe1\xa1\x40\xf6\xc7\x77\x0a\xd9\x37\xf6\x65\x0d\x61\x9d\x82\x75\xf6\x78\xaf\x58\x02\x6b\x21\xb8\x46\x94\x6d\x9f\xab\xd5\xd4\x9e\x0e\xeb\x8f\x59\xe5\xb5\xd9\x55\xd8\x43\xdd\x65\xdb\xb5\x57\xf0\x67\x20\x3e\x99\x0d\xb6\x91\x7a\xbc\xf7\x20\x2c\xf6\xf8\x8a\xfe\xa9\xe1\xde\x18\xd9\x83\xbf\x51\xd8\x1b\x96\xa7\x7a\xf9\xb8\x90\xb8\xda\x6d\x67\x12\x6d\xe5\x6b\x59\x86\x5f\x03\x94\xd7\x03\x68\x2f\xeb\x13\x7f\xa5\xe8\x5b\x6b\x2f\xb4\x1d\xf6\x6c\x0b\xd6\x88\x09\xf6\x3d\xf1\x5a\x4f\x6d\x15\xda\x9a\x38\x7c\x87\x12\x07\xcc\xf6\x4b\x6d\x04\x31\xf9\x31\xec\xa5\xc0\x78\xf0\x74\xbb\xcf\xc3\xe7\x3d\xd2\x81\xe8\x4c\xde\x07\x5b\x8b\x8a\xf5\xfe\x31\x6f\x0c\x78\xfe\xc4\x63\xdf\xf2\x06\xef\xf5\xb0\xbe\x3c\x3e\x1b\x28\xd8\x28\xfc\xeb\xc4\xeb\x75\x56\x2e\xf0\xbe\x75\xd9\x1f\x67\x65\xf6\xd6\xf6\x3e\x31\xba\xb0\xb6\xae\xe2\x01\xf5\xf9\x38\x4c\x93\xf1\xf9\x21\xdd\x22\x0e\xbb\xce\x71\xd9\x3e\xec\x65\x0d\xc0\x2f\x66\x79\x63\x35\xd7\x83\x1e\x8f\xfd\x1a\xaf\x73\x5b\xde\x59\x87\xf8\x19\xd0\xd7\x46\xa6\x07\xf3\xe0\x73\x1b\x6e\x8f\xb3\x19\xf7\x8b\xf8\x36\xd9\x7f\x35\xde\x2b\x1b\x41\x9f\xc7\x3c\x97\x8e\x41\xce\x8a\x5c\x95\xfd\xb5\x6d\x18\x2f\xc9\x76\xbf\x54\x6d\x05\xf8\x23\x2d\xf2\x5a\xbb\x63\xb5\xd0\x73\xe3\x36\xf4\x81\x17\xda\xe0\xdb\x60\x5b\xd2\x5f\x2d\xfa\xc2\xce\x3b\xd0\x8f\x92\x16\x3a\x38\x08\x8b\x75\x3b\xcb\x23\xe2\x7b\x90\x38\x35\x89\x2d\x97\x72\x66\x41\xe6\x6d\xb0\xbd\x24\x67\xa7\x35\xd9\xd6\x68\x43\xfc\x47\x87\xd7\x57\x96\xd9\xd7\xda\xc8\x65\x80\x2f\x3e\x1b\x39\xff\xa4\x5f\xc4\x5d\x48\x9c\x6d\x8d\xf7\xc6\xd5\x64\xfd\x46\x62\xd8\x44\x1e\xae\xb2\x0f\x62\x29\xb7\x23\x6b\xb2\x6e\xd2\x82\xf8\x64\xbe\x1f\xc7\x43\xf0\x3e\x7d\x2b\xef\x37\x19\xbf\x06\xd7\xb1\x05\x7b\x7a\x16\x8b\x38\x16\xf1\x85\x6d\x5b\x83\x95\x39\x80\xd8\xf3\x32\x8f\xc7\x7d\x91\x7c\x7e\x92\xb5\x49\xe6\x59\x46\xc7\xb0\xa7\x35\x2d\xce\xee\x1a\xaf\x31\xa1\x5d\xb3\x5e\xcc\x99\x83\x74\xfb\x7c\x89\x32\x38\xaf\x30\x2c\xce\x7a\x41\x3f\x7f\x0d\xfc\xd5\x35\x3e\x13\xc1\x67\xfb\xc1\xf2\x55\xab\x88\x33\x91\x18\x24\x7f\x0b\xd6\x9b\x79\xaf\xbd\x95\x7d\x8c\x87\xb5\x17\x89\xe7\xb0\x61\xa1\x07\xc7\xf3\xef\x8c\xe9\x19\xc2\xb9\x5c\x73\x05\x4f\x5a\x1e\x99\x87\x79\xfc\x7c\x3e\x3e\xed\x7e\xb5\x21\xaf\x09\x6c\x71\xbf\xf0\xda\x87\xd5\x1b\x83\xc2\x4f\x58\x5b\x82\x79\x59\x52\x9c\x3f\x66\xd2\x04\x32\xc7\x5c\x02\x7f\x43\x87\x65\xc0\x22\xc4\xe8\xf7\xb9\xac\x2d\xf6\x87\x6d\x15\x67\xff\x8d\xd7\x61\x53\x3e\x73\x2c\x63\x3a\x24\xc5\xbc\x5e\xfc\x69\xd6\x86\x60\xf9\x69\x75\xef\x7a\x41\x3b\xab\x2f\x5a\xcc\x67\x62\x9b\xf3\x3c\xc5\xea\x1a\x59\xe3\x91\x73\x5a\x5a\xbc\x36\xc8\xe7\x1b\xf8\xec\x7f\xf6\x39\x5e\x4c\xce\x60\xf2\x3b\x70\xd6\x4c\x06\x32\x87\xd7\xdb\xfc\xac\x38\x13\x4a\x62\x86\x7c\xf6\xed\x8d\xf7\x03\xa4\x70\x2f\x6d\xe2\x75\x12\xd9\xdb\x66\xed\xf3\xad\x7c\x8d\x92\xd8\x86\x1a\x9f\xcb\x32\xe4\x7b\x2a\x7c\x23\x7e\x07\xc6\xd1\x6a\xb1\x9e\xe7\x77\x20\x3e\xb6\x07\xdf\x46\xc5\xbc\x5d\x62\xe1\xe4\xfd\x38\xf6\x9e\xed\x14\x62\xbf\xb2\x3d\xb3\x8d\x78\xdc\xad\xe5\x3e\x3a\xb1\xf3\x6a\x1b\x85\x0e\x94\x33\xf6\xc6\x67\x7d\xc4\x6c\x8b\x89\x4f\x52\xce\x6a\x6a\x33\x4f\xb6\xd9\xe6\x4a\x0b\x9f\xb1\xe5\x61\xe1\xcb\xa4\x90\xfb\x36\x9f\xf0\xb4\xc4\x6b\x6f\xc2\x3a\xd3\x3c\x9f\xbb\x34\xb8\xff\xfe\xb9\x31\xaf\x2e\xc2\x38\xe4\x31\x69\x7d\x50\xcb\xbc\x0f\x4a\x03\xc1\x9e\xa7\x0c\xd6\x40\x86\x3c\xf7\x6b\x16\xf6\x41\x4d\xd6\x56\x97\x73\x9a\x58\x7b\x38\x2e\xd6\x73\xc6\xfe\xab\x0e\xd3\x62\x1e\xce\x8d\xe2\x98\x8b\xf1\x79\x39\x43\x4e\x97\x14\xe7\x5a\x51\x52\x9c\x15\x55\x5f\x28\x74\x9c\x8d\x69\x5f\x87\x31\xd7\x2e\xe2\x5f\x65\x2d\x44\xef\x9f\xf7\xe6\x54\x6c\x0d\xee\x27\xc5\x33\x0c\xa2\xed\x7a\x11\xf3\xc8\x59\x76\x76\xbe\x25\x7b\x1d\x22\xa5\x6b\xc1\x4e\xb5\x67\xff\x71\xcc\xaf\x8d\x0f\x8d\x0a\x9c\xfd\xc5\xed\x73\x50\x82\x58\x8e\x9a\xac\xdb\x6d\x81\x7f\x80\xfd\x0b\x72\x0e\x80\xe5\xed\x08\xd6\x46\xd7\x78\xbf\xdd\x2a\x8f\x8b\x25\x18\x6b\x3c\x7f\x36\x63\xdd\x8b\x8b\x35\x44\x7b\x2e\x90\xec\xa1\x6a\x81\x1f\x35\x51\xd0\xe7\xb3\xc2\x78\x7d\xa3\xc6\xfe\x82\xda\x3a\xf8\xd4\xd6\xf3\xf9\x81\xc5\x73\xb6\xd8\xdf\x6a\xe5\x87\xac\xab\xe2\x9e\x39\x39\xb7\x2a\x2b\xe2\x04\xc7\x6b\xe6\x0d\x88\xc1\x9a\x2d\xe2\xaf\xcd\x1c\xd8\xce\x57\xb7\x8a\x33\xc1\xc6\x6b\xf3\xbc\x77\xc1\xee\xbb\xe1\xfd\x4b\x76\x6e\xba\x0a\x65\x49\xdc\x16\xd7\x63\xef\x67\x8b\xb8\x7e\x39\xcf\x73\x2c\xff\x24\x36\x7b\x99\x7d\x90\x9b\x50\xf7\x2c\xac\xe5\xf3\x5e\x2c\x89\x27\x19\xc7\xa3\xb3\xff\x71\xec\x3f\xe5\x75\x77\x89\x4f\x97\xf8\x47\xd1\xad\x3e\x9c\x1d\x1c\x44\x10\x47\xd0\x2e\xe2\x4b\xfd\x4e\x21\x53\x65\xbf\x99\xfd\x3e\x84\xfd\x66\x1c\xa3\x31\xb6\xcf\x24\x56\xb8\x51\xc4\x29\xd8\x71\xb4\xcc\xf2\x81\xd7\x64\x6a\xec\xef\x14\x99\x61\xed\x5a\xf6\x25\xd5\x84\x2f\x97\x60\x0d\x65\x04\xdf\xfa\xb0\xce\x89\x3e\x60\xd9\x6b\x06\x7b\xd1\x45\xb6\x11\xcf\xd7\x71\x7d\x7f\x7c\xee\x18\xef\x59\xab\x41\x9c\xa8\x1f\x16\x76\x99\xb5\xe5\x78\x9d\x4a\xd6\x02\xc7\xe7\x31\xc7\x70\x0e\x5a\xbf\xd8\x97\x25\xf3\x15\x8b\x87\xec\x21\x6e\xc3\xd8\xe5\xb9\x67\x6d\xa8\xce\x8a\x48\xb7\xaf\x39\x5a\x1b\x44\xd6\x10\xc3\xc2\x26\x96\xfd\x4a\xe3\x39\xff\x7c\xb1\x9e\x3f\x5e\x03\x58\xe3\xbe\x94\x78\xbc\x16\xf3\x62\x5a\xec\xa1\xb0\x72\xba\x57\xd8\x5a\xb6\x3f\xd8\xb7\x3f\x5e\x33\x5f\x28\xce\x9e\x1a\xc7\x60\xe0\xba\xc6\x10\xce\xdd\xec\x42\x9f\xf5\x40\x96\xe1\xd9\x11\x62\xb3\x77\x60\x0f\x01\xcf\x67\xec\x79\x59\x03\x75\x0e\xd5\x2a\xec\x63\x5c\x2b\xd6\x18\xc6\x73\xe3\x39\xf0\xad\x6d\x70\x1f\x72\x8c\x88\xbf\x0e\x67\xed\xf1\x1e\x8e\xf1\x9e\xd3\x75\x90\x21\x73\x90\x67\xc8\x6b\x47\xe0\xcf\x91\x7d\x62\x35\xf6\x73\xcb\x3c\x56\xd6\x6a\x28\x2d\x62\x70\x6c\xdf\x6c\xc2\x1a\xc4\x88\x69\xc6\xf2\xbd\xc6\xfd\x30\x9e\xf7\x27\x7c\x1e\x2c\x71\x6c\x5f\xb3\xd0\x91\x01\xef\xef\x1a\xaf\xdf\x60\xec\x24\xcf\xd5\x2d\xfe\x72\xde\x5b\x58\x9c\xdd\x26\xf1\x39\x76\x4e\x9d\x15\x67\x2c\x58\x7d\x49\xc5\x3c\x67\x7c\xbe\x63\x17\xfa\x94\x40\x57\xb2\x3e\x93\xfd\x74\x63\x79\xba\x55\xc4\xeb\x48\x6c\xcd\xf8\x5c\xc9\xb5\xed\xf1\x03\x3e\xef\xb7\xac\x65\x30\x0f\x5b\x2e\x7c\xc5\x96\xee\x7c\x96\x9e\xcd\x33\xcf\x6b\x1b\x04\xb1\x93\x8c\x57\xc0\x3a\x34\x90\x58\xc1\x01\xd8\x77\xc2\xff\x54\xac\x83\x8d\xe7\x4d\x4b\x85\x0f\x74\x6c\xeb\x2e\x17\xf2\x7c\xbc\x3e\x96\x81\xaf\x46\xf6\xe3\xac\xb3\xaf\x86\xd7\x68\xc7\xfa\x8e\x7d\xc5\x82\x83\xa4\x97\xf3\xf0\x64\x6e\x66\xe3\x90\x36\xf3\xb9\xa9\x3d\x6f\x96\x98\xd7\x63\x38\x07\xb0\x0f\xb0\x02\xf7\x09\xec\xd1\x0d\x99\xff\x78\x6f\xcb\x98\xcf\x7a\x70\x16\xa1\xe4\x5f\x2a\x7c\x9a\xe3\xf3\x16\x59\x26\xd5\x45\x77\xc9\x1a\xcb\x3c\xa7\x1b\x41\xdc\xea\x88\xdb\xbe\x0c\xb1\x03\x2b\xcc\xbf\xcc\x03\xb2\xbe\x61\x6d\x82\xb0\x41\xf5\x61\x11\x67\x54\x6b\x81\x2c\x8e\xf2\x36\x8f\xcf\x7b\x8d\x0a\xda\x88\x4f\xc3\x8e\x89\x15\xd8\xc3\x14\xc1\x19\x3e\x5d\xb0\x9b\x9a\xe0\x53\x5a\xda\x1e\x3b\x73\xbf\xf5\xb1\x54\xf9\x28\xc4\x27\x9c\x41\xdc\x53\x67\x7b\xfc\x51\x8d\xcf\x6c\xf4\x79\x1e\x55\x93\xf6\xb0\x3d\xef\x35\x0a\x7b\x48\xd6\x50\xc6\xfe\x51\x59\xdb\xe5\x3d\x3e\x04\x67\x43\xd4\x49\xad\x29\x87\xdb\xfd\x63\xe3\x38\x5c\xb1\xd1\xc5\x97\xba\x08\x34\x80\x58\x19\x89\x41\xdd\xb6\x77\x94\xd7\x4e\x6b\x12\x67\x31\xe4\x36\x2c\xe7\xb2\x3e\x98\x05\x39\xcd\xb1\xbd\x56\xe6\xcb\x9a\x48\xa7\xf0\x63\x59\x1e\x9d\x87\x18\xba\x75\xf6\x13\xaf\xb0\x0f\x9e\x60\xaf\x05\xc7\x26\xd8\x71\x37\x80\x73\x4c\x9b\x10\x7f\x28\xe9\x79\xfe\x67\x63\x09\x52\x38\x33\xb1\x57\xac\xfd\x19\x39\x18\xc8\x7e\x9f\x05\x5e\x43\xe8\xf3\x5a\xce\x06\xc7\x9b\x8d\x8a\x78\x33\xbb\xaf\x48\xfc\x07\x82\xc3\x3c\xec\x63\x92\xf3\x5c\xc3\x22\x4e\xd1\x27\x88\x3f\x9e\x2f\x7c\x88\x96\xe7\xb7\x20\x8e\x8d\xc7\xc2\x38\x2e\x6a\x8d\x6d\x66\xd8\xcf\x26\xf1\xb8\xe2\x9b\x94\xb9\xdc\xf8\x1c\xd3\x1e\x9c\x51\x28\x76\xec\x02\xec\x07\x5f\x06\xfb\x83\xc7\xb8\xcc\x3f\xad\x4f\x65\x89\xe5\xce\x22\xc7\xd7\xf2\xf8\x13\xbb\xac\x96\x6c\x3f\x87\xca\xae\xe5\x6d\x15\xba\x67\xbc\x37\x92\xeb\xab\x8b\xbd\xb1\x00\x76\x05\xfa\x6e\x3b\x30\xa6\x36\x60\xec\xc0\xb9\x38\xdb\xf8\x76\x09\xce\x8e\x1f\xa9\xfd\x15\x9d\xed\x6b\x19\xdb\x80\xfd\x0f\xc4\xf3\x0d\x39\x2b\xd4\xce\x03\x9a\xf0\xff\x16\xbc\x67\xcf\x4f\x61\xbf\x79\x0a\xeb\x8b\x62\xfb\x44\x70\x86\xc0\x3c\xc8\xb5\x39\xb0\x13\x67\xe1\xfc\xdc\x7e\xa1\x0b\x45\xc7\x8e\x63\x1e\x96\x0b\x1f\x72\x4d\xce\xf2\xee\xc1\xd9\x03\x7d\x88\x7b\x25\x96\x93\xb2\x6f\x72\x0e\x78\x23\x81\x33\x08\x06\xb0\xc6\xb4\x51\x9c\x35\x5b\x9b\x2b\xfe\x0b\xe1\xff\x63\xef\x7d\xe0\x62\xab\xea\xbd\xff\xf7\x5a\xdf\x7d\x14\x95\xab\x68\xdc\xa2\xa4\xc2\xa4\x1b\xe5\xe9\x09\x0b\x6b\x4c\x2c\x32\xb4\xb9\x4a\x3a\x19\xd5\xd4\x3d\xb7\xa6\x42\x9d\x14\x75\xf4\xa0\x8e\x89\x36\xea\x31\xb1\x30\xa9\xa8\x26\x23\x1b\x95\xba\x63\x51\x51\x62\x91\x91\xa2\xa2\xa2\xa2\xa2\xa2\x07\x15\x95\xa3\xe8\x41\x45\x45\x45\x43\x2f\x79\x7e\x2f\xf6\x59\x6b\xaf\x05\xa9\x59\xbf\x7b\x9f\xe7\x79\x3d\xaf\x7b\x78\xad\x17\xb3\x0f\x6b\xf6\xec\xd9\x7b\xfd\xf9\xfe\xf9\x7c\x3e\xdf\x08\x4b\x33\xea\x3d\xbf\x61\xb7\xce\x4b\x89\x8b\x65\x84\xf3\xc9\xcb\xf3\x84\xd7\x64\xe3\x88\xc3\x4e\x03\x29\xda\x4f\xcc\x98\xb7\xb8\xac\x65\xdf\x52\xf0\x70\x0d\xa9\x95\x31\x4c\x8b\xe3\x0a\xaf\xc3\xec\xc3\xba\xe0\xf9\x8c\xb5\x1e\x8e\xa0\xc3\xd9\x9a\xcb\x9f\x13\x58\x0c\xeb\xb8\xa7\x71\x6c\x63\x2b\x93\xc6\x8e\x88\x79\xf3\x63\xd0\xec\x49\x36\xdf\xda\xb0\x6a\xcc\xd8\x18\x60\x83\x97\xd3\x9c\x35\xfe\x69\xce\x8b\x1d\x77\x38\x9d\x34\x8b\xaf\xd1\x36\x8e\x6b\x72\x51\xda\x68\x9e\x46\x5a\x9d\xc6\xe6\x54\x46\x4b\x4c\xfc\x78\x52\xcc\xe3\xd1\x9a\x75\x3b\xc2\xa4\xc6\x5d\x1c\xdb\xea\x14\xab\x41\x4f\xab\xd8\x72\xd1\x47\xb7\x62\x82\xc4\xc7\xff\x25\x3d\x1f\x29\xe9\xd9\x72\x9e\x8e\x4f\xa4\x43\x90\x77\xb1\xa4\x08\x6b\x9c\xf1\x72\x91\x26\x07\x17\xe5\x69\x4c\x6e\xdd\x62\xc0\xec\xd8\x0e\xf7\x0a\x83\xd7\x8b\xb0\x79\x26\x07\xb1\xfc\xb7\x10\xd7\x35\x6f\x72\x0f\x38\xec\x54\x60\xe6\x85\xf6\xb5\x9c\xbc\xb9\x6d\xc7\xba\x8f\x01\x58\xbe\x86\xf0\x19\x9a\xbc\xbb\xa4\x1d\x5e\x2d\x30\x3a\x50\x36\xe7\x1f\x61\xdb\x2c\x1e\xc6\xda\x5c\x35\x1e\xfe\x72\xd1\xc5\x25\x97\x7d\xf1\x60\xd8\x60\x03\x73\x66\x3f\xab\x70\xef\xa1\xc3\x71\x10\x2c\xff\x4b\x77\x78\xb1\x38\xb3\xff\xdb\x9a\x3a\x91\x56\x95\x97\xcf\x89\xc6\x93\xd5\x31\xb0\x39\x77\xc3\x0b\x0a\x63\x52\x59\xe3\xb7\x56\x19\x0e\xe1\xbc\xcb\x23\x68\x13\x47\xd6\x06\xb3\xac\x8d\x86\x82\x4e\x7a\x5a\x8f\xc6\xdf\xb4\x6b\x8d\x24\x1d\x97\x74\xf9\x78\xf9\x79\x58\x9d\xdb\x70\xae\x1b\x2e\xa0\xb6\x58\x70\xcb\x5f\x35\xbe\x99\xae\x72\xf6\xbe\x36\xb9\xc8\xc8\x66\x1d\xf4\xae\xc9\xee\x47\xe6\x19\x84\xd7\x64\xe6\xf4\x0a\x8c\xb6\xd5\xfb\x32\x3c\x7b\xb1\xf1\xdd\xf9\x55\xb8\xe4\xe4\x2a\x7e\x9e\xc5\xec\x18\xed\x19\xb1\x9c\x10\x13\xbf\xd7\x06\xcf\x60\xf9\x79\xe1\x7c\x37\x39\x99\x35\x16\x23\x35\xeb\xf0\x3e\xf6\xfc\x56\xff\xc3\xc6\x23\xc3\xf5\xc0\x60\xe6\xa4\xc3\xd3\xef\xb0\x7a\xc2\x49\x13\xb7\x30\x7b\x92\x58\xdd\xe0\x45\x6f\x1d\x33\xbc\x45\xed\xc7\x34\xed\x1e\x9d\x77\xfb\x4e\x14\x63\x9a\x74\x58\xce\x28\xfe\x9a\x32\xe7\x1d\x77\xd8\x28\x62\x4e\x9f\x43\x1b\x2d\x46\x1b\x83\xb0\x3e\x9c\xd5\xd2\x11\xab\x7f\x64\xe3\x12\x85\xad\xe3\x4c\x8c\x7f\x1d\xe1\xaf\xa6\x3d\x5d\x78\xbb\xb7\x8d\x7a\xf1\x50\x8b\xff\x8d\xbb\xd8\xbc\x8d\x01\xd9\x7d\x23\xca\x57\xd9\x67\x5e\x74\x3a\x21\xca\xc4\x01\xb5\xe1\x1a\x87\x63\x65\xd8\xf9\xb7\x16\x2b\xa3\x4d\x9c\x45\xd9\x58\x6d\xda\xe9\x77\x89\xd1\xa3\x91\xb8\xe7\x2b\xd6\x78\xba\x22\x1d\x2b\xf3\x27\xaa\xdf\xe1\x6c\x22\x7b\x21\xef\x9d\xc7\xc6\xc8\x3b\x5c\x9c\x88\x82\xd3\xec\x8b\x6c\x9b\x69\x13\xdb\x48\x79\xf9\xae\xb8\xe7\xaf\xc7\x9d\xce\x98\x74\xb8\xbd\x51\x2d\x3a\x3d\xac\x08\x23\x6c\x71\x8a\xb5\x9e\xef\x95\x77\x35\xb3\x22\xff\x2e\x66\xd6\x01\x2f\x6f\x1e\xf2\x4f\xcc\x98\x8a\xfc\x82\xfc\xd6\x7e\x6a\xdc\xe5\xa6\x2c\xfe\xd6\xe6\x22\x30\xb8\x44\x65\xf1\x96\xb3\xe6\x39\x0d\x3a\xfc\x1b\x26\x16\x60\xf7\x2e\xf1\xf9\x82\x79\xe3\x53\x2e\x7a\x75\xcd\x4a\xb6\xda\xf0\xe1\x58\x2a\x7a\x1a\x11\x09\xc3\x69\x34\xfa\x3d\x2b\x74\x6f\xb2\x2e\x07\x1c\xc5\x3d\xba\x56\xf2\x6c\x6c\x6c\x41\x67\x3d\x4c\x6b\xc3\xca\x38\x64\xc4\xc9\x29\x59\x35\xa7\x62\xa6\xbe\x4a\x85\x67\x73\x9a\xbc\xad\xdd\x07\xb5\xf1\xf1\xa2\xfb\x55\x70\xfb\xa6\xd5\xf6\x8e\x72\x8f\x79\xcf\x86\x2b\x78\x35\x1d\x2a\xbc\xbc\x95\xb1\xb5\x82\xfe\xad\xd7\x13\xd6\x73\x31\xb8\xb1\x88\x3b\xe9\xf1\x23\x2c\xb6\x2f\xcc\xb9\x64\x5c\x1d\x1d\x4c\x9e\x2e\xf4\xa3\x66\xcd\x77\x2f\x71\xb9\xd3\xa0\xc4\xd9\xb4\xe1\x7d\x4e\x7b\xba\xd9\xde\x7a\x19\xce\x89\x5a\xa7\xf3\x11\xe5\x41\xcd\xba\x27\x06\x9b\x16\xe1\xfe\x63\x9e\xaf\x9c\x77\xb8\xb0\x70\xbf\xc9\x79\x5a\x11\x5d\xc6\x9f\xb3\xb9\x10\x8b\x99\x4b\x3b\x2d\x7f\xcb\x53\x08\xb9\x0a\x15\x26\xbf\x98\x72\xba\xc2\x56\xd7\x57\x6a\xbc\xbd\xac\xe0\x70\x13\x76\xbc\xd8\x5c\x12\x31\x8f\xdf\xe2\x69\xa2\x44\xf3\xc1\xe2\x20\x26\xbd\xba\x1b\x0d\x2e\xbf\x60\xeb\x12\xda\x18\x61\x68\x7f\xd8\x78\xf1\xbc\xb1\xd9\x8c\x0e\xa2\x32\xb9\x2f\x8b\xf1\x0c\xe7\x4c\xcc\x8c\x45\xc3\xcb\xb7\x31\xa8\x30\x46\x64\x71\x52\x38\x1e\x90\x4e\xb9\x3c\xd3\xb2\x8d\x1a\x98\xf5\x3d\x30\x7e\x92\x1d\x0f\x61\xee\xa7\x68\x9e\xa9\x8f\xfb\x89\xaf\xe4\x57\x2b\x73\xbf\xc3\x58\xba\xaf\x79\xe9\xe7\x1e\x66\x9d\x5d\x16\x61\xc4\x3c\xdc\x9a\x9a\xf7\xb4\x18\x4d\xce\x5b\xd2\xde\x18\x36\x18\x57\x8b\x79\xb0\x9c\x21\x9d\x5d\xc9\x5f\x88\xf6\x08\x93\x37\x88\xec\x90\x7e\x63\x5f\x24\x1c\xa7\x29\xaa\x45\x90\x71\x9a\xbf\x62\x7d\x64\x93\xef\x0c\xfc\xb8\x65\x87\x19\x53\xc3\xe6\x99\xe5\x9d\x9f\x19\x5e\x4b\x89\xd3\x1b\x8a\xd6\x8f\xb4\xb3\x2f\xad\x76\x99\xe0\xea\x0e\xda\x7d\xcf\xea\x15\xd8\xdc\x5f\x84\x85\xa8\xf2\x74\x61\x2b\x5c\x5c\xdd\xe6\xf6\xc2\x79\x6a\xb8\x04\x16\x9b\x87\x8d\x77\xd4\xba\xf1\x1c\x71\xc1\x4c\x2e\x3f\xe2\xcf\x58\xdc\xa9\x8f\xb3\xb5\x7b\xad\x8f\x8f\x6a\xd8\x3a\x57\x64\xd2\xc3\xb7\xcc\x9b\x7b\xb0\x0a\xf3\x24\x06\xf7\x18\x7e\xfe\xa4\xab\xb1\x13\xad\x4d\x71\x17\xc7\xc6\x6a\x3a\xd8\xcf\xb1\x71\x08\xa3\x5f\x19\xda\xf8\x69\x67\x3f\x85\x6b\x97\xf1\x39\x94\xad\xfb\x61\xd6\x7b\x65\xf8\x96\xda\xf8\x84\x76\xdd\x5a\x7e\x96\x81\xf5\x55\x6d\x3d\xa6\x84\xd3\xac\xb2\xba\x76\x36\x2e\x25\x66\xcd\x92\x51\x37\x77\x43\xfb\x7f\xd1\xe3\xcb\xd7\x9a\xfd\xb2\xe0\xf6\x51\xe9\x70\xfa\x95\xca\xda\x9b\x29\xc7\x97\xb5\x5a\x8e\xb6\x36\x90\x8e\xb9\x35\x0b\x9b\x67\xb7\xf1\x4b\x53\x87\xc4\x8e\x27\x31\x58\xb7\x28\xaf\xdf\xef\x78\x66\x61\x9f\x86\xad\x7b\x6e\xf4\x0c\x3d\x8e\x87\xb6\x63\x77\xd4\x3c\xb3\x79\xcf\xce\x2b\x31\x63\xb9\xc3\x5b\xc3\x4d\x6d\xa2\xb0\xbf\xc7\xed\x09\x9f\xbf\xaf\xad\x6b\x72\x81\x56\x1b\xc1\xc6\x70\xed\x7e\x10\x61\x31\xfb\x9d\xfe\xb0\xa4\x3d\x8d\xfb\xa4\xb3\xf9\xac\xce\x77\x14\xb3\x4c\x79\xfc\xec\xa4\xab\x71\x66\x31\xde\x41\x85\xab\xb7\x13\x24\x5d\x5c\x37\xf2\xc7\xc6\x8d\xcd\x64\xae\x2b\x8c\xa9\xfb\xfe\x7d\x97\xb3\x03\x23\x2c\x78\xad\x97\xa3\xab\xf0\xf2\x38\x66\x8f\x8a\xf8\xa0\x29\x87\xbb\xb0\x1c\x6f\xac\x76\x5c\xbf\xe3\xc8\x63\x6c\x42\x5b\x0b\x32\xc2\x55\x99\xb8\x7c\xc4\x41\xf5\xb5\xa4\x16\x5d\x8c\x0c\x33\x76\x74\x95\xcb\xf3\xae\xa8\x41\x60\xf7\xb4\x79\xb3\x1f\x9b\xf1\x13\x3e\x6b\x63\xe7\xac\x29\xdb\xba\xcf\x63\xc7\x74\x6c\x2b\xb6\xd7\xc6\x78\xc3\x7b\x60\x71\xe6\xc6\x97\x5b\x63\x6a\xe8\x58\x8c\x85\x8d\x83\x8a\xc7\x3d\x10\xa3\x29\x14\xde\xe3\x69\xb3\x8f\x62\x6c\x02\x8b\x03\x35\x3e\x8a\x58\x5e\x56\xc6\x61\x0b\xc3\x7d\xdd\xf3\x37\xf4\xa2\xe3\x20\x86\xbe\xfa\xb4\xc3\xd0\xea\x5a\xa7\xcf\x1c\x9e\xcf\xf2\xb3\x2c\x2e\x6a\xde\xe3\x12\x9b\xb8\x61\xb8\x2f\x8d\x3a\x3d\x40\x31\xb1\xb1\x10\x93\x67\xf5\xe4\xb2\x6e\x6d\xd7\x83\x4e\x67\xc4\x6a\x21\x85\x6b\xfb\xb8\xd1\x85\x33\x31\xd4\x48\xb7\xdb\xd3\xd2\xd6\x9e\xbf\x18\x98\xf5\xd4\x6a\x54\x45\xbe\x47\x6c\x15\x1e\xb4\x61\x65\x4e\xd3\xda\x88\x96\x93\x6b\xf5\x44\xa3\x38\x86\x59\x3f\x23\x3d\x97\x06\x67\x0f\xda\x7c\x10\x49\xcf\x96\x4e\x7b\x58\x5e\xab\xa3\x9c\x70\x3a\x51\x2b\x78\x54\x69\xc7\x2b\x22\xe1\xe9\x29\x99\xf1\xb5\xc6\xe6\x51\x0c\xff\x5b\x59\x9d\x7f\x53\x9b\xc3\xfa\x72\xcb\xb6\x65\x60\x34\x0c\x83\x9c\x8b\xc7\xdb\x75\xd8\x6a\x92\x85\xe3\xc0\xf0\x82\xac\x2d\x11\x6a\x7b\x5a\xbb\x73\xd6\x61\x7c\x30\x18\x04\xcb\x81\x15\x9b\x1f\x30\x7a\x35\x16\x6f\x61\xe7\x17\x83\xae\x16\x94\xe5\x75\xe2\xd9\x97\x21\xee\xde\xae\x63\x39\x0f\xe3\x64\xeb\xad\x8d\x9b\x73\x4f\xbb\xbc\x9b\xbd\xf7\x62\xf1\xc8\xc3\x4e\x53\xca\xe2\xc0\xc2\xb8\x88\xa9\x4b\x13\xce\xeb\x49\x67\x37\x86\x63\xd2\xe4\xec\xc3\xb1\x9f\xf5\x34\x02\x6b\x5c\xdc\x0f\x4f\xb3\xca\xae\x53\xd6\x6e\x54\xb3\x2e\x2e\x6c\xeb\x29\x45\x9c\x93\x1a\xc7\x45\x25\xe5\xf0\x2e\x16\x8b\x17\xe1\x1b\xb3\x4e\xcf\x2c\xe2\xec\xda\xfd\xc2\xd8\x5e\x12\x73\xf1\x29\xec\x9e\x9b\xf6\xe2\x51\x36\xd6\x98\xf2\x6c\x86\xa4\xa7\x13\x5b\x70\x3e\x9a\x74\xb9\x31\x8c\xa7\x33\x2b\x05\x4f\x1f\xc3\x70\x5a\xa5\xcc\xb3\xdf\x6c\x8c\x22\xed\x7c\x6f\x29\xba\xf8\xa0\xe5\x33\xd8\xf5\x14\xa3\x4d\x6b\x39\xf9\x21\x67\xa3\xe8\xe2\xf2\x11\xb6\x33\xef\xc5\x47\x8d\xbf\x28\x26\xaf\x62\x6d\x9e\xf0\xfb\x99\xeb\x8e\x78\xe6\xa6\xde\x68\xa4\xfb\xd8\x65\xc6\x6a\xc6\x68\x3d\xe4\xbc\xcf\xb2\x3a\xb9\xf6\x9c\x1d\xce\x56\xb2\xf1\x1b\xb1\xda\x28\xe3\x5e\x5e\x20\xe5\x72\xe1\xda\xf0\x7b\x2d\xaf\xc8\xea\x01\x68\xcb\x59\xf5\x70\xbf\xe1\x7e\x54\xe5\xec\x6d\xa9\x72\xf1\xca\xc0\xf0\xe9\x42\xfb\x28\x66\xee\xf3\xa8\xa9\xeb\x65\xd6\xd1\x88\xe3\x9c\xf5\xec\x45\x93\x13\x16\xcb\xc5\x48\xbb\x3c\x6b\x84\x93\xb0\x7e\x96\xfd\x7e\x06\x3f\xa9\x4d\xfe\x5c\xe7\x3c\x5d\x80\x69\x33\x86\x72\x1e\x86\xa2\x6a\x25\xff\x16\xc3\x6f\x55\x49\x6f\x0c\xd7\xb8\x18\x25\x06\xcf\x13\x14\x3d\x3e\xdb\xb8\x77\xed\x71\x17\xa7\xb3\xfe\x42\xc4\x57\xb0\xdc\x14\x83\x8d\x8f\x38\xe0\x8b\xc6\x9e\x88\x1b\x8c\xe6\xa2\x87\xe3\x8d\x99\xbd\xd5\xd8\xbd\x91\xff\xed\x73\x20\x6d\xfc\xdf\xc4\x5f\xe9\xf7\x38\xd5\x0d\x4e\x67\xc4\xc6\x7a\xc4\xac\x17\x2a\xe5\xb4\xf9\xc4\xd8\xfc\xe2\xc5\x15\xac\x86\x82\xd5\xad\x0f\x63\x10\x86\x5f\xb1\x82\x1f\x9f\x72\xbe\x8c\xf5\xf5\x22\x5d\xd5\x1a\xc3\x91\x30\xf1\x63\x95\x76\xf5\x9e\x65\xd6\x8b\x27\x26\x9d\x86\x9e\xe4\x56\xda\xf1\x64\x1d\xc7\xcb\x72\x67\x02\xa3\xf7\x11\xad\x55\x26\xf7\x1c\x3e\x2f\xa3\x83\x60\xfd\xb8\xc0\xc7\x0b\xa4\xcd\xde\x94\x30\xcf\xd0\x62\x2b\x63\xce\xc7\x0a\x12\x8e\x8f\x6c\xed\xd7\x15\x35\x06\x86\xcd\xba\xdc\x6f\xee\x7f\xad\xc3\xbb\x86\x9f\xd1\xe5\xe1\x40\x07\x4d\xae\xd6\xac\x0b\x61\x9f\x84\x8b\xe5\x48\xce\x9b\x43\x05\xa7\xed\x60\xcf\x61\x31\x39\xda\xe8\xe5\x44\xcf\x10\x87\x95\x88\x74\x4a\xcd\x9e\xaf\x86\x9d\x8f\xab\xc7\x9d\x6d\x65\xd7\x95\xa0\xc1\x71\xfa\x43\x7b\x6d\xde\xcc\xa7\x98\xd3\x76\x95\x2e\xc7\xfd\xb6\x36\x8e\x98\x35\x34\xbc\x5f\x8b\x66\x2d\x8c\xaf\xca\xc7\x78\x1a\x0e\x91\x1f\x9d\x5d\xb9\x4e\x84\x36\x5f\xed\xca\xbc\xa1\x9e\xf4\x78\xd8\x35\xce\x17\x58\xa1\x51\x50\xeb\xec\x52\x29\x7a\xda\x85\xd3\x5e\xdd\xd6\x69\xe7\xbf\x05\x8b\x1e\xee\x7b\xd4\xe3\xda\x97\x78\x9c\x97\x12\x6f\xaf\xce\x79\xf9\x9f\xa4\xc3\xbc\x8b\xcf\xdd\xb1\x3c\x11\xb3\xc6\x86\x73\xc1\xce\xd1\xbc\x17\xb3\x18\x76\x7a\x37\xe1\x67\xc4\x5d\x6d\x4e\x1d\x73\x31\x62\x31\xb8\x98\xa8\xfe\x1d\x2e\xd6\x83\x8d\x2b\xfa\x1a\x8b\x19\xc7\x29\xb5\x3a\xcf\x18\xbb\x21\xc4\xa8\x57\x99\x79\xbc\x68\xb8\x76\x8b\x5e\xec\xd5\x70\x4d\x2c\x5f\x9c\x06\xaf\x8e\x85\xc9\xf1\x8b\xd5\xba\x4c\x78\x98\x4d\x8b\xd9\x32\xfe\x80\x5a\xf4\xb0\x48\x1d\xae\x86\x48\x38\xd6\xec\x35\x27\x3d\x9b\x7a\xde\xe1\xf5\xc3\xd7\xb5\x1e\xfe\x30\xe5\x61\x80\x33\x1e\xaf\xc3\x72\xdb\x8b\xae\x59\x8d\x50\xf1\x6a\x46\x92\xf6\xb0\x13\xc3\x2e\x9e\x60\x39\xd7\x11\x46\x26\xeb\x72\x04\xf6\x9a\xac\x8e\xaa\x58\x6d\x16\xe3\xd3\x5b\xdc\x41\x60\xf8\xed\x21\xd7\xb1\xc1\xe9\x23\x58\x6c\x49\x84\xa1\x9f\x77\xd8\x40\xed\xeb\xfd\x59\xbc\xb8\x59\x33\xd6\xc4\x9c\x5e\x02\xa3\xae\xd6\x82\xd5\x17\x0c\x2c\x57\x78\xde\xe1\x5d\x30\xb5\x3a\x31\x35\x04\xa2\x71\x15\xf3\x74\x30\xaa\x1c\x57\x42\x9b\x9a\xe3\x51\x8d\x52\xab\x57\x54\xe2\xf0\x9c\x21\x3e\xa0\xdf\xb3\x11\xf3\xc6\x16\xed\x72\x35\xb9\xed\xfc\x0c\x6d\xca\xd9\x55\xbe\xfc\xac\xab\xf3\x62\xe3\xcd\xe1\xf9\xbd\xba\xcf\x81\xd1\x72\x08\xe7\xf2\xa0\xf3\x41\x23\x1d\x7e\xc3\xb5\xb7\xb1\x2e\xeb\x03\x58\x3f\x2a\x5c\x17\x4c\xcc\x41\x99\xb5\xc6\xc6\xdd\xc5\xf8\xfc\x36\xaf\x11\x8e\x37\xcb\xbf\xf0\xf5\x2d\x0d\xd6\x3f\xe2\x6b\x8c\xbb\xb5\x5e\x7b\x9a\x93\x81\xad\x23\xd4\x60\xb4\x5d\x1b\xbc\x78\x69\xca\xf9\xa4\x96\x8b\x15\xe9\xd6\xf8\x35\x99\x0a\x8e\x67\x20\x59\x8f\x07\xe6\x73\x15\xad\x9f\x6d\x35\x91\x4c\xcd\x0e\xab\xe9\x11\xae\xdd\x06\xeb\x69\xdf\xaf\xcd\xba\x14\x3d\xcb\x9c\x17\x07\x4a\xff\xb5\x5e\x64\x38\x57\xe3\x1e\x56\xd4\xf0\x9a\xa3\x98\x42\xca\xe3\x1b\x25\xbc\xfa\x52\x66\x8f\xb6\x58\xac\x90\x1b\x3c\xec\xf2\xeb\x62\x6c\xce\xe8\xf7\xe4\xca\x63\x8c\xf6\xae\xb2\x7c\x8b\x51\x33\x1e\x8c\xd6\xa1\x32\x71\x6a\x1b\x2b\x09\xaf\xab\x68\xf4\x79\xcd\x7e\x23\x25\x2b\x73\x96\x62\xe2\x4b\x61\x8c\xcd\xc4\x65\xd5\xac\xcb\x03\x8a\x57\xb7\x3d\xc2\x75\x5a\xfd\x43\x4f\x87\x37\xc2\x14\x27\x3d\x7f\xcc\xc4\xac\xc3\xb9\x6b\x62\xc0\x52\xe1\xe5\xef\x66\x9d\xed\x16\xc5\x10\xe7\x3d\x2d\x63\x63\xef\x69\x5b\xbf\xa0\xcc\xc5\x29\x42\x1b\xd1\xd6\xfc\xe9\xf2\xf0\xc1\x06\x2b\xe1\x73\x16\x65\x70\x25\x8f\xc3\x72\xb1\xc2\x38\x46\x85\x17\xe7\xb6\xeb\xe9\xb0\xd1\x9f\xc8\x78\xb8\xa0\x82\x87\xf1\x8b\x7b\x6b\xb6\xd1\xf4\x8f\xf0\x6a\x66\x6d\x56\x8b\x1e\x4f\xde\x70\xcc\x6c\x4d\xa9\x90\xf3\x6d\x39\x80\x1e\x56\xcf\xd6\x4b\xb7\x3a\xb6\xe1\x58\x35\x39\x78\x4c\x3d\x74\x8c\x8e\xa2\xe5\xc1\xaa\x9c\xd3\x64\x8b\xfc\xa6\xa4\x87\xc7\xcb\x78\x1a\x05\x06\xf3\x6e\x39\x4c\x3a\xe5\xec\x25\x1b\x27\x88\xf4\x48\xe3\xab\xea\x48\xe7\x5c\xce\xcd\xde\xaf\x70\xcf\xf0\x62\xe3\xe1\x33\xcf\x78\x1c\xab\xb8\x87\x69\x4c\x3b\x7f\x25\xd2\xa5\xb6\x36\x97\xc1\xbe\x84\x71\xa7\x59\x2f\xb6\x5c\x62\xe2\x5d\x79\x13\xff\x1d\x74\xf8\x9a\x65\xbb\x63\xf9\x7d\x21\x67\xd4\xe8\x4c\xca\xa0\x87\x49\xc8\x79\xd8\xf1\x0a\xe3\x07\x77\x38\xec\x11\x16\xf3\x9c\x72\xf6\x6d\xa4\x83\x9c\x72\x36\x81\x36\xf9\xb8\x50\xef\xb6\xc6\xab\xb3\x1b\x73\xda\x68\x56\x5b\xdf\xc6\x2a\xc4\xab\xad\x65\xd7\x02\xeb\x1b\x87\x7b\x80\xc9\xf3\x48\xc3\x4a\x3e\x88\xd5\xcc\xd7\x76\x3f\x19\x74\x39\x87\x70\x5c\x74\x78\x35\x4c\x93\x4e\x63\x24\x9c\xff\xe3\x5b\x63\x24\xa1\x3f\x3c\x68\xf6\xb3\x97\xc1\x9f\x85\x6b\xda\xb8\x59\x67\x4d\x6e\xce\x3e\xb3\xf0\x33\xab\x1c\x8e\x23\xf4\xd3\xf3\x0e\xcb\x18\x58\x3c\x43\xc1\xe9\x3e\x85\xf3\xd6\xf2\x03\xa6\xcd\x78\x1a\x76\xf6\xbc\x36\x35\xb9\xb5\xb1\xab\x2d\x3e\x59\x19\x2e\x6e\x14\x0f\x98\xf4\xf8\x8a\xb1\x95\x38\x9a\xf0\xda\x8d\xc6\x82\xf5\x17\x42\x7b\xd4\xd8\x74\x81\xe1\x64\x45\xfc\x03\xc3\xa1\xb0\x3e\x3f\x59\xf7\x6c\x55\xc6\xab\x4d\x50\xf4\xf6\x93\x79\x83\x45\x4f\x38\xec\xa2\xc5\x20\xda\xfa\x1a\xd6\xfe\x88\x74\x38\xca\x1c\xce\x30\x8a\xbb\x59\x2d\xd9\x94\xe3\x4a\xac\xe0\x3b\x25\x1d\x27\x79\xf9\xf9\x5a\xdd\xbd\x08\x43\x60\xf1\xde\x66\x2d\x09\xd7\x3e\x83\x77\x0b\xf0\xf8\x5f\xb5\xae\x1e\xa8\xb5\xb9\xb4\xd5\x70\x8e\xbb\x98\xa8\xd5\x95\x0e\x2c\xe6\x3d\xe9\xad\x73\x1d\x6e\x1d\x89\x6a\x23\x65\xbd\xfa\x72\xbe\x66\x74\xda\xd3\xf8\x37\x73\xcd\xd6\x7a\x8f\xf6\xe9\x0e\x17\xd3\xc3\xd6\x54\x37\x1c\xcd\xc8\xde\x59\x34\xf6\xd8\xb0\x17\x0b\x33\x4d\xf5\x7b\x79\xe1\x98\xfb\x6c\xab\x97\x61\xfd\x1c\x9d\x74\x9a\x0c\x91\x8e\xe6\xa0\xd3\x73\xb1\xf5\xc9\xc3\x9a\xf4\xf3\x1e\x27\xac\xcb\xc5\x4f\xc2\xfb\x55\xe6\xe6\xa0\x94\x39\x6c\x36\x71\x67\xff\x89\x57\x1b\x2d\x5a\xff\xad\x4d\x66\x63\xac\x8b\x8e\xe7\x68\x6b\x5c\x87\xe7\xb6\xe3\x60\xd6\xec\xa5\xb6\x56\xbd\xd5\x7d\x31\x5c\x22\xf1\x34\x39\x6d\x7d\x41\xab\x61\x1e\xe9\x6b\x16\x3c\xdf\xb3\xcc\xe9\x81\xd9\x18\x4a\xf4\x0c\xfa\x1d\x06\xc5\xe7\x2a\x47\xf5\xd5\x73\xde\xf5\xf7\x3b\xfe\x46\x90\x71\x35\x41\xc3\xb9\x6a\xea\x03\x45\x35\xf0\xb2\x4e\x13\xd3\xd6\x70\x8d\xf2\x65\xb6\x36\x71\xbf\xd3\xab\x09\xd7\x4c\xe3\xbf\x28\x8b\x73\x32\x7c\x29\xa9\x58\x85\xa9\xf2\x5b\xd1\xe9\x10\x84\xb8\x6e\x9b\xc7\x5b\x74\xbc\xf3\xf0\x9a\x16\x9d\xce\x2e\x9e\x8e\x5b\x78\xfd\x56\xd7\x2c\xeb\x6a\x60\x60\x6c\xe8\xa0\xe8\xe9\xc4\xac\xd2\x19\x09\x75\x30\xfd\xfc\x8e\xd1\x63\xb1\xf9\x4a\x5b\x6b\x40\xad\x8a\x9d\x88\xc7\x55\x92\x84\xd3\x06\xb5\xb1\x51\x8b\x51\x91\x5a\x17\xfb\xb5\xfe\xb9\x5d\xcb\xc2\x7b\x92\x5a\xa9\x45\xb8\xc6\x72\xde\x73\x0e\xc7\x1a\xe9\xc4\x9a\x1c\x4d\x34\x47\x8c\x4d\x11\xf2\x45\x2b\x9c\xd6\x4d\xb8\xd7\x1a\xad\x74\x9d\x76\xf9\xb5\x48\x03\x33\xe1\xf0\xc3\xcb\xe3\x21\xc8\xba\xcf\x0c\x63\xa0\x05\xc7\x21\xb2\xb1\x6d\x5b\xbf\xc5\xe6\xe8\xac\x06\xbb\xcd\xfd\x07\x36\xef\xee\xd5\xb9\xb6\xfa\x00\x92\xf5\xf0\xb6\x78\x78\x8d\x06\xf3\xda\xd4\x00\x0b\xd7\x97\x2e\xa7\xd9\x24\x46\x27\xd1\xc6\xe3\xad\xde\x63\x90\xf6\x7c\xe3\x32\xcf\x4e\x2f\x7a\xbc\xe9\xa4\x17\xc7\x32\x5c\x7f\x65\xb8\x37\xf6\xef\x58\x9e\xa8\xcd\x5d\x16\x9d\x3e\x37\x16\x6b\x82\x5b\x3f\x03\x1b\x13\xaa\x75\xdf\xc9\xda\xdd\xe1\x5c\x9d\x34\xfe\x7d\xda\xf1\x33\xd5\xa4\x67\x4b\x57\x39\x0d\x9d\xa8\x15\x3c\x5c\x61\xdc\x60\x68\xd3\x2e\xb6\xba\xc6\x60\x71\xec\xf7\x58\x53\xeb\xed\x1b\x9e\x76\x65\xb8\x17\x8f\x9b\x79\x68\xeb\x2c\xd9\xfb\x61\x7c\xd0\x50\x0f\x3a\x69\xf2\xe8\x35\x9e\xed\xd7\xe5\x62\x1e\xb2\xe8\xd5\xd9\x58\x74\xba\x5f\x24\xbc\x5c\xb7\xe1\x28\x58\x5d\x02\x52\xae\x1e\x52\x30\xef\xfc\x4d\xfb\x3a\x1c\x07\x35\xe6\x38\xed\xf5\xb1\x9c\xa0\x12\xb3\x3e\x9a\xd8\xc2\xf2\x3d\x5e\x33\xbb\xb5\x9e\x5a\x94\x2f\x31\x18\x82\x28\x7e\x62\x6c\xa6\x30\x66\x6c\xec\xb2\xc0\xab\xdb\xa3\xed\x3a\x6b\x30\x14\xe1\x5e\x98\xf5\x62\xc9\x0d\x26\x87\x6c\xf3\xe4\x15\xce\x76\x09\xe7\x85\xe1\xa2\x46\x78\xd9\x45\x4f\x97\xc7\xe3\x39\xaf\xa9\x75\x9c\x9f\x70\x8c\x58\x6d\xb4\x06\xcf\xcf\x30\x78\x27\xe5\xd5\x3c\x0d\xf3\x88\x31\xb7\x86\xda\xfc\x9d\xd5\xc5\x8b\xfc\xab\x98\xc3\x69\x58\x3d\xe4\xa0\xcb\xd9\x58\x62\xb0\x49\x6a\xd2\xc3\x7f\x5a\xed\x44\x5b\x3f\xcd\xe2\x17\xad\xfd\xbb\x4a\xb3\xc2\xe6\x66\x31\x7a\x76\xb6\xf6\x6a\x68\x17\x98\x5c\x8e\x78\x7b\x76\x60\xe7\xb4\xf1\xd9\x43\xee\xc6\xac\x87\x67\x33\x76\x48\xb8\xb6\x54\x39\xbe\x8d\xc4\x3c\x5c\xaf\x8d\x87\x0c\x7a\xd8\xeb\x2e\xb3\xce\x26\xbc\x3c\x5d\xc2\xd3\xee\x1f\x75\x63\x27\xac\x3b\x61\xb1\x52\x49\x83\x6f\x4c\x3a\x3d\xbc\x28\x1e\x55\xe1\xdd\xdf\x98\xc3\xf1\x5b\x5e\x09\x56\xab\xc8\xf8\x51\x81\xd1\xc4\x08\xe7\x8c\xd5\xe8\x35\x71\x52\x4c\xdd\x83\xc0\x8b\x73\x5a\x1b\x2c\x8a\xd9\x37\x38\x2e\xb6\x18\xbb\x95\xbc\x67\xa7\xa5\x3d\x9b\xd7\xd6\x7b\x1c\xf7\x74\xeb\x4d\x3e\x20\xdc\x37\xb3\x2e\x5f\x66\x39\xea\x2b\x30\xbc\xb6\xbe\xe6\xa8\x8b\x71\xd8\xf1\x66\xf7\x01\xbb\xf6\x45\x98\x1e\x4f\x7f\x28\xb2\xe7\x6c\x1d\x56\xc3\xff\x8f\xd6\x62\x8b\xdd\xb4\xf1\x9c\x1a\x17\x6b\xb6\x38\xd9\x70\x1e\x35\x78\x7c\x95\x5a\x67\xa7\x07\x06\xbf\x63\xf9\xab\x96\x3f\x63\xeb\x1e\x58\xad\x20\x65\x30\x76\xa1\x16\xae\xb9\xcf\x21\x5e\x7c\xde\xe1\x55\x23\x4d\x6a\x0f\xb3\x4e\xca\xf3\x6b\x0c\x97\x4f\xe5\x3d\x1e\x53\xd2\xcb\xb9\xd8\xdc\x41\xda\xab\x5f\x32\x6d\xfc\x4f\xa3\x7d\x27\x5d\x0e\xb7\x18\xc4\xdd\x3e\xbf\x7c\xed\x41\xd2\xd9\x0b\x51\x1d\x60\x83\xf3\xb6\x38\x74\x65\x6a\xdb\x29\x63\xf3\xaa\x32\xb7\x5e\x84\x35\xcd\x6d\x5c\xc8\x6a\xdc\x8c\x9b\xeb\x36\x78\xc4\x50\x4f\x25\xe3\x34\xd5\xa5\xc6\xf1\x0b\x6d\xdd\x3c\xbb\x1f\x59\xdc\x80\xc5\x67\x5a\x1e\x75\xa4\x67\x51\x66\xee\x63\x83\x59\x9b\xab\xbc\xb9\x64\xf1\x6e\x35\xde\xeb\x5a\xa7\x75\x6a\x71\x77\x61\x7e\x29\xe5\xfc\xaf\x28\x9e\x14\xf3\xea\x9e\x25\x4d\x5d\x96\xb8\xd1\xcb\x31\x7c\xda\xf0\x5e\x9b\xfc\xa8\xb6\xb8\x3c\x93\x87\x8b\xe2\xf6\x78\xcf\xd8\x72\xcc\x2d\x1e\xc9\xd6\x13\x30\xb9\xfc\xd0\x1f\xcd\x9b\xda\x44\xa3\x66\x4d\x35\xeb\x93\xd8\x5c\x4b\xdc\xe9\x44\x62\xf3\x51\x16\xf3\x67\x35\x71\x4c\x7e\x67\x8d\xc7\x91\xb2\x39\x15\x5d\xeb\xd6\xca\x10\xb3\x30\xe8\xea\x50\x59\xde\xa0\x8c\xbb\x1c\x63\x54\xc3\x6a\xd2\x69\x8f\xe9\x61\x57\x3b\xd8\xea\x2b\x59\x0e\x2a\x19\xa7\x27\x61\xf7\xaf\x48\x7b\x6e\xda\xf5\x09\xed\x0c\x63\x53\xac\x31\x63\x22\xac\x2f\x6a\x63\xb2\x83\x1e\x4e\xdd\xda\x16\x15\x5e\x9d\xb2\x12\x4f\x0b\x2f\xed\x6a\x2c\x89\x89\x37\x59\x2d\xc8\xf0\x9e\x54\x78\x5a\xe8\x86\x9b\x67\xd7\x62\xbb\x56\xa9\x41\xa7\x8b\x84\xd5\x6e\xf3\x62\xab\x36\x1e\x17\xad\x49\x06\xdf\x23\x93\xde\xf7\xf6\x71\xc8\xfd\x1e\xc7\xd3\xe6\x5c\x0c\x67\x2a\x8c\xc3\xe7\xbd\x9c\x8d\x57\x9b\x8a\x55\xda\x2c\xe1\xde\x62\xb5\xbd\x0d\x26\x53\x8c\x36\xee\xb2\x2f\x15\x58\x6d\xf1\x41\x0f\x6f\x3b\xee\xe2\x58\x78\xf8\xdd\xc8\xaf\xb5\xbc\x43\x5b\x4b\x61\xd2\xc4\x05\xd3\xce\xae\x90\x5a\xaf\xfe\x66\xc1\xd8\xd4\x5d\x46\xb3\xc3\xd4\x9b\xb6\xb9\x52\xab\xcf\x6d\xb5\x62\x2c\x3e\x36\xdc\x7f\x86\x5d\xdd\x54\x4c\x3d\xd1\xf0\xfb\x94\x99\x78\x7f\x76\x6b\x6c\x23\xaa\xcb\x32\xea\x74\xb0\x96\x8f\xc5\x6a\x6f\xc5\xbd\x98\xa5\xe1\x85\x2a\xab\xe9\x67\xb4\x50\x83\x9c\xb7\xf7\xc4\xbc\xfb\x68\x6c\x9a\xc8\x76\x32\x76\xc7\x1a\x63\xa7\x06\xb5\x9e\x86\x63\xc6\xe3\xcf\xa4\x3c\xdb\xba\xb8\xd5\x26\x11\x13\x73\xf1\x35\x2a\xc4\xd6\xa9\x2c\x38\x4c\x89\xf5\x81\x94\xb5\x0b\x8d\xae\xac\xd5\x1a\xb7\x39\xe3\x48\x8f\xde\xf2\xd1\xa7\xcd\x78\x31\x5c\x77\x31\x18\xcf\xf0\xf9\x5a\xec\xc2\xbc\xa7\x91\x63\xf3\x60\x83\x66\x6d\x4d\x79\x38\x9b\xb4\xcb\x39\x28\xab\x61\xe4\xd5\x5e\x54\x31\xaf\x1e\x44\xc7\x4a\x7c\x89\xb5\x8f\xc4\x60\xb5\x94\xd5\xee\x36\x7e\xa7\x8c\x3a\xdb\xca\xe6\xd6\xd7\xf4\x3b\x5f\xca\xc6\x88\xc3\x31\x61\x75\xea\x2c\xe6\xcb\xdb\xdf\xf1\x35\x1a\x73\x2b\xb5\xba\x97\xc7\xeb\x9a\x2a\x6f\x7f\xf3\x78\x00\x81\xa7\xaf\x18\xfa\x4f\x96\xc3\x61\xf4\x4e\xb5\x5f\x2f\xaf\xc3\xe1\xfc\xac\xee\x94\x78\x75\x10\x22\x4e\x85\xd1\xa5\x0a\x72\x0e\x13\x6b\xeb\xe0\x5b\xac\x8c\xd5\x09\xb5\xdf\xdf\xc6\x80\x6c\x2d\x24\x8a\x8e\xe7\x66\xe7\x8b\xad\x29\x6e\xf3\xfa\xa1\xfd\xd1\x65\x6c\x42\xab\x0f\x6b\xed\x51\xa3\x37\x43\x87\x17\xe7\x35\x38\xde\x35\x71\xa3\x69\x61\x7d\x8c\x5a\x2f\x8e\x95\x72\x3a\x6a\x7e\x0c\x2c\x68\xf0\x6a\x75\x26\xbd\x1a\x12\x7e\xec\xda\xc4\xa2\xa4\xc4\xab\x21\x60\xb9\xd5\xb6\xc6\xb8\xe5\x2e\x4e\x7b\x1a\x84\x1d\x1e\xae\xb5\xcb\x60\x34\x2d\x56\xcc\xfa\x8d\x09\x57\x97\x08\xbf\xb6\xdb\xa4\xcb\x63\x44\x3a\x36\xc6\xee\x0f\xb9\x2e\x96\x0f\x6c\xf1\x01\xe3\x2e\x8e\x10\xe9\x47\xda\x5c\x54\xcc\xe0\xf6\x4a\x1c\xae\x40\xb2\x8e\x77\x14\xde\x87\x8c\xe3\x3d\xac\x49\x18\xfc\x1f\x2b\xed\x0d\x92\x5e\x4e\xdb\xe8\x4c\xe2\xad\x99\x2b\xe2\x3a\x83\x9e\xbf\x60\x73\x35\x83\x2e\xb7\x6a\xf7\xcb\xd0\x3f\x2f\x9a\x9a\x4a\x71\xe3\x07\xd6\x78\x3e\x74\xda\x68\x40\x9b\x73\x2b\xdc\xe7\xd9\x3c\xac\xaa\x72\xf9\xa9\x30\x96\x33\x6b\xb0\xf6\x45\xaf\x16\x61\xbf\xab\x67\xe9\xc7\x65\xc3\xb5\xc2\xda\xce\x45\xaf\xa6\xa0\xb1\x1f\x42\xbd\x9d\x7e\x37\xe7\x03\x63\x33\xc8\xa4\xab\xb7\xad\xad\x6e\x9d\x17\x43\xb1\xfa\xef\xd1\x18\xb4\xb8\x83\x7e\xa3\x73\x68\x6d\x3b\x8f\x37\x1e\xce\xad\x82\x77\xbf\x2a\x0c\xee\x79\xda\xf1\x77\xc5\xf0\xc5\xc3\x7b\x30\xee\xd5\x1a\x4f\x39\xff\x2f\xb4\x4b\x66\xbd\x3a\x5b\xc6\x0f\x66\xd2\xd5\xa6\xd2\x86\x4f\x12\xc6\x27\x66\x4d\x5c\xc7\xda\xc5\x31\x2f\xee\xeb\x63\xae\xfd\x75\xa9\xc3\xbc\xa7\xe0\xc6\xb9\x98\x58\x52\x18\x8b\xb2\x31\xbd\x84\xab\x53\x61\x63\xc1\xca\x62\x97\x7d\x7e\xb4\xf5\x65\xad\x8e\x5d\xde\x68\xa7\x9b\xbc\x86\xb6\x35\xf3\x26\xb7\xde\xc3\x60\xd4\xcb\xc7\x25\xdd\x3a\x15\x18\x8d\x15\xbb\xb6\xca\xac\xc7\x5d\xee\x77\x76\x65\x60\x35\x70\x0c\xae\x38\xe4\x72\xc7\x3d\x5d\xd5\x45\xb3\xd7\xd4\x7a\x6b\x86\xc9\x47\x58\x1c\x4f\x50\xe5\x74\xf7\x22\xbf\xce\xab\xd9\x68\xf9\xcb\x51\x4c\x61\xd1\x69\xfd\xaf\xb1\xb9\xd0\x94\xd3\x03\x88\x72\xdb\x39\x97\x0b\x10\x53\xf3\x77\xb9\x45\x35\x4f\xe3\x0e\xc7\x1d\xd5\xba\x33\xf7\xdb\xae\x9b\x56\x17\x4c\x75\x38\x4c\xbe\x18\xec\xa6\x14\xbc\x58\x80\xc7\xeb\xf0\xf7\x45\xeb\xd3\x47\x7c\xa7\xa2\x17\x13\x5f\x74\x98\xa4\xa0\xc2\xd5\x4f\xb2\x7b\x75\xc4\x17\xb7\xe7\xea\x70\x18\xfc\x28\xa6\x5e\xb5\xd2\x8f\x8d\xd6\x90\xa4\xa7\xbd\x9b\xf2\xf2\xce\xb5\xab\x30\xf1\x25\x9e\xf6\x9c\xc5\xfc\x59\x7e\xa0\xc7\x6f\x8a\xe2\x70\x3e\x16\x32\xe7\xf8\x44\xa1\x3e\xae\xd9\x2f\x42\x7b\xcc\x60\x4b\x43\x1b\x63\xde\xcb\xa7\xc5\xcd\xba\x62\x6b\xd2\xdb\x3a\xb5\x8b\x66\x7d\x31\x38\x51\x5b\xeb\xcd\xd6\xf2\xb0\xb6\x5d\x38\xef\x66\x4d\xb3\xd8\xd7\x12\xf3\x99\xc6\x2e\x8c\xea\xa1\xce\x3a\x3c\x92\xad\x3d\x15\xda\x9c\x05\x8f\xc3\x38\xea\xc5\x9e\x6d\x0e\xd2\xe2\x40\x0b\x66\xbd\xec\xf0\x6a\xfa\x15\x3c\x1b\xc6\xce\xe5\x41\xef\xbb\xd5\x7a\x71\x10\x33\xf7\x55\x62\xa5\xe6\x6f\x94\x63\xcc\x78\xb9\x36\x6b\x1f\x66\x5c\xce\x3b\xc2\x6b\xa4\xbd\x3a\x9d\x93\x9e\x4e\xe4\xa0\x87\xf3\x4a\x6f\x5d\xa7\xd6\x78\x3a\xe7\x36\xbe\x27\xa6\x26\x95\xd5\x90\x15\xc3\xe3\xb3\x36\x99\x8d\x79\x84\x3e\x79\xcc\x61\x8b\x49\xb8\x5c\x54\xb4\xff\xe7\x5c\x1c\x21\xaa\x81\x60\xf4\xf5\xd5\xac\xa7\x35\x60\x71\x1d\x1d\x9e\x1e\x66\x83\x17\xa7\x34\xb6\x54\x60\xe2\x7b\xf6\x7a\x23\x0e\x95\xb1\x53\x23\xbb\xb2\xcb\xec\xd9\x69\xaf\x66\x96\xf5\x49\x67\x5d\xcd\x00\xa9\xf5\xea\xb5\x59\xfd\xd7\x8c\x67\xd3\xf5\x3b\x6e\x98\x2e\x71\xf5\xd2\x2c\xd6\x27\xb4\x99\x4d\x7c\xd9\xd6\x69\x8d\x72\x67\x36\x8e\x5b\xe3\x6a\xeb\xdb\xba\xfd\x91\x5e\x6a\xc6\x1b\xef\x49\xe7\x7f\x05\xb5\x1e\x6e\xce\x72\x39\xc7\x5d\xec\x39\xa8\xf1\x72\xd6\x09\x2f\x37\xe1\xe5\x9e\x43\xfb\xa2\xc2\xad\xa3\x36\xaf\x1d\xae\x1b\xc6\x36\xb2\xb8\x65\x31\x7a\x58\xd1\xbc\xcb\xb8\xd7\xda\xd4\x8d\x65\xde\xab\x3f\x3f\xeb\xb8\xa5\x61\xae\xc0\xd3\xab\x5a\x91\x7f\xb5\xb6\x70\x83\x87\xf7\xb7\x39\x49\x9b\xfb\x8b\x9b\xbd\xde\x72\x24\x62\x6e\x6f\x21\xe3\xd5\x6f\x8a\x9b\xcf\x32\xfc\xa0\xc0\xda\x38\xd9\xad\xba\x9a\xca\xec\xf9\xaa\xd6\xd3\x16\xb6\xeb\x6d\xce\xe1\xe7\xc3\xfb\x62\x30\x67\x81\xe5\x85\x14\x1c\x0e\xdc\xc7\x46\xea\xac\x8b\x25\xdb\x78\x55\x74\x7f\xac\x36\xa6\xa7\xb5\x19\x78\xfa\x1a\x91\x76\x81\xe7\xcb\xab\x32\xd7\x22\x1b\xad\xc1\x3c\x3f\x8b\xfd\xab\x30\xbe\xa3\xe5\xc6\xd6\x7a\x3e\x79\xda\x5b\x7b\x6d\x7d\x86\xb4\x89\x7d\x97\x79\x58\x4e\x5b\xff\x30\xed\x69\xe1\xc6\x8d\x56\x6e\xad\xb9\x96\x7e\x93\x37\xb5\xb6\x8a\xcd\x27\x34\x78\x3a\x78\xde\x38\x0d\xed\xda\x41\x93\x07\xf7\x6a\xa6\x59\x1b\x5e\x19\x5c\x5f\xb8\xdf\x17\xbd\xb5\x28\xe1\xe5\x5c\x71\x1a\x56\x24\x9c\x36\x72\xb4\x5f\x58\xae\xba\x97\xc7\x17\x8b\x6d\xca\x98\x98\x94\xe5\x23\xd7\x78\x78\x5d\x9b\xf3\xce\x3a\x9c\x64\x38\x46\x93\x66\x5d\x2f\xba\x75\xd8\x6a\x0c\xda\xbd\xca\xe6\xcf\x30\x36\x58\x18\xcb\x34\x39\x1b\x9d\x5c\xe9\x97\x04\x8b\xde\x5e\xd9\xe1\xd5\x1c\x1b\xf4\xf0\x71\x93\x1e\xd6\xad\xcc\xcb\xdd\xd9\xfb\x8b\xe1\xd7\x54\x19\xdf\x6b\xd4\xe5\x39\x2c\xff\x44\xca\xbc\x3a\x8e\x39\x2f\x96\x93\x75\x39\x01\x9b\xe3\x8b\x6a\x7e\x4d\x3a\xdd\xe1\xb0\x66\x40\xbf\x87\x03\xb5\x9c\x52\x93\xe7\x0b\x6d\xdb\x84\x1b\xdb\x58\x8d\x05\x63\x0b\x47\x3a\x3d\x5d\x6e\x8d\x89\x72\x53\x46\xff\xcc\xc6\x16\x30\x5a\x05\xa1\x5d\x6c\xf7\x90\x41\x63\xab\x5b\xec\x60\x87\xcb\x53\x6c\x53\xf0\xe2\xed\x1d\x2b\xe3\x4a\xaa\xe0\xb8\xb3\x41\xc1\xed\x2d\x81\xd1\x93\xb1\xfa\x2a\x11\x47\xa2\xca\x8b\x0b\xa4\xdd\x7a\x84\xad\xb3\x6d\xfc\x77\xcb\xb5\x5f\xe1\x2b\x8d\x1a\x6c\x97\xd5\x12\x37\x7c\xeb\x35\x25\x6e\xff\x0a\x73\xe2\xe3\xae\x9e\x18\x5d\x4e\xb3\xd8\xfa\x0b\xe1\xb5\x5a\x5d\xb3\xa4\xa7\x6b\x63\xb5\x7c\xa7\xbd\xf1\x66\x6b\xcb\x2c\xae\xb4\xd5\x24\xed\x61\xae\x8d\xe6\x83\x8f\x5b\x0d\x0a\x2e\x86\x6b\xf3\x9d\xe1\xbd\x30\x7a\xed\xe1\xfb\x4d\x4e\x37\x30\x31\x61\xab\x6b\x45\xcc\xf1\xd2\xa3\x3a\x50\xd6\x9e\x2d\x78\xda\xf6\x31\x2f\x66\x57\xe6\xf1\x47\x0c\x06\x82\x82\x9b\xf7\x78\x5a\x43\x16\x27\x1e\xf9\xbd\x86\x23\x16\x61\xd6\x62\xde\xba\x68\xfd\x60\xb3\x57\x87\x9f\x33\xe8\x7c\x85\x48\x53\xdc\xd3\xb1\xb1\x79\x13\xeb\x0b\x2f\xf7\x09\x52\x2b\x73\xa8\x16\xf7\x2e\x5e\x2d\xb3\x30\x27\x30\xef\x61\x9b\xc6\x9d\xae\x8a\xd5\xff\x20\xe9\xe2\xfd\x62\xea\xba\x46\xf9\x2f\x6b\xa3\xd9\x3c\x47\xde\xab\x31\xd7\xe5\xbe\x53\x18\xd3\x5e\xa5\x3f\x16\xe0\x6a\x72\x46\xb1\x4d\x13\x6f\xb0\xfa\x76\x56\x13\xd7\xd6\xad\xb1\x18\x9a\xa8\xce\x5d\xcc\xdb\xfb\x8b\x0e\x07\x42\xde\x5b\xc3\x0c\xdf\x27\x8c\xf7\xd6\x3a\x8d\x61\x6d\x73\x57\xa3\xae\x2e\x6b\xa8\xef\x66\x62\x64\xba\xdf\xe5\x11\xec\x3a\x1f\x74\x78\x39\x5c\x5b\xfb\xce\x6a\x97\x67\xbc\x3a\x00\x39\x87\x4d\x0d\x6d\x81\x9c\xd3\x22\xb5\x35\xd0\x2c\x5e\x2b\xc2\x30\x18\xad\x8f\x70\x4d\xc9\xb8\x3a\x2d\x3a\xe7\x8d\x49\x83\xe5\x15\x53\xdb\x5e\xf7\x7b\x5a\x3c\xd6\x9f\xb7\x9a\x63\x16\x47\x5f\xe6\x78\x1f\xba\xcb\xc3\x89\x36\x78\x98\x07\x5b\x43\x6e\xd0\xec\xf5\x1e\x7e\x59\x55\x98\xfa\x29\x56\xd7\xce\xee\x6d\x79\xef\x7b\x25\xbd\x75\x78\xb0\x84\x6d\xac\x9d\x9a\x36\x71\x6e\x93\xa3\x57\x25\xce\x6f\x8b\xea\x52\x1b\x3e\xac\xc5\x70\x2c\xaf\x13\x61\x7c\xdb\xd7\x34\x18\x37\xcf\xc7\xea\x2d\xe0\x6a\xcd\xd8\xf9\x1e\xea\x22\x4e\x7b\xb9\x94\x79\x8f\xbf\x5a\xf4\x7c\xbd\x12\xe3\xaf\x26\xcd\x3e\x64\x73\xa0\x16\xa3\x36\xee\xed\x75\x66\x9d\x5c\xa1\x5b\x18\x33\xda\x71\x29\x8f\x77\x90\x70\x38\x74\x9d\xf0\x62\xc5\x69\x4f\xf7\xd0\xe6\x74\x2a\xbc\xfc\x0a\x9e\xb6\x4d\xdc\xc5\xa2\xb4\xf5\x4d\x53\x5e\xfe\xb6\xb0\xd2\xee\x0e\xf1\x38\x06\x1b\x28\x55\xce\xb7\x59\xa1\x75\x9b\x73\xfb\xaa\x4e\x7b\x1a\x57\x15\xe6\xf9\x7b\x3c\xd7\xc0\xea\x59\xd5\x3a\x7b\x28\xf2\xe1\xac\x1f\xe1\xeb\x6e\xd8\x9a\x7f\xb5\xae\x86\x50\xb4\x56\xfb\x75\x51\xbc\x9a\xd3\xa1\x1d\x60\xf4\xc4\x23\x7f\xce\xc4\xa2\xd6\xd8\x9c\x80\xd5\x1c\xea\x70\xeb\x56\x84\x8d\x35\x31\xa7\xc0\xd6\x5e\x36\xf9\x64\x8b\x7f\xb2\x5a\x83\x24\xbd\x1c\x53\xde\xd9\x0a\xca\xd4\x8f\xb3\x7a\xbf\xe1\xf7\x2b\x71\x73\x42\x8c\xae\x19\xb6\xb6\xbd\xc1\x83\xaf\xc1\xe9\xe1\x05\x06\x7f\xe9\xeb\x2f\x47\x31\xbf\x1a\x67\x57\xa9\x55\xbe\xbe\x78\x7b\x45\x60\x6a\x2a\x89\xb7\xd7\x86\x3e\xe4\xf4\xd6\xb1\xa5\xe6\x3d\x3b\x33\x6b\xec\x86\x8c\xd3\xb1\x88\xee\x6d\xce\x71\x66\x6d\xcd\x1a\x0c\xff\x51\xcc\x9e\x1b\xee\xbb\xf3\x66\xcf\x29\x1a\xbb\xad\xe8\xb8\xa2\xd6\x66\xb1\xb6\x47\x64\xbf\x64\x5c\x5e\x3d\x30\x63\x45\xdb\xfc\x89\xe5\xd7\xf8\x7a\xbd\x29\xb7\xdf\x85\xe7\xe8\x30\x78\xc0\x61\xa7\xf7\xa5\x4d\x1d\xb1\xc8\x8f\x31\x5a\x7e\xda\xf0\x47\xa4\xcc\xab\x6d\x9d\x70\x5c\x99\x70\x3d\xf4\xea\x29\xea\x8c\x5b\x6f\xa2\x3a\x30\x66\x4d\x0b\x63\x17\xb5\x66\x7f\x1f\xf5\x78\xf6\xe3\xce\xa6\x89\x6a\x91\x4d\x3b\x1b\xdb\xc6\x18\xd7\x24\x9d\x4e\x3f\xc6\x77\x8d\xec\xd2\x7e\xaf\x3e\x86\xb1\xa7\x6c\xee\xca\xf2\x82\x48\x3b\x7e\x11\x29\x4f\xc7\xc3\xee\x45\xd6\x3f\xce\xaf\xcc\x03\xc8\xac\x57\x13\x7d\xd2\xd5\x70\xb5\xfe\xa5\x8d\x4f\x88\xc9\x2b\x2a\x8b\x51\x30\xda\x11\xda\xf0\x81\x68\xf0\xea\xea\x65\xdc\x3d\x89\xea\xa3\x79\x18\x5a\xb1\xe7\x30\x3c\x9a\xa0\xc2\x5d\x27\x7e\x7d\x04\xc3\x17\xd6\x86\xf7\x46\xc2\xe9\xe1\x2b\xb3\x27\x45\x3e\x7b\xc2\xc4\x78\x12\x5e\x4d\x3f\x3b\xee\x07\xb7\xee\x07\x6b\x4a\x56\xc6\xca\xc2\xeb\x9c\x75\xf1\xbd\x68\x4e\xe4\xbd\x7b\x90\xf3\x74\xf8\x2c\x27\xc7\xd6\x52\xc3\xe9\x45\xda\xb9\x44\xc2\xe3\x97\xc4\x0d\x27\x27\xef\x6a\xfd\xd8\x71\x1e\x8e\x97\x7e\x53\xe7\xb3\xe0\xad\x6d\x19\xc7\x39\xb6\x3e\xc9\x1a\x8b\x7b\x2a\x31\x63\xc2\xab\x07\x67\x6b\x59\x44\xb1\x1f\x8b\x51\x30\xe7\xc2\x70\x52\xc3\xba\x06\xfd\x66\x9d\xad\x75\x36\xe1\x1a\x13\x03\xb6\x98\x48\xe5\xeb\x73\x79\xf7\xd0\xea\xe9\x5b\x3e\x77\x84\xcf\x33\xf1\x5d\x8b\x39\x0e\xf0\xf4\x3e\x8d\x0d\x6e\xb9\xdf\x6a\xd1\xd9\x3e\x18\x7e\x0e\xb5\x6e\xbf\xb7\xfc\x96\xc8\xfe\xb4\xe3\x75\xda\xed\x89\x11\xbe\x20\xe1\xb4\x9d\x22\xfc\xd8\xa0\x9b\xe7\xd1\x1c\xb4\x7a\x41\x45\xcf\x36\x4c\xb9\x9c\x53\x60\x5f\x17\x9d\x3f\x10\x69\x79\x27\xbd\xfc\xa6\xc5\x48\x5a\x4c\x40\xd1\xe9\xf1\x5a\x9c\x34\xa6\xfe\xad\x8e\xaf\x8c\x53\x30\xee\xf9\x52\xab\x5b\xc2\x61\x67\x94\xd1\x63\x90\xbc\xab\x2d\x23\x96\xab\x97\xf5\xf4\x04\x93\x9e\xa6\xe2\xb4\xa7\x6d\x64\xea\xcd\x61\x74\x7f\xa2\x3a\xf5\xb6\x3e\x47\x7e\x65\xce\x2a\x9c\xcb\x16\x4b\x59\xf4\xb4\x16\xfb\x5d\x3d\x8b\x68\xac\xe1\xb0\x64\x24\x9c\xdd\x6a\x63\xae\x58\x0c\xf8\xb0\xcb\x7f\x47\xf3\x2f\xe9\xc5\x3f\xba\x5c\x3c\x46\x46\x5d\x7c\xcc\xcf\x29\xf8\x7b\x56\xa4\x03\x16\x77\xf9\x29\xfb\xfc\xd6\xd8\xfc\xbc\x17\x4b\x97\x7e\x6f\xfc\xda\x75\xbb\xca\xcb\x23\xbe\x4c\x5b\x11\x87\x37\xf5\x50\xfd\x16\x69\x1d\x18\x8e\xdf\xea\xda\x0d\x2b\x9a\xc1\x64\x04\xa6\xf6\x65\x18\x9b\x1a\x75\xf1\x96\x15\x6d\xf5\x7b\x7d\x0d\xd2\x9c\x89\x99\xcc\x3a\x8d\x70\xbd\xe8\x71\x2c\xfc\x9c\x9d\xd5\xcb\xcf\x7a\x7a\xd4\x15\x6e\x5f\xb6\x18\x48\xff\xb3\x22\x5d\xe4\x12\x57\xbf\xc9\x36\x9d\x70\xb6\x62\x64\x4b\xac\xd2\xcb\xb3\x9f\x63\x6b\x70\xe8\xbc\x8b\xbb\x5b\x2e\x0b\x56\x3f\xc6\xac\x9b\x61\xec\x3d\xb1\xea\x77\xd2\xab\x93\xf7\x72\xaf\x57\xf7\x5b\xfd\x3b\xe3\xb5\xe4\xaa\xe3\x57\x6a\xab\xfb\xad\x3e\x2e\x7a\xcd\xe4\x8c\x56\xfc\xdf\xcb\xb5\xd5\x7d\x56\x1f\xa7\xff\x1b\x5a\x8d\x69\x06\x67\x16\xf2\x76\x0c\x77\xe7\x15\x5f\x57\xac\x3a\xae\x59\x75\x1e\xff\x6f\xfe\x39\x57\xff\xcd\x7f\x1d\xf7\xce\x91\x30\xb5\xe0\xfc\x73\x76\x78\x2d\xb3\xea\xf8\x95\xda\xea\x7e\xab\x8e\x2d\xde\x3a\xb4\x77\xa7\x57\xb6\x97\xad\x3b\x55\xe6\xfa\xaf\x38\xb6\x71\xdf\x8a\x55\xf7\xb6\xc2\x5c\xfb\xdf\x1a\x4b\x15\x2f\x73\xec\x8f\x27\xff\x3e\xac\x7e\x66\xaf\xf4\xda\xf6\xcb\xbc\xc2\xfb\x5e\x6d\x9c\xfd\xa3\xe3\xd3\x6f\x5d\xab\x7e\xbf\xd6\xbf\x77\x79\xad\xb8\x6a\x6c\xfd\x57\xb7\xb8\x37\x46\xab\xbc\x39\x50\xb5\x6a\xfc\x35\xac\xea\xb7\xfa\x78\xf5\xbd\x4f\xbe\xca\xdf\x56\xf7\x7b\xb5\xe3\xd5\x73\xea\xb5\x3c\xf7\xd5\xfd\x6a\x57\xcd\xbf\xd7\xf2\x79\xb5\xab\xda\xdf\x73\x9d\xc6\xfe\x8b\xc6\xfe\xcb\x5d\x8b\xad\x41\xfe\x5a\xcf\x99\x32\xe7\xfb\x5b\xdf\x3d\xe5\xfd\x9f\x3d\xae\x5a\xb5\x86\xbc\xd2\x9a\x5c\xf0\x5a\xc7\xaa\xd7\xaf\xf6\xbe\xae\x55\x7f\xeb\x7a\x85\xb1\xfd\x72\xfd\x56\x9f\x73\xf5\x98\x8f\xbf\xcc\xfc\xf7\x5f\xfb\x2d\xf3\x32\xc7\xaf\x34\xe6\x5f\xed\x9c\xaf\xd6\x6f\xf5\xf1\xea\xef\x9a\x37\xad\xb8\xea\x6f\xf9\x97\xe9\xf7\x4a\xef\x2b\xf1\xc6\x49\x95\xe3\x91\x85\x6d\xf5\xb8\xb4\xad\x62\xd5\x71\xd5\xab\xf4\xfd\xaf\x6a\xaf\xc5\x46\xf8\x3b\x5b\xc8\xcd\x99\xfe\x1b\x6d\xf6\xe5\x5f\x47\xf1\xad\xff\x9b\x5b\xf1\x7f\xda\x7f\x59\xfb\x3f\xfd\x2c\xff\xa7\xfd\xcf\x1c\xfa\x7f\xb5\xbd\x52\x9c\x65\x75\xf3\x9f\xcb\x6b\x7d\xcf\xff\xae\x96\x71\x5c\xd0\x57\x6d\xff\xd5\xfd\x5e\xed\xfd\xab\xcf\xf5\x5a\xda\xff\x0b\xcf\x22\xf7\x7f\xc1\x98\xfe\x07\x9b\xd5\x60\x0a\x63\x6d\x96\xe7\x6b\x75\x70\xac\x8e\x59\x99\xc3\xa3\x84\xfd\x0a\x9e\x3e\x74\x85\xe9\x37\xe8\xf5\x4b\xfe\x75\x3f\x3d\xeb\x74\x1d\x23\xed\x27\xdb\xcf\xd6\x99\xb3\x7a\x6c\xb3\xae\x16\xbb\xd5\x60\xb6\x5a\x2c\xb6\x3e\x5d\x18\xd3\x1c\x74\xe7\x0b\x0a\x5b\x73\x41\x41\xd6\x7b\x6d\xb4\x61\xc2\xd8\xbe\xd5\xfe\x2c\x98\x58\x77\xce\xbc\xee\x78\x85\x7e\x5d\xab\xfa\x65\x0d\xb6\xb8\xdf\xe4\x82\xad\xfe\x73\x6e\x6b\x3c\x3a\xfc\x7b\xad\xfb\x5b\xa8\x77\x67\xb4\xed\xa3\x6b\x4a\x98\x9a\x0a\xfd\xe6\x7d\xf1\x95\xf5\xf8\xc2\xef\x68\xb5\xf4\xd3\x4e\x57\x56\x6c\xed\x6e\x83\x5f\x0e\xf0\xea\xa9\x1a\xcd\x8b\xb0\xdf\xb8\xa7\x5f\x57\xf4\x9e\x69\x7a\xd5\x33\x58\xf4\xfa\x15\xbc\x7e\x29\xa7\xad\x1a\xe1\x7f\x2c\x17\x68\xde\xe9\x79\x46\xcf\xc9\xea\x66\xdb\xfc\x41\x87\xe3\x5a\x84\xfd\x33\xe6\xff\x0a\x26\x57\x97\x32\xf7\x23\xb7\x35\xce\x1c\xd6\x10\x8c\x19\x9e\x91\xc1\xc6\x07\xac\xea\x57\xf0\xce\x37\xb8\xea\x7c\x49\xaf\x5f\xce\xe0\x2a\x6d\x9f\xbc\xd7\xc7\x3e\x1f\xdb\xc7\x68\xd2\x85\xc7\x36\x8f\x38\x6e\xce\x9b\xfa\xfb\x5f\xff\x4d\x9b\xfe\x55\xda\x5f\x9d\xb3\xf8\xbf\xe7\x73\x23\x5e\xe0\xf8\xd6\x16\xc6\x3b\x12\xab\xd6\xb3\x82\xd3\xb3\xff\x87\xfa\xbc\xd6\x73\x0c\x3b\x0d\xd3\x30\x36\x67\xfc\xa5\x08\x53\x98\xf3\xfa\x8c\x1a\xec\xd7\xea\x3e\x5d\xaf\xa1\xcf\x6b\x39\x4f\xce\x61\x7a\x43\x9f\xb4\xc6\x8b\x27\xf6\x7b\xfa\x87\xff\x1d\x7d\x2a\x5e\xa1\xcf\xa2\xb9\x46\xc3\xe3\x08\x8f\xf1\xae\xdd\xf2\x07\x3a\x5e\xbe\xaf\xfd\xbf\x97\xeb\x1b\x71\xaf\x56\xdf\xfb\x94\x97\x07\x32\xff\xff\x8a\x7d\x7d\xbc\x70\xda\xc3\x8a\x75\xb9\x78\x42\x84\x39\xcb\x7a\xb9\xdb\xa2\xc9\x17\x57\x78\xb5\xf1\x93\x9e\x6d\x90\x76\x63\xe8\xaf\xfa\x64\x3d\xac\xac\xc1\x97\xfc\x55\x9f\x9c\x87\xe1\xf2\x30\x43\x61\x9f\x98\xc9\x2b\x66\xff\x46\x1f\x3f\x8f\x99\xf0\x78\x43\xab\xfb\xa4\xbc\xfb\x90\x72\x7d\xc2\x18\x74\xcc\xe3\x7a\xe5\xbc\xb9\x97\x77\x71\xc4\xe8\x7d\x05\x4f\x57\xee\xd5\xfa\x58\x5b\xc8\xe0\x4c\xa3\x3e\x71\xef\xb9\xe5\xbc\xfb\x5c\xf0\xfa\x34\x78\x79\x4b\x33\x0f\xa2\x71\x68\x62\xdb\xd1\x33\xe8\xff\xc7\xfb\xfc\xcd\xf7\xdb\xef\xd0\xef\x8d\x0d\x7b\x4e\x1b\xab\xaf\x5d\xa9\xe9\x4f\xfa\x15\xfa\xd8\x67\x99\xf2\xce\x95\x35\x7f\x37\xf8\xba\x15\x35\x34\x52\xde\x33\x99\x7c\x99\x3e\x76\x7d\x32\x1c\x32\x3b\x3f\x89\xbb\x7c\xf4\x8a\x3e\x05\x0f\x1b\x1e\x7b\x0d\x7d\x6a\x57\xf5\x49\xaf\xec\x83\xc5\xa2\xd4\xae\x7c\xce\xd1\xdc\xb3\xf7\xd0\xae\x13\xd3\x7f\x47\x9f\xfc\x6b\xe8\x53\x7c\x99\x3e\x16\x83\x37\xeb\x3d\xcb\x0a\xf3\x9d\x5e\x6d\x6d\xfb\x47\xfb\xfc\xa3\xe7\x30\xb1\x49\x2c\x96\xfd\x6f\xf5\x79\x2d\xe7\xf9\x7b\xcf\xf1\xdf\xb9\x77\xbc\xd6\x73\x18\x7d\xf4\xa8\xaf\xdd\x7b\x57\xf7\x99\xfc\x1b\x7d\x8a\x2b\xef\xe3\x3f\xdc\xe7\xbf\x63\xcc\xbc\xd2\x9e\xf9\xf7\x9c\xc7\xc6\x7c\x5f\xe1\x1e\xbf\xe6\x3e\x35\xff\x3f\xcf\x33\x69\xf0\x61\xfd\xde\x73\x99\x74\xef\x89\xf6\x97\xae\xd7\xd0\x37\xf5\x77\xf4\x8d\x79\xbc\xc0\xd7\x72\x0d\x06\xab\x11\xda\x20\x69\x6f\xfd\xb4\xf9\x56\xbb\x5e\xc4\x5d\x4d\xf5\x7f\xa8\xef\xb8\xb1\xd5\x5e\xa5\x2f\xb6\x46\xa3\xb5\xeb\x16\x57\xed\x31\x76\x6f\xcf\x05\x59\x55\x11\x74\x41\x70\x33\xa8\xcd\xea\xcd\xbc\x9b\xdf\x01\xfb\xaa\x79\xf5\x0e\xf5\x4e\xce\x22\xaf\x06\xd5\x9b\xd5\xad\xdc\xc1\x77\xd9\xc4\x05\x9c\xc9\xbe\xf4\x71\x3e\xe7\xd1\xc3\xf9\x6a\xb3\x3a\x9f\x7c\xf8\x53\xe4\xad\xec\xc6\xd9\x9c\xce\xd9\xdc\xcd\x02\x27\x70\x36\x9b\x38\x87\x3b\x78\x94\xe3\x38\x9b\x66\xfa\x69\xe6\x72\xce\xe5\x70\x4e\x65\x37\x34\x7b\xb1\x1b\x87\xab\x1e\xee\x50\xbb\x71\xec\x96\x79\x75\x11\x67\x73\x01\x7d\x9c\xc3\x59\xf4\x70\x38\x05\xae\xe5\x6c\x36\x32\xc4\x3a\x0a\xac\xe7\x02\xce\x51\x25\xdc\xc4\x37\x29\x70\xe8\x96\x25\x52\x1c\xca\xef\xd8\xa4\x77\xe5\x21\xf2\xcb\x57\x4f\x1f\x27\xf1\x2b\x0e\xd6\xbb\xb2\xa0\x0e\x64\x1b\x55\xce\xb5\xe4\xd5\x9b\xd9\x66\xcb\x9c\xda\x83\xbc\x5a\xa7\x3e\xad\x2e\x62\x80\xfd\xd4\x66\xd5\xa7\x8e\x55\x6f\xe4\x5a\x5e\x8f\xf0\xcf\x14\xd9\xcd\xfb\x81\xd3\xb9\xdb\xfc\x6c\x32\x3f\x84\xdf\xc1\xfe\x5c\x41\x82\x53\xcd\xcf\x6e\xf4\xd3\xcb\xd9\xde\xcf\xbb\xe9\xe3\x2c\xf3\x73\xad\xf9\x39\x3b\xfc\x0e\xf6\x27\xcf\x7a\x0a\xe6\xe7\x50\x2e\xe0\xd0\xf0\xde\xd9\x76\x3a\x7d\x2b\xda\xd9\x1c\x02\x9c\xc3\xdd\x9c\xf5\x57\xed\x04\x0e\x5f\xd1\x96\x3f\x07\x02\x36\x71\xed\x5f\xb5\x1e\x86\x38\x87\xb3\xb9\x83\x8d\x6c\xe4\x51\x86\x56\xb4\x38\x43\xe1\xbb\x4d\xdb\x32\x1f\xbe\x6a\x66\x7d\xd4\xca\xd9\x9b\xcb\x55\x09\x97\xf3\xc7\xf0\xf7\xb9\xdc\xb4\xa2\x1d\xce\x37\xa3\x76\x2a\x85\x97\x6d\x7a\xcb\x12\xbb\x85\xdf\xf7\x70\x7e\x67\x9b\x6a\x61\x63\xf8\x09\xa7\x86\x9f\xbd\x7c\x0f\xe0\xdd\x24\x58\xbf\x7c\x5e\x75\x85\xda\x55\xed\xaa\x0e\x50\x7b\xab\x25\x75\xa6\xba\x80\x97\x78\x5e\x9d\xa9\x2e\x52\x17\xf1\x92\xea\xe3\x66\xb5\xa4\x1e\x50\x7b\xb0\x9b\xda\xbc\xe5\x5b\x5b\x0e\xdb\x72\xf1\x96\xf6\x2d\xaf\xdb\xf2\x55\x9e\x0e\xcf\xf3\x3c\x8d\xdc\x1d\xde\x97\x66\x36\x71\x07\xbb\x85\xa3\xf1\x58\x9a\x39\x9b\x7e\xce\xe4\x70\x76\x63\x57\xf6\x62\x6f\x0e\x64\x13\xbb\x71\x32\x37\x50\x50\x7d\x14\x38\x39\x7c\x2e\x67\x73\x03\x17\x51\xe0\xbb\xaa\x8f\x8d\xec\x4b\x21\x1c\xff\xeb\xd9\x31\x1c\xab\xa7\x73\x24\x05\x0e\x64\x0f\x12\x7c\x4e\x49\xf8\x8c\x0b\x7c\x8e\xed\x79\x2b\xbb\x84\xe3\xe7\x0d\x3c\xcf\xe9\x9c\x1b\x8e\xa1\x73\x80\xfd\x78\x03\x77\x70\x0e\xbb\x9a\xef\xb9\x7c\x85\xdb\x70\x37\xf0\x4d\xce\x09\xe7\x4b\x60\xe6\xcb\xf2\xf5\x9d\xce\xe1\xec\x1a\x5e\xdf\x72\xcf\x93\xd9\x97\x5d\x49\xd1\x4f\x23\x5f\x62\x6f\xce\xe6\x3c\xfa\xd5\xee\xec\xc6\x59\xb0\x7c\xdd\x14\xd8\xc8\x5b\xc3\x6b\x58\x6e\xcb\x57\x78\x32\x87\x72\x20\xa9\x70\x8e\x9e\xca\xd1\xec\xc1\x71\xdc\xcd\x20\xa7\xb0\x3e\x1c\x9f\x81\xda\x9d\x3e\x6e\x32\x63\x14\x8e\x24\x60\x63\x38\x2a\xb7\xce\xb2\x72\xca\xf9\x52\x38\xa6\xf6\xe5\x4b\x9c\x02\x6c\xcf\x3a\x4e\xe1\x04\xce\x63\x6f\x12\xe1\x53\xfb\x30\x87\x86\xed\x00\x73\x7c\x28\xc9\xf0\xbd\xcb\x63\xf7\xf3\x3c\xc3\x33\x6a\x93\xda\xc4\x3b\x79\x27\xe7\xf0\x5b\xde\xc3\xbe\xf4\x73\x01\xcf\xab\xdd\xf9\x6e\x38\xc6\x36\x42\xf8\xfd\x6f\x08\x47\xe6\x72\xdb\x87\x7d\x78\x03\x7b\x44\xe3\xf1\x48\xbe\x16\x9e\x79\xf9\x8c\x87\x73\xb2\x19\x41\x87\xb2\x17\x29\xde\x40\x39\x67\x93\x37\xad\xb8\x65\x71\xcb\x9d\xcb\x2d\x9c\xb3\x84\x2b\x48\xc0\x5b\xbd\x91\x9d\xe7\x38\xd6\x87\xcf\xda\x8d\xb4\xe5\x99\xd4\x6c\x9a\xbd\x96\x0b\xf8\x39\xe7\x50\x08\x9b\x3f\x0b\x1a\x19\x64\x57\x0e\x8d\xda\xd9\xe4\xd5\x1e\x6a\x77\x52\x1c\x17\x7e\x9f\xe5\x6b\x5a\x6e\xcb\x4f\x73\x4f\xf6\x64\x77\xf6\xe0\x1d\x24\xc2\xf3\x9e\x1c\xde\xb9\xe3\x28\xe7\x9d\xfc\x8c\x1b\xc2\x2b\x5b\xbe\x86\xe3\x58\x17\xce\x0c\xdb\xfc\xd5\x60\x37\x3e\xb5\xea\xf8\xaf\xdb\xea\x55\xe1\xb3\x34\xad\x38\xb6\x2b\x80\xff\x3d\x0e\xe4\xc0\x15\xc7\x2f\xd7\x5e\x69\x16\x2f\x37\xfb\x0c\x4c\x7b\x69\x94\x57\xfa\x37\xb8\xe5\xc5\x2d\x2f\x6e\x99\x53\x57\xa8\x2b\xd4\x0d\xea\x0a\x1e\xe5\x51\x16\x98\xe7\x61\x75\x0a\x07\x13\xa8\x79\xf5\x66\xf5\x6d\xf5\x6d\xb6\xf0\x73\xb5\x2f\xa7\x73\x12\x87\x72\x0e\x29\x4a\x78\x88\x37\x02\x07\x72\x28\xbb\xb0\x03\x15\x54\x72\x32\x07\xd2\xc3\x81\xe4\x79\x03\x07\x30\x67\x76\x9f\xe5\xb1\xbd\x7c\xaf\xf7\x63\x3f\xe0\x03\x04\x5c\x15\x7e\xf2\x66\xce\x56\x4f\xaa\x87\xd4\x43\x6a\x6f\xf5\x76\x95\x50\x7b\xab\x63\xd5\x9e\x6a\x6f\xf5\x6e\x86\x18\xe2\x3e\xb5\xbb\xda\x3b\xfc\xd9\x5d\x5d\xaf\x7e\xab\x7e\x6b\xae\x77\xed\xaa\x36\x08\xaa\x12\xf4\x5a\x90\x02\x04\xc3\xb0\x4d\x2d\x6c\x93\x85\x6d\x26\x61\xdb\x18\x6c\xdb\x0b\x25\x40\x49\x2b\x94\xf4\xc0\x76\x65\xb0\x5d\x02\xb6\x5b\x80\xed\xd3\xb0\x43\x39\x94\x96\x41\xe9\x20\xfc\x53\x07\xec\x98\x81\x1d\x87\xa1\xac\x1c\xca\x16\x61\xe7\x22\xec\x92\x81\x5d\x66\xe1\x75\xad\xf0\xba\x19\x28\x1f\x83\xd7\xa7\xe0\x0d\x31\xa8\xa8\x81\x8a\x19\x78\x63\x0b\xbc\x71\x12\xde\xd4\x06\xbb\xd6\xc2\xae\x3d\x50\x59\x0d\x95\x79\x78\x73\x1d\xbc\xb9\x0d\xde\xb2\x0e\xde\x32\x00\x6f\x4d\x43\x55\x00\x55\x93\xb0\xdb\x10\xbc\xad\x0b\x76\x2f\x87\xdd\xbb\xa0\x3a\x06\x6f\xef\x85\x7f\x69\x81\x77\x94\xc0\x3b\x32\xf0\x8e\x21\x78\xc7\x12\xd4\x34\x42\x4d\x0e\x6a\xfa\xa1\x66\x09\xde\x39\x03\xef\x2a\xc2\x1e\x75\xb0\xc7\x02\xac\xed\x87\x77\x67\xe1\x3d\x55\xf0\x9e\x5e\xe3\xb4\x15\x60\xcf\x06\xd8\xb3\x0d\xde\x9b\x84\xf7\x4e\xc0\xfb\xd2\x50\xb7\x16\xea\xe6\x61\xaf\x76\x78\xff\x3a\xf8\x40\x09\x7c\xa0\x13\x62\xf5\xb0\x77\x1e\x3e\x38\x04\xfb\x74\x41\xfd\x5a\xa8\x9f\x86\x7d\x6b\x60\xdf\x69\xf8\x50\xc7\xd6\xf6\xe1\x0a\xf8\xf0\x34\x34\x8c\xc1\x47\x96\x60\xbf\x19\xf8\x68\x23\x34\x0e\xc2\xfe\x0d\x70\x40\x37\x7c\x2c\x0d\xf1\x32\x88\xb7\x42\xbc\x1d\x0e\xac\x84\x03\x9b\xe0\xa0\x00\x0e\x6a\x87\x83\x46\xa1\x69\x2d\x34\x65\xe1\xe3\xa5\xf0\xf1\x0e\xf8\xf8\x12\x1c\xdc\x01\x07\x0f\xc2\x21\x71\x38\x64\x16\x12\xf5\x90\xc8\x41\x62\x12\x3e\x31\x02\x9f\x58\x80\x43\xab\xe1\xd0\x66\x38\x74\x03\x1c\x3a\x08\x9f\x0c\xe0\x93\x93\xd0\x0c\x34\xd7\x42\x73\x0a\x9a\xbb\xa0\x79\x04\x9a\x17\xe0\x53\xd5\xf0\xa9\x66\xf8\x54\x07\x7c\x3a\x01\x9f\xce\xc1\xa7\xfb\xe1\xd3\xd3\xf0\x99\x32\xf8\x4c\x03\x7c\xa6\x0d\x92\x0d\xf0\xd9\x46\xf8\x6c\x1b\x7c\xb6\x17\x3e\x3b\x01\x9f\x2b\x81\xcf\xc5\xe0\x73\x63\xb0\x2e\x80\x75\x75\xb0\x2e\x05\xeb\x3a\x61\xdd\x20\xac\x9b\x85\x7f\xaf\x80\xcf\x67\xe1\xf3\x05\xf8\xfc\x38\x7c\x7e\x09\xbe\x50\x03\x5f\x48\xc2\x17\x3a\xe0\x0b\x83\xf0\x85\x59\x48\x55\xc2\x17\xeb\xe1\x8b\x69\xf8\x62\x1e\xbe\x38\x02\x5f\x5c\x80\x2f\x55\xc3\x97\x92\xf0\xe5\x7a\x68\xa9\x85\x96\x14\xb4\x74\x42\xcb\x20\xb4\xcc\xc1\x61\x15\x70\xd8\x0c\x1c\x5e\x0e\x87\x37\xc2\xe1\x19\x38\xbc\x00\x87\x8f\xc1\xe1\x4b\x70\x44\x0c\x8e\x48\xc3\x11\x79\x38\x62\x14\x8e\x58\x84\x74\x0d\xa4\xd7\x41\xba\x13\xd2\x43\x90\x9e\x83\xaf\x94\xc3\x57\xaa\xe1\xc8\x0a\x38\x32\x0e\x47\xb6\xc1\x91\xbd\x70\xe4\x38\x1c\x05\x1c\x55\x0b\x47\x25\xe1\xa8\x1e\x38\x6a\x0c\x8e\x5a\x84\xd6\x1a\x68\x6d\x86\xd6\x0d\xd0\x3a\x00\xad\x33\x70\x74\x39\x1c\x5d\x0f\x47\xa7\xe1\xe8\x3c\x1c\x3d\x01\xc7\x64\xe1\xd8\x5a\x38\x36\x05\xc7\x76\xc1\xb1\xc3\x70\xec\x3c\x64\xaa\x20\x93\x80\x4c\x16\x32\x05\xc8\x8c\xc3\x71\x01\x1c\x97\x84\xe3\x0a\x70\xdc\x38\x1c\x0f\x1c\x5f\x03\xc7\x27\xe0\xf8\x19\x58\x5f\x0e\xeb\x13\xb0\x3e\x0b\xeb\x0b\xb0\x7e\x1c\xda\x80\xb6\x1a\x68\xcb\xc0\x09\xa5\x70\x42\x11\x4e\x98\x84\x13\x03\x38\x71\x2d\x9c\xd8\x0c\x27\x6e\x80\x13\x07\xe0\xc4\x45\x38\x69\x08\xb2\x19\xc8\x16\x20\x3b\x06\xd9\x25\x38\x79\x2d\x9c\x9c\x82\x93\xbb\xe0\xab\x6d\x70\x4a\x17\x9c\x32\x0c\xa7\xcc\x41\x7b\x39\xb4\xd7\x43\x7b\x2b\xb4\xf7\x40\xfb\x18\xb4\x2f\xc2\xa9\x35\x70\x6a\x33\x9c\xda\x0e\xa7\xf6\xc2\xa9\x13\x70\x1a\x70\x5a\x0d\x9c\x96\x80\xd3\x72\x70\x5a\x2f\x7c\xad\x19\x72\x35\x90\x4b\x42\x6e\x03\xe4\x06\x20\x37\x0d\xa7\x97\xc1\xe9\xf5\x70\x7a\x06\x4e\x2f\xc0\xe9\x13\x70\x46\x00\x67\xac\x85\x33\x9a\xe1\x8c\x0d\x70\xc6\x00\x9c\x31\x03\x67\x96\xc1\x99\x8d\x70\x66\x1b\x9c\x59\x80\x33\xc7\x61\x03\xb0\xa1\x16\x36\xac\x83\x0d\x23\x70\x56\x27\x7c\x3d\x0b\x67\xc7\x0d\x78\x79\xfc\x65\xda\xcc\xaa\xb6\x04\xdf\x18\x86\xce\x56\xe8\xec\x81\xce\x31\xe8\x5c\x82\x73\x6b\xe0\xdc\x04\x9c\x9b\x85\x73\x3b\xe0\xdc\x05\xf8\x56\x0a\xbe\xd5\xe5\xb5\x5e\xf8\xd6\x38\x9c\x17\x87\xf3\xf2\xd0\x15\x83\xae\x6e\xf8\x76\x35\x7c\xbb\x0f\xbe\x13\x87\xef\x74\xc3\x77\xa6\xe1\xbb\x19\xf8\xee\x3c\x74\x67\xa1\x7b\x10\xbe\x57\x0e\xdf\x5b\x84\xef\xaf\x85\xef\x17\xe0\xfb\x73\xf0\x83\x18\xfc\x60\x08\xf2\x55\x90\xef\x80\xfc\x24\xfc\xb0\x14\x7e\x58\x09\x3f\x5c\x0b\x3f\xec\x82\xf3\x6b\xe0\xfc\x18\x9c\x1f\x87\xf3\x93\xf0\xa3\x18\xfc\x28\x0e\x3f\x5a\x7e\x3d\x0f\x3d\x40\x4f\x19\xf4\xf4\x41\xcf\x10\xfc\xb8\x1c\x7e\x5c\x0d\x3f\x1e\x80\x1f\x8f\xc0\x8f\x27\xe0\x82\x05\xf8\x49\x00\x3f\x99\x86\xc2\x0c\x5c\x58\x01\x17\x36\xc1\x85\x59\xb8\xb0\x17\x2e\x1c\x87\x8b\x80\x8b\xd6\xc2\xc5\x65\xd0\x5b\x0e\xbd\x13\xf0\xd3\x19\xf8\xd9\x14\xfc\x47\x11\x8a\x35\x70\x49\x29\x5c\xd2\x01\x97\xe4\xe1\xe7\x5d\xf0\x8b\xb5\xf0\x8b\x7e\xe8\x9b\x87\x5f\x02\xbf\x2c\xc2\xaf\xd6\xc1\xaf\xeb\xe1\xd7\xf3\xd0\xbf\x01\x7e\x53\x02\xbf\x0d\xe0\xd2\xb5\x70\xe9\x3c\x5c\x16\xc0\x65\x31\xb8\xac\x15\x2e\xcb\xc3\x65\x23\x84\x0e\xdd\xef\x9b\x61\x30\x01\x7f\xe8\x80\x3f\x0c\xc2\x1f\xe6\xe0\xf2\x69\xf8\x63\x19\xfc\x71\x16\xfe\xb8\x08\x43\x25\x30\x54\x0f\x43\x4d\xf0\xa7\x76\xb8\xa2\x1e\xae\x58\x84\x2b\x6b\xe0\xca\x24\x5c\xd9\x01\xc3\x95\x30\xbc\x16\x86\x27\x60\x78\x06\x86\x17\xe0\xaa\x29\xb8\x6a\x0e\xae\x29\x81\x91\x32\x18\x49\xc3\x48\x1e\xae\xad\x81\x6b\xe7\xe1\x3a\xe0\xba\x32\xb8\xae\x0a\xae\xab\x85\xeb\x1a\xe0\xba\x04\x5c\x97\x82\xeb\x1b\xe0\xfa\x04\x5c\xbf\xfc\x7a\x0c\x46\xd7\xc1\xe8\x1c\xdc\x90\x87\x1b\x1b\xe1\xc6\x79\xb8\xa9\x13\xc6\x9a\xe1\xe6\x46\xb8\xa5\x01\x6e\x49\xc0\xad\x71\x18\x5f\x0b\xe3\xed\x70\x5b\x1c\x6e\x4b\xc2\xed\x8d\x70\x47\x03\xdc\x31\x0a\x77\x2c\xc2\x44\x2b\xdc\x19\xc0\x9d\xe3\x70\xd7\x3a\xb8\xab\x15\xee\x1a\x86\xbb\x96\x8f\xa7\x61\x63\x0a\x36\x66\x60\xb2\x15\x26\xdb\x61\x72\x1e\xee\xce\xc0\x3d\x25\x70\xcf\x10\xdc\x9b\x85\xa9\x7a\x98\x1a\x87\xfb\x7a\xe1\xfe\x4e\x78\xa0\x1e\x1e\x68\x85\x07\x7a\x60\xba\x1d\xa6\x8b\xb0\x29\x05\x9b\x32\xb0\x29\x07\x9b\x06\x60\xd3\x08\x3c\x38\x00\x0f\xb5\xc1\x4c\x0d\xcc\x34\xc3\xcc\x06\x98\xe9\x87\x87\xeb\xe1\x91\x2c\x6c\x9e\x87\xd9\x05\x78\x74\x1a\x1e\x1b\x81\xc7\x8b\x30\xd7\x0f\x4f\x4c\xc2\x53\xcb\xce\x7a\x0a\x9e\xee\x85\x67\xe6\x60\x21\x0e\xcf\x15\xe1\xcf\xed\xf0\xc2\x3a\x78\xa1\x15\x5e\x68\x87\x17\x93\xf0\x9f\x15\xf0\x9f\x93\xb0\x54\x84\xa5\x29\xf8\x4b\x19\xbc\xd4\x05\x2f\x0d\xc1\x96\x51\x14\x23\x28\x3d\x86\x0a\x0a\xa8\x6d\xd6\x1a\x10\xf7\x18\x6a\xbb\x56\xd4\xf6\x73\xa8\x1d\xb2\xa8\x52\x50\xa5\x29\x54\xe9\x08\x6a\xc7\x0d\xa8\x9d\x86\x51\x3b\x97\xa2\x76\xa9\x44\xed\x32\x81\x7a\x5d\x0f\xaa\xbc\x1b\xf5\xcf\xfd\xa8\xd7\x57\xa2\x5e\xdf\x86\x7a\x43\x1d\xea\x0d\x13\xa8\x8a\x7e\xd4\x1b\xb3\xa8\x37\x0d\xa0\x2a\xab\x50\x95\x4d\xa8\xca\x2c\xea\xcd\x29\xd4\x5b\x62\xa8\xb7\x96\xa3\xde\xba\x84\xaa\x1a\x45\xed\x56\x40\xbd\xad\x0e\xf5\xb6\x49\xd4\xee\x6d\xa8\xea\x1a\x54\xf5\x10\xea\xed\x49\xd4\xbf\xd4\xa2\xde\x51\x81\xaa\x69\x47\xbd\x73\x1c\xf5\xce\x45\xd4\xbb\xaa\x50\xef\x1a\x46\xed\x91\x42\xed\x91\x41\xad\x8d\xa1\xde\x5d\x89\x7a\xf7\x12\xea\x3d\x4d\xa8\xda\x31\xd4\x9e\x3d\xa8\xf7\x26\x51\xef\xab\x40\xbd\x6f\x1c\x55\x57\x40\xed\x95\x46\xbd\x3f\x40\xbd\xbf\x0b\xf5\x81\x6e\x54\x6c\x00\xb5\xf7\x38\x6a\x9f\x00\xb5\x4f\x39\x6a\x9f\x46\xd4\x3e\x6d\xa8\xfa\x04\x6a\xdf\x5a\xd4\x87\x2a\x50\x1f\x1a\x45\x7d\xb8\x15\xd5\x50\x8b\x6a\x18\x46\x7d\xa4\x0d\xb5\x5f\x0d\x6a\xbf\x61\xd4\x47\x47\x51\x8d\xcb\x6d\x12\xb5\x7f\x09\x6a\xff\x3a\xd4\xfe\x69\xd4\xfe\x79\xd4\xfe\x45\xd4\xfe\x83\xa8\xfd\x67\x51\x07\x94\xa3\x0e\x98\x46\x7d\xac\x07\xf5\xb1\x71\x54\x3c\x40\xc5\x63\xa8\x78\x2b\x2a\x5e\x40\xc5\x27\x50\xff\x5a\x44\x1d\x98\x45\x1d\xb8\xfc\x7b\x12\x75\x50\x29\xea\xa0\x06\xd4\x41\x6d\xa8\x83\x8a\xa8\x83\x06\x51\x07\x8d\xa2\x0e\x5a\x42\x35\xad\x45\x35\xa5\x50\x4d\xdd\xa8\xa6\x11\x54\xd3\x3c\xea\xe3\xd5\xa8\x8f\x37\xa3\x3e\xde\x81\xfa\xf8\x20\xea\xe3\x73\xa8\x83\x2b\x51\x07\xf7\xa1\x0e\xa9\x46\x1d\x92\x44\x1d\xd2\x89\x3a\xa4\x1f\x75\xc8\x84\x09\x38\xd6\xa1\x3e\x11\x43\x1d\x5a\x40\x7d\xb2\x0e\xf5\xc9\x46\x54\x73\x0c\xf5\xa9\x04\xea\xd3\x1b\x50\x9f\x29\xa2\x92\x03\xa8\xcf\x0e\xa3\x3e\x37\x8b\xfa\xb7\x11\xd4\xba\x76\xd4\xbf\x37\xa1\x3e\x5f\x8e\xfa\x42\x29\xea\x0b\x23\xa8\x54\x07\xea\x8b\x1b\x50\x5f\xea\x44\x7d\x69\x00\xf5\xa5\x29\xd4\x97\xd7\xa1\xbe\xbc\x01\xf5\xe5\x3e\xd4\x97\xa7\x50\x2d\xa5\xa8\x96\x7a\x54\x4b\x2b\xaa\xa5\x07\xd5\x32\x86\x3a\x0c\xd4\x61\x75\xa8\xc3\x5a\x50\x87\x75\xa3\x0e\x1b\x41\x1d\xb6\x80\x3a\xbc\x06\x75\xf8\x3a\xd4\xe1\x5d\xa8\xc3\x47\x50\x87\x2f\xa2\x8e\x58\x8b\x3a\x22\x85\x3a\xa2\x1b\x75\xc4\x14\x2a\x5d\x85\x4a\x37\xa3\xd2\x1d\xa8\xf4\x10\x2a\x3d\x8f\xfa\x4a\x35\xea\x2b\x49\xd4\x57\x3a\x51\x5f\x19\x46\x1d\x19\xa0\x8e\x8c\xa3\x8e\xcc\xa2\x8e\x2c\xa2\x8e\x9c\x44\x1d\x55\x82\x3a\x2a\x86\x3a\xaa\x05\x75\x54\x1e\x75\xd4\x18\xaa\x15\x54\x6b\x1d\xaa\x35\x8d\x6a\xed\x41\xb5\x8e\xa3\x8e\x0e\x50\x47\x37\xa1\x8e\xee\x42\x1d\x3d\x8c\x3a\x7a\x1e\x75\x4c\x15\xea\x98\x04\xea\x98\x1c\xea\x98\x7e\xd4\x31\xd3\xa8\x63\xcb\x50\xc7\x36\xa2\x8e\xcd\xa2\x8e\xed\x43\x1d\x3b\x8d\xca\x94\xa3\x32\x71\x54\xa6\x1d\x95\xe9\x47\x65\x16\x50\xc7\xd5\xa3\x8e\x6b\x45\x1d\xd7\x83\x3a\x6e\x0c\x75\xdc\x12\xea\xf8\xb5\xa8\xe3\xd7\xa1\x8e\xef\x44\x1d\x3f\x84\x3a\x7e\x0e\xb5\xbe\x12\xb5\xbe\x09\xb5\xbe\x1d\xb5\xbe\x0f\xb5\x7e\x0a\xd5\x56\x8a\x6a\x8b\xa1\xda\xd2\xa8\xb6\x6e\x54\xdb\x30\xaa\x6d\x0e\x75\x42\x25\xea\x84\x38\xea\x84\x2c\xea\x84\x22\xea\x84\x49\xd4\x89\x25\xa8\x13\x63\xa8\x13\x5b\x50\x27\x76\xa3\x4e\x1c\x41\x9d\xb8\x80\x3a\xa9\x0a\x75\x52\xfb\x7f\x41\xcb\xa3\x4e\x1a\xdf\x5a\x34\x28\xdb\x80\xca\xa6\x51\xd9\x21\x54\x76\x06\x75\x72\x29\xea\xe4\x3a\xd4\xc9\xeb\x50\x27\x17\x50\x27\xcf\xa0\xbe\x5a\x8d\xfa\xea\x14\xea\x94\x59\x54\x7b\x06\xd5\x5e\x40\xb5\x4f\xa1\x4e\x2d\xfd\xeb\x76\x5a\x11\x75\xda\x20\xea\xb4\x51\xd4\x69\xb3\xa8\xaf\x25\x50\x5f\x1b\x42\xe5\x72\xa8\x5c\xaf\x69\xd3\xa8\xd3\xab\x51\xa7\xf7\xa1\x4e\x1f\x46\x9d\x3e\x81\x3a\x7d\x16\x75\x46\x0d\xea\x8c\x0e\xd4\x99\x55\xa8\x33\xf3\xa8\x0d\x09\xd4\x59\x29\xd4\x59\xd3\xa8\xaf\xb7\xa2\xce\xce\xa1\x3a\x2a\x51\x1d\x8d\xa8\x73\x5a\x51\xe7\x0c\xa2\xbe\x51\x86\xfa\xc6\x28\xea\x9b\x4d\xa8\x6f\xf6\xa1\x3a\xcb\x50\x9d\xed\xa8\x73\x41\x9d\xdb\xb2\xb5\x7d\x6b\x78\x6b\x3b\xaf\x06\xd5\x55\x8d\xfa\x76\x17\xea\x3b\xd5\xa8\xef\x4c\xa0\xbe\x5b\x8b\xfa\x6e\x01\xf5\xdd\xfe\xad\xad\x3b\x8b\xfa\x5e\x13\xea\x7b\x03\xa8\xef\x37\xa1\x7e\x10\xa0\x7e\x90\x44\xfd\xa0\x1f\x95\x2f\x43\xe5\xd3\xa8\x7c\x0f\x2a\x3f\x8d\xfa\x61\x2d\xea\x87\x1d\xa6\x4d\xa3\xce\xaf\x47\x9d\x5f\x40\xfd\x08\xd3\x5a\x50\x3f\x1a\x43\xf5\x54\xa2\x7a\x0a\xa8\x1f\x27\x50\x3f\x1e\x45\x5d\x00\xea\x82\x2c\xea\x27\x55\xa8\x9f\xcc\xa3\x0a\xad\xa8\x42\x1f\xaa\xb0\x84\xba\xb0\x09\x75\x61\x0f\xea\xc2\x39\xd4\x45\x6d\xa8\x8b\x16\x51\x17\x37\xa2\x2e\xee\x42\x5d\x3c\x85\xea\xad\x41\xf5\x76\xa3\x7e\x0a\xea\xa7\x19\xd4\x4f\xa7\x51\x3f\x6b\x45\xfd\x6c\x09\xf5\x1f\x1d\xa8\x62\x39\xaa\x98\x45\x15\xa7\x50\x97\xc4\x50\x97\x74\xa3\x2e\x99\x47\xfd\xbc\x09\xf5\xf3\x69\xd4\x2f\x9a\x51\xbf\x18\x45\xf5\x35\xa3\xfa\xa6\x51\xbf\x2c\xa2\x7e\x15\x47\xfd\x6a\x00\xf5\xeb\x52\xd4\xaf\x5b\x50\xbf\x1e\x44\xf5\x97\xa2\xfa\x53\xa8\xfe\x41\xd4\x6f\xaa\x50\xbf\xe9\x40\xfd\x66\x1a\xf5\xdb\x2e\xd4\xa5\x15\xa8\x4b\x0b\xa8\x4b\x27\x51\x03\x65\xa8\x81\x38\x6a\x20\x87\x1a\x18\x44\x0d\xcc\xa3\x2e\xab\x41\x5d\x96\x42\x5d\xb6\x80\xfa\x5d\x07\xea\xf7\x95\xa8\xdf\xf7\xa3\x06\x1b\x51\x83\x93\xa8\x3f\xa4\x51\x7f\x18\x43\x5d\x5e\x8b\xba\x7c\x00\xf5\xc7\x0c\xea\x8f\x0b\xa8\xa1\x04\x6a\xa8\x0f\xf5\xa7\x12\xd4\x9f\x5a\x50\x7f\x5a\x42\x5d\xd1\x8d\xba\x62\x1e\x75\x65\x02\x75\x65\xdf\x56\xa1\xce\xe1\x56\xd4\xf0\x38\xea\xaa\x0c\xea\xea\x32\xd4\xd5\x9d\xa8\x6b\x4a\x50\xd7\xb4\xa3\xae\x59\x42\x8d\x64\x50\x23\xf3\xa8\x6b\x13\xa8\x6b\xfb\x51\xd7\x05\xa8\xeb\x92\xa8\xeb\xfa\x50\xd7\x83\xba\x3e\x83\xba\x7e\x0a\x35\xda\x8c\x1a\x1d\x43\xdd\x90\x44\xdd\xb0\x84\xba\xb1\x05\x75\xe3\x08\xea\xa6\x2a\xd4\x4d\x3d\xa8\xb1\x3a\xd4\xd8\x28\xea\xe6\x6e\xd4\xcd\x4b\xa8\x5b\x5a\x50\xb7\x82\xba\xb5\x1d\x75\xeb\x22\x6a\xbc\x88\x1a\x5f\x40\xdd\xd6\x80\xba\x6d\x08\x75\x7b\x80\xba\x7d\x11\x75\xc7\x5a\xd4\x1d\x83\xa8\x89\x66\xd4\x44\x37\x6a\x62\x1a\x75\x67\x0b\xea\xce\x7e\xd4\x5d\xb5\xa8\xbb\xba\x50\x1b\xab\x51\x1b\x33\xa8\x8d\xcb\xaf\xa7\x50\x93\x75\xa8\xc9\x5e\xd4\xdd\x53\xa8\xbb\x97\x50\xf7\x54\xa3\xee\x69\x40\xdd\x93\x46\xdd\xd3\x8d\xba\x67\x18\x75\x6f\x09\xea\xde\x04\xea\xde\x05\xd4\x54\x3b\xea\xbe\x32\xd4\x7d\x39\xd4\x7d\xf3\xa8\xfb\xeb\x51\xf7\x8f\x6d\x6d\x0f\xd4\xa3\x1e\xe8\x42\x4d\xf7\xa2\x36\xd5\xa2\x36\xe5\x51\x0f\x76\xa0\x1e\x1c\x46\x3d\xd4\x84\x7a\x68\x02\x35\x53\x89\x9a\x49\xa1\x66\x8a\xa8\x99\x79\xd4\xc3\x8d\xa8\x87\xf3\xa8\x87\xa7\x51\x8f\xd4\xa0\x1e\xc9\xa3\x36\x07\xa8\xcd\xeb\x50\x9b\x07\x50\xb3\x0d\xa8\xd9\x09\xd4\xa3\x29\xd4\xa3\x1b\x50\x8f\x0e\xa0\x1e\x9d\x41\x3d\x56\x82\x7a\xac\x06\xf5\x58\x13\xea\xb1\x56\xd4\x63\xfd\xa8\xc7\xc6\x50\x8f\x27\x51\x73\x01\x6a\x6e\x14\xf5\x44\x2b\xea\xc9\x6a\xd4\x93\x73\xa8\xa7\xda\x50\xf3\x4d\xa8\xa7\xcb\x51\x4f\xcf\xa0\x9e\xe9\x44\x3d\xbb\x0e\xb5\xd0\x80\x7a\x2e\x40\x3d\x37\x85\x7a\x7e\x14\xf5\xe7\x0c\x6a\x31\x85\x7a\x21\x8e\x7a\x31\x86\x7a\x71\x00\xf5\x9f\x09\xd4\x12\xa8\xa5\x2e\xd4\x5f\xea\x50\x7f\x99\x45\xbd\xb4\x0e\xb5\xa5\x0a\xb5\x65\x02\x4d\x17\x5a\x55\xa3\xd5\x34\x5a\x0f\xa0\xa5\x05\x1d\xd4\xa0\xd7\x80\x5e\xd3\x8d\xde\x26\x83\xde\x36\x8e\x2e\xa9\x46\x97\x34\xa0\x4b\xd6\xa1\x4b\xb2\xe8\x92\x6e\x74\x49\x3f\xba\x64\x0c\x5d\x32\x8b\xde\x2e\x40\x6f\x57\x85\xde\x6e\x08\xbd\xdd\x34\x7a\xfb\x36\xf4\x0e\x55\xe8\x1d\xfa\xd1\xa5\x71\x74\xe9\x12\xfa\x9f\xd2\xe8\x1d\xd7\xa2\x77\x9c\x42\xef\xd4\x83\x2e\x6b\x46\x97\x2d\xa1\x77\xee\x42\xef\x12\x43\xef\x32\x81\x7e\x5d\x1a\x5d\x9e\x42\x97\xcf\xa3\xff\xb9\x1d\xfd\xfa\x0a\xf4\xeb\x7b\xd1\x6f\xa8\x44\xbf\x61\x0c\x5d\xb1\x0e\x5d\xb1\x88\x7e\x63\x01\xfd\xa6\x26\xf4\x9b\xc6\xd1\xbb\xb6\xa3\x2b\xcb\xd0\x95\x3d\xe8\x37\x57\xa2\xdf\x3c\x84\x7e\x4b\x23\xfa\x2d\x53\xe8\xb7\x26\xd1\x55\x55\xe8\xaa\x29\xf4\x6e\x39\xf4\xdb\xea\xd1\x6f\x9b\x45\xef\xde\x89\xae\xee\x46\xbf\x3d\x86\x7e\xfb\x24\xfa\x5f\x3a\xd0\xef\xa8\x46\xbf\xa3\x1f\x5d\x93\x41\xbf\xb3\x0c\xfd\xce\x21\xf4\xbb\xb2\xe8\x3d\x62\xe8\x3d\xc6\xd1\x6b\xbb\xd0\xef\xae\x43\xbf\x7b\x02\xfd\xbf\xd2\xe8\xf7\x94\xa3\xdf\xd3\x87\xae\x4d\xa2\x6b\x67\xd1\x7b\x06\xe8\x3d\xab\xd0\x7b\xd6\xa3\xf7\x4c\xa2\xf7\xec\x42\xef\x39\x86\x7e\x2f\xe8\xf7\xc6\xd0\xef\xcd\xa2\xdf\x3b\x84\x7e\xef\x12\xfa\x7d\x8d\xe8\xf7\xa5\xd1\xef\xeb\x44\xbf\xaf\x1f\xfd\xbe\x09\xf4\xfb\x16\xd0\x75\x15\xe8\xba\x7a\x74\x5d\x0a\x5d\xb7\x01\x5d\x57\x44\xd7\x8d\xa1\xeb\xe6\xd1\x7b\x95\xa1\xf7\xaa\x43\xef\x95\x44\xef\xd5\x8e\xde\xab\x17\xbd\xd7\x18\x7a\xaf\x45\xf4\xfb\xab\xd1\xef\x6f\x42\xbf\x3f\x8b\x7e\x7f\x2f\xfa\xfd\x63\xe8\xf7\x2f\xa0\x3f\x50\x89\xfe\x40\x1c\xfd\x81\x36\xf4\x07\x7a\xd0\x1f\x18\x45\x7f\x60\x01\x1d\xab\x44\xc7\x1a\xd1\xb1\x0c\x3a\xd6\x83\x8e\x8d\xa0\x63\x73\xe8\xbd\x2b\xd1\x7b\xc7\xd1\x7b\x67\xd0\x7b\xe7\xd1\x7b\x8f\xa0\xf7\x9e\x47\x7f\xb0\x02\xfd\xc1\x06\xf4\x07\x33\xe8\x0f\xf6\xa0\x3f\x38\x82\xfe\xe0\x22\x7a\x9f\xb5\xe8\x7d\x52\xe8\x7d\xba\xd1\xfb\x8c\xa2\xf7\x59\x42\xd7\xd7\xa2\xeb\xd3\xe8\xfa\x02\xba\x7e\x12\xbd\x6f\x19\x7a\xdf\x46\xf4\xbe\x59\xf4\xbe\x7d\xe8\x7d\xa7\xd1\x1f\x2a\x47\x7f\xa8\x1e\xfd\xa1\x16\xf4\x87\xba\xd0\x1f\x1a\x42\x7f\x68\x1e\xfd\xe1\x4a\xf4\x87\xe3\xe8\x0f\xb7\xa3\x3f\x5c\x44\x7f\x78\x62\xab\x00\x44\x43\x1d\xba\x21\x85\x6e\xe8\x46\x37\x8c\xa0\x1b\x16\xd1\x1f\xa9\x47\x7f\xa4\x15\xfd\x91\x02\xfa\x23\x33\xe8\xfd\x2a\xd0\xfb\xc5\xd1\xfb\x75\xa2\xf7\x1b\x46\xef\x37\x8f\xfe\x68\x1d\xfa\xa3\xed\xe8\x8f\x8e\xa0\x1b\xab\xd1\x8d\x09\x74\x63\x16\xdd\xd8\x8b\x6e\x1c\x47\x37\xce\xa3\xf7\x2f\x43\xef\xdf\x8c\xde\x3f\x83\xde\xbf\x13\xbd\x7f\x11\xbd\xff\x08\x7a\xff\x69\xf4\xfe\x4b\xe8\x03\x2a\xd0\x07\xd4\xa1\x0f\x48\xa0\x0f\x68\x45\x1f\xd0\x81\x3e\xa0\x17\x7d\xc0\x30\xfa\x80\x29\xf4\x01\x8b\xe8\x8f\x95\xa3\xe3\xf3\xe8\x7f\x1d\x47\xff\xeb\x1c\xfa\xc0\x12\xf4\x81\xd5\xe8\x03\x13\xe8\x03\x3b\xd1\x07\x4e\xa1\x0f\x5a\x8b\x3e\x68\x1e\xdd\xb4\x0e\xdd\x34\x8a\x3e\xb8\x1a\x7d\x70\x03\xfa\xe0\x75\xe8\x83\x3b\xd0\x07\xf7\xa2\x0f\x1e\x47\x1f\x3c\x87\x3e\xa4\x02\x7d\x48\x1d\xfa\x90\x14\xfa\x90\x1c\xfa\x90\x01\xf4\x21\x8b\xe8\x44\x17\x3a\x31\x8b\xfe\x44\x0e\xfd\x89\x01\xf4\x27\x96\xd0\x87\xc6\xd1\x87\xb6\xa0\x0f\xcd\xa1\x0f\xed\x41\x1f\x3a\x88\xfe\x64\x80\xfe\x64\x0a\xfd\xc9\x3c\xba\x19\xf4\xa7\x4a\xd0\x9f\x5e\x87\xfe\x4c\x1b\x3a\xd9\x81\x4e\x2e\xa0\x3f\x9b\x42\x7f\x6e\x10\xbd\xae\x1c\xbd\xae\x1f\xfd\xef\x23\xe8\x2f\x34\xa2\x53\x15\xe8\xd4\x12\xfa\x8b\x8b\xe8\x2f\x25\xd0\x5f\x2e\x43\xb7\xd4\xa0\x5b\x7a\xd0\x2d\x0b\xe8\xc3\x32\xe8\xc3\x7a\xd1\x87\x97\xa0\x0f\x5f\xfe\x3d\x8b\x3e\xa2\x04\x7d\xc4\x10\x3a\x3d\x8c\x4e\xcf\xa1\xbf\x12\x43\x7f\xa5\x1b\xfd\x95\x69\xf4\x91\x09\xf4\x91\x3d\xe8\xa3\x4a\xd0\x47\xe5\xd1\xad\x8d\xe8\xa3\xcb\xd1\xc7\x80\x3e\xa6\x1e\x7d\x4c\x3b\xfa\x98\x61\xf4\xb1\x01\xfa\xd8\x56\xf4\xb1\x53\x5b\x5b\x06\x74\xa6\x09\x9d\x69\x47\x67\xa6\xd1\xc7\x35\xa2\x8f\xeb\x47\x1f\x37\x89\x3e\x1e\xf4\xf1\x8d\xe8\xe3\x3b\xd0\xc7\xf7\xa1\x8f\x1f\x43\xaf\x0f\xd0\xeb\x63\xe8\xf5\x69\xf4\xfa\x6e\xf4\xfa\x51\xf4\xfa\x05\x74\x5b\x15\xba\xad\x09\xdd\x96\x47\xb7\xcd\xa0\x4f\xa8\x42\x9f\x90\x42\x9f\xd0\x83\x3e\x61\x10\x7d\xc2\x34\xfa\xc4\x0a\xf4\x89\x19\xf4\x89\x73\xe8\x93\xaa\xd0\x27\xa5\xd0\x27\xf5\xa3\xb3\x35\xe8\xec\x1c\xfa\xe4\x01\xf4\x57\xcb\xd0\x5f\xcd\xa2\xbf\x3a\x89\x3e\xa5\x1e\x7d\xca\x14\xba\x3d\x87\x3e\x75\x2d\xfa\xd4\x59\xf4\x69\x59\xf4\xd7\xea\xd0\x5f\x9b\x44\xe7\x8a\xe8\xdc\x22\xfa\xf4\x36\xf4\xe9\x0b\xe8\x33\x7a\xd0\x67\x2c\xa1\xcf\xdc\x80\xde\x50\x86\xde\x30\x8a\x3e\xab\x0c\x7d\x56\x0e\xfd\xf5\x72\xf4\xd7\xc7\xd1\x67\xa7\xd0\x1d\x95\xe8\x8e\x22\xfa\x9c\x14\xfa\x9c\x25\xf4\x37\x46\xd0\xdf\x6c\x46\x77\x96\xa1\x3b\x13\xe8\xce\x02\xfa\xdc\x4a\xf4\xb9\x69\xf4\xb9\xd3\xe8\x6f\xd5\xa3\xbf\x35\x82\x3e\x6f\x03\xfa\xbc\x25\x74\xd7\x24\xfa\xdb\xdd\xe8\xef\x54\xa1\xbf\x33\x8e\xfe\xee\x00\xba\xbb\x0f\xfd\xbd\x18\xfa\x7b\xf3\xe8\xef\x0f\xa1\x7f\x90\x42\xe7\xd7\xa2\x7f\x58\x8a\xfe\x61\x33\xfa\x87\xa3\xe8\xf3\x9b\xd1\x3f\x2a\x43\xff\x68\x1e\xdd\x33\x8b\xfe\xf1\x06\xf4\x05\x55\xe8\x0b\x66\xd1\x3f\xe9\x46\x17\x6a\xd0\x85\x3e\xf4\x85\x31\xf4\x85\xd3\xe8\x8b\xba\xd0\x17\x07\xe8\x8b\x73\xe8\x5e\xd0\xbd\x19\xf4\x4f\xcb\xd1\x3f\x1d\x40\xff\x2c\x86\xfe\xd9\x00\xfa\x3f\xea\xd1\xff\xb1\x84\x2e\xce\xa2\x2f\xe9\x46\xff\xbc\x14\xfd\xf3\x1e\xf4\xcf\x27\xd0\xbf\xa8\x42\xff\x22\x89\xfe\x45\x2f\xfa\x17\xd3\xe8\xbe\x38\xba\xaf\x0f\xfd\xcb\x72\xf4\x2f\x9b\xd0\xbf\xdc\x80\xfe\xe5\x18\xfa\x57\x15\xe8\x5f\xc5\xd1\xbf\xca\xa2\x7f\x35\x89\xfe\x75\x03\xfa\xd7\x03\xe8\xfe\x04\xba\xbf\x0f\xfd\x9b\x5a\xf4\x6f\xba\xd1\xbf\xad\x42\xff\xb6\x1d\x7d\x69\x80\xbe\xb4\x16\x7d\xe9\x06\xf4\xa5\xd3\xe8\x81\x16\xf4\xc0\x08\xfa\xb2\x04\xfa\xb2\x41\xf4\xef\xe2\xe8\xdf\x8d\xa0\x7f\xdf\x8a\xfe\xfd\x00\x7a\x70\x2d\x7a\xb0\x17\xfd\x87\x46\xf4\x1f\xfa\xd0\x97\xd7\xa3\x2f\x2f\xa0\xff\x58\x82\xfe\x63\x1e\xfd\xc7\x69\xf4\x50\x02\x3d\x94\x43\x0f\x4d\xa1\xff\xb4\x16\xfd\xa7\x24\xfa\x4f\x13\xe8\x2b\x9a\xd0\x57\xb4\xa3\xaf\x18\x42\x5f\x59\x83\xbe\xb2\x0f\x3d\x0c\x7a\xb8\x1d\x7d\x55\x29\xfa\xaa\x66\xf4\x55\x23\xe8\xab\xe3\xe8\xab\x73\xe8\xab\x67\xd0\xd7\xac\x43\x5f\x33\x89\x1e\xc9\xa1\xaf\xad\x47\x5f\xdb\x8d\xbe\x76\x0e\x7d\x5d\x3d\xfa\xba\x3c\xfa\xba\x05\xf4\xf5\x09\xf4\xf5\x83\xe8\xeb\x67\xd1\xa3\x15\xe8\xd1\x26\xf4\x68\x0e\x3d\x3a\x89\xbe\xa1\x1a\x7d\x43\x27\xfa\x86\x49\xf4\x8d\xa5\xe8\x1b\x9b\xd0\x37\x76\xa2\x6f\x9c\x41\xdf\x54\x8f\xbe\xa9\x03\x7d\xd3\x38\x7a\xac\x11\x3d\xd6\x87\xbe\x19\xf4\xcd\xb5\xe8\x9b\x9b\xd0\x37\xb7\xa1\x6f\x1e\x45\xdf\x52\x8e\xbe\x65\x03\xfa\x96\x61\xf4\x2d\x4b\xe8\x5b\xd7\xa1\x6f\x1d\x41\x8f\x97\xa1\xc7\x73\xe8\xf1\x69\xf4\x6d\x31\xf4\x6d\xad\xe8\xdb\x8a\xe8\xdb\x66\xd0\xb7\x97\xa2\x6f\x4f\xa3\x6f\x1f\x46\xdf\x51\x86\xbe\x23\x87\xbe\x63\x18\x3d\x51\x81\x9e\x68\x41\x4f\xf4\xa1\xef\x2c\x45\xdf\x99\x41\xdf\x39\x8a\xbe\xab\x01\x7d\x57\x06\x7d\xd7\x2c\x7a\x63\x13\x7a\x63\x1f\x7a\xe3\x3c\x7a\x32\x81\x9e\xdc\x80\x9e\x1c\x47\x4f\xce\xa1\xef\x4e\xa2\xef\xee\x46\xdf\x3d\x88\xbe\x7b\x1e\x7d\x4f\x03\xfa\x9e\x14\xfa\x9e\x11\xf4\xbd\x09\xf4\xbd\x59\xf4\xbd\xc3\xe8\x7b\x17\xd0\x53\x71\xf4\x54\x1f\xfa\xbe\x4a\xf4\x7d\x1d\xe8\xfb\x66\xd1\xf7\x27\xd1\xf7\x2f\xa0\x1f\xa8\x41\x3f\xd0\x82\x7e\x60\x1c\x3d\x5d\x8f\x9e\xce\xa1\xa7\x67\xd1\x9b\xe2\xe8\x4d\x9d\xe8\x07\xcb\xd0\x0f\xa6\xd1\x0f\xe6\xd1\x0f\x8e\xa2\x1f\x2a\x45\x3f\xd4\x8e\x7e\xa8\x17\xfd\xd0\x04\x7a\x26\x40\xcf\x34\xa2\x67\x5a\xd1\x33\x05\xf4\xcc\x38\xfa\xe1\x32\xf4\xc3\x31\xf4\xc3\x59\xf4\xc3\xc3\xe8\x87\x17\xd0\x8f\xd4\xa0\x1f\x49\xa0\x1f\xe9\x46\x3f\x32\x83\xde\x5c\x81\xde\x1c\x47\x6f\x6e\x41\x6f\xee\x44\x6f\x2e\x9a\x36\x8b\x9e\x5d\x8b\x9e\xdd\x80\x9e\x1d\x43\x3f\xda\x8c\x7e\xb4\x0f\xfd\x58\x1c\xfd\x58\x2f\xfa\xf1\x3a\xf4\xe3\x79\xf4\x1c\xe8\xb9\x04\x7a\x6e\x1c\xfd\x44\x35\xfa\x89\x76\xf4\x93\x01\xfa\xc9\x2e\xf4\x53\x25\xe8\xa7\x5a\xd1\x4f\xcd\xa3\xe7\x7b\xd1\xf3\x0b\xe8\xa7\x1b\xd1\x4f\xe7\xd1\xcf\x04\xe8\x67\xda\xd1\xcf\x14\xd1\xcf\x26\xd0\xcf\x16\xd1\x0b\x6b\xd1\x0b\x05\xf4\x73\x6b\xd1\xcf\x2d\xa2\x9f\x5f\x87\x7e\x7e\x00\xfd\xe7\x72\xf4\x9f\x9b\xd1\x7f\xee\x43\x2f\x96\xa2\x17\x9b\xd0\x8b\xed\xe8\xc5\x41\xf4\x0b\x55\xe8\x17\x3a\xd0\x2f\x2c\xa2\x5f\x6c\x43\xbf\x38\x8f\xfe\xcf\x2c\x7a\x09\xf4\x52\x2f\xfa\x2f\xb5\xe8\xbf\x8c\xa1\x5f\x6a\x44\xbf\x34\x84\xde\x12\x0f\xf3\xb1\xc2\x06\x44\x95\x22\x2a\x8f\xe8\x3a\x44\x0f\x21\x92\x40\x64\x1e\x09\x8a\xc8\x9a\x26\x64\xcd\x22\xb2\x4d\x37\xb2\xed\x5a\x64\xdb\x31\xa4\x24\x8f\x6c\x17\x43\xb6\xeb\x41\xb6\x2f\x43\xb6\xef\x42\x76\x68\x42\x76\x98\x47\x4a\x0b\xc8\x3f\xd5\x22\xff\x34\x8c\xec\x98\x45\x76\x5c\x40\x76\x5a\x44\xca\xc6\x90\x9d\x8b\xc8\x2e\x35\xc8\x2e\x45\xe4\x75\x6b\x91\xd7\x0d\x21\xe5\x4d\x48\xf9\x2c\xf2\xcf\x1d\xc8\xeb\x1b\x90\xd7\xcf\x20\x6f\xe8\x42\x2a\x2a\x91\x8a\x22\xf2\xc6\x38\xf2\xa6\x72\xe4\x4d\x03\xc8\xae\xcd\xc8\xae\x8b\x48\x65\x1f\xf2\xe6\x26\xe4\xcd\x8b\xc8\x5b\x8a\xc8\x5b\x33\x48\x55\x0d\x52\x35\x87\xec\xd6\x83\xbc\x2d\x8e\xbc\x6d\x09\xd9\x7d\x0a\xa9\xce\x21\x6f\xaf\x41\xde\x3e\x88\xfc\x4b\x06\x79\x47\x09\xf2\x8e\x71\xa4\xa6\x07\x79\x67\x12\x79\x57\x25\xf2\xae\x1e\x64\x8f\x1e\x64\x6d\x0e\x79\x77\x23\xf2\xee\x39\xe4\x7f\x35\x23\xef\xc9\x21\xb5\xfd\xc8\x9e\x3d\xc8\x7b\xab\x90\xf7\x35\x23\x75\xd5\xc8\x5e\xcb\x6d\x0c\x79\xff\x1c\x12\x03\x89\x75\x22\x7b\x0f\x23\x1f\x4c\x20\x1f\x1c\x41\xf6\x59\x87\xec\x33\x8f\xd4\xa7\x90\x7d\xcb\x91\x7d\x17\x91\x0f\xb5\x23\x1f\x9a\x46\x3e\x9c\x46\x1a\xda\x91\x8f\x74\x20\xfb\xa5\x91\xfd\x86\x90\x8f\xd6\x23\x1f\x1d\x45\x1a\xd3\x48\xe3\x04\xb2\x7f\x11\x39\x20\x89\x7c\xac\x1a\xf9\xd8\x28\x12\x6f\x41\xe2\x4b\xc8\xbf\x0e\x21\x07\xb6\x21\x07\x95\x23\x07\x15\x91\xa6\x3c\xf2\xf1\x0c\x72\x70\x29\x72\xf0\x24\x72\xc8\x2c\x92\x98\x46\x3e\x91\x47\x0e\xcd\x21\x9f\x6c\x42\x9a\x97\xdb\x3c\xf2\xa9\x21\xe4\xd3\xdd\xc8\x67\xd6\x21\xc9\x38\xf2\xd9\x2e\xe4\xdf\x4a\x91\x7f\x1b\x41\xd6\xad\x43\xfe\xbd\x02\xf9\xf7\x71\xe4\xf3\x29\xe4\xf3\xe3\xc8\x17\x5a\x91\x2f\x2c\x22\xa9\x75\x48\x6a\x02\xf9\xe2\x06\xe4\x4b\xa5\xc8\x97\x46\x91\x2f\xe7\x90\x96\x32\xa4\xa5\x88\x1c\x16\x43\x0e\x9b\x40\x0e\x9f\x40\x8e\xe8\x42\xd2\x95\x48\x7a\x08\xf9\xca\x2c\x72\x64\x2f\x72\x54\x0b\xd2\x1a\x20\xad\xbd\xc8\xd1\x4d\xc8\xd1\xc3\xc8\x31\x31\xe4\x98\x22\x72\xcc\x22\x92\x01\xc9\x34\x21\x99\x59\xe4\xb8\x02\x72\x7c\x1e\x59\x5f\x8d\xac\x1f\x40\xda\x52\x48\x5b\x16\x69\xeb\x42\xda\xfa\x90\xb6\x39\xe4\x84\x66\xe4\x84\x01\xe4\x84\x71\xe4\x84\x39\xe4\xc4\x18\x72\x62\x0f\x72\x52\x39\x72\x52\x13\x72\x52\x3b\x72\xd2\x20\x92\x0d\x90\x6c\x0b\x92\x1d\x46\x4e\xae\x41\x4e\xee\x40\x4e\x9e\x41\xbe\x9a\x46\xbe\x3a\x83\x9c\x12\x43\x4e\x29\x22\xed\x65\x48\x7b\x3b\xd2\x3e\x86\x9c\x9a\x40\x4e\x1d\x40\x4e\x8b\x21\xa7\x4d\x21\x5f\xeb\x45\x72\x4d\x48\x6e\x1c\x39\xbd\x05\x39\x7d\x02\x39\xa3\x05\x39\x63\x06\x39\x33\x8f\x6c\xa8\x40\x36\xf4\x23\x67\xa5\x90\xb3\xda\x91\xb3\x06\x91\xaf\x97\x22\x5f\x6f\x46\xbe\xde\x83\x7c\x7d\x01\x39\xbb\x15\x39\x7b\x1c\xe9\x58\x8b\x74\x74\x23\xe7\x54\x22\xe7\xcc\x21\xdf\x08\x90\x6f\x0c\x22\xdf\x98\x46\xbe\x59\x85\x7c\x73\x08\xe9\x6c\x40\x3a\x27\x90\x73\xd7\x22\xe7\x0e\x21\xdf\x6a\x41\xce\xab\x42\xce\x4b\x22\xe7\xf5\x20\xe7\x4d\x22\x5d\x4d\x48\xd7\x00\xf2\xed\x18\xf2\xed\x02\xf2\x9d\x52\xe4\x3b\x9d\xc8\x77\x96\x90\xef\xb6\x21\xdf\x1d\x45\xba\xeb\x91\xee\x21\xe4\x7b\xe5\xc8\xf7\x7a\x91\xef\xd7\x22\xdf\x1f\x43\x7e\x90\x46\x7e\x30\x8e\xe4\x63\x48\x7e\x1c\xf9\x61\x16\x39\xbf\x16\x39\x7f\x01\xf9\xd1\x04\xd2\x53\x87\xf4\x34\x21\x3d\x39\xe4\xc7\x20\x3f\xce\x22\x3f\x5e\x44\x2e\xe8\x44\x2e\x58\x42\x7e\xb2\x01\xf9\x49\x0f\xf2\x93\x01\xe4\x27\x63\x48\xa1\x15\x29\x2c\x21\x17\x96\x23\x17\xae\x45\x2e\x6c\x44\x2e\x2a\x43\x2e\xaa\x41\x2e\x8a\x23\x17\xa5\x90\x8b\x72\xc8\x45\x79\xe4\xe2\x06\xe4\xe2\x24\x72\x71\x1b\x72\x71\x27\x72\x71\x2f\x72\xf1\x10\x72\xf1\x04\x72\xf1\x1c\xf2\xd3\x3a\xe4\xa7\x09\xe4\x67\xb5\xc8\x7f\xc4\x90\x62\x15\x52\x5c\xfe\x9d\x40\x8a\x69\xe4\x92\x14\x72\x49\x16\xb9\xa4\x0b\xb9\xa4\x88\x5c\x32\x8c\x5c\xb2\x80\xfc\xbc\x1e\xf9\x79\x11\xf9\x45\x0d\xf2\x8b\x71\xa4\x2f\x8f\xfc\x32\x85\xfc\xb2\x13\xf9\xe5\x14\xf2\xab\x3a\xe4\x57\x9d\xc8\xaf\x16\x90\x5f\xaf\x43\x7e\x3d\x80\xf4\x07\x48\x7f\x12\xe9\x1f\x47\x7e\x53\x81\xfc\x26\x8d\xfc\x66\x08\xf9\x6d\x0c\xf9\x6d\x1f\xf2\xdb\x11\xe4\xd2\x24\x72\x69\x06\xb9\x74\x1a\x19\xe8\x45\x06\xc6\x91\xcb\xca\x90\xcb\x6a\x90\xcb\x72\xc8\xef\xaa\x91\xdf\x8d\x22\xbf\xcf\x20\xbf\x9f\x45\x06\x5b\x91\xc1\x0d\xc8\x1f\xea\x91\x3f\x34\x23\x7f\x68\x45\x2e\x07\xb9\xbc\x02\xb9\xbc\x13\xb9\xbc\x17\xb9\x7c\x04\xf9\x63\x07\xf2\xc7\x02\x32\xd4\x81\x0c\xf5\x22\x43\x43\xc8\x9f\xa6\x91\x3f\x2d\x22\x57\x94\x21\x57\x34\x23\x57\x74\x20\x57\x14\x90\x2b\x96\x90\x2b\xab\x90\x2b\x63\xc8\x95\x09\xe4\xca\x34\x72\x65\x0e\xb9\x32\x8f\x5c\xd9\x8f\x5c\x39\x8a\x5c\x39\x8d\x5c\xb9\x88\x0c\x97\x21\xc3\x35\xc8\x70\x2f\x72\x55\x19\x72\x55\x0d\x72\x55\x03\x72\x55\x12\xb9\x2a\x83\x5c\xd5\x81\x5c\x55\x40\xae\xae\x40\xae\xae\x45\xae\x8e\x23\x57\xa7\x90\xab\xb3\xc8\xd5\x5d\xc8\xd5\x45\xe4\xea\x61\xe4\xea\x49\xe4\xea\x79\xe4\x9a\x12\xe4\x9a\x2a\xe4\x9a\x18\x72\x4d\x02\xb9\x26\x8d\x5c\x93\x43\x46\x4a\x91\x91\x6a\x64\xa4\x0f\xb9\xb6\x16\xb9\x76\x08\xb9\xae\x06\xb9\xae\x01\xb9\x2e\x89\x5c\x97\x41\xae\xeb\x40\xae\x2b\x20\xd7\x0d\x22\xd7\x8d\x23\xd7\xcd\x22\xd7\x07\xc8\xf5\x95\xc8\xf5\x75\xc8\xf5\x4d\xc8\xf5\x2d\xc8\xf5\xed\xc8\xf5\xdd\xc8\xf5\x7d\xc8\xf5\x23\xc8\xf5\x53\xc8\xf5\x0b\xc8\x68\x29\x32\x5a\x8d\x8c\xd6\x23\xa3\xcd\xc8\x68\x2b\x32\xba\x01\x19\x5d\x40\x6e\x28\x45\x6e\xa8\x46\x6e\xa8\x47\x6e\x68\x46\x6e\xc8\x20\x37\x74\x20\x37\x14\x90\x1b\x06\x91\x1b\xc6\x91\x1b\x66\x91\x1b\x41\x6e\xac\x40\x6e\xac\x45\x6e\x8c\x23\x37\xa6\x90\x1b\xb3\xc8\x8d\x5d\xc8\x8d\x45\xe4\xc6\x61\xe4\xc6\x49\xe4\xa6\x3c\x72\x53\x3f\x72\xd3\x28\x72\xd3\x34\x32\xd6\x8e\x8c\x75\x23\x63\x7d\xc8\xd8\x08\x32\x36\x85\x8c\x2d\x20\x37\x97\x22\x37\x57\x23\x37\xd7\x23\x37\x37\x23\x37\xb7\x22\x37\x6f\x40\x6e\xee\x41\x6e\x1e\x40\x6e\x1e\x43\x6e\x9e\x41\x6e\x5e\x42\x6e\x29\x47\x6e\x59\x8b\xdc\xd2\x88\xdc\x92\x42\x6e\xc9\x22\xb7\x74\x21\xb7\x36\x21\xb7\xb6\x20\xb7\xb6\x23\xb7\x76\x23\xb7\xf6\x21\xb7\x8e\x20\xb7\x4e\x21\xb7\x2e\x20\xe3\xa5\xc8\x78\x35\x32\x5e\x8f\x8c\x37\x23\xe3\x19\x64\xbc\x03\x19\x2f\x20\xb7\xad\x45\x6e\x6b\x44\x6e\x5b\x87\xdc\xd6\x86\xdc\xd6\x89\xdc\xd6\x8b\xdc\x36\x84\xdc\x36\x81\xdc\x36\x87\xdc\x1e\x20\xb7\x57\x22\xb7\xd7\x21\xb7\x37\x21\xb7\xb7\x20\xb7\xb7\x23\xb7\x77\x23\xb7\xf7\x21\xb7\x8f\x20\xb7\x4f\x21\xb7\x2f\x20\x77\x94\x22\x77\x54\x23\x77\xd4\x23\x77\x34\x23\x77\x2c\x21\x13\x7d\xc8\xc4\x08\x32\x31\x85\x4c\x2c\x20\x77\x96\x22\x77\x56\x23\x77\xd6\x23\x77\x36\x23\x77\x66\x90\x3b\x3b\x90\x3b\x0b\xc8\x9d\x83\xc8\x5d\xeb\x90\xbb\xda\x90\xbb\x3a\x91\xbb\x7a\x91\xbb\x86\x90\xbb\x26\x90\xbb\xe6\x90\x8d\x01\xb2\xb1\x12\xd9\x58\x87\x6c\x6c\x42\x36\xb6\x20\x1b\x3b\x91\x8d\xbd\xc8\xc6\x21\x64\xe3\x04\xb2\x71\x0e\x99\x0c\x90\xc9\x4a\x64\xb2\x0e\x99\x6c\x42\x26\x5b\x90\xc9\x76\x64\xb2\x1b\x99\xec\x47\x26\x47\x91\xc9\x69\x64\x72\x09\xb9\xbb\x1c\xb9\x7b\x2d\x72\x77\x23\x72\xf7\x3a\xe4\xee\x36\xe4\x9e\x1a\xe4\x9e\x06\xe4\x9e\x24\x72\x4f\x06\xb9\xa7\x03\xb9\xa7\x17\xb9\x67\x04\xb9\x67\x0a\xb9\x67\x01\xb9\xb7\x14\xb9\xb7\x1a\xb9\xb7\x1e\xb9\xb7\x19\xb9\xb7\x15\xb9\x77\x03\x72\x6f\x0f\x32\xd5\x8c\x4c\xb5\x22\x53\x1b\x90\xa9\x02\x32\x35\x88\x4c\x8d\x23\x53\xb3\xc8\x7d\x20\xf7\x55\x20\xf7\xd5\x22\xf7\xc5\x91\xfb\x52\xc8\xfd\x35\xc8\xfd\x0d\xc8\xfd\x49\xe4\xfe\x0c\x72\x7f\x07\x72\x7f\x2f\x72\xff\x10\x72\xff\x04\x72\xff\x1c\xf2\x40\x09\xf2\x40\x15\xf2\x40\x0c\x79\x20\x81\x3c\x90\x46\x1e\xc8\x21\x0f\xe4\x91\x07\xfa\x91\x07\x46\x91\xe9\x3c\x32\xdd\x8f\x4c\x2f\xbf\x9e\x46\xa6\x17\x91\x4d\x65\xc8\xa6\x1a\x64\x53\x03\xb2\x29\x89\x6c\x6a\x43\x36\x75\x22\x9b\x7a\x91\x4d\x43\xc8\xa6\x09\x64\xd3\x1c\xf2\x60\x80\x3c\x58\x89\x3c\x58\x87\x3c\xd8\x84\x3c\x98\x46\x1e\xcc\x21\x0f\xe6\x91\x07\xfb\x91\x07\x47\x91\x07\xa7\x91\x07\x17\x91\x87\xca\x90\x87\x6a\x90\x87\x1a\x91\x87\xd6\x21\x0f\xb5\x21\x0f\x75\x22\x0f\xf5\x22\x0f\x0d\x23\x0f\x4d\x22\x0f\xcd\x23\x33\x25\xc8\x4c\x15\x32\x13\x43\x66\x12\xc8\x4c\x1a\x99\xc9\x21\x0f\xc7\x91\x87\x53\xc8\xc3\x59\xe4\xe1\x2e\xe4\xe1\x22\xf2\xf0\x30\xf2\xf0\x24\xf2\xf0\x3c\xf2\x48\x09\xf2\x48\x15\xf2\x48\x0c\x79\x24\x81\x3c\x92\x46\x1e\xc9\x21\x8f\xf4\x20\x8f\x0c\x20\x8f\x8c\x21\x8f\xcc\x20\x9b\x03\x64\x73\x25\xb2\x39\x8e\x6c\x4e\x21\x9b\xb3\xc8\xe6\x2e\x64\x73\x11\xd9\x3c\x8c\x6c\x9e\x44\x36\xcf\x6f\x25\x03\xcf\x56\x21\xb3\x31\x64\xb6\x19\x99\x6d\x45\x66\x37\x20\xb3\x3d\xc8\xec\x20\x32\x3b\x8e\x3c\x3a\x80\x3c\x3a\x86\x3c\x3a\x83\x3c\xba\x84\x3c\x56\x8e\x3c\xb6\x16\x79\x6c\x06\x79\xbc\x14\x79\xbc\x1a\x79\xbc\x1e\x79\xbc\x19\x79\xbc\x15\x79\xbc\x03\x79\xbc\x0f\x79\x7c\x04\x79\x7c\x1a\x79\x7c\x11\x99\x2b\x43\xe6\x6a\x90\xb9\x06\x64\x2e\x89\xcc\x65\x90\xb9\x0e\x64\xae\x80\xcc\x0d\x22\x73\xe3\xc8\xdc\x1c\xf2\x44\x80\x3c\x51\x89\x3c\x51\x87\x3c\xd1\x84\x3c\xd1\x82\x3c\x91\x43\x9e\xc8\x23\x4f\xf4\x23\x4f\x8c\x22\x4f\x4c\x23\x4f\x2c\x22\x4f\x96\x21\x4f\xd6\x20\x4f\x36\x20\x4f\x26\x91\x27\x33\xc8\x93\x1d\xc8\x93\xbd\xc8\x93\x43\xc8\x93\x13\xc8\x93\x73\xc8\x53\x01\xf2\x54\x25\xf2\x54\x1d\xf2\x54\x13\xf2\x54\x0b\xf2\x54\x0e\x79\x2a\x8f\x3c\xd5\x8f\x3c\x35\x8a\x3c\x35\x8d\x3c\xb5\x88\xcc\x97\x23\xf3\x6b\x91\xf9\x46\x64\x7e\x1d\x32\xdf\x86\xcc\x77\x22\xf3\xbd\xc8\xfc\x10\x32\x3f\x81\xcc\xcf\x21\x4f\x07\xc8\xd3\x95\xc8\xd3\x75\xc8\xd3\x4d\xc8\xd3\x2d\xc8\xd3\xed\xc8\xd3\xdd\xc8\xd3\x7d\xc8\xd3\x23\xc8\xd3\x53\xc8\xd3\x8b\xc8\x33\x65\xc8\x33\x35\xc8\x33\x0d\xc8\x33\x49\xe4\x99\x0c\xf2\x4c\x07\xf2\x4c\x01\x79\x66\x08\x79\x66\x02\x79\x66\x0e\x79\x36\x40\x9e\xad\x44\x9e\xad\x43\x9e\x6d\x42\x9e\x6d\x41\x9e\x6d\x47\x9e\xed\x46\x9e\xed\x43\x9e\x1d\x41\x9e\x9d\x42\x16\x66\x91\xe7\x40\x9e\xab\x40\x9e\xab\x45\x9e\x6b\x42\x9e\x6b\x41\x9e\x6b\x47\x9e\xeb\x46\x9e\xeb\x43\x9e\x1b\x41\x9e\x9b\x42\x9e\x5b\x40\x9e\x2f\x45\x9e\xaf\x41\x9e\x6f\x40\x9e\x4f\x22\xcf\x67\x90\xe7\x3b\x90\x3f\x67\x90\x3f\x77\x22\x7f\xee\x45\xfe\x3c\x84\xfc\x79\x02\xf9\xf3\x1c\xb2\x18\x20\x8b\x95\xc8\x62\x1d\xb2\xd8\x84\x2c\xb6\x20\x2f\xc4\x91\x17\x52\xc8\x0b\xed\xc8\x0b\xdd\xc8\x0b\x7d\xc8\x0b\x23\xc8\x0b\x53\xc8\x0b\x0b\xc8\x8b\xa5\xc8\x8b\xd5\xc8\x8b\xf5\xc8\x8b\xcd\xc8\x8b\xad\xc8\x8b\x1b\x90\x17\x7b\x90\x17\x07\x90\x17\xc7\x90\x17\x67\x90\x17\x97\x90\xff\x2c\x47\x96\xaa\x90\xa5\x18\xb2\xd4\x8c\x2c\xb5\x22\x4b\x1b\x90\xa5\x1e\x64\x69\x00\x59\x1a\x47\x96\xe6\x91\xbf\x94\x21\x7f\xa9\x41\xfe\xd2\x80\xbc\x94\x41\x5e\xea\x40\x5e\xea\x45\x5e\x1a\x42\x5e\x9a\x44\x5e\x5a\x40\xb6\x94\x22\x5b\xaa\x91\x2d\xf5\xc8\x96\x66\x64\x4b\x2b\xb2\x65\x03\xb2\xa5\x07\xd9\x32\x80\x6c\x19\x47\xb6\xcc\x12\x84\x58\xf6\x0a\x02\x6a\x09\x88\x13\x90\x22\x20\x4b\x40\x17\x01\x45\x02\x86\x09\x98\x24\x60\x81\x40\x95\x12\xa8\x6a\x02\xd5\x40\xa0\x92\x04\x3a\x41\xa0\xd3\x04\x3a\x47\xa0\x7b\x08\xf4\x00\x81\x1e\x23\x90\x22\x81\x0c\x13\xc8\x24\x81\x2c\x10\x04\x65\x04\x41\x0d\x41\xd0\x40\xb0\xa6\x92\x60\x4d\x1d\xc1\x36\x71\x82\x6d\x52\x04\xdb\x64\x09\xb6\xe9\x22\xd8\xa6\x48\xb0\xcd\x30\xc1\x36\x53\x04\xdb\x2c\x10\x6c\x5b\x4a\xb0\x6d\x0d\xc1\xb6\x0d\x04\xdb\x26\x09\xb6\xcd\x10\x6c\xdb\x41\xb0\x6d\x81\x60\xdb\x41\x82\x6d\xc7\x09\xb6\x9d\x25\x28\x81\xa0\xa4\x82\xa0\xa4\x8e\xa0\xa4\x89\xa0\xa4\x85\xa0\x24\x47\x50\x92\x27\x28\xe9\x27\x28\x19\x25\x28\x99\x26\x28\x59\x24\xd8\xae\x8c\x60\xbb\x1a\x82\xed\x1a\x08\xb6\x4f\x10\x6c\x9f\x26\xd8\x7e\x03\xc1\xf6\x3d\x04\xdb\x0f\x10\x6c\x3f\x46\xb0\xfd\x0c\xc1\xf6\x4b\x04\x3b\x54\x10\xec\x50\x4b\xb0\x43\x9c\x60\x87\x14\xc1\x0e\x59\x82\x1d\xba\x08\x76\x28\x12\xec\x30\x42\xb0\xc3\x14\xc1\x0e\x0b\x04\xa5\xa5\x04\xa5\xd5\x04\xa5\x0d\x04\xa5\x49\x82\xd2\x0c\x41\x69\x07\x41\x69\x81\xa0\x74\x90\xa0\x74\x8a\xa0\x74\x91\x60\xc7\x06\x82\x1d\x93\x04\x3b\x66\x08\x76\xec\x20\xd8\xb1\x40\xb0\xe3\x20\xc1\x8e\xe3\x04\x3b\xce\x12\xec\x04\xc1\x4e\x95\x04\x3b\xd5\x11\xec\x94\x20\xd8\x29\x4d\xb0\x53\x8e\x60\xa7\x3c\xc1\x4e\xfd\x04\x3b\x8d\x12\xec\x34\x4d\xb0\xd3\x22\x41\x59\x19\x41\x59\x0d\x41\x59\x03\x41\x59\x92\xa0\x2c\x43\x50\xd6\x41\x50\xd6\x4b\x50\x36\x42\x50\x36\x4d\x50\xb6\x48\xb0\x73\x19\xc1\xce\xb5\x04\x3b\x37\x11\xec\xdc\x42\xb0\x73\x3b\xc1\xce\xdd\x04\x3b\xf7\x11\xec\x3c\x4a\xb0\xf3\x34\xc1\xce\x8b\x04\xbb\x94\x11\xec\x52\xc3\xff\xc7\xd2\x1f\xff\xe7\x21\xd8\xeb\xff\xf8\xd3\xf6\xba\xae\x85\x05\xe1\x84\xc5\x16\x4e\x1c\x19\xd9\x16\x5b\x36\x41\x90\x11\x1a\xa4\x6d\x4a\x90\xb5\x41\xcc\x5d\x82\xa8\xa8\x20\x08\x52\x62\x0b\xb2\x9d\x6c\xe2\xbd\x8c\x6c\x0b\x0b\xcb\xd9\x62\x27\xce\x32\x82\x9b\xc6\x84\x06\xa1\xd1\x05\x29\xd1\xde\x34\x25\xd5\xa8\x20\x26\x8e\x98\x8c\xef\xa3\xdf\xf3\xf9\xe1\x7a\x5c\xd7\xeb\x79\xfd\x0f\xd7\x2b\xf6\x2e\x21\xf6\xae\x22\xf6\xae\x27\xf6\x6e\x23\xf6\xee\x21\xf6\x1e\x24\xf6\x9e\x20\xf6\x9e\x23\xfe\xad\x8a\xf8\xb7\x51\x22\xb3\x8e\xd8\x27\x9d\xd8\xa7\x85\xd8\x17\x62\xdf\x2c\x62\xdf\x21\xe2\x6b\x75\x44\x56\x10\x59\x9d\x44\x56\x3f\xb1\x5f\x39\xb1\xdf\x1c\xf1\xf5\x3e\xe2\x1b\x75\x44\x76\x2e\x91\x9d\x24\xf6\x2f\x27\xf6\x9f\x22\x0e\x98\x24\xfe\xbd\x9f\xc8\x29\x21\x72\xaa\x89\x9c\x06\xe2\xc0\x04\x71\x60\x23\xf1\x1f\x45\xc4\x7f\x54\x10\x07\x15\x12\x07\x95\x13\x07\xd5\x10\x07\x35\x11\xb9\xed\x44\x6e\x2f\x91\x3b\x44\xe4\x4e\x10\xb9\xb3\xc4\x37\xcb\x89\x6f\xd6\x13\xdf\x9c\x25\x0e\x6e\x20\x0e\xc9\xfb\xff\x1e\xb1\x55\x12\x79\x29\xe2\x5b\xa5\xc4\xb7\x86\x88\x6f\x17\x12\xdf\xee\x20\xbe\x93\x4d\x7c\xa7\x93\xc8\xcf\x21\xf2\x93\xc4\xa1\x45\xc4\xa1\xe3\xc4\x77\x13\xc4\xf7\x72\x89\x82\x02\xa2\xa0\x82\xf8\x7e\x16\xf1\x03\x88\x1f\xf4\x12\x87\x75\x10\x85\x33\xc4\x11\x39\xc4\x11\x45\xc4\x11\x0d\xc4\x11\x63\xc4\x91\x05\xc4\x91\xbd\x44\x51\x10\x45\x8d\x44\x51\x3b\x71\x54\x1e\x71\x54\x92\x38\x3a\x9b\x38\x7a\x82\x38\xa6\x81\x38\x66\x8a\x28\xae\x23\x8a\xe7\x89\x1f\x76\x11\xc7\x66\x13\xc7\xa5\x11\xc7\xe5\xfe\xdf\x68\x44\x49\x01\x51\x52\x46\x94\x4c\x10\x25\xb3\xc4\xf1\x69\xc4\xf1\x39\xc4\xf1\x49\xe2\xf8\x31\xe2\xf8\x69\xe2\x84\x0c\xe2\x84\x7c\x62\x51\x10\x8b\xb2\x89\x45\x85\xc4\xa2\x72\x62\x51\x0d\xb1\xa8\x99\x58\xd4\x49\x2c\xea\x27\x16\x8d\x10\xa5\x13\xc4\x89\x99\xc4\x89\x43\xc4\x49\xe5\xc4\x49\x35\xc4\x49\x4d\xc4\x49\x1d\xc4\x49\x7d\xc4\x49\xc3\xc4\x49\x29\xe2\xa4\x39\xe2\xe4\x74\xe2\xe4\x5c\xe2\xe4\x62\xe2\xe4\x4a\xe2\xe4\x3a\xe2\xe4\x16\xe2\xe4\x2e\xe2\xe4\x01\xe2\xe4\x31\xe2\xe4\x69\xa2\x0c\xa2\x2c\x8b\x28\x2b\x20\xca\xca\x88\xb2\x04\x51\xd6\x48\x94\xb5\x13\x65\xbd\x44\xd9\x10\x51\x36\x41\x94\xcd\x12\x8b\xd3\x88\xc5\x39\xc4\xe2\x22\x62\x71\x05\xb1\xb8\x96\x58\xdc\x4c\x2c\xee\x24\x16\xf7\x13\x8b\x47\x88\xc5\x93\xc4\xe2\x79\x62\x49\x06\xb1\x24\x9f\x58\x52\x46\x2c\xa9\x21\x96\x34\x11\x4b\x3a\x88\x25\x7d\xc4\x92\x61\x62\xc9\x24\xb1\x64\x9e\x58\x9a\x41\x2c\xad\x27\x96\x4e\x11\xe5\x55\x44\xf9\x10\x51\x3e\x41\x94\xcf\x11\xcb\xd2\x89\x65\xb9\xc4\xb2\x71\x62\xd9\x0c\x71\x4a\x10\xa7\x64\x13\xa7\x14\x12\xa7\x54\x10\xa7\xcc\x11\xa7\x66\x10\xa7\xe6\x11\xa7\x96\x12\xa7\x26\x88\x8a\x16\xa2\xa2\x9f\xa8\x98\x24\x4e\xab\x22\x4e\x6b\x20\x4e\x1b\x22\x4e\x4f\x27\x4e\xaf\x25\x4e\x1f\x25\x4e\x9f\x22\x4e\x5f\x20\xce\xc8\x24\xce\xc8\x27\xce\x68\x27\xce\x98\x21\x2a\x0b\x88\xca\x1e\xe2\x47\x25\xc4\x8f\x46\x88\xe5\x55\xc4\xf2\x7a\x62\x79\x2b\xb1\xbc\x9b\x58\x9e\x24\x96\x8f\x11\xcb\xa7\x89\x15\x15\xc4\x8a\x5a\x62\x45\x33\xb1\xa2\x93\x58\xd1\x4f\xac\x18\x21\x56\x4c\x12\x2b\xe6\x89\xaa\x09\xa2\x6a\x96\x38\x33\x8d\x38\x33\x87\x38\xb3\x88\x38\xb3\x82\x38\xb3\x96\x38\xb3\x99\x38\xb3\x93\x38\xb3\x9f\x38\x73\x84\x38\x73\x92\x38\x73\x9e\x38\x2b\x93\x38\x2b\x9f\x38\xab\x94\x38\xab\x9a\x38\xab\x81\x38\xab\x8d\x38\xab\x87\x38\x6b\x90\x38\x6b\x9c\x38\x6b\x86\x38\x3b\x88\xb3\xb3\x89\xb3\x0b\x89\xb3\x47\x88\xb3\x27\x89\xb3\xe7\x89\xea\x0c\xa2\x3a\x8f\xa8\x2e\x23\xaa\x13\x44\x75\x23\x51\xdd\x4e\x54\xf7\x12\xd5\x43\x44\xf5\x04\x51\x3d\x4b\x9c\x93\x46\x9c\x93\x43\x9c\x53\x44\x9c\x53\x41\x9c\x53\x4b\x9c\xd3\x4c\x9c\xd3\x49\x9c\xd3\x4f\x9c\x33\x42\x9c\x33\x49\x9c\x33\x4f\xfc\x38\x83\xf8\x71\x1e\xf1\xe3\x12\xe2\xc7\x55\xc4\x8f\xeb\x89\x1f\xb7\x12\xe7\x96\x11\xe7\x26\x88\x73\x1b\x89\x73\xdb\x89\x73\x7b\x89\x73\x87\x88\x73\x27\x89\x73\xe7\x89\x44\x06\x91\xc8\x23\x12\x25\x44\xa2\x8a\x48\xd4\x13\x89\x56\x22\xd1\x4d\x24\x92\x44\x62\x8c\x48\x4c\x13\x2b\x21\x56\x66\x11\x2b\x0b\x88\x95\x65\xc4\xca\x04\xb1\xb2\x91\x58\xd9\x4e\xac\xec\x23\x56\x0e\x13\x2b\x53\xc4\xca\x39\xe2\xbc\x74\xe2\xbc\x5c\xe2\xbc\x62\xe2\xbc\x4a\xe2\xbc\x3a\xe2\xbc\x16\xe2\xbc\x2e\xe2\xbc\x01\xe2\xbc\x51\xe2\xbc\x29\xe2\xbc\x05\xe2\xfc\x4c\xe2\xfc\x02\xe2\xfc\x32\xe2\xfc\x04\x71\x7e\x23\x71\x7e\x3b\x71\x7e\x2f\x71\xfe\x10\x71\xfe\x04\x71\xfe\x2c\x51\x93\x46\xd4\xe4\x10\x35\x45\x44\x4d\x05\x51\x53\x4b\xd4\xb4\x10\x35\xdd\x44\x4d\x92\xa8\x19\x23\x6a\xa6\x89\x0b\x20\x2e\xc8\x22\x2e\x28\x20\x2e\x28\x23\x2e\x48\x10\x17\x34\x12\x17\xb4\x13\x17\xf4\x12\x17\x0c\x11\x17\x4c\x10\x17\xcc\x12\x17\xa6\x11\x17\xe6\x10\x17\x16\x11\x17\x56\x10\x17\xd6\x12\x17\x36\x13\x17\x76\x11\x17\x41\x5c\x94\x45\x5c\x54\x40\x5c\x34\x42\x5c\x34\x49\x5c\x34\x4f\xd4\x66\x10\xb5\x79\x44\x6d\x09\x51\x5b\x45\xd4\xd6\x13\x17\x37\x10\x17\xb7\x11\x17\xf7\x10\x17\x0f\x12\x17\x8f\x13\x17\xcf\x10\xab\x82\x58\x95\x4d\xac\x2a\x24\x56\x95\x13\xab\x6a\x88\x55\x4d\xc4\xaa\x0e\x62\x55\x3f\xb1\x6a\x84\x58\x35\x49\xac\x9a\x27\x2e\xc9\x20\x2e\xc9\x23\x2e\x29\x21\x2e\xa9\x26\x2e\x69\x20\x2e\x69\x23\x2e\xe9\x25\x2e\x19\x22\x2e\x49\x11\x97\xcc\x11\x75\xe9\x44\x5d\x2e\x51\x57\x4c\xd4\x55\x12\x75\x75\x44\x5d\x0b\x51\xd7\x45\xd4\x0d\x10\x75\xa3\x44\xdd\x14\x51\xb7\x40\xac\xce\x21\x56\x17\x11\xab\x2b\x88\xd5\xb5\xc4\xea\x66\x62\x75\x27\xb1\xba\x9f\x58\x3d\x42\xac\x9e\x24\x56\xcf\x13\x97\x65\x10\x97\xe5\x13\x97\x95\x12\x97\x55\x13\x97\x35\x10\x97\xb5\x11\x97\xf5\x12\x97\x0d\x11\x97\xa5\x88\xcb\xe6\x88\xfa\x74\xa2\x3e\x97\xa8\x2f\x21\xea\xab\x88\xfa\x7a\xa2\xbe\x95\xa8\xef\x26\xea\x93\x44\xfd\x38\x51\x3f\x43\x5c\x9e\x46\x5c\x9e\x43\x5c\x5e\x44\x5c\x5e\x41\x5c\x5e\x47\x5c\xde\x42\x5c\xde\x45\x5c\x3e\x40\x5c\x3e\x46\x5c\x3e\x4d\x5c\x01\x71\x45\x16\x71\x45\x39\x71\x45\x0d\x71\x45\x13\x71\xc5\x18\x71\x65\x31\x71\x65\x25\x71\x65\x1d\x71\x65\x2b\x71\x65\x37\x71\x65\x92\xb8\x72\x67\x37\x4d\x34\x40\x34\x74\x13\x57\xe5\x10\x57\x25\x89\xab\x5b\x89\xab\xbb\x89\x6b\xca\x88\x6b\x12\xc4\x35\x8d\xc4\x35\xed\x44\x63\x29\xd1\x58\x4d\x34\x36\x10\x8d\x6d\xc4\xb5\x15\xc4\xb5\xb5\xc4\xb5\xcd\xc4\x75\x9d\xc4\xf5\x5d\xc4\xf5\xf3\x44\x53\x06\xd1\xd4\x41\x34\xf5\x11\x4d\xc3\x44\xd3\x0c\xb1\x26\x8d\x58\x93\x43\xac\x29\x22\xd6\x54\x10\x6b\x6a\x89\x35\xcd\xc4\x9a\x4e\x62\x4d\x3f\xb1\x66\x84\x58\x33\x49\xac\x59\x20\x6e\xc8\x24\x6e\x98\x22\x6e\xac\x27\x6e\x5c\x20\x9a\x33\x89\xe6\x51\xa2\x79\x9a\xb8\x29\x88\x9b\xb2\x89\x9b\x0a\x89\x9b\xca\x89\x9b\x6a\x88\x9f\xe4\x11\x3f\x29\x21\x7e\x52\x45\xfc\xb4\x88\x68\x29\x23\x5a\x12\x44\x4b\x1b\xd1\xd2\x43\xdc\x9c\x41\xdc\x9c\x47\xdc\x5c\x42\xdc\x5c\x45\xdc\x5c\x4f\xdc\xdc\x4a\xdc\xdc\x4d\xdc\x3c\x46\xdc\x52\x40\xdc\xd2\x44\xdc\x32\x4c\xdc\x5a\x40\xdc\x5a\x46\xdc\x3a\xf0\x7f\x23\x38\xad\xcd\x44\xeb\x1c\xf1\xb3\x3a\xe2\x67\x13\xc4\xcf\x73\x88\x9f\x8f\x13\x3f\x9f\x21\xfe\xb3\x82\xf8\xcf\x39\xa2\xad\x8b\xf8\x45\x1a\xf1\x8b\x1c\xe2\x17\x49\xe2\x97\xcd\xc4\x6d\x79\xc4\x6d\x13\xc4\x6d\xb3\xff\x37\xe8\xd3\x9e\x43\xb4\x57\x12\xed\xad\x44\x7b\x8a\x68\x9f\x23\x6e\x2f\x21\x6e\xef\x20\x6e\x9f\x21\xfe\x5f\x39\xf1\xff\x26\x88\x5f\xb5\x12\xbf\xea\x26\x7e\x95\x24\x3a\x2a\x88\x8e\x76\xa2\x63\x9a\xf8\x75\x11\xf1\xeb\x0a\xe2\xd7\xb5\xc4\x1d\x41\xdc\xd1\x4a\xdc\xd1\x4d\xdc\x59\x4d\xdc\xd9\x40\xdc\xd9\x46\xdc\xd9\x43\x74\x56\x12\x9d\x75\x44\x67\x0b\xd1\xd9\x45\x74\x0e\x10\x9d\xa3\x44\xe7\x14\xd1\xb9\x40\xfc\x26\x93\xf8\x4d\x3e\xf1\x9b\x52\xe2\x37\x09\xe2\xb7\xed\xc4\x6f\x87\x88\xdf\xe5\x12\xbf\xeb\x25\x7e\xb7\x33\x4f\x10\x5d\xf5\x44\xd7\x28\xd1\x35\x45\x74\x2d\x10\x77\x65\x12\x77\xe5\x13\x77\x95\x12\x77\x55\x13\x77\x35\x10\x77\x75\x10\x77\x17\x11\x77\x57\x10\x77\xd7\x12\x77\x37\x13\x77\x77\x12\x77\xf7\x13\x77\x8f\x10\x77\x4f\x12\x77\xcf\x13\xbf\xcf\x20\x7e\xdf\x4b\xfc\x7e\x88\xf8\xfd\x04\xf1\xfb\xd9\xff\x1b\xe0\xe9\xce\x21\xba\xe7\x89\x7b\x32\x88\x7b\xf2\x89\x7b\x4a\x89\x7b\xaa\x89\x7b\x1a\x88\x7b\xda\x88\x7b\x7a\x88\x7b\x06\x89\x7b\xc6\x89\x7b\x66\x88\x7b\x83\xb8\x37\x87\xb8\xb7\x88\xf8\x43\x05\xf1\x87\x5a\xe2\x0f\x2d\xc4\x1f\xba\x88\x9e\x71\xa2\x67\x86\xf8\x53\x1e\xf1\xa7\x26\xe2\x4f\xed\xc4\x9f\xfa\x89\x3f\x8d\x10\x7f\x9a\x24\x7a\xab\x89\xde\x26\xe2\xbe\x52\xe2\xbe\x59\xe2\xcf\x4d\xc4\x7f\x67\x12\xff\x3d\x46\xf4\xf5\x13\xf7\xcf\x10\x7f\x49\x23\xfa\x13\x44\x7f\x33\xd1\xdf\x4b\xfc\x35\x8b\xf8\x6b\x27\xf1\x40\x0e\xf1\xc0\x20\xf1\xc0\x38\xf1\x60\x1d\xf1\x60\x0b\x31\x90\x4d\x0c\x8c\x12\x0f\xb5\x10\x0f\x37\x10\x8f\x14\x12\x8f\x94\x13\xc9\x3a\x22\xd9\x42\x3c\x5a\x4e\x3c\x5a\x43\x3c\xda\x44\x3c\xda\x41\x3c\xda\x47\x3c\x3a\x46\x3c\x3a\x4d\x3c\x96\x22\xd6\xb6\x11\x6b\x7b\x88\xb5\x83\xc4\xe0\x3c\xf1\x78\x3e\xf1\x78\x0b\xf1\xf8\x02\xf1\xb7\x46\xe2\x6f\x33\xc4\x13\x41\x3c\x91\x4d\x3c\xd1\x44\x3c\xd1\xf1\xff\x7f\x5e\x13\x43\x39\xc4\x50\x11\x31\xd4\x45\x3c\x99\x49\x3c\x99\x4f\x3c\x99\x24\x9e\xca\x25\x9e\x2a\x26\x9e\xaa\x24\x9e\xaa\x23\x9e\x1a\x27\xd6\x15\x13\xeb\x2a\x89\x75\x75\xc4\xba\x16\x62\x5d\x17\xb1\x6e\x80\x18\xce\x25\x86\x8b\x89\xe1\x4a\x62\xb8\x8e\x18\x6e\x21\x86\xbb\x88\xe1\x9d\xdd\x28\x31\x3c\x45\x0c\x2f\x10\x4f\x37\x10\x4f\x4f\x10\xcf\x94\x12\xcf\x54\x13\xcf\x0c\x13\xcf\x96\x11\xcf\x26\x89\x91\x4a\x62\xa4\x8e\x18\x99\x20\x46\x66\x89\xe7\xd2\x88\xe7\x72\x88\xe7\xea\x89\xe7\x5a\x89\xe7\xba\x89\xe7\x92\xc4\x73\x63\xc4\x73\x33\xc4\xf3\xed\xc4\xf3\xbd\xc4\xf3\x43\xc4\xf3\x13\xc4\xf3\xb3\xc4\xfa\x34\x62\x7d\x0e\xb1\xbe\x88\x58\x5f\x41\xac\xaf\x25\xd6\x37\x13\xeb\x3b\x89\xf5\xfd\xc4\xfa\x11\x62\xfd\x24\xb1\x7e\x81\x18\xcd\x24\x46\xf3\x89\xd1\x52\x62\xb4\x9a\x18\x6d\x20\x46\xdb\x88\xd1\x1e\x62\x74\x88\x78\xa1\x9c\x78\x61\x84\x78\x61\x92\x78\x61\x9e\xd8\x90\x41\x6c\xc8\x23\x36\x94\x10\x1b\xaa\x88\x0d\xf5\xc4\x86\x36\x62\x43\x0f\xb1\x61\x90\xf8\x7b\x29\xf1\xf7\x6a\xe2\xef\x0d\xc4\xdf\xc7\x89\xbf\xcf\x10\x63\xad\xc4\x58\x37\xf1\x62\x26\xf1\x62\x3e\xf1\x62\x3b\xf1\x52\x06\xf1\x52\x2b\xf1\x52\x37\xf1\x52\x92\x78\x69\x8c\x78\x69\x9a\x78\x19\xe2\xe5\x2c\xe2\xe5\x24\xf1\xf2\x18\xf1\xf2\x34\x31\x0e\x31\x9e\x45\x8c\x17\x10\xe3\x65\xc4\xf8\x28\xb1\xb1\x8e\xd8\xd8\x42\x6c\xec\x22\x36\x0e\x10\x1b\x77\xb2\x29\x62\xe3\x02\xf1\x4a\x26\xf1\x4a\x3e\xf1\x4a\x29\xf1\x4a\x35\xf1\x4a\x03\xf1\x4a\x1b\xf1\x4a\x2f\xf1\xca\x10\xf1\x6a\x15\xf1\x6a\x3d\xf1\x6a\x2b\xf1\x6a\x37\xf1\x6a\x92\x78\x75\x8c\x78\x75\x9a\x98\x80\x98\xc8\x22\x26\x0a\x88\x89\x32\x62\x22\x41\x4c\x34\x12\x13\xed\xc4\x44\x1f\x31\x31\x4c\x4c\xa4\x88\x89\x39\xe2\xb5\x74\xe2\xb5\x5c\xe2\xb5\x62\xe2\xb5\x49\xe2\xb5\x79\x62\x53\x06\xb1\x29\x8f\xd8\x54\x42\x6c\xaa\x22\x36\x35\x11\x9b\x3a\x88\x4d\xfd\xc4\xa6\x11\x62\xd3\x24\xb1\x69\x9e\xd8\x9c\x41\x6c\xce\x23\x36\x97\x10\x9b\xab\x88\xcd\xf5\xc4\xe6\x56\x62\x73\x37\xb1\x39\x49\x6c\x1e\x27\x36\xcf\x10\xa9\x20\x52\xd9\x44\xaa\x90\x48\x55\x10\xa9\x3a\x22\xd5\x42\xa4\xba\x88\xd4\x00\x91\x1a\x25\x52\x53\x44\x6a\x81\x78\x3d\x93\x78\x3d\x9f\x78\x3d\x49\xbc\x3e\x46\xbc\x91\x20\xde\x68\x24\xde\x68\x27\xde\xe8\x25\xde\x18\x22\xde\x48\x11\x6f\xcc\x13\x5b\x32\x88\x2d\x79\xc4\x96\x12\x62\x4b\x15\xb1\xa5\x9e\xd8\xd2\x4a\x6c\xe9\x26\xb6\x24\x89\x2d\x63\xc4\x96\x69\x62\x12\x62\x32\x8b\x98\x2c\x20\x26\xcb\x88\xc9\x04\xb1\xb5\x88\xd8\x5a\x41\x6c\xad\x25\xb6\x36\x13\x6f\xa6\x13\x6f\xe6\x12\x6f\x16\x13\x6f\x56\x11\x6f\x41\xbc\xd5\x48\xbc\xd5\x4e\xbc\xd5\x4b\xbc\x35\x44\xbc\x35\x41\xbc\x35\x4b\x4c\xa5\x11\x53\x39\xc4\xd4\x1c\xb1\x2d\x9d\xd8\x56\x44\x6c\xab\x20\xb6\xd5\x12\xdb\x9a\x89\x6d\x9d\xc4\xb6\x7e\x62\xdb\x08\xb1\x6d\x8a\xd8\xb6\x40\xbc\x9d\x49\xbc\x9d\x4f\xbc\x5d\x4a\xbc\x5d\x4d\xbc\xdd\x48\xbc\xdd\x4e\xbc\xdd\x4b\x6c\xef\x20\xb6\xf7\x11\xdb\x87\x89\xed\x29\x62\xfb\x3c\x31\x9d\x41\x4c\x77\x13\xd3\x49\x62\x7a\x8c\x98\x9e\x26\xde\x69\x24\xde\x69\x27\xde\xe9\x25\xde\x19\x22\xde\x99\x20\xde\x99\x23\x76\xa4\x13\x3b\xf2\x89\x1d\xa5\xc4\x8e\x6a\x62\x47\x03\xb1\xa3\x8d\xd8\xd1\x43\xec\x18\x24\x76\x8c\x13\x3b\x66\x88\x77\xd3\x88\x77\xbb\x88\x77\x07\x88\x77\x47\x89\x77\xa7\x88\x77\x17\x88\x99\x4c\x62\x26\x9f\x98\x29\x25\x66\xaa\x89\x99\x06\x62\xa6\x8d\x98\xe9\x21\x66\x86\x88\x99\x09\x62\x66\x96\x78\x2f\x8d\x78\x2f\x87\x78\xaf\x88\x78\xaf\x82\x78\xaf\x96\x78\xaf\x99\x78\xaf\x93\x78\xaf\x9f\x78\x6f\x84\x78\x6f\x8a\x78\x6f\x81\x78\x3f\x93\x78\x3f\x9f\x78\xbf\x94\x78\xbf\x9a\x78\xbf\x81\xf8\x20\x8d\xf8\x20\x87\xf8\xa0\x88\xf8\x60\x81\x98\xcd\x22\x66\x0b\x88\xd9\x32\x62\x36\x41\x7c\x98\x46\x7c\x98\x4b\x7c\x58\x4a\x7c\x58\x4d\x7c\xd8\x40\x7c\xd8\x46\x7c\xd8\x4b\x7c\x38\x44\x7c\x38\x49\x7c\xb8\x40\xfc\x23\x93\xf8\xc7\x38\xf1\x8f\x19\xe2\xa3\x20\x3e\xca\x26\x3e\x2a\x24\x3e\x2a\x27\x3e\xaa\x21\x3e\x6a\x22\x3e\xea\x24\x3e\xea\x27\x3e\x1a\x21\x3e\x9a\x24\x3e\x9a\x27\xe6\x32\x88\xb9\x3c\x62\xae\x84\x98\xab\x26\xe6\x1a\x88\xb9\x36\x62\xae\x87\x98\x1b\x24\xe6\x26\x88\xb9\x59\xe2\xe3\x74\xe2\xe3\x5c\xe2\xe3\x62\xe2\xe3\x04\xf1\x71\x23\xf1\x71\x3b\xf1\x71\x2f\xf1\xbf\xf5\xc4\x27\x79\xc4\x27\x25\xc4\x27\x55\xc4\x27\x0d\xc4\x27\x6d\xc4\x27\x3d\xc4\x27\x83\xc4\x27\xe3\xc4\x27\x33\xc4\x7c\x10\xf3\xd9\xc4\x7c\x21\x31\x5f\x4e\x7c\x5a\x44\x7c\x5a\x41\x7c\x5a\x4b\x7c\xda\x4c\x7c\xda\x45\x7c\x9a\x24\xfe\x59\x42\xfc\xb3\x8a\xf8\x67\x3d\xf1\xcf\x36\xe2\x9f\x3d\xc4\x3f\x07\x89\xcf\x6a\x89\xcf\x9a\x89\xcf\x3a\x89\xcf\x06\x88\xcf\x46\x89\xcf\xa6\x88\x05\x88\x85\x2c\x62\xa1\x80\x58\xa8\x24\x16\xea\x89\x85\x56\x62\xa1\x9b\x58\x18\x24\x16\xc6\x89\x85\x19\xe2\x5f\x41\xfc\xab\x87\xf8\xd7\x28\xf1\xaf\x29\xe2\x5f\x0b\xc4\xe7\x59\xc4\xe7\x05\xc4\xe7\x65\xc4\xe7\x09\xe2\xf3\x46\xe2\xf3\x76\xe2\xf3\x5e\xe2\xf3\x21\xe2\xf3\x09\xe2\xf3\x39\xe2\x8b\x74\xe2\x8b\x5c\xe2\x8b\x62\xe2\x8b\x4a\xe2\x8b\x3a\x44\x01\xa2\x0c\xed\x02\xda\x25\x1b\xed\x52\x88\x76\xa9\x40\xbb\xd4\xa2\x5d\x9a\xd1\x2e\x9d\x68\x97\x01\xb4\xcb\x28\xda\x65\x0a\x7d\x29\x0d\x7d\x29\x07\x7d\xa9\x08\x7d\xa9\x02\x7d\xa9\x16\x7d\xa9\x19\x7d\xb9\x0c\x7d\x39\x81\xbe\xdc\x88\xbe\xdc\x8e\xbe\xdc\x8b\xbe\x3c\x84\xa2\x16\x45\x33\x8a\x2e\x14\x03\x28\x26\x50\xcc\x22\xa5\x21\xe5\x20\x15\x21\x55\x20\xa5\x90\xe6\x90\xd3\x91\x73\x91\x27\x90\x67\xd1\x57\xc6\xd0\x57\xa6\x51\x5a\x3b\x4a\xeb\x45\x69\x43\x28\x6d\x02\xa5\xcd\xa1\x5d\xd3\xd1\xae\xb9\x68\xd7\x62\xb4\x6b\x25\xda\xb5\x0e\xed\xda\x8a\x76\xed\x46\xbb\x0e\xa1\x5d\x27\xd0\xae\xb3\x68\xb7\x34\xb4\x5b\x0e\xda\xad\x08\xed\x56\x81\x76\xab\x45\xbb\x35\xa3\xdd\x3a\xd1\x6e\xfd\x68\xb7\x11\xb4\xdb\x24\xfa\x6a\x1f\xfa\xea\x30\xfa\x6a\x0a\x7d\x75\x0e\xa5\xa7\xa3\xf4\x5c\x94\x5e\x8c\xd2\x2b\x51\x7a\x1d\x4a\x6f\x41\xe9\x5d\x28\x7d\x00\xa5\x8f\xa2\xf4\x29\x94\xbe\x80\x76\xcf\x44\xbb\xe7\xa3\xdd\x4b\xd1\xee\xd5\x68\xf7\x06\xb4\x7b\x1b\xda\xbd\x07\xed\x3e\x88\x76\x1f\x47\xbb\xcf\xa0\x3d\xd2\xd1\x1e\xb9\x68\x8f\x62\xb4\x47\x25\xda\xa3\x0e\xed\xd1\x82\xf6\xe8\x42\x7b\x0c\xa0\x3d\xc6\xd0\x1e\xd3\x68\x4f\xd0\x9e\x59\x68\xcf\x02\xb4\x67\x19\xda\xb3\x01\xed\xd9\x86\xf6\x4c\xa2\x3d\xc7\xd0\x9e\xd3\x28\x03\xb4\x57\x06\xda\x2b\x1f\xed\x55\x8a\xf6\x4a\xa0\xbd\x1a\xd1\x5e\x1d\x68\xaf\x3e\xb4\xd7\x30\xda\x2b\x85\xf6\x9a\x47\x7b\x67\xa3\xbd\x0b\xd1\xde\xe5\x68\xef\x1a\xb4\x77\x33\xda\xbb\x0b\xed\x3d\x80\xf6\x1e\x45\x7b\x4f\xa1\xbd\x17\xd0\xbf\x65\xa2\x7f\xcb\x47\x99\x81\x32\x77\x7a\x29\xca\xac\x46\x99\x0d\x28\xb3\x0d\x65\xf6\xa0\xcc\x41\x94\x39\x8e\x32\x67\xd0\x3e\x81\xf6\xc9\x46\xfb\x14\xa2\x7d\x2a\xd0\x3e\xb5\x68\x9f\x2e\xb4\xcf\x10\xda\x67\x02\xed\x33\x8b\xf6\x4d\x47\xfb\xe6\xa1\x7d\x4b\xd1\xbe\xd5\x68\xdf\x06\xf4\xb5\x76\xf4\xb5\x5e\xf4\xb5\x21\xf4\xb5\x14\xda\x2f\x0d\xed\x97\x83\xf6\x2b\x46\xfb\x55\xa2\xfd\xea\xd0\x7e\x2d\x68\xbf\x2e\xb4\x5f\x12\xed\x37\x86\xf6\x9b\x46\x5f\x07\x7d\x3d\x0b\x7d\xbd\x10\x7d\xbd\x1c\x7d\xbd\x06\x7d\xbd\x09\x7d\xbd\x13\x7d\xa3\x0d\x7d\xa3\x07\x7d\x63\x10\x7d\x63\x1c\x7d\x63\x06\x65\xf7\xa2\xec\x21\x94\x3d\x81\xb2\x67\xd1\xfe\x69\x68\xff\x1c\xb4\x7f\x11\xda\xbf\x02\xed\xdf\x88\xf6\x6f\x47\xfb\xf7\xa2\xfd\x87\xd1\xfe\x93\x68\xff\x05\x74\x40\x26\x3a\xa0\x10\x1d\x50\x8e\x0e\xa8\x41\x07\x34\xa1\x03\x3a\xd1\x01\x03\xe8\x80\x51\x74\xc0\x14\x3a\x60\x01\xfd\x7b\x26\xfa\xf7\x42\x94\x93\x83\x72\x8a\x50\x4e\x05\xca\xa9\x45\x39\xcd\x28\xa7\x13\xe5\xf4\xa3\x9c\x31\x94\x33\x8d\x0e\x04\x1d\x98\x85\x0e\x2c\x40\x07\x96\xa1\x03\x13\xe8\xc0\x46\x74\x60\x3b\x3a\xb0\x17\x1d\x38\x84\xfe\xa3\x1f\x1d\x54\x8b\x0e\x6a\x46\x07\x75\xa2\x83\x76\xde\xa3\xe8\xa0\x29\x74\xd0\x02\xca\xcd\x44\xb9\xf9\x28\xb7\x14\xe5\x56\xa3\xdc\x06\xf4\xcd\x5a\xf4\xcd\x66\xf4\xcd\x2e\xf4\xcd\x24\xfa\xe6\x18\xfa\xe6\x0c\x3a\x38\xd0\xc1\xd9\xe8\xe0\x42\x74\x70\x05\x3a\xb8\x16\x1d\xdc\x8c\x0e\xee\x44\x07\xf7\xa3\x83\x47\xd1\xc1\x53\xe8\xe0\x05\x74\x48\x26\x3a\xa4\x00\x1d\x52\x8e\x0e\xa9\x45\x87\x34\xa3\x43\x3a\xd1\x21\xfd\xe8\x90\x11\x74\xc8\x24\x3a\x64\x1e\xe5\x65\xa0\xbc\x3c\x94\x57\x82\xf2\xaa\x50\x5e\x3d\xca\x6b\x45\x79\xdd\x28\x2f\x89\xf2\xc6\x50\xde\x34\xfa\x56\xa0\x6f\x65\xa3\x6f\x15\xa2\x6f\x95\xa3\x6f\x17\xa3\x6f\x57\xa1\x6f\x37\xa0\x6f\x77\xa3\xef\x2c\xa0\xfc\x2c\x74\x68\x05\x3a\xb4\x16\x1d\xda\x8c\x0e\xed\x44\x87\xf6\xa3\x43\x27\xd0\xa1\x73\xe8\xbb\x19\xe8\xbb\xf9\xe8\xbb\xa5\xe8\xbb\xd5\xe8\xbb\x0d\xe8\x7b\x5d\xe8\x7b\x49\xf4\xbd\x31\xf4\xbd\x69\x54\x00\x2a\xc8\x42\x05\x05\xa8\xa0\x0c\x15\xd4\xa3\x82\x4e\xf4\xfd\x39\xf4\x83\x79\x74\x58\x06\x3a\x2c\x0f\x1d\x56\x82\x0a\x6b\x51\x61\x0b\x2a\xec\x42\x85\x49\x54\x38\x8e\x0a\x17\xd0\xe1\x99\xe8\xf0\x7c\x74\x78\x29\x3a\xbc\x1a\x1d\xde\x80\x0e\x6f\x47\x87\xf7\xa2\xc3\x87\xd0\xe1\x13\xe8\xf0\x39\x74\x44\x3a\x3a\x22\x0f\x1d\x51\x82\x8e\xa8\x42\x47\xd4\xa3\x23\x5a\xd1\x11\xdd\xe8\x88\x11\x74\xc4\x02\x3a\xb2\x05\x1d\x39\x8e\x8e\x9c\x41\x45\x81\x8a\x9a\x50\x51\x07\x2a\x9a\x42\x47\xd5\xa1\xa3\x5a\xd0\x51\x5d\xe8\xa8\x01\x74\xd4\x28\x3a\x6a\x27\x5f\x40\x47\x67\xa1\xa3\x0b\xd0\xd1\xe5\xe8\xe8\x69\x74\x4c\x07\x3a\xa6\x0f\x15\x67\xa1\xe2\x02\x54\x5c\x86\x8a\x6b\x50\x71\x13\xfa\x61\x0e\xfa\x61\x11\xfa\x61\x05\xfa\x61\x2d\xfa\x61\x33\x3a\x36\x1d\x1d\x9b\x8b\x8e\x2d\x41\xc7\x56\xa1\x63\xeb\xd1\x71\x59\xe8\xb8\x42\x74\x5c\x39\x3a\xae\x06\x1d\xd7\x84\x8e\xeb\x44\xc7\xf5\xa3\xe3\x46\xd0\x71\x93\xe8\xb8\x79\x54\xd2\x87\x4a\x86\x51\x49\x0a\x95\xcc\xa1\xe3\xd3\xd1\xf1\xb9\xe8\x84\x40\x27\x64\xa3\x13\x0a\xd1\x22\xd0\xa2\x2c\xb4\x28\x85\x16\xcd\xa3\xd2\x0c\x54\x9a\x87\x4a\x4b\xd0\x89\x19\xe8\xc4\x3c\x74\x52\x26\x3a\x29\x1f\x9d\x54\x89\x4e\xaa\x43\x27\xb5\xa0\x93\xba\x50\x59\x29\x2a\xab\x46\x65\x9d\xa8\xac\x1f\x95\x8d\xa0\xb2\x49\x54\x36\x8f\x16\x67\xa0\xc5\x9d\x68\x71\x3f\x5a\x3c\x82\x96\x54\xa0\x25\xb5\x68\x49\x33\x5a\xd2\x89\x96\xf4\xa3\xa5\xd9\x68\x69\x21\x5a\x5a\x8e\x96\xd6\xa0\xa5\x4d\x68\x69\x07\x5a\xda\x87\x96\x0e\xa3\xa5\x29\xb4\x74\x0e\x95\xa7\xa3\xf2\x5c\x54\x5e\x8c\xca\x2b\x51\x79\x1d\x2a\x6f\x41\xe5\x5d\xa8\x7c\x00\x95\x8f\xa2\xf2\x29\x54\xbe\x80\x96\x65\xa2\x65\xf9\x68\x59\x29\x5a\x56\x8d\x96\x35\xa2\x65\xed\x68\x59\x2f\x5a\x36\x84\x96\x4d\xa0\x65\xb3\xe8\x94\x34\x74\x4a\x0e\x3a\xa5\x08\x9d\x52\x81\x4e\x99\x46\xa7\x82\x4e\xed\x41\x15\x79\xa8\xa2\x04\x55\x54\xa1\x8a\x7a\x54\xd1\x8a\x2a\xba\x51\x45\x12\x55\x8c\xa1\x8a\x69\x74\x1a\xe8\xb4\x2c\x74\x5a\x01\x3a\xad\x0c\x9d\x56\x83\x4e\x6b\x42\xa7\x75\xa0\xd3\xb3\xd1\xe9\x85\xe8\xf4\x72\x74\x7a\x0d\x3a\xbd\x09\x9d\xbe\x93\xf7\xa1\xd3\x87\xd1\xe9\x29\x74\xfa\x1c\x3a\x23\x1d\x9d\x91\x8b\xce\x28\x46\x67\x54\xa2\x33\xea\xd0\x19\x2d\xe8\x8c\x6e\x54\x59\x88\x2a\xcb\x51\x65\x0d\xaa\x6c\x42\x95\x1d\xa8\xb2\x0f\x55\x0e\xa3\xca\x14\xaa\x9c\x43\x3f\x4a\x47\x3f\xca\x45\x3f\x2a\x46\x3f\xaa\x44\x3f\xaa\x43\xcb\x73\xd0\xf2\x22\xb4\xbc\x02\x2d\xaf\x45\xcb\x9b\xd1\xf2\x2e\xb4\x3c\x89\x96\x8f\xa1\xe5\xd3\x68\x45\xa0\x15\xd9\x68\x45\x21\x5a\x51\x8e\x56\xd4\xa0\x15\x2d\x68\x45\x17\x5a\x31\x80\x56\x8c\xa2\x15\x53\x68\xc5\x02\xaa\xea\x45\x55\x43\xa8\x2a\x85\xaa\xe6\xd0\x99\xe9\xe8\xcc\x5c\x74\x66\x39\x3a\xb3\x06\x9d\xd9\x84\xce\xec\x40\x67\xf6\xa1\x33\x47\xd0\x99\x93\xe8\xcc\x79\x74\x56\x06\x3a\x2b\x0f\x9d\x55\x82\xce\xaa\x42\x67\xd5\xa3\xb3\x5a\xd1\x59\xdd\xe8\xac\x24\x3a\x6b\x0c\x9d\x35\x8d\xce\x06\x9d\x9d\x85\xce\x2e\x40\x67\x97\xa1\xb3\x13\xe8\xec\x26\x74\x76\x07\x3a\xbb\x0f\x9d\x3d\x8c\xce\x4e\xa1\xb3\xe7\x50\x75\x06\xaa\xce\x43\xd5\x25\xa8\xba\x0a\x55\x37\xa0\xea\x36\x54\xdd\x83\xce\x69\x40\xe7\xb4\xa1\x73\x76\xe6\x41\x74\xce\x38\xfa\x71\x1f\xfa\xf1\x30\xfa\x71\x0a\xfd\x78\x0e\x9d\x9b\x8e\xce\x2d\x44\xe7\x96\xa3\x73\x6b\xd0\xb9\x4d\xe8\xdc\x0e\x74\x6e\x1f\x3a\x77\x18\x9d\x3b\x89\xce\x9d\x47\x89\x0c\x94\xc8\x43\x89\x12\x94\xa8\x42\x89\x7a\x94\x68\x43\x89\x1e\x94\x18\x44\x89\x71\x94\x98\x41\x2b\x03\xad\xcc\x46\x2b\x0b\xd1\xca\x72\xb4\xb2\x06\xad\x6c\x42\x2b\x3b\xd0\xca\x3e\xb4\x72\x18\xad\x4c\xa1\x95\x73\xe8\xbc\x74\x74\x5e\x2e\x3a\xaf\x04\x9d\x57\x85\xce\xab\x47\xe7\xb5\xa2\xf3\xba\xd1\x79\x49\x74\xde\x18\x3a\x6f\x1a\x9d\x0f\x3a\x3f\x0b\x9d\x5f\x80\xce\x2f\x43\xe7\x27\xd0\xf9\x8d\xe8\xfc\x76\x74\x7e\x2f\xaa\xa9\x45\x35\xcd\xa8\xa6\x13\xd5\xf4\xa3\x9a\x11\x54\x33\x83\x2e\x08\x74\x41\x36\xba\x60\x00\x5d\x90\x42\x17\xcc\xa1\x0b\xd3\xd1\x85\xb9\xe8\xc2\x09\x74\xe1\x2c\xba\x28\x0d\x5d\x94\x83\x2e\x2a\x46\x17\x55\xa2\x8b\xea\xd0\x45\x2d\xa8\x36\x81\x6a\x1b\x51\x6d\x3b\xaa\xed\x45\xb5\x43\xa8\x76\x02\xd5\xce\xa1\x8b\xd3\xd1\xc5\xb9\xe8\xe2\x62\x74\x71\x25\xba\xb8\x0e\x5d\xdc\x82\x2e\xee\x42\x17\x0f\xa0\x8b\x47\xd1\xc5\x53\x68\x15\x68\x55\x36\x5a\x55\x88\x56\x95\xa3\x55\x35\x68\x55\x33\x5a\xd5\x85\x56\x0d\xa0\x55\xa3\x68\xd5\x34\xba\x04\x74\x49\x16\xba\xa4\x00\x5d\x52\x86\x2e\x49\xa0\xba\x72\x54\x57\x83\xea\x9a\x50\x5d\x07\xaa\xeb\x43\x75\xc3\xa8\x2e\x85\xea\xe6\xd0\xa5\xe9\xe8\xd2\x5c\x74\x69\x31\xba\xb4\x12\x5d\x5a\x8f\x2e\x6d\x47\x97\xf6\xa1\x4b\x87\xd1\xa5\x29\x74\xe9\x1c\x5a\x9d\x81\x56\xe7\xa3\xd5\xa5\x68\x75\x02\xad\x6e\x46\xab\xbb\xd0\xea\x01\xb4\x7a\x14\xad\x9e\x42\xab\x17\xd0\x65\x59\xe8\xb2\x02\x74\x59\x19\xba\x2c\x81\x2e\x6b\x44\x97\xb5\xa3\xcb\xfa\xd0\x65\x23\xe8\xb2\x49\x74\xd9\x3c\xaa\xcf\x40\xf5\x79\xa8\xbe\x14\xd5\x57\xa3\xfa\x06\x54\xdf\x86\xea\x7b\xd0\xe5\xfd\xe8\xf2\x11\x74\xf9\x24\xba\x7c\x01\x5d\x91\x89\xae\xc8\x47\x57\x94\xa2\x2b\x12\xe8\x8a\x46\x74\x45\x3b\xba\xb2\x0d\x5d\xd9\x83\xae\x1c\x44\x57\x8e\xa3\x2b\x67\x50\x43\xa0\x86\x6c\xd4\x50\x88\x1a\x2a\x50\x43\x2d\x6a\x68\x41\x0d\xdd\xa8\x21\x89\x1a\xc6\x50\xc3\x34\xba\x0a\x74\x55\x16\xba\xaa\x10\x5d\x55\x8e\xae\xaa\x41\x57\x35\xa1\xab\x3a\xd0\x55\x7d\xe8\xaa\x61\x74\x55\x0a\x5d\x35\x87\xae\x4e\x47\x57\xe7\xa2\xab\x8b\xd1\xd5\x95\xe8\xea\x3a\x74\x75\x2b\xba\xba\x1b\x5d\x9d\x44\x57\x8f\xa3\xab\x67\xd0\x35\x81\xae\xc9\x46\xd7\x14\xa2\x6b\x2a\xd1\x35\xf5\xe8\x9a\x56\x74\x4d\x37\xba\x26\x89\xae\x19\x43\xd7\x4c\xa3\x46\x50\x63\x16\xba\x36\xd0\xb5\xd9\xe8\xda\x22\x74\x6d\x05\xba\xb6\x0e\x5d\xdb\x89\xae\x1d\x40\xd7\x8e\xa2\x6b\xa7\xd0\xb5\x0b\xe8\xba\x4c\x74\x5d\x3e\xba\xae\x14\x5d\x57\x8d\xae\x6b\x40\xd7\xb5\xa1\xeb\x7a\xd0\x75\x83\xe8\xba\x71\x74\xdd\x2c\xba\x3e\x1d\x5d\x9f\x8b\xae\x2f\x41\xd7\xd7\xa2\xeb\x5b\xd0\xf5\xdd\xe8\xfa\x24\xba\x7e\x0c\x5d\x3f\x8d\x9a\x40\x4d\x59\xa8\xa9\x08\x35\x55\xa2\xa6\x3a\xd4\xd4\x82\x9a\xba\x51\x53\x12\x35\x8d\xa1\xa6\x19\xb4\x26\x0d\xad\xc9\x45\x6b\x8a\xd1\x9a\x4a\xb4\xa6\x0e\xad\x69\x41\x6b\xba\xd0\x9a\x01\xb4\x66\x0c\xad\x99\x46\x37\x80\x6e\xc8\x42\x37\x14\xa0\x1b\xca\xd0\x0d\x09\x74\x43\x23\xba\xa1\x03\xdd\xd0\x87\x6e\x18\x46\x37\xa4\xd0\x0d\x73\xe8\xc6\x74\x74\x63\x2e\xba\xb1\x18\xdd\x58\x89\x6e\xac\x43\x37\xb6\xa0\x1b\xbb\xd0\x8d\x03\xe8\xc6\x51\x74\xe3\x34\x6a\x06\x35\x67\xa3\xe6\x42\xd4\x5c\x8e\x9a\x6b\x50\x73\x0b\x6a\xee\x42\xcd\x49\xd4\x3c\x86\x9a\xa7\xd1\x4d\xa0\x9b\xb2\xd0\x4d\x85\xe8\xa6\x72\x74\x53\x1d\xba\xa9\x17\xfd\x04\xf4\x93\x2c\xf4\x93\x02\xf4\x93\x32\xf4\x93\x04\xfa\x49\x23\xfa\x49\x3b\xfa\x69\x3e\xfa\x69\x3f\x6a\x29\x43\x2d\x09\x74\x73\x36\xba\x79\x14\xdd\xd2\x80\x6e\x69\x43\xb7\xf4\xa0\x5b\x06\xd1\x2d\xe3\xe8\x96\x19\x74\x6b\xa0\x5b\xe7\x50\xeb\x24\xfa\x59\x02\xfd\x3c\x13\xfd\x3c\x89\xfe\xb3\x1e\xb5\x15\xa0\xb6\x32\xd4\x96\x40\x6d\x8d\xe8\x17\x19\xe8\x17\x73\xe8\x97\x43\xe8\xb6\x26\x74\x5b\x07\x6a\xaf\x42\xb7\x37\xa0\xdb\xdb\xd1\xff\x9b\x45\x1d\x05\xe8\xd7\xdd\xe8\x8e\x74\x74\x47\x2e\xba\xa3\x18\xdd\x51\x89\xee\x4c\x43\x77\x0e\xa2\x3b\xc7\xd1\x9d\x33\xa8\x33\x50\xe7\x34\xfa\x0d\xe8\x37\x59\xe8\x37\x05\xe8\xb7\x69\xe8\x77\x81\xba\xd2\x50\x57\x0e\xea\x2a\x42\x5d\x6d\xe8\xae\x2c\x74\x57\x33\xba\x6b\x16\xdd\x5d\x8d\xee\x9e\x40\xbf\xaf\x40\xbf\xdf\xe9\xb3\xa8\x3b\x1d\x75\x77\xa0\xee\x3e\x74\x4f\x0e\xba\x67\xa7\x0f\xa3\x7b\xa6\xd1\xbd\xdd\xe8\x0f\xe5\xe8\x0f\xd3\xa8\x07\xd4\x93\x8d\x7a\x0a\x51\x4f\x39\xea\x59\x40\xff\xd5\x8f\xfe\x6b\x04\xfd\xd7\x24\xfa\x63\x2b\xfa\x63\x0f\xfa\xe3\x20\xfa\xe3\x38\xfa\xe3\x2c\xfa\x53\x3b\xea\xad\x40\xf7\x05\xba\x6f\x10\xdd\x37\x8e\xee\x9b\x45\x7f\x4e\x43\x7f\xce\x41\x7f\x5e\x40\xff\x3d\x86\xfe\x7b\x06\xf5\xa5\xa1\xbe\x1c\xd4\x37\x81\xfa\x66\xd1\xfd\x69\xe8\xfe\x1c\x74\x7f\x11\xba\xbf\x0a\xdd\x5f\x8f\xee\x6f\x45\xf7\x77\xa3\xfb\x93\xe8\xfe\x31\x74\xff\x0c\xfa\x9f\x29\xf4\x97\x3e\xf4\x97\x61\xf4\x97\x14\xfa\xcb\x1c\xea\x4f\x47\xfd\xf9\xa8\xbf\x14\xf5\x57\xa3\xfe\x06\xd4\xdf\x86\xfa\x7b\x50\xff\x20\xfa\x6b\x27\xfa\x6b\x3f\xfa\xeb\x28\xfa\xeb\x34\x7a\x00\xf4\x40\x16\x7a\xa0\x1b\x3d\x90\x44\x0f\x8c\xa1\x07\xa6\xd1\x83\xa0\x07\xb3\xd0\x83\x05\xe8\xc1\x32\xf4\x60\x02\x3d\xd8\x88\x1e\x6c\x47\x0f\xf6\xa2\x07\x87\xd0\x83\x13\xe8\xc1\x59\x34\x90\x86\x06\x72\xd0\x40\x11\x1a\xa8\x40\x03\xb5\x68\xa0\x19\x0d\x74\xa2\x81\x7e\x34\x30\x82\x06\x26\xd1\xc0\x3c\x7a\x28\x03\x3d\x94\x87\x1e\x2a\x41\x0f\x55\xa1\x87\xea\xd1\x43\xad\xe8\xa1\x6e\xf4\x50\x12\x3d\x34\x86\x1e\x9a\x46\x0f\x83\x1e\xce\x42\x0f\x17\xa0\x87\xcb\xd0\xc3\x09\xf4\x70\x23\x7a\xb8\x1d\x3d\xdc\x8b\x1e\x1e\x42\x0f\x4f\xa0\x87\x67\xd1\x23\x69\xe8\x91\x1c\xf4\x48\x11\x7a\xa4\x02\x3d\x52\x8b\x1e\x69\x46\x8f\x74\xa2\x47\xfa\xd1\x23\x23\xe8\x91\x49\xf4\xc8\x3c\x4a\x66\xa0\x64\x1e\x4a\x96\xa0\x64\x15\x4a\xd6\xa3\x64\x2b\x4a\x76\xa3\x64\x12\x25\xc7\x50\x72\x1a\x3d\x0a\x7a\x34\x0b\x3d\x5a\x80\x1e\x2d\x43\x8f\x65\xa3\xc7\x0a\xd1\x63\xe5\xe8\xb1\x1a\xf4\x58\x13\x7a\xac\x03\x3d\xd6\x87\x1e\x1b\x46\x8f\xa5\xd0\x63\x73\x68\x6d\x3a\x5a\x9b\x8b\xd6\x16\xa3\xb5\x95\x68\x6d\x1d\x5a\xdb\x82\xd6\x76\xa1\xb5\x03\x68\xed\x28\x5a\x3b\x85\xd6\x2e\xa0\xc1\x4c\x34\x98\x8f\x06\x4b\xd1\x60\x35\x1a\x6c\x40\x83\xed\x68\xb0\x17\x0d\x0e\xa1\xc1\x09\x34\x38\x87\x1e\x4f\x47\x8f\xe7\xa2\xc7\x8b\xd1\xe3\x95\xe8\xf1\x3a\xf4\x78\x0b\x7a\xbc\x0b\x3d\x3e\x80\x1e\x1f\x47\x8f\xcf\xa0\xbf\x05\xfa\x5b\x36\xfa\x5b\x21\x7a\x62\xa7\xca\xd1\x13\x35\xe8\x89\x26\xf4\x44\x07\x7a\xa2\x0f\x3d\x31\x8c\x9e\x48\xa1\x27\xe6\xd0\x50\x3a\x1a\xca\x45\x43\xc5\x68\xa8\x12\x0d\xd5\xa3\xa1\x56\x34\xd4\x8d\x86\x92\x68\x68\x0c\x0d\x4d\xa3\x27\x41\x4f\x66\xa1\x27\x0b\xd0\x93\x65\xe8\xc9\x04\x7a\xb2\x11\x3d\xd9\x8e\x9e\xec\x45\x4f\x0e\xa1\x27\x27\xd0\x53\x63\xe8\xa9\x69\xb4\x0e\xb4\x2e\x0b\xad\x2b\x40\xeb\xca\xd0\xba\x04\x5a\xd7\x88\xd6\xb5\xa3\x75\xbd\x68\xdd\x10\x5a\x37\x81\xd6\xcd\xa2\xe1\x34\x34\x9c\x83\x86\x8b\xd0\x70\x05\x1a\xae\x45\xc3\xcd\x68\xb8\x13\x0d\xf7\xa3\xe1\x11\x34\x3c\x89\x86\xe7\xd1\xd3\x99\xe8\xe9\x7c\xf4\x74\x29\x7a\xba\x1a\x3d\xdd\x80\x9e\x6e\x43\x4f\xf7\xa0\xa7\x07\xd1\xd3\x13\xe8\xe9\x59\xf4\x4c\x3a\x7a\x26\x17\x3d\x53\x8c\x9e\xa9\x44\xcf\xd4\xa3\x67\xda\xd0\x33\xbd\xe8\x99\x21\xf4\xcc\x04\x7a\x66\x16\x3d\x9b\x89\x9e\xcd\x47\xcf\x96\xa2\x67\x13\xe8\xd9\x26\xf4\x6c\x07\x7a\xb6\x0f\x3d\x3b\x8c\x9e\x4d\xa1\x67\xe7\xd1\x48\x06\x1a\xc9\x43\x23\x25\x68\xa4\x0a\x8d\xd4\xa3\xe7\x9a\xd0\x73\x9d\xe8\xf9\x6e\xf4\x7c\x12\x3d\x3f\x86\x9e\x9f\x46\xeb\x41\xeb\xb3\xd1\xfa\x42\xb4\xbe\x1c\xad\xaf\x41\xeb\x9b\xd0\xfa\x0e\xb4\xbe\x0f\xad\x1f\x46\xeb\x27\xd1\xfa\x05\x34\x9a\x89\x46\xf3\xd1\x68\x29\x1a\xad\x46\xa3\x8d\x68\xb4\x1d\x8d\xf6\xa2\xd1\x21\x34\x3a\x81\x46\xe7\xd0\x0b\xe9\xe8\x85\x5c\xf4\x42\x31\x7a\xa1\x12\xbd\x50\x87\x5e\x68\x41\x2f\x74\xa1\x17\x06\xd0\x0b\xa3\xe8\x85\x29\xf4\xc2\x02\xda\x90\x89\x36\xe4\xa3\x0d\xa5\x68\x43\x02\x6d\x68\x44\x1b\x3a\xd0\x86\x3e\xb4\x61\x18\x6d\x48\xa1\x0d\xf3\xe8\xef\x99\xe8\xef\xf9\x68\xac\x06\x8d\x35\xa1\x17\x2b\xd0\x8b\xb5\xe8\xc5\x66\xf4\x62\x27\x7a\xb1\x1f\xbd\x38\x82\x5e\x9c\x42\x2f\x81\x5e\xca\x42\x2f\x15\xa0\x97\xca\xd0\x4b\x35\xe8\xa5\x26\xf4\x52\x07\x7a\xa9\x0f\xbd\x34\x8c\x5e\x4a\xa1\x97\xe6\xd0\xcb\xe9\xe8\xe5\x5c\xf4\x72\x31\x7a\xb9\x12\xbd\x5c\x87\x5e\x6e\x41\x2f\x77\xa1\x97\x07\xd0\xcb\xa3\xe8\xe5\x29\xf4\xf2\x02\x1a\xcf\x42\xe3\x85\x68\xbc\x1c\x8d\xd7\xa0\xf1\x26\x34\xde\x81\xc6\xfb\xd0\xf8\x30\x1a\x4f\xa1\xf1\x39\xb4\x31\x1d\x6d\xcc\x45\x1b\x8b\xd1\xc6\x4a\xb4\xb1\x0e\x6d\x6c\x41\x1b\xbb\xd1\xc6\x24\xda\x38\x86\x5e\xcd\x42\xaf\x16\xa0\x57\xcb\xd0\xab\x09\xf4\x6a\x23\x7a\xb5\x03\xbd\xda\x8f\x5e\x1d\x41\x13\xa3\x68\x62\x0a\x6d\x02\x6d\xca\x42\x9b\x0a\xd0\xa6\x32\xb4\x29\x81\x36\x35\xa2\x4d\xed\x68\x53\x2f\xda\x34\x84\x36\x4d\xa0\x4d\xb3\x68\x73\x1a\xda\x9c\x83\x36\x17\xa3\xcd\x55\x68\x73\x3d\xda\xdc\x8a\x36\x77\xa3\xcd\x49\xb4\x79\x0c\x6d\x9e\x46\x29\x50\x2a\x0b\xa5\x0a\x50\xaa\x0c\xa5\x12\x28\xd5\x88\x52\x1d\x28\xd5\x87\x52\xc3\x28\x95\x42\xa9\x39\xf4\x7a\x3a\x7a\x3d\x17\xbd\x5e\x8c\x5e\xaf\x42\x6f\xd4\xa1\x37\x5a\xd0\x1b\x5d\xe8\x8d\x01\xf4\xc6\x28\x7a\x63\x0a\xbd\xb1\x80\xb6\x64\xa2\x2d\xf9\x68\x4b\x29\xda\x92\x40\x5b\x1a\xd1\x96\x76\xb4\xa5\x17\x6d\x19\x42\x5b\x52\x68\xcb\x1c\x9a\x4c\x47\x93\xb9\x68\xb2\x18\x4d\x56\xa2\xc9\x3a\x34\xd9\x82\x26\xbb\xd0\x64\x12\x4d\x8e\xa1\xc9\x69\xb4\x15\xb4\x35\x0b\x6d\x2d\x40\x5b\xcb\xd0\xd6\x1a\xb4\xb5\x09\x6d\xed\x44\x5b\xfb\xd1\xd6\x11\xb4\x75\x12\x6d\x9d\x47\x6f\x66\xa2\x37\xf3\xd1\x9b\xa5\xe8\xcd\x04\x7a\xb3\x09\xbd\xd9\x81\xde\xec\x43\x6f\x0e\xa3\x37\x53\xe8\xcd\x79\xf4\x56\x06\x7a\x2b\x0f\xbd\x55\x82\xde\xaa\x42\x6f\xd5\xa3\xa9\x29\x34\xb5\x80\xb6\x65\xa2\x6d\xf9\x68\x5b\x19\xda\x96\x40\xdb\x1a\xd1\xb6\x6e\xb4\x3d\x0d\x6d\xcf\x41\xdb\x8b\xd0\xf6\x0a\xb4\xbd\x16\x6d\x6f\x41\xdb\x77\x76\x49\xb4\x7d\x0c\x6d\x9f\x46\xd3\x81\xa6\xb3\xd1\x74\x21\x9a\x2e\x47\xef\xf4\xa1\x77\x86\xd1\x3b\x29\xf4\xce\x1c\xda\x91\x8e\x76\xe4\xa2\x1d\xc5\x68\x47\x25\xda\x51\x87\x76\xb4\xa0\x1d\x5d\x68\xc7\x00\xda\x31\x8a\x76\x4c\xa1\x1d\x0b\xe8\xdd\x4c\xf4\x6e\x3e\x7a\xb7\x14\xbd\x5b\x8d\xde\x6d\x40\xef\xb6\xa1\x77\x7b\xd1\xbb\xc3\xe8\xdd\x14\x7a\x77\x0e\xcd\xa4\xa3\x99\x5c\x34\x53\x8c\x66\x2a\xd1\x4c\x03\x7a\x6f\x1a\xbd\x0f\x7a\x3f\x1b\xbd\x5f\x88\xde\xaf\x40\xef\xd7\xa2\xf7\x9b\xd1\x07\x49\xf4\x61\x21\xfa\xb0\x1c\x7d\x58\x83\x3e\x6c\x42\x1f\x76\xa0\x0f\xfb\xd0\x87\xc3\xe8\xc3\x14\xfa\x70\x0e\xfd\x23\x1d\xfd\x23\x17\xfd\xa3\x18\xfd\xa3\x12\xfd\xa3\x0e\xfd\x63\x14\x7d\x54\x88\x3e\x6a\x47\x73\x81\xe6\xb2\xd1\xdc\x28\x9a\x9b\x42\x73\x0b\xe8\xe3\x2e\xf4\xf1\x00\xfa\x78\x14\x7d\x3c\x85\x3e\x5e\x40\xff\xdb\x8f\xfe\x77\x04\xfd\xef\x24\xfa\xdf\x05\xf4\x49\x16\xfa\xa4\x00\x7d\x52\x86\x3e\x49\xa0\x4f\x1a\xd1\x27\xed\xe8\x93\x7e\x34\xdf\x83\xe6\x07\xd1\xfc\x38\x9a\x9f\x41\x9f\xa6\xa1\x4f\x73\xd0\xa7\x45\xe8\xd3\x0a\xf4\x69\x2d\xfa\xb4\x19\x7d\xda\x89\x3e\xed\x47\xff\x1c\x46\xff\x4c\xa1\x7f\x2e\xa0\xcf\x32\xd1\x67\xf9\xe8\xb3\x52\xf4\x59\x35\xfa\xac\x01\x7d\xd6\x86\x3e\xeb\x45\x9f\x0d\xa3\xcf\x52\x68\x21\x13\x2d\xe4\xa3\x85\x32\xb4\x90\x40\x0b\x8d\xe8\x5f\x59\xe8\x5f\x05\xe8\x5f\x65\xe8\x5f\x09\xf4\xaf\x9d\xac\x1b\xfd\x2b\x89\x3e\xaf\x44\x9f\xd7\xa1\xcf\x5b\xd0\xe7\x5d\xe8\x8b\x5c\xf4\x45\x09\xfa\xa2\x0a\x7d\x51\x8f\xbe\x68\x43\x5f\xf4\xa0\x2f\x06\xd1\x17\xe3\xe8\x8b\x19\x4c\x60\x3a\x31\xfd\x98\x11\xcc\x24\x66\x1e\xef\x92\x81\x77\xc9\xc3\xbb\x94\xe0\x5d\xaa\xf0\x2e\xf5\x78\x97\x56\xbc\x4b\x37\xde\x25\x89\x77\x19\xc3\xbb\x4c\xe3\x2f\xf5\xe0\x2f\x0d\xe2\x2f\x8d\xe3\x2f\xcd\xe0\x2f\x07\xfe\x72\x36\xfe\x72\x11\xfe\x72\x05\xfe\x72\x1d\x8e\x74\x1c\xb9\x38\x4a\x70\x54\xe1\xa8\xc7\xd1\x8a\xa3\x1b\x47\x12\xab\x01\xbb\x02\x7f\xa5\x1a\x7f\xa5\x01\x7f\xa5\x0d\x7f\xa5\x17\x7f\x65\x08\x7f\x65\x02\x7f\x65\x16\xa7\xa5\xe1\xb4\x1c\x9c\x56\x84\xd3\x2a\x71\x5a\x1d\x4e\x6b\xc5\x69\xdd\x38\x2d\x89\xd3\xc6\x71\xda\x0c\xde\x35\x0d\xef\x9a\x83\x77\xcb\xc2\xbb\x15\xe0\xdd\xca\xf0\x6e\x09\xbc\x5b\x23\xde\xad\x1d\x7f\xb5\x1a\x7f\xb5\x01\x7f\xb5\x0d\x7f\xb5\x07\x7f\x75\x10\xa7\x37\xe1\xf4\x0e\xbc\x7b\x2f\xde\x7d\x18\xef\x9e\xc2\xbb\xcf\xe1\x3d\xd2\xf1\x1e\xb9\x78\x8f\x62\xbc\x47\x25\xde\xa3\x0e\xef\xd1\x82\xf7\xe8\xc2\x7b\x0c\xe0\x3d\x46\xf1\x1e\x53\x78\x8f\x05\xbc\x67\x26\xde\x33\x1f\xef\x59\x86\xf7\x4c\xe0\x3d\x1b\xf1\x9e\xed\x78\xcf\x5e\xbc\xe7\x10\xde\x73\x02\xef\x39\x8b\x33\xd2\x70\x46\x0e\xce\x28\xc6\x19\xdd\x38\x23\x89\xf7\x2a\xc6\x7b\x55\xe2\xbd\xea\xf0\x5e\x2d\x78\xaf\x2e\xbc\x77\x35\xde\xbb\x11\xef\xdd\x8e\xff\xad\x1c\x67\xe6\xe1\xcc\x12\x9c\x59\x85\x33\xeb\x71\x66\x2b\xde\xa7\x09\xef\xd3\x81\xf7\xe9\xc3\xfb\xd6\xe1\x7d\x5b\xf0\xbe\x5d\x78\xdf\x01\xfc\xb5\x2c\xfc\xb5\x02\xfc\xb5\x2e\xfc\xb5\x01\x9c\x55\x82\xb3\x26\x71\xd6\x3c\xde\x2f\x03\xef\x97\x8f\xf7\x2b\xc5\xfb\x4d\xe2\xaf\xd7\xe3\x6f\x24\xf0\x37\x9a\x70\x76\x3e\xde\x7f\xa7\x4a\xf1\xfe\xd5\x78\xff\x06\xbc\xff\x0c\x3e\x20\x1d\x1f\xd0\x85\x0f\x18\xc0\xff\x9e\xc4\x39\x1d\xf8\xc0\x3a\xfc\x1f\xe5\xf8\x3f\x6a\xf0\x41\xe0\x83\xb2\xf0\x41\xa3\xf8\xa0\x39\x9c\x9b\x81\x73\xf3\x70\x6e\x09\xce\xad\xc6\xb9\x0d\x38\xb7\x0d\xe7\xf6\xe1\xdc\x11\x9c\x3b\x89\xbf\x99\x87\xbf\xd9\x8d\x0f\x06\x1f\x9c\x85\x0f\x2e\xc0\x07\x0f\xe2\x83\xc7\xf1\xc1\x33\xf8\x90\xc0\x87\x64\xe3\x43\x0a\xf1\x21\x15\xf8\x90\x5a\x7c\x48\x33\x3e\xa4\x13\x1f\xd2\x8f\x0f\x19\xc1\x87\x4c\xe2\x43\xe6\x71\x5e\x06\xce\xcb\xc3\x79\x25\x38\xaf\x0a\xe7\xd5\xe3\xbc\x36\x9c\xd7\x83\xf3\x86\x70\xde\x04\xce\x9b\xc5\xdf\x1a\xc4\xdf\x1a\xc7\xdf\x9e\xc4\xdf\x9e\xc7\xdf\xc9\xc0\xdf\xc9\xc3\xdf\x29\xc1\xdf\xa9\xc2\xdf\xa9\xc7\xdf\x69\xc5\xf9\x09\x9c\xdf\x88\xf3\xdb\x71\x7e\x2f\xce\x1f\xc6\xf9\x29\x9c\x3f\x8f\x0f\xcd\xc4\x87\x16\xe0\x43\xcb\xf1\xa1\xb5\xf8\xd0\x66\x7c\x68\x27\x3e\xb4\x1f\x1f\x3a\x82\xbf\x1b\xf8\xbb\xcd\xf8\x7b\x69\xf8\x7b\xc5\xf8\x7b\x6d\xf8\x7b\x3d\xf8\x7b\x83\xb8\x20\x03\x17\xe4\xe1\x82\x52\x5c\x50\x8d\x0b\x1a\x70\x41\x1b\x2e\xe8\xc1\x05\x3b\xfb\x71\x5c\x30\x83\xbf\x1f\xf8\xfb\x39\xf8\xfb\x45\xf8\xfb\x15\xf8\xfb\xb5\xf8\xfb\xcd\xf8\xfb\x9d\xf8\xfb\xfd\xf8\x07\x25\xf8\x07\x55\xf8\x07\xf5\xf8\x07\xad\xf8\x07\xdd\xf8\x07\x49\xfc\x83\x31\xfc\x83\x19\x7c\x58\xe0\xc3\xb2\xf1\x61\x85\xf8\xb0\x72\x7c\x58\x0d\x3e\xac\x09\x1f\xd6\x81\x0f\xeb\xc3\x87\x0d\xe3\xc3\x52\xf8\xb0\x39\x5c\x98\x8e\x0b\x93\xb8\x70\x0c\x17\x4e\xe3\xc3\xc1\x87\x67\xe1\xc3\x0b\xf0\xe1\x65\xf8\xf0\x04\x3e\xbc\x11\x1f\xde\x81\x0f\xef\xc3\x87\x0f\xe3\xc3\x53\xf8\xf0\x39\x7c\x44\x3a\x3e\x22\x17\x1f\x51\x8c\x8f\xa8\xc4\x47\xd4\xe1\x23\x5a\xf0\x11\x5d\xf8\x88\x24\x3e\x62\x1c\x1f\x31\x83\x8f\x0c\x7c\x64\x0e\x3e\xb2\x08\x1f\x59\x81\x8f\xac\xc5\x47\x36\xe3\x23\x3b\xf1\x91\xfd\xf8\xc8\x11\x7c\xe4\x24\x3e\x72\x1e\x17\x65\xe0\xa2\x3c\x5c\x54\x82\x8b\xaa\x70\x51\x3d\x2e\x6a\xc5\x45\xdd\xb8\x28\x89\x8b\xc6\x70\xd1\x34\x3e\x0a\x7c\x54\x16\x3e\xaa\x00\x1f\x55\x86\x8f\x4a\xe0\xa3\x1a\xf1\x51\xed\xf8\xa8\x5e\x7c\xd4\x10\x3e\x6a\x12\x1f\x35\x8f\x8f\xce\xc0\x47\xe7\xe1\xa3\xcb\xf1\xd1\x35\xf8\xe8\x26\x7c\x74\x07\x3e\xba\x0f\x1f\x3d\x82\x8f\x9e\xc2\xc7\x04\x3e\x26\x1b\x1f\x53\x88\x8f\x29\xc7\xc7\xd4\xe0\x63\x9a\xf0\x31\x9d\xf8\x98\x7e\x7c\xcc\x08\x3e\x66\x12\x1f\x33\x8f\x8b\x33\x71\x71\x3e\x2e\x2e\xc5\xc5\xd5\xb8\xb8\x11\x17\xb7\xe3\xe2\x5e\x5c\x3c\x84\x8b\x27\x70\xf1\x2c\xfe\x61\x1a\xfe\x61\x3e\xfe\x61\x25\xfe\x61\x1d\xfe\x61\x0b\x3e\x36\x17\x1f\x5b\x8c\x8f\xad\xc4\xc7\xd6\xe1\x63\x77\xb2\x2e\x7c\xec\x00\x3e\x76\x14\x1f\x3b\x8d\x8f\x03\x1f\x97\x85\x8f\x2b\xc0\xc7\x95\xe1\xe3\x12\xf8\xb8\x46\x7c\x5c\x3b\x3e\xae\x17\x1f\x37\x84\x8f\x9b\xc2\xc7\x2d\xe0\x92\x2c\x5c\x52\x80\x4b\xca\x70\x49\x02\x97\x34\xe2\x92\x76\x5c\xd2\x8b\x4b\x86\x70\xc9\x04\x2e\x99\xc5\xc7\xa7\xe1\xe3\x73\xf0\xf1\x45\xf8\xf8\x0a\x7c\x7c\x2d\x3e\xbe\x19\x1f\xdf\x89\x8f\xef\xc7\xc7\x8f\xe2\xe3\xa7\xf0\xf1\x0b\xf8\x84\x4c\x7c\x42\x3e\x3e\xa1\x14\x9f\x50\x8d\x4f\x68\xc0\x27\xb4\xe1\x13\x7a\xf0\x09\x83\xf8\x84\x71\x7c\xc2\x0c\x5e\x14\x78\x51\x36\x5e\x54\x88\x17\x95\xe3\x45\x35\x78\x51\x13\x5e\xd4\x89\x17\xf5\xe3\x45\x23\x78\xd1\x24\x5e\x34\x8f\x4b\x33\x70\x69\x1e\x2e\x2d\xc1\xa5\x55\xb8\xb4\x1e\x97\xb6\xe2\xd2\x6e\x5c\x3a\x8a\x4b\xa7\xf0\x89\xe0\x13\xb3\xf0\x89\x05\xf8\xc4\x32\x7c\x62\x02\x9f\xd8\x88\x4f\x6c\xc7\x27\xf6\xe2\x13\x87\xf0\x49\x3b\x95\xc2\x27\xcd\xe1\x93\xd3\xf1\xc9\xb9\xf8\xe4\x62\x7c\x72\x15\x3e\xb9\x01\x9f\xdc\x86\xcb\x7a\x70\xd9\x20\x2e\x1b\xc7\x65\x33\x78\x71\xe0\xc5\x39\x78\x71\x11\x5e\x5c\x81\x17\xd7\xe2\xc5\xcd\x78\x71\x17\x5e\x3c\x84\x17\x4f\xe0\xc5\xb3\x78\x49\x1a\x5e\x92\x8b\x97\x94\xe2\x25\xd5\x78\x49\x03\x5e\xd2\x86\x97\xf4\xe0\x25\x43\x78\xc9\x04\x5e\x32\x8b\x97\xa6\xe1\xa5\x39\x78\x69\x11\x5e\x5a\x81\x97\xd6\xe2\xa5\xcd\x78\x69\x27\x5e\xda\x8f\x97\x8e\xe0\xa5\x93\x78\xe9\x3c\x2e\xcf\xc0\xe5\x79\xb8\xbc\x04\x97\x57\xe3\xf2\x06\x5c\xde\x86\xcb\x7b\x70\xf9\x20\x2e\x1f\xc7\xe5\x33\x78\x59\xe0\x65\xd9\x78\x59\x21\x5e\x56\x81\x97\xd5\xe2\x65\xcd\x78\x59\x27\x5e\x36\x88\x97\x8d\xe3\x65\x73\xf8\x94\x74\x7c\x4a\x2e\x3e\xa5\x18\x9f\x52\x85\x4f\x69\xc0\xa7\xb4\xe1\x53\x7a\xf0\x29\x83\xf8\x94\x49\x7c\x6a\x3a\x3e\x35\x0f\x9f\x5a\x82\x4f\xad\xc2\xa7\xd6\xe3\x53\xdb\xf0\xa9\x3d\xf8\xd4\x41\x7c\xea\x38\x3e\x75\x1e\x57\x64\xe0\x8a\x3c\x5c\x51\x82\x2b\xaa\x71\x45\x03\xae\x68\xc7\x15\xbd\xb8\x62\x08\x57\x4c\xe0\x8a\x59\x7c\x5a\x06\x3e\x2d\x0f\x9f\x56\x82\x4f\xab\xc2\xa7\xd5\xe3\xd3\x5a\xf1\x69\xdd\xf8\xb4\x24\x3e\x6d\x1c\x9f\x36\x83\x4f\x0f\x7c\x7a\x36\x3e\xbd\x10\x9f\x5e\x8e\x4f\xaf\xc1\xa7\x37\xe1\xd3\xfb\xf0\x19\xc3\xf8\x8c\x14\x3e\x63\x0e\x57\xa6\xe3\xca\x5c\x5c\x59\x8c\x2b\xab\xf0\x8f\xba\xf1\x8f\x92\xf8\x47\x63\xf8\x47\xb3\x78\x79\x1a\x5e\x9e\x83\x97\x17\xe1\xe5\x15\x78\x79\x2d\x5e\xde\x8c\x97\x77\xe1\xe5\x03\x78\xf9\x28\x5e\x3e\x8b\x57\xa4\xe1\x15\x79\x78\x45\x09\x5e\x51\x85\x57\xd4\xe3\x15\xed\x78\x45\x2f\x5e\x31\x8c\x57\xa4\xf0\x8a\x39\x5c\x95\x81\xab\xf2\x71\x55\x29\xae\xaa\xc6\x55\x4d\xb8\xaa\x13\x57\xf5\xe3\xb3\x2a\xf0\x59\x13\xf8\xec\x22\x7c\x76\x33\xae\xce\xc4\xd5\xf9\xb8\x7a\x0c\x57\x4f\xe3\x73\xc0\xe7\x8c\xe3\x44\x26\x4e\x94\xe2\x44\x1f\x4e\x0c\xe3\x95\x69\x78\x65\x0e\x5e\xd9\x84\xcf\x4b\xc7\xe7\xcd\xe0\xf3\xc7\x71\x4d\x33\xae\xe9\xc4\x35\xfd\xf8\x82\x4c\x7c\x41\x23\xbe\x60\x02\x5f\x58\x86\x2f\x9c\xc2\x17\x05\xbe\x68\x14\x5f\xb4\x33\x2f\xe0\xda\x51\x5c\x3b\x85\x2f\xee\xc3\x17\x0f\xe3\x55\x59\x78\x55\x33\x5e\x35\x81\x2f\x29\xc3\x97\x0c\xe2\xba\x52\x5c\x57\x8d\xeb\x1a\x70\x5d\x1b\xbe\xb4\x08\x5f\x5a\x81\x2f\xad\xc5\x97\x36\xe3\x4b\x3b\xf1\xa5\xfd\xf8\xd2\x31\x7c\xe9\x34\x5e\x0d\x5e\x9d\x85\x57\x17\xe0\xd5\x15\x78\x75\x2d\x5e\xdd\x8c\x57\x77\xe2\xd5\xfd\x78\xf5\x08\x5e\x3d\x89\x57\xcf\xe3\xcb\x9a\xf1\x65\x9d\xf8\xb2\x7e\x5c\x5f\x8d\xeb\x9b\x70\x7d\x07\xae\xef\xc3\xf5\xc3\xb8\x3e\x85\xeb\xe7\xf0\xe5\xe9\xf8\xf2\x5c\x7c\xf9\x38\xbe\x7c\x06\x5f\x11\xf8\x8a\x6c\x7c\x45\x21\xbe\xa2\x1c\x5f\x51\x83\xaf\xcc\xc1\x57\x16\xe1\x2b\x67\x70\x43\xe0\x86\x6c\xdc\x50\x8c\x1b\x2a\x71\x43\x1d\x6e\x68\xc5\x0d\xdd\xb8\x21\x89\xaf\xaa\xc5\x57\xb5\xe2\xab\xba\xf1\x55\x3b\xef\x31\x7c\xd5\x34\xbe\x1a\x7c\x75\x36\xbe\xba\x10\x5f\x5d\x8e\xaf\xae\xc5\x57\x37\xe3\xab\x3b\xf1\xd5\xfd\xf8\xea\x51\x7c\xf5\x14\xbe\x06\x7c\x4d\x0e\xbe\xa6\x08\x5f\x53\x89\xaf\xa9\xc3\xd7\xb4\xe0\x6b\xba\xf0\x35\x03\xb8\x71\x12\x5f\xbb\x80\xaf\xcb\xc4\xd7\xe5\xe3\xeb\x4a\xf1\x75\x09\x7c\x5d\x23\xbe\xae\x1d\x5f\xd7\x8b\xaf\x1b\xc2\xd7\x4d\xe2\xeb\xe6\xf1\xf5\x19\xf8\xfa\x3c\x7c\x7d\x09\xbe\xbe\x0a\x5f\x5f\x8f\xaf\x6f\xc5\xd7\x77\xe3\xeb\x93\xf8\xfa\x31\x7c\xfd\x34\x6e\x02\x37\x65\xe1\xa6\x02\xdc\x54\x86\x9b\x12\xb8\xa9\x11\x37\xb5\xe3\xa6\x5e\xdc\x34\x84\x9b\x26\x70\xd3\x2c\x5e\x93\x86\xd7\x94\xe2\x35\xfd\xf8\x86\x3c\x7c\x43\x09\xbe\x61\x04\xdf\x58\x83\x6f\x9c\xc5\xcd\x69\xb8\xb9\x15\x37\x77\xe3\xe6\x24\xbe\xa9\x17\xff\x34\x0f\xff\xb4\x0e\xff\xb4\x05\xff\xb4\x0b\xff\x74\x00\xff\x74\x14\xff\x74\x0a\xb7\x80\x5b\xb2\x70\x4b\x01\x6e\x29\xc3\x2d\x09\xdc\xd2\x88\x5b\xda\x71\x4b\x2f\x6e\x19\xc2\x2d\x29\xdc\x32\x87\x6f\x4e\xc7\x37\xe7\xe2\x9b\x4b\xf0\xcd\x55\xf8\xe6\x7a\x7c\x73\x2b\xbe\xb9\x1b\xdf\x9c\xc4\x37\x8f\xe3\x9b\x67\xf0\x2d\x81\x6f\xc9\xc6\xb7\x14\xe2\x5b\x2a\xf1\x2d\x75\xf8\x96\x16\x7c\x4b\x17\xbe\x35\x81\x6f\x6d\xc4\xb7\xb6\xe3\x5b\x7b\xf1\xad\x43\xf8\xd6\x09\x7c\xeb\x2c\x6e\x4d\xc3\xad\xb9\xb8\xb5\x18\xb7\x56\xe2\xd6\x3a\xdc\xda\x82\x5b\xbb\x70\x6b\x12\xb7\x8e\xe1\xd6\x69\xfc\x33\xf0\xcf\xb2\xf0\xcf\x0a\xf0\xcf\xca\xf0\xcf\x12\xf8\x67\x8d\xf8\xe7\x2d\xf8\xe7\x5d\xf8\x3f\x5b\x71\x5b\x35\x6e\x6b\xc6\x6d\x5d\xb8\x6d\x00\xff\xa2\x09\xff\xb2\x1d\xff\xb2\x17\xff\x72\x08\xff\x72\x02\xff\x72\x16\xdf\x96\x86\x6f\xcb\xc1\xb7\x15\xe1\xdb\x2a\xf0\x6d\xb5\xf8\xb6\x66\x7c\x5b\x27\xbe\xad\x1f\xdf\x36\x86\x6f\x9b\xc1\xed\x81\xdb\xb3\x71\x7b\x21\x6e\x2f\xc7\xed\x35\xb8\xbd\x09\xb7\x77\xe0\xf6\x3e\xdc\x3e\x8c\xdb\x53\xb8\x7d\x0e\xdf\x9e\x8e\x6f\xcf\xc5\xb7\x97\xe0\xdb\xab\xf0\xed\xf5\xf8\xf6\x56\x7c\x7b\x37\xbe\x3d\x89\x6f\x1f\xc3\xb7\x4f\xe3\x5f\x05\xfe\x55\x36\xfe\x55\x21\xfe\x55\x39\xfe\x55\x0d\xfe\x55\x13\xfe\x55\x07\xfe\x75\x3a\xfe\x75\x2e\xbe\xa3\x1a\xdf\xd1\x80\xef\x68\xc3\x77\xf4\xe0\x3b\x06\xf1\x1d\xe3\xf8\x8e\x19\x7c\x67\x35\xbe\xb3\x11\xdf\xd9\x8e\xef\xec\xc5\x77\x0e\xe1\x3b\x27\xf0\x9d\xb3\xb8\x33\x0d\x77\xe6\xe0\xce\x69\xfc\x9b\x12\xfc\x9b\x0e\xfc\x5b\xf0\x6f\xb3\xf0\x6f\x0b\xf0\x6f\xcb\xf0\x6f\x13\xf8\xb7\x8d\xf8\xb7\xed\xf8\x77\xa5\xf8\x77\xd5\xf8\x77\x0d\xf8\x77\x6d\xf8\x77\x0b\xb8\x2b\x13\x77\xe5\xe3\xae\x52\xdc\x35\x8d\xef\x6a\xc1\x77\x75\xe1\xbb\x06\xf0\xdd\x69\xf8\xee\x66\x7c\x77\x27\xbe\x7b\x1e\xff\x3e\x89\x7f\x3f\x86\x7f\x3f\x8d\xbb\x5b\x70\x77\x17\xee\x4e\xe2\xee\x31\xdc\x3d\x8d\xef\xe9\xc4\xf7\xf4\xe3\x7b\x46\xf0\x3d\x93\xf8\x9e\x79\x7c\x6f\x06\xbe\x37\x0f\xdf\x5b\x82\xef\xad\xc2\xf7\xd6\xe3\x7b\x5b\xf1\xbd\xdd\xf8\xde\x24\xbe\x77\x1c\xdf\x3b\x83\xff\x10\xf8\x0f\xd9\xf8\x0f\x85\xb8\x27\x1b\xf7\xec\xf4\x72\xdc\x53\x83\x7b\x9a\x70\x4f\x07\xee\xe9\xc3\x3d\xc3\xb8\x27\x85\x7b\xe6\xf0\x1f\x03\xff\x31\x07\xff\xb1\x08\xff\xb1\x02\xff\x69\xa7\x6a\xf1\x9f\x9a\x71\x6f\x1b\xee\xed\xc1\xbd\x83\xb8\x77\x1c\xf7\xce\xe0\xfb\x02\xdf\x97\x8d\xef\x2b\xc4\xf7\x95\xe3\xfb\x6a\xf0\x7d\x4d\xf8\xbe\x0e\x7c\x5f\x1f\xbe\x6f\x18\xdf\xb7\x80\xff\x5c\x86\xff\x9c\xc0\x7f\x1e\xc5\x7f\x9e\xc2\x7f\x5e\xc0\xff\x3d\x89\xfb\x7a\x70\xdf\x20\xee\x9b\xc0\x7d\x73\xf8\xfe\x2c\x7c\x7f\x31\xbe\x3f\x81\xef\x6f\xc5\xf7\xf7\xe2\xfb\x47\xf1\xff\x14\xe0\xff\x29\xc3\x7f\xc9\xc1\x7f\x29\xc2\xfd\x99\xb8\x7f\x1c\xff\x75\x12\xff\x75\x1e\x3f\x90\x81\x1f\xc8\xc3\x0f\x94\xe0\x07\xaa\xf0\x03\xf5\xf8\x81\x56\xfc\x40\x37\x7e\x20\x89\x1f\x18\xc3\x0f\x4c\xe3\x07\x0b\xf1\x83\xe5\xf8\xc1\x5a\xfc\x60\x33\x7e\xb0\x13\x3f\xd8\x8f\x1f\x1c\xc1\x0f\x4e\xe2\x07\x17\xf0\x40\x26\x1e\xc8\xc7\x03\xa5\x78\xa0\x1a\x0f\x34\xe0\x81\x36\x3c\xd0\x83\x07\x06\xf1\xc0\x38\x1e\x98\xc1\x0f\x05\x7e\x28\x1b\x3f\x54\x88\x1f\x2a\xc7\x0f\xd5\xe0\x87\x9a\xf0\x43\x1d\xf8\xa1\x3e\xfc\xd0\x30\x7e\x28\x85\x1f\x9a\xc3\x0f\xa7\xe3\x87\x73\xf1\xc3\xc5\xf8\x91\x2c\xfc\x48\x01\x7e\xa4\x0c\x3f\x92\xc0\x8f\x34\xe2\x47\xda\xf1\x23\xbd\xf8\x91\x21\xfc\xc8\x04\x7e\x64\x16\x27\xd3\x70\x32\x07\x27\x8b\x70\xb2\x12\x27\xeb\x70\xb2\x05\x27\xbb\x70\x72\x00\x27\x47\x71\x72\x0a\x27\x17\xf0\xa3\x99\xf8\xd1\x7c\xfc\x68\x29\x7e\xb4\x1a\x3f\xda\x80\x1f\x6d\xc7\x8f\xf6\xe2\xc7\x6a\xf0\x63\x4d\xf8\xb1\x0e\xfc\x58\x1f\x7e\x6c\x04\x3f\x36\x85\x1f\x5b\xc0\x6b\x33\xf1\xda\x7c\xbc\xb6\x0c\xaf\x4d\xe0\xb5\x8d\x78\x6d\x07\x5e\xdb\x8f\xd7\x8e\xe2\xb5\x53\x78\xed\x02\x1e\xcc\xc4\x83\xf9\x78\x30\x89\x07\x17\xf0\xe3\x03\xf8\xf1\x51\xfc\xf8\x14\xfe\x5b\x0b\xfe\x5b\x17\xfe\xdb\x00\xfe\xdb\x28\xfe\xdb\x4e\xb6\x80\x9f\xc8\xc2\x4f\x14\xe0\x27\xca\xf0\x13\x09\xfc\x44\x23\x7e\xa2\x1d\x3f\xd1\x8b\x9f\x18\xc2\x4f\x4c\xe0\x27\x66\xf1\x50\x1a\x1e\xca\xc1\x43\x45\x78\xa8\x02\x0f\xd5\xe2\x27\x8b\xf0\x93\x15\xf8\xc9\x9d\xb9\x19\x3f\xd9\x89\x9f\xec\xc7\x4f\x8e\xe0\x27\x27\xf1\x93\xf3\xf8\xa9\x0c\xfc\x54\x1e\x7e\xaa\x04\x3f\x55\x85\x9f\xaa\xc7\x4f\xb5\xe2\xa7\xba\xf1\x53\x49\xfc\xd4\x18\x7e\x6a\x1a\xaf\x0b\xbc\x2e\x1b\xaf\x2b\xc4\xeb\xca\xf1\xba\x1a\xbc\xae\x09\xaf\xeb\xc0\xeb\xfa\xf0\xba\x61\xbc\x2e\x85\xd7\xcd\xe1\xe1\x74\x3c\x9c\x8b\x87\x8b\xf1\x70\x25\x1e\xae\xc3\xc3\x2d\x78\xb8\x0b\x0f\x0f\xe0\xe1\x51\x3c\x3c\x85\x87\x17\xf0\xd3\x99\xf8\xe9\x7c\xfc\x74\x19\x7e\x3a\x81\x9f\x6e\xc4\x4f\xb7\xe3\xa7\x7b\xf1\xd3\x43\xf8\xe9\x09\xfc\xf4\x2c\x7e\x26\x0d\x3f\x93\x83\x9f\x29\xc2\xcf\x54\xe2\x67\xea\xf0\x33\x2d\xf8\x99\x2e\xfc\xcc\x00\x7e\x66\x0c\x3f\x33\x8d\x9f\x05\x3f\x9b\x85\x9f\x2d\xc0\xcf\x96\xe1\x67\x13\xf8\xd9\x46\xfc\x6c\x3b\x7e\xb6\x17\x3f\x3b\x84\x9f\x9d\xc0\xcf\xce\xe1\x91\x74\x3c\x92\x8b\x47\x8a\xf1\x48\x25\x1e\xa9\xc3\x23\x2d\x78\xa4\x0b\x8f\x0c\xe0\x91\x51\x3c\x32\x8d\x9f\x03\x3f\x97\x85\x9f\x2b\xc0\xcf\x95\xe1\xe7\x12\xf8\xb9\x46\xfc\x5c\x3b\x7e\xae\x17\x3f\x37\x84\x9f\xef\xc1\xcf\x0f\xe2\xe7\xc7\xf1\xf3\x33\x78\x7d\xe0\xf5\x39\x78\x7d\x11\x5e\x5f\x81\xd7\xd7\xe2\xf5\xcd\x78\x7d\x27\x5e\xdf\x8f\xd7\x8f\xe0\xf5\x93\x78\xfd\x3c\x1e\xcd\xc0\xa3\x79\x78\xb4\x04\x8f\x56\xe1\xd1\x7a\x3c\xda\x8a\x47\xbb\xf1\x68\x12\x8f\x4e\xe0\xd1\x59\xfc\x42\x1a\x7e\x21\x07\xbf\x50\x84\x5f\xa8\xc0\x2f\xd4\xe2\x0d\x35\x78\x43\x13\xde\xd0\x81\x37\xf4\xe1\x0d\xc3\x78\x43\x0a\x6f\x98\xc3\x7f\xcf\xc0\x7f\xcf\xc3\x7f\x2f\xc1\x7f\xaf\xc2\x63\xe5\x78\xac\x06\x8f\x35\xe3\xb1\x4e\x3c\xd6\x8f\xc7\x46\xf0\xd8\x24\x1e\x9b\xc7\x2f\x66\xe0\x17\xf3\xf0\x8b\x25\xf8\xc5\x2a\xfc\x52\x31\x7e\xa9\x12\xbf\x54\x87\x5f\x6a\xc1\x2f\x37\xe1\x97\x3b\xf0\xcb\x7d\xf8\xe5\x51\xfc\xf2\x14\x7e\x79\x01\x8f\x67\xe2\xf1\x02\x3c\x5e\x86\xc7\x13\x78\xbc\x09\x8f\x77\xe0\xf1\x3e\x3c\x3e\x8c\xc7\x53\x78\x7c\x0e\x6f\x4c\xc7\x1b\x73\xf1\xc6\x62\xbc\xb1\x12\x6f\xac\xc3\x1b\x5b\xf0\xc6\x2e\xbc\x71\x00\x6f\x1c\xc5\x1b\xa7\xf0\xc6\x05\xfc\x4a\x26\x7e\x25\x1f\xbf\x52\x8a\x5f\xa9\xc6\xaf\x34\xe0\x57\xda\xf0\x2b\x3d\xf8\x95\x21\xfc\xca\x04\x7e\x65\x16\xbf\x9a\x86\x5f\xcd\xc1\x13\xd9\x78\xa2\x10\x4f\x94\xe3\x89\x1a\x3c\xd1\x84\x27\x3a\xf0\x44\x1f\x9e\x18\xc6\x13\x93\xf8\xb5\x34\xfc\x5a\x0e\x7e\xad\x08\xbf\x56\x81\x5f\xab\xc3\xaf\xb5\xe0\xd7\xba\xf1\x6b\x49\xfc\xda\x18\xde\x34\x82\x37\x4d\xe2\x4d\xf3\x78\x73\x06\xde\x9c\x87\x37\x97\xe2\xcd\xd5\x78\x73\x03\xde\xdc\x86\x37\xf7\xe0\xcd\x83\x78\xf3\x38\xde\x3c\x83\x53\x81\x53\xd9\x38\x55\x88\x53\xe5\x38\x55\x83\x53\x4d\x38\xd5\x81\x53\x7d\x38\x35\x8c\x53\x29\x9c\x9a\xc3\xaf\xa7\xe3\xd7\x73\xf1\xeb\xc5\xf8\xf5\x4a\xfc\x7a\x1d\x7e\xbd\x05\xbf\xde\x85\x5f\x4f\xe2\xd7\xc7\xf0\xeb\xd3\xf8\x8d\xc0\x6f\x64\xe3\x2d\x79\x78\x4b\x29\xde\x52\x8d\xb7\x34\xe0\xc9\x7a\x3c\xd9\x8a\x27\xbb\xf1\x64\x12\x4f\x8e\xe3\xc9\x19\xbc\x35\xf0\xd6\x6c\xbc\xb5\x08\x6f\xad\xc0\x5b\x6b\xf1\xd6\x66\xbc\xb5\x0b\x6f\x1d\xc0\x5b\x47\xf1\xd6\x29\xbc\x75\x01\xbf\x99\x89\xdf\x2c\xc0\x6f\x96\xe3\x37\x6b\xf0\x9b\x4d\xf8\xcd\x0e\xfc\x66\x1f\x7e\xab\x1b\xbf\x35\x88\xdf\x1a\xc7\x6f\xcd\xe2\xa9\x34\x3c\x95\x83\xa7\x8a\xf0\x54\x05\x9e\xaa\xc5\x53\xcd\x78\xaa\x13\x4f\xf5\xe3\xa9\x11\x3c\x35\x89\xa7\xe6\xf1\xb6\x4c\xbc\x2d\x1f\x6f\x2b\xc3\xdb\x12\x78\x5b\x13\xde\xd6\x81\xb7\xf5\xe1\x6d\x23\x78\xdb\x24\xde\xb6\x80\xdf\xce\xc4\x6f\xe7\xe3\xb7\x4b\xf1\xdb\xd5\xf8\xed\x06\xfc\x76\x1b\x7e\xbb\x07\xbf\x3d\x88\xdf\x1e\xc7\x6f\xcf\xe0\xed\x81\xb7\x67\xe3\xed\x85\x78\x7b\x39\xde\x5e\x83\xb7\x37\xe1\xed\x1d\x78\x7b\x1f\xde\x3e\x8c\xb7\xa7\xf0\xf6\x79\x3c\x9d\x81\xa7\x8b\xf0\x74\x05\x9e\xae\xc3\xd3\x2d\x78\xba\x0b\x4f\x0f\xe0\xe9\x51\x3c\x3d\x85\xa7\x17\xf0\x3b\x99\xf8\x9d\x02\xfc\x4e\x19\x7e\x27\x81\xdf\x69\xc4\xef\xb4\xe3\x77\x7a\xf1\x3b\x43\xf8\x9d\x09\xfc\xce\x2c\xde\x91\x8e\x77\xe4\xe3\x1d\xa5\x78\x47\x35\xde\xd1\x80\x77\x74\xe0\x1d\x7d\xf8\xdd\x01\xfc\xee\x28\x7e\x77\x06\xcf\x04\x9e\xc9\xc6\xef\xb5\xe0\xf7\xba\xf0\x7b\x49\xfc\xde\x18\x7e\x6f\x1a\xbf\x0f\x7e\x3f\x0b\xbf\x5f\x80\xdf\x2f\xc3\xef\xd7\xe0\xf7\x9b\xf0\xfb\x1d\xf8\xfd\x3e\xfc\xfe\x30\x7e\x3f\x85\xdf\x9f\xc3\x1f\xa4\xe3\x0f\x72\xf1\x07\xc5\xf8\x83\x4a\xfc\x41\x1d\xfe\xa0\x05\x7f\xd0\x85\x3f\x18\xc0\xb3\xff\x3f\x8a\xe4\x38\x3e\x0f\xf1\xde\xff\xff\xab\xc4\xfd\x7e\x5f\x15\x13\x4e\x10\x76\x9b\x20\x25\xd5\xb4\x6e\x75\x23\xad\xbb\x7a\xb7\xa2\x32\xa2\xbb\xdb\x93\x56\x10\xeb\xdd\x36\x7e\xf2\x9d\xec\x08\xb2\x23\xc7\x09\x32\xcb\x2c\x76\xe2\x08\xe2\x2c\x9b\x9c\x9d\x6c\xc2\xc2\x82\xb0\xb0\x20\xc8\xc8\x26\x2c\xec\x66\x31\x41\x46\x46\x90\x92\x59\xb4\x29\xa9\x45\xfd\x1e\xfe\x78\x3d\x9e\xef\xeb\xfa\x0c\x12\x99\x19\x23\x32\x33\x43\xe4\x13\x13\xf9\x24\x9f\xc8\x27\xc5\x44\x3e\x49\x11\xf9\xa4\x9e\xc8\x27\xad\x44\x3e\xe9\x26\xf2\xc9\x10\x91\x4f\xc6\x89\x7c\x32\x4b\x64\x67\x36\x91\x9d\x05\x44\x76\x26\x89\xec\xac\x24\xb2\xb3\x8e\xc8\xce\x16\x22\x3b\xbb\x88\xec\x1c\x20\xb2\x73\x8c\xc8\xce\x19\x22\xbb\x4c\x64\x57\x3e\x91\x5d\x09\x22\xbb\xca\x89\xec\xaa\x21\xb2\xab\x89\xc8\xec\x14\x91\xdd\x10\xd9\x9d\x47\x64\x77\x8c\xc8\xee\x52\x22\xbb\xd3\x44\x76\xd7\x13\xd9\xdd\x4a\x64\x77\x37\x91\xcf\x72\x88\x7c\x56\x48\xe4\xb3\x12\x22\x9f\x55\x12\xf9\xac\x8e\xc8\x5c\x03\x91\xb9\x36\x22\x73\x3d\x44\xe6\x86\x88\xcc\x4d\x10\x99\x9b\x23\xb2\x27\x87\xc8\xe7\xa5\x44\x3e\x4f\x13\xf9\x67\x33\x91\x7f\x76\x13\xf9\xe7\x20\x91\x7f\x8e\x13\xf9\xe7\x2c\x91\xf9\x1c\x22\xf3\x45\x44\xe6\x4b\x88\xcc\xa7\x89\xcc\xd7\x13\x99\x6f\x25\x32\xdf\x43\x64\x7e\x88\xc8\xfc\x04\x91\xf9\x39\x22\x5f\xe4\x10\xf9\xa2\x88\xc8\x17\x25\x44\xbe\xa8\x24\xb2\x77\x8c\xc8\xde\x19\x22\x5f\x9a\xc8\x97\xf9\x44\xbe\x2c\x26\xf2\x65\x39\x91\x2f\x6b\x88\x7c\xd9\x4c\xe4\xcb\x4e\x22\x5f\x0e\x10\xf9\x72\x94\xc8\x97\xd3\x88\x6c\x44\x01\x5a\xd0\x83\x16\x0c\xa1\x05\xe3\x68\xc1\x2c\xda\x27\x07\xed\x53\x84\xf6\x29\x45\xfb\xa4\xd1\x3e\xf5\x68\x9f\x56\xb4\x4f\x1f\xda\x67\x04\xed\x33\x85\xf6\x05\xed\x9b\x87\xf6\x8d\xa1\x7d\x4b\xd1\xbe\x69\xb4\x6f\x3d\xda\xb7\x15\xed\xdb\x8d\xf6\x1d\x44\xfb\x8e\xa1\x7d\x67\x50\x56\x36\xca\x2a\x40\x59\x49\x94\x55\x81\xb2\x6a\x51\x56\x33\xca\xea\x42\x59\x19\x94\x35\x85\xf6\x03\xed\x17\x45\xfb\xc5\xd1\x7e\x65\x68\xbf\x2a\xb4\x5f\x03\xda\xaf\x0d\xed\xd7\x83\xf6\x1b\x42\xfb\xcd\xa0\x88\x51\xa4\x00\x45\x92\x28\x52\x89\x22\x75\x28\xd2\x82\x22\xdd\x28\x32\x84\x22\x13\x28\x32\x87\x94\x83\x54\x88\x94\x44\xaa\x42\x6a\x40\x6a\x43\xea\x41\x1a\x42\x1a\x47\x9a\x43\xce\x41\x2e\x44\x4e\x22\x57\x20\xd7\x22\x37\x23\x77\x22\xf7\x23\x4f\x22\xcf\xa3\x90\x8b\x16\x0e\xa3\x85\x93\x68\xe1\x3c\xda\x3f\x17\xed\x5f\x84\xf6\x2f\x41\xfb\x57\xa2\xfd\xeb\xd0\xfe\x2d\x68\xff\x2e\xb4\xff\x00\xda\x7f\x14\xed\x3f\x8d\xb2\xb3\x50\x76\x14\x65\xc7\x51\x76\x0a\x65\x57\xa3\xec\x46\x94\xdd\x81\xb2\xfb\x50\xf6\x08\xfa\x5a\x1a\x7d\xad\x1e\x7d\xad\x15\x1d\x18\x43\x07\x8e\xa3\x9c\x66\x74\x50\x12\x1d\x54\x81\x0e\xaa\x45\x07\x17\xa3\x83\x53\xe8\x5f\xf2\x51\x6e\x2e\xca\x2d\x42\xb9\x25\xe8\x90\x34\x3a\xa4\x1e\x1d\x9a\x44\x87\x56\xa0\x43\x6b\xd1\xa1\xcd\xe8\xd0\x4e\x74\x58\x3d\xca\x4b\xa3\xbc\x7a\x74\x78\x35\x3a\xbc\x11\x1d\xd1\x8c\x8e\xe8\x44\x5f\xef\x40\x5f\xef\x43\x5f\x1f\x41\x5f\x9f\x44\x5f\x9f\x47\xd1\x5c\x14\x8d\xa1\x68\x29\x8a\xa6\x51\xb4\x1e\x45\x5b\x51\xb4\x1b\x45\x07\x51\x74\x0c\x45\x67\xd0\x91\x46\x47\xe6\xa3\x23\x8b\xd1\x91\x29\x74\x64\x35\x3a\x72\x10\x7d\x23\x8a\xbe\x51\x83\xbe\xd1\x8c\xbe\xd1\x89\xbe\xd1\x8f\x8e\x2a\x45\x47\xa5\xd1\x51\xf5\xe8\xa8\x56\x74\x54\x37\x3a\x6a\x10\x1d\x35\x86\x8e\x9a\x41\xf9\x5d\xe8\xe8\x66\x74\x74\x27\x3a\xba\x1f\x1d\x9d\x41\x47\x4f\xa1\x63\x40\xc7\x34\xa0\x63\x26\xd1\xb1\x25\xe8\xd8\x4a\x74\x6c\x1d\x3a\xb6\x05\x1d\xdb\x85\x8e\x1d\x40\xc7\x8e\xa2\x63\xa7\x51\x41\x16\x2a\xc8\x47\x05\xc5\xa8\x20\x85\x0a\xaa\x51\x41\x23\x2a\x68\x47\x05\xbd\xa8\x60\x18\x15\x4c\xa0\x82\x79\xb4\x28\x17\x2d\x2a\x42\x8b\x4a\xd0\xa2\x4a\xb4\xa8\x0e\x2d\x6a\x41\x8b\xba\xd0\xa2\x01\xb4\x68\x14\x2d\x9a\x46\xc7\x65\xa1\xe3\xa2\xe8\xb8\x38\x3a\xae\x0c\x1d\x57\x85\x8e\x6b\x40\xc7\xb5\xa1\xe3\x7a\xd0\x71\x43\xe8\xb8\x71\x74\xdc\x2c\x3a\x3e\x07\x1d\x5f\x88\x8e\x4f\xa2\xe3\x2b\xd0\xf1\xb5\xe8\xf8\x66\x74\x7c\x27\x3a\xbe\x1f\x1d\x9f\x41\xc7\x4f\xa1\xc2\x41\x54\x38\x86\x0a\x67\xd0\x62\xa3\xc5\xf9\x68\x71\x31\x5a\x9c\x42\x8b\xab\xd1\xe2\x46\xb4\xb8\x1d\x2d\xee\x45\x8b\x87\xd1\xe2\x29\x74\x02\xe8\x84\x3c\x74\x42\x0c\x9d\x50\x8a\x4e\x48\xa3\x13\x1a\xd0\x09\x6d\xe8\x84\x1e\x74\xc2\x10\x3a\x61\x1c\x9d\x30\x8b\x96\x64\xa3\x25\x05\x68\x49\x02\x2d\x29\x47\x4b\x6a\xd1\x92\x66\xb4\xa4\x07\x2d\x19\x42\x4b\xc6\xd1\x92\x59\x54\x94\x8d\x8a\x0a\x50\x51\x02\x15\x95\xa3\xa2\x1a\x54\xd4\x84\x8a\x3a\x50\x51\x1f\x2a\x1a\x41\x45\x93\xa8\x68\x1e\x2d\xcd\x45\x4b\x8b\xd0\xd2\x12\xb4\xb4\x12\x2d\xad\x43\x4b\x5b\xd0\xd2\x2e\xb4\x74\x00\x2d\x1d\x45\x4b\xa7\xd1\xb2\x2c\xb4\x2c\x8a\x96\xc5\xd1\xb2\x32\xb4\xac\x0a\x2d\x6b\x40\xcb\xda\xd0\xb2\x1e\xb4\x6c\x08\x2d\x1b\x47\xcb\xe6\xd0\x89\x39\xe8\xc4\x42\x74\x62\x09\x3a\xb1\x12\x9d\x58\x87\x4e\x6c\x41\x27\x76\xa1\x13\x07\xd0\x89\xa3\xe8\xc4\x69\x14\x33\x8a\xe5\xa3\x58\x31\x8a\xa5\x50\xac\x1a\xc5\x1a\x51\xac\x1d\xc5\x7a\x51\x6c\x18\xc5\x26\x50\x6c\x0e\x9d\x94\x83\x4e\x2a\x42\x27\x95\xa0\x93\x2a\xd1\x49\x75\xe8\xa4\x16\x74\x52\x17\x3a\x69\x00\x9d\x34\x8a\x4e\x9a\x46\xcb\xb3\xd0\xf2\x28\x5a\x1e\x47\xcb\xcb\xd0\xf2\x2a\xb4\xbc\x01\x2d\x6f\x43\xcb\x7b\xd0\xf2\x21\xb4\x7c\x1c\x2d\x9f\x45\x27\x67\xa3\x93\x0b\xd0\xc9\x09\x74\x72\x39\x3a\xb9\x06\x9d\xdc\x8c\x4e\xee\x44\x27\xf7\xa3\x93\x33\xe8\xe4\x29\x14\x07\xc5\xf3\x50\x3c\x86\xe2\xa5\x28\x9e\x46\xf1\x7a\x14\x6f\x45\xf1\x6e\x14\x1f\x44\xf1\x31\x14\x9f\x41\xa7\x18\x9d\x92\x8f\x4e\x29\x46\xa7\xa4\xd0\x29\xd5\xe8\x94\x56\x74\x4a\x0f\x3a\x65\x08\x9d\x32\x81\x4e\x99\x43\xa7\xe6\xa0\x53\x0b\xd1\xa9\x49\x74\x6a\x05\x3a\xb5\x16\x9d\xda\x8c\x4e\xed\x44\xa7\xf6\xa3\x53\xc7\xd0\xa9\x33\xe8\x34\xa3\xd3\xf2\xd1\x69\xc5\xe8\xb4\x14\x3a\xad\x01\x9d\xd6\x86\x4e\xeb\x45\xa7\x0d\xa3\xd3\x26\xd0\x69\x73\xa8\x38\x07\x15\x17\xa2\xe2\x24\x2a\xae\x40\xc5\xb5\xa8\xb8\x19\x15\x77\xa2\xe2\x7e\x54\x9c\x41\xc5\x53\x68\x05\x68\x45\x1e\x5a\x11\x47\x2b\xca\xd0\x8a\x2a\xb4\xa2\x01\xad\x68\x43\x2b\x7a\xd0\x8a\x61\xb4\x62\x12\xad\x98\x47\x2b\x73\xd1\xca\x22\xb4\xb2\x04\xad\xac\x44\x2b\xeb\xd1\xca\x56\xb4\xb2\x1b\xad\x1c\x44\x2b\xc7\xd0\xca\x19\x74\xba\xd1\xe9\xf9\xe8\xf4\x62\x74\x7a\x0a\x9d\x5e\x8d\x4e\x6f\x44\xa7\xb7\xa3\xd3\x7b\xd1\xe9\xc3\xe8\xf4\x09\x74\xfa\x1c\x4a\xe4\xa0\x44\x21\x4a\x24\x51\xa2\x02\x25\xea\x50\xa2\x05\x25\xba\x50\x62\x00\x25\x46\x51\x62\x1a\xad\xca\x42\xab\xf2\xd1\xaa\x62\xb4\x2a\x85\x56\x55\xa3\x55\x8d\x68\x55\x3b\x5a\xd5\x8b\x56\x0d\xa3\x55\x13\x68\xd5\x1c\x3a\x23\x07\x9d\x51\x88\xce\x48\xa2\x33\x2a\xd0\x19\xb5\xe8\x8c\x66\x74\x46\x27\x3a\xa3\x1f\x9d\x91\x41\x67\xcc\xa2\xd5\xd9\x68\x75\x01\x5a\x9d\x40\xab\xcb\xd1\xea\x1a\xb4\xba\x09\xad\xee\x40\xab\xfb\xd0\xea\x0c\x5a\x3d\x85\x92\xa0\x64\x1e\x4a\x26\x51\xb2\x02\x25\x6b\x51\xb2\x19\x25\x3b\x51\xb2\x1f\x25\x33\x28\x39\x85\xd6\x80\xd6\xe4\xa1\x35\x31\xb4\xa6\x14\xad\x49\xa3\x35\x0d\x68\x4d\x1b\x5a\xd3\x83\xd6\x0c\xa1\x35\xe3\x68\xcd\x2c\x5a\x9b\x8d\xd6\x16\xa0\xb5\x09\xb4\xb6\x1c\xad\xad\x41\x67\xb6\xa1\x92\x2a\x54\xd2\x80\x4a\xbe\xda\x3d\xa8\x64\x08\x95\x8c\xa3\x92\x59\x74\x56\x0e\x3a\xab\x10\x9d\x95\x44\x67\x55\xa0\xb3\x6a\xd1\x59\xcd\xe8\xac\x4e\x74\xd6\x00\x3a\x6b\x0c\x9d\x35\x83\xd6\x19\xad\xcb\x47\xeb\x8a\xd1\xba\x14\x5a\x57\x8d\xd6\x35\xa2\x75\x1d\x68\x5d\x1f\x5a\x37\x82\xd6\x4d\xa2\x75\xf3\xe8\xec\x5c\x74\x76\x11\x3a\xbb\x04\x9d\x5d\x89\xce\xae\x43\x67\xb7\xa0\xb3\xbb\xd0\xd9\x03\xe8\xec\x31\x74\xf6\x2c\x2a\xcd\x46\xa5\x05\xa8\x34\x81\x4a\xcb\xd1\x37\xbf\xaa\x16\x7d\xb3\x19\x7d\xb3\x13\x7d\xb3\x1f\x7d\x33\x83\xbe\x39\x85\xce\x01\x9d\x93\x87\xce\x89\xa1\x73\x4a\xd1\x39\x69\x74\x4e\x3d\x3a\xa7\x15\x9d\xd3\x8d\xce\x19\x44\xe7\x8c\xa1\x73\x66\xd0\xb9\x46\xe7\xe6\xa3\x73\x8b\xd1\xb9\x29\x74\x6e\x35\x3a\xb7\x11\x9d\xdb\x8e\xce\xed\x45\xe7\x0e\xa3\xb2\x76\x54\xd6\x8b\xca\x46\x50\xd9\x14\x3a\x0f\x74\x5e\x1e\x3a\x2f\x86\xce\x2b\x45\xe7\xa5\xd1\x79\xf5\xe8\xbc\x56\x74\x5e\x37\x3a\x6f\x10\x9d\x37\x86\xce\x9b\x41\xeb\x8d\xd6\xe7\xa3\xf5\x09\xb4\xbe\x1c\xad\xaf\x41\xeb\x9b\xd0\xfa\x4e\xb4\x7e\x00\xad\x1f\x45\xeb\xa7\xd1\xb7\x8c\xbe\x95\x8f\xbe\x55\x8c\xbe\x95\x42\xdf\xaa\x46\xdf\x6a\x42\xdf\xea\x40\xdf\xea\x47\xdf\xca\xa0\x6f\x4d\xa1\x14\x28\x95\x87\x52\x71\x94\x2a\x43\xa9\x2a\x94\x6a\x40\xa9\x36\x94\xea\x41\x1b\x86\xd0\x86\x71\xb4\x61\x0e\x6d\xcc\x45\x1b\x8b\xd0\xc6\x52\xb4\x31\x8d\x36\x36\xa1\x8d\xdd\x68\xe3\x20\xda\x38\x86\xca\xb3\x51\x79\x01\x2a\x4f\xa0\xf2\x72\x54\x5e\x83\xca\x9b\x50\x79\x07\x2a\xef\x43\xe5\x23\xa8\x7c\x12\x95\xcf\xa3\x4d\xb9\x68\x53\x11\xda\x54\x82\x36\x55\xa2\x4d\x75\x68\x53\x0b\xda\xd4\x85\x36\x0d\xa0\x4d\xa3\x68\xd3\x34\xda\x9c\x85\x36\x47\xd1\xe6\x38\xda\x9c\x42\x9b\xab\xd1\xe6\x26\xb4\xb9\x03\x6d\xee\x43\x9b\x47\xd0\xe6\x29\x74\x3e\xe8\xfc\x3c\x74\x7e\x0c\x9d\x5f\x86\xce\xaf\x42\xe7\x37\xa0\xf3\x3b\xd1\xf9\xfd\xe8\xfc\x0c\x3a\x7f\x0a\x55\x80\x2e\xf8\xaa\x3c\x74\x41\x0c\x5d\x50\x8a\x2e\x48\xa3\x0b\xea\xd1\x05\xad\xe8\x82\x6e\x74\xc1\x20\xba\x60\x0c\x5d\x30\x8f\x2e\x2a\x45\x17\xa5\xd1\x45\xf5\xe8\xa2\x36\x74\x51\x0f\xba\x68\x08\x5d\x34\x8e\x2e\x9a\x45\x95\xd9\xa8\xb2\x10\x55\x26\x51\x65\x05\xaa\xac\x45\x17\x77\xa1\x8b\x07\xd1\xc5\xe3\xe8\xe2\x59\xf4\xed\x6c\xf4\xed\x02\xf4\xed\x04\xfa\x76\x39\xfa\x76\x0d\xfa\x76\x13\xfa\x76\x07\xfa\x76\x1f\xfa\x76\x06\x7d\x7b\x1a\x6d\x31\xda\x92\x8f\xb6\x14\xa3\x2d\x15\x68\x4b\x2d\xda\xd2\x8c\xb6\x74\xa2\x2d\xfd\x68\x4b\x06\x6d\x99\x42\x69\x50\x3a\x0f\xa5\x63\x28\x5d\x8a\xd2\x69\x94\x6e\x40\xe9\x36\x94\xee\x41\xe9\x21\x94\x1e\x47\xe9\x39\xb4\x35\x07\x6d\x2d\x44\x5b\x4b\xd0\xd6\x4a\xb4\xb5\x0e\x6d\x6d\x41\x5b\xbb\xd1\xd6\x41\xb4\x75\x0c\x6d\x9d\x41\xdb\x8c\xb6\xe5\xa3\x6d\xc5\x68\x5b\x0a\x6d\xab\x46\xdb\x1a\xd1\xb6\x76\xb4\xad\x17\x6d\x1b\x41\xdb\x26\xd1\xb6\x79\xb4\x3d\x17\x6d\x2f\x42\xdb\x4b\xd1\xf6\x34\xda\x5e\x8f\xb6\xb7\xa2\xed\x3d\x68\xfb\x10\xda\x3e\x8e\xb6\xcf\xa1\xaa\x5c\x54\x55\x84\xaa\x4a\x50\x55\x1a\x55\xd5\xa3\xaa\x56\x54\xd5\x8d\xaa\x86\x50\xd5\x38\xaa\x9a\x45\x97\xe4\xa0\x4b\x8a\xd0\x25\x25\xe8\x92\x4a\x74\x49\x1d\xba\xa4\x05\x5d\xd2\x85\x2e\x19\x40\x97\x8c\xa2\x4b\xa6\xd1\xff\x97\x85\xfe\xbf\x7c\x74\xe9\x20\xba\x74\x0c\x5d\x3a\x83\xaa\xb3\x51\x75\x01\xaa\x4e\xa0\xea\x2a\x54\xdd\x80\xaa\xdb\xd0\xff\x9b\x43\xdf\xc9\x41\xdf\x29\x44\xdf\x49\xa2\xef\x54\xa0\xef\xd4\xa1\xef\xb4\xa0\xef\x74\xa3\xef\x0c\xa2\xef\x8c\xa3\xef\xcc\xa1\xcb\x72\xd0\x65\x85\xe8\xb2\x12\x74\x59\x25\xba\xac\x0e\x5d\xd6\x82\x2e\xeb\x46\x97\x0d\xa2\xcb\xc6\xd1\x65\xb3\xa8\x26\x1b\xd5\x14\xa0\x9a\x04\xaa\x29\x47\x35\x35\xa8\xa6\x09\xd5\x74\xa0\x9a\x3e\x54\x33\x82\x6a\x26\x51\xcd\x3c\xfa\x6e\x1e\xfa\x6e\x0c\x7d\xb7\x12\x7d\xb7\x0e\x7d\xb7\x05\x7d\xb7\x1b\x7d\x77\x10\x7d\x77\x1c\x7d\x77\x16\x5d\x5e\x88\x2e\x4f\xa2\xcb\xab\xd0\xe5\x0d\xe8\xf2\x36\x74\x79\x0f\xba\x7c\x08\x5d\x3e\x8e\x2e\x9f\x45\xb5\xb9\xe8\x8a\x24\xba\xa2\x12\x5d\x51\x87\xae\x68\x41\x57\x74\xa1\x2b\x06\xd0\x15\xa3\xe8\x8a\x69\x74\x65\x16\xba\x32\x8a\xae\x8c\xa3\x2b\x53\xe8\xca\x6a\x74\xd5\x00\xba\x6a\x14\x5d\x35\x83\xea\x8c\xbe\xd7\x80\xbe\xd7\x86\xbe\xd7\x83\xbe\x37\x8c\xbe\x37\x81\xbe\x37\x87\xfe\x3d\x07\x5d\x5d\x8f\xae\x6e\x45\x57\xf7\xa0\xab\x87\xd0\xd5\x13\xe8\xea\x39\x54\x9f\x83\xea\x0b\x51\x7d\x12\xd5\x57\xa0\xfa\x3a\x74\x4d\x14\x5d\x13\x47\xd7\x94\xa1\x6b\xaa\xd0\x35\x0d\xe8\x9a\x76\x74\x4d\x1f\xba\x66\x04\x35\x54\xa0\x86\x5a\xd4\xd0\x82\x1a\x7a\x50\xc3\x10\x6a\x18\x47\x0d\xb3\xe8\xda\x6c\x74\x6d\x01\xba\x36\x81\xae\x2d\x47\xd7\xd6\xa0\x6b\x9b\xd0\xb5\x1d\xe8\xda\x3e\x74\xed\x08\xba\x76\x12\x5d\x3b\x8f\xae\xcb\x43\xd7\xc5\xd0\x75\xa5\xe8\xba\x34\xba\xae\x01\x5d\x9f\x41\xd7\x4f\xa1\xc6\x2c\xd4\x18\x45\x8d\x71\xd4\x98\x42\x8d\xd5\xa8\xb1\x11\x35\x76\xa3\x1b\x3a\xd0\x0d\x7d\xe8\x86\x11\x74\xc3\x24\xba\x61\x1e\xfd\x20\x17\xfd\xa0\x08\xfd\xa0\x0f\xfd\x20\x83\x7e\x30\x85\x9a\x40\x4d\x79\xa8\xa9\x15\xfd\x30\x07\xfd\xb0\x10\xfd\x30\x89\x7e\x58\x81\x7e\x58\x8b\x6e\x2c\x44\x37\x26\xd1\x8d\x95\xe8\xc6\x3a\x74\x63\x0b\xba\xb1\x0b\xdd\x38\x80\x6e\x1c\x45\x37\xce\xa2\x1f\x65\xa3\x1f\x15\xa1\x1f\x95\xa0\x1f\x55\xa2\x1f\x35\xa0\x1f\xb5\xa1\x1f\xf5\xa0\x1f\x0d\xa1\x1f\x4d\xa2\x1f\xcd\xa3\xe6\x5c\xd4\x5c\x84\x9a\x4b\x50\x73\x35\x6a\x6e\x44\xcd\x9d\xa8\xb9\x1f\x35\x67\x50\xf3\x14\xba\x09\x74\x53\x1e\xba\x29\x86\x6e\x2a\x45\x37\x55\xa3\x9b\x1a\xd1\x4d\xed\xe8\xa6\x5e\x74\xd3\x30\xba\x69\x12\xfd\x38\x0b\xfd\x38\x8a\x7e\x1c\x47\x3f\x2e\x43\x3f\xae\x42\x3f\x6e\x40\x3f\x6e\x43\x3f\xee\x41\x3f\x1e\x42\xff\x35\x8e\xfe\x6b\x16\xb5\x64\xa3\x96\x02\xd4\x92\x40\x2d\xe5\xa8\xa5\x06\xb5\x34\xa1\x96\x4e\xd4\xd2\x8f\x5a\x32\xa8\x65\x0a\xdd\x0c\xba\x39\x8a\x6e\x8e\xa3\x9b\xcb\xd0\xcd\x55\xe8\xe6\x06\xf4\xdf\x6d\xe8\xbf\x7b\xd0\x7f\x8f\xa0\xff\x9e\x44\xff\x3d\x8f\x6e\xc9\x45\xb7\x14\xa1\x5b\x4a\xd0\x2d\x95\xe8\x96\x3a\x74\x4b\x2b\xba\xa5\x07\xb5\xc6\x50\x6b\x29\x6a\x4d\xa3\xd6\x7a\xd4\xda\x8a\x5a\xbb\x51\xeb\x30\x6a\x9d\x40\xad\xf3\xe8\xd6\x5c\x74\x6b\x0c\xdd\x5a\x8a\x6e\x4d\xa3\x5b\x1b\xd0\xad\x6d\xe8\xd6\x1e\x74\x5b\x2e\xba\x2d\x8e\x6e\x2b\x43\xb7\x35\xa0\xdb\xda\xd0\x6d\x5f\xfd\x0f\xa3\xdb\x26\xd0\x6d\x73\xe8\xf6\x1c\x74\x7b\x21\xba\x3d\x89\x6e\xaf\x40\xb7\xf7\xa0\xb6\x02\xd4\x96\x40\x6d\xe5\xa8\xad\x06\xdd\x11\x43\x77\x94\xa2\x3b\xd2\xe8\x8e\x7a\x74\x47\x2b\xba\xa3\x1b\xdd\x31\x88\xee\x18\x43\x77\xcc\xa0\xff\x31\xfa\x9f\x7c\xf4\x3f\xc5\xe8\x27\x95\xe8\x27\x75\xe8\x27\x2d\xe8\x27\x5d\xa8\x3d\x0f\xb5\xc7\x50\x7b\x19\x6a\xaf\x46\xed\x8d\xa8\xbd\x1d\xb5\xf7\xa1\x9f\x0e\xa0\x9f\x35\xa1\x9f\x75\xa2\x9f\x7d\xb5\xc7\xd0\xcf\x66\xd0\x9d\x46\x77\x16\xa1\x3b\xcb\xd0\x9d\x35\xe8\xce\x16\x74\x67\x17\xba\x73\x10\xdd\x39\x8e\xee\x9c\x43\x1d\xb9\xa8\x23\x86\x3a\xca\x50\x47\x35\xea\x68\x42\x1d\x1d\xe8\x7f\xfb\xd0\xff\x66\xd0\xff\x4e\xa3\x9f\x1b\xfd\x3c\x1f\xfd\x3c\x81\x7e\x5e\x81\xfe\xaf\x16\xfd\x5f\x0b\xfa\xbf\x2e\xf4\x7f\x03\xa8\xb3\x18\x75\x0e\xa1\xce\x71\xd4\x39\x8b\x7e\x91\x8b\x7e\x51\x81\x7e\xd1\x89\x7e\xd1\x8f\x7e\x59\x82\x7e\xd9\x81\x7e\xd9\x87\x7e\x39\x82\x7e\x39\x89\x7e\x39\x8f\xee\xca\x45\x77\x15\xa1\xbb\x4a\xd0\x5d\x95\xe8\xae\x3a\x74\x57\x0b\xba\xab\x0b\xdd\x35\x80\xee\x1a\x45\x77\x4d\xa3\xae\x2c\xd4\x55\x8b\xba\x9a\x51\x57\x27\xea\xea\x47\x5d\x19\xd4\x35\x8d\xee\xce\x42\x77\x47\xd1\xdd\x71\x74\x77\x19\xba\xbb\x1a\xdd\xdd\x88\xee\x6e\x47\x77\xf7\xa2\xbb\x87\xd1\xdd\x13\xe8\xee\x39\x74\x4f\x0e\xba\xa7\x10\xdd\x93\x44\xf7\x54\xa0\x7b\x6a\xd1\x3d\xcd\xe8\x9e\x4e\x74\x4f\x3f\xba\x27\x83\x7e\x55\x87\x7e\xd5\x82\x7e\xd5\x85\x7e\x35\x80\xba\x4b\x50\x77\x1a\x75\xd7\xa3\x7b\x8b\xd0\xbd\x25\xe8\xde\x4a\x74\x6f\x1d\xba\xb7\x05\xdd\x97\x8b\xee\x2b\x42\xf7\x95\xa0\xfb\x2a\xd1\x7d\x75\xe8\xbe\x16\xf4\xeb\x72\xf4\xeb\x5a\xf4\xeb\x66\xf4\xeb\x4e\xf4\xeb\x01\xf4\xeb\x31\xf4\xeb\x19\xd4\x93\x8d\x7a\x0a\x50\x4f\x12\xf5\x8c\xa2\x9e\x69\x74\x7f\x16\xba\x3f\x8a\xee\x8f\xa3\xfb\xcb\xd0\xfd\x55\xe8\xfe\x06\x74\x7f\x3b\xba\xbf\x17\xdd\x3f\x8c\xee\x9f\x40\xf7\xcf\xa3\x07\x72\xd1\x03\x45\xe8\x81\x12\xf4\x40\x25\x7a\xa0\x0e\x3d\xd0\x82\x1e\xe8\x42\x0f\x0c\xa0\x07\x46\xd1\x03\xd3\xe8\xc1\x2c\xf4\x60\x14\x3d\x18\x47\x0f\x96\xa1\x07\xab\xd0\x83\x0d\xe8\xc1\x36\xf4\x60\x0f\x7a\x70\x18\x3d\x38\x81\x1e\x9c\x43\xbd\x39\xa8\xb7\x10\xf5\x26\x51\x6f\x05\xea\xad\x45\xbd\xcd\xa8\xb7\x13\xf5\xf6\xa3\xde\x0c\xea\x9d\x42\x0f\x81\x1e\xca\x43\x0f\x8d\xa2\x87\xa6\xd1\xc3\x59\xe8\xe1\x02\xf4\x70\x02\x3d\x5c\x8e\x1e\x6e\x44\x0f\xb7\xa3\x87\x7b\xd1\xc3\xc3\xe8\xe1\x09\xf4\xf0\x1c\xfa\x4d\x0e\xfa\x4d\x21\xfa\x4d\x12\xfd\xa6\x02\xfd\xa6\x16\xf5\xc5\x50\x5f\x29\xea\xab\x42\x7d\x0d\xa8\xaf\x0d\xf5\xf5\xa0\xbe\x21\xd4\x37\x8e\xfa\x66\xd1\x23\xd9\xe8\x91\x02\xf4\x48\x02\x3d\x52\x8e\x1e\xa9\x41\x8f\x34\xa1\x47\x3a\xd0\x23\x7d\xe8\x91\x11\xf4\xc8\x14\x7a\x14\xf4\x68\x1e\x7a\x34\x86\x1e\x2d\x45\x8f\x56\xa1\x47\x1b\xd1\xa3\xed\xe8\xd1\x5e\xf4\xe8\x30\x7a\x74\x02\x3d\x3a\x87\x7e\x9b\x83\x7e\x5b\x88\x7e\x9b\x44\xbf\xad\x40\xbf\xad\x45\xfd\xc5\xa8\x3f\x85\xfa\x6b\x50\x7f\x13\xea\xef\x40\xfd\x7d\xa8\x7f\x04\xf5\x4f\xa2\xfe\x79\xf4\x58\x2e\x7a\xac\x08\x3d\x1e\x45\x8f\xc7\xd1\xe3\x65\xe8\xf1\x2a\xf4\x78\x03\x7a\xbc\x0d\x3d\xde\x83\x1e\x1f\x42\x8f\x8f\xa3\xc7\xe7\xd0\x13\x39\xe8\x89\x42\xf4\x44\x12\x3d\x51\x81\x9e\xa8\x45\x4f\x34\xa3\x27\x3a\xd1\x13\xfd\xe8\x89\x0c\x7a\x62\x0a\x0d\x80\x06\xf2\xd0\x40\x0c\x0d\x94\xa2\x27\xcb\xd1\x93\x35\xe8\xc9\x16\xf4\x64\x17\x7a\x72\x00\x3d\x39\x8a\x9e\x9c\x46\x4f\x65\xa1\xa7\xa2\xe8\xa9\x38\x7a\x2a\x85\x9e\xaa\x46\x4f\x35\xa2\xa7\xda\xd1\x53\xbd\xe8\xa9\x31\xf4\xd4\x0c\x7a\x3a\x8a\x9e\x8e\xa3\xa7\xcb\xd0\xd3\x55\xe8\xe9\x06\xf4\x74\x1b\x7a\xba\x07\x3d\x3d\x84\x9e\x9e\x46\x83\x46\x83\xf9\xe8\x77\xa0\x67\xb2\xd0\x33\xf9\xe8\xd9\x18\x7a\xb6\x0c\x3d\x5b\x85\x9e\x6d\x40\xcf\xb6\xa1\x67\x7b\xd0\xb3\x43\xe8\xd9\x71\xf4\xec\x2c\x1a\xca\x46\x43\x05\x68\x28\x81\x7e\x5f\x8c\x7e\x9f\x42\x7f\x28\x46\x7f\xf8\xca\x6a\xf4\x87\x46\xf4\x87\x76\xf4\x87\x5e\xf4\xdc\x28\x7a\x6e\x1a\x3d\x9f\x8f\x9e\x4f\xa0\xe7\xcb\xd1\xf3\x35\xe8\xf9\x26\xf4\x7c\x07\x7a\xbe\x0f\x3d\x3f\x8b\x5e\x48\xa0\x17\x46\xd1\x1f\x5b\xd1\x48\x31\x7a\xd1\xe8\xc5\x7c\xf4\xe2\x57\x7b\x1a\xbd\x94\x85\x5e\x8a\xa2\x97\xe2\xe8\xa5\x14\x7a\xa9\x1a\xbd\xd4\x88\x5e\x6a\x47\x2f\xf5\xa2\x97\x86\xd1\x9f\x7a\x51\xa6\x19\x65\x3a\x51\xa6\x1f\x65\x46\x51\x66\x06\xbd\x9c\x46\x2f\xcf\xa0\x57\x8c\x5e\xc9\xa0\x57\xa6\xd0\x9f\x41\x7f\xce\x43\x7f\x8e\xa1\x3f\x97\xa2\x3f\xa7\xd1\x9f\xeb\xd1\x9f\x5b\xd1\x68\x35\x1a\x6d\x44\xa3\xed\x68\xb4\x17\x8d\x0e\xa3\x57\x7b\xd0\xab\x19\xf4\xea\x14\xfa\x0b\xe8\x2f\x79\xe8\x2f\xf3\xe8\xb5\x5c\xf4\x5a\x11\x7a\xad\x04\xbd\x96\x46\xaf\xd5\xa3\xd7\xfa\xd0\x6b\x23\xe8\xb5\x49\xf4\xda\x3c\x1a\xab\x44\x63\x19\xf4\x7a\x09\x7a\xbd\x1f\xbd\x11\x43\x6f\x94\xa2\x37\x46\xd1\x9b\xa5\xe8\xcd\x2a\xf4\xe6\x34\x1a\xcf\x42\xe3\x51\x34\x1e\x47\xe3\xc3\x68\x7c\x02\x8d\xcf\xa1\xbf\xe6\xa0\xbf\x16\xa2\xbf\x26\xd1\x5f\x2b\xd0\x5f\x6b\xd1\x5f\x9b\xd1\x5f\x3b\xd1\x5b\x31\xf4\x56\x29\x7a\x2b\x8d\xde\xaa\x47\x6f\xb5\xa2\xb7\xba\xd1\x5b\x83\xe8\xad\x31\xf4\xd6\x0c\x7a\xdb\xe8\xed\x7c\xf4\x76\x31\x7a\x3b\x85\xde\xae\x46\x6f\x37\xa2\xb7\xdb\xd1\xdb\xbd\xe8\xed\x61\xf4\xf6\x04\x7a\x7b\x0e\x4d\xe4\xa0\x89\x42\x34\x91\x44\x13\x15\x68\xa2\x16\x4d\xb4\xa0\x89\x2e\x34\x31\x80\x26\x46\xd1\xc4\x34\xfa\x5b\x16\xfa\x5b\x14\xfd\xad\x1b\xfd\x6d\x10\xfd\x6d\x0c\xfd\x6d\x06\xbd\x63\xf4\x4e\x3e\x7a\x67\x00\xbd\x33\x8a\xde\x99\x46\xef\x66\xa1\x77\xa3\xe8\xdd\x38\x7a\xb7\x0c\xbd\x5b\x85\xde\x6d\x40\xef\xb6\xa1\x77\x7b\xd0\xbb\x43\x68\xb2\x1a\x4d\x36\xa2\xc9\x76\x34\xd9\x8b\x26\x87\xd1\xe4\x04\x9a\x9c\x43\xef\xe5\xa0\xf7\x8a\xd0\x7b\x25\xe8\xbd\x4a\xf4\x5e\x1d\x7a\xaf\x05\xbd\xd7\x85\xde\x1b\x40\xef\x8d\xa1\xf7\x66\xd0\xfb\x46\xef\xe7\xa3\xf7\x8b\xd1\xfb\x29\xf4\x7e\x35\x7a\xbf\x11\xbd\xdf\x8e\xde\xef\x45\xef\x8f\xa0\xf7\x27\xd1\xfb\xf3\xe8\x83\x5c\xf4\x41\x11\xfa\xa0\x04\x7d\x50\x89\x3e\xa8\x43\x1f\xb4\xa0\x0f\xba\xd0\x07\x03\xe8\x83\x51\xf4\xc1\x34\x9a\xca\x42\x53\x51\x34\x15\x47\x53\x65\x68\xaa\x0a\xed\x00\xed\xc8\x43\x3b\x62\x68\x47\x29\xda\x91\x46\x3b\xea\xd1\x8e\x56\xb4\xa3\x1b\xed\x18\x44\x3b\xc6\xd0\x8e\x19\xf4\xa1\xd1\x87\xf9\xe8\xc3\x62\xf4\x61\x0a\x7d\x58\x8d\x3e\x6c\x44\x1f\xb6\xa3\x0f\x7b\xd1\x87\xc3\xe8\xc3\x09\xf4\xe1\x1c\xfa\x28\x07\x7d\x54\x88\x3e\x4a\xa2\x8f\x2a\xd0\x47\xb5\xe8\xa3\x66\xf4\x51\x27\xfa\xa8\x1f\x7d\x94\x41\x1f\x4d\xa1\xe9\x2c\x34\x3d\x88\xa6\xc7\xd0\xdf\x9b\xd1\xdf\x3b\xd1\xdf\xfb\xd1\xdf\x33\xe8\xef\x53\xe8\x63\xd0\xc7\x79\xe8\xe3\x18\xfa\xb8\x14\x7d\x9c\x46\x1f\xd7\xa3\x8f\x5b\xd1\xc7\xdd\xe8\xe3\x41\xf4\xf1\x18\xfa\x78\x16\xfd\x23\x1b\xfd\xa3\x00\xfd\x23\x81\xfe\x51\x81\xfe\x51\x87\xfe\xd1\x82\xfe\xd1\x8d\xfe\x31\x88\x66\x6a\xd0\x4c\x13\x9a\xe9\x40\x33\x7d\x68\x66\x04\xcd\x4c\xa2\x99\x79\xf4\x49\x2e\xfa\xa4\x08\x7d\x52\x82\x3e\xa9\x44\x9f\xd4\xa1\x4f\x5a\xd0\x27\x5d\xe8\x93\x01\xf4\xc9\x28\xfa\x64\x1a\xed\xcc\x42\x3b\xf3\xd1\xce\x04\xda\x59\x8e\x76\x65\xa3\x5d\x05\x68\x57\x02\xed\xfa\xea\x5d\x83\x76\x35\xa1\x5d\x1d\x68\x57\x1f\xda\x35\x82\x76\x4d\xa2\x5d\xf3\x68\x36\x17\xcd\x16\xa1\xd9\x12\x34\x5b\x89\x66\xeb\xd0\x6c\x0b\x9a\xed\x42\xb3\x03\x68\x76\x14\xcd\x4e\xa3\xdd\x46\xbb\xf3\xd1\xee\x62\xb4\x3b\x85\x76\x57\xa3\xdd\x8d\x68\x77\x3b\xda\xdd\x8b\x76\x0f\xa3\xdd\x13\x68\xf7\x1c\xfa\x34\x07\x7d\x5a\x88\x3e\x4d\xa2\x4f\x2b\xd0\xa7\xb5\xe8\xd3\x16\xf4\x69\x17\xfa\x74\x00\x7d\x3a\x86\x3e\x9d\x41\x9f\x19\x7d\xd6\x87\x3e\x1b\x41\x9f\x4d\xa2\xcf\xe6\xd1\x5c\x14\xcd\xc5\xd1\x5c\x19\x9a\xab\x42\x73\x0d\x68\xae\x1d\xcd\xf5\xa2\xb9\x61\x34\x37\x89\xf6\x64\xa1\x3d\x51\xb4\x27\x8e\xf6\xa4\xd0\x9e\x6a\xb4\xa7\x11\xed\x69\x47\x7b\x7a\xd1\x9e\x61\xb4\x67\x02\xed\x99\x43\x9f\xe7\xa0\xcf\x8b\xd1\xe7\x29\xf4\x79\x35\xfa\xbc\x11\x7d\xde\x8e\x3e\xef\x43\x9f\x8f\xa0\xcf\x27\xd1\xe7\xf3\xe8\x9f\xb9\xe8\x9f\x45\xe8\x9f\x25\xe8\x9f\x95\x68\x3e\x85\xe6\xab\xd1\x7c\x33\x9a\xef\x44\xf3\x03\x68\x7e\x14\xcd\x4f\xa3\x2f\xb2\xd0\x17\x51\xf4\x45\x1c\x7d\x51\x86\xbe\xa8\x42\x5f\x34\xa0\x2f\xda\xd0\x17\x3d\xe8\x8b\x21\xf4\xc5\x38\xfa\x62\x16\xed\xcd\x41\x7b\x0b\xd1\xde\x24\xda\x5b\x81\xf6\xd6\xa2\xbd\xcd\x68\x6f\x27\xda\x3b\x88\xf6\x8e\xa3\xbd\x73\xe8\xcb\x1c\x4c\x14\x53\x8c\x49\x61\xaa\x31\x4d\x98\x0e\x4c\x1f\x66\x04\x33\x89\x99\xc7\x0b\x72\xf1\x82\x22\xbc\xa0\x04\x2f\xa8\xc4\x0b\xea\xf0\x82\x16\xbc\xa0\x1b\x2f\x18\xc2\x0b\xc6\xf1\x82\x59\xbc\x4f\x36\xde\xa7\x00\xef\x9b\x8d\xf7\xfd\xca\x04\xce\xca\xc7\x59\xc5\x38\x2b\x85\xb3\xaa\x71\x56\x23\xce\x6a\xc7\x59\xbd\x78\xbf\x3a\xbc\x5f\x0b\xde\xaf\x0b\xef\x37\x80\xf7\x1b\xc5\xfb\x4d\xe3\x48\x16\x8e\xe4\xe3\x48\x31\x8e\xa4\x70\xa4\x1a\x47\x1a\x71\xa4\x03\x47\xfa\x70\x64\x04\x47\xa6\xb0\xc0\xca\xc3\x8a\x61\x95\x61\xd5\x62\x35\x63\x75\x62\x0d\x60\x8d\x62\x4d\x63\x67\x61\x47\xb1\xe3\xd8\x65\xd8\x55\xd8\x0d\xd8\x1d\xd8\xfd\xd8\x19\xec\x69\x1c\x8c\x43\x3e\x0e\xc5\x38\xa4\x70\xa8\xc6\xa1\x11\x87\x76\x1c\xfa\x70\xc8\xe0\x30\x85\x17\x66\xe1\x85\x51\xbc\x30\x8e\x17\x96\xe1\x85\x55\x78\x61\x03\x5e\xd8\x86\x17\xf6\xe0\x85\x43\x78\xe1\x38\x5e\x38\x8b\xf7\xcf\xc6\xfb\x17\xe0\xfd\x93\x78\xff\x0a\x9c\x9d\xc0\xd9\x5f\x59\x8b\xb3\x5b\x70\x76\x0f\xce\x1e\xc2\xd9\xe3\x38\x7b\x16\x1f\x10\xc5\x07\xc4\xf1\x01\x65\xf8\x80\x2a\x7c\x40\x23\xfe\xda\x57\xb5\xe3\xaf\xf5\xe2\xaf\x0d\xe3\xaf\x4d\xe0\xaf\xcd\xe1\x03\x47\xf1\x81\xd3\x38\x27\x0b\xe7\x44\x71\x4e\x1c\xe7\x94\xe1\x9c\x2a\x9c\xd3\x80\x73\xda\x70\x4e\x0f\xce\x19\xc2\x39\xe3\x38\x67\x16\x1f\x34\x8a\x0f\x9a\xc6\x07\x67\xe1\x83\xa3\xf8\xe0\x38\x3e\xb8\x0c\x1f\x5c\x85\x0f\x6e\xc0\x07\xb7\xe1\x83\x7b\xf0\xc1\x43\xf8\xe0\x71\x7c\xf0\x2c\xfe\x97\x6c\x9c\xfb\x55\x05\x38\x37\x81\x73\x2b\x70\x6e\x2d\xce\x6d\xc6\xb9\x9d\x38\xb7\x1f\xe7\x66\x70\xee\x34\x3e\x24\x0b\x1f\x12\xc5\x87\xc4\xf1\x21\x65\xf8\x90\x2a\x7c\x48\x03\x3e\xa4\x0d\x1f\xd2\x83\x0f\x19\xc2\x87\x8c\xe3\x43\x66\xf1\xa1\xd9\xf8\xd0\x42\x7c\x68\x09\x3e\xb4\x12\x1f\x96\xc2\x87\x55\xe3\xc3\x1a\xf1\x61\xed\xf8\xb0\x5e\x7c\xd8\x30\x3e\x6c\x02\x1f\x36\x87\xf3\x72\x70\x5e\x21\xce\x4b\xe2\xc3\x13\xf8\xf0\x72\x7c\x78\x0d\x3e\xbc\x09\x1f\xde\x81\x0f\xef\xc3\x87\x8f\xe0\xc3\x27\xf1\xe1\xf3\xf8\x88\x5c\x7c\x44\x11\x3e\xa2\x04\x1f\x91\xc6\x5f\x2f\xc7\x5f\xaf\xc1\xd1\x72\x1c\xfd\xca\x26\x1c\xed\xc0\xd1\x3e\x1c\x1d\xc7\xd1\x59\x7c\x64\x36\x3e\xb2\x00\x1f\x99\xc4\x47\x56\xe0\x23\x6b\xf1\x91\xcd\xf8\xc8\x2e\x7c\xe4\x00\x3e\x72\x14\x1f\x39\x8d\xbf\x31\x8d\x8f\xca\xc2\x47\x45\xf1\x51\x71\x7c\x54\x0a\x1f\x55\x8d\x8f\x6a\xc4\x47\x75\xe0\xa3\x06\xf0\x51\xa3\xf8\xa8\x69\x9c\x6f\x9c\x9f\x8f\xf3\x8b\x71\x7e\x0a\xe7\xd7\xe0\xfc\x26\x9c\xdf\x81\xf3\xfb\x70\x7e\x06\xe7\x4f\xe1\xa3\xc1\x47\xe7\xe1\xa3\x63\xf8\xe8\x52\x7c\x74\x1a\x1f\x5d\x8f\x8f\x6e\xc5\x47\x77\xe3\xa3\x87\xf0\xd1\xe3\xf8\xe8\x59\x7c\x4c\x36\x3e\xa6\x00\x1f\x93\xc4\xc7\x54\xe0\x63\x6a\xf1\x31\xcd\xf8\x98\x4e\x7c\x4c\x3f\x3e\x26\x83\x8f\x99\xc2\xc7\x82\x8f\xcd\xc3\xc7\xc6\xf0\xb1\xa5\xf8\xd8\x34\x3e\xb6\x01\x1f\xdb\x8e\x8f\xed\xc3\xc7\x8e\xe0\x63\xa7\x70\x01\xb8\x20\x0f\x17\xc4\x70\x41\x29\x2e\x48\xe3\x82\x7a\x5c\xd0\x8a\x0b\x7a\x70\xc1\x10\x2e\x18\xc7\x05\xb3\x78\x51\x36\x5e\x54\x88\x17\x25\xf1\xa2\x0a\xbc\xa8\x16\x1f\x57\x8e\x8f\xab\xc1\xc7\x35\xe1\xe3\x3a\xf0\x71\x7d\xf8\xb8\x11\x7c\xdc\x24\x3e\x6e\x1e\x1f\x9f\x8b\x8f\x2f\xc2\xc7\x97\xe0\xe3\xd3\xf8\xf8\x7a\x7c\x7c\x2b\x3e\xbe\x1b\x1f\x3f\x88\x8f\x1f\xc3\xc7\xcf\xe0\xc2\x11\x5c\x38\x89\x0b\xe7\xf1\xe2\x5c\xbc\xb8\x08\x2f\x2e\xc1\x8b\x2b\xf1\xe2\x3a\xbc\xb8\x05\x2f\xee\xc6\x8b\x07\xf1\xe2\x71\x7c\xc2\x10\x3e\x61\x02\x9f\x30\x87\x97\xe4\xe0\x25\x85\x78\x49\x12\x2f\xa9\xc0\x4b\x6a\xf1\x92\x66\xbc\xa4\x13\x2f\xe9\xc7\x4b\x32\x78\xc9\x14\x2e\x02\x17\xe5\xe1\xa2\x18\x2e\x2a\xc5\x45\x69\x5c\xd4\x80\x8b\xda\x70\x51\x0f\x2e\x1a\xc2\x45\xe3\xb8\x68\x16\x2f\xcd\xc6\x4b\x0b\xf0\xd2\x04\x5e\x5a\x8e\x97\xd6\xe0\xa5\x4d\x78\x69\x07\x5e\xda\x87\x97\x8e\xe0\xa5\x93\x78\x19\x78\x59\x14\x2f\x2b\xc6\xcb\x52\x78\x59\x35\x5e\xd6\x88\x97\xb5\xe3\x65\xbd\x78\xd9\x30\x5e\x36\x81\x97\xcd\xe1\x13\xa3\xf8\xc4\x38\x8e\x55\xe1\x58\x03\x8e\xb5\xe1\x58\x0f\x8e\x0d\xe1\xd8\x38\x8e\xcd\xe2\x93\xb2\xf1\x49\x05\xf8\xa4\x24\x3e\xa9\x02\x9f\x54\x8b\x4f\x6a\xc6\x27\x75\xe2\x93\xfa\xf1\x49\x19\x7c\xd2\x34\x5e\x9e\x85\x97\x47\xf1\xf2\x38\x5e\x5e\x86\x97\x57\xe1\xe5\x0d\x78\x79\x3b\x5e\xde\x8b\x97\x0f\xe3\xe5\x13\xf8\xe4\x41\x7c\xf2\x04\x8e\x67\x70\x7c\x0a\x9f\x02\x3e\x65\x0a\x9f\x0a\x3e\x35\x8a\x4f\x8d\xe3\x53\xcb\xf0\xa9\x55\xf8\xd4\x46\x7c\x6a\x3b\x3e\xb5\x17\x9f\x36\x88\x4f\x1b\xc7\xa7\xcd\xe2\xe2\x6c\x5c\x5c\x80\x8b\x93\xb8\xb8\x02\x17\xd7\xe2\xe2\x66\x5c\xdc\x85\x8b\x07\x70\xf1\x28\x2e\x9e\xc6\x2b\xb2\xf0\x8a\x7c\xbc\x22\x81\x57\x94\xe3\x15\x35\x78\x45\x13\x5e\xd1\x81\x57\xf4\xe1\x15\x23\x78\xc5\x24\x5e\x31\x8f\x57\xe6\xe1\x95\x31\xbc\xb2\x14\xaf\x4c\xe3\x95\xf5\x78\x65\x2b\x5e\xd9\x8d\x57\x0e\xe2\x95\x63\x78\xe5\x2c\x3e\x3d\x1b\x9f\x5e\x80\x4f\x4f\xe0\xd3\xcb\xf1\xe9\x35\xf8\xf4\x26\x7c\x7a\x27\x3e\xbd\x1f\x9f\x9e\xc1\xa7\x4f\xe1\x04\x38\x11\xc5\x89\x62\x9c\x48\xe1\x44\x35\x4e\x34\xe2\x44\x07\x4e\xf4\xe1\xc4\x08\x4e\x4c\xe2\xc4\x3c\x5e\x95\x87\x57\xc5\xf0\xaa\x52\xbc\x2a\x8d\x57\xd5\xe3\x55\xad\x78\x55\x37\x5e\x35\x88\x57\x8d\xe1\x55\x33\xf8\x8c\x6c\x7c\x46\x01\x3e\x23\x81\xcf\xa8\xc0\x67\xd4\xe2\x33\x9a\xf1\x19\x9d\xf8\x8c\x7e\x7c\x46\x06\x9f\x31\x8d\x57\x1b\xaf\xce\xc7\xab\x8b\xf1\xea\x14\x5e\x5d\x8d\x57\x37\xe2\xd5\xed\x78\x75\x2f\x5e\x3d\x8c\x57\x4f\xe1\x24\x38\x19\xc5\xc9\x38\x4e\x96\xe1\x64\x15\x4e\x36\xe0\x64\x3b\x4e\xf6\xe2\xe4\x30\x4e\x4e\xe0\xe4\x1c\x5e\x93\x83\xd7\x14\xe1\x35\x25\x78\x6d\x05\x5e\x5b\x8b\xd7\x36\xe3\xb5\x9d\x78\x6d\x3f\x5e\x9b\xc1\x6b\xa7\xf1\x99\xc6\x67\xe6\xe3\x33\x8b\xf1\x99\xe5\xf8\xcc\x1a\x7c\x66\x13\x3e\xb3\x03\x9f\xd9\x8f\xcf\xcc\xe0\x33\xa7\x70\x49\x2e\x2e\x29\xc2\x25\x25\xb8\xa4\x12\x97\xd4\xe1\x92\x0e\x5c\xd2\x87\x4b\x46\x70\xc9\x24\x2e\x99\xc7\x67\xe5\xe2\xb3\x62\x78\x5d\x03\x5e\xd7\x86\xd7\xf5\xe0\x75\x43\x78\xdd\x38\x5e\x37\x8b\xcf\xce\xc6\x67\x17\xe0\xb3\x13\xf8\xec\x0a\x7c\x76\x2d\x3e\xbb\x19\x9f\xdd\x89\x4b\x7b\x71\xe9\x30\x2e\x9d\xc0\xa5\xf3\xf8\x9c\x5a\x7c\x4e\x0b\x3e\xa7\x1b\x9f\x3b\x83\xcb\x8c\xcb\xf2\x71\x59\x09\x3e\xaf\x1a\x9f\xd7\x84\xcf\xeb\xc0\xe7\xf5\xe1\xf3\x46\xf0\x79\x93\xf8\xbc\x79\xbc\x3e\x17\xaf\x8f\xe1\xf5\x65\x78\x7d\x15\x5e\xdf\x82\xd7\x77\xe1\xf5\x03\x78\xfd\x28\x5e\x3f\x8d\x53\x51\x9c\x8a\xe3\x54\x19\x4e\x55\xe1\x54\x03\x4e\xb5\xe1\x54\x0f\x4e\x0d\xe1\xd4\x04\x4e\xcd\xe1\x0d\xb9\x78\x43\x0c\x6f\x28\xc5\x1b\xaa\xf0\x86\x06\xbc\xa1\x0d\x6f\xe8\xc5\x1b\x86\xf1\x86\x49\xbc\x61\x1e\x6f\xcc\xc5\x1b\x8b\xf0\xc6\x12\xbc\xb1\x12\x6f\xac\xc3\x1b\x5b\xf1\xc6\x6e\xbc\x71\x08\x97\x97\xe3\xf2\x1a\x5c\xde\x84\xcb\x3b\x71\x79\x3f\x2e\xcf\xe0\xf2\x69\xbc\x29\x0b\x6f\x8a\xe2\x4d\x71\xbc\xa9\x02\x6f\xaa\xc5\x9b\x9a\xf1\xa6\x4e\xbc\xa9\x1f\x6f\xca\xe0\x4d\x53\x78\x33\x78\x73\x1e\xde\x1c\xc3\x9b\x4b\xf1\xe6\x34\xde\x5c\x8f\x37\xb7\xe3\xf3\x33\xf8\xfc\x69\x5c\x91\x85\x2b\xa2\xb8\x22\x8e\x2b\xca\x70\x45\x15\xae\x68\xc4\x15\x1d\xb8\xa2\x0f\x5f\x30\x83\x2f\xcc\xc6\x17\x16\xe0\x0b\x13\xf8\xc2\x72\x7c\x61\x0d\xbe\xb0\x19\x5f\xd8\x89\x2f\xec\xc7\x17\x8e\xe2\x0b\xa7\xf1\x45\x59\xf8\xa2\x28\xae\xec\xc4\x95\x83\xb8\x72\x0c\x57\xce\xe0\x8b\xb3\xf1\xc5\x05\xf8\xe2\x24\xbe\xb8\x02\x5f\x5c\x87\x2f\x6e\xc1\x17\x77\xe1\x8b\x07\xf0\xc5\x63\x78\x0b\x78\x4b\x1e\xde\x12\xc3\xe9\x0c\x4e\x4f\xe3\xad\x59\x78\x6b\x3e\xde\x5a\x8c\xb7\xa6\xf0\xd6\x1a\xbc\xad\x13\x6f\xeb\xc7\xdb\x46\xf1\xb6\x69\xbc\x3d\x0b\x6f\x8f\xe1\xed\xa5\x78\x7b\x15\xae\x1a\xc0\x55\xa3\xb8\x6a\x1a\x5f\x92\x85\x2f\x89\xe2\x4b\xe2\xf8\x92\x32\x7c\x49\x15\xbe\x14\x7c\x69\x21\xbe\xb4\x14\x5f\x9a\xc6\x97\x36\xe1\x4b\x3b\xf0\xa5\x7d\xf8\xd2\x11\x7c\xe9\x24\xbe\x74\x1e\x57\xe7\xe2\xea\x22\x5c\x5d\x82\xab\x2b\x71\x75\x1d\xae\x6e\xc1\xff\x6f\x14\x5f\xd6\x80\x2f\x6b\xc3\x97\xf5\xe0\xcb\x86\xf0\x65\xe3\xf8\xb2\x59\x5c\x93\x8d\x6b\x0a\x70\x4d\x02\xd7\x94\xe3\x9a\x1a\x5c\xd3\x84\x6b\x3a\x70\x4d\x1f\xae\x19\xc1\xff\xd6\x82\xff\xad\x0b\xff\xdb\x20\xbe\x3c\x89\x2f\xaf\xc0\x97\xd7\xe2\xcb\x9b\xf1\xe5\x9d\xf8\xf2\x7e\x7c\x79\x06\x5f\x3e\x85\x6b\xc1\xb5\x51\x5c\x9b\xc0\xb5\xe5\xb8\xb6\x06\xd7\x36\xe1\x2b\xaa\xf1\x15\x8d\xf8\x8a\x76\x7c\x45\x2f\xbe\x62\x18\x5f\x31\x81\xaf\x98\xc3\x57\xe6\xe0\x2b\x0b\xf1\x95\x49\x7c\x65\x05\xbe\xb2\x16\x5f\xd9\x8c\xaf\xec\xc4\x57\xf6\xe3\x2b\x33\xf8\xca\x29\x7c\x15\xf8\xaa\x42\x7c\x55\x12\x5f\x55\x81\xaf\xaa\xc5\x57\x35\xe3\xab\x3a\xf1\x55\xfd\xf8\xaa\x0c\xbe\x6a\x0a\xd7\x81\xeb\xf2\x70\x5d\x0c\xd7\x95\xe2\xba\x34\xae\xab\xc7\x75\xad\xb8\xae\x1b\xd7\x0d\xe2\xba\x31\x5c\x37\x83\xbf\x67\xfc\xbd\x7c\xfc\xbd\x62\xfc\xbd\x14\xfe\xf7\x7e\xfc\xef\x19\xfc\xef\x53\xf8\x6a\xf0\xd5\x79\xf8\xea\x18\xbe\xba\x14\x5f\x9d\xc6\x57\xd7\xe3\xab\x5b\xf1\xd5\x23\xb8\x3e\x17\xd7\x77\xe2\xff\xc8\xc7\xff\x31\x86\xff\x63\x06\x5f\xd3\x80\xaf\x69\xc3\xd7\xf4\xe0\x6b\x86\xf0\x35\x13\xf8\x9a\x39\xfc\x9f\x6d\xf8\x3f\x7b\xf0\x7f\x0e\xe1\xff\x1c\xc7\xff\x39\x8b\x1b\xb2\x71\x43\x01\x6e\x48\xe0\x86\x72\xdc\x50\x83\x1b\x9a\x70\xc3\x1c\xbe\xb6\x0e\x5f\x97\x8f\xaf\x2b\xc6\xd7\xa5\xf0\x75\xd5\xf8\xba\x46\x7c\x5d\x3b\xbe\xae\x17\x5f\x37\x8c\xaf\x9b\xc0\xd7\xcd\xe1\xeb\x73\xf0\xf5\x85\xf8\xfa\x12\x7c\x7d\x25\xbe\xbe\x0e\x5f\xdf\x82\xaf\xef\xc2\xd7\x0f\xe0\xeb\x47\xf1\xf5\xd3\xb8\x31\x0b\x37\x46\x71\x63\x1c\x37\x96\xe1\xc6\x2a\xdc\xd8\x80\x1b\xdb\x70\x63\x0f\x6e\x1c\xc2\x8d\xe3\xb8\x71\x16\x7f\x3f\x1b\x7f\xbf\x00\x7f\x3f\x81\xbf\x5f\x8e\xbf\x5f\x83\xbf\xdf\x84\xbf\xdf\x81\xbf\xdf\x87\xbf\x3f\x82\xbf\x3f\x89\xbf\x3f\x8f\x6f\xc8\xc5\x37\x14\xe1\x1b\x4a\xf1\x0d\x69\x7c\x43\x3d\xbe\xa1\x15\xdf\xd0\x8d\x6f\x18\xc4\x37\x8c\xe1\x1b\x66\xf0\x0f\x8c\x7f\x90\x8f\x7f\x50\x8c\x7f\x90\xc2\x3f\x98\xc6\x4d\x59\xb8\x29\x8a\x9b\xe2\xb8\xa9\x0c\x37\x55\xe3\x1f\xd6\xe1\x1f\xb6\xe0\x1f\x76\xe1\x1f\x0e\xe0\x1f\x8e\xe2\x1f\xce\xe0\x1b\x8d\x6f\xcc\xc7\x37\x16\xe3\x1b\x53\xf8\xc6\x6a\x7c\x63\x23\xbe\xb1\x1d\xdf\xd8\x8b\x6f\x1c\xc6\x37\x4e\xe3\x1f\x65\xe1\xe6\x1e\x7c\x53\x2d\xbe\x69\x1a\xff\xb8\x1b\xff\x57\x2d\x6e\x29\xc1\x2d\x95\xb8\xa5\x1e\xb7\xb4\xe2\x96\x6e\x7c\x73\x01\xbe\x39\x81\x6f\x2e\xc7\x37\xd7\xe0\x9b\x9b\xf0\xcd\x1d\xf8\x16\xe3\x5b\xda\xf1\x2d\x7d\xf8\x96\x51\x7c\xcb\x34\x6e\xcd\xc2\xad\x51\xdc\x1a\xc7\xad\x65\xb8\xb5\x0a\xb7\x36\xe0\xd6\x76\x7c\x6b\x33\xbe\xb5\x13\xdf\xda\x8f\x6f\x1d\xc5\xb7\x4e\xe3\xdb\xb2\xf0\x6d\x51\x7c\x5b\x1c\xdf\x56\x89\x6f\xab\xc3\xb7\xb5\xe0\xdb\xba\xf0\x6d\x03\xf8\xb6\x51\x7c\xdb\x0c\xbe\xdd\xf8\xf6\x02\x7c\x7b\x02\xdf\x5e\x8e\x6f\xaf\xc1\xb7\x37\xe3\xdb\x3b\xf1\xed\xfd\xf8\xf6\x0c\xbe\x7d\x0a\xb7\x81\xdb\xf2\x70\x5b\x0c\xb7\x95\xe1\xb6\x2a\xdc\xd6\x80\xdb\xda\x70\x5b\x0f\x6e\x1b\xc2\x6d\xe3\xb8\x6d\x16\xdf\x91\x8d\xef\x28\xc0\x77\x24\xf0\x1d\xe5\xf8\x27\xe0\x9f\x34\xe3\xf6\x42\xdc\xde\x87\xdb\x33\xb8\x7d\x0a\xff\x34\x85\x7f\x5a\x8d\x7f\xda\x88\x7f\xda\x8e\x7f\xda\x8b\x7f\x3a\x8c\x7f\x3a\x81\x7f\x3a\x87\x7f\xd6\x81\x7f\xd6\x87\x7f\x96\xc1\x3f\x9b\xc2\x77\x82\xef\xcc\xc3\x77\xc6\xf0\x9d\xa5\xf8\xce\x34\xbe\xb3\x1e\xdf\xd9\x8a\xef\xec\xc6\x77\x0e\xe2\x3b\xc7\xf0\x9d\x33\xb8\xc3\xb8\x23\x1f\x77\x24\x70\x47\x39\xee\xa8\xc1\x1d\x4d\xb8\xa3\x13\x77\xf4\xe3\x8e\x0c\xfe\xdf\x4a\xfc\xbf\xbd\xf8\xe7\x29\xfc\xf3\x19\xfc\x7f\x6d\xb8\xb3\x03\xff\x22\x8e\x7f\x51\x86\x7f\x31\x8f\x7f\x99\x8b\x7f\x59\x84\x7f\x59\x82\x7f\x59\x89\x7f\x59\x87\xef\x2a\xc2\x77\x95\xe0\xbb\x2a\xf1\x5d\xf5\xf8\xae\x56\x7c\x57\x37\xbe\x6b\x10\xdf\x35\x86\xef\x9a\xc5\x5d\xd9\xb8\xab\x00\x77\x25\x70\x57\x39\xee\xaa\xc1\x5d\x4d\xb8\xab\x03\x77\xf5\xe1\xae\x11\xdc\x35\x89\xbb\xe6\xf1\xdd\xb9\xf8\xee\x22\x7c\x77\x09\xbe\xbb\x12\xdf\x5d\x87\xef\x6e\xc1\x77\x77\xe1\xbb\x07\xf0\x3d\x55\xf8\x9e\x06\x7c\x4f\x1b\xbe\xa7\x07\xdf\x33\x84\xef\x19\xc7\xf7\xcc\xe2\x5f\x65\xe3\x5f\x15\xe0\x5f\x25\xf0\xaf\xca\xf1\xaf\x6a\xf0\xaf\x9a\xf0\xaf\x3a\x70\x77\x15\xee\x6e\xc0\xdd\x6d\xb8\xbb\x07\x77\x0f\xe1\xee\x71\xdc\x3d\x8b\xef\xcd\xc6\xf7\x16\xe0\x7b\x13\xf8\xde\x72\x7c\x6f\x0d\xbe\xb7\x09\xdf\xdb\x81\xef\xed\xc3\xf7\x8e\xe0\x7b\x27\xf1\xbd\xf3\xf8\xbe\x5c\x7c\x5f\x11\xbe\xaf\x04\xdf\x57\x89\xef\xab\xc3\xf7\xb5\xe0\xfb\xba\xf0\x7d\x03\xf8\xbe\x51\x7c\xdf\x34\xfe\x75\x16\xfe\x75\x14\xf7\x18\xf7\xe4\xe3\x9e\x62\xdc\x93\xc2\x3d\x35\xb8\xa7\x19\xf7\x74\xe2\x9e\x7e\xdc\x93\xc1\x3d\x53\xf8\x7e\xf0\xfd\x79\xf8\xfe\x18\xbe\xbf\x14\xdf\x9f\xc6\xf7\xd7\xe3\xfb\x5b\xf1\xfd\xdd\xf8\xfe\x41\x7c\xff\x18\xbe\x7f\x06\x3f\x60\xfc\x40\x3e\x7e\xa0\x18\x3f\x90\xc2\x0f\x54\xe3\x07\x1a\xf1\x03\xed\xf8\x81\x5e\xfc\xc0\x30\x7e\x60\x02\x3f\x30\x87\x1f\xcc\xc1\x0f\x16\xe2\x07\x93\xf8\xc1\x0a\xfc\x60\x2d\x7e\xb0\x19\x3f\xd8\x89\x1f\xec\xc7\x0f\x66\xf0\x83\x53\xb8\x17\xdc\x9b\x87\x7b\x63\xb8\xb7\x14\xf7\xa6\x71\x6f\x3d\xee\x6d\xc5\xbd\xdd\xb8\x77\x10\xf7\x8e\xe1\xde\x19\xfc\x90\xf1\x43\xf9\xf8\xa1\x62\xfc\x50\x0a\x3f\x54\x8d\x1f\x6a\xc4\x0f\xb5\xe3\x87\x7a\xf1\x43\x23\xf8\xa1\x49\xfc\x70\x27\x7e\xb8\x1f\xff\xa6\x06\xff\xa6\x09\xff\xa6\x03\xff\x66\x00\xff\x66\x14\xff\x66\x06\xf7\x65\xe3\xbe\x02\xdc\x97\xc4\x7d\x15\xb8\xaf\x16\xf7\x35\xe3\xbe\x4e\xdc\xd7\x8f\xfb\x32\xb8\x6f\x0a\x3f\x02\x7e\x24\x0f\x3f\x12\xc3\x8f\x94\xe2\x47\xd2\xf8\x91\x7a\xfc\x48\x2b\x7e\xa4\x1b\x3f\x32\x88\x1f\x19\xc3\x8f\xcc\xe0\x47\xa3\xf8\xd1\x38\x7e\xb4\x0c\x3f\x5a\x85\x1f\x6d\xc0\x8f\xb6\xe1\x47\x7b\xf1\xa3\x23\xf8\xd1\x49\xfc\xe8\x3c\xfe\xed\x1c\xee\xcf\xc1\xfd\x85\xb8\x3f\x89\xfb\x2b\x70\x7f\x2d\xee\x6f\xc6\xfd\x9d\xb8\xbf\x1f\xf7\x67\x70\xff\x14\x7e\x0c\xfc\x58\x1e\x7e\x2c\x86\x1f\x2b\xc5\x8f\xa5\xf1\x63\xf5\xf8\xb1\x56\xfc\x58\x0f\x7e\x6c\x08\x3f\x36\x8e\x1f\x1f\xc0\x8f\x8f\xe2\xc7\xa7\xf1\x13\x59\xf8\x89\x28\x7e\x22\x8e\x9f\x28\xc3\x4f\x54\xe3\x27\x1a\xf1\x13\xed\xf8\x89\x5e\xfc\xc4\x08\x7e\x62\x0a\x0f\x80\x07\xa2\x78\x20\x8e\x07\xca\xf0\x40\x15\x1e\x68\xc0\x03\x6d\x78\xa0\x07\x0f\x0c\xe1\x81\x71\x3c\x30\x87\x9f\xcc\xc1\x4f\x16\xe2\x27\x93\xf8\xc9\x0a\xfc\x64\x2d\x7e\xb2\x05\x3f\xd9\x85\x9f\x1c\xc0\x4f\x8e\xe2\x27\xa7\xf1\x53\x59\xf8\xa9\x28\x7e\x2a\x8e\x9f\x2a\xc3\x4f\x55\xe1\xa7\x1a\xf0\x53\x6d\xf8\xa9\x1e\xfc\xd4\x30\x7e\x6a\x02\x3f\x35\x87\x9f\xce\xc1\x4f\x17\xe2\xa7\x93\xf8\xe9\x0a\xfc\x74\x2d\x7e\xba\x19\x3f\xdd\x89\x9f\xee\xc7\x4f\x67\xf0\xd3\x53\x78\x10\x3c\x98\x87\x07\x63\x78\xb0\x14\x0f\xa6\xf1\x60\x3d\x1e\x6c\xc5\x83\xdd\x78\x70\x10\x0f\x8e\xe1\xc1\x59\xfc\xbb\x6c\xfc\xbb\x02\xfc\xbb\x24\xfe\x5d\x05\xfe\x5d\x1d\xfe\x5d\x1b\xfe\x5d\x0f\xfe\xdd\x10\xfe\xdd\x04\xfe\xdd\x3c\x7e\x26\x17\x3f\x13\xc3\xcf\x94\xe2\x67\xd2\xf8\x99\x7a\xfc\x4c\x2b\x7e\xa6\x07\x3f\x33\x84\x9f\x99\xc0\xcf\xcc\xe1\x67\x73\xf1\xb3\x45\xf8\xd9\x12\xfc\x6c\x25\x7e\xb6\x1e\x3f\xdb\x8a\x9f\xed\xc6\xcf\x0e\xe2\x67\xc7\xf0\xb3\x33\x78\xc8\x78\x28\x1f\x0f\x15\xe3\xa1\x72\x3c\x54\x83\x87\x9a\xf0\xef\x6b\xf1\xef\x9b\xf1\xef\x3b\xf1\xef\xfb\xf1\xef\x33\xf8\xf7\xd3\xf8\x0f\x59\xf8\x0f\xf9\xf8\xb9\x3c\xfc\x5c\x0c\x3f\x57\x86\x9f\xab\xc2\xcf\x35\xe0\xe7\xda\xf0\x73\x3d\xf8\xb9\x61\xfc\xdc\x04\x7e\x6e\x0e\x0f\xe7\xe0\xe1\x42\x3c\x9c\xc4\xc3\x15\xf8\xf9\x38\x7e\xbe\x0c\x3f\x5f\x85\x9f\x6f\xc0\xcf\xb7\xe1\xe7\x7b\xf1\xf3\xc3\xf8\xf9\x09\xfc\xfc\x1c\x7e\x21\x17\xbf\x10\xc3\x2f\x94\xe2\x17\xd2\xf8\x85\x7a\xfc\x42\x2b\x7e\xa1\x1b\xbf\x30\x88\x5f\x18\xc3\x2f\xcc\xe0\x3f\x1a\xff\x31\x1f\xff\x31\x81\xff\x58\x8e\xff\x58\x83\xff\xd8\x8c\xff\xd8\x89\xff\xd8\x8f\xff\x98\xc1\x7f\x9c\xc2\x23\xe0\x91\x28\x1e\x89\xe3\x91\x32\x3c\x52\x85\x47\x1a\xf0\x48\x3b\x1e\xe9\xc5\x23\x23\x78\x64\x0a\xbf\x98\x85\x5f\xcc\xc7\x2f\x16\xe3\x17\x53\xf8\xc5\x6a\xfc\x62\x13\x7e\xb1\x13\xbf\xd8\x8f\x5f\xcc\xe0\x17\xa7\xf0\x4b\xe0\x97\xf2\xf0\x4b\x31\xfc\x52\x29\x7e\x29\x8d\x5f\xaa\xc7\x2f\xb5\xe2\x97\xba\xf1\x4b\x83\xf8\xa5\x31\xfc\xd2\x0c\xfe\x93\xf1\x9f\xf2\xf1\x9f\x8a\xf1\x9f\x52\xf8\x4f\x35\xf8\x4f\x4d\xf8\x4f\x1d\xf8\x4f\x7d\xf8\x4f\x19\xfc\xa7\x29\x9c\x01\x67\xf2\x70\x26\x86\x33\xa5\x38\x93\xc6\x99\x7a\x9c\x69\xc5\x99\x6e\x9c\x19\xc4\x99\x31\x9c\x99\xc1\x2f\x1b\xbf\x9c\x8f\x5f\x2e\xc6\x2f\xa7\xf0\xcb\xd5\xf8\xe5\x46\xfc\x72\x3b\x7e\xb9\x17\xbf\x3c\x8c\x5f\x9e\xc4\x2f\xcf\xe3\x57\xf2\xf0\x2b\x31\xfc\x4a\x29\x7e\x25\x8d\x5f\xa9\xc7\xaf\xb4\xe2\x57\xba\xf1\x2b\x43\xf8\x95\x71\xfc\xca\x2c\x1e\x35\x1e\xcd\xc7\xa3\xc5\x78\x34\x85\x47\xab\xf1\x68\x23\x1e\xed\xc0\xa3\x7d\x78\x74\x04\x8f\x4e\xe2\xd1\x79\xfc\x6a\x2e\x7e\xb5\x08\xbf\x5a\x8a\x5f\x4d\xe3\x57\xeb\xf1\xab\xad\xf8\xd5\x6e\xfc\xea\x20\x7e\x75\x0c\xbf\x3a\x83\xff\x62\xfc\x97\x7c\xfc\x97\x62\xfc\x97\x72\xfc\x97\x1a\xfc\x5a\x2b\x7e\xad\x1b\xbf\x36\x88\x5f\x1b\xc3\xaf\xcd\xe0\xb1\x1c\x3c\x56\x88\xc7\x92\x78\xac\x02\x8f\xd5\xe2\xb1\x66\x3c\xd6\x89\xc7\xfa\xf1\x58\x06\x8f\x4d\xe1\xd7\xc1\xaf\xe7\xe1\xd7\x63\xf8\xf5\x52\xfc\x7a\x1a\xbf\xde\x80\x5f\x6f\xc3\xaf\xf7\xe0\xd7\x87\xf0\xeb\xe3\xf8\xf5\x59\xfc\x46\x36\x7e\xa3\x00\xbf\x91\xc0\x6f\x94\xe3\x37\x6a\xf0\x1b\xcd\xf8\x8d\x4e\xfc\x46\x3f\x7e\x23\x83\xdf\x98\xc6\x6f\x66\xe1\x37\xa3\xf8\xcd\x38\x7e\xb3\x0c\xbf\x59\x85\xdf\x6c\xc0\x6f\xb6\xe1\x37\x7b\xf1\x9b\xc3\xf8\xcd\x09\xfc\xe6\x1c\x1e\xcf\xc1\xe3\x45\x78\xbc\x04\x8f\xa7\xf1\x78\x3d\x1e\x6f\xc5\xe3\xdd\xf8\xaf\x43\xf8\xaf\x53\xf8\x2d\xf0\x5b\x51\xfc\x56\x1c\xbf\x55\x86\xdf\xaa\xc2\x6f\x35\xe0\xb7\xda\xf0\x5b\x3d\xf8\xad\x61\xfc\xd6\x04\x7e\x6b\x1e\xbf\x9d\x8b\xdf\x2e\xc2\x6f\x97\xe0\xb7\x2b\xf1\xdb\xf5\xf8\xed\x36\xfc\x76\x0f\x7e\x7b\x08\xbf\x3d\x81\xdf\x9e\xc3\x13\x39\x78\xa2\x10\x4f\x94\xe3\x89\x1a\x3c\xd1\x84\x27\x3a\xf0\x44\x1f\x9e\x18\xc1\x13\x53\xf8\x6f\x59\xf8\x6f\x51\xfc\x4e\x19\x7e\xa7\x0a\xbf\xd3\x80\xdf\x69\xc3\xef\xf4\xe0\x77\x86\xf0\x3b\xe3\xf8\x9d\x59\xfc\x6e\x36\x7e\xb7\x00\xbf\x9b\xc0\xef\x56\xe0\x77\x6b\xf1\xbb\xcd\xf8\xdd\x4e\xfc\x6e\x3f\x7e\x37\x83\xdf\x9d\xc2\x93\x59\x78\x32\x1f\x4f\x16\xe3\xc9\x14\x9e\xac\xc6\x93\x8d\x78\xb2\x1d\x4f\xf6\xe2\xc9\x61\x3c\x39\x81\xdf\xcb\xc1\xef\x15\xe2\xf7\x92\xf8\xbd\x0a\xfc\x5e\x2d\x7e\xaf\x19\xbf\x5f\x8a\xdf\x4f\xe3\xf7\x9b\xf0\xfb\x1d\xf8\xfd\x3e\xfc\xfe\x08\xfe\xa0\x17\x7f\xf0\x95\x93\x78\x6a\x0a\xef\xc8\xc2\x3b\xf2\xf1\x8e\x62\xbc\x23\x85\x77\x54\xe3\x1d\x8d\x78\x47\x3b\xde\xd1\x8b\x77\x0c\xe3\x1d\x93\x78\xc7\x3c\xfe\x30\x17\x7f\x58\x84\x3f\x2c\xc1\x1f\x56\xe2\x0f\xeb\xf0\x47\xed\xf8\xa3\x3e\xfc\xd1\x08\xfe\x68\x12\x7f\x34\x8f\xa7\x73\xf1\x74\x11\x9e\x2e\xc1\xd3\x95\x78\xba\x0e\x4f\xb7\xe0\xe9\x2e\x3c\x3d\x88\xa7\xc7\xf0\xf4\x2c\xfe\x7b\x36\xfe\x7b\x01\xfe\x7b\x12\xff\xbd\x02\x7f\xdc\x82\x3f\xee\xc2\x1f\x0f\xe0\x8f\x47\xf1\x4c\x16\x9e\x29\xc0\x33\x49\x3c\x53\x81\x67\x6a\xf1\x4c\x33\x9e\xe9\xc4\x33\xfd\x78\x26\x83\x77\x46\xf1\xce\x38\xde\x59\x86\x77\x56\xe1\x9d\x0d\x78\x67\x1b\xde\xd9\x83\x77\x0e\xe1\x9d\xe3\x78\xe7\x2c\xde\x95\x83\x77\x15\xe2\x5d\x25\x78\x57\x25\xde\x55\x87\x77\xb5\xe0\x5d\x5d\x78\xd7\x00\xde\x35\x8a\x77\x4d\xe3\xd9\x2c\x3c\x1b\xc5\xb3\x71\x3c\x5b\x81\x67\x6b\xf1\x6c\x0b\x9e\xed\xc2\xb3\x03\x78\x76\x14\xcf\x4e\xe3\xdd\x59\x78\x77\x14\xef\x8e\xe3\xdd\x65\x78\x77\x35\xde\xdd\x88\x3f\xad\xc1\x9f\x36\xe1\x4f\x3b\xf0\xa7\x7d\xf8\xd3\x11\xfc\xe9\x24\xfe\x0c\xfc\x59\x1e\xfe\x2c\x86\x3f\x2b\xc5\x73\x09\x3c\x57\x81\xe7\x6a\xf1\x5c\x0b\x9e\xeb\xc1\x73\x43\x78\x6e\x02\xef\xc9\xc2\x7b\x0a\xf1\x9e\x24\xde\x53\x81\xf7\xd4\xe1\x3d\x2d\x78\x4f\x17\xde\x33\x80\xf7\x8c\xe2\x3d\xd3\xf8\xf3\x2c\xfc\x79\x14\x7f\x5e\x8c\x3f\x4f\xe1\xcf\x6b\xf0\xe7\x4d\xf8\x9f\x63\xf8\x9f\x33\x78\xde\x78\x3e\x1f\xcf\x17\xe3\xf9\x14\x9e\xaf\xc6\xf3\x8d\x78\xbe\x1d\xcf\xf7\xe2\x2f\xba\xf1\x17\x83\xf8\x8b\x31\xfc\xc5\x2c\xde\x9b\x8d\xf7\x16\xe0\xbd\x09\xbc\xb7\x1a\xef\x6d\xc4\x7b\xdb\xf1\xde\x3e\xbc\x77\x04\xef\x9d\xc4\x7b\xe7\xf1\x97\x79\xf8\xcb\x18\xfe\xb2\x14\x7f\x99\xc6\x5f\x36\xe1\x2f\x3b\xf0\x97\x7d\xf8\xcb\x11\xfc\xe5\x24\x01\x08\xe4\x11\x88\x11\x28\x25\x90\x26\x50\x4f\xa0\x95\x40\x37\x81\x21\x02\xe3\x04\x66\x09\x0b\x72\x08\x0b\x8a\x08\x0b\x4a\x08\x0b\x2a\x09\x0b\xea\x09\x0b\x5a\x09\x0b\xba\x09\x0b\x06\x09\x0b\xc6\x08\x0b\x66\x08\xfb\x98\xb0\x4f\x01\x61\x9f\x24\x61\x9f\x0a\xc2\x3e\x8d\x84\x7d\x3a\x08\xfb\xf4\x11\xf6\xc9\x10\xf6\x99\x26\xec\x9b\x45\xd8\x37\x4a\xd8\x37\x4e\xd8\xb7\x8c\xb0\x6f\x15\x61\xdf\x06\xc2\xbe\x6d\x84\x7d\x7b\x08\xfb\x0e\x11\xb2\x06\x09\x59\x63\x84\xac\x39\xc2\x7e\x39\x84\xfd\x0a\x09\xfb\x25\x09\x91\x1a\x82\x6a\x09\x6a\x21\xa8\x9b\xa0\x0c\x41\xd3\x04\x9b\xe0\x7c\x82\x8b\x09\x4e\x11\x5c\x4d\x70\x23\xc1\x5d\x04\x0f\x10\xc2\x30\x21\x4c\x10\xc2\x1c\x61\x61\x0e\x61\x61\x21\x61\x61\x92\xb0\xb0\x82\xb0\xb0\x96\xb0\xb0\x85\xb0\xb0\x8b\xb0\x70\x80\xb0\x70\x8c\xb0\x70\x86\xb0\x7f\x36\x61\xff\x42\xc2\xfe\x49\xc2\xfe\x15\x84\xfd\x6b\x09\xd9\x6d\x84\xec\x1e\x42\xf6\x10\x21\x7b\x82\x90\x3d\x47\x38\x20\x87\x70\x40\x11\xe1\x80\x12\xc2\x01\x95\x84\x03\xea\x08\x07\xb4\x12\x0e\xe8\x26\x1c\x30\x44\x38\x60\x82\x70\xc0\x1c\xe1\x6b\xb9\x84\xaf\x15\x11\x0e\x2c\x21\x1c\x58\x49\x38\xb0\x8e\x70\x60\x0b\xe1\xc0\x2e\xc2\x81\x03\x84\x03\x47\x09\x07\x4e\x13\x72\xb2\x08\x39\xf9\x84\x9c\x62\x42\x4e\x8a\x90\x53\x4d\xc8\x69\x24\xe4\xb4\x13\x72\xfa\x08\x39\x19\x42\xce\x14\xe1\x20\x08\x07\x45\x09\x07\x15\x13\x0e\x2a\x27\x1c\x54\x47\x38\xa8\x85\x70\x50\x17\xe1\xa0\x41\xc2\x41\xe3\x84\x83\xe6\x08\x07\xe7\x10\x0e\x2e\x22\x1c\x5c\x4a\x38\x38\x4d\xf8\x97\x26\x42\x6e\x0f\x21\x77\x98\x90\x3b\x41\x38\xb4\x88\x70\x68\x09\xe1\xd0\x4a\xc2\xa1\x75\x84\x43\x5b\x08\x87\x76\x11\x0e\x1d\x20\x1c\x3a\x4a\x38\x74\x9a\x70\x98\x09\x87\xe5\x13\x0e\x4b\x10\x0e\x2b\x27\x1c\x56\x43\x38\xac\x89\x70\x58\x07\xe1\xb0\x3e\xc2\x61\x23\x84\xc3\x26\x09\x87\xcd\x13\xf2\xf2\x08\x79\x31\x42\x5e\x29\x21\x2f\x4d\xc8\x6b\x20\xe4\xb5\x11\x0e\xef\x21\x1c\x3e\x44\x38\x7c\x9c\x70\xf8\x2c\xe1\x88\x1c\xc2\x11\x85\x84\x23\x92\x84\x23\x2a\x09\x47\xd4\x11\x8e\x68\x27\x1c\xd1\x4b\x38\x62\x98\x70\xc4\x04\xe1\x88\x79\x42\x34\x4e\x88\x96\x11\xa2\x55\x84\x68\x03\x21\xda\x4e\x88\xf6\x12\xa2\xc3\x84\xe8\x04\x21\x3a\x4f\x38\x32\x97\x70\x64\x11\xe1\x1b\x85\x84\x6f\x94\x10\xbe\x91\x26\x1c\x35\x48\x38\x6a\x8c\x70\xd4\x0c\x21\xdf\x84\xfc\x04\x21\xbf\x9c\x70\xf4\x20\xe1\xe8\x31\xc2\xd1\x33\x84\x63\x4c\x38\x26\x9f\x70\x4c\x31\xe1\x98\x14\xe1\x98\x6a\xc2\x31\x8d\x84\x63\xda\x09\xc7\xf4\x11\x8e\x19\x21\x14\xe4\x12\x0a\x8a\x08\x05\xa5\x84\x82\x34\xa1\xa0\x9e\x50\xd0\x41\x28\xe8\x23\x14\x7c\x75\x9f\x24\x2c\x82\xb0\x28\x8f\xb0\x28\x4e\x58\x54\x46\x58\x54\x4d\x58\xd4\x48\x58\xd4\x4e\x58\xd4\x4b\x58\x34\x42\x58\x34\x49\x38\x3e\x8b\x50\x98\x20\x14\x56\x10\x0a\xeb\x08\x85\x2d\x84\xc2\x6e\x42\xe1\x20\xa1\x70\x8c\x50\x38\x43\x58\x6c\xc2\xe2\x7c\xc2\xe2\x52\xc2\xe2\x2a\xc2\xe2\x06\xc2\xe2\x36\xc2\xe2\x1e\xc2\x92\x2c\xc2\x92\x28\x61\x49\x9c\xb0\xa4\x8c\xb0\xa4\x8a\xb0\xa4\x81\xb0\xa4\x8d\xb0\xa4\x97\xb0\x64\x84\xb0\x64\x92\xb0\x34\x4a\x58\x5a\x4e\x58\x5a\x4b\x58\xda\x42\x58\xda\x45\x58\x3a\x40\x58\x3a\x4a\x58\x3a\x43\x58\x66\xc2\xb2\x7c\xc2\xb2\x04\x61\x59\x39\x61\x59\x2d\x61\x59\x33\x61\x59\x17\x61\xd9\x00\x61\xd9\x28\x61\xd9\x34\xe1\xc4\x2c\x42\x2c\x45\x88\xd5\x10\x62\x4d\x84\x58\x27\x21\x36\x40\x88\x8d\x12\x62\x33\x84\x93\xb2\x09\x27\x15\x13\x96\x37\x12\x96\xb7\x13\x96\xf7\x11\x96\x8f\x10\x96\x4f\x11\x4e\x86\x70\x72\x1e\xe1\xe4\x38\xe1\xe4\x1a\xc2\xc9\x4d\x84\x93\x3b\x08\x27\xf7\x11\x4e\x1e\x21\x9c\x3c\x49\x38\x79\x9e\x10\xcf\x23\xc4\xe3\x84\x78\x8a\x10\xaf\x26\xc4\x9b\x08\xf1\x0e\x42\xbc\x8f\x10\x1f\x21\xc4\x27\x09\xf1\x79\xc2\x29\xb9\x84\x53\x8a\x08\xa7\x94\x12\x4e\x49\x13\x4e\xcb\x25\x9c\x56\x44\x38\x2d\x45\x28\x9e\x23\xac\xc8\x25\xac\x28\x22\xac\x28\x21\xac\xa8\x24\xac\xa8\x23\xac\xe8\x24\xac\x18\x20\xac\x18\x25\xac\x98\x21\xac\xcc\x26\xac\x2c\x20\xac\x4c\x10\x56\x56\x10\x4e\x9f\x21\x24\xb2\x09\x89\x02\x42\x22\x41\x48\x94\x13\x12\x35\x84\x44\x13\x21\xd1\x41\x48\xf4\x11\x12\x19\x42\x62\x9a\xb0\x2a\x8f\xb0\x2a\x46\x58\x55\x46\x58\x55\x45\x58\x35\x49\x38\xa3\x8c\x70\x46\x15\x61\x75\x21\x61\x75\x92\xb0\x7a\x92\xb0\x7a\x9e\x90\xcc\x23\x24\xfb\x09\xc9\x0c\x21\x39\x45\x58\x03\x61\x4d\x1e\x61\x4d\x8c\xb0\xa6\x94\xb0\x26\x4d\x58\x53\x4f\x58\xd3\x4a\x58\xd3\x4d\x58\x33\x48\x58\x33\x46\x58\x33\x43\x58\x9b\x4d\x58\x5b\x40\x58\x9b\x20\xac\x2d\x27\xac\xad\x21\xac\x6d\x22\xac\xed\x20\xac\xed\x23\xac\x1d\x21\xac\x9d\x24\xac\x9d\x27\x9c\x99\x4b\x38\xb3\x88\x70\x66\x09\xe1\xcc\x4a\xc2\x99\xf5\x84\x33\x5b\x09\x67\x76\x13\xce\x1c\x24\x9c\x39\x46\x38\x73\x86\x50\x62\x42\xc9\x30\xa1\x64\x82\x50\x32\x47\x38\x2b\x87\x70\x56\x8c\x70\x56\x29\xe1\xac\x34\xe1\xac\x7a\xc2\x59\xad\x84\xb3\xba\x09\x67\x0d\x12\xce\x9a\x20\x9c\x35\x47\x58\x97\x43\x58\x57\x48\x58\x97\x24\xac\xab\x20\xac\xab\x25\xac\x6b\x26\xac\xeb\x22\xac\x1b\x20\xac\x1b\x25\x9c\xdd\x4e\x38\xbb\x97\x70\xf6\x30\xe1\xec\x09\xc2\xd9\x73\x84\xd2\x1c\x42\x69\x21\xa1\x34\x49\x28\xad\x20\x94\xd6\x12\x4a\x9b\x09\xa5\x9d\x84\xd2\x7e\xc2\x37\xbb\x09\xdf\x1c\x24\x7c\x73\x8c\xf0\xcd\x19\xc2\x39\x26\x9c\x33\x43\x38\xd7\x84\x73\xf3\x09\xe7\x16\x13\xce\x4d\x11\xce\xad\x26\x9c\xdb\x48\x38\xb7\x83\x70\x6e\x1f\xe1\xdc\x0c\xa1\xac\x8f\x50\x36\x42\x28\x9b\x24\x94\xcd\x13\xce\xcb\x25\x9c\x57\x44\x38\x6f\x86\xb0\xde\x84\xf5\xf9\x84\xf5\xc5\x84\xf5\x29\xc2\xfa\x6a\xc2\xb7\xea\x08\xa9\x06\x42\xaa\x8d\x90\xea\x21\xa4\x86\x08\xa9\x71\x42\x6a\x96\xb0\x21\x9b\xb0\xa1\x80\xb0\x21\x49\xd8\x50\x41\xd8\x50\x4b\xd8\xd0\x4c\xd8\xd0\x49\xd8\x30\x40\xd8\x30\x4a\xd8\x30\x4d\xd8\x98\x45\xd8\x18\x25\x6c\x8c\x13\x36\x96\x11\x36\x56\x11\x36\x36\x12\x36\xb6\x13\x36\xf6\x11\x36\x66\x08\x1b\xa7\x08\xff\x0a\xe1\x5f\xf3\x08\xff\x5a\x4c\xf8\xd7\x14\xe1\x5f\xab\x09\xe5\x15\x84\xf2\x5a\x42\x79\x33\xa1\xbc\x93\x50\xde\x4f\x28\xcf\x10\xca\xa7\x08\x9b\x20\x6c\xca\x23\x6c\x8a\x13\x36\xa5\x08\x9b\xaa\x09\x9b\x2b\x08\x9b\xeb\x08\x9b\x5b\x08\x9b\xbb\x08\x9b\x07\x08\x9b\x47\x09\x9b\xa7\x09\xe7\xe7\x11\xce\x8f\x11\xce\x2f\x25\x9c\x9f\x26\x9c\x5f\x4f\x38\xbf\x95\x70\x7e\x37\xa1\xe2\xab\x06\x09\x15\xe3\x84\x8a\x79\xc2\x05\xb9\x84\x0b\x8a\x08\x17\x94\x10\x2e\x48\x13\x2e\xa8\x27\x5c\xd0\x4a\xb8\xa0\x9b\x70\xc1\x10\xe1\x82\x71\xc2\x05\xb3\x84\x0b\xb3\x09\x17\x16\x10\x2e\x4c\x10\x2e\x2c\x27\x5c\x94\x22\x5c\x54\x4d\xb8\xa8\x91\x50\xd9\x4e\xa8\xec\x25\x5c\xdc\x4e\xb8\xf8\x2b\x87\x09\x17\x4f\x10\x2e\x9e\x23\x7c\x7b\x8e\xb0\x25\x87\xb0\xa5\x88\xb0\xa5\x94\xb0\x25\x4d\xd8\x52\x4f\xd8\xd2\x4a\xd8\xd2\x4d\xd8\x32\x48\xd8\x32\x46\xd8\x32\x43\x48\x9b\x90\xce\x27\xa4\x8b\x09\xe9\x14\x21\x5d\x43\x48\x37\x11\xd2\x1d\x84\xf4\x00\x21\x3d\x46\xd8\x9a\x45\xd8\x1a\x25\x6c\x8d\x13\xb6\x96\x11\xb6\x56\x11\xb6\x36\x10\xb6\xb6\x13\xb6\xf6\x12\xb6\x0e\x13\xb6\x4e\x10\xb6\xce\x11\xb6\xe5\x10\xb6\x15\x12\xb6\x25\x09\xdb\x2a\x09\xdb\xea\x08\xdb\x5a\x08\xdb\xba\x08\xdb\x06\x08\xdb\x46\x09\xdb\xa6\x09\xdb\xb3\x08\xdb\xf3\x09\xdb\x8b\x09\xdb\x53\x84\xed\xd5\x84\xed\x8d\x84\xed\xed\x84\xed\xbd\x84\xed\xc3\x84\xff\x9f\x42\x35\x0e\xaf\x43\xb0\xf7\xff\x5f\x77\xcb\xdd\x93\xcf\xfb\x13\x04\x41\x70\xb8\x19\xe1\x06\x41\x90\x4d\x90\x59\x10\x84\xe6\x4b\x58\x56\x07\x41\x10\x7a\xda\x46\x9d\xd6\x19\x67\x95\x69\x4a\x4a\xee\x16\x1c\x6d\xb4\xa7\xc4\xa4\x75\xda\xa6\xed\x69\x77\xaa\x07\x69\x9d\xb6\x87\x85\x05\x07\x41\x58\x4c\x66\x41\xdc\x65\xbb\x71\x85\x5f\x46\x36\x71\xf7\x7b\xf6\xc7\xfb\x79\x3f\xcf\xeb\xf5\xba\x79\x0c\xbb\x79\x06\x6b\x29\xc4\x5a\xca\xb0\x96\x1a\xac\xa5\x09\x6b\x89\x60\x2d\x5d\x58\x4b\x02\x6b\xc9\x62\x2d\xa3\x58\xcb\x34\x76\x4b\x01\x76\x4b\x29\x76\x4b\x35\x76\x4b\x23\x76\x6b\x2f\x76\x6b\x3f\x76\xeb\x10\x76\xeb\x04\x36\x0f\x6c\x5e\x31\x36\xaf\x12\x9b\x57\x8f\xcd\x6b\xc1\xe6\xb5\x61\xf3\xba\xb1\x79\x49\x6c\xde\x00\x36\x6f\x0c\x9b\x37\x83\x85\x0a\xb1\x50\x19\x16\xaa\xc1\x42\x41\x2c\x14\xc6\x42\x9d\x58\xa8\x17\x0b\x65\xb0\xd0\x30\x16\x9a\xc4\xe6\xe7\x61\xf3\x03\xd8\xfc\x1a\x6c\x7e\x10\x9b\x1f\xc6\xe6\x77\x62\xf3\x53\xd8\x82\x0e\x6c\x41\x0f\xb6\x20\x8d\x2d\xc8\x61\x0b\x26\xb1\x85\xf9\xd8\xc2\x12\x6c\x61\x15\xb6\xb0\x01\x5b\x18\xc2\x16\xb6\x63\x0b\xe3\xd8\xc2\x34\xb6\x30\x87\x2d\x1c\xc7\x16\xce\x62\xad\x45\x58\x6b\x39\xd6\x5a\x8b\xb5\x36\x61\xad\x11\xac\xb5\x0b\x6b\x4d\x60\xad\x59\xac\x75\x14\x6b\x9d\xc4\x6e\xcb\xc3\x6e\x2b\xc1\x6e\xab\xc2\x6e\x6b\xc4\x6e\x6b\xc5\x6e\xeb\xc0\x6e\x4b\x60\xb7\x65\xb0\xdb\x86\xb1\xdb\x26\xb1\x45\xf9\xd8\xa2\x52\x6c\x51\x35\x76\x7b\x10\xbb\x3d\x8c\xdd\xde\x89\xdd\xde\x8b\xdd\xde\x8f\xdd\x3e\x84\xdd\x3e\x81\x85\xf3\xb0\x70\x00\x0b\x57\x62\xe1\x7a\x2c\xdc\x82\x85\xdb\xb0\x70\x37\x16\x4e\x62\xe1\x01\x2c\x3c\x8a\x85\xa7\xb1\xc5\x05\xd8\xe2\x52\x6c\x71\x35\xb6\x38\x88\x2d\x0e\x63\x8b\x3b\xb1\xc5\xbd\xd8\xe2\x0c\xb6\x78\x18\x5b\x3c\x89\x2d\xc9\xc3\x96\x04\xb0\x25\x95\xd8\x92\x7a\x6c\x49\x0b\xb6\xa4\x0d\x5b\xd2\x8d\x2d\x49\x61\x4b\x72\xd8\x92\x09\xec\x0e\xb0\x3b\x8a\xb1\x3b\x2a\xb1\x3b\xea\xb1\x48\x27\x16\x49\x60\x91\x0c\x16\x19\xc6\x22\x93\xd8\xcf\xf2\xb0\x9f\x05\xb0\x9f\x55\x62\x3f\xab\xc7\x7e\x16\xc2\x7e\xd6\x8e\xfd\xac\x07\xbb\xab\x06\xbb\x2b\x88\xdd\x15\xc1\xee\xea\xc2\xee\x4a\x60\x77\x65\xb1\xbb\x46\xb0\xbb\xa6\xb0\x68\x01\x16\xad\xc5\xa2\x4d\x58\x34\x82\x45\xbb\xb1\x68\x12\x8b\x0e\x60\xd1\x51\x6c\x69\x1e\xb6\x34\x80\x2d\xad\xc4\x96\xd6\x63\x4b\x5b\xb0\xa5\x6d\xd8\xd2\x6e\x6c\x69\x12\x5b\x3a\x80\x2d\xfd\x57\x37\x8d\xdd\x5d\x80\xdd\x5d\x8a\xdd\x5d\x83\xdd\xdd\x84\xdd\x1d\xc1\xee\xee\xc2\xee\x4e\x62\x77\x0f\x60\x77\x8f\x62\x77\x4f\x63\x6d\x05\x58\x5b\x29\xf6\x8b\x2e\x6c\x59\x05\xb6\xac\x1e\x5b\xd6\x82\x2d\x6b\xc3\x96\x75\x63\xed\x39\xac\x7d\x1a\x5b\x5e\x80\x2d\x2f\xc5\x96\x57\x63\xcb\x1b\xb1\xe5\xad\xd8\xf2\x0e\x6c\x79\x0f\xb6\x3c\x8d\x2d\xcf\x61\xcb\x27\xb0\x7b\xc1\xee\x2d\xc6\xee\xad\xc0\xee\xad\xc3\xee\x6d\xc6\x3a\x4a\xb1\x8e\x6a\xac\x23\x81\x75\xa4\xb1\x8e\x1c\xb6\xa2\x1b\x5b\x91\xc4\xee\x8f\x61\x0f\xb4\x63\x9d\x61\xec\xbf\xba\xb1\x5f\x4e\x61\xbf\x2a\xc2\xba\x6a\xb1\xae\x61\xec\xc1\x18\xf6\x50\x18\x7b\xa8\x13\x7b\x28\x81\x3d\x5c\x87\x3d\xdc\x8c\xc5\xd2\xd8\xca\x72\x6c\x65\x14\x5b\x19\xc3\x56\xf6\x61\x2b\xb3\xd8\xca\x11\x6c\xe5\x14\xb6\x2a\x1f\x5b\x55\x82\xad\x0a\x63\xab\x3a\xb1\x55\xbd\xd8\xaa\x7e\x6c\xd5\x10\xb6\x6a\x02\xeb\x06\xeb\x0e\x60\xdd\x95\x58\x77\x23\xd6\xdd\x8a\x75\x77\x60\xdd\x3d\x58\x77\x1a\xeb\x1e\xc2\xba\x27\xb0\x47\xc1\x1e\x2d\xc6\x1e\x8d\x61\x8f\xf6\x61\xab\xf3\xb1\xd5\xc5\xd8\xea\x0a\x6c\x75\x1d\xb6\xba\x19\x5b\x1d\xc5\x56\xc7\xb0\xd5\xff\xf2\x59\x6c\xf5\x08\xb6\x7a\x0a\x5b\x93\x8f\xad\x29\xc1\xd6\x54\x61\x6b\x1a\xb0\x35\x21\x6c\x4d\x07\xb6\xa6\x07\x5b\x93\xc6\xd6\x0c\x61\x6b\x26\xb0\x38\x58\xbc\x18\x8b\x57\x60\xf1\x3a\x2c\xde\x8c\xc5\xa3\x58\x3c\x86\xc5\xfb\xb0\x78\x16\x8b\x8f\x60\xf1\x29\x6c\x6d\x3e\xb6\xb6\x04\x5b\x5b\x85\xad\x6d\xc0\xd6\x86\xb0\xb5\xed\xd8\xda\x1e\x6c\x6d\x3f\xb6\x76\x08\x5b\x3b\x81\x3d\x06\xf6\x58\x31\xf6\x58\x05\xf6\x58\x1d\xf6\x58\x33\xf6\x58\x14\x7b\x2c\x86\x3d\xd6\x87\x3d\x96\xc5\x1e\x1b\xc1\x1e\x9b\xc2\x1e\x2f\xc0\x1e\x2f\xc5\x1e\xaf\xc6\x1e\x6f\xc4\x1e\x6f\xc5\x1e\xef\xc0\x1e\xef\xc5\x1e\xef\xc7\x1e\x1f\xc2\x1e\x9f\xc0\x7a\xf2\xb0\x9e\x12\xac\xa7\x1a\xeb\x69\xc4\x7a\x5a\xb1\x9e\x0e\xac\xa7\x07\xeb\x49\x63\x3d\x39\xac\x67\x1c\xeb\x99\xc5\x9e\x28\xc2\x9e\x28\xc7\x9e\xa8\xc5\x9e\x68\xc2\x9e\x88\x60\x4f\x74\x61\x4f\x16\x62\x4f\x96\x61\x4f\xf6\x61\x4f\x66\xb1\x27\x47\xb0\x27\xa7\xb0\xde\x7c\xac\xb7\x04\xeb\xad\xc2\x7a\x1b\xb0\xde\x10\xd6\xdb\x8e\xf5\xc6\xb1\xde\x14\xd6\x3b\x88\xf5\x8e\x61\xbd\x33\xd8\xba\x22\x6c\x5d\x39\xb6\xae\x16\x5b\xd7\x84\xad\x8b\x60\xeb\xba\xb0\x75\x09\x6c\x5d\x06\x5b\x37\x8c\xad\x9b\xc4\xd6\xe7\x61\xeb\x4b\xb0\xf5\x55\xd8\xfa\x06\x6c\x7d\x08\x5b\xdf\x8e\xad\x8f\x63\xeb\x53\xd8\xfa\x41\x6c\xfd\x18\xb6\x7e\x06\x7b\xaa\x10\x7b\xaa\x0c\x7b\xaa\x06\x7b\x2a\x88\x3d\x15\xc1\x9e\x8a\x61\x4f\xf5\x61\x4f\x65\xb1\xa7\x46\xb0\xa7\xa6\xb0\x44\x3e\x96\x28\xc1\x12\x55\x58\xa2\x01\x4b\x84\xb0\x44\x3b\x96\x88\x63\x89\x14\x96\x18\xc4\x12\x63\x58\x62\x06\xdb\x50\x88\x6d\x28\xc3\x36\xd4\x60\x1b\x82\xd8\x86\x30\xb6\xa1\x13\xdb\xd0\x8b\x6d\xe8\xc7\x36\x0c\x63\x1b\x26\xb1\x8d\x79\xd8\xc6\x12\x6c\x63\x35\xb6\xb1\x11\xdb\xd8\x8a\x6d\xec\xc0\x36\xf6\x60\x1b\xd3\xd8\xc6\x1c\xb6\x71\x1c\xdb\x38\x8b\x6d\x2a\xc2\x36\x95\x63\x9b\x6a\xb1\x4d\x4d\xd8\xa6\x08\xb6\x29\x86\x6d\x4a\x62\x9b\x06\xb0\x4d\xa3\xd8\xa6\x69\xac\xaf\x00\xeb\xcb\x61\x7d\xe3\x58\xdf\x2c\xb6\xb9\x08\xdb\x5c\x8e\x6d\xae\xc5\x36\x37\x61\x9b\x23\xd8\xe6\x2e\x6c\x73\x02\xdb\x9c\xc1\x36\x0f\x63\x9b\x27\xb1\x2d\x79\xd8\x96\x00\xb6\xa5\x12\xdb\x52\x8f\x6d\x69\xc1\xb6\xb4\x63\x5b\xe2\xd8\x96\x14\xb6\x65\x10\xdb\x32\x86\x6d\x99\xc1\xb6\x16\x62\x5b\xcb\xb0\xad\x35\xd8\xd6\x20\xb6\x35\x82\x6d\xed\xc2\xb6\x26\xb0\xad\x19\x6c\xeb\x30\xb6\x75\x12\x4b\xe6\x61\xc9\x00\x96\xac\xc4\x92\xf5\x58\xb2\x05\x4b\xb6\x61\xc9\x6e\x2c\x99\xc4\x92\x03\x58\x72\x14\x4b\x4e\x63\xdb\x0a\xb0\x6d\x65\xd8\xb6\x1a\x6c\x5b\x10\xdb\x16\xc6\xb6\x75\x62\xdb\x7a\xb1\x6d\xfd\xd8\xb6\x61\x6c\xdb\x24\xb6\x3d\x0f\xdb\x1e\xc0\xb6\x57\x62\xdb\xeb\xb1\xed\x2d\xd8\xf6\x36\x6c\x7b\x37\xb6\x3d\x85\x6d\xcf\x61\xdb\xc7\xb1\x54\x0d\x96\x0a\x62\xa9\x30\x96\xea\xc4\x52\xbd\x58\xaa\x1f\x4b\x0d\x61\xa9\x09\x6c\x07\xd8\x8e\x62\x6c\x47\x25\xb6\xa3\x1e\xdb\x11\xc2\x76\xb4\x63\x3b\xe2\xd8\x8e\x14\xb6\x63\x10\xdb\x31\x86\xed\x98\xc5\x9e\x2e\xc2\x9e\x2e\xc7\x9e\xae\xc5\x9e\x6e\xc2\x9e\x8e\x60\x4f\x77\x61\x4f\x27\xb0\xa7\x33\xd8\xd3\xc3\xd8\xd3\x93\xd8\xce\x7c\x6c\x67\x29\xb6\xb3\x1a\xdb\xd9\x88\xed\x6c\xc5\x76\x76\x60\x3b\x7b\xb0\x9d\x69\x6c\x67\x0e\xdb\x39\x81\xa5\xc1\xd2\xc5\x58\xba\x02\x4b\xd7\x63\xe9\x16\x2c\xdd\x86\xa5\x7b\xb0\x74\x1a\x4b\xe7\xb0\xf4\x38\x96\x9e\xc5\x9e\x29\xc2\x9e\xa9\xc0\x9e\xa9\xc3\x9e\x69\xc1\x9e\x69\xc3\x9e\xe9\xc6\x9e\x49\x62\xcf\x0c\x60\xcf\x8c\x62\xcf\x4c\x63\xcf\x16\x60\xcf\xf6\x61\xcf\x66\xb1\x67\x47\xb0\x67\xa7\xb1\xe7\x0a\xb0\xe7\x4a\xb1\xe7\xaa\xb1\xe7\x3a\xb0\xe7\x7a\xb0\xe7\x66\xb1\xfe\x22\xac\xbf\x1c\xeb\xaf\xc5\xfa\x9b\xb0\xfe\x08\xd6\xdf\x85\xf5\x27\xb0\xfe\x0c\xd6\x3f\x8c\xf5\x4f\x62\xbb\xf2\xb0\x5d\x01\x6c\x57\x25\xb6\xab\x1e\xdb\xd5\x82\xed\x6a\xc3\x76\x75\x63\xbb\x92\xd8\xae\x01\x6c\xd7\x28\xb6\x6b\x1a\xdb\x5d\x88\xed\x2e\xc3\x76\xd7\x60\xbb\x83\xd8\xee\x30\xb6\xbb\x13\xdb\xdd\x8b\xed\xce\x60\xbb\x87\xb1\xdd\x93\xd8\xf3\x79\xd8\xf3\x01\xec\xf9\x4a\xec\xf9\x7a\xec\xf9\x10\xf6\x7c\x3b\xf6\x7c\x0f\xf6\x7c\x1a\x7b\x3e\x87\x3d\x3f\x8e\x3d\x3f\x8b\x65\x8a\xb0\x4c\x39\x96\xa9\xc5\x32\x4d\x58\x26\x82\x65\xba\xb0\x4c\x02\xcb\x64\xb0\xcc\x30\x96\x99\xc4\xf6\xe4\x61\x7b\x02\xd8\x9e\x4a\x6c\x4f\x3d\xb6\xa7\x05\xdb\xd3\x86\xed\x89\x63\x7b\x52\xd8\x9e\x41\x6c\xcf\x18\xb6\x67\x06\xdb\x5b\x88\xed\x2d\xc3\xf6\xd6\x62\x7b\x9b\xb0\xbd\x11\x6c\x6f\x17\xb6\x37\x81\xed\xcd\x60\x7b\x87\xb1\xbd\x93\xd8\xbe\x3c\x6c\x5f\x00\xdb\x57\x89\xed\xab\xc7\xf6\xb5\x60\xfb\xda\xb0\x7d\xdd\xd8\xbe\x24\xb6\x6f\x10\xdb\x37\x86\xed\x9b\xc1\xb2\x45\x58\xb6\x1c\xcb\xd6\x62\xd9\x26\x2c\x1b\xc1\xb2\x5d\x58\x36\x81\x65\xb3\x58\x76\x04\xcb\x4e\x61\x2f\x4c\x62\x2f\xe6\x63\x2f\x96\x60\x2f\x56\x61\x2f\x36\x60\x2f\x86\xb0\x17\xdb\xb1\xdf\x46\xb1\xdf\xc6\xb0\xdf\xf6\x61\xbf\xcd\x62\xbf\x1d\xc1\x7e\x3b\x85\x0d\xe4\x63\x03\x25\xd8\x40\x15\x36\xd0\x80\x0d\x84\xb0\x81\x76\x6c\x20\x8e\x0d\xa4\xb0\x81\x41\x6c\x60\x0c\x1b\x98\xc1\x5e\x2a\xc4\x5e\x2a\xc3\x5e\xaa\xc1\x5e\x0a\x62\x2f\x85\xb1\x97\x3a\xb1\x97\x12\xd8\x4b\x19\xec\xa5\x61\xec\xa5\x29\xec\xe5\x51\xec\xe5\x19\xec\x77\x85\xd8\xef\xca\xb0\xdf\xd5\x60\xbf\x0b\x62\xbf\x0b\x63\xbf\xeb\xc4\x7e\xd7\x8b\xfd\xae\x1f\xfb\xdd\x10\xf6\xbb\x09\x6c\x10\x6c\xb0\x18\x1b\xac\xc0\x06\xeb\xb0\xc1\x66\x6c\x30\x8a\x0d\xc6\xb0\xc1\x3e\x6c\x30\x8b\x0d\x8e\x60\x83\x53\xd8\x2b\xf9\xd8\x2b\x25\xd8\x2b\x55\xd8\x2b\x0d\xd8\x2b\x21\xec\x95\x76\xec\x95\x38\xf6\x4a\x0a\x7b\x65\x10\x7b\x65\x0c\x7b\x65\x06\x7b\xb5\x10\x7b\xb5\x0c\x7b\xb5\x06\x7b\x35\x88\xbd\x1a\xc6\x5e\xed\xc4\x5e\xed\xc5\x5e\xed\xc7\x5e\x1d\xc2\x5e\x9d\xc0\x5e\xcb\xc3\x5e\x0b\x60\xaf\x55\x62\xaf\xd5\x63\xaf\xb5\x60\xaf\xb5\x61\xaf\x75\x63\xaf\x25\xb1\xd7\x06\xb0\xd7\x46\xb1\xd7\xa6\xb1\x5c\x01\x96\x2b\xc5\x72\xd5\x58\xae\x11\xcb\xb5\x62\xb9\x0e\x2c\xd7\x83\xe5\xd2\x58\x2e\x87\xe5\xc6\xb1\xdc\x2c\xf6\x7a\x11\xf6\x7a\x39\xf6\x7a\x2d\xf6\x7a\x13\xf6\x7a\x04\x7b\xbd\x0b\x7b\xbd\x0f\x7b\x3d\x8b\xbd\x3e\x8a\xbd\x3e\x8d\xbd\x51\x88\xbd\x51\x86\xbd\x51\x83\xbd\x11\xc4\xde\x08\x63\x6f\x74\x62\x6f\xf4\x62\x6f\x64\xb0\x37\x86\xb1\x37\x26\xb1\x37\xf3\xb0\x37\x03\xd8\x9b\x95\xd8\x9b\xf5\xd8\x9b\x2d\xd8\x9b\x6d\xd8\x9b\xdd\xd8\x9b\x49\xec\xcd\x21\xec\xcd\x09\x6c\x08\x6c\xa8\x18\x1b\xaa\xc0\x86\xea\xb0\xa1\x66\x6c\x28\x8a\xbd\xd5\x85\xbd\x95\xc0\xde\xca\x60\x6f\x0d\x63\x6f\x4d\x62\x6f\xe7\x61\x6f\x07\xb0\xb7\x2b\xb1\xb7\xeb\xb1\xb7\x5b\xb0\xb7\xdb\xb0\xb7\xe3\xd8\xdb\x29\xec\xed\x41\xec\xed\x31\xec\xed\x19\xec\x9d\x42\xec\x9d\x32\xec\x9d\x1a\xec\x9d\x20\xf6\x4e\x04\x7b\x27\x86\xbd\xd3\x87\xbd\x93\xc5\xde\x19\xc1\xde\x99\xc6\x86\x0b\xb0\xe1\x4a\x6c\xb8\x01\x1b\x0e\x61\xc3\xed\xd8\x70\x1f\x36\x9c\xc5\x86\x47\xb0\xe1\x29\xec\xdd\x02\xec\xdd\x52\xec\xdd\x6a\xec\xdd\x46\xec\xdd\x56\xec\xdd\x0e\xec\xdd\x1e\xec\xdd\x34\xf6\x6e\x0e\x7b\x77\x1c\x7b\x0f\xec\xbd\x62\xec\xbd\x0a\xec\xbd\x3a\xec\xbd\x16\xec\xbd\x36\xec\xbd\x6e\xec\xbd\x24\xf6\xde\x00\xf6\xde\x28\xf6\xde\x34\xf6\xfb\x62\xec\xf7\x95\xd8\xef\x1b\xb0\xdf\x87\xb0\xdf\xb7\x63\xbf\x8f\x63\xbf\x4f\x63\x23\x39\x6c\x64\x1c\x1b\x99\xc5\xde\x2f\xc2\xde\xaf\xc0\xde\xaf\xc3\xde\x6f\xc6\xfe\x10\xc4\xfe\x10\xc6\xfe\xd0\x89\xfd\xa1\x17\xfb\x43\x3f\xf6\x87\x21\xec\x0f\x13\xd8\x07\x60\x1f\x14\x63\x1f\x54\x60\x1f\xd4\x61\x1f\x34\x63\x1f\x44\xb1\x0f\x62\xd8\x07\x29\xec\x83\x1c\xf6\xc1\x38\x36\x0a\x36\x5a\x8c\x8d\x56\x62\xa3\x0d\xd8\x68\x08\x1b\x6d\xc7\x46\xe3\xd8\x68\x0a\x1b\x1d\xc4\x46\xc7\xb0\xd1\x19\xec\x8f\x85\xd8\x1f\xcb\xb0\x3f\xd6\x60\x7f\x0c\x62\x7f\x0c\x63\x7f\xec\xc2\x3e\x2c\xc6\x3e\xac\xc0\x3e\xac\xc3\x3e\x6c\xc6\x3e\x8c\x62\x1f\xc6\xb0\x0f\xfb\xb0\x0f\x07\xb0\x0f\x47\xb1\x0f\xa7\xb1\x3f\xb5\x63\x7f\x8a\x63\x7f\x4a\x61\x7f\x1a\xc4\xc6\x86\xb0\xb1\x49\xec\xa3\x3c\xec\xa3\x00\xf6\x51\x25\xf6\x51\x3d\xf6\x51\x0b\xf6\x51\x1b\xf6\x51\x37\xf6\x51\x0a\xfb\x68\x10\xfb\x68\x0c\xfb\x68\x06\xfb\xb8\x10\xfb\xb8\x0c\xfb\xb8\x06\xfb\x38\x88\x7d\x1c\xc6\x3e\x69\xc2\x3e\x89\x60\x9f\x74\x61\x9f\x24\xb0\x4f\x32\xd8\x27\xc3\xd8\x27\x93\xd8\x78\x1e\x36\x1e\xc0\xc6\x2b\xb1\xf1\x7a\x6c\x3c\x84\x8d\xb7\x63\xe3\x71\x6c\x3c\x85\x8d\x0f\x62\xe3\x63\xd8\xf8\x2c\xf6\x69\x11\xf6\x69\x39\xf6\x69\x2d\xf6\x69\x13\xf6\x69\x04\xfb\xb4\x0b\xfb\x34\x81\x7d\x9a\xc1\x3e\x1d\xc6\x3e\x9d\xc4\xfe\xbb\x01\xfb\xef\x10\xf6\xe7\x42\xec\xcf\x65\xd8\x9f\x6b\xb0\x3f\x07\xb1\x3f\x87\xb1\x3f\x8f\x62\x7f\x9e\xc6\x26\x0a\xb0\x89\x49\xec\x2f\x69\xec\xaf\x03\xd8\x5f\x47\xb1\xbf\x4e\x63\xff\x33\x85\x4d\x76\x62\x9f\xd5\x62\x9f\x4d\x62\xff\x9b\xc0\x3e\x6f\xc4\x3e\x6f\xc5\x3e\xef\xc0\x3e\xef\xc5\xa6\xf2\xb0\xa9\x08\x36\x35\x86\x7d\x11\xc4\xbe\xe8\xc5\xbe\xac\xc2\xbe\x4c\x61\x5f\x0e\x62\xff\x5f\x2b\x36\x9d\x87\x4d\x07\xb0\xe9\x04\x36\x9d\xc1\xa6\x87\xb1\xe9\x49\xec\x6f\x79\xd8\xdf\x02\xd8\xdf\xb2\xd8\xdf\x46\xb0\xbf\xcd\x60\x5f\x15\x62\x5f\x95\x61\x5f\xd5\x60\x5f\x05\xb1\xaf\xc2\xd8\x57\x9d\xd8\x57\xbd\xd8\x57\xfd\xd8\xd7\xcd\xd8\xd7\x51\xec\xeb\x18\x36\x53\x85\xcd\x64\xb1\x99\x11\x6c\x66\x0a\xfb\x7b\x3e\xf6\xf7\x12\xec\xef\x35\xd8\xdf\x83\xd8\xdf\xa7\xb0\x7f\xe4\x63\xff\x28\xc1\xfe\x51\x85\xfd\xa3\x01\xfb\x47\x08\xfb\x47\x3b\xf6\x4d\x1d\xf6\x4d\x33\xf6\x4d\x14\xfb\x26\x86\xcd\x36\x62\xb3\xad\xd8\x6c\x07\x36\xdb\x83\xcd\xa6\xb1\xd9\x1c\x36\x3b\x8e\xcd\xce\x62\xdf\x16\x61\xdf\x4e\x62\xff\x97\x87\xfd\x5f\x00\xfb\xbf\x2a\xec\xff\x1a\xb0\x7f\x16\x63\xff\x1c\xc6\xfe\x39\x89\xc8\x43\x04\x10\x33\xe8\xdf\xb2\xe8\xdf\x46\xd0\xbf\x4d\xa1\xef\xe4\xa3\xef\x0c\xa2\xef\x8c\xa3\xef\xcc\xa2\xef\x16\xa1\xef\xce\xa0\x7f\x6f\x47\xdf\x1b\x45\xdf\x9b\x46\xf9\xa0\xfc\x62\x94\x5f\x81\xf2\xeb\x50\x7e\x33\xca\x8f\x22\xeb\x45\x96\x41\x1a\x41\x1e\x44\x05\xc5\xa8\xa0\x02\x15\xd4\xa1\x82\x66\xb4\x5f\x3d\xda\xaf\x05\xed\x97\x43\xfb\x4d\xa2\xfd\xf3\xd0\xfe\x01\xb4\x7f\x25\xda\xbf\x1e\xed\xdf\x82\xf6\x6f\x43\xfb\x77\xa3\xfd\x53\x68\xff\x1c\xda\x7f\x1c\x1d\xd0\x8d\x0e\x48\xa2\x03\x06\xd0\x01\xa3\xe8\x80\x69\x54\x58\x80\x0a\x4b\x51\x61\x35\x2a\x0c\xa2\xc2\x30\x2a\xec\x42\x85\x7d\xa8\x30\x8b\x0a\x47\x50\xe1\x14\x3a\x30\x83\x0e\x1c\x46\x07\x4e\xa2\x83\xf2\xd0\x41\x01\x74\x50\x25\x3a\xa8\x1e\x1d\xd4\x82\x0e\x6a\x43\x07\x75\xa3\x83\x92\xe8\xa0\x01\x74\xd0\x28\x3a\x68\x1a\x1d\x5c\x80\x0e\x2e\x45\x07\x57\xa3\x83\x1b\xd1\xc1\xad\xe8\xe0\x0e\x74\x70\x0f\x3a\x38\x8d\x0e\xce\xa1\x83\xc7\xd1\xc1\xb3\xa8\xa8\x18\x15\x55\xa0\xa2\x3a\x54\xd4\x8c\x8a\xa2\xa8\x28\x86\x8a\xfa\x50\x51\x16\x15\x8d\xa0\xa2\x29\x74\x48\x3e\x3a\xa4\x04\x1d\x52\x85\x0e\x69\x44\x87\xb4\xa2\x43\x3a\xd0\x21\x3d\xe8\x90\x34\x3a\x24\x87\x0e\x19\x47\x87\xcc\xa2\x43\x8b\xd0\xa1\xd5\xe8\xd0\x46\x74\x68\x2b\x3a\xb4\x03\x1d\xda\x83\x0e\x4d\xa3\x43\x73\xe8\xd0\x71\x74\xe8\x2c\x3a\xac\x18\x1d\x56\x81\x0e\xab\x43\x87\x35\xa3\xc3\xa2\xe8\xb0\x18\x3a\xac\x0f\x1d\x36\x80\x0e\x1b\x45\x87\xcd\xa0\xe2\x42\x54\x5c\x86\x8a\x6b\x50\x71\x10\x15\x87\x51\x71\x27\x2a\xee\x45\xc5\xfd\xa8\x78\x08\x15\x4f\xa0\xc3\x41\x87\x17\xa3\xc3\x2b\xd0\xe1\x75\xe8\xf0\x66\x74\x78\x14\x1d\x1e\x43\x87\xf7\xa1\xc3\xb3\xe8\xf0\x51\x74\xf8\x34\x3a\xa2\x10\x1d\x51\x86\x8e\xa8\x45\x47\x34\xa1\x23\x22\xe8\x88\x2e\x74\x44\x02\x1d\x91\x41\x47\x8c\xa0\x23\xa6\xd0\x91\x05\xe8\xc8\x52\x74\x64\x35\x3a\xb2\x11\x1d\x19\x46\x47\x76\xa2\x23\x7b\xd1\x91\xfd\xe8\xc8\x21\x74\xe4\x04\x0a\x80\x02\xc5\x28\x50\x81\x02\x75\x28\xd0\x8c\x02\x51\x14\xe8\x46\x81\x24\x0a\x0c\xa0\xc0\x28\x0a\x4c\xa3\xa3\x0a\xd0\x51\xa5\xe8\xa8\x6a\x74\x54\x23\x3a\xaa\x15\x1d\xd5\x81\x8e\xea\x41\x47\xa5\xd1\x51\x39\x74\xd4\x34\x3a\xba\x00\x1d\x5d\x8e\x8e\xae\x45\x47\x37\xa1\xa3\x23\xe8\xe8\x2e\x74\x74\x02\x1d\x9d\x41\x47\x0f\xa3\x92\x3c\x54\x52\x82\x4a\xaa\xd0\xf7\x63\xe8\xfb\x7d\xe8\xfb\x59\xf4\xfd\x11\xf4\xfd\x29\x74\x4c\x3e\x3a\xa6\x04\x1d\x53\x85\x8e\x09\xa2\x63\xc2\xe8\x98\x4e\x74\x4c\x02\x1d\x93\x45\xc7\x8c\xa0\x63\xa6\xd0\xb1\xf9\xe8\xd8\x12\x74\x6c\x35\x3a\xb6\x05\x1d\xdb\x86\x8e\xed\x46\xc7\x26\xd1\xb1\x83\xe8\xd8\x31\x74\xec\x2c\x2a\x2d\x42\xa5\xe5\xa8\xb4\x16\x95\xb6\xa0\xd2\x36\x54\xda\x8d\x4a\x93\xa8\x74\x00\x95\x8e\xa2\xd2\x69\x74\x5c\x01\x3a\xae\x0c\x1d\x57\x83\x8e\x0b\xa2\xe3\xc2\xe8\xb8\x4e\x74\x5c\x2f\x3a\xae\x1f\x1d\x37\x84\x8e\x9b\x40\xc7\xe7\xa1\xe3\x03\xe8\xf8\x4a\x74\x7c\x3d\x3a\xbe\x05\x1d\xdf\x8e\x8e\x8f\xa3\xe3\x53\xe8\xf8\x41\x74\xfc\x18\x3a\x7e\x06\xfd\x67\x21\xfa\xcf\x72\xf4\x9f\x75\xe8\x3f\xc3\xe8\x3f\x3b\x51\x59\x31\x2a\xab\x44\x27\x14\xa1\x13\xca\xd1\x89\x65\xe8\xc4\x1a\x74\x62\x13\x3a\x31\x85\x4e\x2a\x44\x27\x95\xa1\x93\x6a\xd0\x49\x41\x74\x52\x18\x9d\xd4\x89\x4e\xea\x45\x27\xf5\xa3\x93\x86\xd0\x49\x13\xa8\x1c\x54\x5e\x8c\xca\x2b\x50\x79\x1d\x2a\x6f\x46\x27\xe7\xa3\x93\x4b\xd0\xc9\x55\xe8\xe4\x06\x74\x72\x08\x9d\xdc\x8e\x4e\x8e\xa3\x93\x53\xe8\xe4\x41\x74\xf2\x18\x3a\x79\x06\x9d\x52\x88\x4e\x29\x43\xa7\xd4\xa0\x53\x82\xe8\x94\x30\x3a\xa5\x13\x9d\xd2\x8b\x4e\xe9\x47\xa7\x0c\xa1\x53\x26\xd0\xa9\xa0\x53\x4b\xd0\xa9\x55\xa8\xa2\x01\x55\xb4\xa2\x8a\x4e\x54\x91\x42\x15\x43\xa8\x62\x02\x9d\x06\x3a\xad\x18\x9d\x56\x81\x4e\x1b\x45\xa7\x4d\xa3\xd3\x0b\xd0\xe9\xa5\xe8\xf4\x6a\x74\x7a\x13\x3a\x3d\x82\x4e\xef\x42\x67\xa4\xd0\x19\x83\xe8\x8c\x31\x74\xc6\x0c\xaa\x2c\x44\x95\x65\xa8\xb2\x06\x55\x06\x51\x65\x18\x55\x0e\xa0\x1f\x54\xa3\x1f\x34\xa2\x1f\xb4\xa2\x1f\x74\xa0\x1f\xf4\xa0\x1f\xa4\xd1\x0f\x72\xe8\x07\x93\xe8\x87\x79\xe8\x87\x01\xf4\xc3\x4a\xf4\xc3\x7a\xf4\xc3\x16\xf4\xc3\x36\xf4\xc3\x6e\xf4\xc3\x24\xfa\xe1\x20\xfa\xe1\x18\xfa\xe1\x0c\x3a\xb3\x08\x9d\x59\x8e\xaa\x02\xa8\xaa\x12\x55\x35\xa0\xaa\x10\x3a\xab\x1a\x9d\xd5\x88\xce\x6a\x45\x67\x75\xa2\xb3\x7a\xd1\x59\xfd\xe8\xac\x21\x74\xd6\x04\x3a\x1b\x74\xf6\x0c\x3a\xa7\x10\x9d\x53\x8e\xce\xa9\x45\xe7\x34\xa1\xea\x36\x54\xdd\x8d\xaa\x53\xa8\x3a\x87\xce\x05\x9d\x5b\x8c\xce\xad\x40\xe7\xb6\xa3\x73\xe3\xe8\xdc\x14\x3a\x77\x10\xfd\xb8\x06\xfd\x38\x88\x7e\x3c\x8c\x7e\x3c\x89\x6a\xf2\x50\x4d\x00\xd5\x54\xa2\x9a\x7a\x54\xd3\x82\x6a\xda\x50\x4d\x37\xaa\x49\xa2\xf3\x9a\xd0\x79\x11\x74\x5e\x17\x3a\xbf\x1c\x9d\x5f\x8b\xce\x6f\x42\xe7\x47\xd0\xf9\xff\x62\x09\x74\x7e\x06\x9d\x3f\x8c\x2e\x68\x41\x17\xb4\xa1\xda\x52\x54\xdb\x8f\x6a\x87\x50\xed\x24\xba\x30\x0f\x5d\x18\x40\x17\x56\xa1\x0b\x1b\xd0\x85\x21\x74\x51\x09\xba\xa8\x0a\x5d\xd4\x80\x2e\x0a\xa1\x8b\xcb\xd1\xc5\xb5\xe8\xe2\x26\x74\x71\x04\x5d\xdc\x85\x2e\x4e\xa0\xba\x08\xba\xa4\x04\x5d\x52\x85\x2e\x69\x40\x97\x84\xd0\x25\xed\xe8\x92\x38\xba\x24\x85\x2e\x19\x44\x97\x8c\xa1\x4b\x66\xd0\xa5\x85\xe8\xd2\x32\x74\x69\x0d\xba\x34\x88\x2e\x0d\xa3\x4b\x3b\xd1\xa5\xbd\xe8\xd2\x7e\x74\xe9\x10\xba\x74\x02\xcd\x01\xcd\x29\x46\x73\x2a\xd0\x9c\x3a\x34\xa7\x19\xcd\x89\xa2\x39\x31\x34\xa7\x0f\xcd\xc9\xa2\x39\x23\x68\xce\x14\xaa\xcf\x47\xf5\x25\xa8\x7e\x1c\xd5\xcf\xa2\xff\x37\x82\xfe\xdf\x14\xba\x2c\x1f\x5d\x56\x82\x2e\xab\x42\x97\x35\xa0\xcb\x42\xe8\xb2\x76\x74\x59\x1c\x5d\x96\x42\x97\x0d\xa2\xcb\xc6\xd0\x65\x33\xe8\xf2\x42\x74\x79\x19\xba\xbc\x06\x5d\x1e\x44\x97\x87\xd1\xe5\x9d\xe8\xf2\x5e\x74\x79\x3f\xba\x7c\x08\x35\xc4\x51\x43\x0a\x35\x0c\xa2\x86\x31\xd4\x30\x83\xae\x28\x44\x57\x94\xa1\x2b\x6a\xd0\x15\x41\x74\x45\x18\x5d\xd1\x89\xae\xe8\x45\x57\x64\xd0\x15\xc3\xe8\x8a\x49\x74\x65\x1e\xba\x32\x80\xae\xac\x44\x57\xd6\xa3\x2b\x5b\xd0\x95\x6d\xe8\xca\x6e\x74\x65\x12\x5d\x39\x88\xae\x1c\x43\x57\xce\xa0\x9f\x14\xa2\x9f\x94\xa3\x9f\xd4\xa2\x9f\x34\xa1\x9f\x44\xd0\x4f\xba\xd0\x4f\x12\xe8\x27\x19\xf4\x93\x11\xf4\x93\x29\xd4\x98\x8f\x1a\x4b\x50\xe3\x24\xfa\xe9\x10\xfa\xe9\x24\x9a\x9b\x87\xe6\x06\xd0\xdc\x4a\x34\xb7\x1e\xcd\x0d\xa1\xb9\xed\x68\x6e\x0f\x9a\x9b\x46\x73\x73\x68\xee\x38\x9a\x3b\x8b\xae\x2a\x42\x57\x95\xa3\xab\x6a\xd1\x55\x4d\x28\x58\x86\x82\x35\x28\x18\x44\xc1\x0e\x14\xec\x45\xc1\x7e\x14\x1c\x42\xc1\x09\x74\x35\xe8\xea\x62\x74\x75\x05\xba\xba\x0e\x5d\xdd\x8c\xae\x8e\xa2\xab\x63\xe8\xea\x3e\x74\x75\x16\x5d\x3d\x8a\xae\x01\x5d\x53\x8c\xae\xa9\x44\xd7\xd4\xa3\x6b\x5a\xd0\x35\x6d\xe8\x9a\x6e\x74\x4d\x12\x5d\x33\x80\xae\xf9\x57\x37\x8d\xae\x2d\x40\xd7\x56\xa0\x6b\xeb\xd1\xb5\x21\x74\x6d\x3b\xba\x36\x8e\xae\x4d\xa1\x6b\x07\xd1\xb5\x63\xe8\xda\x19\xd4\x54\x84\xae\x2b\x46\xd7\x55\xa0\xeb\xea\xd0\x75\xcd\xe8\xba\x28\xba\x2e\x86\xae\xeb\x43\xd7\x65\xd1\x75\x23\xe8\xba\x69\x74\x7d\x01\xba\xbe\x14\x5d\x5f\x8d\xae\x6f\x44\xd7\xb7\xa2\xeb\x3b\xd0\x0d\x69\x74\x43\x0e\xdd\x30\x8e\x6e\x98\x45\xcd\x45\xe8\xc6\x26\x74\x63\x04\xdd\xd8\x85\x6e\x4c\xa0\x1b\x33\xe8\xc6\x61\x74\xe3\x24\xba\x29\x0f\xdd\x14\x40\x37\x55\xa1\x9b\x1a\xd0\x4d\x21\x74\x53\x07\xba\xa9\x07\xdd\x5c\x81\x6e\xae\x43\x37\x37\xa3\x96\x16\xd4\xd2\x86\x5a\xba\x51\x4b\x12\xdd\x52\x8a\x6e\xa9\x46\xb7\x34\xa2\x5b\x5a\xd1\xad\x95\xe8\xd6\x06\x74\x6b\x08\xdd\xda\x8e\x6e\x8d\xa3\x5b\x53\xe8\xd6\x41\x74\xeb\x18\xba\x75\x06\xcd\x2b\x44\xf3\xca\xd0\xbc\x1a\x34\x2f\x88\xe6\xa5\xd1\xbc\x1c\x9a\x37\x8e\xe6\xcd\xa2\x50\x11\x0a\x95\xa3\x50\x2d\x0a\x35\xa1\x50\x04\x85\xba\x50\x28\x81\x42\x19\x14\x1a\x46\xa1\x49\x34\x3f\x0f\xcd\x0f\xa0\xf9\x95\x68\x7e\x03\x9a\x1f\x42\xf3\xdb\xd1\xfc\x38\x9a\x9f\x42\xf3\x07\xd1\xfc\x31\x34\x7f\x06\x2d\x28\x42\x0b\xca\xd1\x82\x5a\xb4\xa0\x09\x2d\x88\xa0\x05\x5d\x68\x41\x02\x2d\xc8\xa0\x05\xc3\x68\xc1\x24\x5a\x98\x87\x16\x06\xd0\xc2\x4a\xb4\xb0\x1e\x2d\x6c\x41\x0b\xdb\xd0\xc2\x6e\xb4\x30\x89\x16\x0e\xa0\x85\xa3\x68\xe1\x34\x6a\x2d\x40\xad\xa5\xa8\xb5\x1a\xb5\x36\xa2\xd6\x56\xd4\xda\x81\x5a\x7b\x50\x6b\x1a\xb5\xe6\x50\xeb\x38\x6a\x9d\x45\xb7\x15\xa1\xdb\xca\xd1\x6d\xb5\xe8\xb6\x26\x74\x5b\x04\xdd\xd6\x85\x6e\x4b\xa0\xdb\x32\xe8\xb6\x61\x74\xdb\x24\x5a\x94\x87\x16\x05\xd0\xa2\x4a\xb4\xa8\x1e\x2d\x6a\x41\x8b\xda\xd0\xa2\x6e\xb4\x28\x89\x16\x0d\xa0\x45\xa3\x68\xd1\x34\xba\xbd\x00\xdd\x5e\x8a\x6e\xaf\x46\xb7\x37\xa2\xdb\x5b\xd1\xed\x1d\xe8\xf6\x1e\x74\x7b\x1a\xdd\x9e\x43\xb7\x8f\xa3\xdb\x67\x51\xb8\x08\x85\xcb\x51\xb8\x0e\x85\x9b\x51\x38\x8a\xc2\x31\x14\xee\x43\xe1\x2c\x0a\x8f\xa0\xf0\x14\x5a\x9c\x8f\x16\x97\xa0\xc5\x55\x68\x71\x03\x5a\x1c\x42\x8b\xdb\xd1\xe2\x38\x5a\x9c\x42\x8b\x07\xd1\xe2\x31\xb4\x78\x06\x2d\x29\x44\x4b\xca\xd0\x92\x1a\xb4\x24\x88\x96\x84\xd1\x92\x4e\xb4\xa4\x17\x2d\xe9\x47\x4b\x86\xd0\x92\x09\x74\x07\xe8\x8e\x62\x74\x47\x05\xba\xa3\x0e\xdd\xd1\x8c\xee\x88\xa2\x3b\x62\xe8\x8e\x3e\x74\x47\x16\xdd\x31\x82\xee\x98\x46\x91\x02\x14\x29\x45\x91\x5a\x14\x69\x46\x91\x28\x8a\xc4\x50\xa4\x0f\x45\xb2\x28\x32\x82\x22\x53\xe8\x67\xf9\xe8\x67\x93\xe8\xce\x3c\x74\x67\x00\xdd\x59\x89\xee\xac\x47\x77\x86\xd0\x9d\xed\xe8\xce\x38\xba\x33\x85\xee\x1c\x44\x77\xc5\xd0\x5d\x7d\xe8\xae\x2c\xba\x6b\x04\xdd\x35\x85\xa2\xf9\x28\x5a\x82\xa2\xd5\x28\xda\x88\xa2\xad\x28\xda\x81\xa2\x3d\x28\x9a\x46\xd1\x1c\x8a\x8e\xa3\xe8\x2c\xfa\x79\x11\xfa\x79\x39\xfa\x79\x2d\xfa\x79\x13\xfa\x79\x04\xfd\xbc\x0b\xfd\x3c\x81\x7e\x9e\x41\x3f\x1f\x46\x3f\x9f\x44\x4b\xf3\xd0\xd2\x00\x5a\x5a\x89\x96\xd6\xa3\xa5\x2d\x68\x69\x1b\x5a\x1a\x47\x4b\x53\x68\xe9\x20\x5a\x3a\x86\x96\xce\xa0\xbb\x0b\xd1\xdd\x65\xe8\xee\x1a\x74\x77\x10\xdd\x1d\x46\x77\x77\xa2\xbb\x7b\xd1\xdd\xfd\xe8\xee\x21\x74\xf7\x04\x6a\x03\xb5\x15\xa3\xb6\x0a\xd4\x56\x87\xda\x9a\x51\x5b\x14\xb5\x75\xa3\xb6\x24\x6a\xcb\xa1\xb6\x71\xd4\x36\x8b\x7e\x51\x84\x7e\x51\x8e\x7e\x51\x8b\x7e\xd1\x84\x7e\x11\x41\xf7\x34\xa0\x7b\x42\xe8\x9e\x76\x74\x4f\x1c\xdd\x93\x42\xf7\x0c\xa2\x7b\xc6\xd1\x3d\xb3\x68\x59\x11\x5a\x56\x8e\x96\xd5\xa2\x65\x4d\x68\x59\x04\x2d\xeb\x42\xcb\xfa\xd0\xb2\x2c\x5a\x36\x82\x96\x4d\xa1\xf6\x42\xd4\x5e\x8e\xda\x6b\x51\x7b\x13\x6a\x8f\xa0\xf6\x18\x6a\xef\x43\xed\x59\xd4\x3e\x8e\xda\x67\xd1\xf2\x62\xb4\xbc\x02\x2d\xaf\x43\xcb\x9b\xd1\xf2\x28\x5a\xde\x8d\x96\xa7\xd0\xf2\x41\x74\xef\x38\xba\x77\x16\xdd\x57\x84\xee\x2b\x47\xf7\xd5\xa2\xfb\x9a\xd0\x7d\x11\x74\x5f\x0c\xdd\x97\x44\xf7\x0d\xa0\xfb\x46\xd1\x7d\xd3\xa8\xa3\x00\x75\x94\xa2\x8e\x6a\xd4\xd1\x88\x3a\x5a\x51\x47\x07\xea\xe8\x45\x1d\xfd\xa8\x63\x08\x75\x4c\xa0\x15\xa0\x15\x01\xb4\xa2\x0a\xad\x68\x40\x2b\x5a\xd1\x8a\x4e\xb4\x22\x81\x56\x64\xd0\x8a\x61\xb4\x62\x12\xdd\x9f\x87\xee\x2f\x41\xf7\x57\xa1\xfb\x1b\xd0\xfd\x21\x74\x7f\x3b\xba\x3f\x8e\xee\x4f\xa1\xfb\x07\xd1\xfd\x63\xe8\xfe\x19\xf4\x40\x21\x7a\xa0\x0c\x3d\x50\x83\x1e\x08\xa2\x07\xc2\xe8\x81\x4e\xf4\x40\x1a\x3d\x90\x43\x0f\x4c\xa0\x4e\x50\x67\x31\xea\xac\x40\x9d\x75\xa8\xb3\x19\x75\x46\x51\x67\x0c\x75\xf6\xa1\xce\x2c\xea\x1c\x41\xbf\x6c\x45\xbf\xec\x40\xbf\xec\x43\xbf\xcc\xa2\x5f\xfe\x8b\x4d\xa1\x5f\xe5\xa3\x5f\x95\xa0\x5f\x55\xa1\x5f\x35\xa0\x5f\x85\xd0\xaf\x3a\xd0\xaf\x7a\xd0\xaf\xd2\xa8\xab\x12\x75\x75\xa3\xae\x24\xea\x1a\x40\x5d\xa3\xa8\x6b\x1a\x3d\x58\x80\x1e\x2c\x45\x0f\x56\xa3\x07\x1b\xd1\x83\xad\xe8\xc1\x0e\xf4\x60\x0f\x7a\x30\x8d\x1e\xcc\xa1\x07\xc7\xd1\x83\xb3\xe8\xa1\x22\xf4\x50\x39\x7a\xa8\x0e\x3d\xd4\x8c\x1e\x8a\xa2\x87\x62\xe8\xa1\x3e\xf4\x50\x16\x3d\x34\x82\x1e\x9a\x42\x0f\xe7\xa3\x87\x4b\xd0\xc3\x55\xe8\xe1\x26\xf4\x70\x04\x3d\xdc\x85\x1e\x4e\xa0\x87\x33\xe8\xe1\x61\xf4\xf0\x24\x8a\xe5\xa1\x58\x00\xc5\x2a\x51\xac\x1e\xc5\x5a\x50\xac\x0d\xc5\xba\x51\x2c\x89\x62\x03\x28\x36\x8a\x62\xd3\xe8\x91\x02\xf4\x48\x29\x7a\xa4\x1a\xad\x6c\x40\x2b\x43\x68\x65\x3b\x5a\x19\x47\x2b\x53\x68\xe5\x20\x5a\x39\x86\x56\xce\xa0\x55\x85\x68\x55\x19\x5a\x55\x83\x56\x05\xd1\xaa\x30\x5a\xd5\x89\x56\xf5\xa2\x55\xfd\x68\xd5\x10\x5a\x35\x81\xba\x41\xdd\xc5\xa8\xbb\x12\x75\xd7\xa3\xee\x16\xd4\xdd\x86\xba\xbb\x51\x77\x12\x75\x0f\xa0\xee\x51\xd4\x3d\x8d\x1e\x2d\x40\x8f\x96\xa2\x47\xab\xd1\xa3\x8d\xe8\xd1\x56\xf4\x68\x07\x7a\xb4\x07\x3d\x9a\x46\x8f\xe6\xd0\xa3\xe3\xe8\xd1\x59\xb4\xba\x08\xad\x2e\x47\xab\x6b\xd1\xea\x26\xb4\x3a\x82\x56\x77\xa1\xd5\x09\xb4\x3a\x8b\x56\x8f\xa0\xd5\x53\x68\x4d\x3e\x5a\x53\x82\xd6\x54\xa1\x35\x8d\x68\x4d\x18\xad\xe9\x42\x6b\x12\x68\x4d\x06\xad\x19\x46\x6b\x26\x51\x3c\x0f\xc5\x03\x28\x5e\x89\xe2\xf5\x28\x1e\x42\xf1\x76\x14\x8f\xa3\x78\x0a\xc5\x07\x51\x7c\x0c\xc5\x67\xd0\xda\x42\xb4\xb6\x0a\xad\x6d\x40\x6b\x5b\xd1\xda\x69\xf4\x58\x06\x3d\x1e\x45\x3d\x61\xf4\x44\x14\xfd\x3a\x89\x9e\x2c\x41\x4f\x56\xa1\x27\x1b\xd0\x93\x21\xf4\x64\x3b\x7a\x32\x8e\x9e\x4c\xa1\x27\x07\xd1\x93\x63\xe8\xc9\x19\xd4\x5b\x88\x7a\x07\x51\xef\x18\xea\x9d\x41\xeb\x0a\xd1\xba\x32\xb4\xae\x06\xad\x0b\xa2\x75\x11\xb4\xae\x0b\xad\x4b\xa0\x75\x19\xb4\x6e\x18\xad\x9b\x44\xeb\xf3\xd0\xfa\x00\x5a\x5f\x89\xd6\xd7\xa3\xf5\x2d\x68\x7d\x1b\x5a\xdf\x8d\xd6\x27\xd1\xfa\x01\xb4\x7e\x14\xad\x9f\x46\x4f\x15\xa0\xa7\x4a\xd1\x53\xd5\xe8\xa9\x46\xf4\x54\x04\x25\x9a\x50\xe2\x5f\xdf\x8d\x12\x49\x94\x18\x40\x89\x51\x94\x98\x46\x1b\x0a\xd0\x86\x52\xb4\xa1\x1a\x6d\x68\x44\x1b\x5a\xd1\x86\x0e\xb4\x21\x81\x36\x64\xd0\x86\x61\xb4\x61\x12\x6d\xcc\x43\x1b\x03\x68\x63\x15\xda\xd8\x80\x36\x86\xd0\xc6\x0e\xb4\xb1\x17\x6d\xec\x47\x1b\x87\xd0\xc6\x09\xb4\x29\x0f\x6d\x0a\xa0\x4d\x95\x68\x53\x3d\xda\xd4\x82\x36\xb5\xa1\x4d\xdd\x68\x53\x12\x6d\x1a\x40\x9b\x46\xd1\xa6\x69\xd4\x57\x80\xfa\x4a\x51\x5f\x35\xea\x0b\xa2\xbe\x30\xea\xeb\x44\x7d\xbd\xa8\xaf\x1f\xf5\x0d\xa1\xbe\x09\xb4\x19\xb4\xb9\x18\x6d\xae\x40\x9b\xeb\xd0\xe6\x66\xb4\x39\x8a\x36\xc7\xd0\xe6\x3e\xb4\x39\x8b\x36\x8f\xa0\xcd\x53\x68\x4b\x01\xda\x52\x8a\xb6\x54\xa3\x2d\x8d\x68\x4b\x04\x6d\xe9\x42\x5b\x12\x68\x4b\x06\x6d\x19\x46\x5b\xa6\xd0\xd6\x7c\xb4\xb5\x04\x6d\xad\x42\x5b\x1b\xd0\xd6\x10\xda\xda\x8e\xb6\xc6\xd1\xd6\x14\xda\x3a\x88\xb6\x8e\xa1\xad\x33\x28\x59\x88\x92\x65\x28\x59\x83\x92\x41\x94\x8c\xa0\x64\x17\x4a\x26\x50\x32\x83\x92\xc3\x28\x39\x89\xb6\xe5\xa1\x6d\x01\xb4\xad\x12\x6d\xab\x47\xdb\x5a\xd0\xb6\x76\xb4\x2d\x8e\xb6\xa5\xd0\xb6\x41\xb4\x6d\x0c\x6d\x9b\x41\xdb\x0b\xd1\xf6\x32\xb4\xbd\x06\x6d\x0f\xa2\xed\x61\xb4\xbd\x13\x6d\xef\x45\xbf\x19\x44\xbf\x19\x43\xbf\x99\x41\xa9\x42\x94\x2a\x43\xa9\x1a\x94\x0a\xa2\x54\x18\xa5\x3a\x51\xaa\x17\xa5\xfa\x51\x6a\x08\xa5\x26\xd0\x8e\x3c\xb4\x23\x80\x76\x54\xa2\x1d\xf5\x68\x47\x0b\xda\xd1\x86\x76\x74\xa3\x1d\x49\xb4\x63\x00\xed\x18\x45\x3b\xa6\xd1\xd3\x05\xe8\xe9\x52\xf4\x74\x35\x7a\xba\x11\x3d\xdd\x8a\x76\x46\xd0\xce\x2e\xb4\x33\x81\x76\x66\xd0\xce\x61\xb4\x73\x12\xa5\xf3\x50\x3a\x80\xd2\x95\x28\x5d\x8f\xd2\x2d\x28\xdd\x86\xd2\xdd\x28\x9d\x42\xe9\x41\x94\x1e\x43\xe9\x19\xf4\x4c\x21\x7a\xa6\x0c\x3d\x53\x83\x9e\x09\xa2\x67\xc2\xe8\x99\x4e\xf4\x4c\x2f\x7a\xa6\x1f\x3d\x33\x84\x9e\x99\x40\xcf\x82\x9e\x2d\x46\xcf\x56\xa0\x67\xeb\xd1\xb3\x2d\xe8\xd9\x76\xf4\x6c\x1c\x3d\x9b\x42\xcf\x0e\xa2\x67\xc7\xd1\xb3\xb3\xe8\xb9\x22\xf4\x5c\x39\x7a\xae\x16\x3d\xd7\x84\x9e\x8b\xa0\xe7\xba\x50\x7f\x16\xf5\x8f\xa0\xfe\x29\xb4\x2b\x1f\xed\x2a\x41\xbb\xaa\xd0\xae\x46\xb4\xab\x15\xed\xea\x40\xbb\x7a\xd0\xae\x7e\xb4\x6b\x08\xed\x9a\x40\xbb\x41\xbb\x8b\xd1\xee\x0a\xb4\xbb\x0e\xed\x6e\x46\xbb\xa3\x68\x77\x0c\xed\xee\x43\xbb\x07\xd0\xee\x51\xb4\x7b\x06\x3d\x5f\x88\x9e\x2f\x43\xcf\xd7\xa0\xe7\x83\xe8\xf9\x30\x7a\xbe\x0b\x3d\x9f\x40\xcf\x67\xd1\xf3\x63\xe8\xf9\x59\xb4\xa7\x11\xed\x69\x45\x7b\x3a\xd0\x9e\x1e\xb4\x27\x8d\xf6\xe4\xd0\x9e\x09\xb4\x17\xb4\xb7\x18\xed\xab\x40\xfb\xea\xd0\xbe\x66\xb4\x2f\x8a\xf6\xc5\xd0\xbe\x19\x94\x2d\x44\xd9\x32\x94\xad\x41\xd9\x20\xca\x86\x51\xb6\x13\xbd\x50\x8a\x5e\xa8\x46\x2f\x34\xa2\x17\x5a\xd1\x0b\x1d\xe8\x85\x1e\xf4\x42\x1a\xbd\x90\x43\x2f\x8c\xa3\x17\x66\xd1\x8b\x39\xf4\xe2\x38\x7a\x71\x16\xfd\x76\x00\x0d\xb4\xa2\x81\x0e\x34\xd0\x83\x06\xd2\x68\x20\x87\x5e\x8a\xa3\x97\x52\xe8\xa5\x41\xf4\xd2\x18\x7a\x69\x06\xbd\x5c\x88\x5e\x2e\x43\x2f\xd7\xa0\x97\x83\xe8\xe5\x30\x7a\xb9\x13\xbd\xdc\x8b\x5e\xee\x47\x2f\x0f\xa1\x97\x27\xd0\xef\x40\x83\xb5\x68\xb0\x09\x0d\xb6\xa3\xc1\x38\x7a\xa5\x04\xbd\x52\x85\x5e\x69\x40\xaf\x84\xd0\x2b\xed\xe8\xd5\x36\xf4\x6a\x37\x7a\x35\x89\x5e\x1d\x40\xaf\x8e\xa2\x57\xa7\xd1\x6b\x05\xe8\xb5\x52\xf4\x5a\x35\x7a\x2d\x88\x5e\x0b\xa3\xd7\x3a\xd1\x6b\xbd\xe8\xb5\x7e\xf4\xda\x10\x7a\x6d\x12\xe5\xf2\x50\x2e\x80\x72\x95\x28\x57\x8f\x72\x2d\x28\xd7\x86\x72\xdd\x28\x97\x44\xb9\x41\x94\x1b\x47\xb9\x59\xf4\x7a\x11\x7a\xbd\x1c\xbd\x5e\x8b\x5e\x6f\x42\xaf\x47\xd0\xeb\x5d\xe8\xf5\x04\x7a\x3d\x83\x5e\x1f\x46\xaf\x4f\xa2\x37\xf2\xd0\x1b\x01\xf4\x46\x25\x7a\xa3\x1e\xbd\x19\x45\x6f\xc6\xd0\x9b\x29\xf4\xe6\x20\x7a\x73\x0c\xbd\x39\x83\x86\x0a\xd1\x50\x19\x1a\xaa\x41\x43\x41\x34\x14\x46\x43\x9d\x68\xa8\x17\x0d\xf5\xa3\xa1\x61\x34\x34\x89\xde\xca\x43\x6f\x05\xd0\x5b\x95\xe8\xad\x7a\xf4\x56\x08\xbd\xd5\x8e\xde\xea\x41\x6f\xf5\xa3\xb7\x86\xd0\x5b\x13\xe8\xed\x0c\x7a\x67\x0a\x0d\xe7\xa3\xe1\x12\x34\x5c\x85\x86\x1b\xd0\x70\x2b\x1a\xee\x40\xc3\x3d\x68\x38\x8d\x86\x73\x68\x78\x1c\x0d\xcf\xa2\x77\x8b\xd0\xbb\x15\xe8\xdd\x3a\xf4\x6e\x33\x7a\x37\x8a\xde\xed\x46\xef\x26\xd1\xbb\x83\xe8\xdd\x31\xf4\x5e\x12\xbd\x37\x80\x7e\x9f\x42\xbf\x1f\x44\xbf\x1f\x47\x23\xfd\x68\x64\x08\x8d\x4c\xa1\xf7\xf3\xd1\xfb\x25\xe8\xfd\x2a\xf4\x7e\x03\x7a\xbf\x15\xbd\xdf\x81\xde\xef\x41\xef\xa7\xd1\xfb\x39\xf4\xfe\x38\x7a\x7f\x16\xfd\x61\x0c\x7d\x90\x41\x1f\x0c\xa3\x0f\x26\xd1\x68\x1e\x1a\x0d\xa0\xd1\x2a\x34\xda\x88\x46\x5b\xd1\x68\x07\x1a\xed\x41\xa3\x69\x34\x9a\x43\xa3\xe3\x68\x74\x16\xfd\xb1\x08\xfd\xb1\x1c\xfd\xb1\x16\x7d\x58\x86\x3e\xac\x41\x1f\x06\xd1\x9f\x62\xe8\x4f\x7d\xe8\x4f\x03\xe8\x4f\xa3\xe8\x4f\xd3\x68\xac\x00\x8d\x95\xa2\xb1\x6a\x34\xd6\x88\xc6\xc2\xe8\xa3\x1e\xf4\x51\x1a\x7d\x94\x43\x1f\x4d\xa0\x8f\xf3\xd0\xc7\x01\xf4\x71\x25\xfa\xb8\x1e\x7d\xdc\x82\x3e\x6e\x43\x9f\x74\xa1\x4f\xfa\xd0\x27\x59\xf4\xc9\x08\xfa\x64\x0a\x8d\xe7\xa3\xf1\x12\x34\x5e\x8d\xc6\x1b\xd1\x78\x2b\x1a\xef\x40\xe3\x3d\x68\x3c\x8d\xc6\x73\x68\x7c\x1c\x8d\xcf\xa2\x4f\x8b\xd1\xa7\x15\xe8\xd3\x7a\xf4\x69\x0b\xfa\xb4\x0d\x7d\xda\x8d\x3e\x4d\xa2\x4f\x07\xd0\xa7\xa3\xe8\xd3\x69\xf4\xdf\x05\xe8\xbf\xcb\xd0\x7f\xd7\xa2\x3f\xb7\xa2\x3f\x77\xa0\x3f\xf7\xa1\x89\x0c\x9a\x18\x46\x13\x93\xe8\x2f\x79\xe8\x2f\x01\xf4\x97\x4a\xf4\x97\x7a\xf4\x97\x10\xfa\x4b\x3b\xfa\x6b\x1c\xfd\x35\x85\xfe\x9a\x43\x7f\x1d\x47\x7f\x9d\x45\xff\x53\x84\xfe\xa7\x02\xfd\x4f\x3d\xfa\x9f\x10\x9a\xfc\xd7\xda\xd1\x64\x1c\x4d\xa6\xd0\x64\x0e\x4d\x4e\xa0\xcf\x40\x9f\x05\xd0\x67\x95\xe8\xb3\x7a\xf4\x59\x08\x7d\xd6\x81\x3e\xeb\x41\x9f\xa5\xd1\x67\x39\xf4\xd9\x38\xfa\x5f\xd0\xff\x16\xa3\xcf\x9b\xd0\xe7\x11\xf4\x79\x17\xfa\x3c\x81\x3e\xcf\xa0\xcf\x47\xd0\xe7\x53\x68\xaa\x00\x4d\x95\xa1\xa9\x1a\x34\x15\x44\x53\x61\x34\xd5\x89\xa6\x7a\xd1\x54\x3f\x9a\x1a\x42\x53\x13\xe8\x8b\x3c\xf4\x45\x00\x7d\x51\x89\xbe\x68\x40\x5f\x84\xd0\x17\xed\xe8\x8b\x1e\xf4\x45\x16\x7d\x31\x82\xbe\x98\x42\x5f\xe6\xa3\x2f\x4b\xd0\x97\xd5\xe8\xcb\x20\xfa\x32\x8c\xbe\xec\x42\x5f\x26\xd0\x97\x19\x34\x5d\x80\xa6\x4b\xd1\x74\x35\x9a\x6e\x44\xd3\x61\x34\xdd\x89\xa6\x7b\xd1\x74\x3f\x9a\x1e\x42\xd3\x93\xe8\x6f\xf9\xe8\x6f\x25\xe8\x6f\x55\xe8\x6f\x0d\xe8\xab\x4e\xf4\x55\x02\x7d\x95\x41\x5f\x8d\xa0\xaf\xa6\xd1\xd7\x05\xe8\xeb\x52\xf4\x75\x35\xfa\x3a\x88\xbe\x0e\xa3\xaf\x3b\xd1\xd7\xbd\xe8\xeb\x7e\x34\x33\x8b\xfe\x5e\x84\xfe\x5e\x81\xfe\xde\x80\xfe\xde\x8a\xfe\x31\x80\xfe\x31\x8e\xbe\x01\x7d\x53\x8c\xbe\xa9\x40\xdf\xd4\xa1\x6f\x5a\xd0\x37\xed\xe8\x9b\x1e\xf4\x4d\x1a\xcd\x66\xd1\xec\x08\x9a\x9d\x42\xdf\xe6\xa3\x6f\x4b\xd0\xb7\xd5\xe8\xdb\x20\xfa\x36\x8c\xbe\xed\x44\xdf\xf6\xa2\x6f\x07\xd0\xb7\xe3\xe8\xdb\x59\xf4\xcf\x46\xf4\xcf\x28\xfa\x67\x0c\xfd\x33\x83\xff\x5b\x39\xfe\x9d\x4e\xfc\x3b\xbd\xf8\x77\xfa\xf1\xef\x0c\xe1\xdf\x99\xc6\xbf\x5b\x88\x7f\xb7\x1c\xff\x6e\x2d\xfe\xdd\x26\xfc\xbb\x51\xfc\xbb\x31\xfc\xbb\x7d\xf8\x77\x73\xf8\x77\x27\xf0\xbc\x02\x3c\xaf\x14\xff\xf7\x1e\xfc\xdf\xd3\xf8\xbf\x0f\xe1\xff\x3e\x81\x7f\x0f\xfc\x7b\x25\xf8\xf7\xaa\xf0\xef\x35\xe0\xdf\x6b\xc5\xbf\xd7\x81\x7f\xaf\x07\xcf\x2f\xc4\xad\x13\xb7\x5e\xdc\xfa\x71\xaf\xc0\xbd\x0e\xf7\x66\xdc\xa3\xb8\xc7\x70\xef\xc3\x3d\x8b\xfb\x08\xee\xb3\x78\x41\x09\x5e\x50\x85\x17\x34\xe0\x05\x11\xbc\xa0\x07\x2f\x48\xe3\x05\x39\xbc\x60\x1c\x2f\x98\xc5\xf7\x2b\xc6\xf7\xab\xc1\xf7\x6b\xc2\xf7\x8b\xe0\xfb\x75\xe1\xfb\x25\xf0\xfd\x06\xf1\xfd\xc6\xf0\xfd\x66\xf0\xfd\x8b\xf1\xfd\x6b\xf0\xfd\x83\xf8\xfe\x63\xf8\xfe\x33\xf8\x01\x85\xf8\x01\x65\xf8\x01\x35\xf8\x01\x41\xfc\x80\x30\x7e\x40\x27\x7e\x40\x2f\x7e\x40\x3f\x7e\xc0\x10\x7e\xc0\x04\x5e\x08\x5e\x58\x8c\x17\x56\xe0\x85\x75\x78\x61\x33\x5e\x18\xc5\x0b\x63\x78\x61\x12\x2f\x1c\xc4\x0b\xc7\xf0\xc2\x19\xfc\xc0\x42\xfc\xc0\x32\xfc\xc0\x5a\xfc\xc0\x26\xfc\xc0\x08\x7e\x60\x17\x7e\x60\x02\x3f\x30\x83\x1f\x38\x8c\x1f\x38\x89\x1f\x94\x87\x1f\x14\xc0\x0f\xaa\xc4\x0f\xaa\xc7\x0f\x6a\xc1\x0f\x6a\xc7\x0f\x8a\xe3\x07\x77\xe1\x07\x27\xf0\x83\x33\xf8\xc1\xc3\x78\x51\x1f\x5e\x94\xc5\x8b\x46\xf0\xa2\x29\xfc\x90\x7c\xfc\x90\x31\xfc\x90\x59\xfc\xd0\x00\x7e\x68\x25\x7e\x68\x3d\x7e\x68\x0b\x7e\x68\x1b\x7e\x68\x37\x7e\x68\x12\x3f\x74\x00\x3f\x74\x14\x3f\x74\x1a\x3f\xac\x00\x3f\xac\x0c\x3f\xac\x06\x3f\x2c\x88\x1f\x16\xc6\x0f\xeb\xc4\x0f\xeb\xc5\x0f\xeb\xc7\x0f\x1b\xc1\x0f\x9b\xc2\x8b\xf3\xf1\xe2\x12\xbc\xb8\x0a\x2f\x6e\xc0\x8b\x43\x78\x71\x3b\x5e\x1c\xc7\x8b\x53\x78\xf1\x20\x5e\x3c\x86\x17\xcf\xe0\x87\x17\xe2\x87\x97\xe1\x87\xd7\xe2\x87\x37\xe1\x87\x47\xf0\xc3\x63\xf8\xe1\x7d\xf8\xe1\x59\xfc\xf0\x11\xfc\xf0\x29\xfc\x88\x7c\xfc\x88\x12\xfc\x88\x2a\xfc\x88\x06\xfc\xc8\x1e\xfc\xc8\x34\x7e\x64\x0e\x3f\x72\x1c\x3f\x72\x16\x0f\x14\xe1\x81\x0a\xfc\xa8\x1a\xfc\xa8\x20\x7e\x54\x04\x3f\xaa\x0b\x3f\x2a\x81\x1f\x95\xc1\x8f\x1a\xc6\x8f\x9a\xc4\x8f\xce\xc3\x8f\x2e\xc5\x8f\xae\xc3\xff\x23\x8a\xff\x47\x0c\xff\x8f\x3e\xfc\x3f\xb2\xf8\x7f\x8c\xe0\xff\x31\x85\x97\xe4\xe3\x25\x25\x78\x49\x15\x5e\xd2\x80\x97\x84\xf0\x92\x76\xbc\x24\x8e\x97\xa4\xf0\x92\x1c\x5e\x32\x81\x7f\x3f\x0f\xff\x7e\x09\xfe\xfd\x2a\xfc\x98\x7c\xfc\x98\x62\xfc\x98\x0a\xfc\xd8\x42\xfc\xd8\x32\xfc\xd8\x1a\xfc\xd8\x20\x7e\x6c\x18\x3f\xb6\x13\x3f\xb6\x17\x3f\xb6\x1f\x3f\x76\x08\x3f\x76\x02\x2f\x05\x2f\x2d\xc6\x4b\x2b\xf0\xd2\x3a\xbc\xb4\x19\x2f\x8d\xe2\xa5\x31\xbc\xb4\x0f\x2f\xcd\xe2\xa5\x23\x78\xe9\x14\x7e\x5c\x3e\x7e\x5c\x09\x7e\x5c\x15\x7e\x5c\x03\x7e\x5c\x08\x3f\xae\x1d\x3f\xae\x07\x3f\x2e\x8d\x1f\x97\xc3\x8f\x1b\xc7\x8f\x9b\xc5\x8f\x2f\xc2\x8f\x2f\xc7\x8f\xaf\xc5\x8f\x6f\xc2\x8f\x8f\xe0\xc7\x77\xe1\xc7\x27\xf0\xe3\x33\xf8\xf1\xc3\xf8\xf1\x53\x78\x59\x39\x5e\x56\x8b\x97\x35\xe3\x65\x6d\x78\x59\x37\x5e\x96\xc4\xcb\x06\xf0\xb2\x51\xfc\x84\x7c\xfc\x84\x12\xfc\x84\x2a\xfc\x84\x06\xfc\x84\x10\x7e\x42\x3b\x7e\x42\x1c\x3f\x21\x85\x9f\x30\x88\x9f\x30\x86\x9f\x30\x83\x9f\x58\x88\x9f\x58\x86\x9f\x58\x83\x9f\x18\xc4\x4f\x0c\xe3\x27\x76\xe2\x27\xf6\xe2\x27\xf6\xe3\x27\x0e\xe1\x27\x4e\xe0\x27\x81\x9f\x54\x8c\x9f\x54\x81\x9f\x54\x87\x9f\xd4\x8c\x9f\x14\xc5\x4f\x8a\xe1\x27\xf5\xe1\x27\x65\xf1\x93\x46\xf0\x93\xa6\xf0\xf2\x02\xbc\xbc\x0c\x2f\xaf\xc1\xcb\x83\x78\x79\x18\x2f\xef\xc4\xcb\x7b\xf1\xf2\x7e\xbc\x7c\x08\x2f\x9f\xc0\x4f\xce\xc3\x4f\x0e\xe0\x27\x57\xe3\x27\x37\xe2\x27\x87\xf1\x93\xbb\xf0\x93\x13\xf8\xc9\x19\xfc\xe4\x61\xfc\xe4\x29\xfc\x94\x7c\xfc\x94\x12\xfc\x94\x2a\xfc\x94\x20\x7e\x4a\x04\x3f\xa5\x0b\x3f\x25\x81\x9f\x92\xc1\x4f\x19\xc6\x4f\x99\xc4\x4f\xcd\xc3\x4f\x0d\xe0\xa7\x56\xe2\xa7\xd6\xe3\xa7\xb6\xe0\xa7\xb6\xe1\xa7\x76\xe3\xa7\x26\xf1\x53\x07\xf0\x53\x47\xf1\x53\xa7\xf1\x8a\x02\xbc\xa2\x0c\xaf\xa8\xc1\x2b\x82\x78\x45\x18\xaf\xe8\xc4\x2b\x7a\xf1\x8a\x7e\xbc\x62\x08\xaf\x98\xc0\x4f\x03\x3f\x2d\x80\x9f\x56\x89\x9f\x56\x8f\x9f\xd6\x82\x9f\xd6\x86\x9f\xd6\x8d\x9f\x96\xc6\x4f\xcb\xe1\xa7\x8d\xe3\xa7\xcd\xe2\xa7\x17\xe1\xa7\x97\xe3\xa7\xd7\xe2\xa7\x37\xe1\xa7\x47\xf0\xd3\xbb\xf0\xd3\x13\xf8\xe9\x19\xfc\xf4\x61\xfc\xf4\x49\xfc\x8c\x3c\xfc\x8c\x00\x7e\x46\x25\x7e\x46\x3d\x7e\x46\x0b\x7e\x46\x1b\x7e\x46\x37\x7e\x46\x12\x3f\x63\x00\x3f\x63\x14\x3f\x63\x1a\xaf\x2c\xc0\x2b\x4b\xf1\xca\x6a\xbc\xb2\x11\xff\x41\x0a\xff\x41\x0e\x3f\xb3\x10\x3f\xb3\x0c\x3f\xb3\x06\x3f\x33\x88\x9f\x19\xc6\xcf\xec\xc4\xcf\xec\xc5\xcf\xec\xc7\xcf\x1c\xc6\xcf\x9c\xc4\xab\xf2\xf0\xaa\x00\x5e\x55\x89\x57\x35\xe2\x55\xad\x78\x55\x07\x5e\xd5\x83\x57\xa5\xf1\xaa\x1c\x5e\x35\x8e\x57\xcd\xe2\x67\x15\xe1\x67\x95\xe3\x67\xd5\xe2\x67\x35\xe1\x67\x45\xf0\xb3\xba\xf0\xb3\x12\xf8\x59\x19\xfc\xac\x61\xfc\xac\x49\xfc\xec\x3c\xfc\xec\x00\x7e\x76\x25\x7e\x76\x3d\x7e\x76\x0b\x7e\x76\x1b\x7e\x76\x37\x7e\x76\x12\x3f\x7b\x00\x3f\x7b\x14\x3f\x7b\x06\x3f\xa7\x08\x3f\xa7\x1c\x3f\xa7\x16\x3f\xa7\x09\x3f\x27\x82\x9f\xd3\x85\x9f\x93\xc0\xcf\xc9\xe0\xe7\x0c\xe3\xe7\x4c\xe2\xd5\x79\x78\x75\x00\xaf\xae\xc4\xab\xeb\xf1\xea\x10\x5e\xdd\x8e\x57\xc7\xf1\xea\x14\x5e\x3d\x88\x57\x8f\xe1\xd5\x33\xf8\x8f\x0a\xf1\x1f\x95\xe1\x3f\xaa\xc1\x7f\x14\xc4\x7f\x14\xc6\x7f\xd4\x89\xff\x28\x81\xff\x28\x83\xff\x68\x18\xff\xd1\x24\x7e\x6e\x1e\x7e\x6e\x00\x3f\xb7\x0a\x3f\xb7\x11\x3f\xb7\x15\x3f\xb7\x03\x3f\xb7\x07\x3f\xb7\x1f\x3f\x77\x08\x3f\x77\x02\xff\x31\xf8\x8f\x8b\xf1\x1f\x57\xe2\x3f\xae\xc7\x7f\xdc\x82\xff\xb8\x1d\x3f\xaf\x00\x3f\xaf\x14\x3f\xaf\x1a\x3f\x2f\x88\x9f\x17\xc6\xcf\xeb\xc4\xcf\xeb\xc5\xcf\xcb\xe2\xe7\x8d\xe0\xe7\x4d\xe3\xe7\x17\xe0\xe7\x97\xe2\xe7\x57\xe3\xe7\x07\xf1\xf3\xc3\xf8\xf9\x9d\xf8\xf9\x09\xfc\xfc\x0c\x7e\xfe\x30\x7e\xfe\x24\x7e\x41\x1e\x7e\x41\x00\xbf\xa0\x12\xbf\xa0\x1e\xbf\xa0\x05\xbf\xa0\x0d\xbf\xa0\x07\xbf\x20\x8d\x5f\x90\xc3\x2f\x18\xc7\x2f\x98\xc5\x6b\x8b\xf0\xda\x72\xbc\xb6\x16\xaf\x6d\xc2\x6b\x23\x78\x6d\x17\x5e\x9b\xc0\x6b\x33\x78\xed\x08\x5e\x3b\x8b\x5f\x58\x84\x5f\x58\x8e\x5f\x58\x8b\x5f\xd8\x84\x5f\xd8\x86\x5f\xd8\x8d\x5f\x98\xc4\x2f\x1c\xc0\x2f\x1c\xc3\x2f\x9c\xc5\x2f\x2a\xc2\x2f\x2a\xc7\x2f\xaa\xc5\x2f\x6a\xc2\x2f\x8a\xe0\x17\x75\xe1\x17\x25\xf0\x8b\x32\xf8\x45\x23\xf8\x45\x53\xf8\xc5\xf9\xf8\xc5\x25\xf8\xc5\x55\xf8\xc5\x0d\xf8\xc5\x21\xfc\xe2\x76\xfc\xe2\x38\x7e\x71\x0a\xbf\x78\x10\xbf\x78\x0c\xbf\x78\x06\xaf\x2b\xc4\xeb\xca\xf1\xba\x5a\xbc\xae\x09\xaf\x8b\xe2\x75\x31\xbc\xae\x0f\xaf\x1b\xc0\xeb\x46\xf1\xba\x69\xfc\x92\x02\xfc\x92\x52\xfc\x92\x6a\xfc\x92\x46\xfc\x92\x56\xfc\x92\x4e\xfc\x92\x5e\xfc\x92\x7e\xfc\x92\x21\xfc\x92\x09\xfc\xd2\x7c\xfc\xd2\x12\xfc\xd2\x6a\xfc\xd2\x46\xfc\xd2\x56\xfc\xd2\x0e\xfc\xd2\x1e\xfc\xd2\x34\x7e\x69\x0e\xbf\x74\x1c\x9f\x93\x87\xcf\x09\xe0\x73\x2a\xf1\x39\xf5\xf8\x9c\x16\x7c\x4e\x1b\x3e\x27\x8e\xcf\x49\xe1\x73\x06\xf1\x39\x63\xf8\x9c\x19\xbc\xbe\x10\xff\x7f\xb3\xf8\x65\x45\xf8\x65\x15\xf8\x65\x75\xf8\x65\xcd\xf8\x65\x51\xfc\xb2\x18\x7e\x59\x12\xbf\x6c\x00\xbf\x6c\x0c\xbf\x6c\x06\xbf\xbc\x10\xbf\xbc\x0c\xbf\xbc\x16\xbf\xbc\x09\xbf\x3c\x8a\x5f\x1e\xc3\x2f\xef\xc3\x2f\xcf\xe2\x97\x8f\xe0\x97\x4f\xe1\x0d\xf9\x78\x43\x29\xde\x50\x83\x37\x34\xe1\x0d\x11\xbc\xa1\x0b\x6f\x48\xe0\x0d\x19\xbc\x61\x18\x6f\x98\xc4\xaf\xc8\xc7\xaf\x28\xc1\xaf\xa8\xc2\xaf\x68\xc0\xaf\x08\xe1\x57\xb4\xe3\x57\xc4\xf1\x2b\x52\xf8\x15\x83\xf8\x15\x63\xf8\x15\x33\xf8\x95\x85\xf8\x95\x65\xf8\x95\x35\x78\xe3\x00\xfe\xd3\x1a\xfc\xa7\x41\xfc\xa7\x61\xfc\xa7\x9d\xf8\x4f\x7b\xf1\x9f\xf6\xe3\x3f\x1d\xc2\x7f\x3a\x81\xcf\x05\x9f\x5b\x8c\xcf\xad\xc0\xe7\xd6\xe1\x73\x9b\xf1\xb9\x51\x7c\x6e\x0c\x9f\x9b\xc4\xe7\x0e\xe0\x73\x47\xf1\xb9\xd3\xf8\x55\x05\xf8\x55\xa5\xf8\x55\xd5\xf8\x55\x8d\xf8\x55\xad\xf8\x55\x1d\xf8\x55\x3d\xf8\x55\x69\xfc\xaa\x1c\x7e\xd5\x38\x1e\x04\x0f\x16\xe3\xc1\x0a\x3c\x58\x87\x07\x9b\xf1\x60\x14\x0f\xc6\xf0\x60\x1f\x1e\xcc\xe2\xc1\x11\x3c\x38\x85\x5f\x9d\x8f\x5f\x5d\x82\x5f\x5d\x85\x5f\xdd\x80\x5f\x1d\xc2\xaf\x6e\xc7\xaf\x8e\xe3\x57\xa7\xf0\xab\x07\xf1\xab\xc7\xf0\xab\x67\xf1\x6b\x8a\xf0\x6b\xca\xf1\x6b\x6a\xf1\x6b\x9a\xf0\x6b\x22\xf8\x35\x31\xfc\x9a\x3e\xfc\x9a\x2c\x7e\xcd\x08\x7e\xcd\x14\x7e\x6d\x3e\x7e\x6d\x09\x7e\x6d\x15\x7e\x6d\x03\x7e\x6d\x08\xbf\xb6\x1d\xbf\x36\x8e\x5f\x9b\xc2\xaf\x1d\xc2\xaf\x9d\xc0\x9b\xc0\x9b\x8a\xf1\xa6\x0a\xbc\xa9\x0e\x6f\x6a\xc6\x9b\xa2\x78\x53\x0c\x6f\xea\xc3\x9b\xb2\x78\xd3\x08\xde\x34\x85\x5f\x97\x8f\x5f\x57\x82\x5f\x57\x85\x5f\xd7\x80\x5f\x17\xc2\xaf\x6b\xc7\xaf\x8b\xe3\xd7\xa5\xf0\xeb\x06\xf1\xeb\xc6\xf0\xeb\x66\xf0\xeb\x0b\xf1\xeb\xcb\xf0\xeb\x6b\xf0\xeb\x83\xf8\xf5\x61\xfc\xfa\x4e\xfc\xfa\x5e\xfc\xfa\x0c\x7e\xfd\x30\x7e\xfd\x24\x7e\x43\x1e\x7e\x43\x00\xbf\xa1\x0a\xbf\xa1\x01\xbf\x21\x84\xdf\xd0\x8e\xdf\x10\xc7\x6f\x48\xe1\x37\xe4\xf0\x1b\x26\xf0\x66\xf0\xe6\x00\xde\x5c\x89\x37\xd7\xe3\xcd\x2d\x78\x73\x1b\xde\xdc\x8d\x37\x27\xf1\xe6\x01\xbc\x79\x14\x6f\x9e\xc6\x6f\x2c\xc0\x6f\x2c\xc5\x6f\xac\xc6\x6f\x6c\xc4\x6f\x6c\xc5\x6f\xec\xc0\x6f\xec\xc1\x6f\x4c\xe3\x37\xe6\xf0\x1b\xc7\xf1\x1b\x67\xf1\x9b\x8a\xf0\x9b\xca\xf1\x9b\x6a\xf1\x9b\x9a\xf0\x9b\x22\xf8\x4d\x5d\xf8\x4d\x7d\xf8\x4d\x59\xfc\xa6\x11\xfc\xa6\x29\xfc\xe6\x7c\xfc\xe6\x52\xfc\xe6\x6a\xfc\xe6\x46\xfc\xe6\x30\x7e\x73\x27\x7e\xf3\x2c\xde\x52\x84\xb7\x94\xe3\x2d\xb5\x78\x4b\x13\xde\x12\xc1\x5b\xba\xf0\x96\x04\xde\x92\xc1\x5b\x86\xf1\x96\x49\xfc\x96\x3c\xfc\x96\x00\x7e\x4b\x15\x7e\x4b\x23\x7e\x4b\x2b\x7e\x4b\x07\x7e\x4b\x0f\x7e\x4b\x1a\xbf\x25\x87\xdf\x32\x81\xdf\x0a\x7e\x6b\x31\x7e\x6b\x05\x7e\x6b\x1d\x7e\x6b\x33\x7e\x6b\x14\x9f\x57\x85\xcf\xab\xc7\xe7\x25\xf1\x50\x10\x0f\x85\xf1\xf9\x79\xf8\xfc\x00\x3e\xbf\x12\x9f\x3f\x8a\xcf\x9f\xc6\x17\x14\xe0\x0b\x4a\xf1\x05\xd5\xf8\x82\x46\x7c\x41\x2b\xbe\xa0\x03\x5f\xd0\x83\x2f\x48\xe3\x0b\x72\xf8\x82\x09\x7c\x21\xf8\xc2\x62\x7c\x61\x05\xbe\xb0\x0e\x5f\xd8\x8c\x2f\x8c\xe2\x0b\x63\xf8\xc2\x3e\x7c\x61\x16\x5f\x38\x82\x2f\x9c\xc6\x5b\x0b\xf1\xd6\x32\xbc\xb5\x06\x6f\x6d\xc2\x5b\xa3\x78\x6b\x0c\x6f\xed\xc3\x6f\x9b\xc4\x17\xe5\xe1\x8b\x02\xf8\xa2\x2a\x7c\x51\x03\xbe\x28\x84\x2f\x6a\xc7\x17\xc5\xf1\x45\x29\x3c\x9c\x8f\x87\x4b\xf1\x70\x35\xbe\x38\x84\x2f\x8e\xe1\x8b\xfb\xf0\xc5\x59\x7c\xf1\x28\xbe\x78\x06\x5f\x52\x88\x2f\xe9\xc4\xef\x28\xc0\xef\x18\xc0\xef\x18\xc5\xef\x98\xc6\x23\x05\x78\xa4\x1c\x8f\xd4\xe2\x91\x26\x3c\x12\xc1\x23\x5d\xf8\xcf\xda\xf1\x9f\xc5\xf1\x3b\x3b\xf0\x3b\x7b\xf0\x3b\x33\xf8\x9d\xc3\xf8\x9d\x93\xf8\x5d\x79\xf8\x5d\x01\xfc\xae\x29\x3c\x9a\x8f\x47\x4b\xf0\x68\x15\x1e\x6d\xc0\xa3\x21\x3c\xda\x8e\x47\xe3\x78\x34\x85\x47\x07\xf1\xe8\x18\xbe\xb4\x04\x5f\x5a\x85\x2f\x6d\xc0\x97\x86\xf0\xa5\xed\xf8\xd2\x38\xbe\x34\x85\x2f\x1d\xc4\x97\x8e\xe1\x6d\xf5\x78\x5b\x0b\xfe\x8b\x34\xfe\x8b\x1c\xfe\x8b\x71\xfc\x17\xb3\xf8\x3d\x45\xf8\x3d\xe5\xf8\x3d\xb5\xf8\x3d\x4d\xf8\x3d\x11\x7c\x59\x19\xbe\xac\x06\x5f\x16\xc4\x97\x85\xf1\x65\x9d\xf8\xb2\x5e\x7c\x59\x3f\xde\x3e\x8a\xb7\x4f\xe3\xcb\x0b\xf0\xe5\xa5\xf8\xf2\x1a\x7c\x79\x10\x5f\x1e\xc6\x97\x77\xe2\xcb\x7b\xf1\xe5\xfd\xf8\xf2\x21\x7c\xf9\x04\x7e\x2f\xf8\xbd\xc5\xf8\xbd\x15\xf8\xbd\x75\xf8\xbd\xcd\xf8\xbd\x51\xfc\xde\x38\x7e\x6f\x0a\xbf\x77\x10\xbf\x77\x0a\xbf\xaf\x10\xbf\xaf\x1c\xbf\xaf\x16\xbf\xaf\x05\xbf\xaf\x0d\xbf\xaf\x1b\xbf\x2f\x89\xdf\x37\x80\xdf\x37\x8a\xdf\x37\x8d\x77\x14\xe0\x1d\xa5\x78\x47\x35\xde\x11\xc4\x3b\xc2\x78\x47\x27\xde\xd1\x8b\x77\xf4\xe3\x1d\x43\x78\xc7\x04\xbe\x02\x7c\x45\x31\xbe\xa2\x02\x5f\x51\x87\xaf\x68\xc6\x57\x44\xf1\x15\x31\x7c\x45\x1f\xbe\x62\x00\x5f\x31\x8a\xaf\x98\xc6\xef\x2f\xc0\x1f\x88\xe2\x0f\xc4\xf0\x07\xfa\xf0\x07\xb2\xf8\x03\x23\xf8\x03\x53\x78\x67\x3e\xde\x99\xc1\xff\xab\x0c\xff\xaf\x01\xfc\xbf\x46\xf1\x5f\x86\xf1\x5f\x76\xe2\xbf\x6a\xc2\xbb\x5a\xf1\x07\xab\xf1\x87\x02\xf8\x43\x95\xf8\x43\x09\xfc\xa1\x0c\xfe\xd0\x30\xfe\xd0\x24\xfe\x70\x1e\xfe\x70\x00\x7f\xb8\x17\x7f\xb8\x1f\x7f\x78\x08\x7f\x78\x02\x8f\x81\xc7\x8a\xf1\x58\x05\x1e\xab\xc3\x63\xcd\x78\x2c\x8a\xc7\x62\x78\xac\x0f\x8f\x65\xf1\xd8\x08\x1e\x9b\xc2\x1f\xc9\xc7\x1f\x29\xc1\x1f\xa9\xc6\x1f\x69\xc4\x1f\x69\xc5\x1f\xe9\xc0\x1f\xe9\xc5\x1f\xe9\xc7\x1f\x19\xc2\x1f\x99\xc0\x57\x82\xaf\x2c\xc6\x57\x56\xe0\x2b\xeb\xf0\x95\xcd\xf8\xca\x28\xbe\x32\x86\xaf\x4c\xe1\xab\xca\xf0\x55\x35\xf8\xaa\x20\xbe\x2a\x8c\xaf\xea\xc4\x57\xf5\xe2\xab\xfa\xf1\x55\x43\xf8\xaa\x09\xbc\x3b\x0f\xef\x0e\xe0\xdd\x95\x78\x77\x3d\xde\x1d\xc2\xbb\xdb\xf1\x47\xa3\xf8\xa3\x31\xfc\xd1\x24\xbe\xba\x1d\x5f\x1d\xc7\x57\xa7\xf0\xd5\x39\x7c\xf5\x04\xbe\x06\x7c\x4d\x31\xbe\xa6\x02\x5f\x53\x87\xaf\x69\xc1\xd7\xb4\xe1\x6b\xba\xf1\x35\x49\x7c\xcd\x00\xbe\x66\x14\x5f\x33\x8d\xc7\x0b\xf0\x78\x29\x1e\xaf\xc6\xe3\x8d\x78\xbc\x15\x8f\x77\xe0\xf1\x1e\x3c\x9e\xc6\xe3\x39\x3c\x3e\x8e\xc7\x67\xf1\xb5\x01\x7c\x6d\x15\xbe\xb6\x01\x5f\xdb\x8a\xaf\xed\xc0\xd7\xf6\xe0\x6b\x33\xf8\xda\x61\x7c\xed\x24\xfe\x58\x1e\xfe\x58\x09\xfe\x78\x27\xfe\x78\x2f\xfe\x78\x06\x7f\xa2\x02\x7f\xa2\x0e\x7f\xa2\x19\x7f\xa2\x0d\x7f\x22\x8e\x3f\x91\xc2\x9f\x18\xc4\x9f\x18\xc3\x9f\x98\xc5\x7f\x5d\x84\xff\xba\x1c\xff\x75\x2d\xfe\xeb\x26\xfc\xd7\x51\xfc\xd7\x31\xfc\xd7\x7d\xf8\xaf\xb3\xf8\x93\x0d\xf8\x93\x19\xfc\xc9\x11\xfc\xc9\x29\xbc\x37\x89\xf7\x0e\xe0\xeb\x7a\xf1\x75\xfd\xf8\xba\x21\x7c\xdd\x2c\xbe\xbe\x0f\x5f\x9f\xc5\xd7\x8f\xe0\xeb\xa7\xf0\xa7\x0a\xf0\xa7\xca\xf0\xa7\x6a\xf0\xa7\x82\xf8\x53\x61\xfc\xa9\x4e\x3c\x51\x88\x27\xca\xf0\x44\x0d\x9e\x18\xc2\x13\x13\xf8\x06\xf0\x0d\x11\x7c\x43\x17\xbe\x21\x81\x6f\xc8\xe0\x1b\x86\xf1\x0d\x53\xf8\xc6\x7c\x7c\x63\x09\xbe\xb1\x0a\xdf\xd8\x80\x6f\x0c\xe1\x1b\xdb\xf1\x8d\x71\x7c\x63\x0a\xdf\x38\x88\x6f\x1c\xc3\x37\xb5\xe1\x9b\xba\xf1\x4d\x49\x7c\xd3\x00\xbe\x69\x14\xdf\x34\x8d\xf7\x15\xe0\x7d\xa5\x78\x5f\x35\xde\xd7\x88\xf7\xb5\xe2\x9b\xeb\xf0\xcd\xcd\xf8\xe6\x28\xbe\x39\x86\x6f\xee\xc3\x37\x67\xf1\xcd\x23\xf8\x96\x16\x7c\x4b\x1b\xbe\xa5\x1b\xdf\x92\xc4\xb7\x0c\xe0\x5b\x46\xf1\x2d\xd3\xf8\xd6\x02\x7c\x6b\x1f\x9e\xac\xc7\x93\x2d\x78\xb2\x0d\x4f\x76\xe3\xc9\x24\x9e\x1c\xc0\x93\xa3\x78\x72\x1a\xdf\x56\x80\x6f\x2b\xc5\xb7\x55\xe3\xdb\x1a\xf1\x6d\xad\xf8\xb6\x0e\x7c\x5b\x2f\xbe\xad\x1f\xdf\x36\x84\x6f\x9b\xc4\xb7\xe7\xe1\xdb\x03\xf8\xf6\x4a\x7c\x7b\x3d\xbe\xbd\x05\xdf\xde\x86\x6f\xef\xc6\xb7\x27\xf1\xed\x03\xf8\xf6\x51\x7c\xfb\x34\xfe\x9b\x02\xfc\x37\xa5\xf8\x6f\xaa\xf1\x54\x0d\x9e\x0a\xe2\xa9\x30\x9e\xea\xc4\x53\xbd\x78\xaa\x1f\x4f\x0d\xe1\xa9\x09\x7c\x07\xf8\x8e\x62\x7c\x47\x05\xbe\xa3\x0e\xdf\xd1\x8c\xef\x88\xe2\x3b\x62\xf8\x8e\x3e\x7c\x47\x16\xdf\x31\x82\xef\x98\xc2\x9f\x1e\xc3\x9f\x9e\xc1\x77\x16\xe2\x3b\xcb\xf0\x9d\xb5\xf8\xce\x26\x7c\x67\x3b\xbe\x33\x8e\xef\x4c\xe1\x3b\x07\xf1\x9d\x63\xf8\xce\x19\x3c\x5d\x88\xa7\xcb\xf1\x74\x2d\x9e\x6e\xc2\xd3\x11\x3c\xdd\x85\xa7\x13\xf8\x33\x31\xfc\xd9\x1e\xfc\xd9\x34\xfe\x6c\x0e\x7f\x76\x1c\x7f\x76\x16\x7f\xae\x08\x7f\xae\x02\x7f\xae\x0e\x7f\xae\x19\x7f\x2e\x8a\x3f\x17\xc3\x9f\xeb\xc3\xfb\x7b\xf1\xfe\x7e\xbc\x7f\x08\xef\x9f\xc4\x77\xe5\xe1\xbb\xc6\xf1\x5d\xb3\xf8\xee\x22\x7c\x77\x39\xbe\xbb\x16\xdf\xdd\x84\xef\x8e\xe0\xbb\xbb\xf0\xdd\x09\x7c\x77\x06\xcf\xe4\xe1\x99\x00\x9e\xa9\xc4\x33\xf5\x78\xa6\x15\xcf\x74\xe0\x99\x1e\x3c\x93\xc6\x33\x39\x3c\x33\x8e\x67\x66\xf1\x3d\x45\xf8\x9e\x72\x7c\x4f\x2d\xbe\xa7\x09\xdf\x13\xc1\xf7\x74\xe1\x7b\xfa\xf0\x3d\x59\x7c\xcf\x08\xbe\x67\x0a\xdf\x9b\x8f\xef\x2d\xc1\xf7\x56\xe1\x7b\x1b\xf0\xbd\x21\x7c\x6f\x3b\xbe\x37\x8e\xef\x4d\xe1\x7b\x07\xf1\xbd\x63\xf8\xde\x19\x7c\x5f\x21\xbe\xaf\x0c\xdf\x57\x83\xef\x6b\xc6\xf7\x45\xf1\x7d\x31\x7c\x5f\x1f\xbe\x2f\x8b\xef\x1b\xc1\xf7\x4d\xe1\xd9\x7c\x3c\x5b\x82\x67\xab\xf0\x6c\x03\x9e\x0d\xe1\xd9\x76\x3c\x1b\xc7\x5f\x88\xe2\x2f\xc4\xf0\x17\xfa\xf0\x17\xb2\xf8\x0b\x23\xf8\x0b\x53\xf8\x8b\xf9\xf8\x8b\x25\xf8\x8b\x55\xf8\x8b\x0d\xf8\x8b\x21\xfc\xc5\xff\x9f\x43\x35\x00\xaf\x7b\xb0\xfb\xf6\xef\xea\x69\x9b\xf6\xf7\xf9\xfc\x44\x7b\x90\x56\x78\x33\x82\xf0\x86\x65\x04\xb1\x1d\x04\x99\x05\x99\xe5\xb5\x83\x20\x88\xc9\xf3\x2c\x26\x08\x4f\x10\x04\x79\x89\x89\x2d\xdb\xb2\x3d\xb1\xc5\xb3\x83\xbc\x5b\x10\x1c\x04\xc7\x23\x0f\x61\xc1\xd1\xa6\x9c\x56\x68\xaa\x51\x41\xb6\x85\x65\x16\x1a\xed\x41\x70\xe8\xff\xf2\xbf\xbe\xd7\xf7\xba\xef\xeb\x73\xdd\x1d\x04\x2f\xf4\x11\xbc\x30\x44\xf0\xc2\x18\xc1\x0b\xd3\x04\x2f\x2c\x10\xbc\x98\x4f\xf0\x62\x09\xc1\x8b\x95\x04\x2f\xd6\x11\xbc\xd8\x42\xf0\x62\x17\xc1\x8b\xfd\x04\x2f\x0e\x13\xbc\x38\x4e\xf0\xe2\x2c\x41\x1a\x82\x74\x21\x41\xba\x9c\x20\x5d\x4b\x90\x6e\x26\x48\x77\x12\xa4\x13\x04\xe9\x14\x41\x3a\x43\x90\x9e\x21\x48\xe7\x08\x5e\x8a\x12\xbc\x54\x4a\xf0\x52\x35\xc1\x4b\x0d\x04\x2f\xb5\x13\xbc\xd4\x47\xf0\xd2\x10\xc1\x4b\x63\x04\x2f\x4d\x13\xbc\xb4\x40\xb0\x36\x4a\xb0\xb6\x94\x60\x6d\x15\xc1\xda\x7a\x82\xb5\x6d\x04\x6b\x7b\x08\xd6\x0e\x12\xac\x1d\x25\x58\x3b\x49\xb0\x76\x81\x60\x5d\x3e\xc1\xba\x12\x82\x75\x95\x04\xeb\xea\x08\xd6\xb5\x10\xac\xeb\x22\x58\xd7\x4f\xb0\x6e\x98\x60\xdd\x38\xc1\x58\x96\x60\xbd\x08\xd6\x17\x13\xac\x8f\x11\xac\x8f\x13\xac\x6f\x26\x58\xdf\x49\xf0\x72\x92\xe0\xe5\x34\xc1\xcb\xd3\x04\x2f\x2f\x10\x64\x7a\x09\x32\x49\x82\x4c\x9a\x20\x33\x4d\x90\x59\x20\xd8\x90\x4f\xb0\xa1\x84\x60\x43\x25\xc1\x86\x3a\x82\x0d\x2d\x04\x1b\xba\x08\x36\xf4\x13\x6c\x18\x26\xd8\x30\x4e\xb0\x61\x96\x60\x23\x04\x1b\x0b\x08\x36\x96\x13\x6c\xac\x25\xd8\xd8\x4c\xb0\xb1\x93\x60\x63\x82\x60\x63\x8a\x60\x63\x86\x60\xe3\x0c\xc1\xc6\x1c\xc1\xab\x51\x82\x57\xcb\x08\x5e\xad\x26\x78\xb5\x81\xe0\xd5\x36\x82\x57\x7b\x08\x5e\x1d\x24\x78\x75\x94\xe0\xd5\x49\x82\x57\xe7\x09\xc6\xf3\x08\xc6\x8b\x08\xc6\x63\x04\xe3\x75\x04\xe3\x2d\x04\xe3\x5d\x04\xe3\xfd\x04\xe3\xc3\x04\xe3\xe3\x04\xe3\xb3\x04\xaf\x41\xf0\x5a\x01\xc1\x6b\x65\x04\xaf\xd7\x10\xbc\xde\x48\xf0\x7a\x3b\xc1\xeb\xbd\x04\xaf\x27\x09\x5e\x4f\x13\xbc\x3e\x45\xf0\x7a\x96\x60\x93\x08\x36\x15\x13\x6c\x8a\x11\x6c\x8a\x13\x6c\x6a\x26\xd8\x94\x21\xd8\x34\x43\xb0\x29\x47\x30\x31\x40\xb0\x39\x45\xb0\x79\x9c\xe0\x8d\x49\x82\x2d\x31\x82\x2d\x71\x82\x2d\xcd\x04\x5b\x3a\x09\xb6\x24\x08\xb6\xa4\x08\xb6\x64\x08\x26\x27\x09\x26\xe7\x09\xde\x6c\x21\x78\xb3\x8b\xe0\xcd\x7e\x82\x37\x47\x09\xde\x9c\x24\x78\x73\x9e\x60\x6b\x1e\xc1\xd6\x59\x82\xb7\x20\x78\xab\x9e\x60\x2a\x42\x30\xd5\x4d\xf0\x76\x21\xc1\xdb\xe5\x04\x6f\xd7\x10\xbc\x53\x4c\xf0\x6e\x84\xe0\xdd\x69\x82\xe9\x51\x82\xbf\x26\x09\xfe\xd6\x42\xf0\xf7\x6a\x82\xbf\x37\x10\xfc\xbd\x8d\x60\xa6\x89\x60\x66\x92\xe0\xbd\x26\x82\xf7\x16\x08\xde\xcf\x27\x78\xbf\x84\xe0\xfd\x4a\x82\xf7\xeb\x08\xde\x6f\x21\x78\xbf\x8b\xe0\xfd\x7e\x82\xf7\x87\x09\xde\x1f\x27\x78\x7f\x96\x60\x56\x04\xb3\xc5\x04\xb3\x69\x82\x7f\x8e\x11\xfc\x2b\x9f\x60\xae\x94\x60\x6e\x92\x60\x6e\x9e\xe0\xc3\x3c\x82\x0f\x8b\x08\x3e\xac\x20\xf8\xb0\x96\xe0\xc3\x26\x82\x0f\x3b\x08\x3e\xea\x26\xf8\x68\x80\xe0\xa3\x11\x82\x8f\x26\x08\x3e\x9a\x23\xd8\x16\x21\xd8\x56\x48\xb0\xad\x9c\x60\x5b\x0d\xc1\xb6\x46\x82\x6d\xed\x04\xdb\x7a\x09\xb6\x25\x09\xb6\xa5\x09\xb6\x4d\x11\x6c\xcb\x12\xcc\x8b\x60\xbe\x98\x60\x3e\x46\x30\x1f\x27\x98\x6f\x26\x98\xef\x24\x98\x4f\x10\xcc\xa7\x08\xe6\x33\x04\xf3\x33\x04\xf3\x39\x82\x8f\xa3\x04\x1f\x97\x12\x7c\x5c\x45\xf0\x71\x3d\xc1\xc7\x6d\x04\x1f\xf7\x10\x7c\x3c\x48\xf0\xf1\x28\xc1\xc7\x93\x04\x1f\xcf\x13\x6c\x17\xc1\xf6\x52\x82\xed\x55\x04\xdb\xeb\x09\xb6\xb7\x12\x6c\xef\x26\xd8\x3e\x40\xb0\x7d\x84\x60\xfb\x04\xc1\xf6\x39\x82\x1d\x11\x82\x1d\x85\x04\x3b\xca\x09\x76\xd4\x10\xec\x68\x24\xd8\xd1\x4e\xb0\xa3\x97\x60\x47\x92\x60\xc7\x18\xc1\x8e\x69\x82\x1d\x0b\x04\xd9\x7c\x82\x6c\x09\x41\xb6\x92\x20\x5b\x47\x90\x6d\x23\xc8\xf6\x10\x64\x07\x09\xb2\xa3\x04\xd9\x49\x82\xec\x3c\xc1\x27\x79\x04\x9f\x14\x11\x7c\x52\x41\xf0\xc9\x30\xc1\xa7\xd5\x04\x9f\x36\x10\x7c\xda\x46\xf0\x59\x01\xc1\x67\x65\x04\x9f\x55\x13\x7c\xd6\x40\xf0\xd9\x37\x5b\x0f\xc1\x42\x84\x60\xa1\x86\x60\xa1\x91\x60\xa1\x9d\x60\xa1\x97\x60\x21\x49\xb0\x90\x26\x58\x98\x22\x58\xc8\x12\x7c\x9e\x4f\xf0\x79\x09\xc1\xe7\x95\x04\x9f\xd7\x11\x7c\xde\x42\xf0\x45\x11\xc1\x17\x03\x04\x5f\x46\x09\xbe\x2c\x25\xf8\xb2\x8a\xe0\xcb\x7a\x82\x2f\x67\x09\x72\x10\xe4\x0a\x08\x72\x65\x04\xb9\x6a\x82\x5c\x03\x41\xae\x8d\x20\xd7\x43\xf0\x55\x8c\xe0\xab\x38\xc1\x57\x33\x04\x5f\xe5\x08\xbe\x8e\x12\x7c\x5d\x4a\xf0\x75\x15\xc1\xd7\xf5\x04\x5f\xb7\x12\x7c\xdd\x4d\xf0\xf5\x00\xc1\xd7\x23\x04\x5f\x4f\x10\x7c\x3d\x47\xb0\x33\x42\xb0\xb3\x90\x60\x67\x39\xc1\xce\x1a\x82\x9d\x8d\x04\x3b\xdb\x09\x76\xf6\x12\xec\x4c\x12\xec\x4c\x13\xec\x9c\x22\xd8\x99\x45\xff\xff\x15\x23\x62\x88\x38\xa2\x19\x2d\xaa\x42\x8b\xea\xd1\xa2\x56\xb4\xa8\x1b\x2d\x1a\x40\x8b\x46\xd0\xa2\x09\xb4\x68\x0e\xed\x12\x41\x8b\x41\x8b\x0b\xd0\xe2\x32\xb4\xb8\x1a\x2d\x6e\x44\x8b\xdb\xd1\xe2\x5e\xb4\x38\x89\x16\xa7\xd1\xe2\x29\xb4\x78\x01\x45\xa2\x28\x52\x8a\x22\x55\x28\x32\x83\x22\x39\xb4\x24\x8a\x96\x94\xa2\x25\x55\x68\x49\x3d\x5a\xd2\x8a\x96\x74\xa3\x25\x03\x68\xc9\x08\x5a\x32\x81\x96\xcc\xa1\xa5\x11\xb4\xb4\x10\x2d\x2d\x47\x4b\x6b\xd0\xd2\x46\xb4\xb4\x03\x2d\xed\x43\x4b\x87\xd0\xb2\x66\xb4\xac\x13\x2d\x4b\xa0\x65\x29\xb4\x2c\x83\x96\xcd\xa0\x65\x39\x94\x17\x45\x79\xa5\x28\xaf\x0a\xe5\x35\xa0\xbc\x36\xb4\x3c\x8a\x96\x97\xa2\xe5\x55\x68\x79\x3d\x5a\xde\x8a\x96\xf7\xa0\xe5\x83\x68\xf9\x28\x5a\x3e\x89\x96\xcf\xa3\x15\x79\x68\x45\x11\x5a\x51\x81\x56\xd4\xa2\x15\x4d\x28\x28\x45\x41\x15\x0a\xea\x51\xd0\x8a\x82\x6e\x14\x0c\xa0\x60\x04\xa9\x11\xa9\x1d\xa9\x17\x29\x89\x34\x86\x34\x8d\xb4\x80\x9c\x8f\x5c\x82\x5c\x89\x5c\x87\x3c\x85\xc2\x21\x14\x66\xd0\xae\xcd\x68\xd7\x4e\xb4\x6b\x02\xe5\x77\xa0\xfc\x3e\xb4\x5b\x23\xda\xad\x0b\xed\x36\x80\x76\x1b\x45\xbb\x4d\xa2\xdd\xe6\xd1\xca\x3c\xb4\xb2\x08\xad\xac\x40\x2b\x6b\xd1\xca\x26\xb4\xb2\x03\xad\xec\x43\x2b\x87\xd0\xca\x0c\x5a\x39\x87\x56\xe5\xa1\x55\x45\x68\x55\x05\x5a\x55\x8b\x56\x35\xa1\x55\x1d\x68\x55\x1f\x5a\x35\x84\x56\x8d\xa1\x55\x33\x68\x55\x0e\x45\xa3\x28\x3a\x89\xa2\x59\xb4\x7b\x06\xed\x3e\x83\x76\xcf\xa1\x3d\x0a\xd0\x1e\x65\x68\x8f\x6a\xb4\x67\x11\xda\x33\x86\xf6\x9c\x46\x7b\x2e\xa0\x82\x7c\x54\x90\x45\xab\x85\x56\x0f\xa3\xd5\xe3\x68\xf5\x2c\x5a\x03\x5a\x53\x80\xd6\x94\xa1\x35\xd5\x68\x4d\x03\x5a\xd3\x86\xd6\xf4\xa0\x35\x49\xb4\x26\x8d\xf6\xaa\x41\x7b\x35\xa1\xbd\x3a\xd0\x5e\x7d\x68\xaf\x21\xb4\xd7\x18\xda\x6b\x06\xed\x95\x43\x85\x51\x54\x58\x8a\x0a\xab\x50\x61\x3d\x2a\x6c\x45\x85\xdd\xa8\x30\x89\x0a\xc7\x50\xe1\x2c\xda\x1b\xb4\x77\x01\xda\xbb\x0c\xed\x5d\x83\xf6\x6e\x44\x7b\xb7\xa3\xbd\x7b\xd1\xde\x43\x68\xef\x31\xb4\xf7\x0c\xda\x3b\x87\xf6\x29\x40\xfb\x94\xa3\x7d\x6a\xd1\x3e\x4d\x68\x9f\x0e\xb4\x4f\x02\xed\x93\x42\xfb\x64\xd0\x3e\x33\x68\x9f\x1c\xfa\x5f\x05\xe8\x7f\x8d\xa1\xff\x35\x87\x8a\x7a\x50\xd1\x20\x2a\x4a\xa3\xa2\x69\x54\xb4\x80\xbe\x15\x45\xdf\x2a\x45\xdf\x9a\x43\xfb\x46\xd0\xbe\x45\x68\xdf\x0a\xb4\x6f\x2d\xda\xb7\x09\xed\xdb\x81\xf6\x4d\xa0\x7d\x53\x68\xbf\x1e\xb4\xdf\x20\xda\x6f\x14\xed\x37\x85\xf6\xcb\xa2\x62\xa1\xe2\x12\x54\x5c\x85\x8a\xeb\x51\x71\x1b\x2a\xee\x41\xc5\x83\xa8\x38\x8d\x8a\xa7\x51\x71\x0e\xed\x1f\x45\xfb\x97\xa2\xfd\xab\xd0\xfe\xf5\x68\xff\x56\xb4\x7f\x37\xda\x7f\x00\xed\x3f\x82\xf6\x9f\x40\xfb\xcf\xa1\x03\x22\xe8\x80\x42\x74\x40\x39\x3a\xa0\x06\x1d\xd0\x88\x0e\x68\x47\x07\x56\xa1\x03\xeb\xd1\x81\x6d\xe8\xc0\x1e\x74\x60\x12\x1d\x98\x46\x07\x4e\xa1\x03\xb3\xa8\x44\xa8\xa4\x18\x95\xc4\xd0\x41\x25\xe8\xa0\x4a\x74\x50\x1d\x3a\xa8\x15\x1d\xd4\x8d\x0e\x1a\x40\x07\x8d\xa0\x83\x26\xd0\x41\x73\xe8\xe0\x08\x3a\xb8\x10\x1d\x5c\x81\x0e\x8e\xa3\x83\x9b\xd1\xc1\x9d\xe8\xe0\x24\x3a\x38\x8d\xfe\x77\x3f\x2a\xed\x45\xa5\x43\xa8\x74\x0c\x95\x4e\xa3\xd2\x1c\x3a\xa4\x00\x1d\x52\x86\x0e\xa9\x46\x87\x34\xa0\x43\xda\xd0\x21\xbd\xe8\x90\x24\x3a\x24\x8d\x0e\x99\x42\x87\x64\xd1\xa1\x51\x74\x68\x29\x3a\xb4\x0a\x7d\xbb\x06\x7d\xbb\x11\x7d\xbb\x1b\x7d\x7b\x00\x7d\x7b\x04\x7d\x7b\x02\x7d\x7b\x0e\x95\xe5\xa1\xb2\x62\x54\x16\x43\x65\x71\x54\xd6\x8c\xca\x3a\x51\x59\x02\x95\x0d\xa3\xb2\x71\x54\x36\x87\xbe\x13\x41\xdf\x29\x44\xdf\x29\x47\xdf\xa9\x41\xdf\x69\x44\x87\x55\xa0\xc3\x6a\xd1\x61\x4d\xe8\xb0\x0e\x74\x58\x1f\x3a\x6c\x08\x1d\x96\x41\x87\xcd\xa2\xc3\x41\x87\x17\xa0\xc3\xcb\xd0\xe1\xd5\xe8\xf0\x06\x74\x78\x1b\x3a\xbc\x07\x1d\x3e\x88\x0e\x1f\x45\x87\x4f\xa2\xc3\xe7\x51\xb9\x50\x79\x31\x2a\x8f\xa1\xf2\x38\x2a\x6f\x46\xe5\x9d\xa8\xbc\x1f\x95\x0f\xa3\xf2\x71\x54\x3e\x8f\x8e\xc8\x43\x47\x14\xa1\x23\x72\xe8\xc8\x28\x3a\xb2\x14\x1d\x05\x3a\xaa\x00\x1d\x55\x86\x8e\xaa\x46\x47\x35\xa0\xa3\xda\xd1\x51\xbd\xe8\xa8\x24\x3a\x2a\x8d\x8e\x9a\x42\x47\x65\x51\x85\xd0\xd1\x51\x74\x74\x16\x7d\x37\x8a\xbe\x5b\x8a\xbe\x5b\x85\xbe\xdb\x88\xbe\xdb\x81\xbe\xdb\x87\xbe\x3b\x84\xbe\x3b\x86\xbe\x3b\x8d\xbe\x97\x45\x31\xa1\x58\x09\x8a\x55\xa1\x58\x3d\x8a\xb5\xa1\x58\x0f\x8a\x0d\xa2\xd8\x28\x8a\x4d\xa1\x58\x16\x1d\x93\x8f\x8e\x29\x41\xc7\x54\xa2\x63\xea\xd0\x31\x2d\xe8\x98\x2e\x74\x4c\x3f\x3a\x66\x18\x1d\x33\x8e\x8e\x99\x45\xc7\x46\xd0\xb1\x85\xe8\xd8\x72\x74\x6c\x2d\x3a\xb6\x09\x1d\xdb\x81\x8e\xed\x43\xc7\x0e\xa1\x63\xc7\xd0\xb1\x33\xe8\xb8\x08\x3a\xae\x08\x1d\x17\x43\xc7\x35\xa0\xe3\xda\xd1\x71\x7d\xe8\xb8\x14\x3a\x2e\x83\x8e\xfb\xa6\xc9\xa1\xca\x02\x54\x39\x87\x8e\x8f\xa2\xe3\x4b\xd1\xf1\x55\xe8\xf8\x7a\x74\x7c\x2b\x3a\xa1\x03\x9d\x90\x40\x27\xa4\xd0\x09\x19\x74\xc2\x2c\x3a\x11\x74\x62\x21\x3a\xb1\x1c\x9d\x58\x83\xaa\xbe\xf9\x46\x54\xd5\x8e\xaa\x7a\x51\x55\x12\x55\xa5\x51\xd5\x14\xaa\xca\xa2\xef\xe7\xa3\xef\x97\xa0\xef\x57\xa2\xef\xd7\xa1\x93\x3a\xd1\x49\x09\x74\x52\x0a\x9d\x94\x41\x27\xcd\xa0\x93\x72\xa8\xba\x00\x55\x97\xa1\xea\x1a\x54\xdd\x88\xaa\x3b\x50\x75\x1f\xaa\x1e\x42\xd5\x19\x74\xf2\x08\x3a\x79\x02\x9d\x3c\x87\x4e\x89\xa0\x53\x0a\xd1\x29\xe5\xe8\x94\x5a\x74\x4a\x13\x3a\xa5\x03\x9d\xd2\x87\x4e\xcd\xa0\x53\x67\x51\x4d\x04\xd5\x14\xa1\x9a\x0a\xf4\xc3\x62\xf4\xc3\x18\xfa\x61\x1d\xfa\x61\x0b\x3a\xad\x0b\x9d\x36\x80\x4e\x1b\x41\xa7\x4d\xa0\xd3\xe6\x50\x6d\x31\xaa\x8d\xa1\xda\x38\xaa\x6d\x46\xb5\x5d\xa8\xb6\x1f\xd5\x0e\xa3\xda\x71\x54\x3b\x8b\x4e\x2f\x41\xa7\x57\xa1\x1f\xe7\xa3\x1f\x97\xa0\x1f\x7f\xe3\xf5\x28\xde\x84\xe2\x1d\x28\x9e\x40\xf1\x14\x8a\x67\x50\x7c\x16\x9d\x01\x3a\xa3\x00\x9d\x51\x86\xce\xa8\x41\x67\x34\xa1\x33\x3a\xd1\x19\x09\x74\xc6\x28\x3a\x63\x12\x9d\x31\x8f\xce\x14\x3a\xb3\x18\x9d\x19\x43\x67\xc6\xd1\x99\xcd\xe8\xcc\x4e\x74\x66\x02\x9d\x99\x42\x67\x66\xd0\x99\xb3\xe8\x2c\xa1\xb3\x4a\xd0\x59\x35\xe8\xac\x46\x74\x56\x3b\x3a\xab\x0f\x9d\x35\x84\xce\x1a\x43\x67\x4d\xa3\xb3\x16\x50\x5d\x14\xd5\x95\xa3\xba\x1a\x54\xd7\x88\xea\xda\x51\x5d\x2f\xaa\x1b\x42\x75\x63\xa8\x6e\x06\xd5\xe5\xd0\xd9\x51\x74\x0e\xe8\x9c\x02\x74\x4e\x19\x3a\xa7\x06\x9d\xd3\x88\xce\xe9\x40\xe7\xf4\xa1\x73\x86\xd0\x39\x63\xe8\x9c\x69\x74\xce\x02\x3a\x37\x8a\xce\x2d\x43\xe7\xd6\xa2\x73\x9b\xd0\xb9\x9d\xa8\xbe\x1f\xd5\x0f\xa3\xfa\x09\x54\x3f\x8f\xce\xcb\x43\xe7\x15\xa3\xf3\x6a\xd0\x79\x4d\xe8\xbc\x0e\x74\xde\x00\x3a\x7f\x10\x9d\x3f\x8a\xce\x9f\x46\xe7\x2f\xa0\x0b\xf2\xd1\x05\xa5\xe8\x82\x6a\x74\x41\x03\xba\xa0\x0d\x5d\xd0\x83\x2e\x18\x44\x0d\x73\xe8\xc2\x08\xba\xb0\x08\x5d\x18\x43\x17\xd6\xa1\x0b\x5b\xd0\x85\x5d\xe8\xc2\x7e\xf4\x93\x69\xf4\x93\x05\x74\x51\x14\x5d\x54\x81\x2e\xaa\x45\x17\x35\xa1\x8b\x3a\xd0\x45\x7d\xe8\xa2\x21\x74\xd1\x18\xba\x68\x1a\x5d\xb4\x80\x1a\xc7\x51\xe3\x2c\xfa\x37\xd0\xbf\x8d\xa3\x7f\x9f\x45\x3f\x8d\xa0\x9f\x16\xa2\x9f\x96\xa3\x9f\xd6\xa0\x9f\x36\xa2\x9f\xb6\xa3\x9f\xf6\xa2\x9f\x26\xd1\x4f\xd3\xe8\xa7\x53\xa8\x29\x83\x9a\x66\xd0\xc5\xa0\x8b\x0b\xd0\xc5\x65\xe8\xe2\x6a\x74\x71\x03\xba\xb8\x0d\x5d\xdc\x83\x2e\x1e\x44\x17\x8f\xa2\x8b\xbf\xe9\x72\xe8\x67\x51\xf4\xb3\x52\xf4\xb3\x2a\xf4\xb3\x06\xf4\xb3\x36\xf4\xb3\x24\xfa\x59\x1a\xfd\x6c\x0a\xfd\x6c\x01\x5d\x92\x8f\x2e\x29\x41\x97\x54\xa2\x4b\xea\xd0\x25\x2d\xe8\x92\x2e\x74\xc9\x00\xba\x64\x04\x5d\x32\x81\x2e\x99\x47\xcd\x79\xa8\xb9\x08\x5d\xda\x88\x2e\xed\x44\x97\xb5\xa3\xcb\xfa\xd0\x65\x43\xe8\xb2\x31\x74\xd9\x34\xba\x6c\x01\x5d\x1e\x45\x97\x97\xa2\xcb\xab\xd0\xe5\xf5\xe8\xf2\x36\x74\x79\x0f\xba\x7c\x10\x5d\x3e\x8a\xae\x28\x41\x57\x54\xa2\x2b\xea\xd1\x15\x6d\xe8\x8a\x5e\x74\x45\x12\x5d\x91\x46\x57\x4c\xa3\x2b\x16\xd0\x95\xf9\xe8\xca\x72\x74\x65\x2d\xba\xb2\x09\xfd\x47\x1f\x6a\x1d\x45\xad\x93\xa8\x75\x01\x5d\x95\x8f\xae\x2a\x45\x57\x55\xa3\xab\x1a\xd0\x55\x6d\xe8\xaa\x1e\x74\x55\x12\x5d\x95\x46\x57\x4d\xa1\xab\x72\xe8\xea\x02\x74\x75\x19\xba\xba\x01\x5d\xdd\x86\xae\xee\x41\x57\x0f\xa2\xab\x47\xd1\xd5\x53\xe8\xea\x2c\xba\x26\x1f\x5d\x53\x8a\xae\xa9\x42\xd7\x34\xa0\x6b\xda\xd1\x35\xbd\xe8\x9a\x21\x74\xcd\x18\xba\x66\x1a\x5d\x93\x43\x6d\x85\xa8\xad\x02\xb5\xd5\xa2\xb6\x16\xd4\xd6\x8d\xda\x06\x50\xdb\x08\x6a\x9b\x44\x6d\x59\x74\xad\xd0\xb5\xc5\xe8\xda\x18\xba\x36\x8e\xae\x6d\x41\xd7\x76\xa1\x6b\x87\xd0\xb5\x19\x74\xed\x0c\xba\x0e\x74\x5d\x21\xba\xae\x02\x5d\x57\x8b\xae\x6b\x42\xd7\x75\xa0\xeb\xfa\xd0\x75\x43\xe8\xba\x0c\xba\xee\x9b\x2e\x87\xae\x8f\xa2\xeb\x63\xe8\xfa\x38\xba\xbe\x19\x5d\xdf\x89\xae\x4f\xa2\xf6\x39\x74\x43\x04\xdd\x50\x88\x6e\x28\x47\x37\xd4\xa0\x1b\x1a\xd1\x0d\xed\xe8\x86\x3e\x74\xc3\x10\xba\x61\x0c\xdd\x30\x8d\x6e\x58\x40\x37\xe6\xa3\x1b\x4b\xd1\x8d\x55\xe8\xc6\x7a\x74\x63\x2b\xba\xb1\x1b\xdd\x38\x8c\x6e\x1c\x47\x37\xce\xa1\x9b\xf2\xd1\x4d\xa5\xe8\xa6\x2a\x74\x53\x3d\xba\xa9\x15\xdd\x94\x40\x37\x0d\xa3\x9b\xc6\xd1\x4d\xb3\xa8\x03\xd4\x51\x8c\x3a\x2a\x51\x47\x1d\xea\x68\x41\x1d\xdd\xa8\x63\x00\x75\x8c\xa2\x8e\x49\xd4\x31\x8f\xfe\x6f\x14\xdd\xdc\x86\x6e\xee\x45\x37\x27\xd1\xcd\x69\x74\xf3\x2c\xba\x25\x82\x6e\x29\x44\xb7\x54\xa0\x5b\x6a\xd1\x2d\x4d\xe8\x96\x0e\x74\x4b\x1f\xba\x25\x85\x6e\xc9\xa0\x5b\xe6\x51\x67\x1e\xea\x2c\x47\x9d\xb5\xa8\xb3\x09\x75\x76\xa0\xce\x04\xea\x4c\xa1\xce\x0c\xea\x9c\x41\xb7\xe6\xa1\x5b\x8b\xd0\xcf\xe3\xe8\xe7\xcd\xe8\xe7\x9d\xe8\xe7\x09\xf4\xf3\x14\xfa\xf9\x24\xfa\xf9\x3c\xba\x2d\x0f\xdd\x56\x84\x6e\xab\x40\xb7\xd5\xa3\xdb\x5a\xd1\x6d\xdd\xe8\xb6\x01\x74\xdb\x08\xba\x6d\x02\xdd\x36\x87\x6e\xef\x45\xb7\x0f\xa1\xdb\x33\xe8\xf6\x19\x74\x7b\x0e\xfd\xa2\x00\xfd\xa2\x0c\xfd\xa2\x0e\xfd\xa2\x15\xfd\xa2\x1b\xfd\x62\x00\xfd\x62\x04\xfd\x72\x12\xfd\x32\x87\xba\x8b\x50\x77\x05\xea\xae\x45\xdd\x4d\xa8\xbb\x03\x75\xf7\xa1\xee\x21\xd4\x3d\x81\xba\xe7\xd0\xaf\x22\xe8\x57\x85\xe8\x57\xe5\xe8\x57\x35\xe8\x57\x8d\xe8\xd7\x6d\xe8\x37\x5d\xe8\x37\xfd\xe8\x37\xc3\xe8\x37\xe3\xe8\x37\xf3\xa8\x27\x0f\xf5\x14\xa1\x9e\x18\xea\x89\xa3\x9e\x76\xd4\x33\x80\x7e\x07\xfa\xcf\x66\xf4\x9f\x9d\xe8\x8e\x28\xba\xa3\x14\xfd\xbe\x15\xf5\xc5\x50\x5f\x1c\xf5\xb5\xa0\xbe\x2e\xd4\xd7\x8f\xfa\x86\x51\xdf\x38\xea\x9b\x43\x77\xe6\xa3\x3b\x4b\xd0\x9d\x95\xe8\xce\x3a\x74\x67\x2b\xba\xb3\x1b\xdd\x39\x88\xee\x1c\x45\x77\x4e\xa2\x3b\xe7\xd1\x7f\xe5\xa1\x3f\xa6\xd0\x1f\x33\xe8\x8f\x33\x28\x11\x41\x89\x22\x94\xa8\x40\x89\x5a\x94\x68\x46\x89\x4e\x94\x48\xa0\x44\x0a\x25\xc6\x51\x62\x16\xdd\x05\xba\xab\x00\xdd\xdd\x87\xee\x1e\x42\x77\x8f\xa1\xbb\xa7\xd1\xdd\x0b\xe8\x9e\x7c\x74\x4f\x19\xba\xa7\x1a\xdd\xd3\x80\xee\x69\x47\xf7\x24\xd0\xff\xcb\x47\xff\xaf\x04\xfd\x29\x8d\x06\x7a\xd0\x40\x12\x0d\x7c\xe3\xd3\xe8\xde\x08\xba\xb7\x04\xdd\x5b\x89\xee\xad\x47\xf7\xe5\xa1\xfb\xe6\xd1\xfd\x79\xe8\xfe\x22\x74\x7f\x05\xba\xbf\x16\xdd\xdf\x84\xee\xef\x40\xf7\xf7\xa1\xfb\x87\xd0\x60\x1f\x7a\xa0\x0d\x3d\xd0\x83\x1e\x18\x44\x0f\x8c\xa2\x07\x26\xd1\x03\x59\xf4\xa0\xd0\x83\xc5\xe8\xc1\x18\x7a\x30\x8e\x1e\x6c\x46\x0f\x76\xa2\x07\x13\xe8\xc1\x14\x7a\x70\x02\x3d\x38\x87\x1e\xca\x43\x0f\x15\xa1\x87\x2a\xd0\x43\xa3\xe8\xa1\x49\xf4\xd0\x3c\x4a\xe6\xa1\x64\x11\x4a\x56\xa0\x87\x41\x0f\x17\xa0\x87\xcb\xd0\xc3\xd5\xe8\xe1\x06\xf4\x70\x1b\x7a\xb8\x07\x3d\x3c\x88\x1e\x1e\x45\x0f\x4f\xa2\x87\xe7\xd1\x23\x79\xe8\x91\x7e\xf4\xc8\x30\x7a\x64\x1c\x3d\x32\x8b\x1e\x05\x3d\x5a\x80\x1e\x2d\x47\x8f\xd6\xa0\x47\x1b\xd1\xa3\xed\xe8\xd1\x5e\xf4\x68\x0a\x3d\x9a\x41\x8f\xce\xa0\x47\x73\x68\x28\x8a\x86\x4a\xd1\x50\x15\x1a\xaa\x47\x43\xad\x68\xa8\x1b\x0d\x0d\xa0\xa1\x51\x34\x34\x89\x86\xe6\xd1\x63\x79\xe8\xb1\x22\xf4\x58\x05\x7a\xac\x16\x3d\xd6\x84\x1e\xeb\x40\x8f\xf5\xa1\xc7\x86\xd0\x63\x63\xe8\xb1\x69\xf4\xd8\x02\x7a\x3c\x1f\x3d\x5e\x82\x1e\xaf\x44\x8f\xd7\xa1\xc7\x5b\xd0\xe3\xdd\xe8\xf1\x01\xf4\xf8\x08\x7a\x7c\x02\x3d\x3e\x87\x9e\x88\xa0\x27\x0a\xd1\x13\xe5\xe8\x89\x38\x7a\xa2\x19\x3d\xd1\x89\x9e\x48\xa0\x27\x52\xe8\x89\x0c\x7a\x62\x16\xa5\x40\xa9\x02\x94\x2a\x43\xa9\x6a\x94\x6a\x44\xa9\x76\x94\xea\x45\xa9\x24\x4a\xa5\x51\x6a\x0a\xa5\xb2\xe8\x49\xa1\x27\x8b\xd1\x93\x31\xf4\x64\x1c\x3d\xd9\x8c\x9e\xec\x44\x4f\x26\xd0\x93\x29\xf4\x64\x06\x3d\x39\x83\x9e\xcc\xa1\xff\x8e\xa2\xff\x2e\x45\xff\x9d\x45\x4f\x09\x3d\x55\x8c\x9e\x8a\xa1\xa7\xe2\xe8\xa9\x66\xf4\x54\x27\x7a\x2a\x81\x9e\x4a\xa1\xa7\x32\xe8\xa9\x19\xf4\x54\x0e\x0d\x47\xd1\x70\x19\x1a\xae\x46\xc3\x8d\x68\xb8\x1d\x0d\xf7\xa2\xe1\x24\x1a\x4e\xa3\xe1\x29\x34\x9c\x45\xff\x23\xf4\x3f\xc5\xe8\x7f\x62\xe8\x7f\xe2\xe8\xe9\x26\xf4\x74\x07\x7a\xba\x0f\x3d\x9d\x42\x4f\x67\xd0\xd3\x33\xe8\xe9\x1c\x7a\x26\x8a\x9e\x29\x45\xcf\x54\xa3\x67\x1a\xd0\x33\x6d\xe8\x99\x5e\xf4\x4c\x12\x3d\x93\x46\xcf\x4c\xa1\x67\xb2\x68\x44\x68\xa4\x18\x8d\xc4\xd0\x48\x1c\x8d\x34\xa3\x91\x4e\x34\x92\x40\x23\xc3\x68\x64\x1c\x8d\xcc\xa2\x67\x41\xcf\x16\xa0\x67\xcb\xd0\xb3\xd5\xe8\xd9\x06\xf4\x6c\x1b\x7a\xb6\x07\x3d\x3b\x88\x9e\x4d\xa3\x67\xa7\xd0\xb3\x59\xf4\x9c\xd0\x73\xc5\xe8\xb9\x18\x7a\xae\x0e\x3d\xd7\x82\x9e\xeb\x42\xcf\xf5\xa3\xe7\x86\xd1\x73\xe3\xe8\xb9\x59\xf4\x17\xd0\x5f\x0a\xd1\x5f\x2a\xd0\x5f\x6a\xd1\x5f\x9a\xd0\x5f\x3a\xd1\x68\x0f\x1a\x1d\x44\xa3\xa3\x68\x74\x12\x8d\xce\xa3\xe7\xf3\xd0\xf3\x45\xe8\xf9\x0a\xf4\x7c\x1c\x3d\xdf\x8c\x9e\xef\x44\xcf\x27\xd0\xf3\x29\xf4\x7c\x06\x3d\x3f\x83\x9e\xcf\xa1\x17\xa2\xe8\x85\x52\xf4\x42\x35\x7a\xa1\x01\xbd\xd0\x86\x5e\xe8\x41\x2f\x0c\xa2\x17\x46\xd1\x0b\x93\xe8\x85\x79\xf4\x62\x1e\x7a\xb1\x08\xa5\x4b\x50\xba\x12\xa5\xeb\x50\xba\x05\xa5\xbb\x51\x7a\x00\xa5\x47\x50\x7a\x02\xa5\xe7\xd0\x4b\x79\xe8\xa5\x22\xf4\x52\x05\x5a\x5b\x8b\xd6\x36\xa1\xb5\x1d\x68\x6d\x1f\x5a\x3b\x84\xd6\x8e\xa1\xb5\xd3\x68\x6d\x0e\xad\x8b\xa2\x75\xa5\x68\x5d\x15\x5a\x57\x8f\xd6\xb5\xa2\x75\xdd\x68\xdd\x00\x5a\x37\x82\xd6\x4d\xa0\x75\x73\x68\x2c\x82\xc6\x0a\xd1\x58\x39\x1a\xab\x45\x63\x4d\x68\xac\x03\x8d\xf5\xa1\xb1\x21\x34\x36\x86\xc6\xa6\xd1\xd8\x02\x5a\x9f\x8f\xd6\x97\xa2\xf5\x55\x68\x7d\x03\x5a\xdf\x86\xd6\xf7\xa0\x97\x07\xd1\xcb\xa3\xe8\xe5\x49\xf4\xf2\x3c\x7a\x25\x0f\xbd\x52\x84\x5e\xa9\x40\xaf\xd4\xa2\x57\x9a\xd0\x2b\x9d\xe8\x95\x01\xf4\xca\x08\x7a\x65\x12\xbd\x92\x45\x19\xa1\x4c\x09\xca\x54\xa2\x4c\x1d\xca\xb4\xa0\x4c\x17\xca\xf4\xa3\xcc\x30\xca\x8c\xa3\xcc\x2c\xda\x00\xda\x50\x88\x36\x94\xa3\x0d\x35\x68\x43\x13\xda\xd0\x81\x36\xf4\xa1\x0d\x43\x68\xc3\x18\xda\x30\x8d\x36\xe4\xd0\xc6\x28\xda\x58\x8e\x36\xd6\xa0\x8d\x8d\x68\x63\x3b\xda\xd8\x8b\x36\x26\xd1\xc6\x34\xda\x38\x85\x36\x66\xd1\xab\x42\xaf\x16\xa3\x57\x63\xe8\xd5\x38\x7a\xb5\x19\xbd\xda\x89\x5e\x4d\xa0\x57\x87\xd1\xab\xe3\xe8\xd5\x59\x34\x0e\x1a\x2f\x40\xe3\x65\x68\xbc\x06\x8d\x37\xa2\xf1\x76\x34\xde\x8b\xc6\x93\x68\x3c\x8d\xc6\xa7\xd0\xf8\x02\x7a\x2d\x1f\xbd\x56\x82\x5e\xab\x44\xaf\xd5\xa1\xd7\x5a\xd0\x6b\x5d\xe8\xb5\x7e\xf4\xda\x08\x7a\x6d\x12\xbd\x36\x8f\x5e\x17\x7a\xbd\x18\xbd\x1e\x43\xaf\xc7\xd1\xeb\xcd\xe8\xf5\x2e\xf4\x7a\x3f\x7a\x7d\x18\xbd\x3e\x8e\x5e\x9f\x45\x9b\x40\x9b\x0a\xd0\xa6\x32\xb4\xa9\x06\x6d\x6a\x44\x9b\xda\xd1\xa6\x5e\xb4\x29\x89\x36\xa5\xd1\xa6\x29\xb4\x29\x8b\x26\x84\x26\x8a\xd1\x44\x0c\x4d\xc4\xd1\x44\x37\x9a\x18\x40\x13\xa3\x68\x62\x12\x4d\xcc\xa3\xcd\x79\x68\x73\x11\xda\x5c\x81\x36\xc7\xd1\xe6\x36\xb4\xb9\x17\x6d\x4e\xa2\xcd\x69\xb4\x79\x0a\x6d\x5e\x40\x6f\xe4\xa3\x37\x4a\xd0\x1b\x95\xe8\x8d\x3a\xf4\x46\x0b\x7a\xa3\x0b\xbd\xd1\x8f\xde\x18\x46\x6f\x8c\xa3\x37\x66\xd1\x16\xd0\x96\x02\xb4\xa5\x0c\x6d\xa9\x46\x5b\x1a\xd0\x96\x36\xb4\xa5\x07\x6d\x19\x44\x5b\x46\xd1\x96\x49\xb4\x25\x8b\x26\xf3\xd1\x64\x09\x9a\xac\x44\x93\x75\x68\xb2\x05\x4d\x76\xa1\xc9\x7e\xb4\x35\x8a\xb6\x96\xa2\xad\x55\x68\x6b\x3d\xda\xda\x8a\xb6\xf6\xa2\xad\x49\xb4\x35\x8d\xb6\x4e\xa1\xad\x59\xf4\x96\xd0\x5b\xc5\xe8\xad\x4a\xf4\x56\x1d\x7a\xab\x05\xbd\xd5\x85\xde\xea\x47\x6f\x0d\xa3\xb7\xc6\xd1\x5b\xb3\x68\x0a\x34\x55\x88\xa6\xca\xd1\x54\x0d\x9a\x6a\x44\x53\xed\x68\xaa\x0f\x4d\x0d\xa1\xa9\x31\x34\x35\x8d\xa6\x16\xd0\xdb\xf9\xe8\xed\x18\x7a\x3b\x8e\xde\x6e\x41\x6f\x77\xa1\xb7\xfb\xd1\xdb\xc3\xe8\xed\x19\xf4\x76\x0e\xbd\x13\x45\xef\x94\xa2\x77\xaa\xd0\x3b\xf5\xe8\x9d\x56\xf4\x4e\x37\x7a\x67\x00\xbd\x33\x82\xde\x99\x40\xef\xcc\xa3\x77\xf3\xd0\xbb\x45\xe8\xdd\x0a\xf4\x6e\x03\x7a\xb7\x0d\xbd\xdb\x83\xde\x1d\x44\xef\x8e\xa2\x77\x27\xd1\xbb\xf3\xe8\xaf\x31\xf4\xd7\x38\xfa\x6b\x33\xfa\x6b\x27\xfa\x6b\x02\xfd\x35\x85\xfe\x1e\x47\x7f\x6f\x46\x7f\xef\x44\x7f\x4f\xa0\xbf\x7f\xb3\x65\xd0\x4c\x39\x9a\xa9\x41\x33\x8d\x68\xa6\x1d\xcd\xf4\xa2\x99\x24\x9a\x49\xa3\x99\x69\x34\xb3\x80\xde\x2b\x40\xef\x95\xa1\xf7\x13\xe8\xfd\x14\x7a\x7f\x1c\xbd\x3f\x87\xfe\x21\xf4\x8f\x69\x34\x9b\x87\x66\x8b\xd1\x6c\x25\x9a\xad\x47\xb3\x6d\x68\xb6\x17\xcd\x0e\xa1\xd9\x0c\x9a\x9d\x45\xff\x8c\xa0\x7f\x16\xa1\x7f\x56\xa1\x7f\x36\xa0\x7f\xb6\xa3\x0f\x86\xd1\x07\x53\xe8\x83\x05\xf4\xaf\x28\xfa\x57\x12\xcd\x15\xa1\xb9\x0a\x34\x57\x8b\xe6\x9a\xd0\x87\xf9\xe8\xc3\x12\xf4\x61\x25\xfa\xb0\x0e\x7d\xd8\x82\x3e\xec\x42\x1f\xf6\xa3\x0f\x87\xd1\x87\xe3\xe8\xc3\x59\xf4\x11\xe8\xa3\x02\xf4\x51\x19\xfa\xa8\x1a\x7d\xd4\x80\x3e\x6a\x47\x1f\xf5\xa2\x8f\x92\xe8\xa3\x09\xf4\xd1\x1c\xda\x16\x41\xdb\x0a\xd1\xb6\x72\xb4\xad\x06\x6d\x6b\x44\xf3\x51\x34\x5f\x8a\xe6\xab\xd1\x7c\x03\x9a\x6f\x43\xf3\xbd\x68\x7e\x08\xcd\x8f\xa1\xf9\x69\x34\xbf\x80\x3e\xce\x47\x1f\x97\xa0\x8f\x2b\xd1\xc7\xf5\xe8\xe3\x36\xf4\x71\x0f\xfa\x78\x10\x7d\x3c\x8a\x3e\x9e\x44\x1f\x67\xd1\x76\xa1\xed\xc5\x68\x7b\x0c\x6d\x8f\xa3\xed\xcd\x68\x7b\x27\xda\x9e\x40\xdb\x53\x68\xfb\x38\xda\x3e\x8b\x76\x80\x76\x2c\xa0\x6c\x3e\xca\x96\xa0\x6c\x25\xca\xd6\xa1\x6c\x0b\xca\x76\xa1\x6c\x3f\xca\x0e\xa3\xec\x38\xca\xce\xa2\x4f\x40\x9f\x14\xa0\x4f\xca\xd0\x27\xd5\xe8\x93\x26\xf4\x49\x07\xfa\x24\x81\x3e\x49\xa1\x4f\x32\xe8\x93\x19\xf4\x29\xe8\xd3\x02\xf4\x69\x19\xfa\xb4\x1a\x7d\xda\x80\x3e\x6d\x43\x9f\xf6\xa0\x4f\x07\xd1\xa7\x69\xf4\xe9\x14\xfa\x34\x8b\x3e\x13\xfa\xac\x18\x7d\x56\x89\x3e\xab\x43\x9f\xb5\xa2\xcf\xba\xd1\x67\x03\xe8\xb3\x11\xf4\xd9\x04\xfa\x6c\x0e\x2d\x44\xd0\x42\x21\x5a\x28\x47\x0b\x35\x68\xa1\x11\x2d\xb4\xa3\x85\x5e\xb4\x90\x44\x0b\x69\xb4\x30\x85\x16\xb2\xe8\x73\xa1\xcf\x8b\xd1\xe7\x31\xf4\x79\x1c\x7d\xde\x8c\x3e\xef\x44\x9f\x27\xd0\xe7\x29\xf4\x79\x06\x7d\x3e\x83\xbe\x00\x7d\x51\x84\xbe\xa8\x40\x5f\xc4\xd1\x17\xcd\xe8\x8b\x4e\xf4\x45\x3f\xfa\x72\x1c\x7d\x39\x8b\x72\xa0\x5c\x21\xca\x95\xa3\x5c\x0d\xca\x35\xa2\x5c\x3b\xca\xf5\xa2\x5c\x12\xe5\xd2\x28\x37\x85\x72\x59\xf4\x95\xd0\x57\xc5\xe8\xab\x4a\xf4\x55\x1d\xfa\xaa\x05\x7d\xd5\x85\xbe\xee\x47\x5f\x0f\xa3\xaf\xc7\xd1\xd7\xb3\x68\x27\x68\x67\x01\xda\x59\x86\x76\x56\xa3\x9d\x0d\x68\x67\x3b\xda\xd9\x8b\x76\x26\xd1\xce\x34\xda\x39\x85\x76\x66\x31\xc2\x14\x63\x62\x98\x38\xa6\x19\xd3\x89\xe9\xc7\x8b\x06\xf0\xa2\x11\xbc\x68\x02\x2f\x9a\xc7\xbb\xe4\xe1\x5d\x8a\xf0\x2e\x15\x78\x97\x5a\xbc\x4b\x13\xde\xa5\x03\xef\xd2\x87\x77\x19\xc2\xbb\x8c\xe1\x5d\x66\xf0\x2e\x39\xbc\x38\x8a\x17\x97\xe1\xc5\xd5\x78\x71\x03\x5e\xdc\x8e\x17\xf7\xe2\xc5\x49\xbc\x38\x8d\x17\x4f\xe1\xc5\x59\x1c\x11\x8e\x14\xe3\x48\x25\x8e\xd4\xe1\x48\x0b\x8e\x74\xe3\xc8\x20\x8e\x8c\xe2\xc8\x24\x8e\xe4\xf0\x92\x28\x5e\x52\x86\x97\x54\xe3\x25\x0d\x78\x49\x1b\x5e\xd2\x8b\x97\x24\xf1\x92\x09\xbc\x64\x1e\x2f\x15\x5e\x5a\x8c\x97\x56\xe2\xa5\x75\x78\x69\x0b\x5e\xda\x85\x97\xf6\xe3\xa5\xc3\x78\xe9\x04\x5e\x3a\x87\x97\x45\xf0\xb2\x42\xbc\xac\x12\x2f\xab\xc3\xcb\x5a\xf1\xb2\x1e\xbc\x2c\x89\x97\xa5\xf1\xb2\x29\xbc\x2c\x8b\xf3\x84\xf3\x8a\x71\x5e\x0c\xe7\xc5\x71\x5e\x33\xce\xeb\xc6\x79\x03\x38\x6f\x04\xe7\x4d\xe0\xbc\x39\xbc\x3c\x82\x97\x17\xe1\xe5\x15\x78\x79\x2d\x5e\xde\x84\x97\x77\xe0\xe5\x7d\x78\xf9\x10\x5e\x3e\x86\x97\x4f\xe3\xe5\x0b\x78\x45\x3e\x5e\x51\x8a\x57\x54\xe1\x15\x8d\x78\x45\x07\x5e\xd1\x87\x57\x0c\xe1\x15\x63\x78\xc5\x34\x5e\x91\xc3\x41\x14\x07\x65\x38\xa8\xc1\x41\x23\x0e\xda\x71\xd0\x8b\x83\x24\x0e\xd2\x38\x98\xc2\x41\x16\x4b\x58\xc5\x58\x31\xac\x38\x56\x33\x56\x17\xd6\x3c\x76\x37\x76\x02\x3b\x85\x9d\xc1\x9e\xc1\x61\x3e\x0e\x4b\x70\x58\x89\xc3\x7a\x1c\xb6\xe2\xb0\x17\x87\x43\x78\xd7\x4a\xbc\x6b\x1d\xde\xb5\x15\xe7\x37\xe0\xfc\x36\xbc\x5b\x37\xde\x6d\x00\xaf\xec\xc6\x2b\xbf\xe1\x28\x5e\x39\x89\x57\xce\xe3\x55\x79\x78\x55\x11\x5e\x15\xc3\xab\xe2\x78\x55\x33\x5e\xd5\x89\x57\x25\xf0\xaa\x14\x5e\x95\xc1\xab\x66\xf0\xaa\x1c\x8e\x46\x71\xb4\x14\x47\xab\x70\xb4\x01\x47\xdb\x70\xb4\x07\x47\x07\x71\x74\x14\x47\x27\x71\x74\x01\xef\x9e\x8f\x77\x2f\xc1\xbb\x57\xe1\xdd\xeb\xf1\xee\x1d\x78\xf7\x7e\xbc\xfb\x30\xde\x7d\x1c\xef\x3e\x87\xf7\x28\xc0\x7b\x94\xe1\x3d\xaa\xf1\x1e\x2d\x78\x8f\x2e\xbc\x47\x3f\xde\x63\x04\xef\x31\x81\xf7\x98\xc3\x7b\x46\xf0\x9e\x85\x78\xcf\x72\xbc\xe7\x30\xde\x73\x1c\x17\x8c\xe2\x82\x49\x5c\x30\x8f\x57\xe7\xe1\xd5\x45\x78\x75\x0c\xaf\x8e\xe3\xd5\xcd\x78\x75\x27\x5e\x9d\xc0\xab\x47\xf1\xea\x49\xbc\x7a\x1e\xaf\xc9\xc3\x6b\x8a\xf0\x9a\x19\xbc\x26\x87\xf7\x8a\xe2\xbd\x4a\xf1\x5e\x55\x78\xaf\x7a\xbc\x57\x2b\xde\xab\x1b\xef\x35\x80\xf7\x1a\xc1\x7b\x4d\xe0\xbd\xe6\x70\x61\x04\x17\x16\xe2\xc2\x72\x5c\x58\x83\x0b\x1b\x71\x61\x3b\x2e\xec\xc5\x85\x49\x5c\x98\xc6\x85\x53\xb8\x30\x8b\xf7\x16\xde\xbb\x18\xef\x1d\xc3\x7b\xc7\xf1\xde\xcd\x78\xef\x4e\xbc\x77\x02\xef\x9d\xc2\x7b\x67\xf0\xde\x33\x78\xef\x1c\xde\x27\x8a\xf7\x29\xc5\xfb\x54\xe1\x7d\xea\xf1\x3e\xad\x78\x9f\x1e\xbc\xcf\x20\xde\x67\x14\xef\x33\x89\x8b\x1a\x70\x51\x1b\x2e\xea\xc1\x45\x39\xfc\x2d\xe1\x6f\x15\xe3\x6f\xc5\xf0\xb7\xe2\x78\xdf\x22\xbc\x6f\x05\xde\xb7\x16\xef\xdb\x84\xf7\xed\xc0\xfb\xf6\xe1\x7d\x87\xf0\xbe\x63\x78\xdf\x69\xbc\xef\x02\xde\x2f\x1f\xef\x57\x82\xf7\xab\xc4\xfb\xd5\xe1\xfd\x5a\xf0\x7e\xdd\x78\xbf\x01\xbc\xdf\x08\xde\x6f\x02\xef\x37\x87\x8b\x23\xb8\xb8\x10\x17\x57\xe0\xe2\x5a\x5c\xdc\x84\x8b\x3b\x70\x71\x1f\x2e\x4e\xe1\xe2\x0c\x2e\x9e\xc1\xc5\x39\xbc\x7f\x14\xef\x5f\x8a\xf7\xaf\xc2\xfb\xd7\xe3\xfd\xdb\xf0\xfe\x3d\x78\xff\x41\xbc\x7f\x1a\xef\x3f\x85\xf7\xcf\xe2\x03\x84\x0f\x28\xc6\x07\xc4\xf0\x01\x71\x7c\x40\x33\x3e\xa0\x13\x1f\x90\xc0\x07\xa4\xf0\x01\x19\x7c\xc0\x0c\x3e\x20\x87\x0f\x8c\xe2\x03\x4b\xf1\x81\x55\xf8\xc0\x7a\x7c\x60\x2b\x3e\xb0\x1b\x1f\x38\x80\x0f\x1c\xc1\x07\x4e\xe0\x03\xb3\xb8\x24\x8a\x4b\x4a\x71\x49\x15\x2e\xa9\xc7\x25\xad\xb8\xa4\x1b\x97\x0c\xe2\x92\x51\x5c\x32\x89\x4b\xe6\xf1\x41\x79\xf8\xa0\x22\x7c\x50\x0c\x1f\x14\xc7\x07\x35\xe3\x83\x3a\xf1\x41\x09\x7c\x50\x0a\x1f\x94\xc1\x07\xcd\xe0\x83\x72\xf8\xe0\x28\x3e\xb8\x14\x1f\x5c\x85\x0f\xae\xc7\x07\xb7\xe2\x83\xbb\xf1\xc1\x03\xf8\xe0\x11\x7c\xf0\x04\x3e\x78\x0e\xff\xef\x08\xfe\xdf\x85\xb8\xb4\x12\x97\xd6\xe1\xd2\x16\x7c\x48\x27\x3e\x24\x81\x0f\x49\xe1\x43\x32\xf8\x90\x19\x7c\x48\x0e\x1f\x1a\xc5\x87\x96\xe2\x43\xab\xf0\xa1\xf5\xf8\xd0\x56\x7c\x68\x37\x3e\x74\x00\x1f\x3a\x82\x0f\x9d\xc0\x87\xce\xe1\x6f\x47\xf0\xb7\x8b\x70\x59\x1e\x2e\xfb\x86\x15\xb8\xac\x16\x97\x35\xe1\xb2\x0e\x5c\xd6\x87\xcb\x86\x70\xd9\x18\x2e\x9b\xc6\x65\x0b\xf8\x3b\xf9\xf8\x3b\x25\xf8\x3b\x95\xf8\x3b\x75\xf8\x3b\x2d\xf8\xb0\x38\x3e\xac\x19\x1f\xd6\x85\x0f\xeb\xc7\x87\x0d\xe3\xc3\x26\xf0\x61\x73\xf8\xf0\x08\x3e\xbc\x08\x1f\x5e\x81\x0f\xaf\xc5\x87\x37\xe1\xc3\x3b\xf0\xe1\x7d\xf8\xf0\x14\x3e\x3c\x83\x0f\x9f\xc1\x87\xe7\x70\x79\x14\x97\x97\xe2\xf2\x2a\x5c\x5e\x8f\xcb\x5b\x71\x79\x37\x2e\x1f\xc0\xe5\x23\xb8\x7c\x02\x97\xcf\xe1\x23\x22\xf8\x88\x42\x7c\x44\x39\x3e\xa2\x06\x1f\xd1\x88\x8f\x68\xc7\x47\xf4\xe2\x23\x92\xf8\x88\x34\x3e\x62\x0a\x1f\x91\xc5\x47\x0a\x1f\x59\x8c\x8f\x8c\xe1\x23\xeb\xf1\x91\xad\xf8\xc8\x6e\x7c\xe4\x00\x3e\x72\x04\x1f\x39\x89\x8f\x9c\xc7\x47\xe5\xe1\xa3\x8a\xf0\x51\x15\xf8\xa8\x5a\x7c\x54\x13\x3e\xaa\x03\x1f\xd5\x87\x8f\x1a\xc2\x47\x8d\xe1\xa3\xa6\xf1\x51\x0b\xb8\x62\x1e\x1f\x9d\x87\x8f\x2e\xc2\x47\x57\xe0\xa3\x6b\xf1\xd1\x4d\xf8\xe8\x0e\x7c\x74\x1f\x3e\x7a\x08\x1f\x9d\xc1\x47\xcf\xe0\xef\x4e\xe3\xef\x2e\xe0\xef\xe5\xe3\xef\x95\xe0\xef\x55\xe2\xef\xd5\xe1\xef\xb5\xe0\xef\x75\xe1\xef\xf5\xe3\xef\x0d\xe3\xef\x8d\xe3\xef\xcd\xe2\x18\x38\x56\x80\x63\x65\x38\x56\x8d\x63\x0d\x38\xd6\x86\x63\x3d\x38\x36\x88\x63\xa3\x38\x36\x89\x63\xf3\xf8\x98\x3c\x7c\x4c\x11\x3e\x26\x86\x8f\x89\xe3\x63\x9a\xf1\xb1\x09\x7c\x6c\x0a\x1f\x9b\xc1\xc7\xce\xe0\x63\x73\xf8\xb8\x28\x3e\xae\x14\x1f\x57\x85\x8f\xab\xc7\xc7\xb5\xe2\xe3\xba\xf1\x71\x03\xf8\xb8\x11\x7c\xdc\x04\x3e\x6e\x0e\x57\x46\x70\x65\x21\xae\x2c\xc7\x95\x35\xb8\xb2\x11\x57\xb6\xe3\xca\x5e\x5c\x99\xc4\x95\x19\x5c\x39\x83\x2b\x73\xf8\xf8\x28\x3e\xbe\x14\x1f\x5f\x85\x8f\xaf\xc7\xc7\xb7\xe2\xe3\xbb\xf1\xf1\x03\xf8\xf8\x51\x7c\xfc\x14\x3e\x3e\x8b\x4f\x10\x3e\xa1\x18\x9f\x10\xc3\x27\xc4\xf1\x09\x2d\xf8\x84\x2e\x7c\x42\x3f\x3e\x61\x18\x9f\x30\x8e\x4f\x98\xc5\x27\x82\x4f\x2c\xc0\x27\x96\xe1\x13\x6b\xf0\x89\x8d\xf8\xc4\x76\x7c\x62\x2f\x3e\x31\x89\x4f\x4c\xe3\x13\xa7\xf0\x89\x59\x5c\x25\x5c\x55\x82\xab\x2a\x71\x55\x1d\xfe\x7e\x23\xfe\x7e\x3b\xfe\x7e\x2f\xfe\x7e\x12\x7f\x3f\x8d\xbf\x3f\x85\xbf\x9f\xc5\x27\xe5\xe3\x93\x4a\xf0\x49\x95\xf8\xa4\x3a\x7c\x52\x0b\x3e\xa9\x0b\x9f\xd4\x8f\x4f\x1a\xc1\x27\x4d\xe2\x93\xe6\xf1\x0f\xf2\xf0\x0f\x8a\xf1\x0f\x62\xf8\x07\x71\xfc\x83\x66\xfc\x83\x6e\xfc\x83\x41\xfc\x83\x51\xfc\x83\x49\xfc\x83\x79\x5c\x9d\x87\xab\x8b\x70\x75\x05\xae\xae\xc5\xd5\xcd\xb8\xba\x13\x57\x27\x70\xf5\x30\xae\x1e\xc7\xd5\x73\xf8\xe4\x08\x3e\xb9\x10\x9f\x5c\x8e\x4f\xae\xc1\x27\x37\xe2\x93\xdb\xf1\xc9\xbd\xf8\xe4\x24\x3e\x39\x8d\x4f\x9e\xc2\x27\x67\xf1\x29\xc2\xa7\x14\xe3\x53\x62\xf8\x94\x38\x3e\xa5\x19\x9f\xd2\x89\x4f\x49\xe0\x53\x52\xf8\x94\x71\x7c\xca\x1c\x3e\x35\x82\x4f\x2d\xc2\xa7\xc6\xf0\xa9\x71\x7c\x6a\x33\x3e\xb5\x13\x9f\x9a\xc0\xa7\xa6\xf0\xa9\x19\x7c\xea\x0c\xae\x01\xd7\x14\xe0\x9a\x32\x5c\x53\x8d\x7f\xd8\x8a\x7f\xd8\x8d\x7f\x38\x80\x7f\x38\x8a\x7f\x38\x8d\x4f\xcb\xc7\xa7\x95\xe0\xd3\x2a\xf1\x69\x75\xf8\xb4\x16\x7c\x5a\x17\x3e\x6d\x00\x9f\x36\x82\x4f\x9b\xc4\xa7\xcd\xe3\x1f\xe5\xe1\x1f\x15\xe3\x1f\xc5\xf0\x8f\xe2\xf8\x47\xcd\xf8\x47\x9d\xf8\x47\x09\xfc\xa3\x61\xfc\xa3\x71\xfc\xa3\x39\x5c\x1b\xc1\xb5\x85\xb8\xb6\x1c\xd7\xd6\xe0\xda\x26\xfc\x7f\x26\xf0\xff\x99\xc3\xa7\x47\xf0\xe9\x85\xf8\xf4\x72\x7c\x7a\x0d\x3e\xbd\x11\x9f\xde\x8e\x4f\xef\xc5\xa7\x27\xf1\xe9\x69\x7c\xfa\x14\x3e\x3d\x8b\x7f\x2c\xfc\xe3\x52\xfc\xe3\x6a\xfc\xe3\x46\xfc\xe3\x24\xfe\x71\x1a\xff\x78\x0a\xff\x38\x8b\xe3\xc2\xf1\x62\x1c\x8f\xe1\x78\x1c\xc7\x9b\x71\xbc\x13\xc7\x13\x38\x9e\xc2\xf1\x0c\x8e\xcf\xe0\x78\x0e\x9f\x11\xc5\x67\x94\xe2\x33\xaa\xf0\x19\xf5\xf8\x8c\x56\x7c\x46\x37\x3e\x63\x00\x9f\x31\x82\xcf\x98\xc0\x67\xcc\xe1\x33\xf3\xf0\x99\x45\xf8\xcc\x18\x3e\x33\x8e\xcf\x6c\xc6\x67\x76\xe2\x33\x13\xf8\xcc\x14\x3e\x33\x83\xcf\x9c\xc1\x67\xe6\xf0\x59\x51\x7c\x56\x29\x3e\xab\x0a\x9f\x55\x8f\xcf\x6a\xc5\x67\x75\xe3\xb3\x06\xf0\x59\x23\xf8\xac\x09\x7c\xd6\x1c\xae\x8b\xe0\xba\x42\x5c\x57\x8e\xeb\x6a\x70\x5d\x23\xae\x6b\xc7\x75\xbd\xb8\x2e\x89\xeb\xd2\xb8\x6e\x0a\xd7\x65\xf1\xd9\xc2\x67\x17\xe3\xb3\x63\xf8\xec\x38\x3e\xbb\x19\x9f\xdd\x89\xcf\x4e\xe0\xb3\x53\xf8\xec\x0c\x3e\x7b\x06\x9f\x9d\xc3\xe7\x44\xf1\x39\xa5\xf8\x9c\x2a\x7c\x4e\x3d\x3e\xa7\x15\x9f\xd3\x8d\xcf\x19\xc0\xe7\x8c\xe0\x73\x26\xf0\x39\x73\xf8\xdc\x08\x3e\xb7\x10\x9f\x5b\x8e\xcf\xad\xc1\xe7\x36\xe2\x73\x3b\xf0\xb9\x7d\xf8\xdc\x21\x7c\xee\x18\x3e\x77\x1a\x9f\xbb\x80\xeb\xf3\x71\x7d\x09\xae\xaf\xc4\xf5\x75\xb8\xbe\x05\xd7\x77\xe1\xfa\x7e\x5c\x3f\x8c\xeb\xc7\x71\xfd\x2c\x3e\x0f\x7c\x5e\x01\x3e\xaf\x0c\x9f\x57\x8d\xcf\x6b\xc0\xe7\xb5\xe1\xf3\x7a\xf0\x79\x83\xf8\xbc\x51\x7c\xde\x24\x3e\x6f\x1e\x9f\x9f\x87\xcf\x2f\xc2\xe7\x57\xe0\xf3\x6b\xf1\xf9\x4d\xf8\xfc\x0e\x7c\x7e\x1f\x3e\x7f\x08\x9f\x3f\x86\xcf\x9f\xc6\xe7\x2f\xe0\x0b\xf2\xf1\x05\x25\xf8\x82\x4a\x7c\x41\x3d\xbe\xa0\x15\x5f\xd0\x8d\x2f\x18\xc0\x17\x8c\xe0\x0b\x26\xf0\x05\xf3\xb8\x21\x0f\x37\x14\xe1\x86\x0a\xdc\x50\x8b\x1b\x9a\x70\x43\x07\x6e\xe8\xc3\x0d\x43\xb8\x61\x0c\x37\x4c\xe3\x86\x05\x7c\x61\x3e\xbe\xb0\x04\x5f\x58\x89\x2f\xac\xc3\x17\xb6\xe0\x0b\xbb\xf1\x85\x83\xf8\xc2\x51\x7c\xe1\x24\xfe\x49\x33\xfe\x49\x17\xfe\x49\x3f\xfe\xc9\x30\xfe\xc9\x38\xfe\xc9\x2c\xbe\x08\x7c\x51\x01\xbe\xa8\x0c\x5f\x54\x8b\x2f\x6a\xc2\x17\x75\xe0\x8b\xfa\xf0\x45\xc3\xf8\xa2\x71\xdc\x18\xc3\x8d\x71\xdc\xd8\x8c\x1b\x3b\x71\x63\x02\xff\x5b\x3f\xfe\xb7\x61\xfc\x6f\xe3\xf8\xdf\x66\xf1\xbf\x83\xff\xbd\x00\xff\x7b\x19\xfe\xf7\x5a\xfc\xd3\x39\xdc\x14\xc1\x4d\x63\xf8\xe2\x21\x7c\xf1\x37\x9c\xc6\x3f\x9b\xc5\x97\x80\x2f\x29\xc0\x97\x94\xe1\x4b\xaa\xf1\x25\x0d\xf8\x92\x36\x7c\x49\x0f\x6e\xee\xc7\xcd\xc3\xb8\x79\x02\x37\xcf\xe1\x4b\x23\xf8\xd2\x42\x7c\x69\x39\xbe\xb4\x06\x5f\xda\x88\x2f\x6d\xc7\x97\xf6\xe2\x4b\x93\xf8\xd2\x34\xbe\x74\x0a\x5f\x9a\xc5\x97\x09\x5f\x56\x8c\x2f\x8b\xe1\xcb\xe2\xf8\xb2\x66\x7c\x59\x27\xbe\x2c\x81\x2f\x4b\xe1\xcb\xdb\xf0\xe5\x3d\xf8\xf2\x41\x7c\xf9\x28\xbe\x7c\x12\x5f\x3e\x8f\x5b\xf2\x70\x4b\x11\x6e\xa9\xc0\x2d\xb5\xb8\xa5\x09\xb7\x74\xe0\x96\x3e\xdc\x32\x84\x5b\xc6\x70\xcb\x34\x6e\x59\xc0\x57\xe4\xe3\x2b\x4a\xf0\x15\x95\xf8\x8a\x3a\x7c\x45\x0b\xbe\xa2\x0b\x5f\xd1\x8f\xaf\x18\xc6\x57\x8c\xe3\x2b\x66\xf1\x95\xe0\x2b\x0b\xf0\x95\x65\xf8\xca\x6a\x7c\x65\x03\xbe\xb2\x0d\x5f\xd9\x83\xaf\x1c\xc4\x57\x8e\xe2\x2b\x27\xf1\x7f\xd4\xe2\xff\x98\xc2\xff\x91\xc5\xad\x03\xb8\x75\x04\x5f\x15\xc7\x57\x35\xe3\xab\x3a\xf1\x55\x09\x7c\x55\x0a\x5f\x95\xc1\x57\xcd\xe0\xab\x72\xf8\xea\x28\xbe\xba\x14\x5f\x5d\x85\xaf\x01\x5f\x33\x8d\xaf\x59\xc0\x6d\xf9\xb8\xad\x14\xb7\x55\xe1\x6b\x4b\xf0\xb5\x95\xf8\xda\x3a\x7c\x6d\x0b\xbe\xb6\x0b\x5f\xdb\x8f\xaf\x1d\xc6\xd7\x8e\xe3\x6b\x67\xf1\x75\xe0\xeb\x0a\xf0\x75\x65\xf8\xba\x6a\x7c\x5d\x03\xbe\xae\x0d\x5f\xd7\x83\xaf\x1b\xc4\xd7\x8d\xe2\xeb\x26\xf1\x75\xf3\xf8\xfa\x3c\x7c\x7d\x11\xbe\xbe\x12\x5f\x5f\x87\xaf\x6f\xc1\xd7\x77\xe1\xeb\xfb\xf1\xf5\xc3\xf8\xfa\x71\x7c\xfd\x2c\x6e\x07\xb7\x17\xe0\xf6\x32\x7c\x43\x04\xdf\x50\x88\x6f\x28\xc7\x37\xd4\xe0\x1b\x1a\xf1\x0d\xed\xf8\x86\x5e\x7c\x43\x12\xdf\x90\xc6\x37\x4c\xe1\x1b\x87\xf0\x8d\x63\xf8\xc6\x69\x7c\xe3\x02\xbe\x29\x1f\xdf\x34\x83\x6f\xca\xe1\x8e\x28\xee\x28\xc5\x1d\x55\xb8\xa3\x1e\x77\xb4\xe2\xff\xdb\x80\x6f\x8e\xe3\x9b\x9b\xf1\xcd\x9d\xf8\xe6\x04\xbe\x79\x18\xdf\x3c\x8e\x6f\x9e\xc5\xb7\x4c\xe1\x5b\xb2\xb8\x53\xb8\xb3\x18\x77\xc6\xf0\xad\x05\xf8\xd6\x32\x7c\x6b\x35\xbe\xb5\x01\xdf\xda\x86\x6f\xed\xc1\xb7\x0e\xe2\x5b\x47\xf1\xad\x93\xf8\xd6\x79\x7c\x5b\x31\xbe\x2d\x86\x6f\xab\xc3\xb7\xb5\xe0\xdb\xba\xf0\x6d\xfd\xf8\xb6\x61\x7c\xdb\x38\xbe\x6d\x16\x77\x81\xbb\x0a\x70\x57\x19\xee\xaa\xc6\x5d\x4d\xb8\xab\x03\x77\xf5\xe1\xae\x14\xee\xca\xe0\xae\x19\xdc\x95\xc3\xb7\x47\xf1\xed\xa5\xf8\xf6\x2a\x7c\x7b\x23\xbe\xbd\x03\xdf\xde\x87\x6f\x1f\xc2\xb7\x67\xf0\x2f\x62\xf8\x17\xc3\xf8\x97\x71\xfc\xcb\x66\xfc\xcb\x4e\xfc\xcb\x04\xfe\x65\x0a\xff\x32\x83\x7f\x39\x83\x7f\x99\xc3\xdd\x05\xb8\xbb\x0c\x77\x57\xe3\xee\x06\xdc\xdd\x86\xbb\x7b\x70\xf7\x20\xee\x1e\xc5\xbf\xea\xc2\xbf\x8e\xe3\x5f\x37\xe3\x5f\x77\xe2\x5f\x27\xf0\xaf\x53\xf8\x37\x0d\xf8\x37\x6d\xf8\x37\x3d\xf8\x37\x49\xdc\x33\x84\x7b\x32\xb8\x67\x06\xf7\xe4\xf0\x6f\x0b\xf0\x6f\xcb\xf0\x6f\xab\xf1\x6f\x1b\xf0\x6f\xdb\xf1\x6f\x7b\xf1\x6f\x93\xf8\xb7\x69\xfc\xdb\x29\xfc\xdb\x2c\xfe\x9d\xf0\xef\x8a\xf1\xef\x62\xf8\x77\x71\xfc\xbb\x66\xfc\xbb\x4e\xfc\x9f\x8d\xf8\x3f\xdb\x71\x6f\x25\xee\xad\xc3\xbd\xdf\x78\x2f\xee\x4d\xe2\xde\x34\xee\x9d\xc2\xbd\x59\x7c\x87\xf0\x1d\x25\xf8\x8e\x4a\x7c\x47\x1d\xbe\xa3\x05\xdf\xd1\x85\xef\xe8\xc7\x77\x0c\xe3\x3b\xc6\xf1\x1d\xb3\xf8\xf7\xe0\xdf\x17\xe0\xdf\x97\xe1\xdf\x4f\xe1\xdf\x67\xf1\x1f\x84\xff\x50\x8c\xff\x10\xc3\x7f\x88\xe3\x3f\xb4\xe0\x3f\x74\xe1\x3f\xf4\xe3\x3f\x0c\xe3\x3f\x8c\xe3\x3f\xcc\xe2\xbe\x16\x7c\xa7\xf0\x9d\xc5\xf8\xce\x18\xbe\x33\x8e\xef\x6c\xc6\x77\x76\xe2\x3b\x13\xf8\xce\x14\xbe\x33\x83\xef\x9c\xc5\xff\x05\xfe\xaf\x42\xfc\x5f\xe5\xf8\x8f\xe0\x3f\x16\xe2\x3f\x7e\xe3\x35\xf8\x8f\x4d\x38\xd1\x89\x13\x09\x9c\x48\xe1\xc4\x38\x4e\xcc\xe1\xbb\x22\xf8\xae\x42\x7c\x57\x39\xbe\xab\x06\xdf\xd5\x88\xef\x6a\xc7\x77\xf5\xe2\xbb\x92\xf8\xae\x34\xbe\x6b\x0a\xdf\x95\xc5\x77\x0b\xdf\x5d\x8c\xef\x8e\xe1\xbb\xe3\xf8\xee\x16\x7c\x77\x37\xbe\x7b\x00\xdf\x3d\x8a\xef\x9e\xc4\x77\xcf\xe3\x7b\x84\xef\x29\xc1\xf7\x54\xe2\x7b\xea\xf0\x3d\x2d\xf8\x9e\x6e\x7c\xcf\x00\xee\xef\xc7\xfd\xc3\xb8\x7f\x02\xf7\xcf\xe1\xff\x17\xc1\x7f\x2a\xc3\x7f\xaa\xc6\x7f\x6a\xc0\x7f\x6a\xc3\x7f\xea\xc1\x7f\x1a\xc4\x7f\x1a\xc5\x7f\x9a\xc2\x7f\xca\xe2\x3f\x0b\xff\xb9\x13\xff\x39\x81\xff\x9c\xc2\x7f\xce\xe0\x3f\xcf\xe0\x3f\xe7\xf0\x40\x14\x0f\x94\xe2\x81\x2a\x3c\x50\x8f\x07\x5a\xf1\x40\x37\x1e\x18\xc0\x03\x23\x78\x60\x02\x0f\xcc\xe1\x7b\x23\xf8\xde\x42\x7c\x6f\x39\xbe\xb7\x06\xdf\xdb\x88\xef\x6d\xc7\xf7\xf6\xe2\x7b\x93\xf8\xde\x34\xbe\x77\x0a\xdf\x9b\xc5\xf7\x09\xdf\x57\x8c\xef\x8b\xe1\xfb\xe2\xf8\xbe\x66\x7c\x5f\x27\xbe\x2f\x81\xef\x4b\xe1\xfb\x32\xf8\xbe\x19\x7c\x5f\x0e\xdf\x1f\xc5\xf7\x97\xe2\xfb\xab\xf0\xfd\xf5\xf8\xfe\x56\x7c\x7f\x37\xbe\x7f\x00\xdf\x3f\x82\xef\x9f\xc0\xf7\xcf\xe1\xc1\x08\x1e\x2c\xc4\x83\x15\x78\xb0\x16\x0f\x36\xe1\xc1\x0e\x3c\xd8\x87\x07\x87\xf0\xe0\x18\x1e\x9c\xc6\x83\x0b\xf8\x81\x7c\xfc\x40\x09\x7e\xa0\x12\x3f\x50\x87\x1f\x68\xc1\x0f\x74\xe1\x07\xfa\xf1\x03\xc3\xf8\x81\x09\xfc\xc0\x1c\x7e\x30\x82\x1f\x2c\xc2\x0f\x56\xe0\x07\x6b\xf1\x83\x4d\xf8\xc1\x4e\xfc\x60\x02\x3f\x98\xc2\x0f\x66\xf0\x83\x33\xf8\xc1\x1c\x7e\x28\x8a\x1f\x2a\xc5\x0f\x55\xe1\x87\xea\xf1\x43\xad\xf8\xa1\x6e\xfc\xd0\x00\x7e\x68\x04\x3f\x34\x89\x1f\x9a\xc7\xc9\x3c\x9c\x2c\xc2\xc9\x0a\x9c\xac\xc5\xc9\x26\x9c\xec\xc0\xc9\x3e\x9c\x1c\xc2\xc9\x31\x9c\x9c\xc6\xc9\x05\xfc\x70\x3e\x7e\xb8\x04\x3f\x5c\x89\x1f\xae\xc3\x0f\xb7\xe0\x87\xbb\xf0\xc3\xfd\xf8\xe1\x11\xfc\xf0\x04\x7e\x78\x0e\x3f\x12\xc1\x8f\x14\xe2\x47\xca\xf1\x23\x35\xf8\x91\x46\xfc\x48\x3b\x7e\xa4\x0f\x3f\x32\x84\x1f\x19\xc3\x8f\x4c\xe3\x47\x16\xf0\xa3\xf9\xf8\xd1\x12\xfc\x68\x15\x7e\xb4\x1e\x3f\xda\x8a\x1f\xed\xc6\x8f\x0e\xe0\x47\x47\xf0\xa3\x13\xf8\xd1\x39\x3c\x14\xc1\x43\x85\x78\xa8\x1c\x0f\xd5\xe0\xa1\x46\x3c\xd4\x8e\x87\x7a\xf1\x50\x12\x0f\xa5\xf1\xd0\x14\x1e\xca\xe2\xc7\x84\x1f\x2b\xc6\x8f\xc5\xf0\x63\x71\xfc\x58\x0b\x7e\xac\x0b\x3f\xd6\x8f\x1f\x1b\xc6\x8f\x8d\xe3\xc7\x66\xf1\xe3\xe0\xc7\x0b\xf0\xe3\x65\xf8\xf1\x6a\xfc\x78\x03\x7e\xbc\x0d\x3f\xde\x83\x1f\x1f\xc4\x8f\x8f\xe2\xc7\x27\xf1\xe3\xf3\xf8\x89\x3c\xfc\x44\x11\x7e\xa2\x02\x3f\x51\x8b\x9f\x68\xc2\x4f\x74\xe0\x27\x12\xf8\x89\x61\xfc\xc4\x38\x7e\x62\x16\xa7\xc0\xa9\x02\x9c\x2a\xc3\xa9\x1a\x9c\x6a\xc2\xa9\x0e\x9c\xea\xc3\xa9\x21\x9c\x1a\xc3\xa9\x69\x9c\x5a\xc0\x4f\xe6\xe3\x27\x4b\xf0\x93\x55\xf8\xc9\x7a\xfc\x64\x2b\x7e\xb2\x1b\x3f\x39\x80\x9f\x1c\xc1\x4f\x4e\xe2\x27\x73\xf8\xbf\xa3\xf8\xa9\x26\xfc\x54\x07\x7e\x2a\x81\x9f\x4a\xe1\xa7\x32\xf8\xa9\x19\xfc\x54\x0e\x0f\x17\xe0\xe1\x72\x3c\x5c\x83\x87\x1b\xf1\x70\x07\x1e\xee\xc3\xc3\x43\x78\x78\x0c\x0f\x4f\xe3\xe1\x05\xfc\x3f\x51\xfc\x74\x3d\x7e\xba\x15\x3f\xdd\x8d\x9f\x1e\xc0\x4f\x8f\xe0\xa7\x27\xf0\xd3\x73\xf8\x99\x08\x7e\xa6\x08\x3f\x53\x81\x9f\xa9\xc5\xcf\x34\xe1\x67\x3a\xf0\x33\x7d\xf8\x99\x21\xfc\xcc\x18\x7e\x66\x06\x8f\x80\x9f\x6d\xc3\xcf\xf6\xe0\x67\x07\xf1\xb3\xa3\xf8\xd9\x49\xfc\x6c\x16\x3f\x27\xfc\x5c\x39\x7e\xae\x06\x3f\xd7\x88\x9f\x6b\xc7\xcf\xf5\xe2\xe7\x92\xf8\xb9\x34\x7e\x6e\x0a\x3f\x97\xc5\x7f\xe9\xc5\x7f\x49\xe2\xbf\xa4\xf1\x5f\xa6\xf0\x5f\xb2\x78\x54\x78\xb4\x04\x8f\x56\xe2\xd1\x3a\x3c\xda\x82\x47\xbb\xf1\xe8\x00\x1e\x1d\xc1\xa3\x13\x78\x74\x0e\x3f\x1f\xc1\xcf\x17\xe2\xe7\xcb\xf1\xf3\x35\xf8\xf9\x46\xfc\x7c\x3b\x7e\xbe\x17\x3f\x9f\xc4\xcf\xa7\xf1\xf3\x53\xf8\xf9\x2c\x7e\x41\xf8\x85\x62\xfc\x42\x0c\xbf\x10\xc7\x2f\x34\xe3\x17\x72\xf8\xc5\x28\x7e\xb1\x14\xbf\x38\x81\x5f\x9c\xc3\xe9\x08\x4e\x17\xe2\x74\x39\x4e\xd7\xe0\x74\x23\x4e\xb7\xe3\x74\x2f\x4e\x0f\xe1\xf4\x18\x4e\x4f\xe3\xf4\x02\x7e\x69\x0a\xbf\x94\xc5\x6b\x85\xd7\x16\xe3\xb5\x31\xbc\x36\x8e\xd7\x36\xe3\xb5\x9d\x78\x6d\x02\xaf\x4d\xe1\xb5\x19\xbc\x76\x06\xaf\xcd\xe1\x75\x51\xbc\xae\x14\xaf\xab\xc2\xeb\x9a\xf1\xba\x4e\xbc\x2e\x81\xd7\xa5\xf0\xba\x0c\x5e\x37\x83\xd7\xe5\xf0\x58\x14\x8f\x95\xe2\xb1\x2a\x3c\x56\x8f\xc7\x5a\xf1\x58\x37\x1e\x1b\xc0\x63\x23\x78\x6c\x02\x8f\xcd\xe1\xf5\x11\xbc\xbe\x10\xaf\x2f\xc7\xeb\x6b\xf0\xfa\x46\xbc\xbe\x1d\xaf\xef\xc5\xeb\x93\x78\x7d\x1a\xaf\x9f\xc2\xeb\xb3\xf8\x65\xe1\x97\x8b\xf1\xcb\x31\xfc\x72\x1c\xbf\xdc\x8c\x5f\xee\xc4\x2f\x27\xf0\xcb\x29\xfc\x72\x06\xbf\x3c\x8b\x5f\x01\xbf\x52\x80\x5f\x29\xc3\xaf\x54\xe3\x57\x1a\xf0\x2b\x6d\xf8\x95\x1e\xfc\xca\x20\x7e\x65\x14\xbf\x32\x89\x5f\x99\xc7\x99\x3c\x9c\x29\xc2\x99\x0a\x9c\xa9\xc5\x99\x26\x9c\xe9\xc0\x99\x04\xce\xa4\x70\x26\x83\x33\x33\x38\x93\xc3\x1b\xa2\x78\x43\x29\xde\x50\x85\x37\xd4\xe3\x0d\xad\x78\x43\x0f\xde\x30\x88\x37\x8c\xe2\x0d\x93\x78\xc3\x3c\xde\x98\x87\x37\x16\xe1\x8d\x15\x78\x63\x2d\xde\xd8\x84\x37\x76\xe0\x8d\x7d\x78\xe3\x10\xde\x38\x86\x37\x4e\xe3\xf1\x52\x3c\x5e\x85\xc7\xeb\xf1\x6b\x09\xfc\x5a\x0a\xbf\x3e\x82\x5f\x9f\xc0\xaf\xcf\xe1\x4d\x11\xbc\xa9\x10\x6f\x2a\xc7\x9b\x6a\xf0\xa6\x46\xbc\xa9\x1d\x6f\xea\xc5\x9b\x92\x78\x53\x1a\x6f\x9a\xc6\x9b\x16\xf0\x44\x3e\x9e\x28\xc1\x13\x95\x78\xa2\x0e\x4f\xb4\xe0\x89\x2e\x3c\xd1\x8f\x27\x86\xf1\xc4\x38\x9e\x98\xc5\x9b\xc1\x9b\x0b\xf0\xe6\x32\xbc\xb9\x06\x6f\x6e\xc2\x9b\x3b\xf0\xe6\x3e\xbc\x79\x08\x6f\x1e\xc3\x9b\xa7\xf1\xe6\x05\xfc\x46\x3e\x7e\xa3\x04\xbf\x51\x89\xdf\xa8\xc7\x6f\x8c\xe3\x37\x66\xf1\x16\xf0\x96\x02\xbc\xa5\x1c\x6f\xa9\xc1\x5b\x1a\xf1\x96\x76\xbc\xa5\x17\x6f\x49\xe2\x2d\x69\xbc\x65\x0a\x6f\xc9\xe2\x49\xe1\xc9\x62\x3c\x19\xc3\x93\x71\x3c\xd9\x8c\x27\x3b\xf1\x64\x02\x4f\xa6\xf0\x64\x06\x4f\xce\xe0\xc9\x1c\x7e\x33\x8a\xdf\x2c\xc5\x6f\x56\xe1\x37\xeb\xf1\x9b\xad\xf8\xcd\x6e\xfc\xe6\x00\x7e\x73\x04\xbf\x39\x81\xdf\x9c\xc3\x5b\x23\x78\x6b\x21\xde\x5a\x8e\xb7\xd6\xe0\xad\x8d\x78\x6b\x3b\xde\xda\x8b\xb7\x26\xf1\xd6\x34\xde\x3a\x85\xb7\x66\xf1\x5b\xc2\x6f\x15\xe3\xb7\x62\xf8\xad\x38\x7e\xab\x19\xbf\xd5\x89\xdf\xea\xc7\x6f\x0d\xe3\xa9\x0a\x3c\x35\x8f\xdf\xce\xc7\x6f\x97\xe0\xb7\x2b\xf1\x3b\xe0\x77\x0a\xf0\x3b\xe5\xf8\x9d\x1a\xfc\x6e\x07\x9e\xee\xc2\xd3\x03\x78\x7a\x14\x4f\x4f\xe1\xe9\x05\xfc\xd7\x79\xfc\x37\xe1\xbf\x95\xe3\xbf\xd5\xe0\xbf\x35\xe1\xbf\x75\xe2\xbf\x25\xf0\xdf\x52\xf8\xef\x49\xfc\xf7\x31\xfc\xf7\x69\x3c\xd3\x83\x67\xe6\xf0\x7b\x11\xfc\x5e\x11\x7e\xaf\x02\xbf\x57\x8b\xdf\x6b\xc2\xef\x75\xe0\xf7\xfa\xf0\x7b\x43\xf8\xbd\x31\xfc\x7e\x2d\x7e\xbf\x09\xbf\xdf\x81\xff\x51\x82\xff\x51\x89\xff\x51\x87\xff\xd1\x82\xff\xd1\x85\xff\xd1\x8f\xff\x31\x8c\xff\x31\x81\xff\x31\x87\x67\x07\xf0\xec\x08\x9e\x9d\xc0\xff\xec\xc5\xff\x4c\xe2\x7f\xa6\xf1\x3f\xa7\xf0\x3f\xb3\xf8\x03\xe1\x0f\x8a\xf1\x07\x31\xfc\x41\x1c\x7f\xd0\x8c\x3f\xe8\xc4\x1f\x24\xf0\x07\x29\xfc\x41\x06\x7f\x30\x83\x3f\xc8\xe1\x7f\x45\xf1\xbf\x4a\xf1\xbf\xaa\xf0\xbf\xea\xf1\xbf\x5a\xf1\xbf\xba\xf1\xbf\x06\xf0\xbf\x46\xf0\x5c\x3d\x9e\x6b\xc5\x73\xdd\x78\x6e\x00\xcf\x8d\xe0\x0f\x9b\xf0\x87\x1d\xf8\xc3\x3e\xfc\xe1\x10\xfe\x70\x0c\x7f\x94\xc0\x1f\xa5\xf0\x47\x19\xfc\xd1\x0c\xfe\x28\x87\xb7\x45\xf1\xb6\x52\xbc\xad\x0a\x6f\xab\xc7\xdb\x5a\xf1\xb6\x6e\xbc\x6d\x00\xcf\xd7\xe0\xf9\x46\x3c\xdf\x8e\xe7\x7b\xf1\x7c\x12\xcf\xa7\xf1\xfc\x14\x9e\xcf\xe2\x8f\x85\x3f\x2e\xc6\xdb\xcb\xf1\xf6\x1a\xbc\xbd\x11\x6f\xef\xc0\xdb\xfb\xf0\xf6\x21\xbc\x7d\x0c\x6f\x9f\xc6\xdb\x17\xf0\x8e\x7c\xbc\xa3\x04\xef\xa8\xc4\x3b\xea\xf0\x8e\x16\xbc\xa3\x0b\xef\xe8\xc7\x3b\x86\xf1\x8e\x09\xbc\x63\x0e\x67\x23\x38\x5b\x84\xb3\x15\x38\x5b\x8b\xb3\x4d\x38\xdb\x81\xb3\x7d\x38\x3b\x84\xb3\x63\x38\x3b\x8d\xb3\x39\xfc\x49\x12\x7f\x92\xc6\x9f\x4c\xe1\x4f\x16\xf0\xa7\x51\xfc\x69\x19\xfe\xb4\x06\x7f\xda\x84\x3f\xed\xc0\x9f\xf6\xe1\x4f\x87\xf0\x67\x13\xf8\xb3\x39\xbc\x10\xc1\x0b\x45\x78\xa1\x02\x2f\xd4\xe2\x85\x26\xbc\xd0\x89\x17\x12\x78\x21\x85\x3f\x9f\xc7\x5f\xe4\xe1\x2f\x8a\xf0\x17\x15\xf8\x8b\x5a\xfc\x45\x13\xfe\xa2\x13\x7f\x91\xc0\x5f\xa4\xf0\x17\xe3\xf8\x8b\x59\xfc\x25\xf8\xcb\x22\xfc\x65\x05\xfe\x32\x8e\xbf\x6c\xc6\x5f\x76\xe2\x2f\x13\xf8\xcb\x61\xfc\xe5\x38\xfe\x72\x16\xe7\xc0\xb9\x02\x9c\x2b\xc3\xb9\x6a\x9c\x6b\xc0\xb9\x36\x9c\xeb\xc1\xb9\x41\x9c\x1b\xc5\xb9\x49\x9c\x9b\xc7\x5f\xe5\xe1\xaf\x8a\xf0\x57\x15\xf8\xab\x5a\xfc\x55\x13\xfe\xaa\x13\x7f\x95\xc0\x5f\xa5\xf0\x57\x19\xfc\xd5\x0c\xfe\x1a\xfc\x75\x01\xfe\xba\x1c\x7f\x5d\x83\xbf\x6e\xc4\x5f\xb7\xe3\xaf\xfb\xf0\xd7\x43\x78\xe7\x34\xde\xb9\x40\x48\x3e\x21\x25\x84\x54\x12\x52\x4f\x48\x2b\x21\xdd\x84\x0c\x10\x32\x42\xc8\x04\x21\x73\x84\x8b\x22\x84\x8b\x0a\x09\x17\x95\x13\x2e\xaa\x25\x5c\xd4\x44\xb8\xa8\x83\x70\x51\x1f\xe1\xa2\x21\xc2\x45\x63\x84\x8b\xa6\x09\x17\x2d\x10\xee\x92\x4f\xb8\x4b\x09\xe1\x2e\x95\x84\xbb\xd4\x11\xee\xd2\x42\xb8\x4b\x37\xe1\x2e\x03\x84\xbb\x8c\x10\xee\x32\x41\xb8\x4b\x96\x70\xb1\x08\x17\x97\x10\x2e\xae\x24\x5c\x5c\x47\xb8\x78\x8a\x70\x71\x96\x30\x22\xc2\x48\x31\x61\x24\x46\x18\x89\x13\x46\x9a\x09\x23\x9d\x84\x91\x04\x61\x24\x45\x18\xc9\x10\x46\x66\x08\x23\x39\xc2\x25\x51\xc2\x25\xa5\x84\x4b\xaa\x08\x97\xd4\x13\x2e\x69\x25\x5c\xd2\x4d\xb8\x64\x80\x70\xc9\x08\xe1\x92\x09\xc2\x25\x73\x84\x4b\x23\x84\x4b\x0b\x09\x97\x96\x13\x2e\xad\x21\x5c\xda\x48\xb8\xb4\x9d\x70\x69\x2f\xe1\xd2\x24\xe1\xd2\x34\xe1\xd2\x29\xc2\xa5\x59\xc2\x65\x22\x5c\x56\x4c\xb8\x2c\x46\xb8\x2c\x4e\xb8\xac\x99\x70\x59\x27\xe1\xb2\x04\xe1\xb2\x14\xe1\xb2\x0c\xe1\xb2\x19\xc2\x65\x39\xc2\xbc\x28\x61\x5e\x29\x61\x5e\x35\x61\x5e\x03\x61\x5e\x1b\x61\x5e\x0f\x61\xde\x20\x61\xde\x28\x61\xde\x14\x61\x5e\x96\x70\xb9\x08\x97\x97\x10\x2e\xaf\x24\x5c\x5e\x47\xb8\xbc\x95\x70\x79\x2f\xe1\xf2\x24\xe1\xf2\x34\xe1\xf2\x29\xc2\xe5\x59\xc2\x15\x51\xc2\x15\xa5\x84\x2b\xaa\x08\x57\xd4\x13\xae\x68\x25\x5c\xd1\x4d\xb8\x62\x80\x70\xc5\x08\xe1\x8a\x09\xc2\x15\x73\x84\x41\x84\x30\x28\x24\x0c\xca\x09\x83\x1a\xc2\xa0\x91\x30\x68\x27\x0c\x7a\x09\x83\x24\x61\x90\x26\x0c\xa6\x08\x83\x2c\xa1\x44\xa8\x62\x42\xc5\x08\x15\x27\x54\x33\xa1\x3a\x09\x95\x20\x54\x8a\x50\x19\x42\xcd\x10\x2a\x47\xe8\x28\xa1\x4b\x09\x5d\x45\xe8\x7a\x42\x77\x10\x3a\x41\xe8\x14\xa1\x33\x84\x9e\x21\x74\x8e\x30\x8c\x12\x86\xa5\x84\x61\x15\x61\x58\x4f\x18\xb6\x12\x86\xdd\x84\xe1\x00\x61\x38\x42\x18\x4e\x10\x86\x73\x84\xbb\x46\x08\x77\x2d\x22\xdc\xb5\x82\x70\xd7\x5a\xc2\x5d\x9b\x09\x77\xed\x24\xdc\x35\x41\xb8\x6b\x8a\x70\xd7\x0c\xe1\xae\x33\x84\xbb\xe6\x08\xf3\xa3\x84\xf9\xa5\x84\xbb\x15\x11\xee\x56\x41\xb8\x5b\x9c\x70\xb7\x66\xc2\xdd\x3a\x09\x77\x4b\x10\xee\x96\x22\xdc\x2d\x43\xb8\xdb\x0c\xe1\x6e\x39\xc2\x95\x51\xc2\x95\xa5\x84\x2b\xab\x08\x57\xd6\x13\xae\x6c\x25\x5c\xd9\x4d\xb8\x72\x80\x70\xe5\x08\xe1\xca\x09\xc2\x95\x73\x84\xab\x22\x84\xab\x0a\x09\x57\x95\x13\xae\xaa\x21\x5c\xd5\x48\xb8\xaa\x9d\x70\x55\x2f\xe1\xaa\x24\xe1\xaa\x34\xe1\xaa\x29\xc2\x55\x59\xc2\xa8\x08\xa3\xc5\x84\xd1\x18\x61\x34\x4e\x18\x6d\x26\x8c\x76\x12\x46\x13\x84\xd1\x14\x61\x34\x43\x18\x9d\x21\xdc\x3d\x8f\x70\xf7\x62\xc2\xdd\x63\x84\xbb\xc7\x09\x77\x6f\x26\xdc\xbd\x93\x70\xf7\x04\xe1\xee\x29\xc2\xdd\x33\x84\xbb\x7f\xd3\xe5\x08\xf7\x88\x12\xee\x51\x4a\xb8\x47\x86\x70\x8f\x19\xc2\x3d\x07\x08\xf7\x1c\x21\xdc\x73\x82\x70\xcf\x39\xc2\x82\x08\x61\x41\x21\x61\x41\x39\x61\x41\x0d\x61\x41\x23\x61\x41\x3b\x61\x41\x2f\x61\x41\x92\xb0\x20\x4d\x58\x30\x45\x58\x90\x25\x5c\x2d\xc2\xd5\x25\x84\xab\x2b\x09\x57\xd7\x11\xae\x6e\x21\x5c\xdd\x45\xb8\xba\x9f\x70\xf5\x30\xe1\xea\x71\xc2\xd5\xb3\x84\x6b\x20\x5c\x53\x40\xb8\xa6\x9c\x70\x4d\x2d\xe1\x9a\x26\xc2\x35\x1d\x84\x6b\xfa\x08\xd7\x0c\x11\xae\x19\x23\x5c\x33\xcd\xff\xc7\x91\x1e\x80\xf7\x21\xd8\x6b\xdf\xf8\xc7\x64\x67\x61\x71\xdf\xdf\x87\x3c\x5b\x0e\x61\x51\x61\x41\xaa\x29\x71\x9a\x56\xb4\xd1\x46\x9b\xb6\xbf\xb6\xa9\xa6\xed\xaf\x6d\xda\x66\x1a\x64\x64\xff\x85\xe5\x99\xf0\x0f\x32\x82\x20\x08\x32\xc2\x09\xc2\x9b\xc7\xb2\xc7\x6f\x47\x90\x11\x04\x61\x39\x7b\x82\x1c\x0b\x72\x26\x9b\xec\x2c\x26\x23\x08\xc2\x32\xcb\x76\xb2\x79\x2f\xef\xf5\xbd\x3e\xd7\xf7\x73\xdf\xb7\x8e\x9c\x47\x47\x05\x3a\x2a\x0f\x1d\x55\x82\x8e\x4a\xa2\xa3\xea\xd1\x51\xad\xe8\xa8\x6e\x74\xd4\x00\x3a\x6a\x0c\x1d\x35\x83\xb2\xd3\x50\x76\x36\xca\x2e\x44\xd9\x09\x94\x5d\x8d\xb2\x1b\x51\x76\x3b\xca\x4e\xa1\xec\x21\x94\x3d\x81\xb2\xe7\xd0\xd1\x19\xe8\xe8\x5c\x74\x74\x31\x3a\xba\x02\x1d\x5d\x8b\x8e\x6e\x46\x47\x77\xa2\xa3\xfb\xd0\xd1\x23\xe8\xe8\x29\x74\x0c\xe8\x98\x2c\x74\x4c\x21\x3a\x26\x81\x8e\xa9\x46\xc7\x34\xa2\x63\xda\xd1\xb7\x3a\xd1\xb7\xfa\xd0\xb7\x46\xd0\xb7\xa6\xd0\xb7\x16\x50\x4e\x16\xca\x29\x40\x39\x65\x28\xa7\x0a\xe5\x34\xa0\x9c\x76\x94\x93\x42\x39\x43\x28\x67\x02\xe5\xcc\xa1\x63\x33\xd0\xb1\xb9\xe8\xd8\x62\x74\x6c\x05\x3a\xb6\x16\x1d\xdb\x8c\x8e\xed\x44\xc7\xf6\xa1\x63\x47\xd0\xb1\x53\xe8\xd8\x05\xb4\x28\x13\x2d\xca\x47\x8b\x4a\xd1\xa2\x4a\xb4\xa8\x1e\x2d\x6a\x45\x8b\xba\xd1\xa2\x41\xb4\x68\x1c\x2d\x9a\x45\xc7\xa5\xa3\xe3\x72\xd0\x71\xc5\xe8\xb8\x0a\x74\x5c\x2d\x3a\xae\x19\x1d\x5f\x8d\x8e\x6f\x44\xdf\xce\x44\xdf\xce\x47\xdf\x2e\x45\xdf\xae\x46\xdf\x6e\x44\x79\xd9\x28\xaf\x10\xe5\x25\x50\x5e\x35\xca\xfb\xb2\x6b\x47\x27\x06\x3a\x71\x10\x9d\x38\x8e\x4e\x6a\x45\x27\x75\xa3\x93\x4b\xd0\xc9\xe5\xe8\xe4\x1a\x74\x72\x13\x3a\xb9\x03\x9d\xdc\x8b\x4e\x1e\x46\x27\x4f\xa2\x93\xe7\x51\x7e\xa0\xfc\x3c\xb4\x38\x03\x2d\xce\x45\x8b\x8b\xd1\xe2\x0a\xb4\xb8\x16\x2d\x6e\x46\x8b\x3b\xd1\xe2\x3e\xb4\x78\x04\x2d\x9e\x42\x8b\x17\xd0\x29\x99\xe8\x94\x7c\x74\x4a\x29\x3a\xa5\x12\x9d\x52\x8f\x4e\x69\x45\xa7\x74\xa3\x53\x06\xd0\x29\x63\xe8\x94\x19\xb4\x24\x0d\x2d\xc9\x46\x4b\x0a\xd1\x92\x04\x5a\x52\x8d\x96\x34\xa2\x25\xed\x68\x49\x0a\x2d\x19\x42\x4b\x26\xd0\x92\x05\x54\x90\x89\x0a\xf2\x51\x41\x29\x2a\xa8\x44\x05\xf5\xa8\xa0\x15\x15\x74\xa3\x82\x01\x54\x30\x86\x0a\x66\xd0\xd2\x34\xb4\x34\x1b\x2d\x2d\x44\x4b\x13\x68\x69\x35\x5a\xda\x84\x96\x76\xa0\xa5\xbd\x68\xe9\x30\x5a\x3a\x85\x96\x2e\xa0\x53\x33\xd1\xa9\xf9\xe8\xd4\x52\x74\x6a\x25\x3a\xb5\x1e\x9d\xda\x8a\x4e\xed\x46\xa7\x0e\xa0\x53\xc7\xd0\xa9\x33\xe8\xb4\x34\x74\x5a\x36\x3a\xad\x10\x9d\x96\x40\xa7\xd5\xa0\xd3\x9a\xd0\x69\x1d\xe8\xb4\x3e\x74\xda\x08\x3a\x6d\x0a\x9d\xb6\x80\x0a\x33\x51\x61\x3e\x2a\x4c\xa0\xc2\x6a\x54\xd8\x88\x0a\xdb\x51\x61\x0a\x15\x0e\xa1\xc2\x09\x54\x38\x87\x4e\xcf\x40\xa7\xe7\xa2\xd3\x8b\xd1\xe9\x15\xe8\xf4\x5a\x74\x7a\x33\x3a\xbd\x13\x9d\xde\x87\x4e\x1f\x41\xa7\x4f\xa1\xd3\x17\xd0\xbf\x4c\xa0\x7f\x99\x43\xcb\x32\xd0\xb2\x5c\xb4\xac\x18\x2d\xab\x40\xcb\xea\xd0\xb2\x16\xb4\xac\x0b\x2d\xeb\x47\xcb\x46\xd1\xb2\x69\x54\x04\x2a\xca\x42\x45\x05\xa8\xa8\x0c\x15\x55\xa1\xa2\x06\x54\xd4\x86\x8a\x7a\x50\xd1\x20\x2a\x1a\x47\x45\xb3\x68\x79\x3a\x5a\x9e\x83\x96\x17\xa1\xe5\xe5\x68\x79\x0d\x5a\xde\x84\x96\x77\xa0\xe5\xbd\x68\xf9\x30\x5a\x3e\x89\x96\xcf\xa3\x15\x81\x56\xe4\xa1\x15\x25\x68\x45\x12\xad\xa8\x43\x2b\x5a\xd0\x8a\x2e\xb4\xa2\x1f\xad\x18\x45\x2b\xa6\xd1\x19\xa0\x33\xb2\x50\x71\x09\x2a\x4e\xa2\xe2\x7a\x54\xdc\x8a\x8a\xbb\x51\xf1\x00\x2a\x1e\x43\xc5\x33\xe8\xcc\x34\x74\x66\x36\x3a\xb3\x10\x9d\x99\x40\x67\x56\xa3\x33\x9b\xd0\x99\x1d\xe8\xcc\x5e\x74\xe6\x30\x3a\x73\x12\x9d\x39\x8f\x56\x06\x5a\x99\x87\x56\x96\xa0\x95\x49\xb4\xb2\x0e\xad\x6c\x41\x2b\xbb\xd0\xca\x7e\xb4\x72\x14\xad\x9c\x46\xab\x40\xab\xb2\xd0\xaa\x02\xb4\xaa\x0c\xad\xaa\x42\xab\x1a\xd1\xaa\x76\xb4\x2a\x85\x56\x0d\xa1\x55\x13\x68\xd5\x3c\x2a\x09\x54\x92\x87\x4a\x4a\x50\x49\x12\x95\xd4\xa1\x92\x16\x54\xd2\x85\x4a\xfa\x51\xc9\x28\x2a\x99\x46\x67\x81\xce\xca\x46\x67\x15\xa2\xb3\xca\xd1\xea\x04\x5a\x5d\x8d\x56\x37\xa2\xd5\xed\x68\x75\x0a\xad\x1e\x42\xab\x27\xd0\xea\x39\xb4\x26\x03\xad\xc9\x45\x6b\x8a\xd1\x9a\x0a\xb4\xa6\x16\xad\x69\x46\x6b\x3a\xd1\x9a\x3e\xb4\x66\x04\xad\x99\x42\x6b\x16\x50\x69\x26\x2a\xcd\x47\xa5\xa5\xa8\xb4\x12\x95\xd6\xa3\xd2\x56\x54\xda\x8d\x4a\x07\x50\xe9\x38\x2a\x9d\x45\x67\xa7\xa3\xb5\x45\x68\x6d\x39\x5a\x5b\x83\xd6\x36\xa1\xb5\x1d\x68\x6d\x2f\x5a\x3b\x8c\xd6\x4e\xa2\xb5\xf3\x68\x5d\xa0\x75\x79\x68\x5d\x29\x5a\x57\x89\xd6\xd5\xa3\x75\xad\x68\x5d\x37\x5a\x37\x80\xd6\x8d\xa1\x75\x33\xa8\x2c\x0d\x95\x65\xa3\xb2\x42\x54\x56\x8e\xca\x6a\x50\x59\x13\x2a\xeb\x40\x65\xbd\xa8\x6c\x18\x95\x4d\xa2\xb2\x79\xb4\x3e\xd0\xfa\x3c\xb4\xbe\x04\xad\x4f\xa2\xf5\x75\x68\x7d\x0b\x5a\xdf\x85\xd6\xf7\xa3\xf5\xe3\x68\xfd\x2c\xda\x90\x8e\x36\xe4\xa0\x0d\x45\x68\x43\x39\xda\x50\x83\x36\x34\xa1\x0d\x9d\x68\xc3\x30\xda\x30\x89\x36\xcc\xa3\x8d\x81\x36\xe6\xa1\x8d\x25\x68\x63\x12\x6d\xac\x43\x1b\x5b\x50\x62\x08\x25\x26\x50\x62\x0e\x6d\xca\x40\x9b\x72\xd1\xa6\x62\xb4\x29\x89\x36\xd5\xa1\x4d\xad\x68\x53\x37\xda\x34\x80\x36\x8d\xa1\x4d\x33\x68\x73\x1a\xda\x9c\x8b\x36\x17\xa3\xcd\x15\x68\x73\x2d\xda\xdc\x8c\x36\x77\xa2\xcd\x7d\x68\xf3\x08\xda\x3c\x85\x36\x2f\xa0\x2d\x99\x68\x4b\x3e\xda\x52\x8a\xb6\x54\xa2\x2d\xf5\x68\x4b\x1b\xda\xd2\x83\xb6\x0c\xa2\x2d\xe3\x68\xcb\x1c\x2a\x0f\x54\x9e\x87\xca\x4b\x50\x79\x12\x95\xd7\xa1\xf2\x16\x54\xde\x85\xca\xfb\x51\xf9\x28\x2a\x9f\x46\x5b\x41\x5b\xb3\xd0\xd6\x02\xb4\xb5\x0c\x6d\xad\x42\x5b\x1b\xd0\xd6\x36\xb4\xb5\x07\x6d\x1d\x44\x5b\xc7\xd1\xd6\x59\x74\x4e\x3a\x3a\x27\x07\x9d\x53\x84\xce\x29\x47\xdb\xda\xd0\xb6\x1e\xb4\x6d\x10\x6d\x1b\x47\xdb\x66\x51\x45\x3a\xaa\xc8\x41\x15\x09\x54\x51\x8d\x2a\x1a\x51\x45\x3b\xaa\x48\xa1\x8a\x21\x54\x31\x81\x2a\xe6\xd0\xf6\x0c\xb4\x3d\x17\x6d\x2f\x41\xdb\x2b\xd1\xf6\x16\xb4\xbd\x0b\x6d\x1f\x40\xdb\xc7\xd0\xf6\x19\xb4\x23\x0d\xed\xc8\x46\x3b\x0a\xd1\x8e\x04\xda\x51\x83\x76\x34\xa1\x1d\x1d\x68\x47\x2f\xda\x31\x8c\x76\x4c\xa2\x1d\x0b\x68\x67\x26\xda\x99\x8f\x76\x96\xa2\x9d\x95\x68\x67\x3d\xda\xd9\x86\x76\xa6\xd0\xce\x21\xb4\x73\x12\xed\x9c\x47\xc9\x40\xc9\x3c\x94\x2c\x41\xc9\x24\x4a\xd6\xa1\x64\x0b\x4a\x76\xa1\x64\x3f\x4a\x8e\xa2\xe4\x02\xda\x95\x89\x76\x15\xa0\x5d\x65\x68\x57\x35\xda\xd5\x88\x76\xb5\xa3\x5d\xbd\x68\xd7\x30\xda\x35\x85\x76\x2d\xa0\xdd\x99\x68\x77\x3e\xda\x5d\x86\x76\x57\xa1\xdd\x0d\x68\x77\x1b\xda\xdd\x83\x76\x0f\xa1\xdd\x13\x68\xf7\x1c\xda\x93\x81\xf6\xe4\xa2\x3d\xc5\x68\x4f\x05\xda\xd3\x80\xf6\xb4\xa1\x3d\x29\xb4\x67\x08\xed\x99\x44\x7b\xe6\xd1\xde\x42\xb4\x37\x81\xf6\x56\xa3\xbd\x8d\x68\x6f\x3b\xda\x9b\x42\x7b\x87\xd0\xde\x09\xb4\x77\x0e\xed\xcb\x40\xfb\xf2\xd0\xbe\x12\xb4\x2f\x89\xf6\xd5\xa1\x7d\x2d\x68\x5f\x17\xda\xd7\x8f\xf6\x8d\xa2\x7d\xd3\x68\x3f\x68\x7f\x16\xda\x5f\x88\xf6\x27\xd0\xfe\x1a\xb4\xbf\x09\xed\xef\x40\xfb\x7b\xd1\xfe\x71\xb4\x7f\x16\x55\xa5\xa3\xaa\x5c\x54\x55\x8c\xaa\x2a\x50\x55\x2d\xaa\x6a\x46\x55\x9d\xa8\xaa\x1f\x55\x8d\xa2\x73\x6b\xd0\xb9\x4d\xe8\xdc\x0e\x74\x6e\x2f\x3a\x77\x18\x9d\x3b\x89\xce\x9d\x47\x07\x02\x1d\xc8\x43\x07\x4a\xd0\x81\x24\x3a\x50\x87\x0e\xb4\xa0\x03\x5d\xe8\xc0\x00\x3a\x0f\x74\x7e\x35\xba\x60\x16\x7d\xb7\x16\x7d\xb7\x19\x7d\xb7\x13\x7d\xb7\x0f\x7d\x77\x04\x7d\x77\x0a\x7d\x77\x01\x5d\x98\x89\x2e\x2c\x40\x17\x96\xa1\x0b\xab\xd0\x85\x8d\xe8\xc2\x4e\x74\x61\x3f\xba\x70\x14\x5d\x38\x8d\x2e\x02\x5d\x94\x85\x2e\x2a\x40\x17\x95\xa1\x8b\xaa\xd0\x45\x0d\xe8\xa2\x36\x74\x51\x0f\xba\x68\x10\x5d\x34\x8e\x2e\x9a\x45\xb5\xe9\xa8\x36\x07\xd5\x16\xa1\xda\x72\x54\x5b\x83\x6a\x9b\x50\x6d\x07\xaa\xed\x45\xb5\xc3\xa8\x76\x12\xd5\xce\xa3\xef\x05\xfa\x5e\x1e\xfa\x5e\x09\xfa\x5e\x12\x7d\xaf\x1e\x7d\xaf\x15\x7d\xaf\x07\x7d\x6f\x10\x7d\x3f\x0f\x7d\xbf\x04\x7d\x3f\x89\xbe\x5f\x87\xbe\xdf\x8a\xbe\x9f\x42\xdf\x1f\x42\xdf\x9f\x40\xdf\x9f\x43\x75\xd9\xa8\xae\x10\xd5\x25\x50\x5d\x35\xaa\x6b\x44\x75\x1d\xa8\xae\x17\xd5\x0d\xa3\xba\x49\x54\x37\x8f\x2e\xce\x44\x17\xe7\xa3\x8b\x4b\xd1\xc5\xd5\xe8\xe2\x46\x74\x71\x3b\xba\x38\x85\x2e\x1e\x46\x17\x4f\xa1\x8b\x17\xd0\x25\x99\xe8\x92\x7c\x74\x49\x19\xba\xa4\x1a\x5d\xd2\x88\x2e\x69\x47\x97\xa4\xd0\x25\x43\xe8\x92\x09\x74\xc9\x3c\xfa\x41\xa0\x1f\xe4\xa3\x1f\x94\xa2\x1f\x54\xa2\x1f\xd4\xa3\x1f\xb4\xa1\x1f\xf4\xa0\x1f\x0c\xa2\x1f\x4c\xa0\x1f\xcc\xa1\xfa\x0c\x54\x9f\x8b\xea\x8b\x51\x7d\x05\xaa\xaf\x45\xf5\xcd\xa8\xbe\x13\xd5\xf7\xa3\xfa\x31\x54\x3f\x83\x7e\x58\x84\x7e\x58\x81\x7e\x58\x8b\x7e\xd8\x82\x7e\xd8\x85\x7e\xd8\x8f\x7e\x38\x8a\x7e\x38\x8d\x2e\x05\x5d\x9a\x8d\x2e\x2d\x44\x97\x26\xd0\xa5\xd5\xe8\xd2\x46\x74\x69\x3b\xba\x34\x85\x2e\x1d\x42\x97\x4e\xa0\x4b\xe7\x50\x43\xa0\x86\x3c\xd4\x50\x82\x1a\x92\xa8\xa1\x0e\x35\xb4\xa0\x86\x2e\xd4\xd0\x8f\x1a\x46\x51\xc3\x34\xba\x0c\x74\x59\x16\xba\xac\x00\x5d\x96\x40\x97\x55\xa3\xcb\x1a\xd1\x65\xed\xe8\xb2\x14\xba\x6c\x08\x5d\x36\x81\x2e\x9b\x43\x97\x67\xa0\xcb\x73\xd1\xe5\xc5\xe8\xf2\x0a\x74\x79\x2d\xba\xbc\x05\x5d\xde\x8d\x2e\x1f\x40\x97\x8f\xa1\xcb\x67\xd0\xff\x3f\x0d\x35\x8e\xa3\xc6\x39\x74\x45\x06\xba\x22\x0f\x5d\x51\x82\xae\x48\xa2\x2b\xea\xd0\x15\x2d\xe8\x8a\x2e\x74\x45\x3f\xba\x62\x14\x5d\x31\x8d\xae\x04\x5d\x99\x85\xae\x2c\x40\x57\x96\xa1\x2b\xab\xd0\x95\x0d\xe8\xca\x36\x74\x65\x0a\x5d\x39\x84\xae\x9c\x40\x57\xce\xa1\xab\x32\xd0\x55\xb9\xe8\xaa\x62\x74\x55\x05\xba\xaa\x16\x5d\xd5\x8c\xae\xea\x44\x57\xf5\xa1\xab\x46\xd0\x55\x53\xe8\xaa\x05\xd4\x94\x8d\x9a\x0a\x51\x53\x02\x35\x55\xa3\xa6\x26\xd4\xd4\x89\x9a\xfa\x50\xd3\x08\x6a\x9a\x42\x3f\x02\xfd\xa8\x0e\xfd\xa8\x05\xfd\xa8\x0b\xfd\xa8\x1f\xfd\x68\x14\xfd\x68\x1a\x5d\x0d\xba\x3a\x0b\x5d\x5d\x80\xae\x2e\x43\x57\x57\xa1\xab\x1b\xd0\xd5\x6d\xe8\xea\x1e\x74\xf5\x20\xba\x7a\x1c\x5d\x3d\x8b\xae\x49\x47\xd7\xe4\xa0\x6b\x8a\xd0\x35\xe5\xe8\x9a\x1a\x74\x4d\x13\xba\xa6\x03\x5d\xd3\x8b\xae\x19\x46\xd7\x4c\xa2\x6b\xe6\x51\x73\xa0\xe6\x3c\xd4\x5c\x82\x9a\x93\xa8\xb9\x0e\x35\xb7\xa0\xe6\x2e\xd4\xdc\x8f\x9a\x47\x51\xf3\x34\xba\x16\x74\x6d\x16\xba\xb6\x00\x5d\x5b\x86\xae\xad\x42\xd7\x36\xa0\x6b\xdb\xd0\xb5\x3d\xe8\xda\x41\x74\xed\x38\xba\x76\x16\x5d\x97\x8e\xae\xcb\x41\xd7\x15\xa1\xeb\xca\xd1\x75\x35\xe8\xba\x26\x74\x5d\x07\xba\xae\x17\x5d\x37\x8c\xae\x9b\x44\xd7\xcd\xa3\xeb\x03\x5d\x9f\x87\xae\x2f\x41\xd7\x27\xd1\xf5\x75\xe8\xfa\x16\x74\x7d\x17\xba\xbe\x1f\x5d\x3f\x8a\xae\x9f\x46\x2d\xa0\x96\x2c\xd4\x52\x80\x5a\xca\x50\x4b\x35\x6a\x69\x44\x2d\xed\xa8\x25\x85\x5a\x86\x50\xcb\x14\x6a\x59\x40\x37\x64\xa2\x1b\xf2\xd1\x0d\x65\xe8\x86\x2a\x74\x43\x03\xba\xa1\x0d\xdd\xd0\x83\x6e\x18\x44\x37\x8c\xa3\x1b\x66\xd1\x8d\xe9\xe8\xc6\x5c\x74\x63\x31\xba\xb1\x02\xdd\x58\x8b\x6e\x6c\x46\x37\x76\xa2\x1b\xfb\xd0\x8d\x23\xe8\xc6\x29\x74\xe3\x02\xba\x29\x13\xdd\x94\x8f\x6e\x2a\x45\x37\x55\xa2\x9b\xea\xd1\x4d\xad\xe8\xa6\x6e\x74\xd3\x00\xba\x69\x0c\xdd\x34\x8b\x5a\xd3\x51\x6b\x0e\x6a\x2d\x42\xad\xe5\xa8\xb5\x06\xb5\x36\xa1\xd6\x0e\xd4\xda\x8b\x5a\x87\x51\xeb\x14\x6a\x5d\x40\x37\x67\xa2\x9b\xf3\xd1\xcd\xa5\xe8\xe6\x4a\x74\x73\x3d\xba\xb9\x15\xdd\xdc\x8d\x6e\x1e\x40\x37\x8f\xa1\x9b\x67\xd0\x2d\x69\xe8\x96\x6c\x74\x4b\x21\xba\x25\x81\x6e\xa9\x41\xb7\x34\xa3\x5b\x3a\xd1\x2d\x7d\xe8\x96\x11\x74\xcb\x14\xba\x65\x01\xdd\x9a\x85\x6e\x2d\x40\xb7\x96\xa1\x5b\xab\xd0\xad\x0d\xe8\xd6\x36\x74\x6b\x0f\xba\x75\x10\xdd\x3a\x8e\x6e\x9d\x45\x6d\xe9\xa8\x2d\x07\xb5\x15\xa1\xb6\x72\xd4\x56\x83\xda\x9a\x50\x5b\x07\x6a\xeb\x45\x6d\xc3\xa8\x6d\x0a\xb5\x2d\xa0\xdb\xb2\xd0\x6d\x05\xe8\xb6\x32\x74\x5b\x15\xba\xad\x01\xdd\xd6\x86\x6e\xeb\x41\xb7\x0d\xa2\xdb\xc6\xd1\x6d\xb3\xe8\xf6\x74\x74\x7b\x2e\xba\xbd\x18\xdd\x5e\x81\x6e\xaf\x45\xb7\x37\xa3\xdb\x3b\xd1\xed\xfd\xe8\xf6\x51\x74\xfb\x34\xba\x03\x74\x47\x16\xba\xa3\x00\xdd\x51\x86\xee\xa8\x42\x77\x34\xa0\x3b\xda\xd0\x1d\x3d\xe8\x8e\x41\x74\xc7\x38\xba\x63\x16\xb5\xa7\xa3\xf6\x1c\xd4\x5e\x84\xda\xcb\x51\x7b\x0d\x6a\x6f\x42\xed\x1d\xa8\xbd\x17\xb5\x0f\xa3\xf6\x49\xd4\x3e\x8f\x7e\x1c\xe8\xc7\x79\xe8\xc7\x25\xe8\xc7\x49\xf4\xe3\x3a\xf4\xe3\x16\xf4\xe3\x2e\xf4\xe3\x7e\xf4\xe3\x51\xf4\xe3\x69\x74\x27\xe8\xce\x2c\x74\x67\x01\xba\xb3\x0c\xdd\x59\x85\xee\x6c\x40\x77\xb6\xa1\x3b\x7b\xd0\x9d\x43\xe8\xce\x09\x74\xe7\x1c\xba\x2b\xd0\x5d\xf9\xe8\xae\x52\x74\x57\x25\xba\xab\x1e\xdd\xd5\x8a\xee\xea\x46\x77\x0d\xa0\xbb\xc6\xd0\x5d\x33\xa8\x23\x0d\x75\x64\xa3\x8e\x42\xd4\x91\x40\x1d\xe3\xe8\xee\x1a\x74\x77\x33\xba\xbb\x13\xdd\xdd\x87\xee\x1e\x41\x77\x4f\xa1\xbb\x17\xd0\x3d\x75\xe8\x9e\x39\xf4\xaf\x19\xe8\x5f\x73\xd1\xbf\x16\xa3\x7f\x4d\xa2\xce\x2c\xd4\x59\x80\x3a\xcb\x50\x67\x15\xea\x6c\x40\x9d\x6d\xa8\xb3\x07\x75\x0e\xa2\xce\x71\xd4\x39\x8b\xee\x4d\x47\xf7\xe6\xa0\x7b\x8b\xd0\xbd\xe5\xe8\xde\x1a\x74\x6f\x13\xba\xaf\x1a\xdd\xd7\x88\xee\xeb\x40\xf7\xf5\xa2\xfb\x86\xd1\xfd\x5d\xe8\xfe\x7e\x74\xff\x28\xba\x7f\x06\x75\xa5\xa1\xae\x6c\xd4\x55\x88\xba\x12\xa8\xab\x1a\x75\x35\xa2\xae\x76\xd4\x95\x42\x0f\x0c\xa0\x07\xc6\xd0\x03\x33\xe8\xc1\x34\xf4\x60\x0e\x7a\xb0\x08\x3d\x58\x8e\x1e\xac\x41\x0f\x36\xa1\x07\x3b\xd1\x83\x7d\xe8\xc1\x11\xf4\xe0\x14\xfa\x7f\x66\x51\xf7\x08\xea\x9e\x42\xdd\x0b\xe8\x7f\x67\xa1\xff\x3d\x8b\x1e\x4a\x47\x0f\xe5\xa0\x87\x8a\xd0\x43\xe5\xe8\xa1\x1a\xf4\x50\x13\x7a\xa8\x03\x3d\xd4\x8b\x1e\x1a\x41\x0f\x4d\xa3\x9f\x80\x7a\x0a\x51\x4f\x02\xf5\x54\xa3\x9e\x46\xd4\xd3\x8e\x7a\x52\xa8\x67\x08\xf5\x4c\xa0\x9e\x39\xf4\xd3\x0c\xf4\xd3\x5c\xf4\xd3\x12\xf4\xd3\x24\xfa\x69\x1d\xfa\x69\x0b\xfa\x69\x17\xfa\x69\x3f\xfa\xe9\x28\xfa\xe9\x34\x7a\xb8\x06\x3d\xdc\x8c\x1e\x4e\xa1\x87\x87\xd0\xc3\x13\xe8\xe1\x39\x94\xca\x46\xa9\x42\x94\x4a\xa0\x54\x35\x4a\x35\xa2\x54\x3b\x4a\xa5\x50\x6a\x08\xa5\x26\xd0\xbf\x05\xfa\xb7\x22\xf4\x6f\xed\xe8\xdf\x52\xe8\xdf\x86\xd0\xbf\x4d\xa0\x47\xaa\xd0\x23\x0d\xe8\x91\x36\xf4\x48\x0f\x7a\x64\x10\x3d\x32\x8e\x1e\x99\x45\xbd\xe9\xa8\x37\x07\xf5\x16\xa1\xde\x72\xd4\x5b\x83\x7a\x9b\x50\x6f\x07\xea\xed\x45\xbd\xc3\xa8\x77\x12\xf5\xce\xa3\x47\x03\x3d\x3a\x82\x1e\x9d\x42\x8f\x2e\xa0\xc7\x32\xd1\x63\xf9\xe8\xb1\x52\xf4\x58\x25\x7a\xac\x1e\x3d\xd6\x86\x1e\xeb\x41\x8f\x0d\xa2\xc7\xc6\xd1\x63\xb3\xe8\xf1\x74\xf4\x78\x0e\x7a\xbc\x08\x3d\x5e\x8e\x1e\xaf\x41\x8f\x37\xa1\xc7\x3b\xd0\xe3\x7d\xe8\xf1\x11\xf4\xf8\x14\x7a\x7c\x01\xf5\x65\xa2\xbe\x02\xd4\x57\x86\xfa\xaa\x50\x5f\x23\xea\x9b\x43\x3f\x2f\x43\x3f\xaf\x42\x3f\x6f\x40\x3f\x6f\x43\x3f\xef\x41\x3f\x1f\x44\x3f\x1f\x47\x3f\x9f\x45\x4f\xa4\xa3\x27\x72\xd0\x13\x45\xe8\x89\x72\xf4\x44\x0d\x7a\xa2\x09\x3d\xd1\x81\x9e\xe8\x45\x4f\x0c\xa3\x27\x26\xd1\x13\xf3\xe8\xc9\x40\x4f\xe6\xa1\x27\x4b\xd0\x93\x49\xf4\x64\x1d\x7a\xb2\x05\x3d\xd9\x85\x9e\xec\x47\x4f\x8e\xa2\x27\xa7\x51\x3f\xa8\x3f\x0b\xf5\x17\xa0\xfe\x32\xd4\x5f\x85\xfa\x1b\x50\x7f\x1b\xea\x4f\xa1\xfe\x21\xd4\x3f\x81\xfa\xe7\xd1\x53\x81\x9e\xca\x43\x4f\x95\xa0\xa7\x92\xe8\xa9\x3a\xf4\x54\x0b\x7a\xaa\x0b\x3d\xd5\x8f\x9e\x1a\x45\x4f\x4d\xa3\xa7\x41\x4f\x67\xa1\xa7\x0b\xd0\xd3\x65\xe8\xe9\x2a\xf4\x74\x03\x7a\xba\x0d\x3d\xdd\x83\x9e\x1e\x44\x4f\x8f\xa3\xa7\x67\xd1\x33\x19\xe8\x99\x5c\xf4\x4c\x31\x7a\xa6\x02\x3d\x53\x87\x9e\x69\x41\xcf\x74\xa1\x67\xfa\xd1\x33\xa3\xe8\x99\x69\x34\x00\x1a\xc8\x42\x03\x05\x68\xa0\x0c\x0d\x54\xa1\x81\x06\x34\xd0\x86\x06\x7a\xd0\xc0\x20\x1a\x18\x47\x03\xb3\xe8\xd9\x74\xf4\x6c\x0e\x7a\xb6\x08\x3d\x5b\x8e\x9e\xad\x41\xcf\x36\xa1\x67\x3b\xd0\xb3\xbd\xe8\xd9\x61\xf4\xec\x24\x7a\xae\x0f\x3d\x37\x82\x9e\x9b\x42\xcf\x2d\xa0\xe7\x33\xd1\xf3\xf9\xe8\xf9\x32\xf4\x7c\x15\x7a\xbe\x01\x0d\x56\xa1\xc1\x2f\x7f\x1b\x1a\xec\x41\x83\x83\x68\x70\x1c\x0d\xce\xa2\x17\xd2\xd1\x0b\x39\xe8\x85\x22\xf4\x42\x39\x7a\xa1\x06\xbd\xd0\x84\x5e\xe8\x44\x2f\xf4\xa1\x17\x46\xd0\x0b\x53\xe8\x85\x05\xf4\x62\x26\x7a\x31\x1f\xbd\x58\x8a\x5e\xac\x44\x2f\xd6\xa3\x17\x5b\xd1\x8b\xdd\xe8\xc5\x01\xf4\xe2\x18\x7a\x71\x06\xfd\x22\x1d\xfd\x22\x07\xfd\xa2\x08\xfd\xa2\x1c\xfd\xa2\x06\xfd\xa2\x09\xfd\xa2\x03\xfd\xa2\x17\xfd\x62\x18\xfd\x62\x0a\x0d\x81\x86\xb2\xd0\x50\x01\x1a\x2a\x43\x43\x55\x68\xa8\x01\x0d\xb5\xa1\xa1\x1e\x34\x34\x88\x86\xc6\xd1\xd0\x2c\xfa\xf7\x74\xf4\xef\x39\xe8\xdf\x8b\xd0\x2f\x03\xfd\x32\x0f\xfd\xb2\x04\xfd\x72\x12\xfd\xdf\x2e\xf4\x7f\xfb\xd1\xff\x1d\x45\xc3\x7d\x68\x78\x04\x0d\x4f\xa1\x97\x7a\xd1\x4b\x23\xe8\xa5\x2f\x7d\x01\xbd\x9c\x89\x5e\xce\x47\x2f\x97\xa2\x97\x2b\xd1\xcb\xf5\xe8\xe5\x56\xf4\x72\x37\x7a\x79\x00\xbd\x3c\x86\x5e\x9e\x41\xaf\xa4\xa1\x57\xb2\xd1\x2b\x45\xe8\x95\x0a\xf4\x4a\x2d\x7a\xa5\x19\xbd\xd2\x89\x5e\xe9\x43\xaf\x8c\xa0\x57\xa6\xd1\x08\x68\x24\x1b\x8d\x14\xa2\x91\x04\x1a\xa9\x46\x23\x8d\x68\xa4\x1d\xfd\xc7\x08\xfa\x8f\x69\xf4\x2a\xe8\xd5\x2c\xf4\x6a\x01\x7a\xb5\x1c\xbd\x5a\x83\x5e\x6d\x47\xaf\x0e\xa0\x5f\xd5\xa2\x5f\x35\xa3\x5f\x75\xa2\x5f\xf5\xa1\x5f\x8d\xa0\x5f\xcd\xa0\xd1\x34\x34\x9a\x8d\x46\x0b\xd1\x68\x02\xbd\x96\x8d\x5e\x2b\x42\xaf\x95\xa3\xd7\x6a\xd0\x6b\x4d\xe8\xb5\x0e\xf4\x5a\x2f\x7a\x6d\x18\xbd\x36\x89\x5e\x1f\x45\xaf\x4f\xa3\x37\x40\x6f\x64\xa1\x37\x0a\xd0\x1b\x65\xe8\x8d\x2a\xf4\x46\x23\x7a\xa3\x1b\xbd\x31\x80\xde\x18\x43\x6f\xcc\xa0\xb1\x34\x34\x96\x83\xc6\x8a\xd0\x58\x39\x1a\xab\x41\x63\xcd\x68\xac\x13\x8d\xf5\xa1\xb1\x11\x34\x36\x85\xfe\x13\xf4\x9f\x59\xe8\x3f\x0b\xd0\xaf\x8b\xd0\xaf\xcb\xd1\xaf\x6b\xd0\x9b\x6d\xe8\xcd\x14\x7a\x73\x08\xbd\x39\x85\x7e\x93\x8d\x7e\x53\x88\x7e\x93\x40\xbf\xa9\x46\xbf\x69\x42\xbf\xe9\x40\xbf\x9d\x41\x6f\xa5\xa3\xb7\x72\xd0\x5b\x45\xe8\xad\x72\xf4\x56\x0d\x7a\xab\x09\xbd\xd5\x81\xde\xea\x45\x6f\x0d\xa3\xb7\x26\xd1\x5b\xf3\x68\x22\xd0\x44\x3e\x9a\x28\x45\x13\x95\xe8\x77\x43\xe8\x77\x13\xe8\x77\x73\xe8\xbf\x32\xd0\x7f\xe5\xa2\xff\x2a\x45\xbf\x6f\x41\xbf\xef\x46\xbf\x1f\x40\xbf\x1f\x43\xbf\x9f\x41\x93\xe9\x68\x32\x07\x4d\x16\xa1\xc9\x72\x34\xd9\x88\x26\xdb\xd1\x64\x0a\x4d\x0e\xa1\xc9\x09\x34\x39\x87\xde\x0e\xf4\x76\x1e\x7a\xbb\x04\xbd\x9d\x44\x6f\x37\xa3\xb7\xbb\xd0\x3b\x15\xe8\x9d\x5a\xf4\x4e\x3b\x7a\x27\x85\xfe\x38\x80\xde\xad\x40\xef\xce\xa0\xf7\xd2\xd0\x7b\xd9\xe8\xbd\x42\xf4\x5e\x02\xbd\x57\x8d\xde\x6b\x44\xef\xb5\xa3\xf7\x52\xe8\xbd\x21\xf4\xde\x04\x7a\x6f\x0e\x4d\x57\xa1\xe9\x26\x34\xdd\x81\xa6\x7b\xd1\xfb\x85\xe8\xfd\x14\x7a\x7f\x08\xbd\x3f\x89\xde\x9f\x47\x1f\x64\xa1\x0f\x0a\xd0\x07\xc3\xe8\x83\x49\xf4\xc1\x3c\xfa\x30\xd0\x87\x79\xe8\xc3\x12\xf4\x61\x12\x7d\x58\x87\x3e\x6c\x41\x1f\x76\xa1\x0f\xfb\xd1\x87\x63\xe8\xc3\x19\x34\x93\x86\x66\x72\xd0\x4c\x11\x9a\x29\x47\x33\x35\x68\xa6\x09\xcd\x74\xa0\x99\x5e\x34\x33\x8c\x66\xa6\xd0\xcc\x02\xfa\x28\x13\x7d\x94\x8f\x3e\x2a\x43\x1f\x55\xa1\x8f\x1a\xd0\x47\x6d\xe8\xa3\x1e\xf4\xd1\x20\xfa\x68\x02\x7d\x34\x87\x3e\xce\x40\x1f\xe7\xa3\x8f\x4b\xd1\xc7\x95\xe8\xe3\x7a\xf4\x71\x2b\xfa\xb8\x07\x7d\x3c\x88\x3e\x1e\x47\x1f\xcf\xa2\x4f\xd2\xd1\x27\xb9\xe8\x93\x62\xf4\x49\x05\xfa\xa4\x16\x7d\xd2\x8c\x3e\xe9\x44\x9f\xf4\xa1\x4f\x46\xd0\x27\x53\xe8\x93\x05\x34\x9b\x89\x66\x0b\xd0\x6c\x19\x9a\xad\x46\xb3\x8d\x68\xb6\x1d\xcd\xa6\xd0\xec\x30\x9a\x9d\x44\x9f\xa6\xa1\x4f\x73\xd0\xa7\x45\xe8\xd3\x72\xf4\x69\x2d\xfa\xb4\x19\x7d\xda\x89\x3e\x1d\x40\x9f\x8e\xa1\x4f\x67\xd0\x67\x69\xe8\xb3\x6c\xf4\x59\x21\xfa\x2c\x81\x3e\xab\x46\x9f\x35\xa2\xcf\x3a\xd0\x67\xbd\xe8\xb3\x61\xf4\xd9\x24\xfa\x6c\x1e\xfd\x29\xd0\x9f\xf2\xd0\x5c\x37\x9a\x1b\x40\x73\x13\x68\x6e\x0e\xfd\x39\x03\xfd\x39\x17\xfd\xb9\x18\xfd\xb9\x02\xfd\xb9\x16\xfd\xb9\x19\xfd\xb9\x0b\x7d\x5e\x86\x3e\xaf\x42\x9f\x37\xa0\xcf\xdb\xd0\xe7\x3d\xe8\xf3\x41\xf4\xf9\x38\xfa\x7c\x16\xfd\x25\x1d\xfd\x25\x07\xfd\xa5\x08\xfd\xa5\x02\xfd\xa5\x16\xfd\xa5\x19\xfd\xa5\x13\xfd\xa5\x1f\xfd\x65\x1c\xfd\x65\x16\xcd\xa7\xa3\xf9\x1c\x34\x5f\x84\xe6\x2b\xd0\x7c\x2d\x9a\x6f\x41\xf3\x5d\x68\x7e\x00\xcd\x8f\xa1\xbf\x96\xa1\xbf\x56\xa1\xbf\x36\xa2\xbf\xb6\xa3\xbf\xa6\xd0\x5f\x87\xd0\x5f\x27\xd0\xdf\xca\xd1\xdf\x6a\xd0\x7f\x37\xa2\xff\xee\x40\x0b\x53\x68\x61\x01\xfd\xbd\x15\xfd\xbd\x1b\xfd\x7d\x00\xfd\x7d\x0c\xfd\x7d\x06\xfd\x23\x0d\xfd\x23\x1b\xfd\xa3\x10\xfd\x23\x81\xfe\x51\x8b\xfe\xd1\x8c\xfe\xd1\x89\xfe\xd1\x87\xfe\x31\x82\xbe\xa8\x44\x5f\xd4\xa3\x2f\x5a\xd1\x17\xdd\xe8\x8b\x01\xf4\xc5\x18\xfa\x62\x06\x93\x86\xc9\xc6\x14\x62\x12\x98\x6a\x4c\x23\xa6\x1d\x93\xc2\x0c\x61\x26\x30\x73\xf8\xa0\x0c\x7c\x50\x1e\x3e\xa8\x04\x1f\x94\xc4\x07\xd5\xe1\x83\x5a\xf0\x41\x5d\xf8\xa0\x7e\x7c\xd0\x28\x3e\x68\x1a\x7f\x05\xfc\x95\x2c\xfc\x95\x02\xfc\x95\x32\xfc\x95\x2a\xfc\x95\x06\xfc\x95\x36\xfc\x95\x1e\xfc\x95\x51\xfc\x95\x69\x7c\x30\xf8\xe0\x2c\x7c\x70\x01\x3e\xb8\x0c\x1f\x5c\x85\x0f\x6e\xc0\x07\xb7\xe1\xb4\x3e\x9c\x36\x82\xd3\xa6\x70\xda\x02\xfe\x6a\x26\xfe\x6a\x3e\xfe\x6a\x19\xfe\x6a\x15\xfe\x6a\x03\xfe\x6a\x3b\xfe\x6a\x0a\x7f\x75\x08\x7f\x75\x12\x7f\x75\x1e\xff\x53\xe0\x7f\xca\xc3\xff\x54\x82\xbf\xd6\x84\xbf\xd6\x81\xbf\xd6\x8b\xbf\x36\x8c\xbf\x36\x89\xbf\x36\x8f\xd3\x03\xa7\xe7\xe1\xf4\x12\x9c\x5e\x89\xd3\xeb\x71\x7a\x2b\x4e\xef\xc6\xe9\x03\x38\x7d\x0c\xa7\xcf\xe0\x43\xd2\xf0\x21\xd9\xf8\x90\x42\x7c\x48\x02\x1f\x52\x8d\x0f\x69\xc4\x87\xb4\xe3\x43\xfa\xf0\x21\x23\xf8\x90\x29\x7c\xc8\x02\x3e\x34\x13\x1f\x9a\x8f\x0f\x2d\xc5\x87\x56\xe2\x43\xeb\xf1\xa1\xad\xf8\xd0\x6e\x7c\xe8\x00\x3e\x74\x0c\x1f\x3a\x83\xbf\x9e\x86\xbf\x9e\x8d\xbf\x5e\x88\xbf\x9e\xc0\x19\x0d\x38\xa3\x0d\x67\xf4\xe0\x8c\x41\x9c\x31\x8e\x33\xe6\xf1\x61\x81\x0f\xcb\xc3\x87\x95\xe0\xc3\x92\xf8\xb0\x46\x7c\x58\x3b\x3e\x2c\x85\x95\x8f\x55\x8a\x55\x89\x55\x8f\xd5\x8a\xd5\x8d\x35\x80\x35\x86\x35\x83\x9d\x86\x9d\x8d\x5d\x88\x9d\xc0\xae\xc6\x6e\xc4\x6e\xc7\x4e\x61\x0f\x61\x4f\x60\xcf\xe1\xc8\xc0\x91\x8b\xa3\x18\x47\x05\x8e\x3a\x1c\xad\x38\xba\x71\x0c\xe0\x18\xc3\xff\x63\x1a\x1f\x0e\x3e\x3c\x0b\x1f\x5e\x88\x0f\x4f\xe0\xc3\xab\xf1\xe1\x8d\xf8\xf0\x76\x7c\x78\x0a\x1f\x3e\x84\x0f\x9f\xc0\x87\xcf\xe1\x23\x32\xf0\x11\xb9\xf8\x88\x62\x7c\x44\x05\x3e\xa2\x16\x1f\xd1\x82\x8f\xe8\xc2\x47\xf4\xe3\x23\x46\xf1\x11\xd3\x38\x73\x00\x67\x8e\xe1\xcc\x19\xfc\x8d\x74\xfc\x8d\x1c\xfc\x8d\x22\xfc\x8d\x72\xfc\x8d\x1a\xfc\x8d\x66\xfc\x8d\x4e\xfc\x8d\x3e\xfc\x8d\x11\x9c\x95\x8d\xb3\x8a\x70\x56\x39\xfe\xe7\x3e\xfc\xcf\x23\xf8\x9f\xa7\xf1\x91\xe0\x23\xb3\xf0\x91\x05\xf8\xc8\x32\x7c\x64\x15\x3e\xb2\x01\x1f\xd9\x86\x8f\xec\xc1\x47\x0e\xe2\x23\xc7\xf1\x91\xb3\x38\x3b\x89\xb3\xeb\x70\x76\x0b\xce\xee\xc6\xd9\x03\xf8\x98\x26\x7c\x4c\x07\x3e\xa6\x17\xe7\x4c\xe3\x63\x9b\xf1\xa2\x0e\xbc\xa8\x17\x2f\x1a\xc6\x8b\x26\xf1\xa2\x79\x7c\x5c\xe0\xe3\xf2\xf0\x71\x65\xf8\xb8\x6a\x7c\x5c\x23\x3e\xae\x1d\x1f\x97\xc2\xb9\xbd\x38\x77\x18\xe7\xce\xe3\xe3\x93\xf8\x84\x2c\x7c\x42\x1e\x3e\xa1\x04\x9f\xf0\x65\xae\xc3\x27\xb4\xe0\x13\xba\xf0\x09\xfd\xf8\x84\x51\x7c\xc2\x34\xfe\x36\xf8\xdb\x59\xf8\xdb\x05\x38\xaf\x04\xe7\x55\xe2\xbc\x7a\x9c\xd7\x8a\xf3\xba\x71\xde\x00\xce\x1b\xc3\x79\x33\xf8\xc4\x34\x7c\x62\x36\x3e\xb1\x10\x9f\x98\xc0\x27\x56\xe3\x13\x1b\xf1\x89\xed\xf8\xc4\x14\x3e\x71\x08\x9f\x38\x81\x4f\x9c\xc3\x27\x65\xe2\x93\xf2\xf1\x49\x09\x7c\x52\x35\x3e\xa9\x11\x9f\xd4\x8e\x4f\x4a\xe1\x93\x86\xf1\x49\x93\xf8\xa4\x79\x7c\x72\xe0\xfc\x3c\x9c\x5f\x82\xf3\x93\x38\xbf\x1e\xe7\xb7\xe2\xfc\x6e\x9c\x3f\x80\xf3\xc7\x70\xfe\x0c\x5e\x9c\x86\x17\x67\xe3\xc5\x85\x78\x71\x02\x2f\xae\xc6\x8b\x1b\xf1\xe2\x76\xbc\x38\x85\x17\x0f\xe1\xc5\x13\x78\xf1\x1c\x3e\x25\x03\x9f\x92\x8b\x4f\x29\xc6\xa7\x54\xe0\x53\x6a\xf1\x29\xcd\xf8\x94\x4e\x7c\x4a\x1f\x3e\x65\x14\x9f\x32\x8d\x97\x80\x97\x64\xe3\x25\x85\x78\x49\x02\x2f\xa9\xc1\x4b\x9a\xf0\x92\x0e\xbc\xa4\x17\x2f\x19\xc1\x4b\xa6\x71\x01\xb8\x20\x0b\x17\x14\xe0\x82\x32\x5c\x50\x85\x0b\x1a\x71\x41\x07\x2e\xe8\xc3\x05\x23\xb8\x60\x0a\x17\x2c\xe0\xa5\x99\x78\x69\x3e\x5e\x5a\x8a\x97\x56\xe2\xa5\xf5\x78\x69\x2b\x5e\xda\x8d\x97\x0e\xe1\xa5\x13\x78\xe9\x1c\x3e\x35\x03\x9f\x9a\x8b\x4f\x2d\xc6\xa7\x26\xf1\xa9\x75\xf8\xd4\x16\x7c\x6a\x17\x3e\xb5\x1f\x17\x26\x71\x61\x1d\x2e\x6c\xc1\x85\x5d\xb8\xf0\xcb\x6e\x0c\x17\xce\xe0\xd3\xd3\xf0\xe9\xd9\xf8\xf4\x42\x7c\x7a\x02\x9f\x5e\x8d\x4f\x6f\xc4\xcb\xc0\xcb\xb2\xf0\xb2\x02\xbc\xac\x0c\x2f\xab\xc2\xcb\x1a\xf0\xb2\x36\xbc\x6c\x16\x17\xa5\xe3\xa2\x1c\x5c\x54\x84\x8b\xca\x71\x51\x0d\x2e\x6a\xc2\x45\x1d\xb8\xa8\x17\x17\x0d\xe3\xa2\x49\x5c\x34\x8f\x97\x07\x5e\x9e\x87\x97\x97\xe0\xe5\x49\xbc\xbc\x0e\x2f\x6f\xc1\xcb\xbb\xf0\xf2\x7e\xbc\x7c\x14\x2f\x9f\xc1\x2b\xd2\xf0\x8a\x6c\xbc\xa2\x10\xaf\x48\xe0\x15\xd5\x78\x45\x23\x5e\xd1\x8e\x57\xa4\xf0\x8a\x21\xbc\x62\x02\xaf\x98\xc3\x67\x64\xe0\x33\x72\xf1\x19\xc5\xf8\x8c\x0a\x7c\x46\x2d\x3e\xa3\x19\x9f\xd1\x89\xcf\xe8\xc3\x67\x8c\xe0\x33\xa6\xf0\x19\x0b\xb8\x38\x13\x17\xe7\xe3\xe2\x52\x5c\x5c\x89\x8b\x1b\x70\x71\x1b\x2e\xee\xc1\x67\x16\xe1\x33\xcb\xf1\x99\x35\x78\x65\x3a\x5e\x99\x83\x57\x16\xe3\x95\x15\x78\x65\x2d\x5e\xd9\x8c\x57\x76\xe2\x95\x7d\x78\xe5\x08\x5e\x39\x85\x57\x2e\xe0\x55\x99\x78\x55\x3e\x5e\x55\x8a\x57\x55\xe2\x55\xf5\x78\x55\x2b\x5e\xd5\x8d\x57\x0d\xe2\x92\x0e\x5c\xd2\x8b\x4b\x86\x71\xc9\x24\x2e\x99\xc7\x67\x05\x3e\x2b\x0f\x9f\x55\x82\xcf\x4a\xe2\xb3\xea\xf0\x59\x2d\xf8\xac\x2e\x7c\x56\x3f\x3e\x6b\x14\x9f\x35\x8d\x57\x83\x57\x67\xe1\xd5\x05\x78\x75\x39\x5e\x5d\x83\x57\x37\xe1\xd5\x1d\x78\x75\x2f\x5e\x3d\x8c\x57\x4f\xe2\xd5\xf3\x78\x4d\xe0\x35\x79\x78\x4d\x09\x5e\x93\xc4\x6b\xea\xf0\x9a\x16\xbc\xa6\x0b\xaf\xe9\xc7\x6b\x46\xf1\x9a\x69\x5c\x0a\x2e\xcd\xc2\xa5\x05\xb8\xb4\x0c\x97\x56\xe1\xd2\x06\x5c\xda\x86\x4b\x7b\x70\xe9\x20\x2e\x9d\xc0\xa5\x73\xf8\xec\x0c\x7c\x76\x2e\x3e\xbb\x18\x9f\x9d\xc4\x67\xd7\xe1\xb3\x5b\xf0\xd9\x5d\xf8\xec\x7e\x7c\xf6\x28\x3e\x7b\x1a\xaf\x05\xaf\xcd\xc6\x6b\x0b\xf1\xda\x04\x5e\x5b\x8d\xd7\x36\xe2\xb5\xed\x78\x6d\x0a\xaf\x1d\xc2\x6b\x27\xf0\xda\x39\xbc\x2e\x03\xaf\xcb\xc5\xeb\x8a\xf1\xba\x0a\xbc\xae\x16\x97\x75\xe3\xb2\x01\x5c\x36\x86\xcb\x66\xf0\xfa\x34\xbc\x3e\x1b\xaf\x2f\xc4\xeb\x13\x78\x7d\x35\x5e\xdf\x88\xd7\xb7\xe3\xf5\x29\xbc\x7e\x08\xaf\x9f\xc0\xeb\xe7\xf0\x86\x0c\xbc\x21\x17\x6f\x28\xc6\x1b\x2a\xf0\x86\x5a\xbc\xa1\x19\x6f\xe8\xc4\x1b\xfa\xf0\x86\x11\xbc\x61\x0a\x6f\x58\xc0\x1b\x33\xf1\xc6\x7c\xbc\xb1\x14\x6f\xac\xc4\x1b\xeb\xf1\xc6\x56\xbc\xb1\x1b\x6f\x1c\xc4\x1b\xc7\xf1\xc6\x39\x9c\xc8\xc0\x89\x5c\x9c\x28\xc6\x89\x0a\x9c\xa8\xc5\x89\x66\x9c\xe8\xc4\x89\x3e\x9c\x18\xc5\x89\x69\xbc\x09\xbc\x29\x0b\x6f\x2a\xc4\x9b\x2a\xf0\xa6\x5a\xbc\xa9\x19\x6f\xea\xc4\x9b\xfa\xf0\xa6\x11\xbc\x69\x0a\x6f\x5a\xc0\x9b\x33\xf1\xe6\x7c\xbc\xb9\x14\x6f\xae\xc4\x9b\xeb\xf1\xe6\x56\xbc\xb9\x1b\x6f\x1e\xc0\x9b\xc7\xf0\xe6\x19\xbc\x25\x0d\x6f\xc9\xc6\x5b\x0a\xf1\x96\x0a\xbc\xa5\x0e\x6f\x69\xc1\x5b\xba\xf0\x96\x7e\xbc\x65\x14\x6f\x99\xc6\xe5\xe0\xf2\x2c\x5c\x5e\x80\xcb\xcb\x70\x79\x15\x2e\x6f\xc2\xe5\x1d\xb8\xbc\x17\x97\x0f\xe3\xf2\x49\x5c\x3e\x8f\xb7\x06\xde\x9a\x87\xb7\x96\xe0\xad\x95\x78\x6b\x03\xde\xda\x86\xb7\xf6\xe0\xad\x83\x78\xeb\x38\xde\x3a\x8b\xcf\x49\xc7\xe7\xe4\xe2\x73\x8a\xf1\x39\x15\xf8\x9c\x5a\x7c\x4e\x0b\x3e\x67\x14\x9f\x33\x8d\xb7\x81\xb7\x65\xe1\x6d\x85\x78\x5b\x02\x6f\xab\xc6\xdb\x1a\xf1\xb6\x76\xbc\x2d\x85\xb7\x0d\xe3\x6d\x93\x78\xdb\x3c\xae\x08\x5c\x91\x87\x2b\x5a\x71\x45\x37\xae\x18\xc0\x15\x63\xb8\x62\x06\x6f\x4f\xc3\xdb\xb3\xf1\xf6\x42\xbc\x3d\x81\xb7\x57\xe3\xed\x8d\x78\x7b\x3b\xde\xde\x8b\xb7\x0f\xe3\xed\x93\x78\xfb\x3c\xde\x11\x78\x47\x1e\xde\x51\x82\x77\x24\xf1\x8e\x3a\xbc\xa3\x05\xef\xe8\xc2\x3b\xfa\xf1\x8e\x51\xbc\x63\x1a\xef\x04\xef\xcc\xc2\x3b\x0b\xf0\xce\x4a\xbc\xb3\x1e\xef\x6c\xc5\x3b\xbb\xf1\xce\x01\xbc\x73\x0c\xef\x9c\xc1\xc9\x34\x9c\xcc\xc6\xc9\x42\x9c\x4c\xe0\x64\x35\x4e\x36\xe1\x64\x07\x4e\xf6\xe2\xe4\x30\x4e\x4e\xe2\xe4\x3c\xde\x95\x89\x77\x15\xe0\x5d\x65\x78\x57\x15\xde\xd5\x80\x77\xb5\xe1\x5d\x3d\x78\xd7\x20\xde\x35\x8e\x77\xcd\xe2\xdd\xe9\x78\x77\x1e\xde\x5d\x82\x77\x4f\xe2\xdd\xf3\x78\x4f\x26\xde\x93\x8f\xf7\x94\xe2\x3d\x95\x78\x4f\x03\xde\xd3\x86\xf7\xf4\xe0\x3d\x83\x78\xcf\x38\xde\x33\x8b\x2b\xd3\x71\x65\x0e\xae\x2c\xc2\x95\xe5\xb8\xb2\x06\x57\x36\xe1\xca\x0e\x5c\xd9\x8b\x2b\x87\x71\xe5\x24\xae\x9c\xc7\x7b\x03\xef\xcd\xc3\x7b\x4b\xf0\xde\x24\xde\x5b\x87\xf7\xb6\xe2\xbd\xdd\x78\xef\x00\xde\x3b\x86\xf7\xce\xe0\x7d\x69\x78\x5f\x36\xde\x57\x88\xf7\x25\xf0\xbe\x6a\xbc\xaf\x11\xef\x6b\xc7\xfb\x52\x78\xdf\x10\xde\x37\x81\xf7\xcd\xe1\xfd\x19\x78\x7f\x2e\xde\x5f\x8c\xf7\x27\xf1\xfe\x19\x5c\xd5\x81\xab\x7a\xf1\x77\x86\xf1\x77\xa6\xf0\xb9\x69\xf8\xdc\x6c\x7c\xee\x97\xbe\x80\x0f\x64\xe2\x03\xf9\xf8\x40\x29\x3e\x50\x89\x0f\xd4\xe3\x03\xad\xf8\x40\x37\x3e\x30\x88\xab\xa7\x70\xf5\x02\x3e\x2f\x13\x9f\x97\x8f\xcf\x2b\xc5\xe7\x55\xe2\xf3\xea\xf1\x79\xad\xf8\xbc\x6e\x7c\xde\x00\x3e\x6f\x0c\x9f\x37\x83\xcf\x4f\xc3\xe7\x67\xe3\xf3\x0b\xf1\xf9\xe5\xf8\xfc\x5a\x7c\x7e\x33\x3e\xbf\x13\x9f\xdf\x87\xcf\x1f\xc1\xe7\x4f\xe1\x0b\xd2\xf0\x05\x39\xf8\x82\x22\x5c\x53\x83\x6b\x9a\x70\x4d\x07\xae\xe9\xc5\x35\xc3\xb8\x66\x1a\x7f\x17\x7c\x61\x0f\xbe\x70\x10\x5f\x38\x8e\x2f\x9c\xc5\x17\xa5\xe3\x8b\x72\xf0\x45\x45\xf8\xa2\x0a\x7c\x51\x2d\xbe\xa8\x19\x5f\xd4\x89\x2f\x1a\xc4\x17\x8d\xe3\x8b\x66\x71\x6d\x3a\xae\xcd\xc1\xb5\x45\xb8\xb6\x1c\xff\xff\x32\xf1\xf7\x3b\x70\xdd\x3c\xbe\x38\xf0\xc5\x79\xf8\xe2\x12\x7c\x71\x2d\xbe\xb8\x19\x5f\xdc\x89\x2f\xee\xc3\x97\x54\xe0\x4b\xea\xf0\x25\x2d\xf8\x92\x2e\x7c\x49\x3f\xbe\x64\x14\x5f\x32\x8d\xeb\x4b\xf1\xff\xea\xc0\xff\xab\x17\xff\xaf\x61\x7c\xe9\x0c\xbe\x6c\x12\x5f\xde\x8c\x2f\xef\xc4\x97\xf7\xe1\xcb\x47\x70\x63\x26\x6e\xcc\xc7\x8d\xa5\xb8\xb1\x1a\x37\x36\xe2\xc6\x76\x7c\x45\x33\xbe\xa2\x0b\x5f\xd1\x8f\xaf\x18\xc5\x57\xcc\xe0\x2b\xd3\xf0\x95\xd9\xf8\xca\x42\x7c\x65\x02\x5f\x59\x8d\xaf\x6c\xc4\x57\x76\xe0\x2b\x7b\xf1\x95\xc3\xf8\xca\x49\x7c\xe5\x3c\xbe\x2a\xf0\x55\x79\xf8\xaa\x12\x7c\x55\x12\x5f\x55\x8f\xaf\x6a\xc5\x57\x75\xe3\xab\x06\xf1\x55\xe3\xf8\xaa\x59\xdc\x94\x8e\x9b\xf2\x71\x53\x29\x6e\xaa\xc4\x3f\x2a\xc2\x3f\x2a\xc7\x3f\xaa\xc1\x3f\x6a\xc1\x57\xb7\xe3\xab\x53\xf8\xea\x21\x7c\xf5\x04\xbe\x7a\x0e\x5f\x93\x81\xaf\xc9\xc3\xd7\x94\xe0\x6b\x92\xf8\x9a\x3a\x7c\x4d\x0b\xbe\xa6\x0b\x5f\xd3\x8f\xaf\x19\xc3\xd7\xcc\xe0\xe6\x34\xdc\x9c\x8d\x9b\x0b\x71\x73\x02\x37\x57\xe3\xe6\x46\xdc\xdc\x89\x9b\xfb\x70\xf3\x08\x6e\x9e\xc2\xcd\x0b\xf8\xda\x2c\x7c\x6d\x01\xbe\xb6\x0c\x5f\x5b\x85\xaf\x6d\xc0\xd7\xb6\xe1\x6b\x7b\xf0\xb5\xc3\xf8\xda\x49\x7c\xed\x3c\xbe\x2e\xf0\x75\x79\xf8\xba\x12\x7c\x5d\x12\x5f\x57\x87\xaf\x6b\xc1\xd7\x75\xe1\xeb\xfa\xf1\x75\xa3\xf8\xba\x69\x7c\x3d\xf8\xfa\x6c\x7c\x7d\x21\xbe\x3e\x81\xaf\xaf\xc6\xd7\x37\xe2\xeb\x3b\xf0\xf5\xbd\xf8\xfa\x11\x7c\xfd\x14\xbe\x7e\x01\xb7\x64\xe2\x96\x02\xdc\x52\x86\x5b\xaa\x70\x4b\x03\x6e\x69\xc3\x2d\x3d\xb8\x65\x10\xb7\x8c\xe3\x96\x59\x7c\x43\x3a\xbe\x21\x07\xdf\x58\x8e\x6f\xac\xc5\x37\x36\xe3\x1b\x3b\xf1\x8d\x7d\xf8\xc6\x11\x7c\xe3\x14\xbe\x71\x01\xdf\x94\x89\x6f\xca\xc7\x37\x95\xe2\x9b\x2a\xf1\x4d\xf5\xf8\xa6\x56\x7c\x53\x37\xbe\x69\x10\xdf\x34\x8e\x6f\x9a\xc3\xad\x19\xb8\x35\x17\xb7\x16\xe3\xd6\x0a\xdc\x5a\x8b\x6f\x1e\xc0\x37\x8f\xe1\x9b\x67\xf0\x2d\x69\xf8\x96\x6c\x7c\x4b\x21\xbe\x25\x81\x6f\xa9\xc6\xb7\x34\xe2\x5b\xda\xf1\x2d\x29\x7c\xcb\x10\xbe\x65\x02\xdf\x32\x87\x6f\xcd\xc0\xb7\xe6\xe2\x5b\x8b\xf1\xad\x49\x7c\x6b\x3d\xbe\xb5\x0d\xdf\xda\x83\x6f\x1d\xc2\xb7\x4e\xe0\x5b\xe7\x70\x5b\x06\x6e\xcb\xc5\x6d\xc5\xb8\xad\x02\xb7\xd5\xe2\xdb\x46\xf1\x6d\xd3\xf8\x76\xf0\xed\x59\xf8\xf6\x02\x7c\x7b\x19\xbe\xbd\x0a\xdf\xde\x80\x6f\x6f\xc3\xb7\xf7\xe0\xdb\x07\xf1\xed\xe3\xf8\xf6\x59\x7c\x47\x3a\xbe\x23\x07\xdf\x51\x84\xef\x28\xc7\x77\xd4\xe0\x3b\x9a\xf0\x1d\x1d\xf8\x8e\x5e\x7c\xc7\x30\xbe\x63\x0a\xb7\xa7\xe1\xf6\x3c\xdc\x5e\x82\xdb\x93\xb8\xbd\x0e\xff\x78\x1e\xdf\x19\xf8\xce\x3c\x7c\x67\x09\xbe\x33\x89\xef\xac\xc7\x77\xb6\xe2\x3b\x7b\xf0\x9d\x63\xf8\xce\x19\x7c\x57\x1a\xbe\x2b\x07\xdf\x55\x82\xef\x4a\xe2\xbb\xea\xf0\x5d\xad\xf8\xae\x6e\x7c\xd7\x00\xbe\x6b\x0c\xdf\x35\x83\x3b\xd2\x70\x47\x36\xee\x28\xc4\x1d\x09\xdc\x51\x8d\x3b\x1a\x71\x47\x07\xee\xe8\xc5\x1d\xc3\xb8\x63\x12\x77\xcc\xe3\xbb\x03\xdf\x9d\x87\xef\x2e\xc1\x77\x27\xf1\xdd\x75\xf8\xee\x56\x7c\x77\x0f\xbe\x7b\x10\xdf\x3d\x89\xef\x9e\xc7\xf7\x04\xbe\x27\x0f\xdf\x53\x82\xef\x49\xe2\x7b\xea\xf0\x3d\x2d\xf8\x9e\x2e\x7c\xcf\x00\xbe\x67\x1c\xdf\x33\x8b\x3b\x3b\x71\xe7\x10\xee\x9c\xc0\x9d\x73\xf8\xde\x0c\x7c\x6f\x2e\xbe\xb7\x18\xdf\x5b\x81\xef\xad\xc5\xf7\x36\xe3\x7b\xbb\xf0\xbd\xfd\xf8\xde\x51\x7c\xef\x34\xbe\x2f\x0d\xdf\x97\x8d\xef\x2b\xc4\xf7\x95\xe3\xfb\x6a\xf0\x7d\x4d\xf8\xbe\x0e\x7c\x5f\x2f\xbe\x6f\x18\xdf\x37\x89\xef\x9b\xc7\xf7\x07\xbe\x3f\x0f\xdf\x5f\x8a\xef\xaf\xc2\xf7\x37\xe0\xfb\xdb\xf0\xfd\x29\x7c\xff\x10\xbe\x7f\x02\xdf\x3f\x87\xbb\x32\x70\x57\x2e\xee\x2a\xc6\x5d\x15\xb8\xab\x16\x77\x35\xe3\xae\x4e\xdc\xd5\x87\xbb\x46\x70\xd7\x14\xee\x5a\xc0\x0f\x64\xe2\x07\xf2\xf1\x03\xa5\xf8\x81\x4a\xfc\x40\x3d\x7e\xa0\x15\x3f\xd0\x8d\x1f\x18\xc0\x0f\x4c\xe1\x07\x16\xf0\x83\x99\xf8\xc1\x7c\xfc\x60\x29\xee\xce\xc5\xdd\xc5\xb8\xbb\x02\x77\xd7\xe2\xee\x66\xdc\xdd\x89\xbb\xfb\x70\xf7\x08\xee\x9e\xc2\x0f\x55\xe1\x87\x1a\xf0\x43\xed\xf8\xa1\x14\x7e\x68\x08\x3f\x34\x89\x1f\x5a\xc0\x3f\xc9\xc4\x3f\xc9\xc7\x3f\x29\xc5\x3f\xa9\xc4\x3f\x69\xc0\x3f\x69\xc3\x3f\xe9\xc1\x3f\x19\xc4\x3f\x19\xc7\x3f\x99\xc5\xff\xa7\x1c\xff\x9f\x69\xfc\x30\xf8\xe1\x2c\xfc\x70\x01\x7e\xb8\x0c\x3f\x5c\x85\x1f\x6e\xc0\x0f\xb7\xe1\x87\x53\xf8\xe1\x21\xfc\xf0\x04\x7e\x78\x0e\xa7\x32\x70\x2a\x1f\xa7\x4a\x71\xaa\x0a\xa7\x1a\x70\xaa\x0d\xa7\x7a\x70\x6a\x10\xa7\xc6\x71\x6a\x16\xff\x2c\x1d\xff\x2c\x07\xff\xac\x08\xff\xac\x1c\xff\xac\x06\xff\xac\x19\xff\xac\x13\xff\xac\x0f\xff\x6c\x04\xff\x6c\x0a\xff\x6c\x01\x3f\x92\x85\x1f\x29\xc0\x8f\x94\xe1\x47\xaa\xf0\x23\x0d\xf8\x91\x76\xfc\x48\x0a\x3f\x32\x84\x1f\x99\xc4\x8f\xcc\xe3\xde\xc0\xbd\x79\xb8\xb7\x04\xf7\x56\xe1\xde\x06\xdc\xdb\x86\x7b\x7b\x70\xef\x20\xee\x1d\xc7\xbd\xb3\xf8\xd1\x74\xfc\x68\x0e\x7e\xb4\x08\x3f\x5a\x8e\x1f\xad\xc1\x8f\x36\xe1\x47\x3b\xf0\xa3\xbd\xf8\xd1\x61\xfc\xe8\x24\x7e\x74\x1e\x3f\x16\xf8\xb1\x3c\xfc\x58\x09\x7e\xac\x12\x3f\xd6\x80\x1f\x6b\xc3\x8f\xf5\xe0\xc7\x06\xf1\x63\xe3\xf8\xb1\x39\xfc\x78\x06\x7e\x3c\x17\x3f\x5e\x8a\x1f\xaf\xc2\x8f\x37\xe0\xc7\xdb\xf0\xe3\x3d\xf8\xf1\x21\xfc\xf8\x04\x7e\x7c\x0e\xf7\x65\xe0\xbe\x5c\xdc\x57\x8c\xfb\x2a\x70\x5f\x2d\xee\x6b\xc6\x7d\x9d\xb8\xaf\x0f\xf7\x8d\xe0\xbe\x29\xfc\x44\x12\x3f\x51\x87\x9f\x68\xc1\x4f\x74\xe1\x27\xfa\xf1\x13\xa3\xf8\x89\x69\xfc\x64\x3a\x7e\x32\x07\x3f\x59\x84\xfb\xbb\xf0\x53\x75\xf8\xa9\x16\xfc\xd4\x97\xde\x8f\x9f\x1a\xc5\x4f\x4d\xe3\xa7\xc1\x4f\x67\xe1\xa7\x0b\xf0\xd3\x65\xf8\xe9\x6a\xfc\x74\x23\x7e\xba\x1d\x3f\x9d\xc2\x4f\x0f\xe1\xa7\x27\xf0\xd3\x73\xf8\x99\x0c\xfc\x4c\x2e\x1e\x28\xc4\x03\x09\x3c\x50\x8d\x07\x1a\xf1\x40\x3b\x1e\x48\xe1\x81\x21\x3c\x30\x81\x07\xe6\xf0\xb3\x19\xf8\xd9\x3c\xfc\x6c\x09\x7e\x36\x89\x9f\xad\xc3\xcf\xb6\xe0\x67\xbb\xf0\xb3\x03\xf8\xd9\x31\xfc\xec\x2c\x7e\x2e\x03\x3f\x97\x87\x9f\x2b\xc5\xcf\x55\xe2\xe7\x1a\xf1\x73\xed\xf8\xb9\x14\x7e\x6e\x08\x3f\x37\x89\x9f\x9b\xc7\xcf\x07\x7e\x3e\x1f\x3f\x5f\x8a\x9f\xaf\xc4\xcf\xd7\xe3\xe7\x5b\xf1\xf3\xdd\xf8\xf9\x01\xfc\xfc\x18\x7e\x7e\x06\x0f\xa6\xe1\xc1\x6c\x3c\x58\x88\x07\x13\x78\xb0\x1a\x0f\x36\xe1\xc1\x0e\x3c\xd8\x8b\x07\xc7\xf0\xe0\x0c\x7e\x21\x0d\xbf\x90\x8d\x5f\x28\xc4\x2f\x24\xf0\x0b\xd5\xf8\x85\x46\xfc\x42\x3b\x7e\x21\x85\x5f\x18\xc2\x2f\x4c\xe2\x17\xe6\xf1\x8b\x59\xf8\xc5\x42\xfc\x62\x02\xbf\x58\x8d\x5f\x6c\xc4\x2f\xb6\xe3\x21\xf0\x50\x36\x1e\x2a\xc4\x43\x09\x3c\x54\x8d\x87\x1a\xf1\xd0\x97\x5b\x0a\x0f\x0d\xe3\xa1\x49\x3c\x34\x8f\xff\x3d\xf0\xbf\xe7\xe3\x5f\x26\xf1\x2f\xeb\xf0\x2f\x5b\xf1\x2f\xbb\xf1\x2f\x07\xf0\x2f\xc7\xf0\x70\x26\x1e\x2e\xc0\xc3\x65\x78\xb8\x0a\x0f\x37\xe0\xe1\x36\x3c\xdc\x83\x87\x07\xf1\xf0\x38\x1e\x9e\xc5\x2f\xa5\xe3\x97\x72\xf0\x4b\x45\xf8\xa5\x72\xfc\x52\x0d\x7e\xa9\x09\xbf\xd4\x81\x5f\xea\xc5\x2f\x0d\xe3\x97\x26\xf1\x4b\xf3\xf8\xe5\xc0\x2f\xe7\xe3\x97\x4b\xf1\x2b\x5d\xf8\x95\x01\xfc\xca\x18\x7e\x65\x06\x8f\xa4\xe1\x91\x6c\x3c\x52\x88\x47\x12\x78\xa4\x1a\x8f\x34\xe1\x91\x0e\x3c\xd2\x8b\x47\x86\xf1\xc8\x24\x1e\x99\xc7\xff\x11\xf8\x3f\xf2\xf0\xab\x15\xf8\xd5\x5a\xfc\x6a\x33\x7e\xb5\x13\xbf\xda\x87\x5f\x1d\xc1\xa3\x59\x78\xb4\x00\x8f\x26\xf0\x68\x0d\x1e\x6d\xc2\xa3\x1d\x78\xb4\x17\x8f\x7e\xb9\x4f\xe1\xd1\x05\xfc\x5a\x26\x7e\x2d\x1f\xbf\x56\x8a\x5f\xab\xc4\xaf\xd5\xe3\xd7\x5a\xf1\x6b\xdd\xf8\xb5\x01\xfc\xda\x38\x7e\x6d\x16\xbf\x9e\x8e\x5f\xcf\xc1\xaf\x17\xe3\xd7\x2b\xf0\xeb\xb5\xf8\xf5\x66\xfc\x7a\x27\x7e\xbd\x0f\xbf\x3e\x82\x5f\x9f\xc2\xaf\x2f\xe0\x37\x32\xf1\x1b\xf9\xf8\x8d\x52\xfc\x46\x25\x7e\xa3\x1e\xbf\xd1\x8a\xdf\xe8\xc6\x6f\x0c\xe0\x37\xc6\xf0\x1b\x33\x78\x2c\x03\x8f\xe5\xe2\xb1\x62\x3c\x56\x81\xc7\xea\xf0\x58\x0b\x1e\xeb\xc2\x63\xfd\x78\x6c\x14\x8f\xcd\xe2\xff\xcc\xc0\xff\x99\x8b\x7f\x9d\xc2\xbf\x1e\xc2\xbf\x9e\xc4\xbf\x9e\xc7\x6f\x06\x7e\x33\x0f\xbf\x59\x82\xdf\x4c\xe2\x37\xeb\xf0\x9b\x2d\xf8\xcd\x2e\xfc\x66\x3f\x7e\x73\x1c\xbf\x39\x8b\xc7\xd3\xf1\x6f\x06\xf1\x6f\xc6\xf1\x6f\x66\xf1\x6f\xd3\xf1\x6f\x73\xf0\x6f\x8b\xf0\x6f\xcb\xf1\x6f\x6b\xf0\x6f\x9b\xf0\x6f\xbb\xf0\x6f\xfb\xf1\x6f\x47\xf1\x6f\xa7\xf1\x5b\xe0\xb7\xb2\xf0\x5b\x05\xf8\xad\x32\xfc\x56\x15\x7e\xab\x01\xbf\xd5\x86\xdf\xea\xc5\x6f\x0d\xe3\xb7\x26\xf1\x5b\xf3\x78\x22\xf0\x44\x1e\x9e\x28\xc1\x13\x49\x3c\x51\x87\x27\x5a\xf0\x44\x17\x9e\xe8\xc7\x13\xa3\x78\x62\x1a\xff\x2e\x0d\xff\x2e\x1b\xff\xae\x10\xff\x2e\x81\x7f\x57\x8d\x7f\xd7\x88\x7f\xd7\x8e\x7f\x97\xc2\xff\xb5\x80\x7f\x9f\x89\x7f\x9f\x8f\x7f\x5f\x8a\x7f\x5f\x89\x7f\x5f\x8f\x7f\xdf\x8a\xdf\xce\xc4\x6f\x17\xe0\xb7\x13\xf8\xed\x1a\xfc\x76\x13\x7e\xbb\x03\xbf\xdd\x8b\xdf\x1e\xc6\x6f\x4f\xe2\xb7\xe7\xf1\x1f\x32\xf1\x1f\x8a\xf1\x1f\x2a\xf0\x1f\x6a\xf1\x1f\x9a\xf1\x1f\x3a\xf1\x1f\xfa\xf0\x1f\x46\xf1\x1f\xa6\xf1\x3b\xe0\x77\xb2\xf0\x3b\x05\xf8\x9d\x32\xfc\x4e\x35\x7e\xa7\x11\xbf\xd3\x89\xdf\xe9\xc3\xef\x8c\xe0\x77\xa6\xf0\x54\x1a\x9e\xca\xc6\x53\x85\x78\x2a\x81\xa7\xaa\xf1\x54\x23\x9e\x6a\xc7\x53\x29\x3c\x35\x8c\xa7\x26\xf1\xd4\x02\xfe\x63\x26\xfe\x63\x3e\xfe\x63\x29\xfe\x63\x25\xfe\x63\x3d\xfe\x63\x2b\x7e\x37\x1b\xbf\x5b\x88\xdf\x4d\xe0\x77\xab\xf1\xbb\x8d\xf8\xdd\x76\xfc\x6e\x0a\xbf\x3b\x84\xdf\x9d\xc0\xef\xce\xe1\xf7\x32\xf0\x7b\xb9\xf8\xbd\x62\xfc\x5e\x05\x7e\xaf\x16\xbf\xd7\x8c\xa7\xdb\xf0\x74\x0f\x9e\x1e\xc4\xd3\xe3\x78\x7a\x16\xbf\x9f\x8e\xdf\xcf\xc1\xef\x17\xe1\xf7\xcb\xf1\xfb\x35\xf8\xfd\x26\xfc\x7e\x27\x7e\x7f\x08\xbf\x3f\x81\xdf\x9f\xc3\x1f\x64\xe0\x0f\xf2\xf0\x07\xa5\xf8\x83\x4a\xfc\x41\x3d\xfe\xa0\x15\x7f\xd0\x8d\x3f\x18\xc0\x1f\x8c\xe1\x0f\x66\xf0\x87\x69\xf8\xc3\x6c\xfc\x61\x21\xfe\x30\x81\x3f\xac\xc6\x1f\x36\xe2\x0f\xdb\xf1\x87\x29\xfc\xe1\x10\xfe\x70\x02\x7f\x38\x87\x67\x32\xf1\x4c\x01\x9e\x29\xc3\x33\x55\x78\xa6\x01\xcf\xb4\xe1\x99\x14\x9e\x19\xc2\x33\x13\x78\x66\x1e\x7f\x14\xf8\xa3\x3c\xfc\x51\x09\xfe\x28\x89\x3f\xaa\xc3\x1f\xb5\xe0\x8f\xba\xf0\x47\xfd\xf8\xa3\x71\xfc\xd1\x2c\xfe\x38\x1d\x7f\x9c\x83\x3f\x2e\xc2\x1f\x97\xe3\x8f\x6b\xf1\xc7\xcd\xf8\xe3\x4e\xfc\x71\x1f\xfe\x78\x04\x7f\x3c\x85\x3f\x5e\xc0\x9f\x64\xe2\x4f\xf2\xf1\x27\xa5\x78\x36\x17\xcf\x96\xe0\xd9\x24\x9e\xad\xc3\xb3\x2d\x78\xb6\x0b\xcf\xf6\xe3\xd9\x51\x3c\x3b\x8d\x3f\x05\x7f\x3a\x87\x3f\xcb\xc0\x9f\xe5\xe2\xcf\x8a\xf1\x67\x15\xf8\xb3\x7a\xfc\x59\x1b\xfe\xac\x07\x7f\x36\x88\x3f\x1b\xc7\x9f\xcd\xe2\x3f\xa5\xe3\x3f\xe5\xe0\x3f\x15\xe1\x3f\x95\xe3\x3f\xd5\xe0\xb9\x09\xfc\x79\x05\xfe\xbc\x16\x7f\xde\x8c\x3f\xef\xc4\x9f\xf7\xe1\xcf\x47\xf0\x7c\x19\x9e\xaf\xc2\x7f\x1d\xc7\x7f\x9d\xc5\x7f\x4b\xc7\x7f\xcb\xc1\x7f\x2b\xc2\x7f\x2b\xc7\xff\x3d\x8a\xff\x7b\x1a\x2f\x80\x17\xb2\xf0\xdf\x07\xf0\xdf\x27\xf0\xdf\xe7\xf1\x17\x99\xf8\x8b\x7c\xfc\x45\x19\xfe\xa2\x0a\x7f\xd1\x80\xbf\x68\xc3\x5f\xa4\xf0\x17\x43\xf8\x8b\x09\xfc\xc5\x1c\xf1\xff\x5d\x1e\x41\x09\x41\x92\xa0\x8e\xa0\x85\xa0\x8b\xa0\x9f\x60\x94\x60\x9a\x38\x08\xe2\xa0\x2c\xe2\xa0\x42\xe2\xa0\x04\x71\x50\x35\x71\x50\x23\x71\x50\x3b\x71\x50\x8a\x38\x68\x8c\x38\x68\x86\xf8\x4a\x1f\x71\x70\x33\x71\x70\x27\x71\xf0\x97\x3e\x42\x1c\x3c\x45\x1c\xbc\x40\xa4\x65\x12\x69\xf9\x44\x5a\x29\xf1\xd5\x72\xe2\x9f\xba\x89\x7f\x1a\x20\xfe\x69\x8c\xf8\x5a\x1f\x91\xde\x48\xa4\xb7\x13\xe9\x29\x22\x7d\x88\x48\x9f\x20\xd2\xe7\x88\x43\x32\x88\x43\x72\x89\x43\x8a\x89\x43\x2a\x88\x43\x6a\x89\x43\x5a\x88\x43\xba\x88\x43\xfa\x89\x43\x46\x89\x43\xe6\x88\x43\x33\x88\x43\x73\x89\x43\x8b\x89\x43\x2b\x88\x43\x6b\x89\x43\x9b\x89\x43\x3b\x89\x43\xfb\x88\x43\x47\x88\x43\xa7\x88\x43\x17\x88\xaf\x67\x12\x5f\xcf\x27\xbe\x5e\x4a\x7c\xbd\x92\x38\x2c\x8b\x38\xac\x80\x38\xac\x8c\x38\xac\x9a\x38\xac\x91\x70\x1e\xe1\x12\xc2\x55\x44\x24\x88\xa8\x26\xa2\x91\x88\x76\xe2\x7f\x24\x89\xc3\xd3\x88\xc3\xb3\x89\xc3\x8b\x88\xc3\xcb\x89\x23\xca\x88\x23\x6a\x88\x23\x5a\x88\x23\x7a\x88\x23\x06\x89\x23\xc6\x89\x23\x66\x89\xcc\x0c\x22\x33\x97\xc8\x2c\x26\x32\x2b\x89\xcc\x7a\xe2\x7f\x66\x13\xff\xb3\x90\xf8\x9f\x09\xe2\x1b\x19\xc4\x37\x72\x89\x6f\x7e\x49\x31\xf1\xcd\x0a\xe2\x9b\xb5\xc4\x37\x9b\x89\x6f\x76\x12\xdf\xec\x23\xbe\x39\x42\x7c\x73\x8a\xf8\xe6\x02\x91\x95\x47\x64\x95\x10\x59\x55\xc4\x3f\xd7\x11\x47\x96\x10\x47\x26\x89\x23\xbf\xf4\x16\xe2\xc8\x2e\xe2\xc8\x7e\xe2\xc8\x51\xe2\xc8\x69\xe2\x28\x88\xa3\xb2\x88\xa3\x0a\x88\xa3\xca\x88\xa3\xaa\x88\xa3\x1a\x88\xa3\xda\x88\xa3\x7a\x88\xa3\x06\x89\xa3\xc6\x89\xa3\x66\x89\xec\x74\x22\x3b\x87\xc8\x2e\x22\xb2\xcb\x89\xec\x1a\x22\xbb\x89\xc8\xee\x20\x8e\xae\x26\x8e\x6e\x24\x8e\x6e\x27\x8e\x4e\x11\x47\x0f\x11\x47\x4f\x10\x47\xcf\x11\xc7\x64\x10\xc7\xe4\x12\xc7\x14\x13\xc7\x24\x89\x63\xea\x88\x63\x5a\x88\x63\xba\x88\x63\xfa\x89\x6f\x7d\xc9\x28\xf1\xad\x69\x22\x27\x8d\xc8\xc9\x26\x72\x0a\x89\x9c\x04\x91\x53\x4d\x1c\x5b\x43\x1c\xdb\x44\x1c\xdb\x41\x1c\xdb\x4b\x1c\x3b\x4c\x1c\x3b\x49\x1c\x3b\x4f\x2c\x0a\x62\x51\x1e\xb1\xa8\x84\x58\x94\x24\x16\xd5\x11\x8b\x5a\x88\x45\x5d\xc4\xa2\x7e\x62\xd1\x28\xb1\x68\x9a\x38\x0e\xe2\xb8\x2c\xe2\xb8\x02\xe2\xb8\x32\xe2\xb8\x2a\xe2\xb8\x46\xe2\xb8\x76\xe2\xb8\x14\x71\xdc\x10\x71\xdc\x04\x91\x9b\x4e\xe4\xe6\x10\xb9\x45\x44\x6e\x39\x91\x5b\x43\xe4\x36\x11\xb9\x1d\x44\x6e\x2f\x91\x3b\x4c\xe4\x4e\x12\xb9\xf3\xc4\xf1\x41\x1c\x9f\x47\x1c\x5f\x42\x1c\x9f\x24\x8e\x6f\x20\x8e\x6f\x27\x8e\x4f\x11\xc7\x0f\x11\xc7\x4f\x10\xc7\xcf\x11\x27\x64\x10\x27\xe4\x12\x27\x14\x13\x27\x54\x10\x27\xd4\x12\x27\x34\x13\x27\x74\x12\x27\xf4\x11\x27\x8c\x10\x27\x4c\x11\x27\x2c\x10\x79\x19\x44\x5e\x1e\x91\x57\x42\xe4\x25\x89\xbc\x3a\x22\xaf\x85\xc8\xeb\x26\xf2\x06\x88\xbc\x31\x22\x6f\x9e\x38\xa9\x8f\x38\x69\x84\x38\xb9\x99\x38\xb9\x93\x38\xb9\x8f\xc8\x1f\x21\xf2\xa7\x88\xc5\x10\x8b\x07\x89\x53\x86\x89\x53\x26\x89\x53\xe6\x89\x25\x99\xc4\x92\x7c\x62\x49\x29\xb1\xa4\x92\x28\x28\x25\x0a\xaa\x88\xa5\x5f\xd2\x48\x2c\x6d\x27\x96\xa6\x88\xd3\x32\x89\xd3\x0a\x88\xc2\x3a\xa2\x70\x94\x38\xbd\x9c\x38\xbd\x86\x38\xbd\x89\x38\x7d\x94\xf8\x97\x62\xe2\x5f\x12\xc4\xbf\x54\x12\xff\xd2\x4f\x2c\x2b\x26\x96\x25\x88\x65\x95\xc4\xb2\x7a\x62\x59\x1b\xb1\xac\x87\x58\x36\x4a\x2c\x9b\x23\x8a\x32\x88\xa2\x5c\xa2\xa8\x98\x28\xaa\x20\x8a\xea\x88\xa2\x56\xa2\xa8\x87\x28\x1a\x22\x8a\x26\x89\xa2\x05\x62\x79\x16\xb1\xbc\x90\x58\x5e\x4e\x2c\xaf\x25\x96\xb7\x10\xcb\xbb\x89\xe5\x83\xc4\xf2\x09\x62\xf9\x3c\xb1\x22\x93\x58\x51\x40\xac\x48\x10\x2b\x6a\x88\x15\xcd\xc4\x8a\x2e\x62\xc5\x00\xb1\x62\x9c\x58\x31\x47\x9c\x11\xc4\x19\xf9\xc4\x19\x65\xc4\x19\x55\xc4\x19\x8d\xc4\x19\x1d\xc4\x19\x7d\xc4\x19\xa3\xc4\x19\x33\x44\x71\x3a\x51\x9c\x4b\x14\x97\x10\xc5\x95\x44\x71\x03\x51\xdc\x4e\x14\xf7\x12\xc5\x23\x44\xf1\x34\x71\x66\x1a\x71\x66\x0e\x71\x66\x31\x71\x66\x92\x38\xb3\x9e\x38\xb3\x8d\x38\x33\x45\x9c\x39\x4c\x9c\x39\x45\xac\x84\x58\x99\x4d\xac\x2c\x22\x56\x56\x10\x2b\x6b\x89\x95\x2d\xc4\xca\x6e\x62\xe5\x20\xb1\x72\x82\x58\x39\x4f\xac\xca\x24\x56\x15\x10\xab\x12\xc4\xaa\x1a\x62\x55\x33\xb1\xaa\x8b\x58\x35\x40\xac\x1a\x27\x56\xcd\x11\x25\x41\x94\xe4\x13\x25\x65\x44\x49\x35\x51\xd2\x44\x94\x74\x12\x25\xfd\x44\xc9\x18\x51\x32\x4b\x9c\x95\x41\x9c\x95\x47\x9c\x55\x4a\x9c\x55\x45\x9c\xd5\x40\x9c\xd5\x4e\x9c\xd5\x4b\x9c\x35\x42\x9c\x35\x4d\xac\x4e\x23\x56\xe7\x10\xab\x8b\x89\xd5\x49\x62\x75\x3d\xb1\xba\x8d\x58\x9d\x22\x56\x0f\x13\xab\xa7\x88\x35\x10\x6b\xb2\x89\x35\x45\xc4\x9a\x0a\x62\x4d\x1d\xb1\xa6\x95\x58\xd3\x43\xac\x19\x22\xd6\x4c\x12\x6b\x16\x88\xd2\x2c\xa2\xb4\x90\x28\x2d\x27\x4a\x6b\x89\xd2\x66\xa2\xb4\x8b\x28\x1d\x20\x4a\xc7\x89\xd2\x39\xe2\xec\x20\xce\xce\x27\xce\x2e\x23\xce\xae\x26\xce\x6e\x22\xce\xee\x24\xce\xee\x27\xce\x1e\x23\xce\x9e\x25\xd6\x66\x10\x6b\xf3\x88\xb5\xa5\xc4\xda\x2a\x62\x6d\x23\xb1\xb6\x83\x58\xdb\x47\xac\x1d\x25\xd6\xce\x10\xeb\xd2\x89\x75\xb9\xc4\xba\x12\x62\x5d\x25\xb1\xae\x81\x58\xd7\x46\xac\x4b\x11\xeb\x86\x89\x75\x53\x44\x19\x44\x59\x36\x51\x56\x44\x94\x55\x10\x65\x75\x44\x59\x2b\x51\xd6\x43\x94\x0d\x11\x65\x93\x44\xd9\x02\xb1\x3e\x8b\x58\x5f\x48\xac\x2f\x27\xd6\xd7\x12\xeb\x5b\x88\xf5\xdd\xc4\xfa\x41\x62\xfd\x04\xb1\x7e\x9e\xd8\x90\x49\x6c\x28\x20\x36\x24\x88\x0d\x35\xc4\x86\x66\x62\x43\x27\xb1\xa1\x9f\xd8\x30\x46\x6c\x98\x25\x36\x66\x10\x1b\xf3\x88\x8d\xa5\xc4\xc6\x2a\x62\x63\x23\xb1\xb1\x83\xd8\xd8\x47\x6c\x1c\x25\x36\xce\x10\x89\x74\x22\x91\x4b\x24\x4a\x88\x44\x25\x91\x68\x20\x12\xed\x44\xa2\x97\x48\x8c\x10\x89\x69\x62\x53\x1a\xb1\x29\x87\xd8\x54\x4c\x6c\x4a\x12\x9b\xea\x89\x4d\x6d\xc4\xa6\x1e\x62\xd3\x10\xb1\x69\x92\xd8\xb4\x40\x6c\xce\x22\x36\x17\x12\x9b\xcb\x89\xcd\xb5\xc4\xe6\x16\x62\x73\x37\xb1\x79\x90\xd8\x3c\x41\x6c\x9e\x27\xb6\x64\x12\x5b\x0a\x88\x2d\x09\x62\x4b\x0d\xb1\xa5\x99\xd8\xd2\x45\x6c\x19\x20\xb6\x8c\x13\x5b\xe6\x88\xf2\x20\xca\xf3\x89\xf2\x32\xa2\xbc\x9a\x28\x6f\x22\xca\x3b\x89\xf2\x3e\xa2\x7c\x94\x28\x9f\x21\xb6\xa6\x13\x5b\x73\x89\xad\x25\xc4\xd6\x4a\x62\x6b\x03\xb1\xb5\x9d\xd8\xda\x4b\x6c\x1d\x21\xb6\x4e\x13\xe7\xa4\x11\xe7\xe4\x10\xe7\x14\x13\xe7\x24\x89\x73\xea\x89\x73\xda\x88\x73\x52\xc4\x39\xc3\xc4\x39\x53\xc4\x36\x88\x6d\xd9\xc4\xb6\x22\x62\x5b\x05\xb1\xad\x8e\xd8\xd6\x4a\x6c\xeb\x21\xb6\x0d\x12\xdb\x26\x88\x6d\xf3\x44\x45\x26\x51\x51\x40\x54\x24\x88\x8a\x1a\xa2\xa2\x99\xa8\xe8\x22\x2a\x06\x88\x8a\x71\xa2\x62\x8e\xd8\x1e\xc4\xf6\x7c\x62\x7b\x19\xb1\xbd\x9a\xd8\xde\x44\x6c\xef\x24\xb6\xf7\x13\xdb\xc7\x88\xed\xb3\xc4\x8e\x0c\x62\x47\x1e\xb1\xa3\x94\xd8\x51\x45\xec\x68\x24\x76\x74\x10\x3b\xfa\x88\x1d\x23\xc4\x8e\x69\x62\x67\x1a\xb1\x33\x87\xd8\x59\x4c\xec\x4c\x12\x3b\xeb\x89\x9d\x6d\xc4\xce\x14\xb1\x73\x98\xd8\x39\x45\x24\x21\x92\xd9\x44\xb2\x88\x48\x56\x10\xc9\x3a\x22\xd9\x4a\x24\x7b\x88\xe4\x10\x91\x9c\x24\x92\x0b\xc4\xae\x2c\x62\x57\x21\xb1\xab\x9c\xd8\x55\x4b\xec\x6a\x21\x76\x75\x13\xbb\x06\x89\x5d\xe3\xc4\xae\x39\x62\x77\x10\xbb\xf3\x89\xdd\x65\xc4\xee\x6a\x62\x77\x13\xb1\xbb\x93\xd8\xdd\x4f\xec\x1e\x23\x76\xcf\x12\x7b\x32\x88\x3d\x79\xc4\x9e\x52\x62\x4f\x15\xb1\xa7\x91\xd8\xd3\x41\xec\xe9\x23\xf6\x8c\x12\x7b\x66\x88\xca\x74\xa2\x32\x97\xa8\x2c\x21\x2a\x2b\x89\xca\x06\xa2\xb2\x9d\xa8\xec\x25\x2a\x47\x88\xca\x29\x62\x2f\xc4\xde\x6c\x62\x6f\x11\xb1\xb7\x82\xd8\x5b\x47\xec\x6d\x25\xf6\xf6\x10\x7b\x87\x88\xbd\x93\xc4\xde\x05\x62\x5f\x16\xb1\xaf\x90\xd8\x57\x4e\xec\xab\x25\xf6\xb5\x10\xfb\xba\x89\x7d\x83\xc4\xbe\x09\x62\xdf\x3c\xb1\x3f\x93\xd8\x5f\x40\xec\x4f\x10\xfb\x6b\x88\xfd\xcd\xc4\xfe\x2e\x62\xff\x00\xb1\x7f\x9c\xd8\x3f\x4b\x54\x65\x10\x55\x79\x44\x55\x29\x51\x55\x45\x54\x35\x12\x55\x1d\x44\x55\x1f\x51\x35\x4a\x54\xcd\x10\xdf\x49\x27\xbe\x93\x4b\x7c\xa7\x84\xf8\x4e\x25\xf1\x9d\x06\xe2\x3b\xed\xc4\x77\x7a\x89\xef\x8c\x10\xdf\x99\x26\xce\x4d\x23\xce\xcd\x21\xce\x2d\x26\xce\x4d\x12\xe7\xd6\x13\xe7\xb6\x11\xe7\xa6\x88\x73\x87\x89\x73\xa7\x88\x73\x17\x88\x03\x59\xc4\x81\x42\xe2\x40\x39\x71\xa0\x96\x38\xd0\x42\x1c\xe8\x26\x0e\x0c\x12\x07\x26\x88\x03\xf3\x44\x75\x26\x51\x5d\x40\x54\x27\x88\xea\x1a\xa2\xba\x99\xa8\xee\x22\xaa\x07\x88\xea\x71\xa2\x7a\x8e\x38\x2f\x88\xf3\xf2\x89\xf3\xca\x88\xf3\xaa\x89\xf3\x9a\x88\xf3\x3a\x89\xf3\xfa\x89\xf3\xc6\x88\xf3\x66\x89\xf3\xd3\x89\xf3\x73\x89\xf3\x4b\x88\xf3\x2b\x89\xf3\x1b\x88\xf3\xdb\x89\xf3\x7b\x89\xf3\x47\x88\xf3\xa7\x89\x0b\xd2\x88\x0b\x72\x88\x0b\x8a\x89\x0b\x92\xc4\x05\xf5\xc4\x05\x6d\xc4\x05\x29\xe2\x82\x61\xe2\x82\xff\x97\x00\x38\x00\x88\x40\x3c\xd8\x38\xfe\x47\x08\xe1\x79\x5e\xe1\x10\x0e\xf9\xd6\xb6\xb6\xb5\xad\x6d\x6d\x6b\x5b\xdb\xb2\x35\x6b\x5b\xdb\xb2\x35\x6b\xd3\xb6\x6c\x87\x10\x42\x08\x87\x43\x38\x84\x70\x08\xe1\x10\x42\x38\x84\x43\x38\x84\x10\x42\x38\x1c\x42\x38\x84\x70\x38\x7c\xbf\x25\x14\x03\xc5\x6a\x50\xac\x09\xc5\x3a\x51\xac\x1f\xc5\x92\x28\x36\x81\x62\x39\x14\x2b\xa0\x58\x19\xed\x51\x8d\xf6\x68\x40\x7b\xb4\xa3\x3d\x62\x68\x8f\x04\xda\x63\x1c\xed\x91\x45\x7b\x2c\xa2\x3d\x56\xd1\x9e\x42\x7b\xd6\xa3\x3d\xdb\xd0\x9e\xbd\x68\xcf\x38\xda\x73\x0c\xed\x39\x8d\xf6\x5c\x40\x7b\xae\xa0\xbd\xaa\xd0\x5e\x75\x68\xaf\x56\xb4\x57\x0f\xda\x6b\x08\xed\x95\x42\x7b\x65\xd0\x5e\xf3\x68\xaf\x22\xea\xab\x44\x7d\x51\xd4\xd7\x8c\xfa\xba\x50\xdf\x00\xea\x1b\x41\x7d\x93\xa8\x6f\x16\xf5\x2d\xa1\xbd\x41\x7b\xd7\xa0\xbd\x9b\xd0\xde\x9d\x68\xef\x7e\xb4\x77\x12\xed\x3d\x81\xf6\xce\xa1\xbd\x0b\x68\xef\x32\xda\x27\x82\xf6\x69\x44\xfb\x74\xa0\x7d\xfa\xd0\x3e\xc3\x68\x9f\x34\xda\x67\x06\xed\x93\x47\xfb\x94\xd0\xbe\xd5\x68\xdf\x7a\xb4\x6f\x1b\xda\xb7\x17\xed\x1b\x47\xfb\x8e\xa1\x7d\xa7\xd1\xbe\x0b\x68\xdf\x15\xd4\x5f\x85\xfa\xeb\x50\x7f\x2b\xea\xef\x41\xfd\x43\xa8\x3f\x85\xfa\x33\xa8\x7f\x1e\xf5\x17\xd1\x7e\x95\x68\xbf\x5a\xb4\x5f\x0b\xda\xaf\x1b\xed\x37\x88\xf6\x1b\x45\xfb\x4d\xa1\xfd\xe6\xd0\x7e\xcb\x68\xff\x0a\xb4\x7f\x14\xed\xdf\x84\xf6\xef\x44\xfb\xf7\xa3\xfd\x93\x68\xff\x09\xb4\x7f\x0e\xed\x5f\x40\xfb\x97\xd1\x01\x11\x74\x40\x23\x3a\xa0\x03\x1d\xd0\x87\x0e\x18\x46\x07\xa4\xd1\x01\x33\xe8\x80\x3c\x3a\xa0\x84\x06\xaa\xd1\x40\x03\x1a\x68\x47\x03\x31\x34\x90\x40\x03\xe3\x68\x20\x8b\x06\x16\xd1\xc0\x2a\x3a\x50\xe8\xc0\x7a\x74\x60\x2b\x3a\xb0\x07\x1d\x38\x84\x0e\x4c\xa1\x03\x33\xe8\xc0\x79\x74\x60\x11\x1d\x54\x89\x0e\xaa\x45\x07\xb5\xa0\x83\xba\xd1\x41\x83\xe8\xa0\x51\x74\xd0\x14\x3a\x68\x0e\x1d\xb4\x8c\x0e\xae\x40\x07\x47\xd1\xc1\xcd\xe8\xe0\x2e\x74\xf0\x00\x3a\x78\x04\x1d\x3c\x89\x0e\x9e\x45\x07\x2f\xa1\x41\xd0\x60\x0d\x1a\x6c\x42\x83\x1d\x68\xb0\x0f\x0d\x0e\xa3\xc1\x34\x1a\x9c\x41\x83\x79\x34\x58\x42\x87\x54\xa3\x43\x1a\xd0\x21\xed\xe8\x90\x18\x3a\x24\x81\x0e\x19\x47\x87\x64\xd1\x21\x8b\xe8\x90\x55\x74\xa8\xd0\xa1\xf5\xe8\xd0\x36\x74\x68\x2f\x3a\x34\x8e\x0e\x1d\x43\x87\x4e\xa3\x43\x17\xd0\xa1\x2b\xe8\xb0\x2a\x74\x58\x1d\x3a\xac\x15\x1d\xd6\x8d\x0e\x1b\x44\x87\x8d\xa2\xc3\xa6\xd0\x61\x73\xe8\xb0\x65\x34\x54\x81\x86\xa2\x68\xa8\x19\x0d\x75\xa1\xa1\x01\x34\x34\x82\x86\x26\xd1\xd0\x2c\x1a\x5a\x42\x87\x83\x0e\xaf\x41\x87\x37\xa1\xc3\x3b\xd1\xe1\xfd\xe8\xf0\x24\x3a\x7c\x02\x1d\x9e\x43\x87\x17\xd0\xe1\x65\x74\x44\x04\x1d\xd1\x88\x8e\xe8\x40\x47\xc4\xd0\x11\x09\x74\xc4\x38\x3a\x22\x8b\x8e\x58\x44\x47\xac\xa2\x23\x85\x8e\xac\x47\x47\xb6\xa1\x23\x7b\xd1\x91\x71\x74\xe4\x18\x3a\x72\x1a\x1d\xb9\x80\x8e\x5c\x41\xf1\x2a\x14\xaf\x43\xf1\x56\x14\xef\x41\xf1\x21\x14\x4f\xa1\x78\x06\xc5\xe7\x51\xbc\x88\x8e\xaa\x44\x47\xd5\xa2\xa3\x5a\xd0\x51\xdd\xe8\xa8\x01\x74\xd4\x08\x3a\x6a\x12\x1d\x35\x8b\x8e\x5a\x42\x47\x83\x8e\xae\x41\x47\x37\xa1\xa3\x3b\xd1\xd1\xfd\xe8\xe8\x24\x3a\x7a\x02\x1d\x9d\x43\x47\x17\xd0\xd1\x65\x74\x4c\x04\x1d\xd3\x88\x8e\xe9\x40\xc7\xf4\xa1\x63\x86\xd1\x31\x69\x74\xcc\x0c\x3a\x26\x8f\x8e\x29\xa1\x44\x35\x4a\x34\xa0\x44\x3b\x4a\xc4\x50\x22\x8e\x12\x63\x28\x31\x8d\x12\x0b\x28\xb1\x82\x8e\xad\x42\xc7\xd6\xa1\x63\x5b\xd1\xb1\x3d\xe8\xd8\x21\x74\x6c\x0a\x1d\x9b\x41\xc7\xce\xa3\x63\x8b\xe8\xb8\x4a\x74\x5c\x2d\x3a\xae\x05\x1d\xd7\x8d\x8e\x1b\x44\xc7\x8d\xa2\xe3\xa6\xd0\x71\x73\xe8\xb8\x65\x74\x7c\x05\x3a\x3e\x8a\x8e\x6f\x46\xc7\x77\xa1\xe3\x07\xd0\xf1\x49\x74\xfc\x04\x3a\x3e\x87\x8e\x2f\xa0\xe3\xcb\x68\x38\x82\x86\x1b\xd1\x70\x07\x1a\xee\x43\xc3\xc3\x68\x38\x8d\x86\x67\xd0\x70\x1e\x0d\x97\xd0\x09\xd5\xe8\x84\x06\x74\x42\x3b\x3a\x21\x86\x4e\x48\xa0\x13\xc6\xd1\x09\x59\x74\xc2\x22\x3a\x61\x15\x9d\x28\x74\x62\x3d\x3a\xb1\x0d\x9d\xd8\x8b\x4e\x8c\xa3\x13\x53\xe8\xc4\x0c\x3a\x71\x1e\x9d\x58\x44\x27\x55\xa2\x93\x6a\xd1\x49\x2d\xe8\xa4\x6e\x74\xd2\x20\x3a\x69\x14\x9d\x34\x85\x4e\x9a\x43\x27\x2d\xa3\x64\x05\x4a\x46\x51\xb2\x19\x25\xbb\x50\x72\x00\x25\x47\x50\x72\x12\x25\x67\x51\x72\x09\x9d\x0c\x3a\xb9\x06\x9d\xdc\x84\x4e\xee\x44\x27\xf7\xa3\x93\x93\xe8\xe4\x34\x3a\x79\x06\x9d\x9c\x47\x27\x97\xd0\x29\xd5\xe8\x94\x06\x74\x4a\x3b\x3a\x25\x86\x4e\x49\xa0\x53\xc6\xd1\x29\x59\x74\xca\x22\x3a\x65\x15\x9d\x2a\x74\x6a\x3d\x3a\xb5\x0d\x9d\xda\x8b\x4e\x8d\xa3\x53\xc7\xd0\xa9\xd3\xe8\xd4\x05\x74\xea\x0a\x1a\xa9\x42\x23\x75\x68\xa4\x15\x8d\xf4\xa0\x91\x21\x34\x92\x42\x23\x53\x68\x64\x0e\x8d\x2c\xa3\xd3\x2a\xd0\x69\x51\x74\x5a\x33\x3a\xad\x0b\x9d\x36\x80\x4e\x1b\x41\xa7\x4d\xa2\xd3\x66\xd1\x69\x4b\xe8\x74\xd0\xe9\x35\xe8\xf4\x26\x74\x7a\x27\x3a\xbd\x1f\x9d\x9e\x44\xa7\x4f\xa0\xd3\x73\xe8\xf4\x02\x3a\xbd\x8c\xce\x88\xa0\x33\x1a\xd1\x19\x1d\xe8\x8c\x3e\x74\xc6\x30\x3a\x23\x8d\xce\xc8\xa2\x33\x16\xd1\x19\xab\x68\x54\x68\xb4\x1e\x8d\xb6\xa1\xd1\x5e\x34\x1a\x47\xa3\x63\x68\x74\x1a\x8d\x2e\xa0\xd1\x15\x74\x66\x15\x3a\xb3\x0e\x9d\xd9\x8a\xce\xec\x41\x67\x0e\xa1\x33\x53\xe8\xcc\x0c\x3a\x73\x1e\x9d\x59\x44\x67\x55\xa2\xb3\x6a\xd1\x59\x2d\xe8\xac\x6e\x74\xd6\x20\x3a\x6b\x14\x9d\x35\x85\xce\x9a\x45\x67\x2d\xa1\xb3\x41\x67\xd7\xa0\xb3\x9b\xd0\xd9\x9d\xe8\xec\x7e\x74\x76\x12\x9d\x3d\x81\xce\xce\xa1\xb3\x0b\xe8\xec\x32\x4a\x45\x50\xaa\x11\xa5\x3a\x50\xaa\x0f\xa5\x86\x51\x2a\x8d\x52\x33\x28\x95\x47\xa9\x12\x3a\xa7\x1a\x9d\xd3\x80\xce\x69\x47\xe7\xc4\xd0\x39\x09\x74\xce\x38\x3a\x27\x8b\xce\x59\x40\xe7\xac\xa0\x73\xab\xd0\xb9\x75\xe8\xdc\x56\x74\x6e\x0f\x3a\x77\x08\x9d\x9b\x42\xe7\x66\xd0\xb9\xf3\xe8\xdc\x22\x3a\xaf\x12\x9d\x57\x8b\xce\x6b\x41\xe7\x75\xa3\xf3\x06\xd1\x79\xa3\xe8\xbc\x29\x74\xde\x1c\x3a\x6f\x19\x8d\x55\xa0\xb1\x28\x1a\x6b\x46\x63\x5d\x68\x6c\x00\x8d\x8d\xa0\xb1\x49\x34\x36\x8b\xc6\x0a\x68\xac\x8c\xce\x8f\xa0\xf3\x1b\xd1\xf9\x1d\xe8\xfc\x3e\x74\xfe\x30\x3a\x3f\x8d\xce\x9f\x41\xe7\xe7\xd1\xf9\x25\x74\x41\x35\xba\xa0\x01\x5d\xd0\x8e\x2e\x88\xa1\x0b\x12\xe8\x82\x71\x74\x41\x16\x5d\xb0\x88\x2e\x58\x45\x17\x0a\x5d\x58\x8f\x2e\x6c\x43\x17\xf6\xa2\x0b\xe3\xe8\xc2\x31\x74\xe1\x34\xba\x70\x01\x5d\x58\x44\xe3\x95\x68\xbc\x16\x8d\xb7\xa0\xf1\x6e\x34\x3e\x88\xc6\x47\xd1\xf8\x14\x1a\x9f\x43\xe3\xcb\xe8\xa2\x0a\x74\x51\x14\x5d\xd4\x8c\x2e\xea\x42\x17\x0d\xa0\x8b\x46\xd0\x45\x93\xe8\xa2\x59\x74\xd1\x12\xba\x18\x74\x71\x0d\xba\xb8\x09\x5d\xdc\x89\x2e\xee\x47\x17\x27\xd1\xc5\x13\xe8\xe2\x1c\xba\xb8\x80\x2e\x2e\xa1\x4b\xaa\xd1\x25\x0d\xe8\x92\x76\x74\x49\x0c\x5d\x92\x40\x97\x8c\xa3\x4b\xb2\xe8\x92\x45\x74\xc9\x2a\x4a\x0b\xa5\xeb\x51\xba\x0d\xa5\x7b\x51\x3a\x8e\xd2\x63\x28\x3d\x8d\xd2\x0b\x28\xbd\x82\x2e\xad\x42\x97\xd6\xa1\x4b\x5b\xd1\xa5\x3d\xe8\xd2\x21\x74\x69\x0a\x5d\x9a\x41\x97\xce\xa3\x4b\x8b\xe8\xb2\x0a\x74\x59\x14\x5d\xd6\x8c\x2e\xeb\x42\x97\x0d\xa0\xcb\x46\xd0\x65\x93\xe8\xb2\x59\x74\xd9\x12\xba\x1c\x74\x79\x0d\xba\xbc\x09\x5d\xde\x89\x2e\xef\x47\x97\x27\xd1\xe5\x13\xe8\xf2\x1c\xba\xbc\x80\x2e\x2f\xa3\x89\x08\x9a\x68\x44\x13\x1d\x68\xa2\x0f\x4d\x0c\xa3\x89\x34\x9a\x98\x41\x13\x79\x34\x51\x42\x57\x08\x5d\x51\x8f\xae\x68\x43\x57\xf4\xa2\x2b\xe2\xe8\x8a\x31\x74\xc5\x34\xba\x62\x01\x5d\xb1\x82\xae\xac\x42\x57\xd6\xa1\x2b\x5b\xd1\x95\x3d\xe8\xca\x21\x74\x65\x0a\x5d\x99\x41\x57\xce\xa3\x2b\x8b\xe8\xaa\x4a\x74\x55\x2d\xba\xaa\x05\x5d\xd5\x8d\xae\x1a\x44\x57\x8d\xa2\xab\xa6\xd0\x55\x73\xe8\xaa\x65\x34\x59\x81\x26\x6b\xd0\x64\x13\x9a\xec\x44\x93\xfd\x68\x32\x89\x26\x27\xd0\x64\x0e\x4d\x16\xd0\x64\x19\x5d\x1d\x41\x57\x37\xa2\xab\x3b\xd0\xd5\x7d\xe8\xea\x61\x74\x75\x1a\x5d\x3d\x83\xae\xce\xa3\xab\x4b\xe8\x9a\x6a\x74\x4d\x03\xba\xa6\x1d\x5d\x13\x43\xd7\x24\xd0\x35\xe3\xe8\x9a\x2c\xba\x66\x11\x5d\xb3\x8a\xae\x15\xba\xb6\x0e\x5d\xdb\x8a\xae\xed\x41\xd7\x0e\xa1\x6b\x53\xe8\xda\x0c\xba\x76\x1e\x5d\x5b\x44\x53\x95\x68\xaa\x16\x4d\xb5\xa0\xa9\x6e\x34\x35\x88\xa6\x46\xd1\xd4\x14\x9a\x9a\x43\x53\xcb\xe8\xba\x0a\x74\x5d\x14\x5d\xd7\x8c\xae\xeb\x42\xd7\x0d\xa0\xeb\x46\xd0\x75\x93\xe8\xba\x59\x74\xdd\x12\xba\x1e\x74\x7d\x0d\xba\xbe\x11\x5d\xdf\x81\xae\xef\x43\xd7\x0f\xa3\xeb\xd3\xe8\xfa\x19\x74\x7d\x1e\x5d\x5f\x42\x37\x54\xa3\x1b\x1a\xd0\x0d\xed\xe8\x86\x18\xba\x21\x81\x6e\x18\x47\x37\x64\xd1\x0d\x8b\xe8\x86\x55\x94\x11\xca\xd4\xa3\x4c\x1b\xca\xf4\xa2\x4c\x1c\x65\xc6\x50\x66\x1a\x65\x16\x50\x66\x05\xdd\x58\x85\x6e\xac\x43\x37\xb6\xa0\x1b\xbb\xd1\x8d\x83\xe8\xc6\x51\x74\xe3\x14\xba\x71\x0e\xdd\xb8\x8c\x6e\xaa\x40\x37\x45\xd1\x4d\xcd\xe8\xa6\x2e\x74\xd3\x00\xba\x69\x04\xdd\x34\x89\x6e\x9a\x45\x37\x2d\xa1\x9b\x41\x37\xd7\xa0\x9b\x9b\xd0\xcd\x9d\xe8\xe6\x7e\x74\x73\x12\xdd\x3c\x81\x6e\xce\xa1\x9b\x0b\xe8\xe6\x32\x9a\x8e\xa0\xe9\x46\x34\xdd\x8e\xa6\x63\x68\x3a\x81\xa6\xc7\xd1\x74\x16\x4d\x2f\xa2\xe9\x55\x74\x8b\xd0\x2d\xf5\xe8\x96\x36\x74\x4b\x2f\xba\x25\x8e\x6e\x19\x43\xb7\x4c\xa3\x5b\x16\xd0\x2d\x2b\xe8\xd6\x2a\x74\x6b\x1d\xba\xb5\x15\xdd\xda\x83\x6e\x1d\x42\xb7\xa6\xd0\xad\x19\x74\xeb\x3c\xba\xb5\x88\x6e\xab\x44\xb7\xd5\xa2\xdb\x5a\xd0\x6d\x5d\xe8\xb6\x01\x74\xdb\x08\xba\x6d\x12\xdd\x36\x8b\x6e\x5b\x42\x59\x50\xb6\x06\x65\x9b\x50\xb6\x13\x65\xfb\x51\x36\x89\xb2\x13\x28\x9b\x43\xd9\x02\xca\x96\xd1\xed\x11\x74\x7b\x23\xba\xbd\x03\xdd\xde\x87\x6e\x1f\x46\xb7\xa7\xd1\xed\x33\xe8\xf6\x3c\xba\xbd\x84\xee\xa8\x46\x77\x34\xa0\x3b\xda\xd1\x1d\xbd\xe8\x8e\x38\xba\x63\x0c\xdd\x31\x8d\xee\x58\x40\x77\xac\xa0\x3b\xab\xd0\x9d\x75\xe8\xce\x56\x74\x67\x0f\xba\x73\x08\xdd\x99\x42\x77\x66\xd0\x9d\xf3\xe8\xce\x22\x9a\xa9\x44\x33\xb5\x68\xa6\x05\xcd\x74\xa3\x99\x41\x34\x33\x8a\x66\xa6\xd0\xcc\x1c\x9a\x59\x46\x77\x55\xa0\xbb\xa2\xe8\xae\x66\x74\x57\x17\xba\xab\x1f\xdd\x95\x44\x77\x4d\xa0\xbb\x72\xe8\xae\x02\xba\xab\x8c\xee\x8e\xa0\xbb\x1b\xd1\xdd\x1d\xe8\xee\x3e\x74\xf7\x30\xba\x3b\x8d\xee\x9e\x41\x77\xe7\xd1\xdd\x25\x74\x4f\x35\xba\xa7\x01\xdd\xd3\x8e\xee\x89\xa1\x7b\x12\xe8\x9e\x71\x74\x4f\x16\xdd\xb3\x88\xee\x59\x45\x39\xa1\x5c\x3d\xca\xb5\xa1\x5c\x2f\xca\x0d\xa1\x5c\x0a\xe5\x32\x28\x37\x8f\x72\x45\x74\x6f\x25\xba\xb7\x16\xdd\xdb\x82\xee\xed\x46\xf7\x0e\xa2\x7b\x47\xd1\xbd\x53\xe8\xde\x39\x74\xef\x32\xba\xaf\x02\xdd\x17\x45\xf7\x35\xa3\xfb\xba\xd0\x7d\x03\xe8\xbe\x11\x74\xdf\x24\xba\x6f\x16\xdd\xb7\x84\xee\x07\xdd\x5f\x83\xee\x6f\x42\xf7\x77\xa2\xfb\xfb\xd1\xfd\xc3\xe8\xfe\x34\xba\x7f\x06\xdd\x9f\x47\xf7\x97\xd0\x6c\x35\x9a\x6d\x40\xb3\xed\x68\x36\x86\x66\x13\x68\x76\x1c\xcd\x66\xd1\xec\x22\x9a\x5d\x45\x0f\x08\x3d\x50\x8f\x1e\x68\x43\x0f\xf4\xa2\x07\xe2\xe8\x81\x31\xf4\xc0\x34\x7a\x60\x01\x3d\xb0\x82\x1e\xac\x42\x0f\xd6\xa1\x07\x5b\xd1\x83\x3d\xe8\xc1\x21\xf4\xe0\x28\x7a\x70\x0a\x3d\x38\x87\x1e\x5c\x46\x0f\x55\xa0\x87\xa2\xe8\xa1\x66\xf4\x50\x17\x7a\x68\x00\x3d\x34\x82\x1e\x9a\x44\x0f\xcd\xa2\x87\x96\xd0\x1c\x68\xae\x06\xcd\x35\xa1\xb9\x4e\x34\xd7\x8f\xe6\x92\x68\x6e\x02\xcd\xe5\xd0\x5c\x01\xcd\x95\xd1\xc3\x11\xf4\x70\x23\x7a\xb8\x03\x3d\xdc\x87\x1e\x1e\x46\x0f\x8f\xa3\x87\xb3\xe8\xe1\x45\xf4\xf0\x2a\x7a\x44\xe8\x91\x7a\xf4\x48\x1b\x7a\xa4\x17\x3d\x12\x47\x8f\x8c\xa1\x47\xa6\xd1\x23\x0b\xe8\x91\x15\xf4\x68\x15\x7a\xb4\x0e\x3d\xda\x8a\x1e\xed\x41\x8f\x0e\xa1\x47\x53\xe8\xd1\x0c\x7a\x74\x1e\x3d\x5a\x44\xf3\x95\x68\xbe\x16\xcd\xb7\xa0\xf9\x6e\x34\x3f\x88\xe6\x47\xd1\xfc\x24\x9a\x9f\x45\xf3\x4b\xe8\x31\xd0\x63\x35\xe8\xb1\x26\xf4\x58\x27\x7a\xac\x1f\x3d\x96\x44\x8f\x4d\xa0\xc7\x72\xe8\xb1\x02\x7a\xac\x8c\x1e\x8f\xa0\xc7\x1b\xd1\xe3\x1d\xe8\xf1\x3e\xf4\xf8\x30\x7a\x3c\x8d\x1e\x9f\x41\x8f\xe7\xd1\xe3\x25\xf4\x44\x35\x7a\xa2\x01\x3d\xd1\x8e\x9e\x88\xa1\x27\x12\xe8\x89\x71\xf4\xc4\x34\x7a\x62\x01\x3d\xb1\x82\x16\xaa\xd0\x42\x1d\x5a\x68\x45\x0b\x3d\x68\x61\x08\x2d\xa4\xd0\x42\x06\x2d\xcc\xa3\x85\x22\x7a\xb2\x12\x3d\x59\x8b\x9e\x6c\x41\x4f\x76\xa3\x27\x07\xd1\x93\xa3\xe8\xc9\x29\xf4\xe4\x1c\x7a\x72\x19\x3d\x55\x81\x9e\x8a\xa2\xa7\x9a\xd1\x53\x5d\xe8\xa9\x01\xf4\xd4\x08\x7a\x6a\x12\x3d\x95\x43\x4f\x15\xd0\x53\x65\xf4\x74\x04\x3d\xdd\x88\x9e\xee\x40\x4f\xf7\xa1\xa7\x87\xd1\xd3\x69\xf4\xf4\x0c\x7a\x3a\x8f\x9e\x2e\xa1\xc5\x6a\xb4\xd8\x80\x16\xdb\xd1\x62\x0c\x2d\x26\xd0\xe2\x38\x5a\xcc\xa2\xc5\x45\xb4\xb8\x8a\x9e\x11\x7a\xa6\x1e\x3d\xd3\x86\x9e\xe9\x45\xcf\xc4\xd1\x33\x63\xe8\x99\x69\xf4\xcc\x3c\x7a\xa6\x88\x9e\xad\x44\xcf\xd6\xa2\x67\x5b\xd0\xb3\xdd\xe8\xd9\x41\xf4\xec\x28\x7a\x76\x0a\x3d\x3b\x87\x9e\x5d\x46\xcf\x55\xa0\xe7\xa2\xe8\xb9\x66\xf4\x5c\x17\x7a\x6e\x00\x3d\x37\x82\x9e\x9b\x44\xcf\xcd\xa2\xe7\x96\x50\x1e\x94\xaf\x41\xf9\x26\x94\xef\x44\xf9\x7e\x94\x4f\xa2\xfc\x04\xca\xe7\x50\x3e\x8f\xf2\x25\xf4\x7c\x35\x7a\xbe\x01\x3d\xdf\x8e\x9e\x8f\xa1\xe7\x13\xe8\xf9\x71\xf4\x7c\x16\x3d\xbf\x88\x9e\x5f\x45\x2f\x08\xbd\x50\x8f\x5e\x68\x43\x2f\xf4\xa2\x17\xe2\xe8\x85\x31\xf4\xc2\x34\x7a\x61\x01\xbd\xb0\x82\x5e\xac\x42\x2f\xd6\xa1\x17\x5b\xd1\x8b\x3d\xe8\xc5\x21\xf4\x62\x0a\xbd\x98\x41\x2f\xce\xa3\x17\x97\x51\xa1\x02\x15\xa2\xa8\xd0\x8c\x0a\x5d\xa8\x30\x80\x0a\x23\xa8\x30\x89\x0a\xb3\xa8\xb0\x84\x5e\x02\xbd\x54\x83\x5e\x6a\x42\x2f\x75\xa2\x97\xfa\xd1\x4b\x49\xf4\xd2\x04\x7a\x29\x87\x5e\x2a\xa0\x97\xca\xe8\xe5\x08\x7a\xb9\x11\xbd\xdc\x81\x5e\xee\x43\x2f\x0f\xa3\x97\xd3\xe8\xe5\x19\xf4\x72\x1e\xbd\xbc\x8a\x5e\x11\x7a\xa5\x1e\xbd\xd2\x86\x5e\xe9\x45\xaf\xc4\xd1\x2b\x63\xe8\x95\x69\xf4\xca\x02\x7a\x65\x05\x2d\x55\xa1\xa5\x3a\xb4\xd4\x8a\x96\x7a\xd0\xd2\x10\x5a\x4a\xa1\xa5\x0c\x5a\x9a\x47\x4b\x45\xf4\x6a\x25\x7a\xb5\x16\xbd\xda\x82\x5e\xed\x46\xaf\x0e\xa2\x57\x47\xd1\xab\x53\xe8\xd5\x39\xf4\xea\x32\x7a\x0d\xf4\x5a\x0d\x7a\xad\x09\xbd\xd6\x89\x5e\xeb\x47\xaf\x25\xd1\x6b\x13\xe8\xb5\x1c\x7a\xad\x80\x5e\x2b\xa3\xd7\x23\xe8\xf5\x46\xf4\x7a\x07\x7a\xbd\x0f\xbd\x3e\x8c\x5e\x4f\xa3\xd7\x67\xd0\xeb\x79\xf4\x7a\x09\x2d\x57\xa3\xe5\x06\xb4\xdc\x8e\x96\x63\x68\x39\x81\x96\xc7\xd1\x72\x16\x2d\x2f\xa2\xe5\x55\xf4\x46\x15\x7a\xa3\x0e\xbd\xd1\x8a\xde\xe8\x41\x6f\x0c\xa1\x37\x52\xe8\x8d\x0c\x7a\x63\x1e\xbd\x51\x44\x6f\x56\xa2\x37\x6b\xd1\x9b\x2d\xe8\xcd\x6e\xf4\xe6\x20\x7a\x73\x14\xbd\x39\x85\xde\x9c\x43\x6f\x2e\xa3\xb7\x2a\xd0\x5b\x51\xf4\x56\x33\x7a\xab\x0b\xbd\x35\x80\xde\x1a\x41\x6f\x4d\xa2\xb7\x66\xd1\x5b\x4b\xa8\x08\x2a\x46\x50\xb1\x11\x15\x3b\x50\xb1\x0f\x15\x87\x51\x31\x8d\x8a\x33\xa8\x98\x47\xc5\x12\x7a\xbb\x1a\xbd\xdd\x80\xde\x6e\x47\x6f\xc7\xd0\xdb\x09\xf4\xf6\x38\x7a\x3b\x8b\xde\x5e\x44\x6f\xaf\xa2\x77\x84\xde\xa9\x47\xef\xb4\xa1\x77\x7a\xd1\x3b\x71\xf4\xce\x18\x7a\x67\x1a\xbd\xb3\x80\xde\x59\x41\xef\x56\xa1\x77\x6b\xd1\xbb\x2d\xe8\xdd\x6e\xf4\xee\x20\x7a\x77\x14\xbd\x3b\x85\xde\x9d\x43\xef\x2e\xa3\x95\x0a\xb4\x12\x45\x2b\xcd\x68\xa5\x0b\xad\x0c\xa0\x95\x11\xb4\x32\x89\x56\x66\xd1\xca\x12\x7a\x0f\xf4\x5e\x0d\x7a\xaf\x09\xbd\xd7\x89\xde\xeb\x47\xef\x25\xd1\x7b\x13\xe8\xbd\x1c\x7a\xaf\x80\xde\x2b\xa3\xf7\x23\xe8\xfd\x06\xf4\x7e\x3b\x7a\x3f\x86\xde\x4f\xa0\xf7\xc7\xd1\xfb\x59\xf4\xfe\x22\x7a\x7f\x15\x7d\x20\xf4\x41\x3d\xfa\xa0\x0d\x7d\xd0\x8b\x3e\x88\xa3\x0f\xc6\xd0\x07\xd3\xe8\x83\x05\xf4\xc1\x0a\x5a\xad\x42\xab\x75\x68\xb5\x15\xad\xf6\xa0\xd5\x21\xb4\x9a\x42\xab\x19\xb4\x3a\x8f\x56\x8b\xe8\xc3\x4a\xf4\x61\x2d\xfa\xb0\x19\x7d\xd8\x85\x3e\x1c\x40\x1f\x8e\xa0\x0f\x27\xd1\x87\xb3\xe8\xc3\x25\xf4\x11\xe8\xa3\x1a\xf4\x51\x13\xfa\xa8\x13\x7d\xd4\x8f\x3e\x4a\xa2\x8f\x26\xd0\x47\x39\xf4\x51\x01\x7d\x54\x46\x1f\x47\xd0\xc7\x8d\xe8\xe3\x0e\xf4\x71\x1f\xfa\x78\x18\x7d\x9c\x46\x1f\xcf\xa0\x8f\xf3\xe8\xe3\x12\x2a\x55\xa3\x52\x03\x2a\xb5\xa1\x52\x2f\x2a\xc5\x51\x69\x0c\x95\xa6\x51\x69\x01\x95\x56\xd0\x27\x55\xe8\x93\x3a\xf4\x49\x2b\xfa\xa4\x07\x7d\x32\x84\x3e\x49\xa1\x4f\x32\xe8\x93\x79\xf4\x49\x11\x7d\x5a\x89\x3e\xad\x45\x9f\xb6\xa0\x4f\xbb\xd1\xa7\x83\xe8\xd3\x51\xf4\xe9\x14\xfa\x74\x0e\x7d\xba\x8c\x3e\xab\x40\x9f\x45\xd1\x67\xcd\xe8\xb3\x4e\xf4\x59\x3f\xfa\x2c\x89\x3e\x9b\x40\x9f\xe5\xd0\x67\x05\xf4\x59\x19\x95\x23\xa8\xdc\x88\xca\x1d\xa8\xdc\x87\xca\xc3\xa8\x9c\x46\xe5\x19\x54\xce\xa3\x72\x09\x7d\x5e\x8d\x3e\x6f\x40\x9f\xb7\xa3\xcf\x63\xe8\xf3\x04\xfa\x7c\x1c\x7d\x9e\x45\x9f\x2f\xa2\xcf\x57\xd1\x17\x42\x5f\xd4\xa3\x2f\xda\xd0\x17\x3d\xe8\x8b\x21\xf4\x45\x0a\x7d\x91\x41\x5f\xcc\xa3\x2f\x8a\xe8\xcb\x4a\xf4\x65\x2d\xfa\xb2\x05\x7d\xd9\x8d\xbe\x1c\x44\x5f\x8e\xa2\x2f\xa7\xd0\x97\x73\xe8\xcb\x65\x4c\x05\x26\x8a\x69\xc6\x74\x61\x06\x30\x23\x98\x49\xcc\x2c\x66\x09\xaf\x01\x5e\xa3\x06\xaf\xd1\x84\xd7\xe8\xc4\x6b\xf4\xe1\x35\x86\xf1\x1a\x69\xbc\xc6\x0c\x5e\x23\x8f\xd7\x28\xe1\x35\xab\xf1\x9a\x0d\x78\xcd\x76\xbc\x66\x0c\xaf\x99\xc0\x6b\x8e\xe3\x35\xb3\x78\xcd\x45\xbc\xe6\x2a\x5e\x4b\x78\xad\x7a\xbc\x56\x1b\x5e\xab\x17\xaf\x15\xc7\x6b\x8d\xe1\xb5\xa6\xf1\x5a\x0b\x78\xad\x15\x5c\x51\x85\x2b\xea\x70\x45\x2b\xae\xe8\xc1\x15\x83\xb8\x62\x14\x57\x4c\xe1\x8a\x39\x5c\xb1\x8c\xd7\xae\xc0\x6b\x47\xf1\xda\xcd\x78\xed\x2e\xbc\xf6\x00\x5e\x7b\x04\xaf\x3d\x89\xd7\x9e\xc5\x6b\x2f\xe1\x75\xc0\xeb\xd4\xe0\x75\x9a\xf0\x3a\x9d\x78\x9d\x7e\xbc\x4e\x12\xaf\x33\x81\xd7\xc9\xe1\x75\x0a\x78\x9d\x32\x5e\x37\x82\xd7\x6d\xc4\xeb\x76\xe0\x75\xfb\xf0\xba\x09\xbc\xee\x38\x5e\x37\x8b\xd7\x5d\xc4\xeb\xae\xe2\x4a\xe1\xca\x7a\x5c\xd9\x86\x2b\x7b\x71\x65\x1c\x57\x8e\xe1\xca\x69\x5c\xb9\x80\x2b\x57\xf0\x7a\x55\x78\xbd\x3a\xbc\x5e\x2b\x5e\xaf\x07\xaf\x37\x84\xd7\x4b\xe1\xf5\x32\x78\xbd\x79\xbc\x5e\x11\xaf\x5f\x89\xd7\xaf\xc5\xeb\xb7\xe0\xf5\xbb\xf1\xfa\x83\x78\xfd\x11\xbc\xfe\x24\x5e\x7f\x16\xaf\xbf\x84\x37\x00\x6f\x50\x83\x37\x68\xc2\x1b\x74\xe2\x0d\xfa\xf1\x06\x49\xbc\xc1\x04\xde\x20\x87\x37\x28\xe0\x0d\xca\xb8\x2a\x82\xab\x1a\x71\x55\x07\xae\xea\xc3\x55\xc3\xb8\x2a\x8d\xab\x66\x70\x55\x1e\x57\x95\xf0\x86\xd5\x78\xc3\x06\xbc\x61\x3b\xde\x30\x86\x37\x4c\xe0\x0d\xc7\xf0\x86\xd3\x78\xc3\x05\xbc\xe1\x0a\xde\xa8\x0a\x6f\x54\x87\x37\x6a\xc5\x1b\xf5\xe0\x8d\x86\xf0\x46\x29\xbc\x51\x06\x6f\x34\x8f\x37\x2a\xe2\x8d\x2b\xf1\xc6\xb5\x78\xe3\x16\xbc\x71\x37\xde\x78\x10\x6f\x3c\x8a\x37\x9e\xc2\x1b\xcf\xe1\x8d\x97\xb1\x2a\xb0\xa2\x58\xcd\x58\x5d\x58\x03\x58\x23\x58\x13\x58\x39\xac\x02\x56\x19\x3b\x82\xdd\x88\xdd\x81\xdd\x87\x3d\x8c\x9d\xc6\x9e\xc1\xce\x63\x97\x70\xa8\xc6\xa1\x01\x87\x76\x1c\x62\x38\x24\x70\x18\xc7\x21\x8b\xc3\x22\x0e\xab\x78\x13\xe1\x4d\xea\xf1\x26\x6d\x78\x93\x5e\xbc\x49\x1c\x6f\x32\x86\x37\xc9\xe0\x4d\xe6\xf1\x26\x45\x5c\x5d\x89\xab\x6b\x71\x75\x0b\xae\xee\xc6\xd5\x83\xb8\x7a\x14\x57\x4f\xe1\xea\x39\x5c\xbd\x8c\x37\xad\xc0\x9b\x46\xf1\xa6\xcd\x78\xd3\x2e\xbc\xe9\x00\xde\x74\x04\x6f\x3a\x89\x37\x9d\xc5\x9b\x2e\xe1\xcd\xc0\x9b\xd5\xe0\xcd\x9a\xf0\x66\x9d\x78\xb3\x7e\xbc\x59\x12\x6f\x36\x81\x37\x9b\xc1\x9b\xe5\xf1\x66\x25\xbc\x79\x35\xde\xbc\x01\x6f\xde\x8e\x37\x8f\xe1\xcd\x13\x78\xf3\x71\xbc\x79\x16\x6f\xbe\x88\x37\x5f\xc5\x11\xe1\x48\x3d\x8e\xb4\xe1\x48\x2f\x8e\xc4\x71\x64\x0c\x47\xa6\x71\x64\x01\x47\x56\xf0\x16\x55\x78\x8b\x3a\xbc\x45\x2b\xde\xa2\x07\x6f\x31\x84\xb7\x48\xe1\x2d\x32\x78\x8b\x39\xbc\xc5\x32\xde\xb2\x02\x6f\x19\xc5\x5b\x36\xe3\x2d\xbb\xf0\x96\x03\x78\xcb\x11\xbc\xe5\x24\xde\x72\x16\x6f\xb9\x84\xb7\x02\x6f\x55\x83\xb7\x6a\xc2\x5b\x75\xe2\xad\xfa\xf1\x56\x49\xbc\xd5\x04\xde\x2a\x87\xb7\x2a\xe0\xad\xca\xb8\x26\x82\x6b\x1a\x71\x4d\x07\xae\xe9\xc3\x35\xc3\xb8\x26\x8d\x6b\x66\x70\xcd\x22\xae\x59\xc5\x5b\x0b\x6f\x5d\x8f\xb7\x6e\xc3\x5b\xf7\xe2\xad\xe3\x78\xeb\x31\xbc\xf5\x34\xde\x7a\x01\x6f\xbd\x82\xb7\xa9\xc2\xdb\xd4\xe1\x6d\x5a\xf1\x36\x3d\x78\x9b\x21\xbc\x4d\x0a\x6f\x93\xc1\xdb\xcc\xe3\x6d\x8a\x78\xdb\x4a\xbc\x6d\x2d\xde\xb6\x05\x6f\xdb\x8d\xb7\x1d\xc4\xdb\x8e\xe2\x6d\xa7\xf0\xb6\x73\x78\xdb\x25\x1c\x05\x47\x6b\x70\xb4\x09\x47\x3b\x71\xb4\x1f\x47\x93\x38\x3a\x81\xa3\x39\x1c\x2d\xe0\x68\x19\x6f\x17\xc1\xdb\x35\xe2\xed\x3a\xf0\x76\x7d\x78\xbb\x61\xbc\x5d\x1a\x6f\x37\x83\xb7\xcb\xe3\xed\x4a\x78\xfb\x6a\xbc\x7d\x03\xde\xbe\x1d\x6f\x1f\xc3\xdb\x27\xf0\xf6\xe3\x78\xfb\x2c\xde\x7e\x11\x6f\xbf\x82\x77\xa8\xc2\x3b\xd4\xe1\x1d\x5a\xf1\x0e\x3d\x78\x87\x21\xbc\x43\x0a\xef\x90\xc1\x3b\xcc\xe3\x1d\x8a\xb8\xb6\x12\xd7\xd6\xe2\xda\x16\x5c\xdb\x8d\x6b\x07\x71\xed\x28\xae\x9d\xc2\xb5\x73\xb8\x76\x19\xef\x58\x81\x77\x8c\xe2\x1d\x9b\xf1\x8e\x5d\x78\xc7\x01\xbc\xe3\x08\xde\x71\x12\xef\x38\x8b\x77\x5c\xc2\x3b\x96\xf1\xff\x45\xf0\xff\x35\xe2\xff\xeb\xc0\xff\xd7\x87\xff\x6f\x18\xff\x5f\x1a\xff\xdf\x0c\xfe\xbf\x3c\xfe\xbf\x12\xfe\x4a\x35\xfe\x4a\x03\xfe\x4a\x3b\xfe\x4a\x0c\x7f\x25\x81\xbf\x32\x8e\xbf\x92\xc5\x5f\x59\xc4\x5f\x59\xc5\x75\xc2\x75\xf5\xb8\xae\x0d\xd7\xf5\xe2\xba\x38\xae\x1b\xc3\x75\xd3\xb8\x6e\x01\xd7\xad\xe0\xaf\x56\xe2\xaf\xd6\xe2\xaf\xb6\xe0\xaf\x76\xe3\xaf\x0e\xe2\xaf\x8e\xe2\xaf\x4e\xe1\xaf\xce\xe1\xaf\x2e\xe3\xaf\x55\xe0\xaf\x45\xf1\xd7\x9a\xf1\xd7\xba\xf0\xd7\x06\xf0\xd7\x46\xf0\xd7\x26\xf1\xd7\x66\xf1\xd7\x96\xf0\xd7\xc1\x5f\xaf\xc1\x5f\x6f\xc2\x5f\xef\xc4\x5f\xef\xc7\x5f\x4f\xe2\xaf\x4f\xe0\xaf\xe7\xf0\xd7\x0b\xf8\xeb\x65\x5c\x5f\x8d\xeb\x1b\x70\x7d\x3b\xae\x8f\xe1\xfa\x04\xae\x1f\xc7\xf5\x59\x5c\xbf\x88\xeb\x57\xf1\x37\x84\xbf\x51\x8f\xbf\xd1\x86\xbf\xd1\x8b\xbf\x11\xc7\xdf\x18\xc3\xdf\x98\xc6\xdf\x58\xc0\xdf\x58\xc1\xdf\xac\xc2\xdf\xac\xc3\xdf\x6c\xc5\xdf\xec\xc1\xdf\x1c\xc2\xdf\x4c\xe1\x6f\x66\xf0\x37\xe7\xf1\x37\x8b\xf8\x5b\x95\xf8\x5b\x51\xfc\xad\x66\xfc\xad\x2e\xfc\xad\x01\xfc\xad\x11\xfc\xad\x49\xfc\xad\x59\xfc\xad\x25\xdc\x00\x6e\xa8\xc1\x0d\x4d\xb8\xa1\x13\x37\xf4\xe3\x86\x24\x6e\x98\xc0\x0d\x39\xdc\x50\xc0\x0d\x65\xfc\xed\x08\xfe\x76\x23\xfe\x76\x07\xfe\x76\x1f\xfe\xf6\x30\xfe\x76\x1a\x7f\x7b\x06\x7f\x3b\x8f\xbf\x5d\xc2\xdf\xa9\xc6\xdf\xa9\xc7\xdf\x69\xc3\xdf\xe9\xc5\xdf\x89\xe3\xef\x8c\xe1\xef\x4c\xe3\xef\x2c\xe0\xef\xac\xe0\xef\x56\xe1\xef\xd6\xe1\xef\xb6\xe2\xef\xf6\xe0\xef\x0e\xe1\xef\xa6\xf0\x77\x33\xf8\xbb\xf3\xf8\xbb\x45\xdc\x58\x89\x1b\x6b\x71\x63\x0b\x6e\xec\xc6\x8d\x83\xb8\x71\x14\x37\x4e\xe1\xc6\x39\xdc\xb8\x8c\xbf\x57\x81\xbf\x17\xc5\xdf\x6b\xc2\xdf\xeb\xc4\xdf\xeb\xc7\xdf\x4b\xe2\xef\x4d\xe0\xef\xe5\xf0\xf7\x0a\xf8\x7b\x65\xfc\xfd\x08\xfe\x7e\x23\xfe\x7e\x07\xfe\x7e\x1f\xfe\xfe\x30\xfe\x7e\x1a\x7f\x7f\x06\x7f\x3f\x8f\xbf\x5f\xc2\x3f\xa8\xc6\x3f\x68\xc0\x3f\x68\xc7\x3f\x88\xe1\x1f\x24\xf0\x0f\xc6\xf1\x0f\xb2\xf8\x07\x8b\xf8\x07\xab\xb8\x49\xb8\xa9\x1e\x37\xb5\xe2\xa6\x1e\xdc\x34\x84\x9b\x52\xb8\x29\x83\x9b\xe6\x71\x53\x11\xff\xb0\x12\xff\xb0\x16\xff\xb0\x05\xff\xb0\x1b\xff\x70\x10\xff\x70\x14\xff\x70\x0a\xff\x70\x0e\xff\x70\x19\xff\xa8\x02\xff\x28\x8a\x7f\xd4\x8c\x7f\xd4\x85\x7f\x34\x80\x7f\x34\x82\x7f\x34\x89\x7f\x34\x8b\x7f\xb4\x84\x7f\x0c\xfe\x71\x0d\xfe\x71\x13\xfe\x71\x07\xfe\x71\x1f\xfe\xf1\x30\xfe\x71\x1a\xff\x78\x06\xff\x38\x8f\x7f\x5c\xc2\xcd\xd5\xb8\xb9\x01\x37\xb7\xe3\xe6\x18\x6e\x4e\xe0\xe6\x71\xdc\x9c\xc5\xcd\x8b\xb8\x79\x15\xff\x44\xf8\x27\xf5\xf8\x27\x6d\xf8\x27\xbd\xf8\x27\x71\xfc\x93\x31\xfc\x93\x69\xfc\x93\x05\xfc\x93\x15\xfc\xd3\x2a\xfc\xd3\x3a\xfc\xd3\x56\xfc\xd3\x6e\xfc\xd3\x41\xfc\xd3\x51\xfc\xd3\x29\xfc\xd3\x39\xfc\xd3\x65\xfc\xb3\x0a\xfc\xb3\x28\xfe\x59\x33\xfe\x59\x17\xfe\xd9\x00\xfe\xd9\x08\xfe\xd9\x24\xfe\xd9\x2c\xfe\xd9\x12\x6e\x01\xb7\xd4\xe0\x96\x26\xdc\xd2\x89\x5b\xfa\x71\x4b\x12\xb7\x4c\xe0\x96\x1c\x6e\x29\xe0\x96\x32\xfe\x79\x04\xff\xbc\x11\xff\xbc\x03\xff\x3c\x86\x7f\x9e\xc0\x3f\x1f\xc7\x3f\xcf\xe2\x9f\x2f\xe2\x9f\xaf\xe2\x5f\x08\xff\xa2\x1e\xff\xa2\x0d\xff\xa2\x17\xff\x22\x8e\x7f\x31\x86\x7f\x31\x8d\x7f\xb1\x80\x7f\xb1\x82\x7f\x59\x85\x7f\x59\x87\x7f\xd9\x8a\x7f\xd9\x83\x7f\x39\x84\x7f\x99\xc2\xbf\xcc\xe0\x5f\xce\xe3\x5f\x16\x71\x6b\x25\x6e\xad\xc5\xad\x2d\xb8\xb5\x1b\xb7\x0e\xe0\xd6\x11\xdc\x3a\x89\x5b\x67\x71\xeb\x12\xde\x09\xbc\x53\x0d\xde\xa9\x09\xef\xd4\x89\x77\xea\xc7\x3b\x25\xf1\x4e\x13\x78\xa7\x1c\xde\xa9\x80\x77\x2a\xe3\x5f\x45\xf0\xaf\x1a\xf1\xaf\x3a\xf0\xaf\xfa\xf0\xaf\x86\xf1\xaf\xd2\xf8\x57\x33\xf8\x57\x79\xfc\xab\x12\xfe\x75\x35\xfe\x75\x03\xfe\x75\x3b\xfe\x75\x0c\xff\x3a\x8e\x7f\x3d\x86\x7f\x3d\x8d\x7f\xbd\x80\x7f\xbd\x82\xdb\xaa\x70\x5b\x1d\x6e\x6b\xc5\x6d\x3d\xb8\x6d\x08\xb7\xa5\x70\x5b\x06\xb7\xcd\xe3\xb6\x22\xfe\x4d\x25\xfe\x4d\x2d\xfe\x4d\x0b\xfe\x4d\x37\xfe\xcd\x20\xfe\xcd\x28\xfe\xcd\x14\xfe\xcd\x1c\xfe\xcd\x32\xde\xb9\x02\xef\x1c\xc5\x3b\x37\xe3\x9d\xbb\xf0\xce\x03\x78\xe7\x24\xde\x79\x02\xef\x9c\xc3\x3b\x17\xf0\xce\x65\xfc\xdb\x08\xfe\x6d\x23\xfe\x6d\x07\xfe\x6d\x1f\xfe\xed\x30\xfe\x6d\x1a\xff\x76\x06\xff\x36\x8f\x7f\x5b\xc2\xed\xd5\xb8\xbd\x01\xb7\xb7\xe3\xf6\x18\x6e\x4f\xe0\xf6\x71\xdc\x9e\xc5\xed\x8b\xb8\x7d\x15\xff\x4e\xf8\x77\xf5\xf8\x77\x6d\xf8\x77\xbd\xf8\x77\x71\xfc\xbb\x14\xfe\x5d\x06\xff\x6e\x1e\xff\xae\x88\x7f\x5f\x89\x7f\x5f\x8b\x7f\xdf\x82\x7f\xdf\x8d\x7f\x3f\x88\x7f\x3f\x8a\x7f\x3f\x85\x7f\x3f\x87\x7f\xbf\x8c\xff\x50\x81\xff\x10\xc5\x7f\x68\xc6\x7f\xe8\xc2\x7f\x18\xc0\x7f\x18\xc1\x7f\x98\xc4\x7f\x98\xc5\x7f\x58\xc2\x1d\xe0\x8e\x1a\xdc\xd1\x84\x3b\x3a\x71\x47\x3f\xee\x48\xe2\x8e\x34\xee\x98\xc1\x1d\x79\xdc\x51\xc2\x7f\xac\xc6\x7f\x6c\xc0\x7f\x6c\xc7\x7f\x8c\xe1\x3f\x26\xf0\x1f\xc7\xf1\x1f\xb3\xf8\x8f\x8b\xf8\x8f\xab\xf8\x4f\xc2\x7f\xaa\xc7\x7f\x6a\xc3\x7f\xea\xc5\x7f\x8a\xe3\x3f\x8d\xe1\x3f\x4d\xe3\x3f\x2d\xe0\x3f\xad\xe0\x3f\x57\xe1\x3f\xd7\xe1\x3f\xb7\xe2\x3f\xf7\xe0\x3f\x0f\xe1\x3f\xa7\xf0\x9f\xa7\xf0\x9f\xe7\xf0\x9f\x97\x71\x67\x05\xee\x8c\xe2\xce\x66\xdc\xd9\x85\x3b\x07\x70\xe7\x08\xee\x9c\xc4\x9d\xb3\xb8\x73\x09\xef\x02\xde\xa5\x06\xef\xd2\x84\x77\xe9\xc4\xbb\xf4\xe3\x5d\x92\x78\x97\x09\xbc\x4b\x0e\xef\x52\xc0\xbb\x94\xf1\x5f\x22\xf8\x2f\x8d\xf8\x2f\x1d\xf8\x2f\x7d\xf8\x2f\xc3\xf8\x2f\x69\xfc\x97\x2c\xfe\xcb\x22\xfe\xcb\x2a\xfe\xab\xf0\x5f\xeb\xf1\x5f\xdb\xf0\x5f\x7b\xf1\x5f\xe3\xf8\xaf\x63\xf8\xaf\xd3\xf8\xaf\x0b\xf8\xaf\x2b\xb8\xab\x0a\x77\xd5\xe1\xae\x56\xdc\xd5\x83\xbb\x86\x70\x57\x0a\x77\x65\x70\xd7\x3c\xee\x2a\xe2\xbf\x55\xe2\xbf\xd5\xe2\xbf\xb5\xe0\xbf\x75\xe3\xbf\x0d\xe2\xbf\x8d\xe2\xbf\x4d\xe1\xbf\xcd\xe2\xbf\x2d\xe1\x5d\xc1\xbb\xd6\xe0\x5d\x9b\xf0\xae\x9d\x78\xd7\x7e\xbc\x6b\x12\xef\x3a\x81\x77\xcd\xe1\x5d\x0b\x78\xd7\x32\xfe\x7b\x04\xff\xbd\x11\xff\xbd\x03\xff\xbd\x0f\xff\x7d\x18\xff\x3d\x8d\xff\x3e\x83\xff\x9e\xc7\x7f\x2f\xe1\xee\x6a\xdc\xdd\x80\xbb\xdb\x71\x77\x0c\x77\x27\x70\xf7\x38\xee\xce\xe2\xee\x05\xdc\xbd\x82\xff\x51\x85\xff\x51\x87\xff\xd1\x8a\xff\xd1\x83\xff\x31\x84\xff\x91\xc2\xff\xc8\xe0\x7f\xcc\xe3\x7f\x14\xf1\x3f\x2b\xf1\x3f\x6b\xf1\x3f\x5b\xf0\x3f\xbb\xf1\x3f\x07\xf1\x3f\x47\xf1\x3f\xa7\xf0\x3f\xe7\xf0\x3f\x97\xf1\x6e\x15\x78\xb7\x28\xde\xad\x19\xef\xd6\x85\x77\x1b\xc0\xbb\x8d\xe0\xdd\x26\xf1\x6e\xb3\x78\xb7\x02\xde\xad\x8c\x7b\x22\xb8\xa7\x11\xf7\x74\xe0\x9e\x3e\xdc\x33\x8c\x7b\xd2\xb8\x67\x06\xf7\xe4\x71\x4f\x09\xff\xab\x1a\xff\xab\x01\xff\xab\x1d\xff\x2b\x86\xff\x95\xc0\xff\x1a\xc7\xff\xca\xe2\x7f\x2d\xe2\x7f\xad\xe2\x7f\x0b\xff\xbb\x1e\xff\xbb\x0d\xff\xbb\x17\xff\x3b\x8e\xff\x3d\x86\xff\x3d\x8d\xff\xbd\x80\xff\x5d\xc4\xff\xa9\xc4\xff\xa9\xc5\xff\x69\xc1\xff\xe9\xc6\xff\x19\xc4\xff\x19\xc5\xff\x99\xc2\xff\x99\xc3\xff\x59\xc6\xbd\x15\xb8\x37\x8a\x7b\x9b\x71\x6f\x17\xee\x1d\xc0\xbd\x23\xb8\x77\x12\xf7\xce\xe2\xde\x25\xbc\x3b\x78\xf7\x1a\xbc\x7b\x13\xde\xbd\x13\xef\xde\x8f\x77\x4f\xe2\xdd\x27\xf0\xee\x39\xbc\x7b\x01\xef\x5e\xc2\xff\xad\xc6\xff\x6d\xc0\xff\x6d\xc7\xff\x8d\xe1\xff\x26\xf0\x7f\xc7\xf1\x7f\xb3\xf8\xbf\x8b\xf8\xbf\xab\xf8\x7f\xc2\xff\xab\xc7\xff\x6b\xc3\xff\xeb\xc5\xff\x8b\xe3\xff\x8d\xe1\xff\x4d\xe3\xff\x2d\xe0\xff\xad\xe0\x58\x15\x8e\xd5\xe1\x58\x2b\x8e\xf5\xe0\xd8\x10\x8e\xa5\x70\x2c\x83\x63\xf3\x38\x56\xc4\x7b\x54\xe0\x3d\xa2\x78\x8f\x66\xbc\x47\x17\xde\x63\x00\xef\x31\x82\xf7\x98\xc4\x7b\xcc\xe2\x3d\x96\xf0\x9e\xe0\x3d\x6b\xf0\x9e\x4d\x78\xcf\x4e\xbc\x67\x3f\xde\x33\x89\xf7\x9c\xc0\x7b\xe6\xf0\x9e\x05\xbc\x67\x19\xef\x15\xc1\x7b\x35\xe2\xbd\x3a\xf0\x5e\x7d\x78\xaf\x61\xbc\x57\x1a\xef\x35\x83\xf7\xca\xe3\xbd\x4a\xb8\x4f\xb8\xaf\x1e\xf7\xb5\xe1\xbe\x5e\xdc\x17\xc7\x7d\x63\xb8\x6f\x1a\xf7\x2d\xe0\xbe\x15\xbc\x77\x15\xde\xbb\x0e\xef\xdd\x8a\xf7\xee\xc1\x7b\x0f\xe1\xbd\x53\x78\xef\x0c\xde\x7b\x1e\xef\x5d\xc4\xfb\x54\xe2\x7d\x6a\xf1\x3e\x2d\x78\x9f\x6e\xbc\xcf\x20\xde\x67\x14\xef\x33\x85\xf7\x99\xc3\xfb\x2c\xe3\x7d\x2b\xf0\xbe\x35\x78\xdf\x26\xbc\x6f\x27\xde\xb7\x1f\xef\x9b\xc4\xfb\x4e\xe0\x7d\x73\x78\xdf\x02\xde\xb7\x8c\xfb\x23\xb8\xbf\x11\xf7\x77\xe0\xfe\x3e\xdc\x3f\x8c\xfb\xd3\xb8\x7f\x06\xf7\xe7\x71\x7f\x09\xef\x57\x8d\xf7\x6b\xc0\xfb\xb5\xe3\xfd\x62\x78\xbf\x04\xde\x6f\x1c\xef\x97\xc5\xfb\x2d\xe2\xfd\x56\xf1\xfe\xc2\xfb\xd7\xe1\xfd\x5b\xf1\xfe\x3d\x78\xff\x21\xbc\x7f\x0a\xef\x9f\xc1\xfb\xcf\xe3\xfd\x8b\xf8\x80\x4a\x7c\x40\x2d\x3e\xa0\x05\x1f\xd0\x8d\x0f\x18\xc4\x07\x8c\xe2\x03\xa6\xf0\x01\x73\xf8\x80\x65\x3c\x50\x81\x07\xa2\x78\xa0\x19\x0f\x74\xe1\x81\x01\x3c\x30\x82\x07\x26\xf1\xc0\x2c\x1e\x58\xc2\x07\x82\x0f\xac\xc1\x07\x36\xe2\x03\x3b\xf0\x81\x7d\xf8\xc0\x61\x7c\x60\x1a\x1f\x38\x83\x0f\xcc\xe3\x03\x4b\xf8\xa0\x6a\x7c\x50\x03\x3e\xa8\x1d\x1f\x14\xc3\x07\x25\xf0\x41\xe3\xf8\xa0\x2c\x3e\x68\x11\x1f\xb4\x8a\x0f\x16\x3e\xb8\x1e\x1f\xdc\x86\x0f\xee\xc5\x07\xc7\xf1\xc1\x63\xf8\xe0\x69\x7c\xf0\x02\x3e\x78\x05\x0f\x56\xe1\xc1\x3a\x3c\xd8\x82\x07\xbb\xf1\xe0\x20\x1e\x1c\xc5\x83\x53\x78\x70\x0e\x0f\x2e\xe3\x43\x2a\xf0\x21\x51\x7c\x48\x33\x3e\xa4\x0b\x1f\x32\x80\x0f\x19\xc1\x87\x4c\xe2\x43\x66\xf1\x21\x4b\xf8\x50\xf0\xa1\x35\xf8\xd0\x26\x7c\x68\x27\x3e\xb4\x1f\x1f\x9a\xc4\x87\x4e\xe0\x43\x73\xf8\xd0\x02\x3e\xb4\x8c\x0f\x8b\xe0\xc3\x1a\xf1\x61\xed\xf8\xb0\x18\x3e\x2c\x81\x0f\x1b\xc7\x87\x65\xf1\x61\x8b\xf8\xb0\x55\x3c\x24\x3c\x54\x8f\x87\xda\xf0\x50\x2f\x1e\x8a\xe3\xa1\x31\x3c\x34\x8d\x87\x16\xf0\xd0\x0a\x3e\xbc\x0a\x1f\x5e\x87\x0f\x6f\xc5\x87\xf7\xe0\xc3\x87\xf0\xe1\x29\x7c\x78\x06\x1f\x3e\x8f\x0f\x2f\xe2\x23\x2a\xf1\x11\xb5\xf8\x88\x16\x7c\x44\x17\x3e\x62\x00\x1f\x31\x82\x8f\x98\xc4\x47\xcc\xe2\x23\x96\xf0\x91\xe0\x23\x6b\xf0\x91\x4d\xf8\xc8\x4e\x7c\x64\x3f\x3e\x32\x89\x8f\x9c\xc0\x47\xe6\xf0\x91\x05\x7c\x64\x19\xc7\x23\x38\xde\x88\xe3\x1d\x38\xde\x87\xe3\xc3\x38\x9e\xc6\xf1\x19\x1c\xcf\xe3\x78\x09\x1f\x55\x8d\x8f\x6a\xc0\x47\xb5\xe3\xa3\x7a\xf1\x51\x71\x7c\xd4\x18\x3e\x6a\x1a\x1f\xb5\x80\x8f\x5a\xc1\x47\x57\xe1\xa3\xeb\xf0\xd1\xad\xf8\xe8\x1e\x7c\xf4\x10\x3e\x3a\x85\x8f\xce\xe0\xa3\xe7\xf1\xd1\x45\x7c\x4c\x25\x3e\xa6\x16\x1f\xd3\x82\x8f\xe9\xc6\xc7\x0c\xe2\x63\x46\xf1\x31\x53\xf8\x98\x39\x7c\xcc\x32\x4e\x54\xe0\x44\x14\x27\x9a\x71\xa2\x0b\x27\xfa\x71\x22\x89\x13\x13\x38\x91\xc3\x89\x02\x4e\x94\xf1\xb1\x11\x7c\x6c\x23\x3e\xb6\x03\x1f\xdb\x87\x8f\x1d\xc6\xc7\xa6\xf1\xb1\x33\xf8\xd8\x3c\x3e\xb6\x84\x8f\xab\xc6\xc7\x35\xe0\xe3\xda\xf1\x71\x31\x7c\x5c\x02\x1f\x37\x8e\x8f\xcb\xe2\xe3\x16\xf1\x71\xab\xf8\x78\xe1\xe3\xeb\xf1\xf1\x6d\xf8\xf8\x5e\x7c\xfc\x10\x3e\x3e\x85\x8f\xcf\xe0\xe3\xe7\xf1\xf1\x45\x3c\x5c\x89\x87\x6b\xf1\x70\x0b\x1e\xee\xc6\xc3\x83\x78\x78\x14\x0f\x4f\xe1\xe1\x39\x3c\xbc\x8c\x4f\xa8\xc0\x27\x44\xf1\x09\xcd\xf8\x84\x2e\x7c\xc2\x00\x3e\x61\x04\x9f\x30\x89\x4f\x98\xc5\x27\x2c\xe1\x13\xc1\x27\xd6\xe0\x13\x9b\xf0\x89\x9d\xf8\xc4\x7e\x7c\xe2\x30\x3e\x31\x8d\x4f\x9c\xc1\x27\xe6\xf1\x89\x25\x7c\x52\x35\x3e\xa9\x01\x9f\xd4\x8e\x4f\x8a\xe1\x93\x12\xf8\xa4\x71\x7c\x52\x16\x9f\xb4\x88\x4f\x5a\xc5\x49\xe1\x64\x3d\x4e\xb6\xe1\x64\x2f\x4e\xc6\x71\x72\x0c\x27\xa7\x71\x72\x01\x27\x57\xf0\xc9\x55\xf8\xe4\x3a\x7c\x72\x2b\x3e\xb9\x07\x9f\x3c\x84\x4f\x1e\xc5\x27\x4f\xe1\x93\xe7\xf0\xc9\xcb\xf8\x94\x0a\x7c\x4a\x14\x9f\xd2\x8c\x4f\xe9\xc2\xa7\x0c\xe0\x53\x46\xf0\x29\x93\xf8\x94\x59\x7c\xca\x12\x3e\x15\x7c\x6a\x0d\x3e\xb5\x09\x9f\xda\x89\x4f\xed\xc7\xa7\x26\xf1\xa9\x13\xf8\xd4\x1c\x3e\xb5\x80\x4f\x2d\xe3\x91\x08\x1e\x69\xc4\x23\x1d\x78\xa4\x0f\x8f\x0c\xe3\x91\x71\x3c\x92\xc5\x23\x8b\x78\x64\x15\x9f\x26\x7c\x5a\x3d\x3e\xad\x0d\x9f\xd6\x8b\x4f\x8b\xe3\xd3\xc6\xf0\x69\xd3\xf8\xb4\x05\x7c\xda\x0a\x3e\xbd\x0a\x9f\x5e\x87\x4f\x6f\xc5\xa7\xf7\xe0\xd3\x87\xf0\xe9\x29\x7c\x7a\x06\x9f\x3e\x8f\x4f\x2f\xe2\x33\x2a\xf1\x19\xb5\xf8\x8c\x16\x7c\x46\x37\x3e\x63\x10\x9f\x31\x8a\xcf\x98\xc4\x67\xcc\xe2\x33\x96\xf0\x28\x78\xb4\x06\x8f\x36\xe1\xd1\x4e\x3c\xda\x8f\x47\x93\x78\x74\x02\x8f\xe6\xf0\x68\x01\x8f\x96\xf1\x99\x11\x7c\x66\x23\x3e\xb3\x03\x9f\xd9\x87\xcf\x1c\xc6\x67\xa6\xf1\x99\x33\xf8\xcc\x3c\x3e\xb3\x84\xcf\xaa\xc6\x67\x35\xe0\xb3\xda\xf1\x59\x31\x7c\x56\x02\x9f\x35\x8e\xcf\x9a\xc6\x67\x2d\xe0\xb3\x56\xf0\xd9\x55\xf8\xec\x3a\x7c\x76\x2b\x3e\xbb\x07\x9f\x3d\x84\xcf\x4e\xe1\xb3\x33\xf8\xec\x79\x7c\x76\x11\xa7\x2a\x71\xaa\x16\xa7\x5a\x70\xaa\x1b\xa7\x06\x71\x6a\x14\xa7\xa6\x70\x6a\x0e\xa7\x96\xf1\x39\x15\xf8\x9c\x28\x3e\xa7\x19\x9f\xd3\x85\xcf\x19\xc0\xe7\x8c\xe0\x73\x26\xf1\x39\x39\x7c\x4e\x01\x9f\x53\xc6\xe7\x46\xf0\xb9\x8d\xf8\xdc\x0e\x7c\x6e\x1f\x3e\x77\x18\x9f\x9b\xc6\xe7\xce\xe0\x73\xf3\xf8\xdc\x12\x3e\xaf\x1a\x9f\xd7\x80\xcf\x6b\xc7\xe7\xc5\xf0\x79\x09\x7c\xde\x38\x3e\x2f\x8b\xcf\x5b\xc4\xe7\xad\xe2\x31\xe1\xb1\x7a\x3c\xd6\x86\xc7\x7a\xf1\x58\x1c\x8f\x8d\xe1\xb1\x69\x3c\x36\x8f\xc7\x8a\xf8\xfc\x4a\x7c\x7e\x2d\x3e\xbf\x05\x9f\xdf\x8d\xcf\x1f\xc4\xe7\x8f\xe2\xf3\xa7\xf0\xf9\x73\xf8\xfc\x65\x7c\x41\x05\xbe\x20\x8a\x2f\x68\xc6\x17\x74\xe1\x0b\x06\xf0\x05\x23\xf8\x82\x49\x7c\xc1\x2c\xbe\x60\x09\x5f\x08\xbe\xb0\x06\x5f\xd8\x84\x2f\xec\xc4\x17\xf6\xe3\x0b\x93\xf8\xc2\x09\x7c\x61\x0e\x5f\x98\xc7\x17\x96\xf0\x78\x35\x1e\x6f\xc0\xe3\xed\x78\x3c\x86\xc7\x13\x78\x7c\x1c\x8f\x67\xf1\xf8\x22\x1e\x5f\xc5\x17\x09\x5f\x54\x8f\x2f\x6a\xc3\x17\xf5\xe2\x8b\xe2\xf8\xa2\x31\x7c\xd1\x34\xbe\x68\x01\x5f\xb4\x82\x2f\xae\xc2\x17\xd7\xe1\x8b\x5b\xf1\xc5\x3d\xf8\xe2\x21\x7c\x71\x0a\x5f\x9c\xc1\x17\xcf\xe3\x8b\x97\xf1\x25\x15\xf8\x92\x28\xbe\xa4\x19\x5f\xd2\x85\x2f\x19\xc0\x97\x8c\xe0\x4b\x26\xf1\x25\xb3\xf8\x92\x25\x9c\x06\xa7\x6b\x70\xba\x09\xa7\x3b\x71\xba\x1f\xa7\x93\x38\x3d\x81\xd3\x39\x9c\x2e\xe0\x74\x19\x5f\x1a\xc1\x97\x36\xe2\x4b\x3b\xf0\xa5\x7d\xf8\xd2\x61\x7c\x69\x1a\x5f\x3a\x83\x2f\xcd\xe3\x4b\x57\xf1\x65\xc2\x97\xd5\xe3\xcb\xda\xf0\x65\xbd\xf8\xb2\x38\xbe\x6c\x0c\x5f\x36\x8d\x2f\x5b\xc0\x97\xad\xe0\xcb\xab\xf0\xe5\x75\xf8\xf2\x56\x7c\x79\x0f\xbe\x7c\x08\x5f\x9e\xc2\x97\x67\xf0\xe5\xf3\xf8\xf2\x22\x9e\xa8\xc4\x13\xb5\x78\xa2\x05\x4f\x74\xe3\x89\x41\x3c\x31\x8a\x27\xa6\xf0\xc4\x1c\x9e\x58\xc6\x57\x80\xaf\xa8\xc1\x57\x34\xe1\x2b\x3a\xf1\x15\xfd\xf8\x8a\x24\xbe\x62\x02\x5f\x91\xc3\x57\x14\xf0\x15\x65\x7c\x65\x04\x5f\xd9\x88\xaf\xec\xc0\x57\xf6\xe1\x2b\x87\xf1\x95\x69\x7c\xe5\x0c\xbe\x32\x8f\xaf\x2c\xe1\xab\xaa\xf1\x55\x0d\xf8\xaa\x76\x7c\x55\x0c\x5f\x95\xc0\x57\x8d\xe3\xab\xb2\xf8\xaa\x45\x7c\xd5\x2a\x9e\xac\xc2\x93\x75\x78\xb2\x15\x4f\xf6\xe0\xc9\x21\x3c\x99\xc2\x93\x19\x3c\x39\x8f\x27\x8b\xf8\xea\x4a\x7c\x75\x2d\xbe\xba\x05\x5f\xdd\x8d\xaf\x1e\xc4\x57\x8f\xe2\xab\xa7\xf0\xd5\x73\xf8\xea\x65\x7c\x4d\x05\xbe\x26\x8a\xaf\x69\xc6\xd7\x74\xe1\x6b\x06\xf0\x35\x23\xf8\x9a\x49\x7c\xcd\x2c\xbe\x66\x09\x5f\x0b\xbe\x36\x82\xaf\x6d\xc4\xd7\x76\xe0\x6b\xfb\xf0\xb5\xc3\xf8\xda\x34\xbe\x76\x06\x5f\x9b\xc7\xd7\x96\xf0\x54\x35\x9e\x6a\xc0\x53\xed\x78\x2a\x86\xa7\x12\x78\x6a\x1c\x4f\x65\xf1\xd4\x22\x9e\x5a\xc5\xd7\x09\x5f\x57\x8f\xaf\x6b\xc3\xd7\xf5\xe2\xeb\xe2\xf8\xba\x31\x7c\xdd\x34\xbe\x6e\x01\x5f\xb7\x82\xaf\xaf\xc2\xd7\xd7\xe2\xeb\x5b\xf0\xf5\xdd\xf8\xfa\x41\x7c\xfd\x28\xbe\x7e\x0a\x5f\x3f\x87\xaf\x5f\xc6\x37\x54\xe0\x1b\xa2\xf8\x86\x66\x7c\x43\x17\xbe\x61\x00\xdf\x30\x82\x6f\x98\xc4\x37\xcc\xe2\x1b\x96\x70\x06\x9c\xa9\xc1\x99\x26\x9c\xe9\xc4\x99\x7e\x9c\x49\xe2\xcc\x04\xce\xe4\x70\xa6\x80\x33\x65\x7c\x63\x04\xdf\xd8\x80\x6f\x6c\xc7\x37\xc6\xf0\x8d\x09\x7c\xe3\x38\xbe\x31\x8b\x6f\x5c\xc4\x37\xae\xe2\x9b\x84\x6f\xaa\xc7\x37\xb5\xe1\x9b\x7a\xf1\x4d\x71\x7c\xd3\x18\xbe\x69\x1a\xdf\xb4\x80\x6f\x5a\xc1\x37\x57\xe1\x9b\xeb\xf0\xcd\xad\xf8\xe6\x1e\x7c\xf3\x10\xbe\x39\x85\x6f\xce\xe0\x9b\xe7\xf1\xcd\x45\x3c\x5d\x89\xa7\x6b\xf1\x74\x33\x9e\xee\xc2\xd3\x03\x78\x7a\x04\x4f\x4f\xe2\xe9\x59\x3c\xbd\x84\x6f\x01\xdf\x52\x83\x6f\x69\xc2\xb7\x74\xe2\x5b\xfa\xf1\x2d\x49\x7c\xcb\x04\xbe\x25\x87\x6f\x29\xe0\x5b\xca\xf8\xd6\x08\xbe\xb5\x11\xdf\xda\x81\x6f\xed\xc3\xb7\x0e\xe3\x5b\xd3\xf8\xd6\x19\x7c\x6b\x1e\xdf\x5a\xc2\xb7\x55\xe3\xdb\x1a\xf0\x6d\x6d\xf8\xb6\x5e\x7c\x5b\x1c\xdf\x36\x86\x6f\x9b\xc6\xb7\x2d\xe0\xdb\x56\x70\xb6\x0a\x67\xeb\x70\xb6\x15\x67\x7b\x70\x76\x08\x67\x53\x38\x9b\xc1\xd9\x79\x9c\x2d\xe2\xdb\x2b\xf1\xed\xb5\xf8\xf6\x16\x7c\x7b\x37\xbe\x7d\x10\xdf\x3e\x8a\x6f\x9f\xc2\xb7\xcf\xe1\xdb\x97\xf1\x1d\x15\xf8\x8e\x28\xbe\xa3\x19\xdf\xd1\x89\xef\xe8\xc7\x77\x24\xf1\x1d\x13\xf8\x8e\x1c\xbe\xa3\x80\xef\x28\xe3\x3b\x23\xf8\xce\x46\x7c\x67\x07\xbe\xb3\x0f\xdf\x39\x8c\xef\x4c\xe3\x3b\x67\xf0\x9d\x79\x7c\x67\x09\xcf\x54\xe3\x99\x06\x3c\xd3\x8e\x67\x62\x78\x26\x81\x67\xc6\xf1\x4c\x16\xcf\x2c\xe2\x99\x55\x7c\x97\xf0\x5d\xf5\xf8\xae\x36\x7c\x57\x0f\xbe\x6b\x08\xdf\x95\xc2\x77\x65\xf0\x5d\xf3\xf8\xae\x22\xbe\xbb\x12\xdf\x5d\x8b\xef\x6e\xc1\x77\x77\xe3\xbb\x07\xf1\xdd\xa3\xf8\xee\x29\x7c\xf7\x1c\xbe\x7b\x19\xdf\x53\x81\xef\x89\xe2\x7b\x9a\xf1\x3d\x5d\xf8\x9e\x01\x7c\xcf\x08\xbe\x67\x12\xdf\x33\x8b\xef\x59\xc2\x39\x70\xae\x06\xe7\x9a\x70\xae\x13\xe7\xfa\x70\x6e\x18\xe7\xd2\x38\x37\x83\x73\x79\x9c\x2b\xe1\x7b\xab\xf1\xbd\x0d\xf8\xde\x76\x7c\x6f\x0c\xdf\x9b\xc0\xf7\x8e\xe3\x7b\xb3\xf8\xde\x45\x7c\xef\x2a\xbe\x4f\xf8\xbe\x7a\x7c\x5f\x1b\xbe\xaf\x17\xdf\x17\xc7\xf7\x8d\xe1\xfb\xa6\xf1\x7d\x0b\xf8\xbe\x15\x7c\x7f\x15\xbe\xbf\x0e\xdf\xdf\x8a\xef\xef\xc1\xf7\x0f\xe2\xfb\x47\xf1\xfd\x53\xf8\xfe\x39\x7c\xff\x32\x9e\xad\xc0\xb3\x51\x3c\xdb\x8c\x67\xbb\xf0\xec\x00\x9e\x1d\xc1\xb3\x93\x78\x76\x16\xcf\x2e\xe1\x07\xc0\x0f\xd4\xe0\x07\x9a\xf0\x03\x9d\xf8\x81\x7e\xfc\x40\x12\x3f\x30\x81\x1f\xc8\xe1\x07\x0a\xf8\x81\x32\x7e\x30\x82\x1f\x6c\xc4\x0f\x76\xe0\x07\xfb\xf0\x83\x09\xfc\xe0\x38\x7e\x30\x8b\x1f\x5c\xc4\x0f\xae\xe2\x87\x84\x1f\xaa\xc7\x0f\xb5\xe1\x87\x7a\xf1\x43\x71\xfc\xd0\x18\x7e\x68\x1a\x3f\xb4\x80\x1f\x5a\xc1\x73\x55\x78\xae\x0e\xcf\xb5\xe2\xb9\x1e\x3c\x37\x84\xe7\x52\x78\x2e\x83\xe7\xe6\xf1\x5c\x11\x3f\x5c\x89\x1f\xae\xc5\x0f\xb7\xe0\x87\xbb\xf1\xc3\x83\xf8\xe1\x11\xfc\xf0\x24\x7e\x78\x16\x3f\xbc\x84\x1f\x01\x3f\x52\x83\x1f\x69\xc2\x8f\x74\xe2\x47\xfa\xf1\x23\x49\xfc\xc8\x04\x7e\x24\x87\x1f\x29\xe0\x47\xca\xf8\xd1\x08\x7e\xb4\x11\x3f\xda\x81\x1f\xed\xc3\x8f\x0e\xe3\x47\xd3\xf8\xd1\x19\xfc\x68\x1e\x3f\x5a\xc2\xf3\xd5\x78\xbe\x01\xcf\xb7\xe3\xf9\x18\x9e\x4f\xe0\xf9\x31\x3c\x3f\x8d\xe7\x17\xf0\xfc\x0a\x7e\xac\x0a\x3f\x56\x87\x1f\x6b\xc5\x8f\xf5\xe0\xc7\x86\xf0\x63\x29\xfc\x58\x06\x3f\x36\x8f\x1f\x2b\xe2\xc7\x2b\xf1\xe3\xb5\xf8\xf1\x16\xfc\x78\x37\x7e\x7c\x10\x3f\x3e\x8a\x1f\x9f\xc2\x8f\xcf\xe1\xc7\x97\xf1\x13\x15\xf8\x89\x28\x7e\xa2\x19\x3f\xd1\x85\x9f\x18\xc0\x4f\x8c\xe0\x27\x26\xf0\x13\x39\xfc\x44\x01\x3f\x51\xc6\x0b\x11\xbc\xd0\x88\x17\x3a\xf0\x42\x1f\x5e\x18\xc6\x0b\x69\xbc\x30\x83\x17\xf2\x78\xa1\x84\x9f\xac\xc6\x4f\x36\xe0\x27\xdb\xf1\x93\x31\xfc\x64\x02\x3f\x39\x8e\x9f\xcc\xe2\x27\x17\xf1\x93\xab\xf8\x29\xe1\xa7\xea\xf1\x53\x6d\xf8\xa9\x5e\xfc\x54\x1c\x3f\x35\x86\x9f\xca\xe0\xa7\xe6\xf1\x53\x45\xfc\x74\x25\x7e\xba\x16\x3f\xdd\x82\x9f\xee\xc6\x4f\x0f\xe2\xa7\x47\xf1\xd3\x53\xf8\xe9\x39\xfc\xf4\x32\x5e\xac\xc0\x8b\x51\xbc\xd8\x8c\x17\xbb\xf0\xe2\x00\x5e\x1c\xc1\x8b\x93\x78\x71\x16\x2f\x2e\xe1\x67\xc0\xcf\xd4\xe0\x67\x9a\xf0\x33\x9d\xf8\x99\x7e\xfc\x4c\x12\x3f\x33\x81\x9f\x99\xc1\xcf\xe4\xf1\x33\x25\xfc\x6c\x35\x7e\xb6\x01\x3f\xdb\x8e\x9f\x8d\xe1\x67\x13\xf8\xd9\x71\xfc\x6c\x16\x3f\xbb\x88\x9f\x5d\xc5\xcf\x09\x3f\x57\x8f\x9f\x6b\xc3\xcf\xf5\xe2\xe7\xe2\xf8\xb9\x31\xfc\xdc\x34\x7e\x6e\x01\x3f\xb7\x82\xf3\x55\x38\x5f\x87\xf3\xad\x38\xdf\x83\xf3\x43\x38\x9f\xc2\xf9\x0c\xce\xcf\xe1\xfc\x32\x7e\xbe\x02\x3f\x1f\xc5\xcf\x37\xe3\xe7\xbb\xf0\xf3\x03\xf8\xf9\x11\xfc\xfc\x24\x7e\x7e\x16\x3f\xbf\x84\x5f\x00\xbf\x50\x83\x5f\x68\xc2\x2f\x74\xe2\x17\xfa\xf1\x0b\x49\xfc\xc2\x04\x7e\x21\x87\x5f\x28\xe0\x17\xca\xf8\xc5\x08\x7e\xb1\x11\xbf\xd8\x81\x5f\xec\xc3\x2f\x0e\xe3\x17\xd3\xf8\xc5\x19\xfc\xe2\x22\x7e\x71\x15\x17\x84\x0b\xf5\xb8\xd0\x86\x0b\xbd\xb8\x10\xc7\x85\x31\x5c\x98\xc6\x85\x05\x5c\x58\xc1\x2f\x55\xe1\x97\xea\xf0\x4b\xad\xf8\xa5\x1e\xfc\xd2\x10\x7e\x29\x85\x5f\xca\xe0\x97\xe6\xf1\x4b\x45\xfc\x72\x25\x7e\xb9\x16\xbf\xdc\x82\x5f\xee\xc6\x2f\x0f\xe2\x97\x47\xf1\xcb\x53\xf8\xe5\x39\xfc\xf2\x12\x7e\x05\xfc\x4a\x0d\x7e\xa5\x09\xbf\xd2\x89\x5f\xe9\xc7\xaf\x24\xf1\x2b\x13\xf8\x95\x1c\x7e\xa5\x80\x5f\x29\xe3\xa5\x08\x5e\x6a\xc4\x4b\x1d\x78\xa9\x0f\x2f\x0d\xe3\xa5\x34\x5e\x9a\xc1\x4b\x79\xbc\x54\xc2\xaf\x56\xe3\x57\x1b\xf0\xab\xed\xf8\xd5\x18\x7e\x35\x81\x5f\x1d\xc7\xaf\x66\xf1\xab\x8b\xf8\xd5\x15\xfc\x5a\x15\x7e\xad\x0e\xbf\xd6\x8a\x5f\xeb\xc1\xaf\x0d\xe1\xd7\x52\xf8\xb5\x0c\x7e\x6d\x1e\xbf\x56\xc4\xaf\x57\xe2\xd7\x6b\xf1\xeb\x2d\xf8\xf5\x6e\xfc\xfa\x20\x7e\x7d\x14\xbf\x3e\x85\x5f\x9f\xc3\xaf\x2f\xe3\xe5\x0a\xbc\x1c\xc5\xcb\xcd\x78\xb9\x0b\x2f\x0f\xe0\xe5\x11\xbc\x3c\x89\x97\x67\xf1\xf2\x12\x5e\x2e\xe3\x37\x22\xf8\x8d\x46\xfc\x46\x07\x7e\xa3\x0f\xbf\x31\x8c\xdf\x48\xe3\x37\x66\xf0\x1b\x79\xfc\x46\x09\xbf\x59\x8d\xdf\x6c\xc0\x6f\xb6\xe3\x37\x63\xf8\xcd\x04\x7e\x73\x1c\xbf\x99\xc5\x6f\x2e\xe2\x37\x57\xf1\x5b\xc2\x6f\xd5\xe3\xb7\xda\xf0\x5b\xbd\xf8\xad\x38\x7e\x6b\x0c\xbf\x35\x8d\xdf\x5a\xc0\x6f\xad\xe0\x62\x25\x2e\xd6\xe2\x62\x0b\x2e\x76\xe3\xe2\x20\x2e\x8e\xe2\xe2\x14\x2e\xce\xe1\xe2\x32\x7e\xbb\x02\xbf\x1d\xc5\x6f\x37\xe3\xb7\xbb\xf0\xdb\x03\xf8\xed\x11\xfc\xf6\x24\x7e\x7b\x16\xbf\xbd\x84\xdf\x01\xbf\x53\x83\xdf\x69\xc2\xef\x74\xe2\x77\xfa\xf1\x3b\x49\xfc\xce\x04\x7e\x27\x87\xdf\x29\xe0\x77\xca\xf8\xdd\x6a\xfc\x6e\x03\x7e\xb7\x1d\xbf\x1b\xc3\xef\x26\xf0\xbb\xe3\xf8\xdd\x2c\x7e\x77\x11\xbf\xbb\x8a\x57\x84\x57\xea\xf1\x4a\x1b\x5e\xe9\xc5\x2b\x71\xbc\x32\x86\x57\xa6\xf1\xca\x02\x5e\x59\xc1\xef\x55\xe1\xf7\xea\xf0\x7b\xad\xf8\xbd\x1e\xfc\xde\x10\x7e\x2f\x85\xdf\xcb\xe0\xf7\xe6\xf1\x7b\x45\xfc\x7e\x25\x7e\x3f\x8a\xdf\x6f\xc6\xef\x77\xe1\xf7\x07\xf0\xfb\x23\xf8\xfd\x49\xfc\xfe\x2c\x7e\x7f\x09\x7f\x00\xfe\xa0\x06\x7f\xd0\x84\x3f\xe8\xc4\x1f\xf4\xe3\x0f\x92\xf8\x83\x09\xfc\x41\x0e\x7f\x50\xc0\x1f\x94\xf1\x6a\x04\xaf\x36\xe2\xd5\x0e\xbc\xda\x87\x57\x87\xf1\x6a\x1a\xaf\xce\xe0\xd5\x3c\x5e\x2d\xe1\x0f\xab\xf1\x87\xf5\xf8\xc3\x36\xfc\x61\x2f\xfe\x30\x8e\x3f\x1c\xc3\x1f\x4e\xe3\x0f\x17\xf0\x87\x2b\xf8\xa3\x2a\xfc\x51\x1d\xfe\xa8\x15\x7f\xd4\x83\x3f\x1a\xc2\x1f\xa5\xf0\x47\x19\xfc\xd1\x3c\xfe\xa8\x88\x3f\xae\xc4\x1f\xd7\xe2\x8f\x5b\xf0\xc7\xdd\xf8\xe3\x41\xfc\xf1\x28\xfe\x78\x0a\x7f\x3c\x87\x3f\x5e\xc6\xa5\x0a\x5c\x8a\xe2\x52\x13\x2e\x75\xe2\x52\x3f\x2e\x25\x71\x69\x02\x97\x72\xb8\x54\xc0\xa5\x32\xfe\x24\x82\x3f\x69\xc4\x9f\x74\xe0\x4f\xfa\xf0\x27\xc3\xf8\x93\x34\xfe\x64\x06\x7f\x92\xc7\x9f\x94\xf0\xa7\xd5\xf8\xd3\x06\xfc\x69\x3b\xfe\x34\x86\x3f\x4d\xe0\x4f\xc7\xf1\xa7\x59\xfc\xe9\x22\xfe\x74\x15\x7f\x26\xfc\x59\x3d\xfe\xac\x15\x7f\xd6\x83\x3f\x1b\xc2\x9f\xa5\xf0\x67\x19\xfc\xd9\x3c\xfe\xac\x88\xcb\x95\xb8\x5c\x8b\xcb\x2d\xb8\xdc\x8d\xcb\x83\xb8\x3c\x8a\xcb\x53\xb8\x3c\x87\xcb\xcb\xf8\xf3\x0a\xfc\x79\x14\x7f\xde\x8c\x3f\xef\xc2\x9f\x0f\xe0\xcf\x47\xf0\xe7\x93\xf8\xf3\x59\xfc\xf9\x12\xfe\x02\xfc\x45\x0d\xfe\xa2\x09\x7f\xd1\x81\xbf\xe8\xc3\x5f\x0c\xe3\x2f\xd2\xf8\x8b\x19\xfc\x45\x1e\x7f\x51\xc2\x5f\x56\xe3\x2f\x1b\xf0\x97\xed\xf8\xcb\x18\xfe\x32\x81\xbf\x1c\xc7\x5f\x66\xf1\x97\x8b\xf8\xcb\x55\x02\x22\x50\x4f\xa0\x8d\x40\x2f\x81\x38\x81\x31\x02\xd3\x04\x16\x08\xac\x10\xd6\xa8\x22\xac\x51\x47\x58\xa3\x95\xb0\x46\x37\x61\x8d\x41\xc2\x1a\xa3\x84\x35\xa6\x08\x6b\xcc\x11\xd6\x58\x26\xac\x59\x41\x58\x33\x4a\x58\xb3\x99\xb0\x66\x17\x61\xcd\x01\xc2\x9a\x23\x84\x35\x27\x09\x6b\xce\x12\xd6\x5c\x22\xac\x05\x61\xad\x1a\xc2\x5a\x4d\x84\xb5\x3a\x09\x6b\xf5\x13\xd6\x4a\x12\xd6\x9a\x20\xac\x95\x23\xac\x55\x20\xac\x55\x26\x54\x44\x08\x15\x8d\x84\x8a\x0e\x42\x45\x8c\x50\x91\x20\x54\x8c\x13\x2a\xb2\x84\x8a\x45\x42\xc5\x2a\x61\x6d\x11\xd6\xae\x27\xac\xdd\x46\x58\xbb\x97\xb0\x76\x9c\xb0\xf6\x18\x61\xed\x69\xc2\xda\x0b\x84\xb5\x57\x08\xeb\x54\x11\xd6\xa9\x23\xac\xd3\x4a\x58\xa7\x87\xb0\xce\x10\x61\x9d\x14\x61\x9d\x0c\x61\x9d\x79\xc2\x3a\x45\xc2\xba\x95\x84\x75\x6b\x09\xeb\xb6\x10\xd6\xed\x26\xac\x3b\x40\x58\x77\x84\xb0\xee\x24\x61\xdd\x59\xc2\xba\x4b\x84\x4a\x08\x95\x35\x84\xca\x26\x42\x65\x27\xa1\xb2\x9f\x50\x99\x24\x54\x4e\x10\x2a\x73\x84\xca\x02\xa1\xb2\x4c\x58\x2f\x42\x58\xaf\x91\xb0\x5e\x07\x61\xbd\x3e\xc2\x7a\xc3\x84\xf5\xd2\x84\xf5\x66\x08\xeb\xe5\x09\xeb\x95\x08\xeb\x57\x13\xd6\x6f\x20\xac\xdf\x4e\x58\x3f\x46\x58\x3f\x4e\x58\x7f\x8c\xb0\xfe\x34\x61\xfd\x05\xc2\xfa\x2b\x84\x0d\xaa\x08\x1b\xd4\x11\x36\x68\x25\x6c\xd0\x43\xd8\x60\x88\xb0\x41\x8a\xb0\x41\x86\xb0\xc1\x3c\x61\x83\x22\xa1\xaa\x92\x50\x55\x4b\xa8\x6a\x21\x54\x75\x13\xaa\x06\x09\x55\xa3\x84\xaa\x29\x42\xd5\x1c\xa1\x6a\x99\xb0\x61\x05\x61\xc3\x28\x61\xc3\x66\xc2\x86\x5d\x84\x0d\x07\x08\x1b\x26\x09\x1b\x4e\x10\x36\xcc\x11\x36\x2c\x10\x36\x2c\x13\x36\x8a\x10\x36\x6a\x24\x6c\xd4\x41\xd8\xa8\x8f\xb0\xd1\x30\x61\xa3\x34\x61\xa3\x19\xc2\x46\x79\xc2\x46\x25\xc2\xc6\xd5\x84\x8d\x1b\x08\x1b\xb7\x13\x36\x8e\x11\x36\x4e\x10\x36\x1e\x27\x6c\x9c\x25\x6c\xbc\x48\xd8\x78\x95\x20\x11\x54\x4f\x50\x1b\x41\xbd\x04\xc5\x09\x4a\x11\x94\x21\x68\x9e\xa0\x22\xc1\x95\x04\xd7\x12\xdc\x42\x70\x37\xc1\x83\x04\x8f\x12\x3c\x45\xf0\x1c\xc1\xcb\x84\x50\x41\x08\x51\x42\x68\x26\x84\x2e\x42\x18\x20\x84\x11\x42\x98\x24\x84\x59\x42\x58\x22\x6c\x02\x61\x93\x1a\xc2\x26\x4d\x84\x4d\x3a\x09\x9b\xf4\x13\x36\x49\x12\x36\x49\x13\x36\x99\x21\x6c\x92\x27\x6c\x52\x22\x54\x57\x13\xaa\x1b\x08\xd5\xed\x84\xea\x18\xa1\x3a\x41\xa8\x1e\x27\x54\x67\x09\xd5\x8b\x84\xea\x55\xc2\xa6\x22\x6c\x5a\x4f\xd8\xb4\x8d\xb0\x69\x2f\x61\xd3\x38\x61\xd3\x31\xc2\xa6\xd3\x84\x4d\x17\x08\x9b\xae\x10\x36\xab\x22\x6c\x56\x47\xd8\xac\x95\xb0\x59\x0f\x61\xb3\x21\xc2\x66\x29\xc2\x66\x53\x84\xcd\xe6\x08\x9b\x2d\x13\x36\xaf\x20\x6c\x1e\x25\x6c\xde\x4c\xd8\xbc\x8b\xb0\xf9\x00\x61\xf3\x11\xc2\xe6\x93\x84\xcd\x67\x09\x9b\x2f\x11\x22\x10\x22\x35\x84\x48\x13\x21\xd2\x49\x88\xf4\x13\x22\x49\x42\x64\x82\x10\xc9\x11\x22\x05\x42\xa4\x4c\xd8\x22\x42\xd8\xa2\x91\xb0\x45\x07\x61\x8b\x3e\xc2\x16\xc3\x84\x2d\xd2\x84\x2d\xb2\x84\x2d\x16\x09\x5b\xac\x12\xb6\x14\x61\xcb\x7a\xc2\x96\x6d\x84\x2d\x7b\x09\x5b\xc6\x09\x5b\x8e\x11\xb6\x9c\x26\x6c\xb9\x40\xd8\x72\x85\xb0\x55\x15\x61\xab\x3a\xc2\x56\xad\x84\xad\x7a\x08\x5b\x0d\x11\xb6\x4a\x11\xb6\xca\x10\xb6\x9a\x27\x6c\x55\x24\xd4\x54\x12\x6a\x6a\x09\x35\x2d\x84\x9a\x6e\x42\xcd\x20\xa1\x66\x94\x50\x33\x45\xa8\x99\x25\xd4\x2c\x11\xb6\x86\xb0\x75\x0d\x61\xeb\x26\xc2\xd6\x9d\x84\xad\xfb\x09\x5b\x27\x09\x5b\x4f\x10\xb6\xce\x11\xb6\x2e\x10\xb6\x2e\x13\xb6\x89\x10\xb6\x69\x24\x6c\xd3\x41\xd8\xa6\x8f\xb0\xcd\x30\x61\x9b\x34\x61\x9b\x19\xc2\x36\x79\xc2\x36\x25\xc2\xb6\xd5\x84\x6d\x1b\x08\xdb\xb6\x13\xb6\x8d\x11\xb6\x4d\x10\xb6\x1d\x27\x6c\x9b\x25\x6c\xbb\x40\xd8\x76\x85\x10\xad\x22\x44\xeb\x08\xd1\x56\x42\xb4\x87\x10\x1d\x22\x44\x53\x84\x68\x86\x10\x9d\x27\x44\x8b\x84\xed\x2a\x09\xdb\xd5\x12\xb6\x6b\x21\x6c\xd7\x4d\xd8\x6e\x90\xb0\xdd\x28\x61\xbb\x29\xc2\x76\x73\x84\xed\x96\x09\xdb\x57\x10\xb6\x8f\x12\xb6\x6f\x26\x6c\xdf\x45\xd8\x7e\x80\xb0\xfd\x08\x61\xfb\x49\xc2\xf6\xb3\x84\xed\x0b\x84\xed\xcb\x84\x1d\x22\x84\x1d\x1a\x09\x3b\x74\x10\x76\xe8\x23\xec\x30\x4c\xd8\x21\x4d\xd8\x61\x86\xb0\x43\x9e\xb0\x43\x89\x50\x5b\x4d\xa8\x6d\x20\xd4\xb6\x13\x6a\x63\x84\xda\x04\xa1\x76\x9c\x50\x9b\x25\xd4\x2e\x12\x6a\x57\x09\x3b\x8a\xb0\x63\x3d\x61\xc7\x36\xc2\x8e\xbd\x84\x1d\xe3\x84\x1d\xff\x9f\x00\x38\x00\x8c\x40\x20\xd4\x38\xfe\x7f\xb5\x6a\xd5\xaa\xf5\x7d\xab\x56\xad\x5a\x35\x1c\x86\xe1\x70\x18\x0e\x87\x61\x18\x0e\x87\xc3\x70\x18\x86\xc3\x61\x38\x0c\xc3\x70\x18\x0e\xc3\x61\x18\x0e\x87\x61\x38\x0c\xc3\xe1\x30\x1c\x0e\xc3\x70\x58\xb5\x6a\xd5\xaa\xa9\x95\x55\xef\x97\x43\x6b\x14\xd1\x1a\x55\xb4\xc6\x22\x5a\xb3\x1e\xad\xd9\x86\xd6\x0c\xa3\x35\xe3\x68\xcd\x01\xb4\x66\x16\xad\x39\x81\xd6\x9c\x41\x6b\x2e\xa0\xb5\xea\xd0\x5a\xad\x68\xad\x4e\xb4\x56\x0c\xad\x95\x42\x6b\x8d\xa0\xb5\x0a\x68\xad\x32\x5a\x6b\x1e\x05\x40\x81\x16\x14\x08\xa1\x40\x14\x05\x92\x28\x90\x41\x81\x3c\x0a\x94\x50\xa0\x86\x02\x2b\x68\xed\x26\xb4\x76\x07\x5a\xbb\x1b\xad\xdd\x87\xd6\x1e\x42\x6b\x8f\xa1\xb5\xa7\xd0\xda\xb3\x68\xed\x65\xb4\x4e\x23\x5a\xa7\x1d\xad\xd3\x85\xd6\x49\xa0\x75\x06\xd1\x3a\x39\xb4\x4e\x11\xad\x53\x45\xeb\x2c\xa1\x75\x1b\xd0\xba\x01\xb4\x6e\x04\xad\xdb\x8b\xd6\x4d\xa3\x75\x47\xd1\xba\x93\x68\xdd\x0a\x5a\x77\x11\xb5\xd7\xa1\xf6\x56\xd4\xde\x89\xda\x63\xa8\x3d\x85\xda\x47\x50\x7b\x01\xb5\x97\x51\xfb\x3c\x5a\x0f\xb4\x5e\x0b\x5a\x2f\x84\xd6\x8b\xa2\xf5\x92\x68\xbd\x0c\x5a\x2f\x8f\xd6\x2b\xa1\xf5\x6a\x68\xbd\x55\xb4\x7e\x33\x5a\x3f\x88\xd6\xef\x41\xeb\xf7\xa3\xf5\x87\xd1\xfa\xe3\x68\xfd\x69\xb4\xfe\x1c\x5a\x7f\x05\x6d\xd0\x88\x36\x68\x47\x1b\x74\xa1\x0d\x12\x68\x83\x41\xb4\x41\x0e\x6d\x50\x44\x1b\x54\xd1\x06\x4b\xa8\xa3\x01\x75\x04\x50\x47\x04\x75\xf4\xa2\x8e\x34\xea\x18\x45\x1d\x93\xa8\xa3\x82\x3a\x16\xd1\x86\xf5\x68\xc3\x36\xb4\x61\x18\x6d\x18\x47\x1b\x0e\xa0\x0d\xb3\x68\xc3\x09\xb4\xe1\x0c\xda\x70\x01\x6d\x54\x87\x36\x6a\x41\x1b\x85\xd0\x46\x51\xb4\x51\x12\x6d\x94\x41\x1b\xe5\xd1\x46\x25\xb4\x51\x0d\x6d\xb4\x8a\x36\x6e\x46\x1b\x07\xd1\xc6\x3d\x68\xe3\x7e\xb4\xf1\x30\xda\x78\x1c\x6d\x3c\x8d\x36\x9e\x43\x1b\xaf\xa0\x60\x13\x0a\x76\xa0\x60\x37\x0a\xf6\xa1\xe0\x10\x0a\x8e\xa1\xe0\x14\x0a\xce\xa2\xe0\x32\xda\xa4\x11\x6d\x12\x40\x9b\x44\xd0\x26\xbd\x68\x93\x34\xda\x64\x14\x6d\x32\x89\x36\xa9\xa0\x4d\x16\xd1\xa6\xf5\x68\xd3\x36\xb4\x69\x18\x6d\x1a\x47\x9b\x0e\xa0\x4d\xb3\x68\xd3\x09\xb4\xe9\x0c\xda\x74\x01\x6d\x56\x87\x36\x6b\x45\x9b\x75\xa2\xcd\x62\x68\xb3\x14\xda\x6c\x04\x6d\x56\x40\x9b\x95\xd1\x66\xf3\x28\x04\x0a\xb5\xa0\x50\x10\x85\x7a\x50\xa8\x1f\x85\x86\x51\x68\x1c\x85\xa6\x51\x68\x0e\x85\x56\xd0\xe6\x4d\x68\xf3\x0e\xb4\x79\x37\xda\xbc\x0f\x6d\x3e\x84\x36\x1f\x43\x9b\x4f\xa1\xcd\x67\xd1\xe6\xcb\x68\x8b\x46\xb4\x45\x3b\xda\xa2\x0b\x6d\x91\x40\x5b\x0c\xa2\x2d\x72\x68\x8b\x22\xda\xa2\x8a\xb6\x58\x42\x5b\x36\xa0\x2d\x03\x68\xcb\x30\xda\x32\x8e\xb6\x1c\x40\x5b\x66\xd1\x96\x13\x68\xcb\x19\xb4\xe5\x02\xea\xac\x43\x9d\xad\xa8\xb3\x13\x75\xc6\x50\x67\x0a\x75\x8e\xa0\xce\x02\xea\x2c\xa3\xce\x79\xb4\x15\x68\xab\x16\xb4\x55\x08\x6d\x15\x45\x5b\x25\xd1\x56\x19\xb4\x55\x1e\x6d\x55\x42\x5b\xd5\xd0\x56\xab\x68\xeb\x66\xb4\x75\x10\x6d\xdd\x8d\xb6\xee\x43\x5b\x0f\xa1\xad\xc7\xd0\xd6\x53\x68\xeb\x59\xb4\xf5\x32\xda\xa6\x11\x6d\xd3\x8e\xb6\xe9\x42\xdb\x24\xd0\x36\x83\x68\x9b\x1c\xda\xa6\x88\xb6\xa9\xa2\x6d\x96\x50\xb8\x01\x85\x03\x28\x1c\x41\xe1\x5e\x14\x4e\xa3\xf0\x28\x0a\x4f\xa2\x70\x05\x85\x17\xd1\xb6\xf5\x68\xdb\x36\xb4\x6d\x18\x6d\x1b\x43\xdb\xa6\xd0\xb6\x23\x68\xdb\x02\xda\xb6\x8c\xb6\x9d\x47\xdb\x81\xb6\x6b\x41\xdb\x85\xd0\x76\x51\xb4\x5d\x12\x6d\x97\x41\xdb\xe5\xd1\x76\x25\xb4\x5d\x0d\x6d\xb7\x8a\xb6\x6f\x46\xdb\x07\xd1\xf6\x3d\x68\xfb\x7e\xb4\xfd\x30\xda\x7e\x1c\x6d\x3f\x8d\xb6\x9f\x43\xdb\xaf\xa0\x48\x13\x8a\x74\xa0\x48\x37\x8a\x24\x50\x64\x10\x45\x72\x28\x52\x44\x91\x2a\x8a\x2c\xa1\x1d\x1a\xd0\x0e\x01\xb4\x43\x04\xed\xd0\x8b\x76\x48\xa3\x1d\x46\xd1\x0e\x93\x68\x87\x0a\xda\x61\x11\xed\x58\x8f\x76\x6c\x43\x3b\x86\xd1\x8e\x71\xb4\xe3\x00\xda\x31\x8b\x76\x9c\x40\x3b\xce\xa0\x1d\x17\xd0\x4e\x75\x68\xa7\x56\xb4\x53\x27\xda\x29\x86\x76\x4a\xa2\x9d\x32\x68\xa7\x3c\xda\xa9\x84\x76\xaa\xa1\x9d\x56\x51\x57\x33\xea\x0a\xa2\xae\x1e\xd4\xd5\x8f\xba\x86\x51\xd7\x38\xea\x9a\x46\x5d\x73\xa8\x6b\x05\xed\xdc\x84\x76\xee\x40\x3b\x77\xa3\x9d\xfb\xd0\xce\x43\x68\xe7\x31\xb4\xf3\x14\xda\x79\x16\xed\xbc\x8c\x76\x69\x44\xbb\xb4\xa3\x5d\xba\xd0\x2e\x09\xb4\x4b\x1a\xed\x32\x8a\x76\x99\x44\xbb\x54\xd0\x2e\x8b\x68\xd7\x7a\xb4\x6b\x1b\xda\x35\x8c\x76\x8d\xa3\x5d\x07\xd0\xae\x59\xb4\xeb\x04\xda\x75\x06\xed\xba\x80\xba\xeb\x50\x77\x2b\xea\xee\x44\xdd\x31\xd4\x9d\x42\xdd\x23\xa8\xbb\x80\xba\xcb\xa8\x7b\x1e\xed\x06\xda\xad\x05\xed\x16\x42\xbb\x45\xd1\x6e\x49\xb4\xdb\x30\xda\x6d\x1c\xed\x36\x8d\x76\x9b\x43\xbb\xad\xa0\xdd\x9b\xd0\xee\x1d\x68\xf7\x6e\xb4\x7b\x1f\xda\x7d\x08\xed\x3e\x86\x76\x9f\x42\xbb\xcf\xa2\xdd\x97\xd1\x1e\x8d\x68\x8f\x76\xb4\x47\x17\xda\x23\x81\xf6\x18\x44\x7b\xe4\xd0\x1e\x45\xb4\x47\x15\xed\xb1\x84\x7a\x1a\x50\x4f\x00\xf5\x44\x50\x4f\x2f\xea\x49\xa3\x9e\x2c\xea\x99\x40\x3d\x33\xa8\x67\x01\xed\x59\x87\xf6\x6c\x45\x7b\x76\xa2\x3d\x63\x68\xcf\x14\xda\x73\x04\xed\x59\x40\x7b\x96\xd1\x9e\xf3\x68\x2f\xd0\x5e\x2d\x68\xaf\x10\xda\x2b\x8a\xf6\x4a\xa2\xbd\x32\x68\xaf\x3c\xda\xab\x84\xf6\xaa\xa1\xbd\x56\xd1\xde\xcd\x68\xef\x20\xda\xbb\x07\xed\xdd\x8f\xf6\x1e\x46\x7b\x8f\xa1\xbd\xa7\xd0\xde\xb3\x68\xef\x65\x14\x6d\x44\xd1\x76\x14\xed\x42\xd1\x04\x8a\x0e\xa2\x68\x0e\x45\x8b\x28\x5a\x45\xd1\x25\xb4\x4f\x03\xda\x27\x80\xf6\x89\xa0\x7d\x7a\xd1\x3e\x69\xb4\xcf\x28\xda\x67\x12\xed\x53\x41\xfb\x2c\xa2\x7d\xeb\xd1\xbe\x6d\x68\xdf\x30\xda\x37\x8e\xf6\x1d\x40\xfb\x66\xd1\xbe\x05\xb4\x6f\x19\xed\x3b\x8f\xf6\x03\xed\xd7\x82\xf6\x0b\xa1\xfd\xa2\x68\xbf\x24\xda\x2f\x83\xf6\xcb\xa3\xfd\x4a\x68\xbf\x1a\xda\x6f\x15\xc5\x9a\x51\x2c\x88\x62\x3d\x28\xd6\x8f\x62\xc3\x28\x36\x8e\x62\xd3\x28\x36\x87\x62\x2b\x68\xff\x26\xb4\x7f\x07\xda\xbf\x1b\xed\xdf\x87\xf6\x1f\x42\xfb\x8f\xa1\xfd\x8b\x68\xff\x2a\xda\x7f\x09\x1d\xd0\x80\x0e\x08\xa0\x03\x22\xe8\x80\x5e\x74\x40\x1a\x1d\x30\x8a\x0e\x98\x44\x07\x54\xd0\x01\x8b\xe8\xc0\x7a\x74\x60\x1b\x3a\x30\x8c\x0e\x8c\xa3\x03\x07\xd0\x81\x59\x74\xe0\x04\x3a\x70\x06\x1d\xb8\x80\xe2\x75\x28\xde\x8a\xe2\x9d\x28\x1e\x43\xf1\x14\x8a\x8f\xa0\x78\x01\xc5\x4b\x28\x5e\x43\xf1\x55\x74\x50\x33\x3a\x28\x88\x0e\xea\x41\x07\xf5\xa3\x83\x86\xd1\x41\xe3\xe8\xa0\x69\x74\xd0\x1c\x3a\x68\x05\x1d\xdc\x84\x0e\xee\x40\x07\x77\xa3\x83\xfb\xd0\xc1\x43\xe8\xe0\x31\x74\xf0\x14\x3a\x78\x16\x1d\xbc\x8c\x0e\x69\x44\x87\xb4\xa3\x43\xba\xd0\x21\x09\x74\xc8\x20\x3a\x24\x87\x0e\x29\xa2\x43\x2a\xe8\x90\x45\xd4\x5b\x8f\x7a\xdb\x50\x6f\x18\xf5\xc6\x51\xef\x00\xea\xcd\xa2\xde\x09\xd4\x3b\x83\x7a\x17\xd0\xa1\x75\xe8\xd0\x56\x74\x68\x27\x3a\x34\x86\x0e\x4d\xa1\x43\x47\xd0\xa1\x05\x74\x68\x19\x1d\x3a\x8f\x0e\x03\x1d\xd6\x82\x0e\x0b\xa1\xc3\xa2\xe8\xb0\x24\x3a\x2c\x83\x0e\xcb\xa3\xc3\x4a\xe8\xb0\x39\x74\xd8\x0a\x3a\xbc\x09\x1d\xde\x81\x0e\xef\x46\x87\xf7\xa1\xc3\x87\xd0\xe1\x63\xe8\xf0\x29\x74\xf8\x2c\x3a\x7c\x19\x25\x1a\x51\xa2\x1d\x25\xba\x50\x22\x81\x12\x83\x28\x91\x43\x89\x22\x4a\x54\x51\x62\x09\x1d\xd1\x80\x8e\x08\xa0\x23\x22\xe8\x88\x5e\x74\x44\x1a\x1d\x31\x8a\x8e\x98\x44\x47\x54\xd0\x11\x0b\xe8\xc8\x3a\x74\x64\x2b\x3a\xb2\x13\x1d\x19\x43\x47\xa6\xd0\x91\x23\xe8\xc8\x02\x3a\xb2\x8c\x8e\x9c\x47\x47\x81\x8e\x6a\x41\x47\x85\xd0\x51\x51\x74\x54\x12\x1d\x95\x41\x47\xe5\xd1\x51\x25\x74\x54\x0d\x1d\xb5\x8a\xfa\x9a\x51\x5f\x10\xf5\xf5\xa0\xbe\x7e\xd4\x37\x8c\xfa\xc6\x51\xdf\x34\xea\x9b\x43\x7d\xcb\xe8\xe8\x46\x74\x74\x3b\x3a\xba\x0b\x1d\x9d\x40\x47\x0f\xa2\xa3\x73\xe8\xe8\x22\x3a\xba\x8a\x8e\x5e\x42\xc7\x34\xa0\x63\x02\xe8\x98\x08\x3a\xa6\x17\x1d\x93\x46\xc7\x8c\xa2\x63\x26\xd1\x31\x15\x74\xcc\x22\x3a\xb6\x1e\x1d\xdb\x86\x8e\x0d\xa3\x63\xe3\xe8\xd8\x01\x74\x6c\x16\x1d\x3b\x81\x8e\x9d\x41\xc7\x2e\xa0\x7e\x50\x7f\x0b\xea\x0f\xa1\xfe\x28\xea\x4f\xa2\xfe\x0c\xea\xcf\xa3\xfe\x12\xea\xaf\xa1\xfe\x55\x74\x5c\x33\x3a\x2e\x88\x8e\xeb\x41\xc7\xf5\xa3\xe3\x86\xd1\x71\xe3\xe8\xb8\x69\x74\xdc\x1c\x3a\x6e\x05\x1d\xdf\x84\x8e\xef\x40\xc7\x77\xa3\xe3\xfb\xd0\xf1\x43\xe8\xf8\x31\x74\xfc\x14\x3a\x7e\x16\x1d\xbf\x8c\x4e\x68\x40\x27\x04\xd0\x09\x11\x74\x42\x2f\x3a\x21\x8d\x4e\x18\x45\x27\x4c\xa2\x13\x2a\xe8\x84\x45\x94\xac\x47\xc9\x36\x94\x0c\xa3\x64\x1c\x25\x07\x50\x32\x8b\x92\x13\x28\x39\x83\x92\x0b\xe8\xc4\x3a\x74\x62\x2b\x3a\xb1\x13\x9d\x18\x43\x27\xa6\xd0\x89\x23\xe8\xc4\x02\x3a\xb1\x8c\x4e\x9c\x47\x27\x81\x4e\x6a\x46\x27\x05\xd1\x49\x3d\xe8\xa4\x7e\x74\xd2\x30\x3a\x69\x1c\x9d\x34\x8d\x4e\x9a\x43\x27\xad\xa0\x93\x9b\xd0\xc9\x1d\xe8\xe4\x6e\x74\x72\x1f\x3a\x79\x08\x9d\x3c\x86\x4e\x9e\x42\x27\xcf\xa2\x93\x97\x51\xaa\x11\xa5\xda\x51\xaa\x0b\xa5\x12\x28\x35\x88\x52\x39\x94\x2a\xa2\x54\x15\xa5\x96\xd0\x29\x0d\xe8\x94\x36\x74\x4a\x18\x9d\x12\x47\xa7\x0c\xa0\x53\xb2\xe8\x94\x09\x74\xca\x0c\x3a\x65\x01\x9d\x5a\x87\x4e\x6d\x45\xa7\x76\xa2\x53\x63\xe8\xd4\x14\x3a\x75\x04\x9d\x5a\x40\xa7\x96\xd1\xa9\xf3\xe8\x34\xd0\x69\x2d\xe8\xb4\x10\x3a\x2d\x8a\x4e\x4b\xa2\xd3\x32\xe8\xb4\x3c\x3a\xad\x84\x4e\xab\xa1\xd3\x56\xd1\x40\x33\x1a\xe8\x40\x03\xdd\x68\xa0\x0f\x0d\x0c\xa1\x81\x31\x34\x30\x85\x06\x66\xd1\xc0\x32\x3a\xbd\x11\x9d\xde\x8e\x4e\xef\x42\xa7\x27\xd0\xe9\x83\xe8\xf4\x1c\x3a\xbd\x88\x4e\xaf\xa2\xd3\x97\xd0\x19\x0d\xe8\x8c\x00\x3a\x23\x82\xce\xe8\x45\x67\xa4\xd1\x19\xa3\xe8\x8c\x49\x74\x46\x05\x9d\xb1\x88\xce\xac\x47\x67\xb6\xa1\x33\x3b\xd1\x99\x31\x74\x66\x0a\x9d\x39\x82\xce\x2c\xa0\x33\xcb\xe8\xcc\x79\x94\x06\xa5\x5b\x50\x3a\x84\xd2\x51\x94\x4e\xa2\x74\x06\xa5\xf3\x28\x5d\x42\xe9\x1a\x4a\xaf\xa2\xb3\x9a\xd1\x59\x41\x74\x56\x0f\x3a\xab\x1f\x9d\x35\x8c\xce\x1a\x47\x67\x4d\xa3\xb3\xe6\xd0\x59\x2b\xe8\xec\x26\x74\x76\x07\x3a\xbb\x0b\x9d\x9d\x40\x67\x0f\xa2\xb3\x73\xe8\xec\x22\x3a\xbb\x8a\xce\x5e\x42\xe7\x34\xa0\x73\x02\xe8\x9c\x08\x3a\xa7\x17\x9d\x93\x46\xe7\x8c\xa2\x73\x26\xd1\x39\x15\x74\xce\x22\x1a\xac\x47\x83\x6d\x68\x30\x8c\x06\xe3\x68\x70\x00\x0d\x66\xd1\xe0\x04\x1a\x9c\x41\x83\x0b\xe8\xdc\x3a\x74\x6e\x2b\x3a\xb7\x13\x9d\x1b\x45\xe7\x26\xd1\xb9\x19\x74\x6e\x1e\x9d\x5b\x42\xe7\xd6\xd0\xb9\xab\xe8\xbc\x66\x74\x5e\x10\x9d\xd7\x83\xce\xeb\x47\xe7\x0d\xa3\xf3\xc6\xd1\x79\xd3\xe8\xbc\x39\x74\xde\x0a\x3a\xbf\x09\x9d\xdf\x81\xce\xef\x46\xe7\xf7\xa1\xf3\x87\xd0\xf9\x63\xe8\xfc\x29\x74\xfe\x2c\x3a\x7f\x19\x0d\x35\xa2\xa1\x76\x34\xd4\x85\x86\x7a\xd1\x50\x1a\x0d\x8d\xa2\xa1\x49\x34\x54\x41\x43\x8b\xe8\x82\x7a\x74\x41\x1b\xba\x20\x8c\x2e\x88\xa3\x0b\x06\xd0\x05\x59\x74\xc1\x04\xba\x60\x06\x5d\xb0\x80\x2e\xac\x43\x17\xb6\xa2\x0b\x3b\xd1\x85\x31\x74\x61\x0a\x5d\x38\x82\x2e\x2c\xa0\x0b\xcb\xe8\xc2\x79\x74\x11\xe8\xa2\x16\x74\x51\x08\x5d\x14\x45\x17\xf5\xa3\x8b\x86\xd1\x45\xe3\xe8\xa2\x69\x74\xd1\x1c\xba\x68\x05\x0d\x37\xa1\xe1\x0e\x34\xdc\x8d\x86\xfb\xd0\xf0\x10\x1a\x1e\x43\xc3\x53\x68\x78\x16\x0d\x2f\xa3\x8b\x1b\xd1\xc5\xed\xe8\xe2\x2e\x74\x71\x02\x5d\x3c\x88\x2e\xce\xa1\x8b\x8b\xe8\xe2\x2a\xba\x78\x09\x5d\xd2\x80\x2e\x09\xa0\x4b\x22\xe8\x92\x5e\x74\xc9\x00\xba\x24\x8b\x2e\x99\x40\x97\xcc\xa0\x4b\x16\xd0\xa5\x75\xe8\xd2\x56\x74\x69\x27\xba\x34\x86\x2e\x4d\xa1\x4b\x47\xd0\xa5\x05\x74\x69\x19\x5d\x3a\x8f\x32\xa0\x4c\x0b\xca\x84\x50\x26\x8a\x32\x49\x94\xc9\xa0\x4c\x1e\x65\x4a\x28\x53\x43\x99\x55\x74\x59\x33\xba\x2c\x88\x2e\xeb\x41\x97\xf5\xa3\xcb\x86\xd0\x65\x63\xe8\xb2\x29\x74\xd9\x2c\xba\x6c\x19\x5d\xde\x88\x2e\x6f\x47\x97\x77\xa1\xcb\x13\xe8\xf2\x41\x74\x79\x0e\x5d\x5e\x44\x97\x57\xd1\xe5\x4b\xe8\x8a\x06\x74\x45\x00\x5d\x11\x41\x57\xf4\xa2\x2b\xd2\xe8\x8a\x51\x74\xc5\x24\xba\xa2\x82\xae\x58\x44\x23\xf5\x68\xa4\x0d\x8d\x84\xd1\x48\x1c\x8d\x0c\xa0\x91\x11\x34\x52\x40\x23\x65\x34\x32\x8f\xae\x04\x5d\xd9\x82\xae\x0c\xa1\x2b\xa3\xe8\xca\x24\xba\x32\x83\xae\xcc\xa3\x2b\x4b\xe8\xca\x1a\xba\x72\x15\x5d\xd5\x8c\xae\x0a\xa2\xab\x7a\xd0\x55\xfd\xe8\xaa\x61\x74\xd5\x38\xba\x6a\x1a\x5d\x35\x87\xae\x5a\x41\x57\x37\xa1\xab\x3b\xd0\xd5\xdd\xe8\xea\x3e\x74\xf5\x10\xba\x3a\x87\xae\x2e\xa2\xab\xab\xe8\xea\x25\x94\x6d\x40\xd9\x00\xca\x46\x50\xb6\x17\x65\xd3\x28\x3b\x8a\xb2\x93\x28\x5b\x41\xd9\x45\x74\x4d\x3d\xba\xa6\x0d\x5d\x13\x46\xd7\xc4\xd1\x35\x03\xe8\x9a\x2c\xba\x66\x02\x5d\x33\x83\xae\x59\x40\xd7\xd6\xa1\x6b\x5b\xd1\xb5\x9d\xe8\xda\x18\xba\x36\x85\xae\x1d\x41\xd7\xe6\xd1\xb5\x25\x74\x6d\x0d\x5d\xbb\x8a\xae\x6b\x46\xd7\x05\xd1\x75\x3d\xe8\xba\x7e\x74\xdd\x30\xba\x6e\x1c\x5d\x37\x8d\xae\x9b\x43\xd7\xad\xa0\xd1\x26\x34\xda\x81\x46\xbb\xd1\x68\x1f\x1a\x1d\x42\xa3\x63\x68\x74\x0a\x8d\xce\xa2\xd1\x65\x74\x7d\x23\xba\xbe\x1d\x5d\xdf\x85\xae\x4f\xa0\xeb\x07\xd1\xf5\x39\x74\xfd\x24\xba\xbe\x82\xae\x5f\x44\x37\xd4\xa3\x1b\xda\xd0\x0d\x61\x74\x43\x1c\xdd\x30\x80\x6e\xc8\xa2\x1b\x26\xd0\x0d\x33\xe8\x86\x05\x74\x63\x1d\xba\xb1\x15\xdd\xd8\x89\x6e\x8c\xa1\x1b\x53\xe8\xc6\x11\x74\x63\x01\xdd\x58\x46\x37\xce\xa3\x1c\x28\xd7\x82\x72\x21\x94\x8b\xa2\x5c\x12\xe5\x32\x28\x97\x47\xb9\x69\x94\x9b\x43\xb9\x15\x74\x53\x13\xba\xa9\x03\xdd\xd4\x8d\x6e\xea\x43\x37\x0d\xa1\x9b\xc6\xd0\x4d\x53\xe8\xa6\x59\x74\xd3\x32\xba\xb9\x11\xdd\xdc\x8e\x6e\xee\x42\x37\x27\xd0\xcd\x83\xe8\xe6\x1c\xba\xb9\x88\x6e\xae\xa2\x9b\x97\xd0\x2d\x0d\xe8\x96\x00\xba\x25\x82\x6e\xe9\x45\xb7\xa4\xd1\x2d\xa3\xe8\x96\x49\x74\xcb\x0c\xba\x65\x01\x8d\xd5\xa1\xb1\x56\x34\xd6\x89\xc6\x62\x68\x2c\x85\xc6\x46\xd0\x58\x01\x8d\x95\xd1\xd8\x3c\xba\x15\x74\x6b\x0b\xba\x35\x84\x6e\x8d\xa2\x5b\x93\xe8\xd6\x0c\xba\x35\x8f\x6e\x2d\xa1\x5b\x6b\xe8\xd6\x55\x74\x5b\x33\xba\x2d\x88\x6e\xeb\x41\xb7\xf5\xa3\xdb\x86\xd1\x6d\xe3\xe8\xb6\x69\x74\xdb\x2c\xba\x6d\x19\xdd\xde\x88\x6e\x6f\x47\xb7\x77\xa1\xdb\x13\xe8\xf6\x41\x74\x7b\x0e\xdd\x5e\x44\xb7\x57\xd1\xed\x4b\x68\xbc\x01\x8d\x07\xd0\x78\x04\x8d\xf7\xa2\xf1\x34\x1a\x1f\x45\xe3\x93\x68\xbc\x82\xc6\x17\xd1\x1d\xf5\xe8\x8e\x36\x74\x47\x18\xdd\x11\x47\x77\x0c\xa0\x3b\xb2\xe8\x8e\x09\x74\xc7\x0c\xba\x63\x1e\xdd\x09\xba\xb3\x05\xdd\x19\x42\x77\x46\xd1\x9d\x49\x74\x67\x06\xdd\x99\x47\x77\x96\xd0\x9d\x35\x74\xe7\x2a\xba\xab\x19\xdd\x15\x44\x77\xf5\xa0\xbb\xfa\xd1\x5d\xc3\xe8\xae\x71\x74\xd7\x34\xba\x6b\x0e\xdd\xb5\x82\xf2\x4d\x28\xdf\x81\xf2\xdd\x28\xdf\x87\xf2\x43\x28\x3f\x86\xf2\x53\x28\x3f\x8b\xf2\x4b\xe8\xee\x06\x74\x77\x00\xdd\x1d\x41\x77\xf7\xa2\xbb\xd3\xe8\xee\x51\x74\xf7\x24\xba\xbb\x82\xee\x5e\x44\xf7\xd4\xa3\x7b\xda\xd0\x3d\x61\x74\x4f\x1c\xdd\x33\x80\xee\xc9\xa2\x7b\x26\xd0\x3d\x33\xe8\x9e\x05\x74\x6f\x1d\xba\xb7\x15\xdd\xdb\x89\xee\x8d\xa1\x7b\x53\xe8\xde\x11\x74\x6f\x01\xdd\x5b\x46\xf7\xce\xa3\x7b\x57\x51\xa1\x19\x15\x82\xa8\xd0\x83\x0a\xfd\xa8\x30\x8c\x0a\xe3\xa8\x30\x8d\x0a\x73\xa8\xb0\x82\xee\x6b\x42\xf7\x75\xa0\xfb\xba\xd1\x7d\x7d\xe8\xbe\x21\x74\xdf\x18\xba\x6f\x0a\xdd\x37\x8b\xee\x5b\x46\xf7\x37\xa2\xfb\xdb\xd1\xfd\x5d\xe8\xfe\x04\xba\x7f\x10\xdd\x9f\x43\xf7\x17\xd1\xfd\x55\x74\xff\x12\x7a\xa0\x1e\x3d\xd0\x86\x1e\x08\xa3\x07\xe2\xe8\x81\x01\xf4\x40\x16\x3d\x30\x81\x1e\x98\x41\x0f\x2c\xa0\x89\x3a\x34\xd1\x8a\x26\x3a\xd1\x44\x0c\x4d\xa4\xd0\xc4\x08\x9a\x28\xa0\x89\x32\x9a\x98\x47\x0f\x82\x1e\x6c\x41\x0f\x86\xd0\x83\x51\xf4\x60\x12\x3d\x98\x41\x0f\xe6\xd1\x83\x25\xf4\x60\x0d\x3d\xb8\x8a\x1e\x6a\x42\x0f\x75\xa0\x87\xba\xd1\x43\x7d\xe8\xa1\x21\xf4\xd0\x18\x7a\x68\x0a\x3d\x34\x8b\x1e\x5a\x46\x0f\x37\xa2\x87\xdb\xd1\xc3\x5d\xe8\xe1\x04\x7a\x78\x10\x3d\x9c\x43\x0f\x17\xd1\xc3\x55\xf4\xf0\x12\x9a\x6c\x40\x93\x01\x34\x19\x41\x93\xbd\x68\x32\x8d\x26\x47\xd1\xe4\x24\x9a\xac\xa0\xc9\x45\xf4\x48\x3d\x7a\xa4\x15\x3d\xd2\x89\x1e\x89\xa1\x47\x52\xe8\x91\x11\xf4\x48\x01\x3d\x52\x46\x8f\xcc\xa3\x47\x41\x8f\xb6\xa0\x47\x43\xe8\xd1\x28\x7a\x34\x89\x1e\xcd\xa0\x47\xf3\xe8\xd1\x12\x7a\xb4\x86\x1e\x5d\x45\x8f\x35\xa3\xc7\x82\xe8\xb1\x1e\xf4\x58\x3f\x7a\x6c\x18\x3d\x36\x8e\x1e\x9b\x46\x8f\xcd\xa1\xc7\x56\x50\xb1\x09\x15\xdb\x51\xb1\x0b\x15\x13\xa8\x38\x88\x8a\x39\x54\x2c\xa2\x62\x15\x15\x97\xd0\xe3\x0d\xe8\xf1\x00\x7a\x3c\x82\x1e\xef\x45\x8f\xa7\xd1\xe3\xa3\xe8\xf1\x49\xf4\x78\x05\x3d\xbe\x88\x9e\xa8\x47\x4f\xb4\xa1\x27\xc2\xe8\x89\x38\x7a\x62\x00\x3d\x91\x45\x4f\x4c\xa0\x27\x66\xd0\x13\x0b\xe8\xc9\x3a\xf4\x64\x2b\x7a\x32\x84\x9e\x8c\xa2\x27\x93\xe8\xc9\x0c\x7a\x32\x8f\x9e\x2c\xa1\x27\x6b\xe8\xc9\x55\x34\xd5\x8c\xa6\x82\x68\xaa\x07\x4d\xf5\xa3\xa9\x61\x34\x35\x8e\xa6\xa6\xd1\xd4\x1c\x9a\x5a\x41\x4f\x35\xa1\xa7\x3a\xd0\x53\xdd\xe8\xa9\x3e\xf4\xd4\x10\x7a\x6a\x0c\x3d\x35\x85\x9e\x9a\x45\x4f\x2d\xa3\xa7\x1b\xd1\xd3\xed\xe8\xe9\x08\x7a\xba\x17\x3d\x9d\x46\x4f\x8f\xa2\xa7\x27\xd1\xd3\x15\xf4\xf4\x22\x7a\xa6\x1e\x3d\xd3\x86\x9e\x09\xa3\x67\xe2\xe8\x99\x01\xf4\x4c\x16\x3d\x33\x81\x9e\x99\x41\xcf\x2c\xa0\xe9\x3a\x34\xdd\x8a\xa6\x3b\xd1\x74\x0c\x4d\xa7\xd0\xf4\x08\x9a\x2e\xa0\xe9\x32\x9a\x9e\x47\xcf\x82\x9e\x6d\x41\xcf\x86\xd0\xb3\x3d\xe8\xd9\x7e\xf4\xec\x30\x7a\x76\x1c\x3d\x3b\x8d\x9e\x9d\x43\xcf\xae\xa0\xe7\x9a\xd0\x73\x1d\xe8\xb9\x6e\xf4\x5c\x1f\x7a\x6e\x08\x3d\x37\x86\x9e\x9b\x42\xcf\xcd\xa2\xe7\x96\xd1\xf3\x8d\xe8\xf9\x76\xf4\x7c\x17\x7a\x3e\x81\x9e\x1f\x44\xcf\xe7\xd0\xf3\x45\xf4\x7c\x15\x3d\xbf\x84\x4a\x0d\xa8\x14\x40\xa5\x08\x2a\xc5\x51\x69\x00\x95\xb2\xa8\x34\x81\x4a\x33\xa8\xb4\x80\x5e\xa8\x43\x2f\xb4\xa2\x17\x3a\xd1\x0b\x31\xf4\x42\x0a\xbd\x30\x82\x5e\x28\xa0\x17\xca\xe8\x85\x79\xf4\x22\xe8\xc5\x16\xf4\x62\x08\xbd\x18\x45\x2f\x26\xd1\x8b\x19\xf4\x62\x1e\xbd\x58\x42\x2f\xd6\xd0\x8b\xab\xe8\xa5\x66\xf4\x52\x10\xbd\xd4\x83\x5e\xea\x43\x2f\x0d\xa1\x97\xc6\xd0\x4b\x53\xe8\xa5\x59\xf4\xd2\x32\x2a\x37\xa2\x72\x3b\x2a\x77\xa1\x72\x02\x95\x07\x51\x39\x87\xca\x45\x54\xae\xa2\xf2\x12\x7a\xb9\x01\xbd\x1c\x40\x2f\x47\xd0\xcb\xbd\xe8\xe5\x34\x7a\x79\x14\xbd\x3c\x89\x5e\xae\xa0\x97\x17\xd1\x2b\xf5\xe8\x95\x36\xf4\x4a\x18\xbd\x12\x47\xaf\xa4\xd0\x2b\x23\xe8\x95\x02\x7a\xa5\x8c\x5e\x99\x47\xaf\x82\x5e\x6d\x41\xaf\x86\xd0\xab\x51\xf4\x6a\x12\xbd\x9a\x41\xaf\xe6\xd1\xab\x25\xf4\x6a\x0d\xbd\xba\x8a\x66\x9a\xd1\x4c\x10\xcd\xf4\xa0\x99\x7e\x34\x33\x8c\x66\xc6\xd1\xcc\x34\x9a\x99\x43\x33\x2b\xe8\xb5\x26\xf4\x5a\x07\x7a\xad\x1b\xbd\xd6\x87\x5e\x1b\x44\xaf\xe5\xd0\x6b\x45\xf4\x5a\x15\xbd\xb6\x84\x5e\x6f\x40\xaf\x07\xd0\xeb\x11\xf4\x7a\x2f\x7a\x3d\x8d\x5e\x1f\x45\xaf\x4f\xa2\xd7\x2b\xe8\xf5\x45\xf4\x46\x3d\x7a\xa3\x0d\xbd\x11\x46\x6f\xc4\xd1\x1b\x03\xe8\x8d\x2c\x7a\x63\x02\xbd\x31\x83\xde\x58\x40\x95\x3a\x54\x69\x45\x95\x4e\x54\x89\xa1\x4a\x0a\x55\x32\xa8\x92\x47\x95\x12\xaa\xd4\x50\x65\x15\xbd\xd9\x8c\xde\x0c\xa2\x37\x7b\xd0\x9b\xfd\xe8\xcd\x61\xf4\xe6\x38\x7a\x73\x1a\xbd\x39\x87\xde\x5c\x41\x6f\x35\xa1\xb7\x3a\xd0\x5b\xdd\xe8\xad\x3e\xf4\xd6\x10\x7a\x6b\x0c\xbd\x35\x85\xde\x9a\x45\x6f\x2d\xa3\xb7\x1b\xd1\xdb\xed\xe8\xed\x2e\xf4\x76\x02\xbd\x3d\x88\xde\x1e\x45\x6f\x4f\xa2\xb7\x2b\xe8\xed\x45\x54\xad\x47\xd5\x36\x54\x0d\xa3\x6a\x1c\x55\x07\x50\x35\x8b\xaa\x13\xa8\x3a\x83\xaa\x0b\xe8\x9d\x3a\xf4\x4e\x2b\x7a\xa7\x13\xbd\x13\x43\xef\xa4\xd0\x3b\x23\xe8\x9d\x02\x7a\xa7\x8c\xde\x99\x47\xef\x82\xde\x6d\x41\xef\x86\xd0\xbb\x51\xf4\x6e\x12\xbd\x9b\x41\xef\x8e\xa3\x77\xa7\xd1\xbb\x73\xe8\xdd\x15\xf4\x5e\x13\x7a\xaf\x03\xbd\xd7\x8d\xde\xeb\x43\xef\x0d\xa1\xf7\xc6\xd0\x7b\x53\xe8\xbd\x59\xf4\xde\x32\x9a\x6d\x44\xb3\xed\x68\xb6\x0b\xcd\x26\xd0\xec\x20\x9a\xcd\xa1\xd9\x22\x9a\xad\xa2\xd9\x25\xf4\x7e\x03\x7a\x3f\x80\xde\x8f\xa0\xf7\x7b\xd1\xfb\x69\xf4\xfe\x28\x7a\x7f\x02\xbd\x3f\x83\xde\x5f\x40\x1f\xd4\xa1\x0f\x5a\xd1\x07\x9d\xe8\x83\x18\xfa\x20\x85\x3e\x18\x41\x1f\x14\xd0\x07\x65\xf4\xc1\x3c\xfa\x10\xf4\x61\x0b\xfa\x30\x84\x3e\x8c\xa2\x0f\x93\xe8\xc3\x0c\xfa\x30\x8f\x3e\x2c\xa1\x0f\x6b\xe8\xc3\x55\x34\xd7\x8c\xe6\x82\x68\xae\x07\xcd\xf5\xa3\xb9\x61\x34\x37\x8e\xe6\xa6\xd0\xdc\x2c\x9a\x5b\x46\x1f\x35\xa2\x8f\xda\xd1\x47\x5d\xe8\xa3\x04\xfa\x68\x10\x7d\x94\x43\x1f\x15\xd1\x47\x55\xf4\xd1\x12\xfa\xb8\x01\x7d\x1c\x40\x1f\x47\xd0\xc7\xbd\xe8\xe3\x34\xfa\x78\x14\x7d\x3c\x89\x3e\xae\xa0\x8f\x17\xd1\x27\xf5\xe8\x93\x36\xf4\x49\x18\x7d\x12\x47\x9f\x0c\xa0\x4f\xb2\xe8\x93\x09\xf4\x49\x19\x7d\x32\x8f\x6a\xa0\x5a\x0b\xaa\x85\x50\x2d\x8a\x6a\x49\x54\xcb\xa0\x5a\x1e\xd5\x4a\xa8\x56\x43\xb5\x55\xf4\x69\x33\xfa\x34\x88\x3e\xed\x41\x9f\xf6\xa3\x4f\x87\xd1\xa7\xe3\xe8\xd3\x69\xf4\xe9\x1c\xfa\x74\x05\x7d\xd6\x84\x3e\xeb\x40\x9f\x75\xa3\xcf\xfa\xd0\x67\x43\xe8\xb3\x31\xf4\xd9\x14\xfa\xac\x8a\x3e\x5b\x42\x9f\x37\xa0\xcf\x03\xe8\xf3\x08\xfa\xbc\x17\x7d\x9e\x46\x9f\x8f\xa2\xcf\x27\xd1\xe7\x15\xf4\xf9\x22\x9a\xaf\x47\xf3\x6d\x68\x3e\x8c\xe6\xe3\x68\x7e\x00\xcd\x67\xd1\xfc\x04\x9a\x9f\x41\xf3\x0b\xe8\x37\x75\xe8\x37\xad\xe8\x37\x9d\xe8\x37\x31\xf4\x9b\x14\xfa\xcd\x08\xfa\x4d\x01\xfd\xa6\x8c\x7e\x53\x43\xbf\x59\x45\xbf\x6d\x46\xbf\x0d\xa2\xdf\xf6\xa0\xdf\xf6\xa3\xdf\x0e\xa3\xdf\x8e\xa3\xdf\x4e\xa3\xdf\xce\xa1\xdf\xae\xa0\xdf\x35\xa1\xdf\x75\xa0\xdf\x75\xa3\xdf\xf5\xa1\xdf\x0d\xa1\xdf\x8d\xa1\xdf\x4d\xa1\xdf\xcd\xa2\xdf\x2d\xa3\x85\x46\xb4\xd0\x8e\x16\xba\xd0\x42\x02\x2d\x0c\xa2\x85\x1c\x5a\x28\xa2\x85\x2a\x5a\x58\x44\xbf\xaf\x47\xbf\x6f\x43\xbf\x0f\xa3\xdf\xc7\xd1\xef\x07\xd0\xef\xb3\xe8\xf7\x13\xe8\xf7\x33\xe8\xf7\x0b\xe8\x0f\x75\xe8\x0f\xad\xe8\x0f\x9d\xe8\x0f\x31\xf4\x87\x14\xfa\xc3\x08\xfa\x43\x01\xfd\xa1\x8c\xfe\x30\x8f\xfe\x08\xfa\x63\x0b\xfa\x63\x08\xfd\x31\x8a\xfe\x98\x44\x7f\xcc\xa0\x3f\xe6\xd1\x1f\x4b\xe8\x8f\x35\xf4\xc7\x15\xb4\xd8\x84\x16\x3b\xd0\x62\x37\x5a\xec\x43\x8b\x43\x68\x71\x0c\x2d\x4e\xa1\xc5\x59\xb4\xb8\x8c\xfe\xd4\x88\xfe\xd4\x8e\xfe\xd4\x85\xfe\x94\x40\x7f\x1a\x44\x7f\xca\xa1\x3f\x15\xd1\x9f\xaa\xe8\x4f\x4b\xe8\xcf\x0d\xe8\xcf\x01\xf4\xe7\x08\xfa\x73\x2f\xfa\x73\x1a\xfd\x79\x14\xfd\x79\x12\xfd\xb9\x82\xfe\xbc\x88\xfe\x52\x87\xfe\xd2\x8a\xfe\xd2\x89\xfe\x12\x43\x7f\x49\xa1\xbf\x8c\xa0\xbf\x14\xd0\x5f\xca\xe8\x2f\xf3\x68\x09\xb4\xd4\x82\x96\x42\x68\x29\x8a\x96\x92\x68\x29\x83\x96\xf2\x68\xa9\x84\x96\x6a\x68\x69\x15\xfd\xb5\x19\xfd\x35\x88\xfe\xda\x83\xfe\xda\x8f\xfe\x3a\x8c\xfe\x3a\x8e\xfe\x3a\x8d\xfe\x3a\x87\xfe\xba\x82\xfe\xd6\x88\xfe\xd6\x8e\xfe\xd6\x85\xfe\x96\x40\x7f\x1b\x44\x7f\xcb\xa1\xbf\x15\xd1\xdf\xaa\xe8\x6f\x4b\xe8\xef\x0d\xe8\xef\x01\xf4\xf7\x08\xfa\x7b\x2f\xfa\x7b\x1a\xfd\x7d\x14\xfd\x7d\x12\xfd\xbd\x82\xfe\xbe\x88\x96\xeb\xd1\x72\x1b\x5a\x0e\xa3\xe5\x38\x5a\x1e\x40\xcb\x59\xb4\x3c\x81\x96\x67\xd0\xf2\x02\xfa\xa2\x0e\x7d\xd1\x82\xbe\x08\xa1\x2f\xa2\xe8\x8b\x24\xfa\x22\x83\xbe\xc8\xa3\x2f\x4a\xe8\x8b\x1a\xfa\x62\x15\xfd\xa3\x19\xfd\x23\x88\xfe\xd1\x83\xfe\xd1\x8f\xfe\x31\x8c\xfe\x31\x8e\xfe\x31\x8d\xfe\x31\x87\xfe\xb1\x82\xfe\xd9\x84\xfe\xd9\x81\xfe\xd9\x8d\xfe\xd9\x87\xfe\x39\x84\xfe\x39\x86\xfe\x39\x85\xfe\x39\x8b\xfe\xb9\x8c\x56\x1a\xd1\x4a\x00\xad\x44\xd0\x4a\x2f\x5a\x49\xa3\x95\x51\xb4\x32\x89\x56\x2a\x68\x65\x11\xfd\xab\x1e\xfd\xab\x0d\xfd\x2b\x8c\xfe\x15\x47\xff\x1a\x40\xff\xca\xa2\x7f\x4d\xa0\x7f\xcd\xa0\x7f\x2d\xa0\x7f\xd7\xa1\x7f\xb7\xa2\x7f\x77\xa2\x7f\xc7\xd0\xbf\x53\xe8\xdf\x23\xe8\xdf\x05\xf4\xef\x32\xfa\xf7\x3c\xfa\x12\xf4\x65\x0b\xfa\x32\x88\xbe\xec\x41\x5f\xf6\xa3\x2f\x87\xd1\x97\xe3\xe8\xcb\x69\xf4\xe5\x1c\xfa\x72\x05\xad\x36\xa1\xd5\x0e\xb4\xda\x8d\x56\xfb\xd0\xea\x10\x5a\x1d\x43\xab\x53\x68\x75\x16\xad\x2e\xa3\xff\x34\xa2\xff\xb4\xa3\xff\x74\xa1\xff\x24\xd0\x7f\x06\xd1\x7f\x72\xe8\x3f\x45\xf4\x9f\x2a\xfa\xcf\x12\xfa\x6f\x03\xfa\x6f\x00\xfd\x37\x8c\xfe\x1b\x47\xff\x1d\x40\xff\xcd\xa2\xff\x4e\xa0\xff\xce\xa0\xff\x2e\xa0\xff\xd5\xa1\xff\xb5\xa2\xff\x75\xa2\xff\xc5\xd0\xff\x52\xe8\x7f\x23\xe8\x7f\x05\xf4\xbf\x32\xfa\xdf\x3c\x06\x4c\x0b\x26\x84\x89\x62\x92\x98\x0c\x26\x8f\x29\x61\x6a\x98\x55\xfc\x7f\xcd\xf8\xff\x82\xf8\xff\xba\xf1\xff\xf5\xe1\xff\x1b\xc2\xff\x37\x86\xff\x6f\x0a\xff\xdf\x2c\xfe\xbf\x65\xfc\x95\x46\xfc\x95\x76\xfc\x95\x2e\xfc\x95\x04\xfe\xca\x20\xfe\x4a\x0e\x7f\xa5\x88\xbf\x52\xc5\x5f\x59\xc2\x5f\x6d\xc0\x5f\x0d\xe0\xaf\x46\xf0\x57\x7b\xf1\x57\xd3\xf8\xab\xa3\xf8\xab\x93\xf8\xab\x15\xfc\xd5\x45\x5c\x57\x8f\xeb\xda\x70\x5d\x18\xd7\xc5\x70\x5d\x0a\xd7\x8d\xe0\xba\x02\xae\x2b\xe3\xba\x79\xfc\x35\xf0\xd7\x5a\xf0\xd7\x42\xf8\x6b\x51\xfc\xb5\x24\xfe\x5a\x06\x7f\x2d\x8f\xbf\x56\xc2\x5f\xab\xe1\xaf\xad\xe2\xaf\x37\xe3\xaf\x07\xf1\xd7\x7b\xf0\xd7\xfb\xf1\xd7\x87\xf1\xd7\xc7\xf1\xd7\xa7\xf1\xd7\xe7\xf0\xd7\x57\xf0\x37\x9a\xf0\x37\x3a\xf0\x37\xba\xf1\x37\x12\xf8\x1b\x83\xf8\x1b\x39\xfc\x8d\x22\xfe\x46\x15\x7f\x63\x09\xd7\x37\xe0\xfa\x00\xae\x8f\xe0\xfa\x5e\x5c\x9f\xc6\xf5\xa3\xb8\x7e\x12\xd7\x57\x70\xfd\x22\xfe\x66\x3d\xfe\x66\x1b\xfe\x66\x18\x7f\x33\x8e\xbf\x39\x80\xbf\x99\xc5\xdf\x9c\xc0\xdf\x9c\xc1\xdf\x5c\xc0\xdf\xaa\xc3\xdf\x6a\xc5\xdf\xea\xc4\xdf\x8a\xe1\x6f\x25\xf1\xb7\x32\xf8\x5b\x79\xfc\xad\x12\xfe\x56\x0d\x7f\x6b\x15\x7f\xbb\x19\x7f\x3b\x88\xbf\xdd\x83\xbf\xdd\x8f\xbf\x3d\x8c\xbf\x3d\x8e\xbf\x3d\x8d\xbf\x3d\x87\xbf\xbd\x82\x1b\x9a\x70\x43\x07\x6e\xe8\xc6\x0d\x7d\xb8\x61\x08\x37\x8c\xe1\x86\x29\xdc\x30\x8b\x1b\x96\xf1\x77\x1a\xf1\x77\xda\xf1\x77\xba\xf0\x77\x12\xf8\x3b\x69\xfc\x9d\x51\xfc\x9d\x49\xfc\x9d\x0a\xfe\xce\x22\xfe\x6e\x3d\xfe\x6e\x1b\xfe\x6e\x18\x7f\x37\x8e\xbf\x3b\x80\xbf\x9b\xc5\xdf\x9d\xc0\xdf\x9d\xc1\xdf\x5d\xc0\xdf\xab\xc3\xdf\x6b\xc5\xdf\xeb\xc4\xdf\x8b\xe1\xef\xa5\xf0\xf7\x46\xf0\xf7\x0a\xf8\x7b\x65\xfc\xbd\x79\xdc\x08\x6e\x6c\xc1\x8d\x21\xdc\x18\xc5\x8d\x49\xdc\x38\x8c\x1b\xc7\x71\xe3\x34\x6e\x9c\xc3\x8d\x2b\xf8\xfb\x4d\xf8\xfb\x1d\xf8\xfb\xdd\xf8\xfb\x7d\xf8\xfb\x43\xf8\xfb\x63\xf8\xfb\x53\xf8\xfb\xb3\xf8\xfb\xcb\x58\x8d\x58\xed\x58\x5d\x58\x09\xac\x41\xac\x1c\x56\x11\xab\x8a\xb5\x84\xdd\x80\x1d\xc0\x8e\x60\xf7\x62\xa7\xb1\xb3\xd8\x13\xd8\x33\xd8\x0b\xb8\xa9\x0e\x37\xb5\xe2\xa6\x4e\xdc\x14\xc3\x4d\x29\xdc\x34\x82\x9b\x0a\xb8\xa9\x8c\x9b\xe6\xf1\x0f\xc0\x3f\x68\xc1\x3f\x08\xe1\x1f\x44\xf1\x0f\x92\xf8\x07\x19\xfc\x83\x3c\xfe\x41\x09\xff\xa0\x86\x7f\xb0\x8a\x7f\xd8\x8c\x7f\x18\xc4\x3f\xec\xc1\x3f\xec\xc7\x3f\x1c\xc6\x3f\x1c\xc3\x3f\x9c\xc2\x3f\x9c\xc5\x3f\x5c\xc6\x3f\x6a\xc4\x3f\x6a\xc7\x3f\xea\xc2\x3f\x4a\xe0\x1f\x0d\xe2\x1f\xe5\xf0\x8f\x8a\xf8\x47\x55\xfc\xa3\x25\xdc\xdc\x80\x9b\x03\xb8\x39\x82\x9b\x7b\x71\x73\x1a\x37\x8f\xe2\xe6\x49\xdc\x5c\xc1\xcd\x8b\xf8\xc7\xf5\xf8\xc7\x6d\xf8\xc7\x61\xfc\xe3\x38\xfe\xf1\x00\xfe\x71\x16\xff\xb8\x80\x7f\x5c\xc6\x3f\x9e\xc7\x3f\x01\xff\xa4\x05\xff\x24\x84\x7f\x12\xc5\x3f\x49\xe2\x9f\x64\xf0\x4f\xf2\xf8\x27\x25\xfc\x93\x1a\xfe\xc9\x2a\xfe\x69\x33\xfe\x69\x10\xff\xb4\x07\xff\xb4\x1f\xff\x74\x18\xff\x74\x1c\xff\x74\x1a\xff\x74\x0e\xff\x74\x05\xb7\x34\xe1\x96\x0e\xdc\xd2\x8d\x5b\xfa\x70\xcb\x10\x6e\x19\xc3\x2d\x45\xdc\x52\xc5\x2d\x4b\xf8\x67\x0d\xf8\x67\x01\xfc\xb3\x08\xfe\x59\x2f\xfe\x59\x1a\xff\x6c\x14\xff\x6c\x12\xff\xac\x82\x7f\xb6\x88\x7f\x5e\x8f\x7f\xde\x86\x7f\x1e\xc6\x3f\x8f\xe3\x9f\x0f\xe0\x9f\x67\xf1\xcf\x27\xf0\xcf\x67\xf0\xcf\x17\xf0\x2f\xea\xf0\x2f\x5a\xf1\x2f\x3a\xf1\x2f\x62\xf8\x17\x29\xfc\x8b\x11\xfc\x8b\x02\xfe\x45\x09\xff\xa2\x86\x7f\xb1\x8a\x5b\x9b\x71\x6b\x10\xb7\xf6\xe0\xd6\x7e\xdc\x3a\x8c\x5b\xc7\x71\xeb\x34\x6e\x9d\xc3\xad\x2b\xf8\x97\x4d\xf8\x97\x1d\xf8\x97\xdd\xf8\x97\x7d\xf8\x97\x43\xf8\x97\x63\xf8\x97\x53\xf8\x97\xb3\xf8\x97\xcb\xf8\x57\x8d\xf8\x57\xed\xf8\x57\x5d\xf8\x57\x09\xfc\xab\x41\xfc\xab\x1c\xfe\x55\x11\xff\xaa\x82\x7f\xb5\x88\x7f\x5d\x8f\x7f\xdd\x86\x7f\x1d\xc6\xbf\x8e\xe3\x5f\x0f\xe0\x5f\x67\xf1\xaf\x27\xf0\xaf\x67\xf0\xaf\x17\x70\x5b\x1d\x6e\x6b\xc5\x6d\x9d\xb8\x2d\x86\xdb\x52\xb8\x6d\x04\xb7\x15\x70\x5b\x19\xb7\xcd\xe3\x35\xc0\x6b\xb4\xe0\x35\x42\x78\x8d\x28\x5e\x23\x89\xd7\xc8\xe0\x35\xf2\x78\x8d\x12\x5e\x63\x0e\xaf\xb1\x82\xd7\x6c\xc2\x6b\x76\xe0\x35\xbb\xf1\x9a\x7d\x78\xcd\x21\xbc\xe6\x18\x5e\x73\x0a\xaf\x39\x8b\xd7\x5c\xc6\x6b\x35\xe2\xb5\xda\xf1\x5a\x5d\x78\xad\x04\x5e\x6b\x10\xaf\x95\xc3\x6b\x15\xf1\x5a\x55\xbc\xd6\x12\x0e\x34\xe0\x40\x00\x07\x22\x38\xd0\x8b\x03\x69\x1c\x18\xc5\x81\x49\x1c\xa8\xe0\xc0\x02\x5e\xbb\x0e\xaf\xdd\x8a\xd7\xee\xc4\x6b\xc7\xf0\xda\x29\xbc\xf6\x08\x5e\xbb\x80\xd7\x2e\xe3\xb5\xe7\xf1\x3a\xe0\x75\x5a\xf0\x3a\x21\xbc\x4e\x14\xaf\x93\xc4\xeb\x64\xf0\x3a\x79\xbc\x4e\x09\xaf\x53\xc3\xeb\xac\xe2\x75\x9b\xf1\xba\x41\xbc\x6e\x0f\x5e\xb7\x1f\xaf\x3b\x8c\xd7\x1d\xc7\xeb\x4e\xe3\x75\xe7\xf0\xba\xcb\xb8\xbd\x11\xb7\xb7\xe3\xf6\x2e\xdc\x9e\xc0\xed\x83\xb8\x3d\x87\xdb\x8b\xb8\xbd\x8a\xdb\x97\xf0\x7a\x0d\x78\xbd\x00\x5e\x2f\x82\xd7\xeb\xc5\xeb\xa5\xf1\x7a\xa3\x78\xbd\x49\xbc\x5e\x05\xaf\xb7\x88\xd7\xaf\xc7\xeb\xb7\xe1\xf5\xc3\x78\xfd\x38\x5e\x7f\x00\xaf\x9f\xc5\xeb\x4f\xe0\xf5\x67\xf0\xfa\x0b\x78\x03\xf0\x06\x2d\x78\x83\x10\xde\x20\x8a\x37\x48\xe2\x0d\x32\x78\x83\x3c\xde\xa0\x84\x37\xa8\xe1\x0d\x56\x71\x47\x33\xee\x08\xe2\x8e\x1e\xdc\xd1\x8f\x3b\x86\x71\xc7\x38\xee\x98\xc6\x1d\x73\xb8\x63\x05\x6f\xd8\x84\x37\xec\xc0\x1b\x76\xe3\x0d\xfb\xf0\x86\x43\x78\xc3\x31\xbc\xe1\x14\xde\x70\x16\x6f\xb8\x8c\x37\x6a\xc0\x1b\x05\xf0\x46\x11\xbc\x51\x2f\xde\x28\x8d\x37\x1a\xc5\x1b\x4d\xe2\x8d\x2a\x78\xa3\x45\xbc\x71\x3d\xde\xb8\x0d\x6f\x1c\xc6\x1b\xc7\xf1\xc6\x03\x78\xe3\x2c\xde\x78\x02\x6f\x3c\x83\x37\x5e\xc0\xc1\x3a\x1c\x6c\xc5\xc1\x4e\x1c\x8c\xe1\x60\x0a\x07\x47\x70\xb0\x80\x83\x65\x1c\x9c\xc7\x9b\x80\x37\x69\xc6\x9b\x04\xf1\x26\x3d\x78\x93\x7e\xbc\xc9\x30\xde\x64\x1c\x6f\x32\x8d\x37\x99\xc3\x9b\xac\xe0\x4d\x9b\xf0\xa6\x1d\x78\xd3\x6e\xbc\x69\x1f\xde\x74\x08\x6f\x3a\x86\x37\x9d\xc2\x9b\xce\xe2\x4d\x97\xf1\x66\x8d\x78\xb3\x76\xbc\x59\x17\xde\x2c\x81\x37\x1b\xc4\x9b\xe5\xf0\x66\x45\xbc\x59\x15\x6f\xb6\x84\x43\x0d\x38\xd4\x86\x43\x61\x1c\x8a\xe3\xd0\x00\x0e\x65\x71\x68\x02\x87\x66\x70\x68\x01\x6f\x5e\x87\x37\x6f\xc5\x9b\x77\xe2\xcd\x63\x78\xf3\x14\xde\x7c\x04\x6f\x5e\xc0\x9b\x97\xf1\xe6\xf3\x78\x0b\xf0\x16\x2d\x78\x8b\x10\xde\x22\x8a\xb7\x48\xe2\x2d\x32\x78\x8b\x3c\xde\xa2\x84\xb7\xa8\xe1\x2d\x56\xf1\x96\xcd\x78\xcb\x0e\xbc\x65\x37\xde\xb2\x0f\x6f\x39\x84\xb7\x1c\xc3\x5b\x4e\xe1\x2d\x67\xf1\x96\xcb\xb8\xb3\x11\x77\xb6\xe3\xce\x2e\xdc\x99\xc0\x9d\x83\xb8\x33\x87\x3b\x8b\xb8\xb3\x8a\x3b\x97\xf0\x56\x0d\x78\xab\x00\xde\x2a\x82\xb7\xea\xc5\x5b\xa5\xf1\x56\xa3\x78\xab\x49\xbc\x55\x05\x6f\xb5\x88\xb7\xae\xc7\x5b\xb7\xe1\xad\x3b\xf1\xd6\x31\xbc\x75\x0a\x6f\x3d\x82\xb7\x2e\xe0\xad\xcb\x78\xeb\x79\xbc\x0d\x78\x9b\x16\xbc\x4d\x08\x6f\x13\xc5\xdb\x24\xf1\x36\x19\xbc\x4d\x1e\x6f\x53\xc2\xdb\xd4\xf0\x36\xab\x38\xdc\x8c\xc3\x41\x1c\xee\xc1\xe1\x7e\x1c\x1e\xc6\xe1\x71\x1c\x9e\xc6\xe1\x39\x1c\x5e\xc1\xdb\x36\xe1\x6d\x3b\xf0\xb6\x5d\x78\xdb\x04\xde\x76\x10\x6f\x9b\xc3\xdb\x16\xf1\xb6\x55\xbc\xed\x12\xde\xae\x01\x6f\x17\xc0\xdb\x45\xf0\x76\xbd\x78\xbb\x34\xde\x6e\x14\x6f\x37\x89\xb7\xab\xe0\xed\x16\xf1\xf6\xf5\x78\xfb\x36\xbc\x7d\x18\x6f\x1f\xc7\xdb\x0f\xe0\xed\xb3\x78\xfb\x09\xbc\xfd\x0c\xde\x7e\x01\x47\xea\x70\xa4\x15\x47\x3a\x71\x24\x8a\x23\x49\x1c\xc9\xe0\x48\x1e\x47\x4a\x38\x52\xc3\x91\x55\xbc\x43\x33\xde\x21\x88\x77\xe8\xc1\x3b\xf4\xe3\x1d\x86\xf1\x0e\xe3\x78\x87\x69\xbc\xc3\x1c\xde\x61\x05\xef\xd8\x84\x77\xec\xc0\x3b\x76\xe3\x1d\xfb\xf0\x8e\x43\x78\xc7\x31\xbc\xe3\x14\xde\x71\x16\xef\xb8\x8c\x77\x6a\xc4\x3b\xb5\xe3\x9d\xba\xf0\x4e\xbd\x78\xa7\x34\xde\x69\x14\xef\x34\x89\x77\xaa\xe0\x9d\x16\x71\x57\x3d\xee\x6a\xc3\x5d\x61\xdc\x15\xc7\x5d\x03\xb8\x2b\x8b\xbb\x26\x70\xd7\x0c\xee\x5a\xc0\x3b\xd7\xe1\x9d\x5b\xf1\xce\x9d\x78\xe7\x18\xde\x39\x85\x77\x1e\xc1\x3b\x17\xf0\xce\x65\xbc\xf3\x3c\xde\x05\xbc\x4b\x0b\xde\x25\x84\x77\x89\xe2\x5d\xfa\xf1\x2e\xc3\x78\x97\x71\xbc\xcb\x34\xde\x65\x0e\xef\xb2\x82\x77\x6d\xc2\xbb\x76\xe0\x5d\xbb\xf1\xae\x7d\x78\xd7\x21\xbc\xeb\x18\xde\x75\x0a\xef\x3a\x8b\x77\x5d\xc6\xdd\x8d\xb8\xbb\x1d\x77\x77\xe1\xee\x04\xee\x1e\xc4\xdd\x39\xdc\x5d\xc4\xdd\x55\xdc\xbd\x84\x77\x6b\xc0\xbb\x05\xf0\x6e\x11\xbc\x5b\x2f\xde\x6d\x00\xef\x96\xc5\xbb\x4d\xe0\xdd\x66\xf0\x6e\x0b\x78\xf7\x3a\xbc\x7b\x2b\xde\xbd\x13\xef\x1e\xc3\xbb\xa7\xf0\xee\x23\x78\xf7\x02\xde\xbd\x8c\x77\x9f\xc7\x7b\x80\xf7\x68\xc1\x7b\x84\xf0\x1e\x51\xbc\x47\x12\xef\x91\xc1\x7b\xe4\xf1\x1e\x25\xbc\x47\x0d\xef\xb1\x8a\x7b\x9a\x71\x4f\x10\xf7\xf4\xe0\x9e\x7e\xdc\x33\x84\x7b\xc6\x70\xcf\x14\xee\x99\xc5\x3d\xcb\x78\xcf\x46\xbc\x67\x3b\xde\xb3\x0b\xef\x99\xc0\x7b\x0e\xe2\x3d\x73\x78\xcf\x22\xde\xb3\x8a\xf7\x5c\xc2\x7b\x35\xe0\xbd\x02\x78\xaf\x08\xde\xab\x17\xef\x95\xc6\x7b\x8d\xe2\xbd\x26\xf1\x5e\x15\xbc\xd7\x22\xde\xbb\x1e\xef\xdd\x86\xf7\x0e\xe3\xbd\xe3\x78\xef\x01\xbc\xf7\x08\xde\xbb\x80\xf7\x2e\xe3\xbd\xe7\x71\x14\x1c\x6d\xc1\xd1\x10\x8e\x46\x71\x34\x89\xa3\x19\x1c\xcd\xe3\x68\x09\x47\x6b\x38\xba\x8a\xf7\x69\xc6\xfb\x04\xf1\x3e\x3d\x78\x9f\x7e\xbc\xcf\x30\xde\x67\x1c\xef\x33\x8d\xf7\x99\xc3\xfb\xac\xe0\x7d\x9b\xf0\xbe\x1d\x78\xdf\x6e\xbc\x6f\x1f\xde\x77\x08\xef\x9b\xc3\xfb\x16\xf1\xbe\x55\xbc\xef\x12\xde\xaf\x01\xef\x17\xc0\xfb\x45\xf0\x7e\xbd\x78\xbf\x34\xde\x6f\x14\xef\x37\x89\xf7\xab\xe0\xfd\x16\x71\xac\x1e\xc7\xda\x70\x2c\x8c\x63\x71\x1c\x1b\xc0\xb1\x2c\x8e\x4d\xe0\xd8\x0c\x8e\x2d\xe0\xfd\xeb\xf0\xfe\xad\x78\xff\x4e\xbc\x7f\x0c\xef\x9f\xc2\xfb\x8f\xe0\xfd\xf3\x78\xff\x12\xde\xbf\x86\xf7\x5f\xc5\x07\x34\xe3\x03\x82\xf8\x80\x1e\x7c\x40\x3f\x3e\x60\x18\x1f\x30\x8e\x0f\x98\xc6\x07\xcc\xe1\x03\x56\xf0\x81\x4d\xf8\xc0\x0e\x7c\x60\x37\x3e\xb0\x0f\x1f\x38\x84\x0f\x1c\xc3\x07\x4e\xe1\x03\x67\xf1\x81\xcb\x38\xde\x88\xe3\xed\x38\xde\x85\xe3\x09\x1c\x1f\xc4\xf1\x1c\x8e\x4f\xe2\x78\x05\xc7\x17\xf1\x41\xf5\xf8\xa0\x36\x7c\x50\x18\x1f\x14\xc7\x07\x0d\xe0\x83\xb2\xf8\xa0\x09\x7c\xd0\x0c\x3e\x68\x01\x1f\x5c\x87\x0f\x6e\xc5\x07\x77\xe2\x83\x63\xf8\xe0\x14\x3e\x78\x04\x1f\x5c\xc0\x07\x97\xf1\xc1\xf3\xf8\x10\xf0\x21\x2d\xf8\x90\x10\x3e\x24\x8a\x0f\x49\xe2\x43\x32\xf8\x90\x3c\x3e\x64\x1a\x1f\x32\x87\x0f\x59\xc1\xbd\x4d\xb8\xb7\x03\xf7\x76\xe3\xde\x3e\xdc\x3b\x84\x7b\xc7\x70\xef\x14\xee\x9d\xc5\xbd\xcb\xf8\xd0\x46\x7c\x68\x3b\x3e\xb4\x0b\x1f\x9a\xc0\x87\x0e\xe2\x43\x73\xf8\xd0\x22\x3e\xb4\x8a\x0f\x5d\xc2\x87\x35\xe0\xc3\x02\xf8\xb0\x08\x3e\xac\x17\x1f\x96\xc6\x87\x8d\xe2\xc3\x26\xf1\x61\x33\xf8\xb0\x05\x7c\x78\x1d\x3e\xbc\x15\x1f\xde\x89\x0f\x8f\xe1\xc3\x53\xf8\xf0\x11\x7c\x78\x01\x1f\x5e\xc6\x87\xcf\xe3\x04\x38\xd1\x82\x13\x21\x9c\x88\xe2\x44\x12\x27\x32\x38\x91\xc7\x89\x12\x4e\xd4\x70\x62\x15\x1f\xd1\x8c\x8f\x08\xe2\x23\x7a\xf0\x11\xfd\xf8\x88\x61\x7c\xc4\x38\x3e\x62\x1a\x1f\x31\x8b\x8f\x58\xc6\x47\x36\xe2\x23\xdb\xf1\x91\x5d\xf8\xc8\x04\x3e\x72\x10\x1f\x99\xc3\x47\x16\xf1\x91\x55\x7c\xe4\x12\x3e\xaa\x01\x1f\x15\xc0\x47\x45\xf0\x51\xbd\xf8\xa8\x34\x3e\x6a\x14\x1f\x35\x89\x8f\xaa\xe0\xa3\x16\x71\x5f\x3d\xee\x6b\xc3\x7d\x61\xdc\x17\xc7\x7d\x03\xb8\x2f\x8b\xfb\x26\x70\xdf\x0c\xee\x9b\xc7\x47\x83\x8f\x6e\xc1\x47\x87\xf0\xd1\x51\x7c\x74\x12\x1f\x9d\xc1\x47\xe7\xf1\xd1\x25\x7c\x74\x0d\x1f\xbd\x8a\x8f\x69\xc6\xc7\x04\xf1\x31\x3d\xf8\x98\x7e\x7c\xcc\x30\x3e\x66\x1c\x1f\x33\x8d\x8f\x99\xc3\xc7\xac\xe0\x63\x9b\xf0\xb1\x1d\xf8\xd8\x6e\x7c\x6c\x1f\x3e\x76\x08\x1f\x3b\x86\x8f\x9d\xc2\xc7\xce\xe2\x63\x97\x70\x7f\x03\xee\x0f\xe0\xfe\x08\xee\xef\xc5\xfd\x69\xdc\x3f\x8a\xfb\x27\x71\x7f\x05\xf7\x2f\xe2\xe3\xea\xf1\x71\x6d\xf8\xb8\x30\x3e\x2e\x8e\x8f\x1b\xc0\xc7\x65\xf1\x71\x13\xf8\xb8\x19\x7c\xdc\x02\x3e\xbe\x0e\x1f\xdf\x8a\x8f\xef\xc4\xc7\xc7\xf0\xf1\x29\x7c\xfc\x08\x3e\xbe\x80\x8f\x2f\xe3\xe3\xe7\xf1\xf1\xab\xf8\x84\x66\x7c\x42\x10\x9f\xd0\x83\x4f\xe8\xc7\x27\x0c\xe3\x13\xc6\xf1\x09\xd3\xf8\x84\x39\x7c\xc2\x0a\x4e\x36\xe1\x64\x07\x4e\x76\xe3\x64\x1f\x4e\x0e\xe1\xe4\x18\x4e\x4e\xe1\xe4\x2c\x4e\x2e\xe3\x13\x1b\xf1\x89\xed\xf8\xc4\x2e\x7c\x62\x02\x9f\x38\x88\x4f\xcc\xe1\x13\x8b\xf8\xc4\x2a\x3e\x71\x09\x9f\x54\x8f\x4f\x6a\xc3\x27\x85\xf1\x49\x71\x7c\xd2\x00\x3e\x29\x8b\x4f\x9a\xc0\x27\xcd\xe0\x93\x16\xf0\xc9\x75\xf8\xe4\x56\x7c\x72\x27\x3e\x39\x86\x4f\x4e\xe1\x93\x47\xf0\xc9\x05\x7c\x72\x19\x9f\x3c\x8f\x53\xe0\x54\x0b\x4e\x85\x70\x2a\x8a\x53\x49\x9c\xca\xe0\x54\x1e\xa7\x4a\x38\x55\xc3\xa9\x55\x7c\x4a\x13\x3e\xa5\x03\x9f\xd2\x8d\x4f\xe9\xc3\xa7\x0c\xe1\x53\xc6\xf0\x29\x53\xf8\x94\x59\x7c\xca\x32\x3e\xb5\x11\x9f\xda\x8e\x4f\xed\xc2\xa7\x26\xf0\xa9\x83\xf8\xd4\x1c\x3e\xb5\x88\x4f\xad\xe2\x53\x97\xf0\x69\x0d\xf8\xb4\x00\x3e\x2d\x82\x4f\xeb\xc5\xa7\xa5\xf1\x69\xa3\xf8\xb4\x49\x7c\x5a\x05\x9f\xb6\x88\x07\xea\xf1\x40\x2b\x1e\xe8\xc4\x03\x31\x3c\x90\xc2\x03\x23\x78\xa0\x80\x07\xca\x78\x60\x1e\x9f\x0e\x3e\xbd\x05\x9f\x1e\xc2\xa7\x47\xf1\xe9\x49\x7c\x7a\x06\x9f\x9e\xc7\xa7\x97\xf0\xe9\x35\x7c\xfa\x2a\x3e\xa3\x19\x9f\x11\xc4\x67\xf4\xe0\x33\xfa\xf1\x19\xc3\xf8\x8c\x71\x7c\xc6\x34\x3e\x63\x0e\x9f\xb1\x82\xcf\x6c\xc2\x67\xb6\xe3\x33\xbb\xf0\x99\x09\x7c\xe6\x20\x3e\x33\x87\xcf\x2c\xe2\x33\xab\xf8\xcc\x25\x9c\x6e\xc0\xe9\x00\x4e\x47\x70\xba\x17\xa7\xd3\x38\x3d\x8a\xd3\x93\x38\x5d\xc1\xe9\x45\x7c\x56\x3d\x3e\xab\x0d\x9f\x15\xc6\x67\xc5\xf1\x59\x03\xf8\xac\x2c\x3e\x6b\x02\x9f\x35\x83\xcf\x5a\xc0\x67\xd7\xe1\xb3\x5b\xf1\xd9\x21\x7c\x76\x14\x9f\x9d\xc4\x67\x67\xf0\xd9\x79\x7c\x76\x09\x9f\x5d\xc3\x67\xaf\xe2\x73\x9a\xf1\x39\x41\x7c\x4e\x0f\x3e\xa7\x1f\x9f\x33\x8c\xcf\x19\xc7\xe7\x4c\xe3\x73\xe6\xf0\x39\x2b\x78\xb0\x09\x0f\x76\xe0\xc1\x6e\x3c\xd8\x87\x07\x87\xf0\xe0\x18\x1e\x9c\xc2\x83\xb3\x78\x70\x19\x9f\xdb\x88\xcf\x6d\xc7\xe7\x46\xf0\xb9\xbd\xf8\xdc\x34\x3e\x77\x14\x9f\x3b\x89\xcf\xad\xe0\x73\x17\xf1\x79\xf5\xf8\xbc\x36\x7c\x5e\x18\x9f\x17\xc7\xe7\x0d\xe0\xf3\xb2\xf8\xbc\x09\x7c\xde\x0c\x3e\x6f\x01\x9f\x5f\x87\xcf\x6f\xc5\xe7\x77\xe2\xf3\x63\xf8\xfc\x14\x3e\x7f\x04\x9f\x5f\xc0\xe7\x97\xf1\xf9\xf3\x78\x08\x3c\xd4\x82\x87\x42\x78\xa8\x07\x0f\xf5\xe3\xa1\x61\x3c\x34\x8e\x87\xa6\xf1\xd0\x1c\x1e\x5a\xc1\x17\x34\xe1\x0b\x3a\xf0\x05\xdd\xf8\x82\x3e\x7c\xc1\x10\xbe\x60\x0c\x5f\x30\x85\x2f\x98\xc5\x17\x2c\xe3\x0b\x1b\xf1\x85\xed\xf8\xc2\x2e\x7c\x61\x02\x5f\x38\x88\x2f\xcc\xe1\x0b\x8b\xf8\xc2\x2a\xbe\x70\x09\x5f\xd4\x80\x2f\x0a\xe0\x8b\x22\xf8\xa2\x38\xbe\x68\x00\x5f\x94\xc5\x17\x4d\xe0\x8b\x66\xf0\x45\x0b\x78\xb8\x0e\x0f\xb7\xe2\xe1\x4e\x3c\x1c\xc3\xc3\x29\x3c\x3c\x82\x87\x0b\x78\xb8\x8c\x87\xe7\xf1\xc5\xe0\x8b\x5b\xf0\xc5\x21\x7c\x71\x14\x5f\x9c\xc4\x17\x67\xf0\xc5\x79\x7c\x71\x09\x5f\x5c\xc3\x17\xaf\xe2\x4b\x9a\xf1\x25\x41\x7c\x49\x0f\xbe\xa4\x0f\x5f\x32\x84\x2f\x19\xc3\x97\x4c\xe1\x4b\x66\xf1\x25\xcb\xf8\xd2\x46\x7c\x69\x3b\xbe\xb4\x0b\x5f\x9a\xc0\x97\x0e\xe2\x4b\x73\xf8\xd2\x22\xbe\xb4\x8a\x2f\x5d\xc2\x99\x06\x9c\x09\xe0\x4c\x04\x67\x7a\x71\x26\x8d\x33\xa3\x38\x33\x89\x33\x15\x9c\x59\xc4\x97\xd5\xe3\xcb\xda\xf0\x65\x61\x7c\x59\x1c\x5f\x96\xc2\x97\x8d\xe0\xcb\x0a\xf8\xb2\x32\xbe\x6c\x1e\x5f\x0e\xbe\xbc\x05\x5f\x1e\xc2\x97\x47\xf1\xe5\x49\x7c\x79\x06\x5f\x9e\xc7\x97\x97\xf0\xe5\x35\x7c\xf9\x2a\xbe\xa2\x19\x5f\x11\xc4\x57\xf4\xe0\x2b\xfa\xf1\x15\xc3\xf8\x8a\x71\x7c\xc5\x34\xbe\x62\x0e\x5f\xb1\x82\x47\x9a\xf0\x48\x07\x1e\xe9\xc6\x23\x7d\x78\x64\x10\x8f\xe4\xf0\x48\x11\x8f\x54\xf1\xc8\x12\xbe\xb2\x01\x5f\x19\xc0\x57\x46\xf0\x95\xbd\xf8\xca\x34\xbe\x72\x14\x5f\x39\x89\xaf\xac\xe0\x2b\x17\xf1\x55\xf5\xf8\xaa\x36\x7c\x55\x18\x5f\x15\xc7\x57\x0d\xe0\xab\xb2\xf8\xaa\x09\x7c\xd5\x0c\xbe\x6a\x01\x5f\x5d\x87\xaf\x6e\xc5\x57\x77\xe2\xab\x63\xf8\xea\x14\xbe\x3a\x83\xaf\xce\xe3\xab\x4b\xf8\xea\x1a\xbe\x7a\x15\x67\x9b\x71\x36\x88\xb3\x3d\x38\xdb\x8f\xb3\xc3\x38\x3b\x8e\xb3\xd3\x38\x3b\x87\xb3\x2b\xf8\x9a\x26\x7c\x4d\x07\xbe\xa6\x1b\x5f\xd3\x87\xaf\x19\xc2\xd7\x8c\xe1\x6b\xa6\xf0\x35\xb3\xf8\x9a\x65\x7c\x6d\x23\xbe\xb6\x1d\x5f\xdb\x85\xaf\x4d\xe0\x6b\x07\xf1\xb5\xa3\xf8\xda\x49\x7c\x6d\x05\x5f\xbb\x88\xaf\xab\xc7\xd7\xb5\xe1\xeb\xc2\xf8\xba\x38\xbe\x6e\x00\x5f\x97\xc5\xd7\x4d\xe0\xeb\x66\xf0\x75\x0b\x78\xb4\x0e\x8f\xb6\xe2\xd1\x4e\x3c\x1a\xc3\xa3\x29\x3c\x3a\x82\x47\x0b\x78\xb4\x8c\x47\xe7\xf1\xf5\xe0\xeb\x5b\xf0\xf5\x21\x7c\x7d\x14\x5f\x9f\xc4\xd7\x67\xf0\xf5\xe3\xf8\xfa\x69\x7c\xfd\x1c\xbe\x7e\x05\xdf\xd0\x84\x6f\xe8\xc0\x37\x74\xe3\x1b\xfa\xf0\x0d\x43\xf8\x86\x31\x7c\xc3\x14\xbe\x61\x16\xdf\xb0\x8c\x6f\x6c\xc4\x37\xb6\xe3\x1b\xbb\xf0\x8d\x09\x7c\xe3\x20\xbe\x31\x87\x6f\x2c\xe2\x1b\xab\xf8\xc6\x25\x9c\x6b\xc0\xb9\x00\xce\x45\x70\xae\x17\xe7\xd2\x38\x37\x8a\x73\x13\x38\x37\x83\x73\x0b\xf8\xa6\x3a\x7c\x53\x2b\xbe\xa9\x13\xdf\x14\xc3\x37\xa5\xf0\x4d\x23\xf8\xa6\x02\xbe\xa9\x8c\x6f\x9a\xc7\x37\x83\x6f\x6e\xc1\x37\x87\xf0\xcd\x51\x7c\x73\x12\xdf\x9c\xc1\x37\xe7\xf1\xcd\x25\x7c\x73\x0d\xdf\xbc\x8a\x6f\x69\xc6\xb7\x04\xf1\x2d\x3d\xf8\x96\x7e\x7c\xcb\x30\xbe\x65\x1c\xdf\x32\x85\x6f\x99\xc5\xb7\x2c\xe3\xb1\x46\x3c\xd6\x8e\xc7\xba\xf0\x58\x02\x8f\x0d\xe2\xb1\x1c\x1e\x2b\xe2\xb1\x2a\x1e\x5b\xc2\xb7\x36\xe0\x5b\x03\xf8\xd6\x08\xbe\xb5\x17\xdf\x9a\xc6\xb7\x8e\xe2\x5b\x27\xf1\xad\x15\x7c\xeb\x22\xbe\xad\x1e\xdf\xd6\x86\x6f\x0b\xe3\xdb\xe2\xf8\xb6\x01\x7c\x5b\x16\xdf\x36\x81\x6f\x2b\xe3\xdb\xe6\xf1\xed\xe0\xdb\x5b\xf0\xed\x21\x7c\x7b\x14\xdf\x9e\xc4\xb7\x67\xf0\xed\x79\x7c\x7b\x09\xdf\x5e\xc3\xb7\xaf\xe2\xf1\x66\x3c\x1e\xc4\xe3\x3d\x78\xbc\x1f\x8f\x0f\xe3\xf1\x71\x3c\x3e\x8d\xc7\xe7\xf0\xf8\x0a\xbe\xa3\x09\xdf\xd1\x81\xef\xe8\xc6\x77\xf4\xe1\x3b\x86\xf0\x1d\x63\xf8\x8e\x29\x7c\x47\x15\xdf\xb1\x84\xef\x6c\xc0\x77\x06\xf0\x9d\x11\x7c\x67\x2f\xbe\x33\x8d\xef\x1c\xc5\x77\x4e\xe2\x3b\x2b\xf8\xce\x45\x7c\x57\x3d\xbe\xab\x0d\xdf\x15\xc6\x77\xc5\xf1\x5d\x03\xf8\xae\x2c\xbe\x6b\x02\xdf\x35\x83\xef\x5a\xc0\xf9\x3a\x9c\x6f\xc5\xf9\x4e\x9c\x8f\xe1\x7c\x0a\xe7\x47\x70\xbe\x80\xf3\x65\x9c\xaf\xe1\xfc\x2a\xbe\xbb\x19\xdf\x1d\xc4\x77\xf7\xe0\xbb\xfb\xf1\xdd\xc3\xf8\xee\x71\x7c\xf7\x34\xbe\x7b\x0e\xdf\xbd\x82\xef\x69\xc2\xf7\x74\xe0\x7b\xba\xf1\x3d\x7d\xf8\x9e\x21\x7c\xcf\x18\xbe\x67\x0a\xdf\x33\x8b\xef\x59\xc6\xf7\x36\xe2\x7b\xdb\xf1\xbd\x5d\xf8\xde\x04\xbe\x77\x10\xdf\x9b\xc3\xf7\x16\xf1\xbd\x55\x7c\xef\x22\x2e\xd4\xe3\x42\x1b\x2e\x84\x71\x21\x8e\x0b\x03\xb8\x90\xc5\x85\x09\x5c\x98\xc1\x85\x05\x7c\x5f\x1d\xbe\xaf\x15\xdf\xd7\x89\xef\x8b\xe1\xfb\x52\xf8\xbe\x11\x7c\x5f\x01\xdf\x57\xc6\xf7\xcd\xe3\xfb\xc1\xf7\xb7\xe0\xfb\x43\xf8\xfe\x28\xbe\x3f\x89\xef\xcf\xe0\xfb\xf3\xf8\xfe\x12\xbe\xbf\x86\xef\x5f\xc1\x0f\x34\xe1\x07\x3a\xf0\x03\xdd\xf8\x81\x3e\xfc\xc0\x10\x7e\x60\x0c\x3f\x30\x85\x1f\x98\xc5\x0f\x2c\xe3\x89\x46\x3c\xd1\x8e\x27\xba\xf0\x44\x02\x4f\x0c\xe2\x89\x1c\x9e\x28\xe2\x89\x2a\x9e\x58\xc2\x0f\x36\xe0\x07\x03\xf8\xc1\x08\x7e\xb0\x17\x3f\x98\xc6\x0f\x8e\xe2\x07\x27\xf1\x83\x15\xfc\xe0\x22\x7e\xa8\x0e\x3f\xd4\x8a\x1f\xea\xc4\x0f\xc5\xf0\x43\x29\xfc\xd0\x08\x7e\xa8\x80\x1f\x2a\xe3\x87\xe6\xf1\xc3\xe0\x87\x5b\xf0\xc3\x21\xfc\x70\x14\x3f\x9c\xc4\x0f\x67\xf0\xc3\x79\xfc\x70\x09\x3f\x5c\xc3\x0f\xaf\xe2\xc9\x66\x3c\x19\xc4\x93\x3d\x78\xb2\x1f\x4f\x0e\xe3\xc9\x71\x3c\x39\x8d\x27\xe7\xf0\xe4\x0a\x7e\xa4\x11\x3f\xd2\x8e\x1f\xe9\xc2\x8f\x24\xf0\x23\x83\xf8\x91\x1c\x7e\xa4\x88\x1f\xa9\xe2\x47\x96\xf0\xa3\x0d\xf8\xd1\x00\x7e\x34\x82\x1f\xed\xc5\x8f\xa6\xf1\xa3\xa3\xf8\xd1\x49\xfc\x68\x05\x3f\xba\x88\x1f\xab\xc7\x8f\xb5\xe1\xc7\xc2\xf8\xb1\x38\x7e\x6c\x00\x3f\x96\xc5\x8f\x4d\xe0\xc7\x66\xf0\x63\x0b\xb8\x58\x87\x8b\x2d\xb8\x18\xc2\xc5\x28\x2e\x26\x71\x31\x83\x8b\x79\x5c\x2c\xe1\x62\x0d\x17\x57\xf1\xe3\xcd\xf8\xf1\x20\x7e\xbc\x07\x3f\xde\x8f\x1f\x1f\xc6\x8f\x8f\xe3\xc7\xa7\xf1\xe3\x73\xf8\xf1\x15\xfc\x44\x13\x7e\xa2\x03\x3f\xd1\x8d\x9f\xe8\xc3\x4f\x0c\xe1\x27\xc6\xf0\x13\x53\xf8\x89\x59\xfc\xc4\x32\x7e\xb2\x11\x3f\x19\xc0\x4f\x46\xf0\x93\xbd\xf8\xc9\x34\x7e\x72\x14\x3f\x39\x89\x9f\xac\xe0\x27\x17\xf1\x54\x3d\x9e\x6a\xc3\x53\x61\x3c\x15\xc7\x53\x03\x78\x2a\x8b\xa7\x26\xf0\xd4\x0c\x9e\x5a\xc0\x4f\xd5\xe1\xa7\x5a\xf1\x53\x9d\xf8\xa9\x18\x7e\x2a\x85\x9f\x1a\xc1\x4f\x15\xf0\x53\x65\xfc\xd4\x3c\x7e\x1a\xfc\x74\x0b\x7e\x3a\x88\x9f\xee\xc1\x4f\xf7\xe3\xa7\x87\xf1\xd3\xe3\xf8\xe9\x69\xfc\xf4\x1c\x7e\x7a\x05\x3f\xd3\x84\x9f\xe9\xc0\xcf\x74\xe3\x67\xfa\xf0\x33\x43\xf8\x99\x31\xfc\xcc\x14\x7e\x66\x16\x3f\xb3\x8c\xa7\x1b\xf1\x74\x3b\x9e\xee\xc2\xd3\x09\x3c\x3d\x88\xa7\x73\x78\xba\x88\xa7\xab\x78\x7a\x09\x3f\xdb\x80\x9f\x0d\xe0\x67\xc3\xf8\xd9\x38\x7e\x76\x00\x3f\x9b\xc5\xcf\x4e\xe0\x67\x67\xf0\xb3\x0b\xf8\xb9\x3a\xfc\x5c\x2b\x7e\xae\x13\x3f\x17\xc3\xcf\xa5\xf0\x73\x23\xf8\xb9\x02\x7e\xae\x8c\x9f\x9b\xc7\xcf\x83\x9f\x6f\xc1\xcf\x87\xf0\xf3\x51\xfc\x7c\x12\x3f\x9f\xc1\xcf\xe7\xf1\xf3\x25\xfc\x7c\x0d\x3f\xbf\x8a\x4b\xcd\xb8\x14\xc4\xa5\x6e\x5c\xea\xc3\xa5\x21\x5c\x1a\xc3\xa5\x29\x5c\x9a\xc5\xa5\x65\xfc\x42\x23\x7e\xa1\x1d\xbf\xd0\x85\x5f\x48\xe0\x17\x06\xf1\x0b\x39\xfc\x42\x11\xbf\x50\xc5\x2f\x2c\xe1\x17\x1b\xf0\x8b\x01\xfc\x62\x04\xbf\xd8\x8b\x5f\x4c\xe3\x17\x47\xf1\x8b\x93\xf8\xc5\x0a\x7e\x71\x11\xbf\x54\x8f\x5f\x6a\xc3\x2f\x85\xf1\x4b\x31\xfc\x52\x0a\xbf\x34\x82\x5f\x2a\xe0\x97\xca\xf8\xa5\x79\x5c\x06\x97\x5b\x70\x39\x84\xcb\x51\x5c\x4e\xe2\x72\x06\x97\xf3\xb8\x5c\xc2\xe5\x1a\x2e\xaf\xe2\x97\x9b\xf1\xcb\x41\xfc\x72\x0f\x7e\xb9\x1f\xbf\x3c\x8c\x5f\x1e\xc7\x2f\x4f\xe3\x97\xe7\xf0\xcb\x2b\xf8\x95\x26\xfc\x4a\x07\x7e\xa5\x1b\xbf\x92\xc0\xaf\x0c\xe2\x57\x72\xf8\x95\x22\x7e\xa5\x8a\x5f\x59\xc2\xaf\x36\xe0\x57\x03\xf8\xd5\x08\x7e\xb5\x17\xbf\x9a\xc6\xaf\x8e\xe2\x57\x27\xf1\xab\x15\xfc\xea\x22\x9e\xa9\xc7\x33\x6d\x78\x26\x8c\x67\xe2\x78\x66\x00\xcf\x64\xf1\xcc\x04\x9e\x99\xc1\x33\x0b\xf8\xb5\x3a\xfc\x5a\x2b\x7e\xad\x13\xbf\x16\xc3\xaf\x25\xf1\x6b\x19\xfc\x5a\x1e\xbf\x56\xc2\xaf\xd5\xf0\x6b\xab\xf8\xf5\x66\xfc\x7a\x10\xbf\xde\x83\x5f\xef\xc7\xaf\x0f\xe3\xd7\xc7\xf1\xeb\xd3\xf8\xf5\x39\xfc\xfa\x0a\x7e\xa3\x09\xbf\xd1\x81\xdf\xe8\xc6\x6f\xf4\xe1\x37\x86\xf0\x1b\x63\xf8\x8d\x29\xfc\xc6\x2c\x7e\x63\x19\x57\x1a\x71\xa5\x1d\x57\xba\x70\x25\x81\x2b\x69\x5c\x19\xc5\x95\x49\x5c\xa9\xe0\xca\x22\x7e\xb3\x1e\xbf\xd9\x86\xdf\x0c\xe3\x37\xe3\xf8\xcd\x01\xfc\x66\x16\xbf\x39\x81\xdf\x9c\xc1\x6f\x2e\xe0\xb7\xea\xf0\x5b\xad\xf8\xad\x4e\xfc\x56\x0c\xbf\x95\xc2\x6f\x8d\xe0\xb7\x0a\xf8\xad\x32\x7e\x6b\x1e\xbf\x0d\x7e\xbb\x05\xbf\x1d\xc2\x6f\x47\xf1\xdb\x49\xfc\xf6\x30\x7e\x7b\x1c\xbf\x3d\x8d\xdf\x9e\xc3\x6f\xaf\xe0\x6a\x13\xae\x76\xe0\x6a\x37\xae\xf6\xe1\xea\x10\xae\x8e\xe1\xea\x14\xae\xce\xe2\xea\x32\x7e\xa7\x11\xbf\xd3\x8e\xdf\xe9\xc2\xef\x24\xf0\x3b\x83\xf8\x9d\x1c\x7e\xa7\x88\xdf\xa9\xe2\x77\x96\xf0\xbb\x0d\xf8\xdd\x00\x7e\x37\x82\xdf\xed\xc5\xef\xa6\xf1\xbb\x59\xfc\xee\x04\x7e\x77\x06\xbf\xbb\x80\xdf\xab\xc3\xef\xb5\xe2\xf7\x3a\xf1\x7b\x31\xfc\x5e\x0a\xbf\x37\x82\xdf\x2b\xe0\xf7\xca\xf8\xbd\x79\x3c\x0b\x9e\x6d\xc1\xb3\x21\x3c\x1b\xc5\xb3\x49\x3c\x9b\xc1\xb3\x79\x3c\x5b\xc2\xb3\x35\x3c\xbb\x8a\xdf\x6f\xc6\xef\x07\xf1\xfb\x3d\xf8\xfd\x7e\xfc\xfe\x30\x7e\x7f\x0c\xbf\x3f\x85\xdf\x9f\xc5\xef\x2f\xe3\x0f\x1a\xf1\x07\xed\xf8\x83\x2e\xfc\x41\x02\x7f\x30\x88\x3f\xc8\xe1\x0f\x8a\xf8\x83\x2a\xfe\x60\x09\x7f\xd8\x80\x3f\x0c\xe0\x0f\x23\xf8\xc3\x5e\xfc\x61\x1a\x7f\x38\x8a\x3f\x9c\xc4\x1f\x56\xf0\x87\x8b\x78\xae\x1e\xcf\xb5\xe1\xb9\x30\x9e\x8b\xe3\xb9\x01\x3c\x97\xc5\x73\x05\x3c\x57\xc6\x73\xf3\xf8\x23\xf0\x47\x2d\xf8\xa3\x10\xfe\x28\x8a\x3f\x4a\xe2\x8f\x32\xf8\xa3\x3c\xfe\xa8\x84\x3f\xaa\xe1\x8f\x56\xf1\xc7\xcd\xf8\xe3\x20\xfe\xb8\x07\x7f\xdc\x8f\x3f\x1e\xc6\x1f\x8f\xe3\x8f\xa7\xf1\xc7\x73\xf8\xe3\x15\xfc\x49\x13\xfe\xa4\x03\x7f\xd2\x8d\x3f\xe9\xc3\x9f\x0c\xe1\x4f\xc6\xf0\x27\x45\xfc\x49\x15\x7f\xb2\x84\x6b\x0d\xb8\x16\xc0\xb5\x08\xae\xf5\xe2\x5a\x1a\xd7\x46\x71\x6d\x12\xd7\x2a\xb8\xb6\x88\x3f\xad\xc7\x9f\xb6\xe1\x4f\xc3\xf8\xd3\x38\xfe\x74\x00\x7f\x9a\xc5\x9f\x4e\xe0\x4f\x67\xf0\xa7\x0b\xf8\xb3\x3a\xfc\x59\x2b\xfe\xac\x13\x7f\x16\xc3\x9f\xa5\xf0\x67\x23\xf8\xb3\x02\xfe\xac\x84\x3f\xab\xe1\xcf\x56\xf1\xe7\xcd\xf8\xf3\x20\xfe\xfc\xff\x59\x8e\xe3\xa8\xc8\xc7\xc7\x7f\xff\x17\x1b\x06\xa1\xf5\x7a\xde\xf7\xfd\x42\x68\x09\x21\x76\x78\x8f\x35\x08\x83\x30\x08\x83\x41\x08\x21\x84\x41\x08\x83\x10\x42\x08\x21\x84\x10\xc2\x20\x84\x41\x08\x21\x84\x10\x42\x08\x61\x76\x77\x76\xb7\xdd\x6d\x77\x67\x77\x43\xf8\x9d\xcf\xf9\x7d\xff\x78\x9c\xeb\x5c\x31\xbc\x3f\x12\x78\x7f\x34\xe3\xfd\xd1\x85\xf7\x47\x3f\xde\x1f\x63\x78\x7f\x4c\xe1\x65\x84\x97\x09\xe2\x65\x2a\xf0\x32\xb5\x78\x99\x26\xbc\x4c\x27\x5e\xa6\x0f\x2f\x33\x8a\x97\xc9\xe1\xcd\x2d\xc0\x9b\x5b\x8a\x37\x37\x8a\x37\xb7\x06\x6f\x6e\x23\xde\xdc\x0e\xbc\xb9\xbd\x78\x73\x87\xf1\xe6\x4e\xe0\xcd\x0b\xe0\xcd\x2b\xc6\x9b\x17\xc1\x9b\x57\x85\x37\x2f\x89\x37\xaf\x0d\x6f\x5e\x0f\xde\xbc\x21\xbc\x79\x59\xbc\xf9\x79\x78\xf3\x8b\xf0\xe6\x97\xe1\xcd\xaf\xc4\x9b\x5f\x8f\x37\xbf\x15\x6f\x7e\x37\xde\xfc\x41\xbc\xf9\x19\xbc\x2c\x78\xd9\x42\xbc\x6c\x18\x2f\x1b\xc7\xcb\xd6\xe1\x65\x5b\xf0\xb2\x29\xbc\xec\x00\x5e\x76\x0c\x2f\x3b\x85\xb7\x40\x78\x0b\x82\x78\x0b\x2a\xf0\x16\xd4\xe2\x2d\x68\xc2\x5b\xd0\x89\xb7\xa0\x0f\x6f\xc1\x28\xde\x82\x1c\xde\xc2\x02\xbc\x85\xa5\x78\x0b\xa3\x78\x0b\x6b\xf0\x16\x36\xe2\x2d\xec\xc0\x5b\xd8\x8b\xb7\x70\x04\x6f\xe1\x24\xde\xa2\x7c\xbc\x45\x25\x78\x8b\xca\xf1\x16\x55\xe3\x2d\x6a\xc0\x5b\xd4\x8e\xb7\x28\x8d\xb7\x68\x18\x6f\x51\x16\x6f\x22\x0f\x6f\xa2\x08\x6f\xa2\x0c\x6f\xa2\x12\x6f\xa2\x1e\x6f\xa2\x15\x6f\xa2\x1b\x6f\x62\x10\x6f\x22\x83\xb7\x18\xbc\xc5\x85\x78\x8b\xc3\x78\x8b\xe3\x78\x8b\xeb\xf0\x16\xb7\xe0\x2d\x4e\xe1\x2d\x1e\xc0\x5b\x3c\x8e\xb7\x78\x1a\x6f\x89\x8f\xb7\x24\x84\xb7\x24\x86\xb7\x24\x81\xb7\xa4\x19\x6f\x49\x17\xde\x92\x7e\xbc\x25\x63\x78\x4b\x72\x78\x4b\x0b\xf0\x96\x96\xe2\x2d\x8d\xe2\x2d\xad\xc1\x5b\xda\x88\xb7\xb4\x03\x6f\x69\x2f\xde\xd2\x11\xbc\xa5\x93\x78\x93\xf9\x78\x93\x25\x78\x93\xe5\x78\x93\xd5\x78\x93\x0d\x78\x93\xed\x78\x93\x69\xbc\xc9\x61\xbc\xc9\x09\xbc\x65\x01\xbc\x65\xc5\x78\xcb\x22\x78\xcb\xaa\xf0\x96\x25\xf1\x96\xb5\xe1\x2d\xeb\xc1\x5b\x36\x84\xb7\x2c\x8b\xb7\x1c\xbc\xe5\x85\x78\xcb\xc3\x78\xcb\xe3\x78\xcb\xeb\xf0\x96\xb7\xe0\x2d\x4f\xe1\x2d\x1f\xc0\x5b\x3e\x8e\xb7\x7c\x1a\x6f\x85\x8f\xb7\x22\x84\xb7\x22\x86\xb7\x22\x81\xb7\xa2\x19\x6f\x45\x17\xde\x8a\x7e\xbc\x15\x63\x78\x2b\xa6\xf0\x72\xc2\xcb\x05\xf1\x72\x15\x78\xb9\x5a\xbc\x5c\x13\x5e\xae\x13\x2f\xd7\x87\x97\x1b\xc5\xcb\xe5\xf0\x56\xe6\xe3\xad\x2c\xc1\x5b\x59\x8e\xb7\xb2\x1a\x6f\x65\x03\xde\xca\x76\xbc\x95\x69\xbc\x95\xc3\x78\x2b\x27\xf0\x56\x05\xf0\x56\x15\xe3\xad\x8a\xe0\xad\xaa\xc2\x5b\x95\xc4\x5b\xd5\x86\xb7\xaa\x07\x6f\xd5\x10\xde\xaa\x2c\xde\xea\x3c\xbc\xd5\x45\x78\xab\xcb\xf0\x56\x57\xe2\xad\xae\xc7\x5b\xdd\x8a\xb7\xba\x1b\x6f\xf5\x20\xde\xea\x0c\xde\x14\x78\x53\x3e\xde\x54\x08\x6f\x2a\x86\x37\x95\xc0\x9b\x6a\xc6\x9b\xea\xc2\x9b\xea\xc7\x9b\x1a\xc3\x9b\x9a\xc2\xfb\x53\x78\x7f\x06\xf1\xfe\xac\xc0\xfb\xb3\x16\xef\xcf\x26\xbc\x3f\x3b\xf1\xfe\xec\xc3\xfb\x73\x14\xef\xcf\x1c\xde\x5f\x05\x78\x7f\x95\xe2\xfd\x15\xc5\xfb\xab\x06\xef\xaf\x46\xbc\xbf\x3a\xf0\xfe\xea\xc5\xfb\x6b\x04\xef\xaf\x49\xbc\xbf\xf3\xf1\xfe\x2e\xc6\xfb\x3b\x82\xf7\x77\x15\xde\xdf\x49\xbc\xbf\xdb\xf0\xfe\xee\xc1\xfb\x7b\x08\xef\xef\x2c\xde\x74\x1e\xde\x74\x11\xde\x74\x19\xde\x74\x25\xde\x74\x3d\xde\x74\x2b\xde\x74\x37\xde\xf4\x20\xde\x74\x06\xef\x1f\xf0\xfe\x29\xc4\xfb\x27\x8c\xf7\x4f\x1c\xef\x9f\x3a\xbc\x7f\x5a\xf0\xfe\x49\xe1\xfd\x33\x80\xf7\xcf\x38\xde\x3f\xd3\x78\xff\xfa\x78\xff\x06\xf1\xfe\xad\xc0\xfb\xb7\x16\xef\xdf\x26\xbc\x7f\x3b\xf1\xfe\xed\xc3\xfb\x77\x14\xef\xdf\x1c\xde\x7f\x05\x78\xff\x95\xe2\xfd\x17\xc5\xfb\xaf\x06\xef\xbf\x46\xbc\xff\x3a\xf0\xfe\xeb\xc5\xfb\x6f\x04\xef\xbf\x49\x44\x3e\xa2\x04\x51\x8e\xa8\x46\x34\x20\xda\x11\x69\xc4\x30\x62\x02\xad\x11\x40\x6b\x14\xa3\x35\xca\xd0\x1a\x95\x68\x8d\x7a\xb4\x46\x2b\x5a\xa3\x1b\xad\x31\x88\xd6\xc8\xa0\x35\x41\x6b\x16\xa2\x35\xc3\x68\xcd\x38\x5a\xb3\x0e\xad\xd9\x82\xd6\x4c\xa1\x35\x07\xd0\x9a\xe3\x68\xcd\x69\x34\xc3\x47\x33\x42\x68\x46\x0c\xcd\x48\xa0\x19\xcd\x68\x46\x17\x9a\xd1\x8f\x66\x8c\xa1\x19\x53\x28\x4f\x28\x2f\x88\xf2\xa2\x28\xaf\x06\xe5\x35\xa2\xbc\x0e\x94\xd7\x8b\xf2\x46\x50\xde\x24\x5a\x2b\x1f\xad\x55\x82\xd6\x2a\x47\x6b\x55\xa3\xb5\x1a\xd0\x5a\xed\x68\xad\x34\x5a\x6b\x18\xad\x35\x81\xd6\x0e\xa0\xb5\x8b\xd1\xda\x11\xb4\x76\x15\x5a\x3b\x89\xd6\x6e\x43\x6b\xf7\xa0\xb5\x87\xd0\xda\x59\xb4\x4e\x1e\x5a\xa7\x08\xad\x53\x86\xd6\x89\xa3\x75\xea\xd0\x3a\x2d\x68\x9d\x14\x5a\x67\x00\xad\x33\x8e\xd6\x99\x46\x01\x1f\x05\x42\x28\x10\x43\x81\x04\x0a\x34\xa3\x40\x17\x0a\xf4\xa3\xc0\x18\x0a\x4c\xa1\x75\x85\xd6\x0d\xa2\x75\x2b\xd0\xba\xb5\x68\xdd\x26\xb4\x6e\x27\x5a\xb7\x0f\xad\x3b\x8a\xd6\xcd\xa1\xf5\x0a\xd0\x7a\xa5\x68\xbd\x28\x5a\xaf\x1a\xad\xd7\x80\xd6\x6b\x47\xeb\xa5\xd1\x7a\xc3\x68\xbd\x09\xb4\x7e\x00\xad\x5f\x8c\xd6\x8f\xa0\xf5\xab\xd0\xfa\x49\xb4\x7e\x1b\x5a\xbf\x07\xad\x3f\x84\xd6\xcf\xa2\xfc\x3c\x94\x5f\x84\xf2\xcb\x50\x7e\x25\xca\xaf\x47\xf9\xad\x28\xbf\x1b\xe5\x0f\xa2\xfc\x0c\xda\x00\xb4\x41\x21\xda\x20\x8c\x36\x88\xa3\x0d\x12\x68\x83\x66\xb4\x41\x17\xda\xa0\x1f\x6d\x30\x86\x36\x98\x42\x1b\x0a\x6d\x18\x44\x1b\x56\xa0\x0d\x6b\xd1\x86\x4d\x68\xc3\x4e\xb4\x61\x1f\xda\x70\x14\x6d\x98\x43\x1b\x15\xa0\x8d\x4a\xd1\x46\x51\xb4\x51\x0d\xda\xa8\x11\x6d\xd4\x81\x36\xea\x45\x1b\x8d\xa0\x8d\x26\x51\x41\x3e\x2a\x28\x41\x05\xe5\xa8\xa0\x1a\x15\x24\x51\x41\x1b\x2a\xe8\x41\x05\x43\xa8\x20\x8b\x66\xe6\xa1\x99\x45\x68\x66\x19\x9a\x59\x89\x66\xd6\xa3\x99\xad\x68\x66\x37\x9a\x39\x88\x66\x66\xd0\xc6\xa0\x8d\x0b\xd1\xc6\x61\xb4\x71\x1c\x6d\x5c\x87\x36\x6e\x41\x1b\xa7\xd0\xc6\x03\x68\xe3\x71\xb4\xf1\x34\xf2\x7c\xe4\x85\x90\x17\x43\x5e\x02\x79\x4d\xc8\xeb\x44\x5e\x1f\xf2\x46\x91\x97\x43\x2a\x40\x2a\x45\x8a\x22\xd5\x20\x35\x22\x75\x20\xf5\x22\x8d\x20\x4d\x22\x93\x8f\x4c\x09\x32\xe5\xc8\x54\x23\xd3\x80\x4c\x3b\x32\x69\x64\x86\x91\x99\x40\x36\x80\x6c\x31\xb2\x11\x64\xab\x90\x4d\x22\xdb\x8a\x6c\x37\xb2\x83\xc8\x66\x90\x03\xb9\x42\xe4\xc2\xc8\xc5\x91\xab\x43\xae\x05\xb9\x14\x72\x03\xc8\x8d\x23\x37\x8d\x7c\x1f\xf9\x21\xe4\xc7\x90\x9f\x40\x7e\x33\xf2\xbb\x90\xdf\x8f\xfc\x31\xe4\x4f\xa1\x4d\x84\x36\x09\xa2\x4d\x2a\xd0\x26\xb5\x68\x93\x26\xb4\x49\x07\xda\xa4\x17\x6d\x32\x82\x36\x99\x44\x9b\xe6\xa3\x4d\x4b\xd0\xa6\xe5\x68\xd3\x6a\xb4\x69\x03\xda\xb4\x1d\x6d\x9a\x46\x9b\x0e\xa3\x4d\x27\xd0\x66\x01\xb4\x59\x31\xda\x2c\x82\x36\xab\x42\x9b\x25\xd1\x66\x6d\x68\xb3\x1e\xb4\xd9\x10\xda\x2c\x8b\x0a\xf3\x50\x61\x11\x2a\x2c\x43\x85\x95\xa8\xb0\x1e\x15\xb6\xa2\xc2\x14\x2a\x1c\x40\x85\xe3\xa8\x70\x1a\x6d\xee\xa3\xcd\x43\x68\xf3\x18\xda\x3c\x81\x36\x6f\x46\x9b\x77\xa1\xcd\xfb\xd1\xe6\x63\x68\xf3\x29\xb4\x85\xd0\x16\x41\xb4\x45\x05\xda\xa2\x16\x6d\xd1\x84\xb6\xe8\x44\x5b\xf4\xa1\x2d\x46\xd1\x16\x39\xb4\x65\x01\xda\xb2\x14\x6d\x19\x45\x5b\xd6\xa0\x2d\x1b\xd1\x96\x1d\x68\xcb\x34\xda\x72\x18\x6d\x39\x81\x8a\x02\xa8\xa8\x18\x15\x45\x50\x51\x15\x2a\x4a\xa2\xa2\x36\x54\xd4\x83\x8a\x86\x50\x51\x16\xcd\xca\x43\xb3\x8a\xd0\xac\x32\x34\xab\x12\xcd\xaa\x47\xb3\x5a\xd1\xac\x6e\x34\x6b\x10\xcd\xca\xa0\xad\x40\x5b\x15\xa2\xad\xc2\x68\xab\x38\xda\xaa\x0e\x6d\xd5\x82\xb6\x4a\xa1\xad\xfa\xd1\x56\x63\x68\xab\x29\xb4\xb5\xd0\xd6\x41\xb4\x75\x05\xda\xba\x16\x6d\xdd\x84\xb6\xee\x44\x5b\xf7\xa1\xad\x47\xd1\xd6\x39\x54\x5c\x80\x8a\x4b\x51\x71\x14\x15\xd7\xa0\xe2\x46\x54\xdc\x81\x8a\x7b\x51\xf1\x08\x2a\x9e\x44\xdb\xe4\xa3\x6d\x4a\xd0\x36\xe5\x68\x9b\x6a\xb4\x4d\x03\xda\xa6\x1d\x6d\x93\x46\xdb\x0c\xa1\x6d\xb2\x68\xdb\x3c\xb4\x6d\x11\xda\xb6\x0c\x6d\x5b\x89\xb6\xad\x47\xdb\xb6\xa2\x6d\xbb\xd1\xb6\x83\x68\xdb\x0c\xda\x0e\xb4\x5d\x21\xda\x2e\x8c\xb6\x8b\xa3\xed\xea\xd0\x76\x2d\x68\xbb\x14\xda\x6e\x00\x6d\x37\x8e\xb6\x9b\x46\x25\x3e\x2a\x09\xa1\x92\x18\x2a\x49\xa0\x92\x66\x54\xd2\x85\x4a\xfa\x51\xc9\x28\x2a\xc9\xa1\xed\x0b\xd0\xf6\xa5\x68\xfb\x28\xda\xbe\x06\x6d\xdf\x88\xb6\xef\x40\xdb\xf7\xa2\xed\x47\xd0\xf6\x93\x68\x87\x7c\xb4\x43\x09\xda\xa1\x1c\xed\x50\x8d\x76\x68\x40\x3b\xb4\xa3\x1d\xd2\x68\x87\x61\xb4\xc3\x04\xda\x31\x80\x76\x2c\x46\x3b\x46\xd0\x8e\x55\x68\xc7\x24\xda\xb1\x0d\xed\xd8\x83\x76\x1c\x42\x3b\x66\x50\x29\xa8\xb4\x10\x95\x86\x51\x69\x1c\x95\xd6\xa1\xd2\x16\x54\x9a\x42\xa5\x03\xa8\x74\x1c\x95\x4e\xa3\x9d\x7c\xb4\x53\x08\xed\x14\x43\x3b\x25\xd0\x4e\xcd\x68\xa7\x2e\xb4\x53\x3f\xda\x69\x0c\xed\x34\x85\x76\x16\xda\x39\x88\x76\xae\x40\x3b\xd7\xa2\x9d\x9b\xd0\xce\x9d\x68\xe7\x3e\xb4\xf3\x28\xda\x79\x12\xcd\xce\x47\xb3\x4b\xd0\xec\x72\x34\xbb\x1a\xcd\x6e\x40\xb3\xdb\xd1\xec\x34\x9a\x3d\x8c\x66\x4f\xa0\x60\x00\x05\x8b\x51\x30\x82\x82\x55\x28\x98\x44\xc1\x36\x14\xec\x41\xc1\x21\x14\xcc\xa2\x5d\xf2\xd0\x2e\x45\x68\x97\x32\xb4\x4b\x25\xda\xa5\x1e\xed\xd2\x8a\x76\xe9\x46\xbb\x0c\xa2\x5d\x32\x68\x97\x69\xb4\xab\x8f\x76\x0d\xa1\x5d\x63\x68\xd7\x04\xda\xb5\x19\xed\xda\x85\x76\xed\x47\xbb\x8e\xa1\x5d\xa7\xd0\xff\x84\xfe\x17\x44\xff\xab\x40\xff\xab\x45\xff\x6b\x42\xff\xeb\x44\xff\xeb\x43\xff\x1b\x45\xff\xcb\xa1\x50\x01\x0a\x95\xa2\x50\x14\x85\x6a\x50\xa8\x11\x85\x3a\x50\xa8\x17\x85\x46\x50\x68\x12\xed\x16\x40\xbb\x15\xa3\xdd\x22\x68\xb7\x2a\xb4\x5b\x12\xed\xd6\x86\x76\xeb\x41\xbb\x0d\xa1\xdd\xb2\x68\x4e\x1e\x9a\x53\x84\xe6\x94\xa1\x39\x95\x68\x4e\x3d\x9a\xd3\x8a\xe6\x74\xa3\x39\x83\x68\x4e\x06\xed\x0e\xda\xbd\x10\xed\x1e\x46\xbb\xc7\xd1\xee\x75\x68\xf7\x16\xb4\x7b\x0a\xed\x3e\x80\x76\x1f\x47\xbb\x4f\xa3\xb0\x50\x38\x88\xc2\x15\x28\x5c\x8b\xc2\x4d\x28\xdc\x89\xc2\x7d\x28\x3c\x8a\xc2\x39\xb4\x47\x01\xda\xa3\x14\xed\x11\x45\x7b\xd4\xa0\x3d\x1a\xd1\x1e\x1d\x68\x8f\x5e\xb4\xc7\x08\xda\x63\x12\xed\x99\x8f\xf6\x2c\x41\x7b\x96\xa3\x3d\xab\xd1\x9e\x0d\x68\xcf\x76\xb4\x67\x1a\xed\x39\x8c\xf6\x9c\x40\x7b\x05\xd0\x5e\x45\x68\xaf\x32\xb4\x57\x25\xda\xab\x1e\xed\xd5\x8a\xf6\xea\x46\x7b\x0d\xa2\xbd\x32\xa8\x0c\x54\x56\x88\xca\xc2\xa8\x2c\x8e\xca\xea\x50\x59\x0b\x2a\x4b\xa1\xb2\x01\x54\x36\x8e\xca\xa6\xd1\xde\x3e\xda\x3b\x84\xf6\x8e\xa1\xbd\x13\x68\xef\x66\xb4\x77\x17\xda\xbb\x1f\xed\x3d\x86\xf6\x9e\x42\xfb\x08\xed\x53\x8a\xf6\x89\xa2\x7d\x6a\xd0\x3e\x8d\x68\x9f\x0e\xb4\x4f\x2f\xda\x67\x04\xed\x33\x89\xf6\xcd\x47\xfb\x96\xa0\x7d\xcb\xd1\xbe\xd5\x68\xdf\x06\xb4\x6f\x3b\xda\x37\x8d\xf6\x1d\x46\xfb\x4e\xa0\x48\x00\x45\x8a\x51\x24\x82\x22\x55\x28\x92\x44\x91\x36\x14\xe9\x41\x91\x21\x14\xc9\xa2\xfd\xf2\xd0\x7e\x45\x68\xbf\x30\xda\x2f\x8e\xf6\xab\x43\xfb\xb5\xa0\xfd\x52\x68\xbf\x01\xb4\xdf\x38\xda\x6f\x1a\xed\xef\xa3\xfd\x43\x68\xff\x18\xda\x3f\x81\xf6\x6f\x46\xfb\x77\xa1\xfd\xfb\xd1\xfe\x63\x68\xff\x29\x74\x80\xd0\x01\x41\x74\x40\x05\x3a\xa0\x16\x1d\xd0\x84\x0e\xe8\x44\x07\xf4\xa1\x03\x46\xd1\x01\x39\x54\x5e\x80\xca\x4b\x51\x79\x39\x2a\xaf\x46\xe5\x0d\xa8\xbc\x1d\x95\xa7\x51\xf9\x30\x2a\x9f\x40\x07\x06\xd0\x81\xc5\xe8\xc0\x08\x3a\xb0\x0a\x1d\x98\x44\x07\xb6\xa1\x03\x7b\xd0\x81\x43\xe8\xc0\x2c\x3a\x28\x0f\x1d\x54\x84\x0e\x2a\x43\x07\x55\xa2\x83\xea\xd1\x41\xad\xe8\xa0\x6e\x74\xd0\x20\x3a\x28\x83\x0e\x06\x1d\x5c\x88\x0e\x0e\xa3\x83\x63\xe8\xe0\x04\x3a\xb8\x19\x1d\xdc\x85\x0e\xee\x47\x07\x8f\xa1\x83\xa7\x50\x54\x28\x1a\x44\xd1\x0a\x14\xad\x45\xd1\x26\x14\xed\x44\xd1\x3e\x14\x1d\x45\xd1\x1c\x3a\xa4\x00\x1d\x52\x8a\x0e\x89\xa2\x43\x6a\xd0\x21\x8d\xe8\x90\x0e\x74\x48\x2f\x3a\x64\x04\x1d\x32\x89\x0e\xcd\x47\x87\x96\xa0\x43\xcb\xd1\xa1\x55\xe8\xd0\x24\x3a\xb4\x0d\x1d\xda\x83\x0e\x1d\x42\x87\x66\xd1\x61\x79\xe8\xb0\x22\x74\x58\x19\x3a\xac\x12\x1d\x56\x8f\x0e\x6b\x45\x87\x75\xa3\xc3\x06\xd1\x61\x19\x54\x01\xaa\x28\x44\x15\x61\x54\x11\x47\x15\x75\xa8\xa2\x05\x55\xa4\x50\xc5\x00\xaa\x18\x47\x15\xd3\xe8\x70\x1f\x1d\x1e\x42\x87\xc7\xd0\xe1\xb5\xe8\xf0\x26\x74\x78\x27\x3a\xbc\x0f\x1d\x3e\x8a\x0e\xcf\xa1\x23\x0a\xd0\x11\xa5\xe8\x88\x28\x3a\xa2\x06\x1d\xd1\x88\x8e\xe8\x40\x47\xf4\xa2\x23\x46\xd0\x11\x93\xe8\xc8\x7c\x74\x64\x09\x3a\xb2\x1c\x1d\x59\x8d\x8e\x6c\x40\x47\xb6\xa3\x23\xd3\xe8\xc8\x61\x74\xe4\x04\x8a\x05\x50\xac\x18\xc5\x22\x28\x56\x85\x62\xf5\x28\xd6\x8a\x62\xdd\x28\x36\x88\x62\x19\x74\x14\xe8\xa8\x42\x74\x54\x18\x1d\x15\x47\x47\xd5\xa1\xa3\x5a\xd0\x51\x29\x74\xd4\x00\x3a\x6a\x1c\x1d\x35\x8d\x8e\xf6\xd1\xd1\x21\x74\x74\x0c\x1d\x9d\x40\x47\x37\xa3\xa3\xbb\xd0\xd1\xfd\xe8\xe8\x31\x74\xf4\x14\x3a\x46\xe8\x98\x20\x3a\xa6\x02\x1d\x53\x8b\x8e\x69\x44\xc7\x74\xa0\x63\x7a\xd1\x31\x23\xe8\x98\x49\x14\xcf\x47\xf1\x12\x14\x2f\x47\xf1\x6a\x14\x6f\x40\xf1\x76\x14\x4f\xa3\xf8\x30\x8a\x4f\xa0\x63\x03\xe8\xd8\x62\x74\x6c\x04\x1d\x5b\x85\x8e\x4d\xa2\x63\xdb\xd0\xb1\x3d\xe8\xd8\x21\x74\x6c\x16\x1d\x97\x87\x8e\x2b\x42\xc7\x95\xa1\xe3\x2a\xd1\x71\xf5\xe8\xb8\x16\x74\x5c\x0a\x1d\x37\x80\x8e\x1b\x47\xc7\x4d\xa3\xe3\x7d\x74\x7c\x08\x1d\x1f\x43\xc7\x27\xd0\xf1\xcd\xe8\xf8\x2e\x74\x7c\x3f\x3a\x7e\x0c\x1d\x3f\x85\x2a\x85\x2a\x83\xa8\xb2\x02\x55\xd6\xa2\xca\x26\x54\xd9\x89\x2a\xfb\x50\xe5\x28\xaa\xcc\xa1\x13\x0a\xd0\x09\xa5\xe8\x84\x28\x3a\xa1\x06\x9d\xd0\x88\x4e\x68\x47\x27\xa4\xd1\x09\xc3\xe8\x84\x09\x74\x62\x00\x9d\x58\x8c\x4e\x8c\xa0\x13\xab\xd0\x89\x49\x74\x62\x1b\x3a\xb1\x07\x9d\x38\x84\x4e\xcc\xa2\x93\xf2\xd0\x49\x45\xe8\xa4\x32\x74\x52\x25\x3a\xa9\x1e\x9d\xd4\x8a\x4e\xea\x46\x27\x0d\xa2\x93\x32\xa8\x0a\x54\x55\x88\xaa\xc2\xa8\x2a\x8e\xaa\xea\x50\x55\x0b\xaa\xea\x42\x55\xfd\xa8\x6a\x0c\x55\x4d\xa1\x93\x85\x4e\x0e\xa2\x93\x2b\xd0\xc9\xb5\xe8\xe4\x26\x74\x72\x27\x3a\xb9\x0f\x9d\x3c\x8a\x4e\xce\xa1\x53\x0a\xd0\x29\xa5\xe8\x94\x28\x3a\xa5\x06\x9d\xd2\x88\x4e\xe9\x40\xa7\xf4\xa2\x53\x46\xd0\x29\x93\xe8\xd4\x7c\x74\x6a\x09\x3a\xb5\x1c\x9d\x5a\x8d\x4e\x6d\x40\xa7\xb6\xa3\x53\x7b\xd0\xa9\x43\xe8\xd4\x2c\xaa\xce\x43\xd5\x45\xa8\xba\x0c\x55\x57\xa2\xea\x7a\x54\xdd\x8a\xaa\xbb\x51\xf5\x20\xaa\xce\xa0\xd3\x40\xa7\x15\xa2\xd3\xc2\xe8\xb4\x38\x3a\xad\x0e\x9d\xd6\x82\x4e\x4b\xa1\xd3\x06\xd0\x69\xe3\xe8\xb4\x69\x74\xba\x8f\x4e\x0f\xa1\xd3\x63\xe8\xf4\x04\x3a\xbd\x19\x9d\xde\x85\x4e\xef\x43\xa7\x8f\xa2\xd3\x73\xe8\x8c\x02\x74\x46\x29\x3a\x23\x8a\xce\xa8\x41\x67\x34\xa2\x33\x3a\xd0\x19\xbd\xe8\x8c\x11\x74\xc6\x24\xaa\xc9\x47\x35\x25\xa8\xa6\x1c\xd5\x54\xa3\x9a\x06\x54\xd3\x8e\x6a\xd2\xa8\x66\x18\xd5\x4c\xa0\x33\x03\xe8\xcc\x62\x74\x66\x04\x9d\x59\x85\xce\x4c\xa2\x33\xdb\xd0\x99\x3d\xe8\xcc\x41\x74\x66\x06\x9d\x05\x3a\xab\x10\x9d\x15\x46\x67\xc5\xd1\x59\x75\xe8\xac\x16\x74\x56\x0a\x9d\x35\x80\xce\x1a\x47\x67\x4d\xa3\xb3\x7d\x74\x76\x08\x9d\x1d\x43\x67\x27\xd0\xd9\xcd\xe8\xec\x2e\x74\x76\x3f\x3a\x7b\x0c\x9d\x3d\x85\x6a\x85\x6a\x83\xa8\xb6\x02\xd5\xd6\xa2\xda\x26\x54\xdb\x89\x6a\xfb\x50\xed\x08\xaa\x9d\x44\xe7\xe4\xa3\x73\x4a\xd0\x39\xe5\xe8\x9c\x6a\x74\x4e\x03\x3a\xa7\x1d\x9d\x93\x46\xe7\x0c\xa3\x73\x26\xd0\xb9\x01\x74\x6e\x31\x3a\x37\x82\xce\xad\x42\xe7\x26\xd1\xb9\x6d\xe8\xdc\x1e\x74\xee\x10\x3a\x37\x8b\xce\xcb\x43\xe7\x15\xa1\xf3\xca\xd0\x79\x95\xe8\xbc\x7a\x74\x5e\x2b\x3a\xaf\x1b\x9d\x37\x88\xce\x1b\x47\xe7\x4d\xa3\x84\x8f\x12\x21\x94\x88\xa1\x44\x02\x25\x9a\x51\xa2\x0b\x25\xfa\x51\x62\x0c\x25\xa6\xd0\xf9\x42\xe7\x07\xd1\xf9\x15\xe8\xfc\x5a\x74\x7e\x13\x3a\xbf\x13\x9d\xdf\x87\xce\x1f\x45\xe7\xe7\xd0\x05\x05\xe8\x82\x52\x74\x41\x14\x5d\x50\x83\x2e\x68\x44\x17\x74\xa0\x0b\x7a\xd1\x05\x23\xe8\x82\x09\x74\x61\x00\x5d\x58\x8c\x2e\x8c\xa0\x0b\xab\xd0\x85\x49\x74\x61\x1b\xba\xb0\x07\x5d\x38\x84\x2e\xcc\xa2\xba\x3c\x54\x57\x84\xea\xca\x50\x5d\x25\xaa\xab\x47\x75\xad\xa8\xae\x1b\xd5\x0d\xa2\xba\x0c\xba\x08\x74\x51\x21\xba\x28\x8c\x2e\x8a\xa3\x8b\xea\xd0\x45\x2d\xe8\xa2\x14\xba\x68\x00\x5d\x34\x8e\x2e\x9a\x42\x17\x0b\x5d\x1c\x44\x17\x57\xa0\x8b\x6b\xd1\xc5\x4d\xe8\xe2\x4e\x74\x71\x1f\xba\x78\x14\x5d\x9c\x43\x97\x14\xa0\x4b\x4a\xd1\x25\x51\x74\x49\x0d\xba\xa4\x11\x5d\xd2\x81\x2e\xe9\x45\x97\x8c\xa0\x4b\x26\x51\x7d\x3e\xaa\x2f\x41\xf5\xe5\xa8\xbe\x1a\xd5\x37\xa0\xfa\x76\x54\x9f\x46\xf5\xc3\xa8\x7e\x02\x5d\x9a\x87\x2e\x2d\x42\x97\x96\xa1\x4b\x2b\xd1\xa5\xf5\xe8\xd2\x56\x74\x69\x37\xba\x74\x10\x5d\x9a\x41\x97\x81\x2e\x2b\x44\x97\x85\xd1\x65\x71\x74\x59\x1d\xba\xac\x05\x5d\x96\x42\x97\x0d\xa0\xcb\xc6\xd1\x65\xd3\xe8\x72\x1f\x5d\x1e\x42\x97\xc7\xd0\xe5\x09\x74\x79\x33\xba\xbc\x0b\x5d\xde\x8f\x2e\x1f\x43\x97\x4f\xa1\x64\x01\x4a\x96\xa2\x64\x14\x25\x6b\x50\xb2\x11\x25\x3b\x50\xb2\x17\x25\x47\x50\x72\x12\x5d\x91\x8f\xae\x28\x41\x57\x94\xa3\x2b\xaa\xd1\x15\x0d\xe8\x8a\x76\x74\x45\x1a\x5d\x31\x8c\xae\x98\x40\x57\x06\xd0\x95\xc5\xe8\xca\x08\xba\xb2\x0a\x5d\x99\x44\x57\xb6\xa1\x2b\x7b\xd0\x95\x43\xe8\xca\x2c\xba\x2a\x0f\x5d\x55\x88\xae\x0a\xa3\xab\xe2\xe8\xaa\x3a\x74\x55\x0b\xba\x2a\x85\xae\x1a\x40\x57\x8d\xa3\xab\xa6\x51\x83\x8f\x1a\x42\xa8\x21\x86\x1a\x12\xa8\xa1\x19\x35\x74\xa1\x86\x7e\xd4\x30\x86\x1a\xa6\xd0\xd5\x42\x57\x07\xd1\xd5\x15\xe8\xea\x5a\x74\x75\x13\xba\xba\x13\x5d\xdd\x87\xae\x1e\x45\x57\xe7\xd0\x35\x05\xe8\x9a\x12\x74\x4d\x39\xba\xa6\x1a\x5d\xd3\x80\xae\x69\x47\xd7\xa4\xd1\x35\xc3\xe8\x9a\x09\x74\x6d\x00\x5d\x5b\x8c\xae\x8d\xa0\x6b\xab\xd0\xb5\x49\x74\x6d\x1b\xba\xb6\x07\x5d\x3b\x84\xae\xcd\xa2\xc6\x3c\xd4\x58\x84\x1a\xcb\x50\x63\x25\x6a\xac\x47\x8d\xad\xa8\xb1\x1b\x35\x0e\xa2\xc6\x0c\xba\x0e\x74\x5d\x21\xba\x2e\x84\xae\x8b\xa1\xeb\x12\xe8\xba\x66\x74\x5d\x17\xba\xae\x1f\x5d\x37\x86\xae\x9b\x42\xd7\x0b\x5d\x1f\x44\xd7\x57\xa0\xeb\x6b\xd1\xf5\x4d\xe8\xfa\x4e\x74\x7d\x1f\xba\x7e\x14\x5d\x9f\x43\x37\x14\xa0\x1b\x4a\xd1\x0d\x51\x74\x43\x0d\xba\xa1\x11\xdd\xd0\x81\x6e\xe8\x45\x37\x8c\xa0\x1b\x26\x51\x53\x3e\x6a\x2a\x41\x4d\x11\xd4\x54\x85\x9a\x92\xa8\xa9\x0d\x35\xf5\xa0\xa6\x21\xd4\x94\x45\x37\xe6\xa1\x1b\x8b\xd0\x8d\x65\xe8\xc6\x4a\x74\x63\x3d\xba\xb1\x15\xdd\xd8\x8d\x6e\x1c\x44\x37\x66\xd0\x4d\xa0\x9b\x0a\xd1\x4d\x61\x74\x53\x1c\xdd\x54\x87\x6e\x6a\x41\x37\xa5\xd0\x4d\x03\xe8\xa6\x71\x74\xd3\x34\xba\xd9\x47\x37\x87\xd0\xcd\x15\xe8\xe6\x5a\x74\x73\x13\xba\xb9\x13\xdd\xdc\x87\x6e\x1e\x45\x37\xe7\x50\x73\x01\x6a\x2e\x45\xcd\x51\xd4\x5c\x83\x9a\x1b\x51\x73\x07\x6a\xee\x45\xcd\x23\xa8\x79\x12\xdd\x92\x8f\x6e\x29\x41\xb7\x94\xa3\x5b\xaa\xd1\x2d\x0d\xe8\x96\x76\x74\x4b\x1a\xdd\x32\x8c\x6e\x99\x40\xb7\x06\xd0\xad\xc5\xe8\xd6\x08\xba\xb5\x12\xdd\x5a\x8f\x6e\x6d\x45\xb7\x76\xa3\x5b\x07\xd1\xad\x19\x74\x1b\xe8\xb6\x42\x74\x5b\x18\xdd\x16\x47\xb7\xd5\xa1\xdb\x5a\xd0\x6d\x29\x74\xdb\x00\xba\x6d\x1c\xdd\x36\x8d\x5a\x7c\xd4\x12\x42\x2d\x31\xd4\x92\x40\x2d\xcd\xa8\xa5\x0b\xb5\xf4\xa3\x96\x31\xd4\x32\x85\x6e\x17\xba\x3d\x88\x6e\xaf\x40\xb7\xd7\xa0\xdb\x1b\xd1\xed\x1d\xe8\xf6\x5e\x74\xfb\x08\xba\x7d\x12\xdd\x91\x8f\xee\x28\x41\x77\x94\xa3\x3b\xaa\xd1\x1d\x0d\xe8\x8e\x76\x74\x47\x1a\xdd\x31\x8c\xee\x98\x40\x77\x06\xd0\x9d\xc5\xe8\xce\x08\xba\xb3\x0a\xdd\x99\x44\x77\xb6\xa1\x3b\x7b\xd0\x9d\x43\xe8\xce\x2c\x6a\xcd\x43\xad\x45\xa8\xb5\x0c\xb5\x56\xa2\xd6\x3a\xd4\xda\x82\x5a\x53\xa8\x75\x00\xb5\x8e\xa3\xd6\x69\x74\x97\x8f\xee\x0a\xa1\xbb\x62\xe8\xae\x04\xba\xab\x19\xdd\xd5\x85\xee\xea\x47\x77\x8d\xa1\xbb\xa6\xd0\xdd\x42\x77\x07\xd1\xdd\x15\xe8\xee\x5a\x74\x77\x13\xba\xbb\x13\xdd\xdd\x87\xee\x1e\x45\x77\xe7\xd0\x3d\x05\xe8\x9e\x52\x74\x4f\x14\xdd\x53\x83\xee\x69\x40\xf7\xb4\xa3\x7b\xd2\xe8\x9e\x61\x74\xcf\x04\x6a\x0b\xa0\xb6\x62\xd4\x16\x41\x6d\x55\xa8\x2d\x89\xda\xda\x50\x5b\x0f\x6a\x1b\x42\x6d\x59\x74\x6f\x1e\xba\xb7\x08\xdd\x5b\x86\xee\xad\x44\xf7\xd6\xa3\x7b\x5b\xd1\xbd\xdd\xe8\xde\x41\x74\x6f\x06\xdd\x07\xba\xaf\x10\xdd\x17\x46\xf7\xc5\xd1\x7d\x75\xe8\xbe\x66\x74\x5f\x17\xba\xaf\x1f\xdd\x37\x86\xee\x9b\x42\xf7\x0b\xdd\x1f\x44\xf7\x57\xa0\xfb\x6b\xd1\xfd\x4d\xe8\xfe\x4e\x74\x7f\x1f\xba\x7f\x14\xdd\x9f\x43\xed\x05\xa8\xbd\x14\xb5\x47\x51\x7b\x0d\x6a\x6f\x44\xed\x1d\xa8\xbd\x17\xb5\x8f\xa0\xf6\x49\xf4\x40\x3e\x7a\xa0\x04\x3d\x50\x8e\x1e\xa8\x46\x0f\x34\xa0\x07\xda\xd0\x03\x3d\xe8\x81\x21\xf4\x40\x16\x3d\x98\x87\x1e\x2c\x42\x0f\x96\xa1\x07\x2b\xd1\x83\xf5\xe8\xc1\x56\xf4\x60\x37\x7a\x70\x10\x3d\x98\x41\x0f\x81\x1e\x2a\x44\x0f\x85\xd1\x43\x71\xf4\x50\x1d\x7a\xa8\x05\x3d\x94\x42\x0f\x0d\xa0\x87\xc6\xd1\x43\xd3\xa8\xc3\x47\x1d\x21\xd4\x11\x43\x1d\x09\xd4\xd1\x8c\x3a\x3a\x51\x47\x1f\xea\x18\x45\x1d\x39\xf4\x70\x01\x7a\xb8\x14\x3d\x1c\x45\x0f\xd7\xa0\x87\x1b\xd1\xc3\x1d\xe8\xe1\x5e\xf4\xf0\x08\x7a\x78\x12\x3d\x92\x8f\x1e\x29\x41\x8f\x94\xa3\x47\xaa\xd1\x23\x0d\xe8\x91\x76\xf4\x48\x1a\x3d\x32\x8c\x1e\x99\x40\x8f\x06\xd0\xa3\xc5\xe8\xd1\x08\x7a\xb4\x0a\x3d\x9a\x44\x8f\xb6\xa1\x47\xbb\xd1\xa3\x83\xe8\xd1\x0c\xea\x04\x75\x16\xa2\xce\x30\xea\x8c\xa3\xce\x3a\xd4\xd9\x82\x3a\x53\xa8\x73\x00\x75\x8e\xa3\xce\x69\xf4\x98\x8f\x1e\x0b\xa1\xc7\x62\xe8\xb1\x04\x7a\xac\x19\x3d\xd6\x85\x1e\xeb\x47\x8f\x8d\xa1\xc7\xa6\xd0\xe3\x42\x8f\x07\xd1\xe3\x15\xe8\xf1\x5a\xf4\x78\x13\x7a\xbc\x13\x3d\xde\x8b\x1e\x1f\x41\x8f\x4f\xa2\x27\xf2\xd1\x13\x25\xe8\x89\x72\xf4\x44\x35\x7a\xa2\x01\x3d\xd1\x8e\x9e\x48\xa3\x27\x86\xd1\x13\x13\xa8\x2b\x80\xba\x8a\x51\x57\x04\x75\x55\xa1\xae\x24\xea\x6a\x43\x5d\x3d\xa8\x6b\x08\x75\x65\xd1\x93\x79\xe8\xc9\x22\xf4\x64\x19\x7a\xb2\x12\x3d\x59\x8f\x9e\x6c\x45\x4f\x76\xa3\x27\x07\xd0\x93\xe3\xe8\xc9\x69\xf4\x94\x8f\x9e\x0a\xa1\xa7\x62\xe8\xa9\x04\x7a\xaa\x19\x3d\xd5\x85\x9e\xea\x47\x4f\x8d\xa1\xa7\xa6\xd0\xd3\x42\x4f\x07\xd1\xd3\x15\xe8\xe9\x5a\xf4\x74\x13\x7a\xba\x13\x3d\xdd\x87\x9e\x1e\x45\x4f\xe7\x50\xaa\x00\xa5\x4a\x51\x2a\x8a\x52\x35\x28\xd5\x88\x52\x1d\x28\xd5\x8b\x52\xc3\x28\x35\x81\x9e\x09\xa0\x67\x8a\xd1\x33\x11\xf4\x4c\x15\x7a\x26\x89\x9e\x69\x43\xcf\xf4\xa0\x67\x86\xd0\x33\x59\xf4\x6c\x1e\x7a\xb6\x08\x3d\x5b\x86\x9e\xad\x44\xcf\xd6\xa3\x67\x5b\xd1\xb3\xdd\xe8\xd9\x41\xf4\x6c\x06\x3d\x07\x7a\xae\x10\x3d\x17\x46\xcf\xc5\xd1\x73\x75\xe8\xb9\x16\xf4\x5c\x0a\x3d\x37\x80\x9e\x1b\x43\xcf\x4d\xa1\x6e\xa1\xee\x20\xea\xae\x40\xdd\xb5\xa8\xbb\x09\x75\x77\xa2\xee\x3e\xd4\x3d\x8a\xba\x73\xe8\xf9\x02\xf4\x7c\x29\x7a\x3e\x8a\x9e\xaf\x41\xcf\x37\xa2\xe7\x3b\xd0\xf3\xbd\xe8\xf9\x11\xf4\xfc\x24\x7a\x21\x1f\xbd\x50\x82\x5e\x28\x47\x2f\x54\xa3\x17\x1a\xd0\x0b\xed\xe8\x85\x34\x7a\x61\x18\xbd\x90\x45\x2f\xe6\xa1\x17\x8b\xd0\x8b\x65\xe8\xc5\x4a\xf4\x62\x3d\x7a\xb1\x15\xbd\xd8\x8d\x5e\x1c\x44\x2f\x66\x50\x0f\xa8\xa7\x10\xf5\x84\x51\x4f\x1c\xf5\xd4\xa1\x9e\x16\xd4\x93\x42\x3d\x03\xa8\x67\x1c\xf5\x4c\xa3\x97\x7c\xf4\x52\x08\xbd\x14\x43\x2f\x25\xd0\x4b\xcd\xe8\xa5\x2e\xf4\x52\x3f\x7a\x69\x0c\xbd\x94\x43\x2f\x17\xa0\x97\x4b\xd1\xcb\x51\xf4\x72\x0d\x7a\xb9\x11\xbd\xdc\x81\x5e\xee\x45\x2f\x8f\xa0\x97\x27\xd1\x2b\xf9\xe8\x95\x12\xf4\x4a\x39\x7a\xa5\x1a\xbd\xd2\x80\x5e\x69\x47\xaf\xa4\xd1\x2b\xc3\xe8\x95\x09\x94\x0e\xa0\x74\x31\x4a\x47\x50\xba\x0a\xa5\x93\x28\xdd\x86\xd2\x3d\x28\x3d\x84\xd2\x59\xf4\x2a\xe8\xd5\x42\xf4\x6a\x18\xbd\x1a\x47\xaf\xd6\xa1\x57\x5b\xd0\xab\x29\xf4\xea\x00\x7a\x75\x1c\xbd\x3a\x8d\x5e\xf3\xd1\x6b\x21\xf4\x5a\x0c\xbd\x96\x40\xaf\x35\xa3\xd7\xba\xd0\x6b\xfd\xe8\xb5\x31\xf4\xda\x14\x7a\x5d\xe8\xf5\x20\x7a\xbd\x02\xbd\x5e\x8b\x5e\x6f\x42\xaf\x77\xa2\xd7\xfb\xd0\xeb\xa3\xe8\xf5\x1c\xea\xcd\x47\xbd\x25\xa8\xb7\x1c\xf5\x56\xa3\xde\x06\xd4\xdb\x8e\x7a\xd3\xa8\x77\x18\xf5\x4e\xa0\x37\x02\xe8\x8d\x62\xf4\x46\x04\xbd\x51\x85\xde\x48\xa2\x37\xda\xd0\x1b\x3d\xe8\x8d\x21\xf4\x46\x16\xbd\x99\x87\xde\x2c\x42\x6f\x96\xa1\x37\x2b\xd1\x9b\xf5\xe8\xcd\x56\xf4\x66\x37\x7a\x73\x10\xbd\x99\x41\x6f\x81\xde\xf2\xd1\x5b\x21\xf4\x56\x0c\xbd\x95\x40\x6f\x35\xa3\xb7\xba\xd0\x5b\xfd\xe8\xad\x31\xf4\xd6\x14\xea\x13\xea\x0b\xa2\xbe\x0a\xd4\x57\x8b\xfa\x9a\x50\x5f\x27\xea\xeb\x43\x7d\xa3\xa8\x2f\x87\xde\x2e\x40\x6f\x97\xa2\xb7\xa3\xe8\xed\x1a\xf4\x76\x23\x7a\xbb\x03\xbd\xdd\x8b\xde\x1e\x41\x6f\x4f\xa2\x77\xf2\xd1\x3b\xc5\xe8\x9d\x08\x7a\xa7\x0a\xbd\x93\x44\xef\xb4\xa1\x77\x7a\xd0\x3b\x43\xe8\x9d\x2c\x7a\x37\x0f\xbd\x5b\x84\xde\x2d\x43\xef\x56\xa2\x77\xeb\xd1\xbb\xad\xe8\xdd\x6e\xf4\xee\x20\x7a\x37\x83\xfa\x41\xfd\x85\xa8\x3f\x8c\xfa\xe3\xa8\xbf\x0e\xf5\xb7\xa0\xfe\x14\xea\x1f\x40\xfd\xe3\xa8\x7f\x1a\xbd\xe7\xa3\xf7\x82\xe8\xbd\x0a\xf4\x5e\x2d\x7a\xaf\x09\xbd\xd7\x89\xde\xeb\x43\xef\x8d\xa2\xf7\x72\xe8\xfd\x02\xf4\x7e\x29\x7a\x3f\x8a\xde\xaf\x41\xef\x37\xa2\xf7\x3b\xd0\xfb\xbd\xe8\xfd\x11\xf4\xfe\x24\xfa\x20\x1f\x7d\x50\x82\x3e\x28\x47\x1f\x54\xa3\x0f\x1a\xd0\x07\xed\xe8\x83\x34\xfa\x60\x18\x7d\x30\x81\x06\x02\x68\xa0\x18\x0d\x94\xa1\x81\x4a\x34\x50\x8f\x06\x5a\xd1\x40\x37\x1a\x18\x44\x03\x19\xf4\x21\xe8\xc3\x42\xf4\x61\x18\x7d\x18\x47\x1f\xd6\xa1\x0f\x5b\xd0\x87\x29\xf4\xe1\x00\xfa\x70\x1c\x7d\x38\x8d\x3e\xf2\xd1\x47\x21\xf4\x51\x0c\x7d\x94\x40\x1f\x35\xa3\x8f\xba\xd0\x47\xfd\xe8\xa3\x31\xf4\xd1\x14\xfa\x58\xe8\xe3\x20\xfa\x38\x8a\x3e\xae\x41\x1f\x37\xa2\x8f\x3b\xd0\xc7\xbd\xe8\xe3\x11\xf4\xf1\x24\x1a\xcc\x47\x83\x25\x68\xb0\x1c\x0d\x56\xa3\xc1\x06\x34\xd8\x8e\x06\xd3\x68\x70\x18\x0d\x4e\xa0\x4f\x02\xe8\x93\x62\xf4\x49\x04\x7d\x52\x85\x3e\x49\xa2\x4f\xda\xd0\x27\x3d\xe8\x93\x21\xf4\x49\x16\x7d\x9a\x87\x3e\x2d\x42\x9f\x96\xa1\x4f\xe3\xe8\xd3\x3a\xf4\x69\x0b\xfa\x34\x85\x3e\x1d\x40\x9f\x8e\xa3\x4f\xa7\xd1\x67\x3e\xfa\x2c\x84\x3e\x8b\xa1\xcf\x12\xe8\xb3\x66\xf4\x59\x17\xfa\xac\x1f\x7d\x36\x86\x3e\x9b\x42\x43\x42\x43\x41\x34\x54\x81\x86\x6a\xd1\x50\x13\x1a\xea\x44\x43\x7d\x68\x68\x14\x0d\xe5\xd0\xe7\x05\xe8\xf3\x52\xf4\x79\x14\x7d\x5e\x8d\x3e\x6f\x40\x9f\xb7\xa3\xcf\xd3\xe8\xf3\x61\xf4\xf9\x04\xfa\x22\x80\xbe\x28\x46\x5f\x44\xd0\x17\x55\xe8\x8b\x24\xfa\xa2\x0d\x7d\xd1\x83\xbe\x18\x42\x5f\x64\xd1\x97\x79\xe8\xcb\x22\xf4\x65\x19\xfa\xb2\x12\x7d\x59\x8f\xbe\x6c\x45\x5f\x76\xa3\x2f\x07\xd1\x97\x19\x34\x0c\x1a\x2e\x44\xc3\x61\x34\x1c\x47\xc3\x09\x34\xdc\x8c\x86\xbb\xd0\x70\x3f\x1a\x1e\x43\xc3\x53\xe8\x2b\xa1\xaf\x82\xe8\xab\x0a\xf4\x55\x2d\xfa\xaa\x09\x7d\xd5\x89\xbe\xea\x43\x5f\x8d\xa2\xaf\x72\xe8\xeb\x02\xf4\x75\x29\xfa\x3a\x8a\xbe\xae\x41\x5f\x37\xa2\xaf\x3b\xd0\xd7\xbd\xe8\xeb\x11\xf4\xf5\x24\xfa\x26\x1f\x7d\x53\x82\xbe\x29\x47\xdf\x54\xa3\x6f\x92\xe8\x9b\x36\xf4\x4d\x0f\xfa\x66\x08\x7d\x93\x45\x23\x79\x68\xa4\x08\x8d\x94\xa1\x91\x4a\x34\x52\x8f\x46\x5a\xd1\x48\x37\x1a\x19\x44\x23\x19\xf4\x2d\xe8\xdb\x42\xf4\x6d\x18\x7d\x1b\x47\xdf\xd6\xa1\x6f\x5b\xd0\xb7\x29\xf4\xed\x00\xfa\x76\x1c\x7d\x3b\x8d\xbe\xf3\xd1\x77\x21\xf4\x5d\x0c\x7d\x97\x40\xdf\x35\xa1\xef\x3a\xd1\x77\x7d\xe8\xbb\x51\xf4\x5d\x0e\x7d\x5f\x80\xbe\x2f\x45\xdf\x47\xd1\xf7\x35\xe8\xfb\x46\xf4\x7d\x07\xfa\xbe\x17\x7d\x3f\x82\xbe\x9f\x44\xa3\xf9\x68\xb4\x04\x8d\x96\xa3\xd1\x6a\x34\xda\x80\x46\xdb\xd1\x68\x1a\x8d\x0e\xa3\xd1\x09\xf4\x43\x00\xfd\x50\x8c\x7e\x88\xa0\x1f\xaa\xd0\x0f\x49\xf4\x43\x2b\xfa\xa1\x1b\xfd\x30\x88\x7e\xc8\xa0\x1f\x41\x3f\x16\xa2\x1f\xc3\xe8\xc7\x38\xfa\xb1\x0e\xfd\xd8\x82\x7e\x4c\xa1\x1f\x07\xd0\x8f\xe3\xe8\xc7\x69\xf4\x93\x8f\x7e\x0a\xa1\x9f\x62\xe8\xa7\x04\xfa\xa9\x19\xfd\xd4\x85\x7e\xea\x47\x3f\x8d\xa1\x9f\xa6\xd0\x98\xd0\x58\x10\x8d\x55\xa0\xb1\x5a\x34\xd6\x84\xc6\x3a\xd0\x58\x2f\x1a\x1b\x41\x63\x93\xe8\xe7\x7c\xf4\x73\x09\xfa\xb9\x1c\xfd\x5c\x8d\x7e\x6e\x40\x3f\xb7\xa3\x9f\xd3\xe8\xe7\x61\xf4\xf3\x04\xfa\x25\x80\x7e\x29\x46\xbf\x44\xd0\x2f\x55\xe8\x97\x24\xfa\xa5\x0d\xfd\xd2\x83\x7e\x19\x42\xbf\x64\xd1\xaf\x79\xe8\xd7\x22\xf4\x6b\x19\xfa\xb5\x12\xfd\x5a\x8f\x7e\x6d\x45\xbf\xa6\xd0\xaf\x03\xe8\xd7\x71\xf4\xeb\x34\x1a\xf7\xd1\x78\x08\x8d\xc7\xd0\x78\x02\x8d\x37\xa3\xf1\x2e\x34\xde\x8f\xc6\xc7\xd0\xf8\x14\xfa\x4d\xe8\xb7\x20\xfa\xad\x02\xfd\x56\x8b\x7e\x6b\x42\xbf\x75\xa2\xdf\xfa\xd0\x6f\xa3\xe8\xb7\x1c\xfa\xbd\x00\xfd\x5e\x8a\x7e\x8f\xa2\xdf\x6b\xd0\xef\x8d\xe8\xf7\x0e\xf4\x7b\x1a\xfd\x3e\x8c\x7e\x9f\x40\x7f\x04\xd0\x1f\xc5\xe8\x8f\x08\xfa\xa3\x0a\xfd\x91\x44\x7f\xb4\xa1\x3f\x7a\xd0\x1f\x43\xe8\x8f\x2c\xca\xe4\xa1\x4c\x11\xca\x94\xa1\x4c\x25\xca\xd4\xa3\x4c\x2b\xca\x74\xa3\xcc\x20\xca\x64\xd0\x5c\xd0\xdc\x42\x34\x37\x8c\xe6\xc6\xd1\xdc\x3a\x34\xb7\x05\xcd\x4d\xa1\xb9\xfd\x68\xee\x18\x9a\x3b\x85\xe6\x09\xcd\x0b\xa2\x79\x15\x68\x5e\x2d\x9a\xd7\x84\xe6\x75\xa2\x79\x7d\x68\xde\x28\x9a\x97\x43\xf3\x0b\xd0\xfc\x52\x34\x3f\x8a\xe6\xd7\xa0\xf9\x8d\x68\x7e\x07\x9a\xdf\x8b\xe6\x8f\xa0\xf9\x93\x28\x9b\x8f\xb2\x25\x28\x5b\x8e\xb2\xd5\x28\xdb\x80\xb2\xed\x28\x9b\x46\xd9\x21\x94\xcd\xa2\x05\x79\x68\x41\x11\x5a\x50\x86\x16\x54\xa2\x05\xf5\x68\x41\x2b\x5a\xd0\x8d\x16\x0c\xa2\x05\x19\xb4\x10\xb4\xb0\x10\x2d\x0c\xa3\x85\x71\xb4\xb0\x0e\x2d\x6c\x41\x0b\x53\x68\xe1\x00\x5a\x38\x8e\x16\x4e\xa3\x45\x3e\x5a\x14\x42\x8b\x62\x68\x51\x02\x2d\x6a\x46\x8b\xba\xd0\xa2\x7e\xb4\x68\x14\x2d\xca\xa1\x89\x02\x34\x51\x8a\x26\xa2\x68\xa2\x06\x4d\x34\xa2\x89\x0e\x34\xd1\x8b\x26\x46\xd0\xc4\x24\x5a\x9c\x8f\x16\x97\xa0\xc5\xe5\x68\x71\x35\x5a\xdc\x80\x16\xb7\xa3\xc5\x69\xb4\x78\x18\x2d\x9e\x40\x4b\x02\x68\x49\x31\x5a\x12\x41\x4b\xaa\xd0\x92\x24\x5a\xd2\x86\x96\xf4\xa0\x25\x43\x68\x49\x06\x2d\x05\x2d\x2d\x44\x4b\xc3\x68\x69\x1c\x2d\xad\x43\x4b\x5b\xd0\xd2\x14\x5a\x3a\x80\x96\x8e\xa3\xa5\xd3\x68\xd2\x47\x93\x21\x34\x19\x43\x93\x09\x34\xd9\x8c\x26\xbb\xd0\x64\x3f\x9a\x1c\x43\x93\x53\x68\x99\xd0\xb2\x20\x5a\x56\x81\x96\xd5\xa2\x65\x4d\x68\x59\x27\x5a\xd6\x87\x96\x8d\xa2\x65\x93\x68\x79\x3e\x5a\x5e\x82\x96\x97\xa3\xe5\xd5\x68\x79\x03\x5a\xde\x8e\x96\xa7\xd1\xf2\x61\xb4\x7c\x02\xad\x08\xa0\x15\xc5\x68\x45\x04\xad\xa8\x42\x2b\x92\x68\x45\x1b\x5a\xd1\x83\x56\x0c\xa1\x15\x59\x94\xcb\x43\xb9\x22\x94\x2b\x43\xb9\x4a\x94\xab\x47\xb9\x56\x94\xeb\x46\xb9\x41\x94\xcb\xa0\xdc\x34\x5a\xe9\xa3\x95\x21\xb4\x32\x86\x56\x26\xd0\xca\x66\xb4\xb2\x0b\xad\xec\x47\x2b\xc7\xd0\xca\x29\xb4\x4a\x68\x55\x10\xad\xaa\x40\xab\x6a\xd1\xaa\x26\xb4\xaa\x13\xad\xea\x43\xab\x46\xd1\xaa\x1c\x5a\x5d\x80\x56\x97\xa2\xd5\x51\xb4\xba\x06\xad\x6e\x44\xab\x3b\xd0\xea\x5e\xb4\x7a\x04\xad\x9e\x44\x53\x01\x34\xd5\x8e\xa6\x7a\xd0\xd4\x20\xfa\x33\x86\xfe\x1c\x42\x7f\xfb\x68\xba\x06\x4d\x37\xa0\x7f\x0a\xd1\x3f\x61\xf4\x4f\x0c\xfd\x93\x40\xff\x0e\xa1\x7f\x33\xe8\x3f\xd0\x7f\x3e\x86\x00\x66\x8d\x14\x66\x8d\x7e\xcc\x1a\xa3\x98\x35\x26\x31\x6b\x06\x30\x6b\x16\x63\xd6\x2c\xc3\xac\x19\xc7\xac\x99\xc0\xcc\x28\xc6\xcc\x28\xc3\xcc\x88\x63\x66\xfc\xdf\x37\x61\x66\x74\x60\x66\xa4\x31\x33\x86\x31\x33\xb2\x98\x3c\x30\x79\x3e\x26\x2f\x88\x59\xcb\xc7\xac\xf5\x7f\x8d\x62\xd6\xaa\xc6\xac\x95\xc4\xac\x1d\xc4\xac\x1d\xc5\xac\x5d\x8d\x59\xfb\xff\xbe\x15\xb3\x76\x0a\xb3\xce\x10\x66\x9d\x0c\x66\xdd\x20\x66\xdd\x28\x66\xdd\x6a\xcc\xba\x49\xcc\xba\xad\x98\x75\x53\x98\xf5\x7a\x30\xeb\x4f\x63\xf2\x85\xd9\xa0\x0a\xb3\x61\x14\xb3\x61\x35\x66\xc3\x24\x66\xc3\x56\xcc\x86\x29\xcc\x86\xfd\x98\x8d\x22\x98\x8d\x2a\x31\x1b\xd5\x61\x36\x6a\xc6\x6c\xd4\x85\xd9\xa8\x0f\xb3\xd1\x08\x66\xa3\x09\x4c\x41\x1e\xa6\x20\x87\x99\x99\x8f\x99\x59\x8c\x99\x59\x86\x99\x19\xc7\xcc\x4c\x60\x66\x36\x61\x66\x76\x60\x66\xa6\x31\x33\x87\x30\x33\x33\x18\xaf\x18\xe3\x95\x61\xbc\x38\xc6\x4b\x60\xbc\x66\x8c\xd7\x89\xf1\x7a\x31\x6a\xc0\xa8\x0d\xa3\x6e\x8c\x06\x30\x1a\xc3\x28\x87\x31\xf9\x18\x5b\x86\xb1\x71\x8c\xf3\x31\x2e\x88\xf1\x8b\x31\x9b\x54\x61\x36\x99\xc4\x6c\x1a\xc0\x6c\x5a\x84\xd9\x34\x8c\xd9\x34\x86\xd9\xb4\x16\xb3\x99\x30\x9b\x8d\x60\x36\x9b\xc0\x14\x06\x30\x85\x45\x98\xc2\x6e\x4c\xe1\x00\xa6\x70\x0c\xb3\x85\x8f\xd9\x32\x80\xd9\xb2\x08\xb3\x65\x18\xb3\x65\x0c\xb3\x65\x2d\xa6\xa8\x17\x53\x34\x8c\x29\xca\x62\x66\x81\x99\xe5\x63\x66\x05\x31\xb3\xa2\x98\x59\xd5\x98\x59\x0d\x98\x59\x6d\x98\x59\xdd\x98\x59\x03\x98\xad\xa6\x31\xc5\x71\xcc\x36\x2d\x98\x6d\xba\x30\xdb\xb6\x63\xb6\xed\xc1\x6c\x3b\x88\xd9\xae\x03\xb3\x5d\x1a\x53\x92\xc2\x6c\x9f\xc6\xec\x90\xc2\xec\x38\x88\xd9\x71\x1c\xb3\xe3\x34\xa6\x54\x98\xd2\x52\x4c\x69\x39\xa6\xb4\x0a\x53\x5a\x8f\xd9\x29\x89\xd9\xa9\x0d\xb3\x53\x37\x66\xa7\x01\xcc\xce\x23\x98\x9d\x27\x30\xb3\xf3\x30\xb3\x0b\x31\xb3\x43\x98\xd9\x15\x98\xd9\x35\x98\xd9\x8d\x98\xd9\xed\x98\xd9\x3d\x98\xd9\x83\x98\xd9\xe3\x98\xd9\x53\x98\x5d\x84\xd9\xa5\x14\xb3\x4b\x39\x66\x97\x2a\xcc\x2e\xf5\x98\x5d\x07\x30\xbb\x8e\x61\x76\xcd\x61\x42\x60\x42\x85\x98\x50\x08\x13\xaa\xc0\x84\x6a\x30\xa1\x46\x4c\xa8\x1d\x13\xea\xc1\x84\x06\x31\xa1\x71\x4c\x68\x0a\xb3\x5b\x01\x66\xb7\x12\xcc\x6e\xcd\x98\xdd\x3a\x31\xbb\xf5\x62\x76\x1b\xc6\xec\x96\xc5\xcc\x01\x33\xc7\xc7\xcc\x09\x62\xe6\x44\x31\x73\xaa\x31\x73\x92\x98\x39\x6d\x98\x39\xdd\x98\x39\x83\x98\x39\xe3\x98\x39\x53\x98\xdd\x85\xd9\xbd\x14\xb3\x7b\x39\x26\x5c\x82\x09\x47\x30\x7b\x04\x31\x7b\x44\x31\x7b\x0c\x60\xf6\x2a\xc2\xec\x15\xc6\xec\x15\xc3\xec\x35\x8e\xd9\x6b\x0a\x53\x56\x80\x29\x2b\xc1\x94\x45\x30\x65\x95\x98\xb2\x3a\x4c\x59\x33\xa6\xac\x13\x53\xd6\x87\xd9\xbb\x08\xb3\x77\x18\xb3\x77\x0c\xb3\x77\x2d\x66\xef\x46\xcc\x3e\x43\x98\x7d\x32\x98\x7d\xa6\x31\xfb\x0a\xb3\x6f\x1a\x13\x69\xc0\x44\xda\x30\xfb\x75\x63\xf6\x1b\xc0\xec\x37\x86\xd9\x2f\x87\xd9\x3f\x1f\xb3\x7f\x31\x66\xff\x32\xcc\xfe\x43\x98\x03\x86\x31\xe5\x11\xcc\x81\x71\xcc\x81\x09\xcc\x81\x4d\x98\x03\x3b\x30\x07\x55\x61\x0e\xaa\xc7\x1c\xd4\x82\x39\xa8\x0b\x73\xd0\x20\xe6\xa0\x71\xcc\x41\x53\x98\x83\x0b\x30\x07\x97\x60\x0e\x8e\x60\x0e\xae\xc4\x1c\x5c\x87\x39\xb8\x19\x13\x8d\x62\xa2\xd5\x98\x68\x12\x13\x6d\xc5\x1c\xd2\x82\x39\xb4\x06\x73\x68\x03\xe6\xd0\x36\xcc\xa1\xdd\x98\x43\x07\x30\x87\x8e\x61\x0e\xcd\x61\x0e\x9b\xc2\x54\x14\x60\x2a\xa6\x30\x87\x17\x60\x0e\x8f\x61\x0e\x6f\xc1\x1c\x9e\xc5\x1c\x11\xc1\x1c\xd1\x82\x39\x22\x85\x39\x62\x00\x73\x64\x10\x73\x64\x2d\xe6\xc8\x4e\xcc\x91\xd3\x98\x58\x25\x26\xd6\x84\x89\xf5\x60\x62\x63\x98\xa3\xf2\x31\x47\xc5\x30\x47\xb5\x63\x8e\xea\xc7\x1c\x35\x81\x39\x3a\x1f\x73\x74\x10\x73\x74\x2d\xe6\xe8\x4e\xcc\xd1\xa3\x98\x63\x7c\xcc\x31\xad\x98\x78\x00\x13\x8f\x60\xe2\x0d\x98\x78\x06\x73\x6c\x00\x73\x6c\x29\xe6\xd8\x0a\xcc\xb1\x4d\x98\x63\x7b\x31\xc7\x09\x73\x5c\x39\xe6\xb8\x3a\xcc\x71\x1d\x98\xe3\x26\x31\xc7\x97\x63\x8e\x4f\x60\x8e\x6f\xc3\x1c\x3f\x8d\xa9\x6c\xc2\x54\x0e\x60\x2a\x27\x31\x27\xe4\x63\x4e\x08\x61\x4e\xa8\xc2\x9c\xd0\x84\x39\xa1\x0b\x73\xa2\x30\x27\xa6\x31\x27\xc5\xfe\x9f\x16\xcc\x49\xbd\x98\xaa\x20\xa6\xaa\x1b\x73\x72\x05\xe6\xe4\x31\xcc\xc9\xd3\x98\x53\xc2\x98\x53\xea\x31\xa7\xf4\x63\x4e\x99\xc4\x9c\xea\x63\x4e\x0d\x63\x4e\xad\xc4\x9c\x9a\xc4\x9c\x3a\x82\xa9\x06\x53\x1d\xc7\x54\xf7\x63\x4e\x0b\x60\x4e\xab\xc6\x9c\x36\x8c\x39\x6d\x0a\x73\x7a\x12\x73\x7a\x16\x73\x86\x8f\x39\x23\x86\x39\xa3\x01\x73\x46\x17\xe6\x8c\x61\x4c\x4d\x04\x53\x33\x85\x39\x33\x82\x39\xb3\x1b\x73\x16\x98\xb3\x62\x98\xb3\x1a\x31\x67\x75\x63\xce\x2e\xc0\x9c\x1d\xc1\x9c\x5d\x8f\x39\x3b\x85\x39\x7b\x1c\x53\x0b\xa6\xb6\x02\x53\xdb\x8c\xa9\x9d\xc0\x9c\x13\xc6\x9c\xd3\x8d\x39\x17\xcc\xb9\x09\xcc\xb9\xad\x98\x73\x47\x30\xe7\x05\x30\xe7\x25\x30\xe7\xa5\x30\xe7\x8d\x62\x12\x01\x4c\x22\x88\x49\xc4\x30\x89\x24\x26\xd1\x85\x49\xf4\x63\x12\x59\xcc\xf9\x71\xcc\xf9\xbd\x98\x0b\x02\x98\x0b\x12\x98\x0b\x06\x31\x17\x0a\x73\xe1\x20\xa6\x2e\x1f\x53\x57\x85\xa9\xeb\xc5\xd4\xe5\x30\x17\x15\x63\x2e\x6a\xc6\x5c\x34\x88\xb9\xb8\x18\x73\x71\x33\xe6\xe2\x09\xcc\x25\xc5\x98\x4b\x9a\x31\x97\x8c\x60\xea\x7d\x4c\x7d\x0c\x53\xdf\x8d\xa9\x9f\xc0\x5c\x1a\xc1\x5c\x5a\x87\xb9\x74\x18\x73\xe9\x04\xe6\xb2\x0a\xcc\x65\x4d\x98\xcb\x86\x31\x97\xe5\x30\x97\x0b\x73\x79\x18\x73\x79\x0d\xe6\xf2\x4e\x4c\x32\x0f\x93\x0c\x63\x92\x0d\x98\x64\x37\xe6\x8a\x00\xe6\x8a\x6a\xcc\x15\xad\x98\x2b\x06\x30\x57\x16\x63\xae\x8c\x60\xae\x4c\x61\xae\x1c\xc3\x5c\x55\x8c\xb9\x2a\x8e\xb9\x2a\x8d\x69\x10\xa6\xa1\x0e\xd3\x30\x8a\xb9\xba\x04\x73\x75\x1c\x73\x75\x17\xe6\x1a\x30\xd7\x54\x62\xae\x19\xc4\x5c\x2b\xcc\xb5\x0d\x98\x6b\x47\x31\x8d\x65\x98\xc6\x26\x4c\x63\x1a\x73\x1d\x98\xeb\x4a\x31\xd7\x75\x60\xae\x0f\x60\xae\x0f\x62\xae\xaf\xc3\x5c\xdf\x8b\xb9\x21\x80\xb9\x21\x8a\xb9\x61\x00\xd3\x54\x88\x69\xaa\xc7\x34\xf5\x63\x6e\x14\xe6\xc6\x04\xe6\xc6\x41\xcc\x8d\x53\x98\x9b\x4a\x31\x37\x35\x62\x6e\xea\xc7\xdc\x5c\x82\xb9\xb9\x06\x73\x73\x3b\xe6\xe6\x51\x4c\x73\x11\xa6\xb9\x12\xd3\xdc\x85\x69\x9e\xc2\xdc\x12\xc3\xdc\x52\x87\xb9\xa5\x05\x73\x4b\x1a\x73\x6b\x00\x73\xeb\x08\xe6\xf6\x5a\xcc\x1d\x31\xcc\x1d\x03\x98\x3b\x83\x98\x3b\x6b\x31\x77\xa6\x31\xad\x25\x98\xd6\xa6\xff\xdf\x5d\xf9\x98\xbb\xea\x31\x77\xf5\x63\xee\xce\xc7\xdc\x5d\x89\xb9\x7b\x1c\x73\x4f\x3d\xa6\x2d\x88\x69\x9b\xc4\xdc\x1b\xc3\xdc\xd7\x82\xb9\xbf\x1a\xd3\x1e\xc0\xb4\xf7\x61\x1e\xa8\xc5\x3c\x18\xc5\x3c\x14\xc2\x3c\x34\x84\xe9\xa8\xc5\x3c\x5c\x8a\x79\x04\xcc\x23\x55\x98\x47\xba\x31\x8f\x4c\x63\x1e\xed\xc0\x74\x96\x62\x3a\xfb\x31\x8f\x45\x31\x8f\x83\x79\xbc\x13\xf3\x44\x15\xe6\x89\x0c\xe6\xc9\x06\xcc\x53\x49\xcc\x53\x19\xcc\xd3\xb5\x98\x94\x8f\x49\xc5\x31\xcf\x84\x30\xcf\x8c\x63\x9e\xcd\x60\x9e\xeb\xc3\x74\xd7\x63\x9e\xaf\xc4\x3c\xdf\x8c\x79\xa1\x00\xf3\x42\x17\xe6\x45\x61\x5e\x6c\xc1\xbc\x38\x8d\xe9\x19\xc1\xbc\x34\x88\x79\x39\x85\x79\xa5\x00\xf3\xca\x08\x26\x1d\xc6\xa4\xd3\x98\x57\x6b\x31\xaf\x8e\x60\x5e\x4b\x61\x5e\xcf\xc7\xbc\xde\x8b\xe9\xad\xc4\xbc\x11\xc1\xbc\x29\xcc\x9b\x69\xcc\x5b\xe5\x98\xbe\x22\x4c\x5f\x12\xf3\x76\x3b\xe6\x9d\x62\xcc\x3b\xed\x98\x77\x5b\x30\xfd\x49\x4c\xff\x24\xe6\xbd\x3a\xcc\x7b\x63\x98\xf7\x1b\x30\xef\x8f\x60\x3e\x28\xc3\x7c\xd0\x8b\x19\x68\xc3\x7c\x58\x88\xf9\xb0\x17\xf3\x51\x21\xe6\xa3\x4e\xcc\x47\x59\xcc\xc7\x35\x98\x8f\xc7\x31\x83\x41\xcc\x27\x65\x98\x4f\x3a\x30\x9f\x82\xf9\x34\x81\xf9\x74\x14\xf3\x59\x23\x66\xa8\x1e\xf3\x79\x35\xe6\x8b\x7c\xcc\x17\x49\xcc\x97\xed\x98\xaf\xc0\x7c\x1d\xc4\x7c\x53\x80\xf9\x66\x1a\xf3\x2d\x98\xef\x42\x98\xef\x9a\x30\xdf\xf7\x63\x46\x53\x98\x1f\x0a\x30\x3f\x34\x63\x7e\x04\xf3\x63\x02\xf3\x93\x30\x3f\x8d\x62\xc6\x9a\x31\x3f\x57\x62\x7e\x29\xc0\xfc\xd2\x8c\xf9\x65\x02\xf3\xeb\x28\x66\xbc\x1e\xf3\x1b\x98\xdf\x3a\x30\xbf\x37\x60\xfe\x28\xc6\x64\x4a\x31\x99\x5e\xcc\xdc\x18\x66\x5e\x1c\x33\xbf\x1a\x33\xbf\x0b\x93\xed\xc1\x2c\xf0\x31\x0b\xc6\x30\x0b\xdb\x31\x8b\xea\x30\x13\x15\x98\xc5\xa5\x98\x25\x11\xcc\xd2\x18\x66\x32\x89\x59\xd6\x88\x59\x9e\x87\x59\x5e\x87\x59\x3e\x82\x59\x51\x86\x59\x31\x88\xc9\xb5\x63\x56\xe5\x63\x56\x87\x31\xab\xc7\x30\x53\x75\x98\x3f\xab\x30\x7f\x95\x61\xfe\xae\xc4\x4c\x27\x31\xff\x14\x61\xfe\x69\xc3\xfc\x5b\x86\xf9\x77\x04\xf3\x5f\x18\xbb\x46\x00\xbb\x46\x35\x76\xcd\x01\xec\x8c\x38\x76\x46\x0b\x36\x6f\x18\xbb\xb6\xb0\x6b\x4f\x63\x03\x61\xec\xba\x71\xec\x7a\x01\xec\x7a\x0d\xd8\xf5\x0b\xb0\xeb\xd7\x61\xd7\xef\xc1\xe6\xf7\x60\x37\x28\xc2\x6e\x30\x8d\xdd\xb0\x09\xbb\x51\x0c\x5b\x50\x88\x9d\x19\xc3\x6e\xdc\x80\xf5\xca\xb1\x2a\xc7\x9a\x62\xac\xcd\xc7\xda\x41\xac\x6b\xc7\xfa\x65\x58\x7f\x1c\xbb\x49\x07\x76\xd3\x22\xec\xa6\x5d\xd8\xcd\xaa\xb0\x9b\x65\xb0\x85\xf5\xd8\xc2\x29\xec\xe6\x3d\xd8\x2d\xf2\xb0\x5b\x24\xb0\x5b\xf4\x62\xb7\x04\x5b\x14\xc4\xce\x8a\x63\x67\xe5\xb0\x5b\x05\xb1\x5b\x35\x62\xb7\x8e\x61\x8b\xc1\x6e\xe3\x63\xb7\xc9\x61\xb7\xcd\x62\xb7\xcb\x62\x4b\xc6\xb0\x3b\xd4\x62\x77\x04\xbb\x63\x14\xbb\x63\x17\xb6\xb4\x06\xbb\x53\x1a\xbb\x73\x23\x76\x76\x35\x36\x18\xc0\x06\x47\xb1\xbb\xb4\x60\x77\x2d\xc5\xfe\x0f\x6c\x48\xd8\xd0\x34\x76\xb7\x0c\x76\x4e\x18\xbb\x7b\x08\xbb\xfb\x30\x36\xdc\x82\xdd\x23\x8a\xdd\x23\x8b\xdd\xb3\x07\xbb\x57\x2d\xb6\xac\x10\x5b\x36\x8a\xdd\xbb\x0b\xbb\x4f\x35\x76\x9f\x34\x76\xdf\x12\xec\xbe\xdd\xd8\x7d\x33\xd8\x48\x12\xbb\x5f\x08\xbb\x7f\x00\xbb\xff\x10\xf6\x80\x00\xf6\x80\x2e\x6c\x79\x0a\x7b\xa0\xb0\x07\xf6\x61\x0f\x6a\xc2\x1e\x1c\xc7\x46\xcb\xb1\x87\x14\x63\x0f\xc9\x61\x0f\x8d\x61\x0f\xed\xc6\x1e\x9a\xc5\x1e\xd6\x8d\xad\xa8\xc6\x56\x0c\x60\x8f\x00\x7b\x24\xd8\x58\x3b\xf6\xa8\x1a\xec\xd1\xc3\xd8\x78\x08\x1b\x9f\xc2\x1e\x9b\xc5\x1e\xd7\x86\x3d\x3e\x88\x3d\xbe\x1f\x5b\x19\xc1\x56\x8e\x62\x4f\x48\x62\x4f\x18\xc7\x9e\x58\x82\x3d\xb1\x13\x7b\x52\x12\x5b\x55\x80\xad\x1a\xc6\x9e\x3c\x8a\x3d\xa5\x17\x7b\xea\x08\xf6\xb4\x38\xf6\xf4\x30\xf6\xf4\x49\xec\x19\x3d\xd8\x9a\x06\xec\x99\x45\xd8\x33\xc7\xb1\x67\xf5\x62\xcf\xae\xc1\xd6\x06\xb0\xb5\x7d\xd8\x73\x3a\xb0\xe7\x86\xb1\xe7\xe6\xb0\xe7\xa5\xb0\x89\x28\x36\x31\x8d\x3d\xbf\x03\x7b\x41\x08\x7b\xc1\x10\xf6\xc2\x16\xec\x85\xe3\xd8\xba\x28\xb6\x2e\x8b\xbd\xa8\x09\x7b\x71\x3e\xf6\xe2\x1e\xec\x25\x3e\xf6\x92\x66\x6c\x7d\x00\x5b\xdf\x80\xbd\x34\x80\xbd\x34\x81\xbd\xac\x12\x7b\x79\x1c\x7b\xf9\x18\x36\x99\xc3\x5e\x91\xc1\x5e\xd9\x8a\x6d\x28\xc4\x5e\x1d\xc1\x5e\x53\x8a\xbd\xb6\x04\x7b\xed\x00\xb6\x71\x0c\x7b\x5d\x37\xf6\xfa\x1c\xf6\x86\x0e\x6c\x53\x0e\x7b\x63\x1b\xf6\xa6\x4a\xec\x4d\xcd\xd8\x9b\x0b\xb0\x37\x77\x62\x9b\xd3\xd8\x5b\x3a\xb1\xb7\x96\x62\x6f\x4d\x63\x6f\x6b\xc2\xb6\x34\x61\x6f\x6f\xc6\xde\x51\x8c\xbd\xd3\xc7\xb6\xe6\x63\xef\xca\xc7\xde\x2d\xec\xdd\x23\xd8\x7b\xfa\xb0\x6d\x8d\xd8\x7b\x0b\xb1\xf7\xf6\x63\xef\x8b\x63\xef\x6b\xc3\xde\x0f\xf6\xfe\x71\x6c\x7b\x2f\xf6\x81\x28\xf6\x81\x1e\xec\x83\xc5\xd8\x07\x87\xb0\x0f\xa5\xb1\x1d\x8d\xd8\x8e\x0c\xf6\x11\x61\x1f\xe9\xc6\x3e\x9a\xc6\x76\x26\xb1\x8f\xd5\x63\x1f\xef\xc1\x3e\xd1\x86\x7d\x62\x1a\xfb\x64\x1c\xfb\x54\x33\xf6\xe9\x24\x36\x15\xc5\x3e\x13\xc5\x3e\x9b\x87\x7d\x2e\x80\x7d\x6e\x0a\xdb\x3d\x81\x7d\x21\x80\x7d\xb1\x08\xfb\xe2\x04\xb6\x67\x0a\xfb\xd2\x24\xf6\xe5\x69\xec\x2b\xe3\xd8\xf4\x30\xf6\xd5\x2e\xec\x6b\xe5\xd8\xd7\x4b\xb1\xaf\x4f\x62\x7b\xd3\xd8\x37\xda\xb1\x6f\xd6\x63\xdf\xaa\xc1\xf6\xb5\x61\xdf\xae\xc1\xbe\x13\xc2\xbe\x2b\xec\xbb\x5d\xd8\xfe\x04\xb6\x3f\x83\x7d\xaf\x1e\xfb\xde\x28\xf6\xfd\x5a\xec\xfb\x3d\xd8\x0f\x1a\xb0\x03\xe5\xd8\x81\x11\xec\x87\x15\xd8\x0f\x7b\xb0\x1f\x45\xb0\x1f\x65\xb1\x1f\xc7\xb1\x83\xc2\x0e\x76\x62\x3f\x09\x61\x3f\x69\xc5\x7e\x5a\x80\xfd\xb4\x05\xfb\x59\x3e\xf6\xb3\x08\x76\x28\x8c\xfd\xdc\xc7\x7e\x3e\x86\xfd\x62\x18\xfb\x65\x31\xf6\xcb\x6a\xec\x97\x93\xd8\xe1\x26\xec\x57\x61\xec\xd7\x95\xd8\x6f\xc0\x7e\x33\x84\x1d\x69\xc2\x7e\x1b\xc2\x7e\xdb\x87\xfd\xae\x14\xfb\xdd\x14\xf6\xfb\x34\x76\x34\x82\x1d\xed\xc2\xfe\xd0\x88\xfd\xb1\x0a\xfb\x53\x1e\xf6\xa7\x34\x76\x2c\x86\x1d\x9b\xc6\xfe\xdc\x87\xfd\x25\x84\xfd\x65\x0c\xfb\x6b\x3b\x76\xbc\x18\x3b\xde\x83\xfd\xad\x0a\xfb\x5b\x17\xf6\x77\x61\x7f\xef\xc2\xfe\x91\x87\xfd\xa3\x0e\xfb\x47\x3f\x36\x53\x86\xcd\x74\x63\xe7\x16\x62\xe7\x56\x62\xe7\x8e\x60\xe7\x05\xb1\xf3\xba\xb0\xf3\x26\xb0\xf3\x7d\xec\xfc\x18\x76\x7e\x02\x9b\x8d\x60\xb3\x53\xd8\x05\x3d\xd8\x85\x95\xd8\x45\x95\xd8\x89\x30\x76\x62\x08\xbb\xb8\x1d\xbb\xa4\x16\xbb\x34\x88\x5d\x3a\x8e\x9d\xac\xc6\x4e\xe6\xb0\xcb\x3a\xb1\xcb\x4b\xb1\xcb\x47\xb0\x2b\xea\xb0\x2b\x72\xd8\x5c\x1c\x9b\xcb\x61\x57\xa6\xb1\xab\x6a\xb0\xab\xa6\xb1\xab\x7b\xb1\x53\x61\xec\xd4\x10\xf6\xcf\x36\xec\x9f\x43\xd8\xbf\x84\xfd\xab\x1d\xfb\x77\x01\xf6\xef\x7e\xec\x74\x05\x76\xba\x13\xfb\x4f\x18\xfb\x4f\x1f\xf6\xdf\x02\xec\xbf\x49\xec\xbf\x19\xec\x7f\x51\xec\x7f\xfd\x38\x4a\x71\x54\xe3\x18\xc0\xad\x21\xdc\x1a\xed\xb8\x35\xc6\x70\x6b\x56\xe2\xd6\x1c\xc0\xcd\x08\xe1\x66\xb4\xe0\x66\xf4\xe3\x66\x4c\xe3\xf2\x42\xb8\xbc\x3a\x5c\x5e\x0b\x2e\x6f\x1c\xb7\x56\x35\x6e\xad\x29\xdc\xda\x7d\xb8\x75\x42\xb8\x75\x9a\x70\x01\xe1\x02\x51\x5c\xa0\x13\xb7\x2e\xb8\x75\x87\x70\xeb\xf5\xe1\xd6\x9f\xc4\x6d\x90\x8f\xdb\xb0\x10\xb7\x51\x35\xae\xa0\x11\x37\xb3\x1b\xb7\x71\x10\xb7\xf1\x04\x4e\xe0\xd4\x8b\x33\x53\x38\x9b\xc4\xb9\x24\xce\x2f\xc0\xf9\x9d\xb8\x4d\xfe\xcf\x24\x6e\xd3\x2a\xdc\xa6\x93\xb8\xcd\x92\xb8\xc2\x42\xdc\xe6\xff\x67\x1c\xb7\xc5\x20\x6e\xcb\x04\x6e\xcb\x1c\xae\xa8\x0a\x57\xd4\x83\x9b\x55\x80\x9b\xd5\x8b\xdb\x2a\x81\xdb\xba\x00\xb7\x75\x3d\x6e\xeb\x1e\x5c\xf1\x30\x6e\x9b\x34\x6e\xdb\x2e\xdc\x76\x65\xb8\xed\x46\x71\x25\x71\xdc\xf6\xe0\xb6\xaf\xc0\x6d\x3f\x86\xdb\x21\x8a\xdb\xb1\x12\x57\x1a\xc1\xed\x94\x8f\xdb\xa9\x19\xb7\x73\x39\x6e\x76\x31\x6e\xf6\x28\x2e\xd8\x8e\xdb\x25\x0f\xb7\x4b\x3d\x6e\xd7\x7e\x5c\x08\xdc\x6e\x51\xdc\x9c\x7e\xdc\xee\x69\x5c\xb8\x0e\xb7\xc7\x10\x6e\xcf\x14\x6e\xaf\x72\x5c\x59\x1e\x6e\xef\x22\xdc\x3e\x15\xb8\x7d\x43\xb8\x48\x29\x6e\x3f\x1f\xb7\x7f\x04\xb7\x7f\x0e\x77\x40\x16\x57\x9e\xc1\x1d\x38\x8a\x3b\xa8\x07\x77\x70\x37\x2e\x9a\xc0\x1d\x12\xc3\x1d\x1a\xc5\x1d\x56\x80\x3b\x6c\x08\x57\xd1\x8d\x3b\xbc\x06\x77\x44\x05\xee\xc8\x00\xee\xc8\x56\x5c\x2c\x84\x3b\x2a\x86\x3b\xba\x08\x77\xf4\x18\xee\x98\x24\x2e\x5e\x8c\x8b\xa7\x70\xc7\x36\xe2\x8e\x2b\xc6\x1d\xd7\x8b\x3b\xbe\x02\x77\xfc\x08\xae\xb2\x1d\x77\x42\x15\xee\x84\x09\xdc\x89\x49\xdc\x49\x01\xdc\x49\x3d\xb8\xaa\x24\xee\x64\x1f\x77\x72\x17\xee\x94\x4a\xdc\xa9\xa5\xb8\x53\xdb\x70\xa7\xe6\x70\xd5\xed\xb8\xd3\xf2\x70\xa7\xf5\xe0\x4e\x2f\xc0\x9d\x9e\xc1\x9d\xd1\x8c\xab\x09\xe1\x6a\xc6\x71\x67\xb6\xe2\xce\x8a\xe2\xce\x9a\xc2\x9d\xdd\x88\xab\xcd\xc7\xd5\x26\x71\xe7\x14\xe1\xce\xe9\xc4\x9d\x1b\xc6\x9d\xdb\x8a\x3b\x4f\xb8\xf3\xd2\xb8\x44\x18\x97\x18\xc0\x9d\x5f\x82\x3b\x3f\x81\x3b\x7f\x04\x77\x41\x05\xee\x82\x7e\xdc\x85\x11\xdc\x85\xad\xb8\x3a\xe1\xea\xaa\x71\x75\x03\xb8\x8b\xaa\x71\x17\x8d\xe3\x2e\x0e\xe3\x2e\x1e\xc5\x5d\x52\x86\xbb\xa4\x0f\x77\xc9\x34\xae\xbe\x0a\x57\x3f\x84\xbb\x34\x82\xbb\xb4\x17\x77\x99\x70\x97\x35\xe3\x2e\x1b\xc7\x5d\x1e\xc3\x5d\x3e\x88\x4b\x46\x70\xc9\x14\xee\x8a\x02\xdc\x15\x4d\xb8\x2b\x86\x70\x57\xe6\xe3\xae\x4c\xe0\xae\x1c\xc6\x5d\x55\x8d\xbb\x6a\x00\xd7\x10\xc1\x35\xd4\xe3\x1a\x52\xb8\x86\x01\xdc\xd5\x15\xb8\xab\xfb\x70\xd7\x14\xe3\xae\x19\xc3\x5d\x5b\x86\xbb\xb6\x13\xd7\x18\xc5\x5d\x97\xc0\x5d\x37\x8c\xbb\xbe\x09\x77\x7d\x0e\x77\x43\x0b\xee\xc6\x12\xdc\x4d\xc5\xb8\x9b\x7a\x70\x37\xd7\xe2\x6e\x9e\xc6\xdd\x92\x8f\xbb\xb5\x08\x77\x6b\x0a\x77\x5b\x12\xd7\x12\xc4\xdd\x9e\x87\xbb\xbd\x05\x77\x87\x8f\xbb\x63\x02\x77\x67\x15\xae\xb5\x0e\x77\x57\x0f\xee\xee\x24\xee\x9e\x76\xdc\xbd\x05\xb8\xfb\xaa\x70\xf7\xd7\xe2\xda\x8b\x71\x0f\x34\xe2\x1e\xac\xc6\x3d\x38\x8e\x7b\x68\x0a\xf7\x70\x03\xee\x91\x26\xdc\xa3\xd5\xb8\xce\x4a\xdc\x63\x75\xb8\xc7\x03\xb8\xc7\x87\x71\x4f\x54\xe3\x9e\x18\xc7\x75\x25\x70\x5d\x39\xdc\x93\x3d\xb8\xa7\xba\x71\x4f\x57\xe0\x9e\xee\xc7\xa5\xaa\x71\xcf\xb4\xe3\x9e\xed\xc3\x3d\xd7\x8d\xeb\xae\xc0\x3d\x5f\x8a\x7b\x7e\x1a\xf7\xc2\x10\xee\xc5\x26\x5c\x4f\x23\xee\xa5\x10\xee\xa5\x5e\xdc\xcb\xf5\xb8\x57\xf2\x71\xaf\x74\xe0\xd2\xa5\xb8\x74\x2b\xee\xd5\x22\xdc\xab\x03\xb8\xd7\x6a\x70\xaf\x0b\xf7\x7a\x0b\xee\xf5\x09\x5c\x6f\x14\xd7\x9b\xc5\xbd\x11\xc6\xbd\xd1\x85\x7b\x23\x87\x7b\xb3\x11\xf7\xe6\x14\xee\xad\x2a\xdc\x5b\xa3\xb8\xbe\x00\xae\xaf\x1c\xd7\x57\x8f\xeb\x4b\xe1\xde\x2e\xc0\xbd\x3d\x8e\x7b\x27\x87\x7b\x77\x14\xd7\x3f\x86\x7b\x6f\x04\xf7\x7e\x1a\xf7\x41\x1e\xee\x83\x20\xee\x83\x46\xdc\x07\x19\xdc\x40\x29\x6e\xa0\x1b\xf7\x61\x09\xee\xc3\x76\xdc\x47\x59\xdc\xc7\xbd\xb8\xc1\x01\xdc\x27\xbd\xb8\x4f\xc7\x71\x9f\x4d\xe0\x86\xc6\x70\x9f\x8f\xe1\xbe\xc8\xe0\xbe\x1c\xc0\x0d\x77\xe3\xbe\xaa\xc5\x7d\x5d\x83\xfb\xa6\x04\x37\x52\x88\x1b\x19\xc2\x7d\x5b\x87\xfb\x2e\x84\xfb\xae\x1d\xf7\x7d\x3e\xee\xfb\x04\xee\xfb\x71\xdc\x68\x02\xf7\x43\x21\xee\x87\x6e\xdc\x8f\xc5\xb8\x1f\x33\xb8\x9f\xc2\xb8\x9f\xfa\x70\x63\x3e\x6e\xac\x06\x37\x36\x8c\xfb\xb9\x0c\xf7\xf3\x00\xee\x97\x08\xee\x97\x14\xee\xd7\x31\xdc\xf8\x10\xee\xb7\x6e\xdc\xef\x55\xb8\x3f\x7c\xdc\x1f\xbd\xb8\x4c\x10\x97\x49\xe1\xe6\x96\xe2\xe6\x8e\xe0\xe6\xf5\xe3\xe6\xb7\xe3\xb2\x55\xb8\x05\xc5\xb8\x85\xe5\xb8\x45\x09\xdc\x44\x3f\x6e\x71\x09\x6e\x49\x18\xb7\x34\x88\x9b\xac\xc0\x4d\xe6\x70\xcb\xaa\x70\xcb\xc6\x71\xcb\x63\xb8\xe5\x19\xdc\x8a\x28\x6e\xc5\x38\x6e\x25\xb8\x95\x0d\xb8\x55\x51\xdc\xaa\x14\x6e\x75\x10\xb7\xba\x03\x37\x55\x84\x9b\x1a\xc0\xfd\x59\x83\xfb\xab\x04\xf7\x77\x3e\xee\xef\x21\xdc\x74\x33\x6e\x3a\x8b\xfb\x37\x0f\xf7\x5f\x01\x3e\x65\xf8\x4c\xe3\xaf\x91\xc3\x5f\xb3\x13\x7f\x46\x08\x7f\xc6\x18\x7e\x5e\x1c\x3f\xaf\x1d\x3f\x6f\x1a\x7f\xad\x1c\xfe\xda\x29\xfc\x75\xd2\xf8\xeb\x8c\xe2\x07\x12\xf8\xeb\x82\xbf\x6e\x33\xfe\xba\x13\xf8\xeb\x65\xf0\xd7\x0f\xe3\xaf\xdf\x8b\x9f\x5f\x88\xbf\x41\x17\xfe\x46\x11\xfc\x82\x14\xfe\xcc\x14\xfe\xc6\x39\x7c\xaf\x0b\x5f\x49\x7c\x8d\xe2\x9b\x51\x7c\x5b\x8b\xef\x12\xf8\x2e\x8b\xef\xd7\xe1\x6f\x12\xc4\xdf\x24\x85\xbf\x69\x3f\xfe\x66\x59\xfc\xc2\x6e\xfc\xcd\x5b\xf0\xb7\x28\xc4\xdf\xa2\x07\x7f\xcb\x04\x7e\x91\x8f\x5f\xd4\x8c\x5f\xd4\x87\x3f\xab\x0a\x7f\xd6\x10\xfe\x56\x11\xfc\xad\x0b\xf0\xb7\x6e\xc3\x2f\x2e\xc3\xdf\x26\x1f\x7f\x9b\x26\xfc\x6d\x86\xf0\xb7\x8d\xe3\x6f\xdb\x8f\xbf\xdd\x00\x7e\x49\x05\x7e\xc9\x08\xfe\xf6\x69\xfc\x1d\x12\xf8\x3b\xc6\xf1\x77\xec\xc4\x2f\xad\xc0\xdf\xc9\xc7\xdf\x39\x0f\x7f\xe7\x7e\xfc\xd9\xb5\xf8\xc1\x7c\xfc\x60\x23\x7e\x70\x1a\x7f\x97\x72\xfc\x5d\xd2\xf8\xbb\x16\xe1\xef\x5a\x85\xff\xbf\x1c\xfe\x6e\x61\xfc\xdd\xb2\xf8\x73\xb2\xf8\xe1\x3c\xfc\x3d\xc2\xf8\x7b\x76\xe2\x97\x85\xf0\xf7\x2e\xc1\xdf\xa7\x18\x7f\x9f\x1e\xfc\x7d\x3b\xf0\x23\xe3\xf8\xfb\x4d\xe0\xef\x3f\x86\x5f\x0e\xfe\x81\x79\xf8\x07\x09\xff\xe0\x02\xfc\x68\x18\x3f\x3a\x81\x7f\x48\x2f\xfe\xa1\xa5\xf8\x87\x55\xe3\x57\x14\xe1\x57\xa4\xf0\x0f\xef\xc4\x3f\xa2\x15\xff\xc8\x56\xfc\x98\x8f\x7f\x54\x1e\xfe\x51\x39\xfc\xa3\x3b\xf0\x8f\x49\xe2\xc7\x1b\xf0\xe3\x7d\xf8\xc7\x76\xe2\x1f\xd7\x86\x7f\x7c\x23\x7e\x65\x33\x7e\x65\x06\xff\x84\x26\xfc\x13\xc1\x3f\xb1\x01\xff\xc4\x49\xfc\x93\x3a\xf1\xab\x22\xf8\x55\x29\xfc\x93\x63\xf8\x27\xa7\xf1\x4f\x69\xc6\x3f\xb5\x9c\xff\x8f\xc2\xf8\x8d\x8a\x68\x5a\x00\x28\xbe\x91\x27\x84\x10\xee\x39\xf7\xfc\x9f\x10\x42\x08\x21\x84\x10\x42\x08\x21\x84\x10\x42\x08\x21\x0c\x42\x08\x21\x84\x10\x42\x08\x21\x84\x10\x42\x18\x84\x10\x42\x08\x21\x0c\xc2\x20\xbc\xe5\xc3\x6f\xed\x1d\x1d\xda\x47\x54\x97\x47\x54\xd7\x46\x74\x58\x16\xd1\x61\x15\x44\x87\x8d\x12\x1d\x51\x44\x74\xc4\x1c\x51\x7d\x33\xd1\x91\x10\x1d\x59\x49\x74\x64\x3f\xd1\x51\x05\x44\x47\x4d\x13\x35\x34\x13\x1d\x03\xd1\xb1\xc5\x44\xc7\x2e\x10\x35\x36\x11\x1d\x5f\x4e\x74\x42\x17\xd1\x89\x73\x44\x4d\x69\xa2\x93\x07\x89\x9a\x23\xa2\x53\x1b\x88\x4e\x9b\x20\x6a\x69\x20\x3a\x63\x90\xe8\xcc\x7e\xa2\xb3\x72\x88\x5a\xb3\x89\xce\xae\x26\x3a\xa7\x8f\xe8\xdc\x24\x51\x72\x84\xe8\xbc\x29\xa2\xf3\x6b\x89\x2e\x18\x22\xba\xb0\x81\xe8\xa2\x59\xa2\x8b\x53\x44\xed\x53\x44\x97\x96\x10\x5d\xda\x45\x74\x59\x1d\x51\x47\x1d\xd1\xe5\x43\x44\x57\xa4\x89\x3a\x0b\x88\xae\xaa\x25\xba\x3a\x4d\xd4\x95\x43\x74\x6d\x2e\xd1\x75\x25\x44\xd7\x97\x12\x75\xb7\x12\x75\xcf\x13\xdd\xa8\x88\x6e\x52\x44\x3d\x15\x44\x37\xd7\x11\xdd\xd2\x45\xd4\x5b\x40\xd4\x3b\x43\x74\xdb\x0c\xd1\xed\x19\xa2\xbe\x42\xa2\x3b\xf3\x88\xee\xca\x25\xba\x3b\x8f\xa8\xbf\x94\xe8\x9e\x22\xa2\x7b\xff\x33\x4f\x34\xe0\x88\xee\x6f\x26\x7a\xa0\x9e\xe8\xc1\x56\xa2\xc1\x7a\xa2\x87\x46\x88\x1e\xee\x20\x7a\xa4\x99\x68\xa8\x93\xe8\xd1\x11\xa2\xc7\xf3\x88\x86\xf3\x89\x9e\x70\x44\x4f\xb6\x10\x3d\x55\x41\x34\xd2\x43\xf4\xf4\x3c\xd1\xb3\x79\x44\xa3\xf9\x44\xcf\x39\xa2\xe7\x15\xd1\x0b\x85\x44\x63\xc5\x44\x2f\x96\x10\xbd\x38\x4e\xf4\x52\x8a\xe8\xe5\x41\xa2\xf1\x66\xa2\x57\x3a\x89\x5e\xad\x27\x7a\xad\x97\x28\x95\x47\xf4\x7a\x19\xd1\x1b\x49\xa2\x89\x2c\xa2\x89\x29\xa2\xb7\x7a\x88\xde\x6e\x26\x7a\xa7\x8e\x68\xb2\x91\x68\x72\x9c\xe8\xdd\x09\xa2\xf7\x66\x89\xde\x1f\x20\x9a\x6a\x27\xfa\xa0\x89\xe8\xc3\x26\xa2\x8f\x1a\x88\xa6\xf3\x89\x3e\x2e\x25\xfa\x38\x43\xf4\xc9\x02\xd1\x4c\x11\xd1\xcc\x24\xd1\x67\x03\x44\x9f\x0f\x13\x7d\xd1\x4b\x34\xdb\x40\x34\x3b\x46\xf4\xe5\x30\xd1\x57\x3d\x44\x5f\xd7\x10\xcd\x15\x10\x7d\x53\x4a\xf4\x6d\x16\xd1\xb7\xa3\x44\xdf\x4d\x11\xcd\x4f\x10\xfd\x50\x40\xf4\x63\x09\x51\x3a\x87\xe8\xa7\xff\xcc\x11\xfd\x9c\x26\x5a\x28\x21\xfa\xb5\x91\xe8\xb7\x1c\xa2\xdf\x66\x89\x7e\x1f\x24\xca\xf4\x12\xfd\xd1\x4a\xf4\x67\x13\xd1\x5f\x6d\x44\x8b\x8e\xe8\xef\x1c\xa2\x7f\x22\xa2\x7f\xe6\x89\xfe\x6d\x41\x50\x8d\x58\xa2\x08\xb1\xc4\x2c\x62\xc9\x36\xc4\x52\x2d\x88\xa5\x52\x88\xac\x11\xc4\xd2\x2d\x88\xff\xb5\x20\x96\x29\x46\x2c\xb3\x88\x58\xb6\x18\xb1\x5c\x1e\x62\xf9\xff\x8c\x21\x72\xea\x11\x2b\x54\x20\x56\x2c\x44\xac\xb8\x80\x58\xa9\x15\x91\x5b\x85\x58\xb9\x10\xb1\x72\x06\xb1\x4a\x3b\x62\xd5\x62\xc4\xaa\xd3\x88\xbc\x1a\xc4\x6a\xc5\x88\xd5\x0b\x11\x6b\x54\x23\xa2\x2c\x44\x34\x8b\x10\x33\x08\x39\x8d\x50\x59\x08\x35\x81\xd0\x3d\x08\x53\x8b\xb0\x8d\x08\x57\x82\x70\x29\x84\x1f\x46\x84\x3e\x44\x62\x00\x91\x5f\x8e\x58\xb3\x0c\xb1\x16\x88\xb5\xe6\x11\x6b\xcf\x20\x0a\x06\x11\xeb\xb4\x23\xd6\x6d\x44\xac\x57\x88\x58\x6f\x08\x51\xd8\x89\x58\xbf\x15\xb1\x41\x03\x62\xc3\x72\x44\x51\x25\x62\xa3\x1c\xc4\x46\x53\x88\x8d\x7b\x11\x9b\xb4\x20\x8a\x4b\x10\x9b\x16\x23\x36\xcd\x20\x36\xeb\x41\x6c\x5e\x87\x28\xa9\x45\x6c\x51\x8f\xd8\xb2\x04\xb1\x65\x0a\xb1\x55\x12\x51\xda\x84\x28\x9d\x47\x6c\xdd\x8c\xd8\x3a\x83\xd8\x66\x10\xb1\x6d\x07\xa2\xac\x0b\xb1\x5d\x37\x62\xfb\x2e\xc4\x0e\x13\x88\xf2\x6e\xc4\x8e\xcd\x88\x9d\xf2\x11\x3b\x2d\x22\x76\x4e\x23\x2a\x3a\x10\x15\xf3\x88\x5d\xc6\x10\xbb\xb6\x23\x76\x6b\x46\xec\x36\x85\xa8\xac\x45\xec\x9e\x87\xd8\x7d\x12\xb1\x47\x3f\x62\xcf\x1e\x44\x55\x05\x62\xaf\x32\xc4\x5e\xc3\x88\xbd\xa7\x10\xfb\x0c\x21\xaa\x2b\x11\xfb\x36\x22\xf6\x9d\x42\xec\x37\x82\xd8\xbf\x13\x51\xd3\x84\x38\xa0\x13\x71\x60\x09\xe2\xa0\x62\x44\x6d\x05\xe2\xe0\x02\xc4\x21\x85\x88\x43\x73\x11\x87\xd6\x21\xea\x22\x44\xdd\x1c\xe2\xb0\x2e\xc4\xe1\xe5\x88\x23\x14\xe2\x88\x7e\x44\x7d\x3b\xa2\x3e\x8d\x38\x72\x1a\x71\x54\x3d\xe2\xa8\x39\xc4\xd1\x73\x88\x86\x1e\xc4\x31\xed\x88\x63\x15\xe2\xd8\x34\xe2\xb8\x6e\xc4\x71\x8b\x88\xc6\x34\xe2\xf8\x34\xe2\x84\x72\xc4\x09\xf3\x88\x13\x53\x88\xa6\x36\xc4\x49\x2d\x88\x93\xf3\x11\xa7\x28\xc4\x29\x29\x44\x73\x23\xe2\xd4\x62\xc4\xa9\xf3\x88\xd3\x86\x10\xa7\x37\x21\x4e\x4f\x23\xce\x28\x46\x9c\x91\x41\x9c\x59\x8f\x38\x2b\x07\x71\x56\x13\xa2\x35\x1b\xd1\xda\x85\x38\xdb\x21\xce\xee\x47\x9c\x13\x21\xce\x99\x46\x9c\xdb\x8d\x48\xd6\x20\xce\x2b\x46\x9c\xd7\x83\x38\xbf\x18\x71\x7e\x1a\x71\x41\x2b\xa2\x0d\x44\x5b\x3b\xe2\xc2\x3a\xc4\x85\x19\xc4\x45\x83\x88\x8b\x4b\x10\x17\xf7\x22\xda\x4b\x11\xed\x69\xc4\x25\x83\x88\x4b\x8b\x11\x97\x4e\x20\x2e\x6b\x46\x74\xe4\x20\x3a\x26\x11\x97\x37\x22\xae\xc8\x42\x5c\x51\x85\xb8\x32\x0f\x71\x65\x0a\xd1\x59\x8f\xb8\xaa\x1c\x71\xd5\x0c\xe2\xea\x21\xc4\x35\x1d\x88\x2e\x85\xe8\xea\x42\x5c\xab\x10\xd7\xf6\x22\xae\xcb\x47\x5c\x37\x8f\xb8\x7e\x04\xd1\x5d\x83\xb8\xa1\x0a\x71\x63\x16\xe2\xc6\x05\xc4\x4d\xbd\x88\x9e\x72\xc4\xcd\xb9\x88\x9b\x5b\x10\xb7\x34\x23\x6e\xcd\x47\xdc\x3a\x81\xe8\xcd\x47\xf4\x76\x22\x6e\xab\x47\xdc\x9e\x8f\xb8\x7d\x0c\x71\x47\x03\xe2\x8e\x34\xa2\xaf\x1b\x71\x67\x16\xe2\xce\x61\xc4\x5d\x4d\x88\xbb\x06\x11\x77\x67\x21\xee\xee\x46\xf4\x37\x22\xfa\x17\x10\xf7\xa4\x10\xf7\xb6\x20\xee\x9d\x43\xdc\x57\x8d\x18\x00\x31\xd0\x8e\xb8\x5f\x21\xee\x9f\x42\x3c\x90\x44\x3c\x30\x85\x78\xb0\x15\xf1\x60\x06\x31\x38\x87\x78\xa8\x0b\xf1\x70\x3e\xe2\xe1\x21\xc4\x23\x39\x88\x47\xfa\x10\x8f\xcc\x22\x86\x7a\x11\x8f\x16\x23\x1e\x9d\x44\x3c\xd6\x88\x78\x3c\x17\xf1\xf8\x18\x62\xb8\x19\xf1\x44\x1e\xe2\x89\x4e\xc4\x93\x0a\xf1\x64\x0f\xe2\xa9\x08\xf1\x54\x03\xe2\xa9\x29\xc4\x48\x09\x62\xa4\x07\x31\x32\x87\x78\xba\x0e\xf1\xf4\x38\xe2\x99\x1a\xc4\xb3\x59\x88\x67\x9b\x10\xa3\xa5\x88\xd1\x31\xc4\x73\xbd\x88\xe7\xab\x11\x2f\x64\x21\x5e\xe8\x44\x8c\xe5\x23\xc6\x3a\x11\x2f\x66\x21\x5e\x1c\x43\xbc\x54\x8d\x78\x29\x83\x78\xb9\x19\x31\x9e\x83\x18\xef\x43\xbc\xd2\x83\x78\xd5\x21\x5e\x1d\x46\xbc\x56\x8d\x78\xad\x1f\x91\x2a\x43\xa4\x66\x11\xaf\x57\x21\x5e\xef\x41\xbc\x51\x84\x78\x23\x85\x78\xb3\x19\x31\x91\x83\x98\x98\x41\xbc\x55\x8f\x78\xab\x17\xf1\x76\x2e\xe2\xed\x61\xc4\x3b\x45\x88\x77\xba\x10\x93\xb9\x88\xc9\x16\xc4\xe4\x04\xe2\xdd\x3a\xc4\xbb\xd3\x88\xf7\x7a\x10\xef\x65\x10\xef\x77\x22\xa6\x4a\x10\x53\x7d\x88\xa9\x19\xc4\x07\x95\x88\x0f\xa6\x11\x1f\xb6\x21\x3e\xca\x45\x7c\x34\x8c\x98\xce\x43\x4c\x77\x23\x3e\x8e\x10\x1f\xa7\x10\x9f\x14\x23\x3e\xe9\x42\x7c\x5a\x88\xf8\xb4\x1f\x31\x53\x8d\x98\xe9\x43\x7c\x96\x8f\xf8\x6c\x18\xf1\x79\x01\xe2\xf3\x39\xc4\x17\x45\x88\x2f\x06\x11\xb3\x25\x88\xd9\x26\xc4\xec\x18\xe2\xcb\x22\xc4\x97\x5d\x88\x2f\x27\x11\x5f\x55\x22\xbe\x1a\x45\x7c\x5d\x8d\xf8\xba\x17\xf1\xf5\x22\x62\xae\x1e\x31\x37\x8a\xf8\xa6\x10\xf1\xcd\x08\xe2\xdb\x7a\xc4\xb7\x0b\x88\xef\x4a\x11\xdf\x4d\x22\xe6\x2b\x11\xf3\x29\xc4\xf7\xd5\x88\xef\x27\x11\x3f\x54\x20\x7e\xe8\x41\xfc\x98\x8b\xf8\xb1\x1d\xf1\xe3\x14\x22\x5d\x86\x48\xb7\x22\xd2\xf3\x88\x9f\x1a\x11\x3f\x2d\x20\x7e\x6e\x46\xfc\x02\xe2\x97\x16\xc4\x02\x88\x85\x0e\xc4\xaf\x39\x88\x5f\xeb\x10\xbf\x81\xf8\xad\x06\xf1\x5b\x3f\xe2\xf7\x02\xc4\xef\x7d\x88\x4c\x09\x22\xd3\x8b\xf8\x23\x42\xfc\xd1\x89\xf8\x13\xc4\x9f\xb5\x88\x3f\x7b\x10\x7f\xa6\x11\x7f\x15\x22\xfe\x6a\x45\xfc\x35\x8f\x58\xac\x42\x2c\x8e\x22\xfe\xee\x42\xfc\x3d\x85\xf8\xa7\x00\xf1\x4f\x1b\xe2\xdf\x08\xf1\x6f\x12\xf1\x6f\x1a\xb9\x84\x43\x2e\x59\x8d\x5c\xaa\x1b\x99\xd5\x8a\x5c\xba\x0d\xf9\xbf\x2c\xe4\xff\x7a\x91\xcb\x34\x22\xb3\xeb\x90\xcb\x66\x21\x97\x9d\x46\x2e\xd7\x8f\x5c\xbe\x08\x99\xa3\x90\x2b\xe4\x20\x57\xcc\x45\xae\x38\x82\x5c\xa9\x15\x99\x5b\x84\xcc\xed\x41\xae\x5c\x8c\x5c\x79\x00\xb9\x4a\x29\x72\x95\x41\xe4\xaa\xb9\xc8\x55\x5b\x90\x79\x05\xc8\xbc\x61\xe4\x6a\xdd\xc8\xd5\xb3\x91\xab\xd7\x22\xd7\x68\x40\xae\x31\x83\x8c\x1a\x90\xd1\x14\x52\x8c\x21\x65\x25\x52\x0e\x23\x63\x87\x8c\x1b\x91\xf1\x3c\x52\x0d\x21\x75\x0d\xd2\x14\x23\xcd\x34\xd2\x26\x91\xae\x0c\xe9\xa6\x91\xbe\x11\xe9\x33\xc8\x44\x11\x32\xbf\x03\xb9\x66\x29\x72\xcd\x01\xe4\x5a\x35\xc8\xb5\x66\x91\x6b\x97\x21\x0b\x66\x90\xeb\x66\x21\xd7\xcb\x45\xae\x37\x82\x2c\x1c\x47\xae\xdf\x81\xdc\x20\x89\xdc\x20\x8d\xdc\x70\x08\x59\xd4\x84\xdc\xa8\x0c\xb9\xd1\x10\x72\x63\x87\xdc\xb8\x07\xb9\xc9\x18\xb2\xb8\x0a\x59\x3c\x8c\xdc\xb4\x13\xb9\x59\x01\x72\xb3\x49\xe4\xe6\x25\xc8\xcd\x07\x90\x25\x65\xc8\x92\x4e\x64\xc9\x1c\x72\x8b\x46\xe4\x16\x73\xc8\x2d\x4b\x91\x5b\xf6\x22\xb7\xca\x41\x96\x66\x21\x4b\x7b\x90\x5b\x67\x23\xb7\xee\x47\x6e\x53\x81\xdc\x26\x85\xdc\xd6\x21\xb7\x1d\x47\x96\xe5\x22\xcb\xc6\x91\xdb\xcd\x21\xb7\x5f\x44\x96\x17\x21\xcb\xeb\x91\xe5\x73\xc8\x9d\x9a\x91\x3b\x97\x20\x77\x9e\x46\xee\x92\x8b\xdc\xa5\x1f\xb9\x6b\x1a\xb9\x5b\x15\x72\xb7\x19\x64\x65\x03\x72\xf7\x7a\xe4\x1e\x25\xc8\x3d\xa6\x91\x55\x0e\x59\xd5\x8f\xdc\xab\x0a\xb9\x77\x07\x72\x9f\x0e\x64\x75\x1e\xb2\xba\x0b\xb9\xef\x0c\x72\xbf\x02\xe4\x7e\x53\xc8\xfd\xab\x90\x35\x39\xc8\x9a\x1a\xe4\x01\x11\xf2\x80\x09\xe4\x81\x95\xc8\x03\x7b\x91\x07\xce\x21\x0f\xca\x47\xd6\x46\xc8\xda\x41\xe4\xc1\x11\xf2\xe0\x14\xf2\xd0\x12\x64\x5d\x12\x79\xd8\x04\xf2\x88\x52\x64\x7d\x3b\xf2\xa8\x52\xe4\xd1\xf9\xc8\x86\x0a\xe4\x31\x6d\xc8\x63\x3b\x91\xc7\x4d\x22\x1b\x67\x91\xc7\xcf\x23\x4f\xc8\x20\x4f\x5c\x44\x9e\xd4\x8b\x3c\x79\x1a\xd9\x5c\x8f\x3c\xb5\x19\x79\xda\x28\xf2\xf4\x09\xe4\x19\xf9\xc8\x33\x4b\x91\x67\x39\x64\x6b\x2e\xf2\xec\x1c\xe4\xd9\xb3\xc8\x73\xa6\x91\xe7\xf6\x22\x93\x45\xc8\xf3\x0a\x90\xe7\xd7\x20\x2f\xa8\x45\xb6\x95\x23\xdb\x06\x90\x17\x16\x22\x2f\x4c\x23\x2f\xce\x46\x5e\x3c\x8b\x6c\x1f\x44\x5e\xd2\x81\xbc\xb4\x1e\x79\x59\x39\xb2\xc3\x21\x2f\x07\x79\x79\x1a\x79\xc5\x02\xf2\xca\x51\x64\x67\x0f\xf2\xaa\x26\xe4\xd5\x05\xc8\xab\xbb\x90\x57\xa7\x90\xd7\x34\x23\xbb\x1a\x90\x5d\x5d\xc8\x6b\x2b\x91\xd7\x45\xc8\xeb\x66\x91\xd7\x0f\x23\xbb\x3b\x91\x37\xd4\x20\x6f\x48\x21\x6f\x1c\x46\xde\xd4\x8e\xec\x49\x22\x6f\x2e\x43\xde\xdc\x8f\xbc\xa5\x0b\x79\x6b\x25\xf2\xd6\x45\x64\xef\x3c\xf2\xb6\x42\xe4\xed\x59\xc8\xdb\x67\x91\x7d\xb9\xc8\xbe\x71\xe4\x9d\xdd\xc8\xbb\xca\x90\x77\x67\x21\xef\xce\x20\xfb\x07\x91\xf7\xe4\x21\xef\xe9\x43\xde\x5b\x89\xbc\x77\x01\x79\xdf\x30\x72\x60\x18\x79\x7f\x25\xf2\xfe\x39\xe4\x03\x93\xc8\x07\x27\x91\x83\x95\xc8\x87\x8a\x91\x0f\xcd\x23\x1f\xae\x40\x3e\x3c\x87\x7c\xa4\x05\x39\x94\x8d\x1c\xea\x41\x3e\x5a\x80\x7c\x74\x0e\xf9\x58\x12\xf9\x78\x29\xf2\xf1\x71\xe4\x70\x3f\xf2\x89\x6a\xe4\x13\x0b\xc8\x27\x53\xc8\xa7\x1a\x91\x23\x75\xc8\xa7\xf3\x90\x4f\xcf\x23\x9f\x19\x45\x3e\x5b\x81\x7c\x76\x1a\x39\xda\x82\x1c\x1d\x47\x3e\xd7\x8a\x7c\x3e\x17\xf9\x7c\x0b\xf2\x85\x2e\xe4\x58\x35\x72\x2c\x85\x7c\xb1\x13\xf9\x52\x2e\xf2\xa5\x41\xe4\xcb\xf5\xc8\x97\xe7\x90\xe3\x6d\xc8\x57\x40\xbe\x32\x88\x7c\x55\x21\x5f\x6d\x43\xbe\x56\x80\x7c\x6d\x08\x99\xca\x46\xa6\x3a\x90\xaf\x97\x20\x5f\x9f\x42\xbe\x91\x8f\x7c\x63\x00\xf9\x66\x1e\xf2\xcd\x14\x72\xa2\x05\xf9\x56\x21\xf2\xad\x49\xe4\xdb\xb5\xc8\xb7\x33\xc8\x77\x3a\x90\x93\x59\xc8\xc9\x21\xe4\xbb\x0e\xf9\x6e\x13\xf2\xdd\x49\xe4\x7b\xcd\xc8\xf7\x0b\x91\xef\x77\x22\xa7\xb2\x91\x53\xf5\xc8\xa9\x39\xe4\x07\x2d\xc8\x0f\xe6\x90\x1f\xf6\x23\x3f\xcc\x20\x3f\x4a\x22\xa7\xf3\x90\xd3\x35\xc8\xe9\x71\xe4\xc7\x15\xc8\x8f\x07\x91\x9f\x94\x23\x3f\xe9\x47\x7e\x9a\x8f\xfc\xb4\x13\xf9\xe9\x02\x72\xa6\x14\x39\x33\x8c\xfc\xac\x04\xf9\x59\x1b\xf2\xb3\x05\xe4\x17\x25\xc8\x59\x87\x9c\x4d\x23\xbf\x4c\x23\xbf\xca\x20\xbf\x2e\x42\x7e\x9d\x41\x7e\x93\x85\xfc\x16\xe4\xb7\x49\xe4\x77\x55\xc8\xf9\x0a\xe4\xf7\x11\xf2\xfb\x51\xe4\x0f\x43\xc8\x1f\x07\x91\xe9\x3c\x64\x7a\x02\xf9\x53\x0f\xf2\xe7\x24\xf2\x97\x7c\xe4\x2f\x03\xc8\x85\x06\xe4\xc2\x3c\xf2\xd7\x16\xe4\x6f\x59\xc8\xdf\x92\xc8\xdf\x0b\x91\xbf\x8f\x21\x33\x25\xc8\x4c\x1b\x32\x33\x8f\xfc\xa3\x0a\xf9\xc7\x34\xf2\xcf\x12\xe4\x9f\x43\xc8\xbf\x4a\x90\x7f\x2d\x22\x17\xbb\x90\x7f\xe7\x22\xff\xae\x45\xfe\x3d\x80\xfc\xa7\x14\xf9\xcf\x00\xf2\xdf\x7c\xe4\xbf\xdd\xc8\x7f\x17\x89\xa9\x24\xa6\x8f\x78\x89\x1c\xe2\x25\x5a\x89\x97\x18\x23\x5e\xb2\x9f\x78\xa9\x16\xe2\xac\x1a\xe2\xa5\x73\x88\x97\x6e\x21\xfe\x5f\x23\xf1\x32\xb9\xc4\xcb\x34\x13\x2f\x93\x22\xce\xee\x22\x5e\xb6\x89\x78\xd9\x29\xe2\xe5\x26\x89\x73\x22\xe2\x15\x5a\x89\x57\x4c\x12\xaf\x34\x4a\x9c\x0b\x71\x6e\x0d\x71\xee\x20\xf1\xca\x55\xc4\x2b\xcf\x12\xaf\x32\x43\xbc\x6a\x1e\xf1\xaa\x93\xc4\x79\xbd\xc4\xab\xe5\x10\xaf\x36\x43\xbc\x7a\x2d\xf1\x1a\x8a\x78\x8d\x7e\xe2\xa8\x94\x38\xea\x21\x16\x45\xc4\xa2\x99\x58\x8c\x13\xcb\x32\xe2\x58\x11\xab\x1c\x62\x9d\x43\x6c\x0a\x89\x4d\x3f\xb1\x99\x21\xb6\x75\xc4\xae\x8c\xd8\xf5\x11\xfb\x32\x62\x3f\x4c\x1c\xea\x89\x43\x9a\x38\x51\x4a\x9c\xdf\x4c\xbc\x66\x0d\xf1\x5a\x8a\x78\xad\x01\xe2\xb5\x6b\x88\xd7\x4e\x11\x17\x14\x11\x17\xcc\x13\xaf\x53\x4b\xbc\xce\x04\xf1\xba\xe5\xc4\xeb\x76\x11\xaf\x3b\x4b\xbc\xde\x10\x71\x61\x35\x71\xe1\x1c\xf1\xfa\x2d\xc4\xeb\x2f\x10\x6f\x50\x4b\xbc\x41\x9a\xb8\x68\x91\x78\xa3\x76\xe2\x8d\x47\x88\x8b\xb3\x89\x8b\x17\x89\x37\xab\x20\xde\xbc\x95\xb8\x64\x80\x78\x8b\x88\x78\xcb\x3c\xe2\xad\x22\xe2\xd2\x3c\xe2\xad\xb3\x89\xb7\xc9\x22\xde\x66\x81\x78\xdb\x39\xe2\xb2\x45\xe2\xed\xf3\x89\x77\xc8\x23\xde\x61\x91\x78\xc7\x3c\xe2\x1d\x33\xc4\x3b\x43\xbc\x73\x9a\xb8\x62\x84\x78\x97\x76\xe2\x5d\x9b\x88\x77\x6b\x26\xae\x1c\x20\xde\x3d\x49\xbc\x47\x01\xf1\x9e\x59\xc4\x7b\x76\x12\x57\x95\x10\xef\xd5\x40\xbc\x77\x29\xf1\x3e\x55\xc4\xd5\x95\xc4\xfb\x56\x10\xef\x97\x4b\xbc\x7f\x2e\x71\x4d\x1e\x71\xcd\x28\xf1\x01\x63\xc4\x07\xf6\x11\x1f\xd4\x47\x5c\xdb\x47\x7c\x70\x39\xf1\x21\xa5\xc4\x87\x3a\xe2\xba\x12\xe2\xc3\x8a\x89\x0f\xcf\x27\x3e\x7c\x8e\xf8\x88\x11\xe2\xfa\x56\xe2\x23\x0b\x89\x8f\x5c\x20\x3e\xaa\x87\xf8\xe8\x26\xe2\x86\x2a\xe2\x63\x6a\x88\x8f\xcd\x22\x3e\x76\x86\xf8\xb8\x36\xe2\xc6\x56\xe2\xe3\xab\x88\x4f\xc8\x26\x3e\xa1\x93\xf8\xc4\x3c\xe2\x13\xbb\x89\x9b\x2a\x89\x4f\x52\xc4\x27\x4d\x13\x9f\x3c\x40\x7c\x4a\x39\xf1\x29\x93\xc4\xcd\x49\xe2\x53\x1d\xf1\xa9\xbd\xc4\xa7\xd5\x12\x9f\x5e\x44\x7c\xfa\x34\x71\x4b\x23\x71\xcb\x22\xf1\x19\x83\xc4\x67\x56\x12\x9f\x39\x47\x7c\x56\x37\x71\x6b\x39\x71\xeb\x2c\xf1\xd9\xd5\xc4\x67\xcf\x12\x9f\xd3\x41\x7c\x6e\x3e\xf1\xb9\x29\xe2\x64\x3f\xf1\x79\x25\xc4\xe7\x0d\x12\x9f\xdf\x40\x7c\x41\x2e\xf1\x05\xa3\xc4\x6d\x75\xc4\x6d\xf3\xc4\x17\x56\x13\x5f\x38\x42\x7c\x51\x16\xf1\x45\x55\xc4\x17\xcd\x11\x5f\xdc\x44\x7c\xf1\x30\x71\x7b\x21\x71\x7b\x2f\x71\xfb\x3c\xf1\x25\x8d\xc4\x97\x64\x88\x2f\xad\x25\xbe\x74\x86\xf8\xb2\x52\xe2\xcb\x66\x88\x3b\x9a\x89\x3b\x26\x89\x2f\x6f\x24\xbe\x02\xe2\x2b\x5a\x89\xaf\xcc\x21\xbe\xb2\x8b\xb8\x13\xe2\xce\x24\x71\xe7\x0c\xf1\x55\x8a\xf8\xaa\x6a\xe2\xab\x46\x89\xaf\x2e\x23\xbe\xba\x8f\xf8\x9a\x5a\xe2\x2e\x88\xbb\x3a\x88\xaf\x8d\x88\xaf\x6d\x20\xbe\x76\x94\xf8\xba\x6e\xe2\xeb\xb3\x88\xbb\x1d\x71\x77\x3f\xf1\x0d\x8a\xf8\xc6\x22\xe2\x9b\x1a\x89\x7b\x3a\x89\x6f\x29\x24\xbe\x65\x92\xb8\xb7\x90\xf8\xb6\x3c\xe2\xdb\x73\x89\x6f\xef\x27\xbe\xa3\x86\xf8\x8e\x49\xe2\xbe\x26\xe2\xbe\x09\xe2\x3b\x6b\x88\xef\xca\x21\xbe\xab\x83\xf8\xee\x46\xe2\xbb\xa7\x88\xfb\x7b\x88\xef\x29\x26\xbe\xa7\x9b\xf8\xde\x6c\xe2\x7b\x0b\x89\xef\x1d\x21\xbe\x77\x86\xf8\xbe\x2c\xe2\xfb\xc6\x89\xef\x77\xc4\xf7\x37\x11\x3f\xd0\x4d\xfc\x60\x05\xf1\x83\x73\xc4\x83\x9d\xc4\x0f\x35\x11\x3f\x94\x26\x7e\xb8\x92\xf8\xe1\x61\xe2\x47\x22\xe2\x47\x06\x88\x87\x8a\x89\x1f\xcd\x21\x7e\x34\x45\xfc\x58\x2e\xf1\x63\x15\xc4\x8f\xfd\xf7\x69\xe2\xc7\xf3\x88\x87\xdb\x88\x9f\x84\xf8\xc9\x79\xe2\x91\x7c\xe2\x91\x79\xe2\xa7\xcb\x88\x9f\xc9\x25\x7e\x26\x45\xfc\x6c\x13\xf1\xb3\x13\xc4\xa3\xc5\xc4\xa3\x0b\xc4\xcf\x0d\x10\x3f\x5f\x44\xfc\x7c\x2f\xf1\x0b\x49\xe2\x17\x1b\x89\x5f\x1a\x22\x7e\xb9\x93\x78\x7c\x84\xf8\x95\x62\xe2\x57\xff\x33\x43\xfc\x5a\x86\xf8\xf5\x62\xe2\x37\x4a\x89\xdf\xe8\x20\x7e\x13\xe2\x37\xbb\x89\x27\x20\x9e\xa8\x23\x7e\x2b\x9f\xf8\xed\x42\xe2\x77\x22\xe2\x49\x88\x27\xfb\x88\xdf\xcd\x22\x7e\x77\x94\xf8\xdd\x79\xe2\xf7\xb3\x89\xdf\x6f\x26\x9e\x2a\x26\x9e\x1a\x21\xfe\xa0\x80\xf8\x83\x34\xf1\x87\x83\xc4\x1f\x35\x10\x7f\x34\x41\x3c\xdd\x42\x3c\x9d\x26\xfe\xb8\x9b\xf8\x93\x22\xe2\x4f\xfe\x6b\x86\xf8\xd3\x16\xe2\x4f\xa7\x88\x67\x14\xf1\x4c\x3b\xf1\xcc\x30\xf1\xcc\x24\xf1\xe7\x29\xe2\xd9\x12\xe2\x2f\x5b\x88\xbf\x2e\x25\xfe\x26\x8b\xf8\xdb\x56\xe2\xef\x52\xc4\xf3\x0d\xc4\xdf\xb7\x10\xff\x50\x4b\xfc\xe3\x10\xf1\x4f\x59\xc4\x3f\x4d\x13\xff\x3c\x49\xfc\x4b\x8a\x78\xa1\x85\xf8\xd7\x26\xe2\xdf\x3a\x88\x7f\x2f\x26\xce\x24\x89\xff\x18\x24\xfe\xb3\x91\xf8\xaf\x32\xe2\xc5\x26\xe2\xc5\x11\xe2\xbf\xc7\x89\xff\x19\x23\xfe\x77\x04\x45\x35\x6a\x89\x7a\xd4\x92\x0d\xa8\xa5\x3a\x51\x59\x35\xa8\xa5\xeb\x50\x4b\xa7\x51\xcb\x54\xa0\xb2\x5b\x50\xcb\x16\xa2\x96\x9d\x41\x2d\x9f\x8d\xca\xc9\x41\xad\x50\x8d\x5a\xf1\x3f\xb3\xa8\x95\x8a\x50\x2b\x75\xa3\x72\x07\x50\x2b\x67\xa3\x56\x9e\x42\xad\x9a\x8d\xca\x53\xa8\xbc\x51\xd4\xea\xf9\xa8\xd5\xa7\x51\x6b\x54\xa0\xa2\x56\x54\x34\x82\x12\x59\x28\x99\x8d\x92\x1d\xa8\x58\xa1\x54\x05\x4a\x83\xd2\xfd\x28\xd3\x85\xb2\x79\x28\xdb\x83\x72\x75\x28\x5f\x8b\xf2\x5d\x28\x3f\x8b\x0a\xc5\xa8\x90\x44\x25\x8a\x50\x89\x61\x54\x7e\x39\x2a\x7f\x1e\xb5\x66\x2d\x6a\xad\x16\xd4\xda\x25\xa8\x82\x2a\xd4\x3a\x11\x6a\x9d\x56\xd4\x3a\x69\xd4\xba\x1d\xa8\xf5\x2a\x50\xeb\xfd\xd7\x05\x54\x61\x27\x6a\xfd\x5e\xd4\x06\xb9\xa8\x0d\x41\x15\xfd\x27\x8d\xda\xa8\x1f\xb5\x71\x23\x6a\x93\x52\xd4\x26\x63\xa8\xe2\x06\x54\xf1\x14\x6a\xd3\x2e\xd4\x66\xed\xa8\xcd\xeb\x51\x25\x0e\x55\x92\x41\x6d\x51\x89\xda\xb2\x18\xb5\xe5\x0c\x6a\xab\x69\x54\x69\x0a\xb5\x75\x0f\x6a\x9b\x0e\xd4\xb6\x49\x54\x59\x01\xaa\xac\x15\xb5\x5d\x84\xda\xde\xa1\xb6\x9f\x40\xed\x50\x86\xda\xa1\x03\x55\xde\x81\xda\xb1\x15\xb5\x53\x39\x6a\xa7\x5e\xd4\xce\xb9\xa8\x9d\x67\x50\x15\x23\xa8\x5d\xea\x50\xbb\x8c\xa2\x76\xad\x40\xed\x9a\x41\xed\xd6\x8d\xaa\xac\x46\x55\x2e\xa2\x76\xaf\x43\xed\x3e\x86\xda\xa3\x15\xb5\xc7\x18\x6a\xcf\x1a\xd4\x9e\x69\x54\x55\x11\xaa\x6a\x1c\xb5\x57\x07\x6a\x6f\x87\xda\x7b\x02\xb5\x4f\x1d\x6a\x9f\x09\x54\xf5\x20\x6a\xdf\x7c\xd4\xbe\x2d\xa8\x7d\x67\x50\xfb\xd5\xa3\xf6\x1b\x47\xed\x5f\x8d\xda\x7f\x1a\x55\x53\x8b\xaa\xe9\x46\x1d\x50\x88\x3a\x20\x89\x3a\x60\x14\x75\x60\x39\xea\xc0\x31\xd4\x41\x0e\x75\x50\x2d\xea\xa0\x31\x54\x6d\x09\xaa\xb6\x0f\x75\x70\x16\xea\xe0\x72\xd4\xc1\x6d\xa8\x83\xe7\x50\x87\xe4\xa0\x0e\xe9\x45\x1d\x5a\x85\x3a\x74\x02\x55\x57\x82\xaa\x9b\x44\x1d\x56\x8d\x3a\x6c\x14\x75\x78\x3e\xea\xf0\x71\xd4\x11\x85\xa8\x23\xfa\x50\x47\x4c\xa3\xea\xf3\x50\xf5\x65\xa8\x23\xcb\x51\x47\x65\xa3\x8e\x1a\x45\x1d\xdd\x80\x6a\xa8\x40\x1d\x03\xea\x98\x59\xd4\xb1\xf5\xa8\xe3\x72\x51\xc7\xf5\xa3\x8e\x9b\x43\x35\x76\xa2\x8e\xcf\x43\x1d\x9f\x42\x9d\xd0\x82\x3a\x31\x1f\x75\xe2\x38\xaa\xa9\x05\x75\x12\xa8\x93\xda\x51\x27\xd7\xa3\x4e\x71\xa8\xe6\x5c\x54\xf3\x02\xea\xd4\x0e\xd4\xa9\x0b\xa8\xd3\xdb\x51\x2d\x5d\xa8\x33\xf2\x51\x67\x66\xa1\xce\xaa\x40\xb5\x4e\xa3\xce\xa9\x44\x9d\x9b\x44\x25\xc7\x50\xe7\xcd\xa2\xce\x9f\x43\xb5\x15\xa2\x2e\xcc\x43\x5d\x14\xa1\x2e\x4a\xa3\x2e\x9e\x43\xb5\x0f\xa3\x2e\x69\x44\x5d\xda\x86\xba\x74\x1e\x75\x59\x1a\x75\x79\x36\xea\x8a\x6c\xd4\x95\x8d\xa8\x4e\x87\xba\x2a\x0f\x75\x55\x2d\xea\xea\x6c\xd4\xd5\x73\xa8\x6b\xe6\x50\x5d\x83\xa8\x6b\xa7\x51\xd7\xa5\x51\xd7\x0f\xa1\xba\x2b\x51\x37\x94\xa2\x6e\x58\x44\xdd\x38\x8f\xba\xa9\x11\xd5\x93\x85\xea\xe9\x40\xdd\x5c\x86\xba\x79\x1a\x75\x4b\x1b\xea\xd6\x08\x75\x6b\x07\xaa\xb7\x06\x75\x5b\x13\xea\xf6\x26\xd4\x1d\x63\xa8\xbe\x59\xd4\x9d\xf9\xa8\x3b\x7b\x51\x77\xb5\xa3\xee\x4e\xa2\xfa\xf3\x51\xf7\x94\xa3\xee\x19\x40\xdd\x5b\x89\xba\x2f\x17\x75\xdf\x22\x6a\xa0\x1b\x75\x7f\x15\xea\xfe\x05\xd4\x03\x19\xd4\x83\xd3\xa8\xc1\x71\xd4\x43\xdd\xa8\x87\x32\xa8\x87\x47\x50\x8f\x8c\xa3\x86\x52\xa8\x47\x6b\x51\x8f\x55\xa2\x1e\xcf\x45\x3d\xde\x8d\x1a\x6e\x40\x3d\x91\x87\x7a\xb2\x14\xf5\x54\x84\x7a\xaa\x1b\x35\xa2\x50\x23\x23\xa8\xa7\x6b\x51\xcf\x28\xd4\x33\xad\xa8\x67\x46\x51\xcf\x56\xa1\x9e\x4d\xa3\x46\x3b\x51\xcf\x65\xa1\x9e\xfb\xaf\x8b\xa8\xe7\x3b\x50\xcf\x2f\xa0\x5e\xa8\x47\xbd\x90\x41\x8d\xb5\xa2\x5e\xcc\x41\xbd\xd8\x81\x7a\xa9\x0c\xf5\x72\x3e\xea\xe5\x66\xd4\x78\x09\xea\x95\x08\xf5\x4a\x1f\xea\xd5\x5c\xd4\xab\xcd\xa8\x57\x53\xa8\xd7\x9a\x50\xaf\xcd\xa0\x52\x75\xa8\x54\x3f\xea\xf5\x6c\xd4\xeb\x3d\xa8\x37\xaa\x51\x6f\xcc\xa0\xde\x1c\x41\x4d\x64\xa3\x26\xfa\x50\x13\x8b\xa8\xb7\x6a\x51\x6f\x4d\xa0\xde\x2e\x40\xbd\x3d\x88\x7a\x27\x1b\xf5\x4e\x1f\xea\x9d\x05\xd4\x64\x05\x6a\x72\x02\xf5\x6e\x3e\xea\xdd\x0e\xd4\xbb\x33\xa8\xf7\x1c\xea\xbd\x5e\xd4\xfb\xa0\xde\xef\x43\x4d\xb5\xa0\x3e\x28\x46\x7d\x30\x82\xfa\xb0\x18\xf5\x61\x33\xea\xc3\x59\xd4\x47\x49\xd4\x74\x0e\x6a\xba\x1d\xf5\x71\x21\xea\x93\xff\x8c\xa0\x3e\xed\x41\xcd\x24\x51\x9f\x29\xd4\x67\x13\xa8\xcf\xdb\x50\x5f\xd4\xa0\x66\x15\x6a\x76\x01\xf5\x65\x12\xf5\x55\x29\xea\xab\x0c\xea\xeb\x46\xd4\xd7\xa3\xa8\xb9\x6a\xd4\xdc\x34\xea\x9b\x0a\xd4\x37\xb3\xa8\x6f\xcb\x50\xdf\x76\xa3\xbe\x4d\xa1\xbe\xab\x47\x7d\x37\x87\x9a\xaf\x44\xcd\xf7\xa2\xbe\xcf\x45\x7d\x5f\x81\xfa\xbe\x1e\xf5\xfd\x3c\xea\x87\x56\xd4\x8f\x15\xa8\x74\x13\xea\xa7\x72\xd4\xcf\x39\xa8\x9f\x27\x50\xbf\xd4\xa3\x7e\x59\x44\x2d\xb4\xa3\x16\x16\x51\xbf\xb6\xa0\x7e\x5d\x44\xfd\x96\x44\xfd\xb6\x88\xfa\xbd\x02\xf5\x7b\x1f\xea\xf7\x19\xd4\x1f\x75\xa8\x3f\xd2\xa8\x3f\x4b\x51\x7f\xe5\xa3\xfe\xea\x40\x2d\xe6\xa1\x16\xeb\x50\x7f\x17\xa1\xfe\x4e\xa3\xfe\x99\x44\xfd\x3b\x80\xa6\x03\xbd\x44\x01\x7a\x89\x14\x7a\xc9\x2a\xf4\x52\x0e\xbd\xd4\x34\x7a\xe9\x3a\xf4\xff\x66\xd1\xcb\x74\xa1\xb3\x5b\xd1\xcb\xb6\xa3\x97\xeb\x47\xe7\x80\x5e\xa1\x02\xbd\x62\x2d\x7a\xa5\x76\x74\xee\x34\x7a\xe5\x21\xf4\x2a\x69\xf4\xaa\xbd\xe8\xbc\x39\xf4\x6a\x65\xe8\xd5\xab\xd1\x6b\x54\xa2\xa3\x26\x74\x94\x41\x8b\x1e\xb4\xcc\x46\xcb\x51\x74\xdc\x8d\x56\x85\x68\x35\x86\xd6\x6d\x68\x53\x85\x36\x69\xb4\x6d\x43\xbb\x1a\xb4\x1b\x44\xfb\x4a\xb4\x5f\x40\x87\x26\x74\xc8\xa0\x13\xed\xe8\xc4\x38\x3a\x7f\x04\xbd\x66\x33\x7a\xcd\x45\xf4\x5a\xd3\xe8\xb5\x87\xd1\x05\xa5\xe8\x75\x4a\xd0\xeb\x74\xa1\xd7\x6d\x45\xaf\x57\x8d\x2e\x2c\x40\x17\x4e\xa0\xd7\x6f\x41\xaf\x9f\x46\x6f\x30\x84\xde\x50\xa1\x8b\x72\xd1\x1b\x15\xa1\x37\x5a\x40\x6f\xdc\x82\xde\x04\xf4\x26\x2d\xe8\xe2\x1c\x74\xf1\x24\x7a\x53\x87\xde\x34\x85\xde\x2c\x89\xde\x3c\x07\xbd\x79\x1f\xba\xa4\x14\x5d\x32\x83\xde\xa2\x03\xbd\x65\x1e\x7a\xcb\x51\xf4\x56\x25\xe8\xad\xba\xd1\xa5\x35\xe8\xd2\x71\xf4\xd6\xe5\xe8\xad\xc7\xd1\xdb\x80\xde\x66\x08\xbd\x6d\x09\x7a\xdb\x2e\xf4\xb6\xd3\xe8\xb2\x6a\x74\xd9\x00\x7a\xbb\x1c\xf4\x76\xa3\xe8\xed\x4b\xd0\xdb\xd7\xa3\xb7\x6f\x47\x6f\xdf\x87\x2e\xcf\x42\xef\x98\x8b\xde\xa9\x18\xbd\x73\x36\xba\x22\x07\x5d\x31\x8b\xde\x65\x16\xbd\x5b\x16\x7a\xb7\x61\x74\x65\x1e\xba\x72\x01\xbd\x7b\x37\x7a\x8f\x2e\xf4\x9e\xe5\xe8\x3d\x27\xd1\x55\xa5\xe8\xaa\x5e\x74\x55\x06\xbd\xd7\x14\x7a\xef\x14\x7a\x9f\x51\x74\xf5\x18\x7a\xdf\x12\xf4\xbe\x29\xf4\x7e\x0a\xbd\xdf\x02\x7a\xff\x59\x74\x4d\x2f\xfa\x80\x0e\xf4\x81\xe5\xe8\x83\xaa\xd0\x07\x0d\xa3\x6b\xcb\xd0\x07\x67\xa1\x0f\x9e\x45\x1f\x32\x8d\x3e\x74\x0a\x5d\xd7\x8f\x3e\x2c\x1f\x7d\x78\x35\xfa\x88\x42\xf4\x11\xdd\xe8\xfa\x3a\xf4\x91\xa5\xe8\xa3\x40\x1f\x55\x87\x3e\x5a\xa1\x8f\x9e\x40\x37\xd4\xa0\x8f\xc9\x46\x1f\x53\x8b\x3e\x66\x1a\x7d\x6c\x11\xfa\xd8\x0c\xfa\xb8\x69\x74\x63\x12\xdd\x38\x81\x3e\xbe\x02\x7d\x7c\x0f\xfa\x84\x32\xf4\x09\x49\xf4\x89\xe5\xe8\x13\xa7\xd0\x4d\xd5\xe8\x93\xb2\xd0\x27\x35\xa0\x4f\x2e\x47\x9f\x9c\x41\x9f\xd2\x86\x3e\x65\x16\xdd\xdc\x8c\x6e\x9e\x40\x9f\x5a\x85\x3e\x75\x14\x7d\x5a\x11\xfa\xb4\x11\xf4\xe9\x55\xe8\xd3\xc7\xd1\x2d\xcd\xe8\x96\x71\xf4\x19\xad\xe8\x33\xb3\xd0\x67\x36\xa2\xcf\x1c\x47\x9f\x55\x8a\x3e\x6b\x10\xdd\xaa\xd0\xad\x5d\xe8\xb3\x15\xfa\xec\x5e\xf4\x39\x11\xfa\xdc\x12\xf4\xb9\x63\xe8\x64\x3f\xfa\xbc\x0a\xf4\x79\x69\xf4\xf9\x75\xe8\xf3\x47\xd1\x17\x14\xa1\x2f\x68\x44\xb7\x65\xa1\xdb\x0a\xd0\x6d\x8b\xe8\x0b\x3b\xd0\x17\xe5\xa1\x2f\xce\x42\x5f\xdc\x8b\x6e\xaf\x46\xb7\x4f\xa1\x2f\xc9\x41\x5f\x52\x80\xbe\xa4\x17\x7d\xc9\x2c\xfa\xd2\x0a\xf4\xa5\x3d\xe8\x4b\xe7\xd0\x97\x15\xa3\x3b\xda\xd1\x97\x4f\xa0\xaf\x74\xe8\xce\x0a\xf4\x55\x2d\xe8\xab\xfb\xd1\xd7\x34\xa2\xbb\x0a\xd0\xd7\x56\xa1\xaf\x53\xe8\xeb\xe6\xd1\xd7\x8f\xa1\xbb\x3b\xd1\x37\x8c\xa3\x6f\x1c\x41\xdf\x34\x80\xee\x69\x41\xdf\xdc\x8a\xbe\xa5\x0a\x7d\xab\x43\xf7\x82\xee\x1d\x43\xdf\xd6\x8f\xbe\xbd\x1d\x7d\x47\x12\xdd\xd7\x8c\xbe\xb3\x09\x7d\x57\x25\xfa\xee\x62\x74\x7f\x0e\xfa\x9e\x08\x7d\x4f\x1a\x7d\x6f\x2f\xfa\xbe\x4a\xf4\x40\x3e\x7a\x60\x06\x7d\xff\x30\xfa\x81\x2e\xf4\x83\xc5\xe8\x07\x47\xd0\x83\x15\xe8\xc1\x79\xf4\x43\xe3\xe8\x87\x2b\xd1\x0f\xcf\xa1\x1f\xe9\x41\x0f\x35\xa2\x1f\xcd\x42\x3f\x3a\x8c\x7e\xac\x1d\xfd\x78\x1e\xfa\xf1\x19\xf4\x70\x17\xfa\x89\x02\xf4\x13\xa3\xe8\x27\x4b\xd0\x4f\xce\xa0\x9f\xaa\x43\x3f\x35\x87\x1e\x69\x41\x8f\xcc\xa2\x9f\x2e\x42\x3f\x3d\x81\x7e\xa6\x18\xfd\x4c\x1f\xfa\x59\x85\x7e\xb6\x1b\xfd\xec\x1c\x7a\xb4\x0e\x3d\x3a\x83\x7e\xae\x14\xfd\x5c\x0b\xfa\xb9\x19\xf4\xf3\x45\xe8\x17\xf2\xd1\x63\x45\xe8\xb1\x7e\xf4\x8b\x05\xe8\x17\x27\xd1\x2f\xb5\xa0\x5f\x1a\x47\xbf\x5c\x8b\x7e\x79\x10\x3d\xee\xd0\xe3\x6d\xe8\x57\xfa\xd0\xaf\x4e\xa3\x53\x39\xe8\x54\x27\xfa\xf5\x0e\xf4\x1b\x19\xf4\x9b\x0d\xe8\x89\x06\xf4\x5b\x03\xe8\xb7\xa7\xd1\x93\x79\xe8\xc9\x19\xf4\xbb\x53\xe8\xf7\x7a\xd1\xef\x77\xa3\xa7\xca\xd0\x1f\x44\xe8\x0f\x73\xd1\x1f\x0e\xa1\x3f\x6a\x43\x7f\x34\x84\x9e\x4e\xa2\x3f\xae\x44\x7f\x9c\x46\x7f\x52\x89\xfe\x64\x1e\xfd\xe9\x34\x7a\x26\x89\xfe\xac\x14\xfd\xd9\x22\xfa\xf3\x49\xf4\x17\x75\xe8\x2f\xd2\xe8\xd9\x5e\xf4\x97\x05\xe8\x2f\xfb\xd0\x5f\x39\xf4\xd7\xd9\xe8\xaf\xcb\xd0\x5f\xf7\xa3\xe7\xb2\xd1\x73\x0d\xe8\xb9\x39\xf4\x37\x65\xe8\x6f\xfa\xd0\xdf\x4e\xa0\xe7\xb3\xd0\xdf\x3b\xf4\xf7\xb3\xe8\x1f\x06\xd1\x3f\xd6\xa3\xd3\x0a\x9d\xee\x41\xff\xd4\x8d\xfe\xb9\x06\xfd\x73\x1a\xfd\x4b\x1b\x7a\x21\x1f\xbd\x90\x44\x2f\x2c\xa2\x7f\xad\x43\xff\x3a\x86\xfe\xcd\xa1\x7f\x6b\x41\xff\x96\x42\xff\x5e\x82\xfe\xbd\x07\xfd\x7b\x1a\x9d\x69\x44\x67\x16\xd0\x7f\x54\xa2\xff\x18\x46\xff\xd9\x86\xfe\x33\x85\xfe\x73\x11\xfd\xd7\x08\x7a\xb1\x09\xbd\x98\x42\xff\x9d\x8f\xfe\xbb\x1a\xfd\x4f\x35\xfa\xdf\x7a\x0c\xed\x98\x25\x86\x31\x4b\xb6\x61\x96\xaa\xc0\x64\x29\xcc\xd2\xb9\x98\xa5\xa7\x31\xff\x1b\xc6\x2c\x33\x83\xc9\x1e\xc7\x2c\x3b\x86\x59\x6e\x00\xb3\x7c\x2b\x26\xa7\x15\xb3\x42\x01\x66\x85\x71\xcc\x8a\xdd\x98\x95\x9a\x30\xb9\x2d\x98\x95\xdb\x31\xab\x94\x62\x56\x49\x61\x56\x6d\xc3\xe4\x35\x63\x56\x73\x98\xd5\x4b\x31\x6b\xe4\x62\xd6\x98\xc6\x44\xdd\x18\x51\x82\x11\xf3\x18\xd9\x86\x89\x6b\x30\x71\x06\xa3\x3a\x31\xba\x08\xa3\x17\x31\x66\x0c\x63\x5b\x30\xae\x00\xe3\x92\x18\x0f\xc6\x0f\x60\x42\x09\x26\xa4\x31\x89\x56\x4c\x62\x08\x93\x5f\x88\xc9\x1f\xc0\xac\x59\x8e\x59\xb3\x0b\xb3\x66\x06\xb3\x56\x1f\x66\x6d\x87\x59\x7b\x00\x53\x90\x83\x29\x18\xc5\xac\x53\x84\x59\xa7\x15\xb3\x4e\x06\xb3\x6e\x07\x66\xdd\x05\xcc\x7a\xb5\x98\xf5\x86\x31\x85\x11\xa6\xb0\x1a\xb3\x7e\x36\x66\xfd\x0c\x66\x83\x26\xcc\x86\x75\x98\xa2\x4a\x4c\x51\x3f\xa6\x68\x1e\xb3\x51\x15\x66\xa3\x01\xcc\xc6\x29\x4c\x71\x1e\x66\xd3\x5c\xcc\xa6\xd3\x98\xcd\x16\x30\x9b\xcf\x63\x4a\x32\x98\x2d\xea\x30\x5b\x4c\x60\xb6\xca\xc6\x94\x36\x62\xb6\x6e\xc7\x6c\x53\x8f\xd9\xb6\x0a\x53\x96\x87\x29\x1b\xc6\x6c\xd7\x86\xd9\x6e\x12\xb3\x7d\x09\x66\x87\x2c\xcc\x0e\x2d\x98\x1d\xe6\x31\xe5\x33\x98\x1d\x9b\x31\x3b\xce\x62\x76\xea\xc2\xec\xdc\x81\xa9\xc8\xc7\x54\x8c\x63\x76\x69\xc0\xec\xea\x30\xbb\x36\x61\x76\x4d\x63\x76\x6b\xc4\x54\x96\x63\x2a\xc7\x31\xbb\xe7\x60\x76\x6f\xc3\xec\x3e\x8f\xd9\x63\x1c\xb3\x67\x1b\xa6\xaa\x06\x53\x35\x81\xd9\xab\x15\xb3\x77\x21\x66\xef\x31\xcc\x3e\xb5\x98\x7d\xe6\x31\xd5\xc3\x98\x7d\x8b\x30\xfb\xf6\x63\xf6\x2b\xc6\xec\xd7\x8d\xd9\xdf\x61\xf6\x1f\xc0\xd4\xe4\x61\x6a\x6a\x31\x35\x23\x98\x9a\x34\xe6\x80\x2a\xcc\x81\x59\x98\x03\xeb\x30\x07\x15\x60\x0e\x1a\xc0\xd4\x3a\x4c\x6d\x17\xe6\xe0\x6c\xcc\xc1\xf5\x98\x83\x07\x31\x87\xa4\x31\x75\x11\xa6\xae\x06\x73\x58\x36\xe6\x70\x30\x87\xb7\x62\x8e\x68\xc2\xd4\x37\x63\x8e\xac\xc5\x1c\xd5\x84\x39\x3a\x1f\x73\x74\x0a\xd3\x50\x8f\x69\xe8\xc5\x1c\xd3\x88\x39\x66\x00\x73\x4c\x06\x73\x6c\x3f\xe6\xb8\x4a\x4c\x23\x98\xc6\x31\x4c\xe3\x22\xe6\xf8\x76\xcc\x09\xf5\x98\x13\xc6\x30\x27\x76\x60\x9a\x5a\x31\x27\x15\x62\x4e\x4a\x63\x4e\x1e\xc5\x9c\x52\x84\x39\xa5\x17\x73\xca\x1c\xa6\xb9\x19\x73\x6a\x36\xe6\xd4\x72\xcc\xa9\x0b\x98\xd3\xca\x31\xa7\xe7\x62\x4e\xef\xc6\xb4\x34\x62\x5a\x66\x30\x67\xf4\x62\xce\xcc\xc1\x9c\x99\xc4\x9c\x05\xe6\xac\x7a\xcc\xd9\x45\x98\xb3\xe7\x31\xe7\xf4\x62\xce\xad\xc6\x24\x4b\x31\xc9\x11\xcc\x79\x4d\x98\xf3\x32\x98\xf3\x3b\x31\x17\x34\x61\xda\x22\x4c\x5b\x0f\xe6\xc2\x24\xe6\xa2\x22\xcc\x45\xbd\x98\x8b\x2b\x30\x17\x2f\x60\xda\x5b\x31\xed\x8b\x98\x4b\x5a\x30\x97\x2c\x62\x2e\x4d\x62\x2e\x9d\xc2\x5c\x56\x8e\xb9\x6c\x08\xd3\x91\x8b\xe9\x68\xc7\x74\xcc\x62\x2e\x2f\xc1\x5c\x9e\xc4\x5c\x91\xc1\x5c\x59\x8f\xe9\x1c\xc4\x5c\x9d\x8f\xb9\xa6\x09\xd3\x35\x84\xb9\x76\x00\x73\x9d\xc2\x5c\xd7\x89\xb9\xbe\x0c\x73\xfd\x30\xa6\x7b\x12\x73\x43\x0a\x73\x63\x03\xe6\xa6\x1c\xcc\x4d\x0d\x98\x1e\x87\xe9\x49\x62\x6e\x4e\x62\x6e\x51\x98\x5b\xb3\x31\xb7\x96\x60\x6e\x1d\xc6\xf4\x56\x62\x6e\x73\x98\xdb\x06\x30\xb7\x4f\x63\xee\x18\xc3\xf4\x55\x63\xee\x2c\xc0\xdc\x95\x8d\xb9\xab\x03\x73\x77\x05\xe6\xee\x56\xcc\xdd\x19\x4c\x7f\x12\xd3\xbf\x88\xb9\xa7\x07\x73\xef\x00\xe6\xbe\x1a\xcc\x40\x05\x66\x60\x01\x73\x7f\x3b\xe6\x81\x1c\xcc\x03\x4d\x98\x07\x66\x31\x0f\x36\x61\x1e\x5c\xc0\x0c\xb6\x62\x1e\x2a\xc5\x3c\x34\x8a\x79\x58\x61\x1e\x4e\x62\x1e\x9e\xc5\x3c\x52\x8b\x79\x64\x12\x33\x54\x82\x19\x9a\xc5\x3c\x9a\x8b\x79\xb4\x1d\xf3\x58\x15\xe6\xb1\x14\xe6\xf1\x72\xcc\xe3\x69\xcc\x70\x2b\xe6\x89\x5c\xcc\x13\xf5\x98\x27\x15\xe6\xc9\x51\xcc\x53\xc5\x98\xa7\x46\x30\x4f\xa5\x31\x23\x0a\xf3\x74\x39\xe6\x99\x62\xcc\xb3\xf9\x98\x51\x30\xa3\x63\x98\xe7\xda\x31\xcf\x37\x60\x5e\xc8\xc1\xbc\xd0\x8b\x19\xcb\xc7\x8c\xf5\x62\x5e\x2c\xc2\xbc\x38\x84\x79\x49\x61\x5e\x6a\xc2\xbc\x34\x89\x79\xb9\x0c\xf3\x72\x0a\x33\xde\x8a\x19\x9f\xc1\xbc\x52\x80\x79\xa5\x1e\xf3\xca\x38\xe6\xd5\x46\xcc\xab\x33\x98\xd7\xaa\x31\xaf\x0d\x62\x52\x7d\x98\xd7\x93\x98\x37\x0a\x30\x6f\x64\x30\x6f\xd6\x62\x26\xf2\x30\x13\x0d\x98\xb7\xb2\x30\x6f\x8d\x63\xde\x6e\xc6\xbc\x9d\xc2\xbc\x53\x80\x79\xa7\x09\x33\x59\x80\x99\x6c\xc3\xbc\x5b\x81\x79\xb7\x1f\xf3\x7e\x01\x66\xaa\x18\xf3\x41\x15\xe6\x83\x51\xcc\x87\xc5\x98\x0f\x3b\x31\x1f\x95\x60\x3e\x9a\xc6\x4c\x37\x61\xa6\x47\x31\x1f\xe7\x62\x3e\xee\xc6\x7c\xd2\x82\xf9\x64\x16\xf3\x69\x13\xe6\xd3\x6e\xcc\x4c\x2b\x66\x66\x1e\xf3\x59\x05\xe6\xb3\x3e\xcc\x67\x0b\x98\xcf\x8b\x30\x9f\x8f\x63\xbe\xc8\x60\xbe\x2c\xc7\x7c\xd5\x81\xf9\x6a\x01\x33\x57\x81\x99\xcb\x60\xbe\xa9\xc5\x7c\x5b\x81\xf9\x76\x16\xf3\x5d\x09\x66\xbe\x1a\x33\xdf\x8e\xf9\xbe\x0d\xf3\x43\x84\xf9\xb1\x10\xf3\xe3\x10\x26\x5d\x8e\xf9\x29\x0f\xf3\x73\x84\xf9\x79\x00\xf3\x4b\x2d\xe6\x97\x05\xcc\xc2\x08\xe6\xd7\x1c\xcc\xaf\x2d\x98\xdf\x0a\x30\xbf\x0d\x62\x7e\xaf\xc1\xfc\x3e\x8f\xc9\x14\x63\x32\x63\x98\x3f\x1c\xe6\x8f\x2e\xcc\x1f\x29\xcc\x9f\x25\x98\x3f\x5b\x30\x7f\x8e\x61\xfe\x9c\xc1\xfc\x55\x87\x59\x74\x98\xc5\x01\xcc\xdf\xa5\x98\xbf\x87\x31\xff\x14\x61\xfe\x2d\xc3\xfc\x3b\x89\xa5\x0a\xbb\x44\x84\x5d\x62\x12\xbb\x64\x0a\x9b\x55\x8a\x5d\xba\x03\xfb\xbf\x7a\xec\x32\x0a\x9b\xad\xb0\xcb\xfe\xa7\x0b\xbb\x5c\x0e\x76\xb9\x36\xec\x72\x33\xd8\xe5\xcb\xb0\xcb\xf7\x62\x73\xb2\xb1\x39\x4d\xd8\x9c\x34\x76\x85\x66\xec\x8a\xcd\xd8\x95\x2a\xb0\x2b\x4d\x61\x73\x1b\xb1\xb9\x8b\xd8\x95\xdb\xb0\xab\xe4\x62\x57\xe9\xc1\xae\x5a\x88\x5d\x75\x18\x9b\x97\x8b\xcd\x6b\xc3\xae\x56\x86\x5d\x6d\x1a\xbb\x7a\x39\x76\xf5\x01\xec\x1a\x65\xd8\x08\x6c\x34\x86\x15\xa5\x58\x31\x88\x95\x0e\x2b\x3b\xb1\x31\xd8\xb8\x09\x1b\xcf\x60\x55\x05\x56\x8d\x62\x75\x21\x56\x4f\x63\x4d\x07\xd6\x76\x61\x5d\x36\xd6\x4d\x63\x7d\x2f\x36\xd4\x63\x13\x0d\xd8\xfc\x14\x76\xcd\x5e\xec\x5a\xcd\xd8\xb5\x2b\xb0\x6b\x0f\x63\x0b\x6a\xb0\x05\x8b\xd8\x75\xfa\xb0\xeb\x36\x62\xd7\x2b\xc1\x16\x66\x61\x0b\x27\xb1\xeb\x4f\x60\x37\x98\xc6\x6e\x58\x86\xdd\xb0\x0f\x5b\x94\x8d\x2d\x6a\xc4\x16\x4d\x60\x37\x6a\xc7\x6e\x34\x8e\xdd\xb8\x01\xbb\x49\x0e\x76\x93\x41\x6c\x71\x35\xb6\x78\x11\xbb\x69\x0f\x76\xb3\x52\xec\x66\xd3\xd8\xcd\x7b\xb1\x9b\xcf\x60\x4b\x1a\xb1\x5b\x14\x60\xb7\xcc\xc3\x6e\x05\x76\xab\x79\x6c\x69\x3b\x76\xeb\x42\xec\xd6\x29\xec\x36\x8d\xd8\x6d\x73\xb0\xdb\x0e\x62\xcb\x0a\xb1\x65\x33\xd8\xed\x3a\xb1\xdb\x57\x63\x77\x88\xb0\x3b\xcc\x62\xcb\xfb\xb1\x3b\xd6\x60\x77\xfc\xaf\x19\xec\x4e\xc3\xd8\x9d\x9b\xb0\x15\x59\xd8\x8a\x36\x6c\xc5\x14\x76\x97\x4a\xec\x2e\xa3\xd8\x5d\xc1\xee\xda\x80\xdd\x75\x0a\xbb\x5b\x25\xb6\xb2\x08\xbb\x7b\x1e\x76\xf7\x11\xec\x1e\x75\xd8\x3d\x32\xd8\x3d\xcb\xb0\x7b\x76\x62\xab\xc0\x56\x35\x61\xab\x66\xb0\x7b\x15\x61\xf7\x2e\xc0\xee\xdd\x8d\xdd\xa7\x12\x5b\x0d\xb6\x7a\x18\xbb\x6f\x12\xbb\x6f\x06\xbb\x7f\x3e\x76\xff\x2e\xec\xfe\x73\xd8\x9a\x72\x6c\xcd\x10\xf6\x80\x2c\xec\x01\x49\xec\x81\xb9\xd8\x03\x53\xd8\x83\xda\xb0\xb5\xe5\xd8\xda\x09\xec\xc1\xb5\xd8\x43\xf2\xb0\x87\x0c\x61\x0f\x6d\xc4\x1e\x3a\x8c\xad\x2b\xc3\xd6\x4d\x61\x0f\xeb\xc5\x1e\xde\x80\x3d\x22\xc2\xd6\x67\x63\xeb\xdb\xb1\x47\x96\x62\x8f\x9c\xc7\x1e\xd5\x83\x3d\xba\x0d\xdb\xd0\x80\x3d\xa6\x0a\x7b\x6c\x09\xf6\xb8\x7c\xec\x71\xa3\xd8\xc6\x06\xec\xf1\xb9\xd8\xe3\xfb\xb0\x27\x94\x60\x4f\x18\xc1\x9e\x98\x8f\x3d\xb1\x13\x7b\xe2\x14\xb6\xa9\x15\x7b\x92\xc2\x9e\x34\x82\x3d\xb9\x0e\x7b\x4a\x16\xf6\x94\x24\xf6\x94\x79\x6c\x73\x35\xf6\xd4\x32\xec\x69\x45\xd8\xd3\x1d\xb6\x25\x0b\xdb\x92\xc6\x9e\x31\x89\x3d\xb3\x19\x7b\x56\x1e\xf6\xac\x0c\xb6\xb5\x0f\x7b\x76\x13\xf6\x9c\x62\xec\x39\xa3\xd8\x73\xf3\xb1\xc9\x7a\x6c\x72\x04\x7b\xde\x04\xf6\xfc\x29\x6c\x5b\x0e\xb6\x2d\x83\xbd\xb0\x0e\x7b\x61\x06\x7b\x51\x37\xf6\xe2\x41\x6c\xfb\x00\xf6\x92\x02\xec\x25\x23\xd8\x4b\xeb\xb0\x97\x15\x60\x2f\xeb\xc0\x5e\x36\x8f\xed\xa8\xc4\x76\x0c\x63\x2f\x6f\xc6\x5e\x9e\xc1\x5e\x51\x8b\xbd\x62\x0c\x7b\x65\x21\xf6\xca\x69\x6c\x67\x09\xb6\x73\x10\x7b\x55\x2e\xf6\xaa\x46\xec\x55\x69\xec\xd5\xcd\xd8\xab\x33\xd8\x6b\x52\xd8\xae\x2e\xec\xb5\xd5\xd8\xeb\x72\xb1\xd7\x0d\x62\xaf\xaf\xc4\x5e\x3f\x84\xed\x6e\xc4\x76\x2f\x60\x6f\x68\xc6\xde\x30\x8b\xbd\xb1\x1e\x7b\xe3\x2c\xf6\xa6\x69\x6c\xcf\x20\xf6\xe6\x52\xec\xcd\x19\xec\xad\x0e\x7b\xeb\x22\xb6\x77\x0e\x7b\x5b\x0d\xf6\xb6\x71\xec\xed\xc5\xd8\x3b\xaa\xb0\x77\x0c\x61\xfb\x26\xb1\x77\x81\xbd\xab\x0a\x7b\xd7\x1c\xf6\xee\x24\xb6\x3f\xc2\xf6\x0f\x62\xef\x89\xb0\xf7\x66\x61\xef\x4d\x63\xef\x9b\xc1\x0e\x4c\x61\xef\x1f\xc7\x3e\x30\x8a\x7d\x70\x04\x3b\xd8\x8a\x7d\x28\xc2\x3e\x34\x85\x7d\xb8\x1a\xfb\xf0\x1c\xf6\x91\x24\xf6\x91\x34\x76\x28\x85\x7d\x74\x00\xfb\x58\x3e\xf6\xb1\x2e\xec\xe3\xb9\xd8\x61\x85\x7d\xc2\x61\x9f\x98\xc7\x3e\xd9\x88\x7d\x72\x1e\xfb\x54\x37\x76\xa4\x1c\x3b\xb2\x80\x7d\xba\x17\xfb\x8c\xc2\x3e\xd3\x83\x7d\xb6\x0b\x3b\x9a\xc4\x8e\x66\xb0\xcf\x2d\x62\x5f\xc8\xc3\x8e\x15\x62\x5f\xac\xc4\xbe\x38\x87\x7d\xb9\x02\x3b\x5e\x8c\x7d\x25\x0b\xfb\x4a\x0f\xf6\xd5\x4e\xec\x6b\x9d\xd8\x54\x07\x36\x35\x87\x7d\xbd\x1c\xfb\x46\x3e\xf6\xcd\x0a\xec\x44\x84\x9d\x98\xc5\xbe\x35\x88\x7d\xbb\x11\xfb\x4e\x29\x76\x52\x61\xdf\xcd\xc7\xbe\x5b\x83\x7d\x77\x06\xfb\x5e\x2b\xf6\xfd\x08\xfb\x7e\x3b\x76\x0a\xec\x54\x3d\x76\x2a\x83\xfd\xa0\x15\xfb\x61\x84\xfd\x70\x12\x3b\x9d\x85\xfd\xb8\x16\xfb\x49\x23\xf6\xd3\x6a\xec\x4c\x3e\xf6\xb3\x72\xec\xe7\xf9\xd8\x2f\xb2\xb0\x5f\x0c\x63\x67\x47\xb1\x5f\x76\x62\xbf\xaa\xc5\x7e\x9d\x8b\xfd\xba\x09\xfb\x75\x1a\x3b\xd7\x8e\xfd\x26\xc2\x7e\xd3\x83\xfd\xb6\x10\xfb\xed\x08\xf6\xbb\x52\xec\x77\x53\xd8\xf9\x26\xec\xf7\xd9\xd8\xef\x27\xb1\x3f\x4c\x62\x7f\x1c\xc6\xa6\xfb\xb1\x3f\x95\x63\x7f\x1a\xc0\xfe\x3c\x85\xfd\xa5\x1b\xbb\x50\x8f\xfd\xb5\x0a\xfb\x5b\x39\xf6\xf7\x56\x6c\x66\x10\xfb\xc7\x02\xf6\xcf\x6a\xec\x5f\xdd\xd8\xc5\x72\xec\xe2\x3c\xf6\xef\x2e\xec\x3f\x45\xd8\x7f\x73\xb1\xff\x36\xe3\x00\xc7\x10\x6e\x89\x02\xdc\x12\x63\xb8\x25\xeb\x70\x4b\x2e\xe2\x96\x6a\xc5\x65\xd5\xe2\x96\x2e\xc0\x2d\x9d\xc1\xfd\x6f\x1a\xb7\x4c\x3e\x6e\x99\x6e\x5c\x76\x0f\x6e\xd9\x5a\xdc\x72\x45\xb8\xe5\x26\x71\xcb\x0f\xe0\x72\xda\x71\x2b\xb4\xe0\x56\xcc\xc6\xad\xd8\x8f\x5b\x69\x08\x97\x5b\x87\x5b\x39\x1b\xb7\xf2\x18\x6e\x95\x1a\xdc\xaa\x59\xb8\x55\xfb\x71\x79\xf9\xb8\xbc\x31\xdc\x6a\xf5\xb8\xd5\xc1\xad\x3e\x88\x5b\xa3\x1e\x17\x45\xb8\x68\x1c\x27\x0a\x71\xa2\x0b\x27\x32\x38\x99\xc4\xc9\x19\x5c\x5c\x86\x8b\xfb\x70\x2a\x1b\xa7\x16\x71\x7a\x04\x67\xba\x70\x76\x10\xe7\x52\x38\x9f\xc1\x85\x29\x5c\x62\x18\x97\x9f\x8b\xcb\x1f\xc1\xad\x15\xe1\xd6\x6e\xc6\x15\x54\xe3\xd6\x29\xc2\xad\x9b\x83\x5b\x77\x1a\xb7\x5e\x0f\xae\xb0\x0e\xb7\x7e\x01\x6e\xfd\x39\xdc\x06\xdd\xb8\x0d\x6b\x71\x45\x0e\x57\x34\x81\xdb\xa8\x09\xb7\x71\x2e\x6e\xe3\x41\xdc\x26\xd5\xb8\xe2\x5c\xdc\xa6\xb9\xb8\xcd\xfe\x93\xc6\x6d\x9e\xc2\x95\x8c\xe2\xb6\xa8\xc2\x6d\x31\x83\xdb\xb2\x11\xb7\x65\x06\xb7\x55\x07\xae\xd4\xe1\x4a\x87\x70\x5b\x0f\xe0\xb6\xe9\xc6\x6d\x5b\x8d\x2b\x2b\xc7\x6d\x57\x84\xdb\x6e\x16\xb7\x7d\x37\x6e\x87\x1c\xdc\x0e\xed\xb8\xf2\x66\x5c\x79\x1a\xb7\x63\x1f\x6e\xa7\x45\xdc\xce\x33\xb8\x8a\x24\xae\x62\x1e\xb7\x4b\x37\x6e\xd7\x0a\xdc\xae\x8b\xb8\xdd\x9a\x70\x95\xd9\xb8\xca\x72\xdc\xee\x43\xb8\x3d\xa6\x70\x55\x59\xb8\xaa\x09\xdc\x5e\x83\xb8\xbd\x32\xb8\xbd\xcb\x70\x7b\xb7\xe3\xf6\x9e\xc4\xed\x93\x85\xdb\xa7\x05\x57\x9d\x83\xdb\x37\x1f\xb7\xef\x18\x6e\xbf\x14\x6e\xff\x7e\x5c\x4d\x29\xae\x66\x02\x77\x40\x37\xee\xc0\x32\xdc\x81\x03\xb8\x03\x67\x70\x07\x0d\xe1\x6a\x4b\x71\xb5\x93\xb8\x83\x93\xb8\x83\x67\x70\x87\x34\xe3\x0e\x55\xb8\x43\x47\x70\x75\x63\xb8\xc3\x9a\x70\x87\x57\xe3\x8e\x28\xc7\xd5\x97\xe2\xea\x17\x70\x47\xf6\xe0\x8e\x02\x77\x54\x35\xee\xe8\x12\x5c\x43\x11\xee\x98\x02\xdc\x31\x9d\xb8\x63\x9b\x71\xc7\x55\xe1\x1a\x6b\x70\xc7\xb7\xe0\x8e\x1f\xc7\x9d\xd0\x8e\x3b\xb1\x0c\x77\xe2\x24\xae\xa9\x11\xd7\x34\x8b\x3b\xa9\x06\x77\xd2\x3c\xee\xe4\x24\xee\x94\x3c\xdc\x29\x7d\xb8\xe6\x52\x5c\x73\x17\xee\xd4\x29\xdc\x69\xf3\xb8\xd3\xa7\x70\x2d\xa3\xb8\x33\x4a\x70\x67\x0c\xe1\xce\xac\xc0\x9d\xd9\x87\x3b\xab\x1f\xd7\x5a\x8e\x3b\x3b\x07\x77\x76\x3f\xee\x9c\x26\xdc\xb9\x11\xee\xdc\x34\x2e\x39\x84\x3b\x2f\x0f\x77\x5e\x33\xee\xfc\x32\xdc\x05\xb9\xb8\x0b\xa6\x71\x6d\x35\xb8\xb6\x49\xdc\x85\x9d\xb8\x0b\xd3\xb8\x8b\x6a\x71\x17\xb7\xe3\xda\x1d\xae\xbd\x0d\x77\x49\x21\xee\x92\x1e\xdc\xa5\x65\xb8\x4b\xc7\x71\x97\xd5\xe2\x3a\x14\xae\xa3\x07\x77\x79\x3e\xee\xf2\x01\xdc\x15\x85\xb8\x2b\x86\x70\x57\x64\x70\x9d\x0a\xd7\xd9\x8e\xbb\xaa\x13\x77\x75\x12\x77\x0d\xb8\x6b\x86\x71\x5d\xd5\xb8\xae\x09\xdc\xb5\x35\xb8\x6b\x27\x71\xd7\xd5\xe2\xae\x4b\xe1\xba\xb3\x71\xdd\xdd\xb8\x1b\x7a\x71\x37\x36\xe1\x6e\x1c\xc3\xdd\x54\x89\xeb\xc9\xc2\xf5\x8c\xe0\x6e\xae\xc4\xdd\x3c\x8c\xbb\xa5\x0f\x77\x4b\x1a\x77\x6b\x03\xae\xb7\x1e\x77\x5b\x17\xee\xf6\x24\xee\x8e\x24\xae\xaf\x0d\xd7\x37\x87\xbb\xab\x18\x77\x77\x3e\xee\xee\x05\x5c\x7f\x12\x77\x4f\x1b\xee\xde\x1a\xdc\x7d\x65\xb8\xfb\x26\x71\x03\x0d\xb8\x81\x45\xdc\x03\xe0\x1e\x48\xe3\x1e\x1c\xc0\x0d\x56\xe3\x1e\xca\xc2\x3d\xd4\x85\x7b\x38\xc2\x3d\x3c\x8e\x7b\xa4\x19\x37\xa4\x70\x43\x33\xb8\x47\x3b\x70\x8f\xe5\xe2\x1e\x9b\xc3\x3d\x3e\x80\x1b\xae\xc1\x3d\xe1\x70\x4f\x4c\xe0\x9e\xec\xc6\x3d\xd5\x8a\x1b\x29\xc1\x8d\x4c\xe2\x9e\x4e\xe2\x9e\xe9\xc2\x3d\x5b\x88\x1b\x2d\xc3\x3d\x57\x83\x7b\xbe\x04\xf7\x7c\x12\xf7\xfc\x38\x6e\xcc\xe1\x5e\xac\xc4\xbd\x54\x88\x7b\xb9\x1c\x37\x5e\x85\x7b\x05\xdc\x2b\x73\xb8\x57\xcb\x71\xaf\xce\xe1\x5e\x4b\xe2\x52\x45\xb8\xd4\x10\xee\xf5\x3c\xdc\xeb\x23\xb8\x37\x0a\x70\x6f\x8c\xe0\xde\x6c\xc0\x4d\x64\xe3\x26\xfa\x71\x6f\x15\xe1\xde\x6e\xc2\xbd\x3d\x81\x7b\x67\x1e\xf7\x6e\x3e\xee\xbd\x4a\xdc\x7b\x33\xb8\xf7\x87\x71\x53\x43\xb8\x0f\x92\xb8\x0f\xeb\x71\x1f\xce\xe2\x3e\xea\xc3\x4d\x37\xe1\x3e\x2e\xc1\x7d\x02\xee\x93\x09\xdc\xa7\x3d\xb8\x99\x46\xdc\x67\xf9\xb8\xcf\x73\x70\x9f\x0f\xe0\xbe\x88\x70\x5f\x0c\xe1\x66\xab\x70\x5f\x2a\xdc\x57\xf9\xb8\xaf\x23\xdc\xd7\x6d\xb8\xb9\x61\xdc\x37\x55\xb8\x6f\x92\xb8\x6f\x6b\x71\xdf\xce\xe3\xbe\x6b\xc2\xcd\x8f\xe2\x7e\x00\xf7\xa3\xc2\xa5\xcb\x71\x3f\x35\xe0\x7e\x76\xb8\x5f\x6a\x71\x0b\xc5\xb8\x5f\x8b\x70\xbf\x4e\xe2\x7e\x2b\xc1\xfd\x9e\x8b\xfb\x7d\x1c\x97\x49\xe2\xfe\x28\xc5\xfd\x91\xc1\xfd\x99\xc4\xfd\x55\x85\xfb\x6b\x0c\xb7\x58\x88\x5b\x1c\xc6\xfd\x5d\x86\xfb\x7b\x00\xf7\x8f\xc3\xfd\xd3\x8e\xfb\xb7\x19\x4f\x39\x7e\x89\x3c\xfc\x12\x49\xfc\x92\xed\xf8\xa5\x5a\xf0\x59\x8d\xf8\xa5\x2b\xf1\xff\xab\xc2\x2f\x93\x8d\x5f\x66\x0c\x9f\xdd\x86\x5f\xb6\x1c\xbf\x5c\x16\x7e\xb9\x51\xfc\xf2\x49\x7c\x4e\x1d\x7e\x85\x12\xfc\x0a\xa3\xf8\x15\xcb\xf1\x2b\x66\xf0\x2b\x0d\xe3\x73\x5b\xf0\xb9\xd3\xf8\x95\xeb\xf0\xab\x94\xe1\x57\x55\xf8\x55\xbb\xf1\x79\xe5\xf8\xd5\xea\xf0\xab\x17\xe1\x57\x1f\xc7\xaf\x31\x84\x8f\x7a\xf1\xa2\x0c\x2f\xd2\x78\x39\x83\x8f\x9b\xf1\xaa\x02\xaf\xe6\xf0\xba\x0c\xaf\x5b\xf0\x7a\x0a\x6f\x8a\xf0\xa6\x1e\x6f\xba\xf1\x66\x01\x6f\xdb\xf0\x2e\xc2\xbb\x39\xbc\x6f\xc6\x87\x5c\x7c\x18\xc4\x27\xaa\xf1\x89\x0e\xfc\x9a\x0a\xbf\x56\x05\x7e\xed\x1a\x7c\x41\x31\x7e\x9d\x6c\xfc\x3a\x03\xf8\x75\x5b\xf1\xeb\xf5\xe3\x0b\x6b\xf1\x85\x33\xf8\xf5\xc7\xf0\x1b\x74\xe2\x37\xac\xc2\x6f\x98\xc2\x17\x95\xe2\x8b\x06\xf1\x1b\x95\xe2\x37\x4a\xe3\x37\xee\xc1\x6f\xd2\x82\x2f\x6e\xc0\x6f\x5a\x87\xdf\xac\x06\xbf\xd9\x08\x7e\x73\x87\xdf\x7c\x0a\x5f\xd2\x85\xdf\xa2\x12\xbf\xc5\x00\x7e\xcb\x16\xfc\x96\x19\xfc\x56\x2d\xf8\xad\x32\xf8\xd2\x76\xfc\xd6\x11\x7e\xeb\x3e\xfc\x36\x9d\xf8\x6d\x9b\xf1\x65\x15\xf8\xed\x1c\x7e\xbb\x45\xfc\xf6\x49\xfc\x0e\xd9\xf8\x1d\x3a\xf1\x3b\xe6\xe2\x77\x9c\xc2\xef\xd4\x83\xdf\x79\x08\x5f\x31\x86\xdf\x25\x1f\xbf\xcb\x14\x7e\xd7\x24\x7e\xb7\x6c\xfc\x6e\xdd\xf8\xca\x08\x5f\xd9\x83\xdf\xbd\x00\xbf\xfb\x08\x7e\x8f\x3c\xfc\x9e\xb9\xf8\x3d\x5b\xf1\x7b\x2e\xe2\xab\xfa\xf0\x7b\x55\xe3\xf7\xce\xc2\xef\xdd\x82\xdf\x7b\x1e\xbf\x4f\x2d\x7e\x9f\x14\xbe\xba\x11\xbf\x6f\x36\x7e\xdf\x7e\xfc\x7e\x39\xf8\xfd\xea\xf1\xfb\x8d\xe0\xf7\xcb\xe0\xf7\x6f\xc3\xef\x3f\x87\xaf\x59\xc0\x1f\x90\xc1\x1f\x58\x87\x3f\x70\x1c\x7f\x50\x11\xbe\xb6\x1c\x7f\x70\x03\xfe\x90\x06\xfc\xa1\xb5\xf8\x43\xfb\xf0\x75\xc5\xf8\xba\x3e\xfc\x61\x0e\x7f\x58\x2d\xfe\xb0\x31\xfc\xe1\x25\xf8\xc3\x5b\xf0\x47\xd4\xe1\xeb\x15\xbe\x3e\x8d\x3f\xb2\x1c\x7f\xe4\x18\xfe\xa8\x62\xfc\x51\x83\xf8\xa3\x1b\xf1\x47\xcf\xe3\x1b\x1a\xf1\xc7\x14\xe0\x8f\x19\xc7\x1f\xdb\x85\x3f\xae\x14\x7f\xdc\x34\xbe\xb1\x05\x7f\x7c\x05\xfe\xf8\x01\xfc\x09\xb5\xf8\x13\xb3\xf1\x27\x0e\xe3\x9b\x14\xbe\xa9\x0b\x7f\x52\x17\xfe\xe4\x12\xfc\x29\xb9\xf8\x53\x32\xf8\xe6\x34\xfe\xd4\x3e\xfc\x69\xbd\xf8\xd3\xeb\xf1\x2d\x79\xf8\x96\x71\xfc\x19\x15\xf8\x33\x2b\xf1\x67\xce\xe3\x5b\x73\xf1\x67\xff\xa7\x15\x7f\x4e\x3e\xfe\x9c\x14\xfe\xdc\x5a\xfc\xb9\x8b\xf8\xe4\x10\xfe\xbc\x2c\xfc\x79\x83\xf8\xf3\x1b\xf1\xe7\x8f\xe0\x2f\x58\xc4\xb7\xb5\xe2\xdb\x52\xf8\x0b\xab\xf1\x17\x76\xe3\x2f\x5c\xc4\x5f\x54\x8a\xbf\xa8\x05\x7f\xd1\x34\xfe\xe2\x6e\x7c\x7b\x39\xbe\x7d\x11\x7f\x49\x1f\xfe\xd2\x52\xfc\xa5\xf3\xf8\xcb\x2a\xf1\x97\x0d\xe1\x3b\x46\xf1\x97\x37\xe3\xaf\xa8\xc3\x5f\x59\x80\xbf\x72\x1e\xdf\x59\x83\xbf\x2a\x89\xbf\x6a\x1e\x7f\x75\x35\xfe\xea\x61\xfc\x35\xf9\xf8\x6b\x6a\xf0\xd7\x0c\xe1\xbb\x72\xf1\x5d\xe3\xf8\x6b\x6b\xf0\xd7\x8e\xe1\xaf\x5b\xc0\x5f\x3f\x8f\xef\x9e\xc3\xdf\x30\x8f\xbf\xb1\x17\x7f\x53\x25\xbe\x27\x1f\xdf\xb3\x80\xbf\xb9\x06\x7f\xf3\x3c\xfe\x96\x2e\xfc\x2d\x19\xfc\xad\x1d\xf8\x5e\x87\xef\xed\xc2\xdf\xe6\xf0\xb7\x35\xe3\x6f\xef\xc7\xdf\x31\x83\xbf\x33\xc2\xdf\xd9\x80\xbf\x2b\x17\x7f\x57\x3d\xfe\xae\x41\xfc\x5d\x0b\xf8\xbb\xcb\xf0\x77\x77\xe1\xef\x9e\xc3\xf7\x17\xe3\xfb\xa7\xf0\xf7\xe4\xe1\xef\x19\xc4\xdf\x5b\x8a\xbf\xb7\x13\x7f\xef\x2c\x7e\x20\x07\x3f\x30\x8a\xbf\x3f\x0f\x7f\xff\x00\xfe\xfe\x45\xfc\x03\xcd\xf8\x07\xe6\xf1\x0f\x76\xe2\x07\xb3\xf1\x83\x3d\xf8\x87\xaa\xf1\x0f\x77\xe0\x1f\xa9\xc3\x3f\xb2\x88\x1f\x2a\xc3\x0f\xf5\xe1\x1f\x4d\xe1\x1f\x9b\xc6\x3f\xde\x89\x1f\x2e\xc3\x0f\xb7\xe1\x9f\xc8\xc7\x3f\xd9\x88\x7f\x6a\x18\x3f\x32\x8f\x7f\x7a\x1e\xff\x4c\x1a\xff\x6c\x06\xff\x1c\xf8\xe7\x8b\xf0\x2f\xe4\xe1\xc7\x72\xf0\x63\x29\xfc\x8b\x35\xf8\x17\xd3\xf8\x97\xca\xf1\x2f\x8d\xe2\x5f\x2e\xc5\xbf\x9c\xc2\x8f\xe7\xe1\xc7\xbb\xf0\xaf\xb4\xe1\x5f\xad\xc7\xbf\x96\x87\x7f\x6d\x04\x9f\xea\xc6\xa7\x16\xf1\xaf\xf7\xe3\xdf\x48\xe2\xdf\x54\xf8\x37\xdb\xf0\x13\xc5\xf8\x89\x59\xfc\x5b\x3d\xf8\xb7\xf3\xf0\x6f\x77\xe0\xdf\xa9\xc2\x4f\x36\xe1\x27\x27\xf1\xef\xe6\xe2\xdf\xad\xc4\xbf\xbb\x88\x7f\x6f\x11\xff\xfe\x08\x7e\xaa\x04\x3f\x35\x87\xff\x60\x18\xff\xe1\x18\xfe\xa3\x46\xfc\x74\x01\xfe\x63\xf0\x1f\xa7\xf0\x9f\x74\xe1\x3f\xad\xc2\xcf\xe4\xe0\x67\xba\xf0\x33\xf3\xf8\xcf\x86\xf0\x9f\x97\xe1\x3f\x4f\xe1\xbf\xa8\xc7\x7f\xd1\x83\x9f\x2d\xc4\xcf\x8e\xe0\xbf\x2c\xc6\x7f\x39\x86\xff\xaa\x14\xff\x55\x12\xff\x75\x23\xfe\xeb\x34\x7e\xae\x19\xff\x8d\xc3\x7f\xd3\x85\xff\xb6\x03\xff\x5d\x27\x7e\xbe\x0f\x3f\x3f\x8b\xff\xbe\x00\xff\x7d\x0a\xff\x43\x36\xfe\x87\x7a\xfc\x8f\xb9\xf8\x1f\x3b\xf1\xe9\x08\x9f\x6e\xc1\xff\x94\x8d\xff\xa9\x0a\xff\xd3\x24\xfe\xe7\x5a\xfc\x2f\xd9\xf8\x5f\xc6\xf0\x0b\x3d\xf8\x5f\x15\xfe\xd7\x21\xfc\x6f\x8d\xf8\xdf\x6b\xf0\x99\x26\xfc\x1f\xa5\xf8\x3f\x26\xf0\x7f\x76\xe1\xff\x4c\xe1\xff\xea\xc6\x2f\x16\xe1\x17\x53\xf8\xbf\xdb\xf1\xff\xe4\xe1\xff\x19\xc6\xff\x5b\x8b\xff\x77\x8c\x40\x0d\x61\x89\x39\xc2\x52\x79\x84\xa5\xe6\x08\x59\x2d\x84\xa5\x23\xc2\xd2\x03\x84\xff\x55\x13\xfe\x97\x22\x2c\x93\x45\x58\xa6\x95\x90\x5d\x44\xc8\xee\x21\x2c\x9b\x4d\x58\xb6\x87\xb0\x7c\x21\x61\xf9\x69\x42\xce\x3c\x61\x85\x0c\x61\xc5\x29\xc2\x4a\x63\x84\xdc\x3e\xc2\xca\xad\x84\x55\x6a\x09\xab\x2c\x12\x56\x1d\x22\xe4\xb5\x12\x56\xcb\x27\xac\x96\x22\xac\x5e\x4a\x58\xa3\x89\x10\x55\x11\xa2\x71\x82\x68\x20\xc8\x42\x42\x3c\x4a\x50\xf9\x04\xfd\x9f\x45\x82\xe9\x23\xd8\x22\x82\x9d\x27\xb8\x3a\x82\x1b\x26\xf8\x1c\x82\xef\x24\x84\x1a\x42\x02\x42\xa2\x9e\x90\x98\x25\xe4\x17\x13\xf2\xbb\x09\xf9\x19\xc2\x9a\x3d\x84\xb5\xca\x08\x6b\xe7\x13\xd6\xee\x23\x14\xd4\x13\x0a\x16\x08\xeb\xcc\x13\xd6\xad\x21\xac\x57\x4b\x28\x84\x50\xd8\x43\xd8\x40\x11\x36\xac\x20\x6c\xb8\x48\xd8\xa8\x80\xb0\x51\x3d\x61\xe3\x2a\xc2\xc6\x0b\x84\x4d\x66\x09\xc5\x7d\x84\x4d\x1b\x09\x9b\x35\x11\x36\x57\x84\xcd\x07\x09\x25\x7d\x84\x2d\x2a\x08\x5b\x16\x12\xb6\x9c\x26\x6c\xd5\x49\x28\x2d\x23\x94\xce\x13\xb6\x1e\x20\x6c\x93\x4b\xd8\xa6\x99\xb0\xcd\x04\x61\xdb\x12\xc2\xb6\x63\x84\xb2\x2a\x42\xd9\x38\x61\xbb\x6a\xc2\xf6\x15\x84\xed\xe7\x09\x3b\xb4\x10\xca\xcb\x08\x3b\x66\x13\x76\xec\x27\xec\x94\x4f\xd8\xa9\x81\xb0\x73\x44\xa8\xf8\xcf\x1c\x61\x57\x08\xbb\xe5\x12\x2a\xb3\x08\x95\x8d\x84\xca\x14\x61\xf7\x26\xc2\x1e\xe5\x84\x3d\x46\x09\x7b\xf6\x10\xaa\x3a\x09\x7b\x55\x11\xf6\xfe\xcf\x08\x61\x9f\x42\xc2\x3e\x43\x84\xea\x0a\xc2\xbe\xd9\x84\x7d\x3b\x09\xfb\xce\x10\xf6\x2b\x20\xec\xd7\x47\xd8\xbf\x92\xb0\xff\x28\xa1\x26\x8f\x50\xd3\x44\xa8\x49\x11\x0e\x28\x23\x1c\x08\xe1\xc0\x4e\xc2\x41\x55\x84\x83\x26\x09\xb5\x75\x84\xda\x39\xc2\xc1\x8d\x84\x43\x72\x09\x87\x8c\x13\x0e\x2d\x23\xd4\x65\x13\xea\xfa\x08\x87\xb5\x11\x0e\x1b\x23\x1c\xde\x4e\x38\x7c\x98\x70\x84\x22\x1c\x91\x24\x1c\x31\x47\xa8\xaf\x22\xd4\x0f\x10\x8e\x6c\x25\x1c\xb9\x48\x38\xaa\x8a\x70\xd4\x30\xe1\xe8\x32\xc2\xd1\x23\x84\x86\x52\x42\x43\x2f\xe1\x98\x3c\xc2\x31\x6d\x84\x63\x0b\x08\xc7\xf6\x12\x8e\x9d\x22\x1c\xa7\x08\x8d\xff\x99\x25\x1c\x5f\x4c\x38\x7e\x90\x70\x42\x36\xe1\x84\x3a\xc2\x09\xc3\x84\x13\xd2\x84\x13\x2b\x08\x4d\x35\x84\xa6\x0c\xe1\xa4\x02\xc2\xc9\x39\x84\x93\x47\x09\xa7\x0c\x13\x9a\x1b\x08\xcd\xf3\x84\x53\xab\x09\xa7\xf6\x11\x4e\xcb\x26\x9c\x56\x4b\x38\xad\x93\x70\xda\x04\xe1\xf4\x3c\xc2\xe9\xcd\x84\xd3\xe7\x09\x67\x14\x13\xce\x4c\x12\xce\x8a\x08\x67\x75\x12\xce\x5a\x24\xb4\x36\x12\x5a\xe7\x08\x67\x37\x10\xce\x1e\x21\x9c\x53\x48\x38\xa7\x87\x70\xce\x3c\xe1\xdc\x1a\xc2\xb9\x43\x84\x64\x44\x48\x26\x09\xc9\x11\x42\x32\x43\x38\xaf\x98\x70\x5e\x3b\xe1\xbc\x0c\xe1\xfc\x46\xc2\xf9\x7d\x84\xf3\xa7\x09\x17\x14\x10\x2e\x68\x26\x5c\x30\x4a\x68\xcb\x21\xb4\xb5\x10\xda\x26\x08\x17\x3a\xc2\x85\x4d\x84\x0b\x47\x09\x17\xe5\x12\x2e\xea\x24\x5c\xb4\x40\xb8\xd8\x11\x2e\x9e\x26\xb4\x57\x13\x2e\xa9\x21\x5c\x32\x4a\xb8\x74\x94\x70\xd9\x18\xa1\x63\x98\x70\x79\x15\xe1\xf2\x31\xc2\x15\x0d\x84\x2b\x21\x5c\x39\x4c\xe8\x6c\x27\x5c\x55\x45\xb8\x6a\x81\x70\xf5\x38\xe1\x9a\x7c\x42\x57\x36\xa1\x2b\x4d\xb8\xb6\x9f\x70\x5d\x16\xe1\xba\x2e\xc2\xf5\xf5\x84\xee\x6a\xc2\x0d\x05\x84\x1b\xd2\x84\x1b\xdb\x08\x37\xe5\x11\x6e\x6a\x20\xdc\x34\x42\xb8\x39\x87\x70\x4b\x2e\xe1\x96\x69\xc2\xad\xf3\x84\xde\x69\xc2\x6d\x63\x84\xdb\xc7\x09\x77\xb4\x10\xfa\xea\x08\x77\x16\x10\xee\x4c\x13\xee\x1a\x27\xdc\x3d\x4c\xe8\xef\x25\xdc\xd3\x44\xb8\xb7\x80\x70\x6f\x86\x70\xdf\x38\x61\x60\x94\x70\x7f\x1f\xe1\x81\x1a\xc2\x83\xd9\x84\x07\x07\x08\x83\xbd\x84\x87\xca\x08\x0f\xe7\x10\x1e\x9e\x21\x3c\xd2\x44\x18\x2a\x26\x0c\x0d\x12\x1e\xad\x26\x3c\x96\x45\x78\x6c\x92\xf0\x78\x0f\x61\xb8\x98\x30\xdc\x4f\x78\xa2\x90\xf0\x44\x27\xe1\xc9\x1a\xc2\x93\x73\x84\xa7\x7a\x09\x23\x55\x84\x91\x09\xc2\xd3\xcd\x84\xa7\xa7\x09\xcf\x3a\xc2\xa8\x22\x3c\x97\x4f\x78\x6e\x92\xf0\x7c\x0b\xe1\xf9\x59\xc2\x0b\x55\x84\x17\x46\x08\x63\x8d\x84\x17\x0b\x09\x2f\x0e\x10\x5e\x9a\x23\xbc\xdc\x49\x18\x2f\x24\x8c\xa7\x08\xaf\x4c\x13\x5e\xcb\x23\xbc\x36\x4f\x48\x4d\x10\x5e\x2f\x23\xbc\x3e\x4f\x78\x23\x49\x78\xb3\x91\xf0\xe6\x34\x61\xa2\x92\x30\x31\x41\x78\xab\x9c\xf0\x36\x84\xb7\xfb\x09\xef\xb4\x11\x26\x4b\x09\x93\x33\x84\x77\x3b\x08\xef\x39\xc2\x7b\xed\x84\xf7\x32\x84\xf7\xbb\x08\x53\x05\x84\xa9\x0e\xc2\x54\x9a\xf0\x41\x17\xe1\x43\x08\x1f\x56\x13\x3e\x9c\x20\x7c\x34\x41\x98\x6e\x27\x7c\x9c\x43\xf8\xb8\x97\xf0\x49\x15\xe1\x93\x45\xc2\xa7\x49\xc2\xa7\x53\x84\x99\x3a\xc2\xcc\x24\xe1\xf3\x1c\xc2\x17\x55\x84\x2f\xc6\x09\xb3\x8d\x84\x2f\x5b\x09\x5f\xb5\x11\xbe\x9a\x21\x7c\x5d\x4c\xf8\x7a\x86\x30\x57\x4a\x98\x4b\x11\xbe\x99\x26\x7c\x3b\x4d\xf8\x6e\x8a\x30\x5f\x4e\x98\x1f\x27\x7c\x3f\x4e\xf8\xa1\x84\xf0\xc3\x14\xe1\xc7\x0a\xc2\x8f\x63\x84\x74\x05\x21\x3d\x40\xf8\xa9\x8c\xf0\x73\x0e\xe1\xe7\x2a\xc2\xcf\x13\x84\x5f\x66\x08\x0b\x75\x84\x85\x45\xc2\xaf\x6d\x84\x5f\x07\x08\xbf\x95\x10\x7e\x6b\x22\xfc\xd6\x4f\xf8\x6d\x86\xf0\xbb\x22\x64\xf2\x08\x99\x45\xc2\x1f\x29\xc2\x9f\xd9\x84\x3f\x9b\x08\x7f\xf6\x13\xfe\x2a\x23\xfc\x35\x43\x58\x4c\x13\xfe\x2e\x23\xfc\x3d\x44\xf8\xa7\x92\xf0\xcf\x0c\xe1\xdf\x4a\xc2\xbf\xbd\x84\x7f\x27\x49\x90\x4d\x82\x24\x09\x66\x49\x2c\x51\x4b\x62\xc9\x6c\x12\x4b\x76\x92\x58\x32\x4d\x62\xa9\x46\x12\x59\xe5\x24\xb2\xa6\x49\x2c\x3d\x41\xe2\x7f\x23\x24\x96\x69\x23\x91\x5d\x49\x62\x59\x45\x62\xb9\x7c\x12\xcb\xa5\x48\x2c\x5f\x47\x62\xf9\x05\x12\x39\x95\x24\x72\xfa\x49\xac\x50\x46\x62\x85\x3e\x12\x2b\x42\x62\xc5\x5a\x12\x2b\xd5\x90\x58\x69\x8a\x44\x6e\x0d\x89\xdc\x49\x12\x2b\xd7\x93\x58\x79\x81\xc4\x2a\xed\x24\x56\xad\x22\x91\x57\x4d\x62\xb5\x5a\x12\xab\x57\x93\x58\xa3\x9f\x44\x54\x4d\x22\x5a\x20\x21\x5a\x49\xc8\x2c\x12\xb2\x86\x84\x9c\x21\x11\x0f\x92\x50\xbd\x24\x74\x29\x09\x53\x42\xc2\x2a\x12\xae\x82\x84\xaf\x27\x11\xf2\x49\x84\x14\x89\xc4\x10\x89\xfc\x11\x12\x6b\xb6\x90\x58\xcb\x91\x58\x3b\x8f\xc4\xda\x6d\x24\x0a\xca\x48\x14\x64\x48\xac\x33\x47\x62\xdd\x29\x12\xeb\xd5\x93\x28\xac\x24\xb1\xbe\x22\xb1\x41\x1e\x89\x0d\xda\x48\x6c\x98\x43\x62\xc3\x3a\x12\x1b\x66\x48\x14\xf5\x92\x28\x4a\x93\xd8\xa8\x96\xc4\x46\xc3\x24\x36\x2e\x25\xb1\xf1\x28\x89\x4d\xf2\x49\x6c\xd2\x4f\xa2\x18\x12\x9b\xe6\x92\xd8\x74\x96\xc4\x66\x1d\x24\x36\x4f\x92\x28\x51\x24\x4a\xc6\x48\x6c\xd1\x4c\x62\xcb\x32\x12\x5b\x66\x48\x6c\x35\x48\xa2\x34\x8f\x44\x69\x07\x89\xad\xcb\x48\x6c\xbd\x40\x62\x9b\x42\x12\xdb\xf4\x93\xd8\xb6\x92\x44\x59\x11\x89\xed\x9a\x48\x6c\x5f\x43\x62\xfb\x49\x12\x3b\x34\x91\xf8\x3f\x45\xf1\x1f\xd6\xfc\xd4\x00\x70\xf8\x83\x10\x42\x08\x21\xde\xf8\x9e\xdf\xe7\x3c\x84\x10\xc2\x10\x42\x08\x21\x0c\x21\x84\x10\x86\x10\x42\x08\x21\x84\x21\x0c\x21\x84\x30\x84\x61\x18\x42\x08\x21\x84\x10\x42\xc8\x23\x84\xf0\x5e\xfe\xb8\xaf\x7b\xc7\x59\xa2\xaa\x26\xa2\x9d\x4a\x88\x76\x6a\x23\xda\x69\x86\x68\xe7\x7a\xa2\x5d\xea\x89\xaa\xe3\x44\xbb\x36\x10\xed\xd6\x44\xb4\x7b\x3b\x51\x4d\x35\x51\x4d\x1f\xd1\x1e\x6d\x44\x7b\x96\x12\xed\xd9\x43\xb4\x57\x01\xd1\x5e\x23\x44\xb5\xa5\x44\xb5\x09\xa2\xbd\x2b\x89\xf6\xc9\x27\xda\x67\x94\x68\xdf\x24\xd1\xbe\x23\x44\x75\xa5\x44\x75\x09\xa2\xba\x39\xa2\xfd\xfa\x88\xf6\xcf\x10\x1d\x30\x4a\x54\x1f\x88\xea\x73\x44\x07\x15\x13\x1d\xdc\x44\x74\xf0\x2c\x51\x3c\x47\x74\x48\x3b\xd1\xa1\x79\x44\x87\xb6\x11\x1d\x3a\x47\x74\x58\x2b\xd1\x61\x73\x44\x0d\x86\xa8\x61\x94\xe8\xf0\x31\xa2\x23\xf3\x89\x8e\x9c\x22\x6a\x9c\x22\x3a\xaa\x9d\xe8\xe8\x12\xa2\xa3\x07\x89\x8e\xa9\x25\x3a\x26\x47\xd4\x14\x23\x6a\x9a\x25\x3a\xb6\x8e\xe8\xb8\x7c\xa2\xe3\x86\x88\x8e\x37\x44\xc7\x37\x13\x1d\x3f\x4a\xd4\x5c\x43\xd4\x3c\x49\x74\x42\x35\xd1\x09\x43\x44\x27\xcc\x10\x9d\x18\x23\x3a\xa9\x84\xa8\xa5\x80\xa8\x65\x8a\xe8\xe4\x14\xd1\x29\x71\xa2\x53\x8b\x89\x12\xc5\x44\xa7\xfd\x27\x43\x74\xfa\x30\xd1\x19\xad\x44\xad\x25\x44\xad\x5d\x44\xad\x19\xa2\xd6\x19\xa2\x33\x13\x44\x67\xf6\x11\x9d\x39\x46\x74\x56\x1e\xd1\x59\x93\x44\x67\x17\x12\x9d\x1d\x23\x3a\x7b\x96\xa8\xad\x9b\xa8\x2d\x4b\xd4\x36\x4b\x74\x8e\x20\x3a\xa7\x9e\xe8\x9c\x2e\xa2\x73\x8b\x89\xce\x4d\x10\x9d\x57\x48\x74\x5e\x25\x51\x7b\x09\x51\x7b\x82\xe8\xfc\x06\xa2\x0b\x2a\x89\x2e\xec\x24\xba\x70\x8a\xa8\x63\x98\xe8\xa2\x4a\xa2\x8b\xba\x88\x2e\xee\x24\xba\x38\x47\x74\x49\x15\xd1\x25\x93\x44\x9d\xad\x44\x9d\x19\xa2\x4b\x07\x89\x2e\xab\x24\xba\x6c\x90\xe8\xf2\x4e\xa2\xae\x06\xa2\x2b\xea\x89\xae\xcc\x23\xba\x72\x88\xe8\xaa\x14\xd1\x55\x0b\x44\xdd\xed\x44\x57\x97\x10\x5d\x3d\x41\x74\x4d\x2b\xd1\x35\xd3\x44\xd7\xd6\x11\x5d\x3b\x46\xd4\xd3\x42\x74\x5d\x21\xd1\xf5\xc5\x44\x37\x08\xa2\x1b\x32\x44\xc9\x61\xa2\x9b\xf2\x89\x6e\x8e\x11\xf5\xb6\x10\xdd\xd2\x44\x74\x6b\x03\xd1\x6d\x25\x44\xb7\x25\x89\x52\x85\x44\xa9\x0e\xa2\xd4\x34\xd1\xed\x86\xe8\xf6\x09\xa2\x3b\x32\x44\x77\xd6\x12\xdd\x39\x4d\xd4\x97\x22\xba\xab\x9c\xe8\xae\x39\xa2\xbb\x87\x89\xee\x29\x23\xba\xa7\x87\xe8\x9e\x79\xa2\xfe\x5a\xa2\xfe\x7e\xa2\x7b\xf3\x88\xee\x6d\x26\xba\x37\x43\x74\xef\x1c\xd1\x7d\xf5\x44\xf7\x65\x88\xee\xaf\x23\xba\xbf\x8f\x68\xa0\x84\x68\xa0\x85\x68\x60\x98\xe8\x81\x6a\xa2\x07\xd2\x44\x0f\x76\x13\x3d\x94\x4f\xf4\x50\x9c\xe8\xa1\x41\xa2\xc1\x2e\xa2\x87\x03\xd1\x23\x81\xe8\xd1\x52\xa2\x74\x3e\x51\x3a\x49\xf4\x58\x39\xd1\x63\x13\x44\x8f\xb7\x10\x3d\x3e\x49\xf4\x44\x19\xd1\x13\x0b\x44\x43\xe3\x44\x4f\x4e\x12\x3d\xd5\x43\xf4\x74\x03\x51\xa6\x8c\xe8\x99\x56\xa2\x67\xc6\x89\x9e\xed\x26\x7a\xae\x9a\xe8\xb9\x01\xa2\x6c\x21\x51\x76\x94\xe8\xf9\x7a\xa2\xe7\x07\x88\x5e\x28\x21\x7a\x21\x41\xf4\xc2\x34\xd1\x8b\x29\xa2\x5c\x03\xd1\x4b\x10\xbd\xd4\x47\xf4\x72\x23\xd1\xcb\xa3\x44\xaf\xf4\x12\x0d\x37\x10\x0d\xcf\x12\xbd\xda\x4c\xf4\x5a\x2d\xd1\xeb\x31\xa2\xd7\x67\x89\x46\x06\x89\xde\x48\x12\xbd\xd9\x40\xf4\x56\x01\xd1\x5b\xfd\x44\xa3\x29\xa2\xb7\x5b\x89\xde\x29\x24\x7a\x67\x90\xe8\xdd\x4a\xa2\x77\x73\x44\x63\xa5\x44\x63\x5d\x44\xef\xc5\x88\xde\x1b\x23\x7a\xbf\x9b\xe8\x83\x12\xa2\x0f\x5a\x88\x3e\x48\x13\x8d\x57\x11\x8d\x8f\x11\x7d\x58\x46\xf4\x61\x07\xd1\x87\x93\x44\x1f\xa5\x89\x3e\x2e\x22\xfa\x38\x4e\xf4\xf1\x08\xd1\x44\x8c\x68\x62\x90\xe8\x13\x41\xf4\x49\x1d\xd1\xa7\x9d\x44\x9f\x95\x11\x7d\x36\x46\x34\x59\x47\x34\xd9\x4f\xf4\x79\x0d\xd1\xe7\x7d\x44\x5f\xd4\x10\x7d\x59\x4a\xf4\x65\x96\x68\xaa\x9a\x68\x6a\x90\xe8\xab\x12\xa2\xaf\x3a\x89\xbe\x9a\x22\xfa\xba\x92\xe8\xeb\x2c\xd1\x37\x35\x44\xdf\xf4\x13\x4d\x97\x10\x7d\x5b\x43\xf4\x6d\x92\xe8\xbb\x2e\xa2\xef\x5b\x89\x66\xe2\x44\x3f\x14\x13\xfd\x90\x23\xfa\xb1\x81\xe8\x27\x88\x7e\x4a\x11\xfd\x34\x43\x34\xdb\x4b\xf4\x73\x19\xd1\xcf\x6d\x44\x8b\x03\xd1\xe2\x4e\xa2\x5f\xca\x89\x7e\x19\x20\x9a\xeb\x24\xfa\xb5\x95\xe8\xb7\x52\xa2\xdf\xf3\x88\x7e\x1f\x22\x9a\x8f\x11\xcd\x67\x88\xfe\xa8\x24\xfa\x63\x81\xe8\xcf\x56\xa2\xbf\x3a\x88\x16\xf2\x88\x16\xa6\x89\xfe\x4e\x11\xfd\x13\x27\xfa\x27\x43\xf4\x6f\x9c\xe8\xdf\x61\x04\x35\x08\xfa\x10\x4b\x94\x22\x96\x68\x42\x2c\x31\x8d\x58\xb2\x1a\xb1\xe4\x10\x62\x29\x83\x58\x2a\x81\xc8\xeb\x46\xe4\x4d\x22\x96\x4e\x20\x96\xc9\x20\x96\x1d\x42\xe4\xa7\x11\xcb\x65\x10\xcb\xa7\x11\x2b\x8c\x22\x56\xac\x42\xac\xd4\x85\x58\x39\x8b\x28\x9c\x47\xac\xd2\x83\x58\xb5\x0f\xb1\x5a\x06\x51\x34\x86\x58\x7d\x0c\xb1\xc6\x2c\x62\xcd\x21\x44\xf1\x34\x62\xad\x5e\xc4\xda\x45\x88\x75\x8a\x11\xeb\xcc\x23\x4a\x72\x88\x75\x87\x11\xeb\x8d\x20\xfe\x37\x86\x58\x3f\x86\xd8\xa0\x12\xb1\xc1\x24\x22\x9a\x42\x88\x41\x84\x4c\x21\x54\x27\x42\xd7\x22\x4c\x1e\xc2\xf4\x23\x6c\x0b\xc2\x35\x20\x7c\x31\xc2\x8f\x20\x42\x27\x62\x51\x13\x62\x43\x81\xd8\x70\x0a\xb1\xd1\x00\xa2\xac\x13\xb1\x71\x0f\x62\x93\x51\xc4\xa6\x29\x44\x79\x29\x62\xb3\x52\xc4\xe6\x25\x88\xcd\xe7\x10\x5b\x74\x23\x2a\x3a\x10\x5b\x56\x23\xb6\xca\x47\x6c\x35\x89\xd8\x3a\x8b\xa8\x1c\x42\x6c\x93\x44\x6c\xdb\x82\xd8\x2e\x20\x62\xff\x19\x45\x6c\x3f\x84\xd8\x21\x86\xd8\xb1\x18\xb1\x63\x07\xa2\xaa\x04\x51\x95\x41\xec\xd4\x86\xd8\xd9\x20\x76\x4e\x21\x76\xa9\x44\xec\x32\x83\xa8\x1e\x40\xec\x5a\x8f\xd8\x75\x01\xb1\x5b\x27\x62\xf7\x72\xc4\xee\x93\x88\x9a\x14\x62\x0f\x83\xd8\x63\x02\xb1\x67\x3d\x62\xaf\x7c\xc4\x5e\x8d\x88\xbd\x32\x88\xda\x26\x44\xed\x04\x62\xef\x04\x62\xef\x59\xc4\x3e\x19\xc4\xbe\xad\x88\xba\x18\x62\xbf\x4a\xc4\xfe\x02\x71\x40\x31\xe2\x80\x34\xa2\x3e\x89\x38\x30\x81\x38\xa8\x12\x71\x70\x1e\xe2\xe0\x31\x44\x7c\x0c\x71\x48\x17\xe2\xd0\x1a\xc4\xa1\x33\x88\xc3\x52\x88\x86\x31\xc4\xe1\x19\xc4\x11\xdd\x88\x23\x16\x10\x47\xd6\x20\x8e\x4c\x21\x8e\x9c\x43\x34\x76\x22\x1a\xc7\x11\x47\x35\x20\x8e\x1a\x45\x1c\x9d\x41\x1c\x53\x83\x38\x66\x18\xd1\x54\x8c\x68\xaa\x47\x1c\x9b\x8f\x38\xf6\xbf\x07\x10\xc7\x81\x38\xae\x09\x71\xdc\x30\xe2\xf8\x72\xc4\xf1\x39\x44\x73\x35\xa2\x39\x89\x68\x1e\x43\x9c\x10\x43\x9c\x30\x80\x38\xb1\x1a\x71\xe2\x24\xe2\xa4\x7a\xc4\x49\x93\x88\x96\x3a\x44\x4b\x12\xd1\x32\x8b\x38\xb9\x05\x71\x4a\x1e\xe2\x94\x38\xe2\x94\x24\xe2\x94\x05\xc4\xa9\xb5\x88\x53\x93\x88\x44\x1e\x22\xd1\x86\x48\x0c\x21\x4e\x4b\x21\x4e\xef\x46\x9c\xd1\x81\x68\x2d\x47\x9c\xf9\x9f\x0c\xe2\xac\x2a\xc4\x59\x0b\x88\xb3\x13\x88\xb3\xe7\x10\x6d\x6d\x88\xb6\x29\xc4\x39\xd3\x88\x73\xd3\x88\xf3\x12\x88\xf3\x66\x10\xed\xad\x88\xf6\x0c\xe2\xfc\x1e\xc4\x05\x95\x88\x0b\xa6\x10\x17\xf6\x20\x3a\xda\x11\x17\xc5\x11\x17\x0b\xc4\x25\x35\x88\xce\x02\xc4\xa5\x85\x88\x4b\x47\x11\x97\x0d\x23\x2e\x6f\x46\x74\x75\x20\xae\xa8\x43\x5c\xd1\x8f\xb8\xb2\x01\x71\x95\x40\x5c\x35\x8e\xe8\x4e\x22\xae\x6e\x44\x5c\x3d\x83\xb8\x66\x00\x71\x6d\x1d\xa2\xa7\x0a\xd1\x33\x8f\xb8\x2e\x85\xb8\xbe\x16\x71\x43\x3d\x22\x99\x41\xdc\xb8\x80\xb8\xa9\x11\x71\xd3\x2c\xe2\xe6\x2e\x44\x6f\x05\xa2\x37\x89\xb8\xa5\x0b\x71\xcb\x1c\xe2\xd6\x0c\xe2\xb6\x38\x22\x15\x47\xdc\x5e\x8f\xb8\xa3\x1e\x71\xa7\x40\xdc\x99\x43\xf4\xf5\x20\xee\x6a\x41\xdc\x2d\x10\xf7\xe4\x21\xee\x19\x40\xf4\x57\x22\xfa\x73\x88\x7b\x1b\x11\xf7\x4e\x20\xee\x0b\x88\xfb\xfa\x10\xf7\x57\x22\xee\x1f\x42\x0c\x64\x11\x0f\x0a\xc4\x43\x7d\x88\xc1\x0e\xc4\xc3\x71\xc4\x23\xf5\x88\x47\x7b\x10\xe9\x38\x22\x9d\x45\x3c\x96\x40\x3c\x36\x89\x78\x02\xc4\x13\x23\x88\xa1\x24\xe2\xc9\x4e\xc4\x53\xed\x88\xa7\x66\x10\x4f\xd7\x23\x32\x20\x32\xfd\x88\x67\xca\x11\xcf\x4c\x20\x9e\x6d\x45\x3c\x57\x88\x78\x6e\x00\x91\x6d\x44\x64\xe7\x10\xcf\x37\x21\x5e\x28\x46\xbc\x30\x8c\x78\x31\x86\x78\x71\x06\x91\xeb\x43\xe4\xc6\x10\x2f\x05\xc4\x4b\x43\x88\x97\x05\xe2\xe5\x1e\xc4\x2b\xa5\x88\x57\xfa\x10\xc3\x01\x31\x9c\x46\xbc\x5a\x8a\x78\xb5\x0b\xf1\xea\x02\xe2\xb5\x26\xc4\x6b\x63\x88\xd7\x2b\x11\xaf\x0f\x20\x46\x4a\x11\x23\xbd\x88\x37\x40\xbc\xd1\x8e\x78\x63\x16\xf1\x66\x3b\xe2\xad\x02\xc4\x5b\xdd\x88\x51\x83\x18\xcd\x20\xde\xae\x44\xbc\x9d\x41\xbc\x53\x81\x78\xa7\x1b\xf1\xce\x2c\xe2\xdd\x1a\xc4\xbb\x03\x88\xb1\x7c\xc4\x58\x0b\x62\x6c\x1c\xf1\x5e\x0c\xf1\xde\x00\xe2\xfd\x80\x78\x3f\x89\xf8\xa0\x06\x31\x5e\x84\x18\xcf\x20\x3e\xcc\x22\x3e\x6a\x45\x7c\x6c\x10\x1f\xe7\x10\x13\x55\x88\x89\x14\xe2\x93\x0a\xc4\xa7\xad\x88\xcf\x9a\x11\x93\x09\xc4\x64\x1a\xf1\xf9\x04\xe2\xcb\x02\xc4\x97\x73\x88\xa9\x51\xc4\x57\x29\xc4\xd7\x69\xc4\x37\xdd\x88\xe9\x04\xe2\xdb\x62\xc4\x77\x35\x88\xef\x4b\x10\xdf\x4f\x21\x66\x7a\x10\x3f\x54\x21\x7e\xcc\x43\xfc\xd8\x89\xf8\x31\x87\xf8\xa9\x1c\x31\xdb\x8d\xf8\xb9\x1e\xb1\xb8\x18\xb1\x78\x04\xf1\x4b\x07\x62\xae\x1d\xf1\x6b\x0c\xf1\xeb\x14\xe2\xb7\x29\xc4\xef\x13\x88\xf9\x24\xe2\x8f\x80\xf8\x23\x87\xf8\xb3\x16\xf1\xe7\x02\xe2\xaf\x69\xc4\xc2\x00\xe2\xef\x72\xc4\xdf\x39\xc4\x3f\x65\x88\x7f\x0d\xe2\xdf\x34\x12\x83\x24\x8d\x5c\x42\x20\x97\xe8\x44\x2e\x31\x8f\x5c\xb2\x09\xb9\x54\x1e\x72\xa9\x46\xe4\x52\x33\xc8\xbc\x52\x64\x5e\x12\xb9\x34\xc8\xa5\x6b\x91\xcb\x14\x20\x97\xc9\x20\x97\xed\x44\xe6\x27\x90\xcb\x95\x23\x97\x1b\x41\x2e\x9f\x42\xae\xd0\x84\x2c\x08\xc8\x82\x51\xe4\x8a\x1d\xc8\x95\xfa\x91\x2b\x0f\x21\x57\x01\xb9\xca\x34\x72\xd5\x01\xe4\x6a\xc5\xc8\xd5\x52\xc8\xa2\x32\x64\xd1\x08\x72\xf5\x4e\xe4\x1a\xa5\xc8\x35\x86\x90\x6b\xd6\x20\xd7\x5c\x40\x16\x77\x23\xd7\x2a\x46\xae\x35\x8f\x5c\xbb\x0f\xb9\x4e\x1d\x72\x9d\x71\x64\x49\x07\xb2\x64\x1e\xb9\x6e\x33\x72\xdd\x0c\x72\xbd\x32\xe4\x7a\x03\xc8\xf5\xa6\x91\xff\x2b\x41\xfe\x6f\x02\x59\xda\x87\x5c\xbf\x12\xb9\xfe\x20\x72\x03\x90\x1b\xd4\x21\x37\x18\x42\x46\x02\x29\x02\x52\x96\x23\x55\x39\x52\x17\x20\x8d\x40\xda\xff\xcc\x20\xdd\x00\xd2\x77\x20\x43\x16\xb9\x28\x8d\xdc\x70\x08\xb9\x51\x1f\xb2\xac\x07\x59\x36\x83\xdc\xb8\x0c\xb9\xf1\x34\x72\x93\x09\xe4\xa6\x43\xc8\xf2\x06\xe4\x66\x79\xc8\xcd\x26\x90\x9b\xf7\x20\xb7\xe8\x43\x56\x34\x23\xb7\xac\x45\x6e\x05\x72\xab\x39\xe4\xd6\x19\x64\x65\x25\xb2\xb2\x13\x59\x39\x86\xdc\xa6\x17\xb9\x6d\x01\x72\xdb\x29\xe4\x76\x19\x64\x6c\x12\xb9\x7d\x0a\xb9\x43\x25\x72\x87\x59\xe4\x8e\xad\xc8\xaa\x12\x64\xd5\x08\x72\xa7\x24\x72\xe7\x80\xdc\x79\x10\xb9\x4b\x1c\x59\x5d\x80\xac\xae\x47\x56\x67\x91\xbb\x26\x90\xbb\xf6\x23\x77\x9d\x42\xee\x56\x8d\xdc\x2d\x87\xdc\xbd\x18\xb9\x7b\x0a\x59\x53\x8c\xac\xc9\x20\xf7\x28\x46\xee\x91\x41\xee\x39\x80\xdc\xab\x05\x59\x0b\xb2\xb6\x1f\xb9\x77\x1e\x72\xef\x26\xe4\x3e\xc5\xc8\x7d\x52\xc8\x7d\x0b\x91\xfb\xf6\x21\xeb\x0c\xb2\xae\x0f\xb9\x5f\x1a\xb9\x7f\x37\xf2\x80\x72\xe4\x01\x0b\xc8\xfa\x61\xe4\x81\x4d\xc8\x83\x4a\x90\x07\xb5\x20\x0f\x1a\x43\x1e\x1c\x90\x07\x77\x23\xe3\xa3\xc8\x43\x2b\x90\x87\x4e\x23\x0f\x9b\x46\x36\x64\x90\x87\xa7\x91\x47\x24\x91\x47\x76\x21\x1b\xd3\xc8\xa3\x5a\x91\x47\xe7\x23\x8f\xee\x42\x1e\x3d\x8e\x3c\xa6\x1b\xd9\xd4\x84\x3c\xb6\x00\x79\x6c\x2f\xf2\xb8\x36\xe4\xf1\xe5\xc8\xe6\x7c\x64\x73\x0e\x79\x42\x2d\xf2\x84\x09\xe4\x89\x1d\xc8\x13\xa7\x90\x27\xc5\x91\x27\xe5\x90\x2d\x6d\xc8\x93\x03\xf2\xe4\x51\xe4\x29\x1d\xc8\x53\x3b\x91\x09\x83\x4c\xa4\x91\xa7\x09\xe4\x69\x93\xc8\xd3\xdb\x90\x67\x54\x20\xcf\x98\x43\xb6\x56\x20\x5b\x27\x90\x67\x36\x21\xcf\xca\x43\x9e\x35\x80\x3c\x5b\x20\xcf\xee\x42\xb6\x81\x6c\x6b\x43\x9e\x93\x87\x3c\xa7\x07\x79\x6e\x0c\x79\xee\x38\xf2\xbc\x5e\x64\x7b\x09\xb2\xbd\x1d\xd9\x3e\x8b\x3c\xbf\x01\x79\xfe\x04\xf2\x82\x38\xf2\xc2\x12\xe4\x85\xd3\xc8\x8e\x4e\xe4\x45\x15\xc8\x8b\xd2\xc8\x8b\xcb\x90\x17\x77\x22\x2f\x11\xc8\x4b\xc6\x90\x9d\x09\xe4\xa5\x79\xc8\x4b\x3b\x91\x97\xce\x20\x2f\x4b\x20\x2f\x2f\x47\x5e\x9e\x43\x76\x55\x23\xbb\xd2\xc8\x2b\x8a\x91\x57\xf4\x23\xaf\x34\xc8\x2b\xe7\x91\x57\xf5\x23\xbb\x5b\x91\xdd\x53\xc8\xab\x2b\x91\x57\x0f\x20\xaf\x69\x43\x5e\x33\x87\xbc\xb6\x12\x79\x6d\x0e\xd9\x93\x8f\xbc\xae\x06\x79\x7d\x1f\xf2\x86\x21\xe4\x8d\x01\x79\xe3\x1c\xf2\xe6\x0a\x64\x6f\x06\x79\x4b\x12\x79\xeb\x28\xf2\xb6\x41\x64\xaa\x1b\x79\x7b\x13\xf2\x0e\x81\xbc\xb3\x10\xd9\x57\x8d\xec\x9b\x42\xde\xd5\x86\xbc\x6b\x06\x79\x77\x06\x79\x4f\x37\xb2\xbf\x11\xd9\x3f\x8f\xbc\x77\x04\x79\x5f\x29\xf2\xbe\x1e\xe4\x7d\x33\xc8\xfb\x63\xc8\xfb\xfb\x90\x03\x20\x07\x3a\x91\x0f\x14\x22\x1f\x68\x46\x3e\x30\x8c\x7c\x50\x20\x1f\x6c\x43\x3e\x38\x86\x7c\xa8\x1b\x39\x58\x8f\x7c\x38\x20\x1f\x1e\x44\x3e\x92\x40\x3e\x5a\x87\x7c\x74\x01\x99\x1e\x47\x3e\x96\x46\x3e\x3e\x86\x7c\x62\x1c\x39\xd4\x87\x7c\xb2\x1b\xf9\x54\x33\xf2\xe9\x5a\x64\xa6\x06\xf9\x4c\x11\xf2\x99\x51\xe4\xb3\xfd\xc8\xe7\x1a\x90\xd9\x26\xe4\xf3\x69\xe4\x0b\xf5\xc8\x17\xc6\x90\x2f\x56\x22\x5f\x9c\x41\xe6\x06\x91\x2f\xb5\x22\x5f\x6e\x47\xbe\x52\x85\x1c\xce\x43\x0e\x4f\x22\x5f\xed\x40\xbe\x56\x86\x7c\x6d\x1c\xf9\x7a\x27\x72\x24\x86\x1c\x99\x43\xbe\x91\x41\xbe\xd9\x8a\x7c\xab\x18\xf9\xd6\x30\x72\xb4\x0d\xf9\x76\x29\xf2\xed\x7e\xe4\x3b\x15\xc8\x77\x46\x90\xef\xc6\x91\xef\x8e\x22\xc7\x5a\x91\xef\xc5\x90\xef\xcd\x23\xdf\xef\x45\x7e\x10\x90\x1f\xb4\x20\x3f\x98\x41\x8e\x37\x23\xc7\x67\x91\x1f\x36\x23\x3f\x9c\x43\x7e\xd4\x8a\xfc\x68\x1c\xf9\x71\x33\x72\xa2\x00\xf9\x49\x21\xf2\xd3\x0a\xe4\xa7\x33\xc8\xcf\xa6\x90\x93\x2d\xc8\xc9\x11\xe4\xe7\x06\xf9\xf9\x00\xf2\x8b\x52\xe4\x17\x19\xe4\x97\x02\xf9\x65\x02\x39\x25\x90\x53\x69\xe4\x57\x55\xc8\xaf\x66\x91\x5f\x77\x23\xbf\x31\xc8\x6f\x46\x90\xd3\x75\xc8\xe9\x19\xe4\xb7\xdd\xc8\xef\x4a\x90\xdf\x0d\x21\xbf\x6f\x43\xce\x94\x21\x67\xfa\x91\x33\xf3\xc8\x1f\x5a\x90\x3f\x4c\x21\x7f\x8c\x23\x7f\x9c\x43\xfe\x94\x40\xfe\x34\x86\x9c\xad\x44\xce\x26\x91\xb3\xe3\xc8\x9f\x4b\x90\x3f\xd7\x23\x7f\xce\x22\x17\x0b\xe4\xe2\x4e\xe4\xe2\x79\xe4\x2f\xf5\xc8\x5f\x26\x91\x73\x15\xc8\xb9\x11\xe4\xaf\x55\xc8\x5f\x33\xc8\xdf\xca\x91\xbf\xf5\x23\x7f\x2f\x41\xfe\xde\x83\x9c\x2f\x40\xce\x0f\x21\xff\x10\xc8\x3f\x7a\x90\x7f\x06\xe4\x9f\xf3\xc8\xbf\xfa\x91\x0b\x02\xb9\x30\x82\xfc\xbb\x1e\xf9\xf7\x24\xf2\x9f\x38\xf2\xdf\x02\xe4\xbf\x9d\x28\x1a\x51\x4c\xa3\x96\x68\x43\x2d\x99\x8f\x5a\xb2\x1b\xb5\x54\x31\x6a\xa9\x41\x54\x5e\x11\x2a\x6f\x00\xb5\x74\x39\x6a\xe9\x5e\xd4\x32\x01\xb5\x4c\x0f\x6a\xd9\x12\xd4\xb2\x1d\xa8\x65\x67\x51\xf9\x09\xd4\x72\xc5\xa8\xe5\x3a\x50\xcb\xcd\xa1\x96\xaf\x43\x2d\x9f\x46\xad\x10\x43\xad\x30\x8b\x2a\xe8\x40\xad\x58\x82\x5a\x31\x8b\x5a\xa9\x05\xb5\xd2\x02\x6a\xe5\x06\xd4\xca\x19\x54\x61\x15\xaa\x30\x89\x5a\xa5\x0c\xb5\x4a\x27\x6a\x55\x81\x5a\x35\x83\x5a\xad\x12\xb5\xda\x20\xaa\xa8\x1c\x55\x94\x42\xad\x9e\x8f\x5a\x3d\x81\x5a\x7d\x16\xb5\x46\x03\x6a\x8d\x11\xd4\x9a\xf3\xa8\xb5\x0a\x50\x6b\x37\xa1\xd6\xa9\x43\x95\xd4\xa1\xd6\x0d\xa8\xf5\x9a\x50\xff\xeb\x45\x95\x66\x50\xeb\xa7\x50\x1b\x74\xa1\xa2\x6a\x94\x28\x43\xc9\x72\x94\x2a\x47\xe9\x32\x94\x29\x44\x99\x7e\x94\x4d\xa1\x5c\x2b\xca\x17\xa3\x7c\x16\x15\x3a\x50\x8b\xea\x51\x1b\x96\xa3\x36\x9c\x45\x6d\xd4\x87\x2a\x6b\x46\x6d\x5c\x84\xda\x78\x12\xb5\x49\x3f\x6a\xd3\x6e\x54\x79\x12\xb5\x59\x3e\x6a\xb3\x41\xd4\xe6\x15\xa8\xcd\xb3\xa8\x2d\xaa\x50\x5b\x64\x50\x15\xf9\xa8\x8a\x6e\xd4\x96\x45\xa8\x2d\x7b\x51\x5b\xce\xa3\xb6\x6a\x45\x6d\x35\x8a\xda\xda\xa0\xb6\x4e\xa2\xb6\x5e\x40\x55\xb6\xa2\xb6\xa9\x44\x6d\xd3\x87\xda\xb6\x18\xb5\x6d\x27\x6a\xdb\x05\xd4\x76\xcd\xa8\xed\x46\x50\x31\x81\x8a\x0d\xa1\xb6\xaf\x45\x6d\x3f\x86\xda\xa1\x06\xb5\xc3\x30\x6a\xc7\x42\xd4\x8e\x4d\xa8\xaa\x24\x6a\xa7\x66\xd4\xce\x05\xa8\x9d\xc7\x50\xbb\x24\x50\xd5\x55\xa8\x5d\x2b\x50\xbb\xfd\x67\x18\xb5\x7b\x29\x6a\xf7\x09\x54\xcd\x30\x6a\x8f\x18\x6a\x8f\x24\x6a\xcf\x32\xd4\x9e\x3d\xa8\x3d\x67\x50\x7b\x55\xa1\xf6\x1a\x40\xd5\xe6\xa3\x6a\x7b\x50\xb5\x73\xa8\xbd\x53\xa8\xbd\xe7\x50\xfb\xd4\xa2\xf6\xc9\xa0\xf6\xad\x41\xed\x3b\x80\xaa\xcb\x47\xd5\x35\xa0\xea\xd2\xa8\xba\x39\xd4\x7e\xe5\xa8\xfd\x52\xa8\xfd\x0b\x51\xfb\x77\xa1\x0e\x10\xa8\x03\x7a\x51\xf5\x25\xa8\xfa\x76\xd4\x81\xd5\xa8\x83\x6a\x50\x07\xe7\xa3\xe2\xa0\xe2\x0b\xa8\x43\xd2\xa8\x43\x7b\x51\x87\xb5\xa3\x1a\x5a\x50\x87\xc7\x51\x47\x54\xa1\x8e\x34\xa8\xc6\x42\x54\xe3\x3c\xea\xa8\x39\xd4\xd1\x33\xa8\x63\x66\x50\x4d\xb3\xa8\x63\x3b\x51\xc7\x75\xa0\x8e\xef\x40\x35\xff\x67\x02\x75\x42\x1a\x75\x62\x17\xea\xa4\x02\xd4\x49\x53\xa8\x96\x1c\xea\xe4\x2e\xd4\x29\x2d\xa8\x53\x63\xa8\x44\x21\x2a\x31\x8e\x3a\x6d\x08\x75\xfa\x20\xea\x8c\x7e\x54\xeb\x20\xea\xcc\x0c\xea\xac\x2c\xea\xec\x5e\x54\xdb\x1c\xea\xdc\x4a\xd4\x79\xc5\xa8\xf3\xe6\x50\xe7\xe7\xa1\xce\x4f\xa0\x2e\x28\x42\x5d\x58\x88\xea\x28\x42\x5d\x54\x88\xba\xb8\x04\x75\x89\x41\x75\x96\xa3\x2e\x6d\x40\x5d\x56\x8e\xba\xac\x07\x75\xd9\x3c\xea\xf2\x06\xd4\xe5\x19\x54\x57\x09\xaa\xab\x1d\xd5\x35\x8d\xba\xa2\x16\x75\xc5\x10\xea\xca\x52\xd4\x95\x23\xa8\xab\x4a\x50\x57\x75\xa3\xba\x63\xa8\xee\x59\xd4\xd5\x7d\xa8\x6b\x04\xea\x9a\x7e\xd4\xb5\x01\x75\x6d\x1b\xea\xda\x79\x54\x4f\x0d\xaa\x27\x83\xba\x2e\x86\xba\x2e\x87\xba\xbe\x1a\x75\x7d\x0e\x75\xc3\x28\x2a\xd9\x82\xba\xb1\x04\x75\xe3\x30\xea\xa6\x56\xd4\xcd\x02\xd5\x0b\xea\x96\xff\x8c\xa2\x6e\x6d\x44\xdd\x26\x50\xb7\x8d\xa3\x52\x31\x54\x2a\x8b\xba\xdd\xa0\xee\x28\x43\xdd\x31\x8e\xba\xb3\x0b\xd5\x57\x89\xba\x2b\x1f\x75\xd7\x24\xea\xee\x0c\xea\x9e\x3a\xd4\x3d\xd3\xa8\xfe\x76\xd4\xbd\x45\xa8\x7b\xfb\x50\xf7\x95\xa1\xee\xcb\xa1\xee\xaf\x47\xdd\x3f\x83\x1a\xe8\x40\x3d\x50\x84\x7a\x20\x8b\x7a\xb0\x19\xf5\x50\x1e\xea\xa1\x24\x6a\x30\xa0\x06\xb3\xa8\x87\x6b\x51\x0f\xcf\xa3\x1e\xe9\x47\x3d\x5a\x8f\x4a\xe7\xa1\xd2\x43\xa8\xc7\x5a\x50\x8f\x97\xa2\x1e\x1f\x41\x3d\xd1\x83\x1a\xaa\x47\x3d\x59\x8c\x7a\x32\x83\x7a\xaa\x01\xf5\x74\x1e\xea\xe9\x71\x54\x26\x89\x7a\xa6\x11\xf5\x6c\x15\xea\xb9\x0a\x54\xb6\x00\x95\x1d\x47\x3d\x3f\x88\x7a\xa1\x13\xf5\x62\x15\x2a\x57\x86\x7a\xa9\x18\xf5\x52\x0a\xf5\x72\x3f\xea\x95\x16\xd4\x70\x02\xf5\x6a\x0b\xea\xb5\x56\xd4\xeb\x71\xd4\xeb\x23\xa8\x91\x0c\xea\x8d\x2c\xea\xcd\x61\xd4\x5b\x69\xd4\x68\x2f\xea\xed\x46\xd4\x3b\x06\xf5\xce\x38\xea\xdd\x62\xd4\xbb\x73\xa8\xb1\x1c\xea\xbd\x24\xea\xfd\x26\xd4\x07\x15\xa8\xf1\x02\xd4\x78\x0a\xf5\x61\x1c\xf5\x51\x31\xea\xa3\x09\xd4\xc7\x7d\xa8\x89\x46\xd4\x27\x45\xa8\x4f\x72\xa8\x4f\x5b\x50\x9f\x95\xa0\x3e\x1b\x42\x4d\x36\xa2\x3e\x2f\x44\x7d\x3e\x87\xfa\x52\xa0\xbe\x9c\x42\x4d\xf5\xa2\xbe\x6a\x47\x7d\x6d\x50\x5f\x8f\xa3\xbe\xe9\x40\x4d\x97\xa3\xa6\xfb\x50\xdf\x1a\xd4\x77\xe5\xa8\xef\xf3\x51\xdf\xcf\xa0\x66\xba\x51\x3f\x94\xa3\x7e\x98\x45\xfd\x38\x80\xfa\xa9\x11\x35\x5b\x8a\x9a\x9d\x40\xfd\xdc\x81\x5a\x1c\x50\x8b\x67\x51\xbf\xa4\x51\x73\x6d\xa8\xb9\x14\xea\xd7\x1a\xd4\xaf\x43\xa8\xdf\x4a\x51\xbf\xf5\xa3\x7e\xef\x44\xfd\x3e\x8f\x9a\x1f\x40\xfd\x61\x50\x7f\x06\xd4\x9f\x49\xd4\x5f\x79\xa8\xbf\x12\xa8\xbf\xa6\x51\x0b\x03\xa8\xbf\x5b\x50\xff\x94\xa3\xfe\x99\x44\xfd\xdb\x86\x46\xa0\x19\x47\x2f\xd1\x8d\x5e\xb2\x16\xbd\x54\x1e\x7a\xa9\x61\x74\x5e\x37\x7a\xe9\x5a\xf4\x32\xc5\xe8\x65\x26\xd0\xcb\xf6\xa2\xf3\xeb\xd0\xcb\x95\xa2\x97\x9b\x46\x2f\xdf\x8b\x5e\xa1\x0e\x5d\x50\x8c\x2e\x18\x47\xaf\x98\x44\xaf\x54\x83\x5e\x69\x0e\xbd\x72\x2f\x7a\xe5\x71\x74\x61\x31\xba\x70\x1e\xbd\xca\x18\x7a\xd5\x41\xf4\x6a\x9d\xe8\xa2\x46\xf4\xea\x31\xf4\x1a\xc5\xe8\x35\x16\xd0\x6b\x8e\xa3\x8b\x87\xd0\x6b\xf5\xa0\xd7\xae\x44\xaf\x3d\x8d\x5e\xa7\x13\x5d\xd2\x88\x5e\xb7\x12\xbd\x5e\x31\x7a\xbd\x05\xf4\xff\x46\xd1\xa5\x3d\xe8\xf5\xeb\xd0\xeb\x77\xa2\x37\xa8\x47\x47\x01\x1d\x4d\xa2\x45\x2f\x5a\xc6\xd1\xaa\x08\xad\x46\xd1\x3a\x89\x36\x2d\x68\x5b\x8d\x76\xa5\x68\x37\x83\xf6\x39\x74\x48\xa1\x17\xc5\xd1\x1b\x16\xa3\x37\x1c\x43\x6f\xd4\x8d\x2e\xab\x44\x97\xcd\xa1\x37\x1e\x46\x6f\xd2\x86\xde\xd4\xa0\x37\x1d\x43\x97\x37\xa1\xcb\x17\xd0\x9b\x75\xa2\x37\x2f\x45\x6f\x3e\x8b\xde\x22\x8b\xae\xe8\x42\x6f\xd9\x80\xde\xaa\x18\xbd\xd5\x18\x7a\xeb\x6e\x74\x65\x3b\x7a\x9b\x04\x7a\xdb\x06\xf4\x76\x35\xe8\x98\x40\xc7\x16\xd0\xdb\x4f\xa1\x77\x18\x41\xef\x38\x84\xae\xea\x46\xef\xd4\x86\xde\xb9\x14\xbd\x73\x0e\xbd\x4b\x13\xba\xba\x00\x5d\x3d\x86\xde\xb5\x13\xbd\x5b\x3e\x7a\xb7\x21\xf4\xee\xcd\xe8\x9a\x62\x74\x4d\x03\x7a\x8f\x02\xf4\x1e\x19\xf4\x9e\x2d\xe8\xbd\x0c\x7a\xaf\x29\x74\x6d\x0a\xbd\x77\x1c\xbd\x4f\x31\x7a\x9f\x09\xf4\xbe\xbd\xe8\xba\x3a\x74\xdd\x0c\x7a\xbf\x56\xf4\xfe\xf9\xe8\xfd\x7b\xd0\x07\x94\xa2\x0f\xc8\xa1\xeb\x2b\xd0\x07\x82\x3e\x30\x85\x3e\xa8\x0a\x7d\xd0\x14\xfa\xe0\x4e\x74\x5c\xa0\xe3\x59\xf4\x21\x8d\xe8\x43\xf3\xd1\x87\xf6\xa3\x0f\xab\x41\x1f\x36\x8f\x6e\xe8\x43\x1f\x5e\x8b\x3e\x7c\x12\x7d\x44\x33\xfa\x88\x05\xf4\x91\x13\xe8\xc6\x01\xf4\x51\x1d\xe8\xa3\x13\xe8\x63\x6a\xd0\x4d\x65\xe8\x63\x8b\xd1\xc7\x81\x3e\x6e\x02\x7d\x7c\x06\xdd\x3c\x86\x3e\x61\x16\x7d\xe2\x14\xfa\xa4\x71\x74\xcb\x1c\xfa\xe4\x69\xf4\xa9\x79\xe8\x84\x40\x9f\x56\x82\x3e\xad\x1b\x7d\x7a\x39\xfa\xf4\x1c\xfa\x8c\x14\xba\xb5\x01\x7d\x66\x09\xfa\xcc\x69\xf4\x59\x95\xe8\xb3\xf3\xd1\x67\x8f\xa1\xdb\x9a\xd1\xe7\x14\xa1\xcf\xc9\xa0\xcf\x6d\x46\x9f\x57\x8a\x3e\x6f\x0c\xdd\xde\x8a\x6e\xcf\xa1\xcf\x4f\xa0\x2f\x48\xa0\x2f\x34\xe8\x0b\x27\xd1\x1d\xbd\xe8\x8b\xea\xd0\x17\xc7\xd0\x97\x04\x74\x67\x09\xfa\xd2\x02\xf4\x65\xa0\x2f\xcf\x43\x5f\x9e\x43\x77\xb5\xa1\xaf\x28\x43\x5f\x31\x85\xbe\xb2\x07\x7d\x55\x15\xfa\xaa\x39\x74\x77\x1f\xfa\xea\x18\xfa\xea\x09\xf4\x35\x43\xe8\x6b\xf3\xd1\xd7\xb6\xa0\x7b\x9a\xd1\xd7\xd5\xa0\xaf\x2f\x47\xdf\x50\x84\xbe\x61\x1e\x9d\x1c\x41\xdf\x38\x88\xbe\xa9\x17\x7d\x73\x1b\xba\xb7\x0c\xdd\x3b\x8d\xbe\xa5\x12\x7d\x4b\x1a\x7d\x6b\x3e\xfa\xd6\x0c\xfa\xb6\x04\x3a\x65\xd0\xa9\x71\xf4\xed\x3d\xe8\x3b\xaa\xd1\x77\xe6\xa1\xef\xcc\xa0\xfb\xda\xd0\x77\x95\xa1\xef\x1a\x42\xdf\xdd\x8a\xbe\xa7\x16\xdd\x6f\xd0\xfd\xf3\xe8\x7b\xc7\xd1\xf7\x0d\xa1\xef\xef\x42\xdf\x3f\x85\x1e\x68\x42\x3f\x50\x80\x7e\x60\x0c\xfd\x60\x0d\xfa\xc1\x1c\xfa\xa1\x56\xf4\x60\x2d\xfa\xe1\x22\xf4\xc3\x5d\xe8\x47\x6a\xd0\x8f\x16\xa3\x1f\x9d\x40\xa7\x0d\x3a\xbd\x80\x7e\x2c\x83\x7e\xbc\x0b\xfd\x44\x03\x7a\xa8\x0c\xfd\x64\x01\xfa\xc9\x09\xf4\x53\x35\xe8\xa7\x72\xe8\xa7\x33\xe8\x4c\x3b\x3a\xb3\x80\x7e\x66\x06\xfd\xec\x24\xfa\xb9\x0c\x3a\x9b\x45\x3f\x3f\x86\x7e\xa1\x12\xfd\xc2\x38\xfa\xc5\x21\x74\xae\x00\x9d\x6b\x42\xe7\x32\xe8\x97\x8a\xd0\x2f\xb5\xa1\x5f\x9a\x45\xbf\x1c\x47\xbf\x9c\x43\xbf\x52\x86\x7e\x25\x85\x1e\x2e\x40\x0f\xb7\xa1\x5f\x05\xfd\x6a\x17\xfa\xd5\x39\xf4\x6b\x0d\xe8\xd7\xb2\xe8\xd7\x63\xe8\xd7\x07\xd0\x23\xc5\xe8\x91\x1e\xf4\x1b\x31\xf4\x1b\x39\xf4\x9b\x01\xfd\x66\x12\xfd\x56\x09\xfa\xad\x11\xf4\x68\x1b\xfa\xed\x80\x7e\x7b\x0c\xfd\x4e\x02\xfd\xae\x40\xbf\x3b\x86\x1e\x6b\x43\xbf\x57\x84\x7e\x2f\x8d\x7e\xbf\x06\xfd\xfe\x0c\xfa\x83\x41\xf4\x78\x1b\xfa\xc3\x1a\xf4\x47\x45\xe8\x8f\x26\xd0\x1f\xf7\xa1\x27\x62\xe8\x89\x09\xf4\x27\x9d\xe8\x4f\x03\xfa\xd3\x61\xf4\x67\x8d\xe8\xc9\x7c\xf4\xe4\x00\xfa\xf3\x1a\xf4\xe7\xb3\xe8\x2f\xba\xd0\x5f\xb6\xa2\xa7\xea\xd0\x5f\x95\xa0\xbf\x06\xfd\xf5\x04\xfa\x9b\x51\xf4\x74\x12\xfd\x6d\x1c\xfd\xed\x2c\xfa\xbb\x1c\xfa\xfb\x38\xfa\xfb\x05\xf4\x4c\x12\x3d\x33\x8b\xfe\x21\xa0\x7f\xc8\xa1\x7f\x6c\x40\xff\x38\x8f\xfe\xa9\x1b\x3d\x6b\xd0\xb3\x69\xf4\xcf\x45\xe8\x9f\x9b\xd1\x3f\xe7\xd0\x8b\x6b\xd1\x8b\x07\xd1\xbf\xe4\xa3\xe7\x40\xcf\x65\xd1\xbf\xb6\xa1\x7f\xab\x44\xff\xb6\x80\xfe\x3d\x83\x9e\x1f\x40\xff\x51\x87\xfe\x13\xf4\x9f\x1d\xe8\xbf\xea\xd1\x7f\xcd\xa3\x17\x7a\xd1\x7f\x57\xa1\xff\xa9\x40\xff\x5b\x8c\xfe\x77\x18\x43\x0f\x66\x89\x80\x59\x62\x14\xb3\x64\x07\x66\xa9\x06\xcc\x52\xf3\x98\xbc\x14\x26\x6f\x16\xb3\x74\x07\x66\x99\x3c\xcc\x32\xfd\x98\x65\xab\x30\xcb\xce\x60\xf2\xbb\x30\xcb\x95\x61\x96\x1b\xc3\x2c\xdf\x82\x59\xa1\x18\xb3\x42\x0e\x53\xd0\x8c\x59\xb1\x10\xb3\xe2\x2c\x66\xa5\x51\xcc\xca\x5d\x98\xc2\x04\x66\x95\x6a\xcc\x2a\x43\x98\x55\xbb\x31\xab\x25\x30\x45\x75\x98\xd5\x2b\x30\x6b\x14\x61\xd6\x68\xc3\xac\x59\x82\x59\x33\x83\x29\x6e\xc4\xac\x95\x8f\x59\x6b\x08\xb3\x76\x3e\x66\xed\x31\xcc\x3a\x25\x98\x75\x06\x30\x25\x25\x98\x92\x41\xcc\xba\x02\xb3\xee\x1c\x66\xbd\x1c\xe6\x7f\x3d\x98\xd2\x46\x4c\x69\x2f\x66\xfd\x66\xcc\x06\x31\x4c\x54\x84\x89\x52\x18\x11\x30\x62\x08\x23\x6b\x30\x2a\x1f\xa3\x5a\x30\xba\x12\x63\xc0\x98\x11\x8c\x6d\xc7\xb8\x22\x8c\xeb\xc7\xf8\x4a\x8c\x1f\xc5\x84\x46\x4c\x98\xc3\x2c\x9a\xc7\x6c\x04\x66\xa3\x41\x4c\x59\x03\x66\xe3\x22\xcc\xc6\x23\x98\x4d\xda\x30\x9b\x1a\xcc\xa6\x23\x98\xf2\x56\xcc\x66\xa5\x98\xcd\x72\x98\xcd\x9b\x31\x5b\x14\x61\xb6\xc8\x60\x2a\xca\x31\x15\x43\x98\x2d\xcb\x31\x5b\x2e\x60\xb6\x1a\xc1\x6c\xdd\x8f\xa9\xec\xc6\x6c\xd3\x8c\xd9\xb6\x1a\xb3\x9d\xc0\xc4\x0a\x31\xb1\x39\xcc\xf6\xe3\x98\x1d\x92\x98\x1d\xe3\x98\x1d\x27\x30\x55\x71\x4c\xd5\x04\x66\xa7\x38\x66\xa7\x09\xcc\xce\x71\xcc\xce\x73\x98\x5d\xba\x31\xd5\x31\xcc\xae\x45\x98\x5d\x27\x30\xbb\x35\x63\x76\x2f\xc2\xec\x9e\xc4\xd4\x54\x60\x6a\xda\x31\x7b\x08\xcc\x9e\x31\xcc\x5e\x75\x98\xda\x16\xcc\xde\x25\x98\xbd\x87\x31\xfb\x24\x30\xfb\x96\x62\xf6\x5d\xc0\xd4\xe5\x30\xfb\xf5\x60\xf6\x6f\xc6\x1c\x50\x8d\xa9\x2f\xc5\xd4\xa7\x30\x07\xb6\x60\x0e\x8a\x61\x0e\x2e\xc2\x1c\x1c\xc7\xc4\xcb\x31\x87\x14\x62\x0e\x99\xc2\x1c\x9a\xc1\x1c\xd6\x83\x69\x28\xc7\x34\x8c\x63\x0e\x6f\xc3\x1c\x11\x30\x47\x8c\x62\x8e\x8c\x63\x8e\x9c\xc2\x34\xb6\x60\x1a\x17\x30\x47\xa5\x30\x47\x57\x63\x8e\xa9\xc5\x1c\x33\x86\x69\x8a\x63\x9a\xa6\x31\xc7\xb6\x60\x8e\x5d\xc0\x1c\xd7\x85\x39\x5e\x60\x8e\xcf\x60\x9a\xeb\x30\xcd\x0b\x98\x13\xfa\x31\x27\x36\x61\x4e\x2a\xc1\x9c\x34\x8a\x69\xe9\xc5\x9c\x5c\x87\x39\xa5\x04\x73\xca\x24\xe6\xd4\x5e\xcc\xa9\x33\x98\x44\x13\x26\x31\x89\x39\x2d\x8d\x39\x3d\x81\x39\x23\x8e\x69\xad\xc6\x9c\x19\xc3\x9c\xf5\x9f\x29\xcc\xd9\x71\xcc\xd9\x63\x98\xb6\x1a\x4c\x5b\x0e\x73\x4e\x17\xe6\xdc\x3a\xcc\xb9\x23\x98\xf3\xaa\x30\xe7\xcd\x61\xda\xfb\x31\xe7\xd7\x61\x2e\xc8\xc3\x5c\x90\xc6\x5c\x58\x8d\xb9\x70\x1c\xd3\xd1\x84\xb9\x08\xcc\x45\x3d\x98\x8b\xcb\x30\x17\x27\x31\x97\x34\x61\x3a\x03\xa6\x73\x0e\x73\x69\x37\xe6\xb2\x80\xb9\xac\x07\x73\x79\x35\xa6\x0b\x4c\x57\x1d\xe6\x8a\x02\xcc\x15\xc3\x98\x2b\x3b\x31\x57\x4e\x60\xae\x6a\xc5\x5c\x95\xc3\x74\x77\x62\xae\xae\xc3\x5c\x3d\x8f\xb9\x26\x86\xb9\x66\x12\x73\x6d\x27\xa6\x27\x60\x7a\xda\x30\xd7\x09\xcc\x75\xc3\x98\xeb\x5b\x30\x37\x14\x62\x6e\xc8\x62\x92\x06\x93\x1c\xc5\xdc\x18\xc7\xdc\x38\x85\xb9\xa9\x05\x73\xd3\x02\xe6\xe6\x4e\xcc\xcd\x73\x98\xde\x7a\x4c\xef\x34\xe6\x96\x04\xe6\x56\x30\xb7\xb6\x63\x6e\x5d\xc0\xdc\xd6\x8e\x49\xe5\x63\x52\xdd\x98\xdb\x8b\x31\xb7\xf7\x62\xee\x10\x98\x3b\x06\x30\x77\xd6\x60\xee\x9c\xc3\xf4\xf5\x62\xee\xaa\xc2\xdc\x35\x85\xb9\xbb\x03\x73\x4f\x35\xa6\xbf\x18\xd3\x9f\xc2\xdc\x6b\x30\xf7\xf6\x63\xee\x0b\x98\xfb\xd2\x98\xfb\x63\x98\x81\x42\xcc\xc0\x10\xe6\x81\x38\xe6\xc1\x3c\xcc\x83\x7d\x98\x87\xaa\x31\x0f\xcd\x62\x06\x93\x98\x87\x63\x98\x87\xe7\x30\x8f\x64\x31\x8f\xb6\x61\xd2\x15\x98\x74\x3f\xe6\xb1\x1a\xcc\x63\x0b\x98\xc7\x7b\x31\x4f\xc4\x30\x4f\x4c\x61\x86\x7a\x30\x4f\xa6\x31\x4f\xd5\x61\x9e\x2e\xc2\x3c\xdd\x87\xc9\x74\x63\x9e\x09\x98\x67\xcb\x30\xcf\x05\xcc\x73\xc3\x98\xec\x28\xe6\xf9\x06\xcc\xf3\xb3\x98\x17\x7a\x30\x2f\x96\x62\x5e\x4c\x61\x72\x01\x93\x1b\xc2\xbc\x14\x30\x2f\x0d\x60\x5e\xae\xc0\xbc\x3c\x8c\x79\xa5\x1e\xf3\xca\x34\x66\xb8\x05\xf3\x2a\x98\x57\x3b\x30\xaf\x15\x63\x5e\xcb\x62\x5e\x6f\xc2\x8c\x18\xcc\xc8\x18\xe6\x8d\x36\xcc\x9b\x05\x98\x37\x7b\x31\x6f\x55\x62\xde\xea\xc3\x8c\x16\x60\x46\x7b\x31\x6f\x07\xcc\xdb\x19\xcc\x3b\xc5\x98\x77\x06\x31\xef\x96\x61\xde\xcd\x61\xc6\x6a\x31\x63\x29\xcc\xd8\x2c\xe6\xbd\x7a\xcc\x7b\x7d\x98\xf7\x0b\x31\xef\xc7\x31\x1f\x18\xcc\x07\x33\x98\xf1\x41\xcc\x87\x6d\x98\x8f\x2a\x31\x1f\x4d\x61\x3e\x4e\x63\x26\x1a\x31\x13\x93\x98\x4f\xba\x31\x9f\x16\x60\x3e\xed\xc5\x7c\x56\x82\xf9\x2c\x87\x99\x6c\xc6\x7c\x5e\x8c\xf9\x3c\x8b\xf9\xa2\x05\xf3\x65\x13\x66\xaa\x08\x33\x35\x81\xf9\xaa\x09\xf3\xd5\x24\xe6\xeb\x1e\xcc\x37\xc5\x98\x6f\x86\x30\xd3\x0d\x98\xe9\x19\xcc\xb7\x29\xcc\x77\x75\x98\xef\x0b\x30\xdf\xe7\x30\x33\x6d\x98\x99\x29\xcc\x0f\x75\x98\x1f\x72\x98\x1f\xcb\x31\x3f\x66\x30\x3f\x55\x62\x7e\xca\x60\x66\xdb\x31\x3f\x57\x63\x7e\x4e\x63\x16\x0b\xcc\xe2\x2e\xcc\x2f\xf9\x98\x5f\xe2\x98\x5f\xc6\x30\x73\x02\x33\xd7\x83\x99\x5b\xc0\xfc\x5a\x85\xf9\x75\x0e\xf3\x5b\x0a\xf3\x7b\x3e\xe6\xf7\x01\xcc\x7c\x0d\x66\x7e\x01\xf3\x47\x3f\xe6\xcf\x7a\xcc\x5f\x79\x98\xbf\x06\x31\x0b\xf5\x98\xbf\xf3\x31\x7f\x27\x30\x7f\x4f\x62\xfe\x69\xc6\xfc\x5b\x85\xf9\x77\x14\x4b\x15\x76\x89\x0e\xec\x92\x53\xd8\xa5\x92\xd8\xbc\x0e\x6c\xde\x34\x76\xe9\x5a\xec\xd2\x29\xec\x32\x65\xd8\x65\x06\xb0\xcb\x06\xec\xb2\xad\xd8\x65\x87\xb1\xf9\x15\xd8\xfc\x3e\x6c\xfe\x1c\x76\xb9\x06\xec\x72\xd3\xd8\xe5\x4b\xb0\xcb\xb7\x62\x97\x9f\xc1\xae\xd0\x8a\x2d\x28\xc7\x16\x2c\x60\x57\xec\xc1\xae\x24\xb0\x2b\x0d\x61\x57\x8e\x61\x57\xee\xc5\x16\xa6\xb0\xab\x08\xec\x2a\x63\xd8\x55\x9b\xb1\xab\x4e\x61\x57\x6b\xc7\x16\x95\x62\x8b\xb2\xd8\xd5\x8b\xb1\xab\x67\xb1\x6b\x34\x60\xd7\x04\xbb\x66\x1f\x76\xcd\x49\x6c\x71\x33\xb6\x78\x14\xbb\x56\x0b\x76\xad\x49\xec\xda\xb5\xd8\x75\xc0\xae\xd3\x87\x2d\x31\xd8\x92\x05\xec\xba\xbd\xd8\xf5\x2a\xb1\xeb\x8d\x63\xff\xd7\x86\x2d\x2d\xc5\x96\xe6\xb0\xeb\xb7\x63\x37\x88\x61\x37\xe8\xc2\x46\xf5\x58\x51\x8a\x15\xd3\x58\xd9\x87\x55\x8d\x58\x2d\xb0\x7a\x06\x6b\x06\xb0\xb6\x0d\xeb\xf2\xb1\xae\x0f\xeb\xcb\xb1\x7e\x14\x1b\x6a\xb0\x61\x12\xbb\xa8\x0a\xbb\x61\x0c\xbb\xe1\x08\x76\xa3\x7a\xec\x46\xd3\xd8\xb2\x56\xec\xc6\xf9\xd8\x8d\x7b\xb0\x9b\x94\x62\x37\xe9\xc7\x6e\x5a\x8e\xdd\xb4\x15\x5b\x9e\x8f\x2d\x1f\xc4\x6e\x56\x8f\xdd\x2c\x8b\xdd\xbc\x1d\xbb\xf9\x0c\x76\x8b\x6a\xec\x16\x43\xd8\x8a\x80\xad\x98\xc5\x6e\xd9\x80\xdd\x32\x83\xdd\xaa\x08\xbb\x55\x27\x76\xab\x05\xec\xd6\xcd\xd8\xad\x27\xb0\x95\x75\xd8\x6d\xf2\xb0\xdb\xf4\x60\xb7\x35\xd8\x6d\x47\xb0\xdb\x35\x63\x63\x05\xd8\x58\x16\xbb\x7d\x2b\x76\x07\x81\xdd\x61\x0c\xbb\x63\x01\x76\xc7\x34\xb6\xaa\x09\xbb\x53\x09\x76\xa7\x51\xec\xce\xed\xd8\x9d\x07\xb1\xbb\xc4\xb1\xbb\xcc\x63\xab\xd3\xd8\x5d\x1b\xb0\xbb\x4e\x61\x77\xeb\xc4\xee\x9e\xc1\xd6\xc4\xb0\x7b\xd4\x63\xf7\x6c\xc0\xee\x39\x8e\xdd\xab\x12\xbb\x57\x17\xb6\x36\x1f\x5b\xdb\x83\xad\x1d\xc6\xee\x5d\x83\xdd\x3b\x8d\xdd\xa7\x12\xbb\x4f\x1a\xbb\x6f\x25\xb6\x0e\x6c\x5d\x1c\x5b\x37\x86\xdd\x2f\x8e\xdd\x6f\x04\xbb\x7f\x35\x76\xff\x61\xec\x01\xf9\xd8\x03\x3a\xb0\x07\x2c\x60\xeb\x13\xd8\xfa\x59\xec\x81\x2d\xd8\x03\x67\xb1\x07\xb5\x60\x0f\x9a\xc7\x1e\xdc\x88\x8d\x83\x8d\x77\x62\x0f\xc9\xc3\x1e\xd2\x8d\x3d\x34\x0f\x7b\x68\x25\xf6\xd0\x05\xec\x61\xed\xd8\x86\x02\x6c\x43\x03\xb6\x21\x89\x3d\xbc\x14\x7b\x78\x3f\xf6\x88\x4a\xec\x11\x23\xd8\x23\xab\xb1\x47\xe6\xb0\x8d\xf5\xd8\xc6\x19\xec\x51\xed\xd8\xa3\x8b\xb1\x47\xa7\xb1\xc7\x54\x63\x8f\x99\xc1\x36\x75\x61\x8f\x2d\xc3\x1e\x9b\xc5\x1e\xd7\x88\x3d\xbe\x10\x7b\x7c\x1a\xdb\x5c\x84\x6d\x1e\xc2\x9e\x10\xc7\x9e\x30\x81\x3d\x31\x8e\x3d\x71\x02\x7b\x52\x1c\x7b\xd2\x04\xb6\xa5\x1e\xdb\x32\x80\x6d\x99\xc6\x9e\x2c\xb0\x27\x8f\x62\x4f\x69\xc3\x9e\x6a\xb0\xa7\x4e\x60\x13\x3d\xd8\xd3\x62\xd8\xd3\x16\xb0\xa7\xa7\xb1\x67\x34\x61\x5b\x05\xb6\x75\x02\x7b\x66\x0f\xf6\xac\x1a\xec\x59\x33\xd8\xb3\xdb\xb1\x6d\x45\xd8\xb6\x24\xf6\x9c\x12\xec\x39\x7d\xd8\x73\x03\xf6\xdc\x41\xec\x79\x95\xd8\xf3\xb2\xd8\xf6\x4a\x6c\xfb\x08\xf6\xfc\x7a\xec\xf9\xd3\xd8\x0b\xda\xb0\x17\x4c\x63\x2f\xac\xc3\x5e\x98\xc5\x76\x18\x6c\x47\x0f\xf6\x22\xb0\x17\x35\x63\x2f\x1a\xc7\x5e\x5c\x85\xbd\xb8\x1f\x7b\x49\x31\xf6\x92\x36\x6c\x67\x19\xb6\x33\x89\xbd\x14\xec\xa5\x8d\xd8\x4b\x87\xb1\x97\x05\xec\x65\x7d\xd8\xcb\xf3\xb1\x97\x27\xb0\x97\x4f\x62\xbb\x92\xd8\x2b\xea\xb0\x57\x16\x60\xaf\x1c\xc6\x5e\xd5\x8e\xed\x8e\x61\xbb\xe7\xb1\x57\x77\x63\xaf\x31\xd8\x6b\xb2\xd8\x6b\xeb\xb0\x3d\x79\xd8\x9e\x2c\xf6\xba\x0a\xec\x75\xf3\xd8\xeb\xfb\xb0\x37\xd4\x62\x93\xc5\xd8\xe4\x3c\xf6\xc6\x4e\xec\x4d\x4d\xd8\x9b\x2b\xb0\xbd\x85\xd8\xde\x5e\xec\x2d\xcd\xd8\x5b\x2b\xb1\xb7\x4e\x63\x6f\xeb\xc5\xa6\xea\xb0\xa9\x1c\xf6\xf6\x66\xec\x1d\x25\xd8\x3b\x46\xb1\x77\x76\x61\xef\x9c\xc3\xf6\x19\x6c\xdf\x04\xf6\xae\x6e\xec\xdd\x55\xd8\xbb\xe7\xb1\xf7\x8c\x62\xfb\xfb\xb1\xf7\x76\x60\xef\x8b\x63\xef\x2f\xc7\x0e\x14\x62\x07\xb2\xd8\x07\x12\xd8\x07\xc1\x3e\x38\x88\x7d\xa8\x11\xfb\xd0\x24\x76\xb0\x01\xfb\x70\x29\xf6\xe1\x59\xec\x23\x39\xec\xa3\x3d\xd8\x74\x23\xf6\xb1\x7c\xec\x63\x39\xec\xe3\xed\xd8\x27\xf2\xb0\x4f\x8c\x60\x87\xda\xb1\x4f\x56\x61\x9f\xca\xc7\x3e\x35\x82\x7d\xba\x1b\x9b\xa9\xc3\x66\xda\xb1\xcf\x14\x61\x9f\xf9\xef\x3e\xec\xb3\xb5\xd8\x67\x13\xd8\x67\x93\xd8\xe7\xaa\xb0\xcf\xa5\xb1\xcf\x8d\x63\xb3\x1d\xd8\xe7\x6b\xb1\x2f\x14\x63\x5f\x68\xc6\xbe\x58\x8e\x7d\x71\x16\x9b\x1b\xc2\xbe\x54\x86\x7d\x69\x1e\xfb\x72\x09\xf6\xe5\x21\xec\x2b\x95\xd8\x61\xb0\xc3\x0d\xd8\xe1\x0e\xec\xab\xd5\xd8\x57\xb3\xd8\xd7\x12\xd8\xd7\x2b\xb1\xaf\xff\x77\x12\x3b\x52\x87\x7d\xa3\x00\xfb\xc6\x38\xf6\xcd\x5a\xec\x9b\xc3\xd8\xb7\x62\xd8\xb7\xc6\xb0\xa3\x4d\xd8\xd1\x05\xec\xdb\xdd\xd8\x77\x04\xf6\x9d\x0c\xf6\xdd\x3a\xec\xbb\xd3\xd8\xb1\x56\xec\x7b\x85\xd8\xf7\x52\xd8\xf7\xcb\xb0\xef\x67\xb1\x1f\x54\x63\x3f\x18\xc5\x8e\xd7\x63\xc7\x93\xd8\x0f\x4b\xb0\x1f\xf6\x61\x3f\x12\xd8\x8f\x06\xb0\x1f\x97\x61\x3f\x4e\x63\x27\x2a\xb0\x13\x59\xec\x27\x95\xd8\x4f\xb2\xd8\x4f\x63\xd8\x4f\x73\xd8\xcf\x4a\xb1\x9f\xd5\x63\x3f\xcb\x60\x27\x0d\x76\xb2\x0b\x3b\x39\x83\xfd\xbc\x1e\xfb\x79\x0e\xfb\x45\x19\xf6\x8b\x5e\xec\x97\xe5\xd8\x2f\x47\xb0\x53\xed\xd8\xaf\x2a\xb0\x5f\x4d\x62\xbf\x4e\x62\xbf\xa9\xc5\x4e\xe7\x63\xa7\x47\xb1\xdf\x76\x63\xbf\xab\xc7\x7e\x5f\x8a\xfd\xbe\x13\xfb\xfd\x0c\x76\xa6\x1d\x3b\x93\xc1\xfe\x50\x88\xfd\x61\x10\xfb\x63\x3e\xf6\xc7\x34\xf6\xa7\x38\xf6\xa7\x59\xec\x6c\x16\xfb\x73\x35\xf6\xe7\x71\xec\xe2\x46\xec\xe2\x39\xec\x2f\x1d\xd8\xb9\x52\xec\xdc\x00\xf6\xd7\x6a\xec\xaf\xfd\xd8\xdf\x2a\xb0\xbf\x0d\x63\x7f\x2f\xc5\xce\xe7\x61\xe7\x2b\xb0\xf3\xa3\xd8\x3f\xf2\xb0\x7f\xf4\x60\xff\x18\xc1\xfe\x19\xc7\xfe\xd9\x85\xfd\x2b\x86\xfd\x6b\x04\xbb\x50\x8a\x5d\xc8\x60\xff\x2e\xc3\xfe\xdd\x87\xfd\xa7\x0c\xfb\xcf\x10\xf6\xdf\x18\xf6\xdf\x11\x1c\x9d\xb8\x25\x2a\x70\x4b\x4c\xe0\x96\x6c\xc7\x2d\x25\x70\x4b\x0d\xe3\xf2\x9a\x70\x79\x13\xb8\xa5\x6b\x71\x4b\xe7\x70\xcb\x54\xe0\x96\x49\xe1\x96\x2d\xc2\x2d\xdb\x89\xcb\xaf\xc5\x2d\x57\x8c\x5b\x6e\x01\xb7\x7c\x37\x6e\x85\x80\x5b\x21\x87\x2b\x88\xe3\x56\x6c\xc2\xad\x54\x88\x5b\x29\x83\x5b\xb9\x0e\xb7\xf2\x0c\xae\xb0\x03\x57\xb8\x80\x5b\x25\x81\x5b\x65\x06\xb7\x6a\x03\x6e\xd5\x11\xdc\x6a\xcd\xb8\xa2\x02\x5c\xd1\x00\x6e\xf5\x1a\xdc\xea\x33\xb8\x35\xba\x70\x6b\xc6\x71\xc5\x01\x57\xbc\x80\x5b\x6b\x14\xb7\x76\x2d\x6e\xed\x71\xdc\x3a\x0d\xb8\x75\x26\x71\x25\x4d\xb8\x75\x05\x6e\xdd\x09\xdc\x7a\x55\xb8\xff\x15\xe2\xfe\x37\x8c\x2b\xed\xc6\xad\x5f\x84\x5b\x3f\x8b\xdb\xa0\x06\x17\x81\x8b\xba\x70\xa2\x14\x27\xd2\x38\x59\x85\x93\x13\x38\xd5\x84\xd3\x85\x38\xdd\x85\x33\x02\x67\x9a\x71\x66\x01\x67\xbb\x70\x76\x04\xe7\xea\x71\x6e\x1e\xe7\x93\x38\x3f\x8b\x0b\x1d\xb8\x45\x85\xb8\x45\xbd\xb8\x0d\xcb\x71\x1b\x8e\xe2\x36\xea\xc2\x95\xd5\xe0\x36\x2e\xc0\x6d\xdc\x8f\xdb\xa4\x0a\xb7\xc9\x24\x6e\xd3\x76\x5c\x79\x3e\xae\xbc\x05\x57\x3e\x8d\xdb\xac\x1c\xb7\xd9\x20\x6e\xf3\x80\xdb\x3c\x8b\xdb\xa2\x01\xb7\xc5\x02\xae\xa2\x1b\xb7\x65\x19\x6e\xcb\x31\xdc\x56\x4d\xb8\xad\xd2\xb8\xad\xeb\x70\x5b\xcf\xe1\x2a\x5b\x71\xdb\x14\xe3\xb6\xe9\xc5\x6d\x5b\x8a\xdb\xb6\x0f\xb7\x9d\xc0\x6d\x37\x8b\x8b\xf5\xe3\xb6\x4f\xe0\xb6\x9f\xc5\xed\x90\xc0\xed\xb0\x80\xdb\xb1\x15\xb7\xe3\x02\xae\xaa\x1f\xb7\x53\x29\x6e\xa7\x5e\xdc\xce\xa5\xb8\x9d\x53\xb8\x5d\x04\x6e\x97\x7e\x5c\x75\xc0\x55\x0f\xe2\x76\x0d\xb8\x5d\xfb\x71\xbb\x05\xdc\x6e\x43\xb8\xdd\x05\x6e\xf7\x6e\x5c\x0d\xb8\x9a\x16\x5c\xcd\x24\x6e\x8f\x3a\xdc\x1e\x83\xb8\x3d\x03\x6e\xcf\x7e\xdc\x5e\xad\xb8\xda\x2a\xdc\xde\x25\xb8\xbd\x67\x71\xfb\x64\x71\xfb\x26\x71\x75\x95\xb8\xba\x59\xdc\x7e\x29\xdc\xfe\xb5\xb8\x03\xf2\x70\x07\x0c\xe2\xea\xc1\xd5\x77\xe2\x0e\x2c\xc2\x1d\xd8\x83\x3b\xa8\x1a\x77\x30\xb8\x83\x5b\x71\x07\xcf\xe0\xe2\x8d\xb8\xf8\x18\xee\x90\x1a\xdc\x21\x39\xdc\xa1\x95\xb8\x43\xd3\xb8\xc3\x04\xee\xb0\x5e\x5c\x43\x09\xae\xa1\x07\xd7\x30\x8d\x3b\xbc\x0c\x77\x78\x23\xee\xf0\x11\xdc\x11\x65\xb8\x23\x7a\x71\x47\x06\xdc\x91\x49\x5c\x63\x3e\xae\xb1\x05\xd7\x38\x83\x3b\xaa\x01\x77\x54\x0e\x77\xb4\xc1\x1d\x9d\xc1\x1d\x53\x8e\x3b\xa6\x1f\xd7\x54\x8d\x6b\x1a\xc1\x1d\xdb\x82\x3b\x76\x0c\x77\x5c\x2b\xee\xf8\x62\xdc\xf1\x19\x5c\x73\x03\xee\x84\x02\xdc\x09\x7d\xb8\x13\x6b\x71\x27\x2e\xe0\x5a\x0a\x70\x2d\x83\xb8\x93\x5b\x70\xa7\xd4\xe0\x4e\x0d\xb8\x04\xb8\xc4\x20\x2e\x31\x8d\x3b\xad\x07\x77\x7a\x2d\xee\x8c\x02\xdc\x19\xbd\xb8\x56\x83\x6b\x1d\xc5\x9d\xd9\x88\x3b\x73\x1e\x77\x56\x37\xee\x6c\x83\x3b\x3b\x8b\x6b\x8b\xe3\xda\xe6\x70\xe7\xa4\x70\xe7\x06\xdc\xb9\x83\xb8\xf3\x2a\x71\xe7\x0d\xe3\xda\xc1\xb5\xd7\xe3\xce\xcf\xc7\x9d\xdf\x87\xbb\x20\x86\xbb\x60\x00\x77\x61\x1c\x77\xe1\x02\xae\xa3\x17\x77\x91\xc1\x5d\x5c\x86\xbb\xb8\x1f\x77\x89\xc1\x5d\xd2\x8b\xeb\x34\xb8\xce\x71\xdc\xa5\x35\xb8\x4b\x87\x71\x97\x55\xe2\x2e\x1b\xc5\x5d\x1e\xc3\x5d\x9e\xc6\x75\x05\xdc\x15\xcd\xb8\x2b\xe6\x70\x57\x76\xe3\xae\x2a\xc0\x5d\x35\x8e\xeb\xae\xc7\x75\x8f\xe3\xae\xae\xc6\x5d\x53\x88\xbb\xa6\x0f\x77\x6d\x25\xee\xda\x51\x5c\x4f\x1c\xd7\x33\x85\xbb\xae\x15\x77\x7d\x21\xee\xfa\x7e\xdc\x0d\xe5\xb8\x1b\x32\xb8\x64\x0c\x97\x1c\xc3\xdd\xd8\x80\xbb\x71\x1e\x77\x53\x0f\xee\x66\x83\xbb\x79\x18\xd7\xdb\x80\xeb\xcd\xe1\x6e\x09\xb8\x5b\x92\xb8\x5b\xf3\x70\xb7\x36\xe1\x6e\x1d\xc4\xdd\xd6\x8c\x4b\x81\x4b\xfd\xf7\x2c\xee\xf6\x46\xdc\xed\xd3\xb8\x3b\xda\x71\x77\xc6\x70\x77\xa6\x71\x77\x4e\xe3\xfa\xfa\x71\x77\xc5\x71\x77\x97\xe0\xee\x1e\xc4\xdd\x13\xc3\xdd\x93\xc2\xdd\x33\x87\xeb\xef\xc0\xf5\x4f\xe3\xee\x4d\xe0\xee\xcb\xc7\xdd\xd7\x8f\xbb\xbf\x14\x77\x7f\x2f\x6e\x20\x8e\x7b\xa0\x14\xf7\xc0\x04\xee\xc1\x5e\xdc\x43\x71\xdc\x60\x09\x6e\x30\x85\x7b\xb8\x14\xf7\x70\x3f\xee\x91\x80\x7b\x64\x04\xf7\x68\x23\x2e\xdd\x84\x7b\xac\x19\xf7\x78\x21\xee\xf1\x16\xdc\x13\x25\xb8\x27\xfa\x71\x43\x31\xdc\xd0\x18\xee\xc9\x26\xdc\x93\xf3\xb8\xa7\x86\x70\x4f\x77\xe0\x32\x65\xb8\xcc\x24\xee\x99\x66\xdc\xb3\x85\xb8\x67\xfb\x70\xcf\x95\xe3\x9e\xeb\xc7\x65\x05\x2e\x3b\x80\x7b\xbe\x1a\xf7\xfc\x08\xee\x85\x7a\xdc\x0b\x39\xdc\x8b\x65\xb8\x5c\x1e\x2e\x97\xc2\xbd\x54\x8c\x7b\xa9\x1d\xf7\x72\x3b\xee\x95\x4a\xdc\x2b\xfd\xb8\xe1\x46\xdc\xab\x75\xb8\x57\xa7\x70\xaf\x65\x70\xaf\x77\xe0\x5e\x9f\xc5\x8d\xc4\x71\x23\xc3\xb8\x37\xca\x71\x6f\x0c\xe1\xde\xac\xc6\xbd\x39\x8c\x7b\xab\x1a\xf7\xd6\x10\x6e\x34\x86\x1b\x9d\xc0\xbd\x5d\x8b\x7b\xa7\x1e\xf7\xce\x30\xee\xdd\x0a\xdc\xbb\x33\xb8\xb1\x0e\xdc\xd8\x2c\xee\xbd\x46\xdc\x7b\x23\xb8\xf7\xcb\x71\xef\xf7\xe3\x3e\x28\xc1\x7d\xd0\x83\x1b\x2f\xc0\x8d\x77\xe2\x3e\x2c\xc4\x7d\x38\x80\xfb\xa8\x06\xf7\xd1\x34\xee\xe3\x76\xdc\xc7\x93\xb8\x89\x5a\xdc\x44\x1f\x6e\x62\x0e\xf7\x49\x15\xee\x93\x24\xee\x93\x19\xdc\xa7\xd5\xb8\x4f\xfb\x71\x9f\xe5\xe3\x3e\x6b\xc2\x7d\x96\xc3\x4d\x16\xe1\x26\x9b\x70\x93\x59\xdc\xe7\x45\xb8\xcf\x13\xb8\xcf\x73\xb8\x2f\x0a\x70\x5f\x34\xe3\xbe\xac\xc0\x7d\xd9\x89\x9b\xaa\xc6\x7d\x55\x80\xfb\x6a\x18\xf7\x75\x0b\xee\xeb\x79\xdc\x37\x31\xdc\x37\x39\xdc\x74\x35\x6e\x3a\x85\xfb\xb6\x0a\xf7\x6d\x1f\xee\x3b\x70\xdf\xd5\xe3\xbe\x9b\xc2\x7d\xdf\x84\xfb\x7e\x1a\x37\x53\x88\x9b\xa9\xc3\xfd\x50\x8a\xfb\x21\x89\xfb\x61\x06\xf7\x63\x2d\xee\xc7\x34\xee\xa7\x12\xdc\x4f\x9d\xb8\x9f\x66\x71\xb3\x71\xdc\x6c\x16\x37\x3b\x8b\xfb\xb9\x1e\xf7\x73\x06\xb7\x58\xe0\x16\x77\xe1\x7e\x01\xf7\xcb\x08\x6e\xae\x0a\x37\x37\x86\xfb\xb5\x06\xf7\xeb\x38\xee\xb7\x76\xdc\xef\x06\xf7\x7b\x37\x6e\x3e\x86\xfb\xa3\x00\xf7\xc7\x38\xee\xcf\x01\xdc\x5f\x6d\xb8\x85\x5a\xdc\xdf\xa5\xb8\xbf\x67\x71\xff\xe4\x70\xff\x76\xe0\xa9\xc1\x2f\x51\x8c\x5f\x62\x12\xbf\x64\x3f\x7e\xa9\x04\x3e\xaf\x12\xbf\x74\x3e\x7e\xe9\x61\xfc\x32\xc5\xf8\x65\xa6\xf1\xcb\xd6\xe1\x97\x1d\xc6\xe7\x57\xe2\xf3\x5b\xf1\xf9\x93\xf8\xe5\xea\xf0\xcb\xe7\xe3\x97\xcf\xe0\x57\x68\xc2\xaf\x30\x8a\x2f\xa8\xc4\x17\x74\xe3\x57\xcc\xc7\xaf\xd8\x8a\x5f\x71\x0e\xbf\x52\x13\x7e\xa5\x51\xfc\xca\x55\xf8\x95\x87\xf0\x85\x01\x5f\x38\x88\x5f\x25\x81\x5f\x65\x0e\xbf\x6a\x2b\x7e\xd5\x79\xfc\x6a\x8d\xf8\xd5\xa6\xf0\x45\x8d\xf8\xa2\x19\xfc\xea\x15\xf8\xd5\xd3\xf8\x35\x2a\xf1\x6b\x0c\xe1\xd7\x8c\xe1\xd7\xcc\xe1\x8b\x13\xf8\xe2\x05\xfc\x5a\x8d\xf8\xb5\xc1\xaf\xdd\x81\x5f\xa7\x00\xbf\x4e\x37\xbe\x24\x86\x2f\xc9\xe2\xd7\x4d\xe0\xd7\x1d\xc6\xaf\x57\x82\x5f\x6f\x04\xff\x3f\x83\xff\x5f\x33\xbe\xb4\x08\x5f\x3a\x86\x5f\xbf\x07\xbf\x41\x09\x7e\x83\x14\x3e\x6a\xc4\x47\x69\xbc\x68\xc6\xcb\x42\xbc\x6c\xc4\xcb\x0c\x5e\x75\xe1\x55\x06\xaf\x13\x78\x13\xf0\x66\x06\x6f\xdb\xf1\xae\x18\xef\x7a\xf1\xbe\x0c\xef\x87\xf1\xa1\x01\x1f\xe6\xf1\x8b\xba\xf0\x1b\x0a\xfc\x46\xe5\xf8\xb2\x5a\xfc\xc6\x2d\xf8\x4d\x2a\xf0\x9b\xd6\xe2\x37\x9d\xc4\x97\xb7\xe0\x37\x0b\xf8\xcd\x7a\xf0\x9b\x8d\xe3\x37\xaf\xc0\x6f\x11\xf0\x5b\x64\xf1\x15\x85\xf8\x8a\x3e\xfc\x96\x79\xf8\x2d\xb3\xf8\xad\x0a\xf0\x5b\xc5\xf1\x5b\x4d\xe2\xb7\x2e\xc3\x6f\xdd\x81\xdf\x7a\x0c\x5f\x69\xf0\x95\x6d\xf8\xca\x51\xfc\x36\x02\xbf\x4d\x2b\x7e\x9b\x39\xfc\xb6\x09\xfc\xb6\x73\xf8\xed\x9a\xf0\xdb\x4d\xe0\x63\x31\x7c\x6c\x00\xbf\xbd\xc0\x6f\xdf\x81\xdf\x7e\x1a\xbf\x43\x0d\x7e\x87\x41\xfc\x8e\x45\xf8\x1d\x5b\xf0\x3b\x0e\xe3\xab\xca\xf0\x55\x43\xf8\x9d\x62\xf8\x9d\x46\xf1\x3b\x97\xe1\x77\xce\xe1\x77\xa9\xc3\xef\xd2\x87\xaf\x2e\xc7\x57\xe7\xf0\xbb\xd6\xe3\x77\x9d\xc5\xef\xd6\x89\xdf\xbd\x04\xbf\xfb\x20\xbe\xa6\x11\x5f\xb3\x80\xdf\x63\x01\xbf\x67\x3b\x7e\xaf\x3c\xfc\x5e\x49\x7c\x6d\x39\xbe\x36\x87\xdf\xbb\x09\xbf\x0f\xf8\x7d\xba\xf1\xfb\x96\xe2\xf7\x1d\xc2\xd7\x55\xe3\xeb\x26\xf0\xfb\x35\xe1\xf7\x5b\xc0\xef\xdf\x8d\x3f\xa0\x08\x7f\x40\x0e\x5f\x5f\x89\x3f\xb0\x1c\x7f\xe0\x30\xfe\xa0\x38\xfe\xa0\x39\xfc\xc1\x9d\xf8\x78\x11\x3e\x3e\x80\x3f\xa4\x0a\x7f\xc8\x34\xfe\xd0\x1e\xfc\x61\x55\xf8\xc3\x66\xf0\x0d\xcd\xf8\xc3\xc1\x1f\x9e\xc2\x1f\x3e\x8b\x3f\xa2\x1a\x7f\x44\x16\x7f\x64\x19\xfe\xc8\x5e\xfc\x91\x53\xf8\xc6\x38\xbe\x71\x1c\x7f\x54\x09\xfe\xa8\x1e\xfc\x51\xf3\xf8\xa3\x5b\xf1\x47\x4f\xe0\x8f\xa9\xc3\x1f\x33\x86\x6f\xaa\xc7\x37\xa5\xf1\xc7\xd6\xe1\x8f\x1d\xc7\x1f\x57\x8f\x3f\x6e\x06\x7f\x7c\x27\xfe\xf8\x69\x7c\x73\x02\x7f\x42\x21\xfe\x84\x5a\xfc\x09\x0b\xf8\x13\xdb\xf1\x27\xe5\xe1\x4f\x6a\xc5\xb7\xe4\xe3\x5b\x92\xf8\x93\xcb\xf0\x27\x4f\xe0\x4f\x69\xc6\x9f\x9a\x87\x3f\x35\x85\x4f\x54\xe1\x13\x53\xf8\xd3\xda\xf0\xa7\x17\xe1\x4f\xef\xc3\x9f\x51\x81\x3f\x63\x04\xdf\xda\x88\x6f\x9d\xc7\x9f\xd9\x85\x3f\xab\x0c\x7f\x56\x0e\x7f\x76\x3d\xfe\xec\x59\x7c\x5b\x07\xfe\x9c\x80\x3f\x67\x04\x7f\x6e\x25\xfe\xdc\x34\xfe\xbc\x5a\xfc\x79\xb3\xf8\xf6\x32\xfc\xf9\xf9\xf8\xf3\x3b\xf1\x17\x94\xe2\x2f\x88\xe3\x2f\x98\xc3\x5f\x58\x87\xbf\x70\x06\xdf\xd1\x84\xef\x58\xc0\x5f\x34\x85\xbf\xb8\x0d\x7f\x49\x01\xfe\x92\x3e\x7c\x67\x05\xbe\x73\x18\x7f\x69\x33\xfe\xb2\x66\xfc\xe5\x79\xf8\xcb\xfb\xf0\x5d\x75\xf8\x2b\xf2\xf0\x57\xa4\xf1\x57\x36\xe2\xaf\x2a\xc2\x5f\x95\xc5\x77\x37\xe3\xaf\x2e\xc2\x5f\xdd\x8e\xbf\xa6\x13\x7f\xcd\x2c\xfe\xda\x38\xbe\xa7\x01\xdf\x33\x82\xbf\x2e\x89\xbf\x1e\xfc\xf5\x8d\xf8\xeb\xa7\xf1\x37\xd4\xe2\x93\xd5\xf8\x64\x1a\x7f\x63\x29\xfe\xc6\x1e\xfc\x4d\xe0\x6f\x6a\xc2\xdf\x34\x89\xbf\xb9\x0e\x7f\xf3\x08\xbe\xb7\x06\xdf\x3b\x8c\xbf\xa5\x1e\x7f\xcb\x34\xfe\xd6\x36\xfc\x6d\x85\xf8\xdb\xfa\xf1\xa9\x18\x3e\x35\x8e\xbf\xbd\x0d\x7f\xfb\x28\xfe\x8e\x3a\xfc\x1d\x23\xf8\x3b\x6b\xf0\x7d\xd5\xf8\xbb\xfe\x93\xc5\xdf\x5d\x81\xbf\x7b\x00\x7f\x4f\x29\xfe\x9e\x24\xbe\xbf\x10\xdf\x9f\xc6\xdf\x1b\xf0\xf7\xf6\xe1\xef\x2b\xc2\xdf\xd7\x85\xbf\xbf\x18\x7f\x7f\x0a\x3f\xd0\x8c\x7f\x40\xe0\x1f\x98\xc6\x3f\xd8\x8b\x7f\x28\x8e\x1f\x2c\xc5\x0f\x8e\xe1\x1f\xee\xc6\x3f\x52\x85\x7f\x64\x01\xff\x68\x3b\xfe\xd1\x49\x7c\xba\x19\x9f\x9e\xc1\x3f\xd6\x8c\x7f\x6c\x1a\xff\x78\x0b\xfe\x09\xf0\x4f\x74\xe0\x87\xc0\x0f\x75\xe2\x9f\x2c\xc4\x3f\xd9\x8d\x7f\xaa\x18\xff\x54\x0a\xff\xb4\xc1\x3f\x3d\x8a\xcf\xb4\xe2\x9f\x11\xf8\x67\xc6\xf0\xcf\x76\xe0\x9f\x2b\xc0\x3f\xd7\x80\x7f\x6e\x08\x9f\x2d\xc2\x67\xa7\xf1\xcf\xb7\xe2\x5f\x28\xc0\xbf\xd0\x87\x7f\xb1\x12\xff\x62\x0e\x9f\xab\xc1\xe7\xc6\xf0\x2f\xc5\xf1\x2f\xcd\xe3\x5f\xee\xc1\xbf\x52\x8e\x7f\x65\x02\x3f\x5c\x83\x1f\x9e\xc5\xbf\xda\x84\x7f\x75\x01\xff\x5a\x0b\xfe\xb5\x01\xfc\xeb\x06\xff\xfa\x20\xfe\xf5\x49\xfc\x48\x21\x7e\x64\x04\xff\x46\x02\xff\xc6\x14\xfe\xcd\x4a\xfc\x9b\xf3\xf8\xb7\xd2\xf8\xd1\x52\xfc\x68\x0e\xff\x76\x06\xff\x4e\x2d\xfe\x9d\x29\xfc\xbb\x6d\xf8\xb1\x22\xfc\xd8\x38\xfe\xbd\x38\xfe\xbd\x49\xfc\xfb\x03\xf8\x0f\xaa\xf0\x1f\x4c\xe0\xc7\xab\xf1\xe3\x69\xfc\x87\x95\xf8\x0f\xb3\xf8\x8f\x62\xf8\x8f\x86\xf1\x1f\xd7\xe2\x3f\x9e\xc4\x4f\xb4\xe0\x27\xe6\xf0\x9f\x24\xf0\x9f\x2c\xe0\x3f\xed\xc0\x7f\x96\x87\xff\xac\x13\x3f\x59\x84\x9f\x4c\xe2\x3f\x2f\xc6\x7f\x9e\xc2\x7f\x51\x84\xff\xa2\x13\xff\xc5\x02\xfe\xcb\x1a\xfc\x97\x39\xfc\x54\x02\xff\x95\xc1\x7f\x35\x8e\xff\xba\x0b\xff\x4d\x0c\xff\xcd\x1c\x7e\xba\x0f\xff\x6d\x1c\xff\x9d\xc1\x7f\x37\x8b\xff\xbe\x1e\xff\x7d\x16\x3f\xd3\x8a\xff\xa1\x0c\xff\x43\x12\xff\x63\x31\xfe\xc7\x66\xfc\x8f\x93\xf8\x9f\x6a\xf1\x3f\x65\xf1\xb3\x15\xf8\xd9\x41\xfc\xcf\x02\xff\x73\x2f\x7e\xb1\xc0\x2f\x1e\xc4\xff\x52\x83\x9f\x33\xf8\xb9\x34\xfe\xd7\x72\xfc\xaf\x43\xf8\xdf\xea\xf1\xbf\x4d\xe0\x7f\x6f\xc0\xff\x3e\x85\x9f\x2f\xc1\xcf\xa7\xf0\x7f\x14\xe3\xff\x48\xe0\xff\x18\xc3\xff\x59\x8e\xff\xb3\x03\xff\xe7\x10\xfe\xaf\x42\xfc\x5f\xdd\xf8\x85\x42\xfc\x42\x37\xfe\xef\x02\xfc\xdf\x5d\xf8\x7f\x8a\xf0\xff\xf4\xe0\xff\x2d\xc2\xff\x9b\x24\x50\x4a\x20\x45\x58\xc2\x10\x96\x18\x24\x2c\x59\x4b\x58\x0a\xc2\x52\x7d\x84\xbc\x5a\xc2\xd2\xf9\x84\xa5\xd3\x84\x65\x1a\x08\xcb\x8c\x13\x96\x1d\x21\xe4\x0f\x11\x96\xeb\x22\x2c\xdf\x40\x58\x7e\x96\xb0\x42\x07\x61\x85\x71\x42\x41\x0b\x61\xc5\x7c\xc2\x8a\xbd\x84\x95\x2a\x08\x2b\xa5\x08\x2b\x07\xc2\xca\x73\x84\xc2\x0c\x61\x95\x62\xc2\x2a\x6d\x84\x55\x26\x08\xab\x56\x13\x56\x4d\x12\x56\x9d\x26\xac\x16\x08\xab\x25\x09\x45\x10\x8a\x6a\x09\x45\x43\x84\xd5\x3b\x08\x6b\x94\x10\xd6\xe8\x24\xac\x31\x42\x58\xb3\x82\xb0\xe6\x38\xa1\xb8\x82\x50\x9c\x24\xac\x95\x47\x58\xab\x87\xb0\x36\x84\xb5\x9b\x09\x6b\x8f\x13\xd6\x69\x24\x94\x40\x28\x49\x11\xd6\xad\x26\xac\x3b\x4b\x58\x6f\x82\xf0\xbf\x16\x42\x69\x9c\x50\x9a\x21\xac\x3f\x44\xd8\xa0\x81\x10\x55\x13\x44\x8c\x20\x72\x04\xd9\x44\x90\xe3\x04\xd5\x40\x50\x53\x04\x5d\x46\xd0\x6d\x04\x03\xc1\x34\x10\xcc\x24\xc1\x36\x10\xec\x24\xc1\xb5\x12\x3c\x04\xdf\x4f\x08\x75\x84\x30\x4f\x58\x94\x22\x6c\x58\x41\xd8\x70\x8c\xb0\x51\x1d\x61\xa3\x11\x42\x59\x33\xa1\x6c\x8a\xb0\x49\x20\x6c\x92\x20\x6c\xb2\x40\xd8\xb4\x95\x50\x5e\x40\x28\xef\x20\x94\x8f\x11\x36\xab\x25\x6c\x96\x25\x6c\x1e\x23\x6c\x9e\x21\x6c\x11\x23\x6c\x31\x4c\xa8\x28\x21\x54\x0c\x11\xb6\xec\x23\x6c\x55\x40\xd8\xaa\x8d\xb0\x75\x3e\x61\xeb\x09\x42\x65\x0d\x61\x1b\x41\xd8\xb6\x80\xb0\x6d\x27\x61\xdb\x34\x61\xbb\x5e\x42\xac\x84\x10\xeb\x23\x6c\x6f\x08\xdb\xf7\x11\x76\x10\x84\x1d\x66\x09\x3b\xce\x10\xaa\xa6\x09\x3b\x4d\x10\x76\x16\x84\x9d\x93\x84\x5d\x04\x61\x97\x01\x42\x75\x05\xa1\x7a\x9c\xb0\x6b\x23\x61\xb7\x40\xd8\x6d\x8a\xb0\x7b\x20\xec\x3e\x44\xa8\xa9\x26\xec\x51\x4c\xd8\x63\x8a\xb0\x67\x0f\x61\xaf\x06\x42\x6d\x20\xd4\x2e\x10\xf6\x1e\x21\xec\xd3\x4b\xd8\xb7\x9c\xb0\x6f\x8e\x50\x57\x44\xa8\xeb\x23\xec\xd7\x48\xd8\xbf\x84\xb0\xff\x04\xe1\x80\x24\xa1\xbe\x96\x50\x9f\x26\x1c\x58\x4c\x38\xb0\x83\x70\x50\x21\xe1\xa0\x56\xc2\x41\x93\x84\x83\x93\x84\x83\xc7\x09\x71\x41\x88\xb7\x10\xe2\x33\x84\x43\xc6\x09\x87\x66\x09\x87\x09\xc2\x61\x49\x42\x43\x3e\xa1\x61\x98\x70\x78\x2d\xe1\xf0\x2c\xe1\x88\x40\x38\x22\x4b\x38\xb2\x9c\x70\x64\x3f\xa1\xb1\x88\xd0\xd8\x4c\x68\xcc\x11\x8e\xaa\x26\x1c\x35\x4d\x38\xba\x92\x70\x74\x37\xe1\xe8\x29\xc2\x31\x95\x84\x63\x86\x09\x4d\x75\x84\xa6\x49\xc2\xb1\x4d\x84\x63\xe7\x08\xc7\x35\x11\x8e\x1b\x26\x1c\x5f\x4b\x38\x3e\x43\x68\x36\x84\xe6\x24\xa1\x79\x96\x70\x42\x3d\xe1\x84\x61\xc2\x89\xe5\x84\x13\x53\x84\x93\x0a\x08\x27\xb5\x12\x4e\x9a\x21\xb4\xb4\x13\x5a\xd2\x84\x93\xf3\x08\x27\xb7\x10\x4e\x1e\x23\x9c\x52\x47\x38\xb5\x84\x90\xc8\x27\x24\x9a\x09\x89\x51\xc2\x69\xe5\x84\xd3\x92\x84\xd3\x66\x08\xa7\x77\x10\x4e\x9f\x24\x9c\x51\x49\x38\x23\x49\x68\x2d\x25\xb4\x0e\x10\xce\xac\x20\x9c\xd9\x4b\x38\x2b\x8f\x70\x56\x33\xe1\xec\x40\x38\x7b\x82\xd0\x96\x20\x9c\x63\x08\xe7\x4c\x10\xce\xad\x23\x9c\x3b\x42\x38\xaf\x92\x70\xde\x28\xa1\x5d\x10\xda\xfb\x08\xe7\x97\x12\xce\x4f\x12\x2e\x28\x22\x5c\xd0\x43\xb8\x60\x8a\x70\x61\x03\xe1\xc2\x0c\xa1\x03\x42\x47\x2d\xa1\x23\x49\xb8\x28\x9f\x70\x51\x1f\xe1\xe2\x7a\xc2\xc5\xa3\x84\x4b\x62\x84\x4e\x43\xe8\xec\x27\x5c\xda\x43\xb8\x74\x8e\x70\xd9\x24\xe1\xf2\x51\x42\x57\x0d\xa1\x6b\x84\x70\x45\x15\xe1\x8a\x2c\xe1\xca\x2c\xe1\xaa\x61\x42\x77\x27\xe1\x6a\x08\x57\x8f\x11\xae\x11\x84\x6b\x4b\x09\xd7\x4e\x11\x7a\xfa\x09\xd7\x19\xc2\xf5\x35\x84\x1b\x02\x21\x09\x21\x99\x24\xdc\xd8\x45\xb8\x29\x10\x6e\x1a\x20\xdc\x1c\x08\x37\x0f\x12\x7a\xf3\x08\xbd\xf5\x84\xde\x71\xc2\x2d\x71\xc2\x2d\x23\x84\x5b\x2b\x08\xb7\x66\x09\xb7\x15\x11\x6e\x4b\x12\x52\x45\x84\x54\x0b\x21\x35\x44\xb8\x5d\x10\x6e\x6f\x27\xdc\x9e\x26\xdc\x51\x41\xb8\x23\x4b\xb8\xb3\x9a\x70\xe7\x30\xa1\xaf\x9a\xd0\x37\x4a\xb8\xab\x9e\x70\x57\x3f\xe1\xee\x2a\xc2\xdd\x53\x84\x7b\x3a\x08\xf7\x0c\x11\xfa\x05\xa1\xbf\x9b\xd0\x3f\x4f\xb8\xb7\x9e\x70\xef\x28\xe1\xbe\x42\xc2\x7d\x55\x84\xfb\x46\x09\xf7\x37\x12\xee\x4f\x12\x06\x02\x61\x20\x47\x78\xa0\x98\xf0\x40\x27\xe1\x81\x19\xc2\x83\x35\x84\x07\xb3\x84\x87\xfa\x09\x0f\x4d\x10\x06\xcb\x08\x83\x8d\x84\xc1\x34\xe1\xe1\x7c\xc2\xc3\x71\xc2\xc3\x83\x84\x47\x2a\x09\x8f\x4c\x12\xd2\x55\x84\xc7\x6a\x08\x8f\xd7\x12\x1e\x9f\x23\x3c\x31\x44\x18\xaa\x27\x0c\x8d\x13\x9e\x6c\x24\x3c\x39\x4c\x78\x4a\x10\x9e\x4a\x13\x9e\x2e\x23\x3c\x3d\x40\xc8\x94\x10\x32\x59\xc2\x33\x8d\x84\x67\xa6\x09\xcf\x76\x12\x9e\x0b\x84\xe7\x86\x09\xd9\x66\xc2\xf3\x85\x84\xe7\x87\x08\x2f\x18\xc2\x0b\x49\xc2\x8b\x85\x84\x17\x7b\x08\xb9\x52\x42\xae\x87\xf0\x52\x1e\xe1\xa5\x04\xe1\xa5\x71\xc2\xcb\xd5\x84\x97\x87\x08\xaf\x18\xc2\x2b\x49\xc2\x2b\x0b\x84\xe1\x66\xc2\xf0\x04\xe1\xd5\x06\xc2\x6b\xf9\x84\xd7\xfa\x09\xaf\xd7\x10\x5e\x9f\x25\x8c\x74\x13\xde\x28\x23\xbc\x31\x42\x78\x33\x46\x78\x73\x86\xf0\x56\x0f\x61\xb4\x9c\x30\x3a\x46\x78\xbb\x96\xf0\xf6\x28\xe1\x9d\x51\xc2\x18\x84\xf7\x9a\x08\xef\x57\x12\xde\x1f\x22\x7c\x10\x08\x1f\xf4\x11\xc6\x4b\x08\xe3\x2d\x84\x0f\x8b\x09\x1f\x76\x10\x3e\x2a\x25\x7c\xd4\x45\xf8\xb8\x94\xf0\x71\x9a\x30\x21\x08\x13\x3d\x84\x4f\xf2\x08\x9f\xb4\x10\x3e\x99\x20\x7c\x5a\x45\xf8\x34\x4d\xf8\x2c\x10\x3e\x4b\x11\x3e\x9b\x24\x4c\xd6\x12\x26\xb3\x84\xcf\xcb\x08\x9f\xa7\x08\x5f\x40\xf8\xa2\x85\xf0\xc5\x24\xe1\xcb\x5a\xc2\x97\x59\xc2\x54\x05\x61\x6a\x8c\xf0\x55\x0b\xe1\xeb\x42\xc2\xd7\x03\x84\x6f\xaa\x09\xdf\x4c\x12\xa6\xcb\x09\xd3\x5d\x84\xe9\x19\xc2\xb7\x31\xc2\xb7\x3d\x84\xef\xba\x08\xdf\xcd\x13\xbe\xef\x20\x7c\x3f\x45\x98\xa9\x27\xcc\x0c\x12\x7e\xc8\x27\xfc\xd0\x4a\xf8\x61\x92\xf0\x63\x8c\xf0\x63\x8a\xf0\x13\x84\x9f\x9a\x09\x3f\x8d\x10\x66\x5b\x09\xb3\x53\x84\x9f\x6b\x08\x3f\x67\x08\x8b\xab\x08\x8b\x87\x09\xbf\x54\x13\x7e\x19\x25\xcc\x15\x11\xe6\x12\x84\x5f\x63\x84\x5f\x3b\x08\xbf\xce\x12\x7e\xab\x25\xfc\x96\x26\xfc\x36\x4f\xf8\xbd\x89\xf0\xfb\x00\x61\xbe\x80\x30\x9f\x20\xcc\x8f\x12\xfe\x28\x23\xfc\xd1\x45\xf8\x63\x84\xf0\x67\x20\xfc\xd9\x49\xf8\x73\x98\xf0\x57\x01\xe1\xaf\x26\xc2\x5f\xc3\x84\x05\x41\x58\x18\x23\xfc\xdd\x45\xf8\x27\x10\xfe\x19\x23\xfc\xdb\x42\xf8\x37\xcb\x22\x2a\x58\x44\x9a\x45\x4b\x18\x16\x2d\x31\xc8\xa2\x25\xab\x58\xb4\xe4\x18\x8b\x96\xaa\x65\x51\x5e\x09\x8b\xf2\xfa\x58\xb4\x74\x3e\x8b\x96\xee\x66\xd1\xd2\xd3\xfc\x9f\xe2\xf8\x8d\x6b\x45\xfe\x1b\x38\xfc\x46\x08\x61\x18\x86\xd0\x61\x18\xfa\xfe\xfd\x84\x21\x84\x10\xc2\x10\xc2\x10\x42\x08\x21\x84\x61\x88\x13\xc2\x10\xc2\x10\x86\x1c\x39\x67\x08\x71\x42\x08\x21\x0c\x21\x84\x30\x84\x30\x8c\x5f\x08\xf7\xeb\x7e\x70\x3d\xb8\xd4\x0a\xed\xa8\x15\xe6\x51\x2b\xd6\xa1\x56\x9c\x40\x95\x36\xa1\x4a\x67\x51\x2b\x55\xa3\x56\x1a\x45\xad\xdc\x8c\x5a\x39\x87\x5a\x25\x8e\x5a\x65\x1e\x55\x56\x81\x2a\x6b\x42\x95\x8d\xa0\x56\x8d\xa3\x56\x2d\xa2\x56\x9b\x40\xad\x6e\x51\xab\x77\xa3\x02\x55\xa8\x40\x2f\x6a\x8d\x5a\xd4\x1a\xe3\xa8\x35\x23\xa8\x35\x93\xa8\x35\xf3\xa8\xb5\xea\x50\x6b\x75\xa1\x82\x15\xa8\x60\x1c\xb5\x76\x19\x6a\xed\x01\xd4\x3a\x8d\xa8\x75\xe3\xa8\x50\x29\x2a\xd4\x83\x5a\xaf\x0a\xb5\xde\x34\x6a\xfd\x4e\xd4\x06\x51\xd4\x06\x23\xa8\xf2\x1a\x54\xf9\x24\x6a\xc3\x76\xd4\x46\x65\xa8\x8d\x32\xa8\x8d\x23\xa8\x8d\xfb\x51\x1b\xcf\xa0\x2a\x5a\x51\x15\x05\xd4\x82\x76\xd4\x82\x79\xd4\x26\x03\xa8\x4d\xcb\x50\x9b\x26\x51\xe1\x30\x2a\x3c\x86\xda\xac\x15\xb5\x79\x29\x6a\xf3\x0e\xd4\x16\xa0\xb6\xe8\x46\x6d\x31\x81\x8a\x34\xa2\x22\xa3\xa8\x2d\xeb\x51\x5b\x4e\xa0\xb6\xaa\x47\x6d\x95\x41\x6d\x55\x40\x6d\xdd\x8e\xda\x7a\x0e\x55\x19\x43\x55\xe6\x50\xaa\x01\xa5\xe6\x51\x3a\x8d\x32\x51\x94\x99\x40\xd9\x0e\x94\xab\x44\xb9\x29\x94\x9f\x44\x49\x01\x55\x65\x51\x55\x69\xd4\x36\x01\xd4\x36\x49\xd4\x36\x53\xa8\x6d\xab\x51\xdb\xf6\xa0\xb6\x0b\xa1\xb6\xeb\x40\x6d\x37\x81\x8a\x56\xa0\xa2\xad\xa8\xed\x41\x6d\xdf\x86\xda\x7e\x1a\xb5\x43\x25\x6a\x87\x7e\xd4\x0e\x53\xa8\x1d\x63\xa8\x1d\x47\x51\xd5\x51\x54\x75\x1a\xb5\x53\x10\xb5\x53\x14\xb5\xb3\x45\xed\x9c\x46\xed\x52\x8a\xda\xa5\x0b\xb5\xcb\x24\xaa\xa6\x12\x55\xd3\x8f\xda\x35\x84\xda\xb5\x05\xb5\xeb\x14\x6a\xb7\x6a\xd4\x6e\x29\xd4\x6e\x79\xd4\xee\x51\xd4\xee\x9d\xa8\xdd\xf3\xa8\xda\x18\xaa\x76\x18\xb5\x47\x04\xb5\x47\x1a\xb5\x67\x09\x6a\xcf\x46\xd4\x9e\x7d\xa8\x3d\x67\x50\x7b\xa5\x51\x7b\xe5\x51\x75\x95\xa8\xba\x76\x54\xdd\x30\x6a\xef\x20\x6a\xef\x16\xd4\xde\x59\xd4\x3e\x41\xd4\x3e\x05\xd4\xbe\x31\xd4\xbe\xfd\xa8\xfa\x52\x54\x7d\x23\xaa\xbe\x1f\xb5\x5f\x0f\x6a\xbf\x39\xd4\xfe\xcd\xa8\x03\xca\x51\x07\xa4\x50\xb1\x10\x2a\xd6\x87\x3a\x30\x8a\x3a\x70\x0c\x75\x50\x03\xea\xa0\x22\xea\xe0\x24\xaa\x21\x88\x6a\x18\x40\x1d\x52\x87\x3a\x24\x8f\x3a\x34\x81\x3a\x2c\x88\x3a\x2c\x83\x6a\x9c\x42\x1d\x11\x44\x1d\xd9\x80\x3a\x32\x87\x8a\x4f\xa0\x8e\x9a\x40\x1d\xdd\x8a\x3a\x26\x81\x6a\xaa\x45\x35\x15\x50\xc7\x0e\xa3\x8e\xeb\x41\x1d\xdf\x82\x6a\xae\x46\x35\x4f\xa2\x4e\x68\x41\x9d\x90\x43\x9d\x38\x81\x3a\x29\x8a\x3a\x29\x8d\x3a\x69\x1e\xd5\x12\x47\xb5\x8c\xa0\x4e\xae\x46\x9d\x9c\x46\x9d\x12\x40\x9d\x92\x46\x9d\x1a\x40\x9d\xda\x89\x3a\x75\x0a\xd5\x6a\x51\xad\x03\xa8\xd3\x2a\x50\xa7\xf5\xa0\x4e\x2b\xa2\x4e\x8f\xa0\x4e\x4f\xa3\xce\xb0\xa8\x33\x5a\x50\x67\x4c\xa1\xda\x0a\xa8\x33\x5b\x51\x67\xc5\x51\x67\x8d\xa1\xce\xae\x47\x9d\x3d\x85\x6a\x6f\x44\xb5\x4f\xa0\xce\x69\x40\x9d\x33\x8a\x3a\xb7\x09\x75\xee\x38\xea\xbc\x28\xaa\xa3\x03\x75\x7e\x10\x75\x41\x2f\xea\xc2\x28\xea\xc2\x51\x54\xa2\x09\x95\x18\x40\x5d\xd4\x80\xba\x68\x18\x75\x71\x1c\x75\xf1\x38\xea\x92\x10\xea\x92\x16\xd4\x25\x43\xa8\x64\x29\x2a\x99\x43\x5d\x6a\x51\x97\x36\xa3\x2e\x1d\x45\x5d\x16\x40\x5d\xd6\x86\xba\x2c\x87\xba\xbc\x11\xd5\x59\x81\xea\x6c\x43\x5d\x11\x46\x5d\x31\x89\xba\xb2\x01\xb5\x30\x88\x5a\x38\x81\xea\xea\x41\x75\x0d\xa3\xba\x8a\xa8\xab\xda\x50\x57\x4d\xa2\xae\x8e\xa1\xae\x1e\x44\x5d\xd3\x88\xba\x26\x83\xba\xa6\x80\xea\xae\x45\x75\xf7\xa3\xae\x2d\x43\x5d\xdb\x86\xba\x76\x02\x75\x5d\x14\x75\x5d\x1a\x75\x3d\xa8\xeb\x9b\x51\xd7\x0f\xa1\x52\x41\x54\x2a\x8e\x4a\xf5\xa2\x52\x79\xd4\x0d\x75\xa8\x1b\x86\x51\x37\xb6\xa0\x6e\x9c\x41\xdd\xd4\x84\xba\x69\x0a\xd5\xd3\x88\xea\x99\x40\xdd\x1c\x47\xdd\x52\x82\xba\xa5\x0b\x75\x2b\xa8\x5b\x3b\x51\xbd\x11\x54\x6f\x06\x75\x5b\x04\x75\xdb\x24\xea\xf6\x14\xea\x8e\x52\xd4\x1d\x09\xd4\x1d\x79\x54\x3a\x8e\x4a\x4f\xa0\xee\x2c\x41\xdd\x39\x8d\xba\x2b\x84\xba\xab\x1b\x75\x77\x19\xea\xee\x14\xea\xee\x19\x54\x5f\x39\xaa\xaf\x13\x75\x4f\x00\x75\x4f\x0a\x75\x4f\x1e\x75\x6f\x2d\xea\xde\x3e\xd4\xbd\x79\xd4\x7d\x0d\xa8\xfb\x26\x51\x99\x2a\x54\xa6\x03\x95\x19\x44\x65\xe6\x50\xf7\x57\xa3\xee\x4f\xa2\xee\x1f\x45\x3d\x50\x83\x7a\xa0\x17\xf5\xc0\x14\xea\xc1\x10\xea\xc1\x3a\xd4\x83\xa3\xa8\x7e\x8b\xea\xef\x47\x3d\x14\x41\x3d\x94\x44\x2d\x2a\x41\x2d\xea\x41\x3d\x1c\x41\x3d\xdc\x83\x1a\x08\xa2\x06\xda\x51\x03\x59\xd4\x23\x61\xd4\x23\x6d\xa8\x47\x26\x51\x8b\xc3\xa8\xc5\x6d\xa8\xc5\x83\xa8\xc5\xb3\xa8\x25\x16\xb5\xa4\x1d\xb5\x64\x18\x95\x2d\x47\x65\x13\xa8\xec\x14\xea\xd1\x5a\xd4\xa3\x7d\xa8\xc7\x1a\x50\x8f\xa5\x51\x8f\xcd\xa1\x1e\xaf\x41\x3d\x3e\x80\x1a\x2c\x45\x0d\x36\xa3\x06\x47\x50\x4f\x54\xa0\x9e\x48\xa0\x9e\x2c\x41\x3d\xd9\x84\x7a\x72\x16\xf5\x54\x2d\xea\xa9\x11\xd4\x53\xf3\xa8\xa1\x1a\xd4\x50\x2f\x6a\xa8\x88\x7a\xba\x09\xf5\xf4\x30\xea\xe9\x79\xd4\x33\x71\xd4\x33\xdd\xa8\x67\xc6\x50\x4b\x4b\x51\x4b\xab\x51\x4b\xdb\x50\x4b\x33\xa8\xa5\x53\xa8\xe1\x18\x6a\x38\x89\x1a\x1e\x46\x3d\x5b\x8b\x7a\x76\x0c\xf5\x5c\x00\xf5\x5c\x0f\xea\xb9\x29\xd4\xf3\x41\xd4\xf3\x71\xd4\xf3\x19\xd4\xf3\x05\xd4\x48\x14\x35\xd2\x8f\x1a\x99\x47\xbd\x10\x43\xbd\xd0\x8f\x7a\xb1\x12\xf5\x62\x17\xea\xc5\x09\xd4\x4b\x95\xa8\x97\x12\xa8\x97\xf2\xa8\xd1\x28\x6a\xb4\x15\x35\x3a\x80\x1a\x9d\x47\xbd\x1c\x45\xbd\x3c\x8f\x7a\x65\x00\xf5\x6a\x15\xea\xd5\x11\xd4\x58\x3d\x6a\xac\x17\xf5\x5a\x1d\xea\xb5\x39\xd4\xeb\x4d\xa8\xd7\x47\x50\x6f\x44\x50\x6f\x64\x50\xe3\x25\xa8\xf1\x3c\xea\xcd\x3a\xd4\x9b\xfd\xa8\xb7\x4a\x51\x6f\xb5\xa0\xde\xca\xa1\xde\xb6\xa8\xb7\x53\xa8\x5c\x09\x2a\x97\x40\xbd\x53\x8a\x7a\x27\x85\x7a\xb7\x1c\xf5\xee\x20\xea\xbd\x30\xea\xbd\x5e\xd4\x44\x19\x6a\xa2\x16\x35\x31\x84\x7a\x3f\x84\x7a\xbf\x0d\xf5\xfe\x38\xea\x83\x4a\xd4\x07\x6d\xa8\x0f\xa6\x51\x1f\x96\xa3\x3e\xec\x40\x7d\x38\x87\x9a\xec\x40\x4d\x8e\xa3\x3e\x0a\xa1\x3e\xaa\x47\x7d\x94\x42\x7d\xdc\x84\xfa\x38\x8d\xfa\x78\x02\xf5\x49\x00\xf5\x49\x1c\xf5\xc9\x00\xea\x93\x19\xd4\x54\x18\x35\xd5\x80\x9a\x9a\x40\x7d\x5a\x82\xfa\xb4\x0a\xf5\x69\x3b\xea\xb3\x30\xea\xb3\x14\xea\xb3\x79\xd4\xe7\xcd\xa8\xcf\xa7\x50\x5f\x04\x50\x5f\xd6\xa0\xbe\x1c\x42\xe5\x03\xa8\x7c\x1f\xea\xeb\x10\xea\xeb\x14\xea\xeb\x59\xd4\x37\x75\xa8\x6f\x86\x50\xdf\x86\x51\xdf\x76\xa3\xbe\x9d\x46\xcd\xb4\xa0\x66\x46\x50\xdf\x55\xa2\xbe\xeb\x44\x7d\x97\x47\x7d\x5f\x8b\xfa\x3e\x8b\xfa\xa1\x1c\xf5\x43\x27\xea\x87\x19\xd4\x6c\x2d\x6a\x76\x00\xf5\x63\x10\xf5\xe3\x24\xea\xa7\x3e\xd4\xcf\x2d\xa8\x82\x45\x15\x5a\x51\xbf\x54\xa2\x7e\xe9\x43\xfd\xda\x8a\xfa\x2d\x84\xfa\x6d\x0e\x55\x1c\x47\xfd\x9e\x45\xfd\xd1\x8a\xfa\x5f\x18\x35\xd7\x8c\x9a\x9b\x47\xfd\xd9\x8a\xfa\x73\x0c\xf5\x57\x15\xea\xaf\x0c\xea\xef\x10\xea\xef\x76\xd4\xdf\x43\xa8\xf9\x52\xd4\x7c\x02\xf5\x4f\x15\xea\x9f\x29\xd4\xbf\x95\xa8\x7f\x47\x50\xff\xc5\x51\xff\xcd\xa1\x69\x46\x33\x88\x5e\xa6\x12\xbd\xcc\x10\x7a\xd9\x08\x7a\xd9\x0e\xf4\xb2\x93\xe8\xe5\xba\xd1\xcb\xe5\xd1\x25\x69\xf4\xf2\x95\xe8\xe5\xb3\xe8\x15\xc2\xe8\x15\x7a\xd0\x2b\xcc\xa0\x57\x8c\xa1\x57\x4c\xa0\x57\x2c\xa0\x4b\xcb\xd1\xa5\xb5\xe8\xd2\x09\xf4\x4a\x49\xf4\x4a\xfd\xe8\x95\xe3\xe8\x55\x22\xe8\x55\xfa\xd0\x65\x41\x74\x59\x33\xba\x6c\x0e\xbd\x6a\x13\x7a\xd5\x1e\xf4\xaa\x45\xf4\x6a\xf3\xe8\xd5\xbb\xd1\x81\x10\x3a\x90\x40\x07\xa6\xd1\x6b\x74\xa0\xd7\x98\x42\xaf\x59\x83\x5e\xb3\x0f\xbd\x56\x04\xbd\x56\x07\x7a\xad\x29\x74\x30\x8e\x0e\x8e\xa2\xd7\x0e\xa3\xd7\x6e\x45\xaf\x3d\x89\x5e\xa7\x16\xbd\xce\x20\x7a\xdd\x28\x7a\xdd\x04\x3a\x54\x82\x0e\xc5\xd1\xa1\x31\xf4\x7a\x15\xe8\xf5\x7a\xd0\xeb\x07\xd1\xeb\xb7\xa3\xd7\x9f\x40\x6f\x50\x85\xde\x20\x83\xde\xa0\x80\x2e\xef\x44\x6f\x58\x8a\xde\xb0\x1b\xbd\x51\x08\xbd\x51\x1a\xbd\x71\x05\x7a\xe3\x7e\xf4\xc6\x73\xe8\x8a\x7a\x74\xc5\x30\x7a\x41\x10\xbd\xa0\x0b\xbd\x60\x0a\xbd\xc9\x0c\x7a\xd3\x18\x7a\xd3\x3e\x74\x38\x88\x0e\xf7\xa2\x37\x0b\xa1\x37\x8b\xa3\x37\x1b\x40\x6f\x0e\x7a\xf3\x18\x7a\xf3\x0c\x7a\x8b\x32\xf4\x16\xed\xe8\x2d\x06\xd0\x91\x00\x3a\xd2\x81\x8e\x14\xd0\x5b\x36\xa1\xb7\x1c\x46\x6f\x39\x87\xde\xaa\x1d\xbd\xd5\x10\x7a\x6b\x8b\xde\xba\x0b\xbd\xf5\x34\xba\xb2\x09\x5d\x39\x82\x56\x16\xad\xfa\xd0\xba\x0c\xad\xfb\xd0\x26\x88\x36\x1d\x68\x53\x44\xdb\x56\xb4\x9d\x41\xbb\x24\xda\xe5\xd0\xbe\x01\xed\x27\xd0\x52\x86\x96\x24\xba\xaa\x04\x5d\xd5\x80\xae\xca\xa0\xab\x66\xd0\xdb\x8c\xa2\xb7\xb5\xe8\x6d\xbb\xd1\xdb\xce\xa1\xb7\xb3\xe8\xed\xda\xd1\xdb\x8d\xa3\xa3\x55\xe8\xe8\x00\x7a\xfb\x30\x7a\xfb\x0c\x7a\x87\x0a\xf4\x0e\x7d\xe8\x1d\x8a\xe8\x1d\xdb\xd1\x3b\x16\xd1\xd5\x1d\xe8\x9d\xda\xd1\x3b\x47\xd1\x3b\x8f\xa0\x77\x19\x40\xd7\xd4\xa3\x77\x8d\xa2\x77\x9d\x45\xef\xd6\x85\xde\x3d\x86\xde\x7d\x1e\x5d\x3b\x8a\xde\xa3\x19\xbd\xc7\x04\x7a\xcf\x28\x7a\xcf\x51\xf4\x5e\x01\xf4\x5e\xfd\xe8\xba\x6a\x74\x5d\x17\x7a\xef\x72\xf4\xde\x59\xf4\x3e\xb5\xe8\x7d\x3a\xd0\xfb\x4c\xa3\xf7\x6d\x44\xef\x9b\x43\xd7\x97\xa0\xeb\x13\xe8\xfa\x19\xf4\x7e\xcd\xe8\xfd\xf2\xe8\xfd\x5b\xd1\xfb\x17\xd1\x07\x74\xa1\x63\xe5\xe8\xd8\x00\xfa\xc0\x08\xfa\xc0\x2c\xfa\xa0\x1a\xf4\x41\x1d\xe8\x83\xe6\xd0\x07\x77\xa3\x1b\x02\xe8\x86\x2e\xf4\x21\x65\xe8\x43\x7a\xd0\x87\x86\xd0\x87\x66\xd0\x87\x95\xa2\x0f\xab\x46\x37\x56\xa2\x1b\x27\xd0\x87\x27\xd0\x47\x84\xd1\x47\xe4\xd0\x47\x76\xa0\x8f\x9c\x43\xc7\x3b\xd0\xf1\x79\xf4\x51\x5d\xe8\xa3\xc3\xe8\xa3\x3b\xd1\xc7\x58\xf4\x31\x03\xe8\x63\xe6\xd1\x4d\x31\x74\x53\x27\xba\x69\x0a\x7d\x6c\x3d\xfa\xd8\x51\xf4\x71\x8d\xe8\xe3\xb2\xe8\xe3\x4b\xd1\xc7\x67\xd0\xcd\x75\xe8\xe6\x24\xba\x79\x08\x7d\x42\x00\x7d\x42\x37\xfa\xc4\x52\xf4\x89\x1d\xe8\x13\xf3\xe8\x93\x06\xd0\x2d\xed\xe8\x96\x31\xf4\xc9\xa5\xe8\x93\x9b\xd0\xa7\x04\xd0\xa7\x8c\xa0\x4f\x6d\x45\x9f\x3a\x8e\x6e\x8d\xa3\x4f\xb3\xe8\xd3\x4b\xd0\xa7\xd7\xa1\x4f\xcf\xa3\xcf\xe8\x40\x9f\x51\x40\xb7\x35\xa3\xcf\x0c\xa0\xcf\x8c\xa1\xcf\x1c\x43\x9f\x55\x89\x3e\xab\x15\x7d\xd6\x14\xfa\xec\x18\xfa\xec\x14\xfa\xec\x59\x74\xfb\x30\xfa\x9c\x6e\xf4\xb9\x11\xf4\xb9\x59\xf4\x79\xe5\xe8\xf3\x72\xe8\x8e\x18\xba\x63\x10\x7d\x7e\x18\x7d\x7e\x2b\xfa\xfc\x19\xf4\x05\x51\xf4\x05\x03\xe8\x0b\x41\x5f\x58\x8f\xbe\x70\x04\x9d\x08\xa0\x13\xdd\xe8\x8b\x42\xe8\x8b\xc6\xd1\x17\x27\xd1\x97\x58\xf4\x25\xd3\xe8\x64\x14\x9d\xcc\xa3\x2f\x6d\x45\x5f\x5a\x44\x5f\xd6\x8a\xbe\xbc\x0a\x7d\xf9\x2c\xba\x33\x8e\xee\xcc\xa1\xaf\x68\x44\x5f\x91\x45\x5f\x19\x46\x5f\xd9\x8c\x5e\x58\x81\x5e\x38\x82\xee\xaa\x45\x77\x0d\xa2\xbb\xe6\xd1\x57\xb5\xa0\xaf\x1a\x44\x5f\x6d\xd1\x57\xa7\xd0\xd7\x94\xa1\xbb\xcb\xd1\xdd\xed\xe8\x6b\x3b\xd1\xd7\x35\xa2\xaf\xaf\x40\x5f\x3f\x87\x4e\x65\xd0\x37\x24\xd0\x37\x36\xa2\x6f\x1c\x44\xdf\x94\x46\xf7\x74\xa0\x7b\xc6\xd0\x37\x67\xd0\xb7\x74\xa0\x6f\x0d\xa1\x6f\x6d\x47\xdf\x3a\x8c\xee\xad\x42\xf7\xa6\xd1\xb7\x05\xd1\xb7\x15\xd1\xb7\xa7\xd1\x77\x54\xa2\xef\x18\x43\xa7\xeb\xd1\xe9\x19\xf4\x9d\x29\xf4\x5d\x71\xf4\xdd\x4d\xe8\xbe\x18\xfa\x9e\x08\xfa\x9e\x11\xf4\xbd\xa5\xe8\x7b\x6b\xd0\xf7\xf6\xa1\xef\x2d\xa0\xef\x8b\xa1\xef\xeb\x41\x67\x6a\xd0\x99\x19\xf4\xfd\x11\xf4\xfd\x03\xe8\x07\x1a\xd0\x0f\xe4\xd1\x0f\xb6\xa2\xfb\xc3\xe8\xfe\x14\xba\x7f\x0a\xfd\x50\x04\xfd\x50\x0a\xbd\xa8\x0a\xbd\x68\x0a\xfd\x70\x17\x7a\xa0\x0a\x3d\x30\x8d\x7e\xa4\x03\xfd\xc8\x14\x7a\x71\x23\x7a\x71\x27\x7a\x49\x25\x7a\x49\x37\x7a\xc9\x3c\x3a\x5b\x85\xce\x8e\xa3\x1f\x0d\xa1\x1f\x4d\xa2\x1f\x2d\xa2\x1f\xeb\x44\x3f\x1e\x44\x3f\x9e\x41\x0f\x86\xd0\x83\xdd\xe8\x27\x40\x3f\xd1\x8e\x7e\x62\x1c\xfd\x64\x35\xfa\xc9\x41\xf4\x53\xbd\xe8\xa1\x7a\xf4\xd3\x31\xf4\xd3\x73\xe8\x67\x6a\xd0\xcf\x8c\xa3\x97\x96\xa3\x97\x26\xd1\x4b\x73\xe8\xe1\x20\x7a\xb8\x19\x3d\x3c\x81\x7e\xb6\x16\xfd\x6c\x0a\xfd\x6c\x01\xfd\x5c\x2b\xfa\xb9\x21\xf4\xf3\xf5\xe8\xe7\xd3\xe8\xe7\xa7\xd0\x23\x6d\xe8\x91\x09\xf4\x0b\x95\xe8\x17\x23\xe8\x17\x47\xd0\x2f\x35\xa0\x47\x2b\xd0\xa3\xe3\xe8\x97\xeb\xd0\x2f\x77\xa3\x5f\x9e\x40\xbf\x12\x43\xbf\x32\x86\x7e\x35\x80\x7e\x75\x0e\x3d\xd6\x80\x1e\x1b\x40\xbf\x56\x81\x7e\xad\x17\xfd\x7a\x09\xfa\xf5\x28\xfa\xf5\x1c\xfa\x8d\x06\xf4\x1b\x79\xf4\x78\x14\x3d\x3e\x80\x7e\xb3\x12\xfd\x66\x33\xfa\xcd\x69\xf4\x5b\x41\xf4\x5b\x8d\xe8\xb7\x86\xd0\x6f\x97\xa0\xdf\xae\x41\xbf\x9d\x42\xbf\x3d\x8e\xce\x85\xd1\xb9\x38\x3a\x37\x88\x7e\xa7\x14\xfd\x4e\x2d\xfa\x9d\x6e\xf4\x3b\x53\xe8\x77\x23\xe8\x77\xeb\xd1\xef\x16\xd0\xef\xf5\xa0\xdf\x9b\x45\x4f\xa4\xd0\x13\x33\xe8\xf7\xeb\xd1\xef\x17\xd0\x1f\x74\xa2\x3f\x0c\xa2\x3f\x4c\xa2\x3f\x9c\x42\x4f\xb6\xa1\x3f\x2a\x41\x7f\xd4\x83\xfe\x38\x82\xfe\x78\x18\xfd\x49\x00\xfd\x49\x16\x3d\x55\x81\x9e\x1a\x45\x7f\x5a\x89\xfe\xb4\x07\xfd\xe9\x1c\xfa\xb3\x71\xf4\xe7\x15\xe8\xcf\x87\xd1\xd3\x8d\xe8\xe9\x02\xfa\x8b\x14\xfa\x8b\x3c\xfa\xcb\x4a\xf4\x97\x5d\xe8\x2f\xf3\xe8\xaf\x2a\xd0\x5f\xf5\xa1\xbf\x9a\x42\xe7\x43\xe8\x7c\x0d\x3a\xdf\x87\xce\x17\xd1\x5f\xc7\xd1\x5f\x8f\xa1\xbf\x89\xa3\xbf\x99\x45\x7f\x5b\x8e\xfe\x36\x8b\x9e\x09\xa3\x67\x92\xe8\x99\x51\xf4\x77\x55\xe8\xef\x26\xd0\xdf\x47\xd0\xdf\xb7\xa3\xbf\x1f\x46\x7f\x3f\x83\xfe\x21\x8a\xfe\xa1\x05\x3d\x1b\x45\xcf\xce\xa0\x7f\x2c\x47\xff\x18\x43\xff\xd8\x89\xfe\x71\x18\xfd\x63\x11\xfd\x53\x25\xfa\xa7\x66\xf4\xcf\x01\xf4\xcf\x23\xe8\x42\x18\x5d\xe8\x42\xff\x52\x86\xfe\xa5\x05\xfd\x4b\x01\xfd\x6b\x07\xfa\xd7\x79\xf4\x6f\x09\xf4\x6f\x53\xe8\x62\x23\xba\x38\x88\xfe\x3d\x84\xfe\xbd\x1d\xfd\x7b\x0e\xfd\x47\x0d\xfa\x8f\x2e\xf4\x1f\xe3\xe8\xff\x95\xa3\xff\xd7\x8b\x9e\xab\x40\xcf\x75\xa0\xe7\x72\xe8\x3f\x03\xe8\x3f\xe3\xe8\x3f\x07\xd1\x7f\x85\xd1\x7f\xb5\xa1\xff\x9a\x40\xff\x5d\x83\xfe\xbb\x0d\xfd\xf7\x28\x7a\x3e\x88\xfe\xa7\x04\xfd\x4f\x03\xfa\x9f\x14\xfa\x9f\x19\xf4\xbf\x16\xfd\x6f\x17\xfa\xdf\x22\xfa\xbf\x0a\xf4\x7f\xed\xe8\xff\xc6\x31\x94\x61\xa8\xc6\x30\x82\x59\xa6\x1c\xb3\x4c\x3d\x66\x99\x14\x66\x99\x29\xcc\xb2\x6d\x98\x65\x07\x30\xcb\x55\x61\x96\x6b\xc6\x2c\x37\x89\x29\xa9\xc7\x94\x74\x61\x4a\xe6\x31\xcb\x57\x63\x96\x4f\x61\x96\x9f\xc0\xac\x50\x8b\x59\x61\x0c\xb3\x62\x27\x66\xc5\x51\xcc\x8a\xf3\x98\xd2\x7a\x4c\x69\x0a\xb3\x52\x15\x66\xa5\x04\x66\xa5\x51\xcc\xca\x65\x98\x95\xbb\x31\x2b\xcf\x61\x56\x69\xc6\xac\x52\xc0\x94\x25\x31\xab\x06\x30\xab\xa6\x31\xab\x45\x30\xab\x0d\x63\x56\xb7\x98\xd5\x47\x31\x81\x18\x26\x30\x8d\x59\xa3\x0d\xb3\x66\x18\xb3\xe6\x14\x66\xad\x11\x4c\xb0\x09\xb3\x76\x02\xb3\x4e\x18\xb3\xce\x1c\x66\xdd\x69\x4c\xa8\x01\x13\x9a\xc0\xac\xd7\x87\x59\xbf\x12\xb3\x7e\x0b\x66\xfd\x02\x66\x83\x38\x66\x83\x34\x66\x83\x49\x4c\x79\x04\x53\xde\x8c\x29\xcf\x60\xca\xa7\x31\x1b\x56\x63\x36\xec\xc5\x6c\x38\x8b\xd9\xa8\x01\xb3\xd1\x20\x66\xe3\x38\x66\xe3\x7e\xcc\xc6\x79\x4c\x45\x0b\xa6\x62\x1c\xb3\xa0\x14\xb3\xa0\x15\xb3\x60\x16\xb3\x49\x0d\x66\x93\x04\x66\x93\x71\xcc\x26\x73\x98\x4d\xe3\x98\x4d\x47\x31\xe1\x20\x26\xdc\x8a\x09\x8f\x62\x36\x03\xb3\x59\x23\x66\xb3\x7e\xcc\xe6\x60\x36\x1f\xc7\x6c\x01\x66\x8b\x09\x4c\x64\x10\xb3\x65\x1b\x66\xab\x12\xcc\x56\xcd\x98\xad\xc6\x30\x5b\x5b\xcc\xd6\x59\x4c\x65\x0c\x53\x99\xc3\xa8\x32\x8c\x9a\xc1\xe8\x7a\x8c\x1e\xc7\x98\x2a\x8c\x29\x60\x6c\x05\xc6\x8e\x63\x5c\x35\xc6\x0d\x60\x7c\x2b\x46\xaa\x31\x55\x60\xaa\x72\x98\x6d\xd2\x98\x6d\x6b\x31\xdb\xce\x60\xb6\xeb\xc5\x44\x6b\x30\xd1\x79\xcc\xf6\xbd\x98\x1d\x6a\x31\x3b\x46\x30\x3b\xe6\x31\xd5\x7d\x98\x9d\x1a\x30\x3b\x07\x30\x3b\x0f\x62\x76\xa9\xc6\xec\x32\x88\xa9\xa9\xc0\xd4\x8c\x60\x76\x6d\xc6\xec\x3a\x80\xd9\x35\x87\xd9\x2d\x8d\xd9\x6d\x1e\x53\x5b\x83\xa9\xed\xc1\xec\x51\x82\xd9\xa3\x05\xb3\xc7\x18\x66\xcf\x28\x66\xcf\x21\xcc\x9e\x53\x98\xbd\xea\x31\x7b\xb5\x61\xf6\x2a\x60\xea\xd2\x98\xbd\x1b\x30\x7b\x4f\x62\xf6\x89\x62\xf6\xe9\xc3\xec\x33\x81\xd9\x37\x86\xd9\x77\x04\x53\x3f\x85\xd9\x2f\x8d\xd9\xbf\x0f\xb3\xff\x34\xe6\x80\x02\x26\x16\xc7\xc4\xfa\x30\x07\x36\x61\x0e\x0a\x63\x0e\xfe\x7f\xc3\x98\x86\x51\xcc\x21\x65\x98\x43\x2b\x31\x87\x66\x30\x87\xce\x61\x0e\x6b\xc2\x1c\x36\x8d\x69\x6c\xc2\x34\x4e\x63\x0e\x4f\x62\x8e\x08\x62\x8e\x48\x61\x8e\x2c\xc1\x1c\x99\xc0\x1c\x39\x8f\x89\x57\x61\xe2\x59\xcc\x51\x71\xcc\xd1\x01\xcc\xd1\xad\x98\x63\x42\x98\x63\x1a\x31\xc7\x8c\x60\x9a\x5a\x30\xc7\x96\x63\x8e\xed\xc6\x1c\x3b\x83\x39\x2e\x8a\x39\x2e\x8d\x39\x1e\xcc\xf1\x49\xcc\xf1\xf3\x98\xe6\x0e\xcc\x09\x95\x98\x13\x66\x30\x27\xf6\x61\x4e\xaa\xc1\x9c\x34\x89\x69\x69\xc7\xb4\xcc\x63\x4e\x4e\x60\x4e\x01\x73\x4a\x03\xe6\x94\x0c\xe6\xd4\x38\xa6\x35\x84\x69\x4d\x60\x5a\xa7\x31\xa7\xd5\x62\x4e\x4b\x63\x4e\xef\xc4\x9c\xd1\x8a\x39\x63\x08\xd3\x96\xc6\x9c\xd9\x84\x39\x73\x12\x73\x56\x1a\x73\x76\x29\xe6\xec\x66\xcc\xd9\x3d\x98\xf6\x20\xa6\x3d\x8b\x39\x27\x86\x39\x17\xcc\xb9\x35\x98\x73\xb3\x98\xf3\xea\x31\xe7\xf5\x63\x3a\x6a\x31\x1d\x53\x98\xf3\x7b\x30\x17\xc4\x31\x17\x86\x31\x89\x28\x26\xd1\x89\x49\xe4\x31\x17\x8d\x60\x2e\xae\xc2\x5c\xdc\x8f\xb9\x64\x04\x93\x8c\x60\x92\x39\xcc\xa5\x9d\x98\xcb\x2a\x30\x97\x65\x31\x97\x15\x30\x9d\x60\x3a\x53\x98\x2b\xca\x30\x57\x14\x30\x57\xf6\x61\x16\x56\x63\x16\x66\x31\x5d\xf5\x98\xae\x02\xe6\xaa\x4e\xcc\xd5\xd5\x98\x6b\x4a\x31\xd7\x74\x63\xae\x0d\x63\xae\x8d\x61\xae\x4d\x62\xae\x1b\xc6\x5c\x5f\x87\xb9\xbe\x88\x49\xa5\x30\x37\x54\x63\x6e\xe8\xc2\xdc\xd8\x8c\xb9\xa9\x16\xd3\x53\x89\xb9\x39\x80\xb9\x79\x16\x73\x4b\x33\xe6\x96\x09\xcc\xad\xf5\x98\x5b\xa7\x30\xbd\x31\x4c\x6f\x11\x73\x5b\x06\x73\x7b\x05\xe6\xf6\x2c\xe6\x8e\x01\x4c\xba\x0a\x93\x1e\xc5\xdc\xd9\x80\xb9\x73\x06\x73\x57\x07\xe6\xee\x18\xa6\x2f\x82\xb9\xe7\xff\xe5\x31\xf7\xf6\x61\xee\xab\xc3\xdc\x37\x87\xc9\x24\x31\xf7\x57\x63\xee\x2f\x62\x1e\x08\x63\x1e\xc8\x60\x1e\x6c\xc4\xf4\x87\x30\xfd\x53\x98\x87\x7a\x31\x8b\xaa\x31\x8b\xa6\x30\x0f\xa7\x30\x03\xf5\x98\x81\x1c\xe6\x91\x56\xcc\xe2\x32\xcc\xe2\x49\xcc\x92\x3a\xcc\x92\x2c\x26\x5b\x8e\xc9\xf6\x62\x1e\x2d\xc3\x3c\x3a\x88\x79\xac\x0b\xf3\x78\x13\x66\xb0\x14\x33\x58\xc0\x3c\x51\x85\x79\xa2\x1d\xf3\x64\x29\xe6\xc9\x7a\xcc\x93\x29\xcc\x53\x11\xcc\x53\xa3\x98\xa1\x26\xcc\x50\x01\xf3\x74\x2f\xe6\x99\x4a\xcc\xd2\x30\x66\xe9\x20\x66\xb8\x06\x33\x3c\x86\x79\x36\x86\x79\x76\x0a\xf3\xdc\x28\xe6\xf9\x3e\xcc\xf3\x05\xcc\x48\x0b\x66\x24\x8b\x79\x21\x8a\x79\xa1\x0b\xf3\xc2\x3c\xe6\xc5\x36\xcc\x4b\x61\xcc\x4b\x13\x98\xd1\x4e\xcc\x68\x1e\xf3\xf2\x08\xe6\x15\x8b\x79\xa5\x0f\xf3\x6a\x00\xf3\xea\x08\x66\xac\x05\xf3\x5a\x19\xe6\xb5\x41\xcc\xeb\x71\xcc\xeb\x7d\x98\xd7\xf3\x98\x37\xfa\x31\xe3\x0d\x98\xf1\x59\xcc\x9b\xb5\x98\x37\xb3\x98\xb7\x6a\x30\x6f\x4d\x60\xde\xee\xc2\xe4\x4a\x31\xb9\x6e\xcc\x3b\x11\xcc\xbb\x65\x98\x77\x53\x98\xf7\x2a\x30\xef\x0d\x62\x26\x7a\x30\xef\xb7\x61\xde\x1f\xc5\x7c\xd0\x8f\xf9\x10\xcc\x87\x35\x98\x0f\xbb\x30\x1f\xe6\x30\x93\x61\xcc\x64\x1b\x66\x72\x14\xf3\x51\x39\xe6\xa3\x2e\xcc\xc7\x60\x3e\x4e\x61\x3e\x1e\xc5\x7c\x52\x81\xf9\xa4\x03\xf3\x49\x11\x33\x15\xc7\x4c\xcd\x61\x3e\x6d\xc1\x7c\xda\x8f\xf9\xac\x1c\xf3\x59\x17\xe6\xb3\x31\xcc\xe7\x55\x98\xcf\xbb\x31\x9f\xcf\x61\xa6\x63\x98\xe9\x31\xcc\x17\xd5\x98\x2f\xba\x31\x5f\xcc\x63\xbe\xac\xc5\x7c\x99\xc1\x7c\x05\xe6\xab\x4e\xcc\x57\x33\x98\x7c\x37\xe6\xeb\x12\xcc\xd7\xed\x98\xaf\x73\x98\x6f\xaa\x31\xdf\xa4\x31\xdf\xcc\x61\xbe\x8d\x63\x66\x4a\x31\x33\x43\x98\xef\x22\x98\xef\xda\x31\xdf\xcd\x61\xbe\x6f\xc6\xfc\x10\xc0\xfc\x90\xc1\xcc\xb6\x63\x7e\xec\xc4\xfc\xd4\x8d\xf9\x69\x1e\xf3\x73\x13\xa6\xd0\x8e\xf9\x25\x8a\xf9\xa5\x1f\xf3\x6b\x03\xe6\xd7\x61\xcc\x6f\x5d\x98\x62\x39\xa6\x98\xc4\x14\x8b\x98\xdf\xbb\x30\xbf\xcf\x61\xfe\x68\xc6\xfc\x31\x8a\xf9\x5f\x37\x66\xae\x1a\x33\x37\x85\xf9\xb3\x0d\xf3\xe7\x34\xe6\xaf\x3a\xcc\x5f\x23\x98\xbf\xc3\x98\xbf\x3b\x30\x7f\x17\x30\xf3\x2d\x98\xf9\x0c\xe6\x9f\x0a\xcc\x3f\xfd\x98\x7f\xe6\x31\xff\xb6\x63\xfe\xcd\x63\xfe\xab\xc5\xfc\x97\xc6\x12\xc5\x92\xc3\x2e\xd3\x8a\x5d\x36\x80\x5d\xee\xff\x4d\x60\x4b\x7a\xb1\x25\x93\xd8\xe5\x83\xd8\xe5\x1b\xb0\x2b\x04\xb1\x2b\x4c\x60\x57\x8c\x61\x57\x1c\xc7\x96\xc6\xb1\x2b\xd5\x60\x57\x2e\xc5\xae\x3c\x8e\x5d\x25\x85\x2d\x0b\x61\xcb\xea\xb1\x65\x05\xec\xaa\x93\xd8\xd5\xda\xb1\xab\x07\xb1\xab\x37\x63\x57\x9f\xc1\x06\x06\xb1\x81\x79\xec\x1a\xa3\xd8\x35\xab\xb0\x6b\x0e\x63\xd7\xea\xc0\x06\xab\xb1\xc1\x11\xec\xda\x23\xd8\x75\x86\xb0\xeb\x0e\x63\x43\x21\x6c\x68\x04\xbb\x5e\x37\x76\xfd\x18\x76\x83\x28\x76\x83\x2c\xb6\xbc\x11\xbb\x61\x04\xbb\x61\x0e\xbb\x51\x06\xbb\x71\x12\x5b\xd1\x80\xad\xc8\x60\x17\x24\xb0\x9b\xc4\xb0\x9b\x46\xb0\x9b\xce\x62\xc3\x95\xd8\x70\x1f\x76\xb3\x32\xec\x66\x9d\xd8\xcd\x8a\xd8\xcd\xe3\xd8\x2d\xda\xb1\x5b\x4c\x63\x23\xf5\xd8\x48\x1e\xbb\x65\x2b\x76\xcb\x02\x76\xab\x49\xec\xd6\xf5\xd8\xca\x20\xb6\x32\x8b\x55\x4d\x58\x35\x85\xd5\x09\xac\x29\xc7\x9a\x21\xac\x8d\x61\xed\x18\xd6\xc5\xb1\xae\x88\xf5\x5d\x58\x09\x61\x25\x89\x95\x29\x6c\x55\x14\x5b\xd5\x8a\xad\x9a\xc4\x6e\xd3\x86\xdd\xb6\x04\xbb\x6d\x2f\x76\xdb\x49\xec\x76\x1d\xd8\x68\x3d\x76\xfb\x38\x76\xfb\x22\x76\x87\x71\xec\x8e\xed\xd8\xea\x4a\x6c\x75\x1f\xb6\xba\x80\xdd\x29\x8e\xdd\x69\x1c\xbb\x73\x13\x76\x97\x10\x76\x97\x4e\x6c\x0d\xd8\x9a\x72\x6c\x4d\x01\xbb\x6b\x35\x76\xd7\x14\x76\xb7\x30\x76\xb7\x49\xec\xee\x4d\xd8\xdd\x87\xb1\xbb\xcf\x60\x6b\x67\xb0\x7b\xc4\xb1\x7b\xe4\xb1\x7b\x76\x60\xf7\xcc\x62\xf7\xaa\xc5\xee\xd5\x8f\xad\x8b\x62\xeb\xba\xb0\x7b\x97\x61\xf7\x4e\x61\xf7\x29\xc7\xee\x93\xc7\xee\x1b\xc7\xee\x9b\xc3\xd6\xc7\xb0\xf5\x73\xd8\xfd\x92\xd8\xfd\xa6\xb0\xfb\x37\x61\xf7\xef\xc1\xee\x3f\x86\xdd\x7f\x0e\x7b\x40\x18\x7b\x40\x17\x36\x16\xc4\xc6\x5a\xb0\x07\x82\x3d\x30\x87\x3d\xa8\x0d\x7b\xd0\x34\xf6\xe0\x6a\xec\xc1\x59\x6c\x43\x05\xb6\xa1\x13\xdb\x30\x83\x3d\x24\x89\x3d\x34\x84\x3d\xb4\x1b\x7b\x58\x13\xb6\xb1\x07\x7b\x78\x04\x7b\x44\x09\xf6\x88\x16\xec\x11\xa3\xd8\x23\x87\xb1\xf1\x0a\xec\x51\x41\xec\x51\x73\xd8\xa3\xbb\xb1\xc7\xf4\x60\x9b\xe2\xd8\x63\xeb\xb0\xc7\xa6\xb1\xc7\xb5\x60\x8f\xaf\xc6\x1e\x3f\x8d\x6d\x1e\xc4\x9e\xd0\x82\x3d\x31\x82\x3d\xc9\x62\x4f\x9a\xc3\xb6\xcc\x60\x4f\x6e\xc6\x9e\x52\x89\x3d\x25\x8b\x3d\xb5\x0d\xdb\x5a\x85\x6d\xed\xc5\x9e\xd6\x8c\x3d\xbd\x0c\x7b\x7a\x1d\xf6\xf4\x21\xec\x19\xa5\xd8\x33\xfa\xb1\x6d\xdd\xd8\xb6\x1c\xf6\xcc\x26\xec\x59\x41\xec\x59\x2d\xd8\xb3\x0a\xd8\xb3\x8b\xd8\xf6\x19\xec\x39\x35\xd8\x73\xcb\xb0\xe7\xb6\x60\xcf\x0b\x60\xcf\x1b\xc1\x76\xd4\x62\x3b\xfa\xb0\xe7\x57\x60\xcf\xef\xc7\x5e\x50\x89\xbd\xa0\x13\x7b\x41\x11\x7b\x61\x02\x9b\xa8\xc5\x5e\x14\xc6\x5e\xd4\x8d\xbd\x68\x0e\x7b\x71\x14\x7b\xf1\x30\xf6\x92\x34\x36\x19\xc5\x26\xfb\xb1\x97\x06\xb0\x97\x56\x63\x2f\x4d\x63\x2f\x2d\x60\x2f\x6b\xc4\x5e\x36\x82\xbd\xbc\x09\xdb\x19\xc6\x76\x4e\x60\xaf\x48\x62\xaf\x9c\xc7\x2e\x6c\xc2\x2e\x1c\xc5\x76\x55\x62\xbb\x32\xd8\xab\xca\xb0\x57\x75\x63\xaf\xae\xc1\x5e\xdd\x87\xbd\x26\x8d\xbd\x66\x02\xdb\xdd\x88\xed\x9e\xc2\x5e\x5b\x87\xbd\x76\x0e\x7b\x7d\x0c\x9b\xaa\xc4\xa6\x26\xb1\x37\x74\x63\x6f\x8c\x62\x6f\xaa\xc2\xde\xd4\x8e\xed\x89\x60\x6f\x2e\xc7\xde\x3c\x88\xbd\xc5\x62\x6f\x2d\xc1\xde\x9a\xc5\xf6\x56\x62\x7b\x33\xd8\xdb\xca\xb0\xb7\x0d\x61\x6f\x2f\xc7\xde\x9e\xc3\xde\x11\xc1\xa6\x1b\xb0\xe9\x69\xec\x9d\xdd\xd8\xbb\xc0\xde\xd5\x8e\xbd\xbb\x06\x7b\xf7\x20\xb6\xaf\x11\xdb\x57\xc4\xde\x53\x8b\xbd\x67\x0c\x7b\x6f\x3d\xf6\xde\x41\xec\x7d\x2d\xd8\xfb\x72\xd8\x4c\x04\x9b\xc9\x61\xef\x4f\x61\xef\x9f\xc1\x3e\x60\xb1\x0f\x0c\x62\x1f\xac\xc2\x3e\x38\x80\xed\xb7\xd8\xfe\x5e\xec\x43\x9d\xd8\x45\x65\xd8\x45\x35\xd8\x45\x23\xd8\x87\x6b\xb0\x0f\x8f\x60\x07\xea\xb0\x03\x03\xd8\x47\x4a\xb1\x8f\xcc\x61\x17\xf7\x61\x97\xf4\x60\xb3\x6d\xd8\x47\x13\xd8\x47\x07\xb0\x8f\x95\x63\x1f\xcb\x60\x1f\x2b\x60\x1f\xaf\xc5\x3e\x3e\x86\x1d\xac\xc4\x0e\xf6\x60\x07\xe7\xb1\x4f\x34\x63\x9f\x98\xc0\x3e\xd9\x83\x7d\x2a\x82\x7d\xaa\x1b\x3b\x54\x8e\x1d\xea\xc7\x3e\x9d\xc2\x3e\xd3\x85\x5d\x9a\xc2\x0e\xc7\xb1\xcf\x36\x60\x9f\x0b\x60\x9f\xeb\xc7\x3e\x6f\xb1\xcf\x27\xb0\xcf\xe7\xb1\x23\x31\xec\x0b\x8d\xd8\x17\x7a\xb1\x2f\x66\xb0\x2f\x95\x63\x5f\x6a\xc4\xbe\x34\x84\x1d\x6d\xc5\x8e\x0e\x60\x5f\xce\x63\x5f\xe9\xc6\xbe\x1a\xc2\xbe\xda\x85\x1d\x6b\xc6\xbe\x16\xc6\xbe\x36\x89\x7d\xbd\x05\xfb\x7a\x1e\xfb\x46\x04\x3b\x6e\xb1\xe3\x29\xec\x9b\xe5\xd8\x37\xd3\xd8\xb7\x6a\xb0\x6f\x8d\x61\xdf\xae\xc4\xbe\x9d\xc2\xbe\x3d\x8e\xcd\x55\x63\x73\x93\xd8\x77\x3a\xb1\xef\x4c\x63\xdf\xad\xc1\xbe\x3b\x82\x7d\xaf\x0c\xfb\x5e\x16\x3b\x51\x89\x9d\x48\x60\xdf\x2f\xc3\xbe\x1f\xc3\xbe\x9f\xc3\x7e\x50\x85\xfd\x60\x1a\xfb\xe1\x30\x76\xb2\x13\xfb\x51\x09\xf6\xa3\x38\xf6\xe3\x3a\xec\xc7\x05\xec\x27\x9d\xd8\x4f\xe6\xb0\x53\x71\xec\xa7\x65\xd8\x4f\x3b\xb1\x9f\x85\xb0\x9f\xc5\xb1\x9f\x07\xb0\x9f\x0f\x62\xa7\x83\xd8\xe9\x56\xec\x17\xf5\xd8\x2f\xb2\xd8\x2f\xa6\xb1\x5f\x16\xb1\x5f\xa5\xb1\xf9\x32\x6c\x3e\x81\xcd\x8f\x61\xbf\xae\xc7\x7e\x9d\xc5\x7e\x13\xc1\x7e\x33\x88\xfd\xb6\x04\xfb\x6d\x1f\x76\xc6\x62\x67\x72\xd8\xef\x2b\xb1\x3f\x58\xec\x0f\x7d\xd8\xd9\x1e\xec\x6c\x16\xfb\x23\xd8\x1f\x33\xd8\x9f\x4a\xb0\x3f\x0d\x62\x7f\x1e\xc7\x16\x9a\xb0\x85\x41\x6c\x61\x1e\xfb\x4b\x14\xfb\x2b\xd8\x5f\x1b\xb0\xbf\xd5\x61\x7f\x1b\xc4\x16\xc3\xd8\x62\x03\xb6\x38\x82\xfd\xbd\x19\xfb\x47\x00\xfb\x47\x1e\xfb\xbf\x6e\xec\x5c\x08\x3b\x97\xc0\xfe\x19\xc2\xfe\x99\xc7\xfe\xd5\x83\xfd\x3b\x80\xfd\x3b\x81\x9d\xaf\xc5\xce\xcf\x62\xff\x89\x62\xff\xe9\xc4\xfe\x93\xc3\xfe\x1b\xc7\xfe\x9b\xc7\xfe\x97\xc0\xfe\x37\x89\xa3\x0a\x47\x1b\x8e\x01\xdc\x32\x1d\xb8\x65\x4b\x70\xcb\xd6\xe0\x96\xb3\xb8\xe5\x12\xb8\x92\x3a\x5c\x49\x27\x6e\xf9\x32\xdc\xf2\x53\xb8\x15\x4a\x70\x2b\x74\xe3\x56\x2c\xc1\xad\x98\xc7\x95\xe6\x70\x2b\xf5\xe3\x56\x6e\xc1\xad\x3c\x85\x5b\xa5\x06\xb7\x4a\x12\xb7\xca\x20\xae\x2c\x8e\x5b\x35\x8a\x5b\x75\x0a\xb7\x5a\x1d\x6e\xb5\x69\xdc\xea\xf5\xb8\xd5\x0b\xb8\x40\x07\x6e\x8d\x52\xdc\x1a\x29\xdc\x9a\x65\xb8\x35\x47\x71\x6b\x55\xe2\xd6\xca\xe2\x82\x83\xb8\xb5\x6b\x70\x6b\xf7\xe1\xd6\xa9\xc3\xad\x93\xc5\xad\x5b\x85\x5b\x77\x00\x17\x2a\xc1\x85\xea\x71\xa1\x1e\x5c\x68\x0e\xb7\x5e\x0b\x6e\xbd\x1e\xdc\x7a\x23\xb8\xf5\xcb\x71\xeb\xd7\xe1\xd6\x4f\xe2\x36\x68\xc4\x95\x57\xe0\xca\x93\xb8\xf2\x69\xdc\x86\x69\xdc\x86\x45\xdc\x46\x31\xdc\x46\x79\xdc\xc6\x35\xb8\x8d\x07\x70\x15\x55\xb8\x05\x25\xb8\x05\x71\xdc\x26\x41\xdc\xa6\x01\xdc\xa6\x7d\xb8\x4d\xe7\x70\xe1\x61\xdc\x66\x16\xb7\xd9\x00\x6e\xf3\x5a\xdc\x16\x01\x5c\xa4\x0c\x17\xe9\xc0\x6d\x09\x6e\xcb\x36\xdc\x96\xe3\xb8\xad\xc2\xb8\xad\x8a\xb8\xad\xe7\x70\xaa\x14\xa7\xfa\x70\xba\x19\xa7\x67\x71\xa6\x15\x67\xa6\x71\xb6\x01\x67\xbb\x70\x0e\x9c\xab\xc7\xb9\x29\x9c\xcf\xe3\x64\x10\x57\xd5\x88\xdb\xa6\x06\xb7\xcd\x00\x6e\xdb\x00\x6e\xdb\x04\x6e\xdb\x02\x6e\xbb\x46\xdc\x76\x3d\xb8\x68\x0d\x2e\xda\x8f\xdb\xbe\x06\xb7\x7d\x0a\xb7\x03\xb8\x1d\x3a\x71\x3b\x0c\xe1\x76\xac\xc2\xed\x38\x8d\xab\x4e\xe1\xaa\x67\x70\x3b\xb5\xe1\x76\x0e\xe3\x76\x6e\xc7\xed\x3c\x86\xdb\xa5\x11\xb7\xcb\x18\xae\x26\x85\xdb\xb5\x1a\xb7\xeb\x04\x6e\xb7\x5a\xdc\x6e\x69\xdc\xee\xf5\xb8\xda\x38\xae\x76\x00\xb7\x47\x29\x6e\x8f\x14\x6e\xcf\x20\x6e\xcf\x04\x6e\xaf\x30\x6e\xaf\x14\xae\x0e\x5c\x5d\x02\x57\x57\xc0\xed\x3d\x84\xdb\xa7\x12\xb7\xcf\x14\x6e\xdf\x16\xdc\xbe\x23\xb8\xfa\x10\xae\xbe\x0f\x57\x5f\xc4\xed\x37\x81\xdb\xbf\x03\x77\x40\x0d\x2e\x16\xc5\xc5\x32\xb8\x03\x83\xb8\x03\x9b\x71\x07\xe6\x70\x07\x25\x71\x07\xcd\xe3\x0e\xae\xc4\x1d\x9c\xc2\x1d\x9c\xc7\x35\xb4\xe0\x0e\x89\xe3\x0e\x19\xc0\x1d\x52\xc0\x1d\x5a\x85\x3b\xb4\x1f\x77\x68\x11\x77\x58\x2d\xee\xb0\x01\x5c\x63\x09\xae\xb1\x16\xd7\x38\x89\x3b\x3c\x8a\x3b\x7c\x00\x77\x44\x3b\xee\x88\x3e\xdc\x91\x2d\xb8\x78\x15\xee\x28\x70\x47\x55\xe3\x8e\x4a\xe1\x8e\x9a\xc6\x1d\x3d\x88\x3b\x66\x0c\xd7\x54\x81\x6b\xca\xe2\x8e\x0d\xe2\x8e\x2b\xc7\x1d\xd7\x89\x3b\x6e\x02\x77\x7c\x18\x77\x7c\x02\x77\xfc\x18\xae\xb9\x1a\xd7\xdc\x89\x6b\x9e\xc3\x9d\x30\x8c\x3b\x71\x02\x77\x52\x35\xee\xa4\x2c\xae\xa5\x12\xd7\x32\x8a\x3b\xb9\x01\x77\x72\x37\xee\x94\x46\xdc\x29\x73\xb8\x53\xdb\x70\xa7\xce\xe0\x5a\xa3\xb8\xd6\x0c\xee\xb4\x32\xdc\x69\x29\xdc\x69\xb3\xb8\xd3\xeb\x70\xa7\xb7\xe3\x4e\x1f\xc7\x9d\x51\x87\x3b\xa3\x17\xd7\x56\x89\x6b\xeb\xc0\xb5\xcd\xe2\xce\xec\xc7\x9d\x55\x8f\x3b\xab\x1f\x77\x76\x0d\xae\xfd\xff\x8d\xe3\xce\x09\xe0\xce\x69\xc0\x9d\x1b\xc0\x9d\xdb\x87\x3b\xaf\x0a\x77\xde\x30\xae\x23\x8a\xeb\x18\xc5\x9d\x6f\x71\xe7\xa7\x71\xe7\x17\x71\x17\xf4\xe1\x2e\x2c\xc1\x5d\xd8\x8b\xbb\x70\x0a\x97\xa8\xc0\x25\x86\x71\x17\x45\x70\x17\xa5\x71\x17\x37\xe2\x2e\x09\xe3\x2e\x19\xc3\x25\x03\xb8\xe4\x0c\xee\xd2\x41\xdc\x65\xdd\xb8\xcb\x9b\x71\x97\xcf\xe1\x3a\x93\xb8\xce\x19\xdc\x15\x2d\xb8\x2b\xc6\x71\x57\xb6\xe3\x16\x82\x5b\x38\x8a\xeb\x0a\xe2\xba\x7a\x70\x5d\x05\xdc\x55\x0d\xb8\xab\x7a\x70\x57\xc7\x70\x57\x8f\xe2\xae\x89\xe0\xae\xe9\xc4\x5d\x93\xc3\x75\x47\x70\xdd\x7d\xb8\x6b\x7b\x71\xd7\xd5\xe0\xae\xeb\xc6\x5d\x97\xc7\x5d\x5f\x83\xbb\x7e\x1e\x97\xaa\xc5\xa5\x06\x70\x37\x54\xe0\x6e\xc8\xe0\x6e\x2c\xc3\xdd\xd8\x86\xbb\x71\x06\x77\x53\x35\xee\xa6\x6e\xdc\x4d\x79\x5c\x4f\x14\xd7\x53\xc4\xdd\xdc\x8c\xbb\xb9\x88\xbb\x65\x0c\x77\x6b\x02\xd7\x1b\xc0\xf5\x66\x70\xb7\x81\xbb\xad\x0f\x77\x7b\x08\x77\xfb\x20\xee\x8e\x20\xee\x8e\x21\x5c\xba\x14\x97\x4e\xe0\xd2\x05\xdc\x9d\x0d\xb8\x3b\x7b\x70\x77\xce\xe0\xee\x6a\xc4\xdd\x35\x83\xbb\x7b\x10\xd7\x57\x86\xeb\xeb\xc6\xdd\x13\xc4\xdd\xd3\x88\xbb\x67\x1a\x77\x6f\x3b\xee\xbe\x72\xdc\x7d\x45\xdc\xfd\x01\xdc\xfd\xb5\xb8\xfb\x73\xb8\x07\x3a\x70\x0f\x82\x7b\x30\x89\x7b\x70\x16\xd7\xdf\x81\xeb\x9f\xc4\x3d\x94\xc0\x2d\x0a\xe1\x1e\x6e\xc5\x0d\x84\x70\x03\xbd\xb8\x81\x1c\xee\x91\x31\xdc\xe2\x61\xdc\x92\x20\x6e\x49\x23\x6e\xc9\x38\x2e\x1b\xc7\x65\xfb\x70\x8f\x86\x70\x8f\x66\x70\x8f\x45\x70\x8f\xb5\xe2\x1e\x0f\xe1\x1e\x8f\xe3\x1e\x2f\xe2\x06\xeb\x71\x83\x19\xdc\xe0\x3c\xee\x89\x28\xee\x89\x76\xdc\x13\x59\xdc\x93\x21\xdc\x93\x59\xdc\x53\x41\xdc\x53\x13\xb8\xa1\x21\xdc\xd3\x95\xb8\xa7\xf3\xb8\x67\x1a\x71\xcf\xf4\xe0\x9e\xc9\xe1\x96\xd6\xe3\x96\x0e\xe3\x86\x43\xb8\xe1\x76\xdc\xf0\x24\xee\xd9\x56\xdc\xb3\x59\xdc\x73\x11\xdc\x73\x5d\xb8\xe7\xf2\xb8\xe7\x63\xb8\xe7\xbb\x71\x23\x75\xb8\x17\x02\xb8\x17\x9a\x70\x2f\x4c\xe3\x5e\xac\xc6\xbd\x98\xc2\xbd\x98\xc7\xbd\x54\x85\x1b\xad\xc1\x8d\x0e\xe2\x5e\x6e\xc6\xbd\x9c\xc6\xbd\x12\xc3\xbd\x92\xc5\xbd\x52\xc0\xbd\x9a\xc4\xbd\x3a\x8f\x1b\x8b\xe1\x5e\x0b\xe2\x5e\x6b\xc5\xbd\x96\xc7\xbd\x1e\xc3\xbd\x3e\x86\x7b\xa3\x04\xf7\x46\x1a\x37\x5e\x89\x1b\x1f\xc6\xbd\x59\x82\x7b\xb3\x1e\xf7\x16\xb8\xb7\x32\xb8\xb7\x83\xb8\xb7\xd3\xb8\x1c\xb8\x5c\x3b\x2e\x97\xc7\xbd\x13\xc5\xbd\x0b\xee\xdd\x46\xdc\xbb\xe3\xb8\xf7\xaa\x71\xef\x65\x70\xef\xcd\xe2\x26\xaa\x70\x13\x63\xb8\xf7\xab\x71\xef\x27\x70\x1f\x64\x70\x1f\x76\xe2\x3e\xcc\xe3\x26\xab\x71\x93\x3d\xb8\xc9\x59\xdc\x47\xf5\xb8\x8f\x46\x71\x1f\xd7\xe0\x3e\x1e\xc4\x7d\x52\x83\xfb\x24\x89\x9b\xb2\xb8\x4f\xc1\x7d\x5a\xc4\x7d\x36\x8c\xfb\xdc\xe2\x3e\xef\xc4\x4d\xb7\xe2\xa6\x33\xb8\x2f\x92\xb8\x2f\x4b\x70\x5f\x36\xe1\xbe\x1c\xc3\x7d\x55\x86\xfb\x2a\x87\xfb\xba\x14\xf7\x4d\x2b\xee\x5b\x70\xdf\xc6\x70\xdf\xf6\xe3\xbe\x9d\xc7\xcd\x24\x71\x33\x13\xb8\xef\x1a\x70\xdf\x4d\xe2\xbe\xef\xc4\xfd\x50\x8d\xfb\x61\x0e\x37\x3b\x82\xfb\x11\xdc\x8f\x09\xdc\x8f\x05\xdc\x4f\x49\xdc\x4f\x23\xb8\x9f\x6b\x71\x85\x10\xae\x50\xc4\xfd\xd2\x8b\xfb\xb5\x1d\xf7\xeb\x24\xee\xb7\x46\xdc\x6f\x69\x5c\xb1\x0a\x57\xec\xc1\x15\x67\x70\xbf\x57\xe3\x7e\x1f\xc5\xfd\x11\xc4\xfd\x91\xc5\xfd\xaf\x1b\xf7\xbf\x02\x6e\x6e\x0c\xf7\x67\x04\xf7\x57\x29\xee\xaf\x36\xdc\x5f\x13\xb8\xbf\x6b\x71\x7f\xcf\xe3\xe6\xbb\x70\xff\x94\xe1\xfe\x69\xc3\xfd\x93\xc7\xfd\x1b\xc3\xfd\x3b\x8c\xfb\x2f\x82\xfb\xaf\x07\xf7\x5f\x11\x4f\x27\x7e\x99\x12\xfc\x32\xad\xf8\x65\xfa\xf1\xcb\x06\xf0\xcb\x36\xe2\x97\x2d\xe2\x97\x6b\xc0\x2f\x37\x87\x2f\x49\xe2\x97\xef\xc0\x2f\x3f\x84\x5f\x7e\x0e\xbf\x42\x14\xbf\x42\x07\x7e\x85\x21\xfc\x0a\x73\xf8\x15\xab\xf1\x2b\x0e\xe1\x4b\x6b\xf0\xa5\x59\xfc\x4a\x11\xfc\x4a\xbd\xf8\x95\x03\xf8\x95\x13\xf8\x95\x67\xf1\xab\x44\xf0\x65\xe0\xcb\xe6\xf1\xab\xf6\xe0\x57\xab\xc2\xaf\x36\x8c\x5f\xbd\x19\x1f\x08\xe2\x03\xfd\xf8\x35\xca\xf1\x6b\x34\xe1\xd7\x18\xc4\xaf\x31\x87\x5f\xb3\x15\xbf\x66\x3f\x7e\xad\x0e\x7c\xb0\x0e\xbf\x76\x10\xbf\x76\x0c\xbf\x76\x11\xbf\x8e\xc5\xaf\xd3\x89\x5f\x67\x18\xbf\x4e\x11\xbf\xae\xc5\xaf\x9b\xc1\x87\x82\xf8\xf5\xc0\xaf\x97\xc4\xaf\x1f\xc4\xaf\x9f\xc2\xaf\x3f\x81\xdf\x20\x84\x2f\xaf\xc1\x97\x77\xe2\x37\xec\xc6\x6f\x98\xc3\x6f\xd4\x88\xdf\xb8\x02\xbf\x71\x33\x7e\xe3\x1c\xbe\x22\x84\xaf\xe8\xc1\x2f\xa8\xc1\x2f\x48\xe3\x37\x29\xc1\x6f\xd2\x84\xdf\x64\x18\xbf\x69\x35\x3e\x5c\x86\x0f\xa7\xf0\x9b\xf5\xe0\x37\x0f\xe0\x37\xef\xc1\x6f\x11\xc2\x6f\x91\xc5\x47\x5a\xf0\x91\x69\xfc\x96\x29\xfc\x56\x75\xf8\xad\xfa\xf1\x5b\xb7\xe0\xb7\x1e\xc5\x57\xd6\xe3\x2b\xf3\x78\x95\xc6\xeb\x5a\xbc\x1e\xc2\x9b\x18\xde\xcc\xe0\x6d\x23\xde\xe6\xf1\x2e\x8c\x77\x69\xbc\x2f\xc3\xfb\x24\x5e\x2c\x5e\x7a\xf0\x32\x87\xaf\xaa\xc2\x6f\x53\x8a\xdf\xa6\x16\xbf\xcd\x04\x7e\xdb\x16\xfc\xb6\x73\xf8\xed\xba\xf0\xd1\x32\x7c\xb4\x17\xbf\x7d\x04\xbf\xfd\x20\x7e\x87\x1a\xfc\x0e\x59\xfc\x8e\xe0\x77\xac\xc7\xef\x98\xc6\xef\x38\x8b\xaf\xae\xc1\x57\xa7\xf0\xd5\xd3\xf8\x9d\x2c\x7e\xa7\x24\x7e\xa7\x71\xfc\xce\xe5\xf8\x9d\x5b\xf1\x3b\x8f\xe0\x77\x09\xe2\x77\x69\xc1\xef\x32\x8a\xaf\xa9\xc0\xd7\x24\xf0\x35\x93\xf8\x5d\xab\xf0\xbb\xa6\xf0\xbb\x95\xe3\x77\x8b\xe1\x77\x4b\xe2\x77\x1b\xc4\xef\x36\x83\xdf\xbd\x11\xbf\xfb\x38\xbe\x36\x86\xaf\xcd\xe1\xf7\xa8\xc3\xef\x31\x82\xdf\xb3\x0c\xbf\x67\x27\x7e\xaf\x0a\xfc\x5e\xc3\xf8\xba\x12\x7c\x5d\x03\x7e\xef\x30\x7e\x9f\x7a\xfc\xbe\x71\x7c\x7d\x02\xbf\x5f\x0f\x7e\xff\x01\xfc\x01\x39\x7c\xac\x88\x3f\xa8\x02\x7f\x70\x3d\xfe\xe0\x09\x7c\x43\x16\x7f\x48\x15\xfe\x90\x3c\xfe\xd0\x1e\xfc\x61\xf5\xf8\xc3\x26\xf0\x8d\x71\x7c\x63\x1e\x7f\x78\x14\x7f\x44\x18\x7f\xc4\x18\xfe\xc8\x66\xfc\x91\xf3\xf8\x78\x2f\xfe\xa8\x2a\xfc\x51\x63\xf8\xa3\x83\xf8\xa3\xdb\xf1\x47\x67\xf1\xc7\x54\xe2\x8f\xe9\xc7\x37\x45\xf0\x4d\x19\xfc\xb1\x61\xfc\xb1\xe3\xf8\xe3\x1a\xf1\xc7\xd7\xe3\x8f\x1f\xc6\x37\x87\xf1\xcd\x19\xfc\x09\x65\xf8\x13\x06\xf0\x27\x56\xe0\x4f\x6c\xc3\x9f\x54\x8d\x3f\x29\x83\x6f\x09\xe2\x5b\x92\xf8\x96\x59\xfc\xc9\x8d\xf8\x93\xc7\xf0\xa7\x44\xf1\xa7\xf4\xe3\x4f\x0d\xe1\x4f\xed\xc2\x9f\x3a\x87\x6f\x6d\xc1\xb7\x4e\xe2\x4f\xab\xc3\x9f\x36\x84\x3f\x3d\x82\x3f\xbd\x07\x7f\x46\x09\xfe\x8c\x76\xfc\x19\x79\x7c\x5b\x0c\xdf\x36\x82\x3f\xb3\x12\x7f\x66\x1b\xfe\xcc\x41\xfc\x99\x73\xf8\xb3\xaa\xf1\x67\x25\xf1\x67\x8d\xe2\xcf\x2e\xc5\x9f\x5d\x87\x3f\xbb\x1b\x7f\x76\x0e\xdf\x1e\xc4\xb7\x37\xe2\xdb\xd3\xf8\xf6\x69\xfc\x39\x61\xfc\x39\x2d\xf8\x73\x06\xf0\xe7\x14\xf0\xe7\x56\xe1\xcf\xed\xc0\x9f\x3b\x8c\x3f\x77\x16\x7f\x5e\x39\xfe\xbc\x7a\xfc\x79\x09\xfc\x79\x03\xf8\xf3\xa6\xf0\x1d\x65\xf8\x8e\x6a\x7c\x47\x2b\xbe\x23\x8d\xef\x18\xc7\x77\xcc\xe3\xcf\xaf\xc4\x9f\x1f\xc7\x9f\xdf\x8d\x3f\x7f\x18\x7f\xfe\x2c\xfe\x82\x72\xfc\x05\xf5\xf8\x0b\x12\xf8\x0b\x06\xf0\x17\x4c\xe1\x2f\x2c\xc3\x5f\x58\x8d\xbf\xb0\x15\x7f\x61\x1a\x7f\xe1\x38\xfe\xc2\x79\x7c\xa2\x12\x9f\x88\xe3\x13\xdd\xf8\xc4\x30\x3e\x31\x8b\xbf\xa8\x1c\x7f\x51\x3d\xfe\xa2\x04\xfe\xa2\x01\xfc\x45\x53\xf8\x8b\xcb\xf0\x17\x57\xe3\x2f\x6e\xc5\x5f\x9c\xc6\x5f\x3c\x8b\xbf\xa4\x1a\x7f\x49\x37\xfe\x92\x29\x7c\xb2\x12\x9f\x4c\xe0\x93\xe3\xf8\x4b\x43\xf8\x4b\x9b\xf1\x97\x66\xf1\x97\xce\xe3\x2f\xab\xc3\x5f\xd6\x83\xbf\x6c\x1a\x7f\x79\x25\xfe\xf2\x0e\xfc\xe5\xa3\xf8\xce\x00\xbe\x33\x8e\xef\xec\xc7\x77\x16\xf1\x57\x44\xf1\x57\x24\xf0\x57\x8c\xe0\xaf\x2c\xc1\x5f\x59\x87\xbf\xb2\x1b\x7f\x65\x0e\xbf\x30\x88\x5f\xd8\x80\x5f\xd8\x83\x5f\x38\x81\xef\x0a\xe1\xbb\x1a\xf1\x5d\x69\x7c\xd7\x34\xfe\xaa\x30\xfe\xaa\x16\xfc\x55\x03\xf8\xab\x0a\xf8\xab\xab\xf0\x57\x77\xe0\xaf\x1e\xc7\x5f\x53\x81\xbf\xa6\x1d\x7f\xcd\x18\xbe\xbb\x1c\xdf\xdd\x86\xef\x1e\xc5\x5f\x1b\xc2\x5f\xdb\x8a\xbf\x76\x04\x7f\x5d\x10\x7f\x5d\x0b\xfe\xba\x61\xfc\xf5\x01\xfc\xf5\xcd\xf8\xeb\x87\xf0\xa9\x32\x7c\xaa\x09\x9f\x1a\xc4\xdf\x50\x8a\xbf\x21\x8e\xbf\x61\x04\x7f\x63\x18\x7f\x63\x17\xfe\xc6\x59\xfc\x4d\x31\xfc\x4d\x83\xf8\x9e\x10\xbe\x27\x81\xef\x99\xc6\xdf\x5c\x8b\xbf\xb9\x1f\x7f\x4b\x19\xfe\x96\x36\xfc\x2d\x13\xf8\x5b\xa3\xf8\x5b\xd3\xf8\x5e\xf0\xbd\xcd\xf8\xde\x31\xfc\x6d\x95\xf8\xdb\x52\xf8\xdb\x26\xf0\xb7\x87\xf0\xb7\xc7\xf1\xb7\xf7\xe1\x6f\xcf\xe3\xef\x88\xe0\xef\x68\xc5\xdf\x31\x80\xbf\x63\x16\x9f\xae\xc4\xa7\x5b\xf1\xe9\x2c\x3e\x5d\xc4\xdf\x59\x85\xbf\xb3\x03\x7f\xe7\x30\xfe\x2e\xf0\x77\xd5\xe2\xef\xea\xc2\xdf\x35\x8e\xbf\x3b\x80\xbf\xbb\x03\x7f\xf7\x34\xbe\xaf\x0e\xdf\x37\x80\xbf\x27\x88\xbf\x27\x81\xbf\x27\x8f\xbf\xb7\x0e\x7f\xef\x00\xfe\xbe\x00\xfe\xbe\x76\xfc\x7d\x93\xf8\x4c\x35\x3e\xd3\x87\xbf\xbf\x14\x7f\x7f\x2b\xfe\xfe\x1c\xfe\x81\x2a\xfc\x03\x69\xfc\x83\x25\xf8\x07\x5b\xf1\x0f\xf6\xe3\x1f\xcc\xe3\xfb\x2b\xf0\xfd\x71\x7c\x7f\x2f\xbe\x7f\x02\xff\x50\x00\xff\x50\x3d\xfe\xa1\x2e\xfc\x43\xa3\xf8\x45\xe0\x17\x55\xe3\x17\x75\xe0\x17\x0d\xe2\x17\x15\xf0\x0f\x57\xe2\x1f\x6e\xc1\x3f\x9c\xc1\x3f\x3c\x8d\x1f\x28\xc7\x0f\x34\xe2\x07\xba\xf1\x03\x23\xf8\x81\x22\xfe\x91\x08\xfe\x91\x38\xfe\x91\x14\xfe\x91\x51\xfc\x23\x73\xf8\xc5\x95\xf8\xc5\x4d\xf8\xc5\x3d\xf8\xc5\x63\xf8\xc5\xf3\xf8\x25\x16\xbf\xa4\x09\xbf\x24\x85\x5f\x32\x82\x5f\x52\xc4\x67\x23\xf8\x6c\x1c\x9f\x4d\xe1\x1f\x0d\xe3\x1f\x1d\xc6\x3f\x16\xc3\x3f\x36\x83\x7f\x3c\x81\x1f\x0c\xe0\x07\x33\xf8\x27\xa2\xf8\x27\xc6\xf1\x4f\x36\xe1\x9f\x2c\xe2\x9f\xea\xc2\x0f\x95\xe3\x87\xb2\xf8\xa7\x6b\xf1\x4f\x4f\xe2\x9f\x69\xc5\x2f\x05\xbf\xb4\x07\x3f\x1c\xc1\x0f\x0f\xe3\x9f\xad\xc4\x3f\x9b\xc6\x3f\x57\x86\x7f\x2e\x81\x7f\x6e\x16\xff\x7c\x1c\xff\xfc\x38\x7e\x24\x8a\x1f\xc9\xe0\x5f\x08\xe2\x5f\x48\xe2\x5f\x98\xc5\xbf\xd8\x88\x7f\x71\x0c\xff\x52\x14\xff\x52\x3f\x7e\x34\x88\x1f\xed\xc4\x8f\x16\xf1\x2f\x37\xe3\x5f\x9e\xc0\xbf\x52\x85\x7f\xa5\x07\xff\x4a\x11\xff\x6a\x0c\xff\x6a\x16\x3f\x16\xc0\x8f\xb5\xe1\xc7\x72\xf8\xd7\x2c\xfe\xb5\x6e\xfc\x6b\x33\xf8\xd7\x6b\xf1\xaf\xf7\xe1\xdf\x00\xff\x46\x1c\xff\xc6\x10\x7e\x3c\x88\x1f\x6f\xc7\x8f\x4f\xe0\xdf\xac\xc2\xbf\xd9\x83\x7f\x73\x1e\xff\x56\x33\xfe\xad\x71\xfc\xdb\x55\xf8\xb7\xd3\xf8\x5c\x09\x3e\xd7\x8a\xcf\x4d\xe0\xdf\xa9\xc6\xbf\x93\xc1\xbf\x5b\x86\x7f\xb7\x1d\xff\xee\x14\xfe\xbd\x5a\xfc\x7b\x03\xf8\x89\x20\x7e\x22\x81\x9f\xc8\xe3\xdf\xaf\xc7\xbf\x3f\x88\xff\xa0\x1c\xff\x41\x27\xfe\x83\x59\xfc\x87\x0d\xf8\x0f\x87\xf1\x93\x61\xfc\x64\x37\x7e\xb2\x88\xff\xa8\x09\xff\xd1\x38\xfe\xe3\x28\xfe\xe3\x0c\xfe\x93\x00\xfe\x93\x04\xfe\x93\x3c\x7e\xaa\x1e\x3f\x35\x84\xff\x34\x8c\xff\xb4\x1b\xff\x69\x11\xff\x59\x13\xfe\xb3\x31\xfc\xe7\x11\xfc\xe7\xdd\xf8\xcf\x67\xf1\xd3\x31\xfc\xf4\x20\xfe\x8b\x10\xfe\x8b\x04\xfe\x8b\x29\xfc\x97\xd5\xf8\x2f\xd3\xf8\x2f\xe7\xf1\x5f\xc5\xf1\x5f\x0d\xe3\xf3\xe5\xf8\x7c\x02\x9f\x9f\xc6\x7f\x5d\x8b\xff\xba\x1f\xff\x4d\x19\xfe\x9b\x36\xfc\x37\x13\xf8\x6f\xc3\xf8\x6f\xdb\xf1\xdf\x8e\xe2\x67\x82\xf8\x99\x66\xfc\xcc\x20\xfe\xbb\x12\xfc\x77\x0d\xf8\xef\x32\xf8\xef\x8a\xf8\xef\x6b\xf1\xdf\xf7\xe0\xbf\xcf\xe3\x7f\xa8\xc2\xff\xd0\x89\xff\x61\x02\x3f\x1b\xc6\xcf\xb6\xe3\x67\x47\xf1\x3f\x06\xf1\x3f\x36\xe3\x7f\xec\xc5\xff\x38\x8e\xff\x09\xfc\x4f\x55\xf8\x9f\x5a\xf0\x3f\xa5\xf1\x3f\xe5\xf0\x3f\x97\xe0\x7f\x8e\xe2\x7f\x6e\xc5\xff\xdc\x87\xff\x79\x02\x5f\x28\xc5\x17\xaa\xf1\x85\x36\x7c\x21\x83\x2f\x4c\xe2\x7f\x29\xc3\xff\x52\x83\xff\xa5\x1d\xff\x4b\x3f\xfe\x97\x1c\xfe\x97\x39\xfc\xaf\x15\xf8\x5f\xeb\xf0\xbf\xb6\xe1\x7f\xed\xc5\xff\x3a\x82\xff\x75\x06\xff\x5b\x00\xff\x5b\x14\xff\x5b\x13\xfe\xb7\x2e\xfc\x6f\x59\xfc\x6f\x93\xf8\x22\xf8\x62\x04\x5f\x8c\xe1\x8b\x1d\xf8\x62\x1f\xbe\x38\x86\x2f\x16\xf0\xbf\xb7\xe3\x7f\x9f\xc3\xff\x91\xc0\xff\x0f\xfc\xff\x3a\xf1\x73\xa5\xf8\xb9\x6e\xfc\x9f\x01\xfc\x9f\x3d\xf8\xbf\x42\xf8\xbf\xd2\xf8\xbf\x2b\xf0\x7f\x67\xf0\xf3\x11\xfc\xfc\x00\xfe\x1f\x8b\xff\x67\x10\xff\x6f\x14\xff\xef\x30\xfe\xbf\x1a\xfc\x7f\xa3\x08\x61\x84\x4e\x84\x3c\xb2\x4c\x2d\xb2\x4c\x06\x59\xb6\x04\x59\xb6\x19\x59\x76\x14\x59\x2e\x8c\x2c\xd7\x89\x2c\x97\x47\x4a\x6a\x90\x92\x34\x52\x32\x8f\x2c\x1f\x47\x96\x1f\x46\x56\x28\x47\x56\x48\x20\x2b\x4c\x21\x2b\x56\x23\x2b\xa6\x91\x15\x87\x91\x15\xff\xff\xf3\x48\x69\x39\x52\x5a\x8d\x94\xc6\x91\xd2\x04\x52\x9a\x46\x4a\x87\x91\xd2\x29\xa4\x74\x1e\x59\xa9\x1c\x59\xa9\x1a\x59\x29\x8e\xac\x94\x40\x56\x4a\x23\x2b\x0d\x23\x2b\x4d\x21\x2b\xcd\x23\x2b\x97\x23\x2b\x57\x23\x2b\x77\x23\x2b\x4f\x21\xab\x44\x90\x55\x3a\x90\x55\xc6\x90\xb2\x10\x52\xd6\x82\x94\x0d\x21\xab\x96\x22\xab\x36\x22\xab\xf6\x23\xab\xce\x21\xab\xd5\x21\xab\xf5\x22\xab\xcd\x20\xab\x47\x91\xd5\xbb\x90\xd5\x27\x91\x40\x04\x09\x74\x20\x81\x31\x64\x0d\x90\x35\xa2\xc8\x1a\x6d\xc8\x1a\xfd\xc8\x1a\xd3\xc8\x9a\x21\x64\xcd\x18\xb2\x66\x17\xb2\xe6\x08\xb2\xe6\x1c\xb2\x96\x45\xd6\x6a\x41\xd6\xea\x43\xd6\x9a\x44\x82\x01\x24\x58\x87\x04\x93\x48\x70\x08\x09\x16\x90\xb5\x23\xc8\xda\x4d\xc8\xda\x9d\xc8\xda\xfd\xc8\xda\xe3\xc8\xda\x05\x64\x9d\x20\xb2\x4e\x14\x59\x27\x8e\xac\x93\x44\xd6\xc9\x20\xeb\x8c\x21\xeb\xcc\x22\xeb\x06\x90\x75\xab\x90\x75\x1b\x91\x75\x13\xc8\xba\x7d\xc8\xba\xa3\xc8\xba\x33\x48\xa8\x0c\x09\x59\x24\xd4\x80\x84\xda\x90\x50\x37\x12\xea\x47\x42\xa3\x48\x68\x1a\x09\xcd\x23\xeb\x85\x90\xf5\xaa\x90\xf5\x62\xc8\x7a\xad\xc8\x7a\x5d\xc8\x7a\x19\x64\xbd\x11\x64\xbd\x29\x64\xbd\x39\x64\xfd\x0a\x64\xfd\x3a\x64\xfd\x36\x64\xfd\x5e\x64\xfd\x51\x64\xfd\x02\xb2\x41\x39\xb2\x41\x1d\xb2\x41\x3b\xb2\x41\x1f\xb2\xc1\x38\xb2\xc1\x1c\x52\x1e\x46\xca\x63\x48\x79\x02\x29\xef\x47\xca\x27\x90\x0d\x41\x36\xac\x44\x36\x6c\x44\x36\xec\x44\x36\x1c\x40\x36\x9c\x44\x36\x02\xd9\xa8\x12\xd9\xa8\x11\xd9\x28\x89\x6c\x34\x80\x6c\x34\x89\x6c\x5c\x82\x6c\x6c\x91\x8d\xe3\xc8\xc6\x5d\xc8\xc6\x83\xc8\xc6\xd3\x48\x45\x19\x52\x11\x45\x2a\x9a\x91\x8a\x14\x52\x31\x8c\x54\xcc\x20\x0b\x4a\x90\x05\x15\xc8\x82\x6a\x64\x41\x23\xb2\xa0\x1d\x59\x90\x42\x16\x0c\x20\x0b\xc6\x90\x05\x79\x64\x13\x90\x4d\xca\x91\x4d\xa2\xc8\x26\x0d\xc8\x26\x6d\xc8\x26\xdd\xc8\x26\xfd\xc8\x26\xa3\xc8\x26\xd3\xc8\x26\xf3\xc8\xa6\x21\x64\xd3\x2a\x64\xd3\x18\xb2\x69\x2b\xb2\x69\x17\xb2\x69\x06\xd9\x74\x04\xd9\x74\x0a\xd9\x74\x0e\x09\x07\x91\xb0\x45\xc2\xf5\x48\xb8\x05\x09\x77\x22\xe1\x3e\x24\x3c\x8c\x84\x27\x91\x70\x11\xd9\x2c\x80\x6c\x56\x89\x6c\x56\x87\x6c\xd6\x8c\x6c\xd6\x83\x6c\x36\x8a\x6c\x56\x44\x36\x0f\x23\x9b\x37\x20\x9b\x77\x22\x9b\x0f\x22\x9b\xe7\x91\x2d\x82\xc8\x16\xb5\xc8\x16\xed\xc8\x16\x19\x64\x8b\x09\x24\x52\x82\x44\xaa\x90\x48\x33\x12\xe9\x41\x22\xa3\x48\xa4\x88\x6c\x19\x46\xb6\x6c\x40\xb6\xec\x44\xb6\x1c\x44\xb6\xcc\x23\x5b\x05\x91\xad\x6a\x91\xad\xda\x91\xad\x32\xc8\x56\x13\xc8\xd6\x25\xc8\xd6\x55\xc8\xd6\xcd\xc8\xd6\x3d\xc8\xd6\xa3\xc8\xd6\x45\xa4\x32\x8c\x54\x36\x20\x95\x9d\x48\xe5\x20\x52\x99\x47\x54\x10\x51\xb5\x88\x4a\x20\x6a\x10\x51\xb3\x88\x0e\x23\x3a\x8e\xe8\x1e\x44\x8f\x23\xa6\x04\x31\xd5\x88\x69\x47\xcc\x00\x62\xf2\x88\x2d\x47\x6c\x03\x62\xbb\x11\x3b\x8a\xd8\x79\xc4\x55\x21\xae\x15\x71\x19\xc4\x4d\x21\x3e\x88\xf8\x7a\xc4\x77\x22\x7e\x18\xf1\x45\x44\x2a\x11\x69\x46\x24\x8d\xc8\x04\x52\x55\x8a\x54\xd5\x20\x55\x1d\x48\x55\x16\xa9\x9a\x41\xb6\xa9\x40\xb6\x69\x44\xb6\x49\x21\xdb\x8c\x21\xdb\x82\x6c\x1b\x45\xb6\x6d\x43\xb6\x1d\x41\xb6\x0b\x20\xdb\x35\x21\xdb\x65\x91\x28\x48\x34\x86\x44\xfb\x90\x68\x01\xd9\xbe\x06\xd9\x3e\x85\x6c\x3f\x8d\xec\x60\x91\x1d\x92\xc8\x0e\x39\x64\xc7\x0a\x64\xc7\x36\x64\xc7\x11\xa4\x3a\x80\x54\x37\x21\xd5\x59\x64\x27\x90\x9d\x62\xc8\x4e\x7d\xc8\x4e\x05\x64\xe7\x1a\x64\xe7\x14\xb2\xf3\x34\xb2\x8b\x45\x76\x49\x22\xbb\xe4\x90\x9a\x0a\xa4\xa6\x0d\xa9\x19\x41\x76\x0d\x20\xbb\x36\x21\xbb\x66\x91\xdd\x40\x76\x8b\x21\xbb\xf5\x21\xbb\x15\x90\xdd\x6b\x90\xdd\x53\xc8\xee\x39\xa4\x36\x80\xd4\xc6\x90\xda\x14\x52\x9b\x43\xf6\x08\x20\x7b\xc4\x90\x3d\x52\xc8\x1e\x39\x64\xcf\x00\xb2\x67\x0c\xd9\x33\x85\xec\x99\x43\xf6\x0a\x20\x7b\xc5\x90\xbd\x52\xc8\x5e\x39\xa4\x2e\x80\xd4\xc5\x90\xba\x14\x52\x97\x43\xf6\x0e\x20\x7b\xc7\x90\xbd\x53\xc8\xde\x39\x64\x9f\x00\xb2\x4f\x0c\xd9\x27\x85\xec\x93\x43\xf6\x0d\x20\xfb\xc6\x90\x7d\x53\xc8\xbe\x39\xa4\x3e\x80\xd4\x37\x20\xf5\xbd\x48\xfd\x14\xb2\x5f\x05\xb2\x5f\x33\xb2\x5f\x3f\xb2\xdf\x2c\xb2\xbf\x45\xf6\x6f\x40\xf6\xef\x40\xf6\x4f\x23\xfb\x8f\x20\xfb\xcf\x20\x07\x94\x21\x07\x54\x21\x07\xc4\x91\x03\x92\xc8\x01\x19\xe4\x80\x31\xe4\x80\x59\x24\x16\x40\x62\x51\x24\x16\x47\x62\x49\x24\x96\x41\x62\x63\x48\x6c\x16\x39\x30\x80\x1c\x18\x45\x0e\x8c\x23\x07\x26\x91\x03\x33\xc8\x81\x63\xc8\x81\x05\xe4\xa0\x20\x72\x50\x14\x39\xa8\x09\x39\xa8\x0b\x39\x28\x8b\x1c\x34\x89\x1c\x0c\x72\x70\x04\x39\x38\x86\x1c\xdc\x81\x1c\xdc\x87\x1c\x3c\x86\x1c\x5c\x40\x1a\x2a\x90\x86\x18\xd2\x90\x44\x1a\xb2\x48\xc3\x34\x72\x48\x00\x39\xa4\x06\x39\xa4\x0d\x39\xa4\x0f\x39\x24\x87\x1c\x0a\x72\xa8\x45\x0e\x6d\x42\x0e\x4d\x21\x87\x8e\x20\x87\x16\x90\xc3\x2a\x90\xc3\x62\xc8\x61\x49\xe4\xb0\x2c\x72\xd8\x34\xd2\x18\x40\x1a\x6b\x90\xc6\x36\xa4\xb1\x0f\x69\xcc\x21\x87\x83\x1c\x6e\x91\xc3\x9b\x90\xc3\x53\xc8\xe1\x23\xc8\xe1\x05\xe4\x88\x0a\xe4\x88\x18\x72\x44\x12\x39\x22\x8b\x1c\x31\x8d\x1c\x19\x40\x8e\xac\x41\x8e\x6c\x43\x8e\xec\x43\x8e\xcc\x21\x71\x90\xb8\x45\xe2\x4d\x48\x3c\x85\xc4\x47\x90\x78\x01\x39\xaa\x02\x39\x2a\x86\x1c\xd5\x85\x1c\x35\x82\x1c\x35\x87\x1c\x6d\x91\xa3\x5b\x90\xa3\xfb\x90\xa3\x27\x91\x63\x02\xc8\x31\x75\xc8\x31\x49\xe4\x98\x21\xe4\x98\x02\xd2\x14\x41\x9a\x9a\x90\xa6\x5e\xa4\x29\x87\x1c\x5b\x8a\x1c\x5b\x83\x1c\xdb\x81\x1c\x9b\x45\x8e\x9d\x41\x8e\xab\x40\x8e\x6b\x44\x8e\x4b\x21\xc7\x8d\x21\xc7\x83\x1c\x1f\x45\x8e\x6f\x43\x8e\xef\x47\x8e\x9f\x46\x9a\x43\x48\x73\x0c\x69\xee\x42\x9a\x47\x90\xe6\x39\xe4\x04\x8b\x9c\xd0\x82\x9c\xd0\x87\x9c\x30\x89\x9c\x18\x40\x4e\xac\x43\x4e\x4c\x22\x27\x0e\x21\x27\xce\x22\x27\x85\x91\x93\xe2\xc8\x49\x3d\xc8\x49\xe3\x48\x4b\x09\xd2\x12\x43\x5a\xd2\x48\xcb\x0c\x72\x72\x15\x72\x72\x12\x39\x79\x1c\x39\x25\x84\x9c\xd2\x8c\x9c\x92\x45\x4e\x99\x47\x4e\xad\x43\x4e\xed\x41\x4e\x9d\x46\x5a\x2b\x91\xd6\x0e\xa4\x75\x14\x39\x2d\x80\x9c\x16\x47\x4e\xeb\x47\x4e\x2b\x22\xa7\xd7\x20\xa7\x77\x23\xa7\x4f\x22\x67\x84\x91\x33\xda\x90\x33\x86\x91\xb6\x52\xa4\xad\x01\x69\xeb\x43\xda\x66\x91\x33\xa3\xc8\x99\x9d\xc8\x99\x39\xe4\xac\x72\xe4\xac\x16\xe4\xac\x41\xe4\x6c\x90\xb3\xeb\x91\xb3\x7b\x91\xb3\xf3\x48\xbb\x45\xda\x13\x48\xfb\x18\x72\x4e\x10\x39\xa7\x09\x39\x67\x00\x39\x67\x0e\x39\xb7\x16\x39\x37\x85\x9c\x3b\x85\x9c\x57\x81\x9c\xd7\x8c\x9c\x97\x41\xce\x9b\x41\x3a\x2a\x91\x8e\x36\xa4\x63\x10\xe9\x98\x43\xce\xaf\x46\xce\x4f\x22\xe7\x8f\x22\x17\x94\x22\x17\xd4\x23\x17\xa4\x90\x0b\x26\x90\x0b\x43\xc8\x85\x71\xe4\xc2\x3e\xe4\xc2\x3c\x92\x88\x20\x89\x56\x24\x91\x45\x12\x45\xe4\xa2\x28\x72\x51\x02\xb9\x68\x04\xb9\xb8\x04\xb9\xb8\x0e\xb9\xb8\x1b\xb9\x38\x87\x5c\x12\x44\x2e\x69\x44\x2e\x49\x23\x97\x4c\x23\xc9\x30\x92\x6c\x41\x92\x03\x48\xb2\x80\x5c\x5a\x85\x5c\xda\x81\x5c\x3a\x8c\x5c\x06\x72\x59\x2d\x72\x59\x17\x72\xd9\x38\x72\x79\x00\xb9\xbc\x01\xb9\xbc\x17\xb9\x7c\x0a\xe9\xac\x40\x3a\x6b\x91\xce\x16\xa4\xb3\x1b\xe9\xcc\x22\x9d\x93\xc8\x15\x20\x57\x44\x90\x2b\xea\x91\x2b\xda\x91\x2b\x7a\x91\x2b\x86\x91\x2b\xa6\x91\x2b\x4b\x90\x2b\x23\xc8\x95\xf5\xc8\x95\xed\xc8\x95\xbd\xc8\x95\x23\xc8\x95\x33\xc8\xc2\x32\x64\xa1\x45\x16\x36\x20\x0b\x3b\x90\x85\x69\x64\xe1\x08\xb2\x70\x06\xe9\x2a\x43\xba\xaa\x90\xae\x38\xd2\x95\x44\xba\xfa\x91\xae\x71\xa4\xab\x80\x5c\x15\x42\xae\xaa\x41\xae\x6a\x46\xae\xea\x46\xae\x1a\x44\xae\x9a\x44\xae\x9a\x47\xae\xae\x40\xae\xae\x45\xae\x6e\x41\xae\xee\x46\xae\xce\x22\x57\x4f\x20\xd7\x94\x21\xd7\xd4\x21\xd7\x74\x22\xd7\x8c\x20\xdd\x20\xdd\x35\x48\x77\x12\xe9\x1e\x46\xba\xe7\x90\x6b\xab\x90\x6b\x5b\x91\x6b\x07\x90\x6b\x67\x90\xeb\xc2\xc8\x75\x4d\xc8\x75\x69\xe4\xba\x29\xe4\xfa\x10\x72\x7d\x03\x72\x7d\x0a\xb9\x7e\x0c\x49\x95\x22\xa9\x5a\x24\x95\x44\x52\xc3\x48\x6a\x1e\xb9\xa1\x1a\xb9\xa1\x03\xb9\x61\x10\xb9\xa1\x80\xdc\x58\x89\xdc\xd8\x8a\xdc\xd8\x8f\xdc\x98\x47\x6e\xaa\x40\x6e\x6a\x42\x6e\xea\x43\x6e\x9a\x42\x7a\xca\x91\x9e\x38\xd2\xd3\x8b\xf4\x4c\x22\x37\x07\x91\x9b\x63\xc8\xcd\x29\xe4\xe6\x1c\x72\x4b\x00\xb9\x25\x86\xdc\x92\x42\x6e\xc9\x21\xb7\x82\xdc\x6a\x91\x5b\x9b\x90\x5b\x53\xc8\xad\x23\xc8\xad\x05\xa4\xb7\x02\xe9\x8d\x21\xbd\x49\xa4\x37\x8b\xf4\x4e\x23\xb7\x05\x90\xdb\x6a\x90\xdb\xda\x90\xdb\xfa\x90\xdb\x72\xc8\xed\x20\xb7\x5b\xe4\xf6\x26\xe4\xf6\x14\x72\xfb\x08\x72\x7b\x01\xb9\xa3\x02\xb9\x23\x86\xdc\x91\x44\xee\xc8\x22\x77\x4c\x23\xe9\x00\x92\xae\x41\xd2\x6d\x48\xba\x0f\x49\xe7\x90\x3b\x41\xee\xb4\xc8\x9d\x4d\xc8\x9d\x29\xe4\xce\x11\xe4\xce\x02\x72\x57\x05\x72\x57\x0c\xb9\x2b\x89\xdc\x95\x45\xee\x9a\x46\xee\x0e\x20\x77\xd7\x20\x77\xb7\x21\x77\xf7\x21\x77\x4f\x20\x7d\xa5\x48\x5f\x35\xd2\xd7\x86\xf4\x65\x90\xbe\x49\xe4\x9e\x32\xe4\x9e\x1a\xe4\x9e\x76\xe4\x9e\x7e\xe4\x9e\x29\xe4\xde\x00\x72\x6f\x2d\x72\x6f\x07\x72\xef\x00\x72\xef\x34\x72\x5f\x10\xb9\xaf\x0e\xb9\x2f\x81\xdc\x97\x45\xee\xcb\x23\x99\x10\x92\xa9\x47\x32\x49\x24\x33\x88\x64\x66\x90\xfb\xcb\x91\xfb\x63\xc8\xfd\x9d\xc8\xfd\x43\xc8\xfd\xb3\xc8\x03\x15\xc8\x03\x0d\xc8\x03\x5d\xc8\x03\xc3\xc8\x03\x05\xe4\xc1\x30\xf2\x60\x23\xf2\x60\x37\xf2\xe0\x08\xf2\x60\x11\xe9\x8f\x20\xfd\x71\xa4\x3f\x85\xf4\x8f\x22\xfd\x73\xc8\x43\x95\xc8\x43\x4d\xc8\x43\x5d\xc8\x43\x59\xe4\xa1\x49\x64\x11\xc8\xa2\x08\xb2\x28\x86\x2c\xea\x40\x16\xf5\x21\x8b\xc6\x90\x45\x05\xe4\xe1\x10\xf2\x70\x0d\xf2\x70\x0b\xf2\x70\x0a\x79\x78\x08\x79\x78\x1a\x19\x28\x45\x06\x2c\x32\xd0\x88\x0c\x24\x91\x81\x7e\x64\x20\x87\x0c\xcc\x21\x8f\x54\x20\x8f\xd4\x21\x8f\xb4\x21\x8f\xf4\x22\x8f\x8c\x20\x8f\xcc\x20\x8b\x03\xc8\xe2\x28\xb2\xb8\x09\x59\xdc\x85\x2c\xce\x22\x8b\x27\x91\x25\x20\x4b\x22\xc8\x92\x18\xb2\xa4\x03\x59\xd2\x87\x2c\x19\x43\x96\x14\x90\x6c\x08\xc9\xd6\x20\xd9\x16\x24\x9b\x42\xb2\x43\x48\x76\x1a\x79\xb4\x14\x79\xb4\x06\x79\xb4\x03\x79\x34\x8b\x3c\x3a\x8b\x3c\x16\x41\x1e\x6b\x46\x1e\x4b\x23\x8f\x4d\x20\x8f\x97\x21\x8f\xd7\x21\x8f\x77\x22\x8f\x8f\x20\x8f\xcf\x23\x83\x51\x64\xb0\x1d\x19\xcc\x20\x83\x13\xc8\x13\x25\xc8\x13\x55\xc8\x13\xcd\xc8\x13\x3d\xc8\x13\xa3\xc8\x13\x45\xe4\xc9\x30\xf2\x64\x03\xf2\x64\x27\xf2\xe4\x20\xf2\x64\x1e\x79\x2a\x88\x3c\x55\x8b\x3c\xd5\x8e\x3c\x95\x41\x9e\x9a\x40\x86\x4a\x90\xa1\x2a\x64\xa8\x19\x19\xea\x41\x86\x46\x91\xa1\x22\xf2\x74\x18\x79\xba\x01\x79\xba\x13\x79\x7a\x10\x79\x3a\x8f\x3c\x13\x44\x9e\xa9\x46\x9e\x69\x46\x9e\xe9\x46\x9e\x19\x44\x9e\x99\x42\x96\x96\x20\x4b\x2b\x91\xa5\x0d\xc8\xd2\x04\xb2\x34\x83\x2c\x1d\x47\x96\x16\x91\xe1\x72\x64\xb8\x16\x19\x6e\x45\x86\x27\x90\x67\xab\x91\x67\x33\xc8\x73\x65\xc8\x73\x09\xe4\xb9\x59\xe4\xf9\x06\xe4\xf9\x61\x64\x24\x8c\x8c\x74\x23\x23\x45\xe4\x85\x38\xf2\xc2\x28\xf2\x62\x15\xf2\x62\x06\x79\xa9\x0c\x79\xa9\xfd\xff\xa8\xfb\xf7\xb8\xac\xca\x6f\xef\x17\xff\xcc\xf3\xf9\x70\x2b\x15\xa5\xe5\x6d\xa1\xa1\xa2\x92\x73\x5c\x85\x67\x54\x54\x34\x34\x4f\x29\x2a\x2a\x28\x28\x28\x02\x02\x26\xa6\x95\x15\x15\x95\x15\x95\x95\x19\xa5\x29\x95\x95\x15\x95\x29\x26\x1a\x2a\x2a\x2a\x2a\x2a\x2a\x2a\x2a\x1e\x43\x45\xc5\x32\xa5\xa2\xfc\xbd\x24\xd6\x6f\x7d\xbf\x6b\xaf\xb5\xf7\xb3\x9f\xe7\xaf\x7d\xf3\xba\x98\xef\x79\xcf\x31\xc7\x35\xae\x31\x3e\x73\xcc\xeb\xbf\x1b\xde\x96\x2a\x78\x25\x11\xf0\x4a\x56\xc1\xdb\x1a\x00\x6f\xeb\x7c\x78\x5b\x6b\xe1\x6d\x8b\x81\xb7\xad\x14\xde\xf6\x50\x78\xdb\x17\xc3\x2b\x05\xbc\xd2\x44\x78\xa5\xe5\xf0\x76\x84\xc3\xdb\x51\x00\x6f\x67\x4b\x78\x3b\x73\xe0\xed\xbc\x0e\x6f\x17\xc1\xdb\x95\x09\x6f\xd7\x6a\x78\xbb\xea\xe1\x95\x85\xc1\x2b\xcb\x82\x57\x56\x04\x6f\x37\xe0\xed\x8e\x80\xb7\x3b\x1b\xde\xee\x52\x78\x7b\x4c\x78\x7b\x86\xc1\xdb\x93\x0b\x6f\x4f\x39\xbc\xbd\x01\xf0\xf6\x46\xc3\xdb\x9b\x07\x6f\x6f\x35\xbc\xf2\x20\x78\xe5\x89\xf0\xca\x57\xc1\x2b\xaf\x83\xb7\x8f\xe0\xed\xcb\x82\xb7\xaf\x08\xde\x7e\xc0\xdb\x1f\x01\x6f\x7f\x0e\xbc\xfd\x65\xf0\x0e\xb8\xf0\x0e\x8c\x82\x77\x60\x31\xbc\x03\x55\xf0\x2a\xfc\xf0\x2a\x12\xe1\x55\x2c\x86\x57\x51\x0a\xaf\xa2\x1e\xde\xc1\x60\x78\x07\xa3\xe1\x1d\xcc\x81\x77\xb0\x18\xde\xc1\x7a\x78\x87\x42\xe1\x1d\x8a\x85\x77\x28\x17\xde\xa1\x62\x78\x87\xea\xe0\x1d\xf6\xc3\x3b\x3c\x0c\xde\xe1\x1c\x78\x87\x8b\xe1\x1d\xae\x87\x57\x19\x0c\xaf\x32\x1a\x5e\x65\x0e\xbc\xca\x42\x78\x95\x35\xf0\x8e\x04\xc2\x3b\x32\x0a\xde\x91\x5c\x78\x47\x4a\xe1\x1d\xa9\x87\x77\x34\x18\xde\xd1\x68\x78\x47\x73\xe0\x1d\x2d\x84\x77\xb4\x06\xde\xb1\x20\x78\xc7\x62\xe1\x1d\xcb\x83\x77\xac\x02\x5e\x95\x0a\xaf\xaa\x07\xbc\xaa\x4c\x78\x55\xab\xe0\x55\x9d\x85\x77\x3c\x10\xde\xf1\x28\x78\xc7\x73\xe0\x1d\x2f\x81\x77\x02\xf0\x4e\x84\xc1\x3b\x91\x06\xef\x44\x3e\xbc\x13\x55\xf0\x4e\x06\xc0\x3b\x19\x05\xef\xe4\x02\x78\x27\x57\xc3\x3b\x59\x07\xaf\x3a\x04\x5e\x75\x22\xbc\xea\x65\xf0\xaa\x2b\xe0\x9d\x32\xe1\x9d\x8a\x80\x77\x6a\x3e\xbc\x53\xab\xe1\x9d\xaa\x85\x77\x3a\x18\xde\xe9\x78\x78\xa7\x97\xc1\x3b\x5d\x05\xef\x4c\x20\xbc\x33\xc3\xe0\x9d\xc9\x81\x77\xa6\x18\xde\x99\x06\x78\x67\x09\xde\xd9\x34\x78\x67\x57\xc1\x3b\x5b\x03\xef\x5c\x10\xbc\x73\x69\xf0\xce\x15\xc1\x3b\xaf\xc2\x3b\x3f\x0a\xde\xf9\x65\xf0\xce\xd7\xc2\xfb\xb9\x07\xbc\x9f\x17\xc2\xfb\xb9\x0a\x5e\x4d\x30\xbc\x9a\xf9\xf0\x6a\x4a\xe1\x5d\x08\x80\x77\x21\x16\xde\x85\x55\xf0\x2e\x34\xc0\xbb\x18\x05\xef\xe2\x32\x78\x17\x6b\xe1\x5d\x0a\x83\x77\x29\x1b\xde\xa5\x72\x78\xb5\x7e\x78\xb5\x69\xf0\x6a\x4b\xe0\x5d\x6e\x09\xef\x72\x1a\xbc\xcb\xc5\xf0\xae\xb8\xf0\xae\xc4\xc2\xbb\x52\x00\xef\x2a\xe0\x5d\x1d\x06\xef\x6a\x3e\xbc\xab\xf5\xf0\xea\xa2\xe0\xd5\x15\xc0\xbb\x16\x08\xef\x5a\x36\xbc\x6b\xd7\xe1\xfd\x12\x0b\xef\x97\x32\x78\xbf\x86\xc3\xfb\xb5\x10\xde\xf5\x10\x78\xd7\x17\xc1\xbb\xde\x00\xef\xb7\x44\x78\xbf\x55\xc2\xbb\x11\x01\xef\x46\x01\xbc\x9b\x2d\xe1\xdd\xcc\x85\x57\x2f\xc2\xab\x4f\x83\x57\x5f\x0d\xef\xf7\x28\x78\xbf\x17\xc3\xfb\x23\x14\xde\x1f\xf9\xf0\xfe\x0c\x84\xf7\x67\x2e\xbc\x06\x15\x5e\x43\x16\xbc\x86\x1a\x78\x7f\xc5\xc0\xfb\xab\x1c\xde\xdf\xe1\xf0\xfe\x2e\x84\x77\x2b\x04\xde\xad\x65\x20\x04\x82\x10\x0d\xc2\x62\x10\x2a\x41\x5c\x20\x88\x8b\x01\x71\x79\x20\xee\x2c\x88\x0f\x06\xf1\xc9\x20\x7e\x15\x88\xaf\x03\x09\xa1\x20\x21\x0d\x24\x14\x80\x84\x3a\x90\x18\x06\x12\xe7\x83\xc4\x62\x90\x24\x82\xa4\x48\x90\xb4\x10\x24\x95\x83\xe4\x00\x90\x1c\x0d\x92\x97\x81\xe4\x5a\x90\x42\x20\x25\x0b\xa4\x14\x81\x54\x80\xd4\x08\x90\xba\x10\xa4\x56\x80\xb4\x96\x20\x2d\x1e\xa4\x15\x80\x74\x80\xf4\x61\x20\x3d\x1f\xa4\xd7\x83\x8c\x61\x20\x63\x25\xc8\xa8\x07\x99\x51\x20\x73\x19\xc8\xac\x03\x59\xe1\x20\x6b\x11\xc8\xaa\x01\xd9\xe1\x20\x7b\x31\xc8\xae\x01\x39\x3d\x40\x4e\x2e\xc8\xa9\x06\xb9\xa1\x20\x37\x1b\xe4\x56\x82\x7c\xa1\x20\x5f\x36\xc8\x57\x05\x6a\x16\x02\x6a\x36\x1f\xd4\xac\x1c\xd4\x3c\x08\xd4\x7c\x3e\xa8\x79\x25\x28\x20\x14\x14\xb0\x10\x14\x50\x03\xba\x23\x12\x74\x47\x3e\xe8\x4e\x11\x74\x67\x3c\xe8\xce\x52\xd0\x5d\x21\xa0\xbb\x72\x41\x77\xd5\x83\x02\x63\x40\x81\x45\xa0\xbb\x5b\x82\xee\x9e\x0f\xba\xbb\x0a\x74\x4f\x38\xe8\x9e\x7c\x50\x0b\x11\xd4\x22\x1e\xd4\xa2\x14\xd4\x32\x18\xd4\x32\x07\xd4\xb2\x16\x74\x6f\x14\xe8\xde\x02\xd0\x7d\x01\xa0\xfb\xe6\x83\xee\x3b\x0b\x6a\x15\x05\x6a\xb5\x0a\xe4\x37\x41\xfe\x34\x90\xbf\x1c\xd4\x9a\x40\xad\x17\x83\xee\x0f\x00\xdd\x9f\x0d\xba\xbf\x16\xf4\x40\x10\xe8\x81\x58\xd0\x03\x8b\x41\x0f\x54\x80\x82\x5c\x50\x50\x24\x28\x28\x1b\x14\x54\x0c\x6a\x03\x50\x9b\x30\x50\x9b\x4c\x50\x9b\x02\x50\x9b\x5a\x50\xdb\x20\x50\xdb\x18\x50\xdb\xc5\xa0\xb6\x95\xa0\x07\x03\x41\x0f\x8e\x02\x3d\x98\x0b\x7a\xb0\x0c\x14\xac\x82\x82\x23\x40\xc1\xd9\xa0\xe0\x12\x50\x3b\x80\xda\x85\x83\xda\xcd\x07\xb5\x2b\x04\xb5\xbb\x0e\x6a\x1f\x0a\x6a\x9f\x06\x6a\x5f\x00\x6a\x5f\x07\xea\x10\x06\xea\x30\x1f\xd4\xa1\x1c\x14\x12\x04\x0a\xc9\x02\x85\x94\x81\x3a\x06\x83\x3a\x66\x83\x3a\x56\x83\x3a\xf5\x00\x75\x5a\x0c\xea\x54\x0b\xea\x1c\x0e\xea\xbc\x08\xd4\xb9\x06\x14\x1a\x01\x0a\x5d\x06\x0a\x6d\x00\x3d\x14\x0d\x7a\x68\x35\xa8\x8b\x0a\xea\x12\x03\xea\x52\x00\xf2\x44\x90\x17\x0b\xf2\x8a\x40\x14\x08\xa2\x4c\x10\x95\x83\x58\x10\x88\xcd\x07\xb1\x72\xd0\xc3\xc1\xa0\x87\xb3\x41\x0f\x9f\x05\x3d\x12\x09\x7a\x64\x15\x28\xcc\x05\x85\x45\x80\xc2\xb2\x40\x61\xb7\xcf\xab\x41\x5d\x03\x40\x5d\x23\x41\x5d\x17\x80\xba\x16\x82\xba\xd6\x81\xba\x05\x81\xba\x45\x83\xba\x2d\x04\x75\x2b\x06\x75\xbb\x0e\xea\x1e\x0c\xea\x1e\x0b\xea\xbe\x18\xd4\xbd\x1c\xd4\x43\x04\xf5\x08\x03\xf5\x48\x06\xf5\x58\x06\xea\x51\x01\xea\xa9\x82\x7a\x86\x83\x7a\x66\x81\x7a\xae\x02\xf5\xac\x06\xf5\x0a\x00\xf5\x8a\x02\xf5\x5a\x00\xea\x55\x08\xea\x75\x1d\xd4\x3b\x14\xd4\x3b\x19\xd4\x7b\x11\xa8\x77\x31\xa8\x77\x2d\x28\x3c\x10\x14\x1e\x01\x0a\x4f\x03\x85\xe7\x81\xc2\x4b\x41\xe1\xd7\x41\x7d\xfc\xa0\x3e\x51\xa0\x3e\x59\xa0\x3e\xf9\xa0\x3e\xe5\xa0\x3e\x0d\xa0\xbe\xc1\xa0\xbe\xa3\x40\x7d\x17\x80\xfa\xae\x02\xf5\xad\x04\xf5\x13\x41\xfd\x42\x41\xfd\x62\x40\xfd\x72\x40\xfd\x56\x83\xfa\x55\x83\x22\x4c\x50\x44\x18\x28\x22\x1e\x14\x91\x0b\x8a\x28\x02\x45\xd4\x80\xfa\xb7\x04\xf5\x1f\x06\xea\x9f\x0d\xea\xbf\x1a\xd4\xff\x2c\x68\x40\x20\x68\x40\x14\x68\xc0\x02\xd0\x80\xd5\xa0\x01\x75\xa0\x81\x21\xa0\x81\x89\xa0\x81\x8b\x41\x03\x4b\x41\x03\x1b\x40\x91\xa1\xa0\xc8\x78\x50\xe4\x62\x50\x64\x05\x68\x90\x0b\x1a\x14\x05\x1a\x34\x1f\x34\x68\x15\x68\x50\x35\x68\x70\x00\x68\x70\x24\x68\xf0\x7c\xd0\xe0\x42\xd0\xe0\xeb\xa0\x47\x83\x40\x8f\x8e\x02\x3d\x9a\x03\x7a\xb4\x08\xf4\x68\x1d\x28\x2a\x08\x14\x15\x0f\x8a\xca\x07\x45\x9d\x05\x0d\x09\x06\x0d\x49\x06\x0d\x59\x0d\x1a\xd2\x00\x1a\x1a\x01\x1a\xba\x10\x34\xb4\x12\xf4\x58\x10\xe8\xb1\x2c\xd0\x63\x45\xa0\x61\x00\x0d\x8b\x04\x0d\xcb\x05\x0d\xab\x04\x0d\xf7\x83\x86\x27\x83\x86\x17\x81\x46\x98\xa0\x11\xc3\x40\x23\x16\x83\x46\x54\x83\x46\x06\x83\x46\xa6\x81\x46\x16\x82\x46\xa9\xa0\x51\xa3\x40\xa3\x56\x82\x46\xd5\x82\x1e\x0f\x05\x3d\x9e\x05\x7a\xbc\x18\x34\xda\x04\x8d\x1e\x05\x1a\xbd\x0c\x34\xba\x0e\x34\x26\x1c\x34\x26\x11\x34\x26\x17\x34\xa6\x10\x34\xa6\x1a\x14\xad\x82\xa2\x43\x41\xd1\xb1\xa0\xe8\x5c\x50\x74\x31\x28\xba\x06\x34\xd6\x05\x8d\x0d\x03\x8d\x8d\x05\x8d\xcd\x01\x8d\x2d\x00\x8d\xad\x06\x8d\x73\x41\xe3\xc2\x41\xe3\x12\x41\xe3\x72\x41\xe3\x0a\x41\xe3\xaa\x41\xe3\x55\xd0\xf8\x50\xd0\xf8\x58\xd0\xf8\x5c\xd0\xf8\x62\xd0\xf8\x1a\x50\x8c\x0b\x8a\x09\x03\xc5\xc4\x82\x62\x72\x40\x31\x05\xa0\x98\x6a\xd0\x04\x17\x34\x21\x1c\x34\x21\x16\x34\x61\x01\x68\xc2\x32\xd0\x84\x62\xd0\x84\x6a\xd0\x44\x80\x26\x86\x80\x26\x46\x83\x26\x66\x83\x26\xe6\x83\x26\x96\x80\x26\x9e\x05\x4d\x12\x41\x93\x82\x40\x93\x22\x40\x93\xd2\x40\x93\xf2\x40\x93\x4a\x41\x93\x6a\x40\xb1\x2a\x28\x36\x18\x14\x1b\x09\x8a\x4d\x04\xc5\xe6\x80\x62\x57\x83\x62\xab\x41\x71\x26\x28\x2e\x04\x14\x17\x05\x8a\x4b\x06\xc5\x2d\x04\xc5\xad\x02\xc5\x95\x81\xe2\xea\x41\x93\x83\x40\x93\x87\x81\x26\x2f\x02\x4d\xae\x04\x4d\x69\x09\x9a\x12\x03\x9a\xb2\x0c\x34\xe5\x2c\x28\x3e\x18\x14\x9f\x0c\x8a\x2f\x00\xc5\xd7\x83\x12\xc2\x41\x09\xd9\xa0\x84\x52\xd0\x54\x13\x34\x35\x0a\x34\x35\x17\x34\xb5\x02\x34\x2d\x10\x34\x2d\x06\x34\x6d\x19\x68\x5a\x0d\x28\x31\x14\x94\x98\x09\x4a\x2c\x04\x25\x36\x80\x92\x7a\x80\x92\x16\x80\x92\x4a\x40\xd3\x55\xd0\xf4\x28\xd0\xf4\x45\xa0\xe9\x55\xa0\x19\x41\xa0\x19\x89\xa0\x19\xab\x40\x33\x6a\x41\xc9\xa1\xa0\xe4\x4c\x50\x72\x11\x68\x26\x40\x33\x23\x41\x33\x73\x41\x33\x2b\x41\x29\x7e\x50\x4a\x24\x28\x25\x0d\x94\xb2\x18\x94\x52\x0c\x4a\xa9\x01\xa5\xba\xa0\xd4\x30\x50\x6a\x2c\x28\x75\x21\x28\xb5\x10\x94\x7a\x16\x94\x66\x82\xd2\x08\x94\x16\x03\x4a\xcb\x06\xa5\xad\x02\xa5\x55\x80\xd2\x1a\x40\xb3\x82\x40\xb3\x86\x81\x66\xcd\x07\xcd\x5a\x09\x9a\x55\x0e\x9a\x55\x0f\x4a\xf7\x83\xd2\x23\x41\xe9\x69\xa0\xf4\xc5\xa0\xf4\x62\x50\x7a\x0d\x28\x23\x00\x94\x11\x0e\xca\x48\x06\x65\x2c\x06\x65\x14\x83\x32\x6a\x40\x99\x2e\x28\x33\x0c\x94\x19\x0b\xca\xcc\x01\x65\xae\x06\x65\x56\x83\x66\x9b\xa0\xd9\x61\xa0\xd9\xa3\xfe\x65\x14\x82\x9e\x08\x00\xcd\x09\x07\x65\x2d\x04\xcd\x3d\x0b\x9a\x17\x03\x9a\xb7\x08\x34\xaf\x0e\x34\x3f\x0a\x34\xbf\x10\xf4\x94\x0a\x7a\x2a\x0d\xf4\xd4\x2a\xd0\x53\xb5\xa0\xa7\x83\x41\x4f\xaf\x06\x3d\xe3\x82\x9e\x29\x04\x2d\xc8\x06\x3d\x1b\x04\x7a\xb6\x0c\xf4\x5c\x0e\xe8\xb9\xeb\xa0\xe7\xeb\x40\xd9\xab\x40\x2f\xb8\xa0\x17\x72\x41\x2f\xb6\x04\xbd\x98\x0d\x7a\xc9\x05\xbd\x54\x0c\x7a\x19\xa0\x97\xeb\x40\xaf\xac\x02\xbd\x1a\x0a\x7a\x75\x19\x68\xa1\x0b\x5a\x98\x0b\x7a\x2d\x04\xf4\x5a\x1e\xe8\xf5\x00\xd0\xeb\x69\xa0\x37\x6e\x8f\x22\x50\x6e\x11\xe8\xcd\x64\xd0\x9b\x67\x41\x6f\xc5\x82\xde\x0e\x04\xbd\x5d\x05\x5a\x94\x05\x5a\x54\x09\x7a\xa7\x07\xe8\x5d\x13\xf4\x5e\x39\x68\x71\x19\xe8\xfd\x02\xd0\x92\x20\xd0\x92\x05\xa0\x25\x45\xa0\x0f\x02\x41\x1f\x64\x81\x3e\x58\x09\xfa\xa0\x16\x94\xb7\x18\xf4\x21\x81\x3e\x5c\x05\xfa\x28\x12\xf4\x51\x0d\x68\x69\x16\x68\xd9\x22\xd0\xc7\x2e\xe8\xe3\x1c\xd0\x72\x17\xb4\xbc\x14\xb4\x22\x08\xb4\xa2\x0e\x94\x1f\x0f\xca\xaf\x04\x7d\x92\x05\xfa\x34\x10\xf4\x69\x36\xe8\x33\x3f\xe8\xb3\x62\xd0\xca\x50\xd0\xca\x2a\xd0\x17\x89\xa0\x2f\x87\x81\x56\x05\x80\x56\xe5\x80\xbe\x0a\x07\x7d\x95\x06\xfa\x3a\x18\xf4\xf5\xa2\xa6\x51\x03\xfa\x26\x07\x54\x10\x0a\xfa\xd6\x04\x7d\xd7\x12\xf4\x5d\x3c\xe8\xfb\x2c\xd0\xf7\x67\x41\xab\xaf\x83\x7e\xc8\x03\xad\x09\x01\xad\xc9\x02\xad\xc9\x01\xad\x2d\x01\xad\xad\x03\x15\x96\x82\xd6\x85\x82\xd6\x95\x82\x7e\xcc\x07\xfd\x58\x03\x5a\x9f\x0c\x5a\x7f\x1d\x54\x14\x06\x2a\x5a\x0d\xda\x20\x82\x36\x64\x82\x36\x8a\xa0\x8d\xf1\xa0\x8d\x65\xa0\x9f\x82\x41\x3f\xd5\x80\x8a\x03\x41\xc5\x91\xa0\xe2\x2c\x50\xf1\x4a\x50\x71\x15\x68\x53\x30\x68\x53\x03\x68\xb3\x1f\xb4\x79\x18\x68\xf3\x02\xd0\xe6\x02\xd0\xe6\xb3\xa0\x2d\x01\xa0\x2d\x11\xa0\x2d\x99\xa0\x2d\x2b\x41\x25\x91\xa0\x92\x2c\x50\xc9\x6d\xae\x04\x6d\x55\x41\x5b\xc3\x40\x5b\x93\x41\xdb\x4c\xd0\xb6\x1a\xd0\xf6\x40\xd0\xf6\x48\xd0\xf6\x2c\xd0\xf6\x55\xa0\xed\x55\xa0\xd2\x58\xd0\x8e\x28\xd0\x8e\xf9\xa0\x1d\xab\x40\x3b\xaa\x40\x3b\x03\x40\x3b\x87\x81\x76\x2e\x00\xed\xca\x06\xed\x5a\x09\xda\x55\x09\x2a\x73\x41\x65\x3d\x40\x65\xc9\xa0\xb2\x3c\x50\x59\x29\xa8\xac\x1e\xb4\x3b\x04\xb4\xa7\x25\x68\x4f\x24\x68\x4f\x16\x68\x4f\x3e\x68\x4f\x05\x68\x2f\x40\x7b\x09\xb4\xb7\x0c\x54\x5e\x08\x2a\xaf\x01\xed\x0b\x00\xed\x0b\x07\xed\x4b\x03\xed\xcb\x03\xed\x0f\x07\xed\x4f\x03\xed\x5f\x06\xda\x5f\x06\xda\xdf\x00\x3a\x10\x0c\x3a\x10\x03\x3a\x90\x07\x3a\x50\x06\x3a\xd0\x00\xaa\x08\x07\x55\x24\x83\x2a\xf2\x40\x15\xa5\xa0\x8a\x7a\xd0\xc1\x20\xd0\xc1\x51\xa0\x83\x0b\x41\x07\xf3\x40\x87\x12\x41\x87\x16\x83\x0e\x95\x80\x0e\x5d\x07\x1d\xf6\x83\x0e\x0f\x03\x1d\x9e\x0f\x3a\x9c\x0f\x3a\x5c\x06\x3a\xdc\x00\xaa\x0c\x06\x55\x46\x83\x2a\x73\x40\x95\xc5\xa0\xca\x3a\xd0\x11\x3f\xe8\x48\x14\xe8\x48\x16\xe8\x48\x3e\xe8\x48\x05\xe8\xa8\x08\x3a\xba\x12\x74\x2c\x0a\x74\x6c\x3e\xe8\xd8\x2a\xd0\xb1\x2a\x50\x95\x09\xaa\xea\x01\xaa\x4a\x04\x55\xe5\x82\xaa\x0a\x41\x55\x35\xa0\xe3\xe1\xa0\xe3\x45\xa0\x13\x39\xa0\x13\x85\xa0\x13\x35\xa0\x93\x81\xa0\x93\x91\xa0\x6a\x11\x54\x4d\xa0\xea\x78\x50\xf5\x22\x50\x75\x09\xa8\xba\x16\x74\x2a\x10\x74\x2a\x1c\x74\x2a\x0d\x74\x3a\x18\x74\xba\x01\x74\x26\x04\x74\x26\x1a\x74\x26\x07\x74\xa6\x10\x74\xa6\x06\x74\x36\x00\x74\x76\x25\xe8\x5c\x0c\xe8\x5c\x0d\xe8\x7c\x20\xe8\x7c\x04\xe8\x7c\x26\xe8\xfc\x32\xd0\xf9\x0a\xd0\xcf\x22\xe8\xe7\x02\x50\x4d\x3e\xa8\xa6\x02\x74\x01\xa0\x0b\xa1\xa0\x0b\x69\xa0\x0b\xcb\x40\x17\xca\x41\x17\x01\xba\x18\x02\xba\x18\x03\xba\x98\x03\xba\x58\x00\xba\x58\x05\xba\x64\x82\x2e\x85\x81\x2e\x25\x82\x2e\x2d\x02\x5d\x2a\x01\x5d\xaa\x03\xd5\x66\x83\x2e\x47\x81\x2e\xcf\x07\x5d\x5e\x09\xba\x5c\x09\xba\x22\x82\xae\x10\xe8\x4a\x2c\xe8\xca\x22\xd0\x95\x52\xd0\x95\x06\xd0\xd5\x10\xd0\xd5\x51\xa0\xab\x39\xa0\xab\x85\xa0\xab\x35\xa0\xba\x40\x50\x5d\x04\xa8\x2e\x0b\x54\xb7\x12\x54\x57\x01\xba\x26\x82\xae\x85\x82\xae\xc5\x82\xae\x2d\x04\x5d\xab\x03\xfd\xb2\x0c\xf4\x6b\x26\xe8\x7a\x08\xe8\x7a\x05\xe8\xb7\x3c\xd0\x6f\xc5\xa0\x1b\x04\xba\x91\x07\xba\x51\x06\xba\x51\x0f\xba\x19\x0c\xba\x39\x0a\x74\x73\x01\xe8\x66\x01\xe8\x66\x31\xa8\x3e\x18\x54\x9f\x0b\xaa\xaf\x05\xfd\x9e\x0c\xfa\xbd\x12\xf4\x47\x01\xe8\xcf\x96\xa0\x3f\x73\x41\x0d\x2e\xa8\xa1\x18\xd4\x50\x0e\x6a\xa8\x06\x35\xd4\x81\xfe\xca\x02\xfd\x2d\x82\xfe\x8e\x00\xfd\x9d\x0b\xba\x15\x06\xba\x95\x0c\xba\x55\x00\xba\x55\x0b\x86\x60\x30\xc4\x80\x61\x21\x18\x8a\xc0\x50\x0b\xc6\x05\x82\x71\xc1\x60\x5c\x18\x18\xb7\x08\x8c\xcf\x07\xe3\x57\x83\xf1\x25\x60\x7c\x05\x98\xb0\x08\x4c\xc8\x07\x13\x56\x83\x89\xf9\x60\xe2\xed\x63\x09\x98\x14\x01\x26\x8d\x02\x93\x96\x81\x49\x05\x60\x72\x22\x98\x9c\x05\x26\xe7\x80\x29\x05\x60\x4a\x31\x98\xba\x10\x4c\x8b\x05\xd3\x16\x81\x69\xa5\x60\x5a\x3d\x98\x1e\x04\xa6\x0f\x03\xd3\xe7\x83\xe9\x05\x60\x46\x3c\x98\x19\x02\x66\x56\x82\x59\x79\x60\x76\x14\x98\xd3\x03\xcc\x59\x05\xe6\xc6\x82\xb9\x85\x60\x6e\x29\x98\x2f\x07\xac\x99\x09\xd6\xac\x08\xac\x79\x25\x58\xf3\x1a\xb0\x80\x7c\xb0\x3b\xc2\xc0\xee\xb8\x0e\x76\xe7\x7c\xb0\xbb\x4c\xb0\xbb\x16\x80\x05\x46\x80\xdd\xbd\x18\xec\x9e\x68\xb0\x16\x89\x60\x2d\x16\x83\xb5\x28\x03\x6b\x51\x0f\xd6\x32\x08\xac\xe5\x30\xb0\x7b\x17\x82\xdd\xb7\x00\xac\xd5\x22\xb0\x56\x25\x60\xad\xea\xc1\xfc\xa5\x60\xfe\x7a\xb0\xd6\x8b\xc0\x5a\xe7\x83\xb5\x5e\x0d\xd6\xba\x06\xac\x75\x3d\xd8\xfd\x35\x60\x0f\x2c\x00\x0b\x0a\x01\x0b\x8a\x01\x0b\x5a\x08\x16\x54\x04\xd6\x26\x14\xac\x4d\x38\x58\x9b\xdb\x5c\x06\xd6\xa6\x0a\xac\xed\x2a\xb0\xb6\x45\x60\x0f\x56\x82\x05\x2f\x06\x6b\xd7\x03\xac\x5d\x32\x58\x7b\x3f\x58\xfb\x32\xb0\xf6\x55\x60\xed\x6b\xc1\xda\x37\x80\x75\x30\xc1\x3a\xb4\x04\xeb\x10\x02\xd6\xa1\x07\x58\x48\x18\x58\x48\x24\x58\x48\x34\x58\x48\x09\x58\xc7\x50\xb0\x8e\x45\x60\x9d\x32\xc1\x3a\xd5\x83\x75\x5e\x0c\x16\x1a\x00\x16\xba\x1a\xec\xa1\x85\x60\x5d\xa2\xc0\xba\xc4\x80\x79\x26\x98\x57\x06\x46\x2d\xc1\xa8\x12\x8c\x6a\xc0\x1e\x0e\x07\x7b\xb8\x1e\xec\x91\xd5\x60\x8f\xd4\x82\x85\xad\x02\xeb\x5a\x08\xd6\xad\x0c\xac\x7b\x0f\xb0\xee\x51\x60\xdd\xf3\xc0\xba\xaf\x02\xeb\x5e\x04\xd6\xc3\x0f\xd6\x23\x14\xac\x47\x1d\x58\x4f\x80\xf5\x4c\x04\xeb\x59\x01\xd6\x2b\x06\xac\xb7\x08\xd6\x7b\x21\x58\x78\x0f\xb0\xf0\x22\xb0\x3e\x59\x60\x7d\x7b\x80\xf5\xbd\x0e\xd6\x2f\x08\xac\xdf\x28\xb0\x88\x96\x60\x11\x91\x60\x11\x0d\x60\xfd\x4d\xb0\xfe\x2d\xc1\xfa\x0f\x03\xeb\x1f\x0b\x36\x20\x1c\x6c\x40\x2d\xd8\x80\x06\xb0\x81\xc1\x60\x03\xa3\xc1\x06\x66\x83\x0d\xac\x07\x1b\xe4\x07\x1b\x1c\x0c\x36\xb8\x1c\xec\xd1\xf9\x60\x51\x31\x60\x43\xc2\xc0\x86\x12\xd8\x63\xb1\x60\xc3\xca\xc0\x46\x00\x6c\x44\x05\xd8\xc8\x32\xb0\x51\xe5\x60\x8f\x5f\x07\x1b\xb3\x0a\x6c\x6c\x26\xd8\xd8\x6c\xb0\xb1\x8b\xc0\xc6\x45\x81\x8d\x3b\x0b\x36\x7e\x31\x58\x4c\x34\x58\xcc\x42\xb0\x98\x62\xb0\x89\x2a\xd8\xa4\x68\xb0\xd8\x34\xb0\xb8\x34\xb0\x29\x11\x60\xf1\x35\x60\x53\xd3\xc0\xa6\x5d\x07\x4b\x5c\x0c\x96\x14\x0a\x36\x9d\xc0\xa6\x2f\x02\x9b\x5e\x0f\x36\x23\x1a\x6c\x46\x11\xd8\x4c\x13\x2c\x25\x16\x2c\xa5\x01\x2c\xad\x25\x58\x5a\x31\xd8\xac\x34\xb0\xf4\x61\x60\x19\x99\x60\x19\x95\x60\x99\x21\x60\x99\x8b\xc0\x32\xeb\xc1\x66\xaf\x04\x7b\x22\x1a\x6c\x4e\x10\xd8\x9c\x6a\xb0\x2c\x15\x2c\x8b\xc0\xb2\x6a\xc0\xe6\x66\x82\x3d\x19\x01\x36\xcf\x04\x9b\x57\x06\x36\x3f\x0f\xec\xa9\x30\xb0\xa7\xca\xc1\x9e\x8e\x06\x7b\xba\x06\xec\x99\x44\xb0\x67\x2a\xc1\x16\x2c\x04\x7b\x36\x1a\xec\xb9\x02\xb0\xec\x96\x60\xd9\x11\x60\xd9\xc9\x60\xd9\x67\xc1\x5e\x88\x04\x7b\x21\x1a\xec\x45\x15\xec\xa5\x00\xb0\x97\xae\x83\xe5\x54\x81\xbd\x7c\x16\xec\x95\x68\xb0\x57\xca\xc1\x5e\x8d\x05\x7b\xb5\x1e\x6c\xe1\x4a\xb0\xd7\xe2\xc1\x5e\xab\x00\x7b\x3d\x06\xec\x8d\x51\x60\xb9\xc3\xc0\xde\x8c\x07\x7b\x2b\x0b\xec\xad\x1c\xb0\xb7\x0a\xc1\xde\x3a\x0b\xf6\xf6\x6a\xb0\x45\x99\x60\xef\x84\x82\xbd\x53\x0a\xf6\x6e\x1a\xd8\x7b\x01\x60\xef\xe5\x83\x2d\x0e\x06\x5b\x5c\x0c\xf6\x7e\x3c\xd8\x92\x7c\xb0\x0f\x6a\xc0\x3e\xa8\x07\xcb\x0b\x06\xcb\x1b\x05\x96\x97\x03\x96\x57\x08\x96\x57\x0a\x96\x57\x09\xf6\xa1\x0a\xf6\x21\x81\x7d\x58\x0f\xf6\x51\x11\xd8\x47\x75\x60\x4b\xfd\x60\x4b\x47\x81\x2d\xcd\x01\x5b\x5a\x04\xb6\xb4\x0e\x6c\xd9\x32\xb0\x8f\x47\x81\x7d\x9c\x0d\xf6\x71\x01\xd8\xc7\x67\xc1\x96\x07\x80\x2d\x8f\x04\x5b\x3e\x1f\x6c\xf9\x42\xb0\xe5\x79\x60\xcb\xcb\xc1\x56\x88\x60\x2b\xc2\xc0\x56\x24\x83\xad\xc8\x03\x5b\x51\x0a\xb6\xa2\x01\x2c\x3f\x04\x2c\x3f\x16\x2c\x3f\x17\x2c\xbf\x04\x2c\xff\x3a\xd8\x27\xd1\x60\x9f\x14\x80\x7d\x72\x16\xec\xd3\x00\xb0\x4f\x0b\xc1\x3e\x8b\x01\xfb\x2c\x17\xec\xb3\x52\xb0\x95\x45\x60\x9f\x97\x83\x7d\x31\x0c\xec\x8b\x58\xb0\x2f\x43\xc0\x56\x05\x82\x7d\xa5\x82\x7d\x55\x07\xf6\x75\x29\xd8\x37\x79\x60\x05\x0b\xc0\xbe\x8d\x04\xfb\xb6\x16\xec\xbb\xc5\x60\xdf\xc7\x80\xad\x0e\x00\x5b\xbd\x12\xec\x87\x1e\x60\x6b\x82\xc1\xd6\x84\x81\xad\x89\x04\x5b\x13\x0d\xb6\x26\x07\x6c\x4d\x21\xd8\x9a\x1a\xb0\xb5\x01\x60\x6b\x23\xc0\xd6\x66\x82\xad\xcd\x07\x5b\x5b\x0e\x56\x28\x82\x15\x86\x81\x15\xc6\x83\x15\xe6\x82\x15\x16\x83\x15\xd6\x82\xad\xf3\x83\xad\x1b\x06\xb6\x2e\x1b\x6c\x5d\x21\xd8\xba\x5a\xb0\x1f\x5b\x82\xfd\x38\x0c\xec\xc7\x05\x60\x3f\x96\x80\xad\x17\xc1\xd6\x87\x81\xad\x4f\x04\x5b\x9f\x07\xb6\xbe\x0c\xac\x08\x60\x45\xa1\x60\x45\xf1\x60\x45\x8b\xc0\x8a\xaa\xc0\x36\xb4\x04\xdb\x10\x09\xb6\x21\x13\x6c\x43\x3e\xd8\x86\x72\xb0\x8d\x00\xdb\x18\x02\xb6\x31\x16\x6c\x63\x2e\xd8\xc6\x12\xb0\x8d\xf5\x60\x3f\x85\x80\xfd\x14\x03\xf6\x53\x2e\xd8\x4f\xc5\x60\xc5\x22\x58\x71\x04\x58\x71\x26\x58\xf1\x32\xb0\xe2\x32\xb0\xe2\x06\xb0\x4d\x21\x60\x9b\xa2\xc1\x36\xe5\x80\x6d\x5a\x0d\xb6\xa9\x06\x6c\x73\x20\xd8\xe6\x28\xb0\xcd\x0b\xc0\x36\xaf\x06\xdb\x7c\x16\x6c\x4b\x20\xd8\x96\x48\xb0\x2d\xb9\x60\x5b\xca\xc1\x4a\x00\x56\x12\x0c\x56\x12\x0d\x56\x92\x0d\x56\xb2\x1a\xac\xe4\x2c\xd8\xd6\x00\xb0\xad\xe1\x60\x5b\xd3\xc0\xb6\x2e\x03\xdb\x5a\x06\xb6\xb5\x1e\x6c\x5b\x30\xd8\xb6\x51\x60\xdb\xb2\xc1\xb6\x15\x80\x6d\xab\x06\xdb\x6e\x82\x6d\xef\x01\xb6\x3d\x19\x6c\x7b\x1e\xd8\xf6\x12\xb0\xed\xd7\xc1\x4a\x83\xc0\x4a\x47\x81\x95\x66\x83\x95\x16\x80\x95\x56\x81\xed\x30\xc1\x76\x84\x81\xed\x48\x04\xdb\xb1\x08\x6c\x47\xf5\xff\xfb\xb1\x33\x00\x6c\x67\x38\xd8\xce\x64\xb0\x9d\xe5\x60\xbb\xfc\x60\xbb\x16\x80\xed\xaa\x01\x2b\x0b\x03\x2b\x2b\x06\xdb\x1d\x03\xb6\xbb\x1e\x6c\x4f\x2c\xd8\x9e\xeb\x60\x7b\x23\xc1\xf6\xd6\x82\xed\xcb\x04\xdb\x97\x0d\xb6\x6f\x11\xd8\x7e\x80\xed\x1f\x06\xb6\x7f\x21\xd8\xfe\x32\xb0\x03\x91\x60\x07\x6a\xc0\x2a\x2a\xc0\x0e\x16\x83\x1d\x3a\x0b\x76\xb8\x0c\xac\xf2\x3a\xd8\x91\x32\xb0\x63\x11\x60\x55\x26\x58\x55\x4b\xb0\xaa\x42\xb0\xe3\xa1\x60\xc7\x97\x81\x9d\x08\x00\x3b\x91\x03\x76\x32\x14\xac\x9a\xc0\xaa\x17\x82\x9d\x0a\x07\x3b\x95\x09\x76\xaa\x1c\xec\x74\x3e\xd8\x19\x17\xec\x4c\x09\xd8\xd9\xf9\x60\xe7\x02\xc1\xce\x15\x80\x9d\x0f\x05\x3b\x5f\x0b\xf6\x73\x36\x58\xcd\x7c\xb0\x0b\x99\xff\x8c\xda\x96\x60\x97\x03\xc1\x2e\x27\xfe\xcb\x28\x05\xbb\x12\x0a\x76\x25\x0d\xec\xca\x6a\xb0\x2b\xf5\x60\x57\x63\xc0\xae\x5e\x07\xab\x5b\x06\x76\x8d\xc0\xae\xe5\x82\xfd\x92\x05\xf6\x6b\x00\xd8\xaf\x2b\xc1\xae\x47\x81\x5d\xaf\x03\xfb\xad\x02\xec\x46\x09\xd8\xcd\x68\xb0\x9b\xb5\x60\xf5\x25\x60\xbf\xaf\x04\xfb\xc3\x05\xfb\x23\x11\xec\x8f\x62\x70\xc0\xa6\x79\xd8\x8c\x07\x39\x09\x81\xe0\xe1\xa2\x33\xc6\x01\x7c\x2b\x6e\x0a\xa4\xdb\x57\xd1\x91\xbf\xbf\xf1\x78\xfb\xf3\x2a\x17\xd8\xc4\x1c\x9a\x73\x65\x4d\xcc\x43\xe1\xea\x9a\x58\xc0\x1d\x7c\x50\x13\x8b\x68\xce\x4f\x6e\x62\x09\xcd\xf8\xbc\x26\x96\xe1\xe3\x0f\x34\xb1\x82\xa1\xc2\xf3\x4d\xac\x22\x40\x68\x68\x62\x1d\x69\xe2\xaf\x4d\x6c\xa0\xa5\xf4\x51\x13\x9b\xe8\x24\xdf\xdd\xc4\x16\x3a\xc9\x9f\x36\xb1\x8d\xf6\x4a\x87\x26\x6e\x86\xe6\xca\xd3\x10\xc0\x89\x22\x38\x98\xca\x5b\x4d\x2c\xc2\x54\x96\x35\xb1\x84\x20\xe5\xeb\x46\xd6\x00\xee\xce\xc6\xc8\x6f\x33\x87\xb6\x5c\x7e\x13\xf3\xb0\xb9\xea\x26\x16\xd0\x9e\xab\x6f\x62\x11\x6d\xf9\x6e\x4d\x2c\x21\x88\x7f\xa2\x89\x65\xdc\xcf\x7f\xd3\xc4\x0a\xf2\xf8\x73\x4d\xac\x22\x58\xd8\xdf\xc4\x3a\xaa\x45\x5f\x13\x1b\x08\x93\xe2\x9b\xd8\x44\x8c\xb4\xbe\x89\x2d\xc4\xc8\x91\x4d\x6c\x63\x94\x7c\xb0\x89\x9b\xa1\xad\x32\xfa\x36\xab\xff\xac\xab\xa2\x89\x6f\xaf\xeb\x74\x13\xdf\x5e\x57\xdd\x6d\x36\x1b\x6d\xd4\x3b\x9b\x58\x84\xa9\x06\x35\xb1\x84\x20\xb5\xcb\x6d\x76\xff\xb1\x89\x6e\xe2\xdb\x36\x53\x9b\xf8\xb6\x4d\xe6\x6d\x0e\xf8\xc7\x66\x49\x13\xdf\xb6\x59\xd9\xc4\xb7\x6d\xd6\x20\x02\x49\x98\x86\x24\x64\x22\x09\x4f\x22\x01\xf1\xf0\x23\x1e\x71\xc8\x44\x1c\xfc\x98\x82\x54\xa4\x61\x2e\xd2\x1b\xad\x12\x91\x09\x3f\x3e\x87\x1f\x5d\x10\x8a\x50\x3c\xd2\xf8\xbb\x18\x03\x91\x8a\x54\x4c\x43\x32\x12\xe0\x47\x3f\xa4\x22\x1d\x69\x8d\xff\xe3\x1a\xbd\xa6\x22\x05\x9d\xa0\x37\x5e\xf9\x9f\x7d\x85\xa1\x63\x13\x75\x85\x1f\x63\x90\x80\x14\x0c\xc7\x6c\xc4\x21\x05\x63\x91\x04\x3f\xfa\x22\x15\x71\x48\x6f\x8c\x30\x15\x53\xe1\xc7\x28\xa4\x63\x36\x32\x90\x89\x04\x24\x20\x03\x7e\x04\x37\xfa\xcd\x44\x1a\xba\xa1\x33\x3a\x63\x4e\xa3\x9f\x59\xe8\xd4\x18\xcf\x34\x74\x46\x3b\xf8\x1b\x7d\xde\xf6\x32\x1c\x49\x8d\x3c\xab\xe9\xe8\xc7\x80\xc6\xe3\x34\x20\x22\x69\x5a\x52\x66\xd2\x93\x09\xf1\xfe\xf8\xb8\xcc\x38\xff\x94\xd4\xb4\xb9\xe9\x49\xd3\x12\x33\xfd\x9f\xfb\xbb\x84\x86\x3e\x12\xe2\x1f\x98\x9a\x3a\x2d\x39\xc1\xdf\x2f\x35\x3d\x2d\x35\x3d\x2e\x33\x29\x35\xa5\x93\xde\xef\xdf\xad\xc2\x3a\x76\x09\x0d\xed\xea\x1f\x93\x90\x32\x7c\x76\x5c\xca\xd8\x24\x7f\xdf\xd4\xb8\xf4\x78\x7f\xea\x54\xff\xa8\xf4\xd9\x19\x99\x09\x09\x19\xfe\xe0\xc4\xcc\xcc\xb4\x6e\x9d\x3b\xcf\x49\x48\x99\xd5\x29\x35\x7d\x5a\xe7\x76\xfe\xb8\x94\x78\xff\xf0\xa4\xb8\x94\x59\x49\x71\x29\xfe\x01\x71\x29\xd3\xf0\xdf\x66\x63\x08\x92\x30\x05\xe9\x48\x85\x1f\x91\x48\x40\x12\xf0\x9f\x13\x0d\x49\x9a\x92\x9e\xea\x8f\x4c\x48\x02\x46\x20\x01\xd3\x30\x1b\xc9\x8d\xb9\xc3\x88\x84\x69\xb3\x93\xe3\xd2\xff\x7b\x9f\x1d\xff\x9f\xfc\x76\xfc\x57\xcf\xff\x27\x51\x8d\x46\x02\xd2\x91\xd1\xa4\x0e\x3f\x42\xd1\x09\x5d\xd0\x09\xa1\xe8\x88\xc9\x48\x68\x54\x1f\x46\x27\xa4\x67\x24\xa5\xa6\xf8\x43\x3b\x75\xe9\x14\xda\x71\x72\x42\x66\xdc\x7f\x37\xe9\x7f\x4e\xf9\x5f\x27\x6c\x9c\xaf\x71\xba\x88\xc6\xeb\x49\x8d\x45\x4f\x6a\x14\xca\x6d\x71\x67\x36\x4a\x34\x1e\x09\x98\xd9\x98\x9c\x19\xff\x7f\x61\xfd\xbb\xa4\xff\x43\x2e\xb7\xad\xe6\xc2\xdf\x18\xa0\x1f\xe9\x8d\x89\x4d\x6a\x92\x5f\x7a\xd3\xa3\x93\xd4\xb8\x9c\x29\x8d\xdf\xdc\x5e\xc4\x3f\xe7\xd3\x31\xbb\x51\xf6\x19\x88\x6f\x8c\xf6\x3f\x1e\x8b\x0c\x74\x02\x22\xd2\x53\x93\xe2\xfd\x49\x19\xfe\x38\x7f\x66\x7a\x5c\x7c\xc2\xcc\xb8\xf4\x19\xb7\x45\xd2\xa4\xb0\xdb\x7a\x98\x19\x37\xd7\x3f\x39\xc1\x9f\x9e\x30\x2d\x29\x23\x33\x21\x3d\x21\xde\x9f\x94\xe2\x9f\x92\x90\x9e\x19\x97\x94\xe2\x9f\x3e\x3b\x3d\x29\x23\x3e\x69\xca\x6d\x0d\x66\x74\x02\xfa\x20\xa3\x31\x80\x94\xc6\xa5\xa5\xff\x8f\xcf\x24\xfa\x64\x4c\x49\x48\x89\x4f\x48\xff\x57\x11\xff\xaf\x96\xf5\x5f\xf3\x98\x88\xd9\x8d\xb9\x49\x69\xca\x86\x1f\x19\x8d\x67\x19\x8d\x94\xd0\xb8\xf2\xa9\x8d\xf9\x9e\x8b\x34\x24\x60\x2a\xe2\x1a\x03\xf4\x37\x06\x98\xd1\xd8\x0e\x52\x9a\xf2\x37\xb5\x31\x48\x7f\xe3\x63\xfd\x4f\xf0\xb7\x33\xf8\x4f\x86\xff\xe3\xbe\x8c\x7f\xa9\x49\x42\x63\x8d\xa6\x34\xd6\x32\xb5\x31\x82\x29\x4d\x6d\x6b\x26\x66\x62\x76\xd3\x37\xff\xda\x88\xfe\x3b\x41\xfe\x93\xfd\xc4\xd9\x33\xe3\x52\x92\x32\x32\xfd\x19\x71\x29\x19\xfe\x8c\x84\xf4\xa4\xa9\xfe\xcc\xb9\x69\x09\x53\xe3\xa6\x24\xf8\xe3\x13\x32\x92\xa6\xa5\x24\xc4\xfb\xa7\xa6\xa6\xfb\x67\x67\x24\xa4\xfb\x93\x52\x32\x13\xd2\x6f\x5f\xcb\x68\xac\x51\x42\x72\xc2\x94\xcc\xf4\xd4\x94\xa4\x29\xfe\x29\xa9\x33\x67\xce\x4e\x49\x9a\xf2\x4f\x5b\xc0\xff\xa5\x27\xdd\xfe\xeb\x84\xb8\xff\x52\xa7\x29\x4d\x55\xea\xd4\x14\x7e\x67\xe0\x3f\xba\xc3\x9c\x39\x9d\xe2\x9a\x8a\x35\x25\x35\x3d\xad\xd3\x94\xd4\x99\x9d\xff\xf7\xdd\xfe\x47\x1d\xfe\x3d\xfb\xe9\x8d\x6a\xbc\xed\x73\x26\x92\xff\xef\xa7\xbe\x9d\x94\xa6\x7c\xa4\x67\x74\x4a\xcc\x9c\x99\x0c\x44\x35\x26\x3a\xa1\xb1\xec\xff\x94\x72\xf6\xbf\x28\x30\x13\x89\x8d\x05\xef\x83\xb4\xc6\x22\xfe\x73\xf6\xef\xf7\xdc\x7e\x97\xfc\xd7\xbe\xf0\x4f\x4f\x40\x54\xd2\x94\x84\x94\x8c\x84\x78\xff\xec\x46\xbd\x66\x26\x26\xf8\xfb\xa4\xc5\x4d\x49\x4c\xf0\x37\x5d\x09\xf1\xff\x47\xb3\xe8\xd2\x29\xf4\x7f\xce\xcc\x7f\x4e\xfe\x9f\x2f\x84\xe4\x7f\x0b\x22\x03\x9d\x11\x85\x41\xe8\x87\xfe\x18\x8a\x91\xe8\xdf\xf8\x5a\x6a\x0c\xe2\x5f\x33\xd2\x38\x79\x63\xc3\x4e\xfe\x27\x80\x8c\xce\x51\x83\xfa\xf5\x1f\x3a\xb2\x7f\xc7\xc6\x00\xfe\x0f\x7a\x63\xc2\x4b\xc9\x3b\x96\x8c\x9f\xf4\xf5\xfc\x8c\x8f\xf6\xe1\xbf\x9c\xfd\xaf\xf5\xcd\xc6\x7b\x9e\xf9\x37\x0f\xcf\xfc\x6f\x78\xf8\xff\x7c\x0c\x10\xa4\xb7\xb9\x5c\x48\x50\xa5\x25\x92\x07\x70\xf7\xfd\x73\x14\xca\x31\x95\xfb\x05\xe0\x0d\x59\x16\x54\x91\xe7\xc5\x53\xe0\xaf\xce\x38\xd9\xf0\x27\x16\xe0\xe1\xdb\x5b\xd0\x31\xc3\xc7\x0e\x40\x38\xfc\xb7\x6e\xc9\xad\xfe\x0e\x40\xb6\xf2\x34\x77\x26\xb6\x17\xb7\xf4\xe4\x61\x40\x1c\x2c\xad\x01\xe0\x07\x0f\xfe\x9f\x6d\xf5\x2d\x60\x2a\xfe\x9b\xcf\xa6\x79\x00\x77\xdb\x4a\xc0\xed\xdd\x96\x0c\x05\x2a\x6e\xef\x21\x0d\x98\xb0\x60\xc3\x81\x0b\xdf\xed\xfd\x2e\x02\x70\x07\xee\xc4\x5d\x08\xc4\xdd\xb8\x07\x2d\xd0\x12\xf7\xe2\x3e\xb4\x82\x1f\xad\x71\x3f\x1e\x40\x10\xda\xa0\x2d\x1e\x44\x30\xda\xa1\x3d\x3a\x20\x04\x1d\xd1\x09\x9d\x11\x8a\x87\xd0\x05\x1e\x08\x0c\x0f\xe3\x11\x84\xa1\x2b\xba\xa1\x3b\x7a\xa0\x27\x7a\xa1\x37\xc2\xd1\x07\x7d\xd1\x0f\x11\xe8\x8f\x01\x18\x88\x48\x0c\xc2\x60\x3c\x8a\x28\x0c\xc1\x50\x3c\x86\x61\x18\x8e\x11\x18\x89\x51\x78\x1c\xa3\x31\x06\xd1\x18\x8b\x71\x18\x8f\x18\x4c\xc0\x44\x4c\x42\x2c\xe2\xb0\x0a\x2b\x90\x8d\x17\xb0\x01\xef\xa2\x06\x2f\xe2\x75\xbc\x8a\x0f\xf1\x39\xf2\x39\x01\xaf\x70\x22\x9e\xc7\xdb\x9c\xc4\xc9\x78\x0d\xef\x21\x07\x5b\x70\x02\xd7\xf0\x11\xbe\xc0\x6f\xb8\x8e\x1b\x58\x8e\xaf\xb0\x03\xdb\xf1\x35\x26\x63\x0a\x72\x11\x8f\x5d\x48\x40\x29\x76\x62\x2f\xca\xb0\x1b\x7b\x70\x01\x53\x71\x00\xe5\xd8\x87\x6f\x30\x0d\x75\x78\x13\x87\x50\x81\x83\x48\xc4\x25\x5c\xc6\xcb\x98\x8e\x24\xcc\x68\x6c\x4a\x29\x58\x86\x54\xcc\x42\x5a\x63\xed\x67\x23\x13\x4f\x60\x0e\x2e\x22\x0b\x4f\x62\x2e\xe6\xe1\x29\xcc\x47\x21\x3e\xc6\x33\x78\x1a\x0b\xf0\x2c\x6a\x71\x05\x3f\x72\x0a\xa7\x72\x1a\xa7\x73\x06\x67\xe2\x2f\xfc\xcd\x59\x9c\xcd\x39\x9c\x8b\x5b\x1c\x38\x1f\xd7\x8c\x6b\xce\x71\x5c\x00\x77\x07\x77\x27\x77\x17\x17\xc8\xdd\xcd\xdd\xc3\xb5\xe0\x5a\x72\xf7\x72\xf7\x71\xad\x50\x8f\xdf\x39\x3f\xd7\x9a\xbb\x9f\x7b\x80\x0b\xe2\xda\x70\x6d\xb9\x07\xb9\x60\xae\x1d\xd7\x9e\xeb\xc0\x85\x70\x1d\xb9\x4e\x5c\x67\xfc\x81\xc3\x5c\x28\xf7\x10\xd7\x85\xf3\x38\xe2\x18\xf7\x30\xf7\x08\x17\xc6\x75\xe5\xba\x71\xdd\xb9\x1e\x5c\x4f\xae\x17\x4e\xe3\x0c\xd7\x9b\x0b\xe7\xfa\x70\x7d\xb9\x7e\x5c\x04\xd7\x9f\x1b\xc0\x0d\xe4\x22\xb9\x41\xdc\x60\xee\x51\x2e\x8a\x1b\x82\x02\x7c\xcb\x0d\xe5\x1e\xe3\x86\x71\xc3\xb9\x11\xdc\x48\x6e\x14\xf7\x38\x37\x9a\x1b\x83\x3f\xd1\x80\xb3\x38\xc7\x45\x73\x63\xb9\x71\xdc\x78\x2e\x86\x9b\xc0\x4d\xe4\x26\x71\xb1\x5c\x1c\x37\x99\x9b\xc2\xc5\x73\x09\xdc\x54\x6e\x1a\x97\xc8\x25\x71\xd3\xb9\x19\x5c\x32\x37\x13\xeb\xb9\x14\x2e\x95\x4b\xe3\x66\xe1\x3c\x7e\xe6\xd2\xf1\x29\x97\xc1\x65\x72\xb3\xb9\x27\xb8\x39\x5c\x16\x37\x97\x7b\x92\x9b\xc7\xcd\xe7\x9e\xe2\x9e\xe6\x9e\xe1\x16\x70\xcf\x72\xcf\x71\xcf\x73\xd9\xdc\x0b\xdc\x8b\xdc\x4b\x5c\x0e\x2a\x71\x0a\x47\xb9\x97\xb9\x57\xb8\x57\xb9\x85\x38\x86\x2a\x1c\x47\x35\x8e\xe0\x24\xf7\x1a\xf7\x3a\xf7\x06\x97\xcb\xbd\xc9\xbd\xc5\xbd\xcd\x2d\xe2\xde\xe1\xde\xe5\xde\xe3\x16\x73\xef\x73\x4b\xb8\x0f\xb8\x3c\xee\x43\xee\x23\x6e\x29\xb7\x8c\xfb\x98\x5b\xce\xad\xe0\xf2\xb9\x4f\xb8\x4f\xb9\xcf\xb8\x95\xdc\xe7\xdc\x17\xdc\x97\xdc\x2a\xee\x2b\xee\x6b\xee\x1b\xae\x80\xfb\x96\xfb\x8e\xfb\x9e\x5b\xcd\xfd\xc0\xad\xe1\xd6\x72\x85\xdc\x3a\xee\x47\x6e\x3d\x57\xc4\x6d\xe0\x36\x72\x3f\x71\xc5\xdc\x26\x6e\x33\xb7\x85\x2b\xe1\xb6\x72\xdb\xb8\xed\x5c\x29\xb7\x83\xdb\xc9\xed\xe2\xca\xf0\x01\xb7\x9b\xdb\xc3\xed\xe5\xca\xb9\x7d\xdc\x7e\xee\x00\x57\xc1\x1d\xe4\x0e\x71\x87\xb9\x4a\xee\x08\x77\x94\x3b\xc6\x55\x71\xc7\xb9\x13\xdc\x49\xae\x9a\x3b\xc5\x9d\xe6\xce\x70\x67\xb9\x73\xdc\x79\xee\x67\xae\x86\xbb\xc0\x5d\xe4\x2e\x71\xb5\xdc\x65\xee\x0a\x77\x95\xab\xe3\xae\x71\xbf\x70\xbf\x72\xd7\xb9\xdf\xb8\x1b\xdc\x4d\xae\x9e\xfb\x9d\xfb\x83\xfb\x93\x6b\xe0\xfe\xe2\xfe\xe6\x6e\xf1\xe0\x39\x9e\xe7\x05\x5e\xe4\x25\x5e\xe6\x15\x5e\xe5\x35\x5e\xe7\x0d\xde\xe4\x2d\xde\xe6\x1d\xde\xe5\x7d\x7c\x33\xbe\x39\x1f\xc0\xdf\xc1\xdf\xc9\xdf\xc5\x07\xf2\x77\xf3\xf7\xf0\x2d\xf8\x96\xfc\xbd\xfc\x7d\x7c\x2b\xde\xcf\xb7\xe6\xef\xe7\x1f\xe0\x83\xf8\x36\x7c\x5b\xfe\x41\x3e\x98\x6f\xc7\xb7\xe7\x3b\xf0\x21\x7c\x47\xbe\x13\xdf\x99\x0f\xe5\x1f\xe2\xbb\xf0\x1e\x4f\x3c\xe3\x1f\xe6\x1f\xe1\xc3\xf8\xae\x7c\x37\xbe\x3b\xdf\x83\xef\xc9\xf7\xe2\x7b\xf3\xe1\x7c\x1f\xbe\x2f\xdf\x8f\x8f\xe0\xfb\xf3\x03\xf8\x81\x7c\x24\x3f\x88\x1f\xcc\x3f\xca\x47\xf1\x43\xf8\xa1\xfc\x63\xfc\x30\x7e\x38\x3f\x82\x1f\xc9\x8f\xe2\x1f\xe7\x47\xf3\x63\xf8\x68\x7e\x2c\x3f\x8e\x1f\xcf\xc7\xf0\x13\xf8\x89\xfc\x24\x3e\x96\x8f\xe3\x27\xf3\x53\xf8\x78\x3e\x81\x9f\xca\x4f\xe3\x13\xf9\x24\x7e\x3a\x3f\x83\x4f\xe6\x67\xf2\x29\x7c\x2a\x9f\xc6\xcf\xe2\xd3\xf9\x0c\x3e\x93\x9f\xcd\x3f\xc1\xcf\xe1\xb3\xf8\xb9\xfc\x93\xfc\x3c\x7e\x3e\xff\x14\xff\x34\xff\x0c\xbf\x80\x7f\x96\x7f\x8e\x7f\x9e\xcf\xe6\x5f\xe0\x5f\xe4\x5f\xe2\x73\xf8\x97\xf9\x57\xf8\x57\xf9\x85\xfc\x6b\xfc\xeb\xfc\x1b\x7c\x2e\xff\x26\xff\x16\xff\x36\xbf\x88\x7f\x87\x7f\x97\x7f\x8f\x5f\xcc\xbf\xcf\x2f\xe1\x3f\xe0\xf3\xf8\x0f\xf9\x8f\xf8\xa5\xfc\x32\xfe\x63\x7e\x39\xbf\x82\xcf\xe7\x3f\xe1\x3f\xe5\x3f\xe3\x57\xf2\x9f\xf3\x5f\xf0\x5f\xf2\xab\xf8\xaf\xf8\xaf\xf9\x6f\xf8\x02\xfe\x5b\xfe\x3b\xfe\x7b\x7e\x35\xff\x03\xbf\x86\x5f\xcb\x17\xf2\xeb\xf8\x1f\xf9\xf5\x7c\x11\xbf\x81\xdf\xc8\xff\xc4\x17\xf3\x9b\xf8\xcd\xfc\x16\xbe\x84\xdf\xca\x6f\xe3\xb7\xf3\xa5\xfc\x0e\x7e\x27\xbf\x8b\x2f\xe3\x77\xf3\x7b\xf8\xbd\x7c\x39\xbf\x8f\xdf\xcf\x1f\xe0\x2b\xf8\x83\xfc\x21\xfe\x30\x5f\xc9\x1f\xe1\x8f\xf2\xc7\xf8\x2a\xfe\x38\x7f\x82\x3f\xc9\x57\xf3\xa7\xf8\xd3\xfc\x19\xfe\x2c\x7f\x8e\x3f\xcf\xff\xcc\xd7\xf0\x17\xf8\x8b\xfc\x25\xbe\x96\xbf\xcc\x5f\xe1\xaf\xf2\x75\xfc\x35\xfe\x17\xfe\x57\xfe\x3a\xff\x1b\x7f\x83\xbf\xc9\xd7\xf3\xbf\xf3\x7f\xf0\x7f\xf2\x0d\xfc\x5f\xfc\xdf\xfc\x2d\x01\x02\x27\xf0\x82\x20\x88\x82\x24\xc8\x82\x22\xa8\x82\x26\xe8\x82\x21\x98\x82\x25\xd8\x82\x23\xb8\x82\x4f\x68\x26\x34\x17\x02\x84\x3b\x84\x3b\x85\xbb\x84\x40\xe1\x6e\xe1\x1e\xa1\x85\xd0\x52\xb8\x57\xb8\x4f\x68\x25\xf8\x85\xd6\xc2\xfd\xc2\x03\x42\x90\xd0\x46\x68\x2b\x3c\x28\x04\x0b\xed\x84\xf6\x42\x07\x21\x44\xe8\x28\x74\x12\x3a\x0b\xa1\xc2\x43\x42\x17\xc1\x13\x48\x60\xc2\xc3\xc2\x23\x42\x98\xd0\x55\xe8\x26\x74\x17\x7a\x08\x3d\x85\x5e\x42\x6f\x21\x5c\xe8\x23\xf4\x15\xfa\x09\x11\x42\x7f\x61\x80\x30\x50\x88\x14\x06\x09\x83\x85\x47\x85\x28\x61\x88\x30\x54\x78\x4c\x18\x26\x0c\x17\x46\x08\x23\x85\x51\xc2\xe3\xc2\x68\x61\x8c\x10\x2d\x8c\x15\xc6\x09\xe3\x85\x18\x61\x82\x30\x51\x98\x24\xc4\x0a\x71\xc2\x64\x61\x8a\x10\x2f\x24\x08\x53\x85\x69\xf8\x0e\xdf\x0b\x89\x42\x92\x30\x1d\x6b\xb0\x16\x25\xc2\x0c\xac\xc6\x0f\xd8\x8a\xe7\xb0\x19\x2f\x09\xc9\xf8\x52\x98\x29\xa4\x08\xa9\x42\x9a\x30\x0b\xdb\x84\x74\x21\x43\xc8\xc4\x46\xfc\x24\xcc\x16\x9e\x10\xe6\xa0\x48\xc8\x12\xe6\x0a\x4f\x0a\xf3\x84\xf9\xc2\x53\xc2\xd3\xc2\x33\xc2\x02\xdc\x14\x9e\x15\x9e\x13\x9e\x17\xb2\x85\x17\x84\x17\x85\x97\x84\x1c\xe1\x65\xe1\x15\xe1\x55\x61\xa1\xf0\x9a\xf0\xba\xf0\x86\x90\x2b\xbc\x29\xbc\x25\xbc\x2d\x2c\x12\xde\x11\xde\x15\xde\x13\x16\x0b\xef\x63\x21\x96\x0a\x4b\x84\x0f\x84\x3c\xe1\x43\xe1\x23\x61\xa9\xb0\x4c\xf8\x58\x58\x2e\xac\x10\xf2\x85\x4f\x84\x4f\x85\xcf\x84\x95\xc2\xe7\xc2\x17\xc2\x97\xc2\x2a\xe1\x2b\xe1\x6b\xe1\x1b\xa1\x40\xf8\x56\xf8\x4e\xf8\x5e\x58\x2d\xfc\x20\xac\x11\xd6\x0a\x85\xc2\x3a\xe1\x47\x61\xbd\x50\x24\x6c\x10\x36\x0a\x3f\x09\xc5\xc2\x26\x61\xb3\xb0\x45\x28\x11\xb6\x0a\xdb\x84\xed\x42\xa9\xb0\x43\xd8\x29\xec\x12\xca\x84\xdd\xc2\x1e\x61\xaf\x50\x2e\xec\x13\xf6\x0b\x07\x84\x0a\xe1\xa0\x70\x48\x38\x2c\x54\x0a\x47\x84\xa3\xc2\x31\xa1\x4a\x38\x2e\x9c\x10\x4e\x0a\xd5\xc2\x29\xe1\xb4\x70\x46\x38\x2b\x9c\x13\xce\x0b\x3f\x0b\x35\xc2\x05\xe1\xa2\x70\x49\xa8\x15\x2e\x0b\x57\x84\xab\x42\x9d\x70\x4d\xf8\x45\xf8\x55\xb8\x2e\xfc\x26\xdc\x10\x6e\x0a\xf5\xc2\xef\xc2\x1f\xc2\x9f\x42\x83\xf0\x97\xf0\xb7\x70\x4b\x84\xc8\x89\xbc\x28\x88\xa2\x28\x89\xb2\xa8\x88\xaa\xa8\x89\xba\x68\x88\xa6\x68\x89\xb6\xe8\x88\xae\xe8\x13\x9b\x89\xcd\xc5\x00\xf1\x0e\xf1\x4e\xf1\x2e\x31\x50\xbc\x5b\xbc\x47\x6c\x21\xb6\x14\xef\x15\xef\x13\x5b\x89\x7e\xb1\xb5\x78\xbf\xf8\x80\x18\x24\xb6\x11\xdb\x8a\x0f\x8a\xc1\x62\x3b\xb1\x3d\x16\x8b\x1d\xc4\x10\xac\x14\x3b\x8a\x9d\xc4\xce\x62\xa8\xf8\x10\x96\xe0\x7d\x5c\x15\xbb\x88\x1e\x3e\x11\x09\x6f\x89\x4c\x7c\x58\x7c\x44\x0c\x13\xbb\x8a\xdd\xc4\xee\x62\x0f\xe4\x89\x3d\xc5\x5e\x62\x6f\x31\x5c\xec\x23\xf6\x15\xfb\x89\x11\x62\x7f\x7c\x26\x0e\x10\x07\xe2\x0d\x31\x12\x8b\xf0\x8e\x38\x48\x1c\x2c\x3e\x2a\x46\x89\x43\xc4\xa1\xe2\x63\xe2\x30\x71\xb8\x38\x42\x1c\x29\x8e\x12\x1f\x17\x47\x8b\x63\xc4\x68\x71\xac\x38\x4e\x1c\x2f\xc6\x88\x13\xc4\x89\xe2\x24\x31\x56\x8c\x13\x27\x8b\x53\xc4\x78\x31\x41\x9c\x2a\x4e\x13\x13\xc5\x24\x71\xba\x38\x43\x4c\x16\x67\x8a\x29\x62\xaa\x98\x26\xce\x12\xd3\xc5\x0c\x31\x53\x9c\x2d\x3e\x21\xce\x11\xb3\xc4\xb9\xe2\x93\xe2\x3c\x71\xbe\xf8\x94\xf8\xb4\xf8\x8c\xb8\x40\x7c\x56\x7c\x4e\x7c\x5e\xcc\x16\x5f\x10\x5f\x14\x5f\x12\x73\xc4\x97\xc5\x57\xc4\x57\xc5\x85\xe2\x6b\xe2\xeb\xe2\x1b\x62\xae\xf8\xa6\xf8\x96\xf8\xb6\xb8\x48\x7c\x47\x7c\x57\x7c\x4f\x5c\x2c\xbe\x2f\x2e\x11\x3f\x10\xf3\xc4\x0f\xc5\x8f\xc4\xa5\xe2\x32\xf1\x63\x71\xb9\xb8\x42\xcc\x17\x3f\x11\x3f\x15\x3f\x13\x57\x8a\x9f\x8b\x5f\x88\x5f\x8a\xab\xc4\xaf\xc4\xaf\xc5\x6f\xc4\x02\xf1\x5b\xf1\x3b\xf1\x7b\x71\xb5\xf8\x83\xb8\x46\x5c\x2b\x16\x8a\xeb\xc4\x1f\xc5\xf5\x62\x91\xb8\x41\xdc\x28\xfe\x24\x16\x8b\x9b\xc4\xcd\xe2\x16\xb1\x44\xdc\x2a\x6e\x13\xb7\x8b\xa5\xe2\x0e\x71\xa7\xb8\x4b\x2c\x13\x77\x8b\x7b\xc4\xbd\x62\xb9\xb8\x4f\xdc\x2f\x1e\x10\x2b\xc4\x83\xe2\x21\xf1\xb0\x58\x29\x1e\x11\x8f\x8a\xc7\xc4\x2a\xf1\xb8\x78\x42\x3c\x29\x56\x8b\xa7\xc4\xd3\xe2\x19\xf1\xac\x78\x4e\x3c\x2f\xfe\x2c\xd6\x88\x17\xc4\x8b\xe2\x25\xb1\x56\xbc\x2c\x5e\x11\xaf\x8a\x75\xe2\x35\xf1\x17\xf1\x57\xf1\xba\xf8\x9b\x78\x43\xbc\x29\xd6\x8b\xbf\x8b\x7f\x88\x7f\x8a\x0d\xe2\x5f\xe2\xdf\xe2\x2d\x09\x12\x27\xf1\x92\x20\x89\x92\x24\xc9\x92\x22\xa9\x92\x26\xe9\x92\x21\x99\x92\x25\xd9\x92\x23\xb9\x92\x4f\x6a\x26\x35\x97\x02\xa4\x3b\xa4\x3b\xa5\xbb\xa4\x40\xe9\x6e\xe9\x1e\xa9\x85\xd4\x52\xba\x57\xba\x4f\x6a\x25\xf9\xa5\xd6\xd2\xfd\xd2\x03\x52\x90\xd4\x46\x6a\x2b\x3d\x28\x05\x4b\xed\xa4\xf6\x52\x07\x29\x44\xea\x28\x75\x92\x3a\x4b\xa1\xd2\x43\x52\x17\xc9\x93\x48\x62\xd2\xc3\xd2\x23\x52\x98\xd4\x55\xea\x26\x75\x97\x7a\x48\x3d\xa5\x5e\x52\x6f\x29\x5c\xea\x23\xf5\x95\xfa\x49\x11\x52\x7f\x69\x80\x34\x50\x8a\x94\x06\x49\x83\xa5\x47\xa5\x28\x69\x88\x34\x54\x7a\x4c\x1a\x26\x0d\x97\x46\x48\x23\xa5\x51\xd2\xe3\xd2\x68\x69\x8c\x14\x2d\x8d\x95\xc6\x49\xe3\xa5\x18\x69\x82\x34\x51\x9a\x24\xc5\x4a\x71\xd2\x64\x69\x8a\x14\x2f\x25\x48\x53\xa5\x69\x52\xa2\x94\x84\x75\xd2\x74\x69\x86\x94\x2c\xcd\x94\x52\xa4\x54\x29\x4d\x9a\x25\xa5\x4b\x19\x52\xa6\x34\x5b\x7a\x42\x9a\x23\x65\x49\x73\xa5\x27\xa5\x79\xd2\x7c\xe9\x29\xe9\x69\xe9\x19\x69\x81\xf4\xac\xf4\x9c\xf4\xbc\x94\x2d\xbd\x20\xbd\x28\xbd\x24\xe5\x48\x2f\x4b\xaf\x48\xaf\x4a\x0b\xa5\xd7\xa4\xd7\xa5\x37\xa4\x5c\xe9\x4d\xe9\x2d\xe9\x6d\x69\x91\xf4\x8e\xf4\xae\xf4\x9e\xb4\x58\x7a\x5f\x5a\x22\x7d\x20\xe5\x49\x1f\x4a\x1f\x49\x4b\xa5\x65\xd2\xc7\xd2\x72\x69\x85\x94\x2f\x7d\x22\x7d\x2a\x7d\x26\xad\x94\x3e\x97\xbe\x90\xbe\x94\x56\x49\x5f\x49\x5f\x4b\xdf\x48\x05\xd2\xb7\xd2\x77\xd2\xf7\xd2\x6a\xe9\x07\x69\x8d\xb4\x56\x2a\x94\xd6\x49\x3f\x4a\xeb\xa5\x22\x69\x83\xb4\x51\xfa\x49\x2a\x96\x36\x49\x9b\xa5\x2d\x52\x89\xb4\x55\xda\x26\x6d\x97\x4a\xa5\x1d\xd2\x4e\x69\x97\x54\x26\xed\x96\xf6\x48\x7b\xa5\x72\x69\x9f\xb4\x5f\x3a\x20\x55\x48\x07\xa5\x43\xd2\x61\xa9\x52\x3a\x22\x1d\x95\x8e\x49\x55\xd2\x71\xe9\x84\x74\x52\xaa\x96\x4e\x49\xa7\xa5\x33\xd2\x59\xe9\x9c\x74\x5e\xfa\x59\xaa\x91\x2e\x48\x17\xa5\x4b\x52\xad\x74\x59\xba\x22\x5d\x95\xea\xa4\x6b\xd2\x2f\xd2\xaf\xd2\x75\xe9\x37\xe9\x86\x74\x53\xaa\x97\x7e\x97\xfe\x90\xfe\x94\x1a\xa4\xbf\xa4\xbf\xa5\x5b\x32\x64\x4e\xe6\x65\x41\x16\x65\x49\x96\x65\x45\x56\x65\x4d\xd6\x65\x43\x36\x65\x4b\xb6\x65\x47\x76\x65\x9f\xdc\x4c\x6e\x2e\x07\xc8\x77\xc8\x77\xca\x77\xc9\x81\xf2\xdd\xf2\x3d\x72\x0b\xb9\xa5\x7c\xaf\x7c\x9f\xdc\x4a\xf6\xcb\xad\xe5\xfb\xe5\x07\xe4\x20\xb9\x8d\xdc\x56\x7e\x50\x0e\x96\xdb\xc9\xed\xe5\x0e\x72\x88\xdc\x51\xee\x24\x77\x96\x43\xe5\x87\xe4\x2e\xb2\x27\x93\xcc\xe4\x87\xe5\x47\xe4\x30\xb9\xab\xdc\x4d\xee\x2e\xf7\x90\x7b\xca\xbd\xe4\xde\x72\xb8\xdc\x47\xee\x2b\xf7\x93\x23\xe4\xfe\xf2\x00\x79\xa0\x1c\x29\x0f\x92\x07\xcb\x8f\xca\x51\xf2\x10\x79\xa8\xfc\x98\x3c\x4c\x1e\x2e\x8f\x90\x47\xca\xa3\xe4\xc7\xe5\xd1\xf2\x18\x39\x5a\x1e\x2b\x8f\x93\xc7\xcb\x31\xf2\x04\x79\xa2\x3c\x49\x8e\x95\xe3\xe4\xc9\xf2\x14\x39\x5e\x4e\x90\xa7\xca\xd3\xe4\x44\x39\x49\x9e\x2e\xcf\x90\x93\xe5\x99\x72\x8a\x9c\x2a\xa7\xc9\xb3\xe4\x74\x39\x43\xce\x94\x67\xcb\x4f\xc8\x73\xe4\x2c\x79\xae\xfc\xa4\x3c\x4f\x9e\x2f\x3f\x25\x3f\x2d\x3f\x23\x2f\x90\x9f\x95\x9f\x93\x9f\x97\xb3\xe5\x17\xe4\x17\xe5\x97\xe4\x1c\xf9\x65\xf9\x15\xf9\x55\x79\xa1\xfc\x9a\xfc\xba\xfc\x86\x9c\x2b\xbf\x29\xbf\x25\xbf\x2d\x2f\x92\xdf\x91\xdf\x95\xdf\x93\x17\xcb\xef\xcb\x4b\xe4\x0f\xe4\x3c\xf9\x43\xf9\x23\x79\xa9\xbc\x4c\xfe\x58\x5e\x2e\xaf\x90\xf3\xe5\x4f\xe4\x4f\xe5\xcf\xe4\x95\xf2\xe7\xf2\x17\xf2\x97\xf2\x2a\xf9\x2b\xf9\x6b\xf9\x1b\xb9\x40\xfe\x56\xfe\x4e\xfe\x5e\x5e\x2d\xff\x20\xaf\x91\xd7\xca\x85\xf2\x3a\xf9\x47\x79\xbd\x5c\x24\x6f\x90\x37\xca\x3f\xc9\xc5\xf2\x26\x79\xb3\xbc\x45\x2e\x91\xb7\xca\xdb\xe4\xed\x72\xa9\xbc\x43\xde\x29\xef\x92\xcb\xe4\xdd\xf2\x1e\x79\xaf\x5c\x2e\xef\x93\xf7\xcb\x07\xe4\x0a\xf9\xa0\x7c\x48\x3e\x2c\x57\xca\x47\xe4\xa3\xf2\x31\xb9\x4a\x3e\x2e\x9f\x90\x4f\xca\xd5\xf2\x29\xf9\xb4\x7c\x46\x3e\x2b\x9f\x93\xcf\xcb\x3f\xcb\x35\xf2\x05\xf9\xa2\x7c\x49\xae\x95\x2f\xcb\x57\xe4\xab\x72\x9d\x7c\x4d\xfe\x45\xfe\x55\xbe\x2e\xff\x26\xdf\x90\x6f\xca\xf5\xf2\xef\xf2\x1f\xf2\x9f\x72\x83\xfc\x97\xfc\xb7\x7c\x4b\x81\xc2\x29\xbc\x22\x28\xa2\x22\x29\xb2\xa2\x28\xaa\xa2\x29\xba\x62\x28\xa6\x62\x29\xb6\xe2\x28\xae\xe2\x53\x9a\x29\xcd\x95\x00\xe5\x0e\xe5\x4e\xe5\x2e\x25\x50\xb9\x5b\xb9\x47\x69\xa1\xb4\x54\xee\x55\xee\x53\x5a\x29\x7e\xa5\xb5\x72\xbf\xf2\x80\x12\xa4\xb4\x51\xda\x2a\x0f\x2a\xc1\x4a\x3b\xa5\xbd\xd2\x41\x09\x51\x3a\x2a\x9d\x94\xce\x4a\xa8\xf2\x90\xd2\x45\xf1\x14\x52\x98\xf2\xb0\xf2\x88\x12\xa6\x74\x55\xba\x29\xdd\x95\x1e\x4a\x4f\xa5\x97\xd2\x5b\x09\x57\xfa\x28\x7d\x95\x7e\x4a\x84\xd2\x5f\x19\xa0\x0c\x54\x22\x95\x41\xca\x60\xe5\x51\x25\x4a\x19\xa2\x0c\x55\x1e\x53\x86\x29\xc3\x95\x11\xca\x48\x65\x94\xf2\xb8\x32\x5a\x19\xa3\x44\x2b\x63\x95\x71\xca\x78\x25\x46\x99\xa0\x4c\x54\x26\x29\xb1\x4a\x9c\x32\x59\x99\xa2\xc4\x2b\x09\xca\x54\x65\x9a\x92\xa8\x24\x29\xd3\x95\x19\x4a\xb2\x32\x53\x49\x51\x52\x95\x34\x65\x96\x92\xae\x64\x28\x99\xca\x6c\xe5\x09\x65\x8e\x92\xa5\xcc\x55\x9e\x54\xe6\x29\xf3\x95\xa7\x94\xa7\x95\x67\x94\x05\xca\xb3\xca\x73\xca\xf3\x4a\xb6\xf2\x82\xf2\xa2\xf2\x92\x92\xa3\xbc\xac\xbc\xa2\xbc\xaa\x2c\x54\x5e\x53\x5e\x57\xde\x50\x72\x95\x37\x95\xb7\x94\xb7\x95\x45\xca\x3b\xca\xbb\xca\x7b\xca\x62\xe5\x7d\x65\x89\xf2\x81\x92\xa7\x7c\xa8\x7c\xa4\x2c\x55\x96\x29\x1f\x2b\xcb\x95\x15\x4a\xbe\xf2\x89\xf2\xa9\xf2\x99\xb2\x52\xf9\x5c\xf9\x42\xf9\x52\x59\xa5\x7c\xa5\x7c\xad\x7c\xa3\x14\x28\xdf\x2a\xdf\x29\xdf\x2b\xab\x95\x1f\x94\x35\xca\x5a\xa5\x50\x59\xa7\xfc\xa8\xac\x57\x8a\x94\x0d\xca\x46\xe5\x27\xa5\x58\xd9\xa4\x6c\x56\xb6\x28\x25\xca\x56\x65\x9b\xb2\x5d\x29\x55\x76\x28\x3b\x95\x5d\x4a\x99\xb2\x5b\xd9\xa3\xec\x55\xca\x95\x7d\xca\x7e\xe5\x80\x52\xa1\x1c\x54\x0e\x29\x87\x95\x4a\xe5\x88\x72\x54\x39\xa6\x54\x29\xc7\x95\x13\xca\x49\xa5\x5a\x39\xa5\x9c\x56\xce\x28\x67\x95\x73\xca\x79\xe5\x67\xa5\x46\xb9\xa0\x5c\x54\x2e\x29\xb5\xca\x65\xe5\x8a\x72\x55\xa9\x53\xae\x29\xbf\x28\xbf\x2a\xd7\x95\xdf\x94\x1b\xca\x4d\xa5\x5e\xf9\x5d\xf9\x43\xf9\x53\x69\x50\xfe\x52\xfe\x56\x6e\xa9\x50\x39\x95\x57\x05\x55\x54\x25\x55\x56\x15\x55\x55\x35\x55\x57\x0d\xd5\x54\x2d\xd5\x56\x1d\xd5\x55\x7d\x6a\x33\xb5\xb9\x1a\xa0\xde\xa1\xde\xa9\xde\xa5\x06\xaa\x77\xab\xf7\xa8\x2d\xd4\x96\xea\xbd\xea\x7d\x6a\x2b\xd5\xaf\xb6\x56\xef\x57\x1f\x50\x83\xd4\x36\x6a\x5b\xf5\x41\x35\x58\x6d\xa7\xb6\x57\x3b\xa8\x21\x6a\x47\xb5\x93\xda\x59\x0d\x55\x1f\x52\xbb\xa8\x9e\x4a\x2a\x53\x1f\x56\x1f\x51\xc3\xd4\xae\x6a\x37\xb5\xbb\xda\x43\xed\xa9\xf6\x52\x7b\xab\xe1\x6a\x1f\xb5\xaf\xda\x4f\x8d\x50\xfb\xab\x03\xd4\x81\x6a\xa4\x3a\x48\x1d\xac\x3e\xaa\x46\xa9\x43\xd4\xa1\xea\x63\xea\x30\x75\xb8\x3a\x42\x1d\xa9\x8e\x52\x1f\x57\x47\xab\x63\xd4\x68\x75\xac\x3a\x4e\x1d\xaf\xc6\xa8\x13\xd4\x89\xea\x24\x35\x56\x8d\x53\x27\xab\x53\xd4\x78\x35\x41\x9d\xaa\x4e\x53\x13\xd5\x24\x75\xba\x3a\x43\x4d\x56\x67\xaa\x29\x6a\xaa\x9a\xa6\xce\x52\xd3\xd5\x0c\x35\x53\x9d\xad\x3e\xa1\xce\x51\xb3\xd4\xb9\xea\x93\xea\x3c\x75\xbe\xfa\x94\xfa\xb4\xfa\x8c\xba\x40\x7d\x56\x7d\x4e\x7d\x5e\xcd\x56\x5f\x50\x5f\x54\x5f\x52\x73\xd4\x97\xd5\x57\xd4\x57\xd5\x85\xea\x6b\xea\xeb\xea\x1b\x6a\xae\xfa\xa6\xfa\x96\xfa\xb6\xba\x48\x7d\x47\x7d\x57\x7d\x4f\x5d\xac\xbe\xaf\x2e\x51\x3f\x50\xf3\xd4\x0f\xd5\x8f\xd4\xa5\xea\x32\xf5\x63\x75\xb9\xba\x42\xcd\x57\x3f\x51\x3f\x55\x3f\x53\x57\xaa\x9f\xab\x5f\xa8\x5f\xaa\xab\xd4\xaf\xd4\xaf\xd5\x6f\xd4\x02\xf5\x5b\xf5\x3b\xf5\x7b\x75\xb5\xfa\x83\xba\x46\x5d\xab\x16\xaa\xeb\xd4\x1f\xd5\xf5\x6a\x91\xba\x41\xdd\xa8\xfe\xa4\x16\xab\x9b\xd4\xcd\xea\x16\xb5\x44\xdd\xaa\x6e\x53\xb7\xab\xa5\xea\x0e\x75\xa7\xba\x4b\x2d\x53\x77\xab\x7b\xd4\xbd\x6a\xb9\xba\x4f\xdd\xaf\x1e\x50\x2b\xd4\x83\xea\x21\xf5\xb0\x5a\xa9\x1e\x51\x8f\xaa\xc7\xd4\x2a\xf5\xb8\x7a\x42\x3d\xa9\x56\xab\xa7\xd4\xd3\xea\x19\xf5\xac\x7a\x4e\x3d\xaf\xfe\xac\xd6\xa8\x17\xd4\x8b\xea\x25\xb5\x56\xbd\xac\x5e\x51\xaf\xaa\x75\xea\x35\xf5\x17\xf5\x57\xf5\xba\xfa\x9b\x7a\x43\xbd\xa9\xd6\xab\xbf\xab\x7f\xa8\x7f\xaa\x0d\xea\x5f\xea\xdf\xea\x2d\x0d\x1a\xa7\xf1\x9a\xa0\x89\x9a\xa4\xc9\x9a\xa2\xa9\x9a\xa6\xe9\x9a\xa1\x99\x9a\xa5\xd9\x9a\xa3\xb9\x9a\x4f\x6b\xa6\x35\xd7\x02\xb4\x3b\xb4\x3b\xb5\xbb\xb4\x40\xed\x6e\xed\x1e\xad\x85\xd6\x52\xbb\x57\xbb\x4f\x6b\xa5\xf9\xb5\xd6\xda\xfd\xda\x03\x5a\x90\xd6\x46\x6b\xab\x3d\xa8\x05\x6b\xed\xb4\xf6\x5a\x07\x2d\x44\xeb\xa8\x75\xd2\x3a\x6b\xa1\xda\x43\x5a\x17\xcd\xd3\x48\x63\xda\xc3\xda\x23\x5a\x98\xd6\x55\xeb\xa6\x75\xd7\x7a\x68\x3d\xb5\x5e\x5a\x6f\x2d\x5c\xeb\xa3\xf5\xd5\xfa\x69\x11\x5a\x7f\x6d\x80\x36\x50\x8b\xd4\x06\x69\x83\xb5\x47\xb5\x28\x6d\x88\x36\x54\x7b\x4c\x1b\xa6\x0d\xd7\x46\x68\x23\xb5\x51\xda\xe3\xda\x68\x6d\x8c\x16\xad\x8d\xd5\xc6\x69\xe3\xb5\x18\x6d\x82\x36\x51\x9b\xa4\xc5\x6a\x71\xda\x64\x6d\x8a\x16\xaf\x25\x68\x53\xb5\x69\x5a\xa2\x96\xa4\x4d\xd7\x66\x68\xc9\xda\x4c\x2d\x45\x4b\xd5\xd2\xb4\x59\x5a\xba\x96\xa1\x65\x6a\xb3\xb5\x27\xb4\x39\x5a\x96\x36\x57\x7b\x52\x9b\xa7\xcd\xd7\x9e\xd2\x9e\xd6\x9e\xd1\x16\x68\xcf\x6a\xcf\x69\xcf\x6b\xd9\xda\x0b\xda\x8b\xda\x4b\x5a\x8e\xf6\xb2\xf6\x8a\xf6\xaa\xb6\x50\x7b\x4d\x7b\x5d\x7b\x43\xcb\xd5\xde\xd4\xde\xd2\xde\xd6\x16\x69\xef\x68\xef\x6a\xef\x69\x8b\xb5\xf7\xb5\x25\xda\x07\x5a\x9e\xf6\xa1\xf6\x91\xb6\x54\x5b\xa6\x7d\xac\x2d\xd7\x56\x68\xf9\xda\x27\xda\xa7\xda\x67\xda\x4a\xed\x73\xed\x0b\xed\x4b\x6d\x95\xf6\x95\xf6\xb5\xf6\x8d\x56\xa0\x7d\xab\x7d\xa7\x7d\xaf\xad\xd6\x7e\xd0\xd6\x68\x6b\xb5\x42\x6d\x9d\xf6\xa3\xb6\x5e\x2b\xd2\x36\x68\x1b\xb5\x9f\xb4\x62\x6d\x93\xb6\x59\xdb\xa2\x95\x68\x5b\xb5\x6d\xda\x76\xad\x54\xdb\xa1\xed\xd4\x76\x69\x65\xda\x6e\x6d\x8f\xb6\x57\x2b\xd7\xf6\x69\xfb\xb5\x03\x5a\x85\x76\x50\x3b\xa4\x1d\xd6\x2a\xb5\x23\xda\x51\xed\x98\x56\xa5\x1d\xd7\x4e\x68\x27\xb5\x6a\xed\x94\x76\x5a\x3b\xa3\x9d\xd5\xce\x69\xe7\xb5\x9f\xb5\x1a\xed\x82\x76\x51\xbb\xa4\xd5\x6a\x97\xb5\x2b\xda\x55\xad\x4e\xbb\xa6\xfd\xa2\xfd\xaa\x5d\xd7\x7e\xd3\x6e\x68\x37\xb5\x7a\xed\x77\xed\x0f\xed\x4f\xad\x41\xfb\x4b\xfb\x5b\xbb\xa5\x43\xe7\x74\x5e\x17\x74\x51\x97\x74\x59\x57\x74\x55\xd7\x74\x5d\x37\x74\x53\xb7\x74\x5b\x77\x74\x57\xf7\xe9\xcd\xf4\xe6\x7a\x80\x7e\x87\x7e\xa7\x7e\x97\x1e\xa8\xdf\xad\xdf\xa3\xb7\xd0\x5b\xea\xf7\xea\xf7\xe9\xad\x74\xbf\xde\x5a\xbf\x5f\x7f\x40\x0f\xd2\xdb\xe8\x6d\xf5\x07\xf5\x60\xbd\x9d\xde\x5e\xef\xa0\x87\xe8\x1d\xf5\x4e\x7a\x67\x3d\x54\x7f\x48\xef\xa2\x7b\x3a\xe9\x4c\x7f\x58\x7f\x44\x0f\xd3\xbb\xea\xdd\xf4\xee\x7a\x0f\xbd\xa7\xde\x4b\xef\xad\x87\xeb\x7d\xf4\xbe\x7a\x3f\x3d\x42\xef\xaf\x0f\xd0\x07\xea\x91\xfa\x20\x7d\xb0\xfe\xa8\x1e\xa5\x0f\xd1\x87\xea\x8f\xe9\xc3\xf4\xe1\xfa\x08\x7d\xa4\x3e\x4a\x7f\x5c\x1f\xad\x8f\xd1\xa3\xf5\xb1\xfa\x38\x7d\xbc\x1e\xa3\x4f\xd0\x27\xea\x93\xf4\x58\x3d\x4e\x9f\xac\x4f\xd1\xe3\xf5\x04\x7d\xaa\x3e\x4d\x4f\xd4\x93\xf4\xe9\xfa\x0c\x3d\x59\x9f\xa9\xa7\xe8\xa9\x7a\x9a\x3e\x4b\x4f\xd7\x33\xf4\x4c\x7d\xb6\xfe\x84\x3e\x47\xcf\xd2\xe7\xea\x4f\xea\xf3\xf4\xf9\xfa\x53\xfa\xd3\xfa\x33\xfa\x02\xfd\x59\xfd\x39\xfd\x79\x3d\x5b\x7f\x41\x7f\x51\x7f\x49\xcf\xd1\x5f\xd6\x5f\xd1\x5f\xd5\x17\xea\xaf\xe9\xaf\xeb\x6f\xe8\xb9\xfa\x9b\xfa\x5b\xfa\xdb\xfa\x22\xfd\x1d\xfd\x5d\xfd\x3d\x7d\xb1\xfe\xbe\xbe\x44\xff\x40\xcf\xd3\x3f\xd4\x3f\xd2\x97\xea\xcb\xf4\x8f\xf5\xe5\xfa\x0a\x3d\x5f\xff\x44\xff\x54\xff\x4c\x5f\xa9\x7f\xae\x7f\xa1\x7f\xa9\xaf\xd2\xbf\xd2\xbf\xd6\xbf\xd1\x0b\xf4\x6f\xf5\xef\xf4\xef\xf5\xd5\xfa\x0f\xfa\x1a\x7d\xad\x5e\xa8\xaf\xd3\x7f\xd4\xd7\xeb\x45\xfa\x06\x7d\xa3\xfe\x93\x5e\xac\x6f\xd2\x37\xeb\x5b\xf4\x12\x7d\xab\xbe\x4d\xdf\xae\x97\xea\x3b\xf4\x9d\xfa\x2e\xbd\x4c\xdf\xad\xef\xd1\xf7\xea\xe5\xfa\x3e\x7d\xbf\x7e\x40\xaf\xd0\x0f\xea\x87\xf4\xc3\x7a\xa5\x7e\x44\x3f\xaa\x1f\xd3\xab\xf4\xe3\xfa\x09\xfd\xa4\x5e\xad\x9f\xd2\x4f\xeb\x67\xf4\xb3\xfa\x39\xfd\xbc\xfe\xb3\x5e\xa3\x5f\xd0\x2f\xea\x97\xf4\x5a\xfd\xb2\x7e\x45\xbf\xaa\xd7\xe9\xd7\xf4\x5f\xf4\x5f\xf5\xeb\xfa\x6f\xfa\x0d\xfd\xa6\x5e\xaf\xff\xae\xff\xa1\xff\xa9\x37\xe8\x7f\xe9\x7f\xeb\xb7\x0c\x18\x9c\xc1\x1b\x82\x21\x1a\x92\x21\x1b\x8a\xa1\x1a\x9a\xa1\x1b\x86\x61\x1a\x96\x61\x1b\x8e\xe1\x1a\x3e\xa3\x99\xd1\xdc\x08\x30\xee\x30\xee\x34\xee\x32\x02\x8d\xbb\x8d\x7b\x8c\x16\x46\x4b\xe3\x5e\xe3\x3e\xa3\x95\xe1\x37\x5a\x1b\xf7\x1b\x0f\x18\x41\x46\x1b\xa3\xad\xf1\xa0\x11\x6c\xb4\x33\xda\x1b\x1d\x8c\x10\xa3\xa3\xd1\xc9\xe8\x6c\x84\x1a\x0f\x19\x5d\x0c\xcf\x20\x83\x19\x0f\x1b\x8f\x18\x61\x46\x57\xa3\x9b\xd1\xdd\xe8\x61\xf4\x34\x7a\x19\xbd\x8d\x70\xa3\x8f\xd1\xd7\xe8\x67\x44\x18\xfd\x8d\x01\xc6\x40\x23\xd2\x18\x64\x0c\x36\x1e\x35\xa2\x8c\x21\xc6\x50\xe3\x31\x63\x98\x31\xdc\x18\x61\x8c\x34\x46\x19\x8f\x1b\xa3\x8d\x31\x46\xb4\x31\xd6\x18\x67\x8c\x37\x62\x8c\x09\xc6\x44\x63\x92\x11\x6b\xc4\x19\x93\x8d\x29\x46\xbc\x91\x60\x4c\x35\xa6\x19\x89\x46\x92\x31\xdd\x98\x61\x24\x1b\x33\x8d\x14\x23\xd5\x48\x33\x66\x19\xe9\x46\x86\x91\x69\xcc\x36\x9e\x30\xe6\x18\x59\xc6\x5c\xe3\x49\x63\x9e\x31\xdf\x78\xca\x78\xda\x78\xc6\x58\x60\x3c\x6b\x3c\x67\x3c\x6f\x64\x1b\x2f\x18\x2f\x1a\x2f\x19\x39\xc6\xcb\xc6\x2b\xc6\xab\xc6\x42\xe3\x35\xe3\x75\xe3\x0d\x23\xd7\x78\xd3\x78\xcb\x78\xdb\x58\x64\xbc\x63\xbc\x6b\xbc\x67\x2c\x36\xde\x37\x96\x18\x1f\x18\x79\xc6\x87\xc6\x47\xc6\x52\x63\x99\xf1\xb1\xb1\xdc\x58\x61\xe4\x1b\x9f\x18\x9f\x1a\x9f\x19\x2b\x8d\xcf\x8d\x2f\x8c\x2f\x8d\x55\xc6\x57\xc6\xd7\xc6\x37\x46\x81\xf1\xad\xf1\x9d\xf1\xbd\xb1\xda\xf8\xc1\x58\x63\xac\x35\x0a\x8d\x75\xc6\x8f\xc6\x7a\xa3\xc8\xd8\x60\x6c\x34\x7e\x32\x8a\x8d\x4d\xc6\x66\x63\x8b\x51\x62\x6c\x35\xb6\x19\xdb\x8d\x52\x63\x87\xb1\xd3\xd8\x65\x94\x19\xbb\x8d\x3d\xc6\x5e\xa3\xdc\xd8\x67\xec\x37\x0e\x18\x15\xc6\x41\xe3\x90\x71\xd8\xa8\x34\x8e\x18\x47\x8d\x63\x46\x95\x71\xdc\x38\x61\x9c\x34\xaa\x8d\x53\xc6\x69\xe3\x8c\x71\xd6\x38\x67\x9c\x37\x7e\x36\x6a\x8c\x0b\xc6\x45\xe3\x92\x51\x6b\x5c\x36\xae\x18\x57\x8d\x3a\xe3\x9a\xf1\x8b\xf1\xab\x71\xdd\xf8\xcd\xb8\x61\xdc\x34\xea\x8d\xdf\x8d\x3f\x8c\x3f\x8d\x06\xe3\x2f\xe3\x6f\xe3\x96\x09\x93\x33\x79\x53\x30\x45\x53\x32\x65\x53\x31\x55\x53\x33\x75\xd3\x30\x4d\xd3\x32\x6d\xd3\x31\x5d\xd3\x67\x36\x33\x9b\x9b\x01\xe6\x1d\xe6\x9d\xe6\x5d\x66\xa0\x79\xb7\x79\x8f\xd9\xc2\x6c\x69\xde\x6b\xde\x67\xb6\x32\xfd\x66\x6b\xf3\x7e\xf3\x01\x33\xc8\x6c\x63\xb6\x35\x1f\x34\x83\xcd\x76\x66\x7b\xb3\x83\x19\x62\x76\x34\x3b\x99\x9d\xcd\x50\xf3\x21\xb3\x8b\xe9\x99\x64\x32\xf3\x61\xf3\x11\x33\xcc\xec\x6a\x76\x33\xbb\x9b\x3d\xcc\x9e\x66\x2f\xb3\xb7\x19\x6e\xf6\x31\xfb\x9a\xfd\xcc\x08\xb3\xbf\x39\xc0\x1c\x68\x46\x9a\x83\xcc\xc1\xe6\xa3\x66\x94\x39\xc4\x1c\x6a\x3e\x66\x0e\x33\x87\x9b\x23\xcc\x91\xe6\x28\xf3\x71\x73\xb4\x39\xc6\x8c\x36\xc7\x9a\xe3\xcc\xf1\x66\x8c\x39\xc1\x9c\x68\x4e\x32\x63\xcd\x38\x73\xb2\x39\xc5\x8c\x37\x13\xcc\xa9\xe6\x34\x33\xd1\x4c\x32\xa7\x9b\x33\xcc\x64\x73\xa6\x99\x62\xa6\x9a\x69\xe6\x2c\x33\xdd\xcc\x30\x33\xcd\xd9\xe6\x13\xe6\x1c\x33\xcb\x9c\x6b\x3e\x69\xce\x33\xe7\x9b\x4f\x99\x4f\x9b\xcf\x98\x0b\xcc\x67\xcd\xe7\xcc\xe7\xcd\x6c\xf3\x05\xf3\x45\xf3\x25\x33\xc7\x7c\xd9\x7c\xc5\x7c\xd5\x5c\x68\xbe\x66\xbe\x6e\xbe\x61\xe6\x9a\x6f\x9a\x6f\x99\x6f\x9b\x8b\xcc\x77\xcc\x77\xcd\xf7\xcc\xc5\xe6\xfb\xe6\x12\xf3\x03\x33\xcf\xfc\xd0\xfc\xc8\x5c\x6a\x2e\x33\x3f\x36\x97\x9b\x2b\xcc\x7c\xf3\x13\xf3\x53\xf3\x33\x73\xa5\xf9\xb9\xf9\x85\xf9\xa5\xb9\xca\xfc\xca\xfc\xda\xfc\xc6\x2c\x30\xbf\x35\xbf\x33\xbf\x37\x57\x9b\x3f\x98\x6b\xcc\xb5\x66\xa1\xb9\xce\xfc\xd1\x5c\x6f\x16\x99\x1b\xcc\x8d\xe6\x4f\x66\xb1\xb9\xc9\xdc\x6c\x6e\x31\x4b\xcc\xad\xe6\x36\x73\xbb\x59\x6a\xee\x30\x77\x9a\xbb\xcc\x32\x73\xb7\xb9\xc7\xdc\x6b\x96\x9b\xfb\xcc\xfd\xe6\x01\xb3\xc2\x3c\x68\x1e\x32\x0f\x9b\x95\xe6\x11\xf3\xa8\x79\xcc\xac\x32\x8f\x9b\x27\xcc\x93\x66\xb5\x79\xca\x3c\x6d\x9e\x31\xcf\x9a\xe7\xcc\xf3\xe6\xcf\x66\x8d\x79\xc1\xbc\x68\x5e\x32\x6b\xcd\xcb\xe6\x15\xf3\xaa\x59\x67\x5e\x33\x7f\x31\x7f\x35\xaf\x9b\xbf\x99\x37\xcc\x9b\x66\xbd\xf9\xbb\xf9\x87\xf9\xa7\xd9\x60\xfe\x65\xfe\x6d\xde\xb2\x60\x71\x16\x6f\x09\x96\x68\x49\x96\x6c\x29\x96\x6a\x69\x96\x6e\x19\x96\x69\x59\x96\x6d\x39\x96\x6b\xf9\xac\x66\x56\x73\x2b\xc0\xba\xc3\xba\xd3\xba\xcb\x0a\xb4\xee\xb6\xee\xb1\x5a\x58\x2d\xad\x7b\xad\xfb\xac\x56\x96\xdf\x6a\x6d\xdd\x6f\x3d\x60\x05\x59\x6d\xac\xb6\xd6\x83\x56\xb0\xd5\xce\x6a\x6f\x75\xb0\x42\xac\x8e\x56\x27\xab\xb3\x15\x6a\x3d\x64\x75\xb1\x3c\x8b\x2c\x66\x3d\x6c\x3d\x62\x85\x59\x5d\xad\x6e\x56\x77\xab\x87\xd5\xd3\xea\x65\xf5\xb6\xc2\xad\x3e\x56\x5f\xab\x9f\x15\x61\xf5\xb7\x06\x58\x03\xad\x48\x6b\x90\x35\xd8\x7a\xd4\x8a\xb2\x86\x58\x43\xad\xc7\xac\x61\xd6\x70\x6b\x84\x35\xd2\x1a\x65\x3d\x6e\x8d\xb6\xc6\x58\xd1\xd6\x58\x6b\x9c\x35\xde\x8a\xb1\x26\x58\x13\xad\x49\x56\xac\x15\x67\x4d\xb6\xa6\x58\xf1\x56\x82\x35\xd5\x9a\x66\x25\x5a\x49\xd6\x74\x6b\x86\x95\x6c\xcd\xb4\x52\xac\x54\x2b\xcd\x9a\x65\xa5\x5b\x19\x56\xa6\x35\xdb\x7a\xc2\x9a\x63\x65\x59\x73\xad\x27\xad\x79\xd6\x7c\xeb\x29\xeb\x69\xeb\x19\x6b\x81\xf5\xac\xf5\x9c\xf5\xbc\x95\x6d\xbd\x60\xbd\x68\xbd\x64\xe5\x58\x2f\x5b\xaf\x58\xaf\x5a\x0b\xad\xd7\xac\xd7\xad\x37\xac\x5c\xeb\x4d\xeb\x2d\xeb\x6d\x6b\x91\xf5\x8e\xf5\xae\xf5\x9e\xb5\xd8\x7a\xdf\x5a\x62\x7d\x60\xe5\x59\x1f\x5a\x1f\x59\x4b\xad\x65\xd6\xc7\xd6\x72\x6b\x85\x95\x6f\x7d\x62\x7d\x6a\x7d\x66\xad\xb4\x3e\xb7\xbe\xb0\xbe\xb4\x56\x59\x5f\x59\x5f\x5b\xdf\x58\x05\xd6\xb7\xd6\x77\xd6\xf7\xd6\x6a\xeb\x07\x6b\x8d\xb5\xd6\x2a\xb4\xd6\x59\x3f\x5a\xeb\xad\x22\x6b\x83\xb5\xd1\xfa\xc9\x2a\xb6\x36\x59\x9b\xad\x2d\x56\x89\xb5\xd5\xda\x66\x6d\xb7\x4a\xad\x1d\xd6\x4e\x6b\x97\x55\x66\xed\xb6\xf6\x58\x7b\xad\x72\x6b\x9f\xb5\xdf\x3a\x60\x55\x58\x07\xad\x43\xd6\x61\xab\xd2\x3a\x62\x1d\xb5\x8e\x59\x55\xd6\x71\xeb\x84\x75\xd2\xaa\xb6\x4e\x59\xa7\xad\x33\xd6\x59\xeb\x9c\x75\xde\xfa\xd9\xaa\xb1\x2e\x58\x17\xad\x4b\x56\xad\x75\xd9\xba\x62\x5d\xb5\xea\xac\x6b\xd6\x2f\xd6\xaf\xd6\x75\xeb\x37\xeb\x86\x75\xd3\xaa\xb7\x7e\xb7\xfe\xb0\xfe\xb4\x1a\xac\xbf\xac\xbf\xad\x5b\x36\x6c\xce\xe6\x6d\xc1\x16\x6d\xc9\x96\x6d\xc5\x56\x6d\xcd\xd6\x6d\xc3\x36\x6d\xcb\xb6\x6d\xc7\x76\x6d\x9f\xdd\xcc\x6e\x6e\x07\xd8\x77\xd8\x77\xda\x77\xd9\x81\xf6\xdd\xf6\x3d\x76\x0b\xbb\xa5\x7d\xaf\x7d\x9f\xdd\xca\xf6\xdb\xad\xed\xfb\xed\x07\xec\x20\xbb\x8d\xdd\xd6\x7e\xd0\x0e\xb6\xdb\xd9\xed\xed\x0e\x76\x88\xdd\xd1\xee\x64\x77\xb6\x43\xed\x87\xec\x2e\xb6\x67\x93\xcd\xec\x87\xed\x47\xec\x30\xbb\xab\xdd\xcd\xee\x6e\xf7\xb0\x7b\xda\xbd\xec\xde\x76\xb8\xdd\xc7\xee\x6b\xf7\xb3\x23\xec\xfe\xf6\x00\x7b\xa0\x1d\x69\x0f\xb2\x07\xdb\x8f\xda\x51\xf6\x10\x7b\xa8\xfd\x98\x3d\xcc\x1e\x6e\x8f\xb0\x47\xda\xa3\xec\xc7\xed\xd1\xf6\x18\x3b\xda\x1e\x6b\x8f\xb3\xc7\xdb\x31\xf6\x04\x7b\xa2\x3d\xc9\x8e\xb5\xe3\xec\xc9\xf6\x14\x3b\xde\x4e\xb0\xa7\xda\xd3\xec\x44\x3b\xc9\x9e\x6e\xcf\xb0\x93\xed\x99\x76\x8a\x9d\x6a\xa7\xd9\xb3\xec\x74\x3b\xc3\xce\xb4\x67\xdb\x4f\xd8\x73\xec\x2c\x7b\xae\xfd\xa4\x3d\xcf\x9e\x6f\x3f\x65\x3f\x6d\x3f\x63\x2f\xb0\x9f\xb5\x9f\xb3\x9f\xb7\xb3\xed\x17\xec\x17\xed\x97\xec\x1c\xfb\x65\xfb\x15\xfb\x55\x7b\xa1\xfd\x9a\xfd\xba\xfd\x86\x9d\x6b\xbf\x69\xbf\x65\xbf\x6d\x2f\xb2\xdf\xb1\xdf\xb5\xdf\xb3\x17\xdb\xef\xdb\x4b\xec\x0f\xec\x3c\xfb\x43\xfb\x23\x7b\xa9\xbd\xcc\xfe\xd8\x5e\x6e\xaf\xb0\xf3\xed\x4f\xec\x4f\xed\xcf\xec\x95\xf6\xe7\xf6\x17\xf6\x97\xf6\x2a\xfb\x2b\xfb\x6b\xfb\x1b\xbb\xc0\xfe\xd6\xfe\xce\xfe\xde\x5e\x6d\xff\x60\xaf\xb1\xd7\xda\x85\xf6\x3a\xfb\x47\x7b\xbd\x5d\x64\x6f\xb0\x37\xda\x3f\xd9\xc5\xf6\x26\x7b\xb3\xbd\xc5\x2e\xb1\xb7\xda\xdb\xec\xed\x76\xa9\xbd\xc3\xde\x69\xef\xb2\xcb\xec\xdd\xf6\x1e\x7b\xaf\x5d\x6e\xef\xb3\xf7\xdb\x07\xec\x0a\xfb\xa0\x7d\xc8\x3e\x6c\x57\xda\x47\xec\xa3\xf6\x31\xbb\xca\x3e\x6e\x9f\xb0\x4f\xda\xd5\xf6\x29\xfb\xb4\x7d\xc6\x3e\x6b\x9f\xb3\xcf\xdb\x3f\xdb\x35\xf6\x05\xfb\xa2\x7d\xc9\xae\xb5\x2f\xdb\x57\xec\xab\x76\x9d\x7d\xcd\xfe\xc5\xfe\xd5\xbe\x6e\xff\x66\xdf\xb0\x6f\xda\xf5\xf6\xef\xf6\x1f\xf6\x9f\x76\x83\xfd\x97\xfd\xb7\x7d\xcb\x81\xc3\x39\xbc\x23\x38\xa2\x23\x39\xb2\xa3\x38\xaa\xa3\x39\xba\x63\x38\xa6\x63\x39\xb6\xe3\x38\xae\xe3\x73\x9a\x39\xcd\x9d\x00\xe7\x0e\xe7\x4e\xe7\x2e\x27\xd0\xb9\xdb\xb9\xc7\x69\xe1\xb4\x74\xee\x75\xee\x73\x5a\x39\x7e\xa7\xb5\x73\xbf\xf3\x80\x13\xe4\xb4\x71\xda\x3a\x0f\x3a\xc1\x4e\x3b\xa7\xbd\xd3\xc1\x09\x71\x3a\x3a\x9d\x9c\xce\x4e\xa8\xf3\x90\xd3\xc5\xf1\x1c\x72\x98\xf3\xb0\xf3\x88\x13\xe6\x74\x75\xba\x39\xdd\x9d\x1e\x4e\x4f\xa7\x97\xd3\xdb\x09\x77\xfa\x38\x7d\x9d\x7e\x4e\x84\xd3\xdf\x19\xe0\x0c\x74\x22\x9d\x41\xce\x60\xe7\x51\x27\xca\x19\xe2\x0c\x75\x1e\x73\x86\x39\xc3\x9d\x11\xce\x48\x67\x94\xf3\xb8\x33\xda\x19\xe3\x44\x3b\x63\x9d\x71\xce\x78\x27\xc6\x99\xe0\x4c\x74\x26\x39\xb1\x4e\x9c\x33\xd9\x99\xe2\xc4\x3b\x09\xce\x54\x67\x9a\x93\xe8\x24\x39\xd3\x9d\x19\x4e\xb2\x33\xd3\x49\x71\x52\x9d\x34\x67\x96\x93\xee\x64\x38\x99\xce\x6c\xe7\x09\x67\x8e\x93\xe5\xcc\x75\x9e\x74\xe6\x39\xf3\x9d\xa7\x9c\xa7\x9d\x67\x9c\x05\xce\xb3\xce\x73\xce\xf3\x4e\xb6\xf3\x82\xf3\xa2\xf3\x92\x93\xe3\xbc\xec\xbc\xe2\xbc\xea\x2c\x74\x5e\x73\x5e\x77\xde\x70\x72\x9d\x37\x9d\xb7\x9c\xb7\x9d\x45\xce\x3b\xce\xbb\xce\x7b\xce\x62\xe7\x7d\x67\x89\xf3\x81\x93\xe7\x7c\xe8\x7c\xe4\x2c\x75\x96\x39\x1f\x3b\xcb\x9d\x15\x4e\xbe\xf3\x89\xf3\xa9\xf3\x99\xb3\xd2\xf9\xdc\xf9\xc2\xf9\xd2\x59\xe5\x7c\xe5\x7c\xed\x7c\xe3\x14\x38\xdf\x3a\xdf\x39\xdf\x3b\xab\x9d\x1f\x9c\x35\xce\x5a\xa7\xd0\x59\xe7\xfc\xe8\xac\x77\x8a\x9c\x0d\xce\x46\xe7\x27\xa7\xd8\xd9\xe4\x6c\x76\xb6\x38\x25\xce\x56\x67\x9b\xb3\xdd\x29\x75\x76\x38\x3b\x9d\x5d\x4e\x99\xb3\xdb\xd9\xe3\xec\x75\xca\x9d\x7d\xce\x7e\xe7\x80\x53\xe1\x1c\x74\x0e\x39\x87\x9d\x4a\xe7\x88\x73\xd4\x39\xe6\x54\x39\xc7\x9d\x13\xce\x49\xa7\xda\x39\xe5\x9c\x76\xce\x38\x67\x9d\x73\xce\x79\xe7\x67\xa7\xc6\xb9\xe0\x5c\x74\x2e\x39\xb5\xce\x65\xe7\x8a\x73\xd5\xa9\x73\xae\x39\xbf\x38\xbf\x3a\xd7\x9d\xdf\x9c\x1b\xce\x4d\xa7\xde\xf9\xdd\xf9\xc3\xf9\xd3\x69\x70\xfe\x72\xfe\x76\x6e\xb9\x70\x39\x97\x77\x05\x57\x74\x25\x57\x76\x15\x57\x75\x35\x57\x77\x0d\xd7\x74\x2d\xd7\x76\x1d\xd7\x75\x7d\x6e\x33\xb7\xb9\x1b\xe0\xde\xe1\xde\xe9\xde\xe5\x06\xba\x77\xbb\xf7\xb8\x2d\xdc\x96\xee\xbd\xee\x7d\x6e\x2b\xd7\xef\xb6\x76\xef\x77\x1f\x70\x83\xdc\x36\x6e\x5b\xf7\x41\x37\xd8\x6d\xe7\xb6\x77\x3b\xb8\x21\x6e\x47\xb7\x93\xdb\xd9\x0d\x75\x1f\x72\xbb\xb8\x9e\x4b\x2e\x73\x1f\x76\x1f\x71\xc3\xdc\xae\x6e\x37\xb7\xbb\xdb\xc3\xed\xe9\xf6\x72\x7b\xbb\xe1\x6e\x1f\xb7\xaf\xdb\xcf\x8d\x70\xfb\xbb\x03\xdc\x81\x6e\xa4\x3b\xc8\x1d\xec\x3e\xea\x46\xb9\x43\xdc\xa1\xee\x63\xee\x30\x77\xb8\x3b\xc2\x1d\xe9\x8e\x72\x1f\x77\x47\xbb\x63\xdc\x68\x77\xac\x3b\xce\x1d\xef\xc6\xb8\x13\xdc\x89\xee\x24\x37\xd6\x8d\x73\x27\xbb\x53\xdc\x78\x37\xc1\x9d\xea\x4e\x73\x13\xdd\x24\x77\xba\x3b\xc3\x4d\x76\x67\xba\x29\x6e\xaa\x9b\xe6\xce\x72\xd3\xdd\x0c\x37\xd3\x9d\xed\x3e\xe1\xce\x71\xb3\xdc\xb9\xee\x93\xee\x3c\x77\xbe\xfb\x94\xfb\xb4\xfb\x8c\xbb\xc0\x7d\xd6\x7d\xce\x7d\xde\xcd\x76\x5f\x70\x5f\x74\x5f\x72\x73\xdc\x97\xdd\x57\xdc\x57\xdd\x85\xee\x6b\xee\xeb\xee\x1b\x6e\xae\xfb\xa6\xfb\x96\xfb\xb6\xbb\xc8\x7d\xc7\x7d\xd7\x7d\xcf\x5d\xec\xbe\xef\x2e\x71\x3f\x70\xf3\xdc\x0f\xdd\x8f\xdc\xa5\xee\x32\xf7\x63\x77\xb9\xbb\xc2\xcd\x77\x3f\x71\x3f\x75\x3f\x73\x57\xba\x9f\xbb\x5f\xb8\x5f\xba\xab\xdc\xaf\xdc\xaf\xdd\x6f\xdc\x02\xf7\x5b\xf7\x3b\xf7\x7b\x77\xb5\xfb\x83\xbb\xc6\x5d\xeb\x16\xba\xeb\xdc\x1f\xdd\xf5\x6e\x91\xbb\xc1\xdd\xe8\xfe\xe4\x16\xbb\x9b\xdc\xcd\xee\x16\xb7\xc4\xdd\xea\x6e\x73\xb7\xbb\xa5\xee\x0e\x77\xa7\xbb\xcb\x2d\x73\x77\xbb\x7b\xdc\xbd\x6e\xb9\xbb\xcf\xdd\xef\x1e\x70\x2b\xdc\x83\xee\x21\xf7\xb0\x5b\xe9\x1e\x71\x8f\xba\xc7\xdc\x2a\xf7\xb8\x7b\xc2\x3d\xe9\x56\xbb\xa7\xdc\xd3\xee\x19\xf7\xac\x7b\xce\x3d\xef\xfe\xec\xd6\xb8\x17\xdc\x8b\xee\x25\xb7\xd6\xbd\xec\x5e\x71\xaf\xba\x75\xee\x35\xf7\x17\xf7\x57\xf7\xba\xfb\x9b\x7b\xc3\xbd\xe9\xd6\xbb\xbf\xbb\x7f\xb8\x7f\xba\x0d\xee\x5f\xee\xdf\xee\x2d\x1f\x7c\x9c\x8f\xf7\x09\x3e\xd1\x27\xf9\x64\x9f\xe2\x53\x7d\x9a\x4f\xf7\x19\x3e\xd3\x67\xf9\x6c\x9f\xe3\x73\x7d\x3e\x5f\x33\x5f\x73\x5f\x80\xef\x0e\xdf\x9d\xbe\xbb\x7c\x81\xbe\xbb\x7d\xf7\xf8\x5a\xf8\x5a\xfa\xee\xf5\xdd\xe7\x6b\xe5\xf3\xfb\x5a\xfb\xee\xf7\x3d\xe0\x0b\xf2\xb5\xf1\xb5\xf5\x3d\xe8\x0b\xf6\xb5\xf3\xb5\xf7\x75\xf0\x85\xf8\x3a\xfa\x3a\xf9\x3a\xfb\x42\x7d\x0f\xf9\xba\xf8\x3c\x1f\xf9\x98\xef\x61\xdf\x23\xbe\x30\x5f\x57\x5f\x37\x5f\x77\x5f\x0f\x5f\x4f\x5f\x2f\x5f\x6f\x5f\xb8\xaf\x8f\xaf\xaf\xaf\x9f\x2f\xc2\xd7\xdf\x37\xc0\x37\xd0\x17\xe9\x1b\xe4\x1b\xec\x7b\xd4\x17\xe5\x1b\xe2\x1b\xea\x7b\xcc\x37\xcc\x37\xdc\x37\xc2\x37\xd2\x37\xca\xf7\xb8\x6f\xb4\x6f\x8c\x2f\xda\x37\xd6\x37\xce\x37\xde\x17\xe3\x9b\xe0\x9b\xe8\x9b\xe4\x8b\xf5\xc5\xf9\x26\xfb\xa6\xf8\xe2\x7d\x09\xbe\xa9\xbe\x69\xbe\x44\x5f\x92\x6f\xba\x6f\x86\x2f\xd9\x37\xd3\x97\xe2\x4b\xf5\xa5\xf9\x66\xfd\xff\x08\x80\x07\x00\x20\x62\x00\x00\x80\xd9\x7a\xdb\xd6\xb6\xcf\xb6\x6d\xdb\xb6\x6d\xdb\xb6\x6d\xdb\xb6\x6d\xdb\xae\xc3\x3a\x62\x9d\xb0\xce\x58\x17\xac\x2b\xd6\x0d\xeb\x8e\xf5\xc0\x7a\x62\xbd\xb0\xde\x58\x1f\xac\x2f\xd6\x0f\xeb\x8f\x0d\xc0\x06\x62\x83\xb0\xc1\xd8\x10\x6c\x28\x36\x0c\x1b\x8e\x8d\xc0\x46\x62\xa3\xb0\xd1\xd8\x18\x6c\x2c\x36\x0e\x1b\x8f\x4d\xc0\x26\x62\x93\xb0\xc9\xd8\x14\x6c\x2a\x36\x0d\x9b\x8e\xcd\xc0\x66\x62\xb3\xb0\xd9\xd8\x1c\x6c\x2e\x36\x0f\x9b\x8f\x2d\xc0\x16\x62\x8b\xb0\xc5\xd8\x12\x6c\x29\xb6\x0c\x5b\x8e\xad\xc0\x56\x62\xab\xb0\xd5\xd8\x1a\x6c\x2d\xb6\x0e\x5b\x8f\x6d\xc0\x36\x62\x9b\xb0\xcd\xd8\x16\x6c\x2b\xb6\x0d\xdb\x8e\xed\xc0\x76\x62\xbb\xb0\xdd\xd8\x1e\x6c\x2f\xb6\x0f\xdb\x8f\x1d\xc0\x0e\x62\x87\xb0\xc3\xd8\x11\xec\x28\x76\x0c\x3b\x8e\x9d\xc0\x4e\x62\xa7\xb0\xd3\xd8\x19\xec\x2c\x76\x0e\x3b\x8f\x5d\xc0\x2e\x62\x97\xb0\xcb\xd8\x15\xec\x2a\x76\x0d\xbb\x8e\xdd\xc0\x6e\x62\xb7\xb0\xdb\xd8\x1d\xec\x2e\x76\x0f\xbb\x8f\x3d\xc0\x1e\x62\x8f\xb0\xc7\xd8\x13\xec\x29\xf6\x0c\x7b\x8e\xbd\xc0\x5e\x62\xaf\xb0\xd7\xd8\x1b\xec\x2d\xf6\x0e\x7b\x8f\x7d\xc0\x3e\x62\x9f\xb0\xcf\xd8\x17\xec\x2b\xf6\x0d\xfb\x8e\xfd\xc0\x7e\x62\xbf\xb0\xdf\xd8\x1f\xec\x2f\xf6\x0f\x4f\x80\x27\xc4\x13\xe1\x89\xf1\x24\x78\x52\x3c\x19\x9e\x1c\x4f\x81\xa7\xc4\x53\xe1\xa9\xf1\x34\x78\x5a\x3c\x1d\x9e\x1e\xcf\x80\x63\x38\x8e\x13\x38\x89\x53\x38\x8d\x33\x38\x8b\x73\x38\x8f\x0b\xb8\x88\x4b\xb8\x8c\x2b\xb8\x8a\x6b\xb8\x8e\x1b\xb8\x89\x5b\xb8\x8d\x3b\xb8\x8b\x7b\xb8\x8f\x07\x78\x88\x47\x38\xc0\x21\x8e\xf0\x18\xcf\x88\x67\xc2\x33\xe3\x59\xf0\xac\x78\x36\x3c\x3b\x9e\x03\xcf\x89\xe7\xc2\x73\xe3\x79\xf0\xbc\x78\x3e\x3c\x3f\x5e\x00\x2f\x88\x17\xc2\x0b\xe3\x45\xf0\xa2\x78\x31\xbc\x38\x5e\x02\x2f\x89\x97\xc2\x4b\xe3\x65\xf0\xb2\x78\x39\xbc\x3c\x5e\x01\xaf\x88\x57\xc2\x2b\xe3\x55\xf0\xaa\x78\x35\xbc\x3a\x5e\x03\xaf\x89\xd7\xc2\x6b\xe3\x75\xf0\xba\x78\x3d\xbc\x3e\xde\x00\x6f\x88\x37\xc2\x1b\xe3\x4d\xf0\xa6\x78\x33\xbc\x39\xde\x02\x6f\x89\xb7\xc2\x5b\xe3\x6d\xf0\xb6\x78\x3b\xbc\x3d\xde\x01\xef\x88\x77\xc2\x3b\xe3\x5d\xf0\xae\x78\x37\xbc\x3b\xde\x03\xef\x89\xf7\xc2\x7b\xe3\x7d\xf0\xbe\x78\x3f\xbc\x3f\x3e\x00\x1f\x88\x0f\xc2\x07\xe3\x43\xf0\xa1\xf8\x30\x7c\x38\x3e\x02\x1f\x89\x8f\xc2\x47\xe3\x63\xf0\xb1\xf8\x38\x7c\x3c\x3e\x01\x9f\x88\x4f\xc2\x27\xe3\x53\xf0\xa9\xf8\x34\x7c\x3a\x3e\x03\x9f\x89\xcf\xc2\x67\xe3\x73\xf0\xb9\xf8\x3c\x7c\x3e\xbe\x00\x5f\x88\x2f\xc2\x17\xe3\x4b\xf0\xa5\xf8\x32\x7c\x39\xbe\x02\x5f\x89\xaf\xc2\x57\xe3\x6b\xf0\xb5\xf8\x3a\x7c\x3d\xbe\x01\xdf\x88\x6f\xc2\x37\xe3\x5b\xf0\xad\xf8\x36\x7c\x3b\xbe\x03\xdf\x89\xef\xc2\x77\xe3\x7b\xf0\xbd\xf8\x3e\x7c\x3f\x7e\x00\x3f\x88\x1f\xc2\x0f\xe3\x47\xf0\xa3\xf8\x31\xfc\x38\x7e\x02\x3f\x89\x9f\xc2\x4f\xe3\x67\xf0\xb3\xf8\x39\xfc\x3c\x7e\x01\xbf\x88\x5f\xc2\x2f\xe3\x57\xf0\xab\xf8\x35\xfc\x3a\x7e\x03\xbf\x89\xdf\xc2\x6f\xe3\x77\xf0\xbb\xf8\x3d\xfc\x3e\xfe\x00\x7f\x88\x3f\xc2\x1f\xe3\x4f\xf0\xa7\xf8\x33\xfc\x39\xfe\x02\x7f\x89\xbf\xc2\x5f\xe3\x6f\xf0\xb7\xf8\x3b\xfc\x3d\xfe\x01\xff\x88\x7f\xc2\x3f\xe3\x5f\xf0\xaf\xf8\x37\xfc\x3b\xfe\x03\xff\x89\xff\xc2\x7f\xe3\x7f\xf0\xbf\xf8\x3f\x22\x01\x91\x90\x48\x44\x24\x26\x92\x10\x49\x89\x64\x44\x72\x22\x05\x91\x92\x48\x45\xa4\x26\xd2\x10\x69\x89\x74\x44\x7a\x22\x03\x81\x11\x38\x41\x10\x24\x41\x11\x34\xc1\x10\x2c\xc1\x11\x3c\x21\x10\x22\x21\x11\x32\xa1\x10\x2a\xa1\x11\x3a\x61\x10\x26\x61\x11\x36\xe1\x10\x2e\xe1\x11\x3e\x11\x10\x21\x11\x11\x80\x80\x04\x22\x62\x22\x23\x91\x89\xc8\x4c\x64\x21\xb2\x12\xd9\x88\xec\x44\x0e\x22\x27\x91\x8b\xc8\x4d\xe4\x21\xf2\x12\xf9\x88\xfc\x44\x01\xa2\x20\x51\x88\x28\x4c\x14\x21\x8a\x12\xc5\x88\xe2\x44\x09\xa2\x24\x51\x8a\x28\x4d\x94\x21\xca\x12\xe5\x88\xf2\x44\x05\xa2\x22\x51\x89\xa8\x4c\x54\x21\xaa\x12\xd5\x88\xea\x44\x0d\xa2\x26\x51\x8b\xa8\x4d\xd4\x21\xea\x12\xf5\x88\xfa\x44\x03\xa2\x21\xd1\x88\x68\x4c\x34\x21\x9a\x12\xcd\x88\xe6\x44\x0b\xa2\x25\xd1\x8a\x68\x4d\xb4\x21\xda\x12\xed\x88\xf6\x44\x07\xa2\x23\xd1\x89\xe8\x4c\x74\x21\xba\x12\xdd\x88\xee\x44\x0f\xa2\x27\xd1\x8b\xe8\x4d\xf4\x21\xfa\x12\xfd\x88\xfe\xc4\x00\x62\x20\x31\x88\x18\x4c\x0c\x21\x86\x12\xc3\x88\xe1\xc4\x08\x62\x24\x31\x8a\x18\x4d\x8c\x21\xc6\x12\xe3\x88\xf1\xc4\x04\x62\x22\x31\x89\x98\x4c\x4c\x21\xa6\x12\xd3\x88\xe9\xc4\x0c\x62\x26\x31\x8b\x98\x4d\xcc\x21\xe6\x12\xf3\x88\xf9\xc4\x02\x62\x21\xb1\x88\x58\x4c\x2c\x21\x96\x12\xcb\x88\xe5\xc4\x0a\x62\x25\xb1\x8a\x58\x4d\xac\x21\xd6\x12\xeb\x88\xf5\xc4\x06\x62\x23\xb1\x89\xd8\x4c\x6c\x21\xb6\x12\xdb\x88\xed\xc4\x0e\x62\x27\xb1\x8b\xd8\x4d\xec\x21\xf6\x12\xfb\x88\xfd\xc4\x01\xe2\x20\x71\x88\x38\x4c\x1c\x21\x8e\x12\xc7\x88\xe3\xc4\x09\xe2\x24\x71\x8a\x38\x4d\x9c\x21\xce\x12\xe7\x88\xf3\xc4\x05\xe2\x22\x71\x89\xb8\x4c\x5c\x21\xae\x12\xd7\x88\xeb\xc4\x0d\xe2\x26\x71\x8b\xb8\x4d\xdc\x21\xee\x12\xf7\x88\xfb\xc4\x03\xe2\x21\xf1\x88\x78\x4c\x3c\x21\x9e\x12\xcf\x88\xe7\xc4\x0b\xe2\x25\xf1\x8a\x78\x4d\xbc\x21\xde\x12\xef\x88\xf7\xc4\x07\xe2\x23\xf1\x89\xf8\x4c\x7c\x21\xbe\x12\xdf\x88\xef\xc4\x0f\xe2\x27\xf1\x8b\xf8\x4d\xfc\x21\xfe\x12\xff\xc8\x04\x64\x42\x32\x11\x99\x98\x4c\x42\x26\x25\x93\x91\xc9\xc9\x14\x64\x4a\x32\x15\x99\x9a\x4c\x43\xa6\x25\xd3\x91\xe9\xc9\x0c\x24\x46\xe2\x24\x41\x92\x24\x45\xd2\x24\x43\xb2\x24\x47\xf2\xa4\x40\x8a\xa4\x44\xca\xa4\x42\xaa\xa4\x46\xea\xa4\x41\x9a\xa4\x45\xda\xa4\x43\xba\xa4\x47\xfa\x64\x40\x86\x64\x44\x02\x12\x92\x88\x8c\xc9\x8c\x64\x26\x32\x33\x99\x85\xcc\x4a\x66\x23\xb3\x93\x39\xc8\x9c\x64\x2e\x32\x37\x99\x87\xcc\x4b\xe6\x23\xf3\x93\x05\xc8\x82\x64\x21\xb2\x30\x59\x84\x2c\x4a\x16\x23\x8b\x93\x25\xc8\x92\x64\x29\xb2\x34\x59\x86\x2c\x4b\x96\x23\xcb\x93\x15\xc8\x8a\x64\x25\xb2\x32\x59\x85\xac\x4a\x56\x23\xab\x93\x35\xc8\x9a\x64\x2d\xb2\x36\x59\x87\xac\x4b\xd6\x23\xeb\x93\x0d\xc8\x86\x64\x23\xb2\x31\xd9\x84\x6c\x4a\x36\x23\x9b\x93\x2d\xc8\x96\x64\x2b\xb2\x35\xd9\x86\x6c\x4b\xb6\x23\xdb\x93\x1d\xc8\x8e\x64\x27\xb2\x33\xd9\x85\xec\x4a\x76\x23\xbb\x93\x3d\xc8\x9e\x64\x2f\xb2\x37\xd9\x87\xec\x4b\xf6\x23\xfb\x93\x03\xc8\x81\xe4\x20\x72\x30\x39\x84\x1c\x4a\x0e\x23\x87\x93\x23\xc8\x91\xe4\x28\x72\x34\x39\x86\x1c\x4b\x8e\x23\xc7\x93\x13\xc8\x89\xe4\x24\x72\x32\x39\x85\x9c\x4a\x4e\x23\xa7\x93\x33\xc8\x99\xe4\x2c\x72\x36\x39\x87\x9c\x4b\xce\x23\xe7\x93\x0b\xc8\x85\xe4\x22\x72\x31\xb9\x84\x5c\x4a\x2e\x23\x97\x93\x2b\xc8\x95\xe4\x2a\x72\x35\xb9\x86\x5c\x4b\xae\x23\xd7\x93\x1b\xc8\x8d\xe4\x26\x72\x33\xb9\x85\xdc\x4a\x6e\x23\xb7\x93\x3b\xc8\x9d\xe4\x2e\x72\x37\xb9\x87\xdc\x4b\xee\x23\xf7\x93\x07\xc8\x83\xe4\x21\xf2\x30\x79\x84\x3c\x4a\x1e\x23\x8f\x93\x27\xc8\x93\xe4\x29\xf2\x34\x79\x86\x3c\x4b\x9e\x23\xcf\x93\x17\xc8\x8b\xe4\x25\xf2\x32\x79\x85\xbc\x4a\x5e\x23\xaf\x93\x37\xc8\x9b\xe4\x2d\xf2\x36\x79\x87\xbc\x4b\xde\x23\xef\x93\x0f\xc8\x87\xe4\x23\xf2\x31\xf9\x84\x7c\x4a\x3e\x23\x9f\x93\x2f\xc8\x97\xe4\x2b\xf2\x35\xf9\x86\x7c\x4b\xbe\x23\xdf\x93\x1f\xc8\x8f\xe4\x27\xf2\x33\xf9\x85\xfc\x4a\x7e\x23\xbf\x93\x3f\xc8\x9f\xe4\x2f\xf2\x37\xf9\x87\xfc\x4b\xfe\xa3\x12\x50\x09\xa9\x44\x54\x62\x2a\x09\x95\x94\x4a\x46\x25\xa7\x52\x50\x29\xa9\x54\x54\x6a\x2a\x0d\x95\x96\x4a\x47\xa5\xa7\x32\x50\x18\x85\x53\x04\x45\x52\x14\x45\x53\x0c\xc5\x52\x1c\xc5\x53\x02\x25\x52\x12\x25\x53\x0a\xa5\x52\x1a\xa5\x53\x06\x65\x52\x16\x65\x53\x0e\xe5\x52\x1e\xe5\x53\x01\x15\x52\x11\x05\x28\x48\x21\x2a\xa6\x32\x52\x99\xa8\xcc\x54\x16\x2a\x2b\x95\x8d\xca\x4e\xe5\xa0\x72\x52\xb9\xa8\xdc\x54\x1e\x2a\x2f\x95\x8f\xca\x4f\x15\xa0\x0a\x52\x85\xa8\xc2\x54\x11\xaa\x28\x55\x8c\x2a\x4e\x95\xa0\x4a\x52\xa5\xa8\xd2\x54\x19\xaa\x2c\x55\x8e\x2a\x4f\x55\xa0\x2a\x52\x95\xa8\xca\x54\x15\xaa\x2a\x55\x8d\xaa\x4e\xd5\xa0\x6a\x52\xb5\xa8\xda\x54\x1d\xaa\x2e\x55\x8f\xaa\x4f\x35\xa0\x1a\x52\x8d\xa8\xc6\x54\x13\xaa\x29\xd5\x8c\x6a\x4e\xb5\xa0\x5a\x52\xad\xa8\xd6\x54\x1b\xaa\x2d\xd5\x8e\x6a\x4f\x75\xa0\x3a\x52\x9d\xa8\xce\x54\x17\xaa\x2b\xd5\x8d\xea\x4e\xf5\xa0\x7a\x52\xbd\xa8\xde\x54\x1f\xaa\x2f\xd5\x8f\xea\x4f\x0d\xa0\x06\x52\x83\xa8\xc1\xd4\x10\x6a\x28\x35\x8c\x1a\x4e\x8d\xa0\x46\x52\xa3\xa8\xd1\xd4\x18\x6a\x2c\x35\x8e\x1a\x4f\x4d\xa0\x26\x52\x93\xa8\xc9\xd4\x14\x6a\x2a\x35\x8d\x9a\x4e\xcd\xa0\x66\x52\xb3\xa8\xd9\xd4\x1c\x6a\x2e\x35\x8f\x9a\x4f\x2d\xa0\x16\x52\x8b\xa8\xc5\xd4\x12\x6a\x29\xb5\x8c\x5a\x4e\xad\xa0\x56\x52\xab\xa8\xd5\xd4\x1a\x6a\x2d\xb5\x8e\x5a\x4f\x6d\xa0\x36\x52\x9b\xa8\xcd\xd4\x16\x6a\x2b\xb5\x8d\xda\x4e\xed\xa0\x76\x52\xbb\xa8\xdd\xd4\x1e\x6a\x2f\xb5\x8f\xda\x4f\x1d\xa0\x0e\x52\x87\xa8\xc3\xd4\x11\xea\x28\x75\x8c\x3a\x4e\x9d\xa0\x4e\x52\xa7\xa8\xd3\xd4\x19\xea\x2c\x75\x8e\x3a\x4f\x5d\xa0\x2e\x52\x97\xa8\xcb\xd4\x15\xea\x2a\x75\x8d\xba\x4e\xdd\xa0\x6e\x52\xb7\xa8\xdb\xd4\x1d\xea\x2e\x75\x8f\xba\x4f\x3d\xa0\x1e\x52\x8f\xa8\xc7\xd4\x13\xea\x29\xf5\x8c\x7a\x4e\xbd\xa0\x5e\x52\xaf\xa8\xd7\xd4\x1b\xea\x2d\xf5\x8e\x7a\x4f\x7d\xa0\x3e\x52\x9f\xa8\xcf\xd4\x17\xea\x2b\xf5\x8d\xfa\x4e\xfd\xa0\x7e\x52\xbf\xa8\xdf\xd4\x1f\xea\x2f\xf5\x8f\x4e\x40\x27\xa4\x13\xd1\x89\xe9\x24\x74\x52\x3a\x19\x9d\x9c\x4e\x41\xa7\xa4\x53\xd1\xa9\xe9\x34\x74\x5a\x3a\x1d\x9d\x9e\xce\x40\x63\x34\x4e\x13\x34\x49\x53\x34\x4d\x33\x34\x4b\x73\x34\x4f\x0b\xb4\x48\x4b\xb4\x4c\x2b\xb4\x4a\x6b\xb4\x4e\x1b\xb4\x49\x5b\xb4\x4d\x3b\xb4\x4b\x7b\xb4\x4f\x07\x74\x48\x47\x34\xa0\x21\x8d\xe8\x98\xce\x48\x67\xa2\x33\xd3\x59\xe8\xac\x74\x36\x3a\x3b\x9d\x83\xce\x49\xe7\xa2\x73\xd3\x79\xe8\xbc\x74\x3e\x3a\x3f\x5d\x80\x2e\x48\x17\xa2\x0b\xd3\x45\xe8\xa2\x74\x31\xba\x38\x5d\x82\x2e\x49\x97\xa2\x4b\xd3\x65\xe8\xb2\x74\x39\xba\x3c\x5d\x81\xae\x48\x57\xa2\x2b\xd3\x55\xe8\xaa\x74\x35\xba\x3a\x5d\x83\xae\x49\xd7\xa2\x6b\xd3\x75\xe8\xba\x74\x3d\xba\x3e\xdd\x80\x6e\x48\x37\xa2\x1b\xd3\x4d\xe8\xa6\x74\x33\xba\x39\xdd\x82\x6e\x49\xb7\xa2\x5b\xd3\x6d\xe8\xb6\x74\x3b\xba\x3d\xdd\x81\xee\x48\x77\xa2\x3b\xd3\x5d\xe8\xae\x74\x37\xba\x3b\xdd\x83\xee\x49\xf7\xa2\x7b\xd3\x7d\xe8\xbe\x74\x3f\xba\x3f\x3d\x80\x1e\x48\x0f\xa2\x07\xd3\x43\xe8\xa1\xf4\x30\x7a\x38\x3d\x82\x1e\x49\x8f\xa2\x47\xd3\x63\xe8\xb1\xf4\x38\x7a\x3c\x3d\x81\x9e\x48\x4f\xa2\x27\xd3\x53\xe8\xa9\xf4\x34\x7a\x3a\x3d\x83\x9e\x49\xcf\xa2\x67\xd3\x73\xe8\xb9\xf4\x3c\x7a\x3e\xbd\x80\x5e\x48\x2f\xa2\x17\xd3\x4b\xe8\xa5\xf4\x32\x7a\x39\xbd\x82\x5e\x49\xaf\xa2\x57\xd3\x6b\xe8\xb5\xf4\x3a\x7a\x3d\xbd\x81\xde\x48\x6f\xa2\x37\xd3\x5b\xe8\xad\xf4\x36\x7a\x3b\xbd\x83\xde\x49\xef\xa2\x77\xd3\x7b\xe8\xbd\xf4\x3e\x7a\x3f\x7d\x80\x3e\x48\x1f\xa2\x0f\xd3\x47\xe8\xa3\xf4\x31\xfa\x38\x7d\x82\x3e\x49\x9f\xa2\x4f\xd3\x67\xe8\xb3\xf4\x39\xfa\x3c\x7d\x81\xbe\x48\x5f\xa2\x2f\xd3\x57\xe8\xab\xf4\x35\xfa\x3a\x7d\x83\xbe\x49\xdf\xa2\x6f\xd3\x77\xe8\xbb\xf4\x3d\xfa\x3e\xfd\x80\x7e\x48\x3f\xa2\x1f\xd3\x4f\xe8\xa7\xf4\x33\xfa\x39\xfd\x82\x7e\x49\xbf\xa2\x5f\xd3\x6f\xe8\xb7\xf4\x3b\xfa\x3d\xfd\x81\xfe\x48\x7f\xa2\x3f\xd3\x5f\xe8\xaf\xf4\x37\xfa\x3b\xfd\x83\xfe\x49\xff\xa2\x7f\xd3\x7f\xe8\xbf\xf4\x3f\x26\x01\x93\x90\x49\xc4\x24\x66\x92\x30\x49\x99\x64\x4c\x72\x26\x05\x93\x92\x49\xc5\xa4\x66\xd2\x30\x69\x99\x74\x4c\x7a\x26\x03\x83\x31\x38\x43\x30\x24\x43\x31\x34\xc3\x30\x2c\xc3\x31\x3c\x23\x30\x22\x23\x31\x32\xa3\x30\x2a\xa3\x31\x3a\x63\x30\x26\x63\x31\x36\xe3\x30\x2e\xe3\x31\x3e\x13\x30\x21\x13\x31\x80\x81\x0c\x62\x62\x26\x23\x93\x89\xc9\xcc\x64\x61\xb2\x32\xd9\x98\xec\x4c\x0e\x26\x27\x93\x8b\xc9\xcd\xe4\x61\xf2\x32\xf9\x98\xfc\x4c\x01\xa6\x20\x53\x88\x29\xcc\x14\x61\x8a\x32\xc5\x98\xe2\x4c\x09\xa6\x24\x53\x8a\x29\xcd\x94\x61\xca\x32\xe5\x98\xf2\x4c\x05\xa6\x22\x53\x89\xa9\xcc\x54\x61\xaa\x32\xd5\x98\xea\x4c\x0d\xa6\x26\x53\x8b\xa9\xcd\xd4\x61\xea\x32\xf5\x98\xfa\x4c\x03\xa6\x21\xd3\x88\x69\xcc\x34\x61\x9a\x32\xcd\x98\xe6\x4c\x0b\xa6\x25\xd3\x8a\x69\xcd\xb4\x61\xda\x32\xed\x98\xf6\x4c\x07\xa6\x23\xd3\x89\xe9\xcc\x74\x61\xba\x32\xdd\x98\xee\x4c\x0f\xa6\x27\xd3\x8b\xe9\xcd\xf4\x61\xfa\x32\xfd\x98\xfe\xcc\x00\x66\x20\x33\x88\x19\xcc\x0c\x61\x86\x32\xc3\x98\xe1\xcc\x08\x66\x24\x33\x8a\x19\xcd\x8c\x61\xc6\x32\xe3\x98\xf1\xcc\x04\x66\x22\x33\x89\x99\xcc\x4c\x61\xa6\x32\xd3\x98\xe9\xcc\x0c\x66\x26\x33\x8b\x99\xcd\xcc\x61\xe6\x32\xf3\x98\xf9\xcc\x02\x66\x21\xb3\x88\x59\xcc\x2c\x61\x96\x32\xcb\x98\xe5\xcc\x0a\x66\x25\xb3\x8a\x59\xcd\xac\x61\xd6\x32\xeb\x98\xf5\xcc\x06\x66\x23\xb3\x89\xd9\xcc\x6c\x61\xb6\x32\xdb\x98\xed\xcc\x0e\x66\x27\xb3\x8b\xd9\xcd\xec\x61\xf6\x32\xfb\x98\xfd\xcc\x01\xe6\x20\x73\x88\x39\xcc\x1c\x61\x8e\x32\xc7\x98\xe3\xcc\x09\xe6\x24\x73\x8a\x39\xcd\x9c\x61\xce\x32\xe7\x98\xf3\xcc\x05\xe6\x22\x73\x89\xb9\xcc\x5c\x61\xae\x32\xd7\x98\xeb\xcc\x0d\xe6\x26\x73\x8b\xb9\xcd\xdc\x61\xee\x32\xf7\x98\xfb\xcc\x03\xe6\x21\xf3\x88\x79\xcc\x3c\x61\x9e\x32\xcf\x98\xe7\xcc\x0b\xe6\x25\xf3\x8a\x79\xcd\xbc\x61\xde\x32\xef\x98\xf7\xcc\x07\xe6\x23\xf3\x89\xf9\xcc\x7c\x61\xbe\x32\xdf\x98\xef\xcc\x0f\xe6\x27\xf3\x8b\xf9\xcd\xfc\x61\xfe\x32\xff\xd8\x04\x6c\x42\x36\x11\x9b\x98\x4d\xc2\x26\x65\x93\xb1\xc9\xd9\x14\x6c\x4a\x36\x15\x9b\x9a\x4d\xc3\xa6\x65\xd3\xb1\xe9\xd9\x0c\x2c\xc6\xe2\x2c\xc1\x92\x2c\xc5\xd2\x2c\xc3\xb2\x2c\xc7\xf2\xac\xc0\x8a\xac\xc4\xca\xac\xc2\xaa\xac\xc6\xea\xac\xc1\x9a\xac\xc5\xda\xac\xc3\xba\xac\xc7\xfa\x6c\xc0\x86\x6c\xc4\x02\x16\xb2\x88\x8d\xd9\x8c\x6c\x26\x36\x33\x9b\x85\xcd\xca\x66\x63\xb3\xb3\x39\xd8\x9c\x6c\x2e\x36\x37\x9b\x87\xcd\xcb\xe6\x63\xf3\xb3\x05\xd8\x82\x6c\x21\xb6\x30\x5b\x84\x2d\xca\x16\x63\x8b\xb3\x25\xd8\x92\x6c\x29\xb6\x34\x5b\x86\x2d\xcb\x96\x63\xcb\xb3\x15\xd8\x8a\x6c\x25\xb6\x32\x5b\x85\xad\xca\x56\x63\xab\xb3\x35\xd8\x9a\x6c\x2d\xb6\x36\x5b\x87\xad\xcb\xd6\x63\xeb\xb3\x0d\xd8\x86\x6c\x23\xb6\x31\xdb\x84\x6d\xca\x36\x63\x9b\xb3\x2d\xd8\x96\x6c\x2b\xb6\x35\xdb\x86\x6d\xcb\xb6\x63\xdb\xb3\x1d\xd8\x8e\x6c\x27\xb6\x33\xdb\x85\xed\xca\x76\x63\xbb\xb3\x3d\xd8\x9e\x6c\x2f\xb6\x37\xdb\x87\xed\xcb\xf6\x63\xfb\xb3\x03\xd8\x81\xec\x20\x76\x30\x3b\x84\x1d\xca\x0e\x63\x87\xb3\x23\xd8\x91\xec\x28\x76\x34\x3b\x86\x1d\xcb\x8e\x63\xc7\xb3\x13\xd8\x89\xec\x24\x76\x32\x3b\x85\x9d\xca\x4e\x63\xa7\xb3\x33\xd8\x99\xec\x2c\x76\x36\x3b\x87\x9d\xcb\xce\x63\xe7\xb3\x0b\xd8\x85\xec\x22\x76\x31\xbb\x84\x5d\xca\x2e\x63\x97\xb3\x2b\xd8\x95\xec\x2a\x76\x35\xbb\x86\x5d\xcb\xae\x63\xd7\xb3\x1b\xd8\x8d\xec\x26\x76\x33\xbb\x85\xdd\xca\x6e\x63\xb7\xb3\x3b\xd8\x9d\xec\x2e\x76\x37\xbb\x87\xdd\xcb\xee\x63\xf7\xb3\x07\xd8\x83\xec\x21\xf6\x30\x7b\x84\x3d\xca\x1e\x63\x8f\xb3\x27\xd8\x93\xec\x29\xf6\x34\x7b\x86\x3d\xcb\x9e\x63\xcf\xb3\x17\xd8\x8b\xec\x25\xf6\x32\x7b\x85\xbd\xca\x5e\x63\xaf\xb3\x37\xd8\x9b\xec\x2d\xf6\x36\x7b\x87\xbd\xcb\xde\x63\xef\xb3\x0f\xd8\x87\xec\x23\xf6\x31\xfb\x84\x7d\xca\x3e\x63\x9f\xb3\x2f\xd8\x97\xec\x2b\xf6\x35\xfb\x86\x7d\xcb\xbe\x63\xdf\xb3\x1f\xd8\x8f\xec\x27\xf6\x33\xfb\x85\xfd\xca\x7e\x63\xbf\xb3\x3f\xd8\x9f\xec\x2f\xf6\x37\xfb\x87\xfd\xcb\xfe\xe3\x12\x70\x09\xb9\x44\x5c\x62\x2e\x09\x97\x94\x4b\xc6\x25\xe7\x52\x70\x29\xb9\x54\x5c\x6a\x2e\x0d\x97\x96\x4b\xc7\xa5\xe7\x32\x70\x18\x87\x73\x04\x47\x72\x14\x47\x73\x0c\xc7\x72\x1c\xc7\x73\x02\x27\x72\x12\x27\x73\x0a\xa7\x72\x1a\xa7\x73\x06\x67\x72\x16\x67\x73\x0e\xe7\x72\x1e\xe7\x73\x01\x17\x72\x11\x07\x38\xc8\x21\x2e\xe6\x32\x72\x99\xb8\xcc\x5c\x16\x2e\x2b\x97\x8d\xcb\xce\xe5\xe0\x72\x72\xb9\xb8\xdc\x5c\x1e\x2e\x2f\x97\x8f\xcb\xcf\x15\xe0\x0a\x72\x85\xb8\xc2\x5c\x11\xae\x28\x57\x8c\x2b\xce\x95\xe0\x4a\x72\xa5\xb8\xd2\x5c\x19\xae\x2c\x57\x8e\x2b\xcf\x55\xe0\x2a\x72\x95\xb8\xca\x5c\x15\xae\x2a\x57\x8d\xab\xce\xd5\xe0\x6a\x72\xb5\xb8\xda\x5c\x1d\xae\x2e\x57\x8f\xab\xcf\x35\xe0\x1a\x72\x8d\xb8\xc6\x5c\x13\xae\x29\xd7\x8c\x6b\xce\xb5\xe0\x5a\x72\xad\xb8\xd6\x5c\x1b\xae\x2d\xd7\x8e\x6b\xcf\x75\xe0\x3a\x72\x9d\xb8\xce\x5c\x17\xae\x2b\xd7\x8d\xeb\xce\xf5\xe0\x7a\x72\xbd\xb8\xde\x5c\x1f\xae\x2f\xd7\x8f\xeb\xcf\x0d\xe0\x06\x72\x83\xb8\xc1\xdc\x10\x6e\x28\x37\x8c\x1b\xce\x8d\xe0\x46\x72\xa3\xb8\xd1\xdc\x18\x6e\x2c\x37\x8e\x1b\xcf\x4d\xe0\x26\x72\x93\xb8\xc9\xdc\x14\x6e\x2a\x37\x8d\x9b\xce\xcd\xe0\x66\x72\xb3\xb8\xd9\xdc\x1c\x6e\x2e\x37\x8f\x9b\xcf\x2d\xe0\x16\x72\x8b\xb8\xc5\xdc\x12\x6e\x29\xb7\x8c\x5b\xce\xad\xe0\x56\x72\xab\xb8\xd5\xdc\x1a\x6e\x2d\xb7\x8e\x5b\xcf\x6d\xe0\x36\x72\x9b\xb8\xcd\xdc\x16\x6e\x2b\xb7\x8d\xdb\xce\xed\xe0\x76\x72\xbb\xb8\xdd\xdc\x1e\x6e\x2f\xb7\x8f\xdb\xcf\x1d\xe0\x0e\x72\x87\xb8\xc3\xdc\x11\xee\x28\x77\x8c\x3b\xce\x9d\xe0\x4e\x72\xa7\xb8\xd3\xdc\x19\xee\x2c\x77\x8e\x3b\xcf\x5d\xe0\x2e\x72\x97\xb8\xcb\xdc\x15\xee\x2a\x77\x8d\xbb\xce\xdd\xe0\x6e\x72\xb7\xb8\xdb\xdc\x1d\xee\x2e\x77\x8f\xbb\xcf\x3d\xe0\x1e\x72\x8f\xb8\xc7\xdc\x13\xee\x29\xf7\x8c\x7b\xce\xbd\xe0\x5e\x72\xaf\xb8\xd7\xdc\x1b\xee\x2d\xf7\x8e\x7b\xcf\x7d\xe0\x3e\x72\x9f\xb8\xcf\xdc\x17\xee\x2b\xf7\x8d\xfb\xce\xfd\xe0\x7e\x72\xbf\xb8\xdf\xdc\x1f\xee\x2f\xf7\x8f\x4f\xc0\x27\xe4\x13\xf1\x89\xf9\x24\x7c\x52\x3e\x19\x9f\x9c\x4f\xc1\xa7\xe4\x53\xf1\xa9\xf9\x34\x7c\x5a\x3e\x1d\x9f\x9e\xcf\xc0\x63\x3c\xce\x13\x3c\xc9\x53\x3c\xcd\x33\x3c\xcb\x73\x3c\xcf\x0b\xbc\xc8\x4b\xbc\xcc\x2b\xbc\xca\x6b\xbc\xce\x1b\xbc\xc9\x5b\xbc\xcd\x3b\xbc\xcb\x7b\xbc\xcf\x07\x7c\xc8\x47\x3c\xe0\x21\x8f\xf8\x98\xcf\xc8\x67\xe2\x33\xf3\x59\xf8\xac\x7c\x36\x3e\x3b\x9f\x83\xcf\xc9\xe7\xe2\x73\xf3\x79\xf8\xbc\x7c\x3e\x3e\x3f\x5f\x80\x2f\xc8\x17\xe2\x0b\xf3\x45\xf8\xa2\x7c\x31\xbe\x38\x5f\x82\x2f\xc9\x97\xe2\x4b\xf3\x65\xf8\xb2\x7c\x39\xbe\x3c\x5f\x81\xaf\xc8\x57\xe2\x2b\xf3\x55\xf8\xaa\x7c\x35\xbe\x3a\x5f\x83\xaf\xc9\xd7\xe2\x6b\xf3\x75\xf8\xba\x7c\x3d\xbe\x3e\xdf\x80\x6f\xc8\x37\xe2\x1b\xf3\x4d\xf8\xa6\x7c\x33\xbe\x39\xdf\x82\x6f\xc9\xb7\xe2\x5b\xf3\x6d\xf8\xb6\x7c\x3b\xbe\x3d\xdf\x81\xef\xc8\x77\xe2\x3b\xf3\x5d\xf8\xae\x7c\x37\xbe\x3b\xdf\x83\xef\xc9\xf7\xe2\x7b\xf3\x7d\xf8\xbe\x7c\x3f\xbe\x3f\x3f\x80\x1f\xc8\x0f\xe2\x07\xf3\x43\xf8\xa1\xfc\x30\x7e\x38\x3f\x82\x1f\xc9\x8f\xe2\x47\xf3\x63\xf8\xb1\xfc\x38\x7e\x3c\x3f\x81\x9f\xc8\x4f\xe2\x27\xf3\x53\xf8\xa9\xfc\x34\x7e\x3a\x3f\x83\x9f\xc9\xcf\xe2\x67\xf3\x73\xf8\xb9\xfc\x3c\x7e\x3e\xbf\x80\x5f\xc8\x2f\xe2\x17\xf3\x4b\xf8\xa5\xfc\x32\x7e\x39\xbf\x82\x5f\xc9\xaf\xe2\x57\xf3\x6b\xf8\xb5\xfc\x3a\x7e\x3d\xbf\x81\xdf\xc8\x6f\xe2\x37\xf3\x5b\xf8\xad\xfc\x36\x7e\x3b\xbf\x83\xdf\xc9\xef\xe2\x77\xf3\x7b\xf8\xbd\xfc\x3e\x7e\x3f\x7f\x80\x3f\xc8\x1f\xe2\x0f\xf3\x47\xf8\xa3\xfc\x31\xfe\x38\x7f\x82\x3f\xc9\x9f\xe2\x4f\xf3\x67\xf8\xb3\xfc\x39\xfe\x3c\x7f\x81\xbf\xc8\x5f\xe2\x2f\xf3\x57\xf8\xab\xfc\x35\xfe\x3a\x7f\x83\xbf\xc9\xdf\xe2\x6f\xf3\x77\xf8\xbb\xfc\x3d\xfe\x3e\xff\x80\x7f\xc8\x3f\xe2\x1f\xf3\x4f\xf8\xa7\xfc\x33\xfe\x39\xff\x82\x7f\xc9\xbf\xe2\x5f\xf3\x6f\xf8\xb7\xfc\x3b\xfe\x3d\xff\x81\xff\xc8\x7f\xe2\x3f\xf3\x5f\xf8\xaf\xfc\x37\xfe\x3b\xff\x83\xff\xc9\xff\xe2\x7f\xf3\x7f\xf8\xbf\xfc\x3f\x21\x81\x90\x50\x48\x24\x24\x16\x92\x08\x49\x85\x64\x42\x72\x21\x85\x90\x52\x48\x25\xa4\x16\xd2\x08\x69\x85\x74\x42\x7a\x21\x83\x80\x09\xb8\x40\x08\xa4\x40\x09\xb4\xc0\x08\xac\xc0\x09\xbc\x20\x08\xa2\x20\x09\xb2\xa0\x08\xaa\xa0\x09\xba\x60\x08\xa6\x60\x09\xb6\xe0\x08\xae\xe0\x09\xbe\x10\x08\xa1\x10\x09\x40\x80\x02\x12\x62\x21\xa3\x90\x49\xc8\x2c\x64\x11\xb2\x0a\xd9\x84\xec\x42\x0e\x21\xa7\x90\x4b\xc8\x2d\xe4\x11\xf2\x0a\xf9\x84\xfc\x42\x01\xa1\xa0\x50\x48\x28\x2c\x14\x11\x8a\x0a\xc5\x84\xe2\x42\x09\xa1\xa4\x50\x4a\x28\x2d\x94\x11\xca\x0a\xe5\x84\xf2\x42\x05\xa1\xa2\x50\x49\xa8\x2c\x54\x11\xaa\x0a\xd5\x84\xea\x42\x0d\xa1\xa6\x50\x4b\xa8\x2d\xd4\x11\xea\x0a\xf5\x84\xfa\x42\x03\xa1\xa1\xd0\x48\x68\x2c\x34\x11\x9a\x0a\xcd\x84\xe6\x42\x0b\xa1\xa5\xd0\x4a\x68\x2d\xb4\x11\xda\x0a\xed\x84\xf6\x42\x07\xa1\xa3\xd0\x49\xe8\x2c\x74\x11\xba\x0a\xdd\x84\xee\x42\x0f\xa1\xa7\xd0\x4b\xe8\x2d\xf4\x11\xfa\x0a\xfd\x84\xfe\xc2\x00\x61\xa0\x30\x48\x18\x2c\x0c\x11\x86\x0a\xc3\x84\xe1\xc2\x08\x61\xa4\x30\x4a\x18\x2d\x8c\x11\xc6\x0a\xe3\x84\xf1\xc2\x04\x61\xa2\x30\x49\x98\x2c\x4c\x11\xa6\x0a\xd3\x84\xe9\xc2\x0c\x61\xa6\x30\x4b\x98\x2d\xcc\x11\xe6\x0a\xf3\x84\xf9\xc2\x02\x61\xa1\xb0\x48\x58\x2c\x2c\x11\x96\x0a\xcb\x84\xe5\xc2\x0a\x61\xa5\xb0\x4a\x58\x2d\xac\x11\xd6\x0a\xeb\x84\xf5\xc2\x06\x61\xa3\xb0\x49\xd8\x2c\x6c\x11\xb6\x0a\xdb\x84\xed\xc2\x0e\x61\xa7\xb0\x4b\xd8\x2d\xec\x11\xf6\x0a\xfb\x84\xfd\xc2\x01\xe1\xa0\x70\x48\x38\x2c\x1c\x11\x8e\x0a\xc7\x84\xe3\xc2\x09\xe1\xa4\x70\x4a\x38\x2d\x9c\x11\xce\x0a\xe7\x84\xf3\xc2\x05\xe1\xa2\x70\x49\xb8\x2c\x5c\x11\xae\x0a\xd7\x84\xeb\xc2\x0d\xe1\xa6\x70\x4b\xb8\x2d\xdc\x11\xee\x0a\xf7\x84\xfb\xc2\x03\xe1\xa1\xf0\x48\x78\x2c\x3c\x11\x9e\x0a\xcf\x84\xe7\xc2\x0b\xe1\xa5\xf0\x4a\x78\x2d\xbc\x11\xde\x0a\xef\x84\xf7\xc2\x07\xe1\xa3\xf0\x49\xf8\x2c\x7c\x11\xbe\x0a\xdf\x84\xef\xc2\x0f\xe1\xa7\xf0\x4b\xf8\x2d\xfc\x11\xfe\x0a\xff\xc4\x04\x62\x42\x31\x91\x98\x58\x4c\x22\x26\x15\x93\x89\xc9\xc5\x14\x62\x4a\x31\x95\x98\x5a\x4c\x23\xa6\x15\xd3\x89\xe9\xc5\x0c\x22\x26\xe2\x22\x21\x92\x22\x25\xd2\x22\x23\xb2\x22\x27\xf2\xa2\x20\x8a\xa2\x24\xca\xa2\x22\xaa\xa2\x26\xea\xa2\x21\x9a\xa2\x25\xda\xa2\x23\xba\xa2\x27\xfa\x62\x20\x86\x62\x24\x02\x11\x8a\x48\x8c\xc5\x8c\x62\x26\x31\xb3\x98\x45\xcc\x2a\x66\x13\xb3\x8b\x39\xc4\x9c\x62\x2e\x31\xb7\x98\x47\xcc\x2b\xe6\x13\xf3\x8b\x05\xc4\x82\x62\x21\xb1\xb0\x58\x44\x2c\x2a\x16\x13\x8b\x8b\x25\xc4\x92\x62\x29\xb1\xb4\x58\x46\x2c\x2b\x96\x13\xcb\x8b\x15\xc4\x8a\x62\x25\xb1\xb2\x58\x45\xac\x2a\x56\x13\xab\x8b\x35\xc4\x9a\x62\x2d\xb1\xb6\x58\x47\xac\x2b\xd6\x13\xeb\x8b\x0d\xc4\x86\x62\x23\xb1\xb1\xd8\x44\x6c\x2a\x36\x13\x9b\x8b\x2d\xc4\x96\x62\x2b\xb1\xb5\xd8\x46\x6c\x2b\xb6\x13\xdb\x8b\x1d\xc4\x8e\x62\x27\xb1\xb3\xd8\x45\xec\x2a\x76\x13\xbb\x8b\x3d\xc4\x9e\x62\x2f\xb1\xb7\xd8\x47\xec\x2b\xf6\x13\xfb\x8b\x03\xc4\x81\xe2\x20\x71\xb0\x38\x44\x1c\x2a\x0e\x13\x87\x8b\x23\xc4\x91\xe2\x28\x71\xb4\x38\x46\x1c\x2b\x8e\x13\xc7\x8b\x13\xc4\x89\xe2\x24\x71\xb2\x38\x45\x9c\x2a\x4e\x13\xa7\x8b\x33\xc4\x99\xe2\x2c\x71\xb6\x38\x47\x9c\x2b\xce\x13\xe7\x8b\x0b\xc4\x85\xe2\x22\x71\xb1\xb8\x44\x5c\x2a\x2e\x13\x97\x8b\x2b\xc4\x95\xe2\x2a\x71\xb5\xb8\x46\x5c\x2b\xae\x13\xd7\x8b\x1b\xc4\x8d\xe2\x26\x71\xb3\xb8\x45\xdc\x2a\x6e\x13\xb7\x8b\x3b\xc4\x9d\xe2\x2e\x71\xb7\xb8\x47\xdc\x2b\xee\x13\xf7\x8b\x07\xc4\x83\xe2\x21\xf1\xb0\x78\x44\x3c\x2a\x1e\x13\x8f\x8b\x27\xc4\x93\xe2\x29\xf1\xb4\x78\x46\x3c\x2b\x9e\x13\xcf\x8b\x17\xc4\x8b\xe2\x25\xf1\xb2\x78\x45\xbc\x2a\x5e\x13\xaf\x8b\x37\xc4\x9b\xe2\x2d\xf1\xb6\x78\x47\xbc\x2b\xde\x13\xef\x8b\x0f\xc4\x87\xe2\x23\xf1\xb1\xf8\x44\x7c\x2a\x3e\x13\x9f\x8b\x2f\xc4\x97\xe2\x2b\xf1\xb5\xf8\x46\x7c\x2b\xbe\x13\xdf\x8b\x1f\xc4\x8f\xe2\x27\xf1\xb3\xf8\x45\xfc\x2a\x7e\x13\xbf\x8b\x3f\xc4\x9f\xe2\x2f\xf1\xb7\xf8\x47\xfc\x2b\xfe\x93\x12\x48\x09\xa5\x44\x52\x62\x29\x89\x94\x54\x4a\x26\x25\x97\x52\x48\x29\xa5\x54\x52\x6a\x29\x8d\x94\x56\x4a\x27\xa5\x97\x32\x48\x98\x84\x4b\x84\x44\x4a\x94\x44\x4b\x8c\xc4\x4a\x9c\xc4\x4b\x82\x24\x4a\x92\x24\x4b\x8a\xa4\x4a\x9a\xa4\x4b\x86\x64\x4a\x96\x64\x4b\x8e\xe4\x4a\x9e\xe4\x4b\x81\x14\x4a\x91\x04\x24\x28\x21\x29\x96\x32\x4a\x99\xa4\xcc\x52\x16\x29\xab\x94\x4d\xca\x2e\xe5\x90\x72\x4a\xb9\xa4\xdc\x52\x1e\x29\xaf\x94\x4f\xca\x2f\x15\x90\x0a\x4a\x85\xa4\xc2\x52\x11\xa9\xa8\x54\x4c\x2a\x2e\x95\x90\x4a\x4a\xa5\xa4\xd2\x52\x19\xa9\xac\x54\x4e\x2a\x2f\x55\x90\x2a\x4a\x95\xa4\xca\x52\x15\xa9\xaa\x54\x4d\xaa\x2e\xd5\x90\x6a\x4a\xb5\xa4\xda\x52\x1d\xa9\xae\x54\x4f\xaa\x2f\x35\x90\x1a\x4a\x8d\xa4\xc6\x52\x13\xa9\xa9\xd4\x4c\x6a\x2e\xb5\x90\x5a\x4a\xad\xa4\xd6\x52\x1b\xa9\xad\xd4\x4e\x6a\x2f\x75\x90\x3a\x4a\x9d\xa4\xce\x52\x17\xa9\xab\xd4\x4d\xea\x2e\xf5\x90\x7a\x4a\xbd\xa4\xde\x52\x1f\xa9\xaf\xd4\x4f\xea\x2f\x0d\x90\x06\x4a\x83\xa4\xc1\xd2\x10\x69\xa8\x34\x4c\x1a\x2e\x8d\x90\x46\x4a\xa3\xa4\xd1\xd2\x18\x69\xac\x34\x4e\x1a\x2f\x4d\x90\x26\x4a\x93\xa4\xc9\xd2\x14\x69\xaa\x34\x4d\x9a\x2e\xcd\x90\x66\x4a\xb3\xa4\xd9\xd2\x1c\x69\xae\x34\x4f\x9a\x2f\x2d\x90\x16\x4a\x8b\xa4\xc5\xd2\x12\x69\xa9\xb4\x4c\x5a\x2e\xad\x90\x56\x4a\xab\xa4\xd5\xd2\x1a\x69\xad\xb4\x4e\x5a\x2f\x6d\x90\x36\x4a\x9b\xa4\xcd\xd2\x16\x69\xab\xb4\x4d\xda\x2e\xed\x90\x76\x4a\xbb\xa4\xdd\xd2\x1e\x69\xaf\xb4\x4f\xda\x2f\x1d\x90\x0e\x4a\x87\xa4\xc3\xd2\x11\xe9\xa8\x74\x4c\x3a\x2e\x9d\x90\x4e\x4a\xa7\xa4\xd3\xd2\x19\xe9\xac\x74\x4e\x3a\x2f\x5d\x90\x2e\x4a\x97\xa4\xcb\xd2\x15\xe9\xaa\x74\x4d\xba\x2e\xdd\x90\x6e\x4a\xb7\xa4\xdb\xd2\x1d\xe9\xae\x74\x4f\xba\x2f\x3d\x90\x1e\x4a\x8f\xa4\xc7\xd2\x13\xe9\xa9\xf4\x4c\x7a\x2e\xbd\x90\x5e\x4a\xaf\xa4\xd7\xd2\x1b\xe9\xad\xf4\x4e\x7a\x2f\x7d\x90\x3e\x4a\x9f\xa4\xcf\xd2\x17\xe9\xab\xf4\x4d\xfa\x2e\xfd\x90\x7e\x4a\xbf\xa4\xdf\xd2\x1f\xe9\xaf\xf4\x4f\x4e\x20\x27\x94\x13\xc9\x89\xe5\x24\x72\x52\x39\x99\x9c\x5c\x4e\x21\xa7\x94\x53\xc9\xa9\xe5\x34\x72\x5a\x39\x9d\x9c\x5e\xce\x20\x63\x32\x2e\x13\x32\x29\x53\x32\x2d\x33\x32\x2b\x73\x32\x2f\x0b\xb2\x28\x4b\xb2\x2c\x2b\xb2\x2a\x6b\xb2\x2e\x1b\xb2\x29\x5b\xb2\x2d\x3b\xb2\x2b\x7b\xb2\x2f\x07\x72\x28\x47\x32\x90\xa1\x8c\xe4\x58\xce\x28\x67\x92\x33\xcb\x59\xe4\xac\x72\x36\x39\xbb\x9c\x43\xce\x29\xe7\x92\x73\xcb\x79\xe4\xbc\x72\x3e\x39\xbf\x5c\x40\x2e\x28\x17\x92\x0b\xcb\x45\xe4\xa2\x72\x31\xb9\xb8\x5c\x42\x2e\x29\x97\x92\x4b\xcb\x65\xe4\xb2\x72\x39\xb9\xbc\x5c\x41\xae\x28\x57\x92\x2b\xcb\x55\xe4\xaa\x72\x35\xb9\xba\x5c\x43\xae\x29\xd7\x92\x6b\xcb\x75\xe4\xba\x72\x3d\xb9\xbe\xdc\x40\x6e\x28\x37\x92\x1b\xcb\x4d\xe4\xa6\x72\x33\xb9\xb9\xdc\x42\x6e\x29\xb7\x92\x5b\xcb\x6d\xe4\xb6\x72\x3b\xb9\xbd\xdc\x41\xee\x28\x77\x92\x3b\xcb\x5d\xe4\xae\x72\x37\xb9\xbb\xdc\x43\xee\x29\xf7\x92\x7b\xcb\x7d\xe4\xbe\x72\x3f\xb9\xbf\x3c\x40\x1e\x28\x0f\x92\x07\xcb\x43\xe4\xa1\xf2\x30\x79\xb8\x3c\x42\x1e\x29\x8f\x92\x47\xcb\x63\xe4\xb1\xf2\x38\x79\xbc\x3c\x41\x9e\x28\x4f\x92\x27\xcb\x53\xe4\xa9\xf2\x34\x79\xba\x3c\x43\x9e\x29\xcf\x92\x67\xcb\x73\xe4\xb9\xf2\x3c\x79\xbe\xbc\x40\x5e\x28\x2f\x92\x17\xcb\x4b\xe4\xa5\xf2\x32\x79\xb9\xbc\x42\x5e\x29\xaf\x92\x57\xcb\x6b\xe4\xb5\xf2\x3a\x79\xbd\xbc\x41\xde\x28\x6f\x92\x37\xcb\x5b\xe4\xad\xf2\x36\x79\xbb\xbc\x43\xde\x29\xef\x92\x77\xcb\x7b\xe4\xbd\xf2\x3e\x79\xbf\x7c\x40\x3e\x28\x1f\x92\x0f\xcb\x47\xe4\xa3\xf2\x31\xf9\xb8\x7c\x42\x3e\x29\x9f\x92\x4f\xcb\x67\xe4\xb3\xf2\x39\xf9\xbc\x7c\x41\xbe\x28\x5f\x92\x2f\xcb\x57\xe4\xab\xf2\x35\xf9\xba\x7c\x43\xbe\x29\xdf\x92\x6f\xcb\x77\xe4\xbb\xf2\x3d\xf9\xbe\xfc\x40\x7e\x28\x3f\x92\x1f\xcb\x4f\xe4\xa7\xf2\x33\xf9\xb9\xfc\x42\x7e\x29\xbf\x92\x5f\xcb\x6f\xe4\xb7\xf2\x3b\xf9\xbd\xfc\x41\xfe\x28\x7f\x92\x3f\xcb\x5f\xe4\xaf\xf2\x37\xf9\xbb\xfc\x43\xfe\x29\xff\x92\x7f\xcb\x7f\xe4\xbf\xf2\x3f\x25\x81\x92\x50\x49\xa4\x24\x56\x92\x28\x49\x95\x64\x4a\x72\x25\x85\x92\x52\x49\xa5\xa4\x56\xd2\x28\x69\x95\x74\x4a\x7a\x25\x83\x82\x29\xb8\x42\x28\xa4\x42\x29\xb4\xc2\x28\xac\xc2\x29\xbc\x22\x28\xa2\x22\x29\xb2\xa2\x28\xaa\xa2\x29\xba\x62\x28\xa6\x62\x29\xb6\xe2\x28\xae\xe2\x29\xbe\x12\x28\xa1\x12\x29\x40\x81\x0a\x52\x62\x25\xa3\x92\x49\xc9\xac\x64\x51\xb2\x2a\xd9\x94\xec\x4a\x0e\x25\xa7\x92\x4b\xc9\xad\xe4\x51\xf2\x2a\xf9\x94\xfc\x4a\x01\xa5\xa0\x52\x48\x29\xac\x14\x51\x8a\x2a\xc5\x94\xe2\x4a\x09\xa5\xa4\x52\x4a\x29\xad\x94\x51\xca\x2a\xe5\x94\xf2\x4a\x05\xa5\xa2\x52\x49\xa9\xac\x54\x51\xaa\x2a\xd5\x94\xea\x4a\x0d\xa5\xa6\x52\x4b\xa9\xad\xd4\x51\xea\x2a\xf5\x94\xfa\x4a\x03\xa5\xa1\xd2\x48\x69\xac\x34\x51\x9a\x2a\xcd\x94\xe6\x4a\x0b\xa5\xa5\xd2\x4a\x69\xad\xb4\x51\xda\x2a\xed\x94\xf6\x4a\x07\xa5\xa3\xd2\x49\xe9\xac\x74\x51\xba\x2a\xdd\x94\xee\x4a\x0f\xa5\xa7\xd2\x4b\xe9\xad\xf4\x51\xfa\x2a\xfd\x94\xfe\xca\x00\x65\xa0\x32\x48\x19\xac\x0c\x51\x86\x2a\xc3\x94\xe1\xca\x08\x65\xa4\x32\x4a\x19\xad\x8c\x51\xc6\x2a\xe3\x94\xf1\xca\x04\x65\xa2\x32\x49\x99\xac\x4c\x51\xa6\x2a\xd3\x94\xe9\xca\x0c\x65\xa6\x32\x4b\x99\xad\xcc\x51\xe6\x2a\xf3\x94\xf9\xca\x02\x65\xa1\xb2\x48\x59\xac\x2c\x51\x96\x2a\xcb\x94\xe5\xca\x0a\x65\xa5\xb2\x4a\x59\xad\xac\x51\xd6\x2a\xeb\x94\xf5\xca\x06\x65\xa3\xb2\x49\xd9\xac\x6c\x51\xb6\x2a\xdb\x94\xed\xca\x0e\x65\xa7\xb2\x4b\xd9\xad\xec\x51\xf6\x2a\xfb\x94\xfd\xca\x01\xe5\xa0\x72\x48\x39\xac\x1c\x51\x8e\x2a\xc7\x94\xe3\xca\x09\xe5\xa4\x72\x4a\x39\xad\x9c\x51\xce\x2a\xe7\x94\xf3\xca\x05\xe5\xa2\x72\x49\xb9\xac\x5c\x51\xae\x2a\xd7\x94\xeb\xca\x0d\xe5\xa6\x72\x4b\xb9\xad\xdc\x51\xee\x2a\xf7\x94\xfb\xca\x03\xe5\xa1\xf2\x48\x79\xac\x3c\x51\x9e\x2a\xcf\x94\xe7\xca\x0b\xe5\xa5\xf2\x4a\x79\xad\xbc\x51\xde\x2a\xef\x94\xf7\xca\x07\xe5\xa3\xf2\x49\xf9\xac\x7c\x51\xbe\x2a\xdf\x94\xef\xca\x0f\xe5\xa7\xf2\x4b\xf9\xad\xfc\x51\xfe\x2a\xff\xd4\x04\x6a\x42\x35\x91\x9a\x58\x4d\xa2\x26\x55\x93\xa9\xc9\xd5\x14\x6a\x4a\x35\x95\x9a\x5a\x4d\xa3\xa6\x55\xd3\xa9\xe9\xd5\x0c\x2a\xa6\xe2\x2a\xa1\x92\x2a\xa5\xd2\x2a\xa3\xb2\x2a\xa7\xf2\xaa\xa0\x8a\xaa\xa4\xca\xaa\xa2\xaa\xaa\xa6\xea\xaa\xa1\x9a\xaa\xa5\xda\xaa\xa3\xba\xaa\xa7\xfa\x6a\xa0\x86\x6a\xa4\x02\x15\xaa\x48\x8d\xd5\x8c\x6a\x26\x35\xb3\x9a\x45\xcd\xaa\x66\x53\xb3\xab\x39\xd4\x9c\x6a\x2e\x35\xb7\x9a\x47\xcd\xab\xe6\x53\xf3\xab\x05\xd4\x82\x6a\x21\xb5\xb0\x5a\x44\x2d\xaa\x16\x53\x8b\xab\x25\xd4\x92\x6a\x29\xb5\xb4\x5a\x46\x2d\xab\x96\x53\xcb\xab\x15\xd4\x8a\x6a\x25\xb5\xb2\x5a\x45\xad\xaa\x56\x53\xab\xab\x35\xd4\x9a\x6a\x2d\xb5\xb6\x5a\x47\xad\xab\xd6\x53\xeb\xab\x0d\xd4\x86\x6a\x23\xb5\xb1\xda\x44\x6d\xaa\x36\x53\x9b\xab\x2d\xd4\x96\x6a\x2b\xb5\xb5\xda\x46\x6d\xab\xb6\x53\xdb\xab\x1d\xd4\x8e\x6a\x27\xb5\xb3\xda\x45\xed\xaa\x76\x53\xbb\xab\x3d\xd4\x9e\x6a\x2f\xb5\xb7\xda\x47\xed\xab\xf6\x53\xfb\xab\x03\xd4\x81\xea\x20\x75\xb0\x3a\x44\x1d\xaa\x0e\x53\x87\xab\x23\xd4\x91\xea\x28\x75\xb4\x3a\x46\x1d\xab\x8e\x53\xc7\xab\x13\xd4\x89\xea\x24\x75\xb2\x3a\x45\x9d\xaa\x4e\x53\xa7\xab\x33\xd4\x99\xea\x2c\x75\xb6\x3a\x47\x9d\xab\xce\x53\xe7\xab\x0b\xd4\x85\xea\x22\x75\xb1\xba\x44\x5d\xaa\x2e\x53\x97\xab\x2b\xd4\x95\xea\x2a\x75\xb5\xba\x46\x5d\xab\xae\x53\xd7\xab\x1b\xd4\x8d\xea\x26\x75\xb3\xba\x45\xdd\xaa\x6e\x53\xb7\xab\x3b\xd4\x9d\xea\x2e\x75\xb7\xba\x47\xdd\xab\xee\x53\xf7\xab\x07\xd4\x83\xea\x21\xf5\xb0\x7a\x44\x3d\xaa\x1e\x53\x8f\xab\x27\xd4\x93\xea\x29\xf5\xb4\x7a\x46\x3d\xab\x9e\x53\xcf\xab\x17\xd4\x8b\xea\x25\xf5\xb2\x7a\x45\xbd\xaa\x5e\x53\xaf\xab\x37\xd4\x9b\xea\x2d\xf5\xb6\x7a\x47\xbd\xab\xde\x53\xef\xab\x0f\xd4\x87\xea\x23\xf5\xb1\xfa\x44\x7d\xaa\x3e\x53\x9f\xab\x2f\xd4\x97\xea\x2b\xf5\xb5\xfa\x46\x7d\xab\xbe\x53\xdf\xab\x1f\xd4\x8f\xea\x27\xf5\xb3\xfa\x45\xfd\xaa\x7e\x53\xbf\xab\x3f\xd4\x9f\xea\x2f\xf5\xb7\xfa\x47\xfd\xab\xfe\xd3\x12\x68\x09\xb5\x44\x5a\x62\x2d\x89\x96\x54\x4b\xa6\x25\xd7\x52\x68\x29\xb5\x54\x5a\x6a\x2d\x8d\x96\x56\x4b\xa7\xa5\xd7\x32\x68\x98\x86\x6b\x84\x46\x6a\x94\x46\x6b\x8c\xc6\x6a\x9c\xc6\x6b\x82\x26\x6a\x92\x26\x6b\x8a\xa6\x6a\x9a\xa6\x6b\x86\x66\x6a\x96\x66\x6b\x8e\xe6\x6a\x9e\xe6\x6b\x81\x16\x6a\x91\x06\x34\xa8\x21\x2d\xd6\x32\x6a\x99\xb4\xcc\x5a\x16\x2d\xab\x96\x4d\xcb\xae\xe5\xd0\x72\x6a\xb9\xb4\xdc\x5a\x1e\x2d\xaf\x96\x4f\xcb\xaf\x15\xd0\x0a\x6a\x85\xb4\xc2\x5a\x11\xad\xa8\x56\x4c\x2b\xae\x95\xd0\x4a\x6a\xa5\xb4\xd2\x5a\x19\xad\xac\x56\x4e\x2b\xaf\x55\xd0\x2a\x6a\x95\xb4\xca\x5a\x15\xad\xaa\x56\x4d\xab\xae\xd5\xd0\x6a\x6a\xb5\xb4\xda\x5a\x1d\xad\xae\x56\x4f\xab\xaf\x35\xd0\x1a\x6a\x8d\xb4\xc6\x5a\x13\xad\xa9\xd6\x4c\x6b\xae\xb5\xd0\x5a\x6a\xad\xb4\xd6\x5a\x1b\xad\xad\xd6\x4e\x6b\xaf\x75\xd0\x3a\x6a\x9d\xb4\xce\x5a\x17\xad\xab\xd6\x4d\xeb\xae\xf5\xd0\x7a\x6a\xbd\xb4\xde\x5a\x1f\xad\xaf\xd6\x4f\xeb\xaf\x0d\xd0\x06\x6a\x83\xb4\xc1\xda\x10\x6d\xa8\x36\x4c\x1b\xae\x8d\xd0\x46\x6a\xa3\xb4\xd1\xda\x18\x6d\xac\x36\x4e\x1b\xaf\x4d\xd0\x26\x6a\x93\xb4\xc9\xda\x14\x6d\xaa\x36\x4d\x9b\xae\xcd\xd0\x66\x6a\xb3\xb4\xd9\xda\x1c\x6d\xae\x36\x4f\x9b\xaf\x2d\xd0\x16\x6a\x8b\xb4\xc5\xda\x12\x6d\xa9\xb6\x4c\x5b\xae\xad\xd0\x56\x6a\xab\xb4\xd5\xda\x1a\x6d\xad\xb6\x4e\x5b\xaf\x6d\xd0\x36\x6a\x9b\xb4\xcd\xda\x16\x6d\xab\xb6\x4d\xdb\xae\xed\xd0\x76\x6a\xbb\xb4\xdd\xda\x1e\x6d\xaf\xb6\x4f\xdb\xaf\x1d\xd0\x0e\x6a\x87\xb4\xc3\xda\x11\xed\xa8\x76\x4c\x3b\xae\x9d\xd0\x4e\x6a\xa7\xb4\xd3\xda\x19\xed\xac\x76\x4e\x3b\xaf\x5d\xd0\x2e\x6a\x97\xb4\xcb\xda\x15\xed\xaa\x76\x4d\xbb\xae\xdd\xd0\x6e\x6a\xb7\xb4\xdb\xda\x1d\xed\xae\x76\x4f\xbb\xaf\x3d\xd0\x1e\x6a\x8f\xb4\xc7\xda\x13\xed\xa9\xf6\x4c\x7b\xae\xbd\xd0\x5e\x6a\xaf\xb4\xd7\xda\x1b\xed\xad\xf6\x4e\x7b\xaf\x7d\xd0\x3e\x6a\x9f\xb4\xcf\xda\x17\xed\xab\xf6\x4d\xfb\xae\xfd\xd0\x7e\x6a\xbf\xb4\xdf\xda\x1f\xed\xaf\xf6\x4f\x4f\xa0\x27\xd4\x13\xe9\x89\xf5\x24\x7a\x52\x3d\x99\x9e\x5c\x4f\xa1\xa7\xd4\x53\xe9\xa9\xf5\x34\x7a\x5a\x3d\x9d\x9e\x5e\xcf\xa0\x63\x3a\xae\x13\x3a\xa9\x53\x3a\xad\x33\x3a\xab\x73\x3a\xaf\x0b\xba\xa8\x4b\xba\xac\x2b\xba\xaa\x6b\xba\xae\x1b\xba\xa9\x5b\xba\xad\x3b\xba\xab\x7b\xba\xaf\x07\x7a\xa8\x47\x3a\xd0\xa1\x8e\xf4\x58\xcf\xa8\x67\xd2\x33\xeb\x59\xf4\xac\x7a\x36\x3d\xbb\x9e\x43\xcf\xa9\xe7\xd2\x73\xeb\x79\xf4\xbc\x7a\x3e\x3d\xbf\x5e\x40\x2f\xa8\x17\xd2\x0b\xeb\x45\xf4\xa2\x7a\x31\xbd\xb8\x5e\x42\x2f\xa9\x97\xd2\x4b\xeb\x65\xf4\xb2\x7a\x39\xbd\xbc\x5e\x41\xaf\xa8\x57\xd2\x2b\xeb\x55\xf4\xaa\x7a\x35\xbd\xba\x5e\x43\xaf\xa9\xd7\xd2\x6b\xeb\x75\xf4\xba\x7a\x3d\xbd\xbe\xde\x40\x6f\xa8\x37\xd2\x1b\xeb\x4d\xf4\xa6\x7a\x33\xbd\xb9\xde\x42\x6f\xa9\xb7\xd2\x5b\xeb\x6d\xf4\xb6\x7a\x3b\xbd\xbd\xde\x41\xef\xa8\x77\xd2\x3b\xeb\x5d\xf4\xae\x7a\x37\xbd\xbb\xde\x43\xef\xa9\xf7\xd2\x7b\xeb\x7d\xf4\xbe\x7a\x3f\xbd\xbf\x3e\x40\x1f\xa8\x0f\xd2\x07\xeb\x43\xf4\xa1\xfa\x30\x7d\xb8\x3e\x42\x1f\xa9\x8f\xd2\x47\xeb\x63\xf4\xb1\xfa\x38\x7d\xbc\x3e\x41\x9f\xa8\x4f\xd2\x27\xeb\x53\xf4\xa9\xfa\x34\x7d\xba\x3e\x43\x9f\xa9\xcf\xd2\x67\xeb\x73\xf4\xb9\xfa\x3c\x7d\xbe\xbe\x40\x5f\xa8\x2f\xd2\x17\xeb\x4b\xf4\xa5\xfa\x32\x7d\xb9\xbe\x42\x5f\xa9\xaf\xd2\x57\xeb\x6b\xf4\xb5\xfa\x3a\x7d\xbd\xbe\x41\xdf\xa8\x6f\xd2\x37\xeb\x5b\xf4\xad\xfa\x36\x7d\xbb\xbe\x43\xdf\xa9\xef\xd2\x77\xeb\x7b\xf4\xbd\xfa\x3e\x7d\xbf\x7e\x40\x3f\xa8\x1f\xd2\x0f\xeb\x47\xf4\xa3\xfa\x31\xfd\xb8\x7e\x42\x3f\xa9\x9f\xd2\x4f\xeb\x67\xf4\xb3\xfa\x39\xfd\xbc\x7e\x41\xbf\xa8\x5f\xd2\x2f\xeb\x57\xf4\xab\xfa\x35\xfd\xba\x7e\x43\xbf\xa9\xdf\xd2\x6f\xeb\x77\xf4\xbb\xfa\x3d\xfd\xbe\xfe\x40\x7f\xa8\x3f\xd2\x1f\xeb\x4f\xf4\xa7\xfa\x33\xfd\xb9\xfe\x42\x7f\xa9\xbf\xd2\x5f\xeb\x6f\xf4\xb7\xfa\x3b\xfd\xbd\xfe\x41\xff\xa8\x7f\xd2\x3f\xeb\x5f\xf4\xaf\xfa\x37\xfd\xbb\xfe\x43\xff\xa9\xff\xd2\x7f\xeb\x7f\xf4\xbf\xfa\x3f\x23\x81\x91\xd0\x48\x64\x24\x36\x92\x18\x49\x8d\x64\x46\x72\x23\x85\x91\xd2\x48\x65\xa4\x36\xd2\x18\x69\x8d\x74\x46\x7a\x23\x83\x81\x19\xb8\x41\x18\xa4\x41\x19\xb4\xc1\x18\xac\xc1\x19\xbc\x21\x18\xa2\x21\x19\xb2\xa1\x18\xaa\xa1\x19\xba\x61\x18\xa6\x61\x19\xb6\xe1\x18\xae\xe1\x19\xbe\x11\x18\xa1\x11\x19\xc0\x80\x06\x32\x62\x23\xa3\x91\xc9\xc8\x6c\x64\x31\xb2\x1a\xd9\x8c\xec\x46\x0e\x23\xa7\x91\xcb\xc8\x6d\xe4\x31\xf2\x1a\xf9\x8c\xfc\x46\x01\xa3\xa0\x51\xc8\x28\x6c\x14\x31\x8a\x1a\xc5\x8c\xe2\x46\x09\xa3\xa4\x51\xca\x28\x6d\x94\x31\xca\x1a\xe5\x8c\xf2\x46\x05\xa3\xa2\x51\xc9\xa8\x6c\x54\x31\xaa\x1a\xd5\x8c\xea\x46\x0d\xa3\xa6\x51\xcb\xa8\x6d\xd4\x31\xea\x1a\xf5\x8c\xfa\x46\x03\xa3\xa1\xd1\xc8\x68\x6c\x34\x31\x9a\x1a\xcd\x8c\xe6\x46\x0b\xa3\xa5\xd1\xca\x68\x6d\xb4\x31\xda\x1a\xed\x8c\xf6\x46\x07\xa3\xa3\xd1\xc9\xe8\x6c\x74\x31\xba\x1a\xdd\x8c\xee\x46\x0f\xa3\xa7\xd1\xcb\xe8\x6d\xf4\x31\xfa\x1a\xfd\x8c\xfe\xc6\x00\x63\xa0\x31\xc8\x18\x6c\x0c\x31\x86\x1a\xc3\x8c\xe1\xc6\x08\x63\xa4\x31\xca\x18\x6d\x8c\x31\xc6\x1a\xe3\x8c\xf1\xc6\x04\x63\xa2\x31\xc9\x98\x6c\x4c\x31\xa6\x1a\xd3\x8c\xe9\xc6\x0c\x63\xa6\x31\xcb\x98\x6d\xcc\x31\xe6\x1a\xf3\x8c\xf9\xc6\x02\x63\xa1\xb1\xc8\x58\x6c\x2c\x31\x96\x1a\xcb\x8c\xe5\xc6\x0a\x63\xa5\xb1\xca\x58\x6d\xac\x31\xd6\x1a\xeb\x8c\xf5\xc6\x06\x63\xa3\xb1\xc9\xd8\x6c\x6c\x31\xb6\x1a\xdb\x8c\xed\xc6\x0e\x63\xa7\xb1\xcb\xd8\x6d\xec\x31\xf6\x1a\xfb\x8c\xfd\xc6\x01\xe3\xa0\x71\xc8\x38\x6c\x1c\x31\x8e\x1a\xc7\x8c\xe3\xc6\x09\xe3\xa4\x71\xca\x38\x6d\x9c\x31\xce\x1a\xe7\x8c\xf3\xc6\x05\xe3\xa2\x71\xc9\xb8\x6c\x5c\x31\xae\x1a\xd7\x8c\xeb\xc6\x0d\xe3\xa6\x71\xcb\xb8\x6d\xdc\x31\xee\x1a\xf7\x8c\xfb\xc6\x03\xe3\xa1\xf1\xc8\x78\x6c\x3c\x31\x9e\x1a\xcf\x8c\xe7\xc6\x0b\xe3\xa5\xf1\xca\x78\x6d\xbc\x31\xde\x1a\xef\x8c\xf7\xc6\x07\xe3\xa3\xf1\xc9\xf8\x6c\x7c\x31\xbe\x1a\xdf\x8c\xef\xc6\x0f\xe3\xa7\xf1\xcb\xf8\x6d\xfc\x31\xfe\x1a\xff\xcc\x04\x66\x42\x33\x91\x99\xd8\x4c\x62\x26\x35\x93\x99\xc9\xcd\x14\x66\x4a\x33\x95\x99\xda\x4c\x63\xa6\x35\xd3\x99\xe9\xcd\x0c\x26\x66\xe2\x26\x61\x92\x26\x65\xd2\x26\x63\xb2\x26\x67\xf2\xa6\x60\x8a\xa6\x64\xca\xa6\x62\xaa\xa6\x66\xea\xa6\x61\x9a\xa6\x65\xda\xa6\x63\xba\xa6\x67\xfa\x66\x60\x86\x66\x64\x02\x13\x9a\xc8\x8c\xcd\x8c\x66\x26\x33\xb3\x99\xc5\xcc\x6a\x66\x33\xb3\x9b\x39\xcc\x9c\x66\x2e\x33\xb7\x99\xc7\xcc\x6b\xe6\x33\xf3\x9b\x05\xcc\x82\x66\x21\xb3\xb0\x59\xc4\x2c\x6a\x16\x33\x8b\x9b\x25\xcc\x92\x66\x29\xb3\xb4\x59\xc6\x2c\x6b\x96\x33\xcb\x9b\x15\xcc\x8a\x66\x25\xb3\xb2\x59\xc5\xac\x6a\x56\x33\xab\x9b\x35\xcc\x9a\x66\x2d\xb3\xb6\x59\xc7\xac\x6b\xd6\x33\xeb\x9b\x0d\xcc\x86\x66\x23\xb3\xb1\xd9\xc4\x6c\x6a\x36\x33\x9b\x9b\x2d\xcc\x96\x66\x2b\xb3\xb5\xd9\xc6\x6c\x6b\xb6\x33\xdb\x9b\x1d\xcc\x8e\x66\x27\xb3\xb3\xd9\xc5\xec\x6a\x76\x33\xbb\x9b\x3d\xcc\x9e\x66\x2f\xb3\xb7\xd9\xc7\xec\x6b\xf6\x33\xfb\x9b\x03\xcc\x81\xe6\x20\x73\xb0\x39\xc4\x1c\x6a\x0e\x33\x87\x9b\x23\xcc\x91\xe6\x28\x73\xb4\x39\xc6\x1c\x6b\x8e\x33\xc7\x9b\x13\xcc\x89\xe6\x24\x73\xb2\x39\xc5\x9c\x6a\x4e\x33\xa7\x9b\x33\xcc\x99\xe6\x2c\x73\xb6\x39\xc7\x9c\x6b\xce\x33\xe7\x9b\x0b\xcc\x85\xe6\x22\x73\xb1\xb9\xc4\x5c\x6a\x2e\x33\x97\x9b\x2b\xcc\x95\xe6\x2a\x73\xb5\xb9\xc6\x5c\x6b\xae\x33\xd7\x9b\x1b\xcc\x8d\xe6\x26\x73\xb3\xb9\xc5\xdc\x6a\x6e\x33\xb7\x9b\x3b\xcc\x9d\xe6\x2e\x73\xb7\xb9\xc7\xdc\x6b\xee\x33\xf7\x9b\x07\xcc\x83\xe6\x21\xf3\xb0\x79\xc4\x3c\x6a\x1e\x33\x8f\x9b\x27\xcc\x93\xe6\x29\xf3\xb4\x79\xc6\x3c\x6b\x9e\x33\xcf\x9b\x17\xcc\x8b\xe6\x25\xf3\xb2\x79\xc5\xbc\x6a\x5e\x33\xaf\x9b\x37\xcc\x9b\xe6\x2d\xf3\xb6\x79\xc7\xbc\x6b\xde\x33\xef\x9b\x0f\xcc\x87\xe6\x23\xf3\xb1\xf9\xc4\x7c\x6a\x3e\x33\x9f\x9b\x2f\xcc\x97\xe6\x2b\xf3\xb5\xf9\xc6\x7c\x6b\xbe\x33\xdf\x9b\x1f\xcc\x8f\xe6\x27\xf3\xb3\xf9\xc5\xfc\x6a\x7e\x33\xbf\x9b\x3f\xcc\x9f\xe6\x2f\xf3\xb7\xf9\xc7\xfc\x6b\xfe\xb3\x12\x58\x09\xad\x44\x56\x62\x2b\x89\x95\xd4\x4a\x66\x25\xb7\x52\x58\x29\xad\x54\x56\x6a\x2b\x8d\x95\xd6\x4a\x67\xa5\xb7\x32\x58\x98\x85\x5b\x84\x45\x5a\x94\x45\x5b\x8c\xc5\x5a\x9c\xc5\x5b\x82\x25\x5a\x92\x25\x5b\x8a\xa5\x5a\x9a\xa5\x5b\x86\x65\x5a\x96\x65\x5b\x8e\xe5\x5a\x9e\xe5\x5b\x81\x15\x5a\x91\x05\x2c\x68\x21\x2b\xb6\x32\x5a\x99\xac\xcc\x56\x16\x2b\xab\x95\xcd\xca\x6e\xe5\xb0\x72\x5a\xb9\xac\xdc\x56\x1e\x2b\xaf\x95\xcf\xca\x6f\x15\xb0\x0a\x5a\x85\xac\xc2\x56\x11\xab\xa8\x55\xcc\x2a\x6e\x95\xb0\x4a\x5a\xa5\xac\xd2\x56\x19\xab\xac\x55\xce\x2a\x6f\x55\xb0\x2a\x5a\x95\xac\xca\x56\x15\xab\xaa\x55\xcd\xaa\x6e\xd5\xb0\x6a\x5a\xb5\xac\xda\x56\x1d\xab\xae\x55\xcf\xaa\x6f\x35\xb0\x1a\x5a\x8d\xac\xc6\x56\x13\xab\xa9\xd5\xcc\x6a\x6e\xb5\xb0\x5a\x5a\xad\xac\xd6\x56\x1b\xab\xad\xd5\xce\x6a\x6f\x75\xb0\x3a\x5a\x9d\xac\xce\x56\x17\xab\xab\xd5\xcd\xea\x6e\xf5\xb0\x7a\x5a\xbd\xac\xde\x56\x1f\xab\xaf\xd5\xcf\xea\x6f\x0d\xb0\x06\x5a\x83\xac\xc1\xd6\x10\x6b\xa8\x35\xcc\x1a\x6e\x8d\xb0\x46\x5a\xa3\xac\xd1\xd6\x18\x6b\xac\x35\xce\x1a\x6f\x4d\xb0\x26\x5a\x93\xac\xc9\xd6\x14\x6b\xaa\x35\xcd\x9a\x6e\xcd\xb0\x66\x5a\xb3\xac\xd9\xd6\x1c\x6b\xae\x35\xcf\x9a\x6f\x2d\xb0\x16\x5a\x8b\xac\xc5\xd6\x12\x6b\xa9\xb5\xcc\x5a\x6e\xad\xb0\x56\x5a\xab\xac\xd5\xd6\x1a\x6b\xad\xb5\xce\x5a\x6f\x6d\xb0\x36\x5a\x9b\xac\xcd\xd6\x16\x6b\xab\xb5\xcd\xda\x6e\xed\xb0\x76\x5a\xbb\xac\xdd\xd6\x1e\x6b\xaf\xb5\xcf\xda\x6f\x1d\xb0\x0e\x5a\x87\xac\xc3\xd6\x11\xeb\xa8\x75\xcc\x3a\x6e\x9d\xb0\x4e\x5a\xa7\xac\xd3\xd6\x19\xeb\xac\x75\xce\x3a\x6f\x5d\xb0\x2e\x5a\x97\xac\xcb\xd6\x15\xeb\xaa\x75\xcd\xba\x6e\xdd\xb0\x6e\x5a\xb7\xac\xdb\xd6\x1d\xeb\xae\x75\xcf\xba\x6f\x3d\xb0\x1e\x5a\x8f\xac\xc7\xd6\x13\xeb\xa9\xf5\xcc\x7a\x6e\xbd\xb0\x5e\x5a\xaf\xac\xd7\xd6\x1b\xeb\xad\xf5\xce\x7a\x6f\x7d\xb0\x3e\x5a\x9f\xac\xcf\xd6\x17\xeb\xab\xf5\xcd\xfa\x6e\xfd\xb0\x7e\x5a\xbf\xac\xdf\xd6\x1f\xeb\xaf\xf5\xcf\x4e\x60\x27\xb4\x13\xd9\x89\xed\x24\x76\x52\x3b\x99\x9d\xdc\x4e\x61\xa7\xb4\x53\xd9\xa9\xed\x34\x76\x5a\x3b\x9d\x9d\xde\xce\x60\x63\x36\x6e\x13\x36\x69\x53\x36\x6d\x33\x36\x6b\x73\x36\x6f\x0b\xb6\x68\x4b\xb6\x6c\x2b\xb6\x6a\x6b\xb6\x6e\x1b\xb6\x69\x5b\xb6\x6d\x3b\xb6\x6b\x7b\xb6\x6f\x07\x76\x68\x47\x36\xb0\xa1\x8d\xec\xd8\xce\x68\x67\xb2\x33\xdb\x59\xec\xac\x76\x36\x3b\xbb\x9d\xc3\xce\x69\xe7\xb2\x73\xdb\x79\xec\xbc\x76\x3e\x3b\xbf\x5d\xc0\x2e\x68\x17\xb2\x0b\xdb\x45\xec\xa2\x76\x31\xbb\xb8\x5d\xc2\x2e\x69\x97\xb2\x4b\xdb\x65\xec\xb2\x76\x39\xbb\xbc\x5d\xc1\xae\x68\x57\xb2\x2b\xdb\x55\xec\xaa\x76\x35\xbb\xba\x5d\xc3\xae\x69\xd7\xb2\x6b\xdb\x75\xec\xba\x76\x3d\xbb\xbe\xdd\xc0\x6e\x68\x37\xb2\x1b\xdb\x4d\xec\xa6\x76\x33\xbb\xb9\xdd\xc2\x6e\x69\xb7\xb2\x5b\xdb\x6d\xec\xb6\x76\x3b\xbb\xbd\xdd\xc1\xee\x68\x77\xb2\x3b\xdb\x5d\xec\xae\x76\x37\xbb\xbb\xdd\xc3\xee\x69\xf7\xb2\x7b\xdb\x7d\xec\xbe\x76\x3f\xbb\xbf\x3d\xc0\x1e\x68\x0f\xb2\x07\xdb\x43\xec\xa1\xf6\x30\x7b\xb8\x3d\xc2\x1e\x69\x8f\xb2\x47\xdb\x63\xec\xb1\xf6\x38\x7b\xbc\x3d\xc1\x9e\x68\x4f\xb2\x27\xdb\x53\xec\xa9\xf6\x34\x7b\xba\x3d\xc3\x9e\x69\xcf\xb2\x67\xdb\x73\xec\xb9\xf6\x3c\x7b\xbe\xbd\xc0\x5e\x68\x2f\xb2\x17\xdb\x4b\xec\xa5\xf6\x32\x7b\xb9\xbd\xc2\x5e\x69\xaf\xb2\x57\xdb\x6b\xec\xb5\xf6\x3a\x7b\xbd\xbd\xc1\xde\x68\x6f\xb2\x37\xdb\x5b\xec\xad\xf6\x36\x7b\xbb\xbd\xc3\xde\x69\xef\xb2\x77\xdb\x7b\xec\xbd\xf6\x3e\x7b\xbf\x7d\xc0\x3e\x68\x1f\xb2\x0f\xdb\x47\xec\xa3\xf6\x31\xfb\xb8\x7d\xc2\x3e\x69\x9f\xb2\x4f\xdb\x67\xec\xb3\xf6\x39\xfb\xbc\x7d\xc1\xbe\x68\x5f\xb2\x2f\xdb\x57\xec\xab\xf6\x35\xfb\xba\x7d\xc3\xbe\x69\xdf\xb2\x6f\xdb\x77\xec\xbb\xf6\x3d\xfb\xbe\xfd\xc0\x7e\x68\x3f\xb2\x1f\xdb\x4f\xec\xa7\xf6\x33\xfb\xb9\xfd\xc2\x7e\x69\xbf\xb2\x5f\xdb\x6f\xec\xb7\xf6\x3b\xfb\xbd\xfd\xc1\xfe\x68\x7f\xb2\x3f\xdb\x5f\xec\xaf\xf6\x37\xfb\xbb\xfd\xc3\xfe\x69\xff\xb2\x7f\xdb\x7f\xec\xbf\xf6\x3f\x27\x81\x93\xd0\x49\xe4\x24\x76\x92\x38\x49\x9d\x64\x4e\x72\x27\x85\x93\xd2\x49\xe5\xa4\x76\xd2\x38\x69\x9d\x74\x4e\x7a\x27\x83\x83\x39\xb8\x43\x38\xa4\x43\x39\xb4\xc3\x38\xac\xc3\x39\xbc\x23\x38\xa2\x23\x39\xb2\xa3\x38\xaa\xa3\x39\xba\x63\x38\xa6\x63\x39\xb6\xe3\x38\xae\xe3\x39\xbe\x13\x38\xa1\x13\x39\xc0\x81\x0e\x72\x62\x27\xa3\x93\xc9\xc9\xec\x64\x71\xb2\x3a\xd9\x9c\xec\x4e\x0e\x27\xa7\x93\xcb\xc9\xed\xe4\x71\xf2\x3a\xf9\x9c\xfc\x4e\x01\xa7\xa0\x53\xc8\x29\xec\x14\x71\x8a\x3a\xc5\x9c\xe2\x4e\x09\xa7\xa4\x53\xca\x29\xed\x94\x71\xca\x3a\xe5\x9c\xf2\x4e\x05\xa7\xa2\x53\xc9\xa9\xec\x54\x71\xaa\x3a\xd5\x9c\xea\x4e\x0d\xa7\xa6\x53\xcb\xa9\xed\xd4\x71\xea\x3a\xf5\x9c\xfa\x4e\x03\xa7\xa1\xd3\xc8\x69\xec\x34\x71\x9a\x3a\xcd\x9c\xe6\x4e\x0b\xa7\xa5\xd3\xca\x69\xed\xb4\x71\xda\x3a\xed\x9c\xf6\x4e\x07\xa7\xa3\xd3\xc9\xe9\xec\x74\x71\xba\x3a\xdd\x9c\xee\x4e\x0f\xa7\xa7\xd3\xcb\xe9\xed\xf4\x71\xfa\x3a\xfd\x9c\xfe\xce\x00\x67\xa0\x33\xc8\x19\xec\x0c\x71\x86\x3a\xc3\x9c\xe1\xce\x08\x67\xa4\x33\xca\x19\xed\x8c\x71\xc6\x3a\xe3\x9c\xf1\xce\x04\x67\xa2\x33\xc9\x99\xec\x4c\x71\xa6\x3a\xd3\x9c\xe9\xce\x0c\x67\xa6\x33\xcb\x99\xed\xcc\x71\xe6\x3a\xf3\x9c\xf9\xce\x02\x67\xa1\xb3\xc8\x59\xec\x2c\x71\x96\x3a\xcb\x9c\xe5\xce\x0a\x67\xa5\xb3\xca\x59\xed\xac\x71\xd6\x3a\xeb\x9c\xf5\xce\x06\x67\xa3\xb3\xc9\xd9\xec\x6c\x71\xb6\x3a\xdb\x9c\xed\xce\x0e\x67\xa7\xb3\xcb\xd9\xed\xec\x71\xf6\x3a\xfb\x9c\xfd\xce\x01\xe7\xa0\x73\xc8\x39\xec\x1c\x71\x8e\x3a\xc7\x9c\xe3\xce\x09\xe7\xa4\x73\xca\x39\xed\x9c\x71\xce\x3a\xe7\x9c\xf3\xce\x05\xe7\xa2\x73\xc9\xb9\xec\x5c\x71\xae\x3a\xd7\x9c\xeb\xce\x0d\xe7\xa6\x73\xcb\xb9\xed\xdc\x71\xee\x3a\xf7\x9c\xfb\xce\x03\xe7\xa1\xf3\xc8\x79\xec\x3c\x71\x9e\x3a\xcf\x9c\xe7\xce\x0b\xe7\xa5\xf3\xca\x79\xed\xbc\x71\xde\x3a\xef\x9c\xf7\xce\x07\xe7\xa3\xf3\xc9\xf9\xec\x7c\x71\xbe\x3a\xdf\x9c\xef\xce\x0f\xe7\xa7\xf3\xcb\xf9\xed\xfc\x71\xfe\x3a\xff\xdc\x04\x6e\x42\x37\x91\x9b\xd8\x4d\xe2\x26\x75\x93\xb9\xc9\xdd\x14\x6e\x4a\x37\x95\x9b\xda\x4d\xe3\xa6\x75\xd3\xb9\xe9\xdd\x0c\x2e\xe6\xe2\x2e\xe1\x92\x2e\xe5\xd2\x2e\xe3\xb2\x2e\xe7\xf2\xae\xe0\x8a\xae\xe4\xca\xae\xe2\xaa\xae\xe6\xea\xae\xe1\x9a\xae\xe5\xda\xae\xe3\xba\xae\xe7\xfa\x6e\xe0\x86\x6e\xe4\x02\x17\xba\xc8\x8d\xdd\x8c\x6e\x26\x37\xb3\x9b\xc5\xcd\xea\x66\x73\xb3\xbb\x39\xdc\x9c\x6e\x2e\x37\xb7\x9b\xc7\xcd\xeb\xe6\x73\xf3\xbb\x05\xdc\x82\x6e\x21\xb7\xb0\x5b\xc4\x2d\xea\x16\x73\x8b\xbb\x25\xdc\x92\x6e\x29\xb7\xb4\x5b\xc6\x2d\xeb\x96\x73\xcb\xbb\x15\xdc\x8a\x6e\x25\xb7\xb2\x5b\xc5\xad\xea\x56\x73\xab\xbb\x35\xdc\x9a\x6e\x2d\xb7\xb6\x5b\xc7\xad\xeb\xd6\x73\xeb\xbb\x0d\xdc\x86\x6e\x23\xb7\xb1\xdb\xc4\x6d\xea\x36\x73\x9b\xbb\x2d\xdc\x96\x6e\x2b\xb7\xb5\xdb\xc6\x6d\xeb\xb6\x73\xdb\xbb\x1d\xdc\x8e\x6e\x27\xb7\xb3\xdb\xc5\xed\xea\x76\x73\xbb\xbb\x3d\xdc\x9e\x6e\x2f\xb7\xb7\xdb\xc7\xed\xeb\xf6\x73\xfb\xbb\x03\xdc\x81\xee\x20\x77\xb0\x3b\xc4\x1d\xea\x0e\x73\x87\xbb\x23\xdc\x91\xee\x28\x77\xb4\x3b\xc6\x1d\xeb\x8e\x73\xc7\xbb\x13\xdc\x89\xee\x24\x77\xb2\x3b\xc5\x9d\xea\x4e\x73\xa7\xbb\x33\xdc\x99\xee\x2c\x77\xb6\x3b\xc7\x9d\xeb\xce\x73\xe7\xbb\x0b\xdc\x85\xee\x22\x77\xb1\xbb\xc4\x5d\xea\x2e\x73\x97\xbb\x2b\xdc\x95\xee\x2a\x77\xb5\xbb\xc6\x5d\xeb\xae\x73\xd7\xbb\x1b\xdc\x8d\xee\x26\x77\xb3\xbb\xc5\xdd\xea\x6e\x73\xb7\xbb\x3b\xdc\x9d\xee\x2e\x77\xb7\xbb\xc7\xdd\xeb\xee\x73\xf7\xbb\x07\xdc\x83\xee\x21\xf7\xb0\x7b\xc4\x3d\xea\x1e\x73\x8f\xbb\x27\xdc\x93\xee\x29\xf7\xb4\x7b\xc6\x3d\xeb\x9e\x73\xcf\xbb\x17\xdc\x8b\xee\x25\xf7\xb2\x7b\xc5\xbd\xea\x5e\x73\xaf\xbb\x37\xdc\x9b\xee\x2d\xf7\xb6\x7b\xc7\xbd\xeb\xde\x73\xef\xbb\x0f\xdc\x87\xee\x23\xf7\xb1\xfb\xc4\x7d\xea\x3e\x73\x9f\xbb\x2f\xdc\x97\xee\x2b\xf7\xb5\xfb\xc6\x7d\xeb\xbe\x73\xdf\xbb\x1f\xdc\x8f\xee\x27\xf7\xb3\xfb\xc5\xfd\xea\x7e\x73\xbf\xbb\x3f\xdc\x9f\xee\x2f\xf7\xb7\xfb\xc7\xfd\xeb\xfe\xf3\x12\x78\x09\xbd\x44\x5e\x62\x2f\x89\x97\xd4\x4b\xe6\x25\xf7\x52\x78\x29\xbd\x54\x5e\x6a\x2f\x8d\x97\xd6\x4b\xe7\xa5\xf7\x32\x78\x98\x87\x7b\x84\x47\x7a\x94\x47\x7b\x8c\xc7\x7a\x9c\xc7\x7b\x82\x27\x7a\x92\x27\x7b\x8a\xa7\x7a\x9a\xa7\x7b\x86\x67\x7a\x96\x67\x7b\x8e\xe7\x7a\x9e\xe7\x7b\x81\x17\x7a\x91\x07\x3c\xe8\x21\x2f\xf6\x32\x7a\x99\xbc\xcc\x5e\x16\x2f\xab\x97\xcd\xcb\xee\xe5\xf0\x72\x7a\xb9\xbc\xdc\x5e\x1e\x2f\xaf\x97\xcf\xcb\xef\x15\xf0\x0a\x7a\x85\xbc\xc2\x5e\x11\xaf\xa8\x57\xcc\x2b\xee\x95\xf0\x4a\x7a\xa5\xbc\xd2\x5e\x19\xaf\xac\x57\xce\x2b\xef\x55\xf0\x2a\x7a\x95\xbc\xca\x5e\x15\xaf\xaa\x57\xcd\xab\xee\xd5\xf0\x6a\x7a\xb5\xbc\xda\x5e\x1d\xaf\xae\x57\xcf\xab\xef\x35\xf0\x1a\x7a\x8d\xbc\xc6\x5e\x13\xaf\xa9\xd7\xcc\x6b\xee\xb5\xf0\x5a\x7a\xad\xbc\xd6\x5e\x1b\xaf\xad\xd7\xce\x6b\xef\x75\xf0\x3a\x7a\x9d\xbc\xce\x5e\x17\xaf\xab\xd7\xcd\xeb\xee\xf5\xf0\x7a\x7a\xbd\xbc\xde\x5e\x1f\xaf\xaf\xd7\xcf\xeb\xef\x0d\xf0\x06\x7a\x83\xbc\xc1\xde\x10\x6f\xa8\x37\xcc\x1b\xee\x8d\xf0\x46\x7a\xa3\xbc\xd1\xde\x18\x6f\xac\x37\xce\x1b\xef\x4d\xf0\x26\x7a\x93\xbc\xc9\xde\x14\x6f\xaa\x37\xcd\x9b\xee\xcd\xf0\x66\x7a\xb3\xbc\xd9\xde\x1c\x6f\xae\x37\xcf\x9b\xef\x2d\xf0\x16\x7a\x8b\xbc\xc5\xde\x12\x6f\xa9\xb7\xcc\x5b\xee\xad\xf0\x56\x7a\xab\xbc\xd5\xde\x1a\x6f\xad\xb7\xce\x5b\xef\x6d\xf0\x36\x7a\x9b\xbc\xcd\xde\x16\x6f\xab\xb7\xcd\xdb\xee\xed\xf0\x76\x7a\xbb\xbc\xdd\xde\x1e\x6f\xaf\xb7\xcf\xdb\xef\x1d\xf0\x0e\x7a\x87\xbc\xc3\xde\x11\xef\xa8\x77\xcc\x3b\xee\x9d\xf0\x4e\x7a\xa7\xbc\xd3\xde\x19\xef\xac\x77\xce\x3b\xef\x5d\xf0\x2e\x7a\x97\xbc\xcb\xde\x15\xef\xaa\x77\xcd\xbb\xee\xdd\xf0\x6e\x7a\xb7\xbc\xdb\xde\x1d\xef\xae\x77\xcf\xbb\xef\x3d\xf0\x1e\x7a\x8f\xbc\xc7\xde\x13\xef\xa9\xf7\xcc\x7b\xee\xbd\xf0\x5e\x7a\xaf\xbc\xd7\xde\x1b\xef\xad\xf7\xce\x7b\xef\x7d\xf0\x3e\x7a\x9f\xbc\xcf\xde\x17\xef\xab\xf7\xcd\xfb\xee\xfd\xf0\x7e\x7a\xbf\xbc\xdf\xde\x1f\xef\xaf\xf7\xcf\x4f\xe0\x27\xf4\x13\xf9\x89\xfd\x24\x7e\x52\x3f\x99\x9f\xdc\x4f\xe1\xa7\xf4\x53\xf9\xa9\xfd\x34\x7e\x5a\x3f\x9d\x9f\xde\xcf\xe0\x63\x3e\xee\x13\x3e\xe9\x53\x3e\xed\x33\x3e\xeb\x73\x3e\xef\x0b\xbe\xe8\x4b\xbe\xec\x2b\xbe\xea\x6b\xbe\xee\x1b\xbe\xe9\x5b\xbe\xed\x3b\xbe\xeb\x7b\xbe\xef\x07\x7e\xe8\x47\x3e\xf0\xa1\x8f\xfc\xd8\xcf\xe8\x67\xf2\x33\xfb\x59\xfc\xac\x7e\x36\x3f\xbb\x9f\xc3\xcf\xe9\xe7\xf2\x73\xfb\x79\xfc\xbc\x7e\x3e\x3f\xbf\x5f\xc0\x2f\xe8\x17\xf2\x0b\xfb\x45\xfc\xa2\x7e\x31\xbf\xb8\x5f\xc2\x2f\xe9\x97\xf2\x4b\xfb\x65\xfc\xb2\x7e\x39\xbf\xbc\x5f\xc1\xaf\xe8\x57\xf2\x2b\xfb\x55\xfc\xaa\x7e\x35\xbf\xba\x5f\xc3\xaf\xe9\xd7\xf2\x6b\xfb\x75\xfc\xba\x7e\x3d\xbf\xbe\xdf\xc0\x6f\xe8\x37\xf2\x1b\xfb\x4d\xfc\xa6\x7e\x33\xbf\xb9\xdf\xc2\x6f\xe9\xb7\xf2\x5b\xfb\x6d\xfc\xb6\x7e\x3b\xbf\xbd\xdf\xc1\xef\xe8\x77\xf2\x3b\xfb\x5d\xfc\xae\x7e\x37\xbf\xbb\xdf\xc3\xef\xe9\xf7\xf2\x7b\xfb\x7d\xfc\xbe\x7e\x3f\xbf\xbf\x3f\xc0\x1f\xe8\x0f\xf2\x07\xfb\x43\xfc\xa1\xfe\x30\x7f\xb8\x3f\xc2\x1f\xe9\x8f\xf2\x47\xfb\x63\xfc\xb1\xfe\x38\x7f\xbc\x3f\xc1\x9f\xe8\x4f\xf2\x27\xfb\x53\xfc\xa9\xfe\x34\x7f\xba\x3f\xc3\x9f\xe9\xcf\xf2\x67\xfb\x73\xfc\xb9\xfe\x3c\x7f\xbe\xbf\xc0\x5f\xe8\x2f\xf2\x17\xfb\x4b\xfc\xa5\xfe\x32\x7f\xb9\xbf\xc2\x5f\xe9\xaf\xf2\x57\xfb\x6b\xfc\xb5\xfe\x3a\x7f\xbd\xbf\xc1\xdf\xe8\x6f\xf2\x37\xfb\x5b\xfc\xad\xfe\x36\x7f\xbb\xbf\xc3\xdf\xe9\xef\xf2\x77\xfb\x7b\xfc\xbd\xfe\x3e\x7f\xbf\x7f\xc0\x3f\xe8\x1f\xf2\x0f\xfb\x47\xfc\xa3\xfe\x31\xff\xb8\x7f\xc2\x3f\xe9\x9f\xf2\x4f\xfb\x67\xfc\xb3\xfe\x39\xff\xbc\x7f\xc1\xbf\xe8\x5f\xf2\x2f\xfb\x57\xfc\xab\xfe\x35\xff\xba\x7f\xc3\xbf\xe9\xdf\xf2\x6f\xfb\x77\xfc\xbb\xfe\x3d\xff\xbe\xff\xc0\x7f\xe8\x3f\xf2\x1f\xfb\x4f\xfc\xa7\xfe\x33\xff\xb9\xff\xc2\x7f\xe9\xbf\xf2\x5f\xfb\x6f\xfc\xb7\xfe\x3b\xff\xbd\xff\xc1\xff\xe8\x7f\xf2\x3f\xfb\x5f\xfc\xaf\xfe\x37\xff\xbb\xff\xc3\xff\xe9\xff\xf2\x7f\xfb\x7f\xfc\xbf\xfe\xbf\x20\x41\x90\x30\x48\x14\x24\x0e\x92\x04\x49\x83\x64\x41\xf2\x20\x45\x90\x32\x48\x15\xa4\x0e\xd2\x04\x69\x83\x74\x41\xfa\x20\x43\x80\x05\x78\x40\x04\x64\x40\x05\x74\xc0\x04\x6c\xc0\x05\x7c\x20\x04\x62\x20\x05\x72\xa0\x04\x6a\xa0\x05\x7a\x60\x04\x66\x60\x05\x76\xe0\x04\x6e\xe0\x05\x7e\x10\x04\x61\x10\x05\x20\x80\x01\x0a\xe2\x20\x63\x90\x29\xc8\x1c\x64\x09\xb2\x06\xd9\x82\xec\x41\x8e\x20\x67\x90\x2b\xc8\x1d\xe4\x09\xf2\x06\xf9\x82\xfc\x41\x81\xa0\x60\x50\x28\x28\x1c\x14\x09\x8a\x06\xc5\x82\xe2\x41\x89\xa0\x64\x50\x2a\x28\x1d\x94\x09\xca\x06\xe5\x82\xf2\x41\x85\xa0\x62\x50\x29\xa8\x1c\x54\x09\xaa\x06\xd5\x82\xea\x41\x8d\xa0\x66\x50\x2b\xa8\x1d\xd4\x09\xea\x06\xf5\x82\xfa\x41\x83\xa0\x61\xd0\x28\x68\x1c\x34\x09\x9a\x06\xcd\x82\xe6\x41\x8b\xa0\x65\xd0\x2a\x68\x1d\xb4\x09\xda\x06\xed\x82\xf6\x41\x87\xa0\x63\xd0\x29\xe8\x1c\x74\x09\xba\x06\xdd\x82\xee\x41\x8f\xa0\x67\xd0\x2b\xe8\x1d\xf4\x09\xfa\x06\xfd\x82\xfe\xc1\x80\x60\x60\x30\x28\x18\x1c\x0c\x09\x86\x06\xc3\x82\xe1\xc1\x88\x60\x64\x30\x2a\x18\x1d\x8c\x09\xc6\x06\xe3\x82\xf1\xc1\x84\x60\x62\x30\x29\x98\x1c\x4c\x09\xa6\x06\xd3\x82\xe9\xc1\x8c\x60\x66\x30\x2b\x98\x1d\xcc\x09\xe6\x06\xf3\x82\xf9\xc1\x82\x60\x61\xb0\x28\x58\x1c\x2c\x09\x96\x06\xcb\x82\xe5\xc1\x8a\x60\x65\xb0\x2a\x58\x1d\xac\x09\xd6\x06\xeb\x82\xf5\xc1\x86\x60\x63\xb0\x29\xd8\x1c\x6c\x09\xb6\x06\xdb\x82\xed\xc1\x8e\x60\x67\xb0\x2b\xd8\x1d\xec\x09\xf6\x06\xfb\x82\xfd\xc1\x81\xe0\x60\x70\x28\x38\x1c\x1c\x09\x8e\x06\xc7\x82\xe3\xc1\x89\xe0\x64\x70\x2a\x38\x1d\x9c\x09\xce\x06\xe7\x82\xf3\xc1\x85\xe0\x62\x70\x29\xb8\x1c\x5c\x09\xae\x06\xd7\x82\xeb\xc1\x8d\xe0\x66\x70\x2b\xb8\x1d\xdc\x09\xee\x06\xf7\x82\xfb\xc1\x83\xe0\x61\xf0\x28\x78\x1c\x3c\x09\x9e\x06\xcf\x82\xe7\xc1\x8b\xe0\x65\xf0\x2a\x78\x1d\xbc\x09\xde\x06\xef\x82\xf7\xc1\x87\xe0\x63\xf0\x29\xf8\x1c\x7c\x09\xbe\x06\xdf\x82\xef\xc1\x8f\xe0\x67\xf0\x2b\xf8\x1d\xfc\x09\xfe\x06\xff\xc2\x04\x61\xc2\x30\x51\x98\x38\x4c\x12\x26\x0d\x93\x85\xc9\xc3\x14\x61\xca\x30\x55\x98\x3a\x4c\x13\xa6\x0d\xd3\x85\xe9\xc3\x0c\x21\x16\xe2\x21\x11\x92\x21\x15\xd2\x21\x13\xb2\x21\x17\xf2\xa1\x10\x8a\xa1\x14\xca\xa1\x12\xaa\xa1\x16\xea\xa1\x11\x9a\xa1\x15\xda\xa1\x13\xba\xa1\x17\xfa\x61\x10\x86\x61\x14\x82\x10\x86\x28\x8c\xc3\x8c\x61\xa6\x30\x73\x98\x25\xcc\x1a\x66\x0b\xb3\x87\x39\xc2\x9c\x61\xae\x30\x77\x98\x27\xcc\x1b\xe6\x0b\xf3\x87\x05\xc2\x82\x61\xa1\xb0\x70\x58\x24\x2c\x1a\x16\x0b\x8b\x87\x25\xc2\x92\x61\xa9\xb0\x74\x58\x26\x2c\x1b\x96\x0b\xcb\x87\x15\xc2\x8a\x61\xa5\xb0\x72\x58\x25\xac\x1a\x56\x0b\xab\x87\x35\xc2\x9a\x61\xad\xb0\x76\x58\x27\xac\x1b\xd6\x0b\xeb\x87\x0d\xc2\x86\x61\xa3\xb0\x71\xd8\x24\x6c\x1a\x36\x0b\x9b\x87\x2d\xc2\x96\x61\xab\xb0\x75\xd8\x26\x6c\x1b\xb6\x0b\xdb\x87\x1d\xc2\x8e\x61\xa7\xb0\x73\xd8\x25\xec\x1a\x76\x0b\xbb\x87\x3d\xc2\x9e\x61\xaf\xb0\x77\xd8\x27\xec\x1b\xf6\x0b\xfb\x87\x03\xc2\x81\xe1\xa0\x70\x70\x38\x24\x1c\x1a\x0e\x0b\x87\x87\x23\xc2\x91\xe1\xa8\x70\x74\x38\x26\x1c\x1b\x8e\x0b\xc7\x87\x13\xc2\x89\xe1\xa4\x70\x72\x38\x25\x9c\x1a\x4e\x0b\xa7\x87\x33\xc2\x99\xe1\xac\x70\x76\x38\x27\x9c\x1b\xce\x0b\xe7\x87\x0b\xc2\x85\xe1\xa2\x70\x71\xb8\x24\x5c\x1a\x2e\x0b\x97\x87\x2b\xc2\x95\xe1\xaa\x70\x75\xb8\x26\x5c\x1b\xae\x0b\xd7\x87\x1b\xc2\x8d\xe1\xa6\x70\x73\xb8\x25\xdc\x1a\x6e\x0b\xb7\x87\x3b\xc2\x9d\xe1\xae\x70\x77\xb8\x27\xdc\x1b\xee\x0b\xf7\x87\x07\xc2\x83\xe1\xa1\xf0\x70\x78\x24\x3c\x1a\x1e\x0b\x8f\x87\x27\xc2\x93\xe1\xa9\xf0\x74\x78\x26\x3c\x1b\x9e\x0b\xcf\x87\x17\xc2\x8b\xe1\xa5\xf0\x72\x78\x25\xbc\x1a\x5e\x0b\xaf\x87\x37\xc2\x9b\xe1\xad\xf0\x76\x78\x27\xbc\x1b\xde\x0b\xef\x87\x0f\xc2\x87\xe1\xa3\xf0\x71\xf8\x24\x7c\x1a\x3e\x0b\x9f\x87\x2f\xc2\x97\xe1\xab\xf0\x75\xf8\x26\x7c\x1b\xbe\x0b\xdf\x87\x1f\xc2\x8f\xe1\xa7\xf0\x73\xf8\x25\xfc\x1a\x7e\x0b\xbf\x87\x3f\xc2\x9f\xe1\xaf\xf0\x77\xf8\x27\xfc\x1b\xfe\x8b\x12\x44\x09\xa3\x44\x51\xe2\x28\x49\x94\x34\x4a\x16\x25\x8f\x52\x44\x29\xa3\x54\x51\xea\x28\x4d\x94\x36\x4a\x17\xa5\x8f\x32\x44\x58\x84\x47\x44\x44\x46\x54\x44\x47\x4c\xc4\x46\x5c\xc4\x47\x42\x24\x46\x52\x24\x47\x4a\xa4\x46\x5a\xa4\x47\x46\x64\x46\x56\x64\x47\x4e\xe4\x46\x5e\xe4\x47\x41\x14\x46\x51\x04\x22\x18\xa1\x28\x8e\x32\x46\x99\xa2\xcc\x51\x96\x28\x6b\x94\x2d\xca\x1e\xe5\x88\x72\x46\xb9\xa2\xdc\x51\x9e\x28\x6f\x94\x2f\xca\x1f\x15\x88\x0a\x46\x85\xa2\xc2\x51\x91\xa8\x68\x54\x2c\x2a\x1e\x95\x88\x4a\x46\xa5\xa2\xd2\x51\x99\xa8\x6c\x54\x2e\x2a\x1f\x55\x88\x2a\x46\x95\xa2\xca\x51\x95\xa8\x6a\x54\x2d\xaa\x1e\xd5\x88\x6a\x46\xb5\xa2\xda\x51\x9d\xa8\x6e\x54\x2f\xaa\x1f\x35\x88\x1a\x46\x8d\xa2\xc6\x51\x93\xa8\x69\xd4\x2c\x6a\x1e\xb5\x88\x5a\x46\xad\xa2\xd6\x51\x9b\xa8\x6d\xd4\x2e\x6a\x1f\x75\x88\x3a\x46\x9d\xa2\xce\x51\x97\xa8\x6b\xd4\x2d\xea\x1e\xf5\x88\x7a\x46\xbd\xa2\xde\x51\x9f\xa8\x6f\xd4\x2f\xea\x1f\x0d\x88\x06\x46\x83\xa2\xc1\xd1\x90\x68\x68\x34\x2c\x1a\x1e\x8d\x88\x46\x46\xa3\xa2\xd1\xd1\x98\x68\x6c\x34\x2e\x1a\x1f\x4d\x88\x26\x46\x93\xa2\xc9\xd1\x94\x68\x6a\x34\x2d\x9a\x1e\xcd\x88\x66\x46\xb3\xa2\xd9\xd1\x9c\x68\x6e\x34\x2f\x9a\x1f\x2d\x88\x16\x46\x8b\xa2\xc5\xd1\x92\x68\x69\xb4\x2c\x5a\x1e\xad\x88\x56\x46\xab\xa2\xd5\xd1\x9a\x68\x6d\xb4\x2e\x5a\x1f\x6d\x88\x36\x46\x9b\xa2\xcd\xd1\x96\x68\x6b\xb4\x2d\xda\x1e\xed\x88\x76\x46\xbb\xa2\xdd\xd1\x9e\x68\x6f\xb4\x2f\xda\x1f\x1d\x88\x0e\x46\x87\xa2\xc3\xd1\x91\xe8\x68\x74\x2c\x3a\x1e\x9d\x88\x4e\x46\xa7\xa2\xd3\xd1\x99\xe8\x6c\x74\x2e\x3a\x1f\x5d\x88\x2e\x46\x97\xa2\xcb\xd1\x95\xe8\x6a\x74\x2d\xba\x1e\xdd\x88\x6e\x46\xb7\xa2\xdb\xd1\x9d\xe8\x6e\x74\x2f\xba\x1f\x3d\x88\x1e\x46\x8f\xa2\xc7\xd1\x93\xe8\x69\xf4\x2c\x7a\x1e\xbd\x88\x5e\x46\xaf\xa2\xd7\xd1\x9b\xe8\x6d\xf4\x2e\x7a\x1f\x7d\x88\x3e\x46\x9f\xa2\xcf\xd1\x97\xe8\x6b\xf4\x2d\xfa\x1e\xfd\x88\x7e\x46\xbf\xa2\xdf\xd1\x9f\xe8\x6f\xf4\x0f\x24\x00\x09\x41\x22\x90\x18\x24\x01\x49\x41\x32\x90\x1c\xa4\x00\x29\x41\x2a\x90\x1a\xa4\x01\x69\x41\x3a\x90\x1e\x64\x00\x18\xc0\x01\x01\x48\x40\x01\x1a\x30\x80\x05\x1c\xe0\x81\x00\x44\x20\x01\x19\x28\x40\x05\x1a\xd0\x81\x01\x4c\x60\x01\x1b\x38\xc0\x05\x1e\xf0\x41\x00\x42\x10\x01\x00\x20\x40\x20\x06\x19\x41\x26\x90\x19\x64\x01\x59\x41\x36\x90\x1d\xe4\x00\x39\x41\x2e\x90\x1b\xe4\x01\x79\x41\x3e\x90\x1f\x14\x00\x05\x41\x21\x50\x18\x14\x01\x45\x41\x31\x50\x1c\x94\x00\x25\x41\x29\x50\x1a\x94\x01\x65\x41\x39\x50\x1e\x54\x00\x15\x41\x25\x50\x19\x54\x01\x55\x41\x35\x50\x1d\xd4\x00\x35\x41\x2d\x50\x1b\xd4\x01\x75\x41\x3d\x50\x1f\x34\x00\x0d\x41\x23\xd0\x18\x34\x01\x4d\x41\x33\xd0\x1c\xb4\x00\x2d\x41\x2b\xd0\x1a\xb4\x01\x6d\x41\x3b\xd0\x1e\x74\x00\x1d\x41\x27\xd0\x19\x74\x01\x5d\x41\x37\xd0\x1d\xf4\x00\x3d\x41\x2f\xd0\x1b\xf4\x01\x7d\x41\x3f\xd0\x1f\x0c\x00\x03\xc1\x20\x30\x18\x0c\x01\x43\xc1\x30\x30\x1c\x8c\x00\x23\xc1\x28\x30\x1a\x8c\x01\x63\xc1\x38\x30\x1e\x4c\x00\x13\xc1\x24\x30\x19\x4c\x01\x53\xc1\x34\x30\x1d\xcc\x00\x33\xc1\x2c\x30\x1b\xcc\x01\x73\xc1\x3c\x30\x1f\x2c\x00\x0b\xc1\x22\xb0\x18\x2c\x01\x4b\xc1\x32\xb0\x1c\xac\x00\x2b\xc1\x2a\xb0\x1a\xac\x01\x6b\xc1\x3a\xb0\x1e\x6c\x00\x1b\xc1\x26\xb0\x19\x6c\x01\x5b\xc1\x36\xb0\x1d\xec\x00\x3b\xc1\x2e\xb0\x1b\xec\x01\x7b\xc1\x3e\xb0\x1f\x1c\x00\x07\xc1\x21\x70\x18\x1c\x01\x47\xc1\x31\x70\x1c\x9c\x00\x27\xc1\x29\x70\x1a\x9c\x01\x67\xc1\x39\x70\x1e\x5c\x00\x17\xc1\x25\x70\x19\x5c\x01\x57\xc1\x35\x70\x1d\xdc\x00\x37\xc1\x2d\x70\x1b\xdc\x01\x77\xc1\x3d\x70\x1f\x3c\x00\x0f\xc1\x23\xf0\x18\x3c\x01\x4f\xc1\x33\xf0\x1c\xbc\x00\x2f\xc1\x2b\xf0\x1a\xbc\x01\x6f\xc1\x3b\xf0\x1e\x7c\x00\x1f\xc1\x27\xf0\x19\x7c\x01\x5f\xc1\x37\xf0\x1d\xfc\x00\x3f\xc1\x2f\xf0\x1b\xfc\x01\x7f\xc1\x3f\x98\x00\x26\x84\x89\x60\x62\x98\x04\x26\x85\xc9\x60\x72\x98\x02\xa6\x84\xa9\x60\x6a\x98\x06\xa6\x85\xe9\x60\x7a\x98\x01\x62\x10\x87\x04\x24\x21\x05\x69\xc8\x40\x16\x72\x90\x87\x02\x14\xa1\x04\x65\xa8\x40\x15\x6a\x50\x87\x06\x34\xa1\x05\x6d\xe8\x40\x17\x7a\xd0\x87\x01\x0c\x61\x04\x01\x84\x10\xc1\x18\x66\x84\x99\x60\x66\x98\x05\x66\x85\xd9\x60\x76\x98\x03\xe6\x84\xb9\x60\x6e\x98\x07\xe6\x85\xf9\x60\x7e\x58\x00\x16\x84\x85\x60\x61\x58\x04\x16\x85\xc5\x60\x71\x58\x02\x96\x84\xa5\x60\x69\x58\x06\x96\x85\xe5\x60\x79\x58\x01\x56\x84\x95\x60\x65\x58\x05\x56\x85\xd5\x60\x75\x58\x03\xd6\x84\xb5\x60\x6d\x58\x07\xd6\x85\xf5\x60\x7d\xd8\x00\x36\x84\x8d\x60\x63\xd8\x04\x36\x85\xcd\x60\x73\xd8\x02\xb6\x84\xad\x60\x6b\xd8\x06\xb6\x85\xed\x60\x7b\xd8\x01\x76\x84\x9d\x60\x67\xd8\x05\x76\x85\xdd\x60\x77\xd8\x03\xf6\x84\xbd\x60\x6f\xd8\x07\xf6\x85\xfd\x60\x7f\x38\x00\x0e\x84\x83\xe0\x60\x38\x04\x0e\x85\xc3\xe0\x70\x38\x02\x8e\x84\xa3\xe0\x68\x38\x06\x8e\x85\xe3\xe0\x78\x38\x01\x4e\x84\x93\xe0\x64\x38\x05\x4e\x85\xd3\xe0\x74\x38\x03\xce\x84\xb3\xe0\x6c\x38\x07\xce\x85\xf3\xe0\x7c\xb8\x00\x2e\x84\x8b\xe0\x62\xb8\x04\x2e\x85\xcb\xe0\x72\xb8\x02\xae\x84\xab\xe0\x6a\xb8\x06\xae\x85\xeb\xe0\x7a\xb8\x01\x6e\x84\x9b\xe0\x66\xb8\x05\x6e\x85\xdb\xe0\x76\xb8\x03\xee\x84\xbb\xe0\x6e\xb8\x07\xee\x85\xfb\xe0\x7e\x78\x00\x1e\x84\x87\xe0\x61\x78\x04\x1e\x85\xc7\xe0\x71\x78\x02\x9e\x84\xa7\xe0\x69\x78\x06\x9e\x85\xe7\xe0\x79\x78\x01\x5e\x84\x97\xe0\x65\x78\x05\x5e\x85\xd7\xe0\x75\x78\x03\xde\x84\xb7\xe0\x6d\x78\x07\xde\x85\xf7\xe0\x7d\xf8\x00\x3e\x84\x8f\xe0\x63\xf8\x04\x3e\x85\xcf\xe0\x73\xf8\x02\xbe\x84\xaf\xe0\x6b\xf8\x06\xbe\x85\xef\xe0\x7b\xf8\x01\x7e\x84\x9f\xe0\x67\xf8\x05\x7e\x85\xdf\xe0\x77\xf8\x03\xfe\x84\xbf\xe0\x6f\xf8\x07\xfe\x85\xff\x50\x02\x94\x10\x25\x42\x89\x51\x12\x94\x14\x25\x43\xc9\x51\x0a\x94\x12\xa5\x42\xa9\x51\x1a\x94\x16\xa5\x43\xe9\x51\x06\x84\x21\x1c\x11\x88\x44\x14\xa2\x11\x83\x58\xc4\x21\x1e\x09\x48\x44\x12\x92\x91\x82\x54\xa4\x21\x1d\x19\xc8\x44\x16\xb2\x91\x83\x5c\xe4\x21\x1f\x05\x28\x44\x11\x02\x08\x22\x84\x62\x94\x11\x65\x42\x99\x51\x16\x94\x15\x65\x43\xd9\x51\x0e\x94\x13\xe5\x42\xb9\x51\x1e\x94\x17\xe5\x43\xf9\x51\x01\x54\x10\x15\x42\x85\x51\x11\x54\x14\x15\x43\xc5\x51\x09\x54\x12\x95\x42\xa5\x51\x19\x54\x16\x95\x43\xe5\x51\x05\x54\x11\x55\x42\x95\x51\x15\x54\x15\x55\x43\xd5\x51\x0d\x54\x13\xd5\x42\xb5\x51\x1d\x54\x17\xd5\x43\xf5\x51\x03\xd4\x10\x35\x42\x8d\x51\x13\xd4\x14\x35\x43\xcd\x51\x0b\xd4\x12\xb5\x42\xad\x51\x1b\xd4\x16\xb5\x43\xed\x51\x07\xd4\x11\x75\x42\x9d\x51\x17\xd4\x15\x75\x43\xdd\x51\x0f\xd4\x13\xf5\x42\xbd\x51\x1f\xd4\x17\xf5\x43\xfd\xd1\x00\x34\x10\x0d\x42\x83\xd1\x10\x34\x14\x0d\x43\xc3\xd1\x08\x34\x12\x8d\x42\xa3\xd1\x18\x34\x16\x8d\x43\xe3\xd1\x04\x34\x11\x4d\x42\x93\xd1\x14\x34\x15\x4d\x43\xd3\xd1\x0c\x34\x13\xcd\x42\xb3\xd1\x1c\x34\x17\xcd\x43\xf3\xd1\x02\xb4\x10\x2d\x42\x8b\xd1\x12\xb4\x14\x2d\x43\xcb\xd1\x0a\xb4\x12\xad\x42\xab\xd1\x1a\xb4\x16\xad\x43\xeb\xd1\x06\xb4\x11\x6d\x42\x9b\xd1\x16\xb4\x15\x6d\x43\xdb\xd1\x0e\xb4\x13\xed\x42\xbb\xd1\x1e\xb4\x17\xed\x43\xfb\xd1\x01\x74\x10\x1d\x42\x87\xd1\x11\x74\x14\x1d\x43\xc7\xd1\x09\x74\x12\x9d\x42\xa7\xd1\x19\x74\x16\x9d\x43\xe7\xd1\x05\x74\x11\x5d\x42\x97\xd1\x15\x74\x15\x5d\x43\xd7\xd1\x0d\x74\x13\xdd\x42\xb7\xd1\x1d\x74\x17\xdd\x43\xf7\xd1\x03\xf4\x10\x3d\x42\x8f\xd1\x13\xf4\x14\x3d\x43\xcf\xd1\x0b\xf4\x12\xbd\x42\xaf\xd1\x1b\xf4\x16\xbd\x43\xef\xd1\x07\xf4\x11\x7d\x42\x9f\xd1\x17\xf4\x15\x7d\x43\xdf\xd1\x0f\xf4\x13\xfd\x42\xbf\xd1\x1f\xf4\x17\xfd\x8b\x13\xc4\x09\xe3\x44\x71\xe2\x38\x49\x9c\x34\x4e\x16\x27\x8f\x53\xc4\x29\xe3\x54\x71\xea\x38\x4d\x9c\x36\x4e\x17\xa7\x8f\x33\xc4\x58\x8c\xc7\x44\x4c\xc6\x54\x4c\xc7\x4c\xcc\xc6\x5c\xcc\xc7\x42\x2c\xc6\x52\x2c\xc7\x4a\xac\xc6\x5a\xac\xc7\x46\x6c\xc6\x56\x6c\xc7\x4e\xec\xc6\x5e\xec\xc7\x41\x1c\xc6\x51\x0c\x62\x18\xa3\x38\x8e\x33\xc6\x99\xe2\xcc\x71\x96\x38\x6b\x9c\x2d\xce\x1e\xe7\x88\x73\xc6\xb9\xe2\xdc\x71\x9e\x38\x6f\x9c\x2f\xce\x1f\x17\x88\x0b\xc6\x85\xe2\xc2\x71\x91\xb8\x68\x5c\x2c\x2e\x1e\x97\x88\x4b\xc6\xa5\xe2\xd2\x71\x99\xb8\x6c\x5c\x2e\x2e\x1f\x57\x88\x2b\xc6\x95\xe2\xca\x71\x95\xb8\x6a\x5c\x2d\xae\x1e\xd7\x88\x6b\xc6\xb5\xe2\xda\x71\x9d\xb8\x6e\x5c\x2f\xae\x1f\x37\x88\x1b\xc6\x8d\xe2\xc6\x71\x93\xb8\x69\xdc\x2c\x6e\x1e\xb7\x88\x5b\xc6\xad\xe2\xd6\x71\x9b\xb8\x6d\xdc\x2e\x6e\x1f\x77\xf8\x4f\x00\x3c\x00\x80\x11\x02\x00\x00\x9c\x6d\xdb\xf6\xdb\xb6\xaa\x9f\x6d\xdb\xb6\x6d\xdb\xb6\x6d\xdb\xb6\x6d\xfb\xb0\x8e\x58\x27\xac\x33\xd6\x05\xeb\x8a\x75\xc3\xba\x63\x3d\xb0\x9e\x58\x2f\xac\x37\xd6\x07\xeb\x8b\xf5\xc3\xfa\x63\x03\xb0\x81\xd8\x20\x6c\x30\x36\x04\x1b\x8a\x0d\xc3\x86\x63\x23\xb0\x91\xd8\x28\x6c\x34\x36\x06\x1b\x8b\x8d\xc3\xc6\x63\x13\xb0\x89\xd8\x24\x6c\x32\x36\x05\x9b\x8a\x4d\xc3\xa6\x63\x33\xb0\x99\xd8\x2c\x6c\x36\x36\x07\x9b\x8b\xcd\xc3\xe6\x63\x0b\xb0\x85\xd8\x22\x6c\x31\xb6\x04\x5b\x8a\x2d\xc3\x96\x63\x2b\xb0\x95\xd8\x2a\x6c\x35\xb6\x06\x5b\x8b\xad\xc3\xd6\x63\x1b\xb0\x8d\xd8\x26\x6c\x33\xb6\x05\xdb\x8a\x6d\xc3\xb6\x63\x3b\xb0\x9d\xd8\x2e\x6c\x37\xb6\x07\xdb\x8b\xed\xc3\xf6\x63\x07\xb0\x83\xd8\x21\xec\x30\x76\x04\x3b\x8a\x1d\xc3\x8e\x63\x27\xb0\x93\xd8\x29\xec\x34\x76\x06\x3b\x8b\x9d\xc3\xce\x63\x17\xb0\x8b\xd8\x25\xec\x32\x76\x05\xbb\x8a\x5d\xc3\xae\x63\x37\xb0\x9b\xd8\x2d\xec\x36\x76\x07\xbb\x8b\xdd\xc3\xee\x63\x0f\xb0\x87\xd8\x23\xec\x31\xf6\x04\x7b\x8a\x3d\xc3\x9e\x63\x2f\xb0\x97\xd8\x2b\xec\x35\xf6\x06\x7b\x8b\xbd\xc3\xde\x63\x1f\xb0\x8f\xd8\x27\xec\x33\xf6\x05\xfb\x8a\x7d\xc3\xbe\x63\x3f\xb0\x9f\xd8\x2f\xec\x37\xf6\x07\xfb\x8b\xfd\xc3\x13\xe0\x09\xf1\x44\x78\x62\x3c\x09\x9e\x14\x4f\x86\x27\xc7\x53\xe0\x29\xf1\x54\x78\x6a\x3c\x0d\x9e\x16\x4f\x87\xa7\xc7\x33\xe0\x19\xf1\x4c\x78\x66\x3c\x0b\x9e\x15\xcf\x86\x67\xc7\x73\xe0\x39\xf1\x5c\x78\x6e\x3c\x0f\x9e\x17\xcf\x87\xe7\xc7\x0b\xe0\x05\xf1\x42\x78\x61\xbc\x08\x5e\x14\x2f\x86\x17\xc7\x4b\xe0\x25\xf1\x52\x78\x69\xbc\x0c\x5e\x16\x2f\x87\x97\xc7\x2b\xe0\x18\x8e\xe3\x04\x4e\xe2\x14\x4e\xe3\x0c\xce\xe2\x1c\xce\xe3\x02\x2e\xe2\x12\x2e\xe3\x0a\xae\xe2\x1a\xae\xe3\x06\x6e\xe2\x16\x6e\xe3\x0e\xee\xe2\x1e\xee\xe3\x01\x1e\xe2\x11\x0e\x70\x88\x23\x3c\xc6\x2b\xe2\x95\xf0\xca\x78\x15\xbc\x2a\x5e\x0d\xaf\x8e\xd7\xc0\x6b\xe2\xb5\xf0\xda\x78\x1d\xbc\x2e\x5e\x0f\xaf\x8f\x37\xc0\x1b\xe2\x8d\xf0\xc6\x78\x13\xbc\x29\xde\x0c\x6f\x8e\xb7\xc0\x5b\xe2\xad\xf0\xd6\x78\x1b\xbc\x2d\xde\x0e\x6f\x8f\x77\xc0\x3b\xe2\x9d\xf0\xce\x78\x17\xbc\x2b\xde\x0d\xef\x8e\xf7\xc0\x7b\xe2\xbd\xf0\xde\x78\x1f\xbc\x2f\xde\x0f\xef\x8f\x0f\xc0\x07\xe2\x83\xf0\xc1\xf8\x10\x7c\x28\x3e\x0c\x1f\x8e\x8f\xc0\x47\xe2\xa3\xf0\xd1\xf8\x18\x7c\x2c\x3e\x0e\x1f\x8f\x4f\xc0\x27\xe2\x93\xf0\xc9\xf8\x14\x7c\x2a\x3e\x0d\x9f\x8e\xcf\xc0\x67\xe2\xb3\xf0\xd9\xf8\x1c\x7c\x2e\x3e\x0f\x9f\x8f\x2f\xc0\x17\xe2\x8b\xf0\xc5\xf8\x12\x7c\x29\xbe\x0c\x5f\x8e\xaf\xc0\x57\xe2\xab\xf0\xd5\xf8\x1a\x7c\x2d\xbe\x0e\x5f\x8f\x6f\xc0\x37\xe2\x9b\xf0\xcd\xf8\x16\x7c\x2b\xbe\x0d\xdf\x8e\xef\xc0\x77\xe2\xbb\xf0\xdd\xf8\x1e\x7c\x2f\xbe\x0f\xdf\x8f\x1f\xc0\x0f\xe2\x87\xf0\xc3\xf8\x11\xfc\x28\x7e\x0c\x3f\x8e\x9f\xc0\x4f\xe2\xa7\xf0\xd3\xf8\x19\xfc\x2c\x7e\x0e\x3f\x8f\x5f\xc0\x2f\xe2\x97\xf0\xcb\xf8\x15\xfc\x2a\x7e\x0d\xbf\x8e\xdf\xc0\x6f\xe2\xb7\xf0\xdb\xf8\x1d\xfc\x2e\x7e\x0f\xbf\x8f\x3f\xc0\x1f\xe2\x8f\xf0\xc7\xf8\x13\xfc\x29\xfe\x0c\x7f\x8e\xbf\xc0\x5f\xe2\xaf\xf0\xd7\xf8\x1b\xfc\x2d\xfe\x0e\x7f\x8f\x7f\xc0\x3f\xe2\x9f\xf0\xcf\xf8\x17\xfc\x2b\xfe\x0d\xff\x8e\xff\xc0\x7f\xe2\xbf\xf0\xdf\xf8\x1f\xfc\x2f\xfe\x8f\x48\x40\x24\x24\x12\x11\x89\x89\x24\x44\x52\x22\x19\x91\x9c\x48\x41\xa4\x24\x52\x11\xa9\x89\x34\x44\x5a\x22\x1d\x91\x9e\xc8\x40\x64\x24\x32\x11\x99\x89\x2c\x44\x56\x22\x1b\x91\x9d\xc8\x41\xe4\x24\x72\x11\xb9\x89\x3c\x44\x5e\x22\x1f\x91\x9f\x28\x40\x14\x24\x0a\x11\x85\x89\x22\x44\x51\xa2\x18\x51\x9c\x28\x41\x94\x24\x4a\x11\xa5\x89\x32\x44\x59\xa2\x1c\x51\x9e\xa8\x40\x60\x04\x4e\x10\x04\x49\x50\x04\x4d\x30\x04\x4b\x70\x04\x4f\x08\x84\x48\x48\x84\x4c\x28\x84\x4a\x68\x84\x4e\x18\x84\x49\x58\x84\x4d\x38\x84\x4b\x78\x84\x4f\x04\x44\x48\x44\x04\x20\x20\x81\x88\x98\xa8\x48\x54\x22\x2a\x13\x55\x88\xaa\x44\x35\xa2\x3a\x51\x83\xa8\x49\xd4\x22\x6a\x13\x75\x88\xba\x44\x3d\xa2\x3e\xd1\x80\x68\x48\x34\x22\x1a\x13\x4d\x88\xa6\x44\x33\xa2\x39\xd1\x82\x68\x49\xb4\x22\x5a\x13\x6d\x88\xb6\x44\x3b\xa2\x3d\xd1\x81\xe8\x48\x74\x22\x3a\x13\x5d\x88\xae\x44\x37\xa2\x3b\xd1\x83\xe8\x49\xf4\x22\x7a\x13\x7d\x88\xbe\x44\x3f\xa2\x3f\x31\x80\x18\x48\x0c\x22\x06\x13\x43\x88\xa1\xc4\x30\x62\x38\x31\x82\x18\x49\x8c\x22\x46\x13\x63\x88\xb1\xc4\x38\x62\x3c\x31\x81\x98\x48\x4c\x22\x26\x13\x53\x88\xa9\xc4\x34\x62\x3a\x31\x83\x98\x49\xcc\x22\x66\x13\x73\x88\xb9\xc4\x3c\x62\x3e\xb1\x80\x58\x48\x2c\x22\x16\x13\x4b\x88\xa5\xc4\x32\x62\x39\xb1\x82\x58\x49\xac\x22\x56\x13\x6b\x88\xb5\xc4\x3a\x62\x3d\xb1\x81\xd8\x48\x6c\x22\x36\x13\x5b\x88\xad\xc4\x36\x62\x3b\xb1\x83\xd8\x49\xec\x22\x76\x13\x7b\x88\xbd\xc4\x3e\x62\x3f\x71\x80\x38\x48\x1c\x22\x0e\x13\x47\x88\xa3\xc4\x31\xe2\x38\x71\x82\x38\x49\x9c\x22\x4e\x13\x67\x88\xb3\xc4\x39\xe2\x3c\x71\x81\xb8\x48\x5c\x22\x2e\x13\x57\x88\xab\xc4\x35\xe2\x3a\x71\x83\xb8\x49\xdc\x22\x6e\x13\x77\x88\xbb\xc4\x3d\xe2\x3e\xf1\x80\x78\x48\x3c\x22\x1e\x13\x4f\x88\xa7\xc4\x33\xe2\x39\xf1\x82\x78\x49\xbc\x22\x5e\x13\x6f\x88\xb7\xc4\x3b\xe2\x3d\xf1\x81\xf8\x48\x7c\x22\x3e\x13\x5f\x88\xaf\xc4\x37\xe2\x3b\xf1\x83\xf8\x49\xfc\x22\x7e\x13\x7f\x88\xbf\xc4\x3f\x32\x01\x99\x90\x4c\x44\x26\x26\x93\x90\x49\xc9\x64\x64\x72\x32\x05\x99\x92\x4c\x45\xa6\x26\xd3\x90\x69\xc9\x74\x64\x7a\x32\x03\x99\x91\xcc\x44\x66\x26\xb3\x90\x59\xc9\x6c\x64\x76\x32\x07\x99\x93\xcc\x45\xe6\x26\xf3\x90\x79\xc9\x7c\x64\x7e\xb2\x00\x59\x90\x2c\x44\x16\x26\x8b\x90\x45\xc9\x62\x64\x71\xb2\x04\x59\x92\x2c\x45\x96\x26\xcb\x90\x65\xc9\x72\x64\x79\xb2\x02\x89\x91\x38\x49\x90\x24\x49\x91\x34\xc9\x90\x2c\xc9\x91\x3c\x29\x90\x22\x29\x91\x32\xa9\x90\x2a\xa9\x91\x3a\x69\x90\x26\x69\x91\x36\xe9\x90\x2e\xe9\x91\x3e\x19\x90\x21\x19\x91\x80\x84\x24\x22\x63\xb2\x22\x59\x89\xac\x4c\x56\x21\xab\x92\xd5\xc8\xea\x64\x0d\xb2\x26\x59\x8b\xac\x4d\xd6\x21\xeb\x92\xf5\xc8\xfa\x64\x03\xb2\x21\xd9\x88\x6c\x4c\x36\x21\x9b\x92\xcd\xc8\xe6\x64\x0b\xb2\x25\xd9\x8a\x6c\x4d\xb6\x21\xdb\x92\xed\xc8\xf6\x64\x07\xb2\x23\xd9\x89\xec\x4c\x76\x21\xbb\x92\xdd\xc8\xee\x64\x0f\xb2\x27\xd9\x8b\xec\x4d\xf6\x21\xfb\x92\xfd\xc8\xfe\xe4\x00\x72\x20\x39\x88\x1c\x4c\x0e\x21\x87\x92\xc3\xc8\xe1\xe4\x08\x72\x24\x39\x8a\x1c\x4d\x8e\x21\xc7\x92\xe3\xc8\xf1\xe4\x04\x72\x22\x39\x89\x9c\x4c\x4e\x21\xa7\x92\xd3\xc8\xe9\xe4\x0c\x72\x26\x39\x8b\x9c\x4d\xce\x21\xe7\x92\xf3\xc8\xf9\xe4\x02\x72\x21\xb9\x88\x5c\x4c\x2e\x21\x97\x92\xcb\xc8\xe5\xe4\x0a\x72\x25\xb9\x8a\x5c\x4d\xae\x21\xd7\x92\xeb\xc8\xf5\xe4\x06\x72\x23\xb9\x89\xdc\x4c\x6e\x21\xb7\x92\xdb\xc8\xed\xe4\x0e\x72\x27\xb9\x8b\xdc\x4d\xee\x21\xf7\x92\xfb\xc8\xfd\xe4\x01\xf2\x20\x79\x88\x3c\x4c\x1e\x21\x8f\x92\xc7\xc8\xe3\xe4\x09\xf2\x24\x79\x8a\x3c\x4d\x9e\x21\xcf\x92\xe7\xc8\xf3\xe4\x05\xf2\x22\x79\x89\xbc\x4c\x5e\x21\xaf\x92\xd7\xc8\xeb\xe4\x0d\xf2\x26\x79\x8b\xbc\x4d\xde\x21\xef\x92\xf7\xc8\xfb\xe4\x03\xf2\x21\xf9\x88\x7c\x4c\x3e\x21\x9f\x92\xcf\xc8\xe7\xe4\x0b\xf2\x25\xf9\x8a\x7c\x4d\xbe\x21\xdf\x92\xef\xc8\xf7\xe4\x07\xf2\x23\xf9\x89\xfc\x4c\x7e\x21\xbf\x92\xdf\xc8\xef\xe4\x0f\xf2\x27\xf9\x8b\xfc\x4d\xfe\x21\xff\x92\xff\xa8\x04\x54\x42\x2a\x11\x95\x98\x4a\x42\x25\xa5\x92\x51\xc9\xa9\x14\x54\x4a\x2a\x15\x95\x9a\x4a\x43\xa5\xa5\xd2\x51\xe9\xa9\x0c\x54\x46\x2a\x13\x95\x99\xca\x42\x65\xa5\xb2\x51\xd9\xa9\x1c\x54\x4e\x2a\x17\x95\x9b\xca\x43\xe5\xa5\xf2\x51\xf9\xa9\x02\x54\x41\xaa\x10\x55\x98\x2a\x42\x15\xa5\x8a\x51\xc5\xa9\x12\x54\x49\xaa\x14\x55\x9a\x2a\x43\x95\xa5\xca\x51\xe5\xa9\x0a\x14\x46\xe1\x14\x41\x91\x14\x45\xd1\x14\x43\xb1\x14\x47\xf1\x94\x40\x89\x94\x44\xc9\x94\x42\xa9\x94\x46\xe9\x94\x41\x99\x94\x45\xd9\x94\x43\xb9\x94\x47\xf9\x54\x40\x85\x54\x44\x01\x0a\x52\x88\x8a\xa9\x8a\x54\x25\xaa\x32\x55\x85\xaa\x4a\x55\xa3\xaa\x53\x35\xa8\x9a\x54\x2d\xaa\x36\x55\x87\xaa\x4b\xd5\xa3\xea\x53\x0d\xa8\x86\x54\x23\xaa\x31\xd5\x84\x6a\x4a\x35\xa3\x9a\x53\x2d\xa8\x96\x54\x2b\xaa\x35\xd5\x86\x6a\x4b\xb5\xa3\xda\x53\x1d\xa8\x8e\x54\x27\xaa\x33\xd5\x85\xea\x4a\x75\xa3\xba\x53\x3d\xa8\x9e\x54\x2f\xaa\x37\xd5\x87\xea\x4b\xf5\xa3\xfa\x53\x03\xa8\x81\xd4\x20\x6a\x30\x35\x84\x1a\x4a\x0d\xa3\x86\x53\x23\xa8\x91\xd4\x28\x6a\x34\x35\x86\x1a\x4b\x8d\xa3\xc6\x53\x13\xa8\x89\xd4\x24\x6a\x32\x35\x85\x9a\x4a\x4d\xa3\xa6\x53\x33\xa8\x99\xd4\x2c\x6a\x36\x35\x87\x9a\x4b\xcd\xa3\xe6\x53\x0b\xa8\x85\xd4\x22\x6a\x31\xb5\x84\x5a\x4a\x2d\xa3\x96\x53\x2b\xa8\x95\xd4\x2a\x6a\x35\xb5\x86\x5a\x4b\xad\xa3\xd6\x53\x1b\xa8\x8d\xd4\x26\x6a\x33\xb5\x85\xda\x4a\x6d\xa3\xb6\x53\x3b\xa8\x9d\xd4\x2e\x6a\x37\xb5\x87\xda\x4b\xed\xa3\xf6\x53\x07\xa8\x83\xd4\x21\xea\x30\x75\x84\x3a\x4a\x1d\xa3\x8e\x53\x27\xa8\x93\xd4\x29\xea\x34\x75\x86\x3a\x4b\x9d\xa3\xce\x53\x17\xa8\x8b\xd4\x25\xea\x32\x75\x85\xba\x4a\x5d\xa3\xae\x53\x37\xa8\x9b\xd4\x2d\xea\x36\x75\x87\xba\x4b\xdd\xa3\xee\x53\x0f\xa8\x87\xd4\x23\xea\x31\xf5\x84\x7a\x4a\x3d\xa3\x9e\x53\x2f\xa8\x97\xd4\x2b\xea\x35\xf5\x86\x7a\x4b\xbd\xa3\xde\x53\x1f\xa8\x8f\xd4\x27\xea\x33\xf5\x85\xfa\x4a\x7d\xa3\xbe\x53\x3f\xa8\x9f\xd4\x2f\xea\x37\xf5\x87\xfa\x4b\xfd\xa3\x13\xd0\x09\xe9\x44\x74\x62\x3a\x09\x9d\x94\x4e\x46\x27\xa7\x53\xd0\x29\xe9\x54\x74\x6a\x3a\x0d\x9d\x96\x4e\x47\xa7\xa7\x33\xd0\x19\xe9\x4c\x74\x66\x3a\x0b\x9d\x95\xce\x46\x67\xa7\x73\xd0\x39\xe9\x5c\x74\x6e\x3a\x0f\x9d\x97\xce\x47\xe7\xa7\x0b\xd0\x05\xe9\x42\x74\x61\xba\x08\x5d\x94\x2e\x46\x17\xa7\x4b\xd0\x25\xe9\x52\x74\x69\xba\x0c\x5d\x96\x2e\x47\x97\xa7\x2b\xd0\x18\x8d\xd3\x04\x4d\xd2\x14\x4d\xd3\x0c\xcd\xd2\x1c\xcd\xd3\x02\x2d\xd2\x12\x2d\xd3\x0a\xad\xd2\x1a\xad\xd3\x06\x6d\xd2\x16\x6d\xd3\x0e\xed\xd2\x1e\xed\xd3\x01\x1d\xd2\x11\x0d\x68\x48\x23\x3a\xa6\x2b\xd2\x95\xe8\xca\x74\x15\xba\x2a\x5d\x8d\xae\x4e\xd7\xa0\x6b\xd2\xb5\xe8\xda\x74\x1d\xba\x2e\x5d\x8f\xae\x4f\x37\xa0\x1b\xd2\x8d\xe8\xc6\x74\x13\xba\x29\xdd\x8c\x6e\x4e\xb7\xa0\x5b\xd2\xad\xe8\xd6\x74\x1b\xba\x2d\xdd\x8e\x6e\x4f\x77\xa0\x3b\xd2\x9d\xe8\xce\x74\x17\xba\x2b\xdd\x8d\xee\x4e\xf7\xa0\x7b\xd2\xbd\xe8\xde\x74\x1f\xba\x2f\xdd\x8f\xee\x4f\x0f\xa0\x07\xd2\x83\xe8\xc1\xf4\x10\x7a\x28\x3d\x8c\x1e\x4e\x8f\xa0\x47\xd2\xa3\xe8\xd1\xf4\x18\x7a\x2c\x3d\x8e\x1e\x4f\x4f\xa0\x27\xd2\x93\xe8\xc9\xf4\x14\x7a\x2a\x3d\x8d\x9e\x4e\xcf\xa0\x67\xd2\xb3\xe8\xd9\xf4\x1c\x7a\x2e\x3d\x8f\x9e\x4f\x2f\xa0\x17\xd2\x8b\xe8\xc5\xf4\x12\x7a\x29\xbd\x8c\x5e\x4e\xaf\xa0\x57\xd2\xab\xe8\xd5\xf4\x1a\x7a\x2d\xbd\x8e\x5e\x4f\x6f\xa0\x37\xd2\x9b\xe8\xcd\xf4\x16\x7a\x2b\xbd\x8d\xde\x4e\xef\xa0\x77\xd2\xbb\xe8\xdd\xf4\x1e\x7a\x2f\xbd\x8f\xde\x4f\x1f\xa0\x0f\xd2\x87\xe8\xc3\xf4\x11\xfa\x28\x7d\x8c\x3e\x4e\x9f\xa0\x4f\xd2\xa7\xe8\xd3\xf4\x19\xfa\x2c\x7d\x8e\x3e\x4f\x5f\xa0\x2f\xd2\x97\xe8\xcb\xf4\x15\xfa\x2a\x7d\x8d\xbe\x4e\xdf\xa0\x6f\xd2\xb7\xe8\xdb\xf4\x1d\xfa\x2e\x7d\x8f\xbe\x4f\x3f\xa0\x1f\xd2\x8f\xe8\xc7\xf4\x13\xfa\x29\xfd\x8c\x7e\x4e\xbf\xa0\x5f\xd2\xaf\xe8\xd7\xf4\x1b\xfa\x2d\xfd\x8e\x7e\x4f\x7f\xa0\x3f\xd2\x9f\xe8\xcf\xf4\x17\xfa\x2b\xfd\x8d\xfe\x4e\xff\xa0\x7f\xd2\xbf\xe8\xdf\xf4\x1f\xfa\x2f\xfd\x8f\x49\xc0\x24\x64\x12\x31\x89\x99\x24\x4c\x52\x26\x19\x93\x9c\x49\xc1\xa4\x64\x52\x31\xa9\x99\x34\x4c\x5a\x26\x1d\x93\x9e\xc9\xc0\x64\x64\x32\x31\x99\x99\x2c\x4c\x56\x26\x1b\x93\x9d\xc9\xc1\xe4\x64\x72\x31\xb9\x99\x3c\x4c\x5e\x26\x1f\x93\x9f\x29\xc0\x14\x64\x0a\x31\x85\x99\x22\x4c\x51\xa6\x18\x53\x9c\x29\xc1\x94\x64\x4a\x31\xa5\x99\x32\x4c\x59\xa6\x1c\x53\x9e\xa9\xc0\x60\x0c\xce\x10\x0c\xc9\x50\x0c\xcd\x30\x0c\xcb\x70\x0c\xcf\x08\x8c\xc8\x48\x8c\xcc\x28\x8c\xca\x68\x8c\xce\x18\x8c\xc9\x58\x8c\xcd\x38\x8c\xcb\x78\x8c\xcf\x04\x4c\xc8\x44\x0c\x60\x20\x83\x98\x98\xa9\xc8\x54\x62\x2a\x33\x55\x98\xaa\x4c\x35\xa6\x3a\x53\x83\xa9\xc9\xd4\x62\x6a\x33\x75\x98\xba\x4c\x3d\xa6\x3e\xd3\x80\x69\xc8\x34\x62\x1a\x33\x4d\x98\xa6\x4c\x33\xa6\x39\xd3\x82\x69\xc9\xb4\x62\x5a\x33\x6d\x98\xb6\x4c\x3b\xa6\x3d\xd3\x81\xe9\xc8\x74\x62\x3a\x33\x5d\x98\xae\x4c\x37\xa6\x3b\xd3\x83\xe9\xc9\xf4\x62\x7a\x33\x7d\x98\xbe\x4c\x3f\xa6\x3f\x33\x80\x19\xc8\x0c\x62\x06\x33\x43\x98\xa1\xcc\x30\x66\x38\x33\x82\x19\xc9\x8c\x62\x46\x33\x63\x98\xb1\xcc\x38\x66\x3c\x33\x81\x99\xc8\x4c\x62\x26\x33\x53\x98\xa9\xcc\x34\x66\x3a\x33\x83\x99\xc9\xcc\x62\x66\x33\x73\x98\xb9\xcc\x3c\x66\x3e\xb3\x80\x59\xc8\x2c\x62\x16\x33\x4b\x98\xa5\xcc\x32\x66\x39\xb3\x82\x59\xc9\xac\x62\x56\x33\x6b\x98\xb5\xcc\x3a\x66\x3d\xb3\x81\xd9\xc8\x6c\x62\x36\x33\x5b\x98\xad\xcc\x36\x66\x3b\xb3\x83\xd9\xc9\xec\x62\x76\x33\x7b\x98\xbd\xcc\x3e\x66\x3f\x73\x80\x39\xc8\x1c\x62\x0e\x33\x47\x98\xa3\xcc\x31\xe6\x38\x73\x82\x39\xc9\x9c\x62\x4e\x33\x67\x98\xb3\xcc\x39\xe6\x3c\x73\x81\xb9\xc8\x5c\x62\x2e\x33\x57\x98\xab\xcc\x35\xe6\x3a\x73\x83\xb9\xc9\xdc\x62\x6e\x33\x77\x98\xbb\xcc\x3d\xe6\x3e\xf3\x80\x79\xc8\x3c\x62\x1e\x33\x4f\x98\xa7\xcc\x33\xe6\x39\xf3\x82\x79\xc9\xbc\x62\x5e\x33\x6f\x98\xb7\xcc\x3b\xe6\x3d\xf3\x81\xf9\xc8\x7c\x62\x3e\x33\x5f\x98\xaf\xcc\x37\xe6\x3b\xf3\x83\xf9\xc9\xfc\x62\x7e\x33\x7f\x98\xbf\xcc\x3f\x36\x01\x9b\x90\x4d\xc4\x26\x66\x93\xb0\x49\xd9\x64\x6c\x72\x36\x05\x9b\x92\x4d\xc5\xa6\x66\xd3\xb0\x69\xd9\x74\x6c\x7a\x36\x03\x9b\x91\xcd\xc4\x66\x66\xb3\xb0\x59\xd9\x6c\x6c\x76\x36\x07\x9b\x93\xcd\xc5\xe6\x66\xf3\xb0\x79\xd9\x7c\x6c\x7e\xb6\x00\x5b\x90\x2d\xc4\x16\x66\x8b\xb0\x45\xd9\x62\x6c\x71\xb6\x04\x5b\x92\x2d\xc5\x96\x66\xcb\xb0\x65\xd9\x72\x6c\x79\xb6\x02\x8b\xb1\x38\x4b\xb0\x24\x4b\xb1\x34\xcb\xb0\x2c\xcb\xb1\x3c\x2b\xb0\x22\x2b\xb1\x32\xab\xb0\x2a\xab\xb1\x3a\x6b\xb0\x26\x6b\xb1\x36\xeb\xb0\x2e\xeb\xb1\x3e\x1b\xb0\x21\x1b\xb1\x80\x85\x2c\x62\x63\xb6\x22\x5b\x89\xad\xcc\x56\x61\xab\xb2\xd5\xd8\xea\x6c\x0d\xb6\x26\x5b\x8b\xad\xcd\xd6\x61\xeb\xb2\xf5\xd8\xfa\x6c\x03\xb6\x21\xdb\x88\x6d\xcc\x36\x61\x9b\xb2\xcd\xd8\xe6\x6c\x0b\xb6\x25\xdb\x8a\x6d\xcd\xb6\x61\xdb\xb2\xed\xd8\xf6\x6c\x07\xb6\x23\xdb\x89\xed\xcc\x76\x61\xbb\xb2\xdd\xd8\xee\x6c\x0f\xb6\x27\xdb\x8b\xed\xcd\xf6\x61\xfb\xb2\xfd\xd8\xfe\xec\x00\x76\x20\x3b\x88\x1d\xcc\x0e\x61\x87\xb2\xc3\xd8\xe1\xec\x08\x76\x24\x3b\x8a\x1d\xcd\x8e\x61\xc7\xb2\xe3\xd8\xf1\xec\x04\x76\x22\x3b\x89\x9d\xcc\x4e\x61\xa7\xb2\xd3\xd8\xe9\xec\x0c\x76\x26\x3b\x8b\x9d\xcd\xce\x61\xe7\xb2\xf3\xd8\xf9\xec\x02\x76\x21\xbb\x88\x5d\xcc\x2e\x61\x97\xb2\xcb\xd8\xe5\xec\x0a\x76\x25\xbb\x8a\x5d\xcd\xae\x61\xd7\xb2\xeb\xd8\xf5\xec\x06\x76\x23\xbb\x89\xdd\xcc\x6e\x61\xb7\xb2\xdb\xd8\xed\xec\x0e\x76\x27\xbb\x8b\xdd\xcd\xee\x61\xf7\xb2\xfb\xd8\xfd\xec\x01\xf6\x20\x7b\x88\x3d\xcc\x1e\x61\x8f\xb2\xc7\xd8\xe3\xec\x09\xf6\x24\x7b\x8a\x3d\xcd\x9e\x61\xcf\xb2\xe7\xd8\xf3\xec\x05\xf6\x22\x7b\x89\xbd\xcc\x5e\x61\xaf\xb2\xd7\xd8\xeb\xec\x0d\xf6\x26\x7b\x8b\xbd\xcd\xde\x61\xef\xb2\xf7\xd8\xfb\xec\x03\xf6\x21\xfb\x88\x7d\xcc\x3e\x61\x9f\xb2\xcf\xd8\xe7\xec\x0b\xf6\x25\xfb\x8a\x7d\xcd\xbe\x61\xdf\xb2\xef\xd8\xf7\xec\x07\xf6\x23\xfb\x89\xfd\xcc\x7e\x61\xbf\xb2\xdf\xd8\xef\xec\x0f\xf6\x27\xfb\x8b\xfd\xcd\xfe\x61\xff\xb2\xff\xb8\x04\x5c\x42\x2e\x11\x97\x98\x4b\xc2\x25\xe5\x92\x71\xc9\xb9\x14\x5c\x4a\x2e\x15\x97\x9a\x4b\xc3\xa5\xe5\xd2\x71\xe9\xb9\x0c\x5c\x46\x2e\x13\x97\x99\xcb\xc2\x65\xe5\xb2\x71\xd9\xb9\x1c\x5c\x4e\x2e\x17\x97\x9b\xcb\xc3\xe5\xe5\xf2\x71\xf9\xb9\x02\x5c\x41\xae\x10\x57\x98\x2b\xc2\x15\xe5\x8a\x71\xc5\xb9\x12\x5c\x49\xae\x14\x57\x9a\x2b\xc3\x95\xe5\xca\x71\xe5\xb9\x0a\x1c\xc6\xe1\x1c\xc1\x91\x1c\xc5\xd1\x1c\xc3\xb1\x1c\xc7\xf1\x9c\xc0\x89\x9c\xc4\xc9\x9c\xc2\xa9\x9c\xc6\xe9\x9c\xc1\x99\x9c\xc5\xd9\x9c\xc3\xb9\x9c\xc7\xf9\x5c\xc0\x85\x5c\xc4\x01\x0e\x72\x88\x8b\xb9\x8a\x5c\x25\xae\x32\x57\x85\xab\xca\x55\xe3\xaa\x73\x35\xb8\x9a\x5c\x2d\xae\x36\x57\x87\xab\xcb\xd5\xe3\xea\x73\x0d\xb8\x86\x5c\x23\xae\x31\xd7\x84\x6b\xca\x35\xe3\x9a\x73\x2d\xb8\x96\x5c\x2b\xae\x35\xd7\x86\x6b\xcb\xb5\xe3\xda\x73\x1d\xb8\x8e\x5c\x27\xae\x33\xd7\x85\xeb\xca\x75\xe3\xba\x73\x3d\xb8\x9e\x5c\x2f\xae\x37\xd7\x87\xeb\xcb\xf5\xe3\xfa\x73\x03\xb8\x81\xdc\x20\x6e\x30\x37\x84\x1b\xca\x0d\xe3\x86\x73\x23\xb8\x91\xdc\x28\x6e\x34\x37\x86\x1b\xcb\x8d\xe3\xc6\x73\x13\xb8\x89\xdc\x24\x6e\x32\x37\x85\x9b\xca\x4d\xe3\xa6\x73\x33\xb8\x99\xdc\x2c\x6e\x36\x37\x87\x9b\xcb\xcd\xe3\xe6\x73\x0b\xb8\x85\xdc\x22\x6e\x31\xb7\x84\x5b\xca\x2d\xe3\x96\x73\x2b\xb8\x95\xdc\x2a\x6e\x35\xb7\x86\x5b\xcb\xad\xe3\xd6\x73\x1b\xb8\x8d\xdc\x26\x6e\x33\xb7\x85\xdb\xca\x6d\xe3\xb6\x73\x3b\xb8\x9d\xdc\x2e\x6e\x37\xb7\x87\xdb\xcb\xed\xe3\xf6\x73\x07\xb8\x83\xdc\x21\xee\x30\x77\x84\x3b\xca\x1d\xe3\x8e\x73\x27\xb8\x93\xdc\x29\xee\x34\x77\x86\x3b\xcb\x9d\xe3\xce\x73\x17\xb8\x8b\xdc\x25\xee\x32\x77\x85\xbb\xca\x5d\xe3\xae\x73\x37\xb8\x9b\xdc\x2d\xee\x36\x77\x87\xbb\xcb\xdd\xe3\xee\x73\x0f\xb8\x87\xdc\x23\xee\x31\xf7\x84\x7b\xca\x3d\xe3\x9e\x73\x2f\xb8\x97\xdc\x2b\xee\x35\xf7\x86\x7b\xcb\xbd\xe3\xde\x73\x1f\xb8\x8f\xdc\x27\xee\x33\xf7\x85\xfb\xca\x7d\xe3\xbe\x73\x3f\xb8\x9f\xdc\x2f\xee\x37\xf7\x87\xfb\xcb\xfd\xe3\x13\xf0\x09\xf9\x44\x7c\x62\x3e\x09\x9f\x94\x4f\xc6\x27\xe7\x53\xf0\x29\xf9\x54\x7c\x6a\x3e\x0d\x9f\x96\x4f\xc7\xa7\xe7\x33\xf0\x19\xf9\x4c\x7c\x66\x3e\x0b\x9f\x95\xcf\xc6\x67\xe7\x73\xf0\x39\xf9\x5c\x7c\x6e\x3e\x0f\x9f\x97\xcf\xc7\xe7\xe7\x0b\xf0\x05\xf9\x42\x7c\x61\xbe\x08\x5f\x94\x2f\xc6\x17\xe7\x4b\xf0\x25\xf9\x52\x7c\x69\xbe\x0c\x5f\x96\x2f\xc7\x97\xe7\x2b\xf0\x18\x8f\xf3\x04\x4f\xf2\x14\x4f\xf3\x0c\xcf\xf2\x1c\xcf\xf3\x02\x2f\xf2\x12\x2f\xf3\x0a\xaf\xf2\x1a\xaf\xf3\x06\x6f\xf2\x16\x6f\xf3\x0e\xef\xf2\x1e\xef\xf3\x01\x1f\xf2\x11\x0f\x78\xc8\x23\x3e\xe6\x2b\xf2\x95\xf8\xca\x7c\x15\xbe\x2a\x5f\x8d\xaf\xce\xd7\xe0\x6b\xf2\xb5\xf8\xda\x7c\x1d\xbe\x2e\x5f\x8f\xaf\xcf\x37\xe0\x1b\xf2\x8d\xf8\xc6\x7c\x13\xbe\x29\xdf\x8c\x6f\xce\xb7\xe0\x5b\xf2\xad\xf8\xd6\x7c\x1b\xbe\x2d\xdf\x8e\x6f\xcf\x77\xe0\x3b\xf2\x9d\xf8\xce\x7c\x17\xbe\x2b\xdf\x8d\xef\xce\xf7\xe0\x7b\xf2\xbd\xf8\xde\x7c\x1f\xbe\x2f\xdf\x8f\xef\xcf\x0f\xe0\x07\xf2\x83\xf8\xc1\xfc\x10\x7e\x28\x3f\x8c\x1f\xce\x8f\xe0\x47\xf2\xa3\xf8\xd1\xfc\x18\x7e\x2c\x3f\x8e\x1f\xcf\x4f\xe0\x27\xf2\x93\xf8\xc9\xfc\x14\x7e\x2a\x3f\x8d\x9f\xce\xcf\xe0\x67\xf2\xb3\xf8\xd9\xfc\x1c\x7e\x2e\x3f\x8f\x9f\xcf\x2f\xe0\x17\xf2\x8b\xf8\xc5\xfc\x12\x7e\x29\xbf\x8c\x5f\xce\xaf\xe0\x57\xf2\xab\xf8\xd5\xfc\x1a\x7e\x2d\xbf\x8e\x5f\xcf\x6f\xe0\x37\xf2\x9b\xf8\xcd\xfc\x16\x7e\x2b\xbf\x8d\xdf\xce\xef\xe0\x77\xf2\xbb\xf8\xdd\xfc\x1e\x7e\x2f\xbf\x8f\xdf\xcf\x1f\xe0\x0f\xf2\x87\xf8\xc3\xfc\x11\xfe\x28\x7f\x8c\x3f\xce\x9f\xe0\x4f\xf2\xa7\xf8\xd3\xfc\x19\xfe\x2c\x7f\x8e\x3f\xcf\x5f\xe0\x2f\xf2\x97\xf8\xcb\xfc\x15\xfe\x2a\x7f\x8d\xbf\xce\xdf\xe0\x6f\xf2\xb7\xf8\xdb\xfc\x1d\xfe\x2e\x7f\x8f\xbf\xcf\x3f\xe0\x1f\xf2\x8f\xf8\xc7\xfc\x13\xfe\x29\xff\x8c\x7f\xce\xbf\xe0\x5f\xf2\xaf\xf8\xd7\xfc\x1b\xfe\x2d\xff\x8e\x7f\xcf\x7f\xe0\x3f\xf2\x9f\xf8\xcf\xfc\x17\xfe\x2b\xff\x8d\xff\xce\xff\xe0\x7f\xf2\xbf\xf8\xdf\xfc\x1f\xfe\x2f\xff\x4f\x48\x20\x24\x14\x12\x09\x89\x85\x24\x42\x52\x21\x99\x90\x5c\x48\x21\xa4\x14\x52\x09\xa9\x85\x34\x42\x5a\x21\x9d\x90\x5e\xc8\x20\x64\x14\x32\x09\x99\x85\x2c\x42\x56\x21\x9b\x90\x5d\xc8\x21\xe4\x14\x72\x09\xb9\x85\x3c\x42\x5e\x21\x9f\x90\x5f\x28\x20\x14\x14\x0a\x09\x85\x85\x22\x42\x51\xa1\x98\x50\x5c\x28\x21\x94\x14\x4a\x09\xa5\x85\x32\x42\x59\xa1\x9c\x50\x5e\xa8\x20\x60\x02\x2e\x10\x02\x29\x50\x02\x2d\x30\x02\x2b\x70\x02\x2f\x08\x82\x28\x48\x82\x2c\x28\x82\x2a\x68\x82\x2e\x18\x82\x29\x58\x82\x2d\x38\x82\x2b\x78\x82\x2f\x04\x42\x28\x44\x02\x10\xa0\x80\x84\x58\xa8\x28\x54\x12\x2a\x0b\x55\x84\xaa\x42\x35\xa1\xba\x50\x43\xa8\x29\xd4\x12\x6a\x0b\x75\x84\xba\x42\x3d\xa1\xbe\xd0\x40\x68\x28\x34\x12\x1a\x0b\x4d\x84\xa6\x42\x33\xa1\xb9\xd0\x42\x68\x29\xb4\x12\x5a\x0b\x6d\x84\xb6\x42\x3b\xa1\xbd\xd0\x41\xe8\x28\x74\x12\x3a\x0b\x5d\x84\xae\x42\x37\xa1\xbb\xd0\x43\xe8\x29\xf4\x12\x7a\x0b\x7d\x84\xbe\x42\x3f\xa1\xbf\x30\x40\x18\x28\x0c\x12\x06\x0b\x43\x84\xa1\xc2\x30\x61\xb8\x30\x42\x18\x29\x8c\x12\x46\x0b\x63\x84\xb1\xc2\x38\x61\xbc\x30\x41\x98\x28\x4c\x12\x26\x0b\x53\x84\xa9\xc2\x34\x61\xba\x30\x43\x98\x29\xcc\x12\x66\x0b\x73\x84\xb9\xc2\x3c\x61\xbe\xb0\x40\x58\x28\x2c\x12\x16\x0b\x4b\x84\xa5\xc2\x32\x61\xb9\xb0\x42\x58\x29\xac\x12\x56\x0b\x6b\x84\xb5\xc2\x3a\x61\xbd\xb0\x41\xd8\x28\x6c\x12\x36\x0b\x5b\x84\xad\xc2\x36\x61\xbb\xb0\x43\xd8\x29\xec\x12\x76\x0b\x7b\x84\xbd\xc2\x3e\x61\xbf\x70\x40\x38\x28\x1c\x12\x0e\x0b\x47\x84\xa3\xc2\x31\xe1\xb8\x70\x42\x38\x29\x9c\x12\x4e\x0b\x67\x84\xb3\xc2\x39\xe1\xbc\x70\x41\xb8\x28\x5c\x12\x2e\x0b\x57\x84\xab\xc2\x35\xe1\xba\x70\x43\xb8\x29\xdc\x12\x6e\x0b\x77\x84\xbb\xc2\x3d\xe1\xbe\xf0\x40\x78\x28\x3c\x12\x1e\x0b\x4f\x84\xa7\xc2\x33\xe1\xb9\xf0\x42\x78\x29\xbc\x12\x5e\x0b\x6f\x84\xb7\xc2\x3b\xe1\xbd\xf0\x41\xf8\x28\x7c\x12\x3e\x0b\x5f\x84\xaf\xc2\x37\xe1\xbb\xf0\x43\xf8\x29\xfc\x12\x7e\x0b\x7f\x84\xbf\xc2\x3f\x31\x81\x98\x50\x4c\x24\x26\x16\x93\x88\x49\xc5\x64\x62\x72\x31\x85\x98\x52\x4c\x25\xa6\x16\xd3\x88\x69\xc5\x74\x62\x7a\x31\x83\x98\x51\xcc\x24\x66\x16\xb3\x88\x59\xc5\x6c\x62\x76\x31\x87\x98\x53\xcc\x25\xe6\x16\xf3\x88\x79\xc5\x7c\x62\x7e\xb1\x80\x58\x50\x2c\x24\x16\x16\x8b\x88\x45\xc5\x62\x62\x71\xb1\x84\x58\x52\x2c\x25\x96\x16\xcb\x88\x65\xc5\x72\x62\x79\xb1\x82\x88\x89\xb8\x48\x88\xa4\x48\x89\xb4\xc8\x88\xac\xc8\x89\xbc\x28\x88\xa2\x28\x89\xb2\xa8\x88\xaa\xa8\x89\xba\x68\x88\xa6\x68\x89\xb6\xe8\x88\xae\xe8\x89\xbe\x18\x88\xa1\x18\x89\x40\x84\x22\x12\x63\xb1\xa2\x58\x49\xac\x2c\x56\x11\xab\x8a\xd5\xc4\xea\x62\x0d\xb1\xa6\x58\x4b\xac\x2d\xd6\x11\xeb\x8a\xf5\xc4\xfa\x62\x03\xb1\xa1\xd8\x48\x6c\x2c\x36\x11\x9b\x8a\xcd\xc4\xe6\x62\x0b\xb1\xa5\xd8\x4a\x6c\x2d\xb6\x11\xdb\x8a\xed\xc4\xf6\x62\x07\xb1\xa3\xd8\x49\xec\x2c\x76\x11\xbb\x8a\xdd\xc4\xee\x62\x0f\xb1\xa7\xd8\x4b\xec\x2d\xf6\x11\xfb\x8a\xfd\xc4\xfe\xe2\x00\x71\xa0\x38\x48\x1c\x2c\x0e\x11\x87\x8a\xc3\xc4\xe1\xe2\x08\x71\xa4\x38\x4a\x1c\x2d\x8e\x11\xc7\x8a\xe3\xc4\xf1\xe2\x04\x71\xa2\x38\x49\x9c\x2c\x4e\x11\xa7\x8a\xd3\xc4\xe9\xe2\x0c\x71\xa6\x38\x4b\x9c\x2d\xce\x11\xe7\x8a\xf3\xc4\xf9\xe2\x02\x71\xa1\xb8\x48\x5c\x2c\x2e\x11\x97\x8a\xcb\xc4\xe5\xe2\x0a\x71\xa5\xb8\x4a\x5c\x2d\xae\x11\xd7\x8a\xeb\xc4\xf5\xe2\x06\x71\xa3\xb8\x49\xdc\x2c\x6e\x11\xb7\x8a\xdb\xc4\xed\xe2\x0e\x71\xa7\xb8\x4b\xdc\x2d\xee\x11\xf7\x8a\xfb\xc4\xfd\xe2\x01\xf1\xa0\x78\x48\x3c\x2c\x1e\x11\x8f\x8a\xc7\xc4\xe3\xe2\x09\xf1\xa4\x78\x4a\x3c\x2d\x9e\x11\xcf\x8a\xe7\xc4\xf3\xe2\x05\xf1\xa2\x78\x49\xbc\x2c\x5e\x11\xaf\x8a\xd7\xc4\xeb\xe2\x0d\xf1\xa6\x78\x4b\xbc\x2d\xde\x11\xef\x8a\xf7\xc4\xfb\xe2\x03\xf1\xa1\xf8\x48\x7c\x2c\x3e\x11\x9f\x8a\xcf\xc4\xe7\xe2\x0b\xf1\xa5\xf8\x4a\x7c\x2d\xbe\x11\xdf\x8a\xef\xc4\xf7\xe2\x07\xf1\xa3\xf8\x49\xfc\x2c\x7e\x11\xbf\x8a\xdf\xc4\xef\xe2\x0f\xf1\xa7\xf8\x4b\xfc\x2d\xfe\x11\xff\x8a\xff\xa4\x04\x52\x42\x29\x91\x94\x58\x4a\x22\x25\x95\x92\x49\xc9\xa5\x14\x52\x4a\x29\x95\x94\x5a\x4a\x23\xa5\x95\xd2\x49\xe9\xa5\x0c\x52\x46\x29\x93\x94\x59\xca\x22\x65\x95\xb2\x49\xd9\xa5\x1c\x52\x4e\x29\x97\x94\x5b\xca\x23\xe5\x95\xf2\x49\xf9\xa5\x02\x52\x41\xa9\x90\x54\x58\x2a\x22\x15\x95\x8a\x49\xc5\xa5\x12\x52\x49\xa9\x94\x54\x5a\x2a\x23\x95\x95\xca\x49\xe5\xa5\x0a\x12\x26\xe1\x12\x21\x91\x12\x25\xd1\x12\x23\xb1\x12\x27\xf1\x92\x20\x89\x92\x24\xc9\x92\x22\xa9\x92\x26\xe9\x92\x21\x99\x92\x25\xd9\x92\x23\xb9\x92\x27\xf9\x52\x20\x85\x52\x24\x01\x09\x4a\x48\x8a\xa5\x8a\x52\x25\xa9\xb2\x54\x45\xaa\x2a\x55\x93\xaa\x4b\x35\xa4\x9a\x52\x2d\xa9\xb6\x54\x47\xaa\x2b\xd5\x93\xea\x4b\x0d\xa4\x86\x52\x23\xa9\xb1\xd4\x44\x6a\x2a\x35\x93\x9a\x4b\x2d\xa4\x96\x52\x2b\xa9\xb5\xd4\x46\x6a\x2b\xb5\x93\xda\x4b\x1d\xa4\x8e\x52\x27\xa9\xb3\xd4\x45\xea\x2a\x75\x93\xba\x4b\x3d\xa4\x9e\x52\x2f\xa9\xb7\xd4\x47\xea\x2b\xf5\x93\xfa\x4b\x03\xa4\x81\xd2\x20\x69\xb0\x34\x44\x1a\x2a\x0d\x93\x86\x4b\x23\xa4\x91\xd2\x28\x69\xb4\x34\x46\x1a\x2b\x8d\x93\xc6\x4b\x13\xa4\x89\xd2\x24\x69\xb2\x34\x45\x9a\x2a\x4d\x93\xa6\x4b\x33\xa4\x99\xd2\x2c\x69\xb6\x34\x47\x9a\x2b\xcd\x93\xe6\x4b\x0b\xa4\x85\xd2\x22\x69\xb1\xb4\x44\x5a\x2a\x2d\x93\x96\x4b\x2b\xa4\x95\xd2\x2a\x69\xb5\xb4\x46\x5a\x2b\xad\x93\xd6\x4b\x1b\xa4\x8d\xd2\x26\x69\xb3\xb4\x45\xda\x2a\x6d\x93\xb6\x4b\x3b\xa4\x9d\xd2\x2e\x69\xb7\xb4\x47\xda\x2b\xed\x93\xf6\x4b\x07\xa4\x83\xd2\x21\xe9\xb0\x74\x44\x3a\x2a\x1d\x93\x8e\x4b\x27\xa4\x93\xd2\x29\xe9\xb4\x74\x46\x3a\x2b\x9d\x93\xce\x4b\x17\xa4\x8b\xd2\x25\xe9\xb2\x74\x45\xba\x2a\x5d\x93\xae\x4b\x37\xa4\x9b\xd2\x2d\xe9\xb6\x74\x47\xba\x2b\xdd\x93\xee\x4b\x0f\xa4\x87\xd2\x23\xe9\xb1\xf4\x44\x7a\x2a\x3d\x93\x9e\x4b\x2f\xa4\x97\xd2\x2b\xe9\xb5\xf4\x46\x7a\x2b\xbd\x93\xde\x4b\x1f\xa4\x8f\xd2\x27\xe9\xb3\xf4\x45\xfa\x2a\x7d\x93\xbe\x4b\x3f\xa4\x9f\xd2\x2f\xe9\xb7\xf4\x47\xfa\x2b\xfd\x93\x13\xc8\x09\xe5\x44\x72\x62\x39\x89\x9c\x54\x4e\x26\x27\x97\x53\xc8\x29\xe5\x54\x72\x6a\x39\x8d\x9c\x56\x4e\x27\xa7\x97\x33\xc8\x19\xe5\x4c\x72\x66\x39\x8b\x9c\x55\xce\x26\x67\x97\x73\xc8\x39\xe5\x5c\x72\x6e\x39\x8f\x9c\x57\xce\x27\xe7\x97\x0b\xc8\x05\xe5\x42\x72\x61\xb9\x88\x5c\x54\x2e\x26\x17\x97\x4b\xc8\x25\xe5\x52\x72\x69\xb9\x8c\x5c\x56\x2e\x27\x97\x97\x2b\xc8\x98\x8c\xcb\x84\x4c\xca\x94\x4c\xcb\x8c\xcc\xca\x9c\xcc\xcb\x82\x2c\xca\x92\x2c\xcb\x8a\xac\xca\x9a\xac\xcb\x86\x6c\xca\x96\x6c\xcb\x8e\xec\xca\x9e\xec\xcb\x81\x1c\xca\x91\x0c\x64\x28\x23\x39\x96\x2b\xca\x95\xe4\xca\x72\x15\xb9\xaa\x5c\x4d\xae\x2e\xd7\x90\x6b\xca\xb5\xe4\xda\x72\x1d\xb9\xae\x5c\x4f\xae\x2f\x37\x90\x1b\xca\x8d\xe4\xc6\x72\x13\xb9\xa9\xdc\x4c\x6e\x2e\xb7\x90\x5b\xca\xad\xe4\xd6\x72\x1b\xb9\xad\xdc\x4e\x6e\x2f\x77\x90\x3b\xca\x9d\xe4\xce\x72\x17\xb9\xab\xdc\x4d\xee\x2e\xf7\x90\x7b\xca\xbd\xe4\xde\x72\x1f\xb9\xaf\xdc\x4f\xee\x2f\x0f\x90\x07\xca\x83\xe4\xc1\xf2\x10\x79\xa8\x3c\x4c\x1e\x2e\x8f\x90\x47\xca\xa3\xe4\xd1\xf2\x18\x79\xac\x3c\x4e\x1e\x2f\x4f\x90\x27\xca\x93\xe4\xc9\xf2\x14\x79\xaa\x3c\x4d\x9e\x2e\xcf\x90\x67\xca\xb3\xe4\xd9\xf2\x1c\x79\xae\x3c\x4f\x9e\x2f\x2f\x90\x17\xca\x8b\xe4\xc5\xf2\x12\x79\xa9\xbc\x4c\x5e\x2e\xaf\x90\x57\xca\xab\xe4\xd5\xf2\x1a\x79\xad\xbc\x4e\x5e\x2f\x6f\x90\x37\xca\x9b\xe4\xcd\xf2\x16\x79\xab\xbc\x4d\xde\x2e\xef\x90\x77\xca\xbb\xe4\xdd\xf2\x1e\x79\xaf\xbc\x4f\xde\x2f\x1f\x90\x0f\xca\x87\xe4\xc3\xf2\x11\xf9\xa8\x7c\x4c\x3e\x2e\x9f\x90\x4f\xca\xa7\xe4\xd3\xf2\x19\xf9\xac\x7c\x4e\x3e\x2f\x5f\x90\x2f\xca\x97\xe4\xcb\xf2\x15\xf9\xaa\x7c\x4d\xbe\x2e\xdf\x90\x6f\xca\xb7\xe4\xdb\xf2\x1d\xf9\xae\x7c\x4f\xbe\x2f\x3f\x90\x1f\xca\x8f\xe4\xc7\xf2\x13\xf9\xa9\xfc\x4c\x7e\x2e\xbf\x90\x5f\xca\xaf\xe4\xd7\xf2\x1b\xf9\xad\xfc\x4e\x7e\x2f\x7f\x90\x3f\xca\x9f\xe4\xcf\xf2\x17\xf9\xab\xfc\x4d\xfe\x2e\xff\x90\x7f\xca\xbf\xe4\xdf\xf2\x1f\xf9\xaf\xfc\x4f\x49\xa0\x24\x54\x12\x29\x89\x95\x24\x4a\x52\x25\x99\x92\x5c\x49\xa1\xa4\x54\x52\x29\xa9\x95\x34\x4a\x5a\x25\x9d\x92\x5e\xc9\xa0\x64\x54\x32\x29\x99\x95\x2c\x4a\x56\x25\x9b\x92\x5d\xc9\xa1\xe4\x54\x72\x29\xb9\x95\x3c\x4a\x5e\x25\x9f\x92\x5f\x29\xa0\x14\x54\x0a\x29\x85\x95\x22\x4a\x51\xa5\x98\x52\x5c\x29\xa1\x94\x54\x4a\x29\xa5\x95\x32\x4a\x59\xa5\x9c\x52\x5e\xa9\xa0\x60\x0a\xae\x10\x0a\xa9\x50\x0a\xad\x30\x0a\xab\x70\x0a\xaf\x08\x8a\xa8\x48\x8a\xac\x28\x8a\xaa\x68\x8a\xae\x18\x8a\xa9\x58\x8a\xad\x38\x8a\xab\x78\x8a\xaf\x04\x4a\xa8\x44\x0a\x50\xa0\x82\x94\x58\xa9\xa8\x54\x52\x2a\x2b\x55\x94\xaa\x4a\x35\xa5\xba\x52\x43\xa9\xa9\xd4\x52\x6a\x2b\x75\x94\xba\x4a\x3d\xa5\xbe\xd2\x40\x69\xa8\x34\x52\x1a\x2b\x4d\x94\xa6\x4a\x33\xa5\xb9\xd2\x42\x69\xa9\xb4\x52\x5a\x2b\x6d\x94\xb6\x4a\x3b\xa5\xbd\xd2\x41\xe9\xa8\x74\x52\x3a\x2b\x5d\x94\xae\x4a\x37\xa5\xbb\xd2\x43\xe9\xa9\xf4\x52\x7a\x2b\x7d\x94\xbe\x4a\x3f\xa5\xbf\x32\x40\x19\xa8\x0c\x52\x06\x2b\x43\x94\xa1\xca\x30\x65\xb8\x32\x42\x19\xa9\x8c\x52\x46\x2b\x63\x94\xb1\xca\x38\x65\xbc\x32\x41\x99\xa8\x4c\x52\x26\x2b\x53\x94\xa9\xca\x34\x65\xba\x32\x43\x99\xa9\xcc\x52\x66\x2b\x73\x94\xb9\xca\x3c\x65\xbe\xb2\x40\x59\xa8\x2c\x52\x16\x2b\x4b\x94\xa5\xca\x32\x65\xb9\xb2\x42\x59\xa9\xac\x52\x56\x2b\x6b\x94\xb5\xca\x3a\x65\xbd\xb2\x41\xd9\xa8\x6c\x52\x36\x2b\x5b\x94\xad\xca\x36\x65\xbb\xb2\x43\xd9\xa9\xec\x52\x76\x2b\x7b\x94\xbd\xca\x3e\x65\xbf\x72\x40\x39\xa8\x1c\x52\x0e\x2b\x47\x94\xa3\xca\x31\xe5\xb8\x72\x42\x39\xa9\x9c\x52\x4e\x2b\x67\x94\xb3\xca\x39\xe5\xbc\x72\x41\xb9\xa8\x5c\x52\x2e\x2b\x57\x94\xab\xca\x35\xe5\xba\x72\x43\xb9\xa9\xdc\x52\x6e\x2b\x77\x94\xbb\xca\x3d\xe5\xbe\xf2\x40\x79\xa8\x3c\x52\x1e\x2b\x4f\x94\xa7\xca\x33\xe5\xb9\xf2\x42\x79\xa9\xbc\x52\x5e\x2b\x6f\x94\xb7\xca\x3b\xe5\xbd\xf2\x41\xf9\xa8\x7c\x52\x3e\x2b\x5f\x94\xaf\xca\x37\xe5\xbb\xf2\x43\xf9\xa9\xfc\x52\x7e\x2b\x7f\x94\xbf\xca\x3f\x35\x81\x9a\x50\x4d\xa4\x26\x56\x93\xa8\x49\xd5\x64\x6a\x72\x35\x85\x9a\x52\x4d\xa5\xa6\x56\xd3\xa8\x69\xd5\x74\x6a\x7a\x35\x83\x9a\x51\xcd\xa4\x66\x56\xb3\xa8\x59\xd5\x6c\x6a\x76\x35\x87\x9a\x53\xcd\xa5\xe6\x56\xf3\xa8\x79\xd5\x7c\x6a\x7e\xb5\x80\x5a\x50\x2d\xa4\x16\x56\x8b\xa8\x45\xd5\x62\x6a\x71\xb5\x84\x5a\x52\x2d\xa5\x96\x56\xcb\xa8\x65\xd5\x72\x6a\x79\xb5\x82\x8a\xa9\xb8\x4a\xa8\xa4\x4a\xa9\xb4\xca\xa8\xac\xca\xa9\xbc\x2a\xa8\xa2\x2a\xa9\xb2\xaa\xa8\xaa\xaa\xa9\xba\x6a\xa8\xa6\x6a\xa9\xb6\xea\xa8\xae\xea\xa9\xbe\x1a\xa8\xa1\x1a\xa9\x40\x85\x2a\x52\x63\xb5\xa2\x5a\x49\xad\xac\x56\x51\xab\xaa\xd5\xd4\xea\x6a\x0d\xb5\xa6\x5a\x4b\xad\xad\xd6\x51\xeb\xaa\xf5\xd4\xfa\x6a\x03\xb5\xa1\xda\x48\x6d\xac\x36\x51\x9b\xaa\xcd\xd4\xe6\x6a\x0b\xb5\xa5\xda\x4a\x6d\xad\xb6\x51\xdb\xaa\xed\xd4\xf6\x6a\x07\xb5\xa3\xda\x49\xed\xac\x76\x51\xbb\xaa\xdd\xd4\xee\x6a\x0f\xb5\xa7\xda\x4b\xed\xad\xf6\x51\xfb\xaa\xfd\xd4\xfe\xea\x00\x75\xa0\x3a\x48\x1d\xac\x0e\x51\x87\xaa\xc3\xd4\xe1\xea\x08\x75\xa4\x3a\x4a\x1d\xad\x8e\x51\xc7\xaa\xe3\xd4\xf1\xea\x04\x75\xa2\x3a\x49\x9d\xac\x4e\x51\xa7\xaa\xd3\xd4\xe9\xea\x0c\x75\xa6\x3a\x4b\x9d\xad\xce\x51\xe7\xaa\xf3\xd4\xf9\xea\x02\x75\xa1\xba\x48\x5d\xac\x2e\x51\x97\xaa\xcb\xd4\xe5\xea\x0a\x75\xa5\xba\x4a\x5d\xad\xae\x51\xd7\xaa\xeb\xd4\xf5\xea\x06\x75\xa3\xba\x49\xdd\xac\x6e\x51\xb7\xaa\xdb\xd4\xed\xea\x0e\x75\xa7\xba\x4b\xdd\xad\xee\x51\xf7\xaa\xfb\xd4\xfd\xea\x01\xf5\xa0\x7a\x48\x3d\xac\x1e\x51\x8f\xaa\xc7\xd4\xe3\xea\x09\xf5\xa4\x7a\x4a\x3d\xad\x9e\x51\xcf\xaa\xe7\xd4\xf3\xea\x05\xf5\xa2\x7a\x49\xbd\xac\x5e\x51\xaf\xaa\xd7\xd4\xeb\xea\x0d\xf5\xa6\x7a\x4b\xbd\xad\xde\x51\xef\xaa\xf7\xd4\xfb\xea\x03\xf5\xa1\xfa\x48\x7d\xac\x3e\x51\x9f\xaa\xcf\xd4\xe7\xea\x0b\xf5\xa5\xfa\x4a\x7d\xad\xbe\x51\xdf\xaa\xef\xd4\xf7\xea\x07\xf5\xa3\xfa\x49\xfd\xac\x7e\x51\xbf\xaa\xdf\xd4\xef\xea\x0f\xf5\xa7\xfa\x4b\xfd\xad\xfe\x51\xff\xaa\xff\xb4\x04\x5a\x42\x2d\x91\x96\x58\x4b\xa2\x25\xd5\x92\x69\xc9\xb5\x14\x5a\x4a\x2d\x95\x96\x5a\x4b\xa3\xa5\xd5\xd2\x69\xe9\xb5\x0c\x5a\x46\x2d\x93\x96\x59\xcb\xa2\x65\xd5\xb2\x69\xd9\xb5\x1c\x5a\x4e\x2d\x97\x96\x5b\xcb\xa3\xe5\xd5\xf2\x69\xf9\xb5\x02\x5a\x41\xad\x90\x56\x58\x2b\xa2\x15\xd5\x8a\x69\xc5\xb5\x12\x5a\x49\xad\x94\x56\x5a\x2b\xa3\x95\xd5\xca\x69\xe5\xb5\x0a\x1a\xa6\xe1\x1a\xa1\x91\x1a\xa5\xd1\x1a\xa3\xb1\x1a\xa7\xf1\x9a\xa0\x89\x9a\xa4\xc9\x9a\xa2\xa9\x9a\xa6\xe9\x9a\xa1\x99\x9a\xa5\xd9\x9a\xa3\xb9\x9a\xa7\xf9\x5a\xa0\x85\x5a\xa4\x01\x0d\x6a\x48\x8b\xb5\x8a\x5a\x25\xad\xb2\x56\x45\xab\xaa\x55\xd3\xaa\x6b\x35\xb4\x9a\x5a\x2d\xad\xb6\x56\x47\xab\xab\xd5\xd3\xea\x6b\x0d\xb4\x86\x5a\x23\xad\xb1\xd6\x44\x6b\xaa\x35\xd3\x9a\x6b\x2d\xb4\x96\x5a\x2b\xad\xb5\xd6\x46\x6b\xab\xb5\xd3\xda\x6b\x1d\xb4\x8e\x5a\x27\xad\xb3\xd6\x45\xeb\xaa\x75\xd3\xba\x6b\x3d\xb4\x9e\x5a\x2f\xad\xb7\xd6\x47\xeb\xab\xf5\xd3\xfa\x6b\x03\xb4\x81\xda\x20\x6d\xb0\x36\x44\x1b\xaa\x0d\xd3\x86\x6b\x23\xb4\x91\xda\x28\x6d\xb4\x36\x46\x1b\xab\x8d\xd3\xc6\x6b\x13\xb4\x89\xda\x24\x6d\xb2\x36\x45\x9b\xaa\x4d\xd3\xa6\x6b\x33\xb4\x99\xda\x2c\x6d\xb6\x36\x47\x9b\xab\xcd\xd3\xe6\x6b\x0b\xb4\x85\xda\x22\x6d\xb1\xb6\x44\x5b\xaa\x2d\xd3\x96\x6b\x2b\xb4\x95\xda\x2a\x6d\xb5\xb6\x46\x5b\xab\xad\xd3\xd6\x6b\x1b\xb4\x8d\xda\x26\x6d\xb3\xb6\x45\xdb\xaa\x6d\xd3\xb6\x6b\x3b\xb4\x9d\xda\x2e\x6d\xb7\xb6\x47\xdb\xab\xed\xd3\xf6\x6b\x07\xb4\x83\xda\x21\xed\xb0\x76\x44\x3b\xaa\x1d\xd3\x8e\x6b\x27\xb4\x93\xda\x29\xed\xb4\x76\x46\x3b\xab\x9d\xd3\xce\x6b\x17\xb4\x8b\xda\x25\xed\xb2\x76\x45\xbb\xaa\x5d\xd3\xae\x6b\x37\xb4\x9b\xda\x2d\xed\xb6\x76\x47\xbb\xab\xdd\xd3\xee\x6b\x0f\xb4\x87\xda\x23\xed\xb1\xf6\x44\x7b\xaa\x3d\xd3\x9e\x6b\x2f\xb4\x97\xda\x2b\xed\xb5\xf6\x46\x7b\xab\xbd\xd3\xde\x6b\x1f\xb4\x8f\xda\x27\xed\xb3\xf6\x45\xfb\xaa\x7d\xd3\xbe\x6b\x3f\xb4\x9f\xda\x2f\xed\xb7\xf6\x47\xfb\xab\xfd\xd3\x13\xe8\x09\xf5\x44\x7a\x62\x3d\x89\x9e\x54\x4f\xa6\x27\xd7\x53\xe8\x29\xf5\x54\x7a\x6a\x3d\x8d\x9e\x56\x4f\xa7\xa7\xd7\x33\xe8\x19\xf5\x4c\x7a\x66\x3d\x8b\x9e\x55\xcf\xa6\x67\xd7\x73\xe8\x39\xf5\x5c\x7a\x6e\x3d\x8f\x9e\x57\xcf\xa7\xe7\xd7\x0b\xe8\x05\xf5\x42\x7a\x61\xbd\x88\x5e\x54\x2f\xa6\x17\xd7\x4b\xe8\x25\xf5\x52\x7a\x69\xbd\x8c\x5e\x56\x2f\xa7\x97\xd7\x2b\xe8\x98\x8e\xeb\x84\x4e\xea\x94\x4e\xeb\x8c\xce\xea\x9c\xce\xeb\x82\x2e\xea\x92\x2e\xeb\x8a\xae\xea\x9a\xae\xeb\x86\x6e\xea\x96\x6e\xeb\x8e\xee\xea\x9e\xee\xeb\x81\x1e\xea\x91\x0e\x74\xa8\x23\x3d\xd6\x2b\xea\x95\xf4\xca\x7a\x15\xbd\xaa\x5e\x4d\xaf\xae\xd7\xd0\x6b\xea\xb5\xf4\xda\x7a\x1d\xbd\xae\x5e\x4f\xaf\xaf\x37\xd0\x1b\xea\x8d\xf4\xc6\x7a\x13\xbd\xa9\xde\x4c\x6f\xae\xb7\xd0\x5b\xea\xad\xf4\xd6\x7a\x1b\xbd\xad\xde\x4e\x6f\xaf\x77\xd0\x3b\xea\x9d\xf4\xce\x7a\x17\xbd\xab\xde\x4d\xef\xae\xf7\xd0\x7b\xea\xbd\xf4\xde\x7a\x1f\xbd\xaf\xde\x4f\xef\xaf\x0f\xd0\x07\xea\x83\xf4\xc1\xfa\x10\x7d\xa8\x3e\x4c\x1f\xae\x8f\xd0\x47\xea\xa3\xf4\xd1\xfa\x18\x7d\xac\x3e\x4e\x1f\xaf\x4f\xd0\x27\xea\x93\xf4\xc9\xfa\x14\x7d\xaa\x3e\x4d\x9f\xae\xcf\xd0\x67\xea\xb3\xf4\xd9\xfa\x1c\x7d\xae\x3e\x4f\x9f\xaf\x2f\xd0\x17\xea\x8b\xf4\xc5\xfa\x12\x7d\xa9\xbe\x4c\x5f\xae\xaf\xd0\x57\xea\xab\xf4\xd5\xfa\x1a\x7d\xad\xbe\x4e\x5f\xaf\x6f\xd0\x37\xea\x9b\xf4\xcd\xfa\x16\x7d\xab\xbe\x4d\xdf\xae\xef\xd0\x77\xea\xbb\xf4\xdd\xfa\x1e\x7d\xaf\xbe\x4f\xdf\xaf\x1f\xd0\x0f\xea\x87\xf4\xc3\xfa\x11\xfd\xa8\x7e\x4c\x3f\xae\x9f\xd0\x4f\xea\xa7\xf4\xd3\xfa\x19\xfd\xac\x7e\x4e\x3f\xaf\x5f\xd0\x2f\xea\x97\xf4\xcb\xfa\x15\xfd\xaa\x7e\x4d\xbf\xae\xdf\xd0\x6f\xea\xb7\xf4\xdb\xfa\x1d\xfd\xae\x7e\x4f\xbf\xaf\x3f\xd0\x1f\xea\x8f\xf4\xc7\xfa\x13\xfd\xa9\xfe\x4c\x7f\xae\xbf\xd0\x5f\xea\xaf\xf4\xd7\xfa\x1b\xfd\xad\xfe\x4e\x7f\xaf\x7f\xd0\x3f\xea\x9f\xf4\xcf\xfa\x17\xfd\xab\xfe\x4d\xff\xae\xff\xd0\x7f\xea\xbf\xf4\xdf\xfa\x1f\xfd\xaf\xfe\xcf\x48\x60\x24\x34\x12\x19\x89\x8d\x24\x46\x52\x23\x99\x91\xdc\x48\x61\xa4\x34\x52\x19\xa9\x8d\x34\x46\x5a\x23\x9d\x91\xde\xc8\x60\x64\x34\x32\x19\x99\x8d\x2c\x46\x56\x23\x9b\x91\xdd\xc8\x61\xe4\x34\x72\x19\xb9\x8d\x3c\x46\x5e\x23\x9f\x91\xdf\x28\x60\x14\x34\x0a\x19\x85\x8d\x22\x46\x51\xa3\x98\x51\xdc\x28\x61\x94\x34\x4a\x19\xa5\x8d\x32\x46\x59\xa3\x9c\x51\xde\xa8\x60\x60\x06\x6e\x10\x06\x69\x50\x06\x6d\x30\x06\x6b\x70\x06\x6f\x08\x86\x68\x48\x86\x6c\x28\x86\x6a\x68\x86\x6e\x18\x86\x69\x58\x86\x6d\x38\x86\x6b\x78\x86\x6f\x04\x46\x68\x44\x06\x30\xa0\x81\x8c\xd8\xa8\x68\x54\x32\x2a\x1b\x55\x8c\xaa\x46\x35\xa3\xba\x51\xc3\xa8\x69\xd4\x32\x6a\x1b\x75\x8c\xba\x46\x3d\xa3\xbe\xd1\xc0\x68\x68\x34\x32\x1a\x1b\x4d\x8c\xa6\x46\x33\xa3\xb9\xd1\xc2\x68\x69\xb4\x32\x5a\x1b\x6d\x8c\xb6\x46\x3b\xa3\xbd\xd1\xc1\xe8\x68\x74\x32\x3a\x1b\x5d\x8c\xae\x46\x37\xa3\xbb\xd1\xc3\xe8\x69\xf4\x32\x7a\x1b\x7d\x8c\xbe\x46\x3f\xa3\xbf\x31\xc0\x18\x68\x0c\x32\x06\x1b\x43\x8c\xa1\xc6\x30\x63\xb8\x31\xc2\x18\x69\x8c\x32\x46\x1b\x63\x8c\xb1\xc6\x38\x63\xbc\x31\xc1\x98\x68\x4c\x32\x26\x1b\x53\x8c\xa9\xc6\x34\x63\xba\x31\xc3\x98\x69\xcc\x32\x66\x1b\x73\x8c\xb9\xc6\x3c\x63\xbe\xb1\xc0\x58\x68\x2c\x32\x16\x1b\x4b\x8c\xa5\xc6\x32\x63\xb9\xb1\xc2\x58\x69\xac\x32\x56\x1b\x6b\x8c\xb5\xc6\x3a\x63\xbd\xb1\xc1\xd8\x68\x6c\x32\x36\x1b\x5b\x8c\xad\xc6\x36\x63\xbb\xb1\xc3\xd8\x69\xec\x32\x76\x1b\x7b\x8c\xbd\xc6\x3e\x63\xbf\x71\xc0\x38\x68\x1c\x32\x0e\x1b\x47\x8c\xa3\xc6\x31\xe3\xb8\x71\xc2\x38\x69\x9c\x32\x4e\x1b\x67\x8c\xb3\xc6\x39\xe3\xbc\x71\xc1\xb8\x68\x5c\x32\x2e\x1b\x57\x8c\xab\xc6\x35\xe3\xba\x71\xc3\xb8\x69\xdc\x32\x6e\x1b\x77\x8c\xbb\xc6\x3d\xe3\xbe\xf1\xc0\x78\x68\x3c\x32\x1e\x1b\x4f\x8c\xa7\xc6\x33\xe3\xb9\xf1\xc2\x78\x69\xbc\x32\x5e\x1b\x6f\x8c\xb7\xc6\x3b\xe3\xbd\xf1\xc1\xf8\x68\x7c\x32\x3e\x1b\x5f\x8c\xaf\xc6\x37\xe3\xbb\xf1\xc3\xf8\x69\xfc\x32\x7e\x1b\x7f\x8c\xbf\xc6\x3f\x33\x81\x99\xd0\x4c\x64\x26\x36\x93\x98\x49\xcd\x64\x66\x72\x33\x85\x99\xd2\x4c\x65\xa6\x36\xd3\x98\x69\xcd\x74\x66\x7a\x33\x83\x99\xd1\xcc\x64\x66\x36\xb3\x98\x59\xcd\x6c\x66\x76\x33\x87\x99\xd3\xcc\x65\xe6\x36\xf3\x98\x79\xcd\x7c\x66\x7e\xb3\x80\x59\xd0\x2c\x64\x16\x36\x8b\x98\x45\xcd\x62\x66\x71\xb3\x84\x59\xd2\x2c\x65\x96\x36\xcb\x98\x65\xcd\x72\x66\x79\xb3\x82\x89\x99\xb8\x49\x98\xa4\x49\x99\xb4\xc9\x98\xac\xc9\x99\xbc\x29\x98\xa2\x29\x99\xb2\xa9\x98\xaa\xa9\x99\xba\x69\x98\xa6\x69\x99\xb6\xe9\x98\xae\xe9\x99\xbe\x19\x98\xa1\x19\x99\xc0\x84\x26\x32\x63\xb3\xa2\x59\xc9\xac\x6c\x56\x31\xab\x9a\xd5\xcc\xea\x66\x0d\xb3\xa6\x59\xcb\xac\x6d\xd6\x31\xeb\x9a\xf5\xcc\xfa\x66\x03\xb3\xa1\xd9\xc8\x6c\x6c\x36\x31\x9b\x9a\xcd\xcc\xe6\x66\x0b\xb3\xa5\xd9\xca\x6c\x6d\xb6\x31\xdb\x9a\xed\xcc\xf6\x66\x07\xb3\xa3\xd9\xc9\xec\x6c\x76\x31\xbb\x9a\xdd\xcc\xee\x66\x0f\xb3\xa7\xd9\xcb\xec\x6d\xf6\x31\xfb\x9a\xfd\xcc\xfe\xe6\x00\x73\xa0\x39\xc8\x1c\x6c\x0e\x31\x87\x9a\xc3\xcc\xe1\xe6\x08\x73\xa4\x39\xca\x1c\x6d\x8e\x31\xc7\x9a\xe3\xcc\xf1\xe6\x04\x73\xa2\x39\xc9\x9c\x6c\x4e\x31\xa7\x9a\xd3\xcc\xe9\xe6\x0c\x73\xa6\x39\xcb\x9c\x6d\xce\x31\xe7\x9a\xf3\xcc\xf9\xe6\x02\x73\xa1\xb9\xc8\x5c\x6c\x2e\x31\x97\x9a\xcb\xcc\xe5\xe6\x0a\x73\xa5\xb9\xca\x5c\x6d\xae\x31\xd7\x9a\xeb\xcc\xf5\xe6\x06\x73\xa3\xb9\xc9\xdc\x6c\x6e\x31\xb7\x9a\xdb\xcc\xed\xe6\x0e\x73\xa7\xb9\xcb\xdc\x6d\xee\x31\xf7\x9a\xfb\xcc\xfd\xe6\x01\xf3\xa0\x79\xc8\x3c\x6c\x1e\x31\x8f\x9a\xc7\xcc\xe3\xe6\x09\xf3\xa4\x79\xca\x3c\x6d\x9e\x31\xcf\x9a\xe7\xcc\xf3\xe6\x05\xf3\xa2\x79\xc9\xbc\x6c\x5e\x31\xaf\x9a\xd7\xcc\xeb\xe6\x0d\xf3\xa6\x79\xcb\xbc\x6d\xde\x31\xef\x9a\xf7\xcc\xfb\xe6\x03\xf3\xa1\xf9\xc8\x7c\x6c\x3e\x31\x9f\x9a\xcf\xcc\xe7\xe6\x0b\xf3\xa5\xf9\xca\x7c\x6d\xbe\x31\xdf\x9a\xef\xcc\xf7\xe6\x07\xf3\xa3\xf9\xc9\xfc\x6c\x7e\x31\xbf\x9a\xdf\xcc\xef\xe6\x0f\xf3\xa7\xf9\xcb\xfc\x6d\xfe\x31\xff\x9a\xff\xac\x04\x56\x42\x2b\x91\x95\xd8\x4a\x62\x25\xb5\x92\x59\xc9\xad\x14\x56\x4a\x2b\x95\x95\xda\x4a\x63\xa5\xb5\xd2\x59\xe9\xad\x0c\x56\x46\x2b\x93\x95\xd9\xca\x62\x65\xb5\xb2\x59\xd9\xad\x1c\x56\x4e\x2b\x97\x95\xdb\xca\x63\xe5\xb5\xf2\x59\xf9\xad\x02\x56\x41\xab\x90\x55\xd8\x2a\x62\x15\xb5\x8a\x59\xc5\xad\x12\x56\x49\xab\x94\x55\xda\x2a\x63\x95\xb5\xca\x59\xe5\xad\x0a\x16\x66\xe1\x16\x61\x91\x16\x65\xd1\x16\x63\xb1\x16\x67\xf1\x96\x60\x89\x96\x64\xc9\x96\x62\xa9\x96\x66\xe9\x96\x61\x99\x96\x65\xd9\x96\x63\xb9\x96\x67\xf9\x56\x60\x85\x56\x64\x01\x0b\x5a\xc8\x8a\xad\x8a\x56\x25\xab\xb2\x55\xc5\xaa\x6a\x55\xb3\xaa\x5b\x35\xac\x9a\x56\x2d\xab\xb6\x55\xc7\xaa\x6b\xd5\xb3\xea\x5b\x0d\xac\x86\x56\x23\xab\xb1\xd5\xc4\x6a\x6a\x35\xb3\x9a\x5b\x2d\xac\x96\x56\x2b\xab\xb5\xd5\xc6\x6a\x6b\xb5\xb3\xda\x5b\x1d\xac\x8e\x56\x27\xab\xb3\xd5\xc5\xea\x6a\x75\xb3\xba\x5b\x3d\xac\x9e\x56\x2f\xab\xb7\xd5\xc7\xea\x6b\xf5\xb3\xfa\x5b\x03\xac\x81\xd6\x20\x6b\xb0\x35\xc4\x1a\x6a\x0d\xb3\x86\x5b\x23\xac\x91\xd6\x28\x6b\xb4\x35\xc6\x1a\x6b\x8d\xb3\xc6\x5b\x13\xac\x89\xd6\x24\x6b\xb2\x35\xc5\x9a\x6a\x4d\xb3\xa6\x5b\x33\xac\x99\xd6\x2c\x6b\xb6\x35\xc7\x9a\x6b\xcd\xb3\xe6\x5b\x0b\xac\x85\xd6\x22\x6b\xb1\xb5\xc4\x5a\x6a\x2d\xb3\x96\x5b\x2b\xac\x95\xd6\x2a\x6b\xb5\xb5\xc6\x5a\x6b\xad\xb3\xd6\x5b\x1b\xac\x8d\xd6\x26\x6b\xb3\xb5\xc5\xda\x6a\x6d\xb3\xb6\x5b\x3b\xac\x9d\xd6\x2e\x6b\xb7\xb5\xc7\xda\x6b\xed\xb3\xf6\x5b\x07\xac\x83\xd6\x21\xeb\xb0\x75\xc4\x3a\x6a\x1d\xb3\x8e\x5b\x27\xac\x93\xd6\x29\xeb\xb4\x75\xc6\x3a\x6b\x9d\xb3\xce\x5b\x17\xac\x8b\xd6\x25\xeb\xb2\x75\xc5\xba\x6a\x5d\xb3\xae\x5b\x37\xac\x9b\xd6\x2d\xeb\xb6\x75\xc7\xba\x6b\xdd\xb3\xee\x5b\x0f\xac\x87\xd6\x23\xeb\xb1\xf5\xc4\x7a\x6a\x3d\xb3\x9e\x5b\x2f\xac\x97\xd6\x2b\xeb\xb5\xf5\xc6\x7a\x6b\xbd\xb3\xde\x5b\x1f\xac\x8f\xd6\x27\xeb\xb3\xf5\xc5\xfa\x6a\x7d\xb3\xbe\x5b\x3f\xac\x9f\xd6\x2f\xeb\xb7\xf5\xc7\xfa\x6b\xfd\xb3\x13\xd8\x09\xed\x44\x76\x62\x3b\x89\x9d\xd4\x4e\x66\x27\xb7\x53\xd8\x29\xed\x54\x76\x6a\x3b\x8d\x9d\xd6\x4e\x67\xa7\xb7\x33\xd8\x19\xed\x4c\x76\x66\x3b\x8b\x9d\xd5\xce\x66\x67\xb7\x73\xd8\x39\xed\x5c\x76\x6e\x3b\x8f\x9d\xd7\xce\x67\xe7\xb7\x0b\xd8\x05\xed\x42\x76\x61\xbb\x88\x5d\xd4\x2e\x66\x17\xb7\x4b\xd8\x25\xed\x52\x76\x69\xbb\x8c\x5d\xd6\x2e\x67\x97\xb7\x2b\xd8\x98\x8d\xdb\x84\x4d\xda\x94\x4d\xdb\x8c\xcd\xda\x9c\xcd\xdb\x82\x2d\xda\x92\x2d\xdb\x8a\xad\xda\x9a\xad\xdb\x86\x6d\xda\x96\x6d\xdb\x8e\xed\xda\x9e\xed\xdb\x81\x1d\xda\x91\x0d\x6c\x68\x23\x3b\xb6\x2b\xda\x95\xec\xca\x76\x15\xbb\xaa\x5d\xcd\xae\x6e\xd7\xb0\x6b\xda\xb5\xec\xda\x76\x1d\xbb\xae\x5d\xcf\xae\x6f\x37\xb0\x1b\xda\x8d\xec\xc6\x76\x13\xbb\xa9\xdd\xcc\x6e\x6e\xb7\xb0\x5b\xda\xad\xec\xd6\x76\x1b\xbb\xad\xdd\xce\x6e\x6f\x77\xb0\x3b\xda\x9d\xec\xce\x76\x17\xbb\xab\xdd\xcd\xee\x6e\xf7\xb0\x7b\xda\xbd\xec\xde\x76\x1f\xbb\xaf\xdd\xcf\xee\x6f\x0f\xb0\x07\xda\x83\xec\xc1\xf6\x10\x7b\xa8\x3d\xcc\x1e\x6e\x8f\xb0\x47\xda\xa3\xec\xd1\xf6\x18\x7b\xac\x3d\xce\x1e\x6f\x4f\xb0\x27\xda\x93\xec\xc9\xf6\x14\x7b\xaa\x3d\xcd\x9e\x6e\xcf\xb0\x67\xda\xb3\xec\xd9\xf6\x1c\x7b\xae\x3d\xcf\x9e\x6f\x2f\xb0\x17\xda\x8b\xec\xc5\xf6\x12\x7b\xa9\xbd\xcc\x5e\x6e\xaf\xb0\x57\xda\xab\xec\xd5\xf6\x1a\x7b\xad\xbd\xce\x5e\x6f\x6f\xb0\x37\xda\x9b\xec\xcd\xf6\x16\x7b\xab\xbd\xcd\xde\x6e\xef\xb0\x77\xda\xbb\xec\xdd\xf6\x1e\x7b\xaf\xbd\xcf\xde\x6f\x1f\xb0\x0f\xda\x87\xec\xc3\xf6\x11\xfb\xa8\x7d\xcc\x3e\x6e\x9f\xb0\x4f\xda\xa7\xec\xd3\xf6\x19\xfb\xac\x7d\xce\x3e\x6f\x5f\xb0\x2f\xda\x97\xec\xcb\xf6\x15\xfb\xaa\x7d\xcd\xbe\x6e\xdf\xb0\x6f\xda\xb7\xec\xdb\xf6\x1d\xfb\xae\x7d\xcf\xbe\x6f\x3f\xb0\x1f\xda\x8f\xec\xc7\xf6\x13\xfb\xa9\xfd\xcc\x7e\x6e\xbf\xb0\x5f\xda\xaf\xec\xd7\xf6\x1b\xfb\xad\xfd\xce\x7e\x6f\x7f\xb0\x3f\xda\x9f\xec\xcf\xf6\x17\xfb\xab\xfd\xcd\xfe\x6e\xff\xb0\x7f\xda\xbf\xec\xdf\xf6\x1f\xfb\xaf\xfd\xcf\x49\xe0\x24\x74\x12\x39\x89\x9d\x24\x4e\x52\x27\x99\x93\xdc\x49\xe1\xa4\x74\x52\x39\xa9\x9d\x34\x4e\x5a\x27\x9d\x93\xde\xc9\xe0\x64\x74\x32\x39\x99\x9d\x2c\x4e\x56\x27\x9b\x93\xdd\xc9\xe1\xe4\x74\x72\x39\xb9\x9d\x3c\x4e\x5e\x27\x9f\x93\xdf\x29\xe0\x14\x74\x0a\x39\x85\x9d\x22\x4e\x51\xa7\x98\x53\xdc\x29\xe1\x94\x74\x4a\x39\xa5\x9d\x32\x4e\x59\xa7\x9c\x53\xde\xa9\xe0\x60\x0e\xee\x10\x0e\xe9\x50\x0e\xed\x30\x0e\xeb\x70\x0e\xef\x08\x8e\xe8\x48\x8e\xec\x28\x8e\xea\x68\x8e\xee\x18\x8e\xe9\x58\x8e\xed\x38\x8e\xeb\x78\x8e\xef\x04\x4e\xe8\x44\x0e\x70\xa0\x83\x9c\xd8\xa9\xe8\x54\x72\x2a\x3b\x55\x9c\xaa\x4e\x35\xa7\xba\x53\xc3\xa9\xe9\xd4\x72\x6a\x3b\x75\x9c\xba\x4e\x3d\xa7\xbe\xd3\xc0\x69\xe8\x34\x72\x1a\x3b\x4d\x9c\xa6\x4e\x33\xa7\xb9\xd3\xc2\x69\xe9\xb4\x72\x5a\x3b\x6d\x9c\xb6\x4e\x3b\xa7\xbd\xd3\xc1\xe9\xe8\x74\x72\x3a\x3b\x5d\x9c\xae\x4e\x37\xa7\xbb\xd3\xc3\xe9\xe9\xf4\x72\x7a\x3b\x7d\x9c\xbe\x4e\x3f\xa7\xbf\x33\xc0\x19\xe8\x0c\x72\x06\x3b\x43\x9c\xa1\xce\x30\x67\xb8\x33\xc2\x19\xe9\x8c\x72\x46\x3b\x63\x9c\xb1\xce\x38\x67\xbc\x33\xc1\x99\xe8\x4c\x72\x26\x3b\x53\x9c\xa9\xce\x34\x67\xba\x33\xc3\x99\xe9\xcc\x72\x66\x3b\x73\x9c\xb9\xce\x3c\x67\xbe\xb3\xc0\x59\xe8\x2c\x72\x16\x3b\x4b\x9c\xa5\xce\x32\x67\xb9\xb3\xc2\x59\xe9\xac\x72\x56\x3b\x6b\x9c\xb5\xce\x3a\x67\xbd\xb3\xc1\xd9\xe8\x6c\x72\x36\x3b\x5b\x9c\xad\xce\x36\x67\xbb\xb3\xc3\xd9\xe9\xec\x72\x76\x3b\x7b\x9c\xbd\xce\x3e\x67\xbf\x73\xc0\x39\xe8\x1c\x72\x0e\x3b\x47\x9c\xa3\xce\x31\xe7\xb8\x73\xc2\x39\xe9\x9c\x72\x4e\x3b\x67\x9c\xb3\xce\x39\xe7\xbc\x73\xc1\xb9\xe8\x5c\x72\x2e\x3b\x57\x9c\xab\xce\x35\xe7\xba\x73\xc3\xb9\xe9\xdc\x72\x6e\x3b\x77\x9c\xbb\xce\x3d\xe7\xbe\xf3\xc0\x79\xe8\x3c\x72\x1e\x3b\x4f\x9c\xa7\xce\x33\xe7\xb9\xf3\xc2\x79\xe9\xbc\x72\x5e\x3b\x6f\x9c\xb7\xce\x3b\xe7\xbd\xf3\xc1\xf9\xe8\x7c\x72\x3e\x3b\x5f\x9c\xaf\xce\x37\xe7\xbb\xf3\xc3\xf9\xe9\xfc\x72\x7e\x3b\x7f\x9c\xbf\xce\x3f\x37\x81\x9b\xd0\x4d\xe4\x26\x76\x93\xb8\x49\xdd\x64\x6e\x72\x37\x85\x9b\xd2\x4d\xe5\xa6\x76\xd3\xb8\x69\xdd\x74\x6e\x7a\x37\x83\x9b\xd1\xcd\xe4\x66\x76\xb3\xb8\x59\xdd\x6c\x6e\x76\x37\x87\x9b\xd3\xcd\xe5\xe6\x76\xf3\xb8\x79\xdd\x7c\x6e\x7e\xb7\x80\x5b\xd0\x2d\xe4\x16\x76\x8b\xb8\x45\xdd\x62\x6e\x71\xb7\x84\x5b\xd2\x2d\xe5\x96\x76\xcb\xb8\x65\xdd\x72\x6e\x79\xb7\x82\x8b\xb9\xb8\x4b\xb8\xa4\x4b\xb9\xb4\xcb\xb8\xac\xcb\xb9\xbc\x2b\xb8\xa2\x2b\xb9\xb2\xab\xb8\xaa\xab\xb9\xba\x6b\xb8\xa6\x6b\xb9\xb6\xeb\xb8\xae\xeb\xb9\xbe\x1b\xb8\xa1\x1b\xb9\xc0\x85\x2e\x72\x63\xb7\xa2\x5b\xc9\xad\xec\x56\x71\xab\xba\xd5\xdc\xea\x6e\x0d\xb7\xa6\x5b\xcb\xad\xed\xd6\x71\xeb\xba\xf5\xdc\xfa\x6e\x03\xb7\xa1\xdb\xc8\x6d\xec\x36\x71\x9b\xba\xcd\xdc\xe6\x6e\x0b\xb7\xa5\xdb\xca\x6d\xed\xb6\x71\xdb\xba\xed\xdc\xf6\x6e\x07\xb7\xa3\xdb\xc9\xed\xec\x76\x71\xbb\xba\xdd\xdc\xee\x6e\x0f\xb7\xa7\xdb\xcb\xed\xed\xf6\x71\xfb\xba\xfd\xdc\xfe\xee\x00\x77\xa0\x3b\xc8\x1d\xec\x0e\x71\x87\xba\xc3\xdc\xe1\xee\x08\x77\xa4\x3b\xca\x1d\xed\x8e\x71\xc7\xba\xe3\xdc\xf1\xee\x04\x77\xa2\x3b\xc9\x9d\xec\x4e\x71\xa7\xba\xd3\xdc\xe9\xee\x0c\x77\xa6\x3b\xcb\x9d\xed\xce\x71\xe7\xba\xf3\xdc\xf9\xee\x02\x77\xa1\xbb\xc8\x5d\xec\x2e\x71\x97\xba\xcb\xdc\xe5\xee\x0a\x77\xa5\xbb\xca\x5d\xed\xae\x71\xd7\xba\xeb\xdc\xf5\xee\x06\x77\xa3\xbb\xc9\xdd\xec\x6e\x71\xb7\xba\xdb\xdc\xed\xee\x0e\x77\xa7\xbb\xcb\xdd\xed\xee\x71\xf7\xba\xfb\xdc\xfd\xee\x01\xf7\xa0\x7b\xc8\x3d\xec\x1e\x71\x8f\xba\xc7\xdc\xe3\xee\x09\xf7\xa4\x7b\xca\x3d\xed\x9e\x71\xcf\xba\xe7\xdc\xf3\xee\x05\xf7\xa2\x7b\xc9\xbd\xec\x5e\x71\xaf\xba\xd7\xdc\xeb\xee\x0d\xf7\xa6\x7b\xcb\xbd\xed\xde\x71\xef\xba\xf7\xdc\xfb\xee\x03\xf7\xa1\xfb\xc8\x7d\xec\x3e\x71\x9f\xba\xcf\xdc\xe7\xee\x0b\xf7\xa5\xfb\xca\x7d\xed\xbe\x71\xdf\xba\xef\xdc\xf7\xee\x07\xf7\xa3\xfb\xc9\xfd\xec\x7e\x71\xbf\xba\xdf\xdc\xef\xee\x0f\xf7\xa7\xfb\xcb\xfd\xed\xfe\x71\xff\xba\xff\xbc\x04\x5e\x42\x2f\x91\x97\xd8\x4b\xe2\x25\xf5\x92\x79\xc9\xbd\x14\x5e\x4a\x2f\x95\x97\xda\x4b\xe3\xa5\xf5\xd2\x79\xe9\xbd\x0c\x5e\x46\x2f\x93\x97\xd9\xcb\xe2\x65\xf5\xb2\x79\xd9\xbd\x1c\x5e\x4e\x2f\x97\x97\xdb\xcb\xe3\xe5\xf5\xf2\x79\xf9\xbd\x02\x5e\x41\xaf\x90\x57\xd8\x2b\xe2\x15\xf5\x8a\x79\xc5\xbd\x12\x5e\x49\xaf\x94\x57\xda\x2b\xe3\x95\xf5\xca\x79\xe5\xbd\x0a\x1e\xe6\xe1\x1e\xe1\x91\x1e\xe5\xd1\x1e\xe3\xb1\x1e\xe7\xf1\x9e\xe0\x89\x9e\xe4\xc9\x9e\xe2\xa9\x9e\xe6\xe9\x9e\xe1\x99\x9e\xe5\xd9\x9e\xe3\xb9\x9e\xe7\xf9\x5e\xe0\x85\x5e\xe4\x01\x0f\x7a\xc8\x8b\xbd\x8a\x5e\x25\xaf\xb2\x57\xc5\xab\xea\x55\xf3\xaa\x7b\x35\xbc\x9a\x5e\x2d\xaf\xb6\x57\xc7\xab\xeb\xd5\xf3\xea\x7b\x0d\xbc\x86\x5e\x23\xaf\xb1\xd7\xc4\x6b\xea\x35\xf3\x9a\x7b\x2d\xbc\x96\x5e\x2b\xaf\xb5\xd7\xc6\x6b\xeb\xb5\xf3\xda\x7b\x1d\xbc\x8e\x5e\x27\xaf\xb3\xd7\xc5\xeb\xea\x75\xf3\xba\x7b\x3d\xbc\x9e\x5e\x2f\xaf\xb7\xd7\xc7\xeb\xeb\xf5\xf3\xfa\x7b\x03\xbc\x81\xde\x20\x6f\xb0\x37\xc4\x1b\xea\x0d\xf3\x86\x7b\x23\xbc\x91\xde\x28\x6f\xb4\x37\xc6\x1b\xeb\x8d\xf3\xc6\x7b\x13\xbc\x89\xde\x24\x6f\xb2\x37\xc5\x9b\xea\x4d\xf3\xa6\x7b\x33\xbc\x99\xde\x2c\x6f\xb6\x37\xc7\x9b\xeb\xcd\xf3\xe6\x7b\x0b\xbc\x85\xde\x22\x6f\xb1\xb7\xc4\x5b\xea\x2d\xf3\x96\x7b\x2b\xbc\x95\xde\x2a\x6f\xb5\xb7\xc6\x5b\xeb\xad\xf3\xd6\x7b\x1b\xbc\x8d\xde\x26\x6f\xb3\xb7\xc5\xdb\xea\x6d\xf3\xb6\x7b\x3b\xbc\x9d\xde\x2e\x6f\xb7\xb7\xc7\xdb\xeb\xed\xf3\xf6\x7b\x07\xbc\x83\xde\x21\xef\xb0\x77\xc4\x3b\xea\x1d\xf3\x8e\x7b\x27\xbc\x93\xde\x29\xef\xb4\x77\xc6\x3b\xeb\x9d\xf3\xce\x7b\x17\xbc\x8b\xde\x25\xef\xb2\x77\xc5\xbb\xea\x5d\xf3\xae\x7b\x37\xbc\x9b\xde\x2d\xef\xb6\x77\xc7\xbb\xeb\xdd\xf3\xee\x7b\x0f\xbc\x87\xde\x23\xef\xb1\xf7\xc4\x7b\xea\x3d\xf3\x9e\x7b\x2f\xbc\x97\xde\x2b\xef\xb5\xf7\xc6\x7b\xeb\xbd\xf3\xde\x7b\x1f\xbc\x8f\xde\x27\xef\xb3\xf7\xc5\xfb\xea\x7d\xf3\xbe\x7b\x3f\xbc\x9f\xde\x2f\xef\xb7\xf7\xc7\xfb\xeb\xfd\xf3\x13\xf8\x09\xfd\x44\x7e\x62\x3f\x89\x9f\xd4\x4f\xe6\x27\xf7\x53\xf8\x29\xfd\x54\x7e\x6a\x3f\x8d\x9f\xd6\x4f\xe7\xa7\xf7\x33\xf8\x19\xfd\x4c\x7e\x66\x3f\x8b\x9f\xd5\xcf\xe6\x67\xf7\x73\xf8\x39\xfd\x5c\x7e\x6e\x3f\x8f\x9f\xd7\xcf\xe7\xe7\xf7\x0b\xf8\x05\xfd\x42\x7e\x61\xbf\x88\x5f\xd4\x2f\xe6\x17\xf7\x4b\xf8\x25\xfd\x52\x7e\x69\xbf\x8c\x5f\xd6\x2f\xe7\x97\xf7\x2b\xf8\x98\x8f\xfb\x84\x4f\xfa\x94\x4f\xfb\x8c\xcf\xfa\x9c\xcf\xfb\x82\x2f\xfa\x92\x2f\xfb\x8a\xaf\xfa\x9a\xaf\xfb\x86\x6f\xfa\x96\x6f\xfb\x8e\xef\xfa\x9e\xef\xfb\x81\x1f\xfa\x91\x0f\x7c\xe8\x23\x3f\xf6\x2b\xfa\x95\xfc\xca\x7e\x15\xbf\xaa\x5f\xcd\xaf\xee\xd7\xf0\x6b\xfa\xb5\xfc\xda\x7e\x1d\xbf\xae\x5f\xcf\xaf\xef\x37\xf0\x1b\xfa\x8d\xfc\xc6\x7e\x13\xbf\xa9\xdf\xcc\x6f\xee\xb7\xf0\x5b\xfa\xad\xfc\xd6\x7e\x1b\xbf\xad\xdf\xce\x6f\xef\x77\xf0\x3b\xfa\x9d\xfc\xce\x7e\x17\xbf\xab\xdf\xcd\xef\xee\xf7\xf0\x7b\xfa\xbd\xfc\xde\x7e\x1f\xbf\xaf\xdf\xcf\xef\xef\x0f\xf0\x07\xfa\x83\xfc\xc1\xfe\x10\x7f\xa8\x3f\xcc\x1f\xee\x8f\xf0\x47\xfa\xa3\xfc\xd1\xfe\x18\x7f\xac\x3f\xce\x1f\xef\x4f\xf0\x27\xfa\x93\xfc\xc9\xfe\x14\x7f\xaa\x3f\xcd\x9f\xee\xcf\xf0\x67\xfa\xb3\xfc\xd9\xfe\x1c\x7f\xae\x3f\xcf\x9f\xef\x2f\xf0\x17\xfa\x8b\xfc\xc5\xfe\x12\x7f\xa9\xbf\xcc\x5f\xee\xaf\xf0\x57\xfa\xab\xfc\xd5\xfe\x1a\x7f\xad\xbf\xce\x5f\xef\x6f\xf0\x37\xfa\x9b\xfc\xcd\xfe\x16\x7f\xab\xbf\xcd\xdf\xee\xef\xf0\x77\xfa\xbb\xfc\xdd\xfe\x1e\x7f\xaf\xbf\xcf\xdf\xef\x1f\xf0\x0f\xfa\x87\xfc\xc3\xfe\x11\xff\xa8\x7f\xcc\x3f\xee\x9f\xf0\x4f\xfa\xa7\xfc\xd3\xfe\x19\xff\xac\x7f\xce\x3f\xef\x5f\xf0\x2f\xfa\x97\xfc\xcb\xfe\x15\xff\xaa\x7f\xcd\xbf\xee\xdf\xf0\x6f\xfa\xb7\xfc\xdb\xfe\x1d\xff\xae\x7f\xcf\xbf\xef\x3f\xf0\x1f\xfa\x8f\xfc\xc7\xfe\x13\xff\xa9\xff\xcc\x7f\xee\xbf\xf0\x5f\xfa\xaf\xfc\xd7\xfe\x1b\xff\xad\xff\xce\x7f\xef\x7f\xf0\x3f\xfa\x9f\xfc\xcf\xfe\x17\xff\xab\xff\xcd\xff\xee\xff\xf0\x7f\xfa\xbf\xfc\xdf\xfe\x1f\xff\xaf\xff\x2f\x48\x10\x24\x0c\x12\x05\x89\x83\x24\x41\xd2\x20\x59\x90\x3c\x48\x11\xa4\x0c\x52\x05\xa9\x83\x34\x41\xda\x20\x5d\x90\x3e\xc8\x10\x64\x0c\x32\x05\x99\x83\x2c\x41\xd6\x20\x5b\x90\x3d\xc8\x11\xe4\x0c\x72\x05\xb9\x83\x3c\x41\xde\x20\x5f\x90\x3f\x28\x10\x14\x0c\x0a\x05\x85\x83\x22\x41\xd1\xa0\x58\x50\x3c\x28\x11\x94\x0c\x4a\x05\xa5\x83\x32\x41\xd9\xa0\x5c\x50\x3e\xa8\x10\x60\x01\x1e\x10\x01\x19\x50\x01\x1d\x30\x01\x1b\x70\x01\x1f\x08\x81\x18\x48\x81\x1c\x28\x81\x1a\x68\x81\x1e\x18\x81\x19\x58\x81\x1d\x38\x81\x1b\x78\x81\x1f\x04\x41\x18\x44\x01\x08\x60\x80\x82\x38\xa8\x18\x54\x0a\x2a\x07\x55\x82\xaa\x41\xb5\xa0\x7a\x50\x23\xa8\x19\xd4\x0a\x6a\x07\x75\x82\xba\x41\xbd\xa0\x7e\xd0\x20\x68\x18\x34\x0a\x1a\x07\x4d\x82\xa6\x41\xb3\xa0\x79\xd0\x22\x68\x19\xb4\x0a\x5a\x07\x6d\x82\xb6\x41\xbb\xa0\x7d\xd0\x21\xe8\x18\x74\x0a\x3a\x07\x5d\x82\xae\x41\xb7\xa0\x7b\xd0\x23\xe8\x19\xf4\x0a\x7a\x07\x7d\x82\xbe\x41\xbf\xa0\x7f\x30\x20\x18\x18\x0c\x0a\x06\x07\x43\x82\xa1\xc1\xb0\x60\x78\x30\x22\x18\x19\x8c\x0a\x46\x07\x63\x82\xb1\xc1\xb8\x60\x7c\x30\x21\x98\x18\x4c\x0a\x26\x07\x53\x82\xa9\xc1\xb4\x60\x7a\x30\x23\x98\x19\xcc\x0a\x66\x07\x73\x82\xb9\xc1\xbc\x60\x7e\xb0\x20\x58\x18\x2c\x0a\x16\x07\x4b\x82\xa5\xc1\xb2\x60\x79\xb0\x22\x58\x19\xac\x0a\x56\x07\x6b\x82\xb5\xc1\xba\x60\x7d\xb0\x21\xd8\x18\x6c\x0a\x36\x07\x5b\x82\xad\xc1\xb6\x60\x7b\xb0\x23\xd8\x19\xec\x0a\x76\x07\x7b\x82\xbd\xc1\xbe\x60\x7f\x70\x20\x38\x18\x1c\x0a\x0e\x07\x47\x82\xa3\xc1\xb1\xe0\x78\x70\x22\x38\x19\x9c\x0a\x4e\x07\x67\x82\xb3\xc1\xb9\xe0\x7c\x70\x21\xb8\x18\x5c\x0a\x2e\x07\x57\x82\xab\xc1\xb5\xe0\x7a\x70\x23\xb8\x19\xdc\x0a\x6e\x07\x77\x82\xbb\xc1\xbd\xe0\x7e\xf0\x20\x78\x18\x3c\x0a\x1e\x07\x4f\x82\xa7\xc1\xb3\xe0\x79\xf0\x22\x78\x19\xbc\x0a\x5e\x07\x6f\x82\xb7\xc1\xbb\xe0\x7d\xf0\x21\xf8\x18\x7c\x0a\x3e\x07\x5f\x82\xaf\xc1\xb7\xe0\x7b\xf0\x23\xf8\x19\xfc\x0a\x7e\x07\x7f\x82\xbf\xc1\xbf\x30\x41\x98\x30\x4c\x14\x26\x0e\x93\x84\x49\xc3\x64\x61\xf2\x30\x45\x98\x32\x4c\x15\xa6\x0e\xd3\x84\x69\xc3\x74\x61\xfa\x30\x43\x98\x31\xcc\x14\x66\x0e\xb3\x84\x59\xc3\x6c\x61\xf6\x30\x47\x98\x33\xcc\x15\xe6\x0e\xf3\x84\x79\xc3\x7c\x61\xfe\xb0\x40\x58\x30\x2c\x14\x16\x0e\x8b\x84\x45\xc3\x62\x61\xf1\xb0\x44\x58\x32\x2c\x15\x96\x0e\xcb\x84\x65\xc3\x72\x61\xf9\xb0\x42\x88\x85\x78\x48\x84\x64\x48\x85\x74\xc8\x84\x6c\xc8\x85\x7c\x28\x84\x62\x28\x85\x72\xa8\x84\x6a\xa8\x85\x7a\x68\x84\x66\x68\x85\x76\xe8\x84\x6e\xe8\x85\x7e\x18\x84\x61\x18\x85\x20\x84\x21\x0a\xe3\xb0\x62\x58\x29\xac\x1c\x56\x09\xab\x86\xd5\xc2\xea\x61\x8d\xb0\x66\x58\x2b\xac\x1d\xd6\x09\xeb\x86\xf5\xc2\xfa\x61\x83\xb0\x61\xd8\x28\x6c\x1c\x36\x09\x9b\x86\xcd\xc2\xe6\x61\x8b\xb0\x65\xd8\x2a\x6c\x1d\xb6\x09\xdb\x86\xed\xc2\xf6\x61\x87\xb0\x63\xd8\x29\xec\x1c\x76\x09\xbb\x86\xdd\xc2\xee\x61\x8f\xb0\x67\xd8\x2b\xec\x1d\xf6\x09\xfb\x86\xfd\xc2\xfe\xe1\x80\x70\x60\x38\x28\x1c\x1c\x0e\x09\x87\x86\xc3\xc2\xe1\xe1\x88\x70\x64\x38\x2a\x1c\x1d\x8e\x09\xc7\x86\xe3\xc2\xf1\xe1\x84\x70\x62\x38\x29\x9c\x1c\x4e\x09\xa7\x86\xd3\xc2\xe9\xe1\x8c\x70\x66\x38\x2b\x9c\x1d\xce\x09\xe7\x86\xf3\xc2\xf9\xe1\x82\x70\x61\xb8\x28\x5c\x1c\x2e\x09\x97\x86\xcb\xc2\xe5\xe1\x8a\x70\x65\xb8\x2a\x5c\x1d\xae\x09\xd7\x86\xeb\xc2\xf5\xe1\x86\x70\x63\xb8\x29\xdc\x1c\x6e\x09\xb7\x86\xdb\xc2\xed\xe1\x8e\x70\x67\xb8\x2b\xdc\x1d\xee\x09\xf7\x86\xfb\xc2\xfd\xe1\x81\xf0\x60\x78\x28\x3c\x1c\x1e\x09\x8f\x86\xc7\xc2\xe3\xe1\x89\xf0\x64\x78\x2a\x3c\x1d\x9e\x09\xcf\x86\xe7\xc2\xf3\xe1\x85\xf0\x62\x78\x29\xbc\x1c\x5e\x09\xaf\x86\xd7\xc2\xeb\xe1\x8d\xf0\x66\x78\x2b\xbc\x1d\xde\x09\xef\x86\xf7\xc2\xfb\xe1\x83\xf0\x61\xf8\x28\x7c\x1c\x3e\x09\x9f\x86\xcf\xc2\xe7\xe1\x8b\xf0\x65\xf8\x2a\x7c\x1d\xbe\x09\xdf\x86\xef\xc2\xf7\xe1\x87\xf0\x63\xf8\x29\xfc\x1c\x7e\x09\xbf\x86\xdf\xc2\xef\xe1\x8f\xf0\x67\xf8\x2b\xfc\x1d\xfe\x09\xff\x86\xff\xa2\x04\x51\xc2\x28\x51\x94\x38\x4a\x12\x25\x8d\x92\x45\xc9\xa3\x14\x51\xca\x28\x55\x94\x3a\x4a\x13\xa5\x8d\xd2\x45\xe9\xa3\x0c\x51\xc6\x28\x53\x94\x39\xca\x12\x65\x8d\xb2\x45\xd9\xa3\x1c\x51\xce\x28\x57\x94\x3b\xca\x13\xe5\x8d\xf2\x45\xf9\xa3\x02\x51\xc1\xa8\x50\x54\x38\x2a\x12\x15\x8d\x8a\x45\xc5\xa3\x12\x51\xc9\xa8\x54\x54\x3a\x2a\x13\x95\x8d\xca\x45\xe5\xa3\x0a\x11\x16\xe1\x11\x11\x91\x11\x15\xd1\x11\x13\xb1\x11\x17\xf1\x91\x10\x89\x91\x14\xc9\x91\x12\xa9\x91\x16\xe9\x91\x11\x99\x91\x15\xd9\x91\x13\xb9\x91\x17\xf9\x51\x10\x85\x51\x14\x81\x08\x46\x28\x8a\xa3\x8a\x51\xa5\xa8\x72\x54\x25\xaa\x1a\x55\x8b\xaa\x47\x35\xa2\x9a\x51\xad\xa8\x76\x54\x27\xaa\x1b\xd5\x8b\xea\x47\x0d\xa2\x86\x51\xa3\xa8\x71\xd4\x24\x6a\x1a\x35\x8b\x9a\x47\x2d\xa2\x96\x51\xab\xa8\x75\xd4\x26\x6a\x1b\xb5\x8b\xda\x47\x1d\xa2\x8e\x51\xa7\xa8\x73\xd4\x25\xea\x1a\x75\x8b\xba\x47\x3d\xa2\x9e\x51\xaf\xa8\x77\xd4\x27\xea\x1b\xf5\x8b\xfa\x47\x03\xa2\x81\xd1\xa0\x68\x70\x34\x24\x1a\x1a\x0d\x8b\x86\x47\x23\xa2\x91\xd1\xa8\x68\x74\x34\x26\x1a\x1b\x8d\x8b\xc6\x47\x13\xa2\x89\xd1\xa4\x68\x72\x34\x25\x9a\x1a\x4d\x8b\xa6\x47\x33\xa2\x99\xd1\xac\x68\x76\x34\x27\x9a\x1b\xcd\x8b\xe6\x47\x0b\xa2\x85\xd1\xa2\x68\x71\xb4\x24\x5a\x1a\x2d\x8b\x96\x47\x2b\xa2\x95\xd1\xaa\x68\x75\xb4\x26\x5a\x1b\xad\x8b\xd6\x47\x1b\xa2\x8d\xd1\xa6\x68\x73\xb4\x25\xda\x1a\x6d\x8b\xb6\x47\x3b\xa2\x9d\xd1\xae\x68\x77\xb4\x27\xda\x1b\xed\x8b\xf6\x47\x07\xa2\x83\xd1\xa1\xe8\x70\x74\x24\x3a\x1a\x1d\x8b\x8e\x47\x27\xa2\x93\xd1\xa9\xe8\x74\x74\x26\x3a\x1b\x9d\x8b\xce\x47\x17\xa2\x8b\xd1\xa5\xe8\x72\x74\x25\xba\x1a\x5d\x8b\xae\x47\x37\xa2\x9b\xd1\xad\xe8\x76\x74\x27\xba\x1b\xdd\x8b\xee\x47\x0f\xa2\x87\xd1\xa3\xe8\x71\xf4\x24\x7a\x1a\x3d\x8b\x9e\x47\x2f\xa2\x97\xd1\xab\xe8\x75\xf4\x26\x7a\x1b\xbd\x8b\xde\x47\x1f\xa2\x8f\xd1\xa7\xe8\x73\xf4\x25\xfa\x1a\x7d\x8b\xbe\x47\x3f\xa2\x9f\xd1\xaf\xe8\x77\xf4\x27\xfa\x1b\xfd\x03\x09\x40\x42\x90\x08\x24\x06\x49\x40\x52\x90\x0c\x24\x07\x29\x40\x4a\x90\x0a\xa4\x06\x69\x40\x5a\x90\x0e\xa4\x07\x19\x40\x46\x90\x09\x64\x06\x59\x40\x56\x90\x0d\x64\x07\x39\x40\x4e\x90\x0b\xe4\x06\x79\x40\x5e\x90\x0f\xe4\x07\x05\x40\x41\x50\x08\x14\x06\x45\x40\x51\x50\x0c\x14\x07\x25\x40\x49\x50\x0a\x94\x06\x65\x40\x59\x50\x0e\x94\x07\x15\x00\x06\x70\x40\x00\x12\x50\x80\x06\x0c\x60\x01\x07\x78\x20\x00\x11\x48\x40\x06\x0a\x50\x81\x06\x74\x60\x00\x13\x58\xc0\x06\x0e\x70\x81\x07\x7c\x10\x80\x10\x44\x00\x00\x08\x10\x88\x41\x45\x50\x09\x54\x06\x55\x40\x55\x50\x0d\x54\x07\x35\x40\x4d\x50\x0b\xd4\x06\x75\x40\x5d\x50\x0f\xd4\x07\x0d\x40\x43\xd0\x08\x34\x06\x4d\x40\x53\xd0\x0c\x34\x07\x2d\x40\x4b\xd0\x0a\xb4\x06\x6d\x40\x5b\xd0\x0e\xb4\x07\x1d\x40\x47\xd0\x09\x74\x06\x5d\x40\x57\xd0\x0d\x74\x07\x3d\x40\x4f\xd0\x0b\xf4\x06\x7d\x40\x5f\xd0\x0f\xf4\x07\x03\xc0\x40\x30\x08\x0c\x06\x43\xc0\x50\x30\x0c\x0c\x07\x23\xc0\x48\x30\x0a\x8c\x06\x63\xc0\x58\x30\x0e\x8c\x07\x13\xc0\x44\x30\x09\x4c\x06\x53\xc0\x54\x30\x0d\x4c\x07\x33\xc0\x4c\x30\x0b\xcc\x06\x73\xc0\x5c\x30\x0f\xcc\x07\x0b\xc0\x42\xb0\x08\x2c\x06\x4b\xc0\x52\xb0\x0c\x2c\x07\x2b\xc0\x4a\xb0\x0a\xac\x06\x6b\xc0\x5a\xb0\x0e\xac\x07\x1b\xc0\x46\xb0\x09\x6c\x06\x5b\xc0\x56\xb0\x0d\x6c\x07\x3b\xc0\x4e\xb0\x0b\xec\x06\x7b\xc0\x5e\xb0\x0f\xec\x07\x07\xc0\x41\x70\x08\x1c\x06\x47\xc0\x51\x70\x0c\x1c\x07\x27\xc0\x49\x70\x0a\x9c\x06\x67\xc0\x59\x70\x0e\x9c\x07\x17\xc0\x45\x70\x09\x5c\x06\x57\xc0\x55\x70\x0d\x5c\x07\x37\xc0\x4d\x70\x0b\xdc\x06\x77\xc0\x5d\x70\x0f\xdc\x07\x0f\xc0\x43\xf0\x08\x3c\x06\x4f\xc0\x53\xf0\x0c\x3c\x07\x2f\xc0\x4b\xf0\x0a\xbc\x06\x6f\xc0\x5b\xf0\x0e\xbc\x07\x1f\xc0\x47\xf0\x09\x7c\x06\x5f\xc0\x57\xf0\x0d\x7c\x07\x3f\xc0\x4f\xf0\x0b\xfc\x06\x7f\xc0\x5f\xf0\x0f\x26\x80\x09\x61\x22\x98\x18\x26\x81\x49\x61\x32\x98\x1c\xa6\x80\x29\x61\x2a\x98\x1a\xa6\x81\x69\x61\x3a\x98\x1e\x66\x80\x19\x61\x26\x98\x19\x66\x81\x59\x61\x36\x98\x1d\xe6\x80\x39\x61\x2e\x98\x1b\xe6\x81\x79\x61\x3e\x98\x1f\x16\x80\x05\x61\x21\x58\x18\x16\x81\x45\x61\x31\x58\x1c\x96\x80\x25\x61\x29\x58\x1a\x96\x81\x65\x61\x39\x58\x1e\x56\x80\x18\xc4\x21\x01\x49\x48\x41\x1a\x32\x90\x85\x1c\xe4\xa1\x00\x45\x28\x41\x19\x2a\x50\x85\x1a\xd4\xa1\x01\x4d\x68\x41\x1b\x3a\xd0\x85\x1e\xf4\x61\x00\x43\x18\x41\x00\x21\x44\x30\x86\x15\x61\x25\x58\x19\x56\x81\x55\x61\x35\x58\x1d\xd6\x80\x35\x61\x2d\x58\x1b\xd6\x81\x75\x61\x3d\x58\x1f\x36\x80\x0d\x61\x23\xd8\x18\x36\x81\x4d\x61\x33\xd8\x1c\xb6\x80\x2d\x61\x2b\xd8\x1a\xb6\x81\x6d\x61\x3b\xd8\x1e\x76\x80\x1d\x61\x27\xd8\x19\x76\x81\x5d\x61\x37\xd8\x1d\xf6\x80\x3d\x61\x2f\xd8\x1b\xf6\x81\x7d\x61\x3f\xd8\x1f\x0e\x80\x03\xe1\x20\x38\x18\x0e\x81\x43\xe1\x30\x38\x1c\x8e\x80\x23\xe1\x28\x38\x1a\x8e\x81\x63\xe1\x38\x38\x1e\x4e\x80\x13\xe1\x24\x38\x19\x4e\x81\x53\xe1\x34\x38\x1d\xce\x80\x33\xe1\x2c\x38\x1b\xce\x81\x73\xe1\x3c\x38\x1f\x2e\x80\x0b\xe1\x22\xb8\x18\x2e\x81\x4b\xe1\x32\xb8\x1c\xae\x80\x2b\xe1\x2a\xb8\x1a\xae\x81\x6b\xe1\x3a\xb8\x1e\x6e\x80\x1b\xe1\x26\xb8\x19\x6e\x81\x5b\xe1\x36\xb8\x1d\xee\x80\x3b\xe1\x2e\xb8\x1b\xee\x81\x7b\xe1\x3e\xb8\x1f\x1e\x80\x07\xe1\x21\x78\x18\x1e\x81\x47\xe1\x31\x78\x1c\x9e\x80\x27\xe1\x29\x78\x1a\x9e\x81\x67\xe1\x39\x78\x1e\x5e\x80\x17\xe1\x25\x78\x19\x5e\x81\x57\xe1\x35\x78\x1d\xde\x80\x37\xe1\x2d\x78\x1b\xde\x81\x77\xe1\x3d\x78\x1f\x3e\x80\x0f\xe1\x23\xf8\x18\x3e\x81\x4f\xe1\x33\xf8\x1c\xbe\x80\x2f\xe1\x2b\xf8\x1a\xbe\x81\x6f\xe1\x3b\xf8\x1e\x7e\x80\x1f\xe1\x27\xf8\x19\x7e\x81\x5f\xe1\x37\xf8\x1d\xfe\x80\x3f\xe1\x2f\xf8\x1b\xfe\x81\x7f\xe1\x3f\x94\x00\x25\x44\x89\x50\x62\x94\x04\x25\x45\xc9\x50\x72\x94\x02\xa5\x44\xa9\x50\x6a\x94\x06\xa5\x45\xe9\x50\x7a\x94\x01\x65\x44\x99\x50\x66\x94\x05\x65\x45\xd9\x50\x76\x94\x03\xe5\x44\xb9\x50\x6e\x94\x07\xe5\x45\xf9\x50\x7e\x54\x00\x15\x44\x85\x50\x61\x54\x04\x15\x45\xc5\x50\x71\x54\x02\x95\x44\xa5\x50\x69\x54\x06\x95\x45\xe5\x50\x79\x54\x01\x61\x08\x47\x04\x22\x11\x85\x68\xc4\x20\x16\x71\x88\x47\x02\x12\x91\x84\x64\xa4\x20\x15\x69\x48\x47\x06\x32\x91\x85\x6c\xe4\x20\x17\x79\xc8\x47\x01\x0a\x51\x84\x00\x82\x08\xa1\x18\x55\x44\x95\x50\x65\x54\x05\x55\x45\xd5\x50\x75\x54\x03\xd5\x44\xb5\x50\x6d\x54\x07\xd5\x45\xf5\x50\x7d\xd4\x00\x35\x44\x8d\x50\x63\xd4\x04\x35\x45\xcd\x50\x73\xd4\x02\xb5\x44\xad\x50\x6b\xd4\x06\xb5\x45\xed\x50\x7b\xd4\x01\x75\x44\x9d\x50\x67\xd4\x05\x75\x45\xdd\x50\x77\xd4\x03\xf5\x44\xbd\x50\x6f\xd4\x07\xf5\x45\xfd\x50\x7f\x34\x00\x0d\x44\x83\xd0\x60\x34\x04\x0d\x45\xc3\xd0\x70\x34\x02\x8d\x44\xa3\xd0\x68\x34\x06\x8d\x45\xe3\xd0\x78\x34\x01\x4d\x44\x93\xd0\x64\x34\x05\x4d\x45\xd3\xd0\x74\x34\x03\xcd\x44\xb3\xd0\x6c\x34\x07\xcd\x45\xf3\xd0\x7c\xb4\x00\x2d\x44\x8b\xd0\x62\xb4\x04\x2d\x45\xcb\xd0\x72\xb4\x02\xad\x44\xab\xd0\x6a\xb4\x06\xad\x45\xeb\xd0\x7a\xb4\x01\x6d\x44\x9b\xd0\x66\xb4\x05\x6d\x45\xdb\xd0\x76\xb4\x03\xed\x44\xbb\xd0\x6e\xb4\x07\xed\x45\xfb\xd0\x7e\x74\x00\x1d\x44\x87\xd0\x61\x74\x04\x1d\x45\xc7\xd0\x71\x74\x02\x9d\x44\xa7\xd0\x69\x74\x06\x9d\x45\xe7\xd0\x79\x74\x01\x5d\x44\x97\xd0\x65\x74\x05\x5d\x45\xd7\xd0\x75\x74\x03\xdd\x44\xb7\xd0\x6d\x74\x07\xdd\x45\xf7\xd0\x7d\xf4\x00\x3d\x44\x8f\xd0\x63\xf4\x04\x3d\x45\xcf\xd0\x73\xf4\x02\xbd\x44\xaf\xd0\x6b\xf4\x06\xbd\x45\xef\xd0\x7b\xf4\x01\x7d\x44\x9f\xd0\x67\xf4\x05\x7d\x45\xdf\xd0\x77\xf4\x03\xfd\x44\xbf\xd0\x6f\xf4\x07\xfd\x45\xff\xe2\x04\x71\xc2\x38\x51\x9c\x38\x4e\x12\x27\x8d\x93\xc5\xc9\xe3\x14\x71\xca\x38\x55\x9c\x3a\x4e\x13\xa7\x8d\xd3\xc5\xe9\xe3\x0c\x71\xc6\x38\x53\x9c\x39\xce\x12\x67\x8d\xb3\xc5\xd9\xe3\x1c\x71\xce\x38\x57\x9c\x3b\xce\x13\xe7\x8d\xf3\xc5\xf9\xe3\x02\x71\xc1\xb8\x50\x5c\x38\x2e\x12\x17\x8d\x8b\xc5\xc5\xe3\x12\x71\xc9\xb8\x54\x5c\x3a\x2e\x13\x97\x8d\xcb\xc5\xe5\xe3\x0a\x31\x16\xe3\x31\x11\x93\x31\x15\xd3\x31\x13\xb3\x31\x17\xf3\xb1\x10\x8b\xb1\x14\xcb\xb1\x12\xab\xb1\x16\xeb\xb1\x11\x9b\xb1\x15\xdb\xb1\x13\xbb\xb1\x17\xfb\x71\x10\x87\x71\x14\x83\x18\xc6\x28\x8e\xe3\x8a\x71\xa5\xb8\x72\x5c\x25\xae\x1a\x57\x8b\xab\xc7\x35\xe2\x9a\x71\xad\xb8\x76\x5c\x27\xae\x1b\xd7\x8b\xeb\xc7\x0d\xe2\x86\x71\xa3\xb8\x71\xdc\x24\x6e\x1a\x37\x8b\x9b\xc7\x2d\xe2\x96\x71\xab\xb8\x75\xdc\x26\x6e\x1b\xb7\x8b\xdb\xc7\x1d\xfe\x13\x00\x0f\x00\x40\xc4\x00\x00\x00\xb3\x6d\xdb\xb6\x6d\xd7\xdb\xb6\xb6\x7d\xb6\x6d\xdb\xb6\x6d\xdb\xb6\x6d\x5b\x87\x75\xc4\x3a\x61\x9d\xb1\x2e\x58\x57\xac\x1b\xd6\x1d\xeb\x81\xf5\xc4\x7a\x61\xbd\xb1\x3e\x58\x5f\xac\x1f\xd6\x1f\x1b\x80\x0d\xc4\x06\x61\x83\xb1\x21\xd8\x50\x6c\x18\x36\x1c\x1b\x81\x8d\xc4\x46\x61\xa3\xb1\x31\xd8\x58\x6c\x1c\x36\x1e\x9b\x80\x4d\xc4\x26\x61\x93\xb1\x29\xd8\x54\x6c\x1a\x36\x1d\x9b\x81\xcd\xc4\x66\x61\xb3\xb1\x39\xd8\x5c\x6c\x1e\x36\x1f\x5b\x80\x2d\xc4\x16\x61\x8b\xb1\x25\xd8\x52\x6c\x19\xb6\x1c\x5b\x81\xad\xc4\x56\x61\xab\xb1\x35\xd8\x5a\x6c\x1d\xb6\x1e\xdb\x80\x6d\xc4\x36\x61\x9b\xb1\x2d\xd8\x56\x6c\x1b\xb6\x1d\xdb\x81\xed\xc4\x76\x61\xbb\xb1\x3d\xd8\x5e\x6c\x1f\xb6\x1f\x3b\x80\x1d\xc4\x0e\x61\x87\xb1\x23\xd8\x51\xec\x18\x76\x1c\x3b\x81\x9d\xc4\x4e\x61\xa7\xb1\x33\xd8\x59\xec\x1c\x76\x1e\xbb\x80\x5d\xc4\x2e\x61\x97\xb1\x2b\xd8\x55\xec\x1a\x76\x1d\xbb\x81\xdd\xc4\x6e\x61\xb7\xb1\x3b\xd8\x5d\xec\x1e\x76\x1f\x7b\x80\x3d\xc4\x1e\x61\x8f\xb1\x27\xd8\x53\xec\x19\xf6\x1c\x7b\x81\xbd\xc4\x5e\x61\xaf\xb1\x37\xd8\x5b\xec\x1d\xf6\x1e\xfb\x80\x7d\xc4\x3e\x61\x9f\xb1\x2f\xd8\x57\xec\x1b\xf6\x1d\xfb\x81\xfd\xc4\x7e\x61\xbf\xb1\x3f\xd8\x5f\xec\x1f\x9e\x00\x4f\x88\x27\xc2\x13\xe3\x49\xf0\xa4\x78\x32\x3c\x39\x9e\x02\x4f\x89\xa7\xc2\x53\xe3\x69\xf0\xb4\x78\x3a\x3c\x3d\x9e\x01\xcf\x88\x67\xc2\x33\xe3\x59\xf0\xac\x78\x36\x3c\x3b\x9e\x03\xcf\x89\xe7\xc2\x73\xe3\x79\xf0\xbc\x78\x3e\x3c\x3f\x5e\x00\x2f\x88\x17\xc2\x0b\xe3\x45\xf0\xa2\x78\x31\xbc\x38\x5e\x02\x2f\x89\x97\xc2\x4b\xe3\x65\xf0\xb2\x78\x39\xbc\x3c\x5e\x01\xaf\x88\x57\xc2\x2b\xe3\x55\xf0\xaa\x78\x35\xbc\x3a\x5e\x03\xaf\x89\xd7\xc2\x6b\xe3\x75\xf0\xba\x78\x3d\xbc\x3e\xde\x00\x6f\x88\x37\xc2\x1b\xe3\x4d\xf0\xa6\x78\x33\xbc\x39\xde\x02\x6f\x89\xb7\xc2\x5b\xe3\x6d\xf0\xb6\x78\x3b\xbc\x3d\xde\x01\xc7\x70\x1c\x27\x70\x12\xa7\x70\x1a\x67\x70\x16\xe7\x70\x1e\x17\x70\x11\x97\x70\x19\x57\x70\x15\xd7\x70\x1d\x37\x70\x13\xb7\x70\x1b\x77\x70\x17\xf7\x70\x1f\x0f\xf0\x10\x8f\x70\x80\x43\x1c\xe1\x31\xde\x11\xef\x84\x77\xc6\xbb\xe0\x5d\xf1\x6e\x78\x77\xbc\x07\xde\x13\xef\x85\xf7\xc6\xfb\xe0\x7d\xf1\x7e\x78\x7f\x7c\x00\x3e\x10\x1f\x84\x0f\xc6\x87\xe0\x43\xf1\x61\xf8\x70\x7c\x04\x3e\x12\x1f\x85\x8f\xc6\xc7\xe0\x63\xf1\x71\xf8\x78\x7c\x02\x3e\x11\x9f\x84\x4f\xc6\xa7\xe0\x53\xf1\x69\xf8\x74\x7c\x06\x3e\x13\x9f\x85\xcf\xc6\xe7\xe0\x73\xf1\x79\xf8\x7c\x7c\x01\xbe\x10\x5f\x84\x2f\xc6\x97\xe0\x4b\xf1\x65\xf8\x72\x7c\x05\xbe\x12\x5f\x85\xaf\xc6\xd7\xe0\x6b\xf1\x75\xf8\x7a\x7c\x03\xbe\x11\xdf\x84\x6f\xc6\xb7\xe0\x5b\xf1\x6d\xf8\x76\x7c\x07\xbe\x13\xdf\x85\xef\xc6\xf7\xe0\x7b\xf1\x7d\xf8\x7e\xfc\x00\x7e\x10\x3f\x84\x1f\xc6\x8f\xe0\x47\xf1\x63\xf8\x71\xfc\x04\x7e\x12\x3f\x85\x9f\xc6\xcf\xe0\x67\xf1\x73\xf8\x79\xfc\x02\x7e\x11\xbf\x84\x5f\xc6\xaf\xe0\x57\xf1\x6b\xf8\x75\xfc\x06\x7e\x13\xbf\x85\xdf\xc6\xef\xe0\x77\xf1\x7b\xf8\x7d\xfc\x01\xfe\x10\x7f\x84\x3f\xc6\x9f\xe0\x4f\xf1\x67\xf8\x73\xfc\x05\xfe\x12\x7f\x85\xbf\xc6\xdf\xe0\x6f\xf1\x77\xf8\x7b\xfc\x03\xfe\x11\xff\x84\x7f\xc6\xbf\xe0\x5f\xf1\x6f\xf8\x77\xfc\x07\xfe\x13\xff\x85\xff\xc6\xff\xe0\x7f\xf1\x7f\x44\x02\x22\x21\x91\x88\x48\x4c\x24\x21\x92\x12\xc9\x88\xe4\x44\x0a\x22\x25\x91\x8a\x48\x4d\xa4\x21\xd2\x12\xe9\x88\xf4\x44\x06\x22\x23\x91\x89\xc8\x4c\x64\x21\xb2\x12\xd9\x88\xec\x44\x0e\x22\x27\x91\x8b\xc8\x4d\xe4\x21\xf2\x12\xf9\x88\xfc\x44\x01\xa2\x20\x51\x88\x28\x4c\x14\x21\x8a\x12\xc5\x88\xe2\x44\x09\xa2\x24\x51\x8a\x28\x4d\x94\x21\xca\x12\xe5\x88\xf2\x44\x05\xa2\x22\x51\x89\xa8\x4c\x54\x21\xaa\x12\xd5\x88\xea\x44\x0d\xa2\x26\x51\x8b\xa8\x4d\xd4\x21\xea\x12\xf5\x88\xfa\x44\x03\xa2\x21\xd1\x88\x68\x4c\x34\x21\x9a\x12\xcd\x88\xe6\x44\x0b\xa2\x25\xd1\x8a\x68\x4d\xb4\x21\xda\x12\xed\x88\xf6\x44\x07\x02\x23\x70\x82\x20\x48\x82\x22\x68\x82\x21\x58\x82\x23\x78\x42\x20\x44\x42\x22\x64\x42\x21\x54\x42\x23\x74\xc2\x20\x4c\xc2\x22\x6c\xc2\x21\x5c\xc2\x23\x7c\x22\x20\x42\x22\x22\x00\x01\x09\x44\xc4\x44\x47\xa2\x13\xd1\x99\xe8\x42\x74\x25\xba\x11\xdd\x89\x1e\x44\x4f\xa2\x17\xd1\x9b\xe8\x43\xf4\x25\xfa\x11\xfd\x89\x01\xc4\x40\x62\x10\x31\x98\x18\x42\x0c\x25\x86\x11\xc3\x89\x11\xc4\x48\x62\x14\x31\x9a\x18\x43\x8c\x25\xc6\x11\xe3\x89\x09\xc4\x44\x62\x12\x31\x99\x98\x42\x4c\x25\xa6\x11\xd3\x89\x19\xc4\x4c\x62\x16\x31\x9b\x98\x43\xcc\x25\xe6\x11\xf3\x89\x05\xc4\x42\x62\x11\xb1\x98\x58\x42\x2c\x25\x96\x11\xcb\x89\x15\xc4\x4a\x62\x15\xb1\x9a\x58\x43\xac\x25\xd6\x11\xeb\x89\x0d\xc4\x46\x62\x13\xb1\x99\xd8\x42\x6c\x25\xb6\x11\xdb\x89\x1d\xc4\x4e\x62\x17\xb1\x9b\xd8\x43\xec\x25\xf6\x11\xfb\x89\x03\xc4\x41\xe2\x10\x71\x98\x38\x42\x1c\x25\x8e\x11\xc7\x89\x13\xc4\x49\xe2\x14\x71\x9a\x38\x43\x9c\x25\xce\x11\xe7\x89\x0b\xc4\x45\xe2\x12\x71\x99\xb8\x42\x5c\x25\xae\x11\xd7\x89\x1b\xc4\x4d\xe2\x16\x71\x9b\xb8\x43\xdc\x25\xee\x11\xf7\x89\x07\xc4\x43\xe2\x11\xf1\x98\x78\x42\x3c\x25\x9e\x11\xcf\x89\x17\xc4\x4b\xe2\x15\xf1\x9a\x78\x43\xbc\x25\xde\x11\xef\x89\x0f\xc4\x47\xe2\x13\xf1\x99\xf8\x42\x7c\x25\xbe\x11\xdf\x89\x1f\xc4\x4f\xe2\x17\xf1\x9b\xf8\x43\xfc\x25\xfe\x91\x09\xc8\x84\x64\x22\x32\x31\x99\x84\x4c\x4a\x26\x23\x93\x93\x29\xc8\x94\x64\x2a\x32\x35\x99\x86\x4c\x4b\xa6\x23\xd3\x93\x19\xc8\x8c\x64\x26\x32\x33\x99\x85\xcc\x4a\x66\x23\xb3\x93\x39\xc8\x9c\x64\x2e\x32\x37\x99\x87\xcc\x4b\xe6\x23\xf3\x93\x05\xc8\x82\x64\x21\xb2\x30\x59\x84\x2c\x4a\x16\x23\x8b\x93\x25\xc8\x92\x64\x29\xb2\x34\x59\x86\x2c\x4b\x96\x23\xcb\x93\x15\xc8\x8a\x64\x25\xb2\x32\x59\x85\xac\x4a\x56\x23\xab\x93\x35\xc8\x9a\x64\x2d\xb2\x36\x59\x87\xac\x4b\xd6\x23\xeb\x93\x0d\xc8\x86\x64\x23\xb2\x31\xd9\x84\x6c\x4a\x36\x23\x9b\x93\x2d\xc8\x96\x64\x2b\xb2\x35\xd9\x86\x6c\x4b\xb6\x23\xdb\x93\x1d\x48\x8c\xc4\x49\x82\x24\x49\x8a\xa4\x49\x86\x64\x49\x8e\xe4\x49\x81\x14\x49\x89\x94\x49\x85\x54\x49\x8d\xd4\x49\x83\x34\x49\x8b\xb4\x49\x87\x74\x49\x8f\xf4\xc9\x80\x0c\xc9\x88\x04\x24\x24\x11\x19\x93\x1d\xc9\x4e\x64\x67\xb2\x0b\xd9\x95\xec\x46\x76\x27\x7b\x90\x3d\xc9\x5e\x64\x6f\xb2\x0f\xd9\x97\xec\x47\xf6\x27\x07\x90\x03\xc9\x41\xe4\x60\x72\x08\x39\x94\x1c\x46\x0e\x27\x47\x90\x23\xc9\x51\xe4\x68\x72\x0c\x39\x96\x1c\x47\x8e\x27\x27\x90\x13\xc9\x49\xe4\x64\x72\x0a\x39\x95\x9c\x46\x4e\x27\x67\x90\x33\xc9\x59\xe4\x6c\x72\x0e\x39\x97\x9c\x47\xce\x27\x17\x90\x0b\xc9\x45\xe4\x62\x72\x09\xb9\x94\x5c\x46\x2e\x27\x57\x90\x2b\xc9\x55\xe4\x6a\x72\x0d\xb9\x96\x5c\x47\xae\x27\x37\x90\x1b\xc9\x4d\xe4\x66\x72\x0b\xb9\x95\xdc\x46\x6e\x27\x77\x90\x3b\xc9\x5d\xe4\x6e\x72\x0f\xb9\x97\xdc\x47\xee\x27\x0f\x90\x07\xc9\x43\xe4\x61\xf2\x08\x79\x94\x3c\x46\x1e\x27\x4f\x90\x27\xc9\x53\xe4\x69\xf2\x0c\x79\x96\x3c\x47\x9e\x27\x2f\x90\x17\xc9\x4b\xe4\x65\xf2\x0a\x79\x95\xbc\x46\x5e\x27\x6f\x90\x37\xc9\x5b\xe4\x6d\xf2\x0e\x79\x97\xbc\x47\xde\x27\x1f\x90\x0f\xc9\x47\xe4\x63\xf2\x09\xf9\x94\x7c\x46\x3e\x27\x5f\x90\x2f\xc9\x57\xe4\x6b\xf2\x0d\xf9\x96\x7c\x47\xbe\x27\x3f\x90\x1f\xc9\x4f\xe4\x67\xf2\x0b\xf9\x95\xfc\x46\x7e\x27\x7f\x90\x3f\xc9\x5f\xe4\x6f\xf2\x0f\xf9\x97\xfc\x47\x25\xa0\x12\x52\x89\xa8\xc4\x54\x12\x2a\x29\x95\x8c\x4a\x4e\xa5\xa0\x52\x52\xa9\xa8\xd4\x54\x1a\x2a\x2d\x95\x8e\x4a\x4f\x65\xa0\x32\x52\x99\xa8\xcc\x54\x16\x2a\x2b\x95\x8d\xca\x4e\xe5\xa0\x72\x52\xb9\xa8\xdc\x54\x1e\x2a\x2f\x95\x8f\xca\x4f\x15\xa0\x0a\x52\x85\xa8\xc2\x54\x11\xaa\x28\x55\x8c\x2a\x4e\x95\xa0\x4a\x52\xa5\xa8\xd2\x54\x19\xaa\x2c\x55\x8e\x2a\x4f\x55\xa0\x2a\x52\x95\xa8\xca\x54\x15\xaa\x2a\x55\x8d\xaa\x4e\xd5\xa0\x6a\x52\xb5\xa8\xda\x54\x1d\xaa\x2e\x55\x8f\xaa\x4f\x35\xa0\x1a\x52\x8d\xa8\xc6\x54\x13\xaa\x29\xd5\x8c\x6a\x4e\xb5\xa0\x5a\x52\xad\xa8\xd6\x54\x1b\xaa\x2d\xd5\x8e\x6a\x4f\x75\xa0\x30\x0a\xa7\x08\x8a\xa4\x28\x8a\xa6\x18\x8a\xa5\x38\x8a\xa7\x04\x4a\xa4\x24\x4a\xa6\x14\x4a\xa5\x34\x4a\xa7\x0c\xca\xa4\x2c\xca\xa6\x1c\xca\xa5\x3c\xca\xa7\x02\x2a\xa4\x22\x0a\x50\x90\x42\x54\x4c\x75\xa4\x3a\x51\x9d\xa9\x2e\x54\x57\xaa\x1b\xd5\x9d\xea\x41\xf5\xa4\x7a\x51\xbd\xa9\x3e\x54\x5f\xaa\x1f\xd5\x9f\x1a\x40\x0d\xa4\x06\x51\x83\xa9\x21\xd4\x50\x6a\x18\x35\x9c\x1a\x41\x8d\xa4\x46\x51\xa3\xa9\x31\xd4\x58\x6a\x1c\x35\x9e\x9a\x40\x4d\xa4\x26\x51\x93\xa9\x29\xd4\x54\x6a\x1a\x35\x9d\x9a\x41\xcd\xa4\x66\x51\xb3\xa9\x39\xd4\x5c\x6a\x1e\x35\x9f\x5a\x40\x2d\xa4\x16\x51\x8b\xa9\x25\xd4\x52\x6a\x19\xb5\x9c\x5a\x41\xad\xa4\x56\x51\xab\xa9\x35\xd4\x5a\x6a\x1d\xb5\x9e\xda\x40\x6d\xa4\x36\x51\x9b\xa9\x2d\xd4\x56\x6a\x1b\xb5\x9d\xda\x41\xed\xa4\x76\x51\xbb\xa9\x3d\xd4\x5e\x6a\x1f\xb5\x9f\x3a\x40\x1d\xa4\x0e\x51\x87\xa9\x23\xd4\x51\xea\x18\x75\x9c\x3a\x41\x9d\xa4\x4e\x51\xa7\xa9\x33\xd4\x59\xea\x1c\x75\x9e\xba\x40\x5d\xa4\x2e\x51\x97\xa9\x2b\xd4\x55\xea\x1a\x75\x9d\xba\x41\xdd\xa4\x6e\x51\xb7\xa9\x3b\xd4\x5d\xea\x1e\x75\x9f\x7a\x40\x3d\xa4\x1e\x51\x8f\xa9\x27\xd4\x53\xea\x19\xf5\x9c\x7a\x41\xbd\xa4\x5e\x51\xaf\xa9\x37\xd4\x5b\xea\x1d\xf5\x9e\xfa\x40\x7d\xa4\x3e\x51\x9f\xa9\x2f\xd4\x57\xea\x1b\xf5\x9d\xfa\x41\xfd\xa4\x7e\x51\xbf\xa9\x3f\xd4\x5f\xea\x1f\x9d\x80\x4e\x48\x27\xa2\x13\xd3\x49\xe8\xa4\x74\x32\x3a\x39\x9d\x82\x4e\x49\xa7\xa2\x53\xd3\x69\xe8\xb4\x74\x3a\x3a\x3d\x9d\x81\xce\x48\x67\xa2\x33\xd3\x59\xe8\xac\x74\x36\x3a\x3b\x9d\x83\xce\x49\xe7\xa2\x73\xd3\x79\xe8\xbc\x74\x3e\x3a\x3f\x5d\x80\x2e\x48\x17\xa2\x0b\xd3\x45\xe8\xa2\x74\x31\xba\x38\x5d\x82\x2e\x49\x97\xa2\x4b\xd3\x65\xe8\xb2\x74\x39\xba\x3c\x5d\x81\xae\x48\x57\xa2\x2b\xd3\x55\xe8\xaa\x74\x35\xba\x3a\x5d\x83\xae\x49\xd7\xa2\x6b\xd3\x75\xe8\xba\x74\x3d\xba\x3e\xdd\x80\x6e\x48\x37\xa2\x1b\xd3\x4d\xe8\xa6\x74\x33\xba\x39\xdd\x82\x6e\x49\xb7\xa2\x5b\xd3\x6d\xe8\xb6\x74\x3b\xba\x3d\xdd\x81\xc6\x68\x9c\x26\x68\x92\xa6\x68\x9a\x66\x68\x96\xe6\x68\x9e\x16\x68\x91\x96\x68\x99\x56\x68\x95\xd6\x68\x9d\x36\x68\x93\xb6\x68\x9b\x76\x68\x97\xf6\x68\x9f\x0e\xe8\x90\x8e\x68\x40\x43\x1a\xd1\x31\xdd\x91\xee\x44\x77\xa6\xbb\xd0\x5d\xe9\x6e\x74\x77\xba\x07\xdd\x93\xee\x45\xf7\xa6\xfb\xd0\x7d\xe9\x7e\x74\x7f\x7a\x00\x3d\x90\x1e\x44\x0f\xa6\x87\xd0\x43\xe9\x61\xf4\x70\x7a\x04\x3d\x92\x1e\x45\x8f\xa6\xc7\xd0\x63\xe9\x71\xf4\x78\x7a\x02\x3d\x91\x9e\x44\x4f\xa6\xa7\xd0\x53\xe9\x69\xf4\x74\x7a\x06\x3d\x93\x9e\x45\xcf\xa6\xe7\xd0\x73\xe9\x79\xf4\x7c\x7a\x01\xbd\x90\x5e\x44\x2f\xa6\x97\xd0\x4b\xe9\x65\xf4\x72\x7a\x05\xbd\x92\x5e\x45\xaf\xa6\xd7\xd0\x6b\xe9\x75\xf4\x7a\x7a\x03\xbd\x91\xde\x44\x6f\xa6\xb7\xd0\x5b\xe9\x6d\xf4\x76\x7a\x07\xbd\x93\xde\x45\xef\xa6\xf7\xd0\x7b\xe9\x7d\xf4\x7e\xfa\x00\x7d\x90\x3e\x44\x1f\xa6\x8f\xd0\x47\xe9\x63\xf4\x71\xfa\x04\x7d\x92\x3e\x45\x9f\xa6\xcf\xd0\x67\xe9\x73\xf4\x79\xfa\x02\x7d\x91\xbe\x44\x5f\xa6\xaf\xd0\x57\xe9\x6b\xf4\x75\xfa\x06\x7d\x93\xbe\x45\xdf\xa6\xef\xd0\x77\xe9\x7b\xf4\x7d\xfa\x01\xfd\x90\x7e\x44\x3f\xa6\x9f\xd0\x4f\xe9\x67\xf4\x73\xfa\x05\xfd\x92\x7e\x45\xbf\xa6\xdf\xd0\x6f\xe9\x77\xf4\x7b\xfa\x03\xfd\x91\xfe\x44\x7f\xa6\xbf\xd0\x5f\xe9\x6f\xf4\x77\xfa\x07\xfd\x93\xfe\x45\xff\xa6\xff\xd0\x7f\xe9\x7f\x4c\x02\x26\x21\x93\x88\x49\xcc\x24\x61\x92\x32\xc9\x98\xe4\x4c\x0a\x26\x25\x93\x8a\x49\xcd\xa4\x61\xd2\x32\xe9\x98\xf4\x4c\x06\x26\x23\x93\x89\xc9\xcc\x64\x61\xb2\x32\xd9\x98\xec\x4c\x0e\x26\x27\x93\x8b\xc9\xcd\xe4\x61\xf2\x32\xf9\x98\xfc\x4c\x01\xa6\x20\x53\x88\x29\xcc\x14\x61\x8a\x32\xc5\x98\xe2\x4c\x09\xa6\x24\x53\x8a\x29\xcd\x94\x61\xca\x32\xe5\x98\xf2\x4c\x05\xa6\x22\x53\x89\xa9\xcc\x54\x61\xaa\x32\xd5\x98\xea\x4c\x0d\xa6\x26\x53\x8b\xa9\xcd\xd4\x61\xea\x32\xf5\x98\xfa\x4c\x03\xa6\x21\xd3\x88\x69\xcc\x34\x61\x9a\x32\xcd\x98\xe6\x4c\x0b\xa6\x25\xd3\x8a\x69\xcd\xb4\x61\xda\x32\xed\x98\xf6\x4c\x07\x06\x63\x70\x86\x60\x48\x86\x62\x68\x86\x61\x58\x86\x63\x78\x46\x60\x44\x46\x62\x64\x46\x61\x54\x46\x63\x74\xc6\x60\x4c\xc6\x62\x6c\xc6\x61\x5c\xc6\x63\x7c\x26\x60\x42\x26\x62\x00\x03\x19\xc4\xc4\x4c\x47\xa6\x13\xd3\x99\xe9\xc2\x74\x65\xba\x31\xdd\x99\x1e\x4c\x4f\xa6\x17\xd3\x9b\xe9\xc3\xf4\x65\xfa\x31\xfd\x99\x01\xcc\x40\x66\x10\x33\x98\x19\xc2\x0c\x65\x86\x31\xc3\x99\x11\xcc\x48\x66\x14\x33\x9a\x19\xc3\x8c\x65\xc6\x31\xe3\x99\x09\xcc\x44\x66\x12\x33\x99\x99\xc2\x4c\x65\xa6\x31\xd3\x99\x19\xcc\x4c\x66\x16\x33\x9b\x99\xc3\xcc\x65\xe6\x31\xf3\x99\x05\xcc\x42\x66\x11\xb3\x98\x59\xc2\x2c\x65\x96\x31\xcb\x99\x15\xcc\x4a\x66\x15\xb3\x9a\x59\xc3\xac\x65\xd6\x31\xeb\x99\x0d\xcc\x46\x66\x13\xb3\x99\xd9\xc2\x6c\x65\xb6\x31\xdb\x99\x1d\xcc\x4e\x66\x17\xb3\x9b\xd9\xc3\xec\x65\xf6\x31\xfb\x99\x03\xcc\x41\xe6\x10\x73\x98\x39\xc2\x1c\x65\x8e\x31\xc7\x99\x13\xcc\x49\xe6\x14\x73\x9a\x39\xc3\x9c\x65\xce\x31\xe7\x99\x0b\xcc\x45\xe6\x12\x73\x99\xb9\xc2\x5c\x65\xae\x31\xd7\x99\x1b\xcc\x4d\xe6\x16\x73\x9b\xb9\xc3\xdc\x65\xee\x31\xf7\x99\x07\xcc\x43\xe6\x11\xf3\x98\x79\xc2\x3c\x65\x9e\x31\xcf\x99\x17\xcc\x4b\xe6\x15\xf3\x9a\x79\xc3\xbc\x65\xde\x31\xef\x99\x0f\xcc\x47\xe6\x13\xf3\x99\xf9\xc2\x7c\x65\xbe\x31\xdf\x99\x1f\xcc\x4f\xe6\x17\xf3\x9b\xf9\xc3\xfc\x65\xfe\xb1\x09\xd8\x84\x6c\x22\x36\x31\x9b\x84\x4d\xca\x26\x63\x93\xb3\x29\xd8\x94\x6c\x2a\x36\x35\x9b\x86\x4d\xcb\xa6\x63\xd3\xb3\x19\xd8\x8c\x6c\x26\x36\x33\x9b\x85\xcd\xca\x66\x63\xb3\xb3\x39\xd8\x9c\x6c\x2e\x36\x37\x9b\x87\xcd\xcb\xe6\x63\xf3\xb3\x05\xd8\x82\x6c\x21\xb6\x30\x5b\x84\x2d\xca\x16\x63\x8b\xb3\x25\xd8\x92\x6c\x29\xb6\x34\x5b\x86\x2d\xcb\x96\x63\xcb\xb3\x15\xd8\x8a\x6c\x25\xb6\x32\x5b\x85\xad\xca\x56\x63\xab\xb3\x35\xd8\x9a\x6c\x2d\xb6\x36\x5b\x87\xad\xcb\xd6\x63\xeb\xb3\x0d\xd8\x86\x6c\x23\xb6\x31\xdb\x84\x6d\xca\x36\x63\x9b\xb3\x2d\xd8\x96\x6c\x2b\xb6\x35\xdb\x86\x6d\xcb\xb6\x63\xdb\xb3\x1d\x58\x8c\xc5\x59\x82\x25\x59\x8a\xa5\x59\x86\x65\x59\x8e\xe5\x59\x81\x15\x59\x89\x95\x59\x85\x55\x59\x8d\xd5\x59\x83\x35\x59\x8b\xb5\x59\x87\x75\x59\x8f\xf5\xd9\x80\x0d\xd9\x88\x05\x2c\x64\x11\x1b\xb3\x1d\xd9\x4e\x6c\x67\xb6\x0b\xdb\x95\xed\xc6\x76\x67\x7b\xb0\x3d\xd9\x5e\x6c\x6f\xb6\x0f\xdb\x97\xed\xc7\xf6\x67\x07\xb0\x03\xd9\x41\xec\x60\x76\x08\x3b\x94\x1d\xc6\x0e\x67\x47\xb0\x23\xd9\x51\xec\x68\x76\x0c\x3b\x96\x1d\xc7\x8e\x67\x27\xb0\x13\xd9\x49\xec\x64\x76\x0a\x3b\x95\x9d\xc6\x4e\x67\x67\xb0\x33\xd9\x59\xec\x6c\x76\x0e\x3b\x97\x9d\xc7\xce\x67\x17\xb0\x0b\xd9\x45\xec\x62\x76\x09\xbb\x94\x5d\xc6\x2e\x67\x57\xb0\x2b\xd9\x55\xec\x6a\x76\x0d\xbb\x96\x5d\xc7\xae\x67\x37\xb0\x1b\xd9\x4d\xec\x66\x76\x0b\xbb\x95\xdd\xc6\x6e\x67\x77\xb0\x3b\xd9\x5d\xec\x6e\x76\x0f\xbb\x97\xdd\xc7\xee\x67\x0f\xb0\x07\xd9\x43\xec\x61\xf6\x08\x7b\x94\x3d\xc6\x1e\x67\x4f\xb0\x27\xd9\x53\xec\x69\xf6\x0c\x7b\x96\x3d\xc7\x9e\x67\x2f\xb0\x17\xd9\x4b\xec\x65\xf6\x0a\x7b\x95\xbd\xc6\x5e\x67\x6f\xb0\x37\xd9\x5b\xec\x6d\xf6\x0e\x7b\x97\xbd\xc7\xde\x67\x1f\xb0\x0f\xd9\x47\xec\x63\xf6\x09\xfb\x94\x7d\xc6\x3e\x67\x5f\xb0\x2f\xd9\x57\xec\x6b\xf6\x0d\xfb\x96\x7d\xc7\xbe\x67\x3f\xb0\x1f\xd9\x4f\xec\x67\xf6\x0b\xfb\x95\xfd\xc6\x7e\x67\x7f\xb0\x3f\xd9\x5f\xec\x6f\xf6\x0f\xfb\x97\xfd\xc7\x25\xe0\x12\x72\x89\xb8\xc4\x5c\x12\x2e\x29\x97\x8c\x4b\xce\xa5\xe0\x52\x72\xa9\xb8\xd4\x5c\x1a\x2e\x2d\x97\x8e\x4b\xcf\x65\xe0\x32\x72\x99\xb8\xcc\x5c\x16\x2e\x2b\x97\x8d\xcb\xce\xe5\xe0\x72\x72\xb9\xb8\xdc\x5c\x1e\x2e\x2f\x97\x8f\xcb\xcf\x15\xe0\x0a\x72\x85\xb8\xc2\x5c\x11\xae\x28\x57\x8c\x2b\xce\x95\xe0\x4a\x72\xa5\xb8\xd2\x5c\x19\xae\x2c\x57\x8e\x2b\xcf\x55\xe0\x2a\x72\x95\xb8\xca\x5c\x15\xae\x2a\x57\x8d\xab\xce\xd5\xe0\x6a\x72\xb5\xb8\xda\x5c\x1d\xae\x2e\x57\x8f\xab\xcf\x35\xe0\x1a\x72\x8d\xb8\xc6\x5c\x13\xae\x29\xd7\x8c\x6b\xce\xb5\xe0\x5a\x72\xad\xb8\xd6\x5c\x1b\xae\x2d\xd7\x8e\x6b\xcf\x75\xe0\x30\x0e\xe7\x08\x8e\xe4\x28\x8e\xe6\x18\x8e\xe5\x38\x8e\xe7\x04\x4e\xe4\x24\x4e\xe6\x14\x4e\xe5\x34\x4e\xe7\x0c\xce\xe4\x2c\xce\xe6\x1c\xce\xe5\x3c\xce\xe7\x02\x2e\xe4\x22\x0e\x70\x90\x43\x5c\xcc\x75\xe4\x3a\x71\x9d\xb9\x2e\x5c\x57\xae\x1b\xd7\x9d\xeb\xc1\xf5\xe4\x7a\x71\xbd\xb9\x3e\x5c\x5f\xae\x1f\xd7\x9f\x1b\xc0\x0d\xe4\x06\x71\x83\xb9\x21\xdc\x50\x6e\x18\x37\x9c\x1b\xc1\x8d\xe4\x46\x71\xa3\xb9\x31\xdc\x58\x6e\x1c\x37\x9e\x9b\xc0\x4d\xe4\x26\x71\x93\xb9\x29\xdc\x54\x6e\x1a\x37\x9d\x9b\xc1\xcd\xe4\x66\x71\xb3\xb9\x39\xdc\x5c\x6e\x1e\x37\x9f\x5b\xc0\x2d\xe4\x16\x71\x8b\xb9\x25\xdc\x52\x6e\x19\xb7\x9c\x5b\xc1\xad\xe4\x56\x71\xab\xb9\x35\xdc\x5a\x6e\x1d\xb7\x9e\xdb\xc0\x6d\xe4\x36\x71\x9b\xb9\x2d\xdc\x56\x6e\x1b\xb7\x9d\xdb\xc1\xed\xe4\x76\x71\xbb\xb9\x3d\xdc\x5e\x6e\x1f\xb7\x9f\x3b\xc0\x1d\xe4\x0e\x71\x87\xb9\x23\xdc\x51\xee\x18\x77\x9c\x3b\xc1\x9d\xe4\x4e\x71\xa7\xb9\x33\xdc\x59\xee\x1c\x77\x9e\xbb\xc0\x5d\xe4\x2e\x71\x97\xb9\x2b\xdc\x55\xee\x1a\x77\x9d\xbb\xc1\xdd\xe4\x6e\x71\xb7\xb9\x3b\xdc\x5d\xee\x1e\x77\x9f\x7b\xc0\x3d\xe4\x1e\x71\x8f\xb9\x27\xdc\x53\xee\x19\xf7\x9c\x7b\xc1\xbd\xe4\x5e\x71\xaf\xb9\x37\xdc\x5b\xee\x1d\xf7\x9e\xfb\xc0\x7d\xe4\x3e\x71\x9f\xb9\x2f\xdc\x57\xee\x1b\xf7\x9d\xfb\xc1\xfd\xe4\x7e\x71\xbf\xb9\x3f\xdc\x5f\xee\x1f\x9f\x80\x4f\xc8\x27\xe2\x13\xf3\x49\xf8\xa4\x7c\x32\x3e\x39\x9f\x82\x4f\xc9\xa7\xe2\x53\xf3\x69\xf8\xb4\x7c\x3a\x3e\x3d\x9f\x81\xcf\xc8\x67\xe2\x33\xf3\x59\xf8\xac\x7c\x36\x3e\x3b\x9f\x83\xcf\xc9\xe7\xe2\x73\xf3\x79\xf8\xbc\x7c\x3e\x3e\x3f\x5f\x80\x2f\xc8\x17\xe2\x0b\xf3\x45\xf8\xa2\x7c\x31\xbe\x38\x5f\x82\x2f\xc9\x97\xe2\x4b\xf3\x65\xf8\xb2\x7c\x39\xbe\x3c\x5f\x81\xaf\xc8\x57\xe2\x2b\xf3\x55\xf8\xaa\x7c\x35\xbe\x3a\x5f\x83\xaf\xc9\xd7\xe2\x6b\xf3\x75\xf8\xba\x7c\x3d\xbe\x3e\xdf\x80\x6f\xc8\x37\xe2\x1b\xf3\x4d\xf8\xa6\x7c\x33\xbe\x39\xdf\x82\x6f\xc9\xb7\xe2\x5b\xf3\x6d\xf8\xb6\x7c\x3b\xbe\x3d\xdf\x81\xc7\x78\x9c\x27\x78\x92\xa7\x78\x9a\x67\x78\x96\xe7\x78\x9e\x17\x78\x91\x97\x78\x99\x57\x78\x95\xd7\x78\x9d\x37\x78\x93\xb7\x78\x9b\x77\x78\x97\xf7\x78\x9f\x0f\xf8\x90\x8f\x78\xc0\x43\x1e\xf1\x31\xdf\x91\xef\xc4\x77\xe6\xbb\xf0\x5d\xf9\x6e\x7c\x77\xbe\x07\xdf\x93\xef\xc5\xf7\xe6\xfb\xf0\x7d\xf9\x7e\x7c\x7f\x7e\x00\x3f\x90\x1f\xc4\x0f\xe6\x87\xf0\x43\xf9\x61\xfc\x70\x7e\x04\x3f\x92\x1f\xc5\x8f\xe6\xc7\xf0\x63\xf9\x71\xfc\x78\x7e\x02\x3f\x91\x9f\xc4\x4f\xe6\xa7\xf0\x53\xf9\x69\xfc\x74\x7e\x06\x3f\x93\x9f\xc5\xcf\xe6\xe7\xf0\x73\xf9\x79\xfc\x7c\x7e\x01\xbf\x90\x5f\xc4\x2f\xe6\x97\xf0\x4b\xf9\x65\xfc\x72\x7e\x05\xbf\x92\x5f\xc5\xaf\xe6\xd7\xf0\x6b\xf9\x75\xfc\x7a\x7e\x03\xbf\x91\xdf\xc4\x6f\xe6\xb7\xf0\x5b\xf9\x6d\xfc\x76\x7e\x07\xbf\x93\xdf\xc5\xef\xe6\xf7\xf0\x7b\xf9\x7d\xfc\x7e\xfe\x00\x7f\x90\x3f\xc4\x1f\xe6\x8f\xf0\x47\xf9\x63\xfc\x71\xfe\x04\x7f\x92\x3f\xc5\x9f\xe6\xcf\xf0\x67\xf9\x73\xfc\x79\xfe\x02\x7f\x91\xbf\xc4\x5f\xe6\xaf\xf0\x57\xf9\x6b\xfc\x75\xfe\x06\x7f\x93\xbf\xc5\xdf\xe6\xef\xf0\x77\xf9\x7b\xfc\x7d\xfe\x01\xff\x90\x7f\xc4\x3f\xe6\x9f\xf0\x4f\xf9\x67\xfc\x73\xfe\x05\xff\x92\x7f\xc5\xbf\xe6\xdf\xf0\x6f\xf9\x77\xfc\x7b\xfe\x03\xff\x91\xff\xc4\x7f\xe6\xbf\xf0\x5f\xf9\x6f\xfc\x77\xfe\x07\xff\x93\xff\xc5\xff\xe6\xff\xf0\x7f\xf9\x7f\x42\x02\x21\xa1\x90\x48\x48\x2c\x24\x11\x92\x0a\xc9\x84\xe4\x42\x0a\x21\xa5\x90\x4a\x48\x2d\xa4\x11\xd2\x0a\xe9\x84\xf4\x42\x06\x21\xa3\x90\x49\xc8\x2c\x64\x11\xb2\x0a\xd9\x84\xec\x42\x0e\x21\xa7\x90\x4b\xc8\x2d\xe4\x11\xf2\x0a\xf9\x84\xfc\x42\x01\xa1\xa0\x50\x48\x28\x2c\x14\x11\x8a\x0a\xc5\x84\xe2\x42\x09\xa1\xa4\x50\x4a\x28\x2d\x94\x11\xca\x0a\xe5\x84\xf2\x42\x05\xa1\xa2\x50\x49\xa8\x2c\x54\x11\xaa\x0a\xd5\x84\xea\x42\x0d\xa1\xa6\x50\x4b\xa8\x2d\xd4\x11\xea\x0a\xf5\x84\xfa\x42\x03\xa1\xa1\xd0\x48\x68\x2c\x34\x11\x9a\x0a\xcd\x84\xe6\x42\x0b\xa1\xa5\xd0\x4a\x68\x2d\xb4\x11\xda\x0a\xed\x84\xf6\x42\x07\x01\x13\x70\x81\x10\x48\x81\x12\x68\x81\x11\x58\x81\x13\x78\x41\x10\x44\x41\x12\x64\x41\x11\x54\x41\x13\x74\xc1\x10\x4c\xc1\x12\x6c\xc1\x11\x5c\xc1\x13\x7c\x21\x10\x42\x21\x12\x80\x00\x05\x24\xc4\x42\x47\xa1\x93\xd0\x59\xe8\x22\x74\x15\xba\x09\xdd\x85\x1e\x42\x4f\xa1\x97\xd0\x5b\xe8\x23\xf4\x15\xfa\x09\xfd\x85\x01\xc2\x40\x61\x90\x30\x58\x18\x22\x0c\x15\x86\x09\xc3\x85\x11\xc2\x48\x61\x94\x30\x5a\x18\x23\x8c\x15\xc6\x09\xe3\x85\x09\xc2\x44\x61\x92\x30\x59\x98\x22\x4c\x15\xa6\x09\xd3\x85\x19\xc2\x4c\x61\x96\x30\x5b\x98\x23\xcc\x15\xe6\x09\xf3\x85\x05\xc2\x42\x61\x91\xb0\x58\x58\x22\x2c\x15\x96\x09\xcb\x85\x15\xc2\x4a\x61\x95\xb0\x5a\x58\x23\xac\x15\xd6\x09\xeb\x85\x0d\xc2\x46\x61\x93\xb0\x59\xd8\x22\x6c\x15\xb6\x09\xdb\x85\x1d\xc2\x4e\x61\x97\xb0\x5b\xd8\x23\xec\x15\xf6\x09\xfb\x85\x03\xc2\x41\xe1\x90\x70\x58\x38\x22\x1c\x15\x8e\x09\xc7\x85\x13\xc2\x49\xe1\x94\x70\x5a\x38\x23\x9c\x15\xce\x09\xe7\x85\x0b\xc2\x45\xe1\x92\x70\x59\xb8\x22\x5c\x15\xae\x09\xd7\x85\x1b\xc2\x4d\xe1\x96\x70\x5b\xb8\x23\xdc\x15\xee\x09\xf7\x85\x07\xc2\x43\xe1\x91\xf0\x58\x78\x22\x3c\x15\x9e\x09\xcf\x85\x17\xc2\x4b\xe1\x95\xf0\x5a\x78\x23\xbc\x15\xde\x09\xef\x85\x0f\xc2\x47\xe1\x93\xf0\x59\xf8\x22\x7c\x15\xbe\x09\xdf\x85\x1f\xc2\x4f\xe1\x97\xf0\x5b\xf8\x23\xfc\x15\xfe\x89\x09\xc4\x84\x62\x22\x31\xb1\x98\x44\x4c\x2a\x26\x13\x93\x8b\x29\xc4\x94\x62\x2a\x31\xb5\x98\x46\x4c\x2b\xa6\x13\xd3\x8b\x19\xc4\x8c\x62\x26\x31\xb3\x98\x45\xcc\x2a\x66\x13\xb3\x8b\x39\xc4\x9c\x62\x2e\x31\xb7\x98\x47\xcc\x2b\xe6\x13\xf3\x8b\x05\xc4\x82\x62\x21\xb1\xb0\x58\x44\x2c\x2a\x16\x13\x8b\x8b\x25\xc4\x92\x62\x29\xb1\xb4\x58\x46\x2c\x2b\x96\x13\xcb\x8b\x15\xc4\x8a\x62\x25\xb1\xb2\x58\x45\xac\x2a\x56\x13\xab\x8b\x35\xc4\x9a\x62\x2d\xb1\xb6\x58\x47\xac\x2b\xd6\x13\xeb\x8b\x0d\xc4\x86\x62\x23\xb1\xb1\xd8\x44\x6c\x2a\x36\x13\x9b\x8b\x2d\xc4\x96\x62\x2b\xb1\xb5\xd8\x46\x6c\x2b\xb6\x13\xdb\x8b\x1d\x44\x4c\xc4\x45\x42\x24\x45\x4a\xa4\x45\x46\x64\x45\x4e\xe4\x45\x41\x14\x45\x49\x94\x45\x45\x54\x45\x4d\xd4\x45\x43\x34\x45\x4b\xb4\x45\x47\x74\x45\x4f\xf4\xc5\x40\x0c\xc5\x48\x04\x22\x14\x91\x18\x8b\x1d\xc5\x4e\x62\x67\xb1\x8b\xd8\x55\xec\x26\x76\x17\x7b\x88\x3d\xc5\x5e\x62\x6f\xb1\x8f\xd8\x57\xec\x27\xf6\x17\x07\x88\x03\xc5\x41\xe2\x60\x71\x88\x38\x54\x1c\x26\x0e\x17\x47\x88\x23\xc5\x51\xe2\x68\x71\x8c\x38\x56\x1c\x27\x8e\x17\x27\x88\x13\xc5\x49\xe2\x64\x71\x8a\x38\x55\x9c\x26\x4e\x17\x67\x88\x33\xc5\x59\xe2\x6c\x71\x8e\x38\x57\x9c\x27\xce\x17\x17\x88\x0b\xc5\x45\xe2\x62\x71\x89\xb8\x54\x5c\x26\x2e\x17\x57\x88\x2b\xc5\x55\xe2\x6a\x71\x8d\xb8\x56\x5c\x27\xae\x17\x37\x88\x1b\xc5\x4d\xe2\x66\x71\x8b\xb8\x55\xdc\x26\x6e\x17\x77\x88\x3b\xc5\x5d\xe2\x6e\x71\x8f\xb8\x57\xdc\x27\xee\x17\x0f\x88\x07\xc5\x43\xe2\x61\xf1\x88\x78\x54\x3c\x26\x1e\x17\x4f\x88\x27\xc5\x53\xe2\x69\xf1\x8c\x78\x56\x3c\x27\x9e\x17\x2f\x88\x17\xc5\x4b\xe2\x65\xf1\x8a\x78\x55\xbc\x26\x5e\x17\x6f\x88\x37\xc5\x5b\xe2\x6d\xf1\x8e\x78\x57\xbc\x27\xde\x17\x1f\x88\x0f\xc5\x47\xe2\x63\xf1\x89\xf8\x54\x7c\x26\x3e\x17\x5f\x88\x2f\xc5\x57\xe2\x6b\xf1\x8d\xf8\x56\x7c\x27\xbe\x17\x3f\x88\x1f\xc5\x4f\xe2\x67\xf1\x8b\xf8\x55\xfc\x26\x7e\x17\x7f\x88\x3f\xc5\x5f\xe2\x6f\xf1\x8f\xf8\x57\xfc\x27\x25\x90\x12\x4a\x89\xa4\xc4\x52\x12\x29\xa9\x94\x4c\x4a\x2e\xa5\x90\x52\x4a\xa9\xa4\xd4\x52\x1a\x29\xad\x94\x4e\x4a\x2f\x65\x90\x32\x4a\x99\xa4\xcc\x52\x16\x29\xab\x94\x4d\xca\x2e\xe5\x90\x72\x4a\xb9\xa4\xdc\x52\x1e\x29\xaf\x94\x4f\xca\x2f\x15\x90\x0a\x4a\x85\xa4\xc2\x52\x11\xa9\xa8\x54\x4c\x2a\x2e\x95\x90\x4a\x4a\xa5\xa4\xd2\x52\x19\xa9\xac\x54\x4e\x2a\x2f\x55\x90\x2a\x4a\x95\xa4\xca\x52\x15\xa9\xaa\x54\x4d\xaa\x2e\xd5\x90\x6a\x4a\xb5\xa4\xda\x52\x1d\xa9\xae\x54\x4f\xaa\x2f\x35\x90\x1a\x4a\x8d\xa4\xc6\x52\x13\xa9\xa9\xd4\x4c\x6a\x2e\xb5\x90\x5a\x4a\xad\xa4\xd6\x52\x1b\xa9\xad\xd4\x4e\x6a\x2f\x75\x90\x30\x09\x97\x08\x89\x94\x28\x89\x96\x18\x89\x95\x38\x89\x97\x04\x49\x94\x24\x49\x96\x14\x49\x95\x34\x49\x97\x0c\xc9\x94\x2c\xc9\x96\x1c\xc9\x95\x3c\xc9\x97\x02\x29\x94\x22\x09\x48\x50\x42\x52\x2c\x75\x94\x3a\x49\x9d\xa5\x2e\x52\x57\xa9\x9b\xd4\x5d\xea\x21\xf5\x94\x7a\x49\xbd\xa5\x3e\x52\x5f\xa9\x9f\xd4\x5f\x1a\x20\x0d\x94\x06\x49\x83\xa5\x21\xd2\x50\x69\x98\x34\x5c\x1a\x21\x8d\x94\x46\x49\xa3\xa5\x31\xd2\x58\x69\x9c\x34\x5e\x9a\x20\x4d\x94\x26\x49\x93\xa5\x29\xd2\x54\x69\x9a\x34\x5d\x9a\x21\xcd\x94\x66\x49\xb3\xa5\x39\xd2\x5c\x69\x9e\x34\x5f\x5a\x20\x2d\x94\x16\x49\x8b\xa5\x25\xd2\x52\x69\x99\xb4\x5c\x5a\x21\xad\x94\x56\x49\xab\xa5\x35\xd2\x5a\x69\x9d\xb4\x5e\xda\x20\x6d\x94\x36\x49\x9b\xa5\x2d\xd2\x56\x69\x9b\xb4\x5d\xda\x21\xed\x94\x76\x49\xbb\xa5\x3d\xd2\x5e\x69\x9f\xb4\x5f\x3a\x20\x1d\x94\x0e\x49\x87\xa5\x23\xd2\x51\xe9\x98\x74\x5c\x3a\x21\x9d\x94\x4e\x49\xa7\xa5\x33\xd2\x59\xe9\x9c\x74\x5e\xba\x20\x5d\x94\x2e\x49\x97\xa5\x2b\xd2\x55\xe9\x9a\x74\x5d\xba\x21\xdd\x94\x6e\x49\xb7\xa5\x3b\xd2\x5d\xe9\x9e\x74\x5f\x7a\x20\x3d\x94\x1e\x49\x8f\xa5\x27\xd2\x53\xe9\x99\xf4\x5c\x7a\x21\xbd\x94\x5e\x49\xaf\xa5\x37\xd2\x5b\xe9\x9d\xf4\x5e\xfa\x20\x7d\x94\x3e\x49\x9f\xa5\x2f\xd2\x57\xe9\x9b\xf4\x5d\xfa\x21\xfd\x94\x7e\x49\xbf\xa5\x3f\xd2\x5f\xe9\x9f\x9c\x40\x4e\x28\x27\x92\x13\xcb\x49\xe4\xa4\x72\x32\x39\xb9\x9c\x42\x4e\x29\xa7\x92\x53\xcb\x69\xe4\xb4\x72\x3a\x39\xbd\x9c\x41\xce\x28\x67\x92\x33\xcb\x59\xe4\xac\x72\x36\x39\xbb\x9c\x43\xce\x29\xe7\x92\x73\xcb\x79\xe4\xbc\x72\x3e\x39\xbf\x5c\x40\x2e\x28\x17\x92\x0b\xcb\x45\xe4\xa2\x72\x31\xb9\xb8\x5c\x42\x2e\x29\x97\x92\x4b\xcb\x65\xe4\xb2\x72\x39\xb9\xbc\x5c\x41\xae\x28\x57\x92\x2b\xcb\x55\xe4\xaa\x72\x35\xb9\xba\x5c\x43\xae\x29\xd7\x92\x6b\xcb\x75\xe4\xba\x72\x3d\xb9\xbe\xdc\x40\x6e\x28\x37\x92\x1b\xcb\x4d\xe4\xa6\x72\x33\xb9\xb9\xdc\x42\x6e\x29\xb7\x92\x5b\xcb\x6d\xe4\xb6\x72\x3b\xb9\xbd\xdc\x41\xc6\x64\x5c\x26\x64\x52\xa6\x64\x5a\x66\x64\x56\xe6\x64\x5e\x16\x64\x51\x96\x64\x59\x56\x64\x55\xd6\x64\x5d\x36\x64\x53\xb6\x64\x5b\x76\x64\x57\xf6\x64\x5f\x0e\xe4\x50\x8e\x64\x20\x43\x19\xc9\xb1\xdc\x51\xee\x24\x77\x96\xbb\xc8\x5d\xe5\x6e\x72\x77\xb9\x87\xdc\x53\xee\x25\xf7\x96\xfb\xc8\x7d\xe5\x7e\x72\x7f\x79\x80\x3c\x50\x1e\x24\x0f\x96\x87\xc8\x43\xe5\x61\xf2\x70\x79\x84\x3c\x52\x1e\x25\x8f\x96\xc7\xc8\x63\xe5\x71\xf2\x78\x79\x82\x3c\x51\x9e\x24\x4f\x96\xa7\xc8\x53\xe5\x69\xf2\x74\x79\x86\x3c\x53\x9e\x25\xcf\x96\xe7\xc8\x73\xe5\x79\xf2\x7c\x79\x81\xbc\x50\x5e\x24\x2f\x96\x97\xc8\x4b\xe5\x65\xf2\x72\x79\x85\xbc\x52\x5e\x25\xaf\x96\xd7\xc8\x6b\xe5\x75\xf2\x7a\x79\x83\xbc\x51\xde\x24\x6f\x96\xb7\xc8\x5b\xe5\x6d\xf2\x76\x79\x87\xbc\x53\xde\x25\xef\x96\xf7\xc8\x7b\xe5\x7d\xf2\x7e\xf9\x80\x7c\x50\x3e\x24\x1f\x96\x8f\xc8\x47\xe5\x63\xf2\x71\xf9\x84\x7c\x52\x3e\x25\x9f\x96\xcf\xc8\x67\xe5\x73\xf2\x79\xf9\x82\x7c\x51\xbe\x24\x5f\x96\xaf\xc8\x57\xe5\x6b\xf2\x75\xf9\x86\x7c\x53\xbe\x25\xdf\x96\xef\xc8\x77\xe5\x7b\xf2\x7d\xf9\x81\xfc\x50\x7e\x24\x3f\x96\x9f\xc8\x4f\xe5\x67\xf2\x73\xf9\x85\xfc\x52\x7e\x25\xbf\x96\xdf\xc8\x6f\xe5\x77\xf2\x7b\xf9\x83\xfc\x51\xfe\x24\x7f\x96\xbf\xc8\x5f\xe5\x6f\xf2\x77\xf9\x87\xfc\x53\xfe\x25\xff\x96\xff\xc8\x7f\xe5\x7f\x4a\x02\x25\xa1\x92\x48\x49\xac\x24\x51\x92\x2a\xc9\x94\xe4\x4a\x0a\x25\xa5\x92\x4a\x49\xad\xa4\x51\xd2\x2a\xe9\x94\xf4\x4a\x06\x25\xa3\x92\x49\xc9\xac\x64\x51\xb2\x2a\xd9\x94\xec\x4a\x0e\x25\xa7\x92\x4b\xc9\xad\xe4\x51\xf2\x2a\xf9\x94\xfc\x4a\x01\xa5\xa0\x52\x48\x29\xac\x14\x51\x8a\x2a\xc5\x94\xe2\x4a\x09\xa5\xa4\x52\x4a\x29\xad\x94\x51\xca\x2a\xe5\x94\xf2\x4a\x05\xa5\xa2\x52\x49\xa9\xac\x54\x51\xaa\x2a\xd5\x94\xea\x4a\x0d\xa5\xa6\x52\x4b\xa9\xad\xd4\x51\xea\x2a\xf5\x94\xfa\x4a\x03\xa5\xa1\xd2\x48\x69\xac\x34\x51\x9a\x2a\xcd\x94\xe6\x4a\x0b\xa5\xa5\xd2\x4a\x69\xad\xb4\x51\xda\x2a\xed\x94\xf6\x4a\x07\x05\x53\x70\x85\x50\x48\x85\x52\x68\x85\x51\x58\x85\x53\x78\x45\x50\x44\x45\x52\x64\x45\x51\x54\x45\x53\x74\xc5\x50\x4c\xc5\x52\x6c\xc5\x51\x5c\xc5\x53\x7c\x25\x50\x42\x25\x52\x80\x02\x15\xa4\xc4\x4a\x47\xa5\x93\xd2\x59\xe9\xa2\x74\x55\xba\x29\xdd\x95\x1e\x4a\x4f\xa5\x97\xd2\x5b\xe9\xa3\xf4\x55\xfa\x29\xfd\x95\x01\xca\x40\x65\x90\x32\x58\x19\xa2\x0c\x55\x86\x29\xc3\x95\x11\xca\x48\x65\x94\x32\x5a\x19\xa3\x8c\x55\xc6\x29\xe3\x95\x09\xca\x44\x65\x92\x32\x59\x99\xa2\x4c\x55\xa6\x29\xd3\x95\x19\xca\x4c\x65\x96\x32\x5b\x99\xa3\xcc\x55\xe6\x29\xf3\x95\x05\xca\x42\x65\x91\xb2\x58\x59\xa2\x2c\x55\x96\x29\xcb\x95\x15\xca\x4a\x65\x95\xb2\x5a\x59\xa3\xac\x55\xd6\x29\xeb\x95\x0d\xca\x46\x65\x93\xb2\x59\xd9\xa2\x6c\x55\xb6\x29\xdb\x95\x1d\xca\x4e\x65\x97\xb2\x5b\xd9\xa3\xec\x55\xf6\x29\xfb\x95\x03\xca\x41\xe5\x90\x72\x58\x39\xa2\x1c\x55\x8e\x29\xc7\x95\x13\xca\x49\xe5\x94\x72\x5a\x39\xa3\x9c\x55\xce\x29\xe7\x95\x0b\xca\x45\xe5\x92\x72\x59\xb9\xa2\x5c\x55\xae\x29\xd7\x95\x1b\xca\x4d\xe5\x96\x72\x5b\xb9\xa3\xdc\x55\xee\x29\xf7\x95\x07\xca\x43\xe5\x91\xf2\x58\x79\xa2\x3c\x55\x9e\x29\xcf\x95\x17\xca\x4b\xe5\x95\xf2\x5a\x79\xa3\xbc\x55\xde\x29\xef\x95\x0f\xca\x47\xe5\x93\xf2\x59\xf9\xa2\x7c\x55\xbe\x29\xdf\x95\x1f\xca\x4f\xe5\x97\xf2\x5b\xf9\xa3\xfc\x55\xfe\xa9\x09\xd4\x84\x6a\x22\x35\xb1\x9a\x44\x4d\xaa\x26\x53\x93\xab\x29\xd4\x94\x6a\x2a\x35\xb5\x9a\x46\x4d\xab\xa6\x53\xd3\xab\x19\xd4\x8c\x6a\x26\x35\xb3\x9a\x45\xcd\xaa\x66\x53\xb3\xab\x39\xd4\x9c\x6a\x2e\x35\xb7\x9a\x47\xcd\xab\xe6\x53\xf3\xab\x05\xd4\x82\x6a\x21\xb5\xb0\x5a\x44\x2d\xaa\x16\x53\x8b\xab\x25\xd4\x92\x6a\x29\xb5\xb4\x5a\x46\x2d\xab\x96\x53\xcb\xab\x15\xd4\x8a\x6a\x25\xb5\xb2\x5a\x45\xad\xaa\x56\x53\xab\xab\x35\xd4\x9a\x6a\x2d\xb5\xb6\x5a\x47\xad\xab\xd6\x53\xeb\xab\x0d\xd4\x86\x6a\x23\xb5\xb1\xda\x44\x6d\xaa\x36\x53\x9b\xab\x2d\xd4\x96\x6a\x2b\xb5\xb5\xda\x46\x6d\xab\xb6\x53\xdb\xab\x1d\x54\x4c\xc5\x55\x42\x25\x55\x4a\xa5\x55\x46\x65\x55\x4e\xe5\x55\x41\x15\x55\x49\x95\x55\x45\x55\x55\x4d\xd5\x55\x43\x35\x55\x4b\xb5\x55\x47\x75\x55\x4f\xf5\xd5\x40\x0d\xd5\x48\x05\x2a\x54\x91\x1a\xab\x1d\xd5\x4e\x6a\x67\xb5\x8b\xda\x55\xed\xa6\x76\x57\x7b\xa8\x3d\xd5\x5e\x6a\x6f\xb5\x8f\xda\x57\xed\xa7\xf6\x57\x07\xa8\x03\xd5\x41\xea\x60\x75\x88\x3a\x54\x1d\xa6\x0e\x57\x47\xa8\x23\xd5\x51\xea\x68\x75\x8c\x3a\x56\x1d\xa7\x8e\x57\x27\xa8\x13\xd5\x49\xea\x64\x75\x8a\x3a\x55\x9d\xa6\x4e\x57\x67\xa8\x33\xd5\x59\xea\x6c\x75\x8e\x3a\x57\x9d\xa7\xce\x57\x17\xa8\x0b\xd5\x45\xea\x62\x75\x89\xba\x54\x5d\xa6\x2e\x57\x57\xa8\x2b\xd5\x55\xea\x6a\x75\x8d\xba\x56\x5d\xa7\xae\x57\x37\xa8\x1b\xd5\x4d\xea\x66\x75\x8b\xba\x55\xdd\xa6\x6e\x57\x77\xa8\x3b\xd5\x5d\xea\x6e\x75\x8f\xba\x57\xdd\xa7\xee\x57\x0f\xa8\x07\xd5\x43\xea\x61\xf5\x88\x7a\x54\x3d\xa6\x1e\x57\x4f\xa8\x27\xd5\x53\xea\x69\xf5\x8c\x7a\x56\x3d\xa7\x9e\x57\x2f\xa8\x17\xd5\x4b\xea\x65\xf5\x8a\x7a\x55\xbd\xa6\x5e\x57\x6f\xa8\x37\xd5\x5b\xea\x6d\xf5\x8e\x7a\x57\xbd\xa7\xde\x57\x1f\xa8\x0f\xd5\x47\xea\x63\xf5\x89\xfa\x54\x7d\xa6\x3e\x57\x5f\xa8\x2f\xd5\x57\xea\x6b\xf5\x8d\xfa\x56\x7d\xa7\xbe\x57\x3f\xa8\x1f\xd5\x4f\xea\x67\xf5\x8b\xfa\x55\xfd\xa6\x7e\x57\x7f\xa8\x3f\xd5\x5f\xea\x6f\xf5\x8f\xfa\x57\xfd\xa7\x25\xd0\x12\x6a\x89\xb4\xc4\x5a\x12\x2d\xa9\x96\x4c\x4b\xae\xa5\xd0\x52\x6a\xa9\xb4\xd4\x5a\x1a\x2d\xad\x96\x4e\x4b\xaf\x65\xd0\x32\x6a\x99\xb4\xcc\x5a\x16\x2d\xab\x96\x4d\xcb\xae\xe5\xd0\x72\x6a\xb9\xb4\xdc\x5a\x1e\x2d\xaf\x96\x4f\xcb\xaf\x15\xd0\x0a\x6a\x85\xb4\xc2\x5a\x11\xad\xa8\x56\x4c\x2b\xae\x95\xd0\x4a\x6a\xa5\xb4\xd2\x5a\x19\xad\xac\x56\x4e\x2b\xaf\x55\xd0\x2a\x6a\x95\xb4\xca\x5a\x15\xad\xaa\x56\x4d\xab\xae\xd5\xd0\x6a\x6a\xb5\xb4\xda\x5a\x1d\xad\xae\x56\x4f\xab\xaf\x35\xd0\x1a\x6a\x8d\xb4\xc6\x5a\x13\xad\xa9\xd6\x4c\x6b\xae\xb5\xd0\x5a\x6a\xad\xb4\xd6\x5a\x1b\xad\xad\xd6\x4e\x6b\xaf\x75\xd0\x30\x0d\xd7\x08\x8d\xd4\x28\x8d\xd6\x18\x8d\xd5\x38\x8d\xd7\x04\x4d\xd4\x24\x4d\xd6\x14\x4d\xd5\x34\x4d\xd7\x0c\xcd\xd4\x2c\xcd\xd6\x1c\xcd\xd5\x3c\xcd\xd7\x02\x2d\xd4\x22\x0d\x68\x50\x43\x5a\xac\x75\xd4\x3a\x69\x9d\xb5\x2e\x5a\x57\xad\x9b\xd6\x5d\xeb\xa1\xf5\xd4\x7a\x69\xbd\xb5\x3e\x5a\x5f\xad\x9f\xd6\x5f\x1b\xa0\x0d\xd4\x06\x69\x83\xb5\x21\xda\x50\x6d\x98\x36\x5c\x1b\xa1\x8d\xd4\x46\x69\xa3\xb5\x31\xda\x58\x6d\x9c\x36\x5e\x9b\xa0\x4d\xd4\x26\x69\x93\xb5\x29\xda\x54\x6d\x9a\x36\x5d\x9b\xa1\xcd\xd4\x66\x69\xb3\xb5\x39\xda\x5c\x6d\x9e\x36\x5f\x5b\xa0\x2d\xd4\x16\x69\x8b\xb5\x25\xda\x52\x6d\x99\xb6\x5c\x5b\xa1\xad\xd4\x56\x69\xab\xb5\x35\xda\x5a\x6d\x9d\xb6\x5e\xdb\xa0\x6d\xd4\x36\x69\x9b\xb5\x2d\xda\x56\x6d\x9b\xb6\x5d\xdb\xa1\xed\xd4\x76\x69\xbb\xb5\x3d\xda\x5e\x6d\x9f\xb6\x5f\x3b\xa0\x1d\xd4\x0e\x69\x87\xb5\x23\xda\x51\xed\x98\x76\x5c\x3b\xa1\x9d\xd4\x4e\x69\xa7\xb5\x33\xda\x59\xed\x9c\x76\x5e\xbb\xa0\x5d\xd4\x2e\x69\x97\xb5\x2b\xda\x55\xed\x9a\x76\x5d\xbb\xa1\xdd\xd4\x6e\x69\xb7\xb5\x3b\xda\x5d\xed\x9e\x76\x5f\x7b\xa0\x3d\xd4\x1e\x69\x8f\xb5\x27\xda\x53\xed\x99\xf6\x5c\x7b\xa1\xbd\xd4\x5e\x69\xaf\xb5\x37\xda\x5b\xed\x9d\xf6\x5e\xfb\xa0\x7d\xd4\x3e\x69\x9f\xb5\x2f\xda\x57\xed\x9b\xf6\x5d\xfb\xa1\xfd\xd4\x7e\x69\xbf\xb5\x3f\xda\x5f\xed\x9f\x9e\x40\x4f\xa8\x27\xd2\x13\xeb\x49\xf4\xa4\x7a\x32\x3d\xb9\x9e\x42\x4f\xa9\xa7\xd2\x53\xeb\x69\xf4\xb4\x7a\x3a\x3d\xbd\x9e\x41\xcf\xa8\x67\xd2\x33\xeb\x59\xf4\xac\x7a\x36\x3d\xbb\x9e\x43\xcf\xa9\xe7\xd2\x73\xeb\x79\xf4\xbc\x7a\x3e\x3d\xbf\x5e\x40\x2f\xa8\x17\xd2\x0b\xeb\x45\xf4\xa2\x7a\x31\xbd\xb8\x5e\x42\x2f\xa9\x97\xd2\x4b\xeb\x65\xf4\xb2\x7a\x39\xbd\xbc\x5e\x41\xaf\xa8\x57\xd2\x2b\xeb\x55\xf4\xaa\x7a\x35\xbd\xba\x5e\x43\xaf\xa9\xd7\xd2\x6b\xeb\x75\xf4\xba\x7a\x3d\xbd\xbe\xde\x40\x6f\xa8\x37\xd2\x1b\xeb\x4d\xf4\xa6\x7a\x33\xbd\xb9\xde\x42\x6f\xa9\xb7\xd2\x5b\xeb\x6d\xf4\xb6\x7a\x3b\xbd\xbd\xde\x41\xc7\x74\x5c\x27\x74\x52\xa7\x74\x5a\x67\x74\x56\xe7\x74\x5e\x17\x74\x51\x97\x74\x59\x57\x74\x55\xd7\x74\x5d\x37\x74\x53\xb7\x74\x5b\x77\x74\x57\xf7\x74\x5f\x0f\xf4\x50\x8f\x74\xa0\x43\x1d\xe9\xb1\xde\x51\xef\xa4\x77\xd6\xbb\xe8\x5d\xf5\x6e\x7a\x77\xbd\x87\xde\x53\xef\xa5\xf7\xd6\xfb\xe8\x7d\xf5\x7e\x7a\x7f\x7d\x80\x3e\x50\x1f\xa4\x0f\xd6\x87\xe8\x43\xf5\x61\xfa\x70\x7d\x84\x3e\x52\x1f\xa5\x8f\xd6\xc7\xe8\x63\xf5\x71\xfa\x78\x7d\x82\x3e\x51\x9f\xa4\x4f\xd6\xa7\xe8\x53\xf5\x69\xfa\x74\x7d\x86\x3e\x53\x9f\xa5\xcf\xd6\xe7\xe8\x73\xf5\x79\xfa\x7c\x7d\x81\xbe\x50\x5f\xa4\x2f\xd6\x97\xe8\x4b\xf5\x65\xfa\x72\x7d\x85\xbe\x52\x5f\xa5\xaf\xd6\xd7\xe8\x6b\xf5\x75\xfa\x7a\x7d\x83\xbe\x51\xdf\xa4\x6f\xd6\xb7\xe8\x5b\xf5\x6d\xfa\x76\x7d\x87\xbe\x53\xdf\xa5\xef\xd6\xf7\xe8\x7b\xf5\x7d\xfa\x7e\xfd\x80\x7e\x50\x3f\xa4\x1f\xd6\x8f\xe8\x47\xf5\x63\xfa\x71\xfd\x84\x7e\x52\x3f\xa5\x9f\xd6\xcf\xe8\x67\xf5\x73\xfa\x79\xfd\x82\x7e\x51\xbf\xa4\x5f\xd6\xaf\xe8\x57\xf5\x6b\xfa\x75\xfd\x86\x7e\x53\xbf\xa5\xdf\xd6\xef\xe8\x77\xf5\x7b\xfa\x7d\xfd\x81\xfe\x50\x7f\xa4\x3f\xd6\x9f\xe8\x4f\xf5\x67\xfa\x73\xfd\x85\xfe\x52\x7f\xa5\xbf\xd6\xdf\xe8\x6f\xf5\x77\xfa\x7b\xfd\x83\xfe\x51\xff\xa4\x7f\xd6\xbf\xe8\x5f\xf5\x6f\xfa\x77\xfd\x87\xfe\x53\xff\xa5\xff\xd6\xff\xe8\x7f\xf5\x7f\x46\x02\x23\xa1\x91\xc8\x48\x6c\x24\x31\x92\x1a\xc9\x8c\xe4\x46\x0a\x23\xa5\x91\xca\x48\x6d\xa4\x31\xd2\x1a\xe9\x8c\xf4\x46\x06\x23\xa3\x91\xc9\xc8\x6c\x64\x31\xb2\x1a\xd9\x8c\xec\x46\x0e\x23\xa7\x91\xcb\xc8\x6d\xe4\x31\xf2\x1a\xf9\x8c\xfc\x46\x01\xa3\xa0\x51\xc8\x28\x6c\x14\x31\x8a\x1a\xc5\x8c\xe2\x46\x09\xa3\xa4\x51\xca\x28\x6d\x94\x31\xca\x1a\xe5\x8c\xf2\x46\x05\xa3\xa2\x51\xc9\xa8\x6c\x54\x31\xaa\x1a\xd5\x8c\xea\x46\x0d\xa3\xa6\x51\xcb\xa8\x6d\xd4\x31\xea\x1a\xf5\x8c\xfa\x46\x03\xa3\xa1\xd1\xc8\x68\x6c\x34\x31\x9a\x1a\xcd\x8c\xe6\x46\x0b\xa3\xa5\xd1\xca\x68\x6d\xb4\x31\xda\x1a\xed\x8c\xf6\x46\x07\x03\x33\x70\x83\x30\x48\x83\x32\x68\x83\x31\x58\x83\x33\x78\x43\x30\x44\x43\x32\x64\x43\x31\x54\x43\x33\x74\xc3\x30\x4c\xc3\x32\x6c\xc3\x31\x5c\xc3\x33\x7c\x23\x30\x42\x23\x32\x80\x01\x0d\x64\xc4\x46\x47\xa3\x93\xd1\xd9\xe8\x62\x74\x35\xba\x19\xdd\x8d\x1e\x46\x4f\xa3\x97\xd1\xdb\xe8\x63\xf4\x35\xfa\x19\xfd\x8d\x01\xc6\x40\x63\x90\x31\xd8\x18\x62\x0c\x35\x86\x19\xc3\x8d\x11\xc6\x48\x63\x94\x31\xda\x18\x63\x8c\x35\xc6\x19\xe3\x8d\x09\xc6\x44\x63\x92\x31\xd9\x98\x62\x4c\x35\xa6\x19\xd3\x8d\x19\xc6\x4c\x63\x96\x31\xdb\x98\x63\xcc\x35\xe6\x19\xf3\x8d\x05\xc6\x42\x63\x91\xb1\xd8\x58\x62\x2c\x35\x96\x19\xcb\x8d\x15\xc6\x4a\x63\x95\xb1\xda\x58\x63\xac\x35\xd6\x19\xeb\x8d\x0d\xc6\x46\x63\x93\xb1\xd9\xd8\x62\x6c\x35\xb6\x19\xdb\x8d\x1d\xc6\x4e\x63\x97\xb1\xdb\xd8\x63\xec\x35\xf6\x19\xfb\x8d\x03\xc6\x41\xe3\x90\x71\xd8\x38\x62\x1c\x35\x8e\x19\xc7\x8d\x13\xc6\x49\xe3\x94\x71\xda\x38\x63\x9c\x35\xce\x19\xe7\x8d\x0b\xc6\x45\xe3\x92\x71\xd9\xb8\x62\x5c\x35\xae\x19\xd7\x8d\x1b\xc6\x4d\xe3\x96\x71\xdb\xb8\x63\xdc\x35\xee\x19\xf7\x8d\x07\xc6\x43\xe3\x91\xf1\xd8\x78\x62\x3c\x35\x9e\x19\xcf\x8d\x17\xc6\x4b\xe3\x95\xf1\xda\x78\x63\xbc\x35\xde\x19\xef\x8d\x0f\xc6\x47\xe3\x93\xf1\xd9\xf8\x62\x7c\x35\xbe\x19\xdf\x8d\x1f\xc6\x4f\xe3\x97\xf1\xdb\xf8\x63\xfc\x35\xfe\x99\x09\xcc\x84\x66\x22\x33\xb1\x99\xc4\x4c\x6a\x26\x33\x93\x9b\x29\xcc\x94\x66\x2a\x33\xb5\x99\xc6\x4c\x6b\xa6\x33\xd3\x9b\x19\xcc\x8c\x66\x26\x33\xb3\x99\xc5\xcc\x6a\x66\x33\xb3\x9b\x39\xcc\x9c\x66\x2e\x33\xb7\x99\xc7\xcc\x6b\xe6\x33\xf3\x9b\x05\xcc\x82\x66\x21\xb3\xb0\x59\xc4\x2c\x6a\x16\x33\x8b\x9b\x25\xcc\x92\x66\x29\xb3\xb4\x59\xc6\x2c\x6b\x96\x33\xcb\x9b\x15\xcc\x8a\x66\x25\xb3\xb2\x59\xc5\xac\x6a\x56\x33\xab\x9b\x35\xcc\x9a\x66\x2d\xb3\xb6\x59\xc7\xac\x6b\xd6\x33\xeb\x9b\x0d\xcc\x86\x66\x23\xb3\xb1\xd9\xc4\x6c\x6a\x36\x33\x9b\x9b\x2d\xcc\x96\x66\x2b\xb3\xb5\xd9\xc6\x6c\x6b\xb6\x33\xdb\x9b\x1d\x4c\xcc\xc4\x4d\xc2\x24\x4d\xca\xa4\x4d\xc6\x64\x4d\xce\xe4\x4d\xc1\x14\x4d\xc9\x94\x4d\xc5\x54\x4d\xcd\xd4\x4d\xc3\x34\x4d\xcb\xb4\x4d\xc7\x74\x4d\xcf\xf4\xcd\xc0\x0c\xcd\xc8\x04\x26\x34\x91\x19\x9b\x1d\xcd\x4e\x66\x67\xb3\x8b\xd9\xd5\xec\x66\x76\x37\x7b\x98\x3d\xcd\x5e\x66\x6f\xb3\x8f\xd9\xd7\xec\x67\xf6\x37\x07\x98\x03\xcd\x41\xe6\x60\x73\x88\x39\xd4\x1c\x66\x0e\x37\x47\x98\x23\xcd\x51\xe6\x68\x73\x8c\x39\xd6\x1c\x67\x8e\x37\x27\x98\x13\xcd\x49\xe6\x64\x73\x8a\x39\xd5\x9c\x66\x4e\x37\x67\x98\x33\xcd\x59\xe6\x6c\x73\x8e\x39\xd7\x9c\x67\xce\x37\x17\x98\x0b\xcd\x45\xe6\x62\x73\x89\xb9\xd4\x5c\x66\x2e\x37\x57\x98\x2b\xcd\x55\xe6\x6a\x73\x8d\xb9\xd6\x5c\x67\xae\x37\x37\x98\x1b\xcd\x4d\xe6\x66\x73\x8b\xb9\xd5\xdc\x66\x6e\x37\x77\x98\x3b\xcd\x5d\xe6\x6e\x73\x8f\xb9\xd7\xdc\x67\xee\x37\x0f\x98\x07\xcd\x43\xe6\x61\xf3\x88\x79\xd4\x3c\x66\x1e\x37\x4f\x98\x27\xcd\x53\xe6\x69\xf3\x8c\x79\xd6\x3c\x67\x9e\x37\x2f\x98\x17\xcd\x4b\xe6\x65\xf3\x8a\x79\xd5\xbc\x66\x5e\x37\x6f\x98\x37\xcd\x5b\xe6\x6d\xf3\x8e\x79\xd7\xbc\x67\xde\x37\x1f\x98\x0f\xcd\x47\xe6\x63\xf3\x89\xf9\xd4\x7c\x66\x3e\x37\x5f\x98\x2f\xcd\x57\xe6\x6b\xf3\x8d\xf9\xd6\x7c\x67\xbe\x37\x3f\x98\x1f\xcd\x4f\xe6\x67\xf3\x8b\xf9\xd5\xfc\x66\x7e\x37\x7f\x98\x3f\xcd\x5f\xe6\x6f\xf3\x8f\xf9\xd7\xfc\x67\x25\xb0\x12\x5a\x89\xac\xc4\x56\x12\x2b\xa9\x95\xcc\x4a\x6e\xa5\xb0\x52\x5a\xa9\xac\xd4\x56\x1a\x2b\xad\x95\xce\x4a\x6f\x65\xb0\x32\x5a\x99\xac\xcc\x56\x16\x2b\xab\x95\xcd\xca\x6e\xe5\xb0\x72\x5a\xb9\xac\xdc\x56\x1e\x2b\xaf\x95\xcf\xca\x6f\x15\xb0\x0a\x5a\x85\xac\xc2\x56\x11\xab\xa8\x55\xcc\x2a\x6e\x95\xb0\x4a\x5a\xa5\xac\xd2\x56\x19\xab\xac\x55\xce\x2a\x6f\x55\xb0\x2a\x5a\x95\xac\xca\x56\x15\xab\xaa\x55\xcd\xaa\x6e\xd5\xb0\x6a\x5a\xb5\xac\xda\x56\x1d\xab\xae\x55\xcf\xaa\x6f\x35\xb0\x1a\x5a\x8d\xac\xc6\x56\x13\xab\xa9\xd5\xcc\x6a\x6e\xb5\xb0\x5a\x5a\xad\xac\xd6\x56\x1b\xab\xad\xd5\xce\x6a\x6f\x75\xb0\x30\x0b\xb7\x08\x8b\xb4\x28\x8b\xb6\x18\x8b\xb5\x38\x8b\xb7\x04\x4b\xb4\x24\x4b\xb6\x14\x4b\xb5\x34\x4b\xb7\x0c\xcb\xb4\x2c\xcb\xb6\x1c\xcb\xb5\x3c\xcb\xb7\x02\x2b\xb4\x22\x0b\x58\xd0\x42\x56\x6c\x75\xb4\x3a\x59\x9d\xad\x2e\x56\x57\xab\x9b\xd5\xdd\xea\x61\xf5\xb4\x7a\x59\xbd\xad\x3e\x56\x5f\xab\x9f\xd5\xdf\x1a\x60\x0d\xb4\x06\x59\x83\xad\x21\xd6\x50\x6b\x98\x35\xdc\x1a\x61\x8d\xb4\x46\x59\xa3\xad\x31\xd6\x58\x6b\x9c\x35\xde\x9a\x60\x4d\xb4\x26\x59\x93\xad\x29\xd6\x54\x6b\x9a\x35\xdd\x9a\x61\xcd\xb4\x66\x59\xb3\xad\x39\xd6\x5c\x6b\x9e\x35\xdf\x5a\x60\x2d\xb4\x16\x59\x8b\xad\x25\xd6\x52\x6b\x99\xb5\xdc\x5a\x61\xad\xb4\x56\x59\xab\xad\x35\xd6\x5a\x6b\x9d\xb5\xde\xda\x60\x6d\xb4\x36\x59\x9b\xad\x2d\xd6\x56\x6b\x9b\xb5\xdd\xda\x61\xed\xb4\x76\x59\xbb\xad\x3d\xd6\x5e\x6b\x9f\xb5\xdf\x3a\x60\x1d\xb4\x0e\x59\x87\xad\x23\xd6\x51\xeb\x98\x75\xdc\x3a\x61\x9d\xb4\x4e\x59\xa7\xad\x33\xd6\x59\xeb\x9c\x75\xde\xba\x60\x5d\xb4\x2e\x59\x97\xad\x2b\xd6\x55\xeb\x9a\x75\xdd\xba\x61\xdd\xb4\x6e\x59\xb7\xad\x3b\xd6\x5d\xeb\x9e\x75\xdf\x7a\x60\x3d\xb4\x1e\x59\x8f\xad\x27\xd6\x53\xeb\x99\xf5\xdc\x7a\x61\xbd\xb4\x5e\x59\xaf\xad\x37\xd6\x5b\xeb\x9d\xf5\xde\xfa\x60\x7d\xb4\x3e\x59\x9f\xad\x2f\xd6\x57\xeb\x9b\xf5\xdd\xfa\x61\xfd\xb4\x7e\x59\xbf\xad\x3f\xd6\x5f\xeb\x9f\x9d\xc0\x4e\x68\x27\xb2\x13\xdb\x49\xec\xa4\x76\x32\x3b\xb9\x9d\xc2\x4e\x69\xa7\xb2\x53\xdb\x69\xec\xb4\x76\x3a\x3b\xbd\x9d\xc1\xce\x68\x67\xb2\x33\xdb\x59\xec\xac\x76\x36\x3b\xbb\x9d\xc3\xce\x69\xe7\xb2\x73\xdb\x79\xec\xbc\x76\x3e\x3b\xbf\x5d\xc0\x2e\x68\x17\xb2\x0b\xdb\x45\xec\xa2\x76\x31\xbb\xb8\x5d\xc2\x2e\x69\x97\xb2\x4b\xdb\x65\xec\xb2\x76\x39\xbb\xbc\x5d\xc1\xae\x68\x57\xb2\x2b\xdb\x55\xec\xaa\x76\x35\xbb\xba\x5d\xc3\xae\x69\xd7\xb2\x6b\xdb\x75\xec\xba\x76\x3d\xbb\xbe\xdd\xc0\x6e\x68\x37\xb2\x1b\xdb\x4d\xec\xa6\x76\x33\xbb\xb9\xdd\xc2\x6e\x69\xb7\xb2\x5b\xdb\x6d\xec\xb6\x76\x3b\xbb\xbd\xdd\xc1\xc6\x6c\xdc\x26\x6c\xd2\xa6\x6c\xda\x66\x6c\xd6\xe6\x6c\xde\x16\x6c\xd1\x96\x6c\xd9\x56\x6c\xd5\xd6\x6c\xdd\x36\x6c\xd3\xb6\x6c\xdb\x76\x6c\xd7\xf6\x6c\xdf\x0e\xec\xd0\x8e\x6c\x60\x43\x1b\xd9\xb1\xdd\xd1\xee\x64\x77\xb6\xbb\xd8\x5d\xed\x6e\x76\x77\xbb\x87\xdd\xd3\xee\x65\xf7\xb6\xfb\xd8\x7d\xed\x7e\x76\x7f\x7b\x80\x3d\xd0\x1e\x64\x0f\xb6\x87\xd8\x43\xed\x61\xf6\x70\x7b\x84\x3d\xd2\x1e\x65\x8f\xb6\xc7\xd8\x63\xed\x71\xf6\x78\x7b\x82\x3d\xd1\x9e\x64\x4f\xb6\xa7\xd8\x53\xed\x69\xf6\x74\x7b\x86\x3d\xd3\x9e\x65\xcf\xb6\xe7\xd8\x73\xed\x79\xf6\x7c\x7b\x81\xbd\xd0\x5e\x64\x2f\xb6\x97\xd8\x4b\xed\x65\xf6\x72\x7b\x85\xbd\xd2\x5e\x65\xaf\xb6\xd7\xd8\x6b\xed\x75\xf6\x7a\x7b\x83\xbd\xd1\xde\x64\x6f\xb6\xb7\xd8\x5b\xed\x6d\xf6\x76\x7b\x87\xbd\xd3\xde\x65\xef\xb6\xf7\xd8\x7b\xed\x7d\xf6\x7e\xfb\x80\x7d\xd0\x3e\x64\x1f\xb6\x8f\xd8\x47\xed\x63\xf6\x71\xfb\x84\x7d\xd2\x3e\x65\x9f\xb6\xcf\xd8\x67\xed\x73\xf6\x79\xfb\x82\x7d\xd1\xbe\x64\x5f\xb6\xaf\xd8\x57\xed\x6b\xf6\x75\xfb\x86\x7d\xd3\xbe\x65\xdf\xb6\xef\xd8\x77\xed\x7b\xf6\x7d\xfb\x81\xfd\xd0\x7e\x64\x3f\xb6\x9f\xd8\x4f\xed\x67\xf6\x73\xfb\x85\xfd\xd2\x7e\x65\xbf\xb6\xdf\xd8\x6f\xed\x77\xf6\x7b\xfb\x83\xfd\xd1\xfe\x64\x7f\xb6\xbf\xd8\x5f\xed\x6f\xf6\x77\xfb\x87\xfd\xd3\xfe\x65\xff\xb6\xff\xd8\x7f\xed\x7f\x4e\x02\x27\xa1\x93\xc8\x49\xec\x24\x71\x92\x3a\xc9\x9c\xe4\x4e\x0a\x27\xa5\x93\xca\x49\xed\xa4\x71\xd2\x3a\xe9\x9c\xf4\x4e\x06\x27\xa3\x93\xc9\xc9\xec\x64\x71\xb2\x3a\xd9\x9c\xec\x4e\x0e\x27\xa7\x93\xcb\xc9\xed\xe4\x71\xf2\x3a\xf9\x9c\xfc\x4e\x01\xa7\xa0\x53\xc8\x29\xec\x14\x71\x8a\x3a\xc5\x9c\xe2\x4e\x09\xa7\xa4\x53\xca\x29\xed\x94\x71\xca\x3a\xe5\x9c\xf2\x4e\x05\xa7\xa2\x53\xc9\xa9\xec\x54\x71\xaa\x3a\xd5\x9c\xea\x4e\x0d\xa7\xa6\x53\xcb\xa9\xed\xd4\x71\xea\x3a\xf5\x9c\xfa\x4e\x03\xa7\xa1\xd3\xc8\x69\xec\x34\x71\x9a\x3a\xcd\x9c\xe6\x4e\x0b\xa7\xa5\xd3\xca\x69\xed\xb4\x71\xda\x3a\xed\x9c\xf6\x4e\x07\x07\x73\x70\x87\x70\x48\x87\x72\x68\x87\x71\x58\x87\x73\x78\x47\x70\x44\x47\x72\x64\x47\x71\x54\x47\x73\x74\xc7\x70\x4c\xc7\x72\x6c\xc7\x71\x5c\xc7\x73\x7c\x27\x70\x42\x27\x72\x80\x03\x1d\xe4\xc4\x4e\x47\xa7\x93\xd3\xd9\xe9\xe2\x74\x75\xba\x39\xdd\x9d\x1e\x4e\x4f\xa7\x97\xd3\xdb\xe9\xe3\xf4\x75\xfa\x39\xfd\x9d\x01\xce\x40\x67\x90\x33\xd8\x19\xe2\x0c\x75\x86\x39\xc3\x9d\x11\xce\x48\x67\x94\x33\xda\x19\xe3\x8c\x75\xc6\x39\xe3\x9d\x09\xce\x44\x67\x92\x33\xd9\x99\xe2\x4c\x75\xa6\x39\xd3\x9d\x19\xce\x4c\x67\x96\x33\xdb\x99\xe3\xcc\x75\xe6\x39\xf3\x9d\x05\xce\x42\x67\x91\xb3\xd8\x59\xe2\x2c\x75\x96\x39\xcb\x9d\x15\xce\x4a\x67\x95\xb3\xda\x59\xe3\xac\x75\xd6\x39\xeb\x9d\x0d\xce\x46\x67\x93\xb3\xd9\xd9\xe2\x6c\x75\xb6\x39\xdb\x9d\x1d\xce\x4e\x67\x97\xb3\xdb\xd9\xe3\xec\x75\xf6\x39\xfb\x9d\x03\xce\x41\xe7\x90\x73\xd8\x39\xe2\x1c\x75\x8e\x39\xc7\x9d\x13\xce\x49\xe7\x94\x73\xda\x39\xe3\x9c\x75\xce\x39\xe7\x9d\x0b\xce\x45\xe7\x92\x73\xd9\xb9\xe2\x5c\x75\xae\x39\xd7\x9d\x1b\xce\x4d\xe7\x96\x73\xdb\xb9\xe3\xdc\x75\xee\x39\xf7\x9d\x07\xce\x43\xe7\x91\xf3\xd8\x79\xe2\x3c\x75\x9e\x39\xcf\x9d\x17\xce\x4b\xe7\x95\xf3\xda\x79\xe3\xbc\x75\xde\x39\xef\x9d\x0f\xce\x47\xe7\x93\xf3\xd9\xf9\xe2\x7c\x75\xbe\x39\xdf\x9d\x1f\xce\x4f\xe7\x97\xf3\xdb\xf9\xe3\xfc\x75\xfe\xb9\x09\xdc\x84\x6e\x22\x37\xb1\x9b\xc4\x4d\xea\x26\x73\x93\xbb\x29\xdc\x94\x6e\x2a\x37\xb5\x9b\xc6\x4d\xeb\xa6\x73\xd3\xbb\x19\xdc\x8c\x6e\x26\x37\xb3\x9b\xc5\xcd\xea\x66\x73\xb3\xbb\x39\xdc\x9c\x6e\x2e\x37\xb7\x9b\xc7\xcd\xeb\xe6\x73\xf3\xbb\x05\xdc\x82\x6e\x21\xb7\xb0\x5b\xc4\x2d\xea\x16\x73\x8b\xbb\x25\xdc\x92\x6e\x29\xb7\xb4\x5b\xc6\x2d\xeb\x96\x73\xcb\xbb\x15\xdc\x8a\x6e\x25\xb7\xb2\x5b\xc5\xad\xea\x56\x73\xab\xbb\x35\xdc\x9a\x6e\x2d\xb7\xb6\x5b\xc7\xad\xeb\xd6\x73\xeb\xbb\x0d\xdc\x86\x6e\x23\xb7\xb1\xdb\xc4\x6d\xea\x36\x73\x9b\xbb\x2d\xdc\x96\x6e\x2b\xb7\xb5\xdb\xc6\x6d\xeb\xb6\x73\xdb\xbb\x1d\x5c\xcc\xc5\x5d\xc2\x25\x5d\xca\xa5\x5d\xc6\x65\x5d\xce\xe5\x5d\xc1\x15\x5d\xc9\x95\x5d\xc5\x55\x5d\xcd\xd5\x5d\xc3\x35\x5d\xcb\xb5\x5d\xc7\x75\x5d\xcf\xf5\xdd\xc0\x0d\xdd\xc8\x05\x2e\x74\x91\x1b\xbb\x1d\xdd\x4e\x6e\x67\xb7\x8b\xdb\xd5\xed\xe6\x76\x77\x7b\xb8\x3d\xdd\x5e\x6e\x6f\xb7\x8f\xdb\xd7\xed\xe7\xf6\x77\x07\xb8\x03\xdd\x41\xee\x60\x77\x88\x3b\xd4\x1d\xe6\x0e\x77\x47\xb8\x23\xdd\x51\xee\x68\x77\x8c\x3b\xd6\x1d\xe7\x8e\x77\x27\xb8\x13\xdd\x49\xee\x64\x77\x8a\x3b\xd5\x9d\xe6\x4e\x77\x67\xb8\x33\xdd\x59\xee\x6c\x77\x8e\x3b\xd7\x9d\xe7\xce\x77\x17\xb8\x0b\xdd\x45\xee\x62\x77\x89\xbb\xd4\x5d\xe6\x2e\x77\x57\xb8\x2b\xdd\x55\xee\x6a\x77\x8d\xbb\xd6\x5d\xe7\xae\x77\x37\xb8\x1b\xdd\x4d\xee\x66\x77\x8b\xbb\xd5\xdd\xe6\x6e\x77\x77\xb8\x3b\xdd\x5d\xee\x6e\x77\x8f\xbb\xd7\xdd\xe7\xee\x77\x0f\xb8\x07\xdd\x43\xee\x61\xf7\x88\x7b\xd4\x3d\xe6\x1e\x77\x4f\xb8\x27\xdd\x53\xee\x69\xf7\x8c\x7b\xd6\x3d\xe7\x9e\x77\x2f\xb8\x17\xdd\x4b\xee\x65\xf7\x8a\x7b\xd5\xbd\xe6\x5e\x77\x6f\xb8\x37\xdd\x5b\xee\x6d\xf7\x8e\x7b\xd7\xbd\xe7\xde\x77\x1f\xb8\x0f\xdd\x47\xee\x63\xf7\x89\xfb\xd4\x7d\xe6\x3e\x77\x5f\xb8\x2f\xdd\x57\xee\x6b\xf7\x8d\xfb\xd6\x7d\xe7\xbe\x77\x3f\xb8\x1f\xdd\x4f\xee\x67\xf7\x8b\xfb\xd5\xfd\xe6\x7e\x77\x7f\xb8\x3f\xdd\x5f\xee\x6f\xf7\x8f\xfb\xd7\xfd\xe7\x25\xf0\x12\x7a\x89\xbc\xc4\x5e\x12\x2f\xa9\x97\xcc\x4b\xee\xa5\xf0\x52\x7a\xa9\xbc\xd4\x5e\x1a\x2f\xad\x97\xce\x4b\xef\x65\xf0\x32\x7a\x99\xbc\xcc\x5e\x16\x2f\xab\x97\xcd\xcb\xee\xe5\xf0\x72\x7a\xb9\xbc\xdc\x5e\x1e\x2f\xaf\x97\xcf\xcb\xef\x15\xf0\x0a\x7a\x85\xbc\xc2\x5e\x11\xaf\xa8\x57\xcc\x2b\xee\x95\xf0\x4a\x7a\xa5\xbc\xd2\x5e\x19\xaf\xac\x57\xce\x2b\xef\x55\xf0\x2a\x7a\x95\xbc\xca\x5e\x15\xaf\xaa\x57\xcd\xab\xee\xd5\xf0\x6a\x7a\xb5\xbc\xda\x5e\x1d\xaf\xae\x57\xcf\xab\xef\x35\xf0\x1a\x7a\x8d\xbc\xc6\x5e\x13\xaf\xa9\xd7\xcc\x6b\xee\xb5\xf0\x5a\x7a\xad\xbc\xd6\x5e\x1b\xaf\xad\xd7\xce\x6b\xef\x75\xf0\x30\x0f\xf7\x08\x8f\xf4\x28\x8f\xf6\x18\x8f\xf5\x38\x8f\xf7\x04\x4f\xf4\x24\x4f\xf6\x14\x4f\xf5\x34\x4f\xf7\x0c\xcf\xf4\x2c\xcf\xf6\x1c\xcf\xf5\x3c\xcf\xf7\x02\x2f\xf4\x22\x0f\x78\xd0\x43\x5e\xec\x75\xf4\x3a\x79\x9d\xbd\x2e\x5e\x57\xaf\x9b\xd7\xdd\xeb\xe1\xf5\xf4\x7a\x79\xbd\xbd\x3e\x5e\x5f\xaf\x9f\xd7\xdf\x1b\xe0\x0d\xf4\x06\x79\x83\xbd\x21\xde\x50\x6f\x98\x37\xdc\x1b\xe1\x8d\xf4\x46\x79\xa3\xbd\x31\xde\x58\x6f\x9c\x37\xde\x9b\xe0\x4d\xf4\x26\x79\x93\xbd\x29\xde\x54\x6f\x9a\x37\xdd\x9b\xe1\xcd\xf4\x66\x79\xb3\xbd\x39\xde\x5c\x6f\x9e\x37\xdf\x5b\xe0\x2d\xf4\x16\x79\x8b\xbd\x25\xde\x52\x6f\x99\xb7\xdc\x5b\xe1\xad\xf4\x56\x79\xab\xbd\x35\xde\x5a\x6f\x9d\xb7\xde\xdb\xe0\x6d\xf4\x36\x79\x9b\xbd\x2d\xde\x56\x6f\x9b\xb7\xdd\xdb\xe1\xed\xf4\x76\x79\xbb\xbd\x3d\xde\x5e\x6f\x9f\xb7\xdf\x3b\xe0\x1d\xf4\x0e\x79\x87\xbd\x23\xde\x51\xef\x98\x77\xdc\x3b\xe1\x9d\xf4\x4e\x79\xa7\xbd\x33\xde\x59\xef\x9c\x77\xde\xbb\xe0\x5d\xf4\x2e\x79\x97\xbd\x2b\xde\x55\xef\x9a\x77\xdd\xbb\xe1\xdd\xf4\x6e\x79\xb7\xbd\x3b\xde\x5d\xef\x9e\x77\xdf\x7b\xe0\x3d\xf4\x1e\x79\x8f\xbd\x27\xde\x53\xef\x99\xf7\xdc\x7b\xe1\xbd\xf4\x5e\x79\xaf\xbd\x37\xde\x5b\xef\x9d\xf7\xde\xfb\xe0\x7d\xf4\x3e\x79\x9f\xbd\x2f\xde\x57\xef\x9b\xf7\xdd\xfb\xe1\xfd\xf4\x7e\x79\xbf\xbd\x3f\xde\x5f\xef\x9f\x9f\xc0\x4f\xe8\x27\xf2\x13\xfb\x49\xfc\xa4\x7e\x32\x3f\xb9\x9f\xc2\x4f\xe9\xa7\xf2\x53\xfb\x69\xfc\xb4\x7e\x3a\x3f\xbd\x9f\xc1\xcf\xe8\x67\xf2\x33\xfb\x59\xfc\xac\x7e\x36\x3f\xbb\x9f\xc3\xcf\xe9\xe7\xf2\x73\xfb\x79\xfc\xbc\x7e\x3e\x3f\xbf\x5f\xc0\x2f\xe8\x17\xf2\x0b\xfb\x45\xfc\xa2\x7e\x31\xbf\xb8\x5f\xc2\x2f\xe9\x97\xf2\x4b\xfb\x65\xfc\xb2\x7e\x39\xbf\xbc\x5f\xc1\xaf\xe8\x57\xf2\x2b\xfb\x55\xfc\xaa\x7e\x35\xbf\xba\x5f\xc3\xaf\xe9\xd7\xf2\x6b\xfb\x75\xfc\xba\x7e\x3d\xbf\xbe\xdf\xc0\x6f\xe8\x37\xf2\x1b\xfb\x4d\xfc\xa6\x7e\x33\xbf\xb9\xdf\xc2\x6f\xe9\xb7\xf2\x5b\xfb\x6d\xfc\xb6\x7e\x3b\xbf\xbd\xdf\xc1\xc7\x7c\xdc\x27\x7c\xd2\xa7\x7c\xda\x67\x7c\xd6\xe7\x7c\xde\x17\x7c\xd1\x97\x7c\xd9\x57\x7c\xd5\xd7\x7c\xdd\x37\x7c\xd3\xb7\x7c\xdb\x77\x7c\xd7\xf7\x7c\xdf\x0f\xfc\xd0\x8f\x7c\xe0\x43\x1f\xf9\xb1\xdf\xd1\xef\xe4\x77\xf6\xbb\xf8\x5d\xfd\x6e\x7e\x77\xbf\x87\xdf\xd3\xef\xe5\xf7\xf6\xfb\xf8\x7d\xfd\x7e\x7e\x7f\x7f\x80\x3f\xd0\x1f\xe4\x0f\xf6\x87\xf8\x43\xfd\x61\xfe\x70\x7f\x84\x3f\xd2\x1f\xe5\x8f\xf6\xc7\xf8\x63\xfd\x71\xfe\x78\x7f\x82\x3f\xd1\x9f\xe4\x4f\xf6\xa7\xf8\x53\xfd\x69\xfe\x74\x7f\x86\x3f\xd3\x9f\xe5\xcf\xf6\xe7\xf8\x73\xfd\x79\xfe\x7c\x7f\x81\xbf\xd0\x5f\xe4\x2f\xf6\x97\xf8\x4b\xfd\x65\xfe\x72\x7f\x85\xbf\xd2\x5f\xe5\xaf\xf6\xd7\xf8\x6b\xfd\x75\xfe\x7a\x7f\x83\xbf\xd1\xdf\xe4\x6f\xf6\xb7\xf8\x5b\xfd\x6d\xfe\x76\x7f\x87\xbf\xd3\xdf\xe5\xef\xf6\xf7\xf8\x7b\xfd\x7d\xfe\x7e\xff\x80\x7f\xd0\x3f\xe4\x1f\xf6\x8f\xf8\x47\xfd\x63\xfe\x71\xff\x84\x7f\xd2\x3f\xe5\x9f\xf6\xcf\xf8\x67\xfd\x73\xfe\x79\xff\x82\x7f\xd1\xbf\xe4\x5f\xf6\xaf\xf8\x57\xfd\x6b\xfe\x75\xff\x86\x7f\xd3\xbf\xe5\xdf\xf6\xef\xf8\x77\xfd\x7b\xfe\x7d\xff\x81\xff\xd0\x7f\xe4\x3f\xf6\x9f\xf8\x4f\xfd\x67\xfe\x73\xff\x85\xff\xd2\x7f\xe5\xbf\xf6\xdf\xf8\x6f\xfd\x77\xfe\x7b\xff\x83\xff\xd1\xff\xe4\x7f\xf6\xbf\xf8\x5f\xfd\x6f\xfe\x77\xff\x87\xff\xd3\xff\xe5\xff\xf6\xff\xf8\x7f\xfd\x7f\x41\x82\x20\x61\x90\x28\x48\x1c\x24\x09\x92\x06\xc9\x82\xe4\x41\x8a\x20\x65\x90\x2a\x48\x1d\xa4\x09\xd2\x06\xe9\x82\xf4\x41\x86\x20\x63\x90\x29\xc8\x1c\x64\x09\xb2\x06\xd9\x82\xec\x41\x8e\x20\x67\x90\x2b\xc8\x1d\xe4\x09\xf2\x06\xf9\x82\xfc\x41\x81\xa0\x60\x50\x28\x28\x1c\x14\x09\x8a\x06\xc5\x82\xe2\x41\x89\xa0\x64\x50\x2a\x28\x1d\x94\x09\xca\x06\xe5\x82\xf2\x41\x85\xa0\x62\x50\x29\xa8\x1c\x54\x09\xaa\x06\xd5\x82\xea\x41\x8d\xa0\x66\x50\x2b\xa8\x1d\xd4\x09\xea\x06\xf5\x82\xfa\x41\x83\xa0\x61\xd0\x28\x68\x1c\x34\x09\x9a\x06\xcd\x82\xe6\x41\x8b\xa0\x65\xd0\x2a\x68\x1d\xb4\x09\xda\x06\xed\x82\xf6\x41\x87\x00\x0b\xf0\x80\x08\xc8\x80\x0a\xe8\x80\x09\xd8\x80\x0b\xf8\x40\x08\xc4\x40\x0a\xe4\x40\x09\xd4\x40\x0b\xf4\xc0\x08\xcc\xc0\x0a\xec\xc0\x09\xdc\xc0\x0b\xfc\x20\x08\xc2\x20\x0a\x40\x00\x03\x14\xc4\x41\xc7\xa0\x53\xd0\x39\xe8\x12\x74\x0d\xba\x05\xdd\x83\x1e\x41\xcf\xa0\x57\xd0\x3b\xe8\x13\xf4\x0d\xfa\x05\xfd\x83\x01\xc1\xc0\x60\x50\x30\x38\x18\x12\x0c\x0d\x86\x05\xc3\x83\x11\xc1\xc8\x60\x54\x30\x3a\x18\x13\x8c\x0d\xc6\x05\xe3\x83\x09\xc1\xc4\x60\x52\x30\x39\x98\x12\x4c\x0d\xa6\x05\xd3\x83\x19\xc1\xcc\x60\x56\x30\x3b\x98\x13\xcc\x0d\xe6\x05\xf3\x83\x05\xc1\xc2\x60\x51\xb0\x38\x58\x12\x2c\x0d\x96\x05\xcb\x83\x15\xc1\xca\x60\x55\xb0\x3a\x58\x13\xac\x0d\xd6\x05\xeb\x83\x0d\xc1\xc6\x60\x53\xb0\x39\xd8\x12\x6c\x0d\xb6\x05\xdb\x83\x1d\xc1\xce\x60\x57\xb0\x3b\xd8\x13\xec\x0d\xf6\x05\xfb\x83\x03\xc1\xc1\xe0\x50\x70\x38\x38\x12\x1c\x0d\x8e\x05\xc7\x83\x13\xc1\xc9\xe0\x54\x70\x3a\x38\x13\x9c\x0d\xce\x05\xe7\x83\x0b\xc1\xc5\xe0\x52\x70\x39\xb8\x12\x5c\x0d\xae\x05\xd7\x83\x1b\xc1\xcd\xe0\x56\x70\x3b\xb8\x13\xdc\x0d\xee\x05\xf7\x83\x07\xc1\xc3\xe0\x51\xf0\x38\x78\x12\x3c\x0d\x9e\x05\xcf\x83\x17\xc1\xcb\xe0\x55\xf0\x3a\x78\x13\xbc\x0d\xde\x05\xef\x83\x0f\xc1\xc7\xe0\x53\xf0\x39\xf8\x12\x7c\x0d\xbe\x05\xdf\x83\x1f\xc1\xcf\xe0\x57\xf0\x3b\xf8\x13\xfc\x0d\xfe\x85\x09\xc2\x84\x61\xa2\x30\x71\x98\x24\x4c\x1a\x26\x0b\x93\x87\x29\xc2\x94\x61\xaa\x30\x75\x98\x26\x4c\x1b\xa6\x0b\xd3\x87\x19\xc2\x8c\x61\xa6\x30\x73\x98\x25\xcc\x1a\x66\x0b\xb3\x87\x39\xc2\x9c\x61\xae\x30\x77\x98\x27\xcc\x1b\xe6\x0b\xf3\x87\x05\xc2\x82\x61\xa1\xb0\x70\x58\x24\x2c\x1a\x16\x0b\x8b\x87\x25\xc2\x92\x61\xa9\xb0\x74\x58\x26\x2c\x1b\x96\x0b\xcb\x87\x15\xc2\x8a\x61\xa5\xb0\x72\x58\x25\xac\x1a\x56\x0b\xab\x87\x35\xc2\x9a\x61\xad\xb0\x76\x58\x27\xac\x1b\xd6\x0b\xeb\x87\x0d\xc2\x86\x61\xa3\xb0\x71\xd8\x24\x6c\x1a\x36\x0b\x9b\x87\x2d\xc2\x96\x61\xab\xb0\x75\xd8\x26\x6c\x1b\xb6\x0b\xdb\x87\x1d\x42\x2c\xc4\x43\x22\x24\x43\x2a\xa4\x43\x26\x64\x43\x2e\xe4\x43\x21\x14\x43\x29\x94\x43\x25\x54\x43\x2d\xd4\x43\x23\x34\x43\x2b\xb4\x43\x27\x74\x43\x2f\xf4\xc3\x20\x0c\xc3\x28\x04\x21\x0c\x51\x18\x87\x1d\xc3\x4e\x61\xe7\xb0\x4b\xd8\x35\xec\x16\x76\x0f\x7b\x84\x3d\xc3\x5e\x61\xef\xb0\x4f\xd8\x37\xec\x17\xf6\x0f\x07\x84\x03\xc3\x41\xe1\xe0\x70\x48\x38\x34\x1c\x16\x0e\x0f\x47\x84\x23\xc3\x51\xe1\xe8\x70\x4c\x38\x36\x1c\x17\x8e\x0f\x27\x84\x13\xc3\x49\xe1\xe4\x70\x4a\x38\x35\x9c\x16\x4e\x0f\x67\x84\x33\xc3\x59\xe1\xec\x70\x4e\x38\x37\x9c\x17\xce\x0f\x17\x84\x0b\xc3\x45\xe1\xe2\x70\x49\xb8\x34\x5c\x16\x2e\x0f\x57\x84\x2b\xc3\x55\xe1\xea\x70\x4d\xb8\x36\x5c\x17\xae\x0f\x37\x84\x1b\xc3\x4d\xe1\xe6\x70\x4b\xb8\x35\xdc\x16\x6e\x0f\x77\x84\x3b\xc3\x5d\xe1\xee\x70\x4f\xb8\x37\xdc\x17\xee\x0f\x0f\x84\x07\xc3\x43\xe1\xe1\xf0\x48\x78\x34\x3c\x16\x1e\x0f\x4f\x84\x27\xc3\x53\xe1\xe9\xf0\x4c\x78\x36\x3c\x17\x9e\x0f\x2f\x84\x17\xc3\x4b\xe1\xe5\xf0\x4a\x78\x35\xbc\x16\x5e\x0f\x6f\x84\x37\xc3\x5b\xe1\xed\xf0\x4e\x78\x37\xbc\x17\xde\x0f\x1f\x84\x0f\xc3\x47\xe1\xe3\xf0\x49\xf8\x34\x7c\x16\x3e\x0f\x5f\x84\x2f\xc3\x57\xe1\xeb\xf0\x4d\xf8\x36\x7c\x17\xbe\x0f\x3f\x84\x1f\xc3\x4f\xe1\xe7\xf0\x4b\xf8\x35\xfc\x16\x7e\x0f\x7f\x84\x3f\xc3\x5f\xe1\xef\xf0\x4f\xf8\x37\xfc\x17\x25\x88\x12\x46\x89\xa2\xc4\x51\x92\x28\x69\x94\x2c\x4a\x1e\xa5\x88\x52\x46\xa9\xa2\xd4\x51\x9a\x28\x6d\x94\x2e\x4a\x1f\x65\x88\x32\x46\x99\xa2\xcc\x51\x96\x28\x6b\x94\x2d\xca\x1e\xe5\x88\x72\x46\xb9\xa2\xdc\x51\x9e\x28\x6f\x94\x2f\xca\x1f\x15\x88\x0a\x46\x85\xa2\xc2\x51\x91\xa8\x68\x54\x2c\x2a\x1e\x95\x88\x4a\x46\xa5\xa2\xd2\x51\x99\xa8\x6c\x54\x2e\x2a\x1f\x55\x88\x2a\x46\x95\xa2\xca\x51\x95\xa8\x6a\x54\x2d\xaa\x1e\xd5\x88\x6a\x46\xb5\xa2\xda\x51\x9d\xa8\x6e\x54\x2f\xaa\x1f\x35\x88\x1a\x46\x8d\xa2\xc6\x51\x93\xa8\x69\xd4\x2c\x6a\x1e\xb5\x88\x5a\x46\xad\xa2\xd6\x51\x9b\xa8\x6d\xd4\x2e\x6a\x1f\x75\x88\xb0\x08\x8f\x88\x88\x8c\xa8\x88\x8e\x98\x88\x8d\xb8\x88\x8f\x84\x48\x8c\xa4\x48\x8e\x94\x48\x8d\xb4\x48\x8f\x8c\xc8\x8c\xac\xc8\x8e\x9c\xc8\x8d\xbc\xc8\x8f\x82\x28\x8c\xa2\x08\x44\x30\x42\x51\x1c\x75\x8c\x3a\x45\x9d\xa3\x2e\x51\xd7\xa8\x5b\xd4\x3d\xea\x11\xf5\x8c\x7a\x45\xbd\xa3\x3e\x51\xdf\xa8\x5f\xd4\x3f\x1a\x10\x0d\x8c\x06\x45\x83\xa3\x21\xd1\xd0\x68\x58\x34\x3c\x1a\x11\x8d\x8c\x46\x45\xa3\xa3\x31\xd1\xd8\x68\x5c\x34\x3e\x9a\x10\x4d\x8c\x26\x45\x93\xa3\x29\xd1\xd4\x68\x5a\x34\x3d\x9a\x11\xcd\x8c\x66\x45\xb3\xa3\x39\xd1\xdc\x68\x5e\x34\x3f\x5a\x10\x2d\x8c\x16\x45\x8b\xa3\x25\xd1\xd2\x68\x59\xb4\x3c\x5a\x11\xad\x8c\x56\x45\xab\xa3\x35\xd1\xda\x68\x5d\xb4\x3e\xda\x10\x6d\x8c\x36\x45\x9b\xa3\x2d\xd1\xd6\x68\x5b\xb4\x3d\xda\x11\xed\x8c\x76\x45\xbb\xa3\x3d\xd1\xde\x68\x5f\xb4\x3f\x3a\x10\x1d\x8c\x0e\x45\x87\xa3\x23\xd1\xd1\xe8\x58\x74\x3c\x3a\x11\x9d\x8c\x4e\x45\xa7\xa3\x33\xd1\xd9\xe8\x5c\x74\x3e\xba\x10\x5d\x8c\x2e\x45\x97\xa3\x2b\xd1\xd5\xe8\x5a\x74\x3d\xba\x11\xdd\x8c\x6e\x45\xb7\xa3\x3b\xd1\xdd\xe8\x5e\x74\x3f\x7a\x10\x3d\x8c\x1e\x45\x8f\xa3\x27\xd1\xd3\xe8\x59\xf4\x3c\x7a\x11\xbd\x8c\x5e\x45\xaf\xa3\x37\xd1\xdb\xe8\x5d\xf4\x3e\xfa\x10\x7d\x8c\x3e\x45\x9f\xa3\x2f\xd1\xd7\xe8\x5b\xf4\x3d\xfa\x11\xfd\x8c\x7e\x45\xbf\xa3\x3f\xd1\xdf\xe8\x1f\x48\x00\x12\x82\x44\x20\x31\x48\x02\x92\x82\x64\x20\x39\x48\x01\x52\x82\x54\x20\x35\x48\x03\xd2\x82\x74\x20\x3d\xc8\x00\x32\x82\x4c\x20\x33\xc8\x02\xb2\x82\x6c\x20\x3b\xc8\x01\x72\x82\x5c\x20\x37\xc8\x03\xf2\x82\x7c\x20\x3f\x28\x00\x0a\x82\x42\xa0\x30\x28\x02\x8a\x82\x62\xa0\x38\x28\x01\x4a\x82\x52\xa0\x34\x28\x03\xca\x82\x72\xa0\x3c\xa8\x00\x2a\x82\x4a\xa0\x32\xa8\x02\xaa\x82\x6a\xa0\x3a\xa8\x01\x6a\x82\x5a\xa0\x36\xa8\x03\xea\x82\x7a\xa0\x3e\x68\x00\x1a\x82\x46\xa0\x31\x68\x02\x9a\x82\x66\xa0\x39\x68\x01\x5a\x82\x56\xa0\x35\x68\x03\xda\x82\x76\xa0\x3d\xe8\x00\x30\x80\x03\x02\x90\x80\x02\x34\x60\x00\x0b\x38\xc0\x03\x01\x88\x40\x02\x32\x50\x80\x0a\x34\xa0\x03\x03\x98\xc0\x02\x36\x70\x80\x0b\x3c\xe0\x83\x00\x84\x20\x02\x00\x40\x80\x40\x0c\x3a\x82\x4e\xa0\x33\xe8\x02\xba\x82\x6e\xa0\x3b\xe8\x01\x7a\x82\x5e\xa0\x37\xe8\x03\xfa\x82\x7e\xa0\x3f\x18\x00\x06\x82\x41\x60\x30\x18\x02\x86\x82\x61\x60\x38\x18\x01\x46\x82\x51\x60\x34\x18\x03\xc6\x82\x71\x60\x3c\x98\x00\x26\x82\x49\x60\x32\x98\x02\xa6\x82\x69\x60\x3a\x98\x01\x66\x82\x59\x60\x36\x98\x03\xe6\x82\x79\x60\x3e\x58\x00\x16\x82\x45\x60\x31\x58\x02\x96\x82\x65\x60\x39\x58\x01\x56\x82\x55\x60\x35\x58\x03\xd6\x82\x75\x60\x3d\xd8\x00\x36\x82\x4d\x60\x33\xd8\x02\xb6\x82\x6d\x60\x3b\xd8\x01\x76\x82\x5d\x60\x37\xd8\x03\xf6\x82\x7d\x60\x3f\x38\x00\x0e\x82\x43\xe0\x30\x38\x02\x8e\x82\x63\xe0\x38\x38\x01\x4e\x82\x53\xe0\x34\x38\x03\xce\x82\x73\xe0\x3c\xb8\x00\x2e\x82\x4b\xe0\x32\xb8\x02\xae\x82\x6b\xe0\x3a\xb8\x01\x6e\x82\x5b\xe0\x36\xb8\x03\xee\x82\x7b\xe0\x3e\x78\x00\x1e\x82\x47\xe0\x31\x78\x02\x9e\x82\x67\xe0\x39\x78\x01\x5e\x82\x57\xe0\x35\x78\x03\xde\x82\x77\xe0\x3d\xf8\x00\x3e\x82\x4f\xe0\x33\xf8\x02\xbe\x82\x6f\xe0\x3b\xf8\x01\x7e\x82\x5f\xe0\x37\xf8\x03\xfe\x82\x7f\x30\x01\x4c\x08\x13\xc1\xc4\x30\x09\x4c\x0a\x93\xc1\xe4\x30\x05\x4c\x09\x53\xc1\xd4\x30\x0d\x4c\x0b\xd3\xc1\xf4\x30\x03\xcc\x08\x33\xc1\xcc\x30\x0b\xcc\x0a\xb3\xc1\xec\x30\x07\xcc\x09\x73\xc1\xdc\x30\x0f\xcc\x0b\xf3\xc1\xfc\xb0\x00\x2c\x08\x0b\xc1\xc2\xb0\x08\x2c\x0a\x8b\xc1\xe2\xb0\x04\x2c\x09\x4b\xc1\xd2\xb0\x0c\x2c\x0b\xcb\xc1\xf2\xb0\x02\xac\x08\x2b\xc1\xca\xb0\x0a\xac\x0a\xab\xc1\xea\xb0\x06\xac\x09\x6b\xc1\xda\xb0\x0e\xac\x0b\xeb\xc1\xfa\xb0\x01\x6c\x08\x1b\xc1\xc6\xb0\x09\x6c\x0a\x9b\xc1\xe6\xb0\x05\x6c\x09\x5b\xc1\xd6\xb0\x0d\x6c\x0b\xdb\xc1\xf6\xb0\x03\xc4\x20\x0e\x09\x48\x42\x0a\xd2\x90\x81\x2c\xe4\x20\x0f\x05\x28\x42\x09\xca\x50\x81\x2a\xd4\xa0\x0e\x0d\x68\x42\x0b\xda\xd0\x81\x2e\xf4\xa0\x0f\x03\x18\xc2\x08\x02\x08\x21\x82\x31\xec\x08\x3b\xc1\xce\xb0\x0b\xec\x0a\xbb\xc1\xee\xb0\x07\xec\x09\x7b\xc1\xde\xb0\x0f\xec\x0b\xfb\xc1\xfe\x70\x00\x1c\x08\x07\xc1\xc1\x70\x08\x1c\x0a\x87\xc1\xe1\x70\x04\x1c\x09\x47\xc1\xd1\x70\x0c\x1c\x0b\xc7\xc1\xf1\x70\x02\x9c\x08\x27\xc1\xc9\x70\x0a\x9c\x0a\xa7\xc1\xe9\x70\x06\x9c\x09\x67\xc1\xd9\x70\x0e\x9c\x0b\xe7\xc1\xf9\x70\x01\x5c\x08\x17\xc1\xc5\x70\x09\x5c\x0a\x97\xc1\xe5\x70\x05\x5c\x09\x57\xc1\xd5\x70\x0d\x5c\x0b\xd7\xc1\xf5\x70\x03\xdc\x08\x37\xc1\xcd\x70\x0b\xdc\x0a\xb7\xc1\xed\x70\x07\xdc\x09\x77\xc1\xdd\x70\x0f\xdc\x0b\xf7\xc1\xfd\xf0\x00\x3c\x08\x0f\xc1\xc3\xf0\x08\x3c\x0a\x8f\xc1\xe3\xf0\x04\x3c\x09\x4f\xc1\xd3\xf0\x0c\x3c\x0b\xcf\xc1\xf3\xf0\x02\xbc\x08\x2f\xc1\xcb\xf0\x0a\xbc\x0a\xaf\xc1\xeb\xf0\x06\xbc\x09\x6f\xc1\xdb\xf0\x0e\xbc\x0b\xef\xc1\xfb\xf0\x01\x7c\x08\x1f\xc1\xc7\xf0\x09\x7c\x0a\x9f\xc1\xe7\xf0\x05\x7c\x09\x5f\xc1\xd7\xf0\x0d\x7c\x0b\xdf\xc1\xf7\xf0\x03\xfc\x08\x3f\xc1\xcf\xf0\x0b\xfc\x0a\xbf\xc1\xef\xf0\x07\xfc\x09\x7f\xc1\xdf\xf0\x0f\xfc\x0b\xff\xa1\x04\x28\x21\x4a\x84\x12\xa3\x24\x28\x29\x4a\x86\x92\xa3\x14\x28\x25\x4a\x85\x52\xa3\x34\x28\x2d\x4a\x87\xd2\xa3\x0c\x28\x23\xca\x84\x32\xa3\x2c\x28\x2b\xca\x86\xb2\xa3\x1c\x28\x27\xca\x85\x72\xa3\x3c\x28\x2f\xca\x87\xf2\xa3\x02\xa8\x20\x2a\x84\x0a\xa3\x22\xa8\x28\x2a\x86\x8a\xa3\x12\xa8\x24\x2a\x85\x4a\xa3\x32\xa8\x2c\x2a\x87\xca\xa3\x0a\xa8\x22\xaa\x84\x2a\xa3\x2a\xa8\x2a\xaa\x86\xaa\xa3\x1a\xa8\x26\xaa\x85\x6a\xa3\x3a\xa8\x2e\xaa\x87\xea\xa3\x06\xa8\x21\x6a\x84\x1a\xa3\x26\xa8\x29\x6a\x86\x9a\xa3\x16\xa8\x25\x6a\x85\x5a\xa3\x36\xa8\x2d\x6a\x87\xda\xa3\x0e\x08\x43\x38\x22\x10\x89\x28\x44\x23\x06\xb1\x88\x43\x3c\x12\x90\x88\x24\x24\x23\x05\xa9\x48\x43\x3a\x32\x90\x89\x2c\x64\x23\x07\xb9\xc8\x43\x3e\x0a\x50\x88\x22\x04\x10\x44\x08\xc5\xa8\x23\xea\x84\x3a\xa3\x2e\xa8\x2b\xea\x86\xba\xa3\x1e\xa8\x27\xea\x85\x7a\xa3\x3e\xa8\x2f\xea\x87\xfa\xa3\x01\x68\x20\x1a\x84\x06\xa3\x21\x68\x28\x1a\x86\x86\xa3\x11\x68\x24\x1a\x85\x46\xa3\x31\x68\x2c\x1a\x87\xc6\xa3\x09\x68\x22\x9a\x84\x26\xa3\x29\x68\x2a\x9a\x86\xa6\xa3\x19\x68\x26\x9a\x85\x66\xa3\x39\x68\x2e\x9a\x87\xe6\xa3\x05\x68\x21\x5a\x84\x16\xa3\x25\x68\x29\x5a\x86\x96\xa3\x15\x68\x25\x5a\x85\x56\xa3\x35\x68\x2d\x5a\x87\xd6\xa3\x0d\x68\x23\xda\x84\x36\xa3\x2d\x68\x2b\xda\x86\xb6\xa3\x1d\x68\x27\xda\x85\x76\xa3\x3d\x68\x2f\xda\x87\xf6\xa3\x03\xe8\x20\x3a\x84\x0e\xa3\x23\xe8\x28\x3a\x86\x8e\xa3\x13\xe8\x24\x3a\x85\x4e\xa3\x33\xe8\x2c\x3a\x87\xce\xa3\x0b\xe8\x22\xba\x84\x2e\xa3\x2b\xe8\x2a\xba\x86\xae\xa3\x1b\xe8\x26\xba\x85\x6e\xa3\x3b\xe8\x2e\xba\x87\xee\xa3\x07\xe8\x21\x7a\x84\x1e\xa3\x27\xe8\x29\x7a\x86\x9e\xa3\x17\xe8\x25\x7a\x85\x5e\xa3\x37\xe8\x2d\x7a\x87\xde\xa3\x0f\xe8\x23\xfa\x84\x3e\xa3\x2f\xe8\x2b\xfa\x86\xbe\xa3\x1f\xe8\x27\xfa\x85\x7e\xa3\x3f\xe8\x2f\xfa\x17\x27\x88\x13\xc6\x89\xe2\xc4\x71\x92\x38\x69\x9c\x2c\x4e\x1e\xa7\x88\x53\xc6\xa9\xe2\xd4\x71\x9a\x38\x6d\x9c\x2e\x4e\x1f\x67\x88\x33\xc6\x99\xe2\xcc\x71\x96\x38\x6b\x9c\x2d\xce\x1e\xe7\x88\x73\xc6\xb9\xe2\xdc\x71\x9e\x38\x6f\x9c\x2f\xce\x1f\x17\x88\x0b\xc6\x85\xe2\xc2\x71\x91\xb8\x68\x5c\x2c\x2e\x1e\x97\x88\x4b\xc6\xa5\xe2\xd2\x71\x99\xb8\x6c\x5c\x2e\x2e\x1f\x57\x88\x2b\xc6\x95\xe2\xca\x71\x95\xb8\x6a\x5c\x2d\xae\x1e\xd7\x88\x6b\xc6\xb5\xe2\xda\x71\x9d\xb8\x6e\x5c\x2f\xae\x1f\x37\x88\x1b\xc6\x8d\xe2\xc6\x71\x93\xb8\x69\xdc\x2c\x6e\x1e\xb7\x88\x5b\xc6\xad\xe2\xd6\x71\x9b\xb8\x6d\xdc\x2e\x6e\x1f\x77\x88\xb1\x18\x8f\x89\x98\x8c\xa9\x98\x8e\x99\x98\x8d\xb9\x98\x8f\x85\x58\x8c\xa5\x58\x8e\x95\x58\x8d\xb5\x58\x8f\x8d\xd8\x8c\xad\xd8\x8e\x9d\xd8\x8d\xbd\xd8\x8f\x83\x38\x8c\xa3\x18\xc4\x30\x46\x71\xfc\x9f\x00\x78\x00\x14\x22\x09\x00\x00\xda\xbf\x6c\xdb\xb6\x6d\xdb\xb6\xed\xd6\xb6\x35\x33\x9b\x6d\xdb\xb6\x6d\xdb\xb6\xdd\x3d\x0c\xc7\x08\x8c\xc4\x28\x8c\xc6\x18\x8c\xc5\x38\x8c\xc7\x04\x4c\xc4\x24\x4c\xc6\x14\x4c\xc5\x34\x4c\xc7\x0c\xcc\xc4\x2c\xcc\xc6\x1c\xcc\xc5\x3c\xcc\xc7\x02\x2c\xc4\x22\x0c\x60\x10\x43\x58\x8c\x4d\xc4\x26\x61\x93\xb1\x29\xd8\x54\x6c\x1a\x36\x1d\x9b\x81\xcd\xc4\x66\x61\xb3\xb1\x39\xd8\x5c\x6c\x1e\x36\x1f\x5b\x80\x2d\xc4\x16\x61\x8b\xb1\x25\xd8\x52\x6c\x19\xb6\x1c\x5b\x81\xad\xc4\x56\x61\xab\xb1\x35\xd8\x5a\x6c\x1d\xb6\x1e\xdb\x80\x6d\xc4\x36\x61\x9b\xb1\x2d\xd8\x56\x6c\x1b\xb6\x1d\xdb\x81\xed\xc4\x76\x61\xbb\xb1\x3d\xd8\x5e\x6c\x1f\xb6\x1f\x3b\x80\x1d\xc4\x0e\x61\x87\xb1\x23\xd8\x51\xec\x18\x76\x1c\x3b\x81\x9d\xc4\x4e\x61\xa7\xb1\x33\xd8\x59\xec\x1c\x76\x1e\xbb\x80\x5d\xc4\x2e\x61\x97\xb1\x2b\xd8\x55\xec\x1a\x76\x1d\xbb\x81\xdd\xc4\x6e\x61\xb7\xb1\x3b\xd8\x5d\xec\x1e\x76\x1f\x7b\x80\x3d\xc4\x1e\x61\x8f\xb1\x27\xd8\x53\xec\x19\xf6\x1c\x7b\x81\xbd\xc4\x5e\x61\xaf\xb1\x37\xd8\x5b\xec\x1d\xf6\x1e\xfb\x80\x7d\xc4\x3e\x61\x9f\xb1\x2f\xd8\x57\xec\x1b\xf6\x1d\xfb\x81\xfd\xc4\x7e\x61\xbf\xb1\x3f\xd8\x5f\xec\x1f\x9e\x08\x4f\xc0\xff\xc3\x13\xe3\x49\xf0\xa4\x78\x32\x3c\x39\x9e\x02\x4f\x89\xa7\xc2\x53\xe3\x69\xf0\xb4\x78\x3a\x3c\x3d\x9e\x01\xcf\x88\x67\xc2\x33\xe3\x59\xf0\xac\x78\x36\x3c\x3b\x9e\x03\xcf\x89\xe7\xc2\x73\xe3\x79\xf0\xbc\x78\x3e\x3c\x3f\x5e\x00\x2f\x88\x17\xc2\x0b\xe3\x45\xf0\xa2\x78\x31\xbc\x38\x5e\x02\x2f\x89\x97\xc2\x4b\xe3\x65\xf0\xb2\x78\x39\xbc\x3c\x5e\x01\xaf\x88\x57\xc2\x2b\xe3\x55\xf0\xaa\x78\x35\xbc\x3a\x5e\x03\xaf\x89\xd7\xc2\x6b\xe3\x75\xf0\xba\x78\x3d\xbc\x3e\xde\x00\x6f\x88\x37\xc2\x1b\xe3\x4d\xf0\xa6\x78\x33\xbc\x39\xde\x02\x6f\x89\xb7\xc2\x5b\xe3\x6d\xf0\xb6\x78\x3b\xbc\x3d\xde\x01\xef\x88\x77\xc2\x3b\xe3\x5d\xf0\xae\x78\x37\xbc\x3b\xde\x03\xef\x89\xf7\xc2\x7b\xe3\x7d\xf0\xbe\x78\x3f\xbc\x3f\x3e\x00\x1f\x88\x0f\xc2\x07\xe3\x43\xf0\xa1\xf8\x30\x7c\x38\x3e\x02\x1f\x89\x8f\xc2\x47\xe3\x63\xf0\xb1\xf8\x38\x7c\x3c\x3e\x01\xc7\x70\x1c\x27\x70\x12\xa7\x70\x1a\x67\x70\x16\xe7\x70\x1e\x17\x70\x11\x97\x70\x19\x57\x70\x15\xd7\x70\x1d\x37\x70\x13\xb7\x70\x1b\x77\x70\x17\xf7\x70\x1f\x0f\xf0\x10\x8f\x70\x80\x43\x1c\xe1\x31\x3e\x11\x9f\x84\x4f\xc6\xa7\xe0\x53\xf1\x69\xf8\x74\x7c\x06\x3e\x13\x9f\x85\xcf\xc6\xe7\xe0\x73\xf1\x79\xf8\x7c\x7c\x01\xbe\x10\x5f\x84\x2f\xc6\x97\xe0\x4b\xf1\x65\xf8\x72\x7c\x05\xbe\x12\x5f\x85\xaf\xc6\xd7\xe0\x6b\xf1\x75\xf8\x7a\x7c\x03\xbe\x11\xdf\x84\x6f\xc6\xb7\xe0\x5b\xf1\x6d\xf8\x76\x7c\x07\xbe\x13\xdf\x85\xef\xc6\xf7\xe0\x7b\xf1\x7d\xf8\x7e\xfc\x00\x7e\x10\x3f\x84\x1f\xc6\x8f\xe0\x47\xf1\x63\xf8\x71\xfc\x04\x7e\x12\x3f\x85\x9f\xc6\xcf\xe0\x67\xf1\x73\xf8\x79\xfc\x02\x7e\x11\xbf\x84\x5f\xc6\xaf\xe0\x57\xf1\x6b\xf8\x75\xfc\x06\x7e\x13\xbf\x85\xdf\xc6\xef\xe0\x77\xf1\x7b\xf8\x7d\xfc\x01\xfe\x10\x7f\x84\x3f\xc6\x9f\xe0\x4f\xf1\x67\xf8\x73\xfc\x05\xfe\x12\x7f\x85\xbf\xc6\xdf\xe0\x6f\xf1\x77\xf8\x7b\xfc\x03\xfe\x11\xff\x84\x7f\xc6\xbf\xe0\x5f\xf1\x6f\xf8\x77\xfc\x07\xfe\x13\xff\x85\xff\xc6\xff\xe0\x7f\xf1\x7f\x44\x22\x22\x81\xf8\x8f\x48\x4c\x24\x21\x92\x12\xc9\x88\xe4\x44\x0a\x22\x25\x91\x8a\x48\x4d\xa4\x21\xd2\x12\xe9\x88\xf4\x44\x06\x22\x23\x91\x89\xc8\x4c\x64\x21\xb2\x12\xd9\x88\xec\x44\x0e\x22\x27\x91\x8b\xc8\x4d\xe4\x21\xf2\x12\xf9\x88\xfc\x44\x01\xa2\x20\x51\x88\x28\x4c\x14\x21\x8a\x12\xc5\x88\xe2\x44\x09\xa2\x24\x51\x8a\x28\x4d\x94\x21\xca\x12\xe5\x88\xf2\x44\x05\xa2\x22\x51\x89\xa8\x4c\x54\x21\xaa\x12\xd5\x88\xea\x44\x0d\xa2\x26\x51\x8b\xa8\x4d\xd4\x21\xea\x12\xf5\x88\xfa\x44\x03\xa2\x21\xd1\x88\x68\x4c\x34\x21\x9a\x12\xcd\x88\xe6\x44\x0b\xa2\x25\xd1\x8a\x68\x4d\xb4\x21\xda\x12\xed\x88\xf6\x44\x07\xa2\x23\xd1\x89\xe8\x4c\x74\x21\xba\x12\xdd\x88\xee\x44\x0f\xa2\x27\xd1\x8b\xe8\x4d\xf4\x21\xfa\x12\xfd\x88\xfe\xc4\x00\x62\x20\x31\x88\x18\x4c\x0c\x21\x86\x12\xc3\x88\xe1\xc4\x08\x62\x24\x31\x8a\x18\x4d\x8c\x21\xc6\x12\xe3\x88\xf1\xc4\x04\x02\x23\x70\x82\x20\x48\x82\x22\x68\x82\x21\x58\x82\x23\x78\x42\x20\x44\x42\x22\x64\x42\x21\x54\x42\x23\x74\xc2\x20\x4c\xc2\x22\x6c\xc2\x21\x5c\xc2\x23\x7c\x22\x20\x42\x22\x22\x00\x01\x09\x44\xc4\xc4\x44\x62\x12\x31\x99\x98\x42\x4c\x25\xa6\x11\xd3\x89\x19\xc4\x4c\x62\x16\x31\x9b\x98\x43\xcc\x25\xe6\x11\xf3\x89\x05\xc4\x42\x62\x11\xb1\x98\x58\x42\x2c\x25\x96\x11\xcb\x89\x15\xc4\x4a\x62\x15\xb1\x9a\x58\x43\xac\x25\xd6\x11\xeb\x89\x0d\xc4\x46\x62\x13\xb1\x99\xd8\x42\x6c\x25\xb6\x11\xdb\x89\x1d\xc4\x4e\x62\x17\xb1\x9b\xd8\x43\xec\x25\xf6\x11\xfb\x89\x03\xc4\x41\xe2\x10\x71\x98\x38\x42\x1c\x25\x8e\x11\xc7\x89\x13\xc4\x49\xe2\x14\x71\x9a\x38\x43\x9c\x25\xce\x11\xe7\x89\x0b\xc4\x45\xe2\x12\x71\x99\xb8\x42\x5c\x25\xae\x11\xd7\x89\x1b\xc4\x4d\xe2\x16\x71\x9b\xb8\x43\xdc\x25\xee\x11\xf7\x89\x07\xc4\x43\xe2\x11\xf1\x98\x78\x42\x3c\x25\x9e\x11\xcf\x89\x17\xc4\x4b\xe2\x15\xf1\x9a\x78\x43\xbc\x25\xde\x11\xef\x89\x0f\xc4\x47\xe2\x13\xf1\x99\xf8\x42\x7c\x25\xbe\x11\xdf\x89\x1f\xc4\x4f\xe2\x17\xf1\x9b\xf8\x43\xfc\x25\xfe\x91\x89\xc8\x04\xf2\x3f\x32\x31\x99\x84\x4c\x4a\x26\x23\x93\x93\x29\xc8\x94\x64\x2a\x32\x35\x99\x86\x4c\x4b\xa6\x23\xd3\x93\x19\xc8\x8c\x64\x26\x32\x33\x99\x85\xcc\x4a\x66\x23\xb3\x93\x39\xc8\x9c\x64\x2e\x32\x37\x99\x87\xcc\x4b\xe6\x23\xf3\x93\x05\xc8\x82\x64\x21\xb2\x30\x59\x84\x2c\x4a\x16\x23\x8b\x93\x25\xc8\x92\x64\x29\xb2\x34\x59\x86\x2c\x4b\x96\x23\xcb\x93\x15\xc8\x8a\x64\x25\xb2\x32\x59\x85\xac\x4a\x56\x23\xab\x93\x35\xc8\x9a\x64\x2d\xb2\x36\x59\x87\xac\x4b\xd6\x23\xeb\x93\x0d\xc8\x86\x64\x23\xb2\x31\xd9\x84\x6c\x4a\x36\x23\x9b\x93\x2d\xc8\x96\x64\x2b\xb2\x35\xd9\x86\x6c\x4b\xb6\x23\xdb\x93\x1d\xc8\x8e\x64\x27\xb2\x33\xd9\x85\xec\x4a\x76\x23\xbb\x93\x3d\xc8\x9e\x64\x2f\xb2\x37\xd9\x87\xec\x4b\xf6\x23\xfb\x93\x03\xc8\x81\xe4\x20\x72\x30\x39\x84\x1c\x4a\x0e\x23\x87\x93\x23\xc8\x91\xe4\x28\x72\x34\x39\x86\x1c\x4b\x8e\x23\xc7\x93\x13\x48\x8c\xc4\x49\x82\x24\x49\x8a\xa4\x49\x86\x64\x49\x8e\xe4\x49\x81\x14\x49\x89\x94\x49\x85\x54\x49\x8d\xd4\x49\x83\x34\x49\x8b\xb4\x49\x87\x74\x49\x8f\xf4\xc9\x80\x0c\xc9\x88\x04\x24\x24\x11\x19\x93\x13\xc9\x49\xe4\x64\x72\x0a\x39\x95\x9c\x46\x4e\x27\x67\x90\x33\xc9\x59\xe4\x6c\x72\x0e\x39\x97\x9c\x47\xce\x27\x17\x90\x0b\xc9\x45\xe4\x62\x72\x09\xb9\x94\x5c\x46\x2e\x27\x57\x90\x2b\xc9\x55\xe4\x6a\x72\x0d\xb9\x96\x5c\x47\xae\x27\x37\x90\x1b\xc9\x4d\xe4\x66\x72\x0b\xb9\x95\xdc\x46\x6e\x27\x77\x90\x3b\xc9\x5d\xe4\x6e\x72\x0f\xb9\x97\xdc\x47\xee\x27\x0f\x90\x07\xc9\x43\xe4\x61\xf2\x08\x79\x94\x3c\x46\x1e\x27\x4f\x90\x27\xc9\x53\xe4\x69\xf2\x0c\x79\x96\x3c\x47\x9e\x27\x2f\x90\x17\xc9\x4b\xe4\x65\xf2\x0a\x79\x95\xbc\x46\x5e\x27\x6f\x90\x37\xc9\x5b\xe4\x6d\xf2\x0e\x79\x97\xbc\x47\xde\x27\x1f\x90\x0f\xc9\x47\xe4\x63\xf2\x09\xf9\x94\x7c\x46\x3e\x27\x5f\x90\x2f\xc9\x57\xe4\x6b\xf2\x0d\xf9\x96\x7c\x47\xbe\x27\x3f\x90\x1f\xc9\x4f\xe4\x67\xf2\x0b\xf9\x95\xfc\x46\x7e\x27\x7f\x90\x3f\xc9\x5f\xe4\x6f\xf2\x0f\xf9\x97\xfc\x47\x25\xa2\x12\xa8\xff\xa8\xc4\x54\x12\x2a\x29\x95\x8c\x4a\x4e\xa5\xa0\x52\x52\xa9\xa8\xd4\x54\x1a\x2a\x2d\x95\x8e\x4a\x4f\x65\xa0\x32\x52\x99\xa8\xcc\x54\x16\x2a\x2b\x95\x8d\xca\x4e\xe5\xa0\x72\x52\xb9\xa8\xdc\x54\x1e\x2a\x2f\x95\x8f\xca\x4f\x15\xa0\x0a\x52\x85\xa8\xc2\x54\x11\xaa\x28\x55\x8c\x2a\x4e\x95\xa0\x4a\x52\xa5\xa8\xd2\x54\x19\xaa\x2c\x55\x8e\x2a\x4f\x55\xa0\x2a\x52\x95\xa8\xca\x54\x15\xaa\x2a\x55\x8d\xaa\x4e\xd5\xa0\x6a\x52\xb5\xa8\xda\x54\x1d\xaa\x2e\x55\x8f\xaa\x4f\x35\xa0\x1a\x52\x8d\xa8\xc6\x54\x13\xaa\x29\xd5\x8c\x6a\x4e\xb5\xa0\x5a\x52\xad\xa8\xd6\x54\x1b\xaa\x2d\xd5\x8e\x6a\x4f\x75\xa0\x3a\x52\x9d\xa8\xce\x54\x17\xaa\x2b\xd5\x8d\xea\x4e\xf5\xa0\x7a\x52\xbd\xa8\xde\x54\x1f\xaa\x2f\xd5\x8f\xea\x4f\x0d\xa0\x06\x52\x83\xa8\xc1\xd4\x10\x6a\x28\x35\x8c\x1a\x4e\x8d\xa0\x46\x52\xa3\xa8\xd1\xd4\x18\x6a\x2c\x35\x8e\x1a\x4f\x4d\xa0\x30\x0a\xa7\x08\x8a\xa4\x28\x8a\xa6\x18\x8a\xa5\x38\x8a\xa7\x04\x4a\xa4\x24\x4a\xa6\x14\x4a\xa5\x34\x4a\xa7\x0c\xca\xa4\x2c\xca\xa6\x1c\xca\xa5\x3c\xca\xa7\x02\x2a\xa4\x22\x0a\x50\x90\x42\x54\x4c\x4d\xa4\x26\x51\x93\xa9\x29\xd4\x54\x6a\x1a\x35\x9d\x9a\x41\xcd\xa4\x66\x51\xb3\xa9\x39\xd4\x5c\x6a\x1e\x35\x9f\x5a\x40\x2d\xa4\x16\x51\x8b\xa9\x25\xd4\x52\x6a\x19\xb5\x9c\x5a\x41\xad\xa4\x56\x51\xab\xa9\x35\xd4\x5a\x6a\x1d\xb5\x9e\xda\x40\x6d\xa4\x36\x51\x9b\xa9\x2d\xd4\x56\x6a\x1b\xb5\x9d\xda\x41\xed\xa4\x76\x51\xbb\xa9\x3d\xd4\x5e\x6a\x1f\xb5\x9f\x3a\x40\x1d\xa4\x0e\x51\x87\xa9\x23\xd4\x51\xea\x18\x75\x9c\x3a\x41\x9d\xa4\x4e\x51\xa7\xa9\x33\xd4\x59\xea\x1c\x75\x9e\xba\x40\x5d\xa4\x2e\x51\x97\xa9\x2b\xd4\x55\xea\x1a\x75\x9d\xba\x41\xdd\xa4\x6e\x51\xb7\xa9\x3b\xd4\x5d\xea\x1e\x75\x9f\x7a\x40\x3d\xa4\x1e\x51\x8f\xa9\x27\xd4\x53\xea\x19\xf5\x9c\x7a\x41\xbd\xa4\x5e\x51\xaf\xa9\x37\xd4\x5b\xea\x1d\xf5\x9e\xfa\x40\x7d\xa4\x3e\x51\x9f\xa9\x2f\xd4\x57\xea\x1b\xf5\x9d\xfa\x41\xfd\xa4\x7e\x51\xbf\xa9\x3f\xd4\x5f\xea\x1f\x9d\x88\x4e\xa0\xff\xa3\x13\xd3\x49\xe8\xa4\x74\x32\x3a\x39\x9d\x82\x4e\x49\xa7\xa2\x53\xd3\x69\xe8\xb4\x74\x3a\x3a\x3d\x9d\x81\xce\x48\x67\xa2\x33\xd3\x59\xe8\xac\x74\x36\x3a\x3b\x9d\x83\xce\x49\xe7\xa2\x73\xd3\x79\xe8\xbc\x74\x3e\x3a\x3f\x5d\x80\x2e\x48\x17\xa2\x0b\xd3\x45\xe8\xa2\x74\x31\xba\x38\x5d\x82\x2e\x49\x97\xa2\x4b\xd3\x65\xe8\xb2\x74\x39\xba\x3c\x5d\x81\xae\x48\x57\xa2\x2b\xd3\x55\xe8\xaa\x74\x35\xba\x3a\x5d\x83\xae\x49\xd7\xa2\x6b\xd3\x75\xe8\xba\x74\x3d\xba\x3e\xdd\x80\x6e\x48\x37\xa2\x1b\xd3\x4d\xe8\xa6\x74\x33\xba\x39\xdd\x82\x6e\x49\xb7\xa2\x5b\xd3\x6d\xe8\xb6\x74\x3b\xba\x3d\xdd\x81\xee\x48\x77\xa2\x3b\xd3\x5d\xe8\xae\x74\x37\xba\x3b\xdd\x83\xee\x49\xf7\xa2\x7b\xd3\x7d\xe8\xbe\x74\x3f\xba\x3f\x3d\x80\x1e\x48\x0f\xa2\x07\xd3\x43\xe8\xa1\xf4\x30\x7a\x38\x3d\x82\x1e\x49\x8f\xa2\x47\xd3\x63\xe8\xb1\xf4\x38\x7a\x3c\x3d\x81\xc6\x68\x9c\x26\x68\x92\xa6\x68\x9a\x66\x68\x96\xe6\x68\x9e\x16\x68\x91\x96\x68\x99\x56\x68\x95\xd6\x68\x9d\x36\x68\x93\xb6\x68\x9b\x76\x68\x97\xf6\x68\x9f\x0e\xe8\x90\x8e\x68\x40\x43\x1a\xd1\x31\x3d\x91\x9e\x44\x4f\xa6\xa7\xd0\x53\xe9\x69\xf4\x74\x7a\x06\x3d\x93\x9e\x45\xcf\xa6\xe7\xd0\x73\xe9\x79\xf4\x7c\x7a\x01\xbd\x90\x5e\x44\x2f\xa6\x97\xd0\x4b\xe9\x65\xf4\x72\x7a\x05\xbd\x92\x5e\x45\xaf\xa6\xd7\xd0\x6b\xe9\x75\xf4\x7a\x7a\x03\xbd\x91\xde\x44\x6f\xa6\xb7\xd0\x5b\xe9\x6d\xf4\x76\x7a\x07\xbd\x93\xde\x45\xef\xa6\xf7\xd0\x7b\xe9\x7d\xf4\x7e\xfa\x00\x7d\x90\x3e\x44\x1f\xa6\x8f\xd0\x47\xe9\x63\xf4\x71\xfa\x04\x7d\x92\x3e\x45\x9f\xa6\xcf\xd0\x67\xe9\x73\xf4\x79\xfa\x02\x7d\x91\xbe\x44\x5f\xa6\xaf\xd0\x57\xe9\x6b\xf4\x75\xfa\x06\x7d\x93\xbe\x45\xdf\xa6\xef\xd0\x77\xe9\x7b\xf4\x7d\xfa\x01\xfd\x90\x7e\x44\x3f\xa6\x9f\xd0\x4f\xe9\x67\xf4\x73\xfa\x05\xfd\x92\x7e\x45\xbf\xa6\xdf\xd0\x6f\xe9\x77\xf4\x7b\xfa\x03\xfd\x91\xfe\x44\x7f\xa6\xbf\xd0\x5f\xe9\x6f\xf4\x77\xfa\x07\xfd\x93\xfe\x45\xff\xa6\xff\xd0\x7f\xe9\x7f\x4c\x22\x26\x81\xf9\x8f\x49\xcc\x24\x61\x92\x32\xc9\x98\xe4\x4c\x0a\x26\x25\x93\x8a\x49\xcd\xa4\x61\xd2\x32\xe9\x98\xf4\x4c\x06\x26\x23\x93\x89\xc9\xcc\x64\x61\xb2\x32\xd9\x98\xec\x4c\x0e\x26\x27\x93\x8b\xc9\xcd\xe4\x61\xf2\x32\xf9\x98\xfc\x4c\x01\xa6\x20\x53\x88\x29\xcc\x14\x61\x8a\x32\xc5\x98\xe2\x4c\x09\xa6\x24\x53\x8a\x29\xcd\x94\x61\xca\x32\xe5\x98\xf2\x4c\x05\xa6\x22\x53\x89\xa9\xcc\x54\x61\xaa\x32\xd5\x98\xea\x4c\x0d\xa6\x26\x53\x8b\xa9\xcd\xd4\x61\xea\x32\xf5\x98\xfa\x4c\x03\xa6\x21\xd3\x88\x69\xcc\x34\x61\x9a\x32\xcd\x98\xe6\x4c\x0b\xa6\x25\xd3\x8a\x69\xcd\xb4\x61\xda\x32\xed\x98\xf6\x4c\x07\xa6\x23\xd3\x89\xe9\xcc\x74\x61\xba\x32\xdd\x98\xee\x4c\x0f\xa6\x27\xd3\x8b\xe9\xcd\xf4\x61\xfa\x32\xfd\x98\xfe\xcc\x00\x66\x20\x33\x88\x19\xcc\x0c\x61\x86\x32\xc3\x98\xe1\xcc\x08\x66\x24\x33\x8a\x19\xcd\x8c\x61\xc6\x32\xe3\x98\xf1\xcc\x04\x06\x63\x70\x86\x60\x48\x86\x62\x68\x86\x61\x58\x86\x63\x78\x46\x60\x44\x46\x62\x64\x46\x61\x54\x46\x63\x74\xc6\x60\x4c\xc6\x62\x6c\xc6\x61\x5c\xc6\x63\x7c\x26\x60\x42\x26\x62\x00\x03\x19\xc4\xc4\xcc\x44\x66\x12\x33\x99\x99\xc2\x4c\x65\xa6\x31\xd3\x99\x19\xcc\x4c\x66\x16\x33\x9b\x99\xc3\xcc\x65\xe6\x31\xf3\x99\x05\xcc\x42\x66\x11\xb3\x98\x59\xc2\x2c\x65\x96\x31\xcb\x99\x15\xcc\x4a\x66\x15\xb3\x9a\x59\xc3\xac\x65\xd6\x31\xeb\x99\x0d\xcc\x46\x66\x13\xb3\x99\xd9\xc2\x6c\x65\xb6\x31\xdb\x99\x1d\xcc\x4e\x66\x17\xb3\x9b\xd9\xc3\xec\x65\xf6\x31\xfb\x99\x03\xcc\x41\xe6\x10\x73\x98\x39\xc2\x1c\x65\x8e\x31\xc7\x99\x13\xcc\x49\xe6\x14\x73\x9a\x39\xc3\x9c\x65\xce\x31\xe7\x99\x0b\xcc\x45\xe6\x12\x73\x99\xb9\xc2\x5c\x65\xae\x31\xd7\x99\x1b\xcc\x4d\xe6\x16\x73\x9b\xb9\xc3\xdc\x65\xee\x31\xf7\x99\x07\xcc\x43\xe6\x11\xf3\x98\x79\xc2\x3c\x65\x9e\x31\xcf\x99\x17\xcc\x4b\xe6\x15\xf3\x9a\x79\xc3\xbc\x65\xde\x31\xef\x99\x0f\xcc\x47\xe6\x13\xf3\x99\xf9\xc2\x7c\x65\xbe\x31\xdf\x99\x1f\xcc\x4f\xe6\x17\xf3\x9b\xf9\xc3\xfc\x65\xfe\xb1\x89\xd8\x04\xf6\x3f\x36\x31\x9b\x84\x4d\xca\x26\x63\x93\xb3\x29\xd8\x94\x6c\x2a\x36\x35\x9b\x86\x4d\xcb\xa6\x63\xd3\xb3\x19\xd8\x8c\x6c\x26\x36\x33\x9b\x85\xcd\xca\x66\x63\xb3\xb3\x39\xd8\x9c\x6c\x2e\x36\x37\x9b\x87\xcd\xcb\xe6\x63\xf3\xb3\x05\xd8\x82\x6c\x21\xb6\x30\x5b\x84\x2d\xca\x16\x63\x8b\xb3\x25\xd8\x92\x6c\x29\xb6\x34\x5b\x86\x2d\xcb\x96\x63\xcb\xb3\x15\xd8\x8a\x6c\x25\xb6\x32\x5b\x85\xad\xca\x56\x63\xab\xb3\x35\xd8\x9a\x6c\x2d\xb6\x36\x5b\x87\xad\xcb\xd6\x63\xeb\xb3\x0d\xd8\x86\x6c\x23\xb6\x31\xdb\x84\x6d\xca\x36\x63\x9b\xb3\x2d\xd8\x96\x6c\x2b\xb6\x35\xdb\x86\x6d\xcb\xb6\x63\xdb\xb3\x1d\xd8\x8e\x6c\x27\xb6\x33\xdb\x85\xed\xca\x76\x63\xbb\xb3\x3d\xd8\x9e\x6c\x2f\xb6\x37\xdb\x87\xed\xcb\xf6\x63\xfb\xb3\x03\xd8\x81\xec\x20\x76\x30\x3b\x84\x1d\xca\x0e\x63\x87\xb3\x23\xd8\x91\xec\x28\x76\x34\x3b\x86\x1d\xcb\x8e\x63\xc7\xb3\x13\x58\x8c\xc5\x59\x82\x25\x59\x8a\xa5\x59\x86\x65\x59\x8e\xe5\x59\x81\x15\x59\x89\x95\x59\x85\x55\x59\x8d\xd5\x59\x83\x35\x59\x8b\xb5\x59\x87\x75\x59\x8f\xf5\xd9\x80\x0d\xd9\x88\x05\x2c\x64\x11\x1b\xb3\x13\xd9\x49\xec\x64\x76\x0a\x3b\x95\x9d\xc6\x4e\x67\x67\xb0\x33\xd9\x59\xec\x6c\x76\x0e\x3b\x97\x9d\xc7\xce\x67\x17\xb0\x0b\xd9\x45\xec\x62\x76\x09\xbb\x94\x5d\xc6\x2e\x67\x57\xb0\x2b\xd9\x55\xec\x6a\x76\x0d\xbb\x96\x5d\xc7\xae\x67\x37\xb0\x1b\xd9\x4d\xec\x66\x76\x0b\xbb\x95\xdd\xc6\x6e\x67\x77\xb0\x3b\xd9\x5d\xec\x6e\x76\x0f\xbb\x97\xdd\xc7\xee\x67\x0f\xb0\x07\xd9\x43\xec\x61\xf6\x08\x7b\x94\x3d\xc6\x1e\x67\x4f\xb0\x27\xd9\x53\xec\x69\xf6\x0c\x7b\x96\x3d\xc7\x9e\x67\x2f\xb0\x17\xd9\x4b\xec\x65\xf6\x0a\x7b\x95\xbd\xc6\x5e\x67\x6f\xb0\x37\xd9\x5b\xec\x6d\xf6\x0e\x7b\x97\xbd\xc7\xde\x67\x1f\xb0\x0f\xd9\x47\xec\x63\xf6\x09\xfb\x94\x7d\xc6\x3e\x67\x5f\xb0\x2f\xd9\x57\xec\x6b\xf6\x0d\xfb\x96\x7d\xc7\xbe\x67\x3f\xb0\x1f\xd9\x4f\xec\x67\xf6\x0b\xfb\x95\xfd\xc6\x7e\x67\x7f\xb0\x3f\xd9\x5f\xec\x6f\xf6\x0f\xfb\x97\xfd\xc7\x25\xe2\x12\xb8\xff\xb8\xc4\x5c\x12\x2e\x29\x97\x8c\x4b\xce\xa5\xe0\x52\x72\xa9\xb8\xd4\x5c\x1a\x2e\x2d\x97\x8e\x4b\xcf\x65\xe0\x32\x72\x99\xb8\xcc\x5c\x16\x2e\x2b\x97\x8d\xcb\xce\xe5\xe0\x72\x72\xb9\xb8\xdc\x5c\x1e\x2e\x2f\x97\x8f\xcb\xcf\x15\xe0\x0a\x72\x85\xb8\xc2\x5c\x11\xae\x28\x57\x8c\x2b\xce\x95\xe0\x4a\x72\xa5\xb8\xd2\x5c\x19\xae\x2c\x57\x8e\x2b\xcf\x55\xe0\x2a\x72\x95\xb8\xca\x5c\x15\xae\x2a\x57\x8d\xab\xce\xd5\xe0\x6a\x72\xb5\xb8\xda\x5c\x1d\xae\x2e\x57\x8f\xab\xcf\x35\xe0\x1a\x72\x8d\xb8\xc6\x5c\x13\xae\x29\xd7\x8c\x6b\xce\xb5\xe0\x5a\x72\xad\xb8\xd6\x5c\x1b\xae\x2d\xd7\x8e\x6b\xcf\x75\xe0\x3a\x72\x9d\xb8\xce\x5c\x17\xae\x2b\xd7\x8d\xeb\xce\xf5\xe0\x7a\x72\xbd\xb8\xde\x5c\x1f\xae\x2f\xd7\x8f\xeb\xcf\x0d\xe0\x06\x72\x83\xb8\xc1\xdc\x10\x6e\x28\x37\x8c\x1b\xce\x8d\xe0\x46\x72\xa3\xb8\xd1\xdc\x18\x6e\x2c\x37\x8e\x1b\xcf\x4d\xe0\x30\x0e\xe7\x08\x8e\xe4\x28\x8e\xe6\x18\x8e\xe5\x38\x8e\xe7\x04\x4e\xe4\x24\x4e\xe6\x14\x4e\xe5\x34\x4e\xe7\x0c\xce\xe4\x2c\xce\xe6\x1c\xce\xe5\x3c\xce\xe7\x02\x2e\xe4\x22\x0e\x70\x90\x43\x5c\xcc\x4d\xe4\x26\x71\x93\xb9\x29\xdc\x54\x6e\x1a\x37\x9d\x9b\xc1\xcd\xe4\x66\x71\xb3\xb9\x39\xdc\x5c\x6e\x1e\x37\x9f\x5b\xc0\x2d\xe4\x16\x71\x8b\xb9\x25\xdc\x52\x6e\x19\xb7\x9c\x5b\xc1\xad\xe4\x56\x71\xab\xb9\x35\xdc\x5a\x6e\x1d\xb7\x9e\xdb\xc0\x6d\xe4\x36\x71\x9b\xb9\x2d\xdc\x56\x6e\x1b\xb7\x9d\xdb\xc1\xed\xe4\x76\x71\xbb\xb9\x3d\xdc\x5e\x6e\x1f\xb7\x9f\x3b\xc0\x1d\xe4\x0e\x71\x87\xb9\x23\xdc\x51\xee\x18\x77\x9c\x3b\xc1\x9d\xe4\x4e\x71\xa7\xb9\x33\xdc\x59\xee\x1c\x77\x9e\xbb\xc0\x5d\xe4\x2e\x71\x97\xb9\x2b\xdc\x55\xee\x1a\x77\x9d\xbb\xc1\xdd\xe4\x6e\x71\xb7\xb9\x3b\xdc\x5d\xee\x1e\x77\x9f\x7b\xc0\x3d\xe4\x1e\x71\x8f\xb9\x27\xdc\x53\xee\x19\xf7\x9c\x7b\xc1\xbd\xe4\x5e\x71\xaf\xb9\x37\xdc\x5b\xee\x1d\xf7\x9e\xfb\xc0\x7d\xe4\x3e\x71\x9f\xb9\x2f\xdc\x57\xee\x1b\xf7\x9d\xfb\xc1\xfd\xe4\x7e\x71\xbf\xb9\x3f\xdc\x5f\xee\x1f\x9f\x88\x4f\xe0\xff\xe3\x13\xf3\x49\xf8\xa4\x7c\x32\x3e\x39\x9f\x82\x4f\xc9\xa7\xe2\x53\xf3\x69\xf8\xb4\x7c\x3a\x3e\x3d\x9f\x81\xcf\xc8\x67\xe2\x33\xf3\x59\xf8\xac\x7c\x36\x3e\x3b\x9f\x83\xcf\xc9\xe7\xe2\x73\xf3\x79\xf8\xbc\x7c\x3e\x3e\x3f\x5f\x80\x2f\xc8\x17\xe2\x0b\xf3\x45\xf8\xa2\x7c\x31\xbe\x38\x5f\x82\x2f\xc9\x97\xe2\x4b\xf3\x65\xf8\xb2\x7c\x39\xbe\x3c\x5f\x81\xaf\xc8\x57\xe2\x2b\xf3\x55\xf8\xaa\x7c\x35\xbe\x3a\x5f\x83\xaf\xc9\xd7\xe2\x6b\xf3\x75\xf8\xba\x7c\x3d\xbe\x3e\xdf\x80\x6f\xc8\x37\xe2\x1b\xf3\x4d\xf8\xa6\x7c\x33\xbe\x39\xdf\x82\x6f\xc9\xb7\xe2\x5b\xf3\x6d\xf8\xb6\x7c\x3b\xbe\x3d\xdf\x81\xef\xc8\x77\xe2\x3b\xf3\x5d\xf8\xae\x7c\x37\xbe\x3b\xdf\x83\xef\xc9\xf7\xe2\x7b\xf3\x7d\xf8\xbe\x7c\x3f\xbe\x3f\x3f\x80\x1f\xc8\x0f\xe2\x07\xf3\x43\xf8\xa1\xfc\x30\x7e\x38\x3f\x82\x1f\xc9\x8f\xe2\x47\xf3\x63\xf8\xb1\xfc\x38\x7e\x3c\x3f\x81\xc7\x78\x9c\x27\x78\x92\xa7\x78\x9a\x67\x78\x96\xe7\x78\x9e\x17\x78\x91\x97\x78\x99\x57\x78\x95\xd7\x78\x9d\x37\x78\x93\xb7\x78\x9b\x77\x78\x97\xf7\x78\x9f\x0f\xf8\x90\x8f\x78\xc0\x43\x1e\xf1\x31\x3f\x91\x9f\xc4\x4f\xe6\xa7\xf0\x53\xf9\x69\xfc\x74\x7e\x06\x3f\x93\x9f\xc5\xcf\xe6\xe7\xf0\x73\xf9\x79\xfc\x7c\x7e\x01\xbf\x90\x5f\xc4\x2f\xe6\x97\xf0\x4b\xf9\x65\xfc\x72\x7e\x05\xbf\x92\x5f\xc5\xaf\xe6\xd7\xf0\x6b\xf9\x75\xfc\x7a\x7e\x03\xbf\x91\xdf\xc4\x6f\xe6\xb7\xf0\x5b\xf9\x6d\xfc\x76\x7e\x07\xbf\x93\xdf\xc5\xef\xe6\xf7\xf0\x7b\xf9\x7d\xfc\x7e\xfe\x00\x7f\x90\x3f\xc4\x1f\xe6\x8f\xf0\x47\xf9\x63\xfc\x71\xfe\x04\x7f\x92\x3f\xc5\x9f\xe6\xcf\xf0\x67\xf9\x73\xfc\x79\xfe\x02\x7f\x91\xbf\xc4\x5f\xe6\xaf\xf0\x57\xf9\x6b\xfc\x75\xfe\x06\x7f\x93\xbf\xc5\xdf\xe6\xef\xf0\x77\xf9\x7b\xfc\x7d\xfe\x01\xff\x90\x7f\xc4\x3f\xe6\x9f\xf0\x4f\xf9\x67\xfc\x73\xfe\x05\xff\x92\x7f\xc5\xbf\xe6\xdf\xf0\x6f\xf9\x77\xfc\x7b\xfe\x03\xff\x91\xff\xc4\x7f\xe6\xbf\xf0\x5f\xf9\x6f\xfc\x77\xfe\x07\xff\x93\xff\xc5\xff\xe6\xff\xf0\x7f\xf9\x7f\x42\x22\x21\x41\xf8\x4f\x48\x2c\x24\x11\x92\x0a\xc9\x84\xe4\x42\x0a\x21\xa5\x90\x4a\x48\x2d\xa4\x11\xd2\x0a\xe9\x84\xf4\x42\x06\x21\xa3\x90\x49\xc8\x2c\x64\x11\xb2\x0a\xd9\x84\xec\x42\x0e\x21\xa7\x90\x4b\xc8\x2d\xe4\x11\xf2\x0a\xf9\x84\xfc\x42\x01\xa1\xa0\x50\x48\x28\x2c\x14\x11\x8a\x0a\xc5\x84\xe2\x42\x09\xa1\xa4\x50\x4a\x28\x2d\x94\x11\xca\x0a\xe5\x84\xf2\x42\x05\xa1\xa2\x50\x49\xa8\x2c\x54\x11\xaa\x0a\xd5\x84\xea\x42\x0d\xa1\xa6\x50\x4b\xa8\x2d\xd4\x11\xea\x0a\xf5\x84\xfa\x42\x03\xa1\xa1\xd0\x48\x68\x2c\x34\x11\x9a\x0a\xcd\x84\xe6\x42\x0b\xa1\xa5\xd0\x4a\x68\x2d\xb4\x11\xda\x0a\xed\x84\xf6\x42\x07\xa1\xa3\xd0\x49\xe8\x2c\x74\x11\xba\x0a\xdd\x84\xee\x42\x0f\xa1\xa7\xd0\x4b\xe8\x2d\xf4\x11\xfa\x0a\xfd\x84\xfe\xc2\x00\x61\xa0\x30\x48\x18\x2c\x0c\x11\x86\x0a\xc3\x84\xe1\xc2\x08\x61\xa4\x30\x4a\x18\x2d\x8c\x11\xc6\x0a\xe3\x84\xf1\xc2\x04\x01\x13\x70\x81\x10\x48\x81\x12\x68\x81\x11\x58\x81\x13\x78\x41\x10\x44\x41\x12\x64\x41\x11\x54\x41\x13\x74\xc1\x10\x4c\xc1\x12\x6c\xc1\x11\x5c\xc1\x13\x7c\x21\x10\x42\x21\x12\x80\x00\x05\x24\xc4\xc2\x44\x61\x92\x30\x59\x98\x22\x4c\x15\xa6\x09\xd3\x85\x19\xc2\x4c\x61\x96\x30\x5b\x98\x23\xcc\x15\xe6\x09\xf3\x85\x05\xc2\x42\x61\x91\xb0\x58\x58\x22\x2c\x15\x96\x09\xcb\x85\x15\xc2\x4a\x61\x95\xb0\x5a\x58\x23\xac\x15\xd6\x09\xeb\x85\x0d\xc2\x46\x61\x93\xb0\x59\xd8\x22\x6c\x15\xb6\x09\xdb\x85\x1d\xc2\x4e\x61\x97\xb0\x5b\xd8\x23\xec\x15\xf6\x09\xfb\x85\x03\xc2\x41\xe1\x90\x70\x58\x38\x22\x1c\x15\x8e\x09\xc7\x85\x13\xc2\x49\xe1\x94\x70\x5a\x38\x23\x9c\x15\xce\x09\xe7\x85\x0b\xc2\x45\xe1\x92\x70\x59\xb8\x22\x5c\x15\xae\x09\xd7\x85\x1b\xc2\x4d\xe1\x96\x70\x5b\xb8\x23\xdc\x15\xee\x09\xf7\x85\x07\xc2\x43\xe1\x91\xf0\x58\x78\x22\x3c\x15\x9e\x09\xcf\x85\x17\xc2\x4b\xe1\x95\xf0\x5a\x78\x23\xbc\x15\xde\x09\xef\x85\x0f\xc2\x47\xe1\x93\xf0\x59\xf8\x22\x7c\x15\xbe\x09\xdf\x85\x1f\xc2\x4f\xe1\x97\xf0\x5b\xf8\x23\xfc\x15\xfe\x89\x89\xc4\x04\xf1\x3f\x31\xb1\x98\x44\x4c\x2a\x26\x13\x93\x8b\x29\xc4\x94\x62\x2a\x31\xb5\x98\x46\x4c\x2b\xa6\x13\xd3\x8b\x19\xc4\x8c\x62\x26\x31\xb3\x98\x45\xcc\x2a\x66\x13\xb3\x8b\x39\xc4\x9c\x62\x2e\x31\xb7\x98\x47\xcc\x2b\xe6\x13\xf3\x8b\x05\xc4\x82\x62\x21\xb1\xb0\x58\x44\x2c\x2a\x16\x13\x8b\x8b\x25\xc4\x92\x62\x29\xb1\xb4\x58\x46\x2c\x2b\x96\x13\xcb\x8b\x15\xc4\x8a\x62\x25\xb1\xb2\x58\x45\xac\x2a\x56\x13\xab\x8b\x35\xc4\x9a\x62\x2d\xb1\xb6\x58\x47\xac\x2b\xd6\x13\xeb\x8b\x0d\xc4\x86\x62\x23\xb1\xb1\xd8\x44\x6c\x2a\x36\x13\x9b\x8b\x2d\xc4\x96\x62\x2b\xb1\xb5\xd8\x46\x6c\x2b\xb6\x13\xdb\x8b\x1d\xc4\x8e\x62\x27\xb1\xb3\xd8\x45\xec\x2a\x76\x13\xbb\x8b\x3d\xc4\x9e\x62\x2f\xb1\xb7\xd8\x47\xec\x2b\xf6\x13\xfb\x8b\x03\xc4\x81\xe2\x20\x71\xb0\x38\x44\x1c\x2a\x0e\x13\x87\x8b\x23\xc4\x91\xe2\x28\x71\xb4\x38\x46\x1c\x2b\x8e\x13\xc7\x8b\x13\x44\x4c\xc4\x45\x42\x24\x45\x4a\xa4\x45\x46\x64\x45\x4e\xe4\x45\x41\x14\x45\x49\x94\x45\x45\x54\x45\x4d\xd4\x45\x43\x34\x45\x4b\xb4\x45\x47\x74\x45\x4f\xf4\xc5\x40\x0c\xc5\x48\x04\x22\x14\x91\x18\x8b\x13\xc5\x49\xe2\x64\x71\x8a\x38\x55\x9c\x26\x4e\x17\x67\x88\x33\xc5\x59\xe2\x6c\x71\x8e\x38\x57\x9c\x27\xce\x17\x17\x88\x0b\xc5\x45\xe2\x62\x71\x89\xb8\x54\x5c\x26\x2e\x17\x57\x88\x2b\xc5\x55\xe2\x6a\x71\x8d\xb8\x56\x5c\x27\xae\x17\x37\x88\x1b\xc5\x4d\xe2\x66\x71\x8b\xb8\x55\xdc\x26\x6e\x17\x77\x88\x3b\xc5\x5d\xe2\x6e\x71\x8f\xb8\x57\xdc\x27\xee\x17\x0f\x88\x07\xc5\x43\xe2\x61\xf1\x88\x78\x54\x3c\x26\x1e\x17\x4f\x88\x27\xc5\x53\xe2\x69\xf1\x8c\x78\x56\x3c\x27\x9e\x17\x2f\x88\x17\xc5\x4b\xe2\x65\xf1\x8a\x78\x55\xbc\x26\x5e\x17\x6f\x88\x37\xc5\x5b\xe2\x6d\xf1\x8e\x78\x57\xbc\x27\xde\x17\x1f\x88\x0f\xc5\x47\xe2\x63\xf1\x89\xf8\x54\x7c\x26\x3e\x17\x5f\x88\x2f\xc5\x57\xe2\x6b\xf1\x8d\xf8\x56\x7c\x27\xbe\x17\x3f\x88\x1f\xc5\x4f\xe2\x67\xf1\x8b\xf8\x55\xfc\x26\x7e\x17\x7f\x88\x3f\xc5\x5f\xe2\x6f\xf1\x8f\xf8\x57\xfc\x27\x25\x92\x12\xa4\xff\xa4\xc4\x52\x12\x29\xa9\x94\x4c\x4a\x2e\xa5\x90\x52\x4a\xa9\xa4\xd4\x52\x1a\x29\xad\x94\x4e\x4a\x2f\x65\x90\x32\x4a\x99\xa4\xcc\x52\x16\x29\xab\x94\x4d\xca\x2e\xe5\x90\x72\x4a\xb9\xa4\xdc\x52\x1e\x29\xaf\x94\x4f\xca\x2f\x15\x90\x0a\x4a\x85\xa4\xc2\x52\x11\xa9\xa8\x54\x4c\x2a\x2e\x95\x90\x4a\x4a\xa5\xa4\xd2\x52\x19\xa9\xac\x54\x4e\x2a\x2f\x55\x90\x2a\x4a\x95\xa4\xca\x52\x15\xa9\xaa\x54\x4d\xaa\x2e\xd5\x90\x6a\x4a\xb5\xa4\xda\x52\x1d\xa9\xae\x54\x4f\xaa\x2f\x35\x90\x1a\x4a\x8d\xa4\xc6\x52\x13\xa9\xa9\xd4\x4c\x6a\x2e\xb5\x90\x5a\x4a\xad\xa4\xd6\x52\x1b\xa9\xad\xd4\x4e\x6a\x2f\x75\x90\x3a\x4a\x9d\xa4\xce\x52\x17\xa9\xab\xd4\x4d\xea\x2e\xf5\x90\x7a\x4a\xbd\xa4\xde\x52\x1f\xa9\xaf\xd4\x4f\xea\x2f\x0d\x90\x06\x4a\x83\xa4\xc1\xd2\x10\x69\xa8\x34\x4c\x1a\x2e\x8d\x90\x46\x4a\xa3\xa4\xd1\xd2\x18\x69\xac\x34\x4e\x1a\x2f\x4d\x90\x30\x09\x97\x08\x89\x94\x28\x89\x96\x18\x89\x95\x38\x89\x97\x04\x49\x94\x24\x49\x96\x14\x49\x95\x34\x49\x97\x0c\xc9\x94\x2c\xc9\x96\x1c\xc9\x95\x3c\xc9\x97\x02\x29\x94\x22\x09\x48\x50\x42\x52\x2c\x4d\x94\x26\x49\x93\xa5\x29\xd2\x54\x69\x9a\x34\x5d\x9a\x21\xcd\x94\x66\x49\xb3\xa5\x39\xd2\x5c\x69\x9e\x34\x5f\x5a\x20\x2d\x94\x16\x49\x8b\xa5\x25\xd2\x52\x69\x99\xb4\x5c\x5a\x21\xad\x94\x56\x49\xab\xa5\x35\xd2\x5a\x69\x9d\xb4\x5e\xda\x20\x6d\x94\x36\x49\x9b\xa5\x2d\xd2\x56\x69\x9b\xb4\x5d\xda\x21\xed\x94\x76\x49\xbb\xa5\x3d\xd2\x5e\x69\x9f\xb4\x5f\x3a\x20\x1d\x94\x0e\x49\x87\xa5\x23\xd2\x51\xe9\x98\x74\x5c\x3a\x21\x9d\x94\x4e\x49\xa7\xa5\x33\xd2\x59\xe9\x9c\x74\x5e\xba\x20\x5d\x94\x2e\x49\x97\xa5\x2b\xd2\x55\xe9\x9a\x74\x5d\xba\x21\xdd\x94\x6e\x49\xb7\xa5\x3b\xd2\x5d\xe9\x9e\x74\x5f\x7a\x20\x3d\x94\x1e\x49\x8f\xa5\x27\xd2\x53\xe9\x99\xf4\x5c\x7a\x21\xbd\x94\x5e\x49\xaf\xa5\x37\xd2\x5b\xe9\x9d\xf4\x5e\xfa\x20\x7d\x94\x3e\x49\x9f\xa5\x2f\xd2\x57\xe9\x9b\xf4\x5d\xfa\x21\xfd\x94\x7e\x49\xbf\xa5\x3f\xd2\x5f\xe9\x9f\x9c\x48\x4e\x90\xff\x93\x13\xcb\x49\xe4\xa4\x72\x32\x39\xb9\x9c\x42\x4e\x29\xa7\x92\x53\xcb\x69\xe4\xb4\x72\x3a\x39\xbd\x9c\x41\xce\x28\x67\x92\x33\xcb\x59\xe4\xac\x72\x36\x39\xbb\x9c\x43\xce\x29\xe7\x92\x73\xcb\x79\xe4\xbc\x72\x3e\x39\xbf\x5c\x40\x2e\x28\x17\x92\x0b\xcb\x45\xe4\xa2\x72\x31\xb9\xb8\x5c\x42\x2e\x29\x97\x92\x4b\xcb\x65\xe4\xb2\x72\x39\xb9\xbc\x5c\x41\xae\x28\x57\x92\x2b\xcb\x55\xe4\xaa\x72\x35\xb9\xba\x5c\x43\xae\x29\xd7\x92\x6b\xcb\x75\xe4\xba\x72\x3d\xb9\xbe\xdc\x40\x6e\x28\x37\x92\x1b\xcb\x4d\xe4\xa6\x72\x33\xb9\xb9\xdc\x42\x6e\x29\xb7\x92\x5b\xcb\x6d\xe4\xb6\x72\x3b\xb9\xbd\xdc\x41\xee\x28\x77\x92\x3b\xcb\x5d\xe4\xae\x72\x37\xb9\xbb\xdc\x43\xee\x29\xf7\x92\x7b\xcb\x7d\xe4\xbe\x72\x3f\xb9\xbf\x3c\x40\x1e\x28\x0f\x92\x07\xcb\x43\xe4\xa1\xf2\x30\x79\xb8\x3c\x42\x1e\x29\x8f\x92\x47\xcb\x63\xe4\xb1\xf2\x38\x79\xbc\x3c\x41\xc6\x64\x5c\x26\x64\x52\xa6\x64\x5a\x66\x64\x56\xe6\x64\x5e\x16\x64\x51\x96\x64\x59\x56\x64\x55\xd6\x64\x5d\x36\x64\x53\xb6\x64\x5b\x76\x64\x57\xf6\x64\x5f\x0e\xe4\x50\x8e\x64\x20\x43\x19\xc9\xb1\x3c\x51\x9e\x24\x4f\x96\xa7\xc8\x53\xe5\x69\xf2\x74\x79\x86\x3c\x53\x9e\x25\xcf\x96\xe7\xc8\x73\xe5\x79\xf2\x7c\x79\x81\xbc\x50\x5e\x24\x2f\x96\x97\xc8\x4b\xe5\x65\xf2\x72\x79\x85\xbc\x52\x5e\x25\xaf\x96\xd7\xc8\x6b\xe5\x75\xf2\x7a\x79\x83\xbc\x51\xde\x24\x6f\x96\xb7\xc8\x5b\xe5\x6d\xf2\x76\x79\x87\xbc\x53\xde\x25\xef\x96\xf7\xc8\x7b\xe5\x7d\xf2\x7e\xf9\x80\x7c\x50\x3e\x24\x1f\x96\x8f\xc8\x47\xe5\x63\xf2\x71\xf9\x84\x7c\x52\x3e\x25\x9f\x96\xcf\xc8\x67\xe5\x73\xf2\x79\xf9\x82\x7c\x51\xbe\x24\x5f\x96\xaf\xc8\x57\xe5\x6b\xf2\x75\xf9\x86\x7c\x53\xbe\x25\xdf\x96\xef\xc8\x77\xe5\x7b\xf2\x7d\xf9\x81\xfc\x50\x7e\x24\x3f\x96\x9f\xc8\x4f\xe5\x67\xf2\x73\xf9\x85\xfc\x52\x7e\x25\xbf\x96\xdf\xc8\x6f\xe5\x77\xf2\x7b\xf9\x83\xfc\x51\xfe\x24\x7f\x96\xbf\xc8\x5f\xe5\x6f\xf2\x77\xf9\x87\xfc\x53\xfe\x25\xff\x96\xff\xc8\x7f\xe5\x7f\x4a\x22\x25\x41\xf9\x4f\x49\xac\x24\x51\x92\x2a\xc9\x94\xe4\x4a\x0a\x25\xa5\x92\x4a\x49\xad\xa4\x51\xd2\x2a\xe9\x94\xf4\x4a\x06\x25\xa3\x92\x49\xc9\xac\x64\x51\xb2\x2a\xd9\x94\xec\x4a\x0e\x25\xa7\x92\x4b\xc9\xad\xe4\x51\xf2\x2a\xf9\x94\xfc\x4a\x01\xa5\xa0\x52\x48\x29\xac\x14\x51\x8a\x2a\xc5\x94\xe2\x4a\x09\xa5\xa4\x52\x4a\x29\xad\x94\x51\xca\x2a\xe5\x94\xf2\x4a\x05\xa5\xa2\x52\x49\xa9\xac\x54\x51\xaa\x2a\xd5\x94\xea\x4a\x0d\xa5\xa6\x52\x4b\xa9\xad\xd4\x51\xea\x2a\xf5\x94\xfa\x4a\x03\xa5\xa1\xd2\x48\x69\xac\x34\x51\x9a\x2a\xcd\x94\xe6\x4a\x0b\xa5\xa5\xd2\x4a\x69\xad\xb4\x51\xda\x2a\xed\x94\xf6\x4a\x07\xa5\xa3\xd2\x49\xe9\xac\x74\x51\xba\x2a\xdd\x94\xee\x4a\x0f\xa5\xa7\xd2\x4b\xe9\xad\xf4\x51\xfa\x2a\xfd\x94\xfe\xca\x00\x65\xa0\x32\x48\x19\xac\x0c\x51\x86\x2a\xc3\x94\xe1\xca\x08\x65\xa4\x32\x4a\x19\xad\x8c\x51\xc6\x2a\xe3\x94\xf1\xca\x04\x05\x53\x70\x85\x50\x48\x85\x52\x68\x85\x51\x58\x85\x53\x78\x45\x50\x44\x45\x52\x64\x45\x51\x54\x45\x53\x74\xc5\x50\x4c\xc5\x52\x6c\xc5\x51\x5c\xc5\x53\x7c\x25\x50\x42\x25\x52\x80\x02\x15\xa4\xc4\xca\x44\x65\x92\x32\x59\x99\xa2\x4c\x55\xa6\x29\xd3\x95\x19\xca\x4c\x65\x96\x32\x5b\x99\xa3\xcc\x55\xe6\x29\xf3\x95\x05\xca\x42\x65\x91\xb2\x58\x59\xa2\x2c\x55\x96\x29\xcb\x95\x15\xca\x4a\x65\x95\xb2\x5a\x59\xa3\xac\x55\xd6\x29\xeb\x95\x0d\xca\x46\x65\x93\xb2\x59\xd9\xa2\x6c\x55\xb6\x29\xdb\x95\x1d\xca\x4e\x65\x97\xb2\x5b\xd9\xa3\xec\x55\xf6\x29\xfb\x95\x03\xca\x41\xe5\x90\x72\x58\x39\xa2\x1c\x55\x8e\x29\xc7\x95\x13\xca\x49\xe5\x94\x72\x5a\x39\xa3\x9c\x55\xce\x29\xe7\x95\x0b\xca\x45\xe5\x92\x72\x59\xb9\xa2\x5c\x55\xae\x29\xd7\x95\x1b\xca\x4d\xe5\x96\x72\x5b\xb9\xa3\xdc\x55\xee\x29\xf7\x95\x07\xca\x43\xe5\x91\xf2\x58\x79\xa2\x3c\x55\x9e\x29\xcf\x95\x17\xca\x4b\xe5\x95\xf2\x5a\x79\xa3\xbc\x55\xde\x29\xef\x95\x0f\xca\x47\xe5\x93\xf2\x59\xf9\xa2\x7c\x55\xbe\x29\xdf\x95\x1f\xca\x4f\xe5\x97\xf2\x5b\xf9\xa3\xfc\x55\xfe\xa9\x89\xd4\x04\xf5\x3f\x35\xb1\x9a\x44\x4d\xaa\x26\x53\x93\xab\x29\xd4\x94\x6a\x2a\x35\xb5\x9a\x46\x4d\xab\xa6\x53\xd3\xab\x19\xd4\x8c\x6a\x26\x35\xb3\x9a\x45\xcd\xaa\x66\x53\xb3\xab\x39\xd4\x9c\x6a\x2e\x35\xb7\x9a\x47\xcd\xab\xe6\x53\xf3\xab\x05\xd4\x82\x6a\x21\xb5\xb0\x5a\x44\x2d\xaa\x16\x53\x8b\xab\x25\xd4\x92\x6a\x29\xb5\xb4\x5a\x46\x2d\xab\x96\x53\xcb\xab\x15\xd4\x8a\x6a\x25\xb5\xb2\x5a\x45\xad\xaa\x56\x53\xab\xab\x35\xd4\x9a\x6a\x2d\xb5\xb6\x5a\x47\xad\xab\xd6\x53\xeb\xab\x0d\xd4\x86\x6a\x23\xb5\xb1\xda\x44\x6d\xaa\x36\x53\x9b\xab\x2d\xd4\x96\x6a\x2b\xb5\xb5\xda\x46\x6d\xab\xb6\x53\xdb\xab\x1d\xd4\x8e\x6a\x27\xb5\xb3\xda\x45\xed\xaa\x76\x53\xbb\xab\x3d\xd4\x9e\x6a\x2f\xb5\xb7\xda\x47\xed\xab\xf6\x53\xfb\xab\x03\xd4\x81\xea\x20\x75\xb0\x3a\x44\x1d\xaa\x0e\x53\x87\xab\x23\xd4\x91\xea\x28\x75\xb4\x3a\x46\x1d\xab\x8e\x53\xc7\xab\x13\x54\x4c\xc5\x55\x42\x25\x55\x4a\xa5\x55\x46\x65\x55\x4e\xe5\x55\x41\x15\x55\x49\x95\x55\x45\x55\x55\x4d\xd5\x55\x43\x35\x55\x4b\xb5\x55\x47\x75\x55\x4f\xf5\xd5\x40\x0d\xd5\x48\x05\x2a\x54\x91\x1a\xab\x13\xd5\x49\xea\x64\x75\x8a\x3a\x55\x9d\xa6\x4e\x57\x67\xa8\x33\xd5\x59\xea\x6c\x75\x8e\x3a\x57\x9d\xa7\xce\x57\x17\xa8\x0b\xd5\x45\xea\x62\x75\x89\xba\x54\x5d\xa6\x2e\x57\x57\xa8\x2b\xd5\x55\xea\x6a\x75\x8d\xba\x56\x5d\xa7\xae\x57\x37\xa8\x1b\xd5\x4d\xea\x66\x75\x8b\xba\x55\xdd\xa6\x6e\x57\x77\xa8\x3b\xd5\x5d\xea\x6e\x75\x8f\xba\x57\xdd\xa7\xee\x57\x0f\xa8\x07\xd5\x43\xea\x61\xf5\x88\x7a\x54\x3d\xa6\x1e\x57\x4f\xa8\x27\xd5\x53\xea\x69\xf5\x8c\x7a\x56\x3d\xa7\x9e\x57\x2f\xa8\x17\xd5\x4b\xea\x65\xf5\x8a\x7a\x55\xbd\xa6\x5e\x57\x6f\xa8\x37\xd5\x5b\xea\x6d\xf5\x8e\x7a\x57\xbd\xa7\xde\x57\x1f\xa8\x0f\xd5\x47\xea\x63\xf5\x89\xfa\x54\x7d\xa6\x3e\x57\x5f\xa8\x2f\xd5\x57\xea\x6b\xf5\x8d\xfa\x56\x7d\xa7\xbe\x57\x3f\xa8\x1f\xd5\x4f\xea\x67\xf5\x8b\xfa\x55\xfd\xa6\x7e\x57\x7f\xa8\x3f\xd5\x5f\xea\x6f\xf5\x8f\xfa\x57\xfd\xa7\x25\xd2\x12\xb4\xff\xb4\xc4\x5a\x12\x2d\xa9\x96\x4c\x4b\xae\xa5\xd0\x52\x6a\xa9\xb4\xd4\x5a\x1a\x2d\xad\x96\x4e\x4b\xaf\x65\xd0\x32\x6a\x99\xb4\xcc\x5a\x16\x2d\xab\x96\x4d\xcb\xae\xe5\xd0\x72\x6a\xb9\xb4\xdc\x5a\x1e\x2d\xaf\x96\x4f\xcb\xaf\x15\xd0\x0a\x6a\x85\xb4\xc2\x5a\x11\xad\xa8\x56\x4c\x2b\xae\x95\xd0\x4a\x6a\xa5\xb4\xd2\x5a\x19\xad\xac\x56\x4e\x2b\xaf\x55\xd0\x2a\x6a\x95\xb4\xca\x5a\x15\xad\xaa\x56\x4d\xab\xae\xd5\xd0\x6a\x6a\xb5\xb4\xda\x5a\x1d\xad\xae\x56\x4f\xab\xaf\x35\xd0\x1a\x6a\x8d\xb4\xc6\x5a\x13\xad\xa9\xd6\x4c\x6b\xae\xb5\xd0\x5a\x6a\xad\xb4\xd6\x5a\x1b\xad\xad\xd6\x4e\x6b\xaf\x75\xd0\x3a\x6a\x9d\xb4\xce\x5a\x17\xad\xab\xd6\x4d\xeb\xae\xf5\xd0\x7a\x6a\xbd\xb4\xde\x5a\x1f\xad\xaf\xd6\x4f\xeb\xaf\x0d\xd0\x06\x6a\x83\xb4\xc1\xda\x10\x6d\xa8\x36\x4c\x1b\xae\x8d\xd0\x46\x6a\xa3\xb4\xd1\xda\x18\x6d\xac\x36\x4e\x1b\xaf\x4d\xd0\x30\x0d\xd7\x08\x8d\xd4\x28\x8d\xd6\x18\x8d\xd5\x38\x8d\xd7\x04\x4d\xd4\x24\x4d\xd6\x14\x4d\xd5\x34\x4d\xd7\x0c\xcd\xd4\x2c\xcd\xd6\x1c\xcd\xd5\x3c\xcd\xd7\x02\x2d\xd4\x22\x0d\x68\x50\x43\x5a\xac\x4d\xd4\x26\x69\x93\xb5\x29\xda\x54\x6d\x9a\x36\x5d\x9b\xa1\xcd\xd4\x66\x69\xb3\xb5\x39\xda\x5c\x6d\x9e\x36\x5f\x5b\xa0\x2d\xd4\x16\x69\x8b\xb5\x25\xda\x52\x6d\x99\xb6\x5c\x5b\xa1\xad\xd4\x56\x69\xab\xb5\x35\xda\x5a\x6d\x9d\xb6\x5e\xdb\xa0\x6d\xd4\x36\x69\x9b\xb5\x2d\xda\x56\x6d\x9b\xb6\x5d\xdb\xa1\xed\xd4\x76\x69\xbb\xb5\x3d\xda\x5e\x6d\x9f\xb6\x5f\x3b\xa0\x1d\xd4\x0e\x69\x87\xb5\x23\xda\x51\xed\x98\x76\x5c\x3b\xa1\x9d\xd4\x4e\x69\xa7\xb5\x33\xda\x59\xed\x9c\x76\x5e\xbb\xa0\x5d\xd4\x2e\x69\x97\xb5\x2b\xda\x55\xed\x9a\x76\x5d\xbb\xa1\xdd\xd4\x6e\x69\xb7\xb5\x3b\xda\x5d\xed\x9e\x76\x5f\x7b\xa0\x3d\xd4\x1e\x69\x8f\xb5\x27\xda\x53\xed\x99\xf6\x5c\x7b\xa1\xbd\xd4\x5e\x69\xaf\xb5\x37\xda\x5b\xed\x9d\xf6\x5e\xfb\xa0\x7d\xd4\x3e\x69\x9f\xb5\x2f\xda\x57\xed\x9b\xf6\x5d\xfb\xa1\xfd\xd4\x7e\x69\xbf\xb5\x3f\xda\x5f\xed\x9f\x9e\x48\x4f\xd0\xff\xd3\x13\xeb\x49\xf4\xa4\x7a\x32\x3d\xb9\x9e\x42\x4f\xa9\xa7\xd2\x53\xeb\x69\xf4\xb4\x7a\x3a\x3d\xbd\x9e\x41\xcf\xa8\x67\xd2\x33\xeb\x59\xf4\xac\x7a\x36\x3d\xbb\x9e\x43\xcf\xa9\xe7\xd2\x73\xeb\x79\xf4\xbc\x7a\x3e\x3d\xbf\x5e\x40\x2f\xa8\x17\xd2\x0b\xeb\x45\xf4\xa2\x7a\x31\xbd\xb8\x5e\x42\x2f\xa9\x97\xd2\x4b\xeb\x65\xf4\xb2\x7a\x39\xbd\xbc\x5e\x41\xaf\xa8\x57\xd2\x2b\xeb\x55\xf4\xaa\x7a\x35\xbd\xba\x5e\x43\xaf\xa9\xd7\xd2\x6b\xeb\x75\xf4\xba\x7a\x3d\xbd\xbe\xde\x40\x6f\xa8\x37\xd2\x1b\xeb\x4d\xf4\xa6\x7a\x33\xbd\xb9\xde\x42\x6f\xa9\xb7\xd2\x5b\xeb\x6d\xf4\xb6\x7a\x3b\xbd\xbd\xde\x41\xef\xa8\x77\xd2\x3b\xeb\x5d\xf4\xae\x7a\x37\xbd\xbb\xde\x43\xef\xa9\xf7\xd2\x7b\xeb\x7d\xf4\xbe\x7a\x3f\xbd\xbf\x3e\x40\x1f\xa8\x0f\xd2\x07\xeb\x43\xf4\xa1\xfa\x30\x7d\xb8\x3e\x42\x1f\xa9\x8f\xd2\x47\xeb\x63\xf4\xb1\xfa\x38\x7d\xbc\x3e\x41\xc7\x74\x5c\x27\x74\x52\xa7\x74\x5a\x67\x74\x56\xe7\x74\x5e\x17\x74\x51\x97\x74\x59\x57\x74\x55\xd7\x74\x5d\x37\x74\x53\xb7\x74\x5b\x77\x74\x57\xf7\x74\x5f\x0f\xf4\x50\x8f\x74\xa0\x43\x1d\xe9\xb1\x3e\x51\x9f\xa4\x4f\xd6\xa7\xe8\x53\xf5\x69\xfa\x74\x7d\x86\x3e\x53\x9f\xa5\xcf\xd6\xe7\xe8\x73\xf5\x79\xfa\x7c\x7d\x81\xbe\x50\x5f\xa4\x2f\xd6\x97\xe8\x4b\xf5\x65\xfa\x72\x7d\x85\xbe\x52\x5f\xa5\xaf\xd6\xd7\xe8\x6b\xf5\x75\xfa\x7a\x7d\x83\xbe\x51\xdf\xa4\x6f\xd6\xb7\xe8\x5b\xf5\x6d\xfa\x76\x7d\x87\xbe\x53\xdf\xa5\xef\xd6\xf7\xe8\x7b\xf5\x7d\xfa\x7e\xfd\x80\x7e\x50\x3f\xa4\x1f\xd6\x8f\xe8\x47\xf5\x63\xfa\x71\xfd\x84\x7e\x52\x3f\xa5\x9f\xd6\xcf\xe8\x67\xf5\x73\xfa\x79\xfd\x82\x7e\x51\xbf\xa4\x5f\xd6\xaf\xe8\x57\xf5\x6b\xfa\x75\xfd\x86\x7e\x53\xbf\xa5\xdf\xd6\xef\xe8\x77\xf5\x7b\xfa\x7d\xfd\x81\xfe\x50\x7f\xa4\x3f\xd6\x9f\xe8\x4f\xf5\x67\xfa\x73\xfd\x85\xfe\x52\x7f\xa5\xbf\xd6\xdf\xe8\x6f\xf5\x77\xfa\x7b\xfd\x83\xfe\x51\xff\xa4\x7f\xd6\xbf\xe8\x5f\xf5\x6f\xfa\x77\xfd\x87\xfe\x53\xff\xa5\xff\xd6\xff\xe8\x7f\xf5\x7f\x46\x22\x23\xc1\xf8\xcf\x48\x6c\x24\x31\x92\x1a\xc9\x8c\xe4\x46\x0a\x23\xa5\x91\xca\x48\x6d\xa4\x31\xd2\x1a\xe9\x8c\xf4\x46\x06\x23\xa3\x91\xc9\xc8\x6c\x64\x31\xb2\x1a\xd9\x8c\xec\x46\x0e\x23\xa7\x91\xcb\xc8\x6d\xe4\x31\xf2\x1a\xf9\x8c\xfc\x46\x01\xa3\xa0\x51\xc8\x28\x6c\x14\x31\x8a\x1a\xc5\x8c\xe2\x46\x09\xa3\xa4\x51\xca\x28\x6d\x94\x31\xca\x1a\xe5\x8c\xf2\x46\x05\xa3\xa2\x51\xc9\xa8\x6c\x54\x31\xaa\x1a\xd5\x8c\xea\x46\x0d\xa3\xa6\x51\xcb\xa8\x6d\xd4\x31\xea\x1a\xf5\x8c\xfa\x46\x03\xa3\xa1\xd1\xc8\x68\x6c\x34\x31\x9a\x1a\xcd\x8c\xe6\x46\x0b\xa3\xa5\xd1\xca\x68\x6d\xb4\x31\xda\x1a\xed\x8c\xf6\x46\x07\xa3\xa3\xd1\xc9\xe8\x6c\x74\x31\xba\x1a\xdd\x8c\xee\x46\x0f\xa3\xa7\xd1\xcb\xe8\x6d\xf4\x31\xfa\x1a\xfd\x8c\xfe\xc6\x00\x63\xa0\x31\xc8\x18\x6c\x0c\x31\x86\x1a\xc3\x8c\xe1\xc6\x08\x63\xa4\x31\xca\x18\x6d\x8c\x31\xc6\x1a\xe3\x8c\xf1\xc6\x04\x03\x33\x70\x83\x30\x48\x83\x32\x68\x83\x31\x58\x83\x33\x78\x43\x30\x44\x43\x32\x64\x43\x31\x54\x43\x33\x74\xc3\x30\x4c\xc3\x32\x6c\xc3\x31\x5c\xc3\x33\x7c\x23\x30\x42\x23\x32\x80\x01\x0d\x64\xc4\xc6\x44\x63\x92\x31\xd9\x98\x62\x4c\x35\xa6\x19\xd3\x8d\x19\xc6\x4c\x63\x96\x31\xdb\x98\x63\xcc\x35\xe6\x19\xf3\x8d\x05\xc6\x42\x63\x91\xb1\xd8\x58\x62\x2c\x35\x96\x19\xcb\x8d\x15\xc6\x4a\x63\x95\xb1\xda\x58\x63\xac\x35\xd6\x19\xeb\x8d\x0d\xc6\x46\x63\x93\xb1\xd9\xd8\x62\x6c\x35\xb6\x19\xdb\x8d\x1d\xc6\x4e\x63\x97\xb1\xdb\xd8\x63\xec\x35\xf6\x19\xfb\x8d\x03\xc6\x41\xe3\x90\x71\xd8\x38\x62\x1c\x35\x8e\x19\xc7\x8d\x13\xc6\x49\xe3\x94\x71\xda\x38\x63\x9c\x35\xce\x19\xe7\x8d\x0b\xc6\x45\xe3\x92\x71\xd9\xb8\x62\x5c\x35\xae\x19\xd7\x8d\x1b\xc6\x4d\xe3\x96\x71\xdb\xb8\x63\xdc\x35\xee\x19\xf7\x8d\x07\xc6\x43\xe3\x91\xf1\xd8\x78\x62\x3c\x35\x9e\x19\xcf\x8d\x17\xc6\x4b\xe3\x95\xf1\xda\x78\x63\xbc\x35\xde\x19\xef\x8d\x0f\xc6\x47\xe3\x93\xf1\xd9\xf8\x62\x7c\x35\xbe\x19\xdf\x8d\x1f\xc6\x4f\xe3\x97\xf1\xdb\xf8\x63\xfc\x35\xfe\x99\x89\xcc\x04\xf3\x3f\x33\xb1\x99\xc4\x4c\x6a\x26\x33\x93\x9b\x29\xcc\x94\x66\x2a\x33\xb5\x99\xc6\x4c\x6b\xa6\x33\xd3\x9b\x19\xcc\x8c\x66\x26\x33\xb3\x99\xc5\xcc\x6a\x66\x33\xb3\x9b\x39\xcc\x9c\x66\x2e\x33\xb7\x99\xc7\xcc\x6b\xe6\x33\xf3\x9b\x05\xcc\x82\x66\x21\xb3\xb0\x59\xc4\x2c\x6a\x16\x33\x8b\x9b\x25\xcc\x92\x66\x29\xb3\xb4\x59\xc6\x2c\x6b\x96\x33\xcb\x9b\x15\xcc\x8a\x66\x25\xb3\xb2\x59\xc5\xac\x6a\x56\x33\xab\x9b\x35\xcc\x9a\x66\x2d\xb3\xb6\x59\xc7\xac\x6b\xd6\x33\xeb\x9b\x0d\xcc\x86\x66\x23\xb3\xb1\xd9\xc4\x6c\x6a\x36\x33\x9b\x9b\x2d\xcc\x96\x66\x2b\xb3\xb5\xd9\xc6\x6c\x6b\xb6\x33\xdb\x9b\x1d\xcc\x8e\x66\x27\xb3\xb3\xd9\xc5\xec\x6a\x76\x33\xbb\x9b\x3d\xcc\x9e\x66\x2f\xb3\xb7\xd9\xc7\xec\x6b\xf6\x33\xfb\x9b\x03\xcc\x81\xe6\x20\x73\xb0\x39\xc4\x1c\x6a\x0e\x33\x87\x9b\x23\xcc\x91\xe6\x28\x73\xb4\x39\xc6\x1c\x6b\x8e\x33\xc7\x9b\x13\x4c\xcc\xc4\x4d\xc2\x24\x4d\xca\xa4\x4d\xc6\x64\x4d\xce\xe4\x4d\xc1\x14\x4d\xc9\x94\x4d\xc5\x54\x4d\xcd\xd4\x4d\xc3\x34\x4d\xcb\xb4\x4d\xc7\x74\x4d\xcf\xf4\xcd\xc0\x0c\xcd\xc8\x04\x26\x34\x91\x19\x9b\x13\xcd\x49\xe6\x64\x73\x8a\x39\xd5\x9c\x66\x4e\x37\x67\x98\x33\xcd\x59\xe6\x6c\x73\x8e\x39\xd7\x9c\x67\xce\x37\x17\x98\x0b\xcd\x45\xe6\x62\x73\x89\xb9\xd4\x5c\x66\x2e\x37\x57\x98\x2b\xcd\x55\xe6\x6a\x73\x8d\xb9\xd6\x5c\x67\xae\x37\x37\x98\x1b\xcd\x4d\xe6\x66\x73\x8b\xb9\xd5\xdc\x66\x6e\x37\x77\x98\x3b\xcd\x5d\xe6\x6e\x73\x8f\xb9\xd7\xdc\x67\xee\x37\x0f\x98\x07\xcd\x43\xe6\x61\xf3\x88\x79\xd4\x3c\x66\x1e\x37\x4f\x98\x27\xcd\x53\xe6\x69\xf3\x8c\x79\xd6\x3c\x67\x9e\x37\x2f\x98\x17\xcd\x4b\xe6\x65\xf3\x8a\x79\xd5\xbc\x66\x5e\x37\x6f\x98\x37\xcd\x5b\xe6\x6d\xf3\x8e\x79\xd7\xbc\x67\xde\x37\x1f\x98\x0f\xcd\x47\xe6\x63\xf3\x89\xf9\xd4\x7c\x66\x3e\x37\x5f\x98\x2f\xcd\x57\xe6\x6b\xf3\x8d\xf9\xd6\x7c\x67\xbe\x37\x3f\x98\x1f\xcd\x4f\xe6\x67\xf3\x8b\xf9\xd5\xfc\x66\x7e\x37\x7f\x98\x3f\xcd\x5f\xe6\x6f\xf3\x8f\xf9\xd7\xfc\x67\x25\xb2\x12\xac\xff\xac\xc4\x56\x12\x2b\xa9\x95\xcc\x4a\x6e\xa5\xb0\x52\x5a\xa9\xac\xd4\x56\x1a\x2b\xad\x95\xce\x4a\x6f\x65\xb0\x32\x5a\x99\xac\xcc\x56\x16\x2b\xab\x95\xcd\xca\x6e\xe5\xb0\x72\x5a\xb9\xac\xdc\x56\x1e\x2b\xaf\x95\xcf\xca\x6f\x15\xb0\x0a\x5a\x85\xac\xc2\x56\x11\xab\xa8\x55\xcc\x2a\x6e\x95\xb0\x4a\x5a\xa5\xac\xd2\x56\x19\xab\xac\x55\xce\x2a\x6f\x55\xb0\x2a\x5a\x95\xac\xca\x56\x15\xab\xaa\x55\xcd\xaa\x6e\xd5\xb0\x6a\x5a\xb5\xac\xda\x56\x1d\xab\xae\x55\xcf\xaa\x6f\x35\xb0\x1a\x5a\x8d\xac\xc6\x56\x13\xab\xa9\xd5\xcc\x6a\x6e\xb5\xb0\x5a\x5a\xad\xac\xd6\x56\x1b\xab\xad\xd5\xce\x6a\x6f\x75\xb0\x3a\x5a\x9d\xac\xce\x56\x17\xab\xab\xd5\xcd\xea\x6e\xf5\xb0\x7a\x5a\xbd\xac\xde\x56\x1f\xab\xaf\xd5\xcf\xea\x6f\x0d\xb0\x06\x5a\x83\xac\xc1\xd6\x10\x6b\xa8\x35\xcc\x1a\x6e\x8d\xb0\x46\x5a\xa3\xac\xd1\xd6\x18\x6b\xac\x35\xce\x1a\x6f\x4d\xb0\x30\x0b\xb7\x08\x8b\xb4\x28\x8b\xb6\x18\x8b\xb5\x38\x8b\xb7\x04\x4b\xb4\x24\x4b\xb6\x14\x4b\xb5\x34\x4b\xb7\x0c\xcb\xb4\x2c\xcb\xb6\x1c\xcb\xb5\x3c\xcb\xb7\x02\x2b\xb4\x22\x0b\x58\xd0\x42\x56\x6c\x4d\xb4\x26\x59\x93\xad\x29\xd6\x54\x6b\x9a\x35\xdd\x9a\x61\xcd\xb4\x66\x59\xb3\xad\x39\xd6\x5c\x6b\x9e\x35\xdf\x5a\x60\x2d\xb4\x16\x59\x8b\xad\x25\xd6\x52\x6b\x99\xb5\xdc\x5a\x61\xad\xb4\x56\x59\xab\xad\x35\xd6\x5a\x6b\x9d\xb5\xde\xda\x60\x6d\xb4\x36\x59\x9b\xad\x2d\xd6\x56\x6b\x9b\xb5\xdd\xda\x61\xed\xb4\x76\x59\xbb\xad\x3d\xd6\x5e\x6b\x9f\xb5\xdf\x3a\x60\x1d\xb4\x0e\x59\x87\xad\x23\xd6\x51\xeb\x98\x75\xdc\x3a\x61\x9d\xb4\x4e\x59\xa7\xad\x33\xd6\x59\xeb\x9c\x75\xde\xba\x60\x5d\xb4\x2e\x59\x97\xad\x2b\xd6\x55\xeb\x9a\x75\xdd\xba\x61\xdd\xb4\x6e\x59\xb7\xad\x3b\xd6\x5d\xeb\x9e\x75\xdf\x7a\x60\x3d\xb4\x1e\x59\x8f\xad\x27\xd6\x53\xeb\x99\xf5\xdc\x7a\x61\xbd\xb4\x5e\x59\xaf\xad\x37\xd6\x5b\xeb\x9d\xf5\xde\xfa\x60\x7d\xb4\x3e\x59\x9f\xad\x2f\xd6\x57\xeb\x9b\xf5\xdd\xfa\x61\xfd\xb4\x7e\x59\xbf\xad\x3f\xd6\x5f\xeb\x9f\x9d\xc8\x4e\xb0\xff\xb3\x13\xdb\x49\xec\xa4\x76\x32\x3b\xb9\x9d\xc2\x4e\x69\xa7\xb2\x53\xdb\x69\xec\xb4\x76\x3a\x3b\xbd\x9d\xc1\xce\x68\x67\xb2\x33\xdb\x59\xec\xac\x76\x36\x3b\xbb\x9d\xc3\xce\x69\xe7\xb2\x73\xdb\x79\xec\xbc\x76\x3e\x3b\xbf\x5d\xc0\x2e\x68\x17\xb2\x0b\xdb\x45\xec\xa2\x76\x31\xbb\xb8\x5d\xc2\x2e\x69\x97\xb2\x4b\xdb\x65\xec\xb2\x76\x39\xbb\xbc\x5d\xc1\xae\x68\x57\xb2\x2b\xdb\x55\xec\xaa\x76\x35\xbb\xba\x5d\xc3\xae\x69\xd7\xb2\x6b\xdb\x75\xec\xba\x76\x3d\xbb\xbe\xdd\xc0\x6e\x68\x37\xb2\x1b\xdb\x4d\xec\xa6\x76\x33\xbb\xb9\xdd\xc2\x6e\x69\xb7\xb2\x5b\xdb\x6d\xec\xb6\x76\x3b\xbb\xbd\xdd\xc1\xee\x68\x77\xb2\x3b\xdb\x5d\xec\xae\x76\x37\xbb\xbb\xdd\xc3\xee\x69\xf7\xb2\x7b\xdb\x7d\xec\xbe\x76\x3f\xbb\xbf\x3d\xc0\x1e\x68\x0f\xb2\x07\xdb\x43\xec\xa1\xf6\x30\x7b\xb8\x3d\xc2\x1e\x69\x8f\xb2\x47\xdb\x63\xec\xb1\xf6\x38\x7b\xbc\x3d\xc1\xc6\x6c\xdc\x26\x6c\xd2\xa6\x6c\xda\x66\x6c\xd6\xe6\x6c\xde\x16\x6c\xd1\x96\x6c\xd9\x56\x6c\xd5\xd6\x6c\xdd\x36\x6c\xd3\xb6\x6c\xdb\x76\x6c\xd7\xf6\x6c\xdf\x0e\xec\xd0\x8e\x6c\x60\x43\x1b\xd9\xb1\x3d\xd1\x9e\x64\x4f\xb6\xa7\xd8\x53\xed\x69\xf6\x74\x7b\x86\x3d\xd3\x9e\x65\xcf\xb6\xe7\xd8\x73\xed\x79\xf6\x7c\x7b\x81\xbd\xd0\x5e\x64\x2f\xb6\x97\xd8\x4b\xed\x65\xf6\x72\x7b\x85\xbd\xd2\x5e\x65\xaf\xb6\xd7\xd8\x6b\xed\x75\xf6\x7a\x7b\x83\xbd\xd1\xde\x64\x6f\xb6\xb7\xd8\x5b\xed\x6d\xf6\x76\x7b\x87\xbd\xd3\xde\x65\xef\xb6\xf7\xd8\x7b\xed\x7d\xf6\x7e\xfb\x80\x7d\xd0\x3e\x64\x1f\xb6\x8f\xd8\x47\xed\x63\xf6\x71\xfb\x84\x7d\xd2\x3e\x65\x9f\xb6\xcf\xd8\x67\xed\x73\xf6\x79\xfb\x82\x7d\xd1\xbe\x64\x5f\xb6\xaf\xd8\x57\xed\x6b\xf6\x75\xfb\x86\x7d\xd3\xbe\x65\xdf\xb6\xef\xd8\x77\xed\x7b\xf6\x7d\xfb\x81\xfd\xd0\x7e\x64\x3f\xb6\x9f\xd8\x4f\xed\x67\xf6\x73\xfb\x85\xfd\xd2\x7e\x65\xbf\xb6\xdf\xd8\x6f\xed\x77\xf6\x7b\xfb\x83\xfd\xd1\xfe\x64\x7f\xb6\xbf\xd8\x5f\xed\x6f\xf6\x77\xfb\x87\xfd\xd3\xfe\x65\xff\xb6\xff\xd8\x7f\xed\x7f\x4e\x22\x27\xc1\xf9\xcf\x49\xec\x24\x71\x92\x3a\xc9\x9c\xe4\x4e\x0a\x27\xa5\x93\xca\x49\xed\xa4\x71\xd2\x3a\xe9\x9c\xf4\x4e\x06\x27\xa3\x93\xc9\xc9\xec\x64\x71\xb2\x3a\xd9\x9c\xec\x4e\x0e\x27\xa7\x93\xcb\xc9\xed\xe4\x71\xf2\x3a\xf9\x9c\xfc\x4e\x01\xa7\xa0\x53\xc8\x29\x9c\x28\xc1\x29\xe2\x14\x75\x8a\x39\xc5\x9d\x12\x4e\x49\xa7\x94\x53\xda\x29\xe3\x94\x75\xca\x39\xe5\x9d\x0a\x4e\x45\xa7\x92\x53\xd9\xa9\xe2\x54\x75\xaa\x39\xd5\x9d\x1a\x4e\x4d\xa7\x96\x53\xdb\xa9\xe3\xd4\x75\xea\x39\xf5\x9d\x06\x4e\x43\xa7\x91\xd3\xd8\x69\xe2\x34\x75\x9a\x39\xcd\x9d\x16\x4e\x4b\xa7\x95\xd3\xda\x69\xe3\xb4\x75\xda\x39\xed\x9d\x0e\x4e\x47\xa7\x93\xd3\xd9\xe9\xe2\x74\x75\xba\x39\xdd\x9d\x1e\x4e\x4f\xa7\x97\xd3\xdb\xe9\xe3\xf4\x75\xfa\x39\xfd\x9d\x01\xce\x40\x67\x90\x33\xd8\x19\xe2\x0c\x75\x86\x39\xc3\x9d\x11\xce\x48\x67\x94\x33\xda\x19\xe3\x8c\x75\xc6\x39\xe3\x9d\x09\x0e\xe6\xe0\x0e\xe1\x90\x0e\xe5\xd0\x0e\xe3\xb0\x0e\xe7\xf0\x8e\xe0\x88\x8e\xe4\xc8\x8e\xe2\xa8\x8e\xe6\xe8\x8e\xe1\x98\x8e\xe5\xd8\x8e\xe3\xb8\x8e\xe7\xf8\x4e\xe0\x84\x4e\xe4\x00\x07\x3a\xc8\x89\x9d\x89\xce\x24\x67\xb2\x33\xc5\x99\xea\x4c\x73\xa6\x3b\x33\x9c\x99\xce\x2c\x67\xb6\x33\xc7\x99\xeb\xcc\x73\xe6\x3b\x0b\x9c\x85\xce\x22\x67\xb1\xb3\xc4\x59\xea\x2c\x73\x96\x3b\x2b\x9c\x95\xce\x2a\x67\xb5\xb3\xc6\x59\xeb\xac\x73\xd6\x3b\x1b\x9c\x8d\xce\x26\x67\xb3\xb3\xc5\xd9\xea\x6c\x73\xb6\x3b\x3b\x9c\x9d\xce\x2e\x67\xb7\xb3\xc7\xd9\xeb\xec\x73\xf6\x3b\x07\x9c\x83\xce\x21\xe7\xb0\x73\xc4\x39\xea\x1c\x73\x8e\x3b\x27\x9c\x93\xce\x29\xe7\xb4\x73\xc6\x39\xeb\x9c\x73\xce\x3b\x17\x9c\x8b\xce\x25\xe7\xb2\x73\xc5\xb9\xea\x5c\x73\xae\x3b\x37\x9c\x9b\xce\x2d\xe7\xb6\x73\xc7\xb9\xeb\xdc\x73\xee\x3b\x0f\x9c\x87\xce\x23\xe7\xb1\xf3\xc4\x79\xea\x3c\x73\x9e\x3b\x2f\x9c\x97\xce\x2b\xe7\xb5\xf3\xc6\x79\xeb\xbc\x73\xde\x3b\x1f\x9c\x8f\xce\x27\xe7\xb3\xf3\xc5\xf9\xea\x7c\x73\xbe\x3b\x3f\x9c\x9f\xce\x2f\xe7\xb7\xf3\xc7\xf9\xeb\xfc\x73\x13\xb9\x09\xee\x7f\x6e\x62\x37\x89\x9b\xd4\x4d\xe6\x26\x77\x53\xb8\x29\xdd\x54\x6e\x6a\x37\x8d\x9b\xd6\x4d\xe7\xa6\x77\x33\xb8\x19\xdd\x4c\x6e\x66\x37\x8b\x9b\xd5\xcd\xe6\x66\x77\x73\xb8\x39\xdd\x5c\x6e\x6e\x37\x8f\x9b\xd7\xcd\xe7\xe6\x77\x0b\xb8\x05\xdd\x42\x6e\x61\xb7\x88\x5b\xd4\x2d\xe6\x16\x77\x4b\xb8\x25\xdd\x52\x6e\x69\xb7\x8c\x5b\xd6\x2d\xe7\x96\x77\x2b\xb8\x15\xdd\x4a\x6e\x65\xb7\x8a\x5b\xd5\xad\xe6\x56\x77\x6b\xb8\x35\xdd\x5a\x6e\x6d\xb7\x8e\x5b\xd7\xad\xe7\xd6\x77\x1b\xb8\x0d\xdd\x46\x6e\x63\xb7\x89\xdb\xd4\x6d\xe6\x36\x77\x5b\xb8\x2d\xdd\x56\x6e\x6b\xb7\x8d\xdb\xd6\x6d\xe7\xb6\x77\x3b\xb8\x1d\xdd\x4e\x6e\x67\xb7\x8b\xdb\xd5\xed\xe6\x76\x77\x7b\xb8\x3d\xdd\x5e\x6e\x6f\xb7\x8f\xdb\xd7\xed\xe7\xf6\x77\x07\xb8\x03\xdd\x41\xee\x60\x77\x88\x3b\xd4\x1d\xe6\x0e\x77\x47\xb8\x23\xdd\x51\xee\x68\x77\x8c\x3b\xd6\x1d\xe7\x8e\x77\x27\xb8\x98\x8b\xbb\x84\x4b\xba\x94\x4b\xbb\x8c\xcb\xba\x9c\xcb\xbb\x82\x2b\xba\x92\x2b\xbb\x8a\xab\xba\x9a\xab\xbb\x86\x6b\xba\x96\x6b\xbb\x8e\xeb\xba\x9e\xeb\xbb\x81\x1b\xba\x91\x0b\x5c\xe8\x22\x37\x76\x27\xba\x93\xdc\xc9\xee\x14\x77\xaa\x3b\xcd\x9d\xee\xce\x70\x67\xba\xb3\xdc\xd9\xee\x1c\x77\xae\x3b\xcf\x9d\xef\x2e\x70\x17\xba\x8b\xdc\xc5\xee\x12\x77\xa9\xbb\xcc\x5d\xee\xae\x70\x57\xba\xab\xdc\xd5\xee\x1a\x77\xad\xbb\xce\x5d\xef\x6e\x70\x37\xba\x9b\xdc\xcd\xee\x16\x77\xab\xbb\xcd\xdd\xee\xee\x70\x77\xba\xbb\xdc\xdd\xee\x1e\x77\xaf\xbb\xcf\xdd\xef\x1e\x70\x0f\xba\x87\xdc\xc3\xee\x11\xf7\xa8\x7b\xcc\x3d\xee\x9e\x70\x4f\xba\xa7\xdc\xd3\xee\x19\xf7\xac\x7b\xce\x3d\xef\x5e\x70\x2f\xba\x97\xdc\xcb\xee\x15\xf7\xaa\x7b\xcd\xbd\xee\xde\x70\x6f\xba\xb7\xdc\xdb\xee\x1d\xf7\xae\x7b\xcf\xbd\xef\x3e\x70\x1f\xba\x8f\xdc\xc7\xee\x13\xf7\xa9\xfb\xcc\x7d\xee\xbe\x70\x5f\xba\xaf\xdc\xd7\xee\x1b\xf7\xad\xfb\xce\x7d\xef\x7e\x70\x3f\xba\x9f\xdc\xcf\xee\x17\xf7\xab\xfb\xcd\xfd\xee\xfe\x70\x7f\xba\xbf\xdc\xdf\xee\x1f\xf7\xaf\xfb\xcf\x4b\xe4\x25\x78\xff\x79\x89\xbd\x24\x5e\x52\x2f\x99\x97\xdc\x4b\xe1\xa5\xf4\x52\x79\xa9\xbd\x34\x5e\x5a\x2f\x9d\x97\xde\xcb\xe0\x65\xf4\x32\x79\x99\xbd\x2c\x5e\x56\x2f\x9b\x97\xdd\xcb\xe1\xe5\xf4\x72\x79\xb9\xbd\x3c\x5e\x5e\x2f\x9f\x97\xdf\x2b\xe0\x15\xf4\x0a\x79\x85\xbd\x22\x5e\x51\xaf\x98\x57\xdc\x2b\xe1\x95\xf4\x4a\x79\xa5\xbd\x32\x5e\x59\xaf\x9c\x57\xde\xab\xe0\x55\xf4\x2a\x79\x95\xbd\x2a\x5e\x55\xaf\x9a\x57\xdd\xab\xe1\xd5\xf4\x6a\x79\xb5\xbd\x3a\x5e\x5d\xaf\x9e\x57\xdf\x6b\xe0\x35\xf4\x1a\x79\x8d\xbd\x26\x5e\x53\xaf\x99\xd7\xdc\x6b\xe1\xb5\xf4\x5a\x79\xad\xbd\x36\x5e\x5b\xaf\x9d\xd7\xde\xeb\xe0\x75\xf4\x3a\x79\x9d\xbd\x2e\x5e\x57\xaf\x9b\xd7\xdd\xeb\xe1\xf5\xf4\x7a\x79\xbd\xbd\x3e\x5e\x5f\xaf\x9f\xd7\xdf\x1b\xe0\x0d\xf4\x06\x79\x83\xbd\x21\xde\x50\x6f\x98\x37\xdc\x1b\xe1\x8d\xf4\x46\x79\xa3\xbd\x31\xde\x58\x6f\x9c\x37\xde\x9b\xe0\x61\x1e\xee\x11\x1e\xe9\x51\x1e\xed\x31\x1e\xeb\x71\x1e\xef\x09\x9e\xe8\x49\x9e\xec\x29\x9e\xea\x69\x9e\xee\x19\x9e\xe9\x59\x9e\xed\x39\x9e\xeb\x79\x9e\xef\x05\x5e\xe8\x45\x1e\xf0\xa0\x87\xbc\xd8\x9b\xe8\x4d\xf2\x26\x7b\x53\xbc\xa9\xde\x34\x6f\xba\x37\xc3\x9b\xe9\xcd\xf2\x66\x7b\x73\xbc\xb9\xde\x3c\x6f\xbe\xb7\xc0\x5b\xe8\x2d\xf2\x16\x7b\x4b\xbc\xa5\xde\x32\x6f\xb9\xb7\xc2\x5b\xe9\xad\xf2\x56\x7b\x6b\xbc\xb5\xde\x3a\x6f\xbd\xb7\xc1\xdb\xe8\x6d\xf2\x36\x7b\x5b\xbc\xad\xde\x36\x6f\xbb\xb7\xc3\xdb\xe9\xed\xf2\x76\x7b\x7b\xbc\xbd\xde\x3e\x6f\xbf\x77\xc0\x3b\xe8\x1d\xf2\x0e\x7b\x47\xbc\xa3\xde\x31\xef\xb8\x77\xc2\x3b\xe9\x9d\xf2\x4e\x7b\x67\xbc\xb3\xde\x39\xef\xbc\x77\xc1\xbb\xe8\x5d\xf2\x2e\x7b\x57\xbc\xab\xde\x35\xef\xba\x77\xc3\xbb\xe9\xdd\xf2\x6e\x7b\x77\xbc\xbb\xde\x3d\xef\xbe\xf7\xc0\x7b\xe8\x3d\xf2\x1e\x7b\x4f\xbc\xa7\xde\x33\xef\xb9\xf7\xc2\x7b\xe9\xbd\xf2\x5e\x7b\x6f\xbc\xb7\xde\x3b\xef\xbd\xf7\xc1\xfb\xe8\x7d\xf2\x3e\x7b\x5f\xbc\xaf\xde\x37\xef\xbb\xf7\xc3\xfb\xe9\xfd\xf2\x7e\x7b\x7f\xbc\xbf\xde\x3f\x3f\x91\x9f\xe0\xff\xe7\x27\xf6\x93\xf8\x49\xfd\x64\x7e\x72\x3f\x85\x9f\xd2\x4f\xe5\xa7\xf6\xd3\xf8\x69\xfd\x74\x7e\x7a\x3f\x83\x9f\xd1\xcf\xe4\x67\xf6\xb3\xf8\x59\xfd\x6c\x7e\x76\x3f\x87\x9f\xd3\xcf\xe5\xe7\xf6\xf3\xf8\x79\xfd\x7c\x7e\x7e\xbf\x80\x5f\xd0\x2f\xe4\x17\xf6\x8b\xf8\x45\xfd\x62\x7e\x71\xbf\x84\x5f\xd2\x2f\xe5\x97\xf6\xcb\xf8\x65\xfd\x72\x7e\x79\xbf\x82\x5f\xd1\xaf\xe4\x57\xf6\xab\xf8\x55\xfd\x6a\x7e\x75\xbf\x86\x5f\xd3\xaf\xe5\xd7\xf6\xeb\xf8\x75\xfd\x7a\x7e\x7d\xbf\x81\xdf\xd0\x6f\xe4\x37\xf6\x9b\xf8\x4d\xfd\x66\x7e\x73\xbf\x85\xdf\xd2\x6f\xe5\xb7\xf6\xdb\xf8\x6d\xfd\x76\x7e\x7b\xbf\x83\xdf\xd1\xef\xe4\x77\xf6\xbb\xf8\x5d\xfd\x6e\x7e\x77\xbf\x87\xdf\xd3\xef\xe5\xf7\xf6\xfb\xf8\x7d\xfd\x7e\x7e\x7f\x7f\x80\x3f\xd0\x1f\xe4\x0f\xf6\x87\xf8\x43\xfd\x61\xfe\x70\x7f\x84\x3f\xd2\x1f\xe5\x8f\xf6\xc7\xf8\x63\xfd\x71\xfe\x78\x7f\x82\x8f\xf9\xb8\x4f\xf8\xa4\x4f\xf9\xb4\xcf\xf8\xac\xcf\xf9\xbc\x2f\xf8\xa2\x2f\xf9\xb2\xaf\xf8\xaa\xaf\xf9\xba\x6f\xf8\xa6\x6f\xf9\xb6\xef\xf8\xae\xef\xf9\xbe\x1f\xf8\xa1\x1f\xf9\xc0\x87\x3e\xf2\x63\x7f\xa2\x3f\xc9\x9f\xec\x4f\xf1\xa7\xfa\xd3\xfc\xe9\xfe\x0c\x7f\xa6\x3f\xcb\x9f\xed\xcf\xf1\xe7\xfa\xf3\xfc\xf9\xfe\x02\x7f\xa1\xbf\xc8\x5f\xec\x2f\xf1\x97\xfa\xcb\xfc\xe5\xfe\x0a\x7f\xa5\xbf\xca\x5f\xed\xaf\xf1\xd7\xfa\xeb\xfc\xf5\xfe\x06\x7f\xa3\xbf\xc9\xdf\xec\x6f\xf1\xb7\xfa\xdb\xfc\xed\xfe\x0e\x7f\xa7\xbf\xcb\xdf\xed\xef\xf1\xf7\xfa\xfb\xfc\xfd\xfe\x01\xff\xa0\x7f\xc8\x3f\xec\x1f\xf1\x8f\xfa\xc7\xfc\xe3\xfe\x09\xff\xa4\x7f\xca\x3f\xed\x9f\xf1\xcf\xfa\xe7\xfc\xf3\xfe\x05\xff\xa2\x7f\xc9\xbf\xec\x5f\xf1\xaf\xfa\xd7\xfc\xeb\xfe\x0d\xff\xa6\x7f\xcb\xbf\xed\xdf\xf1\xef\xfa\xf7\xfc\xfb\xfe\x03\xff\xa1\xff\xc8\x7f\xec\x3f\xf1\x9f\xfa\xcf\xfc\xe7\xfe\x0b\xff\xa5\xff\xca\x7f\xed\xbf\xf1\xdf\xfa\xef\xfc\xf7\xfe\x07\xff\xa3\xff\xc9\xff\xec\x7f\xf1\xbf\xfa\xdf\xfc\xef\xfe\x0f\xff\xa7\xff\xcb\xff\xed\xff\xf1\xff\xfa\xff\x82\x44\x41\x42\xf0\x5f\x90\x38\x48\x12\x24\x0d\x92\x05\xc9\x83\x14\x41\xca\x20\x55\x90\x3a\x48\x13\xa4\x0d\xd2\x05\xe9\x83\x0c\x41\xc6\x20\x53\x90\x39\xc8\x12\x64\x0d\xb2\x05\xd9\x83\x1c\x41\xce\x20\x57\x90\x3b\xc8\x13\xe4\x0d\xf2\x05\xf9\x83\x02\x41\xc1\xa0\x50\x50\x38\x28\x12\x14\x0d\x8a\x05\xc5\x83\x12\x41\xc9\xa0\x54\x50\x3a\x28\x13\x94\x0d\xca\x05\xe5\x83\x0a\x41\xc5\xa0\x52\x50\x39\xa8\x12\x54\x0d\xaa\x05\xd5\x83\x1a\x41\xcd\xa0\x56\x50\x3b\xa8\x13\xd4\x0d\xea\x05\xf5\x83\x06\x41\xc3\xa0\x51\xd0\x38\x68\x12\x34\x0d\x9a\x05\xcd\x83\x16\x41\xcb\xa0\x55\xd0\x3a\x68\x13\xb4\x0d\xda\x05\xed\x83\x0e\x41\xc7\xa0\x53\xd0\x39\xe8\x12\x74\x0d\xba\x05\xdd\x83\x1e\x41\xcf\xa0\x57\xd0\x3b\xe8\x13\xf4\x0d\xfa\x05\xfd\x83\x01\xc1\xc0\x60\x50\x30\x38\x18\x12\x0c\x0d\x86\x05\xc3\x83\x11\xc1\xc8\x60\x54\x30\x3a\x18\x13\x8c\x0d\xc6\x05\xe3\x83\x09\x01\x16\xe0\x01\x11\x90\x01\x15\xd0\x01\x13\xb0\x01\x17\xf0\x81\x10\x88\x81\x14\xc8\x81\x12\xa8\x81\x16\xe8\x81\x11\x98\x81\x15\xd8\x81\x13\xb8\x81\x17\xf8\x41\x10\x84\x41\x14\x80\x00\x06\x28\x88\x83\x89\xc1\xa4\x60\x72\x30\x25\x98\x1a\x4c\x0b\xa6\x07\x33\x82\x99\xc1\xac\x60\x76\x30\x27\x98\x1b\xcc\x0b\xe6\x07\x0b\x82\x85\xc1\xa2\x60\x71\xb0\x24\x58\x1a\x2c\x0b\x96\x07\x2b\x82\x95\xc1\xaa\x60\x75\xb0\x26\x58\x1b\xac\x0b\xd6\x07\x1b\x82\x8d\xc1\xa6\x60\x73\xb0\x25\xd8\x1a\x6c\x0b\xb6\x07\x3b\x82\x9d\xc1\xae\x60\x77\xb0\x27\xd8\x1b\xec\x0b\xf6\x07\x07\x82\x83\xc1\xa1\xe0\x70\x70\x24\x38\x1a\x1c\x0b\x8e\x07\x27\x82\x93\xc1\xa9\xe0\x74\x70\x26\x38\x1b\x9c\x0b\xce\x07\x17\x82\x8b\xc1\xa5\xe0\x72\x70\x25\xb8\x1a\x5c\x0b\xae\x07\x37\x82\x9b\xc1\xad\xe0\x76\x70\x27\xb8\x1b\xdc\x0b\xee\x07\x0f\x82\x87\xc1\xa3\xe0\x71\xf0\x24\x78\x1a\x3c\x0b\x9e\x07\x2f\x82\x97\xc1\xab\xe0\x75\xf0\x26\x78\x1b\xbc\x0b\xde\x07\x1f\x82\x8f\xc1\xa7\xe0\x73\xf0\x25\xf8\x1a\x7c\x0b\xbe\x07\x3f\x82\x9f\xc1\xaf\xe0\x77\xf0\x27\xf8\x1b\xfc\x0b\x13\x85\x09\xe1\x7f\x61\xe2\x30\x49\x98\x34\x4c\x16\x26\x0f\x53\x84\x29\xc3\x54\x61\xea\x30\x4d\x98\x36\x4c\x17\xa6\x0f\x33\x84\x19\xc3\x4c\x61\xe6\x30\x4b\x98\x35\xcc\x16\x66\x0f\x73\x84\x39\xc3\x5c\x61\xee\x30\x4f\x98\x37\xcc\x17\xe6\x0f\x0b\x84\x05\xc3\x42\x61\xe1\xb0\x48\x58\x34\x2c\x16\x16\x0f\x4b\x84\x25\xc3\x52\x61\xe9\xb0\x4c\x58\x36\x2c\x17\x96\x0f\x2b\x84\x15\xc3\x4a\x61\xe5\xb0\x4a\x58\x35\xac\x16\x56\x0f\x6b\x84\x35\xc3\x5a\x61\xed\xb0\x4e\x58\x37\xac\x17\xd6\x0f\x1b\x84\x0d\xc3\x46\x61\xe3\xb0\x49\xd8\x34\x6c\x16\x36\x0f\x5b\x84\x2d\xc3\x56\x61\xeb\xb0\x4d\xd8\x36\x6c\x17\xb6\x0f\x3b\x84\x1d\xc3\x4e\x61\xe7\xb0\x4b\xd8\x35\xec\x16\x76\x0f\x7b\x84\x3d\xc3\x5e\x61\xef\xb0\x4f\xd8\x37\xec\x17\xf6\x0f\x07\x84\x03\xc3\x41\xe1\xe0\x70\x48\x38\x34\x1c\x16\x0e\x0f\x47\x84\x23\xc3\x51\xe1\xe8\x70\x4c\x38\x36\x1c\x17\x8e\x0f\x27\x84\x58\x88\x87\x44\x48\x86\x54\x48\x87\x4c\xc8\x86\x5c\xc8\x87\x42\x28\x86\x52\x28\x87\x4a\xa8\x86\x5a\xa8\x87\x46\x68\x86\x56\x68\x87\x4e\xe8\x86\x5e\xe8\x87\x41\x18\x86\x51\x08\x42\x18\xa2\x30\x0e\x27\x86\x93\xc2\xc9\xe1\x94\x70\x6a\x38\x2d\x9c\x1e\xce\x08\x67\x86\xb3\xc2\xd9\xe1\x9c\x70\x6e\x38\x2f\x9c\x1f\x2e\x08\x17\x86\x8b\xc2\xc5\xe1\x92\x70\x69\xb8\x2c\x5c\x1e\xae\x08\x57\x86\xab\xc2\xd5\xe1\x9a\x70\x6d\xb8\x2e\x5c\x1f\x6e\x08\x37\x86\x9b\xc2\xcd\xe1\x96\x70\x6b\xb8\x2d\xdc\x1e\xee\x08\x77\x86\xbb\xc2\xdd\xe1\x9e\x70\x6f\xb8\x2f\xdc\x1f\x1e\x08\x0f\x86\x87\xc2\xc3\xe1\x91\xf0\x68\x78\x2c\x3c\x1e\x9e\x08\x4f\x86\xa7\xc2\xd3\xe1\x99\xf0\x6c\x78\x2e\x3c\x1f\x5e\x08\x2f\x86\x97\xc2\xcb\xe1\x95\xf0\x6a\x78\x2d\xbc\x1e\xde\x08\x6f\x86\xb7\xc2\xdb\xe1\x9d\xf0\x6e\x78\x2f\xbc\x1f\x3e\x08\x1f\x86\x8f\xc2\xc7\xe1\x93\xf0\x69\xf8\x2c\x7c\x1e\xbe\x08\x5f\x86\xaf\xc2\xd7\xe1\x9b\xf0\x6d\xf8\x2e\x7c\x1f\x7e\x08\x3f\x86\x9f\xc2\xcf\xe1\x97\xf0\x6b\xf8\x2d\xfc\x1e\xfe\x08\x7f\x86\xbf\xc2\xdf\xe1\x9f\xf0\x6f\xf8\x2f\x4a\x14\x25\x44\xff\x45\x89\xa3\x24\x51\xd2\x28\x59\x94\x3c\x4a\x11\xa5\x8c\x52\x45\xa9\xa3\x34\x51\xda\x28\x5d\x94\x3e\xca\x10\x65\x8c\x32\x45\x99\xa3\x2c\x51\xd6\x28\x5b\x94\x3d\xca\x11\xe5\x8c\x72\x45\xb9\xa3\x3c\x51\xde\x28\x5f\x94\x3f\x2a\x10\x15\x8c\x0a\x45\x85\xa3\x22\x51\xd1\xa8\x58\x54\x3c\x2a\x11\x95\x8c\x4a\x45\xa5\xa3\x32\x51\xd9\xa8\x5c\x54\x3e\xaa\x10\x55\x8c\x2a\x45\x95\xa3\x2a\x51\xd5\xa8\x5a\x54\x3d\xaa\x11\xd5\x8c\x6a\x45\xb5\xa3\x3a\x51\xdd\xa8\x5e\x54\x3f\x6a\x10\x35\x8c\x1a\x45\x8d\xa3\x26\x51\xd3\xa8\x59\xd4\x3c\x6a\x11\xb5\x8c\x5a\x45\xad\xa3\x36\x51\xdb\xa8\x5d\xd4\x3e\xea\x10\x75\x8c\x3a\x45\x9d\xa3\x2e\x51\xd7\xa8\x5b\xd4\x3d\xea\x11\xf5\x8c\x7a\x45\xbd\xa3\x3e\x51\xdf\xa8\x5f\xd4\x3f\x1a\x10\x0d\x8c\x06\x45\x83\xa3\x21\xd1\xd0\x68\x58\x34\x3c\x1a\x11\x8d\x8c\x46\x45\xa3\xa3\x31\xd1\xd8\x68\x5c\x34\x3e\x9a\x10\x61\x11\x1e\x11\x11\x19\x51\x11\x1d\x31\x11\x1b\x71\x11\x1f\x09\x91\x18\x49\x91\x1c\x29\x91\x1a\x69\x91\x1e\x19\x91\x19\x59\x91\x1d\x39\x91\x1b\x79\x91\x1f\x05\x51\x18\x45\x11\x88\x60\x84\xa2\x38\x9a\x18\x4d\x8a\x26\x47\x53\xa2\xa9\xd1\xb4\x68\x7a\x34\x23\x9a\x19\xcd\x8a\x66\x47\x73\xa2\xb9\xd1\xbc\x68\x7e\xb4\x20\x5a\x18\x2d\x8a\x16\x47\x4b\xa2\xa5\xd1\xb2\x68\x79\xb4\x22\x5a\x19\xad\x8a\x56\x47\x6b\xa2\xb5\xd1\xba\x68\x7d\xb4\x21\xda\x18\x6d\x8a\x36\x47\x5b\xa2\xad\xd1\xb6\x68\x7b\xb4\x23\xda\x19\xed\x8a\x76\x47\x7b\xa2\xbd\xd1\xbe\x68\x7f\x74\x20\x3a\x18\x1d\x8a\x0e\x47\x47\xa2\xa3\xd1\xb1\xe8\x78\x74\x22\x3a\x19\x9d\x8a\x4e\x47\x67\xa2\xb3\xd1\xb9\xe8\x7c\x74\x21\xba\x18\x5d\x8a\x2e\x47\x57\xa2\xab\xd1\xb5\xe8\x7a\x74\x23\xba\x19\xdd\x8a\x6e\x47\x77\xa2\xbb\xd1\xbd\xe8\x7e\xf4\x20\x7a\x18\x3d\x8a\x1e\x47\x4f\xa2\xa7\xd1\xb3\xe8\x79\xf4\x22\x7a\x19\xbd\x8a\x5e\x47\x6f\xa2\xb7\xd1\xbb\xe8\x7d\xf4\x21\xfa\x18\x7d\x8a\x3e\x47\x5f\xa2\xaf\xd1\xb7\xe8\x7b\xf4\x23\xfa\x19\xfd\x8a\x7e\x47\x7f\xa2\xbf\xd1\x3f\x90\x08\x24\x80\xff\x40\x62\x90\x04\x24\x05\xc9\x40\x72\x90\x02\xa4\x04\xa9\x40\x6a\x90\x06\xa4\x05\xe9\x40\x7a\x90\x01\x64\x04\x99\x40\x66\x90\x05\x64\x05\xd9\x40\x76\x90\x03\xe4\x04\xb9\x40\x6e\x90\x07\xe4\x05\xf9\x40\x7e\x50\x00\x14\x04\x85\x40\x61\x50\x04\x14\x05\xc5\x40\x71\x50\x02\x94\x04\xa5\x40\x69\x50\x06\x94\x05\xe5\x40\x79\x50\x01\x54\x04\x95\x40\x65\x50\x05\x54\x05\xd5\x40\x75\x50\x03\xd4\x04\xb5\x40\x6d\x50\x07\xd4\x05\xf5\x40\x7d\xd0\x00\x34\x04\x8d\x40\x63\xd0\x04\x34\x05\xcd\x40\x73\xd0\x02\xb4\x04\xad\x40\x6b\xd0\x06\xb4\x05\xed\x40\x7b\xd0\x01\x74\x04\x9d\x40\x67\xd0\x05\x74\x05\xdd\x40\x77\xd0\x03\xf4\x04\xbd\x40\x6f\xd0\x07\xf4\x05\xfd\x40\x7f\x30\x00\x0c\x04\x83\xc0\x60\x30\x04\x0c\x05\xc3\xc0\x70\x30\x02\x8c\x04\xa3\xc0\x68\x30\x06\x8c\x05\xe3\xc0\x78\x30\x01\x60\x00\x07\x04\x20\x01\x05\x68\xc0\x00\x16\x70\x80\x07\x02\x10\x81\x04\x64\xa0\x00\x15\x68\x40\x07\x06\x30\x81\x05\x6c\xe0\x00\x17\x78\xc0\x07\x01\x08\x41\x04\x00\x80\x00\x81\x18\x4c\x04\x93\xc0\x64\x30\x05\x4c\x05\xd3\xc0\x74\x30\x03\xcc\x04\xb3\xc0\x6c\x30\x07\xcc\x05\xf3\xc0\x7c\xb0\x00\x2c\x04\x8b\xc0\x62\xb0\x04\x2c\x05\xcb\xc0\x72\xb0\x02\xac\x04\xab\xc0\x6a\xb0\x06\xac\x05\xeb\xc0\x7a\xb0\x01\x6c\x04\x9b\xc0\x66\xb0\x05\x6c\x05\xdb\xc0\x76\xb0\x03\xec\x04\xbb\xc0\x6e\xb0\x07\xec\x05\xfb\xc0\x7e\x70\x00\x1c\x04\x87\xc0\x61\x70\x04\x1c\x05\xc7\xc0\x71\x70\x02\x9c\x04\xa7\xc0\x69\x70\x06\x9c\x05\xe7\xc0\x79\x70\x01\x5c\x04\x97\xc0\x65\x70\x05\x5c\x05\xd7\xc0\x75\x70\x03\xdc\x04\xb7\xc0\x6d\x70\x07\xdc\x05\xf7\xc0\x7d\xf0\x00\x3c\x04\x8f\xc0\x63\xf0\x04\x3c\x05\xcf\xc0\x73\xf0\x02\xbc\x04\xaf\xc0\x6b\xf0\x06\xbc\x05\xef\xc0\x7b\xf0\x01\x7c\x04\x9f\xc0\x67\xf0\x05\x7c\x05\xdf\xc0\x77\xf0\x03\xfc\x04\xbf\xc0\x6f\xf0\x07\xfc\x05\xff\x60\x22\x98\x00\xff\x83\x89\x61\x12\x98\x14\x26\x83\xc9\x61\x0a\x98\x12\xa6\x82\xa9\x61\x1a\x98\x16\xa6\x83\xe9\x61\x06\x98\x11\x66\x82\x99\x61\x16\x98\x15\x66\x83\xd9\x61\x0e\x98\x13\xe6\x82\xb9\x61\x1e\x98\x17\xe6\x83\xf9\x61\x01\x58\x10\x16\x82\x85\x61\x11\x58\x14\x16\x83\xc5\x61\x09\x58\x12\x96\x82\xa5\x61\x19\x58\x16\x96\x83\xe5\x61\x05\x58\x11\x56\x82\x95\x61\x15\x58\x15\x56\x83\xd5\x61\x0d\x58\x13\xd6\x82\xb5\x61\x1d\x58\x17\xd6\x83\xf5\x61\x03\xd8\x10\x36\x82\x8d\x61\x13\xd8\x14\x36\x83\xcd\x61\x0b\xd8\x12\xb6\x82\xad\x61\x1b\xd8\x16\xb6\x83\xed\x61\x07\xd8\x11\x76\x82\x9d\x61\x17\xd8\x15\x76\x83\xdd\x61\x0f\xd8\x13\xf6\x82\xbd\x61\x1f\xd8\x17\xf6\x83\xfd\xe1\x00\x38\x10\x0e\x82\x83\xe1\x10\x38\x14\x0e\x83\xc3\xe1\x08\x38\x12\x8e\x82\xa3\xe1\x18\x38\x16\x8e\x83\xe3\xe1\x04\x88\x41\x1c\x12\x90\x84\x14\xa4\x21\x03\x59\xc8\x41\x1e\x0a\x50\x84\x12\x94\xa1\x02\x55\xa8\x41\x1d\x1a\xd0\x84\x16\xb4\xa1\x03\x5d\xe8\x41\x1f\x06\x30\x84\x11\x04\x10\x42\x04\x63\x38\x11\x4e\x82\x93\xe1\x14\x38\x15\x4e\x83\xd3\xe1\x0c\x38\x13\xce\x82\xb3\xe1\x1c\x38\x17\xce\x83\xf3\xe1\x02\xb8\x10\x2e\x82\x8b\xe1\x12\xb8\x14\x2e\x83\xcb\xe1\x0a\xb8\x12\xae\x82\xab\xe1\x1a\xb8\x16\xae\x83\xeb\xe1\x06\xb8\x11\x6e\x82\x9b\xe1\x16\xb8\x15\x6e\x83\xdb\xe1\x0e\xb8\x13\xee\x82\xbb\xe1\x1e\xb8\x17\xee\x83\xfb\xe1\x01\x78\x10\x1e\x82\x87\xe1\x11\x78\x14\x1e\x83\xc7\xe1\x09\x78\x12\x9e\x82\xa7\xe1\x19\x78\x16\x9e\x83\xe7\xe1\x05\x78\x11\x5e\x82\x97\xe1\x15\x78\x15\x5e\x83\xd7\xe1\x0d\x78\x13\xde\x82\xb7\xe1\x1d\x78\x17\xde\x83\xf7\xe1\x03\xf8\x10\x3e\x82\x8f\xe1\x13\xf8\x14\x3e\x83\xcf\xe1\x0b\xf8\x12\xbe\x82\xaf\xe1\x1b\xf8\x16\xbe\x83\xef\xe1\x07\xf8\x11\x7e\x82\x9f\xe1\x17\xf8\x15\x7e\x83\xdf\xe1\x0f\xf8\x13\xfe\x82\xbf\xe1\x1f\xf8\x17\xfe\x43\x89\x50\x02\xfa\x0f\x25\x46\x49\x50\x52\x94\x0c\x25\x47\x29\x50\x4a\x94\x0a\xa5\x46\x69\x50\x5a\x94\x0e\xa5\x47\x19\x50\x46\x94\x09\x65\x46\x59\x50\x56\x94\x0d\x65\x47\x39\x50\x4e\x94\x0b\xe5\x46\x79\x50\x5e\x94\x0f\xe5\x47\x05\x50\x41\x54\x08\x15\x46\x45\x50\x51\x54\x0c\x15\x47\x25\x50\x49\x54\x0a\x95\x46\x65\x50\x59\x54\x0e\x95\x47\x15\x50\x45\x54\x09\x55\x46\x55\x50\x55\x54\x0d\x55\x47\x35\x50\x4d\x54\x0b\xd5\x46\x75\x50\x5d\x54\x0f\xd5\x47\x0d\x50\x43\xd4\x08\x35\x46\x4d\x50\x53\xd4\x0c\x35\x47\x2d\x50\x4b\xd4\x0a\xb5\x46\x6d\x50\x5b\xd4\x0e\xb5\x47\x1d\x50\x47\xd4\x09\x75\x46\x5d\x50\x57\xd4\x0d\x75\x47\x3d\x50\x4f\xd4\x0b\xf5\x46\x7d\x50\x5f\xd4\x0f\xf5\x47\x03\xd0\x40\x34\x08\x0d\x46\x43\xd0\x50\x34\x0c\x0d\x47\x23\xd0\x48\x34\x0a\x8d\x46\x63\xd0\x58\x34\x0e\x8d\x47\x13\x10\x86\x70\x44\x20\x12\x51\x88\x46\x0c\x62\x11\x87\x78\x24\x20\x11\x49\x48\x46\x0a\x52\x91\x86\x74\x64\x20\x13\x59\xc8\x46\x0e\x72\x91\x87\x7c\x14\xa0\x10\x45\x08\x20\x88\x10\x8a\xd1\x44\x34\x09\x4d\x46\x53\xd0\x54\x34\x0d\x4d\x47\x33\xd0\x4c\x34\x0b\xcd\x46\x73\xd0\x5c\x34\x0f\xcd\x47\x0b\xd0\x42\xb4\x08\x2d\x46\x4b\xd0\x52\xb4\x0c\x2d\x47\x2b\xd0\x4a\xb4\x0a\xad\x46\x6b\xd0\x5a\xb4\x0e\xad\x47\x1b\xd0\x46\xb4\x09\x6d\x46\x5b\xd0\x56\xb4\x0d\x6d\x47\x3b\xd0\x4e\xb4\x0b\xed\x46\x7b\xd0\x5e\xb4\x0f\xed\x47\x07\xd0\x41\x74\x08\x1d\x46\x47\xd0\x51\x74\x0c\x1d\x47\x27\xd0\x49\x74\x0a\x9d\x46\x67\xd0\x59\x74\x0e\x9d\x47\x17\xd0\x45\x74\x09\x5d\x46\x57\xd0\x55\x74\x0d\x5d\x47\x37\xd0\x4d\x74\x0b\xdd\x46\x77\xd0\x5d\x74\x0f\xdd\x47\x0f\xd0\x43\xf4\x08\x3d\x46\x4f\xd0\x53\xf4\x0c\x3d\x47\x2f\xd0\x4b\xf4\x0a\xbd\x46\x6f\xd0\x5b\xf4\x0e\xbd\x47\x1f\xd0\x47\xf4\x09\x7d\x46\x5f\xd0\x57\xf4\x0d\x7d\x47\x3f\xd0\x4f\xf4\x0b\xfd\x46\x7f\xd0\x5f\xf4\x2f\x4e\x14\x27\xc4\xff\xc5\x89\xe3\x24\x71\xd2\x38\x59\x9c\x3c\x4e\x11\xa7\x8c\x53\xc5\xa9\xe3\x34\x71\xda\x38\x5d\x9c\x3e\xce\x10\x67\x8c\x33\xc5\x99\xe3\x2c\x71\xd6\x38\x5b\x9c\x3d\xce\x11\xe7\x8c\x73\xc5\xb9\xe3\x3c\x71\xde\x38\x5f\x9c\x3f\x2e\x10\x17\x8c\x0b\xc5\x85\xe3\x22\x71\xd1\xb8\x58\x5c\x3c\x2e\x11\x97\x8c\x4b\xc5\xa5\xe3\x32\x71\xd9\xb8\x5c\x5c\x3e\xae\x10\x57\x8c\x2b\xc5\x95\xe3\x2a\x71\xd5\xb8\x5a\x5c\x3d\xae\x11\xd7\x8c\x6b\xc5\xb5\xe3\x3a\x71\xdd\xb8\x5e\x5c\x3f\x6e\x10\x37\x8c\x1b\xc5\x8d\xe3\x26\x71\xd3\xb8\x59\xdc\x3c\x6e\x11\xb7\x8c\x5b\xc5\xad\xe3\x36\x71\xdb\xb8\x5d\xdc\x3e\xee\x10\x77\x8c\x3b\xc5\x9d\xe3\x2e\x71\xd7\xb8\x5b\xdc\x3d\xee\x11\xf7\x8c\x7b\xc5\xbd\xe3\x3e\x71\xdf\xb8\x5f\xdc\x3f\x1e\x10\x0f\x8c\x07\xc5\x83\xe3\x21\xf1\xd0\x78\x58\x3c\x3c\x1e\x11\x8f\x8c\x47\xc5\xa3\xe3\x31\xf1\xd8\x78\x5c\x3c\x3e\x9e\xf0\x3f\x01\xf0\x00\x00\x46\x08\x00\x00\x70\xb6\x6d\xdb\xb6\x6d\xdb\xb6\x6d\xdb\x6f\xdb\xaa\x7e\xb6\x6d\xdb\xb6\xed\xc3\x26\x62\x93\xb0\xc9\xd8\x14\x6c\x2a\x36\x0d\x9b\x8e\xcd\xc0\x66\x62\xb3\xb0\xd9\xd8\x1c\x6c\x2e\x36\x0f\x9b\x8f\x2d\xc0\x16\x62\x8b\xb0\xc5\xd8\x12\x6c\x29\xb6\x0c\x5b\x8e\xad\xc0\x56\x62\xab\xb0\xd5\xd8\x1a\x6c\x2d\xb6\x0e\x5b\x8f\x6d\xc0\x30\x0c\xc7\x08\x8c\xc4\x28\x8c\xc6\x18\x8c\xc5\x38\x8c\xc7\x04\x4c\xc4\x24\x4c\xc6\x14\x4c\xc5\x34\x4c\xc7\x0c\xcc\xc4\x2c\xcc\xc6\x1c\xcc\xc5\x3c\xcc\xc7\x02\x2c\xc4\x22\x0c\x60\x10\x43\x58\x8c\x6d\xc4\x36\x61\x9b\xb1\x2d\xd8\x56\x6c\x1b\xb6\x1d\xdb\x81\xed\xc4\x76\x61\xbb\xb1\x3d\xd8\x5e\x6c\x1f\xb6\x1f\x3b\x80\x1d\xc4\x0e\x61\x87\xb1\x23\xd8\x51\xec\x18\x76\x1c\x3b\x81\x9d\xc4\x4e\x61\xa7\xb1\x33\xd8\x59\xec\x1c\x76\x1e\xbb\x80\x5d\xc4\x2e\x61\x97\xb1\x2b\xd8\x55\xec\x1a\x76\x1d\xbb\x81\xdd\xc4\x6e\x61\xb7\xb1\x3b\xd8\x5d\xec\x1e\x76\x1f\x7b\x80\x3d\xc4\x1e\x61\x8f\xb1\x27\xd8\x53\xec\x19\xf6\x1c\x7b\x81\xbd\xc4\x5e\x61\xaf\xb1\x37\xd8\x5b\xec\x1d\xf6\x1e\xfb\x80\x7d\xc4\x3e\x61\x9f\xb1\x2f\xd8\x57\xec\x1b\xf6\x1d\xfb\x81\xfd\xc4\x7e\x61\xbf\xb1\x3f\xd8\x5f\xec\x1f\x9e\x00\x4f\x88\x27\xc2\x13\xe3\x49\xf0\xa4\x78\x32\x3c\x39\x9e\x02\x4f\x89\xa7\xc2\x53\xe3\x69\xf0\xb4\x78\x3a\x3c\x3d\x9e\x01\xcf\x88\x67\xc2\x33\xe3\x59\xf0\xac\x78\x36\x3c\x3b\x9e\x03\xcf\x89\xe7\xc2\x73\xe3\x79\xf0\xbc\x78\x3e\x3c\x3f\x5e\x00\x2f\x88\x17\xc2\x0b\xe3\x45\xf0\xa2\x78\x31\xbc\x38\x5e\x02\x2f\x89\x97\xc2\x4b\xe3\x65\xf0\xb2\x78\x39\xbc\x3c\x5e\x01\xaf\x88\x57\xc2\x2b\xe3\x55\xf0\xaa\x78\x35\xbc\x3a\x5e\x03\xaf\x89\xd7\xc2\x6b\xe3\x75\xf0\xba\x78\x3d\xbc\x3e\xde\x00\x6f\x88\x37\xc2\x1b\xe3\x4d\xf0\xa6\x78\x33\xbc\x39\xde\x02\x6f\x89\xb7\xc2\x5b\xe3\x6d\xf0\xb6\x78\x3b\xbc\x3d\xde\x01\xef\x88\x77\xc2\x3b\xe3\x5d\xf0\xae\x78\x37\xbc\x3b\xde\x03\xef\x89\xf7\xc2\x7b\xe3\x7d\xf0\xbe\x78\x3f\xbc\x3f\x3e\x00\x1f\x88\x0f\xc2\x07\xe3\x43\xf0\xa1\xf8\x30\x7c\x38\x3e\x02\x1f\x89\x8f\xc2\x47\xe3\x63\xf0\xb1\xf8\x38\x7c\x3c\x3e\x01\x9f\x88\x4f\xc2\x27\xe3\x53\xf0\xa9\xf8\x34\x7c\x3a\x3e\x03\x9f\x89\xcf\xc2\x67\xe3\x73\xf0\xb9\xf8\x3c\x7c\x3e\xbe\x00\x5f\x88\x2f\xc2\x17\xe3\x4b\xf0\xa5\xf8\x32\x7c\x39\xbe\x02\x5f\x89\xaf\xc2\x57\xe3\x6b\xf0\xb5\xf8\x3a\x7c\x3d\xbe\x01\xc7\x70\x1c\x27\x70\x12\xa7\x70\x1a\x67\x70\x16\xe7\x70\x1e\x17\x70\x11\x97\x70\x19\x57\x70\x15\xd7\x70\x1d\x37\x70\x13\xb7\x70\x1b\x77\x70\x17\xf7\x70\x1f\x0f\xf0\x10\x8f\x70\x80\x43\x1c\xe1\x31\xbe\x11\xdf\x84\x6f\xc6\xb7\xe0\x5b\xf1\x6d\xf8\x76\x7c\x07\xbe\x13\xdf\x85\xef\xc6\xf7\xe0\x7b\xf1\x7d\xf8\x7e\xfc\x00\x7e\x10\x3f\x84\x1f\xc6\x8f\xe0\x47\xf1\x63\xf8\x71\xfc\x04\x7e\x12\x3f\x85\x9f\xc6\xcf\xe0\x67\xf1\x73\xf8\x79\xfc\x02\x7e\x11\xbf\x84\x5f\xc6\xaf\xe0\x57\xf1\x6b\xf8\x75\xfc\x06\x7e\x13\xbf\x85\xdf\xc6\xef\xe0\x77\xf1\x7b\xf8\x7d\xfc\x01\xfe\x10\x7f\x84\x3f\xc6\x9f\xe0\x4f\xf1\x67\xf8\x73\xfc\x05\xfe\x12\x7f\x85\xbf\xc6\xdf\xe0\x6f\xf1\x77\xf8\x7b\xfc\x03\xfe\x11\xff\x84\x7f\xc6\xbf\xe0\x5f\xf1\x6f\xf8\x77\xfc\x07\xfe\x13\xff\x85\xff\xc6\xff\xe0\x7f\xf1\x7f\x44\x02\x22\x21\x91\x88\x48\x4c\x24\x21\x92\x12\xc9\x88\xe4\x44\x0a\x22\x25\x91\x8a\x48\x4d\xa4\x21\xd2\x12\xe9\x88\xf4\x44\x06\x22\x23\x91\x89\xc8\x4c\x64\x21\xb2\x12\xd9\x88\xec\x44\x0e\x22\x27\x91\x8b\xc8\x4d\xe4\x21\xf2\x12\xf9\x88\xfc\x44\x01\xa2\x20\x51\x88\x28\x4c\x14\x21\x8a\x12\xc5\x88\xe2\x44\x09\xa2\x24\x51\x8a\x28\x4d\x94\x21\xca\x12\xe5\x88\xf2\x44\x05\xa2\x22\x51\x89\xa8\x4c\x54\x21\xaa\x12\xd5\x88\xea\x44\x0d\xa2\x26\x51\x8b\xa8\x4d\xd4\x21\xea\x12\xf5\x88\xfa\x44\x03\xa2\x21\xd1\x88\x68\x4c\x34\x21\x9a\x12\xcd\x88\xe6\x44\x0b\xa2\x25\xd1\x8a\x68\x4d\xb4\x21\xda\x12\xed\x88\xf6\x44\x07\xa2\x23\xd1\x89\xe8\x4c\x74\x21\xba\x12\xdd\x88\xee\x44\x0f\xa2\x27\xd1\x8b\xe8\x4d\xf4\x21\xfa\x12\xfd\x88\xfe\xc4\x00\x62\x20\x31\x88\x18\x4c\x0c\x21\x86\x12\xc3\x88\xe1\xc4\x08\x62\x24\x31\x8a\x18\x4d\x8c\x21\xc6\x12\xe3\x88\xf1\xc4\x04\x62\x22\x31\x89\x98\x4c\x4c\x21\xa6\x12\xd3\x88\xe9\xc4\x0c\x62\x26\x31\x8b\x98\x4d\xcc\x21\xe6\x12\xf3\x88\xf9\xc4\x02\x62\x21\xb1\x88\x58\x4c\x2c\x21\x96\x12\xcb\x88\xe5\xc4\x0a\x62\x25\xb1\x8a\x58\x4d\xac\x21\xd6\x12\xeb\x88\xf5\xc4\x06\x02\x23\x70\x82\x20\x48\x82\x22\x68\x82\x21\x58\x82\x23\x78\x42\x20\x44\x42\x22\x64\x42\x21\x54\x42\x23\x74\xc2\x20\x4c\xc2\x22\x6c\xc2\x21\x5c\xc2\x23\x7c\x22\x20\x42\x22\x22\x00\x01\x09\x44\xc4\xc4\x46\x62\x13\xb1\x99\xd8\x42\x6c\x25\xb6\x11\xdb\x89\x1d\xc4\x4e\x62\x17\xb1\x9b\xd8\x43\xec\x25\xf6\x11\xfb\x89\x03\xc4\x41\xe2\x10\x71\x98\x38\x42\x1c\x25\x8e\x11\xc7\x89\x13\xc4\x49\xe2\x14\x71\x9a\x38\x43\x9c\x25\xce\x11\xe7\x89\x0b\xc4\x45\xe2\x12\x71\x99\xb8\x42\x5c\x25\xae\x11\xd7\x89\x1b\xc4\x4d\xe2\x16\x71\x9b\xb8\x43\xdc\x25\xee\x11\xf7\x89\x07\xc4\x43\xe2\x11\xf1\x98\x78\x42\x3c\x25\x9e\x11\xcf\x89\x17\xc4\x4b\xe2\x15\xf1\x9a\x78\x43\xbc\x25\xde\x11\xef\x89\x0f\xc4\x47\xe2\x13\xf1\x99\xf8\x42\x7c\x25\xbe\x11\xdf\x89\x1f\xc4\x4f\xe2\x17\xf1\x9b\xf8\x43\xfc\x25\xfe\x91\x09\xc8\x84\x64\x22\x32\x31\x99\x84\x4c\x4a\x26\x23\x93\x93\x29\xc8\x94\x64\x2a\x32\x35\x99\x86\x4c\x4b\xa6\x23\xd3\x93\x19\xc8\x8c\x64\x26\x32\x33\x99\x85\xcc\x4a\x66\x23\xb3\x93\x39\xc8\x9c\x64\x2e\x32\x37\x99\x87\xcc\x4b\xe6\x23\xf3\x93\x05\xc8\x82\x64\x21\xb2\x30\x59\x84\x2c\x4a\x16\x23\x8b\x93\x25\xc8\x92\x64\x29\xb2\x34\x59\x86\x2c\x4b\x96\x23\xcb\x93\x15\xc8\x8a\x64\x25\xb2\x32\x59\x85\xac\x4a\x56\x23\xab\x93\x35\xc8\x9a\x64\x2d\xb2\x36\x59\x87\xac\x4b\xd6\x23\xeb\x93\x0d\xc8\x86\x64\x23\xb2\x31\xd9\x84\x6c\x4a\x36\x23\x9b\x93\x2d\xc8\x96\x64\x2b\xb2\x35\xd9\x86\x6c\x4b\xb6\x23\xdb\x93\x1d\xc8\x8e\x64\x27\xb2\x33\xd9\x85\xec\x4a\x76\x23\xbb\x93\x3d\xc8\x9e\x64\x2f\xb2\x37\xd9\x87\xec\x4b\xf6\x23\xfb\x93\x03\xc8\x81\xe4\x20\x72\x30\x39\x84\x1c\x4a\x0e\x23\x87\x93\x23\xc8\x91\xe4\x28\x72\x34\x39\x86\x1c\x4b\x8e\x23\xc7\x93\x13\xc8\x89\xe4\x24\x72\x32\x39\x85\x9c\x4a\x4e\x23\xa7\x93\x33\xc8\x99\xe4\x2c\x72\x36\x39\x87\x9c\x4b\xce\x23\xe7\x93\x0b\xc8\x85\xe4\x22\x72\x31\xb9\x84\x5c\x4a\x2e\x23\x97\x93\x2b\xc8\x95\xe4\x2a\x72\x35\xb9\x86\x5c\x4b\xae\x23\xd7\x93\x1b\x48\x8c\xc4\x49\x82\x24\x49\x8a\xa4\x49\x86\x64\x49\x8e\xe4\x49\x81\x14\x49\x89\x94\x49\x85\x54\x49\x8d\xd4\x49\x83\x34\x49\x8b\xb4\x49\x87\x74\x49\x8f\xf4\xc9\x80\x0c\xc9\x88\x04\x24\x24\x11\x19\x93\x1b\xc9\x4d\xe4\x66\x72\x0b\xb9\x95\xdc\x46\x6e\x27\x77\x90\x3b\xc9\x5d\xe4\x6e\x72\x0f\xb9\x97\xdc\x47\xee\x27\x0f\x90\x07\xc9\x43\xe4\x61\xf2\x08\x79\x94\x3c\x46\x1e\x27\x4f\x90\x27\xc9\x53\xe4\x69\xf2\x0c\x79\x96\x3c\x47\x9e\x27\x2f\x90\x17\xc9\x4b\xe4\x65\xf2\x0a\x79\x95\xbc\x46\x5e\x27\x6f\x90\x37\xc9\x5b\xe4\x6d\xf2\x0e\x79\x97\xbc\x47\xde\x27\x1f\x90\x0f\xc9\x47\xe4\x63\xf2\x09\xf9\x94\x7c\x46\x3e\x27\x5f\x90\x2f\xc9\x57\xe4\x6b\xf2\x0d\xf9\x96\x7c\x47\xbe\x27\x3f\x90\x1f\xc9\x4f\xe4\x67\xf2\x0b\xf9\x95\xfc\x46\x7e\x27\x7f\x90\x3f\xc9\x5f\xe4\x6f\xf2\x0f\xf9\x97\xfc\x47\x25\xa0\x12\x52\x89\xa8\xc4\x54\x12\x2a\x29\x95\x8c\x4a\x4e\xa5\xa0\x52\x52\xa9\xa8\xd4\x54\x1a\x2a\x2d\x95\x8e\x4a\x4f\x65\xa0\x32\x52\x99\xa8\xcc\x54\x16\x2a\x2b\x95\x8d\xca\x4e\xe5\xa0\x72\x52\xb9\xa8\xdc\x54\x1e\x2a\x2f\x95\x8f\xca\x4f\x15\xa0\x0a\x52\x85\xa8\xc2\x54\x11\xaa\x28\x55\x8c\x2a\x4e\x95\xa0\x4a\x52\xa5\xa8\xd2\x54\x19\xaa\x2c\x55\x8e\x2a\x4f\x55\xa0\x2a\x52\x95\xa8\xca\x54\x15\xaa\x2a\x55\x8d\xaa\x4e\xd5\xa0\x6a\x52\xb5\xa8\xda\x54\x1d\xaa\x2e\x55\x8f\xaa\x4f\x35\xa0\x1a\x52\x8d\xa8\xc6\x54\x13\xaa\x29\xd5\x8c\x6a\x4e\xb5\xa0\x5a\x52\xad\xa8\xd6\x54\x1b\xaa\x2d\xd5\x8e\x6a\x4f\x75\xa0\x3a\x52\x9d\xa8\xce\x54\x17\xaa\x2b\xd5\x8d\xea\x4e\xf5\xa0\x7a\x52\xbd\xa8\xde\x54\x1f\xaa\x2f\xd5\x8f\xea\x4f\x0d\xa0\x06\x52\x83\xa8\xc1\xd4\x10\x6a\x28\x35\x8c\x1a\x4e\x8d\xa0\x46\x52\xa3\xa8\xd1\xd4\x18\x6a\x2c\x35\x8e\x1a\x4f\x4d\xa0\x26\x52\x93\xa8\xc9\xd4\x14\x6a\x2a\x35\x8d\x9a\x4e\xcd\xa0\x66\x52\xb3\xa8\xd9\xd4\x1c\x6a\x2e\x35\x8f\x9a\x4f\x2d\xa0\x16\x52\x8b\xa8\xc5\xd4\x12\x6a\x29\xb5\x8c\x5a\x4e\xad\xa0\x56\x52\xab\xa8\xd5\xd4\x1a\x6a\x2d\xb5\x8e\x5a\x4f\x6d\xa0\x30\x0a\xa7\x08\x8a\xa4\x28\x8a\xa6\x18\x8a\xa5\x38\x8a\xa7\x04\x4a\xa4\x24\x4a\xa6\x14\x4a\xa5\x34\x4a\xa7\x0c\xca\xa4\x2c\xca\xa6\x1c\xca\xa5\x3c\xca\xa7\x02\x2a\xa4\x22\x0a\x50\x90\x42\x54\x4c\x6d\xa4\x36\x51\x9b\xa9\x2d\xd4\x56\x6a\x1b\xb5\x9d\xda\x41\xed\xa4\x76\x51\xbb\xa9\x3d\xd4\x5e\x6a\x1f\xb5\x9f\x3a\x40\x1d\xa4\x0e\x51\x87\xa9\x23\xd4\x51\xea\x18\x75\x9c\x3a\x41\x9d\xa4\x4e\x51\xa7\xa9\x33\xd4\x59\xea\x1c\x75\x9e\xba\x40\x5d\xa4\x2e\x51\x97\xa9\x2b\xd4\x55\xea\x1a\x75\x9d\xba\x41\xdd\xa4\x6e\x51\xb7\xa9\x3b\xd4\x5d\xea\x1e\x75\x9f\x7a\x40\x3d\xa4\x1e\x51\x8f\xa9\x27\xd4\x53\xea\x19\xf5\x9c\x7a\x41\xbd\xa4\x5e\x51\xaf\xa9\x37\xd4\x5b\xea\x1d\xf5\x9e\xfa\x40\x7d\xa4\x3e\x51\x9f\xa9\x2f\xd4\x57\xea\x1b\xf5\x9d\xfa\x41\xfd\xa4\x7e\x51\xbf\xa9\x3f\xd4\x5f\xea\x1f\x9d\x80\x4e\x48\x27\xa2\x13\xd3\x49\xe8\xa4\x74\x32\x3a\x39\x9d\x82\x4e\x49\xa7\xa2\x53\xd3\x69\xe8\xb4\x74\x3a\x3a\x3d\x9d\x81\xce\x48\x67\xa2\x33\xd3\x59\xe8\xac\x74\x36\x3a\x3b\x9d\x83\xce\x49\xe7\xa2\x73\xd3\x79\xe8\xbc\x74\x3e\x3a\x3f\x5d\x80\x2e\x48\x17\xa2\x0b\xd3\x45\xe8\xa2\x74\x31\xba\x38\x5d\x82\x2e\x49\x97\xa2\x4b\xd3\x65\xe8\xb2\x74\x39\xba\x3c\x5d\x81\xae\x48\x57\xa2\x2b\xd3\x55\xe8\xaa\x74\x35\xba\x3a\x5d\x83\xae\x49\xd7\xa2\x6b\xd3\x75\xe8\xba\x74\x3d\xba\x3e\xdd\x80\x6e\x48\x37\xa2\x1b\xd3\x4d\xe8\xa6\x74\x33\xba\x39\xdd\x82\x6e\x49\xb7\xa2\x5b\xd3\x6d\xe8\xb6\x74\x3b\xba\x3d\xdd\x81\xee\x48\x77\xa2\x3b\xd3\x5d\xe8\xae\x74\x37\xba\x3b\xdd\x83\xee\x49\xf7\xa2\x7b\xd3\x7d\xe8\xbe\x74\x3f\xba\x3f\x3d\x80\x1e\x48\x0f\xa2\x07\xd3\x43\xe8\xa1\xf4\x30\x7a\x38\x3d\x82\x1e\x49\x8f\xa2\x47\xd3\x63\xe8\xb1\xf4\x38\x7a\x3c\x3d\x81\x9e\x48\x4f\xa2\x27\xd3\x53\xe8\xa9\xf4\x34\x7a\x3a\x3d\x83\x9e\x49\xcf\xa2\x67\xd3\x73\xe8\xb9\xf4\x3c\x7a\x3e\xbd\x80\x5e\x48\x2f\xa2\x17\xd3\x4b\xe8\xa5\xf4\x32\x7a\x39\xbd\x82\x5e\x49\xaf\xa2\x57\xd3\x6b\xe8\xb5\xf4\x3a\x7a\x3d\xbd\x81\xc6\x68\x9c\x26\x68\x92\xa6\x68\x9a\x66\x68\x96\xe6\x68\x9e\x16\x68\x91\x96\x68\x99\x56\x68\x95\xd6\x68\x9d\x36\x68\x93\xb6\x68\x9b\x76\x68\x97\xf6\x68\x9f\x0e\xe8\x90\x8e\x68\x40\x43\x1a\xd1\x31\xbd\x91\xde\x44\x6f\xa6\xb7\xd0\x5b\xe9\x6d\xf4\x76\x7a\x07\xbd\x93\xde\x45\xef\xa6\xf7\xd0\x7b\xe9\x7d\xf4\x7e\xfa\x00\x7d\x90\x3e\x44\x1f\xa6\x8f\xd0\x47\xe9\x63\xf4\x71\xfa\x04\x7d\x92\x3e\x45\x9f\xa6\xcf\xd0\x67\xe9\x73\xf4\x79\xfa\x02\x7d\x91\xbe\x44\x5f\xa6\xaf\xd0\x57\xe9\x6b\xf4\x75\xfa\x06\x7d\x93\xbe\x45\xdf\xa6\xef\xd0\x77\xe9\x7b\xf4\x7d\xfa\x01\xfd\x90\x7e\x44\x3f\xa6\x9f\xd0\x4f\xe9\x67\xf4\x73\xfa\x05\xfd\x92\x7e\x45\xbf\xa6\xdf\xd0\x6f\xe9\x77\xf4\x7b\xfa\x03\xfd\x91\xfe\x44\x7f\xa6\xbf\xd0\x5f\xe9\x6f\xf4\x77\xfa\x07\xfd\x93\xfe\x45\xff\xa6\xff\xd0\x7f\xe9\x7f\x4c\x02\x26\x21\x93\x88\x49\xcc\x24\x61\x92\x32\xc9\x98\xe4\x4c\x0a\x26\x25\x93\x8a\x49\xcd\xa4\x61\xd2\x32\xe9\x98\xf4\x4c\x06\x26\x23\x93\x89\xc9\xcc\x64\x61\xb2\x32\xd9\x98\xec\x4c\x0e\x26\x27\x93\x8b\xc9\xcd\xe4\x61\xf2\x32\xf9\x98\xfc\x4c\x01\xa6\x20\x53\x88\x29\xcc\x14\x61\x8a\x32\xc5\x98\xe2\x4c\x09\xa6\x24\x53\x8a\x29\xcd\x94\x61\xca\x32\xe5\x98\xf2\x4c\x05\xa6\x22\x53\x89\xa9\xcc\x54\x61\xaa\x32\xd5\x98\xea\x4c\x0d\xa6\x26\x53\x8b\xa9\xcd\xd4\x61\xea\x32\xf5\x98\xfa\x4c\x03\xa6\x21\xd3\x88\x69\xcc\x34\x61\x9a\x32\xcd\x98\xe6\x4c\x0b\xa6\x25\xd3\x8a\x69\xcd\xb4\x61\xda\x32\xed\x98\xf6\x4c\x07\xa6\x23\xd3\x89\xe9\xcc\x74\x61\xba\x32\xdd\x98\xee\x4c\x0f\xa6\x27\xd3\x8b\xe9\xcd\xf4\x61\xfa\x32\xfd\x98\xfe\xcc\x00\x66\x20\x33\x88\x19\xcc\x0c\x61\x86\x32\xc3\x98\xe1\xcc\x08\x66\x24\x33\x8a\x19\xcd\x8c\x61\xc6\x32\xe3\x98\xf1\xcc\x04\x66\x22\x33\x89\x99\xcc\x4c\x61\xa6\x32\xd3\x98\xe9\xcc\x0c\x66\x26\x33\x8b\x99\xcd\xcc\x61\xe6\x32\xf3\x98\xf9\xcc\x02\x66\x21\xb3\x88\x59\xcc\x2c\x61\x96\x32\xcb\x98\xe5\xcc\x0a\x66\x25\xb3\x8a\x59\xcd\xac\x61\xd6\x32\xeb\x98\xf5\xcc\x06\x06\x63\x70\x86\x60\x48\x86\x62\x68\x86\x61\x58\x86\x63\x78\x46\x60\x44\x46\x62\x64\x46\x61\x54\x46\x63\x74\xc6\x60\x4c\xc6\x62\x6c\xc6\x61\x5c\xc6\x63\x7c\x26\x60\x42\x26\x62\x00\x03\x19\xc4\xc4\xcc\x46\x66\x13\xb3\x99\xd9\xc2\x6c\x65\xb6\x31\xdb\x99\x1d\xcc\x4e\x66\x17\xb3\x9b\xd9\xc3\xec\x65\xf6\x31\xfb\x99\x03\xcc\x41\xe6\x10\x73\x98\x39\xc2\x1c\x65\x8e\x31\xc7\x99\x13\xcc\x49\xe6\x14\x73\x9a\x39\xc3\x9c\x65\xce\x31\xe7\x99\x0b\xcc\x45\xe6\x12\x73\x99\xb9\xc2\x5c\x65\xae\x31\xd7\x99\x1b\xcc\x4d\xe6\x16\x73\x9b\xb9\xc3\xdc\x65\xee\x31\xf7\x99\x07\xcc\x43\xe6\x11\xf3\x98\x79\xc2\x3c\x65\x9e\x31\xcf\x99\x17\xcc\x4b\xe6\x15\xf3\x9a\x79\xc3\xbc\x65\xde\x31\xef\x99\x0f\xcc\x47\xe6\x13\xf3\x99\xf9\xc2\x7c\x65\xbe\x31\xdf\x99\x1f\xcc\x4f\xe6\x17\xf3\x9b\xf9\xc3\xfc\x65\xfe\xb1\x09\xd8\x84\x6c\x22\x36\x31\x9b\x84\x4d\xca\x26\x63\x93\xb3\x29\xd8\x94\x6c\x2a\x36\x35\x9b\x86\x4d\xcb\xa6\x63\xd3\xb3\x19\xd8\x8c\x6c\x26\x36\x33\x9b\x85\xcd\xca\x66\x63\xb3\xb3\x39\xd8\x9c\x6c\x2e\x36\x37\x9b\x87\xcd\xcb\xe6\x63\xf3\xb3\x05\xd8\x82\x6c\x21\xb6\x30\x5b\x84\x2d\xca\x16\x63\x8b\xb3\x25\xd8\x92\x6c\x29\xb6\x34\x5b\x86\x2d\xcb\x96\x63\xcb\xb3\x15\xd8\x8a\x6c\x25\xb6\x32\x5b\x85\xad\xca\x56\x63\xab\xb3\x35\xd8\x9a\x6c\x2d\xb6\x36\x5b\x87\xad\xcb\xd6\x63\xeb\xb3\x0d\xd8\x86\x6c\x23\xb6\x31\xdb\x84\x6d\xca\x36\x63\x9b\xb3\x2d\xd8\x96\x6c\x2b\xb6\x35\xdb\x86\x6d\xcb\xb6\x63\xdb\xb3\x1d\xd8\x8e\x6c\x27\xb6\x33\xdb\x85\xed\xca\x76\x63\xbb\xb3\x3d\xd8\x9e\x6c\x2f\xb6\x37\xdb\x87\xed\xcb\xf6\x63\xfb\xb3\x03\xd8\x81\xec\x20\x76\x30\x3b\x84\x1d\xca\x0e\x63\x87\xb3\x23\xd8\x91\xec\x28\x76\x34\x3b\x86\x1d\xcb\x8e\x63\xc7\xb3\x13\xd8\x89\xec\x24\x76\x32\x3b\x85\x9d\xca\x4e\x63\xa7\xb3\x33\xd8\x99\xec\x2c\x76\x36\x3b\x87\x9d\xcb\xce\x63\xe7\xb3\x0b\xd8\x85\xec\x22\x76\x31\xbb\x84\x5d\xca\x2e\x63\x97\xb3\x2b\xd8\x95\xec\x2a\x76\x35\xbb\x86\x5d\xcb\xae\x63\xd7\xb3\x1b\x58\x8c\xc5\x59\x82\x25\x59\x8a\xa5\x59\x86\x65\x59\x8e\xe5\x59\x81\x15\x59\x89\x95\x59\x85\x55\x59\x8d\xd5\x59\x83\x35\x59\x8b\xb5\x59\x87\x75\x59\x8f\xf5\xd9\x80\x0d\xd9\x88\x05\x2c\x64\x11\x1b\xb3\x1b\xd9\x4d\xec\x66\x76\x0b\xbb\x95\xdd\xc6\x6e\x67\x77\xb0\x3b\xd9\x5d\xec\x6e\x76\x0f\xbb\x97\xdd\xc7\xee\x67\x0f\xb0\x07\xd9\x43\xec\x61\xf6\x08\x7b\x94\x3d\xc6\x1e\x67\x4f\xb0\x27\xd9\x53\xec\x69\xf6\x0c\x7b\x96\x3d\xc7\x9e\x67\x2f\xb0\x17\xd9\x4b\xec\x65\xf6\x0a\x7b\x95\xbd\xc6\x5e\x67\x6f\xb0\x37\xd9\x5b\xec\x6d\xf6\x0e\x7b\x97\xbd\xc7\xde\x67\x1f\xb0\x0f\xd9\x47\xec\x63\xf6\x09\xfb\x94\x7d\xc6\x3e\x67\x5f\xb0\x2f\xd9\x57\xec\x6b\xf6\x0d\xfb\x96\x7d\xc7\xbe\x67\x3f\xb0\x1f\xd9\x4f\xec\x67\xf6\x0b\xfb\x95\xfd\xc6\x7e\x67\x7f\xb0\x3f\xd9\x5f\xec\x6f\xf6\x0f\xfb\x97\xfd\xc7\x25\xe0\x12\x72\x89\xb8\xc4\x5c\x12\x2e\x29\x97\x8c\x4b\xce\xa5\xe0\x52\x72\xa9\xb8\xd4\x5c\x1a\x2e\x2d\x97\x8e\x4b\xcf\x65\xe0\x32\x72\x99\xb8\xcc\x5c\x16\x2e\x2b\x97\x8d\xcb\xce\xe5\xe0\x72\x72\xb9\xb8\xdc\x5c\x1e\x2e\x2f\x97\x8f\xcb\xcf\x15\xe0\x0a\x72\x85\xb8\xc2\x5c\x11\xae\x28\x57\x8c\x2b\xce\x95\xe0\x4a\x72\xa5\xb8\xd2\x5c\x19\xae\x2c\x57\x8e\x2b\xcf\x55\xe0\x2a\x72\x95\xb8\xca\x5c\x15\xae\x2a\x57\x8d\xab\xce\xd5\xe0\x6a\x72\xb5\xb8\xda\x5c\x1d\xae\x2e\x57\x8f\xab\xcf\x35\xe0\x1a\x72\x8d\xb8\xc6\x5c\x13\xae\x29\xd7\x8c\x6b\xce\xb5\xe0\x5a\x72\xad\xb8\xd6\x5c\x1b\xae\x2d\xd7\x8e\x6b\xcf\x75\xe0\x3a\x72\x9d\xb8\xce\x5c\x17\xae\x2b\xd7\x8d\xeb\xce\xf5\xe0\x7a\x72\xbd\xb8\xde\x5c\x1f\xae\x2f\xd7\x8f\xeb\xcf\x0d\xe0\x06\x72\x83\xb8\xc1\xdc\x10\x6e\x28\x37\x8c\x1b\xce\x8d\xe0\x46\x72\xa3\xb8\xd1\xdc\x18\x6e\x2c\x37\x8e\x1b\xcf\x4d\xe0\x26\x72\x93\xb8\xc9\xdc\x14\x6e\x2a\x37\x8d\x9b\xce\xcd\xe0\x66\x72\xb3\xb8\xd9\xdc\x1c\x6e\x2e\x37\x8f\x9b\xcf\x2d\xe0\x16\x72\x8b\xb8\xc5\xdc\x12\x6e\x29\xb7\x8c\x5b\xce\xad\xe0\x56\x72\xab\xb8\xd5\xdc\x1a\x6e\x2d\xb7\x8e\x5b\xcf\x6d\xe0\x30\x0e\xe7\x08\x8e\xe4\x28\x8e\xe6\x18\x8e\xe5\x38\x8e\xe7\x04\x4e\xe4\x24\x4e\xe6\x14\x4e\xe5\x34\x4e\xe7\x0c\xce\xe4\x2c\xce\xe6\x1c\xce\xe5\x3c\xce\xe7\x02\x2e\xe4\x22\x0e\x70\x90\x43\x5c\xcc\x6d\xe4\x36\x71\x9b\xb9\x2d\xdc\x56\x6e\x1b\xb7\x9d\xdb\xc1\xed\xe4\x76\x71\xbb\xb9\x3d\xdc\x5e\x6e\x1f\xb7\x9f\x3b\xc0\x1d\xe4\x0e\x71\x87\xb9\x23\xdc\x51\xee\x18\x77\x9c\x3b\xc1\x9d\xe4\x4e\x71\xa7\xb9\x33\xdc\x59\xee\x1c\x77\x9e\xbb\xc0\x5d\xe4\x2e\x71\x97\xb9\x2b\xdc\x55\xee\x1a\x77\x9d\xbb\xc1\xdd\xe4\x6e\x71\xb7\xb9\x3b\xdc\x5d\xee\x1e\x77\x9f\x7b\xc0\x3d\xe4\x1e\x71\x8f\xb9\x27\xdc\x53\xee\x19\xf7\x9c\x7b\xc1\xbd\xe4\x5e\x71\xaf\xb9\x37\xdc\x5b\xee\x1d\xf7\x9e\xfb\xc0\x7d\xe4\x3e\x71\x9f\xb9\x2f\xdc\x57\xee\x1b\xf7\x9d\xfb\xc1\xfd\xe4\x7e\x71\xbf\xb9\x3f\xdc\x5f\xee\x1f\x9f\x80\x4f\xc8\x27\xe2\x13\xf3\x49\xf8\xa4\x7c\x32\x3e\x39\x9f\x82\x4f\xc9\xa7\xe2\x53\xf3\x69\xf8\xb4\x7c\x3a\x3e\x3d\x9f\x81\xcf\xc8\x67\xe2\x33\xf3\x59\xf8\xac\x7c\x36\x3e\x3b\x9f\x83\xcf\xc9\xe7\xe2\x73\xf3\x79\xf8\xbc\x7c\x3e\x3e\x3f\x5f\x80\x2f\xc8\x17\xe2\x0b\xf3\x45\xf8\xa2\x7c\x31\xbe\x38\x5f\x82\x2f\xc9\x97\xe2\x4b\xf3\x65\xf8\xb2\x7c\x39\xbe\x3c\x5f\x81\xaf\xc8\x57\xe2\x2b\xf3\x55\xf8\xaa\x7c\x35\xbe\x3a\x5f\x83\xaf\xc9\xd7\xe2\x6b\xf3\x75\xf8\xba\x7c\x3d\xbe\x3e\xdf\x80\x6f\xc8\x37\xe2\x1b\xf3\x4d\xf8\xa6\x7c\x33\xbe\x39\xdf\x82\x6f\xc9\xb7\xe2\x5b\xf3\x6d\xf8\xb6\x7c\x3b\xbe\x3d\xdf\x81\xef\xc8\x77\xe2\x3b\xf3\x5d\xf8\xae\x7c\x37\xbe\x3b\xdf\x83\xef\xc9\xf7\xe2\x7b\xf3\x7d\xf8\xbe\x7c\x3f\xbe\x3f\x3f\x80\x1f\xc8\x0f\xe2\x07\xf3\x43\xf8\xa1\xfc\x30\x7e\x38\x3f\x82\x1f\xc9\x8f\xe2\x47\xf3\x63\xf8\xb1\xfc\x38\x7e\x3c\x3f\x81\x9f\xc8\x4f\xe2\x27\xf3\x53\xf8\xa9\xfc\x34\x7e\x3a\x3f\x83\x9f\xc9\xcf\xe2\x67\xf3\x73\xf8\xb9\xfc\x3c\x7e\x3e\xbf\x80\x5f\xc8\x2f\xe2\x17\xf3\x4b\xf8\xa5\xfc\x32\x7e\x39\xbf\x82\x5f\xc9\xaf\xe2\x57\xf3\x6b\xf8\xb5\xfc\x3a\x7e\x3d\xbf\x81\xc7\x78\x9c\x27\x78\x92\xa7\x78\x9a\x67\x78\x96\xe7\x78\x9e\x17\x78\x91\x97\x78\x99\x57\x78\x95\xd7\x78\x9d\x37\x78\x93\xb7\x78\x9b\x77\x78\x97\xf7\x78\x9f\x0f\xf8\x90\x8f\x78\xc0\x43\x1e\xf1\x31\xbf\x91\xdf\xc4\x6f\xe6\xb7\xf0\x5b\xf9\x6d\xfc\x76\x7e\x07\xbf\x93\xdf\xc5\xef\xe6\xf7\xf0\x7b\xf9\x7d\xfc\x7e\xfe\x00\x7f\x90\x3f\xc4\x1f\xe6\x8f\xf0\x47\xf9\x63\xfc\x71\xfe\x04\x7f\x92\x3f\xc5\x9f\xe6\xcf\xf0\x67\xf9\x73\xfc\x79\xfe\x02\x7f\x91\xbf\xc4\x5f\xe6\xaf\xf0\x57\xf9\x6b\xfc\x75\xfe\x06\x7f\x93\xbf\xc5\xdf\xe6\xef\xf0\x77\xf9\x7b\xfc\x7d\xfe\x01\xff\x90\x7f\xc4\x3f\xe6\x9f\xf0\x4f\xf9\x67\xfc\x73\xfe\x05\xff\x92\x7f\xc5\xbf\xe6\xdf\xf0\x6f\xf9\x77\xfc\x7b\xfe\x03\xff\x91\xff\xc4\x7f\xe6\xbf\xf0\x5f\xf9\x6f\xfc\x77\xfe\x07\xff\x93\xff\xc5\xff\xe6\xff\xf0\x7f\xf9\x7f\x42\x02\x21\xa1\x90\x48\x48\x2c\x24\x11\x92\x0a\xc9\x84\xe4\x42\x0a\x21\xa5\x90\x4a\x48\x2d\xa4\x11\xd2\x0a\xe9\x84\xf4\x42\x06\x21\xa3\x90\x49\xc8\x2c\x64\x11\xb2\x0a\xd9\x84\xec\x42\x0e\x21\xa7\x90\x4b\xc8\x2d\xe4\x11\xf2\x0a\xf9\x84\xfc\x42\x01\xa1\xa0\x50\x48\x28\x2c\x14\x11\x8a\x0a\xc5\x84\xe2\x42\x09\xa1\xa4\x50\x4a\x28\x2d\x94\x11\xca\x0a\xe5\x84\xf2\x42\x05\xa1\xa2\x50\x49\xa8\x2c\x54\x11\xaa\x0a\xd5\x84\xea\x42\x0d\xa1\xa6\x50\x4b\xa8\x2d\xd4\x11\xea\x0a\xf5\x84\xfa\x42\x03\xa1\xa1\xd0\x48\x68\x2c\x34\x11\x9a\x0a\xcd\x84\xe6\x42\x0b\xa1\xa5\xd0\x4a\x68\x2d\xb4\x11\xda\x0a\xed\x84\xf6\x42\x07\xa1\xa3\xd0\x49\xe8\x2c\x74\x11\xba\x0a\xdd\x84\xee\x42\x0f\xa1\xa7\xd0\x4b\xe8\x2d\xf4\x11\xfa\x0a\xfd\x84\xfe\xc2\x00\x61\xa0\x30\x48\x18\x2c\x0c\x11\x86\x0a\xc3\x84\xe1\xc2\x08\x61\xa4\x30\x4a\x18\x2d\x8c\x11\xc6\x0a\xe3\x84\xf1\xc2\x04\x61\xa2\x30\x49\x98\x2c\x4c\x11\xa6\x0a\xd3\x84\xe9\xc2\x0c\x61\xa6\x30\x4b\x98\x2d\xcc\x11\xe6\x0a\xf3\x84\xf9\xc2\x02\x61\xa1\xb0\x48\x58\x2c\x2c\x11\x96\x0a\xcb\x84\xe5\xc2\x0a\x61\xa5\xb0\x4a\x58\x2d\xac\x11\xd6\x0a\xeb\x84\xf5\xc2\x06\x01\x13\x70\x81\x10\x48\x81\x12\x68\x81\x11\x58\x81\x13\x78\x41\x10\x44\x41\x12\x64\x41\x11\x54\x41\x13\x74\xc1\x10\x4c\xc1\x12\x6c\xc1\x11\x5c\xc1\x13\x7c\x21\x10\x42\x21\x12\x80\x00\x05\x24\xc4\xc2\x46\x61\x93\xb0\x59\xd8\x22\x6c\x15\xb6\x09\xdb\x85\x1d\xc2\x4e\x61\x97\xb0\x5b\xd8\x23\xec\x15\xf6\x09\xfb\x85\x03\xc2\x41\xe1\x90\x70\x58\x38\x22\x1c\x15\x8e\x09\xc7\x85\x13\xc2\x49\xe1\x94\x70\x5a\x38\x23\x9c\x15\xce\x09\xe7\x85\x0b\xc2\x45\xe1\x92\x70\x59\xb8\x22\x5c\x15\xae\x09\xd7\x85\x1b\xc2\x4d\xe1\x96\x70\x5b\xb8\x23\xdc\x15\xee\x09\xf7\x85\x07\xc2\x43\xe1\x91\xf0\x58\x78\x22\x3c\x15\x9e\x09\xcf\x85\x17\xc2\x4b\xe1\x95\xf0\x5a\x78\x23\xbc\x15\xde\x09\xef\x85\x0f\xc2\x47\xe1\x93\xf0\x59\xf8\x22\x7c\x15\xbe\x09\xdf\x85\x1f\xc2\x4f\xe1\x97\xf0\x5b\xf8\x23\xfc\x15\xfe\x89\x09\xc4\x84\x62\x22\x31\xb1\x98\x44\x4c\x2a\x26\x13\x93\x8b\x29\xc4\x94\x62\x2a\x31\xb5\x98\x46\x4c\x2b\xa6\x13\xd3\x8b\x19\xc4\x8c\x62\x26\x31\xb3\x98\x45\xcc\x2a\x66\x13\xb3\x8b\x39\xc4\x9c\x62\x2e\x31\xb7\x98\x47\xcc\x2b\xe6\x13\xf3\x8b\x05\xc4\x82\x62\x21\xb1\xb0\x58\x44\x2c\x2a\x16\x13\x8b\x8b\x25\xc4\x92\x62\x29\xb1\xb4\x58\x46\x2c\x2b\x96\x13\xcb\x8b\x15\xc4\x8a\x62\x25\xb1\xb2\x58\x45\xac\x2a\x56\x13\xab\x8b\x35\xc4\x9a\x62\x2d\xb1\xb6\x58\x47\xac\x2b\xd6\x13\xeb\x8b\x0d\xc4\x86\x62\x23\xb1\xb1\xd8\x44\x6c\x2a\x36\x13\x9b\x8b\x2d\xc4\x96\x62\x2b\xb1\xb5\xd8\x46\x6c\x2b\xb6\x13\xdb\x8b\x1d\xc4\x8e\x62\x27\xb1\xb3\xd8\x45\xec\x2a\x76\x13\xbb\x8b\x3d\xc4\x9e\x62\x2f\xb1\xb7\xd8\x47\xec\x2b\xf6\x13\xfb\x8b\x03\xc4\x81\xe2\x20\x71\xb0\x38\x44\x1c\x2a\x0e\x13\x87\x8b\x23\xc4\x91\xe2\x28\x71\xb4\x38\x46\x1c\x2b\x8e\x13\xc7\x8b\x13\xc4\x89\xe2\x24\x71\xb2\x38\x45\x9c\x2a\x4e\x13\xa7\x8b\x33\xc4\x99\xe2\x2c\x71\xb6\x38\x47\x9c\x2b\xce\x13\xe7\x8b\x0b\xc4\x85\xe2\x22\x71\xb1\xb8\x44\x5c\x2a\x2e\x13\x97\x8b\x2b\xc4\x95\xe2\x2a\x71\xb5\xb8\x46\x5c\x2b\xae\x13\xd7\x8b\x1b\x44\x4c\xc4\x45\x42\x24\x45\x4a\xa4\x45\x46\x64\x45\x4e\xe4\x45\x41\x14\x45\x49\x94\x45\x45\x54\x45\x4d\xd4\x45\x43\x34\x45\x4b\xb4\x45\x47\x74\x45\x4f\xf4\xc5\x40\x0c\xc5\x48\x04\x22\x14\x91\x18\x8b\x1b\xc5\x4d\xe2\x66\x71\x8b\xb8\x55\xdc\x26\x6e\x17\x77\x88\x3b\xc5\x5d\xe2\x6e\x71\x8f\xb8\x57\xdc\x27\xee\x17\x0f\x88\x07\xc5\x43\xe2\x61\xf1\x88\x78\x54\x3c\x26\x1e\x17\x4f\x88\x27\xc5\x53\xe2\x69\xf1\x8c\x78\x56\x3c\x27\x9e\x17\x2f\x88\x17\xc5\x4b\xe2\x65\xf1\x8a\x78\x55\xbc\x26\x5e\x17\x6f\x88\x37\xc5\x5b\xe2\x6d\xf1\x8e\x78\x57\xbc\x27\xde\x17\x1f\x88\x0f\xc5\x47\xe2\x63\xf1\x89\xf8\x54\x7c\x26\x3e\x17\x5f\x88\x2f\xc5\x57\xe2\x6b\xf1\x8d\xf8\x56\x7c\x27\xbe\x17\x3f\x88\x1f\xc5\x4f\xe2\x67\xf1\x8b\xf8\x55\xfc\x26\x7e\x17\x7f\x88\x3f\xc5\x5f\xe2\x6f\xf1\x8f\xf8\x57\xfc\x27\x25\x90\x12\x4a\x89\xa4\xc4\x52\x12\x29\xa9\x94\x4c\x4a\x2e\xa5\x90\x52\x4a\xa9\xa4\xd4\x52\x1a\x29\xad\x94\x4e\x4a\x2f\x65\x90\x32\x4a\x99\xa4\xcc\x52\x16\x29\xab\x94\x4d\xca\x2e\xe5\x90\x72\x4a\xb9\xa4\xdc\x52\x1e\x29\xaf\x94\x4f\xca\x2f\x15\x90\x0a\x4a\x85\xa4\xc2\x52\x11\xa9\xa8\x54\x4c\x2a\x2e\x95\x90\x4a\x4a\xa5\xa4\xd2\x52\x19\xa9\xac\x54\x4e\x2a\x2f\x55\x90\x2a\x4a\x95\xa4\xca\x52\x15\xa9\xaa\x54\x4d\xaa\x2e\xd5\x90\x6a\x4a\xb5\xa4\xda\x52\x1d\xa9\xae\x54\x4f\xaa\x2f\x35\x90\x1a\x4a\x8d\xa4\xc6\x52\x13\xa9\xa9\xd4\x4c\x6a\x2e\xb5\x90\x5a\x4a\xad\xa4\xd6\x52\x1b\xa9\xad\xd4\x4e\x6a\x2f\x75\x90\x3a\x4a\x9d\xa4\xce\x52\x17\xa9\xab\xd4\x4d\xea\x2e\xf5\x90\x7a\x4a\xbd\xa4\xde\x52\x1f\xa9\xaf\xd4\x4f\xea\x2f\x0d\x90\x06\x4a\x83\xa4\xc1\xd2\x10\x69\xa8\x34\x4c\x1a\x2e\x8d\x90\x46\x4a\xa3\xa4\xd1\xd2\x18\x69\xac\x34\x4e\x1a\x2f\x4d\x90\x26\x4a\x93\xa4\xc9\xd2\x14\x69\xaa\x34\x4d\x9a\x2e\xcd\x90\x66\x4a\xb3\xa4\xd9\xd2\x1c\x69\xae\x34\x4f\x9a\x2f\x2d\x90\x16\x4a\x8b\xa4\xc5\xd2\x12\x69\xa9\xb4\x4c\x5a\x2e\xad\x90\x56\x4a\xab\xa4\xd5\xd2\x1a\x69\xad\xb4\x4e\x5a\x2f\x6d\x90\x30\x09\x97\x08\x89\x94\x28\x89\x96\x18\x89\x95\x38\x89\x97\x04\x49\x94\x24\x49\x96\x14\x49\x95\x34\x49\x97\x0c\xc9\x94\x2c\xc9\x96\x1c\xc9\x95\x3c\xc9\x97\x02\x29\x94\x22\x09\x48\x50\x42\x52\x2c\x6d\x94\x36\x49\x9b\xa5\x2d\xd2\x56\x69\x9b\xb4\x5d\xda\x21\xed\x94\x76\x49\xbb\xa5\x3d\xd2\x5e\x69\x9f\xb4\x5f\x3a\x20\x1d\x94\x0e\x49\x87\xa5\x23\xd2\x51\xe9\x98\x74\x5c\x3a\x21\x9d\x94\x4e\x49\xa7\xa5\x33\xd2\x59\xe9\x9c\x74\x5e\xba\x20\x5d\x94\x2e\x49\x97\xa5\x2b\xd2\x55\xe9\x9a\x74\x5d\xba\x21\xdd\x94\x6e\x49\xb7\xa5\x3b\xd2\x5d\xe9\x9e\x74\x5f\x7a\x20\x3d\x94\x1e\x49\x8f\xa5\x27\xd2\x53\xe9\x99\xf4\x5c\x7a\x21\xbd\x94\x5e\x49\xaf\xa5\x37\xd2\x5b\xe9\x9d\xf4\x5e\xfa\x20\x7d\x94\x3e\x49\x9f\xa5\x2f\xd2\x57\xe9\x9b\xf4\x5d\xfa\x21\xfd\x94\x7e\x49\xbf\xa5\x3f\xd2\x5f\xe9\x9f\x9c\x40\x4e\x28\x27\x92\x13\xcb\x49\xe4\xa4\x72\x32\x39\xb9\x9c\x42\x4e\x29\xa7\x92\x53\xcb\x69\xe4\xb4\x72\x3a\x39\xbd\x9c\x41\xce\x28\x67\x92\x33\xcb\x59\xe4\xac\x72\x36\x39\xbb\x9c\x43\xce\x29\xe7\x92\x73\xcb\x79\xe4\xbc\x72\x3e\x39\xbf\x5c\x40\x2e\x28\x17\x92\x0b\xcb\x45\xe4\xa2\x72\x31\xb9\xb8\x5c\x42\x2e\x29\x97\x92\x4b\xcb\x65\xe4\xb2\x72\x39\xb9\xbc\x5c\x41\xae\x28\x57\x92\x2b\xcb\x55\xe4\xaa\x72\x35\xb9\xba\x5c\x43\xae\x29\xd7\x92\x6b\xcb\x75\xe4\xba\x72\x3d\xb9\xbe\xdc\x40\x6e\x28\x37\x92\x1b\xcb\x4d\xe4\xa6\x72\x33\xb9\xb9\xdc\x42\x6e\x29\xb7\x92\x5b\xcb\x6d\xe4\xb6\x72\x3b\xb9\xbd\xdc\x41\xee\x28\x77\x92\x3b\xcb\x5d\xe4\xae\x72\x37\xb9\xbb\xdc\x43\xee\x29\xf7\x92\x7b\xcb\x7d\xe4\xbe\x72\x3f\xb9\xbf\x3c\x40\x1e\x28\x0f\x92\x07\xcb\x43\xe4\xa1\xf2\x30\x79\xb8\x3c\x42\x1e\x29\x8f\x92\x47\xcb\x63\xe4\xb1\xf2\x38\x79\xbc\x3c\x41\x9e\x28\x4f\x92\x27\xcb\x53\xe4\xa9\xf2\x34\x79\xba\x3c\x43\x9e\x29\xcf\x92\x67\xcb\x73\xe4\xb9\xf2\x3c\x79\xbe\xbc\x40\x5e\x28\x2f\x92\x17\xcb\x4b\xe4\xa5\xf2\x32\x79\xb9\xbc\x42\x5e\x29\xaf\x92\x57\xcb\x6b\xe4\xb5\xf2\x3a\x79\xbd\xbc\x41\xc6\x64\x5c\x26\x64\x52\xa6\x64\x5a\x66\x64\x56\xe6\x64\x5e\x16\x64\x51\x96\x64\x59\x56\x64\x55\xd6\x64\x5d\x36\x64\x53\xb6\x64\x5b\x76\x64\x57\xf6\x64\x5f\x0e\xe4\x50\x8e\x64\x20\x43\x19\xc9\xb1\xbc\x51\xde\x24\x6f\x96\xb7\xc8\x5b\xe5\x6d\xf2\x76\x79\x87\xbc\x53\xde\x25\xef\x96\xf7\xc8\x7b\xe5\x7d\xf2\x7e\xf9\x80\x7c\x50\x3e\x24\x1f\x96\x8f\xc8\x47\xe5\x63\xf2\x71\xf9\x84\x7c\x52\x3e\x25\x9f\x96\xcf\xc8\x67\xe5\x73\xf2\x79\xf9\x82\x7c\x51\xbe\x24\x5f\x96\xaf\xc8\x57\xe5\x6b\xf2\x75\xf9\x86\x7c\x53\xbe\x25\xdf\x96\xef\xc8\x77\xe5\x7b\xf2\x7d\xf9\x81\xfc\x50\x7e\x24\x3f\x96\x9f\xc8\x4f\xe5\x67\xf2\x73\xf9\x85\xfc\x52\x7e\x25\xbf\x96\xdf\xc8\x6f\xe5\x77\xf2\x7b\xf9\x83\xfc\x51\xfe\x24\x7f\x96\xbf\xc8\x5f\xe5\x6f\xf2\x77\xf9\x87\xfc\x53\xfe\x25\xff\x96\xff\xc8\x7f\xe5\x7f\x4a\x02\x25\xa1\x92\x48\x49\xac\x24\x51\x92\x2a\xc9\x94\xe4\x4a\x0a\x25\xa5\x92\x4a\x49\xad\xa4\x51\xd2\x2a\xe9\x94\xf4\x4a\x06\x25\xa3\x92\x49\xc9\xac\x64\x51\xb2\x2a\xd9\x94\xec\x4a\x0e\x25\xa7\x92\x4b\xc9\xad\xe4\x51\xf2\x2a\xf9\x94\xfc\x4a\x01\xa5\xa0\x52\x48\x29\xac\x14\x51\x8a\x2a\xc5\x94\xe2\x4a\x09\xa5\xa4\x52\x4a\x29\xad\x94\x51\xca\x2a\xe5\x94\xf2\x4a\x05\xa5\xa2\x52\x49\xa9\xac\x54\x51\xaa\x2a\xd5\x94\xea\x4a\x0d\xa5\xa6\x52\x4b\xa9\xad\xd4\x51\xea\x2a\xf5\x94\xfa\x4a\x03\xa5\xa1\xd2\x48\x69\xac\x34\x51\x9a\x2a\xcd\x94\xe6\x4a\x0b\xa5\xa5\xd2\x4a\x69\xad\xb4\x51\xda\x2a\xed\x94\xf6\x4a\x07\xa5\xa3\xd2\x49\xe9\xac\x74\x51\xba\x2a\xdd\x94\xee\x4a\x0f\xa5\xa7\xd2\x4b\xe9\xad\xf4\x51\xfa\x2a\xfd\x94\xfe\xca\x00\x65\xa0\x32\x48\x19\xac\x0c\x51\x86\x2a\xc3\x94\xe1\xca\x08\x65\xa4\x32\x4a\x19\xad\x8c\x51\xc6\x2a\xe3\x94\xf1\xca\x04\x65\xa2\x32\x49\x99\xac\x4c\x51\xa6\x2a\xd3\x94\xe9\xca\x0c\x65\xa6\x32\x4b\x99\xad\xcc\x51\xe6\x2a\xf3\x94\xf9\xca\x02\x65\xa1\xb2\x48\x59\xac\x2c\x51\x96\x2a\xcb\x94\xe5\xca\x0a\x65\xa5\xb2\x4a\x59\xad\xac\x51\xd6\x2a\xeb\x94\xf5\xca\x06\x05\x53\x70\x85\x50\x48\x85\x52\x68\x85\x51\x58\x85\x53\x78\x45\x50\x44\x45\x52\x64\x45\x51\x54\x45\x53\x74\xc5\x50\x4c\xc5\x52\x6c\xc5\x51\x5c\xc5\x53\x7c\x25\x50\x42\x25\x52\x80\x02\x15\xa4\xc4\xca\x46\x65\x93\xb2\x59\xd9\xa2\x6c\x55\xb6\x29\xdb\x95\x1d\xca\x4e\x65\x97\xb2\x5b\xd9\xa3\xec\x55\xf6\x29\xfb\x95\x03\xca\x41\xe5\x90\x72\x58\x39\xa2\x1c\x55\x8e\x29\xc7\x95\x13\xca\x49\xe5\x94\x72\x5a\x39\xa3\x9c\x55\xce\x29\xe7\x95\x0b\xca\x45\xe5\x92\x72\x59\xb9\xa2\x5c\x55\xae\x29\xd7\x95\x1b\xca\x4d\xe5\x96\x72\x5b\xb9\xa3\xdc\x55\xee\x29\xf7\x95\x07\xca\x43\xe5\x91\xf2\x58\x79\xa2\x3c\x55\x9e\x29\xcf\x95\x17\xca\x4b\xe5\x95\xf2\x5a\x79\xa3\xbc\x55\xde\x29\xef\x95\x0f\xca\x47\xe5\x93\xf2\x59\xf9\xa2\x7c\x55\xbe\x29\xdf\x95\x1f\xca\x4f\xe5\x97\xf2\x5b\xf9\xa3\xfc\x55\xfe\xa9\x09\xd4\x84\x6a\x22\x35\xb1\x9a\x44\x4d\xaa\x26\x53\x93\xab\x29\xd4\x94\x6a\x2a\x35\xb5\x9a\x46\x4d\xab\xa6\x53\xd3\xab\x19\xd4\x8c\x6a\x26\x35\xb3\x9a\x45\xcd\xaa\x66\x53\xb3\xab\x39\xd4\x9c\x6a\x2e\x35\xb7\x9a\x47\xcd\xab\xe6\x53\xf3\xab\x05\xd4\x82\x6a\x21\xb5\xb0\x5a\x44\x2d\xaa\x16\x53\x8b\xab\x25\xd4\x92\x6a\x29\xb5\xb4\x5a\x46\x2d\xab\x96\x53\xcb\xab\x15\xd4\x8a\x6a\x25\xb5\xb2\x5a\x45\xad\xaa\x56\x53\xab\xab\x35\xd4\x9a\x6a\x2d\xb5\xb6\x5a\x47\xad\xab\xd6\x53\xeb\xab\x0d\xd4\x86\x6a\x23\xb5\xb1\xda\x44\x6d\xaa\x36\x53\x9b\xab\x2d\xd4\x96\x6a\x2b\xb5\xb5\xda\x46\x6d\xab\xb6\x53\xdb\xab\x1d\xd4\x8e\x6a\x27\xb5\xb3\xda\x45\xed\xaa\x76\x53\xbb\xab\x3d\xd4\x9e\x6a\x2f\xb5\xb7\xda\x47\xed\xab\xf6\x53\xfb\xab\x03\xd4\x81\xea\x20\x75\xb0\x3a\x44\x1d\xaa\x0e\x53\x87\xab\x23\xd4\x91\xea\x28\x75\xb4\x3a\x46\x1d\xab\x8e\x53\xc7\xab\x13\xd4\x89\xea\x24\x75\xb2\x3a\x45\x9d\xaa\x4e\x53\xa7\xab\x33\xd4\x99\xea\x2c\x75\xb6\x3a\x47\x9d\xab\xce\x53\xe7\xab\x0b\xd4\x85\xea\x22\x75\xb1\xba\x44\x5d\xaa\x2e\x53\x97\xab\x2b\xd4\x95\xea\x2a\x75\xb5\xba\x46\x5d\xab\xae\x53\xd7\xab\x1b\x54\x4c\xc5\x55\x42\x25\x55\x4a\xa5\x55\x46\x65\x55\x4e\xe5\x55\x41\x15\x55\x49\x95\x55\x45\x55\x55\x4d\xd5\x55\x43\x35\x55\x4b\xb5\x55\x47\x75\x55\x4f\xf5\xd5\x40\x0d\xd5\x48\x05\x2a\x54\x91\x1a\xab\x1b\xd5\x4d\xea\x66\x75\x8b\xba\x55\xdd\xa6\x6e\x57\x77\xa8\x3b\xd5\x5d\xea\x6e\x75\x8f\xba\x57\xdd\xa7\xee\x57\x0f\xa8\x07\xd5\x43\xea\x61\xf5\x88\x7a\x54\x3d\xa6\x1e\x57\x4f\xa8\x27\xd5\x53\xea\x69\xf5\x8c\x7a\x56\x3d\xa7\x9e\x57\x2f\xa8\x17\xd5\x4b\xea\x65\xf5\x8a\x7a\x55\xbd\xa6\x5e\x57\x6f\xa8\x37\xd5\x5b\xea\x6d\xf5\x8e\x7a\x57\xbd\xa7\xde\x57\x1f\xa8\x0f\xd5\x47\xea\x63\xf5\x89\xfa\x54\x7d\xa6\x3e\x57\x5f\xa8\x2f\xd5\x57\xea\x6b\xf5\x8d\xfa\x56\x7d\xa7\xbe\x57\x3f\xa8\x1f\xd5\x4f\xea\x67\xf5\x8b\xfa\x55\xfd\xa6\x7e\x57\x7f\xa8\x3f\xd5\x5f\xea\x6f\xf5\x8f\xfa\x57\xfd\xa7\x25\xd0\x12\x6a\x89\xb4\xc4\x5a\x12\x2d\xa9\x96\x4c\x4b\xae\xa5\xd0\x52\x6a\xa9\xb4\xd4\x5a\x1a\x2d\xad\x96\x4e\x4b\xaf\x65\xd0\x32\x6a\x99\xb4\xcc\x5a\x16\x2d\xab\x96\x4d\xcb\xae\xe5\xd0\x72\x6a\xb9\xb4\xdc\x5a\x1e\x2d\xaf\x96\x4f\xcb\xaf\x15\xd0\x0a\x6a\x85\xb4\xc2\x5a\x11\xad\xa8\x56\x4c\x2b\xae\x95\xd0\x4a\x6a\xa5\xb4\xd2\x5a\x19\xad\xac\x56\x4e\x2b\xaf\x55\xd0\x2a\x6a\x95\xb4\xca\x5a\x15\xad\xaa\x56\x4d\xab\xae\xd5\xd0\x6a\x6a\xb5\xb4\xda\x5a\x1d\xad\xae\x56\x4f\xab\xaf\x35\xd0\x1a\x6a\x8d\xb4\xc6\x5a\x13\xad\xa9\xd6\x4c\x6b\xae\xb5\xd0\x5a\x6a\xad\xb4\xd6\x5a\x1b\xad\xad\xd6\x4e\x6b\xaf\x75\xd0\x3a\x6a\x9d\xb4\xce\x5a\x17\xad\xab\xd6\x4d\xeb\xae\xf5\xd0\x7a\x6a\xbd\xb4\xde\x5a\x1f\xad\xaf\xd6\x4f\xeb\xaf\x0d\xd0\x06\x6a\x83\xb4\xc1\xda\x10\x6d\xa8\x36\x4c\x1b\xae\x8d\xd0\x46\x6a\xa3\xb4\xd1\xda\x18\x6d\xac\x36\x4e\x1b\xaf\x4d\xd0\x26\x6a\x93\xb4\xc9\xda\x14\x6d\xaa\x36\x4d\x9b\xae\xcd\xd0\x66\x6a\xb3\xb4\xd9\xda\x1c\x6d\xae\x36\x4f\x9b\xaf\x2d\xd0\x16\x6a\x8b\xb4\xc5\xda\x12\x6d\xa9\xb6\x4c\x5b\xae\xad\xd0\x56\x6a\xab\xb4\xd5\xda\x1a\x6d\xad\xb6\x4e\x5b\xaf\x6d\xd0\x30\x0d\xd7\x08\x8d\xd4\x28\x8d\xd6\x18\x8d\xd5\x38\x8d\xd7\x04\x4d\xd4\x24\x4d\xd6\x14\x4d\xd5\x34\x4d\xd7\x0c\xcd\xd4\x2c\xcd\xd6\x1c\xcd\xd5\x3c\xcd\xd7\x02\x2d\xd4\x22\x0d\x68\x50\x43\x5a\xac\x6d\xd4\x36\x69\x9b\xb5\x2d\xda\x56\x6d\x9b\xb6\x5d\xdb\xa1\xed\xd4\x76\x69\xbb\xb5\x3d\xda\x5e\x6d\x9f\xb6\x5f\x3b\xa0\x1d\xd4\x0e\x69\x87\xb5\x23\xda\x51\xed\x98\x76\x5c\x3b\xa1\x9d\xd4\x4e\x69\xa7\xb5\x33\xda\x59\xed\x9c\x76\x5e\xbb\xa0\x5d\xd4\x2e\x69\x97\xb5\x2b\xda\x55\xed\x9a\x76\x5d\xbb\xa1\xdd\xd4\x6e\x69\xb7\xb5\x3b\xda\x5d\xed\x9e\x76\x5f\x7b\xa0\x3d\xd4\x1e\x69\x8f\xb5\x27\xda\x53\xed\x99\xf6\x5c\x7b\xa1\xbd\xd4\x5e\x69\xaf\xb5\x37\xda\x5b\xed\x9d\xf6\x5e\xfb\xa0\x7d\xd4\x3e\x69\x9f\xb5\x2f\xda\x57\xed\x9b\xf6\x5d\xfb\xa1\xfd\xd4\x7e\x69\xbf\xb5\x3f\xda\x5f\xed\x9f\x9e\x40\x4f\xa8\x27\xd2\x13\xeb\x49\xf4\xa4\x7a\x32\x3d\xb9\x9e\x42\x4f\xa9\xa7\xd2\x53\xeb\x69\xf4\xb4\x7a\x3a\x3d\xbd\x9e\x41\xcf\xa8\x67\xd2\x33\xeb\x59\xf4\xac\x7a\x36\x3d\xbb\x9e\x43\xcf\xa9\xe7\xd2\x73\xeb\x79\xf4\xbc\x7a\x3e\x3d\xbf\x5e\x40\x2f\xa8\x17\xd2\x0b\xeb\x45\xf4\xa2\x7a\x31\xbd\xb8\x5e\x42\x2f\xa9\x97\xd2\x4b\xeb\x65\xf4\xb2\x7a\x39\xbd\xbc\x5e\x41\xaf\xa8\x57\xd2\x2b\xeb\x55\xf4\xaa\x7a\x35\xbd\xba\x5e\x43\xaf\xa9\xd7\xd2\x6b\xeb\x75\xf4\xba\x7a\x3d\xbd\xbe\xde\x40\x6f\xa8\x37\xd2\x1b\xeb\x4d\xf4\xa6\x7a\x33\xbd\xb9\xde\x42\x6f\xa9\xb7\xd2\x5b\xeb\x6d\xf4\xb6\x7a\x3b\xbd\xbd\xde\x41\xef\xa8\x77\xd2\x3b\xeb\x5d\xf4\xae\x7a\x37\xbd\xbb\xde\x43\xef\xa9\xf7\xd2\x7b\xeb\x7d\xf4\xbe\x7a\x3f\xbd\xbf\x3e\x40\x1f\xa8\x0f\xd2\x07\xeb\x43\xf4\xa1\xfa\x30\x7d\xb8\x3e\x42\x1f\xa9\x8f\xd2\x47\xeb\x63\xf4\xb1\xfa\x38\x7d\xbc\x3e\x41\x9f\xa8\x4f\xd2\x27\xeb\x53\xf4\xa9\xfa\x34\x7d\xba\x3e\x43\x9f\xa9\xcf\xd2\x67\xeb\x73\xf4\xb9\xfa\x3c\x7d\xbe\xbe\x40\x5f\xa8\x2f\xd2\x17\xeb\x4b\xf4\xa5\xfa\x32\x7d\xb9\xbe\x42\x5f\xa9\xaf\xd2\x57\xeb\x6b\xf4\xb5\xfa\x3a\x7d\xbd\xbe\x41\xc7\x74\x5c\x27\x74\x52\xa7\x74\x5a\x67\x74\x56\xe7\x74\x5e\x17\x74\x51\x97\x74\x59\x57\x74\x55\xd7\x74\x5d\x37\x74\x53\xb7\x74\x5b\x77\x74\x57\xf7\x74\x5f\x0f\xf4\x50\x8f\x74\xa0\x43\x1d\xe9\xb1\xbe\x51\xdf\xa4\x6f\xd6\xb7\xe8\x5b\xf5\x6d\xfa\x76\x7d\x87\xbe\x53\xdf\xa5\xef\xd6\xf7\xe8\x7b\xf5\x7d\xfa\x7e\xfd\x80\x7e\x50\x3f\xa4\x1f\xd6\x8f\xe8\x47\xf5\x63\xfa\x71\xfd\x84\x7e\x52\x3f\xa5\x9f\xd6\xcf\xe8\x67\xf5\x73\xfa\x79\xfd\x82\x7e\x51\xbf\xa4\x5f\xd6\xaf\xe8\x57\xf5\x6b\xfa\x75\xfd\x86\x7e\x53\xbf\xa5\xdf\xd6\xef\xe8\x77\xf5\x7b\xfa\x7d\xfd\x81\xfe\x50\x7f\xa4\x3f\xd6\x9f\xe8\x4f\xf5\x67\xfa\x73\xfd\x85\xfe\x52\x7f\xa5\xbf\xd6\xdf\xe8\x6f\xf5\x77\xfa\x7b\xfd\x83\xfe\x51\xff\xa4\x7f\xd6\xbf\xe8\x5f\xf5\x6f\xfa\x77\xfd\x87\xfe\x53\xff\xa5\xff\xd6\xff\xe8\x7f\xf5\x7f\x46\x02\x23\xa1\x91\xc8\x48\x6c\x24\x31\x92\x1a\xc9\x8c\xe4\x46\x0a\x23\xa5\x91\xca\x48\x6d\xa4\x31\xd2\x1a\xe9\x8c\xf4\x46\x06\x23\xa3\x91\xc9\xc8\x6c\x64\x31\xb2\x1a\xd9\x8c\xec\x46\x0e\x23\xa7\x91\xcb\xc8\x6d\xe4\x31\xf2\x1a\xf9\x8c\xfc\x46\x01\xa3\xa0\x51\xc8\x28\x6c\x14\x31\x8a\x1a\xc5\x8c\xe2\x46\x09\xa3\xa4\x51\xca\x28\x6d\x94\x31\xca\x1a\xe5\x8c\xf2\x46\x05\xa3\xa2\x51\xc9\xa8\x6c\x54\x31\xaa\x1a\xd5\x8c\xea\x46\x0d\xa3\xa6\x51\xcb\xa8\x6d\xd4\x31\xea\x1a\xf5\x8c\xfa\x46\x03\xa3\xa1\xd1\xc8\x68\x6c\x34\x31\x9a\x1a\xcd\x8c\xe6\x46\x0b\xa3\xa5\xd1\xca\x68\x6d\xb4\x31\xda\x1a\xed\x8c\xf6\x46\x07\xa3\xa3\xd1\xc9\xe8\x6c\x74\x31\xba\x1a\xdd\x8c\xee\x46\x0f\xa3\xa7\xd1\xcb\xe8\x6d\xf4\x31\xfa\x1a\xfd\x8c\xfe\xc6\x00\x63\xa0\x31\xc8\x18\x6c\x0c\x31\x86\x1a\xc3\x8c\xe1\xc6\x08\x63\xa4\x31\xca\x18\x6d\x8c\x31\xc6\x1a\xe3\x8c\xf1\xc6\x04\x63\xa2\x31\xc9\x98\x6c\x4c\x31\xa6\x1a\xd3\x8c\xe9\xc6\x0c\x63\xa6\x31\xcb\x98\x6d\xcc\x31\xe6\x1a\xf3\x8c\xf9\xc6\x02\x63\xa1\xb1\xc8\x58\x6c\x2c\x31\x96\x1a\xcb\x8c\xe5\xc6\x0a\x63\xa5\xb1\xca\x58\x6d\xac\x31\xd6\x1a\xeb\x8c\xf5\xc6\x06\x03\x33\x70\x83\x30\x48\x83\x32\x68\x83\x31\x58\x83\x33\x78\x43\x30\x44\x43\x32\x64\x43\x31\x54\x43\x33\x74\xc3\x30\x4c\xc3\x32\x6c\xc3\x31\x5c\xc3\x33\x7c\x23\x30\x42\x23\x32\x80\x01\x0d\x64\xc4\xc6\x46\x63\x93\xb1\xd9\xd8\x62\x6c\x35\xb6\x19\xdb\x8d\x1d\xc6\x4e\x63\x97\xb1\xdb\xd8\x63\xec\x35\xf6\x19\xfb\x8d\x03\xc6\x41\xe3\x90\x71\xd8\x38\x62\x1c\x35\x8e\x19\xc7\x8d\x13\xc6\x49\xe3\x94\x71\xda\x38\x63\x9c\x35\xce\x19\xe7\x8d\x0b\xc6\x45\xe3\x92\x71\xd9\xb8\x62\x5c\x35\xae\x19\xd7\x8d\x1b\xc6\x4d\xe3\x96\x71\xdb\xb8\x63\xdc\x35\xee\x19\xf7\x8d\x07\xc6\x43\xe3\x91\xf1\xd8\x78\x62\x3c\x35\x9e\x19\xcf\x8d\x17\xc6\x4b\xe3\x95\xf1\xda\x78\x63\xbc\x35\xde\x19\xef\x8d\x0f\xc6\x47\xe3\x93\xf1\xd9\xf8\x62\x7c\x35\xbe\x19\xdf\x8d\x1f\xc6\x4f\xe3\x97\xf1\xdb\xf8\x63\xfc\x35\xfe\x99\x09\xcc\x84\x66\x22\x33\xb1\x99\xc4\x4c\x6a\x26\x33\x93\x9b\x29\xcc\x94\x66\x2a\x33\xb5\x99\xc6\x4c\x6b\xa6\x33\xd3\x9b\x19\xcc\x8c\x66\x26\x33\xb3\x99\xc5\xcc\x6a\x66\x33\xb3\x9b\x39\xcc\x9c\x66\x2e\x33\xb7\x99\xc7\xcc\x6b\xe6\x33\xf3\x9b\x05\xcc\x82\x66\x21\xb3\xb0\x59\xc4\x2c\x6a\x16\x33\x8b\x9b\x25\xcc\x92\x66\x29\xb3\xb4\x59\xc6\x2c\x6b\x96\x33\xcb\x9b\x15\xcc\x8a\x66\x25\xb3\xb2\x59\xc5\xac\x6a\x56\x33\xab\x9b\x35\xcc\x9a\x66\x2d\xb3\xb6\x59\xc7\xac\x6b\xd6\x33\xeb\x9b\x0d\xcc\x86\x66\x23\xb3\xb1\xd9\xc4\x6c\x6a\x36\x33\x9b\x9b\x2d\xcc\x96\x66\x2b\xb3\xb5\xd9\xc6\x6c\x6b\xb6\x33\xdb\x9b\x1d\xcc\x8e\x66\x27\xb3\xb3\xd9\xc5\xec\x6a\x76\x33\xbb\x9b\x3d\xcc\x9e\x66\x2f\xb3\xb7\xd9\xc7\xec\x6b\xf6\x33\xfb\x9b\x03\xcc\x81\xe6\x20\x73\xb0\x39\xc4\x1c\x6a\x0e\x33\x87\x9b\x23\xcc\x91\xe6\x28\x73\xb4\x39\xc6\x1c\x6b\x8e\x33\xc7\x9b\x13\xcc\x89\xe6\x24\x73\xb2\x39\xc5\x9c\x6a\x4e\x33\xa7\x9b\x33\xcc\x99\xe6\x2c\x73\xb6\x39\xc7\x9c\x6b\xce\x33\xe7\x9b\x0b\xcc\x85\xe6\x22\x73\xb1\xb9\xc4\x5c\x6a\x2e\x33\x97\x9b\x2b\xcc\x95\xe6\x2a\x73\xb5\xb9\xc6\x5c\x6b\xae\x33\xd7\x9b\x1b\x4c\xcc\xc4\x4d\xc2\x24\x4d\xca\xa4\x4d\xc6\x64\x4d\xce\xe4\x4d\xc1\x14\x4d\xc9\x94\x4d\xc5\x54\x4d\xcd\xd4\x4d\xc3\x34\x4d\xcb\xb4\x4d\xc7\x74\x4d\xcf\xf4\xcd\xc0\x0c\xcd\xc8\x04\x26\x34\x91\x19\x9b\x1b\xcd\x4d\xe6\x66\x73\x8b\xb9\xd5\xdc\x66\x6e\x37\x77\x98\x3b\xcd\x5d\xe6\x6e\x73\x8f\xb9\xd7\xdc\x67\xee\x37\x0f\x98\x07\xcd\x43\xe6\x61\xf3\x88\x79\xd4\x3c\x66\x1e\x37\x4f\x98\x27\xcd\x53\xe6\x69\xf3\x8c\x79\xd6\x3c\x67\x9e\x37\x2f\x98\x17\xcd\x4b\xe6\x65\xf3\x8a\x79\xd5\xbc\x66\x5e\x37\x6f\x98\x37\xcd\x5b\xe6\x6d\xf3\x8e\x79\xd7\xbc\x67\xde\x37\x1f\x98\x0f\xcd\x47\xe6\x63\xf3\x89\xf9\xd4\x7c\x66\x3e\x37\x5f\x98\x2f\xcd\x57\xe6\x6b\xf3\x8d\xf9\xd6\x7c\x67\xbe\x37\x3f\x98\x1f\xcd\x4f\xe6\x67\xf3\x8b\xf9\xd5\xfc\x66\x7e\x37\x7f\x98\x3f\xcd\x5f\xe6\x6f\xf3\x8f\xf9\xd7\xfc\x67\x25\xb0\x12\x5a\x89\xac\xc4\x56\x12\x2b\xa9\x95\xcc\x4a\x6e\xa5\xb0\x52\x5a\xa9\xac\xd4\x56\x1a\x2b\xad\x95\xce\x4a\x6f\x65\xb0\x32\x5a\x99\xac\xcc\x56\x16\x2b\xab\x95\xcd\xca\x6e\xe5\xb0\x72\x5a\xb9\xac\xdc\x56\x1e\x2b\xaf\x95\xcf\xca\x6f\x15\xb0\x0a\x5a\x85\xac\xc2\x56\x11\xab\xa8\x55\xcc\x2a\x6e\x95\xb0\x4a\x5a\xa5\xac\xd2\x56\x19\xab\xac\x55\xce\x2a\x6f\x55\xb0\x2a\x5a\x95\xac\xca\x56\x15\xab\xaa\x55\xcd\xaa\x6e\xd5\xb0\x6a\x5a\xb5\xac\xda\x56\x1d\xab\xae\x55\xcf\xaa\x6f\x35\xb0\x1a\x5a\x8d\xac\xc6\x56\x13\xab\xa9\xd5\xcc\x6a\x6e\xb5\xb0\x5a\x5a\xad\xac\xd6\x56\x1b\xab\xad\xd5\xce\x6a\x6f\x75\xb0\x3a\x5a\x9d\xac\xce\x56\x17\xab\xab\xd5\xcd\xea\x6e\xf5\xb0\x7a\x5a\xbd\xac\xde\x56\x1f\xab\xaf\xd5\xcf\xea\x6f\x0d\xb0\x06\x5a\x83\xac\xc1\xd6\x10\x6b\xa8\x35\xcc\x1a\x6e\x8d\xb0\x46\x5a\xa3\xac\xd1\xd6\x18\x6b\xac\x35\xce\x1a\x6f\x4d\xb0\x26\x5a\x93\xac\xc9\xd6\x14\x6b\xaa\x35\xcd\x9a\x6e\xcd\xb0\x66\x5a\xb3\xac\xd9\xd6\x1c\x6b\xae\x35\xcf\x9a\x6f\x2d\xb0\x16\x5a\x8b\xac\xc5\xd6\x12\x6b\xa9\xb5\xcc\x5a\x6e\xad\xb0\x56\x5a\xab\xac\xd5\xd6\x1a\x6b\xad\xb5\xce\x5a\x6f\x6d\xb0\x30\x0b\xb7\x08\x8b\xb4\x28\x8b\xb6\x18\x8b\xb5\x38\x8b\xb7\x04\x4b\xb4\x24\x4b\xb6\x14\x4b\xb5\x34\x4b\xb7\x0c\xcb\xb4\x2c\xcb\xb6\x1c\xcb\xb5\x3c\xcb\xb7\x02\x2b\xb4\x22\x0b\x58\xd0\x42\x56\x6c\x6d\xb4\x36\x59\x9b\xad\x2d\xd6\x56\x6b\x9b\xb5\xdd\xda\x61\xed\xb4\x76\x59\xbb\xad\x3d\xd6\x5e\x6b\x9f\xb5\xdf\x3a\x60\x1d\xb4\x0e\x59\x87\xad\x23\xd6\x51\xeb\x98\x75\xdc\x3a\x61\x9d\xb4\x4e\x59\xa7\xad\x33\xd6\x59\xeb\x9c\x75\xde\xba\x60\x5d\xb4\x2e\x59\x97\xad\x2b\xd6\x55\xeb\x9a\x75\xdd\xba\x61\xdd\xb4\x6e\x59\xb7\xad\x3b\xd6\x5d\xeb\x9e\x75\xdf\x7a\x60\x3d\xb4\x1e\x59\x8f\xad\x27\xd6\x53\xeb\x99\xf5\xdc\x7a\x61\xbd\xb4\x5e\x59\xaf\xad\x37\xd6\x5b\xeb\x9d\xf5\xde\xfa\x60\x7d\xb4\x3e\x59\x9f\xad\x2f\xd6\x57\xeb\x9b\xf5\xdd\xfa\x61\xfd\xb4\x7e\x59\xbf\xad\x3f\xd6\x5f\xeb\x9f\x9d\xc0\x4e\x68\x27\xb2\x13\xdb\x49\xec\xa4\x76\x32\x3b\xb9\x9d\xc2\x4e\x69\xa7\xb2\x53\xdb\x69\xec\xb4\x76\x3a\x3b\xbd\x9d\xc1\xce\x68\x67\xb2\x33\xdb\x59\xec\xac\x76\x36\x3b\xbb\x9d\xc3\xce\x69\xe7\xb2\x73\xdb\x79\xec\xbc\x76\x3e\x3b\xbf\x5d\xc0\x2e\x68\x17\xb2\x0b\xdb\x45\xec\xa2\x76\x31\xbb\xb8\x5d\xc2\x2e\x69\x97\xb2\x4b\xdb\x65\xec\xb2\x76\x39\xbb\xbc\x5d\xc1\xae\x68\x57\xb2\x2b\xdb\x55\xec\xaa\x76\x35\xbb\xba\x5d\xc3\xae\x69\xd7\xb2\x6b\xdb\x75\xec\xba\x76\x3d\xbb\xbe\xdd\xc0\x6e\x68\x37\xb2\x1b\xdb\x4d\xec\xa6\x76\x33\xbb\xb9\xdd\xc2\x6e\x69\xb7\xb2\x5b\xdb\x6d\xec\xb6\x76\x3b\xbb\xbd\xdd\xc1\xee\x68\x77\xb2\x3b\xdb\x5d\xec\xae\x76\x37\xbb\xbb\xdd\xc3\xee\x69\xf7\xb2\x7b\xdb\x7d\xec\xbe\x76\x3f\xbb\xbf\x3d\xc0\x1e\x68\x0f\xb2\x07\xdb\x43\xec\xa1\xf6\x30\x7b\xb8\x3d\xc2\x1e\x69\x8f\xb2\x47\xdb\x63\xec\xb1\xf6\x38\x7b\xbc\x3d\xc1\x9e\x68\x4f\xb2\x27\xdb\x53\xec\xa9\xf6\x34\x7b\xba\x3d\xc3\x9e\x69\xcf\xb2\x67\xdb\x73\xec\xb9\xf6\x3c\x7b\xbe\xbd\xc0\x5e\x68\x2f\xb2\x17\xdb\x4b\xec\xa5\xf6\x32\x7b\xb9\xbd\xc2\x5e\x69\xaf\xb2\x57\xdb\x6b\xec\xb5\xf6\x3a\x7b\xbd\xbd\xc1\xc6\x6c\xdc\x26\x6c\xd2\xa6\x6c\xda\x66\x6c\xd6\xe6\x6c\xde\x16\x6c\xd1\x96\x6c\xd9\x56\x6c\xd5\xd6\x6c\xdd\x36\x6c\xd3\xb6\x6c\xdb\x76\x6c\xd7\xf6\x6c\xdf\x0e\xec\xd0\x8e\x6c\x60\x43\x1b\xd9\xb1\xbd\xd1\xde\x64\x6f\xb6\xb7\xd8\x5b\xed\x6d\xf6\x76\x7b\x87\xbd\xd3\xde\x65\xef\xb6\xf7\xd8\x7b\xed\x7d\xf6\x7e\xfb\x80\x7d\xd0\x3e\x64\x1f\xb6\x8f\xd8\x47\xed\x63\xf6\x71\xfb\x84\x7d\xd2\x3e\x65\x9f\xb6\xcf\xd8\x67\xed\x73\xf6\x79\xfb\x82\x7d\xd1\xbe\x64\x5f\xb6\xaf\xd8\x57\xed\x6b\xf6\x75\xfb\x86\x7d\xd3\xbe\x65\xdf\xb6\xef\xd8\x77\xed\x7b\xf6\x7d\xfb\x81\xfd\xd0\x7e\x64\x3f\xb6\x9f\xd8\x4f\xed\x67\xf6\x73\xfb\x85\xfd\xd2\x7e\x65\xbf\xb6\xdf\xd8\x6f\xed\x77\xf6\x7b\xfb\x83\xfd\xd1\xfe\x64\x7f\xb6\xbf\xd8\x5f\xed\x6f\xf6\x77\xfb\x87\xfd\xd3\xfe\x65\xff\xb6\xff\xd8\x7f\xed\x7f\x4e\x02\x27\xa1\x93\xc8\x49\xec\x24\x71\x92\x3a\xc9\x9c\xe4\x4e\x0a\x27\xa5\x93\xca\x49\xed\xa4\x71\xd2\x3a\xe9\x9c\xf4\x4e\x06\x27\xa3\x93\xc9\xc9\xec\x64\x71\xb2\x3a\xd9\x9c\xec\x4e\x0e\x27\xa7\x93\xcb\xc9\xed\xe4\x71\xf2\x3a\xf9\x9c\xfc\x4e\x01\xa7\xa0\x53\xc8\x29\xec\x14\x71\x8a\x3a\xc5\x9c\xe2\x4e\x09\xa7\xa4\x53\xca\x29\xed\x94\x71\xca\x3a\xe5\x9c\xf2\x4e\x05\xa7\xa2\x53\xc9\xa9\xec\x54\x71\xaa\x3a\xd5\x9c\xea\x4e\x0d\xa7\xa6\x53\xcb\xa9\xed\xd4\x71\xea\x3a\xf5\x9c\xfa\x4e\x03\xa7\xa1\xd3\xc8\x69\xec\x34\x71\x9a\x3a\xcd\x9c\xe6\x4e\x0b\xa7\xa5\xd3\xca\x69\xed\xb4\x71\xda\x3a\xed\x9c\xf6\x4e\x07\xa7\xa3\xd3\xc9\xe9\xec\x74\x71\xba\x3a\xdd\x9c\xee\x4e\x0f\xa7\xa7\xd3\xcb\xe9\xed\xf4\x71\xfa\x3a\xfd\x9c\xfe\xce\x00\x67\xa0\x33\xc8\x19\xec\x0c\x71\x86\x3a\xc3\x9c\xe1\xce\x08\x67\xa4\x33\xca\x19\xed\x8c\x71\xc6\x3a\xe3\x9c\xf1\xce\x04\x67\xa2\x33\xc9\x99\xec\x4c\x71\xa6\x3a\xd3\x9c\xe9\xce\x0c\x67\xa6\x33\xcb\x99\xed\xcc\x71\xe6\x3a\xf3\x9c\xf9\xce\x02\x67\xa1\xb3\xc8\x59\xec\x2c\x71\x96\x3a\xcb\x9c\xe5\xce\x0a\x67\xa5\xb3\xca\x59\xed\xac\x71\xd6\x3a\xeb\x9c\xf5\xce\x06\x07\x73\x70\x87\x70\x48\x87\x72\x68\x87\x71\x58\x87\x73\x78\x47\x70\x44\x47\x72\x64\x47\x71\x54\x47\x73\x74\xc7\x70\x4c\xc7\x72\x6c\xc7\x71\x5c\xc7\x73\x7c\x27\x70\x42\x27\x72\x80\x03\x1d\xe4\xc4\xce\x46\x67\x93\xb3\xd9\xd9\xe2\x6c\x75\xb6\x39\xdb\x9d\x1d\xce\x4e\x67\x97\xb3\xdb\xd9\xe3\xec\x75\xf6\x39\xfb\x9d\x03\xce\x41\xe7\x90\x73\xd8\x39\xe2\x1c\x75\x8e\x39\xc7\x9d\x13\xce\x49\xe7\x94\x73\xda\x39\xe3\x9c\x75\xce\x39\xe7\x9d\x0b\xce\x45\xe7\x92\x73\xd9\xb9\xe2\x5c\x75\xae\x39\xd7\x9d\x1b\xce\x4d\xe7\x96\x73\xdb\xb9\xe3\xdc\x75\xee\x39\xf7\x9d\x07\xce\x43\xe7\x91\xf3\xd8\x79\xe2\x3c\x75\x9e\x39\xcf\x9d\x17\xce\x4b\xe7\x95\xf3\xda\x79\xe3\xbc\x75\xde\x39\xef\x9d\x0f\xce\x47\xe7\x93\xf3\xd9\xf9\xe2\x7c\x75\xbe\x39\xdf\x9d\x1f\xce\x4f\xe7\x97\xf3\xdb\xf9\xe3\xfc\x75\xfe\xb9\x09\xdc\x84\x6e\x22\x37\xb1\x9b\xc4\x4d\xea\x26\x73\x93\xbb\x29\xdc\x94\x6e\x2a\x37\xb5\x9b\xc6\x4d\xeb\xa6\x73\xd3\xbb\x19\xdc\x8c\x6e\x26\x37\xb3\x9b\xc5\xcd\xea\x66\x73\xb3\xbb\x39\xdc\x9c\x6e\x2e\x37\xb7\x9b\xc7\xcd\xeb\xe6\x73\xf3\xbb\x05\xdc\x82\x6e\x21\xb7\xb0\x5b\xc4\x2d\xea\x16\x73\x8b\xbb\x25\xdc\x92\x6e\x29\xb7\xb4\x5b\xc6\x2d\xeb\x96\x73\xcb\xbb\x15\xdc\x8a\x6e\x25\xb7\xb2\x5b\xc5\xad\xea\x56\x73\xab\xbb\x35\xdc\x9a\x6e\x2d\xb7\xb6\x5b\xc7\xad\xeb\xd6\x73\xeb\xbb\x0d\xdc\x86\x6e\x23\xb7\xb1\xdb\xc4\x6d\xea\x36\x73\x9b\xbb\x2d\xdc\x96\x6e\x2b\xb7\xb5\xdb\xc6\x6d\xeb\xb6\x73\xdb\xbb\x1d\xdc\x8e\x6e\x27\xb7\xb3\xdb\xc5\xed\xea\x76\x73\xbb\xbb\x3d\xdc\x9e\x6e\x2f\xb7\xb7\xdb\xc7\xed\xeb\xf6\x73\xfb\xbb\x03\xdc\x81\xee\x20\x77\xb0\x3b\xc4\x1d\xea\x0e\x73\x87\xbb\x23\xdc\x91\xee\x28\x77\xb4\x3b\xc6\x1d\xeb\x8e\x73\xc7\xbb\x13\xdc\x89\xee\x24\x77\xb2\x3b\xc5\x9d\xea\x4e\x73\xa7\xbb\x33\xdc\x99\xee\x2c\x77\xb6\x3b\xc7\x9d\xeb\xce\x73\xe7\xbb\x0b\xdc\x85\xee\x22\x77\xb1\xbb\xc4\x5d\xea\x2e\x73\x97\xbb\x2b\xdc\x95\xee\x2a\x77\xb5\xbb\xc6\x5d\xeb\xae\x73\xd7\xbb\x1b\x5c\xcc\xc5\x5d\xc2\x25\x5d\xca\xa5\x5d\xc6\x65\x5d\xce\xe5\x5d\xc1\x15\x5d\xc9\x95\x5d\xc5\x55\x5d\xcd\xd5\x5d\xc3\x35\x5d\xcb\xb5\x5d\xc7\x75\x5d\xcf\xf5\xdd\xc0\x0d\xdd\xc8\x05\x2e\x74\x91\x1b\xbb\x1b\xdd\x4d\xee\x66\x77\x8b\xbb\xd5\xdd\xe6\x6e\x77\x77\xb8\x3b\xdd\x5d\xee\x6e\x77\x8f\xbb\xd7\xdd\xe7\xee\x77\x0f\xb8\x07\xdd\x43\xee\x61\xf7\x88\x7b\xd4\x3d\xe6\x1e\x77\x4f\xb8\x27\xdd\x53\xee\x69\xf7\x8c\x7b\xd6\x3d\xe7\x9e\x77\x2f\xb8\x17\xdd\x4b\xee\x65\xf7\x8a\x7b\xd5\xbd\xe6\x5e\x77\x6f\xb8\x37\xdd\x5b\xee\x6d\xf7\x8e\x7b\xd7\xbd\xe7\xde\x77\x1f\xb8\x0f\xdd\x47\xee\x63\xf7\x89\xfb\xd4\x7d\xe6\x3e\x77\x5f\xb8\x2f\xdd\x57\xee\x6b\xf7\x8d\xfb\xd6\x7d\xe7\xbe\x77\x3f\xb8\x1f\xdd\x4f\xee\x67\xf7\x8b\xfb\xd5\xfd\xe6\x7e\x77\x7f\xb8\x3f\xdd\x5f\xee\x6f\xf7\x8f\xfb\xd7\xfd\xe7\x25\xf0\x12\x7a\x89\xbc\xc4\x5e\x12\x2f\xa9\x97\xcc\x4b\xee\xa5\xf0\x52\x7a\xa9\xbc\xd4\x5e\x1a\x2f\xad\x97\xce\x4b\xef\x65\xf0\x32\x7a\x99\xbc\xcc\x5e\x16\x2f\xab\x97\xcd\xcb\xee\xe5\xf0\x72\x7a\xb9\xbc\xdc\x5e\x1e\x2f\xaf\x97\xcf\xcb\xef\x15\xf0\x0a\x7a\x85\xbc\xc2\x5e\x11\xaf\xa8\x57\xcc\x2b\xee\x95\xf0\x4a\x7a\xa5\xbc\xd2\x5e\x19\xaf\xac\x57\xce\x2b\xef\x55\xf0\x2a\x7a\x95\xbc\xca\x5e\x15\xaf\xaa\x57\xcd\xab\xee\xd5\xf0\x6a\x7a\xb5\xbc\xda\x5e\x1d\xaf\xae\x57\xcf\xab\xef\x35\xf0\x1a\x7a\x8d\xbc\xc6\x5e\x13\xaf\xa9\xd7\xcc\x6b\xee\xb5\xf0\x5a\x7a\xad\xbc\xd6\x5e\x1b\xaf\xad\xd7\xce\x6b\xef\x75\xf0\x3a\x7a\x9d\xbc\xce\x5e\x17\xaf\xab\xd7\xcd\xeb\xee\xf5\xf0\x7a\x7a\xbd\xbc\xde\x5e\x1f\xaf\xaf\xd7\xcf\xeb\xef\x0d\xf0\x06\x7a\x83\xbc\xc1\xde\x10\x6f\xa8\x37\xcc\x1b\xee\x8d\xf0\x46\x7a\xa3\xbc\xd1\xde\x18\x6f\xac\x37\xce\x1b\xef\x4d\xf0\x26\x7a\x93\xbc\xc9\xde\x14\x6f\xaa\x37\xcd\x9b\xee\xcd\xf0\x66\x7a\xb3\xbc\xd9\xde\x1c\x6f\xae\x37\xcf\x9b\xef\x2d\xf0\x16\x7a\x8b\xbc\xc5\xde\x12\x6f\xa9\xb7\xcc\x5b\xee\xad\xf0\x56\x7a\xab\xbc\xd5\xde\x1a\x6f\xad\xb7\xce\x5b\xef\x6d\xf0\x30\x0f\xf7\x08\x8f\xf4\x28\x8f\xf6\x18\x8f\xf5\x38\x8f\xf7\x04\x4f\xf4\x24\x4f\xf6\x14\x4f\xf5\x34\x4f\xf7\x0c\xcf\xf4\x2c\xcf\xf6\x1c\xcf\xf5\x3c\xcf\xf7\x02\x2f\xf4\x22\x0f\x78\xd0\x43\x5e\xec\x6d\xf4\x36\x79\x9b\xbd\x2d\xde\x56\x6f\x9b\xb7\xdd\xdb\xe1\xed\xf4\x76\x79\xbb\xbd\x3d\xde\x5e\x6f\x9f\xb7\xdf\x3b\xe0\x1d\xf4\x0e\x79\x87\xbd\x23\xde\x51\xef\x98\x77\xdc\x3b\xe1\x9d\xf4\x4e\x79\xa7\xbd\x33\xde\x59\xef\x9c\x77\xde\xbb\xe0\x5d\xf4\x2e\x79\x97\xbd\x2b\xde\x55\xef\x9a\x77\xdd\xbb\xe1\xdd\xf4\x6e\x79\xb7\xbd\x3b\xde\x5d\xef\x9e\x77\xdf\x7b\xe0\x3d\xf4\x1e\x79\x8f\xbd\x27\xde\x53\xef\x99\xf7\xdc\x7b\xe1\xbd\xf4\x5e\x79\xaf\xbd\x37\xde\x5b\xef\x9d\xf7\xde\xfb\xe0\x7d\xf4\x3e\x79\x9f\xbd\x2f\xde\x57\xef\x9b\xf7\xdd\xfb\xe1\xfd\xf4\x7e\x79\xbf\xbd\x3f\xde\x5f\xef\x9f\x9f\xc0\x4f\xe8\x27\xf2\x13\xfb\x49\xfc\xa4\x7e\x32\x3f\xb9\x9f\xc2\x4f\xe9\xa7\xf2\x53\xfb\x69\xfc\xb4\x7e\x3a\x3f\xbd\x9f\xc1\xcf\xe8\x67\xf2\x33\xfb\x59\xfc\xac\x7e\x36\x3f\xbb\x9f\xc3\xcf\xe9\xe7\xf2\x73\xfb\x79\xfc\xbc\x7e\x3e\x3f\xbf\x5f\xc0\x2f\xe8\x17\xf2\x0b\xfb\x45\xfc\xa2\x7e\x31\xbf\xb8\x5f\xc2\x2f\xe9\x97\xf2\x4b\xfb\x65\xfc\xb2\x7e\x39\xbf\xbc\x5f\xc1\xaf\xe8\x57\xf2\x2b\xfb\x55\xfc\xaa\x7e\x35\xbf\xba\x5f\xc3\xaf\xe9\xd7\xf2\x6b\xfb\x75\xfc\xba\x7e\x3d\xbf\xbe\xdf\xc0\x6f\xe8\x37\xf2\x1b\xfb\x4d\xfc\xa6\x7e\x33\xbf\xb9\xdf\xc2\x6f\xe9\xb7\xf2\x5b\xfb\x6d\xfc\xb6\x7e\x3b\xbf\xbd\xdf\xc1\xef\xe8\x77\xf2\x3b\xfb\x5d\xfc\xae\x7e\x37\xbf\xbb\xdf\xc3\xef\xe9\xf7\xf2\x7b\xfb\x7d\xfc\xbe\x7e\x3f\xbf\xbf\x3f\xc0\x1f\xe8\x0f\xf2\x07\xfb\x43\xfc\xa1\xfe\x30\x7f\xb8\x3f\xc2\x1f\xe9\x8f\xf2\x47\xfb\x63\xfc\xb1\xfe\x38\x7f\xbc\x3f\xc1\x9f\xe8\x4f\xf2\x27\xfb\x53\xfc\xa9\xfe\x34\x7f\xba\x3f\xc3\x9f\xe9\xcf\xf2\x67\xfb\x73\xfc\xb9\xfe\x3c\x7f\xbe\xbf\xc0\x5f\xe8\x2f\xf2\x17\xfb\x4b\xfc\xa5\xfe\x32\x7f\xb9\xbf\xc2\x5f\xe9\xaf\xf2\x57\xfb\x6b\xfc\xb5\xfe\x3a\x7f\xbd\xbf\xc1\xc7\x7c\xdc\x27\x7c\xd2\xa7\x7c\xda\x67\x7c\xd6\xe7\x7c\xde\x17\x7c\xd1\x97\x7c\xd9\x57\x7c\xd5\xd7\x7c\xdd\x37\x7c\xd3\xb7\x7c\xdb\x77\x7c\xd7\xf7\x7c\xdf\x0f\xfc\xd0\x8f\x7c\xe0\x43\x1f\xf9\xb1\xbf\xd1\xdf\xe4\x6f\xf6\xb7\xf8\x5b\xfd\x6d\xfe\x76\x7f\x87\xbf\xd3\xdf\xe5\xef\xf6\xf7\xf8\x7b\xfd\x7d\xfe\x7e\xff\x80\x7f\xd0\x3f\xe4\x1f\xf6\x8f\xf8\x47\xfd\x63\xfe\x71\xff\x84\x7f\xd2\x3f\xe5\x9f\xf6\xcf\xf8\x67\xfd\x73\xfe\x79\xff\x82\x7f\xd1\xbf\xe4\x5f\xf6\xaf\xf8\x57\xfd\x6b\xfe\x75\xff\x86\x7f\xd3\xbf\xe5\xdf\xf6\xef\xf8\x77\xfd\x7b\xfe\x7d\xff\x81\xff\xd0\x7f\xe4\x3f\xf6\x9f\xf8\x4f\xfd\x67\xfe\x73\xff\x85\xff\xd2\x7f\xe5\xbf\xf6\xdf\xf8\x6f\xfd\x77\xfe\x7b\xff\x83\xff\xd1\xff\xe4\x7f\xf6\xbf\xf8\x5f\xfd\x6f\xfe\x77\xff\x87\xff\xd3\xff\xe5\xff\xf6\xff\xf8\x7f\xfd\x7f\x41\x82\x20\x61\x90\x28\x48\x1c\x24\x09\x92\x06\xc9\x82\xe4\x41\x8a\x20\x65\x90\x2a\x48\x1d\xa4\x09\xd2\x06\xe9\x82\xf4\x41\x86\x20\x63\x90\x29\xc8\x1c\x64\x09\xb2\x06\xd9\x82\xec\x41\x8e\x20\x67\x90\x2b\xc8\x1d\xe4\x09\xf2\x06\xf9\x82\xfc\x41\x81\xa0\x60\x50\x28\x28\x1c\x14\x09\x8a\x06\xc5\x82\xe2\x41\x89\xa0\x64\x50\x2a\x28\x1d\x94\x09\xca\x06\xe5\x82\xf2\x41\x85\xa0\x62\x50\x29\xa8\x1c\x54\x09\xaa\x06\xd5\x82\xea\x41\x8d\xa0\x66\x50\x2b\xa8\x1d\xd4\x09\xea\x06\xf5\x82\xfa\x41\x83\xa0\x61\xd0\x28\x68\x1c\x34\x09\x9a\x06\xcd\x82\xe6\x41\x8b\xa0\x65\xd0\x2a\x68\x1d\xb4\x09\xda\x06\xed\x82\xf6\x41\x87\xa0\x63\xd0\x29\xe8\x1c\x74\x09\xba\x06\xdd\x82\xee\x41\x8f\xa0\x67\xd0\x2b\xe8\x1d\xf4\x09\xfa\x06\xfd\x82\xfe\xc1\x80\x60\x60\x30\x28\x18\x1c\x0c\x09\x86\x06\xc3\x82\xe1\xc1\x88\x60\x64\x30\x2a\x18\x1d\x8c\x09\xc6\x06\xe3\x82\xf1\xc1\x84\x60\x62\x30\x29\x98\x1c\x4c\x09\xa6\x06\xd3\x82\xe9\xc1\x8c\x60\x66\x30\x2b\x98\x1d\xcc\x09\xe6\x06\xf3\x82\xf9\xc1\x82\x60\x61\xb0\x28\x58\x1c\x2c\x09\x96\x06\xcb\x82\xe5\xc1\x8a\x60\x65\xb0\x2a\x58\x1d\xac\x09\xd6\x06\xeb\x82\xf5\xc1\x86\x00\x0b\xf0\x80\x08\xc8\x80\x0a\xe8\x80\x09\xd8\x80\x0b\xf8\x40\x08\xc4\x40\x0a\xe4\x40\x09\xd4\x40\x0b\xf4\xc0\x08\xcc\xc0\x0a\xec\xc0\x09\xdc\xc0\x0b\xfc\x20\x08\xc2\x20\x0a\x40\x00\x03\x14\xc4\xc1\xc6\x60\x53\xb0\x39\xd8\x12\x6c\x0d\xb6\x05\xdb\x83\x1d\xc1\xce\x60\x57\xb0\x3b\xd8\x13\xec\x0d\xf6\x05\xfb\x83\x03\xc1\xc1\xe0\x50\x70\x38\x38\x12\x1c\x0d\x8e\x05\xc7\x83\x13\xc1\xc9\xe0\x54\x70\x3a\x38\x13\x9c\x0d\xce\x05\xe7\x83\x0b\xc1\xc5\xe0\x52\x70\x39\xb8\x12\x5c\x0d\xae\x05\xd7\x83\x1b\xc1\xcd\xe0\x56\x70\x3b\xb8\x13\xdc\x0d\xee\x05\xf7\x83\x07\xc1\xc3\xe0\x51\xf0\x38\x78\x12\x3c\x0d\x9e\x05\xcf\x83\x17\xc1\xcb\xe0\x55\xf0\x3a\x78\x13\xbc\x0d\xde\x05\xef\x83\x0f\xc1\xc7\xe0\x53\xf0\x39\xf8\x12\x7c\x0d\xbe\x05\xdf\x83\x1f\xc1\xcf\xe0\x57\xf0\x3b\xf8\x13\xfc\x0d\xfe\x85\x09\xc2\x84\x61\xa2\x30\x71\x98\x24\x4c\x1a\x26\x0b\x93\x87\x29\xc2\x94\x61\xaa\x30\x75\x98\x26\x4c\x1b\xa6\x0b\xd3\x87\x19\xc2\x8c\x61\xa6\x30\x73\x98\x25\xcc\x1a\x66\x0b\xb3\x87\x39\xc2\x9c\x61\xae\x30\x77\x98\x27\xcc\x1b\xe6\x0b\xf3\x87\x05\xc2\x82\x61\xa1\xb0\x70\x58\x24\x2c\x1a\x16\x0b\x8b\x87\x25\xc2\x92\x61\xa9\xb0\x74\x58\x26\x2c\x1b\x96\x0b\xcb\x87\x15\xc2\x8a\x61\xa5\xb0\x72\x58\x25\xac\x1a\x56\x0b\xab\x87\x35\xc2\x9a\x61\xad\xb0\x76\x58\x27\xac\x1b\xd6\x0b\xeb\x87\x0d\xc2\x86\x61\xa3\xb0\x71\xd8\x24\x6c\x1a\x36\x0b\x9b\x87\x2d\xc2\x96\x61\xab\xb0\x75\xd8\x26\x6c\x1b\xb6\x0b\xdb\x87\x1d\xc2\x8e\x61\xa7\xb0\x73\xd8\x25\xec\x1a\x76\x0b\xbb\x87\x3d\xc2\x9e\x61\xaf\xb0\x77\xd8\x27\xec\x1b\xf6\x0b\xfb\x87\x03\xc2\x81\xe1\xa0\x70\x70\x38\x24\x1c\x1a\x0e\x0b\x87\x87\x23\xc2\x91\xe1\xa8\x70\x74\x38\x26\x1c\x1b\x8e\x0b\xc7\x87\x13\xc2\x89\xe1\xa4\x70\x72\x38\x25\x9c\x1a\x4e\x0b\xa7\x87\x33\xc2\x99\xe1\xac\x70\x76\x38\x27\x9c\x1b\xce\x0b\xe7\x87\x0b\xc2\x85\xe1\xa2\x70\x71\xb8\x24\x5c\x1a\x2e\x0b\x97\x87\x2b\xc2\x95\xe1\xaa\x70\x75\xb8\x26\x5c\x1b\xae\x0b\xd7\x87\x1b\x42\x2c\xc4\x43\x22\x24\x43\x2a\xa4\x43\x26\x64\x43\x2e\xe4\x43\x21\x14\x43\x29\x94\x43\x25\x54\x43\x2d\xd4\x43\x23\x34\x43\x2b\xb4\x43\x27\x74\x43\x2f\xf4\xc3\x20\x0c\xc3\x28\x04\x21\x0c\x51\x18\x87\x1b\xc3\x4d\xe1\xe6\x70\x4b\xb8\x35\xdc\x16\x6e\x0f\x77\x84\x3b\xc3\x5d\xe1\xee\x70\x4f\xb8\x37\xdc\x17\xee\x0f\x0f\x84\x07\xc3\x43\xe1\xe1\xf0\x48\x78\x34\x3c\x16\x1e\x0f\x4f\x84\x27\xc3\x53\xe1\xe9\xf0\x4c\x78\x36\x3c\x17\x9e\x0f\x2f\x84\x17\xc3\x4b\xe1\xe5\xf0\x4a\x78\x35\xbc\x16\x5e\x0f\x6f\x84\x37\xc3\x5b\xe1\xed\xf0\x4e\x78\x37\xbc\x17\xde\x0f\x1f\x84\x0f\xc3\x47\xe1\xe3\xf0\x49\xf8\x34\x7c\x16\x3e\x0f\x5f\x84\x2f\xc3\x57\xe1\xeb\xf0\x4d\xf8\x36\x7c\x17\xbe\x0f\x3f\x84\x1f\xc3\x4f\xe1\xe7\xf0\x4b\xf8\x35\xfc\x16\x7e\x0f\x7f\x84\x3f\xc3\x5f\xe1\xef\xf0\x4f\xf8\x37\xfc\x17\x25\x88\x12\x46\x89\xa2\xc4\x51\x92\x28\x69\x94\x2c\x4a\x1e\xa5\x88\x52\x46\xa9\xa2\xd4\x51\x9a\x28\x6d\x94\x2e\x4a\x1f\x65\x88\x32\x46\x99\xa2\xcc\x51\x96\x28\x6b\x94\x2d\xca\x1e\xe5\x88\x72\x46\xb9\xa2\xdc\x51\x9e\x28\x6f\x94\x2f\xca\x1f\x15\x88\x0a\x46\x85\xa2\xc2\x51\x91\xa8\x68\x54\x2c\x2a\x1e\x95\x88\x4a\x46\xa5\xa2\xd2\x51\x99\xa8\x6c\x54\x2e\x2a\x1f\x55\x88\x2a\x46\x95\xa2\xca\x51\x95\xa8\x6a\x54\x2d\xaa\x1e\xd5\x88\x6a\x46\xb5\xa2\xda\x51\x9d\xa8\x6e\x54\x2f\xaa\x1f\x35\x88\x1a\x46\x8d\xa2\xc6\x51\x93\xa8\x69\xd4\x2c\x6a\x1e\xb5\x88\x5a\x46\xad\xa2\xd6\x51\x9b\xa8\x6d\xd4\x2e\x6a\x1f\x75\x88\x3a\x46\x9d\xa2\xce\x51\x97\xa8\x6b\xd4\x2d\xea\x1e\xf5\x88\x7a\x46\xbd\xa2\xde\x51\x9f\xa8\x6f\xd4\x2f\xea\x1f\x0d\x88\x06\x46\x83\xa2\xc1\xd1\x90\x68\x68\x34\x2c\x1a\x1e\x8d\x88\x46\x46\xa3\xa2\xd1\xd1\x98\x68\x6c\x34\x2e\x1a\x1f\x4d\x88\x26\x46\x93\xa2\xc9\xd1\x94\x68\x6a\x34\x2d\x9a\x1e\xcd\x88\x66\x46\xb3\xa2\xd9\xd1\x9c\x68\x6e\x34\x2f\x9a\x1f\x2d\x88\x16\x46\x8b\xa2\xc5\xd1\x92\x68\x69\xb4\x2c\x5a\x1e\xad\x88\x56\x46\xab\xa2\xd5\xd1\x9a\x68\x6d\xb4\x2e\x5a\x1f\x6d\x88\xb0\x08\x8f\x88\x88\x8c\xa8\x88\x8e\x98\x88\x8d\xb8\x88\x8f\x84\x48\x8c\xa4\x48\x8e\x94\x48\x8d\xb4\x48\x8f\x8c\xc8\x8c\xac\xc8\x8e\x9c\xc8\x8d\xbc\xc8\x8f\x82\x28\x8c\xa2\x08\x44\x30\x42\x51\x1c\x6d\x8c\x36\x45\x9b\xa3\x2d\xd1\xd6\x68\x5b\xb4\x3d\xda\x11\xed\x8c\x76\x45\xbb\xa3\x3d\xd1\xde\x68\x5f\xb4\x3f\x3a\x10\x1d\x8c\x0e\x45\x87\xa3\x23\xd1\xd1\xe8\x58\x74\x3c\x3a\x11\x9d\x8c\x4e\x45\xa7\xa3\x33\xd1\xd9\xe8\x5c\x74\x3e\xba\x10\x5d\x8c\x2e\x45\x97\xa3\x2b\xd1\xd5\xe8\x5a\x74\x3d\xba\x11\xdd\x8c\x6e\x45\xb7\xa3\x3b\xd1\xdd\xe8\x5e\x74\x3f\x7a\x10\x3d\x8c\x1e\x45\x8f\xa3\x27\xd1\xd3\xe8\x59\xf4\x3c\x7a\x11\xbd\x8c\x5e\x45\xaf\xa3\x37\xd1\xdb\xe8\x5d\xf4\x3e\xfa\x10\x7d\x8c\x3e\x45\x9f\xa3\x2f\xd1\xd7\xe8\x5b\xf4\x3d\xfa\x11\xfd\x8c\x7e\x45\xbf\xa3\x3f\xd1\xdf\xe8\x1f\x48\x00\x12\x82\x44\x20\x31\x48\x02\x92\x82\x64\x20\x39\x48\x01\x52\x82\x54\x20\x35\x48\x03\xd2\x82\x74\x20\x3d\xc8\x00\x32\x82\x4c\x20\x33\xc8\x02\xb2\x82\x6c\x20\x3b\xc8\x01\x72\x82\x5c\x20\x37\xc8\x03\xf2\x82\x7c\x20\x3f\x28\x00\x0a\x82\x42\xa0\x30\x28\x02\x8a\x82\x62\xa0\x38\x28\x01\x4a\x82\x52\xa0\x34\x28\x03\xca\x82\x72\xa0\x3c\xa8\x00\x2a\x82\x4a\xa0\x32\xa8\x02\xaa\x82\x6a\xa0\x3a\xa8\x01\x6a\x82\x5a\xa0\x36\xa8\x03\xea\x82\x7a\xa0\x3e\x68\x00\x1a\x82\x46\xa0\x31\x68\x02\x9a\x82\x66\xa0\x39\x68\x01\x5a\x82\x56\xa0\x35\x68\x03\xda\x82\x76\xa0\x3d\xe8\x00\x3a\x82\x4e\xa0\x33\xe8\x02\xba\x82\x6e\xa0\x3b\xe8\x01\x7a\x82\x5e\xa0\x37\xe8\x03\xfa\x82\x7e\xa0\x3f\x18\x00\x06\x82\x41\x60\x30\x18\x02\x86\x82\x61\x60\x38\x18\x01\x46\x82\x51\x60\x34\x18\x03\xc6\x82\x71\x60\x3c\x98\x00\x26\x82\x49\x60\x32\x98\x02\xa6\x82\x69\x60\x3a\x98\x01\x66\x82\x59\x60\x36\x98\x03\xe6\x82\x79\x60\x3e\x58\x00\x16\x82\x45\x60\x31\x58\x02\x96\x82\x65\x60\x39\x58\x01\x56\x82\x55\x60\x35\x58\x03\xd6\x82\x75\x60\x3d\xd8\x00\x30\x80\x03\x02\x90\x80\x02\x34\x60\x00\x0b\x38\xc0\x03\x01\x88\x40\x02\x32\x50\x80\x0a\x34\xa0\x03\x03\x98\xc0\x02\x36\x70\x80\x0b\x3c\xe0\x83\x00\x84\x20\x02\x00\x40\x80\x40\x0c\x36\x82\x4d\x60\x33\xd8\x02\xb6\x82\x6d\x60\x3b\xd8\x01\x76\x82\x5d\x60\x37\xd8\x03\xf6\x82\x7d\x60\x3f\x38\x00\x0e\x82\x43\xe0\x30\x38\x02\x8e\x82\x63\xe0\x38\x38\x01\x4e\x82\x53\xe0\x34\x38\x03\xce\x82\x73\xe0\x3c\xb8\x00\x2e\x82\x4b\xe0\x32\xb8\x02\xae\x82\x6b\xe0\x3a\xb8\x01\x6e\x82\x5b\xe0\x36\xb8\x03\xee\x82\x7b\xe0\x3e\x78\x00\x1e\x82\x47\xe0\x31\x78\x02\x9e\x82\x67\xe0\x39\x78\x01\x5e\x82\x57\xe0\x35\x78\x03\xde\x82\x77\xe0\x3d\xf8\x00\x3e\x82\x4f\xe0\x33\xf8\x02\xbe\x82\x6f\xe0\x3b\xf8\x01\x7e\x82\x5f\xe0\x37\xf8\x03\xfe\x82\x7f\x30\x01\x4c\x08\x13\xc1\xc4\x30\x09\x4c\x0a\x93\xc1\xe4\x30\x05\x4c\x09\x53\xc1\xd4\x30\x0d\x4c\x0b\xd3\xc1\xf4\x30\x03\xcc\x08\x33\xc1\xcc\x30\x0b\xcc\x0a\xb3\xc1\xec\x30\x07\xcc\x09\x73\xc1\xdc\x30\x0f\xcc\x0b\xf3\xc1\xfc\xb0\x00\x2c\x08\x0b\xc1\xc2\xb0\x08\x2c\x0a\x8b\xc1\xe2\xb0\x04\x2c\x09\x4b\xc1\xd2\xb0\x0c\x2c\x0b\xcb\xc1\xf2\xb0\x02\xac\x08\x2b\xc1\xca\xb0\x0a\xac\x0a\xab\xc1\xea\xb0\x06\xac\x09\x6b\xc1\xda\xb0\x0e\xac\x0b\xeb\xc1\xfa\xb0\x01\x6c\x08\x1b\xc1\xc6\xb0\x09\x6c\x0a\x9b\xc1\xe6\xb0\x05\x6c\x09\x5b\xc1\xd6\xb0\x0d\x6c\x0b\xdb\xc1\xf6\xb0\x03\xec\x08\x3b\xc1\xce\xb0\x0b\xec\x0a\xbb\xc1\xee\xb0\x07\xec\x09\x7b\xc1\xde\xb0\x0f\xec\x0b\xfb\xc1\xfe\x70\x00\x1c\x08\x07\xc1\xc1\x70\x08\x1c\x0a\x87\xc1\xe1\x70\x04\x1c\x09\x47\xc1\xd1\x70\x0c\x1c\x0b\xc7\xc1\xf1\x70\x02\x9c\x08\x27\xc1\xc9\x70\x0a\x9c\x0a\xa7\xc1\xe9\x70\x06\x9c\x09\x67\xc1\xd9\x70\x0e\x9c\x0b\xe7\xc1\xf9\x70\x01\x5c\x08\x17\xc1\xc5\x70\x09\x5c\x0a\x97\xc1\xe5\x70\x05\x5c\x09\x57\xc1\xd5\x70\x0d\x5c\x0b\xd7\xc1\xf5\x70\x03\xc4\x20\x0e\x09\x48\x42\x0a\xd2\x90\x81\x2c\xe4\x20\x0f\x05\x28\x42\x09\xca\x50\x81\x2a\xd4\xa0\x0e\x0d\x68\x42\x0b\xda\xd0\x81\x2e\xf4\xa0\x0f\x03\x18\xc2\x08\x02\x08\x21\x82\x31\xdc\x08\x37\xc1\xcd\x70\x0b\xdc\x0a\xb7\xc1\xed\x70\x07\xdc\x09\x77\xc1\xdd\x70\x0f\xdc\x0b\xf7\xc1\xfd\xf0\x00\x3c\x08\x0f\xc1\xc3\xf0\x08\x3c\x0a\x8f\xc1\xe3\xf0\x04\x3c\x09\x4f\xc1\xd3\xf0\x0c\x3c\x0b\xcf\xc1\xf3\xf0\x02\xbc\x08\x2f\xc1\xcb\xf0\x0a\xbc\x0a\xaf\xc1\xeb\xf0\x06\xbc\x09\x6f\xc1\xdb\xf0\x0e\xbc\x0b\xef\xc1\xfb\xf0\x01\x7c\x08\x1f\xc1\xc7\xf0\x09\x7c\x0a\x9f\xc1\xe7\xf0\x05\x7c\x09\x5f\xc1\xd7\xf0\x0d\x7c\x0b\xdf\xc1\xf7\xf0\x03\xfc\x08\x3f\xc1\xcf\xf0\x0b\xfc\x0a\xbf\xc1\xef\xf0\x07\xfc\x09\x7f\xc1\xdf\xf0\x0f\xfc\x0b\xff\xa1\x04\x28\x21\x4a\x84\x12\xa3\x24\x28\x29\x4a\x86\x92\xa3\x14\x28\x25\x4a\x85\x52\xa3\x34\x28\x2d\x4a\x87\xd2\xa3\x0c\x28\x23\xca\x84\x32\xa3\x2c\x28\x2b\xca\x86\xb2\xa3\x1c\x28\x27\xca\x85\x72\xa3\x3c\x28\x2f\xca\x87\xf2\xa3\x02\xa8\x20\x2a\x84\x0a\xa3\x22\xa8\x28\x2a\x86\x8a\xa3\x12\xa8\x24\x2a\x85\x4a\xa3\x32\xa8\x2c\x2a\x87\xca\xa3\x0a\xa8\x22\xaa\x84\x2a\xa3\x2a\xa8\x2a\xaa\x86\xaa\xa3\x1a\xa8\x26\xaa\x85\x6a\xa3\x3a\xa8\x2e\xaa\x87\xea\xa3\x06\xa8\x21\x6a\x84\x1a\xa3\x26\xa8\x29\x6a\x86\x9a\xa3\x16\xa8\x25\x6a\x85\x5a\xa3\x36\xa8\x2d\x6a\x87\xda\xa3\x0e\xa8\x23\xea\x84\x3a\xa3\x2e\xa8\x2b\xea\x86\xba\xa3\x1e\xa8\x27\xea\x85\x7a\xa3\x3e\xa8\x2f\xea\x87\xfa\xa3\x01\x68\x20\x1a\x84\x06\xa3\x21\x68\x28\x1a\x86\x86\xa3\x11\x68\x24\x1a\x85\x46\xa3\x31\x68\x2c\x1a\x87\xc6\xa3\x09\x68\x22\x9a\x84\x26\xa3\x29\x68\x2a\x9a\x86\xa6\xa3\x19\x68\x26\x9a\x85\x66\xa3\x39\x68\x2e\x9a\x87\xe6\xa3\x05\x68\x21\x5a\x84\x16\xa3\x25\x68\x29\x5a\x86\x96\xa3\x15\x68\x25\x5a\x85\x56\xa3\x35\x68\x2d\x5a\x87\xd6\xa3\x0d\x08\x43\x38\x22\x10\x89\x28\x44\x23\x06\xb1\x88\x43\x3c\x12\x90\x88\x24\x24\x23\x05\xa9\x48\x43\x3a\x32\x90\x89\x2c\x64\x23\x07\xb9\xc8\x43\x3e\x0a\x50\x88\x22\x04\x10\x44\x08\xc5\x68\x23\xda\x84\x36\xa3\x2d\x68\x2b\xda\x86\xb6\xa3\x1d\x68\x27\xda\x85\x76\xa3\x3d\x68\x2f\xda\x87\xf6\xa3\x03\xe8\x20\x3a\x84\x0e\xa3\x23\xe8\x28\x3a\x86\x8e\xa3\x13\xe8\x24\x3a\x85\x4e\xa3\x33\xe8\x2c\x3a\x87\xce\xa3\x0b\xe8\x22\xba\x84\x2e\xa3\x2b\xe8\x2a\xba\x86\xae\xa3\x1b\xe8\x26\xba\x85\x6e\xa3\x3b\xe8\x2e\xba\x87\xee\xa3\x07\xe8\x21\x7a\x84\x1e\xa3\x27\xe8\x29\x7a\x86\x9e\xa3\x17\xe8\x25\x7a\x85\x5e\xa3\x37\xe8\x2d\x7a\x87\xde\xa3\x0f\xe8\x23\xfa\x84\x3e\xa3\x2f\xe8\x2b\xfa\x86\xbe\xa3\x1f\xe8\x27\xfa\x85\x7e\xa3\x3f\xe8\x2f\xfa\x17\x27\x88\x13\xc6\x89\xe2\xc4\x71\x92\x38\x69\x9c\x2c\x4e\x1e\xa7\x88\x53\xc6\xa9\xe2\xd4\x71\x9a\x38\x6d\x9c\x2e\x4e\x1f\x67\x88\x33\xc6\x99\xe2\xcc\x71\x96\x38\x6b\x9c\x2d\xce\x1e\xe7\x88\x73\xc6\xb9\xe2\xdc\x71\x9e\x38\x6f\x9c\x2f\xce\x1f\x17\x88\x0b\xc6\x85\xe2\xc2\x71\x91\xb8\x68\x5c\x2c\x2e\x1e\x97\x88\x4b\xc6\xa5\xe2\xd2\x71\x99\xb8\x6c\x5c\x2e\x2e\x1f\x57\x88\x2b\xc6\x95\xe2\xca\x71\x95\xb8\x6a\x5c\x2d\xae\x1e\xd7\x88\x6b\xc6\xb5\xe2\xda\x71\x9d\xb8\x6e\x5c\x2f\xae\x1f\x37\x88\x1b\xc6\x8d\xe2\xc6\x71\x93\xb8\x69\xdc\x2c\x6e\x1e\xb7\x88\x5b\xc6\xad\xe2\xd6\x71\x9b\xb8\x6d\xdc\x2e\x6e\x1f\x77\x88\x3b\xc6\x9d\xe2\xce\x71\x97\xb8\x6b\xdc\x2d\xee\x1e\xf7\x88\x7b\xc6\xbd\xe2\xde\x71\x9f\xb8\x6f\xdc\x2f\xee\x1f\x0f\x88\x07\xc6\x83\xe2\xc1\xf1\x90\x78\x68\x3c\x2c\x1e\x1e\x8f\x88\x47\xc6\xa3\xe2\xd1\xf1\x98\x78\x6c\x3c\x2e\x1e\x1f\x4f\xf8\xcf\xc5\x59\xc7\xb7\x6d\xfd\x7f\x77\x50\x58\xbb\x8e\x99\x99\x29\xba\xd2\x27\xb6\xc7\xb1\x63\x8d\x99\x79\x69\x9b\xb5\xd9\xd2\xa4\x4b\x93\x31\x33\x33\x33\x33\x59\xcc\x92\xc7\xcc\xcc\xcc\xcc\xbc\xe7\xd5\xfa\x24\xdf\xfe\x9e\x7f\x7a\x95\xc6\xb9\xe7\xca\x96\x74\x6e\x6e\xde\xf7\xd3\x38\xb4\x31\xd0\x98\xd1\x18\x6c\x0c\x35\x0e\x6b\x1c\xde\x38\xa2\x71\x64\xe3\xa8\xc6\xd1\x8d\x63\x1a\xc7\x36\x8e\x6b\x1c\xdf\x38\xa1\x71\x62\xe3\xa4\xc6\xc9\x8d\x53\x1a\xa7\x36\x4e\x6b\x9c\xde\x38\xa3\x71\x66\xe3\xac\xc6\xd9\x8d\x73\x1a\xe7\x36\xce\x6b\x9c\xdf\xb8\xa0\x71\x61\xe3\xa2\xc6\xc5\x8d\x4b\x1a\x97\x36\x2e\x6b\x5c\xde\xb8\xa2\x71\x65\xe3\xaa\xc6\xd5\x8d\x6b\x1a\xd7\x36\xae\x6b\x5c\xdf\xb8\xa1\x71\x63\xe3\xa6\xc6\xcd\x8d\x5b\x1a\xb7\x36\x6e\x6b\xdc\xde\xb8\xa3\x71\x67\xe3\xae\xc6\xdd\x8d\x7b\x1a\xf7\x36\xee\x6b\xdc\xdf\x78\xa0\xd1\x68\x58\x0d\xbb\xe1\x34\xdc\x86\xd7\xf0\x1b\x41\x23\x6c\x44\x8d\xb8\x91\x34\xd2\x46\xd6\xc8\x1b\x45\xa3\xd9\x78\xb0\xf1\x50\xe3\xe1\xc6\x23\x8d\x47\x1b\x8f\x35\x1e\x6f\x3c\xd1\x78\xb2\xf1\x54\xe3\xe9\xc6\x33\x8d\x67\x1b\xcf\x35\x9e\x6f\xbc\xd0\x78\xb1\xf1\x52\xe3\xe5\xc6\x2b\x8d\x57\x1b\xaf\x35\x5e\x6f\xbc\xd1\x78\xb3\xf1\x56\xe3\xed\xc6\x3b\x8d\x77\x1b\xef\x35\xde\x6f\x7c\xd0\xf8\xb0\xf1\x51\xe3\xe3\xc6\x27\x8d\x4f\x1b\x9f\x35\x3e\x6f\x7c\xd1\xf8\xb2\xf1\x55\xe3\xeb\xc6\x37\x8d\x6f\x1b\xdf\x35\xbe\x6f\xfc\xd0\xf8\xb1\xf1\x53\xe3\xe7\xc6\x2f\x8d\x5f\x1b\xbf\x35\x7e\x6f\xfc\xd1\xf8\xb3\xf1\x57\xe3\xef\xc6\x3f\x8d\x7f\x1b\xff\x59\x73\x58\x73\x5a\x73\x59\x73\x5b\xa3\xac\xd1\xd6\x18\x6b\xac\x35\x8f\x35\xce\x1a\x6f\xcd\x6b\x4d\xb0\xe6\xb3\xe6\xb7\x16\xb0\x16\xb4\x16\xb2\x16\xb6\x16\xb1\x16\xb5\x16\xb3\x16\xb7\x96\xb0\x96\xb4\x96\xb2\x96\xb6\x96\xb1\x96\xb5\x96\xb3\x96\xb7\x56\xb0\x56\xb4\x56\xb2\x56\xb6\x56\xb1\x56\xb5\x56\xb3\x56\xb7\xd6\xb0\xd6\xb4\xd6\xb2\xd6\xb6\xd6\xb1\xd6\xb5\xd6\xb3\xd6\xb7\x36\xb0\xda\x2c\xcd\x52\x96\x6e\x19\x96\x58\xed\x56\xc9\x2a\x5b\x15\x6b\x43\x6b\x23\x6b\x63\x6b\x13\x6b\x53\x6b\x33\x6b\x73\xab\xc3\xaa\x5a\x35\xab\xd3\xaa\x5b\xa6\xb5\x85\xb5\xa5\xb5\x95\xb5\xb5\xb5\x8d\xb5\xad\xb5\x9d\xb5\xbd\xb5\x83\xb5\xa3\xb5\x93\xb5\xb3\xb5\x8b\xb5\xab\xb5\x9b\xb5\xbb\xb5\x87\xb5\xa7\xb5\x97\xb5\xb7\xb5\x8f\xb5\xaf\xb5\x9f\xb5\xbf\x75\x80\x75\xa0\xd5\x65\x4d\xb4\x26\x59\x93\xad\x6e\xeb\x20\x6b\x8a\x35\xd5\xea\xb1\x0e\xb6\x0e\xb1\x7a\xad\x69\x56\x9f\xd5\x6f\x4d\xb7\x0e\xb5\x06\xac\x19\xd6\xa0\x35\x64\x1d\x66\x1d\x6e\x1d\x61\x1d\x69\x1d\x65\x1d\x6d\x1d\x63\x1d\x6b\x1d\x67\x1d\x6f\x9d\x60\x9d\x68\x9d\x64\x9d\x6c\x9d\x62\x9d\x6a\x9d\x66\x9d\x6e\x9d\x61\x9d\x69\x9d\x65\x9d\x6d\x9d\x63\x9d\x6b\x9d\x67\x9d\x6f\x5d\x60\x5d\x68\x5d\x64\x5d\x6c\x5d\x62\x5d\x6a\x5d\x66\x5d\x6e\x5d\x61\x5d\x69\x5d\x65\x5d\x6d\x5d\x63\x5d\x6b\x5d\x67\x5d\x6f\xdd\x60\xdd\x68\xdd\x64\xdd\x6c\xdd\x62\xdd\x6a\xdd\x66\xdd\x6e\xdd\x61\xdd\x69\xdd\x65\xdd\x6d\xdd\x63\xdd\x6b\xdd\x67\xdd\x6f\x3d\x60\x35\x2c\xcb\xb2\x2d\xc7\x72\x2d\xcf\xf2\xad\xc0\x0a\xad\xc8\x8a\xad\xc4\x4a\xad\xcc\xca\xad\xc2\x6a\x5a\x0f\x5a\x0f\x59\x0f\x5b\x8f\x58\x8f\x5a\x8f\x59\x8f\x5b\x4f\x58\x4f\x5a\x4f\x59\x4f\x5b\xcf\x58\xcf\x5a\xcf\x59\xcf\x5b\x2f\x58\x2f\x5a\x2f\x59\x2f\x5b\xaf\x58\xaf\x5a\xaf\x59\xaf\x5b\x6f\x58\x6f\x5a\x6f\x59\x6f\x5b\xef\x58\xef\x5a\xef\x59\xef\x5b\x1f\x58\x1f\x5a\x1f\x59\x1f\x5b\x9f\x58\x9f\x5a\x9f\x59\x9f\x5b\x5f\x58\x5f\x5a\x5f\x59\x5f\x5b\xdf\x58\xdf\x5a\xdf\x59\xdf\x5b\x3f\x58\x3f\x5a\x3f\x59\x3f\x5b\xbf\x58\xbf\x5a\xbf\x59\xbf\x5b\x7f\x58\x7f\x5a\x7f\x59\x7f\x5b\xff\x58\xff\x5a\xff\xd9\x73\xd8\x73\xda\x73\xd9\x73\xdb\xa3\xec\xd1\xf6\x18\x7b\xac\x3d\x8f\x3d\xce\x1e\x6f\xcf\x6b\x4f\xb0\xe7\xb3\xe7\xb7\x17\xb0\x17\xb4\x17\xb2\x17\xb6\x17\xb1\x17\xb5\x17\xb3\x17\xb7\x97\xb0\x97\xb4\x97\xb2\x97\xb6\x97\xb1\x97\xb5\x97\xb3\x97\xb7\x57\xb0\x57\xb4\x57\xb2\x57\xb6\x57\xb1\x57\xb5\x57\xb3\x57\xb7\xd7\xb0\xd7\xb4\xd7\xb2\xd7\xb6\xd7\xb1\xd7\xb5\xd7\xb3\xd7\xb7\x37\xb0\xdb\x6c\xcd\x56\xb6\x6e\x1b\xb6\xd8\xed\x76\xc9\x2e\xdb\x15\x7b\x43\x7b\x23\x7b\x63\x7b\x13\x7b\x53\x7b\x33\x7b\x73\xbb\xc3\xae\xda\x35\xbb\xd3\xae\xdb\xa6\xbd\x85\xbd\xa5\xbd\x95\xbd\xb5\xbd\x8d\xbd\xad\xbd\x9d\xbd\xbd\xbd\x83\xbd\xa3\xbd\x93\xbd\xb3\xbd\x8b\xbd\xab\xbd\x9b\xbd\xbb\xbd\x87\xbd\xa7\xbd\x97\xbd\xb7\xbd\x8f\xbd\xaf\xbd\x9f\xbd\xbf\x7d\x80\x7d\xa0\xdd\x65\x4f\xb4\x27\xd9\x93\xed\x6e\xfb\x20\x7b\x8a\x3d\xd5\xee\xb1\x0f\xb6\x0f\xb1\x7b\xed\x69\x76\x9f\xdd\x6f\x4f\xb7\x0f\xb5\x07\xec\x19\xf6\xa0\x3d\x64\x1f\x66\x1f\x6e\x1f\x61\x1f\x69\x1f\x65\x1f\x6d\x1f\x63\x1f\x6b\x1f\x67\x1f\x6f\x9f\x60\x9f\x68\x9f\x64\x9f\x6c\x9f\x62\x9f\x6a\x9f\x66\x9f\x6e\x9f\x61\x9f\x69\x9f\x65\x9f\x6d\x9f\x63\x9f\x6b\x9f\x67\x9f\x6f\x5f\x60\x5f\x68\x5f\x64\x5f\x6c\x5f\x62\x5f\x6a\x5f\x66\x5f\x6e\x5f\x61\x5f\x69\x5f\x65\x5f\x6d\x5f\x63\x5f\x6b\x5f\x67\x5f\x6f\xdf\x60\xdf\x68\xdf\x64\xdf\x6c\xdf\x62\xdf\x6a\xdf\x66\xdf\x6e\xdf\x61\xdf\x69\xdf\x65\xdf\x6d\xdf\x63\xdf\x6b\xdf\x67\xdf\x6f\x3f\x60\x37\x6c\xcb\xb6\x6d\xc7\x76\x6d\xcf\xf6\xed\xc0\x0e\xed\xc8\x8e\xed\xc4\x4e\xed\xcc\xce\xed\xc2\x6e\xda\x0f\xda\x0f\xd9\x0f\xdb\x8f\xd8\x8f\xda\x8f\xd9\x8f\xdb\x4f\xd8\x4f\xda\x4f\xd9\x4f\xdb\xcf\xd8\xcf\xda\xcf\xd9\xcf\xdb\x2f\xd8\x2f\xda\x2f\xd9\x2f\xdb\xaf\xd8\xaf\xda\xaf\xd9\xaf\xdb\x6f\xd8\x6f\xda\x6f\xd9\x6f\xdb\xef\xd8\xef\xda\xef\xd9\xef\xdb\x1f\xd8\x1f\xda\x1f\xd9\x1f\xdb\x9f\xd8\x9f\xda\x9f\xd9\x9f\xdb\x5f\xd8\x5f\xda\x5f\xd9\x5f\xdb\xdf\xd8\xdf\xda\xdf\xd9\xdf\xdb\x3f\xd8\x3f\xda\x3f\xd9\x3f\xdb\xbf\xd8\xbf\xda\xbf\xd9\xbf\xdb\x7f\xd8\x7f\xda\x7f\xd9\x7f\xdb\xff\xd8\xff\xda\xff\x39\x73\x38\x73\x3a\x73\x39\x73\x3b\xa3\x9c\xd1\xce\x18\x67\xac\x33\x8f\x33\xce\x19\xef\xcc\xeb\x4c\x70\xe6\x73\xe6\x77\x16\x70\x16\x74\x16\x72\x16\x76\x16\x71\x16\x75\x16\x73\x16\x77\x96\x70\x96\x74\x96\x72\x96\x76\x96\x71\x96\x75\x96\x73\x96\x77\x56\x70\x56\x74\x56\x72\x56\x76\x56\x71\x56\x75\x56\x73\x56\x77\xd6\x70\xd6\x74\xd6\x72\xd6\x76\xd6\x71\xd6\x75\xd6\x73\xd6\x77\x36\x70\xda\x1c\xcd\x51\x8e\xee\x18\x8e\x38\xed\x4e\xc9\x29\x3b\x15\x67\x43\x67\x23\x67\x63\x67\x13\x67\x53\x67\x33\x67\x73\xa7\xc3\xa9\x3a\x35\xa7\xd3\xa9\x3b\xa6\xb3\x85\xb3\xa5\xb3\x95\xb3\xb5\xb3\x8d\xb3\xad\xb3\x9d\xb3\xbd\xb3\x83\xb3\xa3\xb3\x93\xb3\xb3\xb3\x8b\xb3\xab\xb3\x9b\xb3\xbb\xb3\x87\xb3\xa7\xb3\x97\xb3\xb7\xb3\x8f\xb3\xaf\xb3\x9f\xb3\xbf\x73\x80\x73\xa0\xd3\xe5\x4c\x74\x26\x39\x93\x9d\x6e\xe7\x20\x67\x8a\x33\xd5\xe9\x71\x0e\x76\x0e\x71\x7a\x9d\x69\x4e\x9f\xd3\xef\x4c\x77\x0e\x75\x06\x9c\x19\xce\xa0\x33\xe4\x1c\xe6\x1c\xee\x1c\xe1\x1c\xe9\x1c\xe5\x1c\xed\x1c\xe3\x1c\xeb\x1c\xe7\x1c\xef\x9c\xe0\x9c\xe8\x9c\xe4\x9c\xec\x9c\xe2\x9c\xea\x9c\xe6\x9c\xee\x9c\xe1\x9c\xe9\x9c\xe5\x9c\xed\x9c\xe3\x9c\xeb\x9c\xe7\x9c\xef\x5c\xe0\x5c\xe8\x5c\xe4\x5c\xec\x5c\xe2\x5c\xea\x5c\xe6\x5c\xee\x5c\xe1\x5c\xe9\x5c\xe5\x5c\xed\x5c\xe3\x5c\xeb\x5c\xe7\x5c\xef\xdc\xe0\xdc\xe8\xdc\xe4\xdc\xec\xdc\xe2\xdc\xea\xdc\xe6\xdc\xee\xdc\xe1\xdc\xe9\xdc\xe5\xdc\xed\xdc\xe3\xdc\xeb\xdc\xe7\xdc\xef\x3c\xe0\x34\x1c\xcb\xb1\x1d\xc7\x71\x1d\xcf\xf1\x9d\xc0\x09\x9d\xc8\x89\x9d\xc4\x49\x9d\xcc\xc9\x9d\xc2\x69\x3a\x0f\x3a\x0f\x39\x0f\x3b\x8f\x38\x8f\x3a\x8f\x39\x8f\x3b\x4f\x38\x4f\x3a\x4f\x39\x4f\x3b\xcf\x38\xcf\x3a\xcf\x39\xcf\x3b\x2f\x38\x2f\x3a\x2f\x39\x2f\x3b\xaf\x38\xaf\x3a\xaf\x39\xaf\x3b\x6f\x38\x6f\x3a\x6f\x39\x6f\x3b\xef\x38\xef\x3a\xef\x39\xef\x3b\x1f\x38\x1f\x3a\x1f\x39\x1f\x3b\x9f\x38\x9f\x3a\x9f\x39\x9f\x3b\x5f\x38\x5f\x3a\x5f\x39\x5f\x3b\xdf\x38\xdf\x3a\xdf\x39\xdf\x3b\x3f\x38\x3f\x3a\x3f\x39\x3f\x3b\xbf\x38\xbf\x3a\xbf\x39\xbf\x3b\x7f\x38\x7f\x3a\x7f\x39\x7f\x3b\xff\x38\xff\x3a\xff\xb9\x73\xb8\x73\xba\x73\xb9\x73\xbb\xa3\xdc\xd1\xee\x18\x77\xac\x3b\x8f\x3b\xce\x1d\xef\xce\xeb\x4e\x70\xe7\x73\xe7\x77\x17\x70\x17\x74\x17\x72\x17\x76\x17\x71\x17\x75\x17\x73\x17\x77\x97\x70\x97\x74\x97\x72\x97\x76\x97\x71\x97\x75\x97\x73\x97\x77\x57\x70\x57\x74\x57\x72\x57\x76\x57\x71\x57\x75\x57\x73\x57\x77\xd7\x70\xd7\x74\xd7\x72\xd7\x76\xd7\x71\xd7\x75\xd7\x73\xd7\x77\x37\x70\xdb\x5c\xcd\x55\xae\xee\x1a\xae\xb8\xed\x6e\xc9\x2d\xbb\x15\x77\x43\x77\x23\x77\x63\x77\x13\x77\x53\x77\x33\x77\x73\xb7\xc3\xad\xba\x35\xb7\xd3\xad\xbb\xa6\xbb\x85\xbb\xa5\xbb\x95\xbb\xb5\xbb\x8d\xbb\xad\xbb\x9d\xbb\xbd\xbb\x83\xbb\xa3\xbb\x93\xbb\xb3\xbb\x8b\xbb\xab\xbb\x9b\xbb\xbb\xbb\x87\xbb\xa7\xbb\x97\xbb\xb7\xbb\x8f\xbb\xaf\xbb\x9f\xbb\xbf\x7b\x80\x7b\xa0\xdb\xe5\x4e\x74\x27\xb9\x93\xdd\x6e\xf7\x20\x77\x8a\x3b\xd5\xed\x71\x0f\x76\x0f\x71\x7b\xdd\x69\x6e\x9f\xdb\xef\x4e\x77\x0f\x75\x07\xdc\x19\xee\xa0\x3b\xe4\x1e\xe6\x1e\xee\x1e\xe1\x1e\xe9\x1e\xe5\x1e\xed\x1e\xe3\x1e\xeb\x1e\xe7\x1e\xef\x9e\xe0\x9e\xe8\x9e\xe4\x9e\xec\x9e\xe2\x9e\xea\x9e\xe6\x9e\xee\x9e\xe1\x9e\xe9\x9e\xe5\x9e\xed\x9e\xe3\x9e\xeb\x9e\xe7\x9e\xef\x5e\xe0\x5e\xe8\x5e\xe4\x5e\xec\x5e\xe2\x5e\xea\x5e\xe6\x5e\xee\x5e\xe1\x5e\xe9\x5e\xe5\x5e\xed\x5e\xe3\x5e\xeb\x5e\xe7\x5e\xef\xde\xe0\xde\xe8\xde\xe4\xde\xec\xde\xe2\xde\xea\xde\xe6\xde\xee\xde\xe1\xde\xe9\xde\xe5\xde\xed\xde\xe3\xde\xeb\xde\xe7\xde\xef\x3e\xe0\x36\x5c\xcb\xb5\x5d\xc7\x75\x5d\xcf\xf5\xdd\xc0\x0d\xdd\xc8\x8d\xdd\xc4\x4d\xdd\xcc\xcd\xdd\xc2\x6d\xba\x0f\xba\x0f\xb9\x0f\xbb\x8f\xb8\x8f\xba\x8f\xb9\x8f\xbb\x4f\xb8\x4f\xba\x4f\xb9\x4f\xbb\xcf\xb8\xcf\xba\xcf\xb9\xcf\xbb\x2f\xb8\x2f\xba\x2f\xb9\x2f\xbb\xaf\xb8\xaf\xba\xaf\xb9\xaf\xbb\x6f\xb8\x6f\xba\x6f\xb9\x6f\xbb\xef\xb8\xef\xba\xef\xb9\xef\xbb\x1f\xb8\x1f\xba\x1f\xb9\x1f\xbb\x9f\xb8\x9f\xba\x9f\xb9\x9f\xbb\x5f\xb8\x5f\xba\x5f\xb9\x5f\xbb\xdf\xb8\xdf\xba\xdf\xb9\xdf\xbb\x3f\xb8\x3f\xba\x3f\xb9\x3f\xbb\xbf\xb8\xbf\xba\xbf\xb9\xbf\xbb\x7f\xb8\x7f\xba\x7f\xb9\x7f\xbb\xff\xb8\xff\xba\xff\x79\x73\x78\x73\x7a\x73\x79\x73\x7b\xa3\xbc\xd1\xde\x18\x6f\xac\x37\x8f\x37\xce\x1b\xef\xcd\xeb\x4d\xf0\xe6\xf3\xe6\xf7\x16\xf0\x16\xf4\x16\xf2\x16\xf6\x16\xf1\x16\xf5\x16\xf3\x16\xf7\x96\xf0\x96\xf4\x96\xf2\x96\xf6\x96\xf1\x96\xf5\x96\xf3\x96\xf7\x56\xf0\x56\xf4\x56\xf2\x56\xf6\x56\xf1\x56\xf5\x56\xf3\x56\xf7\xd6\xf0\xd6\xf4\xd6\xf2\xd6\xf6\xd6\xf1\xd6\xf5\xd6\xf3\xd6\xf7\x36\xf0\xda\x3c\xcd\x53\x9e\xee\x19\x9e\x78\xed\x5e\xc9\x2b\x7b\x15\x6f\x43\x6f\x23\x6f\x63\x6f\x13\x6f\x53\x6f\x33\x6f\x73\xaf\xc3\xab\x7a\x35\xaf\xd3\xab\x7b\xa6\xb7\x85\xb7\xa5\xb7\x95\xb7\xb5\xb7\x8d\xb7\xad\xb7\x9d\xb7\xbd\xb7\x83\xb7\xa3\xb7\x93\xb7\xb3\xb7\x8b\xb7\xab\xb7\x9b\xb7\xbb\xb7\x87\xb7\xa7\xb7\x97\xb7\xb7\xb7\x8f\xb7\xaf\xb7\x9f\xb7\xbf\x77\x80\x77\xa0\xd7\xe5\x4d\xf4\x26\x79\x93\xbd\x6e\xef\x20\x6f\x8a\x37\xd5\xeb\xf1\x0e\xf6\x0e\xf1\x7a\xbd\x69\x5e\x9f\xd7\xef\x4d\xf7\x0e\xf5\x06\xbc\x19\xde\xa0\x37\xe4\x1d\xe6\x1d\xee\x1d\xe1\x1d\xe9\x1d\xe5\x1d\xed\x1d\xe3\x1d\xeb\x1d\xe7\x1d\xef\x9d\xe0\x9d\xe8\x9d\xe4\x9d\xec\x9d\xe2\x9d\xea\x9d\xe6\x9d\xee\x9d\xe1\x9d\xe9\x9d\xe5\x9d\xed\x9d\xe3\x9d\xeb\x9d\xe7\x9d\xef\x5d\xe0\x5d\xe8\x5d\xe4\x5d\xec\x5d\xe2\x5d\xea\x5d\xe6\x5d\xee\x5d\xe1\x5d\xe9\x5d\xe5\x5d\xed\x5d\xe3\x5d\xeb\x5d\xe7\x5d\xef\xdd\xe0\xdd\xe8\xdd\xe4\xdd\xec\xdd\xe2\xdd\xea\xdd\xe6\xdd\xee\xdd\xe1\xdd\xe9\xdd\xe5\xdd\xed\xdd\xe3\xdd\xeb\xdd\xe7\xdd\xef\x3d\xe0\x35\x3c\xcb\xb3\x3d\xc7\x73\x3d\xcf\xf3\xbd\xc0\x0b\xbd\xc8\x8b\xbd\xc4\x4b\xbd\xcc\xcb\xbd\xc2\x6b\x7a\x0f\x7a\x0f\x79\x0f\x7b\x8f\x78\x8f\x7a\x8f\x79\x8f\x7b\x4f\x78\x4f\x7a\x4f\x79\x4f\x7b\xcf\x78\xcf\x7a\xcf\x79\xcf\x7b\x2f\x78\x2f\x7a\x2f\x79\x2f\x7b\xaf\x78\xaf\x7a\xaf\x79\xaf\x7b\x6f\x78\x6f\x7a\x6f\x79\x6f\x7b\xef\x78\xef\x7a\xef\x79\xef\x7b\x1f\x78\x1f\x7a\x1f\x79\x1f\x7b\x9f\x78\x9f\x7a\x9f\x79\x9f\x7b\x5f\x78\x5f\x7a\x5f\x79\x5f\x7b\xdf\x78\xdf\x7a\xdf\x79\xdf\x7b\x3f\x78\x3f\x7a\x3f\x79\x3f\x7b\xbf\x78\xbf\x7a\xbf\x79\xbf\x7b\x7f\x78\x7f\x7a\x7f\x79\x7f\x7b\xff\x78\xff\x7a\xff\xf9\x73\xf8\x73\xfa\x73\xf9\x73\xfb\xa3\xfc\xd1\xfe\x18\x7f\xac\x3f\x8f\x3f\xce\x1f\xef\xcf\xeb\x4f\xf0\xe7\xf3\xe7\xf7\x17\xf0\x17\xf4\x17\xf2\x17\xf6\x17\xf1\x17\xf5\x17\xf3\x17\xf7\x97\xf0\x97\xf4\x97\xf2\x97\xf6\x97\xf1\x97\xf5\x97\xf3\x97\xf7\x57\xf0\x57\xf4\x57\xf2\x57\xf6\x57\xf1\x57\xf5\x57\xf3\x57\xf7\xd7\xf0\xd7\xf4\xd7\xf2\xd7\xf6\xd7\xf1\xd7\xf5\xd7\xf3\xd7\xf7\x37\xf0\xdb\x7c\xcd\x57\xbe\xee\x1b\xbe\xf8\xed\x7e\xc9\x2f\xfb\x15\x7f\x43\x7f\x23\x7f\x63\x7f\x13\x7f\x53\x7f\x33\x7f\x73\xbf\xc3\xaf\xfa\x35\xbf\xd3\xaf\xfb\xa6\xbf\x85\xbf\xa5\xbf\x95\xbf\xb5\xbf\x8d\xbf\xad\xbf\x9d\xbf\xbd\xbf\x83\xbf\xa3\xbf\x93\xbf\xb3\xbf\x8b\xbf\xab\xbf\x9b\xbf\xbb\xbf\x87\xbf\xa7\xbf\x97\xbf\xb7\xbf\x8f\xbf\xaf\xbf\x9f\xbf\xbf\x7f\x80\x7f\xa0\xdf\xe5\x4f\xf4\x27\xf9\x93\xfd\x6e\xff\x20\x7f\x8a\x3f\xd5\xef\xf1\x0f\xf6\x0f\xf1\x7b\xfd\x69\x7e\x9f\xdf\xef\x4f\xf7\x0f\xf5\x07\xfc\x19\xfe\xa0\x3f\xe4\x1f\xe6\x1f\xee\x1f\xe1\x1f\xe9\x1f\xe5\x1f\xed\x1f\xe3\x1f\xeb\x1f\xe7\x1f\xef\x9f\xe0\x9f\xe8\x9f\xe4\x9f\xec\x9f\xe2\x9f\xea\x9f\xe6\x9f\xee\x9f\xe1\x9f\xe9\x9f\xe5\x9f\xed\x9f\xe3\x9f\xeb\x9f\xe7\x9f\xef\x5f\xe0\x5f\xe8\x5f\xe4\x5f\xec\x5f\xe2\x5f\xea\x5f\xe6\x5f\xee\x5f\xe1\x5f\xe9\x5f\xe5\x5f\xed\x5f\xe3\x5f\xeb\x5f\xe7\x5f\xef\xdf\xe0\xdf\xe8\xdf\xe4\xdf\xec\xdf\xe2\xdf\xea\xdf\xe6\xdf\xee\xdf\xe1\xdf\xe9\xdf\xe5\xdf\xed\xdf\xe3\xdf\xeb\xdf\xe7\xdf\xef\x3f\xe0\x37\x7c\xcb\xb7\x7d\xc7\x77\x7d\xcf\xf7\xfd\xc0\x0f\xfd\xc8\x8f\xfd\xc4\x4f\xfd\xcc\xcf\xfd\xc2\x6f\xfa\x0f\xfa\x0f\xf9\x0f\xfb\x8f\xf8\x8f\xfa\x8f\xf9\x8f\xfb\x4f\xf8\x4f\xfa\x4f\xf9\x4f\xfb\xcf\xf8\xcf\xfa\xcf\xf9\xcf\xfb\x2f\xf8\x2f\xfa\x2f\xf9\x2f\xfb\xaf\xf8\xaf\xfa\xaf\xf9\xaf\xfb\x6f\xf8\x6f\xfa\x6f\xf9\x6f\xfb\xef\xf8\xef\xfa\xef\xf9\xef\xfb\x1f\xf8\x1f\xfa\x1f\xf9\x1f\xfb\x9f\xf8\x9f\xfa\x9f\xf9\x9f\xfb\x5f\xf8\x5f\xfa\x5f\xf9\x5f\xfb\xdf\xf8\xdf\xfa\xdf\xf9\xdf\xfb\x3f\xf8\x3f\xfa\x3f\xf9\x3f\xfb\xbf\xf8\xbf\xfa\xbf\xf9\xbf\xfb\x7f\xf8\x7f\xfa\x7f\xf9\x7f\xfb\xff\xf8\xff\xfa\xff\x05\x73\x04\x73\x06\x73\x05\x73\x07\xa3\x82\xd1\xc1\x98\x60\x6c\x30\x4f\x30\x2e\x18\x1f\xcc\x1b\x4c\x08\xe6\x0b\xe6\x0f\x16\x08\x16\x0c\x16\x0a\x16\x0e\x16\x09\x16\x0d\x16\x0b\x16\x0f\x96\x08\x96\x0c\x96\x0a\x96\x0e\x96\x09\x96\x0d\x96\x0b\x96\x0f\x56\x08\x56\x0c\x56\x0a\x56\x0e\x56\x09\x56\x0d\x56\x0b\x56\x0f\xd6\x08\xd6\x0c\xd6\x0a\xd6\x0e\xd6\x09\xd6\x0d\xd6\x0b\xd6\x0f\x36\x08\xda\x02\x2d\x50\x81\x1e\x18\x81\x04\xed\x41\x29\x28\x07\x95\x60\xc3\x60\xa3\x60\xe3\x60\x93\x60\xd3\x60\xb3\x60\xf3\xa0\x23\xa8\x06\xb5\xa0\x33\xa8\x07\x66\xb0\x45\xb0\x65\xb0\x55\xb0\x75\xb0\x4d\xb0\x6d\xb0\x5d\xb0\x7d\xb0\x43\xb0\x63\xb0\x53\xb0\x73\xb0\x4b\xb0\x6b\xb0\x5b\xb0\x7b\xb0\x47\xb0\x67\xb0\x57\xb0\x77\xb0\x4f\xb0\x6f\xb0\x5f\xb0\x7f\x70\x40\x70\x60\xd0\x15\x4c\x0c\x26\x05\x93\x83\xee\xe0\xa0\x60\x4a\x30\x35\xe8\x09\x0e\x0e\x0e\x09\x7a\x83\x69\x41\x5f\xd0\x1f\x4c\x0f\x0e\x0d\x06\x82\x19\xc1\x60\x30\x14\x1c\x16\x1c\x1e\x1c\x11\x1c\x19\x1c\x15\x1c\x1d\x1c\x13\x1c\x1b\x1c\x17\x1c\x1f\x9c\x10\x9c\x18\x9c\x14\x9c\x1c\x9c\x12\x9c\x1a\x9c\x16\x9c\x1e\x9c\x11\x9c\x19\x9c\x15\x9c\x1d\x9c\x13\x9c\x1b\x9c\x17\x9c\x1f\x5c\x10\x5c\x18\x5c\x14\x5c\x1c\x5c\x12\x5c\x1a\x5c\x16\x5c\x1e\x5c\x11\x5c\x19\x5c\x15\x5c\x1d\x5c\x13\x5c\x1b\x5c\x17\x5c\x1f\xdc\x10\xdc\x18\xdc\x14\xdc\x1c\xdc\x12\xdc\x1a\xdc\x16\xdc\x1e\xdc\x11\xdc\x19\xdc\x15\xdc\x1d\xdc\x13\xdc\x1b\xdc\x17\xdc\x1f\x3c\x10\x34\x02\x2b\xb0\x03\x27\x70\x03\x2f\xf0\x83\x20\x08\x83\x28\x88\x83\x24\x48\x83\x2c\xc8\x83\x22\x68\x06\x0f\x06\x0f\x05\x0f\x07\x8f\x04\x8f\x06\x8f\x05\x8f\x07\x4f\x04\x4f\x06\x4f\x05\x4f\x07\xcf\x04\xcf\x06\xcf\x05\xcf\x07\x2f\x04\x2f\x06\x2f\x05\x2f\x07\xaf\x04\xaf\x06\xaf\x05\xaf\x07\x6f\x04\x6f\x06\x6f\x05\x6f\x07\xef\x04\xef\x06\xef\x05\xef\x07\x1f\x04\x1f\x06\x1f\x05\x1f\x07\x9f\x04\x9f\x06\x9f\x05\x9f\x07\x5f\x04\x5f\x06\x5f\x05\x5f\x07\xdf\x04\xdf\x06\xdf\x05\xdf\x07\x3f\x04\x3f\x06\x3f\x05\x3f\x07\xbf\x04\xbf\x06\xbf\x05\xbf\x07\x7f\x04\x7f\x06\x7f\x05\x7f\x07\xff\x04\xff\x06\xff\x85\x73\x84\x73\x86\x73\x85\x73\x87\xa3\xc2\xd1\xe1\x98\x70\x6c\x38\x4f\x38\x2e\x1c\x1f\xce\x1b\x4e\x08\xe7\x0b\xe7\x0f\x17\x08\x17\x0c\x17\x0a\x17\x0e\x17\x09\x17\x0d\x17\x0b\x17\x0f\x97\x08\x97\x0c\x97\x0a\x97\x0e\x97\x09\x97\x0d\x97\x0b\x97\x0f\x57\x08\x57\x0c\x57\x0a\x57\x0e\x57\x09\x57\x0d\x57\x0b\x57\x0f\xd7\x08\xd7\x0c\xd7\x0a\xd7\x0e\xd7\x09\xd7\x0d\xd7\x0b\xd7\x0f\x37\x08\xdb\x42\x2d\x54\xa1\x1e\x1a\xa1\x84\xed\x61\x29\x2c\x87\x95\x70\xc3\x70\xa3\x70\xe3\x70\x93\x70\xd3\x70\xb3\x70\xf3\xb0\x23\xac\x86\xb5\xb0\x33\xac\x87\x66\xb8\x45\xb8\x65\xb8\x55\xb8\x75\xb8\x4d\xb8\x6d\xb8\x5d\xb8\x7d\xb8\x43\xb8\x63\xb8\x53\xb8\x73\xb8\x4b\xb8\x6b\xb8\x5b\xb8\x7b\xb8\x47\xb8\x67\xb8\x57\xb8\x77\xb8\x4f\xb8\x6f\xb8\x5f\xb8\x7f\x78\x40\x78\x60\xd8\x15\x4e\x0c\x27\x85\x93\xc3\xee\xf0\xa0\x70\x4a\x38\x35\xec\x09\x0f\x0e\x0f\x09\x7b\xc3\x69\x61\x5f\xd8\x1f\x4e\x0f\x0f\x0d\x07\xc2\x19\xe1\x60\x38\x14\x1e\x16\x1e\x1e\x1e\x11\x1e\x19\x1e\x15\x1e\x1d\x1e\x13\x1e\x1b\x1e\x17\x1e\x1f\x9e\x10\x9e\x18\x9e\x14\x9e\x1c\x9e\x12\x9e\x1a\x9e\x16\x9e\x1e\x9e\x11\x9e\x19\x9e\x15\x9e\x1d\x9e\x13\x9e\x1b\x9e\x17\x9e\x1f\x5e\x10\x5e\x18\x5e\x14\x5e\x1c\x5e\x12\x5e\x1a\x5e\x16\x5e\x1e\x5e\x11\x5e\x19\x5e\x15\x5e\x1d\x5e\x13\x5e\x1b\x5e\x17\x5e\x1f\xde\x10\xde\x18\xde\x14\xde\x1c\xde\x12\xde\x1a\xde\x16\xde\x1e\xde\x11\xde\x19\xde\x15\xde\x1d\xde\x13\xde\x1b\xde\x17\xde\x1f\x3e\x10\x36\x42\x2b\xb4\x43\x27\x74\x43\x2f\xf4\xc3\x20\x0c\xc3\x28\x8c\xc3\x24\x4c\xc3\x2c\xcc\xc3\x22\x6c\x86\x0f\x86\x0f\x85\x0f\x87\x8f\x84\x8f\x86\x8f\x85\x8f\x87\x4f\x84\x4f\x86\x4f\x85\x4f\x87\xcf\x84\xcf\x86\xcf\x85\xcf\x87\x2f\x84\x2f\x86\x2f\x85\x2f\x87\xaf\x84\xaf\x86\xaf\x85\xaf\x87\x6f\x84\x6f\x86\x6f\x85\x6f\x87\xef\x84\xef\x86\xef\x85\xef\x87\x1f\x84\x1f\x86\x1f\x85\x1f\x87\x9f\x84\x9f\x86\x9f\x85\x9f\x87\x5f\x84\x5f\x86\x5f\x85\x5f\x87\xdf\x84\xdf\x86\xdf\x85\xdf\x87\x3f\x84\x3f\x86\x3f\x85\x3f\x87\xbf\x84\xbf\x86\xbf\x85\xbf\x87\x7f\x84\x7f\x86\x7f\x85\x7f\x87\xff\x84\xff\x86\xff\x45\x73\x44\x73\x46\x73\x45\x73\x47\xa3\xa2\xd1\xd1\x98\x68\x6c\x34\x4f\x34\x2e\x1a\x1f\xcd\x1b\x4d\x88\xe6\x8b\xe6\x8f\x16\x88\x16\x8c\x16\x8a\x16\x8e\x16\x89\x16\x8d\x16\x8b\x16\x8f\x96\x88\x96\x8c\x96\x8a\x96\x8e\x96\x89\x96\x8d\x96\x8b\x96\x8f\x56\x88\x56\x8c\x56\x8a\x56\x8e\x56\x89\x56\x8d\x56\x8b\x56\x8f\xd6\x88\xd6\x8c\xd6\x8a\xd6\x8e\xd6\x89\xd6\x8d\xd6\x8b\xd6\x8f\x36\x88\xda\x22\x2d\x52\x91\x1e\x19\x91\x44\xed\x51\x29\x2a\x47\x95\x68\xc3\x68\xa3\x68\xe3\x68\x93\x68\xd3\x68\xb3\x68\xf3\xa8\x23\xaa\x46\xb5\xa8\x33\xaa\x47\x66\xb4\x45\xb4\x65\xb4\x55\xb4\x75\xb4\x4d\xb4\x6d\xb4\x5d\xb4\x7d\xb4\x43\xb4\x63\xb4\x53\xb4\x73\xb4\x4b\xb4\x6b\xb4\x5b\xb4\x7b\xb4\x47\xb4\x67\xb4\x57\xb4\x77\xb4\x4f\xb4\x6f\xb4\x5f\xb4\x7f\x74\x40\x74\x60\xd4\x15\x4d\x8c\x26\x45\x93\xa3\xee\xe8\xa0\x68\x4a\x34\x35\xea\x89\x0e\x8e\x0e\x89\x7a\xa3\x69\x51\x5f\xd4\x1f\x4d\x8f\x0e\x8d\x06\xa2\x19\xd1\x60\x34\x14\x1d\x16\x1d\x1e\x1d\x11\x1d\x19\x1d\x15\x1d\x1d\x1d\x13\x1d\x1b\x1d\x17\x1d\x1f\x9d\x10\x9d\x18\x9d\x14\x9d\x1c\x9d\x12\x9d\x1a\x9d\x16\x9d\x1e\x9d\x11\x9d\x19\x9d\x15\x9d\x1d\x9d\x13\x9d\x1b\x9d\x17\x9d\x1f\x5d\x10\x5d\x18\x5d\x14\x5d\x1c\x5d\x12\x5d\x1a\x5d\x16\x5d\x1e\x5d\x11\x5d\x19\x5d\x15\x5d\x1d\x5d\x13\x5d\x1b\x5d\x17\x5d\x1f\xdd\x10\xdd\x18\xdd\x14\xdd\x1c\xdd\x12\xdd\x1a\xdd\x16\xdd\x1e\xdd\x11\xdd\x19\xdd\x15\xdd\x1d\xdd\x13\xdd\x1b\xdd\x17\xdd\x1f\x3d\x10\x35\x22\x2b\xb2\x23\x27\x72\x23\x2f\xf2\xa3\x20\x0a\xa3\x28\x8a\xa3\x24\x4a\xa3\x2c\xca\xa3\x22\x6a\x46\x0f\x46\x0f\x45\x0f\x47\x8f\x44\x8f\x46\x8f\x45\x8f\x47\x4f\x44\x4f\x46\x4f\x45\x4f\x47\xcf\x44\xcf\x46\xcf\x45\xcf\x47\x2f\x44\x2f\x46\x2f\x45\x2f\x47\xaf\x44\xaf\x46\xaf\x45\xaf\x47\x6f\x44\x6f\x46\x6f\x45\x6f\x47\xef\x44\xef\x46\xef\x45\xef\x47\x1f\x44\x1f\x46\x1f\x45\x1f\x47\x9f\x44\x9f\x46\x9f\x45\x9f\x47\x5f\x44\x5f\x46\x5f\x45\x5f\x47\xdf\x44\xdf\x46\xdf\x45\xdf\x47\x3f\x44\x3f\x46\x3f\x45\x3f\x47\xbf\x44\xbf\x46\xbf\x45\xbf\x47\x7f\x44\x7f\x46\x7f\x45\x7f\x47\xff\x44\xff\x46\xff\xc5\x73\xc4\x73\xc6\x73\xc5\x73\xc7\xa3\xe2\xd1\xf1\x98\x78\x6c\x3c\x4f\x3c\x2e\x1e\x1f\xcf\x1b\x4f\x88\xe7\x8b\xe7\x8f\x17\x88\x17\x8c\x17\x8a\x17\x8e\x17\x89\x17\x8d\x17\x8b\x17\x8f\x97\x88\x97\x8c\x97\x8a\x97\x8e\x97\x89\x97\x8d\x97\x8b\x97\x8f\x57\x88\x57\x8c\x57\x8a\x57\x8e\x57\x89\x57\x8d\x57\x8b\x57\x8f\xd7\x88\xd7\x8c\xd7\x8a\xd7\x8e\xd7\x89\xd7\x8d\xd7\x8b\xd7\x8f\x37\x88\xdb\x62\x2d\x56\xb1\x1e\x1b\xb1\xc4\xed\x71\x29\x2e\xc7\x95\x78\xc3\x78\xa3\x78\xe3\x78\x93\x78\xd3\x78\xb3\x78\xf3\xb8\x23\xae\xc6\xb5\xb8\x33\xae\xc7\x66\xbc\x45\xbc\x65\xbc\x55\xbc\x75\xbc\x4d\xbc\x6d\xbc\x5d\xbc\x7d\xbc\x43\xbc\x63\xbc\x53\xbc\x73\xbc\x4b\xbc\x6b\xbc\x5b\xbc\x7b\xbc\x47\xbc\x67\xbc\x57\xbc\x77\xbc\x4f\xbc\x6f\xbc\x5f\xbc\x7f\x7c\x40\x7c\x60\xdc\x15\x4f\x8c\x27\xc5\x93\xe3\xee\xf8\xa0\x78\x4a\x3c\x35\xee\x89\x0f\x8e\x0f\x89\x7b\xe3\x69\x71\x5f\xdc\x1f\x4f\x8f\x0f\x8d\x07\xe2\x19\xf1\x60\x3c\x14\x1f\x16\x1f\x1e\x1f\x11\x1f\x19\x1f\x15\x1f\x1d\x1f\x13\x1f\x1b\x1f\x17\x1f\x1f\x9f\x10\x9f\x18\x9f\x14\x9f\x1c\x9f\x12\x9f\x1a\x9f\x16\x9f\x1e\x9f\x11\x9f\x19\x9f\x15\x9f\x1d\x9f\x13\x9f\x1b\x9f\x17\x9f\x1f\x5f\x10\x5f\x18\x5f\x14\x5f\x1c\x5f\x12\x5f\x1a\x5f\x16\x5f\x1e\x5f\x11\x5f\x19\x5f\x15\x5f\x1d\x5f\x13\x5f\x1b\x5f\x17\x5f\x1f\xdf\x10\xdf\x18\xdf\x14\xdf\x1c\xdf\x12\xdf\x1a\xdf\x16\xdf\x1e\xdf\x11\xdf\x19\xdf\x15\xdf\x1d\xdf\x13\xdf\x1b\xdf\x17\xdf\x1f\x3f\x10\x37\x62\x2b\xb6\x63\x27\x76\x63\x2f\xf6\xe3\x20\x0e\xe3\x28\x8e\xe3\x24\x4e\xe3\x2c\xce\xe3\x22\x6e\xc6\x0f\xc6\x0f\xc5\x0f\xc7\x8f\xc4\x8f\xc6\x8f\xc5\x8f\xc7\x4f\xc4\x4f\xc6\x4f\xc5\x4f\xc7\xcf\xc4\xcf\xc6\xcf\xc5\xcf\xc7\x2f\xc4\x2f\xc6\x2f\xc5\x2f\xc7\xaf\xc4\xaf\xc6\xaf\xc5\xaf\xc7\x6f\xc4\x6f\xc6\x6f\xc5\x6f\xc7\xef\xc4\xef\xc6\xef\xc5\xef\xc7\x1f\xc4\x1f\xc6\x1f\xc5\x1f\xc7\x9f\xc4\x9f\xc6\x9f\xc5\x9f\xc7\x5f\xc4\x5f\xc6\x5f\xc5\x5f\xc7\xdf\xc4\xdf\xc6\xdf\xc5\xdf\xc7\x3f\xc4\x3f\xc6\x3f\xc5\x3f\xc7\xbf\xc4\xbf\xc6\xbf\xc5\xbf\xc7\x7f\xc4\x7f\xc6\x7f\xc5\x7f\xc7\xff\xc4\xff\xc6\xff\x25\x73\x24\x73\x26\x73\x25\x73\x27\xa3\x92\xd1\xc9\x98\x64\x6c\x32\x4f\x32\x2e\x19\x9f\xcc\x9b\x4c\x48\xe6\x4b\xe6\x4f\x16\x48\x16\x4c\x16\x4a\x16\x4e\x16\x49\x16\x4d\x16\x4b\x16\x4f\x96\x48\x96\x4c\x96\x4a\x96\x4e\x96\x49\x96\x4d\x96\x4b\x96\x4f\x56\x48\x56\x4c\x56\x4a\x56\x4e\x56\x49\x56\x4d\x56\x4b\x56\x4f\xd6\x48\xd6\x4c\xd6\x4a\xd6\x4e\xd6\x49\xd6\x4d\xd6\x4b\xd6\x4f\x36\x48\xda\x12\x2d\x51\x89\x9e\x18\x89\x24\xed\x49\x29\x29\x27\x95\x64\xc3\x64\xa3\x64\xe3\x64\x93\x64\xd3\x64\xb3\x64\xf3\xa4\x23\xa9\x26\xb5\xa4\x33\xa9\x27\x66\xb2\x45\xb2\x65\xb2\x55\xb2\x75\xb2\x4d\xb2\x6d\xb2\x5d\xb2\x7d\xb2\x43\xb2\x63\xb2\x53\xb2\x73\xb2\x4b\xb2\x6b\xb2\x5b\xb2\x7b\xb2\x47\xb2\x67\xb2\x57\xb2\x77\xb2\x4f\xb2\x6f\xb2\x5f\xb2\x7f\x72\x40\x72\x60\xd2\x95\x4c\x4c\x26\x25\x93\x93\xee\xe4\xa0\x64\x4a\x32\x35\xe9\x49\x0e\x4e\x0e\x49\x7a\x93\x69\x49\x5f\xd2\x9f\x4c\x4f\x0e\x4d\x06\x92\x19\xc9\x60\x32\x94\x1c\x96\x1c\x9e\x1c\x91\x1c\x99\x1c\x95\x1c\x9d\x1c\x93\x1c\x9b\x1c\x97\x1c\x9f\x9c\x90\x9c\x98\x9c\x94\x9c\x9c\x9c\x92\x9c\x9a\x9c\x96\x9c\x9e\x9c\x91\x9c\x99\x9c\x95\x9c\x9d\x9c\x93\x9c\x9b\x9c\x97\x9c\x9f\x5c\x90\x5c\x98\x5c\x94\x5c\x9c\x5c\x92\x5c\x9a\x5c\x96\x5c\x9e\x5c\x91\x5c\x99\x5c\x95\x5c\x9d\x5c\x93\x5c\x9b\x5c\x97\x5c\x9f\xdc\x90\xdc\x98\xdc\x94\xdc\x9c\xdc\x92\xdc\x9a\xdc\x96\xdc\x9e\xdc\x91\xdc\x99\xdc\x95\xdc\x9d\xdc\x93\xdc\x9b\xdc\x97\xdc\x9f\x3c\x90\x34\x12\x2b\xb1\x13\x27\x71\x13\x2f\xf1\x93\x20\x09\x93\x28\x89\x93\x24\x49\x93\x2c\xc9\x93\x22\x69\x26\x0f\x26\x0f\x25\x0f\x27\x8f\x24\x8f\x26\x8f\x25\x8f\x27\x4f\x24\x4f\x26\x4f\x25\x4f\x27\xcf\x24\xcf\x26\xcf\x25\xcf\x27\x2f\x24\x2f\x26\x2f\x25\x2f\x27\xaf\x24\xaf\x26\xaf\x25\xaf\x27\x6f\x24\x6f\x26\x6f\x25\x6f\x27\xef\x24\xef\x26\xef\x25\xef\x27\x1f\x24\x1f\x26\x1f\x25\x1f\x27\x9f\x24\x9f\x26\x9f\x25\x9f\x27\x5f\x24\x5f\x26\x5f\x25\x5f\x27\xdf\x24\xdf\x26\xdf\x25\xdf\x27\x3f\x24\x3f\x26\x3f\x25\x3f\x27\xbf\x24\xbf\x26\xbf\x25\xbf\x27\x7f\x24\x7f\x26\x7f\x25\x7f\x27\xff\x24\xff\x26\xff\xa5\x73\xa4\x73\xa6\x73\xa5\x73\xa7\xa3\xd2\xd1\xe9\x98\x74\x6c\x3a\x4f\x3a\x2e\x1d\x9f\xce\x9b\x4e\x48\xe7\x4b\xe7\x4f\x17\x48\x17\x4c\x17\x4a\x17\x4e\x17\x49\x17\x4d\x17\x4b\x17\x4f\x97\x48\x97\x4c\x97\x4a\x97\x4e\x97\x49\x97\x4d\x97\x4b\x97\x4f\x57\x48\x57\x4c\x57\x4a\x57\x4e\x57\x49\x57\x4d\x57\x4b\x57\x4f\xd7\x48\xd7\x4c\xd7\x4a\xd7\x4e\xd7\x49\xd7\x4d\xd7\x4b\xd7\x4f\x37\x48\xdb\x52\x2d\x55\xa9\x9e\x1a\xa9\xa4\xed\x69\x29\x2d\xa7\x95\x74\xc3\x74\xa3\x74\xe3\x74\x93\x74\xd3\x74\xb3\x74\xf3\xb4\x23\xad\xa6\xb5\xb4\x33\xad\xa7\x66\xba\x45\xba\x65\xba\x55\xba\x75\xba\x4d\xba\x6d\xba\x5d\xba\x7d\xba\x43\xba\x63\xba\x53\xba\x73\xba\x4b\xba\x6b\xba\x5b\xba\x7b\xba\x47\xba\x67\xba\x57\xba\x77\xba\x4f\xba\x6f\xba\x5f\xba\x7f\x7a\x40\x7a\x60\xda\x95\x4e\x4c\x27\xa5\x93\xd3\xee\xf4\xa0\x74\x4a\x3a\x35\xed\x49\x0f\x4e\x0f\x49\x7b\xd3\x69\x69\x5f\xda\x9f\x4e\x4f\x0f\x4d\x07\xd2\x19\xe9\x60\x3a\x94\x1e\x96\x1e\x9e\x1e\x91\x1e\x99\x1e\x95\x1e\x9d\x1e\x93\x1e\x9b\x1e\x97\x1e\x9f\x9e\x90\x9e\x98\x9e\x94\x9e\x9c\x9e\x92\x9e\x9a\x9e\x96\x9e\x9e\x9e\x91\x9e\x99\x9e\x95\x9e\x9d\x9e\x93\x9e\x9b\x9e\x97\x9e\x9f\x5e\x90\x5e\x98\x5e\x94\x5e\x9c\x5e\x92\x5e\x9a\x5e\x96\x5e\x9e\x5e\x91\x5e\x99\x5e\x95\x5e\x9d\x5e\x93\x5e\x9b\x5e\x97\x5e\x9f\xde\x90\xde\x98\xde\x94\xde\x9c\xde\x92\xde\x9a\xde\x96\xde\x9e\xde\x91\xde\x99\xde\x95\xde\x9d\xde\x93\xde\x9b\xde\x97\xde\x9f\x3e\x90\x36\x52\x2b\xb5\x53\x27\x75\x53\x2f\xf5\xd3\x20\x0d\xd3\x28\x8d\xd3\x24\x4d\xd3\x2c\xcd\xd3\x22\x6d\xa6\x0f\xa6\x0f\xa5\x0f\xa7\x8f\xa4\x8f\xa6\x8f\xa5\x8f\xa7\x4f\xa4\x4f\xa6\x4f\xa5\x4f\xa7\xcf\xa4\xcf\xa6\xcf\xa5\xcf\xa7\x2f\xa4\x2f\xa6\x2f\xa5\x2f\xa7\xaf\xa4\xaf\xa6\xaf\xa5\xaf\xa7\x6f\xa4\x6f\xa6\x6f\xa5\x6f\xa7\xef\xa4\xef\xa6\xef\xa5\xef\xa7\x1f\xa4\x1f\xa6\x1f\xa5\x1f\xa7\x9f\xa4\x9f\xa6\x9f\xa5\x9f\xa7\x5f\xa4\x5f\xa6\x5f\xa5\x5f\xa7\xdf\xa4\xdf\xa6\xdf\xa5\xdf\xa7\x3f\xa4\x3f\xa6\x3f\xa5\x3f\xa7\xbf\xa4\xbf\xa6\xbf\xa5\xbf\xa7\x7f\xa4\x7f\xa6\x7f\xa5\x7f\xa7\xff\xa4\xff\xa6\xff\x65\x73\x64\x73\x66\x73\x65\x73\x67\xa3\xb2\xd1\xd9\x98\x6c\x6c\x36\x4f\x36\x2e\x1b\x9f\xcd\x9b\x4d\xc8\xe6\xcb\xe6\xcf\x16\xc8\x16\xcc\x16\xca\x16\xce\x16\xc9\x16\xcd\x16\xcb\x16\xcf\x96\xc8\x96\xcc\x96\xca\x96\xce\x96\xc9\x96\xcd\x96\xcb\x96\xcf\x56\xc8\x56\xcc\x56\xca\x56\xce\x56\xc9\x56\xcd\x56\xcb\x56\xcf\xd6\xc8\xd6\xcc\xd6\xca\xd6\xce\xd6\xc9\xd6\xcd\xd6\xcb\xd6\xcf\x36\xc8\xda\x32\x2d\x53\x99\x9e\x19\x99\x64\xed\x59\x29\x2b\x67\x95\x6c\xc3\x6c\xa3\x6c\xe3\x6c\x93\x6c\xd3\x6c\xb3\x6c\xf3\xac\x23\xab\x66\xb5\xac\x33\xab\x67\x66\xb6\x45\xb6\x65\xb6\x55\xb6\x75\xb6\x4d\xb6\x6d\xb6\x5d\xb6\x7d\xb6\x43\xb6\x63\xb6\x53\xb6\x73\xb6\x4b\xb6\x6b\xb6\x5b\xb6\x7b\xb6\x47\xb6\x67\xb6\x57\xb6\x77\xb6\x4f\xb6\x6f\xb6\x5f\xb6\x7f\x76\x40\x76\x60\xd6\x95\x4d\xcc\x26\x65\x93\xb3\xee\xec\xa0\x6c\x4a\x36\x35\xeb\xc9\x0e\xce\x0e\xc9\x7a\xb3\x69\x59\x5f\xd6\x9f\x4d\xcf\x0e\xcd\x06\xb2\x19\xd9\x60\x36\x94\x1d\x96\x1d\x9e\x1d\x91\x1d\x99\x1d\x95\x1d\x9d\x1d\x93\x1d\x9b\x1d\x97\x1d\x9f\x9d\x90\x9d\x98\x9d\x94\x9d\x9c\x9d\x92\x9d\x9a\x9d\x96\x9d\x9e\x9d\x91\x9d\x99\x9d\x95\x9d\x9d\x9d\x93\x9d\x9b\x9d\x97\x9d\x9f\x5d\x90\x5d\x98\x5d\x94\x5d\x9c\x5d\x92\x5d\x9a\x5d\x96\x5d\x9e\x5d\x91\x5d\x99\x5d\x95\x5d\x9d\x5d\x93\x5d\x9b\x5d\x97\x5d\x9f\xdd\x90\xdd\x98\xdd\x94\xdd\x9c\xdd\x92\xdd\x9a\xdd\x96\xdd\x9e\xdd\x91\xdd\x99\xdd\x95\xdd\x9d\xdd\x93\xdd\x9b\xdd\x97\xdd\x9f\x3d\x90\x35\x32\x2b\xb3\x33\x27\x73\x33\x2f\xf3\xb3\x20\x0b\xb3\x28\x8b\xb3\x24\x4b\xb3\x2c\xcb\xb3\x22\x6b\x66\x0f\x66\x0f\x65\x0f\x67\x8f\x64\x8f\x66\x8f\x65\x8f\x67\x4f\x64\x4f\x66\x4f\x65\x4f\x67\xcf\x64\xcf\x66\xcf\x65\xcf\x67\x2f\x64\x2f\x66\x2f\x65\x2f\x67\xaf\x64\xaf\x66\xaf\x65\xaf\x67\x6f\x64\x6f\x66\x6f\x65\x6f\x67\xef\x64\xef\x66\xef\x65\xef\x67\x1f\x64\x1f\x66\x1f\x65\x1f\x67\x9f\x64\x9f\x66\x9f\x65\x9f\x67\x5f\x64\x5f\x66\x5f\x65\x5f\x67\xdf\x64\xdf\x66\xdf\x65\xdf\x67\x3f\x64\x3f\x66\x3f\x65\x3f\x67\xbf\x64\xbf\x66\xbf\x65\xbf\x67\x7f\x64\x7f\x66\x7f\x65\x7f\x67\xff\x64\xff\x66\xff\xe5\x73\xe4\x73\xe6\x73\xe5\x73\xe7\xa3\xf2\xd1\xf9\x98\x7c\x6c\x3e\x4f\x3e\x2e\x1f\x9f\xcf\x9b\x4f\xc8\xe7\xcb\xe7\xcf\x17\xc8\x17\xcc\x17\xca\x17\xce\x17\xc9\x17\xcd\x17\xcb\x17\xcf\x97\xc8\x97\xcc\x97\xca\x97\xce\x97\xc9\x97\xcd\x97\xcb\x97\xcf\x57\xc8\x57\xcc\x57\xca\x57\xce\x57\xc9\x57\xcd\x57\xcb\x57\xcf\xd7\xc8\xd7\xcc\xd7\xca\xd7\xce\xd7\xc9\xd7\xcd\xd7\xcb\xd7\xcf\x37\xc8\xdb\x72\x2d\x57\xb9\x9e\x1b\xb9\xe4\xed\x79\x29\x2f\xe7\x95\x7c\xc3\x7c\xa3\x7c\xe3\x7c\x93\x7c\xd3\x7c\xb3\x7c\xf3\xbc\x23\xaf\xe6\xb5\xbc\x33\xaf\xe7\x66\xbe\x45\xbe\x65\xbe\x55\xbe\x75\xbe\x4d\xbe\x6d\xbe\x5d\xbe\x7d\xbe\x43\xbe\x63\xbe\x53\xbe\x73\xbe\x4b\xbe\x6b\xbe\x5b\xbe\x7b\xbe\x47\xbe\x67\xbe\x57\xbe\x77\xbe\x4f\xbe\x6f\xbe\x5f\xbe\x7f\x7e\x40\x7e\x60\xde\x95\x4f\xcc\x27\xe5\x93\xf3\xee\xfc\xa0\x7c\x4a\x3e\x35\xef\xc9\x0f\xce\x0f\xc9\x7b\xf3\x69\x79\x5f\xde\x9f\x4f\xcf\x0f\xcd\x07\xf2\x19\xf9\x60\x3e\x94\x1f\x96\x1f\x9e\x1f\x91\x1f\x99\x1f\x95\x1f\x9d\x1f\x93\x1f\x9b\x1f\x97\x1f\x9f\x9f\x90\x9f\x98\x9f\x94\x9f\x9c\x9f\x92\x9f\x9a\x9f\x96\x9f\x9e\x9f\x91\x9f\x99\x9f\x95\x9f\x9d\x9f\x93\x9f\x9b\x9f\x97\x9f\x9f\x5f\x90\x5f\x98\x5f\x94\x5f\x9c\x5f\x92\x5f\x9a\x5f\x96\x5f\x9e\x5f\x91\x5f\x99\x5f\x95\x5f\x9d\x5f\x93\x5f\x9b\x5f\x97\x5f\x9f\xdf\x90\xdf\x98\xdf\x94\xdf\x9c\xdf\x92\xdf\x9a\xdf\x96\xdf\x9e\xdf\x91\xdf\x99\xdf\x95\xdf\x9d\xdf\x93\xdf\x9b\xdf\x97\xdf\x9f\x3f\x90\x37\x72\x2b\xb7\x73\x27\x77\x73\x2f\xf7\xf3\x20\x0f\xf3\x28\x8f\xf3\x24\x4f\xf3\x2c\xcf\xf3\x22\x6f\xe6\x0f\xe6\x0f\xe5\x0f\xe7\x8f\xe4\x8f\xe6\x8f\xe5\x8f\xe7\x4f\xe4\x4f\xe6\x4f\xe5\x4f\xe7\xcf\xe4\xcf\xe6\xcf\xe5\xcf\xe7\x2f\xe4\x2f\xe6\x2f\xe5\x2f\xe7\xaf\xe4\xaf\xe6\xaf\xe5\xaf\xe7\x6f\xe4\x6f\xe6\x6f\xe5\x6f\xe7\xef\xe4\xef\xe6\xef\xe5\xef\xe7\x1f\xe4\x1f\xe6\x1f\xe5\x1f\xe7\x9f\xe4\x9f\xe6\x9f\xe5\x9f\xe7\x5f\xe4\x5f\xe6\x5f\xe5\x5f\xe7\xdf\xe4\xdf\xe6\xdf\xe5\xdf\xe7\x3f\xe4\x3f\xe6\x3f\xe5\x3f\xe7\xbf\xe4\xbf\xe6\xbf\xe5\xbf\xe7\x7f\xe4\x7f\xe6\x7f\xe5\x7f\xe7\xff\xe4\xff\xe6\xff\x15\x73\x14\x73\x16\x73\x15\x73\x17\xa3\x8a\xd1\xc5\x98\x62\x6c\x31\x4f\x31\xae\x18\x5f\xcc\x5b\x4c\x28\xe6\x2b\xe6\x2f\x16\x28\x16\x2c\x16\x2a\x16\x2e\x16\x29\x16\x2d\x16\x2b\x16\x2f\x96\x28\x96\x2c\x96\x2a\x96\x2e\x96\x29\x96\x2d\x96\x2b\x96\x2f\x56\x28\x56\x2c\x56\x2a\x56\x2e\x56\x29\x56\x2d\x56\x2b\x56\x2f\xd6\x28\xd6\x2c\xd6\x2a\xd6\x2e\xd6\x29\xd6\x2d\xd6\x2b\xd6\x2f\x36\x28\xda\x0a\xad\x50\x85\x5e\x18\x85\x14\xed\x45\xa9\x28\x17\x95\x62\xc3\x62\xa3\x62\xe3\x62\x93\x62\xd3\x62\xb3\x62\xf3\xa2\xa3\xa8\x16\xb5\xa2\xb3\xa8\x17\x66\xb1\x45\xb1\x65\xb1\x55\xb1\x75\xb1\x4d\xb1\x6d\xb1\x5d\xb1\x7d\xb1\x43\xb1\x63\xb1\x53\xb1\x73\xb1\x4b\xb1\x6b\xb1\x5b\xb1\x7b\xb1\x47\xb1\x67\xb1\x57\xb1\x77\xb1\x4f\xb1\x6f\xb1\x5f\xb1\x7f\x71\x40\x71\x60\xd1\x55\x4c\x2c\x26\x15\x93\x8b\xee\xe2\xa0\x62\x4a\x31\xb5\xe8\x29\x0e\x2e\x0e\x29\x7a\x8b\x69\x45\x5f\xd1\x5f\x4c\x2f\x0e\x2d\x06\x8a\x19\xc5\x60\x31\x54\x1c\x56\x1c\x5e\x1c\x51\x1c\x59\x1c\x55\x1c\x5d\x1c\x53\x1c\x5b\x1c\x57\x1c\x5f\x9c\x50\x9c\x58\x9c\x54\x9c\x5c\x9c\x52\x9c\x5a\x9c\x56\x9c\x5e\x9c\x51\x9c\x59\x9c\x55\x9c\x5d\x9c\x53\x9c\x5b\x9c\x57\x9c\x5f\x5c\x50\x5c\x58\x5c\x54\x5c\x5c\x5c\x52\x5c\x5a\x5c\x56\x5c\x5e\x5c\x51\x5c\x59\x5c\x55\x5c\x5d\x5c\x53\x5c\x5b\x5c\x57\x5c\x5f\xdc\x50\xdc\x58\xdc\x54\xdc\x5c\xdc\x52\xdc\x5a\xdc\x56\xdc\x5e\xdc\x51\xdc\x59\xdc\x55\xdc\x5d\xdc\x53\xdc\x5b\xdc\x57\xdc\x5f\x3c\x50\x34\x0a\xab\xb0\x0b\xa7\x70\x0b\xaf\xf0\x8b\xa0\x08\x8b\xa8\x88\x8b\xa4\x48\x8b\xac\xc8\x8b\xa2\x68\x16\x0f\x16\x0f\x15\x0f\x17\x8f\x14\x8f\x16\x8f\x15\x8f\x17\x4f\x14\x4f\x16\x4f\x15\x4f\x17\xcf\x14\xcf\x16\xcf\x15\xcf\x17\x2f\x14\x2f\x16\x2f\x15\x2f\x17\xaf\x14\xaf\x16\xaf\x15\xaf\x17\x6f\x14\x6f\x16\x6f\x15\x6f\x17\xef\x14\xef\x16\xef\x15\xef\x17\x1f\x14\x1f\x16\x1f\x15\x1f\x17\x9f\x14\x9f\x16\x9f\x15\x9f\x17\x5f\x14\x5f\x16\x5f\x15\x5f\x17\xdf\x14\xdf\x16\xdf\x15\xdf\x17\x3f\x14\x3f\x16\x3f\x15\x3f\x17\xbf\x14\xbf\x16\xbf\x15\xbf\x17\x7f\x14\x7f\x16\x7f\x15\x7f\x17\xff\x14\xff\x16\xff\x35\xe7\x68\xce\xd9\x9c\xab\x39\x77\x73\x54\x73\x74\x73\x4c\x73\x6c\x73\x9e\xe6\xb8\xe6\xf8\xe6\xbc\xcd\x09\xcd\xf9\x9a\xf3\x37\x17\x68\x2e\xd8\x5c\xa8\xb9\x70\x73\x91\xe6\xa2\xcd\xc5\x9a\x8b\x37\x97\x68\x2e\xd9\x5c\xaa\xb9\x74\x73\x99\xe6\xb2\xcd\xe5\x9a\xcb\x37\x57\x68\xae\xd8\x5c\xa9\xb9\x72\x73\x95\xe6\xaa\xcd\xd5\x9a\xab\x37\xd7\x68\xae\xd9\x5c\xab\xb9\x76\x73\x9d\xe6\xba\xcd\xf5\x9a\xeb\x37\x37\x68\xb6\x35\xb5\xa6\x6a\xea\x4d\xa3\x29\xcd\xf6\x66\xa9\x59\x6e\x56\x9a\x1b\x36\x37\x6a\x6e\xdc\xdc\xa4\xb9\x69\x73\xb3\xe6\xe6\xcd\x8e\x66\xb5\x59\x6b\x76\x36\xeb\x4d\xb3\xb9\x45\x73\xcb\xe6\x56\xcd\xad\x9b\xdb\x34\xb7\x6d\x6e\xd7\xdc\xbe\xb9\x43\x73\xc7\xe6\x4e\xcd\x9d\x9b\xbb\x34\x77\x6d\xee\xd6\xdc\xbd\xb9\x47\x73\xcf\xe6\x5e\xcd\xbd\x9b\xfb\x34\xf7\x6d\xee\xd7\xdc\xbf\x79\x40\xf3\xc0\x66\x57\x73\x62\x73\x52\x73\x72\xb3\xbb\x79\x50\x73\x4a\x73\x6a\xb3\xa7\x79\x70\xf3\x90\x66\x6f\x73\x5a\xb3\xaf\xd9\xdf\x9c\xde\x3c\xb4\x39\xd0\x9c\xd1\x1c\x6c\x0e\x35\x0f\x6b\x1e\xde\x3c\xa2\x79\x64\xf3\xa8\xe6\xd1\xcd\x63\x9a\xc7\x36\x8f\x6b\x1e\x3f\x76\xa8\xaf\xa7\xad\xad\xad\xad\xd5\x76\x74\x8e\xeb\x3f\xac\x7b\x60\xc6\xa4\xfe\x81\xee\xd6\xff\x54\x15\xad\x3e\xb6\x63\x5a\xd7\xa4\x81\xfe\xbe\xb1\x5d\xad\x76\x4c\xc7\xc4\x81\xee\xc3\xba\xc7\x74\xcd\x6a\xc6\x76\xf4\x4f\xe9\xef\xeb\x3e\x64\x6c\x57\xab\x9d\xb7\x36\xa9\x67\x60\xd2\xd0\xb4\x83\x7a\xbb\x8f\x98\x77\xd2\xff\x8e\x47\xd5\x26\xf7\x0f\x8e\x9a\x34\xb9\x7f\x70\x4c\xe7\xa4\xae\x99\xdd\x4c\x6e\x35\x9d\x93\x06\xfa\xbb\x06\xc7\xd6\x81\x74\x03\xa9\xb7\x20\xdd\xb3\x9a\xf1\xf5\xc9\xfd\x83\x5d\x93\x26\x75\xf7\x0d\x8e\xef\x1e\x39\x1c\x5b\x07\xdd\xdd\x6a\xc7\xd4\x5b\x3d\x76\xcf\x6a\xe6\xdd\x62\xb6\x81\x4c\x99\x6d\x20\x5b\xcc\x1c\xc8\x94\xc9\xfd\x83\x13\xb6\x98\xd4\x3f\x6d\x5a\x57\xab\xb3\x09\x53\x66\xfb\x62\xde\x2d\x67\xfb\xd9\xa9\xb3\xfd\xec\x96\x13\xbb\x06\x46\x4d\x9d\xd8\x35\x30\x66\xab\xc1\x9e\xde\xc9\xdd\x63\x7a\x66\x35\x63\xb7\x62\xf4\x3d\x8c\x7e\xab\xd6\xe8\x7b\x5a\x6f\xd1\x56\x8c\xb3\xa7\xd5\xce\xb5\xd5\xd6\x73\xf5\x1c\x3c\xef\xd6\xb3\x31\x0e\xfe\xdf\xf1\x84\x6d\x66\x1f\xd5\x21\xff\xe7\x8b\x29\x03\xdd\xdd\x7d\xbd\x5d\x7d\x93\x7b\x26\x8d\xd9\xb6\x6b\xd2\xd0\x60\xf7\x98\xde\x59\xcd\x84\x6d\x67\x7f\x5d\xef\x6c\x5f\x8c\xd9\xb6\xf5\xa6\xf4\xce\x6a\x46\x6d\x3b\xf3\xe4\x7b\x67\x7e\x0a\xdb\xb7\x7e\xbe\xaf\xf5\xf3\xdb\xcf\xfe\xf3\x7d\xb3\xff\xfc\xf6\xad\x9f\xef\x6b\xbd\xa9\x7d\x5d\xd3\xfb\x67\x0c\x0e\xf4\x4f\x9f\xda\x3d\x77\xbd\x6f\xca\xdc\xdd\x7d\x53\xc6\xee\xc0\xc9\xf7\x73\xf2\x3b\xb4\x4e\xbe\x7f\x56\x33\xdf\x0e\x53\x87\xfa\xa6\x74\x0d\x0c\x4d\xeb\xed\x1a\x1a\x9c\xaf\x7f\xf6\xaf\xc6\xec\xdc\x1a\xc3\x40\x6b\x0c\x3b\xcf\x3e\x86\x81\xd9\xc7\xb0\x73\x6b\x0c\x03\xad\x66\x97\xd6\x4f\xcd\x98\xd5\xcc\xbb\xcb\x6c\x6f\xe3\x8c\xd9\xde\xc6\x5d\x67\xef\x6d\x70\xf6\xde\x76\x6d\x75\x33\xd8\x7a\x47\x76\x9d\xf9\x91\x0e\xce\xfc\x48\x77\x6b\x7d\xa4\x43\xad\x8f\x74\x37\xce\x6a\x88\xb3\xda\xad\x75\x56\x43\xb3\x9a\xd1\xbb\x0d\xf4\xf4\x4d\x19\x3d\x34\xf3\xdf\xf9\x76\xfb\x3f\x67\x38\x34\xfb\x57\x63\x77\xe3\xa3\x1f\xe2\xee\xd8\x63\xb6\xd1\x1e\x3e\xdb\xf1\x5e\xb3\x1d\x1f\xf9\xbf\xe3\x31\x7b\xb7\xce\xf5\xa8\x59\xcd\xf8\xbd\xff\x77\x1b\x1c\x35\x72\x38\xba\xb7\xbf\x6f\xca\x8c\xd1\x3b\x4c\xed\x1f\xe8\x1b\xdd\x3f\xeb\xdf\xdd\x66\xfd\x3b\x34\xf3\xdf\x59\x77\xb1\x56\xab\xb7\xda\xce\x36\x5a\x45\x6b\xd0\xb6\xd3\x96\x69\x3b\x68\x6b\xad\xd6\x6c\x1b\xdf\x31\xf3\x5c\x5b\xc3\xe8\x1a\x39\x1c\xdb\x51\x6f\xb5\x5d\xdd\xad\x4f\x63\x87\x19\xbd\x5d\x33\xa6\xb6\x8e\xfb\xff\x77\x3c\x61\x97\xd9\x3f\x8d\x19\xb3\x7d\x31\xab\x7f\x55\x6d\x71\x54\xad\x83\xb6\x4a\xdb\xd9\x6a\x19\xb7\x32\xf5\x59\xad\xce\x73\x4b\x6f\xd3\x68\xf5\x51\x53\xfb\xfb\x0f\xe1\x0b\x73\x9e\xc9\xfd\x83\x13\xbb\x7b\xfb\x0f\x1f\x3d\xd8\xdf\xd7\x3f\x63\xbe\xc9\x3d\xdd\x03\xdd\x33\x7a\x66\xcc\xfa\x6a\x7c\x47\xef\xf4\xa9\x5d\xb3\x0e\xc7\x75\xf5\xf5\x0f\x76\xf7\x76\xf7\x74\x4d\xa8\x4f\x9f\xd1\xd3\xdb\xdf\x37\xeb\xbf\xe7\xa9\x0f\xf2\xfd\xad\xfa\x39\x9a\xb0\xc3\xb4\x9e\x99\x97\x41\xeb\x8b\xdd\x66\x7b\xf1\xf8\x1d\xa6\x75\x4f\x69\xbd\x68\xa1\x9e\xfe\xc1\xae\xff\xc3\x1a\x3d\x8b\x35\xaa\xda\x3d\xd8\x35\x7a\x8b\xae\x69\xd3\xba\x5a\x23\xac\x18\x63\xe1\x8d\xda\xbb\x7b\xb0\x6b\xee\xfa\x60\xd7\xe8\x5d\xa7\x76\x0f\x76\x8d\x9a\x09\x1c\xbd\x4d\xd7\xf4\xe9\x5d\x63\xb6\xed\x9a\x36\x71\x72\xd7\x5c\xdb\x0d\xcd\xb5\xfd\xd0\x5c\x7b\xf6\x8c\x65\x04\x73\xed\xd8\x33\xf7\xce\x53\xfb\x47\xef\xd2\x33\x65\x5a\xd7\xdc\xbb\x76\x0d\x8d\x65\x34\x73\xef\x38\xb5\x67\xee\xda\xd4\x9e\xb9\x77\x9c\xd1\xd3\xc2\x74\x54\x26\x6c\x35\xdb\x88\x16\xe0\x85\xc3\x5f\x8f\xef\x1a\x79\x23\x26\x74\xcf\x7e\xfa\xdd\xc3\xa7\xdf\x33\x7c\xfa\x8b\x0e\xfd\xdf\x1f\x6d\x9d\xdc\xac\x9f\x1f\x35\x71\xe6\xc9\x4d\x99\x79\x72\xa3\x27\x77\xf7\x0e\x76\x8d\xa5\xaf\x51\x47\xcd\x3c\xb5\x99\xdf\x1c\x9c\x75\x6a\x33\x3b\x1b\x7d\xc8\xac\x53\xeb\x9d\x75\x6a\xad\x41\x56\x6b\x73\xf5\x0d\xcd\x75\x44\xcf\xd8\xfe\xd6\xf9\xcd\x3d\x30\xb5\x7f\xcc\x8c\x99\x27\xa7\x8d\x9e\xd5\xcc\x3d\xd8\x35\x34\x16\xfe\xdc\xd3\xa7\xf6\xcc\x3d\x69\x6a\xcf\xdc\xd3\x67\xf4\x8c\xee\x9f\xf9\xc6\x4f\x98\xfd\x3d\x5f\xe0\xff\x1b\xe6\x84\xfe\xd9\x3f\xb5\xa1\xd9\x3f\xb5\xfe\x91\x4f\xad\x35\x8c\x4e\xae\x24\xee\x0c\x9d\x3b\xc2\x68\x6b\x1b\xd7\x75\x50\x4f\x8f\xd6\xd6\xa6\xf4\xe1\x23\xd1\x46\x8e\xd4\xc8\xd1\xff\xbe\x6b\x8c\x1c\xc9\xc8\x51\xfb\xc8\x51\x69\xe4\xa8\x3c\x72\x54\x19\x3e\x6a\x1f\xa1\xb5\x6b\xf0\x3b\x47\xfe\x67\x98\xa5\x19\x23\xfd\x6a\x23\xbd\x69\x23\xbd\x69\x23\xbd\xa9\xff\x8d\x7d\x64\xc4\x6a\x64\xc4\x6a\x64\x9c\x6a\xa4\x3f\x35\x32\x4e\x35\xd2\xb3\x1a\xe9\x59\x8d\xf4\xac\x8f\xf4\xac\x8f\xf4\xac\x8f\xf4\xac\x8f\xbc\x17\xfa\x08\x43\x1f\x61\xe8\x23\x0c\x7d\x84\xa1\x8f\x30\xf4\x11\x86\x31\xc2\x30\x46\x18\xc6\x08\xc3\x18\x61\x18\x23\x8c\xff\xbd\x2f\xc6\x08\xc3\x18\x61\x18\x23\x0c\xe3\x7f\xef\xf7\xc8\x4f\xb4\x8f\xfc\x44\xfb\xc8\x4f\xb4\x8f\xfc\x44\xfb\xc8\x4f\x94\x46\x46\x55\x1a\x19\x4b\x69\x64\x2c\xa5\x91\xb1\x94\x46\x7a\x2e\x8d\xf4\x5c\x1a\xe9\xb9\x34\xd2\x73\x69\xa4\xe7\xf2\x48\xcf\xe5\x91\xf3\x2d\x8f\x30\xca\x23\x8c\xf2\x08\xa3\x3c\xc2\x28\x8f\x30\xca\x23\x8c\xf2\x08\xa3\x3c\xc2\xa8\x8c\x30\x2a\x23\x8c\xca\x08\xa3\x32\xc2\xa8\x8c\x30\x2a\x23\x8c\xca\x08\xa3\x52\x6a\x5d\x9b\xf2\xbf\xf7\xe2\x7f\xbd\x0d\xb3\xb4\x91\x3b\x47\x6b\xd3\x46\x8e\x46\xae\xe1\x36\x7d\xe4\xc8\x18\x39\x92\x91\xa3\xf6\x91\xa3\xd2\xc8\x51\x79\xe4\xa8\x02\x7f\xf8\xde\xd0\xb4\x11\x56\xa5\x65\x08\xa3\xbd\x8d\x96\xfb\xa8\x5d\xd1\x0e\x7f\xdf\xa0\x15\x5a\xee\xf7\x76\xce\xad\xbd\x4c\x0b\xab\xbd\x83\xb6\x4a\x5b\xa3\xed\xa4\xad\xd3\x9a\xad\xb6\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x04\xbf\x0c\xbf\x0c\xbf\x0c\xbf\x0c\xbf\x0c\xbf\x0c\xbf\x0c\xbf\x0c\xb7\x0c\xb7\x0c\xb7\x0c\xb7\x0c\xb7\x0c\xb7\x0c\xb7\x6c\x8e\x3c\xcd\xfe\x77\x8d\xd1\x57\x05\xf6\xf0\x67\x53\x81\x5d\x81\x5d\x81\x3d\x7c\x5d\x8d\xfc\x1c\x63\xa8\x30\x86\x0a\x63\xa8\x30\x86\x0a\x63\xa8\x30\x86\x0a\xe7\xde\xc1\xb9\x77\x70\xee\x1d\xf0\x3b\xe0\x77\xc0\xef\x80\xdf\x01\xbf\x03\x7e\x07\xfc\x0e\xf8\x1d\xf0\x3b\xe0\x77\xc0\xef\x80\xdf\x01\xbf\x03\x7e\x15\x7e\x15\x3e\xbf\x4b\x19\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\xcc\x96\x8c\x2a\xfc\x2a\xfc\x2a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\x7c\x66\x65\x06\xb3\x32\xa3\x06\x9f\xd9\x99\xc1\xec\xd2\xa8\xc1\x67\xb6\x66\xe0\x54\x03\xa7\x1a\x9d\xf0\x99\x75\x1a\x9d\xf0\x87\x5d\xdb\x09\x9f\x59\xa8\xd1\x09\x9f\xd9\xa8\xd1\x09\x9f\x59\xa9\xd1\x09\xbf\x13\x7e\x27\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\x7c\x13\xbe\x09\xdf\x84\xcf\xec\xd5\x30\xe1\x9b\xf0\x4d\xf8\x26\x7c\x13\xbe\x09\xdf\x84\x6f\xc2\x37\xe1\x9b\xf0\x4d\xf8\x66\x8b\x2f\xcc\x8e\x85\xd9\xb1\xb4\x29\x5a\x9d\xd6\xa0\x15\xda\x76\xda\x12\x6d\x99\xb6\x42\xdb\x41\x5b\xa5\xad\xd1\x76\xd2\xd6\x69\xe1\x6b\xf0\x35\xf8\x1a\x7c\xad\xc5\xaf\xeb\xb3\x5e\xa7\xd5\x5b\xe3\xd4\xea\xad\x71\x6a\x75\xbd\x4e\x6b\x8e\xd9\x63\xca\x40\xd7\x61\xdd\x63\x0e\x6f\x35\x7b\xb4\x7e\x0b\x3a\x7c\x56\x33\x6e\x8f\xe1\xe9\xdd\xb8\xc3\x87\x8f\x5a\x3f\xd7\x41\x7f\x1d\xf4\xd7\xba\xef\xb5\x7a\xeb\xbe\xd7\xea\xad\xfb\x5e\xab\xb7\xee\x7b\xad\xde\xba\xef\xb5\x7a\xeb\xbe\xd7\xea\xad\xfb\x5e\xab\xb7\xee\x7b\xad\xde\xba\xef\xb5\x7a\xeb\xbe\xd7\xea\xad\xfb\x5e\xab\xb7\xee\x7b\xad\xde\xc1\x78\x3b\x38\x9f\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x4e\xf8\x9d\xf0\x3b\xe1\x77\xc2\xef\x84\xdf\x09\xbf\x13\x7e\x27\xfc\x4e\xf8\x9d\xf0\x3b\xe1\x77\xc2\xef\x84\xdf\x09\xbf\x13\x7e\x27\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\x7c\x13\xbe\xa9\x8d\xd9\xab\x75\xe1\x1e\x39\xab\xe1\x7f\xa1\x9b\xd0\x4d\xe8\x26\x74\x13\x7a\xeb\xae\xd7\x4c\x63\x16\x45\xb1\x46\xa7\xda\x5a\x77\x89\x6a\x6b\xdd\xcd\xaa\xad\x75\x37\xab\xb6\xd6\xdd\xac\xda\x5a\x77\xb3\x6a\x6b\xdd\xcd\xaa\xad\x75\x37\xab\xb6\xd6\xdd\xac\xda\x5a\x77\xb3\x6a\x6b\xdd\xcd\xaa\xad\xad\x3a\xcb\xd3\xed\x5a\x7b\xbb\x31\x76\xe6\xd1\xcc\xdf\xa6\x67\xb6\xaa\x52\xe1\x6b\xc8\xcc\xae\x66\xfe\x42\x41\x5f\x5a\xfb\x7c\x43\x7d\x93\x59\x30\x9c\x3c\xb1\x77\xbe\x43\x87\xfa\x07\xbb\x07\xba\x0f\xeb\x1e\x98\xd1\x3d\x79\xfe\xc1\xc3\xfb\x27\xf7\x0f\x76\xf7\xf5\x76\x77\x4d\xee\x1e\x68\xfd\x88\x62\x38\x0a\xbc\x1a\xc6\x0b\xd3\xe7\x99\x47\xc6\x98\x69\x3d\x7d\xb3\x16\x77\xba\x27\xf5\xf7\x4d\x6e\xbd\x52\xe7\xc4\xf4\xea\xb8\xee\x23\x26\xf5\x76\x4d\x9b\x3c\xb1\x97\xff\xa9\xb7\xda\x92\x31\xae\x6f\xc6\xd0\xf4\xee\x81\x9e\x7e\x68\x65\xde\xac\x32\x6f\x56\x99\x37\xab\xcc\x9b\xd5\xd1\x36\xdf\xa4\xfe\xde\xfe\xbe\x69\xfd\x7d\xdd\x83\x5d\x03\x47\xf2\xbf\xad\xe9\x69\x5b\xb9\x62\xf0\xf3\x1d\xb0\x3b\xda\xc7\x4c\xef\x9e\xd1\x3d\xd8\xc5\x97\xbc\x0f\x1d\xd5\x51\xf5\xa1\x81\x7e\xbe\xe0\x03\xeb\x60\x54\xad\xc7\x82\x6a\xab\xf2\x36\x56\xe9\xb3\xca\x98\xaa\x8c\xa9\xca\x98\x5a\x8f\x05\x35\x3c\x35\x6e\xd7\x94\x51\xe6\x7f\x2a\xf3\x6c\x75\xd0\x40\xd7\x21\x83\x43\x03\xc3\xdf\x62\x4e\xdf\xae\xe9\xa2\xe6\x3d\xbc\xbb\xa7\x7b\x60\xc6\xe0\x40\xd7\x8c\x19\xf3\xec\xcc\x0b\x5b\x3f\xa9\x34\xda\xea\xb8\xee\x19\x83\x3d\xd3\xba\x06\xbb\x5b\xef\xaa\xa6\xeb\xa3\xbb\x7a\xbb\xa7\x4f\x9d\x67\xe6\x3b\x30\xb5\x67\x60\xf2\xb8\xc1\xc3\xfb\x67\x1d\xcc\x18\xd7\xdf\xd7\xdd\xdd\x33\x65\xea\xe0\xd4\x09\x83\x53\x07\xba\x39\x9e\x31\xef\x41\x3d\x87\x0d\x1f\x4f\x98\xd1\x7d\x58\x77\x1f\x5f\xb4\x3a\x6c\xcd\xb8\x95\xd6\x0e\xb2\x35\xe3\x56\x5a\x6b\xc6\xad\xb4\xd6\x8c\x5b\x69\xed\x9c\x66\x6b\xc6\xad\xb4\xd6\x8c\x5b\x69\xed\x9c\x6c\x6b\xc6\xad\xb4\xd6\x8c\x5b\x69\xad\x19\xb7\xd2\x4a\xf4\x5f\xa2\xff\x12\xfd\x97\xe8\xbf\x44\xff\x25\xfa\x2f\xd1\x7f\x89\xfe\x4b\xf4\x3f\xf3\x37\xae\x81\x81\xfe\xc3\x7b\xbb\x0f\x1a\x1c\x3b\xeb\x68\x68\xfa\xf8\x59\xed\xc0\xcc\xd3\x69\x7d\x73\x72\xff\xe1\x7d\xad\xa3\x89\xfd\x83\x53\xc7\xf1\xb2\xc9\x7d\xad\x2e\x2a\x74\x5d\xa1\xeb\x0a\x5d\x57\x18\x7a\x85\xa1\x57\x18\x7a\x6b\xc2\xaa\xb4\xd6\x84\x55\x69\xad\x09\xab\xd2\x5a\x13\x56\xa5\x75\x70\x6a\x1d\x9c\x5a\x07\xa7\xd6\xc1\xa9\x75\x70\x6a\x5c\x8d\x5a\x07\xfc\x8e\xd2\x84\x91\x91\x4d\x9c\xd1\xcd\x7f\x32\x88\x0e\x06\xd1\xc1\x20\x3a\x18\x04\x97\xa9\xc6\x65\xaa\x71\x99\x6a\x5c\xa6\x1a\x97\xa9\xc6\x65\xaa\x71\x99\x6a\x55\x63\xfe\x49\x5d\x03\x03\x3d\x5d\x53\xba\x07\xba\x07\x87\x06\x78\x2f\xaa\x8c\xa5\xca\x7b\x51\xe5\xbd\xa8\x32\x8c\x2a\xc3\xa8\x32\x8c\x2a\xc3\xa8\x32\x8c\x2a\xc3\xa8\x32\x8c\x1a\xc3\xa8\x31\x8c\x1a\xc3\xa8\x31\x8c\x1a\xef\x45\x8d\xf7\xa2\x06\xbf\x06\xbf\x06\xbf\x06\xbf\x06\xbf\x06\xbf\x06\xbf\x06\xbf\x06\xbf\x66\xb6\xde\xcb\xc9\x13\x7b\x67\x5e\x19\xe3\x87\xbf\x18\x9a\x3e\xdf\xf0\xe1\xac\xeb\x63\xe4\x55\x33\x2f\x91\x91\x2f\x66\x5e\x25\xad\x7e\x3a\x19\x57\x27\xe3\xea\x64\x5c\x9d\x8c\xab\x93\x71\x75\x32\xae\x4e\xc6\xd5\xc9\xb8\x3a\x19\x57\x27\xe3\xea\xe4\x7d\xa9\xf3\xbe\xd4\x79\x5f\xea\xbc\x2f\x75\xde\x97\x3a\xef\x4b\x1d\x7e\x1d\x7e\x1d\x7e\x1d\x7e\x1d\x7e\x1d\x7e\x1d\x7e\x1d\x7e\x1d\x7e\x1d\x7e\x1d\xbe\x09\xdf\x84\x6f\xc2\x37\xe1\x9b\xf0\x4d\xf8\x26\x7c\x13\xbe\x09\xdf\x84\x6f\xc2\x37\xe1\x9b\xf0\x4d\xf8\x26\x7c\xd3\x1c\x37\xd4\xd7\x33\x53\x2c\x5d\xbd\xf3\x76\x1f\xd1\x33\x63\xb0\xbb\x6f\xb0\xa7\xab\x77\x9e\xee\x69\xd3\x07\x8f\x9c\xd1\x3d\x38\xcf\x94\x81\xae\xc9\x3d\xdd\x7d\x83\x63\xbb\x7b\xbb\xa7\x75\xf7\x0d\x8e\x6f\x2d\xea\xce\x3c\x9c\x67\xc6\xd0\xa4\xa9\x83\x53\xbb\x66\x2d\x33\x2b\xd5\x9a\xb8\x2a\xa5\xc9\x84\xae\x19\x83\xdd\x03\x3d\x33\x0e\x99\xd6\x35\x38\x75\xc2\xf4\x81\xfe\xe9\xfd\x03\x83\x3d\xfd\x7d\x5d\xbd\xe3\xfb\x07\x06\xa7\xf6\x4f\x99\x79\x38\xba\xab\x6f\x4a\x6f\xeb\xae\x52\x4a\xa7\x95\xf1\xbd\xfd\x53\x7a\x26\x75\xf5\x76\xf5\x4d\x1e\xc7\x61\xff\xc0\x84\x9e\xbe\xc1\x99\xee\x9b\x34\xb3\x93\xd1\x43\x7d\x3d\xfd\x7d\xbc\x1e\xa4\xaa\x8f\x1b\x9c\xda\x3d\xd0\x7d\x10\x7f\x61\x53\x0a\xad\x29\xbd\x9d\xb6\x34\x76\x46\xcf\xb4\x9e\xde\xae\x01\xbe\xee\x1c\x37\xa9\xbf\x6f\xca\xc0\x10\xab\xe4\x4a\x19\xf4\x25\x6a\xde\xee\x43\x87\x7a\x0e\xeb\xea\xed\xee\x9b\x44\x6f\x3c\x4d\x15\x4f\x53\xc5\xd3\x53\xf1\xf4\x54\xad\xf5\x09\xa5\xda\xcd\x59\x67\xdb\x3d\x30\x63\x68\xe2\x8c\xee\xc1\xf9\x87\xbf\x98\xf9\x4f\xf7\xe0\xb8\xbe\xfe\xc1\xd6\x37\x5a\xaf\x2e\xcb\x84\x81\xee\x83\x7a\xbb\x8f\xe0\xd5\xc3\x5f\xb4\x5e\x3d\x7e\x52\xcf\xc0\xa4\xde\xee\xe9\xbd\x43\x33\xe6\x6f\x1d\x4e\x1b\xea\x1d\xec\x99\xde\xdb\xd2\xa9\xaa\x54\xe6\x9b\xde\x3d\x30\xbd\xbb\x6f\x72\xcf\xa4\xa1\x91\xf3\xaa\x9a\x63\x27\xf7\x0f\xce\x7c\xdf\x67\x7d\xad\x33\xa7\xd0\x99\x9f\xe8\xcc\x4f\xf4\xd6\x6f\x1b\x4a\x6f\xfd\xf6\xa0\x74\x9e\x53\xac\xec\x28\x56\x76\x14\x2b\x3b\x8a\x95\x1d\xc5\xca\x8e\x62\x65\x47\xb1\xb2\xa3\x58\xd9\x51\xac\xec\x28\x56\x76\x14\x2b\x3b\x8a\x95\x1d\xc5\xca\x8e\x62\x65\x47\xb1\xb2\xa3\x58\xd9\x51\xac\xec\x28\x56\x76\x14\x2b\x3b\x8a\x95\x1d\xc5\xca\x8e\x62\x65\x47\xb1\xb2\xa3\x58\xd9\x51\xac\xec\x28\x56\x76\x14\x2b\x3b\x8a\x95\x1d\xc5\xca\x8e\x62\x65\x47\xb1\xb2\xa3\x58\xd9\x51\xac\xec\x28\x56\x76\x14\x2b\x3b\x8a\x95\x1d\xc5\xca\x8e\x62\x65\x47\xb1\xb2\xa3\x8c\x32\xfc\x32\xfc\x32\xfc\x32\xfc\x32\xfc\x32\xfc\x32\xfc\x32\xfc\x32\xfc\x0a\xfc\x0a\xfc\x0a\xfc\x0a\xfc\x0a\xfc\x0a\x7c\x64\xc9\xea\x8e\x62\x75\x47\xb1\xba\xa3\x58\xdd\x51\xac\xee\x28\x56\x77\x14\xab\x3b\x8a\xd5\x1d\xc5\xea\x8e\x62\x75\x47\xb1\xba\xa3\x58\xdd\x51\xac\xee\x28\x56\x77\x14\xab\x3b\x8a\xd5\x1d\xc5\xea\x8e\x62\x75\x47\xb1\xba\xa3\x58\xdd\x51\xac\xee\x28\x56\x77\x14\xab\x3b\x8a\xd5\x1d\x65\x0c\x5f\x7f\x78\x92\xd5\x1d\xc5\xea\x8e\x62\x75\x47\xb1\xba\xa3\x58\xdd\x51\xac\x86\x28\x56\x43\x14\xab\x21\x8a\xd5\x10\xc5\x6a\x88\x62\x35\x44\xb1\x1a\xa2\x58\x0d\x51\xac\x86\x28\x56\x43\x14\xab\x21\x8a\xd5\x10\xc5\x6a\x88\x62\x35\x44\xb1\x1a\xa2\x58\x0d\x51\xac\x86\x28\x56\x43\x14\xab\x21\x8a\xd5\x10\xc5\x6a\x88\x62\x35\x44\xb1\x1a\xa2\x58\x0d\x51\xac\x86\x28\xa3\x5e\x99\x67\x17\x53\x6b\x1b\x0e\x0d\x28\x69\xd3\x66\xfe\x87\x36\xdb\x7f\xe8\xb4\x06\xad\xd0\xb6\xd3\x96\x68\xcb\xb4\x15\xda\x0e\xda\xea\x3c\xbb\x98\x6d\xb3\x77\xd8\x49\x5b\xa7\x35\x67\xbe\x40\xff\xdf\x0b\x5a\x2b\x0c\x8a\x15\x06\x25\x9a\x3e\xf3\x05\x6a\xb6\x17\x30\x04\x8d\x21\x68\xa5\x99\x2f\x30\x66\x7b\x01\x63\xd0\x18\x83\x36\x6b\x0c\xe5\xd9\x5e\xc0\x18\x34\xc6\xa0\xb5\xde\x56\x51\x7c\x9f\x19\xb6\x28\x86\xa0\x66\x0d\xa1\xf2\xbf\x0e\x14\x43\x50\x0c\x81\x5f\x84\x44\xf1\x2e\x28\x46\xc0\x2f\x46\xa2\x66\x8d\xa0\x7d\xb6\x0e\x18\x81\x62\x04\x8a\x11\xe8\x7c\x5f\x67\x04\x3a\x23\xd0\x67\x8d\xa0\xf4\xbf\x0e\x30\x8d\x60\x1a\xd1\x19\x81\xce\x08\x74\x46\xa0\x33\x02\x7d\xd6\x08\x64\xb6\x0e\x18\x01\xbf\x6f\x89\xce\x08\x0c\xbe\xcf\x6f\x4b\x62\x30\x02\x83\x0b\xc1\xe0\x42\x30\x18\x80\xc1\x00\x0c\x06\xc0\xef\x37\x62\x30\x00\x83\x01\x18\x33\x07\x60\xcc\xfa\x9c\xe7\xd9\xc5\x54\x06\x07\xa2\x0d\x1f\x28\x0e\xf4\xca\xf0\x6b\x86\xff\x47\x0d\xbf\x46\xc9\xf0\x8b\xdb\x38\x30\x86\x5f\xac\x97\x87\x5f\x33\x72\x50\x1a\x3e\x68\x1f\x7e\xcd\xc8\xc1\xf0\xb7\x8c\x61\x84\x36\x02\x1d\xee\x59\x0d\x0f\xd5\x18\x79\xf1\x70\xcf\xc6\xf0\x78\x8c\xe1\xf1\x18\xc3\x3d\x1b\xc3\x3f\x2e\x23\x27\x38\xd2\xcf\x6c\x57\x28\x1e\x12\x3c\x24\x78\x48\xf0\x90\xe0\x21\xc1\x43\x82\x87\x04\x0f\x09\x9e\x10\x3c\x21\x65\x7d\xec\xe4\xbe\x89\xbd\xfd\x93\x0e\xe1\x6b\x3e\x1c\x3c\x21\xe5\xd2\xe8\xd9\xbf\xcb\x47\x83\x25\xa4\x5c\x1d\xdb\x7b\xd0\xec\xdf\x67\x74\x58\x42\xca\xe6\xe8\x19\x53\xbb\x26\x77\x8f\x9d\x7c\x48\xab\x9d\xf5\xbf\x38\x41\x2a\x32\xee\xa0\x9e\xde\xde\xee\xc9\x13\xfb\x8f\x18\xb3\xa5\x52\x6d\xc3\x83\xed\x18\x6e\x79\x21\x0f\x6f\xe1\xe1\x2d\x3c\xbc\x85\x87\xb7\x74\x54\xc6\x6c\xa9\x95\x67\x5e\x68\x83\x33\x7f\x23\x19\x9a\xde\xfa\x6f\x9e\xc1\xc2\x2f\x25\x52\x2d\xb5\xbe\xcf\x2f\x6e\xc2\x2f\x1d\xc2\x2f\x19\xc2\x2f\x19\xc2\x2f\x11\xc2\x2f\x11\x52\x2b\x8f\x69\x4d\x68\xf8\xb2\x3e\x8b\xa6\xd3\x3b\x4f\x74\xe1\x89\x2e\x3c\x51\x85\x27\xaa\xf0\x44\x95\xba\x8c\xef\x9f\xde\xdd\x37\x71\xa8\xb7\x97\x09\x95\x30\x9b\x6e\xe7\xd1\xd8\xce\xa3\xb1\x9d\x27\x5c\x7b\x1b\xdf\xd7\x6a\xb4\xf5\x31\x07\x75\x4f\xeb\xea\xed\x1e\x35\xf3\x9f\xd6\xff\x89\x41\x4b\x1f\x42\x1f\x52\xa2\x2d\xd3\x56\x68\x3b\x68\xab\xb4\xf4\x2d\x9d\xb4\xb0\xc5\x1c\x3d\x63\xfa\xf0\x47\xd6\xce\xf4\xaa\xbd\x5d\x8d\x9a\xd4\x3b\x34\x91\x2f\x8c\xd1\x53\xbb\xbb\x06\x06\xc7\x4e\xee\xe9\x9a\x36\xbc\x40\xd3\xce\xcc\xaa\x9d\x99\x55\x7b\x7b\x65\xde\x69\x43\x33\x66\x4e\x8c\x67\xce\xc4\xf9\x3f\xa0\x5c\xcd\xed\x5c\xc5\xed\xcc\x66\xda\xb9\x4a\xdb\xb9\x4a\xdb\x99\xcd\xb4\x33\x9b\x69\xe7\x2a\x2d\xb5\xd6\x90\x55\x49\x33\x68\x87\xff\xbf\x9d\xb6\x35\x86\x52\xeb\x29\xab\x73\x17\xe9\xac\x9e\xe9\xac\x9e\xe9\xac\x9e\xe9\xac\x9a\xe9\xac\x9a\xe9\xac\x9a\xe9\xac\x9a\xe9\xac\x9a\xe9\xac\x9a\xe9\x6d\xad\x59\xa9\xde\xd6\xfa\x55\x42\x6f\x6b\x29\x4a\x6f\x6b\x7d\x80\x7a\x5b\xeb\x03\xd4\xdb\x34\xb8\x1a\x5c\x0d\xae\x06\xb7\x35\x7e\xbd\x4d\x83\xaf\xc1\xd7\xe0\x6b\xf4\xab\xd1\xaf\x46\xbf\x8a\xfe\x14\xfd\x29\xfa\x53\xf4\xa7\xe8\x4f\xd1\xdf\xf0\xfb\xa0\x38\x1f\xc5\xf9\x18\xf4\x63\xd0\x8f\x41\x3f\x06\xfd\x18\xf4\x63\xd0\x8f\x41\x3f\x06\xfd\x18\xc3\xfd\xf0\xbe\x18\xbc\x2f\x06\xef\x8b\xc1\xf8\x0d\xc6\x6f\x30\x7e\xe1\x7d\x11\xf8\x02\x5f\xe0\x0b\x7c\x81\x2f\xf0\x05\xbe\xc0\x17\xf8\x02\x5f\xe0\x0b\x7c\x81\x2f\xf0\x05\x7e\x3b\xfc\x76\xf8\xed\xf0\xdb\xe1\xb7\xc3\x6f\x87\xdf\x0e\xbf\x1d\x7e\x3b\xfc\x76\xf8\xed\xf0\xdb\xe1\xb7\xc3\x6f\x87\xdf\x0e\xbf\x1d\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x09\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x19\x7e\x05\x7e\x05\x7e\x05\x7e\x05\x7e\x05\x7e\x85\xfe\x2b\xf4\x5f\xa1\xff\x0a\xfd\x57\xe8\xbf\x42\xff\x1d\xf4\xd7\x41\x7f\x1d\xf4\xd7\x41\x7f\x1d\x9c\x4f\x07\xe7\xd3\xc1\xf9\x74\x70\x3e\x1d\xf0\x3a\xe0\x75\xc0\xeb\x80\xd7\x01\xaf\x63\x98\xc7\xf9\x54\x39\x9f\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x2a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x1a\xfc\x4e\xf8\x9d\xf0\x3b\xe1\x77\xc2\xef\x84\xdf\x09\xbf\x13\x7e\x27\xfc\x4e\xf8\x9d\xf0\x3b\xe1\x77\xc2\xef\x84\xdf\x09\xbf\x13\x7e\x27\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\xfc\x3a\x7c\x13\xbe\x09\xdf\x84\x6f\xc2\x37\xe1\x9b\xf0\x4d\xf8\x26\xfd\x9b\xf4\x6f\xd2\x7f\x6b\xd9\x4b\xd7\xf0\x92\x86\x97\x34\xbc\xa4\xe1\x25\x32\x30\xba\x86\x97\x34\xbc\xa4\xe1\x25\x0d\x2f\x69\x6d\xc3\xfd\xb5\xc6\xab\xe1\x25\x0d\x2f\x69\x78\x49\xc3\x4b\x1a\x5e\xd2\xf0\x92\x86\x97\x34\xbc\xa4\x69\xf0\x35\xf8\x1a\x7c\x0d\xbe\x06\x1f\x7f\x69\xf8\x4b\xc3\x5f\x9a\x82\x8f\xc7\x34\x3c\xa6\xe1\x31\x0d\x8f\x69\x78\x4c\xc3\x63\x1a\x1e\xd3\xf0\x98\x86\xc7\x34\x9d\x7e\x74\xfa\xd1\xe9\x47\xa7\x1f\x9d\x7e\x74\xfa\xd1\xe9\x47\xa7\x1f\x7d\xb8\x1f\xce\x43\xe7\x3c\x74\xce\x43\xe7\x3c\x74\xce\x43\xe7\x3c\x0c\xce\x03\x8f\x6a\x78\x54\xc3\xa3\x1a\x1e\xd5\xf0\xa8\x86\x47\x35\x3c\xaa\xe1\x51\x0d\x8f\x6a\x78\x54\xc3\xa3\x1a\x1e\xd5\xf0\xa8\x86\x47\x35\x3c\xaa\xe1\x51\x0d\x8f\x6a\x78\x54\xc3\xa3\x1a\x1e\xd5\xf0\xa8\x86\x47\x35\x3c\xaa\xe1\x51\x0d\x8f\x6a\x78\x54\xc3\xa3\x1a\x1e\xd5\xf0\xa8\x86\x47\x35\x3c\xca\x5f\x7b\x74\xfe\xda\xa3\xf3\xd7\x1e\x9d\xbf\xf6\xe8\xfc\xb5\x47\xe7\xaf\x3d\x3a\x7f\xed\xd1\xf9\x6b\x8f\xce\x5f\x7b\x74\xfe\xda\xa3\xf3\xd7\x1e\x9d\xbf\xf6\xe8\x1a\x1e\xd5\xf0\xa8\x86\x47\x35\x3c\xca\x5f\x83\x74\xfe\x1a\xa4\xf3\xd7\x20\x9d\xbf\x06\xe9\xfc\x35\x48\xe7\xaf\x41\x3a\x7f\x0d\xd2\xf9\x6b\x90\xce\x5f\x83\x74\x0d\x8f\x6a\x78\x54\xc3\xa3\x1a\x1e\xd5\xf0\xa8\x86\x47\x35\x3c\xaa\xe1\x51\x0d\x8f\x6a\x78\x54\xc3\xa3\x1a\x1e\xd5\xf0\xa8\x86\x47\x35\x3c\xaa\xe1\x51\x0d\x8f\x6a\x78\x54\xc3\xa3\x1a\x1e\xd5\xf0\xa8\x86\x47\x15\xf3\x59\xc5\x7c\x56\x31\x9f\x55\xcc\x67\x55\x6b\xed\x45\x57\x3c\x3f\x14\xcf\x0f\xc5\xf3\x83\xbf\xe0\xea\x8a\xe7\x87\xe2\xf9\xa1\x78\x7e\xb0\x44\xae\x2b\x9e\x1f\xaa\x6d\x98\xdb\x3a\x6f\xc5\xf3\x43\xf1\xfc\x50\x3c\x3f\x14\xcf\x0f\xc5\xf3\x43\xf1\xfc\x50\x3c\x3f\x14\xcf\x0f\xc5\xf3\x43\xf1\xfc\x50\x3c\x3f\x14\xcf\x0f\xc5\xf3\x43\xf1\x9c\x50\x3c\x27\x14\xcf\x09\xd6\xe1\x75\xc5\x73\x42\xf1\x9c\x50\x3c\x27\x14\xcf\x09\xc5\x73\x42\xf1\x9c\x50\x3c\x27\x14\xcf\x09\xc5\x7d\xaf\xb8\x8e\x15\xd7\xb1\xe2\x3a\x56\x5c\xc7\x8a\xeb\x58\x71\x1d\xb3\xce\xae\xb3\xce\xae\x2b\xae\x63\xd5\x3e\xdc\x1f\xe7\xc3\x75\xac\xb8\x8e\x15\xd7\x31\xeb\xf0\xba\xe2\x3a\x56\x5c\xc7\x8a\xeb\x58\x71\x1d\x2b\xae\x63\xc5\x75\xac\xb8\x8e\x15\xd7\xb1\xe2\x3a\x56\x5c\xc7\x8a\xeb\x58\x71\x1d\x2b\xae\x63\xc5\xf5\xaa\x98\x0f\x29\xe6\x43\x8a\xf9\x90\x62\x3e\xa4\x98\x0f\x29\xe6\x43\x3a\xd7\x93\xce\x75\xa0\xf3\xb9\xea\x7c\x7e\x3a\x9f\x87\xce\xe7\xa1\xf3\xfe\xeb\xbc\xff\xba\x6a\xf1\x75\x9e\xbb\x3a\xcf\x55\x9d\xe7\x9d\xce\xf3\x4e\xe7\xf9\xa6\xf3\x1c\xd3\x79\x3e\xe9\x8c\x5f\xe7\x3e\xd4\xb9\x0f\x75\xee\x43\x9d\xfb\x4f\xe7\xfe\xd3\xb9\xff\x74\xee\x3f\x9d\xfb\x4f\xe7\x3e\xd3\xb9\xcf\x74\xee\x33\x9d\xfb\x4c\xe7\x3e\xd3\xb9\xcf\xf4\xf2\x70\xff\xad\xf7\x4d\x67\xbe\xaa\x33\x5f\xd5\x99\xaf\xea\xcc\x57\x75\xe6\xab\x7a\x6b\xb5\x5b\xd7\x2b\x9c\x6f\x85\xf3\xa8\xc0\x67\x3e\xab\x33\x9f\xd5\x99\xcf\xea\xcc\x67\x75\xe6\xb3\x3a\xf3\x59\xbd\x02\xbf\x03\x3e\xf3\x5b\x9d\xf9\xad\xce\xe7\xa9\xf3\x79\xea\x7c\x9e\x3a\x9f\xa7\xce\xe7\xa9\x0f\x7f\x9e\xcc\x6f\x75\xe6\xb7\x3a\xf3\x5b\x9d\xf9\xad\xce\xfc\x56\x67\x7e\xcb\x5f\x5b\x74\x9d\xf9\xad\xce\xfc\x56\x67\x7e\xab\x33\xbf\xd5\x99\xdf\xea\xcc\x6f\x75\xe6\xb7\x3a\xf3\x5b\x9d\xf9\xad\xce\xfc\x56\x67\x7e\xab\x33\xbf\xd5\x99\xdf\xea\xcc\x6f\x75\xe6\xb7\x3a\xf3\x5b\x9d\xf9\xad\xce\xfc\x56\x67\x7e\xab\x33\xbf\xd5\x99\xdf\xea\xcc\x6f\x75\xe6\xb7\x3a\xf3\x5b\x9d\xf9\xad\xce\xfc\x56\x67\x7e\xab\x33\x9f\xd5\x99\xcf\xea\xcc\x67\x75\xe6\xb3\xec\x07\xd0\xd9\x0f\xa0\xeb\xcc\x67\x75\xe6\xb1\xec\x0f\xd0\x75\xe6\xaf\x3a\xf3\x55\x9d\xf9\xaa\xde\x9a\xaf\x1a\x9d\xad\xe7\xb5\xd1\xd9\x7a\x7f\x0c\x32\x6f\x06\x99\x37\xa3\xde\x7a\x7e\x1b\xf5\xd6\xfd\x66\xd4\x5b\xcf\x6f\xa3\xde\x36\xfc\xfa\x76\xda\x12\x6d\x99\xb6\x42\xdb\x41\x5b\xa5\x9d\xc5\x37\x2b\xed\xc3\xaf\xaf\xd3\x9a\xad\x56\x83\xaf\xc1\xd7\xe0\x6b\xf0\x35\xf8\x1a\x7c\x0d\xbe\x46\x7f\x1a\x7c\x0d\xbe\x06\x5f\x83\xdf\x7a\x7e\x1b\xf5\xd6\xfc\xcf\xa8\x6b\xf0\x35\xf8\x0a\xbe\x82\xaf\xe0\x2b\xf8\x0a\xbe\x82\xaf\xe0\x2b\xf8\x0a\xbe\x82\xaf\xe0\x2b\xf8\x0a\xbe\x82\xaf\xe0\x2b\xf8\x3a\x7c\x1d\xbe\x0e\x5f\x87\xaf\xc3\xd7\xe1\xeb\xf0\x75\xf8\xad\x79\xa3\x59\x11\xfa\xd5\xe1\xeb\xf0\x75\xf8\x3a\x7c\x7d\xf8\x75\xf0\x0d\xf8\x06\x7c\x03\xbe\x01\xdf\x80\x6f\xc0\x37\xe0\x1b\xf0\x0d\xce\xdf\xe0\xfc\x0d\xf8\x06\x7c\x03\xbe\x01\xdf\x80\x6f\xc0\x17\xf8\x02\x5f\xe0\x0b\x7c\x81\x2f\xf0\x05\xbe\xc0\x17\xf8\x02\x5f\xe0\x0b\x7c\x81\x2f\xf0\x87\xdf\x27\x81\xdf\x0e\xbf\x1d\x7e\x3b\xfc\x76\xf8\xed\xf0\xdb\xe1\xb7\xc3\x1f\xbe\x9e\xdb\xe1\xb7\xc3\x6f\x87\xdf\x0e\xbf\x1d\x7e\x3b\xfc\x76\xf8\xed\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\x4b\xf0\xcb\xf0\xcb\xf0\xcb\xf0\xcb\xf0\xcb\xf0\x5b\xf3\x46\xb3\x52\xa5\xff\x32\xfc\x32\xfc\x32\xfc\xf2\xf0\xf7\xe1\x97\xe1\x97\xe1\x97\xe1\x97\xe1\x57\xe0\x57\xe0\x57\xe0\x57\xe0\x57\xe0\x57\x38\xff\x0a\xe7\x5f\x81\x5f\x81\x5f\x81\x5f\x81\x5f\x81\x5f\x81\x5f\x81\x5f\x81\x5f\x81\xdf\x01\xbf\x03\x7e\x07\xfc\x0e\xf8\x1d\xf0\x3b\xe0\x77\xc0\xef\x80\xdf\x01\xbf\x03\x7e\x07\xfc\x0e\xf8\x1d\xf0\x3b\xe0\x77\xc0\xef\x80\x5f\x85\x5f\x85\x5f\x85\x5f\x85\x5f\x85\x3f\xfc\xbc\xae\xc2\xaf\xc2\xaf\xc2\xaf\xc2\x1f\xfe\x7c\xaa\xf0\xab\xf0\xab\xf0\xab\xf0\xab\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x6b\xf0\x3b\xe1\x77\xc2\xef\x84\xdf\x09\xbf\x13\x7e\x27\xfc\x4e\xf8\x9d\xf0\x3b\xe1\x77\xc2\xef\x84\xdf\x09\xbf\x13\x3e\xfe\x23\xa3\x6b\x90\xd1\x35\xc8\xe8\x1a\x64\x74\x0d\x32\xba\x06\x19\x5d\x83\x8c\xae\x41\x46\xd7\x20\xa3\x6b\x90\xd1\x35\xc8\xe8\x1a\x64\x74\x0d\x32\xba\x06\x19\x5d\x83\x8c\xae\x41\x46\xd7\x20\xa3\x6b\x90\xd1\x35\xc8\xe8\x1a\x75\x13\xbe\x09\xdf\x84\x6f\xc2\x37\xe1\x9b\xf0\x4d\xf8\x26\x7c\x13\xbe\x09\xdf\x84\x6f\xc2\x37\xe1\x9b\xf0\x5b\xd9\x7c\xc3\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\xcd\x96\xff\x0d\xb3\x35\x6f\x37\x4c\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x53\x87\xaf\xc3\xc7\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\x3f\xe9\x71\xc3\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\x65\xf8\x65\xf8\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\xf8\xdf\xc4\xff\x26\xfe\x37\xf1\xbf\x89\xff\x4d\xfc\x6f\xe2\x7f\x13\xff\x9b\x2d\xff\x0b\x79\x04\x21\x8f\x20\xe4\x11\x84\x3c\x82\xb0\x9b\x47\xc8\x25\x08\xb9\x04\x21\x97\x20\xe4\x12\x84\x5c\x82\x90\x4b\x10\x72\x09\x42\x2e\x41\xc8\x25\x08\xb9\x04\x21\x97\x20\xe4\x12\x84\x5c\x82\x90\x4b\x10\x72\x09\x42\x2e\x41\xc8\x25\x08\xb9\x04\x21\x97\x20\x6d\x1a\x7c\x0d\xbe\x06\x5f\x83\xaf\xc1\xd7\xe0\x6b\xf0\x35\xf8\x0a\xbe\x82\xaf\xe0\x2b\xf8\x0a\xbe\x82\xaf\xe0\x2b\xf8\x0a\xbe\x82\xaf\xe0\x2b\xf8\x0a\xbe\x82\xaf\xe0\x2b\xf8\x3a\x7c\x1d\xbe\x0e\x5f\x87\xaf\xc3\xd7\xe1\xeb\xf0\x75\xf8\x3a\x7c\x1d\xbe\x0e\x5f\x87\xaf\xc3\xd7\xe1\xeb\xf0\x75\xf8\x06\x7c\x03\xbe\x01\xdf\x80\x6f\xc0\x37\xe0\x1b\xf0\x0d\xf8\x06\x7c\x03\xbe\x01\xdf\x80\x6f\xc0\x37\xe0\x1b\xf0\x0d\xf8\x02\x5f\xe0\x0b\x7c\x81\x2f\xf0\x05\xbe\xc0\x17\xf8\x02\x5f\xe0\x0b\x7c\x81\x2f\xf0\x05\xbe\xc0\x17\xf8\xed\xf0\xdb\xe1\xb7\xc3\x6f\x87\xdf\x0e\xbf\x1d\x7e\x3b\xfc\x76\xf8\xed\xf0\xdb\xe1\xb7\xc3\x6f\x87\xdf\x0e\xbf\x1d\x7e\x3b\xfc\x76\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x25\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x65\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x15\xf8\x1d\xf0\x3b\xe0\x77\xc0\xef\x80\xdf\x01\xbf\x03\x7e\x07\xfc\x0e\xf8\x1d\xf0\x3b\xe0\x77\xc0\xef\x80\xdf\x01\xbf\x03\x7e\x07\xfc\x0e\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x55\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x35\xf8\x9d\xf0\x3b\xe1\x77\xc2\xef\x84\xdf\x09\xbf\x13\x7e\x27\xfc\x4e\xf8\x9d\xf0\x3b\xe1\x77\xc2\xef\x84\xdf\x09\xbf\x13\x7e\x27\xfc\x4e\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x75\xf8\x26\x7c\x13\xbe\x09\xdf\x84\x6f\xc2\x37\xe1\x9b\xf0\x4d\xf8\x26\x7c\x13\xbe\x09\xdf\x84\x6f\xc2\x37\xe1\x9b\xf0\xf1\xbf\x86\xff\x35\xfc\xaf\xe1\x7f\x0d\xff\x6b\xf8\x9f\xfc\x87\x90\xff\x10\xf2\x1f\x42\xfe\x43\xc8\x7f\x08\xf9\x0f\x21\xff\x21\xe4\x3f\x84\xfc\x87\x90\xff\x10\xf2\x1f\x42\xfe\x43\xc8\x7f\x08\xf9\x0f\x21\xff\x21\xe4\x3f\x84\xfc\x87\x90\xff\x10\xf2\x1f\x42\xfe\x43\xc8\x7f\x08\xf9\x0f\x21\xff\x21\xe4\x3f\x84\xfc\x87\x90\xff\x10\xf2\x1f\x42\xfe\x43\xc8\x7f\x08\xf9\x0f\x21\xff\x21\xe4\x3f\x84\xfc\x87\x90\xff\x10\xf2\x1f\x42\xfe\x43\xc8\x7f\x88\x86\xff\x35\xfc\xaf\xe1\x7f\x0d\xff\x6b\xf8\x5f\xc3\xff\x1a\xfe\x27\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\xc8\x8d\x08\xb9\x11\x21\x37\x22\xe4\x46\x84\xdc\x88\x90\x1b\x11\x72\x23\x42\x6e\x44\x34\xfc\xaf\xe1\x7f\x0d\xff\x6b\xf8\x9f\xba\x49\xa2\xe1\x7f\x0d\xff\xb3\xd5\x59\xd8\xea\x2c\x6c\x75\x16\xb6\x3a\x0b\x5b\x9d\x85\xad\xce\xc2\x56\x67\x61\xab\xb3\xb0\xd5\x59\xd8\xea\x2c\x6c\x75\x16\xb6\x3a\x0b\x5b\x9d\x85\xad\xce\xc2\x56\x67\x61\xab\xb3\xb0\xd5\x59\x34\xfc\xaf\xe1\x7f\x76\x39\x0b\xbb\x9c\x85\x5d\xce\xc2\x2e\x67\x61\x97\xb3\xb0\xcb\x59\xd8\xe5\x2c\xec\x72\x16\x76\x39\x0b\xbb\x9c\x85\x5d\xce\xa2\xe1\x7f\x0d\xff\xb3\xbd\x59\xd8\xde\x2c\x6c\x6f\x16\xb6\x37\x0b\xdb\x9b\x85\xed\xcd\xc2\xf6\x66\x61\x7b\xb3\xb0\xbd\x59\xd8\xde\x2c\x6c\x6f\x16\xb6\x37\x0b\xdb\x9b\x85\xed\xcd\xc2\xf6\x66\x61\x7b\xb3\xb0\xbd\x59\xd8\xde\x2c\x6c\x6f\x16\xb6\x37\x0b\xdb\x9b\x85\xed\xcd\xc2\xf6\x66\x61\x7b\xb3\xb0\xbd\x59\x34\xfc\x4f\x05\x48\xd1\xf0\x3f\x95\x20\x45\xc3\xff\x54\x84\x14\xb6\x31\x0b\xdb\x98\x85\x6d\xcc\xc2\x36\x66\x61\x1b\xb3\xb0\x8d\x59\xd8\xc6\x2c\x6c\x63\x16\xb6\x31\x0b\xdb\x98\x85\x6d\xcc\xc2\x36\x66\x61\x1b\xb3\xb0\x8d\x59\xd8\xc6\x2c\x6c\x63\x16\xb6\x31\x0b\xdb\x98\x85\x6d\xcc\xc2\x36\x66\x61\x1b\xb3\xb0\x8d\x59\xd8\xc6\x2c\x6c\x63\x16\xb6\x31\x0b\xdb\x98\x85\x6d\xcc\xc2\x36\x66\x61\x1b\xb3\xb0\x8d\x59\xd8\xc6\x2c\x6c\x63\x16\xb6\x31\x0b\xdb\x98\x85\x6d\xcc\xc2\x36\x66\x61\x1b\xb3\xb0\x8d\x59\xd8\xc6\x2c\x6c\x63\x16\xb6\x31\x0b\xdb\x98\x45\xc3\xff\xe4\xb7\x84\xfc\x96\x90\xdf\x12\xf2\x5b\x42\x7e\x4b\xc8\x6f\x09\xf9\x2d\x21\xbf\x25\xe4\xb7\x84\xfc\x96\x90\xdf\x12\xf2\x5b\x42\x7e\x4b\xc8\x6f\x09\xf9\x2d\x21\xbf\x25\xe4\xb7\x84\xfc\x96\x90\xdf\x12\xf2\x5b\x42\x7e\x4b\xc8\x6f\x09\xf9\x2d\x21\xbf\x25\xe4\xb7\x84\xfc\x96\x90\xdf\x12\xf2\x5b\x42\x7e\x4b\x14\xfe\x57\xf8\x5f\xe1\x7f\x72\x5d\x42\xae\x4b\xc8\x75\x09\xb9\x2e\x21\xd7\x25\xe4\xba\x84\x5c\x97\x90\xeb\x12\x72\x5d\x42\xae\x4b\x14\xfe\x57\xf8\x9f\xfd\xd6\xa2\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\x4f\x1e\x4c\xc8\x83\x89\xc2\xff\x0a\xff\xb3\x3b\x5b\xd8\x9d\x2d\x0a\xff\x2b\xfc\x4f\x7e\x4c\x14\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x9f\x92\x20\xa2\xf0\xbf\xc2\xff\x0a\xff\xb3\x47\x5c\x14\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\xf2\x76\x42\xde\x4e\xc8\xdb\x09\x79\x3b\x21\x6f\x27\xe4\xed\x84\xbc\x9d\x90\xb7\x13\xf2\x76\x42\xde\x4e\xc8\xdb\x09\x79\x3b\x21\x6f\x27\xe4\xed\x84\xbc\x9d\x90\xb7\x13\xf2\x76\x42\xde\x4e\xc8\xdb\x09\x79\x3b\x21\x6f\x27\xe4\xed\x84\xbc\x9d\x90\xb7\x13\xf2\x76\x42\xde\x4e\xc8\xdb\x09\x79\x3b\x51\xf8\x5f\xe1\x7f\x85\xff\xc9\xe1\x89\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\xab\x96\xff\xcd\xca\xf0\x38\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x93\x4f\x14\xf2\x89\x42\x3e\x51\xc8\x27\x0a\xf9\x44\x21\x9f\x28\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\x3f\x95\x8c\x45\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x2a\x26\x0b\x15\x93\x45\xe1\x7f\x2a\x27\x8b\xc2\xff\x0a\xff\x53\x49\x59\x14\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x5f\xe1\x7f\x85\xff\x15\xfe\x57\xf8\x9f\xca\xd2\xa2\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\xaf\xf0\xbf\xc2\xff\x0a\xff\x2b\xfc\x4f\x4d\x2d\xa1\x72\xb5\xe8\xf8\x9f\xbc\xad\xe8\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\x3f\xd5\x32\x84\x6a\x19\x42\xb5\x0c\xa1\x5a\x86\xe8\xf8\x9f\xdc\xae\xe8\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\x3f\xd5\x35\x44\xc7\xff\xe4\x7c\x45\xc7\xff\x7a\xcb\xff\x66\xa5\x7d\xf8\xfb\xf0\xf1\xbf\x8e\xff\x75\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\x3f\x39\x62\x21\x47\x2c\x3a\xfe\xd7\xf1\x3f\xb9\x62\x21\x57\x2c\x3a\xfe\xd7\xf1\xbf\x8e\xff\xc9\x1b\x8b\x8e\xff\x75\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\x75\xfc\x4f\x7e\x59\x74\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\x9f\x7c\xb3\xe8\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\x75\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\xc9\x51\x0b\x39\x6a\xd1\xf1\xbf\x8e\xff\xc9\x55\x8b\x8e\xff\x75\xfc\xaf\xe3\x7f\xf2\xd6\xa2\xe3\x7f\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\x27\x97\x2d\x3a\xfe\xd7\xf1\xbf\x8e\xff\x75\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\xf5\xe1\xeb\x0b\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\x75\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\x75\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\x75\xfc\x4f\x5e\x5d\xc8\xab\x0b\x79\x75\x21\xaf\x2e\x3a\xfe\x27\xb7\x2e\xe4\xd6\x85\xdc\xba\x90\x5b\x17\x72\xeb\xa2\xe3\x7f\x1d\xff\xeb\xf8\x9f\x3c\xbb\x90\x67\x17\xf2\xec\x42\x9e\x5d\xc8\xb3\x0b\x79\x76\x21\xcf\x2e\xe4\xd9\x85\x3c\xbb\x90\x67\x17\xf2\xec\x42\x9e\x5d\xc8\xb3\x0b\x79\x76\x21\xcf\x2e\xe4\xd9\x85\x3c\xbb\x90\x67\x17\xf2\xec\x42\x9e\x5d\xc8\xb3\x0b\x79\x76\x21\xcf\x2e\xe4\xd9\x85\x3c\xbb\x90\x67\x17\xf2\xec\x42\x9e\x5d\xc8\xb3\x0b\x79\x76\x21\xcf\x2e\xe4\xd9\x85\x3c\xbb\x90\x67\x17\xf2\xec\x42\x9e\x5d\xc8\xb3\x0b\x79\x76\x21\xcf\x2e\xe4\xd9\x85\x3c\xbb\x90\x67\x17\xf2\xec\x42\x9e\x5d\xc8\xb3\x0b\x79\x76\x21\xcf\x2e\xe4\xd9\x85\x3c\xbb\x90\x67\x17\xf2\xec\x42\x9e\x5d\xc8\xb3\x0b\x79\x76\x21\xcf\x2e\xe4\xd9\x85\x3c\xbb\x90\x67\x17\xf2\xec\x42\x9e\x5d\xc8\xb3\x0b\x79\x76\x21\xcf\x2e\xe4\xd9\x85\x3c\xbb\x90\x67\x17\xf2\xec\xa2\xe3\x7f\x1d\xff\x93\x6f\x17\xf2\xed\x42\xbe\x5d\xc8\xb7\x0b\xf9\x76\x21\xdf\x2e\xe4\xdb\x45\xc7\xff\xe4\xdc\x85\x9c\xbb\xe8\xf8\x9f\xbc\xbb\xe8\xf8\x5f\xc7\xff\xe4\xdf\x85\xfc\xbb\x90\x7f\x17\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\x75\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\x75\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\x75\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\x5f\xc7\xff\x3a\xfe\xd7\xf1\xbf\x8e\xff\x75\xfc\xaf\xe3\x7f\x1d\xff\xeb\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\x81\xff\x0d\xfc\x6f\xe0\x7f\x03\xff\x1b\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\x81\xff\x0d\xfc\x6f\xe0\x7f\xa3\xe5\x7f\xb3\xc2\xe7\x60\xe0\x7f\x03\xff\x1b\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\xc1\xef\xff\x06\xbf\xff\x1b\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\x81\xff\x0d\xfc\x6f\x68\xc3\x5c\xce\x1f\xff\x1b\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\x81\xff\x0d\xfc\x6f\xe0\x7f\x03\xff\x1b\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\x81\xff\x0d\xfc\x6f\xe0\x7f\x03\xff\x1b\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\x81\xff\x0d\xfc\x6f\xe0\x7f\x03\xff\x1b\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\x81\xff\x0d\xfc\x6f\xe0\x7f\x03\xff\x1b\x2d\xff\x9b\x95\xf2\xf0\xd7\xf0\xf1\xbf\x81\xff\x0d\xfc\x6f\xe0\x7f\x03\xff\x1b\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\x81\xff\x0d\xfc\x6f\xe0\x7f\x03\xff\x1b\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\x81\xff\x0d\xfc\x6f\xe0\x7f\x03\xff\x1b\xf8\xdf\xc0\xff\x06\xfe\x37\xf0\xbf\x81\xff\x0d\xfc\x6f\xe0\x7f\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\xf5\x36\xa1\x7a\x9b\x50\xbd\x4d\xa8\xde\x26\x54\x6f\x13\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\xf5\x36\xa1\x7a\x9b\x50\xbd\x4d\xa8\xde\x26\x54\x6f\x13\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\xf5\x36\xa1\x7a\x9b\x50\xbd\x4d\xa8\xde\x26\x54\x6f\x13\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\xf5\x36\xa1\x7a\x9b\x50\xbd\x4d\xa8\xde\x26\x54\x6f\x13\x63\xf8\xf3\xc6\xff\x54\x6f\x13\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\xf5\x36\xa1\x7a\x9b\x50\xbd\x4d\xa8\xde\x26\x54\x6f\x13\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\xf5\x36\xa1\x7a\x9b\x50\xbd\x4d\xa8\xde\x26\x54\x6f\x13\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\xf5\x36\xa1\x7a\x9b\x50\xbd\x4d\xa8\xde\x26\x54\x6f\x13\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\xf5\x36\xa1\x7a\x9b\x50\xbd\x4d\xa8\xde\x26\x54\x6f\x13\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\xf5\x36\xa1\x7a\x9b\x50\xbd\x4d\xa8\xde\x26\x54\x6f\x13\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\xf5\x36\xa1\x7a\x9b\x50\xbd\x4d\xa8\xde\x26\x54\x6f\x13\xaa\xb7\x09\xd5\xdb\x84\xea\x6d\x42\x6d\x7e\xa1\x36\xbf\x50\x9b\x5f\xa8\xcd\x2f\xd4\xe6\x17\x6a\xf3\x0b\xb5\xf9\x85\xda\xfc\x42\x6d\x7e\xa1\x36\xbf\x50\x9b\x5f\xa8\xcd\x2f\xd4\xe6\x17\x6a\xf3\x0b\xb5\xf9\x85\xda\xfc\x42\x6d\x7e\xa1\x36\xbf\x50\x9b\x5f\xa8\xcd\x2f\xd4\xe6\x17\x6a\xf3\x0b\xb5\xf9\x85\xda\xfc\x42\x6d\x7e\xa1\x36\xbf\x50\x8d\x4e\xa8\x46\x27\x54\xa3\x13\xaa\xd1\x09\xd5\xe8\x84\x6a\x74\x42\x35\x3a\xa1\x1a\x9d\x50\x8d\x4e\xa8\x46\x27\x54\xa3\x13\xaa\xd1\x09\xd5\xe8\x84\x6a\x74\x62\x0c\x7b\x07\xff\x53\x8d\x4e\xa8\x46\x27\x54\xa3\x13\xaa\xd1\x09\xd5\xe8\x84\x6a\x74\x42\x35\x3a\xa1\x1a\x9d\x50\x8d\x4e\xa8\xcd\x2f\xd4\xe6\x17\x6a\xf3\x0b\xb5\xf9\x85\xda\xfc\x42\x6d\x7e\xa1\x36\xbf\x50\x9b\x5f\xa8\xcd\x2f\xd4\xe6\x17\x6a\xf3\x0b\xb5\xf9\x85\xda\xfc\x42\x6d\x7e\xa1\x36\xbf\x50\x9b\x5f\xa8\xcd\x2f\xd4\xe6\x17\x6a\xf3\x0b\xb5\xf9\x85\xda\xfc\x42\x6d\x7e\xa1\x36\xbf\x50\x9b\x5f\xa8\xcd\x2f\xd4\xe6\x17\x6a\xe7\x09\xb5\xf3\x84\xda\x79\x42\xed\x3c\xa1\x76\x9e\x50\x3b\x4f\xa8\x9d\x27\xd4\xce\x13\x6a\xf3\x0b\xb5\xf9\x85\xd2\x79\x42\xe9\x3c\xa1\x36\xbf\x50\x9b\x5f\xa8\x9c\x27\x54\xce\x13\x6a\xf3\x8b\xe0\x7f\x0a\xe7\x09\x85\xf3\x44\xf0\xbf\xe0\x7f\xea\xe6\x09\x75\xf3\x44\xf0\xbf\xe0\x7f\xca\xe6\x09\x65\xf3\x84\xb2\x79\x42\xd9\x3c\xa1\x6c\x9e\x50\x36\x4f\x04\xff\x0b\xfe\xa7\x6a\x9e\x50\x35\x4f\xa8\x9a\x27\x54\xcd\x13\xaa\xe6\x09\x55\xf3\x44\xf0\xbf\xe0\x7f\x8a\xe6\x09\x45\xf3\x84\xa2\x79\x42\xd1\x3c\xa1\x68\x9e\x50\x34\x4f\xa8\xed\x25\x82\xff\xa9\x99\x27\xd4\xcc\x13\x6a\xe6\x09\x35\xf3\x84\x9a\x79\x42\xcd\x3c\x11\xfc\x2f\xf8\x9f\x92\x79\x42\xc9\x3c\xa1\x64\x9e\x50\x32\x4f\x28\x99\x27\x94\xcc\x13\x4a\xe6\x09\x25\xf3\x84\x92\x79\x42\xc9\x3c\xa1\x64\x9e\x50\x32\x4f\x28\x99\x27\x94\xcc\x13\xc1\xff\x82\xff\x05\xff\x0b\xfe\x17\xfc\x2f\xf8\x5f\xf0\xbf\xe0\x7f\xc1\xff\x82\xff\x05\xff\x0b\xfe\x17\xfc\x2f\xf8\x5f\xf0\xbf\xe0\x7f\xc1\xff\x82\xff\x05\xff\x0b\xfe\x17\xfc\x2f\xf8\x5f\xf0\xbf\xe0\x7f\xc1\xff\x82\xff\x05\xff\x0b\xfe\x17\xfc\x2f\xf8\x5f\xf0\xbf\xe0\x7f\xc1\xff\x82\xff\xa9\x9a\x27\x54\xcd\x13\xaa\xe6\x09\x55\xf3\x84\xaa\x79\x42\xd5\x3c\xa1\x6a\x9e\x50\x35\x4f\x04\xff\x0b\xfe\x17\xfc\x2f\xf8\x5f\xf0\xbf\xe0\x7f\xc1\xff\x82\xff\x05\xff\x0b\xfe\x17\xfc\x2f\xf8\x9f\xaa\x7c\x42\x55\x3e\x11\xfc\x2f\xf8\x9f\xaa\x7c\x42\x55\x3e\x11\xfc\x2f\xf8\x9f\xba\x7c\x42\x5d\x3e\x11\xfc\x2f\xf8\x9f\xba\x7c\x42\x5d\x3e\x11\xfc\x2f\xf8\x5f\xf0\xbf\xe0\x7f\xc1\xff\x54\xea\x13\xc1\xff\x82\xff\x05\xff\x0b\xfe\x17\xfc\x2f\xff\x8f\xa7\x7b\x47\x96\x18\x49\x8c\x20\x78\xa7\xe5\x56\x24\x5a\xc4\x67\xe6\xfe\x47\xa2\x40\x7f\x14\x5b\x82\xb5\x14\x06\x58\x55\xba\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1b\x00\x3c\x06\x00\x8f\x01\xc0\x63\x00\xf0\x18\x00\x3c\x06\x00\xcf\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x96\x03\xcf\xd1\xff\xa3\xff\x96\x04\xcf\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x6f\x69\xf0\x1c\xfd\x3f\xfa\x6f\x79\xf0\x58\x1e\x3c\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x6f\x99\xf0\x58\x26\x3c\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\xb6\x0b\x8f\xed\xc2\x73\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x6f\x3b\xf1\xd8\x4e\x3c\xb6\x13\xcf\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x86\x17\xcf\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x6f\x20\xf2\x18\x88\x3c\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\x1b\x96\x3c\x86\x25\x4f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\xbf\xe1\xca\x93\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\xbf\x71\xd1\x63\x5c\xf4\x18\x17\x3d\xc6\x45\x8f\x71\xd1\x63\x5c\xf4\x18\x17\x3d\xc6\x45\x8f\x71\xd1\x63\x5c\xf4\x18\x17\x3d\xe9\x7f\xfa\x6f\x5e\xf4\xa4\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\x36\x46\x8f\x8d\xd1\x93\xfe\xa7\xff\xe9\xbf\x9d\xd1\x63\x67\xf4\xa4\xff\xf6\x46\x4f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\xbf\xbd\xd3\x63\xef\xf4\xd8\x3b\x3d\xf6\x4e\x8f\xbd\xd3\x63\xef\xf4\xa4\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\x7f\xfa\x9f\xfe\xa7\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\xb7\xab\x7c\xec\x2a\x1f\xbb\xca\xc7\xae\xf2\x99\xfe\xdb\x57\x3e\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\xdb\x73\x3e\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\xd3\xff\xe9\xff\xf4\x7f\xfa\x3f\xfd\x9f\xfe\x4f\xff\xa7\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x97\xfe\x5f\xfa\x7f\xe9\xff\xa5\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\x07\x8c\x9f\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xb7\x93\x7c\x7e\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xef\x7e\xc9\x4f\xff\x7f\xfa\xff\xd3\x7f\x7b\xd6\xe7\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xfd\x5f\xff\xff\xfd\x5d\x7f\xbf\x3d\x5f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\xbf\xf3\x9e\xff\xff\x3c\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x7f\xf7\xee\x7e\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xbf\x7d\xe6\xf3\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xef\xdc\xf9\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xf6\xfe\x7f\x7b\xff\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\xe7\x01\x9f\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\x7f\x5e\xfb\xf9\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\x7f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xf9\x47\xff\xf9\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\xe7\x1f\xfd\xe7\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xbf\x7f\xe7\xe5\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\x87\xff\x7f\xf8\xff\xe7\x1f\xfd\xe7\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x1f\xfe\xff\xe1\xff\x9f\x7f\xfe\xfe\x8f\xfe\xf3\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\xff\xf0\xff\x0f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xfd\x47\xff\xf9\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xf7\x3f\xfa\xcf\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xfb\xaf\xfe\xf3\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xf7\x5f\xfd\xe7\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xff\xfb\xfb\xeb\xb2\xfe\xf3\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\xef\xef\x3b\x03\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\xbf\x9f\xfe\xf3\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\x67\xcf\x38\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xaf\xfe\xbf\xfa\xff\xea\xff\xab\xff\xaf\xfe\xbf\xfa\xff\xea\xff\xab\xff\xaf\xfe\xbf\xfa\xff\xea\xff\xab\xff\xaf\xfe\xbf\xfa\xff\xea\xff\xab\xff\xaf\xfe\xbf\xfa\xff\xea\xff\xab\xff\xaf\xfe\xbf\xfa\xff\xea\xff\xab\xff\xaf\xfe\xbf\xfa\xff\xea\xff\xab\xff\xaf\xfe\xbf\xfa\xff\xea\xff\xab\xff\xaf\xfe\xf3\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\xef\x1f\xfd\xe7\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xfe\xa3\xff\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xff\x97\xa6\x3b\x36\x8e\x75\x57\x93\x20\xe8\xd2\x8d\x25\x39\x5d\x9f\x48\xfe\xe4\xf8\x6f\xd2\x0a\x2f\x8f\x05\x25\x00\x11\x2d\x01\x39\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\xbf\x97\xfd\xe7\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\x1e\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xec\xff\x63\xff\x1f\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xec\xff\x63\xff\x1f\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xec\xff\x63\xff\x1f\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xec\xff\x63\xff\x1f\xfb\xcf\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf8\xff\x6f\xef\xcc\xe2\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\xef\xbf\x7f\xe7\xf2\xa1\xff\xa1\xff\xa1\xff\xa1\xff\xa1\xff\xa1\xff\xa1\xff\xa1\xff\xa1\xff\xa1\xff\xa1\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa9\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xa5\xff\xd2\x7f\xe9\xbf\xf4\x5f\xfa\x2f\xfd\x97\xfe\x4b\xff\xa5\xff\xd2\x7f\xe9\xbf\xf4\x5f\xfa\x2f\xfd\x97\xfe\x4b\xff\xa5\x3f\xfd\xe9\x4f\x7f\xfa\xd3\x9f\xfe\xf4\xa7\x3f\xfd\xe9\x4f\x7f\xfa\xd3\x9f\xfe\xf4\xa7\x9f\x7e\xfa\xe9\xa7\x9f\x7e\xfa\xe9\xa7\x9f\x7e\xfa\xe9\xa7\x9f\x7e\xfa\xe9\xa7\x7f\xfa\xa7\x7f\xfa\xa7\x7f\xfa\xa7\x7f\xfa\xa7\x7f\xfa\xa7\x7f\xfa\xa7\x7f\xfa\xa7\x7f\xfa\xa7\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xad\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xa3\xff\xe8\x3f\xfa\x8f\xfe\xa3\xff\xe8\x3f\xfa\x8f\xfe\xa3\xff\xe8\x3f\xfa\x8f\xfe\xa3\xff\xe8\x3f\xfa\x8f\xfe\xa3\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xab\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xa7\xff\xd6\x7f\xeb\xbf\xf5\xdf\xfa\x6f\xfd\xb7\xfe\x5b\xff\xad\xff\xd6\x7f\xeb\xbf\xf5\xdf\xfa\x6f\xfd\xb7\xfe\x5b\xdf\xfe\xf3\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\xdf\xbf\x7f\x99\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xf7\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xec\xff\x63\xff\x1f\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xec\xff\x63\xff\x1f\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xec\xff\x63\xff\x1f\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xec\xff\x63\xff\x1f\xfb\xff\xd8\x7f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x7f\xfc\xff\xfb\xef\x7f\xfb\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x7f\xdf\xbf\x7b\x68\xff\xf9\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xfb\x3f\xfb\xcf\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\xff\x7f\x9a\xee\xdd\x86\xce\x1d\x09\xc2\x60\x4a\xf7\x7f\xb3\xcd\x69\x4a\x27\xff\x90\xd6\x50\x6d\x04\x63\x7e\x20\x1a\x44\x85\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x9f\xff\xff\xbb\xe6\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x67\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\x3f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\xcf\xfe\x7f\x1f\xb6\xfb\xdb\xfd\xed\xfe\x76\x7f\xbb\xbf\xdd\xdf\xee\x6f\xf7\xb7\xfb\xdb\xfd\xed\xfe\x76\xff\x8f\xfb\x7f\xdc\xff\xe3\xfe\x1f\xf7\xff\xb8\xff\xc7\xfd\x3f\xee\xff\x71\xff\x8f\xfb\x7f\xdc\xff\xe3\xfe\x1f\xf7\xff\xb8\xff\xc7\xfd\x3f\xee\xff\x71\xff\xaf\xfb\x7f\xdd\xff\xeb\xfe\x5f\xf7\xff\xba\xff\xd7\xfd\xbf\xee\xff\x75\xff\xaf\xfb\x7f\xdd\xff\xeb\xfe\x5f\xf7\xff\xba\xff\xd7\xfd\xbf\xee\xff\x75\xff\xe7\xfe\xcf\xfd\x9f\xfb\x3f\xf7\x7f\xee\xff\xdc\xff\xb9\xff\x73\xff\xe7\xfe\xcf\xfd\x9f\xfb\x3f\xf7\x7f\xee\xff\xdc\xff\xb9\xff\xef\x7d\x38\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xec\xc3\x63\x1f\x1e\xfb\xf0\xd8\x87\xc7\x3e\x3c\xf6\xe1\xb1\x0f\x8f\x7d\x78\xfe\xbf\x0f\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xfd\xeb\x7f\xff\xfb\xd7\xff\xfe\xf7\xaf\xff\xfd\xef\x5f\xff\xfb\xdf\xbf\xfe\xf7\xbf\x7f\xfd\xef\x7f\xff\xfa\xdf\xff\xfe\xf5\xbf\xff\xfd\xeb\x7f\xff\xfb\xd7\xff\xfe\xf7\xaf\xff\xfd\xef\x5f\xff\xfb\xdf\xbf\xfe\xf7\xbf\x7f\xfd\xef\x7f\xff\xfa\xdf\xff\xfe\xf5\xbf\xff\xfd\xe7\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe1\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe9\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xed\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xe3\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xeb\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\xe7\xfe\x72\x7f\xb9\xbf\xdc\x5f\xee\x2f\xf7\x97\xfb\xcb\xfd\xe5\xfe\x72\x7f\xb9\xbf\xdc\x5f\xee\x2f\xf7\x97\xfb\xcb\xfd\xe5\x7e\xdc\x8f\xfb\x71\x3f\xee\xc7\xfd\xb8\x1f\xf7\xe3\x7e\xdc\x8f\xfb\x71\x3f\xee\xc7\xfd\xb8\x1f\xf7\xe3\xfe\xb8\x3f\xee\x8f\xfb\xe3\xfe\xb8\x3f\xee\x8f\xfb\xe3\xfe\xb8\x3f\xee\x8f\xfb\xe3\xfe\xb8\x3f\xee\x8f\xfb\xe3\x7e\xdd\xaf\xfb\x75\xbf\xee\xd7\xfd\xba\x5f\xf7\xeb\x7e\xdd\xaf\xfb\x75\xbf\xee\xd7\xfd\xba\x5f\xf7\xeb\xfe\x76\x7f\xbb\xbf\xdd\xdf\xee\x6f\xf7\xb7\xfb\xdb\xfd\xed\xfe\x76\x7f\xbb\xbf\xdd\xdf\xee\x6f\xf7\xb7\xfb\xdb\xfd\xed\xfe\x1f\xf7\xff\xb8\xff\xc7\xfd\x3f\xee\xff\x71\xff\x8f\xfb\x7f\xdc\xff\xe3\xfe\x1f\xf7\xff\xb8\xff\xc7\xfd\x3f\xee\xff\x71\xff\x8f\xfb\x7f\xdc\xff\xe3\xfe\x5f\xf7\xff\xba\xff\xd7\xfd\xbf\xee\xff\x75\xff\xaf\xfb\x7f\xdd\xff\xeb\xfe\x5f\xf7\xff\xba\xff\xd7\xfd\xbf\xee\xff\x75\xff\xaf\xfb\x7f\xdd\xff\xeb\xfe\xcf\xfd\x9f\xfb\x3f\xf7\x7f\xee\xff\xdc\xff\xb9\xff\x73\xff\xe7\xfe\xcf\xfd\x9f\xfb\x3f\xf7\x7f\xee\xff\xdc\xff\xb9\xff\x73\x5f\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x0f\xfd\x3f\xf4\xff\xd0\xff\x43\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x4f\xfd\x3f\xf5\xff\xd4\xff\x53\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\xa3\xff\xd1\xff\xe8\x7f\xf4\x3f\xfa\x1f\xfd\x8f\xfe\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\x47\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xab\xff\xd5\xff\xea\x7f\xf5\xbf\xfa\x5f\xfd\xaf\xfe\x57\xff\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\x97\xff\x5f\xfe\x7f\xf9\xff\xe5\xff\xf7\xa7\xff\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xf2\xff\xcb\xff\x2f\xff\xbf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xcd\xff\xdf\xfc\xff\xff\x71\x75\x3f\x3b\xb4\x9d\xd7\x95\xdd\x7b\x85\x24\x55\x0e\xaa\x92\xe7\x08\xb0\xf7\xf9\xb7\xd6\x6d\x92\x63\xde\xaf\x95\x6e\x1e\x80\x45\x53\x32\x13\x49\x0c\x28\x4a\x70\xf2\xf4\x05\x4b\x43\x77\x1a\x6e\xe9\xf0\x4a\xd4\x02\xd5\x98\xdb\x06\x06\xbe\x1f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xa3\xff\x8f\xfe\x3f\xfa\xff\xe8\xff\xb3\x7e\xff\xd7\xef\xff\xfa\xfd\x5f\xbf\xff\xeb\xf7\x7f\xfd\xfe\xaf\xdf\xff\xf5\xfb\xbf\x7e\xff\xd7\xef\xff\xfa\xfd\x5f\xbf\xff\xeb\xf7\x7f\xfd\xfe\xaf\xdf\xff\xf5\xfb\xbf\x7e\xff\xd7\xef\xff\xfa\xfd\x5f\xbf\xff\xeb\xf7\x7f\xfd\xfe\xaf\xdf\xff\xf5\xfb\xbf\x7e\xff\xd7\xef\xff\xfa\xfd\x5f\xbf\xff\xeb\xf7\x7f\xfd\xfe\xaf\xdf\xff\xf5\xfb\xbf\x7e\xff\xf5\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\xa3\xff\x1f\xfd\xff\xe8\xff\x47\xff\x3f\xfa\xff\xd1\xff\x8f\xfe\x7f\xf4\xff\x8f\x3e\xea\xd1\x45\x3d\xba\xa8\x47\x17\xf5\xe8\xa2\x1e\x5d\xd4\xa3\x8b\x7a\x74\x51\x8f\x2e\xea\xd1\x45\x3d\xba\xa8\x47\x17\xf5\xe8\xa2\x1e\x5d\xd4\xa3\x8b\x7a\x74\x51\x8f\x2e\xea\xd1\x45\x3d\xba\xa8\x47\x17\xf5\xe8\xa2\x1e\x5d\xd4\xa3\x8b\x7a\x74\x51\x8f\x2e\xea\xd1\x45\x3d\xba\xa8\x47\x17\xf5\xe8\xa2\x1e\x5d\xd4\xa3\x8b\x7a\x74\x51\x8f\x2e\xea\xd1\x45\x3d\xba\xa8\x47\x17\xf5\xe8\xa2\x1e\x5d\xd4\xa3\x8b\x7a\x74\x51\x8f\x2e\xea\xd1\x45\x3d\xba\xa8\x47\x17\xf5\xe8\xa2\x1e\x5d\xd4\xa3\x8b\x7a\x74\x51\x8f\x2e\xea\xd1\x45\x3d\xba\xa8\x47\x0f\xf5\xe8\xa1\x1e\x3d\xd4\xa3\x87\x7a\xf4\x50\x8f\x1e\xea\xd1\x43\x3d\x7a\xa8\x47\x0f\xf5\xe8\xa1\x1e\x3d\xd4\xa3\x87\x7a\xf4\x50\x8f\x1e\xea\xd1\x43\x3d\x7a\xa8\x47\x0f\xf5\xe8\xa1\x1e\x3d\xd4\xa3\x87\x7a\xf4\x50\x8f\x1e\xea\xd1\x43\x3d\x7a\xa8\x47\x0f\xf5\xe8\xa1\x1e\x3d\xd4\xa3\x87\x7a\xf4\x50\x8f\x1e\xea\xd1\x43\x3d\x7a\xa8\x47\x0f\xf5\xe8\xa1\x1e\x3d\xd4\xa3\x87\x7a\xf4\x50\x8f\x1e\xea\xd1\x43\x3d\x7a\xa8\x47\x0f\xf5\xe8\xa0\x1e\x1d\xd4\xa3\x83\x7a\x74\x50\x8f\xfe\xe9\xd1\x3f\x3d\xfa\xa7\x47\xf7\xf4\xe8\x9e\x1e\xdd\xd3\xa3\x7b\x7a\x74\x4f\x8f\xee\xe9\xd1\x3d\x3d\xba\xa7\x47\xf7\xf4\xe8\x9e\x1e\xdd\xd3\xa3\x7b\x7a\x74\x4f\x8f\xee\xe9\xd1\x3d\x3d\xba\xa7\x47\xf7\xf4\xe8\x9e\x1e\xdd\xd3\xa3\x7b\x7a\x74\x4f\x8f\xee\xe9\xd1\x3b\x3d\xfa\xa6\x47\xdf\xf4\xe8\x9b\x1e\x7d\xd3\xa3\x6f\x7a\xf4\x4d\x8f\xbe\xe9\xd1\x37\x3d\xba\xa6\x47\xd7\xf4\xe8\x9a\x1e\x3d\xd3\xa3\x67\x7a\xf4\x4c\x8f\x9e\xe9\xd1\x33\x3d\x7a\xa6\x47\xcf\xf4\xe8\x99\x1e\x3d\xd3\xa3\x67\x7a\xf4\x4c\x8f\x9e\xe9\xd1\x33\x3d\x7a\xa6\x47\xcf\xf4\xe8\x99\x1e\x3d\xd3\xa3\x67\x7a\xf4\x4c\x8f\x9e\xe9\xf9\xf2\x8f\x3d\xfb\xce\xfb\xdf\x79\xff\x3b\xef\x7f\xe7\xfd\xef\xbc\xff\x9d\xf7\xbf\xf3\xfe\x77\xde\xff\xce\xfb\xdf\x79\xff\x3b\xef\x7f\xe7\xfd\xef\xbd\xff\xbd\xf7\xbf\xf7\xfe\xf7\xde\xff\xde\xfb\xdf\x7b\xff\x7b\xef\x7f\xef\xfd\xef\xbd\xff\xbd\xf7\xbf\xf7\xee\xf7\xde\xfd\xde\xbb\xdf\x7b\xf7\x7b\xef\xe2\x5d\xbc\x8b\x77\xf1\x2e\xde\xc5\xbb\x78\x17\xef\xe2\x5d\xbc\x8b\xff\xdc\x78\x1f\xef\xe3\x7d\xbc\x8f\xf7\xe3\xfd\x78\x3f\xde\x8f\xf7\xe3\xfd\x78\x3f\xde\x8f\xf7\xe3\xfd\x78\x3f\xde\x8f\xf7\xe3\xfd\x78\x3f\xde\xfd\xea\xdd\xaf\xde\xfd\xea\xdd\xaf\xde\xfd\xea\xdd\xaf\xde\xfd\xea\xdd\xaf\xde\xfd\xea\xdd\xaf\xde\xfd\xea\xdd\xaf\xde\xfd\xea\xdd\xaf\xde\xfd\xea\x3f\xf7\x57\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\x1f\xef\xff\xfd\xff\x7f\x39\xfa\xa5\x47\xbf\xf4\xe8\x97\x1e\xfd\xd2\xa3\x5f\x7a\xf4\x4b\x8f\x7e\xe9\xd1\x2f\x3d\xfa\xa5\x47\xbf\xf4\xe8\x97\x1e\xfd\xd2\xa3\x5f\x7a\xf4\x4b\x8f\x7e\xe9\xd1\x2f\x3d\xfa\xa5\x47\xbf\xf4\xe8\x97\x1e\xfd\xd2\xa3\x5f\x7a\xf4\x4b\x8f\x7e\xe9\xd1\x2f\x3d\xfa\xa5\x47\xbf\xf4\xe8\x97\x1e\xfd\xd2\xa3\x5f\x7a\xf4\x4b\x8f\x7e\xe9\xd1\x2f\x3d\xfa\xa5\x47\xbf\xf4\xe8\x97\x1e\xfd\xd2\xa3\x5f\x7a\xf4\x4b\x8f\x7e\xe9\xd1\x2f\x3d\xfa\xa5\x47\xbf\xf4\xe8\x97\x1e\xfd\xd2\xa3\x5f\x7a\xf4\x4b\x8f\x4e\xdc\xd1\x89\x3b\x3a\x71\x47\x27\xee\xf8\x9e\xe9\xf1\x3d\xd3\xe3\x3b\xa6\xc7\x77\x4c\x8f\xef\x98\x1e\xdf\x31\x3d\xbe\x63\x7a\x7c\xc7\xf4\xf8\x8e\xe9\xf1\x1d\xd3\xe3\x3b\xa6\xc7\x77\x4c\x8f\xef\x98\x1e\xdf\x31\x3d\xbe\x63\x7a\x7c\xc7\xf4\xf8\x8e\xe9\xf1\x1d\xd3\xe3\x3b\xa6\xc7\x77\x4c\x8f\xef\x94\x1e\xdf\x29\x3d\xbe\x53\x7a\x7c\xa7\xf4\xf8\x4e\xe9\xf1\x9d\xd2\xe3\x3b\xa5\xc7\x77\x4a\x8f\xef\x94\x1e\xdf\x29\x3d\xbe\x4f\x7a\x7c\x9f\xf4\xf8\x3e\xe9\xf1\x7d\xd2\xe3\xbb\xa4\xc7\x77\x49\x8f\xef\x92\x1e\xdf\x25\x3d\xbe\x4b\x7a\x7c\x97\xf4\xf8\x2e\xe9\xf1\x5d\xd2\xe3\xbb\xa4\xc7\x77\x49\x8f\xef\x92\x1e\xdf\x25\x3d\xbe\x4b\x7a\x7c\x97\xf4\xf8\x1e\xe9\xf1\x3d\xd2\xe3\x7b\xa4\xc7\xf7\x48\x8f\xef\xfe\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfe\x8e\xef\xfd\x1d\xdf\xfb\x3b\xbe\xf7\x77\x7c\xef\xef\xf8\xde\xdf\xf1\xbd\xbf\xe3\x7b\x7f\xc7\xf7\xfd\x8e\xef\xfb\x1d\xdf\xf7\x3b\xbe\xef\x77\x7c\xdf\xef\xf8\xbe\xdf\xf1\x7d\xbf\xe3\xfb\x7e\xc7\xf7\xfd\x8e\xef\xfb\x1d\xdf\xf7\x3b\xbe\xef\x77\x7c\xdf\xef\xf8\xbe\xdf\xf1\x7d\xbf\xe3\xfb\x7e\xc7\xf7\xfd\x8e\xef\xfb\x1d\xdf\xf7\x3b\xbe\xef\x77\x7c\xdf\xef\xf8\xbe\xdf\xf1\x7d\xbf\x73\xfc\xbf\x73\x7d\xdf\xef\xf8\xbe\xdf\xf1\x7d\xbf\xe3\xfb\x7e\xc7\xf7\xfd\x8e\xef\xfb\x1d\xdf\xf7\x3b\xbe\xef\x77\x7c\xdf\xef\xf8\xbe\xdf\xf1\x7d\xbf\xe3\xfb\x7e\xc7\xf7\xfd\x8e\xef\xfb\x1d\xdf\xf7\x3b\xbe\xef\x77\x7c\xdf\xef\xf8\xbe\xdf\xf1\x7d\xbf\xe3\xfb\x7e\xc7\xf7\xfd\x8e\xef\xfb\x1d\xdf\xf7\x3b\xbe\xef\x77\x7c\xdf\xef\xf8\xbe\xdf\xf1\x7d\xbf\xe3\xfb\x7e\xc7\xf7\xfd\x8e\xef\xfb\x1d\xdf\xf7\x3b\xbe\xef\x77\x7c\xdf\xef\xf8\xbe\xdf\xf1\x7d\xbf\xe3\xfb\x7e\xc7\xf7\xfd\x8e\xef\xfb\x1d\xdf\xf7\x3b\xbe\xef\x76\x7c\xdf\xed\xf8\xbe\xdb\xf1\x7d\xb7\xe3\xfb\x6e\xc7\xf7\xdd\x8e\xef\xbb\x1d\xdf\x4d\x3b\xe7\xe4\x3f\xfd\xe5\xbe\x5e\xd7\xf5\xb7\x7f\x79\xec\xdf\xfe\xe5\xf5\xf7\x3f\x7c\x7d\xfd\xfb\xbf\x9c\xff\xf4\x97\x3b\xcf\x8b\x7f\xfa\xf1\xff\xfb\xf5\xe7\x3f\xfc\xe1\xe7\x1f\xff\xfb\xaf\x3f\xfd\xf5\xa7\xff\xe9\x9f\x7f\xf9\xed\x0f\x3f\xfd\xf9\xcf\xff\xf7\x7f\xfd\xf1\x87\x5f\x7f\xf9\xd3\x8f\xbf\xfc\xf1\x8f\x3f\xfc\xf0\xe3\x8f\x3f\xfd\xe9\xb7\xff\xfc\xef\x7e\xff\xb7\x7f\xf7\xfb\xd7\x5f\x7e\xfb\xe1\xb7\x9f\xfe\xcb\xff\xff\xd3\xaf\xbf\xfc\xf9\x2f\xff\xef\x4f\xbf\xfe\xfc\xcb\xaf\xff\xe5\x77\xbf\xfc\xe5\xd7\xfe\xc5\xcf\x7f\xfd\xe9\x1f\x7f\xf1\x9f\xff\xfc\xf3\xbf\xfe\xe3\xf7\x3f\xfd\xf9\xa7\xbf\xfe\xf4\xa7\x6f\x7f\xf5\xd3\xcf\xbf\xff\x97\xdf\xbe\xfd\x4d\x7f\xfa\xf9\x4f\xdf\xfe\xa6\xff\xf9\x9f\x7f\xf8\xf3\xcf\x3f\xfc\xf2\xaf\x3f\xff\xf0\xbf\xff\xf8\xf3\xaf\x3f\xfe\xe5\x8f\xbf\xfb\xc3\x4f\xff\xfa\xc3\x8f\x7f\xf9\xed\xa7\x1f\x7f\xf9\xe3\x7f\xff\x77\x7f\xf6\xfb\x5f\x7f\xf8\xeb\xdf\xfe\xec\x7f\xeb\x9f\xfd\xcb\x2f\xbf\xfc\x3f\xff\xe1\x3f\xf6\xdb\xcf\x7f\xf8\xe7\xbf\xfd\xc7\xfe\xd7\xbf\xfd\x23\x7f\xfb\x6f\xfa\xfb\x5f\x7e\xfb\x2f\xf9\xa7\xbf\xfd\xe5\x3f\xfe\xfe\xbf\xff\x9b\xdf\xfe\xd6\xff\xfa\x8f\xff\xd5\xfe\xed\xdf\xff\xc3\x4f\xbf\xfb\xed\xbf\x7d\xfb\x9f\xf1\xe7\xdf\xff\xdb\x9f\xfd\x5f\xfc\xc7\x3f\xf9\x3f\xf9\x5f\x7e\xff\xeb\x4f\xbf\xfb\x3f\xe6\xcb\xfb\xfd\xea\xcf\x67\x7f\x3e\xfa\xf3\xee\xcf\xeb\xdb\xcf\xd7\x97\xfe\xdc\xfe\x9c\xfe\xfc\xf4\xe7\xbb\x3f\x7b\xed\xd5\x6b\xaf\x5e\x7b\xf5\xda\xab\xd7\x9e\xbd\xf6\xec\xb5\x67\xaf\x3d\x7b\xed\xd9\x6b\xcf\x5e\x7b\xf6\xda\xb3\xd7\x9e\xbd\xf6\xec\xb5\x47\xaf\x3d\x7a\xed\xd1\x6b\x8f\x5e\x7b\xf4\xda\xa3\xd7\x1e\xbd\xf6\xe8\xb5\x47\xaf\x3d\x7a\xed\xee\xb5\xbb\xd7\xee\x5e\xbb\x7b\xed\xee\xb5\xbb\xd7\xee\x5e\xbb\x7b\xed\xee\xb5\xbb\xd7\xae\x5e\xbb\x7a\xed\xea\xb5\xab\xd7\xae\x5e\xbb\x7a\xed\xea\xb5\xab\xd7\xae\x5e\xbb\xbe\x5d\x7b\x7d\xf9\xd2\x9f\xdb\x9f\xd3\x9f\x9f\xfe\x7c\xf7\xe7\xab\x3f\x9f\xfd\xf9\xe8\xcf\xbb\x3f\x7b\x6d\x7b\x6d\x7b\x6d\x7b\x6d\x7b\x6d\x7b\x6d\x7b\x6d\x7b\x6d\x7b\x6d\x7b\x6d\x7b\x6d\x7a\x6d\x7a\x6d\x7a\x6d\x7a\x6d\x7a\x6d\x7a\x6d\x7a\x6d\x7a\x6d\x7a\x6d\x7a\xed\xd3\x6b\x9f\x5e\xfb\xf4\xda\xa7\xd7\x3e\xbd\xf6\xe9\xb5\x4f\xaf\x7d\x7a\xed\xd3\x6b\x9f\x5e\x7b\xf7\xda\xbb\xd7\xde\xbd\xf6\xee\xb5\x77\xaf\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd5\x2d\x79\x75\x4b\x5e\xdd\x92\x57\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd9\x2d\x79\x76\x4b\x9e\xdd\x92\x67\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xd1\x2d\x79\x74\x4b\x1e\xdd\x92\x47\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xee\x6e\xc9\xdd\x2d\xb9\xbb\x25\x77\xb7\xe4\xee\x96\xdc\xdd\x92\xbb\x5b\x72\x77\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\x57\xb7\xe4\xea\x96\x5c\xdd\x92\xab\x5b\x72\x75\x4b\xae\x6e\xc9\xd5\x2d\xb9\xba\x25\xd7\xb7\x2d\xd9\x2f\xdf\xb6\x64\xbf\x7c\xdb\x92\xfd\xf2\x6d\x4b\xf6\xcb\xb7\x2d\xd9\x2f\xdf\xb6\x64\xbf\x7c\xdb\x92\xfd\xf2\x6d\x4b\xf6\xcb\xb7\x2d\xd9\x2f\xdf\xb6\x64\xbf\x7c\xe9\xb5\xed\xb5\xed\xb5\xed\xb5\xed\xb5\xed\xb5\xed\xb5\xed\xb5\xed\xb5\xed\xb5\xed\xb5\xe9\xb5\xe9\xb5\xe9\xb5\xe9\xb5\xe9\xb5\xe9\xb5\xe9\xb5\xe9\xb5\xe9\xb5\xe9\xb5\x4f\xaf\x7d\x7a\xed\xd3\x6b\x9f\x5e\xfb\xf4\xda\xa7\xd7\x3e\xbd\xf6\xe9\xb5\x4f\xaf\x7d\x7a\xed\xdd\x6b\xef\x5e\x7b\xf7\xda\xbb\xd7\xde\xbd\xf6\xee\xb5\x77\xaf\xbd\x7b\xed\xdd\x6b\xef\x5e\x7b\xf5\xda\xab\xd7\x5e\xbd\xf6\xea\xb5\x57\xaf\xbd\x7a\xed\xd5\x6b\xaf\x5e\x7b\xf5\xda\xab\xd7\x9e\xbd\xf6\xec\xb5\x67\xaf\x3d\x7b\xed\xd9\x6b\xcf\x5e\x7b\xf6\xda\xb3\xd7\x9e\xbd\xf6\xec\xb5\x47\xaf\x3d\x7a\xed\xd1\x6b\x8f\x5e\x7b\xf4\xda\xa3\xd7\x1e\xbd\xf6\xe8\xb5\x47\xaf\x3d\x7a\xed\xee\xb5\xbb\xd7\xee\x5e\xbb\x7b\xed\xee\xb5\xbb\xd7\xee\x5e\xbb\x7b\xed\xee\xb5\xbb\xd7\xae\x5e\xbb\x7a\xed\xea\xb5\xab\xd7\xae\x5e\xbb\x7a\xed\xea\xb5\xab\xd7\xae\x5e\xeb\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x76\x4b\xb6\x5b\xb2\xdd\x92\xed\x96\x6c\xb7\x64\xbb\x25\xdb\x2d\xd9\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x4c\xb7\x64\xba\x25\xd3\x2d\x99\x6e\xc9\x74\x4b\xa6\x5b\x32\xdd\x92\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\x7c\xba\x25\x9f\x6e\xc9\xa7\x5b\xf2\xe9\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xef\x6e\xc9\xbb\x5b\xf2\xee\x96\xbc\xbb\x25\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\xdd\x76\xaf\xdb\xee\x75\xdb\xbd\x6e\xbb\xd7\x6d\xf7\xba\xed\x5e\xb7\xdd\xeb\xb6\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xda\xbd\x4e\xbb\xd7\x69\xf7\x3a\xed\x5e\xa7\xdd\xeb\xb4\x7b\x9d\x76\xaf\xd3\xee\x75\xfe\x07\x91\xf6\x6a\x6d\x57\x14\xc5\x50\xac\xa5\xf5\xdf\x27\xfd\x37\x96\xf1\xc8\x15\x33\x33\x9b\x48\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\xf5\xb8\xd7\xe3\x5e\x8f\x7b\x3d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x8d\x9f\x7b\xbd\x7f\x3f\xf7\xfa\x37\x3f\xf3\x99\x67\xae\x39\x66\x9b\x65\xa6\xe9\xed\xf3\xf6\x79\xfb\xbc\x7d\xde\x3e\x6f\x9f\xb7\xcf\xdb\xe7\xed\xf3\xf6\x79\x7b\xde\x9e\xb7\xe7\xed\x79\x7b\xde\x9e\xb7\xe7\xed\x79\x7b\xde\x9e\xb7\xf3\x76\xde\xce\xdb\x79\x3b\x6f\xe7\xed\xbc\x9d\xb7\xf3\x76\xde\xd6\xdb\x7a\x5b\x6f\xeb\x6d\xbd\xad\xb7\xf5\xb6\xde\xd6\xdb\x7a\x1b\x6f\xe3\x6d\xbc\x8d\xb7\xf1\x36\xde\xc6\xdb\x78\x1b\x6f\xe3\xad\xbd\xb5\xb7\xf6\xd6\xde\xda\x5b\x7b\x6b\x6f\xed\xad\xbd\xb5\xb7\xf2\x56\xde\xca\x5b\x79\x2b\x6f\xe5\xad\xbc\x95\xb7\xf2\x56\xde\xd2\x5b\x7a\x4b\x6f\xe9\x2d\xbd\xa5\xb7\xf4\x96\xde\xd2\x5b\x7a\x0b\x6f\xe1\x2d\xbc\x85\xb7\xf0\x16\xde\xc2\x5b\x78\x0b\x6f\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xab\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xa3\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xad\x25\xfd\x9f\x9b\xbf\x8f\x91\xec\x3a\x0f\xfc\xfe\xee\xe9\xba\x67\x86\x33\x24\xa7\x49\x51\xf2\xec\xfa\xe7\xdf\xb4\x62\x08\x19\x60\x02\xeb\x56\x15\xcf\xf3\x3c\xb3\x8e\xc3\x9e\x97\x6e\x36\x29\xad\xd8\x26\x39\x56\x93\xb2\xc9\x69\xce\xf4\x4c\xb5\xd9\xd3\x5d\xea\x17\xb2\x48\x89\xcb\x32\xbd\x5a\x95\xed\xd5\xaa\x2d\xd8\xd2\x2c\xd7\x5e\xcd\x3a\x59\x44\x6b\x18\x20\x8d\x0d\xe8\xf9\xc3\xd8\xd0\x31\x02\xd3\x60\x84\x4c\xb0\x58\x60\x04\xac\x92\x09\x1c\x21\x72\x12\xd8\x84\x12\xc0\x8c\xb2\x09\x83\x7b\xee\xb9\xf7\x7b\x6e\x75\x0f\x65\x07\xc8\x3f\x61\xa1\x59\x75\x6f\xdd\x97\xf3\x9c\x7b\xee\x73\xce\xbd\xf7\x53\x43\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\xba\xe4\x92\x2e\xb9\xa4\x4b\x2e\xe9\x92\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\x3a\xe4\x92\x0e\xb9\xa4\x43\x2e\xe9\x90\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\xda\xe4\x92\x36\xb9\xa4\x4d\x2e\x69\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\x39\xb9\x24\x27\x97\xe4\xe4\x92\x9c\x5c\x92\x93\x4b\x72\x72\x49\x4e\x2e\xc9\xc9\x25\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc3\xbd\x1a\xee\xd5\x70\xaf\x86\x7b\x35\xdc\xab\xe1\x5e\x0d\xf7\x6a\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc5\xbd\x2a\xee\x55\x71\xaf\x8a\x7b\x55\xdc\xab\xe2\x5e\x15\xf7\xaa\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\xc1\xbd\x0a\xee\x55\x70\xaf\x82\x7b\x15\xdc\xab\xe0\x5e\x05\xf7\x2a\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\x8f\x7b\xf5\xb8\x57\xef\xbb\x7a\x78\xab\xbf\x7c\x71\xe5\xa7\xae\x6e\xac\x6f\x1c\x59\x19\x5c\x5c\x5b\xbe\x1a\x3e\xdf\xf3\xf9\x9d\x8d\xed\x95\x4b\xcf\xad\x85\xa9\xa3\xeb\x3b\x57\x9f\x5b\xd9\xdc\x5a\xbd\xb2\x5e\x2e\x79\x69\x63\x6d\x6d\x79\x33\x7c\xbe\xbb\xbf\xb2\x79\x71\x65\x7d\x3b\x4c\xdc\xbb\x7c\xb5\xbf\xb2\xb9\xb5\xbc\x7e\x29\x4c\x4e\x87\xad\x6c\xad\xae\x5f\x59\x2b\x77\x71\x6f\x7f\x79\x73\x65\x7d\x6d\xe5\x72\xb9\xf8\xd1\x30\xb9\xb9\x7a\xa5\x57\x4e\xdf\xb3\xbc\xb5\xbd\xb2\xb9\xba\xf5\x7c\x98\xba\xab\xbf\xb6\xb3\x15\x3e\x1d\xbe\xb8\x71\xf5\xea\x72\xb9\xeb\xde\x4b\xfd\xde\x4a\x2c\x46\x7f\x65\x73\x75\xa3\xdc\xd5\xe1\xad\xb5\xe5\xad\x5e\xb9\xde\xcb\x2b\x9b\x1b\xe1\xd3\xa1\x8d\xf5\x72\xbf\x87\xb6\x5f\x2c\xe7\x1c\xde\xee\x6d\xae\x94\xf3\xee\xba\xbc\xb1\xb3\x19\x3f\xad\xbe\x10\x97\xdb\x5a\x1d\xc4\xcd\xad\xbc\x10\xf7\x72\x78\xa5\x2e\xdf\x5d\xeb\xab\x71\x83\x87\x2f\x6e\xac\x6d\x94\xdf\xdf\xbb\xb5\x72\x75\x95\xc9\xbb\xd6\x56\xb6\x62\xa9\x57\x3e\xbf\xb3\x5c\x56\xe0\xdd\x57\x36\x57\x96\xb7\x57\x36\xab\xba\x5d\xd9\xda\x5e\x8d\xcb\x1f\x5c\x2e\xb7\xed\x4e\x97\x6f\x67\xca\xb7\xb3\xe5\xdb\xb9\xf2\x6d\xae\x7c\x9b\x2f\xdf\x1e\x2e\xdf\x16\xca\xb7\x47\xca\xb7\x47\xcb\xb7\x4f\x95\x6f\x9f\x2e\xdf\xfe\x6e\xf9\xf6\x99\xf2\xed\xb1\xf2\x6d\xb1\x7c\xfb\xd9\xf2\xed\xf1\xf2\xed\x89\xf2\xed\xc9\xf2\xed\x7c\xf9\xf6\x73\xe5\xdb\x67\xcb\xb7\xa5\xf2\xed\xa9\xf2\xed\xe9\xf2\x08\x3f\xb7\xb9\x7c\xf1\xf9\x95\xed\xfa\x90\xde\xfb\xdc\xf2\xc5\xe7\x39\x16\xf7\xc5\xef\x39\xc6\xd3\xcb\x5b\x17\x57\x57\x2f\xae\x6e\x5e\xdc\x29\x9b\xda\xd1\x9d\xf5\x4b\x2b\x9b\x5b\x17\x37\x36\x63\xd5\x5e\xd9\x5c\x8e\x87\xc3\x95\xc7\xdc\x3d\x57\xbe\x5d\x2c\xdf\xca\x03\xee\xe2\x22\x97\xcb\xb7\x2b\xe5\x5b\xb9\x57\xb7\x5a\xbe\xfd\x62\xf9\x56\x36\x27\x57\x1e\x0a\x57\xee\xd5\x95\xb5\xef\xca\x66\xe1\xfa\xe5\xdb\xe7\xcb\xb7\xf2\x38\xb9\xf2\x30\xba\x78\x7c\x76\xca\xb7\x17\xca\xb7\x17\xcb\xb7\xb2\xb5\xb8\x97\xca\xb7\x97\x63\x15\x6c\x2e\x5f\x5c\xa9\x6b\xe4\xd0\x73\xf1\x4c\x39\x1a\xe6\x53\x13\x47\x43\x4d\x6c\xaf\xae\x5d\x2a\x43\xf9\xe8\xfa\xc6\xfa\x73\x9b\x2b\xcb\xcf\xaf\xae\x5f\xe1\xac\x3c\x5a\x9e\x95\x97\x36\x5e\x8c\xed\xab\x3e\xd9\xee\x29\x4e\x96\xb5\xd5\xf5\x32\xf4\x7b\x2e\xee\x6c\x6e\xae\xac\x5f\x2c\x8b\x72\xe8\xa5\xd8\x7a\xef\x7d\x6e\x73\xe3\xf9\x95\xf5\xaa\x0c\x77\x6f\xad\x5c\xac\x9b\xde\x3d\x97\x56\x57\x36\x57\xb6\x56\xcb\x38\xef\xbd\xb8\xd1\x7f\x29\x39\x4e\x1b\x9b\x97\x2e\xaf\x5c\x5d\xad\x9b\xfc\xfd\x57\x76\x56\xd7\xd6\x56\xae\x6e\x70\xb0\x8f\xae\x6d\x5c\x59\xbd\xb8\xbc\xb6\xbe\x51\x4e\xdf\xbd\xb3\xbe\x9a\xe7\xa7\xcb\x46\x7b\x74\x73\xe5\xca\x6a\x51\xc4\x95\xf2\x80\xdd\xbb\xf1\x42\x7a\x98\x8f\x5c\x5a\xb9\x52\x9d\x8a\xf7\x16\x67\xfa\xd5\xd5\xf5\x78\xba\x4f\x6f\xbf\xb8\xb1\xb5\x13\x4e\xee\xb2\xd4\xf7\x87\xb3\xb6\x31\xeb\xf0\xf2\xc5\x9d\xed\x72\xed\x83\x57\x77\xea\xe4\xb2\x7c\x65\x73\xb9\x5f\x36\x82\x8f\x94\xd9\xa1\xa8\xae\xba\x0c\x77\x5f\x5c\xb9\xb4\xba\xb6\xb6\x1c\x23\x5c\x6f\x6e\xf3\xbe\x8d\xcd\x4b\x57\x97\xb7\x2e\xee\xac\x55\x31\x7f\xa4\x8e\x39\x39\x6c\x1b\xeb\xc5\x89\xbd\x59\x9d\xce\x77\x6f\xac\xaf\xf4\x96\xd7\x2e\x27\x25\x8d\x5f\x97\xd1\xdc\x57\x9d\xee\xf5\x21\x3c\x72\x9a\x26\x7e\xe4\x34\x81\x4c\x9f\x2e\x4f\x8b\xcb\x6b\x2b\x83\xf8\x25\xad\xe3\xde\xd3\x8d\xa3\x75\xf8\xf4\x66\x75\xe4\x0f\x9e\x2e\xd3\xc3\x3d\x67\xd3\xe8\x8e\xcc\x25\x3b\x99\x4b\x76\x32\x37\xb6\x93\x7b\xe7\x1a\x1b\x3e\xf2\x48\xb2\xde\x23\xc9\x7a\x8f\x8c\xaf\xf7\x48\x63\xbd\x43\x73\xdb\x65\xbd\x1f\xf9\x0c\x85\x3e\xf2\x58\xb2\xb1\xc7\x92\x8d\x3d\x36\x1e\xe9\x63\x49\xa4\x8f\x35\x36\x7c\xcf\xd5\x9d\xb5\xed\xd5\xfe\xda\x4b\x71\x41\x92\xcb\x91\xf3\xc9\xd6\xcf\x27\x5b\x3f\x3f\x5e\xd4\xf3\xcd\x10\x9f\x62\xd9\xc3\x4f\xf6\x36\x36\xcb\xc3\x72\xf4\xca\xca\xe6\xd5\xe5\xf5\x4b\xcf\xad\xc5\xc5\x96\x93\xcd\x2f\x27\x9b\x5f\x1e\x2f\xfc\x72\x52\xf8\xe5\xe6\x61\x5a\xe6\x30\x2d\xaf\xc4\x13\xb5\x71\x98\x56\x92\x9d\xac\x24\x3b\x59\x19\x8f\x61\xa5\x19\xc3\x6a\xb2\xde\x6a\xb2\xde\xea\xf8\x7a\xab\xcd\xc3\xb4\x52\x1d\xa6\xf5\xe4\x30\x6d\x24\x1b\xdb\x48\x36\xb6\x31\x1e\xe9\x46\x12\xe9\x46\xb3\x40\x97\x56\x5f\x58\xad\xb7\x97\x1c\xa4\x9d\x64\xdb\x3b\xc9\xb6\x77\xc6\x0b\xba\xd3\xdc\xde\x4b\xc9\x41\xda\xae\x0f\xd2\xbd\x2f\x35\x96\xba\xfb\xf4\xd5\xe5\x8b\x9b\x31\x9f\xdd\xbd\x9c\x4c\x1c\x39\xfd\xdc\xe6\x4a\x7d\xf4\xf8\x7c\xf7\xe9\x8d\x2b\x1b\xeb\x2b\xcf\xc7\x35\x92\x89\x23\x67\xd9\xe3\x91\x8b\x49\x49\xcf\x8e\x95\x74\xfa\xe2\xd8\x8c\xbb\xce\x5e\x8a\x19\xf0\xae\x8b\xd5\xa7\x23\x67\x2f\x2e\xd7\x65\xb9\x98\x7c\x3e\x97\x7c\xbe\xd4\x98\xbf\xb9\x11\xc7\x02\x47\x2e\xf1\xf9\xee\xb9\x34\xc2\x95\x34\xc2\xb9\x24\xc2\x15\x3e\x1f\x9d\xbb\xb4\xb1\xbd\x7c\xb1\xee\x27\x8e\xae\x34\xa7\xef\x9e\x4b\x6b\x60\x25\xad\x81\xb9\xa4\x3c\x2b\x7c\x9e\x7e\x78\xbc\x06\xae\x8c\x37\x8c\x87\x93\xb2\x5c\xe1\xf3\x5d\x0f\xd7\x35\x73\xa5\xfa\x74\xdf\xc3\x61\x38\x97\x94\xe8\xbe\x2b\xe3\x73\xa6\x17\xc6\xf7\xd8\x1b\xaf\xf3\x85\xaa\x4f\xbb\xab\x57\x7d\x3a\xf2\x48\xd2\xa6\x93\x9e\xf5\xee\x47\xd2\x3a\x5c\x4d\xeb\xf0\x91\xa4\xdc\xab\x49\x2b\x79\x24\xad\xa3\xd5\x64\xe2\xe8\x23\xcd\xda\xbc\xe7\x52\xd1\x21\x6e\x6d\x95\x43\x8e\x83\x8f\x94\xe3\xb0\x83\xab\xe5\xd8\x63\xfa\xd1\xf1\x38\x7e\x71\x6c\xc6\x7d\x9f\xda\x53\x1b\xcf\xef\x9d\x53\x74\x95\xeb\x6b\xcb\xeb\x97\x56\xcb\x41\xd0\x91\x4f\x27\x6d\x75\x8d\xcf\xf7\x7d\x7a\xcf\xba\x6b\xe3\x73\x8e\x7c\x3a\x39\xca\x6b\x7c\xbe\xeb\xd3\xf5\xb1\x5a\xab\x5b\xf1\xa7\x93\x33\x79\x2d\xf9\xfc\x99\x64\xff\xeb\xc9\xfe\x3f\xb3\x67\xff\xeb\x7b\xf6\xff\x99\x64\xff\xeb\x49\x2b\x5b\x5f\xee\x6f\x6c\x6d\x6f\x6e\xf4\x7b\x71\x34\x3e\x17\x53\xe7\xa1\x95\xf8\xe1\xee\xc7\xd2\x03\xb9\x91\x1e\xc8\xc7\x92\x03\xb9\xc1\xe7\xfb\x1f\xeb\xed\xac\x5f\x59\xde\xdc\xb9\xba\xb6\xbc\x53\xee\xff\xfe\x8d\x3d\xb3\x0e\x3e\x56\x76\xa1\x07\x37\xe2\x16\x1e\x4f\xc2\xdb\x4c\xc2\x7b\x7c\x4f\x78\x9b\x7b\xc2\x7b\x3c\x09\x6f\x33\xf9\xfc\x44\xb2\xcd\xad\x24\xbd\x3c\x31\xde\x44\xb6\xc6\x66\xdc\xf3\x44\xda\x63\xdc\xb3\xd5\xe8\x3f\x9e\x48\xf6\xb0\xc5\xe7\xfb\x9e\xdc\x53\xd2\xed\x3d\x25\x7d\x32\x59\x77\x3b\x69\x08\x4f\xd6\xa7\xd6\x76\x7d\x6a\x9d\x4f\x4e\xad\x9d\xe4\xd4\x3a\x9f\x1e\x91\x9d\xf4\x88\x9c\x4f\x8e\xc8\x0e\x9f\x0f\x9f\xaf\xbb\xc4\xc3\x3b\xf5\xc7\xfb\xcf\xef\x3d\x4e\x3b\x7b\x66\xdd\x7d\x3e\x3d\x2d\x77\x92\x89\xe9\xcf\x8e\xd7\xe2\x8b\xe3\x33\x9e\x1a\x9f\xf1\xd2\x78\x0f\xf4\x54\xb3\x07\x7a\x3a\x39\x60\x2f\xf3\xf9\xe8\xd3\x63\xf9\xf5\xe5\xe6\xf4\x91\xa7\x93\x6a\x7d\x99\xcf\x87\xd7\x36\xd6\xaf\xc4\x4d\x5f\x5e\xdb\xd8\x5c\x8d\xb3\x1f\xab\x3b\xb7\xc3\x1b\x7c\x3c\xcf\xc7\x9d\xfa\x63\x18\x60\xb7\xe7\xf3\x72\xbf\x61\x08\x98\x94\x6b\xb9\x39\x7d\xf7\xe9\x64\xd8\x77\xf7\x72\x3a\xb8\x28\x07\x51\x69\x47\x3f\x36\xe3\xbe\x27\xf6\x34\x9f\xad\xf1\x39\xa1\x30\x9d\x33\xe5\x95\xea\xd1\xb1\xba\x3c\x9c\xd4\x41\xd2\x28\x0e\xd3\x0e\xee\x6d\xd6\xda\x5d\x75\x53\x38\x92\x1c\xd6\xc3\xb4\xb4\xfb\xf6\xb6\x86\x50\x80\xf9\x2e\x13\xdd\x3c\x4f\x27\xda\xe9\x44\x37\x76\x16\x1b\x1b\xcf\xa7\xb3\xe7\xeb\x2c\xfe\xdc\xca\xda\xc6\x8b\x71\xaf\x1b\xeb\x1b\xe5\x91\xba\xbf\x6a\x12\xcc\x3a\x7a\x7a\xad\xdf\x5b\x66\xfa\xde\xe5\xf5\x8d\xed\x95\xb5\x95\xd5\xf2\x8c\xbc\x6f\xae\xbf\xb5\xba\xb6\xb1\xce\x02\xf7\xcc\x6d\xa7\x8b\x3f\xb2\x91\x4e\xde\xf7\xd8\xd5\xd5\xa2\x7a\x92\x39\xe7\xc7\x37\x70\xf4\xb1\xab\x2b\x57\x92\x75\x3e\xb6\xba\xb1\xbd\xbc\xb7\x60\x87\x43\xc1\xca\x30\xcf\xac\x6c\x97\x9f\x0e\x3f\xbc\x5c\xdd\x3b\x29\x23\x3e\xf5\x60\x39\x11\x8b\x59\x2e\xfe\x74\xb5\xf8\xa1\xb9\x6a\xbd\x27\x7b\xd5\xbc\xbb\x8a\x12\x97\x33\x3f\xb5\xdc\xef\x2f\x57\x3d\xd0\xd5\xe7\x2e\x95\x9f\x0f\xfe\xdd\xf2\x0a\xec\xe0\x67\xe2\xfb\xd2\x6a\x95\xae\x57\xeb\x43\x7f\x70\xb1\x9c\x79\xe8\xf1\x5e\xbc\x17\xf3\xc4\xea\x95\x58\xb2\x43\x4f\x2e\xef\xc4\x13\x3c\x29\xd5\xa1\xc5\x5e\x5c\xe5\x6c\xf5\x61\x31\xf6\xb3\x65\x28\xa7\x4f\x95\x15\xf6\x48\x52\x1d\x61\xce\x03\x71\x33\x8d\x99\x47\x97\x9b\xc7\xed\xbe\x95\x3d\x07\x6a\xa5\x71\xa0\x56\x1b\x07\xea\x6f\xed\x34\xb7\x99\xd4\xfb\x32\xf5\xfe\x5c\x5d\xef\x57\xea\x7a\x3f\x7c\x69\x65\x2d\xce\xbd\x7b\x25\xad\xf5\x97\xeb\x5a\xaf\xd7\xda\xa6\xd6\x57\xeb\x5a\x7f\x9e\x5a\x5f\xa3\xd6\xcb\x3a\x88\xe7\xdf\xc1\xf5\x58\xf5\x83\x58\x41\x1b\x69\xd5\xf7\x63\xf5\x6d\xc6\xaa\x3f\xb2\x55\x54\x7d\x79\x7a\x1c\xde\xe2\x30\x6c\x57\x87\x61\x27\x3d\x0c\xfd\xaa\xf6\x2f\x56\x1f\xfa\xf1\x30\x1c\xde\x28\x1a\x66\x59\x9b\xab\x7b\x0e\xc2\xce\x3e\x07\xe1\xbe\x8d\x3d\xcd\x7d\x67\x4f\x73\xdf\x68\x36\xf7\x32\xd0\x73\xe9\xd9\x7c\xae\x93\x4e\x08\x13\x0f\xc6\x0c\x70\xef\xf2\xe5\xd5\xd5\x76\x9e\x77\xba\x8d\x49\xdf\x6e\x4e\x76\x9a\x93\x63\x0b\x3f\xd8\x9c\xf4\xcd\x49\x69\x4e\x6a\x73\xd2\x9a\x93\xa7\x1a\x93\xd2\x2c\xa4\xb4\xd3\x00\xce\x35\xbf\x6b\x14\xb1\xfd\x60\xb3\x10\xed\xe6\x5e\xdb\xcd\xbd\xb6\x9b\x7b\xed\x8c\x55\x4d\xb3\x2e\x3a\xcd\xba\xe8\x34\x83\xef\x34\xf7\xdb\x69\x06\xdf\x69\x16\xa3\xd3\x2c\x46\xa7\x59\x8c\x6e\xb3\x18\xdd\x66\x31\xba\xcd\x62\x74\x9b\x87\xa4\xdb\x2c\x55\xb7\x59\xaa\x6e\xb3\x54\xdd\x66\xa9\xba\xcd\x52\x75\x9b\xa5\x7a\xb0\x59\xaa\x07\x9b\xa5\x7a\xb0\x59\xaa\x07\x9b\xa5\x7a\xb0\x59\xaa\xb1\x63\xf4\x60\xb3\x54\x0f\x36\x4b\xf5\x60\xb3\x54\x0f\x8e\x35\x94\xe6\xa6\xa4\xb9\x29\x69\x6e\x4a\x9a\x9b\x92\xe6\xa6\xb4\x19\xa0\x36\x23\xd2\x66\x44\xda\x8c\x48\x9b\xc5\xd0\x66\x31\xb4\x59\x0c\x6d\x16\x43\x9b\xc5\xb0\x66\x31\xac\x59\xcf\xd6\x2c\x95\x35\x4b\x65\xcd\x52\x59\xb3\x54\xd6\x2c\x95\x35\x4b\x65\xcd\x52\x59\xb3\x54\xa7\x9a\xa5\x3a\xd5\x2c\xd5\xa9\x66\xa9\x4e\x35\x4b\x75\xaa\x59\xaa\x53\xcd\x52\x9d\x6a\x96\xea\x94\x26\xa7\xba\x1f\x3b\x24\x63\x7b\x6d\x14\xb1\xdd\x4c\x6c\xed\xbc\xdd\x9c\x6c\xa6\x89\xbc\xdb\x9c\x7c\xb0\x39\xe9\x9b\x93\xd2\x9c\xd4\xe6\xa4\x35\x27\x4f\xa5\x01\x34\x72\x55\xbb\xdd\x2c\xe2\xa9\x64\x64\xf6\xa0\xe4\xe9\x44\x9a\xf0\xa4\x93\x4e\x34\xd6\x79\x30\x9d\xf0\xe9\x44\x9a\xf2\x25\xad\xd3\x78\x12\xc4\x89\xb4\xb0\x72\x3a\x9d\x38\x93\x4e\x9c\x4d\x27\xce\xa5\x13\x73\xe9\xc4\x7c\x32\xa1\x69\x3c\x9a\xc6\xa3\x69\x3c\x9a\xc6\xa3\x69\x3c\x9a\xc6\xa3\x69\x3c\x9a\xc6\xa3\x69\x3c\x9a\xc6\xa3\x69\x3c\x9a\xc6\xa3\x69\x3c\x9a\xc6\xa3\x69\x3c\x9a\xc6\x63\x69\x3c\x96\xc6\x63\x69\x3c\x96\xc6\x63\x69\x3c\x96\xc6\x63\x69\x3c\x96\x86\x60\x69\x08\x96\x86\x60\x69\x08\x96\x86\x60\x69\x08\x96\x86\x60\xf3\x8d\x53\x66\xec\x84\x3a\x95\xee\xf8\x54\x1a\x46\xa3\x69\x9e\x4a\xc3\x38\x95\x86\x71\x2a\x0d\xa3\x71\xea\x36\x37\x9d\xc6\x74\x2a\x8d\xe9\x54\x1a\xd3\xa9\x34\xa6\x53\x69\x4c\xa7\xd2\x98\x4e\xa5\x87\xe5\x74\x7a\x58\x4e\xa7\x87\xe5\x74\x1a\xcf\xe9\x34\x9e\xd3\x69\x3c\xa7\xd3\x78\x4e\xa7\xf1\x9c\x4e\xe3\x39\x9d\xc6\x73\x3a\x8d\xe7\x74\x1a\xcf\xe9\x34\x9e\xd3\x69\x3c\xa7\xd3\x78\x4e\xa7\xf1\x9c\x4e\xe3\x39\x93\xc6\x73\x26\x8d\xe7\x4c\x1a\xcf\x99\x34\x9e\x33\x69\x3c\x67\xd2\x78\xce\xa4\xf1\x9c\x49\xe3\x39\x93\xc6\x73\x26\x8d\xe7\x4c\x1a\xcf\x99\x34\x9e\x33\x69\x3c\x67\xd2\x78\xce\xa4\xf1\x9c\x49\xe3\x39\x9b\xc6\x73\x36\x8d\xe7\x6c\x1a\xcf\xd9\x34\x9e\xb3\x69\x3c\x67\xd3\x78\xce\xa6\xf1\x9c\x4d\xe3\x39\x9b\xc6\x73\x36\x8d\xe7\x6c\x1a\xcf\xd9\x34\x9e\xb3\x69\x3c\x67\xd3\x78\xce\xa6\xf1\x9c\x4d\xe3\x39\x97\xc6\x93\x0e\xb9\x1f\x4c\x87\xdc\x0f\x9e\x4b\xe3\x39\x97\xc6\x73\x2e\x8d\xa7\x31\x32\x3f\x97\xc6\x73\x2e\x8d\xe7\x5c\x1a\xcf\xb9\x34\x9e\x73\x69\x3c\xe7\xd2\x78\xce\xa5\xf1\x9c\x4b\xe3\x39\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x97\xc6\x33\x9f\xc6\x33\x9f\xc6\x33\x9f\xc6\x93\xde\x14\x79\x70\x3e\x8d\x67\x3e\x8d\x67\x3e\x8d\x67\x3e\x8d\x67\x3e\x8d\x67\x3e\x8d\x67\x3e\x8d\x67\x3e\x8d\x67\x3e\x8d\x67\x3e\x8d\x67\x3e\x8d\x67\x3e\x89\xc7\xa7\x37\x6c\x7c\x7a\xc3\xc6\xe7\x9d\x74\xa2\x9b\x4e\x3c\x98\x4e\xf8\x74\x42\xd2\x09\x4d\x27\x2c\x9d\x38\x95\x4e\x9c\x4e\x27\xce\xa4\x13\x67\xd3\x89\x73\xe9\xc4\x5c\x3a\x91\xc6\xd3\x4e\xe3\x69\xa7\xf1\xb4\xd3\x78\xda\xc4\xd3\x9e\x4b\xea\xa0\x3d\x97\xd4\x41\x7b\xae\x3b\x97\x4e\x94\xfb\x39\xf2\xd9\xe4\x81\xda\x8b\xc9\xe7\xcf\x26\xb7\x2b\x5f\xe4\xf3\xbd\x9f\x6d\x3e\xe6\x7f\xb1\xf9\x00\x2d\x6c\xfa\x74\x5a\x82\xd3\x69\x09\x92\x5e\xa6\x3d\x77\x3a\x2d\x75\xd2\xcb\xb4\xe7\x92\x5e\xa6\x3d\x97\xf4\x32\xed\xb9\xa4\x97\x69\xcf\x25\xbd\x4c\x7b\x2e\xe9\x65\xda\x73\x49\x2f\xd3\x9e\x4b\x7a\x99\xf6\x5c\xd2\xcb\xb4\xe7\x92\x5e\xa6\x3d\x77\x3a\xad\x9d\xa4\x97\x69\xcf\x9d\x49\xe3\x39\x93\xc6\x73\x26\x8d\xe7\x4c\x1a\xcf\x99\x34\x9e\x33\x69\x3c\x67\xd2\x78\xce\xa4\xf1\x9c\x49\xe3\x39\x93\xc6\x73\x26\x8d\xe7\x4c\x1a\xcf\x99\x34\x9e\x33\x69\x3c\x67\xd2\x78\xce\xa4\xf1\x9c\x4d\xe3\x39\x9b\xc6\x73\x36\x8d\xe7\x6c\x1a\xcf\xd9\x34\x9e\xb3\x69\x3c\x67\xd3\x78\xce\xa6\xf1\x9c\x4d\xe3\x39\x9b\xc6\x73\x36\x8d\xe7\x6c\x1a\xcf\xd9\x34\x9e\xb3\x69\x3c\x67\xd3\x78\xce\xa6\xf1\x9c\x4b\xe3\x39\x97\xc6\x73\x2e\x8d\xe7\x5c\x1a\xcf\xb9\x34\x9e\x73\x69\x3c\xe7\xd2\x78\xce\xa5\xf1\x9c\x4b\xe3\x39\x97\xc6\x73\x2e\x8d\xe7\x5c\x1a\xcf\xb9\x34\x9e\x73\x69\x3c\xe7\xd2\x78\xce\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa5\xf1\xcc\xa7\xf1\xc4\x5e\xe6\xc8\x53\x49\xae\x79\x89\xcf\x71\xa1\x34\x9a\xf9\x34\x9a\xf9\x34\x9a\xf9\x34\x9a\xf9\x34\x9a\xa4\x8f\x69\xcf\x3f\x48\x31\x3b\x79\x92\x1e\x3b\x79\x92\x1e\x3b\x79\xd2\x45\x74\xf2\xa4\x8b\xe8\xe4\x49\x17\xd1\xc9\x93\x2e\xa2\x93\x27\x5d\x44\x27\x4f\xba\x88\x4e\x9e\x74\x11\x9d\x3c\xe9\x22\x3a\x79\xd2\x45\x74\xf2\xd8\x45\x1c\x59\x59\xbf\x54\x3f\x0d\x5d\xb9\x5a\x7f\x0e\xd7\x1e\x79\xde\x89\x5b\xbb\x1f\xdd\x56\x69\xca\x7b\x83\x8a\x04\x51\x85\x49\x7c\xd1\x47\x40\x93\xcf\x2d\x6f\xc5\xa7\x98\xe5\x32\x2b\x2f\xac\x6c\x6e\x45\xca\x74\x5f\x25\x34\xeb\x0d\xdd\x5f\xcd\x61\x5b\xf5\x42\xf5\x96\x8e\x5c\x5a\xbe\x72\x25\xca\xa5\x7b\xcb\xcf\x55\xb9\x8e\x3c\xb7\xb3\xb6\xb6\x12\x9f\x6a\xaf\xac\xad\xad\xf6\xab\x4e\x62\xba\xbf\xb2\xb9\xdd\xdb\xd8\xa9\x61\xe7\x91\xab\xab\xeb\x3c\xcb\x5c\xb9\xb8\x11\xe7\x07\x23\x16\x8a\x5e\x97\xea\x23\xf5\x2c\x8a\x75\x6f\x34\x6d\x71\xc7\xf7\x5c\xde\x5c\x46\xa5\xdd\xbb\xde\x84\x5e\x97\x37\x97\xd7\x2f\x26\x55\x6b\xa7\xe2\xbd\xb9\x23\xfd\x95\xad\xea\x66\x79\x79\x68\x62\xbf\x71\xd7\xdc\x4e\x04\xa0\x61\x0d\x69\x77\xd2\x9b\x6c\xd2\xee\xa4\x37\x7f\xa4\xdd\xad\xee\x02\x6f\x6f\x2e\x5f\x5a\xb9\xba\xbc\x19\x1f\x3d\x3d\x56\xdf\xdb\xbe\x77\x65\x6b\x7b\xf5\xea\xf2\x76\x2d\xd9\xd6\x57\x02\x0a\x8d\xc6\x31\x98\xaf\x72\x46\xac\xaf\xcb\xab\x2f\x34\x66\xdc\x17\x38\x69\x63\x91\xfe\xf2\xe6\xf6\xea\xf2\xda\xa5\xd5\xcb\xa5\x1c\x3b\x7c\x8e\x87\x04\xfd\xcd\x8d\x4b\x3b\x17\x63\x5d\x6d\xed\x5c\xbd\xba\x5c\xd7\xce\x61\x98\xdc\xdd\x9b\xcb\x97\x56\x2f\x46\x61\x7a\xcf\xea\xfa\xe5\xd5\xf5\xd5\xed\x97\xaa\xa9\xed\x95\x2b\x9b\xf1\xbb\xe9\xe5\x7e\x7f\x73\x63\x00\x47\xbd\x67\x7d\x63\x9b\xa9\x7b\xd7\x56\xb6\xb6\x98\xbc\x2f\x5a\xd5\x44\xaf\xae\x6d\xbc\xbc\xb2\x7e\x85\xd3\x7d\xfe\x4c\x72\x1a\xce\x9f\x49\x4e\xc3\xf9\x33\xc9\x69\x38\x7f\x26\x39\x0d\xe7\xe7\x92\x71\xdf\xfc\x7c\x32\x56\x9c\x9f\xaf\xc6\x8a\x3f\xb5\xbe\xb1\x7d\x69\x25\xd6\xc7\x4f\xad\xef\xac\x95\xfb\xff\xe8\xfa\xc6\x7a\x71\x58\x56\xd7\xaf\x6c\xae\x6c\xef\xc4\x67\xa1\xf7\x5f\x7c\x69\x73\x75\x6d\x6d\xf5\x22\x8f\x14\x2b\x8b\x51\xda\x8b\x8f\x86\x47\x90\x7b\x64\xc9\xf8\x8c\x8f\x25\x33\x36\x37\xb6\x97\xab\x27\xa0\x2f\xaf\x6c\x36\x15\xe2\x7d\x97\x37\x76\x36\xc7\xe6\xac\xbe\xd0\x24\x84\xd3\x5b\xab\x83\x26\x5d\x0c\x47\xbe\x39\x2b\xb4\x83\xe6\x86\xd6\x57\xc7\x2c\xe2\xbd\x97\x96\xb7\x56\x97\x37\x06\xf1\xa1\xe2\x31\x1e\xaf\x86\x91\xdd\xc5\x8d\xab\xcf\x8d\x7f\x11\x52\x72\xfd\xc5\x8f\xf1\x45\x6f\x63\xe3\xf9\xfd\x56\x08\xcf\x56\xeb\x2f\x3e\x12\xea\xb1\xb9\xf5\x72\x5e\x73\xc3\xf7\x87\x79\x8d\x6d\x96\x8b\x35\x37\xf7\xd1\xea\xf0\x14\x4b\xd6\xd9\xe0\x63\xf5\x41\x5b\xbd\x52\x7c\x71\xfe\xec\xbe\xb3\x3f\x5d\xce\x9e\x9d\xbe\xeb\xfd\xa9\x0f\x8e\x7f\xf5\xaf\xbe\xf9\x57\x07\x5e\xfd\x5f\x27\x2f\xfc\x60\xf2\xc6\x07\xdf\x9f\x3d\xf9\x3f\xdf\x3d\x3d\xff\xdf\x75\xbf\x7b\xfe\xbf\xfd\xe0\xdf\x9e\xcf\xbf\x3b\xf9\xdd\xc9\xa9\xf3\xff\x76\xea\x87\xc7\xf3\xff\x62\x72\xe3\xed\xbf\x7c\xfb\xc0\xbf\x7b\xeb\xd8\xf1\xfc\x0f\x26\x2f\xfc\xc1\xf0\x0f\x0e\xdc\xf8\xe0\xed\x59\xfb\x83\xa3\x1f\x99\xff\x1f\x7f\x7f\xf2\xf8\x1b\x9f\x7c\xe3\xa1\x37\xa6\x1e\x7b\xe3\xd9\x37\x36\xde\x98\x9a\x7d\xe3\xe8\x47\xe6\x7f\xef\x67\x8f\x1d\x3f\xfe\x5b\xcf\xfe\xd6\x81\xdb\xff\x64\x72\xea\xe4\xeb\x93\xc7\x5f\x9f\xdc\x7d\xfd\xfa\xeb\x07\xb6\x5e\xff\xe5\xd7\x0f\x64\x37\x3e\xf8\x9f\x66\xff\xd6\xeb\x77\x1d\x99\x7f\xe3\x1b\xff\xf9\x37\x0e\x4c\x9d\xfc\xfa\xe4\xf1\xaf\x4f\x7e\xf3\xeb\x6f\x7c\xfd\xc0\x17\xbf\x3e\x19\xbe\xfd\xd2\xd7\xef\x3a\x32\xff\xc9\xaf\x3d\xf4\xb5\xc7\xbe\x36\x35\xfb\xb5\xbb\x8f\xce\x7f\xf2\xd7\x27\xbf\xf9\xeb\x93\x5f\xfe\x07\xc7\x8e\xcf\x7e\x71\xf1\x8b\x07\xa6\xa6\xb7\x67\xb6\xf3\xed\xa9\x03\xdb\x93\x3f\xd8\x9e\x3c\xbc\x31\xf9\xc1\xc6\xe4\xbf\xd8\x98\xfc\xc6\xc6\xe4\xce\xc6\x97\x36\x0e\x7c\x6a\x63\xf2\xf0\xfa\xe4\x07\xeb\x93\xff\x62\x7d\xf2\x1b\xeb\x93\x9f\x5a\x9f\x74\x7f\x7b\xf2\xd8\xf9\xbf\xf5\x91\x0f\x8e\x1f\x6c\x7d\x70\xdc\x4d\x7d\x70\xfc\xa1\x2b\x93\xc7\xaf\x7c\xf2\xca\x43\x57\x3e\xb8\xd2\x9a\xbd\xbc\x78\xf9\xfa\xe5\x37\x2f\xb7\x1e\x5a\x99\x3c\xba\xf2\xc6\xca\x81\xec\xfa\xa5\xdb\x97\x0e\x4c\x15\x41\x3e\x76\xc9\x1d\x9e\x5f\x7e\xf6\xe4\xf1\x0b\xcf\x3e\x7c\xfc\xd9\xc5\x7f\xef\xf8\x5f\x7d\x6e\xf2\x7f\xf9\xdc\xe4\x93\x9f\xfb\xfb\x9f\x3b\xf0\xc8\xe7\x26\x7f\xfa\x73\x93\xff\xfb\xd3\x93\x7f\xf9\xf4\xe4\xf3\x4f\x4f\x7e\xea\xe9\xc9\x9f\x7e\x7a\xd2\x7d\xa4\x7b\xff\xf9\x6c\x72\xea\x7c\xab\x3b\x75\xfe\xf8\xd4\xe4\xd1\xa9\x87\xa6\xde\x98\x9a\x3a\xfa\xd9\xe3\x9f\xfd\xe4\x67\xa7\x8a\x6d\xfe\xcb\x9f\xbb\xff\xa3\xf3\x37\x3e\xb8\xfd\x2f\x7f\xee\xe0\x91\xf9\x62\xfa\xc9\x30\xfd\xf6\xec\xd5\x27\xdd\x91\xf9\xc7\x17\x4f\x1e\x7f\x68\xf1\xb1\xc5\x67\x17\xa7\x7e\xb8\x30\xf9\x97\x0b\x93\x5f\x5e\x98\x5c\x59\x98\xfc\xb9\x85\xc9\xbf\xb3\x30\xf9\xc3\x87\x27\xff\xf2\xe1\xc9\x2f\x3f\x3c\xf9\xd3\x0f\x4f\xba\xff\xdf\x8f\x7f\x70\xfc\x63\xdd\x8f\x9e\xbf\x6f\xf2\xe8\xf9\xe9\xee\xd1\xf3\x07\x26\x27\xce\x4f\x3e\x3c\x71\xfe\xff\xf8\xe1\xc9\xe3\x3f\xfc\xf1\xfb\x8f\x1f\x3d\x3a\x79\xfc\xe8\x7f\x7d\xf4\xc0\xd1\xa3\x1f\x1c\x3d\xe0\x36\x26\x5e\x9d\x78\x63\xe2\x2f\x27\x5a\xd3\x13\x93\xc3\x8f\x4d\x66\x93\x37\x26\x77\x7f\xff\xc9\x27\x4e\x9e\xfc\xd4\x8d\x83\x1f\x3c\xfe\xa9\x37\xdd\xe2\xe7\xde\x9c\x1c\xbd\xf9\x89\x27\x8a\xff\xcf\xfe\xec\xd3\x6f\xba\xd1\x9b\x13\xe7\x9f\xfe\xdc\xd2\xef\x4f\x4e\xfe\xa3\xa7\xbe\xf4\x95\xaf\x4c\x9c\xf9\x89\x4f\xbd\xd9\x79\x62\xe9\xcd\x0b\x3f\xf1\xd4\xa7\xde\xbc\xf4\xc4\xd2\x9b\xb3\xc5\x87\xe1\x13\x4b\x6f\x4e\xff\xc4\xef\x7f\x6c\xe2\xcc\x53\x5b\x5b\xcf\x6c\x6d\xef\x9c\x8c\xff\x4d\x3e\xbb\x55\xff\x37\xb1\x75\x72\xb2\x98\xf7\xec\xd6\xc4\xd6\xf6\xf8\x77\xc5\xf4\xc9\x67\x8b\x75\xb7\xb6\xb6\x27\x58\x75\x3b\x7c\xbd\x3d\xb1\xb5\xbd\x3d\xf9\xec\xd6\xc9\x62\xcd\xad\x62\xc1\xad\xed\xed\x67\xb7\xca\xf7\x89\x67\xb7\xb6\x26\x4f\x4e\x9c\xdc\xda\x9e\xdc\x2a\xfe\x7f\x72\xb2\xd8\xd5\xc9\xad\x62\x8b\x61\xd3\xc7\x9e\x99\x98\x9c\x9e\xc8\x9e\xfe\xab\x5f\x99\x98\x38\x34\xf1\x7f\xfe\x9b\x0f\xbe\x72\x68\x6b\x62\x62\x62\x72\x22\xfd\xaf\x75\x68\x22\xbb\x71\x68\xa2\x58\xa2\xfc\xcb\xde\x2a\x5e\xee\xfe\xec\xdd\xec\xdb\xf1\xf3\x03\xad\xdf\x99\xf8\x8b\x03\x2f\x4d\xfc\x30\x7b\x2b\xcc\x7b\x37\x7b\x37\xfb\x57\xe1\xbd\x98\x7e\xb7\x75\xb9\x75\xb9\xf5\xdd\xa9\x3f\x6f\x7d\x37\xcc\xf9\xc3\xf8\xcd\x5b\xc9\x7b\xf5\xfa\x76\xbd\x85\xb7\xb2\x1b\x63\xdf\xbd\x95\xfd\xd1\x07\x0b\xee\xe3\xad\x67\xdc\x03\xf1\xef\x78\xf1\x9e\x7d\x2f\xfb\x9e\x7b\xa0\x98\x4e\x5f\xd9\x7c\xeb\x51\x5e\x45\x19\xb3\xb7\xa6\x9e\x9e\x98\x68\x3d\x93\xbd\x9b\xfd\x69\xeb\xd7\x8a\x39\xee\x78\xf6\x9d\xec\xdd\xec\x4f\xa6\xfe\x64\xea\x27\x0e\xbc\x94\xbd\xeb\xae\x67\xef\xb6\x7e\x27\x7b\x27\x7b\xc7\x7d\xbc\xf5\xa8\x7b\x60\xea\x99\x89\x89\xec\x46\xf1\x7d\x76\xa3\x28\x4d\xeb\x99\x83\x5b\xe1\xe5\x0f\x9e\x3c\xd8\x2a\x4a\x19\xa7\x4f\x56\xef\xd9\x5b\x07\x3d\xcb\xb4\xbe\x90\xfd\x3b\x96\xc8\xde\x72\xc7\xdd\xc7\x8b\x57\xf6\x67\xd9\x77\xdc\x97\x8b\x52\xc6\xe9\xef\xd4\xef\x3f\x99\xfd\x19\xcb\xb4\x7e\xaf\xf5\xeb\xc9\x12\x0f\x64\xdf\x71\x7f\x94\x6d\x1c\x9c\xcd\xfe\x22\xfb\xc3\xa2\x2c\xee\xe3\xe1\x4f\xb3\xef\xc5\xcf\x0f\x84\xa8\xe2\x32\x07\xff\x76\xf6\xbd\xb2\xcc\x71\xb9\x62\x9e\x66\xdf\xcb\xde\x2d\xa6\x0f\xfe\x6e\xb1\xec\x41\x9f\xfd\x59\xbd\xcd\xb7\xb2\xef\x1d\xd4\xa2\xae\xca\xed\x85\xe3\xfa\xe8\xc1\xad\x83\xbf\x17\x6a\xef\x0f\xca\xad\x87\xb5\xc2\xb7\xe5\x96\xdd\xed\xe2\x53\xbd\xcf\xe2\x9b\x6f\x97\xdf\x34\xf6\x5d\x4c\xbf\x5b\xcd\xcf\xe6\xcb\xb2\x66\xf3\xe9\xfe\x0f\x7e\xc7\x7d\x39\x7c\x7f\xa3\xd8\x6b\x5c\xef\x64\x1a\xa1\x3b\x9e\xbd\xeb\x1e\x68\xfd\xa0\xf8\xab\x9a\xa7\xfb\x7e\x7c\xff\xf8\xc1\xdf\x3d\xf8\xbb\xe9\xbe\xdc\xed\x50\x73\x1b\xc5\xb7\x1f\x5c\x68\x2d\x64\x7f\x91\x7d\xcf\x7d\x79\x62\xa2\xa8\xe1\x0f\x7e\xb9\xac\x63\xf7\x55\xf7\xf1\x0f\x5e\x71\x1f\x77\xff\x59\xf6\x87\x53\xcf\x84\xa3\x7c\x23\xfb\x76\xf1\x57\xcc\xd9\xd3\x32\xf7\x9f\x2a\xdb\xf0\xb7\x0f\x9e\x3c\x78\xb2\x3c\x5a\xc5\xf6\x42\xeb\x7c\xb4\x6c\xa1\xad\x67\xdc\xc9\xd6\x42\xeb\xd1\xa2\x55\x15\xed\xaa\xf5\x4c\xeb\xd1\xd0\x4a\xcb\xd6\xf9\x4c\xeb\x33\xee\xfe\xd6\xa3\xd9\x77\xaa\x76\xe0\x4e\x66\x7f\x1c\x6a\xbe\x68\x4f\x5b\xe1\x6c\x7a\xab\xf8\x5c\xbe\x42\x7b\x5a\x8d\xe7\x51\xa3\x14\x61\x6e\x5a\xbe\x77\xf7\x3d\xc7\xde\x2a\xcf\xdc\xd6\x33\xee\x27\xeb\x12\x84\x3f\xf7\x63\xf5\x19\x93\x94\xb0\x68\x05\x63\xaf\xf0\x4d\x68\x95\x0f\x14\xe7\x63\xeb\x99\xec\x7b\xd9\x77\xb2\xef\x95\x4b\x87\x08\x7e\xac\xf5\x68\xf6\xa7\xc5\x54\xf6\xef\x17\xc7\x22\x7b\xab\x68\x57\xfc\xb9\x7f\x93\x3d\x1e\x72\xc8\xb7\x5b\xcf\x64\x7f\xdc\x7a\xbc\x6a\x37\xae\xdd\x7a\xeb\xd0\xcf\x1c\x3c\x74\xb0\x95\xfd\x27\x61\xbd\xc3\xd9\x8d\xec\x3b\xce\x3b\x9f\xfd\x7a\xf6\xaf\x0f\xf6\xdc\x8f\x95\x6d\xb0\xf5\x8c\xfb\xb3\xec\x57\x1a\x5b\x6d\xec\x25\x2c\xd3\xd8\x63\xd8\xd3\x3e\x25\xd9\x77\xb9\xe2\xef\xad\x83\xab\xc5\xde\xee\xb4\x64\xf1\xed\xc1\x93\xd9\x77\x42\x2b\x2f\x96\x2c\x5a\xfd\xc9\xec\x3b\xd5\x5f\x88\xb2\x68\xd9\xd5\x74\xf2\x7d\x3d\x3f\xb4\xf0\x72\xd9\xea\xbd\x19\x83\x7b\x20\x94\x39\x2d\x77\xf5\x39\xbe\xbb\xe9\x90\x0b\x76\x38\xcf\xc2\x96\x8a\x79\xff\xbd\xfb\xea\xc1\xff\xc6\xbd\x5a\xfc\x1d\x7a\xd4\xbd\x7f\xe8\xb9\x83\xd3\xc5\xf7\x87\x3e\xe2\xfe\x28\xfc\x2d\x1d\x74\x61\xde\xe7\x8a\x73\x3f\x2e\xef\xb3\x3f\xdb\x6f\x9d\xe2\xbb\x22\x2f\x84\x28\xee\xb0\xdd\xfa\x2f\x6e\xa7\x38\x4b\xc3\xb9\x5c\x4c\xef\xf3\x5d\xcc\x11\x8f\x56\xf3\xb2\x6f\x4f\xfc\x88\xff\x0e\x0c\x0e\xbc\x54\xbc\xdc\xb1\x0f\xfe\xb5\xbb\xed\x6e\x4f\x9e\x28\xfe\x1f\xde\x1f\x70\x0f\x4c\xfd\x60\x6a\x69\x6a\x69\xea\x42\xb5\x74\x6c\xf7\xef\x4c\x15\xf9\x7b\x98\xbd\x15\x7a\xae\xb7\xb3\x3f\x99\x7c\x7b\xf2\xe6\xe4\xcd\xc9\xb7\xb3\xb7\xdd\xb1\xec\x9d\xec\xad\xec\x4f\xb3\x41\xe8\x6b\x6e\x14\xb5\x5d\x64\x00\x77\x2c\xbb\x99\xdd\x70\xd3\xd9\x8d\xec\x1d\x37\x3d\x31\x91\xfd\xd1\xc4\x44\xf6\x76\xb1\xbd\xa9\xf7\xb2\x5b\x61\xd9\x6f\x4f\x4c\xb4\x16\xb2\x9b\xad\xf7\x8a\x65\xea\x9e\xaa\xcc\x1f\x37\x42\xaf\x91\x7c\x72\xd3\xe5\xab\xb5\xc0\xa7\xa9\xb7\xdd\xb1\xea\xaf\x35\x5b\xbe\xa6\xde\xae\x5e\xd5\x77\x7c\x76\xc7\x5a\x87\xca\x57\x39\x2f\xbb\x59\xbe\x5a\x0b\xe5\x9c\xac\x9f\xbd\xed\x26\xdc\xc4\xd4\xdb\x07\x66\x8b\xa5\xab\xf7\xec\x5a\xf1\x97\xbd\xe7\x8e\x85\xbf\x85\x6c\x61\x7c\x1f\xee\x58\x6b\x10\x5f\x8b\xad\xc5\xf2\x9b\xea\xbb\xec\xfd\x62\xba\x75\xc1\x1d\x2b\xfe\xd2\x57\xeb\x42\xd6\xcf\xfa\xb1\x6c\x37\x28\x79\xb1\x74\xf1\xca\x6e\x64\xff\x65\x76\x23\xbb\x19\x6a\x25\xcf\xde\xcf\xf2\xb2\x96\xa6\x7e\x22\xbb\x91\x4d\xb8\xeb\xad\xe9\xd6\xbd\x65\x5d\xbb\x63\xad\x1b\xad\x1b\xd9\x52\xb6\xe4\x1e\x08\x53\xf1\x35\x31\xd1\x9a\x6e\xbd\xdf\xfa\x44\xf6\x76\xf6\xad\xac\xd5\xba\xd1\xfa\x6e\xeb\xbb\x6e\xc1\x2d\xb4\x6e\xb7\x6e\x67\x8b\xd9\x62\x96\x87\xed\xde\xc8\xde\xcc\xde\x74\x87\x8a\x57\xb1\xbd\xa9\x85\xaa\xee\x5b\x17\x0e\xcc\x96\xf3\xff\x1a\xaf\x89\xbf\xde\x2b\x1c\xed\x77\xb2\xb7\xe3\x51\xbf\x99\xbd\x53\xb4\x94\xbd\xf3\xfe\xba\xdb\x6b\xbc\xfe\xba\x65\x4d\x5e\x53\xbd\xa9\x77\x0e\xbe\x7f\xf0\xfd\xa9\xfe\xde\xf7\xf4\xaf\x98\xf7\x37\x79\x85\xf5\xde\x89\xeb\xbf\xf3\x37\x5f\xbf\x35\x53\xfc\x4d\xf5\x5b\x33\xe5\xff\xef\xbc\xdc\xf8\xb7\x53\xfd\xa9\x7e\x76\x2d\xbb\x96\x0d\x8b\xd7\x54\xff\x83\xc1\xc4\x9b\x93\xdf\x9f\x3a\xd6\x5a\xcc\x46\xee\xed\xf1\xf5\x0f\x2d\x1d\x5a\x0a\xdb\xb9\xb1\xe7\x75\xa2\x68\x27\xad\x37\x5b\x6f\x16\xad\x3a\xbc\xdf\x2a\x5e\xd9\x1f\xef\xb3\xac\x65\xb3\xf1\xe8\xde\x68\x5d\x6f\x5d\x0f\x67\xff\x44\xb6\x90\xed\x86\x33\xe8\x9d\xfa\xf3\x74\xf6\x4e\xf6\xfd\xec\x96\x3b\x11\xe6\xdd\x72\x33\xd9\x7b\xe1\xf8\x97\x39\xa3\x6c\x07\xf1\xe5\x16\xdc\x52\xeb\x46\xeb\x7d\x37\xe3\x0e\x4d\x4c\x4c\xe6\x93\xd6\x1a\xb9\x99\x6c\xe4\xcc\x5d\xa8\x5e\x07\x6e\x97\x7f\xae\x38\x5b\x66\xeb\xf9\xef\xb8\x77\x26\xde\x73\x4b\x6e\xc9\x5d\x08\x7b\x2c\xca\x36\xeb\x4e\xb4\x6e\x3a\x6b\x2d\x66\xb7\x5a\xef\xb8\x85\xd6\xf7\x9d\x15\xef\x6e\xc1\xbd\xe9\x96\xdc\x2d\x37\x70\x6f\xba\xdc\xbd\x99\xf5\x5c\xb1\xbd\x5b\x71\x2f\xb7\x5c\xee\x6e\xb9\x63\xee\xb6\x5b\x70\x03\xd7\x73\xb7\x5b\x27\xb2\xbe\xbb\x99\x7d\x2b\xfb\x96\x9b\x75\xd7\xdc\x82\x9b\x70\xb9\x9b\xc9\xbe\xe5\xcc\xdd\x72\x37\xb3\xf7\xdc\x2d\x57\x9c\x4b\x37\xdd\x8d\x6c\x3a\x7b\xaf\xf8\xce\xdd\x72\xef\xb8\x13\xd9\x9b\x6e\xd6\x2d\x3a\x6b\xdd\x76\x79\xd8\x77\x91\xd3\x8a\xfa\x78\xcf\x2d\x65\xb7\x5b\x37\x5d\x9e\xdd\xce\xde\x77\x0b\x2e\x77\xd7\xdc\xcd\x62\x5b\xee\x56\x36\x9b\x8d\x5a\xd7\xb2\xdb\xad\xf7\xdc\x6c\xeb\xb6\x5b\x68\x4d\x67\x8b\x45\x0c\x6e\xc1\xdd\x70\xb3\xee\xa6\x5b\x72\x37\xdc\x92\xfb\x56\xb6\xe0\x6e\x87\xfd\x1f\x72\xdf\xca\x6e\xb8\x9b\xe1\xbb\x89\x10\xc7\x6d\x37\xed\x6e\x17\xc7\xc3\xdd\xca\xde\x0e\x4b\x99\xcb\xb3\xd9\xac\x88\xe7\x50\xf6\xbe\xbb\xe9\x86\x6e\xda\xdd\x72\x37\xb2\xeb\xee\x96\xbb\x95\x1d\x0a\x67\x51\xee\x6e\xba\x37\xb3\x1b\xee\x90\x3b\x51\xe4\xf0\xd6\xf7\xdd\x6c\xeb\x44\xb6\xd8\xea\x65\xd7\xb2\x5b\x6e\xda\x4d\xb8\xe9\x6c\xd4\xea\x65\xef\x38\xcb\xae\x67\x37\xb2\xdb\xae\x68\x19\xef\x4d\x5d\x9f\x5a\x6a\xdd\x0a\xeb\x15\xf3\xfb\x21\xba\x43\xee\x58\xc8\x2b\xef\xb8\x43\x6e\x26\xbb\x19\x72\xe8\xfb\xd9\xad\xec\x76\x88\xf8\xbd\xec\x6d\x97\xbb\x89\xec\xfd\x62\xb9\xec\x66\x31\x27\xb4\xa2\xef\x4f\x59\x76\x3b\xbb\xd6\xba\xd5\xba\xd9\x7a\xaf\xf5\x4e\xeb\x66\x36\x1d\x5a\xdf\xcd\xf8\x7a\xaf\xf8\x7f\x98\xf7\x4e\xeb\x9d\xd6\x7b\xc5\x2b\x5b\x0a\xad\x73\x31\x2c\x75\x2b\x5b\x70\xb3\xcd\x57\xeb\x46\x7c\xbf\xd9\xda\x8d\x9f\x46\x07\x06\xc5\xfb\xc4\x44\xb1\x87\xd6\x7b\xd9\x89\xb0\xdd\xe2\xfd\x66\xf9\x9e\xbd\x1f\x3e\x15\xe7\xc1\xcd\xd6\xcd\x90\x5b\xdf\xab\xca\x90\xcd\x64\x8b\xd9\x74\x36\x5d\x2c\x95\x1d\xcb\xa6\xdd\xac\xab\xf7\x39\x55\x1c\xed\x0b\xff\x2f\xbc\x6e\xfd\x3f\x7c\xcd\x36\xa6\x46\xee\x5b\xee\x4d\x77\xd3\x5d\x77\xd7\xdd\xb7\xdc\xb7\xdc\x2d\xf7\xb6\xbb\xe0\x76\xc3\xe7\x37\xdd\xc0\x0d\xdc\xa2\xeb\xbb\x41\xf6\x76\xf9\x2a\xfb\xab\xaa\x4f\x28\xfa\xb1\x78\xb6\xde\x0c\x7f\xa1\x5e\xdc\x4c\xd9\x6b\x15\xdf\x1e\xb4\xe6\xcb\xcd\xb8\xeb\xd5\x1a\xc5\x92\xee\x7a\xb5\x6c\xd5\xd3\x54\x5b\xaf\x3e\x17\x6d\xa1\xf8\x36\xf4\x99\x33\xc5\x5a\xe1\x2f\xf6\x76\x69\x1f\xda\xba\x10\xb6\x39\x72\xc3\xa9\xa1\x9b\xc9\x7e\x50\x64\x8d\xec\xaf\x42\xbb\x5b\xc8\x6e\xbb\xa5\x90\xe5\x8f\xb9\x41\x68\xf9\x33\xae\xeb\x06\x2e\x77\xe6\x86\x21\x37\x1c\x73\x8b\x21\xda\xbe\x5b\x70\xc7\xdc\x67\xdc\x31\x77\xc1\x7d\xdc\x1d\x73\x16\xe6\x2e\xb9\x27\xdc\xc0\x5d\x70\x7d\x37\x74\xe6\x96\xdc\xc8\x5d\x08\xcb\x0e\xdc\x73\xad\xeb\xad\xff\xca\x0d\xdc\x74\x98\xee\xb9\x69\x37\x74\x33\x6e\xd2\x7d\xa2\x18\x99\x64\x6f\xb8\x91\x5b\x74\x27\x5c\xcf\x2d\x66\xef\xbb\x81\x1b\x86\xad\x2c\x85\x65\x2f\x84\x6d\x94\xf3\x8a\xf5\x9f\xcc\x7e\x32\x7c\x1a\xb9\x81\x9b\x08\x9f\x66\xdd\x89\xb0\x8f\x9e\xbb\xec\x86\xee\x98\x1b\xba\xc7\x5c\xee\x7e\xc5\x3d\x14\xa2\x28\x97\x7c\xc5\xed\x86\xcf\xc5\x52\x7f\xcf\xbd\x1a\xb6\x37\x74\xbb\x71\xab\x03\x37\x13\x4a\x64\x61\xd9\x41\xb6\x1b\xce\xd8\x3c\x8c\x5f\x0e\x85\x9a\x19\x64\xff\xdc\x0d\xdc\x89\x50\x23\x45\xcd\xf4\x9d\xb9\x63\xad\xdb\x61\x3b\x97\xc2\xb6\x86\xae\x17\xfe\xcf\x96\x79\x95\xf3\xbe\xe4\x7e\xcd\xed\xba\x45\x37\x74\x7d\xd7\x77\x2e\xee\x79\x10\xb6\x37\xa8\x4b\x52\xbc\xef\xc6\xf7\x61\x58\x76\x58\x2f\x37\xac\x97\xab\xe6\x8d\x92\x79\xcf\x35\x96\x1b\xff\xb4\xff\x6b\xd4\x98\xfa\xb0\xa5\x87\xf1\xdb\xd1\x9e\xb2\xdc\x69\xfd\xd1\x9e\xed\xef\xb7\xd5\x1f\xfd\x79\x6f\x19\xf6\x96\x60\x38\xf6\xff\x61\xdc\xf3\xf8\x76\x46\x71\xfe\xe8\x43\xf7\x37\x1a\xfb\x2e\x8d\x79\x7c\xcd\xf1\x7a\xdc\x6f\xcf\xbb\x3f\xa2\x16\xc6\xeb\x77\x14\xce\x9c\x61\xbd\x3f\x22\x1b\xd6\xff\xdf\xfd\x90\x9a\x1a\xc6\x18\xaa\xb5\xc6\xf7\x3f\x6c\x6c\x71\x98\x94\x7e\x94\xec\x67\xe4\xbe\xb0\xa7\x7e\xee\x74\x3c\x9b\x5b\x19\xdc\x31\xf6\x51\xf2\xde\xdb\x73\x44\x7f\x74\x1b\x18\xed\xf9\xff\xde\x32\x0d\xef\xb8\xfe\xa8\x3e\xb2\xa3\xa4\x6e\xf7\xaf\xbd\xf4\xdc\xa2\xbe\xd3\xb5\x5e\x8b\x51\x0f\x1b\xad\xaf\xfc\xf6\xda\x58\x4b\x29\x8e\xc1\x28\xd6\xd1\xd0\x6d\xdd\xb1\x1e\xaf\x35\xd6\x19\x8e\xd5\xe1\xde\xf3\x6b\xd8\x98\xfe\xd1\x67\xd0\xa0\x51\xd2\xb2\x3c\xbb\xf5\x96\x76\x1b\xe7\x6c\xb3\x5d\x94\xeb\x2c\xee\x29\xd7\x30\xfe\x7f\x18\xe2\x6a\x96\xa3\x6a\x47\xcd\x39\xd5\x56\xf3\xd0\x1b\xac\x66\xc5\x78\xb5\xf8\x7e\xa1\x8e\xaa\x1f\x7a\x9b\x17\x62\x5f\x33\xe3\x46\x6e\x21\xac\x39\xff\x21\xf1\x94\x7b\x32\xb7\xeb\x66\xdc\x89\xd0\x77\xcc\x85\x2d\x15\xfd\xc1\xa2\x5b\x70\x7d\x37\x1b\xca\xf1\x62\xcc\x01\x4f\xb9\xed\xb0\x8e\xb9\xff\x7f\xc8\xc9\xd3\x61\xed\xa1\xbb\x10\xc6\xb1\x33\xa1\xf7\x5b\x70\xc5\xb8\xa7\x28\xd9\x42\x36\xed\x72\x37\x74\x79\xf6\xaf\xca\x77\x97\xc7\x91\x4b\x1e\xfe\x8a\xff\xcf\x84\xf7\x25\x77\xc2\xed\xba\x9f\x0f\xdf\x0d\xc2\x5f\xd1\x6f\xcc\xd6\x6d\x64\x36\xa9\xd1\x51\x5d\x47\xb3\x49\xcb\x9a\xad\x8f\xed\x42\x9c\x1e\x85\xbf\x7e\xfc\x6e\x37\x7c\x9e\x0d\x65\x9e\x71\x17\xdd\x73\x2e\x0f\x4b\xe6\xf1\xb5\x1b\x4a\xe8\xc3\x9c\x41\xf8\xfc\x50\xf6\x8e\x9b\x75\xbf\xe0\x72\x77\x22\xd6\xe8\x89\xd0\xe7\x14\x23\x82\x7e\xb8\x3b\xf0\xb7\xc3\xd6\x9b\x3d\xc7\xe5\x30\xaf\x1f\xfe\x3f\x1d\xbf\x1f\xc4\xfe\xa8\x1f\xa7\xfb\x6e\x73\x4f\x0b\xec\x27\xdf\x57\x7d\x58\x3f\xae\xd9\x1f\x3b\x87\xfa\xf1\xfb\x6a\x6a\x50\xb7\xc9\x41\x88\x72\x98\x2c\xf5\x6b\xf5\x7a\xfd\x64\x9f\x6c\xa1\x5f\x6f\x7d\x7c\x6b\xcc\xed\xc7\xbd\x57\x4b\xb2\xe7\x5f\x09\xcb\xf6\xdd\x6e\x98\x47\x3f\x51\x1d\xa7\x51\xec\xd5\x37\x1b\x7b\x19\x25\xdb\xf8\xf4\x1d\xce\xbb\x61\xc8\x74\xcd\x57\x6f\x9f\x73\x95\xf6\xff\x72\xf8\xff\x17\xc6\xd6\x99\x1d\xcb\x97\xc3\x3d\xb5\xd0\xcc\x7d\xa3\x46\x49\x7f\xa3\x3e\xcb\x87\x7b\x5e\xd4\x75\xaf\x2e\x5f\x2f\x4e\xf7\xc2\xff\x2f\xd4\xdf\xd9\x1d\x5f\x3f\xe3\xac\xb8\x5e\xcb\x7e\x50\xfc\x3f\xbe\x16\xd3\xf7\xec\xed\x64\xe9\xf2\x9b\x41\x18\x51\x56\x63\x3c\xa2\x2a\x33\xc2\xcf\x27\xb9\xbe\x5f\x7f\x2e\xda\xc6\xe6\x9e\x9e\xa3\x7c\x15\x2d\xfa\x90\xeb\x87\x91\x61\x99\x6b\x66\xe2\xe7\xaa\x2d\x2e\x85\xdc\x30\x0a\xfb\xbe\xea\x9e\x0e\x63\xbe\x7c\xdf\x78\x16\x9d\x26\x91\xa4\xd1\x8c\xcf\x59\xdc\xf7\xbb\x6a\x7e\x31\xe6\xfb\x45\x37\x70\xf3\xee\xb5\x58\x92\x57\xdd\xcf\xba\x63\x6e\xd6\xfd\x52\x68\x55\xd7\xc2\xeb\x45\xf7\xd5\x70\x7d\x9b\x87\xf3\x7a\x10\x46\xd3\x45\xbb\x9e\x71\x9f\x77\xfd\xec\xcf\xe3\x08\x7b\x18\xce\xe9\x41\x1c\x33\x86\x5a\xcb\xca\x51\xe8\x09\x77\xc2\x1d\x0b\xd7\xa2\x65\x9d\xce\xb8\x43\x21\xf3\xb1\x74\x91\x1b\x0e\xc5\x5a\x9a\x76\x9f\x70\x87\xdc\x62\xac\x9b\x51\x76\xdb\x2d\x86\xcc\x71\x21\x6c\xdf\xc2\xd1\x2e\x5b\xcf\x85\x30\x8a\x2e\xc6\xe6\x61\xcf\xd9\x9f\x87\x2b\xf4\x61\xb8\x82\x28\x97\xea\x87\x2d\x96\x23\xe3\xaa\xbd\xa7\x23\x8c\xc5\xd0\xb2\x87\xa1\x04\x65\xbd\x2f\x86\x7d\xbc\xe4\x4e\xc4\x4c\x7a\x3a\x6e\x7d\xb6\x8e\x6e\xc6\xcd\x84\xe8\x16\x63\x89\xad\xb8\xae\x0e\xd7\xfa\xd5\x91\xce\x63\x66\xb5\x58\x5b\xe5\x19\x32\x1d\xaf\x5c\x16\xc3\x35\xf9\x85\x58\x47\xc3\xb0\x15\x0b\xeb\x9c\x08\x31\xed\x86\xd2\xe6\x61\x1c\x5f\xac\xb9\x56\x67\xa1\xf4\xbc\xe8\x87\x65\x8e\xc5\xba\x78\xb2\x71\xbe\x15\xe5\x99\x0d\x7d\xc4\x20\x5c\xcb\xd0\x76\x67\xe3\x99\x52\x8e\x0d\xfa\x75\x5d\x5c\x08\xff\x3f\x11\x4a\xb2\x10\x6b\xb7\x28\xff\x6c\x7d\xd6\x95\xed\x7b\x3d\xf6\xa9\x0b\xa1\x4f\x59\x88\xdf\x5d\x8b\xe5\x31\xf7\xe3\xf5\x99\xdc\x0b\x35\x72\x22\xb4\x95\x41\x2c\xc7\x89\x98\xf5\x07\x49\x5d\x8d\x42\x84\xe5\x39\x5d\xf6\x68\x79\x58\xba\x1f\x5b\x59\x1e\xf2\x9c\xc5\x35\x86\x75\x2f\x3f\x8c\x59\xe7\x44\x3c\x6e\x1a\xf6\x3f\x0c\xd1\x17\xad\x78\x18\xda\x58\xb1\xec\xcb\x6e\xe0\x0e\x85\x73\xa9\xea\x17\xca\xbe\xe0\x58\x23\xcb\x8d\xc6\xce\xd9\xe2\x1c\xe9\x85\x5a\x20\xb3\x4d\xd4\x67\x7a\xd5\xfb\x57\xe3\x9f\xbe\x7b\xd5\x7d\xc1\xfd\x9d\xd8\xa7\x9d\x88\xbd\x66\x3e\xb6\x65\xde\x8b\xad\x5f\xae\x8f\x63\x99\xc9\x4f\xb8\x85\x3a\xb7\xf7\x43\x0f\x9b\x37\xce\xaa\xb2\x56\x16\xe2\x39\xf0\x48\x58\xd2\xc2\x15\xe6\x7a\x6c\x29\x65\x8b\x9a\x8d\xf9\xba\x3c\xbe\xa3\xb8\x7c\x3a\xa2\x5c\x08\x67\xb6\x35\x46\x93\xbf\x9d\xc4\x5f\x8e\x69\x2e\xd4\xfd\xfc\xb0\x6e\xc3\xa3\x70\x54\xac\xde\xda\x52\x2c\x5f\x5e\x8f\x18\xca\xcf\xc3\xd8\x9e\x16\x92\xbc\x3e\x88\xb5\xb2\xeb\x7e\xc6\xcd\x86\xa3\x32\x8c\x7b\x58\x18\x1b\xa7\x96\xb5\x56\xd4\xec\x6f\xc7\x91\x0f\xe3\xbe\x85\x18\x65\x2f\x46\x66\x71\x7f\x03\xf7\x73\xe1\xc8\x56\x7d\x5e\xb1\x4c\x27\xc6\x5e\x94\xfb\xd5\xb8\xf7\xd9\xb8\xc4\xa8\x1e\xf7\xf4\xeb\xf2\x16\xaf\xcb\xe1\xce\x4f\x31\x56\x5a\xa8\xc7\xb6\xb3\xa1\x36\x86\x49\x49\x8a\xbc\x39\x8a\x6d\x74\x27\x94\x7f\x31\xec\x73\x14\x33\xfb\x28\xc6\x30\x9b\x9c\xff\x27\xc2\x3a\x83\x90\xe7\xcb\x48\xaf\xd7\xa3\x80\xd1\xd8\x95\xe1\x62\xbc\x1a\x9f\x8d\x6d\xad\xef\x3a\xc9\xb5\xd5\x28\x39\x07\xca\x39\xb3\x31\x23\x15\xdb\xde\x75\x7f\x2f\x7c\xf3\x0f\xc3\xd4\x30\x6c\xa5\xd8\xfe\x6b\x75\xc6\x2d\xe6\xbc\x1e\x46\xfa\xa3\x50\xe6\x25\x37\x72\xaf\xb9\xd7\xdd\xa5\x78\xee\x57\x6d\xa9\x28\xe7\x3f\x0b\x65\xb8\x10\x5a\xcd\xa8\x71\x1d\x71\xa1\xee\xd7\x7f\xd5\x59\x38\xc3\xaa\xd7\xa1\x70\xd4\x9a\xaf\x9f\x0c\xb5\x97\xce\x61\x6a\xe1\x43\x7a\xee\xe2\x3c\xf9\xb0\x6f\xf7\x7f\xf5\xe3\xfd\x99\xe2\x0c\x7d\xa8\xce\xac\xc3\xd8\x9b\x57\x7d\xfa\x52\x9d\xfb\x2e\xc4\xe3\xd2\x0b\xed\x65\x29\x46\xdf\x0f\xff\x1f\xc5\xbe\xb9\xaa\x97\xa5\x50\x63\x65\x4d\xac\xb8\xf3\xee\xf1\x90\x7b\xca\xbc\x75\x21\xf6\xe1\xc3\xfa\x7c\x65\x5e\x3f\x6e\x63\xa9\xee\xe9\xcb\x25\xca\xef\x87\x8d\x51\x5f\x3f\x96\xb3\x6a\x95\xff\x41\x28\x45\xb5\x64\x3a\x62\x5c\x08\x63\xb2\x0b\xf5\xf9\xb8\x14\x8f\x52\x59\xca\xa5\xf8\xbe\x5b\xe7\x91\x5e\x5d\x76\x46\xc2\x65\x96\x1d\xd6\x71\x2d\xc5\x23\x5e\x96\xf1\xd9\x50\xde\x62\xfb\x17\xc3\x9c\x85\xb8\x9f\x62\x99\x6b\x6e\x37\xc6\x36\x88\x7b\x1b\xd4\xad\x7f\x29\xc9\x28\x4b\xf5\x28\x75\xb7\xde\x77\xb9\xff\x7e\xbd\x44\x95\x8d\x8a\xfc\xf2\x62\xdc\xd6\x72\xcc\xea\xe5\xd6\x2c\xcc\xed\xc7\xba\x1c\xc6\xbf\x51\xec\xa3\xaa\xfd\x2f\x25\x6d\xb8\xaa\xaf\xf4\x08\x8c\xe2\x52\x45\x24\xd5\x71\xa8\xe6\x0d\xdd\x17\xc3\xfa\xc5\x1a\xb3\x75\xc9\x5f\x0d\xe7\xd6\x6e\x2c\xdd\x20\xd6\xe3\xa8\x6e\x15\xdf\x88\x59\xbe\xaa\xef\x51\x72\x2e\x17\x73\x7e\xa1\x3e\xd6\xc3\xb8\x04\xd7\x58\x83\x64\xbb\xe4\x40\xb6\x55\x66\xfc\x51\xec\x65\x8b\xb5\x0e\xc7\x3e\x78\x54\xc7\xf8\x4a\x3d\x7e\xfc\x72\xec\xdf\xaa\x11\x1a\x63\x9d\xa5\x70\x0d\x5c\xd4\xff\x6a\x28\xe1\x2f\xd4\xc7\xe7\xb3\x49\xbb\xae\xf2\x4a\x59\x4f\xbd\x58\xaa\x51\x72\x37\x72\x18\xfa\xd6\x61\x3c\x83\x16\x93\xba\xdb\x0d\x9f\x7a\x49\x6e\x4a\x6b\x7b\x21\x8e\xbc\x16\xc6\x32\x7d\x75\xbd\xf1\x6a\x5d\xdb\xdc\xd1\x28\x73\xfb\x6b\xa1\xbc\x65\x66\xdf\xad\xf3\xea\xb5\x90\xc5\xb8\x0a\xeb\x87\x36\xbc\x10\xa2\x7e\x2a\xe9\x31\xab\xd6\x76\x2a\x5c\x6d\xb3\x8f\x74\x14\xf8\x5b\x63\x57\x1f\x83\x38\xca\x1f\x36\xe6\x94\xf5\xfd\x8f\xe3\xf4\xb5\xb8\x2e\xd1\x8c\x62\xa6\x28\x5e\x12\x4a\x37\x0c\xd7\xeb\x45\x3e\xde\x6d\x6c\x7d\xe4\xbe\x9c\xf4\x2e\xcf\x37\xc6\x1d\xe9\xab\x3f\x16\xc5\xe0\x8e\x77\x94\x46\x75\x5d\x0e\x62\xcd\x8d\x6f\x65\xfc\xda\x6c\x78\x87\xed\xa5\x35\xb1\x77\xaf\xfb\x5d\x41\x5e\xdc\x67\xbb\x65\x0b\xfd\x42\x72\x6d\x53\xb6\xdf\x41\x72\xd5\x34\xac\x8f\xfe\x68\x9f\x12\xed\x77\x05\xc5\xdd\x94\x61\x63\x54\x91\x96\xb7\x59\xea\xa1\x7b\x31\x99\x1a\x35\xd6\x60\x7b\xd6\xb8\x3e\x2d\x3e\x7d\xb6\xbe\xfb\x38\x6c\x5c\xa1\xbd\x96\x4c\x8f\xc6\xae\x79\x47\x71\x4c\xda\x2c\xff\x70\x4f\x8d\x0f\x62\x66\xff\x5a\x7d\x8e\x34\xef\x4f\x0e\xc3\xb5\xd8\xf8\xdc\xc1\xd8\x11\x59\x18\x3b\x7a\xdc\xed\x4b\xf7\xf6\x95\x46\x49\x86\xee\xef\xd7\x57\x1d\xa3\x7d\xea\x7a\xd8\x18\x87\x8c\xc6\xda\xc1\x78\x4b\x3f\xba\xe7\x18\x0c\x62\xf6\xdb\xdd\x27\xa6\x74\x1f\x83\x38\x32\xa5\xa5\x8d\xc6\xda\x67\xb5\xaf\x5e\xa8\x8b\x5f\xdf\xa7\xfd\x8e\xdc\x2f\xbb\xaf\xd4\xa5\xbd\x56\x47\xb3\x1b\xda\x59\xb5\xcc\x6e\xe3\xbc\x66\x74\x55\xd4\xdf\x46\xdd\x2a\xcb\xd7\xe7\xc3\x7d\x53\xca\xdb\xdf\xf7\x08\x5c\x8b\x5b\xcc\xc3\xb5\x66\x1e\xb6\x94\x37\xee\xd9\x8e\xdc\x47\x9c\xb9\x2f\xba\x5f\xaa\xa3\x18\xb9\xe7\xdd\x7f\x18\xa7\xa6\xe3\x95\xe6\x6e\x78\xaa\x34\x72\x2b\x75\x5f\x30\x8a\xd7\x36\xa1\xbf\xce\x66\x62\xd6\x4b\x5f\x5f\x09\x11\xed\x9d\xff\xff\x85\x57\x59\xc3\xd5\xd8\x6d\xd4\x68\x37\xd5\xa8\x61\x14\x7b\x1d\xae\x91\x86\xe1\xec\xed\xd5\x99\xaf\x37\x96\x25\x7e\x29\x39\x37\xfb\xf5\x53\xb9\x6a\xdc\x71\xa1\xbe\xb3\xd4\x0f\x57\xa7\xc7\xc2\xfe\x67\xc3\x15\x49\xf9\xfa\xa9\xe4\xf3\xfe\xaf\x5e\x58\x3e\xdc\x87\x0d\xd7\x3b\xe5\x6b\x71\x9f\xff\x17\xaf\x9f\x8f\x8e\x21\xdc\x35\xca\xfe\xaf\xba\x55\x97\xe3\x9a\xa5\x7a\x0c\x33\x70\x8f\xd7\xdf\x3c\x1f\xbf\x1b\xc4\x7b\xc7\x4b\xf5\x28\x64\x54\x8f\x28\x07\x71\xab\xe9\x99\x68\x8d\xf3\x6e\xa9\xf1\xbe\x54\x5f\x87\xec\xd4\x9f\x96\x1a\xcb\x0d\xea\x3d\x70\x65\x37\x4a\xf6\x38\xac\x97\xdd\xaa\x97\x2b\xa6\x9e\x69\xac\x5f\x5d\xdd\xf6\x62\xd6\x7b\x3c\x9c\x91\xd5\xd8\xf7\xc5\xb8\xa5\xf2\xe8\xee\x36\xc6\x72\x55\x1c\x17\xe2\xfb\x6f\xb8\x41\x5c\xbe\x1a\x6d\x0e\x1a\x75\x91\x46\x57\x8d\xbc\xca\x7c\xd0\x6f\x94\xa8\x7c\xbd\x98\x9c\xaf\x4b\xc9\xd2\x55\x4d\x2c\x25\x23\xf1\x41\x1c\xef\x0c\xe3\x78\xa8\xaa\xeb\xa5\xfa\xc9\xf2\xf8\xd6\xaf\xd5\xa3\x98\x66\xee\x7c\x22\xee\x35\xcd\x47\xbb\x75\x6d\x16\xed\x70\xb5\x1e\x15\x2c\x35\x9e\x79\x8c\xc7\xd8\x6b\x64\xd8\x8b\x71\x4c\x5c\x7d\xbf\x5b\xdf\x95\xa0\x05\x8d\xc6\xe2\x2e\xcf\x87\x17\x43\xc4\xdf\xa8\xb7\xfd\x5b\xc9\xd5\xf3\x52\x52\xf2\x2a\x9b\x0e\x1a\x47\x87\x3e\xe4\x17\x62\x24\x33\xee\x13\xf1\x2a\x33\x0f\xd7\x8b\x45\x04\x87\xc2\x79\x97\xbb\x43\x6e\x35\xdc\x19\x79\x31\x3e\x81\x9e\x89\x6a\x6b\xb1\xb8\x4a\xcb\x6e\x85\xab\x9b\xa1\x7b\x3a\x8e\x7a\xef\x0e\x3d\x69\xd5\xf2\xbe\x96\xf4\x1e\xeb\xf5\xe7\x17\x93\xb3\x7d\xb7\x71\x0d\xc1\x59\xdf\x1c\x19\x0c\xe3\xb8\x98\x65\x78\x76\xf6\x4a\x23\xd3\x0f\xea\x27\x1f\xe5\xf4\x2b\xe1\x7b\x9e\xeb\xed\x24\x77\xe2\xab\x35\xfe\x69\xb2\xb5\xf4\xc8\x8f\xea\xb6\xd0\xe8\xc5\xb2\xf7\xdc\x09\x77\x2d\x3c\x43\x1a\x34\xce\xa1\xd1\x3e\xf7\xc1\x9b\xf7\xfe\xf6\xce\x63\x9d\x6f\xfe\x88\xb5\xf7\x7b\x95\x3d\xe5\x37\x93\x2d\xed\x2d\x43\x35\xe7\x4b\xc9\xf4\xf8\x52\xa3\xc6\x9c\x51\x78\x4e\xdb\xfc\x6e\x94\x4c\x8d\xc2\xfd\xe4\x63\x75\x36\xae\x9e\x13\x5d\x88\xe3\xef\xd9\xf0\x8c\x6c\xe0\x5e\x4f\x9e\xc9\x0c\xe2\xa8\xa6\xac\xc3\x13\xa1\x45\xe5\xe1\xfb\x3c\xd4\x5e\x1e\xee\xf4\x0d\xe3\x5d\x5b\xce\xfd\xea\xc9\x98\x8f\xd7\x93\xe5\xbd\xdf\xf2\x9a\xa1\xbc\xe3\xd5\x0f\xf7\x4c\x2d\xb4\x8e\xff\x34\xf4\xc6\xcf\xc6\x25\x46\xf1\xae\xda\x6c\xb8\x8e\x29\xda\x5a\x3f\xbb\x59\x5f\xab\x2c\xd4\xd7\x71\x0b\x61\x54\xbf\xeb\x1e\x76\xdb\x21\x9e\x5e\xbc\xaf\x59\x96\xa7\x5f\xdf\x37\xfc\xcd\x70\xa7\xa6\x17\xaf\xda\xbf\xd8\x68\x77\xc3\x3d\x63\xdf\x61\xe3\xd9\xf7\x70\x9f\x25\x47\xfb\x8e\x37\x07\x77\x18\xd9\x95\xef\xdf\x68\x9c\x1b\xf4\xb4\x83\xc6\x58\xe9\x42\x7d\x27\xff\x7f\x8b\xcb\x9d\x70\xe6\xfe\x69\xfc\xb4\x37\xaf\x0e\xe2\x75\x4f\xb9\x67\x4b\xce\xb0\x81\x3b\x37\x56\xa6\x41\xb8\x5f\x3a\x6a\x9c\xaf\x83\x7a\x84\x35\x18\x7b\x96\x36\xd8\x77\xe4\xce\xf4\xef\xd4\xcb\xcd\x24\xcb\xfd\x76\x32\x16\xdc\x5b\xd2\x41\x52\x83\xff\xbc\x3e\xb7\x06\x63\x75\x36\x68\x2c\x57\x4e\xbd\xd8\x18\xe7\xbf\x32\x16\x57\xb3\xbc\xfd\xfa\x8e\x3e\x57\x38\xbb\xc9\xfd\xd3\xf4\x9b\xea\x35\xdb\x68\x11\xbb\x71\x94\xd2\x3c\xb2\x55\xc6\x1b\xc6\x31\xed\xe2\x58\x94\x55\x76\x3c\x17\xef\xbc\x0c\x92\xa7\xbe\xd5\x79\x58\x1e\x9b\xc5\x78\x9c\x9a\x35\x4c\x4f\x30\x48\x9e\xcf\x8d\x1a\x4f\xe2\xca\x25\x1f\x8c\xfb\xbd\xd6\x38\x32\x16\xb7\xf1\x5b\xf5\x9a\xff\x2c\x2e\x31\xfe\x1a\x25\x0e\x24\x8d\xf0\x7a\x52\x07\xc3\x46\xcd\xee\x36\xda\x4c\xb9\xc4\xf5\x78\x1d\x37\x18\xbb\x2e\x1a\x34\x9e\xfb\x8f\x1a\x6d\xf2\x3f\xaa\xef\xa4\x7c\xa1\xf1\x7d\x79\xa7\xf8\x42\xb2\xd6\x28\xd9\x6f\xda\x23\x95\xaf\xaf\xd5\x7b\x5c\xac\xef\xf2\x0e\xf7\x44\x44\x34\xe9\x71\xba\x16\x5a\xc3\xdf\xab\xdb\xe3\x6e\xbc\xef\x5b\xde\x97\xfd\x8f\xc3\x3e\xfb\x63\xf5\x35\x18\x7b\xe6\xca\x3e\xbe\x1a\xb7\xbe\x52\xd7\xcc\xf8\x73\xed\x41\xb2\x27\x62\xab\xce\xbd\xe6\xf1\x18\x36\xca\x4c\x8b\xff\x4a\x32\xc6\x5e\x0c\x67\xc0\x70\xac\xf5\xed\x36\x8e\x19\xf7\xab\xbe\x16\x3e\xff\xc6\x58\x7d\x0c\xe3\xfd\xfc\x41\x63\x8d\xaf\xc6\x9e\x73\xb7\x5e\x7f\x14\x3e\xa7\xd9\x70\xd8\xc8\x85\x0b\xee\x57\xe3\x7d\xf0\x41\xe3\xca\x6f\x18\x4a\xd8\x9c\xc3\xda\xfd\x98\x35\x86\x6e\x98\xfd\x0f\x71\xee\xf8\x53\xdf\x61\x52\x9b\xfb\x1d\x55\x5e\xfb\x8d\x37\xf7\x5f\x63\xef\x9d\x0e\xae\x83\x58\x27\xfd\xfe\xc5\x0f\xd9\xf6\x70\x9f\xe5\xf7\xee\x73\x3c\x6f\xfe\xa8\x32\xfe\xa8\x7d\x0c\x93\xf3\x73\xb8\xcf\x3d\xab\xf5\xb1\xc8\xc6\xd7\xdb\x2f\x2f\x8f\x92\x1e\x6d\xbf\xb3\x67\xfc\xa8\x0c\xea\x2b\xf7\xf1\x9e\x73\x7c\x84\xb6\x37\xca\xbd\x7b\xd9\xbf\x0e\xf6\xef\x5f\x07\xfb\xca\x24\x96\xbd\xd6\x38\xb2\xc3\x46\x5e\xd8\xbf\x45\x8c\xee\x70\x24\xcb\xe5\x5f\x1d\x2b\xe9\x30\xe9\x29\x76\x93\x35\x46\x7b\x6a\x7d\x7c\xbd\x7e\xfd\x7d\xa5\xbf\x9e\xda\x53\x7b\xe3\x67\x42\xf3\xf5\x6b\x8d\x68\xd2\xbe\xb2\x79\xb7\x70\x54\x1f\xe7\xe1\x3e\xf9\xaa\xf9\xfa\xe5\xf0\xdd\xc5\xb1\x8c\x4f\xa6\x1a\x3f\xba\xc3\x3d\x7b\x1a\xec\xd9\xcf\xa8\x51\xbb\xc3\x46\x7c\xa3\x46\xae\x2e\xae\x28\xfe\xc1\x9e\x3d\x55\x67\xe9\x2b\x75\x76\x4e\xdb\x4d\x29\x11\xd3\x6b\x21\xee\x6f\x7e\xad\x1e\x27\xa7\xf5\x30\x5e\x0b\xbb\x8d\xe3\xb5\x5f\xce\x2c\x97\xbc\xb6\xa7\xee\x88\x76\x30\x76\x8f\x7e\x30\x76\x57\xf5\x57\x63\x04\xd5\x9e\xbf\xd1\x28\x0f\xdb\x18\xd6\x77\xb2\x38\xa7\xe9\x6b\x7b\x0d\x19\x59\xfc\x3d\x96\x1c\xd9\xe6\x18\x75\xb7\x71\x94\xca\x79\x8b\xf5\x9a\xa3\xba\x7f\xd8\x8d\x4b\x54\x2a\x79\x37\x29\xc9\x0b\x8d\x6b\x89\x41\xb2\x76\x73\xee\xa0\xbe\x87\x34\xac\xdb\x66\xf9\x7d\x75\x77\xef\x1f\x86\xef\x77\x93\xac\xff\xd0\xbe\xe7\x60\x73\xea\x62\xd0\x3c\xc5\xd6\xcb\x11\x5e\x3f\xdc\xad\x2b\xcb\xf0\xda\xd8\x98\xa4\x98\xf7\xb9\xa4\x16\x9e\x69\x1c\xc9\x61\xdd\x7e\x06\x63\x39\x6c\x98\x3c\x09\x1a\x46\x49\x31\x4a\xee\x9c\xec\xc6\xb3\xb5\xd9\x6b\xad\x25\xeb\x96\x3d\xe7\xd5\x70\x94\x87\xe1\x89\x60\xda\x4e\x7a\xc1\xb4\x0f\x62\xf9\x17\x93\x56\xbd\x15\xee\x2b\xf5\xc3\xf7\x4b\xf5\x58\xa7\x3a\x63\x5e\x48\x8e\x3b\x77\x2a\xd2\x5a\xda\x0a\xef\xaf\xc4\x4c\xf2\x62\x2c\xef\xf3\xf1\x5e\xdb\xb1\x20\x00\x87\xee\xd9\xe0\x65\x8e\xc5\x3e\xad\x32\x17\x16\x14\x63\x1e\x34\x54\xa9\x1c\x2c\xc8\xfb\x3c\x94\xf5\xf9\xb8\x0f\x8b\x36\xc8\x62\x7f\x68\xe1\x0e\xdd\x74\x7c\xca\x33\x8a\x23\xd7\x9e\x5b\x70\xe7\xdc\x79\x67\xee\xd5\xb0\xec\x20\x2c\x31\x48\xa2\xb1\x7a\x74\x30\x74\x1b\x61\xcf\x8b\xc9\x36\xad\x5e\x62\x36\x58\x9e\xd7\xe2\x93\xdc\xf2\x09\xf5\x20\x0a\x90\x5e\x2c\xf3\x6e\x30\x31\xb3\xf1\xe9\xf5\x20\xd4\xf7\x62\x3c\xef\x47\x51\x3b\x96\xeb\x95\x16\xec\x44\x3c\x46\xdc\x4b\xb0\xfa\xee\x7d\xd5\x5b\x56\x4f\xc0\xe9\x2d\x8e\xc5\xfb\x9b\x95\xac\x9a\x09\x77\x9b\x66\x43\xb4\xd5\x08\x7e\xa9\xde\xca\x85\x78\xfd\x3a\x08\x57\xe7\xd6\xb8\x63\x54\x95\xb3\xba\x67\xb3\x9e\xdc\x05\x1f\x25\xe7\x64\xb1\x95\xf2\x4e\x66\x3f\x19\xcd\x7f\x35\xd8\x22\xab\x9f\x26\x2e\xb8\x0b\xee\xf5\xe0\x47\x17\xdc\xc3\xb1\xad\x95\x6b\x2f\xc6\xda\x58\x8c\xf7\x4f\x77\xdd\x4f\xc7\x3a\x2d\xb6\xf6\xb3\xa1\xbc\x0f\x07\xc5\x55\x8c\x6b\x2f\x64\x37\xc2\xd9\x35\x8a\x57\xe3\xd5\x13\x98\xd2\x2c\x95\xd7\x2a\x16\x9e\xf2\x95\x47\xee\xab\x61\x4f\x0b\x21\xca\x85\xba\xfc\xfd\xd0\x6a\x2b\x37\xf9\x33\xee\xe7\x1b\xfd\xfd\x52\x68\x1d\xbf\x58\x5b\xb1\xb4\xed\xf6\x93\x91\xd4\x6c\xd2\x87\x8e\x67\xfd\xc1\xbe\xd9\x61\xbf\xde\x6b\xe1\xaf\xb5\x85\xe6\xda\xf9\x87\x5c\x97\x3e\x31\xb6\xec\x9d\x7a\xcc\xf1\xf5\xf3\x3b\x2c\xc7\x16\xf6\xbb\xd2\x4a\x73\xd2\x5e\x11\x3a\xdc\x33\xae\x18\xc6\xb1\x1e\xd9\x66\xff\x08\xf7\x8b\xe1\xc3\x46\x00\x7b\xc7\x61\x1f\x56\x8b\x1c\xed\xd9\x38\xe7\xc5\x38\x55\x95\x78\xef\xd3\xe6\xea\xd3\xa7\xef\xb0\xe7\xbd\xa5\x1b\x1f\x8b\x56\xdf\x2d\x35\x6a\x6a\x58\xe7\xf8\xc1\x9e\x5f\x35\xec\x17\xc9\x70\xac\x66\x87\xfb\xcc\xb9\x53\x6d\xbe\x36\x76\x34\x06\x8d\xe9\x61\xe3\xae\xe6\xde\x9a\x4e\x7b\xd2\xea\xbb\x97\xe2\xa7\xea\x1e\xe8\x97\xf6\x5c\x29\xef\xad\xff\xe1\x58\xbf\x9f\x96\x7e\xfc\x97\x15\xd7\xf6\x1d\x9b\xa4\xaf\xa5\x3d\x25\x1d\x5f\x66\xef\xbd\xd5\xfd\xb6\x37\x74\xab\x63\xd6\xba\x1a\x65\x5c\x1a\xab\xfb\xf5\xb1\xb1\xe0\xde\x63\xb3\x5f\xed\xed\x77\x4c\xf6\xbe\x46\xf5\x58\xee\xda\x1d\xd6\x18\x26\xa3\xc5\xdd\xc6\xf9\x95\x8e\x6b\x3e\x3c\xe7\x0c\xea\xa7\xa9\xfb\x8f\x20\xf7\xb6\xb8\xf4\x6f\xd4\x68\x0b\xe3\xb1\x3d\x53\x2f\x33\x68\x8c\x69\x19\x83\x7d\x72\xcf\x56\x07\xf1\x0a\x85\x32\x7c\x33\xfc\xff\x5a\xf2\xac\x6a\x50\x5f\xbf\x8f\xd7\xfb\x68\x6c\xd4\x9d\x8e\xce\x87\x7b\x7e\xb9\x31\x48\xc6\xab\xa3\xb1\xda\x1b\xcf\x53\xc3\xa4\x84\x7b\xaf\xb9\x07\xf1\x39\x08\xf9\xb1\x59\x53\xfb\x5f\xa3\x0e\x1a\xfb\xe4\xd9\x41\xf5\x0c\x77\xb7\x31\xf2\x6d\x3a\x82\xdd\x86\xa0\x1f\x36\xca\x57\xbd\xae\x25\x2d\xfb\x1f\xc6\xa7\x6c\xc3\xe4\x19\x04\x4b\xf7\x1a\x47\xfa\x7a\x1d\x45\x5a\x1f\xaf\xed\xf9\x2d\xd0\x78\x0c\xbb\xf5\xfd\xf9\x32\x8a\xaf\x36\x4a\x3b\x1c\x6b\x07\xd5\xf9\xba\xdf\x93\xfe\x41\x72\x85\xf3\x5a\x9d\x8d\x46\x8d\x16\xb9\xf7\xce\x0d\xaf\xd7\xdd\xd7\xdc\x2b\xc9\xf2\x7b\x5b\x7e\xaf\x2e\xd9\xa8\xd1\x22\x46\xf5\xb7\xc3\xe4\xda\xbf\x79\x87\x79\xd8\x38\x73\x86\x8d\x73\x75\xbf\xb3\xe6\xce\x6d\x66\xd4\x38\xaa\xfb\xaf\x3b\x5d\x0b\xa5\x61\x18\xc5\x71\xf5\xf4\x93\x71\x89\xf2\x77\x3d\x8b\x61\xcc\xf7\x53\xd9\x7b\xf1\x3e\xee\x30\x8c\xf7\x2a\x09\x9d\x46\x37\x93\xec\xaf\x1a\x09\xf6\xe3\x39\xd6\x0f\xcf\x52\x4a\x6b\x9a\xb6\x77\x8e\x7b\xf9\xbb\x20\xae\x83\x2d\x7a\xfa\xaa\x24\x83\x98\x4d\x2c\x89\xb8\x1a\x9d\xf1\x7c\xa6\x8c\xa0\xfc\xa5\x6a\x39\x02\xeb\x85\xb9\xbb\x71\x9c\x48\xa6\x58\x0c\xa5\x2f\x7f\x7d\xfa\x4b\xf1\xfa\xe6\xa9\xd0\x4a\x87\xe1\x9a\xb4\xdf\x68\xfd\xbf\x59\x97\x78\x54\x6f\x63\x10\xaf\xe3\x46\xf1\x9e\xeb\xb5\xd8\x3e\xfb\x2e\x77\x9f\x8d\xda\x91\x6b\xc7\xdd\x78\x7f\xb0\xbc\xc3\x5e\x4d\x55\xff\x1f\x25\xf3\xca\x6d\x96\xd9\x73\x26\xec\xed\x13\xee\xc7\xdd\xc0\x5d\x89\x11\x94\x67\x55\x3f\xde\xe5\x2e\xaf\xa2\xaa\x3b\xf0\xbd\x58\x4f\xdc\xb5\xec\xc7\x5f\x1b\x94\xcb\x1d\x1b\x13\x09\xfd\xb8\x76\x3f\xb9\xb6\x19\xc4\xf9\xc3\xc6\xef\x5b\xfa\xf5\x1e\x86\x61\xeb\xe9\xd5\xdb\xde\xf7\x61\x72\xec\xfa\x89\xf4\x4a\x7f\x07\xd5\xab\x4b\x4b\xab\xec\xd7\x67\x49\xaf\xde\xdb\xa0\x8e\xb4\x8a\xa7\x97\x44\x5d\x9d\x51\x57\xc2\xd4\x6f\x24\x67\x62\x3f\xbe\xf7\xea\xdf\xe5\xf4\xe3\x56\x86\x71\x0f\xbd\xf8\xf4\xb9\x9f\x3c\xc1\xe8\x25\xd9\x62\x26\xa9\xa9\x5e\xfd\xbb\x8d\x6a\x9c\xd3\x73\x3b\x71\xcb\x69\xdc\xbd\x68\x29\xb7\x92\x3a\x18\xc4\x3a\x6b\x3e\x29\x29\x8e\xf4\x67\x92\xd8\x7a\xf5\xef\x86\x7a\x49\xee\xec\x25\x5b\x19\x25\x11\x8f\xe7\xad\x34\x7b\xf5\x92\xc8\xab\x2d\x7d\xb9\xb1\xff\x5e\x3c\x1a\xa3\xb8\xf7\x51\x5d\x4b\x65\x1d\x6d\xba\xdd\xba\x55\xf5\x1a\x47\xa0\xfa\xbd\x58\xb9\xec\x52\x7c\xaf\x22\x5f\x4a\xf6\x3d\xd8\x53\x56\xea\xbd\x57\x8f\xd3\xfb\xc9\x54\xb9\xe6\x43\x51\xb0\x56\x25\x2f\x8f\xf5\xa8\x6e\x1d\x23\xf7\x4a\xdc\x6b\x55\x43\xbd\xba\x4c\xb4\xe6\x41\x72\x47\xbc\xca\xbe\x4b\x7b\x8e\x30\x7d\x44\x3f\x69\x4b\xbd\xa4\x27\x29\x97\xde\x1d\x7b\x3a\x5f\xd5\xe3\xaf\xd4\xf5\x30\x4c\x5a\x33\x6d\xa2\xd8\x5e\x65\x6c\x7b\x49\x9e\xaf\x2c\x49\x55\xf3\xfd\xba\xe5\x0f\xea\x7d\x97\x25\x7a\xa9\xf1\x3b\xbf\x5e\xac\x81\x5e\x6d\x58\x77\xe3\xef\x47\x87\x21\x07\x2d\x05\x63\x9a\xd6\xe8\x6b\xf1\xa9\x74\x75\xbe\x8c\xea\x96\x31\x4c\xda\xc8\x20\x66\xcd\x5e\x72\xee\xf6\x6a\x9b\xd4\x8b\xe5\xee\x37\xae\xc1\xb6\xeb\x23\xba\x14\x22\xe9\xc7\xe5\xf0\xe3\x55\x49\x87\x8d\x25\x07\xc9\x56\xfb\xf5\xaf\x9e\x7a\xee\x0b\x75\x54\xd5\x6f\x1f\x4b\xd5\xd3\x4f\xce\xe2\x74\x3c\xb5\x1b\x5b\xef\x70\xcf\x6f\xa2\x7b\x49\xfb\x18\xd6\x31\x0d\x1b\x67\x47\xbf\x61\x30\x96\x92\x6f\xf8\xed\xe2\xa8\x6e\x21\xcf\x87\x91\xc2\xb5\x98\xe3\x77\x63\x49\x9a\xa3\xbb\xf2\xb8\x57\xfe\xa8\xfc\x6e\x27\xd6\x40\x2f\x8c\x8f\x7a\x75\xcf\x87\x34\x1a\xd6\xd9\x81\xb6\x97\x4a\xfe\x6a\xbb\xfd\x38\xb7\xca\x15\xc3\xfa\xee\x5b\xcf\xfd\x93\x64\x2c\xc8\xb7\x83\xb1\xdf\x06\x94\xe3\xc7\xea\x5c\x5a\x8a\xe7\xea\xc8\x6d\xd5\xc7\x7c\xa9\xbe\xa7\x5e\xd5\x69\xf5\x3b\x84\xa5\xfa\xb7\x92\x95\x02\xfb\x47\x49\x5f\xd3\x0f\x35\x32\x48\x5a\xd4\x52\x5d\xe2\xa5\x70\x3d\xf3\xe5\xe4\x7e\x6e\xd5\x06\x7a\xf1\xbc\x19\xc6\x36\x53\xf5\x97\xa3\xda\x78\x8f\x62\x4d\x8f\x6a\x5f\x57\x1d\xdf\xd1\xbe\xd7\x65\x69\xcb\xde\x8e\x6d\xf2\x95\x64\x99\x6a\xec\xb5\x14\x97\xf9\xc7\x8d\x9e\x7c\x50\x47\xcc\xf8\x6c\x29\xc6\x34\x4a\x72\x6b\x59\xae\xea\xe8\xec\x06\x47\x9d\xde\x3b\x2f\xcf\xeb\xd7\xe2\xa7\xf4\xfe\x70\xaf\x71\xd7\xbc\xfa\x6d\x47\x75\x14\x2f\xb8\x57\x6a\xe3\xc5\xdd\xd3\x32\x37\x8c\x6a\xc7\x3f\xaa\x7f\x69\xd0\x4b\x7a\xa7\xa5\x3a\x67\x2c\xc5\xe3\x7f\x2d\x5c\xef\xec\xc6\x1a\xdd\x8d\x6d\xf3\x42\xfc\x6d\x4c\xf5\x8c\x7d\x89\x5e\x7e\xea\xa6\x3b\xe4\x1e\x4e\xea\xaa\xac\xe1\xcf\xef\xb9\xdb\x3a\x70\x47\xe3\x34\x96\x7b\x34\xf6\xce\xeb\x97\xe2\xdc\x0f\x97\x08\x83\x46\xbd\x34\xe7\x37\xa7\xf7\x8e\x75\x7b\xf5\xbf\x1b\x50\x94\xf8\xfa\xd8\x12\xc3\xa4\xdc\xe9\xaf\xc8\xf7\x2b\x03\x2d\xe1\xc5\xb1\xa8\xab\x65\x36\xc2\xff\x9f\xaf\xcf\xa8\x41\xb8\xae\xcc\x93\xad\x5a\x72\xc7\x39\xbd\xc2\x5a\x48\xca\x51\x8e\xb8\x7f\xbb\xde\x43\x7f\xec\xca\xa7\x79\xed\xcb\xdd\x81\x0b\x8d\xeb\xd3\xf1\x9a\x1e\xed\xb9\x82\x5a\xac\x3f\x2f\x36\xfe\x3d\x98\xf4\x95\x27\x6b\x3c\xb9\xef\x12\xcd\xeb\xd6\xea\xb5\x9a\xdc\xad\x1d\x24\xbf\x9e\x19\xc4\x7b\x34\x69\x39\x67\x62\xf9\x46\x77\xbc\xd7\x34\x18\xbb\x5b\x73\xa1\x11\xd5\x68\x9f\xbb\x3d\xd5\xd5\xdb\x6e\xbd\xe5\xbd\x25\x4f\x5f\x65\x5b\xdd\x1a\xbb\xaa\xaa\xda\xd6\x57\x1a\x7b\x1f\x25\x7b\x1c\x86\x5f\xbb\xfe\xa3\x64\xf9\xf1\x16\xf9\x72\xf2\x64\x68\xd0\x88\x70\x77\xcf\x9c\xd1\x58\x9b\xa2\xc5\xf5\x63\x9e\xeb\xc7\xf3\xf3\x57\xe3\x2f\x47\x06\xc9\xd1\x4f\x9f\xa9\xf6\x63\x9d\x57\xfd\xf1\xb5\xb1\xba\x19\xc5\xd1\xc1\xa8\xa1\x78\x9a\xd7\xa3\xfb\x1d\xeb\xbd\xd3\xb4\xfe\xb2\x46\x16\xc6\x96\xdc\x3b\x82\x1a\xd4\xa6\x6e\x90\x3c\xff\xaa\x96\x1a\xd6\xdb\x4a\x47\x60\xd7\x93\x73\x66\x98\xf4\xcc\x7b\x3f\x0f\xc6\x96\x19\x46\xd9\xf5\xa3\x5f\xe3\x6b\xee\xaf\x19\xff\x26\x73\xef\xbc\xed\xe1\xd8\xdd\xcc\xfd\xb7\x32\xbe\xd6\x7e\xb1\xdd\xe9\x9b\x72\x4e\xd3\x3c\xee\x36\x9e\x7a\xfe\xa8\x6d\xf2\xba\x9e\x94\xac\xea\xcd\x3e\x53\x6f\xed\x2b\x71\x3b\xe9\x13\xd9\x34\xd3\x94\x5a\xb6\xc8\x09\x33\xee\x4b\x6e\x31\xfc\xdb\x18\xfd\xf8\xfb\xee\xe9\xf8\xdb\xf8\x3c\xb6\x9b\x5e\x78\x6e\xd5\xaf\x73\xe2\x20\x38\xcb\x51\xfc\xb5\xfc\xa0\xfe\x57\xb1\xca\x2b\xf4\x13\xc9\xd9\x56\xfe\xce\x75\x26\x6c\x77\xba\x6e\x6b\xe5\x6f\x7c\x97\x6a\xb1\x36\xbd\xa7\x25\x0f\xc3\x73\xb8\x41\xf2\x0b\xe8\xdc\x3d\x1c\xfa\x0d\x8b\x4f\x7d\xb8\x02\x3d\x11\x47\x2d\x8b\x31\x67\x0c\xe3\x53\xb6\x63\x61\x4f\xfd\x70\x8f\xa1\x3a\x87\x17\x42\x49\xca\xf3\xb5\xba\x43\x31\x53\xd7\xf9\x28\x5e\xc9\x0f\xe2\x36\x66\xe2\x6f\x61\x87\x71\x3f\xd5\xfd\x51\x0b\xbf\x95\xef\x47\xe9\x53\xf5\x21\xc3\xf8\xeb\x8d\xd9\xa4\x9e\x06\xf1\x89\x63\xa9\x41\x4b\xb3\xb9\x10\xb6\x5a\x3e\xeb\x9a\x4d\xce\x10\x7e\x5f\x7f\xa1\x56\x87\x83\xf8\x2b\x70\xea\xe6\x44\x9d\x19\x8b\xed\x7d\x3d\x3c\x25\x4c\xdd\xc1\x89\xa4\x26\x4f\xd4\x47\xa1\x1a\x9b\x8d\xea\xf1\x37\x19\xc5\x82\xaa\x2d\xc6\x15\xcf\x34\xc6\x6c\xa8\xa1\xf2\xdf\x37\xb4\xa4\x9e\x86\x75\x4f\x65\xee\x9a\xbb\x1e\x9e\x1e\x5e\x48\xae\x5c\x47\x75\x6d\x97\xfd\x5f\xa5\xb8\x07\x71\xd4\x44\x5b\xaf\xb2\x49\xf9\xdb\xe4\xa5\x7a\x14\xde\xbc\x3a\x18\x24\xbf\xed\x9a\x09\xf7\x58\x96\xdc\xa5\xfa\xa9\xdb\x4c\x6c\xa9\x4f\xd5\xcf\x1b\xf3\xf0\x0c\xb4\x54\x28\x4b\xc9\x5e\x16\xdc\x42\xb8\xe6\xaa\xe2\x98\xa9\x33\x73\xb9\xe6\x6e\xfc\xd5\x5f\xb5\xcf\xa5\xf8\x2b\xc1\xf2\x58\xef\xc6\x27\xdc\x3b\xa1\xc5\xf7\xc3\xaf\x6e\xa6\x8b\x68\xc3\xbf\x4c\x91\xc7\x67\xfc\xaf\x86\x7f\xa7\xb1\x3c\x8b\xaa\xbb\x5b\xb9\x7b\x34\x7c\x53\xd6\x3d\xbf\x54\x2d\xeb\x78\x31\xfc\xe6\xb7\xdc\xeb\x5d\xee\x91\xe4\x8a\x63\x18\xfe\x75\x9a\xb2\xad\x2c\xd6\xf5\x5f\xde\x91\xeb\xd7\x79\xa3\x68\x03\x9d\x58\x87\xc5\x91\xb4\x78\x3f\xa3\x17\xdb\xda\xb0\xfe\x97\x4d\xfa\xf1\xf9\x64\x39\x26\x9e\x48\xfe\x45\xb6\x61\xf8\xb7\x7c\xf8\x05\x0d\x77\xba\xc6\x5f\xe9\xbd\xb0\xf1\xf9\xcd\xf5\x9a\x4b\xa5\xf7\xcd\xc6\xa7\xd9\xe6\x7e\xf3\xf8\xae\xb9\xef\xbd\x5b\x6f\x96\x65\x94\x94\xa2\x5c\xf3\x37\x93\x2d\x8d\x6f\xf1\xc3\x5f\xd7\xc6\xf6\xcb\xeb\xcb\x77\x58\x32\xfd\x54\xbd\x7e\x33\xce\x2d\xfe\x5e\x18\x5b\xab\x5c\xfa\xe5\x7d\xb6\x71\xad\xfe\xfe\x5a\xc8\xef\xbb\xf1\x5f\x52\x69\xbe\xc7\xe5\xb3\xeb\xf1\x88\x56\x7d\xfb\x74\xec\x21\x86\xf5\x5c\xde\x5f\x71\x5f\x8c\x47\xbf\xfa\x05\xf5\xa1\xe0\x70\xf8\xa5\xca\x6e\x3d\x26\xe8\xd7\xad\xb2\x68\xa1\x5f\xad\x5b\x32\x19\xac\x39\x86\xac\xc7\xcd\xd9\x4d\xf7\xf3\xae\x17\x74\xfd\x4c\xdc\x5b\xf9\x2f\x37\xf8\xd8\xc6\x9b\xe3\xa0\x61\x63\xcf\x4b\xf1\x5f\x31\x61\x14\x72\xad\xce\xae\xeb\x61\x99\x99\xf0\x9a\xa8\xc7\x2a\x95\x0a\x59\xac\xcf\xeb\xaa\x2f\x99\x89\xff\xc6\x4a\x79\xe6\xf5\x82\x51\xb0\xd8\xe3\x0d\xea\x72\x1d\x4b\x7a\xeb\x41\xdd\x17\x0c\xea\x2b\x85\x2a\x3b\x57\xbd\xd6\x6c\x1c\x2d\x57\xcf\xdf\x67\x63\xcd\x5c\x88\x19\x70\x36\x8e\xac\x9e\x0d\xf1\x94\x67\x5f\xa5\x36\x46\x21\x43\x8c\x8b\x01\x0b\x65\x5f\xdc\x33\xae\x2b\x7b\x87\x5e\x1c\x9f\xcf\xc6\xbe\xa8\xca\x81\x0b\xb1\x4f\xeb\x27\x57\x4d\x8b\xf5\x7d\x94\xd9\xe4\x4e\x33\xff\x4a\x48\xf9\x69\xd1\x9d\x0a\xdb\xf9\xd5\x50\xd2\x0b\xf5\x15\x46\x35\x22\x5a\xa8\xaf\x9c\x16\x93\x2b\x88\xa5\x5a\x89\x2c\xd6\x3d\xe0\x30\xf6\x71\xc3\xda\x62\x8d\xc2\xf5\x6b\x3f\xfe\xe6\xbd\xfa\x77\x7a\xca\x1e\xe2\xa7\x43\xab\x1a\xc5\x7f\xf5\xab\xac\xf1\x6b\xf1\xda\x7c\x21\xfe\x0b\x3d\x45\x7d\x7f\xa1\x71\x17\x76\x34\xd6\x2f\x8c\x92\xa7\x19\xd5\xe8\x65\x26\x7b\x3f\xec\xf5\x50\xf8\x1b\xd6\xff\x22\xce\x56\x6c\x0f\x79\x7d\x15\x54\xf6\xe8\x79\x18\xc9\x58\xf2\xa4\x63\xa6\x96\x3c\x83\x30\x8e\x38\x94\xb4\x9d\xea\xbc\x62\x9c\x13\xd6\x0b\xff\xa2\xe7\x20\x8e\x2d\xaa\x36\x53\xda\x9b\x41\xfc\xae\x78\x3d\xda\xc8\xef\xe5\xbf\x67\x36\x1b\xfb\xf3\x5e\xdc\xe3\xa1\x78\x64\x66\x42\xa6\x5e\x6c\xb4\xc7\xbc\x3e\xba\xc3\x28\x9c\xf2\xfa\xdf\xec\x18\xc4\x1a\x7b\x35\xfe\x5b\x6c\x0b\xf5\xb9\x38\xac\x7b\xfb\x72\xaa\xf4\x41\x33\x8d\x6b\xc9\x61\x72\xff\xd5\xea\x76\xb3\x50\xf7\xa9\x8c\x56\xfe\x6f\xf6\xfe\x05\x4e\x96\xa3\x3a\x0c\xc6\x6b\xba\x4e\xd5\x1d\x02\x16\x03\xc8\xd6\x40\x40\xea\x1d\xe9\x5e\x0d\x08\xe4\x96\x2e\x32\x8d\x6d\x50\xe3\x00\x6e\x04\x72\x86\x87\x61\xfc\x12\x6d\xec\xe0\x36\x18\xd4\x46\x60\x5a\x26\x42\x6d\x41\xaf\x3a\x84\xc7\x84\xd8\x61\xec\x38\x61\x04\xb6\xb3\x71\xec\x78\xff\x49\x90\xd7\x41\xf2\xdd\x8d\xff\xc0\xca\x8a\xc8\x80\x24\x32\x72\x62\xdf\x91\xf8\x9c\xac\xbf\x7c\x21\x93\x38\x89\x07\xec\xe8\x7e\xbf\x3a\x75\xaa\xba\x7a\x76\x57\x12\xd7\xc8\x12\xf7\xbb\x5b\xbf\x9e\x9d\xe9\x47\x75\x3d\xce\xbb\x4e\x9d\x13\xe0\x6e\x1a\x0d\x75\x83\x06\xbe\x6b\x4e\x6d\xec\xa7\x21\xf2\x9b\xd0\x91\x06\x2b\xc2\x93\x21\xc1\x6a\xed\xcf\x19\x91\x05\xcb\x5d\x2d\xca\x89\x77\x99\x37\x7c\x10\x7d\x7a\x5c\xbf\xc2\xd8\xb6\x3b\xc5\x5a\x07\xb4\x0f\xb3\xf6\x89\x8a\x10\x56\xeb\x79\xfb\x28\xc5\x9c\x4c\x70\x07\x4e\xed\xb9\x6a\xfc\xe4\x33\xc4\x08\xb3\xaf\xdf\xf4\xce\x68\x96\x43\xec\xc1\x90\x7c\xb0\x2a\x8c\x7d\x92\x39\x3e\x22\xb5\x3f\x55\xdb\x91\xf1\x2b\xbb\x47\xe9\x91\x95\x4e\xe3\x57\x6e\x6d\x9b\xa6\x44\xf6\xdb\xc3\xd7\x9b\xd3\x8e\xe6\xc3\xae\x3f\x54\x0d\x87\x3f\xb5\x9f\xcf\x36\xcf\x67\xe8\xb5\xf5\xb3\xfb\xb4\x16\x63\xeb\x1b\xae\x9c\x6d\xea\x48\x35\xc5\x2b\x1c\xdb\xa8\xb6\xc9\xaa\x6f\xdf\x43\xf7\xd5\xeb\x4e\x29\x45\x3c\x74\xbd\x4a\x6b\xed\xc8\xf8\x6e\xd6\xb6\xe5\xc2\x89\x63\x9b\x3a\xb6\xdc\xca\xf2\xb5\xba\x6d\x95\xa3\x91\x55\x87\xb4\x7a\x7f\x49\x09\xba\x27\x0d\x7d\xae\xb2\xef\x70\xfb\xab\xc6\xf1\xfa\x43\x6a\x29\x9c\x67\x53\x92\x52\x73\x6b\x0d\x1c\x35\x5a\x55\xad\xac\x5a\x36\xa5\xa9\x6a\x65\x3d\xf3\xe1\x66\x73\xe2\xfc\x9f\x38\xb0\x30\x39\x14\x1e\x26\xf6\xaa\xfe\x36\x71\xae\x98\x52\xd9\xcf\xc2\xfa\x1e\xe5\x87\xf8\x06\xb9\x16\x84\xdc\xee\x24\x31\x96\xc1\x6a\x1f\x1f\x18\xa1\xc7\xe8\xe1\xed\xd3\x65\x7c\xc8\xf7\x47\xab\x6c\xfc\x15\xbc\xe3\xaf\xa2\xbc\xef\xd0\x2b\xdf\xc8\x38\x02\xdf\x98\xd1\x7a\xe8\x16\x7d\xe8\x11\xd5\x71\xf3\xa3\xd0\x3b\x17\x1f\xdf\xe8\x9c\xfd\xf0\xa1\x6d\x3f\xfc\xed\x35\x16\xff\x3c\xb6\xb5\x69\x0b\x5c\xf5\x34\x5a\xf5\xb8\xce\x1e\xd6\x9a\x58\x39\x12\x6e\x6d\xab\x36\x7e\x32\x23\x47\x1a\xab\xa5\x93\xe6\x3b\xb3\xc6\xea\x49\xf3\x73\xd5\x26\x5b\x34\xe4\xb9\x7a\x1d\xaf\xb6\x16\xbf\xc3\xb9\x7b\xb4\x52\x73\xe5\xf4\xb9\xb0\x72\xc8\xe1\x7d\x3b\xa8\xef\x87\x9d\x77\x2d\xaf\x6f\x3f\x60\x8f\x7e\xbc\xaf\x2f\xab\xf4\xeb\xa1\xdf\x71\x78\x4b\x5c\x2d\xe4\xe0\xf5\x9a\x26\x75\x6c\x8e\xee\xaa\xc5\x7c\x75\xac\x8b\x46\x0f\x0f\x6a\x45\xb5\x32\x02\x26\x52\x40\x46\x90\xd0\xb4\x2c\xae\xee\x27\x5b\x5d\x7f\x28\x9c\x08\x0c\x39\xc9\x4f\xab\x2d\x69\xb6\xf8\xa1\x6a\x72\x47\x20\x27\x79\x70\xb5\xae\xd8\x39\xbf\xbf\x26\x73\x6d\xbc\x02\xc1\x05\xae\x10\xb9\xb5\x37\x77\xe1\xd5\x7a\xee\xc8\x19\xfd\x7c\x65\xd7\x54\xee\xc8\x7f\xa6\x9e\xc4\x69\xe3\x98\x7a\x7f\xe3\x4a\xeb\xeb\xe7\x6f\x3a\xc0\xf3\xf7\x3a\xe7\xdd\xab\x57\x0b\xeb\xdb\x94\x37\x7c\x4d\x6a\x19\xa3\x29\x5b\xe5\x8e\x5e\x65\xee\x76\x63\xe9\x16\x07\xc0\x6f\x71\xc0\x0c\x1c\x5e\xf6\x3f\xb9\xfa\xfe\xe6\x2f\x17\x22\xab\x86\x1e\xae\x3f\x7f\xe4\xc0\xb7\x17\x07\x40\x74\x4e\x90\x5a\xed\xa3\x3c\x07\x61\xa3\x79\x4f\x75\x40\x6f\xab\x95\x7d\x4d\x4d\xd8\xc9\x57\xfc\x85\x9b\x72\xa2\x2b\xe9\x0d\x2d\x74\x8d\xac\x24\x18\xd3\x6a\x6e\x21\xfb\xe2\x04\xc6\x41\x75\xa3\x6d\x47\xb4\xfb\xc1\x64\x0f\x31\x91\x5f\xcc\xa7\x89\x0e\x33\x74\x22\xc8\xd4\x57\x06\x4e\x79\x39\x7e\x0e\xf1\x33\xa5\x73\x23\xab\x57\x26\x0e\xfc\x1a\x18\xb9\x71\x05\x63\x2a\x87\xee\x55\xce\xee\xa7\x7a\x3c\x47\xb4\x8b\x67\x4c\x52\x95\x8e\x6b\x19\x50\xdc\xce\x9a\x1a\x0f\x51\xf7\xcb\x08\x3f\x73\x8a\x80\x92\x59\xcb\x80\x79\xf3\x1b\x70\xcc\xde\x63\xe3\xee\x85\xb4\x47\x65\x64\x63\x53\xea\x98\xaa\x21\xf9\x38\xc6\xa4\x01\x5f\x47\xd4\xe9\x43\x64\x83\x19\xee\x83\xbf\x82\x76\xd9\xe5\x68\x93\xea\xd3\x73\xfb\x77\xda\x16\x0d\x18\x28\x1a\x72\x7c\xd1\x80\x4f\xfd\x3f\x20\x1f\x48\x8d\x6b\x01\xee\x5e\x31\x75\x65\xf8\xfd\x3d\xf2\x25\xce\xfa\x6d\x85\xeb\x13\x75\x24\xe2\x18\xb5\x58\xf3\x8c\xd9\x0d\xa3\x69\xd8\x40\x56\xf2\xf9\xa8\x99\xbc\x9d\xbc\xa5\x8c\xbf\xdf\x8f\xda\x18\xb4\x39\x69\x56\xcd\xf8\x20\xa3\x03\x7a\xf4\x43\x54\x6f\x2c\x7f\x4c\xfc\xa1\x63\xdb\xab\xd7\x2d\x74\x14\xa2\x54\xc6\xf2\x06\x82\xa7\x9c\xe2\x07\x66\x07\xec\x4e\xc9\xc9\x2b\x65\x8c\xf0\x65\x56\x11\x7e\xda\x5e\x4b\x49\xbf\xae\x2c\xb7\x2c\x56\x28\x89\x79\x47\x3d\x47\xb1\xb5\x5e\x14\xb6\x45\xf5\xaa\x44\x6a\x7b\x60\x28\x6b\x61\xa3\xbf\x9a\xbb\x33\x6b\x33\x4c\x88\xef\x68\x6b\x93\x89\x35\xfa\x03\xe4\xe7\x5a\x39\x36\x25\x97\x3f\xc4\x16\x72\xb5\xe7\xe9\xc0\x7a\x04\x5c\x63\x29\x82\x1a\xa3\x11\x8d\x96\xc1\xc3\xc2\xb6\x36\x76\xfa\x19\xef\x7b\x87\x86\xac\x88\x62\xa1\x36\xef\xad\x28\x96\x88\x91\x2d\x62\xe7\x9c\x3b\x43\x03\x9a\xa5\x9c\xde\x5c\x7f\xab\xc7\x23\x76\x6c\x4d\xda\xbe\x11\x3b\x38\x5b\xd8\xab\x75\xfd\xb1\x8d\x43\x92\x5b\xbe\x9f\xe3\xd5\xb4\xb1\x27\xbb\x72\x22\x91\x9a\x99\x1a\x58\xda\x37\xa6\x08\x26\x75\x2c\x5b\x13\xdf\x44\xdb\x58\x12\xaa\xb3\xb2\x76\x96\x21\xd1\xc9\x11\xad\xd6\x28\x2e\x39\xb4\x71\xd5\x34\xae\x6a\xfb\x6e\x64\xf5\xdf\x91\xf5\x98\xe9\x62\x1b\xde\x41\x76\xd2\x02\x21\xae\x24\xec\x4b\x1a\xf0\x36\xb4\x50\x52\x39\xb3\x31\x74\xac\xd9\x6f\x71\xa2\xbd\xd5\x3a\xe2\x43\xd9\x43\x1e\xda\x56\x52\x5f\xad\x6d\x00\x8a\x46\xbd\xd4\x5e\xcd\x2d\x7f\xa8\x1c\xa9\xb6\x72\x5a\x58\x39\xf6\x24\x23\xf9\x6b\x4b\x5d\xbc\xc2\x77\x0a\xd8\x6b\xd0\xe6\xa2\xc1\x4b\xdf\x77\x00\xa7\x5c\xe5\x8c\x07\x5d\xcf\x0f\xe0\xb3\xf5\xef\x0f\xec\xbb\xab\xb9\xc7\x66\xbf\x14\x7a\x10\xbd\x2d\x56\xda\xba\xbf\x1d\xab\xef\x3e\x48\x1a\x68\xd6\x98\x1f\x28\xc5\xac\xda\xd7\xf7\xd7\xf4\x48\xca\xc1\x63\xf6\x50\x23\xf9\xf0\x6f\x5a\xbd\x76\x58\x8f\xea\xcf\xc3\xa2\x44\x3c\xda\x45\x67\xdf\x78\xa8\xfe\xee\xd7\xc2\x0e\x2a\x8f\xe4\x9e\xbf\x6c\xf9\xb1\x47\x78\x9f\xce\x2e\x75\xcd\x23\x1e\xd3\xaf\x1f\x66\x74\xd9\x0f\x7f\xa7\x5b\xd3\xe1\x65\xbf\x6f\xdf\xe1\xe5\xa5\xdf\x90\xb6\x7c\x3d\x6f\xfc\xe6\x2a\x37\x3d\x66\x6f\xfe\xcb\x8c\xe9\x87\x68\x3d\xf7\xe1\xdf\xf1\xc6\xd3\xaa\xff\xdd\x87\xb4\x52\xfd\x7a\xef\xd7\xd1\xb3\x5a\xcb\x68\x9e\xab\xbe\x8e\x11\x78\xc7\x69\x8c\xdc\x7e\xaa\xd0\x7c\xe6\x60\xca\x74\x58\xe4\x9c\x66\x6b\x0f\x7a\x7b\xd5\xe8\x9f\x2b\x19\xa4\x56\x5b\x2f\xec\xb9\xc2\xfa\x42\xd7\xb2\xe3\x47\x0f\xa8\xb9\x72\xf2\x4f\xfc\xa4\xd3\x72\xa3\x93\xe8\xa7\x5f\x7d\x20\x87\x72\x5b\x91\xd3\x7e\xff\xea\x10\x9b\xc9\xc0\xfe\x2e\x56\xe6\xac\x58\xa9\x6d\xff\x98\x14\xfb\xea\x0b\x1b\x23\x52\xd7\x50\x1c\x32\x5e\xae\x95\x22\xda\x57\x67\xd5\xf0\xd5\x75\x9f\xfc\x10\xc9\x79\x03\x27\xea\xa4\x91\x96\xf4\xaf\xec\x80\x77\xbb\xeb\x76\xe6\x6a\xb6\xaf\x55\xc6\xd3\xa9\x79\xce\x8d\xe7\xa6\xeb\x34\x11\x1b\xa2\xc6\x48\xad\xce\x85\xeb\xc7\xde\x1c\xdf\xa6\x85\x2e\x70\x46\xc2\xc8\x92\x37\xd8\x33\xfb\x77\x48\x6e\xd8\x3a\x6a\xbb\xc4\x6b\xe9\x4c\xe4\xd4\x93\x39\x63\x39\x6a\xf4\xbe\x70\xda\x5c\x39\x72\x48\x65\x2d\x20\x15\x79\xcb\x0f\x6c\xdc\x2f\x23\xa5\x6e\xa0\xc6\x59\x35\xfa\x97\xd3\x1a\xe6\x8f\x51\x3d\xb5\x25\x2d\xb3\x11\x98\x57\xa1\xa8\xb0\x63\x34\x68\xc0\x42\xb5\x62\x85\xc9\xe5\x8b\x48\x6a\xd7\x51\xea\x33\xba\x67\xdc\xa0\xe1\x95\x9d\x79\xfd\xec\x1b\x9d\xf1\xfa\xb8\x33\xea\x37\xa3\x47\xd5\x68\xc5\x16\x94\xd3\x9a\xe2\x4d\xd6\x92\x67\x66\xc7\x68\x43\x49\x23\xe6\x4e\x7e\x80\xdd\xa0\x38\x40\xb2\x76\xa5\x8e\x62\xa5\xe7\x06\x56\x33\xeb\xd9\x62\xf6\x72\x14\x8d\x73\xa6\x7d\x2f\xb1\xda\x6d\xfd\x6c\xe1\x78\xd2\xb8\x3b\x20\x32\xc7\x2b\xcd\x6d\x57\xe5\x48\x9c\xee\x7b\xdc\x59\x79\xaf\x8d\x50\x52\x63\x55\xe6\xdc\xbf\x5f\x3e\x55\x6f\x1a\x5b\x2b\xc6\xc8\x5a\x30\x0a\x67\x17\x63\xee\x44\x3e\x18\xda\xec\x03\xee\x6e\xc4\xcc\x69\xb9\xd9\xfd\x69\x22\xdc\x8c\x2c\x2c\xe9\xeb\x03\x0b\xaf\xf5\x1e\xda\xda\x7b\x29\xb3\x7e\x7e\xf9\x8a\x6f\x7f\x65\xad\x08\xa3\x86\xe7\x9e\xa9\xb7\x5e\x05\xa9\x1a\x34\xa2\x90\x6f\xa6\x68\xc1\x99\xb5\x3c\x60\xac\x4f\x5b\x4b\xd8\x78\x9f\x3e\x22\xc2\xc2\x91\xf5\x38\xac\x2c\x9c\x8e\xad\x2d\xba\x6e\x5f\xe6\x78\x6a\x15\xb6\xe6\xcc\xc6\xf8\xc9\x74\xe6\x25\xcc\x8a\x17\x93\x85\x6c\x68\x8b\xce\x42\x75\x39\xc6\xe7\xc9\xad\x3d\x4a\x7b\x68\xbc\x1b\xdf\x9b\x90\x0f\x63\x40\x51\x6c\x32\xcc\x09\x51\x38\x39\x7b\xb4\x25\xef\x03\xd4\xb3\xcb\x68\x3c\xbe\x8b\x56\x7e\x62\x8b\x19\xbe\x0c\xe4\x05\x2b\xf4\x2c\xa0\x68\xec\x9a\x57\x4d\xf6\x59\xd8\x0a\xf2\x18\x29\x1c\x4b\x7a\xf1\x10\x25\x6f\x58\x5d\x57\x33\xd3\xd6\x30\x6d\x76\x96\xae\xd2\x98\xa6\xcc\x3b\x6a\xc4\x9f\x6b\xf2\xb4\xeb\x56\xa0\x79\xb5\x1e\x57\xcf\x3d\x28\xe2\x59\xbc\xa2\x31\xed\xd7\x8b\xf7\xff\x5a\xb5\xe7\xbb\xf4\x77\xff\x13\x4d\xaa\x91\x1d\xa0\x43\x16\x2b\xbf\xf3\x03\xce\x1e\xc4\xa3\x6a\x2d\x7c\x75\x0f\xcc\x4d\x0e\xb7\x28\x9c\xbe\xe6\x0e\x9d\x2d\x9c\xf6\xd5\xed\xfc\x29\x1a\x71\x97\xe2\xad\x5a\xee\x33\xc7\x03\x31\x97\xb7\x10\xbf\x71\xed\x04\xee\x13\xd9\x8a\x94\x54\xe7\x4c\x2c\xd0\x5e\xb7\xdf\x66\x3f\x72\x24\x07\x77\x8c\x9b\x7d\xac\x56\xda\x5e\x39\xb0\xd7\x1c\x9d\xc2\xee\x0d\xac\xcf\xac\xf6\xc9\x78\x9b\x8f\x1a\x2d\xa9\xf6\x59\x09\xc6\xf6\xe9\x91\xc3\x6d\x47\x0e\x4d\xa9\xf7\xb3\xfd\x90\x1d\xa5\x01\x71\xbd\xdc\xf2\xf4\xc2\x7a\xc2\x7c\xc8\xfa\x8e\x14\xf2\x67\x1c\x29\xb4\x68\xf4\xbc\x22\x49\x37\x5b\x81\x81\x62\x05\x6e\xbe\xde\x52\x1c\xf0\xf4\x41\xb2\x69\x0d\xcd\x95\x23\x67\x1e\x84\x29\x55\x63\x0e\xf6\xc3\xfa\xea\xfa\xe9\x43\xb5\xbb\x70\xe6\xb9\x29\xb5\x56\x0d\xce\xe8\x4a\xf2\xee\x8c\xa5\x96\xce\xa6\x8e\xcd\x2e\xb5\x12\x79\xbb\x01\x29\x9a\x16\xdc\x84\xd1\xb1\x72\xca\x5e\xae\xcf\xeb\x18\x61\x05\x52\xca\x09\xe5\x74\x33\x9c\xa8\x6b\xe9\xaa\xfe\xdf\x47\x1b\x75\x3d\x7f\x99\xc3\x25\x6b\xee\x9d\x5b\xfe\x51\x58\x3e\x51\xe3\x8b\x3b\xb6\xe6\xd9\xd0\xd6\x69\xd6\x25\x02\xbb\x02\x1c\x3b\xa3\x7a\x9d\x83\x45\x31\x7a\x0b\xf5\x57\xc6\xbf\x8e\xfd\x51\xe1\xaa\x42\x2d\x61\x2b\x69\xb6\x8f\xe7\x7f\xde\x8e\xad\x89\xa7\x16\x58\xcc\x89\x9d\xf5\x55\xcd\x5d\x7e\xca\xc6\x1a\xce\x6c\xcc\x26\x05\xf3\x3f\xed\xc0\xd7\x06\xed\x38\xc8\x31\xd6\x7b\x61\xad\xa7\x31\xad\x22\x8d\xe4\x0d\xe4\x1d\x57\x58\x5a\x3d\x90\x6f\x27\x29\xe4\x67\xa8\x17\x91\x8d\xa1\x5b\x47\x0c\x30\x70\xe4\xd3\xc8\x18\x4f\xdb\xae\xe3\x9d\x98\x3b\x1e\x81\xc6\xae\x1b\xd2\x8e\x96\xdc\x81\x99\x50\xbe\x83\x46\x3a\xb7\x3a\x82\x1e\xe5\x81\x95\xa3\xc7\x0d\x6d\xa5\x70\xa4\x87\x55\x09\x51\x97\xef\x6d\x68\xfe\x07\x61\xc6\xc3\xe1\xae\x6a\xcf\xcd\x54\xc7\x61\xdc\xc9\x3d\x1f\x20\x0c\x76\xad\x6c\xa3\x67\x75\x80\x31\xd8\x43\xda\xf1\x9a\x59\x7f\x61\xf7\xd9\x84\x6c\xf6\x6f\xa5\xfd\x1d\x66\x7f\x50\x48\x39\x51\x6a\xac\x0d\x1d\x2e\x6f\x76\xcc\x98\xd1\xd2\x6f\xb9\x1a\xef\x1c\xa2\x2c\x15\x48\x1f\x75\x1f\x1f\x33\x72\xd4\xfb\xcb\x73\xc7\xeb\x3a\x40\x1a\x99\xad\xf0\x26\x13\xc9\x24\xc4\x98\x7b\xb9\x13\x55\xae\x96\xe7\x52\x67\xbf\xbd\xde\xf5\x1b\x3b\x7e\xe7\x7a\x17\x8a\x19\x8b\xc2\x66\x3b\x8e\xec\x8e\xc1\x21\x79\x87\x27\xa8\x61\xe8\xf1\x88\x89\x56\xd4\x1c\x21\x74\xe8\x57\xd3\x36\x12\xe2\x88\x46\x36\x5b\x72\x82\xd4\x7d\x80\xb3\x30\x72\x30\xba\x42\xea\x90\xdb\x5e\x9b\xda\x46\xb4\xa6\x65\x30\xb3\xb9\xd7\x3d\x22\x7c\x32\x5e\xdc\x7a\xad\x7a\x82\x78\x3f\xb2\x3b\x9c\x57\xcb\x8d\x07\x48\x69\xfb\xef\x1b\x39\x5a\xe0\xc1\x14\xf8\x86\x87\xa0\xcd\xb9\xc3\xc9\x0f\x8e\xd4\x7b\x38\x4c\x17\xfb\x64\xb9\x83\x79\xd0\xaa\x2f\xc7\x7e\x09\xea\xf0\x27\x5d\xec\x1a\xed\x9b\x35\x73\xac\x66\x88\x68\x72\x1a\x57\x6a\xad\xf6\x49\x26\xcd\xb7\xee\xe7\x68\xfb\xc7\xa3\xb2\x23\xe6\x46\x9d\xde\x2f\x1f\x17\x2b\x52\x4d\x46\xbd\x68\xca\x88\x85\x23\x1b\x15\x76\x0d\x5e\x41\xcb\xdf\xa6\x78\x8d\x66\xe5\x52\xef\x01\xd3\xeb\x94\x97\xd2\x2a\x69\xe6\xf8\x2b\x28\x4c\xfd\x00\xae\x2b\xd6\x92\xa2\x59\x43\xcd\x6c\x1d\x7a\x45\xd2\xe4\x0b\x7c\xab\x9d\x91\x7f\x40\x11\x3b\x73\xf9\x26\xfc\x5f\xaf\x21\xeb\x75\xc5\xcc\xe6\x67\xaa\x68\xff\xd3\x90\xe2\xcc\xe6\x8e\xed\x26\xb1\x6b\xaf\x95\x7d\xd7\xd8\xae\xbe\x1a\x1f\x22\xb3\x93\x56\x67\xe9\x79\xb7\x5c\x97\x31\x66\xc5\x34\xed\x1b\xc9\x1b\x89\x67\xea\x36\x5c\x47\xf7\xaa\xeb\x6f\xc3\x96\x7c\x04\xef\xbb\x59\xc6\xb4\x3f\x3c\xc6\x96\xc4\x8d\x9c\xa5\xb9\xd3\xfe\xd4\x8e\x40\x4e\xeb\xa2\x6f\x92\x89\xbc\x9a\x30\xe8\x06\x3b\x8b\x66\xf5\x39\xb1\xfb\x35\x12\x1a\xab\x51\x03\xaa\x2a\x1a\x87\x21\xd2\x09\x85\x83\x1f\x91\x23\xf9\x0e\x7c\x36\x20\xc9\x43\xf1\x38\x5f\x76\x71\x96\xba\x96\x8e\x25\xc8\xcf\xbb\xe8\x7f\x53\x50\xee\xbb\xd0\x91\x1b\x32\x5c\x23\x57\x75\xf8\x32\xa5\xd5\xd7\x41\x83\xf7\xe5\x76\xf7\x9e\xb6\x11\x05\x8e\x9c\x95\x93\x9c\x3c\xa0\xc8\x55\x26\xbf\x46\x41\x73\x96\xa3\x17\x89\xe6\x20\x01\xed\x74\xa9\xe5\x8a\x90\xf2\xf6\x1a\x3c\xfd\x61\x1c\xf3\xc8\xe6\x8e\x30\xfb\x25\x8c\x87\x45\xe0\xc4\x63\x79\x1f\xf6\x42\x67\x92\xaf\x28\xae\xb1\xce\x67\x1b\xd0\x7e\xc3\x94\x66\x2a\xc3\xf6\x18\x28\x37\xf1\x2e\x8c\xec\x9e\x51\x8c\xd1\xdc\x42\x6e\x80\xe3\xfb\xa3\x98\x2d\x27\x77\xf6\xd1\xe4\xa4\xd7\x86\xb4\xe7\x45\xb7\x2d\xc2\xbd\x08\xb9\x8d\x0c\x11\x59\x8f\x11\x73\xbd\xc6\xbe\x5f\xa6\x4c\x78\x86\x8e\x19\xef\xcc\x88\xde\x5c\x90\x07\x86\x1e\x9d\x88\x56\xca\xeb\x3d\x23\x23\xe7\xb9\x48\xc6\x98\xc5\x2d\xa7\xbd\x22\x05\xe6\xf3\xaf\xad\x3c\x95\xf3\x6e\xed\x6d\x1a\x5b\x3f\x0e\x25\x55\x6d\x58\xac\x49\xac\xdc\x72\x13\xde\xe7\xf2\x9b\x1c\x7d\xb2\x33\x7c\x76\x48\x71\x82\x73\xb2\x81\x0c\x51\x6a\x18\x11\x47\xcd\x1c\x4d\xa4\x86\xda\x5a\x1a\xad\x56\xa4\x5b\x37\xce\x4e\x93\x5a\xd7\x1a\x5f\xe6\xd8\xbd\x72\x7b\x5e\xfd\x9f\x38\x34\xaf\x68\xd4\xb4\x5a\x9a\x4f\x9a\x98\x12\x2e\x85\xcd\x1a\xad\x28\x1a\x76\x9a\xcc\xa9\x35\x6b\x70\x94\xa2\xc1\x5d\x2a\xc7\x02\x57\x5b\xb4\x8a\x03\xda\x91\x5b\x8b\x91\x2b\xe7\xd7\xef\x6b\xd6\x5f\x59\x69\x75\xe4\xb4\x65\x64\xa9\x6d\x2d\xf7\xb8\x96\x3d\x23\x3f\x7c\x64\x9f\xfe\x90\x37\xf4\x85\xc2\xb1\xa4\xd6\xd8\x5e\x5f\xaf\x6d\x52\x95\xd3\xf2\x26\x47\x2d\x1c\x1b\xae\xb9\xff\xfd\xf6\xe9\xdc\xe1\x48\xf5\x08\x15\x98\x97\x62\x75\x2c\x2b\xa7\xb5\x71\x63\x36\x72\xf9\x36\x6a\xe9\x3f\x75\x38\x5e\xd6\xb0\x98\xe6\x8d\x5d\xb5\x85\xa3\x77\x1a\x7b\x90\xe1\xc5\x59\x63\x24\xcc\x78\xe9\xef\x37\x39\x5c\x32\xb1\xa3\x94\xed\x5b\x0f\xcb\x1a\xb6\x86\xcc\x96\xca\xbe\x21\x5f\x99\x19\xd3\xd6\xd4\x66\x69\xdd\x0f\x6d\x79\xc3\x66\x51\xd3\xc9\xcc\xd1\x0d\x0b\xeb\xf5\x54\x38\xb6\xf7\x5a\x5e\xcb\x56\x6c\x1a\x35\x6e\x8d\x56\x38\x7f\xee\xc8\x53\x05\x59\x2f\x5d\x18\x2e\x2c\x9d\x37\x56\xd4\xac\x21\x73\xb8\x2b\x2a\x15\xf1\x59\xf7\xdd\x99\xf5\xee\xc9\x1a\xef\xac\xa1\xa6\xc2\x9d\x3f\x23\xcc\xeb\xe4\x4a\x28\xf9\x8a\xac\xd2\xec\x49\xe1\xcc\xe3\xc8\x99\x83\xbc\x81\x95\xe3\x06\x16\x36\x65\x20\x97\x3e\xe5\x0d\x1b\x7b\xee\xc0\x68\xe1\x78\x8f\xee\xa7\x36\xd5\x8a\xe7\x4e\xde\x68\xdb\xc8\xf9\xcc\xed\x5c\xd5\xb2\xa0\x6b\xad\xa9\x56\x7a\x3f\xb1\xdf\x47\xf6\x5d\xab\xd4\x64\x75\x6e\x0f\x8f\xcf\x5b\xc3\xa1\x2b\x6d\x3e\x9c\x9c\x7d\xd8\x5b\x1e\x5e\xf3\x3c\xbc\x85\x85\x33\xef\xb5\x64\xbb\xbf\x35\xb5\x4d\xcd\xbd\xb6\xff\xbd\xfb\x71\xe6\xe1\x5a\xd2\x84\xc2\x6a\x05\xaa\x0e\x1e\xdf\x55\x89\xbe\x39\xa2\xae\xd4\x5d\x5f\xb9\xc1\x5a\xff\x9b\x23\xe7\xee\xe6\xac\x6b\xa9\x2c\x6f\x57\x92\xc0\xb5\x04\xcb\x46\xe6\x31\x7e\xc0\x09\xf9\x05\x0f\xe9\x53\xfb\x2c\x0e\x9c\xa3\x2e\x57\xe3\xe7\x6b\x48\xf2\x7e\xa8\xac\x95\xf5\x73\x11\xed\x17\x8d\xc8\x6b\xd9\x3d\xeb\x7a\x31\x47\x8d\xe7\x6b\x4f\xe7\xe6\xd9\xfa\x5a\xf3\x7b\xf4\x88\x76\xec\x7f\x23\x4a\x41\xeb\xea\x01\x4a\xac\x35\x4d\xd6\x12\x71\x48\x72\xf0\xc0\xc6\xcd\x6c\xfa\xa8\x9a\x75\x77\x23\xeb\x1a\xa9\xd6\x9c\x0b\xec\x2f\x93\xf5\xd5\xc0\x73\x20\x43\xcc\x09\x98\x93\x5d\x61\xd4\x80\xa4\x7a\x27\x6e\xd8\xc8\xca\x6d\x8a\x92\xc6\xdf\x66\xf5\x82\x88\xf6\x18\x8f\x28\xfa\x48\x41\xbb\xce\x0b\x47\xba\x32\xb0\x15\x58\x2b\x45\xe1\x40\x67\xe5\x48\x0e\x43\x0b\xaf\x15\xf9\x9f\x8e\xec\xbe\xf0\x11\x66\x04\x30\x2d\xcd\x1c\x9b\x74\x41\x2b\xa8\x4d\xca\xdc\x5c\xa1\x69\x62\x47\xe1\xd8\x74\xeb\x7c\xbc\x39\xea\x3d\x1f\xa1\xdc\xed\xaa\xbc\xde\x7e\x1b\xd0\xff\xe4\xc0\xff\xea\xf3\x8d\xe8\x07\x9c\xe0\xf7\x84\x22\xab\x25\xd8\xaf\x84\x76\x04\xbf\x91\xd6\x1a\x33\xd4\x14\x5f\x42\x4f\x66\xf6\xae\x6c\xa5\xb8\x35\x64\xa4\xad\x24\xf6\xbe\x44\xbe\x8d\xbe\xbf\x91\xce\x26\x24\x13\x64\xf4\xf9\x4e\xaa\xa1\x49\x83\x0a\x47\xfa\x28\x2d\xd6\xf7\x65\x1b\xed\xa2\xb5\x1e\x92\xaf\xd0\x80\xfd\xd4\xf2\x60\x1a\x5a\xdf\xab\xad\xfb\xfb\x23\x0d\x54\xfb\x68\x9c\x3b\x37\x1f\x68\x44\x19\x77\xeb\x2f\x1c\xbb\xdc\xe1\xef\xd7\x77\x7e\xc4\x99\xf7\xca\xd9\x09\x5e\x34\xf8\xe6\xfe\x73\x4d\xc9\xd1\xdd\x7d\x7e\xb0\xe7\xad\xa6\x8a\x9a\x6e\x64\x56\xeb\xb9\x92\xf2\x33\xea\xc8\x36\x21\xee\x25\x70\xa3\x8c\x9a\x5d\xeb\x75\xdc\x81\x0c\xef\x7a\x13\x41\x73\x45\xd6\xe2\x50\xbe\xd1\xca\x5f\x19\x59\x20\x2b\xac\xcd\xc4\xe1\x7d\x8f\xfc\x11\x2b\x7f\x87\xd8\xe2\x1b\xc8\x1b\x5d\x5b\x4d\x42\x27\x1e\x84\xfa\xf5\x5e\xb2\xec\xe5\x44\x19\x32\x9b\xef\xc3\xf8\xdf\x17\x24\xc9\xaa\x5e\xfd\x2d\x6b\x13\x4d\xc9\x62\x6a\x4a\x4e\x79\x40\x42\x8a\xb0\x18\xda\x2c\x25\x26\x13\x88\x86\xc2\x84\x6c\x9b\xd7\xa0\xd5\x31\x21\x3d\x3c\x76\xa8\x58\x4e\x39\xf7\xaf\xb3\x9e\x2d\x31\x62\xc6\x5b\xa9\x35\xba\x4e\xc5\x5b\x7e\x4c\xfe\x20\x5a\x35\x22\xf2\x95\xcf\xad\x66\x59\xef\x63\x51\x94\xe1\xb5\x34\xc6\xb9\x7c\x2b\xd2\x9c\x01\x69\xd0\xc6\x5e\x10\x53\xdc\x83\x4c\x7e\x4c\x2c\x71\xfe\x9a\x7b\x76\xcd\xaf\xeb\x9c\x73\xee\x9c\x7f\x18\x35\x60\xf7\xcc\xcd\x8d\x5f\xb9\xf5\xed\x19\x34\x7c\xb2\x0f\x2a\xa3\xc6\x0e\xcc\x7c\xe5\xda\x41\xf7\x34\xf7\x5c\x1f\x74\x7f\xf3\xfb\xdb\x9c\x73\xb9\xb3\x7f\xbb\xa2\x58\x18\x66\xa7\xe7\x41\x99\x5a\x0f\x5a\x17\x5f\x5d\xf9\xde\x8f\x45\x07\xd5\xd1\x7c\x26\x25\x0d\x6a\x68\x75\xa1\x91\xdd\xcf\x10\xd3\x33\x23\xca\xab\x62\x22\x7a\x1b\x6b\x5b\x8a\x7b\x73\x42\xda\x39\x71\x83\x85\x83\xdc\xe2\x55\x42\x11\xac\x26\xf4\x5f\xc3\x76\x68\x6d\xec\x86\x12\x0e\x2d\x04\x0e\xc9\x6a\x92\x93\xfd\xa1\xa2\x5a\x32\x47\x87\x1d\xd8\x18\xe4\xe6\xbe\xbc\xb1\x46\x65\x70\xad\x70\x7c\xcf\x42\xcb\x69\x42\x6a\x5d\x4d\xf7\xea\x55\xe2\x98\xf6\x1f\xa5\x44\x35\x8a\x86\x24\x6c\xe8\x63\xe8\xbc\x3d\xc7\xfc\xf8\x15\xdd\x5d\xd0\xb8\x55\x38\x5e\xef\xa6\x3b\x12\x4b\x57\x0a\xb2\x07\x99\x3c\xfc\x3a\xce\x4f\x2c\x6f\x90\x6f\xb5\x91\xf2\x8c\xd4\x17\xda\x36\x25\x88\x4f\xe6\xdd\x91\xed\x73\xe8\xd0\xc8\xc2\xf6\x38\xb6\xde\x18\x5a\x17\x0d\x2d\x05\xab\x28\x3b\x50\xe1\xe8\x08\x69\x63\xdd\x21\xa6\x68\x28\x11\xad\x5f\x0c\xc8\xa3\x26\xb6\xfb\x45\x8c\x5e\x5a\x7b\xfe\x68\x5e\x97\x52\x7e\xa5\xd8\x89\xc9\xe1\xfa\xe9\x15\x4e\x0d\x26\x8f\xff\xfb\x56\xf0\x6d\xb8\xcf\x2e\xf3\xf3\x8e\x8e\x96\x3b\xdc\xf3\x60\x9e\xd4\xd4\x83\x73\x5c\xa3\x70\xb1\x23\x7f\x08\xcc\x30\xe5\x8d\x07\xd6\xef\xbe\x49\x8f\x97\x89\x6a\xd7\xdc\x8f\x5d\x34\xd6\x8f\xc3\x7d\xd8\xf7\x4b\x0d\x3c\x34\x2b\x93\x0f\xdd\xa2\x6a\xdf\xb7\x1b\x1f\x41\x3f\x0a\x6b\x19\xd4\xfb\x35\x6e\x7a\x44\xcf\x18\x8b\xc4\x6a\xc4\x8b\xaa\xd1\xea\xbf\xb9\x72\xe5\x20\x8a\xd3\xb4\x1a\x14\x87\x8c\x7e\xf5\x30\x9e\x3e\xf5\x5c\x14\xe8\x91\xa4\xef\xfe\x78\xc3\x0f\xe2\xc6\xc6\x1b\x0b\x4b\xc7\x0e\xaa\xa3\xd9\xbe\xd5\x16\xd5\x4f\x69\xcb\xc9\x0d\x87\xd4\x72\x38\x1c\x0d\x11\xea\x6a\xff\x0d\x17\xd3\xcc\x3d\x23\xe7\x1d\xa6\x7c\x88\xde\x3f\x92\xdf\xe5\xec\xe0\x2d\xf6\xf5\x28\xb7\x56\x1c\x77\x46\xc6\x8d\xcc\xb6\xab\xba\x67\xdd\xbb\x83\x25\x46\xe3\x55\xda\xd4\x9d\xeb\x5f\xe9\x21\xd2\x5d\xe5\x68\xdf\x07\x63\x4a\x4e\x79\xbc\x9b\x4f\x15\xce\xf3\x4d\xbf\xa3\x11\xe5\xfe\x18\xa3\x37\xa7\x1a\x0d\x1d\x41\x73\x40\xd6\x90\x5a\xbf\x32\x6f\xbe\xee\x80\xf7\xbb\x7d\x1c\xd8\x73\x37\x52\x1f\x9b\xfa\xbc\x6e\x63\x25\x5f\xbe\xf2\xf4\xcf\xe2\xb7\x9f\x75\xe8\x58\xb1\x32\x32\xfb\xc7\xb7\x86\x0f\x33\xd2\x63\xe7\xfa\xfb\xb1\x2f\xcd\xb7\x54\x2b\x75\xb8\x98\xf2\x0f\x57\x6c\x1a\x19\xc9\xd1\x07\xbf\xb1\x68\xd4\x5d\x35\xda\x62\xae\x36\xdf\x56\x1d\xd0\x7a\xb7\x94\x0d\x2b\x47\xdd\xb6\x91\x85\xc7\xaa\xb1\x5e\x79\x63\x63\x3d\xb3\x6e\xc1\xcf\x3b\xd0\xef\xbe\x6d\xec\xd0\x98\x71\xe3\xa9\x81\x1d\xbb\x02\xed\x5b\xb5\xc6\xa0\xdb\x5c\x67\x1b\x2e\x2c\x07\xad\x71\x6d\x6c\x71\x44\x3f\x9f\x62\x6c\xa2\x1c\x6d\xc8\xc5\xca\x7a\x43\xe1\xcc\xad\xa9\xb3\x6a\x64\x1a\xca\x9d\x79\xaa\xcf\x4e\x56\xd6\xe8\x57\x2d\x3a\xab\x4f\x16\x8d\x39\x2f\x6c\x8b\x6a\x58\x28\x1a\xdf\x2b\x1b\x7f\xdc\xc0\x51\xe5\xec\xe0\xac\x68\x0f\xcf\xcd\x2b\x34\x36\x27\xca\xa1\xa4\xca\xef\xb6\x96\x8d\x81\x95\x34\xeb\x88\x41\x19\x7d\x4b\xf6\x59\x41\xc6\x74\xc7\xa4\x01\xe3\xaf\x68\xc0\x8b\xdb\xe7\xa2\x01\xbd\x95\x6d\xdf\xaa\x17\x56\x65\xfd\x02\x23\xc7\x3f\xa2\x58\xb1\xcb\xe6\xd6\x93\xd4\x7d\xcf\xc8\xae\x78\x99\x5e\xd6\x99\x05\x6a\xf9\x22\xa0\x95\x35\x4d\x83\xbf\x53\x7e\x8c\xe2\x4e\xe8\x9d\xa6\x6f\x20\x19\x2a\xb1\xf9\xbb\x6a\x98\xd2\x7d\xbf\x11\x23\x3c\x16\x18\x97\x4e\xbf\xc1\x44\xe5\xce\x68\x2e\x12\x8a\x7c\x9a\x58\x0f\xaf\xc2\xea\x55\x0f\x5d\xdc\x11\x2e\x56\xc6\xf1\x60\x7a\xbd\x9a\x55\x5d\xe7\x9a\x3a\x08\xc2\x56\x63\x4b\x1b\xab\x43\xd1\xb0\x5f\x14\x8e\x34\xa2\x23\x4b\x4e\x1c\x0f\xe9\xca\x62\x74\x4e\x96\x7d\xe3\x77\x52\xe7\xe2\x0f\xe5\x2b\x64\x0e\xda\x4f\x2c\x85\x57\x3a\xab\x40\xb9\xb5\x1b\xd5\xad\x59\xb5\x9f\x9c\x2d\xdf\x54\x45\xec\x3d\xa4\x1d\xf8\xf0\xf2\x98\xb7\xfc\x51\xee\xdf\x61\xf6\xf0\x33\x64\x5c\x4e\x77\x24\xec\x78\xd6\x2b\x0c\xab\x25\x6e\x44\x32\x31\xc7\x63\xdd\xdf\x6f\x6c\x49\x6d\x46\xaf\xb3\xe5\xd1\x29\xec\xcc\xa6\x4b\xa7\xdd\xbf\xd3\x2d\x8f\x75\x7f\x1f\x69\xf9\xcb\xd2\xa5\x33\x75\x5c\xce\x96\xc7\x47\xe9\x1f\x28\x9b\x3f\x7c\x79\xac\xdb\xfd\x68\xf7\xef\x74\xcb\x63\xdd\xdf\x47\x5a\x4e\xb7\x7f\x67\x3a\xbc\x9c\x2d\x8f\x8b\x72\xa6\xf3\xbf\x6f\x90\x1e\x77\xc6\x8d\xcb\xe9\xf6\xef\x4c\x87\x97\x47\x58\xce\xea\x71\x8f\x72\x11\x7b\x87\x58\x06\x4c\x19\x34\xac\x08\xb5\xc5\xe0\x31\x6f\xf9\xa3\xdc\xbf\xc3\x2c\x26\x67\xc8\xb8\x9c\x6e\xff\xce\x74\x78\xf9\xa6\x2b\x67\x28\x75\x14\x4b\x07\xa6\x12\x3c\x9a\xc5\x9c\x77\xef\x88\x0f\xf0\x17\x7d\x9c\x96\xd3\xee\xdf\xfe\x3b\x1f\x59\x79\xcc\x7b\xfc\x08\xcb\x69\xf6\xcf\x8e\x67\x62\xc7\xed\x8c\x82\x97\x6f\xba\x72\xa6\xd2\xa5\x33\x5c\x2e\x3f\xab\xc7\x1d\x52\x4e\xb3\x7f\x67\x3a\xbc\x7c\xd3\x95\xb3\x74\xe9\x9b\x12\xce\xce\xd2\xa5\x43\xca\x69\xf6\xef\x4c\x87\x97\xb3\xe5\xf1\x51\xc4\xdc\xd9\x43\xfa\xf5\x94\xc7\xbc\xe5\x8f\x72\xff\x4e\xb7\x3c\xe6\x3d\x7e\x84\xe5\x34\xfb\x77\xa6\xc3\xcb\xd9\xf2\x38\x29\xdd\xc7\xbc\x05\x67\xfb\xf7\xcd\x54\xce\x8e\x67\x76\x76\x3d\xee\xd1\x2f\x62\x41\xdf\x86\xf6\x68\x16\x73\x6d\xf5\xae\xc7\xbc\xe5\x8f\x72\xff\x4e\xb7\x3c\xe6\x3d\x7e\x84\xe5\x34\xfb\x77\xa6\xc3\xcb\xd9\xf2\x38\x29\xed\x33\xdc\x4f\xee\x74\xfb\x77\xba\xe5\xb1\xee\xef\x23\x2d\xa7\xdb\xbf\x33\x1d\x5e\xce\x96\xc7\x45\x39\xd3\xed\x98\x67\xed\xde\x87\x94\xd3\xec\xdf\x99\x0e\x2f\x8f\xb0\x9c\xd5\xe3\x1e\xe5\x72\xa6\xc3\xd9\x59\xba\x74\x48\x39\xcd\xfe\x9d\xe9\xf0\x72\xb6\x3c\x4e\x4a\x7c\x86\xcb\xe5\xa7\xdb\xbf\xd3\x2d\x8f\x75\x7f\x1f\x69\x39\xdd\xfe\x9d\xe9\xf0\x72\xb6\x3c\x2e\xca\x99\xce\xff\xce\xca\x4b\x87\x94\xd3\xec\xdf\x99\x0e\x2f\x67\xcb\xe3\xa3\x9c\xdd\x87\x72\x76\x1f\xca\x69\xed\x43\x39\x43\xe1\xe5\x6c\x79\x7c\x14\xb1\x38\xb3\xd7\xc3\x4f\xbb\x7f\x67\xfd\x04\x0e\xf3\x13\x38\xb3\xc7\xe5\x6c\x79\x7c\x94\x33\x3d\x9e\xce\xd9\xf8\x4b\x07\x97\xd3\xed\xdf\x37\x0b\xbc\xe4\x18\xc3\x5c\x47\x1b\x1e\x53\x4c\x6c\x13\x13\x78\x40\x91\x77\x07\x2b\x31\xe6\xeb\xf8\xd5\x75\x36\xa9\x9c\xa2\x0f\x67\x8d\x38\xd4\x75\x9c\x61\x1d\xc9\xb8\x5a\x89\xd5\x9f\x3b\x59\xce\x43\xca\x15\x3d\xa0\x38\xf7\xb1\x8d\xc3\xbe\x9a\xb9\xac\x8e\x8d\x6d\xf2\x63\x98\xf6\x57\x94\x5b\xb1\xce\xee\x9d\x53\xdd\x59\x23\xb6\x7e\x8e\xf9\x2d\xb4\x14\xab\xf3\x6e\x15\x14\xd3\x7b\x48\x39\xc4\x57\x23\xd9\xc7\x94\xc9\xa4\x8e\x4c\x3e\xa2\x5c\x54\xcd\xf9\x4b\x1a\x59\x25\xeb\x8c\x14\xf5\x88\x15\x98\xd3\xa4\x99\xcf\x21\xdb\x97\x77\xd4\xb4\x5b\x67\x83\x1f\xe0\x13\x19\x66\xc4\xad\x28\x6b\x4a\x88\xe7\x53\x8a\x5c\xbd\x3f\x0b\x66\xb1\x92\x4b\xb0\x8e\x57\x1e\x53\x4b\x22\x59\x49\x86\xdf\x86\x18\xc5\x3a\xb7\xb1\xb0\x87\xf6\xfd\xc5\x0a\x2c\xd7\x76\xd3\x3a\xb3\xc6\x05\xba\x40\x2a\xe7\xaa\x78\x73\xd8\xf6\xe6\x22\xf6\xe6\x30\xf5\xe6\x22\xf1\xe6\xb2\xed\xcd\x05\xf3\xe6\x42\xfd\xaf\x30\x36\x74\x2e\x8b\x53\x5b\xa7\x76\x5b\x31\x1b\xb1\x05\x1b\x7b\x1b\xde\x06\xcf\x79\xb6\x52\x72\xbe\xe1\xed\xb6\xe6\xde\xc2\x5b\x78\x43\x9e\x71\x75\xcf\x90\x31\xb1\xa5\x8a\xec\x88\x5d\x31\xa5\xef\x5d\x98\xb4\x02\xde\x6f\x05\x62\x0b\xcf\xed\x8a\x5d\xb1\x8d\xff\xd5\xef\x5d\xf0\xc1\x87\x39\xdf\x83\x39\x9e\x31\x57\xb6\x9c\xff\xa6\x4c\x6d\x0d\x5b\x07\x94\xed\x53\xb1\xf4\x21\x91\x5d\x3a\xf0\xbb\xec\xc8\x8e\xec\xaa\xdf\x6e\x11\x19\xc4\x75\x51\x6d\x14\x5b\x7c\xd8\x0a\x65\xc2\xa7\xad\x80\x4f\xc4\x26\xa4\xb0\x05\x53\x3e\x85\x2d\xd8\xe6\x0b\x88\x20\xe5\xb1\x98\xca\x50\x46\x22\xc6\xcc\x6d\xa1\x8c\x65\x24\x22\xd9\x16\x7b\x62\x53\x86\x62\x21\x07\xb2\x8d\xfd\x0d\x64\x5f\x84\xea\x5e\xb1\x14\x73\xd9\x16\x23\xa1\xce\x6c\x4a\x26\x7d\xd9\xc6\x7b\x63\x31\x12\x53\xd9\x16\x4b\xd9\x11\x85\xd8\x16\x53\x39\x93\xdb\x6a\x5c\xb8\x2f\x27\xaa\x2d\x62\x4b\x7c\x45\x9e\x2b\x76\x21\xc1\x16\x26\x62\xc2\x98\x3c\x0f\xae\x92\xe7\x9e\x7a\x9f\x5c\x13\x9f\x13\xb7\x89\x5b\xc5\xbd\xe2\x56\xf1\x39\x71\x87\xf8\x9c\xbc\x51\xde\x28\x97\x47\x3a\x72\x47\xee\x1c\x91\x47\x3a\x8c\xb1\x5f\x63\xbf\xd4\x88\x78\x9f\xcb\x58\xc4\xb0\x47\xf0\x13\x52\x9e\x9f\x91\x1c\x01\xe6\x79\x16\x4c\xdd\x09\x1b\x32\x17\x5d\x05\x59\x10\xcb\x8c\x47\x30\xe3\xb1\x8d\x04\x1e\xb8\xb9\x79\x79\x21\x07\xb0\x87\xcf\x04\x98\x37\x46\x8d\x72\xce\x0b\xbe\x89\xd9\x9f\x73\x99\xc3\x54\x54\xd0\x15\x6d\xa2\x21\x5d\xac\x39\xa1\x7a\x46\xb2\x10\x85\x50\x6d\x48\x78\x4a\xf8\x9e\xcb\x18\x66\xa2\x2d\x06\x80\xf1\xe7\x79\x48\xb9\xbd\x7d\xe4\x80\x85\xe8\xf3\xb1\x37\x97\x05\xcc\x30\x33\x75\x02\xbb\x1a\xce\x79\x24\x32\x27\x83\x42\x2e\x73\xd1\x06\x1d\xe3\xbe\x8f\xbd\x0a\xf9\x04\x36\x64\x07\x74\xc6\xe9\x81\x37\x57\x7d\xe2\xa9\x97\x8b\x4c\xa8\x63\x28\x86\x3c\xf0\xe6\x32\x11\x6d\x18\x51\xcc\xf7\x0e\xdf\x80\xa9\x48\x44\x24\x22\x91\x08\x5f\xf8\x7c\xc3\xdb\xf0\x72\x2f\xf3\x26\x32\xf1\x0a\x6f\x2c\x33\xfc\x35\xf5\x42\xcf\xf7\x02\xf5\x66\xa1\x46\x71\x1b\x7b\x58\x51\x46\xe9\x91\x4c\x60\x53\xf5\x84\x77\x64\x2e\xc7\x62\x93\xb2\x1d\xf4\x1b\x39\x19\xaa\x95\xdc\xc1\x89\x1c\x48\x5f\x47\x9d\x17\xdb\xd8\x9f\x44\x6c\x8a\x09\xe8\x7b\x3b\x94\x2d\xc9\xe4\x85\x60\x44\x7b\xd4\xdd\x48\xe3\x45\x84\x54\xa2\x2f\xfb\x44\x41\x4d\x3e\xbf\x21\x57\xb3\x92\xf3\x31\x74\xf9\x1e\x5f\x02\xe3\x29\x0f\xf9\x06\x9f\xf0\x88\x8f\x78\xc2\x37\x79\xca\x37\xbd\x19\x8f\x78\x97\x33\x9e\xf0\xd4\xdb\xe6\x89\xb7\xe1\x4d\x78\xc2\x43\x6f\xd3\x9b\xa9\x7e\x7b\x63\x2f\xf7\x46\x1e\xa3\xf6\x86\x62\x20\x73\x6f\x6e\xa9\x7d\xe8\xed\x62\x8b\x07\x94\x07\x11\x79\x8e\xa8\x6c\xee\x32\x43\xb7\x32\x3b\xe7\x39\x59\x22\x42\xca\x91\x54\xf1\x9a\xab\x44\xe6\x9b\xd8\x10\x5d\x59\xf0\x05\x5f\xf0\x11\xaf\xf8\x4c\x16\x7c\x8f\x67\x7c\x97\x6f\xf2\x09\x9f\xf2\x0d\x3e\xc6\xde\x4c\xf8\x06\xdf\xe2\xdb\x7c\x9b\x57\x3c\xe7\x9b\xbc\xe2\x05\x9f\xf0\x11\x1f\xf3\x29\x8f\xbc\x2d\xde\xe6\x43\xce\xb8\xcf\x19\xdf\xe2\x89\x37\xe3\x8c\xf7\x79\x97\x67\x7c\x9b\xfb\xdc\xe7\x6d\x9e\xf0\x36\xf7\xbd\x8c\x47\x32\x87\x99\x88\x5a\x0b\x99\x43\x5b\xe4\x96\x67\xb8\x79\x5b\x02\x59\x88\xb6\x88\x45\x24\x86\xb0\x14\x81\xe8\x8a\x50\x04\xc2\x17\x91\x08\x04\x83\xb9\x68\x8b\x36\x6c\x8b\x08\xc6\xb0\x2b\x42\xd1\x85\x14\x96\xc2\x17\x21\x54\xd0\x86\x8c\x77\xa1\xcf\x17\x10\xf0\x4d\x48\xf8\x92\xef\xf2\x25\xaf\xf8\x06\x9f\xf1\x39\xa4\x10\xf1\x19\xdf\xe5\x63\xbe\xe0\x39\x74\xa1\xcd\x77\xf9\x94\x4f\xf8\x16\x9f\xf3\x39\x6f\xf3\x8c\xef\xa9\xfe\xf2\x6d\xde\xe7\xbb\x7c\x9b\xc7\x7c\xc8\xb7\x78\x84\xcf\x33\x3e\xe0\x7d\xbe\xc9\x19\xdf\xd4\x7d\xe6\x5d\xde\x56\x3d\x6e\x2d\x65\x04\x89\x85\xaf\x10\x52\xd8\x40\x6f\xc9\xd4\x70\x53\xde\xb7\xb0\x58\xd0\x6c\xe8\x3e\x47\x38\xbf\x09\xe5\x31\x30\x7c\x3a\xa6\x2c\x60\x26\x87\x43\x64\xb9\x7b\xee\x64\xdc\xd7\x73\xa8\xe5\x57\x9d\x4d\x3d\xa6\x1c\x15\x63\xcc\xb8\x58\xd9\x1c\x5f\x06\xa2\xd5\x59\x9d\x21\xa2\xce\x34\xae\xf9\xb2\xfe\x9d\x61\xd6\xf3\x9c\x32\x62\x05\xf8\x3b\xa6\xf7\x8e\x30\xbf\xa6\xce\x8d\x35\xa2\x0c\x9a\x3a\x5b\xe7\x98\xf2\x5f\xe9\x79\x4b\xb0\x3d\x46\x8a\xca\x28\xd7\x9d\xe2\xa4\xbe\xec\x23\x26\x45\x24\xb3\x64\x56\x8e\x19\xd2\xfb\x0a\x9b\x9d\xd9\xa7\x7e\xe9\xbc\x13\x81\xec\xa0\x1c\x33\x34\xf9\xb6\xf8\x42\x0e\x60\x4e\xd2\x4a\xdf\xe4\xc2\xe6\x73\x2f\x96\x05\xef\xf0\x8a\xa4\x04\xc2\x79\x11\x43\x0a\x81\xc8\x5b\x33\x1c\x9d\x10\x73\x74\x4c\x64\x21\x30\x77\x3c\xdf\x6d\xe4\x6b\xc1\xb6\x83\xae\x39\x17\x43\x1c\x91\x0d\xca\x28\x3f\x70\x64\x97\x90\x68\x62\x62\xe7\x33\xc3\x11\x33\xb5\xf4\x29\xf3\xbf\x3a\x12\xb1\x67\xe8\x0a\x0c\x65\x25\x36\xc5\x96\xd8\x90\x43\xb1\xc4\x7b\x7d\x99\x8b\x4c\x0e\xc5\x36\x67\xfa\x0e\xb1\x69\x73\xa8\x50\x76\x78\xb1\x81\xad\xe9\xe2\x0c\x1b\x79\x74\x02\x1d\x31\x74\x60\xc6\x48\x3e\x6d\x75\xa7\xb7\xc5\x43\x47\x4e\x74\xf3\xb0\x54\x98\x93\xb9\x90\xb9\x97\xf0\x81\xce\x0e\xed\x2d\x88\x0f\xa5\x36\xbf\x7e\x54\xbf\x8b\x2f\x34\x84\x72\x33\x37\x15\x9f\xda\xbc\x16\x19\x72\xb8\x00\x42\x59\xc1\x88\xc7\x3c\x41\x38\xca\xad\xcc\x98\x73\x1f\x71\x57\xe3\x47\xc5\x53\x81\xf3\x2f\x0a\x11\x50\xc6\xd3\x02\x28\xdb\x89\xe8\xf0\xbe\xc2\x62\x05\x51\x7c\x2e\x53\xa1\xde\x5a\xc1\x42\x04\x62\x20\x42\x98\xc3\xc2\xca\xe5\x01\xd6\x9e\x20\x85\xd6\x67\x50\x6e\x13\x0b\x19\xd9\xec\x36\x38\xab\x6a\xbc\x6d\x8e\x8e\x5c\x56\x62\x4a\xed\x1a\xcb\x81\x8c\x44\x57\x6e\x28\xcc\x42\xe9\xa2\xce\x12\x54\x09\xcd\x43\x62\x6a\x75\x21\x12\xd8\x96\x5d\xbe\x4d\x63\x83\xf9\xf9\xbc\x39\xf2\xa7\xbe\xb7\xe0\x81\x98\xc0\x16\xec\x7a\xbe\xe8\x8a\x5c\x74\x45\x24\x52\x91\x8b\x40\x44\xa2\x23\x98\x08\xc5\x50\x74\x44\x47\x74\x91\x82\xb5\x45\x5f\x0c\x44\x8a\x3d\x5a\x8a\x1c\x3f\x19\xd2\xba\x2e\x16\x5f\xa4\xa2\x10\x4c\xf1\x4d\xd1\x16\x0c\x9f\xcb\x60\x4f\x51\x39\xd1\x86\xa5\xe8\x63\x0d\x11\x2c\x44\x07\x16\xb0\x27\x06\x58\x6f\x0a\x7b\xf8\x74\x22\x32\x11\xc1\x52\x44\x22\x14\x03\x31\x14\x4c\xd5\x0b\x0b\xc1\x04\x13\x85\xf0\xc5\x40\xb5\x04\x16\xa2\x8d\xef\x18\xe8\x77\xc3\x5c\xe4\xf8\x7c\x2c\x32\x58\xc0\x14\x29\xe9\x52\xc4\x22\x14\x6d\x11\x89\x1c\x46\xa2\x2b\xfa\xb0\x10\x03\xe1\x8b\x0c\xb6\x61\x5b\xbd\x5d\xf8\xa2\x23\x52\x31\x14\x03\x98\xe3\x95\x08\xa9\x74\xae\xf8\x39\xec\xc1\x42\xc4\xaa\xb7\x50\xc1\xae\xe8\xc2\x86\xf0\xf1\x4d\x5b\x82\x89\x48\xb4\x85\x0f\xbb\xb0\x07\x73\x48\x45\x5f\xd5\x20\x42\x58\x08\x5f\xf4\x71\xac\xda\xa2\x0b\x53\x58\x88\x48\xc4\x22\x10\x81\xe8\x78\x03\xd1\xc1\x9e\x77\x61\x4f\xf8\xb0\x25\xda\xd8\xf3\x08\x47\x29\x16\x03\x35\x4a\x6a\x24\x60\x13\xb6\x61\x2a\x62\x91\x0a\x86\xef\xde\x15\x4c\x04\xb0\x25\x7c\xd8\x54\x7d\x81\x0d\xec\xaf\xaf\xea\x84\x39\xcc\x61\x89\x7d\x1f\x62\x8d\x23\x98\x89\x8e\x08\x55\xbf\x60\x01\x4b\xd1\x81\x0a\x46\x22\x82\x39\x6c\xc0\xae\x82\x5f\x35\x8a\x30\x15\x43\xe1\xc3\x0c\xfb\xab\xe6\x34\x81\x19\x2c\x61\x0f\xf6\x54\xfb\x60\xa6\x66\x07\xe6\x32\xc5\xd9\x19\xc3\x42\x84\xaa\x4d\x6a\x06\x20\x87\x89\x08\x05\x83\x99\x2a\x22\x84\x0d\x98\xc1\x1e\xcc\xd4\x9d\xad\xb9\xe8\xa2\x6c\x16\xc3\x48\xb5\x59\x71\x47\x98\xc2\x04\x36\x45\x5b\xf1\x3b\x11\xc3\x18\x36\x61\x06\x73\x98\xc0\x4c\x8d\x28\x2c\x45\x17\xc6\xb0\xad\x7a\x06\x23\xbc\x73\x88\x4f\xcd\x61\x04\x15\x6c\x80\x9a\xcf\x3e\x8e\xf2\x26\x28\x18\x0b\x60\x22\x22\xd8\x42\x08\x0c\x60\x03\x36\x21\xc3\x3b\x42\xfc\x3d\x11\x1d\xc8\x61\x86\xe3\xb7\x84\x2d\x6c\xdb\x12\xb6\x61\x04\x29\xcc\x61\x1b\xb6\x60\x04\x9b\x50\x41\x01\x63\xc8\xd4\x5c\xe2\xd5\x2d\x98\xc3\x00\x62\x7c\x76\x13\x76\xa1\x80\x02\x46\x08\x1d\xbb\x38\xd7\x39\x4c\x60\x09\x4b\x11\x2a\x68\x80\x31\x8c\xd4\x48\xc2\x9e\x60\xb0\x07\x19\x0c\x61\x0c\x39\xb6\xb6\xc2\xcf\x39\x6c\x0a\x1f\xfa\x38\x6f\x6a\x3e\xb6\x60\x0c\x15\x6c\x82\xa2\xdd\x4b\xac\x55\xd5\xdb\x16\x0c\x0a\xbc\x9e\x82\x92\x23\x06\xd8\xe3\x31\xcc\xb1\x9e\x5d\xa8\xb0\x17\x03\xc8\x21\x87\x4c\x74\xb9\x82\x94\x04\x36\x20\x81\x5d\xe8\x50\xcf\x54\xbb\x0a\xd8\xc6\x36\x6c\xc3\xa6\x60\x90\x62\xeb\x55\x2b\x22\x18\x42\x81\x90\x32\x03\x75\x5e\xf5\x6c\x0e\x09\x04\x50\x80\x9a\xd1\x19\x6c\x41\x04\x01\xec\xc1\x18\x02\x48\x21\x84\x5d\xd8\xe6\x33\x7c\x5f\x07\xba\x30\x83\xbe\x6a\x35\x5f\xe0\x3b\x55\x0f\xa7\xd0\x85\x2e\xe4\x10\xc3\x36\x4c\x60\x0f\xba\x50\x41\x06\x1d\x48\xa0\x0d\x6d\x08\xa1\xe0\x33\x59\x89\xc4\x4b\x64\xc2\x27\xde\xc2\xdb\x84\x09\x72\x20\x23\x81\x26\x32\x14\x8d\x0c\x69\x42\xcb\xeb\x99\xcc\x89\x1e\xe5\xc8\xeb\x0b\xca\x0d\x9a\x61\x24\xc8\x82\x57\xc8\xc5\x47\x7c\x4b\x46\xde\xa6\xd1\xfc\x21\xe0\x53\xbe\xa5\x24\x1b\xd1\x97\x23\xbe\xed\x6d\x79\x0b\x39\xf4\x76\x61\x03\xc6\x30\x81\x09\x64\xd8\x93\x4d\x18\x82\x82\xc5\x18\x12\xd8\x03\x1f\x42\xe8\xc2\x04\xda\x50\x40\x1b\x06\x7c\xc9\x67\xd0\xe6\x0b\xbe\xc7\x87\x7c\x5b\xc4\xf8\xf6\xdc\xe6\xda\xad\x70\xff\x9a\xd2\x36\x96\x24\x03\x28\x2d\x66\xa6\xa8\x2c\xf7\x29\xab\x58\xac\xf4\x0d\xca\x66\xaa\x78\x91\xa2\x01\x0b\x92\x17\x94\xb4\xb4\x61\xe5\x9b\x4a\x28\xad\xbf\x52\xd8\x01\xdb\x48\x37\xe6\xa2\x8f\x94\x63\x01\x53\xd8\x56\xf8\xa3\xce\x23\x36\x2b\xfc\x98\x22\x04\x6f\xc3\x9e\xfa\x2f\x3a\xb0\x09\x5b\x48\xd1\x3a\x0a\x7a\x14\x8e\xd3\x75\x05\xdb\x8a\x02\x6d\x52\x2d\x0a\x7e\x17\x5e\xe6\xf5\x61\x03\xa6\x58\x93\x3a\x3b\xc5\x7b\x76\x61\x0a\x1b\xf8\xce\x6d\x98\x43\x86\xef\xaa\x10\x92\x3b\xb0\x44\xbc\xd8\x16\x0c\x76\x11\xba\x67\xf8\x06\x05\x67\x1a\xa6\xa7\x78\xa8\x51\xcd\xa0\x40\xb8\xdc\x42\x28\x52\x98\x54\xc0\x2e\x61\x96\xc6\xab\x31\x84\x38\x03\x53\x98\x42\x21\xba\x90\x21\xfe\x29\x08\x1a\x28\xa8\x44\xfc\x53\xb8\x92\x28\x58\xe7\x33\x18\xc2\x04\xba\x08\xb9\x09\x6c\x42\x1f\xe6\x10\xf0\x25\xf4\x21\x81\x3e\x44\x7c\x0e\x43\xe8\x43\x0a\x6d\x88\xf8\x1e\x04\x88\x15\x8a\x0e\xe4\xf8\x3b\x84\x48\xc1\x37\x5f\x2a\x48\xe4\x7b\x78\xae\x0f\xa1\xd2\x51\x91\x43\x4c\x60\x13\x16\x7c\x17\xc6\x10\xe3\x9b\xa6\x30\x82\x39\x5f\x42\x88\x58\xa3\x74\xe6\x00\x18\x6c\x43\x0c\x39\x28\x4c\x57\x10\x9f\x42\x1f\x7c\x08\xa0\x0b\x3e\x4a\xd4\x53\xe8\xf0\x2d\x3e\xe4\x73\x3e\xe2\xdb\xd0\xe7\x73\xd8\xe5\x1b\x7c\xce\x27\x7c\x0e\x1d\x11\x68\xfe\xec\x91\x9d\xcb\xab\x50\xd2\x1a\x13\x4c\x28\xb9\x66\xe4\x45\x1e\xca\x61\x62\xcc\x3b\x3a\x07\xaa\x88\x1a\x96\x2c\xc5\xdf\x03\xbe\xe4\xba\xae\x84\x33\xb4\x67\x0d\x31\xb7\x6a\xc1\xb7\x78\x9b\xf2\x9e\x27\x64\xab\x1a\xa3\x9c\xed\xa3\xf6\xa6\xb4\xec\x80\xfb\x7c\x02\x09\x0c\x90\x7f\x0e\x44\x0c\x4b\x45\xdf\x45\x02\x5b\xc8\x89\x42\xd8\x13\x81\xc8\x44\x5b\x64\x22\x10\xb9\xe8\xc0\x0c\xf9\x74\x8c\x74\x59\x71\xe4\x42\xc4\x4a\x3e\x81\xb9\xe2\x6b\xc8\xf3\xda\xa8\x8f\x4c\x91\x93\x64\x30\x47\x6e\x13\xc2\x5c\x71\x76\xc5\x63\x91\xea\x56\x28\x11\xb5\xf1\x5a\x57\x64\xa2\x03\x53\x94\x01\x14\x3c\xed\x22\x9f\xdf\x44\x4a\xb7\x8b\x7c\xbb\x8b\x5c\xb3\xab\xb9\x1e\x6c\xc0\x1c\x65\x02\x06\x0b\xa4\x87\x5a\xc2\x08\xf5\x33\x8a\xd7\x08\x5f\x74\x71\xfe\x14\x17\x52\x9c\x67\x57\xf1\x33\xe4\x46\x7d\xe4\x39\xbb\xa2\x83\xfa\xd3\x58\x28\xba\xa4\x61\xba\x82\x54\xd1\x49\xd1\x91\x11\x1f\xcb\x8a\xeb\x7c\x70\x29\xdf\x23\xac\xae\x33\x78\x0f\xc9\x9a\x19\x63\x76\xdb\x94\xe4\xf4\x14\xa5\xf2\x0d\x93\x3b\x57\xcd\x9b\xf0\xbd\x48\x18\xfb\xda\xd0\x95\xae\xc5\x12\x65\xf0\x94\xc7\x8e\xd4\x95\x13\x0d\xcb\xbc\x58\x0c\x65\xce\x91\x9e\xc0\x82\x74\x0d\xb4\x1d\x8a\xae\xac\xf8\x16\xcc\x4d\xbe\x5f\x6f\xce\x07\x52\xe9\xd8\xb9\xcd\x76\x19\x79\x7b\x44\x47\x72\xd4\x46\x06\x58\x93\xcf\xb1\xed\x7c\x40\x6d\xa9\x28\xbf\xdd\x50\xb6\x29\x6f\x1e\x65\x9b\xe3\x7b\xa4\x85\x0d\x88\x86\x75\x94\xfe\xc2\x17\xea\x2a\x5f\x20\x5c\xf9\xa4\xd7\x65\x8d\xcc\x82\x85\xb5\x18\x60\x96\x43\x68\xcb\x50\x2a\x5a\x5b\x39\x7d\xcb\x48\xca\x5d\x10\xe5\x53\xd7\x02\x39\xf0\x46\x7c\x1b\xa9\x1e\xe3\x1d\xa4\xde\xa1\xb5\x3e\x86\x4e\x6e\x62\x05\xaf\x8c\x6f\xa2\x06\x33\xa0\xda\x54\x3d\x81\x93\x4b\xb2\x20\xdd\xad\x4f\xf6\x8f\xb1\x7d\x36\xd2\x92\x38\x65\x1f\x0e\xac\xa5\xb8\x90\x6d\xba\xdb\x66\x1b\xc5\xf6\xe9\xcc\xc5\x09\xca\xba\x99\xcc\xf8\x44\xe6\x3c\xc6\x11\x8d\x91\xbf\xf4\xbd\x99\x8c\xf8\x40\xa8\xb9\xe8\xa2\xad\x28\x97\xbe\xce\x08\x2a\x36\xa5\xa2\x20\x29\xcf\x79\xc1\xdb\x7c\xcc\x07\xa8\x27\x6f\xf0\x98\xc7\xde\xae\x97\x7a\xda\xda\x5e\xe0\x5b\x02\xe4\x09\xb9\x37\x95\x43\xbe\xeb\x0d\xa9\x25\x01\x69\x5f\x4a\xee\x56\x34\x8f\xf1\x88\xf8\x41\x41\xd8\x5d\xeb\xb4\x89\xa3\xb9\x39\x39\x0c\xa1\x2f\x73\xde\x45\xaf\x0f\x9d\xa7\xd0\xe4\x4f\x8c\x50\x03\x4c\x49\xab\x36\x5c\x93\xac\xfb\xde\x1e\x65\xbd\x56\x30\xbc\xa9\x6b\xe5\x7d\xd2\x8a\x0a\xe2\x73\xae\xfd\xbd\x7e\x73\x61\xf3\x6f\x67\xb0\xad\x35\x28\x6f\x46\x76\x17\xdf\x68\xa3\xb0\xa0\x15\x58\xb4\x45\x7b\xdb\x32\xe5\x81\x9a\x79\x7d\x95\x4f\xb8\xe5\xa4\x02\xad\x4e\xd0\xc5\x39\x48\x78\x2c\x74\x0e\xe8\xdc\xcb\x5b\x73\x5c\x29\xd0\x56\x1f\xc5\x55\xa7\xd8\x4a\xfd\x39\x97\x89\x18\xe1\x6a\x40\x22\x02\x39\x14\xaa\x9f\x63\x3e\x81\x40\x69\x78\x50\xf1\x0d\xa5\xe5\x79\x9b\x3c\x6f\xa9\xbb\x11\x5b\xb8\x0f\x11\x6a\xa2\x4a\xe7\x2e\x44\x2c\xfa\x28\x81\x66\xc8\x13\x95\xcc\x90\x23\x27\xea\x73\xb4\xde\xf3\x0d\x25\x77\xa1\x45\x67\x44\xf6\x4a\x8d\x09\x7d\x94\x55\x8a\xc6\x5a\x83\xc9\x40\x3c\xa4\xb1\xa3\x2c\x93\x7c\x57\xe6\xde\x26\x8d\x63\x6a\x35\xf5\x8a\xf0\x2a\xd4\xb0\x8e\xd0\x5b\xc9\x40\x50\xee\x7c\x31\x34\x19\xc9\xbd\xbe\x0c\x64\x25\x50\xdb\x16\x7d\xca\xcb\x18\xc8\x84\xac\x7f\xcd\xd5\x00\x43\xb9\x06\x32\xe2\x31\xd9\x72\x7c\x19\x73\xc5\xc5\x36\xf9\x06\x4f\xd5\x2c\x58\x1b\xa1\xc2\xcf\xb4\x91\x1f\xb3\xe0\x03\xde\xa1\x75\x97\xc2\x5d\x51\xe0\xa1\x03\x85\x4a\x37\xc7\x5c\xf3\x2d\xa4\x74\x46\x3f\x16\x11\xd1\x93\x00\xad\x0c\xb1\xcc\xb8\xb6\xd6\x8c\x65\x2e\x62\x9d\x4f\x92\xa7\xa4\x67\x8f\x50\x77\x0f\x05\xce\x24\xd2\x99\xc8\x52\x0d\xa2\x8d\x5a\x73\xe5\x3e\x4c\x81\xc9\xc4\x59\x9b\xc0\x2b\xe0\xf3\x25\xcf\x78\xca\x4d\xd6\xfe\x9c\xb7\x3d\x85\x2b\x5d\xb4\xc3\x14\x32\x43\x7d\x2a\x11\x43\xe4\x3e\x99\xc8\x50\xfe\xef\xa2\x1d\x36\x12\x7d\x2c\x3e\xf2\xb7\x3e\x6a\x9c\x3e\xf2\xa8\x50\x24\xa2\x8f\x76\xb6\x11\x3e\x9f\xa2\x56\xb5\x8d\xb2\x7d\x07\xb5\x73\xe4\x79\x4a\x36\x43\x2b\x9c\xd2\x50\x03\xbc\xa6\xb8\x99\x92\xd8\xba\xb0\x81\x1a\x51\x2c\xda\xc8\x99\xa6\x50\xc0\x02\x66\x62\x4f\x56\xda\x9a\x2d\xfa\xc2\xda\x52\xbd\x89\xac\x3c\x35\x3e\x81\x54\x92\x55\x57\xe6\xb0\x29\x36\x50\x1a\x53\x75\x2a\xf9\x2a\x93\x23\xc5\x13\x51\x52\xf3\x61\x06\x23\xd4\x36\x2a\xd4\x8d\x02\xd4\x59\x12\x94\x63\xa7\x30\x95\x01\x6c\x78\x29\x04\xd0\x17\x43\xe8\xf0\x19\xc4\x5a\xeb\x83\x6d\x48\xb0\xae\x54\xf4\xa1\x80\x08\x06\xe0\xcb\x00\x12\xbe\x0b\x7d\x68\x83\xaf\x6a\xe2\x23\x3e\x52\x52\x3a\x1f\xf3\xa9\x4c\xc5\x9e\x37\x27\x08\x0e\xa5\x1a\x93\x81\xc8\x54\x8b\x68\xdc\x18\xf1\x62\xa5\xf3\x87\x28\xc3\x29\x4e\xab\x74\xfd\x00\x47\x23\x82\x99\x7a\x46\x71\x5f\xad\x3d\x89\x00\x47\x47\xf1\xf6\x3e\xf2\x74\xa5\xd9\x28\x29\x76\x0c\x63\x58\xc2\x0c\xb5\x5a\xa5\xc9\x2d\x05\x83\x2d\xd4\x23\x14\xff\x1f\xc1\x10\xcf\x8e\x61\x17\x32\x5e\x89\x42\xc9\x31\x52\x49\x84\x5b\x0a\x46\x21\x23\x7a\x1f\xe9\x4c\xae\xde\x5c\x16\x62\x42\x78\xa9\x33\x88\xa6\x3c\xe4\x89\xcc\x3d\x1d\xcd\xbd\x6f\xa1\x18\x57\x2e\x60\x26\x23\x08\x51\xa2\x4a\x65\x0c\x8a\x16\xa8\xd9\xc7\x6c\xb6\x7c\x0c\x03\x3e\x47\x79\x7e\x2c\x95\xee\xe6\x43\xc5\x97\xbc\xc3\x07\x7c\x8b\x6f\xc0\x9c\x2b\xa9\xd7\xe7\x7b\x3c\xe5\x85\x37\xe4\x23\xcc\xf4\x8f\xb6\x12\xbe\x54\xff\xd1\x9a\x56\x10\x76\xeb\x56\x0e\x14\x94\xc9\xbc\xb5\xa1\x71\x54\x74\x88\xf6\x0f\xf8\x94\x6f\xf3\x58\xd1\x5d\xe4\x31\x84\x65\xc8\x21\x11\x9f\xa4\x2f\x2a\x31\x44\x5b\x49\x8e\xf6\x94\xa1\x28\x44\x26\x46\x62\x28\x72\x51\x89\x00\xad\x1d\xea\x5a\x2a\x12\x91\xa2\x2d\x26\x15\x03\x05\xc9\x62\x4f\x44\x0e\xdd\xcf\x61\xc2\x11\x93\xf8\x16\xd9\xeb\x22\x37\xe7\x33\x9f\xa1\xa5\x3f\x26\x6e\x9b\x23\x9d\x71\x57\x17\x63\x7b\x2f\x66\xe7\x07\xe4\x61\x7c\x8b\xce\x3a\x99\x5c\x49\x0b\xeb\x2b\xbe\x22\xba\xa2\x4f\x56\x5e\x25\x03\xc7\x90\x8a\x91\x18\x53\x4f\x14\x5e\x76\x44\x85\x90\x33\x40\x0b\x8e\xd2\x88\x51\xc6\xf5\x30\x77\x3a\x62\x6c\x25\x0a\x31\x17\xea\xb9\x81\xc8\xc9\xee\x33\x43\x4d\x7b\xa4\x46\x45\x16\xad\x5d\xa2\x1e\x23\x99\x81\xe2\x31\x7a\xad\xa9\x2f\x07\x8a\x3f\x89\x44\xe1\xac\x0c\x60\xa1\xb0\x1a\x12\xc4\xdd\x84\x7a\x9a\xd5\x36\xeb\xd6\x36\x8e\x7a\x4e\xf1\xdf\x52\x19\xc8\x11\xd1\xd4\x84\xf8\x60\x80\x14\x46\xe9\x0e\x05\xd7\xd6\xdd\x42\xf8\x6c\x03\x29\xc2\x04\xa1\x7a\x61\xa4\x0b\xe4\xf6\xf8\xcd\x9b\xc8\x31\xca\x8e\xaa\xe0\x0a\xa2\xfa\xe6\x2d\xf4\xaa\x97\x8d\x01\x17\x52\xf1\x6d\xd6\x5d\x77\xb5\x40\x5b\xf5\x42\x6c\x83\xa2\xf4\x3a\xbf\xb2\x6f\x79\x33\xd1\x41\xb1\xb0\xf4\x35\xb7\xd8\x91\x3b\x3c\x62\x68\x65\x2d\xf7\xbc\xef\x7c\xcf\x1b\xf7\x17\x8e\x37\x55\x61\xed\xfa\x24\x8b\x88\xb9\x6c\x5b\xce\xa7\x25\xaa\x3d\xb1\x87\x6d\x0c\x48\x1e\x30\xd9\x9c\xfb\xc4\xb3\x42\xbb\x9e\xe3\x14\xae\x24\x5c\x26\x15\xfd\x5b\xc0\x2e\xf5\x7c\xbf\x67\x46\x9d\xf5\x38\x90\x01\x77\x33\x16\x0f\xbc\x5d\x1e\x90\x25\xb3\x82\x29\x8e\x7f\x60\xa5\xf0\x81\xb7\x94\x85\x37\xb5\x7e\x09\x39\x65\x5e\xae\xc8\x96\x5c\xd8\xb1\x37\x6b\xe7\x01\xae\xb9\x67\xb2\xf0\xac\x65\x9d\x6c\xab\x4a\xd6\x1d\xc8\x36\xad\x3f\x86\x98\x2f\x5a\xaf\x48\xa8\xeb\x95\xe7\x7b\x66\xb5\x3e\x27\x7b\xbd\x2e\xba\x6d\x05\xcc\xed\xfc\x68\x09\x20\x96\x91\xc6\x49\x6f\x8b\x56\x1b\xaa\x46\x4f\xcd\x2c\xe6\x5e\x97\x66\x7d\xa4\xb5\x3c\x8e\x5c\x58\x24\x2b\x99\x9f\x15\xf6\x8d\x6d\xde\x65\xed\xbf\x10\x93\x14\x19\x61\x0f\xf4\x0a\x4c\x46\xd2\xb4\x5e\x73\x18\x51\x0c\x91\x14\x3f\xdb\xf4\xdd\xcd\x4f\xad\xfa\x3a\x24\x1b\x71\x8a\xb1\x0e\x7d\x96\xdb\x9c\xfe\xf8\x1f\x98\xe3\x37\xa0\xa5\xd7\x4a\x41\x04\xb6\x26\xa6\xb9\x48\x9d\x5c\xf2\x46\x1b\xca\xb0\x7d\xda\x6a\xa3\x71\x22\x80\x04\xf1\x37\xc0\xd2\xb5\xfe\x16\x06\xa2\xbb\x6a\xec\x60\xd3\x40\x85\x5d\xb7\xcd\x61\x17\x6d\x31\xa6\x7e\xa5\xa7\x76\x71\x5c\xd5\x58\x0c\xc4\xd2\xf2\x80\x08\xad\xfe\xa1\x68\xe3\x7d\x7d\x28\x70\xb5\x74\x88\x12\xcb\x88\xc7\x8e\xb4\x33\x77\xa8\x60\x5b\x17\xa1\x61\xa9\x10\x8c\xf4\x35\x3d\xce\x7d\x92\x60\x7c\xca\x7c\x6d\xac\xf1\x9a\xf6\x0e\xf1\x8e\xe1\x01\xf8\x65\xe9\x2b\xdf\x6c\x5c\x8d\xad\xf4\xaf\xee\x64\x58\xe3\xd0\x91\x93\x1c\xf8\x27\xef\x93\x98\x66\x3d\x23\xde\xd2\x95\x89\xd2\x34\xbc\x4a\x16\x3c\xc2\xb5\xb2\x8c\x20\x2c\x43\xb8\xed\xcb\xb6\x1c\x90\xe6\x3b\x72\xe8\x8d\xb6\x4b\x28\x4a\x1a\xd9\x6c\xf1\x31\xf5\xa7\x4f\x32\xa6\x69\xd7\xc8\xea\x03\x85\x0b\x85\x16\x53\x15\x16\x54\x04\x19\x95\xe9\x95\x58\x88\x05\xe5\xfa\x36\xfd\x08\x49\xff\x2b\xb4\xc6\x6c\x34\x23\x8b\xa3\x7a\x44\x34\x4d\x18\x38\xfc\x46\x73\x32\x35\xf6\x23\x3e\x95\xbe\x34\x74\x37\x96\x43\xf4\xa3\xd1\xd7\x47\x54\x4b\x41\xf8\x6f\xb0\x46\xe3\xbd\xf6\x90\xd1\xd2\x6e\xe1\xcd\xbc\xbe\x92\xcc\x50\xa3\xf6\x89\x47\xe6\x56\xab\x32\x45\xf3\x85\x94\xd6\x3b\x03\xca\x3e\xdf\x6e\xe8\xc8\xba\xce\x58\x49\x10\x7c\x43\x69\x20\x1e\xce\x22\x9f\x11\x64\x17\x08\x8f\x95\xd8\xc0\xb1\xd0\x79\xe6\x23\x3b\x93\xb9\xed\x65\xd7\x52\x6b\x4d\x4d\xda\x92\x35\x32\xa7\x9b\xff\x19\x4a\xe7\xb9\xed\x8b\x86\xce\x5c\x74\xe4\xa0\xb5\x50\x67\x78\x97\xb8\x53\x22\x33\x8f\x91\xae\x57\x7b\x01\xc5\xd6\x8b\x29\xe0\xb1\xa2\xb0\xd0\xf6\x34\x54\x07\xde\x36\x6a\x89\x19\xf1\x1d\x82\x3b\xbe\x25\xc3\xd6\x42\x6b\x72\x3c\x40\x3c\x4d\x8d\x6e\xea\x6d\x9b\x75\x5f\x84\xb6\xcc\x42\xa5\xd1\x64\x43\xaa\xb1\xce\xc8\x5f\xe3\x9d\x9e\x15\xc3\x99\xf0\x0a\x8c\xa1\x03\x8c\x2f\xf8\x2e\xda\x27\xdc\x79\x70\x39\x5e\x21\x2b\x2f\xc6\xf7\x06\xb5\xad\x44\xa6\x38\xb2\x51\x03\xbb\x72\xcb\x69\x0b\x0b\x65\xea\x77\x85\xfc\x28\x43\xcb\xb2\xaa\xb9\xef\x45\x6a\x9e\x5a\xb3\xd6\x96\x1c\xca\x54\xd5\xee\xa1\x4d\xd7\x53\xf3\xd8\x47\xac\xd2\xda\xda\xd8\x6a\x64\x01\xc1\xcd\x10\xe9\x4c\x65\x29\x9d\xd6\x1b\xfb\x32\x26\x2d\x27\x77\xfc\xde\x3a\x44\x21\xcd\x5a\xba\xa1\x91\x63\x7a\x56\x5b\x51\xba\x32\xb7\x5a\x52\x9f\x38\x4c\x0d\x03\x95\x83\x77\x11\x8f\xac\xce\xaa\x57\x39\x0b\x31\xf7\x46\xe0\x2b\x39\x13\xda\x3c\xe5\x23\xde\x55\x1a\x22\xf5\xbf\xb2\xf7\x16\xc4\xe3\x63\xd9\x75\x66\xa4\x20\xa8\x1a\xd9\x5c\xfe\x8a\x13\x64\x62\x03\xdf\x1b\xe0\x2f\xaa\x43\x7b\x01\xa1\xa6\x36\x22\x3c\x57\x6d\x1a\x12\xb5\x53\xf4\xb2\x4b\x77\xa8\xd1\x9c\xd5\x9e\x87\x9e\xbe\x3b\x13\x73\xeb\x31\x68\x74\xdb\x01\x7a\x94\x69\xab\x41\x86\x9a\xff\x80\xae\x55\x68\xcb\xa9\x8c\x7f\x10\xb5\x39\x24\xf9\xd9\xd0\xa9\x8a\xf4\x4c\xb3\x66\x5e\xdf\x19\x79\x0b\xce\xf0\x7c\x87\xe4\x82\xd0\xa5\xd1\xbc\x6d\x78\x40\x6b\xc1\xdb\x5e\x4e\x12\x70\x0e\x5a\x26\xec\x12\x2d\xc8\xe8\xad\x96\x23\xaa\x96\x41\x9f\xd6\xc8\xd5\x1d\x1d\xc4\xf7\xcc\x19\xcb\x4a\xb6\x15\xa7\xf4\xda\x8e\x7c\xed\x5a\x78\xfa\xb2\xe0\x1b\xc8\x8f\x86\x54\x73\x4c\xbc\x54\xe3\x9f\xa2\x77\x01\xf2\x9c\xa8\x21\xc7\x75\xc1\x87\x2e\xe1\x73\xde\x1a\xa2\xf5\x64\xec\xb5\xbd\x3d\x6f\x83\x6f\xf1\xfa\x3e\xc5\x19\xe6\x54\x5f\xea\x6d\x2b\xb8\xd5\xdc\x8f\x8f\x50\x2f\x4a\x2d\xec\xe1\xf8\xf1\x25\x1f\x19\x4a\x8c\x12\x6e\x4c\xdc\x54\x8d\xd2\x90\x60\xde\xc8\x6f\x63\xba\x1e\x63\x2d\xa1\x9d\xef\xdc\xa1\xe7\x66\x7e\x07\x34\x76\x99\xf5\x0c\xcb\xa1\x96\x13\x03\xa2\x18\x01\x59\x61\x2a\xc4\xb4\x54\x16\xde\x82\xb7\x95\x86\x44\xf6\xc1\x81\xe9\x13\x5e\xed\x22\x15\x29\xac\x06\x54\x43\x93\xc3\x65\x3d\xa6\xf1\x0d\x50\x22\xf2\x8c\x87\x43\xce\x07\x04\xd5\x35\x8f\xad\xac\xfd\x2b\x86\x39\x6a\x72\x35\xf5\x34\x78\x17\x7b\x91\xb6\xb2\xf2\xa5\xa5\xc3\xa1\x37\xf1\xda\xc8\xc1\xb1\x0f\xbc\x4b\x94\x29\x74\x68\x7c\x4a\x14\x00\x69\x00\x5f\x92\x47\x85\xb6\x11\x85\x38\x2e\xc4\x4b\x60\x0b\xb6\xb4\xf4\xe9\xa1\x7f\xa5\xc5\xd0\x0c\xf1\xd5\xe5\x07\x43\xa2\x1f\x03\x3b\x8a\x86\x72\xa7\xe8\x65\x98\xa3\x97\x8a\x8f\x92\xf4\x00\x67\x29\xd0\x96\x31\x6c\x1d\x59\x64\xc4\xbc\xb6\x75\xb5\xb6\x61\x1b\x98\x2c\x60\xd3\x42\x7a\xea\xf8\xf2\x8d\x94\xa6\xed\xcd\x6a\xbc\x51\xff\xc5\x54\x2c\xd1\xe6\x96\x19\x78\xb6\x3a\x66\x6d\x59\x0c\xa4\x2b\x67\x87\xe8\x5d\x62\x7c\x83\x42\x63\x87\x40\xec\x44\xaf\x18\x31\x13\x53\xf2\x52\x49\x88\xbe\x8e\x2d\x47\x0f\xc4\xae\xd8\x95\x3e\xfa\x86\x6e\xc9\x42\x6c\xa3\xef\x5b\x81\xbf\xb1\xc8\x90\x87\xee\xba\x0a\xb5\x4d\xcd\x53\x66\x34\x2f\xaf\x8b\xd8\x14\x52\x2f\x06\x38\x86\x6c\x45\xb6\xc9\xbc\x0a\xdb\x50\x59\x4f\x15\x4d\x81\x02\x9e\x82\xba\x97\x91\xf5\x33\xaf\xe9\x2a\x44\x7c\xca\xbb\xde\xa6\x37\x83\x8e\xcc\xbd\x11\x5f\xc2\x90\xef\x41\x85\x9a\xa1\xa6\x97\x5d\x82\x84\xca\x5a\x3e\x33\x5a\x87\x30\x76\x6a\x4d\xab\x35\x65\x8a\xc8\x86\xb0\x70\x64\x86\x31\xae\x2d\x85\x35\x9d\xe0\x1a\x33\x8c\x94\x98\x22\x24\x04\xe4\x4b\x57\xc9\x98\xe8\x41\x8c\xb6\x58\x2d\x61\x29\x7a\xe4\x43\xd7\x42\xf7\x48\xe6\xad\x3d\xc2\xaf\x8e\x17\xc8\xcc\x4b\xad\xcf\xb0\xc6\xa9\x0c\xe1\x31\xd0\xb0\xed\x0d\x1d\x2b\x22\x7a\xa1\x78\x8a\x1a\xa4\x28\x03\x8d\xb5\xbf\xa8\xc3\xf7\xbb\x28\xa9\x75\x69\xb5\x22\x46\xb9\x4b\xf1\x93\xc0\xdb\xc5\x5e\x47\x24\x4f\xe4\x28\xc3\x1a\xeb\xf4\xb0\x21\x65\xd7\x7c\xab\x22\x8d\xbd\xb0\x7a\x85\x96\x20\x22\xcb\x7d\x90\xe6\x5b\x0f\x9b\x02\xfd\xbd\x12\x92\x54\x70\x8c\xbd\x98\xfc\xbc\xcc\x5c\x87\xd6\x1f\x3e\xb6\x1e\x36\xf5\x55\xbf\x01\x4f\x19\xda\xc1\x51\x4a\xe5\xda\xf6\xdb\x69\x48\x69\x81\xf5\x22\xcb\x79\x4c\xb8\x5d\xd0\xbe\xca\x70\x45\xf3\xd3\x34\xdd\x62\x87\x37\x27\xbd\xcd\xfa\x49\x5a\x69\xbc\xed\xc8\x9d\x5d\x31\x25\x0d\xb5\xb0\x23\x5c\xd8\xd5\xa9\x58\x0e\xad\xbc\x6e\x78\x55\x25\x3b\x44\x87\x8c\x7f\x9a\xf1\x0e\x1f\x22\x6d\x45\x9d\x12\xf6\x5a\x33\x11\xc8\x9c\x4f\x79\xc6\x07\xe4\xd3\x34\xb4\xd6\x1f\x84\x7d\x2b\xe5\x0d\x1d\xcf\x7d\x84\x5d\xde\x46\x99\x64\x40\xef\x1e\xc9\x00\xdb\x9c\x93\xf5\xc2\x8c\x6f\x82\xd2\x69\xee\xc5\xc4\x1f\x35\x4c\xf4\x11\x8a\x82\x06\xc6\xc6\xf6\x5c\x21\xa6\x48\xff\xdc\x71\x43\xd9\x83\x4f\x50\xab\x4b\x64\x9b\x30\xa2\x0d\x3e\x58\xee\xa7\x64\x65\xb1\xe0\x0b\xde\xf5\x42\x6f\x62\x24\x6a\x94\x40\xf4\x6e\x7b\xe2\xf3\xf8\x9c\xf6\x4e\x6b\x13\x35\x35\x7a\x07\xae\xf7\x5b\x99\x3b\x17\x0c\x2d\x1d\x9a\xcb\xd5\x3a\x52\xe5\xd0\x37\x33\xc3\x46\x87\xe9\xdb\x19\xb5\x77\x88\x39\xc6\xec\x36\x12\x71\x65\xf9\x4c\x61\x3d\xb1\x0b\xd2\x06\x63\x82\xda\x9c\x6c\x76\x21\xd1\xee\x7a\x95\x06\x29\x06\x4c\x65\x5f\x8e\xf1\xdd\x8a\xaa\x25\xa8\xfb\x25\xb6\x1d\x1a\x4f\x26\xb5\x27\x71\x6b\x42\x56\x8d\xa0\xb1\x17\x20\xa7\xd5\x9c\xbe\xe5\xac\x05\x4a\x75\x39\xf9\x50\xe6\x64\x3b\x0c\x10\x9f\x86\x38\x8f\xbe\x1c\x20\x44\x04\x16\x12\x73\x4b\x35\xa2\x86\xbe\xd8\xb7\x7b\x3e\x34\xc6\xa7\xde\x50\x2c\xc4\x1e\xf1\xb0\x1c\x57\x03\x33\xd2\x45\x73\x19\xb6\xb4\x24\xed\xe3\x3a\x57\x65\xeb\xc8\xf9\x18\x3d\x33\x2b\x2b\x63\x45\x0e\x76\x66\x96\x8f\xd7\xd8\x62\xb0\x44\xe9\x8b\x9d\xda\x1f\x83\x34\xba\x3e\xe2\x6f\x60\xdb\x19\x11\xf6\x05\xa8\xb1\xea\x95\xa8\x8a\x4f\x90\x82\xab\x71\x49\xbd\x90\x20\x3b\xb5\xb6\xb1\x91\xd4\xd8\x52\xe1\x2e\x8c\x9c\x76\x4c\xa7\xa4\xc1\xf8\x5a\xce\x10\x33\xe9\xf3\x11\xef\xcb\x98\xef\xa1\x24\xd0\x86\x91\xec\x93\xd6\x32\xb0\x56\x59\xd2\x52\xe9\x4c\x46\x5e\xab\x66\x75\x39\xe4\xc6\x56\x58\x39\x98\x92\x37\x68\x46\x64\x69\x50\xcd\xa7\xb5\x14\xab\xe8\x7f\x8c\x30\x15\xdb\xf9\xd1\x3b\x59\xc6\x34\xdf\x7d\xb2\x4f\x76\x9d\x7a\x0b\xba\x12\x58\x9b\x65\x80\x7e\xac\xa8\xd1\xc0\x88\xf8\x59\x9b\x68\x82\x5d\xc5\x6d\x6d\x12\xf5\x49\x65\x02\x85\x95\x35\x6b\xb8\xd2\xb2\x7a\x9f\x9e\x09\xd0\x22\xa4\xad\x04\x9a\xd6\x75\xf0\xee\x04\xcf\x9a\xf9\x6d\x23\xa6\xe7\x84\x3d\x43\xb4\xdf\x74\x68\x34\x22\x07\xd6\x42\x99\xc3\x50\xb5\x0d\x66\x8e\xe7\xf0\xc0\x91\xbe\x13\xbb\x5f\x81\xf8\x9f\xc3\x61\x23\x1a\xfd\x10\x39\x69\x85\x3d\xcf\x2c\x25\xd6\xf2\xaa\xde\x2d\x92\x43\x2a\x47\xda\xa7\xd5\x29\x6d\xfb\x9e\xbe\xec\xf0\x7a\x25\xd1\xd8\x19\x42\x92\xed\x88\xc6\xf0\x0e\x0f\xac\x87\xad\xc2\x66\xc2\x21\x48\x3d\x85\x61\xa9\x98\x93\x56\xe0\xe3\xf3\xcc\x6a\xb2\x19\x61\xd4\x88\x7c\xae\x47\x72\xe4\x2d\x65\x05\xbe\x50\x73\x8d\x3e\xd3\x1e\x23\x9e\x1d\xc8\x40\x24\x30\x27\x5b\x6f\x60\xe1\x20\x82\x3d\xb4\xac\xe2\xfc\xf0\xd0\xce\xb7\xbe\xcf\xe8\xb5\x19\x14\xe8\x1d\x4b\xf6\x4e\x5c\x61\xe8\x80\xb6\xd7\x68\xeb\xf6\x90\x66\x3e\xb0\x96\xd6\xc8\xa1\xe6\x19\xf9\x56\x75\xc5\x1e\x71\x81\x4c\xe6\xc2\xb7\x23\x83\x78\x84\xeb\x1c\x1d\x31\x80\x08\x96\x72\x62\xe8\x0d\x24\xa2\xad\x29\x30\xcc\x05\xca\x5c\x22\x24\xf9\x20\x44\x2f\x99\x81\x68\x3b\x36\xc7\x21\x49\x0e\x23\x2b\x33\xa6\x48\xb7\x6b\xde\x6d\xac\x3c\x03\x2b\xbf\xa4\xd4\x8a\xd0\xc9\xd8\x92\xcb\x02\xc6\x02\x23\x05\xf3\x5d\x3e\x76\xc6\x5c\xeb\x10\x31\x3d\x51\xc9\x02\xf6\x84\x6f\xeb\x2f\x44\x02\x6a\x0e\x0a\xb4\xc6\x18\xff\x61\xf2\xf6\xa6\x15\xf5\x8a\xe4\x1a\x82\x0a\x11\xa2\xad\x37\x16\x01\xd9\xa0\x0a\x4b\x8f\xb1\x4e\xd8\x45\xde\x34\x17\x73\x11\x8a\x1c\xa6\x82\x6c\x8a\x62\xe8\x58\xa2\x5c\x7b\x61\x0d\x71\x36\x07\x0d\xdf\xa4\x91\x89\xf1\xd3\x9c\xcf\xad\x9d\x22\x97\x7d\xd8\xe2\x05\x79\x54\x18\x6c\x52\x3c\xd4\xee\xba\x83\x29\xcc\x1b\xb6\x0b\x23\x2d\x55\x22\x21\x0d\x61\x64\xec\x36\x22\x36\xd4\x11\x36\x65\x0c\x63\xbb\x8b\x43\x61\x59\x20\xda\x04\x27\xa1\x0c\x3c\xa5\x6f\x55\x08\xa5\x8a\x97\x2b\x9d\x57\x3d\xdf\xc1\xcf\x3e\x18\xbb\x7e\x2e\x5c\xa9\xbe\xa2\xfd\x80\x39\xcd\xc5\x10\x66\x7c\x8e\xad\xa6\x39\x24\xeb\x31\xf6\x0c\xf6\x08\x5e\xb0\xc0\x04\x25\x64\x5d\xfa\x64\xa7\x33\xbd\x41\x28\x93\x85\x68\x83\xb3\xfe\x00\x29\x7a\xea\xe4\x1c\x7d\x10\xd0\x93\xa7\x29\x91\xe6\xa2\x03\x43\x7c\xa3\x5e\x5b\xd0\x14\x32\x25\xee\x93\xc3\xae\x92\xaa\x8c\xf5\x0b\xe6\x96\xe3\xe3\x58\x58\x29\xab\x42\xed\x74\x88\x34\x51\xeb\x19\x4c\x46\xbc\x4b\x74\xb1\x2f\x87\x1e\xc2\x81\x37\xb7\xd4\x29\x47\x0d\xc1\xcc\x42\xc1\x03\x1e\xc8\x11\x0f\xb0\xbf\xb4\x02\x08\x73\x67\xae\x8d\xf5\x90\x7a\x0f\x33\xec\x7b\xe5\x68\xd0\x85\xe5\xaa\x19\x52\xd9\x00\xa6\x78\x6f\x04\xdb\xb0\x30\xfd\x69\xca\x33\xbc\x2b\x3a\x64\xc3\xd2\x78\x56\x38\x12\x0c\xed\xe2\x41\x7b\x2b\xb5\x12\x68\x1e\xd1\x3b\xc1\x40\xea\x00\x66\x56\xce\x31\x96\x6a\x5f\xfa\x90\x2a\x79\xc6\x63\xe4\x27\x94\xc8\xbc\x35\x15\x11\xee\x4b\xa9\xec\xaa\x5a\x2c\x43\xd8\x43\x1c\x89\x64\x4e\x1e\x2b\xb9\x18\x12\xce\x67\xc2\x87\x29\xbd\x79\x8f\x66\xcb\x5d\x0f\x2b\x14\xa4\x89\x3e\xbd\x53\xc7\x49\xe9\xe2\x7f\x6c\x9b\x08\xeb\x7e\xa2\x75\xd5\xc8\x12\x6a\x64\x0a\xe1\xeb\x51\x21\xcb\x7e\xc5\x3b\xb8\xee\xac\xd7\x02\x03\x99\x0a\xc6\xb7\xb4\x7f\xa5\x5e\x6f\xc1\x5e\xe6\xe8\xfb\x17\x0a\x86\xb0\xea\xcb\x7a\x9d\xc5\xc5\x63\xad\x3d\x64\xb2\x68\xed\xa9\x3e\xd4\xab\x65\xde\xd2\x53\xd4\xd1\x58\x46\x35\x6c\x18\x2b\x54\xdf\x5d\x6f\x84\x25\x1f\xd3\xaf\x09\x1f\x20\x37\x8b\x8d\x1d\x00\x3a\xe8\x3d\xe8\x83\x5e\x9d\xf1\x79\x4a\x77\xc6\x30\x13\x1d\xa8\x64\x0c\x0b\xb2\x2f\x99\x78\x30\x11\x7a\x8f\x29\x8e\x3a\xc0\xbd\xac\x31\xec\xe2\x5b\xa6\x32\x14\xc8\xa3\x45\x47\xf7\xcf\xec\x62\xc1\x32\xb4\xbc\xb3\x58\xd1\x7d\xac\xf6\xc8\x87\xce\xb9\x8c\x6c\x04\x05\xc1\xc2\x88\xa7\xc4\xdd\x8d\x34\x95\x21\x5d\x18\xa1\x57\xc5\xc8\xb1\x13\xeb\xd9\x0c\x65\x8e\x36\x23\xa4\xa4\xb8\x52\x8d\x10\xeb\xc5\x24\x63\x68\x0d\x48\xcf\x6e\x82\x2b\x80\x15\xec\x19\xc8\x70\x76\x54\xeb\x55\xcd\x01\xc1\xbc\xde\xbf\x5b\x88\xd0\x4a\x43\x7d\xa4\x1e\x9a\x3e\xb4\x65\xae\x38\xb5\xd1\x0a\x51\x1b\x6b\x93\xc6\x9f\x91\xfd\x38\x13\x7d\x3b\x83\x0b\xda\x3f\x58\xe1\x6a\x89\x63\x33\xe3\x0b\x92\xa3\x02\xeb\x3f\x44\x3a\x11\x7a\xf3\x27\x7a\xc7\x23\x5a\x43\x53\xbb\xba\x17\x92\xf4\x1d\xa3\xb6\x84\x10\x25\x96\x32\xf2\x52\x8f\xc9\x02\x96\x54\x4b\x60\x57\x41\xbb\x60\x2d\x5b\xbc\x8b\xba\x43\xa1\xb0\x47\xa4\x24\xf5\x06\x24\x8f\x86\x35\x35\x25\xfa\xa0\x7d\x4d\xe7\x72\x88\x1e\x54\x5d\xd9\x87\x21\xee\xe8\xec\x8a\x36\x9f\xca\x2e\xa0\xf4\xcf\x13\xbb\x6f\x11\x29\x02\x9f\xc0\xa8\x35\xad\x71\xce\x53\xba\x7f\xce\x77\x51\x53\xa9\x68\x25\x60\xa8\xf1\x05\xe7\xb9\x8b\xde\xc4\xbb\x30\x07\xe3\xb3\x59\xc0\x2e\xfa\x69\xcc\x60\xe1\x6a\xcb\x16\x66\x12\x35\x17\xe8\x3d\x3d\x85\x3d\xa6\xa4\xeb\x90\x8f\x14\x24\xc3\x14\x2a\x98\xd4\x51\x8f\x78\x17\x25\xdc\x4c\xfa\xb0\x09\x53\xd4\xe3\x7d\x4b\x21\x07\x32\xe2\x63\x6f\xc9\x8d\x2e\xa9\xe0\x3b\xe6\x73\x84\xf4\x6d\xaa\x21\x20\xab\x83\xc5\xd0\x5a\x37\x34\xfc\xc6\xb6\x1a\x31\xdd\x8b\x61\xcb\xdb\x50\x63\xcc\x13\xbe\x01\xbe\xb7\x55\xdb\xc2\xa9\x6f\x33\xe3\x25\xa0\xa4\x2f\xd8\x76\x38\xb8\x6e\x97\x6b\x35\x2e\x70\x67\x90\xa6\x62\x7d\x33\xc6\x58\x43\xe5\x14\xd5\x0a\xf3\x9e\x02\x26\xce\x1c\x66\x96\x67\x1a\xbe\x98\xf3\x90\x87\x7c\x84\x5e\x86\xdb\x7c\x21\xb3\xd6\xd2\x1b\x0b\xa6\xa8\x27\xee\xd1\x4c\x95\xc6\xac\x66\x51\xdb\xf9\xbd\x82\x8f\x39\x7a\x49\xf2\x0d\x2f\x74\x2c\xcd\xb9\x40\x98\x85\x29\xc2\xb9\x96\x6e\x14\x5d\xc5\x16\x71\x0d\x11\x11\xa4\xd4\x5a\x53\x34\xa5\xec\xf3\x5c\xc6\x5c\xcd\xca\x1e\x1f\xcb\x2e\xec\xe1\x3e\xec\x6d\x40\xa8\x03\x63\x69\xad\xf0\xc9\x11\x69\x68\xbe\x0c\x44\x85\x56\x4e\xa5\x83\xb8\x9c\x0b\x57\x06\xd0\x13\x18\xa9\x75\x0b\x47\x04\x57\x80\xb5\x1d\x1e\x77\x1c\x38\xbc\x87\x46\x52\xf8\x90\x89\x00\x76\x61\x21\x7c\xd2\xea\x0a\xe2\x65\x51\x23\xf2\x80\x2b\x65\x15\x42\x73\xa6\x4a\x56\x60\x77\xdf\xa1\x45\x32\x14\x0c\x36\x51\x0f\x09\xa0\xd6\xb1\x95\xae\x1c\x7a\x7a\xdf\xf3\x44\x4b\x97\x76\xa7\xae\xc6\x96\x19\x28\x0a\x55\x58\x28\x22\xfb\x11\xd7\x3a\x79\xc8\x73\x3e\xe4\x09\x7a\x2c\x1a\xd9\x32\x87\x19\xf2\xba\x2e\x8d\x4e\xed\x6d\x52\xd1\x8a\xf7\x50\x1d\xb0\x54\x92\x0b\x6c\xc2\x16\x52\x9d\x18\xa9\xf8\x00\x2d\x05\x21\x6c\x42\x42\x33\xb1\xcb\xf7\x6a\x7b\xad\x08\x1c\xbe\xae\x0b\x23\x3b\x96\x7a\x4b\x9f\x17\xb8\x3f\x61\x44\xf3\x98\x93\x94\xc3\x74\xff\x20\x83\x46\x64\x05\xb4\x14\x1b\xfb\xb3\x82\x50\xc5\x77\x86\xb8\xa6\xdb\x47\x58\xd0\xd1\x10\x22\xb4\x95\x85\x7c\x48\x36\x26\xc3\xe9\x42\xab\xd1\xea\x75\x8d\x6d\xbe\x2d\x42\x94\x48\xbb\x68\xdd\xeb\x6a\x49\x59\xb4\x95\x34\x45\xf6\xcb\xa1\xe8\xc3\xc2\xae\x9b\x68\x6e\xeb\xee\x3d\x1d\x91\xc4\x92\x93\x9d\x7b\x80\x2b\x89\x09\xd2\xd6\x04\xf6\x90\x0e\x8e\x65\x5f\xec\xc9\xca\x5b\xca\x51\x2b\x46\x5e\x6f\xd6\x45\x12\x99\x40\x6d\xe5\x37\x5e\x3d\x0a\x5a\x26\xa0\xe9\x04\xb6\x19\xb6\x0c\x64\xe8\x1d\x31\x38\x57\x1a\xc6\x54\xdf\xbb\x8e\x5c\x16\x59\x4f\x68\x1f\x7b\x15\x5a\x29\xb2\x40\x7e\xa3\x9e\x69\x43\x45\x76\x25\x43\x8b\x32\xb4\x5f\xb5\x65\x1f\x32\xd8\xb4\x34\x5c\xf7\x32\x20\x6b\xb0\x92\x89\x77\x79\xe5\x64\xa5\x2c\x70\x06\x72\x9e\x7b\xb9\x37\xc0\x96\x68\x8a\xaf\x66\xc0\x87\xb1\x92\x01\x64\x0c\x23\x85\x69\xad\x00\xe1\x44\xfb\xff\x9a\xf5\x32\xbd\x4b\xb4\x6b\xf3\xa9\x18\xc9\xa8\x80\x4e\xad\x4b\x2b\x9c\x25\xed\xcd\x7a\x3b\xf0\x14\xf1\xb6\xeb\x50\x35\x25\x1b\x6d\x90\x4f\x4a\x2a\x53\xed\x75\x26\xda\xb2\x5e\x25\xc5\xbd\xea\xa0\xc6\x8d\x56\x84\x40\x49\xe2\xb9\xd7\x6f\x6d\xc1\x14\x26\x76\x45\xa5\x70\x31\xdb\x8e\x76\x1b\x16\x30\x82\x2d\x84\x47\xf4\xfc\xe6\x99\x1c\xf2\x11\x69\xad\x7d\x99\x7b\x1b\x28\x75\x47\xdc\x68\x22\x01\xfa\x9f\xb5\x65\x20\x96\x5a\xe3\xa6\xd6\xc4\xb4\x97\x58\x71\x93\xd0\xae\x63\x1b\xff\x06\x6d\x51\xaa\x60\x82\xeb\x43\xa8\x1d\x72\xec\x29\x6f\x93\xc5\x45\x4b\x09\xfd\x06\x2d\xc1\xc8\x0a\x50\x6b\x65\x11\xad\x98\x66\x8a\xc3\x70\xb2\x77\xa3\x85\x52\xcb\xa5\x89\x2c\x60\x83\x6c\x66\xda\xb3\xcf\xfa\xcf\x40\x5e\x53\x58\xb4\x56\xe6\xce\x2a\x16\xca\xfa\xa2\xeb\xc8\x98\xbe\x37\x40\xef\x19\x25\xc7\x4d\x74\x7d\xa0\x74\x54\xd5\x87\x19\xfa\x2c\x69\xbe\x87\xab\x62\xb8\x0b\x25\x97\x21\x67\x9c\x59\xe9\x4d\xb5\x5e\xcd\xde\x18\xb4\xb7\x77\x97\xb8\xce\x82\x27\xc2\xe7\x33\xbb\x1e\x9b\x7b\x29\xef\xf3\xd0\x2b\x64\x2a\x06\xad\x99\xac\xbc\x48\x56\x5e\x80\x16\x8a\xca\xfa\x91\x15\xa2\x2d\x02\x1a\xc5\x7a\x0f\xbd\xee\xd9\x2e\xae\x3b\xe8\xfa\x86\xe8\xaf\x30\xe4\x81\x13\xbd\x86\xe4\x40\xed\xbf\x8c\x5e\x62\xa6\x9f\x11\x5a\x9b\x43\xb2\x88\xf6\xd1\xea\xa1\xe4\x83\x2d\xe4\x49\x19\xae\x1c\xe8\x31\x56\xf8\x8d\xb4\x17\x16\x9a\xef\x80\xf6\x87\xf0\x61\xc4\x97\x7c\xae\xbe\xf1\x6d\x45\xaf\x60\xac\xe5\x67\x45\x41\x11\xd7\x07\xb2\x40\x19\x3b\x82\x55\x6b\x90\x2d\x3c\x44\x5f\xd5\xdc\x9b\x8b\x99\x97\x7b\x15\xc6\x7b\x28\x20\xc3\x1d\x13\x05\xee\x2d\x1a\x42\xdb\x6a\x97\x99\xf6\x87\xb1\x7c\xa5\xb0\x16\xa2\x5c\x74\xd1\x47\x36\x45\x3e\x9b\x5a\xbb\x04\x8e\x21\x64\xb0\xa5\xed\x22\x54\x34\xd5\x2b\x34\x4f\xe6\xb4\x63\x02\x72\xe1\x6b\xb9\x5b\xe8\xab\x8a\x62\xa2\x1d\x13\x71\x64\x80\x6b\x4e\xb1\x1c\x78\x16\x07\x5b\x59\xc3\x2b\xa3\xa9\xb5\x98\x19\x50\xf2\x4b\x45\x56\x7d\x13\x09\x00\x77\xa6\xa3\xb6\xd4\xf5\xe6\xe4\xaf\x16\xea\xd5\x4c\xf4\xf2\x2c\x94\xa4\x87\xdc\x49\xfb\x71\xd4\xfe\x81\x5a\x13\x18\xa2\xac\xa9\xe9\x5f\x5f\x56\x7c\x88\xbe\xec\x4a\x0b\xaa\xf8\x06\x45\xc0\x48\xa4\x96\xae\x03\x5b\xf0\x2c\x28\xe9\x2a\x51\x72\x8c\x37\x47\xdb\x6b\x4e\x34\x0a\x75\x4f\xc0\x3d\xec\x9c\x3c\xe1\xbc\xd4\xc6\xc1\x08\x70\xf7\x4d\xa5\xa4\x1d\x2d\x2f\x41\x21\x43\xe2\x65\xaa\x5d\x23\x58\x68\xbb\x03\x6c\xa1\x6d\x36\x44\xe8\x54\x38\x3c\xc5\x75\xae\x5a\x3e\xc8\x1d\x3f\x04\x3c\x27\x7c\xdc\x13\x38\xa0\x91\x8f\x65\x5b\x66\x5e\x21\x47\x90\xe2\x4c\x05\xb8\xe3\x78\x48\x1c\xc0\xc7\x3e\xfb\x14\x1b\xa1\x0f\x5b\xd2\x48\x01\x1b\xe0\xd3\xfa\xb5\xe2\xd9\x5b\x32\x31\x92\x94\xec\xeb\x7d\x28\x62\x8a\xf4\x1c\x77\xe0\x20\x25\x47\xab\x0f\x58\x3a\xe1\x69\x8d\x35\x82\x21\xc9\x85\x95\xe3\x8f\x89\x56\x3c\x50\xb2\x44\xce\xbb\x38\xd3\x1d\x99\xb7\x42\x39\x44\x0f\x58\xdd\xdf\xae\x6a\x35\xdb\x90\x23\x6d\x1b\xc1\x15\xf5\x01\xee\xc9\x18\xa3\xe7\x4a\x85\x14\x7f\x44\x6b\x23\x3a\x96\x47\xc0\x0d\xb5\xc9\xc9\x53\x02\xa9\x21\xdf\x90\x23\x1c\x79\xf4\x96\x42\xa9\xaf\x52\x70\x2a\xda\xde\xd4\xd2\x7f\x84\xfb\x96\x8f\x67\x47\x5e\x01\x63\x3a\x1b\xc8\x8c\x77\xbd\x8a\x0f\x69\x3d\x05\x57\xda\x3c\x43\x8d\x35\x2c\x86\x76\x95\x26\x40\x8f\xd6\xc0\xfa\xa2\xc5\xae\xdc\x0c\x31\xb4\x61\x08\x0c\x66\xb5\x5d\x82\x8a\x5e\x8b\xce\x01\x57\x3f\x15\xc6\xa0\x26\xb2\x1a\x59\x2c\x21\x4d\x0c\x7d\x8e\xbd\x5d\xbe\xdb\xd8\x6b\xa1\xbe\x4f\x64\xc1\x37\xb4\xd5\x16\x0a\x2b\xad\x67\xb2\x02\xf5\xfe\xdc\x89\xd1\xa5\x7d\x34\x22\xc2\x22\x25\x01\x6a\x6b\x6f\x57\xb6\x51\x1a\xb4\xfc\x8d\xcf\x78\xe5\x8d\xe4\x18\xa1\x2f\x27\x6b\xa3\xf6\x6f\xee\xc8\x2e\xc4\xc0\x50\xe7\xd5\xf1\x8d\x7c\x98\x40\x82\xf4\x60\x48\xf8\xd4\x97\x23\x6f\x2c\x47\x22\x16\x68\xb5\x42\xbf\x7d\xad\x17\xcc\xd0\x17\x6b\x4f\x2c\xb5\xec\x26\x53\xac\x3f\x24\xbf\x5a\xa5\x09\x0c\x44\x47\xe4\x5e\x47\x69\x50\xb8\x5b\xcd\xae\xd1\xe8\x67\xbc\xae\xcc\xd9\x02\x6b\xd3\x3a\xf8\xae\xc1\x20\xda\x67\x65\xf1\x44\xcc\x49\x9a\xee\xc8\x4c\x76\x44\x68\x47\x56\x4b\x24\xb1\xa7\xd7\xe9\x12\x1e\x7b\x7b\x1c\xe3\xd5\xa0\xdf\x7d\x82\x52\xe6\xd0\x50\x28\x3e\xa3\xf7\x87\x42\xaf\x48\xb4\xb1\xcf\x1d\xe9\x4a\xee\xa9\xa7\xf7\x14\xa7\x92\xf1\x31\xe0\xaa\x30\xa7\x3b\xa0\xa3\x70\x93\x4f\x38\x52\x2d\x58\xa2\x16\xdf\x95\x5d\x1e\xa2\x57\x77\x97\xbc\x0f\xbb\xd2\x07\xbd\x26\xdc\x97\x3e\x67\x32\xe1\x5b\x5c\xc9\x26\x23\x19\x88\x1c\xad\x80\x1d\xb2\xe3\x6b\xfb\xf5\xb6\xbb\x72\x09\x43\xec\x63\xea\xc4\x0a\x2b\x10\x83\x1a\x2b\x84\xb2\x10\x4b\x19\x8a\x99\xec\x7a\x4b\xc2\x97\x14\x3d\x70\x0d\x5c\xfb\x16\xa2\x72\x5a\x3d\xc3\x75\x54\xbd\xe3\x02\xaf\x8c\x64\x1f\xda\xe8\x6f\x35\xf6\xa6\xa8\x6f\x57\xb0\x25\xc7\x32\xe3\xfd\xd6\x4c\xb6\x61\x80\x18\x14\xe1\xbe\x8a\x0a\xc7\x0a\xfb\x2c\x3a\x10\x6b\x9d\x53\xf4\xa1\xa6\x64\x83\x7a\x0d\x03\xda\xa8\xbf\x2f\xa1\xa3\x66\x19\x02\x2f\x27\xae\xa2\xc7\xb0\x0d\x53\x0f\xfd\xea\xb9\xd2\xe8\x54\xed\x19\x6f\xc3\x26\x5a\xef\x12\x45\xdf\x61\x62\x76\x52\xb6\xac\x5e\xe4\x2d\xed\xda\x0a\x61\x95\xde\xcb\x04\x05\x68\x49\xa6\x23\x0b\xb3\x82\x0b\x31\x46\xa9\x09\xf8\xd8\x4a\xe1\xb9\x37\x95\x15\x37\x51\x3e\x30\x12\x1c\xf4\x57\x76\xd7\x65\x76\x27\x83\x0f\x15\x0c\x41\xf1\x94\xa1\xd8\xe6\x4b\x50\x45\x69\x2a\x19\xc2\x5f\x2a\x76\xbd\x0d\x19\xf1\x29\xdf\x20\x6f\x60\xc5\x7f\xd5\x67\x88\xe3\xae\xb5\xee\x44\x0e\xa1\x8b\x52\x5a\x57\x32\x5c\x0d\xa9\x30\x9a\x50\x22\x47\x92\xf1\x50\xc6\x3c\x41\x08\x51\xba\x84\xea\x6d\x07\x2d\xcf\x9b\x30\x96\x15\x5f\xa2\xbc\xe6\xf8\x4e\xf0\x00\xeb\x0d\xf8\x12\x39\x97\x79\x6b\x5b\x04\x4a\x62\x10\xa9\xde\x93\x4a\x96\x65\xad\x89\x0d\x60\x20\x87\xde\x9e\xf6\xed\xf5\xb6\xd0\x3a\xbc\xa5\xa5\x6f\xde\x41\x18\xd7\x16\xc2\x8a\xe1\xbe\x53\xae\xe4\xac\xcc\xdb\x90\xb9\xb7\x40\x8b\xb4\xe6\x60\x15\x4f\xb8\xf6\xa2\x8a\x60\x80\x6f\xaf\xd7\x7f\xba\xd2\xac\x1c\x16\xae\xcd\x9f\xf7\xa9\xd5\xa9\x6c\x43\x08\x4a\x73\xef\x38\x3e\x8e\xa9\x37\xc5\xbe\xb5\x75\x74\x15\xd8\x46\xe9\x22\x42\x9b\xe2\x42\x16\x7c\x82\xb8\x13\x0a\x35\x22\x03\xd9\x11\x95\xc8\xe5\x40\x0c\xc5\x50\x76\xa1\x82\x58\x66\xa2\x23\x58\x6b\xdb\x53\x3a\x9c\xa2\x5d\x03\xdc\xb7\xad\x68\x48\xe1\x6d\xf0\x0e\x6f\xa3\x97\x81\x96\x0c\x02\x6f\x2a\x23\xae\x67\x98\xd1\xee\xcf\xcc\xca\x42\x39\x45\xbb\x1a\x5a\x3f\x4c\xdd\x83\x01\xf9\x91\x19\xed\x39\xc1\x35\xd5\x84\x70\x26\x17\x7b\xa4\x3b\x69\x8c\x37\x58\xa6\xe8\x67\x24\x62\x19\x8b\xb8\xd5\x11\x01\x47\xbb\x06\xf6\xdd\x47\xd8\xcd\x79\xc6\x37\x65\xe8\x85\xa8\x9d\xe8\xf1\xeb\xa3\xfd\xd0\x48\x89\x24\x89\x12\x7e\xc7\xe4\x39\x14\xd4\xab\x64\xe4\x0f\x97\x28\xea\x09\x1d\x94\xa6\xdb\x62\x09\x89\x96\xe6\x79\x4e\x91\x1d\xb5\x2d\x13\x47\x5b\xc9\x2f\xb0\x89\x1e\x15\x7d\xaf\xe3\x78\x10\x14\xb4\xf3\x54\xf1\xe0\x0a\x7d\xe0\x7c\xd9\xf7\x4c\x6c\x1f\xe3\xc5\x93\x7b\x23\x6f\x44\x34\x36\xd2\x9a\x02\xef\x93\x1c\x95\x92\x45\x33\x83\xa5\xa2\x4e\xc6\x87\x10\x06\xa8\xef\x2a\x89\x45\xfb\x70\xf6\x35\x2d\x52\xf8\xed\x8d\x14\xfc\xf0\x71\x6b\xbb\x15\xc8\xa2\xa5\xa5\xad\x81\xb7\x4b\xb0\xae\xe0\xbf\x8d\x71\x39\x66\x9e\xa2\x06\x99\xb7\xa4\xd5\x0c\xdd\xea\xd4\x7a\x17\xd6\xeb\x02\x81\xf1\x32\x45\x8b\xd6\x9c\x7c\x36\x28\xfe\x10\x6a\xf8\x6d\x50\xfc\x30\xb5\xd6\x81\x02\xf5\xf3\x89\xec\xf3\x82\x67\xe4\x9b\x99\xc9\x21\x7a\x5c\xe4\x5e\x9f\xb8\x4d\x47\x74\x3d\xbd\x93\x4c\xf1\xdc\x0e\xcd\x75\x21\x59\x2b\x97\x91\xc8\x04\xee\xa3\x17\xb9\x18\x8a\x44\x24\x24\x01\xe0\xd8\x61\x94\x96\x0e\xee\x47\x30\xfb\xfb\xf5\xea\xa1\xaf\xa9\x3e\xd1\xc1\x08\x31\xa9\x83\x12\x47\xdb\xa3\xf6\xa2\x0f\x57\x6e\xb9\x51\x47\x71\x3d\xda\x11\xa6\x67\x75\x17\xf2\xd6\x90\x63\x4f\x44\x17\x23\x7a\x4d\x64\x02\x13\x88\xf9\x14\x94\x84\xa0\xa8\x6e\xca\x37\x24\x13\x4b\x05\x8b\x10\xa1\x1f\x6e\x82\x96\xd4\x1c\x23\xd9\x75\xac\xc6\x93\x58\x29\x3a\x87\xc5\x8a\xdd\x1d\xa1\x11\xda\xd0\x26\xd8\x1b\x3a\x92\x7c\x41\x36\xf8\x94\xfc\x85\x6a\xff\x48\xd4\xec\xbc\xc8\x8b\x5a\x69\x6b\xca\x17\x5c\xdb\xe2\xc6\xe0\x3b\x56\xea\xcc\xee\x82\x6d\xcb\x2e\xdf\xb3\xda\xb7\xc6\x87\xae\xd8\x95\x0c\xb9\x29\xad\x90\xf3\x59\x2b\x91\x23\xb1\x44\x9b\x72\xc0\x3b\xe8\xb9\xd3\x95\x1d\xae\x3d\x90\xfb\xc4\xe1\xb7\x15\x1d\x21\xee\x39\xc6\x38\x0b\xa9\x82\x7a\x1d\xa7\xcc\xeb\x4a\xed\xc9\xd9\x11\x4b\xd0\x3e\x04\xc5\xbe\x78\x9e\x2e\x67\xd5\xfb\x9e\x23\xb2\x37\x55\xb8\x23\x2b\xd2\xad\x11\x0b\xe8\x7a\xaa\xa6\x39\x7a\x15\x90\x5d\x03\x32\x94\x9a\x7d\x98\xc1\x18\x63\x4b\x8c\xf8\x26\xa0\xa6\x28\x53\x18\x61\xfc\x84\x58\x06\x62\x2c\xc6\x22\xc5\xa8\x49\x43\x6f\x8f\x60\x27\x15\x29\x54\x7c\x2e\x14\x5e\xb5\xf9\x52\x0e\x44\x26\x98\x48\x65\x8c\x7e\x46\x03\x67\xff\xc7\x88\x57\xe4\x69\xe5\xcb\xb6\xea\x3f\x2f\x78\xc5\xd1\xda\xef\xe5\xde\x58\xa6\xe8\x77\x19\x10\xfc\x17\xde\x50\x8d\x22\xdf\x46\x89\xaa\xf2\x66\x1a\x4f\xf4\xae\x73\x6f\x2a\x46\x8a\xd7\x7b\x95\x1c\x7a\x13\x1e\xcb\xca\x9b\x58\x18\x0b\x8c\xc7\x91\xd0\xfe\x30\x4a\x03\x89\x5a\xdb\xc8\xab\x2a\xcf\xd8\xed\x0b\x50\xb3\xd8\x41\xfd\xc8\xae\xd3\xd2\x7a\xa9\xd2\x43\xd0\x46\x22\x96\xb4\x9e\xa4\x73\x9e\x68\xa9\xa3\x63\x7b\x94\xc1\x40\x66\x5e\x80\x1c\xa7\xa6\x7d\xb8\x16\xe4\xcd\x38\x4a\x29\x90\x10\x07\x1f\x58\x9c\xd7\x2b\x77\x8e\x4f\x8b\x92\xb3\xc5\x40\x14\x22\x95\x89\xb6\x42\xa2\x14\x5a\xc8\xfe\x8a\xf4\x1d\xa2\xf6\x31\xd0\x36\x42\x6f\x8f\xea\xcd\x14\xfd\x13\x8c\x28\x8c\xae\x53\x69\x7c\x45\xad\x09\xc1\xd8\x78\x66\x8b\xc1\x8a\x1c\x56\xd1\x8e\x96\x58\xe9\xb5\xb0\x25\x07\x50\xc1\x98\x3c\x72\x32\x08\xa9\x56\x33\x06\x7a\xc5\xc4\x87\x21\x4f\xad\x77\x30\x5e\xf1\xea\x88\xbc\xb1\x08\x1a\xd1\x36\x13\x5c\xe1\x55\xba\xbf\xc1\x96\x48\x6e\xc8\x84\x77\xbd\x5d\x39\x12\xcc\x8b\x71\x77\xf5\x00\x57\x07\xa6\x8e\xce\x1d\xca\x14\x62\xe3\xcd\xab\x70\xd1\x5b\xf0\x0e\x79\x95\x14\xe0\x2b\x39\x90\x6b\xfd\x7a\x0f\x63\x5b\x65\x62\x4f\x68\x3a\xda\xc1\xd8\x09\x34\x4f\x6c\x4e\x7c\xaf\xd6\x84\x72\x6b\x6f\x2d\x68\xcd\x36\xb4\x3b\xa0\x8c\xcc\x9a\x21\xa5\x49\xc8\xb3\xb0\xeb\xec\xb4\x2b\x88\x6e\xe4\xe4\x0d\x30\xa2\x55\xf7\x91\x68\x93\x85\xb1\xd0\x36\x65\x91\x51\xbd\xda\xa7\x3f\x40\x8f\x65\xfd\x36\x6d\xab\xa9\x08\x8f\x43\xd8\x24\x3a\x45\x9e\x79\x18\x77\x14\xcf\xc3\x52\x04\x8e\x86\xe5\x1b\xcb\x89\xb6\xaf\x4b\xf3\x19\xd4\xeb\x51\x18\x9f\xa2\x32\xab\xcb\xd6\xc3\xb5\x6a\xd5\x91\xf3\x62\x25\xf5\x7a\x6d\xf2\xe1\xce\x68\x8e\x0b\xbe\xf0\x16\xde\x9c\x47\xbc\xcd\xbb\x5e\xd7\xdb\xa3\x36\x45\x8a\x17\xb7\xe6\x72\xe4\x4d\x6c\x7c\x0b\x94\x41\x31\x2a\x53\x07\x12\xd9\xe6\x5d\x3e\xf0\x16\x32\x86\x8a\x27\x22\x80\x3d\xd1\xe7\x26\xa3\xb7\xf6\xb2\xcb\xb9\x96\x28\x4d\xb4\x0b\x82\x0b\xb3\x07\xa9\xa5\xf7\x05\x46\xb8\xc7\x31\xa7\x15\x33\xed\x33\xae\xa1\x4e\xfb\x22\x76\x49\x76\xd3\x91\x0a\x03\xf2\x4a\xeb\x62\x4f\xf5\x4a\xa1\xb1\xfb\x31\xf2\xe9\x1b\xa1\x65\x3a\xc6\x1d\xd2\xa1\xcc\x54\x2f\xa8\x07\x7d\x5a\x21\x2c\xe4\xc8\x9b\x7a\x53\xf4\xb3\x42\x8b\xad\x37\xb3\x52\x48\x81\x98\x5d\xd9\xf8\xc6\x39\x49\x29\xb9\x89\x56\x07\x0c\x23\x8e\xec\x8a\x29\xea\x9a\x7a\x36\x2a\x0f\x6d\xe1\xd0\x01\xbd\x33\x2a\x90\x23\x31\x57\xb3\x28\xe6\x28\x25\xeb\xf9\x0b\xd1\x4a\x50\xaf\xd1\x54\xb4\xc7\xac\x22\x5f\x3e\x2d\xbf\x24\xd6\x07\x53\x47\x23\x2e\x68\x47\x40\x2e\x23\xbb\x4e\x1f\x10\x87\x1b\xa2\x8e\x99\xcb\x54\xcc\xeb\x59\xe2\xdb\x3c\xb4\xab\x01\x78\x67\xab\x63\xa9\x72\x64\x3d\x56\x8c\xdf\x55\x21\xb5\xbd\xc6\xbc\x3f\x52\x9c\x84\x4f\xbd\x0c\xf9\x49\x80\x3b\xd0\x75\x74\x9f\x21\x71\xc3\xae\xac\xb8\xf6\xa5\xb7\x51\x63\x00\xf7\x89\x91\x47\x56\x45\x96\xd5\xda\x63\xb4\x20\xbf\xd7\x44\xc9\x9e\x48\xcf\x0b\xa8\xbd\xc7\xaa\x7a\x4f\x0d\xed\x35\xcb\x51\xd6\x56\xf0\x14\x62\x2b\x7d\xad\xa5\x8a\x54\x0e\x25\x93\x05\xc6\x89\x8c\x30\xe6\x6c\x60\xc7\x43\xc7\xd3\x8a\xec\xde\x57\x9f\xb8\x74\x4e\x63\xeb\xa3\x14\x1a\x12\x3d\x4f\xac\x4e\x86\x36\x4e\x0f\xb1\x10\xe5\x41\xad\xbb\x54\x64\x03\xee\x52\x14\xf0\xdc\xae\xdc\x6b\x5f\xd0\xb0\x91\xa5\x2f\x93\x41\x0b\x23\x7b\x92\x95\xb7\x69\x43\x1c\x59\x2f\x61\x6d\x93\x8d\x48\xdf\xc9\x50\x2b\x9f\xa0\x0c\x98\x5a\xde\x30\xc0\x75\xfb\xbc\xa6\x58\xe8\x4b\xaa\xe3\x30\x85\x64\xb5\x8e\xa9\xb6\x82\x8f\x48\x33\x4c\x2d\xd4\x64\x38\xd2\x66\xdd\x59\xe9\x97\x45\x6b\x0b\xfb\xd1\xb1\x7c\x2c\x93\x5d\xde\x77\xf6\x5d\x14\x16\x22\x8c\x1f\x12\xd1\x01\xe9\x7b\x0a\x97\x74\xec\x92\x91\xac\x70\x77\x9c\xb1\x40\x77\xe5\x10\xea\x55\xeb\x14\x61\xb7\x2b\x73\x31\xc2\x11\xc2\x3d\x86\x5c\x7b\x4d\x69\x3d\x38\x6c\xac\xf9\xda\x3d\x2b\x64\xc9\x42\x7a\xca\x3b\x14\x0f\x1d\xe5\x17\xae\x23\x42\x55\xad\xb9\x5d\x0d\x30\xed\xea\x20\x45\xae\xb8\xf6\xa1\xd5\xda\xfe\x10\xdf\xea\x23\x15\xef\x38\x92\x91\xd2\xd9\x63\xda\xdb\x5b\xf7\x95\x56\xc7\x60\x97\x6d\x2b\x3c\xe1\x7d\xe9\x43\xa7\x35\xe6\x06\x26\xbb\xf4\xb6\xbe\xac\xc8\xe7\xd5\x78\x33\xf4\xc9\xca\x58\x08\x1f\xe3\x8a\xd1\x4c\x89\xa5\x8c\xa1\x8f\x11\xf1\xfa\xa0\xe8\x6d\xcc\xe7\x9a\xf6\x73\xdf\xee\x2f\x31\xf0\x5a\x43\xa9\x86\xd3\x80\x2b\x2d\x32\x25\x1d\x53\x73\x70\x37\x82\x3b\xee\xbe\xe1\x01\x47\xdb\x06\xd0\x2a\x4c\x6b\x61\x3d\xb1\x75\x9c\xcd\x7a\x7d\x88\x3c\x9d\x78\x1b\x7d\x67\x0a\x4f\xd3\xb1\x7e\x63\xb6\x71\x4d\x87\x47\x5e\x64\x7c\x7a\x29\xf2\x74\x8c\xf1\xad\x53\xcf\x40\x6d\x8a\xf3\x17\xd4\xd6\x76\xf4\x90\x2d\xec\x0e\x97\x7e\x1d\x93\x19\x8c\x9f\x6a\xc8\xd1\xaf\x44\xd0\x2e\x0b\xab\xbb\xe2\x6e\x7b\xbb\x4b\x4c\xfb\xc0\x06\xad\xe6\x0e\xe2\xb6\xf3\xbd\x23\x73\xa6\xb8\x52\xb8\xe2\x91\x90\xf3\xdd\x56\x28\x03\xc8\xad\xc7\x27\xa3\x9d\xf4\x66\x1f\x6d\xa5\xed\x6f\x8a\x32\xa2\x1d\x6e\x24\x0b\x31\x93\x95\xb7\xeb\x6d\x20\x5f\x9e\x29\x79\x53\xdb\x6f\xed\xa8\x19\x5a\x11\x12\xe4\x64\x08\x33\x46\xd2\x8f\xbd\x0a\xa5\x49\x5f\xfa\xb6\x3f\x46\x23\x0f\x49\xc6\x30\xde\xd3\x39\x51\xd4\xdc\xca\x3f\xb9\x8c\xf8\x50\xc6\xde\x9c\xb7\x6b\xfa\x24\x16\x5e\xe1\x6d\xf2\x90\xfb\x76\xdf\x78\xe0\xa5\xad\xb0\x95\xb6\x76\x3d\xdf\x8b\x5a\xcb\xd6\x56\xb3\xdf\x32\x77\xbc\x22\x72\xe2\x17\x4a\xb7\x5a\x20\x2f\x0b\xac\x4c\x6b\xe4\xdb\xdc\xda\xe9\x6a\x19\xd0\xdd\x11\x8c\x67\x3d\x5c\xf5\x35\x11\x13\xd0\xe7\xb0\x72\xf6\x99\xa4\xb4\xd6\x55\x60\xd9\xf2\x76\xb1\xf8\x5e\xe8\xf9\xad\xa5\xc7\x3c\xe6\xf9\xde\xd0\x4b\xbd\xd4\x2b\xbc\x09\x16\x86\x25\xf0\x42\x55\x5a\x9b\xad\x69\x6b\xda\xda\xc4\xb2\xdd\x9a\xab\xe2\x31\x7d\x0d\x9f\x1c\x7a\x39\x3e\x9d\xb6\x16\x58\xb6\xb1\x2c\xe9\x9e\xd4\x8b\xb1\xf4\xbd\x00\x0f\x2c\xad\xed\xd6\x5e\x6b\xaf\xb5\x85\x77\xce\x5b\x4b\xaf\xed\x75\xcd\x35\x6f\x84\x65\xcb\x9b\x62\x3b\x3b\x5e\xdf\xf3\xbd\xb6\xe7\x7b\xbe\xd7\xf7\x62\x7c\xd3\x90\xee\xe9\x78\x9d\xd6\x52\x7d\xe2\xb7\xdd\xd6\x66\x6b\xdc\x1a\xe1\xe7\xa6\x6e\xa7\xbd\xca\x3c\xd6\x5a\x62\x4d\x5d\xcf\x6f\x6d\x39\x65\xb7\xb5\x54\x85\xde\xe0\x53\x6b\x07\x5e\xa6\x0a\xd5\x32\xb7\xbd\x66\x5e\x7f\xa5\x84\x5e\xa2\x4a\x6b\x4e\x7d\x57\x9f\x53\xea\x09\x5d\x53\x1a\xaa\x17\xe9\x1a\x9d\x3a\x71\xb4\xbc\x0e\x5e\x33\xf7\xe8\x36\x44\x34\xf2\xdb\xad\xdd\xd6\xae\xfe\xc4\x3e\x74\xbc\x2e\x5e\x8b\x10\xb6\x54\xab\xcd\x78\xd6\xfd\xd9\x6c\xcd\x6c\xcd\xfa\xea\xd0\xab\xbc\xcc\xab\xa8\xa8\x79\xf5\x6d\x09\xb1\xb7\x29\x5d\x8b\xb1\xb5\xa6\x9d\x7b\x5e\xdb\xeb\xb4\xa6\xad\x59\x6b\xd6\x9a\x7b\x6d\x7c\x6f\x46\x3d\xd2\x77\xe6\xce\x9d\xed\xd6\xb4\xb5\x50\xf7\xd2\xbc\x27\x8d\x3b\x33\x82\x3e\x86\x33\xb5\xd7\x5a\xd0\x58\x86\x34\xa3\xaa\x44\xde\xc0\x1b\x38\x75\x32\xaf\x8d\xfd\x9f\xe2\x3c\x86\x38\x4a\x66\x3c\x87\x5e\x6c\xef\x5c\xe0\xdb\x67\x54\x56\xef\x8c\x9d\x3a\xd5\xd5\x8e\xb9\x13\xdf\x5f\xdf\x39\xf0\x86\xd8\x23\x33\x9b\x73\x84\xa8\x5d\xfd\x0d\x47\xca\xdc\xa9\xb1\x83\x46\x97\xf0\xc2\x94\x79\x63\x5e\x2a\xb7\xb4\x16\x5e\xe0\x29\x39\xdd\xc0\xd9\x00\x8b\xbe\xda\x26\x7c\xd2\x05\xdf\x40\xed\xdc\x6b\xed\x21\xdc\x52\x69\x4d\x5a\x13\x9c\x65\x3d\x32\x71\x2b\x6e\x0d\xf0\x33\x6e\x25\xad\x0d\x2c\xdb\x88\xaf\x53\x6c\xa1\xad\x97\x60\x6e\x46\x90\xdc\xc6\xd2\x78\x1f\xe2\x46\xd7\xeb\xb6\xc6\x8d\xb2\x87\x2d\x60\xfa\x9a\xbd\x53\xb7\x70\x8c\x98\xa6\x3f\x27\xf4\x86\x3d\x7d\xed\xaf\x3a\xdf\x0c\x4f\xb8\xd2\x37\x2b\x3e\xe6\x23\xbe\xcb\x7d\x1e\xa1\x66\x94\xf0\x88\x6f\xf2\x01\xea\x48\x09\x4f\x79\xc4\xa7\x3c\xe0\x91\xb7\xe4\x11\x8f\xf8\x90\xef\x7a\x63\x6f\xcb\xcb\xbd\x99\xba\x9b\xed\xb9\x85\xe7\x3c\xf7\x96\x3c\xe7\x23\x3e\xe2\x4b\xc5\xbd\x71\x45\x5c\x95\x3d\x1e\xf3\x9c\x77\x79\xce\x37\xe8\x57\xc1\x3b\x3c\xe5\xdb\x4a\x67\xf6\x36\xbd\xa5\x37\xf6\x96\x7c\xc8\x03\xbe\xe9\xe5\xde\x2e\x1e\x73\x6f\x97\x07\x7f\xd5\xa3\xf2\x78\x2a\x76\x3c\x37\x69\x3c\x53\x67\x3c\x23\x9e\xf2\xbe\x33\x9e\x29\x8e\xe7\x86\x19\x4f\x67\x2c\x69\x24\xf9\x36\xf4\xa1\xcf\x53\xcc\xbf\x92\x40\x1f\x33\x9d\xec\x41\x08\x3e\x4f\x51\x82\xcb\x30\x66\xeb\x9c\x6f\x43\x80\xf7\xf5\x29\x76\xeb\x36\x6c\x63\x1e\x82\x39\x6f\xf3\x5d\x3e\x83\x2e\x1f\x43\x0a\xb9\x37\xe4\xa1\x97\xb6\xd4\xdb\x46\x98\x33\x26\xe5\x1b\x8f\xf5\x88\x7d\xf3\x14\x3e\x83\x3e\x9f\xf2\x1c\x42\x08\x21\xe3\x4b\xd8\x06\x06\x03\xcc\x02\xa1\xe7\xa2\xab\xf4\x22\xbe\x0b\x11\xdf\xc5\x73\x21\xe4\x7c\x8e\x73\x91\xf3\x25\xe2\xd2\x1e\x9f\xf1\x02\x67\xa2\x42\x9a\xbe\xc7\xfb\xde\x16\x2f\xf8\x63\xde\xb7\xff\x4f\x94\xf4\x71\xfa\x0e\xbd\x83\x5a\x6b\x28\xb1\xcd\x08\x9b\xd8\x7d\xa4\x29\xd9\x3a\x13\xd2\x9f\x8d\xf7\x68\x4a\xde\x9b\x3a\x7a\x92\xf6\x9e\x1b\xd0\x2e\x33\xf2\xa5\x5b\x39\x63\xce\x0e\x31\x6e\x2d\x3e\x25\xf6\xf0\x18\x8a\x05\xed\xe2\xef\xa3\x9f\x96\x7e\xbf\x5b\x8f\xce\x49\x5b\xd7\xa3\xf7\x76\xc7\xb6\x9e\x25\x1e\xb1\x58\x8a\x3d\x8c\x56\x16\xa3\x5d\xa6\x6f\xad\xb4\xfd\xc6\xaf\xd8\xfa\x75\xf7\x1b\x45\x9d\x63\xaa\x60\x1d\x7d\x3a\x62\xb1\x47\xad\x8b\x9d\x91\x49\xf6\x8d\x55\x6c\xb3\xe9\x52\x84\x0e\xaa\x51\xd7\xdc\xd7\x3b\x8e\x69\x0f\x41\xb0\xd2\x06\xb7\x55\x6d\xa7\x9f\x01\x9d\x51\xa5\x4f\xa3\xa5\xda\xb3\x8d\x11\x10\x1e\xba\x87\x6e\xbf\xfa\x2b\xf5\x34\xfb\x15\xa1\x16\x6c\x7a\xe1\x66\x01\xce\x9d\x9d\x20\xa6\x5f\x3e\x59\xc4\xb4\x55\xac\x2d\x96\xe8\xe1\xab\xcf\x6a\x8f\x23\xdf\xac\x31\xd8\x8c\x9d\xbe\x2d\x91\xf4\x9d\x7b\x7c\xb1\x94\x7d\xb1\x40\x08\x98\x8a\x29\xb6\x25\xb2\x59\x3e\x23\xfa\xb5\x7a\x46\xd7\xa3\xa3\x0f\x35\x6b\xce\x64\x97\x20\xc0\xdc\x63\xee\xd7\xd7\xeb\x33\x2b\x67\x4d\x2f\xc4\x1c\x8f\x48\xcc\x69\x8c\x4d\x3d\xaa\x6f\xe6\x89\xd5\x51\x77\xc7\x58\xc1\x8f\x3b\xc2\xf5\x4c\x0d\xec\x8c\x1b\x08\x8e\x1b\x67\x56\x67\xfc\xe0\x5a\x0c\x0c\x36\xdf\x9a\xec\x6b\x4b\x62\xdb\xb2\xc4\xa3\xc6\x8d\x83\xa0\xa6\x6f\x3d\xc3\x9b\x18\xa1\xce\x34\xa1\x66\xf0\x90\xd0\xb7\x7a\xc6\x60\xf0\xc1\xd0\xa7\xeb\xd1\xbb\x93\x52\x07\x87\xda\x84\x5b\x4d\xac\x4a\x1a\x58\xa5\x21\x10\x69\x90\x83\xf3\xc1\xbe\x51\xdd\x8f\xf3\x7a\x45\x2b\xa6\xd6\x1a\xcc\xe8\xc8\x0e\xd5\xc2\x64\x1f\xfd\xdd\x99\xc5\xfa\x01\xf5\x63\x15\xd3\x06\x07\x60\xdb\x60\x1f\x34\x1c\x42\x4d\x44\xc6\x18\x63\xe2\x56\x55\xe4\x53\xc5\xe7\xc4\x5d\xf4\xfd\x5c\xf8\x44\x4b\x7a\xd7\xb7\x9e\x27\x6e\xc5\x73\x77\x8a\x3b\xc5\xef\xe2\x7f\xf5\xfb\x4e\x78\x33\xbc\x19\xee\xe0\x7f\x02\x77\xe0\x99\xdb\xe8\xca\xad\xce\x7f\x53\xee\xb2\x35\xdc\x2a\xb6\x56\xae\xdd\x2a\x76\x4e\xc5\x72\x0d\xae\x91\xe7\xd2\x71\x81\xfa\x2f\xcf\x91\xe7\xc8\x73\xd5\x6f\xb7\x88\x6b\xe1\xaa\xba\xa8\x36\x8a\x5b\xf9\x0f\x32\x06\xd7\x88\x3b\xc5\x1d\xf0\x77\xd5\x19\x79\x81\xb8\x4f\xdc\x29\x3e\xc7\x3f\xc7\x9f\xe5\x5d\x2f\xee\x94\x13\x71\x27\x7c\x42\x7c\x46\x7c\x46\xae\xc1\x55\xf2\x5c\x7e\x0d\x63\xe2\x5f\xa9\xeb\xf8\xf6\xcf\xc0\x35\x47\xae\xc3\x72\xc5\x91\x4b\x8e\x80\x6a\x25\xfd\xbe\xc4\xfc\x17\xb7\x1e\xb9\xa2\xbe\x07\xde\x23\xfe\xa2\xbe\x43\xdc\x2a\x2f\x90\x6b\xaa\x88\x2f\x8b\xfb\xe4\xcd\xaa\x95\xf4\xfb\x3e\xfb\xff\x42\xf1\xe5\xfa\x1e\xf8\x0d\xf8\x65\xe7\x8e\x73\xc5\x7d\x72\x47\x5c\x7b\x24\x12\x5f\x11\xb7\xa9\xb6\xc8\x35\x3c\x5e\x20\xfe\x98\xbe\x9f\x8b\xbd\xa2\x7b\x8e\x3c\x43\xfc\xb1\xb8\xd5\xb9\x4f\x9d\x7b\x81\xf8\x63\x71\xa7\xfa\x7d\xe4\xd7\xd5\xbd\x47\xae\x10\x5f\xb6\x75\xde\x2a\xcf\x39\xf2\x02\x1c\xab\x73\xd4\xfd\x38\xaf\x57\x1d\xb9\xee\xc8\x6f\xe0\xe8\xfd\xb6\xae\x1d\x9f\xc2\xab\xba\x66\x35\x32\x70\x8d\x7d\xa7\x3a\x73\x97\xb9\xe2\xbc\x5b\xfd\xbe\xd3\x3e\x71\xad\x6e\xab\xb8\xd6\x7d\xff\x91\xfb\xe4\xcd\x78\x7d\x4b\xbd\x95\x9e\xbb\xc4\xed\xa1\xbc\x40\xdc\x29\xcf\x85\xff\x81\xc7\x5a\xfb\xba\x36\x73\xeb\x16\xb7\xe2\x48\x5d\x2b\xbe\x22\xfe\x58\xde\xcc\x98\x1a\xc9\x53\xef\xd3\x63\x29\x3f\x22\xd7\x4e\xdd\x20\xd7\xe4\xbf\x12\xb7\xf1\x6b\x28\xbb\xe2\x5d\xea\x50\x67\xf6\x41\xe0\xc1\xbf\x34\xac\xde\x75\xe4\x92\x23\x97\xe8\x59\x51\xf5\x21\x14\x5e\xa5\x21\x11\xae\x11\xbf\xa7\xa0\x4d\x41\x8f\x82\x1f\xb8\x06\xae\x42\x68\xd4\x50\x78\x0d\x7c\x9f\x7c\x2a\x5c\x25\xee\x33\xf3\x2d\x2f\x51\xf7\x13\xdc\x5c\x87\x58\x73\xab\xfa\xae\x0b\xc2\xcd\x4f\x12\xbe\x34\x5a\x81\x67\xdd\xf6\xdd\x79\x20\x2e\xa9\x33\x77\xe1\xec\x5c\x68\x5b\x80\x87\x3c\xcf\x62\x86\xd3\x42\x35\xdb\x2b\x05\xaf\x20\xf4\x9d\xab\xf0\x0e\xae\x91\xe7\x88\xfb\xe4\x39\xfa\x6e\xec\xc1\x79\x70\x95\xb8\x43\xfd\x12\x17\xeb\x39\x50\xf0\x53\x1f\xf2\x5e\xf1\x1a\xa4\x15\x77\xe1\xd8\xbc\xc6\xc0\x87\x7c\x36\xfc\xf3\xf6\x8b\x8e\xb4\x8f\x80\xf8\x15\x7c\xee\xaf\x89\x2d\x71\x9f\xbc\x42\x5e\x01\x57\xc0\x9b\x8e\xa4\xf2\x3c\x0d\x6b\x70\x8d\xfc\xb2\xf8\x3b\x8d\x5a\x1b\x6f\xc1\x7b\x1a\x6f\xc4\x37\x1d\xd0\x92\x03\xef\x53\xc7\xad\x47\x7e\x52\xbd\xed\xb0\x3b\xd5\xd5\x23\x97\x88\xfb\x10\x9a\xd5\x9d\x0a\xba\x2f\x11\xf7\x99\x03\x7b\xa9\x20\xd8\xfc\x76\xae\xdb\xf3\x08\xc9\xfa\x5e\xf3\xbf\xd9\x07\x79\xae\xb8\x13\x7e\xb8\xd1\x6e\xf3\xdd\xfc\x57\x18\xff\xae\x1a\x9b\xb0\x1e\x75\xee\x7e\xf9\x91\x23\x5f\x90\x37\xaa\xa3\x7d\x95\x5c\xb6\xdf\x74\xa4\xa3\xae\xb7\x9f\x26\x77\xf0\x18\x1e\x91\x78\x0e\x31\x9c\xee\xbf\x42\x7c\xf9\xa0\x67\xd4\x35\x85\xfd\xd8\x87\x43\xea\xb5\x07\xd5\xa3\x70\x11\x31\x56\xfd\x3e\xe0\x1a\x51\x82\xab\xcc\x39\x71\x17\x3b\xe4\xcf\xbb\x5e\x95\x53\x77\x2b\xc8\x65\x5f\xd1\x10\xcc\xbe\xa2\x28\x3b\xff\x1f\xec\x6b\xe2\x0e\xf5\x9b\x1b\x5a\xac\x3e\xef\xd0\xe3\x26\x76\x0c\x66\x42\xac\xa8\xb4\xa6\xd5\xfa\x79\xfe\x2c\x39\x81\x73\xe4\xb9\x70\x54\x00\xdc\x01\x77\x88\xdf\x33\xf9\x63\x19\xc3\x7c\xa4\xb7\xaa\x37\x37\xf2\x90\xfe\x1e\xe5\x21\xfd\xbd\xc3\xf3\x90\x2a\x26\xc8\x18\xe3\x8c\xb1\xe7\x32\xc6\x80\xb1\x27\xfc\x20\x6b\xa9\x9a\xce\x7d\x90\x71\xfc\xf6\x5c\xc6\xd9\x5f\xc3\xf3\xf0\x84\x4b\x19\x6b\x7d\xa0\xc5\xd8\x11\xf6\x01\xc6\xd8\x7b\x5b\x37\xb6\x3e\xda\xba\xa5\xb5\xd9\xfa\x7c\x6b\xda\xfa\x62\xeb\x9e\xd6\x97\x5a\xb3\xd6\x1f\xb4\xfe\x63\x6b\xd1\x3a\xe5\x3d\xdd\xbb\xcd\xfb\x9c\x77\xa7\x77\x97\x37\xf5\xfe\xd0\xfb\x53\xde\xe2\x9c\x3f\x81\x3f\x99\x5f\xc8\x3f\xc0\x3f\xc8\x6f\xe1\x9f\xe7\x5f\xe4\x5f\x82\x75\xf1\xb4\x73\xae\x3c\xbf\x75\xfe\x95\xe7\x97\xe7\x7f\xf5\x82\xab\xfd\x23\x7e\xc7\x3f\xdf\xef\xf9\x17\xfb\xcf\xf3\x03\xff\xb8\x7f\x85\xff\xdd\xfe\x8b\xfd\x97\xfa\xef\xf4\x6f\xf4\xdf\xef\x6f\xf8\x9f\x5a\xe3\x6b\x62\xed\x09\x6b\x4f\x59\x7b\xda\xda\xb7\xad\x75\xd7\x9e\xb9\xd6\x5b\x3b\xb6\x76\xc9\xda\xa5\x6b\xc7\xd7\xae\x58\x7b\xdd\xda\x35\x6b\x6f\x5d\xbb\xbe\xc7\x7a\xbc\xf7\x84\xde\x93\x7a\x4f\xee\x3d\xb5\xf7\xad\xbd\xf3\x7a\xcf\xe8\xf9\xbd\x0b\x7b\x47\x7b\xcf\xed\x5d\xda\x7b\x41\xef\x45\xbd\x97\xf5\xe2\xde\xab\x7a\xaf\xe9\xfd\x68\xef\x27\x7a\x6f\xed\x5d\xdb\xbb\xb9\xf7\x0b\xbd\x8f\xf5\x7e\xb1\xf7\xab\xbd\x13\xbd\xcf\x5c\xf8\xc4\x0b\x9f\x7a\xe1\x6f\x5d\xf4\xa9\x8b\xfe\xe4\xe8\x2b\x8f\xbe\xf3\xe8\x47\x8e\xfe\xc2\xd1\x5b\x8e\xfe\xfa\xd1\x7f\x79\xf4\xb7\x8f\xde\x7e\x74\xe7\xe8\xee\xd1\x3b\x8f\x7e\xe1\xe8\x7f\x3a\xfa\xdf\x8e\xc9\x63\x4f\x3e\xf6\xcc\x63\xe7\x1f\x8b\x8e\x7d\xcf\xb1\xb7\x1c\x7b\xdb\xb1\x6b\x8f\x95\x17\x7f\xdb\xc5\xdd\x8b\x2f\x0e\x78\x70\x5e\x70\x41\xf0\xec\xe0\xe7\x83\x7f\x1c\xfc\xef\xe0\xc1\xcb\x9e\x7d\xd9\x87\x2f\x7f\xe6\xe5\xcf\xbe\xfc\xf2\xcb\x5f\x78\xf9\x7b\x2e\xbf\xf1\xf2\x8d\xe3\xfc\xf8\xb7\x1c\x3f\xf7\x78\xf7\xf8\x85\xc7\x2f\x3e\x7e\xc9\xf1\xef\x38\xfe\x5d\xc7\xaf\x3a\x7e\xf5\xf1\x57\x1f\x7f\xc3\xf1\xf7\x1e\x7f\xff\xf1\xdf\x3f\x7e\xf7\xf1\x2f\x1d\x9f\x1d\xff\xc3\xab\xd9\xd5\x9f\xfa\xf8\xef\xfd\xfb\x4f\x7e\xed\x79\x7f\x0e\x0f\x5e\xf6\xe0\x4b\x1f\x7c\xcd\x83\x6f\x78\xf0\xcd\x0f\xbe\xf5\xc1\x53\xa7\xae\x39\xf5\xf1\x53\xff\xe9\xd4\xff\x39\x75\x0a\x41\xce\x67\x93\xd6\x47\x5b\x93\xd6\x6f\x1d\x30\x17\x5f\xf3\xba\xde\x6d\xde\x67\xbd\x3b\x70\x2e\x66\xde\x9f\x72\x66\xe7\xe2\xfd\xfc\x83\xfc\xc3\xfc\x93\xfc\x0b\xfc\x4b\xc0\xa0\x3a\xe7\xca\xf3\xd9\xf9\x2f\x3e\xbf\x38\x7f\x72\xc1\xd5\x3e\xf3\x9f\xe0\x3f\xcd\xf7\xfd\xa3\xfe\x73\xfc\xc0\xbf\xdc\xbf\xc2\x7f\xa1\x9d\x8b\x9f\xf3\x27\xfe\x3f\xdb\x37\x17\x6b\xce\x5c\xbc\x76\xed\x87\xd6\x92\xb5\x6c\x6d\xd4\xf3\x7a\xa2\xf7\xc4\xde\x93\x7b\x4f\xa1\xb9\x78\x16\xce\xc5\xc5\xbd\x4b\x7b\xcf\xef\x7d\xb7\x9d\x8b\xa4\xf7\xe3\xbd\xb7\xf4\xde\xde\xbb\xa9\x31\x17\x6d\x9c\x8b\xe4\xa2\xe9\x51\x76\x74\x70\xf4\xe7\x8e\x7e\xf4\xe8\xe4\xe8\x27\x8f\xfe\x8b\xa3\xb7\x1e\xbd\xed\xe8\xf6\xd1\xcf\x1e\xfd\xfd\xa3\x9f\x3f\xfa\xc0\xd1\xff\x76\x4c\x1c\x3b\xc7\xce\xc5\xeb\x8e\xfd\xd4\xb1\x6b\x8f\x15\x17\x3f\x0d\xe7\x82\x05\x22\x78\x56\xb0\x16\xbc\x24\xf8\xc5\xe0\x96\xe0\xcf\x2f\x13\x97\x5d\x76\x39\xbb\xdc\xbf\xfc\xb2\xcb\x5f\x78\x79\x72\xf9\x8d\x97\x7f\xd2\xce\x45\xef\xf8\x31\x9a\x8b\x57\xd0\x5c\xbc\xe7\x78\x71\xbc\x3a\x7e\xd7\xf1\x7b\x8f\xcf\x8e\xff\x07\x35\x17\xdf\xc7\x7e\x83\x7d\x95\xfd\x79\xeb\xc1\xe0\xc1\xe3\x0f\xbe\xe2\xc1\xd7\x3d\xf8\x03\x0f\xa6\x0f\x9e\x3a\xd5\x3a\xf5\xa3\xa7\xe6\xa7\xfe\xe2\xd4\x29\xd6\xba\xfd\xbe\xdb\xb7\x6e\xff\xb5\xdb\x7f\xf1\xf6\x0f\x9e\xba\xfe\x54\x7e\xea\xdd\xa7\x7e\xe6\xd4\xbb\x4e\xbd\xf3\xd4\x75\xa7\xde\x71\xfb\xd5\xb7\xbf\xf4\xf6\xe7\xde\xf6\x81\xdb\x7e\x8e\xb1\x07\xff\xde\x83\x1f\xb9\xed\x1d\xb7\xfd\xc8\x6d\xaf\xbe\x6d\x70\xdb\x2b\x6f\x7b\xf9\x6d\xc7\x3f\x7d\xf7\xa7\xbf\xf8\xe9\x2f\x7c\x7a\xfa\xe9\xcf\x7f\xfa\xce\x4f\x7f\xe2\xd3\xb7\xfc\xcf\x0f\x7e\xe2\x53\x9f\xb8\xfe\x13\x2f\xfc\xc4\x05\xb7\xfc\xdb\x5b\x9e\xa1\xa6\xf8\x96\xa7\x30\xf6\xe5\xe7\xdc\x22\x6e\x81\x2f\x1f\x63\xec\xcb\xbd\xc9\x9f\x3d\xf0\x95\xc9\xed\x0f\x7c\x59\x5d\x7b\xe0\xfa\xc9\x8b\x1e\x78\xd7\x03\x6f\x9f\x04\x93\x4b\x1f\x78\xcb\x03\x3f\xc1\xd8\xc4\x7f\xe0\x87\x27\x4f\x7f\xe0\xf5\x0f\x7c\xff\x03\xe1\xc7\xff\xeb\x03\x97\x3d\xf0\xbc\x07\xce\xc3\x3b\xcf\xfd\xf8\x95\x1f\x7f\xf1\x03\x4f\x7e\xe0\x9c\x8f\xbf\x80\xb1\x07\xda\x0f\x1c\x61\xec\x01\xf1\x00\xbb\xff\x2f\xee\xff\x5f\x1f\x7f\xd2\xfd\x8b\xfb\xff\x8b\xba\xeb\xfe\x3f\xb8\x7f\x76\xff\x67\xef\xff\x9d\xfb\xb7\xee\xff\xed\xfb\x7f\xe3\xfe\xbf\x7f\xff\x87\xef\x7f\xd5\xfd\x2f\x9f\xff\xfa\xc9\xaf\x9d\x9c\x9f\xfc\xfd\x93\x9f\x3d\xf9\xaf\x4f\x6e\x9d\xfc\xe7\x27\x7f\xf3\xe4\xaf\x9d\xfc\x95\x93\x93\x93\xff\xf8\xe4\x2f\x31\x76\xf2\x63\x27\x6f\x3e\x79\xe3\xc9\xb7\x9c\xfc\xb1\x93\x6f\x38\xf9\xfa\x93\x57\x9c\x7c\xfe\xc9\x0b\x4f\xf6\x4e\xae\x9d\x7c\xca\x1f\xbd\xff\x8f\xde\xf7\x47\xef\xba\xf7\x1f\xdd\xfb\xcb\xf7\x7e\xec\xde\x7f\x70\xef\x8d\xf7\xbe\xe7\xde\xeb\xef\x7d\xd7\xbd\xd7\xde\x9b\xde\xf3\x67\xf7\xfc\xcf\x7b\xfe\xeb\x3d\xff\xf9\x9e\x9d\x7b\x7e\xf7\x9e\x7f\x78\xcf\x4b\xee\x09\xef\xb9\xfc\x9e\x6f\xbf\xe7\xd8\x3d\x17\xdd\xb3\x76\xcf\x79\xf7\x3c\xed\x1e\x79\x0f\xdc\xd3\xba\xfb\x2f\xee\xbe\xef\xee\xd9\xdd\xf7\xde\x7d\xf7\xdd\x5f\xbc\xfb\x0b\x77\xff\xbb\x7f\xfd\x9b\xbf\xf3\xd5\xdf\xf9\xad\xdf\xbc\x8e\xb1\xcf\x0e\xab\x6f\xa9\x9e\x54\xb5\xab\x23\x95\xac\xc4\xbf\xb9\xe6\xe6\x9f\xbe\xf9\xda\x9b\xbf\x7d\xe7\x4d\x9a\x86\x3d\xfc\x5f\xeb\xc7\x1f\xd9\x7d\xce\x13\x61\xeb\xe5\x8c\xb5\x7e\xd0\xfe\x7e\xbd\x73\xed\x35\xad\x37\xed\xbb\xff\xcd\x07\xd6\xf2\x3a\xf7\x39\xf5\xa4\x3e\xbb\x72\xd7\x40\x9f\xff\x3a\x5b\x78\xec\xeb\x7f\xe6\x2f\xfd\x77\xeb\xe1\x97\x4e\xbc\xa2\xf5\xc3\xad\x1f\xd9\xb9\x70\xe7\xa2\x9d\xa3\xfc\x45\xfc\xc5\xfc\x4a\x1e\xf1\x97\xec\x1c\xdb\xb9\x78\xa7\xcf\x5f\xb6\xf3\xec\x9d\xe7\xec\x5c\xb2\xf3\xdc\x9d\xe7\xed\x5c\xba\xf3\xed\x3b\x01\x7f\xf5\xce\xf3\xf9\x6b\x77\xc2\x9d\x17\xf2\x6b\x76\xbe\x93\xa7\xfc\x27\xf9\x5b\x76\x5e\xb4\xf3\x62\xfe\x36\xfe\xf6\x9d\x2b\x79\xb6\x13\xed\xbc\x84\x5f\xc7\xdf\xc9\xdf\xc5\x7f\x86\xbf\x9b\xe7\xfc\x7a\xfe\xb3\xfc\x3d\xfc\xfd\x3b\x2f\xdb\x79\x15\x3c\x1d\x9e\xb1\x73\x35\x3c\x13\x9e\x05\xe7\xc3\xc5\x3b\xaf\x81\x67\xc3\x73\xe0\x79\x70\x29\x7c\x3b\x04\x3b\xaf\x85\xcb\x77\xbe\x1f\xae\xdc\x79\xfd\xce\x1b\xe0\x7b\xe0\x6f\xec\x0c\xc5\x8f\x97\xe7\xf9\x9f\x2c\xbb\xe5\xd3\xcb\x67\x94\x7f\xbd\x7c\x66\xf9\xac\xf2\xfc\xf2\x82\xd2\x2f\xd7\xca\x5e\x79\x61\x79\x51\x79\xb4\x3c\x56\x5e\x5c\xf6\xcb\x67\x97\xcf\x29\x2f\x29\x9f\x5b\x3e\xaf\xbc\xb4\xfc\xf6\x32\x28\x2f\x2b\x2f\x2f\x8f\x97\xcf\x2f\xaf\x28\xbf\xa3\x7c\x41\x19\x96\x2f\x2c\xbf\xb3\xfc\xae\xf2\xbb\xcb\x17\x95\x2f\x2e\xaf\x2c\xa3\xf2\x25\xe5\xf7\x94\x7f\xa3\x7c\x69\xf9\xb2\xf2\xe5\xe5\xf7\x96\x71\xf9\x8a\x17\x6e\x96\x57\x95\xaf\x2c\x5f\x55\x5e\x5d\x7e\x5f\xf9\x37\xcb\x41\xf9\xea\xf2\x35\xe5\x6b\xcb\xd7\x95\xdf\x5f\xbe\xbe\x7c\x43\x39\x2c\x7f\xa0\xfc\xc1\xf2\x87\xca\x1f\x2e\x7f\xa4\xbc\xa6\x7c\x63\x99\x94\x3f\x5a\xbe\xa9\xfc\xb1\xf2\xc7\xcb\xbf\x55\xbe\xb9\xfc\x89\x32\x2d\x7f\xb2\x7c\x4b\xf9\xd6\xf2\xa7\xca\xb7\x95\x6f\x2f\xaf\x2d\xb3\xf2\xa7\xcb\x77\x1c\xd9\x2b\xaf\x2b\xdf\x59\xbe\xab\xfc\x99\x27\x7d\xb6\x7c\x77\x99\x97\xd7\x1f\xb9\xad\xfc\xd9\xf2\x3d\xe5\xdf\x2e\x6f\x28\xdf\x5b\xde\x58\x16\xe5\xcf\x95\x37\x95\xef\x2b\xdf\x5f\x96\xe5\x7a\x79\x73\x59\x95\x7f\xa7\xfc\x40\xf9\x77\xcb\x0f\x96\x1f\x2a\x3f\x5c\x7e\xe4\x95\xef\x2d\x47\xdf\xf2\xdf\x9f\xd6\x2b\xff\x5e\xf9\xd1\xf2\xef\x97\x3f\x5f\xfe\x42\xf9\x0f\xca\x8f\x95\xe3\x27\x5d\x55\xfe\x62\xf9\x4b\xe5\x3f\xec\x5e\x58\xfe\x72\xf9\x8f\xca\x7f\x5c\x7e\xbc\x9c\x94\xb7\x94\x9f\x28\x3f\x59\xfe\x4a\xf9\xab\xe5\xaf\x95\xff\xa4\xdc\x28\xff\x69\xf9\xeb\xe5\x3f\x2b\x7f\xa3\xfc\xcd\xf2\x9f\x97\xbf\x55\x6e\x96\xff\xbf\xf2\x5f\x94\xff\xb2\xfc\x57\xe5\xa7\xca\x5b\xcb\xdf\x2e\xb7\xca\xdf\x29\xff\x75\xf9\xe9\xf2\xb6\xf2\xf6\xf2\x77\xcb\x13\xe5\x76\xb9\x53\xfe\x9b\xf2\xf7\xca\xff\x7f\xf9\x99\xf2\xb3\xed\x2b\xca\xcf\x95\xbb\xe5\x1d\xe5\xef\x97\x77\x96\xff\xb6\xbc\xab\xfc\x7c\xf9\xef\xca\x69\xf9\x85\xf2\x8b\xe5\xdd\xe5\x3d\xe5\xbd\xe5\x97\xca\x7f\x5f\xce\xca\xfb\xca\x3f\x28\xff\x43\xf9\x1f\xcb\x3f\x2c\xff\xa8\x3c\x59\xce\xcb\xfb\xcb\x07\xca\x2f\x97\xff\x57\xf9\xc7\xe5\x7f\x2a\xff\x73\xb9\x57\xfe\xc9\xb7\xfc\x6e\xf9\x7f\x97\xff\xa5\xfc\x7f\xca\xff\x5a\x7e\xa5\xfc\x6f\xe5\xa2\xfc\xef\xe5\xff\x28\xff\xb4\xfc\x9f\xe5\xff\x2a\xff\x77\xf9\x67\xe5\xb2\xfc\x6a\xf9\xb5\xf2\xcf\xcb\xbf\x28\xff\x4f\xf9\x60\x79\x6a\x9d\xad\xb7\xd6\xbd\x75\xbe\x0e\xeb\x62\x5d\xae\x1f\x59\x6f\xaf\x3f\x61\xfd\xaf\xad\x3f\x71\xfd\x49\xeb\xdf\xb2\x7e\xce\xfa\x93\xd7\x3b\xeb\x4f\x59\x7f\xea\xfa\xd3\xd6\xcf\x5d\xff\xd6\xf5\x6f\x5b\x3f\x6f\xbd\xbb\xfe\xf4\xf5\x67\xac\xff\xf5\xf5\x67\xae\x3f\x6b\xfd\xfc\xf5\x0b\xd6\xfd\xf5\xb5\xf5\xde\xfa\x85\xeb\x17\xad\x1f\x5d\x3f\xb6\x7e\xf1\x7a\x7f\xfd\xd9\xeb\xcf\x59\xbf\x64\xfd\xb9\xeb\xcf\x5b\xbf\x74\xfd\xdb\xd7\x83\xf5\xcb\xd6\x2f\x5f\x3f\xbe\xfe\xfc\xf5\x2b\xd6\xbf\x63\xfd\x05\xeb\x21\x7b\x92\x82\xfd\x27\xfe\x0a\x21\xc1\x9f\x39\x08\xd1\x42\x7e\xcd\xd8\x7b\x19\xbb\xfd\xab\x8c\xb1\x09\x63\xad\x1b\x19\xfb\xdd\x21\x63\xad\x8f\xea\xe3\x44\xc8\x58\x4b\x9d\xbf\x85\xb1\x13\x2f\x64\xac\xf5\x5b\x8c\xb5\x36\x19\x3b\xf1\x5d\x8c\xb5\x3e\x4f\xc7\xf7\x32\xd6\x9a\xd2\x11\x33\xd6\xfa\x22\x1d\xaf\x60\xac\x75\x0f\x1d\x57\x31\xd6\xfa\x12\x1d\xaf\x64\xac\x35\xa3\xe3\x55\x8c\xb5\xfe\x80\x8e\xab\x19\x6b\xfd\x47\x3a\xbe\x8f\xb1\xd6\x42\x1f\x27\x5e\xc4\x58\xeb\x6b\x8c\xb5\x4e\x31\x76\xe2\xc5\x8c\x79\x5d\xc6\xbc\xa7\x33\x76\xe2\xa5\x8c\x79\xb7\xe9\xe3\xc4\xcb\x19\xf3\x3e\xcb\x98\xf7\x39\xc6\x4e\x7c\x2f\x63\xde\x1d\xfa\x38\xf1\x0a\xc6\xbc\xdf\x67\xcc\xbb\x93\xb1\xd6\x0f\x33\xe6\xdd\xa5\x8f\xd6\x35\x8c\x79\x53\x7d\xb4\xde\xc8\x98\x37\x63\xcc\xfb\x43\xc6\x4e\x5c\xc5\x98\xf7\xa7\xfa\x38\x31\xd0\x02\x29\x6f\x31\x76\xe2\xd5\x8c\x71\xae\x8f\x13\xaf\x65\x8c\x3f\x41\x1f\x27\x5e\xc7\x18\x7f\xb2\x3e\x4e\x7c\x3f\x63\xfc\x42\x7d\x9c\x78\x3d\x63\xfc\xfd\x8c\xf1\x0f\x30\x76\xe2\x0d\x8c\xf1\x0f\xea\xe3\xc4\x35\x8c\xf1\x0f\x33\xc6\xd5\x78\xbe\x91\x31\xfe\x49\xc6\xf8\xe7\x19\x3b\x71\x1d\x63\xfc\x0b\x8c\xf1\x2f\x32\x76\xe2\xe3\x8c\xf1\x2f\xe9\xe3\xc4\x2d\x28\x0c\x33\x58\x67\xec\xc4\x27\x18\x83\x8a\x31\xf1\x34\xc6\xb6\x9f\xcd\xd8\x39\x57\xea\x43\xf5\xed\x7c\xc6\xd8\xf9\x2d\xc6\xb6\x3f\xc5\xd8\xf9\x2f\x66\xec\xfc\x2b\x19\xdb\xfe\x6d\xc6\xce\x2f\x18\x3b\xbf\x64\x6c\xfb\x77\x18\x3b\x7f\xc2\xd8\xf9\x5f\x65\x6c\xfb\x04\x63\x17\x5c\xad\x8f\x9d\xa7\x6b\x10\xf0\x8f\x30\xb6\xf3\x0c\xc6\xfc\x27\x30\xe6\x3f\x91\xb1\x9d\x0b\x19\xf3\x9f\xc4\x98\xdf\x61\x8c\xbf\x88\x31\xff\x69\x8c\xf9\xdf\xca\xd8\xce\x31\xc6\xfc\x6f\xd3\x07\x7f\x19\x63\xfe\x79\x8c\xf9\xe7\x33\xb6\xf3\x6c\xc6\x7c\x9f\x31\xbf\xc7\xd8\xce\x65\x8c\xf9\x47\xf5\xc1\x5f\xcd\x98\x7f\x4c\x1f\x3b\xcf\x67\xcc\xbf\x58\x1f\xfc\xb5\x8c\xf9\xcf\x61\xcc\x7f\x1e\x63\xfc\x75\x8c\xf9\x81\x3e\x76\xae\x60\xcc\xbf\x9c\x31\xff\x38\x63\x3b\xdf\xc1\x98\x7f\x85\x3e\xf8\x0f\x31\xe6\xbf\x90\x31\xff\x3b\x19\xdb\x09\x19\xf3\xbf\x4b\x1f\xfc\x1a\xc6\xfc\xef\xd6\xc7\xce\x77\x32\xe6\xbf\x58\x1f\x3c\x61\xcc\x7f\xa9\x3e\x76\xd4\xbd\xef\xd4\x07\x7f\x13\x63\xfe\x8d\xfa\xd8\x51\xcf\xfd\x1c\x63\xbe\x9a\xa7\x1f\x67\xcc\x9f\x30\xe6\x7f\x82\x31\x9e\x32\xe6\x7f\x92\x31\xff\x57\x18\xdb\x51\x7d\xff\x55\xc6\xfc\x5f\x63\x8c\xbf\x8d\x31\xff\x9f\xe8\x63\xe7\x4a\xc6\xfc\x0d\x7d\xf0\x8c\x31\xff\x9f\x31\xe6\xff\x06\x63\x3b\x11\x63\xfe\x6f\x32\xe6\x7f\x8a\x31\x7e\x1d\x63\x6b\x5c\x1f\xfc\x6f\x33\xb6\x26\xf4\xb1\xf3\x3d\x8c\xad\x3d\x41\x1f\xfc\xbd\x8c\xad\x3d\x45\x1f\xfc\x46\xc6\xd6\x9e\xa6\x8f\x9d\xbf\xc1\xd8\xda\xb7\xe9\x63\xe7\xa5\x8c\xad\x75\xf5\xc1\x6f\x62\x6c\xed\x99\xfa\xe0\xef\x63\x6c\x6d\x4d\x1f\x0a\xd6\xd6\x7a\xfa\xd8\x79\x19\x63\x6b\xc7\xf4\xb1\xf3\x72\xc6\xd6\x2e\xd1\x07\xbf\x99\xb1\xb5\x4b\xf5\xb1\xf3\xbd\x8c\xad\x1d\xd7\x07\xff\x3b\x8c\xad\x5d\xa1\x0f\x05\xaf\x6b\xaf\x65\x6c\x4d\xc1\xf5\xdf\x65\x6c\xed\x87\x18\x5b\xbb\x86\xb1\x9d\x98\xb1\xb5\x84\xb1\xb5\xb7\x32\xc6\xff\x1e\x63\x6b\x19\x63\x6b\xd7\x33\xc6\xff\x11\x63\x6b\x23\xc6\x7a\x0a\x4f\xfe\x09\x63\x3d\x4f\x1f\x3b\xaf\x62\xac\xc7\xf5\x01\x4f\x67\xac\x27\xf4\x01\xcf\x60\xac\x27\xf5\xb1\x73\x35\x63\xbd\x23\x8c\xf5\x9e\xc0\x18\x3c\x93\xb1\xde\x13\x19\xeb\x3d\x89\x31\xb8\x80\xb1\xde\x93\xf5\xb1\xf3\x7d\x8c\xf5\x9e\xc2\x58\xef\xa9\x8c\xed\xfc\x4d\xc6\x7a\xdf\xaa\x0f\xb8\x88\xb1\xde\x79\xfa\x80\xa3\x8c\xf5\x9e\xa1\x8f\x9d\x57\x33\xd6\x7b\x96\x3e\xe0\x62\xc6\x7a\xe7\xeb\x63\xe7\x35\x8c\xf5\x54\xbd\x3e\x63\xf0\x6c\xc6\x7a\x17\xea\x03\x2e\x61\xac\x77\x54\x1f\xf0\x5c\xc6\x7a\xea\x99\xe7\x30\x06\xcf\x63\xac\x77\x89\x3e\x76\x5e\xcb\x58\xef\xb9\xfa\x80\xcb\x19\xeb\x5d\xaa\x0f\x38\xce\x58\xef\xf9\x8c\xf5\x5e\xc0\x18\xa8\xff\xdf\xcd\x58\xef\x45\x8c\x41\xc8\x58\xef\x65\xfa\x80\xef\x64\xac\x17\xeb\x63\xe7\x75\x8c\xf5\x5e\xa5\x0f\x50\xf7\xbe\x46\x1f\xf0\x22\xc6\x7a\x89\x3e\x76\xbe\x9f\xb1\xde\x8f\xea\x03\xae\x64\xac\xf7\xe3\x8c\xf5\xfe\x16\x63\x3b\xaf\x67\xac\xf7\x66\xc6\x7a\x3f\xc1\x18\x7c\x0f\x63\xbd\xb7\x30\xd6\x7b\x2b\x63\xf0\x52\xc6\x7a\x6f\x67\xac\x77\x2d\x63\xf0\x72\xc6\x7a\x37\x31\xd6\xbb\x99\x31\x50\xef\xfc\x05\x7d\x80\x1a\xc3\x8f\xe9\x03\xd4\x18\xfe\xa2\x3e\x60\xc0\x58\xef\x57\xf5\x01\x6a\xdc\x4e\xe8\x03\x54\xbb\x3e\xa3\x0f\x78\x2d\x63\x17\xb6\x19\xbb\xf0\x89\x8c\xc1\xeb\x18\xbb\xf0\xa9\xfa\x80\x21\x63\x17\xfe\x96\x3e\xe0\x07\x18\xbb\x28\x61\xec\xa2\x4f\x31\x06\x3f\xc8\xd8\x45\x53\xc6\x2e\xfa\x13\xc6\x60\x93\xb1\xa3\x8c\xb1\xa3\xaf\xfc\x7f\xb9\x75\xeb\xf0\x2c\xa2\x25\x7d\xb0\xda\xdd\xbd\x3f\xe4\x43\x12\x3c\x84\x04\x77\x77\x77\x87\x90\x04\x08\x92\x40\x12\xdc\xdd\xdd\xdd\xdd\xdd\x1b\x82\xbb\xbb\xbb\xbb\x07\x49\xf6\x89\xdc\xb9\x73\x67\xee\xec\xce\xee\xb3\x7f\xfd\x9a\xe7\x4d\xbf\x7d\x4e\x9d\x3a\xd5\x55\x75\xaa\xbf\x6e\x0e\x00\x7e\x1a\x20\xa0\x2e\x40\x40\x3c\x00\x61\x02\x04\x0c\x01\x08\x98\x04\x40\x94\x00\x08\x98\x0a\x10\x30\x03\x80\xa8\x0e\x10\xb0\x18\x20\x60\x09\x00\x51\x1b\x20\x60\x19\x40\xc0\x5a\x00\x22\x65\xdc\x56\x80\x80\x6d\x00\x44\x53\x80\x80\x9d\x00\x01\xbb\x00\x88\xe6\x00\x01\xfb\x01\x02\x0e\x00\x10\x2d\x01\x02\x0e\x01\x04\x24\x00\x10\xad\x01\x02\x8e\x03\x04\x9c\x04\x20\xda\x02\x04\x9c\x4e\x43\x42\xca\xd8\x33\x69\x20\x22\x00\x02\xce\x03\x04\x5c\x02\x20\x22\x01\x02\x1e\x03\x04\x3c\x07\x20\xa2\x00\x02\x3e\xa4\x81\x88\x06\x08\x24\x00\x02\x49\x00\x22\x06\x20\x50\x04\x08\x94\x00\x88\xee\x00\x81\x19\xd2\x40\xc4\x01\x04\x66\x4a\x03\x11\x0f\x10\x58\x36\x0d\x44\x0f\x80\xc0\xf2\x69\x20\x7a\x02\x04\x36\x04\x08\xec\x04\x40\xf4\x02\x08\xec\x02\x10\xd8\x15\x80\x98\x08\x10\x18\x93\x06\x62\x32\x40\xe0\x60\x80\xc0\x11\x00\xc4\x14\x80\x1c\x1a\x40\x0e\x13\x80\x98\x05\x90\xc3\x4e\x03\x31\x0f\x20\x47\x8e\x34\x10\xf3\x01\x82\x01\x20\x18\x03\x20\x16\x00\x04\x13\x00\xc1\x16\x00\xb1\x04\x20\x38\x23\x40\x70\x66\x00\x62\x3b\x40\x70\x16\x80\xe0\x5c\x00\xc4\x2e\x80\xe0\x72\x00\xc1\xd3\x01\x88\x43\x00\xc1\x73\x00\x82\x17\x02\x90\x3a\x40\x70\xca\x98\xef\x00\xa4\x0b\x10\xfc\x1b\x20\x38\x09\x80\xec\x06\x50\x80\x00\x28\x90\x0b\x80\x8c\x07\x28\x50\x00\xa0\xc0\x44\x00\x72\x0e\x40\x08\x00\x84\x64\x00\x20\x7f\x00\x84\xf8\x01\x42\x72\x01\x50\x3a\x40\x48\x01\x80\x90\x10\x00\x2a\x13\x40\x48\xb1\x34\x50\x29\xfd\x6d\x01\x42\xfa\x01\x50\x59\x00\x42\x06\xa5\x81\x2a\x05\x10\xb2\x0c\x20\x64\x35\x00\x55\x1a\x20\x14\x4b\x03\x55\x11\x20\x54\x48\x03\x55\x09\x20\x54\x4f\x03\x55\x19\x20\xd4\x4e\x03\x55\x05\x20\x34\x2b\x40\x68\x36\x00\xaa\x2a\x40\x68\x20\x40\x68\x0e\x00\xaa\x3a\x40\x68\x9e\x34\x50\x35\x01\x42\x0b\xa7\x81\xaa\x05\x10\x5a\x22\x0d\x54\x6d\x80\xd0\x6a\x00\xa1\xd5\x01\xa8\x3a\x00\xa1\xb5\xd2\x40\xd5\x03\x08\x4d\x07\x55\x1f\x20\xb4\x49\x1a\xa8\x06\x00\xa1\xfd\x00\x42\x07\x02\x50\x0d\x01\x42\x07\x03\x84\x0e\x07\xa0\x9a\x02\x84\x8e\x06\x08\x3d\x0d\x40\xb5\x02\x08\x3d\x07\x10\x7a\x05\x80\x5a\x0c\x10\x7a\x0d\x20\xf4\x3a\x00\xb5\x0a\x20\xf4\x66\x1a\xa8\x35\x00\xa1\x77\x00\x42\xef\x01\x50\x6b\x01\x6a\x41\x1a\xa8\x0d\x00\xb5\x76\xa4\x81\xda\x08\x50\x1b\x00\x16\x1d\x01\xa0\x36\x01\xac\x07\x80\x1b\xcb\x00\x9a\xc5\x01\xa4\xfc\x3c\x4b\xc1\x08\x0b\x20\x11\x49\x43\xca\x33\x2a\x11\x05\x48\x0c\x05\x18\x61\x03\x24\x16\x4c\x43\xb1\xcd\x00\x89\x85\x00\x12\x5b\x01\x8c\xa8\x0e\x90\xd8\x3a\x0d\xd4\x4b\x80\xc4\x36\x00\x89\xed\x00\x46\xa4\xe8\x0c\x4f\x03\x7f\x1c\x20\x31\x02\x20\xb1\x3d\xc0\x88\x5e\x00\x89\x1d\xd2\x40\xed\x07\x48\xec\x08\x90\x38\x00\x60\x44\x5f\x80\xc4\x81\x69\xa8\x91\x72\x1e\x94\x86\x11\x93\x01\x12\x07\xa7\x41\xf8\x04\x90\x38\x24\x0d\x5a\x56\x80\xc4\xa1\x00\x89\x63\x00\x46\x4c\x01\x48\x1c\x9b\x06\x3e\xc5\x9e\x71\x00\x89\x13\x00\x46\xcc\x01\x48\x9c\x98\x06\x3b\x1b\x40\xe2\x24\x80\xc4\x3d\x00\x23\xe6\x03\x24\xee\x4d\x03\x9d\x72\x1f\xfb\x00\x12\xef\x01\x8c\x38\x01\x90\x78\x3f\x0d\x82\x07\x90\xf8\x00\xe0\x57\x3e\x80\x11\xaf\x01\x7e\x23\x00\xbf\x71\x80\x84\x66\x00\x49\xc1\x00\x49\x05\x00\x46\x96\x02\x48\x0a\x05\x48\xaa\x08\x30\xb2\x0c\x40\x52\x35\x80\xa4\xfa\x00\x23\xeb\x01\x24\x35\x04\x48\x6a\x02\x30\xb2\x05\x40\x52\xca\x98\xf6\x00\x23\xdb\x00\x24\x75\x04\x48\xea\x0c\x30\xb2\x2b\x40\x52\x72\x1a\x12\x5a\x01\x24\x23\x00\xc9\xad\x01\x46\xc6\x02\x24\x87\x01\x24\x2f\x02\x18\x79\x11\x20\xf9\x21\x40\xf2\x73\x80\x51\x12\x40\xf2\x1f\x80\xe4\xbf\x00\x09\xad\x01\xc1\x21\x15\x30\xca\x06\x04\xcf\x99\x0a\x18\xe5\x00\x82\xd7\x02\x24\xa5\x06\x8f\x72\x01\xb9\xc2\xa7\x02\x46\x65\x04\x12\x65\xd3\x7f\x90\xff\xd7\xef\x05\x08\xa0\xe9\x0c\xfd\x7f\x78\xf3\x4d\x1d\x79\x20\xf1\xc0\xaf\x03\xbf\x0f\xfc\x39\xf0\xf7\x40\xd2\x81\x64\x0f\x3c\xc4\x43\x3d\xcc\xc3\x3d\xc2\x23\x3d\xca\xa3\x3d\xc6\x63\x3d\xce\xe3\x3d\xc1\x13\x3d\xc9\x93\x3d\xc5\x53\x3d\xcd\xd3\x3d\xc3\x33\x3d\xcb\xb3\x3d\xc7\x73\x3d\x9f\x97\xc1\xcb\xe8\x65\xf2\x32\x7b\x7e\x2f\x8b\x97\xd5\xcb\xe6\x65\xf7\x02\xbc\x40\x2f\x87\x97\xd3\xcb\xe5\xe5\xf6\xf2\x78\x79\xbd\x7c\x5e\x90\x97\xdf\x0b\xf6\x0a\x78\x21\x5e\xa8\x57\xd0\x2b\xe4\x15\xf6\x8a\x78\x45\xbd\x62\x5e\x71\xaf\x84\x57\xd2\x2b\xe5\x95\xf6\xca\x78\x65\xbd\x72\x5e\x79\xaf\x82\x57\xd1\xab\xe4\x55\xf6\xaa\x78\x55\xbd\x6a\x5e\x75\xaf\x86\x57\xd3\xab\xe5\xd5\xf6\xea\x78\x75\xbd\x7a\x5e\x7d\xaf\x81\xd7\xd0\x6b\xe4\x35\xf6\x9a\x00\x78\xfd\xbd\x01\xde\x20\x6f\x88\x37\xc6\x9b\xe8\x4d\xf7\xe6\x78\xb3\xbd\xb9\xde\x7c\x6f\x9e\xb7\xc0\x5b\xe4\x2d\xf1\x16\x7b\x4b\xbd\x65\xde\x0a\x6f\xb9\xb7\xd2\x5b\xe5\xad\xf1\xd6\x79\x6b\xbd\xf5\xde\x46\x6f\x83\xb7\xd5\xdb\xe2\x6d\xf3\xb6\x27\x14\xf0\x3a\x7a\xcd\xbd\x16\x5e\x9b\x84\x50\x2f\xda\x9b\xe5\xb5\xf7\xc2\x12\x2a\x79\x5d\xbc\xb6\x09\x8d\xbc\x81\xde\xe4\x84\xfa\x5e\x54\xca\x9b\xb7\xd7\xca\xeb\x9a\x50\x33\xa1\x4e\x42\xed\x83\x93\x13\x1a\x78\xed\xbc\xd8\x83\x7d\xbc\x85\xde\x66\xaf\x97\xd7\xcc\x8b\x48\xa8\x77\xb0\x68\x42\xc3\x84\x5a\x5e\xb8\x17\x97\x50\xd0\x6b\xea\xf5\xf6\xfa\x79\x13\x0e\xb2\x07\xb9\xd4\xaf\x05\x41\x09\xf9\x13\x72\x27\xe4\xf1\x36\x25\x34\xf5\x76\x1d\x0c\x4e\x28\x91\x50\x2e\xa1\x68\x42\xb1\x84\x66\x09\xcd\x13\x42\xbc\x98\x84\xbc\x09\xc1\x09\x85\xbc\xbe\xde\x50\xaf\x8f\x37\xcc\x1b\xec\x8d\xf0\x46\x7a\xa3\xbc\xe1\xde\x38\x6f\x3c\x80\x37\xd6\x9b\xea\x4d\xf3\xa6\x78\xaf\x0e\x56\x39\x58\xdb\xeb\x70\xb0\xfa\xc1\x1a\x07\x6b\x7a\xdd\x0e\xd6\x39\x58\xeb\x60\x55\x52\x07\x0e\xea\x11\x3b\xc1\x82\x1e\xc4\xce\xff\xfa\x65\x1f\xaf\x0e\x3a\x4c\x02\x48\x7e\x9b\x72\xf5\xcf\xbf\x49\x7a\x92\xfe\xbf\xf9\x38\xf2\xbf\x3d\x68\xa0\xe3\x00\x60\x2b\xec\x84\xfd\x30\x1f\xae\xa5\x37\x4f\x82\x61\x30\x0b\x16\xc1\x00\x78\xf6\x2f\xe2\x7b\xe1\x18\xec\x4d\x65\xcb\x61\x51\x8a\x7d\xff\xc3\xb1\x19\xf6\xa4\x7e\xaf\x07\x98\x07\x2b\x61\x12\xf4\x82\x46\xff\x56\x2e\x0a\xa2\x61\x32\x1c\x42\xc6\xc0\x9d\xd4\x22\x98\x72\xb4\x87\x18\xe8\x0d\x33\xe1\x10\x5c\x43\xaa\xc2\x39\xc4\x40\x67\x41\x12\x92\x1f\xde\x21\xb5\xa1\x0f\x62\x22\x35\x91\x6f\x68\x8e\xff\xae\x2a\xf9\x31\xb1\x13\x66\xc2\x78\x78\x06\x33\x61\x0c\xa4\xbc\x45\xda\x08\x8f\x65\x84\x39\x68\x75\xe8\x8d\xee\x84\x09\xb0\x1a\xc6\x43\xea\xff\x95\xc0\x2d\xd8\x9e\xc2\x90\xe6\xd0\x15\x06\xa5\xbc\x0d\x03\x40\x57\x18\xfd\xdf\x94\x8e\x4f\xed\x1b\x0a\x63\xfe\xd9\x44\xec\xfc\xf3\x1a\x94\xe4\x37\x30\x33\xbd\x21\x0e\x22\xa1\xf7\x7f\x74\xef\x47\xd6\x62\x0d\x91\xb5\x68\x46\xd8\xff\x1f\x5f\xa8\x66\xa6\x8d\x4b\xda\x0f\xb3\x61\x3d\x52\x0c\xf9\x86\x0c\xc3\x32\x26\x7f\x81\x61\xd0\x17\x46\xa6\xf4\x25\xc5\xc0\x98\xb4\x55\x1d\x1a\x3a\xce\x1a\xdf\xb4\x8d\x54\xf2\x1b\x5a\x86\x4e\x1d\x7c\xbc\xcc\xf1\xcd\xff\x38\xff\x1e\xf3\xf7\x1a\xd3\x3c\x35\x62\xf4\x3f\xea\x00\xe4\x43\xb3\xfe\x47\x2d\x19\x87\xd8\xe9\x1c\x01\x1b\xb9\x9e\xce\x51\xa0\x90\xe4\x74\x8e\x81\x81\x86\xa6\x73\x1c\x6c\xb4\x5f\x3a\x27\x40\x45\xf7\xa6\x73\x12\x0c\x34\x31\x9d\x53\x50\x1b\xdb\x90\xce\x69\xd0\xf1\xc0\x74\xce\x42\x37\x22\x63\x3a\xe7\x20\x03\x71\x32\x9d\xf3\x10\x44\x56\x48\xe7\x02\x04\x91\x17\xd3\xb9\x08\xb9\xa9\x46\xe9\x5c\x05\x8d\x5a\x0d\x18\x20\x38\x0e\x08\xc8\xd4\xfe\x74\x8e\x83\x4c\x9d\x4f\xe7\x04\x64\xa7\x1e\xa6\x72\x06\x00\x31\x53\x2d\x4f\xe1\x08\x04\x23\xcb\xd3\x39\x0a\x22\xf2\x21\x9d\x63\x90\x1b\xa5\xd2\x39\x0e\xc1\x68\xb5\x74\x4e\x40\x76\x74\x7a\x3a\x27\x21\x37\x7a\x2e\x9d\x53\x30\x1f\x93\xd2\x39\x0d\x39\xb1\x3f\xe9\x9c\x85\x87\x78\x89\x74\xce\x41\x51\x62\x62\x3a\xe7\xa1\x25\xf1\x2c\x9d\x0b\xd0\x92\x8c\x4d\xe7\x22\x34\x24\x93\xd3\xb9\x0a\x81\xd4\xe0\x14\x4e\xa7\xde\x17\x4d\xa6\x73\x1c\x64\xda\x4e\xe7\x04\x64\xa7\x73\xa7\x70\x3e\x4d\xa6\x6e\x3a\x4f\x91\x69\x97\xce\x53\x64\xe2\x53\xb8\x9c\x26\x33\x37\x9d\xa7\xc8\xac\x4f\xe7\x29\x32\x5e\x0a\xd7\xd3\x64\x9e\xa6\xf3\x14\x99\xef\xe9\x9c\x80\xec\x0c\x0d\x15\x21\x0a\x3a\x40\x14\xc4\x43\x14\xf4\x85\x48\x88\x00\x3f\x44\x40\x18\xc4\x43\x18\xf8\x21\x1c\x62\xa0\x1b\xf4\x81\xd8\x54\xa9\x8e\x10\x0f\x7e\x58\x03\x7e\x08\x81\x60\x08\x86\x22\x90\x17\xfc\x50\x05\x62\x20\x06\x3a\x40\x17\x88\x04\x3f\x54\x80\x18\x88\x85\x6e\xa9\x7f\xc3\x52\xb5\xc6\x40\x34\x04\x01\x9b\xda\xf3\x3f\xeb\x2a\x0a\xf9\xd2\x59\x31\xf0\x43\x13\x88\x84\x68\xa8\x07\x3d\x20\x0c\xa2\xa1\x19\x44\x81\x1f\xca\x43\x0c\x84\x41\x6c\xaa\x85\x31\xd0\x1e\xfc\xd0\x10\x62\xa1\x07\xc4\x41\x3c\x44\x42\x24\xc4\x81\x1f\x72\xa6\xea\x8d\x87\x6e\x50\x1c\xf2\x43\x7e\xe8\x95\xaa\xa7\x3b\x04\xa5\xda\xd3\x01\xf2\x43\x2e\xf0\xa7\xea\x4c\xd1\x52\x0f\xa2\x52\x79\xf7\xf4\xb3\x1f\x2a\xa7\x9e\x3b\x00\x54\x8c\xea\x10\x15\x1f\xd5\x37\x32\xc2\x1f\x11\x16\x1f\xe6\x0f\x8f\xe9\xd6\x27\x36\xaa\x43\xc7\x78\xff\x1a\x7f\x48\x70\x70\x91\xbc\xfe\x2a\x31\x31\x1d\xba\x44\xfa\x2b\xc4\xc4\x76\x8b\x89\x0d\x8b\x8f\x8a\x89\x0e\x62\x2b\xfc\xab\x54\xd1\x7c\x21\xc1\xc1\xc5\xfc\x4d\x22\xa3\xeb\xf5\x08\x8b\x6e\x16\xe5\x2f\x1f\x13\x16\x1b\xe1\x8f\x69\xef\x6f\x18\xdb\x23\x2e\x3e\x32\x32\xce\x9f\xb3\x63\x7c\x7c\xb7\xe2\xf9\xf3\xf7\x8a\x8c\xee\x1e\x14\x13\xdb\x21\x7f\x2e\x7f\x58\x74\x84\xbf\x5e\x54\x58\x74\xf7\xa8\xb0\x68\x7f\xe5\xb0\xe8\x0e\xf0\x6f\xbd\x51\x0b\xa2\x20\x1c\x62\x21\x06\xfc\x50\x15\x22\xd3\xdb\x52\x7c\x1d\x03\xf0\xcf\x29\x6b\x45\x85\xc7\xc6\xf8\xab\x46\x46\xf9\x6b\xc5\x44\xc7\x00\xd4\x87\x48\xe8\x00\x3d\xa0\x4b\xaa\x2b\xa1\x7e\x64\x87\x1e\x5d\xc2\x62\xff\xfd\x14\xf9\xfe\xed\x34\xff\x49\x79\xbe\x7f\xaa\xff\xff\xd5\xc8\xc6\x10\x09\xb1\x10\x97\x9e\x3b\x7e\x08\x86\x20\x08\x81\x20\x08\x86\x7c\xd0\x0e\x22\x53\x73\x13\x1a\x47\xc6\xc6\x45\xc5\x44\xfb\x83\x83\x42\x82\x82\xf3\xb5\x8b\x8c\x0f\xfb\x77\x36\xfc\xd3\x82\xb4\xf9\xff\xfb\xec\xa9\x93\x57\x8d\x8c\x4a\x9b\xba\x62\xaa\x6c\x54\x6a\x7a\x44\xa5\xa6\x54\xca\x32\x88\x4f\x4d\xe6\x08\x88\x84\xae\xa9\x7e\xeb\xfc\x1f\x29\xf8\xaf\xc9\xff\x8f\xc4\x4a\x91\xea\x03\xfe\x54\x63\xfd\x10\x9b\xea\xf3\xa8\xf4\x44\x8d\x4d\x5f\x64\x51\xa9\xb7\x16\x9e\xda\x92\x72\x43\x69\xd7\x9d\xa0\x47\xea\x02\x89\x83\x88\x54\xcb\xff\xb1\x80\xe2\x20\x08\xa0\x62\x6c\x4c\x54\x84\x3f\x2a\xce\x1f\xe6\x8f\x8f\x0d\x8b\x88\xec\x1a\x16\xdb\x39\x25\x9d\xd2\x73\x31\x25\x73\xba\x86\xf5\xf1\xb7\x8b\xf4\xc7\x46\x76\x88\x8a\x8b\x8f\x8c\x8d\x8c\xf0\x47\x45\xfb\xc3\x23\x63\xe3\xc3\xa2\xa2\xfd\x9d\x7a\xc4\x46\xc5\x45\x44\x85\xa7\x64\x6b\x5c\x10\x40\x39\x88\x4b\x35\x20\x3a\xf5\xd6\x62\xff\xc7\xd5\x0b\xe5\xe2\xc2\x23\xa3\x23\x22\x63\xff\x73\xba\xff\xef\x23\xfe\x4f\x3f\x76\x84\x1e\xa9\xbe\x89\x4e\xf7\x86\x1f\xe2\x52\xaf\xe2\x52\x59\x64\xea\x9d\xb7\x4f\xf5\x77\x1f\xe8\x06\x91\xd0\x1e\xc2\x52\x0d\xf4\xa7\x1a\x18\x97\x5a\x38\xa2\xd3\xfd\xd7\x3e\xd5\x48\x7f\x6a\x01\x48\x33\x3e\xc5\x83\x69\x1e\xfe\xc7\xb8\xb8\xff\x14\x93\xc8\xd4\x18\x85\xa7\xc6\x32\x26\xd5\x82\xf0\xf4\x02\xd7\x15\xba\x42\x8f\xf4\x96\xff\x5c\xb2\xfe\x6d\x86\xa6\x7a\xbf\x63\x8f\xae\x61\xd1\x51\x71\xf1\xfe\xb8\xb0\xe8\x38\x7f\x5c\x64\x6c\x54\x7b\x7f\x7c\x9f\x6e\x91\xed\xc3\xc2\x23\xfd\x11\x91\x71\x51\x1d\xa2\x23\x23\xfc\xed\x63\x62\xfd\x3d\xe2\x22\x63\xfd\x51\xd1\xf1\x91\xb1\x29\x7d\x71\xa9\x31\x8a\xec\x12\x19\x1e\x1f\x1b\x13\x1d\x15\xee\x0f\x8f\xe9\xda\xb5\x47\x74\x54\x78\x5a\x01\x81\xff\x56\xbd\x52\xfe\x05\x41\xd8\x7f\x89\x53\x78\x7a\x94\x82\xd2\xcd\xcf\x0f\xf0\x8f\x3a\xd2\xab\x57\x50\x58\x7a\xb0\xc2\x63\x62\xbb\x05\x85\xc7\x74\xcd\xff\xff\x5d\xed\x3f\xe2\xf0\xaf\xde\x8f\x4d\xcd\xc6\x14\x9d\x5d\xa1\xcb\xff\xfd\xd4\x29\x4e\x49\xf7\x47\x6c\x5c\x50\xc7\xf8\xae\x5d\x00\x6a\xa6\x3a\x3a\x32\x35\xec\x69\xa1\xec\xf1\x9f\x32\x30\x1e\x3a\xa6\x06\xbc\x1c\x74\x4b\x0d\x62\xda\xd5\xbf\x8e\x49\x79\xea\xfc\xd7\x1a\x91\x56\x1f\xa0\x66\x54\x78\x64\x74\x5c\x64\x84\xbf\x47\x6a\xbe\xc6\x77\x8c\xf4\x97\xeb\x16\x16\xde\x31\xd2\x9f\xde\x93\xd7\xff\x8f\xc2\x11\x12\x14\xfc\x3f\x7b\xe6\x9f\x93\xff\xf3\xd1\xd1\xe5\x5f\x8c\x88\x83\xfc\x50\x13\xaa\x41\x05\xa8\x04\xb5\xa1\x01\x54\x4a\x7d\x80\xa5\x1a\xf1\x9f\x3d\x92\x3a\x79\x6a\x69\xef\x92\x66\x40\x5c\xfe\x9a\xd5\x2a\x54\xaa\xdd\xa0\x52\xbe\x54\x03\xfe\x77\x8b\xe8\xdf\xa5\x22\x44\x8e\xea\x72\x6a\x6e\x8b\x7e\xd5\x5a\xbc\x6d\xb3\xb1\x7f\xdc\xc2\x4b\xf0\x6f\x5a\xfe\x77\xb5\x34\x75\xdc\xa0\x7e\xd5\x5a\x1c\xf8\x17\x4d\xff\xd2\xf2\xff\x42\xd3\xff\xb1\x36\xfd\xe3\xdd\x3b\x39\xe5\x3d\xe4\xdf\x1c\x09\xfd\x00\x10\x14\x50\x04\x43\x70\x84\x40\x48\x84\x42\x68\x84\x41\x58\x84\x43\x78\x44\x40\x44\x44\x42\x64\x44\x41\x54\x44\x43\x74\xc4\x40\x4c\xc4\x42\x6c\xc4\x41\x5c\xc4\x87\x64\x40\x32\x22\x99\x90\xcc\x88\x1f\xc9\x82\x64\x45\xb2\x21\xd9\x91\x00\x24\x10\xc9\x81\xe4\x44\x72\x21\xb9\x91\x3c\x48\x5e\x24\x1f\x12\x84\xe4\x47\x82\x91\x02\x48\x08\x12\x8a\x14\x44\x0a\x21\x85\x91\x22\x48\x51\xa4\x18\x52\x1c\x29\x81\x94\x44\x4a\x21\xa5\x91\x32\x48\x59\xa4\x1c\x52\x1e\xa9\x80\x54\x44\x2a\x21\x95\x91\x2a\x48\x55\xa4\x1a\x52\x1d\xa9\x81\xd4\x44\x6a\x21\xb5\x91\x3a\x48\x5d\xa4\x1e\x52\x1f\x69\x80\x34\x44\x1a\x21\x8d\x91\x26\x48\x53\xa4\x19\xd2\x1c\x69\x81\xb4\x44\x5a\x21\xad\x91\x36\x48\x5b\x58\x8f\x84\x21\xed\x90\x70\x24\x02\x89\x44\xda\x23\x1d\x90\x8e\x48\x14\xd2\x09\xe9\x8c\x74\x41\xba\x22\xd1\x48\x0c\xd2\x0d\xe9\x8e\xc4\x22\x71\x48\x3c\xd2\x03\xe9\x89\xf4\x42\x7a\xc3\x27\xa4\x0f\xd2\x17\xe9\x87\xf4\x47\x06\x20\x03\x91\x41\xc8\x60\x64\x08\x32\x14\x19\x86\x0c\x47\x46\x20\x23\x91\x51\xc8\x68\x64\x0c\x32\x16\x19\x87\x8c\x47\x26\x20\x13\x91\x49\xc8\x64\x64\x0a\x32\x15\x99\x86\x4c\x47\x66\x20\x33\x91\x59\xc8\x6c\x64\x0e\x32\x17\x99\x87\xcc\x47\x16\x20\x0b\x91\x45\xc8\x62\x64\x09\xb2\x14\x59\x86\x2c\x47\x56\x20\x2b\x91\x55\xc8\x6a\x64\x0d\xb2\x16\x59\x87\xac\x47\x36\x20\x1b\x91\x4d\xc8\x66\x64\x0b\xb2\x15\xd9\x86\x6c\x47\x76\x20\x3b\x91\x5d\xc8\x6e\x64\x0f\xb2\x17\xd9\x87\xec\x47\x0e\x20\x1e\x72\x10\x39\x84\x24\x20\x87\x91\x23\xc8\x51\xe4\x18\x72\x1c\x39\x81\x9c\x44\x4e\x21\xa7\x91\x33\xc8\x59\xe4\x1c\x72\x1e\xb9\x80\x5c\x44\x2e\x21\x97\x91\x2b\xc8\x55\xe4\x1a\x72\x1d\xb9\x81\xdc\x44\x6e\x21\xb7\x91\x3b\xc8\x5d\xe4\x1e\x72\x1f\x79\x80\x3c\x44\x1e\x21\x8f\x91\x27\xc8\x53\xe4\x19\xf2\x1c\x79\x81\xbc\x44\x5e\x21\xaf\x91\x37\xc8\x5b\xe4\x1d\xf2\x1e\xf9\x80\x7c\x44\x3e\x21\x9f\x91\x2f\xc8\x57\xe4\x1b\xf2\x1d\xf9\x81\xfc\x44\x12\x91\x5f\xc8\x6f\xe4\x0f\xf2\x17\x49\x42\x92\x53\x12\x00\x45\x51\x0c\xc5\x51\x02\x25\x51\x0a\xa5\x51\x06\x65\x51\x0e\xe5\x51\x01\x15\x51\x09\x95\x51\x05\x55\x51\x0d\xd5\x51\x03\x35\x51\x0b\xb5\x51\x07\x75\x51\x1f\x9a\x01\xcd\x88\x66\x42\x33\xa3\x7e\x34\x0b\x9a\x15\xcd\x86\x66\x47\x03\xd0\x40\x34\x07\x9a\x13\xcd\x85\xe6\x46\xf3\xa0\x79\xd1\x7c\x68\x10\x9a\x1f\x0d\x46\x0b\xa0\x21\x68\x28\x5a\x10\x2d\x84\x16\x46\x8b\xa0\x45\xd1\x62\x68\x71\xb4\x04\x5a\x12\x2d\x85\x96\x46\xcb\xa0\x65\xd1\x72\x68\x79\xb4\x02\x5a\x11\xad\x84\x56\x46\xab\xa0\x55\xd1\x6a\x68\x75\xb4\x06\x5a\x13\xad\x85\xd6\x46\xeb\xa0\x75\xd1\x7a\x68\x7d\xb4\x01\xda\x10\x6d\x84\x36\x46\x9b\xa0\x4d\xd1\x66\x68\x73\xb4\x05\xda\x12\x6d\x85\xb6\x46\xdb\xa0\x6d\xd1\x30\xb4\x1d\x1a\x8e\x46\xa0\x91\x68\x7b\xb4\x03\xda\x11\x8d\x42\x3b\xa1\x9d\xd1\x2e\x68\x57\x34\x1a\x8d\x41\xbb\xa1\xdd\xd1\x58\x34\x0e\x8d\x47\x7b\xa0\x3d\xd1\x5e\x68\x6f\xb4\x0f\xda\x17\xed\x87\xf6\x47\x07\xa0\x03\xd1\x41\xe8\x60\x74\x08\x3a\x14\x1d\x86\x0e\x47\x47\xa0\x23\xd1\x51\xe8\x68\x74\x0c\x3a\x16\x1d\x87\x8e\x47\x27\xa0\x13\xd1\x49\xe8\x64\x74\x0a\x3a\x15\x9d\x86\x4e\x47\x67\xa0\x33\xd1\x59\xe8\x6c\x74\x0e\x3a\x17\x9d\x87\xce\x47\x17\xa0\x0b\xd1\x45\xe8\x62\x74\x09\xba\x14\x5d\x86\x2e\x47\x57\xa0\x2b\xd1\x55\xe8\x6a\x74\x0d\xba\x16\x5d\x87\xae\x47\x37\xa0\x1b\xd1\x4d\xe8\x66\x74\x0b\xba\x15\xdd\x86\x6e\x47\x77\xa0\x3b\xd1\x5d\xe8\x6e\x74\x0f\xba\x17\xdd\x87\xee\x47\x0f\xa0\x1e\x7a\x10\x3d\x84\x26\xa0\x87\xd1\x23\xe8\x51\xf4\x18\x7a\x1c\x3d\x81\x9e\x44\x4f\xa1\xa7\xd1\x33\xe8\x59\xf4\x1c\x7a\x1e\xbd\x80\x5e\x44\x2f\xa1\x97\xd1\x2b\xe8\x55\xf4\x1a\x7a\x1d\xbd\x81\xde\x44\x6f\xa1\xb7\xd1\x3b\xe8\x5d\xf4\x1e\x7a\x1f\x7d\x80\x3e\x44\x1f\xa1\x8f\xd1\x27\xe8\x53\xf4\x19\xfa\x1c\x7d\x81\xbe\x44\x5f\xa1\xaf\xd1\x37\xe8\x5b\xf4\x1d\xfa\x1e\xfd\x80\x7e\x44\x3f\xa1\x9f\xd1\x2f\xe8\x57\xf4\x1b\xfa\x1d\xfd\x81\xfe\x44\x13\xd1\x5f\xe8\x6f\xf4\x0f\xfa\x17\x4d\x42\x93\x31\xc0\x10\x0c\xc5\x30\x0c\xc7\x08\x8c\xc4\x28\x8c\xc6\x18\x8c\xc5\x38\x8c\xc7\x04\x4c\xc4\x24\x4c\xc6\x14\x4c\xc5\x34\x4c\xc7\x0c\xcc\xc4\x2c\xcc\xc6\x1c\xcc\xc5\x7c\x58\x06\x2c\x23\x96\x09\xcb\x8c\xf9\xb1\x2c\x58\x56\x2c\x1b\x96\x1d\x0b\xc0\x02\xb1\x1c\x58\x4e\x2c\x17\x96\x1b\xcb\x83\xe5\xc5\xf2\x61\x41\x58\x7e\x2c\x18\x2b\x80\x85\x60\xa1\x58\x41\xac\x10\x56\x18\x2b\x82\x15\xc5\x8a\x61\xc5\xb1\x12\x58\xc9\x7f\xee\x66\xc1\xca\x63\x15\xb0\x8a\x58\x25\xac\x32\x56\x05\xab\x8a\x55\xc3\xaa\x63\x35\xb0\x9a\x58\x2d\xac\x36\x56\x07\xab\x8b\xd5\xc3\xea\x63\x0d\xb0\x86\x58\x23\xac\x31\xd6\x04\x6b\x8a\x35\xc3\x9a\x63\x2d\xb0\x96\x58\x2b\xac\x35\xd6\x06\x6b\x8b\x85\x61\xed\xb0\x70\x2c\x02\x8b\xc4\xda\x63\x1d\xd2\xf6\xbc\x60\x9d\xb1\x2e\x58\x57\x2c\x1a\x8b\xc1\xba\x61\xdd\xb1\xd8\x7f\xb3\xe7\xa5\x3f\x36\x00\x1b\x88\x0d\xc2\x06\x63\x43\xb0\xa1\xd8\x30\x6c\x38\x36\x02\x1b\x89\x8d\xc2\x46\x63\x63\xb0\xb1\xd8\x38\x6c\x3c\x36\x01\x9b\x88\x4d\xc2\x26\x63\x53\xb0\xa9\xd8\x34\x6c\x3a\x36\x03\x9b\x89\xcd\xc2\x66\x63\x73\xb0\xb9\xd8\x3c\x6c\x3e\xb6\x00\x5b\x88\x2d\xc2\x16\x63\x4b\xb0\xa5\xd8\x32\x6c\x39\xb6\x02\x5b\x89\xad\xc2\x56\x63\x6b\xb0\xb5\xd8\x3a\x6c\x3d\xb6\x01\xdb\x88\x6d\xc2\x36\x63\x5b\xb0\xad\xd8\x36\x6c\x3b\xb6\x03\xdb\x89\xed\xc2\x76\x63\x7b\xb0\xbd\xd8\x3e\x6c\x3f\x76\x00\xf3\xb0\x83\xd8\x21\x2c\x01\x3b\x8c\x1d\xc1\x8e\x62\xc7\xb0\xe3\xd8\x09\xec\x24\x76\x0a\x3b\x8d\x9d\xc1\xce\x62\xe7\xb0\xf3\xd8\x05\xec\x22\x76\x09\xbb\x8c\x5d\xc1\xae\x62\xd7\xb0\xeb\xd8\x0d\xec\x26\x76\x0b\xbb\x8d\xdd\xc1\xee\x62\xf7\xb0\xfb\xd8\x03\xec\x21\xf6\x08\x7b\x8c\x3d\xc1\x9e\x62\xcf\xb0\xe7\xd8\x0b\xec\x25\xf6\x0a\x7b\x8d\xbd\xc1\xde\x62\xef\xb0\xf7\xd8\x07\xec\x23\xf6\x09\xfb\x8c\x7d\xc1\xbe\x62\xdf\xb0\xef\xd8\x0f\xec\x27\x96\x88\xfd\xc2\x7e\x63\x7f\xb0\xbf\x58\x12\x96\x8c\x03\x8e\xe0\x28\x8e\xe1\x38\x4e\xe0\x24\x4e\xe1\x34\xce\xe0\x2c\xce\xe1\x3c\x2e\xe0\x22\x2e\xe1\x32\xae\xe0\x2a\xae\xe1\x3a\x6e\xe0\x26\x6e\xe1\x36\xee\xe0\x2e\xee\x4b\xdf\x27\x94\x19\xf7\xe3\x59\xf0\xac\x78\x36\x3c\x3b\x1e\x80\x07\xe2\x39\xf0\x9c\xa9\xfb\x86\xf2\xe0\x79\xff\xb1\x77\x08\x2f\x80\x87\xe0\xa1\x78\x41\xbc\x10\x5e\x18\x2f\x82\x17\xc5\x8b\xe1\xc5\xf1\x12\x78\x49\xbc\x14\x5e\x1a\x2f\x83\x97\xc5\xcb\xe1\xe5\xf1\x0a\x78\x45\xbc\x12\x5e\x19\xaf\x82\x57\xc5\xab\xe1\xd5\xf1\x1a\x78\x4d\xbc\x16\x5e\x1b\xaf\x83\xd7\xc5\xeb\xe1\xf5\xf1\x06\x78\x43\xbc\x11\xde\x18\x6f\x82\x37\xc5\x9b\xe1\xcd\xf1\x16\x78\x4b\xbc\x15\xde\x1a\x6f\x83\xb7\xc5\xc3\xf0\x76\x78\x38\x1e\x81\x47\xe2\xed\xf1\x0e\x78\x47\x3c\x0a\xef\x84\x77\xc6\xbb\xe0\x5d\xf1\x68\x3c\x06\xef\x86\x77\xc7\x63\xf1\x38\x3c\x1e\xef\x81\xf7\xc4\x7b\xe1\xbd\xf1\x3e\x78\x5f\xbc\x1f\xde\x1f\x1f\x80\x0f\xc4\x07\xe1\x83\xf1\x21\xf8\x50\x7c\x18\x3e\x1c\x1f\x81\x8f\xc4\x47\xe1\xa3\xf1\x31\xf8\x58\x7c\x1c\x3e\x1e\x9f\x80\x4f\xc4\x27\xe1\x93\xf1\x29\xf8\x54\x7c\x1a\x3e\x1d\x9f\x81\xcf\xc4\x67\xe1\xb3\xf1\x39\xf8\x5c\x7c\x1e\x3e\x1f\x5f\x80\x2f\xc4\x17\xe1\x8b\xf1\x25\xf8\x52\x7c\x19\xbe\x1c\x5f\x81\xaf\xc4\x57\xe1\xab\xf1\x35\xf8\x5a\x7c\x1d\xbe\x1e\xdf\x80\x6f\xc4\x37\xe1\x9b\xf1\x2d\xf8\x56\x7c\x1b\xbe\x1d\xdf\x81\xef\xc4\x77\xe1\xbb\xf1\x3d\xf8\x5e\x7c\x1f\xbe\x1f\x3f\x80\x7b\xf8\x41\xfc\x10\x9e\x80\x1f\xc6\x8f\xe0\x47\xf1\x63\xf8\x71\xfc\x04\x7e\x12\x3f\x85\x9f\xc6\xcf\xe0\x67\xf1\x73\xf8\x79\xfc\x02\x7e\x11\xbf\x84\x5f\xc6\xaf\xe0\x57\xf1\x6b\xf8\x75\xfc\x06\x7e\x13\xbf\x85\xdf\xc6\xef\xe0\x77\xf1\x7b\xf8\x7d\xfc\x01\xfe\x10\x7f\x84\x3f\xc6\x9f\xe0\x4f\xf1\x67\xf8\x73\xfc\x05\xfe\x12\x7f\x85\xbf\xc6\xdf\xe0\x6f\xf1\x77\xf8\x7b\xfc\x03\xfe\x11\xff\x84\x7f\xc6\xbf\xe0\x5f\xf1\x6f\xf8\x77\xfc\x07\xfe\x13\x4f\xc4\x7f\xe1\xbf\xf1\x3f\xf8\x5f\x3c\x09\x4f\x26\x80\x40\x08\x94\xc0\x08\x9c\x20\x08\x92\xa0\x08\x9a\x60\x08\x96\xe0\x08\x9e\x10\x08\x91\x90\x08\x99\x50\x08\x95\xd0\x08\x9d\x30\x08\x93\xb0\x08\x9b\x70\x08\x97\xf0\x11\x19\x88\x8c\x44\x26\x22\x33\xe1\x27\xb2\x10\x59\x89\x6c\x44\x76\x22\x80\x08\x24\x72\x10\x39\x89\x5c\x44\x6e\x22\x0f\x91\x97\xc8\x47\x04\x11\xf9\x89\x60\xa2\x00\x11\x42\x84\x12\x05\x89\x42\x44\x61\xa2\x08\x51\x94\x28\x46\x14\x27\x4a\x10\x25\x89\x52\x44\x69\xa2\x0c\x51\x96\x28\x47\x94\x27\x2a\x10\x15\x89\x4a\x44\x65\xa2\x0a\x51\x95\xa8\x46\x54\x27\x6a\x10\x35\x89\x5a\x44\x6d\xa2\x0e\x51\x97\xa8\x47\xd4\x27\x1a\x10\x0d\x89\x46\x44\x63\xa2\x09\xd1\x94\x68\x46\x34\x27\x5a\x10\x2d\x89\x56\x44\x6b\xa2\x0d\xd1\x96\x08\x23\xda\x11\xe1\x44\x04\x11\x49\xb4\x27\x3a\x10\x1d\x89\x28\xa2\x13\xd1\x99\xe8\x42\x74\x25\xa2\x89\x18\xa2\x1b\xd1\x9d\x88\x25\xe2\x88\x78\xa2\x07\xd1\x93\xe8\x45\xf4\x26\xfa\x10\x7d\x89\x7e\x44\x7f\x62\x00\x31\x90\x18\x44\x0c\x26\x86\x10\x43\x89\x61\xc4\x70\x62\x04\x31\x92\x18\x45\x8c\x26\xc6\x10\x63\x89\x71\xc4\x78\x62\x02\x31\x91\x98\x44\x4c\x26\xa6\x10\x53\x89\x69\xc4\x74\x62\x06\x31\x93\x98\x45\xcc\x26\xe6\x10\x73\x89\x79\xc4\x7c\x62\x01\xb1\x90\x58\x44\x2c\x26\x96\x10\x4b\x89\x65\xc4\x72\x62\x05\xb1\x92\x58\x45\xac\x26\xd6\x10\x6b\x89\x75\xc4\x7a\x62\x03\xb1\x91\xd8\x44\x6c\x26\xb6\x10\x5b\x89\x6d\xc4\x76\x62\x07\xb1\x93\xd8\x45\xec\x26\xf6\x10\x7b\x89\x7d\xc4\x7e\xe2\x00\xe1\x11\x07\x89\x43\x44\x02\x71\x98\x38\x42\x1c\x25\x8e\x11\xc7\x89\x13\xc4\x49\xe2\x14\x71\x9a\x38\x43\x9c\x25\xce\x11\xe7\x89\x0b\xc4\x45\xe2\x12\x71\x99\xb8\x42\x5c\x25\xae\x11\xd7\x89\x1b\xc4\x4d\xe2\x16\x71\x9b\xb8\x43\xdc\x25\xee\x11\xf7\x89\x07\xc4\x43\xe2\x11\xf1\x98\x78\x42\x3c\x25\x9e\x11\xcf\x89\x17\xc4\x4b\xe2\x15\xf1\x9a\x78\x43\xbc\x25\xde\x11\xef\x89\x0f\xc4\x47\xe2\x13\xf1\x99\xf8\x42\x7c\x25\xbe\x11\xdf\x89\x1f\xc4\x4f\x22\x91\xf8\x45\xfc\x26\xfe\x10\x7f\x89\x24\x22\x99\x04\x12\x21\x51\x12\x23\x71\x92\x20\x49\x92\x22\x69\x92\x21\x59\x92\x23\x79\x52\x20\x45\x52\x22\x65\x52\x21\x55\x52\x23\x75\xd2\x20\x4d\xd2\x22\x6d\xd2\x21\x5d\xd2\x47\x66\x20\x33\x92\x99\xc8\xcc\xa4\x9f\xcc\x42\x66\x25\xb3\x91\xd9\xc9\x00\x32\x90\xcc\x41\xe6\x24\x73\x91\xb9\xc9\x3c\x64\x5e\x32\x1f\x19\x44\xe6\x27\x83\xc9\x02\x64\x08\x19\x4a\x16\x24\x0b\x91\x85\xc9\x22\x64\x51\xb2\x18\x59\x9c\x2c\x41\x96\x24\x4b\x91\xa5\xc9\x32\x64\x59\xb2\x1c\x59\x9e\xac\x40\x56\x24\x2b\x91\x95\xc9\x2a\x64\x55\xb2\x1a\x59\x9d\xac\x41\xd6\x24\x6b\x91\xb5\xc9\x3a\x64\x5d\xb2\x1e\x59\x9f\x6c\x40\x36\x24\x1b\x91\x8d\xc9\x26\x64\x53\xb2\x19\xd9\x9c\x6c\x41\xb6\x24\x5b\x91\xad\xc9\x36\x64\x5b\x32\x8c\x6c\x47\x86\x93\x11\x64\x24\xd9\x9e\xec\x40\x76\x24\xa3\xc8\x4e\x64\x67\xb2\x0b\xd9\x95\x8c\x26\x63\xc8\x6e\x64\x77\x32\x96\x8c\x23\xe3\xc9\x1e\x64\x4f\xb2\x17\xd9\x9b\xec\x43\xf6\x25\xfb\x91\xfd\xc9\x01\xe4\x40\x72\x10\x39\x98\x1c\x42\x0e\x25\x87\x91\xc3\xc9\x11\xe4\x48\x72\x14\x39\x9a\x1c\x43\x8e\x25\xc7\x91\xe3\xc9\x09\xe4\x44\x72\x12\x39\x99\x9c\x42\x4e\x25\xa7\x91\xd3\xc9\x19\xe4\x4c\x72\x16\x39\x9b\x9c\x43\xce\x25\xe7\x91\xf3\xc9\x05\xe4\x42\x72\x11\xb9\x98\x5c\x42\x2e\x25\x97\x91\xcb\xc9\x15\xe4\x4a\x72\x15\xb9\x9a\x5c\x43\xae\x25\xd7\x91\xeb\xc9\x0d\xe4\x46\x72\x13\xb9\x99\xdc\x42\x6e\x25\xb7\x91\xdb\xc9\x1d\xe4\x4e\x72\x17\xb9\x9b\xdc\x43\xee\x25\xf7\x91\xfb\xc9\x03\xa4\x47\x1e\x24\x0f\x91\x09\xe4\x61\xf2\x08\x79\x94\x3c\x46\x1e\x27\x4f\x90\x27\xc9\x53\xe4\x69\xf2\x0c\x79\x96\x3c\x47\x9e\x27\x2f\x90\x17\xc9\x4b\xe4\x65\xf2\x0a\x79\x95\xbc\x46\x5e\x27\x6f\x90\x37\xc9\x5b\xe4\x6d\xf2\x0e\x79\x97\xbc\x47\xde\x27\x1f\x90\x0f\xc9\x47\xe4\x63\xf2\x09\xf9\x94\x7c\x46\x3e\x27\x5f\x90\x2f\xc9\x57\xe4\x6b\xf2\x0d\xf9\x96\x7c\x47\xbe\x27\x3f\x90\x1f\xc9\x4f\xe4\x67\xf2\x0b\xf9\x95\xfc\x46\x7e\x27\x7f\x90\x3f\xc9\x44\xf2\x17\xf9\x9b\xfc\x43\xfe\x25\x93\xc8\x64\x0a\x28\x84\x42\x29\x8c\xc2\x29\x82\x22\x29\x8a\xa2\x29\x86\x62\x29\x8e\xe2\x29\x81\x12\x29\x89\x92\x29\x85\x52\x29\x8d\xd2\x29\x83\x32\x29\x8b\xb2\x29\x87\x72\x29\x1f\x95\x81\xca\x48\x65\xa2\x32\x53\x7e\x2a\x0b\x95\x95\xca\x46\x65\xa7\x02\xa8\x40\x2a\x07\x95\x93\xca\x45\xe5\xa6\xf2\x50\x79\xa9\x7c\x54\x10\x95\x9f\x0a\xa6\x0a\x50\x21\x54\x28\x55\x90\x2a\x44\x15\xa6\x8a\x50\x45\xa9\x62\x54\x71\xaa\x04\x55\x92\x2a\x45\x95\xa6\xca\x50\x65\xa9\x72\x54\x79\xaa\x02\x55\x91\xaa\x44\x55\xa6\xaa\x50\x55\xa9\x6a\x54\x75\xaa\x06\x55\x93\xaa\x45\xd5\xa6\xea\x50\x75\xa9\x7a\x54\x7d\xaa\x01\xd5\x90\x6a\x44\x35\xa6\x9a\x50\x4d\xa9\x66\x54\x73\xaa\x05\xd5\x92\x6a\x45\xb5\xa6\xda\x50\x6d\xa9\x30\xaa\x1d\x15\x4e\x45\x50\x91\x54\x7b\xaa\x03\xd5\x91\x8a\xa2\x3a\x51\x9d\xa9\x2e\x54\x57\x2a\x9a\x8a\xa1\xba\x51\xdd\xa9\x58\x2a\x8e\x8a\xa7\x7a\x50\x3d\xa9\x5e\x54\x6f\xaa\x0f\xd5\x97\xea\x47\xf5\xa7\x06\x50\x03\xa9\x41\xd4\x60\x6a\x08\x35\x94\x1a\x46\x0d\xa7\x46\x50\x23\xa9\x51\xd4\x68\x6a\x0c\x35\x96\x1a\x47\x8d\xa7\x26\x50\x13\xa9\x49\xd4\x64\x6a\x0a\x35\x95\x9a\x46\x4d\xa7\x66\x50\x33\xa9\x59\xd4\x6c\x6a\x0e\x35\x97\x9a\x47\xcd\xa7\x16\x50\x0b\xa9\x45\xd4\x62\x6a\x09\xb5\x94\x5a\x46\x2d\xa7\x56\x50\x2b\xa9\x55\xd4\x6a\x6a\x0d\xb5\x96\x5a\x47\xad\xa7\x36\x50\x1b\xa9\x4d\xd4\x66\x6a\x0b\xb5\x95\xda\x46\x6d\xa7\x76\x50\x3b\xa9\x5d\xd4\x6e\x6a\x0f\xb5\x97\xda\x47\xed\xa7\x0e\x50\x1e\x75\x90\x3a\x44\x25\x50\x87\xa9\x23\xd4\x51\xea\x18\x75\x9c\x3a\x41\x9d\xa4\x4e\x51\xa7\xa9\x33\xd4\x59\xea\x1c\x75\x9e\xba\x40\x5d\xa4\x2e\x51\x97\xa9\x2b\xd4\x55\xea\x1a\x75\x9d\xba\x41\xdd\xa4\x6e\x51\xb7\xa9\x3b\xd4\x5d\xea\x1e\x75\x9f\x7a\x40\x3d\xa4\x1e\x51\x8f\xa9\x27\xd4\x53\xea\x19\xf5\x9c\x7a\x41\xbd\xa4\x5e\x51\xaf\xa9\x37\xd4\x5b\xea\x1d\xf5\x9e\xfa\x40\x7d\xa4\x3e\x51\x9f\xa9\x2f\xd4\x57\xea\x1b\xf5\x9d\xfa\x41\xfd\xa4\x12\xa9\x5f\xd4\x6f\xea\x0f\xf5\x97\x4a\xa2\x92\x69\xa0\x11\x1a\xa5\x31\x1a\xa7\x09\x9a\xa4\x29\x9a\xa6\x19\x9a\xa5\x39\x9a\xa7\x05\x5a\xa4\x25\x5a\xa6\x15\x5a\xa5\x35\x5a\xa7\x0d\xda\xa4\x2d\xda\xa6\x1d\xda\xa5\x7d\x74\x06\x3a\x23\x9d\x89\xce\x4c\xfb\xe9\x2c\x74\x56\x3a\x1b\x9d\x9d\x0e\xa0\x03\xe9\x1c\x74\x4e\x3a\x17\x9d\x9b\xce\x43\xe7\xa5\xf3\xd1\x41\x74\x7e\x3a\x98\x2e\x40\x87\xd0\xa1\x74\x41\xba\x10\x5d\x98\x2e\x42\x17\xa5\x8b\xd1\xc5\xe9\x12\x74\x49\xba\x14\x5d\x9a\x2e\x43\x97\xa5\xcb\xd1\xe5\xe9\x0a\x74\x45\xba\x12\x5d\x99\xae\x42\x57\xa5\xab\xd1\xd5\xe9\x1a\x74\x4d\xba\x16\x5d\x9b\xae\x43\xd7\xa5\xeb\xd1\xf5\xe9\x06\x74\x43\xba\x11\xdd\x98\x6e\x42\x37\xa5\x9b\xd1\xcd\xe9\x16\x74\x4b\xba\x15\xdd\x9a\x6e\x43\xb7\xa5\xc3\xe8\x76\x74\x38\x1d\x41\x47\xd2\xed\xe9\x0e\x74\x47\x3a\x8a\xee\x44\x77\xa6\xbb\xd0\x5d\xe9\x68\x3a\x86\xee\x46\x77\xa7\x63\xe9\x38\x3a\x9e\xee\x41\xf7\xa4\x7b\xd1\xbd\xe9\x3e\x74\x5f\xba\x1f\xdd\x9f\x1e\x40\x0f\xa4\x07\xd1\x83\xe9\x21\xf4\x50\x7a\x18\x3d\x9c\x1e\x41\x8f\xa4\x47\xd1\xa3\xe9\x31\xf4\x58\x7a\x1c\x3d\x9e\x9e\x40\x4f\xa4\x27\xd1\x93\xe9\x29\xf4\x54\x7a\x1a\x3d\x9d\x9e\x41\xcf\xa4\x67\xd1\xb3\xe9\x39\xf4\x5c\x7a\x1e\x3d\x9f\x5e\x40\x2f\xa4\x17\xd1\x8b\xe9\x25\xf4\x52\x7a\x19\xbd\x9c\x5e\x41\xaf\xa4\x57\xd1\xab\xe9\x35\xf4\x5a\x7a\x1d\xbd\x9e\xde\x40\x6f\xa4\x37\xd1\x9b\xe9\x2d\xf4\x56\x7a\x1b\xbd\x9d\xde\x41\xef\xa4\x77\xd1\xbb\xe9\x3d\xf4\x5e\x7a\x1f\xbd\x9f\x3e\x40\x7b\xf4\x41\xfa\x10\x9d\x40\x1f\xa6\x8f\xd0\x47\xe9\x63\xf4\x71\xfa\x04\x7d\x92\x3e\x45\x9f\xa6\xcf\xd0\x67\xe9\x73\xf4\x79\xfa\x02\x7d\x91\xbe\x44\x5f\xa6\xaf\xd0\x57\xe9\x6b\xf4\x75\xfa\x06\x7d\x93\xbe\x45\xdf\xa6\xef\xd0\x77\xe9\x7b\xf4\x7d\xfa\x01\xfd\x90\x7e\x44\x3f\xa6\x9f\xd0\x4f\xe9\x67\xf4\x73\xfa\x05\xfd\x92\x7e\x45\xbf\xa6\xdf\xd0\x6f\xe9\x77\xf4\x7b\xfa\x03\xfd\x91\xfe\x44\x7f\xa6\xbf\xd0\x5f\xe9\x6f\xf4\x77\xfa\x07\xfd\x93\x4e\xa4\x7f\xd1\xbf\xe9\x3f\xf4\x5f\x3a\x89\x4e\x66\x80\x41\x18\x94\xc1\x18\x9c\x21\x18\x92\xa1\x18\x9a\x61\x18\x96\xe1\x18\x9e\x11\x18\x91\x91\x18\x99\x51\x18\x95\xd1\x18\x9d\x31\x18\x93\xb1\x18\x9b\x71\x18\x97\xf1\x31\x19\x98\x8c\x4c\x26\x26\x33\xe3\x67\xb2\x30\x59\x99\x6c\x4c\x76\x26\x80\x09\x64\x72\x30\x39\x99\x5c\x4c\x6e\x26\x0f\x93\x97\xc9\xc7\x04\x31\xf9\x99\x60\xa6\x00\x13\xc2\x84\x32\x05\x99\x42\x4c\x61\xa6\x08\x53\x94\x29\xc6\x14\x67\x4a\x30\x25\x99\x52\x4c\x69\xa6\x0c\x53\x96\x29\xc7\x94\x67\x2a\x30\x15\x99\x4a\x4c\x65\xa6\x0a\x53\x95\xa9\xc6\x54\x67\x6a\x30\x35\x99\x5a\x4c\x6d\xa6\x0e\x53\x97\xa9\xc7\xd4\x67\x1a\x30\x0d\x99\x46\x4c\x63\xa6\x09\xd3\x94\x69\xc6\x34\x67\x5a\x30\x2d\x99\x56\x4c\x6b\xa6\x0d\xd3\x96\x09\x63\xda\x31\xe1\x4c\x04\x13\xc9\xb4\x67\x3a\x30\x1d\x99\x28\xa6\x13\xd3\x99\xe9\xc2\x74\x65\xa2\x99\x18\xa6\x1b\xd3\x9d\x89\x65\xe2\x98\x78\xa6\x07\xd3\x93\xe9\xc5\xf4\x66\xfa\x30\x7d\x99\x7e\x4c\x7f\x66\x00\x33\x90\x19\xc4\x0c\x66\x86\x30\x43\x99\x61\xcc\x70\x66\x04\x33\x92\x19\xc5\x8c\x66\xc6\x30\x63\x99\x71\xcc\x78\x66\x02\x33\x91\x99\xc4\x4c\x66\xa6\x30\x53\x99\x69\xcc\x74\x66\x06\x33\x93\x99\xc5\xcc\x66\xe6\x30\x73\x99\x79\xcc\x7c\x66\x01\xb3\x90\x59\xc4\x2c\x66\x96\x30\x4b\x99\x65\xcc\x72\x66\x05\xb3\x92\x59\xc5\xac\x66\xd6\x30\x6b\x99\x75\xcc\x7a\x66\x03\xb3\x91\xd9\xc4\x6c\x66\xb6\x30\x5b\x99\x6d\xcc\x76\x66\x07\xb3\x93\xd9\xc5\xec\x66\xf6\x30\x7b\x99\x7d\xcc\x7e\xe6\x00\xe3\x31\x07\x99\x43\x4c\x02\x73\x98\x39\xc2\x1c\x65\x8e\x31\xc7\x99\x13\xcc\x49\xe6\x14\x73\x9a\x39\xc3\x9c\x65\xce\x31\xe7\x99\x0b\xcc\x45\xe6\x12\x73\x99\xb9\xc2\x5c\x65\xae\x31\xd7\x99\x1b\xcc\x4d\xe6\x16\x73\x9b\xb9\xc3\xdc\x65\xee\x31\xf7\x99\x07\xcc\x43\xe6\x11\xf3\x98\x79\xc2\x3c\x65\x9e\x31\xcf\x99\x17\xcc\x4b\xe6\x15\xf3\x9a\x79\xc3\xbc\x65\xde\x31\xef\x99\x0f\xcc\x47\xe6\x13\xf3\x99\xf9\xc2\x7c\x65\xbe\x31\xdf\x99\x1f\xcc\x4f\x26\x91\xf9\xc5\xfc\x66\xfe\x30\x7f\x99\x24\x26\x99\x05\x16\x61\x51\x16\x63\x71\x96\x60\x49\x96\x62\x69\x96\x61\x59\x96\x63\x79\x56\x60\x45\x56\x62\x65\x56\x61\x55\x56\x63\x75\xd6\x60\x4d\xd6\x62\x6d\xd6\x61\x5d\xd6\xc7\x66\x60\x33\xb2\x99\xd8\xcc\xac\x9f\xcd\xc2\x66\x65\xb3\xb1\xd9\xd9\x00\x36\x90\xcd\xc1\xe6\x64\x73\xb1\xb9\xd9\x3c\x6c\x5e\x36\x1f\x1b\xc4\xe6\x67\x83\xd9\x02\x6c\x08\x1b\xca\x16\x64\x0b\xb1\x85\xd9\x22\x6c\x51\xb6\x18\x5b\x9c\x2d\xc1\x96\x64\x4b\xb1\xa5\xd9\x32\x6c\x59\xb6\x1c\x5b\x9e\xad\xc0\x56\x64\x2b\xb1\x95\xd9\x2a\x6c\x55\xb6\x1a\x5b\x9d\xad\xc1\xd6\x64\x6b\xb1\xb5\xd9\x3a\x6c\x5d\xb6\x1e\x5b\x9f\x6d\xc0\x36\x64\x1b\xb1\x8d\xd9\x26\x6c\x53\xb6\x19\xdb\x9c\x6d\xc1\xb6\x64\x5b\xb1\xad\xd9\x36\x6c\x5b\x36\x8c\x6d\xc7\x86\xb3\x11\x6c\x24\xdb\x9e\xed\xc0\x76\x64\xa3\xd8\x4e\x6c\x67\xb6\x0b\xdb\x95\x8d\x66\x63\xd8\x6e\x6c\x77\x36\x96\x8d\x63\xe3\xd9\x1e\x6c\x4f\xb6\x17\xdb\x9b\xed\xc3\xf6\x65\xfb\xb1\xfd\xd9\x01\xec\x40\x76\x10\x3b\x98\x1d\xc2\x0e\x65\x87\xb1\xc3\xd9\x11\xec\x48\x76\x14\x3b\x9a\x1d\xc3\x8e\x65\xc7\xb1\xe3\xd9\x09\xec\x44\x76\x12\x3b\x99\x9d\xc2\x4e\x65\xa7\xb1\xd3\xd9\x19\xec\x4c\x76\x16\x3b\x9b\x9d\xc3\xce\x65\xe7\xb1\xf3\xd9\x05\xec\x42\x76\x11\xbb\x98\x5d\xc2\x2e\x65\x97\xb1\xcb\xd9\x15\xec\x4a\x76\x15\xbb\x9a\x5d\xc3\xae\x65\xd7\xb1\xeb\xd9\x0d\xec\x46\x76\x13\xbb\x99\xdd\xc2\x6e\x65\xb7\xb1\xdb\xd9\x1d\xec\x4e\x76\x17\xbb\x9b\xdd\xc3\xee\x65\xf7\xb1\xfb\xd9\x03\xac\xc7\x1e\x64\x0f\xb1\x09\xec\x61\xf6\x08\x7b\x94\x3d\xc6\x1e\x67\x4f\xb0\x27\xd9\x53\xec\x69\xf6\x0c\x7b\x96\x3d\xc7\x9e\x67\x2f\xb0\x17\xd9\x4b\xec\x65\xf6\x0a\x7b\x95\xbd\xc6\x5e\x67\x6f\xb0\x37\xd9\x5b\xec\x6d\xf6\x0e\x7b\x97\xbd\xc7\xde\x67\x1f\xb0\x0f\xd9\x47\xec\x63\xf6\x09\xfb\x94\x7d\xc6\x3e\x67\x5f\xb0\x2f\xd9\x57\xec\x6b\xf6\x0d\xfb\x96\x7d\xc7\xbe\x67\x3f\xb0\x1f\xd9\x4f\xec\x67\xf6\x0b\xfb\x95\xfd\xc6\x7e\x67\x7f\xb0\x3f\xd9\x44\xf6\x17\xfb\x9b\xfd\xc3\xfe\x65\x93\xd8\x64\x0e\x38\x84\x43\x39\x8c\xc3\x39\x82\x23\x39\x8a\xa3\x39\x86\x63\x39\x8e\xe3\x39\x81\x13\x39\x89\x93\x39\x85\x53\x39\x8d\xd3\x39\x83\x33\x39\x8b\xb3\x39\x87\x73\x39\x1f\x97\x81\xcb\xc8\x65\xe2\x32\x73\x7e\x2e\x0b\x97\x95\xcb\xc6\x65\xe7\x02\xb8\x40\x2e\x07\x97\x93\xcb\xc5\xe5\xe6\xf2\x70\x79\xb9\x7c\x5c\x10\x97\x9f\x0b\xe6\x0a\x70\x21\x5c\x28\x57\x90\x2b\xc4\x15\xe6\x8a\x70\x45\xb9\x62\x5c\x71\xae\x04\x57\x92\x2b\xc5\x95\xe6\xca\x70\x65\xb9\x72\x5c\x79\xae\x02\x57\x91\xab\xc4\x55\xe6\xaa\x70\x55\xb9\x6a\x5c\x75\xae\x06\x57\x93\xab\xc5\xd5\xe6\xea\x70\x75\xb9\x7a\x5c\x7d\xae\x01\xd7\x90\x6b\xc4\x35\xe6\x9a\x70\x4d\xb9\x66\x5c\x73\xae\x05\xd7\x92\x6b\xc5\xb5\xe6\xda\x70\x6d\xb9\x30\xae\x1d\x17\xce\x45\x70\x91\x5c\x7b\xae\x03\xd7\x91\x8b\xe2\x3a\x71\x9d\xb9\x2e\x5c\x57\x2e\x9a\x8b\xe1\xba\x71\xdd\xb9\x58\x2e\x8e\x8b\xe7\x7a\x70\x3d\xb9\x5e\x5c\x6f\xae\x0f\xd7\x97\xeb\xc7\xf5\xe7\x06\x70\x03\xb9\x41\xdc\x60\x6e\x08\x37\x94\x1b\xc6\x0d\xe7\x46\x70\x23\xb9\x51\xdc\x68\x6e\x0c\x37\x96\x1b\xc7\x8d\xe7\x26\x70\x13\xb9\x49\xdc\x64\x6e\x0a\x37\x95\x9b\xc6\x4d\xe7\x66\x70\x33\xb9\x59\xdc\x6c\x6e\x0e\x37\x97\x9b\xc7\xcd\xe7\x16\x70\x0b\xb9\x45\xdc\x62\x6e\x09\xb7\x94\x5b\xc6\x2d\xe7\x56\x70\x2b\xb9\x55\xdc\x6a\x6e\x0d\xb7\x96\x5b\xc7\xad\xe7\x36\x70\x1b\xb9\x4d\xdc\x66\x6e\x0b\xb7\x95\xdb\xc6\x6d\xe7\x76\x70\x3b\xb9\x5d\xdc\x6e\x6e\x0f\xb7\x97\xdb\xc7\xed\xe7\x0e\x70\x1e\x77\x90\x3b\xc4\x25\x70\x87\xb9\x23\xdc\x51\xee\x18\x77\x9c\x3b\xc1\x9d\xe4\x4e\x71\xa7\xb9\x33\xdc\x59\xee\x1c\x77\x9e\xbb\xc0\x5d\xe4\x2e\x71\x97\xb9\x2b\xdc\x55\xee\x1a\x77\x9d\xbb\xc1\xdd\xe4\x6e\x71\xb7\xb9\x3b\xdc\x5d\xee\x1e\x77\x9f\x7b\xc0\x3d\xe4\x1e\x71\x8f\xb9\x27\xdc\x53\xee\x19\xf7\x9c\x7b\xc1\xbd\xe4\x5e\x71\xaf\xb9\x37\xdc\x5b\xee\x1d\xf7\x9e\xfb\xc0\x7d\xe4\x3e\x71\x9f\xb9\x2f\xdc\x57\xee\x1b\xf7\x9d\xfb\xc1\xfd\xe4\x12\xb9\x5f\xdc\x6f\xee\x0f\xf7\x97\x4b\xe2\x92\x79\xe0\x11\x1e\xe5\x31\x1e\xe7\x09\x9e\xe4\x29\x9e\xe6\x19\x9e\xe5\x39\x9e\xe7\x05\x5e\xe4\x25\x5e\xe6\x15\x5e\xe5\x35\x5e\xe7\x0d\xde\xe4\x2d\xde\xe6\x1d\xde\xe5\x7d\x7c\x06\x3e\x23\x9f\x89\xcf\xcc\xfb\xf9\x2c\x7c\x56\x3e\x1b\x9f\x9d\x0f\xe0\x03\xf9\x1c\x7c\x4e\x3e\x17\x9f\x9b\xcf\xc3\xe7\xe5\xf3\xf1\x41\x7c\x7e\x3e\x98\x2f\xc0\x87\xf0\xa1\x7c\x41\xbe\x10\x5f\x98\x2f\xc2\x17\xe5\x8b\xf1\xc5\xf9\x12\x7c\x49\xbe\x14\x5f\x9a\x2f\xc3\x97\xe5\xcb\xf1\xe5\xf9\x0a\x7c\x45\xbe\x12\x5f\x99\xaf\xc2\x57\xe5\xab\xf1\xd5\xf9\x1a\x7c\x4d\xbe\x16\x5f\x9b\xaf\xc3\xd7\xe5\xeb\xf1\xf5\xf9\x06\x7c\x43\xbe\x11\xdf\x98\x6f\xc2\x37\xe5\x9b\xf1\xcd\xf9\x16\x7c\x4b\xbe\x15\xdf\x9a\x6f\xc3\xb7\xe5\xc3\xf8\x76\x7c\x38\x1f\xc1\x47\xf2\xed\xf9\x0e\x7c\x47\x3e\x8a\xef\xc4\x77\xe6\xbb\xf0\x5d\xf9\x68\x3e\x86\xef\xc6\x77\xe7\x63\xf9\x38\x3e\x9e\xef\xc1\xf7\xe4\x7b\xf1\xbd\xf9\x3e\x7c\x5f\xbe\x1f\xdf\x9f\x1f\xc0\x0f\xe4\x07\xf1\x83\xf9\x21\xfc\x50\x7e\x18\x3f\x9c\x1f\xc1\x8f\xe4\x47\xf1\xa3\xf9\x31\xfc\x58\x7e\x1c\x3f\x9e\x9f\xc0\x4f\xe4\x27\xf1\x93\xf9\x29\xfc\x54\x7e\x1a\x3f\x9d\x9f\xc1\xcf\xe4\x67\xf1\xb3\xf9\x39\xfc\x5c\x7e\x1e\x3f\x9f\x5f\xc0\x2f\xe4\x17\xf1\x8b\xf9\x25\xfc\x52\x7e\x19\xbf\x9c\x5f\xc1\xaf\xe4\x57\xf1\xab\xf9\x35\xfc\x5a\x7e\x1d\xbf\x9e\xdf\xc0\x6f\xe4\x37\xf1\x9b\xf9\x2d\xfc\x56\x7e\x1b\xbf\x9d\xdf\xc1\xef\xe4\x77\xf1\xbb\xf9\x3d\xfc\x5e\x7e\x1f\xbf\x9f\x3f\xc0\x7b\xfc\x41\xfe\x10\x9f\xc0\x1f\xe6\x8f\xf0\x47\xf9\x63\xfc\x71\xfe\x04\x7f\x92\x3f\xc5\x9f\xe6\xcf\xf0\x67\xf9\x73\xfc\x79\xfe\x02\x7f\x91\xbf\xc4\x5f\xe6\xaf\xf0\x57\xf9\x6b\xfc\x75\xfe\x06\x7f\x93\xbf\xc5\xdf\xe6\xef\xf0\x77\xf9\x7b\xfc\x7d\xfe\x01\xff\x90\x7f\xc4\x3f\xe6\x9f\xf0\x4f\xf9\x67\xfc\x73\xfe\x05\xff\x92\x7f\xc5\xbf\xe6\xdf\xf0\x6f\xf9\x77\xfc\x7b\xfe\x03\xff\x91\xff\xc4\x7f\xe6\xbf\xf0\x5f\xf9\x6f\xfc\x77\xfe\x07\xff\x93\x4f\xe4\x7f\xf1\xbf\xf9\x3f\xfc\x5f\x3e\x89\x4f\x16\x40\x40\x04\x54\xc0\x04\x5c\x20\x04\x52\xa0\x04\x5a\x60\x04\x56\xe0\x04\x5e\x10\x04\x51\x90\x04\x59\x50\x04\x55\xd0\x04\x5d\x30\x04\x53\xb0\x04\x5b\x70\x04\x57\xf0\x09\x19\x84\x8c\x42\x26\x21\xb3\xe0\x17\xb2\x08\x59\x85\x6c\x42\x76\x21\x40\x08\x14\x72\x08\x39\x85\x5c\x42\x6e\x21\x8f\x90\x57\xc8\x27\x04\x09\xf9\x85\x60\xa1\x80\x10\x22\x84\x0a\x05\x85\x42\x42\x61\xa1\x88\x50\x54\x28\x26\x14\x17\x4a\x08\x25\x85\x52\x42\x69\xa1\x8c\x50\x56\x28\x27\x94\x17\x2a\x08\x15\x85\x4a\x42\x65\xa1\x8a\x50\x55\xa8\x26\x54\x17\x6a\x08\x35\x85\x5a\x42\x6d\xa1\x8e\x50\x57\xa8\x27\xd4\x17\x1a\x08\x0d\x85\x46\x42\x63\xa1\x89\xd0\x54\x68\x26\x34\x17\x5a\x08\x2d\x85\x56\x42\x6b\xa1\x8d\xd0\x56\x08\x13\xda\x09\xe1\x42\x84\x10\x29\xb4\x17\x3a\x08\x1d\x85\x28\xa1\x93\xd0\x59\xe8\x22\x74\x15\xa2\x85\x18\xa1\x9b\xd0\x5d\x88\x15\xe2\x84\x78\xa1\x87\xd0\x53\xe8\x25\xf4\x16\xfa\x08\x7d\x85\x7e\x42\x7f\x61\x80\x30\x50\x18\x24\x0c\x16\x86\x08\x43\x85\x61\xc2\x70\x61\x84\x30\x52\x18\x25\x8c\x16\xc6\x08\x63\x85\x71\xc2\x78\x61\x82\x30\x51\x98\x24\x4c\x16\xa6\x08\x53\x85\x69\xc2\x74\x61\x86\x30\x53\x98\x25\xcc\x16\xe6\x08\x73\x85\x79\xc2\x7c\x61\x81\xb0\x50\x58\x24\x2c\x16\x96\x08\x4b\x85\x65\xc2\x72\x61\x85\xb0\x52\x58\x25\xac\x16\xd6\x08\x6b\x85\x75\xc2\x7a\x61\x83\xb0\x51\xd8\x24\x6c\x16\xb6\x08\x5b\x85\x6d\xc2\x76\x61\x87\xb0\x53\xd8\x25\xec\x16\xf6\x08\x7b\x85\x7d\xc2\x7e\xe1\x80\xe0\x09\x07\x85\x43\x42\x82\x70\x58\x38\x22\x1c\x15\x8e\x09\xc7\x85\x13\xc2\x49\xe1\x94\x70\x5a\x38\x23\x9c\x15\xce\x09\xe7\x85\x0b\xc2\x45\xe1\x92\x70\x59\xb8\x22\x5c\x15\xae\x09\xd7\x85\x1b\xc2\x4d\xe1\x96\x70\x5b\xb8\x23\xdc\x15\xee\x09\xf7\x85\x07\xc2\x43\xe1\x91\xf0\x58\x78\x22\x3c\x15\x9e\x09\xcf\x85\x17\xc2\x4b\xe1\x95\xf0\x5a\x78\x23\xbc\x15\xde\x09\xef\x85\x0f\xc2\x47\xe1\x93\xf0\x59\xf8\x22\x7c\x15\xbe\x09\xdf\x85\x1f\xc2\x4f\x21\x51\xf8\x25\xfc\x16\xfe\x08\x7f\x85\x24\x21\x59\x04\x11\x11\x51\x11\x13\x71\x91\x10\x49\x91\x12\x69\x91\x11\x59\x91\x13\x79\x51\x10\x45\x51\x12\x65\x51\x11\x55\x51\x13\x75\xd1\x10\x4d\xd1\x12\x6d\xd1\x11\x5d\xd1\x27\x66\x10\x33\x8a\x99\xc4\xcc\xa2\x5f\xcc\x22\x66\x15\xb3\x89\xd9\xc5\x00\x31\x50\xcc\x21\xe6\x14\x73\x89\xb9\xc5\x3c\x62\x5e\x31\x9f\x18\x24\xe6\x17\x83\xc5\x02\x62\x88\x18\x2a\x16\x14\x0b\x89\x85\xc5\x22\x62\x51\xb1\x98\x58\x5c\x2c\x21\x96\x14\x4b\x89\xa5\xc5\x32\x62\x59\xb1\x9c\x58\x5e\xac\x20\x56\x14\x2b\x89\x95\xc5\x2a\x62\x55\xb1\x9a\x58\x5d\xac\x21\xd6\x14\x6b\x89\xb5\xc5\x3a\x62\x5d\xb1\x9e\x58\x5f\x6c\x20\x36\x14\x1b\x89\x8d\xc5\x26\x62\x53\xb1\x99\xd8\x5c\x6c\x21\xb6\x14\x5b\x89\xad\xc5\x36\x62\x5b\x31\x4c\x6c\x27\x86\x8b\x11\x62\xa4\xd8\x5e\xec\x20\x76\x14\xa3\xc4\x4e\x62\x67\xb1\x8b\xd8\x55\x8c\x16\x63\xc4\x6e\x62\x77\x31\x56\x8c\x13\xe3\xc5\x1e\x62\x4f\xb1\x97\xd8\x5b\xec\x23\xf6\x15\xfb\x89\xfd\xc5\x01\xe2\x40\x71\x90\x38\x58\x1c\x22\x0e\x15\x87\x89\xc3\xc5\x11\xe2\x48\x71\x94\x38\x5a\x1c\x23\x8e\x15\xc7\x89\xe3\xc5\x09\xe2\x44\x71\x92\x38\x59\x9c\x22\x4e\x15\xa7\x89\xd3\xc5\x19\xe2\x4c\x71\x96\x38\x5b\x9c\x23\xce\x15\xe7\x89\xf3\xc5\x05\xe2\x42\x71\x91\xb8\x58\x5c\x22\x2e\x15\x97\x89\xcb\xc5\x15\xe2\x4a\x71\x95\xb8\x5a\x5c\x23\xae\x15\xd7\x89\xeb\xc5\x0d\xe2\x46\x71\x93\xb8\x59\xdc\x22\x6e\x15\xb7\x89\xdb\xc5\x1d\xe2\x4e\x71\x97\xb8\x5b\xdc\x23\xee\x15\xf7\x89\xfb\xc5\x03\xa2\x27\x1e\x14\x0f\x89\x09\xe2\x61\xf1\x88\x78\x54\x3c\x26\x1e\x17\x4f\x88\x27\xc5\x53\xe2\x69\xf1\x8c\x78\x56\x3c\x27\x9e\x17\x2f\x88\x17\xc5\x4b\xe2\x65\xf1\x8a\x78\x55\xbc\x26\x5e\x17\x6f\x88\x37\xc5\x5b\xe2\x6d\xf1\x8e\x78\x57\xbc\x27\xde\x17\x1f\x88\x0f\xc5\x47\xe2\x63\xf1\x89\xf8\x54\x7c\x26\x3e\x17\x5f\x88\x2f\xc5\x57\xe2\x6b\xf1\x8d\xf8\x56\x7c\x27\xbe\x17\x3f\x88\x1f\xc5\x4f\xe2\x67\xf1\x8b\xf8\x55\xfc\x26\x7e\x17\x7f\x88\x3f\xc5\x44\xf1\x97\xf8\x5b\xfc\x23\xfe\x15\x93\xc4\x64\x09\x24\x44\x42\x25\x4c\xc2\x25\x42\x22\x25\x4a\xa2\x25\x46\x62\x25\x4e\xe2\x25\x41\x12\x25\x49\x92\x25\x45\x52\x25\x4d\xd2\x25\x43\x32\x25\x4b\xb2\x25\x47\x72\x25\x9f\x94\x41\xca\x28\x65\x92\x32\x4b\x7e\x29\x8b\x94\x55\xca\x26\x65\x97\x02\xa4\x40\x29\x87\x94\x53\xca\x25\xe5\x96\xf2\x48\x79\xa5\x7c\x52\x90\x94\x5f\x0a\x96\x0a\x48\x21\x52\xa8\x54\x50\x2a\x24\x15\x96\x8a\x48\x45\xa5\x62\x52\x71\xa9\x84\x54\x52\x2a\x25\x95\x96\xca\x48\x65\xa5\x72\x52\x79\xa9\x82\x54\x51\xaa\x24\x55\x96\xaa\x48\x55\xa5\x6a\x52\x75\xa9\x86\x54\x53\xaa\x25\xd5\x96\xea\x48\x75\xa5\x7a\x52\x7d\xa9\x81\xd4\x50\x6a\x24\x35\x96\x9a\x48\x4d\xa5\x66\x52\x73\xa9\x85\xd4\x52\x6a\x25\xb5\x96\xda\x48\x6d\xa5\x30\xa9\x9d\x14\x2e\x45\x48\x91\x52\x7b\xa9\x83\xd4\x51\x8a\x92\x3a\x49\x9d\xa5\x2e\x52\x57\x29\x5a\x8a\x91\xba\x49\xdd\xa5\x58\x29\x4e\x8a\x97\x7a\x48\x3d\xa5\x5e\x52\x6f\xa9\x8f\xd4\x57\xea\x27\xf5\x97\x06\x48\x03\xa5\x41\xd2\x60\x69\x88\x34\x54\x1a\x26\x0d\x97\x46\x48\x23\xa5\x51\xd2\x68\x69\x8c\x34\x56\x1a\x27\x8d\x97\x26\x48\x13\xa5\x49\xd2\x64\x69\x8a\x34\x55\x9a\x26\x4d\x97\x66\x48\x33\xa5\x59\xd2\x6c\x69\x8e\x34\x57\x9a\x27\xcd\x97\x16\x48\x0b\xa5\x45\xd2\x62\x69\x89\xb4\x54\x5a\x26\x2d\x97\x56\x48\x2b\xa5\x55\xd2\x6a\x69\x8d\xb4\x56\x5a\x27\xad\x97\x36\x48\x1b\xa5\x4d\xd2\x66\x69\x8b\xb4\x55\xda\x26\x6d\x97\x76\x48\x3b\xa5\x5d\xd2\x6e\x69\x8f\xb4\x57\xda\x27\xed\x97\x0e\x48\x9e\x74\x50\x3a\x24\x25\x48\x87\xa5\x23\xd2\x51\xe9\x98\x74\x5c\x3a\x21\x9d\x94\x4e\x49\xa7\xa5\x33\xd2\x59\xe9\x9c\x74\x5e\xba\x20\x5d\x94\x2e\x49\x97\xa5\x2b\xd2\x55\xe9\x9a\x74\x5d\xba\x21\xdd\x94\x6e\x49\xb7\xa5\x3b\xd2\x5d\xe9\x9e\x74\x5f\x7a\x20\x3d\x94\x1e\x49\x8f\xa5\x27\xd2\x53\xe9\x99\xf4\x5c\x7a\x21\xbd\x94\x5e\x49\xaf\xa5\x37\xd2\x5b\xe9\x9d\xf4\x5e\xfa\x20\x7d\x94\x3e\x49\x9f\xa5\x2f\xd2\x57\xe9\x9b\xf4\x5d\xfa\x21\xfd\x94\x12\xa5\x5f\xd2\x6f\xe9\x8f\xf4\x57\x4a\x92\x92\x65\x90\x11\x19\x95\x31\x19\x97\x09\x99\x94\x29\x99\x96\x19\x99\x95\x39\x99\x97\x05\x59\x94\x25\x59\x96\x15\x59\x95\x35\x59\x97\x0d\xd9\x94\x2d\xd9\x96\x1d\xd9\x95\x7d\x72\x06\x39\xa3\x9c\x49\xce\x2c\xfb\xe5\x2c\x72\x56\x39\x9b\x9c\x5d\x0e\x90\x03\xe5\x1c\x72\x4e\x39\x97\x9c\x5b\xce\x23\xe7\x95\xf3\xc9\x41\x72\x7e\x39\x58\x2e\x20\x87\xc8\xa1\x72\x41\xb9\x90\x5c\x58\x2e\x22\x17\x95\x8b\xc9\xc5\xe5\x12\x72\x49\xb9\x94\x5c\x5a\x2e\x23\x97\x95\xcb\xc9\xe5\xe5\x0a\x72\x45\xb9\x92\x5c\x59\xae\x22\x57\x95\xab\xc9\xd5\xe5\x1a\x72\x4d\xb9\x96\x5c\x5b\xae\x23\xd7\x95\xeb\xc9\xf5\xe5\x06\x72\x43\xb9\x91\xdc\x58\x6e\x22\x37\x95\x9b\xc9\xcd\xe5\x16\x72\x4b\xb9\x95\xdc\x5a\x6e\x23\xb7\x95\xc3\xe4\x76\x72\xb8\x1c\x21\x47\xca\xed\xe5\x0e\x72\x47\x39\x4a\xee\x24\x77\x96\xbb\xc8\x5d\xe5\x68\x39\x46\xee\x26\x77\x97\x63\xe5\x38\x39\x5e\xee\x21\xf7\x94\x7b\xc9\xbd\xe5\x3e\x72\x5f\xb9\x9f\xdc\x5f\x1e\x20\x0f\x94\x07\xc9\x83\xe5\x21\xf2\x50\x79\x98\x3c\x5c\x1e\x21\x8f\x94\x47\xc9\xa3\xe5\x31\xf2\x58\x79\x9c\x3c\x5e\x9e\x20\x4f\x94\x27\xc9\x93\xe5\x29\xf2\x54\x79\x9a\x3c\x5d\x9e\x21\xcf\x94\x67\xc9\xb3\xe5\x39\xf2\x5c\x79\x9e\x3c\x5f\x5e\x20\x2f\x94\x17\xc9\x8b\xe5\x25\xf2\x52\x79\x99\xbc\x5c\x5e\x21\xaf\x94\x57\xc9\xab\xe5\x35\xf2\x5a\x79\x9d\xbc\x5e\xde\x20\x6f\x94\x37\xc9\x9b\xe5\x2d\xf2\x56\x79\x9b\xbc\x5d\xde\x21\xef\x94\x77\xc9\xbb\xe5\x3d\xf2\x5e\x79\x9f\xbc\x5f\x3e\x20\x7b\xf2\x41\xf9\x90\x9c\x20\x1f\x96\x8f\xc8\x47\xe5\x63\xf2\x71\xf9\x84\x7c\x52\x3e\x25\x9f\x96\xcf\xc8\x67\xe5\x73\xf2\x79\xf9\x82\x7c\x51\xbe\x24\x5f\x96\xaf\xc8\x57\xe5\x6b\xf2\x75\xf9\x86\x7c\x53\xbe\x25\xdf\x96\xef\xc8\x77\xe5\x7b\xf2\x7d\xf9\x81\xfc\x50\x7e\x24\x3f\x96\x9f\xc8\x4f\xe5\x67\xf2\x73\xf9\x85\xfc\x52\x7e\x25\xbf\x96\xdf\xc8\x6f\xe5\x77\xf2\x7b\xf9\x83\xfc\x51\xfe\x24\x7f\x96\xbf\xc8\x5f\xe5\x6f\xf2\x77\xf9\x87\xfc\x53\x4e\x94\x7f\xc9\xbf\xe5\x3f\xf2\x5f\x39\x49\x4e\x56\x40\x41\x14\x54\xc1\x14\x5c\x21\x14\x52\xa1\x14\x5a\x61\x14\x56\xe1\x14\x5e\x11\x14\x51\x91\x14\x59\x51\x14\x55\xd1\x14\x5d\x31\x14\x53\xb1\x14\x5b\x71\x14\x57\xf1\x29\x19\x94\x8c\x4a\x26\x25\xb3\xe2\x57\xb2\x28\x59\x95\x6c\x4a\x76\x25\x40\x09\x54\x72\x28\x39\x95\x5c\x4a\x6e\x25\x8f\x92\x57\xc9\xa7\x04\x29\xf9\x95\x60\xa5\x80\x12\xa2\x84\x2a\x05\x95\x42\x4a\x61\xa5\x88\x52\x54\x29\xa6\x14\x57\x4a\x28\x25\x95\x52\x4a\x69\xa5\x8c\x52\x56\x29\xa7\x94\x57\x2a\x28\x15\x95\x4a\x4a\x65\xa5\x8a\x52\x55\xa9\xa6\x54\x57\x6a\x28\x35\x95\x5a\x4a\x6d\xa5\x8e\x52\x57\xa9\xa7\xd4\x57\x1a\x28\x0d\x95\x46\x4a\x63\xa5\x89\xd2\x54\x69\xa6\x34\x57\x5a\x28\x2d\x95\x56\x4a\x6b\xa5\x8d\xd2\x56\x09\x53\xda\x29\xe1\x4a\x84\x12\xa9\xb4\x57\x3a\x28\x1d\x95\x28\xa5\x93\xd2\x59\xe9\xa2\x74\x55\xa2\x95\x18\xa5\x9b\xd2\x5d\x89\x55\xe2\x94\x78\xa5\x87\xd2\x53\xe9\xa5\xf4\x56\xfa\x28\x7d\x95\x7e\x4a\x7f\x65\x80\x32\x50\x19\xa4\x0c\x56\x86\x28\x43\x95\x61\xca\x70\x65\x84\x32\x52\x19\xa5\x8c\x56\xc6\x28\x63\x95\x71\xca\x78\x65\x82\x32\x51\x99\xa4\x4c\x56\xa6\x28\x53\x95\x69\xca\x74\x65\x86\x32\x53\x99\xa5\xcc\x56\xe6\x28\x73\x95\x79\xca\x7c\x65\x81\xb2\x50\x59\xa4\x2c\x56\x96\x28\x4b\x95\x65\xca\x72\x65\x85\xb2\x52\x59\xa5\xac\x56\xd6\x28\x6b\x95\x75\xca\x7a\x65\x83\xb2\x51\xd9\xa4\x6c\x56\xb6\x28\x5b\x95\x6d\xca\x76\x65\x87\xb2\x53\xd9\xa5\xec\x56\xf6\x28\x7b\x95\x7d\xca\x7e\xe5\x80\xe2\x29\x07\x95\x43\x4a\x82\x72\x58\x39\xa2\x1c\x55\x8e\x29\xc7\x95\x13\xca\x49\xe5\x94\x72\x5a\x39\xa3\x9c\x55\xce\x29\xe7\x95\x0b\xca\x45\xe5\x92\x72\x59\xb9\xa2\x5c\x55\xae\x29\xd7\x95\x1b\xca\x4d\xe5\x96\x72\x5b\xb9\xa3\xdc\x55\xee\x29\xf7\x95\x07\xca\x43\xe5\x91\xf2\x58\x79\xa2\x3c\x55\x9e\x29\xcf\x95\x17\xca\x4b\xe5\x95\xf2\x5a\x79\xa3\xbc\x55\xde\x29\xef\x95\x0f\xca\x47\xe5\x93\xf2\x59\xf9\xa2\x7c\x55\xbe\x29\xdf\x95\x1f\xca\x4f\x25\x51\xf9\xa5\xfc\x56\xfe\x28\x7f\x95\x24\x25\x59\x05\x15\x51\x51\x15\x53\x71\x95\x50\x49\x95\x52\x69\x95\x51\x59\x95\x53\x79\x55\x50\x45\x55\x52\x65\x55\x51\x55\x55\x53\x75\xd5\x50\x4d\xd5\x52\x6d\xd5\x51\x5d\xd5\xa7\x66\x50\x33\xaa\x99\xd4\xcc\xaa\x5f\xcd\xa2\x66\x55\xb3\xa9\xd9\xd5\x00\x35\x50\xcd\xa1\xe6\x54\x73\xa9\xb9\xd5\x3c\x6a\x5e\x35\x9f\x1a\xa4\xe6\x57\x83\xd5\x02\x6a\x88\x1a\xaa\x16\x54\x0b\xa9\x85\xd5\x22\x6a\x51\xb5\x98\x5a\x5c\x2d\xa1\x96\x54\x4b\xa9\xa5\xd5\x32\x6a\x59\xb5\x9c\x5a\x5e\xad\xa0\x56\x54\x2b\xa9\x95\xd5\x2a\x6a\x55\xb5\x9a\x5a\x5d\xad\xa1\xd6\x54\x6b\xa9\xb5\xd5\x3a\x6a\x5d\xb5\x9e\x5a\x5f\x6d\xa0\x36\x54\x1b\xa9\x8d\xd5\x26\x6a\x53\xb5\x99\xda\x5c\x6d\xa1\xb6\x54\x5b\xa9\xad\xd5\x36\x6a\x5b\x35\x4c\x6d\xa7\x86\xab\x11\x6a\xa4\xda\x5e\xed\xa0\x76\x54\xa3\xd4\x4e\x6a\x67\xb5\x8b\xda\x55\x8d\x56\x63\xd4\x6e\x6a\x77\x35\x56\x8d\x53\xe3\xd5\x1e\x6a\x4f\xb5\x97\xda\x5b\xed\xa3\xf6\x55\xfb\xa9\xfd\xd5\x01\xea\x40\x75\x90\x3a\x58\x1d\xa2\x0e\x55\x87\xa9\xc3\xd5\x11\xea\x48\x75\x94\x3a\x5a\x1d\xa3\x8e\x55\xc7\xa9\xe3\xd5\x09\xea\x44\x75\x92\x3a\x59\x9d\xa2\x4e\x55\xa7\xa9\xd3\xd5\x19\xea\x4c\x75\x96\x3a\x5b\x9d\xa3\xce\x55\xe7\xa9\xf3\xd5\x05\xea\x42\x75\x91\xba\x58\x5d\xa2\x2e\x55\x97\xa9\xcb\xd5\x15\xea\x4a\x75\x95\xba\x5a\x5d\xa3\xae\x55\xd7\xa9\xeb\xd5\x0d\xea\x46\x75\x93\xba\x59\xdd\xa2\x6e\x55\xb7\xa9\xdb\xd5\x1d\xea\x4e\x75\x97\xba\x5b\xdd\xa3\xee\x55\xf7\xa9\xfb\xd5\x03\xaa\xa7\x1e\x54\x0f\xa9\x09\xea\x61\xf5\x88\x7a\x54\x3d\xa6\x1e\x57\x4f\xa8\x27\xd5\x53\xea\x69\xf5\x8c\x7a\x56\x3d\xa7\x9e\x57\x2f\xa8\x17\xd5\x4b\xea\x65\xf5\x8a\x7a\x55\xbd\xa6\x5e\x57\x6f\xa8\x37\xd5\x5b\xea\x6d\xf5\x8e\x7a\x57\xbd\xa7\xde\x57\x1f\xa8\x0f\xd5\x47\xea\x63\xf5\x89\xfa\x54\x7d\xa6\x3e\x57\x5f\xa8\x2f\xd5\x57\xea\x6b\xf5\x8d\xfa\x56\x7d\xa7\xbe\x57\x3f\xa8\x1f\xd5\x4f\xea\x67\xf5\x8b\xfa\x55\xfd\xa6\x7e\x57\x7f\xa8\x3f\xd5\x44\xf5\x97\xfa\x5b\xfd\xa3\xfe\x55\x93\xd4\x64\x0d\x34\x44\x43\x35\x4c\xc3\x35\x42\x23\x35\x4a\xa3\x35\x46\x63\x35\x4e\xe3\x35\x41\x13\x35\x49\x93\x35\x45\x53\x35\x4d\xd3\x35\x43\x33\x35\x4b\xb3\x35\x47\x73\x35\x9f\x96\x41\xcb\xa8\x65\xd2\x32\x6b\x7e\x2d\x8b\x96\x55\xcb\xa6\x65\xd7\x02\xb4\x40\x2d\x87\x96\x53\xcb\xa5\xe5\xd6\xf2\x68\x79\xb5\x7c\x5a\x90\x96\x5f\x0b\xd6\x0a\x68\x21\x5a\xa8\x56\x50\x2b\xa4\x15\xd6\x8a\x68\x45\xb5\x62\x5a\x71\xad\x84\x56\x52\x2b\xa5\x95\xd6\xca\x68\x65\xb5\x72\x5a\x79\xad\x82\x56\x51\xab\xa4\x55\xd6\xaa\x68\x55\xb5\x6a\x5a\x75\xad\x86\x56\x53\xab\xa5\xd5\xd6\xea\x68\x75\xb5\x7a\x5a\x7d\xad\x81\xd6\x50\x6b\xa4\x35\xd6\x9a\x68\x4d\xb5\x66\x5a\x73\xad\x85\xd6\x52\x6b\xa5\xb5\xd6\xda\x68\x6d\xb5\x30\xad\x9d\x16\xae\x45\x68\x91\x5a\x7b\xad\x83\xd6\x51\x8b\xd2\x3a\x69\x9d\xb5\x2e\x5a\x57\x2d\x5a\x8b\xd1\xba\x69\xdd\xb5\x58\x2d\x4e\x8b\xd7\x7a\x68\x3d\xb5\x5e\x5a\x6f\xad\x8f\xd6\x57\xeb\xa7\xf5\xd7\x06\x68\x03\xb5\x41\xda\x60\x6d\x88\x36\x54\x1b\xa6\x0d\xd7\x46\x68\x23\xb5\x51\xda\x68\x6d\x8c\x36\x56\x1b\xa7\x8d\xd7\x26\x68\x13\xb5\x49\xda\x64\x6d\x8a\x36\x55\x9b\xa6\x4d\xd7\x66\x68\x33\xb5\x59\xda\x6c\x6d\x8e\x36\x57\x9b\xa7\xcd\xd7\x16\x68\x0b\xb5\x45\xda\x62\x6d\x89\xb6\x54\x5b\xa6\x2d\xd7\x56\x68\x2b\xb5\x55\xda\x6a\x6d\x8d\xb6\x56\x5b\xa7\xad\xd7\x36\x68\x1b\xb5\x4d\xda\x66\x6d\x8b\xb6\x55\xdb\xa6\x6d\xd7\x76\x68\x3b\xb5\x5d\xda\x6e\x6d\x8f\xb6\x57\xdb\xa7\xed\xd7\x0e\x68\x9e\x76\x50\x3b\xa4\x25\x68\x87\xb5\x23\xda\x51\xed\x98\x76\x5c\x3b\xa1\x9d\xd4\x4e\x69\xa7\xb5\x33\xda\x59\xed\x9c\x76\x5e\xbb\xa0\x5d\xd4\x2e\x69\x97\xb5\x2b\xda\x55\xed\x9a\x76\x5d\xbb\xa1\xdd\xd4\x6e\x69\xb7\xb5\x3b\xda\x5d\xed\x9e\x76\x5f\x7b\xa0\x3d\xd4\x1e\x69\x8f\xb5\x27\xda\x53\xed\x99\xf6\x5c\x7b\xa1\xbd\xd4\x5e\x69\xaf\xb5\x37\xda\x5b\xed\x9d\xf6\x5e\xfb\xa0\x7d\xd4\x3e\x69\x9f\xb5\x2f\xda\x57\xed\x9b\xf6\x5d\xfb\xa1\xfd\xd4\x12\xb5\x5f\xda\x6f\xed\x8f\xf6\x57\x4b\xd2\x92\x75\xd0\x11\x1d\xd5\x31\x1d\xd7\x09\x9d\xd4\x29\x9d\xd6\x19\x9d\xd5\x39\x9d\xd7\x05\x5d\xd4\x25\x5d\xd6\x15\x5d\xd5\x35\x5d\xd7\x0d\xdd\xd4\x2d\xdd\xd6\x1d\xdd\xd5\x7d\x7a\x06\x3d\xa3\x9e\x49\xcf\xac\xfb\xf5\x2c\x7a\x56\x3d\x9b\x9e\x5d\x0f\xd0\x03\xf5\x1c\x7a\x4e\x3d\x97\x9e\x5b\xcf\xa3\xe7\xd5\xf3\xe9\x41\x7a\x7e\x3d\x58\x2f\xa0\x87\xe8\xa1\x7a\x41\xbd\x90\x5e\x58\x2f\xa2\x17\xd5\x8b\xe9\xc5\xf5\x12\x7a\x49\xbd\x94\x5e\x5a\x2f\xa3\x97\xd5\xcb\xe9\xe5\xf5\x0a\x7a\x45\xbd\x92\x5e\x59\xaf\xa2\x57\xd5\xab\xe9\xd5\xf5\x1a\x7a\x4d\xbd\x96\x5e\x5b\xaf\xa3\xd7\xd5\xeb\xe9\xf5\xf5\x06\x7a\x43\xbd\x91\xde\x58\x6f\xa2\x37\xd5\x9b\xe9\xcd\xf5\x16\x7a\x4b\xbd\x95\xde\x5a\x6f\xa3\xb7\xd5\xc3\xf4\x76\x7a\xb8\x1e\xa1\x47\xea\xed\xf5\x0e\x7a\x47\x3d\x4a\xef\xa4\x77\xd6\xbb\xe8\x5d\xf5\x68\x3d\x46\xef\xa6\x77\xd7\x63\xf5\x38\x3d\x5e\xef\xa1\xf7\xd4\x7b\xe9\xbd\xf5\x3e\x7a\x5f\xbd\x9f\xde\x5f\x1f\xa0\x0f\xd4\x07\xe9\x83\xf5\x21\xfa\x50\x7d\x98\x3e\x5c\x1f\xa1\x8f\xd4\x47\xe9\xa3\xf5\x31\xfa\x58\x7d\x9c\x3e\x5e\x9f\xa0\x4f\xd4\x27\xe9\x93\xf5\x29\xfa\x54\x7d\x9a\x3e\x5d\x9f\xa1\xcf\xd4\x67\xe9\xb3\xf5\x39\xfa\x5c\x7d\x9e\x3e\x5f\x5f\xa0\x2f\xd4\x17\xe9\x8b\xf5\x25\xfa\x52\x7d\x99\xbe\x5c\x5f\xa1\xaf\xd4\x57\xe9\xab\xf5\x35\xfa\x5a\x7d\x9d\xbe\x5e\xdf\xa0\x6f\xd4\x37\xe9\x9b\xf5\x2d\xfa\x56\x7d\x9b\xbe\x5d\xdf\xa1\xef\xd4\x77\xe9\xbb\xf5\x3d\xfa\x5e\x7d\x9f\xbe\x5f\x3f\xa0\x7b\xfa\x41\xfd\x90\x9e\xa0\x1f\xd6\x8f\xe8\x47\xf5\x63\xfa\x71\xfd\x84\x7e\x52\x3f\xa5\x9f\xd6\xcf\xe8\x67\xf5\x73\xfa\x79\xfd\x82\x7e\x51\xbf\xa4\x5f\xd6\xaf\xe8\x57\xf5\x6b\xfa\x75\xfd\x86\x7e\x53\xbf\xa5\xdf\xd6\xef\xe8\x77\xf5\x7b\xfa\x7d\xfd\x81\xfe\x50\x7f\xa4\x3f\xd6\x9f\xe8\x4f\xf5\x67\xfa\x73\xfd\x85\xfe\x52\x7f\xa5\xbf\xd6\xdf\xe8\x6f\xf5\x77\xfa\x7b\xfd\x83\xfe\x51\xff\xa4\x7f\xd6\xbf\xe8\x5f\xf5\x6f\xfa\x77\xfd\x87\xfe\x53\x4f\xd4\x7f\xe9\xbf\xf5\x3f\xfa\x5f\x3d\x49\x4f\x36\xc0\x40\x0c\xd4\xc0\x0c\xdc\x20\x0c\xd2\xa0\x0c\xda\x60\x0c\xd6\xe0\x0c\xde\x10\x0c\xd1\x90\x0c\xd9\x50\x0c\xd5\xd0\x0c\xdd\x30\x0c\xd3\xb0\x0c\xdb\x70\x0c\xd7\xf0\x19\x19\x8c\x8c\x46\x26\x23\xb3\xe1\x37\xb2\x18\x59\x8d\x6c\x46\x76\x23\xc0\x08\x34\x72\x18\x39\x8d\x5c\x46\x6e\x23\x8f\x91\xd7\xc8\x67\x04\x19\xf9\x8d\x60\xa3\x80\x11\x62\x84\x1a\x05\x8d\x42\x46\x61\xa3\x88\x51\xd4\x28\x66\x14\x37\x4a\x18\x25\x8d\x52\x46\x69\xa3\x8c\x51\xd6\x28\x67\x94\x37\x2a\x18\x15\x8d\x4a\x46\x65\xa3\x8a\x51\xd5\xa8\x66\x54\x37\x6a\x18\x35\x8d\x5a\x46\x6d\xa3\x8e\x51\xd7\xa8\x67\xd4\x37\x1a\x18\x0d\x8d\x46\x46\x63\xa3\x89\xd1\xd4\x68\x66\x34\x37\x5a\x18\x2d\x8d\x56\x46\x6b\xa3\x8d\xd1\xd6\x08\x33\xda\x19\xe1\x46\x84\x11\x69\xb4\x37\x3a\x18\x1d\x8d\x28\xa3\x93\xd1\xd9\xe8\x62\x74\x35\xa2\x8d\x18\xa3\x9b\xd1\xdd\x88\x35\xe2\x8c\x78\xa3\x87\xd1\xd3\xe8\x65\xf4\x36\xfa\x18\x7d\x8d\x7e\x46\x7f\x63\x80\x31\xd0\x18\x64\x0c\x36\x86\x18\x43\x8d\x61\xc6\x70\x63\x84\x31\xd2\x18\x65\x8c\x36\xc6\x18\x63\x8d\x71\xc6\x78\x63\x82\x31\xd1\x98\x64\x4c\x36\xa6\x18\x53\x8d\x69\xc6\x74\x63\x86\x31\xd3\x98\x65\xcc\x36\xe6\x18\x73\x8d\x79\xc6\x7c\x63\x81\xb1\xd0\x58\x64\x2c\x36\x96\x18\x4b\x8d\x65\xc6\x72\x63\x85\xb1\xd2\x58\x65\xac\x36\xd6\x18\x6b\x8d\x75\xc6\x7a\x63\x83\xb1\xd1\xd8\x64\x6c\x36\xb6\x18\x5b\x8d\x6d\xc6\x76\x63\x87\xb1\xd3\xd8\x65\xec\x36\xf6\x18\x7b\x8d\x7d\xc6\x7e\xe3\x80\xe1\x19\x07\x8d\x43\x46\x82\x71\xd8\x38\x62\x1c\x35\x8e\x19\xc7\x8d\x13\xc6\x49\xe3\x94\x71\xda\x38\x63\x9c\x35\xce\x19\xe7\x8d\x0b\xc6\x45\xe3\x92\x71\xd9\xb8\x62\x5c\x35\xae\x19\xd7\x8d\x1b\xc6\x4d\xe3\x96\x71\xdb\xb8\x63\xdc\x35\xee\x19\xf7\x8d\x07\xc6\x43\xe3\x91\xf1\xd8\x78\x62\x3c\x35\x9e\x19\xcf\x8d\x17\xc6\x4b\xe3\x95\xf1\xda\x78\x63\xbc\x35\xde\x19\xef\x8d\x0f\xc6\x47\xe3\x93\xf1\xd9\xf8\x62\x7c\x35\xbe\x19\xdf\x8d\x1f\xc6\x4f\x23\xd1\xf8\x65\xfc\x36\xfe\x18\x7f\x8d\x24\x23\xd9\x04\x13\x31\x51\x13\x33\x71\x93\x30\x49\x93\x32\x69\x93\x31\x59\x93\x33\x79\x53\x30\x45\x53\x32\x65\x53\x31\x55\x53\x33\x75\xd3\x30\x4d\xd3\x32\x6d\xd3\x31\x5d\xd3\x67\x66\x30\x33\x9a\x99\xcc\xcc\xa6\xdf\xcc\x62\x66\x35\xb3\x99\xd9\xcd\x00\x33\xd0\xcc\x61\xe6\x34\x73\x99\xb9\xcd\x3c\x66\x5e\x33\x9f\x19\x64\xe6\x37\x83\xcd\x02\x66\x88\x19\x6a\x16\x34\x0b\x99\x85\xcd\x22\x66\x51\xb3\x98\x59\xdc\x2c\x61\x96\x34\x4b\x99\xa5\xcd\x32\x66\x59\xb3\x9c\x59\xde\xac\x60\x56\x34\x2b\x99\x95\xcd\x2a\x66\x55\xb3\x9a\x59\xdd\xac\x61\xd6\x34\x6b\x99\xb5\xcd\x3a\x66\x5d\xb3\x9e\x59\xdf\x6c\x60\x36\x34\x1b\x99\x8d\xcd\x26\x66\x53\xb3\x99\xd9\xdc\x6c\x61\xb6\x34\x5b\x99\xad\xcd\x36\x66\x5b\x33\xcc\x6c\x67\x86\x9b\x11\x66\xa4\xd9\xde\xec\x60\x76\x34\xa3\xcc\x4e\x66\x67\xb3\x8b\xd9\xd5\x8c\x36\x63\xcc\x6e\x66\x77\x33\xd6\x8c\x33\xe3\xcd\x1e\x66\x4f\xb3\x97\xd9\xdb\xec\x63\xf6\x35\xfb\x99\xfd\xcd\x01\xe6\x40\x73\x90\x39\xd8\x1c\x62\x0e\x35\x87\x99\xc3\xcd\x11\xe6\x48\x73\x94\x39\xda\x1c\x63\x8e\x35\xc7\x99\xe3\xcd\x09\xe6\x44\x73\x92\x39\xd9\x9c\x62\x4e\x35\xa7\x99\xd3\xcd\x19\xe6\x4c\x73\x96\x39\xdb\x9c\x63\xce\x35\xe7\x99\xf3\xcd\x05\xe6\x42\x73\x91\xb9\xd8\x5c\x62\x2e\x35\x97\x99\xcb\xcd\x15\xe6\x4a\x73\x95\xb9\xda\x5c\x63\xae\x35\xd7\x99\xeb\xcd\x0d\xe6\x46\x73\x93\xb9\xd9\xdc\x62\x6e\x35\xb7\x99\xdb\xcd\x1d\xe6\x4e\x73\x97\xb9\xdb\xdc\x63\xee\x35\xf7\x99\xfb\xcd\x03\xa6\x67\x1e\x34\x0f\x99\x09\xe6\x61\xf3\x88\x79\xd4\x3c\x66\x1e\x37\x4f\x98\x27\xcd\x53\xe6\x69\xf3\x8c\x79\xd6\x3c\x67\x9e\x37\x2f\x98\x17\xcd\x4b\xe6\x65\xf3\x8a\x79\xd5\xbc\x66\x5e\x37\x6f\x98\x37\xcd\x5b\xe6\x6d\xf3\x8e\x79\xd7\xbc\x67\xde\x37\x1f\x98\x0f\xcd\x47\xe6\x63\xf3\x89\xf9\xd4\x7c\x66\x3e\x37\x5f\x98\x2f\xcd\x57\xe6\x6b\xf3\x8d\xf9\xd6\x7c\x67\xbe\x37\x3f\x98\x1f\xcd\x4f\xe6\x67\xf3\x8b\xf9\xd5\xfc\x66\x7e\x37\x7f\x98\x3f\xcd\x44\xf3\x97\xf9\xdb\xfc\x63\xfe\x35\x93\xcc\x64\x0b\x2c\xc4\x42\x2d\xcc\xc2\x2d\xc2\x22\x2d\xca\xa2\x2d\xc6\x62\x2d\xce\xe2\x2d\xc1\x12\x2d\xc9\x92\x2d\xc5\x52\x2d\xcd\xd2\x2d\xc3\x32\x2d\xcb\xb2\x2d\xc7\x72\x2d\x9f\x95\xc1\xca\x68\x65\xb2\x32\x5b\x7e\x2b\x8b\x95\xd5\xca\x66\x65\xb7\x02\xac\x40\x2b\x87\x95\xd3\xca\x65\xe5\xb6\xf2\x58\x79\xad\x7c\x56\x90\x95\xdf\x0a\xb6\x0a\x58\x21\x56\xa8\x55\xd0\x2a\x64\x15\xb6\x8a\x58\x45\xad\x62\x56\x71\xab\x84\x55\xd2\x2a\x65\x95\xb6\xca\x58\x65\xad\x72\x56\x79\xab\x82\x55\xd1\xaa\x64\x55\xb6\xaa\x58\x55\xad\x6a\x56\x75\xab\x86\x55\xd3\xaa\x65\xd5\xb6\xea\x58\x75\xad\x7a\x56\x7d\xab\x81\xd5\xd0\x6a\x64\x35\xb6\x9a\x58\x4d\xad\x66\x56\x73\xab\x85\xd5\xd2\x6a\x65\xb5\xb6\xda\x58\x6d\xad\x30\xab\x9d\x15\x6e\x45\x58\x91\x56\x7b\xab\x83\xd5\xd1\x8a\xb2\x3a\x59\x9d\xad\x2e\x56\x57\x2b\xda\x8a\xb1\xba\x59\xdd\xad\x58\x2b\xce\x8a\xb7\x7a\x58\x3d\xad\x5e\x56\x6f\xab\x8f\xd5\xd7\xea\x67\xf5\xb7\x06\x58\x03\xad\x41\xd6\x60\x6b\x88\x35\xd4\x1a\x66\x0d\xb7\x46\x58\x23\xad\x51\xd6\x68\x6b\x8c\x35\xd6\x1a\x67\x8d\xb7\x26\x58\x13\xad\x49\xd6\x64\x6b\x8a\x35\xd5\x9a\x66\x4d\xb7\x66\x58\x33\xad\x59\xd6\x6c\x6b\x8e\x35\xd7\x9a\x67\xcd\xb7\x16\x58\x0b\xad\x45\xd6\x62\x6b\x89\xb5\xd4\x5a\x66\x2d\xb7\x56\x58\x2b\xad\x55\xd6\x6a\x6b\x8d\xb5\xd6\x5a\x67\xad\xb7\x36\x58\x1b\xad\x4d\xd6\x66\x6b\x8b\xb5\xd5\xda\x66\x6d\xb7\x76\x58\x3b\xad\x5d\xd6\x6e\x6b\x8f\xb5\xd7\xda\x67\xed\xb7\x0e\x58\x9e\x75\xd0\x3a\x64\x25\x58\x87\xad\x23\xd6\x51\xeb\x98\x75\xdc\x3a\x61\x9d\xb4\x4e\x59\xa7\xad\x33\xd6\x59\xeb\x9c\x75\xde\xba\x60\x5d\xb4\x2e\x59\x97\xad\x2b\xd6\x55\xeb\x9a\x75\xdd\xba\x61\xdd\xb4\x6e\x59\xb7\xad\x3b\xd6\x5d\xeb\x9e\x75\xdf\x7a\x60\x3d\xb4\x1e\x59\x8f\xad\x27\xd6\x53\xeb\x99\xf5\xdc\x7a\x61\xbd\xb4\x5e\x59\xaf\xad\x37\xd6\x5b\xeb\x9d\xf5\xde\xfa\x60\x7d\xb4\x3e\x59\x9f\xad\x2f\xd6\x57\xeb\x9b\xf5\xdd\xfa\x61\xfd\xb4\x12\xad\x5f\xd6\x6f\xeb\x8f\xf5\xd7\x4a\xb2\x92\x6d\xb0\x11\x1b\xb5\x31\x1b\xb7\x09\x9b\xb4\x29\x9b\xb6\x19\x9b\xb5\x39\x9b\xb7\x05\x5b\xb4\x25\x5b\xb6\x15\x5b\xb5\x35\x5b\xb7\x0d\xdb\xb4\x2d\xdb\xb6\x1d\xdb\xb5\x7d\x76\x06\x3b\xa3\x9d\xc9\xce\x6c\xfb\xed\x2c\x76\x56\x3b\x9b\x9d\xdd\x0e\xb0\x03\xed\x1c\x76\x4e\x3b\x97\x9d\xdb\xce\x63\xe7\xb5\xf3\xd9\x41\x76\x7e\x3b\xd8\x2e\x60\x87\xd8\xa1\x76\x41\xbb\x90\x5d\xd8\x2e\x62\x17\xb5\x8b\xd9\xc5\xed\x12\x76\x49\xbb\x94\x5d\xda\x2e\x63\x97\xb5\xcb\xd9\xe5\xed\x0a\x76\x45\xbb\x92\x5d\xd9\xae\x62\x57\xb5\xab\xd9\xd5\xed\x1a\x76\x4d\xbb\x96\x5d\xdb\xae\x63\xd7\xb5\xeb\xd9\xf5\xed\x06\x76\x43\xbb\x91\xdd\xd8\x6e\x62\x37\xb5\x9b\xd9\xcd\xed\x16\x76\x4b\xbb\x95\xdd\xda\x6e\x63\xb7\xb5\xc3\xec\x76\x76\xb8\x1d\x61\x47\xda\xed\xed\x0e\x76\x47\x3b\xca\xee\x64\x77\xb6\xbb\xd8\x5d\xed\x68\x3b\xc6\xee\x66\x77\xb7\x63\xed\x38\x3b\xde\xee\x61\xf7\xb4\x7b\xd9\xbd\xed\x3e\x76\x5f\xbb\x9f\xdd\xdf\x1e\x60\x0f\xb4\x07\xd9\x83\xed\x21\xf6\x50\x7b\x98\x3d\xdc\x1e\x61\x8f\xb4\x47\xd9\xa3\xed\x31\xf6\x58\x7b\x9c\x3d\xde\x9e\x60\x4f\xb4\x27\xd9\x93\xed\x29\xf6\x54\x7b\x9a\x3d\xdd\x9e\x61\xcf\xb4\x67\xd9\xb3\xed\x39\xf6\x5c\x7b\x9e\x3d\xdf\x5e\x60\x2f\xb4\x17\xd9\x8b\xed\x25\xf6\x52\x7b\x99\xbd\xdc\x5e\x61\xaf\xb4\x57\xd9\xab\xed\x35\xf6\x5a\x7b\x9d\xbd\xde\xde\x60\x6f\xb4\x37\xd9\x9b\xed\x2d\xf6\x56\x7b\x9b\xbd\xdd\xde\x61\xef\xb4\x77\xd9\xbb\xed\x3d\xf6\x5e\x7b\x9f\xbd\xdf\x3e\x60\x7b\xf6\x41\xfb\x90\x9d\x60\x1f\xb6\x8f\xd8\x47\xed\x63\xf6\x71\xfb\x84\x7d\xd2\x3e\x65\x9f\xb6\xcf\xd8\x67\xed\x73\xf6\x79\xfb\x82\x7d\xd1\xbe\x64\x5f\xb6\xaf\xd8\x57\xed\x6b\xf6\x75\xfb\x86\x7d\xd3\xbe\x65\xdf\xb6\xef\xd8\x77\xed\x7b\xf6\x7d\xfb\x81\xfd\xd0\x7e\x64\x3f\xb6\x9f\xd8\x4f\xed\x67\xf6\x73\xfb\x85\xfd\xd2\x7e\x65\xbf\xb6\xdf\xd8\x6f\xed\x77\xf6\x7b\xfb\x83\xfd\xd1\xfe\x64\x7f\xb6\xbf\xd8\x5f\xed\x6f\xf6\x77\xfb\x87\xfd\xd3\x4e\xb4\x7f\xd9\xbf\xed\x3f\xf6\x5f\x3b\xc9\x4e\x76\xc0\x41\x1c\xd4\xc1\x1c\xdc\x21\x1c\xd2\xa1\x1c\xda\x61\x1c\xd6\xe1\x1c\xde\x11\x1c\xd1\x91\x1c\xd9\x51\x1c\xd5\xd1\x1c\xdd\x31\x1c\xd3\xb1\x1c\xdb\x71\x1c\xd7\xf1\x39\x19\x9c\x8c\x4e\x26\x27\xb3\xe3\x77\xb2\x38\x59\x9d\x6c\x4e\x76\x27\xc0\x09\x74\x72\x38\x39\x9d\x5c\x4e\x6e\x27\x8f\x93\xd7\xc9\xe7\x04\x39\xf9\x9d\x60\xa7\x80\x13\xe2\x84\x3a\x05\x9d\x42\x4e\x61\xa7\x88\x53\xd4\x29\xe6\x14\x77\x4a\x38\x25\x9d\x52\x4e\x69\xa7\x8c\x53\xd6\x29\xe7\x94\x77\x2a\x38\x15\x9d\x4a\x4e\x65\xa7\x8a\x53\xd5\xa9\xe6\x54\x77\x6a\x38\x35\x9d\x5a\x4e\x6d\xa7\x8e\x53\xd7\xa9\xe7\xd4\x77\x1a\x38\x0d\x9d\x46\x4e\x63\xa7\x89\xd3\xd4\x69\xe6\x34\x77\x5a\x38\x2d\x9d\x56\x4e\x6b\xa7\x8d\xd3\xd6\x09\x73\xda\x39\xe1\x4e\x84\x13\xe9\xb4\x77\x3a\x38\x1d\x9d\x28\xa7\x93\xd3\xd9\xe9\xe2\x74\x75\xa2\x9d\x18\xa7\x9b\xd3\xdd\x89\x75\xe2\x9c\x78\xa7\x87\xd3\xd3\xe9\xe5\xf4\x76\xfa\x38\x7d\x9d\x7e\x4e\x7f\x67\x80\x33\xd0\x19\xe4\x0c\x76\x86\x38\x43\x9d\x61\xce\x70\x67\x84\x33\xd2\x19\xe5\x8c\x76\xc6\x38\x63\x9d\x71\xce\x78\x67\x82\x33\xd1\x99\xe4\x4c\x76\xa6\x38\x53\x9d\x69\xce\x74\x67\x86\x33\xd3\x99\xe5\xcc\x76\xe6\x38\x73\x9d\x79\xce\x7c\x67\x81\xb3\xd0\x59\xe4\x2c\x76\x96\x38\x4b\x9d\x65\xce\x72\x67\x85\xb3\xd2\x59\xe5\xac\x76\xd6\x38\x6b\x9d\x75\xce\x7a\x67\x83\xb3\xd1\xd9\xe4\x6c\x76\xb6\x38\x5b\x9d\x6d\xce\x76\x67\x87\xb3\xd3\xd9\xe5\xec\x76\xf6\x38\x7b\x9d\x7d\xce\x7e\xe7\x80\xe3\x39\x07\x9d\x43\x4e\x82\x73\xd8\x39\xe2\x1c\x75\x8e\x39\xc7\x9d\x13\xce\x49\xe7\x94\x73\xda\x39\xe3\x9c\x75\xce\x39\xe7\x9d\x0b\xce\x45\xe7\x92\x73\xd9\xb9\xe2\x5c\x75\xae\x39\xd7\x9d\x1b\xce\x4d\xe7\x96\x73\xdb\xb9\xe3\xdc\x75\xee\x39\xf7\x9d\x07\xce\x43\xe7\x91\xf3\xd8\x79\xe2\x3c\x75\x9e\x39\xcf\x9d\x17\xce\x4b\xe7\x95\xf3\xda\x79\xe3\xbc\x75\xde\x39\xef\x9d\x0f\xce\x47\xe7\x93\xf3\xd9\xf9\xe2\x7c\x75\xbe\x39\xdf\x9d\x1f\xce\x4f\x27\xd1\xf9\xe5\xfc\x76\xfe\x38\x7f\x9d\x24\x27\xd9\x05\x17\x71\x51\x17\x73\x71\x97\x70\x49\x97\x72\x69\x97\x71\x59\x97\x73\x79\x57\x70\x45\x57\x72\x65\x57\x71\x55\x57\x73\x75\xd7\x70\x4d\xd7\x72\x6d\xd7\x71\x5d\xd7\xe7\x66\x70\x33\xba\x99\xdc\xcc\xae\xdf\xcd\xe2\x66\x75\xb3\xb9\xd9\xdd\x00\x37\xd0\xcd\xe1\xe6\x74\x73\xb9\xb9\xdd\x3c\x6e\x5e\x37\x9f\x1b\xe4\xe6\x77\x83\xdd\x02\x6e\x88\x1b\xea\x16\x74\x0b\xb9\x85\xdd\x22\x6e\x51\xb7\x98\x5b\xdc\x2d\xe1\x96\x74\x4b\xb9\xa5\xdd\x32\x6e\x59\xb7\x9c\x5b\xde\xad\xe0\x56\x74\x2b\xb9\x95\xdd\x2a\x6e\x55\xb7\x9a\x5b\xdd\xad\xe1\xd6\x74\x6b\xb9\xb5\xdd\x3a\x6e\x5d\xb7\x9e\x5b\xdf\x6d\xe0\x36\x74\x1b\xb9\x8d\xdd\x26\x6e\x53\xb7\x99\xdb\xdc\x6d\xe1\xb6\x74\x5b\xb9\xad\xdd\x36\x6e\x5b\x37\xcc\x6d\xe7\x86\xbb\x11\x6e\xa4\xdb\xde\xed\xe0\x76\x74\xa3\xdc\x4e\x6e\x67\xb7\x8b\xdb\xd5\x8d\x76\x63\xdc\x6e\x6e\x77\x37\xd6\x8d\x73\xe3\xdd\x1e\x6e\x4f\xb7\x97\xdb\xdb\xed\xe3\xf6\x75\xfb\xb9\xfd\xdd\x01\xee\x40\x77\x90\x3b\xd8\x1d\xe2\x0e\x75\x87\xb9\xc3\xdd\x11\xee\x48\x77\x94\x3b\xda\x1d\xe3\x8e\x75\xc7\xb9\xe3\xdd\x09\xee\x44\x77\x92\x3b\xd9\x9d\xe2\x4e\x75\xa7\xb9\xd3\xdd\x19\xee\x4c\x77\x96\x3b\xdb\x9d\xe3\xce\x75\xe7\xb9\xf3\xdd\x05\xee\x42\x77\x91\xbb\xd8\x5d\xe2\x2e\x75\x97\xb9\xcb\xdd\x15\xee\x4a\x77\x95\xbb\xda\x5d\xe3\xae\x75\xd7\xb9\xeb\xdd\x0d\xee\x46\x77\x93\xbb\xd9\xdd\xe2\x6e\x75\xb7\xb9\xdb\xdd\x1d\xee\x4e\x77\x97\xbb\xdb\xdd\xe3\xee\x75\xf7\xb9\xfb\xdd\x03\xae\xe7\x1e\x74\x0f\xb9\x09\xee\x61\xf7\x88\x7b\xd4\x3d\xe6\x1e\x77\x4f\xb8\x27\xdd\x53\xee\x69\xf7\x8c\x7b\xd6\x3d\xe7\x9e\x77\x2f\xb8\x17\xdd\x4b\xee\x65\xf7\x8a\x7b\xd5\xbd\xe6\x5e\x77\x6f\xb8\x37\xdd\x5b\xee\x6d\xf7\x8e\x7b\xd7\xbd\xe7\xde\x77\x1f\xb8\x0f\xdd\x47\xee\x63\xf7\x89\xfb\xd4\x7d\xe6\x3e\x77\x5f\xb8\x2f\xdd\x57\xee\x6b\xf7\x8d\xfb\xd6\x7d\xe7\xbe\x77\x3f\xb8\x1f\xdd\x4f\xee\x67\xf7\x8b\xfb\xd5\xfd\xe6\x7e\x77\x7f\xb8\x3f\xdd\x44\xf7\x97\xfb\xdb\xfd\xe3\xfe\x75\x93\xdc\x64\x1f\xf8\x10\x1f\xea\xc3\x7c\xb8\x8f\xf0\x91\x3e\xca\x47\xfb\x18\x1f\xeb\xe3\x7c\xbc\x4f\xf0\x89\x3e\xc9\x27\xfb\x14\x9f\xea\xd3\x7c\xba\xcf\xf0\x99\x3e\xcb\x67\xfb\x1c\x9f\xeb\xf3\xf9\x32\xf8\x32\xfa\x32\xf9\x32\xfb\xfc\xbe\x2c\xbe\xac\xbe\x6c\xbe\xec\xbe\x00\x5f\xa0\x2f\x87\x2f\xa7\x2f\x97\x2f\xb7\x2f\x8f\x2f\xaf\x2f\x9f\x2f\xc8\x97\xdf\x17\xec\x2b\xe0\x0b\xf1\x85\xfa\x0a\xfa\x0a\xf9\x0a\xfb\x8a\xf8\x8a\xfa\x8a\xf9\x8a\xfb\x4a\xf8\x4a\xfa\x4a\xf9\x4a\xfb\xca\xf8\xca\xfa\xca\xf9\xca\xfb\x2a\xf8\x2a\xfa\x2a\xf9\x2a\xfb\xaa\xf8\xaa\xfa\xaa\xf9\xaa\xfb\x6a\xf8\x6a\xfa\x6a\xf9\x6a\xfb\xea\xf8\xea\xfa\xea\xf9\xea\xff\x5f\x04\xc0\x03\xa0\x55\x31\x00\x00\xd0\x6c\xbb\xae\x6d\x6b\xdb\xcb\xb6\x6d\xdb\xb6\x6d\xdb\xb6\x6d\xdb\xb6\x6d\xf3\xa3\x83\x55\xc3\xaa\x63\x35\xb0\x9a\x58\x2d\xac\x36\x56\x07\xab\x8b\xd5\xc3\xea\x63\x0d\xb0\x86\x58\x23\xac\x31\xd6\x04\x6b\x8a\x35\xc3\x9a\x63\x2d\xb0\x96\x58\x2b\xac\x35\xd6\x06\x6b\x8b\xb5\xc3\xda\x63\x1d\xb0\x8e\x58\x27\xac\x33\xd6\x05\xeb\x8a\x75\xc3\xba\x63\x3d\xb0\x9e\x58\x2f\xac\x37\xd6\x07\xeb\x8b\xf5\xc3\xfa\x63\x03\xb0\x81\xd8\x20\x6c\x30\x36\x04\x1b\x8a\x0d\xc3\x86\x63\x23\xb0\x91\xd8\x28\x6c\x34\x36\x06\x1b\x8b\x8d\xc3\xc6\x63\x13\xb0\x89\xd8\x24\x6c\x32\x36\x05\x9b\x8a\x4d\xc3\xa6\x63\x33\xb0\x99\xd8\x2c\x6c\x36\x36\x07\x9b\x8b\xcd\xc3\xe6\x63\x0b\xb0\x85\xd8\x22\x6c\x31\xb6\x04\x5b\x8a\x2d\xc3\x96\x63\x2b\xb0\x95\xd8\x2a\x6c\x35\xb6\x06\x5b\x8b\xad\xc3\xd6\x63\x1b\xb0\x8d\xd8\x26\x6c\x33\xb6\x05\xdb\x8a\x6d\xc3\xb6\x63\x3b\xb0\x9d\xd8\x2e\x6c\x37\xb6\x07\xdb\x8b\xed\xc3\xf6\x63\x07\xb0\x83\xd8\x21\xec\x30\x76\x04\x3b\x8a\x1d\xc3\x8e\x63\x27\xb0\x93\xd8\x29\xec\x34\x76\x06\x3b\x8b\x9d\xc3\xce\x63\x17\xb0\x8b\xd8\x25\xec\x32\x76\x05\xbb\x8a\x5d\xc3\xae\x63\x37\xb0\x9b\xd8\x2d\xec\x36\x76\x07\xbb\x8b\xdd\xc3\xee\x63\x0f\xb0\x87\xd8\x23\xec\x31\xf6\x04\x7b\x8a\x3d\xc3\x9e\x63\x2f\xb0\x97\xd8\x2b\xec\x35\xf6\x06\x7b\x8b\xbd\xc3\xde\x63\x1f\xb0\x8f\xd8\x27\xec\x33\xf6\x05\xfb\x8a\x7d\xc3\xbe\x63\x3f\xb0\x9f\xd8\x2f\xec\x37\xf6\x07\xfb\x8b\xfd\xc3\xe2\xb0\x78\x2c\x01\x4b\xc4\x93\xe0\x49\xf1\x64\x78\x72\x3c\x05\x9e\x12\x4f\x85\xa7\xc6\xd3\xe0\x69\xf1\x74\x78\x7a\x3c\x03\x9e\x11\xcf\x84\x67\xc6\xb3\xe0\x59\xf1\x6c\x78\x76\x3c\x07\x9e\x13\xcf\x85\xe7\xc6\xf3\xe0\x79\xf1\x7c\x38\x86\xe3\x38\x81\x93\x38\x85\xd3\x38\x83\xb3\x38\x87\xf3\xb8\x80\x8b\xb8\x84\xcb\xb8\x82\xab\xb8\x86\xeb\xb8\x81\x9b\xb8\x85\xdb\xb8\x83\xbb\xb8\x87\xfb\x78\x80\x87\x78\x84\x03\x1c\xe2\x08\x8f\xe1\xf9\xf1\x02\x78\x41\xbc\x10\x5e\x18\x2f\x82\x17\xc5\x8b\xe1\xc5\xf1\x12\x78\x49\xbc\x14\x5e\x1a\x2f\x83\x97\xc5\xcb\xe1\xe5\xf1\x0a\x78\x45\xbc\x12\x5e\x19\xaf\x82\x57\xc5\xab\xe1\xd5\xf1\x1a\x78\x4d\xbc\x16\x5e\x1b\xaf\x83\xd7\xc5\xeb\xe1\xf5\xf1\x06\x78\x43\xbc\x11\xde\x18\x6f\x82\x37\xc5\x9b\xe1\xcd\xf1\x16\x78\x4b\xbc\x15\xde\x1a\x6f\x83\xb7\xc5\xdb\xe1\xed\xf1\x0e\x78\x47\xbc\x13\xde\x19\xef\x82\x77\xc5\xbb\xe1\xdd\xf1\x1e\x78\x4f\xbc\x17\xde\x1b\xef\x83\xf7\xc5\xfb\xe1\xfd\xf1\x01\xf8\x40\x7c\x10\x3e\x18\x1f\x82\x0f\xc5\x87\xe1\xc3\xf1\x11\xf8\x48\x7c\x14\x3e\x1a\x1f\x83\x8f\xc5\xc7\xe1\xe3\xf1\x09\xf8\x44\x7c\x12\x3e\x19\x9f\x82\x4f\xc5\xa7\xe1\xd3\xf1\x19\xf8\x4c\x7c\x16\x3e\x1b\x9f\x83\xcf\xc5\xe7\xe1\xf3\xf1\x05\xf8\x42\x7c\x11\xbe\x18\x5f\x82\x2f\xc5\x97\xe1\xcb\xf1\x15\xf8\x4a\x7c\x15\xbe\x1a\x5f\x83\xaf\xc5\xd7\xe1\xeb\xf1\x0d\xf8\x46\x7c\x13\xbe\x19\xdf\x82\x6f\xc5\xb7\xe1\xdb\xf1\x1d\xf8\x4e\x7c\x17\xbe\x1b\xdf\x83\xef\xc5\xf7\xe1\xfb\xf1\x03\xf8\x41\xfc\x10\x7e\x18\x3f\x82\x1f\xc5\x8f\xe1\xc7\xf1\x13\xf8\x49\xfc\x14\x7e\x1a\x3f\x83\x9f\xc5\xcf\xe1\xe7\xf1\x0b\xf8\x45\xfc\x12\x7e\x19\xbf\x82\x5f\xc5\xaf\xe1\xd7\xf1\x1b\xf8\x4d\xfc\x16\x7e\x1b\xbf\x83\xdf\xc5\xef\xe1\xf7\xf1\x07\xf8\x43\xfc\x11\xfe\x18\x7f\x82\x3f\xc5\x9f\xe1\xcf\xf1\x17\xf8\x4b\xfc\x15\xfe\x1a\x7f\x83\xbf\xc5\xdf\xe1\xef\xf1\x0f\xf8\x47\xfc\x13\xfe\x19\xff\x82\x7f\xc5\xbf\xe1\xdf\xf1\x1f\xf8\x4f\xfc\x17\xfe\x1b\xff\x83\xff\xc5\xff\xe1\x71\x78\x3c\x9e\x80\x27\x12\x49\x88\xa4\x44\x32\x22\x39\x91\x82\x48\x49\xa4\x22\x52\x13\x69\x88\xb4\x44\x3a\x22\x3d\x91\x81\xc8\x48\x64\x22\x32\x13\x59\x88\xac\x44\x36\x22\x3b\x91\x83\xc8\x49\xe4\x22\x72\x13\x79\x88\xbc\x44\x3e\x02\x23\x70\x82\x20\x48\x82\x22\x68\x82\x21\x58\x82\x23\x78\x42\x20\x44\x42\x22\x64\x42\x21\x54\x42\x23\x74\xc2\x20\x4c\xc2\x22\x6c\xc2\x21\x5c\xc2\x23\x7c\x22\x20\x42\x22\x22\x00\x01\x09\x44\xc4\x88\xfc\x44\x01\xa2\x20\x51\x88\x28\x4c\x14\x21\x8a\x12\xc5\x88\xe2\x44\x09\xa2\x24\x51\x8a\x28\x4d\x94\x21\xca\x12\xe5\x88\xf2\x44\x05\xa2\x22\x51\x89\xa8\x4c\x54\x21\xaa\x12\xd5\x88\xea\x44\x0d\xa2\x26\x51\x8b\xa8\x4d\xd4\x21\xea\x12\xf5\x88\xfa\x44\x03\xa2\x21\xd1\x88\x68\x4c\x34\x21\x9a\x12\xcd\x88\xe6\x44\x0b\xa2\x25\xd1\x8a\x68\x4d\xb4\x21\xda\x12\xed\x88\xf6\x44\x07\xa2\x23\xd1\x89\xe8\x4c\x74\x21\xba\x12\xdd\x88\xee\x44\x0f\xa2\x27\xd1\x8b\xe8\x4d\xf4\x21\xfa\x12\xfd\x88\xfe\xc4\x00\x62\x20\x31\x88\x18\x4c\x0c\x21\x86\x12\xc3\x88\xe1\xc4\x08\x62\x24\x31\x8a\x18\x4d\x8c\x21\xc6\x12\xe3\x88\xf1\xc4\x04\x62\x22\x31\x89\x98\x4c\x4c\x21\xa6\x12\xd3\x88\xe9\xc4\x0c\x62\x26\x31\x8b\x98\x4d\xcc\x21\xe6\x12\xf3\x88\xf9\xc4\x02\x62\x21\xb1\x88\x58\x4c\x2c\x21\x96\x12\xcb\x88\xe5\xc4\x0a\x62\x25\xb1\x8a\x58\x4d\xac\x21\xd6\x12\xeb\x88\xf5\xc4\x06\x62\x23\xb1\x89\xd8\x4c\x6c\x21\xb6\x12\xdb\x88\xed\xc4\x0e\x62\x27\xb1\x8b\xd8\x4d\xec\x21\xf6\x12\xfb\x88\xfd\xc4\x01\xe2\x20\x71\x88\x38\x4c\x1c\x21\x8e\x12\xc7\x88\xe3\xc4\x09\xe2\x24\x71\x8a\x38\x4d\x9c\x21\xce\x12\xe7\x88\xf3\xc4\x05\xe2\x22\x71\x89\xb8\x4c\x5c\x21\xae\x12\xd7\x88\xeb\xc4\x0d\xe2\x26\x71\x8b\xb8\x4d\xdc\x21\xee\x12\xf7\x88\xfb\xc4\x03\xe2\x21\xf1\x88\x78\x4c\x3c\x21\x9e\x12\xcf\x88\xe7\xc4\x0b\xe2\x25\xf1\x8a\x78\x4d\xbc\x21\xde\x12\xef\x88\xf7\xc4\x07\xe2\x23\xf1\x89\xf8\x4c\x7c\x21\xbe\x12\xdf\x88\xef\xc4\x0f\xe2\x27\xf1\x8b\xf8\x4d\xfc\x21\xfe\x12\xff\x88\x38\x22\x9e\x48\x20\x12\xc9\x24\x64\x52\x32\x19\x99\x9c\x4c\x41\xa6\x24\x53\x91\xa9\xc9\x34\x64\x5a\x32\x1d\x99\x9e\xcc\x40\x66\x24\x33\x91\x99\xc9\x2c\x64\x56\x32\x1b\x99\x9d\xcc\x41\xe6\x24\x73\x91\xb9\xc9\x3c\x64\x5e\x32\x1f\x89\x91\x38\x49\x90\x24\x49\x91\x34\xc9\x90\x2c\xc9\x91\x3c\x29\x90\x22\x29\x91\x32\xa9\x90\x2a\xa9\x91\x3a\x69\x90\x26\x69\x91\x36\xe9\x90\x2e\xe9\x91\x3e\x19\x90\x21\x19\x91\x80\x84\x24\x22\x63\x64\x7e\xb2\x00\x59\x90\x2c\x44\x16\x26\x8b\x90\x45\xc9\x62\x64\x71\xb2\x04\x59\x92\x2c\x45\x96\x26\xcb\x90\x65\xc9\x72\x64\x79\xb2\x02\x59\x91\xac\x44\x56\x26\xab\x90\x55\xc9\x6a\x64\x75\xb2\x06\x59\x93\xac\x45\xd6\x26\xeb\x90\x75\xc9\x7a\x64\x7d\xb2\x01\xd9\x90\x6c\x44\x36\x26\x9b\x90\x4d\xc9\x66\x64\x73\xb2\x05\xd9\x92\x6c\x45\xb6\x26\xdb\x90\x6d\xc9\x76\x64\x7b\xb2\x03\xd9\x91\xec\x44\x76\x26\xbb\x90\x5d\xc9\x6e\x64\x77\xb2\x07\xd9\x93\xec\x45\xf6\x26\xfb\x90\x7d\xc9\x7e\x64\x7f\x72\x00\x39\x90\x1c\x44\x0e\x26\x87\x90\x43\xc9\x61\xe4\x70\x72\x04\x39\x92\x1c\x45\x8e\x26\xc7\x90\x63\xc9\x71\xe4\x78\x72\x02\x39\x91\x9c\x44\x4e\x26\xa7\x90\x53\xc9\x69\xe4\x74\x72\x06\x39\x93\x9c\x45\xce\x26\xe7\x90\x73\xc9\x79\xe4\x7c\x72\x01\xb9\x90\x5c\x44\x2e\x26\x97\x90\x4b\xc9\x65\xe4\x72\x72\x05\xb9\x92\x5c\x45\xae\x26\xd7\x90\x6b\xc9\x75\xe4\x7a\x72\x03\xb9\x91\xdc\x44\x6e\x26\xb7\x90\x5b\xc9\x6d\xe4\x76\x72\x07\xb9\x93\xdc\x45\xee\x26\xf7\x90\x7b\xc9\x7d\xe4\x7e\xf2\x00\x79\x90\x3c\x44\x1e\x26\x8f\x90\x47\xc9\x63\xe4\x71\xf2\x04\x79\x92\x3c\x45\x9e\x26\xcf\x90\x67\xc9\x73\xe4\x79\xf2\x02\x79\x91\xbc\x44\x5e\x26\xaf\x90\x57\xc9\x6b\xe4\x75\xf2\x06\x79\x93\xbc\x45\xde\x26\xef\x90\x77\xc9\x7b\xe4\x7d\xf2\x01\xf9\x90\x7c\x44\x3e\x26\x9f\x90\x4f\xc9\x67\xe4\x73\xf2\x05\xf9\x92\x7c\x45\xbe\x26\xdf\x90\x6f\xc9\x77\xe4\x7b\xf2\x03\xf9\x91\xfc\x44\x7e\x26\xbf\x90\x5f\xc9\x6f\xe4\x77\xf2\x07\xf9\x93\xfc\x45\xfe\x26\xff\x90\x7f\xc9\x7f\x64\x1c\x19\x4f\x26\x90\x89\x54\x12\x2a\x29\x95\x8c\x4a\x4e\xa5\xa0\x52\x52\xa9\xa8\xd4\x54\x1a\x2a\x2d\x95\x8e\x4a\x4f\x65\xa0\x32\x52\x99\xa8\xcc\x54\x16\x2a\x2b\x95\x8d\xca\x4e\xe5\xa0\x72\x52\xb9\xa8\xdc\x54\x1e\x2a\x2f\x95\x8f\xc2\x28\x9c\x22\x28\x92\xa2\x28\x9a\x62\x28\x96\xe2\x28\x9e\x12\x28\x91\x92\x28\x99\x52\x28\x95\xd2\x28\x9d\x32\x28\x93\xb2\x28\x9b\x72\x28\x97\xf2\x28\x9f\x0a\xa8\x90\x8a\x28\x40\x41\x0a\x51\x31\x2a\x3f\x55\x80\x2a\x48\x15\xa2\x0a\x53\x45\xa8\xa2\x54\x31\xaa\x38\x55\x82\x2a\x49\x95\xa2\x4a\x53\x65\xa8\xb2\x54\x39\xaa\x3c\x55\x81\xaa\x48\x55\xa2\x2a\x53\x55\xa8\xaa\x54\x35\xaa\x3a\x55\x83\xaa\x49\xd5\xa2\x6a\x53\x75\xa8\xba\x54\x3d\xaa\x3e\xd5\x80\x6a\x48\x35\xa2\x1a\x53\x4d\xa8\xa6\x54\x33\xaa\x39\xd5\x82\x6a\x49\xb5\xa2\x5a\x53\x6d\xa8\xb6\x54\x3b\xaa\x3d\xd5\x81\xea\x48\x75\xa2\x3a\x53\x5d\xa8\xae\x54\x37\xaa\x3b\xd5\x83\xea\x49\xf5\xa2\x7a\x53\x7d\xa8\xbe\x54\x3f\xaa\x3f\x35\x80\x1a\x48\x0d\xa2\x06\x53\x43\xa8\xa1\xd4\x30\x6a\x38\x35\x82\x1a\x49\x8d\xa2\x46\x53\x63\xa8\xb1\xd4\x38\x6a\x3c\x35\x81\x9a\x48\x4d\xa2\x26\x53\x53\xa8\xa9\xd4\x34\x6a\x3a\x35\x83\x9a\x49\xcd\xa2\x66\x53\x73\xa8\xb9\xd4\x3c\x6a\x3e\xb5\x80\x5a\x48\x2d\xa2\x16\x53\x4b\xa8\xa5\xd4\x32\x6a\x39\xb5\x82\x5a\x49\xad\xa2\x56\x53\x6b\xa8\xb5\xd4\x3a\x6a\x3d\xb5\x81\xda\x48\x6d\xa2\x36\x53\x5b\xa8\xad\xd4\x36\x6a\x3b\xb5\x83\xda\x49\xed\xa2\x76\x53\x7b\xa8\xbd\xd4\x3e\x6a\x3f\x75\x80\x3a\x48\x1d\xa2\x0e\x53\x47\xa8\xa3\xd4\x31\xea\x38\x75\x82\x3a\x49\x9d\xa2\x4e\x53\x67\xa8\xb3\xd4\x39\xea\x3c\x75\x81\xba\x48\x5d\xa2\x2e\x53\x57\xa8\xab\xd4\x35\xea\x3a\x75\x83\xba\x49\xdd\xa2\x6e\x53\x77\xa8\xbb\xd4\x3d\xea\x3e\xf5\x80\x7a\x48\x3d\xa2\x1e\x53\x4f\xa8\xa7\xd4\x33\xea\x39\xf5\x82\x7a\x49\xbd\xa2\x5e\x53\x6f\xa8\xb7\xd4\x3b\xea\x3d\xf5\x81\xfa\x48\x7d\xa2\x3e\x53\x5f\xa8\xaf\xd4\x37\xea\x3b\xf5\x83\xfa\x49\xfd\xa2\x7e\x53\x7f\xa8\xbf\xd4\x3f\x2a\x8e\x8a\xa7\x12\xa8\x44\x3a\x09\x9d\x94\x4e\x46\x27\xa7\x53\xd0\x29\xe9\x54\x74\x6a\x3a\x0d\x9d\x96\x4e\x47\xa7\xa7\x33\xd0\x19\xe9\x4c\x74\x66\x3a\x0b\x9d\x95\xce\x46\x67\xa7\x73\xd0\x39\xe9\x5c\x74\x6e\x3a\x0f\x9d\x97\xce\x47\x63\x34\x4e\x13\x34\x49\x53\x34\x4d\x33\x34\x4b\x73\x34\x4f\x0b\xb4\x48\x4b\xb4\x4c\x2b\xb4\x4a\x6b\xb4\x4e\x1b\xb4\x49\x5b\xb4\x4d\x3b\xb4\x4b\x7b\xb4\x4f\x07\x74\x48\x47\x34\xa0\x21\x8d\xe8\x18\x9d\x9f\x2e\x40\x17\xa4\x0b\xd1\x85\xe9\x22\x74\x51\xba\x18\x5d\x9c\x2e\x41\x97\xa4\x4b\xd1\xa5\xe9\x32\x74\x59\xba\x1c\x5d\x9e\xae\x40\x57\xa4\x2b\xd1\x95\xe9\x2a\x74\x55\xba\x1a\x5d\x9d\xae\x41\xd7\xa4\x6b\xd1\xb5\xe9\x3a\x74\x5d\xba\x1e\x5d\x9f\x6e\x40\x37\xa4\x1b\xd1\x8d\xe9\x26\x74\x53\xba\x19\xdd\x9c\x6e\x41\xb7\xa4\x5b\xd1\xad\xe9\x36\x74\x5b\xba\x1d\xdd\x9e\xee\x40\x77\xa4\x3b\xd1\x9d\xe9\x2e\x74\x57\xba\x1b\xdd\x9d\xee\x41\xf7\xa4\x7b\xd1\xbd\xe9\x3e\x74\x5f\xba\x1f\xdd\x9f\x1e\x40\x0f\xa4\x07\xd1\x83\xe9\x21\xf4\x50\x7a\x18\x3d\x9c\x1e\x41\x8f\xa4\x47\xd1\xa3\xe9\x31\xf4\x58\x7a\x1c\x3d\x9e\x9e\x40\x4f\xa4\x27\xd1\x93\xe9\x29\xf4\x54\x7a\x1a\x3d\x9d\x9e\x41\xcf\xa4\x67\xd1\xb3\xe9\x39\xf4\x5c\x7a\x1e\x3d\x9f\x5e\x40\x2f\xa4\x17\xd1\x8b\xe9\x25\xf4\x52\x7a\x19\xbd\x9c\x5e\x41\xaf\xa4\x57\xd1\xab\xe9\x35\xf4\x5a\x7a\x1d\xbd\x9e\xde\x40\x6f\xa4\x37\xd1\x9b\xe9\x2d\xf4\x56\x7a\x1b\xbd\x9d\xde\x41\xef\xa4\x77\xd1\xbb\xe9\x3d\xf4\x5e\x7a\x1f\xbd\x9f\x3e\x40\x1f\xa4\x0f\xd1\x87\xe9\x23\xf4\x51\xfa\x18\x7d\x9c\x3e\x41\x9f\xa4\x4f\xd1\xa7\xe9\x33\xf4\x59\xfa\x1c\x7d\x9e\xbe\x40\x5f\xa4\x2f\xd1\x97\xe9\x2b\xf4\x55\xfa\x1a\x7d\x9d\xbe\x41\xdf\xa4\x6f\xd1\xb7\xe9\x3b\xf4\x5d\xfa\x1e\x7d\x9f\x7e\x40\x3f\xa4\x1f\xd1\x8f\xe9\x27\xf4\x53\xfa\x19\xfd\x9c\x7e\x41\xbf\xa4\x5f\xd1\xaf\xe9\x37\xf4\x5b\xfa\x1d\xfd\x9e\xfe\x40\x7f\xa4\x3f\xd1\x9f\xe9\x2f\xf4\x57\xfa\x1b\xfd\x9d\xfe\x41\xff\xa4\x7f\xd1\xbf\xe9\x3f\xf4\x5f\xfa\x1f\x1d\x47\xc7\xd3\x09\x74\x22\x93\x84\x49\xca\x24\x63\x92\x33\x29\x98\x94\x4c\x2a\x26\x35\x93\x86\x49\xcb\xa4\x63\xd2\x33\x19\x98\x8c\x4c\x26\x26\x33\x93\x85\xc9\xca\x64\x63\xb2\x33\x39\x98\x9c\x4c\x2e\x26\x37\x93\x87\xc9\xcb\xe4\x63\x30\x06\x67\x08\x86\x64\x28\x86\x66\x18\x86\x65\x38\x86\x67\x04\x46\x64\x24\x46\x66\x14\x46\x65\x34\x46\x67\x0c\xc6\x64\x2c\xc6\x66\x1c\xc6\x65\x3c\xc6\x67\x02\x26\x64\x22\x06\x30\x90\x41\x4c\x8c\xc9\xcf\x14\x60\x0a\x32\x85\x98\xc2\x4c\x11\xa6\x28\x53\x8c\x29\xce\x94\x60\x4a\x32\xa5\x98\xd2\x4c\x19\xa6\x2c\x53\x8e\x29\xcf\x54\x60\x2a\x32\x95\x98\xca\x4c\x15\xa6\x2a\x53\x8d\xa9\xce\xd4\x60\x6a\x32\xb5\x98\xda\x4c\x1d\xa6\x2e\x53\x8f\xa9\xcf\x34\x60\x1a\x32\x8d\x98\xc6\x4c\x13\xa6\x29\xd3\x8c\x69\xce\xb4\x60\x5a\x32\xad\x98\xd6\x4c\x1b\xa6\x2d\xd3\x8e\x69\xcf\x74\x60\x3a\x32\x9d\x98\xce\x4c\x17\xa6\x2b\xd3\x8d\xe9\xce\xf4\x60\x7a\x32\xbd\x98\xde\x4c\x1f\xa6\x2f\xd3\x8f\xe9\xcf\x0c\x60\x06\x32\x83\x98\xc1\xcc\x10\x66\x28\x33\x8c\x19\xce\x8c\x60\x46\x32\xa3\x98\xd1\xcc\x18\x66\x2c\x33\x8e\x19\xcf\x4c\x60\x26\x32\x93\x98\xc9\xcc\x14\x66\x2a\x33\x8d\x99\xce\xcc\x60\x66\x32\xb3\x98\xd9\xcc\x1c\x66\x2e\x33\x8f\x99\xcf\x2c\x60\x16\x32\x8b\x98\xc5\xcc\x12\x66\x29\xb3\x8c\x59\xce\xac\x60\x56\x32\xab\x98\xd5\xcc\x1a\x66\x2d\xb3\x8e\x59\xcf\x6c\x60\x36\x32\x9b\x98\xcd\xcc\x16\x66\x2b\xb3\x8d\xd9\xce\xec\x60\x76\x32\xbb\x98\xdd\xcc\x1e\x66\x2f\xb3\x8f\xd9\xcf\x1c\x60\x0e\x32\x87\x98\xc3\xcc\x11\xe6\x28\x73\x8c\x39\xce\x9c\x60\x4e\x32\xa7\x98\xd3\xcc\x19\xe6\x2c\x73\x8e\x39\xcf\x5c\x60\x2e\x32\x97\x98\xcb\xcc\x15\xe6\x2a\x73\x8d\xb9\xce\xdc\x60\x6e\x32\xb7\x98\xdb\xcc\x1d\xe6\x2e\x73\x8f\xb9\xcf\x3c\x60\x1e\x32\x8f\x98\xc7\xcc\x13\xe6\x29\xf3\x8c\x79\xce\xbc\x60\x5e\x32\xaf\x98\xd7\xcc\x1b\xe6\x2d\xf3\x8e\x79\xcf\x7c\x60\x3e\x32\x9f\x98\xcf\xcc\x17\xe6\x2b\xf3\x8d\xf9\xce\xfc\x60\x7e\x32\xbf\x98\xdf\xcc\x1f\xe6\x2f\xf3\x8f\x89\x63\xe2\x99\x04\x26\x91\x4d\xc2\x26\x65\x93\xb1\xc9\xd9\x14\x6c\x4a\x36\x15\x9b\x9a\x4d\xc3\xa6\x65\xd3\xb1\xe9\xd9\x0c\x6c\x46\x36\x13\x9b\x99\xcd\xc2\x66\x65\xb3\xb1\xd9\xd9\x1c\x6c\x4e\x36\x17\x9b\x9b\xcd\xc3\xe6\x65\xf3\xb1\x18\x8b\xb3\x04\x4b\xb2\x14\x4b\xb3\x0c\xcb\xb2\x1c\xcb\xb3\x02\x2b\xb2\x12\x2b\xb3\x0a\xab\xb2\x1a\xab\xb3\x06\x6b\xb2\x16\x6b\xb3\x0e\xeb\xb2\x1e\xeb\xb3\x01\x1b\xb2\x11\x0b\x58\xc8\x22\x36\xc6\xe6\x67\x0b\xb0\x05\xd9\x42\x6c\x61\xb6\x08\x5b\x94\x2d\xc6\x16\x67\x4b\xb0\x25\xd9\x52\x6c\x69\xb6\x0c\x5b\x96\x2d\xc7\x96\x67\x2b\xb0\x15\xd9\x4a\x6c\x65\xb6\x0a\x5b\x95\xad\xc6\x56\x67\x6b\xb0\x35\xd9\x5a\x6c\x6d\xb6\x0e\x5b\x97\xad\xc7\xd6\x67\x1b\xb0\x0d\xd9\x46\x6c\x63\xb6\x09\xdb\x94\x6d\xc6\x36\x67\x5b\xb0\x2d\xd9\x56\x6c\x6b\xb6\x0d\xdb\x96\x6d\xc7\xb6\x67\x3b\xb0\x1d\xd9\x4e\x6c\x67\xb6\x0b\xdb\x95\xed\xc6\x76\x67\x7b\xb0\x3d\xd9\x5e\x6c\x6f\xb6\x0f\xdb\x97\xed\xc7\xf6\x67\x07\xb0\x03\xd9\x41\xec\x60\x76\x08\x3b\x94\x1d\xc6\x0e\x67\x47\xb0\x23\xd9\x51\xec\x68\x76\x0c\x3b\x96\x1d\xc7\x8e\x67\x27\xb0\x13\xd9\x49\xec\x64\x76\x0a\x3b\x95\x9d\xc6\x4e\x67\x67\xb0\x33\xd9\x59\xec\x6c\x76\x0e\x3b\x97\x9d\xc7\xce\x67\x17\xb0\x0b\xd9\x45\xec\x62\x76\x09\xbb\x94\x5d\xc6\x2e\x67\x57\xb0\x2b\xd9\x55\xec\x6a\x76\x0d\xbb\x96\x5d\xc7\xae\x67\x37\xb0\x1b\xd9\x4d\xec\x66\x76\x0b\xbb\x95\xdd\xc6\x6e\x67\x77\xb0\x3b\xd9\x5d\xec\x6e\x76\x0f\xbb\x97\xdd\xc7\xee\x67\x0f\xb0\x07\xd9\x43\xec\x61\xf6\x08\x7b\x94\x3d\xc6\x1e\x67\x4f\xb0\x27\xd9\x53\xec\x69\xf6\x0c\x7b\x96\x3d\xc7\x9e\x67\x2f\xb0\x17\xd9\x4b\xec\x65\xf6\x0a\x7b\x95\xbd\xc6\x5e\x67\x6f\xb0\x37\xd9\x5b\xec\x6d\xf6\x0e\x7b\x97\xbd\xc7\xde\x67\x1f\xb0\x0f\xd9\x47\xec\x63\xf6\x09\xfb\x94\x7d\xc6\x3e\x67\x5f\xb0\x2f\xd9\x57\xec\x6b\xf6\x0d\xfb\x96\x7d\xc7\xbe\x67\x3f\xb0\x1f\xd9\x4f\xec\x67\xf6\x0b\xfb\x95\xfd\xc6\x7e\x67\x7f\xb0\x3f\xd9\x5f\xec\x6f\xf6\x0f\xfb\x97\xfd\xc7\xc6\xb1\xf1\x6c\x02\x9b\xc8\x25\xe1\x92\x72\xc9\xb8\xe4\x5c\x0a\x2e\x25\x97\x8a\x4b\xcd\xa5\xe1\xd2\x72\xe9\xb8\xf4\x5c\x06\x2e\x23\x97\x89\xcb\xcc\x65\xe1\xb2\x72\xd9\xb8\xec\x5c\x0e\x2e\x27\x97\x8b\xcb\xcd\xe5\xe1\xf2\x72\xf9\x38\x8c\xc3\x39\x82\x23\x39\x8a\xa3\x39\x86\x63\x39\x8e\xe3\x39\x81\x13\x39\x89\x93\x39\x85\x53\x39\x8d\xd3\x39\x83\x33\x39\x8b\xb3\x39\x87\x73\x39\x8f\xf3\xb9\x80\x0b\xb9\x88\x03\x1c\xe4\x10\x17\xe3\xf2\x73\x05\xb8\x82\x5c\x21\xae\x30\x57\x84\x2b\xca\x15\xe3\x8a\x73\x25\xb8\x92\x5c\x29\xae\x34\x57\x86\x2b\xcb\x95\xe3\xca\x73\x15\xb8\x8a\x5c\x25\xae\x32\x57\x85\xab\xca\x55\xe3\xaa\x73\x35\xb8\x9a\x5c\x2d\xae\x36\x57\x87\xab\xcb\xd5\xe3\xea\x73\x0d\xb8\x86\x5c\x23\xae\x31\xd7\x84\x6b\xca\x35\xe3\x9a\x73\x2d\xb8\x96\x5c\x2b\xae\x35\xd7\x86\x6b\xcb\xb5\xe3\xda\x73\x1d\xb8\x8e\x5c\x27\xae\x33\xd7\x85\xeb\xca\x75\xe3\xba\x73\x3d\xb8\x9e\x5c\x2f\xae\x37\xd7\x87\xeb\xcb\xf5\xe3\xfa\x73\x03\xb8\x81\xdc\x20\x6e\x30\x37\x84\x1b\xca\x0d\xe3\x86\x73\x23\xb8\x91\xdc\x28\x6e\x34\x37\x86\x1b\xcb\x8d\xe3\xc6\x73\x13\xb8\x89\xdc\x24\x6e\x32\x37\x85\x9b\xca\x4d\xe3\xa6\x73\x33\xb8\x99\xdc\x2c\x6e\x36\x37\x87\x9b\xcb\xcd\xe3\xe6\x73\x0b\xb8\x85\xdc\x22\x6e\x31\xb7\x84\x5b\xca\x2d\xe3\x96\x73\x2b\xb8\x95\xdc\x2a\x6e\x35\xb7\x86\x5b\xcb\xad\xe3\xd6\x73\x1b\xb8\x8d\xdc\x26\x6e\x33\xb7\x85\xdb\xca\x6d\xe3\xb6\x73\x3b\xb8\x9d\xdc\x2e\x6e\x37\xb7\x87\xdb\xcb\xed\xe3\xf6\x73\x07\xb8\x83\xdc\x21\xee\x30\x77\x84\x3b\xca\x1d\xe3\x8e\x73\x27\xb8\x93\xdc\x29\xee\x34\x77\x86\x3b\xcb\x9d\xe3\xce\x73\x17\xb8\x8b\xdc\x25\xee\x32\x77\x85\xbb\xca\x5d\xe3\xae\x73\x37\xb8\x9b\xdc\x2d\xee\x36\x77\x87\xbb\xcb\xdd\xe3\xee\x73\x0f\xb8\x87\xdc\x23\xee\x31\xf7\x84\x7b\xca\x3d\xe3\x9e\x73\x2f\xb8\x97\xdc\x2b\xee\x35\xf7\x86\x7b\xcb\xbd\xe3\xde\x73\x1f\xb8\x8f\xdc\x27\xee\x33\xf7\x85\xfb\xca\x7d\xe3\xbe\x73\x3f\xb8\x9f\xdc\x2f\xee\x37\xf7\x87\xfb\xcb\xfd\xe3\xe2\xb8\x78\x2e\x81\x4b\xe4\x93\xf0\x49\xf9\x64\x7c\x72\x3e\x05\x9f\x92\x4f\xc5\xa7\xe6\xd3\xf0\x69\xf9\x74\x7c\x7a\x3e\x03\x9f\x91\xcf\xc4\x67\xe6\xb3\xf0\x59\xf9\x6c\x7c\x76\x3e\x07\x9f\x93\xcf\xc5\xe7\xe6\xf3\xf0\x79\xf9\x7c\x3c\xc6\xe3\x3c\xc1\x93\x3c\xc5\xd3\x3c\xc3\xb3\x3c\xc7\xf3\xbc\xc0\x8b\xbc\xc4\xcb\xbc\xc2\xab\xbc\xc6\xeb\xbc\xc1\x9b\xbc\xc5\xdb\xbc\xc3\xbb\xbc\xc7\xfb\x7c\xc0\x87\x7c\xc4\x03\x1e\xf2\x88\x8f\xf1\xf9\xf9\x02\x7c\x41\xbe\x10\x5f\x98\x2f\xc2\x17\xe5\x8b\xf1\xc5\xf9\x12\x7c\x49\xbe\x14\x5f\x9a\x2f\xc3\x97\xe5\xcb\xf1\xe5\xf9\x0a\x7c\x45\xbe\x12\x5f\x99\xaf\xc2\x57\xe5\xab\xf1\xd5\xf9\x1a\x7c\x4d\xbe\x16\x5f\x9b\xaf\xc3\xd7\xe5\xeb\xf1\xf5\xf9\x06\x7c\x43\xbe\x11\xdf\x98\x6f\xc2\x37\xe5\x9b\xf1\xcd\xf9\x16\x7c\x4b\xbe\x15\xdf\x9a\x6f\xc3\xb7\xe5\xdb\xf1\xed\xf9\x0e\x7c\x47\xbe\x13\xdf\x99\xef\xc2\x77\xe5\xbb\xf1\xdd\xf9\x1e\x7c\x4f\xbe\x17\xdf\x9b\xef\xc3\xf7\xe5\xfb\xf1\xfd\xf9\x01\xfc\x40\x7e\x10\x3f\x98\x1f\xc2\x0f\xe5\x87\xf1\xc3\xf9\x11\xfc\x48\x7e\x14\x3f\x9a\x1f\xc3\x8f\xe5\xc7\xf1\xe3\xf9\x09\xfc\x44\x7e\x12\x3f\x99\x9f\xc2\x4f\xe5\xa7\xf1\xd3\xf9\x19\xfc\x4c\x7e\x16\x3f\x9b\x9f\xc3\xcf\xe5\xe7\xf1\xf3\xf9\x05\xfc\x42\x7e\x11\xbf\x98\x5f\xc2\x2f\xe5\x97\xf1\xcb\xf9\x15\xfc\x4a\x7e\x15\xbf\x9a\x5f\xc3\xaf\xe5\xd7\xf1\xeb\xf9\x0d\xfc\x46\x7e\x13\xbf\x99\xdf\xc2\x6f\xe5\xb7\xf1\xdb\xf9\x1d\xfc\x4e\x7e\x17\xbf\x9b\xdf\xc3\xef\xe5\xf7\xf1\xfb\xf9\x03\xfc\x41\xfe\x10\x7f\x98\x3f\xc2\x1f\xe5\x8f\xf1\xc7\xf9\x13\xfc\x49\xfe\x14\x7f\x9a\x3f\xc3\x9f\xe5\xcf\xf1\xe7\xf9\x0b\xfc\x45\xfe\x12\x7f\x99\xbf\xc2\x5f\xe5\xaf\xf1\xd7\xf9\x1b\xfc\x4d\xfe\x16\x7f\x9b\xbf\xc3\xdf\xe5\xef\xf1\xf7\xf9\x07\xfc\x43\xfe\x11\xff\x98\x7f\xc2\x3f\xe5\x9f\xf1\xcf\xf9\x17\xfc\x4b\xfe\x15\xff\x9a\x7f\xc3\xbf\xe5\xdf\xf1\xef\xf9\x0f\xfc\x47\xfe\x13\xff\x99\xff\xc2\x7f\xe5\xbf\xf1\xdf\xf9\x1f\xfc\x4f\xfe\x17\xff\x9b\xff\xc3\xff\xe5\xff\xf1\x71\x7c\x3c\x9f\xc0\x27\x0a\x49\x84\xa4\x42\x32\x21\xb9\x90\x42\x48\x29\xa4\x12\x52\x0b\x69\x84\xb4\x42\x3a\x21\xbd\x90\x41\xc8\x28\x64\x12\x32\x0b\x59\x84\xac\x42\x36\x21\xbb\x90\x43\xc8\x29\xe4\x12\x72\x0b\x79\x84\xbc\x42\x3e\x01\x13\x70\x81\x10\x48\x81\x12\x68\x81\x11\x58\x81\x13\x78\x41\x10\x44\x41\x12\x64\x41\x11\x54\x41\x13\x74\xc1\x10\x4c\xc1\x12\x6c\xc1\x11\x5c\xc1\x13\x7c\x21\x10\x42\x21\x12\x80\x00\x05\x24\xc4\x84\xfc\x42\x01\xa1\xa0\x50\x48\x28\x2c\x14\x11\x8a\x0a\xc5\x84\xe2\x42\x09\xa1\xa4\x50\x4a\x28\x2d\x94\x11\xca\x0a\xe5\x84\xf2\x42\x05\xa1\xa2\x50\x49\xa8\x2c\x54\x11\xaa\x0a\xd5\x84\xea\x42\x0d\xa1\xa6\x50\x4b\xa8\x2d\xd4\x11\xea\x0a\xf5\x84\xfa\x42\x03\xa1\xa1\xd0\x48\x68\x2c\x34\x11\x9a\x0a\xcd\x84\xe6\x42\x0b\xa1\xa5\xd0\x4a\x68\x2d\xb4\x11\xda\x0a\xed\x84\xf6\x42\x07\xa1\xa3\xd0\x49\xe8\x2c\x74\x11\xba\x0a\xdd\x84\xee\x42\x0f\xa1\xa7\xd0\x4b\xe8\x2d\xf4\x11\xfa\x0a\xfd\x84\xfe\xc2\x00\x61\xa0\x30\x48\x18\x2c\x0c\x11\x86\x0a\xc3\x84\xe1\xc2\x08\x61\xa4\x30\x4a\x18\x2d\x8c\x11\xc6\x0a\xe3\x84\xf1\xc2\x04\x61\xa2\x30\x49\x98\x2c\x4c\x11\xa6\x0a\xd3\x84\xe9\xc2\x0c\x61\xa6\x30\x4b\x98\x2d\xcc\x11\xe6\x0a\xf3\x84\xf9\xc2\x02\x61\xa1\xb0\x48\x58\x2c\x2c\x11\x96\x0a\xcb\x84\xe5\xc2\x0a\x61\xa5\xb0\x4a\x58\x2d\xac\x11\xd6\x0a\xeb\x84\xf5\xc2\x06\x61\xa3\xb0\x49\xd8\x2c\x6c\x11\xb6\x0a\xdb\x84\xed\xc2\x0e\x61\xa7\xb0\x4b\xd8\x2d\xec\x11\xf6\x0a\xfb\x84\xfd\xc2\x01\xe1\xa0\x70\x48\x38\x2c\x1c\x11\x8e\x0a\xc7\x84\xe3\xc2\x09\xe1\xa4\x70\x4a\x38\x2d\x9c\x11\xce\x0a\xe7\x84\xf3\xc2\x05\xe1\xa2\x70\x49\xb8\x2c\x5c\x11\xae\x0a\xd7\x84\xeb\xc2\x0d\xe1\xa6\x70\x4b\xb8\x2d\xdc\x11\xee\x0a\xf7\x84\xfb\xc2\x03\xe1\xa1\xf0\x48\x78\x2c\x3c\x11\x9e\x0a\xcf\x84\xe7\xc2\x0b\xe1\xa5\xf0\x4a\x78\x2d\xbc\x11\xde\x0a\xef\x84\xf7\xc2\x07\xe1\xa3\xf0\x49\xf8\x2c\x7c\x11\xbe\x0a\xdf\x84\xef\xc2\x0f\xe1\xa7\xf0\x4b\xf8\x2d\xfc\x11\xfe\x0a\xff\x84\x38\x21\x5e\x48\x10\x12\xc5\x24\x62\x52\x31\x99\x98\x5c\x4c\x21\xa6\x14\x53\x89\xa9\xc5\x34\x62\x5a\x31\x9d\x98\x5e\xcc\x20\x66\x14\x33\x89\x99\xc5\x2c\x62\x56\x31\x9b\x98\x5d\xcc\x21\xe6\x14\x73\x89\xb9\xc5\x3c\x62\x5e\x31\x9f\x88\x89\xb8\x48\x88\xa4\x48\x89\xb4\xc8\x88\xac\xc8\x89\xbc\x28\x88\xa2\x28\x89\xb2\xa8\x88\xaa\xa8\x89\xba\x68\x88\xa6\x68\x89\xb6\xe8\x88\xae\xe8\x89\xbe\x18\x88\xa1\x18\x89\x40\x84\x22\x12\x63\x62\x7e\xb1\x80\x58\x50\x2c\x24\x16\x16\x8b\x88\x45\xc5\x62\x62\x71\xb1\x84\x58\x52\x2c\x25\x96\x16\xcb\x88\x65\xc5\x72\x62\x79\xb1\x82\x58\x51\xac\x24\x56\x16\xab\x88\x55\xc5\x6a\x62\x75\xb1\x86\x58\x53\xac\x25\xd6\x16\xeb\x88\x75\xc5\x7a\x62\x7d\xb1\x81\xd8\x50\x6c\x24\x36\x16\x9b\x88\x4d\xc5\x66\x62\x73\xb1\x85\xd8\x52\x6c\x25\xb6\x16\xdb\x88\x6d\xc5\x76\x62\x7b\xb1\x83\xd8\x51\xec\x24\x76\x16\xbb\x88\x5d\xc5\x6e\x62\x77\xb1\x87\xd8\x53\xec\x25\xf6\x16\xfb\x88\x7d\xc5\x7e\x62\x7f\x71\x80\x38\x50\x1c\x24\x0e\x16\x87\x88\x43\xc5\x61\xe2\x70\x71\x84\x38\x52\x1c\x25\x8e\x16\xc7\x88\x63\xc5\x71\xe2\x78\x71\x82\x38\x51\x9c\x24\x4e\x16\xa7\x88\x53\xc5\x69\xe2\x74\x71\x86\x38\x53\x9c\x25\xce\x16\xe7\x88\x73\xc5\x79\xe2\x7c\x71\x81\xb8\x50\x5c\x24\x2e\x16\x97\x88\x4b\xc5\x65\xe2\x72\x71\x85\xb8\x52\x5c\x25\xae\x16\xd7\x88\x6b\xc5\x75\xe2\x7a\x71\x83\xb8\x51\xdc\x24\x6e\x16\xb7\x88\x5b\xc5\x6d\xe2\x76\x71\x87\xb8\x53\xdc\x25\xee\x16\xf7\x88\x7b\xc5\x7d\xe2\x7e\xf1\x80\x78\x50\x3c\x24\x1e\x16\x8f\x88\x47\xc5\x63\xe2\x71\xf1\x84\x78\x52\x3c\x25\x9e\x16\xcf\x88\x67\xc5\x73\xe2\x79\xf1\x82\x78\x51\xbc\x24\x5e\x16\xaf\x88\x57\xc5\x6b\xe2\x75\xf1\x86\x78\x53\xbc\x25\xde\x16\xef\x88\x77\xc5\x7b\xe2\x7d\xf1\x81\xf8\x50\x7c\x24\x3e\x16\x9f\x88\x4f\xc5\x67\xe2\x73\xf1\x85\xf8\x52\x7c\x25\xbe\x16\xdf\x88\x6f\xc5\x77\xe2\x7b\xf1\x83\xf8\x51\xfc\x24\x7e\x16\xbf\x88\x5f\xc5\x6f\xe2\x77\xf1\x87\xf8\x53\xfc\x25\xfe\x16\xff\x88\x7f\xc5\x7f\x62\x9c\x18\x2f\x26\x88\x89\x52\x12\x29\xa9\x94\x4c\x4a\x2e\xa5\x90\x52\x4a\xa9\xa4\xd4\x52\x1a\x29\xad\x94\x4e\x4a\x2f\x65\x90\x32\x4a\x99\xa4\xcc\x52\x16\x29\xab\x94\x4d\xca\x2e\xe5\x90\x72\x4a\xb9\xa4\xdc\x52\x1e\x29\xaf\x94\x4f\xc2\x24\x5c\x22\x24\x52\xa2\x24\x5a\x62\x24\x56\xe2\x24\x5e\x12\x24\x51\x92\x24\x59\x52\x24\x55\xd2\x24\x5d\x32\x24\x53\xb2\x24\x5b\x72\x24\x57\xf2\x24\x5f\x0a\xa4\x50\x8a\x24\x20\x41\x09\x49\x31\x29\xbf\x54\x40\x2a\x28\x15\x92\x0a\x4b\x45\xa4\xa2\x52\x31\xa9\xb8\x54\x42\x2a\x29\x95\x92\x4a\x4b\x65\xa4\xb2\x52\x39\xa9\xbc\x54\x41\xaa\x28\x55\x92\x2a\x4b\x55\xa4\xaa\x52\x35\xa9\xba\x54\x43\xaa\x29\xd5\x92\x6a\x4b\x75\xa4\xba\x52\x3d\xa9\xbe\xd4\x40\x6a\x28\x35\x92\x1a\x4b\x4d\xa4\xa6\x52\x33\xa9\xb9\xd4\x42\x6a\x29\xb5\x92\x5a\x4b\x6d\xa4\xb6\x52\x3b\xa9\xbd\xd4\x41\xea\x28\x75\x92\x3a\x4b\x5d\xa4\xae\x52\x37\xa9\xbb\xd4\x43\xea\x29\xf5\x92\x7a\x4b\x7d\xa4\xbe\x52\x3f\xa9\xbf\x34\x40\x1a\x28\x0d\x92\x06\x4b\x43\xa4\xa1\xd2\x30\x69\xb8\x34\x42\x1a\x29\x8d\x92\x46\x4b\x63\xa4\xb1\xd2\x38\x69\xbc\x34\x41\x9a\x28\x4d\x92\x26\x4b\x53\xa4\xa9\xd2\x34\x69\xba\x34\x43\x9a\x29\xcd\x92\x66\x4b\x73\xa4\xb9\xd2\x3c\x69\xbe\xb4\x40\x5a\x28\x2d\x92\x16\x4b\x4b\xa4\xa5\xd2\x32\x69\xb9\xb4\x42\x5a\x29\xad\x92\x56\x4b\x6b\xa4\xb5\xd2\x3a\x69\xbd\xb4\x41\xda\x28\x6d\x92\x36\x4b\x5b\xa4\xad\xd2\x36\x69\xbb\xb4\x43\xda\x29\xed\x92\x76\x4b\x7b\xa4\xbd\xd2\x3e\x69\xbf\x74\x40\x3a\x28\x1d\x92\x0e\x4b\x47\xa4\xa3\xd2\x31\xe9\xb8\x74\x42\x3a\x29\x9d\x92\x4e\x4b\x67\xa4\xb3\xd2\x39\xe9\xbc\x74\x41\xba\x28\x5d\x92\x2e\x4b\x57\xa4\xab\xd2\x35\xe9\xba\x74\x43\xba\x29\xdd\x92\x6e\x4b\x77\xa4\xbb\xd2\x3d\xe9\xbe\xf4\x40\x7a\x28\x3d\x92\x1e\x4b\x4f\xa4\xa7\xd2\x33\xe9\xb9\xf4\x42\x7a\x29\xbd\x92\x5e\x4b\x6f\xa4\xb7\xd2\x3b\xe9\xbd\xf4\x41\xfa\x28\x7d\x92\x3e\x4b\x5f\xa4\xaf\xd2\x37\xe9\xbb\xf4\x43\xfa\x29\xfd\x92\x7e\x4b\x7f\xa4\xbf\xd2\x3f\x29\x4e\x8a\x97\x12\xa4\x44\x39\x89\x9c\x54\x4e\x26\x27\x97\x53\xc8\x29\xe5\x54\x72\x6a\x39\x8d\x9c\x56\x4e\x27\xa7\x97\x33\xc8\x19\xe5\x4c\x72\x66\x39\x8b\x9c\x55\xce\x26\x67\x97\x73\xc8\x39\xe5\x5c\x72\x6e\x39\x8f\x9c\x57\xce\x27\x63\x32\x2e\x13\x32\x29\x53\x32\x2d\x33\x32\x2b\x73\x32\x2f\x0b\xb2\x28\x4b\xb2\x2c\x2b\xb2\x2a\x6b\xb2\x2e\x1b\xb2\x29\x5b\xb2\x2d\x3b\xb2\x2b\x7b\xb2\x2f\x07\x72\x28\x47\x32\x90\xa1\x8c\xe4\x98\x9c\x5f\x2e\x20\x17\x94\x0b\xc9\x85\xe5\x22\x72\x51\xb9\x98\x5c\x5c\x2e\x21\x97\x94\x4b\xc9\xa5\xe5\x32\x72\x59\xb9\x9c\x5c\x5e\xae\x20\x57\x94\x2b\xc9\x95\xe5\x2a\x72\x55\xb9\x9a\x5c\x5d\xae\x21\xd7\x94\x6b\xc9\xb5\xe5\x3a\x72\x5d\xb9\x9e\x5c\x5f\x6e\x20\x37\x94\x1b\xc9\x8d\xe5\x26\x72\x53\xb9\x99\xdc\x5c\x6e\x21\xb7\x94\x5b\xc9\xad\xe5\x36\x72\x5b\xb9\x9d\xdc\x5e\xee\x20\x77\x94\x3b\xc9\x9d\xe5\x2e\x72\x57\xb9\x9b\xdc\x5d\xee\x21\xf7\x94\x7b\xc9\xbd\xe5\x3e\x72\x5f\xb9\x9f\xdc\x5f\x1e\x20\x0f\x94\x07\xc9\x83\xe5\x21\xf2\x50\x79\x98\x3c\x5c\x1e\x21\x8f\x94\x47\xc9\xa3\xe5\x31\xf2\x58\x79\x9c\x3c\x5e\x9e\x20\x4f\x94\x27\xc9\x93\xe5\x29\xf2\x54\x79\x9a\x3c\x5d\x9e\x21\xcf\x94\x67\xc9\xb3\xe5\x39\xf2\x5c\x79\x9e\x3c\x5f\x5e\x20\x2f\x94\x17\xc9\x8b\xe5\x25\xf2\x52\x79\x99\xbc\x5c\x5e\x21\xaf\x94\x57\xc9\xab\xe5\x35\xf2\x5a\x79\x9d\xbc\x5e\xde\x20\x6f\x94\x37\xc9\x9b\xe5\x2d\xf2\x56\x79\x9b\xbc\x5d\xde\x21\xef\x94\x77\xc9\xbb\xe5\x3d\xf2\x5e\x79\x9f\xbc\x5f\x3e\x20\x1f\x94\x0f\xc9\x87\xe5\x23\xf2\x51\xf9\x98\x7c\x5c\x3e\x21\x9f\x94\x4f\xc9\xa7\xe5\x33\xf2\x59\xf9\x9c\x7c\x5e\xbe\x20\x5f\x94\x2f\xc9\x97\xe5\x2b\xf2\x55\xf9\x9a\x7c\x5d\xbe\x21\xdf\x94\x6f\xc9\xb7\xe5\x3b\xf2\x5d\xf9\x9e\x7c\x5f\x7e\x20\x3f\x94\x1f\xc9\x8f\xe5\x27\xf2\x53\xf9\x99\xfc\x5c\x7e\x21\xbf\x94\x5f\xc9\xaf\xe5\x37\xf2\x5b\xf9\x9d\xfc\x5e\xfe\x20\x7f\x94\x3f\xc9\x9f\xe5\x2f\xf2\x57\xf9\x9b\xfc\x5d\xfe\x21\xff\x94\x7f\xc9\xbf\xe5\x3f\xf2\x5f\xf9\x9f\x1c\x27\xc7\xcb\x09\x72\xa2\x92\x44\x49\xaa\x24\x53\x92\x2b\x29\x94\x94\x4a\x2a\x25\xb5\x92\x46\x49\xab\xa4\x53\xd2\x2b\x19\x94\x8c\x4a\x26\x25\xb3\x92\x45\xc9\xaa\x64\x53\xb2\x2b\x39\x94\x9c\x4a\x2e\x25\xb7\x92\x47\xc9\xab\xe4\x53\x30\x05\x57\x08\x85\x54\x28\x85\x56\x18\x85\x55\x38\x85\x57\x04\x45\x54\x24\x45\x56\x14\x45\x55\x34\x45\x57\x0c\xc5\x54\x2c\xc5\x56\x1c\xc5\x55\x3c\xc5\x57\x02\x25\x54\x22\x05\x28\x50\x41\x4a\x4c\xc9\xaf\x14\x50\x0a\x2a\x85\x94\xc2\x4a\x11\xa5\xa8\x52\x4c\x29\xae\x94\x50\x4a\x2a\xa5\x94\xd2\x4a\x19\xa5\xac\x52\x4e\x29\xaf\x54\x50\x2a\x2a\x95\x94\xca\x4a\x15\xa5\xaa\x52\x4d\xa9\xae\xd4\x50\x6a\x2a\xb5\x94\xda\x4a\x1d\xa5\xae\x52\x4f\xa9\xaf\x34\x50\x1a\x2a\x8d\x94\xc6\x4a\x13\xa5\xa9\xd2\x4c\x69\xae\xb4\x50\x5a\x2a\xad\x94\xd6\x4a\x1b\xa5\xad\xd2\x4e\x69\xaf\x74\x50\x3a\x2a\x9d\x94\xce\x4a\x17\xa5\xab\xd2\x4d\xe9\xae\xf4\x50\x7a\x2a\xbd\x94\xde\x4a\x1f\xa5\xaf\xd2\x4f\xe9\xaf\x0c\x50\x06\x2a\x83\x94\xc1\xca\x10\x65\xa8\x32\x4c\x19\xae\x8c\x50\x46\x2a\xa3\x94\xd1\xca\x18\x65\xac\x32\x4e\x19\xaf\x4c\x50\x26\x2a\x93\x94\xc9\xca\x14\x65\xaa\x32\x4d\x99\xae\xcc\x50\x66\x2a\xb3\x94\xd9\xca\x1c\x65\xae\x32\x4f\x99\xaf\x2c\x50\x16\x2a\x8b\x94\xc5\xca\x12\x65\xa9\xb2\x4c\x59\xae\xac\x50\x56\x2a\xab\x94\xd5\xca\x1a\x65\xad\xb2\x4e\x59\xaf\x6c\x50\x36\x2a\x9b\x94\xcd\xca\x16\x65\xab\xb2\x4d\xd9\xae\xec\x50\x76\x2a\xbb\x94\xdd\xca\x1e\x65\xaf\xb2\x4f\xd9\xaf\x1c\x50\x0e\x2a\x87\x94\xc3\xca\x11\xe5\xa8\x72\x4c\x39\xae\x9c\x50\x4e\x2a\xa7\x94\xd3\xca\x19\xe5\xac\x72\x4e\x39\xaf\x5c\x50\x2e\x2a\x97\x94\xcb\xca\x15\xe5\xaa\x72\x4d\xb9\xae\xdc\x50\x6e\x2a\xb7\x94\xdb\xca\x1d\xe5\xae\x72\x4f\xb9\xaf\x3c\x50\x1e\x2a\x8f\x94\xc7\xca\x13\xe5\xa9\xf2\x4c\x79\xae\xbc\x50\x5e\x2a\xaf\x94\xd7\xca\x1b\xe5\xad\xf2\x4e\x79\xaf\x7c\x50\x3e\x2a\x9f\x94\xcf\xca\x17\xe5\xab\xf2\x4d\xf9\xae\xfc\x50\x7e\x2a\xbf\x94\xdf\xca\x1f\xe5\xaf\xf2\x4f\x89\x53\xe2\x95\x04\x25\x51\x4d\xa2\x26\x55\x93\xa9\xc9\xd5\x14\x6a\x4a\x35\x95\x9a\x5a\x4d\xa3\xa6\x55\xd3\xa9\xe9\xd5\x0c\x6a\x46\x35\x93\x9a\x59\xcd\xa2\x66\x55\xb3\xa9\xd9\xd5\x1c\x6a\x4e\x35\x97\x9a\x5b\xcd\xa3\xe6\x55\xf3\xa9\x98\x8a\xab\x84\x4a\xaa\x94\x4a\xab\x8c\xca\xaa\x9c\xca\xab\x82\x2a\xaa\x92\x2a\xab\x8a\xaa\xaa\x9a\xaa\xab\x86\x6a\xaa\x96\x6a\xab\x8e\xea\xaa\x9e\xea\xab\x81\x1a\xaa\x91\x0a\x54\xa8\x22\x35\xa6\xe6\x57\x0b\xa8\x05\xd5\x42\x6a\x61\xb5\x88\x5a\x54\x2d\xa6\x16\x57\x4b\xa8\x25\xd5\x52\x6a\x69\xb5\x8c\x5a\x56\x2d\xa7\x96\x57\x2b\xa8\x15\xd5\x4a\x6a\x65\xb5\x8a\x5a\x55\xad\xa6\x56\x57\x6b\xa8\x35\xd5\x5a\x6a\x6d\xb5\x8e\x5a\x57\xad\xa7\xd6\x57\x1b\xa8\x0d\xd5\x46\x6a\x63\xb5\x89\xda\x54\x6d\xa6\x36\x57\x5b\xa8\x2d\xd5\x56\x6a\x6b\xb5\x8d\xda\x56\x6d\xa7\xb6\x57\x3b\xa8\x1d\xd5\x4e\x6a\x67\xb5\x8b\xda\x55\xed\xa6\x76\x57\x7b\xa8\x3d\xd5\x5e\x6a\x6f\xb5\x8f\xda\x57\xed\xa7\xf6\x57\x07\xa8\x03\xd5\x41\xea\x60\x75\x88\x3a\x54\x1d\xa6\x0e\x57\x47\xa8\x23\xd5\x51\xea\x68\x75\x8c\x3a\x56\x1d\xa7\x8e\x57\x27\xa8\x13\xd5\x49\xea\x64\x75\x8a\x3a\x55\x9d\xa6\x4e\x57\x67\xa8\x33\xd5\x59\xea\x6c\x75\x8e\x3a\x57\x9d\xa7\xce\x57\x17\xa8\x0b\xd5\x45\xea\x62\x75\x89\xba\x54\x5d\xa6\x2e\x57\x57\xa8\x2b\xd5\x55\xea\x6a\x75\x8d\xba\x56\x5d\xa7\xae\x57\x37\xa8\x1b\xd5\x4d\xea\x66\x75\x8b\xba\x55\xdd\xa6\x6e\x57\x77\xa8\x3b\xd5\x5d\xea\x6e\x75\x8f\xba\x57\xdd\xa7\xee\x57\x0f\xa8\x07\xd5\x43\xea\x61\xf5\x88\x7a\x54\x3d\xa6\x1e\x57\x4f\xa8\x27\xd5\x53\xea\x69\xf5\x8c\x7a\x56\x3d\xa7\x9e\x57\x2f\xa8\x17\xd5\x4b\xea\x65\xf5\x8a\x7a\x55\xbd\xa6\x5e\x57\x6f\xa8\x37\xd5\x5b\xea\x6d\xf5\x8e\x7a\x57\xbd\xa7\xde\x57\x1f\xa8\x0f\xd5\x47\xea\x63\xf5\x89\xfa\x54\x7d\xa6\x3e\x57\x5f\xa8\x2f\xd5\x57\xea\x6b\xf5\x8d\xfa\x56\x7d\xa7\xbe\x57\x3f\xa8\x1f\xd5\x4f\xea\x67\xf5\x8b\xfa\x55\xfd\xa6\x7e\x57\x7f\xa8\x3f\xd5\x5f\xea\x6f\xf5\x8f\xfa\x57\xfd\xa7\xc6\xa9\xf1\x6a\x82\x9a\xa8\x25\xd1\x92\x6a\xc9\xb4\xe4\x5a\x0a\x2d\xa5\x96\x4a\x4b\xad\xa5\xd1\xd2\x6a\xe9\xb4\xf4\x5a\x06\x2d\xa3\x96\x49\xcb\xac\x65\xd1\xb2\x6a\xd9\xb4\xec\x5a\x0e\x2d\xa7\x96\x4b\xcb\xad\xe5\xd1\xf2\x6a\xf9\x34\x4c\xc3\x35\x42\x23\x35\x4a\xa3\x35\x46\x63\x35\x4e\xe3\x35\x41\x13\x35\x49\x93\x35\x45\x53\x35\x4d\xd3\x35\x43\x33\x35\x4b\xb3\x35\x47\x73\x35\x4f\xf3\xb5\x40\x0b\xb5\x48\x03\x1a\xd4\x90\x16\xd3\xf2\x6b\x05\xb4\x82\x5a\x21\xad\xb0\x56\x44\x2b\xaa\x15\xd3\x8a\x6b\x25\xb4\x92\x5a\x29\xad\xb4\x56\x46\x2b\xab\x95\xd3\xca\x6b\x15\xb4\x8a\x5a\x25\xad\xb2\x56\x45\xab\xaa\x55\xd3\xaa\x6b\x35\xb4\x9a\x5a\x2d\xad\xb6\x56\x47\xab\xab\xd5\xd3\xea\x6b\x0d\xb4\x86\x5a\x23\xad\xb1\xd6\x44\x6b\xaa\x35\xd3\x9a\x6b\x2d\xb4\x96\x5a\x2b\xad\xb5\xd6\x46\x6b\xab\xb5\xd3\xda\x6b\x1d\xb4\x8e\x5a\x27\xad\xb3\xd6\x45\xeb\xaa\x75\xd3\xba\x6b\x3d\xb4\x9e\x5a\x2f\xad\xb7\xd6\x47\xeb\xab\xf5\xd3\xfa\x6b\x03\xb4\x81\xda\x20\x6d\xb0\x36\x44\x1b\xaa\x0d\xd3\x86\x6b\x23\xb4\x91\xda\x28\x6d\xb4\x36\x46\x1b\xab\x8d\xd3\xc6\x6b\x13\xb4\x89\xda\x24\x6d\xb2\x36\x45\x9b\xaa\x4d\xd3\xa6\x6b\x33\xb4\x99\xda\x2c\x6d\xb6\x36\x47\x9b\xab\xcd\xd3\xe6\x6b\x0b\xb4\x85\xda\x22\x6d\xb1\xb6\x44\x5b\xaa\x2d\xd3\x96\x6b\x2b\xb4\x95\xda\x2a\x6d\xb5\xb6\x46\x5b\xab\xad\xd3\xd6\x6b\x1b\xb4\x8d\xda\x26\x6d\xb3\xb6\x45\xdb\xaa\x6d\xd3\xb6\x6b\x3b\xb4\x9d\xda\x2e\x6d\xb7\xb6\x47\xdb\xab\xed\xd3\xf6\x6b\x07\xb4\x83\xda\x21\xed\xb0\x76\x44\x3b\xaa\x1d\xd3\x8e\x6b\x27\xb4\x93\xda\x29\xed\xb4\x76\x46\x3b\xab\x9d\xd3\xce\x6b\x17\xb4\x8b\xda\x25\xed\xb2\x76\x45\xbb\xaa\x5d\xd3\xae\x6b\x37\xb4\x9b\xda\x2d\xed\xb6\x76\x47\xbb\xab\xdd\xd3\xee\x6b\x0f\xb4\x87\xda\x23\xed\xb1\xf6\x44\x7b\xaa\x3d\xd3\x9e\x6b\x2f\xb4\x97\xda\x2b\xed\xb5\xf6\x46\x7b\xab\xbd\xd3\xde\x6b\x1f\xb4\x8f\xda\x27\xed\xb3\xf6\x45\xfb\xaa\x7d\xd3\xbe\x6b\x3f\xb4\x9f\xda\x2f\xed\xb7\xf6\x47\xfb\xab\xfd\xd3\xe2\xb4\x78\x2d\x41\x4b\xd4\x93\xe8\x49\xf5\x64\x7a\x72\x3d\x85\x9e\x52\x4f\xa5\xa7\xd6\xd3\xe8\x69\xf5\x74\x7a\x7a\x3d\x83\x9e\x51\xcf\xa4\x67\xd6\xb3\xe8\x59\xf5\x6c\x7a\x76\x3d\x87\x9e\x53\xcf\xa5\xe7\xd6\xf3\xe8\x79\xf5\x7c\x3a\xa6\xe3\x3a\xa1\x93\x3a\xa5\xd3\x3a\xa3\xb3\x3a\xa7\xf3\xba\xa0\x8b\xba\xa4\xcb\xba\xa2\xab\xba\xa6\xeb\xba\xa1\x9b\xba\xa5\xdb\xba\xa3\xbb\xba\xa7\xfb\x7a\xa0\x87\x7a\xa4\x03\x1d\xea\x48\x8f\xe9\xf9\xf5\x02\x7a\x41\xbd\x90\x5e\x58\x2f\xa2\x17\xd5\x8b\xe9\xc5\xf5\x12\x7a\x49\xbd\x94\x5e\x5a\x2f\xa3\x97\xd5\xcb\xe9\xe5\xf5\x0a\x7a\x45\xbd\x92\x5e\x59\xaf\xa2\x57\xd5\xab\xe9\xd5\xf5\x1a\x7a\x4d\xbd\x96\x5e\x5b\xaf\xa3\xd7\xd5\xeb\xe9\xf5\xf5\x06\x7a\x43\xbd\x91\xde\x58\x6f\xa2\x37\xd5\x9b\xe9\xcd\xf5\x16\x7a\x4b\xbd\x95\xde\x5a\x6f\xa3\xb7\xd5\xdb\xe9\xed\xf5\x0e\x7a\x47\xbd\x93\xde\x59\xef\xa2\x77\xd5\xbb\xe9\xdd\xf5\x1e\x7a\x4f\xbd\x97\xde\x5b\xef\xa3\xf7\xd5\xfb\xe9\xfd\xf5\x01\xfa\x40\x7d\x90\x3e\x58\x1f\xa2\x0f\xd5\x87\xe9\xc3\xf5\x11\xfa\x48\x7d\x94\x3e\x5a\x1f\xa3\x8f\xd5\xc7\xe9\xe3\xf5\x09\xfa\x44\x7d\x92\x3e\x59\x9f\xa2\x4f\xd5\xa7\xe9\xd3\xf5\x19\xfa\x4c\x7d\x96\x3e\x5b\x9f\xa3\xcf\xd5\xe7\xe9\xf3\xf5\x05\xfa\x42\x7d\x91\xbe\x58\x5f\xa2\x2f\xd5\x97\xe9\xcb\xf5\x15\xfa\x4a\x7d\x95\xbe\x5a\x5f\xa3\xaf\xd5\xd7\xe9\xeb\xf5\x0d\xfa\x46\x7d\x93\xbe\x59\xdf\xa2\x6f\xd5\xb7\xe9\xdb\xf5\x1d\xfa\x4e\x7d\x97\xbe\x5b\xdf\xa3\xef\xd5\xf7\xe9\xfb\xf5\x03\xfa\x41\xfd\x90\x7e\x58\x3f\xa2\x1f\xd5\x8f\xe9\xc7\xf5\x13\xfa\x49\xfd\x94\x7e\x5a\x3f\xa3\x9f\xd5\xcf\xe9\xe7\xf5\x0b\xfa\x45\xfd\x92\x7e\x59\xbf\xa2\x5f\xd5\xaf\xe9\xd7\xf5\x1b\xfa\x4d\xfd\x96\x7e\x5b\xbf\xa3\xdf\xd5\xef\xe9\xf7\xf5\x07\xfa\x43\xfd\x91\xfe\x58\x7f\xa2\x3f\xd5\x9f\xe9\xcf\xf5\x17\xfa\x4b\xfd\x95\xfe\x5a\x7f\xa3\xbf\xd5\xdf\xe9\xef\xf5\x0f\xfa\x47\xfd\x93\xfe\x59\xff\xa2\x7f\xd5\xbf\xe9\xdf\xf5\x1f\xfa\x4f\xfd\x97\xfe\x5b\xff\xa3\xff\xd5\xff\xe9\x71\x7a\xbc\x9e\xa0\x27\x1a\x49\x8c\xa4\x46\x32\x23\xb9\x91\xc2\x48\x69\xa4\x32\x52\x1b\x69\x8c\xb4\x46\x3a\x23\xbd\x91\xc1\xc8\x68\x64\x32\x32\x1b\x59\x8c\xac\x46\x36\x23\xbb\x91\xc3\xc8\x69\xe4\x32\x72\x1b\x79\x8c\xbc\x46\x3e\x03\x33\x70\x83\x30\x48\x83\x32\x68\x83\x31\x58\x83\x33\x78\x43\x30\x44\x43\x32\x64\x43\x31\x54\x43\x33\x74\xc3\x30\x4c\xc3\x32\x6c\xc3\x31\x5c\xc3\x33\x7c\x23\x30\x42\x23\x32\x80\x01\x0d\x64\xc4\x8c\xfc\x46\x01\xa3\xa0\x51\xc8\x28\x6c\x14\x31\x8a\x1a\xc5\x8c\xe2\x46\x09\xa3\xa4\x51\xca\x28\x6d\x94\x31\xca\x1a\xe5\x8c\xf2\x46\x05\xa3\xa2\x51\xc9\xa8\x6c\x54\x31\xaa\x1a\xd5\x8c\xea\x46\x0d\xa3\xa6\x51\xcb\xa8\x6d\xd4\x31\xea\x1a\xf5\x8c\xfa\x46\x03\xa3\xa1\xd1\xc8\x68\x6c\x34\x31\x9a\x1a\xcd\x8c\xe6\x46\x0b\xa3\xa5\xd1\xca\x68\x6d\xb4\x31\xda\x1a\xed\x8c\xf6\x46\x07\xa3\xa3\xd1\xc9\xe8\x6c\x74\x31\xba\x1a\xdd\x8c\xee\x46\x0f\xa3\xa7\xd1\xcb\xe8\x6d\xf4\x31\xfa\x1a\xfd\x8c\xfe\xc6\x00\x63\xa0\x31\xc8\x18\x6c\x0c\x31\x86\x1a\xc3\x8c\xe1\xc6\x08\x63\xa4\x31\xca\x18\x6d\x8c\x31\xc6\x1a\xe3\x8c\xf1\xc6\x04\x63\xa2\x31\xc9\x98\x6c\x4c\x31\xa6\x1a\xd3\x8c\xe9\xc6\x0c\x63\xa6\x31\xcb\x98\x6d\xcc\x31\xe6\x1a\xf3\x8c\xf9\xc6\x02\x63\xa1\xb1\xc8\x58\x6c\x2c\x31\x96\x1a\xcb\x8c\xe5\xc6\x0a\x63\xa5\xb1\xca\x58\x6d\xac\x31\xd6\x1a\xeb\x8c\xf5\xc6\x06\x63\xa3\xb1\xc9\xd8\x6c\x6c\x31\xb6\x1a\xdb\x8c\xed\xc6\x0e\x63\xa7\xb1\xcb\xd8\x6d\xec\x31\xf6\x1a\xfb\x8c\xfd\xc6\x01\xe3\xa0\x71\xc8\x38\x6c\x1c\x31\x8e\x1a\xc7\x8c\xe3\xc6\x09\xe3\xa4\x71\xca\x38\x6d\x9c\x31\xce\x1a\xe7\x8c\xf3\xc6\x05\xe3\xa2\x71\xc9\xb8\x6c\x5c\x31\xae\x1a\xd7\x8c\xeb\xc6\x0d\xe3\xa6\x71\xcb\xb8\x6d\xdc\x31\xee\x1a\xf7\x8c\xfb\xc6\x03\xe3\xa1\xf1\xc8\x78\x6c\x3c\x31\x9e\x1a\xcf\x8c\xe7\xc6\x0b\xe3\xa5\xf1\xca\x78\x6d\xbc\x31\xde\x1a\xef\x8c\xf7\xc6\x07\xe3\xa3\xf1\xc9\xf8\x6c\x7c\x31\xbe\x1a\xdf\x8c\xef\xc6\x0f\xe3\xa7\xf1\xcb\xf8\x6d\xfc\x31\xfe\x1a\xff\x8c\x38\x23\xde\x48\x30\x12\xcd\x24\x66\x52\x33\x99\x99\xdc\x4c\x61\xa6\x34\x53\x99\xa9\xcd\x34\x66\x5a\x33\x9d\x99\xde\xcc\x60\x66\x34\x33\x99\x99\xcd\x2c\x66\x56\x33\x9b\x99\xdd\xcc\x61\xe6\x34\x73\x99\xb9\xcd\x3c\x66\x5e\x33\x9f\x89\x99\xb8\x49\x98\xa4\x49\x99\xb4\xc9\x98\xac\xc9\x99\xbc\x29\x98\xa2\x29\x99\xb2\xa9\x98\xaa\xa9\x99\xba\x69\x98\xa6\x69\x99\xb6\xe9\x98\xae\xe9\x99\xbe\x19\x98\xa1\x19\x99\xc0\x84\x26\x32\x63\x66\x7e\xb3\x80\x59\xd0\x2c\x64\x16\x36\x8b\x98\x45\xcd\x62\x66\x71\xb3\x84\x59\xd2\x2c\x65\x96\x36\xcb\x98\x65\xcd\x72\x66\x79\xb3\x82\x59\xd1\xac\x64\x56\x36\xab\x98\x55\xcd\x6a\x66\x75\xb3\x86\x59\xd3\xac\x65\xd6\x36\xeb\x98\x75\xcd\x7a\x66\x7d\xb3\x81\xd9\xd0\x6c\x64\x36\x36\x9b\x98\x4d\xcd\x66\x66\x73\xb3\x85\xd9\xd2\x6c\x65\xb6\x36\xdb\x98\x6d\xcd\x76\x66\x7b\xb3\x83\xd9\xd1\xec\x64\x76\x36\xbb\x98\x5d\xcd\x6e\x66\x77\xb3\x87\xd9\xd3\xec\x65\xf6\x36\xfb\x98\x7d\xcd\x7e\x66\x7f\x73\x80\x39\xd0\x1c\x64\x0e\x36\x87\x98\x43\xcd\x61\xe6\x70\x73\x84\x39\xd2\x1c\x65\x8e\x36\xc7\x98\x63\xcd\x71\xe6\x78\x73\x82\x39\xd1\x9c\x64\x4e\x36\xa7\x98\x53\xcd\x69\xe6\x74\x73\x86\x39\xd3\x9c\x65\xce\x36\xe7\x98\x73\xcd\x79\xe6\x7c\x73\x81\xb9\xd0\x5c\x64\x2e\x36\x97\x98\x4b\xcd\x65\xe6\x72\x73\x85\xb9\xd2\x5c\x65\xae\x36\xd7\x98\x6b\xcd\x75\xe6\x7a\x73\x83\xb9\xd1\xdc\x64\x6e\x36\xb7\x98\x5b\xcd\x6d\xe6\x76\x73\x87\xb9\xd3\xdc\x65\xee\x36\xf7\x98\x7b\xcd\x7d\xe6\x7e\xf3\x80\x79\xd0\x3c\x64\x1e\x36\x8f\x98\x47\xcd\x63\xe6\x71\xf3\x84\x79\xd2\x3c\x65\x9e\x36\xcf\x98\x67\xcd\x73\xe6\x79\xf3\x82\x79\xd1\xbc\x64\x5e\x36\xaf\x98\x57\xcd\x6b\xe6\x75\xf3\x86\x79\xd3\xbc\x65\xde\x36\xef\x98\x77\xcd\x7b\xe6\x7d\xf3\x81\xf9\xd0\x7c\x64\x3e\x36\x9f\x98\x4f\xcd\x67\xe6\x73\xf3\x85\xf9\xd2\x7c\x65\xbe\x36\xdf\x98\x6f\xcd\x77\xe6\x7b\xf3\x83\xf9\xd1\xfc\x64\x7e\x36\xbf\x98\x5f\xcd\x6f\xe6\x77\xf3\x87\xf9\xd3\xfc\x65\xfe\x36\xff\x98\x7f\xcd\x7f\x66\x9c\x19\x6f\x26\x98\x89\x56\x12\x2b\xa9\x95\xcc\x4a\x6e\xa5\xb0\x52\x5a\xa9\xac\xd4\x56\x1a\x2b\xad\x95\xce\x4a\x6f\x65\xb0\x32\x5a\x99\xac\xcc\x56\x16\x2b\xab\x95\xcd\xca\x6e\xe5\xb0\x72\x5a\xb9\xac\xdc\x56\x1e\x2b\xaf\x95\xcf\xc2\x2c\xdc\x22\x2c\xd2\xa2\x2c\xda\x62\x2c\xd6\xe2\x2c\xde\x12\x2c\xd1\x92\x2c\xd9\x52\x2c\xd5\xd2\x2c\xdd\x32\x2c\xd3\xb2\x2c\xdb\x72\x2c\xd7\xf2\x2c\xdf\x0a\xac\xd0\x8a\x2c\x60\x41\x0b\x59\x31\x2b\xbf\x55\xc0\x2a\x68\x15\xb2\x0a\x5b\x45\xac\xa2\x56\x31\xab\xb8\x55\xc2\x2a\x69\x95\xb2\x4a\x5b\x65\xac\xb2\x56\x39\xab\xbc\x55\xc1\xaa\x68\x55\xb2\x2a\x5b\x55\xac\xaa\x56\x35\xab\xba\x55\xc3\xaa\x69\xd5\xb2\x6a\x5b\x75\xac\xba\x56\x3d\xab\xbe\xd5\xc0\x6a\x68\x35\xb2\x1a\x5b\x4d\xac\xa6\x56\x33\xab\xb9\xd5\xc2\x6a\x69\xb5\xb2\x5a\x5b\x6d\xac\xb6\x56\x3b\xab\xbd\xd5\xc1\xea\x68\x75\xb2\x3a\x5b\x5d\xac\xae\x56\x37\xab\xbb\xd5\xc3\xea\x69\xf5\xb2\x7a\x5b\x7d\xac\xbe\x56\x3f\xab\xbf\x35\xc0\x1a\x68\x0d\xb2\x06\x5b\x43\xac\xa1\xd6\x30\x6b\xb8\x35\xc2\x1a\x69\x8d\xb2\x46\x5b\x63\xac\xb1\xd6\x38\x6b\xbc\x35\xc1\x9a\x68\x4d\xb2\x26\x5b\x53\xac\xa9\xd6\x34\x6b\xba\x35\xc3\x9a\x69\xcd\xb2\x66\x5b\x73\xac\xb9\xd6\x3c\x6b\xbe\xb5\xc0\x5a\x68\x2d\xb2\x16\x5b\x4b\xac\xa5\xd6\x32\x6b\xb9\xb5\xc2\x5a\x69\xad\xb2\x56\x5b\x6b\xac\xb5\xd6\x3a\x6b\xbd\xb5\xc1\xda\x68\x6d\xb2\x36\x5b\x5b\xac\xad\xd6\x36\x6b\xbb\xb5\xc3\xda\x69\xed\xb2\x76\x5b\x7b\xac\xbd\xd6\x3e\x6b\xbf\x75\xc0\x3a\x68\x1d\xb2\x0e\x5b\x47\xac\xa3\xd6\x31\xeb\xb8\x75\xc2\x3a\x69\x9d\xb2\x4e\x5b\x67\xac\xb3\xd6\x39\xeb\xbc\x75\xc1\xba\x68\x5d\xb2\x2e\x5b\x57\xac\xab\xd6\x35\xeb\xba\x75\xc3\xba\x69\xdd\xb2\x6e\x5b\x77\xac\xbb\xd6\x3d\xeb\xbe\xf5\xc0\x7a\x68\x3d\xb2\x1e\x5b\x4f\xac\xa7\xd6\x33\xeb\xb9\xf5\xc2\x7a\x69\xbd\xb2\x5e\x5b\x6f\xac\xb7\xd6\x3b\xeb\xbd\xf5\xc1\xfa\x68\x7d\xb2\x3e\x5b\x5f\xac\xaf\xd6\x37\xeb\xbb\xf5\xc3\xfa\x69\xfd\xb2\x7e\x5b\x7f\xac\xbf\xd6\x3f\x2b\xce\x8a\xb7\x12\xac\x44\x3b\x89\x9d\xd4\x4e\x66\x27\xb7\x53\xd8\x29\xed\x54\x76\x6a\x3b\x8d\x9d\xd6\x4e\x67\xa7\xb7\x33\xd8\x19\xed\x4c\x76\x66\x3b\x8b\x9d\xd5\xce\x66\x67\xb7\x73\xd8\x39\xed\x5c\x76\x6e\x3b\x8f\x9d\xd7\xce\x67\x63\x36\x6e\x13\x36\x69\x53\x36\x6d\x33\x36\x6b\x73\x36\x6f\x0b\xb6\x68\x4b\xb6\x6c\x2b\xb6\x6a\x6b\xb6\x6e\x1b\xb6\x69\x5b\xb6\x6d\x3b\xb6\x6b\x7b\xb6\x6f\x07\x76\x68\x47\x36\xb0\xa1\x8d\xec\x98\x9d\xdf\x2e\x60\x17\xb4\x0b\xd9\x85\xed\x22\x76\x51\xbb\x98\x5d\xdc\x2e\x61\x97\xb4\x4b\xd9\xa5\xed\x32\x76\x59\xbb\x9c\x5d\xde\xae\x60\x57\xb4\x2b\xd9\x95\xed\x2a\x76\x55\xbb\x9a\x5d\xdd\xae\x61\xd7\xb4\x6b\xd9\xb5\xed\x3a\x76\x5d\xbb\x9e\x5d\xdf\x6e\x60\x37\xb4\x1b\xd9\x8d\xed\x26\x76\x53\xbb\x99\xdd\xdc\x6e\x61\xb7\xb4\x5b\xd9\xad\xed\x36\x76\x5b\xbb\x9d\xdd\xde\xee\x60\x77\xb4\x3b\xd9\x9d\xed\x2e\x76\x57\xbb\x9b\xdd\xdd\xee\x61\xf7\xb4\x7b\xd9\xbd\xed\x3e\x76\x5f\xbb\x9f\xdd\xdf\x1e\x60\x0f\xb4\x07\xd9\x83\xed\x21\xf6\x50\x7b\x98\x3d\xdc\x1e\x61\x8f\xb4\x47\xd9\xa3\xed\x31\xf6\x58\x7b\x9c\x3d\xde\x9e\x60\x4f\xb4\x27\xd9\x93\xed\x29\xf6\x54\x7b\x9a\x3d\xdd\x9e\x61\xcf\xb4\x67\xd9\xb3\xed\x39\xf6\x5c\x7b\x9e\x3d\xdf\x5e\x60\x2f\xb4\x17\xd9\x8b\xed\x25\xf6\x52\x7b\x99\xbd\xdc\x5e\x61\xaf\xb4\x57\xd9\xab\xed\x35\xf6\x5a\x7b\x9d\xbd\xde\xde\x60\x6f\xb4\x37\xd9\x9b\xed\x2d\xf6\x56\x7b\x9b\xbd\xdd\xde\x61\xef\xb4\x77\xd9\xbb\xed\x3d\xf6\x5e\x7b\x9f\xbd\xdf\x3e\x60\x1f\xb4\x0f\xd9\x87\xed\x23\xf6\x51\xfb\x98\x7d\xdc\x3e\x61\x9f\xb4\x4f\xd9\xa7\xed\x33\xf6\x59\xfb\x9c\x7d\xde\xbe\x60\x5f\xb4\x2f\xd9\x97\xed\x2b\xf6\x55\xfb\x9a\x7d\xdd\xbe\x61\xdf\xb4\x6f\xd9\xb7\xed\x3b\xf6\x5d\xfb\x9e\x7d\xdf\x7e\x60\x3f\xb4\x1f\xd9\x8f\xed\x27\xf6\x53\xfb\x99\xfd\xdc\x7e\x61\xbf\xb4\x5f\xd9\xaf\xed\x37\xf6\x5b\xfb\x9d\xfd\xde\xfe\x60\x7f\xb4\x3f\xd9\x9f\xed\x2f\xf6\x57\xfb\x9b\xfd\xdd\xfe\x61\xff\xb4\x7f\xd9\xbf\xed\x3f\xf6\x5f\xfb\x9f\x1d\x67\xc7\xdb\x09\x76\xa2\x93\xc4\x49\xea\x24\x73\x92\x3b\x29\x9c\x94\x4e\x2a\x27\xb5\x93\xc6\x49\xeb\xa4\x73\xd2\x3b\x19\x9c\x8c\x4e\x26\x27\xb3\x93\xc5\xc9\xea\x64\x73\xb2\x3b\x39\x9c\x9c\x4e\x2e\x27\xb7\x93\xc7\xc9\xeb\xe4\x73\x30\x07\x77\x08\x87\x74\x28\x87\x76\x18\x87\x75\x38\x87\x77\x04\x47\x74\x24\x47\x76\x14\x47\x75\x34\x47\x77\x0c\xc7\x74\x2c\xc7\x76\x1c\xc7\x75\x3c\xc7\x77\x02\x27\x74\x22\x07\x38\xd0\x41\x4e\xcc\xc9\xef\x14\x70\x0a\x3a\x85\x9c\xc2\x4e\x11\xa7\xa8\x53\xcc\x29\xee\x94\x70\x4a\x3a\xa5\x9c\xd2\x4e\x19\xa7\xac\x53\xce\x29\xef\x54\x70\x2a\x3a\x95\x9c\xca\x4e\x15\xa7\xaa\x53\xcd\xa9\xee\xd4\x70\x6a\x3a\xb5\x9c\xda\x4e\x1d\xa7\xae\x53\xcf\xa9\xef\x34\x70\x1a\x3a\x8d\x9c\xc6\x4e\x13\xa7\xa9\xd3\xcc\x69\xee\xb4\x70\x5a\x3a\xad\x9c\xd6\x4e\x1b\xa7\xad\xd3\xce\x69\xef\x74\x70\x3a\x3a\x9d\x9c\xce\x4e\x17\xa7\xab\xd3\xcd\xe9\xee\xf4\x70\x7a\x3a\xbd\x9c\xde\x4e\x1f\xa7\xaf\xd3\xcf\xe9\xef\x0c\x70\x06\x3a\x83\x9c\xc1\xce\x10\x67\xa8\x33\xcc\x19\xee\x8c\x70\x46\x3a\xa3\x9c\xd1\xce\x18\x67\xac\x33\xce\x19\xef\x4c\x70\x26\x3a\x93\x9c\xc9\xce\x14\x67\xaa\x33\xcd\x99\xee\xcc\x70\x66\x3a\xb3\x9c\xd9\xce\x1c\x67\xae\x33\xcf\x99\xef\x2c\x70\x16\x3a\x8b\x9c\xc5\xce\x12\x67\xa9\xb3\xcc\x59\xee\xac\x70\x56\x3a\xab\x9c\xd5\xce\x1a\x67\xad\xb3\xce\x59\xef\x6c\x70\x36\x3a\x9b\x9c\xcd\xce\x16\x67\xab\xb3\xcd\xd9\xee\xec\x70\x76\x3a\xbb\x9c\xdd\xce\x1e\x67\xaf\xb3\xcf\xd9\xef\x1c\x70\x0e\x3a\x87\x9c\xc3\xce\x11\xe7\xa8\x73\xcc\x39\xee\x9c\x70\x4e\x3a\xa7\x9c\xd3\xce\x19\xe7\xac\x73\xce\x39\xef\x5c\x70\x2e\x3a\x97\x9c\xcb\xce\x15\xe7\xaa\x73\xcd\xb9\xee\xdc\x70\x6e\x3a\xb7\x9c\xdb\xce\x1d\xe7\xae\x73\xcf\xb9\xef\x3c\x70\x1e\x3a\x8f\x9c\xc7\xce\x13\xe7\xa9\xf3\xcc\x79\xee\xbc\x70\x5e\x3a\xaf\x9c\xd7\xce\x1b\xe7\xad\xf3\xce\x79\xef\x7c\x70\x3e\x3a\x9f\x9c\xcf\xce\x17\xe7\xab\xf3\xcd\xf9\xee\xfc\x70\x7e\x3a\xbf\x9c\xdf\xce\x1f\xe7\xaf\xf3\xcf\x89\x73\xe2\x9d\x04\x27\xd1\x4d\xe2\x26\x75\x93\xb9\xc9\xdd\x14\x6e\x4a\x37\x95\x9b\xda\x4d\xe3\xa6\x75\xd3\xb9\xe9\xdd\x0c\x6e\x46\x37\x93\x9b\xd9\xcd\xe2\x66\x75\xb3\xb9\xd9\xdd\x1c\x6e\x4e\x37\x97\x9b\xdb\xcd\xe3\xe6\x75\xf3\xb9\x98\x8b\xbb\x84\x4b\xba\x94\x4b\xbb\x8c\xcb\xba\x9c\xcb\xbb\x82\x2b\xba\x92\x2b\xbb\x8a\xab\xba\x9a\xab\xbb\x86\x6b\xba\x96\x6b\xbb\x8e\xeb\xba\x9e\xeb\xbb\x81\x1b\xba\x91\x0b\x5c\xe8\x22\x37\xe6\xe6\x77\x0b\xb8\x05\xdd\x42\x6e\x61\xb7\x88\x5b\xd4\x2d\xe6\x16\x77\x4b\xb8\x25\xdd\x52\x6e\x69\xb7\x8c\x5b\xd6\x2d\xe7\x96\x77\x2b\xb8\x15\xdd\x4a\x6e\x65\xb7\x8a\x5b\xd5\xad\xe6\x56\x77\x6b\xb8\x35\xdd\x5a\x6e\x6d\xb7\x8e\x5b\xd7\xad\xe7\xd6\x77\x1b\xb8\x0d\xdd\x46\x6e\x63\xb7\x89\xdb\xd4\x6d\xe6\x36\x77\x5b\xb8\x2d\xdd\x56\x6e\x6b\xb7\x8d\xdb\xd6\x6d\xe7\xb6\x77\x3b\xb8\x1d\xdd\x4e\x6e\x67\xb7\x8b\xdb\xd5\xed\xe6\x76\x77\x7b\xb8\x3d\xdd\x5e\x6e\x6f\xb7\x8f\xdb\xd7\xed\xe7\xf6\x77\x07\xb8\x03\xdd\x41\xee\x60\x77\x88\x3b\xd4\x1d\xe6\x0e\x77\x47\xb8\x23\xdd\x51\xee\x68\x77\x8c\x3b\xd6\x1d\xe7\x8e\x77\x27\xb8\x13\xdd\x49\xee\x64\x77\x8a\x3b\xd5\x9d\xe6\x4e\x77\x67\xb8\x33\xdd\x59\xee\x6c\x77\x8e\x3b\xd7\x9d\xe7\xce\x77\x17\xb8\x0b\xdd\x45\xee\x62\x77\x89\xbb\xd4\x5d\xe6\x2e\x77\x57\xb8\x2b\xdd\x55\xee\x6a\x77\x8d\xbb\xd6\x5d\xe7\xae\x77\x37\xb8\x1b\xdd\x4d\xee\x66\x77\x8b\xbb\xd5\xdd\xe6\x6e\x77\x77\xb8\x3b\xdd\x5d\xee\x6e\x77\x8f\xbb\xd7\xdd\xe7\xee\x77\x0f\xb8\x07\xdd\x43\xee\x61\xf7\x88\x7b\xd4\x3d\xe6\x1e\x77\x4f\xb8\x27\xdd\x53\xee\x69\xf7\x8c\x7b\xd6\x3d\xe7\x9e\x77\x2f\xb8\x17\xdd\x4b\xee\x65\xf7\x8a\x7b\xd5\xbd\xe6\x5e\x77\x6f\xb8\x37\xdd\x5b\xee\x6d\xf7\x8e\x7b\xd7\xbd\xe7\xde\x77\x1f\xb8\x0f\xdd\x47\xee\x63\xf7\x89\xfb\xd4\x7d\xe6\x3e\x77\x5f\xb8\x2f\xdd\x57\xee\x6b\xf7\x8d\xfb\xd6\x7d\xe7\xbe\x77\x3f\xb8\x1f\xdd\x4f\xee\x67\xf7\x8b\xfb\xd5\xfd\xe6\x7e\x77\x7f\xb8\x3f\xdd\x5f\xee\x6f\xf7\x8f\xfb\xd7\xfd\xe7\xc6\xb9\xf1\x6e\x82\x9b\xe8\x25\xf1\x92\x7a\xc9\xbc\xe4\x5e\x0a\x2f\xa5\x97\xca\x4b\xed\xa5\xf1\xd2\x7a\xe9\xbc\xf4\x5e\x06\x2f\xa3\x97\xc9\xcb\xec\x65\xf1\xb2\x7a\xd9\xbc\xec\x5e\x0e\x2f\xa7\x97\xcb\xcb\xed\xe5\xf1\xf2\x7a\xf9\x3c\xcc\xc3\x3d\xc2\x23\x3d\xca\xa3\x3d\xc6\x63\x3d\xce\xe3\x3d\xc1\x13\x3d\xc9\x93\x3d\xc5\x53\x3d\xcd\xd3\x3d\xc3\x33\x3d\xcb\xb3\x3d\xc7\x73\x3d\xcf\xf3\xbd\xc0\x0b\xbd\xc8\x03\x1e\xf4\x90\x17\xf3\xf2\x7b\x05\xbc\x82\x5e\x21\xaf\xb0\x57\xc4\x2b\xea\x15\xf3\x8a\x7b\x25\xbc\x92\x5e\x29\xaf\xb4\x57\xc6\x2b\xeb\x95\xf3\xca\x7b\x15\xbc\x8a\x5e\x25\xaf\xb2\x57\xc5\xab\xea\x55\xf3\xaa\x7b\x35\xbc\x9a\x5e\x2d\xaf\xb6\x57\xc7\xab\xeb\xd5\xf3\xea\x7b\x0d\xbc\x86\x5e\x23\xaf\xb1\xd7\xc4\x6b\xea\x35\xf3\x9a\x7b\x2d\xbc\x96\x5e\x2b\xaf\xb5\xd7\xc6\x6b\xeb\xb5\xf3\xda\x7b\x1d\xbc\x8e\x5e\x27\xaf\xb3\xd7\xc5\xeb\xea\x75\xf3\xba\x7b\x3d\xbc\x9e\x5e\x2f\xaf\xb7\xd7\xc7\xeb\xeb\xf5\xf3\xfa\x7b\x03\xbc\x81\xde\x20\x6f\xb0\x37\xc4\x1b\xea\x0d\xf3\x86\x7b\x23\xbc\x91\xde\x28\x6f\xb4\x37\xc6\x1b\xeb\x8d\xf3\xc6\x7b\x13\xbc\x89\xde\x24\x6f\xb2\x37\xc5\x9b\xea\x4d\xf3\xa6\x7b\x33\xbc\x99\xde\x2c\x6f\xb6\x37\xc7\x9b\xeb\xcd\xf3\xe6\x7b\x0b\xbc\x85\xde\x22\x6f\xb1\xb7\xc4\x5b\xea\x2d\xf3\x96\x7b\x2b\xbc\x95\xde\x2a\x6f\xb5\xb7\xc6\x5b\xeb\xad\xf3\xd6\x7b\x1b\xbc\x8d\xde\x26\x6f\xb3\xb7\xc5\xdb\xea\x6d\xf3\xb6\x7b\x3b\xbc\x9d\xde\x2e\x6f\xb7\xb7\xc7\xdb\xeb\xed\xf3\xf6\x7b\x07\xbc\x83\xde\x21\xef\xb0\x77\xc4\x3b\xea\x1d\xf3\x8e\x7b\x27\xbc\x93\xde\x29\xef\xb4\x77\xc6\x3b\xeb\x9d\xf3\xce\x7b\x17\xbc\x8b\xde\x25\xef\xb2\x77\xc5\xbb\xea\x5d\xf3\xae\x7b\x37\xbc\x9b\xde\x2d\xef\xb6\x77\xc7\xbb\xeb\xdd\xf3\xee\x7b\x0f\xbc\x87\xde\x23\xef\xb1\xf7\xc4\x7b\xea\x3d\xf3\x9e\x7b\x2f\xbc\x97\xde\x2b\xef\xb5\xf7\xc6\x7b\xeb\xbd\xf3\xde\x7b\x1f\xbc\x8f\xde\x27\xef\xb3\xf7\xc5\xfb\xea\x7d\xf3\xbe\x7b\x3f\xbc\x9f\xde\x2f\xef\xb7\xf7\xc7\xfb\xeb\xfd\xf3\xe2\xbc\x78\x2f\xc1\x4b\xf4\x93\xf8\x49\xfd\x64\x7e\x72\x3f\x85\x9f\xd2\x4f\xe5\xa7\xf6\xd3\xf8\x69\xfd\x74\x7e\x7a\x3f\x83\x9f\xd1\xcf\xe4\x67\xf6\xb3\xf8\x59\xfd\x6c\x7e\x76\x3f\x87\x9f\xd3\xcf\xe5\xe7\xf6\xf3\xf8\x79\xfd\x7c\x3e\xe6\xe3\x3e\xe1\x93\x3e\xe5\xd3\x3e\xe3\xb3\x3e\xe7\xf3\xbe\xe0\x8b\xbe\xe4\xcb\xbe\xe2\xab\xbe\xe6\xeb\xbe\xe1\x9b\xbe\xe5\xdb\xbe\xe3\xbb\xbe\xe7\xfb\x7e\xe0\x87\x7e\xe4\x03\x1f\xfa\xc8\x8f\xf9\xf9\xfd\x02\x7e\x41\xbf\x90\x5f\xd8\x2f\xe2\x17\xf5\x8b\xf9\xc5\xfd\x12\x7e\x49\xbf\x94\x5f\xda\x2f\xe3\x97\xf5\xcb\xf9\xe5\xfd\x0a\x7e\x45\xbf\x92\x5f\xd9\xaf\xe2\x57\xf5\xab\xf9\xd5\xfd\x1a\x7e\x4d\xbf\x96\x5f\xdb\xaf\xe3\xd7\xf5\xeb\xf9\xf5\xfd\x06\x7e\x43\xbf\x91\xdf\xd8\x6f\xe2\x37\xf5\x9b\xf9\xcd\xfd\x16\x7e\x4b\xbf\x95\xdf\xda\x6f\xe3\xb7\xf5\xdb\xf9\xed\xfd\x0e\x7e\x47\xbf\x93\xdf\xd9\xef\xe2\x77\xf5\xbb\xf9\xdd\xfd\x1e\x7e\x4f\xbf\x97\xdf\xdb\xef\xe3\xf7\xf5\xfb\xf9\xfd\xfd\x01\xfe\x40\x7f\x90\x3f\xd8\x1f\xe2\x0f\xf5\x87\xf9\xc3\xfd\x11\xfe\x48\x7f\x94\x3f\xda\x1f\xe3\x8f\xf5\xc7\xf9\xe3\xfd\x09\xfe\x44\x7f\x92\x3f\xd9\x9f\xe2\x4f\xf5\xa7\xf9\xd3\xfd\x19\xfe\x4c\x7f\x96\x3f\xdb\x9f\xe3\xcf\xf5\xe7\xf9\xf3\xfd\x05\xfe\x42\x7f\x91\xbf\xd8\x5f\xe2\x2f\xf5\x97\xf9\xcb\xfd\x15\xfe\x4a\x7f\x95\xbf\xda\x5f\xe3\xaf\xf5\xd7\xf9\xeb\xfd\x0d\xfe\x46\x7f\x93\xbf\xd9\xdf\xe2\x6f\xf5\xb7\xf9\xdb\xfd\x1d\xfe\x4e\x7f\x97\xbf\xdb\xdf\xe3\xef\xf5\xf7\xf9\xfb\xfd\x03\xfe\x41\xff\x90\x7f\xd8\x3f\xe2\x1f\xf5\x8f\xf9\xc7\xfd\x13\xfe\x49\xff\x94\x7f\xda\x3f\xe3\x9f\xf5\xcf\xf9\xe7\xfd\x0b\xfe\x45\xff\x92\x7f\xd9\xbf\xe2\x5f\xf5\xaf\xf9\xd7\xfd\x1b\xfe\x4d\xff\x96\x7f\xdb\xbf\xe3\xdf\xf5\xef\xf9\xf7\xfd\x07\xfe\x43\xff\x91\xff\xd8\x7f\xe2\x3f\xf5\x9f\xf9\xcf\xfd\x17\xfe\x4b\xff\x95\xff\xda\x7f\xe3\xbf\xf5\xdf\xf9\xef\xfd\x0f\xfe\x47\xff\x93\xff\xd9\xff\xe2\x7f\xf5\xbf\xf9\xdf\xfd\x1f\xfe\x4f\xff\x97\xff\xdb\xff\xe3\xff\xf5\xff\xf9\x71\x7e\xbc\x9f\xe0\x27\x06\x49\x82\xa4\x41\xb2\x20\x79\x90\x22\x48\x19\xa4\x0a\x52\x07\x69\x82\xb4\x41\xba\x20\x7d\x90\x21\xc8\x18\x64\x0a\x32\x07\x59\x82\xac\x41\xb6\x20\x7b\x90\x23\xc8\x19\xe4\x0a\x72\x07\x79\x82\xbc\x41\xbe\x00\x0b\xf0\x80\x08\xc8\x80\x0a\xe8\x80\x09\xd8\x80\x0b\xf8\x40\x08\xc4\x40\x0a\xe4\x40\x09\xd4\x40\x0b\xf4\xc0\x08\xcc\xc0\x0a\xec\xc0\x09\xdc\xc0\x0b\xfc\x20\x08\xc2\x20\x0a\x40\x00\x03\x14\xc4\x82\xfc\x41\x81\xa0\x60\x50\x28\x28\x1c\x14\x09\x8a\x06\xc5\x82\xe2\x41\x89\xa0\x64\x50\x2a\x28\x1d\x94\x09\xca\x06\xe5\x82\xf2\x41\x85\xa0\x62\x50\x29\xa8\x1c\x54\x09\xaa\x06\xd5\x82\xea\x41\x8d\xa0\x66\x50\x2b\xa8\x1d\xd4\x09\xea\x06\xf5\x82\xfa\x41\x83\xa0\x61\xd0\x28\x68\x1c\x34\x09\x9a\x06\xcd\x82\xe6\x41\x8b\xa0\x65\xd0\x2a\x68\x1d\xb4\x09\xda\x06\xed\x82\xf6\x41\x87\xa0\x63\xd0\x29\xe8\x1c\x74\x09\xba\x06\xdd\x82\xee\x41\x8f\xa0\x67\xd0\x2b\xe8\x1d\xf4\x09\xfa\x06\xfd\x82\xfe\xc1\x80\x60\x60\x30\x28\x18\x1c\x0c\x09\x86\x06\xc3\x82\xe1\xc1\x88\x60\x64\x30\x2a\x18\x1d\x8c\x09\xc6\x06\xe3\x82\xf1\xc1\x84\x60\x62\x30\x29\x98\x1c\x4c\x09\xa6\x06\xd3\x82\xe9\xc1\x8c\x60\x66\x30\x2b\x98\x1d\xcc\x09\xe6\x06\xf3\x82\xf9\xc1\x82\x60\x61\xb0\x28\x58\x1c\x2c\x09\x96\x06\xcb\x82\xe5\xc1\x8a\x60\x65\xb0\x2a\x58\x1d\xac\x09\xd6\x06\xeb\x82\xf5\xc1\x86\x60\x63\xb0\x29\xd8\x1c\x6c\x09\xb6\x06\xdb\x82\xed\xc1\x8e\x60\x67\xb0\x2b\xd8\x1d\xec\x09\xf6\x06\xfb\x82\xfd\xc1\x81\xe0\x60\x70\x28\x38\x1c\x1c\x09\x8e\x06\xc7\x82\xe3\xc1\x89\xe0\x64\x70\x2a\x38\x1d\x9c\x09\xce\x06\xe7\x82\xf3\xc1\x85\xe0\x62\x70\x29\xb8\x1c\x5c\x09\xae\x06\xd7\x82\xeb\xc1\x8d\xe0\x66\x70\x2b\xb8\x1d\xdc\x09\xee\x06\xf7\x82\xfb\xc1\x83\xe0\x61\xf0\x28\x78\x1c\x3c\x09\x9e\x06\xcf\x82\xe7\xc1\x8b\xe0\x65\xf0\x2a\x78\x1d\xbc\x09\xde\x06\xef\x82\xf7\xc1\x87\xe0\x63\xf0\x29\xf8\x1c\x7c\x09\xbe\x06\xdf\x82\xef\xc1\x8f\xe0\x67\xf0\x2b\xf8\x1d\xfc\x09\xfe\x06\xff\x82\xb8\x20\x3e\x48\x08\x12\xc3\x24\x61\xd2\x30\x59\x98\x3c\x4c\x11\xa6\x0c\x53\x85\xa9\xc3\x34\x61\xda\x30\x5d\x98\x3e\xcc\x10\x66\x0c\x33\x85\x99\xc3\x2c\x61\xd6\x30\x5b\x98\x3d\xcc\x11\xe6\x0c\x73\x85\xb9\xc3\x3c\x61\xde\x30\x5f\x88\x85\x78\x48\x84\x64\x48\x85\x74\xc8\x84\x6c\xc8\x85\x7c\x28\x84\x62\x28\x85\x72\xa8\x84\x6a\xa8\x85\x7a\x68\x84\x66\x68\x85\x76\xe8\x84\x6e\xe8\x85\x7e\x18\x84\x61\x18\x85\x20\x84\x21\x0a\x63\x61\xfe\xb0\x40\x58\x30\x2c\x14\x16\x0e\x8b\x84\x45\xc3\x62\x61\xf1\xb0\x44\x58\x32\x2c\x15\x96\x0e\xcb\x84\x65\xc3\x72\x61\xf9\xb0\x42\x58\x31\xac\x14\x56\x0e\xab\x84\x55\xc3\x6a\x61\xf5\xb0\x46\x58\x33\xac\x15\xd6\x0e\xeb\x84\x75\xc3\x7a\x61\xfd\xb0\x41\xd8\x30\x6c\x14\x36\x0e\x9b\x84\x4d\xc3\x66\x61\xf3\xb0\x45\xd8\x32\x6c\x15\xb6\x0e\xdb\x84\x6d\xc3\x76\x61\xfb\xb0\x43\xd8\x31\xec\x14\x76\x0e\xbb\x84\x5d\xc3\x6e\x61\xf7\xb0\x47\xd8\x33\xec\x15\xf6\x0e\xfb\x84\x7d\xc3\x7e\x61\xff\x70\x40\x38\x30\x1c\x14\x0e\x0e\x87\x84\x43\xc3\x61\xe1\xf0\x70\x44\x38\x32\x1c\x15\x8e\x0e\xc7\x84\x63\xc3\x71\xe1\xf8\x70\x42\x38\x31\x9c\x14\x4e\x0e\xa7\x84\x53\xc3\x69\xe1\xf4\x70\x46\x38\x33\x9c\x15\xce\x0e\xe7\x84\x73\xc3\x79\xe1\xfc\x70\x41\xb8\x30\x5c\x14\x2e\x0e\x97\x84\x4b\xc3\x65\xe1\xf2\x70\x45\xb8\x32\x5c\x15\xae\x0e\xd7\x84\x6b\xc3\x75\xe1\xfa\x70\x43\xb8\x31\xdc\x14\x6e\x0e\xb7\x84\x5b\xc3\x6d\xe1\xf6\x70\x47\xb8\x33\xdc\x15\xee\x0e\xf7\x84\x7b\xc3\x7d\xe1\xfe\xf0\x40\x78\x30\x3c\x14\x1e\x0e\x8f\x84\x47\xc3\x63\xe1\xf1\xf0\x44\x78\x32\x3c\x15\x9e\x0e\xcf\x84\x67\xc3\x73\xe1\xf9\xf0\x42\x78\x31\xbc\x14\x5e\x0e\xaf\x84\x57\xc3\x6b\xe1\xf5\xf0\x46\x78\x33\xbc\x15\xde\x0e\xef\x84\x77\xc3\x7b\xe1\xfd\xf0\x41\xf8\x30\x7c\x14\x3e\x0e\x9f\x84\x4f\xc3\x67\xe1\xf3\xf0\x45\xf8\x32\x7c\x15\xbe\x0e\xdf\x84\x6f\xc3\x77\xe1\xfb\xf0\x43\xf8\x31\xfc\x14\x7e\x0e\xbf\x84\x5f\xc3\x6f\xe1\xf7\xf0\x47\xf8\x33\xfc\x15\xfe\x0e\xff\x84\x7f\xc3\x7f\x61\x5c\x18\x1f\x26\x84\x89\x51\x92\x28\x69\x94\x2c\x4a\x1e\xa5\x88\x52\x46\xa9\xa2\xd4\x51\x9a\x28\x6d\x94\x2e\x4a\x1f\x65\x88\x32\x46\x99\xa2\xcc\x51\x96\x28\x6b\x94\x2d\xca\x1e\xe5\x88\x72\x46\xb9\xa2\xdc\x51\x9e\x28\x6f\x94\x2f\xc2\x22\x3c\x22\x22\x32\xa2\x22\x3a\x62\x22\x36\xe2\x22\x3e\x12\x22\x31\x92\x22\x39\x52\x22\x35\xd2\x22\x3d\x32\x22\x33\xb2\x22\x3b\x72\x22\x37\xf2\x22\x3f\x0a\xa2\x30\x8a\x22\x10\xc1\x08\x45\xb1\x28\x7f\x54\x20\x2a\x18\x15\x8a\x0a\x47\x45\xa2\xa2\x51\xb1\xa8\x78\x54\x22\x2a\x19\x95\x8a\x4a\x47\x65\xa2\xb2\x51\xb9\xa8\x7c\x54\x21\xaa\x18\x55\x8a\x2a\x47\x55\xa2\xaa\x51\xb5\xa8\x7a\x54\x23\xaa\x19\xd5\x8a\x6a\x47\x75\xa2\xba\x51\xbd\xa8\x7e\xd4\x20\x6a\x18\x35\x8a\x1a\x47\x4d\xa2\xa6\x51\xb3\xa8\x79\xd4\x22\x6a\x19\xb5\x8a\x5a\x47\x6d\xa2\xb6\x51\xbb\xa8\x7d\xd4\x21\xea\x18\x75\x8a\x3a\x47\x5d\xa2\xae\x51\xb7\xa8\x7b\xd4\x23\xea\x19\xf5\x8a\x7a\x47\x7d\xa2\xbe\x51\xbf\xa8\x7f\x34\x20\x1a\x18\x0d\x8a\x06\x47\x43\xa2\xa1\xd1\xb0\x68\x78\x34\x22\x1a\x19\x8d\x8a\x46\x47\x63\xa2\xb1\xd1\xb8\x68\x7c\x34\x21\x9a\x18\x4d\x8a\x26\x47\x53\xa2\xa9\xd1\xb4\x68\x7a\x34\x23\x9a\x19\xcd\x8a\x66\x47\x73\xa2\xb9\xd1\xbc\x68\x7e\xb4\x20\x5a\x18\x2d\x8a\x16\x47\x4b\xa2\xa5\xd1\xb2\x68\x79\xb4\x22\x5a\x19\xad\x8a\x56\x47\x6b\xa2\xb5\xd1\xba\x68\x7d\xb4\x21\xda\x18\x6d\x8a\x36\x47\x5b\xa2\xad\xd1\xb6\x68\x7b\xb4\x23\xda\x19\xed\x8a\x76\x47\x7b\xa2\xbd\xd1\xbe\x68\x7f\x74\x20\x3a\x18\x1d\x8a\x0e\x47\x47\xa2\xa3\xd1\xb1\xe8\x78\x74\x22\x3a\x19\x9d\x8a\x4e\x47\x67\xa2\xb3\xd1\xb9\xe8\x7c\x74\x21\xba\x18\x5d\x8a\x2e\x47\x57\xa2\xab\xd1\xb5\xe8\x7a\x74\x23\xba\x19\xdd\x8a\x6e\x47\x77\xa2\xbb\xd1\xbd\xe8\x7e\xf4\x20\x7a\x18\x3d\x8a\x1e\x47\x4f\xa2\xa7\xd1\xb3\xe8\x79\xf4\x22\x7a\x19\xbd\x8a\x5e\x47\x6f\xa2\xb7\xd1\xbb\xe8\x7d\xf4\x21\xfa\x18\x7d\x8a\x3e\x47\x5f\xa2\xaf\xd1\xb7\xe8\x7b\xf4\x23\xfa\x19\xfd\x8a\x7e\x47\x7f\xa2\xbf\xd1\xbf\x28\x2e\x8a\x8f\x12\xa2\x44\x90\x04\x24\x05\xc9\x40\x72\x90\x02\xa4\x04\xa9\x40\x6a\x90\x06\xa4\x05\xe9\x40\x7a\x90\x01\x64\x04\x99\x40\x66\x90\x05\x64\x05\xd9\x40\x76\x90\x03\xe4\x04\xb9\x40\x6e\x90\x07\xe4\x05\xf9\x00\x06\x70\x40\x00\x12\x50\x80\x06\x0c\x60\x01\x07\x78\x20\x00\x11\x48\x40\x06\x0a\x50\x81\x06\x74\x60\x00\x13\x58\xc0\x06\x0e\x70\x81\x07\x7c\x10\x80\x10\x44\x00\x00\x08\x10\x88\x81\xfc\xa0\x00\x28\x08\x0a\x81\xc2\xa0\x08\x28\x0a\x8a\x81\xe2\xa0\x04\x28\x09\x4a\x81\xd2\xa0\x0c\x28\x0b\xca\x81\xf2\xa0\x02\xa8\x08\x2a\x81\xca\xa0\x0a\xa8\x0a\xaa\x81\xea\xa0\x06\xa8\x09\x6a\x81\xda\xa0\x0e\xa8\x0b\xea\x81\xfa\xa0\x01\x68\x08\x1a\x81\xc6\xa0\x09\x68\x0a\x9a\x81\xe6\xa0\x05\x68\x09\x5a\x81\xd6\xa0\x0d\x68\x0b\xda\x81\xf6\xa0\x03\xe8\x08\x3a\x81\xce\xa0\x0b\xe8\x0a\xba\x81\xee\xa0\x07\xe8\x09\x7a\x81\xde\xa0\x0f\xe8\x0b\xfa\x81\xfe\x60\x00\x18\x08\x06\x81\xc1\x60\x08\x18\x0a\x86\x81\xe1\x60\x04\x18\x09\x46\x81\xd1\x60\x0c\x18\x0b\xc6\x81\xf1\x60\x02\x98\x08\x26\x81\xc9\x60\x0a\x98\x0a\xa6\x81\xe9\x60\x06\x98\x09\x66\x81\xd9\x60\x0e\x98\x0b\xe6\x81\xf9\x60\x01\x58\x08\x16\x81\xc5\x60\x09\x58\x0a\x96\x81\xe5\x60\x05\x58\x09\x56\x81\xd5\x60\x0d\x58\x0b\xd6\x81\xf5\x60\x03\xd8\x08\x36\x81\xcd\x60\x0b\xd8\x0a\xb6\x81\xed\x60\x07\xd8\x09\x76\x81\xdd\x60\x0f\xd8\x0b\xf6\x81\xfd\xe0\x00\x38\x08\x0e\x81\xc3\xe0\x08\x38\x0a\x8e\x81\xe3\xe0\x04\x38\x09\x4e\x81\xd3\xe0\x0c\x38\x0b\xce\x81\xf3\xe0\x02\xb8\x08\x2e\x81\xcb\xe0\x0a\xb8\x0a\xae\x81\xeb\xe0\x06\xb8\x09\x6e\x81\xdb\xe0\x0e\xb8\x0b\xee\x81\xfb\xe0\x01\x78\x08\x1e\x81\xc7\xe0\x09\x78\x0a\x9e\x81\xe7\xe0\x05\x78\x09\x5e\x81\xd7\xe0\x0d\x78\x0b\xde\x81\xf7\xe0\x03\xf8\x08\x3e\x81\xcf\xe0\x0b\xf8\x0a\xbe\x81\xef\xe0\x07\xf8\x09\x7e\x81\xdf\xe0\x0f\xf8\x0b\xfe\x81\x38\x10\x0f\x12\x40\x22\x4c\x02\x93\xc2\x64\x30\x39\x4c\x01\x53\xc2\x54\x30\x35\x4c\x03\xd3\xc2\x74\x30\x3d\xcc\x00\x33\xc2\x4c\x30\x33\xcc\x02\xb3\xc2\x6c\x30\x3b\xcc\x01\x73\xc2\x5c\x30\x37\xcc\x03\xf3\xc2\x7c\x10\x83\x38\x24\x20\x09\x29\x48\x43\x06\xb2\x90\x83\x3c\x14\xa0\x08\x25\x28\x43\x05\xaa\x50\x83\x3a\x34\xa0\x09\x2d\x68\x43\x07\xba\xd0\x83\x3e\x0c\x60\x08\x23\x08\x20\x84\x08\xc6\x60\x7e\x58\x00\x16\x84\x85\x60\x61\x58\x04\x16\x85\xc5\x60\x71\x58\x02\x96\x84\xa5\x60\x69\x58\x06\x96\x85\xe5\x60\x79\x58\x01\x56\x84\x95\x60\x65\x58\x05\x56\x85\xd5\x60\x75\x58\x03\xd6\x84\xb5\x60\x6d\x58\x07\xd6\x85\xf5\x60\x7d\xd8\x00\x36\x84\x8d\x60\x63\xd8\x04\x36\x85\xcd\x60\x73\xd8\x02\xb6\x84\xad\x60\x6b\xd8\x06\xb6\x85\xed\x60\x7b\xd8\x01\x76\x84\x9d\x60\x67\xd8\x05\x76\x85\xdd\x60\x77\xd8\x03\xf6\x84\xbd\x60\x6f\xd8\x07\xf6\x85\xfd\x60\x7f\x38\x00\x0e\x84\x83\xe0\x60\x38\x04\x0e\x85\xc3\xe0\x70\x38\x02\x8e\x84\xa3\xe0\x68\x38\x06\x8e\x85\xe3\xe0\x78\x38\x01\x4e\x84\x93\xe0\x64\x38\x05\x4e\x85\xd3\xe0\x74\x38\x03\xce\x84\xb3\xe0\x6c\x38\x07\xce\x85\xf3\xe0\x7c\xb8\x00\x2e\x84\x8b\xe0\x62\xb8\x04\x2e\x85\xcb\xe0\x72\xb8\x02\xae\x84\xab\xe0\x6a\xb8\x06\xae\x85\xeb\xe0\x7a\xb8\x01\x6e\x84\x9b\xe0\x66\xb8\x05\x6e\x85\xdb\xe0\x76\xb8\x03\xee\x84\xbb\xe0\x6e\xb8\x07\xee\x85\xfb\xe0\x7e\x78\x00\x1e\x84\x87\xe0\x61\x78\x04\x1e\x85\xc7\xe0\x71\x78\x02\x9e\x84\xa7\xe0\x69\x78\x06\x9e\x85\xe7\xe0\x79\x78\x01\x5e\x84\x97\xe0\x65\x78\x05\x5e\x85\xd7\xe0\x75\x78\x03\xde\x84\xb7\xe0\x6d\x78\x07\xde\x85\xf7\xe0\x7d\xf8\x00\x3e\x84\x8f\xe0\x63\xf8\x04\x3e\x85\xcf\xe0\x73\xf8\x02\xbe\x84\xaf\xe0\x6b\xf8\x06\xbe\x85\xef\xe0\x7b\xf8\x01\x7e\x84\x9f\xe0\x67\xf8\x05\x7e\x85\xdf\xe0\x77\xf8\x03\xfe\x84\xbf\xe0\x6f\xf8\x07\xfe\x85\xff\x60\x1c\x8c\x87\x09\x30\x11\x25\x41\x49\x51\x32\x94\x1c\xa5\x40\x29\x51\x2a\x94\x1a\xa5\x41\x69\x51\x3a\x94\x1e\x65\x40\x19\x51\x26\x94\x19\x65\x41\x59\x51\x36\x94\x1d\xe5\x40\x39\x51\x2e\x94\x1b\xe5\x41\x79\x51\x3e\x84\x21\x1c\x11\x88\x44\x14\xa2\x11\x83\x58\xc4\x21\x1e\x09\x48\x44\x12\x92\x91\x82\x54\xa4\x21\x1d\x19\xc8\x44\x16\xb2\x91\x83\x5c\xe4\x21\x1f\x05\x28\x44\x11\x02\x08\x22\x84\x62\x28\x3f\x2a\x80\x0a\xa2\x42\xa8\x30\x2a\x82\x8a\xa2\x62\xa8\x38\x2a\x81\x4a\xa2\x52\xa8\x34\x2a\x83\xca\xa2\x72\xa8\x3c\xaa\x80\x2a\xa2\x4a\xa8\x32\xaa\x82\xaa\xa2\x6a\xa8\x3a\xaa\x81\x6a\xa2\x5a\xa8\x36\xaa\x83\xea\xa2\x7a\xa8\x3e\x6a\x80\x1a\xa2\x46\xa8\x31\x6a\x82\x9a\xa2\x66\xa8\x39\x6a\x81\x5a\xa2\x56\xa8\x35\x6a\x83\xda\xa2\x76\xa8\x3d\xea\x80\x3a\xa2\x4e\xa8\x33\xea\x82\xba\xa2\x6e\xa8\x3b\xea\x81\x7a\xa2\x5e\xa8\x37\xea\x83\xfa\xa2\x7e\xa8\x3f\x1a\x80\x06\xa2\x41\x68\x30\x1a\x82\x86\xa2\x61\x68\x38\x1a\x81\x46\xa2\x51\x68\x34\x1a\x83\xc6\xa2\x71\x68\x3c\x9a\x80\x26\xa2\x49\x68\x32\x9a\x82\xa6\xa2\x69\x68\x3a\x9a\x81\x66\xa2\x59\x68\x36\x9a\x83\xe6\xa2\x79\x68\x3e\x5a\x80\x16\xa2\x45\x68\x31\x5a\x82\x96\xa2\x65\x68\x39\x5a\x81\x56\xa2\x55\x68\x35\x5a\x83\xd6\xa2\x75\x68\x3d\xda\x80\x36\xa2\x4d\x68\x33\xda\x82\xb6\xa2\x6d\x68\x3b\xda\x81\x76\xa2\x5d\x68\x37\xda\x83\xf6\xa2\x7d\x68\x3f\x3a\x80\x0e\xa2\x43\xe8\x30\x3a\x82\x8e\xa2\x63\xe8\x38\x3a\x81\x4e\xa2\x53\xe8\x34\x3a\x83\xce\xa2\x73\xe8\x3c\xba\x80\x2e\xa2\x4b\xe8\x32\xba\x82\xae\xa2\x6b\xe8\x3a\xba\x81\x6e\xa2\x5b\xe8\x36\xba\x83\xee\xa2\x7b\xe8\x3e\x7a\x80\x1e\xa2\x47\xe8\x31\x7a\x82\x9e\xa2\x67\xe8\x39\x7a\x81\x5e\xa2\x57\xe8\x35\x7a\x83\xde\xa2\x77\xe8\x3d\xfa\x80\x3e\xa2\x4f\xe8\x33\xfa\x82\xbe\xa2\x6f\xe8\x3b\xfa\x81\x7e\xa2\x5f\xe8\x37\xfa\x83\xfe\xa2\x7f\x28\x0e\xc5\xa3\x04\x94\x18\x4b\x12\x4b\x1a\x4b\x16\x4b\x1e\x4b\x11\x4b\x19\x4b\x15\x4b\x1d\x4b\x13\x4b\x1b\x4b\x17\x4b\x1f\xcb\x10\xcb\x18\xcb\x14\xcb\x1c\xcb\x12\xcb\x1a\xcb\x16\xcb\x1e\xcb\x11\xcb\x19\xcb\x15\xcb\x1d\xcb\x13\xcb\x1b\xcb\x17\xc3\x62\x78\x8c\x88\x91\x31\x2a\x46\xc7\x98\x18\x1b\xe3\x62\x7c\x4c\x88\x89\x31\x29\x26\xc7\x94\x98\x1a\xd3\x62\x7a\xcc\x88\x99\x31\x2b\x66\xc7\x9c\x98\x1b\xf3\x62\x7e\x2c\x88\x85\xb1\x28\x06\x62\x30\x86\x62\xb1\x58\xfe\x58\x81\x58\xc1\x58\xa1\x58\xe1\x58\x91\x58\xd1\x58\xb1\x58\xf1\x58\x89\x58\xc9\x58\xa9\x58\xe9\x58\x99\x58\xd9\x58\xb9\x58\xf9\x58\x85\x58\xc5\x58\xa5\x58\xe5\x58\x95\x58\xd5\xff\x04\xc0\x03\x80\x1c\x31\x00\x00\xc0\xda\xb6\x6d\x5b\x6b\xdb\x4a\x72\xb5\x6d\xdb\xb6\x6d\xdb\xb6\x6d\xdb\xb6\xf1\xe8\x60\x1e\xe6\x63\x01\x16\x62\x11\x06\x30\x88\x21\x2c\x86\xd5\xc7\x1a\x60\x0d\xb1\x46\x58\x63\xac\x09\xd6\x14\x6b\x86\x35\xc7\x5a\x60\x2d\xb1\x56\x58\x6b\xac\x0d\xd6\x16\x6b\x87\xb5\xc7\x3a\x60\x1d\xb1\x4e\x58\x67\xac\x0b\xd6\x15\xeb\x86\x75\xc7\x7a\x60\x3d\xb1\x5e\x58\x6f\xac\x0f\xd6\x17\xeb\x87\xf5\xc7\x06\x60\x03\xb1\x41\xd8\x60\x6c\x08\x36\x14\x1b\x86\x0d\xc7\x46\x60\x23\xb1\x51\xd8\x68\x6c\x0c\x36\x16\x1b\x87\x8d\xc7\x26\x60\x13\xb1\x49\xd8\x64\x6c\x0a\x36\x15\x9b\x86\x4d\xc7\x66\x60\x33\xb1\x59\xd8\x6c\x6c\x0e\x36\x17\x9b\x87\xcd\xc7\x16\x60\x0b\xb1\x45\xd8\x62\x6c\x09\xb6\x14\x5b\x86\x2d\xc7\x56\x60\x2b\xb1\x55\xd8\x6a\x6c\x0d\xb6\x16\x5b\x87\xad\xc7\x36\x60\x1b\xb1\x4d\xd8\x66\x6c\x0b\xb6\x15\xdb\x86\x6d\xc7\x76\x60\x3b\xb1\x5d\xd8\x6e\x6c\x0f\xb6\x17\xdb\x87\xed\xc7\x0e\x60\x07\xb1\x43\xd8\x61\xec\x08\x76\x14\x3b\x86\x1d\xc7\x4e\x60\x27\xb1\x53\xd8\x69\xec\x0c\x76\x16\x3b\x87\x9d\xc7\x2e\x60\x17\xb1\x4b\xd8\x65\xec\x0a\x76\x15\xbb\x86\x5d\xc7\x6e\x60\x37\xb1\x5b\xd8\x6d\xec\x0e\x76\x17\xbb\x87\xdd\xc7\x1e\x60\x0f\xb1\x47\xd8\x63\xec\x09\xf6\x14\x7b\x86\x3d\xc7\x5e\x60\x2f\xb1\x57\xd8\x6b\xec\x0d\xf6\x16\x7b\x87\xbd\xc7\x3e\x60\x1f\xb1\x4f\xd8\x67\xec\x0b\xf6\x15\xfb\x86\x7d\xc7\x7e\x60\x3f\xb1\x5f\xd8\x6f\xec\x0f\xf6\x17\xfb\x87\xc5\x61\xf1\x58\x02\x96\x88\x27\xc1\x93\xe2\xc9\xf0\xe4\x78\x0a\x3c\x25\x9e\x0a\x4f\x8d\xa7\xc1\xd3\xe2\xe9\xf0\xf4\x78\x06\x3c\x23\x9e\x09\xcf\x8c\x67\xc1\xb3\xe2\xd9\xf0\xec\x78\x0e\x3c\x27\x9e\x0b\xcf\x8d\xe7\xc1\xf3\xe2\xf9\xf0\xfc\x78\x01\xbc\x20\x5e\x08\x2f\x8c\x17\xc1\x8b\xe2\xc5\xf0\xe2\x78\x09\xbc\x24\x5e\x0a\x2f\x8d\x97\xc1\xcb\xe2\xe5\xf0\xf2\x78\x05\xbc\x22\x5e\x09\xaf\x8c\x57\xc1\xab\xe2\xd5\xf0\xea\x78\x0d\xbc\x26\x5e\x0b\xaf\x8d\xd7\xc1\xeb\xe2\xf5\x70\x0c\xc7\x71\x02\x27\x71\x0a\xa7\x71\x06\x67\x71\x0e\xe7\x71\x01\x17\x71\x09\x97\x71\x05\x57\x71\x0d\xd7\x71\x03\x37\x71\x0b\xb7\x71\x07\x77\x71\x0f\xf7\xf1\x00\x0f\xf1\x08\x07\x38\xc4\x11\x1e\xc3\xeb\xe3\x0d\xf0\x86\x78\x23\xbc\x31\xde\x04\x6f\x8a\x37\xc3\x9b\xe3\x2d\xf0\x96\x78\x2b\xbc\x35\xde\x06\x6f\x8b\xb7\xc3\xdb\xe3\x1d\xf0\x8e\x78\x27\xbc\x33\xde\x05\xef\x8a\x77\xc3\xbb\xe3\x3d\xf0\x9e\x78\x2f\xbc\x37\xde\x07\xef\x8b\xf7\xc3\xfb\xe3\x03\xf0\x81\xf8\x20\x7c\x30\x3e\x04\x1f\x8a\x0f\xc3\x87\xe3\x23\xf0\x91\xf8\x28\x7c\x34\x3e\x06\x1f\x8b\x8f\xc3\xc7\xe3\x13\xf0\x89\xf8\x24\x7c\x32\x3e\x05\x9f\x8a\x4f\xc3\xa7\xe3\x33\xf0\x99\xf8\x2c\x7c\x36\x3e\x07\x9f\x8b\xcf\xc3\xe7\xe3\x0b\xf0\x85\xf8\x22\x7c\x31\xbe\x04\x5f\x8a\x2f\xc3\x97\xe3\x2b\xf0\x95\xf8\x2a\x7c\x35\xbe\x06\x5f\x8b\xaf\xc3\xd7\xe3\x1b\xf0\x8d\xf8\x26\x7c\x33\xbe\x05\xdf\x8a\x6f\xc3\xb7\xe3\x3b\xf0\x9d\xf8\x2e\x7c\x37\xbe\x07\xdf\x8b\xef\xc3\xf7\xe3\x07\xf0\x83\xf8\x21\xfc\x30\x7e\x04\x3f\x8a\x1f\xc3\x8f\xe3\x27\xf0\x93\xf8\x29\xfc\x34\x7e\x06\x3f\x8b\x9f\xc3\xcf\xe3\x17\xf0\x8b\xf8\x25\xfc\x32\x7e\x05\xbf\x8a\x5f\xc3\xaf\xe3\x37\xf0\x9b\xf8\x2d\xfc\x36\x7e\x07\xbf\x8b\xdf\xc3\xef\xe3\x0f\xf0\x87\xf8\x23\xfc\x31\xfe\x04\x7f\x8a\x3f\xc3\x9f\xe3\x2f\xf0\x97\xf8\x2b\xfc\x35\xfe\x06\x7f\x8b\xbf\xc3\xdf\xe3\x1f\xf0\x8f\xf8\x27\xfc\x33\xfe\x05\xff\x8a\x7f\xc3\xbf\xe3\x3f\xf0\x9f\xf8\x2f\xfc\x37\xfe\x07\xff\x8b\xff\xc3\xe3\xf0\x78\x3c\x01\x4f\x24\x92\x10\x49\x89\x64\x44\x72\x22\x05\x91\x92\x48\x45\xa4\x26\xd2\x10\x69\x89\x74\x44\x7a\x22\x03\x91\x91\xc8\x44\x64\x26\xb2\x10\x59\x89\x6c\x44\x76\x22\x07\x91\x93\xc8\x45\xe4\x26\xf2\x10\x79\x89\x7c\x44\x7e\xa2\x00\x51\x90\x28\x44\x14\x26\x8a\x10\x45\x89\x62\x44\x71\xa2\x04\x51\x92\x28\x45\x94\x26\xca\x10\x65\x89\x72\x44\x79\xa2\x02\x51\x91\xa8\x44\x54\x26\xaa\x10\x55\x89\x6a\x44\x75\xa2\x06\x51\x93\xa8\x45\xd4\x26\xea\x10\x75\x89\x7a\x04\x46\xe0\x04\x41\x90\x04\x45\xd0\x04\x43\xb0\x04\x47\xf0\x84\x40\x88\x84\x44\xc8\x84\x42\xa8\x84\x46\xe8\x84\x41\x98\x84\x45\xd8\x84\x43\xb8\x84\x47\xf8\x44\x40\x84\x44\x44\x00\x02\x12\x88\x88\x11\xf5\x89\x06\x44\x43\xa2\x11\xd1\x98\x68\x42\x34\x25\x9a\x11\xcd\x89\x16\x44\x4b\xa2\x15\xd1\x9a\x68\x43\xb4\x25\xda\x11\xed\x89\x0e\x44\x47\xa2\x13\xd1\x99\xe8\x42\x74\x25\xba\x11\xdd\x89\x1e\x44\x4f\xa2\x17\xd1\x9b\xe8\x43\xf4\x25\xfa\x11\xfd\x89\x01\xc4\x40\x62\x10\x31\x98\x18\x42\x0c\x25\x86\x11\xc3\x89\x11\xc4\x48\x62\x14\x31\x9a\x18\x43\x8c\x25\xc6\x11\xe3\x89\x09\xc4\x44\x62\x12\x31\x99\x98\x42\x4c\x25\xa6\x11\xd3\x89\x19\xc4\x4c\x62\x16\x31\x9b\x98\x43\xcc\x25\xe6\x11\xf3\x89\x05\xc4\x42\x62\x11\xb1\x98\x58\x42\x2c\x25\x96\x11\xcb\x89\x15\xc4\x4a\x62\x15\xb1\x9a\x58\x43\xac\x25\xd6\x11\xeb\x89\x0d\xc4\x46\x62\x13\xb1\x99\xd8\x42\x6c\x25\xb6\x11\xdb\x89\x1d\xc4\x4e\x62\x17\xb1\x9b\xd8\x43\xec\x25\xf6\x11\xfb\x89\x03\xc4\x41\xe2\x10\x71\x98\x38\x42\x1c\x25\x8e\x11\xc7\x89\x13\xc4\x49\xe2\x14\x71\x9a\x38\x43\x9c\x25\xce\x11\xe7\x89\x0b\xc4\x45\xe2\x12\x71\x99\xb8\x42\x5c\x25\xae\x11\xd7\x89\x1b\xc4\x4d\xe2\x16\x71\x9b\xb8\x43\xdc\x25\xee\x11\xf7\x89\x07\xc4\x43\xe2\x11\xf1\x98\x78\x42\x3c\x25\x9e\x11\xcf\x89\x17\xc4\x4b\xe2\x15\xf1\x9a\x78\x43\xbc\x25\xde\x11\xef\x89\x0f\xc4\x47\xe2\x13\xf1\x99\xf8\x42\x7c\x25\xbe\x11\xdf\x89\x1f\xc4\x4f\xe2\x17\xf1\x9b\xf8\x43\xfc\x25\xfe\x11\x71\x44\x3c\x91\x40\x24\x92\x49\xc8\xa4\x64\x32\x32\x39\x99\x82\x4c\x49\xa6\x22\x53\x93\x69\xc8\xb4\x64\x3a\x32\x3d\x99\x81\xcc\x48\x66\x22\x33\x93\x59\xc8\xac\x64\x36\x32\x3b\x99\x83\xcc\x49\xe6\x22\x73\x93\x79\xc8\xbc\x64\x3e\x32\x3f\x59\x80\x2c\x48\x16\x22\x0b\x93\x45\xc8\xa2\x64\x31\xb2\x38\x59\x82\x2c\x49\x96\x22\x4b\x93\x65\xc8\xb2\x64\x39\xb2\x3c\x59\x81\xac\x48\x56\x22\x2b\x93\x55\xc8\xaa\x64\x35\xb2\x3a\x59\x83\xac\x49\xd6\x22\x6b\x93\x75\xc8\xba\x64\x3d\x12\x23\x71\x92\x20\x49\x92\x22\x69\x92\x21\x59\x92\x23\x79\x52\x20\x45\x52\x22\x65\x52\x21\x55\x52\x23\x75\xd2\x20\x4d\xd2\x22\x6d\xd2\x21\x5d\xd2\x23\x7d\x32\x20\x43\x32\x22\x01\x09\x49\x44\xc6\xc8\xfa\x64\x03\xb2\x21\xd9\x88\x6c\x4c\x36\x21\x9b\x92\xcd\xc8\xe6\x64\x0b\xb2\x25\xd9\x8a\x6c\x4d\xb6\x21\xdb\x92\xed\xc8\xf6\x64\x07\xb2\x23\xd9\x89\xec\x4c\x76\x21\xbb\x92\xdd\xc8\xee\x64\x0f\xb2\x27\xd9\x8b\xec\x4d\xf6\x21\xfb\x92\xfd\xc8\xfe\xe4\x00\x72\x20\x39\x88\x1c\x4c\x0e\x21\x87\x92\xc3\xc8\xe1\xe4\x08\x72\x24\x39\x8a\x1c\x4d\x8e\x21\xc7\x92\xe3\xc8\xf1\xe4\x04\x72\x22\x39\x89\x9c\x4c\x4e\x21\xa7\x92\xd3\xc8\xe9\xe4\x0c\x72\x26\x39\x8b\x9c\x4d\xce\x21\xe7\x92\xf3\xc8\xf9\xe4\x02\x72\x21\xb9\x88\x5c\x4c\x2e\x21\x97\x92\xcb\xc8\xe5\xe4\x0a\x72\x25\xb9\x8a\x5c\x4d\xae\x21\xd7\x92\xeb\xc8\xf5\xe4\x06\x72\x23\xb9\x89\xdc\x4c\x6e\x21\xb7\x92\xdb\xc8\xed\xe4\x0e\x72\x27\xb9\x8b\xdc\x4d\xee\x21\xf7\x92\xfb\xc8\xfd\xe4\x01\xf2\x20\x79\x88\x3c\x4c\x1e\x21\x8f\x92\xc7\xc8\xe3\xe4\x09\xf2\x24\x79\x8a\x3c\x4d\x9e\x21\xcf\x92\xe7\xc8\xf3\xe4\x05\xf2\x22\x79\x89\xbc\x4c\x5e\x21\xaf\x92\xd7\xc8\xeb\xe4\x0d\xf2\x26\x79\x8b\xbc\x4d\xde\x21\xef\x92\xf7\xc8\xfb\xe4\x03\xf2\x21\xf9\x88\x7c\x4c\x3e\x21\x9f\x92\xcf\xc8\xe7\xe4\x0b\xf2\x25\xf9\x8a\x7c\x4d\xbe\x21\xdf\x92\xef\xc8\xf7\xe4\x07\xf2\x23\xf9\x89\xfc\x4c\x7e\x21\xbf\x92\xdf\xc8\xef\xe4\x0f\xf2\x27\xf9\x8b\xfc\x4d\xfe\x21\xff\x92\xff\xc8\x38\x32\x9e\x4c\x20\x13\xa9\x24\x54\x52\x2a\x19\x95\x9c\x4a\x41\xa5\xa4\x52\x51\xa9\xa9\x34\x54\x5a\x2a\x1d\x95\x9e\xca\x40\x65\xa4\x32\x51\x99\xa9\x2c\x54\x56\x2a\x1b\x95\x9d\xca\x41\xe5\xa4\x72\x51\xb9\xa9\x3c\x54\x5e\x2a\x1f\x95\x9f\x2a\x40\x15\xa4\x0a\x51\x85\xa9\x22\x54\x51\xaa\x18\x55\x9c\x2a\x41\x95\xa4\x4a\x51\xa5\xa9\x32\x54\x59\xaa\x1c\x55\x9e\xaa\x40\x55\xa4\x2a\x51\x95\xa9\x2a\x54\x55\xaa\x1a\x55\x9d\xaa\x41\xd5\xa4\x6a\x51\xb5\xa9\x3a\x54\x5d\xaa\x1e\x85\x51\x38\x45\x50\x24\x45\x51\x34\xc5\x50\x2c\xc5\x51\x3c\x25\x50\x22\x25\x51\x32\xa5\x50\x2a\xa5\x51\x3a\x65\x50\x26\x65\x51\x36\xe5\x50\x2e\xe5\x51\x3e\x15\x50\x21\x15\x51\x80\x82\x14\xa2\x62\x54\x7d\xaa\x01\xd5\x90\x6a\x44\x35\xa6\x9a\x50\x4d\xa9\x66\x54\x73\xaa\x05\xd5\x92\x6a\x45\xb5\xa6\xda\x50\x6d\xa9\x76\x54\x7b\xaa\x03\xd5\x91\xea\x44\x75\xa6\xba\x50\x5d\xa9\x6e\x54\x77\xaa\x07\xd5\x93\xea\x45\xf5\xa6\xfa\x50\x7d\xa9\x7e\x54\x7f\x6a\x00\x35\x90\x1a\x44\x0d\xa6\x86\x50\x43\xa9\x61\xd4\x70\x6a\x04\x35\x92\x1a\x45\x8d\xa6\xc6\x50\x63\xa9\x71\xd4\x78\x6a\x02\x35\x91\x9a\x44\x4d\xa6\xa6\x50\x53\xa9\x69\xd4\x74\x6a\x06\x35\x93\x9a\x45\xcd\xa6\xe6\x50\x73\xa9\x79\xd4\x7c\x6a\x01\xb5\x90\x5a\x44\x2d\xa6\x96\x50\x4b\xa9\x65\xd4\x72\x6a\x05\xb5\x92\x5a\x45\xad\xa6\xd6\x50\x6b\xa9\x75\xd4\x7a\x6a\x03\xb5\x91\xda\x44\x6d\xa6\xb6\x50\x5b\xa9\x6d\xd4\x76\x6a\x07\xb5\x93\xda\x45\xed\xa6\xf6\x50\x7b\xa9\x7d\xd4\x7e\xea\x00\x75\x90\x3a\x44\x1d\xa6\x8e\x50\x47\xa9\x63\xd4\x71\xea\x04\x75\x92\x3a\x45\x9d\xa6\xce\x50\x67\xa9\x73\xd4\x79\xea\x02\x75\x91\xba\x44\x5d\xa6\xae\x50\x57\xa9\x6b\xd4\x75\xea\x06\x75\x93\xba\x45\xdd\xa6\xee\x50\x77\xa9\x7b\xd4\x7d\xea\x01\xf5\x90\x7a\x44\x3d\xa6\x9e\x50\x4f\xa9\x67\xd4\x73\xea\x05\xf5\x92\x7a\x45\xbd\xa6\xde\x50\x6f\xa9\x77\xd4\x7b\xea\x03\xf5\x91\xfa\x44\x7d\xa6\xbe\x50\x5f\xa9\x6f\xd4\x77\xea\x07\xf5\x93\xfa\x45\xfd\xa6\xfe\x50\x7f\xa9\x7f\x54\x1c\x15\x4f\x25\x50\x89\x74\x12\x3a\x29\x9d\x8c\x4e\x4e\xa7\xa0\x53\xd2\xa9\xe8\xd4\x74\x1a\x3a\x2d\x9d\x8e\x4e\x4f\x67\xa0\x33\xd2\x99\xe8\xcc\x74\x16\x3a\x2b\x9d\x8d\xce\x4e\xe7\xa0\x73\xd2\xb9\xe8\xdc\x74\x1e\x3a\x2f\x9d\x8f\xce\x4f\x17\xa0\x0b\xd2\x85\xe8\xc2\x74\x11\xba\x28\x5d\x8c\x2e\x4e\x97\xa0\x4b\xd2\xa5\xe8\xd2\x74\x19\xba\x2c\x5d\x8e\x2e\x4f\x57\xa0\x2b\xd2\x95\xe8\xca\x74\x15\xba\x2a\x5d\x8d\xae\x4e\xd7\xa0\x6b\xd2\xb5\xe8\xda\x74\x1d\xba\x2e\x5d\x8f\xc6\x68\x9c\x26\x68\x92\xa6\x68\x9a\x66\x68\x96\xe6\x68\x9e\x16\x68\x91\x96\x68\x99\x56\x68\x95\xd6\x68\x9d\x36\x68\x93\xb6\x68\x9b\x76\x68\x97\xf6\x68\x9f\x0e\xe8\x90\x8e\x68\x40\x43\x1a\xd1\x31\xba\x3e\xdd\x80\x6e\x48\x37\xa2\x1b\xd3\x4d\xe8\xa6\x74\x33\xba\x39\xdd\x82\x6e\x49\xb7\xa2\x5b\xd3\x6d\xe8\xb6\x74\x3b\xba\x3d\xdd\x81\xee\x48\x77\xa2\x3b\xd3\x5d\xe8\xae\x74\x37\xba\x3b\xdd\x83\xee\x49\xf7\xa2\x7b\xd3\x7d\xe8\xbe\x74\x3f\xba\x3f\x3d\x80\x1e\x48\x0f\xa2\x07\xd3\x43\xe8\xa1\xf4\x30\x7a\x38\x3d\x82\x1e\x49\x8f\xa2\x47\xd3\x63\xe8\xb1\xf4\x38\x7a\x3c\x3d\x81\x9e\x48\x4f\xa2\x27\xd3\x53\xe8\xa9\xf4\x34\x7a\x3a\x3d\x83\x9e\x49\xcf\xa2\x67\xd3\x73\xe8\xb9\xf4\x3c\x7a\x3e\xbd\x80\x5e\x48\x2f\xa2\x17\xd3\x4b\xe8\xa5\xf4\x32\x7a\x39\xbd\x82\x5e\x49\xaf\xa2\x57\xd3\x6b\xe8\xb5\xf4\x3a\x7a\x3d\xbd\x81\xde\x48\x6f\xa2\x37\xd3\x5b\xe8\xad\xf4\x36\x7a\x3b\xbd\x83\xde\x49\xef\xa2\x77\xd3\x7b\xe8\xbd\xf4\x3e\x7a\x3f\x7d\x80\x3e\x48\x1f\xa2\x0f\xd3\x47\xe8\xa3\xf4\x31\xfa\x38\x7d\x82\x3e\x49\x9f\xa2\x4f\xd3\x67\xe8\xb3\xf4\x39\xfa\x3c\x7d\x81\xbe\x48\x5f\xa2\x2f\xd3\x57\xe8\xab\xf4\x35\xfa\x3a\x7d\x83\xbe\x49\xdf\xa2\x6f\xd3\x77\xe8\xbb\xf4\x3d\xfa\x3e\xfd\x80\x7e\x48\x3f\xa2\x1f\xd3\x4f\xe8\xa7\xf4\x33\xfa\x39\xfd\x82\x7e\x49\xbf\xa2\x5f\xd3\x6f\xe8\xb7\xf4\x3b\xfa\x3d\xfd\x81\xfe\x48\x7f\xa2\x3f\xd3\x5f\xe8\xaf\xf4\x37\xfa\x3b\xfd\x83\xfe\x49\xff\xa2\x7f\xd3\x7f\xe8\xbf\xf4\x3f\x3a\x8e\x8e\xa7\x13\xe8\x44\x26\x09\x93\x94\x49\xc6\x24\x67\x52\x30\x29\x99\x54\x4c\x6a\x26\x0d\x93\x96\x49\xc7\xa4\x67\x32\x30\x19\x99\x4c\x4c\x66\x26\x0b\x93\x95\xc9\xc6\x64\x67\x72\x30\x39\x99\x5c\x4c\x6e\x26\x0f\x93\x97\xc9\xc7\xe4\x67\x0a\x30\x05\x99\x42\x4c\x61\xa6\x08\x53\x94\x29\xc6\x14\x67\x4a\x30\x25\x99\x52\x4c\x69\xa6\x0c\x53\x96\x29\xc7\x94\x67\x2a\x30\x15\x99\x4a\x4c\x65\xa6\x0a\x53\x95\xa9\xc6\x54\x67\x6a\x30\x35\x99\x5a\x4c\x6d\xa6\x0e\x53\x97\xa9\xc7\x60\x0c\xce\x10\x0c\xc9\x50\x0c\xcd\x30\x0c\xcb\x70\x0c\xcf\x08\x8c\xc8\x48\x8c\xcc\x28\x8c\xca\x68\x8c\xce\x18\x8c\xc9\x58\x8c\xcd\x38\x8c\xcb\x78\x8c\xcf\x04\x4c\xc8\x44\x0c\x60\x20\x83\x98\x18\x53\x9f\x69\xc0\x34\x64\x1a\x31\x8d\x99\x26\x4c\x53\xa6\x19\xd3\x9c\x69\xc1\xb4\x64\x5a\x31\xad\x99\x36\x4c\x5b\xa6\x1d\xd3\x9e\xe9\xc0\x74\x64\x3a\x31\x9d\x99\x2e\x4c\x57\xa6\x1b\xd3\x9d\xe9\xc1\xf4\x64\x7a\x31\xbd\x99\x3e\x4c\x5f\xa6\x1f\xd3\x9f\x19\xc0\x0c\x64\x06\x31\x83\x99\x21\xcc\x50\x66\x18\x33\x9c\x19\xc1\x8c\x64\x46\x31\xa3\x99\x31\xcc\x58\x66\x1c\x33\x9e\x99\xc0\x4c\x64\x26\x31\x93\x99\x29\xcc\x54\x66\x1a\x33\x9d\x99\xc1\xcc\x64\x66\x31\xb3\x99\x39\xcc\x5c\x66\x1e\x33\x9f\x59\xc0\x2c\x64\x16\x31\x8b\x99\x25\xcc\x52\x66\x19\xb3\x9c\x59\xc1\xac\x64\x56\x31\xab\x99\x35\xcc\x5a\x66\x1d\xb3\x9e\xd9\xc0\x6c\x64\x36\x31\x9b\x99\x2d\xcc\x56\x66\x1b\xb3\x9d\xd9\xc1\xec\x64\x76\x31\xbb\x99\x3d\xcc\x5e\x66\x1f\xb3\x9f\x39\xc0\x1c\x64\x0e\x31\x87\x99\x23\xcc\x51\xe6\x18\x73\x9c\x39\xc1\x9c\x64\x4e\x31\xa7\x99\x33\xcc\x59\xe6\x1c\x73\x9e\xb9\xc0\x5c\x64\x2e\x31\x97\x99\x2b\xcc\x55\xe6\x1a\x73\x9d\xb9\xc1\xdc\x64\x6e\x31\xb7\x99\x3b\xcc\x5d\xe6\x1e\x73\x9f\x79\xc0\x3c\x64\x1e\x31\x8f\x99\x27\xcc\x53\xe6\x19\xf3\x9c\x79\xc1\xbc\x64\x5e\x31\xaf\x99\x37\xcc\x5b\xe6\x1d\xf3\x9e\xf9\xc0\x7c\x64\x3e\x31\x9f\x99\x2f\xcc\x57\xe6\x1b\xf3\x9d\xf9\xc1\xfc\x64\x7e\x31\xbf\x99\x3f\xcc\x5f\xe6\x1f\x13\xc7\xc4\x33\x09\x4c\x22\x9b\x84\x4d\xca\x26\x63\x93\xb3\x29\xd8\x94\x6c\x2a\x36\x35\x9b\x86\x4d\xcb\xa6\x63\xd3\xb3\x19\xd8\x8c\x6c\x26\x36\x33\x9b\x85\xcd\xca\x66\x63\xb3\xb3\x39\xd8\x9c\x6c\x2e\x36\x37\x9b\x87\xcd\xcb\xe6\x63\xf3\xb3\x05\xd8\x82\x6c\x21\xb6\x30\x5b\x84\x2d\xca\x16\x63\x8b\xb3\x25\xd8\x92\x6c\x29\xb6\x34\x5b\x86\x2d\xcb\x96\x63\xcb\xb3\x15\xd8\x8a\x6c\x25\xb6\x32\x5b\x85\xad\xca\x56\x63\xab\xb3\x35\xd8\x9a\x6c\x2d\xb6\x36\x5b\x87\xad\xcb\xd6\x63\x31\x16\x67\x09\x96\x64\x29\x96\x66\x19\x96\x65\x39\x96\x67\x05\x56\x64\x25\x56\x66\x15\x56\x65\x35\x56\x67\x0d\xd6\x64\x2d\xd6\x66\x1d\xd6\x65\x3d\xd6\x67\x03\x36\x64\x23\x16\xb0\x90\x45\x6c\x8c\xad\xcf\x36\x60\x1b\xb2\x8d\xd8\xc6\x6c\x13\xb6\x29\xdb\x8c\x6d\xce\xb6\x60\x5b\xb2\xad\xd8\xd6\x6c\x1b\xb6\x2d\xdb\x8e\x6d\xcf\x76\x60\x3b\xb2\x9d\xd8\xce\x6c\x17\xb6\x2b\xdb\x8d\xed\xce\xf6\x60\x7b\xb2\xbd\xd8\xde\x6c\x1f\xb6\x2f\xdb\x8f\xed\xcf\x0e\x60\x07\xb2\x83\xd8\xc1\xec\x10\x76\x28\x3b\x8c\x1d\xce\x8e\x60\x47\xb2\xa3\xd8\xd1\xec\x18\x76\x2c\x3b\x8e\x1d\xcf\x4e\x60\x27\xb2\x93\xd8\xc9\xec\x14\x76\x2a\x3b\x8d\x9d\xce\xce\x60\x67\xb2\xb3\xd8\xd9\xec\x1c\x76\x2e\x3b\x8f\x9d\xcf\x2e\x60\x17\xb2\x8b\xd8\xc5\xec\x12\x76\x29\xbb\x8c\x5d\xce\xae\x60\x57\xb2\xab\xd8\xd5\xec\x1a\x76\x2d\xbb\x8e\x5d\xcf\x6e\x60\x37\xb2\x9b\xd8\xcd\xec\x16\x76\x2b\xbb\x8d\xdd\xce\xee\x60\x77\xb2\xbb\xd8\xdd\xec\x1e\x76\x2f\xbb\x8f\xdd\xcf\x1e\x60\x0f\xb2\x87\xd8\xc3\xec\x11\xf6\x28\x7b\x8c\x3d\xce\x9e\x60\x4f\xb2\xa7\xd8\xd3\xec\x19\xf6\x2c\x7b\x8e\x3d\xcf\x5e\x60\x2f\xb2\x97\xd8\xcb\xec\x15\xf6\x2a\x7b\x8d\xbd\xce\xde\x60\x6f\xb2\xb7\xd8\xdb\xec\x1d\xf6\x2e\x7b\x8f\xbd\xcf\x3e\x60\x1f\xb2\x8f\xd8\xc7\xec\x13\xf6\x29\xfb\x8c\x7d\xce\xbe\x60\x5f\xb2\xaf\xd8\xd7\xec\x1b\xf6\x2d\xfb\x8e\x7d\xcf\x7e\x60\x3f\xb2\x9f\xd8\xcf\xec\x17\xf6\x2b\xfb\x8d\xfd\xce\xfe\x60\x7f\xb2\xbf\xd8\xdf\xec\x1f\xf6\x2f\xfb\x8f\x8d\x63\xe3\xd9\x04\x36\x91\x4b\xc2\x25\xe5\x92\x71\xc9\xb9\x14\x5c\x4a\x2e\x15\x97\x9a\x4b\xc3\xa5\xe5\xd2\x71\xe9\xb9\x0c\x5c\x46\x2e\x13\x97\x99\xcb\xc2\x65\xe5\xb2\x71\xd9\xb9\x1c\x5c\x4e\x2e\x17\x97\x9b\xcb\xc3\xe5\xe5\xf2\x71\xf9\xb9\x02\x5c\x41\xae\x10\x57\x98\x2b\xc2\x15\xe5\x8a\x71\xc5\xb9\x12\x5c\x49\xae\x14\x57\x9a\x2b\xc3\x95\xe5\xca\x71\xe5\xb9\x0a\x5c\x45\xae\x12\x57\x99\xab\xc2\x55\xe5\xaa\x71\xd5\xb9\x1a\x5c\x4d\xae\x16\x57\x9b\xab\xc3\xd5\xe5\xea\x71\x18\x87\x73\x04\x47\x72\x14\x47\x73\x0c\xc7\x72\x1c\xc7\x73\x02\x27\x72\x12\x27\x73\x0a\xa7\x72\x1a\xa7\x73\x06\x67\x72\x16\x67\x73\x0e\xe7\x72\x1e\xe7\x73\x01\x17\x72\x11\x07\x38\xc8\x21\x2e\xc6\xd5\xe7\x1a\x70\x0d\xb9\x46\x5c\x63\xae\x09\xd7\x94\x6b\xc6\x35\xe7\x5a\x70\x2d\xb9\x56\x5c\x6b\xae\x0d\xd7\x96\x6b\xc7\xb5\xe7\x3a\x70\x1d\xb9\x4e\x5c\x67\xae\x0b\xd7\x95\xeb\xc6\x75\xe7\x7a\x70\x3d\xb9\x5e\x5c\x6f\xae\x0f\xd7\x97\xeb\xc7\xf5\xe7\x06\x70\x03\xb9\x41\xdc\x60\x6e\x08\x37\x94\x1b\xc6\x0d\xe7\x46\x70\x23\xb9\x51\xdc\x68\x6e\x0c\x37\x96\x1b\xc7\x8d\xe7\x26\x70\x13\xb9\x49\xdc\x64\x6e\x0a\x37\x95\x9b\xc6\x4d\xe7\x66\x70\x33\xb9\x59\xdc\x6c\x6e\x0e\x37\x97\x9b\xc7\xcd\xe7\x16\x70\x0b\xb9\x45\xdc\x62\x6e\x09\xb7\x94\x5b\xc6\x2d\xe7\x56\x70\x2b\xb9\x55\xdc\x6a\x6e\x0d\xb7\x96\x5b\xc7\xad\xe7\x36\x70\x1b\xb9\x4d\xdc\x66\x6e\x0b\xb7\x95\xdb\xc6\x6d\xe7\x76\x70\x3b\xb9\x5d\xdc\x6e\x6e\x0f\xb7\x97\xdb\xc7\xed\xe7\x0e\x70\x07\xb9\x43\xdc\x61\xee\x08\x77\x94\x3b\xc6\x1d\xe7\x4e\x70\x27\xb9\x53\xdc\x69\xee\x0c\x77\x96\x3b\xc7\x9d\xe7\x2e\x70\x17\xb9\x4b\xdc\x65\xee\x0a\x77\x95\xbb\xc6\x5d\xe7\x6e\x70\x37\xb9\x5b\xdc\x6d\xee\x0e\x77\x97\xbb\xc7\xdd\xe7\x1e\x70\x0f\xb9\x47\xdc\x63\xee\x09\xf7\x94\x7b\xc6\x3d\xe7\x5e\x70\x2f\xb9\x57\xdc\x6b\xee\x0d\xf7\x96\x7b\xc7\xbd\xe7\x3e\x70\x1f\xb9\x4f\xdc\x67\xee\x0b\xf7\x95\xfb\xc6\x7d\xe7\x7e\x70\x3f\xb9\x5f\xdc\x6f\xee\x0f\xf7\x97\xfb\xc7\xc5\x71\xf1\x5c\x02\x97\xc8\x27\xe1\x93\xf2\xc9\xf8\xe4\x7c\x0a\x3e\x25\x9f\x8a\x4f\xcd\xa7\xe1\xd3\xf2\xe9\xf8\xf4\x7c\x06\x3e\x23\x9f\x89\xcf\xcc\x67\xe1\xb3\xf2\xd9\xf8\xec\x7c\x0e\x3e\x27\x9f\x8b\xcf\xcd\xe7\xe1\xf3\xf2\xf9\xf8\xfc\x7c\x01\xbe\x20\x5f\x88\x2f\xcc\x17\xe1\x8b\xf2\xc5\xf8\xe2\x7c\x09\xbe\x24\x5f\x8a\x2f\xcd\x97\xe1\xcb\xf2\xe5\xf8\xf2\x7c\x05\xbe\x22\x5f\x89\xaf\xcc\x57\xe1\xab\xf2\xd5\xf8\xea\x7c\x0d\xbe\x26\x5f\x8b\xaf\xcd\xd7\xe1\xeb\xf2\xf5\x78\x8c\xc7\x79\x82\x27\x79\x8a\xa7\x79\x86\x67\x79\x8e\xe7\x79\x81\x17\x79\x89\x97\x79\x85\x57\x79\x8d\xd7\x79\x83\x37\x79\x8b\xb7\x79\x87\x77\x79\x8f\xf7\xf9\x80\x0f\xf9\x88\x07\x3c\xe4\x11\x1f\xe3\xeb\xf3\x0d\xf8\x86\x7c\x23\xbe\x31\xdf\x84\x6f\xca\x37\xe3\x9b\xf3\x2d\xf8\x96\x7c\x2b\xbe\x35\xdf\x86\x6f\xcb\xb7\xe3\xdb\xf3\x1d\xf8\x8e\x7c\x27\xbe\x33\xdf\x85\xef\xca\x77\xe3\xbb\xf3\x3d\xf8\x9e\x7c\x2f\xbe\x37\xdf\x87\xef\xcb\xf7\xe3\xfb\xf3\x03\xf8\x81\xfc\x20\x7e\x30\x3f\x84\x1f\xca\x0f\xe3\x87\xf3\x23\xf8\x91\xfc\x28\x7e\x34\x3f\x86\x1f\xcb\x8f\xe3\xc7\xf3\x13\xf8\x89\xfc\x24\x7e\x32\x3f\x85\x9f\xca\x4f\xe3\xa7\xf3\x33\xf8\x99\xfc\x2c\x7e\x36\x3f\x87\x9f\xcb\xcf\xe3\xe7\xf3\x0b\xf8\x85\xfc\x22\x7e\x31\xbf\x84\x5f\xca\x2f\xe3\x97\xf3\x2b\xf8\x95\xfc\x2a\x7e\x35\xbf\x86\x5f\xcb\xaf\xe3\xd7\xf3\x1b\xf8\x8d\xfc\x26\x7e\x33\xbf\x85\xdf\xca\x6f\xe3\xb7\xf3\x3b\xf8\x9d\xfc\x2e\x7e\x37\xbf\x87\xdf\xcb\xef\xe3\xf7\xf3\x07\xf8\x83\xfc\x21\xfe\x30\x7f\x84\x3f\xca\x1f\xe3\x8f\xf3\x27\xf8\x93\xfc\x29\xfe\x34\x7f\x86\x3f\xcb\x9f\xe3\xcf\xf3\x17\xf8\x8b\xfc\x25\xfe\x32\x7f\x85\xbf\xca\x5f\xe3\xaf\xf3\x37\xf8\x9b\xfc\x2d\xfe\x36\x7f\x87\xbf\xcb\xdf\xe3\xef\xf3\x0f\xf8\x87\xfc\x23\xfe\x31\xff\x84\x7f\xca\x3f\xe3\x9f\xf3\x2f\xf8\x97\xfc\x2b\xfe\x35\xff\x86\x7f\xcb\xbf\xe3\xdf\xf3\x1f\xf8\x8f\xfc\x27\xfe\x33\xff\x85\xff\xca\x7f\xe3\xbf\xf3\x3f\xf8\x9f\xfc\x2f\xfe\x37\xff\x87\xff\xcb\xff\xe3\xe3\xf8\x78\x3e\x81\x4f\x14\x92\x08\x49\x85\x64\x42\x72\x21\x85\x90\x52\x48\x25\xa4\x16\xd2\x08\x69\x85\x74\x42\x7a\x21\x83\x90\x51\xc8\x24\x64\x16\xb2\x08\x59\x85\x6c\x42\x76\x21\x87\x90\x53\xc8\x25\xe4\x16\xf2\x08\x79\x85\x7c\x42\x7e\xa1\x80\x50\x50\x28\x24\x14\x16\x8a\x08\x45\x85\x62\x42\x71\xa1\x84\x50\x52\x28\x25\x94\x16\xca\x08\x65\x85\x72\x42\x79\xa1\x82\x50\x51\xa8\x24\x54\x16\xaa\x08\x55\x85\x6a\x42\x75\xa1\x86\x50\x53\xa8\x25\xd4\x16\xea\x08\x75\x85\x7a\x02\x26\xe0\x02\x21\x90\x02\x25\xd0\x02\x23\xb0\x02\x27\xf0\x82\x20\x88\x82\x24\xc8\x82\x22\xa8\x82\x26\xe8\x82\x21\x98\x82\x25\xd8\x82\x23\xb8\x82\x27\xf8\x42\x20\x84\x42\x24\x00\x01\x0a\x48\x88\x09\xf5\x85\x06\x42\x43\xa1\x91\xd0\x58\x68\x22\x34\x15\x9a\x09\xcd\x85\x16\x42\x4b\xa1\x95\xd0\x5a\x68\x23\xb4\x15\xda\x09\xed\x85\x0e\x42\x47\xa1\x93\xd0\x59\xe8\x22\x74\x15\xba\x09\xdd\x85\x1e\x42\x4f\xa1\x97\xd0\x5b\xe8\x23\xf4\x15\xfa\x09\xfd\x85\x01\xc2\x40\x61\x90\x30\x58\x18\x22\x0c\x15\x86\x09\xc3\x85\x11\xc2\x48\x61\x94\x30\x5a\x18\x23\x8c\x15\xc6\x09\xe3\x85\x09\xc2\x44\x61\x92\x30\x59\x98\x22\x4c\x15\xa6\x09\xd3\x85\x19\xc2\x4c\x61\x96\x30\x5b\x98\x23\xcc\x15\xe6\x09\xf3\x85\x05\xc2\x42\x61\x91\xb0\x58\x58\x22\x2c\x15\x96\x09\xcb\x85\x15\xc2\x4a\x61\x95\xb0\x5a\x58\x23\xac\x15\xd6\x09\xeb\x85\x0d\xc2\x46\x61\x93\xb0\x59\xd8\x22\x6c\x15\xb6\x09\xdb\x85\x1d\xc2\x4e\x61\x97\xb0\x5b\xd8\x23\xec\x15\xf6\x09\xfb\x85\x03\xc2\x41\xe1\x90\x70\x58\x38\x22\x1c\x15\x8e\x09\xc7\x85\x13\xc2\x49\xe1\x94\x70\x5a\x38\x23\x9c\x15\xce\x09\xe7\x85\x0b\xc2\x45\xe1\x92\x70\x59\xb8\x22\x5c\x15\xae\x09\xd7\x85\x1b\xc2\x4d\xe1\x96\x70\x5b\xb8\x23\xdc\x15\xee\x09\xf7\x85\x07\xc2\x43\xe1\x91\xf0\x58\x78\x22\x3c\x15\x9e\x09\xcf\x85\x17\xc2\x4b\xe1\x95\xf0\x5a\x78\x23\xbc\x15\xde\x09\xef\x85\x0f\xc2\x47\xe1\x93\xf0\x59\xf8\x22\x7c\x15\xbe\x09\xdf\x85\x1f\xc2\x4f\xe1\x97\xf0\x5b\xf8\x23\xfc\x15\xfe\x09\x71\x42\xbc\x90\x20\x24\x8a\x49\xc4\xa4\x62\x32\x31\xb9\x98\x42\x4c\x29\xa6\x12\x53\x8b\x69\xc4\xb4\x62\x3a\x31\xbd\x98\x41\xcc\x28\x66\x12\x33\x8b\x59\xc4\xac\x62\x36\x31\xbb\x98\x43\xcc\x29\xe6\x12\x73\x8b\x79\xc4\xbc\x62\x3e\x31\xbf\x58\x40\x2c\x28\x16\x12\x0b\x8b\x45\xc4\xa2\x62\x31\xb1\xb8\x58\x42\x2c\x29\x96\x12\x4b\x8b\x65\xc4\xb2\x62\x39\xb1\xbc\x58\x41\xac\x28\x56\x12\x2b\x8b\x55\xc4\xaa\x62\x35\xb1\xba\x58\x43\xac\x29\xd6\x12\x6b\x8b\x75\xc4\xba\x62\x3d\x11\x13\x71\x91\x10\x49\x91\x12\x69\x91\x11\x59\x91\x13\x79\x51\x10\x45\x51\x12\x65\x51\x11\x55\x51\x13\x75\xd1\x10\x4d\xd1\x12\x6d\xd1\x11\x5d\xd1\x13\x7d\x31\x10\x43\x31\x12\x81\x08\x45\x24\xc6\xc4\xfa\x62\x03\xb1\xa1\xd8\x48\x6c\x2c\x36\x11\x9b\x8a\xcd\xc4\xe6\x62\x0b\xb1\xa5\xd8\x4a\x6c\x2d\xb6\x11\xdb\x8a\xed\xc4\xf6\x62\x07\xb1\xa3\xd8\x49\xec\x2c\x76\x11\xbb\x8a\xdd\xc4\xee\x62\x0f\xb1\xa7\xd8\x4b\xec\x2d\xf6\x11\xfb\x8a\xfd\xc4\xfe\xe2\x00\x71\xa0\x38\x48\x1c\x2c\x0e\x11\x87\x8a\xc3\xc4\xe1\xe2\x08\x71\xa4\x38\x4a\x1c\x2d\x8e\x11\xc7\x8a\xe3\xc4\xf1\xe2\x04\x71\xa2\x38\x49\x9c\x2c\x4e\x11\xa7\x8a\xd3\xc4\xe9\xe2\x0c\x71\xa6\x38\x4b\x9c\x2d\xce\x11\xe7\x8a\xf3\xc4\xf9\xe2\x02\x71\xa1\xb8\x48\x5c\x2c\x2e\x11\x97\x8a\xcb\xc4\xe5\xe2\x0a\x71\xa5\xb8\x4a\x5c\x2d\xae\x11\xd7\x8a\xeb\xc4\xf5\xe2\x06\x71\xa3\xb8\x49\xdc\x2c\x6e\x11\xb7\x8a\xdb\xc4\xed\xe2\x0e\x71\xa7\xb8\x4b\xdc\x2d\xee\x11\xf7\x8a\xfb\xc4\xfd\xe2\x01\xf1\xa0\x78\x48\x3c\x2c\x1e\x11\x8f\x8a\xc7\xc4\xe3\xe2\x09\xf1\xa4\x78\x4a\x3c\x2d\x9e\x11\xcf\x8a\xe7\xc4\xf3\xe2\x05\xf1\xa2\x78\x49\xbc\x2c\x5e\x11\xaf\x8a\xd7\xc4\xeb\xe2\x0d\xf1\xa6\x78\x4b\xbc\x2d\xde\x11\xef\x8a\xf7\xc4\xfb\xe2\x03\xf1\xa1\xf8\x48\x7c\x2c\x3e\x11\x9f\x8a\xcf\xc4\xe7\xe2\x0b\xf1\xa5\xf8\x4a\x7c\x2d\xbe\x11\xdf\x8a\xef\xc4\xf7\xe2\x07\xf1\xa3\xf8\x49\xfc\x2c\x7e\x11\xbf\x8a\xdf\xc4\xef\xe2\x0f\xf1\xa7\xf8\x4b\xfc\x2d\xfe\x11\xff\x8a\xff\xc4\x38\x31\x5e\x4c\x10\x13\xa5\x24\x52\x52\x29\x99\x94\x5c\x4a\x21\xa5\x94\x52\x49\xa9\xa5\x34\x52\x5a\x29\x9d\x94\x5e\xca\x20\x65\x94\x32\x49\x99\xa5\x2c\x52\x56\x29\x9b\x94\x5d\xca\x21\xe5\x94\x72\x49\xb9\xa5\x3c\x52\x5e\x29\x9f\x94\x5f\x2a\x20\x15\x94\x0a\x49\x85\xa5\x22\x52\x51\xa9\x98\x54\x5c\x2a\x21\x95\x94\x4a\x49\xa5\xa5\x32\x52\x59\xa9\x9c\x54\x5e\xaa\x20\x55\x94\x2a\x49\x95\xa5\x2a\x52\x55\xa9\x9a\x54\x5d\xaa\x21\xd5\x94\x6a\x49\xb5\xa5\x3a\x52\x5d\xa9\x9e\x84\x49\xb8\x44\x48\xa4\x44\x49\xb4\xc4\x48\xac\xc4\x49\xbc\x24\x48\xa2\x24\x49\xb2\xa4\x48\xaa\xa4\x49\xba\x64\x48\xa6\x64\x49\xb6\xe4\x48\xae\xe4\x49\xbe\x14\x48\xa1\x14\x49\x40\x82\x12\x92\x62\x52\x7d\xa9\x81\xd4\x50\x6a\x24\x35\x96\x9a\x48\x4d\xa5\x66\x52\x73\xa9\x85\xd4\x52\x6a\x25\xb5\x96\xda\x48\x6d\xa5\x76\x52\x7b\xa9\x83\xd4\x51\xea\x24\x75\x96\xba\x48\x5d\xa5\x6e\x52\x77\xa9\x87\xd4\x53\xea\x25\xf5\x96\xfa\x48\x7d\xa5\x7e\x52\x7f\x69\x80\x34\x50\x1a\x24\x0d\x96\x86\x48\x43\xa5\x61\xd2\x70\x69\x84\x34\x52\x1a\x25\x8d\x96\xc6\x48\x63\xa5\x71\xd2\x78\x69\x82\x34\x51\x9a\x24\x4d\x96\xa6\x48\x53\xa5\x69\xd2\x74\x69\x86\x34\x53\x9a\x25\xcd\x96\xe6\x48\x73\xa5\x79\xd2\x7c\x69\x81\xb4\x50\x5a\x24\x2d\x96\x96\x48\x4b\xa5\x65\xd2\x72\x69\x85\xb4\x52\x5a\x25\xad\x96\xd6\x48\x6b\xa5\x75\xd2\x7a\x69\x83\xb4\x51\xda\x24\x6d\x96\xb6\x48\x5b\xa5\x6d\xd2\x76\x69\x87\xb4\x53\xda\x25\xed\x96\xf6\x48\x7b\xa5\x7d\xd2\x7e\xe9\x80\x74\x50\x3a\x24\x1d\x96\x8e\x48\x47\xa5\x63\xd2\x71\xe9\x84\x74\x52\x3a\x25\x9d\x96\xce\x48\x67\xa5\x73\xd2\x79\xe9\x82\x74\x51\xba\x24\x5d\x96\xae\x48\x57\xa5\x6b\xd2\x75\xe9\x86\x74\x53\xba\x25\xdd\x96\xee\x48\x77\xa5\x7b\xd2\x7d\xe9\x81\xf4\x50\x7a\x24\x3d\x96\x9e\x48\x4f\xa5\x67\xd2\x73\xe9\x85\xf4\x52\x7a\x25\xbd\x96\xde\x48\x6f\xa5\x77\xd2\x7b\xe9\x83\xf4\x51\xfa\x24\x7d\x96\xbe\x48\x5f\xa5\x6f\xd2\x77\xe9\x87\xf4\x53\xfa\x25\xfd\x96\xfe\x48\x7f\xa5\x7f\x52\x9c\x14\x2f\x25\x48\x89\x72\x12\x39\xa9\x9c\x4c\x4e\x2e\xa7\x90\x53\xca\xa9\xe4\xd4\x72\x1a\x39\xad\x9c\x4e\x4e\x2f\x67\x90\x33\xca\x99\xe4\xcc\x72\x16\x39\xab\x9c\x4d\xce\x2e\xe7\x90\x73\xca\xb9\xe4\xdc\x72\x1e\x39\xaf\x9c\x4f\xce\x2f\x17\x90\x0b\xca\x85\xe4\xc2\x72\x11\xb9\xa8\x5c\x4c\x2e\x2e\x97\x90\x4b\xca\xa5\xe4\xd2\x72\x19\xb9\xac\x5c\x4e\x2e\x2f\x57\x90\x2b\xca\x95\xe4\xca\x72\x15\xb9\xaa\x5c\x4d\xae\x2e\xd7\x90\x6b\xca\xb5\xe4\xda\x72\x1d\xb9\xae\x5c\x4f\xc6\x64\x5c\x26\x64\x52\xa6\x64\x5a\x66\x64\x56\xe6\x64\x5e\x16\x64\x51\x96\x64\x59\x56\x64\x55\xd6\x64\x5d\x36\x64\x53\xb6\x64\x5b\x76\x64\x57\xf6\x64\x5f\x0e\xe4\x50\x8e\x64\x20\x43\x19\xc9\x31\xb9\xbe\xdc\x40\x6e\x28\x37\x92\x1b\xcb\x4d\xe4\xa6\x72\x33\xb9\xb9\xdc\x42\x6e\x29\xb7\x92\x5b\xcb\x6d\xe4\xb6\x72\x3b\xb9\xbd\xdc\x41\xee\x28\x77\x92\x3b\xcb\x5d\xe4\xae\x72\x37\xb9\xbb\xdc\x43\xee\x29\xf7\x92\x7b\xcb\x7d\xe4\xbe\x72\x3f\xb9\xbf\x3c\x40\x1e\x28\x0f\x92\x07\xcb\x43\xe4\xa1\xf2\x30\x79\xb8\x3c\x42\x1e\x29\x8f\x92\x47\xcb\x63\xe4\xb1\xf2\x38\x79\xbc\x3c\x41\x9e\x28\x4f\x92\x27\xcb\x53\xe4\xa9\xf2\x34\x79\xba\x3c\x43\x9e\x29\xcf\x92\x67\xcb\x73\xe4\xb9\xf2\x3c\x79\xbe\xbc\x40\x5e\x28\x2f\x92\x17\xcb\x4b\xe4\xa5\xf2\x32\x79\xb9\xbc\x42\x5e\x29\xaf\x92\x57\xcb\x6b\xe4\xb5\xf2\x3a\x79\xbd\xbc\x41\xde\x28\x6f\x92\x37\xcb\x5b\xe4\xad\xf2\x36\x79\xbb\xbc\x43\xde\x29\xef\x92\x77\xcb\x7b\xe4\xbd\xf2\x3e\x79\xbf\x7c\x40\x3e\x28\x1f\x92\x0f\xcb\x47\xe4\xa3\xf2\x31\xf9\xb8\x7c\x42\x3e\x29\x9f\x92\x4f\xcb\x67\xe4\xb3\xf2\x39\xf9\xbc\x7c\x41\xbe\x28\x5f\x92\x2f\xcb\x57\xe4\xab\xf2\x35\xf9\xba\x7c\x43\xbe\x29\xdf\x92\x6f\xcb\x77\xe4\xbb\xf2\x3d\xf9\xbe\xfc\x40\x7e\x28\x3f\x92\x1f\xcb\x4f\xe4\xa7\xf2\x33\xf9\xb9\xfc\x42\x7e\x29\xbf\x92\x5f\xcb\x6f\xe4\xb7\xf2\x3b\xf9\xbd\xfc\x41\xfe\x28\x7f\x92\x3f\xcb\x5f\xe4\xaf\xf2\x37\xf9\xbb\xfc\x43\xfe\x29\xff\x92\x7f\xcb\x7f\xe4\xbf\xf2\x3f\x39\x4e\x8e\x97\x13\xe4\x44\x25\x89\x92\x54\x49\xa6\x24\x57\x52\x28\x29\x95\x54\x4a\x6a\x25\x8d\x92\x56\x49\xa7\xa4\x57\x32\x28\x19\x95\x4c\x4a\x66\x25\x8b\x92\x55\xc9\xa6\x64\x57\x72\x28\x39\x95\x5c\x4a\x6e\x25\x8f\x92\x57\xc9\xa7\xe4\x57\x0a\x28\x05\x95\x42\x4a\x61\xa5\x88\x52\x54\x29\xa6\x14\x57\x4a\x28\x25\x95\x52\x4a\x69\xa5\x8c\x52\x56\x29\xa7\x94\x57\x2a\x28\x15\x95\x4a\x4a\x65\xa5\x8a\x52\x55\xa9\xa6\x54\x57\x6a\x28\x35\x95\x5a\x4a\x6d\xa5\x8e\x52\x57\xa9\xa7\x60\x0a\xae\x10\x0a\xa9\x50\x0a\xad\x30\x0a\xab\x70\x0a\xaf\x08\x8a\xa8\x48\x8a\xac\x28\x8a\xaa\x68\x8a\xae\x18\x8a\xa9\x58\x8a\xad\x38\x8a\xab\x78\x8a\xaf\x04\x4a\xa8\x44\x0a\x50\xa0\x82\x94\x98\x52\x5f\x69\xa0\x34\x54\x1a\x29\x8d\x95\x26\x4a\x53\xa5\x99\xd2\x5c\x69\xa1\xb4\x54\x5a\x29\xad\x95\x36\x4a\x5b\xa5\x9d\xd2\x5e\xe9\xa0\x74\x54\x3a\x29\x9d\x95\x2e\x4a\x57\xa5\x9b\xd2\x5d\xe9\xa1\xf4\x54\x7a\x29\xbd\x95\x3e\x4a\x5f\xa5\x9f\xd2\x5f\x19\xa0\x0c\x54\x06\x29\x83\x95\x21\xca\x50\x65\x98\x32\x5c\x19\xa1\x8c\x54\x46\x29\xa3\x95\x31\xca\x58\x65\x9c\x32\x5e\x99\xa0\x4c\x54\x26\x29\x93\x95\x29\xca\x54\x65\x9a\x32\x5d\x99\xa1\xcc\x54\x66\x29\xb3\x95\x39\xca\x5c\x65\x9e\x32\x5f\x59\xa0\x2c\x54\x16\x29\x8b\x95\x25\xca\x52\x65\x99\xb2\x5c\x59\xa1\xac\x54\x56\x29\xab\x95\x35\xca\x5a\x65\x9d\xb2\x5e\xd9\xa0\x6c\x54\x36\x29\x9b\x95\x2d\xca\x56\x65\x9b\xb2\x5d\xd9\xa1\xec\x54\x76\x29\xbb\x95\x3d\xca\x5e\x65\x9f\xb2\x5f\x39\xa0\x1c\x54\x0e\x29\x87\x95\x23\xca\x51\xe5\x98\x72\x5c\x39\xa1\x9c\x54\x4e\x29\xa7\x95\x33\xca\x59\xe5\x9c\x72\x5e\xb9\xa0\x5c\x54\x2e\x29\x97\x95\x2b\xca\x55\xe5\x9a\x72\x5d\xb9\xa1\xdc\x54\x6e\x29\xb7\x95\x3b\xca\x5d\xe5\x9e\x72\x5f\x79\xa0\x3c\x54\x1e\x29\x8f\x95\x27\xca\x53\xe5\x99\xf2\x5c\x79\xa1\xbc\x54\x5e\x29\xaf\x95\x37\xca\x5b\xe5\x9d\xf2\x5e\xf9\xa0\x7c\x54\x3e\x29\x9f\x95\x2f\xca\x57\xe5\x9b\xf2\x5d\xf9\xa1\xfc\x54\x7e\x29\xbf\x95\x3f\xca\x5f\xe5\x9f\x12\xa7\xc4\x2b\x09\x4a\xa2\x9a\x44\x4d\xaa\x26\x53\x93\xab\x29\xd4\x94\x6a\x2a\x35\xb5\x9a\x46\x4d\xab\xa6\x53\xd3\xab\x19\xd4\x8c\x6a\x26\x35\xb3\x9a\x45\xcd\xaa\x66\x53\xb3\xab\x39\xd4\x9c\x6a\x2e\x35\xb7\x9a\x47\xcd\xab\xe6\x53\xf3\xab\x05\xd4\x82\x6a\x21\xb5\xb0\x5a\x44\x2d\xaa\x16\x53\x8b\xab\x25\xd4\x92\x6a\x29\xb5\xb4\x5a\x46\x2d\xab\x96\x53\xcb\xab\x15\xd4\x8a\x6a\x25\xb5\xb2\x5a\x45\xad\xaa\x56\x53\xab\xab\x35\xd4\x9a\x6a\x2d\xb5\xb6\x5a\x47\xad\xab\xd6\x53\x31\x15\x57\x09\x95\x54\x29\x95\x56\x19\x95\x55\x39\x95\x57\x05\x55\x54\x25\x55\x56\x15\x55\x55\x35\x55\x57\x0d\xd5\x54\x2d\xd5\x56\x1d\xd5\x55\x3d\xd5\x57\x03\x35\x54\x23\x15\xa8\x50\x45\x6a\x4c\xad\xaf\x36\x50\x1b\xaa\x8d\xd4\xc6\x6a\x13\xb5\xa9\xda\x4c\x6d\xae\xb6\x50\x5b\xaa\xad\xd4\xd6\x6a\x1b\xb5\xad\xda\x4e\x6d\xaf\x76\x50\x3b\xaa\x9d\xd4\xce\x6a\x17\xb5\xab\xda\x4d\xed\xae\xf6\x50\x7b\xaa\xbd\xd4\xde\x6a\x1f\xb5\xaf\xda\x4f\xed\xaf\x0e\x50\x07\xaa\x83\xd4\xc1\xea\x10\x75\xa8\x3a\x4c\x1d\xae\x8e\x50\x47\xaa\xa3\xd4\xd1\xea\x18\x75\xac\x3a\x4e\x1d\xaf\x4e\x50\x27\xaa\x93\xd4\xc9\xea\x14\x75\xaa\x3a\x4d\x9d\xae\xce\x50\x67\xaa\xb3\xd4\xd9\xea\x1c\x75\xae\x3a\x4f\x9d\xaf\x2e\x50\x17\xaa\x8b\xd4\xc5\xea\x12\x75\xa9\xba\x4c\x5d\xae\xae\x50\x57\xaa\xab\xd4\xd5\xea\x1a\x75\xad\xba\x4e\x5d\xaf\x6e\x50\x37\xaa\x9b\xd4\xcd\xea\x16\x75\xab\xba\x4d\xdd\xae\xee\x50\x77\xaa\xbb\xd4\xdd\xea\x1e\x75\xaf\xba\x4f\xdd\xaf\x1e\x50\x0f\xaa\x87\xd4\xc3\xea\x11\xf5\xa8\x7a\x4c\x3d\xae\x9e\x50\x4f\xaa\xa7\xd4\xd3\xea\x19\xf5\xac\x7a\x4e\x3d\xaf\x5e\x50\x2f\xaa\x97\xd4\xcb\xea\x15\xf5\xaa\x7a\x4d\xbd\xae\xde\x50\x6f\xaa\xb7\xd4\xdb\xea\x1d\xf5\xae\x7a\x4f\xbd\xaf\x3e\x50\x1f\xaa\x8f\xd4\xc7\xea\x13\xf5\xa9\xfa\x4c\x7d\xae\xbe\x50\x5f\xaa\xaf\xd4\xd7\xea\x1b\xf5\xad\xfa\x4e\x7d\xaf\x7e\x50\x3f\xaa\x9f\xd4\xcf\xea\x17\xf5\xab\xfa\x4d\xfd\xae\xfe\x50\x7f\xaa\xbf\xd4\xdf\xea\x1f\xf5\xaf\xfa\x4f\x8d\x53\xe3\xd5\x04\x35\x51\x4b\xa2\x25\xd5\x92\x69\xc9\xb5\x14\x5a\x4a\x2d\x95\x96\x5a\x4b\xa3\xa5\xd5\xd2\x69\xe9\xb5\x0c\x5a\x46\x2d\x93\x96\x59\xcb\xa2\x65\xd5\xb2\x69\xd9\xb5\x1c\x5a\x4e\x2d\x97\x96\x5b\xcb\xa3\xe5\xd5\xf2\x69\xf9\xb5\x02\x5a\x41\xad\x90\x56\x58\x2b\xa2\x15\xd5\x8a\x69\xc5\xb5\x12\x5a\x49\xad\x94\x56\x5a\x2b\xa3\x95\xd5\xca\x69\xe5\xb5\x0a\x5a\x45\xad\x92\x56\x59\xab\xa2\x55\xd5\xaa\x69\xd5\xb5\x1a\x5a\x4d\xad\x96\x56\x5b\xab\xa3\xd5\xd5\xea\x69\x98\x86\x6b\x84\x46\x6a\x94\x46\x6b\x8c\xc6\x6a\x9c\xc6\x6b\x82\x26\x6a\x92\x26\x6b\x8a\xa6\x6a\x9a\xa6\x6b\x86\x66\x6a\x96\x66\x6b\x8e\xe6\x6a\x9e\xe6\x6b\x81\x16\x6a\x91\x06\x34\xa8\x21\x2d\xa6\xd5\xd7\x1a\x68\x0d\xb5\x46\x5a\x63\xad\x89\xd6\x54\x6b\xa6\x35\xd7\x5a\x68\x2d\xb5\x56\x5a\x6b\xad\x8d\xd6\x56\x6b\xa7\xb5\xd7\x3a\x68\x1d\xb5\x4e\x5a\x67\xad\x8b\xd6\x55\xeb\xa6\x75\xd7\x7a\x68\x3d\xb5\x5e\x5a\x6f\xad\x8f\xd6\x57\xeb\xa7\xf5\xd7\x06\x68\x03\xb5\x41\xda\x60\x6d\x88\x36\x54\x1b\xa6\x0d\xd7\x46\x68\x23\xb5\x51\xda\x68\x6d\x8c\x36\x56\x1b\xa7\x8d\xd7\x26\x68\x13\xb5\x49\xda\x64\x6d\x8a\x36\x55\x9b\xa6\x4d\xd7\x66\x68\x33\xb5\x59\xda\x6c\x6d\x8e\x36\x57\x9b\xa7\xcd\xd7\x16\x68\x0b\xb5\x45\xda\x62\x6d\x89\xb6\x54\x5b\xa6\x2d\xd7\x56\x68\x2b\xb5\x55\xda\x6a\x6d\x8d\xb6\x56\x5b\xa7\xad\xd7\x36\x68\x1b\xb5\x4d\xda\x66\x6d\x8b\xb6\x55\xdb\xa6\x6d\xd7\x76\x68\x3b\xb5\x5d\xda\x6e\x6d\x8f\xb6\x57\xdb\xa7\xed\xd7\x0e\x68\x07\xb5\x43\xda\x61\xed\x88\x76\x54\x3b\xa6\x1d\xd7\x4e\x68\x27\xb5\x53\xda\x69\xed\x8c\x76\x56\x3b\xa7\x9d\xd7\x2e\x68\x17\xb5\x4b\xda\x65\xed\x8a\x76\x55\xbb\xa6\x5d\xd7\x6e\x68\x37\xb5\x5b\xda\x6d\xed\x8e\x76\x57\xbb\xa7\xdd\xd7\x1e\x68\x0f\xb5\x47\xda\x63\xed\x89\xf6\x54\x7b\xa6\x3d\xd7\x5e\x68\x2f\xb5\x57\xda\x6b\xed\x8d\xf6\x56\x7b\xa7\xbd\xd7\x3e\x68\x1f\xb5\x4f\xda\x67\xed\x8b\xf6\x55\xfb\xa6\x7d\xd7\x7e\x68\x3f\xb5\x5f\xda\x6f\xed\x8f\xf6\x57\xfb\xa7\xc5\x69\xf1\x5a\x82\x96\xa8\x27\xd1\x93\xea\xc9\xf4\xe4\x7a\x0a\x3d\xa5\x9e\x4a\x4f\xad\xa7\xd1\xd3\xea\xe9\xf4\xf4\x7a\x06\x3d\xa3\x9e\x49\xcf\xac\x67\xd1\xb3\xea\xd9\xf4\xec\x7a\x0e\x3d\xa7\x9e\x4b\xcf\xad\xe7\xd1\xf3\xea\xf9\xf4\xfc\x7a\x01\xbd\xa0\x5e\x48\x2f\xac\x17\xd1\x8b\xea\xc5\xf4\xe2\x7a\x09\xbd\xa4\x5e\x4a\x2f\xad\x97\xd1\xcb\xea\xe5\xf4\xf2\x7a\x05\xbd\xa2\x5e\x49\xaf\xac\x57\xd1\xab\xea\xd5\xf4\xea\x7a\x0d\xbd\xa6\x5e\x4b\xaf\xad\xd7\xd1\xeb\xea\xf5\x74\x4c\xc7\x75\x42\x27\x75\x4a\xa7\x75\x46\x67\x75\x4e\xe7\x75\x41\x17\x75\x49\x97\x75\x45\x57\x75\x4d\xd7\x75\x43\x37\x75\x4b\xb7\x75\x47\x77\x75\x4f\xf7\xf5\x40\x0f\xf5\x48\x07\x3a\xd4\x91\x1e\xd3\xeb\xeb\x0d\xf4\x86\x7a\x23\xbd\xb1\xde\x44\x6f\xaa\x37\xd3\x9b\xeb\x2d\xf4\x96\x7a\x2b\xbd\xb5\xde\x46\x6f\xab\xb7\xd3\xdb\xeb\x1d\xf4\x8e\x7a\x27\xbd\xb3\xde\x45\xef\xaa\x77\xd3\xbb\xeb\x3d\xf4\x9e\x7a\x2f\xbd\xb7\xde\x47\xef\xab\xf7\xd3\xfb\xeb\x03\xf4\x81\xfa\x20\x7d\xb0\x3e\x44\x1f\xaa\x0f\xd3\x87\xeb\x23\xf4\x91\xfa\x28\x7d\xb4\x3e\x46\x1f\xab\x8f\xd3\xc7\xeb\x13\xf4\x89\xfa\x24\x7d\xb2\x3e\x45\x9f\xaa\x4f\xd3\xa7\xeb\x33\xf4\x99\xfa\x2c\x7d\xb6\x3e\x47\x9f\xab\xcf\xd3\xe7\xeb\x0b\xf4\x85\xfa\x22\x7d\xb1\xbe\x44\x5f\xaa\x2f\xd3\x97\xeb\x2b\xf4\x95\xfa\x2a\x7d\xb5\xbe\x46\x5f\xab\xaf\xd3\xd7\xeb\x1b\xf4\x8d\xfa\x26\x7d\xb3\xbe\x45\xdf\xaa\x6f\xd3\xb7\xeb\x3b\xf4\x9d\xfa\x2e\x7d\xb7\xbe\x47\xdf\xab\xef\xd3\xf7\xeb\x07\xf4\x83\xfa\x21\xfd\xb0\x7e\x44\x3f\xaa\x1f\xd3\x8f\xeb\x27\xf4\x93\xfa\x29\xfd\xb4\x7e\x46\x3f\xab\x9f\xd3\xcf\xeb\x17\xf4\x8b\xfa\x25\xfd\xb2\x7e\x45\xbf\xaa\x5f\xd3\xaf\xeb\x37\xf4\x9b\xfa\x2d\xfd\xb6\x7e\x47\xbf\xab\xdf\xd3\xef\xeb\x0f\xf4\x87\xfa\x23\xfd\xb1\xfe\x44\x7f\xaa\x3f\xd3\x9f\xeb\x2f\xf4\x97\xfa\x2b\xfd\xb5\xfe\x46\x7f\xab\xbf\xd3\xdf\xeb\x1f\xf4\x8f\xfa\x27\xfd\xb3\xfe\x45\xff\xaa\x7f\xd3\xbf\xeb\x3f\xf4\x9f\xfa\x2f\xfd\xb7\xfe\x47\xff\xab\xff\xd3\xe3\xf4\x78\x3d\x41\x4f\x34\x92\x18\x49\x8d\x64\x46\x72\x23\x85\x91\xd2\x48\x65\xa4\x36\xd2\x18\x69\x8d\x74\x46\x7a\x23\x83\x91\xd1\xc8\x64\x64\x36\xb2\x18\x59\x8d\x6c\x46\x76\x23\x87\x91\xd3\xc8\x65\xe4\x36\xf2\x18\x79\x8d\x7c\x46\x7e\xa3\x80\x51\xd0\x28\x64\x14\x36\x8a\x18\x45\x8d\x62\x46\x71\xa3\x84\x51\xd2\x28\x65\x94\x36\xca\x18\x65\x8d\x72\x46\x79\xa3\x82\x51\xd1\xa8\x64\x54\x36\xaa\x18\x55\x8d\x6a\x46\x75\xa3\x86\x51\xd3\xa8\x65\xd4\x36\xea\x18\x75\x8d\x7a\x06\x66\xe0\x06\x61\x90\x06\x65\xd0\x06\x63\xb0\x06\x67\xf0\x86\x60\x88\x86\x64\xc8\x86\x62\xa8\x86\x66\xe8\x86\x61\x98\x86\x65\xd8\x86\x63\xb8\x86\x67\xf8\x46\x60\x84\x46\x64\x00\x03\x1a\xc8\x88\x19\xf5\x8d\x06\x46\x43\xa3\x91\xd1\xd8\x68\x62\x34\x35\x9a\x19\xcd\x8d\x16\x46\x4b\xa3\x95\xd1\xda\x68\x63\xb4\x35\xda\x19\xed\x8d\x0e\x46\x47\xa3\x93\xd1\xd9\xe8\x62\x74\x35\xba\x19\xdd\x8d\x1e\x46\x4f\xa3\x97\xd1\xdb\xe8\x63\xf4\x35\xfa\x19\xfd\x8d\x01\xc6\x40\x63\x90\x31\xd8\x18\x62\x0c\x35\x86\x19\xc3\x8d\x11\xc6\x48\x63\x94\x31\xda\x18\x63\x8c\x35\xc6\x19\xe3\x8d\x09\xc6\x44\x63\x92\x31\xd9\x98\x62\x4c\x35\xa6\x19\xd3\x8d\x19\xc6\x4c\x63\x96\x31\xdb\x98\x63\xcc\x35\xe6\x19\xf3\x8d\x05\xc6\x42\x63\x91\xb1\xd8\x58\x62\x2c\x35\x96\x19\xcb\x8d\x15\xc6\x4a\x63\x95\xb1\xda\x58\x63\xac\x35\xd6\x19\xeb\x8d\x0d\xc6\x46\x63\x93\xb1\xd9\xd8\x62\x6c\x35\xb6\x19\xdb\x8d\x1d\xc6\x4e\x63\x97\xb1\xdb\xd8\x63\xec\x35\xf6\x19\xfb\x8d\x03\xc6\x41\xe3\x90\x71\xd8\x38\x62\x1c\x35\x8e\x19\xc7\x8d\x13\xc6\x49\xe3\x94\x71\xda\x38\x63\x9c\x35\xce\x19\xe7\x8d\x0b\xc6\x45\xe3\x92\x71\xd9\xb8\x62\x5c\x35\xae\x19\xd7\x8d\x1b\xc6\x4d\xe3\x96\x71\xdb\xb8\x63\xdc\x35\xee\x19\xf7\x8d\x07\xc6\x43\xe3\x91\xf1\xd8\x78\x62\x3c\x35\x9e\x19\xcf\x8d\x17\xc6\x4b\xe3\x95\xf1\xda\x78\x63\xbc\x35\xde\x19\xef\x8d\x0f\xc6\x47\xe3\x93\xf1\xd9\xf8\x62\x7c\x35\xbe\x19\xdf\x8d\x1f\xc6\x4f\xe3\x97\xf1\xdb\xf8\x63\xfc\x35\xfe\x19\x71\x46\xbc\x91\x60\x24\x9a\x49\xcc\xa4\x66\x32\x33\xb9\x99\xc2\x4c\x69\xa6\x32\x53\x9b\x69\xcc\xb4\x66\x3a\x33\xbd\x99\xc1\xcc\x68\x66\x32\x33\x9b\x59\xcc\xac\x66\x36\x33\xbb\x99\xc3\xcc\x69\xe6\x32\x73\x9b\x79\xcc\xbc\x66\x3e\x33\xbf\x59\xc0\x2c\x68\x16\x32\x0b\x9b\x45\xcc\xa2\x66\x31\xb3\xb8\x59\xc2\x2c\x69\x96\x32\x4b\x9b\x65\xcc\xb2\x66\x39\xb3\xbc\x59\xc1\xac\x68\x56\x32\x2b\x9b\x55\xcc\xaa\x66\x35\xb3\xba\x59\xc3\xac\x69\xd6\x32\x6b\x9b\x75\xcc\xba\x66\x3d\x13\x33\x71\x93\x30\x49\x93\x32\x69\x93\x31\x59\x93\x33\x79\x53\x30\x45\x53\x32\x65\x53\x31\x55\x53\x33\x75\xd3\x30\x4d\xd3\x32\x6d\xd3\x31\x5d\xd3\x33\x7d\x33\x30\x43\x33\x32\x81\x09\x4d\x64\xc6\xcc\xfa\x66\x03\xb3\xa1\xd9\xc8\x6c\x6c\x36\x31\x9b\x9a\xcd\xcc\xe6\x66\x0b\xb3\xa5\xd9\xca\x6c\x6d\xb6\x31\xdb\x9a\xed\xcc\xf6\x66\x07\xb3\xa3\xd9\xc9\xec\x6c\x76\x31\xbb\x9a\xdd\xcc\xee\x66\x0f\xb3\xa7\xd9\xcb\xec\x6d\xf6\x31\xfb\x9a\xfd\xcc\xfe\xe6\x00\x73\xa0\x39\xc8\x1c\x6c\x0e\x31\x87\x9a\xc3\xcc\xe1\xe6\x08\x73\xa4\x39\xca\x1c\x6d\x8e\x31\xc7\x9a\xe3\xcc\xf1\xe6\x04\x73\xa2\x39\xc9\x9c\x6c\x4e\x31\xa7\x9a\xd3\xcc\xe9\xe6\x0c\x73\xa6\x39\xcb\x9c\x6d\xce\x31\xe7\x9a\xf3\xcc\xf9\xe6\x02\x73\xa1\xb9\xc8\x5c\x6c\x2e\x31\x97\x9a\xcb\xcc\xe5\xe6\x0a\x73\xa5\xb9\xca\x5c\x6d\xae\x31\xd7\x9a\xeb\xcc\xf5\xe6\x06\x73\xa3\xb9\xc9\xdc\x6c\x6e\x31\xb7\x9a\xdb\xcc\xed\xe6\x0e\x73\xa7\xb9\xcb\xdc\x6d\xee\x31\xf7\x9a\xfb\xcc\xfd\xe6\x01\xf3\xa0\x79\xc8\x3c\x6c\x1e\x31\x8f\x9a\xc7\xcc\xe3\xe6\x09\xf3\xa4\x79\xca\x3c\x6d\x9e\x31\xcf\x9a\xe7\xcc\xf3\xe6\x05\xf3\xa2\x79\xc9\xbc\x6c\x5e\x31\xaf\x9a\xd7\xcc\xeb\xe6\x0d\xf3\xa6\x79\xcb\xbc\x6d\xde\x31\xef\x9a\xf7\xcc\xfb\xe6\x03\xf3\xa1\xf9\xc8\x7c\x6c\x3e\x31\x9f\x9a\xcf\xcc\xe7\xe6\x0b\xf3\xa5\xf9\xca\x7c\x6d\xbe\x31\xdf\x9a\xef\xcc\xf7\xe6\x07\xf3\xa3\xf9\xc9\xfc\x6c\x7e\x31\xbf\x9a\xdf\xcc\xef\xe6\x0f\xf3\xa7\xf9\xcb\xfc\x6d\xfe\x31\xff\x9a\xff\xcc\x38\x33\xde\x4c\x30\x13\xad\x24\x56\x52\x2b\x99\x95\xdc\x4a\x61\xa5\xb4\x52\x59\xa9\xad\x34\x56\x5a\x2b\x9d\x95\xde\xca\x60\x65\xb4\x32\x59\x99\xad\x2c\x56\x56\x2b\x9b\x95\xdd\xca\x61\xe5\xb4\x72\x59\xb9\xad\x3c\x56\x5e\x2b\x9f\x95\xdf\x2a\x60\x15\xb4\x0a\x59\x85\xad\x22\x56\x51\xab\x98\x55\xdc\x2a\x61\x95\xb4\x4a\x59\xa5\xad\x32\x56\x59\xab\x9c\x55\xde\xaa\x60\x55\xb4\x2a\x59\x95\xad\x2a\x56\x55\xab\x9a\x55\xdd\xaa\x61\xd5\xb4\x6a\x59\xb5\xad\x3a\x56\x5d\xab\x9e\x85\x59\xb8\x45\x58\xa4\x45\x59\xb4\xc5\x58\xac\xc5\x59\xbc\x25\x58\xa2\x25\x59\xb2\xa5\x58\xaa\xa5\x59\xba\x65\x58\xa6\x65\x59\xb6\xe5\x58\xae\xe5\x59\xbe\x15\x58\xa1\x15\x59\xc0\x82\x16\xb2\x62\x56\x7d\xab\x81\xd5\xd0\x6a\x64\x35\xb6\x9a\x58\x4d\xad\x66\x56\x73\xab\x85\xd5\xd2\x6a\x65\xb5\xb6\xda\x58\x6d\xad\x76\x56\x7b\xab\x83\xd5\xd1\xea\x64\x75\xb6\xba\x58\x5d\xad\x6e\x56\x77\xab\x87\xd5\xd3\xea\x65\xf5\xb6\xfa\x58\x7d\xad\x7e\x56\x7f\x6b\x80\x35\xd0\x1a\x64\x0d\xb6\x86\x58\x43\xad\x61\xd6\x70\x6b\x84\x35\xd2\x1a\x65\x8d\xb6\xc6\x58\x63\xad\x71\xd6\x78\x6b\x82\x35\xd1\x9a\x64\x4d\xb6\xa6\x58\x53\xad\x69\xd6\x74\x6b\x86\x35\xd3\x9a\x65\xcd\xb6\xe6\x58\x73\xad\x79\xd6\x7c\x6b\x81\xb5\xd0\x5a\x64\x2d\xb6\x96\x58\x4b\xad\x65\xd6\x72\x6b\x85\xb5\xd2\x5a\x65\xad\xb6\xd6\x58\x6b\xad\x75\xd6\x7a\x6b\x83\xb5\xd1\xda\x64\x6d\xb6\xb6\x58\x5b\xad\x6d\xd6\x76\x6b\x87\xb5\xd3\xda\x65\xed\xb6\xf6\x58\x7b\xad\x7d\xd6\x7e\xeb\x80\x75\xd0\x3a\x64\x1d\xb6\x8e\x58\x47\xad\x63\xd6\x71\xeb\x84\x75\xd2\x3a\x65\x9d\xb6\xce\x58\x67\xad\x73\xd6\x79\xeb\x82\x75\xd1\xba\x64\x5d\xb6\xae\x58\x57\xad\x6b\xd6\x75\xeb\x86\x75\xd3\xba\x65\xdd\xb6\xee\x58\x77\xad\x7b\xd6\x7d\xeb\x81\xf5\xd0\x7a\x64\x3d\xb6\x9e\x58\x4f\xad\x67\xd6\x73\xeb\x85\xf5\xd2\x7a\x65\xbd\xb6\xde\x58\x6f\xad\x77\xd6\x7b\xeb\x83\xf5\xd1\xfa\x64\x7d\xb6\xbe\x58\x5f\xad\x6f\xd6\x77\xeb\x87\xf5\xd3\xfa\x65\xfd\xb6\xfe\x58\x7f\xad\x7f\x56\x9c\x15\x6f\x25\x58\x89\x76\x12\x3b\xa9\x9d\xcc\x4e\x6e\xa7\xb0\x53\xda\xa9\xec\xd4\x76\x1a\x3b\xad\x9d\xce\x4e\x6f\x67\xb0\x33\xda\x99\xec\xcc\x76\x16\x3b\xab\x9d\xcd\xce\x6e\xe7\xb0\x73\xda\xb9\xec\xdc\x76\x1e\x3b\xaf\x9d\xcf\xce\x6f\x17\xb0\x0b\xda\x85\xec\xc2\x76\x11\xbb\xa8\x5d\xcc\x2e\x6e\x97\xb0\x4b\xda\xa5\xec\xd2\x76\x19\xbb\xac\x5d\xce\x2e\x6f\x57\xb0\x2b\xda\x95\xec\xca\x76\x15\xbb\xaa\x5d\xcd\xae\x6e\xd7\xb0\x6b\xda\xb5\xec\xda\x76\x1d\xbb\xae\x5d\xcf\xc6\x6c\xdc\x26\x6c\xd2\xa6\x6c\xda\x66\x6c\xd6\xe6\x6c\xde\x16\x6c\xd1\x96\x6c\xd9\x56\x6c\xd5\xd6\x6c\xdd\x36\x6c\xd3\xb6\x6c\xdb\x76\x6c\xd7\xf6\x6c\xdf\x0e\xec\xd0\x8e\x6c\x60\x43\x1b\xd9\x31\xbb\xbe\xdd\xc0\x6e\x68\x37\xb2\x1b\xdb\x4d\xec\xa6\x76\x33\xbb\xb9\xdd\xc2\x6e\x69\xb7\xb2\x5b\xdb\x6d\xec\xb6\x76\x3b\xbb\xbd\xdd\xc1\xee\x68\x77\xb2\x3b\xdb\x5d\xec\xae\x76\x37\xbb\xbb\xdd\xc3\xee\x69\xf7\xb2\x7b\xdb\x7d\xec\xbe\x76\x3f\xbb\xbf\x3d\xc0\x1e\x68\x0f\xb2\x07\xdb\x43\xec\xa1\xf6\x30\x7b\xb8\x3d\xc2\x1e\x69\x8f\xb2\x47\xdb\x63\xec\xb1\xf6\x38\x7b\xbc\x3d\xc1\x9e\x68\x4f\xb2\x27\xdb\x53\xec\xa9\xf6\x34\x7b\xba\x3d\xc3\x9e\x69\xcf\xb2\x67\xdb\x73\xec\xb9\xf6\x3c\x7b\xbe\xbd\xc0\x5e\x68\x2f\xb2\x17\xdb\x4b\xec\xa5\xf6\x32\x7b\xb9\xbd\xc2\x5e\x69\xaf\xb2\x57\xdb\x6b\xec\xb5\xf6\x3a\x7b\xbd\xbd\xc1\xde\x68\x6f\xb2\x37\xdb\x5b\xec\xad\xf6\x36\x7b\xbb\xbd\xc3\xde\x69\xef\xb2\x77\xdb\x7b\xec\xbd\xf6\x3e\x7b\xbf\x7d\xc0\x3e\x68\x1f\xb2\x0f\xdb\x47\xec\xa3\xf6\x31\xfb\xb8\x7d\xc2\x3e\x69\x9f\xb2\x4f\xdb\x67\xec\xb3\xf6\x39\xfb\xbc\x7d\xc1\xbe\x68\x5f\xb2\x2f\xdb\x57\xec\xab\xf6\x35\xfb\xba\x7d\xc3\xbe\x69\xdf\xb2\x6f\xdb\x77\xec\xbb\xf6\x3d\xfb\xbe\xfd\xc0\x7e\x68\x3f\xb2\x1f\xdb\x4f\xec\xa7\xf6\x33\xfb\xb9\xfd\xc2\x7e\x69\xbf\xb2\x5f\xdb\x6f\xec\xb7\xf6\x3b\xfb\xbd\xfd\xc1\xfe\x68\x7f\xb2\x3f\xdb\x5f\xec\xaf\xf6\x37\xfb\xbb\xfd\xc3\xfe\x69\xff\xb2\x7f\xdb\x7f\xec\xbf\xf6\x3f\x3b\xce\x8e\xb7\x13\xec\x44\x27\x89\x93\xd4\x49\xe6\x24\x77\x52\x38\x29\x9d\x54\x4e\x6a\x27\x8d\x93\xd6\x49\xe7\xa4\x77\x32\x38\x19\x9d\x4c\x4e\x66\x27\x8b\x93\xd5\xc9\xe6\x64\x77\x72\x38\x39\x9d\x5c\x4e\x6e\x27\x8f\x93\xd7\xc9\xe7\xe4\x77\x0a\x38\x05\x9d\x42\x4e\x61\xa7\x88\x53\xd4\x29\xe6\x14\x77\x4a\x38\x25\x9d\x52\x4e\x69\xa7\x8c\x53\xd6\x29\xe7\x94\x77\x2a\x38\x15\x9d\x4a\x4e\x65\xa7\x8a\x53\xd5\xa9\xe6\x54\x77\x6a\x38\x35\x9d\x5a\x4e\x6d\xa7\x8e\x53\xd7\xa9\xe7\x60\x0e\xee\x10\x0e\xe9\x50\x0e\xed\x30\x0e\xeb\x70\x0e\xef\x08\x8e\xe8\x48\x8e\xec\x28\x8e\xea\x68\x8e\xee\x18\x8e\xe9\x58\x8e\xed\x38\x8e\xeb\x78\x8e\xef\x04\x4e\xe8\x44\x0e\x70\xa0\x83\x9c\x98\x53\xdf\x69\xe0\x34\x74\x1a\x39\x8d\x9d\x26\x4e\x53\xa7\x99\xd3\xdc\x69\xe1\xb4\x74\x5a\x39\xad\x9d\x36\x4e\x5b\xa7\x9d\xd3\xde\xe9\xe0\x74\x74\x3a\x39\x9d\x9d\x2e\x4e\x57\xa7\x9b\xd3\xdd\xe9\xe1\xf4\x74\x7a\x39\xbd\x9d\x3e\x4e\x5f\xa7\x9f\xd3\xdf\x19\xe0\x0c\x74\x06\x39\x83\x9d\x21\xce\x50\x67\x98\x33\xdc\x19\xe1\x8c\x74\x46\x39\xa3\x9d\x31\xce\x58\x67\x9c\x33\xde\x99\xe0\x4c\x74\x26\x39\x93\x9d\x29\xce\x54\x67\x9a\x33\xdd\x99\xe1\xcc\x74\x66\x39\xb3\x9d\x39\xce\x5c\x67\x9e\x33\xdf\x59\xe0\x2c\x74\x16\x39\x8b\x9d\x25\xce\x52\x67\x99\xb3\xdc\x59\xe1\xac\x74\x56\x39\xab\x9d\x35\xce\x5a\x67\x9d\xb3\xde\xd9\xe0\x6c\x74\x36\x39\x9b\x9d\x2d\xce\x56\x67\x9b\xb3\xdd\xd9\xe1\xec\x74\x76\x39\xbb\x9d\x3d\xce\x5e\x67\x9f\xb3\xdf\x39\xe0\x1c\x74\x0e\x39\x87\x9d\x23\xce\x51\xe7\x98\x73\xdc\x39\xe1\x9c\x74\x4e\x39\xa7\x9d\x33\xce\x59\xe7\x9c\x73\xde\xb9\xe0\x5c\x74\x2e\x39\x97\x9d\x2b\xce\x55\xe7\x9a\x73\xdd\xb9\xe1\xdc\x74\x6e\x39\xb7\x9d\x3b\xce\x5d\xe7\x9e\x73\xdf\x79\xe0\x3c\x74\x1e\x39\x8f\x9d\x27\xce\x53\xe7\x99\xf3\xdc\x79\xe1\xbc\x74\x5e\x39\xaf\x9d\x37\xce\x5b\xe7\x9d\xf3\xde\xf9\xe0\x7c\x74\x3e\x39\x9f\x9d\x2f\xce\x57\xe7\x9b\xf3\xdd\xf9\xe1\xfc\x74\x7e\x39\xbf\x9d\x3f\xce\x5f\xe7\x9f\x13\xe7\xc4\x3b\x09\x4e\xa2\x9b\xc4\x4d\xea\x26\x73\x93\xbb\x29\xdc\x94\x6e\x2a\x37\xb5\x9b\xc6\x4d\xeb\xa6\x73\xd3\xbb\x19\xdc\x8c\x6e\x26\x37\xb3\x9b\xc5\xcd\xea\x66\x73\xb3\xbb\x39\xdc\x9c\x6e\x2e\x37\xb7\x9b\xc7\xcd\xeb\xe6\x73\xf3\xbb\x05\xdc\x82\x6e\x21\xb7\xb0\x5b\xc4\x2d\xea\x16\x73\x8b\xbb\x25\xdc\x92\x6e\x29\xb7\xb4\x5b\xc6\x2d\xeb\x96\x73\xcb\xbb\x15\xdc\x8a\x6e\x25\xb7\xb2\x5b\xc5\xad\xea\x56\x73\xab\xbb\x35\xdc\x9a\x6e\x2d\xb7\xb6\x5b\xc7\xad\xeb\xd6\x73\x31\x17\x77\x09\x97\x74\x29\x97\x76\x19\x97\x75\x39\x97\x77\x05\x57\x74\x25\x57\x76\x15\x57\x75\x35\x57\x77\x0d\xd7\x74\x2d\xd7\x76\x1d\xd7\x75\x3d\xd7\x77\x03\x37\x74\x23\x17\xb8\xd0\x45\x6e\xcc\xad\xef\x36\x70\x1b\xba\x8d\xdc\xc6\x6e\x13\xb7\xa9\xdb\xcc\x6d\xee\xb6\x70\x5b\xba\xad\xdc\xd6\x6e\x1b\xb7\xad\xdb\xce\x6d\xef\x76\x70\x3b\xba\x9d\xdc\xce\x6e\x17\xb7\xab\xdb\xcd\xed\xee\xf6\x70\x7b\xba\xbd\xdc\xde\x6e\x1f\xb7\xaf\xdb\xcf\xed\xef\x0e\x70\x07\xba\x83\xdc\xc1\xee\x10\x77\xa8\x3b\xcc\x1d\xee\x8e\x70\x47\xba\xa3\xdc\xd1\xee\x18\x77\xac\x3b\xce\x1d\xef\x4e\x70\x27\xba\x93\xdc\xc9\xee\x14\x77\xaa\x3b\xcd\x9d\xee\xce\x70\x67\xba\xb3\xdc\xd9\xee\x1c\x77\xae\x3b\xcf\x9d\xef\x2e\x70\x17\xba\x8b\xdc\xc5\xee\x12\x77\xa9\xbb\xcc\x5d\xee\xae\x70\x57\xba\xab\xdc\xd5\xee\x1a\x77\xad\xbb\xce\x5d\xef\x6e\x70\x37\xba\x9b\xdc\xcd\xee\x16\x77\xab\xbb\xcd\xdd\xee\xee\x70\x77\xba\xbb\xdc\xdd\xee\x1e\x77\xaf\xbb\xcf\xdd\xef\x1e\x70\x0f\xba\x87\xdc\xc3\xee\x11\xf7\xa8\x7b\xcc\x3d\xee\x9e\x70\x4f\xba\xa7\xdc\xd3\xee\x19\xf7\xac\x7b\xce\x3d\xef\x5e\x70\x2f\xba\x97\xdc\xcb\xee\x15\xf7\xaa\x7b\xcd\xbd\xee\xde\x70\x6f\xba\xb7\xdc\xdb\xee\x1d\xf7\xae\x7b\xcf\xbd\xef\x3e\x70\x1f\xba\x8f\xdc\xc7\xee\x13\xf7\xa9\xfb\xcc\x7d\xee\xbe\x70\x5f\xba\xaf\xdc\xd7\xee\x1b\xf7\xad\xfb\xce\x7d\xef\x7e\x70\x3f\xba\x9f\xdc\xcf\xee\x17\xf7\xab\xfb\xcd\xfd\xee\xfe\x70\x7f\xba\xbf\xdc\xdf\xee\x1f\xf7\xaf\xfb\xcf\x8d\x73\xe3\xdd\x04\x37\xd1\x4b\xe2\x25\xf5\x92\x79\xc9\xbd\x14\x5e\x4a\x2f\x95\x97\xda\x4b\xe3\xa5\xf5\xd2\x79\xe9\xbd\x0c\x5e\x46\x2f\x93\x97\xd9\xcb\xe2\x65\xf5\xb2\x79\xd9\xbd\x1c\x5e\x4e\x2f\x97\x97\xdb\xcb\xe3\xe5\xf5\xf2\x79\xf9\xbd\x02\x5e\x41\xaf\x90\x57\xd8\x2b\xe2\x15\xf5\x8a\x79\xc5\xbd\x12\x5e\x49\xaf\x94\x57\xda\x2b\xe3\x95\xf5\xca\x79\xe5\xbd\x0a\x5e\x45\xaf\x92\x57\xd9\xab\xe2\x55\xf5\xaa\x79\xd5\xbd\x1a\x5e\x4d\xaf\x96\x57\xdb\xab\xe3\xd5\xf5\xea\x79\x98\x87\x7b\x84\x47\x7a\x94\x47\x7b\x8c\xc7\x7a\x9c\xc7\x7b\x82\x27\x7a\x92\x27\x7b\x8a\xa7\x7a\x9a\xa7\x7b\x86\x67\x7a\x96\x67\x7b\x8e\xe7\x7a\x9e\xe7\x7b\x81\x17\x7a\x91\x07\x3c\xe8\x21\x2f\xe6\xd5\xf7\x1a\x78\x0d\xbd\x46\x5e\x63\xaf\x89\xd7\xd4\x6b\xe6\x35\xf7\x5a\x78\x2d\xbd\x56\x5e\x6b\xaf\x8d\xd7\xd6\x6b\xe7\xb5\xf7\x3a\x78\x1d\xbd\x4e\x5e\x67\xaf\x8b\xd7\xd5\xeb\xe6\x75\xf7\x7a\x78\x3d\xbd\x5e\x5e\x6f\xaf\x8f\xd7\xd7\xeb\xe7\xf5\xf7\x06\x78\x03\xbd\x41\xde\x60\x6f\x88\x37\xd4\x1b\xe6\x0d\xf7\x46\x78\x23\xbd\x51\xde\x68\x6f\x8c\x37\xd6\x1b\xe7\x8d\xf7\x26\x78\x13\xbd\x49\xde\x64\x6f\x8a\x37\xd5\x9b\xe6\x4d\xf7\x66\x78\x33\xbd\x59\xde\x6c\x6f\x8e\x37\xd7\x9b\xe7\xcd\xf7\x16\x78\x0b\xbd\x45\xde\x62\x6f\x89\xb7\xd4\x5b\xe6\x2d\xf7\x56\x78\x2b\xbd\x55\xde\x6a\x6f\x8d\xb7\xd6\x5b\xe7\xad\xf7\x36\x78\x1b\xbd\x4d\xde\x66\x6f\x8b\xb7\xd5\xdb\xe6\x6d\xf7\x76\x78\x3b\xbd\x5d\xde\x6e\x6f\x8f\xb7\xd7\xdb\xe7\xed\xf7\x0e\x78\x07\xbd\x43\xde\x61\xef\x88\x77\xd4\x3b\xe6\x1d\xf7\x4e\x78\x27\xbd\x53\xde\x69\xef\x8c\x77\xd6\x3b\xe7\x9d\xf7\x2e\x78\x17\xbd\x4b\xde\x65\xef\x8a\x77\xd5\xbb\xe6\x5d\xf7\x6e\x78\x37\xbd\x5b\xde\x6d\xef\x8e\x77\xd7\xbb\xe7\xdd\xf7\x1e\x78\x0f\xbd\x47\xde\x63\xef\x89\xf7\xd4\x7b\xe6\x3d\xf7\x5e\x78\x2f\xbd\x57\xde\x6b\xef\x8d\xf7\xd6\x7b\xe7\xbd\xf7\x3e\x78\x1f\xbd\x4f\xde\x67\xef\x8b\xf7\xd5\xfb\xe6\x7d\xf7\x7e\x78\x3f\xbd\x5f\xde\x6f\xef\x8f\xf7\xd7\xfb\xe7\xc5\x79\xf1\x5e\x82\x97\xe8\x27\xf1\x93\xfa\xc9\xfc\xe4\x7e\x0a\x3f\xa5\x9f\xca\x4f\xed\xa7\xf1\xd3\xfa\xe9\xfc\xf4\x7e\x06\x3f\xa3\x9f\xc9\xcf\xec\x67\xf1\xb3\xfa\xd9\xfc\xec\x7e\x0e\x3f\xa7\x9f\xcb\xcf\xed\xe7\xf1\xf3\xfa\xf9\xfc\xfc\x7e\x01\xbf\xa0\x5f\xc8\x2f\xec\x17\xf1\x8b\xfa\xc5\xfc\xe2\x7e\x09\xbf\xa4\x5f\xca\x2f\xed\x97\xf1\xcb\xfa\xe5\xfc\xf2\x7e\x05\xbf\xa2\x5f\xc9\xaf\xec\x57\xf1\xab\xfa\xd5\xfc\xea\x7e\x0d\xbf\xa6\x5f\xcb\xaf\xed\xd7\xf1\xeb\xfa\xf5\x7c\xcc\xc7\x7d\xc2\x27\x7d\xca\xa7\x7d\xc6\x67\x7d\xce\xe7\x7d\xc1\x17\x7d\xc9\x97\x7d\xc5\x57\x7d\xcd\xd7\x7d\xc3\x37\x7d\xcb\xb7\x7d\xc7\x77\x7d\xcf\xf7\xfd\xc0\x0f\xfd\xc8\x07\x3e\xf4\x91\x1f\xf3\xeb\xfb\x0d\xfc\x86\x7e\x23\xbf\xb1\xdf\xc4\x6f\xea\x37\xf3\x9b\xfb\x2d\xfc\x96\x7e\x2b\xbf\xb5\xdf\xc6\x6f\xeb\xb7\xf3\xdb\xfb\x1d\xfc\x8e\x7e\x27\xbf\xb3\xdf\xc5\xef\xea\x77\xf3\xbb\xfb\x3d\xfc\x9e\x7e\x2f\xbf\xb7\xdf\xc7\xef\xeb\xf7\xf3\xfb\xfb\x03\xfc\x81\xfe\x20\x7f\xb0\x3f\xc4\x1f\xea\x0f\xf3\x87\xfb\x23\xfc\x91\xfe\x28\x7f\xb4\x3f\xc6\x1f\xeb\x8f\xf3\xc7\xfb\x13\xfc\x89\xfe\x24\x7f\xb2\x3f\xc5\x9f\xea\x4f\xf3\xa7\xfb\x33\xfc\x99\xfe\x2c\x7f\xb6\x3f\xc7\x9f\xeb\xcf\xf3\xe7\xfb\x0b\xfc\x85\xfe\x22\x7f\xb1\xbf\xc4\x5f\xea\x2f\xf3\x97\xfb\x2b\xfc\x95\xfe\x2a\x7f\xb5\xbf\xc6\x5f\xeb\xaf\xf3\xd7\xfb\x1b\xfc\x8d\xfe\x26\x7f\xb3\xbf\xc5\xdf\xea\x6f\xf3\xb7\xfb\x3b\xfc\x9d\xfe\x2e\x7f\xb7\xbf\xc7\xdf\xeb\xef\xf3\xf7\xfb\x07\xfc\x83\xfe\x21\xff\xb0\x7f\xc4\x3f\xea\x1f\xf3\x8f\xfb\x27\xfc\x93\xfe\x29\xff\xb4\x7f\xc6\x3f\xeb\x9f\xf3\xcf\xfb\x17\xfc\x8b\xfe\x25\xff\xb2\x7f\xc5\xbf\xea\x5f\xf3\xaf\xfb\x37\xfc\x9b\xfe\x2d\xff\xb6\x7f\xc7\xbf\xeb\xdf\xf3\xef\xfb\x0f\xfc\x87\xfe\x23\xff\xb1\xff\xc4\x7f\xea\x3f\xf3\x9f\xfb\x2f\xfc\x97\xfe\x2b\xff\xb5\xff\xc6\x7f\xeb\xbf\xf3\xdf\xfb\x1f\xfc\x8f\xfe\x27\xff\xb3\xff\xc5\xff\xea\x7f\xf3\xbf\xfb\x3f\xfc\x9f\xfe\x2f\xff\xb7\xff\xc7\xff\xeb\xff\xf3\xe3\xfc\x78\x3f\xc1\x4f\x0c\x92\x04\x49\x83\x64\x41\xf2\x20\x45\x90\x32\x48\x15\xa4\x0e\xd2\x04\x69\x83\x74\x41\xfa\x20\x43\x90\x31\xc8\x14\x64\x0e\xb2\x04\x59\x83\x6c\x41\xf6\x20\x47\x90\x33\xc8\x15\xe4\x0e\xf2\x04\x79\x83\x7c\x41\xfe\xa0\x40\x50\x30\x28\x14\x14\x0e\x8a\x04\x45\x83\x62\x41\xf1\xa0\x44\x50\x32\x28\x15\x94\x0e\xca\x04\x65\x83\x72\x41\xf9\xa0\x42\x50\x31\xa8\x14\x54\x0e\xaa\x04\x55\x83\x6a\x41\xf5\xa0\x46\x50\x33\xa8\x15\xd4\x0e\xea\x04\x75\x83\x7a\x01\x16\xe0\x01\x11\x90\x01\x15\xd0\x01\x13\xb0\x01\x17\xf0\x81\x10\x88\x81\x14\xc8\x81\x12\xa8\x81\x16\xe8\x81\x11\x98\x81\x15\xd8\x81\x13\xb8\x81\x17\xf8\x41\x10\x84\x41\x14\x80\x00\x06\x28\x88\x05\xf5\x83\x06\x41\xc3\xa0\x51\xd0\x38\x68\x12\x34\x0d\x9a\x05\xcd\x83\x16\x41\xcb\xa0\x55\xd0\x3a\x68\x13\xb4\x0d\xda\x05\xed\x83\x0e\x41\xc7\xa0\x53\xd0\x39\xe8\x12\x74\x0d\xba\x05\xdd\x83\x1e\x41\xcf\xa0\x57\xd0\x3b\xe8\x13\xf4\x0d\xfa\x05\xfd\x83\x01\xc1\xc0\x60\x50\x30\x38\x18\x12\x0c\x0d\x86\x05\xc3\x83\x11\xc1\xc8\x60\x54\x30\x3a\x18\x13\x8c\x0d\xc6\x05\xe3\x83\x09\xc1\xc4\x60\x52\x30\x39\x98\x12\x4c\x0d\xa6\x05\xd3\x83\x19\xc1\xcc\x60\x56\x30\x3b\x98\x13\xcc\x0d\xe6\x05\xf3\x83\x05\xc1\xc2\x60\x51\xb0\x38\x58\x12\x2c\x0d\x96\x05\xcb\x83\x15\xc1\xca\x60\x55\xb0\x3a\x58\x13\xac\x0d\xd6\x05\xeb\x83\x0d\xc1\xc6\x60\x53\xb0\x39\xd8\x12\x6c\x0d\xb6\x05\xdb\x83\x1d\xc1\xce\x60\x57\xb0\x3b\xd8\x13\xec\x0d\xf6\x05\xfb\x83\x03\xc1\xc1\xe0\x50\x70\x38\x38\x12\x1c\x0d\x8e\x05\xc7\x83\x13\xc1\xc9\xe0\x54\x70\x3a\x38\x13\x9c\x0d\xce\x05\xe7\x83\x0b\xc1\xc5\xe0\x52\x70\x39\xb8\x12\x5c\x0d\xae\x05\xd7\x83\x1b\xc1\xcd\xe0\x56\x70\x3b\xb8\x13\xdc\x0d\xee\x05\xf7\x83\x07\xc1\xc3\xe0\x51\xf0\x38\x78\x12\x3c\x0d\x9e\x05\xcf\x83\x17\xc1\xcb\xe0\x55\xf0\x3a\x78\x13\xbc\x0d\xde\x05\xef\x83\x0f\xc1\xc7\xe0\x53\xf0\x39\xf8\x12\x7c\x0d\xbe\x05\xdf\x83\x1f\xc1\xcf\xe0\x57\xf0\x3b\xf8\x13\xfc\x0d\xfe\x05\x71\x41\x7c\x90\x10\x24\x86\x49\xc2\xa4\x61\xb2\x30\x79\x98\x22\x4c\x19\xa6\x0a\x53\x87\x69\xc2\xb4\x61\xba\x30\x7d\x98\x21\xcc\x18\x66\x0a\x33\x87\x59\xc2\xac\x61\xb6\x30\x7b\x98\x23\xcc\x19\xe6\x0a\x73\x87\x79\xc2\xbc\x61\xbe\x30\x7f\x58\x20\x2c\x18\x16\x0a\x0b\x87\x45\xc2\xa2\x61\xb1\xb0\x78\x58\x22\x2c\x19\x96\x0a\x4b\x87\x65\xc2\xb2\x61\xb9\xb0\x7c\x58\x21\xac\x18\x56\x0a\x2b\x87\x55\xc2\xaa\x61\xb5\xb0\x7a\x58\x23\xac\x19\xd6\x0a\x6b\x87\x75\xc2\xba\x61\xbd\x10\x0b\xf1\x90\x08\xc9\x90\x0a\xe9\x90\x09\xd9\x90\x0b\xf9\x50\x08\xc5\x50\x0a\xe5\x50\x09\xd5\x50\x0b\xf5\xd0\x08\xcd\xd0\x0a\xed\xd0\x09\xdd\xd0\x0b\xfd\x30\x08\xc3\x30\x0a\x41\x08\x43\x14\xc6\xc2\xfa\x61\x83\xb0\x61\xd8\x28\x6c\x1c\x36\x09\x9b\x86\xcd\xc2\xe6\x61\x8b\xb0\x65\xd8\x2a\x6c\x1d\xb6\x09\xdb\x86\xed\xc2\xf6\x61\x87\xb0\x63\xd8\x29\xec\x1c\x76\x09\xbb\x86\xdd\xc2\xee\x61\x8f\xb0\x67\xd8\x2b\xec\x1d\xf6\x09\xfb\x86\xfd\xc2\xfe\xe1\x80\x70\x60\x38\x28\x1c\x1c\x0e\x09\x87\x86\xc3\xc2\xe1\xe1\x88\x70\x64\x38\x2a\x1c\x1d\x8e\x09\xc7\x86\xe3\xc2\xf1\xe1\x84\x70\x62\x38\x29\x9c\x1c\x4e\x09\xa7\x86\xd3\xc2\xe9\xe1\x8c\x70\x66\x38\x2b\x9c\x1d\xce\x09\xe7\x86\xf3\xc2\xf9\xe1\x82\x70\x61\xb8\x28\x5c\x1c\x2e\x09\x97\x86\xcb\xc2\xe5\xe1\x8a\x70\x65\xb8\x2a\x5c\x1d\xae\x09\xd7\x86\xeb\xc2\xf5\xe1\x86\x70\x63\xb8\x29\xdc\x1c\x6e\x09\xb7\x86\xdb\xc2\xed\xe1\x8e\x70\x67\xb8\x2b\xdc\x1d\xee\x09\xf7\x86\xfb\xc2\xfd\xe1\x81\xf0\x60\x78\x28\x3c\x1c\x1e\x09\x8f\x86\xc7\xc2\xe3\xe1\x89\xf0\x64\x78\x2a\x3c\x1d\x9e\x09\xcf\x86\xe7\xc2\xf3\xe1\x85\xf0\x62\x78\x29\xbc\x1c\x5e\x09\xaf\x86\xd7\xc2\xeb\xe1\x8d\xf0\x66\x78\x2b\xbc\x1d\xde\x09\xef\x86\xf7\xc2\xfb\xe1\x83\xf0\x61\xf8\x28\x7c\x1c\x3e\x09\x9f\x86\xcf\xc2\xe7\xe1\x8b\xf0\x65\xf8\x2a\x7c\x1d\xbe\x09\xdf\x86\xef\xc2\xf7\xe1\x87\xf0\x63\xf8\x29\xfc\x1c\x7e\x09\xbf\x86\xdf\xc2\xef\xe1\x8f\xf0\x67\xf8\x2b\xfc\x1d\xfe\x09\xff\x86\xff\xc2\xb8\x30\x3e\x4c\x08\x13\xa3\x24\x51\xd2\x28\x59\x94\x3c\x4a\x11\xa5\x8c\x52\x45\xa9\xa3\x34\x51\xda\x28\x5d\x94\x3e\xca\x10\x65\x8c\x32\x45\x99\xa3\x2c\x51\xd6\x28\x5b\x94\x3d\xca\x11\xe5\x8c\x72\x45\xb9\xa3\x3c\x51\xde\x28\x5f\x94\x3f\x2a\x10\x15\x8c\x0a\x45\x85\xa3\x22\x51\xd1\xa8\x58\x54\x3c\x2a\x11\x95\x8c\x4a\x45\xa5\xa3\x32\x51\xd9\xa8\x5c\x54\x3e\xaa\x10\x55\x8c\x2a\x45\x95\xa3\x2a\x51\xd5\xa8\x5a\x54\x3d\xaa\x11\xd5\x8c\x6a\x45\xb5\xa3\x3a\x51\xdd\xa8\x5e\x84\x45\x78\x44\x44\x64\x44\x45\x74\xc4\x44\x6c\xc4\x45\x7c\x24\x44\x62\x24\x45\x72\xa4\x44\x6a\xa4\x45\x7a\x64\x44\x66\x64\x45\x76\xe4\x44\x6e\xe4\x45\x7e\x14\x44\x61\x14\x45\x20\x82\x11\x8a\x62\x51\xfd\xa8\x41\xd4\x30\x6a\x14\x35\x8e\x9a\x44\x4d\xa3\x66\x51\xf3\xa8\x45\xd4\x32\x6a\x15\xb5\x8e\xda\x44\x6d\xa3\x76\x51\xfb\xa8\x43\xd4\x31\xea\x14\x75\x8e\xba\x44\x5d\xa3\x6e\x51\xf7\xa8\x47\xd4\x33\xea\x15\xf5\x8e\xfa\x44\x7d\xa3\x7e\x51\xff\x68\x40\x34\x30\x1a\x14\x0d\x8e\x86\x44\x43\xa3\x61\xd1\xf0\x68\x44\x34\x32\x1a\x15\x8d\x8e\xc6\x44\x63\xa3\x71\xd1\xf8\x68\x42\x34\x31\x9a\x14\x4d\x8e\xa6\x44\x53\xa3\x69\xd1\xf4\x68\x46\x34\x33\x9a\x15\xcd\x8e\xe6\x44\x73\xa3\x79\xd1\xfc\x68\x41\xb4\x30\x5a\x14\x2d\x8e\x96\x44\x4b\xa3\x65\xd1\xf2\x68\x45\xb4\x32\x5a\x15\xad\x8e\xd6\x44\x6b\xa3\x75\xd1\xfa\x68\x43\xb4\x31\xda\x14\x6d\x8e\xb6\x44\x5b\xa3\x6d\xd1\xf6\x68\x47\xb4\x33\xda\x15\xed\x8e\xf6\x44\x7b\xa3\x7d\xd1\xfe\xe8\x40\x74\x30\x3a\x14\x1d\x8e\x8e\x44\x47\xa3\x63\xd1\xf1\xe8\x44\x74\x32\x3a\x15\x9d\x8e\xce\x44\x67\xa3\x73\xd1\xf9\xe8\x42\x74\x31\xba\x14\x5d\x8e\xae\x44\x57\xa3\x6b\xd1\xf5\xe8\x46\x74\x33\xba\x15\xdd\x8e\xee\x44\x77\xa3\x7b\xd1\xfd\xe8\x41\xf4\x30\x7a\x14\x3d\x8e\x9e\x44\x4f\xa3\x67\xd1\xf3\xe8\x45\xf4\x32\x7a\x15\xbd\x8e\xde\x44\x6f\xa3\x77\xd1\xfb\xe8\x43\xf4\x31\xfa\x14\x7d\x8e\xbe\x44\x5f\xa3\x6f\xd1\xf7\xe8\x47\xf4\x33\xfa\x15\xfd\x8e\xfe\x44\x7f\xa3\x7f\x51\x5c\x14\x1f\x25\x44\x89\x20\x09\x48\x0a\x92\x81\xe4\x20\x05\x48\x09\x52\x81\xd4\x20\x0d\x48\x0b\xd2\x81\xf4\x20\x03\xc8\x08\x32\x81\xcc\x20\x0b\xc8\x0a\xb2\x81\xec\x20\x07\xc8\x09\x72\x81\xdc\x20\x0f\xc8\x0b\xf2\x81\xfc\xa0\x00\x28\x08\x0a\x81\xc2\xa0\x08\x28\x0a\x8a\x81\xe2\xa0\x04\x28\x09\x4a\x81\xd2\xa0\x0c\x28\x0b\xca\x81\xf2\xa0\x02\xa8\x08\x2a\x81\xca\xa0\x0a\xa8\x0a\xaa\x81\xea\xa0\x06\xa8\x09\x6a\x81\xda\xa0\x0e\xa8\x0b\xea\x01\x0c\xe0\x80\x00\x24\xa0\x00\x0d\x18\xc0\x02\x0e\xf0\x40\x00\x22\x90\x80\x0c\x14\xa0\x02\x0d\xe8\xc0\x00\x26\xb0\x80\x0d\x1c\xe0\x02\x0f\xf8\x20\x00\x21\x88\x00\x00\x10\x20\x10\x03\xf5\x41\x03\xd0\x10\x34\x02\x8d\x41\x13\xd0\x14\x34\x03\xcd\x41\x0b\xd0\x12\xb4\x02\xad\x41\x1b\xd0\x16\xb4\x03\xed\x41\x07\xd0\x11\x74\x02\x9d\x41\x17\xd0\x15\x74\x03\xdd\x41\x0f\xd0\x13\xf4\x02\xbd\x41\x1f\xd0\x17\xf4\x03\xfd\xc1\x00\x30\x10\x0c\x02\x83\xc1\x10\x30\x14\x0c\x03\xc3\xc1\x08\x30\x12\x8c\x02\xa3\xc1\x18\x30\x16\x8c\x03\xe3\xc1\x04\x30\x11\x4c\x02\x93\xc1\x14\x30\x15\x4c\x03\xd3\xc1\x0c\x30\x13\xcc\x02\xb3\xc1\x1c\x30\x17\xcc\x03\xf3\xc1\x02\xb0\x10\x2c\x02\x8b\xc1\x12\xb0\x14\x2c\x03\xcb\xc1\x0a\xb0\x12\xac\x02\xab\xc1\x1a\xb0\x16\xac\x03\xeb\xc1\x06\xb0\x11\x6c\x02\x9b\xc1\x16\xb0\x15\x6c\x03\xdb\xc1\x0e\xb0\x13\xec\x02\xbb\xc1\x1e\xb0\x17\xec\x03\xfb\xc1\x01\x70\x10\x1c\x02\x87\xc1\x11\x70\x14\x1c\x03\xc7\xc1\x09\x70\x12\x9c\x02\xa7\xc1\x19\x70\x16\x9c\x03\xe7\xc1\x05\x70\x11\x5c\x02\x97\xc1\x15\x70\x15\x5c\x03\xd7\xc1\x0d\x70\x13\xdc\x02\xb7\xc1\x1d\x70\x17\xdc\x03\xf7\xc1\x03\xf0\x10\x3c\x02\x8f\xc1\x13\xf0\x14\x3c\x03\xcf\xc1\x0b\xf0\x12\xbc\x02\xaf\xc1\x1b\xf0\x16\xbc\x03\xef\xc1\x07\xf0\x11\x7c\x02\x9f\xc1\x17\xf0\x15\x7c\x03\xdf\xc1\x0f\xf0\x13\xfc\x02\xbf\xc1\x1f\xf0\x17\xfc\x03\x71\x20\x1e\x24\x80\x44\x98\x04\x26\x85\xc9\x60\x72\x98\x02\xa6\x84\xa9\x60\x6a\x98\x06\xa6\x85\xe9\x60\x7a\x98\x01\x66\x84\x99\x60\x66\x98\x05\x66\x85\xd9\x60\x76\x98\x03\xe6\x84\xb9\x60\x6e\x98\x07\xe6\x85\xf9\x60\x7e\x58\x00\x16\x84\x85\x60\x61\x58\x04\x16\x85\xc5\x60\x71\x58\x02\x96\x84\xa5\x60\x69\x58\x06\x96\x85\xe5\x60\x79\x58\x01\x56\x84\x95\x60\x65\x58\x05\x56\x85\xd5\x60\x75\x58\x03\xd6\x84\xb5\x60\x6d\x58\x07\xd6\x85\xf5\x20\x06\x71\x48\x40\x12\x52\x90\x86\x0c\x64\x21\x07\x79\x28\x40\x11\x4a\x50\x86\x0a\x54\xa1\x06\x75\x68\x40\x13\x5a\xd0\x86\x0e\x74\xa1\x07\x7d\x18\xc0\x10\x46\x10\x40\x08\x11\x8c\xc1\xfa\xb0\x01\x6c\x08\x1b\xc1\xc6\xb0\x09\x6c\x0a\x9b\xc1\xe6\xb0\x05\x6c\x09\x5b\xc1\xd6\xb0\x0d\x6c\x0b\xdb\xc1\xf6\xb0\x03\xec\x08\x3b\xc1\xce\xb0\x0b\xec\x0a\xbb\xc1\xee\xb0\x07\xec\x09\x7b\xc1\xde\xb0\x0f\xec\x0b\xfb\xc1\xfe\x70\x00\x1c\x08\x07\xc1\xc1\x70\x08\x1c\x0a\x87\xc1\xe1\x70\x04\x1c\x09\x47\xc1\xd1\x70\x0c\x1c\x0b\xc7\xc1\xf1\x70\x02\x9c\x08\x27\xc1\xc9\x70\x0a\x9c\x0a\xa7\xc1\xe9\x70\x06\x9c\x09\x67\xc1\xd9\x70\x0e\x9c\x0b\xe7\xc1\xf9\x70\x01\x5c\x08\x17\xc1\xc5\x70\x09\x5c\x0a\x97\xc1\xe5\x70\x05\x5c\x09\x57\xc1\xd5\x70\x0d\x5c\x0b\xd7\xc1\xf5\x70\x03\xdc\x08\x37\xc1\xcd\x70\x0b\xdc\x0a\xb7\xc1\xed\x70\x07\xdc\x09\x77\xc1\xdd\x70\x0f\xdc\x0b\xf7\xc1\xfd\xf0\x00\x3c\x08\x0f\xc1\xc3\xf0\x08\x3c\x0a\x8f\xc1\xe3\xf0\x04\x3c\x09\x4f\xc1\xd3\xf0\x0c\x3c\x0b\xcf\xc1\xf3\xf0\x02\xbc\x08\x2f\xc1\xcb\xf0\x0a\xbc\x0a\xaf\xc1\xeb\xf0\x06\xbc\x09\x6f\xc1\xdb\xf0\x0e\xbc\x0b\xef\xc1\xfb\xf0\x01\x7c\x08\x1f\xc1\xc7\xf0\x09\x7c\x0a\x9f\xc1\xe7\xf0\x05\x7c\x09\x5f\xc1\xd7\xf0\x0d\x7c\x0b\xdf\xc1\xf7\xf0\x03\xfc\x08\x3f\xc1\xcf\xf0\x0b\xfc\x0a\xbf\xc1\xef\xf0\x07\xfc\x09\x7f\xc1\xdf\xf0\x0f\xfc\x0b\xff\xc1\x38\x18\x0f\x13\x60\x22\x4a\x82\x92\xa2\x64\x28\x39\x4a\x81\x52\xa2\x54\x28\x35\x4a\x83\xd2\xa2\x74\x28\x3d\xca\x80\x32\xa2\x4c\x28\x33\xca\x82\xb2\xa2\x6c\x28\x3b\xca\x81\x72\xa2\x5c\x28\x37\xca\x83\xf2\xa2\x7c\x28\x3f\x2a\x80\x0a\xa2\x42\xa8\x30\x2a\x82\x8a\xa2\x62\xa8\x38\x2a\x81\x4a\xa2\x52\xa8\x34\x2a\x83\xca\xa2\x72\xa8\x3c\xaa\x80\x2a\xa2\x4a\xa8\x32\xaa\x82\xaa\xa2\x6a\xa8\x3a\xaa\x81\x6a\xa2\x5a\xa8\x36\xaa\x83\xea\xa2\x7a\x08\x43\x38\x22\x10\x89\x28\x44\x23\x06\xb1\x88\x43\x3c\x12\x90\x88\x24\x24\x23\x05\xa9\x48\x43\x3a\x32\x90\x89\x2c\x64\x23\x07\xb9\xc8\x43\x3e\x0a\x50\x88\x22\x04\x10\x44\x08\xc5\x50\x7d\xd4\x00\x35\x44\x8d\x50\x63\xd4\x04\x35\x45\xcd\x50\x73\xd4\x02\xb5\x44\xad\x50\x6b\xd4\x06\xb5\x45\xed\x50\x7b\xd4\x01\x75\x44\x9d\x50\x67\xd4\x05\x75\x45\xdd\x50\x77\xd4\x03\xf5\x44\xbd\x50\x6f\xd4\x07\xf5\x45\xfd\x50\x7f\x34\x00\x0d\x44\x83\xd0\x60\x34\x04\x0d\x45\xc3\xd0\x70\x34\x02\x8d\x44\xa3\xd0\x68\x34\x06\x8d\x45\xe3\xd0\x78\x34\x01\x4d\x44\x93\xd0\x64\x34\x05\x4d\x45\xd3\xd0\x74\x34\x03\xcd\x44\xb3\xd0\x6c\x34\x07\xcd\x45\xf3\xd0\x7c\xb4\x00\x2d\x44\x8b\xd0\x62\xb4\x04\x2d\x45\xcb\xd0\x72\xb4\x02\xad\x44\xab\xd0\x6a\xb4\x06\xad\x45\xeb\xd0\x7a\xb4\x01\x6d\x44\x9b\xd0\x66\xb4\x05\x6d\x45\xdb\xd0\x76\xb4\x03\xed\x44\xbb\xd0\x6e\xb4\x07\xed\x45\xfb\xd0\x7e\x74\x00\x1d\x44\x87\xd0\x61\x74\x04\x1d\x45\xc7\xd0\x71\x74\x02\x9d\x44\xa7\xd0\x69\x74\x06\x9d\x45\xe7\xd0\x79\x74\x01\x5d\x44\x97\xd0\x65\x74\x05\x5d\x45\xd7\xd0\x75\x74\x03\xdd\x44\xb7\xd0\x6d\x74\x07\xdd\x45\xf7\xd0\x7d\xf4\x00\x3d\x44\x8f\xd0\x63\xf4\x04\x3d\x45\xcf\xd0\x73\xf4\x02\xbd\x44\xaf\xd0\x6b\xf4\x06\xbd\x45\xef\xd0\x7b\xf4\x01\x7d\x44\x9f\xd0\x67\xf4\x05\x7d\x45\xdf\xd0\x77\xf4\x03\xfd\x44\xbf\xd0\x6f\xf4\x07\xfd\x45\xff\x50\x1c\x8a\x47\x09\x28\x31\x96\x24\x96\x34\x96\x2c\x96\x3c\x96\x22\x96\x32\x96\x2a\x96\x3a\x96\x26\x96\x36\x96\x2e\x96\x3e\x96\x21\x96\x31\x96\x29\x96\x39\x96\x25\x96\x35\x96\x2d\x96\x3d\x96\x23\x96\x33\x96\x2b\x96\x3b\x96\x27\x96\x37\x96\x2f\x96\x3f\x56\x20\x56\x30\x56\x28\x56\x38\x56\x24\x56\x34\x56\x2c\x56\x3c\x56\x22\x56\x32\x56\x2a\x56\x3a\x56\x26\x56\x36\x56\x2e\x56\x3e\x56\x21\x56\x31\x56\x29\x56\x39\x56\x25\x56\x35\x56\x2d\x56\x3d\x56\x23\x56\x33\x56\x2b\x56\x3b\x56\x27\x56\x37\x56\x2f\x86\xc5\xf0\x18\x11\x23\x63\x54\x8c\x8e\x31\x31\x36\xc6\xc5\xf8\x98\x10\x13\x63\x52\x4c\x8e\x29\x31\x35\xa6\xc5\xf4\x98\x11\x33\x63\x56\xcc\x8e\x39\x31\xf7\x3f\x01\xf0\x00\x68\x55\x0c\x00\x00\x34\xdb\xb6\x6d\xdb\xb6\x7d\x6d\x5b\xdb\x5e\xb6\x6d\xdb\xb6\x6d\xdb\xb6\xed\x3e\x3a\x58\x77\xac\x07\xd6\x13\xeb\x85\xf5\xc6\xfa\x60\x7d\xb1\x7e\x18\x86\xe1\x18\x81\x91\x18\x85\xd1\x18\x83\xb1\x18\x87\xf1\x98\x80\x89\x98\x84\xc9\x98\x82\xa9\x98\x86\xe9\x98\x81\x99\x98\x85\xd9\x98\x83\xb9\x98\x87\xf9\x58\x80\x85\x58\x84\x01\x0c\x62\x08\x8b\x61\xfd\xb1\x01\xd8\x40\x6c\x10\x36\x18\x1b\x82\x0d\xc5\x86\x61\xc3\xb1\x11\xd8\x48\x6c\x14\x36\x1a\x1b\x83\x8d\xc5\xc6\x61\xe3\xb1\x09\xd8\x44\x6c\x12\x36\x19\x9b\x82\x4d\xc5\xa6\x61\xd3\xb1\x19\xd8\x4c\x6c\x16\x36\x1b\x9b\x83\xcd\xc5\xe6\x61\xf3\xb1\x05\xd8\x42\x6c\x11\xb6\x18\x5b\x82\x2d\xc5\x96\x61\xcb\xb1\x15\xd8\x4a\x6c\x15\xb6\x1a\x5b\x83\xad\xc5\xd6\x61\xeb\xb1\x0d\xd8\x46\x6c\x13\xb6\x19\xdb\x82\x6d\xc5\xb6\x61\xdb\xb1\x1d\xd8\x4e\x6c\x17\xb6\x1b\xdb\x83\xed\xc5\xf6\x61\xfb\xb1\x03\xd8\x41\xec\x10\x76\x18\x3b\x82\x1d\xc5\x8e\x61\xc7\xb1\x13\xd8\x49\xec\x14\x76\x1a\x3b\x83\x9d\xc5\xce\x61\xe7\xb1\x0b\xd8\x45\xec\x12\x76\x19\xbb\x82\x5d\xc5\xae\x61\xd7\xb1\x1b\xd8\x4d\xec\x16\x76\x1b\xbb\x83\xdd\xc5\xee\x61\xf7\xb1\x07\xd8\x43\xec\x11\xf6\x18\x7b\x82\x3d\xc5\x9e\x61\xcf\xb1\x17\xd8\x4b\xec\x15\xf6\x1a\x7b\x83\xbd\xc5\xde\x61\xef\xb1\x0f\xd8\x47\xec\x13\xf6\x19\xfb\x82\x7d\xc5\xbe\x61\xdf\xb1\x1f\xd8\x4f\xec\x17\xf6\x1b\xfb\x83\xfd\xc5\xfe\x61\x71\x58\x3c\x96\x80\x25\xe2\x49\xf0\xa4\x78\x32\x3c\x39\x9e\x02\x4f\x89\xa7\xc2\x53\xe3\x69\xf0\xb4\x78\x3a\x3c\x3d\x9e\x01\xcf\x88\x67\xc2\x33\xe3\x59\xf0\xac\x78\x36\x3c\x3b\x9e\x03\xcf\x89\xe7\xc2\x73\xe3\x79\xf0\xbc\x78\x3e\x3c\x3f\x5e\x00\x2f\x88\x17\xc2\x0b\xe3\x45\xf0\xa2\x78\x31\xbc\x38\x5e\x02\x2f\x89\x97\xc2\x4b\xe3\x65\xf0\xb2\x78\x39\xbc\x3c\x5e\x01\xaf\x88\x57\xc2\x2b\xe3\x55\xf0\xaa\x78\x35\xbc\x3a\x5e\x03\xaf\x89\xd7\xc2\x6b\xe3\x75\xf0\xba\x78\x3d\xbc\x3e\xde\x00\x6f\x88\x37\xc2\x1b\xe3\x4d\xf0\xa6\x78\x33\xbc\x39\xde\x02\x6f\x89\xb7\xc2\x5b\xe3\x6d\xf0\xb6\x78\x3b\xbc\x3d\xde\x01\xef\x88\x77\xc2\x3b\xe3\x5d\xf0\xae\x78\x37\xbc\x3b\xde\x03\xef\x89\xf7\xc2\x7b\xe3\x7d\xf0\xbe\x78\x3f\x1c\xc3\x71\x9c\xc0\x49\x9c\xc2\x69\x9c\xc1\x59\x9c\xc3\x79\x5c\xc0\x45\x5c\xc2\x65\x5c\xc1\x55\x5c\xc3\x75\xdc\xc0\x4d\xdc\xc2\x6d\xdc\xc1\x5d\xdc\xc3\x7d\x3c\xc0\x43\x3c\xc2\x01\x0e\x71\x84\xc7\xf0\xfe\xf8\x00\x7c\x20\x3e\x08\x1f\x8c\x0f\xc1\x87\xe2\xc3\xf0\xe1\xf8\x08\x7c\x24\x3e\x0a\x1f\x8d\x8f\xc1\xc7\xe2\xe3\xf0\xf1\xf8\x04\x7c\x22\x3e\x09\x9f\x8c\x4f\xc1\xa7\xe2\xd3\xf0\xe9\xf8\x0c\x7c\x26\x3e\x0b\x9f\x8d\xcf\xc1\xe7\xe2\xf3\xf0\xf9\xf8\x02\x7c\x21\xbe\x08\x5f\x8c\x2f\xc1\x97\xe2\xcb\xf0\xe5\xf8\x0a\x7c\x25\xbe\x0a\x5f\x8d\xaf\xc1\xd7\xe2\xeb\xf0\xf5\xf8\x06\x7c\x23\xbe\x09\xdf\x8c\x6f\xc1\xb7\xe2\xdb\xf0\xed\xf8\x0e\x7c\x27\xbe\x0b\xdf\x8d\xef\xc1\xf7\xe2\xfb\xf0\xfd\xf8\x01\xfc\x20\x7e\x08\x3f\x8c\x1f\xc1\x8f\xe2\xc7\xf0\xe3\xf8\x09\xfc\x24\x7e\x0a\x3f\x8d\x9f\xc1\xcf\xe2\xe7\xf0\xf3\xf8\x05\xfc\x22\x7e\x09\xbf\x8c\x5f\xc1\xaf\xe2\xd7\xf0\xeb\xf8\x0d\xfc\x26\x7e\x0b\xbf\x8d\xdf\xc1\xef\xe2\xf7\xf0\xfb\xf8\x03\xfc\x21\xfe\x08\x7f\x8c\x3f\xc1\x9f\xe2\xcf\xf0\xe7\xf8\x0b\xfc\x25\xfe\x0a\x7f\x8d\xbf\xc1\xdf\xe2\xef\xf0\xf7\xf8\x07\xfc\x23\xfe\x09\xff\x8c\x7f\xc1\xbf\xe2\xdf\xf0\xef\xf8\x0f\xfc\x27\xfe\x0b\xff\x8d\xff\xc1\xff\xe2\xff\xf0\x38\x3c\x1e\x4f\xc0\x13\x89\x24\x44\x52\x22\x19\x91\x9c\x48\x41\xa4\x24\x52\x11\xa9\x89\x34\x44\x5a\x22\x1d\x91\x9e\xc8\x40\x64\x24\x32\x11\x99\x89\x2c\x44\x56\x22\x1b\x91\x9d\xc8\x41\xe4\x24\x72\x11\xb9\x89\x3c\x44\x5e\x22\x1f\x91\x9f\x28\x40\x14\x24\x0a\x11\x85\x89\x22\x44\x51\xa2\x18\x51\x9c\x28\x41\x94\x24\x4a\x11\xa5\x89\x32\x44\x59\xa2\x1c\x51\x9e\xa8\x40\x54\x24\x2a\x11\x95\x89\x2a\x44\x55\xa2\x1a\x51\x9d\xa8\x41\xd4\x24\x6a\x11\xb5\x89\x3a\x44\x5d\xa2\x1e\x51\x9f\x68\x40\x34\x24\x1a\x11\x8d\x89\x26\x44\x53\xa2\x19\xd1\x9c\x68\x41\xb4\x24\x5a\x11\xad\x89\x36\x44\x5b\xa2\x1d\xd1\x9e\xe8\x40\x74\x24\x3a\x11\x9d\x89\x2e\x44\x57\xa2\x1b\xd1\x9d\xe8\x41\xf4\x24\x7a\x11\xbd\x89\x3e\x44\x5f\xa2\x1f\x81\x11\x38\x41\x10\x24\x41\x11\x34\xc1\x10\x2c\xc1\x11\x3c\x21\x10\x22\x21\x11\x32\xa1\x10\x2a\xa1\x11\x3a\x61\x10\x26\x61\x11\x36\xe1\x10\x2e\xe1\x11\x3e\x11\x10\x21\x11\x11\x80\x80\x04\x22\x62\x44\x7f\x62\x00\x31\x90\x18\x44\x0c\x26\x86\x10\x43\x89\x61\xc4\x70\x62\x04\x31\x92\x18\x45\x8c\x26\xc6\x10\x63\x89\x71\xc4\x78\x62\x02\x31\x91\x98\x44\x4c\x26\xa6\x10\x53\x89\x69\xc4\x74\x62\x06\x31\x93\x98\x45\xcc\x26\xe6\x10\x73\x89\x79\xc4\x7c\x62\x01\xb1\x90\x58\x44\x2c\x26\x96\x10\x4b\x89\x65\xc4\x72\x62\x05\xb1\x92\x58\x45\xac\x26\xd6\x10\x6b\x89\x75\xc4\x7a\x62\x03\xb1\x91\xd8\x44\x6c\x26\xb6\x10\x5b\x89\x6d\xc4\x76\x62\x07\xb1\x93\xd8\x45\xec\x26\xf6\x10\x7b\x89\x7d\xc4\x7e\xe2\x00\x71\x90\x38\x44\x1c\x26\x8e\x10\x47\x89\x63\xc4\x71\xe2\x04\x71\x92\x38\x45\x9c\x26\xce\x10\x67\x89\x73\xc4\x79\xe2\x02\x71\x91\xb8\x44\x5c\x26\xae\x10\x57\x89\x6b\xc4\x75\xe2\x06\x71\x93\xb8\x45\xdc\x26\xee\x10\x77\x89\x7b\xc4\x7d\xe2\x01\xf1\x90\x78\x44\x3c\x26\x9e\x10\x4f\x89\x67\xc4\x73\xe2\x05\xf1\x92\x78\x45\xbc\x26\xde\x10\x6f\x89\x77\xc4\x7b\xe2\x03\xf1\x91\xf8\x44\x7c\x26\xbe\x10\x5f\x89\x6f\xc4\x77\xe2\x07\xf1\x93\xf8\x45\xfc\x26\xfe\x10\x7f\x89\x7f\x44\x1c\x11\x4f\x24\x10\x89\x64\x12\x32\x29\x99\x8c\x4c\x4e\xa6\x20\x53\x92\xa9\xc8\xd4\x64\x1a\x32\x2d\x99\x8e\x4c\x4f\x66\x20\x33\x92\x99\xc8\xcc\x64\x16\x32\x2b\x99\x8d\xcc\x4e\xe6\x20\x73\x92\xb9\xc8\xdc\x64\x1e\x32\x2f\x99\x8f\xcc\x4f\x16\x20\x0b\x92\x85\xc8\xc2\x64\x11\xb2\x28\x59\x8c\x2c\x4e\x96\x20\x4b\x92\xa5\xc8\xd2\x64\x19\xb2\x2c\x59\x8e\x2c\x4f\x56\x20\x2b\x92\x95\xc8\xca\x64\x15\xb2\x2a\x59\x8d\xac\x4e\xd6\x20\x6b\x92\xb5\xc8\xda\x64\x1d\xb2\x2e\x59\x8f\xac\x4f\x36\x20\x1b\x92\x8d\xc8\xc6\x64\x13\xb2\x29\xd9\x8c\x6c\x4e\xb6\x20\x5b\x92\xad\xc8\xd6\x64\x1b\xb2\x2d\xd9\x8e\x6c\x4f\x76\x20\x3b\x92\x9d\xc8\xce\x64\x17\xb2\x2b\xd9\x8d\xec\x4e\xf6\x20\x7b\x92\xbd\xc8\xde\x64\x1f\xb2\x2f\xd9\x8f\xc4\x48\x9c\x24\x48\x92\xa4\x48\x9a\x64\x48\x96\xe4\x48\x9e\x14\x48\x91\x94\x48\x99\x54\x48\x95\xd4\x48\x9d\x34\x48\x93\xb4\x48\x9b\x74\x48\x97\xf4\x48\x9f\x0c\xc8\x90\x8c\x48\x40\x42\x12\x91\x31\xb2\x3f\x39\x80\x1c\x48\x0e\x22\x07\x93\x43\xc8\xa1\xe4\x30\x72\x38\x39\x82\x1c\x49\x8e\x22\x47\x93\x63\xc8\xb1\xe4\x38\x72\x3c\x39\x81\x9c\x48\x4e\x22\x27\x93\x53\xc8\xa9\xe4\x34\x72\x3a\x39\x83\x9c\x49\xce\x22\x67\x93\x73\xc8\xb9\xe4\x3c\x72\x3e\xb9\x80\x5c\x48\x2e\x22\x17\x93\x4b\xc8\xa5\xe4\x32\x72\x39\xb9\x82\x5c\x49\xae\x22\x57\x93\x6b\xc8\xb5\xe4\x3a\x72\x3d\xb9\x81\xdc\x48\x6e\x22\x37\x93\x5b\xc8\xad\xe4\x36\x72\x3b\xb9\x83\xdc\x49\xee\x22\x77\x93\x7b\xc8\xbd\xe4\x3e\x72\x3f\x79\x80\x3c\x48\x1e\x22\x0f\x93\x47\xc8\xa3\xe4\x31\xf2\x38\x79\x82\x3c\x49\x9e\x22\x4f\x93\x67\xc8\xb3\xe4\x39\xf2\x3c\x79\x81\xbc\x48\x5e\x22\x2f\x93\x57\xc8\xab\xe4\x35\xf2\x3a\x79\x83\xbc\x49\xde\x22\x6f\x93\x77\xc8\xbb\xe4\x3d\xf2\x3e\xf9\x80\x7c\x48\x3e\x22\x1f\x93\x4f\xc8\xa7\xe4\x33\xf2\x39\xf9\x82\x7c\x49\xbe\x22\x5f\x93\x6f\xc8\xb7\xe4\x3b\xf2\x3d\xf9\x81\xfc\x48\x7e\x22\x3f\x93\x5f\xc8\xaf\xe4\x37\xf2\x3b\xf9\x83\xfc\x49\xfe\x22\x7f\x93\x7f\xc8\xbf\xe4\x3f\x32\x8e\x8c\x27\x13\xc8\x44\x2a\x09\x95\x94\x4a\x46\x25\xa7\x52\x50\x29\xa9\x54\x54\x6a\x2a\x0d\x95\x96\x4a\x47\xa5\xa7\x32\x50\x19\xa9\x4c\x54\x66\x2a\x0b\x95\x95\xca\x46\x65\xa7\x72\x50\x39\xa9\x5c\x54\x6e\x2a\x0f\x95\x97\xca\x47\xe5\xa7\x0a\x50\x05\xa9\x42\x54\x61\xaa\x08\x55\x94\x2a\x46\x15\xa7\x4a\x50\x25\xa9\x52\x54\x69\xaa\x0c\x55\x96\x2a\x47\x95\xa7\x2a\x50\x15\xa9\x4a\x54\x65\xaa\x0a\x55\x95\xaa\x46\x55\xa7\x6a\x50\x35\xa9\x5a\x54\x6d\xaa\x0e\x55\x97\xaa\x47\xd5\xa7\x1a\x50\x0d\xa9\x46\x54\x63\xaa\x09\xd5\x94\x6a\x46\x35\xa7\x5a\x50\x2d\xa9\x56\x54\x6b\xaa\x0d\xd5\x96\x6a\x47\xb5\xa7\x3a\x50\x1d\xa9\x4e\x54\x67\xaa\x0b\xd5\x95\xea\x46\x75\xa7\x7a\x50\x3d\xa9\x5e\x54\x6f\xaa\x0f\xd5\x97\xea\x47\x61\x14\x4e\x11\x14\x49\x51\x14\x4d\x31\x14\x4b\x71\x14\x4f\x09\x94\x48\x49\x94\x4c\x29\x94\x4a\x69\x94\x4e\x19\x94\x49\x59\x94\x4d\x39\x94\x4b\x79\x94\x4f\x05\x54\x48\x45\x14\xa0\x20\x85\xa8\x18\xd5\x9f\x1a\x40\x0d\xa4\x06\x51\x83\xa9\x21\xd4\x50\x6a\x18\x35\x9c\x1a\x41\x8d\xa4\x46\x51\xa3\xa9\x31\xd4\x58\x6a\x1c\x35\x9e\x9a\x40\x4d\xa4\x26\x51\x93\xa9\x29\xd4\x54\x6a\x1a\x35\x9d\x9a\x41\xcd\xa4\x66\x51\xb3\xa9\x39\xd4\x5c\x6a\x1e\x35\x9f\x5a\x40\x2d\xa4\x16\x51\x8b\xa9\x25\xd4\x52\x6a\x19\xb5\x9c\x5a\x41\xad\xa4\x56\x51\xab\xa9\x35\xd4\x5a\x6a\x1d\xb5\x9e\xda\x40\x6d\xa4\x36\x51\x9b\xa9\x2d\xd4\x56\x6a\x1b\xb5\x9d\xda\x41\xed\xa4\x76\x51\xbb\xa9\x3d\xd4\x5e\x6a\x1f\xb5\x9f\x3a\x40\x1d\xa4\x0e\x51\x87\xa9\x23\xd4\x51\xea\x18\x75\x9c\x3a\x41\x9d\xa4\x4e\x51\xa7\xa9\x33\xd4\x59\xea\x1c\x75\x9e\xba\x40\x5d\xa4\x2e\x51\x97\xa9\x2b\xd4\x55\xea\x1a\x75\x9d\xba\x41\xdd\xa4\x6e\x51\xb7\xa9\x3b\xd4\x5d\xea\x1e\x75\x9f\x7a\x40\x3d\xa4\x1e\x51\x8f\xa9\x27\xd4\x53\xea\x19\xf5\x9c\x7a\x41\xbd\xa4\x5e\x51\xaf\xa9\x37\xd4\x5b\xea\x1d\xf5\x9e\xfa\x40\x7d\xa4\x3e\x51\x9f\xa9\x2f\xd4\x57\xea\x1b\xf5\x9d\xfa\x41\xfd\xa4\x7e\x51\xbf\xa9\x3f\xd4\x5f\xea\x1f\x15\x47\xc5\x53\x09\x54\x22\x9d\x84\x4e\x4a\x27\xa3\x93\xd3\x29\xe8\x94\x74\x2a\x3a\x35\x9d\x86\x4e\x4b\xa7\xa3\xd3\xd3\x19\xe8\x8c\x74\x26\x3a\x33\x9d\x85\xce\x4a\x67\xa3\xb3\xd3\x39\xe8\x9c\x74\x2e\x3a\x37\x9d\x87\xce\x4b\xe7\xa3\xf3\xd3\x05\xe8\x82\x74\x21\xba\x30\x5d\x84\x2e\x4a\x17\xa3\x8b\xd3\x25\xe8\x92\x74\x29\xba\x34\x5d\x86\x2e\x4b\x97\xa3\xcb\xd3\x15\xe8\x8a\x74\x25\xba\x32\x5d\x85\xae\x4a\x57\xa3\xab\xd3\x35\xe8\x9a\x74\x2d\xba\x36\x5d\x87\xae\x4b\xd7\xa3\xeb\xd3\x0d\xe8\x86\x74\x23\xba\x31\xdd\x84\x6e\x4a\x37\xa3\x9b\xd3\x2d\xe8\x96\x74\x2b\xba\x35\xdd\x86\x6e\x4b\xb7\xa3\xdb\xd3\x1d\xe8\x8e\x74\x27\xba\x33\xdd\x85\xee\x4a\x77\xa3\xbb\xd3\x3d\xe8\x9e\x74\x2f\xba\x37\xdd\x87\xee\x4b\xf7\xa3\x31\x1a\xa7\x09\x9a\xa4\x29\x9a\xa6\x19\x9a\xa5\x39\x9a\xa7\x05\x5a\xa4\x25\x5a\xa6\x15\x5a\xa5\x35\x5a\xa7\x0d\xda\xa4\x2d\xda\xa6\x1d\xda\xa5\x3d\xda\xa7\x03\x3a\xa4\x23\x1a\xd0\x90\x46\x74\x8c\xee\x4f\x0f\xa0\x07\xd2\x83\xe8\xc1\xf4\x10\x7a\x28\x3d\x8c\x1e\x4e\x8f\xa0\x47\xd2\xa3\xe8\xd1\xf4\x18\x7a\x2c\x3d\x8e\x1e\x4f\x4f\xa0\x27\xd2\x93\xe8\xc9\xf4\x14\x7a\x2a\x3d\x8d\x9e\x4e\xcf\xa0\x67\xd2\xb3\xe8\xd9\xf4\x1c\x7a\x2e\x3d\x8f\x9e\x4f\x2f\xa0\x17\xd2\x8b\xe8\xc5\xf4\x12\x7a\x29\xbd\x8c\x5e\x4e\xaf\xa0\x57\xd2\xab\xe8\xd5\xf4\x1a\x7a\x2d\xbd\x8e\x5e\x4f\x6f\xa0\x37\xd2\x9b\xe8\xcd\xf4\x16\x7a\x2b\xbd\x8d\xde\x4e\xef\xa0\x77\xd2\xbb\xe8\xdd\xf4\x1e\x7a\x2f\xbd\x8f\xde\x4f\x1f\xa0\x0f\xd2\x87\xe8\xc3\xf4\x11\xfa\x28\x7d\x8c\x3e\x4e\x9f\xa0\x4f\xd2\xa7\xe8\xd3\xf4\x19\xfa\x2c\x7d\x8e\x3e\x4f\x5f\xa0\x2f\xd2\x97\xe8\xcb\xf4\x15\xfa\x2a\x7d\x8d\xbe\x4e\xdf\xa0\x6f\xd2\xb7\xe8\xdb\xf4\x1d\xfa\x2e\x7d\x8f\xbe\x4f\x3f\xa0\x1f\xd2\x8f\xe8\xc7\xf4\x13\xfa\x29\xfd\x8c\x7e\x4e\xbf\xa0\x5f\xd2\xaf\xe8\xd7\xf4\x1b\xfa\x2d\xfd\x8e\x7e\x4f\x7f\xa0\x3f\xd2\x9f\xe8\xcf\xf4\x17\xfa\x2b\xfd\x8d\xfe\x4e\xff\xa0\x7f\xd2\xbf\xe8\xdf\xf4\x1f\xfa\x2f\xfd\x8f\x8e\xa3\xe3\xe9\x04\x3a\x91\x49\xc2\x24\x65\x92\x31\xc9\x99\x14\x4c\x4a\x26\x15\x93\x9a\x49\xc3\xa4\x65\xd2\x31\xe9\x99\x0c\x4c\x46\x26\x13\x93\x99\xc9\xc2\x64\x65\xb2\x31\xd9\x99\x1c\x4c\x4e\x26\x17\x93\x9b\xc9\xc3\xe4\x65\xf2\x31\xf9\x99\x02\x4c\x41\xa6\x10\x53\x98\x29\xc2\x14\x65\x8a\x31\xc5\x99\x12\x4c\x49\xa6\x14\x53\x9a\x29\xc3\x94\x65\xca\x31\xe5\x99\x0a\x4c\x45\xa6\x12\x53\x99\xa9\xc2\x54\x65\xaa\x31\xd5\x99\x1a\x4c\x4d\xa6\x16\x53\x9b\xa9\xc3\xd4\x65\xea\x31\xf5\x99\x06\x4c\x43\xa6\x11\xd3\x98\x69\xc2\x34\x65\x9a\x31\xcd\x99\x16\x4c\x4b\xa6\x15\xd3\x9a\x69\xc3\xb4\x65\xda\x31\xed\x99\x0e\x4c\x47\xa6\x13\xd3\x99\xe9\xc2\x74\x65\xba\x31\xdd\x99\x1e\x4c\x4f\xa6\x17\xd3\x9b\xe9\xc3\xf4\x65\xfa\x31\x18\x83\x33\x04\x43\x32\x14\x43\x33\x0c\xc3\x32\x1c\xc3\x33\x02\x23\x32\x12\x23\x33\x0a\xa3\x32\x1a\xa3\x33\x06\x63\x32\x16\x63\x33\x0e\xe3\x32\x1e\xe3\x33\x01\x13\x32\x11\x03\x18\xc8\x20\x26\xc6\xf4\x67\x06\x30\x03\x99\x41\xcc\x60\x66\x08\x33\x94\x19\xc6\x0c\x67\x46\x30\x23\x99\x51\xcc\x68\x66\x0c\x33\x96\x19\xc7\x8c\x67\x26\x30\x13\x99\x49\xcc\x64\x66\x0a\x33\x95\x99\xc6\x4c\x67\x66\x30\x33\x99\x59\xcc\x6c\x66\x0e\x33\x97\x99\xc7\xcc\x67\x16\x30\x0b\x99\x45\xcc\x62\x66\x09\xb3\x94\x59\xc6\x2c\x67\x56\x30\x2b\x99\x55\xcc\x6a\x66\x0d\xb3\x96\x59\xc7\xac\x67\x36\x30\x1b\x99\x4d\xcc\x66\x66\x0b\xb3\x95\xd9\xc6\x6c\x67\x76\x30\x3b\x99\x5d\xcc\x6e\x66\x0f\xb3\x97\xd9\xc7\xec\x67\x0e\x30\x07\x99\x43\xcc\x61\xe6\x08\x73\x94\x39\xc6\x1c\x67\x4e\x30\x27\x99\x53\xcc\x69\xe6\x0c\x73\x96\x39\xc7\x9c\x67\x2e\x30\x17\x99\x4b\xcc\x65\xe6\x0a\x73\x95\xb9\xc6\x5c\x67\x6e\x30\x37\x99\x5b\xcc\x6d\xe6\x0e\x73\x97\xb9\xc7\xdc\x67\x1e\x30\x0f\x99\x47\xcc\x63\xe6\x09\xf3\x94\x79\xc6\x3c\x67\x5e\x30\x2f\x99\x57\xcc\x6b\xe6\x0d\xf3\x96\x79\xc7\xbc\x67\x3e\x30\x1f\x99\x4f\xcc\x67\xe6\x0b\xf3\x95\xf9\xc6\x7c\x67\x7e\x30\x3f\x99\x5f\xcc\x6f\xe6\x0f\xf3\x97\xf9\xc7\xc4\x31\xf1\x4c\x02\x93\xc8\x26\x61\x93\xb2\xc9\xd8\xe4\x6c\x0a\x36\x25\x9b\x8a\x4d\xcd\xa6\x61\xd3\xb2\xe9\xd8\xf4\x6c\x06\x36\x23\x9b\x89\xcd\xcc\x66\x61\xb3\xb2\xd9\xd8\xec\x6c\x0e\x36\x27\x9b\x8b\xcd\xcd\xe6\x61\xf3\xb2\xf9\xd8\xfc\x6c\x01\xb6\x20\x5b\x88\x2d\xcc\x16\x61\x8b\xb2\xc5\xd8\xe2\x6c\x09\xb6\x24\x5b\x8a\x2d\xcd\x96\x61\xcb\xb2\xe5\xd8\xf2\x6c\x05\xb6\x22\x5b\x89\xad\xcc\x56\x61\xab\xb2\xd5\xd8\xea\x6c\x0d\xb6\x26\x5b\x8b\xad\xcd\xd6\x61\xeb\xb2\xf5\xd8\xfa\x6c\x03\xb6\x21\xdb\x88\x6d\xcc\x36\x61\x9b\xb2\xcd\xd8\xe6\x6c\x0b\xb6\x25\xdb\x8a\x6d\xcd\xb6\x61\xdb\xb2\xed\xd8\xf6\x6c\x07\xb6\x23\xdb\x89\xed\xcc\x76\x61\xbb\xb2\xdd\xd8\xee\x6c\x0f\xb6\x27\xdb\x8b\xed\xcd\xf6\x61\xfb\xb2\xfd\x58\x8c\xc5\x59\x82\x25\x59\x8a\xa5\x59\x86\x65\x59\x8e\xe5\x59\x81\x15\x59\x89\x95\x59\x85\x55\x59\x8d\xd5\x59\x83\x35\x59\x8b\xb5\x59\x87\x75\x59\x8f\xf5\xd9\x80\x0d\xd9\x88\x05\x2c\x64\x11\x1b\x63\xfb\xb3\x03\xd8\x81\xec\x20\x76\x30\x3b\x84\x1d\xca\x0e\x63\x87\xb3\x23\xd8\x91\xec\x28\x76\x34\x3b\x86\x1d\xcb\x8e\x63\xc7\xb3\x13\xd8\x89\xec\x24\x76\x32\x3b\x85\x9d\xca\x4e\x63\xa7\xb3\x33\xd8\x99\xec\x2c\x76\x36\x3b\x87\x9d\xcb\xce\x63\xe7\xb3\x0b\xd8\x85\xec\x22\x76\x31\xbb\x84\x5d\xca\x2e\x63\x97\xb3\x2b\xd8\x95\xec\x2a\x76\x35\xbb\x86\x5d\xcb\xae\x63\xd7\xb3\x1b\xd8\x8d\xec\x26\x76\x33\xbb\x85\xdd\xca\x6e\x63\xb7\xb3\x3b\xd8\x9d\xec\x2e\x76\x37\xbb\x87\xdd\xcb\xee\x63\xf7\xb3\x07\xd8\x83\xec\x21\xf6\x30\x7b\x84\x3d\xca\x1e\x63\x8f\xb3\x27\xd8\x93\xec\x29\xf6\x34\x7b\x86\x3d\xcb\x9e\x63\xcf\xb3\x17\xd8\x8b\xec\x25\xf6\x32\x7b\x85\xbd\xca\x5e\x63\xaf\xb3\x37\xd8\x9b\xec\x2d\xf6\x36\x7b\x87\xbd\xcb\xde\x63\xef\xb3\x0f\xd8\x87\xec\x23\xf6\x31\xfb\x84\x7d\xca\x3e\x63\x9f\xb3\x2f\xd8\x97\xec\x2b\xf6\x35\xfb\x86\x7d\xcb\xbe\x63\xdf\xb3\x1f\xd8\x8f\xec\x27\xf6\x33\xfb\x85\xfd\xca\x7e\x63\xbf\xb3\x3f\xd8\x9f\xec\x2f\xf6\x37\xfb\x87\xfd\xcb\xfe\x63\xe3\xd8\x78\x36\x81\x4d\xe4\x92\x70\x49\xb9\x64\x5c\x72\x2e\x05\x97\x92\x4b\xc5\xa5\xe6\xd2\x70\x69\xb9\x74\x5c\x7a\x2e\x03\x97\x91\xcb\xc4\x65\xe6\xb2\x70\x59\xb9\x6c\x5c\x76\x2e\x07\x97\x93\xcb\xc5\xe5\xe6\xf2\x70\x79\xb9\x7c\x5c\x7e\xae\x00\x57\x90\x2b\xc4\x15\xe6\x8a\x70\x45\xb9\x62\x5c\x71\xae\x04\x57\x92\x2b\xc5\x95\xe6\xca\x70\x65\xb9\x72\x5c\x79\xae\x02\x57\x91\xab\xc4\x55\xe6\xaa\x70\x55\xb9\x6a\x5c\x75\xae\x06\x57\x93\xab\xc5\xd5\xe6\xea\x70\x75\xb9\x7a\x5c\x7d\xae\x01\xd7\x90\x6b\xc4\x35\xe6\x9a\x70\x4d\xb9\x66\x5c\x73\xae\x05\xd7\x92\x6b\xc5\xb5\xe6\xda\x70\x6d\xb9\x76\x5c\x7b\xae\x03\xd7\x91\xeb\xc4\x75\xe6\xba\x70\x5d\xb9\x6e\x5c\x77\xae\x07\xd7\x93\xeb\xc5\xf5\xe6\xfa\x70\x7d\xb9\x7e\x1c\xc6\xe1\x1c\xc1\x91\x1c\xc5\xd1\x1c\xc3\xb1\x1c\xc7\xf1\x9c\xc0\x89\x9c\xc4\xc9\x9c\xc2\xa9\x9c\xc6\xe9\x9c\xc1\x99\x9c\xc5\xd9\x9c\xc3\xb9\x9c\xc7\xf9\x5c\xc0\x85\x5c\xc4\x01\x0e\x72\x88\x8b\x71\xfd\xb9\x01\xdc\x40\x6e\x10\x37\x98\x1b\xc2\x0d\xe5\x86\x71\xc3\xb9\x11\xdc\x48\x6e\x14\x37\x9a\x1b\xc3\x8d\xe5\xc6\x71\xe3\xb9\x09\xdc\x44\x6e\x12\x37\x99\x9b\xc2\x4d\xe5\xa6\x71\xd3\xb9\x19\xdc\x4c\x6e\x16\x37\x9b\x9b\xc3\xcd\xe5\xe6\x71\xf3\xb9\x05\xdc\x42\x6e\x11\xb7\x98\x5b\xc2\x2d\xe5\x96\x71\xcb\xb9\x15\xdc\x4a\x6e\x15\xb7\x9a\x5b\xc3\xad\xe5\xd6\x71\xeb\xb9\x0d\xdc\x46\x6e\x13\xb7\x99\xdb\xc2\x6d\xe5\xb6\x71\xdb\xb9\x1d\xdc\x4e\x6e\x17\xb7\x9b\xdb\xc3\xed\xe5\xf6\x71\xfb\xb9\x03\xdc\x41\xee\x10\x77\x98\x3b\xc2\x1d\xe5\x8e\x71\xc7\xb9\x13\xdc\x49\xee\x14\x77\x9a\x3b\xc3\x9d\xe5\xce\x71\xe7\xb9\x0b\xdc\x45\xee\x12\x77\x99\xbb\xc2\x5d\xe5\xae\x71\xd7\xb9\x1b\xdc\x4d\xee\x16\x77\x9b\xbb\xc3\xdd\xe5\xee\x71\xf7\xb9\x07\xdc\x43\xee\x11\xf7\x98\x7b\xc2\x3d\xe5\x9e\x71\xcf\xb9\x17\xdc\x4b\xee\x15\xf7\x9a\x7b\xc3\xbd\xe5\xde\x71\xef\xb9\x0f\xdc\x47\xee\x13\xf7\x99\xfb\xc2\x7d\xe5\xbe\x71\xdf\xb9\x1f\xdc\x4f\xee\x17\xf7\x9b\xfb\xc3\xfd\xe5\xfe\x71\x71\x5c\x3c\x97\xc0\x25\xf2\x49\xf8\xa4\x7c\x32\x3e\x39\x9f\x82\x4f\xc9\xa7\xe2\x53\xf3\x69\xf8\xb4\x7c\x3a\x3e\x3d\x9f\x81\xcf\xc8\x67\xe2\x33\xf3\x59\xf8\xac\x7c\x36\x3e\x3b\x9f\x83\xcf\xc9\xe7\xe2\x73\xf3\x79\xf8\xbc\x7c\x3e\x3e\x3f\x5f\x80\x2f\xc8\x17\xe2\x0b\xf3\x45\xf8\xa2\x7c\x31\xbe\x38\x5f\x82\x2f\xc9\x97\xe2\x4b\xf3\x65\xf8\xb2\x7c\x39\xbe\x3c\x5f\x81\xaf\xc8\x57\xe2\x2b\xf3\x55\xf8\xaa\x7c\x35\xbe\x3a\x5f\x83\xaf\xc9\xd7\xe2\x6b\xf3\x75\xf8\xba\x7c\x3d\xbe\x3e\xdf\x80\x6f\xc8\x37\xe2\x1b\xf3\x4d\xf8\xa6\x7c\x33\xbe\x39\xdf\x82\x6f\xc9\xb7\xe2\x5b\xf3\x6d\xf8\xb6\x7c\x3b\xbe\x3d\xdf\x81\xef\xc8\x77\xe2\x3b\xf3\x5d\xf8\xae\x7c\x37\xbe\x3b\xdf\x83\xef\xc9\xf7\xe2\x7b\xf3\x7d\xf8\xbe\x7c\x3f\x1e\xe3\x71\x9e\xe0\x49\x9e\xe2\x69\x9e\xe1\x59\x9e\xe3\x79\x5e\xe0\x45\x5e\xe2\x65\x5e\xe1\x55\x5e\xe3\x75\xde\xe0\x4d\xde\xe2\x6d\xde\xe1\x5d\xde\xe3\x7d\x3e\xe0\x43\x3e\xe2\x01\x0f\x79\xc4\xc7\xf8\xfe\xfc\x00\x7e\x20\x3f\x88\x1f\xcc\x0f\xe1\x87\xf2\xc3\xf8\xe1\xfc\x08\x7e\x24\x3f\x8a\x1f\xcd\x8f\xe1\xc7\xf2\xe3\xf8\xf1\xfc\x04\x7e\x22\x3f\x89\x9f\xcc\x4f\xe1\xa7\xf2\xd3\xf8\xe9\xfc\x0c\x7e\x26\x3f\x8b\x9f\xcd\xcf\xe1\xe7\xf2\xf3\xf8\xf9\xfc\x02\x7e\x21\xbf\x88\x5f\xcc\x2f\xe1\x97\xf2\xcb\xf8\xe5\xfc\x0a\x7e\x25\xbf\x8a\x5f\xcd\xaf\xe1\xd7\xf2\xeb\xf8\xf5\xfc\x06\x7e\x23\xbf\x89\xdf\xcc\x6f\xe1\xb7\xf2\xdb\xf8\xed\xfc\x0e\x7e\x27\xbf\x8b\xdf\xcd\xef\xe1\xf7\xf2\xfb\xf8\xfd\xfc\x01\xfe\x20\x7f\x88\x3f\xcc\x1f\xe1\x8f\xf2\xc7\xf8\xe3\xfc\x09\xfe\x24\x7f\x8a\x3f\xcd\x9f\xe1\xcf\xf2\xe7\xf8\xf3\xfc\x05\xfe\x22\x7f\x89\xbf\xcc\x5f\xe1\xaf\xf2\xd7\xf8\xeb\xfc\x0d\xfe\x26\x7f\x8b\xbf\xcd\xdf\xe1\xef\xf2\xf7\xf8\xfb\xfc\x03\xfe\x21\xff\x88\x7f\xcc\x3f\xe1\x9f\xf2\xcf\xf8\xe7\xfc\x0b\xfe\x25\xff\x8a\x7f\xcd\xbf\xe1\xdf\xf2\xef\xf8\xf7\xfc\x07\xfe\x23\xff\x89\xff\xcc\x7f\xe1\xbf\xf2\xdf\xf8\xef\xfc\x0f\xfe\x27\xff\x8b\xff\xcd\xff\xe1\xff\xf2\xff\xf8\x38\x3e\x9e\x4f\xe0\x13\x85\x24\x42\x52\x21\x99\x90\x5c\x48\x21\xa4\x14\x52\x09\xa9\x85\x34\x42\x5a\x21\x9d\x90\x5e\xc8\x20\x64\x14\x32\x09\x99\x85\x2c\x42\x56\x21\x9b\x90\x5d\xc8\x21\xe4\x14\x72\x09\xb9\x85\x3c\x42\x5e\x21\x9f\x90\x5f\x28\x20\x14\x14\x0a\x09\x85\x85\x22\x42\x51\xa1\x98\x50\x5c\x28\x21\x94\x14\x4a\x09\xa5\x85\x32\x42\x59\xa1\x9c\x50\x5e\xa8\x20\x54\x14\x2a\x09\x95\x85\x2a\x42\x55\xa1\x9a\x50\x5d\xa8\x21\xd4\x14\x6a\x09\xb5\x85\x3a\x42\x5d\xa1\x9e\x50\x5f\x68\x20\x34\x14\x1a\x09\x8d\x85\x26\x42\x53\xa1\x99\xd0\x5c\x68\x21\xb4\x14\x5a\x09\xad\x85\x36\x42\x5b\xa1\x9d\xd0\x5e\xe8\x20\x74\x14\x3a\x09\x9d\x85\x2e\x42\x57\xa1\x9b\xd0\x5d\xe8\x21\xf4\x14\x7a\x09\xbd\x85\x3e\x42\x5f\xa1\x9f\x80\x09\xb8\x40\x08\xa4\x40\x09\xb4\xc0\x08\xac\xc0\x09\xbc\x20\x08\xa2\x20\x09\xb2\xa0\x08\xaa\xa0\x09\xba\x60\x08\xa6\x60\x09\xb6\xe0\x08\xae\xe0\x09\xbe\x10\x08\xa1\x10\x09\x40\x80\x02\x12\x62\x42\x7f\x61\x80\x30\x50\x18\x24\x0c\x16\x86\x08\x43\x85\x61\xc2\x70\x61\x84\x30\x52\x18\x25\x8c\x16\xc6\x08\x63\x85\x71\xc2\x78\x61\x82\x30\x51\x98\x24\x4c\x16\xa6\x08\x53\x85\x69\xc2\x74\x61\x86\x30\x53\x98\x25\xcc\x16\xe6\x08\x73\x85\x79\xc2\x7c\x61\x81\xb0\x50\x58\x24\x2c\x16\x96\x08\x4b\x85\x65\xc2\x72\x61\x85\xb0\x52\x58\x25\xac\x16\xd6\x08\x6b\x85\x75\xc2\x7a\x61\x83\xb0\x51\xd8\x24\x6c\x16\xb6\x08\x5b\x85\x6d\xc2\x76\x61\x87\xb0\x53\xd8\x25\xec\x16\xf6\x08\x7b\x85\x7d\xc2\x7e\xe1\x80\x70\x50\x38\x24\x1c\x16\x8e\x08\x47\x85\x63\xc2\x71\xe1\x84\x70\x52\x38\x25\x9c\x16\xce\x08\x67\x85\x73\xc2\x79\xe1\x82\x70\x51\xb8\x24\x5c\x16\xae\x08\x57\x85\x6b\xc2\x75\xe1\x86\x70\x53\xb8\x25\xdc\x16\xee\x08\x77\x85\x7b\xc2\x7d\xe1\x81\xf0\x50\x78\x24\x3c\x16\x9e\x08\x4f\x85\x67\xc2\x73\xe1\x85\xf0\x52\x78\x25\xbc\x16\xde\x08\x6f\x85\x77\xc2\x7b\xe1\x83\xf0\x51\xf8\x24\x7c\x16\xbe\x08\x5f\x85\x6f\xc2\x77\xe1\x87\xf0\x53\xf8\x25\xfc\x16\xfe\x08\x7f\x85\x7f\x42\x9c\x10\x2f\x24\x08\x89\x62\x12\x31\xa9\x98\x4c\x4c\x2e\xa6\x10\x53\x8a\xa9\xc4\xd4\x62\x1a\x31\xad\x98\x4e\x4c\x2f\x66\x10\x33\x8a\x99\xc4\xcc\x62\x16\x31\xab\x98\x4d\xcc\x2e\xe6\x10\x73\x8a\xb9\xc4\xdc\x62\x1e\x31\xaf\x98\x4f\xcc\x2f\x16\x10\x0b\x8a\x85\xc4\xc2\x62\x11\xb1\xa8\x58\x4c\x2c\x2e\x96\x10\x4b\x8a\xa5\xc4\xd2\x62\x19\xb1\xac\x58\x4e\x2c\x2f\x56\x10\x2b\x8a\x95\xc4\xca\x62\x15\xb1\xaa\x58\x4d\xac\x2e\xd6\x10\x6b\x8a\xb5\xc4\xda\x62\x1d\xb1\xae\x58\x4f\xac\x2f\x36\x10\x1b\x8a\x8d\xc4\xc6\x62\x13\xb1\xa9\xd8\x4c\x6c\x2e\xb6\x10\x5b\x8a\xad\xc4\xd6\x62\x1b\xb1\xad\xd8\x4e\x6c\x2f\x76\x10\x3b\x8a\x9d\xc4\xce\x62\x17\xb1\xab\xd8\x4d\xec\x2e\xf6\x10\x7b\x8a\xbd\xc4\xde\x62\x1f\xb1\xaf\xd8\x4f\xc4\x44\x5c\x24\x44\x52\xa4\x44\x5a\x64\x44\x56\xe4\x44\x5e\x14\x44\x51\x94\x44\x59\x54\x44\x55\xd4\x44\x5d\x34\x44\x53\xb4\x44\x5b\x74\x44\x57\xf4\x44\x5f\x0c\xc4\x50\x8c\x44\x20\x42\x11\x89\x31\xb1\xbf\x38\x40\x1c\x28\x0e\x12\x07\x8b\x43\xc4\xa1\xe2\x30\x71\xb8\x38\x42\x1c\x29\x8e\x12\x47\x8b\x63\xc4\xb1\xe2\x38\x71\xbc\x38\x41\x9c\x28\x4e\x12\x27\x8b\x53\xc4\xa9\xe2\x34\x71\xba\x38\x43\x9c\x29\xce\x12\x67\x8b\x73\xc4\xb9\xe2\x3c\x71\xbe\xb8\x40\x5c\x28\x2e\x12\x17\x8b\x4b\xc4\xa5\xe2\x32\x71\xb9\xb8\x42\x5c\x29\xae\x12\x57\x8b\x6b\xc4\xb5\xe2\x3a\x71\xbd\xb8\x41\xdc\x28\x6e\x12\x37\x8b\x5b\xc4\xad\xe2\x36\x71\xbb\xb8\x43\xdc\x29\xee\x12\x77\x8b\x7b\xc4\xbd\xe2\x3e\x71\xbf\x78\x40\x3c\x28\x1e\x12\x0f\x8b\x47\xc4\xa3\xe2\x31\xf1\xb8\x78\x42\x3c\x29\x9e\x12\x4f\x8b\x67\xc4\xb3\xe2\x39\xf1\xbc\x78\x41\xbc\x28\x5e\x12\x2f\x8b\x57\xc4\xab\xe2\x35\xf1\xba\x78\x43\xbc\x29\xde\x12\x6f\x8b\x77\xc4\xbb\xe2\x3d\xf1\xbe\xf8\x40\x7c\x28\x3e\x12\x1f\x8b\x4f\xc4\xa7\xe2\x33\xf1\xb9\xf8\x42\x7c\x29\xbe\x12\x5f\x8b\x6f\xc4\xb7\xe2\x3b\xf1\xbd\xf8\x41\xfc\x28\x7e\x12\x3f\x8b\x5f\xc4\xaf\xe2\x37\xf1\xbb\xf8\x43\xfc\x29\xfe\x12\x7f\x8b\x7f\xc4\xbf\xe2\x3f\x31\x4e\x8c\x17\x13\xc4\x44\x29\x89\x94\x54\x4a\x26\x25\x97\x52\x48\x29\xa5\x54\x52\x6a\x29\x8d\x94\x56\x4a\x27\xa5\x97\x32\x48\x19\xa5\x4c\x52\x66\x29\x8b\x94\x55\xca\x26\x65\x97\x72\x48\x39\xa5\x5c\x52\x6e\x29\x8f\x94\x57\xca\x27\xe5\x97\x0a\x48\x05\xa5\x42\x52\x61\xa9\x88\x54\x54\x2a\x26\x15\x97\x4a\x48\x25\xa5\x52\x52\x69\xa9\x8c\x54\x56\x2a\x27\x95\x97\x2a\x48\x15\xa5\x4a\x52\x65\xa9\x8a\x54\x55\xaa\x26\x55\x97\x6a\x48\x35\xa5\x5a\x52\x6d\xa9\x8e\x54\x57\xaa\x27\xd5\x97\x1a\x48\x0d\xa5\x46\x52\x63\xa9\x89\xd4\x54\x6a\x26\x35\x97\x5a\x48\x2d\xa5\x56\x52\x6b\xa9\x8d\xd4\x56\x6a\x27\xb5\x97\x3a\x48\x1d\xa5\x4e\x52\x67\xa9\x8b\xd4\x55\xea\x26\x75\x97\x7a\x48\x3d\xa5\x5e\x52\x6f\xa9\x8f\xd4\x57\xea\x27\x61\x12\x2e\x11\x12\x29\x51\x12\x2d\x31\x12\x2b\x71\x12\x2f\x09\x92\x28\x49\x92\x2c\x29\x92\x2a\x69\x92\x2e\x19\x92\x29\x59\x92\x2d\x39\x92\x2b\x79\x92\x2f\x05\x52\x28\x45\x12\x90\xa0\x84\xa4\x98\xd4\x5f\x1a\x20\x0d\x94\x06\x49\x83\xa5\x21\xd2\x50\x69\x98\x34\x5c\x1a\x21\x8d\x94\x46\x49\xa3\xa5\x31\xd2\x58\x69\x9c\x34\x5e\x9a\x20\x4d\x94\x26\x49\x93\xa5\x29\xd2\x54\x69\x9a\x34\x5d\x9a\x21\xcd\x94\x66\x49\xb3\xa5\x39\xd2\x5c\x69\x9e\x34\x5f\x5a\x20\x2d\x94\x16\x49\x8b\xa5\x25\xd2\x52\x69\x99\xb4\x5c\x5a\x21\xad\x94\x56\x49\xab\xa5\x35\xd2\x5a\x69\x9d\xb4\x5e\xda\x20\x6d\x94\x36\x49\x9b\xa5\x2d\xd2\x56\x69\x9b\xb4\x5d\xda\x21\xed\x94\x76\x49\xbb\xa5\x3d\xd2\x5e\x69\x9f\xb4\x5f\x3a\x20\x1d\x94\x0e\x49\x87\xa5\x23\xd2\x51\xe9\x98\x74\x5c\x3a\x21\x9d\x94\x4e\x49\xa7\xa5\x33\xd2\x59\xe9\x9c\x74\x5e\xba\x20\x5d\x94\x2e\x49\x97\xa5\x2b\xd2\x55\xe9\x9a\x74\x5d\xba\x21\xdd\x94\x6e\x49\xb7\xa5\x3b\xd2\x5d\xe9\x9e\x74\x5f\x7a\x20\x3d\x94\x1e\x49\x8f\xa5\x27\xd2\x53\xe9\x99\xf4\x5c\x7a\x21\xbd\x94\x5e\x49\xaf\xa5\x37\xd2\x5b\xe9\x9d\xf4\x5e\xfa\x20\x7d\x94\x3e\x49\x9f\xa5\x2f\xd2\x57\xe9\x9b\xf4\x5d\xfa\x21\xfd\x94\x7e\x49\xbf\xa5\x3f\xd2\x5f\xe9\x9f\x14\x27\xc5\x4b\x09\x52\xa2\x9c\x44\x4e\x2a\x27\x93\x93\xcb\x29\xe4\x94\x72\x2a\x39\xb5\x9c\x46\x4e\x2b\xa7\x93\xd3\xcb\x19\xe4\x8c\x72\x26\x39\xb3\x9c\x45\xce\x2a\x67\x93\xb3\xcb\x39\xe4\x9c\x72\x2e\x39\xb7\x9c\x47\xce\x2b\xe7\x93\xf3\xcb\x05\xe4\x82\x72\x21\xb9\xb0\x5c\x44\x2e\x2a\x17\x93\x8b\xcb\x25\xe4\x92\x72\x29\xb9\xb4\x5c\x46\x2e\x2b\x97\x93\xcb\xcb\x15\xe4\x8a\x72\x25\xb9\xb2\x5c\x45\xae\x2a\x57\x93\xab\xcb\x35\xe4\x9a\x72\x2d\xb9\xb6\x5c\x47\xae\x2b\xd7\x93\xeb\xcb\x0d\xe4\x86\x72\x23\xb9\xb1\xdc\x44\x6e\x2a\x37\x93\x9b\xcb\x2d\xe4\x96\x72\x2b\xb9\xb5\xdc\x46\x6e\x2b\xb7\x93\xdb\xcb\x1d\xe4\x8e\x72\x27\xb9\xb3\xdc\x45\xee\x2a\x77\x93\xbb\xcb\x3d\xe4\x9e\x72\x2f\xb9\xb7\xdc\x47\xee\x2b\xf7\x93\x31\x19\x97\x09\x99\x94\x29\x99\x96\x19\x99\x95\x39\x99\x97\x05\x59\x94\x25\x59\x96\x15\x59\x95\x35\x59\x97\x0d\xd9\x94\x2d\xd9\x96\x1d\xd9\x95\x3d\xd9\x97\x03\x39\x94\x23\x19\xc8\x50\x46\x72\x4c\xee\x2f\x0f\x90\x07\xca\x83\xe4\xc1\xf2\x10\x79\xa8\x3c\x4c\x1e\x2e\x8f\x90\x47\xca\xa3\xe4\xd1\xf2\x18\x79\xac\x3c\x4e\x1e\x2f\x4f\x90\x27\xca\x93\xe4\xc9\xf2\x14\x79\xaa\x3c\x4d\x9e\x2e\xcf\x90\x67\xca\xb3\xe4\xd9\xf2\x1c\x79\xae\x3c\x4f\x9e\x2f\x2f\x90\x17\xca\x8b\xe4\xc5\xf2\x12\x79\xa9\xbc\x4c\x5e\x2e\xaf\x90\x57\xca\xab\xe4\xd5\xf2\x1a\x79\xad\xbc\x4e\x5e\x2f\x6f\x90\x37\xca\x9b\xe4\xcd\xf2\x16\x79\xab\xbc\x4d\xde\x2e\xef\x90\x77\xca\xbb\xe4\xdd\xf2\x1e\x79\xaf\xbc\x4f\xde\x2f\x1f\x90\x0f\xca\x87\xe4\xc3\xf2\x11\xf9\xa8\x7c\x4c\x3e\x2e\x9f\x90\x4f\xca\xa7\xe4\xd3\xf2\x19\xf9\xac\x7c\x4e\x3e\x2f\x5f\x90\x2f\xca\x97\xe4\xcb\xf2\x15\xf9\xaa\x7c\x4d\xbe\x2e\xdf\x90\x6f\xca\xb7\xe4\xdb\xf2\x1d\xf9\xae\x7c\x4f\xbe\x2f\x3f\x90\x1f\xca\x8f\xe4\xc7\xf2\x13\xf9\xa9\xfc\x4c\x7e\x2e\xbf\x90\x5f\xca\xaf\xe4\xd7\xf2\x1b\xf9\xad\xfc\x4e\x7e\x2f\x7f\x90\x3f\xca\x9f\xe4\xcf\xf2\x17\xf9\xab\xfc\x4d\xfe\x2e\xff\x90\x7f\xca\xbf\xe4\xdf\xf2\x1f\xf9\xaf\xfc\x4f\x8e\x93\xe3\xe5\x04\x39\x51\x49\xa2\x24\x55\x92\x29\xc9\x95\x14\x4a\x4a\x25\x95\x92\x5a\x49\xa3\xa4\x55\xd2\x29\xe9\x95\x0c\x4a\x46\x25\x93\x92\x59\xc9\xa2\x64\x55\xb2\x29\xd9\x95\x1c\x4a\x4e\x25\x97\x92\x5b\xc9\xa3\xe4\x55\xf2\x29\xf9\x95\x02\x4a\x41\xa5\x90\x52\x58\x29\xa2\x14\x55\x8a\x29\xc5\x95\x12\x4a\x49\xa5\x94\x52\x5a\x29\xa3\x94\x55\xca\x29\xe5\x95\x0a\x4a\x45\xa5\x92\x52\x59\xa9\xa2\x54\x55\xaa\x29\xd5\x95\x1a\x4a\x4d\xa5\x96\x52\x5b\xa9\xa3\xd4\x55\xea\x29\xf5\x95\x06\x4a\x43\xa5\x91\xd2\x58\x69\xa2\x34\x55\x9a\x29\xcd\x95\x16\x4a\x4b\xa5\x95\xd2\x5a\x69\xa3\xb4\x55\xda\x29\xed\x95\x0e\x4a\x47\xa5\x93\xd2\x59\xe9\xa2\x74\x55\xba\x29\xdd\x95\x1e\x4a\x4f\xa5\x97\xd2\x5b\xe9\xa3\xf4\x55\xfa\x29\x98\x82\x2b\x84\x42\x2a\x94\x42\x2b\x8c\xc2\x2a\x9c\xc2\x2b\x82\x22\x2a\x92\x22\x2b\x8a\xa2\x2a\x9a\xa2\x2b\x86\x62\x2a\x96\x62\x2b\x8e\xe2\x2a\x9e\xe2\x2b\x81\x12\x2a\x91\x02\x14\xa8\x20\x25\xa6\xf4\x57\x06\x28\x03\x95\x41\xca\x60\x65\x88\x32\x54\x19\xa6\x0c\x57\x46\x28\x23\x95\x51\xca\x68\x65\x8c\x32\x56\x19\xa7\x8c\x57\x26\x28\x13\x95\x49\xca\x64\x65\x8a\x32\x55\x99\xa6\x4c\x57\x66\x28\x33\x95\x59\xca\x6c\x65\x8e\x32\x57\x99\xa7\xcc\x57\x16\x28\x0b\x95\x45\xca\x62\x65\x89\xb2\x54\x59\xa6\x2c\x57\x56\x28\x2b\x95\x55\xca\x6a\x65\x8d\xb2\x56\x59\xa7\xac\x57\x36\x28\x1b\x95\x4d\xca\x66\x65\x8b\xb2\x55\xd9\xa6\x6c\x57\x76\x28\x3b\x95\x5d\xca\x6e\x65\x8f\xb2\x57\xd9\xa7\xec\x57\x0e\x28\x07\x95\x43\xca\x61\xe5\x88\x72\x54\x39\xa6\x1c\x57\x4e\x28\x27\x95\x53\xca\x69\xe5\x8c\x72\x56\x39\xa7\x9c\x57\x2e\x28\x17\x95\x4b\xca\x65\xe5\x8a\x72\x55\xb9\xa6\x5c\x57\x6e\x28\x37\x95\x5b\xca\x6d\xe5\x8e\x72\x57\xb9\xa7\xdc\x57\x1e\x28\x0f\x95\x47\xca\x63\xe5\x89\xf2\x54\x79\xa6\x3c\x57\x5e\x28\x2f\x95\x57\xca\x6b\xe5\x8d\xf2\x56\x79\xa7\xbc\x57\x3e\x28\x1f\x95\x4f\xca\x67\xe5\x8b\xf2\x55\xf9\xa6\x7c\x57\x7e\x28\x3f\x95\x5f\xca\x6f\xe5\x8f\xf2\x57\xf9\xa7\xc4\x29\xf1\x4a\x82\x92\xa8\x26\x51\x93\xaa\xc9\xd4\xe4\x6a\x0a\x35\xa5\x9a\x4a\x4d\xad\xa6\x51\xd3\xaa\xe9\xd4\xf4\x6a\x06\x35\xa3\x9a\x49\xcd\xac\x66\x51\xb3\xaa\xd9\xd4\xec\x6a\x0e\x35\xa7\x9a\x4b\xcd\xad\xe6\x51\xf3\xaa\xf9\xd4\xfc\x6a\x01\xb5\xa0\x5a\x48\x2d\xac\x16\x51\x8b\xaa\xc5\xd4\xe2\x6a\x09\xb5\xa4\x5a\x4a\x2d\xad\x96\x51\xcb\xaa\xe5\xd4\xf2\x6a\x05\xb5\xa2\x5a\x49\xad\xac\x56\x51\xab\xaa\xd5\xd4\xea\x6a\x0d\xb5\xa6\x5a\x4b\xad\xad\xd6\x51\xeb\xaa\xf5\xd4\xfa\x6a\x03\xb5\xa1\xda\x48\x6d\xac\x36\x51\x9b\xaa\xcd\xd4\xe6\x6a\x0b\xb5\xa5\xda\x4a\x6d\xad\xb6\x51\xdb\xaa\xed\xd4\xf6\x6a\x07\xb5\xa3\xda\x49\xed\xac\x76\x51\xbb\xaa\xdd\xd4\xee\x6a\x0f\xb5\xa7\xda\x4b\xed\xad\xf6\x51\xfb\xaa\xfd\x54\x4c\xc5\x55\x42\x25\x55\x4a\xa5\x55\x46\x65\x55\x4e\xe5\x55\x41\x15\x55\x49\x95\x55\x45\x55\x55\x4d\xd5\x55\x43\x35\x55\x4b\xb5\x55\x47\x75\x55\x4f\xf5\xd5\x40\x0d\xd5\x48\x05\x2a\x54\x91\x1a\x53\xfb\xab\x03\xd4\x81\xea\x20\x75\xb0\x3a\x44\x1d\xaa\x0e\x53\x87\xab\x23\xd4\x91\xea\x28\x75\xb4\x3a\x46\x1d\xab\x8e\x53\xc7\xab\x13\xd4\x89\xea\x24\x75\xb2\x3a\x45\x9d\xaa\x4e\x53\xa7\xab\x33\xd4\x99\xea\x2c\x75\xb6\x3a\x47\x9d\xab\xce\x53\xe7\xab\x0b\xd4\x85\xea\x22\x75\xb1\xba\x44\x5d\xaa\x2e\x53\x97\xab\x2b\xd4\x95\xea\x2a\x75\xb5\xba\x46\x5d\xab\xae\x53\xd7\xab\x1b\xd4\x8d\xea\x26\x75\xb3\xba\x45\xdd\xaa\x6e\x53\xb7\xab\x3b\xd4\x9d\xea\x2e\x75\xb7\xba\x47\xdd\xab\xee\x53\xf7\xab\x07\xd4\x83\xea\x21\xf5\xb0\x7a\x44\x3d\xaa\x1e\x53\x8f\xab\x27\xd4\x93\xea\x29\xf5\xb4\x7a\x46\x3d\xab\x9e\x53\xcf\xab\x17\xd4\x8b\xea\x25\xf5\xb2\x7a\x45\xbd\xaa\x5e\x53\xaf\xab\x37\xd4\x9b\xea\x2d\xf5\xb6\x7a\x47\xbd\xab\xde\x53\xef\xab\x0f\xd4\x87\xea\x23\xf5\xb1\xfa\x44\x7d\xaa\x3e\x53\x9f\xab\x2f\xd4\x97\xea\x2b\xf5\xb5\xfa\x46\x7d\xab\xbe\x53\xdf\xab\x1f\xd4\x8f\xea\x27\xf5\xb3\xfa\x45\xfd\xaa\x7e\x53\xbf\xab\x3f\xd4\x9f\xea\x2f\xf5\xb7\xfa\x47\xfd\xab\xfe\x53\xe3\xd4\x78\x35\x41\x4d\xd4\x92\x68\x49\xb5\x64\x5a\x72\x2d\x85\x96\x52\x4b\xa5\xa5\xd6\xd2\x68\x69\xb5\x74\x5a\x7a\x2d\x83\x96\x51\xcb\xa4\x65\xd6\xb2\x68\x59\xb5\x6c\x5a\x76\x2d\x87\x96\x53\xcb\xa5\xe5\xd6\xf2\x68\x79\xb5\x7c\x5a\x7e\xad\x80\x56\x50\x2b\xa4\x15\xd6\x8a\x68\x45\xb5\x62\x5a\x71\xad\x84\x56\x52\x2b\xa5\x95\xd6\xca\x68\x65\xb5\x72\x5a\x79\xad\x82\x56\x51\xab\xa4\x55\xd6\xaa\x68\x55\xb5\x6a\x5a\x75\xad\x86\x56\x53\xab\xa5\xd5\xd6\xea\x68\x75\xb5\x7a\x5a\x7d\xad\x81\xd6\x50\x6b\xa4\x35\xd6\x9a\x68\x4d\xb5\x66\x5a\x73\xad\x85\xd6\x52\x6b\xa5\xb5\xd6\xda\x68\x6d\xb5\x76\x5a\x7b\xad\x83\xd6\x51\xeb\xa4\x75\xd6\xba\x68\x5d\xb5\x6e\x5a\x77\xad\x87\xd6\x53\xeb\xa5\xf5\xd6\xfa\x68\x7d\xb5\x7e\x1a\xa6\xe1\x1a\xa1\x91\x1a\xa5\xd1\x1a\xa3\xb1\x1a\xa7\xf1\x9a\xa0\x89\x9a\xa4\xc9\x9a\xa2\xa9\x9a\xa6\xe9\x9a\xa1\x99\x9a\xa5\xd9\x9a\xa3\xb9\x9a\xa7\xf9\x5a\xa0\x85\x5a\xa4\x01\x0d\x6a\x48\x8b\x69\xfd\xb5\x01\xda\x40\x6d\x90\x36\x58\x1b\xa2\x0d\xd5\x86\x69\xc3\xb5\x11\xda\x48\x6d\x94\x36\x5a\x1b\xa3\x8d\xd5\xc6\x69\xe3\xb5\x09\xda\x44\x6d\x92\x36\x59\x9b\xa2\x4d\xd5\xa6\x69\xd3\xb5\x19\xda\x4c\x6d\x96\x36\x5b\x9b\xa3\xcd\xd5\xe6\x69\xf3\xb5\x05\xda\x42\x6d\x91\xb6\x58\x5b\xa2\x2d\xd5\x96\x69\xcb\xb5\x15\xda\x4a\x6d\x95\xb6\x5a\x5b\xa3\xad\xd5\xd6\x69\xeb\xb5\x0d\xda\x46\x6d\x93\xb6\x59\xdb\xa2\x6d\xd5\xb6\x69\xdb\xb5\x1d\xda\x4e\x6d\x97\xb6\x5b\xdb\xa3\xed\xd5\xf6\x69\xfb\xb5\x03\xda\x41\xed\x90\x76\x58\x3b\xa2\x1d\xd5\x8e\x69\xc7\xb5\x13\xda\x49\xed\x94\x76\x5a\x3b\xa3\x9d\xd5\xce\x69\xe7\xb5\x0b\xda\x45\xed\x92\x76\x59\xbb\xa2\x5d\xd5\xae\x69\xd7\xb5\x1b\xda\x4d\xed\x96\x76\x5b\xbb\xa3\xdd\xd5\xee\x69\xf7\xb5\x07\xda\x43\xed\x91\xf6\x58\x7b\xa2\x3d\xd5\x9e\x69\xcf\xb5\x17\xda\x4b\xed\x95\xf6\x5a\x7b\xa3\xbd\xd5\xde\x69\xef\xb5\x0f\xda\x47\xed\x93\xf6\x59\xfb\xa2\x7d\xd5\xbe\x69\xdf\xb5\x1f\xda\x4f\xed\x97\xf6\x5b\xfb\xa3\xfd\xd5\xfe\x69\x71\x5a\xbc\x96\xa0\x25\xea\x49\xf4\xa4\x7a\x32\x3d\xb9\x9e\x42\x4f\xa9\xa7\xd2\x53\xeb\x69\xf4\xb4\x7a\x3a\x3d\xbd\x9e\x41\xcf\xa8\x67\xd2\x33\xeb\x59\xf4\xac\x7a\x36\x3d\xbb\x9e\x43\xcf\xa9\xe7\xd2\x73\xeb\x79\xf4\xbc\x7a\x3e\x3d\xbf\x5e\x40\x2f\xa8\x17\xd2\x0b\xeb\x45\xf4\xa2\x7a\x31\xbd\xb8\x5e\x42\x2f\xa9\x97\xd2\x4b\xeb\x65\xf4\xb2\x7a\x39\xbd\xbc\x5e\x41\xaf\xa8\x57\xd2\x2b\xeb\x55\xf4\xaa\x7a\x35\xbd\xba\x5e\x43\xaf\xa9\xd7\xd2\x6b\xeb\x75\xf4\xba\x7a\x3d\xbd\xbe\xde\x40\x6f\xa8\x37\xd2\x1b\xeb\x4d\xf4\xa6\x7a\x33\xbd\xb9\xde\x42\x6f\xa9\xb7\xd2\x5b\xeb\x6d\xf4\xb6\x7a\x3b\xbd\xbd\xde\x41\xef\xa8\x77\xd2\x3b\xeb\x5d\xf4\xae\x7a\x37\xbd\xbb\xde\x43\xef\xa9\xf7\xd2\x7b\xeb\x7d\xf4\xbe\x7a\x3f\x1d\xd3\x71\x9d\xd0\x49\x9d\xd2\x69\x9d\xd1\x59\x9d\xd3\x79\x5d\xd0\x45\x5d\xd2\x65\x5d\xd1\x55\x5d\xd3\x75\xdd\xd0\x4d\xdd\xd2\x6d\xdd\xd1\x5d\xdd\xd3\x7d\x3d\xd0\x43\x3d\xd2\x81\x0e\x75\xa4\xc7\xf4\xfe\xfa\x00\x7d\xa0\x3e\x48\x1f\xac\x0f\xd1\x87\xea\xc3\xf4\xe1\xfa\x08\x7d\xa4\x3e\x4a\x1f\xad\x8f\xd1\xc7\xea\xe3\xf4\xf1\xfa\x04\x7d\xa2\x3e\x49\x9f\xac\x4f\xd1\xa7\xea\xd3\xf4\xe9\xfa\x0c\x7d\xa6\x3e\x4b\x9f\xad\xcf\xd1\xe7\xea\xf3\xf4\xf9\xfa\x02\x7d\xa1\xbe\x48\x5f\xac\x2f\xd1\x97\xea\xcb\xf4\xe5\xfa\x0a\x7d\xa5\xbe\x4a\x5f\xad\xaf\xd1\xd7\xea\xeb\xf4\xf5\xfa\x06\x7d\xa3\xbe\x49\xdf\xac\x6f\xd1\xb7\xea\xdb\xf4\xed\xfa\x0e\x7d\xa7\xbe\x4b\xdf\xad\xef\xd1\xf7\xea\xfb\xf4\xfd\xfa\x01\xfd\xa0\x7e\x48\x3f\xac\x1f\xd1\x8f\xea\xc7\xf4\xe3\xfa\x09\xfd\xa4\x7e\x4a\x3f\xad\x9f\xd1\xcf\xea\xe7\xf4\xf3\xfa\x05\xfd\xa2\x7e\x49\xbf\xac\x5f\xd1\xaf\xea\xd7\xf4\xeb\xfa\x0d\xfd\xa6\x7e\x4b\xbf\xad\xdf\xd1\xef\xea\xf7\xf4\xfb\xfa\x03\xfd\xa1\xfe\x48\x7f\xac\x3f\xd1\x9f\xea\xcf\xf4\xe7\xfa\x0b\xfd\xa5\xfe\x4a\x7f\xad\xbf\xd1\xdf\xea\xef\xf4\xf7\xfa\x07\xfd\xa3\xfe\x49\xff\xac\x7f\xd1\xbf\xea\xdf\xf4\xef\xfa\x0f\xfd\xa7\xfe\x4b\xff\xad\xff\xd1\xff\xea\xff\xf4\x38\x3d\x5e\x4f\xd0\x13\x8d\x24\x46\x52\x23\x99\x91\xdc\x48\x61\xa4\x34\x52\x19\xa9\x8d\x34\x46\x5a\x23\x9d\x91\xde\xc8\x60\x64\x34\x32\x19\x99\x8d\x2c\x46\x56\x23\x9b\x91\xdd\xc8\x61\xe4\x34\x72\x19\xb9\x8d\x3c\x46\x5e\x23\x9f\x91\xdf\x28\x60\x14\x34\x0a\x19\x85\x8d\x22\x46\x51\xa3\x98\x51\xdc\x28\x61\x94\x34\x4a\x19\xa5\x8d\x32\x46\x59\xa3\x9c\x51\xde\xa8\x60\x54\x34\x2a\x19\x95\x8d\x2a\x46\x55\xa3\x9a\x51\xdd\xa8\x61\xd4\x34\x6a\x19\xb5\x8d\x3a\x46\x5d\xa3\x9e\x51\xdf\x68\x60\x34\x34\x1a\x19\x8d\x8d\x26\x46\x53\xa3\x99\xd1\xdc\x68\x61\xb4\x34\x5a\x19\xad\x8d\x36\x46\x5b\xa3\x9d\xd1\xde\xe8\x60\x74\x34\x3a\x19\x9d\x8d\x2e\x46\x57\xa3\x9b\xd1\xdd\xe8\x61\xf4\x34\x7a\x19\xbd\x8d\x3e\x46\x5f\xa3\x9f\x81\x19\xb8\x41\x18\xa4\x41\x19\xb4\xc1\x18\xac\xc1\x19\xbc\x21\x18\xa2\x21\x19\xb2\xa1\x18\xaa\xa1\x19\xba\x61\x18\xa6\x61\x19\xb6\xe1\x18\xae\xe1\x19\xbe\x11\x18\xa1\x11\x19\xc0\x80\x06\x32\x62\x46\x7f\x63\x80\x31\xd0\x18\x64\x0c\x36\x86\x18\x43\x8d\x61\xc6\x70\x63\x84\x31\xd2\x18\x65\x8c\x36\xc6\x18\x63\x8d\x71\xc6\x78\x63\x82\x31\xd1\x98\x64\x4c\x36\xa6\x18\x53\x8d\x69\xc6\x74\x63\x86\x31\xd3\x98\x65\xcc\x36\xe6\x18\x73\x8d\x79\xc6\x7c\x63\x81\xb1\xd0\x58\x64\x2c\x36\x96\x18\x4b\x8d\x65\xc6\x72\x63\x85\xb1\xd2\x58\x65\xac\x36\xd6\x18\x6b\x8d\x75\xc6\x7a\x63\x83\xb1\xd1\xd8\x64\x6c\x36\xb6\x18\x5b\x8d\x6d\xc6\x76\x63\x87\xb1\xd3\xd8\x65\xec\x36\xf6\x18\x7b\x8d\x7d\xc6\x7e\xe3\x80\x71\xd0\x38\x64\x1c\x36\x8e\x18\x47\x8d\x63\xc6\x71\xe3\x84\x71\xd2\x38\x65\x9c\x36\xce\x18\x67\x8d\x73\xc6\x79\xe3\x82\x71\xd1\xb8\x64\x5c\x36\xae\x18\x57\x8d\x6b\xc6\x75\xe3\x86\x71\xd3\xb8\x65\xdc\x36\xee\x18\x77\x8d\x7b\xc6\x7d\xe3\x81\xf1\xd0\x78\x64\x3c\x36\x9e\x18\x4f\x8d\x67\xc6\x73\xe3\x85\xf1\xd2\x78\x65\xbc\x36\xde\x18\x6f\x8d\x77\xc6\x7b\xe3\x83\xf1\xd1\xf8\x64\x7c\x36\xbe\x18\x5f\x8d\x6f\xc6\x77\xe3\x87\xf1\xd3\xf8\x65\xfc\x36\xfe\x18\x7f\x8d\x7f\x46\x9c\x11\x6f\x24\x18\x89\x66\x12\x33\xa9\x99\xcc\x4c\x6e\xa6\x30\x53\x9a\xa9\xcc\xd4\x66\x1a\x33\xad\x99\xce\x4c\x6f\x66\x30\x33\x9a\x99\xcc\xcc\x66\x16\x33\xab\x99\xcd\xcc\x6e\xe6\x30\x73\x9a\xb9\xcc\xdc\x66\x1e\x33\xaf\x99\xcf\xcc\x6f\x16\x30\x0b\x9a\x85\xcc\xc2\x66\x11\xb3\xa8\x59\xcc\x2c\x6e\x96\x30\x4b\x9a\xa5\xcc\xd2\x66\x19\xb3\xac\x59\xce\x2c\x6f\x56\x30\x2b\x9a\x95\xcc\xca\x66\x15\xb3\xaa\x59\xcd\xac\x6e\xd6\x30\x6b\x9a\xb5\xcc\xda\x66\x1d\xb3\xae\x59\xcf\xac\x6f\x36\x30\x1b\x9a\x8d\xcc\xc6\x66\x13\xb3\xa9\xd9\xcc\x6c\x6e\xb6\x30\x5b\x9a\xad\xcc\xd6\x66\x1b\xb3\xad\xd9\xce\x6c\x6f\x76\x30\x3b\x9a\x9d\xcc\xce\x66\x17\xb3\xab\xd9\xcd\xec\x6e\xf6\x30\x7b\x9a\xbd\xcc\xde\x66\x1f\xb3\xaf\xd9\xcf\xc4\x4c\xdc\x24\x4c\xd2\xa4\x4c\xda\x64\x4c\xd6\xe4\x4c\xde\x14\x4c\xd1\x94\x4c\xd9\x54\x4c\xd5\xd4\x4c\xdd\x34\x4c\xd3\xb4\x4c\xdb\x74\x4c\xd7\xf4\x4c\xdf\x0c\xcc\xd0\x8c\x4c\x60\x42\x13\x99\x31\xb3\xbf\x39\xc0\x1c\x68\x0e\x32\x07\x9b\x43\xcc\xa1\xe6\x30\x73\xb8\x39\xc2\x1c\x69\x8e\x32\x47\x9b\x63\xcc\xb1\xe6\x38\x73\xbc\x39\xc1\x9c\x68\x4e\x32\x27\x9b\x53\xcc\xa9\xe6\x34\x73\xba\x39\xc3\x9c\x69\xce\x32\x67\x9b\x73\xcc\xb9\xe6\x3c\x73\xbe\xb9\xc0\x5c\x68\x2e\x32\x17\x9b\x4b\xcc\xa5\xe6\x32\x73\xb9\xb9\xc2\x5c\x69\xae\x32\x57\x9b\x6b\xcc\xb5\xe6\x3a\x73\xbd\xb9\xc1\xdc\x68\x6e\x32\x37\x9b\x5b\xcc\xad\xe6\x36\x73\xbb\xb9\xc3\xdc\x69\xee\x32\x77\x9b\x7b\xcc\xbd\xe6\x3e\x73\xbf\x79\xc0\x3c\x68\x1e\x32\x0f\x9b\x47\xcc\xa3\xe6\x31\xf3\xb8\x79\xc2\x3c\x69\x9e\x32\x4f\x9b\x67\xcc\xb3\xe6\x39\xf3\xbc\x79\xc1\xbc\x68\x5e\x32\x2f\x9b\x57\xcc\xab\xe6\x35\xf3\xba\x79\xc3\xbc\x69\xde\x32\x6f\x9b\x77\xcc\xbb\xe6\x3d\xf3\xbe\xf9\xc0\x7c\x68\x3e\x32\x1f\x9b\x4f\xcc\xa7\xe6\x33\xf3\xb9\xf9\xc2\x7c\x69\xbe\x32\x5f\x9b\x6f\xcc\xb7\xe6\x3b\xf3\xbd\xf9\xc1\xfc\x68\x7e\x32\x3f\x9b\x5f\xcc\xaf\xe6\x37\xf3\xbb\xf9\xc3\xfc\x69\xfe\x32\x7f\x9b\x7f\xcc\xbf\xe6\x3f\x33\xce\x8c\x37\x13\xcc\x44\x2b\x89\x95\xd4\x4a\x66\x25\xb7\x52\x58\x29\xad\x54\x56\x6a\x2b\x8d\x95\xd6\x4a\x67\xa5\xb7\x32\x58\x19\xad\x4c\x56\x66\x2b\x8b\x95\xd5\xca\x66\x65\xb7\x72\x58\x39\xad\x5c\x56\x6e\x2b\x8f\x95\xd7\xca\x67\xe5\xb7\x0a\x58\x05\xad\x42\x56\x61\xab\x88\x55\xd4\x2a\x66\x15\xb7\x4a\x58\x25\xad\x52\x56\x69\xab\x8c\x55\xd6\x2a\x67\x95\xb7\x2a\x58\x15\xad\x4a\x56\x65\xab\x8a\x55\xd5\xaa\x66\x55\xb7\x6a\x58\x35\xad\x5a\x56\x6d\xab\x8e\x55\xd7\xaa\x67\xd5\xb7\x1a\x58\x0d\xad\x46\x56\x63\xab\x89\xd5\xd4\x6a\x66\x35\xb7\x5a\x58\x2d\xad\x56\x56\x6b\xab\x8d\xd5\xd6\x6a\x67\xb5\xb7\x3a\x58\x1d\xad\x4e\x56\x67\xab\x8b\xd5\xd5\xea\x66\x75\xb7\x7a\x58\x3d\xad\x5e\x56\x6f\xab\x8f\xd5\xd7\xea\x67\x61\x16\x6e\x11\x16\x69\x51\x16\x6d\x31\x16\x6b\x71\x16\x6f\x09\x96\x68\x49\x96\x6c\x29\x96\x6a\x69\x96\x6e\x19\x96\x69\x59\x96\x6d\x39\x96\x6b\x79\x96\x6f\x05\x56\x68\x45\x16\xb0\xa0\x85\xac\x98\xd5\xdf\x1a\x60\x0d\xb4\x06\x59\x83\xad\x21\xd6\x50\x6b\x98\x35\xdc\x1a\x61\x8d\xb4\x46\x59\xa3\xad\x31\xd6\x58\x6b\x9c\x35\xde\x9a\x60\x4d\xb4\x26\x59\x93\xad\x29\xd6\x54\x6b\x9a\x35\xdd\x9a\x61\xcd\xb4\x66\x59\xb3\xad\x39\xd6\x5c\x6b\x9e\x35\xdf\x5a\x60\x2d\xb4\x16\x59\x8b\xad\x25\xd6\x52\x6b\x99\xb5\xdc\x5a\x61\xad\xb4\x56\x59\xab\xad\x35\xd6\x5a\x6b\x9d\xb5\xde\xda\x60\x6d\xb4\x36\x59\x9b\xad\x2d\xd6\x56\x6b\x9b\xb5\xdd\xda\x61\xed\xb4\x76\x59\xbb\xad\x3d\xd6\x5e\x6b\x9f\xb5\xdf\x3a\x60\x1d\xb4\x0e\x59\x87\xad\x23\xd6\x51\xeb\x98\x75\xdc\x3a\x61\x9d\xb4\x4e\x59\xa7\xad\x33\xd6\x59\xeb\x9c\x75\xde\xba\x60\x5d\xb4\x2e\x59\x97\xad\x2b\xd6\x55\xeb\x9a\x75\xdd\xba\x61\xdd\xb4\x6e\x59\xb7\xad\x3b\xd6\x5d\xeb\x9e\x75\xdf\x7a\x60\x3d\xb4\x1e\x59\x8f\xad\x27\xd6\x53\xeb\x99\xf5\xdc\x7a\x61\xbd\xb4\x5e\x59\xaf\xad\x37\xd6\x5b\xeb\x9d\xf5\xde\xfa\x60\x7d\xb4\x3e\x59\x9f\xad\x2f\xd6\x57\xeb\x9b\xf5\xdd\xfa\x61\xfd\xb4\x7e\x59\xbf\xad\x3f\xd6\x5f\xeb\x9f\x15\x67\xc5\x5b\x09\x56\xa2\x9d\xc4\x4e\x6a\x27\xb3\x93\xdb\x29\xec\x94\x76\x2a\x3b\xb5\x9d\xc6\x4e\x6b\xa7\xb3\xd3\xdb\x19\xec\x8c\x76\x26\x3b\xb3\x9d\xc5\xce\x6a\x67\xb3\xb3\xdb\x39\xec\x9c\x76\x2e\x3b\xb7\x9d\xc7\xce\x6b\xe7\xb3\xf3\xdb\x05\xec\x82\x76\x21\xbb\xb0\x5d\xc4\x2e\x6a\x17\xb3\x8b\xdb\x25\xec\x92\x76\x29\xbb\xb4\x5d\xc6\x2e\x6b\x97\xb3\xcb\xdb\x15\xec\x8a\x76\x25\xbb\xb2\x5d\xc5\xae\x6a\x57\xb3\xab\xdb\x35\xec\x9a\x76\x2d\xbb\xb6\x5d\xc7\xae\x6b\xd7\xb3\xeb\xdb\x0d\xec\x86\x76\x23\xbb\xb1\xdd\xc4\x6e\x6a\x37\xb3\x9b\xdb\x2d\xec\x96\x76\x2b\xbb\xb5\xdd\xc6\x6e\x6b\xb7\xb3\xdb\xdb\x1d\xec\x8e\x76\x27\xbb\xb3\xdd\xc5\xee\x6a\x77\xb3\xbb\xdb\x3d\xec\x9e\x76\x2f\xbb\xb7\xdd\xc7\xee\x6b\xf7\xb3\x31\x1b\xb7\x09\x9b\xb4\x29\x9b\xb6\x19\x9b\xb5\x39\x9b\xb7\x05\x5b\xb4\x25\x5b\xb6\x15\x5b\xb5\x35\x5b\xb7\x0d\xdb\xb4\x2d\xdb\xb6\x1d\xdb\xb5\x3d\xdb\xb7\x03\x3b\xb4\x23\x1b\xd8\xd0\x46\x76\xcc\xee\x6f\x0f\xb0\x07\xda\x83\xec\xc1\xf6\x10\x7b\xa8\x3d\xcc\x1e\x6e\x8f\xb0\x47\xda\xa3\xec\xd1\xf6\x18\x7b\xac\x3d\xce\x1e\x6f\x4f\xb0\x27\xda\x93\xec\xc9\xf6\x14\x7b\xaa\x3d\xcd\x9e\x6e\xcf\xb0\x67\xda\xb3\xec\xd9\xf6\x1c\x7b\xae\x3d\xcf\x9e\x6f\x2f\xb0\x17\xda\x8b\xec\xc5\xf6\x12\x7b\xa9\xbd\xcc\x5e\x6e\xaf\xb0\x57\xda\xab\xec\xd5\xf6\x1a\x7b\xad\xbd\xce\x5e\x6f\x6f\xb0\x37\xda\x9b\xec\xcd\xf6\x16\x7b\xab\xbd\xcd\xde\x6e\xef\xb0\x77\xda\xbb\xec\xdd\xf6\x1e\x7b\xaf\xbd\xcf\xde\x6f\x1f\xb0\x0f\xda\x87\xec\xc3\xf6\x11\xfb\xa8\x7d\xcc\x3e\x6e\x9f\xb0\x4f\xda\xa7\xec\xd3\xf6\x19\xfb\xac\x7d\xce\x3e\x6f\x5f\xb0\x2f\xda\x97\xec\xcb\xf6\x15\xfb\xaa\x7d\xcd\xbe\x6e\xdf\xb0\x6f\xda\xb7\xec\xdb\xf6\x1d\xfb\xae\x7d\xcf\xbe\x6f\x3f\xb0\x1f\xda\x8f\xec\xc7\xf6\x13\xfb\xa9\xfd\xcc\x7e\x6e\xbf\xb0\x5f\xda\xaf\xec\xd7\xf6\x1b\xfb\xad\xfd\xce\x7e\x6f\x7f\xb0\x3f\xda\x9f\xec\xcf\xf6\x17\xfb\xab\xfd\xcd\xfe\x6e\xff\xb0\x7f\xda\xbf\xec\xdf\xf6\x1f\xfb\xaf\xfd\xcf\x8e\xb3\xe3\xed\x04\x3b\xd1\x49\xe2\x24\x75\x92\x39\xc9\x9d\x14\x4e\x4a\x27\x95\x93\xda\x49\xe3\xa4\x75\xd2\x39\xe9\x9d\x0c\x4e\x46\x27\x93\x93\xd9\xc9\xe2\x64\x75\xb2\x39\xd9\x9d\x1c\x4e\x4e\x27\x97\x93\xdb\xc9\xe3\xe4\x75\xf2\x39\xf9\x9d\x02\x4e\x41\xa7\x90\x53\xd8\x29\xe2\x14\x75\x8a\x39\xc5\x9d\x12\x4e\x49\xa7\x94\x53\xda\x29\xe3\x94\x75\xca\x39\xe5\x9d\x0a\x4e\x45\xa7\x92\x53\xd9\xa9\xe2\x54\x75\xaa\x39\xd5\x9d\x1a\x4e\x4d\xa7\x96\x53\xdb\xa9\xe3\xd4\x75\xea\x39\xf5\x9d\x06\x4e\x43\xa7\x91\xd3\xd8\x69\xe2\x34\x75\x9a\x39\xcd\x9d\x16\x4e\x4b\xa7\x95\xd3\xda\x69\xe3\xb4\x75\xda\x39\xed\x9d\x0e\x4e\x47\xa7\x93\xd3\xd9\xe9\xe2\x74\x75\xba\x39\xdd\x9d\x1e\x4e\x4f\xa7\x97\xd3\xdb\xe9\xe3\xf4\x75\xfa\x39\x98\x83\x3b\x84\x43\x3a\x94\x43\x3b\x8c\xc3\x3a\x9c\xc3\x3b\x82\x23\x3a\x92\x23\x3b\x8a\xa3\x3a\x9a\xa3\x3b\x86\x63\x3a\x96\x63\x3b\x8e\xe3\x3a\x9e\xe3\x3b\x81\x13\x3a\x91\x03\x1c\xe8\x20\x27\xe6\xf4\x77\x06\x38\x03\x9d\x41\xce\x60\x67\x88\x33\xd4\x19\xe6\x0c\x77\x46\x38\x23\x9d\x51\xce\x68\x67\x8c\x33\xd6\x19\xe7\x8c\x77\x26\x38\x13\x9d\x49\xce\x64\x67\x8a\x33\xd5\x99\xe6\x4c\x77\x66\x38\x33\x9d\x59\xce\x6c\x67\x8e\x33\xd7\x99\xe7\xcc\x77\x16\x38\x0b\x9d\x45\xce\x62\x67\x89\xb3\xd4\x59\xe6\x2c\x77\x56\x38\x2b\x9d\x55\xce\x6a\x67\x8d\xb3\xd6\x59\xe7\xac\x77\x36\x38\x1b\x9d\x4d\xce\x66\x67\x8b\xb3\xd5\xd9\xe6\x6c\x77\x76\x38\x3b\x9d\x5d\xce\x6e\x67\x8f\xb3\xd7\xd9\xe7\xec\x77\x0e\x38\x07\x9d\x43\xce\x61\xe7\x88\x73\xd4\x39\xe6\x1c\x77\x4e\x38\x27\x9d\x53\xce\x69\xe7\x8c\x73\xd6\x39\xe7\x9c\x77\x2e\x38\x17\x9d\x4b\xce\x65\xe7\x8a\x73\xd5\xb9\xe6\x5c\x77\x6e\x38\x37\x9d\x5b\xce\x6d\xe7\x8e\x73\xd7\xb9\xe7\xdc\x77\x1e\x38\x0f\x9d\x47\xce\x63\xe7\x89\xf3\xd4\x79\xe6\x3c\x77\x5e\x38\x2f\x9d\x57\xce\x6b\xe7\x8d\xf3\xd6\x79\xe7\xbc\x77\x3e\x38\x1f\x9d\x4f\xce\x67\xe7\x8b\xf3\xd5\xf9\xe6\x7c\x77\x7e\x38\x3f\x9d\x5f\xce\x6f\xe7\x8f\xf3\xd7\xf9\xe7\xc4\x39\xf1\x4e\x82\x93\xe8\x26\x71\x93\xba\xc9\xdc\xe4\x6e\x0a\x37\xa5\x9b\xca\x4d\xed\xa6\x71\xd3\xba\xe9\xdc\xf4\x6e\x06\x37\xa3\x9b\xc9\xcd\xec\x66\x71\xb3\xba\xd9\xdc\xec\x6e\x0e\x37\xa7\x9b\xcb\xcd\xed\xe6\x71\xf3\xba\xf9\xdc\xfc\x6e\x01\xb7\xa0\x5b\xc8\x2d\xec\x16\x71\x8b\xba\xc5\xdc\xe2\x6e\x09\xb7\xa4\x5b\xca\x2d\xed\x96\x71\xcb\xba\xe5\xdc\xf2\x6e\x05\xb7\xa2\x5b\xc9\xad\xec\x56\x71\xab\xba\xd5\xdc\xea\x6e\x0d\xb7\xa6\x5b\xcb\xad\xed\xd6\x71\xeb\xba\xf5\xdc\xfa\x6e\x03\xb7\xa1\xdb\xc8\x6d\xec\x36\x71\x9b\xba\xcd\xdc\xe6\x6e\x0b\xb7\xa5\xdb\xca\x6d\xed\xb6\x71\xdb\xba\xed\xdc\xf6\x6e\x07\xb7\xa3\xdb\xc9\xed\xec\x76\x71\xbb\xba\xdd\xdc\xee\x6e\x0f\xb7\xa7\xdb\xcb\xed\xed\xf6\x71\xfb\xba\xfd\x5c\xcc\xc5\x5d\xc2\x25\x5d\xca\xa5\x5d\xc6\x65\x5d\xce\xe5\x5d\xc1\x15\x5d\xc9\x95\x5d\xc5\x55\x5d\xcd\xd5\x5d\xc3\x35\x5d\xcb\xb5\x5d\xc7\x75\x5d\xcf\xf5\xdd\xc0\x0d\xdd\xc8\x05\x2e\x74\x91\x1b\x73\xfb\xbb\x03\xdc\x81\xee\x20\x77\xb0\x3b\xc4\x1d\xea\x0e\x73\x87\xbb\x23\xdc\x91\xee\x28\x77\xb4\x3b\xc6\x1d\xeb\x8e\x73\xc7\xbb\x13\xdc\x89\xee\x24\x77\xb2\x3b\xc5\x9d\xea\x4e\x73\xa7\xbb\x33\xdc\x99\xee\x2c\x77\xb6\x3b\xc7\x9d\xeb\xce\x73\xe7\xbb\x0b\xdc\x85\xee\x22\x77\xb1\xbb\xc4\x5d\xea\x2e\x73\x97\xbb\x2b\xdc\x95\xee\x2a\x77\xb5\xbb\xc6\x5d\xeb\xae\x73\xd7\xbb\x1b\xdc\x8d\xee\x26\x77\xb3\xbb\xc5\xdd\xea\x6e\x73\xb7\xbb\x3b\xdc\x9d\xee\x2e\x77\xb7\xbb\xc7\xdd\xeb\xee\x73\xf7\xbb\x07\xdc\x83\xee\x21\xf7\xb0\x7b\xc4\x3d\xea\x1e\x73\x8f\xbb\x27\xdc\x93\xee\x29\xf7\xb4\x7b\xc6\x3d\xeb\x9e\x73\xcf\xbb\x17\xdc\x8b\xee\x25\xf7\xb2\x7b\xc5\xbd\xea\x5e\x73\xaf\xbb\x37\xdc\x9b\xee\x2d\xf7\xb6\x7b\xc7\xbd\xeb\xde\x73\xef\xbb\x0f\xdc\x87\xee\x23\xf7\xb1\xfb\xc4\x7d\xea\x3e\x73\x9f\xbb\x2f\xdc\x97\xee\x2b\xf7\xb5\xfb\xc6\x7d\xeb\xbe\x73\xdf\xbb\x1f\xdc\x8f\xee\x27\xf7\xb3\xfb\xc5\xfd\xea\x7e\x73\xbf\xbb\x3f\xdc\x9f\xee\x2f\xf7\xb7\xfb\xc7\xfd\xeb\xfe\x73\xe3\xdc\x78\x37\xc1\x4d\xf4\x92\x78\x49\xbd\x64\x5e\x72\x2f\x85\x97\xd2\x4b\xe5\xa5\xf6\xd2\x78\x69\xbd\x74\x5e\x7a\x2f\x83\x97\xd1\xcb\xe4\x65\xf6\xb2\x78\x59\xbd\x6c\x5e\x76\x2f\x87\x97\xd3\xcb\xe5\xe5\xf6\xf2\x78\x79\xbd\x7c\x5e\x7e\xaf\x80\x57\xd0\x2b\xe4\x15\xf6\x8a\x78\x45\xbd\x62\x5e\x71\xaf\x84\x57\xd2\x2b\xe5\x95\xf6\xca\x78\x65\xbd\x72\x5e\x79\xaf\x82\x57\xd1\xab\xe4\x55\xf6\xaa\x78\x55\xbd\x6a\x5e\x75\xaf\x86\x57\xd3\xab\xe5\xd5\xf6\xea\x78\x75\xbd\x7a\x5e\x7d\xaf\x81\xd7\xd0\x6b\xe4\x35\xf6\x9a\x78\x4d\xbd\x66\x5e\x73\xaf\x85\xd7\xd2\x6b\xe5\xb5\xf6\xda\x78\x6d\xbd\x76\x5e\x7b\xaf\x83\xd7\xd1\xeb\xe4\x75\xf6\xba\x78\x5d\xbd\x6e\x5e\x77\xaf\x87\xd7\xd3\xeb\xe5\xf5\xf6\xfa\x78\x7d\xbd\x7e\x1e\xe6\xe1\x1e\xe1\x91\x1e\xe5\xd1\x1e\xe3\xb1\x1e\xe7\xf1\x9e\xe0\x89\x9e\xe4\xc9\x9e\xe2\xa9\x9e\xe6\xe9\x9e\xe1\x99\x9e\xe5\xd9\x9e\xe3\xb9\x9e\xe7\xf9\x5e\xe0\x85\x5e\xe4\x01\x0f\x7a\xc8\x8b\x79\xfd\xbd\x01\xde\x40\x6f\x90\x37\xd8\x1b\xe2\x0d\xf5\x86\x79\xc3\xbd\x11\xde\x48\x6f\x94\x37\xda\x1b\xe3\x8d\xf5\xc6\x79\xe3\xbd\x09\xde\x44\x6f\x92\x37\xd9\x9b\xe2\x4d\xf5\xa6\x79\xd3\xbd\x19\xde\x4c\x6f\x96\x37\xdb\x9b\xe3\xcd\xf5\xe6\x79\xf3\xbd\x05\xde\x42\x6f\x91\xb7\xd8\x5b\xe2\x2d\xf5\x96\x79\xcb\xbd\x15\xde\x4a\x6f\x95\xb7\xda\x5b\xe3\xad\xf5\xd6\x79\xeb\xbd\x0d\xde\x46\x6f\x93\xb7\xd9\xdb\xe2\x6d\xf5\xb6\x79\xdb\xbd\x1d\xde\x4e\x6f\x97\xb7\xdb\xdb\xe3\xed\xf5\xf6\x79\xfb\xbd\x03\xde\x41\xef\x90\x77\xd8\x3b\xe2\x1d\xf5\x8e\x79\xc7\xbd\x13\xde\x49\xef\x94\x77\xda\x3b\xe3\x9d\xf5\xce\x79\xe7\xbd\x0b\xde\x45\xef\x92\x77\xd9\xbb\xe2\x5d\xf5\xae\x79\xd7\xbd\x1b\xde\x4d\xef\x96\x77\xdb\xbb\xe3\xdd\xf5\xee\x79\xf7\xbd\x07\xde\x43\xef\x91\xf7\xd8\x7b\xe2\x3d\xf5\x9e\x79\xcf\xbd\x17\xde\x4b\xef\x95\xf7\xda\x7b\xe3\xbd\xf5\xde\x79\xef\xbd\x0f\xde\x47\xef\x93\xf7\xd9\xfb\xe2\x7d\xf5\xbe\x79\xdf\xbd\x1f\xde\x4f\xef\x97\xf7\xdb\xfb\xe3\xfd\xf5\xfe\x79\x71\x5e\xbc\x97\xe0\x25\xfa\x49\xfc\xa4\x7e\x32\x3f\xb9\x9f\xc2\x4f\xe9\xa7\xf2\x53\xfb\x69\xfc\xb4\x7e\x3a\x3f\xbd\x9f\xc1\xcf\xe8\x67\xf2\x33\xfb\x59\xfc\xac\x7e\x36\x3f\xbb\x9f\xc3\xcf\xe9\xe7\xf2\x73\xfb\x79\xfc\xbc\x7e\x3e\x3f\xbf\x5f\xc0\x2f\xe8\x17\xf2\x0b\xfb\x45\xfc\xa2\x7e\x31\xbf\xb8\x5f\xc2\x2f\xe9\x97\xf2\x4b\xfb\x65\xfc\xb2\x7e\x39\xbf\xbc\x5f\xc1\xaf\xe8\x57\xf2\x2b\xfb\x55\xfc\xaa\x7e\x35\xbf\xba\x5f\xc3\xaf\xe9\xd7\xf2\x6b\xfb\x75\xfc\xba\x7e\x3d\xbf\xbe\xdf\xc0\x6f\xe8\x37\xf2\x1b\xfb\x4d\xfc\xa6\x7e\x33\xbf\xb9\xdf\xc2\x6f\xe9\xb7\xf2\x5b\xfb\x6d\xfc\xb6\x7e\x3b\xbf\xbd\xdf\xc1\xef\xe8\x77\xf2\x3b\xfb\x5d\xfc\xae\x7e\x37\xbf\xbb\xdf\xc3\xef\xe9\xf7\xf2\x7b\xfb\x7d\xfc\xbe\x7e\x3f\x1f\xf3\x71\x9f\xf0\x49\x9f\xf2\x69\x9f\xf1\x59\x9f\xf3\x79\x5f\xf0\x45\x5f\xf2\x65\x5f\xf1\x55\x5f\xf3\x75\xdf\xf0\x4d\xdf\xf2\x6d\xdf\xf1\x5d\xdf\xf3\x7d\x3f\xf0\x43\x3f\xf2\x81\x0f\x7d\xe4\xc7\xfc\xfe\xfe\x00\x7f\xa0\x3f\xc8\x1f\xec\x0f\xf1\x87\xfa\xc3\xfc\xe1\xfe\x08\x7f\xa4\x3f\xca\x1f\xed\x8f\xf1\xc7\xfa\xe3\xfc\xf1\xfe\x04\x7f\xa2\x3f\xc9\x9f\xec\x4f\xf1\xa7\xfa\xd3\xfc\xe9\xfe\x0c\x7f\xa6\x3f\xcb\x9f\xed\xcf\xf1\xe7\xfa\xf3\xfc\xf9\xfe\x02\x7f\xa1\xbf\xc8\x5f\xec\x2f\xf1\x97\xfa\xcb\xfc\xe5\xfe\x0a\x7f\xa5\xbf\xca\x5f\xed\xaf\xf1\xd7\xfa\xeb\xfc\xf5\xfe\x06\x7f\xa3\xbf\xc9\xdf\xec\x6f\xf1\xb7\xfa\xdb\xfc\xed\xfe\x0e\x7f\xa7\xbf\xcb\xdf\xed\xef\xf1\xf7\xfa\xfb\xfc\xfd\xfe\x01\xff\xa0\x7f\xc8\x3f\xec\x1f\xf1\x8f\xfa\xc7\xfc\xe3\xfe\x09\xff\xa4\x7f\xca\x3f\xed\x9f\xf1\xcf\xfa\xe7\xfc\xf3\xfe\x05\xff\xa2\x7f\xc9\xbf\xec\x5f\xf1\xaf\xfa\xd7\xfc\xeb\xfe\x0d\xff\xa6\x7f\xcb\xbf\xed\xdf\xf1\xef\xfa\xf7\xfc\xfb\xfe\x03\xff\xa1\xff\xc8\x7f\xec\x3f\xf1\x9f\xfa\xcf\xfc\xe7\xfe\x0b\xff\xa5\xff\xca\x7f\xed\xbf\xf1\xdf\xfa\xef\xfc\xf7\xfe\x07\xff\xa3\xff\xc9\xff\xec\x7f\xf1\xbf\xfa\xdf\xfc\xef\xfe\x0f\xff\xa7\xff\xcb\xff\xed\xff\xf1\xff\xfa\xff\xfc\x38\x3f\xde\x4f\xf0\x13\x83\x24\x41\xd2\x20\x59\x90\x3c\x48\x11\xa4\x0c\x52\x05\xa9\x83\x34\x41\xda\x20\x5d\x90\x3e\xc8\x10\x64\x0c\x32\x05\x99\x83\x2c\x41\xd6\x20\x5b\x90\x3d\xc8\x11\xe4\x0c\x72\x05\xb9\x83\x3c\x41\xde\x20\x5f\x90\x3f\x28\x10\x14\x0c\x0a\x05\x85\x83\x22\x41\xd1\xa0\x58\x50\x3c\x28\x11\x94\x0c\x4a\x05\xa5\x83\x32\x41\xd9\xa0\x5c\x50\x3e\xa8\x10\x54\x0c\x2a\x05\x95\x83\x2a\x41\xd5\xa0\x5a\x50\x3d\xa8\x11\xd4\x0c\x6a\x05\xb5\x83\x3a\x41\xdd\xa0\x5e\x50\x3f\x68\x10\x34\x0c\x1a\x05\x8d\x83\x26\x41\xd3\xa0\x59\xd0\x3c\x68\x11\xb4\x0c\x5a\x05\xad\x83\x36\x41\xdb\xa0\x5d\xd0\x3e\xe8\x10\x74\x0c\x3a\x05\x9d\x83\x2e\x41\xd7\xa0\x5b\xd0\x3d\xe8\x11\xf4\x0c\x7a\x05\xbd\x83\x3e\x41\xdf\xa0\x5f\x80\x05\x78\x40\x04\x64\x40\x05\x74\xc0\x04\x6c\xc0\x05\x7c\x20\x04\x62\x20\x05\x72\xa0\x04\x6a\xa0\x05\x7a\x60\x04\x66\x60\x05\x76\xe0\x04\x6e\xe0\x05\x7e\x10\x04\x61\x10\x05\x20\x80\x01\x0a\x62\x41\xff\x60\x40\x30\x30\x18\x14\x0c\x0e\x86\x04\x43\x83\x61\xc1\xf0\x60\x44\x30\x32\x18\x15\x8c\x0e\xc6\x04\x63\x83\x71\xc1\xf8\x60\x42\x30\x31\x98\x14\x4c\x0e\xa6\x04\x53\x83\x69\xc1\xf4\x60\x46\x30\x33\x98\x15\xcc\x0e\xe6\x04\x73\x83\x79\xc1\xfc\x60\x41\xb0\x30\x58\x14\x2c\x0e\x96\x04\x4b\x83\x65\xc1\xf2\x60\x45\xb0\x32\x58\x15\xac\x0e\xd6\x04\x6b\x83\x75\xc1\xfa\x60\x43\xb0\x31\xd8\x14\x6c\x0e\xb6\x04\x5b\x83\x6d\xc1\xf6\x60\x47\xb0\x33\xd8\x15\xec\x0e\xf6\x04\x7b\x83\x7d\xc1\xfe\xe0\x40\x70\x30\x38\x14\x1c\x0e\x8e\x04\x47\x83\x63\xc1\xf1\xe0\x44\x70\x32\x38\x15\x9c\x0e\xce\x04\x67\x83\x73\xc1\xf9\xe0\x42\x70\x31\xb8\x14\x5c\x0e\xae\x04\x57\x83\x6b\xc1\xf5\xe0\x46\x70\x33\xb8\x15\xdc\x0e\xee\x04\x77\x83\x7b\xc1\xfd\xe0\x41\xf0\x30\x78\x14\x3c\x0e\x9e\x04\x4f\x83\x67\xc1\xf3\xe0\x45\xf0\x32\x78\x15\xbc\x0e\xde\x04\x6f\x83\x77\xc1\xfb\xe0\x43\xf0\x31\xf8\x14\x7c\x0e\xbe\x04\x5f\x83\x6f\xc1\xf7\xe0\x47\xf0\x33\xf8\x15\xfc\x0e\xfe\x04\x7f\x83\x7f\x41\x5c\x10\x1f\x24\x04\x89\x61\x92\x30\x69\x98\x2c\x4c\x1e\xa6\x08\x53\x86\xa9\xc2\xd4\x61\x9a\x30\x6d\x98\x2e\x4c\x1f\x66\x08\x33\x86\x99\xc2\xcc\x61\x96\x30\x6b\x98\x2d\xcc\x1e\xe6\x08\x73\x86\xb9\xc2\xdc\x61\x9e\x30\x6f\x98\x2f\xcc\x1f\x16\x08\x0b\x86\x85\xc2\xc2\x61\x91\xb0\x68\x58\x2c\x2c\x1e\x96\x08\x4b\x86\xa5\xc2\xd2\x61\x99\xb0\x6c\x58\x2e\x2c\x1f\x56\x08\x2b\x86\x95\xc2\xca\x61\x95\xb0\x6a\x58\x2d\xac\x1e\xd6\x08\x6b\x86\xb5\xc2\xda\x61\x9d\xb0\x6e\x58\x2f\xac\x1f\x36\x08\x1b\x86\x8d\xc2\xc6\x61\x93\xb0\x69\xd8\x2c\x6c\x1e\xb6\x08\x5b\x86\xad\xc2\xd6\x61\x9b\xb0\x6d\xd8\x2e\x6c\x1f\x76\x08\x3b\x86\x9d\xc2\xce\x61\x97\xb0\x6b\xd8\x2d\xec\x1e\xf6\x08\x7b\x86\xbd\xc2\xde\x61\x9f\xb0\x6f\xd8\x2f\xc4\x42\x3c\x24\x42\x32\xa4\x42\x3a\x64\x42\x36\xe4\x42\x3e\x14\x42\x31\x94\x42\x39\x54\x42\x35\xd4\x42\x3d\x34\x42\x33\xb4\x42\x3b\x74\x42\x37\xf4\x42\x3f\x0c\xc2\x30\x8c\x42\x10\xc2\x10\x85\xb1\xb0\x7f\x38\x20\x1c\x18\x0e\x0a\x07\x87\x43\xc2\xa1\xe1\xb0\x70\x78\x38\x22\x1c\x19\x8e\x0a\x47\x87\x63\xc2\xb1\xe1\xb8\x70\x7c\x38\x21\x9c\x18\x4e\x0a\x27\x87\x53\xc2\xa9\xe1\xb4\x70\x7a\x38\x23\x9c\x19\xce\x0a\x67\x87\x73\xc2\xb9\xe1\xbc\x70\x7e\xb8\x20\x5c\x18\x2e\x0a\x17\x87\x4b\xc2\xa5\xe1\xb2\x70\x79\xb8\x22\x5c\x19\xae\x0a\x57\x87\x6b\xc2\xb5\xe1\xba\x70\x7d\xb8\x21\xdc\x18\x6e\x0a\x37\x87\x5b\xc2\xad\xe1\xb6\x70\x7b\xb8\x23\xdc\x19\xee\x0a\x77\x87\x7b\xc2\xbd\xe1\xbe\x70\x7f\x78\x20\x3c\x18\x1e\x0a\x0f\x87\x47\xc2\xa3\xe1\xb1\xf0\x78\x78\x22\x3c\x19\x9e\x0a\x4f\x87\x67\xc2\xb3\xe1\xb9\xf0\x7c\x78\x21\xbc\x18\x5e\x0a\x2f\x87\x57\xc2\xab\xe1\xb5\xf0\x7a\x78\x23\xbc\x19\xde\x0a\x6f\x87\x77\xc2\xbb\xe1\xbd\xf0\x7e\xf8\x20\x7c\x18\x3e\x0a\x1f\x87\x4f\xc2\xa7\xe1\xb3\xf0\x79\xf8\x22\x7c\x19\xbe\x0a\x5f\x87\x6f\xc2\xb7\xe1\xbb\xf0\x7d\xf8\x21\xfc\x18\x7e\x0a\x3f\x87\x5f\xc2\xaf\xe1\xb7\xf0\x7b\xf8\x23\xfc\x19\xfe\x0a\x7f\x87\x7f\xc2\xbf\xe1\xbf\x30\x2e\x8c\x0f\x13\xc2\xc4\x28\x49\x94\x34\x4a\x16\x25\x8f\x52\x44\x29\xa3\x54\x51\xea\x28\x4d\x94\x36\x4a\x17\xa5\x8f\x32\x44\x19\xa3\x4c\x51\xe6\x28\x4b\x94\x35\xca\x16\x65\x8f\x72\x44\x39\xa3\x5c\x51\xee\x28\x4f\x94\x37\xca\x17\xe5\x8f\x0a\x44\x05\xa3\x42\x51\xe1\xa8\x48\x54\x34\x2a\x16\x15\x8f\x4a\x44\x25\xa3\x52\x51\xe9\xa8\x4c\x54\x36\x2a\x17\x95\x8f\x2a\x44\x15\xa3\x4a\x51\xe5\xa8\x4a\x54\x35\xaa\x16\x55\x8f\x6a\x44\x35\xa3\x5a\x51\xed\xa8\x4e\x54\x37\xaa\x17\xd5\x8f\x1a\x44\x0d\xa3\x46\x51\xe3\xa8\x49\xd4\x34\x6a\x16\x35\x8f\x5a\x44\x2d\xa3\x56\x51\xeb\xa8\x4d\xd4\x36\x6a\x17\xb5\x8f\x3a\x44\x1d\xa3\x4e\x51\xe7\xa8\x4b\xd4\x35\xea\x16\x75\x8f\x7a\x44\x3d\xa3\x5e\x51\xef\xa8\x4f\xd4\x37\xea\x17\x61\x11\x1e\x11\x11\x19\x51\x11\x1d\x31\x11\x1b\x71\x11\x1f\x09\x91\x18\x49\x91\x1c\x29\x91\x1a\x69\x91\x1e\x19\x91\x19\x59\x91\x1d\x39\x91\x1b\x79\x91\x1f\x05\x51\x18\x45\x11\x88\x60\x84\xa2\x58\xd4\x3f\x1a\x10\x0d\x8c\x06\x45\x83\xa3\x21\xd1\xd0\x68\x58\x34\x3c\x1a\x11\x8d\x8c\x46\x45\xa3\xa3\x31\xd1\xd8\x68\x5c\x34\x3e\x9a\x10\x4d\x8c\x26\x45\x93\xa3\x29\xd1\xd4\x68\x5a\x34\x3d\x9a\x11\xcd\x8c\x66\x45\xb3\xa3\x39\xd1\xdc\x68\x5e\x34\x3f\x5a\x10\x2d\x8c\x16\x45\x8b\xa3\x25\xd1\xd2\x68\x59\xb4\x3c\x5a\x11\xad\x8c\x56\x45\xab\xa3\x35\xd1\xda\x68\x5d\xb4\x3e\xda\x10\x6d\x8c\x36\x45\x9b\xa3\x2d\xd1\xd6\x68\x5b\xb4\x3d\xda\x11\xed\x8c\x76\x45\xbb\xa3\x3d\xd1\xde\x68\x5f\xb4\x3f\x3a\x10\x1d\x8c\x0e\x45\x87\xa3\x23\xd1\xd1\xe8\x58\x74\x3c\x3a\x11\x9d\x8c\x4e\x45\xa7\xa3\x33\xd1\xd9\xe8\x5c\x74\x3e\xba\x10\x5d\x8c\x2e\x45\x97\xa3\x2b\xd1\xd5\xe8\x5a\x74\x3d\xba\x11\xdd\x8c\x6e\x45\xb7\xa3\x3b\xd1\xdd\xe8\x5e\x74\x3f\x7a\x10\x3d\x8c\x1e\x45\x8f\xa3\x27\xd1\xd3\xe8\x59\xf4\x3c\x7a\x11\xbd\x8c\x5e\x45\xaf\xa3\x37\xd1\xdb\xe8\x5d\xf4\x3e\xfa\x10\x7d\x8c\x3e\x45\x9f\xa3\x2f\xd1\xd7\xe8\x5b\xf4\x3d\xfa\x11\xfd\x8c\x7e\x45\xbf\xa3\x3f\xd1\xdf\xe8\x5f\x14\x17\xc5\x47\x09\x51\x22\x48\x02\x92\x82\x64\x20\x39\x48\x01\x52\x82\x54\x20\x35\x48\x03\xd2\x82\x74\x20\x3d\xc8\x00\x32\x82\x4c\x20\x33\xc8\x02\xb2\x82\x6c\x20\x3b\xc8\x01\x72\x82\x5c\x20\x37\xc8\x03\xf2\x82\x7c\x20\x3f\x28\x00\x0a\x82\x42\xa0\x30\x28\x02\x8a\x82\x62\xa0\x38\x28\x01\x4a\x82\x52\xa0\x34\x28\x03\xca\x82\x72\xa0\x3c\xa8\x00\x2a\x82\x4a\xa0\x32\xa8\x02\xaa\x82\x6a\xa0\x3a\xa8\x01\x6a\x82\x5a\xa0\x36\xa8\x03\xea\x82\x7a\xa0\x3e\x68\x00\x1a\x82\x46\xa0\x31\x68\x02\x9a\x82\x66\xa0\x39\x68\x01\x5a\x82\x56\xa0\x35\x68\x03\xda\x82\x76\xa0\x3d\xe8\x00\x3a\x82\x4e\xa0\x33\xe8\x02\xba\x82\x6e\xa0\x3b\xe8\x01\x7a\x82\x5e\xa0\x37\xe8\x03\xfa\x82\x7e\x00\x03\x38\x20\x00\x09\x28\x40\x03\x06\xb0\x80\x03\x3c\x10\x80\x08\x24\x20\x03\x05\xa8\x40\x03\x3a\x30\x80\x09\x2c\x60\x03\x07\xb8\xc0\x03\x3e\x08\x40\x08\x22\x00\x00\x04\x08\xc4\x40\x7f\x30\x00\x0c\x04\x83\xc0\x60\x30\x04\x0c\x05\xc3\xc0\x70\x30\x02\x8c\x04\xa3\xc0\x68\x30\x06\x8c\x05\xe3\xc0\x78\x30\x01\x4c\x04\x93\xc0\x64\x30\x05\x4c\x05\xd3\xc0\x74\x30\x03\xcc\x04\xb3\xc0\x6c\x30\x07\xcc\x05\xf3\xc0\x7c\xb0\x00\x2c\x04\x8b\xc0\x62\xb0\x04\x2c\x05\xcb\xc0\x72\xb0\x02\xac\x04\xab\xc0\x6a\xb0\x06\xac\x05\xeb\xc0\x7a\xb0\x01\x6c\x04\x9b\xc0\x66\xb0\x05\x6c\x05\xdb\xc0\x76\xb0\x03\xec\x04\xbb\xc0\x6e\xb0\x07\xec\x05\xfb\xc0\x7e\x70\x00\x1c\x04\x87\xc0\x61\x70\x04\x1c\x05\xc7\xc0\x71\x70\x02\x9c\x04\xa7\xc0\x69\x70\x06\x9c\x05\xe7\xc0\x79\x70\x01\x5c\x04\x97\xc0\x65\x70\x05\x5c\x05\xd7\xc0\x75\x70\x03\xdc\x04\xb7\xc0\x6d\x70\x07\xdc\x05\xf7\xc0\x7d\xf0\x00\x3c\x04\x8f\xc0\x63\xf0\x04\x3c\x05\xcf\xc0\x73\xf0\x02\xbc\x04\xaf\xc0\x6b\xf0\x06\xbc\x05\xef\xc0\x7b\xf0\x01\x7c\x04\x9f\xc0\x67\xf0\x05\x7c\x05\xdf\xc0\x77\xf0\x03\xfc\x04\xbf\xc0\x6f\xf0\x07\xfc\x05\xff\x40\x1c\x88\x07\x09\x20\x11\x26\x81\x49\x61\x32\x98\x1c\xa6\x80\x29\x61\x2a\x98\x1a\xa6\x81\x69\x61\x3a\x98\x1e\x66\x80\x19\x61\x26\x98\x19\x66\x81\x59\x61\x36\x98\x1d\xe6\x80\x39\x61\x2e\x98\x1b\xe6\x81\x79\x61\x3e\x98\x1f\x16\x80\x05\x61\x21\x58\x18\x16\x81\x45\x61\x31\x58\x1c\x96\x80\x25\x61\x29\x58\x1a\x96\x81\x65\x61\x39\x58\x1e\x56\x80\x15\x61\x25\x58\x19\x56\x81\x55\x61\x35\x58\x1d\xd6\x80\x35\x61\x2d\x58\x1b\xd6\x81\x75\x61\x3d\x58\x1f\x36\x80\x0d\x61\x23\xd8\x18\x36\x81\x4d\x61\x33\xd8\x1c\xb6\x80\x2d\x61\x2b\xd8\x1a\xb6\x81\x6d\x61\x3b\xd8\x1e\x76\x80\x1d\x61\x27\xd8\x19\x76\x81\x5d\x61\x37\xd8\x1d\xf6\x80\x3d\x61\x2f\xd8\x1b\xf6\x81\x7d\x61\x3f\x88\x41\x1c\x12\x90\x84\x14\xa4\x21\x03\x59\xc8\x41\x1e\x0a\x50\x84\x12\x94\xa1\x02\x55\xa8\x41\x1d\x1a\xd0\x84\x16\xb4\xa1\x03\x5d\xe8\x41\x1f\x06\x30\x84\x11\x04\x10\x42\x04\x63\xb0\x3f\x1c\x00\x07\xc2\x41\x70\x30\x1c\x02\x87\xc2\x61\x70\x38\x1c\x01\x47\xc2\x51\x70\x34\x1c\x03\xc7\xc2\x71\x70\x3c\x9c\x00\x27\xc2\x49\x70\x32\x9c\x02\xa7\xc2\x69\x70\x3a\x9c\x01\x67\xc2\x59\x70\x36\x9c\x03\xe7\xc2\x79\x70\x3e\x5c\x00\x17\xc2\x45\x70\x31\x5c\x02\x97\xc2\x65\x70\x39\x5c\x01\x57\xc2\x55\x70\x35\x5c\x03\xd7\xc2\x75\x70\x3d\xdc\x00\x37\xc2\x4d\x70\x33\xdc\x02\xb7\xc2\x6d\x70\x3b\xdc\x01\x77\xc2\x5d\x70\x37\xdc\x03\xf7\xc2\x7d\x70\x3f\x3c\x00\x0f\xc2\x43\xf0\x30\x3c\x02\x8f\xc2\x63\xf0\x38\x3c\x01\x4f\xc2\x53\xf0\x34\x3c\x03\xcf\xc2\x73\xf0\x3c\xbc\x00\x2f\xc2\x4b\xf0\x32\xbc\x02\xaf\xc2\x6b\xf0\x3a\xbc\x01\x6f\xc2\x5b\xf0\x36\xbc\x03\xef\xc2\x7b\xf0\x3e\x7c\x00\x1f\xc2\x47\xf0\x31\x7c\x02\x9f\xc2\x67\xf0\x39\x7c\x01\x5f\xc2\x57\xf0\x35\x7c\x03\xdf\xc2\x77\xf0\x3d\xfc\x00\x3f\xc2\x4f\xf0\x33\xfc\x02\xbf\xc2\x6f\xf0\x3b\xfc\x01\x7f\xc2\x5f\xf0\x37\xfc\x03\xff\xc2\x7f\x30\x0e\xc6\xc3\x04\x98\x88\x92\xa0\xa4\x28\x19\x4a\x8e\x52\xa0\x94\x28\x15\x4a\x8d\xd2\xa0\xb4\x28\x1d\x4a\x8f\x32\xa0\x8c\x28\x13\xca\x8c\xb2\xa0\xac\x28\x1b\xca\x8e\x72\xa0\x9c\x28\x17\xca\x8d\xf2\xa0\xbc\x28\x1f\xca\x8f\x0a\xa0\x82\xa8\x10\x2a\x8c\x8a\xa0\xa2\xa8\x18\x2a\x8e\x4a\xa0\x92\xa8\x14\x2a\x8d\xca\xa0\xb2\xa8\x1c\x2a\x8f\x2a\xa0\x8a\xa8\x12\xaa\x8c\xaa\xa0\xaa\xa8\x1a\xaa\x8e\x6a\xa0\x9a\xa8\x16\xaa\x8d\xea\xa0\xba\xa8\x1e\xaa\x8f\x1a\xa0\x86\xa8\x11\x6a\x8c\x9a\xa0\xa6\xa8\x19\x6a\x8e\x5a\xa0\x96\xa8\x15\x6a\x8d\xda\xa0\xb6\xa8\x1d\x6a\x8f\x3a\xa0\x8e\xa8\x13\xea\x8c\xba\xa0\xae\xa8\x1b\xea\x8e\x7a\xa0\x9e\xa8\x17\xea\x8d\xfa\xa0\xbe\xa8\x1f\xc2\x10\x8e\x08\x44\x22\x0a\xd1\x88\x41\x2c\xe2\x10\x8f\x04\x24\x22\x09\xc9\x48\x41\x2a\xd2\x90\x8e\x0c\x64\x22\x0b\xd9\xc8\x41\x2e\xf2\x90\x8f\x02\x14\xa2\x08\x01\x04\x11\x42\x31\xd4\x1f\x0d\x40\x03\xd1\x20\x34\x18\x0d\x41\x43\xd1\x30\x34\x1c\x8d\x40\x23\xd1\x28\x34\x1a\x8d\x41\x63\xd1\x38\x34\x1e\x4d\x40\x13\xd1\x24\x34\x19\x4d\x41\x53\xd1\x34\x34\x1d\xcd\x40\x33\xd1\x2c\x34\x1b\xcd\x41\x73\xd1\x3c\x34\x1f\x2d\x40\x0b\xd1\x22\xb4\x18\x2d\x41\x4b\xd1\x32\xb4\x1c\xad\x40\x2b\xd1\x2a\xb4\x1a\xad\x41\x6b\xd1\x3a\xb4\x1e\x6d\x40\x1b\xd1\x26\xb4\x19\x6d\x41\x5b\xd1\x36\xb4\x1d\xed\x40\x3b\xd1\x2e\xb4\x1b\xed\x41\x7b\xd1\x3e\xb4\x1f\x1d\x40\x07\xd1\x21\x74\x18\x1d\x41\x47\xd1\x31\x74\x1c\x9d\x40\x27\xd1\x29\x74\x1a\x9d\x41\x67\xd1\x39\x74\x1e\x5d\x40\x17\xd1\x25\x74\x19\x5d\x41\x57\xd1\x35\x74\x1d\xdd\x40\x37\xd1\x2d\x74\x1b\xdd\x41\x77\xd1\x3d\x74\x1f\x3d\x40\x0f\xd1\x23\xf4\x18\x3d\x41\x4f\xd1\x33\xf4\x1c\xbd\x40\x2f\xd1\x2b\xf4\x1a\xbd\x41\x6f\xd1\x3b\xf4\x1e\x7d\x40\x1f\xd1\x27\xf4\x19\x7d\x41\x5f\xd1\x37\xf4\x1d\xfd\x40\x3f\xd1\x2f\xf4\x1b\xfd\x41\x7f\xd1\x3f\x14\x87\xe2\x51\x02\x4a\x8c\x25\x89\x25\x8d\x25\x8b\x25\x8f\xa5\x88\xa5\x8c\xa5\x8a\xa5\x8e\xa5\x89\xa5\x8d\xa5\x8b\xa5\x8f\x65\x88\x65\x8c\x65\x8a\x65\x8e\x65\x89\x65\x8d\x65\x8b\x65\x8f\xe5\x88\xe5\x8c\xe5\x8a\xe5\x8e\xe5\x89\xe5\x8d\xe5\x8b\xe5\x8f\x15\x88\x15\x8c\x15\x8a\x15\x8e\x15\x89\x15\x8d\x15\x8b\x15\x8f\x95\x88\x95\x8c\x95\x8a\x95\x8e\x95\x89\x95\x8d\x95\x8b\x95\x8f\x55\x88\x55\x8c\x55\x8a\x55\x8e\x55\x89\x55\x8d\x55\x8b\x55\x8f\xd5\x88\xd5\x8c\xd5\x8a\xd5\x8e\xd5\x89\xd5\x8d\xd5\x8b\xd5\x8f\x35\x88\x35\x8c\x35\x8a\x35\x8e\x35\x89\x35\x8d\x35\x8b\x35\x8f\xb5\x88\xb5\x8c\xb5\x8a\xb5\x8e\xb5\x89\xb5\x8d\xb5\x8b\xb5\x8f\x75\x88\x75\x8c\x75\x8a\x75\x8e\x75\x89\x75\x8d\x75\xfb\x4f\x00\x3c\x00\xd6\x99\x03\x00\x00\x6e\x67\xdb\xb6\x6d\xdb\xde\xcd\xb6\x6d\xfc\xb6\xad\x24\x6f\xb6\x6d\xdb\xb6\x6d\xdb\x6d\xef\xc3\xba\x61\xdd\xb1\x1e\x58\x4f\xac\x17\xd6\x1b\xeb\x83\xf5\xc5\xfa\x61\xfd\xb1\x01\xd8\x40\x6c\x10\x36\x18\x1b\x82\x0d\xc5\x86\x61\xc3\xb1\x11\xd8\x48\x6c\x14\x36\x1a\x1b\x83\x8d\xc5\xc6\x61\xe3\xb1\x09\xd8\x44\x6c\x12\x36\x19\x9b\x82\x4d\xc5\xa6\x61\xd3\xb1\x19\xd8\x4c\x6c\x16\x36\x1b\x9b\x83\xcd\xc5\x30\x0c\xc7\x08\x8c\xc4\x28\x8c\xc6\x18\x8c\xc5\x38\x8c\xc7\x04\x4c\xc4\x24\x4c\xc6\x14\x4c\xc5\x34\x4c\xc7\x0c\xcc\xc4\x2c\xcc\xc6\x1c\xcc\xc5\x3c\xcc\xc7\x02\x2c\xc4\x22\x0c\x60\x10\x43\x58\x0c\x9b\x87\xcd\xc7\x16\x60\x0b\xb1\x45\xd8\x62\x6c\x09\xb6\x14\x5b\x86\x2d\xc7\x56\x60\x2b\xb1\x55\xd8\x6a\x6c\x0d\xb6\x16\x5b\x87\xad\xc7\x36\x60\x1b\xb1\x4d\xd8\x66\x6c\x0b\xb6\x15\xdb\x86\x6d\xc7\x76\x60\x3b\xb1\x5d\xd8\x6e\x6c\x0f\xb6\x17\xdb\x87\xed\xc7\x0e\x60\x07\xb1\x43\xd8\x61\xec\x08\x76\x14\x3b\x86\x1d\xc7\x4e\x60\x27\xb1\x53\xd8\x69\xec\x0c\x76\x16\x3b\x87\x9d\xc7\x2e\x60\x17\xb1\x4b\xd8\x65\xec\x0a\x76\x15\xbb\x86\x5d\xc7\x6e\x60\x37\xb1\x5b\xd8\x6d\xec\x0e\x76\x17\xbb\x87\xdd\xc7\x1e\x60\x0f\xb1\x47\xd8\x63\xec\x09\xf6\x14\x7b\x86\x3d\xc7\x5e\x60\x2f\xb1\x57\xd8\x6b\xec\x0d\xf6\x16\x7b\x87\xbd\xc7\x3e\x60\x1f\xb1\x4f\xd8\x67\xec\x0b\xf6\x15\xfb\x86\x7d\xc7\x7e\x60\x3f\xb1\x5f\xd8\x6f\xec\x0f\xf6\x17\xfb\x87\x25\x60\x89\x58\x12\x1e\x87\xc7\xe3\xc9\xf0\xe4\x78\x0a\x3c\x25\x9e\x0a\x4f\x8d\xa7\xc1\xd3\xe2\xe9\xf0\xf4\x78\x06\x3c\x23\x9e\x09\xcf\x8c\x67\xc1\xb3\xe2\xd9\xf0\xec\x78\x0e\x3c\x27\x9e\x0b\xcf\x8d\xe7\xc1\xf3\xe2\xf9\xf0\xfc\x78\x01\xbc\x20\x5e\x08\x2f\x8c\x17\xc1\x8b\xe2\xc5\xf0\xe2\x78\x09\xbc\x24\x5e\x0a\x2f\x8d\x97\xc1\xcb\xe2\xe5\xf0\xf2\x78\x05\xbc\x22\x5e\x09\xaf\x8c\x57\xc1\xab\xe2\xd5\xf0\xea\x78\x0d\xbc\x26\x5e\x0b\xaf\x8d\xd7\xc1\xeb\xe2\xf5\xf0\xfa\x78\x03\xbc\x21\xde\x08\x6f\x8c\x37\xc1\x9b\xe2\xcd\xf0\xe6\x78\x0b\xbc\x25\xde\x0a\x6f\x8d\xb7\xc1\xdb\xe2\xed\xf0\xf6\x78\x07\xbc\x23\xde\x09\xef\x8c\x77\xc1\xbb\xe2\xff\xe1\xdd\xf0\xee\x78\x0f\xbc\x27\xde\x0b\xef\x8d\xf7\xc1\xfb\xe2\xfd\xf0\xfe\xf8\x00\x7c\x20\x3e\x08\x1f\x8c\x0f\xc1\x87\xe2\xc3\xf0\xe1\xf8\x08\x7c\x24\x3e\x0a\x1f\x8d\x8f\xc1\xc7\xe2\xe3\xf0\xf1\xf8\x04\x7c\x22\x3e\x09\x9f\x8c\x4f\xc1\xa7\xe2\xd3\xf0\xe9\xf8\x0c\x7c\x26\x3e\x0b\x9f\x8d\xcf\xc1\xe7\xe2\x18\x8e\xe3\x04\x4e\xe2\x14\x4e\xe3\x0c\xce\xe2\x1c\xce\xe3\x02\x2e\xe2\x12\x2e\xe3\x0a\xae\xe2\x1a\xae\xe3\x06\x6e\xe2\x16\x6e\xe3\x0e\xee\xe2\x1e\xee\xe3\x01\x1e\xe2\x11\x0e\x70\x88\x23\x3c\x86\xcf\xc3\xe7\xe3\x0b\xf0\x85\xf8\x22\x7c\x31\xbe\x04\x5f\x8a\x2f\xc3\x97\xe3\x2b\xf0\x95\xf8\x2a\x7c\x35\xbe\x06\x5f\x8b\xaf\xc3\xd7\xe3\x1b\xf0\x8d\xf8\x26\x7c\x33\xbe\x05\xdf\x8a\x6f\xc3\xb7\xe3\x3b\xf0\x9d\xf8\x2e\x7c\x37\xbe\x07\xdf\x8b\xef\xc3\xf7\xe3\x07\xf0\x83\xf8\x21\xfc\x30\x7e\x04\x3f\x8a\x1f\xc3\x8f\xe3\x27\xf0\x93\xf8\x29\xfc\x34\x7e\x06\x3f\x8b\x9f\xc3\xcf\xe3\x17\xf0\x8b\xf8\x25\xfc\x32\x7e\x05\xbf\x8a\x5f\xc3\xaf\xe3\x37\xf0\x9b\xf8\x2d\xfc\x36\x7e\x07\xbf\x8b\xdf\xc3\xef\xe3\x0f\xf0\x87\xf8\x23\xfc\x31\xfe\x04\x7f\x8a\x3f\xc3\x9f\xe3\x2f\xf0\x97\xf8\x2b\xfc\x35\xfe\x06\x7f\x8b\xbf\xc3\xdf\xe3\x1f\xf0\x8f\xf8\x27\xfc\x33\xfe\x05\xff\x8a\x7f\xc3\xbf\xe3\x3f\xf0\x9f\xf8\x2f\xfc\x37\xfe\x07\xff\x8b\xff\xc3\x13\xf0\x44\x3c\x89\x88\x23\xe2\x89\x64\x44\x72\x22\x05\x91\x92\x48\x45\xa4\x26\xd2\x10\x69\x89\x74\x44\x7a\x22\x03\x91\x91\xc8\x44\x64\x26\xb2\x10\x59\x89\x6c\x44\x76\x22\x07\x91\x93\xc8\x45\xe4\x26\xf2\x10\x79\x89\x7c\x44\x7e\xa2\x00\x51\x90\x28\x44\x14\x26\x8a\x10\x45\x89\x62\x44\x71\xa2\x04\x51\x92\x28\x45\x94\x26\xca\x10\x65\x89\x72\x44\x79\xa2\x02\x51\x91\xa8\x44\x54\x26\xaa\x10\x55\x89\x6a\x44\x75\xa2\x06\x51\x93\xa8\x45\xd4\x26\xea\x10\x75\x89\x7a\x44\x7d\xa2\x01\xd1\x90\x68\x44\x34\x26\x9a\x10\x4d\x89\x66\x44\x73\xa2\x05\xd1\x92\x68\x45\xb4\x26\xda\x10\x6d\x89\x76\x44\x7b\xa2\x03\xd1\x91\xe8\x44\x74\x26\xba\x10\x5d\x89\xff\x88\x6e\x44\x77\xa2\x07\xd1\x93\xe8\x45\xf4\x26\xfa\x10\x7d\x89\x7e\x44\x7f\x62\x00\x31\x90\x18\x44\x0c\x26\x86\x10\x43\x89\x61\xc4\x70\x62\x04\x31\x92\x18\x45\x8c\x26\xc6\x10\x63\x89\x71\xc4\x78\x62\x02\x31\x91\x98\x44\x4c\x26\xa6\x10\x53\x89\x69\xc4\x74\x62\x06\x31\x93\x98\x45\xcc\x26\xe6\x10\x73\x09\x8c\xc0\x09\x82\x20\x09\x8a\xa0\x09\x86\x60\x09\x8e\xe0\x09\x81\x10\x09\x89\x90\x09\x85\x50\x09\x8d\xd0\x09\x83\x30\x09\x8b\xb0\x09\x87\x70\x09\x8f\xf0\x89\x80\x08\x89\x88\x00\x04\x24\x10\x11\x23\xe6\x11\xf3\x89\x05\xc4\x42\x62\x11\xb1\x98\x58\x42\x2c\x25\x96\x11\xcb\x89\x15\xc4\x4a\x62\x15\xb1\x9a\x58\x43\xac\x25\xd6\x11\xeb\x89\x0d\xc4\x46\x62\x13\xb1\x99\xd8\x42\x6c\x25\xb6\x11\xdb\x89\x1d\xc4\x4e\x62\x17\xb1\x9b\xd8\x43\xec\x25\xf6\x11\xfb\x89\x03\xc4\x41\xe2\x10\x71\x98\x38\x42\x1c\x25\x8e\x11\xc7\x89\x13\xc4\x49\xe2\x14\x71\x9a\x38\x43\x9c\x25\xce\x11\xe7\x89\x0b\xc4\x45\xe2\x12\x71\x99\xb8\x42\x5c\x25\xae\x11\xd7\x89\x1b\xc4\x4d\xe2\x16\x71\x9b\xb8\x43\xdc\x25\xee\x11\xf7\x89\x07\xc4\x43\xe2\x11\xf1\x98\x78\x42\x3c\x25\x9e\x11\xcf\x89\x17\xc4\x4b\xe2\x15\xf1\x9a\x78\x43\xbc\x25\xde\x11\xef\x89\x0f\xc4\x47\xe2\x13\xf1\x99\xf8\x42\x7c\x25\xbe\x11\xdf\x89\x1f\xc4\x4f\xe2\x17\xf1\x9b\xf8\x43\xfc\x25\xfe\x11\x09\x44\x22\x91\x44\xc6\x91\xf1\x64\x32\x32\x39\x99\x82\x4c\x49\xa6\x22\x53\x93\x69\xc8\xb4\x64\x3a\x32\x3d\x99\x81\xcc\x48\x66\x22\x33\x93\x59\xc8\xac\x64\x36\x32\x3b\x99\x83\xcc\x49\xe6\x22\x73\x93\x79\xc8\xbc\x64\x3e\x32\x3f\x59\x80\x2c\x48\x16\x22\x0b\x93\x45\xc8\xa2\x64\x31\xb2\x38\x59\x82\x2c\x49\x96\x22\x4b\x93\x65\xc8\xb2\x64\x39\xb2\x3c\x59\x81\xac\x48\x56\x22\x2b\x93\x55\xc8\xaa\x64\x35\xb2\x3a\x59\x83\xac\x49\xd6\x22\x6b\x93\x75\xc8\xba\x64\x3d\xb2\x3e\xd9\x80\x6c\x48\x36\x22\x1b\x93\x4d\xc8\xa6\x64\x33\xb2\x39\xd9\x82\x6c\x49\xb6\x22\x5b\x93\x6d\xc8\xb6\x64\x3b\xb2\x3d\xd9\x81\xec\x48\x76\x22\x3b\x93\x5d\xc8\xae\xe4\x7f\x64\x37\xb2\x3b\xd9\x83\xec\x49\xf6\x22\x7b\x93\x7d\xc8\xbe\x64\x3f\xb2\x3f\x39\x80\x1c\x48\x0e\x22\x07\x93\x43\xc8\xa1\xe4\x30\x72\x38\x39\x82\x1c\x49\x8e\x22\x47\x93\x63\xc8\xb1\xe4\x38\x72\x3c\x39\x81\x9c\x48\x4e\x22\x27\x93\x53\xc8\xa9\xe4\x34\x72\x3a\x39\x83\x9c\x49\xce\x22\x67\x93\x73\xc8\xb9\x24\x46\xe2\x24\x41\x92\x24\x45\xd2\x24\x43\xb2\x24\x47\xf2\xa4\x40\x8a\xa4\x44\xca\xa4\x42\xaa\xa4\x46\xea\xa4\x41\x9a\xa4\x45\xda\xa4\x43\xba\xa4\x47\xfa\x64\x40\x86\x64\x44\x02\x12\x92\x88\x8c\x91\xf3\xc8\xf9\xe4\x02\x72\x21\xb9\x88\x5c\x4c\x2e\x21\x97\x92\xcb\xc8\xe5\xe4\x0a\x72\x25\xb9\x8a\x5c\x4d\xae\x21\xd7\x92\xeb\xc8\xf5\xe4\x06\x72\x23\xb9\x89\xdc\x4c\x6e\x21\xb7\x92\xdb\xc8\xed\xe4\x0e\x72\x27\xb9\x8b\xdc\x4d\xee\x21\xf7\x92\xfb\xc8\xfd\xe4\x01\xf2\x20\x79\x88\x3c\x4c\x1e\x21\x8f\x92\xc7\xc8\xe3\xe4\x09\xf2\x24\x79\x8a\x3c\x4d\x9e\x21\xcf\x92\xe7\xc8\xf3\xe4\x05\xf2\x22\x79\x89\xbc\x4c\x5e\x21\xaf\x92\xd7\xc8\xeb\xe4\x0d\xf2\x26\x79\x8b\xbc\x4d\xde\x21\xef\x92\xf7\xc8\xfb\xe4\x03\xf2\x21\xf9\x88\x7c\x4c\x3e\x21\x9f\x92\xcf\xc8\xe7\xe4\x0b\xf2\x25\xf9\x8a\x7c\x4d\xbe\x21\xdf\x92\xef\xc8\xf7\xe4\x07\xf2\x23\xf9\x89\xfc\x4c\x7e\x21\xbf\x92\xdf\xc8\xef\xe4\x0f\xf2\x27\xf9\x8b\xfc\x4d\xfe\x21\xff\x92\xff\xc8\x04\x32\x91\x4c\xa2\xe2\xa8\x78\x2a\x19\x95\x9c\x4a\x41\xa5\xa4\x52\x51\xa9\xa9\x34\x54\x5a\x2a\x1d\x95\x9e\xca\x40\x65\xa4\x32\x51\x99\xa9\x2c\x54\x56\x2a\x1b\x95\x9d\xca\x41\xe5\xa4\x72\x51\xb9\xa9\x3c\x54\x5e\x2a\x1f\x95\x9f\x2a\x40\x15\xa4\x0a\x51\x85\xa9\x22\x54\x51\xaa\x18\x55\x9c\x2a\x41\x95\xa4\x4a\x51\xa5\xa9\x32\x54\x59\xaa\x1c\x55\x9e\xaa\x40\x55\xa4\x2a\x51\x95\xa9\x2a\x54\x55\xaa\x1a\x55\x9d\xaa\x41\xd5\xa4\x6a\x51\xb5\xa9\x3a\x54\x5d\xaa\x1e\x55\x9f\x6a\x40\x35\xa4\x1a\x51\x8d\xa9\x26\x54\x53\xaa\x19\xd5\x9c\x6a\x41\xb5\xa4\x5a\x51\xad\xa9\x36\x54\x5b\xaa\x1d\xd5\x9e\xea\x40\x75\xa4\x3a\x51\x9d\xa9\x2e\x54\x57\xea\x3f\xaa\x1b\xd5\x9d\xea\x41\xf5\xa4\x7a\x51\xbd\xa9\x3e\x54\x5f\xaa\x1f\xd5\x9f\x1a\x40\x0d\xa4\x06\x51\x83\xa9\x21\xd4\x50\x6a\x18\x35\x9c\x1a\x41\x8d\xa4\x46\x51\xa3\xa9\x31\xd4\x58\x6a\x1c\x35\x9e\x9a\x40\x4d\xa4\x26\x51\x93\xa9\x29\xd4\x54\x6a\x1a\x35\x9d\x9a\x41\xcd\xa4\x66\x51\xb3\xa9\x39\xd4\x5c\x0a\xa3\x70\x8a\xa0\x48\x8a\xa2\x68\x8a\xa1\x58\x8a\xa3\x78\x4a\xa0\x44\x4a\xa2\x64\x4a\xa1\x54\x4a\xa3\x74\xca\xa0\x4c\xca\xa2\x6c\xca\xa1\x5c\xca\xa3\x7c\x2a\xa0\x42\x2a\xa2\x00\x05\x29\x44\xc5\xa8\x79\xd4\x7c\x6a\x01\xb5\x90\x5a\x44\x2d\xa6\x96\x50\x4b\xa9\x65\xd4\x72\x6a\x05\xb5\x92\x5a\x45\xad\xa6\xd6\x50\x6b\xa9\x75\xd4\x7a\x6a\x03\xb5\x91\xda\x44\x6d\xa6\xb6\x50\x5b\xa9\x6d\xd4\x76\x6a\x07\xb5\x93\xda\x45\xed\xa6\xf6\x50\x7b\xa9\x7d\xd4\x7e\xea\x00\x75\x90\x3a\x44\x1d\xa6\x8e\x50\x47\xa9\x63\xd4\x71\xea\x04\x75\x92\x3a\x45\x9d\xa6\xce\x50\x67\xa9\x73\xd4\x79\xea\x02\x75\x91\xba\x44\x5d\xa6\xae\x50\x57\xa9\x6b\xd4\x75\xea\x06\x75\x93\xba\x45\xdd\xa6\xee\x50\x77\xa9\x7b\xd4\x7d\xea\x01\xf5\x90\x7a\x44\x3d\xa6\x9e\x50\x4f\xa9\x67\xd4\x73\xea\x05\xf5\x92\x7a\x45\xbd\xa6\xde\x50\x6f\xa9\x77\xd4\x7b\xea\x03\xf5\x91\xfa\x44\x7d\xa6\xbe\x50\x5f\xa9\x6f\xd4\x77\xea\x07\xf5\x93\xfa\x45\xfd\xa6\xfe\x50\x7f\xa9\x7f\x54\x02\x95\x48\x25\xd1\x71\x74\x3c\x9d\x8c\x4e\x4e\xa7\xa0\x53\xd2\xa9\xe8\xd4\x74\x1a\x3a\x2d\x9d\x8e\x4e\x4f\x67\xa0\x33\xd2\x99\xe8\xcc\x74\x16\x3a\x2b\x9d\x8d\xce\x4e\xe7\xa0\x73\xd2\xb9\xe8\xdc\x74\x1e\x3a\x2f\x9d\x8f\xce\x4f\x17\xa0\x0b\xd2\x85\xe8\xc2\x74\x11\xba\x28\x5d\x8c\x2e\x4e\x97\xa0\x4b\xd2\xa5\xe8\xd2\x74\x19\xba\x2c\x5d\x8e\x2e\x4f\x57\xa0\x2b\xd2\x95\xe8\xca\x74\x15\xba\x2a\x5d\x8d\xae\x4e\xd7\xa0\x6b\xd2\xb5\xe8\xda\x74\x1d\xba\x2e\x5d\x8f\xae\x4f\x37\xa0\x1b\xd2\x8d\xe8\xc6\x74\x13\xba\x29\xdd\x8c\x6e\x4e\xb7\xa0\x5b\xd2\xad\xe8\xd6\x74\x1b\xba\x2d\xdd\x8e\x6e\x4f\x77\xa0\x3b\xd2\x9d\xe8\xce\x74\x17\xba\x2b\xfd\x1f\xdd\x8d\xee\x4e\xf7\xa0\x7b\xd2\xbd\xe8\xde\x74\x1f\xba\x2f\xdd\x8f\xee\x4f\x0f\xa0\x07\xd2\x83\xe8\xc1\xf4\x10\x7a\x28\x3d\x8c\x1e\x4e\x8f\xa0\x47\xd2\xa3\xe8\xd1\xf4\x18\x7a\x2c\x3d\x8e\x1e\x4f\x4f\xa0\x27\xd2\x93\xe8\xc9\xf4\x14\x7a\x2a\x3d\x8d\x9e\x4e\xcf\xa0\x67\xd2\xb3\xe8\xd9\xf4\x1c\x7a\x2e\x8d\xd1\x38\x4d\xd0\x24\x4d\xd1\x34\xcd\xd0\x2c\xcd\xd1\x3c\x2d\xd0\x22\x2d\xd1\x32\xad\xd0\x2a\xad\xd1\x3a\x6d\xd0\x26\x6d\xd1\x36\xed\xd0\x2e\xed\xd1\x3e\x1d\xd0\x21\x1d\xd1\x80\x86\x34\xa2\x63\xf4\x3c\x7a\x3e\xbd\x80\x5e\x48\x2f\xa2\x17\xd3\x4b\xe8\xa5\xf4\x32\x7a\x39\xbd\x82\x5e\x49\xaf\xa2\x57\xd3\x6b\xe8\xb5\xf4\x3a\x7a\x3d\xbd\x81\xde\x48\x6f\xa2\x37\xd3\x5b\xe8\xad\xf4\x36\x7a\x3b\xbd\x83\xde\x49\xef\xa2\x77\xd3\x7b\xe8\xbd\xf4\x3e\x7a\x3f\x7d\x80\x3e\x48\x1f\xa2\x0f\xd3\x47\xe8\xa3\xf4\x31\xfa\x38\x7d\x82\x3e\x49\x9f\xa2\x4f\xd3\x67\xe8\xb3\xf4\x39\xfa\x3c\x7d\x81\xbe\x48\x5f\xa2\x2f\xd3\x57\xe8\xab\xf4\x35\xfa\x3a\x7d\x83\xbe\x49\xdf\xa2\x6f\xd3\x77\xe8\xbb\xf4\x3d\xfa\x3e\xfd\x80\x7e\x48\x3f\xa2\x1f\xd3\x4f\xe8\xa7\xf4\x33\xfa\x39\xfd\x82\x7e\x49\xbf\xa2\x5f\xd3\x6f\xe8\xb7\xf4\x3b\xfa\x3d\xfd\x81\xfe\x48\x7f\xa2\x3f\xd3\x5f\xe8\xaf\xf4\x37\xfa\x3b\xfd\x83\xfe\x49\xff\xa2\x7f\xd3\x7f\xe8\xbf\xf4\x3f\x3a\x81\x4e\xa4\x93\x98\x38\x26\x9e\x49\xc6\x24\x67\x52\x30\x29\x99\x54\x4c\x6a\x26\x0d\x93\x96\x49\xc7\xa4\x67\x32\x30\x19\x99\x4c\x4c\x66\x26\x0b\x93\x95\xc9\xc6\x64\x67\x72\x30\x39\x99\x5c\x4c\x6e\x26\x0f\x93\x97\xc9\xc7\xe4\x67\x0a\x30\x05\x99\x42\x4c\x61\xa6\x08\x53\x94\x29\xc6\x14\x67\x4a\x30\x25\x99\x52\x4c\x69\xa6\x0c\x53\x96\x29\xc7\x94\x67\x2a\x30\x15\x99\x4a\x4c\x65\xa6\x0a\x53\x95\xa9\xc6\x54\x67\x6a\x30\x35\x99\x5a\x4c\x6d\xa6\x0e\x53\x97\xa9\xc7\xd4\x67\x1a\x30\x0d\x99\x46\x4c\x63\xa6\x09\xd3\x94\x69\xc6\x34\x67\x5a\x30\x2d\x99\x56\x4c\x6b\xa6\x0d\xd3\x96\x69\xc7\xb4\x67\x3a\x30\x1d\x99\x4e\x4c\x67\xa6\x0b\xd3\x95\xf9\x8f\xe9\xc6\x74\x67\x7a\x30\x3d\x99\x5e\x4c\x6f\xa6\x0f\xd3\x97\xe9\xc7\xf4\x67\x06\x30\x03\x99\x41\xcc\x60\x66\x08\x33\x94\x19\xc6\x0c\x67\x46\x30\x23\x99\x51\xcc\x68\x66\x0c\x33\x96\x19\xc7\x8c\x67\x26\x30\x13\x99\x49\xcc\x64\x66\x0a\x33\x95\x99\xc6\x4c\x67\x66\x30\x33\x99\x59\xcc\x6c\x66\x0e\x33\x97\xc1\x18\x9c\x21\x18\x92\xa1\x18\x9a\x61\x18\x96\xe1\x18\x9e\x11\x18\x91\x91\x18\x99\x51\x18\x95\xd1\x18\x9d\x31\x18\x93\xb1\x18\x9b\x71\x18\x97\xf1\x18\x9f\x09\x98\x90\x89\x18\xc0\x40\x06\x31\x31\x66\x1e\x33\x9f\x59\xc0\x2c\x64\x16\x31\x8b\x99\x25\xcc\x52\x66\x19\xb3\x9c\x59\xc1\xac\x64\x56\x31\xab\x99\x35\xcc\x5a\x66\x1d\xb3\x9e\xd9\xc0\x6c\x64\x36\x31\x9b\x99\x2d\xcc\x56\x66\x1b\xb3\x9d\xd9\xc1\xec\x64\x76\x31\xbb\x99\x3d\xcc\x5e\x66\x1f\xb3\x9f\x39\xc0\x1c\x64\x0e\x31\x87\x99\x23\xcc\x51\xe6\x18\x73\x9c\x39\xc1\x9c\x64\x4e\x31\xa7\x99\x33\xcc\x59\xe6\x1c\x73\x9e\xb9\xc0\x5c\x64\x2e\x31\x97\x99\x2b\xcc\x55\xe6\x1a\x73\x9d\xb9\xc1\xdc\x64\x6e\x31\xb7\x99\x3b\xcc\x5d\xe6\x1e\x73\x9f\x79\xc0\x3c\x64\x1e\x31\x8f\x99\x27\xcc\x53\xe6\x19\xf3\x9c\x79\xc1\xbc\x64\x5e\x31\xaf\x99\x37\xcc\x5b\xe6\x1d\xf3\x9e\xf9\xc0\x7c\x64\x3e\x31\x9f\x99\x2f\xcc\x57\xe6\x1b\xf3\x9d\xf9\xc1\xfc\x64\x7e\x31\xbf\x99\x3f\xcc\x5f\xe6\x1f\x93\xc0\x24\x32\x49\x6c\x1c\x1b\xcf\x26\x63\x93\xb3\x29\xd8\x94\x6c\x2a\x36\x35\x9b\x86\x4d\xcb\xa6\x63\xd3\xb3\x19\xd8\x8c\x6c\x26\x36\x33\x9b\x85\xcd\xca\x66\x63\xb3\xb3\x39\xd8\x9c\x6c\x2e\x36\x37\x9b\x87\xcd\xcb\xe6\x63\xf3\xb3\x05\xd8\x82\x6c\x21\xb6\x30\x5b\x84\x2d\xca\x16\x63\x8b\xb3\x25\xd8\x92\x6c\x29\xb6\x34\x5b\x86\x2d\xcb\x96\x63\xcb\xb3\x15\xd8\x8a\x6c\x25\xb6\x32\x5b\x85\xad\xca\x56\x63\xab\xb3\x35\xd8\x9a\x6c\x2d\xb6\x36\x5b\x87\xad\xcb\xd6\x63\xeb\xb3\x0d\xd8\x86\x6c\x23\xb6\x31\xdb\x84\x6d\xca\x36\x63\x9b\xb3\x2d\xd8\x96\x6c\x2b\xb6\x35\xdb\x86\x6d\xcb\xb6\x63\xdb\xb3\x1d\xd8\x8e\x6c\x27\xb6\x33\xdb\x85\xed\xca\xfe\xc7\x76\x63\xbb\xb3\x3d\xd8\x9e\x6c\x2f\xb6\x37\xdb\x87\xed\xcb\xf6\x63\xfb\xb3\x03\xd8\x81\xec\x20\x76\x30\x3b\x84\x1d\xca\x0e\x63\x87\xb3\x23\xd8\x91\xec\x28\x76\x34\x3b\x86\x1d\xcb\x8e\x63\xc7\xb3\x13\xd8\x89\xec\x24\x76\x32\x3b\x85\x9d\xca\x4e\x63\xa7\xb3\x33\xd8\x99\xec\x2c\x76\x36\x3b\x87\x9d\xcb\x62\x2c\xce\x12\x2c\xc9\x52\x2c\xcd\x32\x2c\xcb\x72\x2c\xcf\x0a\xac\xc8\x4a\xac\xcc\x2a\xac\xca\x6a\xac\xce\x1a\xac\xc9\x5a\xac\xcd\x3a\xac\xcb\x7a\xac\xcf\x06\x6c\xc8\x46\x2c\x60\x21\x8b\xd8\x18\x3b\x8f\x9d\xcf\x2e\x60\x17\xb2\x8b\xd8\xc5\xec\x12\x76\x29\xbb\x8c\x5d\xce\xae\x60\x57\xb2\xab\xd8\xd5\xec\x1a\x76\x2d\xbb\x8e\x5d\xcf\x6e\x60\x37\xb2\x9b\xd8\xcd\xec\x16\x76\x2b\xbb\x8d\xdd\xce\xee\x60\x77\xb2\xbb\xd8\xdd\xec\x1e\x76\x2f\xbb\x8f\xdd\xcf\x1e\x60\x0f\xb2\x87\xd8\xc3\xec\x11\xf6\x28\x7b\x8c\x3d\xce\x9e\x60\x4f\xb2\xa7\xd8\xd3\xec\x19\xf6\x2c\x7b\x8e\x3d\xcf\x5e\x60\x2f\xb2\x97\xd8\xcb\xec\x15\xf6\x2a\x7b\x8d\xbd\xce\xde\x60\x6f\xb2\xb7\xd8\xdb\xec\x1d\xf6\x2e\x7b\x8f\xbd\xcf\x3e\x60\x1f\xb2\x8f\xd8\xc7\xec\x13\xf6\x29\xfb\x8c\x7d\xce\xbe\x60\x5f\xb2\xaf\xd8\xd7\xec\x1b\xf6\x2d\xfb\x8e\x7d\xcf\x7e\x60\x3f\xb2\x9f\xd8\xcf\xec\x17\xf6\x2b\xfb\x8d\xfd\xce\xfe\x60\x7f\xb2\xbf\xd8\xdf\xec\x1f\xf6\x2f\xfb\x8f\x4d\x60\x13\xd9\x24\x2e\x8e\x8b\xe7\x92\x71\xc9\xb9\x14\x5c\x4a\x2e\x15\x97\x9a\x4b\xc3\xa5\xe5\xd2\x71\xe9\xb9\x0c\x5c\x46\x2e\x13\x97\x99\xcb\xc2\x65\xe5\xb2\x71\xd9\xb9\x1c\x5c\x4e\x2e\x17\x97\x9b\xcb\xc3\xe5\xe5\xf2\x71\xf9\xb9\x02\x5c\x41\xae\x10\x57\x98\x2b\xc2\x15\xe5\x8a\x71\xc5\xb9\x12\x5c\x49\xae\x14\x57\x9a\x2b\xc3\x95\xe5\xca\x71\xe5\xb9\x0a\x5c\x45\xae\x12\x57\x99\xab\xc2\x55\xe5\xaa\x71\xd5\xb9\x1a\x5c\x4d\xae\x16\x57\x9b\xab\xc3\xd5\xe5\xea\x71\xf5\xb9\x06\x5c\x43\xae\x11\xd7\x98\x6b\xc2\x35\xe5\x9a\x71\xcd\xb9\x16\x5c\x4b\xae\x15\xd7\x9a\x6b\xc3\xb5\xe5\xda\x71\xed\xb9\x0e\x5c\x47\xae\x13\xd7\x99\xeb\xc2\x75\xe5\xfe\xe3\xba\x71\xdd\xb9\x1e\x5c\x4f\xae\x17\xd7\x9b\xeb\xc3\xf5\xe5\xfa\x71\xfd\xb9\x01\xdc\x40\x6e\x10\x37\x98\x1b\xc2\x0d\xe5\x86\x71\xc3\xb9\x11\xdc\x48\x6e\x14\x37\x9a\x1b\xc3\x8d\xe5\xc6\x71\xe3\xb9\x09\xdc\x44\x6e\x12\x37\x99\x9b\xc2\x4d\xe5\xa6\x71\xd3\xb9\x19\xdc\x4c\x6e\x16\x37\x9b\x9b\xc3\xcd\xe5\x30\x0e\xe7\x08\x8e\xe4\x28\x8e\xe6\x18\x8e\xe5\x38\x8e\xe7\x04\x4e\xe4\x24\x4e\xe6\x14\x4e\xe5\x34\x4e\xe7\x0c\xce\xe4\x2c\xce\xe6\x1c\xce\xe5\x3c\xce\xe7\x02\x2e\xe4\x22\x0e\x70\x90\x43\x5c\x8c\x9b\xc7\xcd\xe7\x16\x70\x0b\xb9\x45\xdc\x62\x6e\x09\xb7\x94\x5b\xc6\x2d\xe7\x56\x70\x2b\xb9\x55\xdc\x6a\x6e\x0d\xb7\x96\x5b\xc7\xad\xe7\x36\x70\x1b\xb9\x4d\xdc\x66\x6e\x0b\xb7\x95\xdb\xc6\x6d\xe7\x76\x70\x3b\xb9\x5d\xdc\x6e\x6e\x0f\xb7\x97\xdb\xc7\xed\xe7\x0e\x70\x07\xb9\x43\xdc\x61\xee\x08\x77\x94\x3b\xc6\x1d\xe7\x4e\x70\x27\xb9\x53\xdc\x69\xee\x0c\x77\x96\x3b\xc7\x9d\xe7\x2e\x70\x17\xb9\x4b\xdc\x65\xee\x0a\x77\x95\xbb\xc6\x5d\xe7\x6e\x70\x37\xb9\x5b\xdc\x6d\xee\x0e\x77\x97\xbb\xc7\xdd\xe7\x1e\x70\x0f\xb9\x47\xdc\x63\xee\x09\xf7\x94\x7b\xc6\x3d\xe7\x5e\x70\x2f\xb9\x57\xdc\x6b\xee\x0d\xf7\x96\x7b\xc7\xbd\xe7\x3e\x70\x1f\xb9\x4f\xdc\x67\xee\x0b\xf7\x95\xfb\xc6\x7d\xe7\x7e\x70\x3f\xb9\x5f\xdc\x6f\xee\x0f\xf7\x97\xfb\xc7\x25\x70\x89\x5c\x12\x1f\xc7\xc7\xf3\xc9\xf8\xe4\x7c\x0a\x3e\x25\x9f\x8a\x4f\xcd\xa7\xe1\xd3\xf2\xe9\xf8\xf4\x7c\x06\x3e\x23\x9f\x89\xcf\xcc\x67\xe1\xb3\xf2\xd9\xf8\xec\x7c\x0e\x3e\x27\x9f\x8b\xcf\xcd\xe7\xe1\xf3\xf2\xf9\xf8\xfc\x7c\x01\xbe\x20\x5f\x88\x2f\xcc\x17\xe1\x8b\xf2\xc5\xf8\xe2\x7c\x09\xbe\x24\x5f\x8a\x2f\xcd\x97\xe1\xcb\xf2\xe5\xf8\xf2\x7c\x05\xbe\x22\x5f\x89\xaf\xcc\x57\xe1\xab\xf2\xd5\xf8\xea\x7c\x0d\xbe\x26\x5f\x8b\xaf\xcd\xd7\xe1\xeb\xf2\xf5\xf8\xfa\x7c\x03\xbe\x21\xdf\x88\x6f\xcc\x37\xe1\x9b\xf2\xcd\xf8\xe6\x7c\x0b\xbe\x25\xdf\x8a\x6f\xcd\xb7\xe1\xdb\xf2\xed\xf8\xf6\x7c\x07\xbe\x23\xdf\x89\xef\xcc\x77\xe1\xbb\xf2\xff\xf1\xdd\xf8\xee\x7c\x0f\xbe\x27\xdf\x8b\xef\xcd\xf7\xe1\xfb\xf2\xfd\xf8\xfe\xfc\x00\x7e\x20\x3f\x88\x1f\xcc\x0f\xe1\x87\xf2\xc3\xf8\xe1\xfc\x08\x7e\x24\x3f\x8a\x1f\xcd\x8f\xe1\xc7\xf2\xe3\xf8\xf1\xfc\x04\x7e\x22\x3f\x89\x9f\xcc\x4f\xe1\xa7\xf2\xd3\xf8\xe9\xfc\x0c\x7e\x26\x3f\x8b\x9f\xcd\xcf\xe1\xe7\xf2\x18\x8f\xf3\x04\x4f\xf2\x14\x4f\xf3\x0c\xcf\xf2\x1c\xcf\xf3\x02\x2f\xf2\x12\x2f\xf3\x0a\xaf\xf2\x1a\xaf\xf3\x06\x6f\xf2\x16\x6f\xf3\x0e\xef\xf2\x1e\xef\xf3\x01\x1f\xf2\x11\x0f\x78\xc8\x23\x3e\xc6\xcf\xe3\xe7\xf3\x0b\xf8\x85\xfc\x22\x7e\x31\xbf\x84\x5f\xca\x2f\xe3\x97\xf3\x2b\xf8\x95\xfc\x2a\x7e\x35\xbf\x86\x5f\xcb\xaf\xe3\xd7\xf3\x1b\xf8\x8d\xfc\x26\x7e\x33\xbf\x85\xdf\xca\x6f\xe3\xb7\xf3\x3b\xf8\x9d\xfc\x2e\x7e\x37\xbf\x87\xdf\xcb\xef\xe3\xf7\xf3\x07\xf8\x83\xfc\x21\xfe\x30\x7f\x84\x3f\xca\x1f\xe3\x8f\xf3\x27\xf8\x93\xfc\x29\xfe\x34\x7f\x86\x3f\xcb\x9f\xe3\xcf\xf3\x17\xf8\x8b\xfc\x25\xfe\x32\x7f\x85\xbf\xca\x5f\xe3\xaf\xf3\x37\xf8\x9b\xfc\x2d\xfe\x36\x7f\x87\xbf\xcb\xdf\xe3\xef\xf3\x0f\xf8\x87\xfc\x23\xfe\x31\xff\x84\x7f\xca\x3f\xe3\x9f\xf3\x2f\xf8\x97\xfc\x2b\xfe\x35\xff\x86\x7f\xcb\xbf\xe3\xdf\xf3\x1f\xf8\x8f\xfc\x27\xfe\x33\xff\x85\xff\xca\x7f\xe3\xbf\xf3\x3f\xf8\x9f\xfc\x2f\xfe\x37\xff\x87\xff\xcb\xff\xe3\x13\xf8\x44\x3e\x49\x88\x13\xe2\x85\x64\x42\x72\x21\x85\x90\x52\x48\x25\xa4\x16\xd2\x08\x69\x85\x74\x42\x7a\x21\x83\x90\x51\xc8\x24\x64\x16\xb2\x08\x59\x85\x6c\x42\x76\x21\x87\x90\x53\xc8\x25\xe4\x16\xf2\x08\x79\x85\x7c\x42\x7e\xa1\x80\x50\x50\x28\x24\x14\x16\x8a\x08\x45\x85\x62\x42\x71\xa1\x84\x50\x52\x28\x25\x94\x16\xca\x08\x65\x85\x72\x42\x79\xa1\x82\x50\x51\xa8\x24\x54\x16\xaa\x08\x55\x85\x6a\x42\x75\xa1\x86\x50\x53\xa8\x25\xd4\x16\xea\x08\x75\x85\x7a\x42\x7d\xa1\x81\xd0\x50\x68\x24\x34\x16\x9a\x08\x4d\x85\x66\x42\x73\xa1\x85\xd0\x52\x68\x25\xb4\x16\xda\x08\x6d\x85\x76\x42\x7b\xa1\x83\xd0\x51\xe8\x24\x74\x16\xba\x08\x5d\x85\xff\x84\x6e\x42\x77\xa1\x87\xd0\x53\xe8\x25\xf4\x16\xfa\x08\x7d\x85\x7e\x42\x7f\x61\x80\x30\x50\x18\x24\x0c\x16\x86\x08\x43\x85\x61\xc2\x70\x61\x84\x30\x52\x18\x25\x8c\x16\xc6\x08\x63\x85\x71\xc2\x78\x61\x82\x30\x51\x98\x24\x4c\x16\xa6\x08\x53\x85\x69\xc2\x74\x61\x86\x30\x53\x98\x25\xcc\x16\xe6\x08\x73\x05\x4c\xc0\x05\x42\x20\x05\x4a\xa0\x05\x46\x60\x05\x4e\xe0\x05\x41\x10\x05\x49\x90\x05\x45\x50\x05\x4d\xd0\x05\x43\x30\x05\x4b\xb0\x05\x47\x70\x05\x4f\xf0\x85\x40\x08\x85\x48\x00\x02\x14\x90\x10\x13\xe6\x09\xf3\x85\x05\xc2\x42\x61\x91\xb0\x58\x58\x22\x2c\x15\x96\x09\xcb\x85\x15\xc2\x4a\x61\x95\xb0\x5a\x58\x23\xac\x15\xd6\x09\xeb\x85\x0d\xc2\x46\x61\x93\xb0\x59\xd8\x22\x6c\x15\xb6\x09\xdb\x85\x1d\xc2\x4e\x61\x97\xb0\x5b\xd8\x23\xec\x15\xf6\x09\xfb\x85\x03\xc2\x41\xe1\x90\x70\x58\x38\x22\x1c\x15\x8e\x09\xc7\x85\x13\xc2\x49\xe1\x94\x70\x5a\x38\x23\x9c\x15\xce\x09\xe7\x85\x0b\xc2\x45\xe1\x92\x70\x59\xb8\x22\x5c\x15\xae\x09\xd7\x85\x1b\xc2\x4d\xe1\x96\x70\x5b\xb8\x23\xdc\x15\xee\x09\xf7\x85\x07\xc2\x43\xe1\x91\xf0\x58\x78\x22\x3c\x15\x9e\x09\xcf\x85\x17\xc2\x4b\xe1\x95\xf0\x5a\x78\x23\xbc\x15\xde\x09\xef\x85\x0f\xc2\x47\xe1\x93\xf0\x59\xf8\x22\x7c\x15\xbe\x09\xdf\x85\x1f\xc2\x4f\xe1\x97\xf0\x5b\xf8\x23\xfc\x15\xfe\x09\x09\x42\xa2\x90\x24\xc6\x89\xf1\x62\x32\x31\xb9\x98\x42\x4c\x29\xa6\x12\x53\x8b\x69\xc4\xb4\x62\x3a\x31\xbd\x98\x41\xcc\x28\x66\x12\x33\x8b\x59\xc4\xac\x62\x36\x31\xbb\x98\x43\xcc\x29\xe6\x12\x73\x8b\x79\xc4\xbc\x62\x3e\x31\xbf\x58\x40\x2c\x28\x16\x12\x0b\x8b\x45\xc4\xa2\x62\x31\xb1\xb8\x58\x42\x2c\x29\x96\x12\x4b\x8b\x65\xc4\xb2\x62\x39\xb1\xbc\x58\x41\xac\x28\x56\x12\x2b\x8b\x55\xc4\xaa\x62\x35\xb1\xba\x58\x43\xac\x29\xd6\x12\x6b\x8b\x75\xc4\xba\x62\x3d\xb1\xbe\xd8\x40\x6c\x28\x36\x12\x1b\x8b\x4d\xc4\xa6\x62\x33\xb1\xb9\xd8\x42\x6c\x29\xb6\x12\x5b\x8b\x6d\xc4\xb6\x62\x3b\xb1\xbd\xd8\x41\xec\x28\x76\x12\x3b\x8b\x5d\xc4\xae\xe2\x7f\x62\x37\xb1\xbb\xd8\x43\xec\x29\xf6\x12\x7b\x8b\x7d\xc4\xbe\x62\x3f\xb1\xbf\x38\x40\x1c\x28\x0e\x12\x07\x8b\x43\xc4\xa1\xe2\x30\x71\xb8\x38\x42\x1c\x29\x8e\x12\x47\x8b\x63\xc4\xb1\xe2\x38\x71\xbc\x38\x41\x9c\x28\x4e\x12\x27\x8b\x53\xc4\xa9\xe2\x34\x71\xba\x38\x43\x9c\x29\xce\x12\x67\x8b\x73\xc4\xb9\x22\x26\xe2\x22\x21\x92\x22\x25\xd2\x22\x23\xb2\x22\x27\xf2\xa2\x20\x8a\xa2\x24\xca\xa2\x22\xaa\xa2\x26\xea\xa2\x21\x9a\xa2\x25\xda\xa2\x23\xba\xa2\x27\xfa\x62\x20\x86\x62\x24\x02\x11\x8a\x48\x8c\x89\xf3\xc4\xf9\xe2\x02\x71\xa1\xb8\x48\x5c\x2c\x2e\x11\x97\x8a\xcb\xc4\xe5\xe2\x0a\x71\xa5\xb8\x4a\x5c\x2d\xae\x11\xd7\x8a\xeb\xc4\xf5\xe2\x06\x71\xa3\xb8\x49\xdc\x2c\x6e\x11\xb7\x8a\xdb\xc4\xed\xe2\x0e\x71\xa7\xb8\x4b\xdc\x2d\xee\x11\xf7\x8a\xfb\xc4\xfd\xe2\x01\xf1\xa0\x78\x48\x3c\x2c\x1e\x11\x8f\x8a\xc7\xc4\xe3\xe2\x09\xf1\xa4\x78\x4a\x3c\x2d\x9e\x11\xcf\x8a\xe7\xc4\xf3\xe2\x05\xf1\xa2\x78\x49\xbc\x2c\x5e\x11\xaf\x8a\xd7\xc4\xeb\xe2\x0d\xf1\xa6\x78\x4b\xbc\x2d\xde\x11\xef\x8a\xf7\xc4\xfb\xe2\x03\xf1\xa1\xf8\x48\x7c\x2c\x3e\x11\x9f\x8a\xcf\xc4\xe7\xe2\x0b\xf1\xa5\xf8\x4a\x7c\x2d\xbe\x11\xdf\x8a\xef\xc4\xf7\xe2\x07\xf1\xa3\xf8\x49\xfc\x2c\x7e\x11\xbf\x8a\xdf\xc4\xef\xe2\x0f\xf1\xa7\xf8\x4b\xfc\x2d\xfe\x11\xff\x8a\xff\xc4\x04\x31\x51\x4c\x92\xe2\xa4\x78\x29\x99\x94\x5c\x4a\x21\xa5\x94\x52\x49\xa9\xa5\x34\x52\x5a\x29\x9d\x94\x5e\xca\x20\x65\x94\x32\x49\x99\xa5\x2c\x52\x56\x29\x9b\x94\x5d\xca\x21\xe5\x94\x72\x49\xb9\xa5\x3c\x52\x5e\x29\x9f\x94\x5f\x2a\x20\x15\x94\x0a\x49\x85\xa5\x22\x52\x51\xa9\x98\x54\x5c\x2a\x21\x95\x94\x4a\x49\xa5\xa5\x32\x52\x59\xa9\x9c\x54\x5e\xaa\x20\x55\x94\x2a\x49\x95\xa5\x2a\x52\x55\xa9\x9a\x54\x5d\xaa\x21\xd5\x94\x6a\x49\xb5\xa5\x3a\x52\x5d\xa9\x9e\x54\x5f\x6a\x20\x35\x94\x1a\x49\x8d\xa5\x26\x52\x53\xa9\x99\xd4\x5c\x6a\x21\xb5\x94\x5a\x49\xad\xa5\x36\x52\x5b\xa9\x9d\xd4\x5e\xea\x20\x75\x94\x3a\x49\x9d\xa5\x2e\x52\x57\xe9\x3f\xa9\x9b\xd4\x5d\xea\x21\xf5\x94\x7a\x49\xbd\xa5\x3e\x52\x5f\xa9\x9f\xd4\x5f\x1a\x20\x0d\x94\x06\x49\x83\xa5\x21\xd2\x50\x69\x98\x34\x5c\x1a\x21\x8d\x94\x46\x49\xa3\xa5\x31\xd2\x58\x69\x9c\x34\x5e\x9a\x20\x4d\x94\x26\x49\x93\xa5\x29\xd2\x54\x69\x9a\x34\x5d\x9a\x21\xcd\x94\x66\x49\xb3\xa5\x39\xd2\x5c\x09\x93\x70\x89\x90\x48\x89\x92\x68\x89\x91\x58\x89\x93\x78\x49\x90\x44\x49\x92\x64\x49\x91\x54\x49\x93\x74\xc9\x90\x4c\xc9\x92\x6c\xc9\x91\x5c\xc9\x93\x7c\x29\x90\x42\x29\x92\x80\x04\x25\x24\xc5\xa4\x79\xd2\x7c\x69\x81\xb4\x50\x5a\x24\x2d\x96\x96\x48\x4b\xa5\x65\xd2\x72\x69\x85\xb4\x52\x5a\x25\xad\x96\xd6\x48\x6b\xa5\x75\xd2\x7a\x69\x83\xb4\x51\xda\x24\x6d\x96\xb6\x48\x5b\xa5\x6d\xd2\x76\x69\x87\xb4\x53\xda\x25\xed\x96\xf6\x48\x7b\xa5\x7d\xd2\x7e\xe9\x80\x74\x50\x3a\x24\x1d\x96\x8e\x48\x47\xa5\x63\xd2\x71\xe9\x84\x74\x52\x3a\x25\x9d\x96\xce\x48\x67\xa5\x73\xd2\x79\xe9\x82\x74\x51\xba\x24\x5d\x96\xae\x48\x57\xa5\x6b\xd2\x75\xe9\x86\x74\x53\xba\x25\xdd\x96\xee\x48\x77\xa5\x7b\xd2\x7d\xe9\x81\xf4\x50\x7a\x24\x3d\x96\x9e\x48\x4f\xa5\x67\xd2\x73\xe9\x85\xf4\x52\x7a\x25\xbd\x96\xde\x48\x6f\xa5\x77\xd2\x7b\xe9\x83\xf4\x51\xfa\x24\x7d\x96\xbe\x48\x5f\xa5\x6f\xd2\x77\xe9\x87\xf4\x53\xfa\x25\xfd\x96\xfe\x48\x7f\xa5\x7f\x52\x82\x94\x28\x25\xc9\x71\x72\xbc\x9c\x4c\x4e\x2e\xa7\x90\x53\xca\xa9\xe4\xd4\x72\x1a\x39\xad\x9c\x4e\x4e\x2f\x67\x90\x33\xca\x99\xe4\xcc\x72\x16\x39\xab\x9c\x4d\xce\x2e\xe7\x90\x73\xca\xb9\xe4\xdc\x72\x1e\x39\xaf\x9c\x4f\xce\x1f\x17\x2f\x17\x90\x0b\xca\x85\xe4\xc2\x72\x11\xb9\xa8\x5c\x4c\x2e\x2e\x97\x90\x4b\xca\xa5\xe4\xd2\x72\x19\xb9\xac\x5c\x4e\x2e\x2f\x57\x90\x2b\xca\x95\xe4\xca\x72\x15\xb9\xaa\x5c\x4d\xae\x2e\xd7\x90\x6b\xca\xb5\xe4\xda\x72\x1d\xb9\xae\x5c\x4f\xae\x2f\x37\x90\x1b\xca\x8d\xe4\xc6\x72\x13\xb9\xa9\xdc\x4c\x6e\x2e\xb7\x90\x5b\xca\xad\xe4\xd6\x72\x1b\xb9\xad\xdc\x4e\x6e\x2f\x77\x90\x3b\xca\x9d\xe4\xce\x72\x17\xb9\xab\xfc\x9f\xdc\x4d\xee\x2e\xf7\x90\x7b\xca\xbd\xe4\xde\x72\x1f\xb9\xaf\xdc\x4f\xee\x2f\x0f\x90\x07\xca\x83\xe4\xc1\xf2\x10\x79\xa8\x3c\x4c\x1e\x2e\x8f\x90\x47\xca\xa3\xe4\xd1\xf2\x18\x79\xac\x3c\x4e\x1e\x2f\x4f\x90\x27\xca\x93\xe4\xc9\xf2\x14\x79\xaa\x3c\x4d\x9e\x2e\xcf\x90\x67\xca\xb3\xe4\xd9\xf2\x1c\x79\xae\x8c\xc9\xb8\x4c\xc8\xa4\x4c\xc9\xb4\xcc\xc8\xac\xcc\xc9\xbc\x2c\xc8\xa2\x2c\xc9\xb2\xac\xc8\xaa\xac\xc9\xba\x6c\xc8\xa6\x6c\xc9\xb6\xec\xc8\xae\xec\xc9\xbe\x1c\xc8\xa1\x1c\xc9\x40\x86\x32\x92\x63\xf2\x3c\x79\xbe\xbc\x40\x5e\x28\x2f\x92\x17\xcb\x4b\xe4\xa5\xf2\x32\x79\xb9\xbc\x42\x5e\x29\xaf\x92\x57\xcb\x6b\xe4\xb5\xf2\x3a\x79\xbd\xbc\x41\xde\x28\x6f\x92\x37\xcb\x5b\xe4\xad\xf2\x36\x79\xbb\xbc\x43\xde\x29\xef\x92\x77\xcb\x7b\xe4\xbd\xf2\x3e\x79\xbf\x7c\x40\x3e\x28\x1f\x92\x0f\xcb\x47\xe4\xa3\xf2\x31\xf9\xb8\x7c\x42\x3e\x29\x9f\x92\x4f\xcb\x67\xe4\xb3\xf2\x39\xf9\xbc\x7c\x41\xbe\x28\x5f\x92\x2f\xcb\x57\xe4\xab\xf2\x35\xf9\xba\x7c\x43\xbe\x29\xdf\x92\x6f\xcb\x77\xe4\xbb\xf2\x3d\xf9\xbe\xfc\x40\x7e\x28\x3f\x92\x1f\xcb\x4f\xe4\xa7\xf2\x33\xf9\xb9\xfc\x42\x7e\x29\xbf\x92\x5f\xcb\x6f\xe4\xb7\xf2\x3b\xf9\xbd\xfc\x41\xfe\x28\x7f\x92\x3f\xcb\x5f\xe4\xaf\xf2\x37\xf9\xbb\xfc\x43\xfe\x29\xff\x92\x7f\xcb\x7f\xe4\xbf\xf2\x3f\x39\x41\x4e\x94\x93\x94\x38\x25\x5e\x49\xa6\x24\x57\x52\x28\x29\x95\x54\x4a\x6a\x25\x8d\x92\x56\x49\xa7\xa4\x57\x32\x28\x19\x95\x4c\x4a\x66\x25\x8b\x92\x55\xc9\xa6\x64\x57\x72\x28\x39\x95\x5c\x4a\x6e\x25\x8f\x92\x57\xc9\xa7\xe4\x57\x0a\x28\x05\x95\x42\x4a\x61\xa5\x88\x52\x54\x29\xa6\x14\x57\x4a\x28\x25\x95\x52\x4a\x69\xa5\x8c\x52\x56\x29\xa7\x94\x57\x2a\x28\x15\x95\x4a\x4a\x65\xa5\x8a\x52\x55\xa9\xa6\x54\x57\x6a\x28\x35\x95\x5a\x4a\x6d\xa5\x8e\x52\x57\xa9\xa7\xd4\x57\x1a\x28\x0d\x95\x46\x4a\x63\xa5\x89\xd2\x54\x69\xa6\x34\x57\x5a\x28\x2d\x95\x56\x4a\x6b\xa5\x8d\xd2\x56\x69\xa7\xb4\x57\x3a\x28\x1d\x95\x4e\x4a\x67\xa5\x8b\xd2\x55\xf9\x4f\xe9\xa6\x74\x57\x7a\x28\x3d\x95\x5e\x4a\x6f\xa5\x8f\xd2\x57\xe9\xa7\xf4\x57\x06\x28\x03\x95\x41\xca\x60\x65\x88\x32\x54\x19\xa6\x0c\x57\x46\x28\x23\x95\x51\xca\x68\x65\x8c\x32\x56\x19\xa7\x8c\x57\x26\x28\x13\x95\x49\xca\x64\x65\x8a\x32\x55\x99\xa6\x4c\x57\x66\x28\x33\x95\x59\xca\x6c\x65\x8e\x32\x57\xc1\x14\x5c\x21\x14\x52\xa1\x14\x5a\x61\x14\x56\xe1\x14\x5e\x11\x14\x51\x91\x14\x59\x51\x14\x55\xd1\x14\x5d\x31\x14\x53\xb1\x14\x5b\x71\x14\x57\xf1\x14\x5f\x09\x94\x50\x89\x14\xa0\x40\x05\x29\x31\x65\x9e\x32\x5f\x59\xa0\x2c\x54\x16\x29\x8b\x95\x25\xca\x52\x65\x99\xb2\x5c\x59\xa1\xac\x54\x56\x29\xab\x95\x35\xca\x5a\x65\x9d\xb2\x5e\xd9\xa0\x6c\x54\x36\x29\x9b\x95\x2d\xca\x56\x65\x9b\xb2\x5d\xd9\xa1\xec\x54\x76\x29\xbb\x95\x3d\xca\x5e\x65\x9f\xb2\x5f\x39\xa0\x1c\x54\x0e\x29\x87\x95\x23\xca\x51\xe5\x98\x72\x5c\x39\xa1\x9c\x54\x4e\x29\xa7\x95\x33\xca\x59\xe5\x9c\x72\x5e\xb9\xa0\x5c\x54\x2e\x29\x97\x95\x2b\xca\x55\xe5\x9a\x72\x5d\xb9\xa1\xdc\x54\x6e\x29\xb7\x95\x3b\xca\x5d\xe5\x9e\x72\x5f\x79\xa0\x3c\x54\x1e\x29\x8f\x95\x27\xca\x53\xe5\x99\xf2\x5c\x79\xa1\xbc\x54\x5e\x29\xaf\x95\x37\xca\x5b\xe5\x9d\xf2\x5e\xf9\xa0\x7c\x54\x3e\x29\x9f\x95\x2f\xca\x57\xe5\x9b\xf2\x5d\xf9\xa1\xfc\x54\x7e\x29\xbf\x95\x3f\xca\x5f\xe5\x9f\x92\xa0\x24\x2a\x49\x6a\x9c\x1a\xaf\x26\x53\x93\xab\x29\xd4\x94\x6a\x2a\x35\xb5\x9a\x46\x4d\xab\xa6\x53\xd3\xab\x19\xd4\x8c\x6a\x26\x35\xb3\x9a\x45\xcd\xaa\x66\x53\xb3\xab\x39\xd4\x9c\x6a\x2e\x35\xb7\x9a\x47\xcd\xab\xe6\x53\xf3\xab\x05\xd4\x82\x6a\x21\xb5\xb0\x5a\x44\x2d\xaa\x16\x53\x8b\xab\x25\xd4\x92\x6a\x29\xb5\xb4\x5a\x46\x2d\xab\x96\x53\xcb\xab\x15\xd4\x8a\x6a\x25\xb5\xb2\x5a\x45\xad\xaa\x56\x53\xab\xab\x35\xd4\x9a\x6a\x2d\xb5\xb6\x5a\x47\xad\xab\xd6\x53\xeb\xab\x0d\xd4\x86\x6a\x23\xb5\xb1\xda\x44\x6d\xaa\x36\x53\x9b\xab\x2d\xd4\x96\x6a\x2b\xb5\xb5\xda\x46\x6d\xab\xb6\x53\xdb\xab\x1d\xd4\x8e\x6a\x27\xb5\xb3\xda\x45\xed\xaa\xfe\xa7\x76\x53\xbb\xab\x3d\xd4\x9e\x6a\x2f\xb5\xb7\xda\x47\xed\xab\xf6\x53\xfb\xab\x03\xd4\x81\xea\x20\x75\xb0\x3a\x44\x1d\xaa\x0e\x53\x87\xab\x23\xd4\x91\xea\x28\x75\xb4\x3a\x46\x1d\xab\x8e\x53\xc7\xab\x13\xd4\x89\xea\x24\x75\xb2\x3a\x45\x9d\xaa\x4e\x53\xa7\xab\x33\xd4\x99\xea\x2c\x75\xb6\x3a\x47\x9d\xab\x62\x2a\xae\x12\x2a\xa9\x52\x2a\xad\x32\x2a\xab\x72\x2a\xaf\x0a\xaa\xa8\x4a\xaa\xac\x2a\xaa\xaa\x6a\xaa\xae\x1a\xaa\xa9\x5a\xaa\xad\x3a\xaa\xab\x7a\xaa\xaf\x06\x6a\xa8\x46\x2a\x50\xa1\x8a\xd4\x98\x3a\x4f\x9d\xaf\x2e\x50\x17\xaa\x8b\xd4\xc5\xea\x12\x75\xa9\xba\x4c\x5d\xae\xae\x50\x57\xaa\xab\xd4\xd5\xea\x1a\x75\xad\xba\x4e\x5d\xaf\x6e\x50\x37\xaa\x9b\xd4\xcd\xea\x16\x75\xab\xba\x4d\xdd\xae\xee\x50\x77\xaa\xbb\xd4\xdd\xea\x1e\x75\xaf\xba\x4f\xdd\xaf\x1e\x50\x0f\xaa\x87\xd4\xc3\xea\x11\xf5\xa8\x7a\x4c\x3d\xae\x9e\x50\x4f\xaa\xa7\xd4\xd3\xea\x19\xf5\xac\x7a\x4e\x3d\xaf\x5e\x50\x2f\xaa\x97\xd4\xcb\xea\x15\xf5\xaa\x7a\x4d\xbd\xae\xde\x50\x6f\xaa\xb7\xd4\xdb\xea\x1d\xf5\xae\x7a\x4f\xbd\xaf\x3e\x50\x1f\xaa\x8f\xd4\xc7\xea\x13\xf5\xa9\xfa\x4c\x7d\xae\xbe\x50\x5f\xaa\xaf\xd4\xd7\xea\x1b\xf5\xad\xfa\x4e\x7d\xaf\x7e\x50\x3f\xaa\x9f\xd4\xcf\xea\x17\xf5\xab\xfa\x4d\xfd\xae\xfe\x50\x7f\xaa\xbf\xd4\xdf\xea\x1f\xf5\xaf\xfa\x4f\x4d\x50\x13\xd5\x24\x2d\x4e\x8b\xd7\x92\x69\xc9\xb5\x14\x5a\x4a\x2d\x95\x96\x5a\x4b\xa3\xa5\xd5\xd2\x69\xe9\xb5\x0c\x5a\x46\x2d\x93\x96\x59\xcb\xa2\x65\xd5\xb2\x69\xd9\xb5\x1c\x5a\x4e\x2d\x97\x96\x5b\xcb\xa3\xe5\xd5\xf2\x69\xf9\xb5\x02\x5a\x41\xad\x90\x56\x58\x2b\xa2\x15\xd5\x8a\x69\xc5\xb5\x12\x5a\x49\xad\x94\x56\x5a\x2b\xa3\x95\xd5\xca\x69\xe5\xb5\x0a\x5a\x45\xad\x92\x56\x59\xab\xa2\x55\xd5\xaa\x69\xd5\xb5\x1a\x5a\x4d\xad\x96\x56\x5b\xab\xa3\xd5\xd5\xea\x69\xf5\xb5\x06\x5a\x43\xad\x91\xd6\x58\x6b\xa2\x35\xd5\x9a\x69\xcd\xb5\x16\x5a\x4b\xad\x95\xd6\x5a\x6b\xa3\xb5\xd5\xda\x69\xed\xb5\x0e\x5a\x47\xad\x93\xd6\x59\xeb\xa2\x75\xd5\xfe\xd3\xba\x69\xdd\xb5\x1e\x5a\x4f\xad\x97\xd6\x5b\xeb\xa3\xf5\xd5\xfa\x69\xfd\xb5\x01\xda\x40\x6d\x90\x36\x58\x1b\xa2\x0d\xd5\x86\x69\xc3\xb5\x11\xda\x48\x6d\x94\x36\x5a\x1b\xa3\x8d\xd5\xc6\x69\xe3\xb5\x09\xda\x44\x6d\x92\x36\x59\x9b\xa2\x4d\xd5\xa6\x69\xd3\xb5\x19\xda\x4c\x6d\x96\x36\x5b\x9b\xa3\xcd\xd5\x30\x0d\xd7\x08\x8d\xd4\x28\x8d\xd6\x18\x8d\xd5\x38\x8d\xd7\x04\x4d\xd4\x24\x4d\xd6\x14\x4d\xd5\x34\x4d\xd7\x0c\xcd\xd4\x2c\xcd\xd6\x1c\xcd\xd5\x3c\xcd\xd7\x02\x2d\xd4\x22\x0d\x68\x50\x43\x5a\x4c\x9b\xa7\xcd\xd7\x16\x68\x0b\xb5\x45\xda\x62\x6d\x89\xb6\x54\x5b\xa6\x2d\xd7\x56\x68\x2b\xb5\x55\xda\x6a\x6d\x8d\xb6\x56\x5b\xa7\xad\xd7\x36\x68\x1b\xb5\x4d\xda\x66\x6d\x8b\xb6\x55\xdb\xa6\x6d\xd7\x76\x68\x3b\xb5\x5d\xda\x6e\x6d\x8f\xb6\x57\xdb\xa7\xed\xd7\x0e\x68\x07\xb5\x43\xda\x61\xed\x88\x76\x54\x3b\xa6\x1d\xd7\x4e\x68\x27\xb5\x53\xda\x69\xed\x8c\x76\x56\x3b\xa7\x9d\xd7\x2e\x68\x17\xb5\x4b\xda\x65\xed\x8a\x76\x55\xbb\xa6\x5d\xd7\x6e\x68\x37\xb5\x5b\xda\x6d\xed\x8e\x76\x57\xbb\xa7\xdd\xd7\x1e\x68\x0f\xb5\x47\xda\x63\xed\x89\xf6\x54\x7b\xa6\x3d\xd7\x5e\x68\x2f\xb5\x57\xda\x6b\xed\x8d\xf6\x56\x7b\xa7\xbd\xd7\x3e\x68\x1f\xb5\x4f\xda\x67\xed\x8b\xf6\x55\xfb\xa6\x7d\xd7\x7e\x68\x3f\xb5\x5f\xda\x6f\xed\x8f\xf6\x57\xfb\xa7\x25\x68\x89\x5a\x92\x1e\xa7\xc7\xeb\xc9\xf4\xe4\x7a\x0a\x3d\xa5\x9e\x4a\x4f\xad\xa7\xd1\xd3\xea\xe9\xf4\xf4\x7a\x06\x3d\xa3\x9e\x49\xcf\xac\x67\xd1\xb3\xea\xd9\xf4\xec\x7a\x0e\x3d\xa7\x9e\x4b\xcf\xad\xe7\xd1\xf3\xea\xf9\xf4\xfc\x7a\x01\xbd\xa0\x5e\x48\x2f\xac\x17\xd1\x8b\xea\xc5\xf4\xe2\x7a\x09\xbd\xa4\x5e\x4a\x2f\xad\x97\xd1\xcb\xea\xe5\xf4\xf2\x7a\x05\xbd\xa2\x5e\x49\xaf\xac\x57\xd1\xab\xea\xd5\xf4\xea\x7a\x0d\xbd\xa6\x5e\x4b\xaf\xad\xd7\xd1\xeb\xea\xf5\xf4\xfa\x7a\x03\xbd\xa1\xde\x48\x6f\xac\x37\xd1\x9b\xea\xcd\xf4\xe6\x7a\x0b\xbd\xa5\xde\x4a\x6f\xad\xb7\xd1\xdb\xea\xed\xf4\xf6\x7a\x07\xbd\xa3\xde\x49\xef\xac\x77\xd1\xbb\xea\xff\xe9\xdd\xf4\xee\x7a\x0f\xbd\xa7\xde\x4b\xef\xad\xf7\xd1\xfb\xea\xfd\xf4\xfe\xfa\x00\x7d\xa0\x3e\x48\x1f\xac\x0f\xd1\x87\xea\xc3\xf4\xe1\xfa\x08\x7d\xa4\x3e\x4a\x1f\xad\x8f\xd1\xc7\xea\xe3\xf4\xf1\xfa\x04\x7d\xa2\x3e\x49\x9f\xac\x4f\xd1\xa7\xea\xd3\xf4\xe9\xfa\x0c\x7d\xa6\x3e\x4b\x9f\xad\xcf\xd1\xe7\xea\x98\x8e\xeb\x84\x4e\xea\x94\x4e\xeb\x8c\xce\xea\x9c\xce\xeb\x82\x2e\xea\x92\x2e\xeb\x8a\xae\xea\x9a\xae\xeb\x86\x6e\xea\x96\x6e\xeb\x8e\xee\xea\x9e\xee\xeb\x81\x1e\xea\x91\x0e\x74\xa8\x23\x3d\xa6\xcf\xd3\xe7\xeb\x0b\xf4\x85\xfa\x22\x7d\xb1\xbe\x44\x5f\xaa\x2f\xd3\x97\xeb\x2b\xf4\x95\xfa\x2a\x7d\xb5\xbe\x46\x5f\xab\xaf\xd3\xd7\xeb\x1b\xf4\x8d\xfa\x26\x7d\xb3\xbe\x45\xdf\xaa\x6f\xd3\xb7\xeb\x3b\xf4\x9d\xfa\x2e\x7d\xb7\xbe\x47\xdf\xab\xef\xd3\xf7\xeb\x07\xf4\x83\xfa\x21\xfd\xb0\x7e\x44\x3f\xaa\x1f\xd3\x8f\xeb\x27\xf4\x93\xfa\x29\xfd\xb4\x7e\x46\x3f\xab\x9f\xd3\xcf\xeb\x17\xf4\x8b\xfa\x25\xfd\xb2\x7e\x45\xbf\xaa\x5f\xd3\xaf\xeb\x37\xf4\x9b\xfa\x2d\xfd\xb6\x7e\x47\xbf\xab\xdf\xd3\xef\xeb\x0f\xf4\x87\xfa\x23\xfd\xb1\xfe\x44\x7f\xaa\x3f\xd3\x9f\xeb\x2f\xf4\x97\xfa\x2b\xfd\xb5\xfe\x46\x7f\xab\xbf\xd3\xdf\xeb\x1f\xf4\x8f\xfa\x27\xfd\xb3\xfe\x45\xff\xaa\x7f\xd3\xbf\xeb\x3f\xf4\x9f\xfa\x2f\xfd\xb7\xfe\x47\xff\xab\xff\xd3\x13\xf4\x44\x3d\xc9\x88\x33\xe2\x8d\x64\x46\x72\x23\x85\x91\xd2\x48\x65\xa4\x36\xd2\x18\x69\x8d\x74\x46\x7a\x23\x83\x91\xd1\xc8\x64\x64\x36\xb2\x18\x59\x8d\x6c\x46\x76\x23\x87\x91\xd3\xc8\x65\xe4\x36\xf2\x18\x79\x8d\x7c\x46\x7e\xa3\x80\x51\xd0\x28\x64\x14\x36\x8a\x18\x45\x8d\x62\x46\x71\xa3\x84\x51\xd2\x28\x65\x94\x36\xca\x18\x65\x8d\x72\x46\x79\xa3\x82\x51\xd1\xa8\x64\x54\x36\xaa\x18\x55\x8d\x6a\x46\x75\xa3\x86\x51\xd3\xa8\x65\xd4\x36\xea\x18\x75\x8d\x7a\x46\x7d\xa3\x81\xd1\xd0\x68\x64\x34\x36\x9a\x18\x4d\x8d\x66\x46\x73\xa3\x85\xd1\xd2\x68\x65\xb4\x36\xda\x18\x6d\x8d\x76\x46\x7b\xa3\x83\xd1\xd1\xe8\x64\x74\x36\xba\x18\x5d\x8d\xff\x8c\x6e\x46\x77\xa3\x87\xd1\xd3\xe8\x65\xf4\x36\xfa\x18\x7d\x8d\x7e\x46\x7f\x63\x80\x31\xd0\x18\x64\x0c\x36\x86\x18\x43\x8d\x61\xc6\x70\x63\x84\x31\xd2\x18\x65\x8c\x36\xc6\x18\x63\x8d\x71\xc6\x78\x63\x82\x31\xd1\x98\x64\x4c\x36\xa6\x18\x53\x8d\x69\xc6\x74\x63\x86\x31\xd3\x98\x65\xcc\x36\xe6\x18\x73\x0d\xcc\xc0\x0d\xc2\x20\x0d\xca\xa0\x0d\xc6\x60\x0d\xce\xe0\x0d\xc1\x10\x0d\xc9\x90\x0d\xc5\x50\x0d\xcd\xd0\x0d\xc3\x30\x0d\xcb\xb0\x0d\xc7\x70\x0d\xcf\xf0\x8d\xc0\x08\x8d\xc8\x00\x06\x34\x90\x11\x33\xe6\x19\xf3\x8d\x05\xc6\x42\x63\x91\xb1\xd8\x58\x62\x2c\x35\x96\x19\xcb\x8d\x15\xc6\x4a\x63\x95\xb1\xda\x58\x63\xac\x35\xd6\x19\xeb\x8d\x0d\xc6\x46\x63\x93\xb1\xd9\xd8\x62\x6c\x35\xb6\x19\xdb\x8d\x1d\xc6\x4e\x63\x97\xb1\xdb\xd8\x63\xec\x35\xf6\x19\xfb\x8d\x03\xc6\x41\xe3\x90\x71\xd8\x38\x62\x1c\x35\x8e\x19\xc7\x8d\x13\xc6\x49\xe3\x94\x71\xda\x38\x63\x9c\x35\xce\x19\xe7\x8d\x0b\xc6\x45\xe3\x92\x71\xd9\xb8\x62\x5c\x35\xae\x19\xd7\x8d\x1b\xc6\x4d\xe3\x96\x71\xdb\xb8\x63\xdc\x35\xee\x19\xf7\x8d\x07\xc6\x43\xe3\x91\xf1\xd8\x78\x62\x3c\x35\x9e\x19\xcf\x8d\x17\xc6\x4b\xe3\x95\xf1\xda\x78\x63\xbc\x35\xde\x19\xef\x8d\x0f\xc6\x47\xe3\x93\xf1\xd9\xf8\x62\x7c\x35\xbe\x19\xdf\x8d\x1f\xc6\x4f\xe3\x97\xf1\xdb\xf8\x63\xfc\x35\xfe\x19\x09\x46\xa2\x91\x64\xc6\x99\xf1\x66\x32\x33\xb9\x99\xc2\x4c\x69\xa6\x32\x53\x9b\x69\xcc\xb4\x66\x3a\x33\xbd\x99\xc1\xcc\x68\x66\x32\x33\x9b\x59\xcc\xac\x66\x36\x33\xbb\x99\xc3\xcc\x69\xe6\x32\x73\x9b\x79\xcc\xbc\x66\x3e\x33\xbf\x59\xc0\x2c\x68\x16\x32\x0b\x9b\x45\xcc\xa2\x66\x31\xb3\xb8\x59\xc2\x2c\x69\x96\x32\x4b\x9b\x65\xcc\xb2\x66\x39\xb3\xbc\x59\xc1\xac\x68\x56\x32\x2b\x9b\x55\xcc\xaa\x66\x35\xb3\xba\x59\xc3\xac\x69\xd6\x32\x6b\x9b\x75\xcc\xba\x66\x3d\xb3\xbe\xd9\xc0\x6c\x68\x36\x32\x1b\x9b\x4d\xcc\xa6\x66\x33\xb3\xb9\xd9\xc2\x6c\x69\xb6\x32\x5b\x9b\x6d\xcc\xb6\x66\x3b\xb3\xbd\xd9\xc1\xec\x68\x76\x32\x3b\x9b\x5d\xcc\xae\xe6\x7f\x66\x37\xb3\xbb\xd9\xc3\xec\x69\xf6\x32\x7b\x9b\x7d\xcc\xbe\x66\x3f\xb3\xbf\x39\xc0\x1c\x68\x0e\x32\x07\x9b\x43\xcc\xa1\xe6\x30\x73\xb8\x39\xc2\x1c\x69\x8e\x32\x47\x9b\x63\xcc\xb1\xe6\x38\x73\xbc\x39\xc1\x9c\x68\x4e\x32\x27\x9b\x53\xcc\xa9\xe6\x34\x73\xba\x39\xc3\x9c\x69\xce\x32\x67\x9b\x73\xcc\xb9\x26\x66\xe2\x26\x61\x92\x26\x65\xd2\x26\x63\xb2\x26\x67\xf2\xa6\x60\x8a\xa6\x64\xca\xa6\x62\xaa\xa6\x66\xea\xa6\x61\x9a\xa6\x65\xda\xa6\x63\xba\xa6\x67\xfa\x66\x60\x86\x66\x64\x02\x13\x9a\xc8\x8c\x99\xf3\xcc\xf9\xe6\x02\x73\xa1\xb9\xc8\x5c\x6c\x2e\x31\x97\x9a\xcb\xcc\xe5\xe6\x0a\x73\xa5\xb9\xca\x5c\x6d\xae\x31\xd7\x9a\xeb\xcc\xf5\xe6\x06\x73\xa3\xb9\xc9\xdc\x6c\x6e\x31\xb7\x9a\xdb\xcc\xed\xe6\x0e\x73\xa7\xb9\xcb\xdc\x6d\xee\x31\xf7\x9a\xfb\xcc\xfd\xe6\x01\xf3\xa0\x79\xc8\x3c\x6c\x1e\x31\x8f\x9a\xc7\xcc\xe3\xe6\x09\xf3\xa4\x79\xca\x3c\x6d\x9e\x31\xcf\x9a\xe7\xcc\xf3\xe6\x05\xf3\xa2\x79\xc9\xbc\x6c\x5e\x31\xaf\x9a\xd7\xcc\xeb\xe6\x0d\xf3\xa6\x79\xcb\xbc\x6d\xde\x31\xef\x9a\xf7\xcc\xfb\xe6\x03\xf3\xa1\xf9\xc8\x7c\x6c\x3e\x31\x9f\x9a\xcf\xcc\xe7\xe6\x0b\xf3\xa5\xf9\xca\x7c\x6d\xbe\x31\xdf\x9a\xef\xcc\xf7\xe6\x07\xf3\xa3\xf9\xc9\xfc\x6c\x7e\x31\xbf\x9a\xdf\xcc\xef\xe6\x0f\xf3\xa7\xf9\xcb\xfc\x6d\xfe\x31\xff\x9a\xff\xcc\x04\x33\xd1\x4c\xb2\xe2\xac\x78\x2b\x99\x95\xdc\x4a\x61\xa5\xb4\x52\x59\xa9\xad\x34\x56\x5a\x2b\x9d\x95\xde\xca\x60\x65\xb4\x32\x59\x99\xad\x2c\x56\x56\x2b\x9b\x95\xdd\xca\x61\xe5\xb4\x72\x59\xb9\xad\x3c\x56\x5e\x2b\x9f\x95\xdf\x2a\x60\x15\xb4\x0a\x59\x85\xad\x22\x56\x51\xab\x98\x55\xdc\x2a\x61\x95\xb4\x4a\x59\xa5\xad\x32\x56\x59\xab\x9c\x55\xde\xaa\x60\x55\xb4\x2a\x59\x95\xad\x2a\x56\x55\xab\x9a\x55\xdd\xaa\x61\xd5\xb4\x6a\x59\xb5\xad\x3a\x56\x5d\xab\x9e\x55\xdf\x6a\x60\x35\xb4\x1a\x59\x8d\xad\x26\x56\x53\xab\x99\xd5\xdc\x6a\x61\xb5\xb4\x5a\x59\xad\xad\x36\x56\x5b\xab\x9d\xd5\xde\xea\x60\x75\xb4\x3a\x59\x9d\xad\x2e\x56\x57\xeb\x3f\xab\x9b\xd5\xdd\xea\x61\xf5\xb4\x7a\x59\xbd\xad\x3e\x56\x5f\xab\x9f\xd5\xdf\x1a\x60\x0d\xb4\x06\x59\x83\xad\x21\xd6\x50\x6b\x98\x35\xdc\x1a\x61\x8d\xb4\x46\x59\xa3\xad\x31\xd6\x58\x6b\x9c\x35\xde\x9a\x60\x4d\xb4\x26\x59\x93\xad\x29\xd6\x54\x6b\x9a\x35\xdd\x9a\x61\xcd\xb4\x66\x59\xb3\xad\x39\xd6\x5c\x0b\xb3\x70\x8b\xb0\x48\x8b\xb2\x68\x8b\xb1\x58\x8b\xb3\x78\x4b\xb0\x44\x4b\xb2\x64\x4b\xb1\x54\x4b\xb3\x74\xcb\xb0\x4c\xcb\xb2\x6c\xcb\xb1\x5c\xcb\xb3\x7c\x2b\xb0\x42\x2b\xb2\x80\x05\x2d\x64\xc5\xac\x79\xd6\x7c\x6b\x81\xb5\xd0\x5a\x64\x2d\xb6\x96\x58\x4b\xad\x65\xd6\x72\x6b\x85\xb5\xd2\x5a\x65\xad\xb6\xd6\x58\x6b\xad\x75\xd6\x7a\x6b\x83\xb5\xd1\xda\x64\x6d\xb6\xb6\x58\x5b\xad\x6d\xd6\x76\x6b\x87\xb5\xd3\xda\x65\xed\xb6\xf6\x58\x7b\xad\x7d\xd6\x7e\xeb\x80\x75\xd0\x3a\x64\x1d\xb6\x8e\x58\x47\xad\x63\xd6\x71\xeb\x84\x75\xd2\x3a\x65\x9d\xb6\xce\x58\x67\xad\x73\xd6\x79\xeb\x82\x75\xd1\xba\x64\x5d\xb6\xae\x58\x57\xad\x6b\xd6\x75\xeb\x86\x75\xd3\xba\x65\xdd\xb6\xee\x58\x77\xad\x7b\xd6\x7d\xeb\x81\xf5\xd0\x7a\x64\x3d\xb6\x9e\x58\x4f\xad\x67\xd6\x73\xeb\x85\xf5\xd2\x7a\x65\xbd\xb6\xde\x58\x6f\xad\x77\xd6\x7b\xeb\x83\xf5\xd1\xfa\x64\x7d\xb6\xbe\x58\x5f\xad\x6f\xd6\x77\xeb\x87\xf5\xd3\xfa\x65\xfd\xb6\xfe\x58\x7f\xad\x7f\x56\x82\x95\x68\x25\xd9\x71\x76\xbc\x9d\xcc\x4e\x6e\xa7\xb0\x53\xda\xa9\xec\xd4\x76\x1a\x3b\xad\x9d\xce\x4e\x6f\x67\xb0\x33\xda\x99\xec\xcc\x76\x16\x3b\xab\x9d\xcd\xce\x6e\xe7\xb0\x73\xda\xb9\xec\xdc\x76\x1e\x3b\xaf\x9d\xcf\xce\x6f\x17\xb0\x0b\xda\x85\xec\xc2\x76\x11\xbb\xa8\x5d\xcc\x2e\x6e\x97\xb0\x4b\xda\xa5\xec\xd2\x76\x19\xbb\xac\x5d\xce\x2e\x6f\x57\xb0\x2b\xda\x95\xec\xca\x76\x15\xbb\xaa\x5d\xcd\xae\x6e\xd7\xb0\x6b\xda\xb5\xec\xda\x76\x1d\xbb\xae\x5d\xcf\xae\x6f\x37\xb0\x1b\xda\x8d\xec\xc6\x76\x13\xbb\xa9\xdd\xcc\x6e\x6e\xb7\xb0\x5b\xda\xad\xec\xd6\x76\x1b\xbb\xad\xdd\xce\x6e\x6f\x77\xb0\x3b\xda\x9d\xec\xce\x76\x17\xbb\xab\xfd\x9f\xdd\xcd\xee\x6e\xf7\xb0\x7b\xda\xbd\xec\xde\x76\x1f\xbb\xaf\xdd\xcf\xee\x6f\x0f\xb0\x07\xda\x83\xec\xc1\xf6\x10\x7b\xa8\x3d\xcc\x1e\x6e\x8f\xb0\x47\xda\xa3\xec\xd1\xf6\x18\x7b\xac\x3d\xce\x1e\x6f\x4f\xb0\x27\xda\x93\xec\xc9\xf6\x14\x7b\xaa\x3d\xcd\x9e\x6e\xcf\xb0\x67\xda\xb3\xec\xd9\xf6\x1c\x7b\xae\x8d\xd9\xb8\x4d\xd8\xa4\x4d\xd9\xb4\xcd\xd8\xac\xcd\xd9\xbc\x2d\xd8\xa2\x2d\xd9\xb2\xad\xd8\xaa\xad\xd9\xba\x6d\xd8\xa6\x6d\xd9\xb6\xed\xd8\xae\xed\xd9\xbe\x1d\xd8\xa1\x1d\xd9\xc0\x86\x36\xb2\x63\xf6\x3c\x7b\xbe\xbd\xc0\x5e\x68\x2f\xb2\x17\xdb\x4b\xec\xa5\xf6\x32\x7b\xb9\xbd\xc2\x5e\x69\xaf\xb2\x57\xdb\x6b\xec\xb5\xf6\x3a\x7b\xbd\xbd\xc1\xde\x68\x6f\xb2\x37\xdb\x5b\xec\xad\xf6\x36\x7b\xbb\xbd\xc3\xde\x69\xef\xb2\x77\xdb\x7b\xec\xbd\xf6\x3e\x7b\xbf\x7d\xc0\x3e\x68\x1f\xb2\x0f\xdb\x47\xec\xa3\xf6\x31\xfb\xb8\x7d\xc2\x3e\x69\x9f\xb2\x4f\xdb\x67\xec\xb3\xf6\x39\xfb\xbc\x7d\xc1\xbe\x68\x5f\xb2\x2f\xdb\x57\xec\xab\xf6\x35\xfb\xba\x7d\xc3\xbe\x69\xdf\xb2\x6f\xdb\x77\xec\xbb\xf6\x3d\xfb\xbe\xfd\xc0\x7e\x68\x3f\xb2\x1f\xdb\x4f\xec\xa7\xf6\x33\xfb\xb9\xfd\xc2\x7e\x69\xbf\xb2\x5f\xdb\x6f\xec\xb7\xf6\x3b\xfb\xbd\xfd\xc1\xfe\x68\x7f\xb2\x3f\xdb\x5f\xec\xaf\xf6\x37\xfb\xbb\xfd\xc3\xfe\x69\xff\xb2\x7f\xdb\x7f\xec\xbf\xf6\x3f\x3b\xc1\x4e\xb4\x93\x9c\x38\x27\xde\x49\xe6\x24\x77\x52\x38\x29\x9d\x54\x4e\x6a\x27\x8d\x93\xd6\x49\xe7\xa4\x77\x32\x38\x19\x9d\x4c\x4e\x66\x27\x8b\x93\xd5\xc9\xe6\x64\x77\x72\x38\x39\x9d\x5c\x4e\x6e\x27\x8f\x93\xd7\xc9\xe7\xe4\x77\x0a\x38\x05\x9d\x42\x4e\x61\xa7\x88\x53\xd4\x29\xe6\x14\x77\x4a\x38\x25\x9d\x52\x4e\x69\xa7\x8c\x53\xd6\x29\xe7\x94\x77\x2a\x38\x15\x9d\x4a\x4e\x65\xa7\x8a\x53\xd5\xa9\xe6\x54\x77\x6a\x38\x35\x9d\x5a\x4e\x6d\xa7\x8e\x53\xd7\xa9\xe7\xd4\x77\x1a\x38\x0d\x9d\x46\x4e\x63\xa7\x89\xd3\xd4\x69\xe6\x34\x77\x5a\x38\x2d\x9d\x56\x4e\x6b\xa7\x8d\xd3\xd6\x69\xe7\xb4\x77\x3a\x38\x1d\x9d\x4e\x4e\x67\xa7\x8b\xd3\xd5\xf9\xcf\xe9\xe6\x74\x77\x7a\x38\x3d\x9d\x5e\x4e\x6f\xa7\x8f\xd3\xd7\xe9\xe7\xf4\x77\x06\x38\x03\x9d\x41\xce\x60\x67\x88\x33\xd4\x19\xe6\x0c\x77\x46\x38\x23\x9d\x51\xce\x68\x67\x8c\x33\xd6\x19\xe7\x8c\x77\x26\x38\x13\x9d\x49\xce\x64\x67\x8a\x33\xd5\x99\xe6\x4c\x77\x66\x38\x33\x9d\x59\xce\x6c\x67\x8e\x33\xd7\xc1\x1c\xdc\x21\x1c\xd2\xa1\x1c\xda\x61\x1c\xd6\xe1\x1c\xde\x11\x1c\xd1\x91\x1c\xd9\x51\x1c\xd5\xd1\x1c\xdd\x31\x1c\xd3\xb1\x1c\xdb\x71\x1c\xd7\xf1\x1c\xdf\x09\x9c\xd0\x89\x1c\xe0\x40\x07\x39\x31\x67\x9e\x33\xdf\x59\xe0\x2c\x74\x16\x39\x8b\x9d\x25\xce\x52\x67\x99\xb3\xdc\x59\xe1\xac\x74\x56\x39\xab\x9d\x35\xce\x5a\x67\x9d\xb3\xde\xd9\xe0\x6c\x74\x36\x39\x9b\x9d\x2d\xce\x56\x67\x9b\xb3\xdd\xd9\xe1\xec\x74\x76\x39\xbb\x9d\x3d\xce\x5e\x67\x9f\xb3\xdf\x39\xe0\x1c\x74\x0e\x39\x87\x9d\x23\xce\x51\xe7\x98\x73\xdc\x39\xe1\x9c\x74\x4e\x39\xa7\x9d\x33\xce\x59\xe7\x9c\x73\xde\xb9\xe0\x5c\x74\x2e\x39\x97\x9d\x2b\xce\x55\xe7\x9a\x73\xdd\xb9\xe1\xdc\x74\x6e\x39\xb7\x9d\x3b\xce\x5d\xe7\x9e\x73\xdf\x79\xe0\x3c\x74\x1e\x39\x8f\x9d\x27\xce\x53\xe7\x99\xf3\xdc\x79\xe1\xbc\x74\x5e\x39\xaf\x9d\x37\xce\x5b\xe7\x9d\xf3\xde\xf9\xe0\x7c\x74\x3e\x39\x9f\x9d\x2f\xce\x57\xe7\x9b\xf3\xdd\xf9\xe1\xfc\x74\x7e\x39\xbf\x9d\x3f\xce\x5f\xe7\x9f\x93\xe0\x24\x3a\x49\x6e\x9c\x1b\xef\x26\x73\x93\xbb\x29\xdc\x94\x6e\x2a\x37\xb5\x9b\xc6\x4d\xeb\xa6\x73\xd3\xbb\x19\xdc\x8c\x6e\x26\x37\xb3\x9b\xc5\xcd\xea\x66\x73\xb3\xbb\x39\xdc\x9c\x6e\x2e\x37\xb7\x9b\xc7\xcd\xeb\xe6\x73\xf3\xbb\x05\xdc\x82\x6e\x21\xb7\xb0\x5b\xc4\x2d\xea\x16\x73\x8b\xbb\x25\xdc\x92\x6e\x29\xb7\xb4\x5b\xc6\x2d\xeb\x96\x73\xcb\xbb\x15\xdc\x8a\x6e\x25\xb7\xb2\x5b\xc5\xad\xea\x56\x73\xab\xbb\x35\xdc\x9a\x6e\x2d\xb7\xb6\x5b\xc7\xad\xeb\xd6\x73\xeb\xbb\x0d\xdc\x86\x6e\x23\xb7\xb1\xdb\xc4\x6d\xea\x36\x73\x9b\xbb\x2d\xdc\x96\x6e\x2b\xb7\xb5\xdb\xc6\x6d\xeb\xb6\x73\xdb\xbb\x1d\xdc\x8e\x6e\x27\xb7\xb3\xdb\xc5\xed\xea\xfe\xe7\x76\x73\xbb\xbb\x3d\xdc\x9e\x6e\x2f\xb7\xb7\xdb\xc7\xed\xeb\xf6\x73\xfb\xbb\x03\xdc\x81\xee\x20\x77\xb0\x3b\xc4\x1d\xea\x0e\x73\x87\xbb\x23\xdc\x91\xee\x28\x77\xb4\x3b\xc6\x1d\xeb\x8e\x73\xc7\xbb\x13\xdc\x89\xee\x24\x77\xb2\x3b\xc5\x9d\xea\x4e\x73\xa7\xbb\x33\xdc\x99\xee\x2c\x77\xb6\x3b\xc7\x9d\xeb\x62\x2e\xee\x12\x2e\xe9\x52\x2e\xed\x32\x2e\xeb\x72\x2e\xef\x0a\xae\xe8\x4a\xae\xec\x2a\xae\xea\x6a\xae\xee\x1a\xae\xe9\x5a\xae\xed\x3a\xae\xeb\x7a\xae\xef\x06\x6e\xe8\x46\x2e\x70\xa1\x8b\xdc\x98\x3b\xcf\x9d\xef\x2e\x70\x17\xba\x8b\xdc\xc5\xee\x12\x77\xa9\xbb\xcc\x5d\xee\xae\x70\x57\xba\xab\xdc\xd5\xee\x1a\x77\xad\xbb\xce\x5d\xef\x6e\x70\x37\xba\x9b\xdc\xcd\xee\x16\x77\xab\xbb\xcd\xdd\xee\xee\x70\x77\xba\xbb\xdc\xdd\xee\x1e\x77\xaf\xbb\xcf\xdd\xef\x1e\x70\x0f\xba\x87\xdc\xc3\xee\x11\xf7\xa8\x7b\xcc\x3d\xee\x9e\x70\x4f\xba\xa7\xdc\xd3\xee\x19\xf7\xac\x7b\xce\x3d\xef\x5e\x70\x2f\xba\x97\xdc\xcb\xee\x15\xf7\xaa\x7b\xcd\xbd\xee\xde\x70\x6f\xba\xb7\xdc\xdb\xee\x1d\xf7\xae\x7b\xcf\xbd\xef\x3e\x70\x1f\xba\x8f\xdc\xc7\xee\x13\xf7\xa9\xfb\xcc\x7d\xee\xbe\x70\x5f\xba\xaf\xdc\xd7\xee\x1b\xf7\xad\xfb\xce\x7d\xef\x7e\x70\x3f\xba\x9f\xdc\xcf\xee\x17\xf7\xab\xfb\xcd\xfd\xee\xfe\x70\x7f\xba\xbf\xdc\xdf\xee\x1f\xf7\xaf\xfb\xcf\x4d\x70\x13\xdd\x24\x2f\xce\x8b\xf7\x92\x79\xc9\xbd\x14\x5e\x4a\x2f\x95\x97\xda\x4b\xe3\xa5\xf5\xd2\x79\xe9\xbd\x0c\x5e\x46\x2f\x93\x97\xd9\xcb\xe2\x65\xf5\xb2\x79\xd9\xbd\x1c\x5e\x4e\x2f\x97\x97\xdb\xcb\xe3\xe5\xf5\xf2\x79\xf9\xbd\x02\x5e\x41\xaf\x90\x57\xd8\x2b\xe2\x15\xf5\x8a\x79\xc5\xbd\x12\x5e\x49\xaf\x94\x57\xda\x2b\xe3\x95\xf5\xca\x79\xe5\xbd\x0a\x5e\x45\xaf\x92\x57\xd9\xab\xe2\x55\xf5\xaa\x79\xd5\xbd\x1a\x5e\x4d\xaf\x96\x57\xdb\xab\xe3\xd5\xf5\xea\x79\xf5\xbd\x06\x5e\x43\xaf\x91\xd7\xd8\x6b\xe2\x35\xf5\x9a\x79\xcd\xbd\x16\x5e\x4b\xaf\x95\xd7\xda\x6b\xe3\xb5\xf5\xda\x79\xed\xbd\x0e\x5e\x47\xaf\x93\xd7\xd9\xeb\xe2\x75\xf5\xfe\xf3\xba\x79\xdd\xbd\x1e\x5e\x4f\xaf\x97\xd7\xdb\xeb\xe3\xf5\xf5\xfa\x79\xfd\xbd\x01\xde\x40\x6f\x90\x37\xd8\x1b\xe2\x0d\xf5\x86\x79\xc3\xbd\x11\xde\x48\x6f\x94\x37\xda\x1b\xe3\x8d\xf5\xc6\x79\xe3\xbd\x09\xde\x44\x6f\x92\x37\xd9\x9b\xe2\x4d\xf5\xa6\x79\xd3\xbd\x19\xde\x4c\x6f\x96\x37\xdb\x9b\xe3\xcd\xf5\x30\x0f\xf7\x08\x8f\xf4\x28\x8f\xf6\x18\x8f\xf5\x38\x8f\xf7\x04\x4f\xf4\x24\x4f\xf6\x14\x4f\xf5\x34\x4f\xf7\x0c\xcf\xf4\x2c\xcf\xf6\x1c\xcf\xf5\x3c\xcf\xf7\x02\x2f\xf4\x22\x0f\x78\xd0\x43\x5e\xcc\x9b\xe7\xcd\xf7\x16\x78\x0b\xbd\x45\xde\x62\x6f\x89\xb7\xd4\x5b\xe6\x2d\xf7\x56\x78\x2b\xbd\x55\xde\x6a\x6f\x8d\xb7\xd6\x5b\xe7\xad\xf7\x36\x78\x1b\xbd\x4d\xde\x66\x6f\x8b\xb7\xd5\xdb\xe6\x6d\xf7\x76\x78\x3b\xbd\x5d\xde\x6e\x6f\x8f\xb7\xd7\xdb\xe7\xed\xf7\x0e\x78\x07\xbd\x43\xde\x61\xef\x88\x77\xd4\x3b\xe6\x1d\xf7\x4e\x78\x27\xbd\x53\xde\x69\xef\x8c\x77\xd6\x3b\xe7\x9d\xf7\x2e\x78\x17\xbd\x4b\xde\x65\xef\x8a\x77\xd5\xbb\xe6\x5d\xf7\x6e\x78\x37\xbd\x5b\xde\x6d\xef\x8e\x77\xd7\xbb\xe7\xdd\xf7\x1e\x78\x0f\xbd\x47\xde\x63\xef\x89\xf7\xd4\x7b\xe6\x3d\xf7\x5e\x78\x2f\xbd\x57\xde\x6b\xef\x8d\xf7\xd6\x7b\xe7\xbd\xf7\x3e\x78\x1f\xbd\x4f\xde\x67\xef\x8b\xf7\xd5\xfb\xe6\x7d\xf7\x7e\x78\x3f\xbd\x5f\xde\x6f\xef\x8f\xf7\xd7\xfb\xe7\x25\x78\x89\x5e\x92\x1f\xe7\xc7\xfb\xc9\xfc\xe4\x7e\x0a\x3f\xa5\x9f\xca\x4f\xed\xa7\xf1\xd3\xfa\xe9\xfc\xf4\x7e\x06\x3f\xa3\x9f\xc9\xcf\xec\x67\xf1\xb3\xfa\xd9\xfc\xec\x7e\x0e\x3f\xa7\x9f\xcb\xcf\xed\xe7\xf1\xf3\xfa\xf9\xfc\xfc\x7e\x01\xbf\xa0\x5f\xc8\x2f\xec\x17\xf1\x8b\xfa\xc5\xfc\xe2\x7e\x09\xbf\xa4\x5f\xca\x2f\xed\x97\xf1\xcb\xfa\xe5\xfc\xf2\x7e\x05\xbf\xa2\x5f\xc9\xaf\xec\x57\xf1\xab\xfa\xd5\xfc\xea\x7e\x0d\xbf\xa6\x5f\xcb\xaf\xed\xd7\xf1\xeb\xfa\xf5\xfc\xfa\x7e\x03\xbf\xa1\xdf\xc8\x6f\xec\x37\xf1\x9b\xfa\xcd\xfc\xe6\x7e\x0b\xbf\xa5\xdf\xca\x6f\xed\xb7\xf1\xdb\xfa\xed\xfc\xf6\x7e\x07\xbf\xa3\xdf\xc9\xef\xec\x77\xf1\xbb\xfa\xff\xf9\xdd\xfc\xee\x7e\x0f\xbf\xa7\xdf\xcb\xef\xed\xf7\xf1\xfb\xfa\xfd\xfc\xfe\xfe\x00\x7f\xa0\x3f\xc8\x1f\xec\x0f\xf1\x87\xfa\xc3\xfc\xe1\xfe\x08\x7f\xa4\x3f\xca\x1f\xed\x8f\xf1\xc7\xfa\xe3\xfc\xf1\xfe\x04\x7f\xa2\x3f\xc9\x9f\xec\x4f\xf1\xa7\xfa\xd3\xfc\xe9\xfe\x0c\x7f\xa6\x3f\xcb\x9f\xed\xcf\xf1\xe7\xfa\x98\x8f\xfb\x84\x4f\xfa\x94\x4f\xfb\x8c\xcf\xfa\x9c\xcf\xfb\x82\x2f\xfa\x92\x2f\xfb\x8a\xaf\xfa\x9a\xaf\xfb\x86\x6f\xfa\x96\x6f\xfb\x8e\xef\xfa\x9e\xef\xfb\x81\x1f\xfa\x91\x0f\x7c\xe8\x23\x3f\xe6\xcf\xf3\xe7\xfb\x0b\xfc\x85\xfe\x22\x7f\xb1\xbf\xc4\x5f\xea\x2f\xf3\x97\xfb\x2b\xfc\x95\xfe\x2a\x7f\xb5\xbf\xc6\x5f\xeb\xaf\xf3\xd7\xfb\x1b\xfc\x8d\xfe\x26\x7f\xb3\xbf\xc5\xdf\xea\x6f\xf3\xb7\xfb\x3b\xfc\x9d\xfe\x2e\x7f\xb7\xbf\xc7\xdf\xeb\xef\xf3\xf7\xfb\x07\xfc\x83\xfe\x21\xff\xb0\x7f\xc4\x3f\xea\x1f\xf3\x8f\xfb\x27\xfc\x93\xfe\x29\xff\xb4\x7f\xc6\x3f\xeb\x9f\xf3\xcf\xfb\x17\xfc\x8b\xfe\x25\xff\xb2\x7f\xc5\xbf\xea\x5f\xf3\xaf\xfb\x37\xfc\x9b\xfe\x2d\xff\xb6\x7f\xc7\xbf\xeb\xdf\xf3\xef\xfb\x0f\xfc\x87\xfe\x23\xff\xb1\xff\xc4\x7f\xea\x3f\xf3\x9f\xfb\x2f\xfc\x97\xfe\x2b\xff\xb5\xff\xc6\x7f\xeb\xbf\xf3\xdf\xfb\x1f\xfc\x8f\xfe\x27\xff\xb3\xff\xc5\xff\xea\x7f\xf3\xbf\xfb\x3f\xfc\x9f\xfe\x2f\xff\xb7\xff\xc7\xff\xeb\xff\xf3\x13\xfc\x44\x3f\x29\x88\x0b\xe2\x83\x64\x41\xf2\x20\x45\x90\x32\x48\x15\xa4\x0e\xd2\x04\x69\x83\x74\x41\xfa\x20\x43\x90\x31\xc8\x14\x64\x0e\xb2\x04\x59\x83\x6c\x41\xf6\x20\x47\x90\x33\xc8\x15\xe4\x0e\xf2\x04\x79\x83\x7c\x41\xfe\xa0\x40\x50\x30\x28\x14\x14\x0e\x8a\x04\x45\x83\x62\x41\xf1\xa0\x44\x50\x32\x28\x15\x94\x0e\xca\x04\x65\x83\x72\x41\xf9\xa0\x42\x50\x31\xa8\x14\x54\x0e\xaa\x04\x55\x83\x6a\x41\xf5\xa0\x46\x50\x33\xa8\x15\xd4\x0e\xea\x04\x75\x83\x7a\x41\xfd\xa0\x41\xd0\x30\x68\x14\x34\x0e\x9a\x04\x4d\x83\x66\x41\xf3\xa0\x45\xd0\x32\x68\x15\xb4\x0e\xda\x04\x6d\x83\x76\x41\xfb\xa0\x43\xd0\x31\xe8\x14\x74\x0e\xba\x04\x5d\x83\xff\x82\x6e\x41\xf7\xa0\x47\xd0\x33\xe8\x15\xf4\x0e\xfa\x04\x7d\x83\x7e\x41\xff\x60\x40\x30\x30\x18\x14\x0c\x0e\x86\x04\x43\x83\x61\xc1\xf0\x60\x44\x30\x32\x18\x15\x8c\x0e\xc6\x04\x63\x83\x71\xc1\xf8\x60\x42\x30\x31\x98\x14\x4c\x0e\xa6\x04\x53\x83\x69\xc1\xf4\x60\x46\x30\x33\x98\x15\xcc\x0e\xe6\x04\x73\x03\x2c\xc0\x03\x22\x20\x03\x2a\xa0\x03\x26\x60\x03\x2e\xe0\x03\x21\x10\x03\x29\x90\x03\x25\x50\x03\x2d\xd0\x03\x23\x30\x03\x2b\xb0\x03\x27\x70\x03\x2f\xf0\x83\x20\x08\x83\x28\x00\x01\x0c\x50\x10\x0b\xe6\x05\xf3\x83\x05\xc1\xc2\x60\x51\xb0\x38\x58\x12\x2c\x0d\x96\x05\xcb\x83\x15\xc1\xca\x60\x55\xb0\x3a\x58\x13\xac\x0d\xd6\x05\xeb\x83\x0d\xc1\xc6\x60\x53\xb0\x39\xd8\x12\x6c\x0d\xb6\x05\xdb\x83\x1d\xc1\xce\x60\x57\xb0\x3b\xd8\x13\xec\x0d\xf6\x05\xfb\x83\x03\xc1\xc1\xe0\x50\x70\x38\x38\x12\x1c\x0d\x8e\x05\xc7\x83\x13\xc1\xc9\xe0\x54\x70\x3a\x38\x13\x9c\x0d\xce\x05\xe7\x83\x0b\xc1\xc5\xe0\x52\x70\x39\xb8\x12\x5c\x0d\xae\x05\xd7\x83\x1b\xc1\xcd\xe0\x56\x70\x3b\xb8\x13\xdc\x0d\xee\x05\xf7\x83\x07\xc1\xc3\xe0\x51\xf0\x38\x78\x12\x3c\x0d\x9e\x05\xcf\x83\x17\xc1\xcb\xe0\x55\xf0\x3a\x78\x13\xbc\x0d\xde\x05\xef\x83\x0f\xc1\xc7\xe0\x53\xf0\x39\xf8\x12\x7c\x0d\xbe\x05\xdf\x83\x1f\xc1\xcf\xe0\x57\xf0\x3b\xf8\x13\xfc\x0d\xfe\x05\x09\x41\x62\x90\x14\xc6\x85\xf1\x61\xb2\x30\x79\x98\x22\x4c\x19\xa6\x0a\x53\x87\x69\xc2\xb4\x61\xba\x30\x7d\x98\x21\xcc\x18\x66\x0a\x33\x87\x59\xc2\xac\x61\xb6\x30\x7b\x98\x23\xcc\x19\xe6\x0a\x73\x87\x79\xc2\xbc\x61\xbe\x30\x7f\x58\x20\x2c\x18\x16\x0a\x0b\x87\x45\xc2\xa2\x61\xb1\xb0\x78\x58\x22\x2c\x19\x96\x0a\x4b\x87\x65\xc2\xb2\x61\xb9\xb0\x7c\x58\x21\xac\x18\x56\x0a\x2b\x87\x55\xc2\xaa\x61\xb5\xb0\x7a\x58\x23\xac\x19\xd6\x0a\x6b\x87\x75\xc2\xba\x61\xbd\xb0\x7e\xd8\x20\x6c\x18\x36\x0a\x1b\x87\x4d\xc2\xa6\x61\xb3\xb0\x79\xd8\x22\x6c\x19\xb6\x0a\x5b\x87\x6d\xc2\xb6\x61\xbb\xb0\x7d\xd8\x21\xec\x18\x76\x0a\x3b\x87\x5d\xc2\xae\xe1\x7f\x61\xb7\xb0\x7b\xd8\x23\xec\x19\xf6\x0a\x7b\x87\x7d\xc2\xbe\x61\xbf\xb0\x7f\x38\x20\x1c\x18\x0e\x0a\x07\x87\x43\xc2\xa1\xe1\xb0\x70\x78\x38\x22\x1c\x19\x8e\x0a\x47\x87\x63\xc2\xb1\xe1\xb8\x70\x7c\x38\x21\x9c\x18\x4e\x0a\x27\x87\x53\xc2\xa9\xe1\xb4\x70\x7a\x38\x23\x9c\x19\xce\x0a\x67\x87\x73\xc2\xb9\x21\x16\xe2\x21\x11\x92\x21\x15\xd2\x21\x13\xb2\x21\x17\xf2\xa1\x10\x8a\xa1\x14\xca\xa1\x12\xaa\xa1\x16\xea\xa1\x11\x9a\xa1\x15\xda\xa1\x13\xba\xa1\x17\xfa\x61\x10\x86\x61\x14\x82\x10\x86\x28\x8c\x85\xf3\xc2\xf9\xe1\x82\x70\x61\xb8\x28\x5c\x1c\x2e\x09\x97\x86\xcb\xc2\xe5\xe1\x8a\x70\x65\xb8\x2a\x5c\x1d\xae\x09\xd7\x86\xeb\xc2\xf5\xe1\x86\x70\x63\xb8\x29\xdc\x1c\x6e\x09\xb7\x86\xdb\xc2\xed\xe1\x8e\x70\x67\xb8\x2b\xdc\x1d\xee\x09\xf7\x86\xfb\xc2\xfd\xe1\x81\xf0\x60\x78\x28\x3c\x1c\x1e\x09\x8f\x86\xc7\xc2\xe3\xe1\x89\xf0\x64\x78\x2a\x3c\x1d\x9e\x09\xcf\x86\xe7\xc2\xf3\xe1\x85\xf0\x62\x78\x29\xbc\x1c\x5e\x09\xaf\x86\xd7\xc2\xeb\xe1\x8d\xf0\x66\x78\x2b\xbc\x1d\xde\x09\xef\x86\xf7\xc2\xfb\xe1\x83\xf0\x61\xf8\x28\x7c\x1c\x3e\x09\x9f\x86\xcf\xc2\xe7\xe1\x8b\xf0\x65\xf8\x2a\x7c\x1d\xbe\x09\xdf\x86\xef\xc2\xf7\xe1\x87\xf0\x63\xf8\x29\xfc\x1c\x7e\x09\xbf\x86\xdf\xc2\xef\xe1\x8f\xf0\x67\xf8\x2b\xfc\x1d\xfe\x09\xff\x86\xff\xc2\x84\x30\x31\x4c\x8a\xe2\xa2\xf8\x28\x59\x94\x3c\x4a\x11\xa5\x8c\x52\x45\xa9\xa3\x34\x51\xda\x28\x5d\x94\x3e\xca\x10\x65\x8c\x32\x45\x99\xa3\x2c\x51\xd6\x28\x5b\x94\x3d\xca\x11\xe5\x8c\x72\x45\xb9\xa3\x3c\x51\xde\x28\x5f\x94\x3f\x2a\x10\x15\x8c\x0a\x45\x85\xa3\x22\x51\xd1\xa8\x58\x54\x3c\x2a\x11\x95\x8c\x4a\x45\xa5\xa3\x32\x51\xd9\xa8\x5c\x54\x3e\xaa\x10\x55\x8c\x2a\x45\x95\xa3\x2a\x51\xd5\xa8\x5a\x54\x3d\xaa\x11\xd5\x8c\x6a\x45\xb5\xa3\x3a\x51\xdd\xa8\x5e\x54\x3f\x6a\x10\x35\x8c\x1a\x45\x8d\xa3\x26\x51\xd3\xa8\x59\xd4\x3c\x6a\x11\xb5\x8c\x5a\x45\xad\xa3\x36\x51\xdb\xa8\x5d\xd4\x3e\xea\x10\x75\x8c\x3a\x45\x9d\xa3\x2e\x51\xd7\xe8\xbf\xa8\x5b\xd4\x3d\xea\x11\xf5\x8c\x7a\x45\xbd\xa3\x3e\x51\xdf\xa8\x5f\xd4\x3f\x1a\x10\x0d\x8c\x06\x45\x83\xa3\x21\xd1\xd0\x68\x58\x34\x3c\x1a\x11\x8d\x8c\x46\x45\xa3\xa3\x31\xd1\xd8\x68\x5c\x34\x3e\x9a\x10\x4d\x8c\x26\x45\x93\xa3\x29\xd1\xd4\x68\x5a\x34\x3d\x9a\x11\xcd\x8c\x66\x45\xb3\xa3\x39\xd1\xdc\x08\x8b\xf0\x88\x88\xc8\x88\x8a\xe8\x88\x89\xd8\x88\x8b\xf8\x48\x88\xc4\x48\x8a\xe4\x48\x89\xd4\x48\x8b\xf4\xc8\x88\xcc\xc8\x8a\xec\xc8\x89\xdc\xc8\x8b\xfc\x28\x88\xc2\x28\x8a\x40\x04\x23\x14\xc5\xa2\x79\xd1\xfc\x68\x41\xb4\x30\x5a\x14\x2d\x8e\x96\x44\x4b\xa3\x65\xd1\xf2\x68\x45\xb4\x32\x5a\x15\xad\x8e\xd6\x44\x6b\xa3\x75\xd1\xfa\x68\x43\xb4\x31\xda\x14\x6d\x8e\xb6\x44\x5b\xa3\x6d\xd1\xf6\x68\x47\xb4\x33\xda\x15\xed\x8e\xf6\x44\x7b\xa3\x7d\xd1\xfe\xe8\x40\x74\x30\x3a\x14\x1d\x8e\x8e\x44\x47\xa3\x63\xd1\xf1\xe8\x44\x74\x32\x3a\x15\x9d\x8e\xce\x44\x67\xa3\x73\xd1\xf9\xe8\x42\x74\x31\xba\x14\x5d\x8e\xae\x44\x57\xa3\x6b\xd1\xf5\xe8\x46\x74\x33\xba\x15\xdd\x8e\xee\x44\x77\xa3\x7b\xd1\xfd\xe8\x41\xf4\x30\x7a\x14\x3d\x8e\x9e\x44\x4f\xa3\x67\xd1\xf3\xe8\x45\xf4\x32\x7a\x15\xbd\x8e\xde\x44\x6f\xa3\x77\xd1\xfb\xe8\x43\xf4\x31\xfa\x14\x7d\x8e\xbe\x44\x5f\xa3\x6f\xd1\xf7\xe8\x47\xf4\x33\xfa\x15\xfd\x8e\xfe\x44\x7f\xa3\x7f\x51\x42\x94\x18\x25\x81\x38\x10\x0f\x92\x81\xe4\x20\x05\x48\x09\x52\x81\xd4\x20\x0d\x48\x0b\xd2\x81\xf4\x20\x03\xc8\x08\x32\x81\xcc\x20\x0b\xc8\x0a\xb2\x81\xec\x20\x07\xc8\x09\x72\x81\xdc\x20\x0f\xc8\x0b\xf2\x81\xfc\xa0\x00\x28\x08\x0a\x81\xc2\xa0\x08\x28\x0a\x8a\x81\xe2\xa0\x04\x28\x09\x4a\x81\xd2\xa0\x0c\x28\x0b\xca\x81\xf2\xa0\x02\xa8\x08\x2a\x81\xca\xa0\x0a\xa8\x0a\xaa\x81\xea\xa0\x06\xa8\x09\x6a\x81\xda\xa0\x0e\xa8\x0b\xea\x81\xfa\xa0\x01\x68\x08\x1a\x81\xc6\xa0\x09\x68\x0a\x9a\x81\xe6\xa0\x05\x68\x09\x5a\x81\xd6\xa0\x0d\x68\x0b\xda\x81\xf6\xa0\x03\xe8\x08\x3a\x81\xce\xa0\x0b\xe8\x0a\xfe\x03\xdd\x40\x77\xd0\x03\xf4\x04\xbd\x40\x6f\xd0\x07\xf4\x05\xfd\x40\x7f\x30\x00\x0c\x04\x83\xc0\x60\x30\x04\x0c\x05\xc3\xc0\x70\x30\x02\x8c\x04\xa3\xc0\x68\x30\x06\x8c\x05\xe3\xc0\x78\x30\x01\x4c\x04\x93\xc0\x64\x30\x05\x4c\x05\xd3\xc0\x74\x30\x03\xcc\x04\xb3\xc0\x6c\x30\x07\xcc\x05\x18\xc0\x01\x01\x48\x40\x01\x1a\x30\x80\x05\x1c\xe0\x81\x00\x44\x20\x01\x19\x28\x40\x05\x1a\xd0\x81\x01\x4c\x60\x01\x1b\x38\xc0\x05\x1e\xf0\x41\x00\x42\x10\x01\x00\x20\x40\x20\x06\xe6\x81\xf9\x60\x01\x58\x08\x16\x81\xc5\x60\x09\x58\x0a\x96\x81\xe5\x60\x05\x58\x09\x56\x81\xd5\x60\x0d\x58\x0b\xd6\x81\xf5\x60\x03\xd8\x08\x36\x81\xcd\x60\x0b\xd8\x0a\xb6\x81\xed\x60\x07\xd8\x09\x76\x81\xdd\x60\x0f\xd8\x0b\xf6\x81\xfd\xe0\x00\x38\x08\x0e\x81\xc3\xe0\x08\x38\x0a\x8e\x81\xe3\xe0\x04\x38\x09\x4e\x81\xd3\xe0\x0c\x38\x0b\xce\x81\xf3\xe0\x02\xb8\x08\x2e\x81\xcb\xe0\x0a\xb8\x0a\xae\x81\xeb\xe0\x06\xb8\x09\x6e\x81\xdb\xe0\x0e\xb8\x0b\xee\x81\xfb\xe0\x01\x78\x08\x1e\x81\xc7\xe0\x09\x78\x0a\x9e\x81\xe7\xe0\x05\x78\x09\x5e\x81\xd7\xe0\x0d\x78\x0b\xde\x81\xf7\xe0\x03\xf8\x08\x3e\x81\xcf\xe0\x0b\xf8\x0a\xbe\x81\xef\xe0\x07\xf8\x09\x7e\x81\xdf\xe0\x0f\xf8\x0b\xfe\x81\x04\x90\x08\x92\x60\x1c\x8c\x87\xc9\x60\x72\x98\x02\xa6\x84\xa9\x60\x6a\x98\x06\xa6\x85\xe9\x60\x7a\x98\x01\x66\x84\x99\x60\x66\x98\x05\x66\x85\xd9\x60\x76\x98\x03\xe6\x84\xb9\x60\x6e\x98\x07\xe6\x85\xf9\x60\x7e\x58\x00\x16\x84\x85\x60\x61\x58\x04\x16\x85\xc5\x60\x71\x58\x02\x96\x84\xa5\x60\x69\x58\x06\x96\x85\xe5\x60\x79\x58\x01\x56\x84\x95\x60\x65\x58\x05\x56\x85\xd5\x60\x75\x58\x03\xd6\x84\xb5\x60\x6d\x58\x07\xd6\x85\xf5\x60\x7d\xd8\x00\x36\x84\x8d\x60\x63\xd8\x04\x36\x85\xcd\x60\x73\xd8\x02\xb6\x84\xad\x60\x6b\xd8\x06\xb6\x85\xed\x60\x7b\xd8\x01\x76\x84\x9d\x60\x67\xd8\x05\x76\x85\xff\xc1\x6e\xb0\x3b\xec\x01\x7b\xc2\x5e\xb0\x37\xec\x03\xfb\xc2\x7e\xb0\x3f\x1c\x00\x07\xc2\x41\x70\x30\x1c\x02\x87\xc2\x61\x70\x38\x1c\x01\x47\xc2\x51\x70\x34\x1c\x03\xc7\xc2\x71\x70\x3c\x9c\x00\x27\xc2\x49\x70\x32\x9c\x02\xa7\xc2\x69\x70\x3a\x9c\x01\x67\xc2\x59\x70\x36\x9c\x03\xe7\x42\x0c\xe2\x90\x80\x24\xa4\x20\x0d\x19\xc8\x42\x0e\xf2\x50\x80\x22\x94\xa0\x0c\x15\xa8\x42\x0d\xea\xd0\x80\x26\xb4\xa0\x0d\x1d\xe8\x42\x0f\xfa\x30\x80\x21\x8c\x20\x80\x10\x22\x18\x83\xf3\xe0\x7c\xb8\x00\x2e\x84\x8b\xe0\x62\xb8\x04\x2e\x85\xcb\xe0\x72\xb8\x02\xae\x84\xab\xe0\x6a\xb8\x06\xae\x85\xeb\xe0\x7a\xb8\x01\x6e\x84\x9b\xe0\x66\xb8\x05\x6e\x85\xdb\xe0\x76\xb8\x03\xee\x84\xbb\xe0\x6e\xb8\x07\xee\x85\xfb\xe0\x7e\x78\x00\x1e\x84\x87\xe0\x61\x78\x04\x1e\x85\xc7\xe0\x71\x78\x02\x9e\x84\xa7\xe0\x69\x78\x06\x9e\x85\xe7\xe0\x79\x78\x01\x5e\x84\x97\xe0\x65\x78\x05\x5e\x85\xd7\xe0\x75\x78\x03\xde\x84\xb7\xe0\x6d\x78\x07\xde\x85\xf7\xe0\x7d\xf8\x00\x3e\x84\x8f\xe0\x63\xf8\x04\x3e\x85\xcf\xe0\x73\xf8\x02\xbe\x84\xaf\xe0\x6b\xf8\x06\xbe\x85\xef\xe0\x7b\xf8\x01\x7e\x84\x9f\xe0\x67\xf8\x05\x7e\x85\xdf\xe0\x77\xf8\x03\xfe\x84\xbf\xe0\x6f\xf8\x07\xfe\x85\xff\x60\x02\x4c\x84\x49\x28\x0e\xc5\xa3\x64\x28\x39\x4a\x81\x52\xa2\x54\x28\x35\x4a\x83\xd2\xa2\x74\x28\x3d\xca\x80\x32\xa2\x4c\x28\x33\xca\x82\xb2\xa2\x6c\x28\x3b\xca\x81\x72\xa2\x5c\x28\x37\xca\x83\xf2\xa2\x7c\x28\x3f\x2a\x80\x0a\xa2\x42\xa8\x30\x2a\x82\x8a\xa2\x62\xa8\x38\x2a\x81\x4a\xa2\x52\xa8\x34\x2a\x83\xca\xa2\x72\xa8\x3c\xaa\x80\x2a\xa2\x4a\xa8\x32\xaa\x82\xaa\xa2\x6a\xa8\x3a\xaa\x81\x6a\xa2\x5a\xa8\x36\xaa\x83\xea\xa2\x7a\xa8\x3e\x6a\x80\x1a\xa2\x46\xa8\x31\x6a\x82\x9a\xa2\x66\xa8\x39\x6a\x81\x5a\xa2\x56\xa8\x35\x6a\x83\xda\xa2\x76\xa8\x3d\xea\x80\x3a\xa2\x4e\xa8\x33\xea\x82\xba\xa2\xff\x50\x37\xd4\x1d\xf5\x40\x3d\x51\x2f\xd4\x1b\xf5\x41\x7d\x51\x3f\xd4\x1f\x0d\x40\x03\xd1\x20\x34\x18\x0d\x41\x43\xd1\x30\x34\x1c\x8d\x40\x23\xd1\x28\x34\x1a\x8d\x41\x63\xd1\x38\x34\x1e\x4d\x40\x13\xd1\x24\x34\x19\x4d\x41\x53\xd1\x34\x34\x1d\xcd\x40\x33\xd1\x2c\x34\x1b\xcd\x41\x73\x11\x86\x70\x44\x20\x12\x51\x88\x46\x0c\x62\x11\x87\x78\x24\x20\x11\x49\x48\x46\x0a\x52\x91\x86\x74\x64\x20\x13\x59\xc8\x46\x0e\x72\x91\x87\x7c\x14\xa0\x10\x45\x08\x20\x88\x10\x8a\xa1\x79\x68\x3e\x5a\x80\x16\xa2\x45\x68\x31\x5a\x82\x96\xa2\x65\x68\x39\x5a\x81\x56\xa2\x55\x68\x35\x5a\x83\xd6\xa2\x75\x68\x3d\xda\x80\x36\xa2\x4d\x68\x33\xda\x82\xb6\xa2\x6d\x68\x3b\xda\x81\x76\xa2\x5d\x68\x37\xda\x83\xf6\xa2\x7d\x68\x3f\x3a\x80\x0e\xa2\x43\xe8\x30\x3a\x82\x8e\xa2\x63\xe8\x38\x3a\x81\x4e\xa2\x53\xe8\x34\x3a\x83\xce\xa2\x73\xe8\x3c\xba\x80\x2e\xa2\x4b\xe8\x32\xba\x82\xae\xa2\x6b\xe8\x3a\xba\x81\x6e\xa2\x5b\xe8\x36\xba\x83\xee\xa2\x7b\xe8\x3e\x7a\x80\x1e\xa2\x47\xe8\x31\x7a\x82\x9e\xa2\x67\xe8\x39\x7a\x81\x5e\xa2\x57\xe8\x35\x7a\x83\xde\xa2\x77\xe8\x3d\xfa\x80\x3e\xa2\x4f\xe8\x33\xfa\x82\xbe\xa2\x6f\xe8\x3b\xfa\x81\x7e\xa2\x5f\xe8\x37\xfa\x83\xfe\xa2\x7f\x28\x01\x25\xa2\xa4\x58\x5c\x2c\x3e\x96\x2c\x96\x3c\x96\x22\x96\x32\x96\x2a\x96\x3a\x96\x26\x96\x36\x96\x2e\x96\x3e\x96\x21\x96\x31\x96\x29\x96\x39\x96\x25\x96\x35\x96\x2d\x96\x3d\x96\x23\x96\x33\x96\x2b\x96\x3b\x96\x27\x96\x37\x96\x2f\x96\x3f\x56\x20\x56\x30\x56\x28\x56\x38\x56\x24\x56\x34\x56\x2c\x56\x3c\x56\x22\x56\x32\x56\x2a\x56\x3a\x56\x26\x56\x36\x56\x2e\x56\x3e\x56\x21\x56\x31\x56\x29\x56\x39\x56\x25\x56\x35\x56\x2d\x56\x3d\x56\x23\x56\x33\x56\x2b\x56\x3b\x56\x27\x56\x37\x56\x2f\x56\x3f\xd6\x20\xd6\x30\xd6\x28\xd6\x38\xd6\x24\xd6\x34\xd6\x2c\xd6\x3c\xd6\x22\xd6\x32\xd6\x2a\xd6\x3a\xd6\x26\xd6\x36\xd6\x2e\xd6\x3e\xd6\x21\xd6\x31\xd6\x29\xd6\x39\xd6\x25\xd6\xf5\x7f\x02\xe0\x01\x40\x8e\x18\x00\x00\x60\x6d\xdb\xb6\x6d\xdb\xb6\x6d\xdb\xb6\xad\xb5\x6d\x25\xb9\xda\xb6\x6d\xdb\x78\x74\xb0\x6e\x58\x77\xac\x07\xd6\x13\xeb\x85\xf5\xc6\xfa\x60\x7d\xb1\x7e\x58\x7f\x6c\x00\x36\x10\x1b\x84\x0d\xc6\x86\x60\x43\xb1\x61\xd8\x70\x6c\x04\x36\x12\x1b\x85\x8d\xc6\xc6\x60\x63\xb1\x71\xd8\x78\x6c\x02\x36\x11\x9b\x84\x4d\xc6\xa6\x60\x53\xb1\x69\xd8\x74\x6c\x06\x36\x13\x9b\x85\xcd\xc6\xe6\x60\x73\xb1\x79\xd8\x7c\x6c\x01\xb6\x10\x5b\x84\x2d\xc6\x96\x60\x4b\xb1\x65\xd8\x72\x6c\x05\xb6\x12\x5b\x85\xad\xc6\xd6\x60\x6b\xb1\x75\xd8\x7a\x6c\x03\xb6\x11\xdb\x84\x6d\xc6\xb6\x60\x5b\xb1\x6d\xd8\x76\x6c\x07\xb6\x13\xdb\x85\xed\xc6\xf6\x60\x7b\xb1\x7d\x18\x86\xe1\x18\x81\x91\x18\x85\xd1\x18\x83\xb1\x18\x87\xf1\x98\x80\x89\x98\x84\xc9\x98\x82\xa9\x98\x86\xe9\x98\x81\x99\x98\x85\xd9\x98\x83\xb9\x98\x87\xf9\x58\x80\x85\x58\x84\x01\x0c\x62\x08\x8b\x61\xfb\xb1\x03\xd8\x41\xec\x10\x76\x18\x3b\x82\x1d\xc5\x8e\x61\xc7\xb1\x13\xd8\x49\xec\x14\x76\x1a\x3b\x83\x9d\xc5\xce\x61\xe7\xb1\x0b\xd8\x45\xec\x12\x76\x19\xbb\x82\x5d\xc5\xae\x61\xd7\xb1\x1b\xd8\x4d\xec\x16\x76\x1b\xbb\x83\xdd\xc5\xee\x61\xf7\xb1\x07\xd8\x43\xec\x11\xf6\x18\x7b\x82\x3d\xc5\x9e\x61\xcf\xb1\x17\xd8\x4b\xec\x15\xf6\x1a\x7b\x83\xbd\xc5\xde\x61\xef\xb1\x0f\xd8\x47\xec\x13\xf6\x19\xfb\x82\x7d\xc5\xbe\x61\xdf\xb1\x1f\xd8\x4f\xec\x17\xf6\x1b\xfb\x83\xfd\xc5\xfe\x61\x71\x58\x3c\x96\x80\x25\xe2\x49\xf0\xa4\x78\x32\x3c\x39\x9e\x02\x4f\x89\xa7\xc2\x53\xe3\x69\xf0\xb4\x78\x3a\x3c\x3d\x9e\x01\xcf\x88\x67\xc2\x33\xe3\x59\xf0\xac\x78\x36\x3c\x3b\x9e\x03\xcf\x89\xe7\xc2\x73\xe3\x79\xf0\xbc\x78\x3e\x3c\x3f\x5e\x00\x2f\x88\x17\xc2\x0b\xe3\x45\xf0\xa2\x78\x31\xbc\x38\x5e\x02\x2f\x89\x97\xc2\x4b\xe3\x65\xf0\xb2\x78\x39\xbc\x3c\x5e\x01\xaf\x88\x57\xc2\x2b\xe3\x55\xf0\xaa\x78\x35\xbc\x3a\x5e\x03\xaf\x89\xd7\xc2\x6b\xe3\x75\xf0\xba\x78\x3d\xbc\x3e\xde\x00\x6f\x88\x37\xc2\x1b\xe3\x4d\xf0\xa6\x78\x33\xbc\x39\xde\x02\x6f\x89\xb7\xc2\x5b\xe3\x6d\xf0\xb6\x78\x3b\xbc\x3d\xde\x01\xef\x88\x77\xc2\x3b\xe3\x5d\xf0\xae\x78\x37\xbc\x3b\xde\x03\xef\x89\xf7\xc2\x7b\xe3\x7d\xf0\xbe\x78\x3f\xbc\x3f\x3e\x00\x1f\x88\x0f\xc2\x07\xe3\x43\xf0\xa1\xf8\x30\x7c\x38\x3e\x02\x1f\x89\x8f\xc2\x47\xe3\x63\xf0\xb1\xf8\x38\x7c\x3c\x3e\x01\x9f\x88\x4f\xc2\x27\xe3\x53\xf0\xa9\xf8\x34\x7c\x3a\x3e\x03\x9f\x89\xcf\xc2\x67\xe3\x73\xf0\xb9\xf8\x3c\x7c\x3e\xbe\x00\x5f\x88\x2f\xc2\x17\xe3\x4b\xf0\xa5\xf8\x32\x7c\x39\xbe\x02\x5f\x89\xaf\xc2\x57\xe3\x6b\xf0\xb5\xf8\x3a\x7c\x3d\xbe\x01\xdf\x88\x6f\xc2\x37\xe3\x5b\xf0\xad\xf8\x36\x7c\x3b\xbe\x03\xdf\x89\xef\xc2\x77\xe3\x7b\xf0\xbd\xf8\x3e\x1c\xc3\x71\x9c\xc0\x49\x9c\xc2\x69\x9c\xc1\x59\x9c\xc3\x79\x5c\xc0\x45\x5c\xc2\x65\x5c\xc1\x55\x5c\xc3\x75\xdc\xc0\x4d\xdc\xc2\x6d\xdc\xc1\x5d\xdc\xc3\x7d\x3c\xc0\x43\x3c\xc2\x01\x0e\x71\x84\xc7\xf0\xfd\xf8\x01\xfc\x20\x7e\x08\x3f\x8c\x1f\xc1\x8f\xe2\xc7\xf0\xe3\xf8\x09\xfc\x24\x7e\x0a\x3f\x8d\x9f\xc1\xcf\xe2\xe7\xf0\xf3\xf8\x05\xfc\x22\x7e\x09\xbf\x8c\x5f\xc1\xaf\xe2\xd7\xf0\xeb\xf8\x0d\xfc\x26\x7e\x0b\xbf\x8d\xdf\xc1\xef\xe2\xf7\xf0\xfb\xf8\x03\xfc\x21\xfe\x08\x7f\x8c\x3f\xc1\x9f\xe2\xcf\xf0\xe7\xf8\x0b\xfc\x25\xfe\x0a\x7f\x8d\xbf\xc1\xdf\xe2\xef\xf0\xf7\xf8\x07\xfc\x23\xfe\x09\xff\x8c\x7f\xc1\xbf\xe2\xdf\xf0\xef\xf8\x0f\xfc\x27\xfe\x0b\xff\x8d\xff\xc1\xff\xe2\xff\xf0\x38\x3c\x1e\x4f\xc0\x13\x89\x24\x44\x52\x22\x19\x91\x9c\x48\x41\xa4\x24\x52\x11\xa9\x89\x34\x44\x5a\x22\x1d\x91\x9e\xc8\x40\x64\x24\x32\x11\x99\x89\x2c\x44\x56\x22\x1b\x91\x9d\xc8\x41\xe4\x24\x72\x11\xb9\x89\x3c\x44\x5e\x22\x1f\x91\x9f\x28\x40\x14\x24\x0a\x11\x85\x89\x22\x44\x51\xa2\x18\x51\x9c\x28\x41\x94\x24\x4a\x11\xa5\x89\x32\x44\x59\xa2\x1c\x51\x9e\xa8\x40\x54\x24\x2a\x11\x95\x89\x2a\x44\x55\xa2\x1a\x51\x9d\xa8\x41\xd4\x24\x6a\x11\xb5\x89\x3a\x44\x5d\xa2\x1e\x51\x9f\x68\x40\x34\x24\x1a\x11\x8d\x89\x26\x44\x53\xa2\x19\xd1\x9c\x68\x41\xb4\x24\x5a\x11\xad\x89\x36\x44\x5b\xa2\x1d\xd1\x9e\xe8\x40\x74\x24\x3a\x11\x9d\x89\x2e\x44\x57\xa2\x1b\xd1\x9d\xe8\x41\xf4\x24\x7a\x11\xbd\x89\x3e\x44\x5f\xa2\x1f\xd1\x9f\x18\x40\x0c\x24\x06\x11\x83\x89\x21\xc4\x50\x62\x18\x31\x9c\x18\x41\x8c\x24\x46\x11\xa3\x89\x31\xc4\x58\x62\x1c\x31\x9e\x98\x40\x4c\x24\x26\x11\x93\x89\x29\xc4\x54\x62\x1a\x31\x9d\x98\x41\xcc\x24\x66\x11\xb3\x89\x39\xc4\x5c\x62\x1e\x31\x9f\x58\x40\x2c\x24\x16\x11\x8b\x89\x25\xc4\x52\x62\x19\xb1\x9c\x58\x41\xac\x24\x56\x11\xab\x89\x35\xc4\x5a\x62\x1d\xb1\x9e\xd8\x40\x6c\x24\x36\x11\x9b\x89\x2d\xc4\x56\x62\x1b\xb1\x9d\xd8\x41\xec\x24\x76\x11\xbb\x89\x3d\xc4\x5e\x62\x1f\x81\x11\x38\x41\x10\x24\x41\x11\x34\xc1\x10\x2c\xc1\x11\x3c\x21\x10\x22\x21\x11\x32\xa1\x10\x2a\xa1\x11\x3a\x61\x10\x26\x61\x11\x36\xe1\x10\x2e\xe1\x11\x3e\x11\x10\x21\x11\x11\x80\x80\x04\x22\x62\xc4\x7e\xe2\x00\x71\x90\x38\x44\x1c\x26\x8e\x10\x47\x89\x63\xc4\x71\xe2\x04\x71\x92\x38\x45\x9c\x26\xce\x10\x67\x89\x73\xc4\x79\xe2\x02\x71\x91\xb8\x44\x5c\x26\xae\x10\x57\x89\x6b\xc4\x75\xe2\x06\x71\x93\xb8\x45\xdc\x26\xee\x10\x77\x89\x7b\xc4\x7d\xe2\x01\xf1\x90\x78\x44\x3c\x26\x9e\x10\x4f\x89\x67\xc4\x73\xe2\x05\xf1\x92\x78\x45\xbc\x26\xde\x10\x6f\x89\x77\xc4\x7b\xe2\x03\xf1\x91\xf8\x44\x7c\x26\xbe\x10\x5f\x89\x6f\xc4\x77\xe2\x07\xf1\x93\xf8\x45\xfc\x26\xfe\x10\x7f\x89\x7f\x44\x1c\x11\x4f\x24\x10\x89\x64\x12\x32\x29\x99\x8c\x4c\x4e\xa6\x20\x53\x92\xa9\xc8\xd4\x64\x1a\x32\x2d\x99\x8e\x4c\x4f\x66\x20\x33\x92\x99\xc8\xcc\x64\x16\x32\x2b\x99\x8d\xcc\x4e\xe6\x20\x73\x92\xb9\xc8\xdc\x64\x1e\x32\x2f\x99\x8f\xcc\x4f\x16\x20\x0b\x92\x85\xc8\xc2\x64\x11\xb2\x28\x59\x8c\x2c\x4e\x96\x20\x4b\x92\xa5\xc8\xd2\x64\x19\xb2\x2c\x59\x8e\x2c\x4f\x56\x20\x2b\x92\x95\xc8\xca\x64\x15\xb2\x2a\x59\x8d\xac\x4e\xd6\x20\x6b\x92\xb5\xc8\xda\x64\x1d\xb2\x2e\x59\x8f\xac\x4f\x36\x20\x1b\x92\x8d\xc8\xc6\x64\x13\xb2\x29\xd9\x8c\x6c\x4e\xb6\x20\x5b\x92\xad\xc8\xd6\x64\x1b\xb2\x2d\xd9\x8e\x6c\x4f\x76\x20\x3b\x92\x9d\xc8\xce\x64\x17\xb2\x2b\xd9\x8d\xec\x4e\xf6\x20\x7b\x92\xbd\xc8\xde\x64\x1f\xb2\x2f\xd9\x8f\xec\x4f\x0e\x20\x07\x92\x83\xc8\xc1\xe4\x10\x72\x28\x39\x8c\x1c\x4e\x8e\x20\x47\x92\xa3\xc8\xd1\xe4\x18\x72\x2c\x39\x8e\x1c\x4f\x4e\x20\x27\x92\x93\xc8\xc9\xe4\x14\x72\x2a\x39\x8d\x9c\x4e\xce\x20\x67\x92\xb3\xc8\xd9\xe4\x1c\x72\x2e\x39\x8f\x9c\x4f\x2e\x20\x17\x92\x8b\xc8\xc5\xe4\x12\x72\x29\xb9\x8c\x5c\x4e\xae\x20\x57\x92\xab\xc8\xd5\xe4\x1a\x72\x2d\xb9\x8e\x5c\x4f\x6e\x20\x37\x92\x9b\xc8\xcd\xe4\x16\x72\x2b\xb9\x8d\xdc\x4e\xee\x20\x77\x92\xbb\xc8\xdd\xe4\x1e\x72\x2f\xb9\x8f\xc4\x48\x9c\x24\x48\x92\xa4\x48\x9a\x64\x48\x96\xe4\x48\x9e\x14\x48\x91\x94\x48\x99\x54\x48\x95\xd4\x48\x9d\x34\x48\x93\xb4\x48\x9b\x74\x48\x97\xf4\x48\x9f\x0c\xc8\x90\x8c\x48\x40\x42\x12\x91\x31\x72\x3f\x79\x80\x3c\x48\x1e\x22\x0f\x93\x47\xc8\xa3\xe4\x31\xf2\x38\x79\x82\x3c\x49\x9e\x22\x4f\x93\x67\xc8\xb3\xe4\x39\xf2\x3c\x79\x81\xbc\x48\x5e\x22\x2f\x93\x57\xc8\xab\xe4\x35\xf2\x3a\x79\x83\xbc\x49\xde\x22\x6f\x93\x77\xc8\xbb\xe4\x3d\xf2\x3e\xf9\x80\x7c\x48\x3e\x22\x1f\x93\x4f\xc8\xa7\xe4\x33\xf2\x39\xf9\x82\x7c\x49\xbe\x22\x5f\x93\x6f\xc8\xb7\xe4\x3b\xf2\x3d\xf9\x81\xfc\x48\x7e\x22\x3f\x93\x5f\xc8\xaf\xe4\x37\xf2\x3b\xf9\x83\xfc\x49\xfe\x22\x7f\x93\x7f\xc8\xbf\xe4\x3f\x32\x8e\x8c\x27\x13\xc8\x44\x2a\x09\x95\x94\x4a\x46\x25\xa7\x52\x50\x29\xa9\x54\x54\x6a\x2a\x0d\x95\x96\x4a\x47\xa5\xa7\x32\x50\x19\xa9\x4c\x54\x66\x2a\x0b\x95\x95\xca\x46\x65\xa7\x72\x50\x39\xa9\x5c\x54\x6e\x2a\x0f\x95\x97\xca\x47\xe5\xa7\x0a\x50\x05\xa9\x42\x54\x61\xaa\x08\x55\x94\x2a\x46\x15\xa7\x4a\x50\x25\xa9\x52\x54\x69\xaa\x0c\x55\x96\x2a\x47\x95\xa7\x2a\x50\x15\xa9\x4a\x54\x65\xaa\x0a\x55\x95\xaa\x46\x55\xa7\x6a\x50\x35\xa9\x5a\x54\x6d\xaa\x0e\x55\x97\xaa\x47\xd5\xa7\x1a\x50\x0d\xa9\x46\x54\x63\xaa\x09\xd5\x94\x6a\x46\x35\xa7\x5a\x50\x2d\xa9\x56\x54\x6b\xaa\x0d\xd5\x96\x6a\x47\xb5\xa7\x3a\x50\x1d\xa9\x4e\x54\x67\xaa\x0b\xd5\x95\xea\x46\x75\xa7\x7a\x50\x3d\xa9\x5e\x54\x6f\xaa\x0f\xd5\x97\xea\x47\xf5\xa7\x06\x50\x03\xa9\x41\xd4\x60\x6a\x08\x35\x94\x1a\x46\x0d\xa7\x46\x50\x23\xa9\x51\xd4\x68\x6a\x0c\x35\x96\x1a\x47\x8d\xa7\x26\x50\x13\xa9\x49\xd4\x64\x6a\x0a\x35\x95\x9a\x46\x4d\xa7\x66\x50\x33\xa9\x59\xd4\x6c\x6a\x0e\x35\x97\x9a\x47\xcd\xa7\x16\x50\x0b\xa9\x45\xd4\x62\x6a\x09\xb5\x94\x5a\x46\x2d\xa7\x56\x50\x2b\xa9\x55\xd4\x6a\x6a\x0d\xb5\x96\x5a\x47\xad\xa7\x36\x50\x1b\xa9\x4d\xd4\x66\x6a\x0b\xb5\x95\xda\x46\x6d\xa7\x76\x50\x3b\xa9\x5d\xd4\x6e\x6a\x0f\xb5\x97\xda\x47\x61\x14\x4e\x11\x14\x49\x51\x14\x4d\x31\x14\x4b\x71\x14\x4f\x09\x94\x48\x49\x94\x4c\x29\x94\x4a\x69\x94\x4e\x19\x94\x49\x59\x94\x4d\x39\x94\x4b\x79\x94\x4f\x05\x54\x48\x45\x14\xa0\x20\x85\xa8\x18\xb5\x9f\x3a\x40\x1d\xa4\x0e\x51\x87\xa9\x23\xd4\x51\xea\x18\x75\x9c\x3a\x41\x9d\xa4\x4e\x51\xa7\xa9\x33\xd4\x59\xea\x1c\x75\x9e\xba\x40\x5d\xa4\x2e\x51\x97\xa9\x2b\xd4\x55\xea\x1a\x75\x9d\xba\x41\xdd\xa4\x6e\x51\xb7\xa9\x3b\xd4\x5d\xea\x1e\x75\x9f\x7a\x40\x3d\xa4\x1e\x51\x8f\xa9\x27\xd4\x53\xea\x19\xf5\x9c\x7a\x41\xbd\xa4\x5e\x51\xaf\xa9\x37\xd4\x5b\xea\x1d\xf5\x9e\xfa\x40\x7d\xa4\x3e\x51\x9f\xa9\x2f\xd4\x57\xea\x1b\xf5\x9d\xfa\x41\xfd\xa4\x7e\x51\xbf\xa9\x3f\xd4\x5f\xea\x1f\x15\x47\xc5\x53\x09\x54\x22\x9d\x84\x4e\x4a\x27\xa3\x93\xd3\x29\xe8\x94\x74\x2a\x3a\x35\x9d\x86\x4e\x4b\xa7\xa3\xd3\xd3\x19\xe8\x8c\x74\x26\x3a\x33\x9d\x85\xce\x4a\x67\xa3\xb3\xd3\x39\xe8\x9c\x74\x2e\x3a\x37\x9d\x87\xce\x4b\xe7\xa3\xf3\xd3\x05\xe8\x82\x74\x21\xba\x30\x5d\x84\x2e\x4a\x17\xa3\x8b\xd3\x25\xe8\x92\x74\x29\xba\x34\x5d\x86\x2e\x4b\x97\xa3\xcb\xd3\x15\xe8\x8a\x74\x25\xba\x32\x5d\x85\xae\x4a\x57\xa3\xab\xd3\x35\xe8\x9a\x74\x2d\xba\x36\x5d\x87\xae\x4b\xd7\xa3\xeb\xd3\x0d\xe8\x86\x74\x23\xba\x31\xdd\x84\x6e\x4a\x37\xa3\x9b\xd3\x2d\xe8\x96\x74\x2b\xba\x35\xdd\x86\x6e\x4b\xb7\xa3\xdb\xd3\x1d\xe8\x8e\x74\x27\xba\x33\xdd\x85\xee\x4a\x77\xa3\xbb\xd3\x3d\xe8\x9e\x74\x2f\xba\x37\xdd\x87\xee\x4b\xf7\xa3\xfb\xd3\x03\xe8\x81\xf4\x20\x7a\x30\x3d\x84\x1e\x4a\x0f\xa3\x87\xd3\x23\xe8\x91\xf4\x28\x7a\x34\x3d\x86\x1e\x4b\x8f\xa3\xc7\xd3\x13\xe8\x89\xf4\x24\x7a\x32\x3d\x85\x9e\x4a\x4f\xa3\xa7\xd3\x33\xe8\x99\xf4\x2c\x7a\x36\x3d\x87\x9e\x4b\xcf\xa3\xe7\xd3\x0b\xe8\x85\xf4\x22\x7a\x31\xbd\x84\x5e\x4a\x2f\xa3\x97\xd3\x2b\xe8\x95\xf4\x2a\x7a\x35\xbd\x86\x5e\x4b\xaf\xa3\xd7\xd3\x1b\xe8\x8d\xf4\x26\x7a\x33\xbd\x85\xde\x4a\x6f\xa3\xb7\xd3\x3b\xe8\x9d\xf4\x2e\x7a\x37\xbd\x87\xde\x4b\xef\xa3\x31\x1a\xa7\x09\x9a\xa4\x29\x9a\xa6\x19\x9a\xa5\x39\x9a\xa7\x05\x5a\xa4\x25\x5a\xa6\x15\x5a\xa5\x35\x5a\xa7\x0d\xda\xa4\x2d\xda\xa6\x1d\xda\xa5\x3d\xda\xa7\x03\x3a\xa4\x23\x1a\xd0\x90\x46\x74\x8c\xde\x4f\x1f\xa0\x0f\xd2\x87\xe8\xc3\xf4\x11\xfa\x28\x7d\x8c\x3e\x4e\x9f\xa0\x4f\xd2\xa7\xe8\xd3\xf4\x19\xfa\x2c\x7d\x8e\x3e\x4f\x5f\xa0\x2f\xd2\x97\xe8\xcb\xf4\x15\xfa\x2a\x7d\x8d\xbe\x4e\xdf\xa0\x6f\xd2\xb7\xe8\xdb\xf4\x1d\xfa\x2e\x7d\x8f\xbe\x4f\x3f\xa0\x1f\xd2\x8f\xe8\xc7\xf4\x13\xfa\x29\xfd\x8c\x7e\x4e\xbf\xa0\x5f\xd2\xaf\xe8\xd7\xf4\x1b\xfa\x2d\xfd\x8e\x7e\x4f\x7f\xa0\x3f\xd2\x9f\xe8\xcf\xf4\x17\xfa\x2b\xfd\x8d\xfe\x4e\xff\xa0\x7f\xd2\xbf\xe8\xdf\xf4\x1f\xfa\x2f\xfd\x8f\x8e\xa3\xe3\xe9\x04\x3a\x91\x49\xc2\x24\x65\x92\x31\xc9\x99\x14\x4c\x4a\x26\x15\x93\x9a\x49\xc3\xa4\x65\xd2\x31\xe9\x99\x0c\x4c\x46\x26\x13\x93\x99\xc9\xc2\x64\x65\xb2\x31\xd9\x99\x1c\x4c\x4e\x26\x17\x93\x9b\xc9\xc3\xe4\x65\xf2\x31\xf9\x99\x02\x4c\x41\xa6\x10\x53\x98\x29\xc2\x14\x65\x8a\x31\xc5\x99\x12\x4c\x49\xa6\x14\x53\x9a\x29\xc3\x94\x65\xca\x31\xe5\x99\x0a\x4c\x45\xa6\x12\x53\x99\xa9\xc2\x54\x65\xaa\x31\xd5\x99\x1a\x4c\x4d\xa6\x16\x53\x9b\xa9\xc3\xd4\x65\xea\x31\xf5\x99\x06\x4c\x43\xa6\x11\xd3\x98\x69\xc2\x34\x65\x9a\x31\xcd\x99\x16\x4c\x4b\xa6\x15\xd3\x9a\x69\xc3\xb4\x65\xda\x31\xed\x99\x0e\x4c\x47\xa6\x13\xd3\x99\xe9\xc2\x74\x65\xba\x31\xdd\x99\x1e\x4c\x4f\xa6\x17\xd3\x9b\xe9\xc3\xf4\x65\xfa\x31\xfd\x99\x01\xcc\x40\x66\x10\x33\x98\x19\xc2\x0c\x65\x86\x31\xc3\x99\x11\xcc\x48\x66\x14\x33\x9a\x19\xc3\x8c\x65\xc6\x31\xe3\x99\x09\xcc\x44\x66\x12\x33\x99\x99\xc2\x4c\x65\xa6\x31\xd3\x99\x19\xcc\x4c\x66\x16\x33\x9b\x99\xc3\xcc\x65\xe6\x31\xf3\x99\x05\xcc\x42\x66\x11\xb3\x98\x59\xc2\x2c\x65\x96\x31\xcb\x99\x15\xcc\x4a\x66\x15\xb3\x9a\x59\xc3\xac\x65\xd6\x31\xeb\x99\x0d\xcc\x46\x66\x13\xb3\x99\xd9\xc2\x6c\x65\xb6\x31\xdb\x99\x1d\xcc\x4e\x66\x17\xb3\x9b\xd9\xc3\xec\x65\xf6\x31\x18\x83\x33\x04\x43\x32\x14\x43\x33\x0c\xc3\x32\x1c\xc3\x33\x02\x23\x32\x12\x23\x33\x0a\xa3\x32\x1a\xa3\x33\x06\x63\x32\x16\x63\x33\x0e\xe3\x32\x1e\xe3\x33\x01\x13\x32\x11\x03\x18\xc8\x20\x26\xc6\xec\x67\x0e\x30\x07\x99\x43\xcc\x61\xe6\x08\x73\x94\x39\xc6\x1c\x67\x4e\x30\x27\x99\x53\xcc\x69\xe6\x0c\x73\x96\x39\xc7\x9c\x67\x2e\x30\x17\x99\x4b\xcc\x65\xe6\x0a\x73\x95\xb9\xc6\x5c\x67\x6e\x30\x37\x99\x5b\xcc\x6d\xe6\x0e\x73\x97\xb9\xc7\xdc\x67\x1e\x30\x0f\x99\x47\xcc\x63\xe6\x09\xf3\x94\x79\xc6\x3c\x67\x5e\x30\x2f\x99\x57\xcc\x6b\xe6\x0d\xf3\x96\x79\xc7\xbc\x67\x3e\x30\x1f\x99\x4f\xcc\x67\xe6\x0b\xf3\x95\xf9\xc6\x7c\x67\x7e\x30\x3f\x99\x5f\xcc\x6f\xe6\x0f\xf3\x97\xf9\xc7\xc4\x31\xf1\x4c\x02\x93\xc8\x26\x61\x93\xb2\xc9\xd8\xe4\x6c\x0a\x36\x25\x9b\x8a\x4d\xcd\xa6\x61\xd3\xb2\xe9\xd8\xf4\x6c\x06\x36\x23\x9b\x89\xcd\xcc\x66\x61\xb3\xb2\xd9\xd8\xec\x6c\x0e\x36\x27\x9b\x8b\xcd\xcd\xe6\x61\xf3\xb2\xf9\xd8\xfc\x6c\x01\xb6\x20\x5b\x88\x2d\xcc\x16\x61\x8b\xb2\xc5\xd8\xe2\x6c\x09\xb6\x24\x5b\x8a\x2d\xcd\x96\x61\xcb\xb2\xe5\xd8\xf2\x6c\x05\xb6\x22\x5b\x89\xad\xcc\x56\x61\xab\xb2\xd5\xd8\xea\x6c\x0d\xb6\x26\x5b\x8b\xad\xcd\xd6\x61\xeb\xb2\xf5\xd8\xfa\x6c\x03\xb6\x21\xdb\x88\x6d\xcc\x36\x61\x9b\xb2\xcd\xd8\xe6\x6c\x0b\xb6\x25\xdb\x8a\x6d\xcd\xb6\x61\xdb\xb2\xed\xd8\xf6\x6c\x07\xb6\x23\xdb\x89\xed\xcc\x76\x61\xbb\xb2\xdd\xd8\xee\x6c\x0f\xb6\x27\xdb\x8b\xed\xcd\xf6\x61\xfb\xb2\xfd\xd8\xfe\xec\x00\x76\x20\x3b\x88\x1d\xcc\x0e\x61\x87\xb2\xc3\xd8\xe1\xec\x08\x76\x24\x3b\x8a\x1d\xcd\x8e\x61\xc7\xb2\xe3\xd8\xf1\xec\x04\x76\x22\x3b\x89\x9d\xcc\x4e\x61\xa7\xb2\xd3\xd8\xe9\xec\x0c\x76\x26\x3b\x8b\x9d\xcd\xce\x61\xe7\xb2\xf3\xd8\xf9\xec\x02\x76\x21\xbb\x88\x5d\xcc\x2e\x61\x97\xb2\xcb\xd8\xe5\xec\x0a\x76\x25\xbb\x8a\x5d\xcd\xae\x61\xd7\xb2\xeb\xd8\xf5\xec\x06\x76\x23\xbb\x89\xdd\xcc\x6e\x61\xb7\xb2\xdb\xd8\xed\xec\x0e\x76\x27\xbb\x8b\xdd\xcd\xee\x61\xf7\xb2\xfb\x58\x8c\xc5\x59\x82\x25\x59\x8a\xa5\x59\x86\x65\x59\x8e\xe5\x59\x81\x15\x59\x89\x95\x59\x85\x55\x59\x8d\xd5\x59\x83\x35\x59\x8b\xb5\x59\x87\x75\x59\x8f\xf5\xd9\x80\x0d\xd9\x88\x05\x2c\x64\x11\x1b\x63\xf7\xb3\x07\xd8\x83\xec\x21\xf6\x30\x7b\x84\x3d\xca\x1e\x63\x8f\xb3\x27\xd8\x93\xec\x29\xf6\x34\x7b\x86\x3d\xcb\x9e\x63\xcf\xb3\x17\xd8\x8b\xec\x25\xf6\x32\x7b\x85\xbd\xca\x5e\x63\xaf\xb3\x37\xd8\x9b\xec\x2d\xf6\x36\x7b\x87\xbd\xcb\xde\x63\xef\xb3\x0f\xd8\x87\xec\x23\xf6\x31\xfb\x84\x7d\xca\x3e\x63\x9f\xb3\x2f\xd8\x97\xec\x2b\xf6\x35\xfb\x86\x7d\xcb\xbe\x63\xdf\xb3\x1f\xd8\x8f\xec\x27\xf6\x33\xfb\x85\xfd\xca\x7e\x63\xbf\xb3\x3f\xd8\x9f\xec\x2f\xf6\x37\xfb\x87\xfd\xcb\xfe\x63\xe3\xd8\x78\x36\x81\x4d\xe4\x92\x70\x49\xb9\x64\x5c\x72\x2e\x05\x97\x92\x4b\xc5\xa5\xe6\xd2\x70\x69\xb9\x74\x5c\x7a\x2e\x03\x97\x91\xcb\xc4\x65\xe6\xb2\x70\x59\xb9\x6c\x5c\x76\x2e\x07\x97\x93\xcb\xc5\xe5\xe6\xf2\x70\x79\xb9\x7c\x5c\x7e\xae\x00\x57\x90\x2b\xc4\x15\xe6\x8a\x70\x45\xb9\x62\x5c\x71\xae\x04\x57\x92\x2b\xc5\x95\xe6\xca\x70\x65\xb9\x72\x5c\x79\xae\x02\x57\x91\xab\xc4\x55\xe6\xaa\x70\x55\xb9\x6a\x5c\x75\xae\x06\x57\x93\xab\xc5\xd5\xe6\xea\x70\x75\xb9\x7a\x5c\x7d\xae\x01\xd7\x90\x6b\xc4\x35\xe6\x9a\x70\x4d\xb9\x66\x5c\x73\xae\x05\xd7\x92\x6b\xc5\xb5\xe6\xda\x70\x6d\xb9\x76\x5c\x7b\xae\x03\xd7\x91\xeb\xc4\x75\xe6\xba\x70\x5d\xb9\x6e\x5c\x77\xae\x07\xd7\x93\xeb\xc5\xf5\xe6\xfa\x70\x7d\xb9\x7e\x5c\x7f\x6e\x00\x37\x90\x1b\xc4\x0d\xe6\x86\x70\x43\xb9\x61\xdc\x70\x6e\x04\x37\x92\x1b\xc5\x8d\xe6\xc6\x70\x63\xb9\x71\xdc\x78\x6e\x02\x37\x91\x9b\xc4\x4d\xe6\xa6\x70\x53\xb9\x69\xdc\x74\x6e\x06\x37\x93\x9b\xc5\xcd\xe6\xe6\x70\x73\xb9\x79\xdc\x7c\x6e\x01\xb7\x90\x5b\xc4\x2d\xe6\x96\x70\x4b\xb9\x65\xdc\x72\x6e\x05\xb7\x92\x5b\xc5\xad\xe6\xd6\x70\x6b\xb9\x75\xdc\x7a\x6e\x03\xb7\x91\xdb\xc4\x6d\xe6\xb6\x70\x5b\xb9\x6d\xdc\x76\x6e\x07\xb7\x93\xdb\xc5\xed\xe6\xf6\x70\x7b\xb9\x7d\x1c\xc6\xe1\x1c\xc1\x91\x1c\xc5\xd1\x1c\xc3\xb1\x1c\xc7\xf1\x9c\xc0\x89\x9c\xc4\xc9\x9c\xc2\xa9\x9c\xc6\xe9\x9c\xc1\x99\x9c\xc5\xd9\x9c\xc3\xb9\x9c\xc7\xf9\x5c\xc0\x85\x5c\xc4\x01\x0e\x72\x88\x8b\x71\xfb\xb9\x03\xdc\x41\xee\x10\x77\x98\x3b\xc2\x1d\xe5\x8e\x71\xc7\xb9\x13\xdc\x49\xee\x14\x77\x9a\x3b\xc3\x9d\xe5\xce\x71\xe7\xb9\x0b\xdc\x45\xee\x12\x77\x99\xbb\xc2\x5d\xe5\xae\x71\xd7\xb9\x1b\xdc\x4d\xee\x16\x77\x9b\xbb\xc3\xdd\xe5\xee\x71\xf7\xb9\x07\xdc\x43\xee\x11\xf7\x98\x7b\xc2\x3d\xe5\x9e\x71\xcf\xb9\x17\xdc\x4b\xee\x15\xf7\x9a\x7b\xc3\xbd\xe5\xde\x71\xef\xb9\x0f\xdc\x47\xee\x13\xf7\x99\xfb\xc2\x7d\xe5\xbe\x71\xdf\xb9\x1f\xdc\x4f\xee\x17\xf7\x9b\xfb\xc3\xfd\xe5\xfe\x71\x71\x5c\x3c\x97\xc0\x25\xf2\x49\xf8\xa4\x7c\x32\x3e\x39\x9f\x82\x4f\xc9\xa7\xe2\x53\xf3\x69\xf8\xb4\x7c\x3a\x3e\x3d\x9f\x81\xcf\xc8\x67\xe2\x33\xf3\x59\xf8\xac\x7c\x36\x3e\x3b\x9f\x83\xcf\xc9\xe7\xe2\x73\xf3\x79\xf8\xbc\x7c\x3e\x3e\x3f\x5f\x80\x2f\xc8\x17\xe2\x0b\xf3\x45\xf8\xa2\x7c\x31\xbe\x38\x5f\x82\x2f\xc9\x97\xe2\x4b\xf3\x65\xf8\xb2\x7c\x39\xbe\x3c\x5f\x81\xaf\xc8\x57\xe2\x2b\xf3\x55\xf8\xaa\x7c\x35\xbe\x3a\x5f\x83\xaf\xc9\xd7\xe2\x6b\xf3\x75\xf8\xba\x7c\x3d\xbe\x3e\xdf\x80\x6f\xc8\x37\xe2\x1b\xf3\x4d\xf8\xa6\x7c\x33\xbe\x39\xdf\x82\x6f\xc9\xb7\xe2\x5b\xf3\x6d\xf8\xb6\x7c\x3b\xbe\x3d\xdf\x81\xef\xc8\x77\xe2\x3b\xf3\x5d\xf8\xae\x7c\x37\xbe\x3b\xdf\x83\xef\xc9\xf7\xe2\x7b\xf3\x7d\xf8\xbe\x7c\x3f\xbe\x3f\x3f\x80\x1f\xc8\x0f\xe2\x07\xf3\x43\xf8\xa1\xfc\x30\x7e\x38\x3f\x82\x1f\xc9\x8f\xe2\x47\xf3\x63\xf8\xb1\xfc\x38\x7e\x3c\x3f\x81\x9f\xc8\x4f\xe2\x27\xf3\x53\xf8\xa9\xfc\x34\x7e\x3a\x3f\x83\x9f\xc9\xcf\xe2\x67\xf3\x73\xf8\xb9\xfc\x3c\x7e\x3e\xbf\x80\x5f\xc8\x2f\xe2\x17\xf3\x4b\xf8\xa5\xfc\x32\x7e\x39\xbf\x82\x5f\xc9\xaf\xe2\x57\xf3\x6b\xf8\xb5\xfc\x3a\x7e\x3d\xbf\x81\xdf\xc8\x6f\xe2\x37\xf3\x5b\xf8\xad\xfc\x36\x7e\x3b\xbf\x83\xdf\xc9\xef\xe2\x77\xf3\x7b\xf8\xbd\xfc\x3e\x1e\xe3\x71\x9e\xe0\x49\x9e\xe2\x69\x9e\xe1\x59\x9e\xe3\x79\x5e\xe0\x45\x5e\xe2\x65\x5e\xe1\x55\x5e\xe3\x75\xde\xe0\x4d\xde\xe2\x6d\xde\xe1\x5d\xde\xe3\x7d\x3e\xe0\x43\x3e\xe2\x01\x0f\x79\xc4\xc7\xf8\xfd\xfc\x01\xfe\x20\x7f\x88\x3f\xcc\x1f\xe1\x8f\xf2\xc7\xf8\xe3\xfc\x09\xfe\x24\x7f\x8a\x3f\xcd\x9f\xe1\xcf\xf2\xe7\xf8\xf3\xfc\x05\xfe\x22\x7f\x89\xbf\xcc\x5f\xe1\xaf\xf2\xd7\xf8\xeb\xfc\x0d\xfe\x26\x7f\x8b\xbf\xcd\xdf\xe1\xef\xf2\xf7\xf8\xfb\xfc\x03\xfe\x21\xff\x88\x7f\xcc\x3f\xe1\x9f\xf2\xcf\xf8\xe7\xfc\x0b\xfe\x25\xff\x8a\x7f\xcd\xbf\xe1\xdf\xf2\xef\xf8\xf7\xfc\x07\xfe\x23\xff\x89\xff\xcc\x7f\xe1\xbf\xf2\xdf\xf8\xef\xfc\x0f\xfe\x27\xff\x8b\xff\xcd\xff\xe1\xff\xf2\xff\xf8\x38\x3e\x9e\x4f\xe0\x13\x85\x24\x42\x52\x21\x99\x90\x5c\x48\x21\xa4\x14\x52\x09\xa9\x85\x34\x42\x5a\x21\x9d\x90\x5e\xc8\x20\x64\x14\x32\x09\x99\x85\x2c\x42\x56\x21\x9b\x90\x5d\xc8\x21\xe4\x14\x72\x09\xb9\x85\x3c\x42\x5e\x21\x9f\x90\x5f\x28\x20\x14\x14\x0a\x09\x85\x85\x22\x42\x51\xa1\x98\x50\x5c\x28\x21\x94\x14\x4a\x09\xa5\x85\x32\x42\x59\xa1\x9c\x50\x5e\xa8\x20\x54\x14\x2a\x09\x95\x85\x2a\x42\x55\xa1\x9a\x50\x5d\xa8\x21\xd4\x14\x6a\x09\xb5\x85\x3a\x42\x5d\xa1\x9e\x50\x5f\x68\x20\x34\x14\x1a\x09\x8d\x85\x26\x42\x53\xa1\x99\xd0\x5c\x68\x21\xb4\x14\x5a\x09\xad\x85\x36\x42\x5b\xa1\x9d\xd0\x5e\xe8\x20\x74\x14\x3a\x09\x9d\x85\x2e\x42\x57\xa1\x9b\xd0\x5d\xe8\x21\xf4\x14\x7a\x09\xbd\x85\x3e\x42\x5f\xa1\x9f\xd0\x5f\x18\x20\x0c\x14\x06\x09\x83\x85\x21\xc2\x50\x61\x98\x30\x5c\x18\x21\x8c\x14\x46\x09\xa3\x85\x31\xc2\x58\x61\x9c\x30\x5e\x98\x20\x4c\x14\x26\x09\x93\x85\x29\xc2\x54\x61\x9a\x30\x5d\x98\x21\xcc\x14\x66\x09\xb3\x85\x39\xc2\x5c\x61\x9e\x30\x5f\x58\x20\x2c\x14\x16\x09\x8b\x85\x25\xc2\x52\x61\x99\xb0\x5c\x58\x21\xac\x14\x56\x09\xab\x85\x35\xc2\x5a\x61\x9d\xb0\x5e\xd8\x20\x6c\x14\x36\x09\x9b\x85\x2d\xc2\x56\x61\x9b\xb0\x5d\xd8\x21\xec\x14\x76\x09\xbb\x85\x3d\xc2\x5e\x61\x9f\x80\x09\xb8\x40\x08\xa4\x40\x09\xb4\xc0\x08\xac\xc0\x09\xbc\x20\x08\xa2\x20\x09\xb2\xa0\x08\xaa\xa0\x09\xba\x60\x08\xa6\x60\x09\xb6\xe0\x08\xae\xe0\x09\xbe\x10\x08\xa1\x10\x09\x40\x80\x02\x12\x62\xc2\x7e\xe1\x80\x70\x50\x38\x24\x1c\x16\x8e\x08\x47\x85\x63\xc2\x71\xe1\x84\x70\x52\x38\x25\x9c\x16\xce\x08\x67\x85\x73\xc2\x79\xe1\x82\x70\x51\xb8\x24\x5c\x16\xae\x08\x57\x85\x6b\xc2\x75\xe1\x86\x70\x53\xb8\x25\xdc\x16\xee\x08\x77\x85\x7b\xc2\x7d\xe1\x81\xf0\x50\x78\x24\x3c\x16\x9e\x08\x4f\x85\x67\xc2\x73\xe1\x85\xf0\x52\x78\x25\xbc\x16\xde\x08\x6f\x85\x77\xc2\x7b\xe1\x83\xf0\x51\xf8\x24\x7c\x16\xbe\x08\x5f\x85\x6f\xc2\x77\xe1\x87\xf0\x53\xf8\x25\xfc\x16\xfe\x08\x7f\x85\x7f\x42\x9c\x10\x2f\x24\x08\x89\x62\x12\x31\xa9\x98\x4c\x4c\x2e\xa6\x10\x53\x8a\xa9\xc4\xd4\x62\x1a\x31\xad\x98\x4e\x4c\x2f\x66\x10\x33\x8a\x99\xc4\xcc\x62\x16\x31\xab\x98\x4d\xcc\x2e\xe6\x10\x73\x8a\xb9\xc4\xdc\x62\x1e\x31\xaf\x98\x4f\xcc\x2f\x16\x10\x0b\x8a\x85\xc4\xc2\x62\x11\xb1\xa8\x58\x4c\x2c\x2e\x96\x10\x4b\x8a\xa5\xc4\xd2\x62\x19\xb1\xac\x58\x4e\x2c\x2f\x56\x10\x2b\x8a\x95\xc4\xca\x62\x15\xb1\xaa\x58\x4d\xac\x2e\xd6\x10\x6b\x8a\xb5\xc4\xda\x62\x1d\xb1\xae\x58\x4f\xac\x2f\x36\x10\x1b\x8a\x8d\xc4\xc6\x62\x13\xb1\xa9\xd8\x4c\x6c\x2e\xb6\x10\x5b\x8a\xad\xc4\xd6\x62\x1b\xb1\xad\xd8\x4e\x6c\x2f\x76\x10\x3b\x8a\x9d\xc4\xce\x62\x17\xb1\xab\xd8\x4d\xec\x2e\xf6\x10\x7b\x8a\xbd\xc4\xde\x62\x1f\xb1\xaf\xd8\x4f\xec\x2f\x0e\x10\x07\x8a\x83\xc4\xc1\xe2\x10\x71\xa8\x38\x4c\x1c\x2e\x8e\x10\x47\x8a\xa3\xc4\xd1\xe2\x18\x71\xac\x38\x4e\x1c\x2f\x4e\x10\x27\x8a\x93\xc4\xc9\xe2\x14\x71\xaa\x38\x4d\x9c\x2e\xce\x10\x67\x8a\xb3\xc4\xd9\xe2\x1c\x71\xae\x38\x4f\x9c\x2f\x2e\x10\x17\x8a\x8b\xc4\xc5\xe2\x12\x71\xa9\xb8\x4c\x5c\x2e\xae\x10\x57\x8a\xab\xc4\xd5\xe2\x1a\x71\xad\xb8\x4e\x5c\x2f\x6e\x10\x37\x8a\x9b\xc4\xcd\xe2\x16\x71\xab\xb8\x4d\xdc\x2e\xee\x10\x77\x8a\xbb\xc4\xdd\xe2\x1e\x71\xaf\xb8\x4f\xc4\x44\x5c\x24\x44\x52\xa4\x44\x5a\x64\x44\x56\xe4\x44\x5e\x14\x44\x51\x94\x44\x59\x54\x44\x55\xd4\x44\x5d\x34\x44\x53\xb4\x44\x5b\x74\x44\x57\xf4\x44\x5f\x0c\xc4\x50\x8c\x44\x20\x42\x11\x89\x31\x71\xbf\x78\x40\x3c\x28\x1e\x12\x0f\x8b\x47\xc4\xa3\xe2\x31\xf1\xb8\x78\x42\x3c\x29\x9e\x12\x4f\x8b\x67\xc4\xb3\xe2\x39\xf1\xbc\x78\x41\xbc\x28\x5e\x12\x2f\x8b\x57\xc4\xab\xe2\x35\xf1\xba\x78\x43\xbc\x29\xde\x12\x6f\x8b\x77\xc4\xbb\xe2\x3d\xf1\xbe\xf8\x40\x7c\x28\x3e\x12\x1f\x8b\x4f\xc4\xa7\xe2\x33\xf1\xb9\xf8\x42\x7c\x29\xbe\x12\x5f\x8b\x6f\xc4\xb7\xe2\x3b\xf1\xbd\xf8\x41\xfc\x28\x7e\x12\x3f\x8b\x5f\xc4\xaf\xe2\x37\xf1\xbb\xf8\x43\xfc\x29\xfe\x12\x7f\x8b\x7f\xc4\xbf\xe2\x3f\x31\x4e\x8c\x17\x13\xc4\x44\x29\x89\x94\x54\x4a\x26\x25\x97\x52\x48\x29\xa5\x54\x52\x6a\x29\x8d\x94\x56\x4a\x27\xa5\x97\x32\x48\x19\xa5\x4c\x52\x66\x29\x8b\x94\x55\xca\x26\x65\x97\x72\x48\x39\xa5\x5c\x52\x6e\x29\x8f\x94\x57\xca\x27\xe5\x97\x0a\x48\x05\xa5\x42\x52\x61\xa9\x88\x54\x54\x2a\x26\x15\x97\x4a\x48\x25\xa5\x52\x52\x69\xa9\x8c\x54\x56\x2a\x27\x95\x97\x2a\x48\x15\xa5\x4a\x52\x65\xa9\x8a\x54\x55\xaa\x26\x55\x97\x6a\x48\x35\xa5\x5a\x52\x6d\xa9\x8e\x54\x57\xaa\x27\xd5\x97\x1a\x48\x0d\xa5\x46\x52\x63\xa9\x89\xd4\x54\x6a\x26\x35\x97\x5a\x48\x2d\xa5\x56\x52\x6b\xa9\x8d\xd4\x56\x6a\x27\xb5\x97\x3a\x48\x1d\xa5\x4e\x52\x67\xa9\x8b\xd4\x55\xea\x26\x75\x97\x7a\x48\x3d\xa5\x5e\x52\x6f\xa9\x8f\xd4\x57\xea\x27\xf5\x97\x06\x48\x03\xa5\x41\xd2\x60\x69\x88\x34\x54\x1a\x26\x0d\x97\x46\x48\x23\xa5\x51\xd2\x68\x69\x8c\x34\x56\x1a\x27\x8d\x97\x26\x48\x13\xa5\x49\xd2\x64\x69\x8a\x34\x55\x9a\x26\x4d\x97\x66\x48\x33\xa5\x59\xd2\x6c\x69\x8e\x34\x57\x9a\x27\xcd\x97\x16\x48\x0b\xa5\x45\xd2\x62\x69\x89\xb4\x54\x5a\x26\x2d\x97\x56\x48\x2b\xa5\x55\xd2\x6a\x69\x8d\xb4\x56\x5a\x27\xad\x97\x36\x48\x1b\xa5\x4d\xd2\x66\x69\x8b\xb4\x55\xda\x26\x6d\x97\x76\x48\x3b\xa5\x5d\xd2\x6e\x69\x8f\xb4\x57\xda\x27\x61\x12\x2e\x11\x12\x29\x51\x12\x2d\x31\x12\x2b\x71\x12\x2f\x09\x92\x28\x49\x92\x2c\x29\x92\x2a\x69\x92\x2e\x19\x92\x29\x59\x92\x2d\x39\x92\x2b\x79\x92\x2f\x05\x52\x28\x45\x12\x90\xa0\x84\xa4\x98\xb4\x5f\x3a\x20\x1d\x94\x0e\x49\x87\xa5\x23\xd2\x51\xe9\x98\x74\x5c\x3a\x21\x9d\x94\x4e\x49\xa7\xa5\x33\xd2\x59\xe9\x9c\x74\x5e\xba\x20\x5d\x94\x2e\x49\x97\xa5\x2b\xd2\x55\xe9\x9a\x74\x5d\xba\x21\xdd\x94\x6e\x49\xb7\xa5\x3b\xd2\x5d\xe9\x9e\x74\x5f\x7a\x20\x3d\x94\x1e\x49\x8f\xa5\x27\xd2\x53\xe9\x99\xf4\x5c\x7a\x21\xbd\x94\x5e\x49\xaf\xa5\x37\xd2\x5b\xe9\x9d\xf4\x5e\xfa\x20\x7d\x94\x3e\x49\x9f\xa5\x2f\xd2\x57\xe9\x9b\xf4\x5d\xfa\x21\xfd\x94\x7e\x49\xbf\xa5\x3f\xd2\x5f\xe9\x9f\x14\x27\xc5\x4b\x09\x52\xa2\x9c\x44\x4e\x2a\x27\x93\x93\xcb\x29\xe4\x94\x72\x2a\x39\xb5\x9c\x46\x4e\x2b\xa7\x93\xd3\xcb\x19\xe4\x8c\x72\x26\x39\xb3\x9c\x45\xce\x2a\x67\x93\xb3\xcb\x39\xe4\x9c\x72\x2e\x39\xb7\x9c\x47\xce\x2b\xe7\x93\xf3\xcb\x05\xe4\x82\x72\x21\xb9\xb0\x5c\x44\x2e\x2a\x17\x93\x8b\xcb\x25\xe4\x92\x72\x29\xb9\xb4\x5c\x46\x2e\x2b\x97\x93\xcb\xcb\x15\xe4\x8a\x72\x25\xb9\xb2\x5c\x45\xae\x2a\x57\x93\xab\xcb\x35\xe4\x9a\x72\x2d\xb9\xb6\x5c\x47\xae\x2b\xd7\x93\xeb\xcb\x0d\xe4\x86\x72\x23\xb9\xb1\xdc\x44\x6e\x2a\x37\x93\x9b\xcb\x2d\xe4\x96\x72\x2b\xb9\xb5\xdc\x46\x6e\x2b\xb7\x93\xdb\xcb\x1d\xe4\x8e\x72\x27\xb9\xb3\xdc\x45\xee\x2a\x77\x93\xbb\xcb\x3d\xe4\x9e\x72\x2f\xb9\xb7\xdc\x47\xee\x2b\xf7\x93\xfb\xcb\x03\xe4\x81\xf2\x20\x79\xb0\x3c\x44\x1e\x2a\x0f\x93\x87\xcb\x23\xe4\x91\xf2\x28\x79\xb4\x3c\x46\x1e\x2b\x8f\x93\xc7\xcb\x13\xe4\x89\xf2\x24\x79\xb2\x3c\x45\x9e\x2a\x4f\x93\xa7\xcb\x33\xe4\x99\xf2\x2c\x79\xb6\x3c\x47\x9e\x2b\xcf\x93\xe7\xcb\x0b\xe4\x85\xf2\x22\x79\xb1\xbc\x44\x5e\x2a\x2f\x93\x97\xcb\x2b\xe4\x95\xf2\x2a\x79\xb5\xbc\x46\x5e\x2b\xaf\x93\xd7\xcb\x1b\xe4\x8d\xf2\x26\x79\xb3\xbc\x45\xde\x2a\x6f\x93\xb7\xcb\x3b\xe4\x9d\xf2\x2e\x79\xb7\xbc\x47\xde\x2b\xef\x93\x31\x19\x97\x09\x99\x94\x29\x99\x96\x19\x99\x95\x39\x99\x97\x05\x59\x94\x25\x59\x96\x15\x59\x95\x35\x59\x97\x0d\xd9\x94\x2d\xd9\x96\x1d\xd9\x95\x3d\xd9\x97\x03\x39\x94\x23\x19\xc8\x50\x46\x72\x4c\xde\x2f\x1f\x90\x0f\xca\x87\xe4\xc3\xf2\x11\xf9\xa8\x7c\x4c\x3e\x2e\x9f\x90\x4f\xca\xa7\xe4\xd3\xf2\x19\xf9\xac\x7c\x4e\x3e\x2f\x5f\x90\x2f\xca\x97\xe4\xcb\xf2\x15\xf9\xaa\x7c\x4d\xbe\x2e\xdf\x90\x6f\xca\xb7\xe4\xdb\xf2\x1d\xf9\xae\x7c\x4f\xbe\x2f\x3f\x90\x1f\xca\x8f\xe4\xc7\xf2\x13\xf9\xa9\xfc\x4c\x7e\x2e\xbf\x90\x5f\xca\xaf\xe4\xd7\xf2\x1b\xf9\xad\xfc\x4e\x7e\x2f\x7f\x90\x3f\xca\x9f\xe4\xcf\xf2\x17\xf9\xab\xfc\x4d\xfe\x2e\xff\x90\x7f\xca\xbf\xe4\xdf\xf2\x1f\xf9\xaf\xfc\x4f\x8e\x93\xe3\xe5\x04\x39\x51\x49\xa2\x24\x55\x92\x29\xc9\x95\x14\x4a\x4a\x25\x95\x92\x5a\x49\xa3\xa4\x55\xd2\x29\xe9\x95\x0c\x4a\x46\x25\x93\x92\x59\xc9\xa2\x64\x55\xb2\x29\xd9\x95\x1c\x4a\x4e\x25\x97\x92\x5b\xc9\xa3\xe4\x55\xf2\x29\xf9\x95\x02\x4a\x41\xa5\x90\x52\x58\x29\xa2\x14\x55\x8a\x29\xc5\x95\x12\x4a\x49\xa5\x94\x52\x5a\x29\xa3\x94\x55\xca\x29\xe5\x95\x0a\x4a\x45\xa5\x92\x52\x59\xa9\xa2\x54\x55\xaa\x29\xd5\x95\x1a\x4a\x4d\xa5\x96\x52\x5b\xa9\xa3\xd4\x55\xea\x29\xf5\x95\x06\x4a\x43\xa5\x91\xd2\x58\x69\xa2\x34\x55\x9a\x29\xcd\x95\x16\x4a\x4b\xa5\x95\xd2\x5a\x69\xa3\xb4\x55\xda\x29\xed\x95\x0e\x4a\x47\xa5\x93\xd2\x59\xe9\xa2\x74\x55\xba\x29\xdd\x95\x1e\x4a\x4f\xa5\x97\xd2\x5b\xe9\xa3\xf4\x55\xfa\x29\xfd\x95\x01\xca\x40\x65\x90\x32\x58\x19\xa2\x0c\x55\x86\x29\xc3\x95\x11\xca\x48\x65\x94\x32\x5a\x19\xa3\x8c\x55\xc6\x29\xe3\x95\x09\xca\x44\x65\x92\x32\x59\x99\xa2\x4c\x55\xa6\x29\xd3\x95\x19\xca\x4c\x65\x96\x32\x5b\x99\xa3\xcc\x55\xe6\x29\xf3\x95\x05\xca\x42\x65\x91\xb2\x58\x59\xa2\x2c\x55\x96\x29\xcb\x95\x15\xca\x4a\x65\x95\xb2\x5a\x59\xa3\xac\x55\xd6\x29\xeb\x95\x0d\xca\x46\x65\x93\xb2\x59\xd9\xa2\x6c\x55\xb6\x29\xdb\x95\x1d\xca\x4e\x65\x97\xb2\x5b\xd9\xa3\xec\x55\xf6\x29\x98\x82\x2b\x84\x42\x2a\x94\x42\x2b\x8c\xc2\x2a\x9c\xc2\x2b\x82\x22\x2a\x92\x22\x2b\x8a\xa2\x2a\x9a\xa2\x2b\x86\x62\x2a\x96\x62\x2b\x8e\xe2\x2a\x9e\xe2\x2b\x81\x12\x2a\x91\x02\x14\xa8\x20\x25\xa6\xec\x57\x0e\x28\x07\x95\x43\xca\x61\xe5\x88\x72\x54\x39\xa6\x1c\x57\x4e\x28\x27\x95\x53\xca\x69\xe5\x8c\x72\x56\x39\xa7\x9c\x57\x2e\x28\x17\x95\x4b\xca\x65\xe5\x8a\x72\x55\xb9\xa6\x5c\x57\x6e\x28\x37\x95\x5b\xca\x6d\xe5\x8e\x72\x57\xb9\xa7\xdc\x57\x1e\x28\x0f\x95\x47\xca\x63\xe5\x89\xf2\x54\x79\xa6\x3c\x57\x5e\x28\x2f\x95\x57\xca\x6b\xe5\x8d\xf2\x56\x79\xa7\xbc\x57\x3e\x28\x1f\x95\x4f\xca\x67\xe5\x8b\xf2\x55\xf9\xa6\x7c\x57\x7e\x28\x3f\x95\x5f\xca\x6f\xe5\x8f\xf2\x57\xf9\xa7\xc4\x29\xf1\x4a\x82\x92\xa8\x26\x51\x93\xaa\xc9\xd4\xe4\x6a\x0a\x35\xa5\x9a\x4a\x4d\xad\xa6\x51\xd3\xaa\xe9\xd4\xf4\x6a\x06\x35\xa3\x9a\x49\xcd\xac\x66\x51\xb3\xaa\xd9\xd4\xec\x6a\x0e\x35\xa7\x9a\x4b\xcd\xad\xe6\x51\xf3\xaa\xf9\xd4\xfc\x6a\x01\xb5\xa0\x5a\x48\x2d\xac\x16\x51\x8b\xaa\xc5\xd4\xe2\x6a\x09\xb5\xa4\x5a\x4a\x2d\xad\x96\x51\xcb\xaa\xe5\xd4\xf2\x6a\x05\xb5\xa2\x5a\x49\xad\xac\x56\x51\xab\xaa\xd5\xd4\xea\x6a\x0d\xb5\xa6\x5a\x4b\xad\xad\xd6\x51\xeb\xaa\xf5\xd4\xfa\x6a\x03\xb5\xa1\xda\x48\x6d\xac\x36\x51\x9b\xaa\xcd\xd4\xe6\x6a\x0b\xb5\xa5\xda\x4a\x6d\xad\xb6\x51\xdb\xaa\xed\xd4\xf6\x6a\x07\xb5\xa3\xda\x49\xed\xac\x76\x51\xbb\xaa\xdd\xd4\xee\x6a\x0f\xb5\xa7\xda\x4b\xed\xad\xf6\x51\xfb\xaa\xfd\xd4\xfe\xea\x00\x75\xa0\x3a\x48\x1d\xac\x0e\x51\x87\xaa\xc3\xd4\xe1\xea\x08\x75\xa4\x3a\x4a\x1d\xad\x8e\x51\xc7\xaa\xe3\xd4\xf1\xea\x04\x75\xa2\x3a\x49\x9d\xac\x4e\x51\xa7\xaa\xd3\xd4\xe9\xea\x0c\x75\xa6\x3a\x4b\x9d\xad\xce\x51\xe7\xaa\xf3\xd4\xf9\xea\x02\x75\xa1\xba\x48\x5d\xac\x2e\x51\x97\xaa\xcb\xd4\xe5\xea\x0a\x75\xa5\xba\x4a\x5d\xad\xae\x51\xd7\xaa\xeb\xd4\xf5\xea\x06\x75\xa3\xba\x49\xdd\xac\x6e\x51\xb7\xaa\xdb\xd4\xed\xea\x0e\x75\xa7\xba\x4b\xdd\xad\xee\x51\xf7\xaa\xfb\x54\x4c\xc5\x55\x42\x25\x55\x4a\xa5\x55\x46\x65\x55\x4e\xe5\x55\x41\x15\x55\x49\x95\x55\x45\x55\x55\x4d\xd5\x55\x43\x35\x55\x4b\xb5\x55\x47\x75\x55\x4f\xf5\xd5\x40\x0d\xd5\x48\x05\x2a\x54\x91\x1a\x53\xf7\xab\x07\xd4\x83\xea\x21\xf5\xb0\x7a\x44\x3d\xaa\x1e\x53\x8f\xab\x27\xd4\x93\xea\x29\xf5\xb4\x7a\x46\x3d\xab\x9e\x53\xcf\xab\x17\xd4\x8b\xea\x25\xf5\xb2\x7a\x45\xbd\xaa\x5e\x53\xaf\xab\x37\xd4\x9b\xea\x2d\xf5\xb6\x7a\x47\xbd\xab\xde\x53\xef\xab\x0f\xd4\x87\xea\x23\xf5\xb1\xfa\x44\x7d\xaa\x3e\x53\x9f\xab\x2f\xd4\x97\xea\x2b\xf5\xb5\xfa\x46\x7d\xab\xbe\x53\xdf\xab\x1f\xd4\x8f\xea\x27\xf5\xb3\xfa\x45\xfd\xaa\x7e\x53\xbf\xab\x3f\xd4\x9f\xea\x2f\xf5\xb7\xfa\x47\xfd\xab\xfe\x53\xe3\xd4\x78\x35\x41\x4d\xd4\x92\x68\x49\xb5\x64\x5a\x72\x2d\x85\x96\x52\x4b\xa5\xa5\xd6\xd2\x68\x69\xb5\x74\x5a\x7a\x2d\x83\x96\x51\xcb\xa4\x65\xd6\xb2\x68\x59\xb5\x6c\x5a\x76\x2d\x87\x96\x53\xcb\xa5\xe5\xd6\xf2\x68\x79\xb5\x7c\x5a\x7e\xad\x80\x56\x50\x2b\xa4\x15\xd6\x8a\x68\x45\xb5\x62\x5a\x71\xad\x84\x56\x52\x2b\xa5\x95\xd6\xca\x68\x65\xb5\x72\x5a\x79\xad\x82\x56\x51\xab\xa4\x55\xd6\xaa\x68\x55\xb5\x6a\x5a\x75\xad\x86\x56\x53\xab\xa5\xd5\xd6\xea\x68\x75\xb5\x7a\x5a\x7d\xad\x81\xd6\x50\x6b\xa4\x35\xd6\x9a\x68\x4d\xb5\x66\x5a\x73\xad\x85\xd6\x52\x6b\xa5\xb5\xd6\xda\x68\x6d\xb5\x76\x5a\x7b\xad\x83\xd6\x51\xeb\xa4\x75\xd6\xba\x68\x5d\xb5\x6e\x5a\x77\xad\x87\xd6\x53\xeb\xa5\xf5\xd6\xfa\x68\x7d\xb5\x7e\x5a\x7f\x6d\x80\x36\x50\x1b\xa4\x0d\xd6\x86\x68\x43\xb5\x61\xda\x70\x6d\x84\x36\x52\x1b\xa5\x8d\xd6\xc6\x68\x63\xb5\x71\xda\x78\x6d\x82\x36\x51\x9b\xa4\x4d\xd6\xa6\x68\x53\xb5\x69\xda\x74\x6d\x86\x36\x53\x9b\xa5\xcd\xd6\xe6\x68\x73\xb5\x79\xda\x7c\x6d\x81\xb6\x50\x5b\xa4\x2d\xd6\x96\x68\x4b\xb5\x65\xda\x72\x6d\x85\xb6\x52\x5b\xa5\xad\xd6\xd6\x68\x6b\xb5\x75\xda\x7a\x6d\x83\xb6\x51\xdb\xa4\x6d\xd6\xb6\x68\x5b\xb5\x6d\xda\x76\x6d\x87\xb6\x53\xdb\xa5\xed\xd6\xf6\x68\x7b\xb5\x7d\x1a\xa6\xe1\x1a\xa1\x91\x1a\xa5\xd1\x1a\xa3\xb1\x1a\xa7\xf1\x9a\xa0\x89\x9a\xa4\xc9\x9a\xa2\xa9\x9a\xa6\xe9\x9a\xa1\x99\x9a\xa5\xd9\x9a\xa3\xb9\x9a\xa7\xf9\x5a\xa0\x85\x5a\xa4\x01\x0d\x6a\x48\x8b\x69\xfb\xb5\x03\xda\x41\xed\x90\x76\x58\x3b\xa2\x1d\xd5\x8e\x69\xc7\xb5\x13\xda\x49\xed\x94\x76\x5a\x3b\xa3\x9d\xd5\xce\x69\xe7\xb5\x0b\xda\x45\xed\x92\x76\x59\xbb\xa2\x5d\xd5\xae\x69\xd7\xb5\x1b\xda\x4d\xed\x96\x76\x5b\xbb\xa3\xdd\xd5\xee\x69\xf7\xb5\x07\xda\x43\xed\x91\xf6\x58\x7b\xa2\x3d\xd5\x9e\x69\xcf\xb5\x17\xda\x4b\xed\x95\xf6\x5a\x7b\xa3\xbd\xd5\xde\x69\xef\xb5\x0f\xda\x47\xed\x93\xf6\x59\xfb\xa2\x7d\xd5\xbe\x69\xdf\xb5\x1f\xda\x4f\xed\x97\xf6\x5b\xfb\xa3\xfd\xd5\xfe\x69\x71\x5a\xbc\x96\xa0\x25\xea\x49\xf4\xa4\x7a\x32\x3d\xb9\x9e\x42\x4f\xa9\xa7\xd2\x53\xeb\x69\xf4\xb4\x7a\x3a\x3d\xbd\x9e\x41\xcf\xa8\x67\xd2\x33\xeb\x59\xf4\xac\x7a\x36\x3d\xbb\x9e\x43\xcf\xa9\xe7\xd2\x73\xeb\x79\xf4\xbc\x7a\x3e\x3d\xbf\x5e\x40\x2f\xa8\x17\xd2\x0b\xeb\x45\xf4\xa2\x7a\x31\xbd\xb8\x5e\x42\x2f\xa9\x97\xd2\x4b\xeb\x65\xf4\xb2\x7a\x39\xbd\xbc\x5e\x41\xaf\xa8\x57\xd2\x2b\xeb\x55\xf4\xaa\x7a\x35\xbd\xba\x5e\x43\xaf\xa9\xd7\xd2\x6b\xeb\x75\xf4\xba\x7a\x3d\xbd\xbe\xde\x40\x6f\xa8\x37\xd2\x1b\xeb\x4d\xf4\xa6\x7a\x33\xbd\xb9\xde\x42\x6f\xa9\xb7\xd2\x5b\xeb\x6d\xf4\xb6\x7a\x3b\xbd\xbd\xde\x41\xef\xa8\x77\xd2\x3b\xeb\x5d\xf4\xae\x7a\x37\xbd\xbb\xde\x43\xef\xa9\xf7\xd2\x7b\xeb\x7d\xf4\xbe\x7a\x3f\xbd\xbf\x3e\x40\x1f\xa8\x0f\xd2\x07\xeb\x43\xf4\xa1\xfa\x30\x7d\xb8\x3e\x42\x1f\xa9\x8f\xd2\x47\xeb\x63\xf4\xb1\xfa\x38\x7d\xbc\x3e\x41\x9f\xa8\x4f\xd2\x27\xeb\x53\xf4\xa9\xfa\x34\x7d\xba\x3e\x43\x9f\xa9\xcf\xd2\x67\xeb\x73\xf4\xb9\xfa\x3c\x7d\xbe\xbe\x40\x5f\xa8\x2f\xd2\x17\xeb\x4b\xf4\xa5\xfa\x32\x7d\xb9\xbe\x42\x5f\xa9\xaf\xd2\x57\xeb\x6b\xf4\xb5\xfa\x3a\x7d\xbd\xbe\x41\xdf\xa8\x6f\xd2\x37\xeb\x5b\xf4\xad\xfa\x36\x7d\xbb\xbe\x43\xdf\xa9\xef\xd2\x77\xeb\x7b\xf4\xbd\xfa\x3e\x1d\xd3\x71\x9d\xd0\x49\x9d\xd2\x69\x9d\xd1\x59\x9d\xd3\x79\x5d\xd0\x45\x5d\xd2\x65\x5d\xd1\x55\x5d\xd3\x75\xdd\xd0\x4d\xdd\xd2\x6d\xdd\xd1\x5d\xdd\xd3\x7d\x3d\xd0\x43\x3d\xd2\x81\x0e\x75\xa4\xc7\xf4\xfd\xfa\x01\xfd\xa0\x7e\x48\x3f\xac\x1f\xd1\x8f\xea\xc7\xf4\xe3\xfa\x09\xfd\xa4\x7e\x4a\x3f\xad\x9f\xd1\xcf\xea\xe7\xf4\xf3\xfa\x05\xfd\xa2\x7e\x49\xbf\xac\x5f\xd1\xaf\xea\xd7\xf4\xeb\xfa\x0d\xfd\xa6\x7e\x4b\xbf\xad\xdf\xd1\xef\xea\xf7\xf4\xfb\xfa\x03\xfd\xa1\xfe\x48\x7f\xac\x3f\xd1\x9f\xea\xcf\xf4\xe7\xfa\x0b\xfd\xa5\xfe\x4a\x7f\xad\xbf\xd1\xdf\xea\xef\xf4\xf7\xfa\x07\xfd\xa3\xfe\x49\xff\xac\x7f\xd1\xbf\xea\xdf\xf4\xef\xfa\x0f\xfd\xa7\xfe\x4b\xff\xad\xff\xd1\xff\xea\xff\xf4\x38\x3d\x5e\x4f\xd0\x13\x8d\x24\x46\x52\x23\x99\x91\xdc\x48\x61\xa4\x34\x52\x19\xa9\x8d\x34\x46\x5a\x23\x9d\x91\xde\xc8\x60\x64\x34\x32\x19\x99\x8d\x2c\x46\x56\x23\x9b\x91\xdd\xc8\x61\xe4\x34\x72\x19\xb9\x8d\x3c\x46\x5e\x23\x9f\x91\xdf\x28\x60\x14\x34\x0a\x19\x85\x8d\x22\x46\x51\xa3\x98\x51\xdc\x28\x61\x94\x34\x4a\x19\xa5\x8d\x32\x46\x59\xa3\x9c\x51\xde\xa8\x60\x54\x34\x2a\x19\x95\x8d\x2a\x46\x55\xa3\x9a\x51\xdd\xa8\x61\xd4\x34\x6a\x19\xb5\x8d\x3a\x46\x5d\xa3\x9e\x51\xdf\x68\x60\x34\x34\x1a\x19\x8d\x8d\x26\x46\x53\xa3\x99\xd1\xdc\x68\x61\xb4\x34\x5a\x19\xad\x8d\x36\x46\x5b\xa3\x9d\xd1\xde\xe8\x60\x74\x34\x3a\x19\x9d\x8d\x2e\x46\x57\xa3\x9b\xd1\xdd\xe8\x61\xf4\x34\x7a\x19\xbd\x8d\x3e\x46\x5f\xa3\x9f\xd1\xdf\x18\x60\x0c\x34\x06\x19\x83\x8d\x21\xc6\x50\x63\x98\x31\xdc\x18\x61\x8c\x34\x46\x19\xa3\x8d\x31\xc6\x58\x63\x9c\x31\xde\x98\x60\x4c\x34\x26\x19\x93\x8d\x29\xc6\x54\x63\x9a\x31\xdd\x98\x61\xcc\x34\x66\x19\xb3\x8d\x39\xc6\x5c\x63\x9e\x31\xdf\x58\x60\x2c\x34\x16\x19\x8b\x8d\x25\xc6\x52\x63\x99\xb1\xdc\x58\x61\xac\x34\x56\x19\xab\x8d\x35\xc6\x5a\x63\x9d\xb1\xde\xd8\x60\x6c\x34\x36\x19\x9b\x8d\x2d\xc6\x56\x63\x9b\xb1\xdd\xd8\x61\xec\x34\x76\x19\xbb\x8d\x3d\xc6\x5e\x63\x9f\x81\x19\xb8\x41\x18\xa4\x41\x19\xb4\xc1\x18\xac\xc1\x19\xbc\x21\x18\xa2\x21\x19\xb2\xa1\x18\xaa\xa1\x19\xba\x61\x18\xa6\x61\x19\xb6\xe1\x18\xae\xe1\x19\xbe\x11\x18\xa1\x11\x19\xc0\x80\x06\x32\x62\xc6\x7e\xe3\x80\x71\xd0\x38\x64\x1c\x36\x8e\x18\x47\x8d\x63\xc6\x71\xe3\x84\x71\xd2\x38\x65\x9c\x36\xce\x18\x67\x8d\x73\xc6\x79\xe3\x82\x71\xd1\xb8\x64\x5c\x36\xae\x18\x57\x8d\x6b\xc6\x75\xe3\x86\x71\xd3\xb8\x65\xdc\x36\xee\x18\x77\x8d\x7b\xc6\x7d\xe3\x81\xf1\xd0\x78\x64\x3c\x36\x9e\x18\x4f\x8d\x67\xc6\x73\xe3\x85\xf1\xd2\x78\x65\xbc\x36\xde\x18\x6f\x8d\x77\xc6\x7b\xe3\x83\xf1\xd1\xf8\x64\x7c\x36\xbe\x18\x5f\x8d\x6f\xc6\x77\xe3\x87\xf1\xd3\xf8\x65\xfc\x36\xfe\x18\x7f\x8d\x7f\x46\x9c\x11\x6f\x24\x18\x89\x66\x12\x33\xa9\x99\xcc\x4c\x6e\xa6\x30\x53\x9a\xa9\xcc\xd4\x66\x1a\x33\xad\x99\xce\x4c\x6f\x66\x30\x33\x9a\x99\xcc\xcc\x66\x16\x33\xab\x99\xcd\xcc\x6e\xe6\x30\x73\x9a\xb9\xcc\xdc\x66\x1e\x33\xaf\x99\xcf\xcc\x6f\x16\x30\x0b\x9a\x85\xcc\xc2\x66\x11\xb3\xa8\x59\xcc\x2c\x6e\x96\x30\x4b\x9a\xa5\xcc\xd2\x66\x19\xb3\xac\x59\xce\x2c\x6f\x56\x30\x2b\x9a\x95\xcc\xca\x66\x15\xb3\xaa\x59\xcd\xac\x6e\xd6\x30\x6b\x9a\xb5\xcc\xda\x66\x1d\xb3\xae\x59\xcf\xac\x6f\x36\x30\x1b\x9a\x8d\xcc\xc6\x66\x13\xb3\xa9\xd9\xcc\x6c\x6e\xb6\x30\x5b\x9a\xad\xcc\xd6\x66\x1b\xb3\xad\xd9\xce\x6c\x6f\x76\x30\x3b\x9a\x9d\xcc\xce\x66\x17\xb3\xab\xd9\xcd\xec\x6e\xf6\x30\x7b\x9a\xbd\xcc\xde\x66\x1f\xb3\xaf\xd9\xcf\xec\x6f\x0e\x30\x07\x9a\x83\xcc\xc1\xe6\x10\x73\xa8\x39\xcc\x1c\x6e\x8e\x30\x47\x9a\xa3\xcc\xd1\xe6\x18\x73\xac\x39\xce\x1c\x6f\x4e\x30\x27\x9a\x93\xcc\xc9\xe6\x14\x73\xaa\x39\xcd\x9c\x6e\xce\x30\x67\x9a\xb3\xcc\xd9\xe6\x1c\x73\xae\x39\xcf\x9c\x6f\x2e\x30\x17\x9a\x8b\xcc\xc5\xe6\x12\x73\xa9\xb9\xcc\x5c\x6e\xae\x30\x57\x9a\xab\xcc\xd5\xe6\x1a\x73\xad\xb9\xce\x5c\x6f\x6e\x30\x37\x9a\x9b\xcc\xcd\xe6\x16\x73\xab\xb9\xcd\xdc\x6e\xee\x30\x77\x9a\xbb\xcc\xdd\xe6\x1e\x73\xaf\xb9\xcf\xc4\x4c\xdc\x24\x4c\xd2\xa4\x4c\xda\x64\x4c\xd6\xe4\x4c\xde\x14\x4c\xd1\x94\x4c\xd9\x54\x4c\xd5\xd4\x4c\xdd\x34\x4c\xd3\xb4\x4c\xdb\x74\x4c\xd7\xf4\x4c\xdf\x0c\xcc\xd0\x8c\x4c\x60\x42\x13\x99\x31\x73\xbf\x79\xc0\x3c\x68\x1e\x32\x0f\x9b\x47\xcc\xa3\xe6\x31\xf3\xb8\x79\xc2\x3c\x69\x9e\x32\x4f\x9b\x67\xcc\xb3\xe6\x39\xf3\xbc\x79\xc1\xbc\x68\x5e\x32\x2f\x9b\x57\xcc\xab\xe6\x35\xf3\xba\x79\xc3\xbc\x69\xde\x32\x6f\x9b\x77\xcc\xbb\xe6\x3d\xf3\xbe\xf9\xc0\x7c\x68\x3e\x32\x1f\x9b\x4f\xcc\xa7\xe6\x33\xf3\xb9\xf9\xc2\x7c\x69\xbe\x32\x5f\x9b\x6f\xcc\xb7\xe6\x3b\xf3\xbd\xf9\xc1\xfc\x68\x7e\x32\x3f\x9b\x5f\xcc\xaf\xe6\x37\xf3\xbb\xf9\xc3\xfc\x69\xfe\x32\x7f\x9b\x7f\xcc\xbf\xe6\x3f\x33\xce\x8c\x37\x13\xcc\x44\x2b\x89\x95\xd4\x4a\x66\x25\xb7\x52\x58\x29\xad\x54\x56\x6a\x2b\x8d\x95\xd6\x4a\x67\xa5\xb7\x32\x58\x19\xad\x4c\x56\x66\x2b\x8b\x95\xd5\xca\x66\x65\xb7\x72\x58\x39\xad\x5c\x56\x6e\x2b\x8f\x95\xd7\xca\x67\xe5\xb7\x0a\x58\x05\xad\x42\x56\x61\xab\x88\x55\xd4\x2a\x66\x15\xb7\x4a\x58\x25\xad\x52\x56\x69\xab\x8c\x55\xd6\x2a\x67\x95\xb7\x2a\x58\x15\xad\x4a\x56\x65\xab\x8a\x55\xd5\xaa\x66\x55\xb7\x6a\x58\x35\xad\x5a\x56\x6d\xab\x8e\x55\xd7\xaa\x67\xd5\xb7\x1a\x58\x0d\xad\x46\x56\x63\xab\x89\xd5\xd4\x6a\x66\x35\xb7\x5a\x58\x2d\xad\x56\x56\x6b\xab\x8d\xd5\xd6\x6a\x67\xb5\xb7\x3a\x58\x1d\xad\x4e\x56\x67\xab\x8b\xd5\xd5\xea\x66\x75\xb7\x7a\x58\x3d\xad\x5e\x56\x6f\xab\x8f\xd5\xd7\xea\x67\xf5\xb7\x06\x58\x03\xad\x41\xd6\x60\x6b\x88\x35\xd4\x1a\x66\x0d\xb7\x46\x58\x23\xad\x51\xd6\x68\x6b\x8c\x35\xd6\x1a\x67\x8d\xb7\x26\x58\x13\xad\x49\xd6\x64\x6b\x8a\x35\xd5\x9a\x66\x4d\xb7\x66\x58\x33\xad\x59\xd6\x6c\x6b\x8e\x35\xd7\x9a\x67\xcd\xb7\x16\x58\x0b\xad\x45\xd6\x62\x6b\x89\xb5\xd4\x5a\x66\x2d\xb7\x56\x58\x2b\xad\x55\xd6\x6a\x6b\x8d\xb5\xd6\x5a\x67\xad\xb7\x36\x58\x1b\xad\x4d\xd6\x66\x6b\x8b\xb5\xd5\xda\x66\x6d\xb7\x76\x58\x3b\xad\x5d\xd6\x6e\x6b\x8f\xb5\xd7\xda\x67\x61\x16\x6e\x11\x16\x69\x51\x16\x6d\x31\x16\x6b\x71\x16\x6f\x09\x96\x68\x49\x96\x6c\x29\x96\x6a\x69\x96\x6e\x19\x96\x69\x59\x96\x6d\x39\x96\x6b\x79\x96\x6f\x05\x56\x68\x45\x16\xb0\xa0\x85\xac\x98\xb5\xdf\x3a\x60\x1d\xb4\x0e\x59\x87\xad\x23\xd6\x51\xeb\x98\x75\xdc\x3a\x61\x9d\xb4\x4e\x59\xa7\xad\x33\xd6\x59\xeb\x9c\x75\xde\xba\x60\x5d\xb4\x2e\x59\x97\xad\x2b\xd6\x55\xeb\x9a\x75\xdd\xba\x61\xdd\xb4\x6e\x59\xb7\xad\x3b\xd6\x5d\xeb\x9e\x75\xdf\x7a\x60\x3d\xb4\x1e\x59\x8f\xad\x27\xd6\x53\xeb\x99\xf5\xdc\x7a\x61\xbd\xb4\x5e\x59\xaf\xad\x37\xd6\x5b\xeb\x9d\xf5\xde\xfa\x60\x7d\xb4\x3e\x59\x9f\xad\x2f\xd6\x57\xeb\x9b\xf5\xdd\xfa\x61\xfd\xb4\x7e\x59\xbf\xad\x3f\xd6\x5f\xeb\x9f\x15\x67\xc5\x5b\x09\x56\xa2\x9d\xc4\x4e\x6a\x27\xb3\x93\xdb\x29\xec\x94\x76\x2a\x3b\xb5\x9d\xc6\x4e\x6b\xa7\xb3\xd3\xdb\x19\xec\x8c\x76\x26\x3b\xb3\x9d\xc5\xce\x6a\x67\xb3\xb3\xdb\x39\xec\x9c\x76\x2e\x3b\xb7\x9d\xc7\xce\x6b\xe7\xb3\xf3\xdb\x05\xec\x82\x76\x21\xbb\xb0\x5d\xc4\x2e\x6a\x17\xb3\x8b\xdb\x25\xec\x92\x76\x29\xbb\xb4\x5d\xc6\x2e\x6b\x97\xb3\xcb\xdb\x15\xec\x8a\x76\x25\xbb\xb2\x5d\xc5\xae\x6a\x57\xb3\xab\xdb\x35\xec\x9a\x76\x2d\xbb\xb6\x5d\xc7\xae\x6b\xd7\xb3\xeb\xdb\x0d\xec\x86\x76\x23\xbb\xb1\xdd\xc4\x6e\x6a\x37\xb3\x9b\xdb\x2d\xec\x96\x76\x2b\xbb\xb5\xdd\xc6\x6e\x6b\xb7\xb3\xdb\xdb\x1d\xec\x8e\x76\x27\xbb\xb3\xdd\xc5\xee\x6a\x77\xb3\xbb\xdb\x3d\xec\x9e\x76\x2f\xbb\xb7\xdd\xc7\xee\x6b\xf7\xb3\xfb\xdb\x03\xec\x81\xf6\x20\x7b\xb0\x3d\xc4\x1e\x6a\x0f\xb3\x87\xdb\x23\xec\x91\xf6\x28\x7b\xb4\x3d\xc6\x1e\x6b\x8f\xb3\xc7\xdb\x13\xec\x89\xf6\x24\x7b\xb2\x3d\xc5\x9e\x6a\x4f\xb3\xa7\xdb\x33\xec\x99\xf6\x2c\x7b\xb6\x3d\xc7\x9e\x6b\xcf\xb3\xe7\xdb\x0b\xec\x85\xf6\x22\x7b\xb1\xbd\xc4\x5e\x6a\x2f\xb3\x97\xdb\x2b\xec\x95\xf6\x2a\x7b\xb5\xbd\xc6\x5e\x6b\xaf\xb3\xd7\xdb\x1b\xec\x8d\xf6\x26\x7b\xb3\xbd\xc5\xde\x6a\x6f\xb3\xb7\xdb\x3b\xec\x9d\xf6\x2e\x7b\xb7\xbd\xc7\xde\x6b\xef\xb3\x31\x1b\xb7\x09\x9b\xb4\x29\x9b\xb6\x19\x9b\xb5\x39\x9b\xb7\x05\x5b\xb4\x25\x5b\xb6\x15\x5b\xb5\x35\x5b\xb7\x0d\xdb\xb4\x2d\xdb\xb6\x1d\xdb\xb5\x3d\xdb\xb7\x03\x3b\xb4\x23\x1b\xd8\xd0\x46\x76\xcc\xde\x6f\x1f\xb0\x0f\xda\x87\xec\xc3\xf6\x11\xfb\xa8\x7d\xcc\x3e\x6e\x9f\xb0\x4f\xda\xa7\xec\xd3\xf6\x19\xfb\xac\x7d\xce\x3e\x6f\x5f\xb0\x2f\xda\x97\xec\xcb\xf6\x15\xfb\xaa\x7d\xcd\xbe\x6e\xdf\xb0\x6f\xda\xb7\xec\xdb\xf6\x1d\xfb\xae\x7d\xcf\xbe\x6f\x3f\xb0\x1f\xda\x8f\xec\xc7\xf6\x13\xfb\xa9\xfd\xcc\x7e\x6e\xbf\xb0\x5f\xda\xaf\xec\xd7\xf6\x1b\xfb\xad\xfd\xce\x7e\x6f\x7f\xb0\x3f\xda\x9f\xec\xcf\xf6\x17\xfb\xab\xfd\xcd\xfe\x6e\xff\xb0\x7f\xda\xbf\xec\xdf\xf6\x1f\xfb\xaf\xfd\xcf\x8e\xb3\xe3\xed\x04\x3b\xd1\x49\xe2\x24\x75\x92\x39\xc9\x9d\x14\x4e\x4a\x27\x95\x93\xda\x49\xe3\xa4\x75\xd2\x39\xe9\x9d\x0c\x4e\x46\x27\x93\x93\xd9\xc9\xe2\x64\x75\xb2\x39\xd9\x9d\x1c\x4e\x4e\x27\x97\x93\xdb\xc9\xe3\xe4\x75\xf2\x39\xf9\x9d\x02\x4e\x41\xa7\x90\x53\xd8\x29\xe2\x14\x75\x8a\x39\xc5\x9d\x12\x4e\x49\xa7\x94\x53\xda\x29\xe3\x94\x75\xca\x39\xe5\x9d\x0a\x4e\x45\xa7\x92\x53\xd9\xa9\xe2\x54\x75\xaa\x39\xd5\x9d\x1a\x4e\x4d\xa7\x96\x53\xdb\xa9\xe3\xd4\x75\xea\x39\xf5\x9d\x06\x4e\x43\xa7\x91\xd3\xd8\x69\xe2\x34\x75\x9a\x39\xcd\x9d\x16\x4e\x4b\xa7\x95\xd3\xda\x69\xe3\xb4\x75\xda\x39\xed\x9d\x0e\x4e\x47\xa7\x93\xd3\xd9\xe9\xe2\x74\x75\xba\x39\xdd\x9d\x1e\x4e\x4f\xa7\x97\xd3\xdb\xe9\xe3\xf4\x75\xfa\x39\xfd\x9d\x01\xce\x40\x67\x90\x33\xd8\x19\xe2\x0c\x75\x86\x39\xc3\x9d\x11\xce\x48\x67\x94\x33\xda\x19\xe3\x8c\x75\xc6\x39\xe3\x9d\x09\xce\x44\x67\x92\x33\xd9\x99\xe2\x4c\x75\xa6\x39\xd3\x9d\x19\xce\x4c\x67\x96\x33\xdb\x99\xe3\xcc\x75\xe6\x39\xf3\x9d\x05\xce\x42\x67\x91\xb3\xd8\x59\xe2\x2c\x75\x96\x39\xcb\x9d\x15\xce\x4a\x67\x95\xb3\xda\x59\xe3\xac\x75\xd6\x39\xeb\x9d\x0d\xce\x46\x67\x93\xb3\xd9\xd9\xe2\x6c\x75\xb6\x39\xdb\x9d\x1d\xce\x4e\x67\x97\xb3\xdb\xd9\xe3\xec\x75\xf6\x39\x98\x83\x3b\x84\x43\x3a\x94\x43\x3b\x8c\xc3\x3a\x9c\xc3\x3b\x82\x23\x3a\x92\x23\x3b\x8a\xa3\x3a\x9a\xa3\x3b\x86\x63\x3a\x96\x63\x3b\x8e\xe3\x3a\x9e\xe3\x3b\x81\x13\x3a\x91\x03\x1c\xe8\x20\x27\xe6\xec\x77\x0e\x38\x07\x9d\x43\xce\x61\xe7\x88\x73\xd4\x39\xe6\x1c\x77\x4e\x38\x27\x9d\x53\xce\x69\xe7\x8c\x73\xd6\x39\xe7\x9c\x77\x2e\x38\x17\x9d\x4b\xce\x65\xe7\x8a\x73\xd5\xb9\xe6\x5c\x77\x6e\x38\x37\x9d\x5b\xce\x6d\xe7\x8e\x73\xd7\xb9\xe7\xdc\x77\x1e\x38\x0f\x9d\x47\xce\x63\xe7\x89\xf3\xd4\x79\xe6\x3c\x77\x5e\x38\x2f\x9d\x57\xce\x6b\xe7\x8d\xf3\xd6\x79\xe7\xbc\x77\x3e\x38\x1f\x9d\x4f\xce\x67\xe7\x8b\xf3\xd5\xf9\xe6\x7c\x77\x7e\x38\x3f\x9d\x5f\xce\x6f\xe7\x8f\xf3\xd7\xf9\xe7\xc4\x39\xf1\x4e\x82\x93\xe8\x26\x71\x93\xba\xc9\xdc\xe4\x6e\x0a\x37\xa5\x9b\xca\x4d\xed\xa6\x71\xd3\xba\xe9\xdc\xf4\x6e\x06\x37\xa3\x9b\xc9\xcd\xec\x66\x71\xb3\xba\xd9\xdc\xec\x6e\x0e\x37\xa7\x9b\xcb\xcd\xed\xe6\x71\xf3\xba\xf9\xdc\xfc\x6e\x01\xb7\xa0\x5b\xc8\x2d\xec\x16\x71\x8b\xba\xc5\xdc\xe2\x6e\x09\xb7\xa4\x5b\xca\x2d\xed\x96\x71\xcb\xba\xe5\xdc\xf2\x6e\x05\xb7\xa2\x5b\xc9\xad\xec\x56\x71\xab\xba\xd5\xdc\xea\x6e\x0d\xb7\xa6\x5b\xcb\xad\xed\xd6\x71\xeb\xba\xf5\xdc\xfa\x6e\x03\xb7\xa1\xdb\xc8\x6d\xec\x36\x71\x9b\xba\xcd\xdc\xe6\x6e\x0b\xb7\xa5\xdb\xca\x6d\xed\xb6\x71\xdb\xba\xed\xdc\xf6\x6e\x07\xb7\xa3\xdb\xc9\xed\xec\x76\x71\xbb\xba\xdd\xdc\xee\x6e\x0f\xb7\xa7\xdb\xcb\xed\xed\xf6\x71\xfb\xba\xfd\xdc\xfe\xee\x00\x77\xa0\x3b\xc8\x1d\xec\x0e\x71\x87\xba\xc3\xdc\xe1\xee\x08\x77\xa4\x3b\xca\x1d\xed\x8e\x71\xc7\xba\xe3\xdc\xf1\xee\x04\x77\xa2\x3b\xc9\x9d\xec\x4e\x71\xa7\xba\xd3\xdc\xe9\xee\x0c\x77\xa6\x3b\xcb\x9d\xed\xce\x71\xe7\xba\xf3\xdc\xf9\xee\x02\x77\xa1\xbb\xc8\x5d\xec\x2e\x71\x97\xba\xcb\xdc\xe5\xee\x0a\x77\xa5\xbb\xca\x5d\xed\xae\x71\xd7\xba\xeb\xdc\xf5\xee\x06\x77\xa3\xbb\xc9\xdd\xec\x6e\x71\xb7\xba\xdb\xdc\xed\xee\x0e\x77\xa7\xbb\xcb\xdd\xed\xee\x71\xf7\xba\xfb\x5c\xcc\xc5\x5d\xc2\x25\x5d\xca\xa5\x5d\xc6\x65\x5d\xce\xe5\x5d\xc1\x15\x5d\xc9\x95\x5d\xc5\x55\x5d\xcd\xd5\x5d\xc3\x35\x5d\xcb\xb5\x5d\xc7\x75\x5d\xcf\xf5\xdd\xc0\x0d\xdd\xc8\x05\x2e\x74\x91\x1b\x73\xf7\xbb\x07\xdc\x83\xee\x21\xf7\xb0\x7b\xc4\x3d\xea\x1e\x73\x8f\xbb\x27\xdc\x93\xee\x29\xf7\xb4\x7b\xc6\x3d\xeb\x9e\x73\xcf\xbb\x17\xdc\x8b\xee\x25\xf7\xb2\x7b\xc5\xbd\xea\x5e\x73\xaf\xbb\x37\xdc\x9b\xee\x2d\xf7\xb6\x7b\xc7\xbd\xeb\xde\x73\xef\xbb\x0f\xdc\x87\xee\x23\xf7\xb1\xfb\xc4\x7d\xea\x3e\x73\x9f\xbb\x2f\xdc\x97\xee\x2b\xf7\xb5\xfb\xc6\x7d\xeb\xbe\x73\xdf\xbb\x1f\xdc\x8f\xee\x27\xf7\xb3\xfb\xc5\xfd\xea\x7e\x73\xbf\xbb\x3f\xdc\x9f\xee\x2f\xf7\xb7\xfb\xc7\xfd\xeb\xfe\x73\xe3\xdc\x78\x37\xc1\x4d\xf4\x92\x78\x49\xbd\x64\x5e\x72\x2f\x85\x97\xd2\x4b\xe5\xa5\xf6\xd2\x78\x69\xbd\x74\x5e\x7a\x2f\x83\x97\xd1\xcb\xe4\x65\xf6\xb2\x78\x59\xbd\x6c\x5e\x76\x2f\x87\x97\xd3\xcb\xe5\xe5\xf6\xf2\x78\x79\xbd\x7c\x5e\x7e\xaf\x80\x57\xd0\x2b\xe4\x15\xf6\x8a\x78\x45\xbd\x62\x5e\x71\xaf\x84\x57\xd2\x2b\xe5\x95\xf6\xca\x78\x65\xbd\x72\x5e\x79\xaf\x82\x57\xd1\xab\xe4\x55\xf6\xaa\x78\x55\xbd\x6a\x5e\x75\xaf\x86\x57\xd3\xab\xe5\xd5\xf6\xea\x78\x75\xbd\x7a\x5e\x7d\xaf\x81\xd7\xd0\x6b\xe4\x35\xf6\x9a\x78\x4d\xbd\x66\x5e\x73\xaf\x85\xd7\xd2\x6b\xe5\xb5\xf6\xda\x78\x6d\xbd\x76\x5e\x7b\xaf\x83\xd7\xd1\xeb\xe4\x75\xf6\xba\x78\x5d\xbd\x6e\x5e\x77\xaf\x87\xd7\xd3\xeb\xe5\xf5\xf6\xfa\x78\x7d\xbd\x7e\x5e\x7f\x6f\x80\x37\xd0\x1b\xe4\x0d\xf6\x86\x78\x43\xbd\x61\xde\x70\x6f\x84\x37\xd2\x1b\xe5\x8d\xf6\xc6\x78\x63\xbd\x71\xde\x78\x6f\x82\x37\xd1\x9b\xe4\x4d\xf6\xa6\x78\x53\xbd\x69\xde\x74\x6f\x86\x37\xd3\x9b\xe5\xcd\xf6\xe6\x78\x73\xbd\x79\xde\x7c\x6f\x81\xb7\xd0\x5b\xe4\x2d\xf6\x96\x78\x4b\xbd\x65\xde\x72\x6f\x85\xb7\xd2\x5b\xe5\xad\xf6\xd6\x78\x6b\xbd\x75\xde\x7a\x6f\x83\xb7\xd1\xdb\xe4\x6d\xf6\xb6\x78\x5b\xbd\x6d\xde\x76\x6f\x87\xb7\xd3\xdb\xe5\xed\xf6\xf6\x78\x7b\xbd\x7d\x1e\xe6\xe1\x1e\xe1\x91\x1e\xe5\xd1\x1e\xe3\xb1\x1e\xe7\xf1\x9e\xe0\x89\x9e\xe4\xc9\x9e\xe2\xa9\x9e\xe6\xe9\x9e\xe1\x99\x9e\xe5\xd9\x9e\xe3\xb9\x9e\xe7\xf9\x5e\xe0\x85\x5e\xe4\x01\x0f\x7a\xc8\x8b\x79\xfb\xbd\x03\xde\x41\xef\x90\x77\xd8\x3b\xe2\x1d\xf5\x8e\x79\xc7\xbd\x13\xde\x49\xef\x94\x77\xda\x3b\xe3\x9d\xf5\xce\x79\xe7\xbd\x0b\xde\x45\xef\x92\x77\xd9\xbb\xe2\x5d\xf5\xae\x79\xd7\xbd\x1b\xde\x4d\xef\x96\x77\xdb\xbb\xe3\xdd\xf5\xee\x79\xf7\xbd\x07\xde\x43\xef\x91\xf7\xd8\x7b\xe2\x3d\xf5\x9e\x79\xcf\xbd\x17\xde\x4b\xef\x95\xf7\xda\x7b\xe3\xbd\xf5\xde\x79\xef\xbd\x0f\xde\x47\xef\x93\xf7\xd9\xfb\xe2\x7d\xf5\xbe\x79\xdf\xbd\x1f\xde\x4f\xef\x97\xf7\xdb\xfb\xe3\xfd\xf5\xfe\x79\x71\x5e\xbc\x97\xe0\x25\xfa\x49\xfc\xa4\x7e\x32\x3f\xb9\x9f\xc2\x4f\xe9\xa7\xf2\x53\xfb\x69\xfc\xb4\x7e\x3a\x3f\xbd\x9f\xc1\xcf\xe8\x67\xf2\x33\xfb\x59\xfc\xac\x7e\x36\x3f\xbb\x9f\xc3\xcf\xe9\xe7\xf2\x73\xfb\x79\xfc\xbc\x7e\x3e\x3f\xbf\x5f\xc0\x2f\xe8\x17\xf2\x0b\xfb\x45\xfc\xa2\x7e\x31\xbf\xb8\x5f\xc2\x2f\xe9\x97\xf2\x4b\xfb\x65\xfc\xb2\x7e\x39\xbf\xbc\x5f\xc1\xaf\xe8\x57\xf2\x2b\xfb\x55\xfc\xaa\x7e\x35\xbf\xba\x5f\xc3\xaf\xe9\xd7\xf2\x6b\xfb\x75\xfc\xba\x7e\x3d\xbf\xbe\xdf\xc0\x6f\xe8\x37\xf2\x1b\xfb\x4d\xfc\xa6\x7e\x33\xbf\xb9\xdf\xc2\x6f\xe9\xb7\xf2\x5b\xfb\x6d\xfc\xb6\x7e\x3b\xbf\xbd\xdf\xc1\xef\xe8\x77\xf2\x3b\xfb\x5d\xfc\xae\x7e\x37\xbf\xbb\xdf\xc3\xef\xe9\xf7\xf2\x7b\xfb\x7d\xfc\xbe\x7e\x3f\xbf\xbf\x3f\xc0\x1f\xe8\x0f\xf2\x07\xfb\x43\xfc\xa1\xfe\x30\x7f\xb8\x3f\xc2\x1f\xe9\x8f\xf2\x47\xfb\x63\xfc\xb1\xfe\x38\x7f\xbc\x3f\xc1\x9f\xe8\x4f\xf2\x27\xfb\x53\xfc\xa9\xfe\x34\x7f\xba\x3f\xc3\x9f\xe9\xcf\xf2\x67\xfb\x73\xfc\xb9\xfe\x3c\x7f\xbe\xbf\xc0\x5f\xe8\x2f\xf2\x17\xfb\x4b\xfc\xa5\xfe\x32\x7f\xb9\xbf\xc2\x5f\xe9\xaf\xf2\x57\xfb\x6b\xfc\xb5\xfe\x3a\x7f\xbd\xbf\xc1\xdf\xe8\x6f\xf2\x37\xfb\x5b\xfc\xad\xfe\x36\x7f\xbb\xbf\xc3\xdf\xe9\xef\xf2\x77\xfb\x7b\xfc\xbd\xfe\x3e\x1f\xf3\x71\x9f\xf0\x49\x9f\xf2\x69\x9f\xf1\x59\x9f\xf3\x79\x5f\xf0\x45\x5f\xf2\x65\x5f\xf1\x55\x5f\xf3\x75\xdf\xf0\x4d\xdf\xf2\x6d\xdf\xf1\x5d\xdf\xf3\x7d\x3f\xf0\x43\x3f\xf2\x81\x0f\x7d\xe4\xc7\xfc\xfd\xfe\x01\xff\xa0\x7f\xc8\x3f\xec\x1f\xf1\x8f\xfa\xc7\xfc\xe3\xfe\x09\xff\xa4\x7f\xca\x3f\xed\x9f\xf1\xcf\xfa\xe7\xfc\xf3\xfe\x05\xff\xa2\x7f\xc9\xbf\xec\x5f\xf1\xaf\xfa\xd7\xfc\xeb\xfe\x0d\xff\xa6\x7f\xcb\xbf\xed\xdf\xf1\xef\xfa\xf7\xfc\xfb\xfe\x03\xff\xa1\xff\xc8\x7f\xec\x3f\xf1\x9f\xfa\xcf\xfc\xe7\xfe\x0b\xff\xa5\xff\xca\x7f\xed\xbf\xf1\xdf\xfa\xef\xfc\xf7\xfe\x07\xff\xa3\xff\xc9\xff\xec\x7f\xf1\xbf\xfa\xdf\xfc\xef\xfe\x0f\xff\xa7\xff\xcb\xff\xed\xff\xf1\xff\xfa\xff\xfc\x38\x3f\xde\x4f\xf0\x13\x83\x24\x41\xd2\x20\x59\x90\x3c\x48\x11\xa4\x0c\x52\x05\xa9\x83\x34\x41\xda\x20\x5d\x90\x3e\xc8\x10\x64\x0c\x32\x05\x99\x83\x2c\x41\xd6\x20\x5b\x90\x3d\xc8\x11\xe4\x0c\x72\x05\xb9\x83\x3c\x41\xde\x20\x5f\x90\x3f\x28\x10\x14\x0c\x0a\x05\x85\x83\x22\x41\xd1\xa0\x58\x50\x3c\x28\x11\x94\x0c\x4a\x05\xa5\x83\x32\x41\xd9\xa0\x5c\x50\x3e\xa8\x10\x54\x0c\x2a\x05\x95\x83\x2a\x41\xd5\xa0\x5a\x50\x3d\xa8\x11\xd4\x0c\x6a\x05\xb5\x83\x3a\x41\xdd\xa0\x5e\x50\x3f\x68\x10\x34\x0c\x1a\x05\x8d\x83\x26\x41\xd3\xa0\x59\xd0\x3c\x68\x11\xb4\x0c\x5a\x05\xad\x83\x36\x41\xdb\xa0\x5d\xd0\x3e\xe8\x10\x74\x0c\x3a\x05\x9d\x83\x2e\x41\xd7\xa0\x5b\xd0\x3d\xe8\x11\xf4\x0c\x7a\x05\xbd\x83\x3e\x41\xdf\xa0\x5f\xd0\x3f\x18\x10\x0c\x0c\x06\x05\x83\x83\x21\xc1\xd0\x60\x58\x30\x3c\x18\x11\x8c\x0c\x46\x05\xa3\x83\x31\xc1\xd8\x60\x5c\x30\x3e\x98\x10\x4c\x0c\x26\x05\x93\x83\x29\xc1\xd4\x60\x5a\x30\x3d\x98\x11\xcc\x0c\x66\x05\xb3\x83\x39\xc1\xdc\x60\x5e\x30\x3f\x58\x10\x2c\x0c\x16\x05\x8b\x83\x25\xc1\xd2\x60\x59\xb0\x3c\x58\x11\xac\x0c\x56\x05\xab\x83\x35\xc1\xda\x60\x5d\xb0\x3e\xd8\x10\x6c\x0c\x36\x05\x9b\x83\x2d\xc1\xd6\x60\x5b\xb0\x3d\xd8\x11\xec\x0c\x76\x05\xbb\x83\x3d\xc1\xde\x60\x5f\x80\x05\x78\x40\x04\x64\x40\x05\x74\xc0\x04\x6c\xc0\x05\x7c\x20\x04\x62\x20\x05\x72\xa0\x04\x6a\xa0\x05\x7a\x60\x04\x66\x60\x05\x76\xe0\x04\x6e\xe0\x05\x7e\x10\x04\x61\x10\x05\x20\x80\x01\x0a\x62\xc1\xfe\xe0\x40\x70\x30\x38\x14\x1c\x0e\x8e\x04\x47\x83\x63\xc1\xf1\xe0\x44\x70\x32\x38\x15\x9c\x0e\xce\x04\x67\x83\x73\xc1\xf9\xe0\x42\x70\x31\xb8\x14\x5c\x0e\xae\x04\x57\x83\x6b\xc1\xf5\xe0\x46\x70\x33\xb8\x15\xdc\x0e\xee\x04\x77\x83\x7b\xc1\xfd\xe0\x41\xf0\x30\x78\x14\x3c\x0e\x9e\x04\x4f\x83\x67\xc1\xf3\xe0\x45\xf0\x32\x78\x15\xbc\x0e\xde\x04\x6f\x83\x77\xc1\xfb\xe0\x43\xf0\x31\xf8\x14\x7c\x0e\xbe\x04\x5f\x83\x6f\xc1\xf7\xe0\x47\xf0\x33\xf8\x15\xfc\x0e\xfe\x04\x7f\x83\x7f\x41\x5c\x10\x1f\x24\x04\x89\x61\x92\x30\x69\x98\x2c\x4c\x1e\xa6\x08\x53\x86\xa9\xc2\xd4\x61\x9a\x30\x6d\x98\x2e\x4c\x1f\x66\x08\x33\x86\x99\xc2\xcc\x61\x96\x30\x6b\x98\x2d\xcc\x1e\xe6\x08\x73\x86\xb9\xc2\xdc\x61\x9e\x30\x6f\x98\x2f\xcc\x1f\x16\x08\x0b\x86\x85\xc2\xc2\x61\x91\xb0\x68\x58\x2c\x2c\x1e\x96\x08\x4b\x86\xa5\xc2\xd2\x61\x99\xb0\x6c\x58\x2e\x2c\x1f\x56\x08\x2b\x86\x95\xc2\xca\x61\x95\xb0\x6a\x58\x2d\xac\x1e\xd6\x08\x6b\x86\xb5\xc2\xda\x61\x9d\xb0\x6e\x58\x2f\xac\x1f\x36\x08\x1b\x86\x8d\xc2\xc6\x61\x93\xb0\x69\xd8\x2c\x6c\x1e\xb6\x08\x5b\x86\xad\xc2\xd6\x61\x9b\xb0\x6d\xd8\x2e\x6c\x1f\x76\x08\x3b\x86\x9d\xc2\xce\x61\x97\xb0\x6b\xd8\x2d\xec\x1e\xf6\x08\x7b\x86\xbd\xc2\xde\x61\x9f\xb0\x6f\xd8\x2f\xec\x1f\x0e\x08\x07\x86\x83\xc2\xc1\xe1\x90\x70\x68\x38\x2c\x1c\x1e\x8e\x08\x47\x86\xa3\xc2\xd1\xe1\x98\x70\x6c\x38\x2e\x1c\x1f\x4e\x08\x27\x86\x93\xc2\xc9\xe1\x94\x70\x6a\x38\x2d\x9c\x1e\xce\x08\x67\x86\xb3\xc2\xd9\xe1\x9c\x70\x6e\x38\x2f\x9c\x1f\x2e\x08\x17\x86\x8b\xc2\xc5\xe1\x92\x70\x69\xb8\x2c\x5c\x1e\xae\x08\x57\x86\xab\xc2\xd5\xe1\x9a\x70\x6d\xb8\x2e\x5c\x1f\x6e\x08\x37\x86\x9b\xc2\xcd\xe1\x96\x70\x6b\xb8\x2d\xdc\x1e\xee\x08\x77\x86\xbb\xc2\xdd\xe1\x9e\x70\x6f\xb8\x2f\xc4\x42\x3c\x24\x42\x32\xa4\x42\x3a\x64\x42\x36\xe4\x42\x3e\x14\x42\x31\x94\x42\x39\x54\x42\x35\xd4\x42\x3d\x34\x42\x33\xb4\x42\x3b\x74\x42\x37\xf4\x42\x3f\x0c\xc2\x30\x8c\x42\x10\xc2\x10\x85\xb1\x70\x7f\x78\x20\x3c\x18\x1e\x0a\x0f\x87\x47\xc2\xa3\xe1\xb1\xf0\x78\x78\x22\x3c\x19\x9e\x0a\x4f\x87\x67\xc2\xb3\xe1\xb9\xf0\x7c\x78\x21\xbc\x18\x5e\x0a\x2f\x87\x57\xc2\xab\xe1\xb5\xf0\x7a\x78\x23\xbc\x19\xde\x0a\x6f\x87\x77\xc2\xbb\xe1\xbd\xf0\x7e\xf8\x20\x7c\x18\x3e\x0a\x1f\x87\x4f\xc2\xa7\xe1\xb3\xf0\x79\xf8\x22\x7c\x19\xbe\x0a\x5f\x87\x6f\xc2\xb7\xe1\xbb\xf0\x7d\xf8\x21\xfc\x18\x7e\x0a\x3f\x87\x5f\xc2\xaf\xe1\xb7\xf0\x7b\xf8\x23\xfc\x19\xfe\x0a\x7f\x87\x7f\xc2\xbf\xe1\xbf\x30\x2e\x8c\x0f\x13\xc2\xc4\x28\x49\x94\x34\x4a\x16\x25\x8f\x52\x44\x29\xa3\x54\x51\xea\x28\x4d\x94\x36\x4a\x17\xa5\x8f\x32\x44\x19\xa3\x4c\x51\xe6\x28\x4b\x94\x35\xca\x16\x65\x8f\x72\x44\x39\xa3\x5c\x51\xee\x28\x4f\x94\x37\xca\x17\xe5\x8f\x0a\x44\x05\xa3\x42\x51\xe1\xa8\x48\x54\x34\x2a\x16\x15\x8f\x4a\x44\x25\xa3\x52\x51\xe9\xa8\x4c\x54\x36\x2a\x17\x95\x8f\x2a\x44\x15\xa3\x4a\x51\xe5\xa8\x4a\x54\x35\xaa\x16\x55\x8f\x6a\x44\x35\xa3\x5a\x51\xed\xa8\x4e\x54\x37\xaa\x17\xd5\x8f\x1a\x44\x0d\xa3\x46\x51\xe3\xa8\x49\xd4\x34\x6a\x16\x35\x8f\x5a\x44\x2d\xa3\x56\x51\xeb\xa8\x4d\xd4\x36\x6a\x17\xb5\x8f\x3a\x44\x1d\xa3\x4e\x51\xe7\xa8\x4b\xd4\x35\xea\x16\x75\x8f\x7a\x44\x3d\xa3\x5e\x51\xef\xa8\x4f\xd4\x37\xea\x17\xf5\x8f\x06\x44\x03\xa3\x41\xd1\xe0\x68\x48\x34\x34\x1a\x16\x0d\x8f\x46\x44\x23\xa3\x51\xd1\xe8\x68\x4c\x34\x36\x1a\x17\x8d\x8f\x26\x44\x13\xa3\x49\xd1\xe4\x68\x4a\x34\x35\x9a\x16\x4d\x8f\x66\x44\x33\xa3\x59\xd1\xec\x68\x4e\x34\x37\x9a\x17\xcd\x8f\x16\x44\x0b\xa3\x45\xd1\xe2\x68\x49\xb4\x34\x5a\x16\x2d\x8f\x56\x44\x2b\xa3\x55\xd1\xea\x68\x4d\xb4\x36\x5a\x17\xad\x8f\x36\x44\x1b\xa3\x4d\xd1\xe6\x68\x4b\xb4\x35\xda\x16\x6d\x8f\x76\x44\x3b\xa3\x5d\xd1\xee\x68\x4f\xb4\x37\xda\x17\x61\x11\x1e\x11\x11\x19\x51\x11\x1d\x31\x11\x1b\x71\x11\x1f\x09\x91\x18\x49\x91\x1c\x29\x91\x1a\x69\x91\x1e\x19\x91\x19\x59\x91\x1d\x39\x91\x1b\x79\x91\x1f\x05\x51\x18\x45\x11\x88\x60\x84\xa2\x58\xb4\x3f\x3a\x10\x1d\x8c\x0e\x45\x87\xa3\x23\xd1\xd1\xe8\x58\x74\x3c\x3a\x11\x9d\x8c\x4e\x45\xa7\xa3\x33\xd1\xd9\xe8\x5c\x74\x3e\xba\x10\x5d\x8c\x2e\x45\x97\xa3\x2b\xd1\xd5\xe8\x5a\x74\x3d\xba\x11\xdd\x8c\x6e\x45\xb7\xa3\x3b\xd1\xdd\xe8\x5e\x74\x3f\x7a\x10\x3d\x8c\x1e\x45\x8f\xa3\x27\xd1\xd3\xe8\x59\xf4\x3c\x7a\x11\xbd\x8c\x5e\x45\xaf\xa3\x37\xd1\xdb\xe8\x5d\xf4\x3e\xfa\x10\x7d\x8c\x3e\x45\x9f\xa3\x2f\xd1\xd7\xe8\x5b\xf4\x3d\xfa\x11\xfd\x8c\x7e\x45\xbf\xa3\x3f\xd1\xdf\xe8\x5f\x14\x17\xc5\x47\x09\x51\x22\x48\x02\x92\x82\x64\x20\x39\x48\x01\x52\x82\x54\x20\x35\x48\x03\xd2\x82\x74\x20\x3d\xc8\x00\x32\x82\x4c\x20\x33\xc8\x02\xb2\x82\x6c\x20\x3b\xc8\x01\x72\x82\x5c\x20\x37\xc8\x03\xf2\x82\x7c\x20\x3f\x28\x00\x0a\x82\x42\xa0\x30\x28\x02\x8a\x82\x62\xa0\x38\x28\x01\x4a\x82\x52\xa0\x34\x28\x03\xca\x82\x72\xa0\x3c\xa8\x00\x2a\x82\x4a\xa0\x32\xa8\x02\xaa\x82\x6a\xa0\x3a\xa8\x01\x6a\x82\x5a\xa0\x36\xa8\x03\xea\x82\x7a\xa0\x3e\x68\x00\x1a\x82\x46\xa0\x31\x68\x02\x9a\x82\x66\xa0\x39\x68\x01\x5a\x82\x56\xa0\x35\x68\x03\xda\x82\x76\xa0\x3d\xe8\x00\x3a\x82\x4e\xa0\x33\xe8\x02\xba\x82\x6e\xa0\x3b\xe8\x01\x7a\x82\x5e\xa0\x37\xe8\x03\xfa\x82\x7e\xa0\x3f\x18\x00\x06\x82\x41\x60\x30\x18\x02\x86\x82\x61\x60\x38\x18\x01\x46\x82\x51\x60\x34\x18\x03\xc6\x82\x71\x60\x3c\x98\x00\x26\x82\x49\x60\x32\x98\x02\xa6\x82\x69\x60\x3a\x98\x01\x66\x82\x59\x60\x36\x98\x03\xe6\x82\x79\x60\x3e\x58\x00\x16\x82\x45\x60\x31\x58\x02\x96\x82\x65\x60\x39\x58\x01\x56\x82\x55\x60\x35\x58\x03\xd6\x82\x75\x60\x3d\xd8\x00\x36\x82\x4d\x60\x33\xd8\x02\xb6\x82\x6d\x60\x3b\xd8\x01\x76\x82\x5d\x60\x37\xd8\x03\xf6\x82\x7d\x00\x03\x38\x20\x00\x09\x28\x40\x03\x06\xb0\x80\x03\x3c\x10\x80\x08\x24\x20\x03\x05\xa8\x40\x03\x3a\x30\x80\x09\x2c\x60\x03\x07\xb8\xc0\x03\x3e\x08\x40\x08\x22\x00\x00\x04\x08\xc4\xc0\x7e\x70\x00\x1c\x04\x87\xc0\x61\x70\x04\x1c\x05\xc7\xc0\x71\x70\x02\x9c\x04\xa7\xc0\x69\x70\x06\x9c\x05\xe7\xc0\x79\x70\x01\x5c\x04\x97\xc0\x65\x70\x05\x5c\x05\xd7\xc0\x75\x70\x03\xdc\x04\xb7\xc0\x6d\x70\x07\xdc\x05\xf7\xc0\x7d\xf0\x00\x3c\x04\x8f\xc0\x63\xf0\x04\x3c\x05\xcf\xc0\x73\xf0\x02\xbc\x04\xaf\xc0\x6b\xf0\x06\xbc\x05\xef\xc0\x7b\xf0\x01\x7c\x04\x9f\xc0\x67\xf0\x05\x7c\x05\xdf\xc0\x77\xf0\x03\xfc\x04\xbf\xc0\x6f\xf0\x07\xfc\x05\xff\x40\x1c\x88\x07\x09\x20\x11\x26\x81\x49\x61\x32\x98\x1c\xa6\x80\x29\x61\x2a\x98\x1a\xa6\x81\x69\x61\x3a\x98\x1e\x66\x80\x19\x61\x26\x98\x19\x66\x81\x59\x61\x36\x98\x1d\xe6\x80\x39\x61\x2e\x98\x1b\xe6\x81\x79\x61\x3e\x98\x1f\x16\x80\x05\x61\x21\x58\x18\x16\x81\x45\x61\x31\x58\x1c\x96\x80\x25\x61\x29\x58\x1a\x96\x81\x65\x61\x39\x58\x1e\x56\x80\x15\x61\x25\x58\x19\x56\x81\x55\x61\x35\x58\x1d\xd6\x80\x35\x61\x2d\x58\x1b\xd6\x81\x75\x61\x3d\x58\x1f\x36\x80\x0d\x61\x23\xd8\x18\x36\x81\x4d\x61\x33\xd8\x1c\xb6\x80\x2d\x61\x2b\xd8\x1a\xb6\x81\x6d\x61\x3b\xd8\x1e\x76\x80\x1d\x61\x27\xd8\x19\x76\x81\x5d\x61\x37\xd8\x1d\xf6\x80\x3d\x61\x2f\xd8\x1b\xf6\x81\x7d\x61\x3f\xd8\x1f\x0e\x80\x03\xe1\x20\x38\x18\x0e\x81\x43\xe1\x30\x38\x1c\x8e\x80\x23\xe1\x28\x38\x1a\x8e\x81\x63\xe1\x38\x38\x1e\x4e\x80\x13\xe1\x24\x38\x19\x4e\x81\x53\xe1\x34\x38\x1d\xce\x80\x33\xe1\x2c\x38\x1b\xce\x81\x73\xe1\x3c\x38\x1f\x2e\x80\x0b\xe1\x22\xb8\x18\x2e\x81\x4b\xe1\x32\xb8\x1c\xae\x80\x2b\xe1\x2a\xb8\x1a\xae\x81\x6b\xe1\x3a\xb8\x1e\x6e\x80\x1b\xe1\x26\xb8\x19\x6e\x81\x5b\xe1\x36\xb8\x1d\xee\x80\x3b\xe1\x2e\xb8\x1b\xee\x81\x7b\xe1\x3e\x88\x41\x1c\x12\x90\x84\x14\xa4\x21\x03\x59\xc8\x41\x1e\x0a\x50\x84\x12\x94\xa1\x02\x55\xa8\x41\x1d\x1a\xd0\x84\x16\xb4\xa1\x03\x5d\xe8\x41\x1f\x06\x30\x84\x11\x04\x10\x42\x04\x63\x70\x3f\x3c\x00\x0f\xc2\x43\xf0\x30\x3c\x02\x8f\xc2\x63\xf0\x38\x3c\x01\x4f\xc2\x53\xf0\x34\x3c\x03\xcf\xc2\x73\xf0\x3c\xbc\x00\x2f\xc2\x4b\xf0\x32\xbc\x02\xaf\xc2\x6b\xf0\x3a\xbc\x01\x6f\xc2\x5b\xf0\x36\xbc\x03\xef\xc2\x7b\xf0\x3e\x7c\x00\x1f\xc2\x47\xf0\x31\x7c\x02\x9f\xc2\x67\xf0\x39\x7c\x01\x5f\xc2\x57\xf0\x35\x7c\x03\xdf\xc2\x77\xf0\x3d\xfc\x00\x3f\xc2\x4f\xf0\x33\xfc\x02\xbf\xc2\x6f\xf0\x3b\xfc\x01\x7f\xc2\x5f\xf0\x37\xfc\x03\xff\xc2\x7f\x30\x0e\xc6\xc3\x04\x98\x88\x92\xa0\xa4\x28\x19\x4a\x8e\x52\xa0\x94\x28\x15\x4a\x8d\xd2\xa0\xb4\x28\x1d\x4a\x8f\x32\xa0\x8c\x28\x13\xca\x8c\xb2\xa0\xac\x28\x1b\xca\x8e\x72\xa0\x9c\x28\x17\xca\x8d\xf2\xa0\xbc\x28\x1f\xca\x8f\x0a\xa0\x82\xa8\x10\x2a\x8c\x8a\xa0\xa2\xa8\x18\x2a\x8e\x4a\xa0\x92\xa8\x14\x2a\x8d\xca\xa0\xb2\xa8\x1c\x2a\x8f\x2a\xa0\x8a\xa8\x12\xaa\x8c\xaa\xa0\xaa\xa8\x1a\xaa\x8e\x6a\xa0\x9a\xa8\x16\xaa\x8d\xea\xa0\xba\xa8\x1e\xaa\x8f\x1a\xa0\x86\xa8\x11\x6a\x8c\x9a\xa0\xa6\xa8\x19\x6a\x8e\x5a\xa0\x96\xa8\x15\x6a\x8d\xda\xa0\xb6\xa8\x1d\x6a\x8f\x3a\xa0\x8e\xa8\x13\xea\x8c\xba\xa0\xae\xa8\x1b\xea\x8e\x7a\xa0\x9e\xa8\x17\xea\x8d\xfa\xa0\xbe\xa8\x1f\xea\x8f\x06\xa0\x81\x68\x10\x1a\x8c\x86\xa0\xa1\x68\x18\x1a\x8e\x46\xa0\x91\x68\x14\x1a\x8d\xc6\xa0\xb1\x68\x1c\x1a\x8f\x26\xa0\x89\x68\x12\x9a\x8c\xa6\xa0\xa9\x68\x1a\x9a\x8e\x66\xa0\x99\x68\x16\x9a\x8d\xe6\xa0\xb9\x68\x1e\x9a\x8f\x16\xa0\x85\x68\x11\x5a\x8c\x96\xa0\xa5\x68\x19\x5a\x8e\x56\xa0\x95\x68\x15\x5a\x8d\xd6\xa0\xb5\x68\x1d\x5a\x8f\x36\xa0\x8d\x68\x13\xda\x8c\xb6\xa0\xad\x68\x1b\xda\x8e\x76\xa0\x9d\x68\x17\xda\x8d\xf6\xa0\xbd\x68\x1f\xc2\x10\x8e\x08\x44\x22\x0a\xd1\x88\x41\x2c\xe2\x10\x8f\x04\x24\x22\x09\xc9\x48\x41\x2a\xd2\x90\x8e\x0c\x64\x22\x0b\xd9\xc8\x41\x2e\xf2\x90\x8f\x02\x14\xa2\x08\x01\x04\x11\x42\x31\xb4\x1f\x1d\x40\x07\xd1\x21\x74\x18\x1d\x41\x47\xd1\x31\x74\x1c\x9d\x40\x27\xd1\x29\x74\x1a\x9d\x41\x67\xd1\x39\x74\x1e\x5d\x40\x17\xd1\x25\x74\x19\x5d\x41\x57\xd1\x35\x74\x1d\xdd\x40\x37\xd1\x2d\x74\x1b\xdd\x41\x77\xd1\x3d\x74\x1f\x3d\x40\x0f\xd1\x23\xf4\x18\x3d\x41\x4f\xd1\x33\xf4\x1c\xbd\x40\x2f\xd1\x2b\xf4\x1a\xbd\x41\x6f\xd1\x3b\xf4\x1e\x7d\x40\x1f\xd1\x27\xf4\x19\x7d\x41\x5f\xd1\x37\xf4\x1d\xfd\x40\x3f\xd1\x2f\xf4\x1b\xfd\x41\x7f\xd1\x3f\x14\x87\xe2\x51\x02\x4a\x8c\x25\x89\x25\x8d\x25\x8b\x25\x8f\xa5\x88\xa5\x8c\xa5\x8a\xa5\x8e\xa5\x89\xa5\x8d\xa5\x8b\xa5\x8f\x65\x88\x65\x8c\x65\x8a\x65\x8e\x65\x89\x65\x8d\x65\x8b\x65\x8f\xe5\x88\xe5\x8c\xe5\x8a\xe5\x8e\xe5\x89\xe5\x8d\xe5\x8b\xe5\x8f\x15\x88\x15\x8c\x15\x8a\x15\x8e\x15\x89\x15\x8d\x15\x8b\x15\x8f\x95\x88\x95\x8c\x95\x8a\x95\x8e\x95\x89\x95\x8d\x95\x8b\x95\x8f\x55\x88\x55\x8c\x55\x8a\x55\x8e\x55\x89\x55\x8d\x55\x8b\x55\x8f\xd5\x88\xd5\x8c\xd5\x8a\xd5\x8e\xd5\x89\xd5\x8d\xd5\x8b\xd5\x8f\x35\x88\x35\x8c\x35\x8a\x35\x8e\x35\x89\x35\x8d\x35\x8b\x35\x8f\xb5\x88\xb5\x8c\xb5\x8a\xb5\x8e\xb5\x89\xb5\x8d\xb5\x8b\xb5\x8f\x75\x88\x75\x8c\x75\x8a\x75\x8e\x75\x89\x75\xfd\xcf\xd6\x5d\xc7\x39\x6e\xdc\xff\x1f\x57\xbf\x4d\x8e\x21\x97\x32\x33\xd3\x4a\xa3\x8f\x34\x2a\xcf\x8c\x3d\x49\xda\x34\x49\x03\x4d\x93\xa2\x6f\xd7\x77\xb7\xcd\xde\x7a\xb3\x90\x4b\x52\x66\x66\x66\x66\x66\xb0\xc8\x65\x66\x66\x66\x66\xee\xef\x71\xeb\x97\x77\xc7\x97\x5f\xff\xe8\x58\x06\xbd\x67\x24\x59\x4f\xed\xf9\xa3\xc9\xf0\xcc\xe1\x59\xc3\xb3\x87\xe7\x0c\xef\x31\x3c\x77\x78\xcf\xe1\x79\xc3\xf3\x87\xf7\x1a\xde\x7b\x78\x9f\xe1\x7d\x87\xf7\x1b\xde\x7f\xd8\x1b\xee\x1f\xce\x0e\xe7\x86\xfd\xe1\x81\xe1\xc1\xe1\xa1\xe1\xfc\xf0\x01\xc3\x0b\x86\x0b\xc3\xc3\xc3\xc5\xe1\x60\xb8\x34\xbc\x70\xb8\x3c\x5c\x19\xae\x0e\xd7\x86\x17\x0d\x8f\x0c\x2f\x1e\x5e\x32\xbc\x74\xf8\xc0\xe1\x83\x86\x0f\x1e\x3e\x64\xf8\xd0\xe1\xc3\x86\x0f\x1f\x3e\x62\xf8\xc8\xe1\xa3\x86\x8f\x1e\x3e\x66\xf8\xd8\xe1\xe3\x86\x8f\x1f\x3e\x61\xf8\xc4\xe1\x93\x86\x4f\x1e\x3e\x65\xf8\xd4\xe1\xd3\x86\x4f\x1f\x3e\x63\xf8\xcc\xe1\xb3\x86\xcf\x1e\x3e\x67\xf8\xdc\xe1\xf3\x86\xcf\x1f\xbe\x60\xf8\xc2\xe1\x8b\x86\x2f\x1e\xbe\x64\xf8\xd2\xe1\xcb\x86\x2f\x1f\xbe\x62\xf8\xca\xe1\xab\x86\xaf\x1e\xbe\x66\xf8\xda\xe1\xeb\x86\xaf\x1f\xbe\x61\xf8\xc6\xe1\x9b\x86\x6f\x1e\xbe\x65\xf8\xd6\xe1\xdb\x86\x6f\x1f\xbe\x63\xf8\xce\xe1\xbb\x86\xef\x1e\xbe\x67\xf8\xde\xe1\xfb\x86\xef\x1f\x7e\x60\x38\x1c\x96\xc3\x6a\x58\x0f\x9b\x61\x3b\x1c\x0d\x3f\x38\xfc\xd0\xf0\xc3\xc3\x8f\x0c\x3f\x3a\xfc\xd8\xf0\xe3\xc3\x4f\x0c\x3f\x39\xfc\xd4\xf0\xd3\xc3\xcf\x0c\x3f\x3b\xfc\xdc\xf0\xf3\xc3\x2f\x0c\xbf\x38\xfc\xd2\xf0\xcb\xc3\xaf\x0c\xbf\x3a\xfc\xda\xf0\xeb\xc3\x6f\x0c\xbf\x39\xfc\xd6\xf0\xdb\xc3\xef\x0c\xbf\x3b\xfc\xde\xf0\xfb\xc3\x1f\x0c\x7f\x38\xfc\xd1\xf0\xc7\xc3\x9f\x0c\x7f\x3a\xfc\xd9\xf0\xe7\xc3\x5f\x0c\x7f\x39\xfc\xd5\xf0\xd7\xc3\xdf\x0c\x7f\x3b\xfc\xdd\xf0\xf7\xc3\x3f\x0c\xff\x38\xfc\xd3\xf0\xcf\xc3\xbf\x0c\xff\x3a\xfc\xdb\xf0\xef\xc3\x7f\x0c\xff\x39\xfc\xd7\xf0\xdf\xc3\xff\x0c\xff\x3b\xfc\x5f\x19\x95\x97\x2b\xff\xaf\xbc\x7c\x79\x5c\x79\x7c\xb9\xa5\xdc\x5a\x6e\x2b\xb7\x97\x3b\xca\x9d\xe5\xae\x72\x77\xb9\xa7\xdc\x5b\x9e\x50\xee\x2b\x4f\x2c\xaf\x50\x5e\xb1\xbc\x52\x79\xe5\xf2\x2a\xe5\x55\xcb\xab\x95\x57\x2f\xaf\x51\x5e\xb3\xbc\x56\x79\xed\xf2\x3a\xe5\x75\xcb\xeb\x95\xd7\x2f\x6f\x50\xde\xb0\xbc\x51\x79\xe3\xf2\x26\xe5\x4d\xcb\x9b\x95\x37\x2f\x6f\x51\xde\xb2\xbc\x55\x79\xeb\xf2\x36\xe5\x4c\x19\x97\x49\xa9\xca\xb4\x94\x32\x2b\xf3\x52\x97\x45\x79\xdb\xf2\x76\xe5\xed\xcb\x3b\x94\x77\x2c\xef\x54\xde\xb9\x34\xa5\x2d\x5d\xd9\x29\xbb\xa5\x2f\x4f\x2a\x4f\x2e\x4f\x29\xef\x52\xde\xb5\x3c\xb5\xbc\x5b\x79\x5a\x79\x7a\x79\x46\x79\xf7\xf2\xcc\xf2\xac\xf2\xec\xf2\x9c\xf2\x1e\xe5\xb9\xe5\x3d\xcb\xf3\xca\xf3\xcb\x7b\x95\xf7\x2e\xef\x53\xde\xb7\xbc\x5f\x79\xff\xb2\x57\xee\x2f\x67\xcb\xb9\xb2\x5f\x1e\x28\x0f\x96\x87\xca\xf9\xf2\x01\xe5\x05\xe5\x42\x79\xb8\x5c\x2c\x07\xe5\x52\x79\x61\xb9\x5c\xae\x94\xab\xe5\x5a\x79\x51\x79\xa4\xbc\xb8\xbc\xa4\xbc\xb4\x7c\x60\xf9\xa0\xf2\xc1\xe5\x43\xca\x87\x96\x0f\x2b\x1f\x5e\x3e\xa2\x7c\x64\xf9\xa8\xf2\xd1\xe5\x63\xca\xc7\x96\x8f\x2b\x1f\x5f\x3e\xa1\x7c\x62\xf9\xa4\xf2\xc9\xe5\x53\xca\xa7\x96\x4f\x2b\x9f\x5e\x3e\xa3\x7c\x66\xf9\xac\xf2\xd9\xe5\x73\xca\xe7\x96\xcf\x2b\x9f\x5f\xbe\xa0\x7c\x61\xf9\xa2\xf2\xc5\xe5\x4b\xca\x97\x96\x2f\x2b\x5f\x5e\xbe\xa2\x7c\x65\xf9\xaa\xf2\xd5\xe5\x6b\xca\xd7\x96\xaf\x2b\x5f\x5f\xbe\xa1\x7c\x63\xf9\xa6\xf2\xcd\xe5\x5b\xca\xb7\x96\x6f\x2b\xdf\x5e\xbe\xa3\x7c\x67\xf9\xae\xf2\xdd\xe5\x7b\xca\xf7\x96\xef\x2b\xdf\x5f\x7e\xa0\x1c\x96\x65\x59\x95\x75\xd9\x94\x6d\x39\x2a\x3f\x58\x7e\xa8\xfc\x70\xf9\x91\xf2\xa3\xe5\xc7\xca\x8f\x97\x9f\x28\x3f\x59\x7e\xaa\xfc\x74\xf9\x99\xf2\xb3\xe5\xe7\xca\xcf\x97\x5f\x28\xbf\x58\x7e\xa9\xfc\x72\xf9\x95\xf2\xab\xe5\xd7\xca\xaf\x97\xdf\x28\xbf\x59\x7e\xab\xfc\x76\xf9\x9d\xf2\xbb\xe5\xf7\xca\xef\x97\x3f\x28\x7f\x58\xfe\xa8\xfc\x71\xf9\x93\xf2\xa7\xe5\xcf\xca\x9f\x97\xbf\x28\x7f\x59\xfe\xaa\xfc\x75\xf9\x9b\xf2\xb7\xe5\xef\xca\xdf\x97\x7f\x28\xff\x58\xfe\xa9\xfc\x73\xf9\x97\xf2\xaf\xe5\xdf\xca\xbf\x97\xff\x28\xff\x59\xfe\xab\xfc\x77\xf9\x9f\xf2\xbf\xe5\xff\xaa\xa8\xba\x5c\xf5\x7f\xd5\xe5\xab\xe3\xaa\xe3\xab\x2d\xd5\xd6\x6a\x5b\xb5\xbd\xda\x51\xed\xac\x76\x55\xbb\xab\x3d\xd5\xde\xea\x84\x6a\x5f\x75\x62\x75\x85\xea\x8a\xd5\x95\xaa\x2b\x57\x57\xa9\xae\x5a\x5d\xad\xba\x7a\x75\x8d\xea\x9a\xd5\xb5\xaa\x6b\x57\xd7\xa9\xae\x5b\x5d\xaf\xba\x7e\x75\x83\xea\x86\xd5\x8d\xaa\x1b\x57\x37\xa9\x6e\x5a\xdd\xac\xba\x79\x75\x8b\xea\x96\xd5\xad\xaa\x5b\x57\xb7\xa9\x66\xaa\xb8\x4a\x2a\x55\xa5\x95\x54\x59\x95\x57\xba\x2a\xaa\xdb\x56\xb7\xab\x6e\x5f\xdd\xa1\xba\x63\x75\xa7\xea\xce\x95\xa9\x6c\xe5\xaa\x4e\xd5\xad\x7c\x75\x52\x75\x72\x75\x4a\x75\x97\xea\xae\xd5\xa9\xd5\xdd\xaa\xd3\xaa\xd3\xab\x33\xaa\xbb\x57\x67\x56\x67\x55\x67\x57\xe7\x54\xf7\xa8\xce\xad\xee\x59\x9d\x57\x9d\x5f\xdd\xab\xba\x77\x75\x9f\xea\xbe\xd5\xfd\xaa\xfb\x57\xbd\x6a\x7f\x35\x5b\xcd\x55\xfd\xea\x40\x75\xb0\x3a\x54\xcd\x57\x0f\xa8\x2e\xa8\x16\xaa\xc3\xd5\x62\x35\xa8\x96\xaa\x0b\xab\xe5\x6a\xa5\x5a\xad\xd6\xaa\x8b\xaa\x23\xd5\xc5\xd5\x25\xd5\xa5\xd5\x03\xab\x07\x55\x0f\xae\x1e\x52\x3d\xb4\x7a\x58\xf5\xf0\xea\x11\xd5\x23\xab\x47\x55\x8f\xae\x1e\x53\x3d\xb6\x7a\x5c\xf5\xf8\xea\x09\xd5\x13\xab\x27\x55\x4f\xae\x9e\x52\x3d\xb5\x7a\x5a\xf5\xf4\xea\x19\xd5\x33\xab\x67\x55\xcf\xae\x9e\x53\x3d\xb7\x7a\x5e\xf5\xfc\xea\x05\xd5\x0b\xab\x17\x55\x2f\xae\x5e\x52\xbd\xb4\x7a\x59\xf5\xf2\xea\x15\xd5\x2b\xab\x57\x55\xaf\xae\x5e\x53\xbd\xb6\x7a\x5d\xf5\xfa\xea\x0d\xd5\x1b\xab\x37\x55\x6f\xae\xde\x52\xbd\xb5\x7a\x5b\xf5\xf6\xea\x1d\xd5\x3b\xab\x77\x55\xef\xae\xde\x53\xbd\xb7\x7a\x5f\xf5\xfe\xea\x03\xd5\xb0\x2a\xab\xaa\xaa\xab\xa6\x6a\xab\x51\xf5\xc1\xea\x43\xd5\x87\xab\x8f\x54\x1f\xad\x3e\x56\x7d\xbc\xfa\x44\xf5\xc9\xea\x53\xd5\xa7\xab\xcf\x54\x9f\xad\x3e\x57\x7d\xbe\xfa\x42\xf5\xc5\xea\x4b\xd5\x97\xab\xaf\x54\x5f\xad\xbe\x56\x7d\xbd\xfa\x46\xf5\xcd\xea\x5b\xd5\xb7\xab\xef\x54\xdf\xad\xbe\x57\x7d\xbf\xfa\x41\xf5\xc3\xea\x47\xd5\x8f\xab\x9f\x54\x3f\xad\x7e\x56\xfd\xbc\xfa\x45\xf5\xcb\xea\x57\xd5\xaf\xab\xdf\x54\xbf\xad\x7e\x57\xfd\xbe\xfa\x43\xf5\xc7\xea\x4f\xd5\x9f\xab\xbf\x54\x7f\xad\xfe\x56\xfd\xbd\xfa\x47\xf5\xcf\xea\x5f\xd5\xbf\xab\xff\x54\xff\xad\xfe\x57\x47\xf5\xe5\xea\xff\xab\x2f\x5f\x1f\x57\x1f\x5f\x6f\xa9\xb7\xd6\xdb\xea\xed\xf5\x8e\x7a\x67\xbd\xab\xde\x5d\xef\xa9\xf7\xd6\x27\xd4\xfb\xea\x13\xeb\x2b\xd4\x57\xac\xaf\x54\x5f\xb9\xbe\x4a\x7d\xd5\xfa\x6a\xf5\xd5\xeb\x6b\xd4\xd7\xac\xaf\x55\x5f\xbb\xbe\x4e\x7d\xdd\xfa\x7a\xf5\xf5\xeb\x1b\xd4\x37\xac\x6f\x54\xdf\xb8\xbe\x49\x7d\xd3\xfa\x66\xf5\xcd\xeb\x5b\xd4\xb7\xac\x6f\x55\xdf\xba\xbe\x4d\x3d\x53\xc7\x75\x52\xab\x3a\xad\xa5\xce\xea\xbc\xd6\x75\x51\xdf\xb6\xbe\x5d\x7d\xfb\xfa\x0e\xf5\x1d\xeb\x3b\xd5\x77\xae\x4d\x6d\x6b\x57\x77\xea\x6e\xed\xeb\x93\xea\x93\xeb\x53\xea\xbb\xd4\x77\xad\x4f\xad\xef\x56\x9f\x56\x9f\x5e\x9f\x51\xdf\xbd\x3e\xb3\x3e\xab\x3e\xbb\x3e\xa7\xbe\x47\x7d\x6e\x7d\xcf\xfa\xbc\xfa\xfc\xfa\x5e\xf5\xbd\xeb\xfb\xd4\xf7\xad\xef\x57\xdf\xbf\xee\xd5\xfb\xeb\xd9\x7a\xae\xee\xd7\x07\xea\x83\xf5\xa1\x7a\xbe\x7e\x40\x7d\x41\xbd\x50\x1f\xae\x17\xeb\x41\xbd\x54\x5f\x58\x2f\xd7\x2b\xf5\x6a\xbd\x56\x5f\x54\x1f\xa9\x2f\xae\x2f\xa9\x2f\xad\x1f\x58\x3f\xa8\x7e\x70\xfd\x90\xfa\xa1\xf5\xc3\xea\x87\xd7\x8f\xa8\x1f\x59\x3f\xaa\x7e\x74\xfd\x98\xfa\xb1\xf5\xe3\xea\xc7\xd7\x4f\xa8\x9f\x58\x3f\xa9\x7e\x72\xfd\x94\xfa\xa9\xf5\xd3\xea\xa7\xd7\xcf\xa8\x9f\x59\x3f\xab\x7e\x76\xfd\x9c\xfa\xb9\xf5\xf3\xea\xe7\xd7\x2f\xa8\x5f\x58\xbf\xa8\x7e\x71\xfd\x92\xfa\xa5\xf5\xcb\xea\x97\xd7\xaf\xa8\x5f\x59\xbf\xaa\x7e\x75\xfd\x9a\xfa\xb5\xf5\xeb\xea\xd7\xd7\x6f\xa8\xdf\x58\xbf\xa9\x7e\x73\xfd\x96\xfa\xad\xf5\xdb\xea\xb7\xd7\xef\xa8\xdf\x59\xbf\xab\x7e\x77\xfd\x9e\xfa\xbd\xf5\xfb\xea\xf7\xd7\x1f\xa8\x87\x75\x59\x57\x75\x5d\x37\x75\x5b\x8f\xea\x0f\xd6\x1f\xaa\x3f\x5c\x7f\xa4\xfe\x68\xfd\xb1\xfa\xe3\xf5\x27\xea\x4f\xd6\x9f\xaa\x3f\x5d\x7f\xa6\xfe\x6c\xfd\xb9\xfa\xf3\xf5\x17\xea\x2f\xd6\x5f\xaa\xbf\x5c\x7f\xa5\xfe\x6a\xfd\xb5\xfa\xeb\xf5\x37\xea\x6f\xd6\xdf\xaa\xbf\x5d\x7f\xa7\xfe\x6e\xfd\xbd\xfa\xfb\xf5\x0f\xea\x1f\xd6\x3f\xaa\x7f\x5c\xff\xa4\xfe\x69\xfd\xb3\xfa\xe7\xf5\x2f\xea\x5f\xd6\xbf\xaa\x7f\x5d\xff\xa6\xfe\x6d\xfd\xbb\xfa\xf7\xf5\x1f\xea\x3f\xd6\x7f\xaa\xff\x5c\xff\x25\xba\x7c\x74\x5c\x74\x7c\xb4\x25\xda\x1a\x6d\x8b\xb6\x47\x3b\xa2\x9d\xd1\xae\x68\x77\xb4\x27\xda\x1b\x9d\x10\xed\x8b\x4e\x8c\xae\x10\x5d\x31\xba\x52\x74\xe5\xe8\x2a\xd1\x55\xa3\xab\x45\x57\x8f\xae\x11\x5d\x33\xba\x56\x74\xed\xe8\x3a\xd1\x75\xa3\xeb\x45\xd7\x8f\x6e\x10\xdd\x30\xba\x51\x74\xe3\xe8\x26\xd1\x4d\xa3\x9b\x45\x37\x8f\x6e\x11\xdd\x32\xba\x55\x74\xeb\xe8\x36\xd1\x4c\x14\x47\x49\xa4\xa2\x34\x92\x28\x8b\xf2\x48\x47\x45\x74\xdb\xe8\x76\xd1\xed\xa3\x3b\x44\x77\x8c\xee\x14\xdd\x39\x32\x91\x8d\x5c\xd4\x89\xba\x91\x8f\x4e\x8a\x4e\x8e\x4e\x89\xee\x12\xdd\x35\x3a\x35\xba\x5b\x74\x5a\x74\x7a\x74\x46\x74\xf7\xe8\xcc\xe8\xac\xe8\xec\xe8\x9c\xe8\x1e\xd1\xb9\xd1\x3d\xa3\xf3\xa2\xf3\xa3\x7b\x45\xf7\x8e\xee\x13\xdd\x37\xba\x5f\x74\xff\xa8\x57\xff\x35\x7a\x65\xf4\xa8\xe8\xd1\x51\x15\x3d\x27\xfa\x79\xf4\x98\xe8\x29\xd1\x13\xa3\x17\x47\xaf\x8f\x5e\x55\xff\x2d\x7a\x42\xf4\xcd\xe8\x91\xd1\x33\xeb\xbf\xd7\xff\x88\x9e\x5c\xff\x33\x7a\x5c\xf4\xa1\xe8\xbb\xf5\xbf\xa2\x97\x44\x6f\x88\xfe\x12\xfd\x39\xfa\x6b\xf4\x8a\xe8\xcd\xd1\x27\xa2\x8f\x45\x6f\x89\xf6\x47\xb3\xd1\xd3\xa2\xb9\xe8\x53\x51\x3f\xfa\x78\xf4\xc9\xe8\x73\xd1\xa7\xa3\xcf\x44\x9f\x8d\x7e\x11\x1d\x88\xbe\x14\x7d\x3e\xfa\x42\xf4\xd6\xe8\x60\xf4\xfb\xe8\xe9\xd1\x57\xa3\x2f\x47\x5f\x89\x0e\x45\xbf\x8a\x7e\x13\x3d\x3e\x7a\x40\x34\x1f\x5d\x10\x1d\x8e\x16\xa2\xc5\xe8\x65\xd1\x20\xba\x30\x5a\x8a\x96\xa3\x95\x68\x2d\x5a\x8d\x2e\x8a\x8e\x44\xbf\x8c\x2e\x8e\x2e\x8d\x2e\x89\x1e\x18\x3d\x38\x7a\x50\xf4\xbe\xe8\xe5\xd1\x43\xa3\x87\x44\x0f\x8b\x1e\x1e\xfd\x3a\xfa\x6d\xf4\x81\xfa\xdf\xf5\x7f\xea\xff\xd6\xff\x6b\xa2\xe6\x72\xd1\x7f\xa2\xff\x36\xff\xd7\x5c\xbe\x39\xae\x39\x3e\xfa\xdf\xe5\xa2\x66\x4b\xb3\xb5\xd9\x76\xb9\xcb\x35\xdb\x9b\x1d\xcd\xce\x66\x57\xb3\xbb\xd9\xd3\xec\x6d\x4e\x68\xf6\x35\x27\x36\x57\x68\xae\x18\xfd\x3d\xfa\x47\x73\xa5\xe6\xca\xcd\x55\x9a\xab\x36\x57\x6b\xae\xde\x5c\xa3\xb9\x66\x73\xad\xe6\xda\xcd\x75\x9a\xeb\x36\xd7\x6b\xae\xdf\xdc\xa0\xb9\x61\xf4\xcf\xe8\x6b\xcd\x8d\x9a\x1b\x37\x37\x69\x6e\xda\xdc\xac\xb9\x79\x73\x8b\xe6\x96\xcd\xad\x9a\x5b\x37\xb7\x69\x66\x9a\xb8\x49\x1a\x15\xfd\x30\xfa\x51\x93\x36\xd2\x64\x4d\xde\xe8\xa6\x68\x6e\xdb\xdc\xae\xb9\x7d\x73\x87\xe6\x8e\xcd\x9d\x9a\x3b\x37\xa6\xb1\xd1\xdb\xa2\xb7\x37\xae\xe9\x34\xdd\xc6\x37\x27\x35\x27\x37\xa7\x34\x77\x69\xee\xda\x9c\x1a\xfd\x2b\xfa\x77\xf4\xe3\xe8\x27\xcd\xdd\x9a\xd3\x9a\xd3\x9b\x33\x9a\xbb\x37\x67\x36\x67\x35\x67\x37\xe7\x34\xf7\x68\xce\x6d\xee\xd9\x9c\xd7\x9c\xdf\xdc\xab\xb9\x77\x73\x9f\xe6\xbe\xcd\xfd\x9a\xfb\x37\xbd\x66\x7f\x34\x6c\x66\x9b\xb9\xa6\xdf\x1c\x88\x7e\x1a\xfd\xac\x39\x18\xbd\xa6\x39\xd4\xcc\x37\x0f\x68\x2e\x68\x16\x9a\xc3\xcd\x62\x33\x68\x96\x9a\x0b\x9b\xe5\x66\xa5\x59\x6d\xd6\xa2\xaf\x47\x3f\x68\x2e\x8a\xbe\x15\x7d\x3b\xfa\x4e\xf4\xfd\xe8\x1b\xd1\xf7\x9a\x23\xcd\xc5\xcd\x25\xcd\xa5\xcd\x03\x9b\x07\x35\x0f\x6e\x1e\xd2\x3c\xb4\x79\x58\xf3\xf0\xe6\x11\xcd\x23\x9b\x47\x35\x8f\x6e\x1e\xd3\x3c\xb6\x79\x5c\xf3\xf8\xe6\x09\xcd\x13\xa3\xd7\x35\x4f\x6a\x9e\xdc\x3c\xa5\x79\x6a\xf3\xb4\xe6\xe9\xcd\x33\x9a\x67\x36\xcf\x6a\x9e\xdd\x3c\xa7\x79\x6e\xf3\xbc\xe6\xf9\xcd\x0b\x9a\x17\x36\x2f\x6a\x5e\xdc\xbc\x24\x7a\x69\xf3\xd2\xe6\x65\xcd\xcb\x9b\x57\x34\xaf\x6c\x5e\xd5\xbc\xba\x79\x4d\xf3\xda\xe6\x75\xcd\xeb\x9b\x37\x34\x6f\x6c\xde\xd4\xbc\xb9\x79\x4b\xf3\xd6\xe6\x6d\xd1\x73\x9b\xb7\x37\xef\x68\xde\x19\xbd\xb0\x79\x57\xf3\xee\xe6\x3d\xcd\x7b\x9b\xf7\x35\xef\x6f\x3e\xd0\x0c\x9b\xb2\xa9\x9a\xba\x69\x9a\xb6\x19\x35\x1f\x6c\x3e\xd4\x7c\xb8\xf9\x48\xf3\xd1\xe6\x63\xcd\xc7\x9b\x4f\x34\x9f\x6c\x3e\xd5\x7c\xba\xf9\x4c\xf3\xd9\xe6\x73\xcd\xe7\x9b\x2f\x34\x5f\x6c\xbe\xd4\x7c\xb9\xf9\x4a\xf3\xd5\xe6\x6b\xcd\xd7\x9b\x6f\x34\xdf\x6c\xbe\xd5\x7c\xbb\xf9\x4e\xf3\xdd\xe6\x7b\xcd\xf7\x9b\x1f\x34\x3f\x6c\x7e\xd4\xfc\xb8\xf9\x49\xf3\xd3\xe6\x67\xcd\xcf\x9b\x5f\x34\xbf\x6c\x7e\xd5\xfc\xba\xf9\x4d\xf3\xdb\xe6\x77\xcd\xef\x9b\x3f\x34\x7f\x6c\xfe\xd4\xfc\xb9\xf9\x4b\xf3\xd7\xe6\x6f\xcd\xdf\x9b\x7f\x34\xff\x6c\xfe\xd5\xfc\xbb\xf9\x4f\xf3\xdf\xe6\x7f\x6d\xd4\x5e\xae\xfd\xbf\xf6\xf2\xed\x71\xed\xf1\xed\x96\x76\x6b\xbb\xad\xdd\xde\xee\x68\x77\xb6\xbb\xda\xdd\xed\x9e\x76\x6f\x7b\x42\xbb\xaf\x3d\xb1\xbd\x42\x7b\xc5\xf6\x4a\xed\x95\xdb\xab\xb4\x57\x6d\xaf\xd6\x5e\xbd\xbd\x46\x7b\xcd\xf6\x5a\xed\xb5\xdb\xeb\xb4\xd7\x6d\xaf\xd7\x5e\xbf\xbd\x41\x7b\xc3\xf6\x46\xed\x8d\xdb\x9b\xb4\x37\x6d\x6f\xd6\xde\xbc\xbd\x45\x7b\xcb\xf6\x56\xed\xad\xdb\xdb\xb4\x33\x6d\xdc\x26\xad\x6a\xd3\x56\xda\xac\xcd\x5b\xdd\x16\xed\x6d\xdb\xdb\xb5\xb7\x6f\xef\xd0\xde\xb1\xbd\x53\x7b\xe7\xd6\xb4\xb6\x75\x6d\xa7\xed\xb6\xbe\x3d\xa9\x3d\xb9\x3d\xa5\xbd\x4b\x7b\xd7\xf6\xd4\xf6\x6e\xed\x69\xed\xe9\xed\x19\xed\xdd\xdb\x33\xdb\xb3\xda\xb3\xdb\x73\xda\x7b\xb4\xe7\xb6\xf7\x6c\xcf\x6b\xcf\x6f\xef\xd5\xde\xbb\xbd\x4f\x7b\xdf\xf6\x7e\xed\xfd\xdb\x5e\xbb\xbf\x9d\x6d\xe7\xda\x7e\x7b\xa0\x3d\xd8\x1e\x6a\xe7\xdb\x07\xb4\x17\xb4\x0b\xed\xe1\x76\xb1\x1d\xb4\x4b\xed\x85\xed\x72\xbb\xd2\xae\xb6\x6b\xed\x45\xed\x91\xf6\xe2\xf6\x92\xf6\xd2\xf6\x81\xed\x83\xda\x07\xb7\x0f\x69\x1f\xda\x3e\xac\x7d\x78\xfb\x88\xf6\x91\xed\xa3\xda\x47\xb7\x8f\x69\x1f\xdb\x3e\xae\x7d\x7c\xfb\x84\xf6\x89\xed\x93\xda\x27\xb7\x4f\x69\x9f\xda\x3e\xad\x7d\x7a\xfb\x8c\xf6\x99\xed\xb3\xda\x67\xb7\xcf\x69\x9f\xdb\x3e\xaf\x7d\x7e\xfb\x82\xf6\x85\xed\x8b\xda\x17\xb7\x2f\x69\x5f\xda\xbe\xac\x7d\x79\xfb\x8a\xf6\x95\xed\xab\xda\x57\xb7\xaf\x69\x5f\xdb\xbe\xae\x7d\x7d\xfb\x86\xf6\x8d\xed\x9b\xda\x37\xb7\x6f\x69\xdf\xda\xbe\xad\x7d\x7b\xfb\x8e\xf6\x9d\xed\xbb\xda\x77\xb7\xef\x69\xdf\xdb\xbe\xaf\x7d\x7f\xfb\x81\x76\xd8\x96\x6d\xd5\xd6\x6d\xd3\xb6\xed\xa8\xfd\x60\xfb\xa1\xf6\xc3\xed\x47\xda\x8f\xb6\x1f\x6b\x3f\xde\x7e\xa2\xfd\x64\xfb\xa9\xf6\xd3\xed\x67\xda\xcf\xb6\x9f\x6b\x3f\xdf\x7e\xa1\xfd\x62\xfb\xa5\xf6\xcb\xed\x57\xda\xaf\xb6\x5f\x6b\xbf\xde\x7e\xa3\xfd\x66\xfb\xad\xf6\xdb\xed\x77\xda\xef\xb6\xdf\x6b\xbf\xdf\xfe\xa0\xfd\x61\xfb\xa3\xf6\xc7\xed\x4f\xda\x9f\xb6\x3f\x6b\x7f\xde\xfe\xa2\xfd\x65\xfb\xab\xf6\xd7\xed\x6f\xda\xdf\xb6\xbf\x6b\x7f\xdf\xfe\xa1\xfd\x63\xfb\xa7\xf6\xcf\xed\x5f\xda\xbf\xb6\x7f\x6b\xff\xde\xfe\xa3\xfd\x67\xfb\xaf\xf6\xdf\xed\x7f\xda\xff\xb6\xff\x1b\x45\xa3\xcb\x8d\xfe\x6f\x74\xf9\xd1\x71\xa3\xe3\x47\x5b\x46\x5b\x47\xdb\x46\xdb\x47\x3b\x46\x3b\x47\xbb\x46\xbb\x47\x7b\x46\x7b\x47\x27\x8c\xf6\x8d\x4e\x1c\x5d\x61\x74\xc5\xd1\x95\x46\x57\x1e\x5d\x65\x74\xd5\xd1\xd5\x46\x57\x1f\x5d\x63\x74\xcd\xd1\xb5\x46\xd7\x1e\x5d\x67\x74\xdd\xd1\xf5\x46\xd7\x1f\xdd\x60\x74\xc3\xd1\x8d\x46\x37\x1e\xdd\x64\x74\xd3\xd1\xcd\x46\x37\x1f\xdd\x62\x74\xcb\xd1\xad\x46\xb7\x1e\xdd\x66\x34\x33\x8a\x47\xc9\x48\x8d\xd2\x91\x8c\xb2\x51\x3e\xd2\xa3\x62\x74\xdb\xd1\xed\x46\xb7\x1f\xdd\x61\x74\xc7\xd1\x9d\x46\x77\x1e\x99\x91\x1d\xb9\x51\x67\xd4\x1d\xf9\xd1\x49\xa3\x93\xa3\x77\x44\xef\x1c\x9d\x32\xba\x4b\xf4\x9e\xe8\xbd\xd1\x87\x47\x77\x8d\xde\x15\xbd\x3b\xfa\x48\xf4\x88\xe8\x83\xd1\x63\xa3\x37\x46\x1f\x1d\x9d\x3a\xba\x5b\x54\x47\xcd\xe8\xb4\xa8\x1c\x9d\x1e\xfd\x6d\x74\xc6\xe8\xee\xa3\x33\x47\x67\x8d\xce\x1e\x9d\x33\xba\x47\xf4\xa4\xd1\xb9\xa3\x7b\x8e\xce\x1b\x9d\x3f\xba\xd7\xe8\xde\xd1\xf3\x46\xf7\x89\x5e\x10\x3d\x3f\xfa\x5d\xf4\xea\xe8\x19\xd1\x8b\xa2\xd7\x46\x4f\x8d\x9e\x15\x3d\x3b\x7a\xff\xe8\xbe\xa3\xfb\x8d\xee\x3f\xea\x8d\xf6\x8f\x66\x47\x73\xa3\xfe\xe8\xc0\xe8\xe0\xe8\xd0\x68\x7e\xf4\x80\xd1\x05\xa3\x85\xd1\xe1\xd1\xe2\x68\x30\x5a\x1a\x5d\x38\x5a\x1e\xad\x8c\x56\x47\x6b\xa3\x8b\x46\x47\x46\x17\x8f\x2e\x19\x5d\x3a\x7a\xe0\xe8\x41\xa3\x07\x8f\x1e\x32\x7a\xe8\xd6\xb5\xc5\xf9\x99\x99\x99\x99\x9d\xfd\x8b\x67\x17\x7a\x87\x6f\x7d\x78\xb0\x38\xd8\x7d\xe1\xda\x60\xb5\x3f\xb7\x7f\x61\x7d\x69\xef\xe2\xda\xe1\xfd\xfd\xe5\x95\xf9\x83\x8b\xeb\xcb\x3b\xe7\x06\x0b\x0b\xbd\xe5\xf5\xc7\xbb\x96\xfa\xcb\xb3\xfd\xc5\xd5\xf5\x85\x3d\xbd\xc3\x4b\xfd\xe5\x95\xde\xe2\xdc\xfa\xe2\x09\xeb\x6b\x59\x99\x5f\x3c\xb8\xd0\x1f\xbf\xbe\xd4\x5b\xee\x2f\x2e\xf4\x0f\x8c\xdf\xbe\x77\x7d\x71\x79\xfe\xe0\xa1\xf1\xf2\xee\xde\xca\x6a\x7f\x79\x7e\xe5\x82\xf5\xa5\xed\x4b\x0b\x6b\x2b\xeb\x8f\x76\xcc\x0e\x0e\x1f\xee\x8d\xa3\x0f\x5d\xb2\x74\xa8\x4f\x37\x96\xfa\xcb\xf3\x83\x71\xd4\x8e\x95\x85\xde\xca\xa1\xf1\xe7\x2e\xed\x2f\x0f\xd6\x1f\x6d\x1b\x2c\x8e\x73\xb7\xad\x1e\x19\x3f\xb3\x63\xf5\xd0\x72\x7f\xfc\xdc\xf6\x03\x83\xb5\x65\x1e\xcd\x5f\xc4\xfb\x56\xe6\x2f\x66\x75\xfd\x8b\x48\xd9\xd1\xdf\xe8\xdf\xf6\xc5\x79\x56\xb8\x63\x76\xb0\x30\x18\xbf\xbe\x67\xa5\x7f\x78\x7e\x73\x71\xfb\x42\x7f\x85\x5e\xf7\x2f\x5c\xeb\x8d\x37\xe0\xae\x83\xcb\xfd\xde\x6a\x7f\x79\xb2\x6d\xfb\x2b\xab\xf3\xbc\x7f\x6b\x6f\xbc\xee\x2d\x66\xdc\xd8\x71\xe3\xc6\x4d\x67\xdc\x74\xc7\x8d\x1f\x37\x27\x8d\x9b\x93\xc7\xcd\x29\xe3\xe6\x2e\xe3\xe6\xae\xe3\xe6\xd4\x71\x73\xb7\x71\x73\xda\xb8\x39\x7d\xdc\x9c\x31\x6e\xee\x3e\x6e\xce\x1c\x37\x67\x8d\x9b\xb3\xc7\xcd\x39\xe3\xe6\x1e\xe3\xe6\xdc\x71\x73\xcf\x71\x73\xde\xb8\x39\x7f\xbc\x87\xf7\x2f\xf7\x66\x2f\xe8\xaf\x6e\xec\xd2\x3d\xfb\x7b\xb3\x17\x6c\xee\x8b\x7d\xbc\xbe\xb9\x8f\x4f\xe8\xad\xcc\xce\xcf\xcf\xce\x2f\xcf\xae\x8d\x0f\xb5\xbd\x6b\x8b\x73\xfd\xe5\x95\xd9\xc1\x32\x9b\xf6\xe0\x72\x8f\xdd\xb1\x65\xbc\xcf\xb7\xec\x1f\x37\xb3\xe3\x66\xbc\xc3\xb7\xf0\x96\x03\xe3\xe6\xe0\xb8\x19\xa7\x6e\x99\x1f\x37\x0f\x18\x37\xe3\xc3\x69\xcb\x78\x57\x6c\x19\xa7\x6e\x19\x6f\xfd\x2d\xe3\xc3\x62\xcb\xd2\xb8\xb9\x70\xdc\x8c\xf7\xd3\x96\xf1\x6e\xdc\xc2\xfe\x59\x1b\x37\x17\x8d\x9b\x23\xe3\x66\x7c\xb4\x6c\xb9\x64\xdc\x5c\xca\x26\x58\xee\xcd\xf6\x37\xb6\xc8\xb6\xfd\x7c\x53\xf6\xae\x3f\xbf\xb9\x25\xf6\xae\x6f\x89\xd5\xf9\x85\xb9\xf1\x50\xf6\x8e\xbf\x7f\x73\x83\x23\x1c\x49\x1b\x5f\xab\xdd\x47\xbf\x16\x0b\xf3\x8b\xe3\x41\xee\x9e\x5d\x5b\x5e\xee\x2f\xce\x8e\x43\xb7\x5d\xc2\x71\xba\x67\xff\xf2\xe0\x82\xfe\xe2\x24\x6d\xd7\x4a\x7f\x76\xe3\x20\xdb\x3d\x37\xdf\x5f\xee\xaf\xcc\x8f\x47\xb4\x67\x76\xb0\x74\x49\xb0\x47\x06\xcb\x73\x07\xfa\x87\xe7\x37\x0e\xee\x13\x0f\xae\xcd\x2f\x2c\xf4\x0f\x0f\x36\x77\xeb\xde\x85\xc1\xc1\xf9\xd9\xde\xc2\xe2\x60\xbc\xbc\x6b\xfd\x9c\x61\xc6\x87\xe7\xde\xe5\xfe\xc1\xf9\xa3\x5d\xec\x8f\x77\xcd\xf6\xc1\x45\xec\xd0\x9d\x73\xfd\x83\x93\xef\xdb\x9e\xa3\x5f\xe7\xc3\xf3\x8b\x7c\xa7\x4f\x58\x3d\x32\x58\x59\x5b\xff\x06\x8f\x3b\x7c\xe2\xfa\x57\x73\xea\xa9\x1d\xbd\xd9\xb5\xd5\xfe\x66\xa0\xb2\x6e\xe3\x34\xd2\x3b\xb8\xdc\x5b\x1a\xef\xee\x2b\x8c\xcf\x03\x47\x37\xd7\x46\x1f\x76\xcd\xf6\xe7\xe6\x17\x16\xc6\x07\xd0\xbe\xc1\xf2\xdc\xe1\xde\xca\xec\xda\xc2\x64\x88\x57\xd8\x18\x62\xb0\x3f\x06\x8b\x47\xbf\xb1\xcb\x93\xef\xe9\xae\xc1\x62\xff\x50\x6f\xe1\x40\xd0\x3b\x5e\x1e\x8f\x60\xdf\xe4\x7b\xbc\xb1\xc7\x76\x9a\xcd\x63\x77\xa7\xd9\xec\xfc\x09\x66\x7c\xbc\x1f\x58\xe8\x5f\xcc\x8b\x9b\xbb\x7d\x8f\x99\xda\x39\x3b\xcc\xf2\x64\x47\x6f\x35\xe3\xef\xfd\x6e\x17\x0e\x66\x67\x37\x08\xe9\x06\x21\xdd\x63\x42\xf6\x74\xa7\x56\xbc\xf3\x94\xe0\x73\xa7\x04\x9f\x3b\xe5\xd8\xcf\x9d\x32\xf5\xb9\x6d\xdd\xd5\xf1\x66\xde\x79\xda\x66\xa7\x77\x9e\x1e\xac\xec\xf4\x60\x65\xa7\x1f\x3b\xd2\xd3\x83\x91\x9e\x3e\xb5\xe2\xdd\x87\xd7\x16\x56\xe7\x97\x16\x2e\xe1\x8d\x9b\x67\x8d\x9d\xe7\x04\x6b\x3f\x27\x58\xfb\x39\xc7\x76\xf5\x9c\xe9\x21\x9e\xb7\xf9\xde\x1d\x67\x1f\x1a\x2c\x8f\x77\xcb\xde\x83\xfd\xe5\xc3\xbd\xc5\xb9\xfd\x0b\xbc\xad\x17\xac\xbe\x17\xac\xbe\x77\x6c\xe7\x7b\x41\xe7\x7b\xd3\xbb\xa9\xb7\xb9\x9b\x7a\x7d\xbe\x97\x53\xbb\xa9\x1f\x84\xf4\x83\x90\xfe\xb1\x63\xe8\x4f\x8f\x61\x3e\xf8\xdc\x7c\xf0\xb9\xf9\x63\x3f\x37\x3f\xbd\x9b\xfa\x93\xdd\xb4\x18\xec\xa6\x41\xb0\xb2\x41\xb0\xb2\xc1\xb1\x23\x1d\x04\x23\x1d\x4c\x77\x68\x6e\xfe\xa2\xf9\x8d\xf5\x05\x3b\x69\x2d\x58\xf7\x5a\xb0\xee\xb5\x63\x3b\xba\x36\xbd\xbe\x4b\x82\x9d\xb4\xba\xb1\x93\xf6\x5c\x32\xf5\xae\x5d\xe6\x70\x6f\x76\x99\xd3\xd7\xae\x5e\xb0\xb0\xd3\xec\x5f\xee\x6f\xec\xbd\xcd\xc7\xbb\xcc\xe0\xe0\x60\xb1\x7f\x01\x9f\x08\x16\x76\xba\xcd\xc4\x9d\xb3\x41\x4f\xdd\x31\x3d\x3d\x61\xf6\x98\x27\x8e\x73\x73\x83\xd5\xe3\x66\xe7\x06\xab\x3b\xdd\x6c\x6f\xa3\x07\xb3\xc1\xe3\x4e\xf0\x78\x6e\xea\xf9\xe5\x01\xb4\xef\x9c\xdb\x7c\xbc\xab\x1b\x8e\xab\x1f\x8e\xab\x1b\x8c\xab\xbf\xf9\x78\x6f\x77\x6e\xb0\xda\x9b\xdd\xc0\x60\x6f\x7f\x7a\x79\x57\x37\x1c\x77\x3f\x1c\x77\x37\xe8\x4f\x7f\xf3\xf1\x09\x27\x1d\x3b\xee\x83\xc7\x1e\x0e\x27\x05\x7d\x39\xb8\xf9\xf8\xb8\x93\x8e\x6e\x8f\x83\x73\x83\xd5\x7d\x27\xad\x5f\x93\x05\xfd\xd8\x77\xf0\xd8\x67\x4e\x38\xf9\xd8\x9c\x43\xc7\x3c\xb1\xfd\xe4\x09\x57\xdb\x0f\x4d\x1e\xed\x3c\x25\x38\x7e\x03\x1e\x77\x9d\x12\x6e\xb9\xf9\x70\xcb\x9d\x12\xf4\x76\x3e\x38\x22\x4e\x09\xb7\xcc\x7c\xb0\xb0\xf7\x94\xe9\x6d\xb8\x7b\xee\xa8\x75\x2b\x2b\xe3\xeb\x86\xad\xa7\x8c\x2f\xa6\xb6\xce\x8f\x2f\x20\x4e\xb8\xcb\xb1\xe3\x78\xc0\x31\x4f\xec\xbb\xeb\x65\xb6\xc6\x05\x97\x7d\xe6\x28\x85\x8b\x0b\xbd\xc5\xb9\xf9\xf1\x95\xcc\xce\x53\x83\xe3\x72\x61\xf3\xf1\xbe\x53\x2f\xf3\xd9\x85\x63\x9f\xd9\x79\x6a\xb0\x6f\x17\x36\x1f\x6f\x3f\x75\x0e\xa2\xb7\x2f\x4c\x1e\xed\x3c\x35\xf8\xd6\x2e\x04\x8f\x4f\x0b\xf2\x17\x83\xfc\xd3\x2e\x93\xbf\x78\x99\xfc\xd3\x82\xfc\xc5\xe0\xd8\x5a\xec\x2d\x0d\x56\x56\x97\x07\x4b\x87\xb8\xa4\xee\x72\x9a\xdc\xd6\xe7\xc1\xae\xd3\xc3\x1d\x39\x08\x77\xe4\xe9\xc1\x8e\x1c\x6c\x3e\x3e\xf1\xf4\x43\x6b\x8b\x07\x7b\xcb\x6b\x87\x17\x7a\x6b\xe3\xfc\x13\x07\x97\x79\x6a\xeb\xe9\x63\x2e\xb7\x0e\x58\xc3\x99\xc1\xf0\x96\x83\xe1\x9d\x79\x99\xe1\x2d\x5f\x66\x78\x67\x06\xc3\x5b\x0e\x1e\x9f\x15\xac\x73\x25\x38\x95\x9c\x75\xec\x21\xb2\x72\xcc\x13\xbb\xcf\x0a\x75\xd8\xbd\x32\x65\xc5\x59\x41\xc2\xca\xe6\xe3\x7d\x67\x5f\xa6\xa7\xab\x97\xe9\xe9\xd9\xc1\x67\x57\x83\x03\xe1\xec\x8d\xaf\xd6\xea\xc6\x57\xeb\x9c\xe0\xab\xb5\x16\x7c\xb5\xce\x09\xf7\xc8\x5a\xb8\x47\xce\x09\xf6\xc8\xda\xe6\xe3\x1d\xe7\x6c\xf0\xb7\x63\x6d\xe3\xe1\x89\xe7\x5c\x76\x3f\xad\x5d\xe6\xa9\x5d\xe7\x84\x5f\xcb\xb5\x60\xe1\x84\x73\x8f\xdd\x8a\x47\x8e\x7d\xe2\xbc\x63\x9f\xb8\xe4\x58\x6d\xce\x9b\xd6\xe6\xfc\x60\x87\x5d\xba\xf9\x78\xef\xf9\xc7\x9c\x55\x2f\x9d\x5e\xde\x79\x7e\xb0\x59\x2f\xdd\x7c\xbc\x63\x61\xb0\x78\x90\x55\x1f\x58\x18\x2c\xcf\xf3\xf4\xe9\x1b\x90\xed\x18\x6c\x3e\x3c\x67\xf3\xe1\xda\xc6\xc3\xf5\x4b\xd9\xd8\xcf\x8c\x0f\xd6\xf5\x05\xd7\x1d\xb7\x9d\x19\xda\x84\x36\xa5\xcd\x68\x35\xad\xa1\x75\x7b\xd7\x2f\x17\x83\x71\xf5\xa6\x97\x77\x99\xe0\x12\x71\x57\x2f\xbc\x10\x19\x5f\x70\x85\x17\x05\xc7\x3c\xb1\xef\xac\xcb\x1c\x7e\x2b\xc7\x3e\xb3\xde\x8f\xc4\xba\xbd\xc7\xec\x86\x1d\x9b\x9b\x6c\xcf\xc6\x9f\x03\xe3\x57\x36\x8f\xa2\xf1\x87\x9d\xa1\xb5\xb4\x9d\x71\xdb\x99\xd9\x33\xbd\x4f\xb6\x6f\x1c\x68\x3b\x83\x83\x66\xc7\xe6\x71\xbc\xef\xb2\xc7\xda\xfa\x9a\xbc\xda\x8c\x53\x33\x33\xb4\x31\xad\x3a\xee\xd0\x60\x70\xc1\xf8\x0f\x8c\x99\xf1\x9f\xd8\xdb\xe6\x06\xab\xfb\xfb\x0b\x83\x23\x3b\x56\x07\x8b\x83\xf1\xee\x3e\x71\x72\x5c\x6d\x3e\xb5\xd7\x2c\x2c\x1d\xea\x6d\x2e\xef\xe9\x2d\x0e\x56\xfb\x0b\xfd\x79\xfe\xec\xe8\x2e\xad\xcc\x2f\x0c\x16\x37\xdf\xb0\xbb\xbb\x1a\xbe\xfd\x94\x41\xb8\xb8\xef\xf4\xc3\xf3\x47\xbf\x78\xc1\x33\xe7\x1c\xbb\x82\xbd\xa7\x1f\xee\x1f\x0c\x3e\x73\xe5\xf9\xc1\x6a\xef\xb2\x1d\xdb\xb1\xde\xb1\xf1\x46\xb3\xfd\xd5\xf1\xa3\x1d\x27\xf5\x26\xff\x8a\x32\x1e\x79\x91\xee\xa2\x87\xe3\x77\x9e\x3f\x79\xe7\xb6\xee\xe4\x23\x67\x1f\x9a\x3c\xb7\xfd\x68\x67\xc7\x4f\xde\xb5\xb7\xb4\xd4\x9b\x08\x76\x78\xff\x1c\xeb\xbc\xdb\xf8\x2f\xe4\xad\xa7\xd1\xde\x73\x7e\x72\xba\x9f\xdf\x38\x9f\x6c\x3d\x63\xfc\xe4\xb6\x33\x0f\xf1\x0f\x32\x67\xcd\x1f\xa4\x53\xdb\xce\xee\xad\x71\x82\x08\x7a\xb5\xed\x8c\x43\x7c\xc4\x4d\x1e\x9c\x31\x71\x7a\x7d\x14\xa6\xd8\x77\x4a\xb0\x11\xd6\x5f\xb9\x22\x6b\x98\x7a\x72\x6f\x6f\x7a\x6f\xed\xeb\x5f\x66\xf7\xf4\xa7\x76\xcf\xfc\xd4\xee\xb9\xda\xda\xf4\x3a\x83\xad\xdd\xdb\xdc\xda\xfb\x37\xb6\xf6\xc1\x8d\xad\xbd\x63\xae\xbf\xc0\xb3\xbb\xfa\xe1\x06\xbf\x74\x63\x83\x6f\x7c\x6a\x75\x73\x83\xcf\x6f\x6c\xf0\x0b\x36\x37\xf8\x42\xb0\xc1\xf9\x93\x78\xeb\x22\x1b\xfc\x62\x36\xf8\x20\xdc\xe0\x4b\x6c\xb4\x65\x36\xf8\xce\x95\xa3\x1b\x3c\x1e\xaf\x78\x65\x73\xe3\xaf\x4e\x36\xfe\x5a\xb8\xf1\x97\x26\xdb\x7c\x76\xf2\x60\x89\x8d\xbf\x63\x70\xf4\x48\x1c\x6f\xc8\xf9\xcb\x6c\xff\xb5\xff\xcf\xf6\xdf\x37\xb8\xcc\xf1\xbd\x76\x99\xe3\x7b\x30\x7d\x7c\x8f\xc7\xd8\xe1\xab\xca\x69\x51\x75\xb2\xf5\x6f\x6b\x3a\x33\xc3\xd7\xee\xc0\xfc\x7c\x3c\x33\x93\xa8\xa9\x45\x89\xa7\x17\x93\xe9\xc5\x63\xde\x9c\x4e\x2f\xca\xf4\x62\x36\xbd\x98\x4f\x2f\xea\xe9\xc5\x62\x6a\x31\x9b\xee\x64\x16\x6f\x9e\x98\xd2\x99\xce\xf4\x6b\x53\x5d\x8c\xd3\xe9\x4e\xc4\xd3\xa9\xf1\x74\x6a\x3c\x9d\x9a\x1c\xb3\x69\xa6\xb7\x45\x32\xbd\x2d\x92\xe9\xc1\x27\xd3\xb9\xc9\xf4\xe0\x93\xe9\x6e\x24\xd3\xdd\x48\xa6\xbb\xa1\xa6\xbb\xa1\xa6\xbb\xa1\xa6\xbb\xa1\xa6\x77\x89\x9a\xee\x95\x9a\xee\x95\x9a\xee\x95\x9a\xee\x95\x9a\xee\x95\x9a\xee\x55\x3a\xdd\xab\x74\xba\x57\xe9\x74\xaf\xd2\xe9\x5e\xa5\xd3\xbd\x3a\x66\x1f\xa5\xd3\xbd\x4a\xa7\x7b\x95\x4e\xf7\x2a\x3d\xe6\x40\x99\x5e\x55\x36\xbd\xaa\x6c\x7a\x55\xd9\xf4\xaa\xb2\xe9\x55\xe5\xd3\x03\xcc\xa7\x47\x94\x4f\x8f\x28\x9f\x1e\x51\x3e\xdd\x8d\x7c\xba\x1b\xf9\x74\x37\xf2\xe9\x6e\xe4\xd3\xdd\xd0\xd3\xdd\xd0\xd3\xdb\x59\x4f\xf7\x4a\x4f\xf7\x4a\x4f\xf7\x4a\x4f\xf7\x4a\x4f\xf7\x4a\x4f\xf7\x4a\x4f\xf7\x4a\x4f\xf7\xaa\x98\xee\x55\x31\xdd\xab\x62\xba\x57\xc5\x74\xaf\x8a\xe9\x5e\x15\xd3\xbd\x2a\xa6\x7b\x55\xe4\xc1\x57\x5d\x8e\xd9\x25\xc7\xa4\x4e\x75\x31\x9e\x3e\xb1\xc5\x33\xf1\xf4\xe2\xf4\x69\x62\x46\x4d\x2f\xa6\xd3\x8b\x32\xbd\x98\x4d\x2f\xe6\xd3\x8b\x7a\x7a\xb1\x08\x07\x30\x75\xae\x8a\xe3\xe9\x2e\xb2\x9d\xc6\x6f\xe5\x94\xc7\x42\xbc\x79\x26\x4f\xb3\x84\x56\xf1\x62\x1a\xbe\x53\xc2\x85\x2c\x5c\x08\xb7\x24\x87\x3e\x0b\x61\x17\x33\x13\x2e\xd8\x70\xc1\x85\x0b\x9d\x70\xa1\x1b\x2e\xf8\x60\x21\x0f\x47\x91\x87\xa3\xc8\x19\x45\xae\x68\x53\x5a\xe1\xcd\x61\xdf\xf3\xb0\xef\x79\xd8\xf7\x3c\xec\x7b\x1e\xf6\x3d\x0f\xfb\x9e\x87\x7d\xcf\xc3\xbe\xe7\x61\xdf\xf3\xb0\xef\x3a\xec\xbb\x0e\xc9\xe1\x5b\xc7\x42\xb8\xd7\x74\xb8\x2f\x74\xb8\x2f\x74\x38\x1e\x1d\x0e\x41\x87\x43\xd0\xe1\x10\x74\x38\x04\x1d\x0e\x41\x87\x43\xd0\xe1\x10\xb4\x9f\x86\xf4\x98\x2f\x6a\x18\x5c\x84\xc3\x98\x3a\xf8\x8a\x70\x18\x45\x38\x8c\x22\x1c\xc6\xd4\x97\x73\x7a\xd5\xe1\x98\x8a\x70\x4c\x45\x38\xa6\x22\x1c\x53\x11\x8e\xa9\x08\xc7\x54\x84\xbb\xc5\x84\xbb\xc5\x84\xbb\xc5\x84\xe3\x31\xe1\x78\x4c\x38\x1e\x13\x8e\xc7\x84\xe3\x31\xe1\x78\x4c\x38\x1e\x13\x8e\xc7\x84\xe3\x31\xe1\x78\x4c\x38\x1e\x13\x8e\xc7\x84\xe3\x31\xe1\x78\x6c\x38\x1e\x1b\x8e\xc7\x86\xe3\xb1\xe1\x78\x6c\x38\x1e\x1b\x8e\xc7\x86\xe3\xb1\xe1\x78\x6c\x38\x1e\x1b\x8e\xc7\x86\xe3\xb1\xe1\x78\x6c\x38\x1e\x1b\x8e\xc7\x86\xe3\xb1\xe1\x78\x5c\x38\x1e\x17\x8e\xc7\x85\xe3\x71\xe1\x78\x5c\x38\x1e\x17\x8e\xc7\x85\xe3\x71\xe1\x78\x5c\x38\x1e\x17\x8e\xc7\x85\xe3\x71\xe1\x78\x5c\x38\x1e\x17\x8e\xc7\x85\xe3\x71\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\x3a\x38\x3b\x76\x0a\x9e\x0c\x87\xd2\x09\x87\xd2\x09\x87\xd2\x09\x87\xd2\x09\x87\xd2\x09\x87\xd2\x0d\x87\xd2\x0d\x87\xd2\x0d\x87\xd2\x0d\x87\xd2\x0d\x87\xd2\x0d\x87\xd2\x0d\x87\xd2\x0d\x87\xd2\x0d\x77\x4d\x37\xdc\x35\xdd\x70\x3c\xdd\x70\x3c\xdd\x70\x3c\xdd\x70\x3c\xdd\x70\x3c\xdd\x70\x3c\x3e\x1c\x8f\x0f\xc7\xe3\xc3\xf1\xf8\x70\x3c\x3e\x1c\x8f\x0f\xc7\xe3\xc3\xf1\xf8\x70\x3c\x3e\x1c\x8f\x0f\xc7\xe3\xc3\xf1\xf8\x70\x3c\x3e\x1c\x8f\x0f\xc7\xe3\xc3\xf1\xf8\x60\x3c\x32\x33\x13\x2e\xc4\xe1\x42\x12\x2e\xa8\x70\x21\x0d\x17\x24\x5c\xc8\xc2\x85\x3c\x5c\xd0\xe1\x42\x11\x2e\x98\x70\xc1\x86\x0b\x2e\x5c\xe8\x84\x0b\xdd\x70\x21\x1c\x4f\x1c\x8e\x27\x0e\xc7\x13\x87\xe3\x89\x37\xc7\x13\x77\x67\x82\x7f\xd3\xeb\x2a\xcf\x93\x71\xf0\x0e\xd5\x0d\x17\xc6\x79\x3b\xcf\x0d\x7e\x48\x3b\x12\x3c\x3e\x37\xf8\xa7\xcb\x23\x9b\x8f\xf7\x9c\x3b\xfd\x6b\xfe\x91\xe9\x1f\xce\xd6\x57\x1d\x40\x13\x77\x4d\xd8\x83\x00\x9a\xb8\x6b\xc2\xde\x07\xd0\xc4\xdd\x00\x9a\xb8\x1b\x40\x13\x77\x03\x68\xe2\x6e\x00\x4d\xdc\x0d\xa0\x89\xbb\x01\x34\x71\x37\x80\x26\xee\x06\xd0\xc4\xdd\x00\x9a\xb8\x6b\xc2\xad\x13\x40\x13\x77\x6d\x38\x1e\x1b\x8e\xc7\x86\xe3\xb1\xe1\x78\x6c\x38\x1e\x1b\x8e\xc7\x86\xe3\xb1\xe1\x78\x6c\x38\x1e\x1b\x8e\xc7\x86\xe3\xb1\xe1\x78\x6c\x38\x1e\x1b\x8e\xc7\x86\xe3\xb1\xe1\x78\x5c\x38\x1e\x17\x8e\xc7\x85\xe3\x71\xe1\x78\x5c\x38\x1e\x17\x8e\xc7\x85\xe3\x71\xe1\x78\x5c\x38\x1e\x17\x8e\xc7\x85\xe3\x71\xe1\x78\x5c\x38\x1e\x17\x8e\xc7\x85\xe3\x71\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\x3a\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\xba\xe1\x78\x7c\x38\x1e\xb4\xd9\x79\x5e\x70\xae\xb9\x64\xf3\x31\x6f\x0a\x47\xe3\xc3\xd1\xf8\x70\x34\x3e\x1c\x8d\x0f\x47\x13\x58\x13\xfb\x74\xb3\x9b\xc9\x4c\x40\x45\x32\x13\x9c\x1e\x93\x99\x80\x8a\x64\x26\xa0\x22\x99\x09\xa8\x48\x66\x02\x2a\x92\x99\x80\x8a\x64\x06\x2a\x76\xac\x2c\xf5\x66\xfb\xe1\xf3\x45\xb8\x60\xc2\x85\xf1\xa6\xdd\xd9\x5f\x9c\xdb\x28\x20\x3c\xfa\x07\x47\x16\x67\x59\xba\xf5\xe8\x23\x35\x13\xaf\xb7\x49\x51\xb0\xbc\xfe\x0b\x42\x32\x13\xcf\xec\xec\x1f\xde\xf8\xd4\xfa\x9f\x29\x33\x33\x09\x40\x9d\xb8\x59\xd6\x36\x29\xa3\xe4\x53\xd9\x9e\xf5\xb2\xc8\xcd\xda\xaa\xf5\xc5\xcd\x3a\xa4\x2b\x6c\x56\x4d\xee\xef\xad\xf0\x0b\xe8\xf8\x3d\xfd\x8b\xfa\xcb\x2b\x54\x38\xed\x9b\x94\x68\x6e\xac\xe8\xc4\xc9\x33\x9b\xeb\xda\x78\xd3\xc6\x9a\x76\xce\xf5\x0e\x1e\xa4\xc2\x69\xcf\xf8\xf1\xa4\x7f\x3b\xf7\xaf\x2d\x2c\xf4\xf9\x45\xbc\xbf\xb0\x30\xbf\xb4\x61\xcc\xea\x91\xc1\xdc\x60\xb5\xbf\xb8\xd0\xef\xcd\xf5\x97\x4f\x58\xea\x2f\xaf\x1e\x1a\xac\x6d\x14\x7a\x8e\x47\x96\xe4\xb4\x86\xd6\xb2\x25\x25\x57\x1b\x8f\xd2\x9d\x87\xe7\x17\x37\x7f\x42\xed\xcf\x0e\x58\xc7\x7a\xd5\xd9\xfa\xa8\x37\x06\x34\x5e\x8d\x92\x2b\x6c\xbc\xb4\x39\xb2\x3d\x54\xcb\x4d\x6d\x5b\x65\x77\x1f\x58\xee\x6d\xd6\xbd\xf1\x6c\x77\xfb\xe2\xa4\xae\x6c\xfc\x4c\x9e\xee\x38\xb0\xdc\x5b\x9c\x0d\xde\xa4\x63\xda\x84\x56\xd1\xa6\xe3\xd6\xcc\xec\x5e\x2f\xf2\x3c\x3c\x58\xec\xaf\xf6\x96\x2f\xe1\xd9\x64\x7d\x60\x33\xba\x48\xe3\x9d\x4b\xfd\x95\xc9\x3f\xde\xf3\xaa\xd0\x66\xb4\x96\x56\x6f\xef\xae\x51\xa3\xba\x67\xbc\x61\x92\x54\x87\x1f\xec\xd0\x76\x69\xfd\xb8\xb5\x1c\x79\x96\xce\x5a\x3a\x6b\xe9\xac\xa5\xb3\x76\x1c\x1c\xcf\xa8\xc9\xea\xf9\x43\x9d\xa7\x8b\x6d\xa7\x1c\x58\xee\x5d\xb0\xba\xb6\xcc\xeb\x6a\xf2\xaf\xe3\xab\xcb\xbd\xb9\xfe\xe1\xde\x32\x15\x24\x47\xfa\xf3\xfd\xe5\x95\xd5\xe5\xde\xca\xca\xb6\x33\xf9\xc8\x78\x1d\x49\xbc\xe3\xf4\x8d\x5f\x00\xf6\xf4\x57\x56\xe7\x0f\xf7\x56\xfb\xc1\xe1\x10\x27\x76\xcf\x60\xb1\xbf\x5e\x3d\x7b\x28\x78\x5a\xa9\xe3\x7b\x0b\xfd\xa5\x43\xdb\x8e\x6e\xc8\x43\xf3\xcb\x73\xdb\x57\x8f\x0c\xd6\x1f\xac\xec\x5b\x2f\xb2\x1b\x7f\x82\x2a\xc1\x03\xf3\x17\x4d\x3d\xb1\x6f\xbd\x30\x77\xea\x2d\x4b\xbd\xe5\xd5\xf9\xde\xc2\xdc\xfc\x81\x03\x41\x4c\x36\x43\x1b\xd3\x26\xb4\x8a\x36\xa5\x65\x53\x65\x19\x6d\x4e\xab\x69\x0b\x5a\x43\x3b\xde\x87\x71\xce\xfa\x73\xd6\x9f\xb3\xfe\x9c\xf5\xe7\xac\x3f\x67\xfd\x39\xeb\xcf\x59\x7f\xce\xfa\xf3\x62\x7b\x6f\x79\x79\x70\xe4\xe8\x41\xbf\x75\xfd\xd1\xda\xd2\x8e\xf5\x76\xfd\x58\x1f\xbf\x38\x37\x38\xb2\x38\x7e\xb4\x7f\xb0\x7a\x68\x3b\x6f\x9b\x5b\x1c\xaf\xa2\x60\xd5\x05\xab\x2e\x58\x75\x41\xd7\x0b\xba\x5e\xd0\xf5\xc2\xd1\x76\x68\xbb\xb4\xe3\xa3\x2c\x36\x0c\xcd\x30\x34\xc3\xd0\x0c\x43\x33\x0c\x8d\xc3\x3b\xe6\xf0\x8e\x4d\xbe\x6b\xa3\x67\xfb\x57\xfa\x3c\x49\x27\x0c\x9d\xe0\x3b\x10\x1b\x3a\xc1\xa1\x1e\x73\xa8\xc7\x1c\xea\x31\x87\x7a\xcc\xa1\x1e\x73\xa8\xc7\x1c\xea\xb1\x4d\xf7\xcc\xf6\x96\x97\xe7\x7b\x07\xfb\xcb\xfd\xd5\xb5\x65\xb6\x85\xa5\x2f\x96\x6d\x61\xd9\x16\x96\x6e\x58\xba\x61\xe9\x86\xa5\x1b\x96\x6e\x58\xba\x61\xe9\x86\xa3\x1b\x8e\x6e\x38\xba\xe1\xe8\x86\x63\x5b\x38\xb6\x85\x23\xdf\x91\xef\xc8\x77\xe4\x3b\xf2\x1d\xf9\x8e\x7c\x47\xbe\x23\xdf\xf9\xf1\xb6\xe4\xfc\xbe\x63\xb2\xb0\xb6\xb4\x7b\xf2\x70\xfd\xf8\xd8\x78\xd7\xd1\x43\x64\x63\xe1\xe8\x51\x32\x5e\x4f\x87\x7e\x75\xe8\x57\x87\x7e\x75\xe8\x57\x87\x7e\x75\xe8\x57\x87\x7e\x75\xe8\x57\x87\x7e\x75\xe8\x57\x87\xed\xd2\x65\xbb\x74\xd9\x2e\x5d\xb6\x4b\x97\xed\xd2\x65\xbb\x74\xc9\xef\x92\xdf\x25\xbf\x4b\x7e\x97\xfc\x2e\xf9\x5d\xf2\xbb\xe4\x77\xc9\xef\x92\xdf\x25\xdf\x93\xef\xc9\xf7\xe4\x7b\xf2\x3d\xf9\x9e\x7c\x4f\xbe\x27\xdf\x93\xef\xc9\xf7\xe4\x7b\xf2\x3d\xf9\x9e\x7c\x4f\xbe\xf7\xdb\xd7\x16\xe7\x8f\x32\xdc\x5b\xd8\xd1\xd9\xf8\x5d\x77\x67\xff\xe2\xf9\x95\xd5\xfe\xe2\xd1\x13\xd1\xb6\xfe\xe1\xa5\xd5\x4b\x56\xfa\xab\xbb\x96\x96\x07\x73\x6b\xb3\x94\x81\x1f\x5c\xee\xcd\xcd\xf7\x17\x57\xb7\xf6\x17\xfa\x87\xfb\x8b\xab\x3b\xc6\xb5\x02\x47\x1f\x6e\x5b\x59\x9b\x3d\xb4\x7a\xa8\xb7\xba\x9e\x91\xcc\xb8\x3d\x2b\x6b\x87\x0f\xf7\x36\x18\xdb\xb1\x59\x36\xbd\xeb\xe8\x5a\x66\x7b\x01\x7a\x49\x2c\xbb\x26\xf7\x4d\x1c\xee\xad\x1e\xda\x3d\xbf\x78\x60\x7e\x71\x7e\x75\x5c\x56\x7b\xb4\x0f\x4b\x83\xe5\xa3\xab\xea\x2d\xec\x9e\x5f\x5c\xed\x1f\x5c\xe6\xd3\x3b\x06\x47\x11\x3f\x78\xf4\x85\xe3\x7b\x8b\x07\x17\xc6\x5f\xd8\x24\x51\xb4\xb2\x83\xa2\xef\xde\xe2\xdc\x76\x1e\x0e\x96\x77\x1d\x5d\xc7\x32\xc5\xe5\xc7\xaf\x2d\xce\x0f\x16\x4f\xe8\x2d\x2d\x2d\x0f\x2e\xde\xbc\xdd\x81\x15\x38\xda\xee\xf6\xd5\x43\xfd\xe5\xfe\x81\xc1\x32\x11\x4a\x68\x33\xda\x7c\xeb\xca\xfc\xe1\xf9\x85\xde\x32\xcb\x9d\xed\xb3\x83\xc5\x83\xcb\x6b\xfd\xc5\xd5\xdd\x47\x37\xd3\x31\x6b\x4e\x59\xb3\x24\x7b\x16\xfa\x2b\x2b\x9b\x2f\xef\xec\x5f\xb8\x36\x7f\x51\x6f\xa1\xbf\x38\xdb\xdf\xc7\x3d\x17\xc1\x5d\x18\x0b\x83\x4b\xfb\x8b\x07\xfb\xc1\x9a\x38\xeb\x27\x9c\xf5\x13\xce\xf2\x09\x67\xf9\x24\xeb\xd2\xfa\xf5\x0d\xd9\x5f\x5e\x59\xdb\xbf\xd2\x5f\xdd\x33\x59\x38\xfa\x7f\xfd\xd5\xed\x8b\x83\xd5\xf1\x0b\xe3\x77\x6b\xd9\xb5\xdc\x3f\xb0\xd0\xbf\x98\x77\x4f\x16\xc6\xef\xde\x31\x3b\xbf\x3c\xbb\xd0\x5f\x5a\x58\x5b\xd9\x33\x7e\x38\x29\x84\x1e\x7f\xba\x28\x76\x2f\xf5\x97\x97\xfa\x8b\x73\xf3\xb3\x6b\x1b\xdb\xc4\xfa\xad\x73\x83\xd5\xa3\x3b\x78\x7d\x59\xcd\x68\xda\x82\xd6\xd0\x8e\x7b\xae\xe2\xf1\x17\x42\x71\x3e\x4d\xf1\x30\xc5\x43\x7e\x89\x49\x52\x3c\x4c\xf1\x30\xc5\xc3\x94\x2d\x93\xb2\x65\x52\x3c\x4c\xf1\x30\x65\x4b\xa5\x6c\xa9\x34\x73\xb4\x1d\xda\x2e\x2d\xf9\x78\x99\xe2\x25\xbf\xa1\x24\xfc\x86\x92\xf0\x1b\x4a\x92\xe2\x65\x8a\x97\x29\x5e\xa6\x78\x99\xe6\xe4\xe7\xe4\xe7\xe4\xe7\xe4\xe7\xe4\xe7\xe4\xe7\xe4\x6b\xf2\xb9\xce\x4b\xb9\xce\x4b\xb9\xce\x4b\xb9\xce\x4b\x35\xf9\x9a\x7c\x4d\xbe\x26\x5f\x93\xaf\xc9\xd7\xe4\x6b\xf2\x35\xf9\x9a\x7c\x4d\x7e\x41\x7e\x41\x7e\x41\x7e\x41\x7e\x41\x7e\x41\x3e\xa8\xa7\xa0\x9e\x82\x7a\x0a\xea\x29\xa8\xa7\xa0\x9e\x82\x7a\x0a\xea\x29\xa8\xa7\xa0\x9e\x82\x7a\x0a\xea\x29\xa8\xa7\xa0\x9e\x82\x7a\x0a\xea\x29\xa8\xa7\x86\x7c\x43\x3e\x9e\xa7\x78\x9e\xe2\x79\x8a\xe7\x29\x9e\xa7\x78\x9e\x4e\x8e\x3f\x3c\x4f\xf1\x3c\xc5\xf3\x14\xcf\x53\x2e\x5d\x53\x2e\x5d\xd3\x0e\xef\xef\xf0\xfe\x0e\xef\xef\xf0\xfe\x0e\xef\xef\x4c\xde\x4f\x7f\x01\x2e\x05\xb8\x14\xe0\x52\x80\x4b\x01\x2e\x05\xb8\x14\xe0\x52\x80\x4b\x01\x2e\x05\xb8\x14\xe0\x52\x80\x4b\x01\x2e\x05\xb8\x14\xe0\x52\x80\x4b\x01\x2e\x05\xb8\xb4\x5b\x6c\x3b\xcb\xc7\x33\x47\xff\xb7\xfe\x84\xcc\xc4\x47\x9f\x88\x83\x27\x14\x6d\x4a\x2b\xb4\x19\x6d\x4e\xab\x69\x0b\x5a\x43\x6b\xb7\x9d\xe5\x67\xc2\x15\x76\x68\xbb\xb4\xfe\xe8\x1b\xd4\xe6\x1b\xe2\x98\x36\xa1\x55\x47\xdf\x90\x04\x6f\xa0\x0b\x31\x5d\x88\xf3\xa3\x6f\x48\x83\x37\xd0\x87\x98\x3e\xc4\xeb\x7d\xd0\xc1\x1b\xe8\x43\x4c\x1f\xe2\xf1\x66\x95\x84\xd7\x13\xba\x90\xd0\x85\x64\xbd\x0b\xc5\xe6\x0a\x12\xba\x90\xd0\x05\xfe\xb8\x94\x84\xad\x90\xd0\x03\xfe\xd8\x94\x64\xbd\x07\x59\xb0\x02\x7a\x90\xd0\x83\x84\x1e\x28\x5e\x57\xf4\x40\xd1\x03\xb5\xde\x83\x7c\x73\x05\x28\x25\x28\x25\x8a\x1e\x28\x7a\xa0\xe8\x81\xa2\x07\x6a\xbd\x07\x12\xac\x80\x1e\x28\x7a\xa0\xe8\x41\xca\xeb\x29\x3d\x48\xe9\x41\xca\x81\x90\x72\x20\xa4\x74\x20\xa5\x03\x29\x1d\x48\xe9\x40\x4a\x07\x52\x3a\x90\x1e\xed\x40\xba\xbe\x9f\xb7\x9d\xe5\x93\x94\x07\x12\x4f\x1e\x24\x3c\x50\xc5\xe4\x3d\x93\x67\x92\xc9\x7b\x12\x99\xbc\x79\x86\x07\xe9\xe4\xcd\x4a\x4f\xde\xb3\xf1\x20\x9f\x3c\xc8\x26\xef\xd9\x78\x30\x79\x29\x9d\x44\xc4\x1b\xa1\x93\x35\x27\x93\xae\xa6\x1b\x6f\x9e\xac\x39\x9d\xf4\x27\x9d\xf4\x27\x9d\xac\x39\x9d\x7c\x5c\x36\x06\xb8\xb1\x9e\xe0\x08\xc5\x21\xc1\x21\xc1\x21\xc1\x21\xc1\x21\xc1\x21\xc1\x21\xc1\x21\xc1\x09\xc1\x09\xd1\x6a\xeb\xdc\xe2\xfe\x85\xc1\xec\x05\x2c\xb3\x73\x70\x42\x74\x7e\x7c\xf8\x2a\xbb\x06\x25\x44\xdb\xad\x0b\x07\xc2\xd7\xe9\x1d\x4a\x88\xf6\xc7\xaf\x1c\xea\xcd\xf5\xb7\xce\x5d\x30\x6e\xd7\x9f\xc5\x04\x29\x64\xfb\x81\xf9\x85\x85\xfe\xdc\xfe\xc1\xc5\x5b\x4e\x4e\x92\x99\x49\x67\xcd\xa4\xe5\x8d\x9c\xbc\x85\x93\xb7\x70\xf2\x16\x4e\xde\x62\x8a\x2d\x27\xc7\xfa\xe8\x81\xb6\x7a\xf4\x2f\xa7\xb5\xa5\xf1\xd3\x9c\x83\x85\x3f\x9e\xc4\xe6\xe3\xd7\xf9\x03\x53\xf8\xe3\x48\xf8\x63\x48\xf8\x63\x48\xf8\x63\x47\xf8\x63\x47\x9c\xde\xb5\xb6\x38\xef\x2d\xff\xa6\xb7\x65\x7c\x75\xc3\x6b\xdd\xf5\x68\x45\x14\xa7\x77\xe1\xf4\x2e\x9c\x5e\x85\xd3\xab\x70\x7a\x95\xae\xec\x18\x2c\xf5\x17\xc7\xff\x32\xc5\x53\xe3\x3d\x99\x71\x9e\xcc\x38\x4f\x66\x9c\xee\xb2\x19\x5e\x8f\x1d\x6d\x77\xcb\x81\xfe\xe1\xde\x42\xff\xb8\xa3\xff\x37\x7e\x4e\x52\x5a\xd6\x21\xac\x43\x72\x5a\x4d\x5b\xd0\x1a\x5a\x4b\xcb\xba\xa5\x43\x4b\xb6\xf8\xe3\x57\x96\x26\xfb\x2f\xe3\x5a\x2b\xcb\x92\xe3\x66\x17\xd6\xf6\xb3\x90\x1e\x7f\xa8\xdf\x5b\x5e\xdd\x3a\x37\xdf\x3b\x3c\x58\x9c\xe3\x59\x82\xb9\xcc\xca\xb2\x62\xe7\xe1\xb5\x15\x6e\xb9\x9c\xac\x8e\x50\x0e\xed\x8c\x43\x3a\xe3\xd2\x26\xe3\x90\xcd\x38\x64\x33\x2e\x6d\x32\x2e\x6d\x32\x0e\xd9\x3c\x56\xb4\x29\xed\xe4\xf9\x8c\x76\xdc\x87\x7c\x7c\xca\x55\x7c\xa5\xd4\xcc\xb8\x62\x5a\xcd\xcc\x24\xb4\x8a\x56\x68\x33\xda\xc9\xe7\x34\x6d\x41\x6b\x68\x2d\xad\xa3\xed\xd0\x76\x69\xfd\xb8\x8d\xc9\x8d\xc9\x8d\xc9\x8d\xc9\x1d\xf7\x5f\xcd\xc4\xe4\xc7\xe4\xc7\xe4\xc7\xac\x37\x66\xbd\x31\xeb\x4d\x58\x5f\xc2\xfa\x12\xd6\x97\xb0\xbe\x84\xf5\x25\xac\x6f\xb2\x1d\x12\xc6\x93\x30\x9e\x94\xf5\xa4\xac\x27\x65\x3d\x29\xeb\x49\x59\x4f\xca\x7a\x52\xd6\x93\xb2\x9e\x74\xb2\x1e\xb6\x4b\xca\x76\x49\xd9\x2e\x29\xfd\x4f\xe9\x7f\x4a\xff\x85\xed\x22\xe4\x0b\xf9\x42\xbe\x90\x2f\xe4\x0b\xf9\x42\xbe\x90\x2f\xe4\x0b\xf9\x42\xbe\x90\x2f\xe4\x0b\xf9\x42\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\x7e\x4e\xbe\x26\x5f\x93\xaf\xc9\xd7\xe4\x6b\xf2\x35\xf9\x9a\x7c\x4d\xbe\x26\x5f\x93\xaf\xc9\xd7\xe4\x6b\xf2\x35\xf9\x9a\x7c\x4d\x7e\x41\x7e\x41\x7e\x41\x7e\x41\x7e\x41\x7e\xc1\xfa\x0b\xd6\x5f\xb0\xfe\x82\xf5\x17\xac\xbf\x60\xfd\x86\xf5\x19\xd6\x67\x58\x9f\x61\x7d\x86\xf1\x18\xc6\x63\x18\x8f\x61\x3c\x86\x3c\x43\x9e\x21\xcf\x90\x67\xc8\x33\x93\x3c\xc6\x63\x19\x8f\x25\xdf\x92\x6f\xc9\xb7\xe4\x5b\xf2\x2d\xf9\x96\x7c\x4b\xbe\x25\xdf\x92\x6f\xc9\xb7\xe4\x5b\xf2\x2d\xf9\x96\x7c\x47\xbe\x23\xdf\x91\xef\xc8\x77\xe4\x3b\xf2\x1d\xf9\x8e\x7c\x47\xbe\x23\xdf\x91\xef\xc8\x77\xe4\x3b\xf2\x1d\xf9\x8e\xfc\x0e\xf9\x1d\xf2\x3b\xe4\x77\xc8\xef\x90\xdf\x21\xbf\x43\x7e\x87\xfc\x0e\xf9\x1d\xf2\x3b\xe4\x77\xc8\xef\x90\xdf\x21\xbf\x43\x7e\x87\xfc\x2e\xf9\x5d\xf2\xbb\xe4\x77\xc9\xef\x92\xdf\x25\xbf\x4b\x7e\x97\xfc\x2e\xf9\x5d\xf2\xbb\xe4\x77\xc9\xef\x92\xdf\x25\xbf\x4b\x7e\x97\x7c\x4f\xbe\x27\xdf\x93\xef\xc9\xf7\xe4\x7b\xf2\x3d\xf9\x9e\xf5\x7b\xd6\xef\x59\xff\xf8\xdf\xea\x54\x8c\x4b\x31\x2e\xc5\xb8\x14\xe3\x52\x8c\x4b\x31\x2e\xc5\xb8\x14\xe3\x52\x8c\x4b\xf1\xcc\x64\x7d\xe3\xfe\xc6\xb8\x14\xe3\x52\x8c\x4b\x31\x2e\xc5\xb8\x14\xe3\x52\x8c\x4b\x31\x2e\xc5\x31\xf9\x31\xf9\x31\xf9\x31\xf9\x31\xf9\xf8\x15\xe3\x57\x8c\x5f\x71\x42\x3e\x8e\xc5\x38\x16\xe3\x58\x8c\x63\x31\x8e\xc5\x38\x16\xe3\x58\x8c\x63\x31\x8e\xc5\x8a\xf5\x28\xd6\xa3\x58\x8f\x62\x3d\x8a\xf5\x28\xd6\xa3\x58\x8f\x62\x3d\x6a\xb2\x1e\xc6\xa1\x18\x87\x62\x1c\x8a\x71\x28\xc6\xa1\x18\x47\xca\x38\x70\x34\xc6\xd1\x18\x47\x63\x1c\x8d\x71\x34\xc6\xd1\x18\x47\x63\x1c\x8d\x71\x34\xc6\xd1\x18\x47\x63\x1c\x8d\x71\x34\xc6\xd1\x18\x47\x63\x1c\x8d\x71\x34\xc6\xd1\x18\x47\x63\x1c\x8d\x71\x34\xc6\xd1\x18\x47\x63\x1c\x8d\x71\x34\xc6\xd1\x18\x47\x63\x1c\x8d\x71\x34\xc6\xd1\x18\x47\xf9\x89\x4a\xf1\x13\x95\xe2\x27\x2a\xc5\x4f\x54\x8a\x9f\xa8\x14\x3f\x51\x29\x7e\xa2\x52\xfc\x44\xa5\xf8\x89\x4a\xf1\x13\x95\xe2\x27\x2a\xc5\x4f\x54\x2a\xc6\xd1\x18\x47\x63\x1c\x8d\x71\x94\x9f\xb0\x14\x3f\x61\x29\x7e\xc2\x52\xfc\x84\xa5\xf8\x09\x4b\xf1\x13\x96\xe2\x27\x2c\xc5\x4f\x58\x8a\x9f\xb0\x54\x8c\xa3\x31\x8e\xc6\x38\x1a\xe3\x68\x8c\xa3\x31\x8e\xc6\x38\x1a\xe3\x68\x8c\xa3\x31\x8e\xc6\x38\x1a\xe3\x68\x8c\xa3\x31\x8e\xc6\x38\x1a\xe3\x68\x8c\xa3\x31\x8e\xc6\x38\x1a\xe3\x68\x8c\xa3\x31\x8e\x26\x5c\xcf\x26\x5c\xcf\x26\x5c\xcf\x26\x5c\xcf\x26\xe3\x7f\x88\x51\x09\xe7\x8f\x84\xf3\x47\xc2\xf9\x23\xe1\xfc\x91\x70\xfe\x48\x38\x7f\x24\x9c\x3f\x12\xce\x1f\x09\xe7\x8f\x64\x66\x92\x3b\x1e\x77\xc2\xf9\x23\xe1\xfc\x91\x70\xfe\x48\x38\x7f\x24\x9c\x3f\x12\xce\x1f\x09\xe7\x8f\x84\xf3\x47\xc2\xf9\x23\xe1\xfc\x91\x70\xfe\x48\x38\x7f\x24\x9c\x3f\x12\xce\x13\x09\xe7\x89\x84\xf3\x04\xff\xc2\xaf\x12\xce\x13\x09\xe7\x89\x84\xf3\x44\xc2\x79\x22\xe1\x3c\x91\x70\x9e\x48\x38\x4f\x24\x9c\x27\x12\xbe\xf7\x09\xc7\x71\xc2\x71\x9c\x70\x1c\x27\x1c\xc7\x09\xc7\x71\xc2\x71\xcc\x3f\xba\x2b\xfe\xd1\x5d\x25\x1c\xc7\x49\x36\x59\x1f\xe3\xe1\x38\x4e\x38\x8e\x13\x8e\x63\xfe\x51\x5e\x25\x1c\xc7\x09\xc7\x71\xc2\x71\x9c\x70\x1c\x27\x1c\xc7\x09\xc7\x71\xc2\x71\x9c\x70\x1c\x27\x1c\xc7\x09\xc7\x71\xc2\x71\x9c\x70\x1c\x27\x1c\xc7\x09\xc7\x6b\xc2\xf5\x50\xc2\xf5\x50\xc2\xf5\x50\xc2\xf5\x50\xc2\xf5\x50\xc2\xf5\x90\xe2\x78\x52\x1c\x07\x8a\xfd\xaa\xd8\x7f\x8a\xfd\xa1\xd8\x1f\x8a\xed\xaf\xd8\xfe\x2a\x19\xe7\x2b\xce\xbb\x8a\xf3\xaa\xe2\x7c\xa7\x38\xdf\x29\xce\x6f\x8a\xf3\x98\xe2\xfc\xa4\xe8\xbf\xe2\x7b\xa8\xf8\x1e\x2a\xbe\x87\x8a\xef\x9f\xe2\xfb\xa7\xf8\xfe\x29\xbe\x7f\x8a\xef\x9f\xe2\x7b\xa6\xf8\x9e\x29\xbe\x67\x8a\xef\x99\xe2\x7b\xa6\xf8\x9e\x29\x3d\x59\xff\x78\xbb\x29\xae\x57\x15\xd7\xab\x8a\xeb\x55\xc5\xf5\xaa\xe2\x7a\x55\x8d\xff\xe9\x5b\xa9\x82\xf1\x16\x8c\xa3\x20\x9f\xeb\x59\xc5\xf5\xac\xe2\x7a\x56\x71\x3d\xab\xb8\x9e\x55\x5c\xcf\xaa\x82\x7c\x43\x3e\xd7\xb7\x8a\xeb\x5b\xc5\xfe\x54\xec\x4f\xc5\xfe\x54\xec\x4f\xc5\xfe\x54\x93\xfd\xc9\xf5\xad\xe2\xfa\x56\x71\x7d\xab\xb8\xbe\x55\x5c\xdf\x2a\xae\x6f\xf9\xe9\x45\x29\xae\x6f\x15\xd7\xb7\x8a\xeb\x5b\xc5\xf5\xad\xe2\xfa\x56\x71\x7d\xab\xb8\xbe\x55\x5c\xdf\x2a\xae\x6f\x15\xd7\xb7\x8a\xeb\x5b\xc5\xf5\xad\xe2\xfa\x56\x71\x7d\xab\xb8\xbe\x55\x5c\xdf\x2a\xae\x6f\x15\xd7\xb7\x8a\xeb\x5b\xc5\xf5\xad\xe2\xfa\x56\x71\x7d\xab\xb8\xbe\x55\x5c\xdf\x2a\xae\x6f\x15\xd7\xb7\x8a\xeb\x5b\xc5\xf5\xac\xe2\x7a\x56\x71\x3d\xab\xb8\x9e\xe5\xb6\x4d\xc5\x6d\x9b\x4a\x71\x3d\xab\xb8\x8e\x55\x5c\xc7\x2a\xae\x5f\x15\xd7\xab\x8a\xeb\x55\x35\xbe\x5e\x4d\x3b\xe3\xf3\x75\xda\x19\x6f\x9f\xb4\xcb\x72\x77\x7c\xfe\x4e\xbb\xe3\xf3\x77\xda\x1d\x7f\xdf\xd2\xee\xf8\xfc\x9d\x76\x67\x26\xef\xcf\x68\x73\x5a\x4d\x5b\xd0\x1a\x5a\x4b\xbb\x9e\xef\x8b\x6c\xf2\xfe\x2e\xad\x1f\xb7\x31\xf9\x31\xf9\x31\xf9\x31\xf9\x31\xf9\x31\xf9\x31\xf9\x31\xeb\x8b\xc9\x8f\xc9\x8f\xc9\x8f\xc9\x1f\x9f\xbf\xd3\xee\xf8\xfa\x2f\xed\xc6\xe4\xc7\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x27\xe4\x2b\xf2\x15\xf9\x8a\x7c\x45\xbe\x22\x5f\x91\xaf\xc8\x57\xe4\x8f\xaf\x1b\x7d\x21\xac\x57\x91\xaf\xc8\x57\xe4\x2b\xf2\xd5\xe4\x7d\xe4\xa7\xe4\xa7\xe4\xa7\xe4\xa7\xe4\xa7\xe4\xa7\xe4\xa7\xe4\xa7\xe4\xa7\x8c\x3f\x65\xfc\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x42\xbe\x90\x2f\xe4\x0b\xf9\x42\xbe\x90\x2f\xe4\x0b\xf9\x42\xbe\x90\x2f\xe4\x0b\xf9\x42\xbe\x90\x3f\xd9\x4e\x42\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\x7e\x46\xfe\xe4\x78\xce\xc8\xcf\xc8\xcf\xc8\xcf\xc8\xcf\xc8\xcf\xc8\xcf\xc8\xcf\xc8\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xcf\xc9\xd7\xe4\x6b\xf2\x35\xf9\x9a\x7c\x4d\xfe\xf8\xba\xd1\x17\x96\xf5\x6b\xf2\x35\xf9\x9a\x7c\x3d\x79\x9d\x7c\x4d\xbe\x26\x5f\x93\xaf\xc9\x2f\xc8\x2f\xc8\x2f\xc8\x2f\xc8\x2f\xc8\x2f\x18\x7f\xc1\xf8\x0b\xf2\x0b\xf2\x0b\xf2\x0b\xf2\x0b\xf2\x0b\xf2\x0b\xf2\x0b\xf2\x0b\xf2\x0d\xf9\x86\x7c\x43\xbe\x21\xdf\x90\x6f\xc8\x37\xe4\x1b\xf2\x0d\xf9\x86\x7c\x43\xbe\x21\xdf\x90\x6f\xc8\x37\xe4\x1b\xf2\x2d\xf9\x96\x7c\x4b\xbe\x25\xdf\x92\x3f\x39\x5f\x5b\xf2\x2d\xf9\x96\x7c\x4b\xfe\x64\xff\x58\xf2\x2d\xf9\x96\x7c\x4b\xbe\x25\xdf\x91\xef\xc8\x77\xe4\x3b\xf2\x1d\xf9\x8e\x7c\x47\xbe\x23\xdf\x91\xef\xc8\x77\xe4\x3b\xf2\x1d\xf9\x8e\x7c\x47\xbe\x23\xbf\x43\x7e\x87\xfc\x0e\xf9\x1d\xf2\x3b\xe4\x77\xc8\xef\x90\xdf\x21\xbf\x43\x7e\x87\xfc\x0e\xf9\x1d\xf2\x3b\xe4\xe3\x5f\xb7\x43\x7e\x87\xfc\x2e\xf9\x5d\xf2\xbb\xe4\x77\xc9\xef\x92\xdf\x25\xbf\x4b\x7e\x97\xfc\x2e\xf9\x5d\xf2\xbb\xe4\x77\xc9\xef\x92\xdf\x25\xbf\x4b\x7e\x97\x7c\x4f\xbe\x27\xdf\x93\xef\xc9\xf7\xe4\x7b\xf2\x3d\xf9\x9e\x7c\x4f\xbe\x27\xdf\x93\xef\xc9\xf7\xe4\x7b\xf2\x3d\xf9\x7e\x9c\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x7e\xec\x7f\xea\xc7\xd7\xed\xa9\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x5e\x91\xaf\xc8\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\xbd\x26\x5f\x93\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x8f\xff\x1e\xff\x3d\xfe\x7b\xfc\xf7\xf8\xef\xf1\xdf\xe3\xbf\xc7\x7f\x3f\xf6\x5f\xa8\x47\x10\xea\x11\x84\x7a\x04\xa1\x1e\x41\x66\xc6\xfe\x0b\x75\x09\x42\x5d\x82\x50\x97\x20\xd4\x25\x08\x75\x09\x42\x5d\x82\x50\x97\x20\xd4\x25\x08\x75\x09\x42\x5d\x82\x50\x97\x20\xd4\x25\x08\x75\x09\x42\x5d\x82\x50\x97\x20\xd4\x25\x08\x75\x09\x42\x5d\x82\x50\x97\x20\x33\x31\xf9\x31\xf9\x31\xf9\x31\xf9\x31\xf9\x31\xf9\x31\xf9\x31\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x09\xf9\x8a\x7c\x45\xbe\x22\x5f\x91\xaf\xc8\x57\xe4\x2b\xf2\x15\xf9\x8a\x7c\x45\xbe\x22\x5f\x91\xaf\xc8\x57\xe4\x2b\xf2\x15\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x29\xf9\x42\xbe\x90\x2f\xe4\x0b\xf9\x42\xbe\x90\x2f\xe4\x0b\xf9\x42\xbe\x90\x2f\xe4\x0b\xf9\x42\xbe\x90\x2f\xe4\x0b\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x19\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x39\xf9\x9a\x7c\x4d\xbe\x26\x5f\x93\xaf\xc9\xd7\xe4\x6b\xf2\x35\xf9\x9a\x7c\x4d\xbe\x26\x5f\x93\xaf\xc9\xd7\xe4\x6b\xf2\x35\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x05\xf9\x86\x7c\x43\xbe\x21\xdf\x90\x6f\xc8\x37\xe4\x1b\xf2\x0d\xf9\x86\x7c\x43\xbe\x21\xdf\x90\x6f\xc8\x37\xe4\x1b\xf2\x0d\xf9\x96\x7c\x4b\xbe\x25\xdf\x92\x6f\xc9\xb7\xe4\x5b\xf2\x2d\xf9\x96\x7c\x4b\xbe\x25\xdf\x92\x6f\xc9\xb7\xe4\x5b\xf2\x2d\xf9\x8e\x7c\x47\xbe\x23\xdf\x91\xef\xc8\x77\xe4\x3b\xf2\x1d\xf9\x8e\x7c\x47\xbe\x23\xdf\x91\xef\xc8\x77\xe4\x3b\xf2\x1d\xf9\x1d\xf2\x3b\xe4\x77\xc8\xef\x90\xdf\x21\xbf\x43\x7e\x87\xfc\x0e\xf9\x1d\xf2\x3b\xe4\x77\xc8\xef\x90\xdf\x21\xbf\x43\x7e\x87\xfc\x0e\xf9\x5d\xf2\xbb\xe4\x77\xc9\xef\x92\xdf\x25\xbf\x4b\x7e\x97\xfc\x2e\xf9\x5d\xf2\xbb\xe4\x77\xc9\xef\x92\xdf\x25\xbf\x4b\x7e\x97\xfc\x2e\xf9\x9e\x7c\x4f\xbe\x27\xdf\x93\xef\xc9\xf7\xe4\x7b\xf2\x3d\xf9\x9e\x7c\x4f\xbe\x27\xdf\x93\xef\xc9\xf7\xe4\x7b\xf2\xf1\x3f\xc6\xff\x18\xff\x63\xfc\x8f\xf1\x3f\xc6\x7f\xea\x3f\x84\xfa\x0f\xa1\xfe\x43\xa8\xff\x10\xea\x3f\x84\xfa\x0f\xa1\xfe\x43\xa8\xff\x10\xea\x3f\x84\xfa\x0f\xa1\xfe\x43\xa8\xff\x10\xea\x3f\x84\xfa\x0f\xa1\xfe\x43\xa8\xff\x10\xea\x3f\x84\xfa\x0f\xa1\xfe\x43\xa8\xff\x10\xea\x3f\x84\xfa\x0f\xa1\xfe\x43\xa8\xff\x10\xea\x3f\x84\xfa\x0f\xa1\xfe\x43\xa8\xff\x10\xea\x3f\x84\xfa\x0f\xa1\xfe\x43\xa8\xff\x10\xea\x3f\x84\xfa\x0f\xa1\xfe\x43\xa8\xff\x10\xea\x3f\x24\xc6\xff\x18\xff\x63\xfc\x8f\xf1\x3f\xc6\xff\x18\xff\x63\xfc\xa7\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x11\xea\x46\x84\xba\x11\xa1\x6e\x44\xa8\x1b\x91\x18\xff\x63\xfc\x8f\xf1\x3f\xc6\xff\x18\xff\x63\xfc\x8f\xf1\x9f\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x85\xfb\xb3\x25\xc6\xff\x18\xff\xb9\x35\x5b\xb8\x35\x5b\xb8\x35\x5b\xb8\x35\x5b\xb8\x35\x5b\xb8\x35\x5b\xb8\x35\x5b\xb8\x35\x5b\xb8\x35\x5b\xb8\x35\x5b\xb8\x35\x5b\x62\xfc\x8f\xf1\x9f\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x85\x7b\xb2\x25\xc6\x7f\x66\x69\x97\x18\xff\x99\xad\x5d\x62\xfc\x67\xd6\x76\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\xe1\xde\x6b\x89\xf1\x9f\xfa\x2d\xa1\x7e\x4b\xa8\xdf\x12\xea\xb7\x84\xfa\x2d\xa1\x7e\x4b\xa8\xdf\x12\xea\xb7\x84\xfa\x2d\xa1\x7e\x4b\xa8\xdf\x12\xea\xb7\x84\xfa\x2d\xa1\x7e\x4b\xa8\xdf\x12\xea\xb7\x84\xfa\x2d\xa1\x7e\x4b\xa8\xdf\x12\xea\xb7\x84\xfa\x2d\xa1\x7e\x4b\xa8\xdf\x12\xea\xb7\x84\xfa\x2d\xa1\x7e\x4b\xa8\xdf\x12\xea\xb7\x84\xfa\x2d\x49\xf0\x3f\xc1\xff\x04\xff\xa9\xeb\x12\xea\xba\x84\xba\x2e\xa1\xae\x4b\xa8\xeb\x12\xea\xba\x84\xba\x2e\xa1\xae\x4b\xa8\xeb\x12\xea\xba\x24\xc1\xff\x04\xff\xb9\x71\x5b\x12\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\xa9\x07\x13\xea\xc1\x24\xc1\xff\x04\xff\xb9\xcd\x5b\xb8\xcd\x5b\x12\xfc\x4f\xf0\x9f\xfa\x31\x49\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\x7f\x6e\x2f\x97\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x9f\x7a\x3b\xa1\xde\x4e\xa8\xb7\x13\xea\xed\x84\x7a\x3b\xa1\xde\x4e\xa8\xb7\x13\xea\xed\x84\x7a\x3b\xa1\xde\x4e\xa8\xb7\x13\xea\xed\x84\x7a\x3b\xa1\xde\x4e\xa8\xb7\x13\xea\xed\x84\x7a\x3b\xa1\xde\x4e\xa8\xb7\x13\xea\xed\x84\x7a\x3b\xa1\xde\x4e\xa8\xb7\x13\xea\xed\x84\x7a\x3b\xa1\xde\x4e\xa8\xb7\x13\xea\xed\x24\xc1\xff\x04\xff\x13\xfc\xa7\x0e\x4f\x12\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\x19\xfb\xef\x8b\x49\x3f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\xa9\x4f\x14\xea\x13\x85\xfa\x44\xa1\x3e\x51\xa8\x4f\x14\xea\x13\x25\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\xff\x04\xff\x13\xfc\x4f\xf0\x3f\xc1\x7f\xfe\x03\x24\xc2\x7f\x80\x44\x12\xfc\xe7\x3f\x44\x22\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\x9f\xe0\x7f\x82\xff\x09\xfe\x27\xf8\xcf\xfc\x6b\xc2\x7f\xc1\x45\x14\xfe\x53\x6f\x2b\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xcf\xd4\x19\xc2\xd4\x19\xc2\xd4\x19\xc2\xd4\x19\xa2\xf0\x9f\xba\x5d\x51\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\xa6\xda\x10\x85\xff\xd4\xf9\x8a\xc2\x7f\x35\xf6\xdf\x17\xd9\xe4\x75\xf2\xf1\x5f\xe1\xbf\xc2\x7f\x85\xff\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x9f\x3a\x62\xa1\x8e\x58\x14\xfe\x2b\xfc\xa7\xae\x58\xa8\x2b\x16\x85\xff\x0a\xff\x15\xfe\x53\x6f\x2c\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\x85\xff\x0a\xff\x15\xfe\x53\xbf\x2c\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\x4f\x7d\xb3\x28\xfc\x57\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\x85\xff\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\xea\xa8\x85\x3a\x6a\x51\xf8\xaf\xf0\x9f\xba\x6a\x51\xf8\xaf\xf0\x5f\xe1\x3f\xf5\xd6\xa2\xf0\x5f\xe1\xbf\xc2\x7f\x85\xff\x0a\xff\xa9\xcb\x16\x85\xff\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\x85\xff\x0a\xff\x15\xfe\xab\xc9\xf1\x85\xff\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\x85\xff\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\x85\xff\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x5f\xe1\x3f\xf5\xea\x42\xbd\xba\x50\xaf\x2e\xd4\xab\x8b\xc2\x7f\xea\xd6\x85\xba\x75\xa1\x6e\x5d\xa8\x5b\x17\xea\xd6\x45\xe1\xbf\xc2\x7f\x85\xff\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x50\xcf\x2e\xd4\xb3\x0b\xf5\xec\x42\x3d\xbb\x28\xfc\x57\xf8\x4f\x7d\xbb\x50\xdf\x2e\xd4\xb7\x0b\xf5\xed\x42\x7d\xbb\x50\xdf\x2e\xd4\xb7\x8b\xc2\x7f\xea\xdc\x85\x3a\x77\x51\xf8\x4f\xbd\xbb\x28\xfc\x57\xf8\x4f\xfd\xbb\x50\xff\x2e\xd4\xbf\x8b\xc2\x7f\x85\xff\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\x85\xff\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\x85\xff\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\x85\xff\x0a\xff\x15\xfe\x2b\xfc\x57\xf8\xaf\xf0\x5f\xe1\xbf\xc2\x7f\x85\xff\x29\xfe\xa7\xf8\x9f\xe2\x7f\x8a\xff\x29\xfe\xa7\xf8\x9f\xe2\x7f\x8a\xff\x29\xfe\xa7\xf8\x9f\xe2\x7f\x8a\xff\x29\xfe\xa7\xf8\x9f\x8e\xfd\xf7\x05\xfb\x21\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfe\xfe\x4f\xf9\xfb\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\xd3\x78\x92\xcb\xf8\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\x1d\xfb\xef\x0b\x3d\x59\x26\x1f\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\x7f\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x13\xa6\x72\x93\x74\xb2\xbf\xf1\x9f\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x84\xa9\xdc\x24\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x53\xfc\x4f\xf1\x3f\xc5\xff\x14\xff\x99\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\x98\x9a\x4e\xd2\x89\x3b\xf8\xcf\xd4\x74\xc2\xd4\x74\xc2\xd4\x74\xc2\xd4\x74\xc2\xd4\x74\xc2\xd4\x74\xc2\xd4\x74\xc2\xd4\x74\xc2\xd4\x74\x92\xe2\x7f\x8a\xff\x29\xfe\xa7\xf8\x9f\xe2\x7f\x8a\xff\x29\xfe\xa7\xf8\x9f\xe2\x7f\x8a\xff\x29\xfe\xa7\xf8\x9f\xe2\x7f\x8a\xff\x29\xfe\xa7\xf8\x9f\xe2\x7f\x8a\xff\x29\xfe\xa7\xf8\x9f\xe2\x7f\x8a\xff\x29\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\x91\x9e\x30\x91\x9e\x30\x91\x9e\x30\x91\x9e\x30\x91\x9e\x30\x91\x9e\x30\x91\x9e\x30\x91\x9e\x08\xfe\x0b\xfe\x33\x8f\x9e\x30\x8f\x9e\x08\x7f\xff\x0b\xfe\x33\x8d\x9e\x30\x8d\x9e\x08\xfe\x0b\xfe\x33\x8b\x9e\x30\x8b\x9e\x08\xfe\x0b\xfe\x33\x89\x9e\x30\x89\x9e\x08\xfe\x0b\xfe\x33\x87\x9e\x30\x87\x9e\x30\x87\x9e\x30\x87\x9e\x30\x87\x9e\x30\x87\x9e\x08\xfe\x0b\xfe\x33\x85\x9e\x30\x85\x9e\x30\x85\x9e\x30\x85\x9e\x30\x85\x9e\x30\x85\x9e\x08\xfe\x0b\xfe\x33\x83\x9e\x30\x83\x9e\x30\x83\x9e\x30\x83\x9e\x30\x83\x9e\x30\x83\x9e\x30\xb7\x97\x08\xfe\x33\x81\x9e\x30\x81\x9e\x30\x81\x9e\x30\x81\x9e\x30\x81\x9e\x30\x81\x9e\x08\xfe\x0b\xfe\x33\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x30\x7f\x9e\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\x85\x9e\x30\x85\x9e\x30\x85\x9e\x30\x85\x9e\x30\x85\x9e\x30\x85\x9e\x30\x85\x9e\x30\x85\x9e\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\x45\x9f\x30\x45\x9f\x08\xfe\x0b\xfe\x33\x45\x9f\x30\x45\x9f\x08\xfe\x0b\xfe\x33\x49\x9f\x30\x49\x9f\x08\xfe\x0b\xfe\x33\x49\x9f\x30\x49\x9f\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\x6d\x9f\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\x1b\xa0\x30\x1b\xa0\x30\x1b\xa0\x30\x1b\xa0\x30\x1b\xa0\x30\x1b\xa0\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\x8d\xa0\x08\xfe\x0b\xfe\x33\xad\xa0\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\xed\xa0\x08\xfe\x0b\xfe\x33\x0d\xa1\x30\x0d\xa1\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\x4d\xa1\x30\x4d\xa1\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\x77\xa1\x30\x77\xa1\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\x77\xa2\x30\x77\xa2\x30\x77\xa2\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x33\xf1\xa2\x08\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x0b\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\xcf\x04\x91\xc2\x04\x91\x92\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x33\xb1\xa4\x30\xb1\xa4\x64\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x33\x71\xa5\x64\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x4c\x2e\x2a\x4c\x2e\x2a\x4c\x2e\x2a\x4c\x2e\x2a\x4c\x2e\x2a\x4c\x2e\x2a\x4c\x2e\x2a\x4c\x2e\x2a\x4c\x2e\x2a\x4c\x2e\x2a\x4c\x2e\x2a\x19\xfe\x67\xf8\xcf\xf4\xa2\x92\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x3f\x73\x8c\x0a\x73\x8c\x4a\x86\xff\x19\xfe\x67\xf8\xcf\x3c\xa3\xc2\x3c\xa3\x92\xe1\x3f\xf3\x8d\x4a\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x3f\xf3\x9d\x0a\xf3\x9d\x0a\xf3\x9d\x0a\xf3\x9d\x0a\xf3\x9d\x0a\xf3\x9d\x4a\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\x67\xf8\x9f\xe1\x7f\x86\xff\x19\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\xcc\xab\x2c\xcc\xab\x2c\xcc\xab\x2c\xcc\xab\x2c\x39\xfe\x33\xbf\xb2\xe4\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x3f\xf3\x39\x4b\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\x7f\x8e\xff\x39\xfe\xe7\xf8\x9f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\xbf\xc6\x7f\x8d\xff\x1a\xff\x35\xfe\x6b\xfc\xd7\xf8\xaf\xf1\x5f\xe3\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x33\x4f\xb2\x14\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x4f\xee\x2f\x29\xf0\xbf\xc0\xff\x02\xff\x99\xcf\x5a\x0a\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\x18\xfb\xef\x0b\x3d\x59\x26\x1f\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\x7f\x52\xef\xb9\x91\x87\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\xff\xe4\xbe\xbb\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\x9f\xf9\x99\xa5\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x2f\xf0\xbf\xc0\xff\x02\xff\x0b\xfc\x9f\xd4\x9d\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x5f\xe0\x7f\x81\xff\x05\xfe\x17\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xe1\xef\x7f\xc3\xdf\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf0\xdf\xe0\xbf\xc1\x7f\x83\xff\x06\xff\x0d\xfe\x1b\xfc\x37\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\x6f\xf1\xdf\xe2\xbf\xc5\x7f\x8b\xff\x16\xff\x2d\xfe\x5b\xfc\xb7\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xef\xf0\xdf\xe1\xbf\xc3\x7f\x87\xff\x0e\xff\x1d\xfe\x3b\xfc\x77\xf8\xcf\x7f\x0f\x58\x3a\xf8\xdf\xf9\x7f\x34\xdd\xb1\x0d\x65\xe7\x8e\x06\xc1\x9c\xde\x8a\xfd\x41\xee\x3d\xff\x28\xff\x90\xd6\xa9\x09\x81\x56\x03\x04\xc1\xd2\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x79\xed\xf7\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\x3f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\xef\x8f\xfe\xf3\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xfb\xa3\xff\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\xff\xf7\xf7\x5e\x8e\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\x7f\xf4\x9f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xfd\xf9\x3b\x8f\xfe\xf3\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xfb\x9f\xfe\xf3\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\xef\xff\xf4\x9f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xf7\x8f\xfe\xf3\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xf7\x8f\xfe\xf3\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xff\xfb\xf7\x6f\x97\xf5\x9f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\x7f\xf7\x0c\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xfe\xd5\x7f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xfc\x33\x8e\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\xdf\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\xa7\xff\x9f\xfe\x7f\xfa\xff\xe9\xff\xa7\xff\x9f\xfe\x7f\xfa\xff\xe9\xff\xa7\xff\x9f\xfe\x7f\xfa\xff\xe9\xff\xa7\xff\x9f\xfe\x7f\xfa\xff\xe9\xff\xa7\xff\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xfb\xa3\xff\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\xdf\xff\xf4\x9f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xd2\x7f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\xef\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\x7f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\xff\xff\x34\xdd\xb1\x71\xf0\xea\xb2\x24\x41\x97\x6e\xec\x4f\x72\xaa\x45\x02\x24\xfd\x37\x69\x85\x97\xc7\x82\x12\x80\x88\x96\xe6\xcb\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xc7\xff\x3f\xfe\xff\xf1\xff\x8f\xff\x7f\xfc\xff\xe3\xff\x1f\xff\xff\xf8\xff\xf1\xff\xff\xdc\x99\xc5\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\xdf\xff\xfe\xfb\x2e\xff\xf4\xff\xe9\xff\xd3\xff\xa7\xff\x4f\xff\x9f\xfe\x3f\xfd\x7f\xfa\xff\xf4\xff\xe9\xff\xd3\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd0\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd4\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\xff\xd2\x3f\xfd\xd3\x3f\xfd\xd3\x3f\xfd\xd3\x3f\xfd\xd3\x3f\xfd\xd3\x3f\xfd\xd3\x3f\xfd\xd3\x3f\xfd\xd3\x4f\x3f\xfd\xf4\xd3\x4f\x3f\xfd\xf4\xd3\x4f\x3f\xfd\xf4\xd3\x4f\x3f\xfd\xf4\xd3\x9f\xfe\xf4\xa7\x3f\xfd\xe9\x4f\x7f\xfa\xd3\x9f\xfe\xf4\xa7\x3f\xfd\xe9\x4f\x7f\xfa\xd3\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\xff\xd6\x7f\xf4\x1f\xfd\x47\xff\xd1\x7f\xf4\x1f\xfd\x47\xff\xd1\x7f\xf4\x1f\xfd\x47\xff\xd1\x7f\xf4\x1f\xfd\x47\xff\xd1\x7f\xf5\x5f\xfd\x57\xff\xd5\x7f\xf5\x5f\xfd\x57\xff\xd5\x7f\xf5\x5f\xfd\x57\xff\xd5\x7f\xf5\x5f\xfd\x57\xff\xd5\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd1\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd5\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xff\xd3\xb7\xff\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xf7\xdf\xbb\x4c\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\x7b\xec\xff\x63\xff\x1f\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xec\xff\x63\xff\x1f\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xed\xff\x6b\xff\x5f\xfb\xff\xda\xff\xd7\xfe\xbf\xf6\xff\xb5\xff\xaf\xfd\x7f\xed\xff\x6b\xff\x5f\xfb\xff\xda\xff\xd7\xfe\xbf\xf6\xff\xb5\xff\xaf\xfd\x7f\xed\x3f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x8f\xff\x1f\xff\x3f\xfe\x7f\xfc\xff\xf8\xff\xf1\xff\xe3\xff\xc7\xff\x1f\xff\x7f\xff\xfb\xbf\xfd\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\xff\x6f\xff\xfd\x87\xf6\x9f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xfe\x9f\xfd\xe7\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\xbf\xff\xee\xae\xf9\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\xe3\xff\x8f\xff\x3f\xfe\xff\xf8\xff\x7b\xec\xff\x63\xff\x1f\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xec\xff\x63\xff\x1f\xfb\xff\xd8\xff\xc7\xfe\x3f\xf6\xff\xb1\xff\x8f\xfd\x7f\xed\xff\x6b\xff\x5f\xfb\xff\xda\xff\xd7\xfe\xbf\xf6\xff\xb5\xff\xaf\xfd\x7f\xed\xff\x6b\xff\x5f\xfb\xff\xda\xff\xd7\xfe\xbf\xf6\xff\xb5\xff\xaf\xfd\x7f\xed\x3f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xfc\xff\xf1\xff\xc7\xff\x1f\xff\x7f\xff\x9f\xa6\x7b\x37\xa2\x73\xc7\x81\x30\x98\xd2\xfd\x5f\x24\x61\x02\x23\x9d\xfc\x43\x5a\x43\xbd\x11\xc0\xfc\x0a\x35\x46\xf3\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\x3b\xff\xef\x43\xdc\x8f\xfb\x71\x3f\xee\xc7\xfd\xb8\x1f\xf7\xe3\x7e\xdc\x8f\xfb\x71\x3f\xee\xff\x71\xff\x8f\xfb\x7f\xdc\xff\xe3\xfe\x1f\xf7\xff\xb8\xff\xc7\xfd\x3f\xee\xff\x71\xff\x8f\xfb\x7f\xdc\xff\xe3\xfe\x1f\xf7\xff\xb8\xff\xc7\xfd\x3f\xee\xff\x75\xff\xaf\xfb\x7f\xdd\xff\xeb\xfe\x5f\xf7\xff\xba\xff\xd7\xfd\xbf\xee\xff\x75\xff\xaf\xfb\x7f\xdd\xff\xeb\xfe\x5f\xf7\xff\xba\xff\xd7\xfd\xbf\xee\xff\xdc\xff\xb9\xff\x73\xff\xe7\xfe\xcf\xfd\x9f\xfb\x3f\xf7\x7f\xee\xff\xdc\xff\xb9\xff\x73\xff\xe7\xfe\xcf\xfd\x9f\xfb\x3f\xf7\xff\xfd\x87\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xdb\x3e\xdc\xf6\xe1\xb6\x0f\xb7\x7d\xb8\xed\xc3\x6d\x1f\x6e\xfb\x70\xdb\x87\xfb\xff\xfb\xf0\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\x9f\xfe\xff\xf4\xff\xa7\xff\x3f\xfd\xff\xe9\xff\x4f\xff\x7f\xfa\xff\xd3\xff\xdf\xbf\xfe\xcf\x7f\xff\xfa\x3f\xff\xfd\xeb\xff\xfc\xf7\xaf\xff\xf3\xdf\xbf\xfe\xcf\x7f\xff\xfa\x3f\xff\xfd\xeb\xff\xfc\xf7\xaf\xff\xf3\xdf\xbf\xfe\xcf\x7f\xff\xfa\x3f\xff\xfd\xeb\xff\xfc\xf7\xaf\xff\xf3\xdf\xbf\xfe\xcf\x7f\xff\xfa\x3f\xff\xfd\xeb\xff\xfc\xf7\xaf\xff\xf3\xdf\x7f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\x5f\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\xdf\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\x3f\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\xbf\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x7f\xee\x2f\xf7\x97\xfb\xcb\xfd\xe5\xfe\x72\x7f\xb9\xbf\xdc\x5f\xee\x2f\xf7\x97\xfb\xcb\xfd\xe5\xfe\x72\x7f\xb9\xbf\xdc\x5f\xee\x6f\xf7\xb7\xfb\xdb\xfd\xed\xfe\x76\x7f\xbb\xbf\xdd\xdf\xee\x6f\xf7\xb7\xfb\xdb\xfd\xed\xfe\x76\x7f\xbb\xbf\xdd\xdf\xee\x1f\xf7\x8f\xfb\xc7\xfd\xe3\xfe\x71\xff\xb8\x7f\xdc\x3f\xee\x1f\xf7\x8f\xfb\xc7\xfd\xe3\xfe\x71\xff\xb8\x7f\xdc\x3f\xee\x97\xfb\xe5\x7e\xb9\x5f\xee\x97\xfb\xe5\x7e\xb9\x5f\xee\x97\xfb\xe5\x7e\xb9\x5f\xee\x97\xfb\xe5\x7e\xb9\x5f\xee\xb7\xfb\xed\x7e\xbb\xdf\xee\xb7\xfb\xed\x7e\xbb\xdf\xee\xb7\xfb\xed\x7e\xbb\xdf\xee\xb7\xfb\xed\x7e\xbb\xdf\xee\x8f\xfb\xe3\xfe\xb8\x3f\xee\x8f\xfb\xe3\xfe\xb8\x3f\xee\x8f\xfb\xe3\xfe\xb8\x3f\xee\x8f\xfb\xe3\xfe\xb8\x3f\xee\xc7\xfd\xb8\x1f\xf7\xe3\x7e\xdc\x8f\xfb\x71\x3f\xee\xc7\xfd\xb8\x1f\xf7\xe3\x7e\xdc\x8f\xfb\x71\x3f\xee\xff\x71\xff\x8f\xfb\x7f\xdc\xff\xe3\xfe\x1f\xf7\xff\xb8\xff\xc7\xfd\x3f\xee\xff\x71\xff\x8f\xfb\x7f\xdc\xff\xe3\xfe\x1f\xf7\xff\xb8\xff\xc7\xfd\x3f\xee\xff\x75\xff\xaf\xfb\x7f\xdd\xff\xeb\xfe\x5f\xf7\xff\xba\xff\xd7\xfd\xbf\xee\xff\x75\xff\xaf\xfb\x7f\xdd\xff\xeb\xfe\x5f\xf7\xff\xba\xff\xd7\xfd\xbf\xee\xff\xdc\xff\xb9\xff\x73\xff\xe7\xfe\xcf\xfd\x9f\xfb\x3f\xf7\x7f\xee\xff\xdc\xff\xb9\xff\x73\xff\xe7\xfe\xcf\xfd\x9f\xfb\x3f\xf7\xf5\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd2\xff\x4b\xff\x2f\xfd\xbf\xf4\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd6\xff\x5b\xff\x6f\xfd\xbf\xf5\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd1\xff\x47\xff\x1f\xfd\x7f\xf4\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd5\xff\x57\xff\x5f\xfd\x7f\xf5\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\xff\xd3\xff\x4f\xff\x3f\xfd\xff\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xe9\xff\xd2\xff\xa5\xff\x4b\xff\x97\xfe\x2f\xfd\x5f\xfa\xbf\xf4\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\x7f\xeb\xff\xd6\xff\xad\xff\x5b\xff\xb7\xfe\x6f\xfd\xdf\xfa\xbf\xf5\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf4\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\xbf\xf5\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x7f\xf4\x9f\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x9f\x9f\xfe\xf3\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\x87\xff\x3f\xfc\xff\xe1\xff\x0f\xff\x7f\xf8\xff\xc3\xff\x1f\xfe\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\xc3\xff\x0f\xff\x3f\xfc\xff\xf0\xff\x73\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\xff\xe8\xff\xd1\xff\xa3\xff\x47\xff\x8f\xfe\x1f\xfd\x3f\xfa\x7f\xf4\x9f\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\x7f\xf8\xff\xe1\xff\x87\xff\x1f\xfe\xff\xff\xb8\xfa\x9f\xdd\xdb\xb3\x2b\xbb\xf2\xeb\x19\xb6\x25\x19\x55\xf6\x73\xd8\x38\x7f\x7e\xdf\xb5\x36\x9b\x8c\x39\x63\xb7\xdc\xf5\x03\xb0\x28\x4a\x45\x3b\x33\x69\x30\x99\x82\xec\xa7\x2f\x88\x39\x32\x46\xa2\xd8\xb9\xe7\xdc\xb8\x37\x16\x6e\x04\x30\xc1\x00\x06\xf6\x27\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x1f\xfc\xff\xe0\xff\x07\xff\x3f\xf8\xff\xc1\xff\x0f\xfe\x7f\xf0\xff\x83\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\xc5\xff\x2f\xfe\x7f\xf1\xff\x8b\xff\x5f\xfc\xff\xe2\xff\x17\xff\xbf\xf8\xff\x17\x1f\xf5\xe2\xa2\x5e\x5c\xd4\x8b\x8b\x7a\x71\x51\x2f\x2e\xea\xc5\x45\xbd\xb8\xa8\x17\x17\xf5\xe2\xa2\x5e\x5c\xd4\x8b\x8b\x7a\x71\x51\x2f\x2e\xea\xc5\x45\xbd\xb8\xa8\x17\x17\xf5\xe2\xa2\x5e\x5c\xd4\x8b\x8b\x7a\x71\x51\x2f\x2e\xea\xc5\x45\xbd\xb8\xa8\x17\x17\xf5\xe2\xa2\x5e\x5c\xd4\x8b\x8b\x7a\x71\x51\x2f\x2e\xea\xc5\x45\xbd\xb8\xa8\x17\x17\xf5\xe2\xa2\x5e\x5c\xd4\x8b\x8b\x7a\x71\x51\x2f\x2e\xea\xc5\x45\xbd\xb8\xa8\x17\x17\xf5\xe2\xa2\x5e\x5c\xd4\x8b\x8b\x7a\x71\x51\x2f\x2e\xea\xc5\x45\xbd\xb8\xa8\x17\x17\xf5\xe2\xa2\x5e\x5c\xd4\x8b\x87\x7a\xf1\x50\x2f\x1e\xea\xc5\x43\xbd\x78\xa8\x17\x0f\xf5\xe2\xa1\x5e\x3c\xd4\x8b\x87\x7a\xf1\x50\x2f\x1e\xea\xc5\x43\xbd\x78\xa8\x17\x0f\xf5\xe2\xa1\x5e\x3c\xd4\x8b\x87\x7a\xf1\x50\x2f\x1e\xea\xc5\x43\xbd\x78\xa8\x17\x0f\xf5\xe2\xa1\x5e\x3c\xd4\x8b\x87\x7a\xf1\x50\x2f\x1e\xea\xc5\x43\xbd\x78\xa8\x17\x0f\xf5\xe2\xa1\x5e\x3c\xd4\x8b\x87\x7a\xf1\x50\x2f\x1e\xea\xc5\x43\xbd\x78\xa8\x17\x0f\xf5\xe2\xa1\x5e\x3c\xd4\x8b\x87\x7a\x71\x50\x2f\x0e\xea\xc5\x41\xbd\x38\xa8\x17\xff\xf4\xe2\x9f\x5e\xfc\xd3\x8b\x7b\x7a\x71\x4f\x2f\xee\xe9\xc5\x3d\xbd\xb8\xa7\x17\xf7\xf4\xe2\x9e\x5e\xdc\xd3\x8b\x7b\x7a\x71\x4f\x2f\xee\xe9\xc5\x3d\xbd\xb8\xa7\x17\xf7\xf4\xe2\x9e\x5e\xdc\xd3\x8b\x7b\x7a\x71\x4f\x2f\xee\xe9\xc5\x3d\xbd\xb8\xa7\x17\xf7\xf4\xe2\x9d\x5e\x7c\xd3\x8b\x6f\x7a\xf1\x4d\x2f\xbe\xe9\xc5\x37\xbd\xf8\xa6\x17\xdf\xf4\xe2\x9b\x5e\x5c\xd3\x8b\x6b\x7a\x71\x4d\x2f\x9e\xe9\xc5\x33\xbd\x78\xa6\x17\xcf\xf4\xe2\x99\x5e\x3c\xd3\x8b\x67\x7a\xf1\x4c\x2f\x9e\xe9\xc5\x33\xbd\x78\xa6\x17\xcf\xf4\xe2\x99\x5e\x3c\xd3\x8b\x67\x7a\xf1\x4c\x2f\x9e\xe9\xc5\x33\xbd\x78\xa6\x17\xcf\xf4\xfe\xee\xdf\xf6\xec\xf7\xdc\xff\x3d\xf7\x7f\xcf\xfd\xdf\x73\xff\xf7\xdc\xff\x3d\xf7\x7f\xcf\xfd\xdf\x73\xff\xf7\xdc\xff\x3d\xf7\x7f\xcf\xfd\xdf\x73\xff\x17\xee\xff\xc2\xfd\x5f\xb8\xff\x0b\xf7\x7f\xe1\xfe\x2f\xdc\xff\x85\xfb\xbf\x70\xff\x17\xee\xff\xc2\xfd\x5f\xb8\xfb\x0b\x77\x7f\xe1\xee\x2f\xdc\xfd\x85\xbb\xe1\x6e\xb8\x1b\xee\x86\xbb\xe1\x6e\xb8\x1b\xee\x86\xbb\xe1\x6e\xb8\x1b\xfe\xdc\xe1\x7e\xb8\x1f\xee\x87\xfb\xe1\x7e\xb9\x5f\xee\x97\xfb\xe5\x7e\xb9\x5f\xee\x97\xfb\xe5\x7e\xb9\x5f\xee\x97\xfb\xe5\x7e\xb9\x5f\xee\x97\xbb\xbf\x72\xf7\x57\xee\xfe\xca\xdd\x5f\xb9\xfb\x2b\x77\x7f\xe5\xee\xaf\xdc\xfd\x95\xbb\xbf\x72\xf7\x57\xee\xfe\xca\xdd\x5f\xb9\xfb\x2b\x77\x7f\xe5\xee\xaf\xfc\xb9\x7f\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xe5\xfe\xbf\xfe\xf7\xcb\xc5\x2f\xbd\xf8\xa5\x17\xbf\xf4\xe2\x97\x5e\xfc\xd2\x8b\x5f\x7a\xf1\x4b\x2f\x7e\xe9\xc5\x2f\xbd\xf8\xa5\x17\xbf\xf4\xe2\x97\x5e\xfc\xd2\x8b\x5f\x7a\xf1\x4b\x2f\x7e\xe9\xc5\x2f\xbd\xf8\xa5\x17\xbf\xf4\xe2\x97\x5e\xfc\xd2\x8b\x5f\x7a\xf1\x4b\x2f\x7e\xe9\xc5\x2f\xbd\xf8\xa5\x17\xbf\xf4\xe2\x97\x5e\xfc\xd2\x8b\x5f\x7a\xf1\x4b\x2f\x7e\xe9\xc5\x2f\xbd\xf8\xa5\x17\xbf\xf4\xe2\x97\x5e\xfc\xd2\x8b\x5f\x7a\xf1\x4b\x2f\x7e\xe9\xc5\x2f\xbd\xf8\xa5\x17\xbf\xf4\xe2\x97\x5e\xfc\xd2\xfb\xfb\x4f\xff\xe3\xff\xf8\xf1\x97\xd7\xe7\xff\xf1\x8f\x7f\xf9\xa7\xbf\xf0\xe5\xfb\xef\xbf\xfc\xf8\xe5\xd7\x7b\xff\xfe\xe5\xef\xbf\x97\x37\x4e\x2f\x6f\x9c\x5e\xde\x36\xbd\xbc\x6d\x7a\x79\xdb\xf4\xf2\xb6\xe9\xe5\x6d\xd3\xcb\xdb\xa6\x97\xb7\x4d\x2f\x6f\x9b\x5e\xde\x36\xbd\xbc\x6d\x7a\x79\xdb\xf4\xf2\xb6\xe9\xe5\x6d\xd3\xcb\xdb\xa6\x97\xb7\x4d\x2f\x6f\x9b\x5e\xde\x36\xbd\xbc\x6d\x7a\x79\xbb\xf4\xf2\x76\xe9\xe5\xed\xd2\xcb\xdb\xa5\x97\xb7\x4b\x2f\x6f\x97\x5e\xde\x2e\xbd\xbc\x5d\x7a\x79\xbb\xf4\xf2\x76\xe9\xe5\xcd\xd2\xcb\x9b\xa5\x97\x37\x4b\x2f\x6f\x96\x5e\xde\x2a\xbd\xbc\x55\x7a\x79\xab\xf4\xf2\x56\xe9\xe5\xad\xd2\xcb\x5b\xa5\x97\xb7\x4a\x2f\x6f\x95\x5e\xde\x2a\xbd\xbc\x55\x7a\x79\xab\xf4\xf2\x56\xe9\xe5\xad\xd2\xcb\x5b\xa5\x97\x37\x4a\x2f\x6f\x94\x5e\xde\x28\xbd\xbf\xce\x2f\x7f\xff\x97\x75\x6f\xfc\x97\xc5\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\x10\xe0\xe5\x21\xc0\xcb\x43\x80\x97\x87\x00\x2f\x0f\x01\x5e\x1e\x02\xbc\x3c\x04\x78\x79\x08\xf0\xf2\xf0\xdf\xe5\xe1\xbf\xcb\xc3\x7f\x97\x87\xff\x2e\x0f\xff\x5d\x1e\xfe\xbb\x3c\xfc\x77\x79\xf8\xef\xf2\xf0\xdf\xe5\xe1\xbf\xcb\xc3\x7f\x97\x87\xff\x2e\x0f\xff\x5d\x1e\xfe\xbb\x3c\xfc\x77\x79\xf8\xef\xf2\xf0\xdf\xe5\xe1\xbf\xcb\xc3\x7f\x97\x87\xff\x2e\x0f\xff\x5d\x1e\xfe\xbb\x3c\xfc\x77\x2f\xff\x07\x98\x87\xff\x2e\x0f\xff\x5d\x1e\xfe\xbb\x3c\xfc\x77\x79\xf8\xef\xf2\xf0\xdf\xe5\xe1\xbf\xcb\xc3\x7f\x97\x87\xff\x2e\x0f\xff\x5d\x1e\xfe\xbb\x3c\xfc\x77\x79\xf8\xef\xf2\xf0\xdf\xe5\xe1\xbf\xcb\xc3\x7f\x97\x87\xff\x2e\x0f\xff\x5d\x1e\xfe\xbb\x3c\xfc\x77\x79\xf8\xef\xf2\xf0\xdf\xe5\xe1\xbf\xcb\xc3\x7f\x97\x87\xff\x2e\x0f\xff\x5d\x1e\xfe\xbb\x3c\xfc\x77\x79\xf8\xef\xf2\xf0\xdf\xe5\xe1\xbf\xcb\xc3\x7f\x97\x87\xff\x2e\x0f\xff\x5d\x1e\xfe\xbb\x3c\xfc\x77\x79\xf8\xef\xf2\xf0\xdf\xe5\xe1\xbf\xcb\xc3\x6f\x97\x87\xdf\x2e\x0f\xbf\x5d\x1e\x7e\xbb\x3c\xfc\x76\x79\xf8\xed\xde\x5f\x87\xb1\xec\xdf\xc7\xf2\x3f\xfc\xeb\x97\xbf\xff\xef\xff\xf0\x2f\xef\xd7\xcf\xeb\xf5\xf7\x1f\x3e\xe7\xef\x3f\xfc\xf4\x5f\x7f\xf8\xf5\x5f\x7f\xf8\x1f\xbf\xa4\xdf\x57\xfe\xd3\x1f\xff\x7f\x7f\xfd\xf3\x3f\xfc\xc3\x9f\xff\xf8\xbf\xfc\xf5\x4f\xff\xed\x4f\xff\xc7\xff\xfc\x97\xbf\xfd\xc3\x9f\xfe\xf9\x9f\xff\xdf\xff\xd3\x1f\xff\xf0\xd7\xbf\xfc\xd3\x1f\xff\xf2\x8f\xff\xf8\x87\x3f\xfc\xf1\x8f\x7f\xfa\xa7\xbf\xfd\x87\x7f\xf7\xf9\x7f\xfe\x77\x9f\xff\xfa\x97\xbf\xfd\xe1\x6f\x7f\xfa\x8f\xff\xff\x3f\xfd\xf5\x2f\xff\xfc\x2f\xff\xdf\x3f\xfd\xf5\xcf\x7f\xf9\xeb\x7f\xfc\x2f\x7f\xf9\x97\xbf\xfa\xe5\xcf\xff\xed\x4f\xff\xf6\xe5\x3f\xfc\xf3\x9f\xff\xfb\xbf\x7d\xfe\x4f\xff\xfc\xa7\xff\xf6\xa7\x7f\xfa\xed\xdb\x9f\xfe\xfc\x5f\xff\xd7\xbf\xfd\xf6\x9b\xfe\xe9\xcf\xff\xf4\xdb\x6f\xfa\x3f\xfd\xe7\x3f\xfc\xf3\x9f\xff\xf0\x97\xff\xfe\xe7\x3f\xfc\xdf\xfe\xf8\xe7\xbf\xfe\xf1\x5f\xfe\xf1\xbf\xfc\xc3\x9f\xfe\xfb\x1f\xfe\xf8\x2f\x7f\xfb\xd3\x1f\xff\xf2\x8f\xff\xcb\xbf\xfb\xb9\xff\xfa\xd7\x3f\xfc\xb7\xbf\xff\xdc\xff\xd5\x9f\xfb\x5f\xff\xf2\x97\xff\xcf\xff\xee\x97\xfd\xed\xcf\xff\xf0\x9f\xff\xfe\xcb\xfe\x2f\x7f\xff\x23\xff\xf6\x77\xfa\xd7\xaf\xbf\xfd\x4d\xfe\xd3\xdf\xbf\xfe\xdb\xef\xff\xd7\xbf\xf8\xdb\x6f\xfd\x9f\xfe\xed\x9f\xda\xff\xf8\xeb\xff\xf0\xa7\xff\xf2\xb7\xff\xf9\xb7\x7f\x8c\x7f\xfe\xaf\xff\xe3\xe7\xfe\x5f\xf9\xdf\xff\xcc\xff\x33\xff\xe7\xff\xfa\xd7\x3f\xfd\x97\xff\xfb\xfe\xee\x79\x7e\xfc\xf8\xf5\xe3\xc7\x8f\x6f\x3f\xbe\x7e\xfb\xf8\xf3\x3b\x3f\x1e\x3f\xae\x1f\xc7\x8f\x8f\x1f\xbd\xf6\xe3\xb5\x1f\xaf\xfd\x78\xed\xc7\x6b\x5f\xaf\x7d\xbd\xf6\xf5\xda\xd7\x6b\x5f\xaf\x7d\xbd\xf6\xf5\xda\xd7\x6b\x5f\xaf\x7d\xbd\xf6\xf1\xda\xc7\x6b\x1f\xaf\x7d\xbc\xf6\xf1\xda\xc7\x6b\x1f\xaf\x7d\xbc\xf6\xf1\xda\xc7\x6b\x6f\xaf\xbd\xbd\xf6\xf6\xda\xdb\x6b\x6f\xaf\xbd\xbd\xf6\xf6\xda\xdb\x6b\x6f\xaf\xbd\xbd\xf6\xf2\xda\xcb\x6b\x2f\xaf\xbd\xbc\xf6\xf2\xda\xcb\x6b\x2f\xaf\xbd\xbc\xf6\xf2\xda\xeb\xb7\x6b\x3f\xbf\xfb\x9d\x1f\x8f\x1f\xd7\x8f\xe3\xc7\xc7\x8f\x3f\x7e\xfc\xfa\xf1\xe3\xc7\xb7\x1f\xbd\x76\xbc\x76\xbc\x76\xbc\x76\xbc\x76\xbc\x76\xbc\x76\xbc\x76\xbc\x76\xbc\x76\xbc\xb6\x5e\x5b\xaf\xad\xd7\xd6\x6b\xeb\xb5\xf5\xda\x7a\x6d\xbd\xb6\x5e\x5b\xaf\x8d\xd7\xc6\x6b\xe3\xb5\xf1\xda\x78\x6d\xbc\x36\x5e\x1b\xaf\x8d\xd7\xc6\x6b\x8f\xd7\x1e\xaf\x3d\x5e\x7b\xbc\xf6\x78\xcd\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\x1f\xb7\xe4\xc7\x2d\xf9\x71\x4b\x7e\xdc\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xba\x25\x5f\xb7\xe4\xeb\x96\x7c\xdd\x92\xaf\x5b\xf2\x75\x4b\xbe\x6e\xc9\xd7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\x8f\x5b\xf2\x71\x4b\x3e\x6e\xc9\xc7\x2d\xf9\xb8\x25\x1f\xb7\xe4\xe3\x96\x7c\xdc\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xbb\x25\x6f\xb7\xe4\xed\x96\xbc\xdd\x92\xb7\x5b\xf2\x76\x4b\xde\x6e\xc9\xdb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\xdc\x92\x97\x5b\xf2\x72\x4b\x5e\x6e\xc9\xcb\x2d\x79\xb9\x25\x2f\xb7\xe4\xe5\x96\xbc\x7e\xdb\x92\xf3\xbb\xdf\xb6\xe4\xfc\xee\xb7\x2d\x39\xbf\xfb\x6d\x4b\xce\xef\x7e\xdb\x92\xf3\xbb\xdf\xb6\xe4\xfc\xee\xb7\x2d\x39\xbf\xfb\x6d\x4b\xce\xef\x7e\xdb\x92\xf3\xbb\xdf\xb6\xe4\xfc\xee\x77\x5e\x3b\x5e\x3b\x5e\x3b\x5e\x3b\x5e\x3b\x5e\x3b\x5e\x3b\x5e\x3b\x5e\x3b\x5e\x3b\x5e\x5b\xaf\xad\xd7\xd6\x6b\xeb\xb5\xf5\xda\x7a\x6d\xbd\xb6\x5e\x5b\xaf\xad\xd7\xc6\x6b\xe3\xb5\xf1\xda\x78\x6d\xbc\x36\x5e\x1b\xaf\x8d\xd7\xc6\x6b\xe3\xb5\xc7\x6b\x8f\xd7\x1e\xaf\x3d\x5e\x7b\xbc\xf6\x78\xed\xf1\xda\xe3\xb5\xc7\x6b\x8f\xd7\x7e\xbc\xf6\xe3\xb5\x1f\xaf\xfd\x78\xed\xc7\x6b\x3f\x5e\xfb\xf1\xda\x8f\xd7\x7e\xbc\xf6\xe3\xb5\xaf\xd7\xbe\x5e\xfb\x7a\xed\xeb\xb5\xaf\xd7\xbe\x5e\xfb\x7a\xed\xeb\xb5\xaf\xd7\xbe\x5e\xfb\x78\xed\xe3\xb5\x8f\xd7\x3e\x5e\xfb\x78\xed\xe3\xb5\x8f\xd7\x3e\x5e\xfb\x78\xed\xe3\xb5\xb7\xd7\xde\x5e\x7b\x7b\xed\xed\xb5\xb7\xd7\xde\x5e\x7b\x7b\xed\xed\xb5\xb7\xd7\xde\x5e\x7b\x79\xed\xe5\xb5\x97\xd7\x5e\x5e\x7b\x79\xed\xe5\xb5\x97\xd7\x5e\x5e\x7b\x79\xcd\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\xe3\x96\x1c\xb7\xe4\xb8\x25\xc7\x2d\x39\x6e\xc9\x71\x4b\x8e\x5b\x72\xdc\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x75\x4b\xd6\x2d\x59\xb7\x64\xdd\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\x71\x4b\xc6\x2d\x19\xb7\x64\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\x79\xdc\x92\xc7\x2d\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\xf5\xd8\xbd\x1e\xbb\xd7\x63\xf7\x7a\xec\x5e\x8f\xdd\xeb\xb1\x7b\x3d\x76\xaf\xc7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xed\x5e\xd7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\x75\xec\x5e\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xc7\xee\xf5\xb1\x7b\x7d\xec\x5e\x1f\xbb\xd7\xe7\x7f\x23\xd2\x4e\xad\xed\x8a\x62\x20\x0a\xa6\xa4\xf1\x1e\x39\xff\xc4\xbc\x3e\x79\xc5\x9a\x35\xdb\xa8\xb8\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe5\x5e\x97\x7b\x5d\xee\x75\xb9\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe1\x5e\x87\x7b\x1d\xee\x75\xb8\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe6\x5e\x9b\x7b\x6d\xee\xb5\xb9\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe2\x5e\x8b\x7b\x2d\xee\xb5\xb8\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe4\x5e\x93\x7b\x4d\xee\x35\xb9\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\xb8\xd7\xe0\x5e\x83\x7b\x0d\xee\x35\x7e\xee\xf5\xfb\xf7\x73\xaf\x7f\xf3\xcc\x67\x7e\xe6\x9a\x63\xb6\x59\x66\x9a\xde\xce\xdb\x79\x3b\x6f\xe7\xed\xbc\x9d\xb7\xf3\x76\xde\xce\xdb\x79\x7b\xde\x9e\xb7\xe7\xed\x79\x7b\xde\x9e\xb7\xe7\xed\x79\x7b\xde\x9e\xb7\xcf\xdb\xe7\xed\xf3\xf6\x79\xfb\xbc\x7d\xde\x3e\x6f\x9f\xb7\xcf\xdb\xe7\x6d\xbd\xad\xb7\xf5\xb6\xde\xd6\xdb\x7a\x5b\x6f\xeb\x6d\xbd\xad\xb7\xf1\x36\xde\xc6\xdb\x78\x1b\x6f\xe3\x6d\xbc\x8d\xb7\xf1\x36\xde\xda\x5b\x7b\x6b\x6f\xed\xad\xbd\xb5\xb7\xf6\xd6\xde\xda\x5b\x7b\x2b\x6f\xe5\xad\xbc\x95\xb7\xf2\x56\xde\xca\x5b\x79\x2b\x6f\xe5\x2d\xbd\xa5\xb7\xf4\x96\xde\xd2\x5b\x7a\x4b\x6f\xe9\x2d\xbd\xa5\xb7\xf0\x16\xde\xc2\x5b\x78\x0b\x6f\xe1\x2d\xbc\x85\xb7\xf0\xa6\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\xb4\xe4\x69\xc9\xd3\x92\xa7\x25\x4f\x4b\x9e\x96\x3c\x2d\x79\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xf2\x69\xc9\xa7\x25\x9f\x96\x7c\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\xb2\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\x32\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\xd2\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x52\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x92\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\x12\x5a\xc2\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x1e\xf7\x7a\xdc\xeb\x71\xaf\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\x3e\xee\xf5\x71\xaf\x8f\x7b\x7d\xdc\xeb\xe3\x5e\x1f\xf7\xfa\xb8\xd7\xc7\xbd\xfe\x67\xd3\x5e\x62\xe3\x3a\xcf\xfb\x8f\x73\x78\x8d\x64\xe9\x2f\xd9\xfe\xdb\x35\x93\xa6\x93\x4d\x57\x04\x12\x0e\xc9\xe7\xf7\x1b\xa2\x8b\x8a\x73\x93\x15\xbb\x96\x63\x99\xb0\x2d\x2f\xec\x11\x39\x26\x27\x26\x67\xd4\x99\xa1\x6f\x9b\x78\x13\x34\x9b\x14\x46\x5a\xc5\x29\xe0\xb4\x5d\xb5\x4d\x6f\x91\xbd\x28\x5c\x03\x45\x8a\x02\x5d\x27\x48\x2f\xab\xba\xce\x22\xcd\xd6\xe9\xa6\x08\x6c\xa7\x2a\x38\xe7\xe1\xf9\x52\x46\x04\x81\xcf\x3b\x67\xe6\xbc\xbf\xe7\x7d\xcf\x1c\x82\x33\xf8\x18\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x1a\xf7\x6a\xdc\xab\x71\xaf\xc6\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x0a\xf7\x2a\xdc\xab\x70\xaf\xc2\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb8\xd7\xc0\xbd\x06\xee\x35\x70\xaf\x81\x7b\x0d\xdc\x6b\xe0\x5e\x03\xf7\x1a\xb1\xee\xa5\xa3\x41\x7f\x75\x75\x6b\x35\x6b\xab\xa8\x8d\xb5\xac\xeb\x59\x23\xeb\xe6\xd2\xd6\x61\x77\x67\x34\x1c\x2c\x75\x8b\xba\xb8\x75\x63\xd4\x7b\xa9\xb7\xd8\x9d\x96\xa5\xad\xe1\xde\x70\xd0\x7b\x71\xa9\x5b\xd4\x7b\x9a\x3b\xfd\xd1\xce\xd1\xe1\x0b\x07\xbd\x57\xee\xd9\x61\x7c\xb6\xb9\x3b\x9c\x74\x77\x76\x7a\x83\xc9\xd9\x9d\x72\xb8\xd8\xda\xe9\x1e\x4f\xb9\x5b\x94\xd6\xce\x68\xd8\x9d\x2c\xb5\x33\xb0\x97\x81\xed\x22\xb0\x37\x2d\x67\xdb\x4c\xd4\x2b\x87\x4b\xed\x6c\xa3\x57\xd4\xc5\x76\x31\x63\x6f\x5a\xee\xb9\x7c\xaa\xa9\xbd\x53\x4d\x5d\x66\xae\xbd\x72\x78\xee\xf2\xce\xf0\xf0\xb0\x9b\x0f\xf6\x4e\x3d\xb8\xe7\xe1\x53\xf3\xec\x33\x9e\x7f\xf8\x46\x77\x34\xbf\x7f\xa3\x3b\x5a\xbc\x32\xe9\x1f\xec\xf6\x16\xfb\xd3\xb2\x74\x25\x57\xd2\xcf\x95\x5c\x29\x56\xd2\x2f\xb6\xee\x4a\xf6\xdc\x2f\xea\xec\x95\x2f\xcf\xf6\xbf\x7a\xcf\x97\x4f\x65\x7c\x95\xf1\xb9\x47\x4e\x77\xf5\xe2\x5d\x0f\xf6\x46\xbd\xde\xe0\xa0\x3b\xd8\xed\xef\x2c\x3e\xda\xdd\x39\x9a\xf4\x16\x0f\xa6\xe5\xdc\xa3\xa7\x5f\x77\x70\xea\xc1\xe2\xa3\xc5\x06\x1d\x4c\xcb\xfc\xa3\xbb\xc3\xc9\xfc\xc1\xee\x70\xb2\xf8\x58\x71\xfe\xa0\x38\xff\xb1\xd3\xe7\x0f\x4e\x9f\xff\x58\x71\xfe\xa0\xd8\xe0\x41\xf7\xe6\x70\x3c\x19\x0d\x6f\xee\xf7\xe6\xda\x83\xbd\xb9\xde\x60\x6f\xe9\x6a\x2e\x7e\x98\x8b\xbf\x5a\x2c\x7e\x38\x2d\xe7\xaf\xee\x1f\x0d\xf6\xba\xa3\xa3\xc3\x83\xee\xd1\xe4\xfc\xf0\xf4\xa3\xc5\x27\x8a\x1e\x46\x45\x0f\x4f\x9c\xee\x61\x74\xba\x87\x27\x8a\x1e\x46\x45\xb9\x56\x9c\x35\x9e\x96\x7b\xae\x9d\xda\xc6\xf1\xa9\x6d\x7c\xf2\xf4\x6c\x93\xd3\xb3\x3d\x59\x4c\x33\x29\x76\xe4\xc9\xe3\x4b\x3a\x39\xbe\xa4\xdb\xc5\x25\x3d\x2a\x2e\xe9\x76\xae\xea\x28\x57\xb5\x5d\xac\xea\x68\x5a\x16\xb6\x47\xfd\xc1\xde\xc2\xd1\xf1\xcf\xf3\xdb\x77\xad\xf0\xe8\xf4\xa3\xa5\xed\xbc\xf4\x47\x79\xd7\x3c\x75\xaa\xdb\x97\x4f\x8d\x9f\x39\x35\x7e\x95\xf1\xe2\xf5\x62\xad\xaf\x4d\xcb\xd9\xeb\xbc\x8d\x5f\x2b\x87\x0b\x07\xc3\xc1\xde\x78\xe1\xea\xfe\x70\x34\x58\x18\x4e\x7f\x6e\x4f\x7f\x1e\x1d\xff\x9c\xde\xdd\xb5\xce\xea\xd9\xad\xe3\x5e\x8b\x69\xba\xe5\x70\x69\xab\x5d\xd4\x6e\xaf\xd8\xcd\xab\xe3\x83\xee\x78\xbf\x18\x0f\x19\x9f\xbb\x76\x7a\x37\xc7\xa7\x1e\x9c\xe9\xbe\xd0\xef\x1f\x7f\xc6\xde\x9c\x26\xad\x35\xb3\x76\xd6\xcf\xec\x8d\xba\x2f\xf5\x76\x86\x87\x37\xce\x4c\xe7\x98\x8e\xa6\x7b\x7b\x3c\x3a\xbf\x3f\x1c\xbe\xd8\xbd\x31\x2c\x5e\x31\x3d\x67\x7d\xb5\x73\x6e\x77\x38\xb9\xd1\x3b\x18\xbe\x7c\x7c\x70\x61\x32\x1c\x0c\xc7\xe7\x77\xfb\xbd\x51\x6f\xdc\x1f\x4f\x1f\x9d\xdd\x3a\xb8\xb9\xdf\x9d\x0e\xcf\x74\x07\xc3\x49\xef\xa0\xd7\xef\x9e\x6b\xdf\x1c\xf7\x0f\x86\x83\xe9\xe1\xcf\xb4\x27\xf9\xfc\x95\x61\x8e\xce\x5d\x3d\xec\x1f\x5f\xc3\xe2\xc1\xf6\xa9\x17\x9f\xbd\x7a\xd8\xdb\x2b\x5e\x74\x6f\x7f\x38\xe9\xde\x95\xb5\x30\xcd\x9a\x6f\xf4\x26\xdd\x85\xcb\xdd\xc3\xc3\xee\x52\xe6\xcc\x5f\xef\x4d\xba\x73\xed\x49\x77\xe1\xc9\xfd\xde\xa4\x3b\x7f\x1c\xb4\xf0\x48\xf7\xe6\xcd\xee\xe2\xa3\xdd\xc3\x1b\xbb\xdd\xd9\xdf\x39\x9a\x7d\xec\x68\xf6\xe9\xfe\x52\x26\xcf\x3e\xde\x9f\x7b\x62\x7f\xb8\x70\xad\xbf\x77\xd8\x9d\x7b\xb2\x7b\xb4\x94\x5d\xcc\x3d\xbe\xdf\x9f\x6b\xee\xf7\xe7\x1e\x1f\xf7\xcf\x5d\x39\xd5\xc1\x85\x7c\xc1\xc9\xe3\xb3\xdd\x72\xe1\xe7\x7a\xa7\x97\xdb\x3b\x59\x6e\xff\x64\xb9\xff\xff\xe8\xee\x53\x8b\xc5\x4c\xcf\x9f\xbf\x71\xbc\x98\xbd\xe3\xc5\x2c\xec\xf6\x0e\x26\xdd\xa5\x9c\x6b\xfe\xb5\xe3\x25\x1d\x3f\x39\x99\x2e\xe9\x78\xb2\x85\x17\xa7\x4b\x3a\x28\x96\x34\x38\x9a\x7d\xa5\xbf\x34\x2c\xd6\x33\x37\xda\x1f\x2e\x8e\x8f\x17\x53\x5b\x98\x96\xb9\x49\xf7\x68\x29\x73\xe7\x6e\xee\xf7\xe7\x76\xf6\xfb\x73\x37\xc7\xfd\x85\xe1\xf1\x06\x9f\x3b\xbd\xb7\x17\x3e\xd5\xde\xb9\xe1\xe9\xab\x73\x74\xfa\xea\x0c\xcb\xab\xb3\x38\x6d\xab\xf6\x99\xdc\x95\xda\xe2\xf4\xa9\xda\xf4\x7d\xb3\xb1\xba\x3a\x7d\x17\xd6\x56\x57\xd7\xd6\x4f\x46\x51\x2b\x47\x6b\xe5\x88\x67\x37\xca\x51\x94\x23\x95\x23\x97\xa3\x7a\x39\xda\x3c\x19\xa9\x4c\xd3\x49\x7e\xab\x3c\x72\x92\x55\xdb\x28\xe7\xad\x95\xb3\xd5\xca\xd9\x6a\xe5\x6c\x6b\xf4\x5e\x76\xbc\x56\x76\xbc\x56\xf6\xb9\x56\xce\xb7\x56\xf6\xb9\x56\xce\xbc\x56\xce\xbc\x56\xce\xbc\x5e\xce\xbc\x5e\xce\xbc\x5e\xce\xbc\x5e\xee\xc5\x7a\x99\xb1\x5e\x66\xac\x97\x19\xeb\x65\xc6\x7a\x99\xb1\x5e\x66\x6c\x94\x19\x1b\x65\xc6\x46\x99\xb1\x51\x66\x6c\x94\x19\xec\xcb\x46\x99\xb1\x51\x66\x6c\x94\x19\x1b\xec\x77\x79\x86\xca\x33\x54\x9e\xa1\xf2\x0c\x95\x67\xb8\xec\xca\x65\x2f\x2e\x7b\x71\xd9\x8b\xcb\x99\x5d\xce\xec\x72\x66\x97\x33\xbb\x9c\xb9\x5e\xce\x5c\x2f\xd7\x5b\x2f\x33\xea\x65\x46\xbd\xcc\xa8\x97\x19\xf5\x32\xa3\x5e\x66\xd4\xcb\x8c\x7a\x99\xb1\x59\x66\x6c\x96\x19\x9b\x65\xc6\x66\x99\xb1\x59\x66\x6c\x96\x19\x9b\x65\xc6\x66\xf1\xf7\xdf\x46\xb0\x17\xcc\x76\x92\x55\x2b\xef\x9c\xda\x6a\xad\x1c\x95\xef\xe1\xd5\xf5\x72\xb4\x51\x8e\xa2\x1c\xa9\x1c\xb9\x1c\xd5\xcb\xd1\x66\xe6\x9f\xdc\x1b\xb5\x5a\x99\xb5\x59\xfc\xed\xb9\xa1\xd5\xac\x65\x76\xf9\x9e\xa8\x6d\x6e\xe4\x73\x27\x35\xb2\x2a\x6b\xae\x4f\xf5\xac\x99\xa7\xad\xac\x8d\xac\xcd\xac\xad\xac\xed\xac\x9d\xa2\x3a\x7b\x30\x3d\x94\xab\x29\xf7\xb5\x56\xbe\x2f\x6b\x9b\x99\xef\x93\x9a\x7d\x38\xfb\x70\xf6\xe1\xec\xc3\xd9\x87\xb3\x0f\x67\x1f\xce\x3e\x9c\x7d\xd4\xb3\x8f\x7a\xfe\x4e\xa9\xaf\x65\xcd\xbd\xaa\xe7\x3e\xd4\x73\x1f\xea\x99\x5f\xcf\xdc\x7a\xe6\xd6\x33\xb7\x9e\xb9\xf5\xcc\xad\x67\x6e\x3d\x73\xeb\x9d\xf2\x37\x1b\xef\xb7\x9c\x6b\x33\xb3\x4f\xae\xd3\xc9\xb5\xd8\xcc\xec\x93\x3d\x38\x79\x8f\x95\xe7\x65\x0f\x9b\xd9\xc3\x66\xf6\xb0\x99\x3d\x6c\x66\x0f\x9b\xd9\xc3\x66\xae\x3d\x3f\xa3\x6c\x6c\xe5\xda\xb7\x32\x7f\x2b\xf3\xb7\x32\x7f\x2b\xf3\xb7\x32\x7f\x2b\xf3\xb7\x32\x7f\x2b\xf3\xb7\x32\x7f\x2b\xf3\xb7\x32\x3f\x3f\x03\x6d\x6c\x65\xfe\x56\xe6\x37\x32\xbf\x91\xf9\xf9\x19\x69\x23\x3f\x23\x6d\x34\x32\x3f\x3f\x2b\x6d\x34\x32\xbf\x91\xf9\x8d\xcc\x6f\x64\x7e\x23\xf3\x1b\x99\xdf\xc8\xfc\x46\xe6\x37\x32\xbf\x91\xf9\xcd\xcc\x6f\x66\x7e\x33\xf3\x9b\x99\xdf\xcc\xfc\x66\xe6\x37\x33\xbf\x99\xf9\xcd\xcc\xcf\xbf\xbd\x36\x9a\x99\xdf\xcc\xfc\x66\xe6\x37\x33\xbf\x99\xf9\xcd\xcc\x6f\x65\x7e\x2b\xf3\x5b\x99\xdf\xca\xfc\x56\xe6\xb7\x32\xbf\x95\xf9\xad\xcc\x6f\x9d\xdc\x1d\xf5\x8d\x93\x67\xb2\x83\x56\x76\xd0\xca\x0e\x5a\xd9\x41\x2b\x3b\x68\x65\x07\xed\xec\xa0\x9d\x1d\xb4\xb3\x83\x76\x76\xd0\xce\x0e\xda\xd9\x41\x3b\x73\xda\xd9\x41\x3b\x77\xa0\x9d\x3b\xd0\xce\xfc\x76\xe6\xb7\x33\xbf\x9d\xf9\xed\xcc\x6f\x67\x7e\x27\xf3\x3b\x99\xdf\xc9\xfc\x4e\xe6\x77\x32\xbf\x93\xf9\x9d\xcc\xef\x64\x7e\x27\xf3\x3b\x99\xdf\xc9\xfc\x4e\xe6\x77\x32\xbf\x93\xf9\x9d\xcc\xef\x14\xf9\xb1\xba\x9a\xb5\x96\x75\x2d\xeb\x7a\xd6\x8d\xac\x91\x55\x59\x9d\xb5\x9e\x75\x33\xeb\x56\xd6\x46\xd6\x66\xd6\x56\xd6\x76\xd6\xcc\xaf\x65\x7e\x2d\xf3\x6b\x99\x5f\x9b\xe6\xd7\xda\x45\x7f\xb5\x76\xd1\x5f\xad\xbd\xde\xce\xda\x59\x7c\x6a\xfa\x67\xfe\xe2\xcb\x45\x79\xaa\xf8\xbc\xf2\xf2\xb4\x9c\x79\xea\xe4\x6f\xbc\x33\x2f\x9f\x8c\x8a\xf3\xb6\x72\xbe\xad\x9c\xaf\xb8\xe3\x6b\xed\xad\xcc\x2b\xee\xf8\x5a\xbb\xb8\xe3\x6b\xed\xe2\x8e\xaf\xb5\x8b\x3b\xbe\xd6\x2e\xee\xf8\x5a\xbb\xb8\xe3\x6b\xed\xe2\x8e\xaf\xb5\x8b\x3b\xbe\xd6\x2e\xee\xf8\x5a\xbb\xb8\xe3\x6b\xed\xad\xec\xb7\xb8\xe3\x6b\xed\x46\xe6\x37\x32\xbf\x91\xf9\x8d\xcc\x6f\x64\x7e\x23\xf3\x1b\x99\xdf\xc8\xfc\x46\xe6\x37\x32\xbf\x91\xf9\x8d\xcc\x6f\x64\x7e\x23\xf3\x1b\x99\xdf\xc8\xfc\x66\xe6\x37\x33\xbf\x99\xf9\xcd\xcc\x6f\x66\x7e\x33\xf3\x9b\x99\xdf\xcc\xfc\x66\xe6\x37\x33\xbf\x99\xf9\xcd\xcc\x6f\x66\x7e\x33\xf3\x9b\x99\xdf\xcc\xfc\x56\xe6\xb7\x32\xbf\x95\xf9\xad\xcc\x6f\x65\x7e\x2b\xf3\x5b\x99\xdf\xca\xfc\x56\xe6\xb7\x32\xbf\x95\xf9\xad\xcc\x6f\x65\x7e\x2b\xf3\x5b\x99\xdf\xca\xfc\x76\xe6\xb7\x33\xbf\x9d\xf9\xed\xcc\x6f\x67\x7e\x3b\xf3\xdb\x99\xdf\xce\xfc\x76\xe6\xb7\x33\xbf\x9d\xf9\xed\xcc\x6f\x67\x7e\x3b\xf3\xdb\x99\xdf\xce\xfc\x4e\xe6\x77\x6a\x8b\xcf\x14\x6f\xdc\x57\xa7\x25\x8f\x66\x7a\x27\xd3\x3b\x99\xde\xc9\xf4\x4e\xa6\x17\x77\x7b\xad\xb3\x31\x4d\x59\x5b\x2d\xee\x92\xb5\xd5\xe2\x2e\x59\x5b\x2d\xee\xe2\xb5\xd5\xe2\x2e\x5e\x5b\x2d\xee\xe2\xb5\xd5\xe2\x2e\x5e\x5b\x2d\xee\xe2\xb5\xd5\x55\x5f\x3c\x1a\xf4\x3b\xf9\xef\x8b\x87\xc3\xc1\x30\x9f\xd8\xcc\xba\x95\xb5\x31\xfd\x45\x7b\xfc\xa9\xa1\x7e\xfe\x68\xb0\xdb\x1b\x8d\x77\x86\xa3\xde\xee\x8d\x83\xf3\xbf\x7b\x34\x9c\xf4\x46\xbd\x97\x7a\xa3\x71\x6f\x77\xf1\xb0\x3f\x98\x7e\x45\xd2\xdb\x19\x0e\x76\xcf\xf4\x5e\xd9\x39\xe8\x1e\xee\xde\x38\x28\x66\x71\x67\xfe\xa0\x3f\xea\x2e\xde\xec\x8d\x8f\x3f\xea\xed\x0e\x07\x7b\xf3\xed\xa3\xd1\x70\x3a\xb7\x6a\x6b\xf9\xc7\x8e\x6a\x6b\xf9\x47\xa9\x6a\xeb\x51\x2c\xa5\xb6\xa6\x33\xbd\xf1\xa4\x7f\xd8\x9d\xf4\x76\xcf\x0c\x07\xbd\x5e\x7f\x6f\x7f\xb2\x7f\x6e\xb2\x3f\xea\xe5\x78\x7c\xcf\x0b\xfd\x97\x4e\xc6\xe7\xc6\xbd\x97\x7a\x83\x7c\x30\x9d\x61\xad\x58\x74\xa7\x51\x6c\x52\xa7\x51\x6c\x52\xa7\x51\x6c\x52\xa7\x51\x6c\x52\xa7\x5d\xfc\x6a\xec\x74\x8a\x5f\x9d\x9d\x4e\xa7\x75\xee\x8b\x83\xe1\x64\xb7\xf7\xc2\x74\x83\xce\x7e\x71\x70\x74\x70\x30\x1d\x3e\x30\x18\x0e\x0e\xbb\xa3\x17\xfb\x83\xbd\x51\x6f\x72\x34\x1a\x4c\x8f\xde\xb7\xf3\xea\xa8\x7f\x70\xd0\xdf\x99\x7e\x61\x33\x3d\x74\x7e\x77\x38\x39\xe8\x8d\xc7\x5f\x2d\x4e\x9b\x7e\xff\x73\xea\xab\x8c\xe9\xd1\x8b\x9f\x3e\xf0\xe0\xa9\x03\xa3\xe3\x8f\xd8\xc5\x5c\xf7\xbe\xd6\x1b\x0d\xc7\x47\x37\x7b\xa3\xfe\x70\x54\x1c\x79\x61\x78\x34\xfa\xd4\x91\xfe\x4b\xbd\xbb\x8e\x5c\x1c\xf7\x5f\xb9\xeb\xc0\x7d\xd3\x0d\xba\xfb\xd0\x74\xbb\xee\x9e\x68\xd0\x1f\xdc\x3d\xd1\xff\xdb\xed\x8e\xfb\xdd\xe1\x2b\xfd\xee\xf4\xe1\x43\x7c\x65\x54\x7e\xd7\xf2\xe9\x27\xca\xaf\x63\xa6\x4f\xfc\x1a\x4f\xec\x0f\x87\x2f\xfe\xaa\x13\xca\xef\x6a\xa6\x4f\xdc\x3f\xdd\xc7\xbb\x67\x2f\x8e\xdd\x3d\xf1\x7d\xd3\x63\x77\xcd\x59\xbc\xec\xee\xe9\x1e\x38\xb9\x3c\xc7\xaf\x3c\xe8\xbd\x70\xb2\xd9\x27\x17\xad\xbf\x77\xfc\xc4\x76\xf3\x57\x1e\x7e\xb4\x38\x7c\xe9\x81\x5f\xcc\xdd\xa9\xfe\xf7\xf0\xb3\xd5\x2f\x7d\x38\xfc\x70\xf6\x67\x3f\x5d\xaf\xfe\xd7\x4f\x97\xab\xef\x56\x66\x2e\x5d\x5c\xbf\xb3\xfd\xc1\xfa\xfb\xdb\xff\xb9\x3e\xb7\x7d\xfb\xce\x8f\xee\xcc\xbe\x7b\xe7\x1f\x2f\xed\xdf\x39\x73\x6f\x67\xe6\xfd\x2f\xbc\x7f\xf3\xfd\xb9\xf7\x2b\x73\xdb\xff\x31\x77\xa7\xfa\xef\xff\xb6\x5e\xfd\x97\x1f\x2f\x57\x7f\xef\xc7\x95\xff\xfd\xa7\xe5\xea\xe2\x7b\x0f\xbe\xf7\xb3\xf7\xfe\xe7\xbd\xf9\x0b\xef\x54\xdf\xf9\xd2\x3b\x73\x97\xde\xb9\x70\x7f\xe7\xcf\xdf\xae\x7c\xff\xda\x72\xf5\x6f\xff\x66\xb9\xfa\xd7\x5f\x5e\xae\xfe\xd5\x5f\x2e\x57\xbf\x37\x77\xa7\xfa\xc7\xdf\x5d\xae\x56\xbf\x5b\xb9\xf9\xd6\xeb\x6f\xbd\xf1\xd6\x8f\xde\xfa\xc9\x5b\x3f\x7f\x6b\xf1\xc2\x1f\x55\xde\xfc\x4e\xe5\xdd\x3b\xbf\xb8\x54\xff\xce\x99\x0b\x9d\x2f\xbc\xf9\xfa\x9b\x6f\xbc\xf9\xf3\x37\xe7\xbf\xf7\xed\xbf\xff\xf6\x6c\xfd\xdb\x95\x9f\xdf\xaa\xfc\xe0\x56\xe5\x0b\xb7\x56\x6f\x5d\xba\xf5\xfa\xad\x37\x6e\xfd\xe9\xad\xc5\x3f\xfc\xd6\x72\xf5\x0f\xae\x2d\x57\x2f\x7c\xab\xf2\xf5\xcb\xcb\xd5\x7f\xfe\x87\xca\xd2\x4c\x65\xe6\xcf\x2a\x4b\x33\x7f\x57\x59\x7a\x67\x76\xee\xf5\xf7\x2a\x4b\x33\x6f\x54\x96\x2e\xfd\xc5\xec\x4b\x47\xcb\xd5\xc9\xe3\xcb\xd5\xf1\xe3\xcb\xd5\xe1\xc3\xcb\xd5\xc1\xe5\xe5\xea\x67\x2b\x0f\x6d\x2f\xdf\x7f\xa7\xba\x34\x7f\xa7\xba\x38\x77\xa7\xda\x7d\x7e\xb9\xda\x7b\xbe\xb2\xfb\x5c\xe5\xce\xc7\x95\x0f\x3f\xae\xbc\xfa\x71\xe5\xb7\x3f\xbe\xfa\xf1\xec\x43\x1f\xdd\xf7\x50\xe7\xea\x47\xcf\x7d\x34\xfc\x68\xee\x5f\x9f\xfd\xe9\xb3\xb3\xcf\x5e\xbf\x58\xdd\xbc\x5e\x59\xbc\x5e\x59\xbc\x7f\xfd\xbe\xed\x85\xca\xdc\xf6\xfc\xfa\xdc\xf6\x85\xb9\xaf\xcd\x7d\x38\x37\xf7\x93\x5f\x56\x3e\xf8\x65\xe5\x2b\x8f\x2f\x57\x2f\x7c\xf2\x83\x4f\x7e\xf8\xc9\x07\x9f\xcc\xcf\x5d\xfa\xe4\xdc\xc5\xce\x95\xce\x72\xf5\xf9\x87\x2b\xbf\x75\xb9\xb2\xf8\xeb\x9f\xbb\x53\x7d\x70\xfd\x81\xed\x7b\x2b\x17\xb6\x2f\xae\x5f\xd8\x9e\xad\xcc\x6c\x57\x2e\xcf\x6c\xbf\x5b\x59\xbc\xf4\x1b\x9f\xbb\xaf\xfa\x27\x17\x3e\xb8\x30\xfb\xc3\x0b\x1f\x5e\x98\x1d\xce\x7c\x6d\xe6\xfb\x33\x1f\xce\xcc\x5f\x9c\xa9\xbc\xfe\x60\x65\xa1\xf2\x6e\xe5\x8d\xb7\x9f\xbc\xb6\xb2\xf2\xc8\xbb\x4b\x77\x9e\x78\xe4\xf6\x99\xc7\x9f\xbd\x5d\xf9\xc6\xed\xdf\xbc\x76\xfc\xf3\xd2\x57\xae\xdf\x5e\xfc\xc6\xed\x99\xed\xeb\xcf\x3e\xfd\x76\xa5\xf2\xfb\xcf\x7c\xfd\x9b\xdf\x9c\x69\x7c\xfe\x91\xdb\x6b\xd7\x9e\xbe\xfd\xfc\xe7\x9f\x79\xe4\xf6\xee\xb5\xa7\x6f\x5f\x3a\x1e\xbc\x7e\xed\xe9\xdb\x17\x3f\xff\xf6\x83\x33\x8d\x67\xc6\xe3\xf1\x64\xa5\xf8\x57\x79\x6e\x3c\x5e\x59\x79\x6e\x3c\xb3\x32\x3e\x1e\x14\x8f\xa7\xff\xc7\xe3\x99\xe9\x91\x95\x95\xca\xca\xca\xcc\xca\xca\xca\xf8\xb9\xf1\xb8\xb2\x32\x33\x5e\x59\xa9\x8c\xa7\xff\x56\xf2\x25\xc5\xf3\x95\xe9\x1c\x2b\x95\x71\xf1\xe2\x95\xe2\xdc\xe3\x33\x56\x1e\xfa\xbf\x00\x00\x00\xff\xff\x19\xf0\x9f\x51\x2b\x00\x4f\x00") + +func fontsWqyMicroheiTtcBytes() ([]byte, error) { + return bindataRead( + _fontsWqyMicroheiTtc, + "fonts/wqy-microhei.ttc", + ) +} + +func fontsWqyMicroheiTtc() (*asset, error) { + bytes, err := fontsWqyMicroheiTtcBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "fonts/wqy-microhei.ttc", size: 5177387, mode: os.FileMode(438), modTime: time.Unix(1575019373, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe4, 0xbc, 0xa8, 0xdf, 0x12, 0x3c, 0xe0, 0x1b, 0x10, 0x47, 0x80, 0xf5, 0x76, 0xea, 0x1a, 0x58, 0xb9, 0xa5, 0xff, 0x16, 0x62, 0xa9, 0x11, 0x24, 0xb6, 0xd3, 0x18, 0xc, 0xb6, 0xc8, 0x82, 0x12}} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// AssetString returns the asset contents as a string (instead of a []byte). +func AssetString(name string) (string, error) { + data, err := Asset(name) + return string(data), err +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// MustAssetString is like AssetString but panics when Asset would return an +// error. It simplifies safe initialization of global variables. +func MustAssetString(name string) string { + return string(MustAsset(name)) +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetDigest returns the digest of the file with the given name. It returns an +// error if the asset could not be found or the digest could not be loaded. +func AssetDigest(name string) ([sha256.Size]byte, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) + } + return a.digest, nil + } + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) +} + +// Digests returns a map of all known files and their checksums. +func Digests() (map[string][sha256.Size]byte, error) { + mp := make(map[string][sha256.Size]byte, len(_bindata)) + for name := range _bindata { + a, err := _bindata[name]() + if err != nil { + return nil, err + } + mp[name] = a.digest + } + return mp, nil +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "fonts/3Dumb.ttf": fonts3dumbTtf, + + "fonts/ApothecaryFont.ttf": fontsApothecaryfontTtf, + + "fonts/Comismsh.ttf": fontsComismshTtf, + + "fonts/DENNEthree-dee.ttf": fontsDennethreeDeeTtf, + + "fonts/DeborahFancyDress.ttf": fontsDeborahfancydressTtf, + + "fonts/Flim-Flam.ttf": fontsFlimFlamTtf, + + "fonts/RitaSmith.ttf": fontsRitasmithTtf, + + "fonts/actionj.ttf": fontsActionjTtf, + + "fonts/chromohv.ttf": fontsChromohvTtf, + + "fonts/readme.md": fontsReadmeMd, + + "fonts/wqy-microhei.ttc": fontsWqyMicroheiTtc, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"}, +// AssetDir("data/img") would return []string{"a.png", "b.png"}, +// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + canonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(canonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} + +var _bintree = &bintree{nil, map[string]*bintree{ + "fonts": &bintree{nil, map[string]*bintree{ + "3Dumb.ttf": &bintree{fonts3dumbTtf, map[string]*bintree{}}, + "ApothecaryFont.ttf": &bintree{fontsApothecaryfontTtf, map[string]*bintree{}}, + "Comismsh.ttf": &bintree{fontsComismshTtf, map[string]*bintree{}}, + "DENNEthree-dee.ttf": &bintree{fontsDennethreeDeeTtf, map[string]*bintree{}}, + "DeborahFancyDress.ttf": &bintree{fontsDeborahfancydressTtf, map[string]*bintree{}}, + "Flim-Flam.ttf": &bintree{fontsFlimFlamTtf, map[string]*bintree{}}, + "RitaSmith.ttf": &bintree{fontsRitasmithTtf, map[string]*bintree{}}, + "actionj.ttf": &bintree{fontsActionjTtf, map[string]*bintree{}}, + "chromohv.ttf": &bintree{fontsChromohvTtf, map[string]*bintree{}}, + "readme.md": &bintree{fontsReadmeMd, map[string]*bintree{}}, + "wqy-microhei.ttc": &bintree{fontsWqyMicroheiTtc, map[string]*bintree{}}, + }}, +}} + +// RestoreAsset restores an asset under the given directory. +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) +} + +// RestoreAssets restores an asset under the given directory recursively. +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + canonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) +} diff --git a/vendor/github.com/mojocn/base64Captcha/captcha.go b/vendor/github.com/mojocn/base64Captcha/captcha.go new file mode 100644 index 00000000..99069446 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/captcha.go @@ -0,0 +1,53 @@ +// Copyright 2017 Eric Zhou. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package base64Captcha supports digits, numbers,alphabet, arithmetic, audio and digit-alphabet captcha. +// base64Captcha is used for fast development of RESTful APIs, web apps and backend services in Go. give a string identifier to the package and it returns with a base64-encoding-png-string +package base64Captcha + +import "strings" + +// Captcha captcha basic information. +type Captcha struct { + Driver Driver + Store Store +} + +//NewCaptcha creates a captcha instance from driver and store +func NewCaptcha(driver Driver, store Store) *Captcha { + return &Captcha{Driver: driver, Store: store} +} + +//Generate generates a random id, base64 image string or an error if any +func (c *Captcha) Generate() (id, b64s string, err error) { + id, content, answer := c.Driver.GenerateIdQuestionAnswer() + item, err := c.Driver.DrawCaptcha(content) + if err != nil { + return "", "", err + } + c.Store.Set(id, answer) + b64s = item.EncodeB64string() + return +} + +//Verify by a given id key and remove the captcha value in store, +//return boolean value. +//if you has multiple captcha instances which share a same store. +//You may want to call `store.Verify` method instead. +func (c *Captcha) Verify(id, answer string, clear bool) (match bool) { + vv := c.Store.Get(id, clear) + //fix issue for some redis key-value string value + vv = strings.TrimSpace(vv) + return vv == strings.TrimSpace(answer) +} diff --git a/vendor/github.com/mojocn/base64Captcha/const.go b/vendor/github.com/mojocn/base64Captcha/const.go new file mode 100644 index 00000000..64f2edc5 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/const.go @@ -0,0 +1,60 @@ +package base64Captcha + +const idLen = 20 + +// idChars are characters allowed in captcha id. +var idChars = []byte(TxtNumbers + TxtAlphabet) + +const ( + imageStringDpi = 72.0 + //TxtNumbers chacters for numbers. + TxtNumbers = "012346789" + //TxtAlphabet characters for alphabet. + TxtAlphabet = "ABCDEFGHJKMNOQRSTUVXYZabcdefghjkmnoqrstuvxyz" + //TxtSimpleCharaters simple numbers and alphabet + TxtSimpleCharaters = "13467ertyiadfhjkxcvbnERTYADFGHJKXCVBN" + //TxtChineseCharaters makes characters in chinese + TxtChineseCharaters = "的一是在不了有和人这中大为上个国我以要他" + + "时来用们生到作地于出就分对成会可主发年动" + + "同工也能下过子说产种面而方后多定行学法所" + + "民得经十三之进着等部度家电力里如水化高自" + + "二理起小物现实加量都两体制机当使点从业本" + + "去把性好应开它合还因由其些然前外天政四日" + + "那社义事平形相全表间样与关各重新线内数正" + + "心反你明看原又么利比或但质气第向道命此变" + + "条只没结解问意建月公无系军很情者最立代想" + + "已通并提直题党程展五果料象员革位入常文总" + + "次品式活设及管特件长求老头基资边流路级少" + + "图山统接知较将组见计别她手角期根论运农指" + + "几九区强放决西被干做必战先回则任取据处队" + + "南给色光门即保治北造百规热领七海口东导器" + + "压志世金增争济阶油思术极交受联什认六共权" + + "收证改清己美再采转更单风切打白教速花带安" + + "场身车例真务具万每目至达走积示议声报斗完" + + "类八离华名确才科张信马节话米整空元况今集" + + "温传土许步群广石记需段研界拉林律叫且究观" + + "越织装影算低持音众书布复容儿须际商非验连" + + "断深难近矿千周委素技备半办青省列习响约支" + + "般史感劳便团往酸历市克何除消构府称太准精" + + "值号率族维划选标写存候毛亲快效斯院查江型" + + "眼王按格养易置派层片始却专状育厂京识适属" + + "圆包火住调满县局照参红细引听该铁价严龙飞" + + //MimeTypeAudio output base64 mine-type. + MimeTypeAudio = "audio/wav" + //MimeTypeImage output base64 mine-type. + MimeTypeImage = "image/png" + //Emoji is a source string for randTxt + Emoji = "😀😃💯😄🤖😻😅🤣😂🧑🙃😉😊😇😍👴🤩😘😗☺👽♀😙♂😋😛🎨😜🤪😝🤑🤗🤭🤫🤔🤐🤨😐🙉😶😏💗🙄😬🤥😌😪🤤😷🤢🤮🤯😵🤠😎🧐😨😰😱😭😖😡🤬👿☠💀💥💢" +) + +//var cjkFontFamilies = readCJKFonts() + +const ( + //OptionShowHollowLine shows hollow line + OptionShowHollowLine = 2 + //OptionShowSlimeLine shows slime line + OptionShowSlimeLine = 4 + //OptionShowSineLine shows sine line + OptionShowSineLine = 8 +) diff --git a/vendor/github.com/mojocn/base64Captcha/driver_audio.go b/vendor/github.com/mojocn/base64Captcha/driver_audio.go new file mode 100644 index 00000000..8ffcb749 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/driver_audio.go @@ -0,0 +1,36 @@ +// Copyright 2017 Eric Zhou. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package base64Captcha + +//DriverAudio captcha config for captcha-engine-audio. +type DriverAudio struct { + // Length Default number of digits in captcha solution. + Length int + // Language possible values for lang are "en", "ja", "ru", "zh". + Language string +} + +//DefaultDriverAudio is a default audio driver +var DefaultDriverAudio = NewDriverAudio(6, "en") + +//NewDriverAudio creates a driver of audio +func NewDriverAudio(length int, language string) *DriverAudio { + return &DriverAudio{Length: length, Language: language} +} + +//DrawCaptcha creates audio captcha item +func (d *DriverAudio) DrawCaptcha(content string) (item Item, err error) { + digits := stringToFakeByte(content) + audio := newAudio("", digits, d.Language) + return audio, nil +} + +//GenerateIdQuestionAnswer creates id,captcha content and answer +func (d *DriverAudio) GenerateIdQuestionAnswer() (id, q, a string) { + id = RandomId() + digits := randomDigits(d.Length) + a = parseDigitsToString(digits) + return id, a, a +} diff --git a/vendor/github.com/mojocn/base64Captcha/driver_chinese.go b/vendor/github.com/mojocn/base64Captcha/driver_chinese.go new file mode 100644 index 00000000..a92545ab --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/driver_chinese.go @@ -0,0 +1,131 @@ +package base64Captcha + +import ( + "github.com/golang/freetype/truetype" + "image/color" + "math/rand" + "strings" +) + +//DriverChinese is a driver of unicode Chinese characters. +type DriverChinese struct { + //Height png height in pixel. + Height int + //Width Captcha png width in pixel. + Width int + + //NoiseCount text noise count. + NoiseCount int + + //ShowLineOptions := OptionShowHollowLine | OptionShowSlimeLine | OptionShowSineLine . + ShowLineOptions int + + //Length random string length. + Length int + + //Source is a unicode which is the rand string from. + Source string + + //BgColor captcha image background color (optional) + BgColor *color.RGBA + //Fonts loads by name see fonts.go's comment + Fonts []string + + fontsArray []*truetype.Font +} + +//NewDriverChinese creates a driver of Chinese characters +func NewDriverChinese(height int, width int, noiseCount int, showLineOptions int, length int, source string, bgColor *color.RGBA, fonts []string) *DriverChinese { + tfs := []*truetype.Font{} + for _, fff := range fonts { + tf := loadFontByName("fonts/" + fff) + tfs = append(tfs, tf) + } + if len(tfs) == 0 { + tfs = fontsAll + } + return &DriverChinese{Height: height, Width: width, NoiseCount: noiseCount, ShowLineOptions: showLineOptions, Length: length, Source: source, BgColor: bgColor, fontsArray: tfs} +} + +//ConvertFonts loads fonts by names +func (d *DriverChinese) ConvertFonts() *DriverChinese { + tfs := []*truetype.Font{} + for _, fff := range d.Fonts { + tf := loadFontByName("fonts/" + fff) + tfs = append(tfs, tf) + } + if len(tfs) == 0 { + tfs = fontsAll + } + d.fontsArray = tfs + return d +} + +//GenerateIdQuestionAnswer generates captcha content and its answer +func (d *DriverChinese) GenerateIdQuestionAnswer() (id, content, answer string) { + id = RandomId() + + ss := strings.Split(d.Source, ",") + length := len(ss) + if length == 1 { + c := RandText(d.Length, ss[0]) + return id, c, c + } + if length <= d.Length { + c := RandText(d.Length, TxtNumbers+TxtAlphabet) + return id, c, c + } + + res := make([]string, d.Length) + for k := range res { + res[k] = ss[rand.Intn(length)] + } + + content = strings.Join(res, "") + return id, content, content +} + +//DrawCaptcha generates captcha item(image) +func (d *DriverChinese) DrawCaptcha(content string) (item Item, err error) { + + var bgc color.RGBA + if d.BgColor != nil { + bgc = *d.BgColor + } else { + bgc = RandLightColor() + } + itemChar := NewItemChar(d.Width, d.Height, bgc) + + //draw hollow line + if d.ShowLineOptions&OptionShowHollowLine == OptionShowHollowLine { + itemChar.drawHollowLine() + } + + //draw slime line + if d.ShowLineOptions&OptionShowSlimeLine == OptionShowSlimeLine { + itemChar.drawSlimLine(3) + } + + //draw sine line + if d.ShowLineOptions&OptionShowSineLine == OptionShowSineLine { + itemChar.drawSineLine() + } + + //draw noise + if d.NoiseCount > 0 { + source := TxtNumbers + TxtAlphabet + ",.[]<>" + noise := RandText(d.NoiseCount, strings.Repeat(source, d.NoiseCount)) + err = itemChar.drawNoise(noise, d.fontsArray) + if err != nil { + return + } + } + + //draw content + err = itemChar.drawText(content, d.fontsArray) + if err != nil { + return + } + + return itemChar, nil +} diff --git a/vendor/github.com/mojocn/base64Captcha/driver_digit.go b/vendor/github.com/mojocn/base64Captcha/driver_digit.go new file mode 100644 index 00000000..e96b06f0 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/driver_digit.go @@ -0,0 +1,80 @@ +// Copyright 2017 Eric Zhou. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package base64Captcha + +import "math/rand" + +//DriverDigit config for captcha-engine-digit. +type DriverDigit struct { + // Height png height in pixel. + Height int + // Width Captcha png width in pixel. + Width int + // DefaultLen Default number of digits in captcha solution. + Length int + // MaxSkew max absolute skew factor of a single digit. + MaxSkew float64 + // DotCount Number of background circles. + DotCount int +} + +//NewDriverDigit creates a driver of digit +func NewDriverDigit(height int, width int, length int, maxSkew float64, dotCount int) *DriverDigit { + return &DriverDigit{Height: height, Width: width, Length: length, MaxSkew: maxSkew, DotCount: dotCount} +} + +//DefaultDriverDigit is a default driver of digit +var DefaultDriverDigit = NewDriverDigit(80, 240, 5, 0.7, 80) + +//GenerateIdQuestionAnswer creates captcha content and answer +func (d *DriverDigit) GenerateIdQuestionAnswer() (id, q, a string) { + id = RandomId() + digits := randomDigits(d.Length) + a = parseDigitsToString(digits) + return id, a, a +} + +//DrawCaptcha creates digit captcha item +func (d *DriverDigit) DrawCaptcha(content string) (item Item, err error) { + // Initialize PRNG. + itemDigit := NewItemDigit(d.Width, d.Height, d.DotCount, d.MaxSkew) + //parse digits to string + digits := stringToFakeByte(content) + + itemDigit.calculateSizes(d.Width, d.Height, len(digits)) + // Randomly position captcha inside the image. + maxx := d.Width - (itemDigit.width+itemDigit.dotSize)*len(digits) - itemDigit.dotSize + maxy := d.Height - itemDigit.height - itemDigit.dotSize*2 + var border int + if d.Width > d.Height { + border = d.Height / 5 + } else { + border = d.Width / 5 + } + x := rand.Intn(maxx-border*2) + border + y := rand.Intn(maxy-border*2) + border + // Draw digits. + for _, n := range digits { + itemDigit.drawDigit(digitFontData[n], x, y) + x += itemDigit.width + itemDigit.dotSize + } + // Draw strike-through line. + itemDigit.strikeThrough() + // Apply wave distortion. + itemDigit.distort(rand.Float64()*(10-5)+5, rand.Float64()*(200-100)+100) + // Fill image with random circles. + itemDigit.fillWithCircles(d.DotCount, itemDigit.dotSize) + return itemDigit, nil +} diff --git a/vendor/github.com/mojocn/base64Captcha/driver_language.go b/vendor/github.com/mojocn/base64Captcha/driver_language.go new file mode 100644 index 00000000..96dd41bc --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/driver_language.go @@ -0,0 +1,119 @@ +package base64Captcha + +import ( + "fmt" + "github.com/golang/freetype/truetype" + "image/color" + "math/rand" +) + +//https://en.wikipedia.org/wiki/Unicode_block +var langMap = map[string][]int{ + //"zh-CN": []int{19968, 40869}, + "latin": {0x0000, 0x007f}, + "zh": {0x4e00, 0x9fa5}, + "ko": {12593, 12686}, + "jp": {12449, 12531}, //[]int{12353, 12435} + "ru": {1025, 1169}, + "th": {0x0e00, 0x0e7f}, + "greek": {0x0380, 0x03ff}, + "arabic": {0x0600, 0x06ff}, + "hebrew": {0x0590, 0x05ff}, + //"emotion": []int{0x1f601, 0x1f64f}, +} + +func generateRandomRune(size int, code string) string { + lang, ok := langMap[code] + if !ok { + fmt.Sprintf("can not font language of %s", code) + lang = langMap["latin"] + } + start := lang[0] + end := lang[1] + randRune := make([]rune, size) + for i := range randRune { + idx := rand.Intn(end-start) + start + randRune[i] = rune(idx) + } + return string(randRune) +} + +//DriverLanguage generates language unicode by lanuage +type DriverLanguage struct { + // Height png height in pixel. + Height int + // Width Captcha png width in pixel. + Width int + + //NoiseCount text noise count. + NoiseCount int + + //ShowLineOptions := OptionShowHollowLine | OptionShowSlimeLine | OptionShowSineLine . + ShowLineOptions int + + //Length random string length. + Length int + + //BgColor captcha image background color (optional) + BgColor *color.RGBA + + //Fonts loads by name see fonts.go's comment + Fonts []*truetype.Font + LanguageCode string +} + +//NewDriverLanguage creates a driver +func NewDriverLanguage(height int, width int, noiseCount int, showLineOptions int, length int, bgColor *color.RGBA, fonts []*truetype.Font, languageCode string) *DriverLanguage { + return &DriverLanguage{Height: height, Width: width, NoiseCount: noiseCount, ShowLineOptions: showLineOptions, Length: length, BgColor: bgColor, Fonts: fonts, LanguageCode: languageCode} +} + +//GenerateIdQuestionAnswer creates content and answer +func (d *DriverLanguage) GenerateIdQuestionAnswer() (id, content, answer string) { + id = RandomId() + content = generateRandomRune(d.Length, d.LanguageCode) + return id, content, content +} + +//DrawCaptcha creates item +func (d *DriverLanguage) DrawCaptcha(content string) (item Item, err error) { + var bgc color.RGBA + if d.BgColor != nil { + bgc = *d.BgColor + } else { + bgc = RandLightColor() + } + itemChar := NewItemChar(d.Width, d.Height, bgc) + + //draw hollow line + if d.ShowLineOptions&OptionShowHollowLine == OptionShowHollowLine { + itemChar.drawHollowLine() + } + + //draw slime line + if d.ShowLineOptions&OptionShowSlimeLine == OptionShowSlimeLine { + itemChar.drawSlimLine(3) + } + + //draw sine line + if d.ShowLineOptions&OptionShowSineLine == OptionShowSineLine { + itemChar.drawSineLine() + } + + //draw noise + if d.NoiseCount > 0 { + noise := RandText(d.NoiseCount, TxtNumbers+TxtAlphabet+",.[]<>") + err = itemChar.drawNoise(noise, fontsAll) + if err != nil { + return + } + } + + //draw content + //use font that match your language + err = itemChar.drawText(content, []*truetype.Font{fontChinese}) + if err != nil { + return + } + + return itemChar, nil +} diff --git a/vendor/github.com/mojocn/base64Captcha/driver_math.go b/vendor/github.com/mojocn/base64Captcha/driver_math.go new file mode 100644 index 00000000..486bc49d --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/driver_math.go @@ -0,0 +1,131 @@ +package base64Captcha + +import ( + "fmt" + "github.com/golang/freetype/truetype" + "image/color" + "math/rand" + "strings" +) + +//DriverMath captcha config for captcha math +type DriverMath struct { + //Height png height in pixel. + Height int + + // Width Captcha png width in pixel. + Width int + + //NoiseCount text noise count. + NoiseCount int + + //ShowLineOptions := OptionShowHollowLine | OptionShowSlimeLine | OptionShowSineLine . + ShowLineOptions int + + //BgColor captcha image background color (optional) + BgColor *color.RGBA + + //Fonts loads by name see fonts.go's comment + Fonts []string + fontsArray []*truetype.Font +} + +//NewDriverMath creates a driver of math +func NewDriverMath(height int, width int, noiseCount int, showLineOptions int, bgColor *color.RGBA, fonts []string) *DriverMath { + tfs := []*truetype.Font{} + for _, fff := range fonts { + tf := loadFontByName("fonts/" + fff) + tfs = append(tfs, tf) + } + if len(tfs) == 0 { + tfs = fontsAll + } + return &DriverMath{Height: height, Width: width, NoiseCount: noiseCount, ShowLineOptions: showLineOptions, fontsArray: tfs, BgColor: bgColor, Fonts: fonts} +} + +//ConvertFonts loads fonts from names +func (d *DriverMath) ConvertFonts() *DriverMath { + tfs := []*truetype.Font{} + for _, fff := range d.Fonts { + tf := loadFontByName("fonts/" + fff) + tfs = append(tfs, tf) + } + if len(tfs) == 0 { + tfs = fontsAll + } + d.fontsArray = tfs + return d +} + +//GenerateIdQuestionAnswer creates id,captcha content and answer +func (d *DriverMath) GenerateIdQuestionAnswer() (id, question, answer string) { + id = RandomId() + operators := []string{"+", "-", "x"} + var mathResult int32 + switch operators[rand.Int31n(3)] { + case "+": + a := rand.Int31n(100) + b := rand.Int31n(100) + question = fmt.Sprintf("%d+%d=?", a, b) + mathResult = a + b + case "x": + a := rand.Int31n(10) + b := rand.Int31n(10) + question = fmt.Sprintf("%dx%d=?", a, b) + mathResult = a * b + default: + a := rand.Int31n(100) + b := rand.Int31n(100) + if a > b { + question = fmt.Sprintf("%d-%d=?", a, b) + mathResult = a - b + } else { + question = fmt.Sprintf("%d-%d=?", b, a) + mathResult = b - a + } + } + answer = fmt.Sprintf("%d", mathResult) + return +} + +//DrawCaptcha creates math captcha item +func (d *DriverMath) DrawCaptcha(question string) (item Item, err error) { + var bgc color.RGBA + if d.BgColor != nil { + bgc = *d.BgColor + } else { + bgc = RandLightColor() + } + itemChar := NewItemChar(d.Width, d.Height, bgc) + + //波浪线 比较丑 + if d.ShowLineOptions&OptionShowHollowLine == OptionShowHollowLine { + itemChar.drawHollowLine() + } + + //背景有文字干扰 + if d.NoiseCount > 0 { + noise := RandText(d.NoiseCount, strings.Repeat(TxtNumbers, d.NoiseCount)) + err = itemChar.drawNoise(noise, fontsAll) + if err != nil { + return + } + } + + //画 细直线 (n 条) + if d.ShowLineOptions&OptionShowSlimeLine == OptionShowSlimeLine { + itemChar.drawSlimLine(3) + } + + //画 多个小波浪线 + if d.ShowLineOptions&OptionShowSineLine == OptionShowSineLine { + itemChar.drawSineLine() + } + + //draw question + err = itemChar.drawText(question, d.fontsArray) + if err != nil { + return + } + return itemChar, nil +} diff --git a/vendor/github.com/mojocn/base64Captcha/driver_string.go b/vendor/github.com/mojocn/base64Captcha/driver_string.go new file mode 100644 index 00000000..5f56b4ca --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/driver_string.go @@ -0,0 +1,114 @@ +package base64Captcha + +import ( + "github.com/golang/freetype/truetype" + "image/color" + "strings" +) + +//DriverChar captcha config for captcha-engine-characters. +type DriverString struct { + // Height png height in pixel. + Height int + + // Width Captcha png width in pixel. + Width int + + //NoiseCount text noise count. + NoiseCount int + + //ShowLineOptions := OptionShowHollowLine | OptionShowSlimeLine | OptionShowSineLine . + ShowLineOptions int + + //Length random string length. + Length int + + //Source is a unicode which is the rand string from. + Source string + + //BgColor captcha image background color (optional) + BgColor *color.RGBA + + //Fonts loads by name see fonts.go's comment + Fonts []string + fontsArray []*truetype.Font +} + +//NewDriverString creates driver +func NewDriverString(height int, width int, noiseCount int, showLineOptions int, length int, source string, bgColor *color.RGBA, fonts []string) *DriverString { + tfs := []*truetype.Font{} + for _, fff := range fonts { + tf := loadFontByName("fonts/" + fff) + tfs = append(tfs, tf) + } + if len(tfs) == 0 { + tfs = fontsAll + } + return &DriverString{Height: height, Width: width, NoiseCount: noiseCount, ShowLineOptions: showLineOptions, Length: length, Source: source, BgColor: bgColor, fontsArray: tfs} +} + +//ConvertFonts loads fonts by names +func (d *DriverString) ConvertFonts() *DriverString { + tfs := []*truetype.Font{} + for _, fff := range d.Fonts { + tf := loadFontByName("fonts/" + fff) + tfs = append(tfs, tf) + } + if len(tfs) == 0 { + tfs = fontsAll + } + d.fontsArray = tfs + return d +} + +//GenerateIdQuestionAnswer creates id,content and answer +func (d *DriverString) GenerateIdQuestionAnswer() (id, content, answer string) { + id = RandomId() + content = RandText(d.Length, d.Source) + return id, content, content +} + +//DrawCaptcha draws captcha item +func (d *DriverString) DrawCaptcha(content string) (item Item, err error) { + + var bgc color.RGBA + if d.BgColor != nil { + bgc = *d.BgColor + } else { + bgc = RandLightColor() + } + itemChar := NewItemChar(d.Width, d.Height, bgc) + + //draw hollow line + if d.ShowLineOptions&OptionShowHollowLine == OptionShowHollowLine { + itemChar.drawHollowLine() + } + + //draw slime line + if d.ShowLineOptions&OptionShowSlimeLine == OptionShowSlimeLine { + itemChar.drawSlimLine(3) + } + + //draw sine line + if d.ShowLineOptions&OptionShowSineLine == OptionShowSineLine { + itemChar.drawSineLine() + } + + //draw noise + if d.NoiseCount > 0 { + source := TxtNumbers + TxtAlphabet + ",.[]<>" + noise := RandText(d.NoiseCount, strings.Repeat(source, d.NoiseCount)) + err = itemChar.drawNoise(noise, d.fontsArray) + if err != nil { + return + } + } + + //draw content + err = itemChar.drawText(content, d.fontsArray) + if err != nil { + return + } + + return itemChar, nil +} diff --git a/vendor/github.com/mojocn/base64Captcha/fonts.go b/vendor/github.com/mojocn/base64Captcha/fonts.go new file mode 100644 index 00000000..ba5fb1c4 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/fonts.go @@ -0,0 +1,257 @@ +package base64Captcha + +import ( + "github.com/golang/freetype" + "github.com/golang/freetype/truetype" + "math/rand" +) + +var fontsSimple = loadFontsByNames([]string{ + "fonts/3Dumb.ttf", + "fonts/ApothecaryFont.ttf", + "fonts/Comismsh.ttf", + "fonts/DENNEthree-dee.ttf", + "fonts/DeborahFancyDress.ttf", + "fonts/Flim-Flam.ttf", + "fonts/RitaSmith.ttf", + "fonts/actionj.ttf", + "fonts/chromohv.ttf", +}) + +//var fontemoji = loadFontByName("fonts/seguiemj.ttf") +var fontsAll = append(fontsSimple, fontChinese) +var fontChinese = loadFontByName("fonts/wqy-microhei.ttc") + +func loadFontByName(name string) *truetype.Font { + fontBytes, err := Asset(name) + if err != nil { + panic(err) + } + //font file bytes to trueTypeFont + trueTypeFont, err := freetype.ParseFont(fontBytes) + if err != nil { + panic(err) + } + return trueTypeFont +} + +//loadFontsByNames import fonts from dir. +//make the simple-font(RitaSmith.ttf) the first font of trueTypeFonts. +func loadFontsByNames(assetFontNames []string) []*truetype.Font { + fonts := make([]*truetype.Font, 0) + for _, assetName := range assetFontNames { + f := loadFontByName(assetName) + fonts = append(fonts, f) + } + return fonts +} + +//randFontFrom choose random font family.选择随机的字体 +func randFontFrom(fonts []*truetype.Font) *truetype.Font { + fontCount := len(fonts) + index := rand.Intn(fontCount) + return fonts[index] +} + +var digitFontData = [][]byte{ + { // 0 + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + }, + { // 1 + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + }, + { // 2 + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + }, + { // 3 + 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + }, + { // 4 + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + }, + { // 5 + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, + }, + { // 6 + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + }, + { // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + }, + { // 8 + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + }, + { // 9 + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + }, +} diff --git a/vendor/github.com/mojocn/base64Captcha/go.mod b/vendor/github.com/mojocn/base64Captcha/go.mod new file mode 100644 index 00000000..6ffc7e1e --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/go.mod @@ -0,0 +1,8 @@ +module github.com/mojocn/base64Captcha + +go 1.12 + +require ( + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 + golang.org/x/image v0.0.0-20190501045829-6d32002ffd75 +) diff --git a/vendor/github.com/mojocn/base64Captcha/go.sum b/vendor/github.com/mojocn/base64Captcha/go.sum new file mode 100644 index 00000000..c4ac3bd0 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/go.sum @@ -0,0 +1,6 @@ +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +golang.org/x/image v0.0.0-20190501045829-6d32002ffd75 h1:TbGuee8sSq15Iguxu4deQ7+Bqq/d2rsQejGcEtADAMQ= +golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/vendor/github.com/mojocn/base64Captcha/interface_driver.go b/vendor/github.com/mojocn/base64Captcha/interface_driver.go new file mode 100644 index 00000000..06e25ff8 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/interface_driver.go @@ -0,0 +1,9 @@ +package base64Captcha + +// Driver captcha interface for captcha engine to to write staff +type Driver interface { + //DrawCaptcha draws binary item + DrawCaptcha(content string) (item Item, err error) + //GenerateIdQuestionAnswer creates rand id, content and answer + GenerateIdQuestionAnswer() (id, q, a string) +} diff --git a/vendor/github.com/mojocn/base64Captcha/interface_item.go b/vendor/github.com/mojocn/base64Captcha/interface_item.go new file mode 100644 index 00000000..d0e679ce --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/interface_item.go @@ -0,0 +1,11 @@ +package base64Captcha + +import "io" + +//Item is captcha item interface +type Item interface { + //WriteTo writes to a writer + WriteTo(w io.Writer) (n int64, err error) + //EncodeB64string encodes as base64 string + EncodeB64string() string +} diff --git a/vendor/github.com/mojocn/base64Captcha/interface_store.go b/vendor/github.com/mojocn/base64Captcha/interface_store.go new file mode 100644 index 00000000..361fd4ad --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/interface_store.go @@ -0,0 +1,20 @@ +package base64Captcha + +// Store An object implementing Store interface can be registered with SetCustomStore +// function to handle storage and retrieval of captcha ids and solutions for +// them, replacing the default memory store. +// +// It is the responsibility of an object to delete expired and used captchas +// when necessary (for example, the default memory store collects them in Set +// method after the certain amount of captchas has been stored.) +type Store interface { + // Set sets the digits for the captcha id. + Set(id string, value string) + + // Get returns stored digits for the captcha id. Clear indicates + // whether the captcha must be deleted from the store. + Get(id string, clear bool) string + + //Verify captcha's answer directly + Verify(id, answer string, clear bool) bool +} diff --git a/vendor/github.com/mojocn/base64Captcha/item_audio.go b/vendor/github.com/mojocn/base64Captcha/item_audio.go new file mode 100644 index 00000000..7e8ca492 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/item_audio.go @@ -0,0 +1,169 @@ +// Copyright 2017 Eric Zhou. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package base64Captcha + +import ( + "bytes" + "encoding/base64" + "encoding/binary" + "fmt" + "io" + "math/rand" +) + +//ItemAudio captcha-audio-engine return type. +type ItemAudio struct { + answer string + body *bytes.Buffer + digitSounds [][]byte + //rng siprng +} + +// newAudio returns a new audio captcha with the given digits, where each digit +// must be in range 0-9. Digits are pronounced in the given language. If there +// are no sounds for the given language, English is used. +// Possible values for lang are "en", "ja", "ru", "zh". +func newAudio(id string, digits []byte, lang string) *ItemAudio { + a := new(ItemAudio) + + if sounds, ok := digitSounds[lang]; ok { + a.digitSounds = sounds + } else { + a.digitSounds = digitSounds["en"] + } + numsnd := make([][]byte, len(digits)) + for i, n := range digits { + snd := a.randomizedDigitSound(n) + setSoundLevel(snd, 1.5) + numsnd[i] = snd + } + // Random intervals between digits (including beginning). + intervals := make([]int, len(digits)+1) + intdur := 0 + for i := range intervals { + dur := randIntRange(sampleRate, sampleRate*2) // 1 to 2 seconds + intdur += dur + intervals[i] = dur + } + // Generate background sound. + bg := a.makeBackgroundSound(a.longestDigitSndLen()*len(digits) + intdur) + // Create buffer and write audio to it. + sil := makeSilence(sampleRate / 5) + bufcap := 3*len(beepSound) + 2*len(sil) + len(bg) + len(endingBeepSound) + a.body = bytes.NewBuffer(make([]byte, 0, bufcap)) + // Write prelude, three beeps. + a.body.Write(beepSound) + a.body.Write(sil) + a.body.Write(beepSound) + a.body.Write(sil) + a.body.Write(beepSound) + // Write digits. + pos := intervals[0] + for i, v := range numsnd { + mixSound(bg[pos:], v) + pos += len(v) + intervals[i+1] + } + a.body.Write(bg) + // Write ending (one beep). + a.body.Write(endingBeepSound) + return a +} + +// encodedLen returns the length of WAV-encoded audio captcha. +func (a *ItemAudio) encodedLen() int { + return len(waveHeader) + 4 + a.body.Len() +} + +func (a *ItemAudio) makeBackgroundSound(length int) []byte { + b := a.makeWhiteNoise(length, 4) + for i := 0; i < length/(sampleRate/10); i++ { + snd := reversedSound(a.digitSounds[rand.Intn(10)]) + //snd = changeSpeed(snd, a.rng.Float(0.8, 1.2)) + place := rand.Intn(len(b) - len(snd)) + setSoundLevel(snd, randFloat64Range(0.04, 0.08)) + mixSound(b[place:], snd) + } + return b +} + +func (a *ItemAudio) randomizedDigitSound(n byte) []byte { + s := a.randomSpeed(a.digitSounds[n]) + setSoundLevel(s, randFloat64Range(0.85, 1.2)) + return s +} + +func (a *ItemAudio) longestDigitSndLen() int { + n := 0 + for _, v := range a.digitSounds { + if n < len(v) { + n = len(v) + } + } + return n +} + +func (a *ItemAudio) randomSpeed(b []byte) []byte { + pitch := randFloat64Range(0.95, 1.1) + return changeSpeed(b, pitch) +} + +func (a *ItemAudio) makeWhiteNoise(length int, level uint8) []byte { + noise := randBytes(length) + adj := 128 - level/2 + for i, v := range noise { + v %= level + v += adj + noise[i] = v + } + return noise +} + +// WriteTo writes captcha audio in WAVE format into the given io.Writer, and +// returns the number of bytes written and an error if any. +func (a *ItemAudio) WriteTo(w io.Writer) (n int64, err error) { + // Calculate padded length of PCM chunk data. + bodyLen := uint32(a.body.Len()) + paddedBodyLen := bodyLen + if bodyLen%2 != 0 { + paddedBodyLen++ + } + totalLen := uint32(len(waveHeader)) - 4 + paddedBodyLen + // Header. + header := make([]byte, len(waveHeader)+4) // includes 4 bytes for chunk size + copy(header, waveHeader) + // Put the length of whole RIFF chunk. + binary.LittleEndian.PutUint32(header[4:], totalLen) + // Put the length of WAVE chunk. + binary.LittleEndian.PutUint32(header[len(waveHeader):], bodyLen) + // Write header. + nn, err := w.Write(header) + n = int64(nn) + if err != nil { + return + } + // Write data. + n, err = a.body.WriteTo(w) + n += int64(nn) + if err != nil { + return + } + // Pad byte if chunk length is odd. + // (As header has even length, we can check if n is odd, not chunk). + if bodyLen != paddedBodyLen { + w.Write([]byte{0}) + n++ + } + return +} + +// EncodeB64string encodes a sound to base64 string +func (a *ItemAudio) EncodeB64string() string { + var buf bytes.Buffer + if _, err := a.WriteTo(&buf); err != nil { + panic(err) + } + return fmt.Sprintf("data:%s;base64,%s", MimeTypeAudio, base64.StdEncoding.EncodeToString(buf.Bytes())) + +} diff --git a/vendor/github.com/mojocn/base64Captcha/item_char.go b/vendor/github.com/mojocn/base64Captcha/item_char.go new file mode 100644 index 00000000..df07d19e --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/item_char.go @@ -0,0 +1,260 @@ +package base64Captcha + +import ( + "bytes" + "encoding/base64" + "errors" + "fmt" + "github.com/golang/freetype" + "github.com/golang/freetype/truetype" + "golang.org/x/image/font" + "image" + "image/color" + "image/draw" + "image/png" + "io" + "log" + "math" + "math/rand" +) + +//ItemChar captcha item of unicode characters +type ItemChar struct { + bgColor color.Color + width int + height int + nrgba *image.NRGBA +} + +//NewItemChar creates a captcha item of characters +func NewItemChar(w int, h int, bgColor color.RGBA) *ItemChar { + d := ItemChar{width: w, height: h} + m := image.NewNRGBA(image.Rect(0, 0, w, h)) + draw.Draw(m, m.Bounds(), &image.Uniform{bgColor}, image.ZP, draw.Src) + d.nrgba = m + return &d +} + +//drawHollowLine draw strong and bold white line. +func (item *ItemChar) drawHollowLine() *ItemChar { + + first := item.width / 20 + end := first * 19 + + lineColor := RandLightColor() + + x1 := float64(rand.Intn(first)) + //y1 := float64(rand.Intn(y)+y); + + x2 := float64(rand.Intn(first) + end) + + multiple := float64(rand.Intn(5)+3) / float64(5) + if int(multiple*10)%3 == 0 { + multiple = multiple * -1.0 + } + + w := item.height / 20 + + for ; x1 < x2; x1++ { + + y := math.Sin(x1*math.Pi*multiple/float64(item.width)) * float64(item.height/3) + + if multiple < 0 { + y = y + float64(item.height/2) + } + item.nrgba.Set(int(x1), int(y), lineColor) + + for i := 0; i <= w; i++ { + item.nrgba.Set(int(x1), int(y)+i, lineColor) + } + } + + return item +} + +//drawSineLine draw a sine line. +func (item *ItemChar) drawSineLine() *ItemChar { + var py float64 + + //振幅 + a := rand.Intn(item.height / 2) + + //Y轴方向偏移量 + b := random(int64(-item.height/4), int64(item.height/4)) + + //X轴方向偏移量 + f := random(int64(-item.height/4), int64(item.height/4)) + // 周期 + var t float64 + if item.height > item.width/2 { + t = random(int64(item.width/2), int64(item.height)) + } else if item.height == item.width/2 { + t = float64(item.height) + } else { + t = random(int64(item.height), int64(item.width/2)) + } + w := float64((2 * math.Pi) / t) + + // 曲线横坐标起始位置 + px1 := 0 + px2 := int(random(int64(float64(item.width)*0.8), int64(item.width))) + + c := RandDeepColor() + + for px := px1; px < px2; px++ { + if w != 0 { + py = float64(a)*math.Sin(w*float64(px)+f) + b + (float64(item.width) / float64(5)) + i := item.height / 5 + for i > 0 { + item.nrgba.Set(px+i, int(py), c) + //fmt.Println(px + i,int(py) ) + i-- + } + } + } + + return item +} + +//drawSlimLine draw n slim-random-color lines. +func (item *ItemChar) drawSlimLine(num int) *ItemChar { + + first := item.width / 10 + end := first * 9 + + y := item.height / 3 + + for i := 0; i < num; i++ { + + point1 := point{X: rand.Intn(first), Y: rand.Intn(y)} + point2 := point{X: rand.Intn(first) + end, Y: rand.Intn(y)} + + if i%2 == 0 { + point1.Y = rand.Intn(y) + y*2 + point2.Y = rand.Intn(y) + } else { + point1.Y = rand.Intn(y) + y*(i%2) + point2.Y = rand.Intn(y) + y*2 + } + + item.drawBeeline(point1, point2, RandDeepColor()) + + } + return item +} + +func (item *ItemChar) drawBeeline(point1 point, point2 point, lineColor color.RGBA) { + dx := math.Abs(float64(point1.X - point2.X)) + + dy := math.Abs(float64(point2.Y - point1.Y)) + sx, sy := 1, 1 + if point1.X >= point2.X { + sx = -1 + } + if point1.Y >= point2.Y { + sy = -1 + } + err := dx - dy + for { + item.nrgba.Set(point1.X, point1.Y, lineColor) + item.nrgba.Set(point1.X+1, point1.Y, lineColor) + item.nrgba.Set(point1.X-1, point1.Y, lineColor) + item.nrgba.Set(point1.X+2, point1.Y, lineColor) + item.nrgba.Set(point1.X-2, point1.Y, lineColor) + if point1.X == point2.X && point1.Y == point2.Y { + return + } + e2 := err * 2 + if e2 > -dy { + err -= dy + point1.X += sx + } + if e2 < dx { + err += dx + point1.Y += sy + } + } +} + +func (item *ItemChar) drawNoise(noiseText string, fonts []*truetype.Font) error { + + c := freetype.NewContext() + c.SetDPI(imageStringDpi) + + c.SetClip(item.nrgba.Bounds()) + c.SetDst(item.nrgba) + c.SetHinting(font.HintingFull) + rawFontSize := float64(item.height) / (1 + float64(rand.Intn(7))/float64(10)) + + for _, char := range noiseText { + rw := rand.Intn(item.width) + rh := rand.Intn(item.height) + fontSize := rawFontSize/2 + float64(rand.Intn(5)) + c.SetSrc(image.NewUniform(RandLightColor())) + c.SetFontSize(fontSize) + c.SetFont(randFontFrom(fonts)) + pt := freetype.Pt(rw, rh) + if _, err := c.DrawString(string(char), pt); err != nil { + log.Println(err) + } + } + return nil +} + +//drawText draw captcha string to image.把文字写入图像验证码 + +func (item *ItemChar) drawText(text string, fonts []*truetype.Font) error { + c := freetype.NewContext() + c.SetDPI(imageStringDpi) + c.SetClip(item.nrgba.Bounds()) + c.SetDst(item.nrgba) + c.SetHinting(font.HintingFull) + + if len(text) == 0 { + return errors.New("text must not be empty, there is nothing to draw") + } + + fontWidth := item.width / len(text) + + for i, s := range text { + fontSize := float64(item.height) / (1 + float64(rand.Intn(7))/float64(9)) + c.SetSrc(image.NewUniform(RandDeepColor())) + c.SetFontSize(fontSize) + //useFont := randFontFrom(fonts) + c.SetFont(randFontFrom(fonts)) + x := int(fontWidth)*i + int(fontWidth)/int(fontSize) + //todo y 坐标要修复 + y := 5 + rand.Intn(item.height/2) + int(fontSize/2) + pt := freetype.Pt(x, y) + if _, err := c.DrawString(string(s), pt); err != nil { + return err + } + } + return nil +} + +//BinaryEncoding encodes an image to PNG and returns a byte slice. +func (item *ItemChar) BinaryEncoding() []byte { + var buf bytes.Buffer + if err := png.Encode(&buf, item.nrgba); err != nil { + panic(err.Error()) + } + return buf.Bytes() +} + +// WriteTo writes captcha character in png format into the given io.Writer, and +// returns the number of bytes written and an error if any. +func (item *ItemChar) WriteTo(w io.Writer) (int64, error) { + n, err := w.Write(item.BinaryEncoding()) + return int64(n), err +} + +// EncodeB64string encodes an image to base64 string +func (item *ItemChar) EncodeB64string() string { + return fmt.Sprintf("data:%s;base64,%s", MimeTypeImage, base64.StdEncoding.EncodeToString(item.BinaryEncoding())) +} + +type point struct { + X int + Y int +} diff --git a/vendor/github.com/mojocn/base64Captcha/item_digit.go b/vendor/github.com/mojocn/base64Captcha/item_digit.go new file mode 100644 index 00000000..82c9e18d --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/item_digit.go @@ -0,0 +1,252 @@ +package base64Captcha + +import ( + "bytes" + "encoding/base64" + "fmt" + "image" + "image/color" + "image/png" + "io" + "math" + "math/rand" +) + +const ( + digitFontWidth = 11 + digitFontHeight = 18 + digitFontBlackChar = 1 +) + +// ItemDigit digits captcha Struct +type ItemDigit struct { + width int + height int + *image.Paletted + dotSize int + dotCount int + maxSkew float64 + //rng siprng +} + +//NewItemDigit create a instance of item-digit +func NewItemDigit(width int, height int, dotCount int, maxSkew float64) *ItemDigit { + itemDigit := &ItemDigit{width: width, height: height, dotCount: dotCount, maxSkew: maxSkew} + //init image.Paletted + itemDigit.Paletted = image.NewPaletted(image.Rect(0, 0, width, height), createRandPaletteColors(dotCount)) + return itemDigit +} + +func createRandPaletteColors(dotCount int) color.Palette { + p := make([]color.Color, dotCount+1) + // Transparent color. + p[0] = color.RGBA{0xFF, 0xFF, 0xFF, 0x00} + // Primary color. + prim := color.RGBA{ + uint8(rand.Intn(129)), + uint8(rand.Intn(129)), + uint8(rand.Intn(129)), + 0xFF, + } + p[1] = prim + // Circle colors. + for i := 2; i <= dotCount; i++ { + p[i] = randomBrightness(prim, 255) + } + return p +} + +func (m *ItemDigit) calculateSizes(width, height, ncount int) { + // Goal: fit all digits inside the image. + var border int + if width > height { + border = height / 4 + } else { + border = width / 4 + } + // Convert everything to floats for calculations. + w := float64(width - border*2) + h := float64(height - border*2) + // fw takes into account 1-dot spacing between digits. + fw := float64(digitFontWidth + 1) + fh := float64(digitFontHeight) + nc := float64(ncount) + // Calculate the width of a single digit taking into account only the + // width of the image. + nw := w / nc + // Calculate the height of a digit from this width. + nh := nw * fh / fw + // Digit too high? + if nh > h { + // Fit digits based on height. + nh = h + nw = fw / fh * nh + } + // Calculate dot size. + m.dotSize = int(nh / fh) + if m.dotSize < 1 { + m.dotSize = 1 + } + // Save everything, making the actual width smaller by 1 dot to account + // for spacing between digits. + m.width = int(nw) - m.dotSize + m.height = int(nh) +} + +func (m *ItemDigit) drawHorizLine(fromX, toX, y int, colorIdx uint8) { + for x := fromX; x <= toX; x++ { + m.SetColorIndex(x, y, colorIdx) + } +} + +func (m *ItemDigit) drawCircle(x, y, radius int, colorIdx uint8) { + f := 1 - radius + dfx := 1 + dfy := -2 * radius + xo := 0 + yo := radius + + m.SetColorIndex(x, y+radius, colorIdx) + m.SetColorIndex(x, y-radius, colorIdx) + m.drawHorizLine(x-radius, x+radius, y, colorIdx) + + for xo < yo { + if f >= 0 { + yo-- + dfy += 2 + f += dfy + } + xo++ + dfx += 2 + f += dfx + m.drawHorizLine(x-xo, x+xo, y+yo, colorIdx) + m.drawHorizLine(x-xo, x+xo, y-yo, colorIdx) + m.drawHorizLine(x-yo, x+yo, y+xo, colorIdx) + m.drawHorizLine(x-yo, x+yo, y-xo, colorIdx) + } +} + +func (m *ItemDigit) fillWithCircles(n, maxradius int) { + maxx := m.Bounds().Max.X + maxy := m.Bounds().Max.Y + for i := 0; i < n; i++ { + //colorIdx := uint8(m.rng.Int(1, m.dotCount-1)) + colorIdx := uint8(randIntRange(1, m.dotCount-1)) + //r := m.rng.Int(1, maxradius) + r := randIntRange(1, maxradius) + //m.drawCircle(m.rng.Int(r, maxx-r), m.rng.Int(r, maxy-r), r, colorIdx) + m.drawCircle(randIntRange(r, maxx-r), randIntRange(r, maxy-r), r, colorIdx) + } +} + +func (m *ItemDigit) strikeThrough() { + maxx := m.Bounds().Max.X + maxy := m.Bounds().Max.Y + y := randIntRange(maxy/3, maxy-maxy/3) + amplitude := randFloat64Range(5, 20) + period := randFloat64Range(80, 180) + dx := 2.0 * math.Pi / period + for x := 0; x < maxx; x++ { + xo := amplitude * math.Cos(float64(y)*dx) + yo := amplitude * math.Sin(float64(x)*dx) + for yn := 0; yn < m.dotSize; yn++ { + //r := m.rng.Int(0, m.dotSize) + r := rand.Intn(m.dotSize) + m.drawCircle(x+int(xo), y+int(yo)+(yn*m.dotSize), r/2, 1) + } + } +} + +//draw digit +func (m *ItemDigit) drawDigit(digit []byte, x, y int) { + skf := randFloat64Range(-m.maxSkew, m.maxSkew) + xs := float64(x) + r := m.dotSize / 2 + y += randIntRange(-r, r) + for yo := 0; yo < digitFontHeight; yo++ { + for xo := 0; xo < digitFontWidth; xo++ { + if digit[yo*digitFontWidth+xo] != digitFontBlackChar { + continue + } + m.drawCircle(x+xo*m.dotSize, y+yo*m.dotSize, r, 1) + } + xs += skf + x = int(xs) + } +} + +func (m *ItemDigit) distort(amplude float64, period float64) { + w := m.Bounds().Max.X + h := m.Bounds().Max.Y + + oldm := m.Paletted + newm := image.NewPaletted(image.Rect(0, 0, w, h), oldm.Palette) + + dx := 2.0 * math.Pi / period + for x := 0; x < w; x++ { + for y := 0; y < h; y++ { + xo := amplude * math.Sin(float64(y)*dx) + yo := amplude * math.Cos(float64(x)*dx) + newm.SetColorIndex(x, y, oldm.ColorIndexAt(x+int(xo), y+int(yo))) + } + } + m.Paletted = newm +} + +func randomBrightness(c color.RGBA, max uint8) color.RGBA { + minc := min3(c.R, c.G, c.B) + maxc := max3(c.R, c.G, c.B) + if maxc > max { + return c + } + n := rand.Intn(int(max-maxc)) - int(minc) + return color.RGBA{ + uint8(int(c.R) + n), + uint8(int(c.G) + n), + uint8(int(c.B) + n), + uint8(c.A), + } +} + +func min3(x, y, z uint8) (m uint8) { + m = x + if y < m { + m = y + } + if z < m { + m = z + } + return +} + +func max3(x, y, z uint8) (m uint8) { + m = x + if y > m { + m = y + } + if z > m { + m = z + } + return +} + +// EncodeBinary encodes an image to PNG and returns a byte slice. +func (m *ItemDigit) EncodeBinary() []byte { + var buf bytes.Buffer + if err := png.Encode(&buf, m.Paletted); err != nil { + panic(err.Error()) + } + return buf.Bytes() +} + +// WriteTo writes captcha character in png format into the given io.Writer, and +// returns the number of bytes written and an error if any. +func (m *ItemDigit) WriteTo(w io.Writer) (int64, error) { + n, err := w.Write(m.EncodeBinary()) + return int64(n), err +} + +// EncodeB64string encodes an image to base64 string +func (m *ItemDigit) EncodeB64string() string { + return fmt.Sprintf("data:%s;base64,%s", MimeTypeImage, base64.StdEncoding.EncodeToString(m.EncodeBinary())) +} diff --git a/vendor/github.com/mojocn/base64Captcha/main.go.md b/vendor/github.com/mojocn/base64Captcha/main.go.md new file mode 100644 index 00000000..965c7b6e --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/main.go.md @@ -0,0 +1,154 @@ +```go +// example of HTTP server that uses the captcha package. +package main + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + "os" + "time" + + "github.com/go-redis/redis" + "github.com/mojocn/base64Captcha" +) + +// customizeRdsStore An object implementing Store interface +type customizeRdsStore struct { + redisClient *redis.Client +} + +// customizeRdsStore implementing Set method of Store interface +func (s *customizeRdsStore) Set(id string, value string) { + err := s.redisClient.Set(id, value, time.Minute*10).Err() + if err != nil { + log.Println(err) + } +} + +// customizeRdsStore implementing Get method of Store interface +func (s *customizeRdsStore) Get(id string, clear bool) (value string) { + val, err := s.redisClient.Get(id).Result() + if err != nil { + log.Println(err) + return "" + } + if clear { + err := s.redisClient.Del(id).Err() + if err != nil { + log.Println(err) + return "" + } + } + return val +} + +func init() { + // create redis client + client := redis.NewClient(&redis.Options{ + Addr: "127.0.0.1:6379", + Password: "", // no password set + DB: 0, // use default DB + }) + // init redis store + customeStore := customizeRdsStore{client} + + base64Captcha.SetCustomStore(&customeStore) + +} + +// ConfigJsonBody json request body. +type ConfigJsonBody struct { + Id string + CaptchaType string + VerifyValue string + ConfigAudio base64Captcha.ConfigAudio + ConfigCharacter base64Captcha.ConfigCharacter + ConfigDigit base64Captcha.ConfigDigit +} + +// base64Captcha create http handler +func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) { + // parse request parameters + // 接收客户端发送来的请求参数 + decoder := json.NewDecoder(r.Body) + var postParameters ConfigJsonBody + err := decoder.Decode(&postParameters) + if err != nil { + log.Println(err) + } + defer r.Body.Close() + + // create base64 encoding captcha + // 创建base64图像验证码 + + var config interface{} + switch postParameters.CaptchaType { + case "audio": + config = postParameters.ConfigAudio + case "character": + config = postParameters.ConfigCharacter + default: + config = postParameters.ConfigDigit + } + captchaId, captcaInterfaceInstance := base64Captcha.GenerateCaptcha(postParameters.Id, config) + base64blob := base64Captcha.CaptchaWriteToBase64Encoding(captcaInterfaceInstance) + + // or you can just write the captcha content to the httpResponseWriter. + // before you put the captchaId into the response COOKIE. + // captcaInterfaceInstance.WriteTo(w) + + // set json response + // 设置json响应 + w.Header().Set("Content-Type", "application/json; charset=utf-8") + body := map[string]interface{}{"code": 1, "data": base64blob, "captchaId": captchaId, "msg": "success"} + json.NewEncoder(w).Encode(body) +} + +// base64Captcha verify http handler +func captchaVerifyHandle(w http.ResponseWriter, r *http.Request) { + + // parse request parameters + // 接收客户端发送来的请求参数 + decoder := json.NewDecoder(r.Body) + var postParameters ConfigJsonBody + err := decoder.Decode(&postParameters) + if err != nil { + log.Println(err) + } + defer r.Body.Close() + // verify the captcha + // 比较图像验证码 + verifyResult := base64Captcha.VerifyCaptcha(postParameters.Id, postParameters.VerifyValue) + + // set json response + // 设置json响应 + w.Header().Set("Content-Type", "application/json; charset=utf-8") + body := map[string]interface{}{"code": "error", "data": "验证失败", "msg": "captcha failed"} + if verifyResult { + body = map[string]interface{}{"code": "success", "data": "验证通过", "msg": "captcha verified"} + } + json.NewEncoder(w).Encode(body) +} + +// start a net/http server +func main() { + + staticPath := fmt.Sprintf("%s/src/github.com/mojocn/base64Captcha/_examples/static", os.Getenv("GOPATH")) + + // serve Vuejs+ElementUI+Axios Web Application + http.Handle("/", http.FileServer(http.Dir(staticPath))) + + // api for create captcha + http.HandleFunc("/api/getCaptcha", generateCaptchaHandler) + + // api for verify captcha + http.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle) + + fmt.Println("Server is at localhost:7777") + if err := http.ListenAndServe("localhost:7777", nil); err != nil { + log.Fatal(err) + } +} +``` diff --git a/vendor/github.com/mojocn/base64Captcha/random_math.go b/vendor/github.com/mojocn/base64Captcha/random_math.go new file mode 100644 index 00000000..8a8d41b4 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/random_math.go @@ -0,0 +1,115 @@ +package base64Captcha + +import ( + "encoding/binary" + "image/color" + "math" + "math/rand" + "strings" + "time" +) + +func init() { + //init rand seed + rand.Seed(time.Now().UnixNano()) +} + +//RandText creates random text of given size. +func RandText(size int, sourceChars string) string { + if sourceChars == "" || size == 0 { + return "" + } + + if size >= len(sourceChars) { + sourceChars = strings.Repeat(sourceChars, size) + } + + sourceRunes := []rune(sourceChars) + sourceLength := len(sourceRunes) + + text := make([]rune, size) + for i := range text { + text[i] = sourceRunes[rand.Intn(sourceLength)] + } + return string(text) +} + +//Random get random number between min and max. 生成指定大小的随机数. +func random(min int64, max int64) float64 { + return float64(min) + rand.Float64()*float64(max-min) +} + +//RandDeepColor get random deep color. 随机生成深色系. +func RandDeepColor() color.RGBA { + + randColor := RandColor() + + increase := float64(30 + rand.Intn(255)) + + red := math.Abs(math.Min(float64(randColor.R)-increase, 255)) + + green := math.Abs(math.Min(float64(randColor.G)-increase, 255)) + blue := math.Abs(math.Min(float64(randColor.B)-increase, 255)) + + return color.RGBA{R: uint8(red), G: uint8(green), B: uint8(blue), A: uint8(255)} +} + +//RandLightColor get random ligth color. 随机生成浅色. +func RandLightColor() color.RGBA { + red := rand.Intn(55) + 200 + green := rand.Intn(55) + 200 + blue := rand.Intn(55) + 200 + return color.RGBA{R: uint8(red), G: uint8(green), B: uint8(blue), A: uint8(255)} +} + +//RandColor get random color. 生成随机颜色. +func RandColor() color.RGBA { + red := rand.Intn(255) + green := rand.Intn(255) + var blue int + if (red + green) > 400 { + blue = 0 + } else { + blue = 400 - green - red + } + if blue > 255 { + blue = 255 + } + return color.RGBA{R: uint8(red), G: uint8(green), B: uint8(blue), A: uint8(255)} +} + +func randIntRange(from, to int) int { + // rand.Intn panics if n <= 0. + if to-from <= 0 { + return from + } + return rand.Intn(to-from) + from +} +func randFloat64Range(from, to float64) float64 { + return rand.Float64()*(to-from) + from +} +func randBytes(n int) []byte { + // Since we don't have a buffer for generated bytes in siprng state, + // we just generate enough 8-byte blocks and then cut the result to the + // required length. Doing it this way, we lose generated bytes, and we + // don't get the strictly sequential deterministic output from PRNG: + // calling Uint64() and then Bytes(3) produces different output than + // when calling them in the reverse order, but for our applications + // this is OK. + numBlocks := (n + 8 - 1) / 8 + b := make([]byte, numBlocks*8) + for i := 0; i < len(b); i += 8 { + + binary.LittleEndian.PutUint64(b[i:], rand.Uint64()) + } + return b[:n] +} + +// RandomId returns a new random id key string. +func RandomId() string { + b := randomBytesMod(idLen, byte(len(idChars))) + for i, c := range b { + b[i] = idChars[c] + } + return string(b) +} diff --git a/vendor/github.com/mojocn/base64Captcha/sounds.go b/vendor/github.com/mojocn/base64Captcha/sounds.go new file mode 100644 index 00000000..47e33246 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/sounds.go @@ -0,0 +1,9726 @@ +package base64Captcha + +// This file has been generated from .wav files using generate.go. + +var waveHeader = []byte{ + 0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45, + 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x40, 0x1f, 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, + 0x64, 0x61, 0x74, 0x61, +} + +// Byte slices contain raw 8 kHz unsigned 8-bit PCM data (without wav header). + +var digitSounds = map[string][][]byte{ + "en": { + { // 0 + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7e, 0x7d, + 0x7e, 0x7c, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x82, 0x81, + 0x83, 0x82, 0x84, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8a, + 0x8c, 0x8a, 0x8b, 0x8b, 0x8a, 0x8a, 0x88, 0x88, 0x86, 0x84, 0x82, + 0x80, 0x7e, 0x7c, 0x7c, 0x7b, 0x7c, 0x79, 0x77, 0x78, 0x76, 0x75, + 0x73, 0x75, 0x75, 0x75, 0x73, 0x72, 0x71, 0x73, 0x76, 0x70, 0x76, + 0x71, 0x77, 0x75, 0x74, 0x78, 0x73, 0x79, 0x76, 0x76, 0x75, 0x75, + 0x75, 0x79, 0x7f, 0x80, 0x81, 0x83, 0x88, 0x8d, 0x90, 0x91, 0x91, + 0x94, 0x98, 0x97, 0x97, 0x95, 0x94, 0x93, 0x92, 0x8d, 0x8a, 0x86, + 0x84, 0x81, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x81, 0x81, 0x85, 0x81, + 0x85, 0x85, 0x86, 0x88, 0x84, 0x83, 0x7d, 0x79, 0x77, 0x77, 0x77, + 0x75, 0x72, 0x75, 0x75, 0x75, 0x72, 0x73, 0x72, 0x76, 0x76, 0x74, + 0x74, 0x75, 0x77, 0x78, 0x79, 0x76, 0x79, 0x78, 0x7c, 0x7c, 0x7c, + 0x7d, 0x7e, 0x7e, 0x7f, 0x7b, 0x7e, 0x7c, 0x7e, 0x7f, 0x80, 0x80, + 0x7f, 0x85, 0x84, 0x89, 0x85, 0x89, 0x8c, 0x8e, 0x8e, 0x8d, 0x90, + 0x90, 0x91, 0x8c, 0x8d, 0x89, 0x8c, 0x8a, 0x88, 0x89, 0x84, 0x87, + 0x85, 0x86, 0x83, 0x84, 0x82, 0x7f, 0x85, 0x81, 0x81, 0x7e, 0x80, + 0x7d, 0x7e, 0x7e, 0x79, 0x7c, 0x7a, 0x7a, 0x79, 0x79, 0x77, 0x78, + 0x79, 0x77, 0x76, 0x79, 0x78, 0x79, 0x77, 0x79, 0x79, 0x79, 0x78, + 0x78, 0x7a, 0x78, 0x7b, 0x79, 0x7a, 0x79, 0x7b, 0x7b, 0x79, 0x7c, + 0x79, 0x7d, 0x7c, 0x7d, 0x7d, 0x7c, 0x7e, 0x7d, 0x7f, 0x7c, 0x7f, + 0x7c, 0x7f, 0x7f, 0x82, 0x81, 0x82, 0x84, 0x82, 0x89, 0x82, 0x8a, + 0x83, 0x8b, 0x88, 0x86, 0x8b, 0x85, 0x8d, 0x86, 0x89, 0x84, 0x89, + 0x88, 0x84, 0x84, 0x83, 0x85, 0x83, 0x82, 0x80, 0x84, 0x81, 0x83, + 0x7f, 0x80, 0x82, 0x7e, 0x81, 0x7c, 0x7f, 0x7d, 0x7c, 0x7c, 0x7b, + 0x7d, 0x7a, 0x7d, 0x79, 0x7c, 0x7b, 0x7a, 0x7d, 0x79, 0x7d, 0x7d, + 0x7b, 0x7d, 0x79, 0x7e, 0x7d, 0x79, 0x7d, 0x7a, 0x7d, 0x7f, 0x7b, + 0x7d, 0x7c, 0x7d, 0x7d, 0x7a, 0x7e, 0x7c, 0x7e, 0x7e, 0x7c, 0x7e, + 0x7f, 0x81, 0x7f, 0x7d, 0x81, 0x80, 0x82, 0x80, 0x81, 0x84, 0x85, + 0x87, 0x84, 0x85, 0x86, 0x8a, 0x85, 0x88, 0x85, 0x8b, 0x87, 0x88, + 0x87, 0x84, 0x89, 0x84, 0x86, 0x81, 0x84, 0x84, 0x82, 0x83, 0x81, + 0x81, 0x83, 0x81, 0x80, 0x7e, 0x82, 0x7c, 0x80, 0x7e, 0x7b, 0x82, + 0x78, 0x7f, 0x7c, 0x79, 0x7e, 0x77, 0x7c, 0x7e, 0x7a, 0x7b, 0x7a, + 0x7c, 0x7d, 0x77, 0x7b, 0x7a, 0x7e, 0x7e, 0x7a, 0x7e, 0x7a, 0x7d, + 0x7a, 0x7b, 0x7c, 0x7b, 0x7e, 0x7b, 0x7a, 0x7f, 0x7c, 0x7c, 0x7d, + 0x7b, 0x7f, 0x7e, 0x7f, 0x7c, 0x80, 0x80, 0x80, 0x80, 0x81, 0x82, + 0x82, 0x85, 0x82, 0x88, 0x83, 0x88, 0x84, 0x88, 0x89, 0x85, 0x88, + 0x85, 0x8a, 0x85, 0x86, 0x85, 0x86, 0x86, 0x83, 0x81, 0x84, 0x85, + 0x81, 0x7f, 0x80, 0x81, 0x81, 0x7e, 0x7c, 0x7e, 0x85, 0x7c, 0x7b, + 0x7d, 0x81, 0x7f, 0x77, 0x7d, 0x77, 0x85, 0x79, 0x78, 0x7e, 0x78, + 0x82, 0x72, 0x7e, 0x7c, 0x7b, 0x80, 0x76, 0x7f, 0x7e, 0x7a, 0x76, + 0x7d, 0x7c, 0x76, 0x7b, 0x75, 0x7b, 0x7a, 0x77, 0x77, 0x77, 0x7e, + 0x7c, 0x7a, 0x7a, 0x83, 0x87, 0x7d, 0x86, 0x84, 0x8c, 0x8a, 0x87, + 0x89, 0x8b, 0x90, 0x87, 0x88, 0x86, 0x8f, 0x89, 0x83, 0x89, 0x86, + 0x89, 0x89, 0x7c, 0x87, 0x88, 0x80, 0x81, 0x7f, 0x87, 0x82, 0x81, + 0x7d, 0x85, 0x84, 0x7a, 0x7e, 0x7f, 0x7b, 0x83, 0x78, 0x79, 0x82, + 0x78, 0x7c, 0x76, 0x7b, 0x78, 0x7b, 0x78, 0x72, 0x7e, 0x76, 0x6f, + 0x78, 0x74, 0x6a, 0x77, 0x6b, 0x6a, 0x6c, 0x6d, 0x64, 0x6a, 0x71, + 0x6b, 0x77, 0x79, 0x7d, 0x84, 0x8d, 0x88, 0x90, 0x9a, 0x96, 0x98, + 0x9c, 0x9d, 0x9a, 0x9a, 0x95, 0x94, 0x93, 0x8b, 0x87, 0x87, 0x83, + 0x82, 0x84, 0x7f, 0x82, 0x84, 0x84, 0x82, 0x89, 0x8b, 0x86, 0x8e, + 0x8b, 0x87, 0x86, 0x85, 0x80, 0x7b, 0x7e, 0x78, 0x76, 0x71, 0x6e, + 0x6d, 0x64, 0x69, 0x66, 0x66, 0x61, 0x62, 0x61, 0x59, 0x62, 0x54, + 0x5e, 0x62, 0x5d, 0x6f, 0x71, 0x7e, 0x82, 0x8d, 0x94, 0x9d, 0xa5, + 0xa1, 0xaf, 0xad, 0xad, 0xa8, 0xa8, 0xa3, 0x9b, 0x96, 0x89, 0x88, + 0x81, 0x78, 0x75, 0x75, 0x75, 0x74, 0x77, 0x7c, 0x83, 0x88, 0x90, + 0x95, 0x9a, 0xa0, 0x9d, 0x9f, 0x9c, 0x93, 0x8b, 0x83, 0x7c, 0x74, + 0x6c, 0x65, 0x60, 0x5d, 0x59, 0x57, 0x56, 0x56, 0x55, 0x55, 0x50, + 0x51, 0x4f, 0x51, 0x57, 0x5e, 0x7a, 0x81, 0x82, 0x93, 0xa3, 0xaa, + 0xa6, 0xae, 0xb7, 0xb5, 0xae, 0xa4, 0xa5, 0x9f, 0x8e, 0x84, 0x80, + 0x7d, 0x72, 0x6c, 0x70, 0x73, 0x72, 0x75, 0x7e, 0x88, 0x8f, 0x96, + 0x9e, 0xa8, 0xad, 0xa7, 0xa5, 0xa1, 0x97, 0x8c, 0x82, 0x7b, 0x72, + 0x6b, 0x65, 0x61, 0x5d, 0x58, 0x59, 0x59, 0x55, 0x54, 0x54, 0x4e, + 0x4b, 0x4a, 0x4b, 0x52, 0x5d, 0x77, 0x87, 0x84, 0x91, 0xaa, 0xb0, + 0xa6, 0xae, 0xb8, 0xb2, 0xaa, 0xa2, 0x9b, 0x96, 0x8b, 0x7d, 0x77, + 0x79, 0x70, 0x69, 0x70, 0x76, 0x76, 0x7b, 0x83, 0x8f, 0x97, 0x9d, + 0xa5, 0xa9, 0xaf, 0xa9, 0xa0, 0x9e, 0x94, 0x85, 0x7b, 0x76, 0x6e, + 0x66, 0x64, 0x61, 0x60, 0x5f, 0x5e, 0x5e, 0x5f, 0x5c, 0x58, 0x57, + 0x50, 0x4a, 0x47, 0x4e, 0x53, 0x64, 0x86, 0x7f, 0x81, 0xa4, 0xb1, + 0xa8, 0xa8, 0xb8, 0xb7, 0xaa, 0xa4, 0x9d, 0x97, 0x8c, 0x7e, 0x74, + 0x73, 0x73, 0x69, 0x69, 0x74, 0x7a, 0x7d, 0x84, 0x90, 0x9a, 0xa0, + 0xa6, 0xa8, 0xab, 0xab, 0x9e, 0x96, 0x90, 0x85, 0x78, 0x70, 0x6f, + 0x69, 0x65, 0x65, 0x67, 0x67, 0x66, 0x67, 0x66, 0x66, 0x61, 0x5b, + 0x56, 0x4d, 0x48, 0x47, 0x4e, 0x55, 0x6a, 0x86, 0x82, 0x8a, 0xa6, + 0xb4, 0xad, 0xa9, 0xb5, 0xb5, 0xa9, 0x9d, 0x93, 0x8b, 0x7f, 0x74, + 0x6a, 0x66, 0x6b, 0x6d, 0x6d, 0x74, 0x82, 0x8d, 0x91, 0x99, 0xa4, + 0xab, 0xab, 0xaa, 0xa7, 0xa0, 0x97, 0x89, 0x7c, 0x75, 0x6e, 0x65, + 0x62, 0x68, 0x69, 0x68, 0x6d, 0x72, 0x73, 0x71, 0x73, 0x71, 0x6e, + 0x68, 0x5f, 0x55, 0x4b, 0x47, 0x45, 0x4a, 0x52, 0x64, 0x80, 0x87, + 0x8a, 0xa0, 0xb3, 0xb4, 0xaa, 0xae, 0xb3, 0xa9, 0x9a, 0x8c, 0x83, + 0x79, 0x71, 0x6a, 0x63, 0x68, 0x72, 0x76, 0x7a, 0x86, 0x95, 0x9b, + 0x9d, 0xa2, 0xa6, 0xa5, 0xa0, 0x99, 0x8e, 0x86, 0x7e, 0x73, 0x6c, + 0x6a, 0x6d, 0x6d, 0x71, 0x78, 0x7d, 0x84, 0x84, 0x81, 0x7f, 0x7a, + 0x73, 0x68, 0x5e, 0x55, 0x4b, 0x46, 0x42, 0x40, 0x3f, 0x44, 0x4d, + 0x62, 0x84, 0x98, 0xa0, 0xa9, 0xbc, 0xc3, 0xb7, 0xab, 0xa3, 0x9b, + 0x8e, 0x7b, 0x6b, 0x5f, 0x5d, 0x62, 0x63, 0x66, 0x6e, 0x7f, 0x91, + 0x98, 0x99, 0xa0, 0xa8, 0xa8, 0xa2, 0x9a, 0x92, 0x8b, 0x84, 0x7a, + 0x72, 0x6e, 0x6c, 0x71, 0x74, 0x75, 0x7a, 0x82, 0x89, 0x8b, 0x8b, + 0x8b, 0x88, 0x83, 0x7b, 0x71, 0x6a, 0x63, 0x5c, 0x55, 0x51, 0x4f, + 0x4e, 0x4e, 0x4d, 0x4b, 0x4f, 0x5e, 0x75, 0x93, 0xa7, 0xa7, 0xa7, + 0xb1, 0xbb, 0xaf, 0x95, 0x87, 0x82, 0x7c, 0x73, 0x68, 0x62, 0x63, + 0x6d, 0x7c, 0x83, 0x86, 0x8c, 0x97, 0xa1, 0xa1, 0x9a, 0x94, 0x91, + 0x8e, 0x88, 0x7e, 0x76, 0x74, 0x75, 0x76, 0x76, 0x78, 0x7b, 0x82, + 0x87, 0x8a, 0x8c, 0x8d, 0x8e, 0x8d, 0x89, 0x80, 0x77, 0x71, 0x6b, + 0x65, 0x5e, 0x59, 0x58, 0x58, 0x57, 0x55, 0x55, 0x58, 0x57, 0x55, + 0x53, 0x56, 0x66, 0x7c, 0x99, 0xab, 0xa9, 0xa2, 0xa5, 0xac, 0xa7, + 0x94, 0x84, 0x7d, 0x79, 0x77, 0x75, 0x6e, 0x69, 0x6e, 0x7c, 0x8a, + 0x8e, 0x8e, 0x90, 0x98, 0x9f, 0x9d, 0x93, 0x89, 0x85, 0x86, 0x83, + 0x7d, 0x76, 0x74, 0x77, 0x7c, 0x7f, 0x7e, 0x7f, 0x84, 0x8c, 0x8f, + 0x8c, 0x88, 0x85, 0x84, 0x82, 0x7b, 0x72, 0x6b, 0x67, 0x67, 0x67, + 0x65, 0x62, 0x61, 0x61, 0x61, 0x62, 0x60, 0x60, 0x62, 0x61, 0x60, + 0x5d, 0x5b, 0x5e, 0x6a, 0x88, 0xa8, 0xb0, 0xa3, 0x97, 0x9d, 0xab, + 0xa8, 0x93, 0x81, 0x7a, 0x7b, 0x7b, 0x78, 0x75, 0x75, 0x76, 0x7e, + 0x8b, 0x95, 0x97, 0x93, 0x91, 0x95, 0x95, 0x8f, 0x85, 0x7e, 0x7b, + 0x78, 0x77, 0x78, 0x77, 0x76, 0x77, 0x7d, 0x85, 0x89, 0x89, 0x8c, + 0x92, 0x93, 0x8f, 0x88, 0x83, 0x7f, 0x79, 0x73, 0x6e, 0x6b, 0x69, + 0x67, 0x65, 0x65, 0x64, 0x64, 0x64, 0x61, 0x60, 0x60, 0x61, 0x62, + 0x62, 0x60, 0x5e, 0x5e, 0x64, 0x6c, 0x73, 0x77, 0x80, 0x96, 0xae, + 0xb2, 0xa3, 0x94, 0x93, 0x97, 0x91, 0x82, 0x79, 0x79, 0x7a, 0x7a, + 0x7b, 0x81, 0x89, 0x8d, 0x8e, 0x90, 0x93, 0x93, 0x8f, 0x88, 0x83, + 0x7d, 0x76, 0x70, 0x70, 0x74, 0x77, 0x77, 0x78, 0x7e, 0x88, 0x91, + 0x95, 0x94, 0x91, 0x8d, 0x8b, 0x88, 0x84, 0x7f, 0x79, 0x74, 0x71, + 0x71, 0x73, 0x75, 0x75, 0x76, 0x79, 0x7c, 0x7b, 0x77, 0x73, 0x70, + 0x6b, 0x65, 0x5f, 0x5b, 0x5a, 0x5d, 0x61, 0x64, 0x62, 0x5d, 0x59, + 0x56, 0x54, 0x52, 0x53, 0x5d, 0x76, 0x9c, 0xbb, 0xc1, 0xb4, 0xa6, + 0xa4, 0xa8, 0xa1, 0x91, 0x81, 0x77, 0x73, 0x72, 0x72, 0x74, 0x79, + 0x7f, 0x84, 0x8a, 0x93, 0x9b, 0x9c, 0x95, 0x8d, 0x89, 0x85, 0x7f, + 0x77, 0x70, 0x6c, 0x6b, 0x6c, 0x70, 0x75, 0x7a, 0x7f, 0x85, 0x8c, + 0x92, 0x95, 0x93, 0x8f, 0x8a, 0x86, 0x83, 0x80, 0x7c, 0x79, 0x78, + 0x79, 0x7b, 0x7c, 0x7a, 0x7a, 0x7c, 0x7e, 0x7d, 0x79, 0x76, 0x76, + 0x74, 0x72, 0x6e, 0x6c, 0x6d, 0x6d, 0x6b, 0x68, 0x66, 0x68, 0x6a, + 0x6a, 0x66, 0x65, 0x69, 0x6b, 0x67, 0x62, 0x61, 0x6a, 0x87, 0xaf, + 0xc2, 0xb7, 0xa0, 0x94, 0x9e, 0xa5, 0x98, 0x83, 0x74, 0x6e, 0x6e, + 0x73, 0x7d, 0x87, 0x85, 0x82, 0x89, 0x93, 0x95, 0x8e, 0x86, 0x87, + 0x8b, 0x86, 0x7d, 0x77, 0x72, 0x6d, 0x6a, 0x6c, 0x76, 0x7e, 0x7f, + 0x7f, 0x83, 0x8b, 0x90, 0x8f, 0x8b, 0x89, 0x88, 0x86, 0x85, 0x82, + 0x80, 0x7e, 0x7c, 0x7c, 0x7e, 0x81, 0x82, 0x81, 0x82, 0x84, 0x82, + 0x7d, 0x78, 0x75, 0x74, 0x74, 0x73, 0x74, 0x75, 0x74, 0x74, 0x73, + 0x73, 0x73, 0x71, 0x6f, 0x6e, 0x6b, 0x68, 0x66, 0x68, 0x6a, 0x68, + 0x68, 0x6a, 0x69, 0x67, 0x6a, 0x78, 0x9b, 0xc0, 0xc5, 0xb1, 0x9b, + 0x93, 0x92, 0x89, 0x7e, 0x76, 0x6f, 0x6a, 0x71, 0x7f, 0x8c, 0x8f, + 0x8b, 0x8e, 0x97, 0x98, 0x92, 0x8a, 0x81, 0x78, 0x73, 0x74, 0x75, + 0x73, 0x75, 0x7b, 0x81, 0x84, 0x85, 0x85, 0x84, 0x82, 0x7f, 0x7f, + 0x80, 0x81, 0x81, 0x7f, 0x7d, 0x7e, 0x83, 0x8c, 0x91, 0x8d, 0x89, + 0x86, 0x83, 0x81, 0x7f, 0x7e, 0x7c, 0x79, 0x79, 0x7b, 0x7c, 0x7c, + 0x7a, 0x7a, 0x79, 0x77, 0x75, 0x75, 0x75, 0x74, 0x75, 0x79, 0x7a, + 0x77, 0x74, 0x73, 0x72, 0x6e, 0x6c, 0x6c, 0x6b, 0x6b, 0x6c, 0x6d, + 0x6d, 0x6e, 0x71, 0x73, 0x76, 0x8a, 0xab, 0xbd, 0xb5, 0xa2, 0x95, + 0x8d, 0x84, 0x7c, 0x77, 0x6f, 0x6b, 0x74, 0x84, 0x8d, 0x8d, 0x8f, + 0x94, 0x94, 0x8f, 0x8d, 0x87, 0x7b, 0x73, 0x75, 0x79, 0x79, 0x78, + 0x7b, 0x7e, 0x81, 0x83, 0x84, 0x82, 0x80, 0x80, 0x81, 0x7f, 0x7c, + 0x7c, 0x7c, 0x7a, 0x7c, 0x81, 0x85, 0x88, 0x8f, 0x90, 0x8a, 0x88, + 0x86, 0x82, 0x7d, 0x7a, 0x7a, 0x79, 0x79, 0x7d, 0x7d, 0x7b, 0x7a, + 0x7b, 0x7c, 0x7b, 0x7c, 0x7d, 0x7c, 0x7a, 0x79, 0x77, 0x75, 0x72, + 0x71, 0x71, 0x70, 0x70, 0x71, 0x71, 0x6f, 0x6d, 0x6c, 0x6c, 0x6b, + 0x6d, 0x6e, 0x6f, 0x72, 0x73, 0x7b, 0x91, 0xb0, 0xbd, 0xb1, 0x9e, + 0x8b, 0x7f, 0x7d, 0x7f, 0x7a, 0x70, 0x74, 0x80, 0x8c, 0x95, 0x97, + 0x94, 0x8e, 0x89, 0x89, 0x84, 0x7e, 0x78, 0x73, 0x75, 0x7c, 0x84, + 0x86, 0x84, 0x86, 0x89, 0x87, 0x83, 0x7f, 0x7a, 0x73, 0x74, 0x77, + 0x79, 0x7b, 0x7c, 0x7e, 0x85, 0x8b, 0x8c, 0x88, 0x84, 0x80, 0x7e, + 0x7e, 0x81, 0x88, 0x89, 0x84, 0x86, 0x86, 0x84, 0x81, 0x7c, 0x77, + 0x74, 0x77, 0x7c, 0x7f, 0x80, 0x7e, 0x7c, 0x7b, 0x7c, 0x7b, 0x78, + 0x75, 0x70, 0x6f, 0x73, 0x75, 0x76, 0x75, 0x75, 0x74, 0x72, 0x73, + 0x6f, 0x6b, 0x6c, 0x6b, 0x6c, 0x6c, 0x6c, 0x6e, 0x6f, 0x7e, 0xa1, + 0xbc, 0xbe, 0xad, 0x95, 0x7e, 0x75, 0x7b, 0x7f, 0x79, 0x77, 0x7d, + 0x86, 0x93, 0x9c, 0x97, 0x8d, 0x87, 0x84, 0x7f, 0x7f, 0x7e, 0x78, + 0x76, 0x7b, 0x81, 0x86, 0x8a, 0x8b, 0x85, 0x7e, 0x7d, 0x7b, 0x79, + 0x78, 0x76, 0x73, 0x73, 0x7c, 0x86, 0x8a, 0x89, 0x87, 0x83, 0x81, + 0x80, 0x7d, 0x77, 0x78, 0x80, 0x86, 0x8b, 0x90, 0x8d, 0x84, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7b, 0x78, 0x7a, 0x7e, 0x7e, 0x7e, 0x7b, + 0x75, 0x75, 0x78, 0x7a, 0x7c, 0x7a, 0x77, 0x75, 0x76, 0x76, 0x75, + 0x75, 0x75, 0x75, 0x76, 0x75, 0x73, 0x72, 0x72, 0x72, 0x70, 0x6c, + 0x69, 0x6a, 0x6f, 0x7f, 0x9c, 0xb6, 0xb9, 0xac, 0x96, 0x83, 0x7a, + 0x7a, 0x7f, 0x7e, 0x7d, 0x7f, 0x85, 0x8f, 0x96, 0x94, 0x8e, 0x87, + 0x81, 0x7f, 0x80, 0x7f, 0x7b, 0x7a, 0x79, 0x7a, 0x80, 0x86, 0x88, + 0x89, 0x86, 0x80, 0x7b, 0x7a, 0x7a, 0x79, 0x79, 0x79, 0x7a, 0x80, + 0x86, 0x86, 0x82, 0x7f, 0x7d, 0x7e, 0x83, 0x8a, 0x8c, 0x8b, 0x8a, + 0x87, 0x81, 0x7d, 0x7b, 0x7b, 0x7c, 0x7e, 0x80, 0x7f, 0x80, 0x7e, + 0x7a, 0x77, 0x73, 0x72, 0x73, 0x75, 0x79, 0x7c, 0x7c, 0x79, 0x77, + 0x76, 0x76, 0x78, 0x79, 0x79, 0x77, 0x75, 0x75, 0x75, 0x76, 0x77, + 0x75, 0x74, 0x74, 0x75, 0x74, 0x73, 0x71, 0x6d, 0x6a, 0x6b, 0x7a, + 0x99, 0xb0, 0xb6, 0xb1, 0x9c, 0x85, 0x7b, 0x7e, 0x86, 0x89, 0x86, + 0x81, 0x7b, 0x7f, 0x8a, 0x92, 0x96, 0x8f, 0x84, 0x7d, 0x7d, 0x83, + 0x88, 0x88, 0x81, 0x79, 0x75, 0x79, 0x81, 0x87, 0x88, 0x82, 0x7c, + 0x78, 0x79, 0x7d, 0x80, 0x7f, 0x7c, 0x7a, 0x7a, 0x7c, 0x7f, 0x82, + 0x81, 0x80, 0x82, 0x84, 0x87, 0x89, 0x87, 0x82, 0x7d, 0x7b, 0x7b, + 0x7d, 0x80, 0x80, 0x7f, 0x7c, 0x79, 0x77, 0x77, 0x79, 0x79, 0x79, + 0x79, 0x79, 0x78, 0x79, 0x7a, 0x7a, 0x7a, 0x7a, 0x79, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0x7c, 0x7c, 0x7d, 0x7e, 0x7b, 0x79, 0x78, + 0x79, 0x79, 0x78, 0x77, 0x72, 0x6b, 0x66, 0x65, 0x76, 0x94, 0xa9, + 0xb6, 0xb3, 0x9e, 0x88, 0x7d, 0x7e, 0x85, 0x8b, 0x8e, 0x88, 0x81, + 0x7f, 0x81, 0x87, 0x8e, 0x92, 0x90, 0x87, 0x7f, 0x7c, 0x7f, 0x84, + 0x88, 0x86, 0x82, 0x7c, 0x78, 0x78, 0x7b, 0x7e, 0x80, 0x80, 0x7d, + 0x7a, 0x7a, 0x7b, 0x7e, 0x83, 0x84, 0x83, 0x80, 0x7d, 0x7e, 0x80, + 0x84, 0x86, 0x86, 0x83, 0x7e, 0x7c, 0x7c, 0x80, 0x84, 0x84, 0x80, + 0x7a, 0x74, 0x72, 0x75, 0x7a, 0x7d, 0x7e, 0x7b, 0x76, 0x73, 0x74, + 0x76, 0x79, 0x7c, 0x7c, 0x79, 0x76, 0x76, 0x78, 0x7b, 0x7d, 0x7f, + 0x7d, 0x7a, 0x79, 0x79, 0x79, 0x7b, 0x7c, 0x7b, 0x7a, 0x79, 0x78, + 0x77, 0x76, 0x74, 0x72, 0x6f, 0x6c, 0x6e, 0x7a, 0x8b, 0x9a, 0xa5, + 0xa7, 0x9f, 0x94, 0x8b, 0x87, 0x87, 0x8c, 0x8e, 0x8c, 0x86, 0x80, + 0x7c, 0x7e, 0x84, 0x8b, 0x8e, 0x8d, 0x89, 0x83, 0x81, 0x80, 0x81, + 0x83, 0x83, 0x81, 0x7d, 0x79, 0x76, 0x75, 0x78, 0x7b, 0x7e, 0x80, + 0x80, 0x7f, 0x7e, 0x7d, 0x7d, 0x7e, 0x7f, 0x7f, 0x7e, 0x7d, 0x7a, + 0x79, 0x7b, 0x7f, 0x84, 0x88, 0x8a, 0x89, 0x86, 0x83, 0x80, 0x7e, + 0x7e, 0x7f, 0x7d, 0x7c, 0x7a, 0x78, 0x77, 0x79, 0x7a, 0x7b, 0x7b, + 0x7b, 0x7b, 0x7c, 0x7d, 0x7e, 0x7d, 0x7b, 0x79, 0x78, 0x77, 0x77, + 0x79, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, + 0x7a, 0x79, 0x77, 0x76, 0x75, 0x75, 0x76, 0x77, 0x7e, 0x86, 0x8c, + 0x93, 0x95, 0x93, 0x91, 0x8e, 0x8c, 0x8c, 0x8e, 0x90, 0x8e, 0x8b, + 0x87, 0x82, 0x81, 0x81, 0x83, 0x86, 0x87, 0x87, 0x86, 0x85, 0x85, + 0x84, 0x84, 0x85, 0x84, 0x82, 0x7f, 0x7c, 0x79, 0x78, 0x78, 0x79, + 0x7b, 0x7d, 0x7e, 0x7e, 0x7d, 0x7d, 0x7e, 0x7f, 0x80, 0x7f, 0x7f, + 0x7d, 0x7b, 0x7b, 0x7c, 0x7c, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x81, 0x82, 0x82, 0x82, 0x81, 0x80, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7d, 0x7d, 0x7c, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7b, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7e, + 0x80, 0x83, 0x85, 0x86, 0x86, 0x86, 0x86, 0x86, 0x88, 0x89, 0x8a, + 0x8b, 0x8b, 0x8b, 0x8a, 0x89, 0x88, 0x88, 0x88, 0x89, 0x88, 0x87, + 0x86, 0x85, 0x84, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x79, 0x79, 0x79, + 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, + 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7a, 0x7a, 0x7a, 0x79, + 0x79, 0x79, 0x7a, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, + 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, + 0x80, 0x81, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x82, 0x83, 0x83, + 0x83, 0x84, 0x84, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x83, 0x82, 0x81, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7d, + 0x7d, 0x7c, 0x7b, 0x7b, 0x7a, 0x7b, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + }, + { // 1 + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x84, + 0x8a, 0x8f, 0x93, 0x94, 0x95, 0x95, 0x94, 0x91, 0x8f, 0x8d, 0x8c, + 0x8b, 0x8a, 0x8a, 0x89, 0x87, 0x85, 0x83, 0x82, 0x80, 0x80, 0x81, + 0x82, 0x82, 0x81, 0x7f, 0x7e, 0x7d, 0x7c, 0x7a, 0x79, 0x79, 0x78, + 0x77, 0x77, 0x79, 0x7b, 0x7d, 0x7e, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, + 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, 0x7a, 0x79, 0x79, 0x78, 0x77, 0x77, + 0x77, 0x78, 0x77, 0x76, 0x75, 0x75, 0x75, 0x76, 0x75, 0x75, 0x74, + 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x75, 0x77, 0x7a, 0x7e, 0x84, + 0x8a, 0x91, 0x98, 0x9c, 0x9e, 0x9f, 0x9d, 0x9a, 0x97, 0x94, 0x93, + 0x92, 0x91, 0x90, 0x8e, 0x8a, 0x85, 0x80, 0x7d, 0x7a, 0x7a, 0x7a, + 0x7c, 0x7f, 0x81, 0x83, 0x83, 0x83, 0x82, 0x81, 0x7f, 0x7d, 0x7c, + 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x77, 0x74, 0x72, 0x71, 0x70, 0x70, + 0x70, 0x71, 0x70, 0x6e, 0x6c, 0x6a, 0x6a, 0x6b, 0x6c, 0x6d, 0x6d, + 0x6a, 0x68, 0x6a, 0x6f, 0x78, 0x85, 0x92, 0x9f, 0xa7, 0xab, 0xac, + 0xaa, 0xa7, 0xa2, 0x9c, 0x98, 0x94, 0x92, 0x91, 0x8f, 0x8c, 0x87, + 0x81, 0x7b, 0x76, 0x74, 0x74, 0x77, 0x7a, 0x7e, 0x81, 0x84, 0x85, + 0x84, 0x84, 0x82, 0x81, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7d, 0x7b, 0x7a, 0x79, 0x77, + 0x76, 0x75, 0x73, 0x72, 0x71, 0x6f, 0x6d, 0x6b, 0x69, 0x69, 0x6a, + 0x6a, 0x6a, 0x6b, 0x6b, 0x69, 0x67, 0x69, 0x6d, 0x75, 0x81, 0x8f, + 0x9c, 0xa6, 0xab, 0xad, 0xac, 0xa9, 0xa4, 0x9d, 0x97, 0x92, 0x8f, + 0x8d, 0x8c, 0x8a, 0x88, 0x85, 0x81, 0x7e, 0x7c, 0x7d, 0x7f, 0x81, + 0x83, 0x84, 0x84, 0x82, 0x80, 0x7e, 0x7d, 0x7e, 0x7f, 0x82, 0x85, + 0x87, 0x87, 0x86, 0x84, 0x81, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7d, 0x77, 0x71, 0x69, 0x62, 0x5b, 0x56, 0x53, 0x52, 0x52, 0x52, + 0x52, 0x52, 0x51, 0x4f, 0x50, 0x59, 0x66, 0x7b, 0x92, 0xa8, 0xb9, + 0xbe, 0xbb, 0xb1, 0x9f, 0x8c, 0x7a, 0x6e, 0x69, 0x6c, 0x77, 0x85, + 0x94, 0xa1, 0xa7, 0xa7, 0xa0, 0x97, 0x8b, 0x82, 0x7c, 0x78, 0x78, + 0x79, 0x7c, 0x80, 0x82, 0x84, 0x86, 0x87, 0x87, 0x87, 0x85, 0x84, + 0x82, 0x81, 0x80, 0x82, 0x83, 0x86, 0x87, 0x85, 0x82, 0x7c, 0x73, + 0x6a, 0x62, 0x5d, 0x5a, 0x59, 0x5b, 0x5c, 0x5d, 0x5c, 0x5c, 0x5b, + 0x57, 0x50, 0x4e, 0x54, 0x63, 0x7b, 0x95, 0xaf, 0xbe, 0xbe, 0xb9, + 0xa8, 0x92, 0x7d, 0x6c, 0x64, 0x66, 0x71, 0x81, 0x94, 0xa3, 0xac, + 0xab, 0xa3, 0x96, 0x87, 0x7a, 0x74, 0x72, 0x76, 0x7c, 0x81, 0x86, + 0x88, 0x86, 0x83, 0x80, 0x7f, 0x80, 0x82, 0x85, 0x89, 0x8b, 0x8b, + 0x8a, 0x88, 0x85, 0x82, 0x7f, 0x7c, 0x79, 0x76, 0x72, 0x6f, 0x6c, + 0x6a, 0x67, 0x63, 0x61, 0x5e, 0x5c, 0x5b, 0x5a, 0x57, 0x55, 0x52, + 0x51, 0x5b, 0x6a, 0x83, 0x9e, 0xb3, 0xbf, 0xbd, 0xae, 0x96, 0x7d, + 0x69, 0x5f, 0x63, 0x72, 0x87, 0x9c, 0xaa, 0xaf, 0xaa, 0x9c, 0x8d, + 0x7d, 0x74, 0x71, 0x76, 0x7f, 0x87, 0x8d, 0x8d, 0x8a, 0x83, 0x7a, + 0x75, 0x72, 0x75, 0x7c, 0x84, 0x8e, 0x93, 0x95, 0x93, 0x8e, 0x88, + 0x81, 0x7d, 0x7a, 0x79, 0x7a, 0x7a, 0x7a, 0x78, 0x76, 0x72, 0x6d, + 0x67, 0x62, 0x5e, 0x5c, 0x5b, 0x59, 0x58, 0x57, 0x55, 0x54, 0x56, + 0x61, 0x71, 0x89, 0xa3, 0xb4, 0xbc, 0xb5, 0xa3, 0x8b, 0x74, 0x66, + 0x64, 0x70, 0x83, 0x97, 0xa6, 0xab, 0xa7, 0x9a, 0x8b, 0x7e, 0x76, + 0x76, 0x7b, 0x83, 0x8a, 0x8c, 0x8a, 0x85, 0x7e, 0x79, 0x76, 0x78, + 0x7a, 0x7e, 0x82, 0x85, 0x89, 0x8a, 0x8a, 0x8a, 0x89, 0x88, 0x87, + 0x87, 0x87, 0x86, 0x85, 0x81, 0x7c, 0x77, 0x73, 0x71, 0x71, 0x72, + 0x73, 0x71, 0x6c, 0x66, 0x5d, 0x56, 0x51, 0x4d, 0x4b, 0x4c, 0x4f, + 0x5f, 0x75, 0x8c, 0xa9, 0xb7, 0xb9, 0xaf, 0x96, 0x7e, 0x68, 0x61, + 0x68, 0x7c, 0x95, 0xa7, 0xb1, 0xad, 0x9e, 0x8c, 0x7a, 0x70, 0x70, + 0x78, 0x85, 0x8f, 0x93, 0x8f, 0x85, 0x7b, 0x73, 0x73, 0x78, 0x80, + 0x86, 0x87, 0x83, 0x7d, 0x79, 0x7c, 0x83, 0x8e, 0x96, 0x9a, 0x97, + 0x8d, 0x82, 0x79, 0x74, 0x76, 0x7b, 0x81, 0x85, 0x85, 0x81, 0x79, + 0x71, 0x69, 0x64, 0x61, 0x61, 0x62, 0x62, 0x60, 0x5d, 0x58, 0x54, + 0x4f, 0x54, 0x66, 0x7b, 0x95, 0xac, 0xb8, 0xb5, 0xa3, 0x8b, 0x75, + 0x6a, 0x6e, 0x7d, 0x93, 0xa2, 0xa7, 0xa1, 0x93, 0x85, 0x7b, 0x7b, + 0x80, 0x87, 0x8e, 0x8e, 0x89, 0x82, 0x7a, 0x78, 0x7a, 0x80, 0x87, + 0x8b, 0x8a, 0x82, 0x77, 0x6d, 0x67, 0x68, 0x72, 0x84, 0x96, 0xa3, + 0xa7, 0x9e, 0x8f, 0x7e, 0x72, 0x71, 0x79, 0x85, 0x90, 0x94, 0x90, + 0x85, 0x77, 0x6b, 0x65, 0x65, 0x67, 0x6c, 0x6f, 0x6f, 0x6b, 0x65, + 0x5f, 0x5a, 0x58, 0x57, 0x57, 0x5c, 0x68, 0x78, 0x89, 0xa2, 0xb2, + 0xae, 0xa6, 0x94, 0x81, 0x78, 0x77, 0x7f, 0x8c, 0x95, 0x99, 0x97, + 0x90, 0x88, 0x85, 0x83, 0x83, 0x83, 0x81, 0x7f, 0x7e, 0x7e, 0x82, + 0x87, 0x8a, 0x89, 0x82, 0x78, 0x6f, 0x6a, 0x6d, 0x76, 0x81, 0x8a, + 0x8d, 0x8a, 0x83, 0x7c, 0x7d, 0x83, 0x8d, 0x96, 0x96, 0x90, 0x88, + 0x81, 0x7f, 0x81, 0x83, 0x83, 0x80, 0x7b, 0x76, 0x74, 0x75, 0x77, + 0x77, 0x75, 0x73, 0x6f, 0x6d, 0x6e, 0x6c, 0x6b, 0x68, 0x68, 0x67, + 0x65, 0x65, 0x60, 0x5e, 0x5e, 0x76, 0x9b, 0xaf, 0xbf, 0xb7, 0x9d, + 0x7f, 0x65, 0x62, 0x70, 0x8a, 0x9c, 0xa0, 0x9d, 0x8a, 0x7f, 0x7f, + 0x81, 0x8c, 0x91, 0x91, 0x8a, 0x7d, 0x73, 0x6f, 0x76, 0x80, 0x88, + 0x8e, 0x8c, 0x85, 0x7b, 0x72, 0x6e, 0x6e, 0x74, 0x7d, 0x85, 0x8b, + 0x89, 0x85, 0x81, 0x7d, 0x7e, 0x83, 0x8a, 0x8f, 0x92, 0x8c, 0x82, + 0x7b, 0x78, 0x7b, 0x81, 0x87, 0x87, 0x83, 0x7b, 0x75, 0x72, 0x73, + 0x76, 0x78, 0x78, 0x76, 0x75, 0x74, 0x72, 0x72, 0x72, 0x70, 0x6f, + 0x6f, 0x6d, 0x6d, 0x6b, 0x68, 0x62, 0x5c, 0x6c, 0x92, 0xb4, 0xc4, + 0xbf, 0xa3, 0x7c, 0x63, 0x62, 0x76, 0x90, 0x9f, 0x9c, 0x92, 0x85, + 0x7e, 0x84, 0x8d, 0x90, 0x8a, 0x7e, 0x72, 0x6e, 0x75, 0x81, 0x8e, + 0x93, 0x8e, 0x83, 0x7a, 0x77, 0x79, 0x7c, 0x7e, 0x7c, 0x79, 0x77, + 0x7a, 0x7e, 0x83, 0x86, 0x86, 0x83, 0x7e, 0x7a, 0x7a, 0x7d, 0x84, + 0x8c, 0x90, 0x91, 0x8d, 0x84, 0x7d, 0x79, 0x7a, 0x7e, 0x83, 0x86, + 0x85, 0x81, 0x7e, 0x7b, 0x79, 0x78, 0x78, 0x76, 0x74, 0x73, 0x72, + 0x71, 0x71, 0x72, 0x74, 0x75, 0x76, 0x74, 0x70, 0x6c, 0x68, 0x66, + 0x64, 0x64, 0x64, 0x6a, 0x84, 0xa7, 0xbf, 0xc1, 0xac, 0x89, 0x6d, + 0x64, 0x6e, 0x83, 0x91, 0x91, 0x88, 0x82, 0x83, 0x8a, 0x91, 0x92, + 0x8a, 0x7e, 0x77, 0x77, 0x7d, 0x84, 0x88, 0x88, 0x85, 0x82, 0x82, + 0x84, 0x82, 0x7c, 0x75, 0x70, 0x71, 0x79, 0x80, 0x85, 0x87, 0x87, + 0x85, 0x85, 0x84, 0x80, 0x7b, 0x78, 0x7b, 0x84, 0x8d, 0x92, 0x90, + 0x87, 0x80, 0x7d, 0x7e, 0x80, 0x81, 0x80, 0x7e, 0x7b, 0x7b, 0x7d, + 0x7d, 0x79, 0x75, 0x72, 0x71, 0x72, 0x73, 0x73, 0x72, 0x73, 0x73, + 0x74, 0x75, 0x73, 0x70, 0x6e, 0x6d, 0x6d, 0x6d, 0x6e, 0x6d, 0x6d, + 0x70, 0x70, 0x6d, 0x72, 0x88, 0xa5, 0xb6, 0xaf, 0x9a, 0x86, 0x7d, + 0x83, 0x8b, 0x8d, 0x87, 0x81, 0x83, 0x8c, 0x94, 0x92, 0x8a, 0x83, + 0x80, 0x81, 0x81, 0x7d, 0x77, 0x75, 0x7d, 0x86, 0x8a, 0x88, 0x84, + 0x81, 0x81, 0x80, 0x7d, 0x78, 0x74, 0x74, 0x78, 0x7c, 0x80, 0x84, + 0x85, 0x86, 0x88, 0x87, 0x84, 0x81, 0x83, 0x8a, 0x90, 0x8d, 0x84, + 0x7f, 0x7f, 0x80, 0x82, 0x82, 0x80, 0x7f, 0x7f, 0x7e, 0x7d, 0x79, + 0x76, 0x75, 0x76, 0x75, 0x74, 0x72, 0x70, 0x71, 0x72, 0x72, 0x72, + 0x72, 0x72, 0x72, 0x73, 0x74, 0x71, 0x6d, 0x6c, 0x6d, 0x72, 0x74, + 0x72, 0x6f, 0x6f, 0x74, 0x7b, 0x83, 0x8b, 0x8d, 0x91, 0x9b, 0xa0, + 0x9e, 0x99, 0x93, 0x90, 0x8d, 0x8a, 0x87, 0x86, 0x87, 0x89, 0x89, + 0x88, 0x84, 0x80, 0x80, 0x7f, 0x80, 0x82, 0x84, 0x83, 0x80, 0x7e, + 0x7e, 0x7f, 0x7d, 0x7a, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7b, + 0x7d, 0x7e, 0x7f, 0x81, 0x81, 0x81, 0x85, 0x89, 0x8a, 0x87, 0x86, + 0x89, 0x8b, 0x8a, 0x87, 0x86, 0x85, 0x82, 0x81, 0x7f, 0x7f, 0x80, + 0x80, 0x7e, 0x7a, 0x77, 0x76, 0x73, 0x73, 0x74, 0x75, 0x75, 0x74, + 0x73, 0x73, 0x74, 0x74, 0x72, 0x71, 0x70, 0x6f, 0x6f, 0x6f, 0x6f, + 0x6f, 0x6f, 0x72, 0x72, 0x72, 0x70, 0x6f, 0x72, 0x74, 0x74, 0x75, + 0x75, 0x77, 0x80, 0x86, 0x83, 0x88, 0x93, 0x97, 0x96, 0x97, 0x99, + 0x9e, 0x9e, 0x9b, 0x9b, 0x9c, 0x9a, 0x99, 0x96, 0x90, 0x8b, 0x89, + 0x85, 0x82, 0x80, 0x7e, 0x7f, 0x7e, 0x7b, 0x79, 0x7a, 0x7a, 0x78, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x79, 0x78, 0x78, + 0x7b, 0x7d, 0x80, 0x85, 0x88, 0x86, 0x89, 0x91, 0x90, 0x8b, 0x8a, + 0x8e, 0x8f, 0x8c, 0x87, 0x85, 0x86, 0x84, 0x7e, 0x7a, 0x75, 0x73, + 0x73, 0x70, 0x6c, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, + 0x6e, 0x6f, 0x70, 0x70, 0x71, 0x72, 0x72, 0x73, 0x75, 0x74, 0x72, + 0x73, 0x73, 0x73, 0x74, 0x74, 0x73, 0x74, 0x72, 0x72, 0x74, 0x77, + 0x80, 0x85, 0x82, 0x89, 0x98, 0x98, 0x94, 0x99, 0x9d, 0x9f, 0xa2, + 0x9f, 0x9d, 0xa0, 0x9e, 0x9a, 0x97, 0x91, 0x8d, 0x8d, 0x89, 0x84, + 0x83, 0x83, 0x80, 0x80, 0x7e, 0x7b, 0x7b, 0x7a, 0x77, 0x77, 0x77, + 0x75, 0x76, 0x75, 0x74, 0x75, 0x76, 0x75, 0x76, 0x78, 0x79, 0x7b, + 0x7c, 0x7d, 0x80, 0x84, 0x87, 0x89, 0x8a, 0x8d, 0x91, 0x91, 0x8e, + 0x8e, 0x8f, 0x8e, 0x8b, 0x88, 0x85, 0x83, 0x80, 0x7c, 0x78, 0x75, + 0x73, 0x71, 0x6e, 0x6c, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, + 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x70, 0x71, 0x73, 0x74, 0x75, 0x75, + 0x77, 0x79, 0x77, 0x76, 0x77, 0x79, 0x79, 0x77, 0x77, 0x79, 0x7b, + 0x81, 0x84, 0x85, 0x8b, 0x93, 0x94, 0x94, 0x97, 0x9a, 0x9e, 0x9f, + 0x9d, 0x9e, 0xa1, 0xa0, 0x9d, 0x9b, 0x97, 0x93, 0x92, 0x8d, 0x87, + 0x86, 0x85, 0x83, 0x81, 0x7f, 0x7d, 0x7d, 0x7b, 0x79, 0x79, 0x78, + 0x75, 0x75, 0x75, 0x73, 0x72, 0x73, 0x72, 0x73, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x7c, 0x7e, 0x81, 0x83, 0x85, 0x86, 0x8b, 0x8f, 0x8d, + 0x8c, 0x8e, 0x8f, 0x8d, 0x8a, 0x87, 0x86, 0x86, 0x83, 0x7f, 0x7c, + 0x79, 0x78, 0x76, 0x73, 0x71, 0x71, 0x70, 0x6f, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6d, 0x6e, 0x6e, 0x6d, 0x6e, 0x70, 0x70, 0x70, 0x72, + 0x72, 0x74, 0x76, 0x77, 0x78, 0x7a, 0x7a, 0x7a, 0x7b, 0x7a, 0x7b, + 0x7c, 0x7a, 0x7a, 0x80, 0x81, 0x7d, 0x7d, 0x86, 0x8b, 0x86, 0x84, + 0x8c, 0x94, 0x92, 0x8f, 0x92, 0x97, 0x9a, 0x99, 0x97, 0x98, 0x9a, + 0x99, 0x96, 0x93, 0x91, 0x8f, 0x8d, 0x8b, 0x87, 0x85, 0x85, 0x83, + 0x7f, 0x7d, 0x7d, 0x7b, 0x79, 0x78, 0x77, 0x78, 0x77, 0x76, 0x75, + 0x76, 0x76, 0x76, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7b, 0x7c, + 0x7e, 0x80, 0x80, 0x81, 0x85, 0x86, 0x84, 0x85, 0x88, 0x88, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x84, 0x82, 0x82, 0x82, 0x80, 0x7e, 0x7d, + 0x7c, 0x7c, 0x7b, 0x79, 0x78, 0x79, 0x78, 0x77, 0x77, 0x77, 0x76, + 0x77, 0x77, 0x76, 0x76, 0x76, 0x77, 0x77, 0x76, 0x77, 0x78, 0x78, + 0x78, 0x79, 0x79, 0x79, 0x7b, 0x7b, 0x7b, 0x7c, 0x7d, 0x7e, 0x7e, + 0x7f, 0x80, 0x82, 0x84, 0x83, 0x83, 0x85, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x85, 0x85, 0x84, 0x83, 0x81, 0x80, 0x7e, 0x7d, 0x7c, 0x7b, + 0x7a, 0x79, 0x78, 0x78, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, + 0x78, 0x78, 0x79, 0x7a, 0x7a, 0x7a, 0x7b, 0x7c, 0x7c, 0x7b, 0x7b, + 0x7d, 0x7d, 0x7d, 0x7c, 0x7e, 0x7f, 0x7e, 0x7d, 0x7f, 0x80, 0x80, + 0x81, 0x83, 0x84, 0x84, 0x85, 0x87, 0x88, 0x88, 0x8a, 0x8b, 0x8c, + 0x8c, 0x8d, 0x8e, 0x8e, 0x8e, 0x8d, 0x8c, 0x8c, 0x8b, 0x8a, 0x89, + 0x88, 0x87, 0x85, 0x84, 0x83, 0x82, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, + 0x7c, 0x7b, 0x7a, 0x7a, 0x7a, 0x7a, 0x79, 0x79, 0x79, 0x79, 0x79, + 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7a, 0x7b, 0x7b, + 0x7a, 0x7a, 0x7b, 0x7b, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7a, 0x7b, + 0x7b, 0x7d, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7d, 0x7e, 0x7f, 0x7f, + 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7e, + 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x81, + 0x81, 0x82, 0x82, 0x83, 0x84, 0x84, 0x85, 0x85, 0x85, 0x85, 0x86, + 0x86, 0x86, 0x85, 0x86, 0x86, 0x85, 0x84, 0x83, 0x83, 0x83, 0x82, + 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7d, 0x7d, 0x7e, 0x7e, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, + 0x83, 0x84, 0x83, 0x84, 0x85, 0x85, 0x85, 0x86, 0x85, 0x85, 0x86, + 0x86, 0x85, 0x85, 0x85, 0x85, 0x84, 0x83, 0x83, 0x83, 0x83, 0x81, + 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, + 0x7c, 0x7b, 0x7b, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7a, 0x7a, 0x7b, + 0x7b, 0x7a, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, + }, + { // 2 + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x81, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x7e, 0x7d, + 0x80, 0x7e, 0x7e, 0x80, 0x7e, 0x80, 0x7f, 0x80, 0x80, 0x83, 0x7f, + 0x82, 0x7e, 0x83, 0x7e, 0x80, 0x80, 0x7d, 0x83, 0x7b, 0x81, 0x7d, + 0x81, 0x7b, 0x83, 0x7d, 0x7f, 0x83, 0x7b, 0x83, 0x7e, 0x7f, 0x82, + 0x7e, 0x7d, 0x83, 0x7c, 0x83, 0x82, 0x7a, 0x84, 0x80, 0x80, 0x80, + 0x80, 0x7e, 0x7a, 0x84, 0x7a, 0x7f, 0x86, 0x78, 0x80, 0x81, 0x7f, + 0x81, 0x81, 0x84, 0x76, 0x89, 0x7d, 0x7d, 0x8f, 0x7c, 0x87, 0x7f, + 0x82, 0x7a, 0x79, 0x7c, 0x73, 0x7e, 0x7e, 0x7a, 0x81, 0x7f, 0x81, + 0x80, 0x87, 0x81, 0x7f, 0x84, 0x7e, 0x83, 0x7d, 0x84, 0x77, 0x87, + 0x79, 0x7d, 0x82, 0x7c, 0x80, 0x7c, 0x82, 0x7c, 0x82, 0x7e, 0x83, + 0x81, 0x7f, 0x7b, 0x85, 0x7a, 0x85, 0x80, 0x7b, 0x84, 0x7a, 0x81, + 0x7b, 0x83, 0x80, 0x82, 0x7a, 0x82, 0x84, 0x7b, 0x84, 0x7e, 0x82, + 0x84, 0x7d, 0x88, 0x7c, 0x85, 0x81, 0x7e, 0x7f, 0x7e, 0x83, 0x7a, + 0x7e, 0x7d, 0x7d, 0x7d, 0x81, 0x7d, 0x89, 0x7a, 0x82, 0x80, 0x85, + 0x7f, 0x7b, 0x8a, 0x74, 0x85, 0x78, 0x81, 0x7d, 0x81, 0x80, 0x7a, + 0x85, 0x7e, 0x81, 0x7e, 0x83, 0x7d, 0x83, 0x77, 0x81, 0x82, 0x79, + 0x82, 0x83, 0x85, 0x7e, 0x87, 0x7e, 0x82, 0x83, 0x79, 0x80, 0x85, + 0x78, 0x79, 0x8d, 0x7e, 0x7e, 0x87, 0x7e, 0x7a, 0x81, 0x76, 0x7e, + 0x8a, 0x7b, 0x7f, 0x83, 0x7f, 0x7e, 0x84, 0x7a, 0x7d, 0x83, 0x7f, + 0x7d, 0x7e, 0x85, 0x7d, 0x80, 0x7e, 0x7d, 0x80, 0x81, 0x7d, 0x7b, + 0x84, 0x83, 0x7f, 0x7e, 0x81, 0x7e, 0x80, 0x7e, 0x7c, 0x82, 0x7e, + 0x7c, 0x80, 0x84, 0x81, 0x7d, 0x83, 0x80, 0x7d, 0x85, 0x79, 0x7a, + 0x87, 0x7d, 0x79, 0x86, 0x80, 0x7b, 0x86, 0x7f, 0x7f, 0x86, 0x80, + 0x7b, 0x82, 0x7f, 0x79, 0x7c, 0x79, 0x7c, 0x7c, 0x7f, 0x7d, 0x7e, + 0x85, 0x7c, 0x7f, 0x83, 0x83, 0x81, 0x81, 0x82, 0x84, 0x87, 0x81, + 0x7c, 0x83, 0x83, 0x7c, 0x7d, 0x7f, 0x82, 0x7f, 0x7e, 0x7f, 0x80, + 0x80, 0x7f, 0x83, 0x82, 0x82, 0x84, 0x84, 0x83, 0x85, 0x84, 0x80, + 0x80, 0x7f, 0x7a, 0x7a, 0x79, 0x74, 0x77, 0x76, 0x72, 0x74, 0x78, + 0x76, 0x73, 0x7b, 0x7b, 0x76, 0x77, 0x75, 0x6f, 0x6a, 0x6b, 0x69, + 0x63, 0x63, 0x5f, 0x62, 0x60, 0x6e, 0x82, 0x7f, 0x89, 0x99, 0xa2, + 0xa4, 0xa8, 0xa9, 0xa6, 0xa7, 0xa2, 0x9a, 0x92, 0x90, 0x86, 0x7d, + 0x80, 0x7d, 0x7a, 0x7a, 0x7e, 0x85, 0x8e, 0x91, 0x91, 0x99, 0x9e, + 0x9b, 0x97, 0x9b, 0x98, 0x8d, 0x8c, 0x88, 0x7d, 0x7b, 0x7c, 0x78, + 0x75, 0x7a, 0x7a, 0x78, 0x78, 0x75, 0x73, 0x70, 0x6a, 0x64, 0x62, + 0x60, 0x5d, 0x5a, 0x58, 0x59, 0x58, 0x53, 0x55, 0x5d, 0x58, 0x59, + 0x59, 0x6a, 0x8a, 0x87, 0x8a, 0xa1, 0xb3, 0xb3, 0xb1, 0xb8, 0xb1, + 0xb3, 0xaa, 0x9b, 0x94, 0x90, 0x86, 0x76, 0x78, 0x7c, 0x79, 0x77, + 0x7e, 0x88, 0x8d, 0x94, 0x97, 0x9a, 0x9e, 0x9b, 0x95, 0x8e, 0x8c, + 0x8a, 0x83, 0x7f, 0x80, 0x80, 0x7e, 0x7d, 0x82, 0x85, 0x87, 0x86, + 0x84, 0x81, 0x7d, 0x78, 0x71, 0x6a, 0x63, 0x5d, 0x58, 0x55, 0x54, + 0x52, 0x54, 0x57, 0x58, 0x58, 0x59, 0x5e, 0x5c, 0x59, 0x55, 0x73, + 0x8e, 0x89, 0x96, 0xa8, 0xb8, 0xb8, 0xb9, 0xb6, 0xaf, 0xb2, 0xa3, + 0x92, 0x88, 0x86, 0x7b, 0x6d, 0x72, 0x72, 0x72, 0x77, 0x7b, 0x85, + 0x90, 0x9b, 0x9b, 0x9d, 0xa2, 0xa1, 0x98, 0x8f, 0x89, 0x82, 0x7d, + 0x78, 0x75, 0x7a, 0x7e, 0x7f, 0x81, 0x88, 0x8c, 0x8d, 0x8d, 0x89, + 0x84, 0x80, 0x79, 0x72, 0x6d, 0x66, 0x61, 0x5d, 0x5a, 0x58, 0x58, + 0x57, 0x57, 0x5c, 0x5e, 0x5c, 0x58, 0x5c, 0x5c, 0x57, 0x5b, 0x6d, + 0x88, 0x90, 0x99, 0xa9, 0xb5, 0xbb, 0xb8, 0xb4, 0xae, 0xaa, 0xa0, + 0x8e, 0x81, 0x7b, 0x75, 0x6f, 0x6d, 0x70, 0x75, 0x7b, 0x84, 0x8e, + 0x99, 0x9f, 0xa2, 0xa2, 0x9e, 0x97, 0x8e, 0x84, 0x79, 0x73, 0x6f, + 0x65, 0x64, 0x6d, 0x78, 0x81, 0x89, 0x93, 0x9b, 0xa0, 0x9e, 0x99, + 0x95, 0x90, 0x86, 0x7b, 0x71, 0x6d, 0x69, 0x66, 0x63, 0x5f, 0x60, + 0x61, 0x61, 0x61, 0x64, 0x66, 0x65, 0x66, 0x67, 0x65, 0x61, 0x5d, + 0x58, 0x57, 0x55, 0x5a, 0x73, 0x87, 0x92, 0x9e, 0xaa, 0xb6, 0xb7, + 0xb5, 0xad, 0xa4, 0xa4, 0x9a, 0x89, 0x7d, 0x78, 0x73, 0x6d, 0x6e, + 0x6f, 0x75, 0x81, 0x8b, 0x92, 0x98, 0xa1, 0xa4, 0xa0, 0x9d, 0x97, + 0x8d, 0x81, 0x77, 0x6d, 0x65, 0x62, 0x64, 0x68, 0x70, 0x7a, 0x86, + 0x8f, 0x97, 0x9f, 0xa1, 0x9f, 0x99, 0x8f, 0x84, 0x7e, 0x76, 0x6d, + 0x66, 0x66, 0x69, 0x68, 0x6b, 0x6e, 0x71, 0x73, 0x72, 0x71, 0x6c, + 0x6a, 0x66, 0x5e, 0x5b, 0x56, 0x51, 0x50, 0x4f, 0x4b, 0x49, 0x4c, + 0x59, 0x79, 0x95, 0x9d, 0xa3, 0xb1, 0xbd, 0xc0, 0xbc, 0xad, 0xa1, + 0x9c, 0x93, 0x82, 0x6e, 0x67, 0x6b, 0x6c, 0x6a, 0x6e, 0x77, 0x83, + 0x8f, 0x9b, 0x9e, 0x9d, 0xa2, 0xa1, 0x9a, 0x91, 0x87, 0x7b, 0x72, + 0x6c, 0x66, 0x61, 0x64, 0x6c, 0x73, 0x7a, 0x84, 0x8e, 0x97, 0x9c, + 0x9f, 0x9e, 0x9a, 0x91, 0x86, 0x7d, 0x77, 0x73, 0x6f, 0x6b, 0x6b, + 0x70, 0x75, 0x77, 0x75, 0x77, 0x7a, 0x7a, 0x78, 0x73, 0x70, 0x6a, + 0x65, 0x62, 0x5a, 0x53, 0x53, 0x57, 0x57, 0x52, 0x54, 0x59, 0x56, + 0x56, 0x58, 0x7a, 0xaa, 0xad, 0xa3, 0xa5, 0xb8, 0xc0, 0xb9, 0xb2, + 0x91, 0x80, 0x8f, 0x8e, 0x76, 0x5e, 0x63, 0x6c, 0x76, 0x82, 0x7c, + 0x7b, 0x89, 0xa3, 0xac, 0x9b, 0x95, 0x92, 0x92, 0x95, 0x8a, 0x74, + 0x64, 0x6d, 0x76, 0x6f, 0x6a, 0x68, 0x71, 0x7f, 0x89, 0x88, 0x82, + 0x8b, 0x96, 0x98, 0x94, 0x8b, 0x87, 0x84, 0x82, 0x7e, 0x76, 0x74, + 0x74, 0x77, 0x7a, 0x7a, 0x79, 0x7a, 0x7f, 0x83, 0x80, 0x7e, 0x7c, + 0x7a, 0x77, 0x74, 0x6e, 0x66, 0x65, 0x68, 0x66, 0x63, 0x63, 0x62, + 0x65, 0x6b, 0x6c, 0x68, 0x67, 0x6a, 0x6b, 0x67, 0x61, 0x60, 0x73, + 0x94, 0xa3, 0x9f, 0x9b, 0xa1, 0xab, 0xb6, 0xb6, 0xa2, 0x8e, 0x8d, + 0x90, 0x8a, 0x7d, 0x70, 0x68, 0x70, 0x81, 0x82, 0x79, 0x79, 0x85, + 0x95, 0x9e, 0xa0, 0x99, 0x90, 0x91, 0x95, 0x90, 0x83, 0x78, 0x70, + 0x69, 0x6d, 0x71, 0x6d, 0x69, 0x6f, 0x7a, 0x82, 0x87, 0x86, 0x82, + 0x86, 0x91, 0x95, 0x90, 0x85, 0x7e, 0x7d, 0x81, 0x82, 0x7d, 0x78, + 0x74, 0x77, 0x7c, 0x7f, 0x7d, 0x79, 0x7a, 0x7e, 0x7f, 0x7b, 0x77, + 0x73, 0x71, 0x73, 0x72, 0x6f, 0x6d, 0x6d, 0x6e, 0x6d, 0x6b, 0x6a, + 0x6b, 0x6b, 0x6c, 0x6d, 0x6c, 0x6a, 0x69, 0x69, 0x67, 0x66, 0x64, + 0x67, 0x79, 0x8f, 0x9f, 0xa6, 0xa7, 0xa6, 0xa9, 0xb4, 0xb8, 0xae, + 0x9e, 0x91, 0x89, 0x85, 0x85, 0x7d, 0x70, 0x6b, 0x6e, 0x76, 0x7d, + 0x83, 0x86, 0x88, 0x8f, 0x97, 0x9c, 0x9b, 0x96, 0x8e, 0x84, 0x7d, + 0x79, 0x72, 0x6c, 0x67, 0x64, 0x65, 0x6c, 0x76, 0x7b, 0x7f, 0x84, + 0x8a, 0x8f, 0x95, 0x97, 0x94, 0x92, 0x8e, 0x87, 0x83, 0x80, 0x7c, + 0x77, 0x72, 0x6e, 0x6c, 0x71, 0x79, 0x7d, 0x7d, 0x7c, 0x7b, 0x7d, + 0x81, 0x81, 0x7c, 0x75, 0x70, 0x6d, 0x6c, 0x6c, 0x6c, 0x69, 0x68, + 0x69, 0x6a, 0x6d, 0x6f, 0x72, 0x72, 0x71, 0x72, 0x74, 0x75, 0x73, + 0x71, 0x70, 0x6d, 0x6b, 0x6d, 0x7c, 0x92, 0x9f, 0xa7, 0xa8, 0xa5, + 0xa4, 0xa9, 0xb3, 0xb2, 0xa9, 0x9d, 0x8d, 0x81, 0x7d, 0x7e, 0x7c, + 0x79, 0x77, 0x73, 0x74, 0x7c, 0x86, 0x8f, 0x94, 0x97, 0x93, 0x8e, + 0x8c, 0x8b, 0x88, 0x82, 0x7b, 0x70, 0x68, 0x67, 0x67, 0x6b, 0x71, + 0x77, 0x7b, 0x80, 0x86, 0x8c, 0x91, 0x95, 0x94, 0x90, 0x8b, 0x86, + 0x81, 0x7d, 0x79, 0x74, 0x6f, 0x6d, 0x6e, 0x6f, 0x71, 0x75, 0x78, + 0x79, 0x7b, 0x7d, 0x7f, 0x7f, 0x7e, 0x7a, 0x75, 0x73, 0x71, 0x71, + 0x71, 0x6f, 0x6d, 0x6b, 0x6c, 0x6d, 0x6e, 0x70, 0x73, 0x76, 0x78, + 0x79, 0x79, 0x77, 0x75, 0x75, 0x74, 0x74, 0x73, 0x72, 0x72, 0x73, + 0x7d, 0x90, 0x9e, 0xa8, 0xac, 0xaa, 0xa6, 0xa5, 0xaa, 0xac, 0xab, + 0xa5, 0x99, 0x8a, 0x7d, 0x77, 0x75, 0x77, 0x7a, 0x79, 0x76, 0x74, + 0x77, 0x7e, 0x86, 0x8f, 0x93, 0x93, 0x8f, 0x89, 0x83, 0x7e, 0x7c, + 0x7a, 0x78, 0x74, 0x6f, 0x6c, 0x6d, 0x71, 0x78, 0x80, 0x87, 0x8a, + 0x8b, 0x8b, 0x89, 0x88, 0x87, 0x87, 0x85, 0x81, 0x7c, 0x75, 0x70, + 0x6f, 0x70, 0x72, 0x74, 0x77, 0x77, 0x77, 0x77, 0x79, 0x7b, 0x7c, + 0x7d, 0x7c, 0x7a, 0x76, 0x72, 0x70, 0x70, 0x71, 0x72, 0x72, 0x72, + 0x73, 0x74, 0x75, 0x78, 0x7c, 0x7e, 0x7f, 0x7e, 0x7d, 0x7c, 0x79, + 0x79, 0x78, 0x76, 0x75, 0x74, 0x74, 0x73, 0x72, 0x74, 0x7c, 0x89, + 0x97, 0xa3, 0xab, 0xac, 0xa8, 0xa3, 0xa0, 0x9e, 0x9f, 0x9e, 0x9b, + 0x93, 0x88, 0x7f, 0x79, 0x78, 0x7b, 0x7f, 0x83, 0x83, 0x81, 0x80, + 0x80, 0x81, 0x84, 0x85, 0x84, 0x81, 0x7b, 0x75, 0x71, 0x71, 0x73, + 0x77, 0x7a, 0x7b, 0x7b, 0x7b, 0x7c, 0x80, 0x82, 0x84, 0x84, 0x82, + 0x80, 0x7e, 0x7c, 0x7b, 0x7b, 0x7c, 0x7b, 0x7a, 0x79, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x79, 0x79, 0x78, 0x77, 0x76, 0x75, 0x75, 0x76, + 0x76, 0x77, 0x77, 0x77, 0x76, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, + 0x74, 0x74, 0x75, 0x76, 0x78, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x79, 0x78, 0x7c, 0x85, + 0x8f, 0x99, 0xa0, 0xa4, 0xa2, 0x9f, 0x9c, 0x9b, 0x9b, 0x9d, 0x9e, + 0x9b, 0x96, 0x90, 0x89, 0x84, 0x83, 0x83, 0x85, 0x85, 0x85, 0x83, + 0x81, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7c, 0x79, 0x75, 0x72, 0x72, + 0x74, 0x76, 0x7a, 0x7c, 0x7c, 0x7b, 0x7a, 0x7a, 0x7a, 0x7c, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7c, + 0x7a, 0x79, 0x78, 0x78, 0x79, 0x79, 0x79, 0x78, 0x78, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, 0x78, + 0x78, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x79, 0x79, 0x79, 0x7a, + 0x7a, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7a, 0x7b, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x81, + 0x82, 0x84, 0x85, 0x87, 0x89, 0x8a, 0x8b, 0x8d, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, + 0x88, 0x87, 0x86, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x80, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x7a, 0x79, 0x79, + 0x78, 0x78, 0x77, 0x77, 0x77, 0x77, 0x78, 0x79, 0x7a, 0x7a, 0x7a, + 0x7a, 0x7a, 0x7a, 0x79, 0x79, 0x78, 0x78, 0x77, 0x77, 0x77, 0x78, + 0x78, 0x78, 0x78, 0x77, 0x77, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7b, + 0x7b, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, + 0x80, 0x81, 0x80, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, + 0x84, 0x83, 0x83, 0x83, 0x84, 0x85, 0x85, 0x86, 0x86, 0x85, 0x84, + 0x84, 0x84, 0x83, 0x83, 0x83, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + }, + { // 3 + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x80, + 0x80, 0x81, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x7e, 0x80, + 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x81, 0x80, 0x7d, 0x7e, 0x80, 0x7e, 0x80, 0x81, 0x7f, 0x80, 0x7f, + 0x7d, 0x81, 0x83, 0x7f, 0x7e, 0x80, 0x7f, 0x7e, 0x81, 0x7e, 0x7e, + 0x80, 0x7f, 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x82, 0x81, 0x7e, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x81, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7e, 0x7e, 0x80, + 0x80, 0x82, 0x81, 0x7e, 0x80, 0x81, 0x80, 0x80, 0x7e, 0x7d, 0x7f, + 0x7e, 0x7d, 0x7e, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x7f, 0x80, + 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x81, 0x7f, + 0x81, 0x80, 0x80, 0x81, 0x7e, 0x80, 0x7d, 0x7e, 0x7f, 0x7b, 0x7f, + 0x7e, 0x7f, 0x80, 0x7f, 0x82, 0x7e, 0x7e, 0x82, 0x7f, 0x81, 0x83, + 0x81, 0x82, 0x84, 0x85, 0x80, 0x80, 0x7e, 0x7b, 0x7d, 0x7d, 0x7e, + 0x80, 0x83, 0x81, 0x7e, 0x81, 0x81, 0x7e, 0x7f, 0x81, 0x7e, 0x80, + 0x82, 0x7e, 0x7f, 0x80, 0x7c, 0x7d, 0x7e, 0x7f, 0x7d, 0x84, 0x89, + 0x7f, 0x7e, 0x82, 0x80, 0x81, 0x80, 0x84, 0x82, 0x7e, 0x7d, 0x75, + 0x78, 0x80, 0x7b, 0x7c, 0x82, 0x83, 0x7e, 0x7d, 0x83, 0x81, 0x83, + 0x86, 0x85, 0x84, 0x83, 0x85, 0x86, 0x84, 0x84, 0x88, 0x8b, 0x8a, + 0x89, 0x88, 0x84, 0x83, 0x84, 0x84, 0x80, 0x80, 0x82, 0x87, 0x86, + 0x82, 0x87, 0x84, 0x7e, 0x78, 0x74, 0x70, 0x69, 0x67, 0x6c, 0x70, + 0x70, 0x6f, 0x6e, 0x71, 0x73, 0x6e, 0x6f, 0x71, 0x6d, 0x6f, 0x71, + 0x6f, 0x6a, 0x6d, 0x77, 0x82, 0x8a, 0x90, 0x97, 0x98, 0x99, 0x9c, + 0x9c, 0x9a, 0x97, 0x97, 0x97, 0x94, 0x93, 0x92, 0x90, 0x91, 0x8f, + 0x90, 0x8f, 0x8b, 0x88, 0x85, 0x83, 0x80, 0x7e, 0x79, 0x76, 0x74, + 0x70, 0x6d, 0x6b, 0x69, 0x66, 0x63, 0x65, 0x66, 0x66, 0x62, 0x5e, + 0x5d, 0x5c, 0x59, 0x57, 0x5b, 0x66, 0x77, 0x89, 0x92, 0x92, 0x93, + 0x99, 0xa0, 0xa3, 0x9f, 0x99, 0x95, 0x93, 0x91, 0x8c, 0x85, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x82, 0x86, 0x89, 0x8a, 0x8d, 0x91, 0x97, + 0x9b, 0x9b, 0x97, 0x90, 0x8a, 0x88, 0x87, 0x81, 0x7b, 0x77, 0x76, + 0x75, 0x74, 0x75, 0x74, 0x71, 0x6c, 0x69, 0x6a, 0x6c, 0x68, 0x62, + 0x5d, 0x5a, 0x5a, 0x58, 0x56, 0x5b, 0x69, 0x7b, 0x8b, 0x93, 0x92, + 0x91, 0x94, 0x9b, 0xa1, 0xa0, 0x9d, 0x99, 0x94, 0x8f, 0x88, 0x82, + 0x80, 0x80, 0x81, 0x7e, 0x7d, 0x7f, 0x84, 0x88, 0x8d, 0x90, 0x93, + 0x96, 0x97, 0x95, 0x91, 0x8e, 0x8b, 0x87, 0x82, 0x7d, 0x79, 0x75, + 0x73, 0x72, 0x6f, 0x6c, 0x6a, 0x69, 0x6a, 0x6b, 0x6b, 0x69, 0x66, + 0x63, 0x61, 0x5e, 0x59, 0x55, 0x56, 0x62, 0x76, 0x8b, 0x99, 0x9a, + 0x93, 0x8c, 0x8d, 0x98, 0xa5, 0xaa, 0xa6, 0x9a, 0x8d, 0x84, 0x80, + 0x80, 0x82, 0x84, 0x82, 0x7e, 0x7b, 0x7a, 0x7d, 0x82, 0x89, 0x91, + 0x97, 0x9b, 0x9b, 0x96, 0x91, 0x8d, 0x8b, 0x89, 0x85, 0x7e, 0x76, + 0x70, 0x70, 0x72, 0x72, 0x6f, 0x6c, 0x6a, 0x69, 0x68, 0x65, 0x61, + 0x5f, 0x5d, 0x5b, 0x59, 0x55, 0x53, 0x55, 0x60, 0x75, 0x8c, 0x9c, + 0x9f, 0x98, 0x8e, 0x8d, 0x98, 0xa5, 0xac, 0xa8, 0x9b, 0x8b, 0x7f, + 0x7c, 0x7f, 0x83, 0x84, 0x81, 0x7a, 0x74, 0x74, 0x7a, 0x85, 0x8f, + 0x96, 0x9a, 0x9c, 0x9b, 0x98, 0x95, 0x91, 0x8e, 0x8a, 0x84, 0x7c, + 0x75, 0x70, 0x70, 0x70, 0x6f, 0x6b, 0x67, 0x63, 0x62, 0x62, 0x60, + 0x5d, 0x5c, 0x5b, 0x59, 0x56, 0x51, 0x50, 0x56, 0x64, 0x7a, 0x90, + 0x9e, 0x9f, 0x98, 0x90, 0x90, 0x9a, 0xa6, 0xac, 0xa7, 0x98, 0x87, + 0x7b, 0x78, 0x7b, 0x80, 0x83, 0x7f, 0x79, 0x75, 0x76, 0x7f, 0x8a, + 0x94, 0x9b, 0x9e, 0x9e, 0x9d, 0x9d, 0x9b, 0x97, 0x91, 0x88, 0x7f, + 0x76, 0x70, 0x6c, 0x69, 0x66, 0x63, 0x61, 0x5f, 0x5d, 0x5b, 0x59, + 0x57, 0x56, 0x56, 0x56, 0x56, 0x54, 0x51, 0x50, 0x57, 0x69, 0x85, + 0x9e, 0xa9, 0xa3, 0x94, 0x8a, 0x8d, 0x9c, 0xaa, 0xad, 0xa2, 0x8d, + 0x7a, 0x71, 0x74, 0x7d, 0x83, 0x83, 0x7d, 0x77, 0x77, 0x7d, 0x89, + 0x96, 0xa1, 0xa8, 0xa8, 0xa4, 0x9e, 0x9a, 0x97, 0x94, 0x8e, 0x83, + 0x76, 0x6c, 0x66, 0x64, 0x64, 0x63, 0x5f, 0x59, 0x54, 0x52, 0x56, + 0x5b, 0x5a, 0x55, 0x52, 0x53, 0x56, 0x59, 0x54, 0x4e, 0x4e, 0x5b, + 0x76, 0x94, 0xa8, 0xa8, 0x9b, 0x8e, 0x8d, 0x98, 0xa6, 0xac, 0xa5, + 0x93, 0x80, 0x74, 0x73, 0x79, 0x7f, 0x80, 0x7d, 0x79, 0x78, 0x7d, + 0x87, 0x93, 0x9e, 0xa5, 0xa7, 0xa4, 0x9e, 0x98, 0x92, 0x8e, 0x89, + 0x81, 0x77, 0x6e, 0x67, 0x65, 0x64, 0x62, 0x5e, 0x5a, 0x58, 0x59, + 0x5c, 0x5e, 0x5f, 0x5e, 0x5c, 0x5a, 0x59, 0x58, 0x55, 0x4f, 0x4b, + 0x4f, 0x61, 0x7f, 0x9b, 0xa7, 0x9f, 0x91, 0x8c, 0x99, 0xad, 0xb3, + 0xa6, 0x8d, 0x7c, 0x7b, 0x85, 0x8a, 0x83, 0x75, 0x6a, 0x6c, 0x79, + 0x87, 0x8e, 0x8c, 0x89, 0x8d, 0x9b, 0xab, 0xb3, 0xae, 0x9e, 0x8f, + 0x86, 0x85, 0x83, 0x7d, 0x73, 0x69, 0x62, 0x5f, 0x60, 0x62, 0x64, + 0x62, 0x5d, 0x5b, 0x5b, 0x5a, 0x5c, 0x5f, 0x63, 0x63, 0x61, 0x5c, + 0x57, 0x54, 0x50, 0x4c, 0x4c, 0x57, 0x70, 0x8f, 0xa3, 0xa3, 0x96, + 0x8d, 0x93, 0xa6, 0xb3, 0xab, 0x95, 0x81, 0x7c, 0x83, 0x88, 0x83, + 0x77, 0x6d, 0x6e, 0x78, 0x84, 0x8a, 0x8b, 0x8b, 0x90, 0x9a, 0xa6, + 0xab, 0xa7, 0x9d, 0x94, 0x8e, 0x89, 0x82, 0x79, 0x72, 0x6f, 0x6c, + 0x68, 0x61, 0x5d, 0x5e, 0x61, 0x62, 0x5f, 0x5c, 0x5f, 0x66, 0x6a, + 0x64, 0x5c, 0x5a, 0x5f, 0x64, 0x62, 0x5b, 0x55, 0x53, 0x51, 0x50, + 0x55, 0x69, 0x87, 0x9c, 0x9a, 0x8a, 0x87, 0x9b, 0xb5, 0xb9, 0xa3, + 0x89, 0x81, 0x90, 0x9c, 0x92, 0x78, 0x66, 0x6c, 0x7e, 0x85, 0x7c, + 0x73, 0x7a, 0x8d, 0x9a, 0x9a, 0x96, 0x9a, 0xa4, 0xa7, 0x9d, 0x8f, + 0x88, 0x87, 0x85, 0x7d, 0x73, 0x6d, 0x6d, 0x6d, 0x6b, 0x68, 0x67, + 0x69, 0x6a, 0x68, 0x65, 0x62, 0x62, 0x63, 0x68, 0x6b, 0x67, 0x62, + 0x61, 0x61, 0x5d, 0x58, 0x57, 0x5d, 0x66, 0x68, 0x65, 0x69, 0x7c, + 0x97, 0xa3, 0x9c, 0x94, 0x98, 0xa3, 0xa5, 0x99, 0x8b, 0x85, 0x84, + 0x80, 0x7b, 0x79, 0x77, 0x74, 0x76, 0x7c, 0x84, 0x8b, 0x8c, 0x8d, + 0x91, 0x96, 0x99, 0x97, 0x93, 0x8e, 0x8c, 0x8c, 0x87, 0x7e, 0x78, + 0x7c, 0x83, 0x82, 0x7b, 0x77, 0x7d, 0x81, 0x7b, 0x72, 0x6e, 0x6d, + 0x66, 0x5c, 0x5c, 0x62, 0x6a, 0x71, 0x77, 0x77, 0x79, 0x80, 0x80, + 0x77, 0x6f, 0x6e, 0x6a, 0x60, 0x59, 0x59, 0x5a, 0x52, 0x47, 0x45, + 0x4b, 0x5e, 0x79, 0x89, 0x88, 0x8c, 0xa3, 0xb7, 0xb1, 0x9c, 0x9b, + 0xab, 0xa9, 0x8e, 0x7b, 0x83, 0x88, 0x79, 0x69, 0x6f, 0x7f, 0x80, + 0x79, 0x7d, 0x8d, 0x94, 0x90, 0x8e, 0x92, 0x94, 0x8f, 0x87, 0x84, + 0x86, 0x86, 0x7f, 0x78, 0x7a, 0x7f, 0x82, 0x83, 0x87, 0x8e, 0x90, + 0x8e, 0x8e, 0x8d, 0x87, 0x81, 0x7b, 0x73, 0x6c, 0x65, 0x5e, 0x5a, + 0x59, 0x59, 0x57, 0x5b, 0x65, 0x6e, 0x76, 0x7a, 0x79, 0x74, 0x6d, + 0x65, 0x5d, 0x59, 0x59, 0x58, 0x56, 0x57, 0x5b, 0x5a, 0x58, 0x5a, + 0x56, 0x54, 0x74, 0x95, 0x88, 0x7e, 0x9e, 0xbe, 0xa6, 0x8b, 0xa6, + 0xbc, 0xa0, 0x82, 0x93, 0xa1, 0x85, 0x6f, 0x7a, 0x85, 0x79, 0x72, + 0x7c, 0x85, 0x86, 0x84, 0x88, 0x8d, 0x91, 0x92, 0x8a, 0x87, 0x88, + 0x84, 0x79, 0x75, 0x7a, 0x77, 0x6f, 0x72, 0x7d, 0x82, 0x82, 0x8a, + 0x96, 0x9b, 0x98, 0x97, 0x9b, 0x97, 0x8c, 0x86, 0x83, 0x7d, 0x74, + 0x6f, 0x6e, 0x6b, 0x66, 0x63, 0x64, 0x62, 0x60, 0x61, 0x65, 0x63, + 0x61, 0x63, 0x66, 0x69, 0x68, 0x63, 0x63, 0x65, 0x62, 0x61, 0x65, + 0x66, 0x62, 0x62, 0x64, 0x66, 0x64, 0x60, 0x52, 0x67, 0x9a, 0x84, + 0x70, 0xa0, 0xba, 0x9d, 0x91, 0xb8, 0xb9, 0x96, 0x94, 0xa5, 0x9d, + 0x82, 0x80, 0x85, 0x7d, 0x74, 0x73, 0x7b, 0x78, 0x76, 0x7b, 0x80, + 0x84, 0x84, 0x8a, 0x8d, 0x8c, 0x8a, 0x87, 0x86, 0x7f, 0x79, 0x76, + 0x73, 0x71, 0x71, 0x74, 0x77, 0x7b, 0x7f, 0x83, 0x86, 0x88, 0x8b, + 0x8d, 0x8f, 0x90, 0x8e, 0x8d, 0x8d, 0x8a, 0x84, 0x82, 0x82, 0x7d, + 0x7a, 0x7d, 0x7c, 0x77, 0x78, 0x7a, 0x78, 0x76, 0x75, 0x74, 0x75, + 0x71, 0x6c, 0x6d, 0x6e, 0x6b, 0x68, 0x6b, 0x6c, 0x6a, 0x6d, 0x6d, + 0x69, 0x6c, 0x6f, 0x6a, 0x6b, 0x6f, 0x6c, 0x65, 0x66, 0x5f, 0x5f, + 0x83, 0x7c, 0x6f, 0x93, 0xa0, 0x94, 0x96, 0xac, 0xaa, 0x9d, 0xa0, + 0xa1, 0x9c, 0x8c, 0x84, 0x88, 0x7e, 0x71, 0x74, 0x79, 0x73, 0x70, + 0x7b, 0x81, 0x7e, 0x85, 0x8c, 0x8a, 0x8b, 0x8d, 0x8e, 0x89, 0x82, + 0x85, 0x82, 0x7a, 0x76, 0x77, 0x77, 0x73, 0x72, 0x76, 0x7b, 0x7a, + 0x7d, 0x87, 0x85, 0x85, 0x8b, 0x89, 0x87, 0x87, 0x87, 0x85, 0x85, + 0x85, 0x85, 0x87, 0x83, 0x81, 0x82, 0x7f, 0x7d, 0x7e, 0x7f, 0x7b, + 0x78, 0x79, 0x79, 0x75, 0x75, 0x75, 0x75, 0x75, 0x72, 0x72, 0x73, + 0x70, 0x6e, 0x6f, 0x6e, 0x6c, 0x6c, 0x6b, 0x6a, 0x6c, 0x6d, 0x6e, + 0x6c, 0x6b, 0x68, 0x66, 0x63, 0x5e, 0x7e, 0x7a, 0x6a, 0x8f, 0x9a, + 0x8c, 0x95, 0xa9, 0xa0, 0x9a, 0xa2, 0xa1, 0x9b, 0x92, 0x92, 0x91, + 0x85, 0x7c, 0x80, 0x7f, 0x73, 0x76, 0x7c, 0x7a, 0x79, 0x81, 0x85, + 0x81, 0x86, 0x8b, 0x8b, 0x89, 0x88, 0x89, 0x86, 0x7f, 0x80, 0x7f, + 0x77, 0x79, 0x79, 0x77, 0x77, 0x78, 0x7a, 0x7c, 0x7e, 0x80, 0x82, + 0x83, 0x85, 0x86, 0x87, 0x88, 0x87, 0x88, 0x87, 0x84, 0x84, 0x84, + 0x80, 0x7d, 0x7f, 0x7a, 0x76, 0x78, 0x76, 0x74, 0x74, 0x75, 0x75, + 0x74, 0x76, 0x75, 0x77, 0x77, 0x78, 0x7a, 0x77, 0x78, 0x7a, 0x77, + 0x76, 0x75, 0x74, 0x72, 0x71, 0x74, 0x72, 0x74, 0x73, 0x71, 0x71, + 0x6d, 0x6c, 0x68, 0x71, 0x7a, 0x71, 0x7d, 0x8a, 0x87, 0x89, 0x96, + 0x98, 0x95, 0x9b, 0x9f, 0x9c, 0x98, 0x99, 0x98, 0x90, 0x8c, 0x8d, + 0x88, 0x80, 0x81, 0x82, 0x7b, 0x7b, 0x7f, 0x7e, 0x7d, 0x7f, 0x83, + 0x81, 0x81, 0x84, 0x83, 0x83, 0x82, 0x82, 0x81, 0x7f, 0x7e, 0x7e, + 0x7c, 0x7a, 0x7c, 0x7b, 0x7a, 0x7c, 0x7d, 0x7d, 0x7e, 0x81, 0x82, + 0x82, 0x84, 0x85, 0x84, 0x84, 0x83, 0x82, 0x80, 0x7e, 0x7d, 0x7b, + 0x79, 0x79, 0x76, 0x75, 0x75, 0x74, 0x73, 0x73, 0x75, 0x74, 0x74, + 0x77, 0x77, 0x75, 0x77, 0x77, 0x76, 0x76, 0x76, 0x75, 0x74, 0x72, + 0x78, 0x77, 0x77, 0x7d, 0x7e, 0x7d, 0x79, 0x78, 0x75, 0x71, 0x6f, + 0x71, 0x7c, 0x75, 0x78, 0x87, 0x83, 0x84, 0x8d, 0x90, 0x8e, 0x93, + 0x96, 0x95, 0x95, 0x95, 0x95, 0x91, 0x90, 0x8f, 0x8b, 0x88, 0x87, + 0x86, 0x83, 0x82, 0x83, 0x82, 0x81, 0x82, 0x81, 0x80, 0x80, 0x81, + 0x80, 0x7f, 0x7f, 0x7f, 0x7c, 0x7c, 0x7c, 0x7a, 0x7a, 0x7a, 0x7a, + 0x7a, 0x7a, 0x7b, 0x7c, 0x7c, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, + 0x7d, 0x7c, 0x7c, 0x7c, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7d, 0x7d, 0x7d, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, + 0x7e, 0x7d, 0x7e, 0x7e, 0x7d, 0x7e, 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7f, 0x80, 0x80, 0x80, + 0x82, 0x82, 0x82, 0x83, 0x84, 0x84, 0x84, 0x86, 0x85, 0x86, 0x87, + 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x87, 0x86, + 0x84, 0x84, 0x82, 0x80, 0x7f, 0x7d, 0x7c, 0x7a, 0x79, 0x79, 0x78, + 0x77, 0x77, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x77, 0x77, 0x78, + 0x78, 0x79, 0x7a, 0x79, 0x7b, 0x7b, 0x7a, 0x7c, 0x7b, 0x7b, 0x7d, + 0x7c, 0x7c, 0x7d, 0x7c, 0x7c, 0x7e, 0x7d, 0x7c, 0x7e, 0x7e, 0x7c, + 0x7d, 0x7d, 0x7c, 0x7c, 0x7d, 0x7d, 0x7c, 0x7d, 0x7d, 0x7c, 0x7d, + 0x7e, 0x7d, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x81, 0x82, 0x83, 0x85, 0x86, 0x86, 0x88, 0x89, 0x8a, + 0x8b, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8b, 0x8b, 0x8a, + 0x89, 0x88, 0x87, 0x86, 0x85, 0x85, 0x83, 0x82, 0x81, 0x80, 0x7e, + 0x7d, 0x7c, 0x7b, 0x79, 0x79, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7a, 0x7a, + 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7c, 0x7d, 0x7c, 0x7e, 0x7f, 0x7e, + 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7c, 0x7c, + 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x82, + 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, + 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, + }, + { // 4 + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x82, 0x80, 0x7f, + 0x7f, 0x7e, 0x7e, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x7e, 0x7e, 0x7e, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x81, 0x80, 0x7f, 0x7f, 0x80, + 0x81, 0x80, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x82, 0x7f, 0x7e, + 0x80, 0x80, 0x80, 0x7f, 0x7d, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x80, + 0x7f, 0x80, 0x81, 0x7e, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x81, + 0x7e, 0x80, 0x81, 0x7d, 0x80, 0x7f, 0x80, 0x81, 0x7e, 0x80, 0x81, + 0x81, 0x82, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7e, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x81, 0x7d, 0x7c, 0x7e, 0x82, 0x82, 0x80, 0x7f, 0x7e, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x82, 0x81, 0x7f, 0x7e, 0x80, 0x7f, + 0x80, 0x81, 0x7f, 0x7e, 0x7f, 0x81, 0x80, 0x7d, 0x7e, 0x80, 0x80, + 0x82, 0x80, 0x7c, 0x80, 0x81, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x80, + 0x80, 0x7e, 0x7e, 0x80, 0x7f, 0x80, 0x7e, 0x7e, 0x80, 0x82, 0x81, + 0x7f, 0x81, 0x82, 0x7f, 0x7f, 0x82, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, + 0x80, 0x83, 0x81, 0x80, 0x7f, 0x7d, 0x80, 0x81, 0x7f, 0x80, 0x80, + 0x7e, 0x7e, 0x7e, 0x80, 0x81, 0x7f, 0x7e, 0x7e, 0x7f, 0x83, 0x82, + 0x81, 0x80, 0x7f, 0x80, 0x7e, 0x7d, 0x80, 0x82, 0x81, 0x7d, 0x7e, + 0x7e, 0x7d, 0x7d, 0x80, 0x82, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7e, + 0x80, 0x83, 0x81, 0x80, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x80, 0x7e, + 0x7e, 0x7f, 0x7f, 0x7e, 0x7e, 0x80, 0x83, 0x81, 0x7e, 0x80, 0x81, + 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x7e, 0x7e, 0x82, 0x80, + 0x7d, 0x7f, 0x83, 0x81, 0x7f, 0x7c, 0x7e, 0x83, 0x80, 0x80, 0x80, + 0x81, 0x80, 0x7b, 0x7a, 0x7f, 0x82, 0x83, 0x82, 0x7d, 0x7e, 0x7f, + 0x7f, 0x80, 0x7e, 0x7f, 0x81, 0x81, 0x80, 0x7f, 0x7d, 0x7d, 0x7d, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x7d, + 0x7f, 0x7e, 0x7e, 0x7d, 0x7b, 0x7b, 0x7c, 0x80, 0x81, 0x81, 0x82, + 0x83, 0x86, 0x88, 0x8a, 0x8d, 0x8e, 0x8c, 0x8b, 0x8a, 0x87, 0x86, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x82, 0x7f, 0x7d, 0x7d, 0x7d, 0x7f, + 0x83, 0x82, 0x7d, 0x79, 0x76, 0x72, 0x6f, 0x6c, 0x6a, 0x6b, 0x6c, + 0x6c, 0x6c, 0x6a, 0x65, 0x62, 0x63, 0x62, 0x60, 0x5e, 0x5e, 0x63, + 0x6b, 0x7a, 0x8e, 0xa1, 0xac, 0xad, 0xae, 0xa9, 0xa0, 0x97, 0x8d, + 0x87, 0x84, 0x82, 0x83, 0x83, 0x83, 0x81, 0x7f, 0x7d, 0x7b, 0x7d, + 0x80, 0x83, 0x89, 0x8c, 0x90, 0x92, 0x93, 0x91, 0x8c, 0x89, 0x86, + 0x84, 0x84, 0x84, 0x83, 0x80, 0x7e, 0x7a, 0x76, 0x74, 0x71, 0x70, + 0x6f, 0x6d, 0x6a, 0x66, 0x63, 0x5f, 0x5c, 0x5a, 0x58, 0x57, 0x55, + 0x55, 0x5e, 0x6c, 0x80, 0x98, 0xad, 0xb8, 0xb9, 0xb4, 0xa9, 0x99, + 0x8a, 0x7d, 0x75, 0x74, 0x75, 0x79, 0x7e, 0x80, 0x81, 0x80, 0x7f, + 0x80, 0x83, 0x88, 0x8f, 0x96, 0x9a, 0x9b, 0x97, 0x8f, 0x86, 0x7d, + 0x76, 0x74, 0x76, 0x7b, 0x80, 0x85, 0x87, 0x85, 0x83, 0x80, 0x7d, + 0x7c, 0x7b, 0x7a, 0x78, 0x74, 0x6f, 0x69, 0x64, 0x60, 0x5d, 0x5b, + 0x5c, 0x5d, 0x5f, 0x62, 0x67, 0x71, 0x7e, 0x8f, 0xa0, 0xae, 0xb8, + 0xb9, 0xb2, 0xa5, 0x95, 0x86, 0x79, 0x72, 0x6f, 0x71, 0x75, 0x7a, + 0x7d, 0x80, 0x81, 0x81, 0x83, 0x86, 0x8b, 0x91, 0x98, 0x9c, 0x9c, + 0x99, 0x91, 0x86, 0x7c, 0x73, 0x6f, 0x6f, 0x73, 0x78, 0x7e, 0x83, + 0x85, 0x85, 0x83, 0x80, 0x7e, 0x7d, 0x7e, 0x7d, 0x7c, 0x79, 0x74, + 0x6e, 0x67, 0x61, 0x5d, 0x5b, 0x5b, 0x5c, 0x5f, 0x62, 0x66, 0x6e, + 0x79, 0x87, 0x98, 0xa6, 0xb2, 0xb7, 0xb5, 0xad, 0xa0, 0x91, 0x81, + 0x76, 0x6e, 0x6a, 0x6c, 0x70, 0x74, 0x79, 0x7d, 0x81, 0x84, 0x88, + 0x8c, 0x90, 0x95, 0x98, 0x99, 0x98, 0x93, 0x8b, 0x81, 0x78, 0x71, + 0x6d, 0x70, 0x75, 0x7c, 0x84, 0x89, 0x8b, 0x8a, 0x88, 0x85, 0x81, + 0x7e, 0x7c, 0x7a, 0x79, 0x77, 0x75, 0x70, 0x6b, 0x66, 0x61, 0x5e, + 0x5d, 0x5c, 0x5e, 0x60, 0x63, 0x68, 0x71, 0x7d, 0x8c, 0x9a, 0xa8, + 0xb1, 0xb3, 0xb0, 0xa7, 0x9a, 0x8c, 0x7f, 0x75, 0x6f, 0x6e, 0x70, + 0x74, 0x79, 0x7e, 0x82, 0x86, 0x88, 0x8c, 0x8f, 0x92, 0x95, 0x95, + 0x93, 0x8e, 0x87, 0x7f, 0x77, 0x73, 0x71, 0x73, 0x79, 0x7f, 0x85, + 0x8a, 0x8c, 0x8b, 0x88, 0x84, 0x80, 0x7c, 0x79, 0x77, 0x75, 0x74, + 0x73, 0x71, 0x6e, 0x6b, 0x69, 0x67, 0x67, 0x67, 0x65, 0x65, 0x64, + 0x63, 0x63, 0x69, 0x72, 0x7e, 0x90, 0xa0, 0xae, 0xb9, 0xba, 0xb5, + 0xaa, 0x9b, 0x8b, 0x7d, 0x74, 0x6e, 0x6c, 0x6e, 0x70, 0x74, 0x78, + 0x7a, 0x7e, 0x82, 0x87, 0x8c, 0x92, 0x98, 0x9a, 0x9a, 0x96, 0x8d, + 0x84, 0x78, 0x6f, 0x69, 0x67, 0x6b, 0x74, 0x7f, 0x8a, 0x93, 0x98, + 0x96, 0x91, 0x8a, 0x82, 0x7c, 0x77, 0x74, 0x74, 0x74, 0x74, 0x74, + 0x73, 0x72, 0x70, 0x6e, 0x6c, 0x6b, 0x6a, 0x69, 0x68, 0x66, 0x65, + 0x64, 0x63, 0x67, 0x6e, 0x7b, 0x8b, 0x9b, 0xab, 0xb6, 0xba, 0xb7, + 0xad, 0x9f, 0x90, 0x82, 0x77, 0x70, 0x6d, 0x6d, 0x6f, 0x72, 0x76, + 0x79, 0x7d, 0x81, 0x86, 0x8b, 0x91, 0x96, 0x99, 0x9a, 0x95, 0x8e, + 0x84, 0x78, 0x6d, 0x65, 0x62, 0x63, 0x6a, 0x76, 0x82, 0x8e, 0x98, + 0x9d, 0x9e, 0x9a, 0x93, 0x8b, 0x82, 0x7a, 0x73, 0x6f, 0x6b, 0x6a, + 0x6a, 0x6b, 0x6e, 0x72, 0x77, 0x7c, 0x7f, 0x80, 0x7f, 0x7b, 0x75, + 0x6d, 0x65, 0x5e, 0x58, 0x57, 0x5a, 0x63, 0x72, 0x84, 0x99, 0xab, + 0xb8, 0xbd, 0xbb, 0xb3, 0xa6, 0x96, 0x87, 0x79, 0x70, 0x6a, 0x68, + 0x69, 0x6c, 0x71, 0x76, 0x7c, 0x82, 0x88, 0x8e, 0x93, 0x98, 0x9b, + 0x9a, 0x96, 0x8f, 0x84, 0x78, 0x6d, 0x64, 0x60, 0x60, 0x65, 0x6f, + 0x7b, 0x88, 0x93, 0x9b, 0x9f, 0x9f, 0x9a, 0x94, 0x8c, 0x84, 0x7c, + 0x75, 0x6f, 0x6b, 0x69, 0x68, 0x6a, 0x6d, 0x71, 0x77, 0x7d, 0x81, + 0x84, 0x82, 0x7e, 0x78, 0x70, 0x69, 0x63, 0x5e, 0x5d, 0x5d, 0x60, + 0x64, 0x6b, 0x76, 0x83, 0x92, 0xa1, 0xae, 0xb7, 0xb8, 0xb4, 0xac, + 0x9f, 0x91, 0x82, 0x77, 0x70, 0x6b, 0x6c, 0x6e, 0x71, 0x76, 0x79, + 0x7e, 0x82, 0x87, 0x8c, 0x90, 0x93, 0x93, 0x91, 0x8d, 0x86, 0x7e, + 0x76, 0x70, 0x6c, 0x6b, 0x6e, 0x73, 0x79, 0x82, 0x8a, 0x90, 0x95, + 0x96, 0x94, 0x8f, 0x89, 0x82, 0x7c, 0x78, 0x75, 0x74, 0x75, 0x76, + 0x77, 0x78, 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x79, 0x78, 0x76, 0x74, + 0x71, 0x6e, 0x6c, 0x6a, 0x68, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, + 0x70, 0x7d, 0x8a, 0x9d, 0xad, 0xb6, 0xba, 0xb4, 0xa7, 0x96, 0x84, + 0x76, 0x6b, 0x69, 0x6c, 0x70, 0x78, 0x7d, 0x7e, 0x7f, 0x80, 0x81, + 0x84, 0x8a, 0x90, 0x94, 0x97, 0x97, 0x8f, 0x87, 0x7c, 0x70, 0x68, + 0x63, 0x64, 0x69, 0x73, 0x7d, 0x84, 0x8a, 0x8d, 0x8b, 0x8b, 0x8a, + 0x88, 0x89, 0x88, 0x87, 0x86, 0x84, 0x80, 0x7d, 0x7c, 0x7e, 0x7f, + 0x83, 0x86, 0x86, 0x85, 0x82, 0x7e, 0x79, 0x75, 0x73, 0x72, 0x73, + 0x74, 0x75, 0x75, 0x75, 0x74, 0x72, 0x71, 0x70, 0x6e, 0x6d, 0x6c, + 0x6b, 0x6a, 0x6a, 0x69, 0x67, 0x66, 0x65, 0x6a, 0x7a, 0x8a, 0x9c, + 0xb0, 0xb8, 0xb7, 0xaf, 0xa0, 0x8c, 0x7a, 0x70, 0x6b, 0x6c, 0x74, + 0x7b, 0x7e, 0x81, 0x80, 0x7c, 0x7c, 0x81, 0x89, 0x92, 0x9c, 0xa0, + 0x9b, 0x92, 0x85, 0x75, 0x6a, 0x64, 0x63, 0x69, 0x72, 0x7c, 0x83, + 0x87, 0x89, 0x88, 0x86, 0x86, 0x87, 0x88, 0x8a, 0x89, 0x87, 0x81, + 0x7a, 0x74, 0x71, 0x72, 0x77, 0x7e, 0x87, 0x8f, 0x95, 0x97, 0x95, + 0x91, 0x8a, 0x81, 0x7a, 0x73, 0x6f, 0x6e, 0x6f, 0x73, 0x76, 0x7a, + 0x7c, 0x7d, 0x7e, 0x7c, 0x78, 0x76, 0x72, 0x70, 0x6f, 0x6e, 0x6d, + 0x6b, 0x69, 0x68, 0x67, 0x67, 0x66, 0x64, 0x65, 0x68, 0x76, 0x8a, + 0x9e, 0xaf, 0xba, 0xb9, 0xad, 0x9a, 0x86, 0x77, 0x6d, 0x6e, 0x76, + 0x7e, 0x84, 0x86, 0x83, 0x7f, 0x7c, 0x7e, 0x86, 0x90, 0x99, 0x9f, + 0x9b, 0x8e, 0x80, 0x72, 0x69, 0x66, 0x6b, 0x75, 0x7c, 0x80, 0x82, + 0x80, 0x7d, 0x7d, 0x80, 0x84, 0x88, 0x8a, 0x88, 0x84, 0x7f, 0x7b, + 0x78, 0x78, 0x7b, 0x7e, 0x80, 0x85, 0x87, 0x89, 0x8b, 0x8c, 0x8a, + 0x89, 0x86, 0x83, 0x7e, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, + 0x7b, 0x7b, 0x7b, 0x79, 0x77, 0x75, 0x73, 0x71, 0x6f, 0x70, 0x70, + 0x71, 0x72, 0x72, 0x72, 0x72, 0x71, 0x70, 0x6e, 0x6c, 0x6c, 0x70, + 0x73, 0x75, 0x7c, 0x91, 0xa7, 0xb2, 0xb1, 0xa8, 0x9a, 0x88, 0x79, + 0x78, 0x7e, 0x82, 0x82, 0x81, 0x80, 0x7e, 0x7f, 0x87, 0x91, 0x96, + 0x95, 0x8f, 0x89, 0x82, 0x7a, 0x78, 0x7a, 0x7b, 0x7b, 0x7a, 0x7b, + 0x7d, 0x7c, 0x7d, 0x80, 0x82, 0x83, 0x82, 0x81, 0x81, 0x81, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7d, 0x7c, 0x7d, 0x7d, 0x7e, 0x80, 0x85, 0x8a, + 0x8d, 0x8e, 0x8d, 0x8a, 0x85, 0x7f, 0x7c, 0x7b, 0x7b, 0x7c, 0x7c, + 0x7e, 0x7e, 0x7d, 0x7c, 0x7c, 0x7d, 0x7c, 0x7a, 0x78, 0x75, 0x72, + 0x70, 0x70, 0x71, 0x72, 0x72, 0x72, 0x73, 0x74, 0x74, 0x75, 0x74, + 0x71, 0x6f, 0x6d, 0x6b, 0x6a, 0x6a, 0x6d, 0x71, 0x78, 0x8f, 0xad, + 0xba, 0xb2, 0x9f, 0x92, 0x89, 0x80, 0x7e, 0x85, 0x89, 0x87, 0x7e, + 0x79, 0x7f, 0x88, 0x8c, 0x8d, 0x8d, 0x8d, 0x8a, 0x84, 0x81, 0x81, + 0x7f, 0x79, 0x75, 0x78, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x7e, 0x82, 0x85, 0x82, 0x7e, 0x7c, 0x7d, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7f, 0x83, 0x89, 0x8d, 0x8e, 0x8c, 0x89, 0x84, + 0x7f, 0x7c, 0x7b, 0x7d, 0x7e, 0x7f, 0x7e, 0x7d, 0x7b, 0x7b, 0x7c, + 0x7c, 0x7b, 0x7a, 0x79, 0x79, 0x79, 0x76, 0x73, 0x72, 0x73, 0x75, + 0x76, 0x76, 0x77, 0x77, 0x75, 0x72, 0x71, 0x71, 0x72, 0x71, 0x70, + 0x70, 0x71, 0x70, 0x6d, 0x6f, 0x80, 0x9e, 0xb5, 0xb4, 0xa0, 0x8d, + 0x8a, 0x8d, 0x8c, 0x87, 0x83, 0x81, 0x80, 0x7e, 0x7e, 0x86, 0x8e, + 0x8e, 0x88, 0x84, 0x88, 0x8e, 0x8c, 0x83, 0x7c, 0x7a, 0x7d, 0x7e, + 0x7c, 0x7d, 0x7e, 0x7e, 0x7e, 0x7d, 0x7f, 0x81, 0x80, 0x7c, 0x7a, + 0x7c, 0x82, 0x85, 0x81, 0x7c, 0x7a, 0x7c, 0x7f, 0x80, 0x7f, 0x81, + 0x84, 0x84, 0x82, 0x83, 0x87, 0x8a, 0x86, 0x7f, 0x7b, 0x7e, 0x80, + 0x7e, 0x79, 0x79, 0x7d, 0x81, 0x81, 0x7d, 0x78, 0x75, 0x74, 0x75, + 0x78, 0x7a, 0x7a, 0x77, 0x76, 0x77, 0x78, 0x78, 0x76, 0x76, 0x76, + 0x77, 0x78, 0x79, 0x79, 0x78, 0x78, 0x78, 0x77, 0x76, 0x74, 0x74, + 0x73, 0x71, 0x72, 0x7e, 0x93, 0xa4, 0xa5, 0x97, 0x89, 0x88, 0x91, + 0x95, 0x8e, 0x83, 0x7e, 0x82, 0x87, 0x88, 0x86, 0x86, 0x86, 0x86, + 0x85, 0x87, 0x8a, 0x8c, 0x87, 0x7f, 0x7b, 0x7d, 0x81, 0x82, 0x80, + 0x7d, 0x7b, 0x7c, 0x7e, 0x81, 0x82, 0x81, 0x7e, 0x7d, 0x7d, 0x7f, + 0x82, 0x84, 0x85, 0x83, 0x80, 0x7d, 0x7e, 0x81, 0x82, 0x80, 0x7d, + 0x7d, 0x81, 0x83, 0x81, 0x7d, 0x7c, 0x7c, 0x7c, 0x7a, 0x79, 0x79, + 0x7b, 0x7a, 0x79, 0x78, 0x79, 0x79, 0x78, 0x79, 0x7b, 0x7b, 0x79, + 0x77, 0x77, 0x79, 0x7a, 0x7a, 0x7a, 0x7b, 0x7d, 0x7c, 0x7b, 0x79, + 0x7a, 0x7b, 0x7b, 0x7b, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, + 0x79, 0x78, 0x7a, 0x80, 0x89, 0x8e, 0x8d, 0x87, 0x83, 0x85, 0x8a, + 0x8c, 0x8a, 0x88, 0x88, 0x8a, 0x8a, 0x8a, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x8a, 0x8c, 0x8b, 0x89, 0x86, 0x84, 0x83, 0x84, 0x85, 0x86, + 0x86, 0x84, 0x82, 0x81, 0x82, 0x83, 0x82, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7e, 0x7c, 0x7c, 0x7d, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7d, 0x7d, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x7a, 0x7b, 0x7b, 0x7a, + 0x79, 0x77, 0x78, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x78, 0x79, + 0x7a, 0x7a, 0x79, 0x78, 0x7a, 0x7d, 0x7d, 0x7a, 0x79, 0x7a, 0x7b, + 0x7c, 0x7b, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x7f, 0x7d, 0x7d, + 0x80, 0x83, 0x82, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x81, 0x81, 0x80, 0x81, 0x83, 0x85, 0x84, 0x84, 0x85, + 0x86, 0x85, 0x85, 0x85, 0x87, 0x88, 0x88, 0x88, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x88, 0x89, 0x89, 0x88, 0x87, 0x88, 0x89, 0x88, + 0x86, 0x86, 0x87, 0x88, 0x86, 0x84, 0x83, 0x83, 0x82, 0x81, 0x81, + 0x81, 0x81, 0x80, 0x7e, 0x7e, 0x7d, 0x7b, 0x7a, 0x7a, 0x7a, 0x7a, + 0x79, 0x79, 0x7a, 0x7a, 0x79, 0x78, 0x77, 0x79, 0x7a, 0x7a, 0x7a, + 0x79, 0x79, 0x79, 0x79, 0x7a, 0x7b, 0x7c, 0x7c, 0x7b, 0x7a, 0x7a, + 0x7c, 0x7d, 0x7b, 0x7a, 0x7b, 0x7e, 0x7f, 0x7d, 0x7b, 0x7c, 0x7d, + 0x7d, 0x7c, 0x7c, 0x7e, 0x7e, 0x7c, 0x7b, 0x7d, 0x7f, 0x7e, 0x7c, + 0x7c, 0x7d, 0x7d, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x82, 0x83, 0x82, 0x81, 0x81, + 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x85, 0x84, 0x85, + 0x85, 0x85, 0x84, 0x83, 0x83, 0x83, 0x82, 0x80, 0x81, 0x82, 0x82, + 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7c, 0x7c, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7d, 0x7d, 0x7e, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x80, + 0x82, 0x82, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, + 0x82, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, + 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + }, + { // 5 + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x80, + 0x80, 0x7f, 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x82, 0x82, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x80, + 0x7f, 0x7e, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x7f, + 0x7f, 0x7e, 0x7e, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x81, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7d, 0x7f, 0x7f, 0x7e, 0x80, + 0x80, 0x7e, 0x7f, 0x81, 0x81, 0x80, 0x81, 0x80, 0x7e, 0x7e, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x7f, 0x80, 0x81, 0x7f, 0x7e, + 0x7f, 0x7f, 0x80, 0x84, 0x83, 0x7f, 0x7e, 0x80, 0x80, 0x80, 0x7f, + 0x81, 0x80, 0x7c, 0x7e, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x82, 0x81, + 0x80, 0x81, 0x7e, 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x7f, 0x7e, 0x7e, + 0x7f, 0x80, 0x7f, 0x7f, 0x7d, 0x7e, 0x81, 0x80, 0x7d, 0x80, 0x80, + 0x81, 0x7f, 0x7d, 0x80, 0x80, 0x81, 0x7f, 0x7e, 0x80, 0x7f, 0x80, + 0x7f, 0x7e, 0x82, 0x81, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x81, 0x7f, + 0x7f, 0x81, 0x80, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x81, 0x81, + 0x7d, 0x81, 0x83, 0x80, 0x80, 0x7f, 0x7e, 0x80, 0x80, 0x7f, 0x7e, + 0x7e, 0x81, 0x83, 0x80, 0x7f, 0x7e, 0x80, 0x80, 0x7e, 0x80, 0x7f, + 0x82, 0x80, 0x7d, 0x81, 0x7f, 0x7d, 0x7d, 0x86, 0x80, 0x78, 0x7e, + 0x82, 0x82, 0x7f, 0x7b, 0x80, 0x84, 0x7f, 0x7d, 0x7c, 0x80, 0x80, + 0x81, 0x80, 0x7c, 0x82, 0x81, 0x80, 0x7e, 0x7d, 0x82, 0x80, 0x7d, + 0x81, 0x81, 0x81, 0x7f, 0x7c, 0x84, 0x81, 0x7b, 0x7d, 0x84, 0x85, + 0x7b, 0x7d, 0x83, 0x81, 0x7d, 0x7e, 0x80, 0x7f, 0x81, 0x80, 0x7e, + 0x7f, 0x81, 0x80, 0x7e, 0x81, 0x7e, 0x81, 0x82, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7f, 0x79, 0x7a, 0x7f, 0x81, 0x81, 0x7f, 0x81, 0x80, 0x7a, + 0x7e, 0x81, 0x80, 0x80, 0x80, 0x82, 0x80, 0x80, 0x7e, 0x7d, 0x80, + 0x80, 0x7e, 0x81, 0x80, 0x7f, 0x81, 0x7f, 0x82, 0x80, 0x81, 0x81, + 0x83, 0x86, 0x80, 0x7f, 0x7f, 0x7e, 0x7f, 0x82, 0x83, 0x81, 0x80, + 0x84, 0x84, 0x83, 0x83, 0x84, 0x83, 0x7d, 0x7e, 0x7b, 0x79, 0x7c, + 0x7a, 0x74, 0x7b, 0x7f, 0x7c, 0x7b, 0x7c, 0x7e, 0x7a, 0x7a, 0x7a, + 0x7a, 0x78, 0x75, 0x77, 0x81, 0x86, 0x85, 0x85, 0x82, 0x7b, 0x73, + 0x71, 0x73, 0x77, 0x7a, 0x83, 0x86, 0x82, 0x84, 0x88, 0x88, 0x87, + 0x8b, 0x8b, 0x88, 0x8c, 0x90, 0x90, 0x92, 0x97, 0x95, 0x8f, 0x90, + 0x91, 0x8e, 0x8d, 0x8c, 0x85, 0x7d, 0x7a, 0x79, 0x7b, 0x7d, 0x7d, + 0x7a, 0x78, 0x72, 0x69, 0x65, 0x66, 0x68, 0x6c, 0x72, 0x6b, 0x61, + 0x5a, 0x55, 0x4e, 0x4e, 0x76, 0xae, 0xc7, 0xc3, 0xb4, 0x89, 0x59, + 0x4d, 0x58, 0x6d, 0x86, 0xa2, 0xa7, 0x95, 0x89, 0x86, 0x82, 0x81, + 0x87, 0x84, 0x7b, 0x7b, 0x82, 0x83, 0x88, 0x90, 0x90, 0x8a, 0x85, + 0x85, 0x84, 0x86, 0x8c, 0x8e, 0x88, 0x80, 0x7c, 0x79, 0x7c, 0x81, + 0x85, 0x85, 0x81, 0x78, 0x6d, 0x67, 0x68, 0x6e, 0x73, 0x73, 0x6f, + 0x67, 0x5e, 0x5a, 0x53, 0x58, 0x83, 0xb2, 0xc4, 0xbe, 0xa5, 0x74, + 0x4c, 0x4a, 0x5f, 0x7a, 0x97, 0xac, 0xa3, 0x8d, 0x82, 0x7c, 0x7a, + 0x84, 0x8d, 0x84, 0x7c, 0x7e, 0x80, 0x86, 0x94, 0x95, 0x8a, 0x83, + 0x80, 0x7e, 0x84, 0x8d, 0x8f, 0x8b, 0x85, 0x7b, 0x76, 0x7a, 0x81, + 0x87, 0x86, 0x81, 0x7c, 0x77, 0x70, 0x69, 0x6a, 0x6f, 0x72, 0x73, + 0x6d, 0x69, 0x62, 0x5f, 0x5d, 0x5b, 0x80, 0xb1, 0xc6, 0xc0, 0xa2, + 0x6f, 0x45, 0x45, 0x5f, 0x7f, 0x9f, 0xb0, 0x9f, 0x87, 0x7b, 0x78, + 0x7d, 0x8b, 0x92, 0x87, 0x7b, 0x7a, 0x7f, 0x88, 0x94, 0x95, 0x88, + 0x7c, 0x78, 0x7d, 0x89, 0x92, 0x91, 0x8e, 0x86, 0x7c, 0x75, 0x77, + 0x7c, 0x80, 0x86, 0x86, 0x81, 0x7e, 0x77, 0x6b, 0x66, 0x6d, 0x75, + 0x77, 0x77, 0x70, 0x68, 0x60, 0x5e, 0x56, 0x5b, 0x8b, 0xb7, 0xc4, + 0xb9, 0x98, 0x65, 0x46, 0x4f, 0x69, 0x89, 0xa5, 0xaa, 0x96, 0x84, + 0x7c, 0x79, 0x82, 0x8d, 0x8b, 0x80, 0x7a, 0x7b, 0x80, 0x8d, 0x9a, + 0x97, 0x88, 0x7a, 0x73, 0x78, 0x89, 0x94, 0x92, 0x8d, 0x84, 0x77, + 0x70, 0x78, 0x80, 0x83, 0x89, 0x8a, 0x82, 0x7b, 0x75, 0x6a, 0x64, + 0x6c, 0x70, 0x70, 0x73, 0x70, 0x6a, 0x66, 0x66, 0x5d, 0x69, 0x98, + 0xb8, 0xbb, 0xaa, 0x85, 0x57, 0x48, 0x5c, 0x7a, 0x99, 0xaa, 0xa2, + 0x89, 0x78, 0x74, 0x7c, 0x8a, 0x90, 0x8a, 0x81, 0x7c, 0x7d, 0x85, + 0x8e, 0x8e, 0x87, 0x7f, 0x7c, 0x80, 0x8b, 0x92, 0x91, 0x8a, 0x80, + 0x78, 0x77, 0x7d, 0x84, 0x87, 0x85, 0x81, 0x7b, 0x77, 0x72, 0x6d, + 0x6e, 0x72, 0x74, 0x71, 0x6c, 0x67, 0x64, 0x61, 0x65, 0x66, 0x61, + 0x82, 0xaf, 0xbd, 0xb3, 0x98, 0x69, 0x49, 0x54, 0x70, 0x8b, 0xa2, + 0xa8, 0x93, 0x81, 0x7c, 0x7a, 0x82, 0x8c, 0x8a, 0x7e, 0x78, 0x7c, + 0x85, 0x91, 0x9b, 0x93, 0x7e, 0x74, 0x76, 0x7a, 0x89, 0x97, 0x98, + 0x90, 0x85, 0x78, 0x72, 0x78, 0x80, 0x88, 0x8d, 0x88, 0x7f, 0x78, + 0x72, 0x6b, 0x67, 0x6c, 0x72, 0x72, 0x71, 0x6c, 0x65, 0x62, 0x62, + 0x60, 0x60, 0x62, 0x7b, 0xa7, 0xbc, 0xb4, 0x98, 0x70, 0x54, 0x59, + 0x71, 0x8c, 0x9f, 0xa2, 0x95, 0x84, 0x7c, 0x7b, 0x7f, 0x87, 0x88, + 0x7f, 0x7d, 0x81, 0x86, 0x8b, 0x8e, 0x89, 0x81, 0x7f, 0x82, 0x85, + 0x8a, 0x8e, 0x8a, 0x83, 0x80, 0x7f, 0x7f, 0x81, 0x87, 0x88, 0x87, + 0x86, 0x7f, 0x73, 0x6b, 0x6b, 0x6d, 0x72, 0x76, 0x73, 0x6c, 0x6a, + 0x6a, 0x68, 0x67, 0x66, 0x63, 0x61, 0x52, 0x5b, 0x92, 0xba, 0xc4, + 0xb3, 0x87, 0x52, 0x45, 0x5f, 0x80, 0x9f, 0xaf, 0xa1, 0x86, 0x7b, + 0x7c, 0x83, 0x8c, 0x8b, 0x84, 0x7b, 0x78, 0x81, 0x8b, 0x8e, 0x8c, + 0x86, 0x7e, 0x7e, 0x83, 0x86, 0x8a, 0x8a, 0x88, 0x85, 0x84, 0x81, + 0x7c, 0x7b, 0x7f, 0x84, 0x88, 0x89, 0x87, 0x81, 0x79, 0x72, 0x6c, + 0x6c, 0x70, 0x70, 0x6e, 0x6d, 0x6e, 0x6c, 0x67, 0x68, 0x65, 0x62, + 0x60, 0x59, 0x68, 0x88, 0xa9, 0xb6, 0xa7, 0x86, 0x61, 0x56, 0x65, + 0x81, 0x99, 0xa5, 0x99, 0x88, 0x7e, 0x7c, 0x84, 0x8c, 0x8b, 0x86, + 0x82, 0x80, 0x86, 0x89, 0x89, 0x86, 0x82, 0x82, 0x81, 0x80, 0x82, + 0x7f, 0x7b, 0x79, 0x7c, 0x84, 0x90, 0x95, 0x8f, 0x85, 0x7a, 0x76, + 0x7d, 0x86, 0x88, 0x84, 0x7f, 0x77, 0x72, 0x77, 0x7c, 0x7b, 0x7b, + 0x77, 0x6d, 0x65, 0x63, 0x64, 0x61, 0x61, 0x63, 0x65, 0x62, 0x60, + 0x5f, 0x5d, 0x85, 0xb5, 0xc1, 0xb4, 0x8f, 0x5a, 0x44, 0x5a, 0x7c, + 0x9f, 0xaf, 0xa0, 0x84, 0x76, 0x7b, 0x87, 0x91, 0x8f, 0x81, 0x75, + 0x79, 0x84, 0x8e, 0x92, 0x8d, 0x7f, 0x74, 0x73, 0x7a, 0x85, 0x88, + 0x84, 0x7d, 0x79, 0x7a, 0x7f, 0x87, 0x92, 0x98, 0x95, 0x86, 0x77, + 0x71, 0x76, 0x80, 0x89, 0x8c, 0x88, 0x7f, 0x77, 0x73, 0x72, 0x75, + 0x79, 0x76, 0x6f, 0x6a, 0x6c, 0x6e, 0x70, 0x70, 0x69, 0x69, 0x69, + 0x66, 0x63, 0x61, 0x57, 0x5a, 0x8f, 0xc3, 0xce, 0xb6, 0x89, 0x58, + 0x45, 0x61, 0x87, 0xa2, 0xac, 0xa0, 0x87, 0x7a, 0x7e, 0x83, 0x89, + 0x8a, 0x83, 0x7c, 0x7e, 0x85, 0x89, 0x88, 0x82, 0x79, 0x78, 0x80, + 0x88, 0x8a, 0x83, 0x78, 0x6f, 0x70, 0x79, 0x81, 0x85, 0x86, 0x85, + 0x83, 0x81, 0x7d, 0x7a, 0x7c, 0x82, 0x8a, 0x90, 0x94, 0x91, 0x85, + 0x79, 0x72, 0x73, 0x7e, 0x89, 0x8c, 0x85, 0x7b, 0x75, 0x72, 0x74, + 0x77, 0x77, 0x75, 0x71, 0x6e, 0x6f, 0x71, 0x74, 0x75, 0x74, 0x71, + 0x71, 0x72, 0x71, 0x6d, 0x66, 0x60, 0x5f, 0x79, 0xa9, 0xc5, 0xba, + 0x96, 0x6c, 0x52, 0x59, 0x78, 0x96, 0xa4, 0xa5, 0x96, 0x85, 0x7f, + 0x7e, 0x7c, 0x7a, 0x7c, 0x7e, 0x83, 0x8c, 0x8e, 0x89, 0x82, 0x7c, + 0x7c, 0x7e, 0x80, 0x80, 0x7e, 0x7c, 0x7c, 0x7d, 0x7e, 0x7d, 0x7c, + 0x81, 0x85, 0x85, 0x83, 0x80, 0x7d, 0x7c, 0x7d, 0x7e, 0x7e, 0x82, + 0x86, 0x8c, 0x96, 0x96, 0x87, 0x77, 0x71, 0x73, 0x7a, 0x83, 0x88, + 0x88, 0x83, 0x7b, 0x73, 0x71, 0x75, 0x7a, 0x7d, 0x7b, 0x75, 0x72, + 0x74, 0x77, 0x78, 0x74, 0x71, 0x6f, 0x71, 0x74, 0x73, 0x6f, 0x6f, + 0x73, 0x74, 0x71, 0x6c, 0x65, 0x6a, 0x86, 0xaa, 0xbd, 0xb0, 0x8e, + 0x6b, 0x5e, 0x68, 0x7d, 0x90, 0x9a, 0x9b, 0x96, 0x91, 0x89, 0x7e, + 0x74, 0x70, 0x75, 0x82, 0x8f, 0x92, 0x8e, 0x88, 0x7f, 0x7a, 0x7b, + 0x7e, 0x7f, 0x80, 0x81, 0x7f, 0x7b, 0x7a, 0x7a, 0x7c, 0x80, 0x81, + 0x81, 0x84, 0x86, 0x83, 0x7f, 0x7c, 0x7c, 0x7e, 0x82, 0x84, 0x83, + 0x8a, 0x94, 0x93, 0x85, 0x76, 0x71, 0x75, 0x80, 0x8a, 0x8b, 0x85, + 0x80, 0x7b, 0x76, 0x74, 0x77, 0x7a, 0x7c, 0x7d, 0x79, 0x75, 0x72, + 0x73, 0x75, 0x76, 0x75, 0x75, 0x74, 0x73, 0x74, 0x74, 0x71, 0x70, + 0x72, 0x73, 0x73, 0x71, 0x70, 0x70, 0x6f, 0x77, 0x8a, 0x9c, 0xa7, + 0xa8, 0x98, 0x80, 0x70, 0x6c, 0x73, 0x82, 0x94, 0x9e, 0x9e, 0x96, + 0x89, 0x7e, 0x79, 0x78, 0x78, 0x7d, 0x84, 0x8a, 0x8f, 0x90, 0x8c, + 0x84, 0x7c, 0x74, 0x72, 0x76, 0x7c, 0x83, 0x87, 0x85, 0x80, 0x7c, + 0x7c, 0x7e, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x82, + 0x86, 0x89, 0x8a, 0x8a, 0x89, 0x85, 0x7f, 0x7b, 0x7b, 0x7c, 0x7e, + 0x80, 0x83, 0x84, 0x82, 0x7e, 0x78, 0x75, 0x74, 0x72, 0x73, 0x75, + 0x79, 0x7e, 0x7f, 0x7b, 0x75, 0x70, 0x6f, 0x70, 0x72, 0x74, 0x74, + 0x75, 0x76, 0x76, 0x73, 0x71, 0x74, 0x75, 0x73, 0x6e, 0x6d, 0x6c, + 0x72, 0x85, 0x9b, 0xac, 0xaa, 0x9e, 0x8e, 0x80, 0x77, 0x73, 0x78, + 0x83, 0x94, 0x9d, 0x9b, 0x93, 0x8d, 0x86, 0x7e, 0x76, 0x72, 0x77, + 0x81, 0x8a, 0x8d, 0x8d, 0x8c, 0x87, 0x80, 0x79, 0x76, 0x76, 0x79, + 0x7d, 0x7f, 0x80, 0x82, 0x82, 0x7f, 0x7c, 0x7d, 0x80, 0x7f, 0x7c, + 0x80, 0x82, 0x84, 0x87, 0x88, 0x83, 0x82, 0x85, 0x87, 0x83, 0x80, + 0x7e, 0x7e, 0x7e, 0x81, 0x81, 0x7e, 0x7e, 0x7e, 0x7c, 0x7a, 0x79, + 0x78, 0x76, 0x78, 0x77, 0x76, 0x77, 0x78, 0x78, 0x77, 0x76, 0x75, + 0x73, 0x72, 0x71, 0x6f, 0x6f, 0x70, 0x6f, 0x71, 0x75, 0x76, 0x72, + 0x6f, 0x71, 0x72, 0x70, 0x6e, 0x6f, 0x7a, 0x8d, 0xa1, 0xae, 0xa9, + 0x9c, 0x93, 0x8a, 0x7c, 0x71, 0x75, 0x81, 0x8c, 0x92, 0x96, 0x99, + 0x98, 0x90, 0x84, 0x7b, 0x76, 0x76, 0x78, 0x7d, 0x84, 0x89, 0x8b, + 0x8a, 0x87, 0x83, 0x7f, 0x7b, 0x76, 0x75, 0x76, 0x77, 0x79, 0x7e, + 0x83, 0x86, 0x85, 0x85, 0x84, 0x81, 0x7d, 0x7a, 0x7b, 0x7d, 0x7f, + 0x83, 0x85, 0x88, 0x8b, 0x87, 0x83, 0x84, 0x84, 0x81, 0x7e, 0x7c, + 0x7c, 0x7e, 0x7e, 0x7b, 0x7c, 0x7c, 0x79, 0x76, 0x75, 0x76, 0x78, + 0x77, 0x74, 0x76, 0x78, 0x75, 0x72, 0x72, 0x74, 0x70, 0x6e, 0x71, + 0x72, 0x74, 0x74, 0x72, 0x71, 0x74, 0x75, 0x72, 0x75, 0x78, 0x74, + 0x78, 0x7f, 0x81, 0x85, 0x8b, 0x98, 0xa6, 0xa8, 0x9b, 0x93, 0x91, + 0x8b, 0x82, 0x7d, 0x80, 0x88, 0x8c, 0x8e, 0x8e, 0x8f, 0x90, 0x8e, + 0x89, 0x83, 0x81, 0x7f, 0x7c, 0x7b, 0x7c, 0x7d, 0x7e, 0x81, 0x82, + 0x80, 0x7f, 0x7e, 0x7e, 0x7b, 0x7b, 0x7b, 0x7b, 0x7d, 0x7e, 0x80, + 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x7d, 0x7e, 0x81, 0x85, 0x8d, 0x87, + 0x83, 0x88, 0x8b, 0x82, 0x78, 0x7d, 0x7e, 0x80, 0x7f, 0x7a, 0x7b, + 0x7e, 0x81, 0x79, 0x77, 0x79, 0x77, 0x75, 0x75, 0x77, 0x77, 0x7a, + 0x78, 0x73, 0x73, 0x74, 0x73, 0x70, 0x70, 0x70, 0x72, 0x75, 0x75, + 0x73, 0x72, 0x75, 0x73, 0x6e, 0x6d, 0x70, 0x74, 0x75, 0x75, 0x76, + 0x77, 0x7e, 0x8a, 0x9c, 0xa4, 0x9b, 0x99, 0xa0, 0xa5, 0x9b, 0x8e, + 0x8b, 0x8d, 0x90, 0x8b, 0x84, 0x81, 0x86, 0x8e, 0x8a, 0x83, 0x82, + 0x87, 0x8b, 0x88, 0x85, 0x83, 0x86, 0x87, 0x84, 0x80, 0x7c, 0x7f, + 0x7f, 0x7b, 0x78, 0x78, 0x7b, 0x7c, 0x7d, 0x7e, 0x7e, 0x80, 0x82, + 0x83, 0x82, 0x81, 0x82, 0x82, 0x83, 0x83, 0x82, 0x80, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7f, 0x81, 0x82, 0x82, 0x82, 0x80, 0x7f, 0x7d, 0x7c, + 0x7b, 0x79, 0x78, 0x78, 0x78, 0x78, 0x77, 0x78, 0x79, 0x78, 0x79, + 0x7b, 0x7c, 0x7b, 0x7b, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, + 0x7c, 0x7c, 0x7b, 0x7c, 0x7c, 0x7c, 0x7a, 0x7a, 0x7b, 0x7d, 0x7d, + 0x7b, 0x7c, 0x7d, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x82, 0x83, + 0x82, 0x82, 0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x88, 0x87, 0x86, 0x85, 0x85, 0x84, 0x83, 0x82, 0x80, 0x80, + 0x7f, 0x7e, 0x7c, 0x7c, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, + 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x80, 0x80, 0x7e, 0x7e, 0x80, 0x80, + 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, + 0x7e, 0x7d, 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, 0x7c, 0x7c, 0x7b, 0x7a, + 0x7a, 0x7b, 0x7c, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, + 0x7c, 0x7c, 0x7c, 0x7d, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x81, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x89, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x87, 0x86, 0x85, 0x85, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x82, 0x82, 0x82, 0x82, 0x80, 0x81, + 0x80, 0x7e, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7f, 0x7d, + 0x7c, 0x7d, 0x7b, 0x7c, 0x7c, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, + 0x7c, 0x7b, 0x7b, 0x7d, 0x7c, 0x79, 0x7d, 0x7d, 0x7a, 0x7a, 0x7a, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7e, 0x81, 0x7e, 0x7d, 0x7d, 0x7f, 0x80, + 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x81, 0x81, + 0x81, 0x82, 0x81, 0x82, 0x81, 0x80, 0x82, 0x82, 0x82, 0x81, 0x81, + 0x82, 0x82, 0x81, 0x81, 0x81, 0x83, 0x82, 0x80, 0x82, 0x82, 0x82, + 0x81, 0x81, 0x81, 0x82, 0x83, 0x82, 0x81, 0x82, 0x80, 0x82, 0x83, + 0x80, 0x80, 0x82, 0x81, 0x80, 0x81, 0x81, 0x82, 0x81, 0x80, 0x82, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7d, 0x80, 0x7e, 0x7b, + 0x7d, 0x7f, 0x7e, 0x7e, 0x7c, 0x7d, 0x80, 0x7e, 0x7e, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7d, 0x7e, 0x7e, 0x7f, + 0x7f, 0x7e, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x81, 0x81, + 0x82, 0x7f, 0x7f, 0x81, 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x81, 0x81, + 0x7f, 0x7e, 0x81, 0x80, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x7e, 0x7e, + 0x80, 0x82, 0x80, 0x7f, 0x7f, 0x81, 0x80, 0x7f, 0x81, 0x7e, 0x7e, + 0x81, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x82, 0x7f, 0x7e, 0x82, 0x7f, + 0x7e, 0x7f, 0x7e, 0x81, 0x80, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, + 0x80, 0x82, 0x7f, 0x7e, 0x80, 0x7f, 0x81, 0x7f, 0x7d, 0x80, 0x83, + 0x83, 0x7c, 0x81, 0x82, 0x7e, 0x82, 0x7d, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x82, 0x7f, 0x81, 0x7e, 0x80, 0x81, 0x7c, 0x80, 0x81, 0x7f, + 0x80, 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x7f, 0x7f, 0x7f, 0x81, + 0x81, 0x7e, 0x7c, 0x81, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x81, 0x7f, + 0x7d, 0x80, 0x80, 0x7f, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x80, 0x81, + 0x7e, 0x7f, 0x80, 0x7e, 0x7f, 0x7f, 0x7d, 0x7e, 0x7e, 0x7d, 0x80, + 0x80, 0x81, 0x82, 0x80, 0x7f, 0x81, 0x81, 0x7e, 0x81, 0x81, 0x7e, + 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x81, 0x80, + 0x7f, 0x81, 0x81, 0x7e, 0x7f, 0x81, 0x7f, 0x7f, 0x7e, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x81, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, + 0x7d, 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7f, 0x81, + 0x81, 0x80, 0x80, 0x81, 0x80, 0x7e, 0x7f, 0x7f, 0x7e, 0x80, 0x80, + 0x7d, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x81, + 0x7f, 0x7e, 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7d, 0x7e, 0x81, + 0x7f, 0x7e, 0x7f, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x81, 0x82, 0x80, + 0x80, 0x80, 0x81, 0x80, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x7f, 0x80, 0x81, 0x7f, 0x81, + 0x81, 0x7f, 0x80, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x80, + 0x81, 0x80, 0x7e, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7f, 0x81, + 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, 0x81, 0x80, 0x7f, 0x81, 0x81, + 0x7f, 0x7f, 0x7f, 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x7e, + 0x7e, 0x80, 0x81, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, + }, + { // 6 + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x80, + 0x7f, 0x80, 0x81, 0x7e, 0x80, 0x7f, 0x81, 0x7e, 0x80, 0x7f, 0x7f, + 0x81, 0x7e, 0x7f, 0x7f, 0x81, 0x7e, 0x80, 0x7f, 0x81, 0x7e, 0x80, + 0x80, 0x7e, 0x82, 0x7e, 0x81, 0x7f, 0x81, 0x7f, 0x81, 0x7e, 0x80, + 0x7f, 0x7f, 0x80, 0x7e, 0x83, 0x7f, 0x83, 0x7c, 0x81, 0x7e, 0x81, + 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7c, 0x84, 0x7b, 0x83, 0x7c, 0x82, + 0x80, 0x80, 0x80, 0x7e, 0x81, 0x7d, 0x81, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x81, 0x7e, 0x81, 0x7d, 0x81, 0x7d, 0x81, 0x7d, 0x82, 0x7e, + 0x80, 0x81, 0x7f, 0x80, 0x7f, 0x81, 0x7d, 0x81, 0x7d, 0x82, 0x7f, + 0x81, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x7f, 0x7f, + 0x80, 0x7f, 0x7e, 0x81, 0x7f, 0x80, 0x7f, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x81, + 0x80, 0x7f, 0x82, 0x7e, 0x83, 0x7e, 0x80, 0x7e, 0x82, 0x80, 0x7f, + 0x7e, 0x7f, 0x81, 0x7e, 0x81, 0x7d, 0x82, 0x7c, 0x82, 0x7d, 0x80, + 0x83, 0x7c, 0x82, 0x7d, 0x84, 0x80, 0x7f, 0x81, 0x7e, 0x81, 0x7d, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7d, 0x80, 0x7e, + 0x85, 0x7e, 0x81, 0x7f, 0x7d, 0x83, 0x7b, 0x83, 0x7d, 0x80, 0x7f, + 0x7e, 0x81, 0x7e, 0x83, 0x7d, 0x82, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7e, 0x81, 0x7c, 0x83, 0x7e, 0x80, 0x81, 0x7f, 0x81, 0x7e, 0x82, + 0x7c, 0x82, 0x7f, 0x7d, 0x83, 0x7d, 0x82, 0x7e, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x81, 0x7f, 0x82, 0x7e, 0x80, + 0x81, 0x7e, 0x82, 0x7e, 0x7f, 0x81, 0x7e, 0x7f, 0x7f, 0x80, 0x82, + 0x7e, 0x7f, 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x80, 0x80, 0x80, 0x7e, + 0x7f, 0x81, 0x81, 0x7f, 0x80, 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x80, + 0x81, 0x7e, 0x81, 0x7d, 0x81, 0x7e, 0x80, 0x81, 0x7d, 0x84, 0x7e, + 0x80, 0x7f, 0x7e, 0x82, 0x7e, 0x81, 0x7f, 0x7e, 0x81, 0x81, 0x7c, + 0x80, 0x81, 0x7f, 0x82, 0x7d, 0x81, 0x7f, 0x81, 0x7f, 0x7e, 0x81, + 0x7f, 0x80, 0x7d, 0x81, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x80, 0x81, + 0x80, 0x7f, 0x80, 0x81, 0x7d, 0x7f, 0x80, 0x7e, 0x81, 0x7e, 0x80, + 0x80, 0x81, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x81, 0x7f, 0x81, + 0x7e, 0x80, 0x7e, 0x7d, 0x82, 0x7d, 0x82, 0x7f, 0x7d, 0x83, 0x7f, + 0x7d, 0x82, 0x7e, 0x81, 0x81, 0x7b, 0x82, 0x80, 0x7e, 0x81, 0x7c, + 0x82, 0x82, 0x7c, 0x80, 0x7f, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x81, + 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x82, 0x80, 0x80, + 0x7e, 0x80, 0x80, 0x7d, 0x82, 0x7e, 0x81, 0x82, 0x7c, 0x81, 0x7e, + 0x80, 0x81, 0x7d, 0x83, 0x80, 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x7f, + 0x7f, 0x82, 0x7d, 0x80, 0x7f, 0x7d, 0x82, 0x7e, 0x7f, 0x81, 0x7e, + 0x83, 0x7c, 0x80, 0x80, 0x81, 0x80, 0x7e, 0x80, 0x7e, 0x82, 0x7d, + 0x81, 0x7f, 0x81, 0x80, 0x7b, 0x81, 0x7e, 0x83, 0x7d, 0x7e, 0x80, + 0x7f, 0x81, 0x7c, 0x7d, 0x82, 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x80, + 0x82, 0x7c, 0x82, 0x80, 0x7c, 0x82, 0x7d, 0x7f, 0x7e, 0x82, 0x80, + 0x7b, 0x84, 0x82, 0x82, 0x84, 0x7d, 0x7e, 0x85, 0x7f, 0x7f, 0x7c, + 0x80, 0x82, 0x7a, 0x84, 0x7a, 0x82, 0x84, 0x7c, 0x82, 0x7c, 0x85, + 0x7f, 0x83, 0x80, 0x7f, 0x85, 0x81, 0x82, 0x7c, 0x82, 0x80, 0x80, + 0x80, 0x7c, 0x84, 0x7f, 0x80, 0x81, 0x7d, 0x81, 0x80, 0x7e, 0x7f, + 0x7e, 0x7e, 0x7c, 0x7b, 0x7a, 0x76, 0x79, 0x75, 0x74, 0x75, 0x6f, + 0x70, 0x6e, 0x6a, 0x68, 0x68, 0x70, 0x79, 0x81, 0x82, 0x8d, 0x95, + 0x99, 0xa0, 0x9e, 0x9d, 0xa1, 0xa0, 0x99, 0x92, 0x8a, 0x84, 0x80, + 0x75, 0x6e, 0x6f, 0x71, 0x72, 0x74, 0x7a, 0x86, 0x92, 0x9c, 0xa1, + 0xa9, 0xaf, 0xac, 0xa5, 0x9c, 0x96, 0x89, 0x7d, 0x70, 0x65, 0x62, + 0x5b, 0x55, 0x52, 0x55, 0x58, 0x5a, 0x5b, 0x5c, 0x60, 0x5d, 0x59, + 0x54, 0x52, 0x4d, 0x4d, 0x51, 0x56, 0x7c, 0x92, 0x8c, 0x98, 0xae, + 0xb5, 0xb3, 0xb2, 0xaa, 0xaa, 0xab, 0x97, 0x85, 0x81, 0x77, 0x6e, + 0x6b, 0x66, 0x69, 0x75, 0x7d, 0x80, 0x8d, 0x99, 0x9d, 0xa2, 0xa3, + 0x9f, 0x9b, 0x94, 0x89, 0x82, 0x7a, 0x71, 0x6e, 0x6f, 0x70, 0x76, + 0x7e, 0x84, 0x8b, 0x8e, 0x8d, 0x8b, 0x87, 0x7f, 0x79, 0x71, 0x68, + 0x62, 0x5e, 0x5b, 0x57, 0x57, 0x57, 0x55, 0x53, 0x4f, 0x57, 0x89, + 0xa0, 0x8a, 0x93, 0xb1, 0xb7, 0xaf, 0xa3, 0x95, 0x9e, 0x9f, 0x81, + 0x6e, 0x75, 0x75, 0x70, 0x6d, 0x66, 0x74, 0x89, 0x87, 0x82, 0x96, + 0xa4, 0x9f, 0x9b, 0x96, 0x94, 0x94, 0x88, 0x75, 0x71, 0x74, 0x6e, + 0x6b, 0x6c, 0x71, 0x7b, 0x82, 0x84, 0x8b, 0x91, 0x91, 0x8f, 0x86, + 0x80, 0x7b, 0x73, 0x71, 0x6f, 0x6b, 0x73, 0x77, 0x71, 0x75, 0x71, + 0x6e, 0x6d, 0x61, 0x55, 0x54, 0x4b, 0x41, 0x76, 0x9c, 0x85, 0x8f, + 0xb2, 0xbc, 0xb9, 0xb2, 0x9f, 0xa0, 0xa4, 0x84, 0x68, 0x6b, 0x69, + 0x5f, 0x60, 0x63, 0x71, 0x8c, 0x96, 0x8d, 0x9a, 0xad, 0xa5, 0x9a, + 0x91, 0x8a, 0x84, 0x77, 0x64, 0x60, 0x6b, 0x6b, 0x66, 0x71, 0x80, + 0x88, 0x92, 0x96, 0x97, 0x9d, 0x99, 0x8a, 0x7f, 0x7d, 0x7b, 0x73, + 0x71, 0x72, 0x73, 0x78, 0x7d, 0x7b, 0x7e, 0x87, 0x86, 0x80, 0x7c, + 0x75, 0x71, 0x70, 0x65, 0x5e, 0x61, 0x62, 0x5c, 0x5a, 0x58, 0x5e, + 0x92, 0xab, 0x91, 0x92, 0xb2, 0xb6, 0xa1, 0x98, 0x87, 0x86, 0x8d, + 0x6f, 0x5c, 0x74, 0x80, 0x76, 0x7a, 0x88, 0x93, 0x9d, 0x97, 0x8b, + 0x96, 0x9a, 0x87, 0x79, 0x7b, 0x7c, 0x76, 0x6d, 0x6b, 0x78, 0x81, + 0x7a, 0x78, 0x80, 0x85, 0x86, 0x81, 0x7e, 0x84, 0x8b, 0x86, 0x83, + 0x88, 0x88, 0x84, 0x82, 0x81, 0x80, 0x82, 0x81, 0x7b, 0x7c, 0x7f, + 0x7c, 0x79, 0x78, 0x78, 0x78, 0x77, 0x75, 0x75, 0x78, 0x75, 0x6f, + 0x71, 0x71, 0x6b, 0x6b, 0x6b, 0x68, 0x67, 0x67, 0x6b, 0x92, 0xb0, + 0x9d, 0x94, 0xae, 0xb2, 0x97, 0x8b, 0x7d, 0x78, 0x83, 0x73, 0x61, + 0x73, 0x85, 0x81, 0x7e, 0x89, 0x93, 0x9c, 0x98, 0x86, 0x86, 0x8f, + 0x84, 0x72, 0x75, 0x7d, 0x78, 0x76, 0x76, 0x7d, 0x86, 0x83, 0x7b, + 0x81, 0x8a, 0x85, 0x7e, 0x7d, 0x7d, 0x7d, 0x7c, 0x7a, 0x7f, 0x83, + 0x81, 0x81, 0x88, 0x8a, 0x85, 0x83, 0x84, 0x85, 0x83, 0x7f, 0x7d, + 0x7d, 0x7c, 0x7a, 0x7a, 0x7a, 0x79, 0x78, 0x79, 0x79, 0x78, 0x78, + 0x78, 0x76, 0x75, 0x75, 0x76, 0x75, 0x76, 0x76, 0x70, 0x71, 0x75, + 0x6e, 0x6b, 0x6c, 0x6d, 0x64, 0x77, 0xab, 0xa7, 0x8b, 0x97, 0xba, + 0xa7, 0x84, 0x89, 0x90, 0x88, 0x7a, 0x7c, 0x78, 0x7f, 0x88, 0x81, + 0x7e, 0x8c, 0x95, 0x8b, 0x83, 0x86, 0x8f, 0x88, 0x7e, 0x7c, 0x83, + 0x82, 0x78, 0x75, 0x7a, 0x82, 0x7c, 0x74, 0x77, 0x7f, 0x7f, 0x7b, + 0x7f, 0x84, 0x84, 0x7f, 0x7d, 0x80, 0x81, 0x81, 0x81, 0x82, 0x84, + 0x87, 0x86, 0x84, 0x83, 0x83, 0x81, 0x7d, 0x7e, 0x7f, 0x7e, 0x7c, + 0x7b, 0x7a, 0x7b, 0x7b, 0x7a, 0x79, 0x79, 0x79, 0x78, 0x78, 0x78, + 0x77, 0x78, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x78, 0x78, 0x77, + 0x75, 0x77, 0x76, 0x73, 0x6f, 0x75, 0x81, 0x7d, 0x77, 0x87, 0x9b, + 0x93, 0x88, 0x92, 0x9e, 0x93, 0x85, 0x8c, 0x92, 0x87, 0x7e, 0x82, + 0x85, 0x81, 0x7e, 0x81, 0x83, 0x85, 0x87, 0x86, 0x85, 0x86, 0x89, + 0x83, 0x7f, 0x81, 0x83, 0x7c, 0x78, 0x7b, 0x7c, 0x78, 0x76, 0x7a, + 0x7d, 0x7e, 0x7e, 0x7f, 0x82, 0x83, 0x81, 0x7e, 0x7e, 0x7e, 0x7d, + 0x7b, 0x7c, 0x7e, 0x7c, 0x7b, 0x7c, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, + 0x7f, 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, + 0x7f, 0x80, 0x80, 0x81, 0x82, 0x82, 0x81, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x82, 0x7f, 0x83, 0x85, 0x82, 0x7c, + 0x7a, 0x7d, 0x80, 0x7e, 0x7c, 0x7c, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x81, 0x80, 0x7d, 0x7e, + 0x81, 0x82, 0x7f, 0x7b, 0x7e, 0x80, 0x82, 0x7f, 0x7d, 0x7f, 0x82, + 0x84, 0x81, 0x81, 0x7d, 0x82, 0x83, 0x7f, 0x81, 0x80, 0x84, 0x83, + 0x82, 0x83, 0x81, 0x81, 0x80, 0x7e, 0x7d, 0x7e, 0x80, 0x81, 0x7e, + 0x7b, 0x7d, 0x83, 0x80, 0x7f, 0x7d, 0x81, 0x83, 0x80, 0x80, 0x7e, + 0x7d, 0x82, 0x81, 0x7d, 0x7c, 0x80, 0x83, 0x7f, 0x7f, 0x7a, 0x81, + 0x81, 0x82, 0x7f, 0x7c, 0x80, 0x81, 0x85, 0x7b, 0x7d, 0x81, 0x82, + 0x80, 0x7c, 0x7e, 0x80, 0x86, 0x80, 0x7d, 0x7c, 0x82, 0x88, 0x7c, + 0x7c, 0x7d, 0x82, 0x83, 0x7e, 0x7c, 0x7e, 0x80, 0x83, 0x80, 0x7a, + 0x7f, 0x81, 0x85, 0x7f, 0x7b, 0x7e, 0x7f, 0x82, 0x81, 0x7b, 0x7e, + 0x82, 0x81, 0x81, 0x79, 0x81, 0x81, 0x83, 0x7f, 0x7d, 0x80, 0x80, + 0x84, 0x78, 0x7f, 0x7e, 0x83, 0x7e, 0x7c, 0x7f, 0x81, 0x85, 0x7c, + 0x7c, 0x7e, 0x85, 0x81, 0x7f, 0x7a, 0x85, 0x82, 0x80, 0x7f, 0x77, + 0x81, 0x81, 0x81, 0x7d, 0x7c, 0x81, 0x83, 0x81, 0x7a, 0x81, 0x82, + 0x83, 0x7d, 0x7c, 0x82, 0x80, 0x81, 0x7a, 0x80, 0x80, 0x80, 0x7e, + 0x7c, 0x82, 0x7f, 0x82, 0x7c, 0x7f, 0x81, 0x81, 0x80, 0x7b, 0x81, + 0x81, 0x81, 0x7d, 0x80, 0x7e, 0x82, 0x80, 0x7c, 0x80, 0x7d, 0x84, + 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x7f, 0x80, 0x7d, 0x82, 0x7e, 0x82, + 0x7d, 0x7e, 0x82, 0x7f, 0x80, 0x7d, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x83, 0x80, 0x80, 0x7e, 0x7f, 0x82, 0x7e, 0x80, 0x7f, 0x80, + 0x81, 0x7e, 0x7e, 0x7f, 0x7f, 0x81, 0x81, 0x80, 0x80, 0x7e, 0x83, + 0x7f, 0x7e, 0x7e, 0x7e, 0x84, 0x7b, 0x7f, 0x80, 0x7e, 0x83, 0x7e, + 0x80, 0x7e, 0x83, 0x81, 0x7e, 0x7f, 0x7e, 0x84, 0x7e, 0x7d, 0x80, + 0x7f, 0x81, 0x7e, 0x7e, 0x7f, 0x82, 0x81, 0x7f, 0x7f, 0x7f, 0x82, + 0x7e, 0x80, 0x7e, 0x80, 0x81, 0x7e, 0x7f, 0x80, 0x7e, 0x80, 0x81, + 0x7d, 0x81, 0x7e, 0x83, 0x7f, 0x7f, 0x81, 0x7c, 0x82, 0x7e, 0x81, + 0x7d, 0x81, 0x81, 0x80, 0x7f, 0x7d, 0x82, 0x7e, 0x81, 0x7e, 0x7f, + 0x82, 0x7e, 0x81, 0x7d, 0x80, 0x81, 0x7e, 0x82, 0x7f, 0x7f, 0x7f, + 0x81, 0x80, 0x7e, 0x81, 0x7f, 0x7e, 0x80, 0x82, 0x7e, 0x7d, 0x80, + 0x82, 0x7d, 0x7c, 0x82, 0x7f, 0x81, 0x7e, 0x80, 0x81, 0x7c, 0x80, + 0x7f, 0x80, 0x80, 0x7d, 0x83, 0x7f, 0x80, 0x7f, 0x7d, 0x82, 0x7d, + 0x81, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x80, + 0x81, 0x80, 0x7d, 0x7f, 0x82, 0x7e, 0x7d, 0x81, 0x80, 0x81, 0x7e, + 0x80, 0x81, 0x7e, 0x81, 0x7f, 0x7f, 0x82, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x7e, 0x7e, 0x82, 0x7e, 0x80, 0x7e, 0x80, 0x81, 0x7f, + 0x80, 0x7d, 0x80, 0x81, 0x7f, 0x7f, 0x7f, 0x81, 0x81, 0x7e, 0x80, + 0x7d, 0x82, 0x7f, 0x7f, 0x7f, 0x7e, 0x81, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x81, 0x7f, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7d, 0x80, 0x7f, 0x80, 0x7f, 0x81, 0x7f, 0x7f, 0x7e, 0x81, + 0x7d, 0x82, 0x7e, 0x7e, 0x81, 0x7e, 0x83, 0x7c, 0x81, 0x7f, 0x80, + 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x80, 0x80, 0x7e, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x81, 0x7f, 0x7f, 0x81, 0x7e, 0x82, + 0x7d, 0x80, 0x80, 0x7f, 0x81, 0x7e, 0x80, 0x7f, 0x80, 0x80, 0x7e, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x81, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x7e, 0x81, 0x7e, + 0x80, 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x81, 0x7f, 0x80, 0x7f, + 0x81, 0x7f, 0x7f, 0x80, 0x7e, 0x81, 0x7f, 0x80, 0x7e, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x81, 0x7e, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x81, + 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x7e, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7e, + 0x80, 0x81, 0x80, 0x81, 0x81, 0x82, 0x81, 0x80, 0x80, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, + 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x81, 0x81, 0x81, + 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + }, + { // 7 + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x80, + 0x7f, 0x80, 0x81, 0x7e, 0x80, 0x7f, 0x81, 0x7e, 0x80, 0x7f, 0x7f, + 0x81, 0x7e, 0x7f, 0x7f, 0x81, 0x7e, 0x80, 0x7f, 0x81, 0x7e, 0x80, + 0x80, 0x7e, 0x82, 0x7e, 0x81, 0x7f, 0x81, 0x7f, 0x81, 0x7e, 0x80, + 0x7f, 0x7f, 0x80, 0x7e, 0x83, 0x7f, 0x83, 0x7c, 0x81, 0x7e, 0x81, + 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7c, 0x84, 0x7b, 0x83, 0x7c, 0x82, + 0x80, 0x80, 0x80, 0x7e, 0x81, 0x7d, 0x81, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x81, 0x7e, 0x81, 0x7d, 0x81, 0x7d, 0x81, 0x7d, 0x82, 0x7e, + 0x80, 0x81, 0x7f, 0x80, 0x7f, 0x81, 0x7d, 0x81, 0x7d, 0x82, 0x7f, + 0x81, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x7f, 0x7f, + 0x80, 0x7f, 0x7e, 0x81, 0x7f, 0x80, 0x7f, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x81, + 0x80, 0x7f, 0x82, 0x7e, 0x83, 0x7e, 0x80, 0x7e, 0x82, 0x80, 0x7f, + 0x7e, 0x7f, 0x81, 0x7e, 0x81, 0x7d, 0x82, 0x7c, 0x82, 0x7d, 0x80, + 0x83, 0x7c, 0x82, 0x7d, 0x84, 0x80, 0x7f, 0x81, 0x7e, 0x81, 0x7d, + 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x7f, 0x80, 0x7f, 0x7d, 0x80, 0x7e, + 0x85, 0x7d, 0x81, 0x7f, 0x7e, 0x83, 0x7b, 0x83, 0x7d, 0x81, 0x7e, + 0x7e, 0x80, 0x7e, 0x83, 0x7d, 0x83, 0x7e, 0x80, 0x7f, 0x7f, 0x81, + 0x7d, 0x82, 0x7b, 0x83, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x81, + 0x7c, 0x82, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7e, 0x80, + 0x80, 0x81, 0x7e, 0x7f, 0x81, 0x80, 0x7e, 0x81, 0x80, 0x7f, 0x81, + 0x7c, 0x81, 0x7f, 0x81, 0x81, 0x7f, 0x80, 0x7e, 0x81, 0x7d, 0x7e, + 0x81, 0x7f, 0x81, 0x81, 0x7c, 0x81, 0x7f, 0x7e, 0x82, 0x7e, 0x81, + 0x81, 0x7e, 0x81, 0x7e, 0x81, 0x80, 0x7e, 0x7f, 0x7f, 0x7f, 0x7d, + 0x82, 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, 0x80, + 0x81, 0x7f, 0x7f, 0x80, 0x7e, 0x7e, 0x81, 0x7e, 0x81, 0x81, 0x7f, + 0x7f, 0x7d, 0x82, 0x7e, 0x7f, 0x81, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7e, 0x80, 0x81, 0x7d, 0x80, 0x80, 0x7e, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x82, 0x7e, 0x7f, 0x81, 0x7d, 0x82, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x7f, + 0x80, 0x7f, 0x80, 0x82, 0x7f, 0x7f, 0x81, 0x7f, 0x7f, 0x7e, 0x80, + 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x80, + 0x81, 0x7d, 0x7f, 0x82, 0x81, 0x80, 0x7d, 0x7f, 0x82, 0x7f, 0x7f, + 0x80, 0x7e, 0x82, 0x7e, 0x7e, 0x80, 0x80, 0x7f, 0x81, 0x7e, 0x7d, + 0x82, 0x7b, 0x83, 0x7e, 0x7f, 0x83, 0x7f, 0x82, 0x7d, 0x80, 0x80, + 0x7f, 0x7f, 0x7d, 0x82, 0x7e, 0x80, 0x81, 0x7e, 0x81, 0x7e, 0x7f, + 0x81, 0x7e, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x80, 0x81, + 0x81, 0x7e, 0x7e, 0x81, 0x7e, 0x7f, 0x81, 0x7e, 0x80, 0x81, 0x7e, + 0x7f, 0x80, 0x81, 0x7c, 0x82, 0x7e, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, + 0x84, 0x7e, 0x82, 0x80, 0x7d, 0x83, 0x7e, 0x7e, 0x7f, 0x80, 0x81, + 0x7d, 0x83, 0x81, 0x7e, 0x81, 0x7d, 0x7e, 0x82, 0x7d, 0x7d, 0x80, + 0x7e, 0x7e, 0x82, 0x7f, 0x7e, 0x80, 0x80, 0x80, 0x7f, 0x7d, 0x80, + 0x80, 0x81, 0x7f, 0x7e, 0x83, 0x81, 0x80, 0x81, 0x7f, 0x81, 0x7f, + 0x7f, 0x7f, 0x7d, 0x7f, 0x7e, 0x7c, 0x7c, 0x7e, 0x7e, 0x81, 0x7f, + 0x80, 0x81, 0x80, 0x7f, 0x83, 0x82, 0x7f, 0x81, 0x80, 0x80, 0x7f, + 0x7f, 0x82, 0x82, 0x84, 0x85, 0x85, 0x86, 0x85, 0x86, 0x85, 0x85, + 0x85, 0x82, 0x83, 0x82, 0x7f, 0x7e, 0x80, 0x7f, 0x7e, 0x7e, 0x7b, + 0x79, 0x7b, 0x79, 0x76, 0x72, 0x6f, 0x6c, 0x69, 0x67, 0x60, 0x5e, + 0x5f, 0x5c, 0x58, 0x57, 0x56, 0x57, 0x7a, 0xa0, 0xa2, 0xa0, 0xac, + 0xb6, 0xb7, 0xb1, 0xa0, 0x93, 0x97, 0x95, 0x82, 0x72, 0x68, 0x64, + 0x69, 0x6e, 0x68, 0x6b, 0x7c, 0x89, 0x90, 0x96, 0x93, 0x95, 0xa1, + 0x9f, 0x91, 0x89, 0x84, 0x80, 0x7b, 0x73, 0x71, 0x76, 0x7a, 0x7a, + 0x7c, 0x81, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x7e, 0x77, 0x74, + 0x6f, 0x6c, 0x66, 0x60, 0x59, 0x57, 0x53, 0x4b, 0x4c, 0x4a, 0x4e, + 0x54, 0x73, 0xa7, 0xb1, 0xaa, 0xb7, 0xc1, 0xbc, 0xb7, 0x9f, 0x83, + 0x7b, 0x80, 0x6c, 0x56, 0x58, 0x60, 0x70, 0x83, 0x87, 0x88, 0xa0, + 0xb3, 0xad, 0xa3, 0x98, 0x88, 0x83, 0x7c, 0x68, 0x5c, 0x60, 0x68, + 0x6e, 0x75, 0x79, 0x83, 0x98, 0xa3, 0x9f, 0x96, 0x91, 0x8b, 0x85, + 0x7c, 0x74, 0x76, 0x7c, 0x7d, 0x7e, 0x81, 0x7d, 0x7a, 0x7b, 0x78, + 0x74, 0x70, 0x6c, 0x67, 0x63, 0x5f, 0x59, 0x55, 0x51, 0x58, 0x5e, + 0x70, 0xa2, 0xbd, 0xb4, 0xaa, 0xb3, 0xb1, 0xa3, 0x8f, 0x6e, 0x63, + 0x6c, 0x69, 0x5f, 0x66, 0x75, 0x8b, 0xa2, 0xa5, 0x9c, 0xa1, 0xa7, + 0x9d, 0x8a, 0x78, 0x6b, 0x6d, 0x70, 0x6c, 0x6a, 0x74, 0x82, 0x8a, + 0x8b, 0x85, 0x85, 0x8c, 0x8f, 0x87, 0x80, 0x81, 0x84, 0x85, 0x83, + 0x82, 0x83, 0x85, 0x82, 0x7e, 0x7b, 0x79, 0x78, 0x78, 0x77, 0x76, + 0x74, 0x71, 0x6c, 0x67, 0x61, 0x5b, 0x59, 0x56, 0x54, 0x5b, 0x6a, + 0x7f, 0x9c, 0xb8, 0xbe, 0xb3, 0xa4, 0x9c, 0x8c, 0x78, 0x67, 0x5b, + 0x5c, 0x6c, 0x7f, 0x88, 0x8f, 0x9b, 0xa8, 0xab, 0xa3, 0x93, 0x83, + 0x78, 0x73, 0x6c, 0x64, 0x66, 0x72, 0x84, 0x8f, 0x93, 0x91, 0x90, + 0x91, 0x8c, 0x81, 0x74, 0x70, 0x73, 0x78, 0x79, 0x7c, 0x85, 0x8d, + 0x8f, 0x8d, 0x8c, 0x8a, 0x86, 0x80, 0x7a, 0x77, 0x76, 0x76, 0x76, + 0x77, 0x77, 0x76, 0x73, 0x70, 0x6b, 0x65, 0x5e, 0x5a, 0x59, 0x57, + 0x5a, 0x66, 0x74, 0x85, 0xa7, 0xc1, 0xbc, 0xa8, 0x99, 0x8e, 0x7f, + 0x72, 0x64, 0x5c, 0x68, 0x80, 0x90, 0x95, 0x99, 0x9f, 0xa1, 0x9c, + 0x8c, 0x79, 0x6c, 0x6b, 0x70, 0x74, 0x7a, 0x83, 0x8e, 0x99, 0x9a, + 0x91, 0x83, 0x7b, 0x75, 0x6e, 0x6a, 0x69, 0x6e, 0x7c, 0x8e, 0x98, + 0x98, 0x96, 0x93, 0x8a, 0x81, 0x7b, 0x78, 0x7a, 0x7f, 0x81, 0x80, + 0x7d, 0x7b, 0x78, 0x77, 0x75, 0x73, 0x71, 0x71, 0x70, 0x6d, 0x68, + 0x65, 0x66, 0x68, 0x68, 0x66, 0x64, 0x6a, 0x76, 0x84, 0x9e, 0xba, + 0xbf, 0xab, 0x95, 0x84, 0x75, 0x6c, 0x69, 0x6d, 0x76, 0x87, 0x97, + 0x9e, 0x9f, 0x9c, 0x95, 0x8d, 0x84, 0x78, 0x6c, 0x6b, 0x72, 0x7a, + 0x80, 0x87, 0x8d, 0x91, 0x92, 0x8d, 0x83, 0x78, 0x70, 0x6d, 0x6e, + 0x73, 0x7b, 0x84, 0x8d, 0x94, 0x94, 0x8f, 0x88, 0x83, 0x81, 0x82, + 0x84, 0x84, 0x85, 0x83, 0x7f, 0x7a, 0x76, 0x74, 0x75, 0x77, 0x77, + 0x76, 0x74, 0x73, 0x72, 0x70, 0x6e, 0x6e, 0x6d, 0x69, 0x65, 0x65, + 0x68, 0x69, 0x67, 0x6e, 0x82, 0x93, 0xa2, 0xac, 0xab, 0xa1, 0x95, + 0x88, 0x7a, 0x71, 0x71, 0x78, 0x80, 0x85, 0x8a, 0x91, 0x96, 0x98, + 0x95, 0x8d, 0x85, 0x7f, 0x7a, 0x75, 0x74, 0x78, 0x81, 0x88, 0x8b, + 0x89, 0x88, 0x86, 0x7f, 0x74, 0x6d, 0x6c, 0x71, 0x7a, 0x81, 0x85, + 0x86, 0x8c, 0x94, 0x94, 0x8d, 0x86, 0x82, 0x80, 0x80, 0x80, 0x7e, + 0x7c, 0x7d, 0x7f, 0x7e, 0x7d, 0x7b, 0x7a, 0x78, 0x76, 0x73, 0x71, + 0x6e, 0x6c, 0x6d, 0x6f, 0x6f, 0x6f, 0x71, 0x72, 0x71, 0x70, 0x6e, + 0x69, 0x67, 0x70, 0x7f, 0x96, 0xac, 0xb2, 0xa8, 0x9c, 0x93, 0x89, + 0x81, 0x79, 0x73, 0x75, 0x80, 0x8d, 0x95, 0x96, 0x94, 0x91, 0x8d, + 0x87, 0x7e, 0x74, 0x6f, 0x73, 0x7a, 0x80, 0x85, 0x88, 0x87, 0x86, + 0x84, 0x81, 0x7c, 0x77, 0x75, 0x74, 0x75, 0x79, 0x7e, 0x82, 0x88, + 0x91, 0x96, 0x92, 0x8b, 0x85, 0x81, 0x7e, 0x7d, 0x7f, 0x81, 0x83, + 0x85, 0x85, 0x80, 0x7c, 0x7b, 0x7b, 0x78, 0x76, 0x74, 0x72, 0x72, + 0x74, 0x75, 0x74, 0x74, 0x75, 0x72, 0x6d, 0x6d, 0x6f, 0x6d, 0x6b, + 0x70, 0x75, 0x76, 0x78, 0x78, 0x73, 0x6d, 0x6d, 0x70, 0x7b, 0x8d, + 0x94, 0x91, 0x8e, 0x8d, 0x83, 0x7a, 0x79, 0x70, 0x6a, 0x7e, 0x9c, + 0xa8, 0xa4, 0xa2, 0x9e, 0x94, 0x8f, 0x8c, 0x7f, 0x6f, 0x70, 0x7a, + 0x7f, 0x83, 0x8a, 0x8e, 0x8c, 0x90, 0x94, 0x8f, 0x83, 0x7e, 0x7d, + 0x77, 0x74, 0x77, 0x7a, 0x7a, 0x7e, 0x84, 0x84, 0x82, 0x83, 0x85, + 0x83, 0x80, 0x7f, 0x7b, 0x77, 0x77, 0x7c, 0x82, 0x86, 0x8a, 0x8c, + 0x8b, 0x89, 0x89, 0x89, 0x86, 0x81, 0x7c, 0x79, 0x79, 0x7a, 0x7b, + 0x7b, 0x7c, 0x7b, 0x7a, 0x79, 0x78, 0x76, 0x75, 0x73, 0x72, 0x72, + 0x72, 0x73, 0x74, 0x75, 0x75, 0x76, 0x78, 0x7a, 0x7b, 0x7b, 0x7d, + 0x7d, 0x7c, 0x7b, 0x7d, 0x7d, 0x7c, 0x7b, 0x7b, 0x7c, 0x7b, 0x7a, + 0x79, 0x77, 0x75, 0x7a, 0x86, 0x8d, 0x8e, 0x8e, 0x91, 0x91, 0x8e, + 0x8d, 0x8b, 0x88, 0x85, 0x87, 0x89, 0x88, 0x87, 0x87, 0x86, 0x84, + 0x84, 0x84, 0x82, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x7f, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7d, 0x7c, 0x7c, 0x7c, 0x7d, + 0x7c, 0x7c, 0x7d, 0x7e, 0x80, 0x82, 0x84, 0x83, 0x80, 0x7e, 0x7c, + 0x7d, 0x7e, 0x81, 0x83, 0x85, 0x86, 0x86, 0x85, 0x83, 0x81, 0x7f, + 0x7e, 0x7c, 0x7b, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7a, 0x7a, 0x7b, + 0x7b, 0x7b, 0x7b, 0x7b, 0x7a, 0x7a, 0x7a, 0x7c, 0x7d, 0x7e, 0x7e, + 0x7d, 0x7c, 0x7d, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x82, 0x82, 0x84, 0x85, 0x86, 0x86, 0x85, 0x84, 0x85, + 0x85, 0x85, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x83, 0x81, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7c, 0x7d, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, + 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7d, 0x7d, 0x7e, 0x7d, 0x7c, 0x7c, 0x7d, 0x7d, 0x7c, + 0x7c, 0x7c, 0x7b, 0x7c, 0x7d, 0x7f, 0x80, 0x82, 0x84, 0x87, 0x89, + 0x88, 0x87, 0x88, 0x8a, 0x8b, 0x8a, 0x88, 0x85, 0x85, 0x86, 0x85, + 0x84, 0x82, 0x81, 0x81, 0x81, 0x80, 0x7e, 0x7d, 0x7e, 0x7f, 0x80, + 0x82, 0x81, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7d, + 0x7b, 0x7c, 0x7e, 0x80, 0x80, 0x7f, 0x80, 0x82, 0x83, 0x84, 0x83, + 0x80, 0x7e, 0x80, 0x7f, 0x7b, 0x79, 0x78, 0x78, 0x79, 0x79, 0x79, + 0x77, 0x74, 0x77, 0x78, 0x77, 0x77, 0x77, 0x76, 0x73, 0x73, 0x72, + 0x6f, 0x6f, 0x6e, 0x6e, 0x6f, 0x70, 0x70, 0x72, 0x70, 0x6d, 0x6a, + 0x69, 0x67, 0x6d, 0x7e, 0x80, 0x83, 0x9a, 0xab, 0xaa, 0xa3, 0xa2, + 0x9a, 0x95, 0x94, 0x8c, 0x7e, 0x78, 0x7c, 0x7c, 0x7f, 0x84, 0x86, + 0x86, 0x8c, 0x93, 0x8f, 0x89, 0x86, 0x84, 0x80, 0x7f, 0x7b, 0x72, + 0x73, 0x77, 0x79, 0x79, 0x7b, 0x7c, 0x7e, 0x84, 0x85, 0x82, 0x80, + 0x82, 0x82, 0x80, 0x7e, 0x7b, 0x7f, 0x85, 0x84, 0x81, 0x84, 0x8a, + 0x8b, 0x8a, 0x88, 0x85, 0x87, 0x89, 0x86, 0x81, 0x7e, 0x7e, 0x7d, + 0x7c, 0x78, 0x75, 0x76, 0x76, 0x70, 0x6c, 0x6e, 0x71, 0x74, 0x73, + 0x71, 0x71, 0x74, 0x74, 0x73, 0x72, 0x72, 0x71, 0x6e, 0x6b, 0x69, + 0x6b, 0x6b, 0x68, 0x67, 0x69, 0x6a, 0x67, 0x64, 0x62, 0x61, 0x72, + 0x96, 0xab, 0xac, 0xaa, 0xaf, 0xaf, 0xaa, 0x9e, 0x8d, 0x85, 0x86, + 0x88, 0x82, 0x7f, 0x82, 0x88, 0x90, 0x91, 0x8f, 0x8c, 0x8d, 0x8c, + 0x87, 0x81, 0x7d, 0x7c, 0x7b, 0x7b, 0x76, 0x75, 0x77, 0x78, 0x77, + 0x76, 0x76, 0x79, 0x7d, 0x7e, 0x80, 0x82, 0x85, 0x87, 0x86, 0x84, + 0x81, 0x81, 0x84, 0x86, 0x82, 0x80, 0x83, 0x85, 0x85, 0x82, 0x82, + 0x85, 0x88, 0x88, 0x84, 0x81, 0x81, 0x7e, 0x7a, 0x77, 0x73, 0x72, + 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x70, 0x72, 0x73, 0x72, 0x74, 0x76, + 0x75, 0x73, 0x72, 0x73, 0x72, 0x72, 0x70, 0x6f, 0x70, 0x71, 0x6f, + 0x6e, 0x70, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x75, 0x78, 0x79, 0x80, + 0x8a, 0x94, 0xa3, 0xab, 0xa9, 0xa4, 0xa3, 0x9f, 0x98, 0x93, 0x8e, + 0x8d, 0x8e, 0x8d, 0x89, 0x89, 0x8a, 0x8a, 0x89, 0x87, 0x85, 0x82, + 0x82, 0x80, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7b, 0x79, 0x78, 0x78, + 0x78, 0x76, 0x76, 0x79, 0x7a, 0x7c, 0x7f, 0x82, 0x87, 0x8b, 0x8d, + 0x8d, 0x8d, 0x8e, 0x8e, 0x89, 0x85, 0x83, 0x81, 0x81, 0x80, 0x7c, + 0x7b, 0x7b, 0x7c, 0x7b, 0x7a, 0x78, 0x76, 0x75, 0x73, 0x70, 0x6e, + 0x6e, 0x6d, 0x6c, 0x6d, 0x6f, 0x71, 0x72, 0x73, 0x75, 0x76, 0x75, + 0x75, 0x78, 0x79, 0x77, 0x77, 0x77, 0x78, 0x78, 0x7a, 0x79, 0x77, + 0x79, 0x7a, 0x7b, 0x7b, 0x7c, 0x7d, 0x7e, 0x7e, 0x7a, 0x78, 0x78, + 0x7d, 0x85, 0x8c, 0x92, 0x95, 0x9b, 0xa4, 0xa4, 0xa0, 0x9f, 0xa0, + 0x9e, 0x9b, 0x97, 0x92, 0x90, 0x8f, 0x8c, 0x87, 0x85, 0x84, 0x82, + 0x81, 0x7f, 0x7e, 0x7f, 0x80, 0x7e, 0x7b, 0x7a, 0x79, 0x76, 0x75, + 0x74, 0x73, 0x73, 0x75, 0x77, 0x77, 0x79, 0x7c, 0x81, 0x84, 0x85, + 0x86, 0x89, 0x8b, 0x8c, 0x8b, 0x8a, 0x8b, 0x8b, 0x88, 0x83, 0x81, + 0x80, 0x7d, 0x7a, 0x77, 0x75, 0x76, 0x75, 0x73, 0x72, 0x72, 0x72, + 0x70, 0x6f, 0x6e, 0x6d, 0x6d, 0x6d, 0x6d, 0x6e, 0x70, 0x71, 0x72, + 0x75, 0x76, 0x77, 0x79, 0x79, 0x7a, 0x7b, 0x7c, 0x7c, 0x7d, 0x7f, + 0x7e, 0x7d, 0x7d, 0x7e, 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, 0x7e, 0x7e, + 0x7b, 0x7b, 0x7e, 0x7f, 0x7f, 0x80, 0x84, 0x89, 0x90, 0x94, 0x94, + 0x99, 0x9f, 0xa1, 0x9f, 0x9f, 0xa0, 0xa1, 0xa1, 0x9d, 0x99, 0x98, + 0x94, 0x90, 0x8c, 0x88, 0x84, 0x82, 0x7f, 0x7b, 0x7a, 0x7a, 0x79, + 0x76, 0x75, 0x73, 0x71, 0x71, 0x71, 0x70, 0x71, 0x74, 0x76, 0x77, + 0x79, 0x7c, 0x7f, 0x81, 0x83, 0x85, 0x87, 0x8a, 0x89, 0x89, 0x89, + 0x8a, 0x88, 0x85, 0x82, 0x81, 0x7e, 0x7c, 0x79, 0x76, 0x74, 0x73, + 0x70, 0x6e, 0x6d, 0x6c, 0x6c, 0x6b, 0x6b, 0x6b, 0x6c, 0x6e, 0x6e, + 0x6f, 0x70, 0x73, 0x73, 0x74, 0x76, 0x78, 0x7a, 0x7b, 0x7c, 0x7d, + 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x81, 0x7f, 0x81, 0x81, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7b, 0x7a, 0x7a, 0x79, 0x78, + 0x79, 0x7c, 0x81, 0x85, 0x88, 0x8b, 0x92, 0x97, 0x98, 0x9a, 0x9d, + 0xa0, 0xa1, 0xa0, 0x9f, 0x9e, 0x9d, 0x9b, 0x99, 0x94, 0x90, 0x8e, + 0x8a, 0x86, 0x83, 0x80, 0x7e, 0x7c, 0x7b, 0x78, 0x76, 0x75, 0x73, + 0x72, 0x70, 0x6f, 0x6f, 0x6f, 0x6f, 0x71, 0x72, 0x73, 0x76, 0x79, + 0x7b, 0x7d, 0x7f, 0x83, 0x85, 0x86, 0x86, 0x87, 0x87, 0x86, 0x84, + 0x83, 0x82, 0x81, 0x7f, 0x7d, 0x7b, 0x79, 0x78, 0x75, 0x74, 0x73, + 0x73, 0x71, 0x71, 0x72, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74, + 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, + 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7d, 0x7d, 0x7e, + 0x7e, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, 0x81, 0x86, 0x85, + 0x87, 0x8d, 0x91, 0x93, 0x94, 0x96, 0x9a, 0x9d, 0x9d, 0x9c, 0x9c, + 0x9c, 0x9b, 0x99, 0x96, 0x92, 0x90, 0x8e, 0x8a, 0x86, 0x84, 0x82, + 0x80, 0x7e, 0x7c, 0x7a, 0x79, 0x77, 0x75, 0x75, 0x75, 0x74, 0x73, + 0x73, 0x73, 0x74, 0x75, 0x75, 0x77, 0x79, 0x7b, 0x7d, 0x7e, 0x81, + 0x83, 0x83, 0x85, 0x86, 0x86, 0x86, 0x87, 0x86, 0x84, 0x83, 0x82, + 0x81, 0x7f, 0x7d, 0x7c, 0x7a, 0x79, 0x77, 0x76, 0x76, 0x76, 0x75, + 0x75, 0x75, 0x75, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x78, 0x78, + 0x7a, 0x7b, 0x7a, 0x7a, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x81, 0x83, 0x84, 0x84, 0x86, 0x88, 0x89, + 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8d, 0x8e, 0x8e, 0x8e, 0x8d, 0x8d, + 0x8c, 0x8b, 0x8a, 0x89, 0x87, 0x86, 0x85, 0x84, 0x82, 0x81, 0x7f, + 0x7e, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x79, 0x79, 0x78, 0x77, + 0x78, 0x78, 0x78, 0x77, 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, 0x7a, + 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, + 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, + 0x84, 0x85, 0x85, 0x86, 0x86, 0x87, 0x87, 0x88, 0x88, 0x89, 0x89, + 0x89, 0x88, 0x88, 0x87, 0x87, 0x87, 0x86, 0x85, 0x84, 0x83, 0x83, + 0x82, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, 0x7c, 0x7b, + 0x7b, 0x7a, 0x7a, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, + 0x79, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, + 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x81, + 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x82, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + }, + { // 8 + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x81, + 0x81, 0x89, 0x91, 0x84, 0x81, 0x88, 0x79, 0x6b, 0x71, 0x74, 0x77, + 0x81, 0x84, 0x87, 0x87, 0x7b, 0x6f, 0x6e, 0x6a, 0x64, 0x65, 0x63, + 0x62, 0x67, 0x73, 0x71, 0x69, 0x84, 0x88, 0x70, 0x76, 0x81, 0x71, + 0x63, 0x6f, 0x6b, 0x69, 0x80, 0x91, 0x95, 0xa0, 0xa8, 0xa3, 0xa1, + 0x9c, 0x90, 0x86, 0x82, 0x79, 0x78, 0x7f, 0x81, 0x89, 0x92, 0x9c, + 0xa4, 0xa5, 0x9e, 0x96, 0x8e, 0x83, 0x79, 0x72, 0x6d, 0x6a, 0x6f, + 0x6e, 0x71, 0x7b, 0x7a, 0x7e, 0x7e, 0x7b, 0x79, 0x6e, 0x67, 0x62, + 0x66, 0x5e, 0x56, 0x51, 0x4f, 0x95, 0xa8, 0x7f, 0x9b, 0xc6, 0xa6, + 0x81, 0x93, 0x89, 0x6f, 0x69, 0x68, 0x72, 0x71, 0x6e, 0x84, 0x92, + 0x8c, 0x97, 0xa1, 0x9c, 0x91, 0x8a, 0x88, 0x80, 0x73, 0x6d, 0x74, + 0x74, 0x72, 0x7c, 0x90, 0x9a, 0x95, 0x99, 0x9b, 0x8c, 0x7f, 0x7c, + 0x74, 0x6f, 0x6c, 0x73, 0x7e, 0x7c, 0x7d, 0x83, 0x7f, 0x7b, 0x77, + 0x73, 0x70, 0x66, 0x62, 0x5f, 0x5a, 0x51, 0x74, 0xa6, 0x91, 0x90, + 0xba, 0xb9, 0x94, 0x8f, 0x99, 0x7f, 0x65, 0x65, 0x6e, 0x6c, 0x65, + 0x74, 0x91, 0x90, 0x8e, 0xa0, 0xa5, 0x93, 0x8b, 0x8b, 0x7d, 0x72, + 0x6f, 0x6f, 0x73, 0x76, 0x81, 0x90, 0x93, 0x95, 0x9d, 0x96, 0x8d, + 0x8b, 0x82, 0x76, 0x73, 0x72, 0x6e, 0x71, 0x6f, 0x6c, 0x6e, 0x6a, + 0x6a, 0x6c, 0x6a, 0x67, 0x65, 0x64, 0x5f, 0x5b, 0x58, 0x71, 0x9a, + 0x8d, 0x90, 0xb7, 0xb1, 0x95, 0x95, 0x9a, 0x82, 0x6e, 0x6a, 0x6b, + 0x68, 0x64, 0x72, 0x86, 0x8f, 0x91, 0x9e, 0xa7, 0x9b, 0x94, 0x92, + 0x84, 0x77, 0x74, 0x6e, 0x6c, 0x74, 0x7c, 0x85, 0x8c, 0x93, 0x9a, + 0x99, 0x93, 0x8d, 0x87, 0x80, 0x7b, 0x77, 0x71, 0x6f, 0x6f, 0x6a, + 0x69, 0x66, 0x63, 0x67, 0x64, 0x61, 0x62, 0x5f, 0x60, 0x5e, 0x5a, + 0x59, 0x74, 0x9f, 0x92, 0x98, 0xc1, 0xaf, 0x8e, 0x95, 0x90, 0x73, + 0x6a, 0x69, 0x6b, 0x6c, 0x69, 0x77, 0x8b, 0x8e, 0x92, 0xa7, 0xa8, + 0x97, 0x97, 0x95, 0x83, 0x7a, 0x77, 0x71, 0x70, 0x76, 0x7d, 0x87, + 0x89, 0x8b, 0x94, 0x92, 0x8e, 0x8d, 0x88, 0x81, 0x80, 0x7c, 0x6f, + 0x71, 0x73, 0x68, 0x65, 0x68, 0x63, 0x65, 0x65, 0x5f, 0x5f, 0x62, + 0x60, 0x5e, 0x5b, 0x57, 0x56, 0x82, 0xa3, 0x86, 0xa0, 0xc7, 0xa6, + 0x8d, 0x9d, 0x92, 0x72, 0x6c, 0x6f, 0x6d, 0x65, 0x6a, 0x7c, 0x85, + 0x83, 0x95, 0xa6, 0x9f, 0x9c, 0x9c, 0x94, 0x84, 0x7b, 0x78, 0x6f, + 0x6f, 0x76, 0x7c, 0x83, 0x89, 0x90, 0x98, 0x94, 0x91, 0x93, 0x87, + 0x7e, 0x81, 0x7c, 0x71, 0x73, 0x73, 0x6b, 0x69, 0x68, 0x65, 0x61, + 0x5d, 0x5e, 0x60, 0x5d, 0x5a, 0x5e, 0x5d, 0x57, 0x50, 0x68, 0x9d, + 0x92, 0x8a, 0xbe, 0xbe, 0x95, 0x9c, 0xa4, 0x84, 0x71, 0x71, 0x71, + 0x66, 0x5d, 0x6e, 0x80, 0x7e, 0x88, 0xa4, 0xa5, 0x99, 0x9c, 0xa3, + 0x93, 0x81, 0x84, 0x7a, 0x6c, 0x6d, 0x70, 0x75, 0x79, 0x80, 0x8d, + 0x96, 0x94, 0x98, 0x9a, 0x90, 0x86, 0x7e, 0x7c, 0x78, 0x71, 0x6d, + 0x6f, 0x6c, 0x68, 0x67, 0x65, 0x63, 0x61, 0x63, 0x60, 0x5c, 0x5d, + 0x61, 0x66, 0x61, 0x61, 0x69, 0x8a, 0xa0, 0x8d, 0xa3, 0xba, 0x9f, + 0x8e, 0x98, 0x90, 0x74, 0x72, 0x77, 0x6e, 0x67, 0x74, 0x7e, 0x83, + 0x8b, 0x9a, 0xa1, 0x9d, 0x9d, 0x97, 0x8e, 0x84, 0x7a, 0x75, 0x6d, + 0x69, 0x6e, 0x72, 0x7a, 0x89, 0x8e, 0x8f, 0x9c, 0x9e, 0x95, 0x95, + 0x92, 0x85, 0x7a, 0x78, 0x74, 0x6c, 0x6a, 0x68, 0x61, 0x61, 0x68, + 0x67, 0x63, 0x68, 0x6b, 0x66, 0x60, 0x64, 0x68, 0x64, 0x5b, 0x5b, + 0x5b, 0x70, 0x8d, 0x81, 0x90, 0xaf, 0xa8, 0x9c, 0xa9, 0xab, 0x93, + 0x89, 0x88, 0x7f, 0x70, 0x6b, 0x6f, 0x70, 0x6e, 0x7b, 0x89, 0x8c, + 0x92, 0x9b, 0xa1, 0x9b, 0x97, 0x97, 0x8b, 0x7f, 0x7b, 0x76, 0x6c, + 0x6a, 0x6d, 0x70, 0x75, 0x7d, 0x87, 0x8d, 0x94, 0x9d, 0x9e, 0x98, + 0x8f, 0x89, 0x81, 0x75, 0x72, 0x72, 0x6c, 0x68, 0x69, 0x6c, 0x6d, + 0x6d, 0x72, 0x73, 0x6c, 0x68, 0x66, 0x65, 0x62, 0x60, 0x61, 0x5d, + 0x56, 0x57, 0x60, 0x70, 0x76, 0x86, 0x9d, 0x9f, 0xa5, 0xb2, 0xb2, + 0xa7, 0xa5, 0x9d, 0x8e, 0x82, 0x76, 0x70, 0x69, 0x66, 0x6a, 0x73, + 0x78, 0x80, 0x8e, 0x93, 0x99, 0xa0, 0xa2, 0xa0, 0x9a, 0x95, 0x8b, + 0x7e, 0x74, 0x6d, 0x65, 0x61, 0x61, 0x63, 0x6d, 0x76, 0x7f, 0x8c, + 0x96, 0xa0, 0xa4, 0xa7, 0xa6, 0x9f, 0x98, 0x8c, 0x82, 0x7a, 0x6f, + 0x6a, 0x65, 0x62, 0x60, 0x61, 0x63, 0x63, 0x68, 0x6b, 0x6c, 0x6e, + 0x6b, 0x6c, 0x68, 0x63, 0x65, 0x66, 0x68, 0x63, 0x5f, 0x5e, 0x5f, + 0x64, 0x71, 0x82, 0x85, 0x94, 0xa6, 0xa9, 0xab, 0xb2, 0xb4, 0xaa, + 0xa5, 0x9f, 0x91, 0x85, 0x7d, 0x75, 0x6c, 0x6b, 0x6b, 0x6c, 0x70, + 0x78, 0x81, 0x87, 0x8e, 0x93, 0x95, 0x96, 0x94, 0x91, 0x8b, 0x84, + 0x7e, 0x77, 0x71, 0x6f, 0x6d, 0x6e, 0x73, 0x79, 0x80, 0x86, 0x8f, + 0x97, 0x97, 0x9c, 0x9d, 0x98, 0x93, 0x8f, 0x89, 0x7e, 0x78, 0x73, + 0x6a, 0x63, 0x62, 0x5d, 0x5a, 0x5b, 0x5b, 0x5d, 0x5f, 0x5f, 0x62, + 0x64, 0x62, 0x5f, 0x60, 0x60, 0x60, 0x63, 0x64, 0x61, 0x60, 0x66, + 0x66, 0x6e, 0x80, 0x81, 0x8a, 0x9b, 0x9f, 0xa2, 0xab, 0xb4, 0xad, + 0xad, 0xae, 0xa2, 0x9a, 0x93, 0x89, 0x7d, 0x77, 0x73, 0x6d, 0x6b, + 0x6d, 0x72, 0x73, 0x7a, 0x80, 0x84, 0x8b, 0x8e, 0x92, 0x92, 0x91, + 0x8f, 0x8c, 0x86, 0x81, 0x7f, 0x7a, 0x79, 0x7b, 0x77, 0x7b, 0x80, + 0x7f, 0x84, 0x89, 0x88, 0x89, 0x8c, 0x89, 0x87, 0x86, 0x82, 0x7d, + 0x79, 0x75, 0x70, 0x6a, 0x67, 0x61, 0x5d, 0x5b, 0x57, 0x56, 0x57, + 0x5a, 0x63, 0x68, 0x67, 0x66, 0x60, 0x5c, 0x5a, 0x56, 0x56, 0x55, + 0x51, 0x54, 0x57, 0x5a, 0x65, 0x75, 0x79, 0x84, 0x9a, 0x9c, 0xa1, + 0xb2, 0xb5, 0xb3, 0xb8, 0xba, 0xb0, 0xa9, 0xa7, 0x99, 0x8e, 0x88, + 0x7e, 0x75, 0x70, 0x6f, 0x69, 0x69, 0x6d, 0x6d, 0x71, 0x76, 0x7b, + 0x7f, 0x83, 0x88, 0x89, 0x8b, 0x8c, 0x8d, 0x8b, 0x8b, 0x8b, 0x86, + 0x89, 0x88, 0x82, 0x85, 0x85, 0x81, 0x82, 0x82, 0x7f, 0x7e, 0x7e, + 0x7b, 0x78, 0x77, 0x73, 0x71, 0x6e, 0x6b, 0x6a, 0x69, 0x6a, 0x6d, + 0x6f, 0x6f, 0x73, 0x74, 0x74, 0x76, 0x75, 0x73, 0x71, 0x6e, 0x6c, + 0x69, 0x67, 0x65, 0x63, 0x5f, 0x5e, 0x5e, 0x5b, 0x59, 0x5b, 0x65, + 0x65, 0x66, 0x7a, 0x7f, 0x7e, 0x90, 0x99, 0x98, 0xa3, 0xad, 0xab, + 0xac, 0xb2, 0xac, 0xa7, 0xa5, 0x9e, 0x95, 0x8e, 0x89, 0x80, 0x7a, + 0x78, 0x72, 0x6f, 0x70, 0x70, 0x70, 0x73, 0x77, 0x79, 0x7b, 0x7f, + 0x82, 0x83, 0x85, 0x87, 0x88, 0x8a, 0x8b, 0x8a, 0x8c, 0x8b, 0x89, + 0x8a, 0x89, 0x86, 0x85, 0x84, 0x80, 0x7e, 0x7d, 0x79, 0x77, 0x75, + 0x73, 0x72, 0x71, 0x72, 0x71, 0x71, 0x76, 0x78, 0x7a, 0x7f, 0x82, + 0x83, 0x86, 0x88, 0x87, 0x86, 0x86, 0x83, 0x81, 0x80, 0x7d, 0x7a, + 0x79, 0x76, 0x74, 0x72, 0x71, 0x6f, 0x6d, 0x6d, 0x6b, 0x68, 0x6a, + 0x68, 0x66, 0x67, 0x66, 0x64, 0x68, 0x71, 0x6c, 0x71, 0x7f, 0x7a, + 0x80, 0x8d, 0x8a, 0x90, 0x97, 0x99, 0x9b, 0x9d, 0x9f, 0x9c, 0x9b, + 0x9a, 0x98, 0x92, 0x8e, 0x8d, 0x86, 0x83, 0x83, 0x7c, 0x7c, 0x7c, + 0x78, 0x78, 0x7a, 0x7a, 0x79, 0x7b, 0x7c, 0x7c, 0x7c, 0x7e, 0x7f, + 0x7e, 0x80, 0x81, 0x81, 0x83, 0x84, 0x84, 0x85, 0x84, 0x86, 0x84, + 0x84, 0x85, 0x82, 0x82, 0x81, 0x7e, 0x7e, 0x7c, 0x7b, 0x79, 0x76, + 0x77, 0x76, 0x74, 0x76, 0x74, 0x73, 0x75, 0x74, 0x74, 0x76, 0x76, + 0x77, 0x78, 0x7a, 0x7c, 0x7d, 0x7e, 0x80, 0x81, 0x82, 0x83, 0x84, + 0x84, 0x85, 0x86, 0x85, 0x85, 0x85, 0x85, 0x84, 0x83, 0x82, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x81, + 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x81, 0x7c, 0x8b, + 0x86, 0x7a, 0x85, 0x7f, 0x88, 0x7c, 0x77, 0x87, 0x83, 0x89, 0x8a, + 0x84, 0x82, 0x79, 0x81, 0x8b, 0x86, 0x82, 0x7e, 0x7e, 0x7c, 0x75, + 0x79, 0x7c, 0x7e, 0x7b, 0x78, 0x7e, 0x7d, 0x80, 0x7e, 0x7d, 0x7f, + 0x7e, 0x7d, 0x7d, 0x82, 0x81, 0x80, 0x7c, 0x81, 0x81, 0x7e, 0x7c, + 0x80, 0x85, 0x7f, 0x80, 0x82, 0x85, 0x81, 0x7d, 0x83, 0x83, 0x83, + 0x7e, 0x7f, 0x82, 0x81, 0x7e, 0x7d, 0x82, 0x80, 0x7d, 0x7d, 0x81, + 0x81, 0x7f, 0x7d, 0x81, 0x84, 0x7f, 0x7f, 0x83, 0x82, 0x80, 0x7f, + 0x7f, 0x81, 0x7f, 0x7d, 0x82, 0x82, 0x7b, 0x7d, 0x80, 0x7d, 0x7d, + 0x7f, 0x82, 0x81, 0x80, 0x7e, 0x80, 0x7f, 0x7c, 0x7e, 0x80, 0x82, + 0x82, 0x81, 0x81, 0x80, 0x7f, 0x7d, 0x7e, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, + 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x81, + 0x80, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x80, 0x81, + 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x7f, + }, + { // 9 + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7e, 0x7c, 0x7a, + 0x79, 0x7a, 0x7b, 0x7e, 0x80, 0x83, 0x86, 0x8a, 0x8e, 0x91, 0x95, + 0x98, 0x9a, 0x9c, 0x9e, 0x9f, 0x9f, 0x9e, 0x9c, 0x9b, 0x99, 0x96, + 0x93, 0x91, 0x8e, 0x8a, 0x88, 0x86, 0x83, 0x82, 0x80, 0x7f, 0x7e, + 0x7e, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x81, 0x81, 0x81, 0x82, + 0x81, 0x81, 0x80, 0x7f, 0x7d, 0x7b, 0x79, 0x76, 0x74, 0x71, 0x6e, + 0x6b, 0x69, 0x67, 0x65, 0x64, 0x63, 0x62, 0x62, 0x62, 0x62, 0x62, + 0x64, 0x64, 0x64, 0x66, 0x67, 0x67, 0x68, 0x6a, 0x6e, 0x71, 0x75, + 0x7a, 0x7f, 0x84, 0x8a, 0x8f, 0x94, 0x99, 0x9e, 0xa1, 0xa4, 0xa6, + 0xa6, 0xa7, 0xa7, 0xa6, 0xa4, 0xa2, 0x9e, 0x99, 0x96, 0x91, 0x8d, + 0x89, 0x85, 0x81, 0x7e, 0x7d, 0x7b, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x79, 0x7a, 0x7b, 0x7e, 0x80, 0x82, 0x85, 0x86, 0x87, 0x89, 0x88, + 0x87, 0x86, 0x84, 0x80, 0x7d, 0x7a, 0x76, 0x73, 0x6f, 0x6b, 0x69, + 0x66, 0x62, 0x5f, 0x5d, 0x5b, 0x59, 0x58, 0x58, 0x58, 0x59, 0x5b, + 0x5d, 0x5e, 0x5f, 0x62, 0x64, 0x66, 0x6b, 0x73, 0x79, 0x80, 0x8c, + 0x95, 0x97, 0x9e, 0xa8, 0xab, 0xab, 0xaf, 0xaf, 0xac, 0xad, 0xac, + 0xa6, 0xa4, 0xa3, 0x9c, 0x97, 0x95, 0x90, 0x88, 0x86, 0x83, 0x7d, + 0x7b, 0x7a, 0x77, 0x75, 0x76, 0x75, 0x74, 0x77, 0x77, 0x78, 0x7b, + 0x7d, 0x7d, 0x80, 0x83, 0x84, 0x85, 0x88, 0x88, 0x87, 0x88, 0x87, + 0x85, 0x84, 0x81, 0x7d, 0x7a, 0x76, 0x72, 0x6f, 0x6b, 0x66, 0x63, + 0x61, 0x5e, 0x5c, 0x5c, 0x5b, 0x5b, 0x5c, 0x5e, 0x5e, 0x61, 0x63, + 0x65, 0x67, 0x6c, 0x75, 0x79, 0x7d, 0x87, 0x8f, 0x93, 0x9a, 0xa4, + 0xa8, 0xad, 0xb2, 0xb3, 0xb3, 0xb4, 0xb3, 0xaf, 0xac, 0xa9, 0xa3, + 0x9d, 0x98, 0x91, 0x8b, 0x87, 0x83, 0x7d, 0x78, 0x75, 0x71, 0x70, + 0x6f, 0x6d, 0x6d, 0x70, 0x74, 0x76, 0x79, 0x7c, 0x7d, 0x80, 0x83, + 0x85, 0x85, 0x87, 0x8c, 0x8f, 0x91, 0x8c, 0x84, 0x7d, 0x77, 0x74, + 0x6b, 0x63, 0x60, 0x5b, 0x55, 0x4f, 0x4d, 0x4c, 0x4d, 0x4b, 0x4b, + 0x4b, 0x49, 0x48, 0x47, 0x53, 0x73, 0x8f, 0x97, 0x99, 0x9f, 0xa8, + 0xaa, 0xa1, 0x93, 0x8e, 0x95, 0x9c, 0x99, 0x8f, 0x8b, 0x93, 0x9c, + 0x98, 0x8b, 0x86, 0x8a, 0x8d, 0x8a, 0x84, 0x82, 0x86, 0x88, 0x85, + 0x7d, 0x78, 0x7d, 0x82, 0x80, 0x7c, 0x82, 0x8b, 0x8a, 0x88, 0x88, + 0x88, 0x8a, 0x8a, 0x86, 0x86, 0x88, 0x86, 0x82, 0x7a, 0x75, 0x72, + 0x6b, 0x63, 0x61, 0x5f, 0x5f, 0x5f, 0x5c, 0x58, 0x55, 0x50, 0x52, + 0x55, 0x4f, 0x51, 0x55, 0x4f, 0x44, 0x5c, 0x9c, 0xbb, 0xb0, 0x99, + 0x8d, 0x96, 0x9a, 0x88, 0x73, 0x7c, 0x95, 0x9e, 0x97, 0x90, 0x8f, + 0x98, 0x9e, 0x95, 0x89, 0x85, 0x87, 0x87, 0x84, 0x81, 0x83, 0x86, + 0x87, 0x84, 0x7f, 0x7d, 0x7f, 0x80, 0x7f, 0x81, 0x85, 0x86, 0x87, + 0x89, 0x8b, 0x8c, 0x8c, 0x88, 0x85, 0x83, 0x84, 0x82, 0x7c, 0x76, + 0x75, 0x73, 0x6d, 0x65, 0x63, 0x65, 0x63, 0x5d, 0x5b, 0x5a, 0x57, + 0x57, 0x56, 0x53, 0x54, 0x4f, 0x4d, 0x48, 0x57, 0x98, 0xc3, 0xb7, + 0x94, 0x81, 0x85, 0x8c, 0x81, 0x6c, 0x74, 0x95, 0xa4, 0x9e, 0x90, + 0x86, 0x8c, 0x94, 0x8a, 0x7d, 0x7b, 0x80, 0x89, 0x8d, 0x88, 0x83, + 0x84, 0x89, 0x87, 0x80, 0x79, 0x79, 0x80, 0x83, 0x81, 0x84, 0x85, + 0x86, 0x89, 0x8b, 0x89, 0x85, 0x83, 0x82, 0x80, 0x7d, 0x7c, 0x7c, + 0x7a, 0x78, 0x75, 0x71, 0x6f, 0x6e, 0x6c, 0x67, 0x63, 0x61, 0x5f, + 0x5e, 0x5e, 0x5c, 0x5a, 0x5c, 0x5d, 0x6a, 0x88, 0xa7, 0xb4, 0xa5, + 0x8c, 0x77, 0x70, 0x75, 0x7e, 0x88, 0x91, 0x95, 0x94, 0x8e, 0x8c, + 0x8a, 0x84, 0x81, 0x84, 0x88, 0x89, 0x86, 0x86, 0x88, 0x8a, 0x8b, + 0x86, 0x80, 0x7d, 0x7d, 0x80, 0x83, 0x80, 0x80, 0x84, 0x82, 0x7f, + 0x82, 0x87, 0x8a, 0x89, 0x84, 0x7e, 0x7a, 0x78, 0x79, 0x7b, 0x7c, + 0x77, 0x73, 0x74, 0x72, 0x6e, 0x68, 0x64, 0x66, 0x67, 0x66, 0x65, + 0x65, 0x62, 0x5d, 0x60, 0x7d, 0xab, 0xbe, 0xaa, 0x86, 0x68, 0x5f, + 0x6f, 0x86, 0x90, 0x8d, 0x89, 0x8c, 0x95, 0x98, 0x8f, 0x82, 0x7c, + 0x7e, 0x84, 0x86, 0x86, 0x87, 0x87, 0x85, 0x84, 0x84, 0x84, 0x82, + 0x82, 0x84, 0x83, 0x82, 0x85, 0x84, 0x83, 0x86, 0x86, 0x85, 0x86, + 0x86, 0x7f, 0x79, 0x76, 0x77, 0x7e, 0x81, 0x7a, 0x6e, 0x66, 0x69, + 0x72, 0x74, 0x6c, 0x63, 0x61, 0x60, 0x5e, 0x5f, 0x5c, 0x5f, 0x7e, + 0xaa, 0xbe, 0xae, 0x8a, 0x66, 0x5a, 0x6a, 0x81, 0x8f, 0x93, 0x8d, + 0x87, 0x89, 0x8e, 0x90, 0x8c, 0x84, 0x7c, 0x7e, 0x86, 0x89, 0x88, + 0x86, 0x85, 0x87, 0x88, 0x85, 0x80, 0x7f, 0x80, 0x83, 0x86, 0x85, + 0x85, 0x87, 0x88, 0x87, 0x85, 0x84, 0x82, 0x7e, 0x79, 0x78, 0x7a, + 0x7a, 0x78, 0x75, 0x73, 0x6f, 0x6d, 0x6b, 0x68, 0x66, 0x64, 0x62, + 0x5f, 0x5a, 0x58, 0x65, 0x88, 0xaf, 0xbe, 0xaa, 0x81, 0x5e, 0x56, + 0x6a, 0x88, 0x99, 0x95, 0x88, 0x81, 0x85, 0x8e, 0x92, 0x8c, 0x82, + 0x7e, 0x80, 0x82, 0x82, 0x82, 0x84, 0x87, 0x8a, 0x8b, 0x8a, 0x8a, + 0x87, 0x81, 0x7b, 0x79, 0x7c, 0x82, 0x8a, 0x8e, 0x8e, 0x8b, 0x85, + 0x7d, 0x77, 0x75, 0x77, 0x7b, 0x7c, 0x78, 0x73, 0x6f, 0x6c, 0x6c, + 0x6e, 0x6c, 0x67, 0x66, 0x62, 0x5a, 0x54, 0x59, 0x77, 0xa8, 0xc4, + 0xb8, 0x94, 0x68, 0x50, 0x59, 0x79, 0x97, 0xa0, 0x92, 0x80, 0x7a, + 0x84, 0x93, 0x96, 0x8c, 0x7f, 0x7b, 0x7c, 0x80, 0x83, 0x85, 0x87, + 0x8a, 0x8c, 0x8c, 0x8b, 0x88, 0x81, 0x7a, 0x78, 0x7b, 0x80, 0x89, + 0x8f, 0x8f, 0x8a, 0x85, 0x81, 0x7e, 0x79, 0x78, 0x79, 0x78, 0x76, + 0x75, 0x73, 0x71, 0x6e, 0x68, 0x65, 0x64, 0x61, 0x61, 0x5e, 0x56, + 0x50, 0x5c, 0x89, 0xb9, 0xc7, 0xb1, 0x81, 0x57, 0x4f, 0x68, 0x8c, + 0xa2, 0x9a, 0x83, 0x79, 0x7e, 0x8b, 0x94, 0x93, 0x89, 0x81, 0x7d, + 0x7d, 0x80, 0x82, 0x82, 0x85, 0x89, 0x8c, 0x8d, 0x8c, 0x86, 0x7f, + 0x7c, 0x7c, 0x7d, 0x7f, 0x86, 0x8b, 0x8d, 0x8c, 0x86, 0x7f, 0x7a, + 0x78, 0x78, 0x7b, 0x7c, 0x79, 0x74, 0x71, 0x6f, 0x6d, 0x6b, 0x68, + 0x66, 0x64, 0x64, 0x64, 0x5d, 0x54, 0x53, 0x68, 0x9a, 0xc0, 0xc0, + 0xa0, 0x6e, 0x4f, 0x56, 0x76, 0x98, 0xa6, 0x96, 0x7f, 0x79, 0x80, + 0x8c, 0x93, 0x8f, 0x87, 0x82, 0x7e, 0x7d, 0x80, 0x82, 0x84, 0x87, + 0x88, 0x89, 0x89, 0x87, 0x81, 0x7b, 0x7b, 0x7f, 0x86, 0x8b, 0x8c, + 0x89, 0x84, 0x80, 0x7d, 0x7b, 0x7a, 0x7c, 0x7d, 0x7c, 0x78, 0x74, + 0x71, 0x6f, 0x70, 0x70, 0x6e, 0x6a, 0x68, 0x6b, 0x6e, 0x6a, 0x64, + 0x5e, 0x57, 0x5b, 0x78, 0xa2, 0xb9, 0xb0, 0x8f, 0x69, 0x5a, 0x64, + 0x7e, 0x96, 0x9d, 0x90, 0x7f, 0x7e, 0x88, 0x90, 0x90, 0x8a, 0x84, + 0x81, 0x82, 0x84, 0x83, 0x81, 0x83, 0x87, 0x8a, 0x89, 0x85, 0x7f, + 0x7b, 0x7c, 0x7d, 0x81, 0x88, 0x8b, 0x8c, 0x8c, 0x87, 0x83, 0x81, + 0x7f, 0x7c, 0x79, 0x77, 0x7a, 0x7e, 0x7b, 0x76, 0x75, 0x75, 0x73, + 0x70, 0x6a, 0x62, 0x62, 0x67, 0x6b, 0x69, 0x61, 0x5d, 0x5e, 0x60, + 0x66, 0x6f, 0x82, 0xa1, 0xae, 0xa2, 0x87, 0x6b, 0x63, 0x72, 0x8a, + 0x9a, 0x9b, 0x8e, 0x85, 0x85, 0x89, 0x8b, 0x88, 0x81, 0x7e, 0x7e, + 0x83, 0x88, 0x87, 0x84, 0x84, 0x86, 0x88, 0x86, 0x80, 0x7a, 0x76, + 0x75, 0x79, 0x81, 0x8b, 0x92, 0x95, 0x91, 0x89, 0x82, 0x7f, 0x80, + 0x84, 0x86, 0x83, 0x7f, 0x7c, 0x79, 0x77, 0x78, 0x78, 0x75, 0x72, + 0x6e, 0x6b, 0x69, 0x6a, 0x69, 0x66, 0x65, 0x64, 0x67, 0x69, 0x66, + 0x63, 0x5f, 0x5d, 0x5c, 0x5e, 0x83, 0xaf, 0xb7, 0xa9, 0x89, 0x67, + 0x62, 0x75, 0x8d, 0xa1, 0x9d, 0x8a, 0x82, 0x84, 0x87, 0x8d, 0x8c, + 0x88, 0x88, 0x86, 0x82, 0x81, 0x7f, 0x80, 0x83, 0x82, 0x80, 0x81, + 0x80, 0x81, 0x81, 0x80, 0x7c, 0x79, 0x7c, 0x85, 0x8d, 0x90, 0x8e, + 0x89, 0x82, 0x7e, 0x7f, 0x82, 0x85, 0x87, 0x85, 0x80, 0x80, 0x7f, + 0x7b, 0x76, 0x74, 0x76, 0x78, 0x78, 0x73, 0x6d, 0x69, 0x68, 0x6a, + 0x6c, 0x6d, 0x69, 0x64, 0x65, 0x67, 0x6d, 0x69, 0x65, 0x61, 0x5d, + 0x5e, 0x63, 0x92, 0xbf, 0xbf, 0xaf, 0x89, 0x63, 0x5d, 0x74, 0x90, + 0xa5, 0x9f, 0x8b, 0x83, 0x83, 0x8b, 0x92, 0x8e, 0x84, 0x80, 0x7e, + 0x84, 0x8b, 0x86, 0x7f, 0x7e, 0x81, 0x85, 0x89, 0x83, 0x7a, 0x74, + 0x6f, 0x71, 0x77, 0x7c, 0x82, 0x88, 0x88, 0x87, 0x87, 0x88, 0x8b, + 0x8b, 0x86, 0x81, 0x7e, 0x7f, 0x83, 0x87, 0x88, 0x84, 0x7c, 0x79, + 0x79, 0x7a, 0x7b, 0x79, 0x76, 0x74, 0x72, 0x71, 0x70, 0x70, 0x6e, + 0x6d, 0x6e, 0x6f, 0x6e, 0x6b, 0x67, 0x66, 0x6a, 0x6e, 0x6f, 0x6d, + 0x69, 0x63, 0x5f, 0x64, 0x66, 0x7a, 0xa9, 0xbe, 0xb6, 0x9e, 0x78, + 0x64, 0x71, 0x88, 0x9a, 0x9f, 0x8e, 0x84, 0x89, 0x8c, 0x8f, 0x8c, + 0x82, 0x80, 0x82, 0x83, 0x82, 0x81, 0x7a, 0x7c, 0x85, 0x89, 0x8d, + 0x8a, 0x7e, 0x78, 0x76, 0x76, 0x79, 0x7a, 0x7d, 0x7f, 0x7f, 0x7f, + 0x81, 0x86, 0x87, 0x85, 0x82, 0x7f, 0x7e, 0x82, 0x88, 0x87, 0x85, + 0x86, 0x88, 0x86, 0x83, 0x7f, 0x7d, 0x81, 0x80, 0x7d, 0x7c, 0x7b, + 0x7b, 0x7b, 0x7a, 0x78, 0x75, 0x73, 0x71, 0x71, 0x75, 0x78, 0x77, + 0x75, 0x72, 0x71, 0x72, 0x72, 0x70, 0x6d, 0x6b, 0x6b, 0x6c, 0x6f, + 0x70, 0x6f, 0x6d, 0x69, 0x69, 0x68, 0x6b, 0x6a, 0x76, 0xa7, 0xbc, + 0xad, 0x93, 0x77, 0x70, 0x7e, 0x8c, 0x91, 0x91, 0x8a, 0x89, 0x90, + 0x90, 0x88, 0x83, 0x81, 0x85, 0x8c, 0x89, 0x7f, 0x78, 0x79, 0x82, + 0x8a, 0x88, 0x84, 0x83, 0x82, 0x81, 0x7d, 0x76, 0x70, 0x70, 0x76, + 0x7d, 0x84, 0x86, 0x88, 0x88, 0x85, 0x7e, 0x78, 0x79, 0x80, 0x87, + 0x88, 0x86, 0x84, 0x86, 0x87, 0x87, 0x85, 0x83, 0x80, 0x80, 0x83, + 0x80, 0x7d, 0x7d, 0x7e, 0x7c, 0x78, 0x76, 0x78, 0x79, 0x78, 0x76, + 0x75, 0x74, 0x74, 0x75, 0x74, 0x72, 0x74, 0x74, 0x71, 0x71, 0x72, + 0x72, 0x72, 0x72, 0x6e, 0x70, 0x73, 0x72, 0x70, 0x6e, 0x6e, 0x73, + 0x72, 0x6d, 0x6e, 0x81, 0xaa, 0xb5, 0x9e, 0x8b, 0x86, 0x8b, 0x90, + 0x85, 0x7c, 0x87, 0x92, 0x98, 0x94, 0x86, 0x82, 0x8a, 0x8a, 0x83, + 0x7e, 0x7b, 0x7f, 0x84, 0x84, 0x81, 0x81, 0x84, 0x86, 0x81, 0x7b, + 0x7e, 0x80, 0x7e, 0x7a, 0x77, 0x78, 0x7a, 0x7e, 0x81, 0x83, 0x86, + 0x87, 0x86, 0x82, 0x85, 0x88, 0x88, 0x88, 0x86, 0x83, 0x83, 0x82, + 0x82, 0x84, 0x81, 0x80, 0x81, 0x7b, 0x78, 0x78, 0x77, 0x78, 0x79, + 0x77, 0x76, 0x77, 0x73, 0x72, 0x72, 0x71, 0x75, 0x77, 0x73, 0x72, + 0x73, 0x74, 0x73, 0x71, 0x73, 0x73, 0x71, 0x74, 0x77, 0x75, 0x75, + 0x75, 0x74, 0x75, 0x76, 0x74, 0x75, 0x77, 0x77, 0x77, 0x77, 0x7b, + 0x8f, 0xa1, 0x9f, 0x98, 0x97, 0x96, 0x93, 0x8b, 0x84, 0x88, 0x91, + 0x92, 0x8c, 0x8a, 0x8a, 0x8d, 0x8b, 0x84, 0x82, 0x84, 0x82, 0x7d, + 0x7d, 0x7f, 0x82, 0x85, 0x81, 0x7f, 0x80, 0x81, 0x80, 0x7e, 0x7b, + 0x7b, 0x7a, 0x74, 0x74, 0x7a, 0x80, 0x81, 0x81, 0x87, 0x89, 0x8a, + 0x87, 0x86, 0x86, 0x85, 0x82, 0x7e, 0x80, 0x81, 0x7f, 0x82, 0x84, + 0x81, 0x7d, 0x7b, 0x79, 0x79, 0x7a, 0x79, 0x78, 0x78, 0x79, 0x79, + 0x77, 0x75, 0x75, 0x75, 0x74, 0x72, 0x72, 0x75, 0x74, 0x70, 0x70, + 0x74, 0x75, 0x73, 0x72, 0x73, 0x74, 0x74, 0x75, 0x73, 0x73, 0x74, + 0x74, 0x73, 0x74, 0x75, 0x76, 0x74, 0x6f, 0x74, 0x75, 0x7d, 0x8b, + 0x84, 0x82, 0x8c, 0x94, 0x96, 0x8d, 0x91, 0x9a, 0x98, 0x90, 0x8d, + 0x90, 0x91, 0x8e, 0x89, 0x8b, 0x8e, 0x89, 0x86, 0x88, 0x88, 0x85, + 0x81, 0x81, 0x84, 0x83, 0x7f, 0x7d, 0x81, 0x84, 0x7f, 0x7c, 0x80, + 0x81, 0x7c, 0x79, 0x7b, 0x7a, 0x78, 0x7a, 0x7c, 0x7c, 0x7d, 0x81, + 0x85, 0x83, 0x84, 0x87, 0x85, 0x83, 0x84, 0x86, 0x87, 0x84, 0x84, + 0x89, 0x85, 0x7f, 0x81, 0x81, 0x7f, 0x7c, 0x7b, 0x7e, 0x7f, 0x79, + 0x78, 0x7c, 0x7b, 0x77, 0x76, 0x78, 0x76, 0x72, 0x73, 0x73, 0x71, + 0x71, 0x72, 0x72, 0x71, 0x74, 0x72, 0x6f, 0x73, 0x75, 0x72, 0x74, + 0x76, 0x74, 0x73, 0x73, 0x73, 0x72, 0x74, 0x76, 0x74, 0x73, 0x71, + 0x70, 0x70, 0x6f, 0x72, 0x82, 0x84, 0x7b, 0x80, 0x85, 0x80, 0x8e, + 0x99, 0x8e, 0x96, 0xa5, 0x9d, 0x96, 0x96, 0x96, 0x96, 0x94, 0x90, + 0x91, 0x91, 0x8a, 0x86, 0x89, 0x88, 0x81, 0x7e, 0x80, 0x82, 0x82, + 0x7f, 0x82, 0x87, 0x84, 0x7e, 0x7f, 0x7f, 0x7c, 0x7a, 0x78, 0x79, + 0x7a, 0x78, 0x77, 0x7a, 0x7c, 0x7b, 0x7d, 0x82, 0x85, 0x84, 0x86, + 0x89, 0x8a, 0x88, 0x87, 0x87, 0x86, 0x84, 0x81, 0x80, 0x80, 0x7f, + 0x7e, 0x7e, 0x7d, 0x7b, 0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x75, + 0x73, 0x72, 0x73, 0x73, 0x71, 0x70, 0x72, 0x73, 0x73, 0x73, 0x73, + 0x75, 0x74, 0x74, 0x76, 0x74, 0x74, 0x74, 0x75, 0x76, 0x76, 0x78, + 0x78, 0x77, 0x79, 0x79, 0x78, 0x78, 0x79, 0x78, 0x78, 0x77, 0x77, + 0x75, 0x7a, 0x81, 0x7f, 0x7d, 0x81, 0x84, 0x80, 0x7e, 0x7d, 0x83, + 0x8b, 0x89, 0x8a, 0x91, 0x95, 0x94, 0x97, 0x99, 0x9b, 0x9e, 0x9e, + 0x9c, 0x9b, 0x9b, 0x98, 0x94, 0x92, 0x8f, 0x8b, 0x88, 0x84, 0x81, + 0x80, 0x7f, 0x7e, 0x7c, 0x7c, 0x7c, 0x7c, 0x7a, 0x78, 0x79, 0x7a, + 0x79, 0x78, 0x79, 0x7b, 0x7c, 0x7b, 0x7c, 0x7d, 0x7e, 0x80, 0x82, + 0x83, 0x84, 0x85, 0x86, 0x86, 0x86, 0x86, 0x84, 0x84, 0x83, 0x80, + 0x7f, 0x7e, 0x7d, 0x7b, 0x7a, 0x79, 0x78, 0x77, 0x76, 0x75, 0x75, + 0x74, 0x73, 0x73, 0x73, 0x72, 0x72, 0x72, 0x72, 0x72, 0x73, 0x72, + 0x71, 0x73, 0x74, 0x72, 0x72, 0x73, 0x75, 0x76, 0x76, 0x77, 0x79, + 0x7a, 0x7a, 0x7a, 0x7d, 0x7c, 0x7b, 0x7d, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7d, 0x7b, 0x7a, + 0x79, 0x79, 0x7f, 0x82, 0x80, 0x84, 0x8d, 0x8e, 0x8d, 0x92, 0x96, + 0x99, 0x9c, 0x9e, 0x9c, 0x9c, 0x9f, 0x9e, 0x9b, 0x98, 0x95, 0x95, + 0x91, 0x8c, 0x89, 0x8a, 0x89, 0x84, 0x81, 0x81, 0x7f, 0x7d, 0x7c, + 0x7a, 0x7a, 0x7a, 0x78, 0x77, 0x78, 0x77, 0x77, 0x79, 0x79, 0x79, + 0x7b, 0x7d, 0x7d, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x7f, + 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7d, 0x7c, 0x7c, 0x7b, + 0x7a, 0x7a, 0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x74, 0x73, 0x73, + 0x72, 0x71, 0x72, 0x72, 0x70, 0x71, 0x72, 0x73, 0x72, 0x73, 0x74, + 0x74, 0x75, 0x75, 0x76, 0x77, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7f, + 0x80, 0x7f, 0x81, 0x82, 0x82, 0x81, 0x82, 0x81, 0x80, 0x81, 0x81, + 0x81, 0x82, 0x81, 0x80, 0x80, 0x7f, 0x7d, 0x7e, 0x80, 0x81, 0x82, + 0x84, 0x86, 0x89, 0x8b, 0x8b, 0x8d, 0x90, 0x91, 0x93, 0x93, 0x93, + 0x94, 0x94, 0x92, 0x90, 0x8f, 0x8e, 0x8d, 0x8c, 0x8a, 0x89, 0x89, + 0x88, 0x86, 0x85, 0x85, 0x84, 0x83, 0x82, 0x81, 0x81, 0x80, 0x7f, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x7b, 0x7b, + 0x7a, 0x7a, 0x79, 0x78, 0x77, 0x77, 0x75, 0x75, 0x74, 0x73, 0x73, + 0x73, 0x73, 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x7a, 0x7b, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x83, 0x85, + 0x86, 0x87, 0x87, 0x89, 0x8a, 0x8b, 0x8b, 0x8d, 0x8d, 0x8d, 0x8e, + 0x8d, 0x8d, 0x8c, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, + 0x85, 0x83, 0x82, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7d, 0x7d, 0x7e, 0x7d, + 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, 0x7b, 0x7a, 0x7a, + 0x79, 0x78, 0x78, 0x78, 0x77, 0x77, 0x76, 0x76, 0x76, 0x76, 0x76, + 0x76, 0x77, 0x77, 0x78, 0x78, 0x79, 0x7a, 0x7b, 0x7b, 0x7c, 0x7d, + 0x7d, 0x7d, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + }, + }, + "ru": { + { // 0 + 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7d, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, + 0x7e, 0x7d, 0x7f, 0x7e, 0x7f, 0x7e, 0x80, 0x80, 0x80, 0x81, 0x80, + 0x82, 0x81, 0x82, 0x82, 0x83, 0x82, 0x83, 0x83, 0x82, 0x83, 0x81, + 0x82, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7e, 0x7c, + 0x7d, 0x7d, 0x7e, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x7f, 0x7e, 0x7e, 0x7d, + 0x7c, 0x7b, 0x7b, 0x7a, 0x7a, 0x79, 0x7b, 0x7b, 0x7d, 0x7e, 0x7f, + 0x81, 0x82, 0x84, 0x85, 0x85, 0x87, 0x87, 0x86, 0x87, 0x86, 0x84, + 0x84, 0x83, 0x81, 0x81, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, + 0x7d, 0x7d, 0x7c, 0x7d, 0x7d, 0x7e, 0x7d, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7d, 0x7d, 0x7b, 0x7b, 0x7a, 0x78, 0x79, 0x79, 0x79, + 0x7a, 0x7b, 0x7d, 0x7f, 0x81, 0x84, 0x85, 0x86, 0x87, 0x87, 0x89, + 0x89, 0x88, 0x88, 0x85, 0x85, 0x83, 0x82, 0x81, 0x80, 0x7f, 0x7e, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x7d, 0x7d, 0x7e, 0x7d, + 0x7f, 0x7e, 0x7f, 0x7e, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7c, 0x7c, 0x7b, + 0x7a, 0x79, 0x78, 0x79, 0x79, 0x79, 0x7b, 0x7b, 0x7e, 0x7f, 0x83, + 0x84, 0x86, 0x86, 0x88, 0x88, 0x89, 0x89, 0x88, 0x87, 0x86, 0x84, + 0x82, 0x82, 0x80, 0x7f, 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, 0x7d, 0x7c, + 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x80, + 0x81, 0x80, 0x81, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7b, 0x7a, 0x78, 0x79, 0x77, 0x78, 0x78, + 0x7a, 0x79, 0x7c, 0x7d, 0x81, 0x82, 0x8a, 0x8a, 0x8c, 0x8c, 0x8e, + 0x8d, 0x8b, 0x8a, 0x86, 0x85, 0x81, 0x81, 0x7f, 0x7d, 0x7b, 0x79, + 0x79, 0x78, 0x7a, 0x79, 0x7b, 0x7a, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, + 0x80, 0x7f, 0x81, 0x81, 0x82, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7c, 0x7d, 0x7c, 0x7d, 0x7c, 0x7d, 0x7a, + 0x78, 0x76, 0x77, 0x76, 0x74, 0x76, 0x77, 0x77, 0x78, 0x7d, 0x81, + 0x84, 0x87, 0x89, 0x8b, 0x8a, 0x8d, 0x8f, 0x8f, 0x8d, 0x8b, 0x88, + 0x86, 0x82, 0x81, 0x80, 0x7d, 0x7b, 0x79, 0x7a, 0x78, 0x78, 0x7a, + 0x79, 0x7a, 0x79, 0x7c, 0x7c, 0x7d, 0x7f, 0x7f, 0x80, 0x80, 0x82, + 0x81, 0x83, 0x83, 0x82, 0x82, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7d, + 0x7d, 0x7c, 0x7d, 0x7d, 0x7c, 0x7d, 0x7b, 0x78, 0x75, 0x77, 0x75, + 0x74, 0x74, 0x77, 0x77, 0x76, 0x7a, 0x7e, 0x82, 0x84, 0x89, 0x8a, + 0x8b, 0x8c, 0x8f, 0x8f, 0x8f, 0x8d, 0x8a, 0x88, 0x84, 0x83, 0x80, + 0x7f, 0x7c, 0x79, 0x79, 0x77, 0x78, 0x79, 0x79, 0x79, 0x78, 0x7a, + 0x7b, 0x7d, 0x7d, 0x80, 0x81, 0x80, 0x82, 0x82, 0x83, 0x84, 0x84, + 0x83, 0x83, 0x82, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7c, 0x7a, 0x76, 0x75, 0x76, 0x75, 0x72, 0x75, 0x76, + 0x76, 0x76, 0x7c, 0x80, 0x83, 0x85, 0x8a, 0x8a, 0x8c, 0x8e, 0x90, + 0x90, 0x8e, 0x8d, 0x89, 0x87, 0x83, 0x82, 0x80, 0x7e, 0x7b, 0x7a, + 0x78, 0x78, 0x78, 0x78, 0x7a, 0x78, 0x7a, 0x7a, 0x7b, 0x7d, 0x7e, + 0x81, 0x80, 0x81, 0x81, 0x83, 0x83, 0x85, 0x84, 0x84, 0x82, 0x82, + 0x82, 0x80, 0x80, 0x7f, 0x7f, 0x7d, 0x7c, 0x7d, 0x7c, 0x7d, 0x7a, + 0x76, 0x73, 0x75, 0x74, 0x71, 0x74, 0x76, 0x74, 0x75, 0x7a, 0x7f, + 0x81, 0x86, 0x89, 0x8b, 0x8c, 0x8e, 0x91, 0x90, 0x90, 0x8e, 0x8c, + 0x89, 0x84, 0x84, 0x81, 0x7f, 0x7d, 0x7a, 0x79, 0x76, 0x77, 0x78, + 0x79, 0x78, 0x79, 0x7a, 0x7a, 0x7c, 0x7d, 0x80, 0x80, 0x80, 0x82, + 0x82, 0x84, 0x84, 0x85, 0x83, 0x83, 0x82, 0x83, 0x82, 0x80, 0x80, + 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7a, 0x76, 0x72, 0x74, 0x72, 0x6f, + 0x72, 0x74, 0x73, 0x72, 0x79, 0x7e, 0x80, 0x85, 0x89, 0x8c, 0x8b, + 0x8e, 0x92, 0x91, 0x92, 0x91, 0x8e, 0x8a, 0x87, 0x84, 0x84, 0x81, + 0x7c, 0x7c, 0x79, 0x75, 0x76, 0x78, 0x77, 0x77, 0x77, 0x79, 0x78, + 0x7a, 0x7c, 0x7f, 0x7e, 0x80, 0x81, 0x83, 0x83, 0x86, 0x85, 0x86, + 0x84, 0x85, 0x83, 0x83, 0x81, 0x82, 0x81, 0x7e, 0x7e, 0x7c, 0x7b, + 0x76, 0x73, 0x74, 0x72, 0x6d, 0x6e, 0x72, 0x70, 0x70, 0x74, 0x7b, + 0x7e, 0x83, 0x89, 0x8b, 0x8c, 0x8e, 0x93, 0x92, 0x93, 0x93, 0x92, + 0x8d, 0x89, 0x86, 0x85, 0x80, 0x7e, 0x7d, 0x79, 0x76, 0x75, 0x76, + 0x77, 0x74, 0x77, 0x78, 0x76, 0x78, 0x7a, 0x7e, 0x7e, 0x7f, 0x83, + 0x82, 0x83, 0x84, 0x87, 0x86, 0x86, 0x85, 0x85, 0x83, 0x83, 0x82, + 0x82, 0x7f, 0x7e, 0x7b, 0x75, 0x72, 0x72, 0x70, 0x6a, 0x6d, 0x6e, + 0x6c, 0x6d, 0x74, 0x78, 0x7c, 0x82, 0x87, 0x8b, 0x8b, 0x91, 0x94, + 0x94, 0x94, 0x95, 0x92, 0x8f, 0x8a, 0x89, 0x86, 0x83, 0x7f, 0x7d, + 0x7a, 0x75, 0x74, 0x75, 0x75, 0x73, 0x76, 0x77, 0x74, 0x76, 0x79, + 0x7d, 0x7d, 0x81, 0x83, 0x83, 0x85, 0x87, 0x88, 0x88, 0x87, 0x88, + 0x86, 0x86, 0x85, 0x82, 0x7f, 0x7a, 0x75, 0x6d, 0x6c, 0x6e, 0x6d, + 0x6c, 0x6e, 0x70, 0x69, 0x69, 0x71, 0x7a, 0x80, 0x8c, 0x92, 0x8e, + 0x8e, 0x92, 0x99, 0x9a, 0x9c, 0x9a, 0x90, 0x85, 0x7e, 0x7e, 0x7c, + 0x7a, 0x78, 0x71, 0x6a, 0x6a, 0x72, 0x79, 0x7d, 0x7f, 0x7e, 0x7d, + 0x80, 0x88, 0x8e, 0x8c, 0x8b, 0x88, 0x85, 0x84, 0x88, 0x86, 0x80, + 0x7c, 0x7b, 0x7d, 0x7e, 0x80, 0x7d, 0x7a, 0x75, 0x5c, 0x42, 0x4b, + 0x5b, 0x66, 0x78, 0x81, 0x85, 0x84, 0x92, 0xac, 0xb0, 0xa5, 0x9f, + 0x8b, 0x77, 0x78, 0x7e, 0x7e, 0x75, 0x71, 0x78, 0x79, 0x7f, 0x8f, + 0x8e, 0x86, 0x81, 0x80, 0x7e, 0x7b, 0x7f, 0x7d, 0x78, 0x79, 0x81, + 0x86, 0x88, 0x88, 0x86, 0x7f, 0x7f, 0x80, 0x81, 0x7e, 0x7e, 0x7d, + 0x7f, 0x81, 0x83, 0x86, 0x84, 0x85, 0x88, 0x86, 0x84, 0x7e, 0x76, + 0x57, 0x34, 0x3c, 0x4f, 0x5c, 0x78, 0x88, 0x88, 0x8a, 0x96, 0xaf, + 0xb4, 0xac, 0xa1, 0x86, 0x6e, 0x6e, 0x78, 0x7a, 0x7c, 0x7a, 0x7b, + 0x7d, 0x82, 0x91, 0x8f, 0x86, 0x7e, 0x74, 0x6f, 0x6f, 0x79, 0x7e, + 0x7d, 0x83, 0x88, 0x8a, 0x8e, 0x8d, 0x89, 0x7f, 0x7b, 0x7c, 0x7e, + 0x7f, 0x82, 0x81, 0x81, 0x81, 0x85, 0x89, 0x8a, 0x8b, 0x85, 0x7e, + 0x77, 0x70, 0x3b, 0x50, 0x66, 0x8f, 0x97, 0x97, 0x8f, 0x8b, 0xad, + 0xa9, 0x9d, 0x96, 0x71, 0x5c, 0x5c, 0x6b, 0x88, 0x89, 0x8b, 0x93, + 0x85, 0x87, 0x92, 0x91, 0x89, 0x75, 0x68, 0x63, 0x62, 0x6e, 0x86, + 0x88, 0x84, 0x86, 0x86, 0x8c, 0x8b, 0x8d, 0x87, 0x79, 0x77, 0x7d, + 0x81, 0x85, 0x85, 0x89, 0x87, 0x88, 0x8c, 0x8e, 0x89, 0x84, 0x7f, + 0x7c, 0x77, 0x58, 0x2b, 0x3a, 0x57, 0x6a, 0x8f, 0x95, 0x98, 0x92, + 0x8a, 0xab, 0xaf, 0x95, 0x89, 0x69, 0x5d, 0x61, 0x71, 0x8e, 0x8a, + 0x82, 0x8d, 0x8d, 0x92, 0x97, 0x91, 0x80, 0x6a, 0x5f, 0x6b, 0x71, + 0x73, 0x82, 0x84, 0x87, 0x87, 0x8b, 0x92, 0x84, 0x78, 0x79, 0x76, + 0x7e, 0x7f, 0x81, 0x80, 0x7b, 0x87, 0x90, 0x8f, 0x91, 0x8c, 0x85, + 0x82, 0x82, 0x85, 0x82, 0x7b, 0x79, 0x6a, 0x38, 0x34, 0x64, 0x74, + 0x82, 0x8a, 0x83, 0x92, 0x89, 0xa0, 0xbb, 0x92, 0x7a, 0x6d, 0x69, + 0x7a, 0x77, 0x80, 0x84, 0x70, 0x81, 0x9c, 0xa2, 0x9a, 0x83, 0x77, + 0x78, 0x6e, 0x76, 0x7e, 0x6b, 0x69, 0x76, 0x8c, 0x99, 0x8f, 0x8a, + 0x7f, 0x6f, 0x7d, 0x7e, 0x76, 0x71, 0x71, 0x84, 0x88, 0x8a, 0x8c, + 0x81, 0x7c, 0x86, 0x8d, 0x92, 0x88, 0x81, 0x7f, 0x80, 0x89, 0x8c, + 0x85, 0x7f, 0x76, 0x5d, 0x30, 0x47, 0x71, 0x6d, 0x75, 0x72, 0x82, + 0x9d, 0x98, 0xb3, 0xab, 0x7d, 0x7b, 0x7c, 0x84, 0x7f, 0x62, 0x6d, + 0x77, 0x7a, 0x9b, 0x9e, 0x92, 0x85, 0x80, 0x94, 0x90, 0x77, 0x6d, + 0x65, 0x65, 0x77, 0x82, 0x83, 0x7c, 0x79, 0x8d, 0x98, 0x8a, 0x7b, + 0x70, 0x71, 0x78, 0x79, 0x79, 0x71, 0x76, 0x8a, 0x8f, 0x8d, 0x8a, + 0x8a, 0x8f, 0x8f, 0x8d, 0x8d, 0x82, 0x81, 0x7f, 0x7e, 0x7d, 0x7c, + 0x7d, 0x7f, 0x78, 0x76, 0x56, 0x2d, 0x63, 0x7d, 0x66, 0x6e, 0x69, + 0x88, 0xa5, 0x99, 0xb5, 0x9c, 0x7e, 0x9f, 0x98, 0x8a, 0x72, 0x59, + 0x74, 0x74, 0x72, 0x83, 0x76, 0x79, 0x93, 0x9e, 0x9e, 0x85, 0x7d, + 0x88, 0x83, 0x74, 0x73, 0x69, 0x61, 0x72, 0x7c, 0x7f, 0x7d, 0x7d, + 0x91, 0x94, 0x8a, 0x88, 0x81, 0x7e, 0x81, 0x78, 0x72, 0x70, 0x75, + 0x7e, 0x79, 0x7b, 0x85, 0x8b, 0x8c, 0x8d, 0x89, 0x89, 0x8a, 0x8b, + 0x85, 0x83, 0x81, 0x80, 0x7d, 0x7d, 0x7f, 0x7a, 0x7a, 0x62, 0x41, + 0x6d, 0x80, 0x4d, 0x63, 0x79, 0x70, 0x8a, 0x9e, 0x8f, 0x8a, 0x9b, + 0xa9, 0xa2, 0x8c, 0x86, 0x88, 0x81, 0x7a, 0x7e, 0x6c, 0x62, 0x78, + 0x80, 0x71, 0x7a, 0x86, 0x86, 0x88, 0x8e, 0x89, 0x88, 0x8e, 0x8d, + 0x81, 0x79, 0x79, 0x81, 0x7a, 0x74, 0x74, 0x71, 0x73, 0x7a, 0x76, + 0x70, 0x77, 0x81, 0x81, 0x84, 0x83, 0x85, 0x8d, 0x8d, 0x89, 0x89, + 0x87, 0x87, 0x83, 0x7c, 0x7c, 0x82, 0x83, 0x82, 0x82, 0x82, 0x86, + 0x89, 0x84, 0x86, 0x85, 0x84, 0x7d, 0x7b, 0x76, 0x50, 0x5f, 0x7d, + 0x56, 0x55, 0x6f, 0x66, 0x6e, 0x89, 0x88, 0x76, 0x9e, 0xb0, 0x8f, + 0x9d, 0xa5, 0x94, 0x99, 0x97, 0x86, 0x76, 0x82, 0x83, 0x69, 0x6b, + 0x72, 0x6e, 0x73, 0x77, 0x70, 0x6f, 0x81, 0x8f, 0x7f, 0x85, 0x91, + 0x8c, 0x91, 0x8f, 0x81, 0x7f, 0x86, 0x7f, 0x71, 0x75, 0x77, 0x70, + 0x74, 0x72, 0x6a, 0x73, 0x7f, 0x7b, 0x7a, 0x87, 0x8a, 0x85, 0x8d, + 0x8e, 0x8d, 0x95, 0x8e, 0x83, 0x86, 0x86, 0x7f, 0x7d, 0x7c, 0x76, + 0x7b, 0x7c, 0x78, 0x7f, 0x84, 0x81, 0x83, 0x83, 0x82, 0x81, 0x7e, + 0x62, 0x6b, 0x7e, 0x61, 0x5e, 0x69, 0x63, 0x70, 0x7d, 0x79, 0x75, + 0x91, 0x9d, 0x89, 0x9b, 0xa1, 0x98, 0xa2, 0x98, 0x8a, 0x8b, 0x91, + 0x88, 0x74, 0x75, 0x75, 0x6b, 0x73, 0x6b, 0x67, 0x75, 0x78, 0x76, + 0x77, 0x81, 0x87, 0x87, 0x8e, 0x86, 0x87, 0x91, 0x8a, 0x80, 0x83, + 0x83, 0x82, 0x7b, 0x7a, 0x76, 0x77, 0x75, 0x72, 0x71, 0x74, 0x76, + 0x77, 0x78, 0x80, 0x83, 0x87, 0x89, 0x8b, 0x8d, 0x8f, 0x8b, 0x8a, + 0x89, 0x85, 0x7e, 0x7e, 0x7d, 0x7d, 0x7b, 0x7a, 0x7f, 0x7f, 0x7d, + 0x80, 0x82, 0x81, 0x82, 0x7d, 0x7d, 0x7c, 0x69, 0x71, 0x7b, 0x63, + 0x69, 0x6b, 0x68, 0x73, 0x75, 0x79, 0x75, 0x8d, 0x93, 0x84, 0x98, + 0x9b, 0x94, 0xa1, 0x94, 0x91, 0x97, 0x8f, 0x88, 0x7f, 0x85, 0x7b, + 0x73, 0x76, 0x6a, 0x6d, 0x74, 0x69, 0x6d, 0x74, 0x7b, 0x7c, 0x7e, + 0x84, 0x84, 0x89, 0x8a, 0x80, 0x88, 0x86, 0x84, 0x82, 0x82, 0x83, + 0x82, 0x7e, 0x7c, 0x7b, 0x7a, 0x75, 0x73, 0x75, 0x76, 0x78, 0x76, + 0x79, 0x82, 0x83, 0x84, 0x89, 0x8d, 0x8e, 0x8c, 0x8b, 0x88, 0x87, + 0x85, 0x80, 0x80, 0x7f, 0x7c, 0x7a, 0x7a, 0x79, 0x7c, 0x7e, 0x7c, + 0x7e, 0x7f, 0x81, 0x7c, 0x82, 0x73, 0x6c, 0x80, 0x70, 0x6c, 0x71, + 0x6e, 0x77, 0x71, 0x78, 0x72, 0x7f, 0x89, 0x7b, 0x8b, 0x91, 0x90, + 0x96, 0x95, 0x94, 0x97, 0x94, 0x8e, 0x87, 0x89, 0x81, 0x7b, 0x79, + 0x72, 0x73, 0x72, 0x6d, 0x71, 0x75, 0x77, 0x75, 0x7b, 0x7d, 0x7f, + 0x82, 0x83, 0x82, 0x86, 0x84, 0x83, 0x82, 0x83, 0x83, 0x82, 0x81, + 0x7e, 0x7f, 0x7a, 0x75, 0x7a, 0x78, 0x77, 0x76, 0x79, 0x7c, 0x7e, + 0x7e, 0x84, 0x88, 0x88, 0x88, 0x89, 0x89, 0x87, 0x86, 0x82, 0x81, + 0x80, 0x7e, 0x7b, 0x7d, 0x7b, 0x7b, 0x7b, 0x7c, 0x7b, 0x7d, 0x7d, + 0x7d, 0x80, 0x7f, 0x81, 0x82, 0x88, 0x73, 0x79, 0x83, 0x6f, 0x73, + 0x6a, 0x70, 0x72, 0x6c, 0x74, 0x6d, 0x84, 0x7e, 0x7e, 0x8d, 0x8e, + 0x94, 0x90, 0x93, 0x91, 0x92, 0x8f, 0x87, 0x8a, 0x88, 0x85, 0x82, + 0x81, 0x80, 0x7c, 0x79, 0x75, 0x77, 0x76, 0x71, 0x72, 0x74, 0x77, + 0x79, 0x7b, 0x7e, 0x81, 0x83, 0x80, 0x84, 0x84, 0x82, 0x82, 0x80, + 0x81, 0x7d, 0x7f, 0x7c, 0x7b, 0x7c, 0x7c, 0x7b, 0x7c, 0x7c, 0x7b, + 0x7d, 0x7e, 0x80, 0x82, 0x82, 0x84, 0x85, 0x85, 0x86, 0x83, 0x84, + 0x82, 0x84, 0x80, 0x80, 0x7e, 0x7f, 0x7e, 0x7d, 0x7c, 0x7c, 0x7c, + 0x7d, 0x7b, 0x7d, 0x7d, 0x7e, 0x81, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, + 0x71, 0x7d, 0x78, 0x74, 0x76, 0x73, 0x7d, 0x74, 0x7b, 0x78, 0x7e, + 0x85, 0x7e, 0x84, 0x86, 0x8c, 0x88, 0x8c, 0x8f, 0x8e, 0x8f, 0x89, + 0x8a, 0x87, 0x85, 0x81, 0x7e, 0x7e, 0x7b, 0x78, 0x77, 0x78, 0x79, + 0x77, 0x78, 0x79, 0x7d, 0x7a, 0x7d, 0x7d, 0x7f, 0x7f, 0x7f, 0x81, + 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x81, 0x7d, 0x7d, 0x7c, 0x7d, + 0x79, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7e, 0x7d, 0x80, 0x80, 0x81, + 0x81, 0x84, 0x84, 0x82, 0x84, 0x81, 0x82, 0x83, 0x82, 0x83, 0x81, + 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7b, 0x7e, 0x7d, 0x7e, 0x7d, + 0x7c, 0x7e, 0x7a, 0x7d, 0x7d, 0x7e, 0x7f, 0x7e, 0x80, 0x81, 0x82, + 0x83, 0x7f, 0x80, 0x80, 0x7d, 0x7e, 0x79, 0x7c, 0x79, 0x7a, 0x79, + 0x7c, 0x7e, 0x80, 0x82, 0x83, 0x84, 0x85, 0x85, 0x86, 0x85, 0x85, + 0x82, 0x83, 0x83, 0x82, 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, + 0x80, 0x7d, 0x7e, 0x7d, 0x81, 0x80, 0x80, 0x80, 0x7e, 0x80, 0x7d, + 0x7e, 0x7d, 0x7d, 0x7d, 0x7b, 0x7b, 0x7d, 0x7e, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7f, 0x81, 0x83, 0x81, 0x82, 0x81, 0x80, 0x7f, 0x7f, 0x7f, + 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, 0x7e, 0x80, 0x80, 0x81, 0x80, + 0x81, 0x82, 0x7e, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x7f, + 0x7f, 0x7d, 0x7d, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, + 0x7f, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, + 0x7e, 0x80, 0x80, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x7f, 0x7e, 0x7e, 0x7c, 0x7f, 0x7f, 0x81, 0x81, 0x80, 0x7f, + 0x82, 0x82, 0x80, 0x7d, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7e, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7d, 0x80, 0x7d, 0x7f, 0x7e, 0x7f, 0x80, 0x7e, 0x80, 0x82, + 0x81, 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x80, 0x81, 0x7f, 0x7e, 0x7f, + 0x7f, 0x81, 0x7f, 0x7f, 0x7c, 0x7e, 0x7d, 0x7b, 0x7e, 0x7c, 0x7e, + 0x7e, 0x7f, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7d, 0x7e, 0x7d, + 0x7e, 0x7f, 0x7e, 0x80, 0x81, 0x81, 0x81, 0x83, 0x80, 0x81, 0x80, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x81, 0x7f, + 0x81, 0x80, 0x81, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7d, 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x80, 0x80, + 0x80, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7d, 0x7e, + 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, + }, + { // 1 + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x80, 0x7f, 0x7e, + 0x7f, 0x80, 0x81, 0x82, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x79, 0x50, + 0x36, 0x71, 0x90, 0x8d, 0xa6, 0x8b, 0x7b, 0x99, 0x8f, 0x7c, 0x6b, + 0x65, 0x78, 0x88, 0x9b, 0x97, 0x85, 0x8c, 0x8f, 0x86, 0x7f, 0x6f, + 0x66, 0x74, 0x84, 0x8a, 0x8b, 0x86, 0x83, 0x83, 0x81, 0x7e, 0x72, + 0x6f, 0x79, 0x7d, 0x84, 0x87, 0x7f, 0x80, 0x81, 0x7e, 0x7b, 0x77, + 0x7b, 0x81, 0x85, 0x85, 0x7e, 0x7c, 0x7d, 0x7f, 0x83, 0x84, 0x86, + 0x87, 0x85, 0x82, 0x7c, 0x7a, 0x7c, 0x7e, 0x83, 0x87, 0x88, 0x87, + 0x82, 0x7e, 0x7d, 0x7d, 0x7f, 0x80, 0x7f, 0x7f, 0x75, 0x4d, 0x41, + 0x7c, 0x8a, 0x85, 0xa3, 0x81, 0x7e, 0xa2, 0x89, 0x78, 0x6f, 0x6a, + 0x7a, 0x87, 0x95, 0x8b, 0x83, 0x94, 0x90, 0x86, 0x81, 0x6d, 0x69, + 0x7c, 0x81, 0x82, 0x88, 0x84, 0x88, 0x89, 0x84, 0x7e, 0x73, 0x74, + 0x78, 0x78, 0x81, 0x81, 0x81, 0x85, 0x80, 0x7e, 0x7d, 0x7c, 0x7d, + 0x80, 0x81, 0x80, 0x81, 0x80, 0x7e, 0x80, 0x82, 0x84, 0x87, 0x85, + 0x84, 0x81, 0x7e, 0x7c, 0x7d, 0x80, 0x84, 0x86, 0x85, 0x84, 0x83, + 0x81, 0x80, 0x81, 0x7f, 0x7c, 0x5e, 0x2b, 0x56, 0x93, 0x7b, 0x9f, + 0x9c, 0x6f, 0xa5, 0xa1, 0x78, 0x72, 0x61, 0x6e, 0x7f, 0x90, 0x90, + 0x7e, 0x94, 0x9e, 0x8d, 0x89, 0x76, 0x61, 0x74, 0x7f, 0x77, 0x82, + 0x83, 0x89, 0x93, 0x8a, 0x85, 0x76, 0x73, 0x77, 0x71, 0x79, 0x7d, + 0x7d, 0x87, 0x88, 0x82, 0x7f, 0x7f, 0x79, 0x78, 0x7e, 0x7f, 0x83, + 0x85, 0x80, 0x7f, 0x81, 0x82, 0x84, 0x87, 0x87, 0x86, 0x85, 0x7f, + 0x7b, 0x7c, 0x7d, 0x82, 0x85, 0x86, 0x88, 0x86, 0x84, 0x81, 0x7d, + 0x7b, 0x6c, 0x30, 0x3d, 0x8c, 0x78, 0x8d, 0xaa, 0x74, 0x9f, 0xb2, + 0x81, 0x73, 0x63, 0x6d, 0x76, 0x81, 0x8b, 0x7a, 0x92, 0xab, 0x95, + 0x8b, 0x82, 0x67, 0x72, 0x7b, 0x6a, 0x75, 0x7e, 0x8b, 0x96, 0x8d, + 0x8d, 0x80, 0x7f, 0x7e, 0x6a, 0x6c, 0x72, 0x77, 0x84, 0x84, 0x82, + 0x87, 0x88, 0x80, 0x7e, 0x7d, 0x7a, 0x7f, 0x7f, 0x7d, 0x80, 0x81, + 0x83, 0x86, 0x87, 0x85, 0x86, 0x87, 0x81, 0x80, 0x7d, 0x7b, 0x7f, + 0x81, 0x84, 0x88, 0x88, 0x86, 0x85, 0x7f, 0x79, 0x4c, 0x23, 0x6e, + 0x81, 0x67, 0x9d, 0x86, 0x8d, 0xc3, 0x9c, 0x7e, 0x6f, 0x75, 0x7a, + 0x69, 0x76, 0x70, 0x7d, 0xab, 0xa0, 0x8b, 0x97, 0x88, 0x82, 0x80, + 0x63, 0x62, 0x6d, 0x7d, 0x85, 0x7c, 0x8f, 0x96, 0x95, 0x93, 0x76, + 0x6f, 0x73, 0x71, 0x6f, 0x67, 0x71, 0x85, 0x8c, 0x8d, 0x8a, 0x8a, + 0x8a, 0x84, 0x78, 0x71, 0x78, 0x7e, 0x7e, 0x81, 0x87, 0x8b, 0x8e, + 0x89, 0x82, 0x83, 0x83, 0x7e, 0x7b, 0x7e, 0x80, 0x84, 0x87, 0x84, + 0x86, 0x87, 0x7b, 0x3a, 0x34, 0x88, 0x60, 0x61, 0x91, 0x6f, 0xaa, + 0xc0, 0x92, 0x8a, 0x88, 0x98, 0x75, 0x5f, 0x6c, 0x60, 0x82, 0x95, + 0x76, 0x90, 0xa9, 0x9b, 0x99, 0x81, 0x78, 0x7c, 0x72, 0x6d, 0x59, + 0x6e, 0x88, 0x85, 0x90, 0x89, 0x8d, 0x99, 0x89, 0x7a, 0x69, 0x69, + 0x70, 0x6b, 0x6e, 0x7b, 0x8d, 0x91, 0x8d, 0x8b, 0x89, 0x89, 0x7f, + 0x76, 0x79, 0x80, 0x82, 0x7f, 0x83, 0x87, 0x88, 0x85, 0x82, 0x84, + 0x87, 0x85, 0x80, 0x84, 0x83, 0x83, 0x80, 0x81, 0x56, 0x28, 0x7b, + 0x6d, 0x3e, 0x83, 0x6b, 0x8b, 0xbc, 0x94, 0x98, 0xa6, 0xb3, 0x8f, + 0x6d, 0x7e, 0x66, 0x6c, 0x74, 0x52, 0x79, 0x9b, 0x89, 0x93, 0x93, + 0x9d, 0xa4, 0x8d, 0x7d, 0x70, 0x7b, 0x73, 0x5e, 0x6b, 0x6d, 0x7d, + 0x84, 0x74, 0x7f, 0x92, 0x8e, 0x83, 0x83, 0x84, 0x88, 0x84, 0x77, + 0x7d, 0x84, 0x7c, 0x76, 0x7c, 0x82, 0x82, 0x81, 0x82, 0x8b, 0x90, + 0x88, 0x83, 0x87, 0x87, 0x80, 0x7c, 0x7c, 0x81, 0x7f, 0x7b, 0x7d, + 0x8a, 0x71, 0x3d, 0x76, 0x76, 0x44, 0x78, 0x58, 0x6a, 0xa4, 0x77, + 0x88, 0xa5, 0xb0, 0xa8, 0x96, 0x9f, 0x8c, 0x96, 0x82, 0x56, 0x7a, + 0x75, 0x63, 0x73, 0x67, 0x7e, 0x92, 0x85, 0x85, 0x94, 0x9d, 0x8c, + 0x8c, 0x85, 0x7c, 0x87, 0x73, 0x69, 0x75, 0x6e, 0x69, 0x71, 0x73, + 0x7d, 0x87, 0x82, 0x89, 0x96, 0x90, 0x8d, 0x8f, 0x8b, 0x8a, 0x83, + 0x79, 0x7c, 0x7e, 0x75, 0x72, 0x78, 0x7e, 0x81, 0x7f, 0x82, 0x8b, + 0x8c, 0x8a, 0x84, 0x89, 0x80, 0x5d, 0x74, 0x75, 0x56, 0x6d, 0x5f, + 0x5e, 0x7b, 0x6e, 0x6f, 0x83, 0x8f, 0x8e, 0x93, 0x9a, 0x95, 0xa6, + 0x9e, 0x8e, 0x9a, 0x90, 0x8a, 0x86, 0x7c, 0x7c, 0x7e, 0x79, 0x72, + 0x79, 0x79, 0x74, 0x79, 0x77, 0x78, 0x7c, 0x77, 0x78, 0x80, 0x7f, + 0x7f, 0x82, 0x83, 0x86, 0x88, 0x85, 0x87, 0x8a, 0x87, 0x82, 0x81, + 0x80, 0x80, 0x7f, 0x79, 0x7a, 0x7e, 0x7b, 0x7b, 0x7b, 0x7b, 0x7e, + 0x7f, 0x7e, 0x7d, 0x7f, 0x81, 0x80, 0x80, 0x7e, 0x7f, 0x82, 0x7e, + 0x7d, 0x7d, 0x7c, 0x7d, 0x7a, 0x7a, 0x7c, 0x7c, 0x7c, 0x7b, 0x7c, + 0x7f, 0x81, 0x80, 0x7e, 0x82, 0x85, 0x83, 0x86, 0x85, 0x85, 0x89, + 0x88, 0x86, 0x87, 0x88, 0x88, 0x87, 0x86, 0x85, 0x85, 0x84, 0x81, + 0x7f, 0x7d, 0x7c, 0x7b, 0x79, 0x79, 0x7b, 0x7c, 0x7d, 0x7b, 0x7c, + 0x7e, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, + 0x80, 0x81, 0x7f, 0x80, 0x82, 0x82, 0x81, 0x7e, 0x7d, 0x7d, 0x7a, + 0x77, 0x76, 0x78, 0x79, 0x78, 0x7b, 0x7e, 0x80, 0x83, 0x81, 0x82, + 0x84, 0x83, 0x83, 0x83, 0x84, 0x86, 0x87, 0x87, 0x89, 0x8a, 0x88, + 0x88, 0x88, 0x86, 0x86, 0x83, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7a, 0x7b, 0x7b, 0x7a, 0x7b, 0x7b, 0x7c, 0x7d, + 0x7d, 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x82, 0x83, 0x84, 0x84, 0x83, + 0x83, 0x80, 0x7e, 0x7d, 0x7a, 0x78, 0x77, 0x77, 0x79, 0x79, 0x7b, + 0x7d, 0x7f, 0x81, 0x80, 0x81, 0x82, 0x81, 0x81, 0x80, 0x81, 0x82, + 0x82, 0x84, 0x87, 0x88, 0x8a, 0x89, 0x87, 0x87, 0x86, 0x84, 0x83, + 0x81, 0x7f, 0x80, 0x7f, 0x7c, 0x7d, 0x7c, 0x7c, 0x7c, 0x7a, 0x7b, + 0x7c, 0x7b, 0x7c, 0x7c, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x80, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7e, 0x80, 0x82, 0x81, 0x81, 0x7f, + 0x7d, 0x7e, 0x7b, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7d, 0x7e, + 0x7f, 0x7e, 0x7f, 0x81, 0x83, 0x85, 0x85, 0x86, 0x87, 0x89, 0x87, + 0x86, 0x85, 0x84, 0x83, 0x82, 0x80, 0x7f, 0x81, 0x81, 0x81, 0x80, + 0x7f, 0x80, 0x80, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x79, 0x79, + 0x7c, 0x7c, 0x7c, 0x7e, 0x7f, 0x81, 0x81, 0x80, 0x81, 0x83, 0x82, + 0x81, 0x81, 0x81, 0x81, 0x82, 0x7f, 0x7e, 0x7e, 0x7c, 0x79, 0x78, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7f, 0x81, 0x80, 0x80, 0x82, 0x83, + 0x83, 0x82, 0x81, 0x83, 0x85, 0x85, 0x85, 0x85, 0x84, 0x86, 0x85, + 0x83, 0x83, 0x83, 0x82, 0x81, 0x7f, 0x7f, 0x7e, 0x7c, 0x7d, 0x7c, + 0x7b, 0x7c, 0x7b, 0x7b, 0x7c, 0x7d, 0x7d, 0x7e, 0x7f, 0x80, 0x81, + 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, + 0x81, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7c, 0x7c, 0x7a, 0x7a, 0x7b, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x82, 0x84, + 0x85, 0x85, 0x85, 0x86, 0x86, 0x85, 0x84, 0x82, 0x82, 0x82, 0x7f, + 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x80, 0x81, 0x81, 0x80, 0x7e, + 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7f, 0x7e, 0x7d, 0x7c, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x80, 0x81, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x83, 0x83, 0x84, 0x85, 0x84, 0x83, + 0x83, 0x83, 0x82, 0x81, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7c, 0x7d, 0x7c, 0x7c, 0x7e, + 0x7e, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, + 0x81, 0x82, 0x82, 0x80, 0x7f, 0x7f, 0x7f, 0x7d, 0x7d, 0x7c, 0x7c, + 0x7c, 0x7a, 0x7b, 0x7c, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x82, 0x81, + 0x82, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x81, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x81, 0x82, 0x82, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7c, 0x7c, 0x7d, 0x7e, 0x7d, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, + 0x80, 0x7d, 0x7e, 0x7f, 0x7d, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7d, 0x7d, 0x7f, 0x7d, 0x7c, 0x7e, 0x7c, + 0x7e, 0x7d, 0x7b, 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, 0x80, 0x81, 0x80, + 0x80, 0x82, 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x82, 0x82, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7e, 0x7d, + 0x80, 0x7e, 0x7e, 0x81, 0x7d, 0x7f, 0x80, 0x7d, 0x7f, 0x7f, 0x7d, + 0x80, 0x7f, 0x80, 0x82, 0x7e, 0x7f, 0x83, 0x7e, 0x7e, 0x80, 0x79, + 0x7e, 0x7b, 0x76, 0x7d, 0x79, 0x7b, 0x7f, 0x7c, 0x83, 0x82, 0x80, + 0x85, 0x83, 0x84, 0x83, 0x81, 0x83, 0x83, 0x82, 0x81, 0x83, 0x82, + 0x82, 0x83, 0x7f, 0x84, 0x81, 0x7f, 0x82, 0x7f, 0x81, 0x7e, 0x7e, + 0x7f, 0x80, 0x7c, 0x7f, 0x7e, 0x7d, 0x80, 0x7d, 0x81, 0x80, 0x7e, + 0x80, 0x81, 0x7c, 0x83, 0x7b, 0x7e, 0x80, 0x7c, 0x7f, 0x7d, 0x81, + 0x7e, 0x85, 0x80, 0x7b, 0x83, 0x80, 0x76, 0x7f, 0x78, 0x77, 0x80, + 0x70, 0x7d, 0x7f, 0x78, 0x84, 0x7d, 0x7f, 0x89, 0x7f, 0x81, 0x85, + 0x82, 0x85, 0x81, 0x82, 0x86, 0x86, 0x83, 0x82, 0x87, 0x83, 0x82, + 0x80, 0x7f, 0x82, 0x80, 0x7b, 0x7e, 0x81, 0x7d, 0x7c, 0x7c, 0x7f, + 0x7c, 0x7c, 0x7f, 0x7f, 0x81, 0x82, 0x7f, 0x83, 0x83, 0x7e, 0x83, + 0x7f, 0x81, 0x7f, 0x7f, 0x81, 0x81, 0x7f, 0x81, 0x84, 0x80, 0x86, + 0x73, 0x7c, 0x84, 0x6f, 0x7b, 0x77, 0x70, 0x82, 0x72, 0x70, 0x86, + 0x75, 0x7f, 0x7e, 0x77, 0x89, 0x81, 0x7e, 0x87, 0x87, 0x8b, 0x89, + 0x86, 0x8d, 0x8b, 0x88, 0x84, 0x85, 0x85, 0x82, 0x7f, 0x7a, 0x83, + 0x7d, 0x7b, 0x7e, 0x7a, 0x7d, 0x79, 0x77, 0x7b, 0x7b, 0x79, 0x7c, + 0x7f, 0x81, 0x81, 0x82, 0x83, 0x87, 0x86, 0x81, 0x87, 0x85, 0x81, + 0x84, 0x82, 0x7f, 0x85, 0x7f, 0x7e, 0x81, 0x71, 0x7e, 0x7b, 0x6c, + 0x7d, 0x70, 0x73, 0x7d, 0x68, 0x78, 0x7b, 0x70, 0x81, 0x75, 0x7d, + 0x8a, 0x7d, 0x89, 0x8b, 0x8c, 0x93, 0x8d, 0x8f, 0x92, 0x8f, 0x8a, + 0x86, 0x87, 0x83, 0x80, 0x7c, 0x7b, 0x7e, 0x78, 0x77, 0x78, 0x78, + 0x78, 0x76, 0x76, 0x7a, 0x79, 0x7b, 0x7f, 0x7f, 0x85, 0x82, 0x84, + 0x88, 0x84, 0x87, 0x88, 0x89, 0x87, 0x8a, 0x85, 0x86, 0x87, 0x7e, + 0x85, 0x73, 0x76, 0x81, 0x67, 0x70, 0x72, 0x62, 0x76, 0x68, 0x63, + 0x7e, 0x6b, 0x76, 0x7e, 0x76, 0x8d, 0x85, 0x85, 0x93, 0x90, 0x96, + 0x93, 0x92, 0x98, 0x94, 0x92, 0x8d, 0x8d, 0x8d, 0x82, 0x83, 0x7c, + 0x7b, 0x7a, 0x6e, 0x72, 0x72, 0x6d, 0x6e, 0x6d, 0x71, 0x75, 0x75, + 0x7a, 0x83, 0x84, 0x8b, 0x8e, 0x8e, 0x94, 0x8d, 0x8c, 0x8e, 0x8b, + 0x87, 0x85, 0x83, 0x80, 0x81, 0x70, 0x71, 0x7f, 0x66, 0x6c, 0x71, + 0x5e, 0x75, 0x67, 0x5e, 0x7e, 0x6c, 0x74, 0x80, 0x76, 0x90, 0x8a, + 0x85, 0x97, 0x95, 0x99, 0x98, 0x94, 0x9c, 0x99, 0x95, 0x8e, 0x91, + 0x92, 0x83, 0x82, 0x7b, 0x7a, 0x76, 0x67, 0x6e, 0x6e, 0x6a, 0x6a, + 0x6b, 0x73, 0x76, 0x76, 0x7b, 0x89, 0x89, 0x8b, 0x90, 0x93, 0x96, + 0x8f, 0x90, 0x8f, 0x8d, 0x87, 0x84, 0x83, 0x81, 0x76, 0x6b, 0x7e, + 0x6c, 0x63, 0x71, 0x5c, 0x6d, 0x6c, 0x56, 0x71, 0x70, 0x6d, 0x7c, + 0x76, 0x87, 0x92, 0x87, 0x95, 0x9a, 0x9f, 0x9e, 0x9a, 0xa2, 0x9e, + 0x9d, 0x94, 0x8f, 0x96, 0x87, 0x7e, 0x7d, 0x7a, 0x74, 0x69, 0x69, + 0x6b, 0x6b, 0x66, 0x69, 0x72, 0x74, 0x76, 0x7b, 0x87, 0x8a, 0x8c, + 0x90, 0x95, 0x97, 0x93, 0x92, 0x92, 0x91, 0x8a, 0x86, 0x84, 0x83, + 0x75, 0x68, 0x7c, 0x69, 0x5e, 0x6f, 0x56, 0x67, 0x6a, 0x53, 0x6f, + 0x71, 0x6b, 0x7c, 0x7a, 0x8a, 0x95, 0x8f, 0x99, 0xa1, 0xa8, 0xa2, + 0x9e, 0xa8, 0x9e, 0x9d, 0x96, 0x8a, 0x92, 0x83, 0x74, 0x79, 0x70, + 0x67, 0x66, 0x61, 0x63, 0x68, 0x64, 0x6b, 0x78, 0x78, 0x7e, 0x8a, + 0x90, 0x95, 0x98, 0x98, 0x9d, 0x9c, 0x95, 0x95, 0x94, 0x8b, 0x85, + 0x82, 0x7b, 0x7b, 0x66, 0x5f, 0x72, 0x55, 0x54, 0x64, 0x50, 0x63, + 0x61, 0x59, 0x75, 0x75, 0x7a, 0x85, 0x8f, 0x9e, 0x9b, 0xa2, 0xa9, + 0xa9, 0xb3, 0xa2, 0xa1, 0xab, 0x96, 0x91, 0x8a, 0x7f, 0x81, 0x70, + 0x65, 0x67, 0x67, 0x5b, 0x58, 0x64, 0x65, 0x67, 0x6e, 0x78, 0x84, + 0x88, 0x8b, 0x95, 0x9f, 0x9c, 0x9e, 0xa2, 0xa0, 0x9b, 0x92, 0x90, + 0x8c, 0x85, 0x7d, 0x7b, 0x78, 0x73, 0x70, 0x55, 0x60, 0x6f, 0x48, + 0x53, 0x63, 0x51, 0x62, 0x61, 0x62, 0x7c, 0x81, 0x83, 0x8b, 0xa2, + 0xa9, 0x9c, 0xae, 0xb1, 0xab, 0xb2, 0x9f, 0x9e, 0xa3, 0x8d, 0x83, + 0x7e, 0x7b, 0x72, 0x64, 0x65, 0x62, 0x63, 0x5d, 0x5a, 0x69, 0x6e, + 0x6c, 0x74, 0x83, 0x88, 0x8a, 0x91, 0x98, 0x9f, 0x9d, 0x9b, 0x9e, + 0x9e, 0x94, 0x8e, 0x8f, 0x89, 0x81, 0x7e, 0x7c, 0x79, 0x75, 0x74, + 0x6b, 0x56, 0x67, 0x68, 0x44, 0x5a, 0x62, 0x51, 0x5f, 0x63, 0x6c, + 0x7a, 0x84, 0x8b, 0x91, 0xab, 0xab, 0x9e, 0xb4, 0xb4, 0xa9, 0xad, + 0xa1, 0x9c, 0x95, 0x88, 0x7f, 0x76, 0x7a, 0x6e, 0x61, 0x6a, 0x65, + 0x60, 0x64, 0x63, 0x67, 0x70, 0x71, 0x72, 0x80, 0x88, 0x87, 0x8e, + 0x98, 0x9a, 0x99, 0x9d, 0x9c, 0x9b, 0x99, 0x90, 0x8d, 0x8b, 0x84, + 0x7d, 0x7f, 0x7c, 0x77, 0x75, 0x75, 0x6f, 0x58, 0x60, 0x68, 0x4c, + 0x52, 0x5f, 0x56, 0x5b, 0x63, 0x6e, 0x76, 0x84, 0x93, 0x91, 0xa5, + 0xb2, 0xa5, 0xad, 0xb4, 0xaf, 0xaa, 0xa0, 0x9c, 0x91, 0x88, 0x83, + 0x74, 0x75, 0x72, 0x65, 0x65, 0x66, 0x67, 0x62, 0x63, 0x6a, 0x6a, + 0x6d, 0x71, 0x77, 0x80, 0x86, 0x89, 0x8f, 0x97, 0x99, 0x9a, 0x9b, + 0x9d, 0x9a, 0x96, 0x93, 0x8d, 0x89, 0x83, 0x7e, 0x7c, 0x7a, 0x76, + 0x73, 0x73, 0x73, 0x72, 0x61, 0x58, 0x65, 0x5d, 0x50, 0x59, 0x5f, + 0x61, 0x61, 0x6b, 0x79, 0x7f, 0x8e, 0x97, 0x9d, 0xaa, 0xac, 0xab, + 0xab, 0xad, 0xaf, 0xa0, 0x97, 0x93, 0x89, 0x82, 0x78, 0x72, 0x71, + 0x6b, 0x67, 0x63, 0x64, 0x6a, 0x69, 0x68, 0x6a, 0x6f, 0x72, 0x74, + 0x7a, 0x82, 0x87, 0x8b, 0x8e, 0x92, 0x97, 0x97, 0x97, 0x95, 0x94, + 0x92, 0x8c, 0x88, 0x85, 0x82, 0x7c, 0x77, 0x76, 0x74, 0x73, 0x73, + 0x73, 0x74, 0x75, 0x74, 0x6b, 0x66, 0x6b, 0x6b, 0x65, 0x62, 0x67, + 0x6d, 0x6b, 0x71, 0x7c, 0x81, 0x89, 0x94, 0x99, 0x99, 0x9c, 0xa1, + 0x9d, 0x9a, 0x9c, 0x96, 0x8e, 0x8a, 0x87, 0x82, 0x7d, 0x7d, 0x79, + 0x74, 0x74, 0x73, 0x72, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x78, + 0x78, 0x79, 0x7b, 0x7e, 0x7f, 0x81, 0x84, 0x86, 0x88, 0x89, 0x89, + 0x88, 0x87, 0x88, 0x85, 0x83, 0x82, 0x81, 0x7f, 0x7f, 0x7e, 0x7f, + 0x80, 0x82, 0x82, 0x82, 0x83, 0x82, 0x81, 0x7a, 0x6f, 0x6c, 0x6f, + 0x68, 0x60, 0x65, 0x68, 0x64, 0x69, 0x72, 0x74, 0x77, 0x83, 0x8a, + 0x88, 0x8e, 0x95, 0x96, 0x99, 0x9c, 0x9b, 0x96, 0x95, 0x94, 0x90, + 0x8d, 0x8a, 0x86, 0x85, 0x81, 0x7d, 0x7c, 0x79, 0x73, 0x71, 0x71, + 0x6d, 0x6a, 0x6c, 0x6d, 0x6c, 0x6f, 0x72, 0x74, 0x77, 0x7c, 0x80, + 0x82, 0x85, 0x88, 0x8b, 0x8d, 0x8e, 0x8f, 0x8f, 0x8e, 0x8e, 0x8d, + 0x8b, 0x89, 0x87, 0x85, 0x82, 0x80, 0x7f, 0x7c, 0x7a, 0x79, 0x78, + 0x78, 0x75, 0x6f, 0x69, 0x6c, 0x6d, 0x64, 0x65, 0x6b, 0x68, 0x69, + 0x73, 0x78, 0x79, 0x82, 0x8a, 0x88, 0x8d, 0x94, 0x95, 0x96, 0x99, + 0x99, 0x98, 0x96, 0x93, 0x90, 0x8f, 0x8b, 0x86, 0x85, 0x81, 0x7c, + 0x7b, 0x7a, 0x76, 0x73, 0x74, 0x72, 0x6f, 0x71, 0x71, 0x70, 0x70, + 0x73, 0x73, 0x74, 0x78, 0x7b, 0x7d, 0x7f, 0x82, 0x84, 0x86, 0x88, + 0x89, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x88, 0x87, + 0x87, 0x85, 0x83, 0x82, 0x81, 0x80, 0x7e, 0x7b, 0x78, 0x76, 0x70, + 0x66, 0x67, 0x68, 0x5f, 0x60, 0x66, 0x64, 0x65, 0x6f, 0x76, 0x78, + 0x82, 0x8b, 0x8c, 0x91, 0x98, 0x9a, 0x9c, 0x9d, 0x9c, 0x9c, 0x9a, + 0x95, 0x92, 0x90, 0x8a, 0x86, 0x84, 0x7f, 0x79, 0x76, 0x74, 0x70, + 0x6d, 0x6c, 0x6b, 0x6b, 0x6c, 0x6c, 0x6e, 0x70, 0x74, 0x77, 0x7a, + 0x7e, 0x83, 0x86, 0x87, 0x89, 0x8c, 0x8d, 0x8d, 0x8d, 0x8d, 0x8b, + 0x8a, 0x89, 0x86, 0x85, 0x83, 0x80, 0x7f, 0x7d, 0x7b, 0x7b, 0x7b, + 0x79, 0x7a, 0x7b, 0x7a, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, + 0x7c, 0x75, 0x75, 0x79, 0x72, 0x6f, 0x73, 0x73, 0x70, 0x75, 0x7a, + 0x7a, 0x7e, 0x84, 0x85, 0x87, 0x8b, 0x8d, 0x8f, 0x90, 0x8f, 0x90, + 0x90, 0x8c, 0x8b, 0x8c, 0x89, 0x85, 0x86, 0x84, 0x80, 0x7e, 0x7e, + 0x7c, 0x79, 0x78, 0x77, 0x75, 0x74, 0x75, 0x76, 0x74, 0x74, 0x78, + 0x78, 0x78, 0x7b, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x83, 0x84, 0x84, + 0x85, 0x85, 0x85, 0x87, 0x86, 0x86, 0x86, 0x86, 0x84, 0x84, 0x83, + 0x82, 0x81, 0x80, 0x7e, 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7e, 0x7e, 0x7c, 0x7b, 0x7b, 0x77, 0x70, 0x71, 0x73, 0x6f, 0x6d, + 0x72, 0x73, 0x74, 0x79, 0x7e, 0x81, 0x86, 0x8a, 0x8b, 0x8e, 0x8f, + 0x91, 0x92, 0x91, 0x8f, 0x8f, 0x8d, 0x89, 0x88, 0x87, 0x82, 0x80, + 0x7f, 0x7d, 0x7b, 0x79, 0x78, 0x77, 0x76, 0x75, 0x75, 0x76, 0x76, + 0x77, 0x78, 0x79, 0x7c, 0x7d, 0x7e, 0x81, 0x82, 0x83, 0x84, 0x85, + 0x84, 0x84, 0x84, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, + 0x80, 0x7e, 0x7c, 0x77, 0x74, 0x74, 0x71, 0x6f, 0x70, 0x70, 0x71, + 0x74, 0x78, 0x7c, 0x7f, 0x84, 0x87, 0x8a, 0x8c, 0x8e, 0x90, 0x90, + 0x90, 0x8f, 0x8e, 0x8c, 0x8a, 0x89, 0x87, 0x84, 0x82, 0x7f, 0x7e, + 0x7b, 0x79, 0x78, 0x76, 0x74, 0x73, 0x73, 0x73, 0x75, 0x76, 0x76, + 0x79, 0x7c, 0x7c, 0x7f, 0x81, 0x83, 0x85, 0x85, 0x85, 0x87, 0x86, + 0x86, 0x86, 0x84, 0x83, 0x83, 0x81, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, + 0x7d, 0x7d, 0x7c, 0x7d, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x82, + 0x83, 0x84, 0x84, 0x83, 0x82, 0x82, 0x81, 0x7e, 0x7c, 0x77, 0x73, + 0x74, 0x71, 0x6e, 0x6f, 0x70, 0x71, 0x75, 0x79, 0x7c, 0x80, 0x85, + 0x88, 0x8b, 0x8c, 0x8e, 0x90, 0x8f, 0x8f, 0x8e, 0x8c, 0x8a, 0x88, + 0x87, 0x84, 0x82, 0x80, 0x7e, 0x7d, 0x7a, 0x79, 0x79, 0x77, 0x76, + 0x76, 0x76, 0x76, 0x78, 0x79, 0x79, 0x7b, 0x7e, 0x7f, 0x80, 0x81, + 0x82, 0x84, 0x84, 0x84, 0x85, 0x84, 0x84, 0x84, 0x81, 0x81, 0x81, + 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, 0x81, 0x82, 0x82, 0x82, 0x83, 0x84, 0x84, 0x83, + 0x83, 0x83, 0x82, 0x80, 0x7d, 0x7b, 0x79, 0x75, 0x73, 0x72, 0x70, + 0x6f, 0x6f, 0x71, 0x72, 0x75, 0x79, 0x7c, 0x81, 0x84, 0x87, 0x8a, + 0x8d, 0x8f, 0x91, 0x91, 0x91, 0x91, 0x90, 0x8e, 0x8c, 0x8a, 0x87, + 0x85, 0x82, 0x7f, 0x7c, 0x7a, 0x78, 0x77, 0x75, 0x75, 0x74, 0x74, + 0x74, 0x76, 0x77, 0x78, 0x7a, 0x7b, 0x7d, 0x80, 0x81, 0x83, 0x85, + 0x86, 0x86, 0x86, 0x86, 0x85, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80, + 0x7f, 0x7e, 0x7d, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x7f, 0x7d, + 0x7b, 0x7b, 0x79, 0x75, 0x74, 0x74, 0x72, 0x71, 0x72, 0x74, 0x75, + 0x79, 0x7d, 0x80, 0x84, 0x87, 0x8b, 0x8e, 0x8f, 0x91, 0x92, 0x91, + 0x90, 0x8f, 0x8d, 0x8b, 0x88, 0x86, 0x82, 0x80, 0x7e, 0x7b, 0x7a, + 0x78, 0x77, 0x76, 0x75, 0x75, 0x76, 0x76, 0x77, 0x78, 0x79, 0x7a, + 0x7c, 0x7e, 0x7f, 0x81, 0x83, 0x84, 0x85, 0x86, 0x87, 0x86, 0x86, + 0x85, 0x84, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x80, 0x80, 0x81, 0x82, 0x82, 0x82, + 0x83, 0x83, 0x82, 0x83, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7e, 0x7c, + 0x7b, 0x78, 0x73, 0x72, 0x73, 0x70, 0x6e, 0x70, 0x72, 0x73, 0x77, + 0x7c, 0x7f, 0x83, 0x88, 0x8c, 0x8f, 0x90, 0x92, 0x94, 0x93, 0x92, + 0x91, 0x8f, 0x8d, 0x8a, 0x88, 0x85, 0x82, 0x7f, 0x7e, 0x7c, 0x79, + 0x78, 0x77, 0x75, 0x74, 0x74, 0x74, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x7a, 0x7d, 0x7e, 0x80, 0x82, 0x84, 0x85, 0x85, 0x86, 0x86, 0x86, + 0x85, 0x85, 0x84, 0x83, 0x83, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7c, 0x7a, 0x7a, 0x7b, 0x79, 0x79, 0x7a, + 0x7a, 0x7a, 0x7c, 0x7e, 0x7f, 0x81, 0x83, 0x86, 0x88, 0x89, 0x8b, + 0x8c, 0x8c, 0x8c, 0x8b, 0x8b, 0x89, 0x87, 0x86, 0x84, 0x82, 0x80, + 0x7f, 0x7d, 0x7b, 0x7a, 0x79, 0x78, 0x77, 0x77, 0x77, 0x78, 0x79, + 0x79, 0x7b, 0x7c, 0x7e, 0x80, 0x81, 0x82, 0x83, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x83, 0x82, 0x81, 0x81, 0x7f, 0x7f, 0x7e, 0x7d, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x81, + 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x83, 0x83, 0x83, + 0x82, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, + }, + { // 2 + 0x80, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x7f, 0x7d, 0x7c, 0x80, 0x81, 0x7e, 0x7c, 0x7c, 0x7f, + 0x83, 0x85, 0x86, 0x88, 0x88, 0x85, 0x81, 0x7e, 0x7d, 0x7d, 0x7c, + 0x7a, 0x7a, 0x7b, 0x7c, 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x80, + 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x82, 0x81, 0x80, 0x80, 0x80, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, 0x7f, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x82, 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7e, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x81, 0x82, 0x82, 0x80, 0x7f, 0x81, + 0x82, 0x81, 0x7f, 0x7e, 0x7f, 0x81, 0x80, 0x7f, 0x7e, 0x7f, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x81, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7c, 0x7b, + 0x7b, 0x79, 0x78, 0x6d, 0x69, 0x76, 0x76, 0x75, 0x7b, 0x7d, 0x85, + 0x8c, 0x94, 0x92, 0x8d, 0x95, 0x95, 0x8d, 0x89, 0x81, 0x7a, 0x78, + 0x76, 0x75, 0x6f, 0x71, 0x75, 0x78, 0x80, 0x82, 0x85, 0x89, 0x8e, + 0x8e, 0x8a, 0x89, 0x84, 0x81, 0x7e, 0x7a, 0x77, 0x77, 0x7a, 0x7a, + 0x7d, 0x80, 0x82, 0x86, 0x88, 0x8a, 0x87, 0x86, 0x87, 0x84, 0x82, + 0x80, 0x7e, 0x7e, 0x7f, 0x7e, 0x57, 0x2e, 0x5c, 0x6e, 0x54, 0x65, + 0x64, 0x6e, 0x8c, 0xac, 0xb6, 0x94, 0xa1, 0xbf, 0xac, 0x9d, 0x94, + 0x75, 0x65, 0x71, 0x74, 0x60, 0x4d, 0x66, 0x78, 0x7a, 0x95, 0x94, + 0x8a, 0x97, 0xa8, 0xa5, 0x8c, 0x84, 0x7c, 0x6c, 0x6b, 0x65, 0x57, + 0x55, 0x67, 0x75, 0x7b, 0x88, 0x90, 0x93, 0x9e, 0xa3, 0x98, 0x8d, + 0x89, 0x81, 0x79, 0x77, 0x6f, 0x68, 0x6e, 0x78, 0x79, 0x7e, 0x86, + 0x8a, 0x8e, 0x96, 0x95, 0x8f, 0x8d, 0x8b, 0x6a, 0x32, 0x44, 0x5e, + 0x45, 0x56, 0x5e, 0x5a, 0x76, 0x9a, 0xc0, 0xaf, 0xa5, 0xbf, 0xb4, + 0xa8, 0xa9, 0x8b, 0x64, 0x5b, 0x64, 0x66, 0x53, 0x55, 0x68, 0x65, + 0x85, 0xa5, 0x9b, 0x9a, 0x9c, 0xa7, 0xa4, 0x94, 0x8d, 0x6c, 0x59, + 0x61, 0x5c, 0x56, 0x55, 0x61, 0x6c, 0x82, 0x9f, 0x9d, 0x99, 0xa0, + 0xa0, 0x9b, 0x95, 0x8b, 0x73, 0x6c, 0x71, 0x6d, 0x6c, 0x6d, 0x6f, + 0x74, 0x82, 0x92, 0x91, 0x93, 0x97, 0x93, 0x93, 0x90, 0x84, 0x53, + 0x2b, 0x4d, 0x52, 0x49, 0x63, 0x5b, 0x5e, 0x7b, 0xa5, 0xc4, 0xb0, + 0xb0, 0xba, 0xa4, 0xa4, 0xa9, 0x87, 0x62, 0x56, 0x5a, 0x5f, 0x59, + 0x67, 0x6c, 0x61, 0x86, 0xa2, 0xa3, 0xa6, 0x9f, 0x9d, 0x93, 0x8f, + 0x94, 0x71, 0x58, 0x56, 0x4e, 0x55, 0x63, 0x70, 0x6e, 0x7a, 0x97, + 0x9c, 0xa4, 0xa8, 0x99, 0x8c, 0x8a, 0x8a, 0x7c, 0x72, 0x6e, 0x62, + 0x67, 0x75, 0x7b, 0x7c, 0x82, 0x8a, 0x8c, 0x97, 0x9f, 0x95, 0x8f, + 0x86, 0x7b, 0x54, 0x35, 0x4e, 0x47, 0x45, 0x65, 0x62, 0x67, 0x7c, + 0x9c, 0xb9, 0xb3, 0xbc, 0xbc, 0x9e, 0x98, 0x9d, 0x87, 0x6e, 0x62, + 0x58, 0x53, 0x54, 0x6b, 0x79, 0x6f, 0x87, 0x97, 0x95, 0xa5, 0xa8, + 0xa2, 0x91, 0x85, 0x85, 0x71, 0x63, 0x64, 0x54, 0x4b, 0x58, 0x68, + 0x73, 0x84, 0x97, 0x95, 0x96, 0xa4, 0x9e, 0x94, 0x90, 0x85, 0x75, + 0x72, 0x76, 0x6e, 0x6d, 0x75, 0x73, 0x77, 0x85, 0x8c, 0x8d, 0x91, + 0x96, 0x8f, 0x8d, 0x8b, 0x80, 0x62, 0x3b, 0x42, 0x48, 0x42, 0x64, + 0x6c, 0x66, 0x77, 0x89, 0xa7, 0xb4, 0xbf, 0xc7, 0xa9, 0x95, 0x95, + 0x86, 0x78, 0x74, 0x66, 0x54, 0x4f, 0x5b, 0x6f, 0x77, 0x8a, 0x9a, + 0x8d, 0x94, 0xa0, 0x9d, 0x9e, 0x96, 0x8a, 0x74, 0x60, 0x62, 0x5b, + 0x59, 0x61, 0x60, 0x66, 0x75, 0x8a, 0x97, 0x9c, 0xa3, 0x99, 0x8f, + 0x90, 0x89, 0x83, 0x7f, 0x77, 0x6e, 0x6b, 0x73, 0x77, 0x7d, 0x86, + 0x85, 0x87, 0x8c, 0x91, 0x93, 0x93, 0x8d, 0x80, 0x67, 0x42, 0x40, + 0x48, 0x43, 0x60, 0x6d, 0x68, 0x77, 0x83, 0x9d, 0xb0, 0xbc, 0xc8, + 0xb1, 0x9a, 0x95, 0x84, 0x78, 0x79, 0x6f, 0x5e, 0x56, 0x58, 0x64, + 0x70, 0x86, 0x9b, 0x94, 0x96, 0x9d, 0x92, 0x96, 0x98, 0x8f, 0x80, + 0x6b, 0x62, 0x57, 0x53, 0x62, 0x65, 0x6b, 0x79, 0x80, 0x8a, 0x97, + 0xa3, 0xa3, 0x99, 0x94, 0x86, 0x7d, 0x80, 0x7b, 0x78, 0x76, 0x72, + 0x71, 0x78, 0x82, 0x87, 0x8b, 0x8f, 0x8d, 0x8d, 0x8f, 0x8b, 0x84, + 0x71, 0x4d, 0x41, 0x42, 0x3d, 0x58, 0x6f, 0x73, 0x80, 0x86, 0x92, + 0xa3, 0xb1, 0xc5, 0xbe, 0xa8, 0x9b, 0x81, 0x6e, 0x70, 0x70, 0x69, + 0x67, 0x62, 0x60, 0x66, 0x78, 0x91, 0x9a, 0xa0, 0xa4, 0x93, 0x8c, + 0x8e, 0x86, 0x83, 0x7d, 0x71, 0x61, 0x54, 0x58, 0x5c, 0x69, 0x80, + 0x89, 0x8f, 0x96, 0x94, 0x96, 0x97, 0x97, 0x8f, 0x85, 0x7f, 0x74, + 0x72, 0x77, 0x77, 0x7c, 0x80, 0x7f, 0x81, 0x85, 0x8b, 0x8f, 0x92, + 0x93, 0x8a, 0x7b, 0x5f, 0x44, 0x44, 0x41, 0x4a, 0x69, 0x70, 0x78, + 0x86, 0x8a, 0x98, 0xa6, 0xb6, 0xbe, 0xb2, 0xa6, 0x92, 0x75, 0x6a, + 0x6c, 0x67, 0x69, 0x6f, 0x67, 0x67, 0x70, 0x7f, 0x8f, 0x9b, 0xa7, + 0xa2, 0x93, 0x90, 0x85, 0x7a, 0x7c, 0x77, 0x6d, 0x66, 0x5f, 0x59, + 0x5d, 0x6c, 0x7d, 0x8b, 0x9b, 0x9c, 0x97, 0x95, 0x8f, 0x8a, 0x8a, + 0x86, 0x7f, 0x79, 0x76, 0x73, 0x75, 0x7f, 0x83, 0x86, 0x8b, 0x8a, + 0x8a, 0x8e, 0x8f, 0x8c, 0x82, 0x68, 0x4c, 0x43, 0x3c, 0x41, 0x60, + 0x71, 0x7c, 0x8d, 0x8f, 0x94, 0x9d, 0xab, 0xb6, 0xb2, 0xae, 0x9f, + 0x80, 0x6e, 0x66, 0x5e, 0x63, 0x71, 0x72, 0x72, 0x78, 0x7a, 0x83, + 0x90, 0x9f, 0xa4, 0x9e, 0x9b, 0x8c, 0x79, 0x76, 0x6e, 0x67, 0x6a, + 0x67, 0x61, 0x63, 0x6a, 0x72, 0x81, 0x95, 0x9e, 0x9f, 0x9e, 0x93, + 0x88, 0x85, 0x81, 0x7e, 0x80, 0x7f, 0x7b, 0x79, 0x7b, 0x7c, 0x81, + 0x8a, 0x8e, 0x91, 0x93, 0x8d, 0x84, 0x71, 0x53, 0x49, 0x44, 0x3f, + 0x57, 0x6b, 0x74, 0x89, 0x90, 0x92, 0x9c, 0xa4, 0xae, 0xb0, 0xab, + 0xa3, 0x8c, 0x76, 0x6b, 0x60, 0x5e, 0x6a, 0x6f, 0x72, 0x7d, 0x7f, + 0x83, 0x8d, 0x95, 0x9c, 0x9e, 0x9d, 0x96, 0x84, 0x78, 0x6f, 0x62, + 0x62, 0x64, 0x63, 0x68, 0x6f, 0x78, 0x83, 0x90, 0x9b, 0x9f, 0x9e, + 0x97, 0x8b, 0x84, 0x7d, 0x78, 0x7c, 0x7e, 0x7d, 0x7f, 0x7d, 0x7c, + 0x80, 0x86, 0x8d, 0x92, 0x93, 0x8d, 0x7a, 0x5b, 0x4c, 0x43, 0x3c, + 0x54, 0x6b, 0x74, 0x8c, 0x95, 0x92, 0x9a, 0x9f, 0xa5, 0xaa, 0xac, + 0xa6, 0x91, 0x7c, 0x6c, 0x5b, 0x56, 0x62, 0x6a, 0x72, 0x83, 0x86, + 0x85, 0x8e, 0x91, 0x94, 0x9b, 0x9d, 0x9a, 0x8e, 0x82, 0x72, 0x5f, + 0x59, 0x5a, 0x5c, 0x68, 0x75, 0x7f, 0x8a, 0x93, 0x99, 0x9c, 0x9d, + 0x9a, 0x91, 0x89, 0x80, 0x78, 0x76, 0x76, 0x77, 0x7a, 0x7c, 0x7d, + 0x81, 0x85, 0x8b, 0x8d, 0x8c, 0x7d, 0x63, 0x58, 0x4c, 0x43, 0x58, + 0x69, 0x75, 0x8d, 0x96, 0x94, 0x99, 0x9d, 0xa0, 0xa4, 0xa8, 0xa3, + 0x93, 0x82, 0x70, 0x5d, 0x55, 0x5d, 0x62, 0x6c, 0x7e, 0x84, 0x89, + 0x92, 0x92, 0x93, 0x98, 0x9b, 0x98, 0x91, 0x86, 0x75, 0x64, 0x5b, + 0x57, 0x59, 0x67, 0x77, 0x84, 0x90, 0x97, 0x98, 0x9a, 0x98, 0x94, + 0x90, 0x8c, 0x85, 0x7f, 0x7a, 0x75, 0x71, 0x73, 0x74, 0x78, 0x81, + 0x88, 0x8a, 0x83, 0x6d, 0x5e, 0x55, 0x4b, 0x5b, 0x6e, 0x77, 0x8e, + 0x96, 0x90, 0x94, 0x95, 0x95, 0x9c, 0xa1, 0xa0, 0x97, 0x88, 0x79, + 0x69, 0x5e, 0x62, 0x65, 0x6b, 0x7c, 0x82, 0x83, 0x8b, 0x8a, 0x89, + 0x8f, 0x92, 0x93, 0x91, 0x8a, 0x7e, 0x6e, 0x64, 0x5f, 0x5f, 0x6b, + 0x79, 0x84, 0x91, 0x93, 0x91, 0x92, 0x8f, 0x8e, 0x8e, 0x8c, 0x89, + 0x85, 0x80, 0x7b, 0x77, 0x76, 0x75, 0x79, 0x7e, 0x7f, 0x77, 0x61, + 0x58, 0x52, 0x49, 0x60, 0x77, 0x81, 0x9c, 0xa4, 0x99, 0x9a, 0x97, + 0x91, 0x94, 0x99, 0x95, 0x8a, 0x7d, 0x6e, 0x60, 0x5b, 0x67, 0x70, + 0x7a, 0x8e, 0x91, 0x8e, 0x93, 0x8b, 0x85, 0x89, 0x88, 0x86, 0x81, + 0x7a, 0x6d, 0x61, 0x60, 0x61, 0x6a, 0x7e, 0x8c, 0x96, 0x9e, 0x9a, + 0x92, 0x8e, 0x88, 0x86, 0x85, 0x84, 0x82, 0x7d, 0x7a, 0x77, 0x76, + 0x7b, 0x80, 0x84, 0x85, 0x7a, 0x5e, 0x52, 0x4c, 0x42, 0x5e, 0x79, + 0x83, 0x9d, 0xa5, 0x99, 0x9a, 0x99, 0x97, 0x98, 0x9a, 0x94, 0x82, + 0x6f, 0x62, 0x55, 0x55, 0x6b, 0x7a, 0x84, 0x98, 0x96, 0x8e, 0x90, + 0x8b, 0x88, 0x8c, 0x8c, 0x86, 0x7a, 0x6e, 0x60, 0x57, 0x5e, 0x69, + 0x76, 0x8a, 0x93, 0x94, 0x96, 0x90, 0x8b, 0x8c, 0x8b, 0x8a, 0x86, + 0x84, 0x7f, 0x79, 0x7a, 0x7b, 0x7b, 0x82, 0x84, 0x82, 0x7b, 0x5d, + 0x49, 0x4a, 0x41, 0x59, 0x81, 0x89, 0x9d, 0xa9, 0x9a, 0x98, 0x9b, + 0x99, 0x9b, 0x97, 0x8b, 0x76, 0x5e, 0x55, 0x55, 0x5c, 0x78, 0x8f, + 0x93, 0x9e, 0x9b, 0x8c, 0x8e, 0x8c, 0x86, 0x86, 0x7e, 0x71, 0x63, + 0x5b, 0x5a, 0x5d, 0x71, 0x85, 0x8e, 0x9c, 0x9e, 0x97, 0x94, 0x8e, + 0x88, 0x84, 0x7d, 0x78, 0x73, 0x75, 0x7b, 0x7c, 0x83, 0x87, 0x86, + 0x8c, 0x8c, 0x87, 0x7b, 0x56, 0x45, 0x44, 0x38, 0x5a, 0x82, 0x87, + 0xa0, 0xa9, 0x99, 0x9d, 0xa2, 0x9f, 0x9c, 0x91, 0x7e, 0x63, 0x50, + 0x54, 0x5f, 0x6e, 0x90, 0x9c, 0x94, 0x9b, 0x93, 0x88, 0x91, 0x8e, + 0x82, 0x76, 0x68, 0x5b, 0x58, 0x66, 0x74, 0x7e, 0x8e, 0x8d, 0x87, + 0x8a, 0x88, 0x87, 0x8b, 0x88, 0x81, 0x7c, 0x7c, 0x7d, 0x83, 0x90, + 0x92, 0x8d, 0x8a, 0x82, 0x7c, 0x80, 0x7e, 0x79, 0x5f, 0x37, 0x37, + 0x3d, 0x4b, 0x8c, 0xa9, 0xa8, 0xb7, 0xa4, 0x90, 0x99, 0x9a, 0x93, + 0x81, 0x68, 0x4f, 0x3d, 0x4c, 0x73, 0x8e, 0xa8, 0xbb, 0xa5, 0x95, + 0x97, 0x8a, 0x89, 0x89, 0x70, 0x55, 0x44, 0x4a, 0x5e, 0x7e, 0xa0, + 0xa1, 0x96, 0x8d, 0x7c, 0x7d, 0x89, 0x87, 0x80, 0x75, 0x6b, 0x6a, + 0x78, 0x8b, 0x92, 0x92, 0x8e, 0x84, 0x86, 0x8d, 0x8e, 0x8f, 0x87, + 0x78, 0x6b, 0x61, 0x47, 0x3c, 0x57, 0x5e, 0x73, 0x9f, 0x9c, 0x9a, + 0xa3, 0x97, 0x92, 0x90, 0x89, 0x74, 0x5f, 0x5e, 0x60, 0x69, 0x88, + 0x9e, 0x9b, 0xa1, 0x9f, 0x89, 0x87, 0x86, 0x75, 0x6c, 0x64, 0x5e, + 0x60, 0x77, 0x92, 0x99, 0x9f, 0x97, 0x7e, 0x77, 0x75, 0x70, 0x72, + 0x74, 0x71, 0x72, 0x80, 0x8c, 0x90, 0x94, 0x8c, 0x80, 0x7f, 0x83, + 0x8a, 0x90, 0x8a, 0x7d, 0x75, 0x75, 0x7b, 0x80, 0x82, 0x65, 0x36, + 0x41, 0x59, 0x6b, 0xa8, 0xb7, 0x97, 0x94, 0x8d, 0x87, 0x92, 0x92, + 0x7b, 0x55, 0x4c, 0x5d, 0x70, 0x95, 0xb2, 0xa0, 0x8f, 0x92, 0x85, + 0x84, 0x8d, 0x79, 0x62, 0x5c, 0x63, 0x71, 0x8a, 0x9f, 0x97, 0x8c, + 0x88, 0x79, 0x73, 0x76, 0x6f, 0x68, 0x70, 0x7e, 0x88, 0x93, 0x97, + 0x88, 0x7e, 0x7d, 0x79, 0x7b, 0x81, 0x7f, 0x7f, 0x88, 0x8d, 0x89, + 0x87, 0x86, 0x82, 0x83, 0x80, 0x77, 0x58, 0x32, 0x42, 0x65, 0x79, + 0xab, 0xb2, 0x90, 0x92, 0x90, 0x88, 0x8a, 0x7c, 0x64, 0x52, 0x61, + 0x83, 0x96, 0xa5, 0xa7, 0x8b, 0x80, 0x89, 0x7f, 0x76, 0x71, 0x60, + 0x60, 0x77, 0x91, 0x9d, 0x98, 0x94, 0x84, 0x79, 0x81, 0x77, 0x65, + 0x61, 0x63, 0x71, 0x89, 0x9b, 0x96, 0x8a, 0x87, 0x7f, 0x7f, 0x84, + 0x7a, 0x72, 0x77, 0x7e, 0x86, 0x8c, 0x8a, 0x83, 0x85, 0x8b, 0x8b, + 0x87, 0x80, 0x73, 0x6b, 0x6e, 0x60, 0x43, 0x57, 0x77, 0x7f, 0xa6, + 0xac, 0x88, 0x87, 0x84, 0x79, 0x79, 0x74, 0x6b, 0x66, 0x7d, 0x9c, + 0xa1, 0xa1, 0x9b, 0x7f, 0x75, 0x7e, 0x73, 0x6c, 0x70, 0x70, 0x7b, + 0x90, 0x9a, 0x94, 0x83, 0x7a, 0x77, 0x75, 0x78, 0x78, 0x71, 0x77, + 0x83, 0x87, 0x8a, 0x86, 0x79, 0x74, 0x7a, 0x80, 0x80, 0x82, 0x80, + 0x7f, 0x87, 0x8a, 0x86, 0x82, 0x7c, 0x7c, 0x80, 0x85, 0x85, 0x81, + 0x7f, 0x7f, 0x82, 0x88, 0x87, 0x80, 0x79, 0x6b, 0x4c, 0x41, 0x65, + 0x7b, 0x8d, 0xa8, 0x92, 0x83, 0x8f, 0x87, 0x81, 0x7a, 0x6f, 0x6d, + 0x7b, 0x94, 0x9b, 0x91, 0x8c, 0x80, 0x76, 0x7e, 0x7a, 0x6e, 0x73, + 0x7c, 0x87, 0x96, 0x96, 0x89, 0x7b, 0x74, 0x76, 0x76, 0x75, 0x74, + 0x76, 0x7e, 0x8a, 0x8c, 0x84, 0x7d, 0x78, 0x7b, 0x83, 0x86, 0x82, + 0x7f, 0x7f, 0x7d, 0x7d, 0x7c, 0x78, 0x7a, 0x81, 0x88, 0x8c, 0x8a, + 0x84, 0x7c, 0x79, 0x7c, 0x7e, 0x83, 0x87, 0x88, 0x8a, 0x88, 0x82, + 0x7b, 0x72, 0x6e, 0x66, 0x4e, 0x4c, 0x74, 0x8b, 0x9b, 0xaa, 0x8c, + 0x78, 0x7f, 0x77, 0x75, 0x74, 0x70, 0x79, 0x8c, 0xa0, 0x9e, 0x8d, + 0x82, 0x77, 0x75, 0x7d, 0x79, 0x73, 0x7c, 0x88, 0x92, 0x98, 0x8a, + 0x77, 0x6d, 0x6f, 0x7a, 0x7d, 0x7e, 0x81, 0x81, 0x88, 0x8a, 0x7d, + 0x77, 0x74, 0x74, 0x7f, 0x83, 0x82, 0x80, 0x7b, 0x79, 0x76, 0x77, + 0x7c, 0x80, 0x89, 0x8c, 0x8b, 0x8a, 0x81, 0x7c, 0x7b, 0x7c, 0x81, + 0x83, 0x84, 0x84, 0x83, 0x82, 0x80, 0x7f, 0x80, 0x81, 0x84, 0x84, + 0x81, 0x7a, 0x70, 0x68, 0x63, 0x5e, 0x5a, 0x68, 0x83, 0x8f, 0x98, + 0x99, 0x87, 0x82, 0x82, 0x79, 0x76, 0x77, 0x7f, 0x8a, 0x94, 0x98, + 0x8c, 0x81, 0x7d, 0x79, 0x79, 0x7c, 0x7a, 0x7d, 0x88, 0x8d, 0x8b, + 0x84, 0x77, 0x6f, 0x70, 0x77, 0x7e, 0x80, 0x83, 0x85, 0x85, 0x86, + 0x81, 0x7a, 0x78, 0x75, 0x78, 0x82, 0x86, 0x84, 0x83, 0x7d, 0x79, + 0x7a, 0x7a, 0x7b, 0x81, 0x88, 0x89, 0x85, 0x7f, 0x77, 0x75, 0x79, + 0x7d, 0x83, 0x87, 0x87, 0x85, 0x80, 0x7d, 0x7b, 0x7d, 0x80, 0x81, + 0x83, 0x85, 0x84, 0x85, 0x84, 0x81, 0x7f, 0x7d, 0x78, 0x71, 0x6a, + 0x64, 0x5f, 0x61, 0x7b, 0x8d, 0x8e, 0x93, 0x88, 0x7a, 0x80, 0x7d, + 0x76, 0x78, 0x7e, 0x88, 0x91, 0x97, 0x91, 0x82, 0x7d, 0x7d, 0x7b, + 0x7f, 0x80, 0x80, 0x87, 0x8d, 0x89, 0x83, 0x7b, 0x74, 0x75, 0x79, + 0x7d, 0x7f, 0x7f, 0x82, 0x81, 0x7f, 0x7b, 0x74, 0x73, 0x79, 0x80, + 0x86, 0x87, 0x82, 0x7d, 0x7b, 0x78, 0x7a, 0x7d, 0x7d, 0x7e, 0x82, + 0x82, 0x81, 0x82, 0x82, 0x7f, 0x7f, 0x81, 0x84, 0x87, 0x87, 0x84, + 0x7f, 0x7b, 0x79, 0x7c, 0x7e, 0x80, 0x82, 0x81, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x81, 0x81, 0x83, 0x84, 0x82, 0x7e, 0x7b, 0x7a, 0x7a, + 0x77, 0x6d, 0x68, 0x68, 0x64, 0x71, 0x89, 0x8d, 0x8e, 0x8e, 0x81, + 0x7d, 0x80, 0x7b, 0x79, 0x7f, 0x88, 0x8e, 0x91, 0x8f, 0x84, 0x7f, + 0x7f, 0x7c, 0x7e, 0x7e, 0x7e, 0x82, 0x85, 0x85, 0x82, 0x7d, 0x7b, + 0x7c, 0x7e, 0x81, 0x82, 0x80, 0x7e, 0x7e, 0x7e, 0x7b, 0x78, 0x79, + 0x7b, 0x81, 0x85, 0x83, 0x7e, 0x7b, 0x78, 0x76, 0x7b, 0x7d, 0x7d, + 0x80, 0x7f, 0x80, 0x84, 0x83, 0x84, 0x83, 0x83, 0x83, 0x80, 0x80, + 0x7e, 0x7f, 0x82, 0x81, 0x80, 0x81, 0x7f, 0x80, 0x81, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7c, 0x7b, 0x7c, 0x7d, 0x7f, 0x80, + 0x82, 0x81, 0x7f, 0x82, 0x81, 0x7f, 0x7f, 0x7e, 0x77, 0x71, 0x69, + 0x55, 0x5b, 0x7e, 0x8b, 0x91, 0x95, 0x84, 0x81, 0x84, 0x7d, 0x7a, + 0x7f, 0x89, 0x8d, 0x90, 0x8e, 0x83, 0x80, 0x82, 0x7e, 0x81, 0x85, + 0x84, 0x88, 0x87, 0x82, 0x7d, 0x78, 0x76, 0x77, 0x7a, 0x7f, 0x80, + 0x81, 0x7f, 0x7d, 0x7d, 0x7a, 0x76, 0x79, 0x84, 0x8b, 0x88, 0x80, + 0x78, 0x76, 0x78, 0x7a, 0x7b, 0x7e, 0x86, 0x89, 0x87, 0x81, 0x7c, + 0x7a, 0x7b, 0x7d, 0x81, 0x83, 0x84, 0x81, 0x7d, 0x7c, 0x7b, 0x7d, + 0x7f, 0x81, 0x82, 0x82, 0x80, 0x7d, 0x7b, 0x7d, 0x81, 0x83, 0x83, + 0x81, 0x7e, 0x7d, 0x7e, 0x7d, 0x7d, 0x7e, 0x7e, 0x81, 0x81, 0x7f, + 0x7d, 0x7c, 0x7d, 0x7f, 0x7e, 0x7e, 0x81, 0x82, 0x82, 0x80, 0x74, + 0x68, 0x6a, 0x75, 0x7d, 0x84, 0x88, 0x8a, 0x8a, 0x83, 0x7b, 0x7b, + 0x81, 0x89, 0x8c, 0x8a, 0x88, 0x87, 0x80, 0x7a, 0x79, 0x7c, 0x82, + 0x88, 0x87, 0x83, 0x82, 0x7f, 0x7b, 0x7b, 0x7d, 0x7f, 0x83, 0x82, + 0x7e, 0x7b, 0x7a, 0x79, 0x7a, 0x7a, 0x7d, 0x84, 0x88, 0x85, 0x82, + 0x80, 0x7c, 0x7a, 0x79, 0x79, 0x7d, 0x7f, 0x7e, 0x7c, 0x7d, 0x7e, + 0x80, 0x82, 0x83, 0x83, 0x84, 0x82, 0x7f, 0x7d, 0x7d, 0x7d, 0x7e, + 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, 0x7e, 0x80, 0x82, 0x82, + 0x81, 0x7f, 0x7e, 0x7c, 0x7c, 0x7e, 0x80, 0x80, 0x7f, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, + }, + { // 3 + 0x7f, 0x80, 0x81, 0x7e, 0x7a, 0x7c, 0x84, 0x85, 0x7d, 0x7c, 0x81, + 0x82, 0x80, 0x7f, 0x81, 0x81, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x80, + 0x7d, 0x7c, 0x80, 0x81, 0x80, 0x7f, 0x7d, 0x82, 0x7c, 0x7d, 0x80, + 0x7b, 0x7e, 0x81, 0x84, 0x83, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x81, 0x82, 0x80, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7d, 0x80, + 0x7f, 0x7e, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x79, 0x7a, 0x7f, 0x7e, 0x82, 0x82, 0x80, + 0x83, 0x84, 0x83, 0x85, 0x86, 0x82, 0x7f, 0x80, 0x7f, 0x7b, 0x7c, + 0x7d, 0x7d, 0x7c, 0x7c, 0x7d, 0x80, 0x81, 0x7e, 0x7f, 0x82, 0x82, + 0x80, 0x7f, 0x7f, 0x7f, 0x81, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x81, 0x81, 0x80, 0x80, 0x82, 0x82, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x80, + 0x80, 0x80, 0x80, 0x81, 0x82, 0x81, 0x80, 0x82, 0x82, 0x80, 0x7f, + 0x7e, 0x7e, 0x7d, 0x7b, 0x79, 0x73, 0x73, 0x78, 0x74, 0x73, 0x78, + 0x7a, 0x7f, 0x83, 0x87, 0x88, 0x8c, 0x92, 0x8f, 0x8d, 0x8f, 0x8c, + 0x87, 0x82, 0x7e, 0x7a, 0x77, 0x73, 0x72, 0x72, 0x76, 0x7b, 0x7e, + 0x82, 0x87, 0x8b, 0x8d, 0x8f, 0x8e, 0x8c, 0x8b, 0x88, 0x83, 0x80, + 0x7f, 0x7d, 0x7b, 0x7b, 0x7b, 0x7f, 0x82, 0x80, 0x83, 0x87, 0x8a, + 0x83, 0x82, 0x63, 0x45, 0x76, 0x68, 0x3c, 0x56, 0x5f, 0x6c, 0x74, + 0x80, 0x8a, 0x91, 0xc1, 0xb6, 0x95, 0xb7, 0xbc, 0xa0, 0x92, 0x85, + 0x80, 0x72, 0x70, 0x61, 0x49, 0x6f, 0x74, 0x5e, 0x71, 0x84, 0x90, + 0x8f, 0x99, 0x9b, 0x92, 0xa3, 0x8f, 0x75, 0x7f, 0x7a, 0x64, 0x5c, + 0x65, 0x62, 0x6a, 0x78, 0x79, 0x8a, 0x9c, 0x9c, 0x97, 0xa3, 0xa4, + 0x96, 0x92, 0x8b, 0x84, 0x7e, 0x77, 0x6f, 0x73, 0x7c, 0x7b, 0x78, + 0x79, 0x7e, 0x4c, 0x40, 0x84, 0x58, 0x38, 0x66, 0x68, 0x75, 0x7c, + 0x8c, 0x93, 0xa1, 0xcc, 0xa5, 0x95, 0xc2, 0xaa, 0x88, 0x86, 0x7f, + 0x77, 0x64, 0x65, 0x5b, 0x5a, 0x81, 0x6f, 0x6a, 0x90, 0x96, 0x96, + 0x93, 0xa1, 0x9e, 0x8f, 0x94, 0x77, 0x6e, 0x76, 0x63, 0x50, 0x58, + 0x6a, 0x65, 0x70, 0x83, 0x8f, 0x9e, 0xa1, 0x9f, 0xa1, 0xa8, 0x99, + 0x89, 0x8b, 0x83, 0x78, 0x70, 0x71, 0x70, 0x77, 0x7d, 0x7b, 0x87, + 0x89, 0x81, 0x48, 0x51, 0x93, 0x4a, 0x35, 0x69, 0x66, 0x70, 0x6c, + 0x83, 0x96, 0xa4, 0xbd, 0x97, 0xa7, 0xcf, 0x9e, 0x87, 0x91, 0x87, + 0x7a, 0x5f, 0x62, 0x61, 0x62, 0x76, 0x5e, 0x73, 0x98, 0x8a, 0x8d, + 0x97, 0xaa, 0x9f, 0x8b, 0x94, 0x82, 0x7b, 0x6f, 0x59, 0x5e, 0x62, + 0x59, 0x5a, 0x77, 0x83, 0x86, 0x97, 0x9e, 0xa5, 0xa3, 0x9f, 0x96, + 0x95, 0x8f, 0x7c, 0x79, 0x77, 0x71, 0x6e, 0x72, 0x7a, 0x7f, 0x86, + 0x87, 0x8b, 0x54, 0x4b, 0x98, 0x57, 0x30, 0x6a, 0x69, 0x69, 0x62, + 0x80, 0x98, 0x94, 0xb3, 0x9e, 0xa5, 0xcc, 0xa0, 0x8d, 0x99, 0x8e, + 0x7f, 0x60, 0x68, 0x6b, 0x59, 0x6b, 0x61, 0x70, 0x8c, 0x7d, 0x8a, + 0x97, 0xa6, 0x9d, 0x8b, 0x9f, 0x8c, 0x78, 0x76, 0x6a, 0x64, 0x5f, + 0x5e, 0x61, 0x75, 0x7e, 0x7f, 0x91, 0x9b, 0x9c, 0x9b, 0x9f, 0x9a, + 0x92, 0x8f, 0x83, 0x7e, 0x79, 0x74, 0x74, 0x76, 0x7b, 0x7d, 0x80, + 0x84, 0x4e, 0x48, 0x98, 0x58, 0x2f, 0x73, 0x71, 0x69, 0x61, 0x87, + 0x9e, 0x8b, 0xac, 0x9f, 0xa5, 0xc2, 0x98, 0x8e, 0x9d, 0x8e, 0x7b, + 0x64, 0x71, 0x72, 0x56, 0x68, 0x69, 0x73, 0x82, 0x75, 0x8c, 0x95, + 0x9b, 0x95, 0x8d, 0xa0, 0x8a, 0x7a, 0x79, 0x75, 0x69, 0x5d, 0x69, + 0x6b, 0x72, 0x77, 0x82, 0x90, 0x90, 0x95, 0x97, 0x9f, 0x97, 0x8e, + 0x90, 0x88, 0x80, 0x77, 0x79, 0x79, 0x74, 0x7a, 0x7b, 0x81, 0x54, + 0x40, 0x93, 0x64, 0x29, 0x74, 0x78, 0x66, 0x5f, 0x81, 0xa3, 0x83, + 0x9f, 0xa5, 0xa1, 0xbe, 0x98, 0x92, 0xa5, 0x92, 0x80, 0x6b, 0x78, + 0x7a, 0x53, 0x65, 0x6e, 0x6b, 0x75, 0x6c, 0x84, 0x8b, 0x8b, 0x91, + 0x8e, 0x9c, 0x8b, 0x83, 0x89, 0x81, 0x71, 0x6e, 0x7b, 0x6e, 0x6e, + 0x79, 0x7f, 0x82, 0x82, 0x8e, 0x8e, 0x91, 0x8e, 0x8d, 0x90, 0x87, + 0x83, 0x80, 0x81, 0x7a, 0x7d, 0x7c, 0x7e, 0x69, 0x3b, 0x85, 0x77, + 0x27, 0x6b, 0x76, 0x68, 0x5f, 0x71, 0xa0, 0x7f, 0x91, 0xa4, 0x9b, + 0xb8, 0x9e, 0x94, 0xae, 0x9a, 0x8a, 0x7b, 0x7f, 0x87, 0x59, 0x65, + 0x75, 0x63, 0x6a, 0x60, 0x7a, 0x7d, 0x74, 0x87, 0x85, 0x92, 0x88, + 0x8a, 0x93, 0x89, 0x86, 0x80, 0x8a, 0x7d, 0x7a, 0x80, 0x7d, 0x80, + 0x7a, 0x84, 0x84, 0x84, 0x84, 0x83, 0x8a, 0x83, 0x82, 0x84, 0x84, + 0x82, 0x7d, 0x85, 0x66, 0x4e, 0x88, 0x75, 0x37, 0x6c, 0x7d, 0x63, + 0x5a, 0x75, 0x94, 0x71, 0x84, 0x99, 0x8e, 0xa2, 0x99, 0x95, 0x9f, + 0xa0, 0x9a, 0x85, 0x8b, 0x95, 0x7a, 0x73, 0x7e, 0x76, 0x72, 0x6b, + 0x70, 0x76, 0x73, 0x78, 0x75, 0x7c, 0x82, 0x7e, 0x81, 0x84, 0x86, + 0x83, 0x81, 0x81, 0x82, 0x82, 0x7f, 0x81, 0x82, 0x82, 0x82, 0x81, + 0x83, 0x83, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7b, 0x7b, 0x7d, 0x7c, + 0x7c, 0x7e, 0x7d, 0x7a, 0x7e, 0x82, 0x7e, 0x7d, 0x80, 0x7f, 0x7e, + 0x7c, 0x7c, 0x7b, 0x7a, 0x7c, 0x7b, 0x7c, 0x7c, 0x7d, 0x80, 0x80, + 0x82, 0x83, 0x83, 0x84, 0x85, 0x84, 0x83, 0x84, 0x86, 0x84, 0x83, + 0x84, 0x86, 0x85, 0x84, 0x84, 0x82, 0x82, 0x81, 0x7d, 0x7c, 0x7c, + 0x7b, 0x79, 0x78, 0x7a, 0x7a, 0x7a, 0x7d, 0x7e, 0x7f, 0x82, 0x84, + 0x83, 0x84, 0x85, 0x83, 0x82, 0x82, 0x80, 0x7e, 0x7e, 0x80, 0x79, + 0x7a, 0x81, 0x79, 0x78, 0x7c, 0x7d, 0x7e, 0x7a, 0x7e, 0x7e, 0x7b, + 0x7f, 0x7e, 0x7c, 0x7d, 0x7e, 0x82, 0x80, 0x80, 0x86, 0x82, 0x84, + 0x86, 0x85, 0x86, 0x83, 0x86, 0x84, 0x7f, 0x82, 0x81, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x81, 0x80, 0x7e, 0x7f, 0x7f, 0x7e, 0x7d, 0x7d, + 0x7c, 0x7b, 0x7c, 0x7d, 0x7c, 0x7d, 0x80, 0x7e, 0x81, 0x82, 0x83, + 0x82, 0x82, 0x84, 0x82, 0x82, 0x83, 0x7d, 0x78, 0x80, 0x7f, 0x76, + 0x77, 0x7a, 0x7d, 0x77, 0x76, 0x7d, 0x7c, 0x7e, 0x7e, 0x7e, 0x81, + 0x81, 0x84, 0x82, 0x81, 0x88, 0x86, 0x81, 0x84, 0x86, 0x85, 0x82, + 0x83, 0x86, 0x80, 0x7f, 0x81, 0x7f, 0x7c, 0x7c, 0x80, 0x7c, 0x7b, + 0x7e, 0x7e, 0x7e, 0x7e, 0x80, 0x80, 0x80, 0x81, 0x7f, 0x7f, 0x80, + 0x80, 0x7d, 0x80, 0x82, 0x7e, 0x7f, 0x81, 0x80, 0x80, 0x82, 0x82, + 0x80, 0x81, 0x82, 0x81, 0x75, 0x7c, 0x86, 0x74, 0x72, 0x7c, 0x7d, + 0x76, 0x6f, 0x7f, 0x7e, 0x75, 0x7f, 0x81, 0x81, 0x82, 0x85, 0x87, + 0x83, 0x8a, 0x8c, 0x80, 0x86, 0x8a, 0x82, 0x7f, 0x7f, 0x87, 0x7f, + 0x79, 0x82, 0x7e, 0x7e, 0x7a, 0x7c, 0x7e, 0x79, 0x7b, 0x7b, 0x7e, + 0x7d, 0x7e, 0x7d, 0x7d, 0x85, 0x7c, 0x81, 0x87, 0x84, 0x83, 0x84, + 0x88, 0x7f, 0x80, 0x82, 0x7f, 0x81, 0x7f, 0x83, 0x81, 0x82, 0x84, + 0x81, 0x6d, 0x7d, 0x8f, 0x5d, 0x6c, 0x88, 0x6e, 0x66, 0x6e, 0x86, + 0x72, 0x6c, 0x8c, 0x80, 0x81, 0x8a, 0x88, 0x90, 0x8f, 0x8b, 0x8d, + 0x8f, 0x91, 0x83, 0x85, 0x93, 0x7e, 0x7c, 0x84, 0x7f, 0x78, 0x71, + 0x7d, 0x75, 0x6d, 0x73, 0x76, 0x75, 0x6e, 0x7b, 0x7f, 0x7b, 0x7f, + 0x87, 0x8e, 0x85, 0x8c, 0x93, 0x8e, 0x8a, 0x8b, 0x8f, 0x82, 0x80, + 0x85, 0x7e, 0x7b, 0x7b, 0x7f, 0x7b, 0x7d, 0x6e, 0x67, 0x8d, 0x64, + 0x55, 0x8a, 0x69, 0x5e, 0x72, 0x76, 0x79, 0x6d, 0x85, 0x87, 0x86, + 0x92, 0x88, 0x9d, 0x9c, 0x87, 0x9c, 0x9c, 0x8b, 0x8b, 0x8c, 0x8f, + 0x7e, 0x7b, 0x85, 0x77, 0x75, 0x6f, 0x76, 0x77, 0x66, 0x71, 0x74, + 0x71, 0x6d, 0x77, 0x7e, 0x74, 0x80, 0x87, 0x89, 0x88, 0x8e, 0x98, + 0x8f, 0x92, 0x95, 0x93, 0x8a, 0x86, 0x8a, 0x80, 0x7b, 0x7b, 0x7c, + 0x76, 0x78, 0x6c, 0x61, 0x89, 0x5f, 0x53, 0x8d, 0x5b, 0x63, 0x77, + 0x67, 0x7c, 0x6d, 0x7d, 0x89, 0x83, 0x8d, 0x8c, 0x9f, 0x96, 0x8f, + 0xa7, 0x99, 0x92, 0x99, 0x8e, 0x92, 0x84, 0x7c, 0x88, 0x76, 0x71, + 0x70, 0x73, 0x6f, 0x62, 0x75, 0x6e, 0x69, 0x75, 0x75, 0x79, 0x78, + 0x81, 0x85, 0x85, 0x89, 0x8e, 0x94, 0x8c, 0x93, 0x95, 0x8e, 0x90, + 0x8d, 0x8c, 0x83, 0x83, 0x81, 0x7a, 0x7c, 0x77, 0x77, 0x62, 0x68, + 0x7f, 0x50, 0x67, 0x79, 0x56, 0x76, 0x67, 0x70, 0x83, 0x6a, 0x89, + 0x89, 0x84, 0x90, 0x8f, 0x9b, 0x90, 0x94, 0xa0, 0x94, 0x95, 0x93, + 0x92, 0x92, 0x83, 0x88, 0x86, 0x78, 0x78, 0x73, 0x75, 0x6b, 0x68, + 0x6e, 0x6c, 0x6b, 0x6a, 0x78, 0x74, 0x76, 0x84, 0x82, 0x88, 0x8a, + 0x92, 0x8f, 0x8d, 0x96, 0x91, 0x8e, 0x8c, 0x8f, 0x89, 0x83, 0x86, + 0x82, 0x7e, 0x7d, 0x7e, 0x7a, 0x71, 0x64, 0x7a, 0x6b, 0x53, 0x7a, + 0x61, 0x63, 0x71, 0x60, 0x83, 0x6c, 0x75, 0x90, 0x7d, 0x8d, 0x8f, + 0x95, 0x9a, 0x8f, 0x9d, 0x9c, 0x92, 0x95, 0x93, 0x93, 0x8b, 0x83, + 0x8b, 0x7f, 0x78, 0x78, 0x76, 0x74, 0x68, 0x6f, 0x6f, 0x68, 0x6b, + 0x6e, 0x73, 0x70, 0x78, 0x82, 0x81, 0x84, 0x8d, 0x91, 0x8e, 0x91, + 0x95, 0x91, 0x8f, 0x8f, 0x8e, 0x88, 0x86, 0x86, 0x80, 0x7e, 0x80, + 0x7d, 0x7b, 0x7b, 0x73, 0x67, 0x7e, 0x6a, 0x59, 0x7f, 0x5e, 0x69, + 0x70, 0x60, 0x85, 0x66, 0x79, 0x8f, 0x76, 0x92, 0x8a, 0x94, 0x9a, + 0x8b, 0x9f, 0x99, 0x91, 0x98, 0x8f, 0x91, 0x8b, 0x84, 0x8a, 0x7e, + 0x7b, 0x7c, 0x76, 0x75, 0x6e, 0x73, 0x71, 0x6b, 0x71, 0x70, 0x74, + 0x71, 0x76, 0x7e, 0x79, 0x80, 0x86, 0x88, 0x88, 0x8d, 0x91, 0x8c, + 0x8e, 0x91, 0x8e, 0x8a, 0x8b, 0x8b, 0x84, 0x82, 0x83, 0x7f, 0x7b, + 0x7d, 0x7e, 0x7a, 0x78, 0x74, 0x6f, 0x7b, 0x69, 0x67, 0x7a, 0x60, + 0x70, 0x6e, 0x69, 0x7f, 0x68, 0x82, 0x84, 0x79, 0x91, 0x86, 0x94, + 0x92, 0x8e, 0x9e, 0x92, 0x93, 0x96, 0x8f, 0x92, 0x8a, 0x86, 0x8a, + 0x7c, 0x7d, 0x7c, 0x75, 0x75, 0x70, 0x74, 0x70, 0x6f, 0x75, 0x74, + 0x75, 0x77, 0x79, 0x7b, 0x7e, 0x7d, 0x82, 0x85, 0x82, 0x89, 0x87, + 0x8a, 0x8a, 0x89, 0x8b, 0x87, 0x8a, 0x87, 0x86, 0x85, 0x84, 0x83, + 0x7f, 0x82, 0x80, 0x7d, 0x81, 0x7e, 0x7d, 0x7a, 0x70, 0x7c, 0x73, + 0x65, 0x7b, 0x67, 0x6d, 0x71, 0x66, 0x7f, 0x69, 0x7a, 0x85, 0x77, + 0x8c, 0x83, 0x8e, 0x92, 0x89, 0x98, 0x93, 0x90, 0x94, 0x8e, 0x91, + 0x8b, 0x85, 0x8d, 0x81, 0x7e, 0x80, 0x7a, 0x7c, 0x73, 0x77, 0x78, + 0x70, 0x75, 0x75, 0x76, 0x76, 0x77, 0x7c, 0x7b, 0x7b, 0x7d, 0x81, + 0x7e, 0x80, 0x85, 0x80, 0x82, 0x84, 0x84, 0x84, 0x84, 0x88, 0x86, + 0x84, 0x88, 0x88, 0x85, 0x86, 0x88, 0x85, 0x83, 0x84, 0x84, 0x82, + 0x83, 0x80, 0x7f, 0x7b, 0x71, 0x7f, 0x6b, 0x69, 0x78, 0x5f, 0x71, + 0x66, 0x68, 0x78, 0x61, 0x7d, 0x78, 0x78, 0x89, 0x81, 0x93, 0x8d, + 0x8e, 0x9d, 0x95, 0x98, 0x99, 0x95, 0x99, 0x8f, 0x8e, 0x90, 0x82, + 0x83, 0x7f, 0x7a, 0x77, 0x70, 0x75, 0x70, 0x6b, 0x70, 0x71, 0x6f, + 0x70, 0x75, 0x78, 0x77, 0x7b, 0x80, 0x80, 0x7f, 0x83, 0x87, 0x82, + 0x86, 0x87, 0x86, 0x87, 0x85, 0x89, 0x85, 0x85, 0x89, 0x84, 0x87, + 0x86, 0x87, 0x84, 0x83, 0x87, 0x82, 0x81, 0x82, 0x82, 0x7e, 0x7e, + 0x7f, 0x79, 0x7d, 0x6b, 0x75, 0x79, 0x5a, 0x78, 0x65, 0x66, 0x75, + 0x5c, 0x83, 0x6b, 0x75, 0x8d, 0x77, 0x92, 0x88, 0x92, 0x9b, 0x8c, + 0x9e, 0x9a, 0x92, 0x98, 0x91, 0x92, 0x8d, 0x84, 0x8b, 0x7f, 0x7b, + 0x7b, 0x75, 0x77, 0x6d, 0x70, 0x72, 0x6c, 0x70, 0x71, 0x74, 0x74, + 0x77, 0x7f, 0x7f, 0x81, 0x87, 0x88, 0x89, 0x89, 0x8a, 0x8a, 0x83, + 0x87, 0x84, 0x7e, 0x81, 0x7d, 0x7e, 0x7a, 0x7b, 0x7e, 0x79, 0x7d, + 0x7e, 0x7f, 0x81, 0x82, 0x85, 0x85, 0x86, 0x88, 0x87, 0x86, 0x88, + 0x87, 0x85, 0x85, 0x86, 0x80, 0x82, 0x7c, 0x6b, 0x84, 0x68, 0x64, + 0x7b, 0x58, 0x75, 0x5f, 0x68, 0x7d, 0x5c, 0x85, 0x78, 0x80, 0x8d, + 0x82, 0x9c, 0x8f, 0x94, 0x9f, 0x95, 0x99, 0x98, 0x94, 0x96, 0x8c, + 0x8d, 0x8a, 0x80, 0x81, 0x7a, 0x79, 0x72, 0x70, 0x72, 0x6c, 0x6d, + 0x6e, 0x70, 0x70, 0x73, 0x78, 0x7a, 0x7d, 0x81, 0x84, 0x86, 0x87, + 0x89, 0x8b, 0x88, 0x8a, 0x86, 0x82, 0x84, 0x7d, 0x7e, 0x7c, 0x7b, + 0x7c, 0x7a, 0x7e, 0x7d, 0x7f, 0x81, 0x81, 0x84, 0x84, 0x86, 0x85, + 0x87, 0x86, 0x85, 0x85, 0x83, 0x84, 0x81, 0x82, 0x81, 0x81, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7b, 0x69, 0x81, 0x71, 0x61, 0x7d, 0x61, 0x75, + 0x67, 0x6d, 0x81, 0x64, 0x86, 0x7d, 0x83, 0x8c, 0x87, 0x9b, 0x8d, + 0x95, 0x9b, 0x94, 0x95, 0x93, 0x94, 0x8e, 0x88, 0x89, 0x83, 0x7e, + 0x7a, 0x7a, 0x76, 0x72, 0x73, 0x72, 0x72, 0x72, 0x75, 0x77, 0x77, + 0x7b, 0x7f, 0x7e, 0x81, 0x85, 0x84, 0x85, 0x84, 0x86, 0x85, 0x80, + 0x83, 0x82, 0x7d, 0x7d, 0x7f, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, + 0x80, 0x7f, 0x80, 0x84, 0x84, 0x84, 0x86, 0x88, 0x86, 0x86, 0x87, + 0x86, 0x83, 0x83, 0x83, 0x7f, 0x7f, 0x7e, 0x7c, 0x7a, 0x7a, 0x7c, + 0x7a, 0x7b, 0x7d, 0x7d, 0x7c, 0x80, 0x7c, 0x77, 0x80, 0x76, 0x76, + 0x77, 0x75, 0x79, 0x72, 0x7b, 0x7a, 0x7a, 0x82, 0x82, 0x87, 0x87, + 0x8c, 0x8f, 0x8c, 0x8f, 0x90, 0x8d, 0x8b, 0x8a, 0x88, 0x83, 0x81, + 0x81, 0x7d, 0x7c, 0x7c, 0x7b, 0x7b, 0x7b, 0x7e, 0x7c, 0x7c, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x81, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x7d, 0x7f, 0x7d, 0x7d, 0x7d, 0x7d, 0x7f, + 0x7c, 0x7f, 0x81, 0x7f, 0x81, 0x81, 0x83, 0x81, 0x81, 0x84, 0x82, + 0x81, 0x82, 0x82, 0x80, 0x7f, 0x81, 0x80, 0x7e, 0x81, 0x81, 0x7f, + 0x81, 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x7d, 0x7e, 0x7e, 0x7e, 0x7c, + 0x7d, 0x7e, 0x7d, 0x7e, 0x7d, 0x7e, 0x80, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7d, 0x7f, 0x7d, 0x7e, 0x7f, 0x7f, 0x81, 0x81, 0x82, 0x84, + 0x84, 0x85, 0x85, 0x85, 0x85, 0x83, 0x84, 0x82, 0x80, 0x82, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x7e, 0x7f, 0x81, + 0x7f, 0x80, 0x80, 0x80, 0x82, 0x80, 0x81, 0x83, 0x80, 0x81, 0x81, + 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x81, 0x7f, 0x81, 0x81, 0x7f, 0x82, + 0x80, 0x81, 0x81, 0x80, 0x82, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x80, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, + 0x80, 0x81, 0x81, 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x7e, 0x7e, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x81, 0x7f, 0x80, 0x81, + 0x80, 0x82, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x81, + 0x7f, 0x7f, 0x80, 0x7e, 0x7f, 0x7d, 0x7d, 0x7f, 0x7c, 0x7e, 0x7f, + 0x7e, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x82, 0x80, 0x80, 0x82, 0x80, + 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7e, 0x81, 0x7f, + 0x7e, 0x7f, 0x7d, 0x7f, 0x7e, 0x7d, 0x80, 0x7c, 0x7e, 0x80, 0x7e, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x7f, + 0x81, 0x82, 0x81, 0x81, 0x82, 0x81, 0x82, 0x82, 0x81, 0x81, 0x80, + 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, + 0x81, 0x80, 0x81, 0x83, 0x82, 0x80, 0x81, 0x81, 0x80, 0x7f, 0x7f, + 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x7f, 0x80, + 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, + 0x81, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, + 0x7c, 0x7d, 0x7c, 0x7d, 0x7d, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x82, 0x81, 0x81, 0x81, 0x82, 0x81, 0x81, 0x82, 0x80, 0x82, 0x81, + 0x81, 0x82, 0x80, 0x82, 0x81, 0x7f, 0x80, 0x7e, 0x7d, 0x7d, 0x7b, + 0x7b, 0x7c, 0x7b, 0x7c, 0x7d, 0x7d, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x81, 0x80, 0x81, 0x81, 0x7f, 0x81, 0x80, 0x80, 0x82, 0x80, 0x82, + 0x81, 0x7f, 0x81, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x81, 0x7f, 0x80, 0x81, 0x7f, 0x81, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, + }, + { // 4 + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7e, 0x7f, 0x80, 0x7d, 0x7f, 0x80, 0x7e, 0x7f, 0x7e, 0x81, 0x7f, + 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7e, 0x7f, 0x7f, + 0x7e, 0x7f, 0x80, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x81, 0x7d, + 0x80, 0x7f, 0x79, 0x81, 0x7c, 0x7c, 0x84, 0x80, 0x81, 0x81, 0x80, + 0x85, 0x7a, 0x82, 0x80, 0x7d, 0x81, 0x7a, 0x80, 0x7d, 0x7e, 0x7e, + 0x80, 0x7e, 0x7f, 0x7f, 0x7c, 0x86, 0x7d, 0x7e, 0x85, 0x7b, 0x81, + 0x83, 0x76, 0x88, 0x78, 0x82, 0x83, 0x76, 0x88, 0x7a, 0x7f, 0x83, + 0x7a, 0x84, 0x7a, 0x80, 0x85, 0x73, 0x8b, 0x79, 0x7e, 0x85, 0x75, + 0x8b, 0x75, 0x83, 0x84, 0x75, 0x8a, 0x78, 0x80, 0x86, 0x75, 0x83, + 0x7d, 0x7d, 0x84, 0x7b, 0x85, 0x7f, 0x7d, 0x7e, 0x7f, 0x84, 0x77, + 0x88, 0x7d, 0x79, 0x8b, 0x71, 0x87, 0x84, 0x6e, 0x8f, 0x77, 0x7a, + 0x89, 0x78, 0x84, 0x7d, 0x7e, 0x82, 0x80, 0x79, 0x7f, 0x89, 0x75, + 0x85, 0x81, 0x74, 0x8f, 0x71, 0x7e, 0x8e, 0x6f, 0x84, 0x86, 0x76, + 0x82, 0x80, 0x80, 0x7d, 0x77, 0x8c, 0x7c, 0x7c, 0x80, 0x80, 0x7d, + 0x7d, 0x84, 0x77, 0x89, 0x7e, 0x76, 0x8d, 0x76, 0x7a, 0x8d, 0x70, + 0x85, 0x8a, 0x6d, 0x8b, 0x81, 0x6f, 0x8c, 0x7f, 0x73, 0x8e, 0x7e, + 0x74, 0x8c, 0x79, 0x7a, 0x8c, 0x71, 0x85, 0x85, 0x74, 0x84, 0x83, + 0x79, 0x7d, 0x8a, 0x74, 0x84, 0x7e, 0x7d, 0x86, 0x77, 0x8a, 0x77, + 0x7e, 0x85, 0x78, 0x81, 0x81, 0x7e, 0x84, 0x7a, 0x7d, 0x83, 0x7b, + 0x83, 0x77, 0x8d, 0x76, 0x80, 0x8a, 0x6d, 0x91, 0x78, 0x76, 0x8b, + 0x7c, 0x78, 0x87, 0x7b, 0x80, 0x7f, 0x7c, 0x83, 0x75, 0x8a, 0x7c, + 0x7b, 0x87, 0x79, 0x7f, 0x81, 0x7d, 0x7f, 0x83, 0x7a, 0x84, 0x7e, + 0x7d, 0x84, 0x77, 0x84, 0x7d, 0x81, 0x81, 0x7b, 0x8b, 0x72, 0x78, + 0x94, 0x6f, 0x7b, 0x98, 0x6d, 0x7b, 0x94, 0x65, 0x87, 0x8e, 0x6c, + 0x8c, 0x7b, 0x80, 0x82, 0x74, 0x8d, 0x79, 0x78, 0x8c, 0x79, 0x7e, + 0x7e, 0x86, 0x7d, 0x77, 0x8d, 0x76, 0x77, 0x91, 0x77, 0x75, 0x93, + 0x76, 0x78, 0x8c, 0x74, 0x83, 0x7b, 0x7e, 0x87, 0x77, 0x86, 0x7c, + 0x78, 0x8c, 0x7c, 0x76, 0x8d, 0x74, 0x7f, 0x8f, 0x6d, 0x8a, 0x7f, + 0x74, 0x8f, 0x71, 0x84, 0x86, 0x78, 0x87, 0x75, 0x88, 0x7d, 0x75, + 0x86, 0x7e, 0x7e, 0x82, 0x7a, 0x85, 0x83, 0x72, 0x89, 0x80, 0x73, + 0x8b, 0x7d, 0x7a, 0x8c, 0x76, 0x81, 0x7f, 0x7e, 0x83, 0x7a, 0x80, + 0x82, 0x7e, 0x7d, 0x83, 0x7e, 0x7c, 0x84, 0x7c, 0x7e, 0x84, 0x7a, + 0x80, 0x83, 0x7e, 0x80, 0x7f, 0x7a, 0x84, 0x7f, 0x77, 0x88, 0x7b, + 0x7d, 0x82, 0x7d, 0x7f, 0x7f, 0x80, 0x79, 0x87, 0x81, 0x71, 0x8d, + 0x80, 0x75, 0x89, 0x7e, 0x79, 0x8a, 0x7a, 0x7b, 0x8a, 0x73, 0x7f, + 0x87, 0x76, 0x81, 0x86, 0x7b, 0x7d, 0x89, 0x78, 0x7c, 0x8a, 0x79, + 0x7e, 0x88, 0x79, 0x7b, 0x88, 0x73, 0x82, 0x8a, 0x72, 0x88, 0x82, + 0x74, 0x83, 0x80, 0x7e, 0x84, 0x7e, 0x7e, 0x82, 0x7c, 0x82, 0x7b, + 0x7f, 0x88, 0x74, 0x87, 0x86, 0x6f, 0x8e, 0x7f, 0x74, 0x8a, 0x7a, + 0x7b, 0x87, 0x7c, 0x7b, 0x85, 0x7f, 0x7e, 0x82, 0x7f, 0x81, 0x7e, + 0x80, 0x83, 0x7e, 0x7e, 0x7e, 0x7f, 0x7a, 0x82, 0x7f, 0x7a, 0x88, + 0x7d, 0x81, 0x83, 0x7e, 0x83, 0x7a, 0x82, 0x7b, 0x7e, 0x80, 0x7b, + 0x83, 0x81, 0x80, 0x7f, 0x86, 0x78, 0x84, 0x84, 0x75, 0x88, 0x7f, + 0x7b, 0x84, 0x7c, 0x7f, 0x81, 0x7c, 0x7c, 0x85, 0x79, 0x80, 0x84, + 0x7a, 0x83, 0x83, 0x7d, 0x81, 0x7f, 0x83, 0x76, 0x87, 0x81, 0x73, + 0x89, 0x7f, 0x78, 0x86, 0x81, 0x78, 0x88, 0x81, 0x75, 0x8d, 0x7d, + 0x7a, 0x86, 0x7a, 0x81, 0x7d, 0x7d, 0x7e, 0x7f, 0x7d, 0x7c, 0x7f, + 0x7b, 0x81, 0x7a, 0x7c, 0x81, 0x7d, 0x7b, 0x82, 0x81, 0x7c, 0x86, + 0x85, 0x7e, 0x8a, 0x85, 0x82, 0x89, 0x85, 0x83, 0x8b, 0x83, 0x83, + 0x86, 0x80, 0x81, 0x80, 0x7b, 0x81, 0x82, 0x78, 0x85, 0x7e, 0x79, + 0x81, 0x7a, 0x7c, 0x81, 0x80, 0x7d, 0x83, 0x7e, 0x80, 0x84, 0x7b, + 0x88, 0x81, 0x84, 0x61, 0x68, 0x91, 0x52, 0x64, 0x75, 0x61, 0x77, + 0x66, 0x74, 0x81, 0x89, 0x87, 0x87, 0xa5, 0x99, 0x9b, 0x9e, 0x9e, + 0xa0, 0x97, 0x8f, 0x8a, 0x8d, 0x80, 0x72, 0x77, 0x76, 0x6a, 0x68, + 0x6c, 0x6d, 0x70, 0x70, 0x78, 0x80, 0x81, 0x81, 0x8b, 0x8d, 0x8a, + 0x8c, 0x8e, 0x8c, 0x88, 0x85, 0x84, 0x85, 0x7d, 0x7a, 0x7e, 0x7b, + 0x79, 0x79, 0x7c, 0x7e, 0x7c, 0x81, 0x7f, 0x84, 0x88, 0x84, 0x83, + 0x53, 0x6b, 0x95, 0x3e, 0x53, 0x79, 0x57, 0x69, 0x61, 0x6f, 0x7f, + 0x8c, 0x8a, 0x83, 0xb1, 0xaa, 0x96, 0xa5, 0xac, 0xa3, 0x9c, 0x93, + 0x8a, 0x91, 0x82, 0x72, 0x72, 0x78, 0x6b, 0x63, 0x69, 0x6c, 0x6e, + 0x65, 0x72, 0x79, 0x79, 0x7d, 0x84, 0x8c, 0x89, 0x8d, 0x8e, 0x90, + 0x90, 0x8a, 0x8b, 0x8b, 0x85, 0x7f, 0x80, 0x83, 0x77, 0x7b, 0x7c, + 0x7a, 0x79, 0x7d, 0x7d, 0x7e, 0x85, 0x7d, 0x86, 0x84, 0x86, 0x62, + 0x4d, 0x98, 0x58, 0x37, 0x7b, 0x5b, 0x60, 0x64, 0x6c, 0x77, 0x86, + 0x98, 0x7d, 0xa0, 0xbb, 0x9c, 0x9d, 0xb1, 0xa9, 0x9c, 0x9b, 0x8a, + 0x8d, 0x89, 0x7a, 0x6b, 0x71, 0x78, 0x5f, 0x63, 0x6c, 0x70, 0x67, + 0x66, 0x7a, 0x79, 0x7b, 0x7b, 0x89, 0x8f, 0x89, 0x8d, 0x8f, 0x98, + 0x8c, 0x89, 0x8e, 0x8a, 0x83, 0x7c, 0x82, 0x7f, 0x79, 0x77, 0x7a, + 0x7c, 0x78, 0x7b, 0x7e, 0x81, 0x82, 0x7d, 0x85, 0x85, 0x87, 0x7e, + 0x41, 0x70, 0x95, 0x33, 0x50, 0x73, 0x5e, 0x61, 0x5e, 0x78, 0x77, + 0x98, 0x90, 0x7d, 0xb4, 0xb8, 0x98, 0x9e, 0xb5, 0xa7, 0x9b, 0x92, + 0x8c, 0x89, 0x86, 0x75, 0x63, 0x77, 0x74, 0x5b, 0x61, 0x6f, 0x75, + 0x68, 0x69, 0x75, 0x84, 0x7e, 0x78, 0x88, 0x94, 0x8d, 0x86, 0x90, + 0x95, 0x8d, 0x87, 0x84, 0x88, 0x85, 0x7b, 0x78, 0x80, 0x7d, 0x75, + 0x78, 0x79, 0x7b, 0x7b, 0x79, 0x7e, 0x80, 0x81, 0x7d, 0x85, 0x87, + 0x8b, 0x7d, 0x42, 0x79, 0x8c, 0x3c, 0x57, 0x6b, 0x68, 0x5e, 0x63, + 0x76, 0x72, 0x9a, 0x8c, 0x81, 0xa8, 0xb3, 0x9e, 0x96, 0xae, 0xa8, + 0x99, 0x94, 0x8c, 0x87, 0x89, 0x7b, 0x6a, 0x72, 0x76, 0x6b, 0x63, + 0x6f, 0x75, 0x6e, 0x71, 0x72, 0x7c, 0x81, 0x7e, 0x7d, 0x88, 0x91, + 0x86, 0x84, 0x8a, 0x8c, 0x87, 0x81, 0x82, 0x84, 0x81, 0x79, 0x78, + 0x7a, 0x7e, 0x78, 0x76, 0x7c, 0x7e, 0x7b, 0x7b, 0x7c, 0x83, 0x81, + 0x7d, 0x80, 0x84, 0x87, 0x83, 0x8c, 0x69, 0x5c, 0x8f, 0x6f, 0x54, + 0x67, 0x6e, 0x6b, 0x60, 0x73, 0x6a, 0x79, 0x8e, 0x80, 0x85, 0x98, + 0xa6, 0x96, 0x97, 0xa6, 0x9f, 0x9b, 0x98, 0x8e, 0x87, 0x8c, 0x85, + 0x72, 0x75, 0x7c, 0x70, 0x6a, 0x72, 0x73, 0x70, 0x72, 0x74, 0x74, + 0x7e, 0x7e, 0x79, 0x7d, 0x87, 0x84, 0x7f, 0x81, 0x85, 0x83, 0x83, + 0x81, 0x7f, 0x84, 0x81, 0x7d, 0x7c, 0x81, 0x7f, 0x7a, 0x7c, 0x7d, + 0x7d, 0x7d, 0x7c, 0x7d, 0x7f, 0x7e, 0x7e, 0x7d, 0x81, 0x80, 0x7f, + 0x80, 0x82, 0x82, 0x80, 0x76, 0x77, 0x7c, 0x77, 0x75, 0x72, 0x75, + 0x75, 0x75, 0x79, 0x77, 0x7c, 0x82, 0x84, 0x86, 0x89, 0x8d, 0x8c, + 0x8d, 0x8b, 0x8b, 0x89, 0x8a, 0x86, 0x84, 0x83, 0x82, 0x82, 0x7e, + 0x7f, 0x7c, 0x7d, 0x7e, 0x7c, 0x7a, 0x7c, 0x7c, 0x7b, 0x7b, 0x7c, + 0x7c, 0x7d, 0x7e, 0x7d, 0x7e, 0x7f, 0x81, 0x80, 0x80, 0x80, 0x82, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7d, 0x7e, 0x7e, 0x7e, 0x7c, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7e, 0x7d, 0x7d, 0x7d, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7f, 0x81, 0x80, 0x81, 0x81, 0x81, 0x82, 0x81, + 0x80, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7d, 0x7f, 0x7e, 0x7d, 0x7e, + 0x7d, 0x7f, 0x7e, 0x7f, 0x80, 0x81, 0x80, 0x81, 0x81, 0x83, 0x82, + 0x83, 0x82, 0x84, 0x82, 0x82, 0x82, 0x81, 0x82, 0x81, 0x81, 0x7f, + 0x81, 0x7f, 0x7e, 0x80, 0x7e, 0x7e, 0x7c, 0x7d, 0x7d, 0x7c, 0x7d, + 0x7b, 0x7c, 0x7d, 0x7d, 0x7c, 0x7e, 0x7d, 0x80, 0x7d, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x7f, + 0x7e, 0x7d, 0x7e, 0x7d, 0x7e, 0x7d, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7e, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x81, 0x81, 0x7f, 0x81, 0x81, + 0x82, 0x81, 0x80, 0x81, 0x80, 0x81, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7d, 0x7f, 0x7d, 0x7f, 0x7e, 0x7f, 0x7f, 0x80, + 0x7f, 0x81, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7d, + 0x7e, 0x7d, 0x7d, 0x7d, 0x7f, 0x7d, 0x7d, 0x7f, 0x7e, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x81, 0x7f, 0x81, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7d, 0x7f, 0x7d, 0x7e, 0x7d, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x7f, + 0x80, 0x7f, 0x81, 0x81, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7d, 0x7d, + 0x7d, 0x7c, 0x7d, 0x7c, 0x7d, 0x7e, 0x7d, 0x7f, 0x7e, 0x80, 0x80, + 0x81, 0x82, 0x81, 0x81, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7d, 0x7e, 0x7f, 0x7f, 0x7d, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7e, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7e, 0x80, 0x7e, 0x80, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7f, 0x7d, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x80, + 0x7e, 0x80, 0x7e, 0x7e, 0x81, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7d, 0x7f, 0x7e, 0x7d, 0x7c, 0x77, 0x82, 0x82, + 0x7e, 0x80, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x83, 0x7f, 0x7c, + 0x86, 0x75, 0x7c, 0x85, 0x81, 0x85, 0x84, 0x82, 0x7b, 0x7e, 0x81, + 0x80, 0x7f, 0x7b, 0x7d, 0x7e, 0x7d, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, + 0x7f, 0x81, 0x80, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x81, 0x7e, 0x7e, + 0x7f, 0x7e, 0x7e, 0x80, 0x7c, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, + 0x79, 0x7c, 0x82, 0x82, 0x82, 0x84, 0x81, 0x80, 0x81, 0x78, 0x7f, + 0x7e, 0x7f, 0x7c, 0x79, 0x7e, 0x7d, 0x7f, 0x75, 0x7f, 0x85, 0x82, + 0x85, 0x86, 0x85, 0x83, 0x7f, 0x7c, 0x82, 0x83, 0x81, 0x80, 0x7e, + 0x80, 0x7d, 0x7b, 0x7c, 0x7c, 0x7d, 0x7c, 0x78, 0x7b, 0x7c, 0x7e, + 0x7e, 0x7d, 0x80, 0x81, 0x81, 0x80, 0x83, 0x84, 0x82, 0x81, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7c, 0x7f, 0x7d, 0x7f, 0x7d, 0x7e, 0x7f, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7d, 0x7e, + 0x7f, 0x7c, 0x7e, 0x7f, 0x80, 0x80, 0x7d, 0x81, 0x7f, 0x7d, 0x81, + 0x7e, 0x80, 0x81, 0x7f, 0x80, 0x81, 0x82, 0x7e, 0x81, 0x83, 0x80, + 0x81, 0x81, 0x80, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7d, 0x7c, + 0x81, 0x7c, 0x7d, 0x7f, 0x7a, 0x80, 0x81, 0x7c, 0x7e, 0x83, 0x80, + 0x7d, 0x7f, 0x83, 0x81, 0x81, 0x7f, 0x7f, 0x7f, 0x81, 0x7a, 0x7e, + 0x81, 0x7d, 0x7d, 0x7c, 0x7e, 0x7f, 0x7d, 0x7d, 0x81, 0x7d, 0x7f, + 0x7d, 0x7b, 0x7c, 0x7a, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7f, 0x7e, + 0x82, 0x84, 0x85, 0x87, 0x89, 0x8a, 0x8b, 0x8d, 0x88, 0x8a, 0x8a, + 0x85, 0x84, 0x83, 0x83, 0x7f, 0x80, 0x7e, 0x81, 0x7e, 0x7b, 0x7d, + 0x7e, 0x7d, 0x7d, 0x7d, 0x7f, 0x7d, 0x7f, 0x80, 0x7f, 0x80, 0x6d, + 0x58, 0x70, 0x77, 0x59, 0x5e, 0x65, 0x6f, 0x71, 0x75, 0x7e, 0x7b, + 0x93, 0xa3, 0x94, 0x92, 0xa3, 0xab, 0x9e, 0x94, 0x98, 0x92, 0x8e, + 0x89, 0x79, 0x72, 0x76, 0x6d, 0x64, 0x69, 0x6b, 0x6e, 0x72, 0x7c, + 0x7e, 0x82, 0x8f, 0x8d, 0x90, 0x92, 0x96, 0x93, 0x8e, 0x90, 0x89, + 0x87, 0x82, 0x7d, 0x7a, 0x7a, 0x7d, 0x78, 0x7e, 0x7d, 0x7c, 0x6c, + 0x40, 0x65, 0x7c, 0x45, 0x4b, 0x58, 0x67, 0x6c, 0x64, 0x82, 0x7a, + 0x8f, 0xb6, 0x9d, 0x96, 0xb3, 0xbf, 0xac, 0x96, 0x9d, 0xa2, 0x89, + 0x84, 0x7f, 0x63, 0x72, 0x77, 0x61, 0x58, 0x60, 0x74, 0x60, 0x62, + 0x7d, 0x76, 0x82, 0x89, 0x8f, 0x8e, 0x96, 0xa3, 0x8d, 0x93, 0x9d, + 0x94, 0x8a, 0x8b, 0x91, 0x7f, 0x7e, 0x87, 0x7d, 0x7e, 0x82, 0x81, + 0x7d, 0x6c, 0x44, 0x5c, 0x7d, 0x3e, 0x3f, 0x55, 0x5e, 0x69, 0x52, + 0x7a, 0x7e, 0x89, 0xb5, 0x98, 0x9c, 0xbd, 0xc5, 0xb3, 0x98, 0xab, + 0xb1, 0x8e, 0x80, 0x81, 0x6d, 0x71, 0x6e, 0x54, 0x59, 0x5e, 0x73, + 0x64, 0x57, 0x77, 0x77, 0x7e, 0x81, 0x83, 0x94, 0x91, 0x9c, 0x8d, + 0x8f, 0xa0, 0x94, 0x8c, 0x8a, 0x93, 0x90, 0x80, 0x84, 0x83, 0x86, + 0x85, 0x80, 0x84, 0x7e, 0x81, 0x58, 0x40, 0x78, 0x64, 0x31, 0x48, + 0x57, 0x66, 0x57, 0x5d, 0x81, 0x7d, 0x9c, 0xab, 0x90, 0xad, 0xc8, + 0xbb, 0xa6, 0x9e, 0xb9, 0xa8, 0x7f, 0x84, 0x7e, 0x6f, 0x73, 0x5d, + 0x56, 0x5e, 0x65, 0x6b, 0x53, 0x6a, 0x87, 0x75, 0x78, 0x81, 0x90, + 0x92, 0x87, 0x92, 0x8c, 0x96, 0x95, 0x83, 0x89, 0x90, 0x8f, 0x7f, + 0x81, 0x91, 0x84, 0x80, 0x84, 0x88, 0x89, 0x85, 0x89, 0x80, 0x71, + 0x56, 0x60, 0x73, 0x42, 0x41, 0x58, 0x57, 0x5a, 0x54, 0x6f, 0x7e, + 0x83, 0x9e, 0x99, 0x9f, 0xbd, 0xbb, 0xab, 0xa7, 0xb4, 0xb0, 0x91, + 0x85, 0x8d, 0x7b, 0x71, 0x6a, 0x59, 0x62, 0x61, 0x61, 0x5c, 0x60, + 0x7b, 0x76, 0x6f, 0x81, 0x8a, 0x89, 0x86, 0x8f, 0x8e, 0x8c, 0x93, + 0x89, 0x86, 0x8b, 0x8b, 0x82, 0x7f, 0x8b, 0x87, 0x84, 0x83, 0x87, + 0x8b, 0x87, 0x88, 0x89, 0x88, 0x84, 0x76, 0x5a, 0x57, 0x74, 0x54, + 0x35, 0x53, 0x5c, 0x5b, 0x51, 0x62, 0x80, 0x8e, 0x93, 0xab, 0xaa, + 0x9c, 0xb3, 0xb5, 0xa2, 0x9e, 0x9d, 0x95, 0x8a, 0x7a, 0x79, 0x70, + 0x6d, 0x67, 0x59, 0x69, 0x6b, 0x60, 0x68, 0x72, 0x7e, 0x7d, 0x7f, + 0x8a, 0x8d, 0x93, 0x8c, 0x8c, 0x95, 0x89, 0x83, 0x82, 0x82, 0x78, + 0x74, 0x78, 0x73, 0x76, 0x75, 0x79, 0x80, 0x83, 0x84, 0x89, 0x90, + 0x91, 0x90, 0x95, 0x93, 0x93, 0x91, 0x8d, 0x82, 0x70, 0x61, 0x6b, + 0x64, 0x3c, 0x51, 0x5a, 0x49, 0x54, 0x57, 0x69, 0x77, 0x7e, 0x8a, + 0x93, 0xad, 0xae, 0xa2, 0xb7, 0xba, 0xaa, 0xa7, 0xa0, 0x9a, 0x92, + 0x7f, 0x79, 0x72, 0x6e, 0x66, 0x58, 0x65, 0x67, 0x5f, 0x66, 0x6d, + 0x79, 0x79, 0x7c, 0x85, 0x89, 0x8e, 0x8c, 0x85, 0x93, 0x8d, 0x7f, + 0x83, 0x87, 0x7c, 0x75, 0x7d, 0x7b, 0x79, 0x7d, 0x7e, 0x82, 0x87, + 0x86, 0x8a, 0x91, 0x90, 0x8a, 0x91, 0x90, 0x8a, 0x89, 0x87, 0x87, + 0x7d, 0x73, 0x60, 0x5a, 0x71, 0x4e, 0x3d, 0x60, 0x56, 0x51, 0x5b, + 0x66, 0x79, 0x7c, 0x8a, 0x91, 0xa0, 0xb5, 0xa8, 0xa5, 0xbf, 0xb5, + 0xa5, 0xa3, 0x9e, 0x9a, 0x87, 0x7d, 0x77, 0x6c, 0x6f, 0x5c, 0x58, + 0x68, 0x63, 0x5d, 0x64, 0x6e, 0x76, 0x73, 0x7c, 0x85, 0x89, 0x8e, + 0x8b, 0x90, 0x95, 0x8c, 0x8c, 0x8a, 0x89, 0x82, 0x7f, 0x7f, 0x7d, + 0x7e, 0x79, 0x7d, 0x7e, 0x7f, 0x7c, 0x80, 0x84, 0x7f, 0x81, 0x7f, + 0x7f, 0x80, 0x80, 0x7d, 0x7f, 0x81, 0x7f, 0x7e, 0x7f, 0x7d, 0x77, + 0x73, 0x7d, 0x72, 0x6c, 0x73, 0x70, 0x70, 0x71, 0x74, 0x78, 0x79, + 0x81, 0x82, 0x82, 0x8d, 0x8e, 0x8b, 0x92, 0x92, 0x91, 0x8f, 0x8f, + 0x8f, 0x89, 0x8a, 0x87, 0x7f, 0x82, 0x7f, 0x7b, 0x79, 0x7b, 0x79, + 0x75, 0x77, 0x79, 0x78, 0x77, 0x7b, 0x79, 0x7b, 0x7d, 0x7b, 0x7d, + 0x7e, 0x81, 0x7d, 0x7d, 0x82, 0x7d, 0x7e, 0x80, 0x81, 0x80, 0x80, + 0x81, 0x7f, 0x82, 0x81, 0x81, 0x82, 0x84, 0x81, 0x81, 0x82, 0x82, + 0x80, 0x83, 0x81, 0x81, 0x80, 0x82, 0x81, 0x81, 0x81, 0x80, 0x7f, + 0x80, 0x7d, 0x7d, 0x7d, 0x78, 0x77, 0x7b, 0x76, 0x6f, 0x76, 0x72, + 0x72, 0x74, 0x75, 0x76, 0x79, 0x7e, 0x7f, 0x7f, 0x89, 0x89, 0x88, + 0x8f, 0x91, 0x8e, 0x90, 0x8e, 0x8e, 0x89, 0x8a, 0x87, 0x80, 0x83, + 0x7f, 0x7a, 0x7b, 0x7c, 0x77, 0x77, 0x78, 0x7a, 0x77, 0x79, 0x7a, + 0x78, 0x7b, 0x7a, 0x7a, 0x7e, 0x7d, 0x7d, 0x7d, 0x81, 0x81, 0x7d, + 0x82, 0x85, 0x7d, 0x82, 0x81, 0x80, 0x7e, 0x81, 0x80, 0x7d, 0x82, + 0x7e, 0x80, 0x82, 0x7f, 0x80, 0x81, 0x83, 0x7f, 0x83, 0x83, 0x83, + 0x81, 0x84, 0x82, 0x83, 0x82, 0x80, 0x82, 0x82, 0x80, 0x80, 0x80, + 0x7d, 0x7b, 0x73, 0x70, 0x7a, 0x6c, 0x67, 0x74, 0x6c, 0x6e, 0x71, + 0x74, 0x79, 0x7d, 0x81, 0x84, 0x8c, 0x91, 0x8d, 0x92, 0x9b, 0x92, + 0x92, 0x94, 0x8f, 0x8d, 0x87, 0x82, 0x81, 0x7c, 0x78, 0x73, 0x75, + 0x75, 0x6e, 0x72, 0x74, 0x75, 0x76, 0x77, 0x7b, 0x80, 0x7e, 0x81, + 0x82, 0x86, 0x84, 0x83, 0x85, 0x85, 0x82, 0x80, 0x81, 0x7d, 0x7c, + 0x7a, 0x78, 0x78, 0x77, 0x78, 0x79, 0x7b, 0x7c, 0x81, 0x84, 0x84, + 0x87, 0x8a, 0x8b, 0x8b, 0x8a, 0x8b, 0x8a, 0x86, 0x85, 0x82, 0x83, + 0x80, 0x7f, 0x80, 0x7d, 0x7d, 0x7f, 0x78, 0x7a, 0x6c, 0x5b, 0x81, + 0x64, 0x4a, 0x7c, 0x61, 0x60, 0x71, 0x6c, 0x82, 0x80, 0x85, 0x90, + 0x99, 0xa4, 0x92, 0x9f, 0xae, 0x95, 0x98, 0x9c, 0x8c, 0x90, 0x7e, + 0x7a, 0x81, 0x6f, 0x6d, 0x6a, 0x70, 0x69, 0x64, 0x73, 0x71, 0x71, + 0x79, 0x78, 0x85, 0x85, 0x80, 0x8e, 0x8e, 0x8b, 0x89, 0x8c, 0x8f, + 0x84, 0x84, 0x81, 0x7c, 0x7b, 0x72, 0x70, 0x73, 0x6b, 0x6d, 0x6f, + 0x73, 0x75, 0x7a, 0x80, 0x85, 0x8a, 0x8d, 0x92, 0x93, 0x92, 0x93, + 0x93, 0x8e, 0x89, 0x88, 0x84, 0x7e, 0x7a, 0x79, 0x78, 0x75, 0x76, + 0x78, 0x7e, 0x7a, 0x7c, 0x7c, 0x83, 0x68, 0x5c, 0x95, 0x55, 0x4e, + 0x8b, 0x57, 0x69, 0x73, 0x6a, 0x8d, 0x7f, 0x84, 0x97, 0x9f, 0x9e, + 0x90, 0xa7, 0xab, 0x89, 0x9c, 0x95, 0x86, 0x8d, 0x6f, 0x7e, 0x7c, + 0x64, 0x6d, 0x6f, 0x6f, 0x69, 0x6d, 0x7d, 0x75, 0x79, 0x80, 0x83, + 0x8e, 0x83, 0x86, 0x99, 0x8a, 0x86, 0x8c, 0x8b, 0x86, 0x7a, 0x7f, + 0x7b, 0x74, 0x71, 0x69, 0x73, 0x70, 0x62, 0x71, 0x7b, 0x6e, 0x76, + 0x85, 0x84, 0x82, 0x8b, 0x91, 0x92, 0x8d, 0x91, 0x97, 0x90, 0x85, + 0x8c, 0x8d, 0x80, 0x7d, 0x82, 0x7e, 0x78, 0x77, 0x7c, 0x7a, 0x77, + 0x79, 0x81, 0x7f, 0x79, 0x80, 0x7e, 0x7c, 0x6a, 0x61, 0x7f, 0x60, + 0x4e, 0x75, 0x62, 0x65, 0x6e, 0x6e, 0x89, 0x82, 0x86, 0x9b, 0xa1, + 0xa2, 0x9b, 0xaa, 0xac, 0x95, 0x9b, 0x99, 0x8c, 0x87, 0x75, 0x7b, + 0x75, 0x63, 0x68, 0x69, 0x6a, 0x63, 0x69, 0x77, 0x75, 0x77, 0x82, + 0x87, 0x8e, 0x87, 0x8f, 0x98, 0x8c, 0x8b, 0x8c, 0x8c, 0x84, 0x79, + 0x7d, 0x78, 0x72, 0x6e, 0x6f, 0x6f, 0x6c, 0x6f, 0x70, 0x77, 0x78, + 0x79, 0x82, 0x84, 0x85, 0x86, 0x90, 0x8b, 0x88, 0x8e, 0x8c, 0x89, + 0x85, 0x87, 0x86, 0x80, 0x81, 0x80, 0x82, 0x7c, 0x7f, 0x83, 0x7f, + 0x7e, 0x80, 0x83, 0x82, 0x7f, 0x85, 0x83, 0x81, 0x7c, 0x7c, 0x71, + 0x56, 0x7c, 0x63, 0x42, 0x75, 0x5d, 0x5c, 0x6f, 0x6b, 0x83, 0x82, + 0x8b, 0x9a, 0xa3, 0xa7, 0x9e, 0xae, 0xb0, 0x97, 0xa0, 0x9a, 0x8a, + 0x88, 0x73, 0x79, 0x73, 0x62, 0x65, 0x68, 0x6a, 0x61, 0x6b, 0x78, + 0x73, 0x79, 0x83, 0x86, 0x8f, 0x87, 0x8d, 0x95, 0x8c, 0x88, 0x89, + 0x88, 0x80, 0x79, 0x7d, 0x75, 0x73, 0x6f, 0x71, 0x74, 0x71, 0x6c, + 0x7a, 0x7c, 0x74, 0x7e, 0x86, 0x86, 0x85, 0x88, 0x90, 0x89, 0x88, + 0x89, 0x8b, 0x85, 0x7f, 0x86, 0x82, 0x7e, 0x7e, 0x81, 0x80, 0x7c, + 0x81, 0x83, 0x81, 0x7f, 0x83, 0x83, 0x7e, 0x81, 0x81, 0x81, 0x7d, + 0x80, 0x7e, 0x80, 0x75, 0x72, 0x6b, 0x63, 0x73, 0x55, 0x5f, 0x73, + 0x5f, 0x70, 0x75, 0x80, 0x87, 0x89, 0x9a, 0x9e, 0xa2, 0xa1, 0xa0, + 0xa7, 0x9a, 0x91, 0x93, 0x85, 0x80, 0x75, 0x70, 0x73, 0x65, 0x66, + 0x6d, 0x6e, 0x6e, 0x72, 0x80, 0x7f, 0x82, 0x89, 0x8f, 0x90, 0x8b, + 0x8e, 0x8f, 0x88, 0x83, 0x81, 0x81, 0x7a, 0x73, 0x76, 0x75, 0x72, + 0x70, 0x74, 0x76, 0x73, 0x75, 0x7c, 0x7d, 0x79, 0x7e, 0x85, 0x81, + 0x81, 0x86, 0x89, 0x85, 0x87, 0x89, 0x89, 0x85, 0x86, 0x87, 0x85, + 0x81, 0x81, 0x82, 0x7c, 0x7c, 0x7e, 0x7e, 0x7b, 0x7b, 0x7e, 0x7c, + 0x7c, 0x7e, 0x80, 0x80, 0x7f, 0x82, 0x82, 0x81, 0x80, 0x82, 0x82, + 0x78, 0x65, 0x78, 0x6f, 0x58, 0x6b, 0x6f, 0x68, 0x6e, 0x7a, 0x81, + 0x84, 0x8c, 0x92, 0x9e, 0x9a, 0x97, 0x9f, 0x98, 0x90, 0x8d, 0x8c, + 0x81, 0x7b, 0x78, 0x76, 0x74, 0x70, 0x72, 0x79, 0x77, 0x78, 0x7f, + 0x83, 0x80, 0x84, 0x88, 0x87, 0x85, 0x83, 0x84, 0x82, 0x7e, 0x7b, + 0x7f, 0x7b, 0x76, 0x7b, 0x79, 0x77, 0x77, 0x78, 0x78, 0x76, 0x78, + 0x7c, 0x7b, 0x7a, 0x7f, 0x82, 0x82, 0x84, 0x88, 0x8a, 0x88, 0x8a, + 0x8b, 0x8a, 0x86, 0x84, 0x85, 0x80, 0x7d, 0x7c, 0x7d, 0x79, 0x79, + 0x7a, 0x7d, 0x7b, 0x7d, 0x80, 0x80, 0x81, 0x81, 0x83, 0x84, 0x80, + 0x83, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, 0x7a, 0x7f, 0x71, 0x66, 0x7f, + 0x68, 0x62, 0x73, 0x71, 0x6f, 0x75, 0x80, 0x7f, 0x8a, 0x89, 0x8f, + 0x99, 0x90, 0x92, 0x96, 0x91, 0x89, 0x8d, 0x88, 0x82, 0x82, 0x7d, + 0x7e, 0x7d, 0x78, 0x7c, 0x7c, 0x78, 0x78, 0x7e, 0x7a, 0x79, 0x7c, + 0x7d, 0x7e, 0x7c, 0x7e, 0x80, 0x80, 0x80, 0x81, 0x83, 0x7f, 0x80, + 0x81, 0x7d, 0x7c, 0x7b, 0x7c, 0x79, 0x7a, 0x7a, 0x7d, 0x7c, 0x7e, + 0x80, 0x82, 0x82, 0x84, 0x84, 0x85, 0x84, 0x83, 0x84, 0x82, 0x81, + 0x7f, 0x7f, 0x7c, 0x7d, 0x7d, 0x7d, 0x7c, 0x7e, 0x7e, 0x7f, 0x80, + 0x7e, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x7e, 0x7f, 0x7e, 0x7c, 0x7d, + 0x7d, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7f, 0x7e, 0x7f, 0x80, 0x81, + 0x81, 0x7e, 0x7e, 0x80, 0x7e, 0x7d, 0x7f, 0x80, 0x7d, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x81, 0x7f, 0x81, 0x81, 0x82, 0x82, 0x84, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x81, 0x81, 0x80, 0x7f, 0x7d, + 0x80, 0x7e, 0x7d, 0x7c, 0x7f, 0x7d, 0x7d, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, 0x7f, 0x7d, 0x7e, + 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x80, 0x81, 0x80, 0x81, 0x81, 0x81, + 0x80, 0x81, 0x81, 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x7e, 0x7f, 0x7e, + 0x7d, 0x7d, 0x7e, 0x7b, 0x7b, 0x7d, 0x7b, 0x7a, 0x7c, 0x7b, 0x7c, + 0x7c, 0x7e, 0x7d, 0x80, 0x7f, 0x81, 0x81, 0x82, 0x81, 0x83, 0x82, + 0x80, 0x82, 0x81, 0x81, 0x80, 0x81, 0x81, 0x82, 0x80, 0x81, 0x82, + 0x80, 0x81, 0x80, 0x82, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x81, 0x80, 0x81, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, 0x7c, 0x7e, 0x7e, 0x7d, + 0x7e, 0x7c, 0x7e, 0x7f, 0x7e, 0x7d, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, + 0x7e, 0x7c, 0x7c, 0x7c, 0x7d, 0x7c, 0x7d, 0x7d, 0x7f, 0x7e, 0x80, + 0x81, 0x82, 0x81, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x83, 0x81, + 0x82, 0x80, 0x80, 0x7e, 0x7f, 0x7e, 0x7c, 0x7e, 0x7d, 0x7e, 0x7d, + 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x81, 0x81, 0x82, 0x81, 0x81, + 0x80, + }, + { // 5 + 0x7f, 0x7f, 0x7f, 0x7c, 0x7a, 0x7c, 0x7d, 0x7a, 0x7b, 0x81, 0x83, + 0x82, 0x85, 0x87, 0x87, 0x88, 0x87, 0x84, 0x83, 0x84, 0x81, 0x7c, + 0x7c, 0x7f, 0x7d, 0x7a, 0x7c, 0x7f, 0x7e, 0x7e, 0x81, 0x82, 0x82, + 0x83, 0x82, 0x82, 0x83, 0x81, 0x7e, 0x7e, 0x7f, 0x7c, 0x7b, 0x7c, + 0x7c, 0x7b, 0x7c, 0x7d, 0x7d, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x81, 0x82, 0x81, 0x82, 0x81, 0x82, 0x82, 0x82, 0x82, + 0x81, 0x82, 0x81, 0x83, 0x83, 0x83, 0x83, 0x83, 0x85, 0x84, 0x84, + 0x85, 0x85, 0x83, 0x78, 0x5c, 0x68, 0x7a, 0x57, 0x5d, 0x6f, 0x69, + 0x7e, 0x81, 0x7e, 0x96, 0xa6, 0x9f, 0x99, 0xa1, 0xa2, 0x94, 0x89, + 0x7e, 0x74, 0x79, 0x6c, 0x5b, 0x69, 0x70, 0x6f, 0x73, 0x7e, 0x8b, + 0x92, 0x90, 0x91, 0x9a, 0x95, 0x89, 0x84, 0x82, 0x7b, 0x74, 0x6e, + 0x71, 0x7a, 0x77, 0x7d, 0x8a, 0x8d, 0x91, 0x98, 0x99, 0x98, 0x92, + 0x54, 0x4f, 0x83, 0x49, 0x34, 0x5b, 0x52, 0x70, 0x82, 0x74, 0x95, + 0xbe, 0xb8, 0xa4, 0xa3, 0xaf, 0xa2, 0x7b, 0x6d, 0x62, 0x64, 0x67, + 0x46, 0x56, 0x7c, 0x81, 0x89, 0x8d, 0xa2, 0xb5, 0xa7, 0x94, 0x89, + 0x8f, 0x7f, 0x5b, 0x56, 0x60, 0x62, 0x59, 0x66, 0x80, 0x90, 0x95, + 0x96, 0xa5, 0xaa, 0x9c, 0x8a, 0x87, 0x87, 0x78, 0x6d, 0x6d, 0x76, + 0x7a, 0x7e, 0x85, 0x8b, 0x81, 0x50, 0x6a, 0x8b, 0x53, 0x5d, 0x72, + 0x6d, 0x8b, 0x8b, 0x7f, 0x99, 0xb0, 0x9f, 0x88, 0x87, 0x92, 0x81, + 0x66, 0x68, 0x67, 0x77, 0x7d, 0x68, 0x80, 0x9d, 0x98, 0x94, 0x8e, + 0x95, 0x96, 0x7e, 0x70, 0x6c, 0x72, 0x69, 0x59, 0x68, 0x7e, 0x81, + 0x7f, 0x8a, 0x98, 0x97, 0x8f, 0x87, 0x8b, 0x89, 0x7a, 0x74, 0x7b, + 0x81, 0x7e, 0x7f, 0x87, 0x8e, 0x91, 0x91, 0x92, 0x8f, 0x7f, 0x40, + 0x38, 0x78, 0x52, 0x3b, 0x72, 0x7c, 0x96, 0xb3, 0x98, 0x9d, 0xc4, + 0xa8, 0x75, 0x70, 0x6e, 0x67, 0x59, 0x4f, 0x65, 0x86, 0x9a, 0x90, + 0x94, 0xb5, 0xaf, 0x94, 0x82, 0x71, 0x73, 0x68, 0x50, 0x58, 0x71, + 0x7e, 0x82, 0x8c, 0x99, 0xa1, 0x97, 0x83, 0x7d, 0x7d, 0x6b, 0x61, + 0x6c, 0x7c, 0x84, 0x85, 0x8e, 0x97, 0x97, 0x8b, 0x81, 0x85, 0x85, + 0x7b, 0x79, 0x83, 0x89, 0x83, 0x81, 0x70, 0x41, 0x5c, 0x86, 0x53, + 0x5d, 0x89, 0x86, 0x9a, 0xa3, 0x8d, 0x92, 0xa8, 0x8a, 0x65, 0x70, + 0x72, 0x6d, 0x6f, 0x6f, 0x80, 0x96, 0x9d, 0x90, 0x8c, 0x9a, 0x8e, + 0x78, 0x6f, 0x69, 0x72, 0x75, 0x6f, 0x7b, 0x8b, 0x93, 0x8e, 0x85, + 0x86, 0x83, 0x6f, 0x65, 0x6d, 0x74, 0x77, 0x7e, 0x8b, 0x97, 0x9a, + 0x8e, 0x85, 0x89, 0x7f, 0x72, 0x72, 0x7a, 0x82, 0x84, 0x86, 0x8d, + 0x95, 0x92, 0x8d, 0x84, 0x7e, 0x56, 0x22, 0x5c, 0x79, 0x53, 0x78, + 0x96, 0x9f, 0xb9, 0xac, 0x85, 0x86, 0x96, 0x6b, 0x4b, 0x5f, 0x6c, + 0x7d, 0x88, 0x89, 0x9e, 0xb0, 0xa7, 0x86, 0x73, 0x7c, 0x6f, 0x5e, + 0x5d, 0x67, 0x84, 0x92, 0x90, 0x96, 0x9c, 0x99, 0x84, 0x69, 0x64, + 0x6c, 0x66, 0x62, 0x75, 0x8d, 0x96, 0x96, 0x93, 0x93, 0x91, 0x7c, + 0x6d, 0x74, 0x79, 0x76, 0x79, 0x84, 0x91, 0x8f, 0x8b, 0x87, 0x89, + 0x8f, 0x84, 0x7f, 0x7a, 0x75, 0x4d, 0x2b, 0x6f, 0x8a, 0x67, 0x87, + 0x9c, 0x9f, 0xb0, 0x99, 0x70, 0x78, 0x8b, 0x66, 0x54, 0x6d, 0x80, + 0x90, 0x8f, 0x8d, 0x99, 0xa2, 0x97, 0x73, 0x68, 0x79, 0x73, 0x6b, + 0x6e, 0x78, 0x93, 0x97, 0x8d, 0x8b, 0x8c, 0x89, 0x76, 0x64, 0x67, + 0x74, 0x7a, 0x7a, 0x81, 0x90, 0x94, 0x8c, 0x7f, 0x7d, 0x7f, 0x75, + 0x72, 0x7a, 0x86, 0x89, 0x86, 0x89, 0x8d, 0x89, 0x81, 0x7c, 0x81, + 0x86, 0x81, 0x82, 0x89, 0x8c, 0x84, 0x7c, 0x54, 0x2b, 0x70, 0x85, + 0x53, 0x7b, 0x9f, 0x9f, 0xaf, 0xa0, 0x7a, 0x87, 0x92, 0x63, 0x50, + 0x67, 0x7c, 0x83, 0x82, 0x90, 0x9e, 0xa8, 0x9f, 0x78, 0x75, 0x81, + 0x6e, 0x65, 0x67, 0x79, 0x8f, 0x8e, 0x8c, 0x8e, 0x93, 0x8b, 0x74, + 0x67, 0x6b, 0x6f, 0x6f, 0x78, 0x87, 0x90, 0x96, 0x90, 0x86, 0x83, + 0x7a, 0x70, 0x6e, 0x77, 0x7f, 0x81, 0x87, 0x8d, 0x90, 0x8c, 0x84, + 0x81, 0x80, 0x7e, 0x7c, 0x7c, 0x7f, 0x86, 0x89, 0x89, 0x89, 0x86, + 0x75, 0x38, 0x3f, 0x8a, 0x6a, 0x5b, 0x92, 0x9b, 0xa6, 0xb1, 0x88, + 0x7d, 0x96, 0x79, 0x55, 0x56, 0x72, 0x82, 0x7a, 0x8a, 0x99, 0xa6, + 0xad, 0x86, 0x77, 0x84, 0x75, 0x65, 0x5d, 0x6b, 0x85, 0x87, 0x88, + 0x93, 0x9d, 0x9c, 0x85, 0x72, 0x74, 0x71, 0x67, 0x63, 0x68, 0x80, + 0x91, 0x8c, 0x8b, 0x96, 0x91, 0x7d, 0x72, 0x71, 0x74, 0x73, 0x74, + 0x7e, 0x8f, 0x8f, 0x88, 0x8c, 0x8f, 0x86, 0x7c, 0x7b, 0x7d, 0x7f, + 0x7b, 0x7d, 0x86, 0x8c, 0x8c, 0x8c, 0x8b, 0x86, 0x6f, 0x32, 0x44, + 0x81, 0x55, 0x56, 0x90, 0x96, 0xac, 0xad, 0x8c, 0x99, 0xa0, 0x7a, + 0x58, 0x5c, 0x77, 0x6c, 0x6a, 0x83, 0x93, 0xae, 0xa3, 0x8a, 0x98, + 0x95, 0x79, 0x66, 0x60, 0x6f, 0x72, 0x6c, 0x78, 0x8c, 0x9c, 0x91, + 0x85, 0x8d, 0x88, 0x79, 0x68, 0x63, 0x72, 0x6c, 0x6f, 0x87, 0x8c, + 0x91, 0x93, 0x8d, 0x89, 0x84, 0x75, 0x70, 0x75, 0x73, 0x76, 0x81, + 0x87, 0x8a, 0x8e, 0x8d, 0x8b, 0x86, 0x7d, 0x79, 0x7a, 0x78, 0x77, + 0x7c, 0x80, 0x84, 0x86, 0x88, 0x8b, 0x8c, 0x89, 0x80, 0x75, 0x4b, + 0x48, 0x7d, 0x5c, 0x53, 0x8a, 0x8b, 0x99, 0xa3, 0x92, 0xa4, 0xa5, + 0x88, 0x70, 0x72, 0x7c, 0x63, 0x5f, 0x73, 0x7c, 0x8e, 0x8a, 0x88, + 0xa2, 0x9d, 0x8c, 0x86, 0x81, 0x7e, 0x6d, 0x63, 0x6a, 0x74, 0x78, + 0x74, 0x84, 0x94, 0x90, 0x8e, 0x8d, 0x8c, 0x87, 0x76, 0x6f, 0x74, + 0x6f, 0x64, 0x74, 0x7e, 0x7d, 0x86, 0x89, 0x8c, 0x8f, 0x88, 0x82, + 0x81, 0x7b, 0x76, 0x79, 0x79, 0x7b, 0x80, 0x84, 0x86, 0x85, 0x87, + 0x89, 0x86, 0x80, 0x7f, 0x80, 0x7f, 0x7c, 0x7c, 0x7f, 0x80, 0x7f, + 0x83, 0x85, 0x87, 0x83, 0x7f, 0x6e, 0x51, 0x75, 0x73, 0x4d, 0x74, + 0x7b, 0x80, 0x94, 0x85, 0x9b, 0xa8, 0x96, 0x91, 0x8d, 0x8e, 0x7c, + 0x6d, 0x70, 0x6d, 0x73, 0x6d, 0x72, 0x89, 0x86, 0x8a, 0x95, 0x96, + 0x98, 0x8c, 0x84, 0x83, 0x7b, 0x6f, 0x66, 0x6e, 0x71, 0x6d, 0x74, + 0x7d, 0x89, 0x8c, 0x89, 0x90, 0x93, 0x8d, 0x84, 0x80, 0x7a, 0x75, + 0x73, 0x6d, 0x72, 0x76, 0x77, 0x7b, 0x80, 0x83, 0x87, 0x88, 0x88, + 0x8a, 0x8a, 0x88, 0x84, 0x80, 0x7f, 0x7c, 0x76, 0x76, 0x78, 0x7a, + 0x7e, 0x80, 0x87, 0x8b, 0x8b, 0x8a, 0x8a, 0x88, 0x83, 0x7e, 0x7c, + 0x7a, 0x78, 0x79, 0x77, 0x77, 0x60, 0x70, 0x83, 0x5b, 0x73, 0x7e, + 0x6f, 0x8a, 0x7a, 0x86, 0x9f, 0x8e, 0x91, 0x96, 0x97, 0x8d, 0x83, + 0x83, 0x7c, 0x7e, 0x70, 0x6f, 0x7f, 0x74, 0x78, 0x7d, 0x80, 0x88, + 0x80, 0x83, 0x8a, 0x8a, 0x86, 0x83, 0x8a, 0x85, 0x81, 0x7d, 0x79, + 0x7a, 0x71, 0x6f, 0x74, 0x74, 0x77, 0x79, 0x81, 0x88, 0x87, 0x88, + 0x8d, 0x8a, 0x86, 0x81, 0x7e, 0x7d, 0x76, 0x75, 0x79, 0x7a, 0x7a, + 0x7e, 0x81, 0x83, 0x84, 0x85, 0x85, 0x83, 0x83, 0x84, 0x82, 0x81, + 0x83, 0x83, 0x82, 0x80, 0x7f, 0x82, 0x7f, 0x7b, 0x7c, 0x7d, 0x7c, + 0x7a, 0x7e, 0x82, 0x83, 0x83, 0x86, 0x86, 0x85, 0x7d, 0x73, 0x7d, + 0x74, 0x69, 0x72, 0x6d, 0x71, 0x76, 0x75, 0x80, 0x85, 0x84, 0x8b, + 0x8f, 0x8d, 0x8e, 0x8b, 0x8a, 0x8c, 0x86, 0x85, 0x88, 0x84, 0x83, + 0x84, 0x82, 0x81, 0x7e, 0x7b, 0x7a, 0x79, 0x77, 0x78, 0x79, 0x7a, + 0x7c, 0x7c, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x82, 0x81, 0x82, 0x80, 0x7e, 0x7e, 0x7c, 0x7b, 0x7c, + 0x7c, 0x7e, 0x80, 0x82, 0x82, 0x82, 0x82, 0x80, 0x80, 0x7e, 0x7d, + 0x7e, 0x7e, 0x7f, 0x82, 0x83, 0x83, 0x84, 0x83, 0x82, 0x82, 0x80, + 0x7e, 0x7f, 0x7e, 0x7c, 0x7c, 0x7d, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7e, 0x7e, 0x7d, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x82, 0x81, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x80, 0x7f, 0x81, 0x7f, 0x7f, + 0x84, 0x81, 0x7e, 0x7e, 0x80, 0x81, 0x81, 0x80, 0x80, 0x83, 0x82, + 0x81, 0x82, 0x82, 0x82, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x81, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7d, 0x7b, 0x7a, + 0x7b, 0x7c, 0x7c, 0x7d, 0x7f, 0x81, 0x81, 0x82, 0x81, 0x81, 0x81, + 0x7f, 0x7d, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x80, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7c, 0x7d, 0x7e, 0x7d, 0x7f, 0x7f, 0x80, 0x82, 0x82, 0x82, + 0x81, 0x7f, 0x80, 0x7e, 0x7d, 0x7d, 0x7e, 0x80, 0x80, 0x80, 0x82, + 0x83, 0x82, 0x81, 0x80, 0x80, 0x81, 0x7f, 0x7d, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x81, 0x82, 0x82, 0x82, 0x81, 0x81, 0x80, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7f, 0x81, 0x84, 0x84, 0x84, 0x83, 0x83, 0x80, 0x7d, + 0x7b, 0x7b, 0x7a, 0x7a, 0x7c, 0x7f, 0x81, 0x82, 0x82, 0x83, 0x83, + 0x82, 0x80, 0x7f, 0x7d, 0x7d, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x81, + 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x81, 0x80, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7f, 0x80, 0x81, + 0x82, 0x82, 0x81, 0x80, 0x7f, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x80, + 0x82, 0x82, 0x82, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, + 0x7f, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x81, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7e, 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x7e, 0x7f, 0x80, 0x80, 0x7e, 0x7f, 0x80, 0x81, + 0x80, 0x80, 0x80, 0x81, 0x80, 0x7e, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x81, 0x81, 0x80, 0x80, 0x81, 0x80, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7e, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x80, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x81, + 0x80, 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x81, 0x80, 0x80, + 0x81, 0x81, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, 0x81, + 0x81, 0x82, 0x82, 0x82, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7f, 0x81, + 0x81, 0x82, 0x83, 0x84, 0x83, 0x81, 0x80, 0x7f, 0x7e, 0x7c, 0x7c, + 0x7d, 0x7e, 0x7f, 0x7f, 0x81, 0x82, 0x82, 0x81, 0x80, 0x80, 0x7f, + 0x7e, 0x7d, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x82, + 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, + 0x80, 0x81, 0x82, 0x81, 0x80, 0x81, 0x81, 0x7f, 0x7e, 0x7e, 0x7f, + 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x81, 0x7d, 0x7c, + 0x7f, 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 0x81, 0x81, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x81, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, + 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x82, 0x81, 0x81, 0x80, 0x7f, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x82, 0x81, + 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x80, 0x7f, 0x80, 0x81, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x81, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x7f, 0x7e, 0x80, 0x7e, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7e, 0x7f, 0x7f, 0x7e, 0x80, 0x80, 0x7f, + 0x81, 0x7f, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x80, 0x81, 0x7e, 0x82, + 0x7e, 0x7e, 0x82, 0x7c, 0x80, 0x82, 0x7f, 0x80, 0x80, 0x7d, 0x7f, + 0x80, 0x7e, 0x80, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x81, 0x7e, 0x7f, + 0x7f, 0x7d, 0x80, 0x7e, 0x7f, 0x80, 0x7f, 0x81, 0x7f, 0x7f, 0x82, + 0x80, 0x7f, 0x82, 0x7e, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x81, 0x7f, 0x80, + 0x80, 0x80, 0x81, 0x7e, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x7e, + 0x81, 0x7f, 0x7e, 0x81, 0x7f, 0x7e, 0x81, 0x7e, 0x7f, 0x81, 0x7d, + 0x80, 0x82, 0x7e, 0x81, 0x81, 0x7c, 0x83, 0x7f, 0x7e, 0x7f, 0x7e, + 0x80, 0x7e, 0x7f, 0x81, 0x80, 0x81, 0x81, 0x7f, 0x81, 0x7f, 0x7f, + 0x7e, 0x80, 0x7d, 0x81, 0x7f, 0x7f, 0x83, 0x7d, 0x80, 0x81, 0x7e, + 0x7f, 0x80, 0x7c, 0x81, 0x7f, 0x7f, 0x81, 0x7f, 0x81, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x81, + 0x82, 0x7d, 0x80, 0x80, 0x7d, 0x82, 0x7e, 0x7e, 0x81, 0x7f, 0x80, + 0x80, 0x7f, 0x81, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x81, + 0x7f, 0x7f, 0x81, 0x7e, 0x82, 0x80, 0x80, 0x81, 0x7f, 0x7f, 0x7f, + 0x80, 0x7e, 0x7f, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x81, 0x7f, 0x80, 0x7f, 0x7e, 0x81, 0x7e, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x81, 0x7f, 0x80, 0x7f, 0x7e, + 0x7f, 0x80, 0x7d, 0x81, 0x7f, 0x7f, 0x82, 0x7f, 0x80, 0x82, 0x7e, + 0x7f, 0x80, 0x7d, 0x80, 0x7f, 0x7e, 0x81, 0x81, 0x7f, 0x82, 0x7f, + 0x80, 0x81, 0x7d, 0x80, 0x7d, 0x80, 0x80, 0x7e, 0x81, 0x81, 0x7f, + 0x80, 0x80, 0x7f, 0x81, 0x7d, 0x7e, 0x82, 0x7e, 0x7f, 0x81, 0x7f, + 0x82, 0x81, 0x7d, 0x82, 0x7f, 0x7f, 0x80, 0x7d, 0x80, 0x82, 0x7e, + 0x81, 0x80, 0x7f, 0x81, 0x7e, 0x80, 0x7f, 0x7e, 0x81, 0x7e, 0x7f, + 0x81, 0x7e, 0x80, 0x81, 0x7d, 0x80, 0x7f, 0x7e, 0x80, 0x80, 0x80, + 0x7f, 0x81, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x81, 0x7f, 0x7f, 0x80, + 0x7d, 0x80, 0x7e, 0x7e, 0x81, 0x7e, 0x81, 0x7f, 0x80, 0x81, 0x80, + 0x80, 0x80, 0x7f, 0x7e, 0x81, 0x7e, 0x80, 0x7f, 0x81, 0x80, 0x7f, + 0x82, 0x7d, 0x80, 0x80, 0x7d, 0x7f, 0x80, 0x7d, 0x81, 0x81, 0x7e, + 0x82, 0x80, 0x80, 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x80, 0x7e, 0x80, + 0x80, 0x7e, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7e, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x81, 0x7e, 0x80, 0x81, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x81, 0x7d, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x80, 0x7f, + 0x80, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x80, 0x7e, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x80, 0x7f, 0x81, + 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, + }, + { // 6 + 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x80, 0x81, 0x80, 0x7f, 0x7e, 0x7f, + 0x81, 0x80, 0x7f, 0x7e, 0x7f, 0x81, 0x80, 0x7f, 0x7e, 0x7f, 0x81, + 0x81, 0x7f, 0x7e, 0x7f, 0x81, 0x81, 0x7f, 0x7e, 0x7e, 0x81, 0x81, + 0x80, 0x7e, 0x7d, 0x80, 0x82, 0x81, 0x7d, 0x7d, 0x80, 0x83, 0x80, + 0x7d, 0x7d, 0x81, 0x82, 0x7f, 0x7d, 0x7f, 0x82, 0x81, 0x7e, 0x7e, + 0x80, 0x82, 0x80, 0x7d, 0x7e, 0x82, 0x82, 0x7f, 0x7c, 0x7f, 0x82, + 0x81, 0x7e, 0x7d, 0x80, 0x82, 0x80, 0x7e, 0x7e, 0x80, 0x81, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x7f, 0x7e, 0x80, 0x81, 0x80, 0x7e, + 0x7e, 0x80, 0x81, 0x80, 0x7e, 0x7e, 0x81, 0x81, 0x7f, 0x7d, 0x7e, + 0x81, 0x82, 0x80, 0x7c, 0x7d, 0x82, 0x83, 0x7e, 0x7c, 0x7f, 0x83, + 0x81, 0x7d, 0x7e, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x80, + 0x7f, 0x7e, 0x80, 0x82, 0x7f, 0x7d, 0x7f, 0x81, 0x80, 0x80, 0x7e, + 0x7e, 0x80, 0x82, 0x7f, 0x7e, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7e, 0x7f, 0x82, 0x81, 0x7c, 0x7e, 0x82, 0x80, 0x7d, 0x80, 0x81, + 0x7d, 0x7f, 0x83, 0x80, 0x7d, 0x7d, 0x82, 0x84, 0x7e, 0x7b, 0x80, + 0x82, 0x80, 0x7e, 0x80, 0x7f, 0x7e, 0x80, 0x83, 0x81, 0x7a, 0x7d, + 0x85, 0x82, 0x7c, 0x7c, 0x81, 0x82, 0x7e, 0x80, 0x80, 0x7d, 0x7e, + 0x83, 0x83, 0x7a, 0x7b, 0x84, 0x85, 0x7c, 0x7b, 0x81, 0x82, 0x80, + 0x7e, 0x7f, 0x80, 0x7e, 0x82, 0x83, 0x7b, 0x7c, 0x84, 0x82, 0x7d, + 0x7e, 0x7e, 0x83, 0x81, 0x7e, 0x7d, 0x7f, 0x84, 0x82, 0x7c, 0x79, + 0x82, 0x86, 0x7f, 0x7a, 0x7c, 0x85, 0x85, 0x7c, 0x7c, 0x7e, 0x81, + 0x84, 0x81, 0x7b, 0x79, 0x84, 0x86, 0x7d, 0x7b, 0x7d, 0x81, 0x84, + 0x81, 0x79, 0x7b, 0x87, 0x84, 0x78, 0x7e, 0x83, 0x81, 0x7f, 0x80, + 0x7d, 0x7d, 0x87, 0x84, 0x77, 0x78, 0x88, 0x87, 0x7a, 0x78, 0x82, + 0x87, 0x7f, 0x7c, 0x7d, 0x83, 0x82, 0x7e, 0x7e, 0x7f, 0x80, 0x82, + 0x7f, 0x7b, 0x7f, 0x86, 0x80, 0x76, 0x7f, 0x89, 0x83, 0x77, 0x79, + 0x85, 0x85, 0x7e, 0x7c, 0x80, 0x80, 0x80, 0x82, 0x80, 0x7a, 0x80, + 0x84, 0x7e, 0x7b, 0x80, 0x89, 0x7a, 0x75, 0x88, 0x86, 0x7b, 0x7c, + 0x7e, 0x84, 0x82, 0x7e, 0x80, 0x7c, 0x7e, 0x85, 0x83, 0x7a, 0x7d, + 0x81, 0x83, 0x81, 0x7c, 0x7e, 0x7f, 0x80, 0x83, 0x7f, 0x7b, 0x82, + 0x81, 0x7e, 0x7d, 0x82, 0x83, 0x7c, 0x7e, 0x7e, 0x81, 0x85, 0x7f, + 0x78, 0x7e, 0x84, 0x84, 0x7f, 0x79, 0x7c, 0x87, 0x84, 0x7c, 0x7d, + 0x7c, 0x81, 0x86, 0x81, 0x79, 0x7c, 0x84, 0x83, 0x81, 0x7a, 0x7c, + 0x84, 0x83, 0x7c, 0x80, 0x7d, 0x7d, 0x85, 0x84, 0x7e, 0x76, 0x7e, + 0x86, 0x87, 0x7d, 0x75, 0x81, 0x85, 0x83, 0x7f, 0x7d, 0x7b, 0x80, + 0x84, 0x7f, 0x80, 0x7f, 0x7d, 0x80, 0x83, 0x7e, 0x80, 0x81, 0x7c, + 0x7b, 0x86, 0x85, 0x7a, 0x7d, 0x7b, 0x81, 0x8a, 0x7d, 0x76, 0x7f, + 0x87, 0x84, 0x7a, 0x7a, 0x82, 0x88, 0x7e, 0x73, 0x85, 0x88, 0x7d, + 0x7a, 0x7c, 0x85, 0x82, 0x7e, 0x7c, 0x7e, 0x83, 0x7f, 0x83, 0x7b, + 0x7a, 0x86, 0x81, 0x7d, 0x79, 0x83, 0x86, 0x7b, 0x7c, 0x81, 0x80, + 0x7c, 0x84, 0x83, 0x7f, 0x78, 0x79, 0x8d, 0x86, 0x77, 0x78, 0x7f, + 0x8b, 0x80, 0x78, 0x7f, 0x7e, 0x84, 0x87, 0x7c, 0x71, 0x84, 0x8b, + 0x80, 0x79, 0x76, 0x87, 0x86, 0x7e, 0x7b, 0x7e, 0x83, 0x7f, 0x82, + 0x80, 0x77, 0x82, 0x87, 0x7e, 0x7d, 0x7b, 0x84, 0x80, 0x7e, 0x84, + 0x76, 0x82, 0x88, 0x79, 0x80, 0x80, 0x7e, 0x83, 0x7c, 0x7f, 0x86, + 0x7f, 0x76, 0x7f, 0x86, 0x82, 0x85, 0x79, 0x77, 0x83, 0x85, 0x84, + 0x7e, 0x79, 0x7c, 0x81, 0x87, 0x82, 0x77, 0x83, 0x7f, 0x79, 0x86, + 0x85, 0x7a, 0x7a, 0x83, 0x83, 0x7e, 0x80, 0x7f, 0x7b, 0x83, 0x83, + 0x7b, 0x7c, 0x80, 0x86, 0x85, 0x78, 0x78, 0x80, 0x87, 0x81, 0x7f, + 0x85, 0x76, 0x78, 0x89, 0x85, 0x80, 0x7d, 0x74, 0x84, 0x8e, 0x79, + 0x7a, 0x80, 0x7f, 0x7d, 0x8c, 0x7f, 0x71, 0x87, 0x7a, 0x80, 0x8a, + 0x7e, 0x7b, 0x77, 0x85, 0x83, 0x7f, 0x7d, 0x7a, 0x8a, 0x81, 0x73, + 0x82, 0x85, 0x80, 0x7d, 0x7e, 0x81, 0x80, 0x81, 0x7d, 0x83, 0x80, + 0x79, 0x86, 0x7e, 0x7a, 0x89, 0x7e, 0x7a, 0x81, 0x7f, 0x7f, 0x81, + 0x86, 0x79, 0x78, 0x86, 0x84, 0x81, 0x7d, 0x75, 0x84, 0x8e, 0x75, + 0x79, 0x82, 0x86, 0x81, 0x79, 0x81, 0x7a, 0x85, 0x85, 0x7b, 0x7d, + 0x7d, 0x86, 0x7f, 0x7c, 0x83, 0x78, 0x7f, 0x8f, 0x7b, 0x6f, 0x84, + 0x8d, 0x7b, 0x79, 0x88, 0x7a, 0x79, 0x84, 0x8c, 0x7a, 0x73, 0x87, + 0x7b, 0x83, 0x8a, 0x7b, 0x75, 0x7c, 0x8c, 0x80, 0x7a, 0x86, 0x7d, + 0x75, 0x84, 0x8d, 0x7c, 0x75, 0x80, 0x85, 0x81, 0x80, 0x81, 0x7b, + 0x7a, 0x87, 0x83, 0x78, 0x81, 0x86, 0x76, 0x80, 0x8a, 0x75, 0x82, + 0x80, 0x7a, 0x8a, 0x80, 0x79, 0x7b, 0x84, 0x83, 0x7b, 0x87, 0x7e, + 0x72, 0x87, 0x86, 0x7f, 0x7b, 0x7e, 0x80, 0x82, 0x84, 0x7a, 0x7e, + 0x85, 0x7f, 0x7b, 0x87, 0x7a, 0x7b, 0x86, 0x7f, 0x83, 0x82, 0x78, + 0x79, 0x89, 0x83, 0x7b, 0x7d, 0x83, 0x83, 0x74, 0x81, 0x8a, 0x7f, + 0x78, 0x7c, 0x85, 0x84, 0x7a, 0x7e, 0x84, 0x7c, 0x82, 0x7a, 0x7c, + 0x8a, 0x86, 0x74, 0x75, 0x8e, 0x83, 0x79, 0x7b, 0x83, 0x84, 0x7e, + 0x7e, 0x7f, 0x78, 0x87, 0x89, 0x74, 0x82, 0x7b, 0x7f, 0x95, 0x77, + 0x69, 0x8d, 0x85, 0x7e, 0x81, 0x72, 0x8a, 0x82, 0x7c, 0x82, 0x76, + 0x85, 0x84, 0x84, 0x74, 0x7f, 0x83, 0x84, 0x82, 0x72, 0x8b, 0x71, + 0x8d, 0x91, 0x61, 0x7f, 0x8e, 0x83, 0x7f, 0x77, 0x7a, 0x87, 0x81, + 0x83, 0x84, 0x6f, 0x79, 0x95, 0x88, 0x67, 0x7b, 0x96, 0x7c, 0x75, + 0x85, 0x7d, 0x81, 0x88, 0x77, 0x7c, 0x89, 0x77, 0x83, 0x8d, 0x6e, + 0x7c, 0x89, 0x7f, 0x84, 0x7d, 0x7e, 0x7b, 0x7b, 0x8a, 0x8a, 0x80, + 0x61, 0x80, 0x9c, 0x7b, 0x7d, 0x78, 0x7f, 0x7f, 0x7c, 0x95, 0x84, + 0x61, 0x75, 0x99, 0x8d, 0x71, 0x73, 0x8a, 0x79, 0x79, 0x9f, 0x7e, + 0x5a, 0x85, 0x9d, 0x7b, 0x72, 0x82, 0x84, 0x7d, 0x77, 0x8a, 0x8f, + 0x69, 0x76, 0x94, 0x79, 0x76, 0x94, 0x82, 0x65, 0x7f, 0x96, 0x82, + 0x74, 0x7a, 0x81, 0x7f, 0x8d, 0x87, 0x6a, 0x74, 0x90, 0x94, 0x76, + 0x6e, 0x7b, 0x8a, 0x90, 0x7c, 0x6b, 0x7d, 0x92, 0x87, 0x6d, 0x7d, + 0x8f, 0x7a, 0x7b, 0x83, 0x7d, 0x7c, 0x8a, 0x7c, 0x78, 0x84, 0x7e, + 0x80, 0x85, 0x7d, 0x74, 0x84, 0x94, 0x78, 0x65, 0x84, 0x98, 0x85, + 0x67, 0x7a, 0x8f, 0x7f, 0x81, 0x83, 0x74, 0x75, 0x91, 0x8d, 0x72, + 0x80, 0x7b, 0x78, 0x91, 0x83, 0x76, 0x7f, 0x79, 0x85, 0x87, 0x80, + 0x76, 0x73, 0x8a, 0x88, 0x86, 0x76, 0x75, 0x82, 0x83, 0x88, 0x81, + 0x78, 0x7a, 0x84, 0x83, 0x7d, 0x7d, 0x82, 0x85, 0x7d, 0x76, 0x82, + 0x85, 0x81, 0x80, 0x7a, 0x81, 0x7f, 0x82, 0x85, 0x7d, 0x78, 0x83, + 0x85, 0x7a, 0x7f, 0x83, 0x7e, 0x81, 0x83, 0x7b, 0x7e, 0x86, 0x84, + 0x75, 0x7b, 0x88, 0x82, 0x7b, 0x78, 0x85, 0x85, 0x7d, 0x7d, 0x7f, + 0x83, 0x7f, 0x7d, 0x7d, 0x84, 0x7c, 0x82, 0x84, 0x77, 0x7f, 0x81, + 0x86, 0x7b, 0x7b, 0x85, 0x7d, 0x82, 0x83, 0x7b, 0x7d, 0x7f, 0x89, + 0x7e, 0x7a, 0x83, 0x7f, 0x7d, 0x80, 0x84, 0x7c, 0x7d, 0x83, 0x80, + 0x7a, 0x80, 0x82, 0x81, 0x89, 0x77, 0x73, 0x89, 0x88, 0x7c, 0x7c, + 0x7d, 0x7e, 0x83, 0x82, 0x81, 0x7a, 0x7d, 0x8a, 0x81, 0x73, 0x81, + 0x8b, 0x7d, 0x79, 0x7f, 0x84, 0x7d, 0x7e, 0x86, 0x79, 0x7a, 0x87, + 0x86, 0x7b, 0x79, 0x84, 0x81, 0x7c, 0x87, 0x81, 0x73, 0x81, 0x89, + 0x7a, 0x7c, 0x87, 0x7c, 0x7a, 0x85, 0x82, 0x79, 0x82, 0x86, 0x77, + 0x7f, 0x87, 0x7c, 0x7e, 0x7f, 0x80, 0x7f, 0x7d, 0x85, 0x80, 0x7b, + 0x7d, 0x7f, 0x85, 0x80, 0x7e, 0x81, 0x7d, 0x82, 0x7f, 0x80, 0x81, + 0x79, 0x81, 0x85, 0x81, 0x7c, 0x7a, 0x86, 0x84, 0x77, 0x82, 0x82, + 0x79, 0x84, 0x84, 0x7d, 0x7c, 0x85, 0x81, 0x75, 0x83, 0x8a, 0x7c, + 0x7a, 0x82, 0x7e, 0x7e, 0x84, 0x7f, 0x7b, 0x81, 0x84, 0x7c, 0x7b, + 0x83, 0x84, 0x7e, 0x7a, 0x80, 0x83, 0x82, 0x7d, 0x7d, 0x81, 0x82, + 0x80, 0x7c, 0x81, 0x83, 0x80, 0x81, 0x82, 0x7d, 0x81, 0x89, 0x80, + 0x7b, 0x83, 0x85, 0x7c, 0x7d, 0x81, 0x7f, 0x7f, 0x7d, 0x7c, 0x7d, + 0x7d, 0x7c, 0x72, 0x6d, 0x76, 0x7a, 0x75, 0x73, 0x7a, 0x85, 0x86, + 0x84, 0x89, 0x8e, 0x8f, 0x8c, 0x88, 0x85, 0x84, 0x82, 0x7f, 0x7b, + 0x79, 0x7d, 0x81, 0x7e, 0x7f, 0x86, 0x89, 0x88, 0x86, 0x88, 0x8d, + 0x8b, 0x85, 0x80, 0x80, 0x85, 0x80, 0x7b, 0x7d, 0x81, 0x84, 0x82, + 0x73, 0x42, 0x46, 0x89, 0x71, 0x39, 0x52, 0x82, 0x92, 0x77, 0x75, + 0xa1, 0xad, 0xa1, 0xa1, 0x9a, 0x91, 0x97, 0x96, 0x7a, 0x64, 0x71, + 0x82, 0x72, 0x59, 0x6a, 0x8c, 0x89, 0x7c, 0x82, 0x93, 0x99, 0x8c, + 0x85, 0x82, 0x7b, 0x7b, 0x75, 0x68, 0x6a, 0x7a, 0x7f, 0x77, 0x7d, + 0x92, 0x98, 0x8d, 0x8f, 0x99, 0x96, 0x8c, 0x87, 0x88, 0x86, 0x83, + 0x82, 0x7a, 0x61, 0x32, 0x48, 0x81, 0x4d, 0x2e, 0x61, 0x89, 0x91, + 0x76, 0x8e, 0xbe, 0xb2, 0xac, 0xa9, 0x96, 0x98, 0x92, 0x7c, 0x5e, + 0x57, 0x73, 0x6f, 0x53, 0x5e, 0x82, 0x96, 0x88, 0x89, 0xa1, 0xa8, + 0x9f, 0x91, 0x8a, 0x86, 0x7a, 0x6a, 0x56, 0x53, 0x63, 0x65, 0x63, + 0x75, 0x92, 0x9b, 0x95, 0x9c, 0xa9, 0xa4, 0x95, 0x8d, 0x8c, 0x87, + 0x7d, 0x76, 0x73, 0x77, 0x7c, 0x76, 0x6f, 0x44, 0x43, 0x8b, 0x69, + 0x39, 0x64, 0x8b, 0x96, 0x76, 0x80, 0xb6, 0xaa, 0x9d, 0x9e, 0x8b, + 0x95, 0x92, 0x74, 0x65, 0x62, 0x7e, 0x78, 0x55, 0x70, 0x8e, 0x92, + 0x88, 0x84, 0x9e, 0xa2, 0x8f, 0x86, 0x81, 0x85, 0x7c, 0x68, 0x61, + 0x64, 0x6e, 0x65, 0x5f, 0x77, 0x8b, 0x8c, 0x8b, 0x9b, 0xa5, 0x9d, + 0x91, 0x8f, 0x91, 0x8a, 0x7e, 0x78, 0x7c, 0x82, 0x7d, 0x79, 0x80, + 0x84, 0x7d, 0x48, 0x47, 0x89, 0x60, 0x3b, 0x61, 0x7e, 0x8c, 0x74, + 0x82, 0xb1, 0xa9, 0xa1, 0xa1, 0x8f, 0x9c, 0x97, 0x6e, 0x66, 0x6d, + 0x7b, 0x69, 0x53, 0x78, 0x8c, 0x85, 0x83, 0x8b, 0xa5, 0xa1, 0x8b, + 0x8a, 0x8c, 0x8c, 0x79, 0x61, 0x68, 0x73, 0x68, 0x5a, 0x63, 0x79, + 0x82, 0x7d, 0x84, 0x9b, 0xa1, 0x95, 0x90, 0x98, 0x95, 0x85, 0x80, + 0x82, 0x81, 0x7b, 0x7b, 0x83, 0x85, 0x85, 0x84, 0x83, 0x75, 0x44, + 0x62, 0x7e, 0x42, 0x4d, 0x6d, 0x73, 0x7f, 0x79, 0x8f, 0xb0, 0xa4, + 0x9e, 0xa2, 0x9c, 0xa0, 0x84, 0x74, 0x77, 0x70, 0x71, 0x5c, 0x64, + 0x80, 0x78, 0x7c, 0x88, 0x94, 0x9f, 0x92, 0x8e, 0x97, 0x92, 0x83, + 0x73, 0x71, 0x76, 0x67, 0x61, 0x64, 0x6a, 0x79, 0x73, 0x74, 0x8e, + 0x98, 0x8e, 0x91, 0x9d, 0x98, 0x8e, 0x87, 0x86, 0x84, 0x80, 0x79, + 0x7c, 0x81, 0x80, 0x83, 0x84, 0x8b, 0x85, 0x87, 0x61, 0x4a, 0x88, + 0x5e, 0x37, 0x70, 0x67, 0x6a, 0x80, 0x75, 0x95, 0xaa, 0x9c, 0x9f, + 0xa2, 0xb1, 0x96, 0x7e, 0x90, 0x78, 0x75, 0x6a, 0x58, 0x74, 0x6f, + 0x66, 0x79, 0x83, 0x8e, 0x8d, 0x8e, 0x9c, 0x97, 0x93, 0x86, 0x81, + 0x87, 0x71, 0x6c, 0x6d, 0x6c, 0x6b, 0x68, 0x72, 0x77, 0x7e, 0x83, + 0x8c, 0x93, 0x91, 0x94, 0x95, 0x90, 0x88, 0x88, 0x85, 0x7f, 0x7a, + 0x7b, 0x7e, 0x7d, 0x80, 0x85, 0x89, 0x8d, 0x88, 0x8e, 0x62, 0x58, + 0x95, 0x49, 0x46, 0x79, 0x4b, 0x72, 0x71, 0x61, 0xa0, 0x95, 0x92, + 0xa3, 0xa9, 0xb4, 0x93, 0x9d, 0x96, 0x84, 0x88, 0x63, 0x72, 0x75, + 0x58, 0x6a, 0x6c, 0x74, 0x7a, 0x79, 0x8e, 0x90, 0x98, 0x91, 0x95, + 0x9f, 0x87, 0x85, 0x7c, 0x7a, 0x74, 0x63, 0x6a, 0x6c, 0x67, 0x6e, + 0x7d, 0x81, 0x86, 0x8e, 0x97, 0x96, 0x91, 0x93, 0x93, 0x89, 0x81, + 0x82, 0x7e, 0x77, 0x75, 0x7b, 0x7b, 0x7f, 0x80, 0x89, 0x8a, 0x96, + 0x83, 0x48, 0x92, 0x73, 0x3a, 0x78, 0x59, 0x65, 0x69, 0x61, 0x84, + 0x8c, 0x7f, 0x95, 0xae, 0x96, 0xa0, 0xa1, 0x9e, 0x99, 0x86, 0x88, + 0x86, 0x77, 0x6d, 0x73, 0x71, 0x6f, 0x6f, 0x78, 0x77, 0x76, 0x82, + 0x86, 0x85, 0x86, 0x8d, 0x8d, 0x89, 0x84, 0x86, 0x84, 0x7d, 0x7a, + 0x7b, 0x79, 0x77, 0x7a, 0x7c, 0x7e, 0x7e, 0x84, 0x85, 0x84, 0x85, + 0x87, 0x86, 0x82, 0x82, 0x82, 0x7f, 0x7e, 0x7e, 0x7c, 0x7d, 0x7d, + 0x80, 0x81, 0x80, 0x88, 0x88, 0x8d, 0x7f, 0x74, 0x83, 0x6d, 0x66, + 0x6e, 0x67, 0x67, 0x65, 0x6a, 0x74, 0x73, 0x7c, 0x8a, 0x8a, 0x90, + 0x97, 0x9b, 0x9a, 0x95, 0x98, 0x95, 0x8a, 0x88, 0x84, 0x7f, 0x7a, + 0x75, 0x78, 0x78, 0x74, 0x78, 0x7e, 0x7f, 0x81, 0x86, 0x86, 0x86, + 0x85, 0x85, 0x82, 0x7e, 0x7e, 0x7a, 0x76, 0x76, 0x76, 0x76, 0x77, + 0x79, 0x7e, 0x7f, 0x81, 0x85, 0x86, 0x87, 0x88, 0x88, 0x88, 0x83, + 0x83, 0x82, 0x7d, 0x7b, 0x7c, 0x7b, 0x7a, 0x7a, 0x7d, 0x7e, 0x7e, + 0x82, 0x7e, 0x82, 0x82, 0x7f, 0x82, 0x7a, 0x7e, 0x7a, 0x73, 0x77, + 0x77, 0x74, 0x74, 0x77, 0x7a, 0x7b, 0x7b, 0x81, 0x83, 0x84, 0x89, + 0x8b, 0x8a, 0x8c, 0x8c, 0x8c, 0x89, 0x86, 0x87, 0x84, 0x81, 0x7f, + 0x7d, 0x7d, 0x7d, 0x7b, 0x7a, 0x7d, 0x7f, 0x7f, 0x7e, 0x80, 0x82, + 0x81, 0x80, 0x81, 0x82, 0x7f, 0x80, 0x7e, 0x7c, 0x81, 0x7d, 0x7c, + 0x80, 0x7d, 0x7e, 0x81, 0x7c, 0x80, 0x83, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x7d, 0x7c, 0x7c, 0x7c, 0x7d, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, + 0x7f, 0x7f, 0x82, 0x81, 0x7f, 0x81, 0x7f, 0x7e, 0x81, 0x7f, 0x7f, + 0x80, 0x7f, 0x82, 0x80, 0x7d, 0x81, 0x80, 0x7e, 0x7d, 0x7d, 0x80, + 0x7e, 0x7d, 0x80, 0x7e, 0x80, 0x81, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x80, 0x82, 0x83, 0x81, 0x83, 0x81, 0x82, 0x82, 0x81, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x7e, 0x7e, 0x82, 0x7e, 0x7b, 0x7f, 0x7e, + 0x7d, 0x7e, 0x7c, 0x80, 0x80, 0x7f, 0x81, 0x80, 0x83, 0x82, 0x80, + 0x81, 0x81, 0x7f, 0x80, 0x7f, 0x7c, 0x81, 0x7b, 0x7b, 0x7f, 0x7a, + 0x7f, 0x7c, 0x7c, 0x83, 0x7b, 0x81, 0x83, 0x7d, 0x82, 0x81, 0x7e, + 0x81, 0x7c, 0x81, 0x7d, 0x7b, 0x82, 0x7b, 0x80, 0x7f, 0x81, 0x83, + 0x81, 0x84, 0x82, 0x81, 0x82, 0x7f, 0x7f, 0x81, 0x7a, 0x7c, 0x7e, + 0x7a, 0x7e, 0x7d, 0x80, 0x81, 0x7e, 0x85, 0x83, 0x80, 0x84, 0x82, + 0x81, 0x83, 0x7b, 0x81, 0x7c, 0x7a, 0x80, 0x7a, 0x80, 0x7f, 0x7c, + 0x85, 0x80, 0x81, 0x86, 0x7d, 0x84, 0x82, 0x7a, 0x82, 0x79, 0x7c, + 0x80, 0x77, 0x81, 0x7d, 0x7e, 0x84, 0x7f, 0x84, 0x83, 0x80, 0x86, + 0x7c, 0x80, 0x82, 0x78, 0x82, 0x7a, 0x7b, 0x80, 0x7b, 0x7e, 0x82, + 0x7d, 0x84, 0x81, 0x80, 0x87, 0x7e, 0x83, 0x84, 0x7c, 0x81, 0x81, + 0x7c, 0x80, 0x7d, 0x7b, 0x7f, 0x7d, 0x7c, 0x7e, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x7f, 0x82, 0x81, 0x7f, 0x80, 0x81, 0x80, 0x7e, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x81, 0x7e, 0x80, 0x7e, 0x7e, 0x81, + 0x7d, 0x80, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x81, + 0x7f, 0x81, 0x80, 0x7e, 0x83, 0x7f, 0x7d, 0x81, 0x7e, 0x7d, 0x7f, + 0x7e, 0x81, 0x7f, 0x82, 0x80, 0x80, 0x84, 0x7c, 0x82, 0x82, 0x7c, + 0x81, 0x7e, 0x7e, 0x7f, 0x7d, 0x7e, 0x7f, 0x7e, 0x81, 0x7e, 0x80, + 0x82, 0x80, 0x80, 0x82, 0x7f, 0x80, 0x82, 0x7f, 0x7f, 0x81, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x81, 0x7f, 0x7d, 0x81, 0x7e, 0x7e, + 0x81, 0x7d, 0x81, 0x7f, 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x7f, + 0x81, 0x7a, 0x83, 0x7f, 0x7d, 0x81, 0x81, 0x80, 0x80, 0x82, 0x80, + 0x82, 0x7e, 0x81, 0x7f, 0x7e, 0x7f, 0x7c, 0x7f, 0x7d, 0x7e, 0x7e, + 0x7f, 0x80, 0x80, 0x83, 0x83, 0x81, 0x84, 0x83, 0x80, 0x7f, 0x7f, + 0x7e, 0x7d, 0x7d, 0x7b, 0x7e, 0x7c, 0x7f, 0x7f, 0x7f, 0x83, 0x82, + 0x81, 0x84, 0x81, 0x81, 0x81, 0x7f, 0x81, 0x7f, 0x7e, 0x80, 0x7d, + 0x7f, 0x81, 0x7e, 0x7f, 0x81, 0x7f, 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, + 0x7d, 0x7e, 0x7f, 0x80, 0x82, 0x81, 0x81, 0x83, 0x82, 0x84, 0x80, + 0x80, 0x82, 0x7d, 0x7e, 0x7d, 0x7d, 0x7c, 0x7e, 0x7f, 0x7f, 0x7f, + 0x81, 0x80, 0x83, 0x82, 0x80, 0x80, 0x80, 0x80, 0x7e, 0x7f, 0x7f, + 0x80, 0x7d, 0x7e, 0x7f, 0x7e, 0x81, 0x7e, 0x7f, 0x81, 0x80, 0x7f, + 0x81, 0x80, 0x80, 0x81, 0x7e, 0x81, 0x7f, 0x80, 0x81, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7d, 0x7f, + 0x7f, 0x7e, 0x80, 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x82, 0x81, 0x80, + 0x80, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x7e, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x80, 0x7e, 0x7d, + 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x81, 0x81, 0x81, 0x82, 0x80, 0x81, + 0x81, 0x7e, 0x7f, 0x7f, 0x7d, 0x7f, 0x7e, 0x7f, 0x81, 0x7f, 0x82, + 0x82, 0x82, 0x82, 0x81, 0x80, 0x81, 0x7f, 0x7e, 0x7d, 0x7c, 0x7d, + 0x7c, 0x7c, 0x7e, 0x7f, 0x7e, 0x81, 0x82, 0x82, 0x82, 0x82, 0x81, + 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, 0x81, + 0x80, 0x81, 0x82, 0x80, 0x81, 0x80, 0x7e, 0x7f, 0x7f, 0x7e, 0x7c, + 0x7d, 0x7f, 0x7e, 0x7f, 0x7f, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, + 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, + 0x7f, 0x80, 0x81, 0x81, 0x82, 0x81, 0x81, 0x81, 0x80, 0x7f, 0x7f, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, + 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7f, 0x81, 0x81, 0x80, 0x80, 0x81, 0x81, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, + 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x81, 0x7d, 0x81, 0x80, + 0x7f, 0x80, 0x7f, 0x7e, 0x81, 0x7e, 0x7f, 0x81, 0x7e, 0x81, 0x80, + 0x7e, 0x81, 0x7f, 0x7e, 0x82, 0x7e, 0x80, 0x81, 0x7d, 0x81, 0x80, + 0x7d, 0x81, 0x7f, 0x7e, 0x83, 0x7d, 0x80, 0x81, 0x7c, 0x81, 0x81, + 0x7d, 0x81, 0x80, 0x7d, 0x82, 0x7e, 0x7f, 0x82, 0x7e, 0x81, 0x81, + 0x7e, 0x81, 0x80, 0x7e, 0x82, 0x7e, 0x7f, 0x80, 0x7e, 0x7f, 0x80, + 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x81, + 0x7e, 0x80, 0x80, 0x7f, 0x81, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x82, 0x7e, + 0x80, 0x81, 0x7d, 0x81, 0x80, 0x7f, 0x81, 0x7f, 0x7e, 0x82, 0x7e, + 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7e, + 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7e, 0x80, 0x81, 0x7e, + 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x82, 0x7d, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x82, 0x7c, 0x82, 0x7d, 0x80, 0x80, 0x7e, + 0x80, 0x7f, 0x80, 0x7f, 0x81, 0x7e, 0x82, 0x7e, 0x81, 0x7f, 0x7f, + 0x7f, 0x81, 0x7f, 0x7f, 0x81, 0x7d, 0x82, 0x7e, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x81, + 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x81, + 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x7e, 0x7f, 0x80, 0x7e, 0x81, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7e, 0x81, + 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x81, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x80, 0x7e, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x7f, + 0x7f, 0x81, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7e, 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, + }, + { // 7 + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x7f, + 0x80, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x80, + 0x7f, 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x7f, + 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x82, 0x7d, 0x80, + 0x81, 0x7d, 0x82, 0x7e, 0x7f, 0x81, 0x7e, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7e, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7e, + 0x81, 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7f, + 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x81, 0x7e, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x81, + 0x80, 0x7e, 0x82, 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x81, + 0x7e, 0x80, 0x81, 0x7e, 0x81, 0x7f, 0x7e, 0x81, 0x7e, 0x81, 0x7f, + 0x7e, 0x81, 0x7e, 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7f, + 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x81, 0x7e, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x7e, + 0x81, 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x81, + 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x7f, + 0x81, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x81, 0x7e, 0x80, + 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x81, + 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x7e, 0x82, 0x7e, 0x80, 0x80, + 0x7e, 0x81, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7f, + 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7e, 0x81, 0x7e, 0x80, 0x81, 0x7d, 0x82, 0x7f, 0x7f, + 0x81, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7e, + 0x80, 0x7f, 0x80, 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x7e, + 0x81, 0x7f, 0x7d, 0x83, 0x7e, 0x7f, 0x82, 0x7c, 0x81, 0x7f, 0x7f, + 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x82, 0x7c, 0x81, 0x80, 0x7e, + 0x82, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x81, 0x7e, 0x80, 0x81, 0x7e, 0x81, 0x80, 0x7e, 0x81, 0x7d, 0x80, + 0x81, 0x7d, 0x82, 0x7e, 0x7f, 0x82, 0x7d, 0x80, 0x80, 0x7e, 0x81, + 0x7f, 0x7e, 0x83, 0x7c, 0x80, 0x81, 0x7e, 0x81, 0x7f, 0x80, 0x7f, + 0x7f, 0x81, 0x7f, 0x7f, 0x81, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x81, 0x7d, 0x81, 0x80, 0x7f, + 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x80, 0x7e, 0x82, + 0x7e, 0x7e, 0x82, 0x7e, 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x81, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x7f, 0x81, + 0x7e, 0x81, 0x7e, 0x7f, 0x82, 0x7e, 0x7f, 0x81, 0x7e, 0x7f, 0x81, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x81, 0x7e, 0x7f, 0x81, 0x7e, 0x80, 0x7f, 0x80, 0x80, 0x7e, + 0x81, 0x7f, 0x7e, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x81, 0x7f, + 0x80, 0x7f, 0x7f, 0x81, 0x7d, 0x81, 0x80, 0x7e, 0x80, 0x7f, 0x7f, + 0x80, 0x7e, 0x81, 0x7e, 0x7f, 0x82, 0x7d, 0x81, 0x80, 0x7d, 0x82, + 0x7e, 0x7f, 0x82, 0x7c, 0x81, 0x80, 0x7d, 0x83, 0x7d, 0x80, 0x82, + 0x7d, 0x82, 0x7f, 0x7e, 0x82, 0x7e, 0x7f, 0x80, 0x7e, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7e, + 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7e, + 0x80, 0x80, 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7e, + 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x81, 0x7f, 0x80, 0x80, 0x7e, 0x81, + 0x80, 0x7e, 0x81, 0x7e, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x81, + 0x7e, 0x80, 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x7f, 0x81, + 0x7e, 0x81, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7e, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x81, 0x7e, + 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7e, 0x80, 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x81, 0x7e, + 0x80, 0x80, 0x7e, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7e, + 0x80, 0x80, 0x7d, 0x82, 0x7f, 0x7e, 0x82, 0x7f, 0x7f, 0x81, 0x7e, + 0x80, 0x80, 0x7d, 0x82, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x7d, 0x81, + 0x80, 0x7e, 0x82, 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x80, 0x7d, 0x81, + 0x7f, 0x7e, 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x7e, 0x80, + 0x81, 0x7e, 0x81, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x81, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x81, 0x82, 0x84, + 0x82, 0x83, 0x83, 0x81, 0x83, 0x81, 0x81, 0x83, 0x7f, 0x81, 0x81, + 0x7d, 0x81, 0x7f, 0x7d, 0x82, 0x7d, 0x82, 0x79, 0x72, 0x87, 0x70, + 0x74, 0x7e, 0x6d, 0x80, 0x72, 0x74, 0x87, 0x77, 0x81, 0x84, 0x84, + 0x8b, 0x86, 0x89, 0x8d, 0x8c, 0x83, 0x8a, 0x87, 0x82, 0x84, 0x7a, + 0x83, 0x7f, 0x75, 0x7f, 0x7a, 0x7b, 0x7c, 0x7a, 0x80, 0x7f, 0x7c, + 0x7f, 0x83, 0x7f, 0x81, 0x81, 0x81, 0x83, 0x7a, 0x7f, 0x81, 0x7a, + 0x7c, 0x7d, 0x7d, 0x7d, 0x7b, 0x81, 0x83, 0x7f, 0x84, 0x87, 0x86, + 0x86, 0x86, 0x8a, 0x87, 0x84, 0x89, 0x84, 0x85, 0x82, 0x87, 0x76, + 0x65, 0x8f, 0x61, 0x66, 0x7d, 0x58, 0x82, 0x64, 0x69, 0x8e, 0x6f, + 0x84, 0x8a, 0x8b, 0x95, 0x8f, 0x90, 0x99, 0x96, 0x83, 0x92, 0x88, + 0x7d, 0x82, 0x70, 0x7f, 0x75, 0x69, 0x79, 0x73, 0x74, 0x78, 0x7b, + 0x81, 0x85, 0x7f, 0x89, 0x90, 0x80, 0x8b, 0x89, 0x80, 0x84, 0x78, + 0x7b, 0x7c, 0x70, 0x79, 0x7c, 0x77, 0x80, 0x81, 0x86, 0x8a, 0x86, + 0x8f, 0x90, 0x87, 0x90, 0x88, 0x8b, 0x86, 0x8a, 0x80, 0x47, 0x96, + 0x62, 0x3d, 0x8a, 0x43, 0x7a, 0x6b, 0x58, 0xa0, 0x7b, 0x85, 0x9e, + 0xa0, 0x9b, 0x9d, 0x95, 0x96, 0x99, 0x70, 0x83, 0x82, 0x64, 0x72, + 0x68, 0x74, 0x75, 0x6a, 0x81, 0x89, 0x7f, 0x87, 0x94, 0x8c, 0x8e, + 0x85, 0x86, 0x8b, 0x75, 0x72, 0x7d, 0x76, 0x6b, 0x75, 0x7c, 0x79, + 0x77, 0x82, 0x8c, 0x82, 0x84, 0x8f, 0x8c, 0x83, 0x84, 0x89, 0x84, + 0x7c, 0x81, 0x86, 0x82, 0x7e, 0x8d, 0x88, 0x92, 0x62, 0x67, 0xa6, + 0x3c, 0x67, 0x7f, 0x52, 0x81, 0x57, 0x7f, 0x94, 0x76, 0x89, 0xa1, + 0x9b, 0x8b, 0x99, 0x8f, 0x92, 0x82, 0x74, 0x8b, 0x77, 0x6a, 0x7a, + 0x7b, 0x7a, 0x77, 0x7e, 0x89, 0x82, 0x7d, 0x89, 0x8a, 0x7d, 0x7f, + 0x81, 0x80, 0x7b, 0x73, 0x81, 0x84, 0x72, 0x80, 0x87, 0x7e, 0x81, + 0x81, 0x82, 0x7f, 0x77, 0x7f, 0x80, 0x78, 0x7e, 0x85, 0x83, 0x82, + 0x88, 0x89, 0x89, 0x84, 0x88, 0x89, 0x82, 0x88, 0x84, 0x93, 0x4d, + 0x70, 0x9a, 0x2c, 0x7e, 0x73, 0x5d, 0x88, 0x62, 0x8f, 0x90, 0x82, + 0x8d, 0xa1, 0x8d, 0x85, 0x94, 0x80, 0x87, 0x7b, 0x77, 0x85, 0x76, + 0x76, 0x84, 0x81, 0x7e, 0x82, 0x84, 0x83, 0x7c, 0x7c, 0x85, 0x7b, + 0x79, 0x80, 0x7e, 0x7e, 0x7d, 0x80, 0x87, 0x80, 0x7f, 0x87, 0x82, + 0x7d, 0x80, 0x7d, 0x79, 0x7a, 0x75, 0x7b, 0x7d, 0x7a, 0x83, 0x86, + 0x84, 0x88, 0x8a, 0x87, 0x87, 0x85, 0x85, 0x81, 0x83, 0x7f, 0x87, + 0x80, 0x8b, 0x7b, 0x4b, 0x9e, 0x61, 0x4b, 0x91, 0x5e, 0x77, 0x76, + 0x79, 0x8c, 0x88, 0x81, 0x95, 0x95, 0x7f, 0x93, 0x86, 0x83, 0x84, + 0x7d, 0x80, 0x81, 0x79, 0x7f, 0x84, 0x7c, 0x82, 0x81, 0x80, 0x7f, + 0x7c, 0x7f, 0x7f, 0x7a, 0x7e, 0x81, 0x7e, 0x7a, 0x83, 0x85, 0x7c, + 0x85, 0x83, 0x81, 0x80, 0x7d, 0x7e, 0x7a, 0x78, 0x7a, 0x7c, 0x7a, + 0x80, 0x82, 0x84, 0x86, 0x87, 0x88, 0x86, 0x86, 0x85, 0x84, 0x81, + 0x82, 0x82, 0x7f, 0x87, 0x81, 0x91, 0x63, 0x65, 0x9a, 0x49, 0x6a, + 0x81, 0x63, 0x77, 0x74, 0x7f, 0x87, 0x86, 0x80, 0x9b, 0x8a, 0x84, + 0x92, 0x86, 0x86, 0x84, 0x83, 0x81, 0x84, 0x7b, 0x81, 0x83, 0x7b, + 0x7f, 0x80, 0x7c, 0x7a, 0x7c, 0x7c, 0x7d, 0x78, 0x83, 0x7f, 0x7e, + 0x88, 0x83, 0x84, 0x86, 0x83, 0x80, 0x81, 0x7b, 0x7b, 0x7b, 0x75, + 0x78, 0x7a, 0x7a, 0x7e, 0x82, 0x83, 0x87, 0x86, 0x85, 0x88, 0x84, + 0x84, 0x85, 0x81, 0x82, 0x81, 0x82, 0x80, 0x87, 0x82, 0x91, 0x6f, + 0x5a, 0x99, 0x4e, 0x5c, 0x8b, 0x5a, 0x76, 0x7a, 0x7c, 0x84, 0x8c, + 0x83, 0x95, 0x94, 0x81, 0x94, 0x8a, 0x82, 0x85, 0x85, 0x7f, 0x81, + 0x7e, 0x7d, 0x83, 0x7b, 0x7c, 0x81, 0x7c, 0x77, 0x7e, 0x7c, 0x7d, + 0x7c, 0x7c, 0x84, 0x7e, 0x81, 0x88, 0x82, 0x84, 0x84, 0x80, 0x80, + 0x7e, 0x7b, 0x7d, 0x7a, 0x78, 0x7c, 0x7c, 0x7d, 0x80, 0x83, 0x84, + 0x84, 0x84, 0x86, 0x85, 0x82, 0x85, 0x83, 0x81, 0x82, 0x83, 0x83, + 0x82, 0x87, 0x84, 0x8c, 0x62, 0x66, 0x8f, 0x4c, 0x64, 0x82, 0x66, + 0x71, 0x79, 0x84, 0x82, 0x8c, 0x85, 0x93, 0x95, 0x80, 0x8f, 0x8f, + 0x83, 0x83, 0x8a, 0x81, 0x80, 0x83, 0x7c, 0x82, 0x7d, 0x77, 0x7e, + 0x7c, 0x73, 0x7a, 0x7f, 0x7b, 0x7e, 0x82, 0x82, 0x83, 0x7f, 0x86, + 0x87, 0x7f, 0x83, 0x83, 0x80, 0x7c, 0x7e, 0x7e, 0x7b, 0x79, 0x79, + 0x7e, 0x7c, 0x7c, 0x82, 0x84, 0x81, 0x83, 0x86, 0x85, 0x83, 0x82, + 0x85, 0x83, 0x82, 0x83, 0x84, 0x83, 0x82, 0x88, 0x85, 0x87, 0x68, + 0x66, 0x8a, 0x5b, 0x5d, 0x7c, 0x6e, 0x70, 0x6f, 0x85, 0x83, 0x84, + 0x87, 0x89, 0x9a, 0x87, 0x85, 0x93, 0x8f, 0x85, 0x85, 0x8b, 0x82, + 0x80, 0x80, 0x7c, 0x7f, 0x7a, 0x76, 0x7a, 0x7a, 0x78, 0x7a, 0x80, + 0x7f, 0x80, 0x81, 0x80, 0x87, 0x84, 0x80, 0x84, 0x84, 0x80, 0x7f, + 0x80, 0x7f, 0x7e, 0x7c, 0x7b, 0x7c, 0x7a, 0x79, 0x7c, 0x7e, 0x7f, + 0x7e, 0x82, 0x84, 0x83, 0x85, 0x85, 0x87, 0x86, 0x84, 0x86, 0x85, + 0x85, 0x83, 0x84, 0x84, 0x83, 0x81, 0x82, 0x75, 0x61, 0x75, 0x76, + 0x62, 0x68, 0x6f, 0x7c, 0x73, 0x71, 0x84, 0x86, 0x8a, 0x86, 0x8c, + 0x91, 0x8d, 0x8f, 0x8a, 0x8a, 0x8c, 0x8a, 0x84, 0x7e, 0x84, 0x85, + 0x7c, 0x7b, 0x7c, 0x7c, 0x7b, 0x78, 0x79, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7d, 0x80, 0x81, 0x81, 0x7f, 0x80, 0x82, 0x82, 0x82, 0x80, 0x81, + 0x81, 0x80, 0x7e, 0x7e, 0x7c, 0x7c, 0x7e, 0x7d, 0x7f, 0x7e, 0x80, + 0x84, 0x81, 0x83, 0x83, 0x82, 0x82, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x81, 0x83, 0x81, 0x83, 0x83, 0x81, 0x7c, 0x79, 0x7d, + 0x7c, 0x72, 0x72, 0x7a, 0x73, 0x71, 0x79, 0x78, 0x78, 0x7d, 0x84, + 0x82, 0x81, 0x89, 0x8c, 0x89, 0x8a, 0x8f, 0x8b, 0x87, 0x8b, 0x88, + 0x85, 0x85, 0x85, 0x82, 0x7f, 0x7f, 0x7e, 0x7e, 0x7b, 0x7a, 0x7a, + 0x7a, 0x79, 0x78, 0x7a, 0x7a, 0x79, 0x7c, 0x7d, 0x7b, 0x7d, 0x81, + 0x80, 0x80, 0x81, 0x83, 0x83, 0x83, 0x84, 0x83, 0x83, 0x83, 0x83, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x81, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x83, 0x82, 0x83, 0x7e, + 0x78, 0x7e, 0x7d, 0x75, 0x71, 0x78, 0x77, 0x70, 0x76, 0x7a, 0x79, + 0x7b, 0x83, 0x84, 0x80, 0x87, 0x8c, 0x89, 0x88, 0x8c, 0x8d, 0x88, + 0x89, 0x89, 0x86, 0x85, 0x84, 0x82, 0x82, 0x80, 0x7e, 0x7f, 0x7d, + 0x7b, 0x7a, 0x7b, 0x79, 0x78, 0x79, 0x7a, 0x7a, 0x7b, 0x7d, 0x7e, + 0x7e, 0x80, 0x81, 0x81, 0x81, 0x80, 0x81, 0x81, 0x80, 0x7f, 0x80, + 0x82, 0x80, 0x80, 0x81, 0x81, 0x80, 0x82, 0x81, 0x80, 0x81, 0x82, + 0x82, 0x80, 0x81, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x82, 0x82, 0x83, 0x83, 0x82, 0x82, 0x80, 0x79, 0x79, 0x7d, + 0x76, 0x6e, 0x74, 0x77, 0x70, 0x73, 0x79, 0x79, 0x7a, 0x81, 0x86, + 0x82, 0x85, 0x8d, 0x8c, 0x8a, 0x8c, 0x8e, 0x8b, 0x89, 0x8a, 0x88, + 0x86, 0x85, 0x84, 0x82, 0x80, 0x7d, 0x7d, 0x7b, 0x79, 0x78, 0x77, + 0x78, 0x76, 0x76, 0x79, 0x79, 0x7a, 0x7d, 0x7f, 0x7f, 0x81, 0x83, + 0x83, 0x84, 0x84, 0x84, 0x83, 0x82, 0x83, 0x81, 0x7f, 0x80, 0x7f, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7e, 0x7d, 0x7e, 0x7f, 0x7f, + 0x80, 0x81, 0x83, 0x83, 0x83, 0x84, 0x85, 0x84, 0x84, 0x83, 0x83, + 0x82, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7d, + 0x79, 0x7a, 0x7d, 0x78, 0x71, 0x75, 0x79, 0x73, 0x74, 0x7a, 0x7a, + 0x7b, 0x81, 0x84, 0x82, 0x86, 0x8c, 0x8c, 0x8a, 0x8b, 0x8d, 0x8a, + 0x89, 0x88, 0x86, 0x84, 0x84, 0x83, 0x80, 0x80, 0x7e, 0x7e, 0x7d, + 0x7b, 0x7a, 0x7a, 0x7a, 0x78, 0x79, 0x7a, 0x79, 0x79, 0x7c, 0x7d, + 0x7d, 0x7f, 0x81, 0x82, 0x82, 0x83, 0x84, 0x84, 0x83, 0x83, 0x82, + 0x81, 0x81, 0x80, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x80, 0x82, 0x84, 0x83, 0x83, 0x85, 0x84, 0x84, + 0x83, 0x83, 0x83, 0x81, 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x79, 0x78, + 0x7b, 0x79, 0x75, 0x77, 0x7a, 0x78, 0x79, 0x7d, 0x7e, 0x7f, 0x83, + 0x86, 0x85, 0x87, 0x8b, 0x8b, 0x8a, 0x8b, 0x8b, 0x89, 0x88, 0x87, + 0x86, 0x83, 0x82, 0x81, 0x7e, 0x7c, 0x7c, 0x7b, 0x7a, 0x79, 0x78, + 0x79, 0x79, 0x78, 0x7a, 0x7b, 0x7b, 0x7c, 0x7e, 0x7f, 0x80, 0x82, + 0x82, 0x83, 0x83, 0x82, 0x82, 0x82, 0x81, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x80, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x81, 0x82, 0x81, 0x82, + 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x81, 0x7e, 0x7e, 0x7e, 0x7c, 0x7a, 0x7b, 0x7c, 0x7b, + 0x7b, 0x7d, 0x7e, 0x7e, 0x81, 0x82, 0x81, 0x82, 0x84, 0x84, 0x83, + 0x84, 0x84, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x80, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, + }, + { // 8 + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, + 0x81, 0x80, 0x80, 0x7f, 0x7d, 0x7c, 0x79, 0x78, 0x78, 0x78, 0x7a, + 0x7d, 0x7f, 0x81, 0x83, 0x83, 0x84, 0x84, 0x85, 0x85, 0x86, 0x85, + 0x84, 0x83, 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7c, 0x7c, + 0x7b, 0x7c, 0x7d, 0x80, 0x82, 0x83, 0x84, 0x84, 0x82, 0x81, 0x81, + 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x83, 0x85, 0x87, + 0x88, 0x8a, 0x84, 0x73, 0x6c, 0x61, 0x53, 0x5d, 0x66, 0x6e, 0x81, + 0x8b, 0x8e, 0x8e, 0x8d, 0x8f, 0x8e, 0x93, 0x9a, 0x96, 0x8f, 0x8a, + 0x7b, 0x6e, 0x6d, 0x6a, 0x6e, 0x79, 0x82, 0x87, 0x88, 0x89, 0x86, + 0x80, 0x85, 0x88, 0x87, 0x8a, 0x89, 0x7f, 0x78, 0x72, 0x6c, 0x6b, + 0x70, 0x76, 0x7a, 0x7f, 0x83, 0x83, 0x86, 0x8a, 0x8c, 0x8f, 0x8f, + 0x8b, 0x86, 0x81, 0x7f, 0x7e, 0x81, 0x85, 0x86, 0x8a, 0x8c, 0x8b, + 0x8a, 0x8a, 0x78, 0x5f, 0x59, 0x48, 0x42, 0x5a, 0x68, 0x78, 0x8e, + 0x96, 0x98, 0x97, 0x9c, 0x9f, 0x9d, 0xa2, 0x9f, 0x8a, 0x7b, 0x6f, + 0x5a, 0x58, 0x63, 0x6b, 0x7a, 0x87, 0x90, 0x90, 0x8d, 0x93, 0x90, + 0x8f, 0x97, 0x91, 0x85, 0x7e, 0x6e, 0x5f, 0x5a, 0x5c, 0x62, 0x6c, + 0x7d, 0x88, 0x8f, 0x99, 0x9a, 0x98, 0x99, 0x93, 0x8b, 0x84, 0x7f, + 0x79, 0x77, 0x7b, 0x7e, 0x82, 0x89, 0x8d, 0x8d, 0x91, 0x7b, 0x59, + 0x56, 0x43, 0x3f, 0x60, 0x6f, 0x7e, 0x8f, 0x92, 0x94, 0x93, 0x9f, + 0xab, 0xa5, 0xa5, 0x9c, 0x7a, 0x66, 0x5f, 0x54, 0x5f, 0x71, 0x7d, + 0x84, 0x84, 0x8c, 0x8a, 0x8c, 0xa0, 0xa0, 0x99, 0x96, 0x82, 0x6c, + 0x62, 0x5f, 0x60, 0x64, 0x6e, 0x72, 0x72, 0x7f, 0x8a, 0x95, 0xa3, + 0xa6, 0x9e, 0x90, 0x84, 0x7a, 0x74, 0x7c, 0x80, 0x81, 0x82, 0x80, + 0x7e, 0x86, 0x8f, 0x99, 0x96, 0x66, 0x4f, 0x44, 0x2b, 0x4d, 0x73, + 0x7f, 0x8f, 0x8e, 0x8f, 0x8e, 0x99, 0xba, 0xba, 0xaa, 0xa0, 0x77, + 0x53, 0x55, 0x5b, 0x6b, 0x78, 0x7e, 0x7e, 0x6e, 0x7d, 0x96, 0x9d, + 0xb2, 0xb2, 0x96, 0x7a, 0x63, 0x60, 0x62, 0x6f, 0x7c, 0x6e, 0x65, + 0x66, 0x6f, 0x87, 0xa0, 0xb0, 0xa5, 0x92, 0x86, 0x79, 0x7f, 0x8a, + 0x8b, 0x82, 0x75, 0x6e, 0x6e, 0x7f, 0x94, 0x9d, 0x9d, 0x9f, 0x71, + 0x35, 0x42, 0x45, 0x49, 0x74, 0x7b, 0x72, 0x68, 0x7d, 0xa5, 0xaf, + 0xca, 0xd1, 0x9d, 0x7b, 0x76, 0x6d, 0x6f, 0x72, 0x73, 0x5d, 0x47, + 0x68, 0x80, 0x91, 0xae, 0xab, 0x95, 0x85, 0x8d, 0x92, 0x89, 0x8b, + 0x76, 0x58, 0x54, 0x5f, 0x6b, 0x75, 0x84, 0x84, 0x80, 0x91, 0x9f, + 0xa0, 0x9c, 0x93, 0x81, 0x74, 0x7b, 0x7f, 0x7a, 0x79, 0x76, 0x74, + 0x7c, 0x8c, 0x95, 0x92, 0x9c, 0x7a, 0x3b, 0x42, 0x51, 0x5a, 0x6d, + 0x72, 0x70, 0x68, 0x8b, 0xb1, 0xb0, 0xb3, 0xa7, 0x91, 0x87, 0x8b, + 0x8e, 0x75, 0x5e, 0x5a, 0x5c, 0x6c, 0x82, 0x8a, 0x83, 0x86, 0x95, + 0x9e, 0xa1, 0x9a, 0x86, 0x74, 0x74, 0x7a, 0x77, 0x6c, 0x61, 0x5f, + 0x6d, 0x83, 0x91, 0x90, 0x8b, 0x8d, 0x92, 0x98, 0x95, 0x87, 0x77, + 0x73, 0x7a, 0x7f, 0x7d, 0x78, 0x74, 0x7b, 0x8a, 0x99, 0x96, 0x72, + 0x4c, 0x4f, 0x62, 0x6c, 0x6b, 0x62, 0x5f, 0x70, 0x94, 0xa4, 0x9a, + 0x91, 0x94, 0x9c, 0x9f, 0x9a, 0x88, 0x73, 0x74, 0x7c, 0x79, 0x73, + 0x70, 0x73, 0x7d, 0x8d, 0x91, 0x88, 0x86, 0x8a, 0x8a, 0x87, 0x82, + 0x7a, 0x74, 0x78, 0x7a, 0x75, 0x73, 0x78, 0x7d, 0x81, 0x86, 0x88, + 0x89, 0x8d, 0x8f, 0x8a, 0x84, 0x83, 0x80, 0x7c, 0x7b, 0x79, 0x7a, + 0x7e, 0x87, 0x84, 0x75, 0x6b, 0x64, 0x67, 0x67, 0x65, 0x64, 0x68, + 0x75, 0x7e, 0x85, 0x89, 0x90, 0x98, 0x9a, 0x96, 0x91, 0x90, 0x8d, + 0x88, 0x84, 0x7e, 0x7b, 0x7c, 0x7c, 0x7b, 0x7d, 0x82, 0x85, 0x85, + 0x84, 0x84, 0x84, 0x84, 0x85, 0x80, 0x7c, 0x7a, 0x79, 0x77, 0x77, + 0x7b, 0x7b, 0x7d, 0x7e, 0x80, 0x85, 0x89, 0x8a, 0x88, 0x85, 0x83, + 0x81, 0x80, 0x7e, 0x7c, 0x7b, 0x79, 0x7b, 0x7a, 0x76, 0x77, 0x73, + 0x71, 0x6f, 0x6f, 0x70, 0x70, 0x75, 0x78, 0x7b, 0x80, 0x84, 0x87, + 0x8a, 0x8f, 0x90, 0x8f, 0x8e, 0x8c, 0x88, 0x86, 0x85, 0x84, 0x81, + 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x84, 0x85, 0x84, 0x82, + 0x81, 0x7f, 0x7d, 0x7d, 0x7c, 0x7b, 0x7a, 0x7a, 0x7b, 0x7d, 0x80, + 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7d, + 0x80, 0x7e, 0x7e, 0x80, 0x7e, 0x7f, 0x7f, 0x7f, 0x81, 0x81, 0x83, + 0x80, 0x7f, 0x7f, 0x7d, 0x80, 0x7f, 0x7d, 0x80, 0x7e, 0x7e, 0x81, + 0x7f, 0x81, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7e, 0x7f, 0x7f, 0x7f, + 0x7e, 0x80, 0x7d, 0x84, 0x82, 0x82, 0x82, 0x7f, 0x81, 0x80, 0x80, + 0x7f, 0x81, 0x7b, 0x7f, 0x7f, 0x80, 0x81, 0x7f, 0x80, 0x7e, 0x7f, + 0x81, 0x7f, 0x82, 0x7f, 0x7e, 0x80, 0x7c, 0x81, 0x7f, 0x7f, 0x7f, + 0x80, 0x7e, 0x7f, 0x82, 0x7f, 0x84, 0x80, 0x81, 0x81, 0x7e, 0x81, + 0x81, 0x7f, 0x80, 0x80, 0x7e, 0x82, 0x7d, 0x80, 0x7e, 0x7c, 0x81, + 0x7c, 0x7f, 0x80, 0x7e, 0x7e, 0x81, 0x7e, 0x81, 0x82, 0x81, 0x80, + 0x82, 0x80, 0x82, 0x81, 0x80, 0x80, 0x7d, 0x81, 0x7d, 0x81, 0x7f, + 0x82, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7d, + 0x7f, 0x80, 0x80, 0x7f, 0x84, 0x7e, 0x82, 0x82, 0x7f, 0x80, 0x82, + 0x7d, 0x82, 0x7f, 0x7d, 0x83, 0x7d, 0x81, 0x82, 0x7f, 0x82, 0x81, + 0x7f, 0x80, 0x7f, 0x7d, 0x7f, 0x7c, 0x7e, 0x7c, 0x7d, 0x7f, 0x7e, + 0x83, 0x81, 0x83, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x81, 0x7c, + 0x80, 0x7c, 0x7f, 0x83, 0x7e, 0x82, 0x82, 0x7e, 0x80, 0x80, 0x7d, + 0x81, 0x7c, 0x7c, 0x80, 0x79, 0x7f, 0x7e, 0x7e, 0x82, 0x7f, 0x82, + 0x81, 0x80, 0x82, 0x81, 0x7f, 0x82, 0x7e, 0x7f, 0x7f, 0x7e, 0x80, + 0x80, 0x7f, 0x80, 0x82, 0x80, 0x81, 0x7f, 0x80, 0x7f, 0x7e, 0x80, + 0x7c, 0x7e, 0x7d, 0x7c, 0x80, 0x80, 0x7e, 0x82, 0x82, 0x80, 0x84, + 0x80, 0x82, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x81, + 0x7e, 0x83, 0x7e, 0x7f, 0x80, 0x7b, 0x80, 0x7d, 0x7e, 0x7f, 0x7f, + 0x7c, 0x81, 0x7e, 0x81, 0x83, 0x7f, 0x82, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x81, 0x7e, 0x80, 0x7e, 0x7c, 0x83, 0x7f, 0x83, 0x80, 0x83, + 0x7d, 0x80, 0x82, 0x7c, 0x82, 0x7d, 0x7c, 0x7d, 0x7d, 0x7c, 0x81, + 0x80, 0x7f, 0x84, 0x7e, 0x82, 0x80, 0x80, 0x81, 0x80, 0x81, 0x7d, + 0x82, 0x7e, 0x7e, 0x83, 0x80, 0x81, 0x80, 0x80, 0x80, 0x7e, 0x81, + 0x7d, 0x7f, 0x7d, 0x7e, 0x7e, 0x7d, 0x7f, 0x83, 0x7f, 0x81, 0x83, + 0x7c, 0x83, 0x7e, 0x7d, 0x82, 0x7e, 0x80, 0x7f, 0x7d, 0x80, 0x7e, + 0x7f, 0x82, 0x80, 0x80, 0x84, 0x7d, 0x83, 0x80, 0x7f, 0x81, 0x7c, + 0x7e, 0x7d, 0x7d, 0x7f, 0x7f, 0x80, 0x81, 0x7e, 0x82, 0x80, 0x80, + 0x82, 0x80, 0x7e, 0x80, 0x81, 0x7d, 0x81, 0x81, 0x7e, 0x82, 0x7f, + 0x83, 0x80, 0x81, 0x7f, 0x7f, 0x7d, 0x7d, 0x7e, 0x7d, 0x7e, 0x7e, + 0x81, 0x80, 0x82, 0x80, 0x84, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7e, 0x7e, 0x80, 0x7f, 0x80, 0x82, 0x81, 0x83, 0x81, + 0x81, 0x81, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7d, 0x80, 0x7e, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7c, + 0x82, 0x7e, 0x80, 0x82, 0x80, 0x81, 0x82, 0x7e, 0x80, 0x7f, 0x7d, + 0x81, 0x7d, 0x7f, 0x80, 0x7b, 0x7e, 0x84, 0x7c, 0x82, 0x82, 0x7d, + 0x84, 0x7f, 0x80, 0x80, 0x7b, 0x80, 0x7f, 0x7f, 0x82, 0x7f, 0x7f, + 0x81, 0x7d, 0x82, 0x81, 0x7f, 0x81, 0x80, 0x7f, 0x80, 0x7e, 0x7e, + 0x7e, 0x7e, 0x80, 0x80, 0x80, 0x7d, 0x80, 0x82, 0x80, 0x7f, 0x7f, + 0x7d, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x7f, 0x81, 0x7e, 0x82, 0x82, + 0x7d, 0x83, 0x7c, 0x81, 0x7d, 0x7f, 0x7f, 0x7d, 0x7f, 0x7e, 0x81, + 0x7f, 0x81, 0x80, 0x82, 0x80, 0x83, 0x7f, 0x7f, 0x80, 0x7d, 0x80, + 0x7f, 0x7d, 0x7e, 0x7f, 0x7e, 0x82, 0x81, 0x80, 0x82, 0x7e, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x80, 0x7d, 0x82, 0x7e, 0x82, + 0x80, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x7f, + 0x82, 0x80, 0x81, 0x82, 0x7d, 0x82, 0x7b, 0x82, 0x7e, 0x7f, 0x80, + 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x83, 0x7c, 0x81, 0x80, 0x7d, 0x83, + 0x7e, 0x83, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x7f, 0x81, 0x7c, 0x83, + 0x7d, 0x81, 0x80, 0x7f, 0x80, 0x81, 0x7e, 0x7f, 0x80, 0x7c, 0x82, + 0x7d, 0x81, 0x7f, 0x7f, 0x7f, 0x81, 0x7f, 0x80, 0x7f, 0x7d, 0x81, + 0x7c, 0x80, 0x81, 0x7d, 0x82, 0x81, 0x7f, 0x84, 0x7d, 0x81, 0x80, + 0x7d, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x81, 0x7f, + 0x7e, 0x82, 0x7e, 0x7f, 0x81, 0x7a, 0x82, 0x81, 0x7d, 0x83, 0x7e, + 0x7f, 0x80, 0x7f, 0x7e, 0x81, 0x7d, 0x81, 0x81, 0x7f, 0x80, 0x80, + 0x82, 0x7d, 0x82, 0x7e, 0x7e, 0x81, 0x7f, 0x80, 0x82, 0x7e, 0x7d, + 0x81, 0x7c, 0x81, 0x7f, 0x7d, 0x81, 0x7c, 0x80, 0x80, 0x80, 0x81, + 0x81, 0x7d, 0x81, 0x81, 0x7c, 0x84, 0x80, 0x7e, 0x81, 0x7f, 0x7c, + 0x83, 0x7d, 0x81, 0x80, 0x7d, 0x80, 0x7e, 0x7e, 0x7f, 0x81, 0x7d, + 0x80, 0x7f, 0x80, 0x81, 0x7f, 0x82, 0x80, 0x81, 0x80, 0x7d, 0x82, + 0x7e, 0x7f, 0x83, 0x7e, 0x82, 0x81, 0x7f, 0x82, 0x7f, 0x7d, 0x7f, + 0x7d, 0x7c, 0x81, 0x7c, 0x7e, 0x80, 0x7d, 0x7f, 0x80, 0x7f, 0x81, + 0x80, 0x7f, 0x82, 0x7f, 0x80, 0x82, 0x7f, 0x7f, 0x81, 0x7c, 0x7f, + 0x80, 0x7e, 0x81, 0x80, 0x7d, 0x80, 0x80, 0x7c, 0x83, 0x7e, 0x81, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x80, 0x7e, 0x81, 0x7e, 0x81, + 0x7d, 0x81, 0x80, 0x7e, 0x81, 0x7e, 0x7d, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x82, 0x80, 0x81, 0x80, 0x7f, 0x7d, 0x7f, 0x7f, + 0x7e, 0x81, 0x7d, 0x81, 0x7d, 0x7e, 0x80, 0x7f, 0x81, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x81, 0x7d, 0x80, 0x7f, 0x7e, 0x81, 0x7e, 0x80, + 0x81, 0x80, 0x80, 0x82, 0x7e, 0x80, 0x7f, 0x7e, 0x80, 0x7e, 0x7d, + 0x7f, 0x7d, 0x7e, 0x81, 0x7f, 0x81, 0x81, 0x7f, 0x80, 0x80, 0x7f, + 0x81, 0x7e, 0x80, 0x80, 0x7d, 0x81, 0x7f, 0x7e, 0x81, 0x7e, 0x7e, + 0x82, 0x7e, 0x81, 0x80, 0x7e, 0x81, 0x7e, 0x7f, 0x80, 0x7e, 0x80, + 0x7f, 0x7e, 0x81, 0x7e, 0x80, 0x80, 0x80, 0x81, 0x81, 0x7e, 0x81, + 0x7f, 0x7e, 0x82, 0x7e, 0x80, 0x81, 0x7f, 0x81, 0x80, 0x7e, 0x80, + 0x7e, 0x7b, 0x7b, 0x7a, 0x77, 0x79, 0x79, 0x79, 0x7c, 0x7c, 0x7d, + 0x80, 0x81, 0x83, 0x86, 0x86, 0x88, 0x88, 0x87, 0x87, 0x86, 0x86, + 0x84, 0x83, 0x81, 0x80, 0x7e, 0x7e, 0x7c, 0x7c, 0x7b, 0x7a, 0x7a, + 0x7b, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x82, 0x82, 0x83, 0x84, + 0x84, 0x84, 0x84, 0x85, 0x82, 0x83, 0x81, 0x81, 0x81, 0x80, 0x7f, + 0x80, 0x7e, 0x81, 0x7f, 0x83, 0x77, 0x6d, 0x88, 0x69, 0x6a, 0x7a, + 0x65, 0x77, 0x6e, 0x6d, 0x80, 0x7a, 0x7c, 0x88, 0x8c, 0x8d, 0x90, + 0x91, 0x93, 0x98, 0x8e, 0x8e, 0x93, 0x86, 0x85, 0x83, 0x7e, 0x7e, + 0x77, 0x76, 0x79, 0x76, 0x74, 0x77, 0x78, 0x79, 0x7a, 0x7a, 0x7f, + 0x80, 0x7e, 0x82, 0x84, 0x82, 0x84, 0x83, 0x83, 0x85, 0x80, 0x7d, + 0x80, 0x7e, 0x76, 0x7b, 0x7b, 0x79, 0x7a, 0x7b, 0x7f, 0x7f, 0x80, + 0x85, 0x87, 0x85, 0x88, 0x89, 0x89, 0x87, 0x86, 0x87, 0x85, 0x82, + 0x82, 0x84, 0x7f, 0x80, 0x80, 0x81, 0x83, 0x7d, 0x7f, 0x63, 0x7c, + 0x78, 0x49, 0x7f, 0x64, 0x5a, 0x7a, 0x5d, 0x7c, 0x7f, 0x75, 0x8b, + 0x92, 0x95, 0x8f, 0x9e, 0x9a, 0x94, 0x9e, 0x8b, 0x96, 0x94, 0x7a, + 0x8a, 0x83, 0x76, 0x7b, 0x75, 0x78, 0x74, 0x73, 0x72, 0x77, 0x7a, + 0x71, 0x7f, 0x7f, 0x7b, 0x83, 0x7f, 0x86, 0x86, 0x81, 0x88, 0x86, + 0x83, 0x7f, 0x80, 0x82, 0x79, 0x7a, 0x7d, 0x78, 0x77, 0x79, 0x7c, + 0x7b, 0x7c, 0x7f, 0x83, 0x84, 0x83, 0x89, 0x8a, 0x88, 0x89, 0x8a, + 0x89, 0x87, 0x86, 0x86, 0x83, 0x80, 0x7f, 0x80, 0x7f, 0x7c, 0x81, + 0x7f, 0x81, 0x6b, 0x66, 0x8d, 0x51, 0x57, 0x8a, 0x4d, 0x68, 0x74, + 0x65, 0x84, 0x77, 0x88, 0x8d, 0x9a, 0xa1, 0x85, 0xaa, 0xa4, 0x8a, + 0xa2, 0x95, 0x8c, 0x8b, 0x7e, 0x81, 0x7f, 0x77, 0x74, 0x73, 0x7a, + 0x6e, 0x6c, 0x7d, 0x75, 0x75, 0x7b, 0x7a, 0x82, 0x7d, 0x7f, 0x86, + 0x84, 0x87, 0x83, 0x86, 0x8a, 0x83, 0x83, 0x83, 0x83, 0x7c, 0x76, + 0x7d, 0x79, 0x72, 0x76, 0x77, 0x77, 0x76, 0x7b, 0x81, 0x80, 0x84, + 0x86, 0x89, 0x8c, 0x89, 0x8b, 0x8c, 0x8b, 0x88, 0x86, 0x86, 0x83, + 0x80, 0x80, 0x7e, 0x7d, 0x7c, 0x7c, 0x7d, 0x7f, 0x80, 0x7e, 0x80, + 0x74, 0x69, 0x79, 0x72, 0x65, 0x67, 0x6b, 0x76, 0x6a, 0x6a, 0x82, + 0x83, 0x81, 0x89, 0x92, 0x94, 0x8f, 0x96, 0x9a, 0x92, 0x92, 0x94, + 0x8e, 0x86, 0x86, 0x86, 0x81, 0x7d, 0x7d, 0x7c, 0x79, 0x78, 0x79, + 0x7a, 0x78, 0x76, 0x78, 0x7b, 0x79, 0x79, 0x7c, 0x7e, 0x7c, 0x7d, + 0x81, 0x82, 0x80, 0x83, 0x84, 0x82, 0x82, 0x83, 0x82, 0x7f, 0x7e, + 0x80, 0x7d, 0x79, 0x7a, 0x7c, 0x7a, 0x7b, 0x7e, 0x7e, 0x7e, 0x81, + 0x82, 0x83, 0x84, 0x86, 0x87, 0x86, 0x86, 0x87, 0x87, 0x86, 0x85, + 0x84, 0x83, 0x81, 0x81, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7e, 0x71, 0x71, 0x79, 0x71, 0x64, 0x69, 0x74, 0x6d, + 0x68, 0x77, 0x7c, 0x79, 0x83, 0x8e, 0x8b, 0x88, 0x94, 0x9a, 0x94, + 0x92, 0x96, 0x94, 0x8d, 0x8c, 0x8c, 0x88, 0x83, 0x82, 0x81, 0x7e, + 0x7a, 0x79, 0x7a, 0x78, 0x72, 0x74, 0x77, 0x74, 0x72, 0x77, 0x79, + 0x76, 0x79, 0x7e, 0x7e, 0x7e, 0x81, 0x85, 0x83, 0x83, 0x85, 0x86, + 0x84, 0x84, 0x84, 0x81, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7e, 0x80, 0x80, 0x82, 0x84, 0x84, 0x85, 0x86, 0x86, + 0x86, 0x85, 0x86, 0x85, 0x82, 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x75, 0x6c, 0x74, 0x76, + 0x68, 0x64, 0x71, 0x73, 0x6a, 0x73, 0x7f, 0x7d, 0x82, 0x8c, 0x90, + 0x8b, 0x90, 0x9a, 0x97, 0x92, 0x94, 0x96, 0x91, 0x8e, 0x8c, 0x89, + 0x86, 0x82, 0x7f, 0x7d, 0x78, 0x74, 0x75, 0x74, 0x70, 0x6f, 0x73, + 0x74, 0x72, 0x75, 0x7a, 0x7a, 0x7b, 0x80, 0x83, 0x82, 0x85, 0x88, + 0x87, 0x86, 0x87, 0x86, 0x85, 0x83, 0x81, 0x7f, 0x7d, 0x7d, 0x7c, + 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7d, 0x7f, 0x80, 0x82, 0x83, + 0x85, 0x86, 0x87, 0x87, 0x88, 0x87, 0x86, 0x86, 0x84, 0x83, 0x83, + 0x81, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7d, + 0x7d, 0x7e, 0x7e, 0x7f, 0x7b, 0x72, 0x75, 0x7b, 0x73, 0x6b, 0x72, + 0x7a, 0x73, 0x74, 0x7f, 0x82, 0x81, 0x89, 0x8e, 0x89, 0x8b, 0x93, + 0x93, 0x8f, 0x8e, 0x90, 0x8d, 0x89, 0x89, 0x86, 0x84, 0x81, 0x7e, + 0x7c, 0x7a, 0x77, 0x77, 0x78, 0x76, 0x73, 0x76, 0x78, 0x77, 0x78, + 0x7b, 0x7d, 0x7d, 0x7f, 0x81, 0x81, 0x81, 0x83, 0x83, 0x82, 0x81, + 0x80, 0x80, 0x81, 0x7f, 0x7e, 0x7f, 0x80, 0x7d, 0x7d, 0x7f, 0x7e, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x83, 0x82, 0x82, 0x84, 0x84, 0x83, + 0x83, 0x83, 0x83, 0x82, 0x81, 0x81, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, + 0x7c, 0x7c, 0x7e, 0x7d, 0x7d, 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x81, + 0x82, 0x81, 0x80, 0x80, 0x7d, 0x77, 0x75, 0x78, 0x76, 0x70, 0x72, + 0x78, 0x76, 0x76, 0x7d, 0x81, 0x81, 0x85, 0x8a, 0x89, 0x8a, 0x8e, + 0x90, 0x8d, 0x8c, 0x8d, 0x8c, 0x89, 0x87, 0x86, 0x84, 0x83, 0x80, + 0x7f, 0x7d, 0x7a, 0x79, 0x78, 0x77, 0x75, 0x75, 0x76, 0x76, 0x77, + 0x79, 0x7b, 0x7c, 0x7e, 0x80, 0x81, 0x82, 0x84, 0x84, 0x82, 0x82, + 0x82, 0x81, 0x7e, 0x7d, 0x7f, 0x7e, 0x7d, 0x7e, 0x80, 0x7f, 0x7f, + 0x81, 0x81, 0x80, 0x81, 0x83, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, + 0x84, 0x83, 0x82, 0x82, 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x7c, 0x7b, + 0x7b, 0x7b, 0x7a, 0x7b, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x82, 0x82, + 0x83, 0x83, 0x83, 0x84, 0x84, 0x83, 0x84, 0x83, 0x81, 0x81, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x7d, 0x7e, + 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, + 0x7e, 0x7e, 0x7d, 0x7e, 0x7d, 0x79, 0x78, 0x7a, 0x78, 0x76, 0x76, + 0x79, 0x79, 0x79, 0x7d, 0x7f, 0x81, 0x83, 0x87, 0x88, 0x88, 0x8b, + 0x8c, 0x8b, 0x8b, 0x8b, 0x8a, 0x88, 0x86, 0x85, 0x83, 0x81, 0x7f, + 0x7e, 0x7c, 0x7a, 0x7a, 0x79, 0x79, 0x78, 0x78, 0x7a, 0x7a, 0x7a, + 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7d, 0x7c, 0x7d, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x82, + 0x83, 0x83, 0x83, 0x83, 0x84, 0x83, 0x83, 0x82, 0x81, 0x80, 0x7f, + 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, + 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, 0x80, + 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, + }, + { // 9 + 0x7f, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x81, 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7e, 0x81, 0x7d, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, + 0x7d, 0x7f, 0x7f, 0x7d, 0x80, 0x7e, 0x7f, 0x80, 0x7f, 0x81, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x81, 0x82, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7d, 0x7e, 0x7d, 0x7e, 0x7e, 0x80, 0x7e, 0x7f, + 0x7e, 0x7e, 0x7e, 0x83, 0x84, 0x82, 0x81, 0x82, 0x80, 0x7e, 0x84, + 0x7e, 0x81, 0x81, 0x7d, 0x7f, 0x7f, 0x7d, 0x81, 0x7f, 0x7e, 0x82, + 0x7c, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x7d, 0x7f, 0x7c, 0x7f, + 0x7c, 0x7c, 0x7e, 0x7c, 0x7d, 0x7d, 0x7c, 0x7f, 0x7f, 0x7d, 0x81, + 0x80, 0x81, 0x82, 0x80, 0x84, 0x82, 0x82, 0x85, 0x81, 0x84, 0x83, + 0x81, 0x82, 0x82, 0x81, 0x81, 0x82, 0x80, 0x80, 0x7f, 0x7d, 0x80, + 0x7e, 0x7c, 0x7f, 0x7b, 0x7d, 0x7b, 0x7c, 0x7d, 0x7c, 0x7d, 0x7f, + 0x7e, 0x7f, 0x80, 0x7f, 0x83, 0x80, 0x83, 0x83, 0x80, 0x83, 0x81, + 0x81, 0x84, 0x81, 0x7f, 0x83, 0x7e, 0x7f, 0x81, 0x7e, 0x80, 0x7e, + 0x7e, 0x80, 0x7d, 0x7f, 0x7f, 0x80, 0x82, 0x7f, 0x82, 0x76, 0x7c, + 0x85, 0x6f, 0x7e, 0x7b, 0x72, 0x82, 0x6e, 0x7a, 0x84, 0x74, 0x83, + 0x7f, 0x83, 0x88, 0x82, 0x88, 0x8a, 0x8a, 0x84, 0x8a, 0x87, 0x84, + 0x87, 0x7e, 0x87, 0x82, 0x7a, 0x84, 0x7c, 0x7d, 0x7f, 0x77, 0x80, + 0x7c, 0x79, 0x7d, 0x7e, 0x7c, 0x7a, 0x7b, 0x7e, 0x7a, 0x7b, 0x7f, + 0x7e, 0x7e, 0x7f, 0x82, 0x83, 0x81, 0x84, 0x86, 0x84, 0x84, 0x84, + 0x86, 0x82, 0x80, 0x83, 0x81, 0x7e, 0x7f, 0x7e, 0x7f, 0x7d, 0x7b, + 0x80, 0x7f, 0x7d, 0x80, 0x80, 0x84, 0x80, 0x87, 0x77, 0x72, 0x90, + 0x67, 0x74, 0x81, 0x62, 0x85, 0x6b, 0x6c, 0x8d, 0x6e, 0x80, 0x88, + 0x81, 0x91, 0x88, 0x8b, 0x95, 0x90, 0x86, 0x91, 0x8c, 0x83, 0x8a, + 0x7a, 0x85, 0x80, 0x70, 0x84, 0x76, 0x77, 0x7d, 0x72, 0x81, 0x7c, + 0x75, 0x82, 0x80, 0x7a, 0x83, 0x7e, 0x81, 0x81, 0x79, 0x84, 0x7d, + 0x7b, 0x82, 0x7e, 0x81, 0x80, 0x7f, 0x87, 0x81, 0x81, 0x8a, 0x82, + 0x85, 0x84, 0x83, 0x85, 0x7f, 0x81, 0x82, 0x7d, 0x7e, 0x7e, 0x7c, + 0x80, 0x7b, 0x81, 0x81, 0x82, 0x82, 0x89, 0x7b, 0x60, 0x9b, 0x65, + 0x5e, 0x8f, 0x4f, 0x86, 0x6c, 0x59, 0x9d, 0x68, 0x7c, 0x94, 0x81, + 0x9b, 0x8e, 0x8f, 0xa1, 0x97, 0x86, 0x99, 0x92, 0x7e, 0x8c, 0x73, + 0x83, 0x7c, 0x60, 0x82, 0x6f, 0x6c, 0x78, 0x70, 0x7f, 0x7c, 0x75, + 0x89, 0x89, 0x7a, 0x8c, 0x88, 0x85, 0x87, 0x7c, 0x89, 0x7c, 0x75, + 0x80, 0x79, 0x78, 0x7b, 0x7c, 0x83, 0x7d, 0x81, 0x8d, 0x84, 0x87, + 0x8b, 0x88, 0x88, 0x82, 0x84, 0x84, 0x7a, 0x7b, 0x7f, 0x77, 0x7a, + 0x7a, 0x7d, 0x86, 0x7b, 0x8e, 0x56, 0x80, 0x9e, 0x30, 0x96, 0x70, + 0x58, 0x98, 0x44, 0x93, 0x8e, 0x60, 0x9d, 0x8f, 0x90, 0x97, 0x90, + 0x9a, 0x9e, 0x84, 0x86, 0x9e, 0x74, 0x7b, 0x7f, 0x6e, 0x83, 0x5f, + 0x74, 0x82, 0x66, 0x78, 0x80, 0x81, 0x7f, 0x82, 0x89, 0x8f, 0x81, + 0x85, 0x8f, 0x81, 0x7f, 0x7e, 0x80, 0x77, 0x6f, 0x79, 0x7a, 0x72, + 0x78, 0x82, 0x82, 0x81, 0x86, 0x8f, 0x8a, 0x85, 0x8e, 0x8c, 0x83, + 0x82, 0x82, 0x81, 0x78, 0x79, 0x7f, 0x77, 0x79, 0x76, 0x89, 0x7e, + 0x90, 0x6c, 0x53, 0xbf, 0x42, 0x5e, 0xa0, 0x3f, 0x98, 0x5b, 0x68, + 0xb0, 0x62, 0x86, 0xa2, 0x92, 0x94, 0x92, 0x97, 0x9c, 0x8e, 0x75, + 0x95, 0x86, 0x62, 0x7f, 0x6e, 0x79, 0x6e, 0x65, 0x8b, 0x78, 0x73, + 0x86, 0x91, 0x82, 0x86, 0x8c, 0x8d, 0x8a, 0x77, 0x88, 0x82, 0x72, + 0x75, 0x77, 0x76, 0x70, 0x70, 0x7e, 0x7e, 0x76, 0x88, 0x8d, 0x88, + 0x88, 0x8e, 0x90, 0x85, 0x82, 0x89, 0x82, 0x79, 0x7c, 0x7d, 0x7b, + 0x74, 0x7d, 0x80, 0x7b, 0x7d, 0x85, 0x8c, 0x89, 0x93, 0x4b, 0x89, + 0x9f, 0x1d, 0x93, 0x71, 0x4f, 0x93, 0x49, 0x92, 0x98, 0x67, 0x9d, + 0xa5, 0x96, 0x91, 0x9c, 0x99, 0x91, 0x83, 0x72, 0x91, 0x6f, 0x5c, + 0x7d, 0x6c, 0x74, 0x6a, 0x7a, 0x8d, 0x7c, 0x81, 0x94, 0x98, 0x81, + 0x8c, 0x8e, 0x88, 0x7c, 0x73, 0x80, 0x73, 0x69, 0x6e, 0x79, 0x71, + 0x70, 0x80, 0x86, 0x83, 0x85, 0x93, 0x92, 0x88, 0x89, 0x8f, 0x85, + 0x79, 0x7f, 0x7f, 0x76, 0x74, 0x7a, 0x7f, 0x79, 0x7b, 0x88, 0x83, + 0x84, 0x84, 0x8e, 0x8b, 0x90, 0x78, 0x48, 0xa4, 0x60, 0x31, 0x98, + 0x50, 0x6e, 0x79, 0x62, 0xa5, 0x8b, 0x83, 0xa6, 0xad, 0x95, 0x91, + 0x9f, 0x8c, 0x84, 0x75, 0x6e, 0x82, 0x5f, 0x60, 0x79, 0x73, 0x73, + 0x79, 0x8d, 0x8e, 0x89, 0x8b, 0x9b, 0x92, 0x81, 0x88, 0x84, 0x7b, + 0x6e, 0x70, 0x73, 0x6c, 0x64, 0x75, 0x7e, 0x74, 0x82, 0x8d, 0x8e, + 0x8c, 0x8e, 0x93, 0x8e, 0x80, 0x83, 0x85, 0x75, 0x75, 0x7a, 0x79, + 0x76, 0x79, 0x81, 0x83, 0x7f, 0x86, 0x8b, 0x86, 0x85, 0x85, 0x8e, + 0x83, 0x84, 0x5b, 0x66, 0x91, 0x3a, 0x62, 0x7f, 0x5a, 0x7c, 0x74, + 0x89, 0x9c, 0x8f, 0x96, 0xaa, 0xa1, 0x8e, 0x94, 0x90, 0x7e, 0x77, + 0x6f, 0x6f, 0x71, 0x62, 0x6e, 0x7c, 0x79, 0x7b, 0x8b, 0x92, 0x8e, + 0x90, 0x8e, 0x96, 0x87, 0x7d, 0x82, 0x79, 0x70, 0x6d, 0x70, 0x6f, + 0x6c, 0x72, 0x7f, 0x7e, 0x80, 0x8d, 0x8f, 0x8d, 0x8d, 0x8d, 0x8b, + 0x82, 0x7d, 0x80, 0x79, 0x74, 0x78, 0x7a, 0x79, 0x7b, 0x81, 0x85, + 0x83, 0x86, 0x8b, 0x85, 0x86, 0x82, 0x86, 0x84, 0x83, 0x7a, 0x46, + 0x83, 0x79, 0x3a, 0x7c, 0x75, 0x6b, 0x7b, 0x81, 0x90, 0x9b, 0x93, + 0x92, 0xab, 0x97, 0x87, 0x91, 0x89, 0x77, 0x77, 0x70, 0x71, 0x73, + 0x68, 0x74, 0x81, 0x7b, 0x80, 0x90, 0x8c, 0x8b, 0x90, 0x8e, 0x8a, + 0x83, 0x7f, 0x7d, 0x78, 0x70, 0x71, 0x70, 0x70, 0x72, 0x76, 0x7f, + 0x82, 0x85, 0x8b, 0x8e, 0x8c, 0x8b, 0x89, 0x87, 0x82, 0x7d, 0x7c, + 0x7a, 0x78, 0x78, 0x7b, 0x7b, 0x7d, 0x81, 0x82, 0x84, 0x86, 0x85, + 0x85, 0x86, 0x83, 0x89, 0x81, 0x88, 0x68, 0x56, 0x90, 0x5f, 0x4d, + 0x7d, 0x74, 0x6b, 0x79, 0x8b, 0x89, 0x99, 0x92, 0x95, 0xa7, 0x95, + 0x89, 0x91, 0x8c, 0x78, 0x7a, 0x76, 0x71, 0x72, 0x6e, 0x70, 0x7c, + 0x7c, 0x7a, 0x89, 0x8a, 0x88, 0x8e, 0x8e, 0x89, 0x89, 0x84, 0x7f, + 0x7e, 0x75, 0x72, 0x75, 0x72, 0x6f, 0x77, 0x7c, 0x7b, 0x83, 0x87, + 0x88, 0x8a, 0x89, 0x88, 0x87, 0x84, 0x7f, 0x7f, 0x7e, 0x7a, 0x7b, + 0x7c, 0x7b, 0x7e, 0x7e, 0x7d, 0x82, 0x82, 0x80, 0x83, 0x83, 0x82, + 0x88, 0x84, 0x89, 0x74, 0x5f, 0x8b, 0x75, 0x56, 0x73, 0x7e, 0x6e, + 0x6e, 0x86, 0x82, 0x8a, 0x91, 0x8b, 0x97, 0x9a, 0x8f, 0x89, 0x92, + 0x8a, 0x7f, 0x7d, 0x7d, 0x79, 0x74, 0x74, 0x75, 0x78, 0x78, 0x7a, + 0x7e, 0x82, 0x84, 0x86, 0x88, 0x87, 0x87, 0x85, 0x83, 0x80, 0x7d, + 0x7b, 0x79, 0x78, 0x78, 0x79, 0x7b, 0x7e, 0x7e, 0x80, 0x81, 0x83, + 0x83, 0x82, 0x83, 0x82, 0x81, 0x82, 0x81, 0x80, 0x7e, 0x7e, 0x7f, + 0x7d, 0x7d, 0x7f, 0x7e, 0x7e, 0x80, 0x81, 0x82, 0x84, 0x85, 0x84, + 0x8a, 0x71, 0x6d, 0x8b, 0x76, 0x65, 0x73, 0x7f, 0x75, 0x6e, 0x7f, + 0x81, 0x83, 0x88, 0x89, 0x8a, 0x93, 0x91, 0x84, 0x8a, 0x8f, 0x84, + 0x7c, 0x81, 0x80, 0x7a, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7c, 0x7e, + 0x84, 0x81, 0x7e, 0x82, 0x84, 0x7f, 0x7d, 0x80, 0x7d, 0x7b, 0x7d, + 0x7c, 0x7b, 0x7e, 0x7e, 0x7d, 0x81, 0x81, 0x81, 0x81, 0x83, 0x83, + 0x80, 0x82, 0x81, 0x80, 0x80, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x7f, + 0x7f, 0x7f, 0x81, 0x81, 0x81, 0x83, 0x81, 0x82, 0x84, 0x81, 0x84, + 0x72, 0x72, 0x88, 0x74, 0x6b, 0x79, 0x7f, 0x76, 0x75, 0x81, 0x7f, + 0x83, 0x86, 0x86, 0x87, 0x8c, 0x8d, 0x85, 0x85, 0x8a, 0x85, 0x7d, + 0x81, 0x82, 0x7e, 0x7e, 0x7f, 0x7e, 0x80, 0x81, 0x7e, 0x7f, 0x82, + 0x7f, 0x7d, 0x7d, 0x7f, 0x7c, 0x79, 0x7d, 0x7d, 0x7b, 0x7d, 0x7e, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x81, 0x81, 0x80, + 0x80, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x80, 0x80, 0x80, 0x81, + 0x81, 0x81, 0x82, 0x80, 0x82, 0x80, 0x7e, 0x80, 0x80, 0x80, 0x81, + 0x82, 0x72, 0x76, 0x88, 0x76, 0x70, 0x7b, 0x81, 0x78, 0x73, 0x81, + 0x7e, 0x7e, 0x84, 0x83, 0x84, 0x8b, 0x8a, 0x83, 0x87, 0x8b, 0x86, + 0x80, 0x83, 0x84, 0x81, 0x7e, 0x80, 0x81, 0x7e, 0x7e, 0x7c, 0x7d, + 0x80, 0x7d, 0x7a, 0x7e, 0x7e, 0x7c, 0x7c, 0x7e, 0x7e, 0x7c, 0x7e, + 0x80, 0x80, 0x7f, 0x81, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x7f, 0x7f, + 0x80, 0x80, 0x81, 0x7f, 0x81, 0x81, 0x81, 0x82, 0x81, 0x82, 0x81, + 0x80, 0x81, 0x80, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x80, 0x81, + 0x80, 0x83, 0x83, 0x85, 0x7a, 0x70, 0x8a, 0x7c, 0x68, 0x79, 0x7e, + 0x75, 0x6d, 0x7f, 0x7f, 0x7a, 0x85, 0x84, 0x88, 0x8f, 0x8c, 0x87, + 0x8d, 0x8e, 0x85, 0x82, 0x85, 0x82, 0x7a, 0x7c, 0x7e, 0x7a, 0x79, + 0x7c, 0x7b, 0x7c, 0x7f, 0x7e, 0x7f, 0x80, 0x81, 0x7f, 0x80, 0x81, + 0x7f, 0x7e, 0x80, 0x7d, 0x7d, 0x7e, 0x7b, 0x7f, 0x7d, 0x7d, 0x7f, + 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x83, 0x81, 0x82, 0x82, 0x81, + 0x80, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x81, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x7f, 0x84, 0x81, 0x82, 0x72, 0x70, + 0x8e, 0x6c, 0x67, 0x83, 0x75, 0x70, 0x74, 0x80, 0x7b, 0x81, 0x85, + 0x82, 0x93, 0x8d, 0x86, 0x92, 0x92, 0x86, 0x89, 0x89, 0x83, 0x80, + 0x7d, 0x7b, 0x7d, 0x79, 0x74, 0x7c, 0x7b, 0x77, 0x7d, 0x80, 0x7d, + 0x7f, 0x83, 0x81, 0x84, 0x82, 0x7f, 0x84, 0x82, 0x7d, 0x80, 0x81, + 0x7b, 0x7b, 0x80, 0x7b, 0x79, 0x7d, 0x7c, 0x7c, 0x7b, 0x7f, 0x82, + 0x80, 0x80, 0x85, 0x86, 0x83, 0x86, 0x86, 0x86, 0x84, 0x83, 0x84, + 0x81, 0x7f, 0x7f, 0x7f, 0x7d, 0x7c, 0x7d, 0x7f, 0x7e, 0x7f, 0x81, + 0x87, 0x81, 0x86, 0x77, 0x6d, 0x91, 0x63, 0x6a, 0x82, 0x63, 0x77, + 0x6f, 0x74, 0x81, 0x7d, 0x7f, 0x8e, 0x92, 0x88, 0x97, 0x94, 0x92, + 0x93, 0x8a, 0x8c, 0x8a, 0x7d, 0x7e, 0x7e, 0x76, 0x74, 0x74, 0x75, + 0x74, 0x74, 0x78, 0x7e, 0x7b, 0x7f, 0x84, 0x84, 0x86, 0x85, 0x88, + 0x88, 0x84, 0x82, 0x85, 0x80, 0x7e, 0x7c, 0x79, 0x7c, 0x77, 0x77, + 0x7a, 0x78, 0x78, 0x7b, 0x7d, 0x7e, 0x80, 0x83, 0x86, 0x84, 0x86, + 0x8a, 0x88, 0x85, 0x86, 0x87, 0x84, 0x82, 0x83, 0x82, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7e, 0x7d, 0x7f, 0x7f, 0x80, 0x82, 0x81, 0x83, 0x69, + 0x81, 0x7f, 0x5f, 0x7e, 0x6b, 0x72, 0x74, 0x6a, 0x81, 0x7c, 0x7a, + 0x89, 0x8c, 0x8a, 0x92, 0x8e, 0x96, 0x93, 0x89, 0x91, 0x8b, 0x84, + 0x84, 0x7e, 0x7f, 0x7a, 0x74, 0x7a, 0x77, 0x73, 0x78, 0x79, 0x7a, + 0x7a, 0x7c, 0x81, 0x80, 0x80, 0x85, 0x85, 0x85, 0x85, 0x84, 0x87, + 0x83, 0x82, 0x84, 0x81, 0x7e, 0x7b, 0x7c, 0x7b, 0x76, 0x78, 0x79, + 0x78, 0x77, 0x7b, 0x7e, 0x7d, 0x80, 0x85, 0x85, 0x85, 0x87, 0x89, + 0x88, 0x87, 0x88, 0x87, 0x83, 0x83, 0x82, 0x80, 0x7e, 0x7e, 0x7e, + 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x80, 0x7e, 0x83, 0x76, 0x75, 0x85, + 0x6e, 0x77, 0x78, 0x72, 0x79, 0x70, 0x79, 0x7f, 0x78, 0x81, 0x85, + 0x84, 0x8b, 0x87, 0x8e, 0x8e, 0x88, 0x8e, 0x8c, 0x88, 0x88, 0x84, + 0x84, 0x82, 0x7d, 0x7f, 0x7d, 0x7a, 0x7a, 0x79, 0x7a, 0x79, 0x7a, + 0x7c, 0x7c, 0x7c, 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x83, 0x82, 0x82, + 0x83, 0x83, 0x81, 0x80, 0x81, 0x7f, 0x7d, 0x7d, 0x7d, 0x7c, 0x7b, + 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x80, 0x80, 0x81, 0x83, 0x82, 0x82, + 0x83, 0x84, 0x83, 0x82, 0x82, 0x82, 0x80, 0x80, 0x81, 0x80, 0x7f, + 0x7f, 0x7e, 0x7f, 0x7e, 0x7d, 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, + 0x7e, 0x80, 0x7c, 0x7c, 0x80, 0x7b, 0x7c, 0x7d, 0x7c, 0x7d, 0x7c, + 0x7c, 0x7f, 0x7c, 0x7f, 0x81, 0x80, 0x83, 0x82, 0x83, 0x85, 0x83, + 0x85, 0x85, 0x83, 0x85, 0x83, 0x83, 0x84, 0x82, 0x83, 0x82, 0x81, + 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7d, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, + 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x81, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, + 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x81, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7e, 0x81, + 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x7e, 0x7f, 0x80, 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x81, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7e, + 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7e, 0x80, 0x7e, 0x80, 0x7e, 0x7f, 0x81, 0x7e, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x82, 0x7f, 0x7f, 0x82, 0x7f, 0x7f, 0x81, + 0x7f, 0x7e, 0x80, 0x7e, 0x80, 0x80, 0x7d, 0x81, 0x7f, 0x7f, 0x81, + 0x7f, 0x80, 0x81, 0x7e, 0x81, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x81, + 0x7e, 0x80, 0x81, 0x7d, 0x82, 0x7f, 0x7f, 0x82, 0x7e, 0x81, 0x80, + 0x7d, 0x81, 0x7f, 0x7e, 0x81, 0x7e, 0x80, 0x7e, 0x7f, 0x80, 0x7e, + 0x80, 0x80, 0x7f, 0x81, 0x80, 0x7e, 0x82, 0x7f, 0x7e, 0x81, 0x7e, + 0x7e, 0x80, 0x7d, 0x80, 0x80, 0x7c, 0x83, 0x7e, 0x7f, 0x82, 0x7e, + 0x82, 0x80, 0x7f, 0x82, 0x7f, 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x7d, + 0x82, 0x7d, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x81, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x7e, 0x80, 0x7f, 0x7e, 0x82, 0x7e, 0x7f, 0x82, + 0x7e, 0x81, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7e, 0x7f, 0x81, 0x7e, 0x81, 0x80, 0x7f, 0x81, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7e, 0x81, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x81, 0x7e, 0x80, 0x81, 0x7d, 0x82, + 0x80, 0x7e, 0x82, 0x7d, 0x81, 0x80, 0x7d, 0x83, 0x7e, 0x7e, 0x82, + 0x7d, 0x81, 0x7f, 0x7f, 0x82, 0x7e, 0x81, 0x80, 0x7f, 0x81, 0x80, + 0x7f, 0x82, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, + 0x7e, 0x81, 0x7f, 0x7e, 0x81, 0x7f, 0x7f, 0x81, 0x7e, 0x80, 0x81, + 0x7e, 0x81, 0x7f, 0x80, 0x80, 0x7e, 0x82, 0x7e, 0x7f, 0x81, 0x7c, + 0x81, 0x7f, 0x7d, 0x82, 0x7d, 0x7f, 0x82, 0x7c, 0x82, 0x81, 0x7d, + 0x83, 0x80, 0x7d, 0x82, 0x7f, 0x7e, 0x82, 0x7d, 0x7f, 0x82, 0x7c, + 0x81, 0x81, 0x7d, 0x81, 0x7e, 0x7f, 0x81, 0x7d, 0x81, 0x81, 0x7e, + 0x7f, 0x81, 0x81, 0x7e, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7e, 0x7f, 0x80, 0x7e, 0x80, 0x7e, 0x81, 0x80, 0x7e, 0x81, 0x80, + 0x80, 0x80, 0x80, 0x81, 0x80, 0x7e, 0x80, 0x80, 0x7e, 0x7f, 0x7e, + 0x80, 0x80, 0x7d, 0x81, 0x81, 0x7d, 0x81, 0x81, 0x7f, 0x81, 0x7f, + 0x80, 0x80, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7e, 0x82, 0x7f, 0x7e, 0x82, 0x7e, 0x7e, 0x81, + 0x7e, 0x80, 0x80, 0x7c, 0x82, 0x7f, 0x7c, 0x82, 0x7f, 0x7f, 0x80, + 0x7f, 0x81, 0x80, 0x7e, 0x81, 0x81, 0x7e, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x81, 0x7f, 0x7f, 0x82, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7e, 0x81, 0x7f, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x7e, 0x81, + 0x7f, 0x7d, 0x82, 0x7f, 0x7f, 0x81, 0x7d, 0x82, 0x7f, 0x7e, 0x81, + 0x80, 0x7e, 0x7f, 0x80, 0x7f, 0x7f, 0x7e, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x81, 0x81, 0x7e, 0x80, 0x7f, 0x7f, 0x80, + 0x7e, 0x7f, 0x80, 0x7e, 0x80, 0x81, 0x7f, 0x81, 0x80, 0x7f, 0x80, + 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + }, + }, + "zh": { + { // 0 + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x81, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x81, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, + 0x80, 0x80, 0x82, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x81, 0x81, 0x7f, 0x80, 0x7e, 0x7d, 0x7d, 0x7a, + 0x7a, 0x78, 0x78, 0x77, 0x76, 0x76, 0x77, 0x78, 0x78, 0x7a, 0x7b, + 0x7f, 0x82, 0x83, 0x88, 0x8a, 0x8c, 0x90, 0x8f, 0x94, 0x92, 0x93, + 0x93, 0x90, 0x90, 0x8b, 0x88, 0x84, 0x81, 0x7d, 0x77, 0x73, 0x6e, + 0x69, 0x65, 0x65, 0x61, 0x64, 0x61, 0x66, 0x65, 0x6a, 0x69, 0x71, + 0x73, 0x7b, 0x87, 0x86, 0x97, 0x92, 0xa5, 0x9f, 0xa5, 0xab, 0xa3, + 0xab, 0x9f, 0xa0, 0x98, 0x90, 0x8b, 0x83, 0x7d, 0x76, 0x70, 0x6d, + 0x68, 0x64, 0x62, 0x60, 0x5f, 0x60, 0x5e, 0x5e, 0x60, 0x60, 0x64, + 0x64, 0x70, 0x76, 0x7c, 0x87, 0x8b, 0x99, 0x9a, 0xa5, 0xa9, 0xaa, + 0xae, 0xaa, 0xaa, 0xa2, 0x9e, 0x97, 0x8f, 0x89, 0x81, 0x7d, 0x77, + 0x74, 0x6f, 0x6d, 0x69, 0x66, 0x65, 0x62, 0x61, 0x60, 0x5f, 0x5d, + 0x60, 0x60, 0x64, 0x67, 0x71, 0x74, 0x7f, 0x85, 0x8e, 0x98, 0x9a, + 0xa7, 0xa6, 0xac, 0xab, 0xaa, 0xa9, 0xa3, 0x9f, 0x99, 0x93, 0x8b, + 0x84, 0x7d, 0x77, 0x71, 0x6c, 0x6a, 0x63, 0x63, 0x60, 0x5f, 0x60, + 0x5e, 0x61, 0x60, 0x63, 0x65, 0x69, 0x6e, 0x72, 0x77, 0x7e, 0x83, + 0x8c, 0x91, 0x98, 0x9c, 0xa2, 0xa4, 0xa7, 0xa5, 0xa5, 0xa2, 0xa2, + 0x9d, 0x95, 0x96, 0x88, 0x85, 0x7f, 0x7a, 0x73, 0x73, 0x6d, 0x6a, + 0x66, 0x61, 0x62, 0x5f, 0x61, 0x5f, 0x5f, 0x5f, 0x5e, 0x5c, 0x63, + 0x6b, 0x70, 0x78, 0x83, 0x8a, 0x95, 0x9b, 0xa6, 0xaa, 0xad, 0xb2, + 0xad, 0xad, 0xa6, 0xa0, 0x9b, 0x91, 0x8e, 0x83, 0x7e, 0x79, 0x73, + 0x72, 0x6c, 0x6f, 0x6a, 0x6b, 0x6b, 0x67, 0x63, 0x62, 0x5f, 0x5e, + 0x59, 0x5b, 0x58, 0x54, 0x5b, 0x62, 0x71, 0x79, 0x8d, 0x99, 0xa1, + 0xad, 0xb5, 0xb6, 0xbc, 0xb8, 0xb3, 0xaf, 0xa7, 0x9e, 0x95, 0x8f, + 0x84, 0x7e, 0x77, 0x73, 0x6f, 0x6d, 0x6d, 0x6c, 0x6e, 0x6e, 0x6e, + 0x6e, 0x69, 0x66, 0x63, 0x5d, 0x5e, 0x57, 0x57, 0x51, 0x53, 0x57, + 0x5d, 0x73, 0x76, 0x8e, 0x99, 0xa4, 0xaf, 0xb6, 0xbc, 0xba, 0xbe, + 0xb5, 0xaf, 0xab, 0x9c, 0x95, 0x8f, 0x82, 0x7f, 0x76, 0x72, 0x70, + 0x6b, 0x6e, 0x6c, 0x6e, 0x6f, 0x6f, 0x73, 0x6e, 0x6e, 0x69, 0x66, + 0x62, 0x5d, 0x5e, 0x55, 0x5a, 0x51, 0x5a, 0x5c, 0x67, 0x77, 0x7f, + 0x97, 0x9a, 0xab, 0xb1, 0xb8, 0xbb, 0xba, 0xbb, 0xb4, 0xad, 0xa7, + 0x9c, 0x94, 0x8c, 0x83, 0x7d, 0x77, 0x72, 0x6f, 0x6c, 0x6d, 0x6b, + 0x6d, 0x6f, 0x6e, 0x70, 0x6e, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x5f, + 0x5d, 0x5c, 0x56, 0x59, 0x5a, 0x5d, 0x6c, 0x74, 0x81, 0x94, 0x98, + 0xaa, 0xad, 0xb7, 0xbb, 0xbb, 0xbd, 0xb5, 0xb2, 0xa8, 0xa2, 0x98, + 0x8f, 0x88, 0x7b, 0x7a, 0x72, 0x6d, 0x6d, 0x69, 0x6b, 0x6a, 0x6d, + 0x6e, 0x6f, 0x71, 0x70, 0x70, 0x6d, 0x6b, 0x68, 0x66, 0x62, 0x61, + 0x5e, 0x5d, 0x5e, 0x5d, 0x63, 0x69, 0x75, 0x7b, 0x8e, 0x93, 0x9e, + 0xaa, 0xac, 0xb7, 0xb6, 0xb9, 0xb7, 0xb1, 0xad, 0xa4, 0x9b, 0x94, + 0x87, 0x82, 0x79, 0x73, 0x70, 0x6b, 0x6d, 0x69, 0x6b, 0x6f, 0x6d, + 0x73, 0x71, 0x72, 0x72, 0x70, 0x6e, 0x6c, 0x68, 0x64, 0x63, 0x5f, + 0x60, 0x5d, 0x5f, 0x62, 0x64, 0x6e, 0x78, 0x7f, 0x90, 0x95, 0x9f, + 0xa9, 0xac, 0xb3, 0xb6, 0xb6, 0xb5, 0xb1, 0xaa, 0xa5, 0x99, 0x92, + 0x89, 0x80, 0x7a, 0x73, 0x6f, 0x6c, 0x6b, 0x6b, 0x6c, 0x6e, 0x6e, + 0x72, 0x73, 0x71, 0x75, 0x70, 0x70, 0x6d, 0x69, 0x69, 0x64, 0x65, + 0x62, 0x64, 0x64, 0x65, 0x69, 0x6c, 0x72, 0x7d, 0x80, 0x8f, 0x95, + 0x9a, 0xa7, 0xa5, 0xaf, 0xb0, 0xb0, 0xb0, 0xab, 0xa6, 0xa2, 0x97, + 0x92, 0x88, 0x7f, 0x7a, 0x73, 0x70, 0x6e, 0x6c, 0x6e, 0x6d, 0x6f, + 0x72, 0x71, 0x76, 0x73, 0x76, 0x74, 0x72, 0x72, 0x6d, 0x6c, 0x69, + 0x66, 0x67, 0x66, 0x69, 0x6a, 0x6b, 0x6e, 0x73, 0x74, 0x7e, 0x84, + 0x87, 0x96, 0x94, 0x9e, 0xa2, 0xa3, 0xab, 0xa8, 0xab, 0xa8, 0xa4, + 0x9f, 0x99, 0x91, 0x8b, 0x83, 0x7b, 0x76, 0x72, 0x6f, 0x6e, 0x6e, + 0x6f, 0x6f, 0x71, 0x73, 0x75, 0x76, 0x76, 0x77, 0x75, 0x74, 0x73, + 0x70, 0x70, 0x6d, 0x6c, 0x6b, 0x6b, 0x6e, 0x6e, 0x70, 0x72, 0x75, + 0x77, 0x7c, 0x82, 0x86, 0x8d, 0x93, 0x94, 0x9e, 0x9d, 0xa2, 0xa6, + 0xa1, 0xa7, 0x9e, 0x9e, 0x99, 0x90, 0x8d, 0x84, 0x7e, 0x79, 0x76, + 0x71, 0x72, 0x6f, 0x71, 0x72, 0x72, 0x76, 0x75, 0x78, 0x76, 0x77, + 0x77, 0x76, 0x76, 0x74, 0x73, 0x72, 0x71, 0x71, 0x70, 0x72, 0x72, + 0x74, 0x76, 0x77, 0x79, 0x79, 0x7d, 0x7b, 0x81, 0x82, 0x88, 0x8c, + 0x8f, 0x95, 0x96, 0x9b, 0x9d, 0x9e, 0x9f, 0x9d, 0x9b, 0x97, 0x93, + 0x8d, 0x87, 0x82, 0x7d, 0x79, 0x76, 0x74, 0x73, 0x73, 0x73, 0x74, + 0x75, 0x77, 0x77, 0x78, 0x78, 0x77, 0x77, 0x75, 0x74, 0x74, 0x73, + 0x73, 0x73, 0x73, 0x74, 0x73, 0x76, 0x75, 0x78, 0x78, 0x7a, 0x78, + 0x7e, 0x79, 0x81, 0x82, 0x84, 0x8f, 0x89, 0x98, 0x93, 0x9a, 0x9d, + 0x9b, 0xa1, 0x9a, 0x9c, 0x97, 0x90, 0x8f, 0x86, 0x82, 0x7f, 0x78, + 0x78, 0x74, 0x73, 0x75, 0x73, 0x76, 0x76, 0x77, 0x79, 0x77, 0x7a, + 0x77, 0x78, 0x77, 0x75, 0x77, 0x74, 0x75, 0x75, 0x75, 0x77, 0x75, + 0x77, 0x78, 0x79, 0x7a, 0x7a, 0x7b, 0x78, 0x7d, 0x76, 0x81, 0x7d, + 0x84, 0x8a, 0x87, 0x96, 0x8e, 0x9b, 0x99, 0x9b, 0x9f, 0x9a, 0x9b, + 0x96, 0x91, 0x8d, 0x87, 0x82, 0x7f, 0x79, 0x79, 0x75, 0x74, 0x75, + 0x75, 0x75, 0x79, 0x75, 0x7a, 0x78, 0x78, 0x7a, 0x77, 0x7a, 0x78, + 0x78, 0x78, 0x76, 0x77, 0x76, 0x75, 0x76, 0x75, 0x77, 0x76, 0x78, + 0x78, 0x78, 0x78, 0x7b, 0x78, 0x81, 0x7e, 0x84, 0x8b, 0x88, 0x95, + 0x92, 0x99, 0x9b, 0x9a, 0x9e, 0x9b, 0x98, 0x97, 0x8f, 0x8e, 0x88, + 0x83, 0x82, 0x7b, 0x7b, 0x78, 0x77, 0x77, 0x76, 0x77, 0x76, 0x78, + 0x76, 0x78, 0x78, 0x77, 0x79, 0x76, 0x79, 0x77, 0x78, 0x78, 0x77, + 0x78, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, 0x7c, 0x7a, + 0x81, 0x80, 0x86, 0x8b, 0x8a, 0x94, 0x93, 0x97, 0x9a, 0x99, 0x9b, + 0x99, 0x95, 0x94, 0x8e, 0x8b, 0x87, 0x82, 0x81, 0x7c, 0x7b, 0x7a, + 0x77, 0x77, 0x75, 0x74, 0x74, 0x73, 0x75, 0x73, 0x77, 0x76, 0x75, + 0x7a, 0x76, 0x7b, 0x7b, 0x7b, 0x7f, 0x7a, 0x7f, 0x7b, 0x7c, 0x7d, + 0x7b, 0x7d, 0x7c, 0x7d, 0x7f, 0x84, 0x83, 0x8c, 0x8b, 0x90, 0x94, + 0x92, 0x99, 0x94, 0x97, 0x95, 0x91, 0x92, 0x8a, 0x8a, 0x85, 0x81, + 0x80, 0x7b, 0x7a, 0x77, 0x76, 0x76, 0x75, 0x75, 0x76, 0x73, 0x76, + 0x74, 0x75, 0x78, 0x76, 0x79, 0x79, 0x79, 0x7c, 0x7b, 0x7c, 0x7e, + 0x7d, 0x7f, 0x7d, 0x7f, 0x7f, 0x7f, 0x82, 0x82, 0x86, 0x87, 0x8c, + 0x8c, 0x90, 0x92, 0x91, 0x97, 0x91, 0x95, 0x91, 0x8e, 0x8d, 0x88, + 0x87, 0x82, 0x81, 0x7d, 0x7b, 0x7a, 0x77, 0x77, 0x75, 0x76, 0x75, + 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x7a, 0x78, 0x7c, 0x79, + 0x7b, 0x7b, 0x7a, 0x7d, 0x7a, 0x7f, 0x7d, 0x7e, 0x80, 0x7e, 0x82, + 0x85, 0x85, 0x8d, 0x8c, 0x8f, 0x95, 0x90, 0x97, 0x94, 0x93, 0x93, + 0x8f, 0x8d, 0x8a, 0x87, 0x84, 0x80, 0x7d, 0x7a, 0x79, 0x76, 0x76, + 0x75, 0x74, 0x74, 0x72, 0x74, 0x73, 0x75, 0x76, 0x75, 0x78, 0x77, + 0x7a, 0x79, 0x7a, 0x7a, 0x7a, 0x7b, 0x7d, 0x7e, 0x7f, 0x80, 0x7b, + 0x7f, 0x7b, 0x80, 0x83, 0x84, 0x8c, 0x8b, 0x8f, 0x93, 0x94, 0x98, + 0x97, 0x96, 0x96, 0x93, 0x8f, 0x8e, 0x88, 0x85, 0x80, 0x7d, 0x7b, + 0x78, 0x76, 0x75, 0x74, 0x74, 0x74, 0x73, 0x75, 0x72, 0x74, 0x73, + 0x73, 0x75, 0x74, 0x75, 0x75, 0x77, 0x75, 0x78, 0x78, 0x78, 0x7a, + 0x78, 0x7a, 0x7a, 0x7d, 0x7c, 0x84, 0x85, 0x8b, 0x94, 0x93, 0x9c, + 0x9b, 0x9d, 0x9e, 0x9c, 0x9b, 0x98, 0x95, 0x8f, 0x8d, 0x88, 0x83, + 0x81, 0x7d, 0x7a, 0x79, 0x76, 0x74, 0x74, 0x71, 0x71, 0x6f, 0x6f, + 0x6e, 0x6c, 0x6d, 0x6c, 0x6d, 0x6e, 0x6f, 0x71, 0x72, 0x74, 0x74, + 0x76, 0x76, 0x79, 0x7a, 0x7a, 0x7d, 0x7c, 0x84, 0x88, 0x91, 0x97, + 0x9b, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa1, 0x9c, 0x99, 0x93, 0x8f, + 0x8a, 0x86, 0x82, 0x7e, 0x7d, 0x7a, 0x79, 0x76, 0x74, 0x73, 0x6f, + 0x6f, 0x6c, 0x6b, 0x6b, 0x6a, 0x6b, 0x6a, 0x6b, 0x6b, 0x6e, 0x6f, + 0x72, 0x74, 0x75, 0x77, 0x77, 0x78, 0x78, 0x79, 0x79, 0x7c, 0x82, + 0x87, 0x8f, 0x96, 0x9a, 0xa0, 0xa1, 0xa4, 0xa4, 0xa5, 0xa2, 0xa0, + 0x9b, 0x96, 0x91, 0x8c, 0x88, 0x83, 0x80, 0x7c, 0x7b, 0x79, 0x78, + 0x76, 0x73, 0x71, 0x6f, 0x6e, 0x6c, 0x6b, 0x6b, 0x6a, 0x6a, 0x6a, + 0x6a, 0x6c, 0x6e, 0x70, 0x73, 0x74, 0x76, 0x76, 0x79, 0x79, 0x7a, + 0x7a, 0x79, 0x7b, 0x7f, 0x86, 0x8d, 0x95, 0x98, 0x9d, 0x9f, 0xa2, + 0xa3, 0xa5, 0xa2, 0xa0, 0x9d, 0x98, 0x94, 0x8f, 0x8a, 0x86, 0x82, + 0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x75, 0x72, 0x71, 0x6e, 0x6c, 0x6c, + 0x6a, 0x6b, 0x6a, 0x6a, 0x6b, 0x6b, 0x6d, 0x6f, 0x71, 0x73, 0x74, + 0x76, 0x78, 0x79, 0x7a, 0x7a, 0x7a, 0x7b, 0x7c, 0x80, 0x85, 0x8b, + 0x91, 0x96, 0x9a, 0x9d, 0x9f, 0xa1, 0xa1, 0xa0, 0x9e, 0x9b, 0x97, + 0x94, 0x90, 0x8b, 0x87, 0x83, 0x80, 0x7e, 0x7b, 0x7a, 0x79, 0x77, + 0x75, 0x73, 0x70, 0x6e, 0x6c, 0x6b, 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, + 0x6b, 0x6d, 0x6f, 0x71, 0x73, 0x75, 0x77, 0x78, 0x79, 0x7a, 0x7b, + 0x7b, 0x7c, 0x7d, 0x7f, 0x83, 0x88, 0x8e, 0x93, 0x96, 0x99, 0x9c, + 0x9e, 0xa0, 0xa0, 0x9f, 0x9d, 0x9a, 0x97, 0x94, 0x8f, 0x8b, 0x87, + 0x84, 0x80, 0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x72, 0x70, 0x6e, + 0x6c, 0x6b, 0x6b, 0x6b, 0x6a, 0x6a, 0x6b, 0x6b, 0x6d, 0x6f, 0x70, + 0x72, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, + 0x7f, 0x84, 0x89, 0x8f, 0x92, 0x96, 0x98, 0x9c, 0x9e, 0xa0, 0xa0, + 0x9f, 0x9d, 0x9a, 0x97, 0x93, 0x90, 0x8b, 0x88, 0x83, 0x81, 0x7e, + 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x73, 0x70, 0x6e, 0x6c, 0x6b, 0x6a, + 0x6a, 0x69, 0x69, 0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x71, 0x73, 0x74, + 0x76, 0x77, 0x79, 0x7a, 0x7b, 0x7b, 0x7b, 0x7c, 0x80, 0x85, 0x8a, + 0x90, 0x93, 0x96, 0x9a, 0x9d, 0xa0, 0xa2, 0xa2, 0x9f, 0x9e, 0x9b, + 0x98, 0x94, 0x90, 0x8b, 0x87, 0x83, 0x80, 0x7e, 0x7b, 0x79, 0x76, + 0x75, 0x73, 0x71, 0x6e, 0x6d, 0x6a, 0x6a, 0x6a, 0x69, 0x68, 0x68, + 0x69, 0x6a, 0x6c, 0x6d, 0x6e, 0x70, 0x73, 0x75, 0x77, 0x77, 0x79, + 0x7a, 0x7c, 0x7c, 0x7d, 0x7d, 0x80, 0x85, 0x8b, 0x91, 0x94, 0x97, + 0x9a, 0x9e, 0xa1, 0xa2, 0xa2, 0xa0, 0x9d, 0x9b, 0x98, 0x94, 0x8f, + 0x8b, 0x87, 0x83, 0x80, 0x7d, 0x7a, 0x78, 0x76, 0x75, 0x72, 0x70, + 0x6d, 0x6b, 0x6a, 0x69, 0x69, 0x67, 0x67, 0x67, 0x68, 0x69, 0x6b, + 0x6c, 0x6e, 0x71, 0x73, 0x75, 0x77, 0x79, 0x7b, 0x7b, 0x7c, 0x7c, + 0x7d, 0x81, 0x86, 0x8c, 0x91, 0x95, 0x98, 0x9c, 0x9f, 0xa2, 0xa3, + 0xa2, 0xa0, 0x9e, 0x9b, 0x98, 0x94, 0x90, 0x8a, 0x87, 0x83, 0x80, + 0x7d, 0x7a, 0x78, 0x75, 0x74, 0x72, 0x6f, 0x6d, 0x6c, 0x6b, 0x69, + 0x68, 0x67, 0x66, 0x66, 0x68, 0x69, 0x6a, 0x6c, 0x6f, 0x71, 0x74, + 0x75, 0x77, 0x79, 0x7b, 0x7b, 0x7b, 0x7c, 0x7e, 0x84, 0x88, 0x90, + 0x93, 0x97, 0x9a, 0x9e, 0xa1, 0xa3, 0xa4, 0xa1, 0xa0, 0x9c, 0x9a, + 0x95, 0x92, 0x8d, 0x89, 0x84, 0x82, 0x7e, 0x7b, 0x79, 0x77, 0x74, + 0x72, 0x70, 0x6e, 0x6c, 0x6b, 0x69, 0x67, 0x66, 0x65, 0x65, 0x67, + 0x68, 0x69, 0x6b, 0x6e, 0x70, 0x73, 0x75, 0x77, 0x79, 0x7a, 0x7b, + 0x7c, 0x7c, 0x7e, 0x84, 0x88, 0x90, 0x93, 0x98, 0x9a, 0x9f, 0xa1, + 0xa3, 0xa5, 0xa2, 0xa1, 0x9d, 0x9a, 0x96, 0x92, 0x8d, 0x89, 0x84, + 0x81, 0x7e, 0x7c, 0x79, 0x76, 0x74, 0x71, 0x6f, 0x6d, 0x6c, 0x69, + 0x68, 0x66, 0x65, 0x65, 0x65, 0x65, 0x67, 0x69, 0x6b, 0x6e, 0x71, + 0x73, 0x76, 0x77, 0x79, 0x7a, 0x7b, 0x7d, 0x7f, 0x84, 0x88, 0x90, + 0x94, 0x99, 0x9b, 0x9f, 0xa2, 0xa4, 0xa5, 0xa3, 0xa1, 0x9e, 0x9c, + 0x96, 0x93, 0x8d, 0x8a, 0x85, 0x82, 0x7e, 0x7c, 0x79, 0x76, 0x74, + 0x72, 0x70, 0x6d, 0x6b, 0x67, 0x67, 0x64, 0x65, 0x63, 0x64, 0x63, + 0x65, 0x68, 0x6b, 0x6d, 0x70, 0x73, 0x75, 0x77, 0x79, 0x79, 0x7c, + 0x7e, 0x82, 0x88, 0x8d, 0x93, 0x97, 0x9c, 0x9e, 0xa3, 0xa4, 0xa6, + 0xa4, 0xa3, 0x9f, 0x9d, 0x98, 0x94, 0x8f, 0x8a, 0x86, 0x82, 0x80, + 0x7c, 0x7b, 0x78, 0x77, 0x74, 0x72, 0x6f, 0x6c, 0x69, 0x67, 0x65, + 0x64, 0x63, 0x63, 0x63, 0x64, 0x66, 0x69, 0x6d, 0x70, 0x72, 0x74, + 0x76, 0x78, 0x7a, 0x7d, 0x7f, 0x84, 0x89, 0x90, 0x95, 0x99, 0x9e, + 0xa0, 0xa4, 0xa4, 0xa6, 0xa3, 0xa2, 0x9e, 0x9a, 0x96, 0x92, 0x8e, + 0x88, 0x86, 0x81, 0x7f, 0x7b, 0x7a, 0x77, 0x76, 0x73, 0x71, 0x6d, + 0x6b, 0x68, 0x67, 0x65, 0x64, 0x64, 0x63, 0x64, 0x66, 0x69, 0x6b, + 0x6f, 0x70, 0x73, 0x74, 0x77, 0x78, 0x7b, 0x7d, 0x83, 0x87, 0x8e, + 0x93, 0x98, 0x9c, 0x9f, 0xa2, 0xa4, 0xa5, 0xa3, 0xa2, 0x9e, 0x9c, + 0x96, 0x93, 0x8e, 0x8a, 0x86, 0x83, 0x80, 0x7d, 0x7b, 0x78, 0x77, + 0x74, 0x71, 0x6e, 0x6c, 0x6a, 0x68, 0x66, 0x66, 0x64, 0x64, 0x65, + 0x67, 0x68, 0x6b, 0x6e, 0x70, 0x72, 0x74, 0x75, 0x78, 0x7a, 0x7e, + 0x84, 0x8a, 0x8f, 0x93, 0x98, 0x9b, 0xa0, 0xa2, 0xa4, 0xa3, 0xa2, + 0xa0, 0x9d, 0x99, 0x95, 0x91, 0x8c, 0x89, 0x85, 0x82, 0x7f, 0x7d, + 0x7a, 0x78, 0x76, 0x73, 0x70, 0x6e, 0x6c, 0x6a, 0x69, 0x67, 0x67, + 0x67, 0x67, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x73, 0x75, 0x77, + 0x7a, 0x7c, 0x80, 0x86, 0x8c, 0x8f, 0x95, 0x98, 0x9b, 0x9f, 0xa0, + 0xa1, 0xa0, 0x9f, 0x9c, 0x9a, 0x96, 0x93, 0x8f, 0x8b, 0x87, 0x83, + 0x80, 0x7e, 0x7b, 0x78, 0x75, 0x73, 0x71, 0x6e, 0x6c, 0x6b, 0x6a, + 0x69, 0x6a, 0x69, 0x6a, 0x6a, 0x6d, 0x6e, 0x70, 0x72, 0x73, 0x75, + 0x77, 0x79, 0x7b, 0x7e, 0x82, 0x88, 0x8d, 0x91, 0x95, 0x98, 0x9a, + 0x9d, 0x9e, 0x9d, 0x9b, 0x9a, 0x97, 0x94, 0x91, 0x8e, 0x8a, 0x87, + 0x84, 0x81, 0x7f, 0x7d, 0x7a, 0x78, 0x76, 0x74, 0x72, 0x70, 0x6f, + 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x73, 0x74, + 0x75, 0x77, 0x78, 0x7b, 0x7c, 0x81, 0x84, 0x89, 0x8d, 0x91, 0x94, + 0x96, 0x98, 0x99, 0x9a, 0x99, 0x98, 0x95, 0x93, 0x90, 0x8d, 0x8a, + 0x88, 0x85, 0x82, 0x80, 0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x72, + 0x70, 0x6f, 0x6f, 0x6e, 0x6f, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, + 0x75, 0x76, 0x78, 0x78, 0x79, 0x7a, 0x7c, 0x80, 0x83, 0x87, 0x8b, + 0x8e, 0x91, 0x94, 0x96, 0x97, 0x97, 0x96, 0x95, 0x93, 0x91, 0x8e, + 0x8b, 0x88, 0x86, 0x83, 0x82, 0x80, 0x7e, 0x7d, 0x7b, 0x79, 0x77, + 0x75, 0x74, 0x73, 0x71, 0x71, 0x71, 0x71, 0x72, 0x74, 0x75, 0x78, + 0x7a, 0x7c, 0x7e, 0x7f, 0x81, 0x82, 0x83, 0x83, 0x82, 0x81, 0x80, + 0x7e, 0x7e, 0x7c, 0x7c, 0x7a, 0x7a, 0x7b, 0x7d, 0x80, 0x83, 0x86, + 0x87, 0x8a, 0x8c, 0x8e, 0x8f, 0x90, 0x8f, 0x8e, 0x8d, 0x8b, 0x89, + 0x86, 0x85, 0x82, 0x80, 0x7e, 0x7e, 0x7c, 0x7b, 0x79, 0x79, 0x76, + 0x76, 0x74, 0x73, 0x72, 0x72, 0x72, 0x73, 0x74, 0x75, 0x77, 0x79, + 0x7c, 0x7e, 0x81, 0x82, 0x85, 0x86, 0x88, 0x89, 0x8a, 0x89, 0x89, + 0x89, 0x87, 0x86, 0x84, 0x83, 0x81, 0x80, 0x7e, 0x7e, 0x7c, 0x7c, + 0x7b, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, + 0x7e, 0x7f, 0x7f, 0x81, 0x82, 0x84, 0x85, 0x86, 0x88, 0x89, 0x8b, + 0x8b, 0x8c, 0x8b, 0x8b, 0x89, 0x88, 0x86, 0x84, 0x82, 0x7f, 0x7d, + 0x7b, 0x7a, 0x78, 0x77, 0x76, 0x76, 0x75, 0x75, 0x75, 0x75, 0x75, + 0x75, 0x76, 0x76, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7c, 0x7d, 0x7f, + 0x82, 0x84, 0x86, 0x89, 0x8b, 0x8c, 0x8d, 0x8e, 0x8e, 0x8e, 0x8d, + 0x8b, 0x8a, 0x88, 0x86, 0x83, 0x81, 0x7f, 0x7e, 0x7c, 0x7b, 0x7a, + 0x79, 0x78, 0x78, 0x77, 0x77, 0x77, 0x76, 0x76, 0x77, 0x77, 0x78, + 0x79, 0x7a, 0x7b, 0x7d, 0x7e, 0x80, 0x81, 0x83, 0x85, 0x87, 0x89, + 0x8a, 0x8a, 0x8b, 0x8b, 0x8a, 0x89, 0x88, 0x86, 0x84, 0x82, 0x81, + 0x7f, 0x7e, 0x7c, 0x7b, 0x7a, 0x7a, 0x79, 0x79, 0x79, 0x79, 0x79, + 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x7b, 0x7b, 0x7c, 0x7d, 0x7e, 0x80, + 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x86, 0x85, 0x84, 0x83, 0x82, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x82, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, + }, + { // 1 + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7b, 0x7d, + 0x7b, 0x7e, 0x7c, 0x7e, 0x7f, 0x7e, 0x82, 0x82, 0x83, 0x85, 0x86, + 0x87, 0x89, 0x88, 0x8a, 0x89, 0x89, 0x87, 0x88, 0x84, 0x84, 0x7f, + 0x7e, 0x7a, 0x77, 0x74, 0x71, 0x6e, 0x6c, 0x6a, 0x6a, 0x6b, 0x6b, + 0x71, 0x70, 0x78, 0x79, 0x80, 0x84, 0x8a, 0x8e, 0x94, 0x97, 0x9c, + 0x9e, 0x9e, 0xa2, 0x9d, 0x9e, 0x9a, 0x95, 0x92, 0x8c, 0x85, 0x80, + 0x77, 0x73, 0x6a, 0x66, 0x60, 0x5c, 0x58, 0x58, 0x55, 0x59, 0x5b, + 0x5d, 0x67, 0x69, 0x72, 0x79, 0x80, 0x88, 0x91, 0x95, 0x9d, 0xa1, + 0xa5, 0xa8, 0xa9, 0xa8, 0xa9, 0xa3, 0xa2, 0x9b, 0x96, 0x90, 0x89, + 0x82, 0x7a, 0x72, 0x6a, 0x65, 0x5d, 0x5a, 0x53, 0x55, 0x4f, 0x56, + 0x55, 0x5c, 0x62, 0x67, 0x6f, 0x77, 0x7f, 0x88, 0x90, 0x96, 0xa0, + 0xa1, 0xaa, 0xa8, 0xad, 0xab, 0xaa, 0xa6, 0xa2, 0x9c, 0x97, 0x8e, + 0x89, 0x80, 0x78, 0x70, 0x67, 0x61, 0x5a, 0x56, 0x52, 0x52, 0x4f, + 0x55, 0x53, 0x5d, 0x61, 0x68, 0x71, 0x78, 0x80, 0x8b, 0x90, 0x9b, + 0xa0, 0xa5, 0xab, 0xab, 0xae, 0xac, 0xab, 0xa6, 0xa3, 0x9a, 0x97, + 0x8d, 0x87, 0x7d, 0x76, 0x6c, 0x65, 0x5d, 0x58, 0x53, 0x50, 0x50, + 0x4e, 0x56, 0x53, 0x5f, 0x61, 0x6a, 0x73, 0x7a, 0x83, 0x8d, 0x93, + 0x9e, 0xa2, 0xa8, 0xad, 0xae, 0xb0, 0xae, 0xad, 0xa7, 0xa4, 0x9b, + 0x96, 0x8d, 0x86, 0x7b, 0x74, 0x68, 0x63, 0x5a, 0x56, 0x4f, 0x50, + 0x4b, 0x4e, 0x53, 0x52, 0x5f, 0x60, 0x6b, 0x74, 0x7c, 0x86, 0x91, + 0x96, 0xa2, 0xa5, 0xae, 0xaf, 0xb3, 0xb2, 0xb3, 0xad, 0xaa, 0xa2, + 0x9d, 0x94, 0x8c, 0x82, 0x79, 0x70, 0x64, 0x5f, 0x55, 0x53, 0x4c, + 0x4e, 0x49, 0x52, 0x4d, 0x5d, 0x59, 0x6a, 0x6d, 0x75, 0x85, 0x85, + 0x95, 0x9b, 0x9f, 0xaa, 0xab, 0xac, 0xb5, 0xa8, 0xb3, 0xa4, 0xa6, + 0x9e, 0x96, 0x92, 0x88, 0x7f, 0x7b, 0x6c, 0x68, 0x61, 0x57, 0x59, + 0x4f, 0x53, 0x50, 0x52, 0x55, 0x5a, 0x60, 0x66, 0x6f, 0x76, 0x80, + 0x88, 0x92, 0x99, 0xa2, 0xa6, 0xac, 0xb0, 0xaf, 0xb3, 0xad, 0xaa, + 0xa6, 0x9d, 0x98, 0x8f, 0x86, 0x7e, 0x74, 0x6b, 0x62, 0x5c, 0x56, + 0x50, 0x50, 0x4d, 0x4d, 0x54, 0x52, 0x5e, 0x61, 0x68, 0x75, 0x79, + 0x84, 0x8f, 0x94, 0x9e, 0xa4, 0xa8, 0xaf, 0xb0, 0xb1, 0xb2, 0xad, + 0xaa, 0xa4, 0x9b, 0x98, 0x8b, 0x86, 0x7a, 0x72, 0x68, 0x61, 0x58, + 0x55, 0x4d, 0x4f, 0x4a, 0x4e, 0x52, 0x53, 0x5e, 0x61, 0x6c, 0x74, + 0x7e, 0x86, 0x93, 0x96, 0xa4, 0xa4, 0xae, 0xaf, 0xb1, 0xb5, 0xae, + 0xb1, 0xa7, 0xa2, 0x9d, 0x91, 0x8c, 0x81, 0x76, 0x71, 0x61, 0x5f, + 0x55, 0x51, 0x4e, 0x4c, 0x49, 0x51, 0x4e, 0x59, 0x5f, 0x63, 0x70, + 0x76, 0x81, 0x8b, 0x93, 0x9b, 0xa4, 0xa7, 0xaf, 0xaf, 0xb4, 0xb0, + 0xb2, 0xab, 0xa8, 0xa0, 0x9a, 0x90, 0x88, 0x7e, 0x75, 0x6b, 0x62, + 0x5b, 0x54, 0x4f, 0x4d, 0x4c, 0x49, 0x52, 0x4e, 0x5c, 0x5e, 0x68, + 0x71, 0x7a, 0x83, 0x8f, 0x96, 0x9f, 0xa7, 0xa9, 0xb3, 0xaf, 0xb7, + 0xb2, 0xb0, 0xae, 0xa4, 0xa0, 0x97, 0x8d, 0x87, 0x79, 0x74, 0x67, + 0x60, 0x58, 0x51, 0x4d, 0x4c, 0x49, 0x4e, 0x4e, 0x53, 0x5d, 0x5e, + 0x6d, 0x71, 0x7d, 0x86, 0x90, 0x98, 0xa2, 0xa6, 0xae, 0xb0, 0xb2, + 0xb5, 0xb1, 0xb0, 0xab, 0xa4, 0x9f, 0x95, 0x8d, 0x85, 0x78, 0x73, + 0x64, 0x5f, 0x55, 0x50, 0x4b, 0x4a, 0x47, 0x4d, 0x4e, 0x52, 0x5e, + 0x5f, 0x6e, 0x74, 0x7f, 0x8a, 0x93, 0x9b, 0xa6, 0xa8, 0xb1, 0xb2, + 0xb4, 0xb7, 0xb1, 0xb2, 0xa8, 0xa3, 0x9c, 0x92, 0x8b, 0x81, 0x77, + 0x6f, 0x62, 0x5d, 0x53, 0x4e, 0x4a, 0x49, 0x48, 0x4d, 0x4c, 0x57, + 0x5b, 0x63, 0x70, 0x75, 0x84, 0x8b, 0x96, 0xa0, 0xa8, 0xac, 0xb5, + 0xb3, 0xb9, 0xb6, 0xb3, 0xb1, 0xa8, 0xa2, 0x9a, 0x8f, 0x8a, 0x7d, + 0x75, 0x6b, 0x60, 0x5a, 0x51, 0x4d, 0x48, 0x49, 0x46, 0x4e, 0x4b, + 0x59, 0x5a, 0x66, 0x6f, 0x77, 0x84, 0x8c, 0x97, 0xa1, 0xa8, 0xad, + 0xb6, 0xb4, 0xbb, 0xb5, 0xb5, 0xaf, 0xa7, 0xa2, 0x99, 0x90, 0x89, + 0x7b, 0x75, 0x68, 0x60, 0x57, 0x50, 0x4b, 0x49, 0x47, 0x48, 0x4c, + 0x4e, 0x59, 0x5b, 0x68, 0x6e, 0x7a, 0x84, 0x8f, 0x98, 0xa3, 0xa9, + 0xb0, 0xb4, 0xb7, 0xb8, 0xb6, 0xb3, 0xae, 0xa7, 0xa0, 0x97, 0x8e, + 0x86, 0x7a, 0x72, 0x65, 0x5f, 0x54, 0x50, 0x48, 0x4a, 0x44, 0x4b, + 0x4a, 0x51, 0x5a, 0x5d, 0x6c, 0x70, 0x7f, 0x88, 0x93, 0x9c, 0xa7, + 0xab, 0xb3, 0xb6, 0xb7, 0xb8, 0xb5, 0xb1, 0xac, 0xa3, 0x9e, 0x92, + 0x8c, 0x81, 0x78, 0x6e, 0x63, 0x5b, 0x53, 0x4d, 0x49, 0x48, 0x45, + 0x4c, 0x4a, 0x56, 0x58, 0x63, 0x6c, 0x75, 0x82, 0x8c, 0x96, 0xa1, + 0xa8, 0xaf, 0xb5, 0xb6, 0xba, 0xb7, 0xb5, 0xb0, 0xaa, 0xa2, 0x9b, + 0x91, 0x8a, 0x7d, 0x77, 0x69, 0x62, 0x57, 0x52, 0x4b, 0x49, 0x46, + 0x48, 0x4b, 0x4c, 0x59, 0x59, 0x69, 0x6e, 0x7a, 0x85, 0x8f, 0x99, + 0xa4, 0xaa, 0xb2, 0xb6, 0xb7, 0xba, 0xb5, 0xb4, 0xae, 0xa7, 0xa0, + 0x97, 0x8f, 0x85, 0x7b, 0x73, 0x66, 0x60, 0x55, 0x50, 0x4a, 0x48, + 0x46, 0x49, 0x4a, 0x50, 0x58, 0x5d, 0x6a, 0x71, 0x7d, 0x88, 0x92, + 0x9c, 0xa6, 0xac, 0xb3, 0xb6, 0xb8, 0xb9, 0xb5, 0xb2, 0xac, 0xa5, + 0x9e, 0x93, 0x8d, 0x81, 0x79, 0x6e, 0x63, 0x5d, 0x52, 0x4f, 0x48, + 0x48, 0x45, 0x4b, 0x4a, 0x53, 0x59, 0x60, 0x6d, 0x73, 0x80, 0x8a, + 0x94, 0x9e, 0xa8, 0xac, 0xb5, 0xb5, 0xb9, 0xb8, 0xb5, 0xb1, 0xab, + 0xa3, 0x9d, 0x92, 0x8b, 0x7f, 0x76, 0x6c, 0x62, 0x5a, 0x52, 0x4d, + 0x48, 0x48, 0x45, 0x4d, 0x49, 0x58, 0x58, 0x65, 0x6d, 0x76, 0x83, + 0x8b, 0x97, 0xa0, 0xa9, 0xae, 0xb6, 0xb5, 0xb9, 0xb6, 0xb4, 0xae, + 0xa8, 0xa1, 0x99, 0x8f, 0x88, 0x7c, 0x76, 0x68, 0x62, 0x58, 0x52, + 0x4d, 0x49, 0x47, 0x47, 0x4c, 0x4d, 0x59, 0x5a, 0x69, 0x6d, 0x7a, + 0x84, 0x8e, 0x99, 0xa2, 0xa9, 0xb1, 0xb4, 0xb7, 0xb7, 0xb5, 0xb3, + 0xac, 0xa7, 0x9f, 0x97, 0x8e, 0x85, 0x7b, 0x73, 0x68, 0x61, 0x57, + 0x54, 0x4b, 0x4c, 0x46, 0x4b, 0x4c, 0x50, 0x59, 0x5e, 0x68, 0x71, + 0x7a, 0x86, 0x90, 0x99, 0xa5, 0xa9, 0xb2, 0xb4, 0xb8, 0xb7, 0xb6, + 0xb1, 0xad, 0xa5, 0x9e, 0x96, 0x8d, 0x84, 0x7b, 0x71, 0x67, 0x5f, + 0x55, 0x52, 0x4a, 0x4b, 0x45, 0x4c, 0x4a, 0x53, 0x58, 0x5f, 0x69, + 0x72, 0x7c, 0x87, 0x92, 0x9b, 0xa6, 0xab, 0xb4, 0xb4, 0xb8, 0xb6, + 0xb5, 0xaf, 0xab, 0xa2, 0x9c, 0x92, 0x8b, 0x80, 0x78, 0x6c, 0x64, + 0x5b, 0x55, 0x4e, 0x4c, 0x49, 0x4a, 0x4d, 0x4e, 0x59, 0x5b, 0x68, + 0x6f, 0x79, 0x84, 0x8f, 0x97, 0xa4, 0xa8, 0xb1, 0xb3, 0xb7, 0xb6, + 0xb5, 0xb0, 0xab, 0xa4, 0x9d, 0x95, 0x8c, 0x84, 0x7a, 0x71, 0x67, + 0x5f, 0x56, 0x52, 0x4b, 0x4d, 0x47, 0x50, 0x4c, 0x57, 0x5a, 0x63, + 0x6d, 0x75, 0x81, 0x8b, 0x94, 0x9e, 0xa6, 0xab, 0xb2, 0xb3, 0xb6, + 0xb3, 0xb2, 0xab, 0xa7, 0x9f, 0x98, 0x90, 0x89, 0x7e, 0x78, 0x6b, + 0x65, 0x59, 0x55, 0x4d, 0x4e, 0x48, 0x4d, 0x4d, 0x52, 0x5a, 0x5e, + 0x6b, 0x70, 0x7e, 0x85, 0x92, 0x98, 0xa4, 0xa7, 0xb1, 0xb0, 0xb6, + 0xb2, 0xb3, 0xad, 0xa8, 0xa1, 0x9a, 0x93, 0x8b, 0x82, 0x79, 0x70, + 0x67, 0x5e, 0x57, 0x51, 0x4d, 0x4c, 0x4a, 0x50, 0x4f, 0x59, 0x5b, + 0x67, 0x6e, 0x79, 0x82, 0x8e, 0x94, 0xa0, 0xa4, 0xac, 0xaf, 0xb2, + 0xb3, 0xb2, 0xaf, 0xaa, 0xa3, 0x9d, 0x95, 0x8d, 0x86, 0x7b, 0x75, + 0x69, 0x63, 0x5a, 0x55, 0x4f, 0x50, 0x49, 0x51, 0x4d, 0x57, 0x5b, + 0x62, 0x6d, 0x73, 0x80, 0x88, 0x92, 0x9b, 0xa3, 0xa8, 0xaf, 0xb0, + 0xb5, 0xb0, 0xb2, 0xa9, 0xa7, 0x9e, 0x98, 0x90, 0x89, 0x7f, 0x78, + 0x6d, 0x67, 0x5d, 0x58, 0x52, 0x4e, 0x4e, 0x4a, 0x51, 0x4e, 0x5a, + 0x5b, 0x67, 0x6d, 0x78, 0x81, 0x8c, 0x93, 0x9e, 0xa3, 0xaa, 0xaf, + 0xb1, 0xb4, 0xb1, 0xb0, 0xaa, 0xa6, 0x9d, 0x98, 0x8f, 0x89, 0x7e, + 0x77, 0x6c, 0x66, 0x5c, 0x58, 0x50, 0x4f, 0x4c, 0x4d, 0x50, 0x52, + 0x5b, 0x5e, 0x6a, 0x6f, 0x7a, 0x84, 0x8d, 0x95, 0x9e, 0xa3, 0xab, + 0xac, 0xb1, 0xb0, 0xb0, 0xac, 0xa8, 0xa2, 0x9c, 0x95, 0x8e, 0x86, + 0x7d, 0x76, 0x6c, 0x65, 0x5b, 0x59, 0x50, 0x51, 0x4b, 0x50, 0x4f, + 0x55, 0x5b, 0x60, 0x6b, 0x71, 0x7c, 0x85, 0x8f, 0x96, 0xa0, 0xa4, + 0xac, 0xac, 0xb1, 0xaf, 0xb0, 0xaa, 0xa7, 0xa1, 0x99, 0x94, 0x8b, + 0x85, 0x7c, 0x74, 0x6c, 0x64, 0x5d, 0x59, 0x51, 0x53, 0x4b, 0x53, + 0x50, 0x57, 0x5e, 0x61, 0x6d, 0x71, 0x7e, 0x85, 0x8f, 0x97, 0xa0, + 0xa4, 0xac, 0xab, 0xb0, 0xae, 0xae, 0xab, 0xa5, 0xa1, 0x98, 0x93, + 0x8b, 0x84, 0x7c, 0x73, 0x6c, 0x64, 0x5c, 0x59, 0x51, 0x53, 0x4d, + 0x53, 0x52, 0x57, 0x5f, 0x62, 0x6e, 0x73, 0x7d, 0x86, 0x8f, 0x97, + 0x9f, 0xa3, 0xaa, 0xaa, 0xaf, 0xab, 0xad, 0xa7, 0xa3, 0x9e, 0x96, + 0x92, 0x89, 0x83, 0x7c, 0x73, 0x6c, 0x64, 0x5e, 0x59, 0x53, 0x55, + 0x4e, 0x56, 0x53, 0x5b, 0x60, 0x64, 0x6f, 0x75, 0x7e, 0x88, 0x8f, + 0x98, 0xa0, 0xa3, 0xab, 0xa9, 0xae, 0xaa, 0xab, 0xa5, 0xa3, 0x9b, + 0x96, 0x8f, 0x88, 0x82, 0x7a, 0x72, 0x6c, 0x64, 0x5e, 0x59, 0x54, + 0x55, 0x4f, 0x57, 0x53, 0x5d, 0x60, 0x67, 0x70, 0x76, 0x80, 0x89, + 0x90, 0x9a, 0x9f, 0xa4, 0xaa, 0xa9, 0xae, 0xa8, 0xaa, 0xa4, 0xa2, + 0x9b, 0x95, 0x90, 0x88, 0x83, 0x7b, 0x74, 0x6d, 0x66, 0x5f, 0x5c, + 0x54, 0x57, 0x50, 0x56, 0x56, 0x5a, 0x62, 0x64, 0x70, 0x74, 0x7e, + 0x87, 0x8e, 0x96, 0x9e, 0xa1, 0xa8, 0xa8, 0xab, 0xaa, 0xa8, 0xa4, + 0xa1, 0x9b, 0x95, 0x90, 0x88, 0x83, 0x7b, 0x75, 0x6e, 0x69, 0x60, + 0x5f, 0x57, 0x58, 0x54, 0x56, 0x59, 0x5a, 0x62, 0x64, 0x6e, 0x73, + 0x7c, 0x84, 0x8c, 0x93, 0x9b, 0x9e, 0xa5, 0xa6, 0xa7, 0xa9, 0xa5, + 0xa5, 0x9e, 0x9b, 0x95, 0x8f, 0x89, 0x83, 0x7b, 0x77, 0x6e, 0x6a, + 0x63, 0x5f, 0x5c, 0x59, 0x59, 0x58, 0x5c, 0x5c, 0x65, 0x64, 0x71, + 0x73, 0x7c, 0x84, 0x8a, 0x91, 0x99, 0x9c, 0xa3, 0xa4, 0xa5, 0xa9, + 0xa2, 0xa5, 0x9d, 0x9b, 0x94, 0x90, 0x88, 0x84, 0x7a, 0x78, 0x6e, + 0x6b, 0x63, 0x61, 0x5c, 0x5b, 0x5a, 0x59, 0x5e, 0x5d, 0x66, 0x67, + 0x71, 0x74, 0x7e, 0x83, 0x8c, 0x90, 0x9a, 0x9b, 0xa3, 0xa3, 0xa5, + 0xa6, 0xa1, 0xa2, 0x9b, 0x99, 0x92, 0x8d, 0x87, 0x81, 0x7a, 0x75, + 0x6c, 0x6b, 0x62, 0x62, 0x5d, 0x5d, 0x5c, 0x5c, 0x61, 0x60, 0x6a, + 0x69, 0x75, 0x77, 0x80, 0x86, 0x8d, 0x93, 0x9a, 0x9d, 0xa1, 0xa3, + 0xa2, 0xa4, 0xa0, 0x9f, 0x9a, 0x95, 0x90, 0x8a, 0x83, 0x7f, 0x76, + 0x74, 0x6a, 0x69, 0x62, 0x61, 0x5e, 0x5e, 0x5c, 0x60, 0x62, 0x66, + 0x6c, 0x6f, 0x78, 0x7b, 0x84, 0x89, 0x90, 0x95, 0x9c, 0x9c, 0xa3, + 0x9f, 0xa4, 0xa0, 0x9e, 0x9b, 0x95, 0x91, 0x8b, 0x85, 0x80, 0x79, + 0x73, 0x6e, 0x68, 0x65, 0x61, 0x61, 0x5d, 0x60, 0x5f, 0x64, 0x65, + 0x6c, 0x6f, 0x76, 0x7c, 0x82, 0x89, 0x8e, 0x94, 0x99, 0x9c, 0xa0, + 0xa0, 0xa0, 0xa2, 0x9c, 0x9d, 0x95, 0x93, 0x8d, 0x86, 0x82, 0x7b, + 0x75, 0x71, 0x6a, 0x68, 0x63, 0x61, 0x5f, 0x5f, 0x60, 0x62, 0x65, + 0x69, 0x6e, 0x73, 0x7a, 0x7e, 0x85, 0x8a, 0x90, 0x95, 0x99, 0x9c, + 0x9f, 0x9f, 0xa2, 0x9d, 0x9e, 0x99, 0x95, 0x90, 0x8a, 0x85, 0x7f, + 0x79, 0x75, 0x6d, 0x6b, 0x65, 0x63, 0x62, 0x5f, 0x61, 0x60, 0x65, + 0x66, 0x6d, 0x6f, 0x77, 0x7a, 0x81, 0x86, 0x8c, 0x91, 0x96, 0x99, + 0x9c, 0x9d, 0x9f, 0x9e, 0x9d, 0x9b, 0x95, 0x94, 0x8c, 0x89, 0x81, + 0x7d, 0x77, 0x73, 0x6d, 0x6b, 0x65, 0x65, 0x61, 0x63, 0x61, 0x64, + 0x66, 0x69, 0x6f, 0x71, 0x79, 0x7b, 0x84, 0x86, 0x8e, 0x91, 0x95, + 0x99, 0x9b, 0x9d, 0x9e, 0x9c, 0x9c, 0x97, 0x95, 0x8f, 0x8b, 0x86, + 0x80, 0x7c, 0x76, 0x71, 0x6d, 0x69, 0x66, 0x65, 0x62, 0x64, 0x63, + 0x67, 0x68, 0x6d, 0x70, 0x76, 0x7b, 0x7f, 0x85, 0x88, 0x8e, 0x91, + 0x95, 0x97, 0x99, 0x9a, 0x9a, 0x9a, 0x97, 0x95, 0x91, 0x8d, 0x89, + 0x84, 0x80, 0x7a, 0x76, 0x70, 0x6d, 0x6a, 0x67, 0x66, 0x65, 0x65, + 0x67, 0x69, 0x6b, 0x71, 0x74, 0x79, 0x7d, 0x82, 0x86, 0x8b, 0x8f, + 0x92, 0x95, 0x98, 0x99, 0x99, 0x9a, 0x97, 0x96, 0x92, 0x8f, 0x8a, + 0x86, 0x81, 0x7c, 0x77, 0x73, 0x6e, 0x6b, 0x69, 0x67, 0x66, 0x66, + 0x67, 0x69, 0x6c, 0x70, 0x73, 0x78, 0x7c, 0x81, 0x84, 0x8a, 0x8e, + 0x91, 0x95, 0x96, 0x98, 0x98, 0x99, 0x95, 0x95, 0x90, 0x8e, 0x87, + 0x84, 0x7e, 0x79, 0x74, 0x70, 0x6d, 0x69, 0x69, 0x67, 0x68, 0x68, + 0x6b, 0x6c, 0x71, 0x73, 0x79, 0x7b, 0x81, 0x83, 0x89, 0x8b, 0x8f, + 0x92, 0x94, 0x96, 0x96, 0x97, 0x95, 0x95, 0x91, 0x8f, 0x8a, 0x86, + 0x82, 0x7d, 0x77, 0x75, 0x70, 0x6d, 0x6b, 0x69, 0x69, 0x69, 0x6a, + 0x6c, 0x6e, 0x70, 0x73, 0x77, 0x7a, 0x7f, 0x82, 0x86, 0x8a, 0x8b, + 0x8f, 0x90, 0x93, 0x93, 0x94, 0x93, 0x93, 0x91, 0x8e, 0x8c, 0x87, + 0x84, 0x80, 0x7c, 0x79, 0x75, 0x72, 0x71, 0x6e, 0x6d, 0x6d, 0x6d, + 0x6e, 0x70, 0x72, 0x74, 0x77, 0x7a, 0x7d, 0x81, 0x83, 0x87, 0x89, + 0x8b, 0x8d, 0x8f, 0x90, 0x8f, 0x90, 0x8f, 0x8e, 0x8c, 0x8a, 0x87, + 0x85, 0x81, 0x7e, 0x7c, 0x78, 0x77, 0x74, 0x73, 0x71, 0x71, 0x70, + 0x71, 0x72, 0x74, 0x75, 0x78, 0x79, 0x7d, 0x7e, 0x81, 0x84, 0x85, + 0x88, 0x88, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x88, 0x86, + 0x85, 0x82, 0x80, 0x7e, 0x7c, 0x7a, 0x79, 0x76, 0x77, 0x75, 0x75, + 0x75, 0x76, 0x76, 0x78, 0x79, 0x7b, 0x7c, 0x7e, 0x80, 0x81, 0x83, + 0x84, 0x86, 0x86, 0x87, 0x87, 0x88, 0x87, 0x87, 0x86, 0x86, 0x84, + 0x84, 0x82, 0x81, 0x7f, 0x7e, 0x7d, 0x7b, 0x7b, 0x79, 0x79, 0x78, + 0x78, 0x78, 0x7a, 0x79, 0x7c, 0x7b, 0x7e, 0x7e, 0x7f, 0x81, 0x82, + 0x83, 0x83, 0x84, 0x83, 0x85, 0x84, 0x85, 0x84, 0x84, 0x83, 0x83, + 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7d, 0x7d, 0x7c, 0x7c, 0x7b, 0x7c, + 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, + 0x82, 0x82, 0x81, 0x82, 0x81, 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + }, + { // 2 + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x80, 0x7e, 0x81, 0x7f, 0x89, 0x87, + 0x7d, 0x78, 0x76, 0x7c, 0x87, 0x88, 0x82, 0x7a, 0x72, 0x73, 0x79, + 0x80, 0x81, 0x7d, 0x74, 0x73, 0x77, 0x81, 0x7c, 0x7f, 0x75, 0x90, + 0x9f, 0x92, 0x81, 0x6b, 0x6a, 0x83, 0x97, 0x94, 0x8c, 0x7c, 0x78, + 0x80, 0x88, 0x81, 0x82, 0x7c, 0x81, 0x84, 0x7e, 0x77, 0x76, 0x7b, + 0x81, 0x81, 0x73, 0x6b, 0x65, 0x6b, 0x70, 0x7d, 0x84, 0x8f, 0xa8, + 0x91, 0x73, 0x65, 0x66, 0x7f, 0x95, 0x97, 0x93, 0x89, 0x7d, 0x7a, + 0x79, 0x7e, 0x83, 0x84, 0x85, 0x84, 0x7d, 0x7a, 0x73, 0x77, 0x7e, + 0x83, 0x82, 0x80, 0x73, 0x6b, 0x69, 0x69, 0x6e, 0x7b, 0x82, 0x88, + 0xa4, 0x9b, 0x83, 0x70, 0x66, 0x76, 0x8f, 0x9b, 0x9f, 0x94, 0x83, + 0x7a, 0x76, 0x7d, 0x83, 0x85, 0x87, 0x80, 0x79, 0x73, 0x6f, 0x74, + 0x7c, 0x7d, 0x75, 0x68, 0x62, 0x60, 0x77, 0x86, 0x90, 0xad, 0x99, + 0x80, 0x6b, 0x63, 0x7e, 0x9a, 0xa0, 0xa3, 0x92, 0x83, 0x7c, 0x77, + 0x7f, 0x83, 0x89, 0x86, 0x7b, 0x71, 0x6f, 0x6d, 0x76, 0x7a, 0x76, + 0x6d, 0x64, 0x55, 0x6c, 0x82, 0x93, 0xba, 0xa5, 0x7e, 0x64, 0x5d, + 0x78, 0x9e, 0xa8, 0xa4, 0x93, 0x83, 0x79, 0x75, 0x7c, 0x84, 0x89, + 0x89, 0x7b, 0x6e, 0x64, 0x6e, 0x79, 0x75, 0x6f, 0x68, 0x56, 0x5e, + 0x7a, 0x7f, 0xb2, 0xb8, 0x8e, 0x6c, 0x57, 0x6a, 0x95, 0xae, 0xaa, + 0xa0, 0x8a, 0x7c, 0x77, 0x7c, 0x83, 0x89, 0x8d, 0x81, 0x6f, 0x63, + 0x63, 0x6e, 0x71, 0x6f, 0x6a, 0x56, 0x60, 0x7d, 0x77, 0xa3, 0xb3, + 0x92, 0x7a, 0x5e, 0x66, 0x8c, 0xab, 0xaa, 0x9f, 0x8a, 0x7d, 0x77, + 0x7c, 0x7f, 0x87, 0x8b, 0x7d, 0x6c, 0x60, 0x65, 0x6d, 0x73, 0x6d, + 0x5e, 0x56, 0x78, 0x76, 0x8f, 0xb8, 0x9c, 0x88, 0x6a, 0x61, 0x81, + 0xa4, 0xa9, 0x9f, 0x94, 0x85, 0x7f, 0x7e, 0x7c, 0x81, 0x8b, 0x86, + 0x72, 0x64, 0x65, 0x6d, 0x6d, 0x68, 0x61, 0x5a, 0x77, 0x7f, 0x77, + 0xac, 0xaa, 0x89, 0x74, 0x59, 0x77, 0xa2, 0xac, 0xa0, 0x97, 0x87, + 0x85, 0x7c, 0x74, 0x83, 0x90, 0x87, 0x73, 0x60, 0x62, 0x6a, 0x64, + 0x69, 0x65, 0x5f, 0x7d, 0x74, 0x75, 0xb1, 0xa4, 0x8b, 0x75, 0x64, + 0x7a, 0xa3, 0xa7, 0x9c, 0x99, 0x87, 0x85, 0x7c, 0x79, 0x84, 0x8f, + 0x81, 0x71, 0x63, 0x65, 0x6d, 0x62, 0x64, 0x60, 0x6b, 0x81, 0x6b, + 0x7b, 0xb3, 0xa0, 0x89, 0x72, 0x67, 0x8a, 0xa5, 0x9e, 0x97, 0x98, + 0x8d, 0x87, 0x79, 0x77, 0x84, 0x8e, 0x7d, 0x6a, 0x60, 0x66, 0x6b, + 0x63, 0x64, 0x61, 0x6d, 0x7c, 0x6b, 0x81, 0xaf, 0x9f, 0x86, 0x71, + 0x6f, 0x8b, 0xa6, 0x9b, 0x98, 0x9e, 0x8a, 0x81, 0x76, 0x7c, 0x90, + 0x86, 0x73, 0x6c, 0x68, 0x68, 0x5f, 0x63, 0x6a, 0x6b, 0x77, 0x6a, + 0x66, 0x99, 0xab, 0x9c, 0x7c, 0x67, 0x7e, 0x9d, 0xa1, 0x97, 0x9b, + 0x94, 0x88, 0x7e, 0x73, 0x88, 0x90, 0x7e, 0x71, 0x68, 0x6b, 0x63, + 0x5d, 0x61, 0x6a, 0x76, 0x79, 0x59, 0x72, 0xad, 0xa5, 0x87, 0x6d, + 0x71, 0x95, 0xa9, 0x94, 0x97, 0x9e, 0x8d, 0x86, 0x75, 0x80, 0x99, + 0x89, 0x71, 0x67, 0x6e, 0x70, 0x62, 0x61, 0x66, 0x67, 0x78, 0x6d, + 0x5a, 0x8f, 0xa8, 0x8f, 0x80, 0x72, 0x7f, 0x98, 0x9a, 0x94, 0xa2, + 0x99, 0x84, 0x81, 0x78, 0x8d, 0x8f, 0x82, 0x73, 0x6c, 0x6b, 0x67, + 0x60, 0x6b, 0x6d, 0x68, 0x73, 0x5f, 0x6d, 0x9a, 0xa4, 0x82, 0x7b, + 0x77, 0x87, 0x98, 0x92, 0x98, 0xa5, 0x96, 0x7c, 0x80, 0x79, 0x91, + 0x8b, 0x7b, 0x75, 0x73, 0x6c, 0x65, 0x67, 0x69, 0x6b, 0x64, 0x7b, + 0x6b, 0x60, 0x96, 0xa5, 0x86, 0x7d, 0x76, 0x85, 0x9a, 0x94, 0x93, + 0xa4, 0x96, 0x7c, 0x81, 0x81, 0x8c, 0x88, 0x7a, 0x74, 0x74, 0x6b, + 0x67, 0x6d, 0x69, 0x61, 0x6b, 0x7a, 0x64, 0x67, 0x98, 0xa1, 0x85, + 0x7d, 0x7a, 0x8d, 0x9e, 0x91, 0x90, 0xa3, 0x96, 0x7e, 0x80, 0x81, + 0x8d, 0x89, 0x77, 0x76, 0x77, 0x6a, 0x61, 0x63, 0x6f, 0x74, 0x61, + 0x6e, 0x6e, 0x61, 0x84, 0x9d, 0x9a, 0x87, 0x77, 0x80, 0x8a, 0x92, + 0x9c, 0xa3, 0x9b, 0x82, 0x7a, 0x81, 0x8b, 0x8b, 0x82, 0x77, 0x76, + 0x6e, 0x62, 0x69, 0x72, 0x69, 0x62, 0x6c, 0x71, 0x69, 0x7d, 0x92, + 0x8e, 0x8f, 0x7d, 0x7e, 0x90, 0x93, 0x95, 0x97, 0x9b, 0x90, 0x7f, + 0x7f, 0x84, 0x89, 0x88, 0x7c, 0x78, 0x74, 0x6c, 0x67, 0x67, 0x6c, + 0x63, 0x65, 0x76, 0x6b, 0x60, 0x8b, 0x9e, 0x88, 0x86, 0x84, 0x88, + 0x89, 0x93, 0x98, 0x98, 0x98, 0x8e, 0x87, 0x85, 0x81, 0x82, 0x86, + 0x82, 0x7b, 0x71, 0x69, 0x69, 0x67, 0x67, 0x66, 0x6e, 0x7c, 0x63, + 0x56, 0x8e, 0x9f, 0x8a, 0x85, 0x7c, 0x88, 0x91, 0x8e, 0x8b, 0x9c, + 0x9e, 0x8d, 0x83, 0x82, 0x83, 0x84, 0x7f, 0x81, 0x7e, 0x73, 0x6c, + 0x68, 0x6d, 0x6c, 0x65, 0x62, 0x6f, 0x77, 0x64, 0x72, 0x9b, 0x8d, + 0x82, 0x8c, 0x87, 0x83, 0x90, 0x95, 0x92, 0x97, 0x95, 0x8d, 0x84, + 0x82, 0x87, 0x82, 0x7f, 0x7e, 0x77, 0x75, 0x70, 0x69, 0x67, 0x6d, + 0x65, 0x5e, 0x74, 0x78, 0x6a, 0x85, 0x95, 0x84, 0x82, 0x85, 0x86, + 0x92, 0x97, 0x90, 0x92, 0x95, 0x91, 0x8a, 0x87, 0x86, 0x82, 0x7f, + 0x80, 0x83, 0x7a, 0x73, 0x6d, 0x68, 0x6a, 0x68, 0x64, 0x63, 0x6f, + 0x76, 0x67, 0x7a, 0x97, 0x85, 0x7c, 0x8b, 0x8f, 0x89, 0x8f, 0x95, + 0x93, 0x95, 0x91, 0x8c, 0x8c, 0x8a, 0x83, 0x7f, 0x80, 0x80, 0x7b, + 0x7b, 0x7a, 0x6b, 0x63, 0x6a, 0x68, 0x5f, 0x62, 0x75, 0x78, 0x6b, + 0x7b, 0x91, 0x89, 0x84, 0x8b, 0x89, 0x8b, 0x95, 0x97, 0x90, 0x93, + 0x91, 0x8f, 0x8c, 0x89, 0x85, 0x80, 0x7d, 0x7b, 0x7d, 0x7d, 0x7a, + 0x6d, 0x60, 0x63, 0x69, 0x66, 0x63, 0x6b, 0x79, 0x74, 0x6d, 0x85, + 0x93, 0x89, 0x8a, 0x8c, 0x8b, 0x8c, 0x95, 0x93, 0x8f, 0x94, 0x91, + 0x8e, 0x89, 0x88, 0x84, 0x7d, 0x7d, 0x7c, 0x7e, 0x79, 0x75, 0x72, + 0x69, 0x64, 0x65, 0x69, 0x69, 0x6a, 0x70, 0x76, 0x74, 0x84, 0x95, + 0x84, 0x81, 0x92, 0x91, 0x86, 0x8c, 0x99, 0x95, 0x91, 0x91, 0x8b, + 0x89, 0x8b, 0x8a, 0x83, 0x7c, 0x7a, 0x79, 0x7a, 0x7a, 0x77, 0x71, + 0x6d, 0x69, 0x60, 0x60, 0x6e, 0x73, 0x6c, 0x6d, 0x74, 0x7b, 0x8b, + 0x90, 0x85, 0x88, 0x93, 0x90, 0x88, 0x8e, 0x98, 0x95, 0x92, 0x8f, + 0x89, 0x89, 0x8b, 0x87, 0x7f, 0x7d, 0x7c, 0x7b, 0x78, 0x79, 0x77, + 0x72, 0x70, 0x6d, 0x67, 0x64, 0x6f, 0x70, 0x6b, 0x70, 0x71, 0x79, + 0x78, 0x86, 0x9c, 0x94, 0x89, 0x8a, 0x8f, 0x8b, 0x8d, 0x95, 0x95, + 0x92, 0x8f, 0x89, 0x83, 0x86, 0x86, 0x83, 0x7e, 0x7a, 0x79, 0x78, + 0x78, 0x74, 0x79, 0x7c, 0x70, 0x64, 0x65, 0x6d, 0x6e, 0x6c, 0x75, + 0x7b, 0x6c, 0x6d, 0x7a, 0x8c, 0x9c, 0x8f, 0x8b, 0x92, 0x93, 0x88, + 0x86, 0x96, 0x99, 0x90, 0x8e, 0x8d, 0x88, 0x80, 0x80, 0x82, 0x82, + 0x7d, 0x78, 0x79, 0x7e, 0x78, 0x72, 0x78, 0x79, 0x71, 0x6c, 0x6f, + 0x71, 0x70, 0x6b, 0x6c, 0x75, 0x79, 0x72, 0x6e, 0x78, 0x84, 0x93, + 0x95, 0x89, 0x8e, 0x98, 0x91, 0x86, 0x8f, 0x98, 0x90, 0x8b, 0x8d, + 0x8a, 0x84, 0x83, 0x82, 0x80, 0x80, 0x80, 0x7a, 0x78, 0x7b, 0x79, + 0x72, 0x74, 0x79, 0x75, 0x70, 0x73, 0x74, 0x6f, 0x6f, 0x73, 0x6f, + 0x70, 0x74, 0x79, 0x74, 0x73, 0x80, 0x8a, 0x97, 0x97, 0x8c, 0x8a, + 0x91, 0x91, 0x89, 0x8c, 0x92, 0x92, 0x8e, 0x8a, 0x87, 0x81, 0x80, + 0x80, 0x81, 0x7f, 0x7c, 0x80, 0x7c, 0x78, 0x77, 0x7a, 0x76, 0x71, + 0x79, 0x78, 0x74, 0x74, 0x77, 0x75, 0x73, 0x71, 0x71, 0x78, 0x77, + 0x76, 0x7a, 0x7d, 0x73, 0x71, 0x86, 0x9a, 0x94, 0x8e, 0x99, 0x94, + 0x88, 0x85, 0x90, 0x90, 0x88, 0x8f, 0x90, 0x8c, 0x84, 0x83, 0x82, + 0x7f, 0x7f, 0x7b, 0x79, 0x7b, 0x7e, 0x7b, 0x7a, 0x7b, 0x76, 0x74, + 0x75, 0x78, 0x76, 0x75, 0x76, 0x79, 0x7a, 0x75, 0x6e, 0x70, 0x77, + 0x78, 0x72, 0x77, 0x82, 0x7e, 0x76, 0x7a, 0x7c, 0x7b, 0x91, 0x9e, + 0x90, 0x8f, 0x98, 0x8e, 0x7f, 0x89, 0x91, 0x8b, 0x8b, 0x8e, 0x8c, + 0x84, 0x84, 0x85, 0x7f, 0x7c, 0x7e, 0x7e, 0x7c, 0x7c, 0x7c, 0x7a, + 0x77, 0x75, 0x78, 0x7c, 0x77, 0x76, 0x79, 0x78, 0x75, 0x78, 0x7e, + 0x7a, 0x76, 0x76, 0x7a, 0x78, 0x72, 0x75, 0x7e, 0x7e, 0x79, 0x7c, + 0x7e, 0x7b, 0x76, 0x77, 0x80, 0x92, 0x9a, 0x92, 0x92, 0x94, 0x8f, + 0x88, 0x89, 0x8c, 0x8a, 0x8e, 0x8e, 0x89, 0x85, 0x84, 0x81, 0x7d, + 0x7d, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78, 0x77, 0x78, 0x7a, + 0x7a, 0x7e, 0x79, 0x76, 0x7a, 0x78, 0x72, 0x74, 0x82, 0x7d, 0x72, + 0x76, 0x7d, 0x77, 0x6e, 0x78, 0x7f, 0x7b, 0x78, 0x7d, 0x7f, 0x79, + 0x77, 0x7a, 0x80, 0x8b, 0x97, 0x98, 0x94, 0x94, 0x91, 0x8b, 0x87, + 0x8a, 0x8c, 0x8a, 0x8c, 0x8c, 0x8a, 0x84, 0x81, 0x81, 0x7f, 0x7c, + 0x7c, 0x7c, 0x7a, 0x7b, 0x7b, 0x7b, 0x7a, 0x76, 0x79, 0x7a, 0x7c, + 0x7a, 0x79, 0x79, 0x77, 0x76, 0x76, 0x78, 0x7a, 0x7a, 0x77, 0x76, + 0x76, 0x73, 0x75, 0x7a, 0x79, 0x75, 0x7c, 0x7e, 0x78, 0x76, 0x79, + 0x7b, 0x81, 0x8e, 0x96, 0x99, 0x96, 0x93, 0x90, 0x8b, 0x87, 0x88, + 0x8f, 0x8e, 0x8c, 0x8a, 0x89, 0x86, 0x80, 0x7f, 0x80, 0x7e, 0x7c, + 0x7a, 0x7b, 0x79, 0x79, 0x79, 0x76, 0x77, 0x78, 0x78, 0x79, 0x7a, + 0x7b, 0x7a, 0x7c, 0x7d, 0x7e, 0x7f, 0x85, 0x83, 0x7b, 0x7e, 0x80, + 0x7a, 0x76, 0x7e, 0x80, 0x79, 0x78, 0x7b, 0x78, 0x73, 0x75, 0x77, + 0x77, 0x77, 0x78, 0x7a, 0x7b, 0x79, 0x79, 0x82, 0x8e, 0x92, 0x91, + 0x95, 0x98, 0x90, 0x89, 0x8b, 0x8b, 0x87, 0x87, 0x8a, 0x88, 0x85, + 0x83, 0x81, 0x80, 0x7e, 0x7b, 0x7a, 0x7b, 0x79, 0x77, 0x78, 0x77, + 0x78, 0x76, 0x77, 0x77, 0x77, 0x79, 0x79, 0x7a, 0x7b, 0x7d, 0x7d, + 0x7c, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x82, 0x81, + 0x82, 0x81, 0x82, 0x80, 0x84, 0x88, 0x82, 0x82, 0x85, 0x83, 0x7c, + 0x7e, 0x82, 0x7d, 0x7e, 0x7f, 0x80, 0x7c, 0x7c, 0x7e, 0x7c, 0x7c, + 0x7c, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7d, 0x7d, 0x7f, 0x80, + 0x7c, 0x7b, 0x7e, 0x7c, 0x7a, 0x7b, 0x7f, 0x7f, 0x7f, 0x81, 0x80, + 0x83, 0x85, 0x84, 0x83, 0x85, 0x87, 0x83, 0x86, 0x88, 0x85, 0x83, + 0x84, 0x85, 0x80, 0x80, 0x80, 0x80, 0x7c, 0x7c, 0x7f, 0x7c, 0x7a, + 0x7b, 0x7c, 0x7a, 0x78, 0x7a, 0x7a, 0x78, 0x78, 0x7a, 0x7a, 0x78, + 0x7a, 0x7b, 0x7c, 0x7a, 0x7c, 0x7e, 0x7d, 0x7d, 0x7e, 0x80, 0x7f, + 0x7e, 0x81, 0x81, 0x7f, 0x80, 0x83, 0x81, 0x80, 0x82, 0x83, 0x81, + 0x81, 0x83, 0x82, 0x80, 0x82, 0x82, 0x81, 0x81, 0x82, 0x81, 0x80, + 0x81, 0x81, 0x7f, 0x80, 0x81, 0x80, 0x7e, 0x7f, 0x7f, 0x7f, 0x7d, + 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x7d, 0x7d, 0x7e, + 0x7d, 0x7e, 0x7d, 0x7f, 0x7e, 0x7d, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x81, 0x80, 0x7e, 0x80, 0x81, 0x7e, 0x7e, 0x80, 0x7e, 0x7d, 0x7e, + 0x7f, 0x7e, 0x7d, 0x7e, 0x7d, 0x7d, 0x7e, 0x7d, 0x7c, 0x7d, 0x7e, + 0x7d, 0x7e, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x81, 0x81, 0x80, + 0x81, 0x82, 0x81, 0x80, 0x81, 0x82, 0x81, 0x81, 0x82, 0x81, 0x80, + 0x81, 0x80, 0x80, 0x81, 0x7f, 0x7e, 0x7f, 0x7f, 0x7d, 0x7d, 0x7e, + 0x7d, 0x7c, 0x7d, 0x7e, 0x7d, 0x7c, 0x7d, 0x7d, 0x7e, 0x7d, 0x7c, + 0x7d, 0x7e, 0x7d, 0x7d, 0x7e, 0x7d, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7f, 0x80, 0x81, 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 0x80, 0x81, + 0x80, 0x81, 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x7e, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, + }, + { // 3 + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x81, 0x80, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x7f, 0x7f, 0x80, 0x81, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x81, 0x80, 0x81, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, + 0x80, 0x7e, 0x7e, 0x80, 0x7f, 0x7f, 0x7f, 0x81, 0x80, 0x7e, 0x7e, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x82, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7e, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x81, 0x80, 0x80, 0x7e, 0x7e, 0x80, 0x80, 0x7e, 0x7f, 0x7f, + 0x7f, 0x7d, 0x7d, 0x80, 0x80, 0x7e, 0x7e, 0x80, 0x80, 0x81, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7e, + 0x80, 0x80, 0x82, 0x81, 0x80, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x80, + 0x7f, 0x7e, 0x7e, 0x80, 0x80, 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x7f, + 0x81, 0x80, 0x7e, 0x7d, 0x7f, 0x80, 0x81, 0x82, 0x81, 0x80, 0x80, + 0x82, 0x83, 0x81, 0x80, 0x82, 0x80, 0x81, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x7e, 0x7c, 0x7d, 0x7d, 0x7b, 0x7c, 0x7e, 0x7c, + 0x7c, 0x7c, 0x7d, 0x7c, 0x7c, 0x7f, 0x7e, 0x7c, 0x7c, 0x7f, 0x7e, + 0x7f, 0x7e, 0x80, 0x7f, 0x80, 0x81, 0x81, 0x80, 0x80, 0x81, 0x80, + 0x80, 0x81, 0x83, 0x83, 0x83, 0x82, 0x81, 0x81, 0x82, 0x83, 0x83, + 0x81, 0x81, 0x80, 0x80, 0x80, 0x81, 0x82, 0x81, 0x81, 0x81, 0x80, + 0x80, 0x81, 0x82, 0x82, 0x82, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, + 0x82, 0x80, 0x7e, 0x7f, 0x82, 0x80, 0x81, 0x82, 0x82, 0x81, 0x80, + 0x82, 0x82, 0x81, 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x81, 0x81, 0x80, 0x7f, 0x80, 0x82, 0x7f, 0x7f, + 0x82, 0x82, 0x7f, 0x7e, 0x81, 0x82, 0x7f, 0x7f, 0x81, 0x81, 0x7f, + 0x7e, 0x7f, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x81, 0x81, + 0x81, 0x81, 0x7f, 0x7e, 0x81, 0x80, 0x7e, 0x7e, 0x80, 0x80, 0x7e, + 0x7f, 0x81, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x82, 0x81, 0x7e, 0x7e, + 0x80, 0x7f, 0x7f, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x81, 0x82, + 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x7e, 0x7d, 0x80, 0x81, 0x7f, 0x80, + 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x7f, + 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x80, 0x80, 0x7e, 0x7f, 0x7f, + 0x7d, 0x7d, 0x7e, 0x7f, 0x7e, 0x7f, 0x80, 0x7d, 0x7d, 0x7e, 0x7f, + 0x7e, 0x7e, 0x80, 0x7e, 0x7d, 0x7e, 0x7f, 0x80, 0x80, 0x7e, 0x7e, + 0x80, 0x80, 0x7d, 0x7e, 0x80, 0x7f, 0x7d, 0x7e, 0x80, 0x7f, 0x7e, + 0x80, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7e, 0x7f, 0x7f, 0x81, + 0x80, 0x7e, 0x7e, 0x7f, 0x7e, 0x7d, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7d, 0x7d, 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7f, 0x7f, + 0x7d, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7e, + 0x80, 0x81, 0x7f, 0x7d, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x80, + 0x7e, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x82, 0x81, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x82, 0x81, 0x80, 0x7e, 0x81, 0x80, 0x7f, 0x81, + 0x7f, 0x7d, 0x7f, 0x7f, 0x7f, 0x82, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7e, 0x80, 0x7e, 0x7f, 0x7d, 0x7d, 0x80, 0x7f, 0x7f, 0x80, + 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, 0x81, 0x7e, 0x7e, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, 0x7e, 0x7e, 0x7e, 0x7d, 0x7f, + 0x7f, 0x80, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x81, 0x82, 0x80, 0x7e, 0x80, 0x83, 0x80, 0x81, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x82, 0x80, 0x83, + 0x7f, 0x82, 0x82, 0x82, 0x81, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x80, + 0x80, 0x7e, 0x7f, 0x7e, 0x7f, 0x82, 0x80, 0x80, 0x82, 0x82, 0x81, + 0x80, 0x80, 0x80, 0x7e, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x7c, 0x7d, 0x7f, 0x7c, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x80, + 0x7f, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x81, 0x80, 0x81, 0x7f, + 0x80, 0x7f, 0x81, 0x81, 0x81, 0x80, 0x82, 0x7f, 0x7f, 0x82, 0x82, + 0x80, 0x7f, 0x82, 0x7f, 0x7e, 0x80, 0x80, 0x80, 0x81, 0x7e, 0x81, + 0x7f, 0x7f, 0x81, 0x80, 0x7f, 0x7d, 0x80, 0x7e, 0x7f, 0x80, 0x81, + 0x7f, 0x80, 0x81, 0x7e, 0x80, 0x7e, 0x81, 0x80, 0x81, 0x81, 0x82, + 0x81, 0x7e, 0x80, 0x7e, 0x7e, 0x7e, 0x81, 0x80, 0x81, 0x80, 0x80, + 0x81, 0x7e, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7d, 0x7f, 0x81, + 0x80, 0x80, 0x81, 0x82, 0x81, 0x81, 0x7f, 0x7e, 0x80, 0x80, 0x7e, + 0x80, 0x80, 0x7f, 0x7f, 0x7d, 0x7f, 0x7f, 0x7d, 0x7c, 0x80, 0x7f, + 0x7d, 0x7c, 0x7e, 0x7e, 0x7d, 0x80, 0x7d, 0x81, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x82, 0x81, 0x7e, 0x7d, 0x82, 0x80, + 0x7f, 0x81, 0x82, 0x80, 0x7f, 0x7f, 0x81, 0x80, 0x81, 0x80, 0x82, + 0x82, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x83, 0x81, 0x7f, 0x82, 0x81, + 0x80, 0x7f, 0x81, 0x7e, 0x7e, 0x7f, 0x81, 0x81, 0x7f, 0x7e, 0x7e, + 0x81, 0x7d, 0x80, 0x80, 0x7d, 0x7e, 0x7e, 0x7d, 0x7c, 0x7e, 0x80, + 0x7d, 0x80, 0x80, 0x80, 0x7e, 0x7a, 0x80, 0x81, 0x7c, 0x7d, 0x7f, + 0x83, 0x7f, 0x80, 0x83, 0x7f, 0x81, 0x80, 0x81, 0x80, 0x81, 0x80, + 0x82, 0x83, 0x7f, 0x80, 0x7f, 0x7f, 0x7e, 0x82, 0x83, 0x82, 0x80, + 0x80, 0x81, 0x7d, 0x7c, 0x7f, 0x82, 0x7e, 0x83, 0x7f, 0x80, 0x80, + 0x80, 0x83, 0x83, 0x84, 0x7a, 0x7f, 0x7d, 0x7f, 0x7e, 0x7d, 0x84, + 0x7c, 0x7b, 0x79, 0x7e, 0x81, 0x7c, 0x80, 0x7f, 0x81, 0x81, 0x7d, + 0x7f, 0x7d, 0x7f, 0x7c, 0x7a, 0x7e, 0x7d, 0x7b, 0x7d, 0x7e, 0x80, + 0x7e, 0x7d, 0x7e, 0x7f, 0x81, 0x7f, 0x7f, 0x81, 0x81, 0x83, 0x83, + 0x81, 0x87, 0x84, 0x84, 0x80, 0x83, 0x83, 0x7e, 0x83, 0x86, 0x86, + 0x84, 0x87, 0x89, 0x87, 0x86, 0x82, 0x7c, 0x80, 0x7f, 0x7b, 0x7e, + 0x83, 0x80, 0x7f, 0x7d, 0x7f, 0x82, 0x80, 0x7b, 0x79, 0x7d, 0x7c, + 0x76, 0x78, 0x7d, 0x7e, 0x7c, 0x79, 0x7e, 0x7b, 0x7c, 0x7c, 0x7f, + 0x7f, 0x7a, 0x7b, 0x7e, 0x7d, 0x7a, 0x7f, 0x7b, 0x7c, 0x7b, 0x7c, + 0x7c, 0x79, 0x7b, 0x7d, 0x79, 0x78, 0x7a, 0x7c, 0x7b, 0x7d, 0x80, + 0x82, 0x86, 0x84, 0x89, 0x8c, 0x92, 0x93, 0x95, 0x97, 0x98, 0x97, + 0x92, 0x92, 0x8f, 0x85, 0x7b, 0x70, 0x62, 0x60, 0x64, 0x65, 0x5d, + 0x5d, 0x5d, 0x5e, 0x60, 0x73, 0x92, 0xa5, 0xab, 0xaa, 0xad, 0xae, + 0xa4, 0x96, 0x93, 0x9a, 0x9a, 0x92, 0x8c, 0x85, 0x7d, 0x6c, 0x60, + 0x56, 0x4d, 0x45, 0x4b, 0x4a, 0x4c, 0x4f, 0x62, 0x9a, 0xa9, 0xa5, + 0xa2, 0x9c, 0x98, 0x80, 0x78, 0x84, 0x92, 0x98, 0x98, 0x9c, 0x9d, + 0x8f, 0x79, 0x79, 0x6f, 0x5a, 0x56, 0x51, 0x4a, 0x4e, 0x56, 0x70, + 0x7b, 0x83, 0xb0, 0xae, 0xa4, 0x94, 0x85, 0x8c, 0x82, 0x82, 0x91, + 0xa2, 0xa9, 0xa6, 0x9e, 0x98, 0x8a, 0x79, 0x72, 0x72, 0x71, 0x65, + 0x59, 0x53, 0x4a, 0x4e, 0x5c, 0x77, 0x75, 0x86, 0xb4, 0xa5, 0x99, + 0x84, 0x7e, 0x83, 0x7c, 0x88, 0x98, 0xad, 0xab, 0x9b, 0x95, 0x85, + 0x78, 0x6e, 0x6f, 0x78, 0x6e, 0x5e, 0x54, 0x50, 0x45, 0x4c, 0x62, + 0x86, 0x71, 0x9c, 0xbc, 0xa0, 0x92, 0x74, 0x88, 0x7d, 0x83, 0x93, + 0xa8, 0xb9, 0xa5, 0x96, 0x8d, 0x7c, 0x73, 0x73, 0x7b, 0x7b, 0x68, + 0x60, 0x5a, 0x49, 0x45, 0x54, 0x7f, 0x82, 0x75, 0xbd, 0xb3, 0x96, + 0x7b, 0x71, 0x84, 0x7d, 0x89, 0xa5, 0xb9, 0xad, 0x97, 0x88, 0x7c, + 0x75, 0x71, 0x78, 0x8a, 0x74, 0x66, 0x59, 0x56, 0x49, 0x47, 0x58, + 0x8a, 0x7c, 0x8c, 0xc7, 0xa4, 0x8f, 0x6d, 0x74, 0x7c, 0x7c, 0x91, + 0xab, 0xb4, 0xa6, 0x8e, 0x7a, 0x75, 0x75, 0x73, 0x82, 0x82, 0x73, + 0x62, 0x51, 0x50, 0x49, 0x4b, 0x64, 0x90, 0x81, 0xb4, 0xb8, 0x93, + 0x81, 0x62, 0x74, 0x79, 0x8c, 0xa3, 0xb6, 0xb0, 0x9a, 0x83, 0x74, + 0x70, 0x76, 0x7b, 0x8d, 0x7e, 0x6d, 0x60, 0x56, 0x4d, 0x50, 0x52, + 0x6e, 0x96, 0x8b, 0xc0, 0xaf, 0x89, 0x70, 0x66, 0x76, 0x80, 0x94, + 0xa8, 0xb8, 0xa3, 0x8d, 0x75, 0x71, 0x75, 0x7d, 0x83, 0x8f, 0x7c, + 0x6a, 0x58, 0x58, 0x5c, 0x59, 0x4a, 0x74, 0x8f, 0x91, 0xc7, 0xa2, + 0x8c, 0x6c, 0x60, 0x76, 0x82, 0x9c, 0xb3, 0xb6, 0x9e, 0x82, 0x70, + 0x72, 0x79, 0x81, 0x8f, 0x8c, 0x75, 0x64, 0x5b, 0x5c, 0x56, 0x50, + 0x57, 0x91, 0x8e, 0xac, 0xbf, 0x8d, 0x79, 0x56, 0x66, 0x7d, 0x94, + 0xae, 0xba, 0xaa, 0x8d, 0x73, 0x6d, 0x74, 0x83, 0x8b, 0x90, 0x7f, + 0x6a, 0x5d, 0x5b, 0x5d, 0x60, 0x4e, 0x5f, 0x95, 0x8f, 0xc0, 0xad, + 0x87, 0x6d, 0x57, 0x70, 0x83, 0x9d, 0xb8, 0xb6, 0xa4, 0x83, 0x6d, + 0x6f, 0x76, 0x86, 0x89, 0x8b, 0x73, 0x67, 0x5d, 0x5c, 0x5a, 0x66, + 0x4d, 0x73, 0x91, 0xa6, 0xc8, 0x91, 0x7f, 0x67, 0x61, 0x75, 0x8d, + 0xac, 0xb5, 0xa5, 0x96, 0x76, 0x6c, 0x71, 0x82, 0x87, 0x8e, 0x84, + 0x71, 0x65, 0x5f, 0x5c, 0x5c, 0x5a, 0x50, 0x8b, 0x93, 0xc0, 0xb1, + 0x7f, 0x72, 0x5b, 0x6a, 0x7c, 0x9e, 0xb8, 0xb4, 0x9b, 0x87, 0x6e, + 0x72, 0x75, 0x87, 0x90, 0x8f, 0x79, 0x6d, 0x61, 0x60, 0x5e, 0x67, + 0x4f, 0x5e, 0x95, 0x97, 0xc5, 0x97, 0x78, 0x6e, 0x5b, 0x71, 0x88, + 0xa4, 0xb8, 0xa1, 0x96, 0x7d, 0x6e, 0x74, 0x7a, 0x8d, 0x8b, 0x8a, + 0x76, 0x6a, 0x5f, 0x5a, 0x63, 0x60, 0x4a, 0x88, 0x97, 0xaf, 0xb0, + 0x80, 0x77, 0x5e, 0x63, 0x83, 0x9c, 0xb3, 0xa9, 0x99, 0x84, 0x6b, + 0x75, 0x78, 0x8f, 0x8a, 0x84, 0x78, 0x69, 0x5e, 0x5e, 0x5f, 0x67, + 0x4c, 0x79, 0x97, 0xac, 0xbb, 0x80, 0x77, 0x64, 0x64, 0x7b, 0x97, + 0xb5, 0xa9, 0x97, 0x84, 0x70, 0x72, 0x73, 0x8e, 0x8c, 0x86, 0x74, + 0x69, 0x65, 0x5e, 0x5d, 0x63, 0x51, 0x7d, 0x96, 0xad, 0xb4, 0x7f, + 0x79, 0x61, 0x6b, 0x7e, 0x99, 0xb3, 0xaa, 0x96, 0x83, 0x70, 0x74, + 0x77, 0x89, 0x8c, 0x81, 0x76, 0x69, 0x60, 0x5e, 0x65, 0x64, 0x53, + 0x7c, 0x93, 0xa9, 0xb2, 0x81, 0x7b, 0x63, 0x69, 0x84, 0x99, 0xb3, + 0xa8, 0x99, 0x83, 0x71, 0x73, 0x7a, 0x8b, 0x8a, 0x84, 0x75, 0x66, + 0x5f, 0x5a, 0x64, 0x5e, 0x51, 0x85, 0x94, 0xab, 0xad, 0x80, 0x7b, + 0x63, 0x6e, 0x8b, 0x9c, 0xb1, 0xa2, 0x95, 0x83, 0x75, 0x78, 0x82, + 0x8a, 0x86, 0x7d, 0x71, 0x65, 0x61, 0x5d, 0x61, 0x61, 0x58, 0x8f, + 0x8d, 0xa9, 0x9e, 0x76, 0x75, 0x61, 0x83, 0x92, 0xa2, 0xaa, 0x9b, + 0x91, 0x7c, 0x7c, 0x85, 0x8b, 0x8b, 0x84, 0x7c, 0x70, 0x67, 0x64, + 0x62, 0x64, 0x52, 0x5d, 0x8d, 0x8f, 0xa8, 0x89, 0x76, 0x70, 0x67, + 0x86, 0x92, 0xa3, 0xa2, 0x9d, 0x8e, 0x80, 0x80, 0x85, 0x8e, 0x89, + 0x87, 0x80, 0x75, 0x68, 0x5f, 0x5b, 0x67, 0x51, 0x6a, 0x8e, 0x88, + 0xa5, 0x80, 0x75, 0x67, 0x69, 0x8f, 0x95, 0xa4, 0x9f, 0x9a, 0x8c, + 0x80, 0x80, 0x89, 0x8d, 0x8c, 0x88, 0x83, 0x72, 0x66, 0x5e, 0x5d, + 0x62, 0x51, 0x80, 0x8b, 0x8d, 0x9c, 0x7b, 0x73, 0x61, 0x71, 0x90, + 0x95, 0xa4, 0x9d, 0x99, 0x89, 0x7e, 0x82, 0x89, 0x8d, 0x89, 0x8a, + 0x80, 0x70, 0x66, 0x62, 0x60, 0x61, 0x56, 0x87, 0x83, 0x95, 0x9b, + 0x78, 0x70, 0x5e, 0x7f, 0x8e, 0x98, 0xa0, 0x9d, 0x97, 0x84, 0x81, + 0x83, 0x8a, 0x90, 0x8c, 0x8b, 0x7b, 0x6e, 0x68, 0x5d, 0x5f, 0x58, + 0x5e, 0x89, 0x7c, 0x9a, 0x93, 0x78, 0x6f, 0x63, 0x82, 0x8c, 0x98, + 0x9f, 0xa0, 0x95, 0x85, 0x81, 0x86, 0x89, 0x89, 0x8e, 0x8b, 0x7c, + 0x6a, 0x66, 0x5f, 0x5f, 0x53, 0x64, 0x93, 0x7c, 0x9b, 0x8a, 0x7c, + 0x6b, 0x5e, 0x8a, 0x8a, 0x9c, 0x9e, 0xa0, 0x96, 0x81, 0x7f, 0x84, + 0x8b, 0x89, 0x8a, 0x8c, 0x7c, 0x68, 0x62, 0x5b, 0x63, 0x50, 0x72, + 0x8a, 0x84, 0xa0, 0x82, 0x7c, 0x69, 0x6e, 0x8a, 0x8e, 0x9d, 0xa1, + 0x9f, 0x91, 0x81, 0x82, 0x84, 0x88, 0x8c, 0x8e, 0x86, 0x77, 0x69, + 0x60, 0x59, 0x60, 0x59, 0x79, 0x82, 0x81, 0xa0, 0x7f, 0x79, 0x64, + 0x78, 0x8a, 0x89, 0x9d, 0xa1, 0x9f, 0x90, 0x85, 0x84, 0x84, 0x86, + 0x8c, 0x8d, 0x87, 0x75, 0x6b, 0x62, 0x5a, 0x59, 0x55, 0x7d, 0x7e, + 0x82, 0x9a, 0x81, 0x79, 0x64, 0x77, 0x86, 0x89, 0x9d, 0xa4, 0xa2, + 0x91, 0x83, 0x83, 0x84, 0x87, 0x8d, 0x91, 0x88, 0x77, 0x6b, 0x5e, + 0x58, 0x55, 0x5a, 0x7e, 0x76, 0x8a, 0x9b, 0x80, 0x77, 0x66, 0x7d, + 0x80, 0x8c, 0x9d, 0xa8, 0xa1, 0x91, 0x87, 0x85, 0x84, 0x84, 0x8f, + 0x8f, 0x83, 0x74, 0x6c, 0x60, 0x57, 0x51, 0x63, 0x81, 0x71, 0x8d, + 0x96, 0x80, 0x78, 0x69, 0x81, 0x7f, 0x8f, 0x9f, 0xa5, 0x9e, 0x8d, + 0x89, 0x88, 0x83, 0x85, 0x93, 0x8e, 0x80, 0x72, 0x6b, 0x5f, 0x58, + 0x53, 0x69, 0x7b, 0x70, 0x8a, 0x90, 0x82, 0x76, 0x6d, 0x82, 0x80, + 0x89, 0x9c, 0xa6, 0x9e, 0x91, 0x8b, 0x8a, 0x82, 0x86, 0x8f, 0x8e, + 0x83, 0x72, 0x6c, 0x5e, 0x55, 0x52, 0x6e, 0x74, 0x70, 0x8e, 0x8c, + 0x7f, 0x72, 0x73, 0x7e, 0x7e, 0x8a, 0xa2, 0xa7, 0x9c, 0x96, 0x8e, + 0x8a, 0x80, 0x86, 0x91, 0x8a, 0x80, 0x74, 0x6b, 0x5e, 0x53, 0x57, + 0x72, 0x6f, 0x70, 0x8d, 0x8b, 0x80, 0x72, 0x7b, 0x83, 0x7f, 0x8e, + 0x9f, 0xa4, 0x9b, 0x94, 0x8f, 0x8b, 0x82, 0x87, 0x8f, 0x88, 0x7d, + 0x73, 0x6a, 0x5d, 0x53, 0x5d, 0x71, 0x69, 0x72, 0x8d, 0x86, 0x7e, + 0x76, 0x7e, 0x83, 0x7e, 0x8c, 0x9f, 0xa2, 0x9b, 0x97, 0x95, 0x8e, + 0x82, 0x89, 0x8b, 0x83, 0x7b, 0x76, 0x6a, 0x5c, 0x54, 0x62, 0x6c, + 0x60, 0x77, 0x8a, 0x83, 0x7b, 0x79, 0x84, 0x82, 0x80, 0x91, 0x9f, + 0x9e, 0x98, 0x99, 0x99, 0x8c, 0x85, 0x8c, 0x8a, 0x81, 0x78, 0x73, + 0x69, 0x5a, 0x57, 0x65, 0x69, 0x66, 0x7a, 0x83, 0x81, 0x7a, 0x7c, + 0x83, 0x81, 0x85, 0x91, 0x9d, 0x9b, 0x97, 0x99, 0x97, 0x8d, 0x8a, + 0x8d, 0x89, 0x80, 0x76, 0x71, 0x68, 0x5d, 0x5f, 0x67, 0x68, 0x66, + 0x74, 0x7b, 0x7a, 0x79, 0x7e, 0x86, 0x83, 0x87, 0x91, 0x98, 0x98, + 0x97, 0x99, 0x98, 0x90, 0x8e, 0x8d, 0x8a, 0x83, 0x7b, 0x75, 0x6d, + 0x65, 0x65, 0x67, 0x65, 0x66, 0x6f, 0x72, 0x72, 0x74, 0x7c, 0x81, + 0x83, 0x88, 0x8f, 0x93, 0x93, 0x95, 0x97, 0x99, 0x94, 0x93, 0x92, + 0x8e, 0x89, 0x82, 0x7e, 0x77, 0x70, 0x6c, 0x6b, 0x65, 0x63, 0x66, + 0x67, 0x68, 0x6b, 0x71, 0x77, 0x7c, 0x81, 0x88, 0x8e, 0x92, 0x95, + 0x99, 0x9c, 0x9b, 0x9d, 0x9a, 0x99, 0x94, 0x8e, 0x87, 0x81, 0x78, + 0x71, 0x6b, 0x63, 0x60, 0x5d, 0x5d, 0x5f, 0x62, 0x67, 0x6c, 0x74, + 0x7b, 0x83, 0x8a, 0x91, 0x97, 0x9c, 0x9f, 0xa2, 0xa2, 0xa0, 0x9e, + 0x9a, 0x93, 0x8c, 0x86, 0x7c, 0x73, 0x6d, 0x66, 0x5f, 0x5b, 0x5c, + 0x5c, 0x5e, 0x61, 0x68, 0x6e, 0x75, 0x7e, 0x85, 0x8e, 0x95, 0x99, + 0x9e, 0xa2, 0xa2, 0xa1, 0xa1, 0x9e, 0x98, 0x92, 0x8a, 0x82, 0x78, + 0x70, 0x69, 0x62, 0x5c, 0x5b, 0x5c, 0x5c, 0x5f, 0x64, 0x6b, 0x72, + 0x7a, 0x82, 0x8a, 0x91, 0x96, 0x9b, 0xa0, 0xa2, 0xa2, 0xa1, 0xa0, + 0x9b, 0x95, 0x8f, 0x86, 0x7d, 0x73, 0x6c, 0x64, 0x5e, 0x5b, 0x5c, + 0x5b, 0x5d, 0x62, 0x68, 0x6f, 0x76, 0x7e, 0x86, 0x8e, 0x93, 0x98, + 0x9d, 0xa1, 0xa2, 0xa2, 0xa1, 0x9d, 0x97, 0x91, 0x89, 0x81, 0x77, + 0x6f, 0x68, 0x62, 0x5d, 0x5d, 0x5d, 0x5d, 0x61, 0x66, 0x6c, 0x73, + 0x7b, 0x83, 0x8a, 0x91, 0x96, 0x9b, 0x9f, 0xa1, 0xa1, 0xa1, 0x9e, + 0x99, 0x94, 0x8c, 0x84, 0x7b, 0x73, 0x6c, 0x64, 0x5f, 0x5d, 0x5d, + 0x5d, 0x60, 0x65, 0x6b, 0x71, 0x78, 0x80, 0x88, 0x8e, 0x93, 0x98, + 0x9d, 0x9f, 0xa0, 0xa1, 0x9f, 0x9b, 0x96, 0x90, 0x88, 0x7f, 0x76, + 0x70, 0x69, 0x62, 0x5f, 0x5e, 0x5d, 0x5e, 0x62, 0x67, 0x6d, 0x73, + 0x7b, 0x83, 0x89, 0x8f, 0x95, 0x9a, 0x9d, 0x9f, 0x9f, 0xa0, 0x9d, + 0x98, 0x93, 0x8d, 0x84, 0x7b, 0x74, 0x6e, 0x67, 0x61, 0x60, 0x5f, + 0x5e, 0x61, 0x65, 0x6b, 0x70, 0x77, 0x7f, 0x86, 0x8c, 0x91, 0x97, + 0x9b, 0x9d, 0x9e, 0x9f, 0x9e, 0x9b, 0x95, 0x90, 0x89, 0x80, 0x77, + 0x72, 0x6b, 0x64, 0x61, 0x60, 0x5f, 0x60, 0x64, 0x69, 0x6f, 0x74, + 0x7b, 0x82, 0x89, 0x8f, 0x93, 0x98, 0x9b, 0x9d, 0x9d, 0x9d, 0x9b, + 0x96, 0x91, 0x8b, 0x83, 0x7a, 0x74, 0x6e, 0x67, 0x63, 0x61, 0x61, + 0x60, 0x63, 0x68, 0x6d, 0x72, 0x79, 0x80, 0x86, 0x8c, 0x91, 0x96, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9b, 0x97, 0x93, 0x8d, 0x85, 0x7d, 0x76, + 0x70, 0x6a, 0x65, 0x63, 0x62, 0x62, 0x64, 0x68, 0x6c, 0x71, 0x78, + 0x7e, 0x85, 0x8a, 0x8f, 0x94, 0x98, 0x9a, 0x9b, 0x9c, 0x9b, 0x97, + 0x93, 0x8d, 0x87, 0x7f, 0x77, 0x72, 0x6c, 0x66, 0x64, 0x64, 0x63, + 0x64, 0x68, 0x6d, 0x71, 0x77, 0x7e, 0x84, 0x89, 0x8e, 0x93, 0x96, + 0x99, 0x9a, 0x9b, 0x9a, 0x97, 0x93, 0x8e, 0x88, 0x80, 0x79, 0x73, + 0x6d, 0x68, 0x65, 0x65, 0x63, 0x64, 0x68, 0x6d, 0x71, 0x76, 0x7d, + 0x83, 0x88, 0x8c, 0x92, 0x95, 0x97, 0x99, 0x9a, 0x9a, 0x96, 0x93, + 0x8e, 0x87, 0x80, 0x79, 0x74, 0x6e, 0x69, 0x66, 0x66, 0x64, 0x65, + 0x69, 0x6d, 0x72, 0x77, 0x7d, 0x83, 0x88, 0x8d, 0x92, 0x95, 0x97, + 0x98, 0x99, 0x98, 0x95, 0x92, 0x8c, 0x86, 0x7e, 0x78, 0x73, 0x6d, + 0x69, 0x67, 0x66, 0x65, 0x67, 0x6b, 0x6f, 0x73, 0x79, 0x7f, 0x84, + 0x89, 0x8d, 0x92, 0x95, 0x96, 0x98, 0x98, 0x97, 0x94, 0x90, 0x8b, + 0x85, 0x7e, 0x78, 0x73, 0x6e, 0x69, 0x67, 0x67, 0x66, 0x67, 0x6b, + 0x6f, 0x73, 0x78, 0x7e, 0x84, 0x88, 0x8c, 0x90, 0x94, 0x96, 0x97, + 0x98, 0x97, 0x94, 0x90, 0x8b, 0x86, 0x7f, 0x79, 0x75, 0x70, 0x6b, + 0x68, 0x68, 0x67, 0x68, 0x6c, 0x70, 0x73, 0x78, 0x7d, 0x82, 0x87, + 0x8b, 0x90, 0x92, 0x94, 0x96, 0x96, 0x96, 0x93, 0x90, 0x8b, 0x86, + 0x7f, 0x79, 0x75, 0x70, 0x6c, 0x6a, 0x69, 0x69, 0x6a, 0x6d, 0x71, + 0x74, 0x79, 0x7e, 0x82, 0x87, 0x8b, 0x8f, 0x91, 0x93, 0x95, 0x95, + 0x94, 0x92, 0x8f, 0x8a, 0x85, 0x7e, 0x79, 0x75, 0x70, 0x6d, 0x6a, + 0x6a, 0x69, 0x6a, 0x6e, 0x71, 0x75, 0x79, 0x7f, 0x83, 0x87, 0x8b, + 0x8f, 0x91, 0x93, 0x94, 0x95, 0x94, 0x91, 0x8d, 0x89, 0x84, 0x7d, + 0x79, 0x74, 0x70, 0x6d, 0x6b, 0x6b, 0x6a, 0x6c, 0x6f, 0x73, 0x76, + 0x7b, 0x80, 0x84, 0x88, 0x8b, 0x8f, 0x91, 0x92, 0x93, 0x94, 0x93, + 0x90, 0x8c, 0x88, 0x82, 0x7d, 0x79, 0x74, 0x70, 0x6d, 0x6b, 0x6b, + 0x6b, 0x6d, 0x70, 0x73, 0x77, 0x7b, 0x80, 0x84, 0x88, 0x8c, 0x8f, + 0x90, 0x92, 0x93, 0x93, 0x91, 0x8f, 0x8b, 0x87, 0x81, 0x7c, 0x78, + 0x74, 0x70, 0x6e, 0x6d, 0x6c, 0x6c, 0x6e, 0x71, 0x74, 0x78, 0x7c, + 0x81, 0x85, 0x88, 0x8c, 0x8f, 0x91, 0x91, 0x92, 0x92, 0x90, 0x8d, + 0x89, 0x85, 0x7f, 0x7b, 0x77, 0x73, 0x70, 0x6e, 0x6d, 0x6d, 0x6e, + 0x70, 0x73, 0x76, 0x79, 0x7e, 0x82, 0x85, 0x89, 0x8c, 0x8e, 0x90, + 0x91, 0x91, 0x91, 0x8e, 0x8c, 0x88, 0x83, 0x7e, 0x7b, 0x77, 0x74, + 0x70, 0x6f, 0x6e, 0x6e, 0x6f, 0x72, 0x75, 0x77, 0x7b, 0x7f, 0x83, + 0x86, 0x8a, 0x8c, 0x8e, 0x8f, 0x90, 0x91, 0x8f, 0x8d, 0x89, 0x86, + 0x81, 0x7d, 0x79, 0x76, 0x72, 0x70, 0x6f, 0x6f, 0x70, 0x71, 0x74, + 0x76, 0x79, 0x7d, 0x81, 0x85, 0x88, 0x8a, 0x8d, 0x8e, 0x8f, 0x90, + 0x8f, 0x8e, 0x8a, 0x87, 0x83, 0x7e, 0x7b, 0x77, 0x74, 0x72, 0x70, + 0x70, 0x70, 0x71, 0x73, 0x75, 0x78, 0x7c, 0x7f, 0x83, 0x86, 0x89, + 0x8b, 0x8d, 0x8e, 0x8f, 0x8f, 0x8d, 0x8b, 0x88, 0x84, 0x80, 0x7d, + 0x79, 0x76, 0x73, 0x71, 0x71, 0x70, 0x71, 0x73, 0x75, 0x77, 0x7b, + 0x7e, 0x82, 0x85, 0x88, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x8e, 0x8c, + 0x89, 0x86, 0x82, 0x7e, 0x7b, 0x78, 0x75, 0x72, 0x71, 0x71, 0x71, + 0x72, 0x74, 0x76, 0x78, 0x7c, 0x7f, 0x82, 0x85, 0x88, 0x8b, 0x8c, + 0x8d, 0x8e, 0x8e, 0x8d, 0x8a, 0x87, 0x84, 0x80, 0x7d, 0x7a, 0x77, + 0x74, 0x72, 0x71, 0x71, 0x72, 0x74, 0x76, 0x77, 0x7a, 0x7d, 0x81, + 0x84, 0x87, 0x89, 0x8b, 0x8c, 0x8d, 0x8d, 0x8c, 0x8b, 0x88, 0x85, + 0x82, 0x7f, 0x7c, 0x79, 0x76, 0x74, 0x73, 0x72, 0x72, 0x74, 0x75, + 0x76, 0x79, 0x7c, 0x7f, 0x82, 0x85, 0x87, 0x89, 0x8a, 0x8c, 0x8c, + 0x8c, 0x8b, 0x89, 0x87, 0x84, 0x81, 0x7e, 0x7b, 0x79, 0x76, 0x74, + 0x73, 0x73, 0x74, 0x75, 0x76, 0x78, 0x7a, 0x7d, 0x80, 0x83, 0x86, + 0x87, 0x89, 0x8a, 0x8b, 0x8c, 0x8b, 0x8a, 0x88, 0x85, 0x83, 0x80, + 0x7e, 0x7b, 0x78, 0x76, 0x75, 0x74, 0x74, 0x75, 0x77, 0x78, 0x7a, + 0x7c, 0x7f, 0x81, 0x83, 0x85, 0x87, 0x88, 0x89, 0x89, 0x88, 0x87, + 0x86, 0x84, 0x82, 0x80, 0x7e, 0x7c, 0x7a, 0x78, 0x77, 0x77, 0x77, + 0x78, 0x79, 0x7a, 0x7c, 0x7e, 0x80, 0x82, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x88, 0x88, 0x87, 0x85, 0x84, 0x82, 0x81, 0x7e, 0x7c, 0x7a, + 0x78, 0x77, 0x77, 0x77, 0x77, 0x78, 0x79, 0x7a, 0x7c, 0x7e, 0x80, + 0x82, 0x84, 0x85, 0x86, 0x87, 0x87, 0x87, 0x86, 0x86, 0x85, 0x83, + 0x82, 0x80, 0x7e, 0x7c, 0x7a, 0x79, 0x79, 0x78, 0x78, 0x78, 0x79, + 0x7a, 0x7c, 0x7d, 0x7f, 0x80, 0x82, 0x83, 0x84, 0x85, 0x86, 0x86, + 0x86, 0x85, 0x85, 0x84, 0x83, 0x82, 0x80, 0x7e, 0x7d, 0x7c, 0x7b, + 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x84, 0x85, 0x85, 0x84, 0x84, 0x83, 0x82, 0x81, + 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7c, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, + 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, + 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, + }, + { // 4 + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, + 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x81, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x81, 0x80, + 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x81, + 0x81, 0x81, 0x81, 0x80, 0x81, 0x81, 0x82, 0x81, 0x82, 0x82, 0x81, + 0x80, 0x81, 0x82, 0x82, 0x81, 0x82, 0x81, 0x81, 0x80, 0x80, 0x82, + 0x82, 0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x82, 0x81, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x7f, 0x80, 0x81, 0x80, + 0x80, 0x81, 0x82, 0x83, 0x82, 0x81, 0x82, 0x81, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7f, 0x7f, 0x7d, 0x7d, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, + 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x81, + 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x7d, 0x7e, 0x7f, 0x80, + 0x80, 0x80, 0x81, 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x7e, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7e, 0x7d, 0x7f, + 0x7e, 0x7e, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7e, 0x7f, 0x7d, 0x7e, + 0x7e, 0x7d, 0x7d, 0x7d, 0x7e, 0x7f, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, + 0x7d, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7d, 0x7d, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x7c, 0x7e, + 0x80, 0x80, 0x7e, 0x7d, 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x7d, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x7e, 0x7e, + 0x7f, 0x7f, 0x80, 0x80, 0x7d, 0x7d, 0x80, 0x7f, 0x7f, 0x7d, 0x7e, + 0x7e, 0x7d, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7d, 0x7e, 0x7f, 0x81, + 0x7f, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x7e, + 0x7e, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7d, 0x7d, 0x7f, 0x7f, 0x7e, + 0x80, 0x81, 0x7f, 0x81, 0x7e, 0x80, 0x7f, 0x81, 0x81, 0x7f, 0x7f, + 0x7e, 0x81, 0x7f, 0x81, 0x81, 0x80, 0x80, 0x81, 0x84, 0x80, 0x7f, + 0x80, 0x7e, 0x7e, 0x80, 0x82, 0x80, 0x7f, 0x81, 0x81, 0x7f, 0x7e, + 0x80, 0x7f, 0x81, 0x81, 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x80, 0x7e, + 0x81, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x80, 0x7e, 0x7f, 0x7f, + 0x80, 0x7e, 0x7d, 0x80, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x7e, 0x7f, + 0x7e, 0x81, 0x80, 0x7d, 0x7f, 0x80, 0x80, 0x7c, 0x7d, 0x7b, 0x7b, + 0x7d, 0x7c, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7f, 0x81, 0x7f, + 0x7e, 0x7c, 0x7e, 0x7d, 0x7d, 0x80, 0x81, 0x7e, 0x7f, 0x80, 0x80, + 0x83, 0x85, 0x81, 0x83, 0x84, 0x83, 0x7f, 0x80, 0x80, 0x81, 0x84, + 0x7f, 0x7f, 0x7f, 0x82, 0x7f, 0x7f, 0x7f, 0x7c, 0x81, 0x80, 0x7e, + 0x7d, 0x7f, 0x7f, 0x81, 0x82, 0x81, 0x80, 0x7e, 0x7c, 0x7d, 0x80, + 0x81, 0x80, 0x7f, 0x82, 0x7e, 0x80, 0x80, 0x80, 0x81, 0x82, 0x7f, + 0x7d, 0x7e, 0x7e, 0x80, 0x80, 0x7b, 0x7b, 0x7f, 0x81, 0x82, 0x7f, + 0x7e, 0x7e, 0x80, 0x80, 0x80, 0x80, 0x82, 0x7e, 0x7a, 0x80, 0x82, + 0x81, 0x81, 0x83, 0x83, 0x80, 0x7f, 0x7f, 0x7f, 0x81, 0x83, 0x85, + 0x86, 0x81, 0x7b, 0x7c, 0x7e, 0x80, 0x82, 0x83, 0x80, 0x81, 0x80, + 0x7f, 0x83, 0x81, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7a, 0x7d, 0x80, + 0x7e, 0x7c, 0x7e, 0x82, 0x7e, 0x7c, 0x80, 0x7f, 0x7c, 0x7d, 0x7e, + 0x7e, 0x7c, 0x7a, 0x7d, 0x80, 0x7e, 0x7f, 0x80, 0x7f, 0x7f, 0x82, + 0x83, 0x82, 0x7f, 0x80, 0x81, 0x83, 0x80, 0x81, 0x82, 0x81, 0x81, + 0x7f, 0x80, 0x7c, 0x81, 0x81, 0x80, 0x81, 0x81, 0x7f, 0x7f, 0x82, + 0x7f, 0x82, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7d, + 0x7f, 0x7e, 0x7c, 0x7c, 0x7d, 0x80, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, + 0x7d, 0x81, 0x82, 0x7d, 0x79, 0x7c, 0x7f, 0x7b, 0x7d, 0x7d, 0x7f, + 0x7d, 0x7e, 0x7e, 0x7d, 0x7f, 0x7f, 0x81, 0x80, 0x7e, 0x7d, 0x82, + 0x82, 0x7e, 0x7e, 0x83, 0x7e, 0x7d, 0x81, 0x7f, 0x7e, 0x7e, 0x80, + 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x80, 0x81, 0x81, 0x82, 0x7b, 0x79, + 0x81, 0x81, 0x80, 0x7f, 0x82, 0x7f, 0x7c, 0x7e, 0x81, 0x7e, 0x7e, + 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7e, + 0x7d, 0x7d, 0x7f, 0x80, 0x82, 0x82, 0x7c, 0x77, 0x7d, 0x7f, 0x7d, + 0x7f, 0x7e, 0x7d, 0x7e, 0x7f, 0x7f, 0x7d, 0x7c, 0x80, 0x7f, 0x7c, + 0x7b, 0x7c, 0x7e, 0x7d, 0x7d, 0x81, 0x80, 0x7d, 0x7d, 0x7f, 0x81, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x82, 0x81, 0x7e, 0x81, 0x83, 0x80, + 0x80, 0x7e, 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x7b, 0x7c, 0x81, 0x82, + 0x7f, 0x7e, 0x7e, 0x7f, 0x7c, 0x7c, 0x7e, 0x7e, 0x81, 0x7d, 0x7e, + 0x7e, 0x81, 0x82, 0x7f, 0x7c, 0x80, 0x82, 0x80, 0x7f, 0x80, 0x80, + 0x83, 0x83, 0x81, 0x7f, 0x7e, 0x83, 0x82, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x83, 0x84, 0x82, 0x82, 0x81, 0x81, 0x80, 0x81, 0x81, 0x7f, + 0x7d, 0x7d, 0x82, 0x82, 0x7c, 0x7e, 0x7e, 0x7c, 0x7e, 0x7f, 0x7d, + 0x7c, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7b, 0x7d, 0x7f, 0x7e, + 0x80, 0x80, 0x80, 0x7d, 0x7d, 0x81, 0x80, 0x7f, 0x80, 0x82, 0x82, + 0x7f, 0x80, 0x83, 0x83, 0x80, 0x81, 0x82, 0x7e, 0x7f, 0x7e, 0x7d, + 0x7d, 0x7c, 0x7e, 0x7f, 0x7c, 0x7e, 0x80, 0x81, 0x81, 0x83, 0x84, + 0x83, 0x83, 0x82, 0x82, 0x80, 0x81, 0x82, 0x82, 0x80, 0x7b, 0x79, + 0x7a, 0x7b, 0x7d, 0x7e, 0x7e, 0x7c, 0x7b, 0x7f, 0x82, 0x7f, 0x7f, + 0x84, 0x87, 0x86, 0x87, 0x84, 0x84, 0x84, 0x80, 0x7d, 0x7a, 0x77, + 0x75, 0x74, 0x6f, 0x6c, 0x6e, 0x74, 0x76, 0x7c, 0x85, 0x8b, 0x8f, + 0x97, 0x9d, 0xa1, 0xa3, 0xa0, 0x9a, 0x8d, 0x80, 0x75, 0x6c, 0x68, + 0x61, 0x56, 0x53, 0x5c, 0x63, 0x68, 0x6f, 0x7b, 0x88, 0x91, 0x96, + 0xa3, 0xb3, 0xb6, 0xb5, 0xb1, 0xa9, 0x96, 0x7e, 0x6c, 0x5f, 0x58, + 0x54, 0x51, 0x51, 0x50, 0x54, 0x5f, 0x6a, 0x74, 0x7e, 0x89, 0x92, + 0x99, 0x9d, 0xa3, 0xaa, 0xa9, 0xa6, 0xa1, 0x9b, 0x98, 0x93, 0x90, + 0x8c, 0x88, 0x82, 0x78, 0x6c, 0x5f, 0x58, 0x52, 0x4c, 0x4e, 0x52, + 0x57, 0x5d, 0x67, 0x75, 0x81, 0x8b, 0x94, 0x9b, 0xa3, 0xa7, 0xaa, + 0xad, 0xac, 0xa6, 0xa3, 0x9d, 0x98, 0x93, 0x8c, 0x87, 0x7f, 0x75, + 0x6a, 0x5e, 0x53, 0x4b, 0x45, 0x4b, 0x50, 0x59, 0x5d, 0x69, 0x77, + 0x82, 0x8f, 0x96, 0xa0, 0xa5, 0xa9, 0xac, 0xac, 0xab, 0xa6, 0xa0, + 0x9b, 0x95, 0x90, 0x89, 0x81, 0x78, 0x6c, 0x61, 0x55, 0x4f, 0x45, + 0x41, 0x47, 0x50, 0x5e, 0x63, 0x71, 0x7e, 0x8d, 0x95, 0x9e, 0xa8, + 0xad, 0xaf, 0xad, 0xaf, 0xab, 0xa5, 0x9e, 0x9a, 0x92, 0x89, 0x7f, + 0x77, 0x69, 0x60, 0x56, 0x4e, 0x44, 0x3a, 0x45, 0x4d, 0x5d, 0x60, + 0x71, 0x82, 0x8f, 0x98, 0x9e, 0xa9, 0xad, 0xae, 0xaf, 0xaf, 0xab, + 0xa6, 0x9f, 0x9b, 0x91, 0x88, 0x7c, 0x76, 0x66, 0x5d, 0x53, 0x4d, + 0x41, 0x39, 0x42, 0x4e, 0x5e, 0x61, 0x73, 0x85, 0x95, 0x9a, 0xa0, + 0xad, 0xb2, 0xb2, 0xaf, 0xb1, 0xad, 0xa4, 0x9e, 0x96, 0x8c, 0x7f, + 0x78, 0x6d, 0x5f, 0x53, 0x4c, 0x45, 0x38, 0x3c, 0x4a, 0x5f, 0x61, + 0x6c, 0x80, 0x93, 0x9b, 0x9d, 0xab, 0xb3, 0xb4, 0xb0, 0xb1, 0xb0, + 0xa7, 0x9e, 0x97, 0x8b, 0x7f, 0x77, 0x6e, 0x62, 0x55, 0x50, 0x4b, + 0x3b, 0x3a, 0x49, 0x5c, 0x63, 0x69, 0x80, 0x92, 0x9b, 0x9c, 0xa8, + 0xb3, 0xb7, 0xb2, 0xb1, 0xaf, 0xa8, 0xa1, 0x93, 0x87, 0x7d, 0x75, + 0x6b, 0x5f, 0x55, 0x52, 0x47, 0x38, 0x3c, 0x50, 0x60, 0x63, 0x6c, + 0x83, 0x96, 0x9a, 0x9d, 0xa9, 0xb4, 0xb6, 0xb1, 0xae, 0xad, 0xa8, + 0x9d, 0x8d, 0x81, 0x7c, 0x73, 0x64, 0x59, 0x56, 0x53, 0x44, 0x36, + 0x43, 0x5a, 0x63, 0x64, 0x73, 0x8e, 0x9c, 0x9b, 0x9e, 0xb0, 0xb9, + 0xb4, 0xad, 0xad, 0xae, 0xa2, 0x92, 0x85, 0x7e, 0x75, 0x67, 0x5d, + 0x5c, 0x59, 0x4b, 0x39, 0x3c, 0x55, 0x5f, 0x61, 0x6b, 0x86, 0x97, + 0x96, 0x9a, 0xab, 0xb9, 0xb5, 0xac, 0xaf, 0xaf, 0xa5, 0x96, 0x8c, + 0x88, 0x7b, 0x6c, 0x64, 0x62, 0x5e, 0x53, 0x47, 0x3c, 0x48, 0x57, + 0x5e, 0x65, 0x74, 0x8a, 0x93, 0x97, 0x9e, 0xae, 0xb6, 0xb2, 0xb0, + 0xb0, 0xac, 0x9d, 0x94, 0x8b, 0x82, 0x75, 0x6b, 0x68, 0x65, 0x5c, + 0x55, 0x4c, 0x3f, 0x4a, 0x58, 0x62, 0x65, 0x72, 0x86, 0x91, 0x95, + 0x9b, 0xac, 0xb2, 0xb0, 0xad, 0xaf, 0xa9, 0x9b, 0x92, 0x8b, 0x80, + 0x73, 0x6e, 0x6b, 0x68, 0x5e, 0x59, 0x4f, 0x43, 0x4d, 0x5b, 0x62, + 0x64, 0x72, 0x85, 0x90, 0x92, 0x9c, 0xad, 0xb3, 0xb1, 0xad, 0xb0, + 0xaa, 0x9e, 0x93, 0x8c, 0x83, 0x74, 0x72, 0x6e, 0x6b, 0x64, 0x5f, + 0x54, 0x42, 0x48, 0x58, 0x5f, 0x5d, 0x68, 0x7f, 0x8b, 0x8e, 0x97, + 0xa9, 0xb4, 0xb1, 0xae, 0xaf, 0xae, 0xa2, 0x98, 0x90, 0x86, 0x7c, + 0x74, 0x74, 0x6f, 0x6c, 0x6a, 0x63, 0x4f, 0x3d, 0x4a, 0x59, 0x58, + 0x56, 0x68, 0x80, 0x86, 0x8b, 0x97, 0xb1, 0xb7, 0xb2, 0xb2, 0xb2, + 0xae, 0xa1, 0x98, 0x8d, 0x83, 0x7c, 0x78, 0x74, 0x6f, 0x70, 0x6f, + 0x62, 0x4d, 0x42, 0x50, 0x56, 0x51, 0x53, 0x66, 0x7e, 0x82, 0x88, + 0x9d, 0xb3, 0xb9, 0xb6, 0xb7, 0xb8, 0xb2, 0xa4, 0x98, 0x8f, 0x86, + 0x7f, 0x77, 0x72, 0x73, 0x75, 0x72, 0x6a, 0x5e, 0x54, 0x47, 0x49, + 0x50, 0x53, 0x59, 0x62, 0x77, 0x82, 0x8f, 0x9c, 0xaf, 0xba, 0xba, + 0xb8, 0xb6, 0xb0, 0xa4, 0x97, 0x8c, 0x83, 0x7e, 0x79, 0x73, 0x76, + 0x77, 0x75, 0x70, 0x6a, 0x5d, 0x4f, 0x46, 0x50, 0x56, 0x58, 0x59, + 0x6b, 0x83, 0x8a, 0x95, 0xa6, 0xbb, 0xbd, 0xb8, 0xb4, 0xb4, 0xac, + 0x98, 0x8b, 0x86, 0x83, 0x77, 0x71, 0x76, 0x7b, 0x75, 0x71, 0x70, + 0x71, 0x64, 0x51, 0x4a, 0x52, 0x58, 0x57, 0x5c, 0x6d, 0x84, 0x8a, + 0x95, 0xa3, 0xb8, 0xba, 0xb3, 0xb5, 0xb4, 0xa8, 0x92, 0x8b, 0x87, + 0x81, 0x75, 0x75, 0x79, 0x7a, 0x77, 0x77, 0x7b, 0x78, 0x6c, 0x60, + 0x57, 0x50, 0x4e, 0x57, 0x5a, 0x63, 0x6a, 0x7c, 0x8c, 0x99, 0xa9, + 0xb4, 0xbd, 0xba, 0xb8, 0xb1, 0xaa, 0x99, 0x8d, 0x83, 0x81, 0x7e, + 0x77, 0x76, 0x79, 0x81, 0x7e, 0x7e, 0x7e, 0x7d, 0x72, 0x61, 0x54, + 0x4b, 0x4b, 0x50, 0x50, 0x5a, 0x66, 0x79, 0x89, 0x96, 0xa7, 0xb4, + 0xbd, 0xbc, 0xb9, 0xb2, 0xa8, 0x9c, 0x92, 0x86, 0x81, 0x7d, 0x7d, + 0x7a, 0x7d, 0x83, 0x84, 0x84, 0x81, 0x82, 0x7c, 0x6f, 0x62, 0x54, + 0x4b, 0x40, 0x40, 0x4d, 0x56, 0x62, 0x6f, 0x86, 0x97, 0xa5, 0xb0, + 0xbb, 0xc1, 0xbd, 0xb6, 0xac, 0xa3, 0x96, 0x89, 0x81, 0x7c, 0x7e, + 0x7d, 0x7f, 0x82, 0x89, 0x8a, 0x87, 0x86, 0x82, 0x7c, 0x6b, 0x60, + 0x51, 0x4a, 0x3b, 0x37, 0x3a, 0x4e, 0x5a, 0x65, 0x78, 0x8e, 0xa7, + 0xac, 0xb8, 0xc0, 0xc9, 0xc0, 0xb3, 0xab, 0xa3, 0x97, 0x87, 0x81, + 0x7e, 0x7c, 0x77, 0x7b, 0x86, 0x8b, 0x8a, 0x88, 0x8a, 0x86, 0x7a, + 0x70, 0x6a, 0x64, 0x57, 0x4c, 0x48, 0x47, 0x42, 0x40, 0x49, 0x63, + 0x71, 0x80, 0x8c, 0xa4, 0xb6, 0xb8, 0xc1, 0xc6, 0xcf, 0xbf, 0xb1, + 0xa8, 0xa0, 0x90, 0x79, 0x71, 0x6a, 0x63, 0x59, 0x5b, 0x64, 0x69, + 0x6d, 0x74, 0x83, 0x8b, 0x8e, 0x8f, 0x93, 0x96, 0x91, 0x8e, 0x89, + 0x88, 0x80, 0x79, 0x76, 0x72, 0x6d, 0x66, 0x67, 0x64, 0x5f, 0x57, + 0x58, 0x54, 0x50, 0x4f, 0x5f, 0x72, 0x77, 0x80, 0x8f, 0xa6, 0xaa, + 0xaf, 0xb9, 0xc3, 0xc0, 0xb2, 0xac, 0xa7, 0x9c, 0x86, 0x7a, 0x75, + 0x6f, 0x65, 0x5f, 0x65, 0x6a, 0x6d, 0x6e, 0x79, 0x82, 0x85, 0x87, + 0x8a, 0x90, 0x8c, 0x86, 0x80, 0x7f, 0x7a, 0x73, 0x72, 0x75, 0x77, + 0x71, 0x73, 0x78, 0x7e, 0x7a, 0x79, 0x7d, 0x7c, 0x74, 0x69, 0x68, + 0x61, 0x56, 0x4f, 0x58, 0x68, 0x6e, 0x70, 0x7e, 0x94, 0xa1, 0xa5, + 0xae, 0xbd, 0xc2, 0xba, 0xb2, 0xae, 0xa6, 0x94, 0x84, 0x7c, 0x74, + 0x69, 0x5e, 0x60, 0x65, 0x68, 0x6a, 0x72, 0x7d, 0x81, 0x82, 0x86, + 0x8c, 0x8e, 0x87, 0x84, 0x83, 0x7f, 0x76, 0x6e, 0x6d, 0x6e, 0x6d, + 0x68, 0x6c, 0x74, 0x7f, 0x81, 0x84, 0x8c, 0x94, 0x95, 0x8e, 0x90, + 0x8f, 0x89, 0x79, 0x71, 0x6b, 0x63, 0x58, 0x4f, 0x4f, 0x4c, 0x52, + 0x5a, 0x6d, 0x7b, 0x89, 0x99, 0xa7, 0xb7, 0xba, 0xc0, 0xbf, 0xbe, + 0xb5, 0xa6, 0x9b, 0x8c, 0x7f, 0x6e, 0x66, 0x61, 0x5e, 0x5d, 0x5f, + 0x69, 0x6f, 0x78, 0x7e, 0x88, 0x8e, 0x8f, 0x8f, 0x8d, 0x8c, 0x84, + 0x7f, 0x78, 0x73, 0x6e, 0x67, 0x67, 0x67, 0x6b, 0x6c, 0x71, 0x79, + 0x7f, 0x84, 0x88, 0x8d, 0x90, 0x91, 0x8e, 0x8d, 0x89, 0x89, 0x86, + 0x81, 0x7f, 0x7b, 0x7d, 0x79, 0x7a, 0x79, 0x7a, 0x79, 0x76, 0x74, + 0x71, 0x71, 0x6c, 0x68, 0x62, 0x68, 0x71, 0x77, 0x7e, 0x85, 0x95, + 0x9d, 0xa1, 0xa6, 0xac, 0xb0, 0xa8, 0xa1, 0x99, 0x94, 0x88, 0x7c, + 0x73, 0x6e, 0x6b, 0x65, 0x66, 0x6a, 0x70, 0x73, 0x77, 0x80, 0x86, + 0x88, 0x87, 0x89, 0x89, 0x84, 0x7f, 0x7b, 0x79, 0x72, 0x6e, 0x6c, + 0x6e, 0x6f, 0x6f, 0x72, 0x77, 0x7d, 0x7f, 0x83, 0x88, 0x8b, 0x8b, + 0x8a, 0x8b, 0x8a, 0x86, 0x81, 0x7f, 0x7c, 0x7a, 0x77, 0x76, 0x78, + 0x78, 0x7b, 0x7c, 0x80, 0x83, 0x85, 0x87, 0x8a, 0x8c, 0x8b, 0x89, + 0x88, 0x87, 0x84, 0x81, 0x7e, 0x7e, 0x7c, 0x7b, 0x7b, 0x7c, 0x7c, + 0x7d, 0x7d, 0x80, 0x81, 0x82, 0x82, 0x82, 0x84, 0x82, 0x81, 0x7f, + 0x7f, 0x7e, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7f, 0x80, + 0x89, 0x8f, 0x8d, 0x88, 0x85, 0x85, 0x7b, 0x73, 0x6d, 0x6d, 0x65, + 0x5d, 0x5c, 0x66, 0x6f, 0x71, 0x7b, 0x86, 0x96, 0x99, 0x9d, 0xa2, + 0xa6, 0xa4, 0x98, 0x93, 0x8e, 0x86, 0x78, 0x70, 0x6f, 0x6e, 0x6c, + 0x6a, 0x71, 0x79, 0x7d, 0x80, 0x86, 0x8e, 0x8e, 0x8c, 0x8a, 0x8a, + 0x86, 0x7e, 0x79, 0x76, 0x74, 0x6f, 0x6d, 0x6f, 0x73, 0x75, 0x76, + 0x7c, 0x82, 0x86, 0x87, 0x89, 0x8c, 0x8c, 0x89, 0x86, 0x85, 0x82, + 0x7e, 0x79, 0x78, 0x78, 0x77, 0x76, 0x77, 0x7b, 0x7e, 0x7f, 0x82, + 0x85, 0x88, 0x87, 0x87, 0x87, 0x87, 0x84, 0x81, 0x7f, 0x7e, 0x7d, + 0x7a, 0x7a, 0x7b, 0x7c, 0x7c, 0x7d, 0x80, 0x82, 0x83, 0x83, 0x84, + 0x84, 0x83, 0x82, 0x80, 0x80, 0x7e, 0x7d, 0x7c, 0x7c, 0x7c, 0x7b, + 0x7c, 0x7d, 0x7f, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x82, 0x82, 0x82, + 0x81, 0x80, 0x7e, 0x7e, 0x7e, 0x7d, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, + 0x7f, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, + }, + { // 5 + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, + 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7c, 0x7b, + 0x7a, 0x78, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x78, 0x79, + 0x7b, 0x7c, 0x7d, 0x7f, 0x80, 0x81, 0x83, 0x83, 0x84, 0x85, 0x85, + 0x86, 0x86, 0x87, 0x88, 0x88, 0x89, 0x8a, 0x8a, 0x8a, 0x8a, 0x89, + 0x87, 0x84, 0x81, 0x7d, 0x79, 0x75, 0x71, 0x6f, 0x6f, 0x6f, 0x6f, + 0x6f, 0x70, 0x70, 0x71, 0x73, 0x75, 0x77, 0x79, 0x7b, 0x7d, 0x7f, + 0x81, 0x83, 0x84, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8c, 0x8d, 0x8f, + 0x90, 0x90, 0x91, 0x90, 0x8f, 0x8e, 0x8c, 0x89, 0x86, 0x83, 0x7f, + 0x7c, 0x78, 0x75, 0x72, 0x6f, 0x6e, 0x6d, 0x6e, 0x6e, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6f, 0x6f, 0x70, 0x72, 0x74, 0x76, 0x79, 0x7b, 0x7e, + 0x81, 0x83, 0x86, 0x88, 0x8a, 0x8d, 0x8f, 0x91, 0x93, 0x94, 0x95, + 0x95, 0x94, 0x93, 0x91, 0x8f, 0x8c, 0x88, 0x85, 0x81, 0x7e, 0x7b, + 0x78, 0x75, 0x73, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x71, + 0x70, 0x6f, 0x6f, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x75, 0x77, 0x7a, + 0x7c, 0x7f, 0x82, 0x84, 0x87, 0x8a, 0x8d, 0x90, 0x92, 0x95, 0x96, + 0x97, 0x97, 0x97, 0x95, 0x93, 0x90, 0x8c, 0x89, 0x85, 0x80, 0x7d, + 0x79, 0x76, 0x74, 0x73, 0x72, 0x73, 0x73, 0x73, 0x72, 0x71, 0x70, + 0x6f, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x76, + 0x79, 0x7c, 0x7e, 0x81, 0x85, 0x88, 0x8b, 0x8f, 0x92, 0x95, 0x98, + 0x99, 0x9a, 0x9a, 0x99, 0x97, 0x94, 0x90, 0x8c, 0x87, 0x83, 0x7e, + 0x7a, 0x77, 0x75, 0x74, 0x73, 0x74, 0x74, 0x74, 0x73, 0x71, 0x70, + 0x6f, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x70, 0x71, 0x73, + 0x75, 0x78, 0x7a, 0x7d, 0x80, 0x84, 0x87, 0x8b, 0x8e, 0x92, 0x96, + 0x99, 0x9b, 0x9c, 0x9d, 0x9c, 0x9a, 0x97, 0x93, 0x8e, 0x89, 0x84, + 0x7f, 0x7a, 0x77, 0x75, 0x75, 0x75, 0x75, 0x75, 0x74, 0x72, 0x70, + 0x6f, 0x6e, 0x6e, 0x6e, 0x6e, 0x6d, 0x6d, 0x6d, 0x6d, 0x6e, 0x70, + 0x71, 0x73, 0x75, 0x78, 0x7b, 0x7e, 0x81, 0x84, 0x88, 0x8c, 0x90, + 0x94, 0x98, 0x9b, 0x9d, 0x9f, 0x9f, 0x9d, 0x9b, 0x97, 0x93, 0x8d, + 0x87, 0x81, 0x7c, 0x78, 0x76, 0x76, 0x76, 0x76, 0x75, 0x74, 0x72, + 0x70, 0x6f, 0x6f, 0x6f, 0x6e, 0x6e, 0x6d, 0x6c, 0x6c, 0x6c, 0x6c, + 0x6d, 0x6e, 0x70, 0x73, 0x75, 0x78, 0x7b, 0x7e, 0x81, 0x84, 0x88, + 0x8c, 0x90, 0x95, 0x99, 0x9c, 0x9f, 0xa0, 0xa1, 0x9f, 0x9d, 0x98, + 0x93, 0x8c, 0x86, 0x80, 0x7b, 0x78, 0x78, 0x77, 0x77, 0x76, 0x74, + 0x73, 0x71, 0x70, 0x70, 0x70, 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6b, + 0x6b, 0x6b, 0x6c, 0x6d, 0x6f, 0x71, 0x74, 0x77, 0x7a, 0x7d, 0x80, + 0x84, 0x87, 0x8b, 0x8f, 0x94, 0x98, 0x9d, 0xa0, 0xa2, 0xa4, 0xa3, + 0xa0, 0x9c, 0x96, 0x8f, 0x88, 0x81, 0x7d, 0x7a, 0x79, 0x78, 0x78, + 0x76, 0x74, 0x72, 0x71, 0x70, 0x70, 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, + 0x6a, 0x69, 0x69, 0x69, 0x69, 0x6b, 0x6d, 0x6f, 0x72, 0x76, 0x79, + 0x7c, 0x7f, 0x82, 0x85, 0x89, 0x8d, 0x92, 0x97, 0x9c, 0xa1, 0xa5, + 0xa7, 0xa7, 0xa5, 0xa0, 0x9a, 0x93, 0x8c, 0x84, 0x7f, 0x7b, 0x7a, + 0x7a, 0x78, 0x76, 0x73, 0x71, 0x70, 0x70, 0x70, 0x70, 0x6f, 0x6e, + 0x6c, 0x6b, 0x69, 0x68, 0x67, 0x67, 0x67, 0x68, 0x6a, 0x6d, 0x70, + 0x74, 0x78, 0x7a, 0x7e, 0x80, 0x83, 0x87, 0x8c, 0x90, 0x96, 0x9d, + 0xa3, 0xa7, 0xaa, 0xaa, 0xa8, 0xa3, 0x9d, 0x95, 0x8d, 0x85, 0x7e, + 0x7b, 0x7a, 0x79, 0x78, 0x76, 0x73, 0x71, 0x70, 0x71, 0x71, 0x71, + 0x71, 0x70, 0x6e, 0x6c, 0x6a, 0x67, 0x66, 0x66, 0x66, 0x67, 0x69, + 0x6b, 0x6f, 0x72, 0x75, 0x78, 0x7b, 0x7e, 0x81, 0x84, 0x89, 0x8f, + 0x95, 0x9c, 0xa3, 0xa9, 0xac, 0xad, 0xac, 0xa7, 0xa0, 0x98, 0x8f, + 0x86, 0x7f, 0x7b, 0x79, 0x78, 0x77, 0x75, 0x72, 0x70, 0x70, 0x70, + 0x72, 0x73, 0x74, 0x73, 0x71, 0x6e, 0x6a, 0x67, 0x65, 0x64, 0x65, + 0x66, 0x68, 0x6b, 0x6e, 0x71, 0x75, 0x78, 0x7a, 0x7d, 0x7f, 0x82, + 0x86, 0x8c, 0x93, 0x9b, 0xa2, 0xa9, 0xad, 0xaf, 0xae, 0xa9, 0xa2, + 0x9a, 0x91, 0x88, 0x80, 0x7b, 0x78, 0x77, 0x76, 0x74, 0x72, 0x70, + 0x6f, 0x71, 0x73, 0x76, 0x78, 0x77, 0x75, 0x70, 0x6c, 0x68, 0x65, + 0x64, 0x64, 0x64, 0x66, 0x68, 0x6b, 0x6e, 0x72, 0x75, 0x78, 0x7a, + 0x7d, 0x80, 0x85, 0x8a, 0x92, 0x9a, 0xa3, 0xaa, 0xaf, 0xb1, 0xb0, + 0xac, 0xa5, 0x9c, 0x92, 0x89, 0x81, 0x7b, 0x77, 0x75, 0x74, 0x73, + 0x71, 0x70, 0x6f, 0x71, 0x74, 0x78, 0x7a, 0x7b, 0x78, 0x73, 0x6d, + 0x68, 0x65, 0x64, 0x63, 0x64, 0x65, 0x68, 0x6b, 0x6e, 0x71, 0x73, + 0x76, 0x79, 0x7b, 0x7f, 0x83, 0x89, 0x90, 0x99, 0xa2, 0xaa, 0xb0, + 0xb3, 0xb2, 0xae, 0xa7, 0x9f, 0x95, 0x8c, 0x83, 0x7b, 0x76, 0x72, + 0x70, 0x6f, 0x6e, 0x6e, 0x6f, 0x72, 0x76, 0x7a, 0x7d, 0x7f, 0x7d, + 0x78, 0x71, 0x6b, 0x66, 0x64, 0x63, 0x63, 0x64, 0x66, 0x69, 0x6c, + 0x6f, 0x72, 0x75, 0x78, 0x7b, 0x7e, 0x82, 0x87, 0x8e, 0x97, 0xa0, + 0xa8, 0xae, 0xb2, 0xb2, 0xaf, 0xa9, 0xa2, 0x98, 0x8f, 0x85, 0x7d, + 0x76, 0x71, 0x6e, 0x6c, 0x6b, 0x6b, 0x6e, 0x71, 0x76, 0x7b, 0x80, + 0x82, 0x81, 0x7d, 0x76, 0x6d, 0x67, 0x63, 0x62, 0x63, 0x64, 0x65, + 0x67, 0x69, 0x6d, 0x70, 0x74, 0x78, 0x7c, 0x7f, 0x83, 0x88, 0x8e, + 0x95, 0x9d, 0xa5, 0xac, 0xb0, 0xb1, 0xb0, 0xab, 0xa3, 0x9a, 0x91, + 0x87, 0x7e, 0x76, 0x71, 0x6c, 0x6a, 0x69, 0x6a, 0x6d, 0x71, 0x77, + 0x7c, 0x81, 0x84, 0x84, 0x80, 0x79, 0x70, 0x68, 0x63, 0x61, 0x62, + 0x64, 0x66, 0x68, 0x6a, 0x6d, 0x70, 0x74, 0x78, 0x7c, 0x80, 0x84, + 0x88, 0x8e, 0x94, 0x9b, 0xa3, 0xa9, 0xae, 0xb0, 0xaf, 0xab, 0xa4, + 0x9c, 0x92, 0x88, 0x7f, 0x76, 0x70, 0x6b, 0x68, 0x68, 0x69, 0x6c, + 0x71, 0x77, 0x7e, 0x84, 0x87, 0x87, 0x83, 0x7c, 0x71, 0x68, 0x61, + 0x5f, 0x60, 0x63, 0x65, 0x66, 0x68, 0x6b, 0x6f, 0x73, 0x78, 0x7d, + 0x82, 0x86, 0x8b, 0x8f, 0x95, 0x9b, 0xa1, 0xa7, 0xac, 0xaf, 0xaf, + 0xac, 0xa6, 0x9e, 0x95, 0x8a, 0x80, 0x77, 0x70, 0x6b, 0x67, 0x66, + 0x67, 0x6b, 0x70, 0x76, 0x7d, 0x83, 0x88, 0x89, 0x86, 0x7f, 0x76, + 0x6b, 0x63, 0x5d, 0x5d, 0x60, 0x63, 0x66, 0x69, 0x6b, 0x6e, 0x72, + 0x77, 0x7c, 0x81, 0x86, 0x8a, 0x8e, 0x93, 0x98, 0x9e, 0xa3, 0xa8, + 0xac, 0xad, 0xac, 0xa8, 0xa2, 0x99, 0x90, 0x85, 0x7c, 0x73, 0x6d, + 0x69, 0x67, 0x67, 0x6a, 0x6e, 0x74, 0x7a, 0x81, 0x87, 0x8a, 0x89, + 0x85, 0x7c, 0x72, 0x67, 0x5f, 0x5a, 0x5b, 0x5e, 0x63, 0x68, 0x6c, + 0x70, 0x73, 0x77, 0x7a, 0x7e, 0x82, 0x86, 0x8b, 0x8f, 0x94, 0x9a, + 0x9f, 0xa4, 0xa7, 0xaa, 0xab, 0xa9, 0xa5, 0x9f, 0x97, 0x8e, 0x84, + 0x7b, 0x73, 0x6d, 0x69, 0x67, 0x68, 0x6b, 0x6f, 0x75, 0x7c, 0x82, + 0x87, 0x89, 0x88, 0x83, 0x7b, 0x71, 0x67, 0x60, 0x5c, 0x5c, 0x5f, + 0x63, 0x68, 0x6c, 0x70, 0x73, 0x77, 0x7c, 0x81, 0x86, 0x8a, 0x8d, + 0x91, 0x94, 0x98, 0x9c, 0xa0, 0xa3, 0xa6, 0xa7, 0xa6, 0xa2, 0x9d, + 0x95, 0x8c, 0x84, 0x7c, 0x74, 0x6e, 0x6b, 0x6a, 0x6b, 0x6e, 0x72, + 0x77, 0x7d, 0x83, 0x87, 0x88, 0x85, 0x7f, 0x77, 0x6e, 0x66, 0x60, + 0x5e, 0x60, 0x64, 0x68, 0x6c, 0x70, 0x72, 0x75, 0x78, 0x7c, 0x80, + 0x85, 0x89, 0x8d, 0x90, 0x93, 0x98, 0x9c, 0x9f, 0xa3, 0xa5, 0xa6, + 0xa5, 0xa1, 0x9b, 0x94, 0x8c, 0x83, 0x7a, 0x73, 0x6e, 0x6b, 0x6a, + 0x6c, 0x6f, 0x73, 0x78, 0x7d, 0x82, 0x85, 0x86, 0x84, 0x7e, 0x77, + 0x6f, 0x68, 0x63, 0x61, 0x62, 0x65, 0x69, 0x6c, 0x70, 0x73, 0x76, + 0x7a, 0x7e, 0x83, 0x86, 0x8a, 0x8d, 0x90, 0x94, 0x97, 0x9b, 0x9e, + 0xa1, 0xa3, 0xa3, 0xa1, 0x9d, 0x98, 0x91, 0x89, 0x81, 0x7a, 0x74, + 0x6f, 0x6d, 0x6c, 0x6d, 0x70, 0x74, 0x78, 0x7d, 0x81, 0x83, 0x84, + 0x82, 0x7f, 0x79, 0x72, 0x6b, 0x66, 0x63, 0x63, 0x66, 0x6a, 0x6e, + 0x72, 0x76, 0x79, 0x7c, 0x7e, 0x81, 0x84, 0x88, 0x8b, 0x8f, 0x92, + 0x96, 0x99, 0x9d, 0xa0, 0xa2, 0xa2, 0xa0, 0x9c, 0x97, 0x90, 0x89, + 0x82, 0x7b, 0x75, 0x71, 0x6f, 0x6e, 0x6f, 0x71, 0x74, 0x78, 0x7b, + 0x7f, 0x82, 0x83, 0x83, 0x80, 0x7c, 0x75, 0x6f, 0x69, 0x65, 0x64, + 0x65, 0x68, 0x6d, 0x71, 0x75, 0x79, 0x7c, 0x7e, 0x80, 0x83, 0x86, + 0x8a, 0x8e, 0x92, 0x96, 0x9a, 0x9d, 0xa0, 0xa1, 0xa0, 0x9e, 0x99, + 0x94, 0x8e, 0x87, 0x81, 0x7b, 0x76, 0x73, 0x71, 0x70, 0x71, 0x72, + 0x74, 0x77, 0x7a, 0x7d, 0x7f, 0x81, 0x82, 0x81, 0x7e, 0x79, 0x74, + 0x6e, 0x6a, 0x67, 0x67, 0x69, 0x6d, 0x71, 0x75, 0x78, 0x7b, 0x7d, + 0x7f, 0x81, 0x84, 0x88, 0x8c, 0x90, 0x95, 0x9a, 0x9d, 0xa0, 0xa0, + 0x9f, 0x9c, 0x98, 0x92, 0x8c, 0x86, 0x80, 0x7b, 0x77, 0x74, 0x73, + 0x72, 0x73, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80, 0x80, 0x80, + 0x7e, 0x7b, 0x76, 0x72, 0x6d, 0x6a, 0x6a, 0x6b, 0x6e, 0x71, 0x75, + 0x78, 0x7b, 0x7d, 0x7f, 0x81, 0x84, 0x87, 0x8b, 0x8f, 0x94, 0x98, + 0x9c, 0x9e, 0x9f, 0x9e, 0x9a, 0x96, 0x90, 0x8a, 0x84, 0x7e, 0x7a, + 0x76, 0x75, 0x74, 0x74, 0x75, 0x76, 0x77, 0x79, 0x7a, 0x7c, 0x7d, + 0x7e, 0x7f, 0x7e, 0x7d, 0x7b, 0x77, 0x74, 0x70, 0x6e, 0x6d, 0x6e, + 0x70, 0x73, 0x76, 0x79, 0x7b, 0x7d, 0x7f, 0x80, 0x82, 0x85, 0x89, + 0x8e, 0x94, 0x98, 0x9d, 0x9f, 0x9f, 0x9d, 0x98, 0x93, 0x8c, 0x86, + 0x80, 0x7b, 0x78, 0x76, 0x75, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, + 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7b, 0x7a, 0x78, 0x76, 0x73, 0x71, + 0x70, 0x70, 0x71, 0x73, 0x76, 0x79, 0x7c, 0x7e, 0x80, 0x82, 0x84, + 0x86, 0x89, 0x8c, 0x90, 0x94, 0x98, 0x9a, 0x9b, 0x9a, 0x97, 0x93, + 0x8d, 0x87, 0x82, 0x7d, 0x79, 0x77, 0x76, 0x76, 0x77, 0x78, 0x7a, + 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7b, 0x7a, 0x79, 0x77, 0x76, 0x74, + 0x73, 0x72, 0x72, 0x72, 0x74, 0x76, 0x78, 0x7b, 0x7d, 0x7f, 0x81, + 0x83, 0x85, 0x88, 0x8b, 0x8f, 0x92, 0x95, 0x97, 0x98, 0x98, 0x95, + 0x92, 0x8d, 0x88, 0x83, 0x7f, 0x7b, 0x79, 0x78, 0x77, 0x78, 0x79, + 0x7a, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7b, 0x7a, 0x78, 0x76, 0x75, + 0x73, 0x72, 0x72, 0x72, 0x73, 0x75, 0x77, 0x79, 0x7b, 0x7d, 0x7f, + 0x81, 0x84, 0x87, 0x8a, 0x8d, 0x90, 0x94, 0x96, 0x97, 0x97, 0x96, + 0x93, 0x90, 0x8b, 0x87, 0x82, 0x7f, 0x7c, 0x7a, 0x79, 0x79, 0x79, + 0x7a, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7b, 0x7a, 0x78, 0x77, 0x75, + 0x73, 0x72, 0x72, 0x72, 0x73, 0x74, 0x75, 0x77, 0x79, 0x7b, 0x7d, + 0x80, 0x83, 0x86, 0x8a, 0x8d, 0x91, 0x94, 0x97, 0x98, 0x98, 0x97, + 0x94, 0x91, 0x8c, 0x88, 0x84, 0x80, 0x7d, 0x7b, 0x7a, 0x79, 0x7a, + 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7b, 0x7a, 0x78, 0x77, 0x75, + 0x73, 0x72, 0x71, 0x71, 0x72, 0x72, 0x74, 0x75, 0x77, 0x79, 0x7c, + 0x7f, 0x82, 0x86, 0x8a, 0x8f, 0x93, 0x96, 0x99, 0x9a, 0x9a, 0x99, + 0x96, 0x93, 0x8e, 0x89, 0x84, 0x81, 0x7d, 0x7b, 0x7a, 0x79, 0x79, + 0x7a, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7b, 0x7a, 0x78, 0x76, 0x74, + 0x72, 0x70, 0x70, 0x70, 0x70, 0x71, 0x72, 0x74, 0x75, 0x78, 0x7a, + 0x7d, 0x81, 0x85, 0x8b, 0x90, 0x95, 0x9a, 0x9d, 0x9f, 0x9f, 0x9d, + 0x99, 0x95, 0x8f, 0x89, 0x84, 0x7f, 0x7c, 0x79, 0x78, 0x78, 0x79, + 0x7a, 0x7b, 0x7c, 0x7c, 0x7d, 0x7c, 0x7b, 0x79, 0x77, 0x74, 0x72, + 0x6f, 0x6e, 0x6d, 0x6d, 0x6e, 0x6f, 0x71, 0x72, 0x74, 0x76, 0x78, + 0x7a, 0x7e, 0x82, 0x88, 0x8e, 0x95, 0x9b, 0xa0, 0xa3, 0xa3, 0xa2, + 0x9e, 0x9a, 0x94, 0x8d, 0x87, 0x81, 0x7c, 0x79, 0x77, 0x77, 0x78, + 0x79, 0x7a, 0x7c, 0x7d, 0x7e, 0x7d, 0x7c, 0x7b, 0x78, 0x75, 0x72, + 0x6f, 0x6c, 0x6b, 0x6b, 0x6c, 0x6d, 0x6f, 0x71, 0x73, 0x74, 0x75, + 0x77, 0x7a, 0x7f, 0x85, 0x8c, 0x94, 0x9c, 0xa2, 0xa7, 0xa9, 0xa7, + 0xa3, 0x9d, 0x97, 0x8f, 0x87, 0x81, 0x7c, 0x78, 0x76, 0x76, 0x77, + 0x78, 0x7a, 0x7c, 0x7e, 0x7f, 0x7f, 0x7e, 0x7c, 0x79, 0x75, 0x70, + 0x6c, 0x69, 0x67, 0x67, 0x68, 0x6b, 0x6e, 0x70, 0x71, 0x73, 0x74, + 0x76, 0x7a, 0x80, 0x88, 0x90, 0x9a, 0xa2, 0xa9, 0xad, 0xad, 0xaa, + 0xa4, 0x9c, 0x94, 0x8b, 0x83, 0x7c, 0x78, 0x75, 0x74, 0x75, 0x77, + 0x79, 0x7c, 0x7f, 0x80, 0x81, 0x80, 0x7e, 0x7a, 0x75, 0x6f, 0x6a, + 0x66, 0x63, 0x63, 0x65, 0x69, 0x6d, 0x71, 0x73, 0x74, 0x75, 0x76, + 0x78, 0x7d, 0x84, 0x8e, 0x99, 0xa3, 0xab, 0xb1, 0xb3, 0xb0, 0xaa, + 0xa1, 0x97, 0x8d, 0x84, 0x7c, 0x77, 0x74, 0x73, 0x74, 0x76, 0x79, + 0x7d, 0x80, 0x82, 0x83, 0x82, 0x7f, 0x7b, 0x75, 0x6e, 0x67, 0x62, + 0x5f, 0x5f, 0x62, 0x68, 0x6d, 0x71, 0x73, 0x74, 0x73, 0x74, 0x77, + 0x7c, 0x84, 0x8f, 0x9b, 0xa6, 0xaf, 0xb5, 0xb6, 0xb2, 0xab, 0xa1, + 0x96, 0x8b, 0x81, 0x7a, 0x75, 0x72, 0x72, 0x74, 0x77, 0x7b, 0x7f, + 0x83, 0x85, 0x86, 0x85, 0x81, 0x7b, 0x72, 0x68, 0x5f, 0x59, 0x56, + 0x58, 0x5e, 0x66, 0x6e, 0x72, 0x74, 0x73, 0x73, 0x74, 0x78, 0x80, + 0x8b, 0x98, 0xa5, 0xb1, 0xb8, 0xbc, 0xba, 0xb3, 0xa8, 0x9b, 0x8f, + 0x83, 0x7a, 0x74, 0x71, 0x70, 0x71, 0x74, 0x78, 0x7c, 0x81, 0x85, + 0x89, 0x8b, 0x88, 0x83, 0x79, 0x6d, 0x60, 0x56, 0x50, 0x4f, 0x55, + 0x5e, 0x69, 0x71, 0x74, 0x76, 0x75, 0x75, 0x76, 0x7c, 0x85, 0x93, + 0xa2, 0xb0, 0xba, 0xc0, 0xc0, 0xb9, 0xaf, 0xa1, 0x94, 0x86, 0x7c, + 0x75, 0x72, 0x70, 0x70, 0x72, 0x76, 0x7b, 0x80, 0x86, 0x8a, 0x8d, + 0x8b, 0x86, 0x7c, 0x6e, 0x60, 0x53, 0x4b, 0x4a, 0x50, 0x5b, 0x66, + 0x6f, 0x73, 0x76, 0x75, 0x75, 0x77, 0x7d, 0x86, 0x94, 0xa4, 0xb2, + 0xbd, 0xc2, 0xc2, 0xba, 0xaf, 0xa1, 0x93, 0x85, 0x7b, 0x74, 0x70, + 0x6f, 0x6f, 0x72, 0x75, 0x7a, 0x80, 0x87, 0x8c, 0x8f, 0x8e, 0x86, + 0x7a, 0x6a, 0x5b, 0x4d, 0x46, 0x46, 0x4f, 0x5b, 0x67, 0x70, 0x75, + 0x77, 0x76, 0x77, 0x7a, 0x82, 0x8d, 0x9c, 0xab, 0xb9, 0xc1, 0xc4, + 0xc1, 0xb7, 0xab, 0x9a, 0x8c, 0x7e, 0x76, 0x70, 0x6e, 0x6e, 0x6f, + 0x72, 0x76, 0x7c, 0x82, 0x8a, 0x8f, 0x91, 0x8e, 0x85, 0x75, 0x63, + 0x52, 0x47, 0x44, 0x4a, 0x54, 0x5e, 0x67, 0x6d, 0x72, 0x73, 0x75, + 0x79, 0x81, 0x8b, 0x9a, 0xa9, 0xb7, 0xc1, 0xc5, 0xc3, 0xba, 0xad, + 0x9d, 0x8e, 0x80, 0x76, 0x70, 0x6d, 0x6d, 0x6e, 0x70, 0x74, 0x79, + 0x82, 0x8b, 0x93, 0x97, 0x95, 0x8b, 0x7b, 0x67, 0x54, 0x47, 0x41, + 0x45, 0x4e, 0x59, 0x63, 0x6a, 0x6d, 0x6f, 0x72, 0x77, 0x80, 0x8d, + 0x9c, 0xac, 0xbb, 0xc4, 0xc7, 0xc3, 0xb8, 0xaa, 0x99, 0x89, 0x7d, + 0x74, 0x70, 0x6d, 0x6d, 0x6f, 0x72, 0x77, 0x7e, 0x87, 0x8f, 0x95, + 0x96, 0x91, 0x84, 0x72, 0x5e, 0x4c, 0x43, 0x43, 0x4a, 0x52, 0x5c, + 0x63, 0x69, 0x6c, 0x71, 0x77, 0x82, 0x90, 0x9f, 0xaf, 0xbb, 0xc4, + 0xc6, 0xc1, 0xb5, 0xa7, 0x96, 0x87, 0x7b, 0x74, 0x6f, 0x6e, 0x6e, + 0x70, 0x74, 0x79, 0x80, 0x88, 0x90, 0x94, 0x93, 0x8c, 0x7e, 0x6b, + 0x59, 0x4b, 0x43, 0x43, 0x49, 0x51, 0x5a, 0x61, 0x68, 0x70, 0x7a, + 0x86, 0x95, 0xa4, 0xb3, 0xbf, 0xc6, 0xc7, 0xc1, 0xb5, 0xa5, 0x93, + 0x83, 0x77, 0x6f, 0x6b, 0x6b, 0x6d, 0x70, 0x75, 0x7b, 0x82, 0x88, + 0x8e, 0x91, 0x90, 0x89, 0x7c, 0x6c, 0x5b, 0x4e, 0x46, 0x45, 0x4a, + 0x51, 0x59, 0x62, 0x6b, 0x76, 0x84, 0x93, 0xa2, 0xb0, 0xba, 0xc1, + 0xc2, 0xbd, 0xb3, 0xa5, 0x96, 0x87, 0x7a, 0x71, 0x6c, 0x6b, 0x6d, + 0x71, 0x75, 0x7b, 0x82, 0x87, 0x8c, 0x8d, 0x8b, 0x82, 0x77, 0x68, + 0x5a, 0x4f, 0x4a, 0x4a, 0x4d, 0x54, 0x5c, 0x67, 0x74, 0x83, 0x92, + 0xa2, 0xb0, 0xbb, 0xc0, 0xc0, 0xba, 0xb0, 0xa2, 0x93, 0x85, 0x79, + 0x70, 0x6b, 0x69, 0x6a, 0x6e, 0x73, 0x7a, 0x80, 0x86, 0x8a, 0x8b, + 0x89, 0x83, 0x78, 0x6b, 0x5e, 0x52, 0x4d, 0x4b, 0x4f, 0x56, 0x61, + 0x6d, 0x7d, 0x8e, 0x9f, 0xaf, 0xb9, 0xbf, 0xbe, 0xb9, 0xae, 0xa2, + 0x93, 0x86, 0x7a, 0x71, 0x6a, 0x67, 0x67, 0x69, 0x6e, 0x75, 0x7e, + 0x85, 0x8b, 0x8d, 0x8b, 0x84, 0x7a, 0x6d, 0x60, 0x54, 0x4d, 0x4a, + 0x4d, 0x57, 0x64, 0x76, 0x88, 0x9a, 0xa9, 0xb6, 0xbc, 0xbd, 0xb9, + 0xb0, 0xa4, 0x96, 0x89, 0x7d, 0x73, 0x6b, 0x66, 0x64, 0x65, 0x69, + 0x70, 0x79, 0x82, 0x8a, 0x8f, 0x8e, 0x89, 0x81, 0x75, 0x68, 0x5b, + 0x51, 0x4c, 0x4b, 0x51, 0x5c, 0x6e, 0x80, 0x93, 0xa5, 0xb2, 0xbb, + 0xbd, 0xbb, 0xb2, 0xa8, 0x9a, 0x8d, 0x7f, 0x72, 0x69, 0x61, 0x5e, + 0x5e, 0x64, 0x6b, 0x76, 0x82, 0x8c, 0x93, 0x95, 0x94, 0x8c, 0x83, + 0x76, 0x6a, 0x5f, 0x56, 0x50, 0x4d, 0x4e, 0x54, 0x5f, 0x6f, 0x81, + 0x96, 0xa9, 0xb9, 0xc2, 0xc5, 0xc0, 0xb6, 0xa7, 0x96, 0x87, 0x79, + 0x6e, 0x65, 0x60, 0x5d, 0x5c, 0x5f, 0x65, 0x6e, 0x7b, 0x8a, 0x98, + 0xa2, 0xa8, 0xa6, 0x9d, 0x8f, 0x7d, 0x6c, 0x5d, 0x53, 0x4d, 0x4c, + 0x4c, 0x4e, 0x50, 0x54, 0x5c, 0x69, 0x7d, 0x93, 0xab, 0xbe, 0xcc, + 0xcf, 0xca, 0xbb, 0xa8, 0x93, 0x7f, 0x71, 0x67, 0x62, 0x60, 0x60, + 0x61, 0x63, 0x67, 0x6d, 0x76, 0x82, 0x8f, 0x9a, 0xa2, 0xa4, 0xa0, + 0x96, 0x88, 0x79, 0x6c, 0x63, 0x5f, 0x5f, 0x63, 0x69, 0x70, 0x78, + 0x80, 0x87, 0x8e, 0x92, 0x95, 0x93, 0x90, 0x87, 0x7e, 0x72, 0x67, + 0x5b, 0x53, 0x4f, 0x52, 0x5d, 0x6c, 0x80, 0x92, 0xa4, 0xaf, 0xb6, + 0xb6, 0xb1, 0xaa, 0xa0, 0x97, 0x8c, 0x83, 0x78, 0x6f, 0x65, 0x5e, + 0x5a, 0x59, 0x5e, 0x66, 0x73, 0x7f, 0x8c, 0x95, 0x9b, 0x9b, 0x98, + 0x91, 0x89, 0x81, 0x79, 0x73, 0x6e, 0x6c, 0x69, 0x68, 0x68, 0x69, + 0x6c, 0x71, 0x78, 0x80, 0x89, 0x90, 0x95, 0x96, 0x95, 0x91, 0x8b, + 0x85, 0x7f, 0x7b, 0x77, 0x75, 0x73, 0x73, 0x73, 0x73, 0x75, 0x77, + 0x7b, 0x80, 0x85, 0x8a, 0x8e, 0x90, 0x90, 0x8d, 0x89, 0x84, 0x7f, + 0x7b, 0x78, 0x76, 0x75, 0x75, 0x76, 0x77, 0x78, 0x7a, 0x7d, 0x7f, + 0x82, 0x85, 0x88, 0x89, 0x89, 0x88, 0x85, 0x81, 0x7d, 0x7a, 0x78, + 0x77, 0x77, 0x78, 0x79, 0x7a, 0x7c, 0x7d, 0x7e, 0x80, 0x82, 0x83, + 0x85, 0x85, 0x85, 0x85, 0x83, 0x81, 0x7e, 0x7c, 0x7a, 0x79, 0x79, + 0x7a, 0x7b, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x83, 0x83, + 0x83, 0x82, 0x84, 0x84, 0x87, 0x86, 0x84, 0x7e, 0x77, 0x6f, 0x68, + 0x65, 0x65, 0x6b, 0x73, 0x7e, 0x87, 0x8f, 0x92, 0x94, 0x92, 0x90, + 0x8e, 0x8b, 0x8a, 0x88, 0x85, 0x80, 0x7b, 0x73, 0x6e, 0x6a, 0x6a, + 0x6e, 0x74, 0x7c, 0x84, 0x8a, 0x8d, 0x8e, 0x8b, 0x88, 0x85, 0x82, + 0x80, 0x7d, 0x7c, 0x7a, 0x78, 0x75, 0x73, 0x72, 0x73, 0x76, 0x7a, + 0x80, 0x85, 0x89, 0x8a, 0x8a, 0x88, 0x85, 0x82, 0x7f, 0x7e, 0x7d, + 0x7d, 0x7c, 0x7c, 0x7b, 0x7a, 0x79, 0x79, 0x7a, 0x7d, 0x80, 0x83, + 0x85, 0x86, 0x86, 0x85, 0x83, 0x80, 0x7f, 0x7d, 0x7c, 0x7c, 0x7c, + 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7e, 0x80, 0x82, 0x83, 0x84, + 0x84, 0x83, 0x81, 0x7f, 0x7d, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x80, 0x81, 0x82, 0x82, 0x82, 0x81, + 0x80, 0x7e, 0x7d, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, + 0x7e, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + }, + { // 6 + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x81, 0x82, + 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7c, 0x7d, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7e, 0x7d, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x84, + 0x85, 0x84, 0x85, 0x82, 0x82, 0x7f, 0x7e, 0x7c, 0x7a, 0x79, 0x77, + 0x77, 0x75, 0x77, 0x76, 0x7a, 0x7a, 0x7f, 0x81, 0x84, 0x87, 0x89, + 0x8b, 0x8c, 0x8c, 0x8c, 0x8b, 0x88, 0x86, 0x81, 0x7e, 0x79, 0x76, + 0x71, 0x71, 0x6b, 0x6d, 0x6d, 0x6e, 0x74, 0x74, 0x7f, 0x80, 0x87, + 0x8c, 0x90, 0x95, 0x96, 0x97, 0x96, 0x95, 0x8f, 0x8a, 0x81, 0x7d, + 0x76, 0x70, 0x6b, 0x65, 0x64, 0x63, 0x64, 0x69, 0x6d, 0x73, 0x7d, + 0x83, 0x8c, 0x91, 0x98, 0x9c, 0x9e, 0x9e, 0x9d, 0x97, 0x90, 0x87, + 0x80, 0x79, 0x71, 0x6a, 0x62, 0x61, 0x5a, 0x61, 0x60, 0x6b, 0x6e, + 0x78, 0x82, 0x88, 0x92, 0x96, 0x9f, 0x9f, 0xa2, 0x9e, 0x9e, 0x96, + 0x8f, 0x84, 0x7e, 0x73, 0x6d, 0x65, 0x61, 0x5d, 0x5b, 0x61, 0x62, + 0x6d, 0x6e, 0x7e, 0x83, 0x8c, 0x92, 0x99, 0x9f, 0x9f, 0xa0, 0x9e, + 0x9c, 0x92, 0x8c, 0x81, 0x7b, 0x70, 0x6c, 0x64, 0x62, 0x5b, 0x60, + 0x62, 0x68, 0x6d, 0x73, 0x82, 0x83, 0x8f, 0x90, 0x9b, 0x9d, 0x9e, + 0x9e, 0x9c, 0x98, 0x91, 0x88, 0x81, 0x78, 0x70, 0x6a, 0x65, 0x62, + 0x5e, 0x65, 0x62, 0x6d, 0x6d, 0x79, 0x82, 0x84, 0x90, 0x90, 0x9b, + 0x9b, 0x9c, 0x9d, 0x9a, 0x96, 0x8f, 0x84, 0x7f, 0x74, 0x71, 0x6b, + 0x66, 0x63, 0x62, 0x64, 0x67, 0x6d, 0x6e, 0x7e, 0x7e, 0x88, 0x8d, + 0x94, 0x9b, 0x99, 0x9d, 0x9c, 0x99, 0x93, 0x8a, 0x82, 0x7f, 0x75, + 0x73, 0x6a, 0x66, 0x61, 0x66, 0x66, 0x68, 0x6d, 0x70, 0x7c, 0x7b, + 0x87, 0x8b, 0x94, 0x97, 0x97, 0x9c, 0x9e, 0x9a, 0x96, 0x8e, 0x89, + 0x82, 0x78, 0x74, 0x69, 0x65, 0x5f, 0x62, 0x61, 0x66, 0x67, 0x70, + 0x78, 0x7b, 0x87, 0x8c, 0x95, 0x98, 0x9a, 0x9f, 0x9f, 0x9d, 0x98, + 0x90, 0x8a, 0x80, 0x7a, 0x71, 0x69, 0x62, 0x60, 0x60, 0x60, 0x66, + 0x67, 0x71, 0x79, 0x7e, 0x88, 0x8e, 0x96, 0x98, 0x9d, 0xa0, 0x9e, + 0x9d, 0x95, 0x8f, 0x88, 0x80, 0x75, 0x70, 0x66, 0x62, 0x5f, 0x60, + 0x63, 0x65, 0x6b, 0x72, 0x7b, 0x80, 0x8a, 0x8d, 0x98, 0x99, 0x9c, + 0x9e, 0x9c, 0x9a, 0x93, 0x8e, 0x87, 0x7e, 0x76, 0x6f, 0x65, 0x62, + 0x60, 0x61, 0x64, 0x67, 0x6c, 0x75, 0x79, 0x80, 0x8b, 0x8f, 0x98, + 0x98, 0x9d, 0x9f, 0x9b, 0x9b, 0x93, 0x8d, 0x85, 0x7d, 0x75, 0x6e, + 0x65, 0x64, 0x60, 0x5f, 0x63, 0x68, 0x6e, 0x77, 0x7c, 0x83, 0x8b, + 0x8e, 0x97, 0x98, 0x9b, 0x9d, 0x9b, 0x9a, 0x92, 0x8c, 0x88, 0x7d, + 0x75, 0x6e, 0x66, 0x64, 0x61, 0x60, 0x63, 0x66, 0x6b, 0x75, 0x78, + 0x81, 0x8a, 0x8f, 0x97, 0x97, 0x9d, 0x9f, 0x9d, 0x9a, 0x93, 0x8d, + 0x87, 0x7c, 0x76, 0x6e, 0x66, 0x65, 0x5f, 0x61, 0x61, 0x67, 0x6c, + 0x74, 0x79, 0x83, 0x89, 0x8e, 0x96, 0x96, 0x9e, 0x9c, 0x9d, 0x99, + 0x94, 0x8d, 0x86, 0x7e, 0x76, 0x6d, 0x67, 0x64, 0x60, 0x62, 0x62, + 0x69, 0x6c, 0x75, 0x79, 0x80, 0x87, 0x8c, 0x94, 0x94, 0x9a, 0x9d, + 0x9a, 0x9a, 0x97, 0x90, 0x8a, 0x81, 0x7b, 0x74, 0x69, 0x69, 0x63, + 0x5e, 0x5d, 0x61, 0x63, 0x6c, 0x79, 0x81, 0x8e, 0x94, 0x9f, 0xa1, + 0xa4, 0xa8, 0xa1, 0x9c, 0x8e, 0x84, 0x7a, 0x70, 0x66, 0x62, 0x5d, + 0x4d, 0x57, 0x5f, 0x5b, 0x67, 0x82, 0x88, 0x8e, 0x9e, 0xa8, 0xa1, + 0xa1, 0xa7, 0xa2, 0x92, 0x93, 0x8d, 0x7c, 0x79, 0x76, 0x6f, 0x64, + 0x5e, 0x58, 0x4d, 0x5c, 0x61, 0x61, 0x80, 0x86, 0x93, 0x9b, 0xa6, + 0xa4, 0xa0, 0xa3, 0xa2, 0x96, 0x92, 0x8f, 0x82, 0x7a, 0x77, 0x70, + 0x68, 0x5f, 0x58, 0x4f, 0x51, 0x68, 0x59, 0x7f, 0x84, 0x91, 0x9d, + 0xa1, 0xa9, 0x9d, 0xa1, 0x9b, 0x95, 0x8a, 0x8b, 0x83, 0x7b, 0x77, + 0x74, 0x69, 0x65, 0x59, 0x51, 0x51, 0x67, 0x59, 0x78, 0x89, 0x88, + 0x9f, 0x9f, 0xa8, 0x9b, 0xa3, 0x9b, 0x97, 0x91, 0x8c, 0x87, 0x7c, + 0x79, 0x73, 0x69, 0x67, 0x5b, 0x53, 0x4d, 0x63, 0x58, 0x6e, 0x8c, + 0x82, 0xa1, 0x9f, 0xa7, 0x9e, 0x9f, 0x9a, 0x94, 0x94, 0x88, 0x8a, + 0x7f, 0x7b, 0x75, 0x6b, 0x6b, 0x5b, 0x58, 0x4a, 0x62, 0x5b, 0x65, + 0x8d, 0x81, 0x9c, 0x9e, 0xa5, 0x9f, 0x9f, 0x9c, 0x94, 0x94, 0x8d, + 0x87, 0x83, 0x7b, 0x7a, 0x6e, 0x6e, 0x66, 0x59, 0x52, 0x54, 0x66, + 0x51, 0x82, 0x83, 0x89, 0xa4, 0xa0, 0xa5, 0x9f, 0xa5, 0x94, 0x94, + 0x93, 0x86, 0x86, 0x7e, 0x79, 0x75, 0x6c, 0x6c, 0x5c, 0x59, 0x4c, + 0x63, 0x5a, 0x65, 0x8d, 0x7c, 0x9a, 0xa0, 0x9f, 0x9f, 0xa2, 0x9d, + 0x90, 0x97, 0x8d, 0x84, 0x86, 0x79, 0x77, 0x6f, 0x6d, 0x65, 0x58, + 0x55, 0x4e, 0x68, 0x54, 0x7b, 0x8b, 0x82, 0xa3, 0x9d, 0xa2, 0x9d, + 0xa1, 0x98, 0x92, 0x92, 0x8b, 0x84, 0x84, 0x79, 0x7c, 0x6e, 0x6d, + 0x66, 0x56, 0x55, 0x4f, 0x67, 0x52, 0x7c, 0x83, 0x81, 0xa2, 0x9a, + 0xa3, 0xa0, 0xa2, 0x99, 0x99, 0x93, 0x8d, 0x88, 0x83, 0x7a, 0x7a, + 0x6e, 0x6a, 0x64, 0x56, 0x53, 0x54, 0x63, 0x56, 0x7d, 0x84, 0x84, + 0xa0, 0x9e, 0xa4, 0x9f, 0xa2, 0x9a, 0x96, 0x93, 0x8b, 0x89, 0x83, + 0x7b, 0x79, 0x6f, 0x68, 0x64, 0x59, 0x50, 0x52, 0x62, 0x59, 0x76, + 0x89, 0x86, 0x9e, 0x9e, 0xa2, 0xa2, 0xa0, 0x9a, 0x97, 0x92, 0x8e, + 0x8a, 0x83, 0x7f, 0x76, 0x76, 0x6d, 0x66, 0x5c, 0x5a, 0x4d, 0x5d, + 0x5e, 0x62, 0x89, 0x81, 0x95, 0x9f, 0x9f, 0xa0, 0xa1, 0x9b, 0x97, + 0x96, 0x8f, 0x8c, 0x84, 0x84, 0x78, 0x76, 0x74, 0x6b, 0x63, 0x5a, + 0x54, 0x4d, 0x66, 0x57, 0x74, 0x8a, 0x85, 0xa1, 0x9d, 0xa5, 0x9e, + 0xa1, 0x98, 0x98, 0x93, 0x8d, 0x88, 0x81, 0x81, 0x75, 0x76, 0x6e, + 0x6d, 0x5d, 0x5a, 0x4f, 0x50, 0x66, 0x55, 0x81, 0x86, 0x8b, 0xa3, + 0x9d, 0xa4, 0x9e, 0x9f, 0x9a, 0x98, 0x91, 0x8e, 0x86, 0x83, 0x7d, + 0x78, 0x77, 0x6e, 0x6c, 0x63, 0x5a, 0x53, 0x4d, 0x66, 0x5a, 0x79, + 0x8b, 0x85, 0xa0, 0x9d, 0x9f, 0x9e, 0xa0, 0x97, 0x98, 0x91, 0x90, + 0x88, 0x82, 0x83, 0x77, 0x78, 0x70, 0x6e, 0x65, 0x5c, 0x55, 0x49, + 0x64, 0x59, 0x6f, 0x8b, 0x84, 0x9e, 0x9b, 0xa3, 0xa0, 0x9e, 0x99, + 0x99, 0x95, 0x8b, 0x8f, 0x82, 0x81, 0x7b, 0x77, 0x73, 0x6e, 0x6e, + 0x60, 0x5e, 0x51, 0x4f, 0x67, 0x56, 0x7a, 0x8a, 0x89, 0xa2, 0xa1, + 0xa3, 0x9c, 0xa0, 0x96, 0x96, 0x91, 0x8e, 0x8a, 0x83, 0x82, 0x79, + 0x78, 0x6e, 0x6e, 0x68, 0x5f, 0x5d, 0x4c, 0x60, 0x5e, 0x61, 0x88, + 0x80, 0x96, 0x9f, 0xa0, 0xa1, 0x9f, 0x9e, 0x92, 0x96, 0x8c, 0x8b, + 0x85, 0x84, 0x81, 0x7a, 0x7a, 0x71, 0x6f, 0x67, 0x5f, 0x58, 0x4d, + 0x60, 0x5e, 0x5e, 0x89, 0x85, 0x93, 0xa4, 0xa0, 0xa2, 0x9f, 0x9e, + 0x94, 0x96, 0x8f, 0x89, 0x86, 0x80, 0x7f, 0x7b, 0x77, 0x75, 0x72, + 0x6c, 0x5f, 0x5e, 0x4c, 0x5b, 0x64, 0x57, 0x82, 0x86, 0x8c, 0xa0, + 0xa3, 0xa0, 0xa0, 0xa3, 0x91, 0x97, 0x90, 0x89, 0x8a, 0x81, 0x81, + 0x7d, 0x79, 0x72, 0x72, 0x6e, 0x64, 0x5c, 0x53, 0x51, 0x63, 0x58, + 0x73, 0x8c, 0x87, 0x9f, 0x9e, 0xa5, 0x9c, 0xa0, 0x97, 0x93, 0x95, + 0x8b, 0x8e, 0x84, 0x86, 0x7e, 0x7d, 0x75, 0x73, 0x72, 0x68, 0x64, + 0x59, 0x4e, 0x54, 0x62, 0x5b, 0x80, 0x8d, 0x8d, 0xa5, 0xa0, 0xa5, + 0x9e, 0x9e, 0x96, 0x92, 0x91, 0x89, 0x8a, 0x7f, 0x83, 0x7b, 0x78, + 0x76, 0x76, 0x72, 0x6a, 0x64, 0x58, 0x4b, 0x59, 0x60, 0x5e, 0x87, + 0x8a, 0x96, 0xa5, 0xa5, 0xa1, 0x9a, 0x9d, 0x91, 0x93, 0x8d, 0x88, + 0x85, 0x7e, 0x82, 0x78, 0x7d, 0x75, 0x78, 0x74, 0x6d, 0x66, 0x58, + 0x4d, 0x57, 0x63, 0x5c, 0x82, 0x8d, 0x92, 0xa6, 0xa7, 0xa3, 0x9c, + 0x9a, 0x92, 0x8d, 0x8a, 0x83, 0x8a, 0x7e, 0x82, 0x80, 0x7d, 0x7a, + 0x78, 0x79, 0x6f, 0x6b, 0x5c, 0x52, 0x4b, 0x68, 0x58, 0x70, 0x93, + 0x8b, 0xa2, 0xa2, 0xa6, 0x9a, 0x96, 0x96, 0x88, 0x8e, 0x86, 0x85, + 0x83, 0x81, 0x85, 0x7d, 0x80, 0x79, 0x7d, 0x72, 0x72, 0x64, 0x5b, + 0x4a, 0x51, 0x64, 0x54, 0x85, 0x92, 0x9c, 0xa7, 0xa8, 0xa8, 0x98, + 0x95, 0x8a, 0x88, 0x85, 0x83, 0x85, 0x81, 0x84, 0x80, 0x81, 0x7e, + 0x7c, 0x81, 0x74, 0x73, 0x60, 0x58, 0x45, 0x51, 0x64, 0x5c, 0x89, + 0x92, 0x9b, 0xa4, 0xa7, 0xa8, 0x94, 0x93, 0x86, 0x88, 0x81, 0x84, + 0x87, 0x84, 0x88, 0x82, 0x83, 0x7d, 0x7e, 0x80, 0x77, 0x72, 0x68, + 0x59, 0x4c, 0x45, 0x5c, 0x5b, 0x7c, 0x97, 0x9f, 0xaa, 0xa5, 0xa8, + 0x95, 0x90, 0x87, 0x7f, 0x83, 0x80, 0x81, 0x82, 0x88, 0x8a, 0x8a, + 0x89, 0x83, 0x81, 0x79, 0x76, 0x6b, 0x5c, 0x54, 0x42, 0x4b, 0x66, + 0x66, 0x8c, 0x9e, 0xa7, 0xa9, 0xa2, 0xa4, 0x8c, 0x8a, 0x7c, 0x7f, + 0x7a, 0x7f, 0x85, 0x85, 0x8b, 0x8b, 0x92, 0x8c, 0x85, 0x84, 0x78, + 0x72, 0x6b, 0x65, 0x56, 0x4d, 0x46, 0x58, 0x71, 0x78, 0x9d, 0xa4, + 0xab, 0xa6, 0x9d, 0x8f, 0x82, 0x82, 0x7b, 0x7d, 0x84, 0x83, 0x89, + 0x8e, 0x90, 0x95, 0x89, 0x85, 0x7d, 0x79, 0x71, 0x69, 0x64, 0x62, + 0x59, 0x50, 0x45, 0x61, 0x76, 0x81, 0x9f, 0xa5, 0xad, 0x99, 0x98, + 0x8e, 0x80, 0x7e, 0x7b, 0x81, 0x85, 0x8f, 0x8f, 0x96, 0x93, 0x90, + 0x8d, 0x83, 0x7c, 0x78, 0x71, 0x67, 0x66, 0x66, 0x5f, 0x59, 0x53, + 0x52, 0x6d, 0x7b, 0x92, 0x9c, 0xa4, 0xa5, 0x90, 0x91, 0x80, 0x80, + 0x7d, 0x80, 0x89, 0x8e, 0x94, 0x93, 0x98, 0x8e, 0x8c, 0x81, 0x78, + 0x74, 0x6e, 0x70, 0x6c, 0x6d, 0x6b, 0x6b, 0x62, 0x61, 0x50, 0x60, + 0x72, 0x80, 0x99, 0x9a, 0xa9, 0x9b, 0x95, 0x88, 0x84, 0x85, 0x7f, + 0x88, 0x8a, 0x93, 0x92, 0x94, 0x92, 0x89, 0x87, 0x79, 0x75, 0x70, + 0x6e, 0x70, 0x72, 0x71, 0x6e, 0x68, 0x61, 0x59, 0x4e, 0x62, 0x73, + 0x8e, 0x9a, 0xa3, 0xa8, 0x9b, 0x91, 0x84, 0x83, 0x80, 0x83, 0x88, + 0x89, 0x94, 0x93, 0x94, 0x90, 0x88, 0x82, 0x79, 0x76, 0x6f, 0x71, + 0x70, 0x75, 0x77, 0x71, 0x6d, 0x63, 0x60, 0x4f, 0x51, 0x62, 0x7d, + 0x9c, 0xa1, 0xa9, 0xa2, 0x9c, 0x89, 0x80, 0x7e, 0x80, 0x87, 0x87, + 0x91, 0x96, 0x97, 0x92, 0x8e, 0x86, 0x7e, 0x74, 0x73, 0x70, 0x71, + 0x74, 0x76, 0x7a, 0x75, 0x6b, 0x63, 0x5c, 0x50, 0x4f, 0x63, 0x87, + 0xa3, 0xa8, 0xa6, 0xa0, 0x96, 0x86, 0x76, 0x77, 0x80, 0x8d, 0x93, + 0x91, 0x97, 0x97, 0x92, 0x86, 0x7c, 0x77, 0x74, 0x73, 0x73, 0x73, + 0x78, 0x7d, 0x7a, 0x76, 0x69, 0x65, 0x5d, 0x55, 0x51, 0x60, 0x86, + 0xa3, 0xac, 0xa2, 0x9a, 0x92, 0x82, 0x74, 0x71, 0x85, 0x96, 0x9c, + 0x97, 0x8f, 0x96, 0x90, 0x86, 0x75, 0x73, 0x77, 0x7a, 0x7d, 0x75, + 0x7a, 0x7a, 0x7d, 0x70, 0x61, 0x5f, 0x59, 0x52, 0x4e, 0x68, 0x97, + 0xb6, 0xb5, 0x9c, 0x8d, 0x84, 0x7c, 0x6d, 0x6e, 0x8b, 0xa3, 0xa9, + 0x95, 0x8a, 0x89, 0x8a, 0x80, 0x71, 0x71, 0x7b, 0x80, 0x7c, 0x76, + 0x77, 0x7d, 0x7c, 0x72, 0x62, 0x60, 0x5a, 0x54, 0x4c, 0x65, 0x9b, + 0xbd, 0xb9, 0x96, 0x86, 0x80, 0x7c, 0x70, 0x6f, 0x87, 0xa6, 0xaf, + 0x9b, 0x86, 0x80, 0x87, 0x82, 0x76, 0x74, 0x7d, 0x87, 0x80, 0x75, + 0x71, 0x77, 0x7f, 0x77, 0x66, 0x5d, 0x5d, 0x5c, 0x54, 0x55, 0x7d, + 0xab, 0xc4, 0xac, 0x8a, 0x7b, 0x7a, 0x7a, 0x73, 0x7a, 0x91, 0xa9, + 0xa5, 0x92, 0x7e, 0x7d, 0x81, 0x7c, 0x74, 0x76, 0x80, 0x83, 0x7b, + 0x74, 0x77, 0x7f, 0x7d, 0x72, 0x60, 0x5a, 0x5c, 0x5c, 0x56, 0x60, + 0x8c, 0xb9, 0xc4, 0xa4, 0x82, 0x71, 0x78, 0x7d, 0x7d, 0x86, 0x95, + 0xa8, 0xa1, 0x8e, 0x7e, 0x76, 0x79, 0x74, 0x7a, 0x83, 0x8b, 0x85, + 0x76, 0x71, 0x78, 0x80, 0x7a, 0x71, 0x66, 0x63, 0x5f, 0x5a, 0x59, + 0x60, 0x85, 0xae, 0xc1, 0xab, 0x86, 0x70, 0x6f, 0x7a, 0x82, 0x8c, + 0x90, 0x99, 0x98, 0x94, 0x85, 0x7d, 0x76, 0x79, 0x7c, 0x85, 0x8a, + 0x88, 0x7f, 0x74, 0x75, 0x76, 0x79, 0x71, 0x6f, 0x66, 0x67, 0x62, + 0x62, 0x5e, 0x61, 0x81, 0xa7, 0xbd, 0xab, 0x87, 0x71, 0x6f, 0x7a, + 0x87, 0x8e, 0x93, 0x96, 0x96, 0x90, 0x89, 0x7f, 0x7e, 0x7c, 0x82, + 0x87, 0x87, 0x87, 0x7f, 0x7d, 0x77, 0x77, 0x73, 0x72, 0x6c, 0x6a, + 0x66, 0x6a, 0x65, 0x62, 0x57, 0x70, 0x9a, 0xbd, 0xbc, 0x93, 0x76, + 0x62, 0x77, 0x81, 0x95, 0x8d, 0x94, 0x91, 0x95, 0x8d, 0x82, 0x7c, + 0x7d, 0x88, 0x85, 0x85, 0x7b, 0x83, 0x80, 0x81, 0x78, 0x73, 0x6e, + 0x70, 0x71, 0x70, 0x69, 0x68, 0x62, 0x61, 0x55, 0x74, 0x97, 0xc1, + 0xbe, 0x98, 0x77, 0x61, 0x74, 0x80, 0x92, 0x8d, 0x94, 0x8f, 0x98, + 0x90, 0x88, 0x7b, 0x77, 0x7b, 0x88, 0x8b, 0x88, 0x7c, 0x75, 0x7a, + 0x7f, 0x83, 0x78, 0x71, 0x6e, 0x79, 0x75, 0x70, 0x65, 0x60, 0x5d, + 0x58, 0x6f, 0x9c, 0xc2, 0xc4, 0x9d, 0x76, 0x60, 0x6b, 0x7d, 0x92, + 0x90, 0x8f, 0x8e, 0x91, 0x93, 0x88, 0x7d, 0x75, 0x7a, 0x80, 0x88, + 0x81, 0x7d, 0x77, 0x7e, 0x87, 0x88, 0x7e, 0x72, 0x6b, 0x6e, 0x75, + 0x7c, 0x7a, 0x6f, 0x64, 0x5e, 0x60, 0x62, 0x82, 0xa2, 0xc3, 0xb9, + 0x98, 0x73, 0x5e, 0x68, 0x7c, 0x91, 0x91, 0x93, 0x8e, 0x95, 0x90, + 0x8b, 0x7b, 0x75, 0x73, 0x7f, 0x84, 0x85, 0x82, 0x7b, 0x7e, 0x7a, + 0x82, 0x7f, 0x7f, 0x77, 0x76, 0x6f, 0x76, 0x74, 0x76, 0x6c, 0x68, + 0x62, 0x61, 0x60, 0x75, 0x9d, 0xbd, 0xc3, 0xa1, 0x7a, 0x59, 0x5f, + 0x74, 0x96, 0x9b, 0x9e, 0x93, 0x92, 0x8e, 0x88, 0x7c, 0x6f, 0x69, + 0x72, 0x83, 0x8d, 0x90, 0x86, 0x81, 0x7b, 0x7f, 0x7b, 0x7a, 0x71, + 0x78, 0x82, 0x90, 0x8f, 0x81, 0x70, 0x6b, 0x72, 0x80, 0x85, 0x7c, + 0x73, 0x6c, 0x72, 0x72, 0x6f, 0x67, 0x63, 0x61, 0x63, 0x76, 0x96, + 0xb6, 0xbe, 0xa8, 0x85, 0x65, 0x60, 0x71, 0x8a, 0x9b, 0x9a, 0x99, + 0x92, 0x90, 0x87, 0x7d, 0x71, 0x6b, 0x71, 0x7f, 0x8c, 0x91, 0x8a, + 0x80, 0x77, 0x76, 0x78, 0x76, 0x77, 0x77, 0x7d, 0x83, 0x8d, 0x90, + 0x8c, 0x7d, 0x74, 0x70, 0x75, 0x7b, 0x80, 0x7e, 0x78, 0x74, 0x73, + 0x70, 0x6a, 0x68, 0x67, 0x69, 0x65, 0x6e, 0x7d, 0xa1, 0xb8, 0xbe, + 0x9f, 0x77, 0x5b, 0x5d, 0x78, 0x94, 0xa5, 0xa0, 0x97, 0x8c, 0x8c, + 0x86, 0x80, 0x70, 0x6d, 0x6f, 0x81, 0x90, 0x94, 0x8d, 0x7e, 0x77, + 0x75, 0x7c, 0x79, 0x78, 0x72, 0x76, 0x7e, 0x8b, 0x90, 0x8c, 0x7f, + 0x77, 0x74, 0x77, 0x79, 0x79, 0x77, 0x76, 0x79, 0x7a, 0x78, 0x6d, + 0x67, 0x62, 0x69, 0x6a, 0x68, 0x64, 0x77, 0x9c, 0xbe, 0xc6, 0xa7, + 0x7e, 0x5b, 0x5d, 0x75, 0x96, 0xa6, 0xa3, 0x95, 0x8a, 0x86, 0x87, + 0x84, 0x7b, 0x71, 0x6e, 0x77, 0x85, 0x92, 0x93, 0x8d, 0x7d, 0x74, + 0x6f, 0x74, 0x78, 0x7d, 0x7a, 0x79, 0x76, 0x77, 0x76, 0x72, 0x6d, + 0x68, 0x6b, 0x69, 0x69, 0x63, 0x79, 0x98, 0xbf, 0xc6, 0xb1, 0x84, + 0x60, 0x5a, 0x6f, 0x92, 0xa5, 0xa8, 0x99, 0x8b, 0x83, 0x85, 0x85, + 0x80, 0x75, 0x71, 0x75, 0x83, 0x8f, 0x93, 0x8a, 0x7d, 0x72, 0x6e, + 0x73, 0x7a, 0x7e, 0x7b, 0x76, 0x72, 0x72, 0x71, 0x73, 0x70, 0x71, + 0x6d, 0x6b, 0x63, 0x67, 0x80, 0xa4, 0xc4, 0xc1, 0xa6, 0x78, 0x5e, + 0x5e, 0x7a, 0x99, 0xa7, 0xa2, 0x91, 0x86, 0x82, 0x86, 0x85, 0x80, + 0x75, 0x72, 0x77, 0x85, 0x8f, 0x91, 0x86, 0x79, 0x70, 0x6f, 0x77, + 0x7e, 0x81, 0x7b, 0x76, 0x71, 0x71, 0x71, 0x74, 0x72, 0x73, 0x6e, + 0x69, 0x63, 0x6f, 0x8d, 0xb1, 0xc3, 0xb5, 0x95, 0x6d, 0x60, 0x66, + 0x86, 0x9c, 0xa7, 0x9b, 0x8d, 0x82, 0x81, 0x84, 0x83, 0x7e, 0x76, + 0x76, 0x7c, 0x89, 0x8d, 0x8a, 0x7c, 0x74, 0x6f, 0x75, 0x7a, 0x80, + 0x7c, 0x77, 0x71, 0x71, 0x70, 0x72, 0x72, 0x73, 0x72, 0x6d, 0x67, + 0x67, 0x7e, 0x9e, 0xc0, 0xc0, 0xac, 0x82, 0x68, 0x62, 0x77, 0x91, + 0xa2, 0xa0, 0x92, 0x86, 0x80, 0x85, 0x85, 0x83, 0x7a, 0x77, 0x77, + 0x82, 0x88, 0x8c, 0x85, 0x7c, 0x73, 0x72, 0x74, 0x79, 0x7b, 0x7b, + 0x78, 0x76, 0x74, 0x74, 0x74, 0x73, 0x72, 0x71, 0x72, 0x6d, 0x6c, + 0x71, 0x87, 0xa2, 0xba, 0xba, 0xa7, 0x86, 0x6f, 0x6b, 0x7a, 0x8f, + 0x9d, 0x9d, 0x92, 0x88, 0x82, 0x84, 0x84, 0x83, 0x7e, 0x7d, 0x7f, + 0x83, 0x84, 0x7f, 0x78, 0x71, 0x72, 0x77, 0x7f, 0x7f, 0x7b, 0x72, + 0x6d, 0x6d, 0x71, 0x75, 0x76, 0x77, 0x72, 0x6d, 0x68, 0x71, 0x88, + 0xa8, 0xbd, 0xb9, 0xa1, 0x80, 0x6d, 0x6c, 0x80, 0x94, 0xa0, 0x9a, + 0x8f, 0x84, 0x81, 0x84, 0x85, 0x84, 0x7f, 0x7e, 0x7f, 0x83, 0x82, + 0x7e, 0x76, 0x72, 0x73, 0x7a, 0x80, 0x81, 0x7b, 0x73, 0x6c, 0x6d, + 0x72, 0x77, 0x78, 0x76, 0x73, 0x6f, 0x6e, 0x70, 0x7f, 0x97, 0xb0, + 0xb8, 0xae, 0x94, 0x7c, 0x6f, 0x75, 0x86, 0x96, 0x9d, 0x98, 0x8d, + 0x83, 0x80, 0x81, 0x83, 0x81, 0x7f, 0x7d, 0x7f, 0x81, 0x81, 0x7d, + 0x77, 0x73, 0x74, 0x7a, 0x80, 0x80, 0x7a, 0x71, 0x6b, 0x6c, 0x72, + 0x79, 0x7c, 0x7a, 0x76, 0x6e, 0x6a, 0x6d, 0x7e, 0x97, 0xae, 0xb7, + 0xad, 0x96, 0x7d, 0x71, 0x76, 0x87, 0x97, 0x9d, 0x97, 0x8c, 0x82, + 0x7e, 0x80, 0x82, 0x82, 0x7d, 0x7a, 0x7c, 0x82, 0x87, 0x87, 0x80, + 0x76, 0x6f, 0x6f, 0x77, 0x7f, 0x83, 0x80, 0x76, 0x6d, 0x6a, 0x6e, + 0x75, 0x7b, 0x7b, 0x79, 0x73, 0x6f, 0x6d, 0x72, 0x80, 0x94, 0xa9, + 0xb1, 0xac, 0x99, 0x85, 0x77, 0x78, 0x83, 0x91, 0x98, 0x97, 0x8e, + 0x85, 0x80, 0x7f, 0x81, 0x81, 0x7f, 0x7b, 0x7b, 0x7d, 0x82, 0x84, + 0x84, 0x7e, 0x77, 0x71, 0x72, 0x77, 0x7d, 0x7f, 0x7d, 0x76, 0x70, + 0x6f, 0x70, 0x75, 0x77, 0x79, 0x77, 0x76, 0x72, 0x71, 0x72, 0x7d, + 0x8d, 0xa0, 0xac, 0xac, 0x9f, 0x8d, 0x7e, 0x78, 0x7e, 0x88, 0x93, + 0x95, 0x92, 0x88, 0x82, 0x7f, 0x80, 0x81, 0x81, 0x7e, 0x7b, 0x7a, + 0x7a, 0x7f, 0x83, 0x86, 0x83, 0x7d, 0x75, 0x72, 0x71, 0x77, 0x7c, + 0x7f, 0x7d, 0x79, 0x74, 0x71, 0x72, 0x76, 0x79, 0x79, 0x77, 0x75, + 0x74, 0x75, 0x78, 0x7b, 0x84, 0x8e, 0x9c, 0xa3, 0xa4, 0x99, 0x8c, + 0x7f, 0x7b, 0x7e, 0x88, 0x90, 0x92, 0x8f, 0x87, 0x82, 0x7d, 0x7e, + 0x7e, 0x81, 0x7f, 0x7e, 0x7a, 0x7a, 0x7b, 0x7f, 0x82, 0x83, 0x81, + 0x7c, 0x78, 0x74, 0x76, 0x78, 0x7d, 0x7f, 0x7f, 0x7d, 0x7a, 0x78, + 0x79, 0x7a, 0x7c, 0x7c, 0x7a, 0x77, 0x76, 0x77, 0x7a, 0x7d, 0x7e, + 0x7f, 0x7f, 0x7e, 0x7f, 0x83, 0x8b, 0x93, 0x9b, 0x9b, 0x97, 0x8d, + 0x84, 0x7f, 0x7f, 0x83, 0x88, 0x8a, 0x88, 0x85, 0x80, 0x7e, 0x7d, + 0x7e, 0x7d, 0x7d, 0x7c, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7b, 0x7b, 0x7b, 0x7b, 0x7a, 0x7a, 0x7a, 0x7b, 0x7c, 0x7c, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x83, + 0x83, 0x83, 0x84, 0x85, 0x88, 0x8c, 0x8f, 0x90, 0x8e, 0x89, 0x85, + 0x82, 0x80, 0x81, 0x83, 0x84, 0x83, 0x82, 0x7f, 0x7e, 0x7c, 0x7b, + 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x79, 0x78, 0x76, 0x75, 0x75, 0x76, + 0x78, 0x79, 0x7a, 0x79, 0x78, 0x79, 0x7e, 0x86, 0x90, 0x97, 0x99, + 0x93, 0x8a, 0x82, 0x7f, 0x81, 0x87, 0x8c, 0x8e, 0x8b, 0x85, 0x81, + 0x7f, 0x80, 0x82, 0x84, 0x81, 0x7e, 0x7a, 0x78, 0x79, 0x7c, 0x7f, + 0x80, 0x7e, 0x7a, 0x77, 0x76, 0x77, 0x7a, 0x7d, 0x7e, 0x7d, 0x7b, + 0x7a, 0x7a, 0x7c, 0x7e, 0x7f, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, 0x7e, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x80, + 0x81, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, + 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x81, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, 0x7b, 0x7b, 0x7c, + 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x80, 0x81, 0x81, 0x82, 0x82, 0x83, 0x82, 0x81, + 0x81, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x83, 0x83, + 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x82, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7e, + 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + }, + { // 7 + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x81, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x80, 0x7e, 0x82, 0x7d, + 0x85, 0x80, 0x7e, 0x82, 0x7f, 0x82, 0x80, 0x81, 0x82, 0x82, 0x7e, + 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x7c, 0x7f, 0x7f, 0x7d, 0x82, 0x7d, + 0x81, 0x7e, 0x80, 0x7e, 0x7e, 0x7e, 0x7d, 0x81, 0x7d, 0x84, 0x7d, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x7d, 0x82, 0x7d, 0x81, 0x7e, + 0x7f, 0x80, 0x7f, 0x80, 0x82, 0x81, 0x82, 0x81, 0x84, 0x7e, 0x7f, + 0x82, 0x7f, 0x80, 0x7f, 0x81, 0x7c, 0x81, 0x7d, 0x81, 0x7f, 0x7e, + 0x83, 0x81, 0x7e, 0x81, 0x7b, 0x80, 0x7f, 0x81, 0x83, 0x80, 0x7f, + 0x7c, 0x83, 0x7b, 0x82, 0x7d, 0x80, 0x7c, 0x81, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7f, 0x80, 0x82, 0x7d, 0x7f, 0x7f, 0x7d, 0x7c, 0x81, 0x7a, + 0x81, 0x7e, 0x81, 0x7e, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, + 0x7b, 0x82, 0x7f, 0x7f, 0x83, 0x7e, 0x7f, 0x7f, 0x81, 0x7f, 0x80, + 0x84, 0x80, 0x79, 0x82, 0x7c, 0x7d, 0x80, 0x83, 0x7a, 0x7e, 0x7f, + 0x7d, 0x81, 0x80, 0x7e, 0x7f, 0x7e, 0x7e, 0x82, 0x81, 0x81, 0x7f, + 0x81, 0x81, 0x80, 0x80, 0x84, 0x7c, 0x84, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x83, 0x83, 0x80, 0x81, 0x81, 0x7e, 0x80, 0x80, 0x79, 0x80, + 0x7c, 0x7f, 0x81, 0x81, 0x7b, 0x7d, 0x7f, 0x7d, 0x80, 0x82, 0x80, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7b, 0x82, 0x7f, 0x7b, 0x83, 0x7a, 0x7f, + 0x7f, 0x81, 0x7c, 0x83, 0x80, 0x80, 0x81, 0x85, 0x7f, 0x7d, 0x84, + 0x7f, 0x7f, 0x80, 0x86, 0x79, 0x85, 0x7d, 0x83, 0x7e, 0x82, 0x80, + 0x86, 0x81, 0x83, 0x81, 0x80, 0x7e, 0x82, 0x82, 0x7c, 0x84, 0x7e, + 0x83, 0x7f, 0x87, 0x7d, 0x83, 0x82, 0x83, 0x7f, 0x86, 0x7e, 0x82, + 0x7f, 0x84, 0x7e, 0x82, 0x80, 0x83, 0x84, 0x80, 0x84, 0x7e, 0x82, + 0x7e, 0x85, 0x7c, 0x85, 0x7b, 0x7f, 0x80, 0x80, 0x7d, 0x84, 0x7e, + 0x80, 0x7f, 0x80, 0x7e, 0x7c, 0x82, 0x7a, 0x82, 0x7a, 0x80, 0x7b, + 0x7d, 0x7d, 0x7a, 0x84, 0x79, 0x7f, 0x7f, 0x7c, 0x7b, 0x82, 0x82, + 0x7e, 0x85, 0x7d, 0x7f, 0x7f, 0x86, 0x7d, 0x86, 0x83, 0x7d, 0x7f, + 0x85, 0x7a, 0x82, 0x83, 0x78, 0x83, 0x7f, 0x7c, 0x7f, 0x80, 0x77, + 0x81, 0x7e, 0x7c, 0x7c, 0x7f, 0x75, 0x7f, 0x78, 0x7b, 0x7c, 0x79, + 0x7b, 0x77, 0x81, 0x79, 0x81, 0x82, 0x7c, 0x7e, 0x81, 0x79, 0x86, + 0x79, 0x82, 0x7b, 0x7b, 0x7c, 0x79, 0x84, 0x77, 0x85, 0x7e, 0x7e, + 0x83, 0x80, 0x81, 0x83, 0x80, 0x83, 0x80, 0x7f, 0x81, 0x7b, 0x82, + 0x7d, 0x81, 0x80, 0x7e, 0x82, 0x7a, 0x82, 0x7f, 0x80, 0x82, 0x7d, + 0x82, 0x7a, 0x7e, 0x82, 0x79, 0x85, 0x7b, 0x7b, 0x81, 0x76, 0x86, + 0x7a, 0x82, 0x7e, 0x7e, 0x7f, 0x7e, 0x84, 0x7e, 0x87, 0x7d, 0x85, + 0x7e, 0x81, 0x84, 0x7c, 0x82, 0x7f, 0x7b, 0x80, 0x7d, 0x7e, 0x7c, + 0x81, 0x7f, 0x7f, 0x84, 0x7b, 0x85, 0x78, 0x87, 0x7e, 0x82, 0x83, + 0x7b, 0x82, 0x79, 0x82, 0x7f, 0x80, 0x7f, 0x82, 0x7a, 0x83, 0x81, + 0x81, 0x86, 0x7e, 0x84, 0x7c, 0x82, 0x7e, 0x81, 0x7e, 0x7e, 0x81, + 0x79, 0x84, 0x7b, 0x7f, 0x7c, 0x80, 0x7f, 0x7f, 0x84, 0x79, 0x85, + 0x79, 0x80, 0x85, 0x79, 0x83, 0x7e, 0x78, 0x80, 0x82, 0x7d, 0x7e, + 0x84, 0x79, 0x7c, 0x83, 0x7c, 0x7c, 0x7e, 0x80, 0x75, 0x87, 0x7d, + 0x81, 0x7e, 0x84, 0x7b, 0x81, 0x84, 0x7a, 0x86, 0x79, 0x87, 0x7a, + 0x87, 0x7f, 0x80, 0x7e, 0x84, 0x7d, 0x83, 0x82, 0x7b, 0x84, 0x7a, + 0x83, 0x80, 0x80, 0x7d, 0x7f, 0x7a, 0x7e, 0x7d, 0x80, 0x7f, 0x82, + 0x80, 0x7f, 0x81, 0x7f, 0x7b, 0x81, 0x7d, 0x7f, 0x82, 0x7e, 0x81, + 0x7f, 0x82, 0x82, 0x81, 0x7f, 0x80, 0x78, 0x7c, 0x7d, 0x77, 0x81, + 0x7c, 0x7e, 0x7f, 0x81, 0x7f, 0x80, 0x85, 0x7e, 0x8a, 0x80, 0x87, + 0x83, 0x7a, 0x85, 0x7a, 0x80, 0x83, 0x7b, 0x7f, 0x7c, 0x80, 0x80, + 0x85, 0x84, 0x84, 0x84, 0x7f, 0x81, 0x7c, 0x7c, 0x7b, 0x80, 0x7c, + 0x7f, 0x88, 0x70, 0x88, 0x7b, 0x7b, 0x8a, 0x80, 0x81, 0x7e, 0x86, + 0x71, 0x8b, 0x7f, 0x7b, 0x85, 0x7d, 0x72, 0x86, 0x74, 0x7d, 0x7e, + 0x82, 0x7b, 0x83, 0x83, 0x73, 0x89, 0x75, 0x89, 0x7c, 0x8c, 0x80, + 0x80, 0x83, 0x81, 0x7f, 0x86, 0x81, 0x7d, 0x7b, 0x80, 0x7a, 0x7d, + 0x86, 0x80, 0x7e, 0x8a, 0x7e, 0x7d, 0x83, 0x7a, 0x80, 0x7c, 0x8b, + 0x76, 0x85, 0x7f, 0x7b, 0x7f, 0x87, 0x7e, 0x82, 0x82, 0x7b, 0x7e, + 0x81, 0x7c, 0x85, 0x7b, 0x7f, 0x81, 0x77, 0x7e, 0x81, 0x77, 0x80, + 0x85, 0x7b, 0x84, 0x7e, 0x7f, 0x77, 0x84, 0x7c, 0x7d, 0x83, 0x7e, + 0x7d, 0x83, 0x86, 0x84, 0x83, 0x8e, 0x78, 0x86, 0x82, 0x7a, 0x7e, + 0x82, 0x74, 0x83, 0x7c, 0x79, 0x85, 0x75, 0x87, 0x79, 0x88, 0x81, + 0x81, 0x83, 0x80, 0x7d, 0x88, 0x7c, 0x86, 0x7f, 0x7f, 0x83, 0x7d, + 0x88, 0x7a, 0x85, 0x7b, 0x80, 0x7c, 0x7f, 0x7c, 0x7d, 0x7e, 0x7b, + 0x84, 0x7a, 0x82, 0x7f, 0x77, 0x80, 0x7e, 0x73, 0x84, 0x78, 0x7a, + 0x87, 0x7e, 0x87, 0x82, 0x88, 0x7e, 0x87, 0x83, 0x7f, 0x87, 0x7b, + 0x86, 0x7b, 0x82, 0x85, 0x7a, 0x85, 0x80, 0x79, 0x82, 0x7e, 0x76, + 0x86, 0x78, 0x81, 0x81, 0x80, 0x80, 0x81, 0x81, 0x7c, 0x88, 0x7a, + 0x87, 0x7b, 0x82, 0x7d, 0x81, 0x81, 0x7f, 0x80, 0x7c, 0x80, 0x78, + 0x81, 0x79, 0x7f, 0x7b, 0x84, 0x76, 0x87, 0x7d, 0x7b, 0x85, 0x7d, + 0x82, 0x7f, 0x88, 0x75, 0x87, 0x80, 0x7a, 0x87, 0x81, 0x7c, 0x85, + 0x7f, 0x7e, 0x84, 0x7e, 0x85, 0x7f, 0x83, 0x82, 0x81, 0x7e, 0x84, + 0x7c, 0x7e, 0x83, 0x79, 0x81, 0x79, 0x83, 0x79, 0x84, 0x7e, 0x85, + 0x79, 0x8b, 0x78, 0x7f, 0x87, 0x71, 0x8b, 0x73, 0x84, 0x7a, 0x80, + 0x7b, 0x85, 0x77, 0x82, 0x81, 0x76, 0x81, 0x80, 0x76, 0x85, 0x81, + 0x7a, 0x8d, 0x7d, 0x88, 0x86, 0x81, 0x87, 0x82, 0x7d, 0x83, 0x80, + 0x76, 0x88, 0x7d, 0x75, 0x90, 0x76, 0x7f, 0x86, 0x7e, 0x75, 0x8d, + 0x71, 0x82, 0x7f, 0x7c, 0x7e, 0x84, 0x7c, 0x83, 0x84, 0x79, 0x8a, + 0x75, 0x85, 0x79, 0x84, 0x75, 0x8b, 0x73, 0x8a, 0x79, 0x88, 0x7b, + 0x84, 0x80, 0x78, 0x87, 0x6f, 0x8a, 0x6e, 0x88, 0x76, 0x84, 0x7a, + 0x89, 0x7a, 0x88, 0x80, 0x81, 0x84, 0x81, 0x83, 0x81, 0x85, 0x7d, + 0x8c, 0x77, 0x8e, 0x77, 0x8b, 0x76, 0x8d, 0x71, 0x88, 0x79, 0x7c, + 0x7e, 0x7c, 0x7d, 0x77, 0x88, 0x6f, 0x8b, 0x75, 0x86, 0x79, 0x8a, + 0x75, 0x8d, 0x77, 0x88, 0x7a, 0x84, 0x7a, 0x82, 0x7a, 0x80, 0x7e, + 0x7a, 0x89, 0x73, 0x8c, 0x79, 0x85, 0x7d, 0x88, 0x76, 0x8a, 0x78, + 0x84, 0x77, 0x8c, 0x6f, 0x8f, 0x77, 0x82, 0x82, 0x80, 0x82, 0x7e, + 0x88, 0x77, 0x8e, 0x76, 0x8b, 0x7a, 0x88, 0x78, 0x88, 0x77, 0x84, + 0x7b, 0x7f, 0x7b, 0x82, 0x78, 0x82, 0x7e, 0x7e, 0x82, 0x7f, 0x80, + 0x81, 0x7e, 0x80, 0x7e, 0x7e, 0x81, 0x78, 0x85, 0x76, 0x86, 0x76, + 0x85, 0x78, 0x83, 0x7b, 0x80, 0x7e, 0x81, 0x7e, 0x82, 0x82, 0x7e, + 0x89, 0x7d, 0x84, 0x86, 0x7d, 0x86, 0x82, 0x81, 0x81, 0x82, 0x82, + 0x7e, 0x83, 0x80, 0x7c, 0x83, 0x7e, 0x7d, 0x82, 0x7d, 0x7d, 0x81, + 0x7d, 0x7b, 0x81, 0x78, 0x81, 0x76, 0x83, 0x73, 0x86, 0x75, 0x82, + 0x7d, 0x7e, 0x80, 0x7f, 0x7f, 0x81, 0x80, 0x7e, 0x84, 0x7b, 0x85, + 0x7c, 0x84, 0x7b, 0x87, 0x7b, 0x89, 0x7f, 0x89, 0x80, 0x8c, 0x81, + 0x85, 0x88, 0x7d, 0x86, 0x7e, 0x7c, 0x7c, 0x7a, 0x74, 0x79, 0x72, + 0x73, 0x71, 0x71, 0x6f, 0x75, 0x71, 0x79, 0x79, 0x7c, 0x84, 0x83, + 0x8d, 0x91, 0x95, 0x9c, 0x9f, 0xa0, 0xa3, 0xa2, 0x9c, 0x9c, 0x92, + 0x8b, 0x83, 0x77, 0x6f, 0x66, 0x5b, 0x5a, 0x50, 0x4d, 0x4f, 0x4b, + 0x50, 0x58, 0x59, 0x68, 0x72, 0x79, 0x8b, 0x92, 0x9b, 0xa9, 0xac, + 0xb5, 0xb8, 0xba, 0xbb, 0xb7, 0xb3, 0xad, 0xa3, 0x9a, 0x91, 0x81, + 0x7a, 0x6c, 0x62, 0x58, 0x55, 0x45, 0x4c, 0x3f, 0x41, 0x45, 0x41, + 0x4e, 0x52, 0x5f, 0x6c, 0x78, 0x88, 0x92, 0x9f, 0xaa, 0xb3, 0xb6, + 0xc1, 0xbc, 0xbe, 0xbb, 0xb2, 0xb0, 0xa2, 0x9d, 0x8e, 0x87, 0x79, + 0x73, 0x65, 0x63, 0x54, 0x55, 0x49, 0x47, 0x40, 0x43, 0x3d, 0x47, + 0x4f, 0x4f, 0x6a, 0x68, 0x82, 0x89, 0x9c, 0xa4, 0xb5, 0xb6, 0xc3, + 0xc4, 0xc4, 0xc3, 0xbe, 0xb6, 0xad, 0xa5, 0x96, 0x8e, 0x7f, 0x77, + 0x69, 0x63, 0x57, 0x53, 0x47, 0x44, 0x3c, 0x3b, 0x39, 0x3e, 0x47, + 0x4c, 0x5f, 0x67, 0x79, 0x86, 0x96, 0xa3, 0xb0, 0xb9, 0xc2, 0xc5, + 0xc7, 0xc6, 0xc1, 0xbb, 0xb0, 0xa9, 0x9a, 0x90, 0x83, 0x78, 0x6b, + 0x64, 0x5a, 0x54, 0x4a, 0x44, 0x3d, 0x3a, 0x38, 0x3e, 0x44, 0x4c, + 0x5b, 0x66, 0x73, 0x84, 0x91, 0xa0, 0xae, 0xb6, 0xc2, 0xc4, 0xca, + 0xc5, 0xc6, 0xba, 0xb5, 0xa7, 0x9e, 0x90, 0x85, 0x7a, 0x6e, 0x67, + 0x5c, 0x56, 0x4c, 0x46, 0x3c, 0x3e, 0x34, 0x40, 0x42, 0x48, 0x59, + 0x61, 0x6f, 0x83, 0x8c, 0x9f, 0xae, 0xb6, 0xc3, 0xc7, 0xcb, 0xc9, + 0xc8, 0xbc, 0xb6, 0xa9, 0x9e, 0x90, 0x86, 0x77, 0x6e, 0x63, 0x5c, + 0x51, 0x4c, 0x42, 0x3c, 0x3b, 0x34, 0x40, 0x41, 0x4b, 0x5a, 0x65, + 0x71, 0x87, 0x8e, 0xa4, 0xaf, 0xba, 0xc4, 0xc8, 0xcc, 0xc9, 0xc7, + 0xbc, 0xb5, 0xa7, 0x9d, 0x8d, 0x83, 0x75, 0x6c, 0x61, 0x5b, 0x50, + 0x4b, 0x42, 0x3c, 0x39, 0x35, 0x41, 0x3e, 0x4e, 0x58, 0x64, 0x73, + 0x85, 0x8f, 0xa4, 0xaf, 0xbb, 0xc6, 0xc8, 0xcf, 0xc9, 0xc8, 0xbc, + 0xb5, 0xa6, 0x9b, 0x8d, 0x82, 0x74, 0x6b, 0x5f, 0x59, 0x4f, 0x48, + 0x41, 0x3b, 0x36, 0x36, 0x41, 0x3e, 0x53, 0x58, 0x67, 0x77, 0x86, + 0x92, 0xa6, 0xb0, 0xbd, 0xc6, 0xc9, 0xce, 0xca, 0xc7, 0xbd, 0xb4, + 0xa7, 0x9b, 0x8c, 0x84, 0x73, 0x6d, 0x5f, 0x5a, 0x4e, 0x4b, 0x3d, + 0x3d, 0x32, 0x38, 0x40, 0x3b, 0x55, 0x56, 0x67, 0x77, 0x85, 0x91, + 0xaa, 0xaf, 0xc0, 0xc8, 0xca, 0xcf, 0xcc, 0xc6, 0xbe, 0xb3, 0xa5, + 0x99, 0x8c, 0x7f, 0x73, 0x69, 0x5d, 0x58, 0x4c, 0x47, 0x3d, 0x3b, + 0x2f, 0x41, 0x3a, 0x46, 0x58, 0x59, 0x6f, 0x7b, 0x87, 0x9a, 0xab, + 0xb2, 0xc4, 0xc4, 0xcc, 0xcb, 0xc9, 0xc3, 0xbb, 0xae, 0xa3, 0x94, + 0x8a, 0x7a, 0x72, 0x64, 0x5c, 0x54, 0x49, 0x43, 0x3b, 0x36, 0x32, + 0x42, 0x37, 0x50, 0x55, 0x5f, 0x73, 0x7e, 0x8a, 0xa1, 0xab, 0xb6, + 0xc4, 0xc4, 0xcc, 0xc9, 0xc8, 0xc0, 0xb8, 0xa9, 0xa0, 0x90, 0x86, + 0x77, 0x70, 0x60, 0x5c, 0x4f, 0x48, 0x3f, 0x3b, 0x33, 0x39, 0x41, + 0x3c, 0x56, 0x55, 0x67, 0x76, 0x83, 0x90, 0xa8, 0xac, 0xbd, 0xc5, + 0xc7, 0xce, 0xc9, 0xc7, 0xbd, 0xb4, 0xa5, 0x9b, 0x8c, 0x80, 0x74, + 0x6a, 0x5e, 0x58, 0x4c, 0x45, 0x3f, 0x38, 0x36, 0x40, 0x3c, 0x4a, + 0x56, 0x5b, 0x71, 0x7b, 0x8a, 0x9c, 0xa9, 0xb3, 0xc3, 0xc3, 0xcc, + 0xcb, 0xc7, 0xc3, 0xb8, 0xad, 0xa0, 0x94, 0x86, 0x7a, 0x70, 0x63, + 0x5b, 0x51, 0x48, 0x40, 0x3c, 0x33, 0x3b, 0x3d, 0x40, 0x52, 0x54, + 0x67, 0x74, 0x82, 0x91, 0xa3, 0xab, 0xbb, 0xc2, 0xc6, 0xcc, 0xc8, + 0xc6, 0xbd, 0xb4, 0xa8, 0x9b, 0x8e, 0x82, 0x75, 0x6c, 0x61, 0x57, + 0x4f, 0x45, 0x3e, 0x39, 0x34, 0x3e, 0x3b, 0x48, 0x52, 0x59, 0x6d, + 0x79, 0x87, 0x9b, 0xa7, 0xb3, 0xc0, 0xc3, 0xcb, 0xcb, 0xc8, 0xc4, + 0xba, 0xae, 0xa4, 0x95, 0x8b, 0x7c, 0x72, 0x67, 0x5e, 0x54, 0x4c, + 0x43, 0x3c, 0x38, 0x3a, 0x3f, 0x40, 0x50, 0x54, 0x62, 0x72, 0x7f, + 0x90, 0xa1, 0xab, 0xba, 0xc1, 0xc5, 0xcb, 0xc8, 0xc6, 0xbe, 0xb3, + 0xa8, 0x9c, 0x8e, 0x83, 0x75, 0x6b, 0x60, 0x57, 0x4d, 0x45, 0x3d, + 0x38, 0x38, 0x3d, 0x3f, 0x49, 0x54, 0x5c, 0x6e, 0x7a, 0x8b, 0x9c, + 0xa9, 0xb5, 0xc0, 0xc4, 0xc9, 0xca, 0xc5, 0xc2, 0xb5, 0xac, 0x9f, + 0x93, 0x86, 0x7a, 0x6f, 0x65, 0x5a, 0x53, 0x49, 0x40, 0x3d, 0x36, + 0x3f, 0x3d, 0x46, 0x51, 0x57, 0x67, 0x75, 0x83, 0x96, 0xa3, 0xb0, + 0xbc, 0xc2, 0xc7, 0xca, 0xc7, 0xc3, 0xbc, 0xaf, 0xa5, 0x97, 0x8a, + 0x7f, 0x72, 0x68, 0x5f, 0x53, 0x4c, 0x43, 0x3c, 0x38, 0x3b, 0x3e, + 0x42, 0x4f, 0x55, 0x62, 0x71, 0x7d, 0x8f, 0x9d, 0xab, 0xb6, 0xc1, + 0xc3, 0xc9, 0xc7, 0xc4, 0xbf, 0xb1, 0xa9, 0x9c, 0x8e, 0x83, 0x78, + 0x6b, 0x64, 0x58, 0x51, 0x47, 0x40, 0x3a, 0x39, 0x3e, 0x3f, 0x49, + 0x53, 0x5a, 0x6d, 0x78, 0x88, 0x99, 0xa6, 0xb2, 0xbe, 0xc2, 0xc8, + 0xc9, 0xc3, 0xc4, 0xb2, 0xae, 0x9e, 0x91, 0x86, 0x79, 0x6d, 0x67, + 0x58, 0x51, 0x4a, 0x3d, 0x3d, 0x38, 0x3c, 0x40, 0x48, 0x51, 0x5e, + 0x68, 0x7a, 0x87, 0x96, 0xa5, 0xb2, 0xbb, 0xc4, 0xc6, 0xc8, 0xc6, + 0xc0, 0xb7, 0xab, 0xa0, 0x92, 0x87, 0x79, 0x6f, 0x65, 0x5b, 0x51, + 0x4a, 0x40, 0x3c, 0x3a, 0x3d, 0x41, 0x49, 0x53, 0x5c, 0x6d, 0x78, + 0x88, 0x98, 0xa3, 0xb2, 0xbc, 0xc1, 0xc8, 0xc6, 0xc4, 0xc1, 0xb3, + 0xae, 0x9e, 0x93, 0x88, 0x79, 0x6e, 0x66, 0x58, 0x52, 0x49, 0x3f, + 0x3d, 0x38, 0x3d, 0x41, 0x49, 0x53, 0x5d, 0x6c, 0x7a, 0x88, 0x98, + 0xa6, 0xb2, 0xbc, 0xc4, 0xc4, 0xca, 0xc2, 0xc1, 0xb6, 0xab, 0xa0, + 0x91, 0x86, 0x79, 0x6d, 0x63, 0x5a, 0x4e, 0x49, 0x3d, 0x3b, 0x3a, + 0x3d, 0x42, 0x4d, 0x54, 0x61, 0x70, 0x7b, 0x8e, 0x9b, 0xa9, 0xb7, + 0xbe, 0xc6, 0xc8, 0xc7, 0xc6, 0xbc, 0xb5, 0xa9, 0x9b, 0x8f, 0x82, + 0x74, 0x6b, 0x60, 0x56, 0x4d, 0x43, 0x3d, 0x39, 0x3a, 0x40, 0x43, + 0x4f, 0x57, 0x63, 0x73, 0x80, 0x90, 0x9f, 0xac, 0xb8, 0xc1, 0xc6, + 0xc7, 0xc6, 0xc2, 0xb8, 0xb0, 0xa1, 0x95, 0x89, 0x7b, 0x71, 0x66, + 0x5c, 0x53, 0x49, 0x41, 0x3b, 0x3a, 0x3d, 0x40, 0x49, 0x53, 0x5d, + 0x6c, 0x7a, 0x88, 0x98, 0xa5, 0xb4, 0xbc, 0xc3, 0xc8, 0xc6, 0xc5, + 0xbe, 0xb2, 0xa9, 0x99, 0x8d, 0x82, 0x75, 0x6c, 0x61, 0x56, 0x4e, + 0x44, 0x3d, 0x3b, 0x3b, 0x40, 0x45, 0x4f, 0x57, 0x66, 0x74, 0x82, + 0x93, 0xa0, 0xae, 0xb9, 0xc0, 0xc7, 0xc7, 0xc5, 0xc2, 0xb5, 0xae, + 0x9e, 0x91, 0x87, 0x78, 0x6f, 0x67, 0x58, 0x53, 0x48, 0x40, 0x3e, + 0x3b, 0x40, 0x44, 0x4c, 0x56, 0x60, 0x6f, 0x7d, 0x8d, 0x9b, 0xa9, + 0xb4, 0xbc, 0xc4, 0xc4, 0xc6, 0xc2, 0xb8, 0xb0, 0xa2, 0x94, 0x8a, + 0x7b, 0x73, 0x66, 0x5d, 0x53, 0x4a, 0x43, 0x3d, 0x3d, 0x41, 0x44, + 0x4e, 0x57, 0x60, 0x71, 0x7d, 0x8d, 0x9c, 0xa9, 0xb4, 0xbd, 0xc1, + 0xc7, 0xc1, 0xc1, 0xb7, 0xab, 0xa3, 0x91, 0x88, 0x7c, 0x6f, 0x68, + 0x5d, 0x53, 0x4e, 0x43, 0x40, 0x3f, 0x41, 0x47, 0x4f, 0x58, 0x63, + 0x70, 0x7e, 0x8d, 0x9b, 0xa8, 0xb4, 0xbb, 0xc2, 0xc4, 0xc2, 0xbf, + 0xb8, 0xab, 0xa3, 0x92, 0x88, 0x7d, 0x71, 0x6a, 0x5f, 0x56, 0x4e, + 0x47, 0x3f, 0x40, 0x3f, 0x46, 0x4b, 0x56, 0x5e, 0x6c, 0x7a, 0x89, + 0x98, 0xa4, 0xb2, 0xb7, 0xc0, 0xc2, 0xc2, 0xbe, 0xbb, 0xae, 0xa7, + 0x98, 0x8c, 0x83, 0x76, 0x6e, 0x65, 0x5b, 0x53, 0x4c, 0x41, 0x43, + 0x3f, 0x45, 0x4a, 0x50, 0x5c, 0x64, 0x75, 0x80, 0x92, 0x9c, 0xab, + 0xb2, 0xba, 0xc0, 0xbf, 0xc0, 0xbc, 0xb2, 0xa9, 0x9f, 0x90, 0x89, + 0x7a, 0x72, 0x68, 0x5f, 0x56, 0x50, 0x46, 0x43, 0x44, 0x41, 0x4d, + 0x4c, 0x5a, 0x61, 0x6f, 0x7c, 0x8b, 0x98, 0xa4, 0xb0, 0xb5, 0xbf, + 0xbe, 0xbf, 0xbb, 0xb5, 0xaa, 0xa2, 0x93, 0x8a, 0x7d, 0x73, 0x6b, + 0x61, 0x5a, 0x53, 0x4c, 0x44, 0x48, 0x41, 0x4d, 0x4e, 0x57, 0x61, + 0x6a, 0x7a, 0x85, 0x95, 0x9e, 0xad, 0xaf, 0xbc, 0xba, 0xbe, 0xb9, + 0xb4, 0xad, 0xa1, 0x98, 0x8a, 0x82, 0x74, 0x6f, 0x62, 0x5f, 0x53, + 0x51, 0x45, 0x4a, 0x43, 0x4b, 0x51, 0x53, 0x64, 0x65, 0x7b, 0x80, + 0x93, 0x9a, 0xaa, 0xad, 0xb8, 0xb9, 0xb9, 0xbb, 0xb1, 0xaf, 0xa0, + 0x9a, 0x8b, 0x84, 0x76, 0x72, 0x64, 0x62, 0x57, 0x53, 0x4b, 0x49, + 0x4a, 0x48, 0x56, 0x52, 0x65, 0x66, 0x77, 0x80, 0x8e, 0x98, 0xa5, + 0xac, 0xb4, 0xb9, 0xb7, 0xbc, 0xb1, 0xb1, 0xa2, 0x9e, 0x8d, 0x87, + 0x79, 0x73, 0x68, 0x63, 0x58, 0x56, 0x4d, 0x4a, 0x4e, 0x47, 0x58, + 0x52, 0x63, 0x66, 0x74, 0x7c, 0x8d, 0x91, 0xa3, 0xa7, 0xaf, 0xb6, + 0xb3, 0xb8, 0xaf, 0xaf, 0xa1, 0x9d, 0x8c, 0x89, 0x78, 0x76, 0x69, + 0x65, 0x5a, 0x58, 0x4f, 0x4e, 0x4f, 0x4a, 0x58, 0x54, 0x64, 0x68, + 0x75, 0x7d, 0x8d, 0x91, 0xa3, 0xa4, 0xaf, 0xb2, 0xb2, 0xb7, 0xad, + 0xae, 0xa0, 0x9b, 0x8d, 0x87, 0x79, 0x76, 0x68, 0x66, 0x5a, 0x58, + 0x51, 0x4f, 0x52, 0x4d, 0x5b, 0x57, 0x65, 0x6b, 0x74, 0x7f, 0x8c, + 0x91, 0xa1, 0xa3, 0xad, 0xb0, 0xb1, 0xb1, 0xad, 0xaa, 0x9f, 0x9b, + 0x8c, 0x87, 0x7a, 0x74, 0x6a, 0x66, 0x5a, 0x5b, 0x51, 0x53, 0x53, + 0x50, 0x5c, 0x5a, 0x66, 0x6e, 0x75, 0x81, 0x8c, 0x92, 0xa1, 0xa3, + 0xab, 0xad, 0xb0, 0xab, 0xac, 0xa4, 0x9b, 0x98, 0x88, 0x85, 0x78, + 0x72, 0x6a, 0x64, 0x5c, 0x5c, 0x53, 0x57, 0x55, 0x55, 0x60, 0x5d, + 0x6a, 0x71, 0x77, 0x84, 0x8d, 0x92, 0xa0, 0xa2, 0xa7, 0xad, 0xa9, + 0xaa, 0xa8, 0x9e, 0x9c, 0x91, 0x88, 0x84, 0x76, 0x73, 0x6b, 0x62, + 0x61, 0x5a, 0x56, 0x5b, 0x54, 0x5c, 0x61, 0x60, 0x70, 0x72, 0x7b, + 0x87, 0x8c, 0x95, 0x9f, 0x9f, 0xa7, 0xa9, 0xa5, 0xa9, 0xa0, 0x9c, + 0x97, 0x8c, 0x86, 0x80, 0x75, 0x73, 0x68, 0x65, 0x61, 0x5b, 0x5a, + 0x5b, 0x5a, 0x5f, 0x65, 0x66, 0x74, 0x74, 0x80, 0x87, 0x8e, 0x96, + 0x9d, 0x9e, 0xa6, 0xa3, 0xa4, 0xa4, 0x9c, 0x9b, 0x92, 0x8b, 0x85, + 0x7e, 0x75, 0x74, 0x68, 0x68, 0x60, 0x60, 0x5d, 0x5f, 0x5d, 0x64, + 0x66, 0x6b, 0x74, 0x77, 0x81, 0x86, 0x8f, 0x93, 0x9b, 0x9b, 0xa3, + 0x9f, 0xa3, 0x9f, 0x9b, 0x98, 0x90, 0x8a, 0x84, 0x7d, 0x77, 0x72, + 0x6b, 0x69, 0x62, 0x62, 0x5f, 0x61, 0x61, 0x65, 0x69, 0x6d, 0x74, + 0x7a, 0x7f, 0x88, 0x8c, 0x92, 0x98, 0x9a, 0x9e, 0x9e, 0x9f, 0x9c, + 0x9a, 0x94, 0x90, 0x89, 0x84, 0x7d, 0x78, 0x72, 0x6e, 0x69, 0x66, + 0x65, 0x62, 0x64, 0x65, 0x67, 0x6c, 0x6f, 0x74, 0x7c, 0x7e, 0x88, + 0x8b, 0x90, 0x95, 0x98, 0x9a, 0x9d, 0x9b, 0x9a, 0x98, 0x92, 0x8f, + 0x89, 0x84, 0x7e, 0x78, 0x73, 0x70, 0x69, 0x69, 0x65, 0x65, 0x66, + 0x67, 0x69, 0x6d, 0x71, 0x76, 0x7c, 0x80, 0x86, 0x8b, 0x8f, 0x93, + 0x96, 0x97, 0x9a, 0x98, 0x97, 0x95, 0x91, 0x8d, 0x89, 0x83, 0x7f, + 0x79, 0x75, 0x71, 0x6d, 0x6b, 0x69, 0x68, 0x69, 0x69, 0x6b, 0x70, + 0x71, 0x77, 0x7b, 0x80, 0x85, 0x8a, 0x8e, 0x92, 0x94, 0x96, 0x97, + 0x96, 0x95, 0x92, 0x8f, 0x8a, 0x86, 0x81, 0x7d, 0x78, 0x74, 0x70, + 0x6e, 0x6c, 0x6b, 0x6b, 0x6b, 0x6d, 0x70, 0x72, 0x77, 0x7a, 0x7f, + 0x84, 0x88, 0x8c, 0x8f, 0x92, 0x94, 0x94, 0x94, 0x93, 0x91, 0x8e, + 0x8b, 0x86, 0x82, 0x7e, 0x7a, 0x77, 0x73, 0x71, 0x6f, 0x6f, 0x6d, + 0x6e, 0x6f, 0x71, 0x73, 0x76, 0x78, 0x7c, 0x7f, 0x82, 0x86, 0x88, + 0x8b, 0x8d, 0x8f, 0x8f, 0x90, 0x8f, 0x8e, 0x8c, 0x89, 0x87, 0x83, + 0x80, 0x7d, 0x7a, 0x77, 0x76, 0x73, 0x73, 0x72, 0x72, 0x73, 0x74, + 0x75, 0x78, 0x7a, 0x7c, 0x7f, 0x81, 0x84, 0x85, 0x88, 0x89, 0x8b, + 0x8c, 0x8c, 0x8c, 0x8a, 0x89, 0x87, 0x85, 0x82, 0x80, 0x7e, 0x7c, + 0x7a, 0x78, 0x77, 0x76, 0x76, 0x76, 0x76, 0x77, 0x79, 0x7a, 0x7c, + 0x7d, 0x7f, 0x81, 0x82, 0x83, 0x85, 0x85, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x85, 0x84, 0x83, 0x81, 0x81, 0x7f, 0x7e, 0x7d, 0x7c, 0x7c, + 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7d, 0x7d, 0x7e, 0x7f, 0x7f, + 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, + 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + }, + { // 8 + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7e, + 0x80, 0x80, 0x7f, 0x81, 0x80, 0x80, 0x81, 0x81, 0x80, 0x81, 0x81, + 0x81, 0x81, 0x82, 0x83, 0x91, 0x9c, 0x7a, 0x74, 0x82, 0x82, 0x97, + 0x94, 0x83, 0x74, 0x6d, 0x72, 0x7c, 0x80, 0x7a, 0x71, 0x6d, 0x6a, + 0x69, 0x72, 0x79, 0x7f, 0x82, 0x82, 0x7e, 0x7f, 0x82, 0x83, 0x82, + 0x84, 0x81, 0x83, 0x86, 0x86, 0x89, 0x89, 0x8a, 0x8a, 0x88, 0x85, + 0x80, 0x7b, 0x78, 0x71, 0x71, 0x6e, 0x6f, 0x70, 0x70, 0x71, 0x75, + 0x78, 0x78, 0x7d, 0x8a, 0xa1, 0xa7, 0xa7, 0x9a, 0x92, 0x8e, 0x91, + 0x95, 0x97, 0x94, 0x8b, 0x80, 0x71, 0x6a, 0x60, 0x5d, 0x59, 0x58, + 0x54, 0x56, 0x58, 0x6c, 0x83, 0xa0, 0xb8, 0xa7, 0x8f, 0x72, 0x6b, + 0x78, 0x88, 0x9b, 0xad, 0xa9, 0x98, 0x85, 0x79, 0x76, 0x78, 0x7e, + 0x81, 0x81, 0x77, 0x6e, 0x66, 0x62, 0x64, 0x60, 0x5c, 0x5a, 0x6e, + 0x7e, 0xa0, 0xb2, 0xa1, 0x91, 0x6f, 0x69, 0x78, 0x89, 0xa2, 0xaa, + 0xa9, 0x9d, 0x8c, 0x7c, 0x70, 0x77, 0x84, 0x90, 0x89, 0x7e, 0x6e, + 0x66, 0x5c, 0x5f, 0x62, 0x65, 0x5a, 0x66, 0x79, 0x90, 0xbf, 0xa9, + 0x95, 0x72, 0x5e, 0x73, 0x85, 0x9c, 0xb1, 0xa8, 0xa3, 0x8a, 0x7a, + 0x73, 0x71, 0x84, 0x8a, 0x8e, 0x7f, 0x72, 0x69, 0x61, 0x62, 0x66, + 0x60, 0x62, 0x4e, 0x66, 0x7e, 0x9f, 0xc8, 0xa3, 0x89, 0x68, 0x5c, + 0x77, 0x89, 0xa5, 0xb6, 0xa8, 0x9b, 0x7d, 0x74, 0x77, 0x7a, 0x8b, + 0x8c, 0x88, 0x77, 0x6f, 0x68, 0x69, 0x6e, 0x69, 0x62, 0x5b, 0x4b, + 0x67, 0x7f, 0xa0, 0xc7, 0xa2, 0x86, 0x60, 0x56, 0x7a, 0x90, 0xac, + 0xb5, 0xa4, 0x93, 0x76, 0x74, 0x7b, 0x80, 0x8e, 0x8d, 0x87, 0x75, + 0x6a, 0x6c, 0x70, 0x71, 0x6c, 0x5d, 0x5a, 0x4c, 0x63, 0x85, 0xa0, + 0xc6, 0xa9, 0x81, 0x5f, 0x57, 0x79, 0x98, 0xaf, 0xb4, 0x9f, 0x88, + 0x6f, 0x72, 0x80, 0x89, 0x92, 0x8a, 0x80, 0x6c, 0x69, 0x6b, 0x74, + 0x79, 0x72, 0x5e, 0x52, 0x44, 0x60, 0x88, 0xa0, 0xc9, 0xab, 0x84, + 0x5c, 0x51, 0x79, 0x9b, 0xb4, 0xb7, 0xa0, 0x86, 0x6f, 0x70, 0x82, + 0x8b, 0x92, 0x87, 0x7e, 0x6b, 0x68, 0x72, 0x79, 0x7d, 0x71, 0x5c, + 0x53, 0x4b, 0x5b, 0x8a, 0x9a, 0xc5, 0xb3, 0x80, 0x62, 0x4c, 0x74, + 0x9b, 0xb2, 0xb4, 0x9d, 0x85, 0x71, 0x71, 0x89, 0x90, 0x95, 0x88, + 0x78, 0x6d, 0x6a, 0x76, 0x7c, 0x7e, 0x72, 0x5e, 0x52, 0x52, 0x55, + 0x7f, 0x92, 0xb9, 0xc1, 0x89, 0x67, 0x4a, 0x6b, 0x9b, 0xb1, 0xb6, + 0x9f, 0x86, 0x76, 0x73, 0x88, 0x8f, 0x95, 0x88, 0x74, 0x6c, 0x68, + 0x79, 0x7d, 0x7e, 0x6f, 0x5c, 0x54, 0x4f, 0x52, 0x78, 0x91, 0xaf, + 0xc6, 0x92, 0x6c, 0x4f, 0x60, 0x94, 0xaf, 0xb9, 0xa2, 0x86, 0x75, + 0x73, 0x89, 0x95, 0x94, 0x89, 0x75, 0x6e, 0x6a, 0x7a, 0x82, 0x81, + 0x71, 0x5a, 0x51, 0x53, 0x56, 0x6c, 0x8a, 0x9e, 0xc6, 0xa1, 0x71, + 0x54, 0x54, 0x8d, 0xad, 0xb8, 0xa6, 0x88, 0x79, 0x73, 0x84, 0x96, + 0x94, 0x8d, 0x73, 0x6d, 0x6a, 0x77, 0x80, 0x80, 0x79, 0x63, 0x50, + 0x4b, 0x52, 0x65, 0x8d, 0x96, 0xbe, 0xae, 0x77, 0x5a, 0x4c, 0x81, + 0xac, 0xba, 0xad, 0x8a, 0x79, 0x73, 0x83, 0x9b, 0x94, 0x8d, 0x77, + 0x6e, 0x6e, 0x75, 0x84, 0x80, 0x78, 0x60, 0x56, 0x57, 0x5b, 0x57, + 0x7a, 0x8e, 0xb1, 0xc0, 0x83, 0x66, 0x4d, 0x71, 0xa0, 0xaf, 0xb1, + 0x95, 0x7c, 0x74, 0x7a, 0x93, 0x97, 0x8f, 0x7e, 0x6d, 0x71, 0x71, + 0x84, 0x7f, 0x78, 0x66, 0x59, 0x53, 0x59, 0x59, 0x76, 0x8c, 0xa1, + 0xc5, 0x91, 0x6e, 0x53, 0x65, 0x9b, 0xaf, 0xb2, 0x9c, 0x81, 0x7a, + 0x7a, 0x90, 0x99, 0x8f, 0x82, 0x6e, 0x71, 0x71, 0x82, 0x83, 0x79, + 0x6a, 0x58, 0x57, 0x5d, 0x59, 0x68, 0x84, 0x95, 0xbf, 0xa4, 0x75, + 0x5a, 0x5a, 0x8d, 0xaa, 0xb1, 0xa2, 0x88, 0x7b, 0x79, 0x89, 0x9b, + 0x94, 0x87, 0x73, 0x72, 0x72, 0x7c, 0x86, 0x7b, 0x6f, 0x5a, 0x5b, + 0x5d, 0x5b, 0x60, 0x7d, 0x8d, 0xba, 0xb0, 0x7e, 0x63, 0x52, 0x83, + 0xa3, 0xb5, 0xa8, 0x8d, 0x7c, 0x76, 0x85, 0x9a, 0x97, 0x8c, 0x75, + 0x6f, 0x71, 0x76, 0x88, 0x7e, 0x73, 0x5d, 0x5a, 0x58, 0x5c, 0x58, + 0x74, 0x89, 0xaa, 0xbb, 0x87, 0x6a, 0x50, 0x75, 0x9d, 0xb0, 0xab, + 0x90, 0x81, 0x77, 0x81, 0x9a, 0x99, 0x8d, 0x76, 0x6f, 0x76, 0x79, + 0x84, 0x7c, 0x70, 0x5c, 0x5a, 0x5d, 0x5f, 0x5d, 0x7a, 0x86, 0xb4, + 0xb5, 0x80, 0x63, 0x4e, 0x80, 0xa3, 0xb3, 0xa7, 0x8d, 0x7f, 0x78, + 0x87, 0x9b, 0x9a, 0x8b, 0x72, 0x70, 0x73, 0x7f, 0x82, 0x79, 0x6c, + 0x5e, 0x5c, 0x5b, 0x5a, 0x5b, 0x82, 0x91, 0xbb, 0xa6, 0x72, 0x5e, + 0x59, 0x8a, 0xa8, 0xb1, 0xa1, 0x87, 0x7a, 0x7a, 0x8e, 0x9d, 0x94, + 0x84, 0x6f, 0x73, 0x77, 0x86, 0x7f, 0x77, 0x64, 0x5a, 0x5d, 0x63, + 0x5d, 0x61, 0x7f, 0x99, 0xc1, 0x99, 0x72, 0x56, 0x69, 0x96, 0xa9, + 0xad, 0x97, 0x85, 0x7a, 0x81, 0x92, 0x9e, 0x92, 0x7b, 0x6c, 0x74, + 0x7d, 0x89, 0x83, 0x75, 0x5f, 0x5a, 0x5a, 0x65, 0x5b, 0x6c, 0x88, + 0xa1, 0xbf, 0x88, 0x69, 0x53, 0x74, 0x9d, 0xac, 0xa8, 0x8e, 0x81, + 0x7a, 0x83, 0x97, 0x9c, 0x8d, 0x76, 0x6c, 0x75, 0x7f, 0x88, 0x7b, + 0x70, 0x5f, 0x5e, 0x5d, 0x62, 0x59, 0x72, 0x88, 0xae, 0xb9, 0x85, + 0x64, 0x53, 0x7f, 0xa1, 0xb1, 0xa5, 0x8d, 0x7f, 0x78, 0x86, 0x99, + 0x9a, 0x89, 0x70, 0x6d, 0x77, 0x85, 0x85, 0x78, 0x6c, 0x5f, 0x5f, + 0x5c, 0x5d, 0x5b, 0x7f, 0x91, 0xb4, 0xa6, 0x76, 0x61, 0x5b, 0x8c, + 0xa3, 0xae, 0x9b, 0x86, 0x7d, 0x7b, 0x8d, 0x9c, 0x98, 0x81, 0x6c, + 0x6f, 0x7a, 0x87, 0x82, 0x76, 0x63, 0x5b, 0x5d, 0x64, 0x5d, 0x62, + 0x80, 0x92, 0xbe, 0x98, 0x77, 0x5a, 0x67, 0x96, 0xa7, 0xae, 0x96, + 0x86, 0x7c, 0x7e, 0x90, 0x9d, 0x93, 0x7e, 0x6e, 0x74, 0x7c, 0x87, + 0x7e, 0x77, 0x67, 0x5e, 0x58, 0x5f, 0x59, 0x6a, 0x89, 0x9f, 0xbb, + 0x8d, 0x6c, 0x55, 0x71, 0x9e, 0xaf, 0xaa, 0x8f, 0x80, 0x7a, 0x85, + 0x95, 0x9b, 0x8f, 0x77, 0x6d, 0x73, 0x7e, 0x85, 0x7c, 0x73, 0x62, + 0x60, 0x5c, 0x62, 0x58, 0x6b, 0x83, 0x9e, 0xb9, 0x8c, 0x6c, 0x56, + 0x75, 0x9d, 0xad, 0xa6, 0x8d, 0x82, 0x7c, 0x84, 0x95, 0x9a, 0x8e, + 0x79, 0x6f, 0x74, 0x7f, 0x86, 0x7b, 0x6e, 0x62, 0x61, 0x60, 0x65, + 0x55, 0x6a, 0x85, 0xa0, 0xb9, 0x89, 0x6c, 0x5a, 0x77, 0x9f, 0xab, + 0xa6, 0x8e, 0x83, 0x7b, 0x87, 0x95, 0x9c, 0x8d, 0x77, 0x71, 0x76, + 0x81, 0x84, 0x7b, 0x6f, 0x61, 0x63, 0x60, 0x65, 0x57, 0x65, 0x81, + 0x9e, 0xbb, 0x8e, 0x6f, 0x57, 0x73, 0x9b, 0xac, 0xab, 0x8e, 0x84, + 0x7a, 0x86, 0x94, 0x9b, 0x8e, 0x78, 0x70, 0x76, 0x83, 0x86, 0x7b, + 0x6c, 0x60, 0x63, 0x61, 0x65, 0x58, 0x64, 0x82, 0x9c, 0xba, 0x8d, + 0x70, 0x5b, 0x74, 0x9b, 0xa7, 0xa8, 0x8f, 0x87, 0x7c, 0x85, 0x94, + 0x9a, 0x8f, 0x77, 0x70, 0x75, 0x80, 0x85, 0x78, 0x6e, 0x64, 0x65, + 0x61, 0x63, 0x56, 0x63, 0x80, 0x98, 0xb6, 0x91, 0x75, 0x5b, 0x71, + 0x96, 0xa9, 0xab, 0x92, 0x86, 0x7b, 0x85, 0x93, 0x9c, 0x90, 0x79, + 0x70, 0x76, 0x7f, 0x83, 0x79, 0x70, 0x65, 0x62, 0x5f, 0x62, 0x5c, + 0x62, 0x7c, 0x92, 0xb4, 0x95, 0x76, 0x5d, 0x6f, 0x96, 0xa8, 0xab, + 0x92, 0x88, 0x7d, 0x86, 0x92, 0x9b, 0x91, 0x7b, 0x70, 0x74, 0x7f, + 0x84, 0x7b, 0x6f, 0x64, 0x64, 0x60, 0x64, 0x5b, 0x65, 0x7f, 0x91, + 0xb2, 0x92, 0x78, 0x60, 0x71, 0x97, 0xa8, 0xaa, 0x91, 0x86, 0x7d, + 0x89, 0x94, 0x9a, 0x8c, 0x79, 0x72, 0x76, 0x7f, 0x80, 0x78, 0x6d, + 0x63, 0x65, 0x61, 0x64, 0x59, 0x67, 0x7f, 0x97, 0xaf, 0x8e, 0x77, + 0x61, 0x79, 0x98, 0xa9, 0xa7, 0x90, 0x87, 0x80, 0x8b, 0x95, 0x97, + 0x8a, 0x78, 0x74, 0x79, 0x81, 0x7f, 0x75, 0x6b, 0x62, 0x64, 0x60, + 0x65, 0x59, 0x6f, 0x80, 0x9d, 0xab, 0x85, 0x72, 0x5f, 0x83, 0x9b, + 0xa9, 0x9e, 0x8c, 0x85, 0x81, 0x8e, 0x95, 0x97, 0x85, 0x75, 0x73, + 0x7b, 0x82, 0x7d, 0x72, 0x69, 0x64, 0x64, 0x63, 0x62, 0x5d, 0x76, + 0x7f, 0xa2, 0x9e, 0x85, 0x70, 0x66, 0x89, 0x9c, 0xa9, 0x98, 0x8b, + 0x82, 0x85, 0x8f, 0x97, 0x95, 0x82, 0x74, 0x75, 0x7b, 0x82, 0x79, + 0x6f, 0x66, 0x66, 0x61, 0x64, 0x5b, 0x67, 0x7c, 0x88, 0xa5, 0x8e, + 0x81, 0x68, 0x76, 0x91, 0xa2, 0xa5, 0x92, 0x8a, 0x83, 0x8b, 0x93, + 0x99, 0x8e, 0x7c, 0x75, 0x79, 0x81, 0x80, 0x75, 0x6c, 0x66, 0x66, + 0x62, 0x62, 0x5b, 0x72, 0x7d, 0x98, 0x9f, 0x84, 0x75, 0x67, 0x85, + 0x98, 0xa4, 0x9a, 0x8d, 0x88, 0x86, 0x90, 0x96, 0x94, 0x85, 0x77, + 0x76, 0x7a, 0x81, 0x7b, 0x76, 0x68, 0x63, 0x5f, 0x63, 0x61, 0x6a, + 0x79, 0x87, 0xa0, 0x8d, 0x7d, 0x69, 0x78, 0x91, 0xa0, 0x9d, 0x8e, + 0x89, 0x87, 0x8e, 0x95, 0x95, 0x8b, 0x7c, 0x76, 0x79, 0x7f, 0x7e, + 0x75, 0x6b, 0x67, 0x61, 0x61, 0x60, 0x65, 0x7a, 0x7f, 0x9c, 0x8f, + 0x85, 0x70, 0x73, 0x8c, 0x9a, 0xa2, 0x91, 0x8a, 0x84, 0x8c, 0x93, + 0x96, 0x8e, 0x7f, 0x77, 0x77, 0x7d, 0x7e, 0x79, 0x6f, 0x69, 0x63, + 0x60, 0x63, 0x64, 0x79, 0x7c, 0x96, 0x92, 0x84, 0x74, 0x70, 0x8a, + 0x99, 0xa4, 0x94, 0x8d, 0x85, 0x8b, 0x93, 0x93, 0x8f, 0x80, 0x79, + 0x78, 0x7c, 0x7c, 0x79, 0x6e, 0x65, 0x62, 0x64, 0x69, 0x67, 0x75, + 0x7b, 0x94, 0x93, 0x84, 0x74, 0x74, 0x8a, 0x97, 0x9e, 0x92, 0x8d, + 0x88, 0x8a, 0x90, 0x92, 0x8c, 0x81, 0x79, 0x79, 0x7d, 0x7a, 0x77, + 0x6f, 0x67, 0x61, 0x63, 0x64, 0x6d, 0x76, 0x7d, 0x93, 0x8d, 0x84, + 0x71, 0x77, 0x8b, 0x99, 0x9d, 0x93, 0x8c, 0x89, 0x8b, 0x90, 0x94, + 0x8a, 0x81, 0x7a, 0x7a, 0x7d, 0x7a, 0x76, 0x6e, 0x67, 0x60, 0x64, + 0x64, 0x6f, 0x79, 0x82, 0x93, 0x86, 0x80, 0x72, 0x7f, 0x8e, 0x9a, + 0x98, 0x90, 0x8c, 0x89, 0x90, 0x90, 0x93, 0x87, 0x80, 0x7a, 0x7c, + 0x7f, 0x7a, 0x74, 0x6c, 0x69, 0x64, 0x65, 0x66, 0x71, 0x7b, 0x85, + 0x8f, 0x85, 0x7c, 0x76, 0x80, 0x91, 0x9a, 0x98, 0x8f, 0x8a, 0x8a, + 0x91, 0x91, 0x8d, 0x83, 0x7f, 0x7c, 0x7d, 0x7d, 0x78, 0x71, 0x69, + 0x69, 0x66, 0x69, 0x68, 0x77, 0x7d, 0x89, 0x89, 0x80, 0x79, 0x78, + 0x89, 0x91, 0x97, 0x90, 0x8f, 0x8b, 0x8e, 0x8f, 0x8f, 0x8a, 0x84, + 0x82, 0x7f, 0x80, 0x78, 0x75, 0x6e, 0x6e, 0x69, 0x69, 0x66, 0x6a, + 0x77, 0x7e, 0x88, 0x80, 0x7d, 0x78, 0x7e, 0x8a, 0x91, 0x95, 0x8f, + 0x8c, 0x8c, 0x93, 0x93, 0x8f, 0x86, 0x86, 0x84, 0x82, 0x7e, 0x77, + 0x75, 0x71, 0x70, 0x69, 0x66, 0x65, 0x6f, 0x79, 0x80, 0x83, 0x7c, + 0x79, 0x77, 0x83, 0x8b, 0x8f, 0x90, 0x8d, 0x8d, 0x8e, 0x93, 0x90, + 0x8b, 0x88, 0x88, 0x85, 0x81, 0x7b, 0x77, 0x74, 0x71, 0x6d, 0x69, + 0x69, 0x6a, 0x74, 0x79, 0x80, 0x7f, 0x7c, 0x79, 0x7b, 0x87, 0x8d, + 0x91, 0x8d, 0x8d, 0x8c, 0x92, 0x94, 0x8f, 0x8b, 0x87, 0x89, 0x85, + 0x80, 0x78, 0x76, 0x75, 0x72, 0x6a, 0x69, 0x6c, 0x70, 0x75, 0x76, + 0x7d, 0x7c, 0x7b, 0x78, 0x7e, 0x88, 0x8f, 0x90, 0x8c, 0x8c, 0x8f, + 0x94, 0x91, 0x8c, 0x89, 0x89, 0x87, 0x82, 0x7d, 0x78, 0x75, 0x72, + 0x6e, 0x6b, 0x6e, 0x6f, 0x73, 0x75, 0x78, 0x7d, 0x7b, 0x7c, 0x7b, + 0x83, 0x8a, 0x90, 0x8e, 0x8c, 0x8f, 0x92, 0x91, 0x8a, 0x8a, 0x8a, + 0x8a, 0x82, 0x7c, 0x79, 0x77, 0x74, 0x6e, 0x6b, 0x6f, 0x73, 0x72, + 0x72, 0x72, 0x7a, 0x7d, 0x7e, 0x7b, 0x7f, 0x86, 0x8c, 0x8f, 0x8d, + 0x8e, 0x91, 0x93, 0x8c, 0x8a, 0x8a, 0x8b, 0x86, 0x80, 0x7b, 0x7a, + 0x77, 0x73, 0x6d, 0x6e, 0x72, 0x72, 0x72, 0x73, 0x77, 0x7b, 0x7d, + 0x7b, 0x7d, 0x83, 0x8b, 0x8b, 0x8c, 0x8e, 0x90, 0x8e, 0x8b, 0x8c, + 0x8d, 0x8b, 0x84, 0x81, 0x7d, 0x7c, 0x76, 0x74, 0x70, 0x72, 0x73, + 0x72, 0x6f, 0x70, 0x75, 0x7d, 0x81, 0x7d, 0x7b, 0x7f, 0x88, 0x8c, + 0x8f, 0x8c, 0x8c, 0x8c, 0x8e, 0x8c, 0x8a, 0x86, 0x85, 0x83, 0x80, + 0x7b, 0x76, 0x75, 0x74, 0x74, 0x72, 0x72, 0x70, 0x73, 0x76, 0x7c, + 0x7f, 0x7e, 0x7d, 0x81, 0x87, 0x8b, 0x8c, 0x8b, 0x8a, 0x8b, 0x8c, + 0x8a, 0x88, 0x85, 0x83, 0x80, 0x7d, 0x7c, 0x79, 0x76, 0x73, 0x72, + 0x72, 0x72, 0x75, 0x79, 0x7e, 0x7e, 0x7c, 0x7c, 0x82, 0x87, 0x8a, + 0x88, 0x88, 0x8b, 0x8c, 0x8b, 0x88, 0x87, 0x87, 0x85, 0x81, 0x7e, + 0x7d, 0x7b, 0x78, 0x75, 0x74, 0x74, 0x74, 0x74, 0x77, 0x7b, 0x7c, + 0x7c, 0x7c, 0x80, 0x83, 0x85, 0x87, 0x89, 0x89, 0x8a, 0x89, 0x88, + 0x88, 0x88, 0x84, 0x81, 0x7f, 0x7f, 0x7e, 0x7b, 0x78, 0x76, 0x76, + 0x77, 0x77, 0x77, 0x79, 0x7a, 0x7b, 0x7d, 0x80, 0x80, 0x82, 0x84, + 0x87, 0x87, 0x88, 0x87, 0x87, 0x88, 0x87, 0x85, 0x82, 0x81, 0x80, + 0x80, 0x7e, 0x7b, 0x79, 0x79, 0x79, 0x78, 0x78, 0x79, 0x7b, 0x7c, + 0x7c, 0x7c, 0x7e, 0x81, 0x83, 0x83, 0x84, 0x85, 0x86, 0x86, 0x86, + 0x85, 0x85, 0x84, 0x82, 0x80, 0x80, 0x80, 0x7f, 0x7c, 0x7a, 0x7a, + 0x7b, 0x7b, 0x7a, 0x7a, 0x7b, 0x7d, 0x7d, 0x7d, 0x7f, 0x81, 0x82, + 0x82, 0x83, 0x84, 0x85, 0x85, 0x84, 0x83, 0x84, 0x84, 0x82, 0x80, + 0x7f, 0x80, 0x80, 0x7e, 0x7c, 0x7b, 0x7c, 0x7c, 0x7c, 0x7b, 0x7c, + 0x7d, 0x7d, 0x7d, 0x7e, 0x80, 0x81, 0x81, 0x81, 0x82, 0x83, 0x84, + 0x83, 0x82, 0x82, 0x82, 0x82, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7f, + 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + }, + { // 9 + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, + 0x81, 0x80, 0x7f, 0x7f, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7b, 0x7b, + 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7f, 0x7f, 0x80, 0x81, + 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, + 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, + 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, + 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x81, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x81, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x7f, 0x7d, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7d, 0x7e, 0x7e, 0x7f, 0x80, + 0x7f, 0x81, 0x7d, 0x7f, 0x7e, 0x7f, 0x81, 0x80, 0x81, 0x80, 0x80, + 0x7f, 0x80, 0x82, 0x81, 0x82, 0x82, 0x80, 0x81, 0x7f, 0x81, 0x7f, + 0x82, 0x7f, 0x80, 0x7f, 0x7c, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x7c, + 0x7c, 0x7c, 0x7d, 0x7b, 0x80, 0x7c, 0x7e, 0x7d, 0x7e, 0x7c, 0x7f, + 0x7f, 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x82, 0x80, 0x80, + 0x80, 0x81, 0x7e, 0x81, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x7f, 0x80, + 0x7e, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, + 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 0x81, 0x80, 0x7f, 0x82, 0x7e, + 0x80, 0x80, 0x7e, 0x80, 0x7e, 0x80, 0x7d, 0x80, 0x7d, 0x80, 0x7e, + 0x80, 0x7d, 0x81, 0x7e, 0x7d, 0x81, 0x7c, 0x80, 0x7f, 0x7e, 0x80, + 0x7d, 0x81, 0x7e, 0x7d, 0x82, 0x7b, 0x81, 0x7f, 0x7f, 0x7d, 0x83, + 0x7e, 0x7d, 0x85, 0x7b, 0x82, 0x81, 0x7f, 0x7f, 0x81, 0x82, 0x7a, + 0x87, 0x7c, 0x82, 0x80, 0x82, 0x7d, 0x80, 0x85, 0x76, 0x8a, 0x79, + 0x83, 0x7d, 0x81, 0x80, 0x7a, 0x87, 0x78, 0x80, 0x83, 0x7a, 0x7f, + 0x82, 0x7b, 0x7d, 0x83, 0x7c, 0x7b, 0x86, 0x78, 0x7f, 0x81, 0x7d, + 0x7b, 0x83, 0x7c, 0x7c, 0x83, 0x7d, 0x7c, 0x83, 0x7e, 0x7c, 0x84, + 0x7b, 0x82, 0x7e, 0x83, 0x7c, 0x84, 0x7e, 0x82, 0x7e, 0x82, 0x82, + 0x7b, 0x87, 0x7c, 0x80, 0x82, 0x7f, 0x7e, 0x84, 0x7e, 0x7f, 0x80, + 0x83, 0x79, 0x84, 0x80, 0x79, 0x86, 0x7c, 0x7d, 0x83, 0x7d, 0x7d, + 0x80, 0x80, 0x79, 0x84, 0x7b, 0x7e, 0x80, 0x7c, 0x7f, 0x7e, 0x80, + 0x7b, 0x82, 0x7b, 0x81, 0x7d, 0x81, 0x7c, 0x81, 0x7c, 0x7f, 0x81, + 0x7c, 0x80, 0x82, 0x7b, 0x83, 0x7e, 0x7e, 0x82, 0x7c, 0x83, 0x7c, + 0x85, 0x7a, 0x85, 0x7e, 0x81, 0x81, 0x81, 0x82, 0x7d, 0x86, 0x7a, + 0x85, 0x7f, 0x80, 0x84, 0x7b, 0x83, 0x7e, 0x7e, 0x81, 0x7b, 0x82, + 0x7c, 0x7f, 0x7f, 0x7b, 0x81, 0x79, 0x84, 0x78, 0x84, 0x7a, 0x7e, + 0x80, 0x7a, 0x84, 0x7a, 0x84, 0x7d, 0x7c, 0x81, 0x7c, 0x7c, 0x82, + 0x7b, 0x82, 0x7b, 0x84, 0x78, 0x86, 0x79, 0x82, 0x81, 0x7f, 0x80, + 0x7f, 0x86, 0x75, 0x8c, 0x7b, 0x81, 0x84, 0x7d, 0x81, 0x81, 0x7b, + 0x83, 0x7d, 0x82, 0x7d, 0x83, 0x82, 0x7c, 0x84, 0x7e, 0x80, 0x82, + 0x7b, 0x89, 0x78, 0x83, 0x7f, 0x7e, 0x80, 0x7b, 0x87, 0x75, 0x88, + 0x75, 0x82, 0x7d, 0x7c, 0x80, 0x82, 0x7e, 0x7f, 0x84, 0x7b, 0x81, + 0x7f, 0x80, 0x7f, 0x81, 0x80, 0x7b, 0x86, 0x76, 0x85, 0x7b, 0x7f, + 0x83, 0x77, 0x84, 0x7a, 0x80, 0x7a, 0x88, 0x78, 0x88, 0x7c, 0x86, + 0x7c, 0x84, 0x80, 0x83, 0x82, 0x7f, 0x88, 0x7a, 0x8a, 0x7c, 0x85, + 0x80, 0x84, 0x78, 0x88, 0x7a, 0x7e, 0x84, 0x7b, 0x81, 0x7c, 0x80, + 0x7c, 0x7c, 0x80, 0x7b, 0x80, 0x7a, 0x7f, 0x7c, 0x7c, 0x84, 0x7b, + 0x85, 0x7f, 0x81, 0x7c, 0x85, 0x7a, 0x86, 0x7f, 0x82, 0x82, 0x7f, + 0x81, 0x7f, 0x80, 0x7e, 0x84, 0x7b, 0x81, 0x7f, 0x7a, 0x80, 0x80, + 0x7a, 0x88, 0x7a, 0x7f, 0x81, 0x7a, 0x7c, 0x82, 0x78, 0x80, 0x7f, + 0x7a, 0x7f, 0x7a, 0x7c, 0x81, 0x75, 0x80, 0x82, 0x73, 0x82, 0x7d, + 0x7a, 0x7d, 0x84, 0x77, 0x84, 0x7a, 0x7e, 0x81, 0x7a, 0x7c, 0x84, + 0x7a, 0x80, 0x86, 0x7a, 0x84, 0x82, 0x7b, 0x84, 0x82, 0x78, 0x8a, + 0x78, 0x7e, 0x85, 0x76, 0x82, 0x80, 0x7c, 0x7f, 0x85, 0x76, 0x82, + 0x83, 0x73, 0x8d, 0x7a, 0x7d, 0x89, 0x76, 0x81, 0x7d, 0x7e, 0x7c, + 0x7d, 0x83, 0x76, 0x85, 0x75, 0x89, 0x77, 0x81, 0x88, 0x76, 0x87, + 0x7d, 0x80, 0x7f, 0x85, 0x7a, 0x84, 0x84, 0x72, 0x89, 0x7f, 0x6f, + 0x8e, 0x73, 0x7a, 0x82, 0x79, 0x78, 0x87, 0x76, 0x80, 0x86, 0x77, + 0x85, 0x82, 0x7c, 0x86, 0x81, 0x7b, 0x8c, 0x74, 0x89, 0x7b, 0x81, + 0x81, 0x7d, 0x81, 0x7c, 0x84, 0x75, 0x8b, 0x7b, 0x7c, 0x8b, 0x7c, + 0x7e, 0x87, 0x80, 0x7c, 0x8b, 0x78, 0x84, 0x80, 0x78, 0x84, 0x73, + 0x83, 0x73, 0x80, 0x76, 0x7b, 0x78, 0x79, 0x80, 0x75, 0x87, 0x78, + 0x83, 0x7c, 0x85, 0x77, 0x87, 0x7a, 0x80, 0x81, 0x7e, 0x7f, 0x7f, + 0x82, 0x7b, 0x8b, 0x76, 0x8e, 0x7c, 0x83, 0x84, 0x82, 0x7e, 0x85, + 0x7e, 0x7c, 0x85, 0x77, 0x83, 0x7d, 0x80, 0x7a, 0x87, 0x77, 0x86, + 0x7f, 0x7c, 0x89, 0x73, 0x8c, 0x74, 0x84, 0x7e, 0x7a, 0x85, 0x76, + 0x88, 0x76, 0x88, 0x7b, 0x81, 0x86, 0x79, 0x89, 0x7d, 0x82, 0x80, + 0x84, 0x7a, 0x81, 0x81, 0x74, 0x84, 0x77, 0x79, 0x7c, 0x77, 0x77, + 0x78, 0x77, 0x76, 0x77, 0x77, 0x78, 0x76, 0x79, 0x7c, 0x77, 0x82, + 0x82, 0x80, 0x8e, 0x88, 0x91, 0x91, 0x97, 0x98, 0x98, 0xa0, 0x98, + 0x9b, 0x9a, 0x93, 0x8f, 0x8b, 0x80, 0x7c, 0x72, 0x6e, 0x62, 0x5f, + 0x5b, 0x50, 0x57, 0x4c, 0x54, 0x51, 0x56, 0x58, 0x60, 0x66, 0x6e, + 0x7c, 0x7d, 0x94, 0x91, 0xa3, 0xa8, 0xae, 0xb9, 0xb6, 0xbe, 0xb8, + 0xb7, 0xb1, 0xab, 0x9e, 0x98, 0x90, 0x80, 0x80, 0x71, 0x70, 0x69, + 0x66, 0x64, 0x5c, 0x5f, 0x57, 0x56, 0x4f, 0x54, 0x47, 0x4e, 0x4d, + 0x49, 0x55, 0x58, 0x62, 0x6d, 0x84, 0x87, 0xa2, 0xaa, 0xb4, 0xc3, + 0xc3, 0xc9, 0xc4, 0xc3, 0xb4, 0xb0, 0x9e, 0x97, 0x88, 0x7c, 0x7a, + 0x6d, 0x6d, 0x6e, 0x6b, 0x6c, 0x74, 0x6c, 0x72, 0x6d, 0x68, 0x66, + 0x5d, 0x59, 0x55, 0x4e, 0x48, 0x4f, 0x47, 0x52, 0x63, 0x60, 0x82, + 0x86, 0x98, 0xaf, 0xaf, 0xc5, 0xc4, 0xc8, 0xc8, 0xbf, 0xb4, 0xa9, + 0x99, 0x89, 0x82, 0x70, 0x6f, 0x67, 0x66, 0x65, 0x6f, 0x70, 0x72, + 0x86, 0x71, 0x87, 0x7b, 0x73, 0x77, 0x65, 0x61, 0x5a, 0x50, 0x46, + 0x4b, 0x44, 0x4a, 0x61, 0x61, 0x77, 0x94, 0x8d, 0xb4, 0xb7, 0xbd, + 0xce, 0xc5, 0xc4, 0xbf, 0xb3, 0xa1, 0x9e, 0x83, 0x80, 0x76, 0x66, + 0x6a, 0x62, 0x64, 0x6e, 0x71, 0x7e, 0x83, 0x86, 0x89, 0x82, 0x80, + 0x76, 0x6e, 0x66, 0x5e, 0x51, 0x50, 0x47, 0x3d, 0x49, 0x48, 0x4e, + 0x6d, 0x73, 0x84, 0xa4, 0xa4, 0xb9, 0xc4, 0xc4, 0xc8, 0xc7, 0xbb, + 0xb6, 0xa6, 0x97, 0x8b, 0x7a, 0x72, 0x6c, 0x66, 0x66, 0x69, 0x69, + 0x75, 0x7a, 0x81, 0x8c, 0x8b, 0x8c, 0x90, 0x81, 0x7f, 0x74, 0x67, + 0x63, 0x57, 0x52, 0x4c, 0x49, 0x43, 0x47, 0x4e, 0x52, 0x61, 0x7f, + 0x78, 0x9f, 0xae, 0xa6, 0xc9, 0xbc, 0xbf, 0xc3, 0xb8, 0xad, 0xa8, + 0x97, 0x89, 0x82, 0x73, 0x71, 0x6b, 0x69, 0x71, 0x71, 0x77, 0x80, + 0x82, 0x89, 0x8f, 0x8e, 0x8d, 0x8b, 0x7d, 0x76, 0x6f, 0x5e, 0x5d, + 0x55, 0x53, 0x51, 0x4b, 0x52, 0x4d, 0x4e, 0x63, 0x56, 0x75, 0x89, + 0x75, 0xb1, 0xa1, 0xad, 0xc7, 0xb5, 0xc1, 0xbc, 0xb5, 0xa5, 0xa5, + 0x90, 0x82, 0x82, 0x6f, 0x72, 0x70, 0x70, 0x75, 0x78, 0x7f, 0x85, + 0x87, 0x8c, 0x8f, 0x8b, 0x88, 0x87, 0x79, 0x75, 0x6e, 0x63, 0x62, + 0x5e, 0x5b, 0x5e, 0x5d, 0x59, 0x5e, 0x58, 0x54, 0x5c, 0x59, 0x64, + 0x89, 0x74, 0x9b, 0xb0, 0x99, 0xc4, 0xb8, 0xb7, 0xc0, 0xae, 0xa5, + 0x9f, 0x93, 0x81, 0x7e, 0x77, 0x6c, 0x72, 0x71, 0x76, 0x7c, 0x81, + 0x88, 0x8b, 0x8d, 0x8a, 0x85, 0x83, 0x79, 0x76, 0x74, 0x71, 0x6b, + 0x69, 0x6c, 0x67, 0x6c, 0x65, 0x68, 0x66, 0x63, 0x5e, 0x57, 0x5a, + 0x5c, 0x4f, 0x7d, 0x7a, 0x81, 0xb7, 0x9e, 0xb8, 0xc3, 0xbc, 0xbe, + 0xb5, 0xab, 0x97, 0x91, 0x7d, 0x70, 0x76, 0x6a, 0x6e, 0x77, 0x7a, + 0x84, 0x86, 0x8e, 0x90, 0x8d, 0x8e, 0x83, 0x79, 0x74, 0x6e, 0x69, + 0x6f, 0x6c, 0x71, 0x77, 0x71, 0x79, 0x74, 0x71, 0x71, 0x65, 0x66, + 0x54, 0x5a, 0x4a, 0x50, 0x59, 0x5d, 0x92, 0x7a, 0xb0, 0xbb, 0xad, + 0xca, 0xb7, 0xbb, 0xae, 0x9f, 0x93, 0x7e, 0x7e, 0x6e, 0x6f, 0x78, + 0x78, 0x85, 0x89, 0x91, 0x93, 0x91, 0x92, 0x8a, 0x82, 0x79, 0x71, + 0x69, 0x64, 0x6c, 0x6b, 0x78, 0x7a, 0x80, 0x7f, 0x7f, 0x7d, 0x73, + 0x6e, 0x62, 0x5a, 0x5b, 0x50, 0x51, 0x49, 0x50, 0x64, 0x6f, 0x9c, + 0x97, 0xbc, 0xc3, 0xb6, 0xc2, 0xab, 0xa6, 0x99, 0x8a, 0x83, 0x74, + 0x7c, 0x79, 0x7a, 0x89, 0x87, 0x92, 0x93, 0x93, 0x8d, 0x85, 0x80, + 0x78, 0x71, 0x71, 0x69, 0x6c, 0x6f, 0x75, 0x7b, 0x80, 0x89, 0x82, + 0x80, 0x7d, 0x73, 0x6c, 0x6b, 0x64, 0x60, 0x57, 0x64, 0x5b, 0x61, + 0x5f, 0x5b, 0x6a, 0x7b, 0x9e, 0x96, 0xb3, 0xb3, 0xae, 0xaf, 0xa0, + 0x9d, 0x8e, 0x8c, 0x88, 0x82, 0x8a, 0x87, 0x8c, 0x8d, 0x8c, 0x8e, + 0x86, 0x8b, 0x80, 0x7c, 0x7c, 0x74, 0x74, 0x73, 0x78, 0x79, 0x76, + 0x7c, 0x7e, 0x80, 0x7e, 0x77, 0x78, 0x73, 0x6e, 0x69, 0x68, 0x6b, + 0x6a, 0x6e, 0x67, 0x66, 0x66, 0x65, 0x5a, 0x53, 0x65, 0x8b, 0x96, + 0x9a, 0xb7, 0xb5, 0xaf, 0xa4, 0xa3, 0x98, 0x89, 0x89, 0x88, 0x85, + 0x84, 0x8b, 0x91, 0x8f, 0x90, 0x8b, 0x86, 0x85, 0x7b, 0x79, 0x76, + 0x78, 0x77, 0x79, 0x78, 0x7c, 0x7e, 0x7d, 0x7a, 0x7b, 0x75, 0x76, + 0x70, 0x6f, 0x72, 0x70, 0x71, 0x71, 0x73, 0x6f, 0x6f, 0x68, 0x63, + 0x62, 0x61, 0x5f, 0x5d, 0x57, 0x92, 0xa1, 0xa6, 0xb8, 0xb9, 0xbc, + 0x97, 0x97, 0x90, 0x88, 0x81, 0x82, 0x91, 0x89, 0x92, 0x93, 0x94, + 0x96, 0x85, 0x86, 0x7a, 0x74, 0x73, 0x71, 0x74, 0x77, 0x7e, 0x7d, + 0x80, 0x7d, 0x7c, 0x78, 0x70, 0x7a, 0x79, 0x7a, 0x76, 0x75, 0x78, + 0x73, 0x73, 0x70, 0x70, 0x6b, 0x65, 0x5f, 0x5f, 0x61, 0x5a, 0x55, + 0x5e, 0x8a, 0xae, 0xa8, 0xaf, 0xb3, 0xb2, 0x98, 0x82, 0x86, 0x82, + 0x89, 0x85, 0x92, 0x9a, 0x98, 0x98, 0x91, 0x90, 0x84, 0x79, 0x73, + 0x73, 0x78, 0x79, 0x7d, 0x81, 0x83, 0x80, 0x7b, 0x77, 0x72, 0x73, + 0x73, 0x7b, 0x79, 0x7d, 0x83, 0x81, 0x84, 0x7a, 0x7c, 0x75, 0x71, + 0x70, 0x6d, 0x70, 0x6f, 0x6a, 0x69, 0x6b, 0x6e, 0x6f, 0x6c, 0x66, + 0x6e, 0x81, 0x91, 0xa5, 0xa8, 0xab, 0xa5, 0x9b, 0x91, 0x88, 0x8a, + 0x8a, 0x8e, 0x8f, 0x92, 0x94, 0x8f, 0x8a, 0x84, 0x82, 0x7b, 0x74, + 0x77, 0x7b, 0x7f, 0x7e, 0x7f, 0x7e, 0x7c, 0x78, 0x77, 0x74, 0x76, + 0x77, 0x81, 0x87, 0x88, 0x82, 0x77, 0x75, 0x6f, 0x70, 0x6c, 0x6f, + 0x71, 0x6f, 0x66, 0x62, 0x66, 0x6a, 0x64, 0x5a, 0x60, 0x74, 0xa3, + 0xb4, 0xb1, 0xa4, 0x9f, 0x9d, 0x85, 0x79, 0x7b, 0x90, 0x9a, 0x99, + 0x93, 0x96, 0x98, 0x90, 0x83, 0x77, 0x77, 0x79, 0x79, 0x79, 0x7c, + 0x82, 0x82, 0x7c, 0x79, 0x76, 0x75, 0x74, 0x76, 0x76, 0x7a, 0x7c, + 0x7f, 0x82, 0x7f, 0x84, 0x7f, 0x82, 0x81, 0x7e, 0x7b, 0x71, 0x75, + 0x74, 0x7a, 0x78, 0x74, 0x77, 0x71, 0x6e, 0x65, 0x66, 0x6b, 0x6e, + 0x6f, 0x6e, 0x7c, 0x90, 0xa8, 0xb1, 0xaa, 0x9d, 0x8f, 0x89, 0x83, + 0x82, 0x88, 0x92, 0x99, 0x99, 0x92, 0x8c, 0x85, 0x80, 0x7d, 0x7b, + 0x7c, 0x7b, 0x7e, 0x7f, 0x7f, 0x7c, 0x7a, 0x79, 0x79, 0x77, 0x74, + 0x76, 0x78, 0x7c, 0x7b, 0x7c, 0x81, 0x86, 0x88, 0x82, 0x7c, 0x75, + 0x73, 0x70, 0x72, 0x77, 0x79, 0x79, 0x71, 0x6e, 0x68, 0x69, 0x6b, + 0x69, 0x64, 0x60, 0x75, 0x9a, 0xb8, 0xba, 0xa5, 0x8f, 0x86, 0x83, + 0x7f, 0x7d, 0x85, 0x95, 0xa1, 0x9f, 0x93, 0x88, 0x84, 0x83, 0x7d, + 0x77, 0x76, 0x7d, 0x83, 0x83, 0x7f, 0x7c, 0x7b, 0x7c, 0x7a, 0x76, + 0x73, 0x74, 0x7b, 0x7d, 0x7c, 0x77, 0x77, 0x79, 0x7a, 0x7a, 0x79, + 0x7b, 0x7d, 0x83, 0x87, 0x8c, 0x8a, 0x84, 0x7c, 0x74, 0x73, 0x74, + 0x7b, 0x7e, 0x7f, 0x7c, 0x76, 0x6f, 0x69, 0x6a, 0x6f, 0x72, 0x72, + 0x6e, 0x75, 0x87, 0xa5, 0xb4, 0xac, 0x95, 0x7e, 0x7c, 0x7d, 0x84, + 0x83, 0x8a, 0x94, 0x9b, 0x99, 0x8b, 0x7f, 0x76, 0x79, 0x7b, 0x7c, + 0x7c, 0x7c, 0x80, 0x82, 0x81, 0x7c, 0x78, 0x77, 0x78, 0x79, 0x78, + 0x77, 0x78, 0x79, 0x7d, 0x7d, 0x7b, 0x7a, 0x7d, 0x80, 0x80, 0x7c, + 0x7c, 0x7e, 0x81, 0x82, 0x83, 0x8b, 0x8e, 0x8c, 0x7a, 0x6f, 0x6c, + 0x7a, 0x86, 0x89, 0x84, 0x7c, 0x7b, 0x77, 0x75, 0x6d, 0x6c, 0x6e, + 0x76, 0x78, 0x72, 0x69, 0x6f, 0x8d, 0xae, 0xbc, 0xa6, 0x85, 0x6f, + 0x73, 0x82, 0x89, 0x8a, 0x86, 0x8d, 0x94, 0x95, 0x8a, 0x7a, 0x75, + 0x76, 0x7e, 0x7f, 0x7c, 0x7a, 0x7a, 0x7f, 0x82, 0x81, 0x7c, 0x76, + 0x76, 0x79, 0x7c, 0x7a, 0x78, 0x78, 0x7b, 0x7f, 0x80, 0x7f, 0x7b, + 0x7a, 0x7c, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x82, 0x82, 0x80, 0x7f, + 0x7f, 0x81, 0x81, 0x80, 0x7f, 0x80, 0x83, 0x83, 0x83, 0x82, 0x81, + 0x82, 0x82, 0x83, 0x81, 0x81, 0x80, 0x85, 0x8a, 0x8a, 0x89, 0x82, + 0x7e, 0x76, 0x76, 0x75, 0x7a, 0x7e, 0x7f, 0x7e, 0x79, 0x75, 0x70, + 0x6f, 0x6e, 0x6f, 0x71, 0x75, 0x76, 0x75, 0x71, 0x78, 0x87, 0x9d, + 0xa7, 0xa1, 0x8f, 0x7a, 0x74, 0x79, 0x85, 0x8c, 0x8c, 0x8a, 0x8a, + 0x8d, 0x8b, 0x85, 0x7a, 0x74, 0x74, 0x7a, 0x81, 0x83, 0x83, 0x80, + 0x7f, 0x7f, 0x7e, 0x7b, 0x76, 0x71, 0x74, 0x79, 0x7f, 0x81, 0x7f, + 0x7d, 0x7a, 0x7a, 0x7c, 0x7c, 0x7d, 0x7b, 0x7d, 0x7f, 0x82, 0x83, + 0x81, 0x7f, 0x7d, 0x7e, 0x80, 0x82, 0x81, 0x7f, 0x7e, 0x80, 0x82, + 0x84, 0x82, 0x81, 0x7f, 0x7f, 0x7f, 0x82, 0x80, 0x81, 0x7e, 0x81, + 0x80, 0x81, 0x7e, 0x83, 0x80, 0x83, 0x7f, 0x87, 0x93, 0x94, 0x92, + 0x76, 0x6e, 0x64, 0x77, 0x7f, 0x89, 0x82, 0x78, 0x6e, 0x66, 0x6d, + 0x6c, 0x73, 0x71, 0x70, 0x6e, 0x69, 0x76, 0x8c, 0xa8, 0xb7, 0xa8, + 0x8f, 0x6f, 0x69, 0x6e, 0x86, 0x93, 0x99, 0x91, 0x88, 0x88, 0x87, + 0x89, 0x7e, 0x76, 0x6d, 0x70, 0x79, 0x85, 0x8b, 0x87, 0x80, 0x79, + 0x79, 0x7a, 0x7a, 0x75, 0x72, 0x73, 0x7a, 0x82, 0x86, 0x84, 0x7d, + 0x77, 0x76, 0x78, 0x7c, 0x7e, 0x7d, 0x7d, 0x7d, 0x80, 0x83, 0x84, + 0x81, 0x7e, 0x7b, 0x7c, 0x7f, 0x81, 0x81, 0x80, 0x7e, 0x7e, 0x7f, + 0x81, 0x82, 0x81, 0x81, 0x80, 0x81, 0x80, 0x82, 0x82, 0x82, 0x82, + 0x80, 0x81, 0x81, 0x82, 0x82, 0x81, 0x7f, 0x7e, 0x7f, 0x80, 0x82, + 0x82, 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x81, 0x80, 0x7e, 0x7e, 0x7f, + 0x84, 0x86, 0x89, 0x86, 0x81, 0x7b, 0x78, 0x7b, 0x7d, 0x82, 0x81, + 0x80, 0x7b, 0x79, 0x76, 0x75, 0x76, 0x75, 0x76, 0x75, 0x76, 0x75, + 0x77, 0x76, 0x76, 0x74, 0x74, 0x79, 0x84, 0x95, 0xa2, 0xa8, 0x9c, + 0x8c, 0x78, 0x72, 0x75, 0x82, 0x8e, 0x92, 0x8f, 0x88, 0x85, 0x83, + 0x83, 0x80, 0x7c, 0x76, 0x73, 0x74, 0x7a, 0x81, 0x86, 0x84, 0x80, + 0x79, 0x75, 0x74, 0x76, 0x79, 0x7b, 0x7c, 0x7c, 0x7e, 0x7f, 0x81, + 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, 0x7f, 0x80, 0x82, 0x81, 0x81, 0x7f, + 0x80, 0x81, 0x81, 0x82, 0x81, 0x86, 0x87, 0x8b, 0x84, 0x7f, 0x77, + 0x76, 0x78, 0x7d, 0x84, 0x84, 0x82, 0x7a, 0x77, 0x74, 0x77, 0x79, + 0x79, 0x78, 0x76, 0x76, 0x76, 0x79, 0x78, 0x76, 0x72, 0x72, 0x7d, + 0x8f, 0xa4, 0xab, 0xa6, 0x91, 0x7c, 0x6f, 0x70, 0x7c, 0x89, 0x92, + 0x8f, 0x88, 0x7f, 0x7d, 0x7f, 0x83, 0x81, 0x7c, 0x75, 0x72, 0x74, + 0x7b, 0x83, 0x87, 0x86, 0x80, 0x79, 0x75, 0x75, 0x78, 0x7d, 0x7f, + 0x80, 0x7e, 0x7e, 0x7f, 0x80, 0x82, 0x81, 0x80, 0x7c, 0x7f, 0x82, + 0x88, 0x89, 0x86, 0x80, 0x79, 0x78, 0x79, 0x80, 0x83, 0x85, 0x80, + 0x7b, 0x76, 0x76, 0x77, 0x79, 0x7a, 0x78, 0x76, 0x73, 0x73, 0x76, + 0x77, 0x78, 0x74, 0x76, 0x80, 0x93, 0xa7, 0xaf, 0xaa, 0x94, 0x7e, + 0x6d, 0x6e, 0x78, 0x88, 0x93, 0x93, 0x8c, 0x82, 0x7e, 0x7d, 0x80, + 0x81, 0x7e, 0x79, 0x72, 0x72, 0x75, 0x7e, 0x85, 0x88, 0x84, 0x7d, + 0x77, 0x75, 0x76, 0x7a, 0x7d, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x80, + 0x81, 0x88, 0x89, 0x8c, 0x85, 0x7f, 0x76, 0x72, 0x76, 0x7b, 0x85, + 0x86, 0x87, 0x7c, 0x77, 0x71, 0x71, 0x73, 0x73, 0x76, 0x73, 0x76, + 0x72, 0x72, 0x6f, 0x75, 0x84, 0x98, 0xad, 0xb2, 0xac, 0x94, 0x7f, + 0x6d, 0x6d, 0x7a, 0x88, 0x94, 0x94, 0x8f, 0x84, 0x80, 0x7e, 0x81, + 0x82, 0x7f, 0x79, 0x72, 0x70, 0x74, 0x7d, 0x85, 0x89, 0x86, 0x80, + 0x77, 0x73, 0x74, 0x78, 0x7e, 0x81, 0x84, 0x84, 0x86, 0x85, 0x84, + 0x80, 0x7c, 0x78, 0x77, 0x7a, 0x7d, 0x81, 0x82, 0x81, 0x7d, 0x7a, + 0x77, 0x75, 0x74, 0x72, 0x71, 0x72, 0x72, 0x76, 0x75, 0x74, 0x70, + 0x77, 0x85, 0x9d, 0xb0, 0xb7, 0xaf, 0x96, 0x7f, 0x6c, 0x6d, 0x75, + 0x86, 0x91, 0x96, 0x92, 0x89, 0x84, 0x80, 0x80, 0x7f, 0x7d, 0x78, + 0x74, 0x70, 0x73, 0x78, 0x80, 0x86, 0x87, 0x85, 0x7f, 0x7b, 0x78, + 0x7b, 0x7d, 0x81, 0x82, 0x80, 0x7d, 0x7a, 0x7b, 0x7c, 0x7f, 0x7f, + 0x7e, 0x7b, 0x78, 0x74, 0x72, 0x72, 0x71, 0x73, 0x74, 0x76, 0x76, + 0x73, 0x70, 0x6f, 0x7a, 0x8d, 0xa8, 0xb9, 0xbe, 0xae, 0x94, 0x7a, + 0x69, 0x6b, 0x76, 0x88, 0x93, 0x96, 0x8f, 0x87, 0x7f, 0x7c, 0x7d, + 0x7e, 0x7e, 0x7b, 0x76, 0x72, 0x73, 0x78, 0x80, 0x89, 0x8f, 0x8f, + 0x88, 0x7d, 0x72, 0x6c, 0x6d, 0x74, 0x7e, 0x84, 0x86, 0x80, 0x79, + 0x72, 0x6e, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x6d, 0x6c, 0x6c, 0x78, + 0x8c, 0xa9, 0xbe, 0xc6, 0xb9, 0x9d, 0x81, 0x6b, 0x69, 0x71, 0x83, + 0x90, 0x98, 0x95, 0x8f, 0x87, 0x82, 0x7f, 0x7e, 0x7c, 0x79, 0x75, + 0x73, 0x77, 0x7e, 0x88, 0x8c, 0x8c, 0x84, 0x79, 0x6f, 0x6b, 0x6d, + 0x72, 0x78, 0x79, 0x77, 0x71, 0x6d, 0x6a, 0x6c, 0x6e, 0x6f, 0x6b, + 0x67, 0x6b, 0x7d, 0x9c, 0xbb, 0xcd, 0xc8, 0xb1, 0x8f, 0x74, 0x68, + 0x6d, 0x7b, 0x89, 0x93, 0x93, 0x8f, 0x8b, 0x89, 0x88, 0x87, 0x83, + 0x7d, 0x77, 0x72, 0x73, 0x79, 0x82, 0x88, 0x89, 0x84, 0x7c, 0x75, + 0x70, 0x71, 0x72, 0x74, 0x73, 0x71, 0x6d, 0x6a, 0x6a, 0x6b, 0x6c, + 0x69, 0x66, 0x69, 0x77, 0x91, 0xaf, 0xc6, 0xca, 0xb9, 0x9c, 0x7e, + 0x6e, 0x6d, 0x79, 0x85, 0x8e, 0x90, 0x8d, 0x8a, 0x8a, 0x8d, 0x8e, + 0x8a, 0x82, 0x79, 0x71, 0x6f, 0x70, 0x7a, 0x82, 0x8c, 0x8c, 0x89, + 0x7d, 0x72, 0x6c, 0x68, 0x6d, 0x6e, 0x74, 0x71, 0x70, 0x69, 0x67, + 0x65, 0x64, 0x63, 0x66, 0x73, 0x8a, 0xa9, 0xc0, 0xca, 0xbe, 0xa7, + 0x89, 0x76, 0x6e, 0x75, 0x7f, 0x8a, 0x8d, 0x8c, 0x89, 0x89, 0x8e, + 0x91, 0x91, 0x8a, 0x7f, 0x73, 0x6d, 0x6d, 0x77, 0x80, 0x8a, 0x89, + 0x87, 0x7b, 0x74, 0x6e, 0x6f, 0x70, 0x71, 0x71, 0x6c, 0x6a, 0x64, + 0x65, 0x61, 0x63, 0x60, 0x69, 0x78, 0x96, 0xb3, 0xc9, 0xcc, 0xba, + 0x9f, 0x80, 0x72, 0x70, 0x7c, 0x86, 0x8d, 0x8b, 0x86, 0x83, 0x85, + 0x8d, 0x93, 0x96, 0x8d, 0x82, 0x72, 0x6c, 0x6a, 0x75, 0x80, 0x8a, + 0x8c, 0x86, 0x7d, 0x71, 0x6f, 0x6c, 0x73, 0x72, 0x74, 0x6d, 0x68, + 0x63, 0x61, 0x61, 0x61, 0x62, 0x66, 0x78, 0x92, 0xb1, 0xc7, 0xcd, + 0xbe, 0xa4, 0x86, 0x74, 0x70, 0x79, 0x85, 0x8d, 0x8c, 0x87, 0x81, + 0x81, 0x87, 0x90, 0x95, 0x92, 0x87, 0x79, 0x6e, 0x6d, 0x74, 0x7f, + 0x88, 0x88, 0x82, 0x77, 0x6f, 0x6d, 0x72, 0x78, 0x7b, 0x78, 0x6f, + 0x65, 0x5f, 0x5d, 0x5f, 0x61, 0x61, 0x65, 0x71, 0x8b, 0xa8, 0xc3, + 0xce, 0xc5, 0xad, 0x8e, 0x79, 0x70, 0x77, 0x82, 0x8d, 0x8f, 0x8a, + 0x82, 0x7e, 0x82, 0x8a, 0x92, 0x93, 0x8c, 0x80, 0x74, 0x6f, 0x73, + 0x7d, 0x87, 0x8b, 0x85, 0x79, 0x6d, 0x67, 0x6a, 0x73, 0x7a, 0x7b, + 0x73, 0x69, 0x5f, 0x5b, 0x5b, 0x5e, 0x61, 0x65, 0x72, 0x85, 0xa4, + 0xbb, 0xcc, 0xc7, 0xb6, 0x9b, 0x84, 0x78, 0x77, 0x80, 0x88, 0x8e, + 0x8c, 0x87, 0x81, 0x82, 0x85, 0x8b, 0x8c, 0x8a, 0x83, 0x7a, 0x73, + 0x70, 0x77, 0x82, 0x8e, 0x91, 0x87, 0x76, 0x63, 0x5e, 0x61, 0x71, + 0x7a, 0x7f, 0x76, 0x69, 0x5d, 0x56, 0x5a, 0x5d, 0x66, 0x6b, 0x79, + 0x87, 0xa0, 0xb5, 0xc4, 0xc4, 0xb7, 0xa2, 0x8a, 0x7e, 0x79, 0x81, + 0x87, 0x8e, 0x8d, 0x8a, 0x85, 0x82, 0x84, 0x86, 0x88, 0x86, 0x82, + 0x7b, 0x76, 0x73, 0x78, 0x81, 0x8c, 0x90, 0x87, 0x78, 0x65, 0x5e, + 0x5d, 0x6a, 0x73, 0x79, 0x73, 0x69, 0x5e, 0x58, 0x5b, 0x60, 0x6a, + 0x70, 0x7c, 0x88, 0x9d, 0xae, 0xbc, 0xbe, 0xb5, 0xa4, 0x91, 0x86, + 0x81, 0x85, 0x89, 0x8e, 0x8d, 0x8a, 0x87, 0x85, 0x84, 0x85, 0x85, + 0x83, 0x80, 0x7a, 0x78, 0x75, 0x79, 0x80, 0x88, 0x8c, 0x86, 0x7b, + 0x6c, 0x64, 0x61, 0x67, 0x6e, 0x73, 0x6e, 0x66, 0x5d, 0x5a, 0x5d, + 0x64, 0x6d, 0x74, 0x79, 0x83, 0x91, 0xa4, 0xb3, 0xbb, 0xb8, 0xab, + 0x9a, 0x8b, 0x85, 0x85, 0x8a, 0x8c, 0x8e, 0x8a, 0x88, 0x85, 0x85, + 0x85, 0x85, 0x84, 0x80, 0x7d, 0x78, 0x77, 0x75, 0x7c, 0x81, 0x88, + 0x87, 0x82, 0x76, 0x6a, 0x64, 0x63, 0x69, 0x6b, 0x6e, 0x66, 0x61, + 0x5b, 0x5d, 0x62, 0x6c, 0x75, 0x7b, 0x83, 0x8c, 0x9a, 0xa8, 0xb2, + 0xb4, 0xad, 0xa0, 0x92, 0x8a, 0x87, 0x89, 0x8d, 0x8d, 0x8c, 0x88, + 0x85, 0x84, 0x85, 0x86, 0x85, 0x82, 0x7e, 0x79, 0x77, 0x76, 0x79, + 0x7d, 0x81, 0x83, 0x83, 0x7e, 0x77, 0x6f, 0x6a, 0x68, 0x6a, 0x6b, + 0x6a, 0x65, 0x60, 0x5d, 0x60, 0x65, 0x6d, 0x74, 0x7b, 0x7e, 0x86, + 0x90, 0x9d, 0xaa, 0xaf, 0xae, 0xa2, 0x98, 0x8c, 0x89, 0x89, 0x8d, + 0x8e, 0x8d, 0x88, 0x84, 0x83, 0x84, 0x86, 0x87, 0x86, 0x80, 0x7d, + 0x78, 0x78, 0x78, 0x7b, 0x7c, 0x7d, 0x7c, 0x7b, 0x7a, 0x78, 0x76, + 0x73, 0x71, 0x6d, 0x6c, 0x6a, 0x69, 0x68, 0x66, 0x66, 0x67, 0x6a, + 0x6e, 0x73, 0x7a, 0x81, 0x8a, 0x93, 0x9e, 0xa5, 0xa7, 0xa4, 0x9d, + 0x96, 0x8e, 0x8c, 0x8a, 0x8c, 0x8a, 0x88, 0x85, 0x83, 0x82, 0x83, + 0x85, 0x85, 0x85, 0x82, 0x7f, 0x7b, 0x7a, 0x78, 0x78, 0x78, 0x77, + 0x77, 0x77, 0x77, 0x78, 0x77, 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, + 0x72, 0x72, 0x71, 0x72, 0x72, 0x73, 0x74, 0x76, 0x78, 0x7b, 0x7d, + 0x80, 0x82, 0x88, 0x8f, 0x97, 0x9e, 0xa0, 0x9f, 0x99, 0x93, 0x8d, + 0x8b, 0x8a, 0x8a, 0x89, 0x86, 0x82, 0x7e, 0x7d, 0x7e, 0x80, 0x81, + 0x81, 0x7f, 0x7c, 0x79, 0x78, 0x77, 0x77, 0x77, 0x76, 0x75, 0x74, + 0x74, 0x75, 0x76, 0x76, 0x76, 0x75, 0x74, 0x74, 0x74, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x7b, 0x7e, 0x80, 0x82, 0x84, 0x86, 0x8b, 0x90, + 0x95, 0x97, 0x97, 0x93, 0x8e, 0x8a, 0x88, 0x87, 0x87, 0x88, 0x86, + 0x84, 0x80, 0x7e, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7d, 0x7b, 0x79, + 0x79, 0x78, 0x79, 0x78, 0x78, 0x77, 0x76, 0x76, 0x76, 0x77, 0x78, + 0x79, 0x79, 0x79, 0x78, 0x78, 0x79, 0x7a, 0x7b, 0x7d, 0x7f, 0x80, + 0x81, 0x82, 0x82, 0x83, 0x85, 0x87, 0x89, 0x8c, 0x8d, 0x8d, 0x8d, + 0x8c, 0x8a, 0x89, 0x88, 0x86, 0x85, 0x84, 0x83, 0x81, 0x80, 0x7f, + 0x7e, 0x7c, 0x7b, 0x7b, 0x7a, 0x79, 0x78, 0x76, 0x75, 0x73, 0x71, + 0x70, 0x6f, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7f, 0x81, + 0x84, 0x88, 0x8c, 0x8f, 0x91, 0x91, 0x8f, 0x8c, 0x89, 0x87, 0x85, + 0x85, 0x84, 0x83, 0x81, 0x7f, 0x7d, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, + 0x7e, 0x7d, 0x7c, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, + 0x7b, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, + }, + }, + "ja": { + { // 0 + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x83, + 0x81, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, + 0x7e, 0x7d, 0x7e, 0x80, 0x7e, 0x7e, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x7e, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7e, 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x81, 0x81, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x80, 0x80, 0x7e, + 0x7f, 0x80, 0x7f, 0x7d, 0x80, 0x80, 0x7e, 0x7f, 0x80, 0x7f, 0x7e, + 0x7f, 0x80, 0x7f, 0x80, 0x83, 0x80, 0x81, 0x80, 0x81, 0x7f, 0x7e, + 0x81, 0x80, 0x7e, 0x7f, 0x81, 0x7c, 0x7c, 0x80, 0x7c, 0x7b, 0x7c, + 0x7e, 0x7e, 0x7b, 0x7e, 0x80, 0x7f, 0x7f, 0x83, 0x84, 0x82, 0x85, + 0x88, 0x86, 0x86, 0x88, 0x87, 0x84, 0x86, 0x85, 0x7e, 0x7f, 0x7b, + 0x77, 0x76, 0x74, 0x72, 0x6e, 0x6c, 0x6d, 0x6d, 0x6f, 0x73, 0x7e, + 0x84, 0x8a, 0x94, 0x98, 0x9b, 0x9c, 0x9d, 0x9a, 0x98, 0x96, 0x91, + 0x88, 0x80, 0x79, 0x71, 0x69, 0x68, 0x64, 0x60, 0x5d, 0x63, 0x76, + 0x76, 0x77, 0x88, 0x8c, 0x89, 0x8d, 0x95, 0x93, 0x91, 0x98, 0x94, + 0x8d, 0x8c, 0x8b, 0x85, 0x7e, 0x80, 0x7b, 0x76, 0x74, 0x70, 0x68, + 0x61, 0x61, 0x65, 0x72, 0x78, 0x7c, 0x87, 0x8b, 0x8a, 0x8d, 0x90, + 0x92, 0x92, 0x94, 0x91, 0x8e, 0x8b, 0x87, 0x84, 0x7e, 0x7e, 0x79, + 0x75, 0x72, 0x6d, 0x65, 0x5e, 0x58, 0x63, 0x7b, 0x75, 0x80, 0x93, + 0x90, 0x8b, 0x90, 0x96, 0x90, 0x93, 0x98, 0x91, 0x8c, 0x8b, 0x89, + 0x80, 0x7e, 0x7f, 0x75, 0x73, 0x70, 0x69, 0x5c, 0x59, 0x56, 0x6b, + 0x7c, 0x77, 0x8d, 0x95, 0x90, 0x8f, 0x92, 0x92, 0x8f, 0x97, 0x95, + 0x8f, 0x8f, 0x8b, 0x88, 0x7f, 0x81, 0x7b, 0x74, 0x72, 0x6a, 0x60, + 0x59, 0x55, 0x56, 0x78, 0x7c, 0x7e, 0x97, 0x97, 0x91, 0x90, 0x93, + 0x8f, 0x8f, 0x96, 0x92, 0x8f, 0x8f, 0x8d, 0x86, 0x80, 0x81, 0x75, + 0x72, 0x6d, 0x64, 0x58, 0x53, 0x4f, 0x69, 0x82, 0x7a, 0x93, 0x9d, + 0x94, 0x91, 0x92, 0x8e, 0x8c, 0x94, 0x92, 0x90, 0x90, 0x8e, 0x8b, + 0x82, 0x83, 0x79, 0x71, 0x6d, 0x63, 0x59, 0x51, 0x49, 0x5d, 0x86, + 0x78, 0x8f, 0xa3, 0x94, 0x92, 0x90, 0x8c, 0x87, 0x91, 0x8f, 0x8d, + 0x92, 0x8e, 0x8d, 0x86, 0x84, 0x7b, 0x71, 0x70, 0x66, 0x5c, 0x55, + 0x4f, 0x5b, 0x86, 0x7c, 0x89, 0xa5, 0x95, 0x90, 0x8f, 0x8b, 0x81, + 0x8f, 0x91, 0x8b, 0x94, 0x91, 0x90, 0x88, 0x85, 0x7a, 0x71, 0x6f, + 0x64, 0x5d, 0x54, 0x4d, 0x58, 0x84, 0x81, 0x8a, 0xa8, 0x97, 0x8f, + 0x8d, 0x88, 0x7e, 0x8d, 0x91, 0x8c, 0x98, 0x94, 0x92, 0x8b, 0x85, + 0x79, 0x6e, 0x6c, 0x63, 0x59, 0x52, 0x4a, 0x5b, 0x8a, 0x80, 0x91, + 0xab, 0x96, 0x8f, 0x8a, 0x84, 0x7a, 0x90, 0x90, 0x8f, 0x9d, 0x96, + 0x94, 0x8b, 0x84, 0x73, 0x6d, 0x69, 0x5d, 0x56, 0x50, 0x47, 0x67, + 0x90, 0x80, 0x9d, 0xa9, 0x91, 0x8b, 0x86, 0x7c, 0x7c, 0x93, 0x8e, + 0x98, 0xa0, 0x99, 0x93, 0x8a, 0x7f, 0x6c, 0x69, 0x63, 0x5b, 0x55, + 0x4d, 0x4b, 0x7a, 0x8f, 0x86, 0xa8, 0xa2, 0x8d, 0x86, 0x82, 0x77, + 0x83, 0x96, 0x91, 0xa1, 0xa0, 0x99, 0x91, 0x87, 0x75, 0x67, 0x66, + 0x5f, 0x57, 0x51, 0x47, 0x5a, 0x8e, 0x89, 0x97, 0xac, 0x96, 0x88, + 0x80, 0x79, 0x76, 0x8f, 0x95, 0x9d, 0xa7, 0x9f, 0x97, 0x8a, 0x7e, + 0x6a, 0x66, 0x61, 0x5a, 0x53, 0x4c, 0x4a, 0x75, 0x92, 0x8b, 0xa7, + 0xa4, 0x8d, 0x80, 0x7c, 0x74, 0x81, 0x96, 0x9a, 0xa6, 0xa7, 0x9e, + 0x8f, 0x83, 0x70, 0x62, 0x62, 0x5d, 0x55, 0x52, 0x48, 0x62, 0x8f, + 0x8d, 0x9b, 0xaa, 0x93, 0x80, 0x7b, 0x75, 0x79, 0x8f, 0x9a, 0xa7, + 0xab, 0xa3, 0x95, 0x86, 0x75, 0x64, 0x60, 0x5c, 0x58, 0x52, 0x49, + 0x58, 0x88, 0x8f, 0x96, 0xa9, 0x9a, 0x82, 0x79, 0x75, 0x74, 0x8d, + 0x9c, 0xa7, 0xae, 0xa8, 0x99, 0x88, 0x77, 0x62, 0x5d, 0x5e, 0x58, + 0x53, 0x4c, 0x55, 0x82, 0x92, 0x92, 0xa7, 0x9c, 0x82, 0x78, 0x73, + 0x75, 0x8a, 0x9c, 0xa6, 0xaf, 0xa9, 0x9a, 0x88, 0x77, 0x64, 0x5c, + 0x5e, 0x5b, 0x55, 0x4f, 0x54, 0x80, 0x93, 0x90, 0xa5, 0x9c, 0x82, + 0x75, 0x74, 0x76, 0x88, 0x9e, 0xaa, 0xaf, 0xab, 0x99, 0x85, 0x76, + 0x62, 0x5c, 0x5e, 0x5c, 0x54, 0x51, 0x57, 0x84, 0x93, 0x90, 0xa5, + 0x96, 0x80, 0x72, 0x73, 0x76, 0x8b, 0xa0, 0xae, 0xb1, 0xaa, 0x9a, + 0x83, 0x72, 0x5e, 0x5c, 0x5d, 0x5a, 0x55, 0x4e, 0x60, 0x89, 0x92, + 0x95, 0xa2, 0x93, 0x79, 0x6f, 0x70, 0x7b, 0x90, 0xa4, 0xb3, 0xb0, + 0xa9, 0x93, 0x7f, 0x6a, 0x5d, 0x5c, 0x5e, 0x5a, 0x54, 0x52, 0x68, + 0x91, 0x8f, 0x98, 0xa1, 0x88, 0x73, 0x70, 0x72, 0x7f, 0x98, 0xaa, + 0xb4, 0xaf, 0xa4, 0x8c, 0x79, 0x66, 0x5b, 0x5d, 0x5e, 0x57, 0x53, + 0x56, 0x7b, 0x97, 0x8d, 0xa0, 0x98, 0x7e, 0x6f, 0x6e, 0x74, 0x89, + 0xa2, 0xb2, 0xb5, 0xad, 0x9c, 0x81, 0x6f, 0x5e, 0x5c, 0x5f, 0x5e, + 0x56, 0x53, 0x61, 0x8c, 0x92, 0x92, 0x9f, 0x8b, 0x75, 0x6b, 0x71, + 0x7b, 0x96, 0xac, 0xb6, 0xb1, 0xa6, 0x8f, 0x78, 0x67, 0x5d, 0x5c, + 0x60, 0x5b, 0x54, 0x57, 0x77, 0x96, 0x8e, 0x9b, 0x96, 0x7e, 0x6d, + 0x6e, 0x75, 0x89, 0xa1, 0xb2, 0xb7, 0xa9, 0x9a, 0x82, 0x70, 0x60, + 0x5c, 0x61, 0x5f, 0x57, 0x54, 0x66, 0x8d, 0x91, 0x92, 0x9b, 0x88, + 0x72, 0x6d, 0x71, 0x7e, 0x98, 0xac, 0xb6, 0xb0, 0xa2, 0x8c, 0x77, + 0x65, 0x5c, 0x5d, 0x61, 0x5a, 0x56, 0x5b, 0x81, 0x95, 0x8f, 0x99, + 0x91, 0x79, 0x69, 0x70, 0x79, 0x8e, 0xa6, 0xb6, 0xb3, 0xa7, 0x94, + 0x7b, 0x6a, 0x5e, 0x5b, 0x61, 0x5d, 0x57, 0x58, 0x73, 0x93, 0x90, + 0x96, 0x94, 0x7f, 0x6c, 0x6d, 0x75, 0x88, 0xa0, 0xb3, 0xb5, 0xaa, + 0x99, 0x82, 0x6e, 0x62, 0x5c, 0x61, 0x61, 0x57, 0x58, 0x68, 0x8d, + 0x91, 0x94, 0x96, 0x86, 0x72, 0x6d, 0x70, 0x82, 0x99, 0xab, 0xb6, + 0xad, 0x9f, 0x89, 0x74, 0x64, 0x5d, 0x5f, 0x62, 0x5d, 0x58, 0x5d, + 0x88, 0x91, 0x90, 0x97, 0x8c, 0x77, 0x6a, 0x71, 0x7b, 0x92, 0xa5, + 0xb7, 0xae, 0xa3, 0x8f, 0x7a, 0x68, 0x60, 0x5d, 0x63, 0x60, 0x5a, + 0x5d, 0x77, 0x94, 0x8e, 0x95, 0x8f, 0x7f, 0x6e, 0x6e, 0x77, 0x8d, + 0x9f, 0xb1, 0xb3, 0xa6, 0x97, 0x7f, 0x6d, 0x61, 0x5f, 0x61, 0x63, + 0x5d, 0x59, 0x6a, 0x8e, 0x8e, 0x93, 0x91, 0x85, 0x73, 0x6b, 0x75, + 0x85, 0x9a, 0xaa, 0xb6, 0xa8, 0x9b, 0x87, 0x74, 0x65, 0x61, 0x62, + 0x63, 0x5e, 0x5a, 0x62, 0x84, 0x8f, 0x90, 0x94, 0x88, 0x7a, 0x6d, + 0x73, 0x7f, 0x92, 0xa3, 0xb2, 0xaa, 0x9e, 0x8e, 0x7a, 0x6c, 0x62, + 0x62, 0x64, 0x60, 0x5b, 0x5c, 0x76, 0x8e, 0x8e, 0x91, 0x8f, 0x81, + 0x72, 0x73, 0x7b, 0x8c, 0x9a, 0xac, 0xac, 0xa1, 0x94, 0x83, 0x73, + 0x67, 0x63, 0x65, 0x63, 0x5b, 0x5b, 0x68, 0x86, 0x8b, 0x8e, 0x91, + 0x89, 0x7a, 0x75, 0x7a, 0x85, 0x92, 0xa0, 0xa9, 0xa1, 0x99, 0x8b, + 0x7c, 0x6e, 0x66, 0x63, 0x62, 0x59, 0x54, 0x57, 0x76, 0x8b, 0x8a, + 0x94, 0x92, 0x87, 0x78, 0x7b, 0x84, 0x8f, 0x9b, 0xac, 0xaa, 0x9f, + 0x97, 0x87, 0x76, 0x68, 0x65, 0x64, 0x5f, 0x57, 0x57, 0x64, 0x7a, + 0x82, 0x86, 0x8b, 0x89, 0x82, 0x7e, 0x83, 0x8d, 0x94, 0x9b, 0xa2, + 0x9a, 0x91, 0x89, 0x81, 0x78, 0x71, 0x72, 0x73, 0x70, 0x6c, 0x6e, + 0x71, 0x77, 0x7b, 0x7c, 0x7f, 0x82, 0x82, 0x80, 0x83, 0x88, 0x89, + 0x8a, 0x8b, 0x8c, 0x88, 0x87, 0x87, 0x84, 0x84, 0x82, 0x81, 0x7f, + 0x7c, 0x79, 0x7b, 0x7b, 0x76, 0x77, 0x77, 0x7a, 0x79, 0x79, 0x7d, + 0x7e, 0x7e, 0x80, 0x82, 0x82, 0x84, 0x86, 0x86, 0x87, 0x88, 0x88, + 0x85, 0x84, 0x80, 0x7d, 0x7b, 0x79, 0x78, 0x77, 0x79, 0x78, 0x77, + 0x79, 0x79, 0x7a, 0x7d, 0x7e, 0x81, 0x82, 0x83, 0x85, 0x85, 0x87, + 0x87, 0x88, 0x87, 0x86, 0x85, 0x82, 0x80, 0x7e, 0x7c, 0x7b, 0x7a, + 0x79, 0x7a, 0x78, 0x79, 0x78, 0x78, 0x7a, 0x7d, 0x7f, 0x82, 0x84, + 0x84, 0x85, 0x84, 0x85, 0x86, 0x86, 0x86, 0x85, 0x83, 0x83, 0x80, + 0x7e, 0x7b, 0x7d, 0x7a, 0x80, 0x7a, 0x72, 0x7d, 0x76, 0x79, 0x7d, + 0x7f, 0x82, 0x80, 0x83, 0x89, 0x82, 0x89, 0x91, 0x86, 0x88, 0x86, + 0x83, 0x7e, 0x7c, 0x7e, 0x79, 0x77, 0x79, 0x77, 0x71, 0x72, 0x77, + 0x74, 0x75, 0x78, 0x7d, 0x84, 0x85, 0x8d, 0x8f, 0x8f, 0x8c, 0x8a, + 0x8b, 0x87, 0x89, 0x88, 0x84, 0x7e, 0x7b, 0x73, 0x70, 0x6d, 0x6d, + 0x6b, 0x68, 0x6b, 0x75, 0x7c, 0x7f, 0x84, 0x8c, 0x91, 0x8d, 0x90, + 0x93, 0x96, 0x91, 0x91, 0x92, 0x8e, 0x85, 0x7f, 0x79, 0x74, 0x6d, + 0x67, 0x62, 0x5d, 0x5a, 0x70, 0x81, 0x80, 0x88, 0x8b, 0x95, 0x87, + 0x83, 0x90, 0x95, 0x95, 0x96, 0x9c, 0x99, 0x8a, 0x81, 0x7b, 0x73, + 0x6a, 0x67, 0x66, 0x5d, 0x55, 0x57, 0x77, 0x88, 0x87, 0x8d, 0x8f, + 0x90, 0x81, 0x7c, 0x8d, 0x98, 0x99, 0x9e, 0xa3, 0x9d, 0x8d, 0x7e, + 0x78, 0x6e, 0x67, 0x66, 0x65, 0x59, 0x52, 0x55, 0x71, 0x8f, 0x8b, + 0x8e, 0x8e, 0x8e, 0x83, 0x75, 0x87, 0x9a, 0x9f, 0xa0, 0xa6, 0xa4, + 0x94, 0x7f, 0x74, 0x6d, 0x67, 0x62, 0x66, 0x5e, 0x55, 0x50, 0x68, + 0x8d, 0x93, 0x8e, 0x89, 0x8c, 0x83, 0x75, 0x7a, 0x96, 0xa5, 0xa7, + 0xa6, 0xa5, 0x9c, 0x84, 0x71, 0x6b, 0x69, 0x65, 0x65, 0x63, 0x5a, + 0x54, 0x5b, 0x7c, 0x95, 0x92, 0x8b, 0x84, 0x85, 0x7b, 0x74, 0x87, + 0xa1, 0xab, 0xa7, 0xa1, 0xa0, 0x91, 0x7a, 0x6b, 0x68, 0x6c, 0x69, + 0x68, 0x64, 0x5b, 0x58, 0x63, 0x83, 0x96, 0x91, 0x87, 0x80, 0x81, + 0x7a, 0x78, 0x8b, 0xa4, 0xae, 0xaa, 0xa1, 0x97, 0x8b, 0x74, 0x65, + 0x66, 0x6c, 0x6f, 0x6b, 0x62, 0x5a, 0x57, 0x66, 0x86, 0x95, 0x91, + 0x85, 0x7f, 0x80, 0x7b, 0x7b, 0x8e, 0xa7, 0xb1, 0xaa, 0x9e, 0x94, + 0x87, 0x73, 0x64, 0x66, 0x6e, 0x74, 0x6e, 0x65, 0x5b, 0x58, 0x62, + 0x7e, 0x94, 0x93, 0x88, 0x7c, 0x7e, 0x7e, 0x7e, 0x8b, 0xa2, 0xb1, + 0xac, 0x9c, 0x91, 0x87, 0x79, 0x69, 0x64, 0x6c, 0x74, 0x75, 0x6a, + 0x5e, 0x58, 0x5a, 0x70, 0x8c, 0x97, 0x90, 0x81, 0x7c, 0x7f, 0x81, + 0x85, 0x97, 0xaa, 0xaf, 0xa4, 0x93, 0x88, 0x7e, 0x71, 0x67, 0x6a, + 0x73, 0x77, 0x72, 0x66, 0x5a, 0x57, 0x5e, 0x7b, 0x93, 0x96, 0x8b, + 0x7d, 0x7e, 0x82, 0x82, 0x89, 0x9b, 0xac, 0xaf, 0x9f, 0x8c, 0x81, + 0x7a, 0x70, 0x69, 0x6c, 0x76, 0x7a, 0x72, 0x61, 0x57, 0x57, 0x63, + 0x80, 0x92, 0x96, 0x8b, 0x7f, 0x7f, 0x80, 0x83, 0x8b, 0x9d, 0xaa, + 0xab, 0x9c, 0x8c, 0x82, 0x79, 0x71, 0x6a, 0x6f, 0x77, 0x7a, 0x73, + 0x66, 0x5b, 0x56, 0x5d, 0x74, 0x8e, 0x9c, 0x95, 0x83, 0x7c, 0x7e, + 0x83, 0x88, 0x95, 0xa5, 0xaf, 0xa6, 0x91, 0x80, 0x78, 0x74, 0x6f, + 0x6e, 0x73, 0x7a, 0x7a, 0x70, 0x60, 0x56, 0x55, 0x64, 0x82, 0x97, + 0x9c, 0x8e, 0x80, 0x7c, 0x7f, 0x83, 0x8c, 0x9c, 0xa9, 0xaa, 0x9d, + 0x89, 0x7c, 0x75, 0x72, 0x70, 0x73, 0x79, 0x7c, 0x79, 0x6d, 0x5f, + 0x57, 0x59, 0x68, 0x84, 0x98, 0x9b, 0x8d, 0x7d, 0x7a, 0x7e, 0x85, + 0x90, 0x9c, 0xa6, 0xa5, 0x99, 0x88, 0x7b, 0x75, 0x74, 0x75, 0x76, + 0x79, 0x7a, 0x78, 0x6e, 0x62, 0x59, 0x57, 0x63, 0x7e, 0x97, 0x9f, + 0x91, 0x7e, 0x78, 0x7d, 0x87, 0x8f, 0x96, 0x9f, 0xa3, 0x9c, 0x8d, + 0x7e, 0x78, 0x77, 0x78, 0x77, 0x79, 0x79, 0x79, 0x74, 0x69, 0x61, + 0x5c, 0x5d, 0x6b, 0x85, 0x99, 0x9c, 0x8c, 0x7d, 0x78, 0x7f, 0x88, + 0x8f, 0x98, 0x9e, 0xa0, 0x98, 0x8a, 0x7c, 0x75, 0x76, 0x79, 0x7a, + 0x7d, 0x7a, 0x77, 0x6f, 0x68, 0x61, 0x5d, 0x5f, 0x6b, 0x85, 0x99, + 0x9e, 0x8e, 0x7d, 0x76, 0x7d, 0x88, 0x90, 0x97, 0x9c, 0x9d, 0x97, + 0x8d, 0x7f, 0x77, 0x74, 0x77, 0x7a, 0x7e, 0x7c, 0x78, 0x70, 0x69, + 0x64, 0x5f, 0x5c, 0x60, 0x7a, 0x95, 0xa4, 0x99, 0x82, 0x74, 0x75, + 0x82, 0x8f, 0x98, 0x9c, 0x9f, 0x9b, 0x92, 0x84, 0x78, 0x73, 0x76, + 0x7a, 0x80, 0x7e, 0x79, 0x71, 0x6a, 0x67, 0x65, 0x62, 0x5e, 0x6a, + 0x84, 0x9d, 0xa2, 0x90, 0x7b, 0x71, 0x79, 0x88, 0x93, 0x9b, 0x9c, + 0x9b, 0x94, 0x8b, 0x81, 0x78, 0x76, 0x77, 0x7e, 0x81, 0x7e, 0x76, + 0x6f, 0x6b, 0x6a, 0x67, 0x61, 0x5c, 0x6b, 0x88, 0xa1, 0xa4, 0x8f, + 0x78, 0x6e, 0x76, 0x88, 0x97, 0x9d, 0x9c, 0x97, 0x92, 0x8b, 0x83, + 0x79, 0x74, 0x75, 0x7d, 0x82, 0x81, 0x77, 0x6f, 0x6b, 0x6b, 0x69, + 0x63, 0x5b, 0x63, 0x80, 0x9e, 0xa9, 0x98, 0x7d, 0x6a, 0x6e, 0x81, + 0x95, 0xa0, 0x9e, 0x97, 0x90, 0x8b, 0x87, 0x7e, 0x77, 0x73, 0x79, + 0x82, 0x86, 0x80, 0x74, 0x6d, 0x6b, 0x6d, 0x69, 0x61, 0x5b, 0x6a, + 0x88, 0xa4, 0xa9, 0x93, 0x76, 0x64, 0x6c, 0x84, 0x9b, 0xa4, 0x9e, + 0x92, 0x8a, 0x87, 0x87, 0x80, 0x7a, 0x76, 0x7b, 0x82, 0x87, 0x80, + 0x74, 0x6d, 0x6c, 0x70, 0x6d, 0x64, 0x58, 0x62, 0x80, 0xa1, 0xae, + 0x9a, 0x7a, 0x61, 0x65, 0x7e, 0x98, 0xa6, 0xa1, 0x93, 0x88, 0x85, + 0x87, 0x85, 0x7e, 0x77, 0x79, 0x81, 0x88, 0x85, 0x78, 0x6e, 0x6a, + 0x71, 0x73, 0x6f, 0x60, 0x59, 0x6b, 0x89, 0xa6, 0xa7, 0x90, 0x70, + 0x5f, 0x6a, 0x86, 0x9f, 0xa7, 0x9d, 0x8c, 0x83, 0x84, 0x87, 0x86, + 0x7e, 0x79, 0x7a, 0x83, 0x89, 0x85, 0x79, 0x6e, 0x6c, 0x72, 0x75, + 0x6f, 0x61, 0x58, 0x67, 0x85, 0xa3, 0xa8, 0x93, 0x73, 0x5f, 0x67, + 0x82, 0x9e, 0xa8, 0x9e, 0x8c, 0x81, 0x82, 0x88, 0x8a, 0x83, 0x7b, + 0x79, 0x80, 0x88, 0x88, 0x7e, 0x72, 0x6e, 0x72, 0x7a, 0x77, 0x69, + 0x58, 0x57, 0x6f, 0x92, 0xaa, 0xa4, 0x88, 0x69, 0x5f, 0x6f, 0x8d, + 0xa2, 0xa3, 0x95, 0x86, 0x81, 0x87, 0x8c, 0x8a, 0x80, 0x77, 0x78, + 0x82, 0x8b, 0x8a, 0x7f, 0x72, 0x6f, 0x74, 0x7a, 0x76, 0x67, 0x55, + 0x53, 0x6a, 0x8e, 0xaa, 0xa8, 0x8f, 0x6f, 0x5f, 0x6a, 0x85, 0x9d, + 0xa3, 0x99, 0x89, 0x82, 0x86, 0x8c, 0x8c, 0x82, 0x78, 0x75, 0x7d, + 0x89, 0x8d, 0x87, 0x7b, 0x72, 0x72, 0x78, 0x79, 0x71, 0x60, 0x51, + 0x56, 0x71, 0x94, 0xaa, 0xa4, 0x8b, 0x6d, 0x61, 0x6b, 0x84, 0x9b, + 0xa2, 0x99, 0x89, 0x81, 0x83, 0x8b, 0x8c, 0x85, 0x7a, 0x75, 0x7b, + 0x86, 0x8f, 0x8e, 0x84, 0x77, 0x71, 0x73, 0x77, 0x75, 0x69, 0x58, + 0x51, 0x61, 0x81, 0xa1, 0xac, 0x9d, 0x7e, 0x64, 0x5f, 0x71, 0x8e, + 0xa2, 0xa3, 0x94, 0x82, 0x7c, 0x82, 0x8b, 0x8c, 0x83, 0x77, 0x72, + 0x7b, 0x89, 0x93, 0x91, 0x85, 0x77, 0x70, 0x73, 0x78, 0x76, 0x6a, + 0x5a, 0x52, 0x60, 0x7f, 0x9f, 0xac, 0x9f, 0x81, 0x65, 0x5f, 0x6e, + 0x8a, 0x9f, 0xa2, 0x95, 0x84, 0x7c, 0x80, 0x88, 0x8b, 0x84, 0x79, + 0x72, 0x77, 0x84, 0x91, 0x94, 0x8c, 0x7f, 0x75, 0x74, 0x76, 0x79, + 0x73, 0x67, 0x5a, 0x58, 0x69, 0x85, 0x9e, 0xa5, 0x98, 0x7e, 0x68, + 0x64, 0x71, 0x88, 0x9a, 0x9d, 0x94, 0x86, 0x7f, 0x80, 0x85, 0x86, + 0x81, 0x79, 0x76, 0x7a, 0x84, 0x8d, 0x91, 0x8c, 0x82, 0x7a, 0x77, + 0x78, 0x79, 0x77, 0x71, 0x69, 0x63, 0x64, 0x71, 0x84, 0x96, 0x9c, + 0x94, 0x81, 0x70, 0x69, 0x70, 0x82, 0x92, 0x99, 0x95, 0x8b, 0x83, + 0x81, 0x82, 0x83, 0x80, 0x7b, 0x78, 0x7c, 0x84, 0x8d, 0x8f, 0x89, + 0x7f, 0x77, 0x73, 0x74, 0x76, 0x74, 0x6d, 0x61, 0x61, 0x70, 0x89, + 0x9f, 0xa3, 0x96, 0x7c, 0x66, 0x61, 0x70, 0x89, 0x9c, 0x9f, 0x91, + 0x7e, 0x75, 0x7a, 0x88, 0x90, 0x8d, 0x80, 0x75, 0x72, 0x7b, 0x8b, + 0x95, 0x95, 0x8b, 0x7d, 0x74, 0x73, 0x77, 0x7a, 0x78, 0x72, 0x6e, + 0x6e, 0x73, 0x7a, 0x80, 0x82, 0x82, 0x82, 0x81, 0x82, 0x82, 0x80, + 0x7f, 0x7f, 0x82, 0x86, 0x8b, 0x8e, 0x8c, 0x88, 0x83, 0x7f, 0x7d, + 0x7d, 0x7f, 0x82, 0x83, 0x84, 0x83, 0x80, 0x7c, 0x77, 0x73, 0x6e, + 0x6a, 0x62, 0x66, 0x72, 0x86, 0x9a, 0x9f, 0x98, 0x82, 0x70, 0x68, + 0x70, 0x82, 0x92, 0x96, 0x8e, 0x81, 0x79, 0x7a, 0x81, 0x87, 0x88, + 0x80, 0x77, 0x73, 0x77, 0x83, 0x8e, 0x94, 0x90, 0x87, 0x7e, 0x7a, + 0x7c, 0x80, 0x83, 0x80, 0x7c, 0x78, 0x79, 0x7d, 0x82, 0x83, 0x80, + 0x7a, 0x74, 0x72, 0x75, 0x7b, 0x80, 0x82, 0x82, 0x80, 0x80, 0x81, + 0x82, 0x84, 0x83, 0x81, 0x7e, 0x7d, 0x7e, 0x81, 0x82, 0x83, 0x81, + 0x7f, 0x7d, 0x7b, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, + 0x81, 0x82, 0x83, 0x83, 0x82, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7d, 0x7c, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x82, 0x81, + 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x80, + 0x81, 0x82, 0x83, 0x83, 0x83, 0x82, 0x81, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, + 0x7d, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x82, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x80, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7d, 0x7d, 0x7e, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, + }, + { // 1 + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x81, 0x7f, 0x81, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x81, 0x80, 0x7f, 0x83, 0x7e, 0x83, 0x7f, 0x81, 0x81, + 0x80, 0x81, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, + 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x81, 0x7f, 0x84, 0x83, 0x84, 0x87, 0x84, + 0x89, 0x86, 0x8a, 0x8a, 0x89, 0x8a, 0x86, 0x85, 0x83, 0x7e, 0x7d, + 0x77, 0x76, 0x71, 0x6e, 0x6d, 0x67, 0x68, 0x64, 0x65, 0x63, 0x6b, + 0x6b, 0x73, 0x78, 0x79, 0x84, 0x80, 0x8e, 0x8d, 0x96, 0x97, 0x9a, + 0x9c, 0x99, 0x99, 0x95, 0x93, 0x8e, 0x8c, 0x87, 0x87, 0x82, 0x83, + 0x7f, 0x81, 0x7e, 0x7f, 0x7d, 0x7d, 0x7a, 0x7a, 0x77, 0x73, 0x71, + 0x6a, 0x6a, 0x63, 0x67, 0x64, 0x67, 0x6b, 0x6c, 0x72, 0x77, 0x7e, + 0x86, 0x8b, 0x93, 0x97, 0x9c, 0x9c, 0x9d, 0x9d, 0x99, 0x98, 0x91, + 0x90, 0x89, 0x87, 0x83, 0x80, 0x7e, 0x7d, 0x7c, 0x7c, 0x7b, 0x7b, + 0x7a, 0x78, 0x78, 0x72, 0x71, 0x6e, 0x6b, 0x66, 0x65, 0x62, 0x65, + 0x64, 0x6a, 0x6c, 0x70, 0x77, 0x7a, 0x84, 0x88, 0x91, 0x97, 0x9b, + 0x9f, 0x9e, 0x9f, 0x9d, 0x99, 0x97, 0x90, 0x8e, 0x89, 0x85, 0x82, + 0x7f, 0x7d, 0x7b, 0x7b, 0x7a, 0x79, 0x77, 0x77, 0x75, 0x74, 0x73, + 0x71, 0x70, 0x6a, 0x68, 0x68, 0x64, 0x66, 0x6a, 0x6a, 0x73, 0x72, + 0x79, 0x7d, 0x7e, 0x8a, 0x8a, 0x93, 0x97, 0x99, 0x9c, 0x9c, 0x99, + 0x9a, 0x93, 0x94, 0x8f, 0x8b, 0x8b, 0x85, 0x84, 0x82, 0x7f, 0x7d, + 0x7c, 0x79, 0x79, 0x78, 0x78, 0x73, 0x75, 0x70, 0x71, 0x6e, 0x6e, + 0x6c, 0x6d, 0x6a, 0x6d, 0x70, 0x70, 0x78, 0x75, 0x7e, 0x7d, 0x82, + 0x88, 0x89, 0x8f, 0x93, 0x94, 0x97, 0x95, 0x95, 0x95, 0x90, 0x92, + 0x8e, 0x8d, 0x8b, 0x86, 0x87, 0x82, 0x82, 0x7f, 0x7e, 0x7c, 0x7b, + 0x79, 0x78, 0x74, 0x76, 0x74, 0x74, 0x72, 0x70, 0x73, 0x6c, 0x73, + 0x6f, 0x74, 0x77, 0x77, 0x79, 0x7d, 0x7b, 0x83, 0x81, 0x86, 0x8b, + 0x89, 0x90, 0x8e, 0x92, 0x8f, 0x91, 0x8f, 0x90, 0x8e, 0x8e, 0x8a, + 0x8a, 0x86, 0x85, 0x85, 0x7f, 0x80, 0x7c, 0x7b, 0x7c, 0x76, 0x79, + 0x76, 0x73, 0x76, 0x72, 0x74, 0x72, 0x73, 0x72, 0x75, 0x73, 0x77, + 0x79, 0x78, 0x7d, 0x7c, 0x7e, 0x82, 0x81, 0x84, 0x88, 0x86, 0x8a, + 0x89, 0x8b, 0x8c, 0x8b, 0x8d, 0x8b, 0x8b, 0x89, 0x89, 0x86, 0x84, + 0x81, 0x80, 0x7e, 0x7c, 0x7b, 0x79, 0x77, 0x75, 0x77, 0x74, 0x77, + 0x76, 0x77, 0x77, 0x77, 0x78, 0x7b, 0x7b, 0x7b, 0x7d, 0x7d, 0x7f, + 0x7f, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x83, 0x85, 0x86, 0x84, + 0x85, 0x85, 0x84, 0x84, 0x82, 0x82, 0x82, 0x80, 0x80, 0x7e, 0x7e, + 0x7e, 0x7c, 0x7d, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x79, 0x7b, + 0x7b, 0x7b, 0x7c, 0x7d, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x82, + 0x82, 0x81, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7e, + 0x7f, 0x7d, 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x81, 0x82, 0x81, 0x81, 0x7f, 0x81, 0x7f, 0x80, 0x80, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, + 0x80, 0x83, 0x82, 0x7f, 0x81, 0x81, 0x81, 0x80, 0x81, 0x81, 0x7f, + 0x7e, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x7d, 0x7e, 0x7d, 0x7d, 0x7f, + 0x7e, 0x7f, 0x7e, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x81, 0x80, 0x82, + 0x85, 0x7f, 0x80, 0x82, 0x80, 0x7f, 0x7d, 0x7f, 0x7d, 0x7c, 0x7d, + 0x7e, 0x7d, 0x7b, 0x7d, 0x7e, 0x7e, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x81, 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x7e, + 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x81, 0x7f, 0x7e, 0x80, 0x80, 0x80, + 0x80, 0x81, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7e, 0x7d, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7e, 0x80, 0x7e, 0x7f, 0x80, 0x7e, 0x81, 0x7e, 0x80, 0x80, 0x7f, + 0x81, 0x7f, 0x81, 0x81, 0x81, 0x81, 0x7f, 0x7e, 0x80, 0x81, 0x80, + 0x81, 0x81, 0x80, 0x7f, 0x80, 0x7e, 0x7f, 0x7f, 0x7d, 0x82, 0x7e, + 0x7e, 0x7f, 0x7b, 0x81, 0x80, 0x7d, 0x82, 0x80, 0x7d, 0x7f, 0x80, + 0x80, 0x7e, 0x80, 0x7c, 0x81, 0x81, 0x7c, 0x81, 0x7e, 0x7d, 0x80, + 0x7e, 0x7f, 0x7f, 0x7f, 0x7e, 0x7d, 0x83, 0x7e, 0x81, 0x82, 0x7c, + 0x80, 0x7f, 0x7f, 0x81, 0x81, 0x7f, 0x81, 0x7e, 0x7e, 0x80, 0x7f, + 0x80, 0x81, 0x7f, 0x80, 0x83, 0x80, 0x80, 0x7f, 0x7c, 0x81, 0x7f, + 0x7d, 0x7f, 0x7f, 0x80, 0x81, 0x82, 0x7f, 0x80, 0x7e, 0x7f, 0x80, + 0x7e, 0x83, 0x7d, 0x80, 0x80, 0x7d, 0x7f, 0x80, 0x83, 0x7c, 0x7f, + 0x80, 0x7c, 0x7f, 0x7f, 0x81, 0x7e, 0x7f, 0x7f, 0x7f, 0x81, 0x7e, + 0x80, 0x7e, 0x80, 0x7e, 0x7b, 0x7f, 0x80, 0x82, 0x7d, 0x7f, 0x7f, + 0x7d, 0x81, 0x80, 0x7f, 0x7d, 0x81, 0x7f, 0x82, 0x7f, 0x7e, 0x81, + 0x7e, 0x82, 0x7d, 0x7f, 0x80, 0x7f, 0x83, 0x80, 0x80, 0x81, 0x81, + 0x7f, 0x82, 0x7d, 0x81, 0x80, 0x7f, 0x81, 0x80, 0x81, 0x7b, 0x82, + 0x80, 0x83, 0x81, 0x83, 0x7f, 0x80, 0x7e, 0x7f, 0x84, 0x7d, 0x7f, + 0x7d, 0x84, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7c, 0x83, 0x80, 0x80, + 0x7e, 0x7c, 0x7f, 0x82, 0x81, 0x7e, 0x81, 0x82, 0x7e, 0x80, 0x82, + 0x7d, 0x7e, 0x80, 0x84, 0x87, 0x82, 0x81, 0x82, 0x7f, 0x83, 0x81, + 0x82, 0x81, 0x7e, 0x82, 0x80, 0x83, 0x7c, 0x7e, 0x82, 0x81, 0x82, + 0x7f, 0x85, 0x80, 0x81, 0x7f, 0x7e, 0x81, 0x7d, 0x83, 0x7e, 0x7c, + 0x7d, 0x7a, 0x84, 0x81, 0x81, 0x83, 0x7e, 0x81, 0x7d, 0x82, 0x7d, + 0x82, 0x83, 0x7f, 0x88, 0x7b, 0x84, 0x7e, 0x7d, 0x85, 0x7a, 0x81, + 0x7c, 0x7d, 0x7f, 0x7c, 0x80, 0x7f, 0x7f, 0x7d, 0x7b, 0x7e, 0x79, + 0x80, 0x81, 0x7c, 0x85, 0x7d, 0x80, 0x84, 0x80, 0x86, 0x83, 0x88, + 0x83, 0x81, 0x87, 0x84, 0x86, 0x80, 0x83, 0x88, 0x7f, 0x83, 0x80, + 0x78, 0x7d, 0x75, 0x79, 0x77, 0x75, 0x78, 0x73, 0x78, 0x75, 0x79, + 0x78, 0x7e, 0x82, 0x7f, 0x8c, 0x85, 0x8a, 0x8f, 0x89, 0x8d, 0x90, + 0x88, 0x8e, 0x90, 0x82, 0x8c, 0x7f, 0x7e, 0x7e, 0x79, 0x77, 0x70, + 0x73, 0x6d, 0x72, 0x65, 0x6d, 0x6d, 0x6c, 0x73, 0x73, 0x7a, 0x73, + 0x7e, 0x7a, 0x82, 0x87, 0x86, 0x8f, 0x8e, 0x95, 0x94, 0x95, 0x94, + 0x94, 0x8d, 0x8d, 0x8c, 0x86, 0x88, 0x83, 0x81, 0x7b, 0x7a, 0x71, + 0x72, 0x6f, 0x69, 0x6f, 0x6a, 0x64, 0x6a, 0x68, 0x6a, 0x72, 0x6e, + 0x75, 0x77, 0x7a, 0x80, 0x8b, 0x8c, 0x94, 0x97, 0x92, 0x9d, 0x92, + 0x94, 0x94, 0x91, 0x8c, 0x8e, 0x88, 0x88, 0x88, 0x81, 0x84, 0x77, + 0x80, 0x76, 0x76, 0x71, 0x6e, 0x6a, 0x5e, 0x63, 0x63, 0x63, 0x63, + 0x6c, 0x67, 0x70, 0x77, 0x7d, 0x8a, 0x8f, 0x99, 0x99, 0x9f, 0x9c, + 0x9d, 0x98, 0x96, 0x96, 0x8d, 0x91, 0x8b, 0x8b, 0x86, 0x86, 0x80, + 0x80, 0x80, 0x79, 0x7e, 0x75, 0x71, 0x6b, 0x68, 0x5f, 0x5d, 0x66, + 0x5d, 0x65, 0x66, 0x69, 0x73, 0x78, 0x85, 0x8e, 0x95, 0x9b, 0xa2, + 0x9f, 0xa1, 0x9d, 0x9d, 0x98, 0x92, 0x90, 0x8b, 0x8a, 0x84, 0x86, + 0x84, 0x7f, 0x81, 0x7c, 0x7c, 0x80, 0x74, 0x75, 0x6d, 0x66, 0x5f, + 0x5f, 0x61, 0x5a, 0x65, 0x61, 0x68, 0x71, 0x78, 0x88, 0x90, 0x9a, + 0xa0, 0xa4, 0xa4, 0xa3, 0x9f, 0x99, 0x94, 0x90, 0x8c, 0x89, 0x85, + 0x82, 0x83, 0x81, 0x82, 0x80, 0x81, 0x7e, 0x7d, 0x79, 0x74, 0x69, + 0x64, 0x5e, 0x58, 0x62, 0x55, 0x62, 0x60, 0x68, 0x72, 0x78, 0x8c, + 0x91, 0x9e, 0xa0, 0xa9, 0xa5, 0xa5, 0xa0, 0x99, 0x93, 0x8a, 0x89, + 0x83, 0x84, 0x7e, 0x83, 0x7f, 0x7f, 0x82, 0x7c, 0x81, 0x7c, 0x7a, + 0x75, 0x6d, 0x65, 0x58, 0x5e, 0x58, 0x55, 0x60, 0x5b, 0x66, 0x6e, + 0x78, 0x8a, 0x93, 0x9e, 0xa8, 0xa9, 0xa7, 0xa8, 0xa0, 0x9a, 0x93, + 0x88, 0x84, 0x82, 0x7f, 0x80, 0x7e, 0x7e, 0x7f, 0x82, 0x80, 0x81, + 0x7d, 0x7c, 0x72, 0x6a, 0x68, 0x55, 0x61, 0x52, 0x56, 0x5d, 0x57, + 0x6b, 0x6a, 0x7f, 0x8c, 0x98, 0xa0, 0xab, 0xad, 0xa9, 0xaa, 0x9c, + 0x99, 0x8c, 0x87, 0x81, 0x7d, 0x7a, 0x7c, 0x7b, 0x7b, 0x7f, 0x7e, + 0x81, 0x80, 0x7f, 0x7b, 0x73, 0x6d, 0x60, 0x5d, 0x61, 0x51, 0x5e, + 0x5b, 0x5b, 0x6d, 0x70, 0x85, 0x90, 0x9b, 0xa5, 0xad, 0xab, 0xae, + 0xa7, 0x9b, 0x98, 0x8a, 0x84, 0x80, 0x7a, 0x7a, 0x78, 0x7a, 0x7d, + 0x7e, 0x82, 0x81, 0x83, 0x80, 0x7e, 0x6f, 0x6c, 0x62, 0x61, 0x5e, + 0x55, 0x60, 0x55, 0x66, 0x6a, 0x79, 0x89, 0x91, 0xa0, 0xa6, 0xad, + 0xa9, 0xad, 0x9e, 0x9d, 0x90, 0x88, 0x83, 0x7b, 0x7a, 0x78, 0x79, + 0x7a, 0x80, 0x7f, 0x86, 0x84, 0x84, 0x83, 0x79, 0x72, 0x6c, 0x66, + 0x62, 0x5e, 0x5c, 0x5e, 0x5d, 0x69, 0x6f, 0x81, 0x8c, 0x97, 0xa5, + 0xa9, 0xaf, 0xaa, 0xa8, 0xa0, 0x97, 0x8c, 0x86, 0x7d, 0x77, 0x78, + 0x72, 0x79, 0x78, 0x7d, 0x81, 0x82, 0x86, 0x83, 0x81, 0x7a, 0x6e, + 0x6b, 0x6a, 0x5b, 0x60, 0x5b, 0x59, 0x63, 0x65, 0x75, 0x82, 0x8e, + 0x9b, 0xa6, 0xa9, 0xae, 0xaa, 0xa4, 0x9e, 0x92, 0x8a, 0x82, 0x79, + 0x75, 0x74, 0x71, 0x76, 0x78, 0x7c, 0x81, 0x83, 0x84, 0x83, 0x7f, + 0x78, 0x6c, 0x72, 0x64, 0x61, 0x66, 0x57, 0x63, 0x61, 0x6d, 0x7d, + 0x85, 0x91, 0x9f, 0xa1, 0xa8, 0xaa, 0xa2, 0xa3, 0x95, 0x8d, 0x86, + 0x7e, 0x77, 0x75, 0x70, 0x73, 0x74, 0x79, 0x7d, 0x81, 0x83, 0x85, + 0x7f, 0x7f, 0x70, 0x6f, 0x75, 0x59, 0x70, 0x5b, 0x60, 0x68, 0x61, + 0x7b, 0x7d, 0x8b, 0x97, 0x9e, 0x9e, 0xab, 0x9f, 0xa1, 0x9b, 0x8b, + 0x8b, 0x7e, 0x7c, 0x75, 0x74, 0x71, 0x75, 0x76, 0x7b, 0x81, 0x82, + 0x87, 0x86, 0x82, 0x7f, 0x76, 0x6d, 0x76, 0x5e, 0x6c, 0x62, 0x5e, + 0x6d, 0x65, 0x7c, 0x7f, 0x8c, 0x96, 0x9d, 0x9e, 0xa5, 0x9f, 0x9b, + 0x99, 0x89, 0x89, 0x7c, 0x79, 0x75, 0x72, 0x73, 0x76, 0x78, 0x7d, + 0x84, 0x84, 0x8c, 0x88, 0x8a, 0x84, 0x7d, 0x76, 0x70, 0x6b, 0x64, + 0x67, 0x62, 0x66, 0x6b, 0x73, 0x7c, 0x87, 0x8f, 0x97, 0x9d, 0x9e, + 0xa1, 0x9b, 0x98, 0x90, 0x88, 0x81, 0x78, 0x74, 0x6f, 0x70, 0x6f, + 0x75, 0x7a, 0x7f, 0x87, 0x89, 0x91, 0x91, 0x91, 0x90, 0x89, 0x82, + 0x79, 0x6f, 0x67, 0x62, 0x5e, 0x5f, 0x60, 0x66, 0x6c, 0x75, 0x7e, + 0x89, 0x91, 0x98, 0x9d, 0x9f, 0x9f, 0x9b, 0x97, 0x90, 0x88, 0x81, + 0x7a, 0x74, 0x72, 0x72, 0x72, 0x77, 0x7b, 0x80, 0x86, 0x8a, 0x8c, + 0x8e, 0x8c, 0x8b, 0x85, 0x7f, 0x78, 0x71, 0x6b, 0x66, 0x64, 0x63, + 0x66, 0x6a, 0x70, 0x78, 0x80, 0x88, 0x8f, 0x95, 0x98, 0x99, 0x98, + 0x95, 0x90, 0x8a, 0x84, 0x7d, 0x78, 0x73, 0x70, 0x6f, 0x70, 0x72, + 0x75, 0x7a, 0x7e, 0x82, 0x86, 0x88, 0x8a, 0x8a, 0x89, 0x87, 0x84, + 0x81, 0x7d, 0x7a, 0x78, 0x76, 0x76, 0x76, 0x77, 0x78, 0x7b, 0x7e, + 0x80, 0x83, 0x85, 0x87, 0x88, 0x88, 0x88, 0x87, 0x85, 0x83, 0x81, + 0x7e, 0x7c, 0x7a, 0x78, 0x77, 0x75, 0x73, 0x74, 0x73, 0x75, 0x75, + 0x77, 0x78, 0x7b, 0x7c, 0x7f, 0x81, 0x82, 0x86, 0x86, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x84, 0x82, 0x81, 0x7f, 0x7e, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7e, 0x7f, 0x80, 0x81, 0x83, 0x84, 0x84, 0x85, 0x84, 0x84, + 0x83, 0x82, 0x80, 0x7f, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, + }, + { // 2 + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, + 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x82, 0x82, 0x83, + 0x83, 0x84, 0x84, 0x84, 0x84, 0x83, 0x83, 0x81, 0x80, 0x7f, 0x7e, + 0x7d, 0x7b, 0x7a, 0x79, 0x78, 0x77, 0x77, 0x77, 0x78, 0x78, 0x79, + 0x7b, 0x7c, 0x7f, 0x81, 0x83, 0x85, 0x88, 0x8a, 0x8c, 0x8d, 0x8e, + 0x8f, 0x8e, 0x8d, 0x8b, 0x88, 0x85, 0x82, 0x7c, 0x78, 0x75, 0x71, + 0x6d, 0x6b, 0x69, 0x68, 0x66, 0x66, 0x68, 0x6c, 0x72, 0x78, 0x7f, + 0x85, 0x8b, 0x90, 0x96, 0x9a, 0x9c, 0x9d, 0x9d, 0x9b, 0x9a, 0x98, + 0x92, 0x8c, 0x84, 0x7c, 0x74, 0x6b, 0x63, 0x5d, 0x5a, 0x59, 0x5b, + 0x5e, 0x60, 0x63, 0x68, 0x6e, 0x76, 0x80, 0x8a, 0x93, 0x9a, 0x9f, + 0xa2, 0xa5, 0xa7, 0xa8, 0xa7, 0xa3, 0x9d, 0x96, 0x8e, 0x85, 0x7d, + 0x74, 0x6b, 0x62, 0x5b, 0x56, 0x56, 0x57, 0x58, 0x59, 0x5b, 0x60, + 0x68, 0x74, 0x80, 0x8c, 0x95, 0x9c, 0xa2, 0xa5, 0xa9, 0xab, 0xac, + 0xaa, 0xa5, 0x9e, 0x96, 0x8d, 0x84, 0x7b, 0x71, 0x68, 0x5f, 0x57, + 0x53, 0x54, 0x54, 0x55, 0x56, 0x59, 0x5f, 0x69, 0x75, 0x82, 0x8f, + 0x97, 0x9f, 0xa5, 0xa8, 0xac, 0xae, 0xae, 0xab, 0xa6, 0x9e, 0x96, + 0x8c, 0x82, 0x78, 0x6e, 0x64, 0x5a, 0x53, 0x51, 0x52, 0x52, 0x53, + 0x54, 0x59, 0x60, 0x6c, 0x78, 0x86, 0x93, 0x9b, 0xa4, 0xa8, 0xac, + 0xaf, 0xb0, 0xaf, 0xad, 0xa6, 0x9e, 0x95, 0x8b, 0x7f, 0x75, 0x69, + 0x5e, 0x53, 0x4f, 0x4f, 0x4f, 0x53, 0x50, 0x56, 0x5a, 0x65, 0x72, + 0x81, 0x90, 0x9a, 0xa2, 0xa9, 0xac, 0xae, 0xb1, 0xad, 0xac, 0xa5, + 0x9e, 0x95, 0x8b, 0x80, 0x76, 0x6a, 0x60, 0x53, 0x4f, 0x51, 0x4f, + 0x56, 0x53, 0x58, 0x5c, 0x64, 0x73, 0x7f, 0x90, 0x9b, 0xa1, 0xa8, + 0xab, 0xad, 0xb1, 0xac, 0xaa, 0xa4, 0x9d, 0x95, 0x8a, 0x80, 0x76, + 0x69, 0x60, 0x53, 0x50, 0x53, 0x53, 0x5b, 0x58, 0x5d, 0x61, 0x69, + 0x77, 0x82, 0x91, 0x9c, 0xa1, 0xa7, 0xa8, 0xaa, 0xab, 0xa7, 0xa4, + 0x9d, 0x97, 0x8f, 0x86, 0x7c, 0x72, 0x66, 0x5e, 0x51, 0x52, 0x53, + 0x55, 0x5c, 0x58, 0x60, 0x62, 0x6d, 0x7b, 0x87, 0x97, 0x9f, 0xa4, + 0xaa, 0xa9, 0xad, 0xaa, 0xa7, 0xa3, 0x9c, 0x95, 0x8c, 0x81, 0x78, + 0x6c, 0x62, 0x57, 0x4e, 0x55, 0x51, 0x5c, 0x59, 0x5d, 0x63, 0x68, + 0x78, 0x82, 0x92, 0xa0, 0xa3, 0xab, 0xac, 0xac, 0xaf, 0xa9, 0xa6, + 0x9e, 0x97, 0x8e, 0x83, 0x7a, 0x6f, 0x63, 0x59, 0x4b, 0x51, 0x4f, + 0x57, 0x5a, 0x5a, 0x64, 0x63, 0x74, 0x80, 0x8f, 0x9f, 0xa4, 0xab, + 0xae, 0xad, 0xaf, 0xac, 0xa9, 0xa0, 0x98, 0x8f, 0x85, 0x7c, 0x70, + 0x62, 0x59, 0x49, 0x4e, 0x4d, 0x55, 0x5b, 0x59, 0x64, 0x63, 0x73, + 0x80, 0x8f, 0xa1, 0xa5, 0xab, 0xaf, 0xaf, 0xb1, 0xac, 0xa9, 0xa0, + 0x97, 0x90, 0x83, 0x7c, 0x6d, 0x62, 0x55, 0x47, 0x4d, 0x49, 0x57, + 0x59, 0x5a, 0x63, 0x62, 0x77, 0x80, 0x93, 0xa4, 0xa7, 0xb0, 0xaf, + 0xaf, 0xb2, 0xac, 0xaa, 0x9e, 0x98, 0x8d, 0x80, 0x79, 0x67, 0x60, + 0x4e, 0x48, 0x4e, 0x4b, 0x5c, 0x58, 0x61, 0x65, 0x68, 0x7c, 0x83, + 0x9a, 0xa4, 0xa8, 0xb0, 0xac, 0xaf, 0xad, 0xa8, 0xa6, 0x99, 0x94, + 0x85, 0x7d, 0x72, 0x62, 0x5c, 0x47, 0x4d, 0x4a, 0x52, 0x5b, 0x58, + 0x67, 0x62, 0x73, 0x7f, 0x8d, 0xa5, 0xa5, 0xb0, 0xae, 0xac, 0xb1, + 0xa9, 0xaa, 0x9f, 0x96, 0x8e, 0x7d, 0x7a, 0x66, 0x60, 0x4e, 0x47, + 0x4d, 0x49, 0x5d, 0x56, 0x62, 0x64, 0x6a, 0x7f, 0x85, 0x9e, 0xa7, + 0xab, 0xb2, 0xac, 0xaf, 0xae, 0xa8, 0xa6, 0x96, 0x92, 0x81, 0x79, + 0x6d, 0x5f, 0x53, 0x44, 0x4c, 0x45, 0x59, 0x56, 0x5e, 0x66, 0x65, + 0x7c, 0x81, 0x9b, 0xa6, 0xac, 0xb2, 0xae, 0xb1, 0xaf, 0xa9, 0xa8, + 0x98, 0x94, 0x83, 0x7a, 0x6e, 0x60, 0x56, 0x42, 0x4f, 0x43, 0x58, + 0x55, 0x5d, 0x68, 0x64, 0x7d, 0x80, 0x9b, 0xa8, 0xad, 0xb5, 0xb0, + 0xb1, 0xb0, 0xab, 0xa9, 0x9a, 0x97, 0x84, 0x7b, 0x6f, 0x5f, 0x56, + 0x42, 0x4e, 0x43, 0x57, 0x56, 0x5c, 0x68, 0x64, 0x7d, 0x80, 0x9a, + 0xa8, 0xad, 0xb5, 0xb0, 0xb1, 0xb0, 0xa9, 0xa8, 0x98, 0x95, 0x82, + 0x7a, 0x6c, 0x5d, 0x51, 0x41, 0x4e, 0x41, 0x5b, 0x53, 0x60, 0x66, + 0x66, 0x7f, 0x81, 0x9f, 0xa8, 0xb0, 0xb6, 0xaf, 0xb3, 0xae, 0xaa, + 0xa6, 0x96, 0x94, 0x7d, 0x7a, 0x65, 0x5d, 0x49, 0x48, 0x4a, 0x49, + 0x5f, 0x53, 0x6b, 0x62, 0x75, 0x7e, 0x8c, 0xa4, 0xa8, 0xb3, 0xb0, + 0xaf, 0xae, 0xa7, 0xa7, 0x9b, 0x95, 0x89, 0x7b, 0x72, 0x60, 0x57, + 0x43, 0x50, 0x44, 0x59, 0x58, 0x5e, 0x6a, 0x65, 0x7f, 0x7e, 0x99, + 0xa6, 0xaa, 0xb4, 0xac, 0xaf, 0xa9, 0xa6, 0xa3, 0x94, 0x93, 0x7e, + 0x7a, 0x65, 0x5e, 0x47, 0x4c, 0x4a, 0x4d, 0x5e, 0x54, 0x6c, 0x62, + 0x78, 0x7e, 0x8f, 0xa5, 0xa8, 0xb4, 0xaf, 0xaf, 0xac, 0xa6, 0xa6, + 0x97, 0x96, 0x82, 0x7c, 0x6b, 0x60, 0x4d, 0x47, 0x4e, 0x47, 0x60, + 0x53, 0x6a, 0x64, 0x71, 0x80, 0x85, 0xa3, 0xa4, 0xb2, 0xb1, 0xad, + 0xae, 0xa4, 0xa8, 0x97, 0x94, 0x87, 0x7b, 0x72, 0x5f, 0x53, 0x43, + 0x50, 0x45, 0x5d, 0x55, 0x62, 0x69, 0x6b, 0x82, 0x83, 0x9d, 0xa5, + 0xae, 0xb4, 0xac, 0xaf, 0xa6, 0xa6, 0x9e, 0x93, 0x8d, 0x7d, 0x76, + 0x61, 0x56, 0x45, 0x50, 0x47, 0x58, 0x59, 0x5f, 0x6c, 0x67, 0x80, + 0x80, 0x9b, 0xa4, 0xac, 0xb3, 0xaa, 0xb1, 0xa5, 0xa7, 0x9b, 0x95, + 0x8d, 0x7d, 0x76, 0x63, 0x5a, 0x44, 0x51, 0x48, 0x5a, 0x5b, 0x5f, + 0x6c, 0x69, 0x80, 0x81, 0x9a, 0xa5, 0xac, 0xb3, 0xab, 0xb0, 0xa7, + 0xa6, 0x9e, 0x94, 0x8d, 0x7f, 0x77, 0x64, 0x58, 0x45, 0x4e, 0x46, + 0x58, 0x5a, 0x5f, 0x6a, 0x67, 0x81, 0x80, 0x9c, 0xa6, 0xac, 0xb4, + 0xab, 0xb1, 0xa6, 0xa8, 0x9e, 0x93, 0x8d, 0x7e, 0x79, 0x62, 0x58, + 0x44, 0x4d, 0x46, 0x57, 0x59, 0x5e, 0x6d, 0x69, 0x80, 0x82, 0x98, + 0xa5, 0xac, 0xb1, 0xab, 0xb0, 0xa7, 0xa6, 0x9c, 0x94, 0x8e, 0x7e, + 0x78, 0x65, 0x58, 0x44, 0x50, 0x46, 0x58, 0x5a, 0x5f, 0x6c, 0x67, + 0x80, 0x81, 0x9a, 0xa3, 0xaa, 0xb3, 0xab, 0xaf, 0xa6, 0xa5, 0x9c, + 0x94, 0x8c, 0x7f, 0x77, 0x64, 0x56, 0x45, 0x52, 0x4a, 0x5b, 0x58, + 0x63, 0x69, 0x6b, 0x81, 0x80, 0x9d, 0xa2, 0xac, 0xae, 0xa9, 0xaa, + 0xa2, 0xa3, 0x99, 0x95, 0x8b, 0x7f, 0x76, 0x62, 0x57, 0x47, 0x53, + 0x4b, 0x5e, 0x5a, 0x65, 0x6c, 0x6c, 0x83, 0x7f, 0x9f, 0xa1, 0xac, + 0xae, 0xa7, 0xac, 0x9e, 0xa5, 0x96, 0x96, 0x89, 0x7e, 0x75, 0x63, + 0x59, 0x49, 0x56, 0x4d, 0x64, 0x5c, 0x69, 0x6a, 0x71, 0x82, 0x84, + 0x9f, 0xa1, 0xad, 0xa7, 0xa7, 0xa4, 0xa0, 0x9f, 0x94, 0x93, 0x85, + 0x80, 0x72, 0x66, 0x52, 0x50, 0x55, 0x50, 0x67, 0x5a, 0x6f, 0x67, + 0x76, 0x80, 0x85, 0xa2, 0x9d, 0xae, 0xa4, 0xa7, 0xa0, 0x9c, 0x9f, + 0x90, 0x94, 0x83, 0x81, 0x71, 0x67, 0x59, 0x56, 0x5e, 0x58, 0x6c, + 0x61, 0x72, 0x6a, 0x78, 0x80, 0x85, 0x9a, 0x97, 0xa3, 0x9b, 0x9e, + 0x99, 0x95, 0x98, 0x8c, 0x90, 0x82, 0x80, 0x74, 0x6a, 0x5d, 0x5e, + 0x5e, 0x61, 0x6e, 0x64, 0x75, 0x6a, 0x7e, 0x7c, 0x89, 0x95, 0x97, + 0x9f, 0x97, 0x9c, 0x95, 0x97, 0x91, 0x8e, 0x8c, 0x81, 0x84, 0x73, + 0x71, 0x5d, 0x61, 0x60, 0x63, 0x74, 0x64, 0x7d, 0x69, 0x7d, 0x7a, + 0x87, 0x96, 0x91, 0xa0, 0x93, 0x9a, 0x91, 0x93, 0x94, 0x87, 0x91, + 0x7f, 0x88, 0x76, 0x76, 0x65, 0x5e, 0x6c, 0x5a, 0x7e, 0x5d, 0x81, + 0x6a, 0x77, 0x7f, 0x7b, 0x98, 0x8b, 0x9f, 0x92, 0x97, 0x94, 0x8d, + 0x96, 0x86, 0x8d, 0x85, 0x7f, 0x85, 0x6d, 0x7f, 0x50, 0x78, 0x58, + 0x73, 0x75, 0x66, 0x8a, 0x5d, 0x91, 0x6c, 0x92, 0x8b, 0x91, 0x99, + 0x8d, 0x96, 0x8d, 0x93, 0x8c, 0x89, 0x87, 0x83, 0x82, 0x83, 0x75, + 0x7f, 0x5a, 0x7a, 0x5a, 0x77, 0x75, 0x6d, 0x88, 0x63, 0x8c, 0x6e, + 0x8a, 0x8b, 0x89, 0x97, 0x85, 0x95, 0x86, 0x90, 0x8b, 0x85, 0x8b, + 0x7d, 0x87, 0x7d, 0x81, 0x7c, 0x72, 0x6d, 0x6e, 0x6b, 0x77, 0x76, + 0x78, 0x7a, 0x6e, 0x7f, 0x72, 0x8d, 0x89, 0x94, 0x92, 0x8a, 0x91, + 0x8d, 0x96, 0x90, 0x8d, 0x8b, 0x81, 0x87, 0x82, 0x84, 0x84, 0x77, + 0x78, 0x63, 0x72, 0x67, 0x76, 0x74, 0x70, 0x76, 0x6b, 0x7c, 0x77, + 0x85, 0x88, 0x89, 0x8d, 0x87, 0x91, 0x8c, 0x92, 0x8e, 0x88, 0x89, + 0x80, 0x89, 0x80, 0x88, 0x80, 0x7d, 0x7d, 0x75, 0x7c, 0x72, 0x79, + 0x71, 0x71, 0x75, 0x70, 0x7b, 0x73, 0x7d, 0x7b, 0x7d, 0x85, 0x84, + 0x90, 0x8c, 0x90, 0x8d, 0x8a, 0x8b, 0x87, 0x88, 0x84, 0x80, 0x7b, + 0x78, 0x76, 0x72, 0x71, 0x6f, 0x73, 0x74, 0x77, 0x7b, 0x7d, 0x81, + 0x82, 0x85, 0x86, 0x89, 0x88, 0x8a, 0x86, 0x87, 0x83, 0x81, 0x82, + 0x7e, 0x81, 0x7e, 0x83, 0x82, 0x85, 0x87, 0x86, 0x88, 0x86, 0x86, + 0x84, 0x83, 0x81, 0x7e, 0x7d, 0x79, 0x78, 0x76, 0x75, 0x76, 0x75, + 0x78, 0x78, 0x7b, 0x7b, 0x7c, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78, + 0x79, 0x79, 0x7a, 0x7b, 0x7c, 0x7f, 0x7f, 0x81, 0x82, 0x84, 0x85, + 0x87, 0x89, 0x8b, 0x8d, 0x8c, 0x8e, 0x8a, 0x8c, 0x89, 0x8a, 0x85, + 0x83, 0x7a, 0x77, 0x6b, 0x6b, 0x6a, 0x68, 0x72, 0x69, 0x77, 0x6f, + 0x7c, 0x7f, 0x85, 0x91, 0x8e, 0x96, 0x8f, 0x91, 0x8c, 0x89, 0x89, + 0x82, 0x82, 0x7c, 0x7c, 0x7d, 0x7a, 0x80, 0x7d, 0x84, 0x84, 0x86, + 0x8b, 0x88, 0x8c, 0x87, 0x88, 0x83, 0x80, 0x7e, 0x78, 0x77, 0x73, + 0x73, 0x73, 0x73, 0x76, 0x76, 0x7a, 0x7b, 0x7d, 0x80, 0x81, 0x83, + 0x82, 0x83, 0x82, 0x83, 0x82, 0x82, 0x80, 0x80, 0x7e, 0x80, 0x81, + 0x81, 0x86, 0x83, 0x87, 0x83, 0x86, 0x84, 0x82, 0x83, 0x7e, 0x7d, + 0x77, 0x77, 0x74, 0x74, 0x74, 0x74, 0x76, 0x77, 0x7a, 0x7d, 0x7f, + 0x82, 0x82, 0x85, 0x84, 0x84, 0x84, 0x82, 0x82, 0x80, 0x7f, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7f, 0x7f, 0x81, 0x83, 0x84, 0x86, 0x86, 0x86, + 0x86, 0x85, 0x84, 0x82, 0x81, 0x7f, 0x7d, 0x7b, 0x7b, 0x7a, 0x7a, + 0x7a, 0x7a, 0x7b, 0x7c, 0x7d, 0x7f, 0x80, 0x81, 0x82, 0x82, 0x82, + 0x83, 0x82, 0x82, 0x82, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, + 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + }, + { // 3 + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x80, 0x80, 0x81, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x7f, 0x80, 0x82, 0x7f, 0x7f, + 0x7e, 0x81, 0x7f, 0x7e, 0x80, 0x80, 0x7e, 0x7e, 0x7f, 0x7e, 0x7e, + 0x7e, 0x81, 0x7d, 0x7d, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x82, 0x81, 0x80, 0x83, 0x82, 0x82, 0x84, 0x83, 0x81, 0x81, + 0x80, 0x82, 0x83, 0x81, 0x80, 0x82, 0x7e, 0x7c, 0x7e, 0x7e, 0x7d, + 0x7e, 0x7d, 0x7a, 0x7a, 0x7b, 0x7d, 0x7b, 0x7e, 0x80, 0x7d, 0x7d, + 0x81, 0x80, 0x82, 0x83, 0x82, 0x84, 0x84, 0x83, 0x84, 0x84, 0x84, + 0x86, 0x82, 0x82, 0x83, 0x82, 0x81, 0x81, 0x80, 0x7e, 0x7e, 0x7c, + 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x79, 0x79, 0x7b, 0x7a, 0x7b, 0x7d, + 0x7f, 0x80, 0x80, 0x80, 0x81, 0x83, 0x82, 0x84, 0x85, 0x86, 0x85, + 0x85, 0x87, 0x84, 0x83, 0x84, 0x82, 0x81, 0x80, 0x7f, 0x7d, 0x7c, + 0x7d, 0x7a, 0x7a, 0x7b, 0x7a, 0x7a, 0x79, 0x77, 0x7a, 0x7a, 0x7c, + 0x7d, 0x7e, 0x8f, 0x82, 0x7c, 0x81, 0x7b, 0x7f, 0x82, 0x86, 0x86, + 0x81, 0x86, 0x86, 0x81, 0x85, 0x89, 0x83, 0x82, 0x80, 0x80, 0x81, + 0x7d, 0x7c, 0x7e, 0x7b, 0x74, 0x78, 0x76, 0x75, 0x73, 0x79, 0x79, + 0x76, 0x7c, 0x81, 0x80, 0x7f, 0x80, 0x84, 0x82, 0x81, 0x86, 0x88, + 0x84, 0x84, 0x88, 0x86, 0x83, 0x84, 0x87, 0x83, 0x82, 0x80, 0x85, + 0x80, 0x78, 0x80, 0x7d, 0x77, 0x7c, 0x7d, 0x7b, 0x7a, 0x79, 0x77, + 0x75, 0x79, 0x7b, 0x7b, 0x7f, 0x7c, 0x7c, 0x80, 0x7d, 0x82, 0x82, + 0x84, 0x89, 0x87, 0x8b, 0x85, 0x84, 0x8e, 0x87, 0x88, 0x8a, 0x86, + 0x88, 0x82, 0x83, 0x7f, 0x7d, 0x7e, 0x7a, 0x7d, 0x79, 0x77, 0x76, + 0x76, 0x73, 0x73, 0x77, 0x79, 0x7b, 0x7c, 0x80, 0x7e, 0x7e, 0x80, + 0x84, 0x83, 0x83, 0x87, 0x84, 0x85, 0x88, 0x87, 0x87, 0x89, 0x87, + 0x85, 0x83, 0x85, 0x80, 0x7c, 0x83, 0x7c, 0x7a, 0x7d, 0x7d, 0x7a, + 0x7a, 0x7d, 0x76, 0x76, 0x7c, 0x80, 0x7d, 0x7c, 0x7c, 0x7b, 0x7c, + 0x7a, 0x82, 0x86, 0x81, 0x7d, 0x86, 0x82, 0x78, 0x7e, 0x85, 0x85, + 0x86, 0x86, 0x83, 0x82, 0x80, 0x87, 0x89, 0x7f, 0x81, 0x7e, 0x7b, + 0x79, 0x7b, 0x85, 0x85, 0x80, 0x7e, 0x79, 0x75, 0x76, 0x7a, 0x82, + 0x82, 0x82, 0x82, 0x81, 0x7b, 0x7a, 0x82, 0x83, 0x81, 0x83, 0x86, + 0x83, 0x83, 0x7e, 0x7f, 0x7d, 0x7d, 0x83, 0x83, 0x85, 0x84, 0x83, + 0x7e, 0x78, 0x7a, 0x7e, 0x81, 0x83, 0x84, 0x80, 0x7d, 0x7c, 0x7d, + 0x7b, 0x7b, 0x84, 0x81, 0x7d, 0x7c, 0x7d, 0x7b, 0x7f, 0x85, 0x85, + 0x81, 0x7f, 0x81, 0x7d, 0x7a, 0x7b, 0x81, 0x87, 0x82, 0x83, 0x84, + 0x7f, 0x7b, 0x7c, 0x80, 0x82, 0x84, 0x82, 0x81, 0x7d, 0x80, 0x7c, + 0x7b, 0x81, 0x84, 0x83, 0x7e, 0x7f, 0x7d, 0x7e, 0x7e, 0x84, 0x84, + 0x84, 0x81, 0x7d, 0x7e, 0x7e, 0x80, 0x80, 0x7c, 0x77, 0x7d, 0x7f, + 0x7b, 0x7c, 0x7a, 0x7c, 0x7c, 0x7a, 0x7d, 0x78, 0x7e, 0x7f, 0x7d, + 0x82, 0x82, 0x85, 0x8d, 0x8c, 0x86, 0x87, 0x86, 0x86, 0x82, 0x8f, + 0x95, 0x8a, 0x82, 0x7c, 0x75, 0x70, 0x73, 0x7b, 0x7d, 0x6e, 0x64, + 0x5f, 0x64, 0x6a, 0x6e, 0x6d, 0x73, 0x87, 0x8c, 0x85, 0x86, 0x98, + 0xa6, 0x9c, 0x9a, 0x9d, 0x9c, 0x99, 0x99, 0xa0, 0x9c, 0x97, 0x87, + 0x78, 0x66, 0x63, 0x67, 0x6e, 0x69, 0x64, 0x60, 0x4b, 0x4a, 0x5a, + 0x6a, 0x60, 0x6f, 0x82, 0x81, 0x85, 0x94, 0xa7, 0x9e, 0x96, 0x9c, + 0xa9, 0xaa, 0xac, 0xb3, 0xa3, 0x90, 0x81, 0x83, 0x80, 0x78, 0x7d, + 0x7a, 0x6b, 0x51, 0x51, 0x56, 0x52, 0x67, 0x80, 0x7f, 0x67, 0x64, + 0x6d, 0x75, 0x7c, 0x95, 0xae, 0xa3, 0x92, 0x8b, 0x9a, 0x9d, 0x9e, + 0xa3, 0x9f, 0x8a, 0x7e, 0x7e, 0x81, 0x81, 0x7f, 0x85, 0x71, 0x53, + 0x46, 0x4c, 0x50, 0x60, 0x81, 0x93, 0x81, 0x64, 0x5e, 0x66, 0x76, + 0x8c, 0xa8, 0xb3, 0xa6, 0x93, 0x94, 0x97, 0x99, 0x9b, 0x9d, 0x96, + 0x8a, 0x85, 0x83, 0x80, 0x7d, 0x7b, 0x77, 0x63, 0x49, 0x49, 0x43, + 0x5d, 0x7e, 0x8e, 0x8a, 0x69, 0x5f, 0x5f, 0x6e, 0x81, 0x9e, 0xb1, + 0xa8, 0x9b, 0x93, 0x98, 0x9a, 0x98, 0x97, 0x96, 0x8c, 0x85, 0x87, + 0x87, 0x83, 0x79, 0x78, 0x69, 0x4b, 0x47, 0x4e, 0x4e, 0x6f, 0x93, + 0x90, 0x73, 0x57, 0x5e, 0x67, 0x74, 0x94, 0xb4, 0xb8, 0x99, 0x90, + 0x9a, 0xa1, 0x96, 0x94, 0x9c, 0x96, 0x88, 0x86, 0x8e, 0x82, 0x79, + 0x72, 0x6c, 0x50, 0x41, 0x41, 0x47, 0x7a, 0x93, 0x98, 0x78, 0x50, + 0x4e, 0x5b, 0x7f, 0x98, 0xb4, 0xc1, 0xa9, 0x90, 0x8a, 0x96, 0x99, + 0x9a, 0x9c, 0x9b, 0x90, 0x87, 0x84, 0x7d, 0x7c, 0x72, 0x6b, 0x53, + 0x40, 0x3f, 0x4b, 0x7a, 0x9b, 0x97, 0x6d, 0x50, 0x54, 0x63, 0x78, + 0x97, 0xb8, 0xc0, 0xa2, 0x8b, 0x8f, 0x97, 0x98, 0x95, 0x9c, 0x9a, + 0x8f, 0x86, 0x84, 0x7e, 0x78, 0x6e, 0x6c, 0x52, 0x40, 0x3e, 0x5b, + 0x87, 0x94, 0x92, 0x69, 0x50, 0x4d, 0x67, 0x8a, 0xa4, 0xbd, 0xb7, + 0x9b, 0x84, 0x88, 0x98, 0x9d, 0x9d, 0x9a, 0x95, 0x88, 0x82, 0x7f, + 0x7e, 0x78, 0x6f, 0x68, 0x4b, 0x40, 0x3f, 0x6f, 0x97, 0x9b, 0x81, + 0x58, 0x54, 0x56, 0x6f, 0x90, 0xb1, 0xbd, 0xb2, 0x94, 0x7e, 0x86, + 0x98, 0xa1, 0x9c, 0x98, 0x95, 0x89, 0x80, 0x78, 0x7b, 0x78, 0x72, + 0x62, 0x45, 0x3e, 0x45, 0x78, 0x9c, 0x9a, 0x77, 0x56, 0x4d, 0x59, + 0x7c, 0x9b, 0xb0, 0xb4, 0xae, 0x93, 0x82, 0x86, 0x98, 0xa2, 0x9d, + 0x97, 0x8f, 0x87, 0x80, 0x78, 0x7a, 0x77, 0x6b, 0x58, 0x4a, 0x3b, + 0x4d, 0x8c, 0xa8, 0x94, 0x5b, 0x4a, 0x57, 0x6c, 0x83, 0xa0, 0xb9, + 0xb6, 0x9d, 0x8b, 0x8a, 0x8f, 0x97, 0x9c, 0x9d, 0x94, 0x8b, 0x84, + 0x80, 0x79, 0x79, 0x6e, 0x63, 0x4d, 0x3c, 0x3b, 0x6e, 0xab, 0xab, + 0x78, 0x45, 0x4b, 0x60, 0x78, 0x8d, 0xb2, 0xc6, 0xaf, 0x8b, 0x7c, + 0x88, 0x96, 0x9b, 0x9e, 0x99, 0x90, 0x85, 0x7d, 0x79, 0x78, 0x76, + 0x6d, 0x58, 0x42, 0x39, 0x5c, 0x98, 0xac, 0x89, 0x55, 0x4c, 0x5e, + 0x75, 0x85, 0x9f, 0xb6, 0xb6, 0x97, 0x82, 0x85, 0x92, 0x9b, 0x9b, + 0x98, 0x90, 0x8a, 0x83, 0x7e, 0x79, 0x7b, 0x75, 0x64, 0x4d, 0x3b, + 0x40, 0x78, 0xac, 0xa6, 0x70, 0x4b, 0x51, 0x64, 0x76, 0x8f, 0xb2, + 0xc0, 0xab, 0x8c, 0x7f, 0x89, 0x94, 0x97, 0x99, 0x98, 0x8f, 0x85, + 0x7d, 0x7b, 0x77, 0x71, 0x67, 0x56, 0x44, 0x3a, 0x69, 0xa9, 0xb4, + 0x75, 0x45, 0x50, 0x6e, 0x7c, 0x82, 0xa5, 0xc0, 0xb3, 0x8a, 0x7b, + 0x86, 0x97, 0x98, 0x99, 0x98, 0x8f, 0x84, 0x7e, 0x7b, 0x7b, 0x76, + 0x6d, 0x56, 0x42, 0x40, 0x5e, 0xa5, 0xb3, 0x82, 0x44, 0x47, 0x6c, + 0x7e, 0x82, 0x9b, 0xb7, 0xaf, 0x98, 0x83, 0x83, 0x8d, 0x97, 0x9b, + 0x96, 0x8f, 0x8a, 0x87, 0x7c, 0x75, 0x73, 0x70, 0x61, 0x48, 0x42, + 0x56, 0x96, 0xae, 0x8f, 0x58, 0x47, 0x61, 0x73, 0x85, 0x95, 0xb4, + 0xb7, 0x9e, 0x7d, 0x7d, 0x92, 0x9b, 0x97, 0x91, 0x92, 0x8b, 0x81, + 0x78, 0x7a, 0x79, 0x6c, 0x5a, 0x4d, 0x42, 0x55, 0x91, 0xb1, 0x90, + 0x59, 0x4a, 0x61, 0x74, 0x7f, 0x9a, 0xb5, 0xb7, 0x9c, 0x80, 0x81, + 0x8f, 0x98, 0x95, 0x93, 0x93, 0x8c, 0x82, 0x7a, 0x7b, 0x77, 0x6a, + 0x56, 0x46, 0x3c, 0x58, 0x9d, 0xb7, 0x8d, 0x4c, 0x41, 0x60, 0x7c, + 0x88, 0x9a, 0xb8, 0xba, 0x9b, 0x76, 0x7b, 0x94, 0xa2, 0x97, 0x90, + 0x90, 0x8f, 0x80, 0x72, 0x74, 0x77, 0x6b, 0x53, 0x43, 0x40, 0x6e, + 0xa1, 0xab, 0x7b, 0x4b, 0x4a, 0x69, 0x80, 0x8c, 0xa5, 0xb4, 0xaf, + 0x93, 0x83, 0x83, 0x92, 0x99, 0x98, 0x92, 0x8d, 0x8a, 0x82, 0x79, + 0x75, 0x72, 0x65, 0x54, 0x3f, 0x49, 0x77, 0xa9, 0xa1, 0x6f, 0x4a, + 0x55, 0x6e, 0x7c, 0x8a, 0xa7, 0xbe, 0xb1, 0x8b, 0x75, 0x86, 0x98, + 0x9d, 0x92, 0x92, 0x92, 0x89, 0x77, 0x70, 0x76, 0x74, 0x61, 0x50, + 0x43, 0x52, 0x84, 0xa7, 0x95, 0x63, 0x51, 0x5f, 0x75, 0x7f, 0x91, + 0xaa, 0xba, 0xaa, 0x8a, 0x7b, 0x87, 0x99, 0x99, 0x91, 0x8d, 0x8e, + 0x88, 0x7a, 0x72, 0x72, 0x6b, 0x5b, 0x45, 0x45, 0x6f, 0xa0, 0xa4, + 0x75, 0x52, 0x56, 0x6a, 0x78, 0x85, 0xa2, 0xb6, 0xad, 0x92, 0x81, + 0x86, 0x93, 0x97, 0x95, 0x91, 0x8f, 0x8d, 0x82, 0x78, 0x76, 0x6f, + 0x64, 0x56, 0x46, 0x4f, 0x81, 0xa5, 0x96, 0x65, 0x4f, 0x61, 0x73, + 0x7a, 0x88, 0xaf, 0xbe, 0xa7, 0x83, 0x7b, 0x8d, 0x9c, 0x97, 0x90, + 0x93, 0x93, 0x86, 0x71, 0x71, 0x73, 0x6f, 0x5e, 0x4a, 0x47, 0x66, + 0x97, 0x9e, 0x78, 0x58, 0x5d, 0x70, 0x76, 0x82, 0x9a, 0xb6, 0xb3, + 0x94, 0x7e, 0x84, 0x98, 0x9a, 0x90, 0x8c, 0x91, 0x8d, 0x7c, 0x70, + 0x74, 0x73, 0x68, 0x52, 0x43, 0x54, 0x86, 0xa4, 0x8a, 0x63, 0x59, + 0x69, 0x73, 0x7a, 0x8c, 0xac, 0xb8, 0xa5, 0x87, 0x7f, 0x8e, 0x9a, + 0x94, 0x8c, 0x8d, 0x90, 0x87, 0x74, 0x72, 0x6e, 0x69, 0x5b, 0x4b, + 0x4e, 0x78, 0x9d, 0x93, 0x6a, 0x57, 0x65, 0x75, 0x7a, 0x86, 0xa5, + 0xb5, 0xa9, 0x89, 0x7e, 0x8a, 0x9a, 0x96, 0x8f, 0x8b, 0x90, 0x87, + 0x77, 0x71, 0x71, 0x70, 0x64, 0x50, 0x47, 0x6c, 0x94, 0x98, 0x74, + 0x5e, 0x67, 0x74, 0x75, 0x80, 0x9c, 0xb1, 0xab, 0x91, 0x82, 0x89, + 0x96, 0x94, 0x91, 0x8d, 0x90, 0x89, 0x7a, 0x72, 0x72, 0x6e, 0x64, + 0x52, 0x4d, 0x6d, 0x93, 0x94, 0x73, 0x5e, 0x66, 0x76, 0x7b, 0x81, + 0x97, 0xb0, 0xab, 0x93, 0x82, 0x89, 0x95, 0x96, 0x8e, 0x8a, 0x8e, + 0x8a, 0x7b, 0x71, 0x6f, 0x6c, 0x66, 0x56, 0x51, 0x6c, 0x8f, 0x92, + 0x75, 0x60, 0x65, 0x74, 0x7b, 0x87, 0x9e, 0xad, 0xaa, 0x96, 0x86, + 0x8a, 0x95, 0x9a, 0x95, 0x8d, 0x8b, 0x86, 0x7c, 0x73, 0x6a, 0x65, + 0x63, 0x54, 0x4b, 0x6a, 0x91, 0x93, 0x71, 0x59, 0x62, 0x75, 0x7d, + 0x85, 0x9c, 0xb1, 0xac, 0x93, 0x84, 0x8b, 0x97, 0x97, 0x91, 0x8c, + 0x91, 0x8a, 0x7d, 0x6f, 0x66, 0x64, 0x60, 0x53, 0x55, 0x74, 0x8e, + 0x89, 0x6b, 0x5e, 0x67, 0x75, 0x7c, 0x89, 0x9e, 0xaf, 0xa6, 0x91, + 0x88, 0x8f, 0x96, 0x93, 0x8e, 0x8d, 0x91, 0x87, 0x7b, 0x6f, 0x68, + 0x61, 0x60, 0x55, 0x5d, 0x78, 0x88, 0x82, 0x6a, 0x63, 0x69, 0x76, + 0x80, 0x8e, 0xa1, 0xa9, 0x9f, 0x90, 0x89, 0x8e, 0x93, 0x94, 0x90, + 0x8e, 0x8b, 0x82, 0x77, 0x6d, 0x68, 0x63, 0x60, 0x56, 0x64, 0x81, + 0x8a, 0x78, 0x64, 0x66, 0x72, 0x7b, 0x82, 0x93, 0xa3, 0xa7, 0x98, + 0x8b, 0x8a, 0x92, 0x95, 0x92, 0x8d, 0x8c, 0x89, 0x80, 0x75, 0x69, + 0x63, 0x64, 0x5e, 0x5f, 0x71, 0x83, 0x83, 0x6f, 0x63, 0x6a, 0x77, + 0x80, 0x8a, 0x97, 0xa3, 0x9f, 0x90, 0x89, 0x8f, 0x97, 0x95, 0x8e, + 0x8d, 0x8d, 0x87, 0x7c, 0x72, 0x6d, 0x68, 0x65, 0x5c, 0x62, 0x78, + 0x85, 0x7c, 0x6b, 0x66, 0x6e, 0x78, 0x80, 0x8e, 0x9e, 0xa7, 0xa0, + 0x94, 0x8e, 0x91, 0x97, 0x99, 0x93, 0x8e, 0x8a, 0x83, 0x78, 0x6b, + 0x62, 0x62, 0x60, 0x5f, 0x6b, 0x79, 0x7e, 0x71, 0x67, 0x68, 0x72, + 0x7e, 0x8a, 0x96, 0x9f, 0x9f, 0x97, 0x91, 0x92, 0x96, 0x97, 0x95, + 0x90, 0x8e, 0x87, 0x7e, 0x74, 0x6d, 0x67, 0x61, 0x5b, 0x63, 0x74, + 0x7d, 0x77, 0x6b, 0x67, 0x6b, 0x74, 0x7f, 0x8e, 0x9a, 0x9f, 0x9b, + 0x94, 0x90, 0x90, 0x94, 0x96, 0x93, 0x8f, 0x8a, 0x82, 0x79, 0x6f, + 0x66, 0x63, 0x61, 0x64, 0x71, 0x7a, 0x79, 0x6f, 0x68, 0x6a, 0x71, + 0x7c, 0x8a, 0x95, 0x9b, 0x98, 0x90, 0x8f, 0x93, 0x96, 0x95, 0x92, + 0x90, 0x8d, 0x86, 0x7d, 0x75, 0x6f, 0x68, 0x62, 0x61, 0x6b, 0x78, + 0x79, 0x71, 0x6a, 0x6b, 0x6f, 0x77, 0x81, 0x8e, 0x98, 0x99, 0x95, + 0x91, 0x91, 0x92, 0x93, 0x93, 0x92, 0x90, 0x8a, 0x80, 0x77, 0x6f, + 0x69, 0x65, 0x64, 0x6b, 0x75, 0x78, 0x72, 0x6b, 0x69, 0x6d, 0x74, + 0x7e, 0x89, 0x93, 0x96, 0x92, 0x8e, 0x90, 0x93, 0x95, 0x93, 0x91, + 0x90, 0x8c, 0x84, 0x7b, 0x75, 0x70, 0x6a, 0x65, 0x67, 0x71, 0x78, + 0x75, 0x6e, 0x6a, 0x6b, 0x70, 0x78, 0x83, 0x8d, 0x94, 0x93, 0x91, + 0x8f, 0x91, 0x93, 0x94, 0x92, 0x91, 0x8f, 0x89, 0x80, 0x77, 0x70, + 0x6a, 0x66, 0x68, 0x70, 0x76, 0x75, 0x6e, 0x69, 0x68, 0x6c, 0x76, + 0x82, 0x8c, 0x93, 0x93, 0x90, 0x90, 0x93, 0x96, 0x96, 0x95, 0x93, + 0x91, 0x8b, 0x82, 0x7a, 0x73, 0x6d, 0x67, 0x65, 0x6d, 0x75, 0x77, + 0x71, 0x6b, 0x68, 0x6a, 0x73, 0x7d, 0x88, 0x90, 0x92, 0x91, 0x90, + 0x91, 0x93, 0x94, 0x94, 0x94, 0x92, 0x8e, 0x85, 0x7c, 0x75, 0x70, + 0x6a, 0x67, 0x6b, 0x73, 0x76, 0x74, 0x6e, 0x6a, 0x6a, 0x6f, 0x79, + 0x84, 0x8d, 0x90, 0x90, 0x8e, 0x90, 0x93, 0x96, 0x95, 0x93, 0x91, + 0x8e, 0x88, 0x80, 0x7a, 0x73, 0x6d, 0x68, 0x69, 0x71, 0x76, 0x75, + 0x70, 0x6c, 0x6a, 0x6e, 0x76, 0x80, 0x89, 0x8f, 0x8f, 0x8e, 0x8e, + 0x91, 0x93, 0x94, 0x94, 0x92, 0x8f, 0x8a, 0x82, 0x7b, 0x75, 0x71, + 0x6c, 0x6b, 0x6f, 0x75, 0x76, 0x73, 0x6e, 0x6c, 0x6d, 0x73, 0x7c, + 0x85, 0x8c, 0x8e, 0x8e, 0x8d, 0x8e, 0x90, 0x93, 0x93, 0x92, 0x8f, + 0x8c, 0x85, 0x7e, 0x78, 0x74, 0x70, 0x6c, 0x6e, 0x74, 0x78, 0x76, + 0x72, 0x6e, 0x6d, 0x71, 0x78, 0x81, 0x88, 0x8d, 0x8d, 0x8c, 0x8d, + 0x8f, 0x90, 0x91, 0x90, 0x8e, 0x8c, 0x88, 0x81, 0x7a, 0x74, 0x70, + 0x6d, 0x6e, 0x74, 0x79, 0x78, 0x74, 0x70, 0x6e, 0x70, 0x77, 0x7f, + 0x87, 0x8c, 0x8c, 0x8b, 0x8b, 0x8b, 0x8d, 0x90, 0x90, 0x8f, 0x8c, + 0x88, 0x82, 0x7c, 0x77, 0x73, 0x71, 0x70, 0x73, 0x77, 0x7a, 0x77, + 0x73, 0x71, 0x71, 0x74, 0x7b, 0x83, 0x89, 0x8c, 0x8b, 0x8a, 0x8b, + 0x8b, 0x8c, 0x8d, 0x8e, 0x8c, 0x8a, 0x84, 0x7d, 0x77, 0x73, 0x71, + 0x71, 0x74, 0x79, 0x7c, 0x79, 0x75, 0x72, 0x72, 0x75, 0x7b, 0x83, + 0x88, 0x8b, 0x8a, 0x89, 0x89, 0x8b, 0x8c, 0x8b, 0x8b, 0x8b, 0x8a, + 0x87, 0x83, 0x7c, 0x76, 0x72, 0x70, 0x72, 0x79, 0x7e, 0x7e, 0x79, + 0x75, 0x72, 0x74, 0x78, 0x7e, 0x84, 0x88, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x88, 0x88, 0x88, 0x89, 0x88, 0x84, 0x7f, 0x7a, 0x74, 0x70, + 0x71, 0x77, 0x7e, 0x80, 0x7d, 0x78, 0x75, 0x74, 0x77, 0x7d, 0x83, + 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x84, 0x80, 0x7d, 0x78, 0x73, 0x71, 0x74, 0x7b, 0x80, 0x80, 0x7d, + 0x79, 0x76, 0x77, 0x7b, 0x81, 0x86, 0x88, 0x88, 0x88, 0x87, 0x87, + 0x86, 0x85, 0x84, 0x84, 0x84, 0x84, 0x81, 0x7d, 0x79, 0x75, 0x72, + 0x74, 0x79, 0x7e, 0x80, 0x7e, 0x7b, 0x79, 0x78, 0x7b, 0x7f, 0x84, + 0x87, 0x88, 0x88, 0x87, 0x87, 0x86, 0x85, 0x85, 0x85, 0x84, 0x83, + 0x7f, 0x7a, 0x75, 0x73, 0x72, 0x76, 0x7c, 0x7f, 0x7f, 0x7b, 0x79, + 0x78, 0x7a, 0x7e, 0x83, 0x87, 0x89, 0x88, 0x87, 0x86, 0x86, 0x85, + 0x84, 0x83, 0x82, 0x82, 0x81, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x79, 0x78, + 0x77, 0x76, 0x76, 0x77, 0x79, 0x7c, 0x7e, 0x7f, 0x80, 0x80, 0x81, + 0x83, 0x86, 0x89, 0x8b, 0x8c, 0x8b, 0x8a, 0x89, 0x87, 0x86, 0x84, + 0x82, 0x7f, 0x7d, 0x7a, 0x77, 0x76, 0x76, 0x78, 0x7c, 0x7e, 0x7d, + 0x7b, 0x7a, 0x7a, 0x7c, 0x7f, 0x82, 0x85, 0x86, 0x86, 0x84, 0x83, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x80, 0x7e, + 0x7c, 0x7c, 0x7e, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7c, 0x7d, + 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x80, 0x7f, 0x7e, 0x7d, + 0x7c, 0x7b, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7c, 0x7e, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0x89, 0x89, 0x88, 0x86, 0x85, + 0x83, 0x81, 0x7e, 0x7c, 0x7a, 0x79, 0x78, 0x78, 0x78, 0x79, 0x7b, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7f, 0x81, 0x83, 0x84, 0x85, 0x85, + 0x83, 0x82, 0x81, 0x81, 0x81, 0x82, 0x82, 0x81, 0x7f, 0x7e, 0x7c, + 0x7c, 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, + 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7d, 0x7d, + 0x7c, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, 0x7e, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, 0x84, 0x84, 0x83, 0x81, + 0x80, 0x7f, 0x7d, 0x7c, 0x7c, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, + 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x82, + 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, + 0x82, 0x82, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x80, 0x81, 0x81, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + }, + { // 4 + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, + 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7c, 0x7b, 0x79, 0x78, 0x77, 0x75, + 0x75, 0x75, 0x77, 0x79, 0x7a, 0x7d, 0x80, 0x83, 0x86, 0x89, 0x8c, + 0x8e, 0x8f, 0x91, 0x91, 0x91, 0x8f, 0x8c, 0x89, 0x86, 0x81, 0x7e, + 0x79, 0x75, 0x70, 0x6d, 0x69, 0x68, 0x68, 0x68, 0x6c, 0x6c, 0x71, + 0x75, 0x79, 0x7f, 0x85, 0x8b, 0x8f, 0x92, 0x94, 0x94, 0x94, 0x94, + 0x93, 0x92, 0x8f, 0x8e, 0x8b, 0x8a, 0x87, 0x85, 0x82, 0x7f, 0x7c, + 0x77, 0x75, 0x6e, 0x6f, 0x69, 0x68, 0x67, 0x64, 0x68, 0x68, 0x6d, + 0x73, 0x79, 0x7f, 0x86, 0x87, 0x8e, 0x8d, 0x91, 0x93, 0x93, 0x93, + 0x93, 0x91, 0x91, 0x8e, 0x8e, 0x8c, 0x89, 0x88, 0x82, 0x80, 0x79, + 0x75, 0x6d, 0x6e, 0x64, 0x66, 0x61, 0x5f, 0x63, 0x62, 0x6b, 0x71, + 0x78, 0x80, 0x87, 0x8a, 0x92, 0x91, 0x97, 0x97, 0x97, 0x99, 0x96, + 0x95, 0x94, 0x90, 0x90, 0x8b, 0x88, 0x85, 0x80, 0x7c, 0x76, 0x6f, + 0x6e, 0x67, 0x63, 0x66, 0x5b, 0x65, 0x61, 0x67, 0x70, 0x74, 0x7f, + 0x87, 0x89, 0x91, 0x93, 0x93, 0x9b, 0x96, 0x9a, 0x98, 0x94, 0x95, + 0x90, 0x8e, 0x8c, 0x88, 0x86, 0x81, 0x7c, 0x79, 0x71, 0x6d, 0x6d, + 0x61, 0x67, 0x5e, 0x5f, 0x65, 0x60, 0x6e, 0x71, 0x7a, 0x84, 0x89, + 0x8d, 0x95, 0x94, 0x99, 0x9b, 0x98, 0x9c, 0x95, 0x96, 0x93, 0x8e, + 0x8e, 0x88, 0x86, 0x82, 0x7d, 0x78, 0x74, 0x6b, 0x6f, 0x66, 0x66, + 0x69, 0x5f, 0x6b, 0x64, 0x6d, 0x75, 0x77, 0x84, 0x88, 0x8b, 0x91, + 0x93, 0x93, 0x9a, 0x94, 0x98, 0x95, 0x90, 0x94, 0x8b, 0x8c, 0x89, + 0x82, 0x82, 0x7d, 0x77, 0x75, 0x6b, 0x70, 0x68, 0x64, 0x6a, 0x5f, + 0x69, 0x67, 0x6a, 0x78, 0x77, 0x83, 0x8b, 0x8a, 0x93, 0x94, 0x94, + 0x9a, 0x96, 0x98, 0x97, 0x90, 0x93, 0x8c, 0x89, 0x88, 0x80, 0x81, + 0x7a, 0x75, 0x72, 0x67, 0x6e, 0x65, 0x65, 0x69, 0x5d, 0x6b, 0x65, + 0x6c, 0x7a, 0x78, 0x89, 0x8d, 0x8e, 0x98, 0x95, 0x99, 0x9c, 0x98, + 0x99, 0x95, 0x91, 0x91, 0x8a, 0x87, 0x86, 0x7d, 0x7e, 0x74, 0x71, + 0x6a, 0x67, 0x6d, 0x5d, 0x6c, 0x62, 0x60, 0x70, 0x62, 0x79, 0x7d, + 0x7d, 0x94, 0x8c, 0x96, 0x9c, 0x95, 0xa0, 0x99, 0x98, 0x98, 0x92, + 0x8e, 0x8d, 0x85, 0x83, 0x7f, 0x78, 0x75, 0x6f, 0x65, 0x65, 0x6b, + 0x5b, 0x6c, 0x63, 0x5f, 0x73, 0x64, 0x76, 0x86, 0x7c, 0x97, 0x94, + 0x92, 0xa3, 0x96, 0x9e, 0x9e, 0x95, 0x96, 0x93, 0x8a, 0x8b, 0x84, + 0x7f, 0x7d, 0x77, 0x6d, 0x6e, 0x60, 0x64, 0x6d, 0x56, 0x71, 0x63, + 0x5f, 0x79, 0x65, 0x7d, 0x8c, 0x80, 0x9d, 0x97, 0x97, 0xa3, 0x9c, + 0x9a, 0x9d, 0x95, 0x8e, 0x92, 0x86, 0x83, 0x85, 0x76, 0x78, 0x73, + 0x65, 0x69, 0x5b, 0x6d, 0x61, 0x63, 0x77, 0x5d, 0x77, 0x77, 0x6f, + 0x92, 0x85, 0x91, 0xa0, 0x93, 0xa0, 0x9b, 0x99, 0x95, 0x94, 0x8f, + 0x87, 0x8d, 0x7d, 0x7f, 0x7e, 0x70, 0x74, 0x69, 0x61, 0x5e, 0x6c, + 0x64, 0x60, 0x7d, 0x61, 0x72, 0x84, 0x6e, 0x90, 0x91, 0x8e, 0xa3, + 0x9b, 0x9b, 0x9c, 0x9d, 0x90, 0x90, 0x91, 0x7d, 0x89, 0x7f, 0x76, + 0x7c, 0x70, 0x6c, 0x66, 0x5d, 0x5d, 0x6f, 0x61, 0x68, 0x7d, 0x66, + 0x7c, 0x85, 0x7c, 0x97, 0x94, 0x99, 0x9f, 0x9d, 0xa0, 0x95, 0x9e, + 0x8d, 0x88, 0x8c, 0x7c, 0x81, 0x7a, 0x76, 0x74, 0x6c, 0x6a, 0x5e, + 0x54, 0x6a, 0x6d, 0x5d, 0x7b, 0x79, 0x6c, 0x87, 0x87, 0x89, 0x99, + 0x9c, 0x9f, 0x9d, 0xa0, 0x99, 0x95, 0x93, 0x89, 0x85, 0x7f, 0x7f, + 0x76, 0x75, 0x72, 0x6b, 0x65, 0x5e, 0x51, 0x60, 0x73, 0x61, 0x75, + 0x85, 0x75, 0x81, 0x8d, 0x93, 0x95, 0x99, 0xa7, 0x9a, 0x9a, 0x9f, + 0x95, 0x90, 0x88, 0x87, 0x7b, 0x78, 0x7b, 0x70, 0x6e, 0x6e, 0x61, + 0x57, 0x4b, 0x63, 0x73, 0x62, 0x7a, 0x88, 0x7e, 0x81, 0x8f, 0x9d, + 0x99, 0x99, 0xae, 0xa1, 0x96, 0x9d, 0x9b, 0x8c, 0x80, 0x88, 0x7d, + 0x70, 0x76, 0x73, 0x68, 0x63, 0x61, 0x58, 0x4e, 0x73, 0x79, 0x6c, + 0x83, 0x8a, 0x89, 0x82, 0x8f, 0xa4, 0x92, 0x96, 0xa7, 0x9c, 0x90, + 0x8f, 0x9e, 0x88, 0x75, 0x82, 0x82, 0x6f, 0x65, 0x73, 0x73, 0x57, + 0x4e, 0x50, 0x60, 0x76, 0x70, 0x83, 0x8b, 0x87, 0x8c, 0x8a, 0x97, + 0x99, 0x97, 0xa0, 0x99, 0x97, 0x94, 0x97, 0x94, 0x7f, 0x7f, 0x7c, + 0x76, 0x6f, 0x6a, 0x6d, 0x63, 0x56, 0x4f, 0x4f, 0x72, 0x7c, 0x7d, + 0x8b, 0x8b, 0x91, 0x88, 0x8e, 0x9a, 0x92, 0x98, 0xa0, 0xa0, 0x97, + 0x92, 0x9c, 0x8b, 0x78, 0x74, 0x76, 0x73, 0x65, 0x65, 0x62, 0x53, + 0x46, 0x4b, 0x73, 0x84, 0x84, 0x90, 0x8f, 0x90, 0x87, 0x8b, 0x97, + 0x93, 0x9e, 0xa1, 0xa1, 0x9a, 0x94, 0x9a, 0x8c, 0x7a, 0x6f, 0x6f, + 0x6f, 0x61, 0x60, 0x5b, 0x51, 0x46, 0x4e, 0x7b, 0x8b, 0x8e, 0x92, + 0x8e, 0x90, 0x84, 0x89, 0x90, 0x93, 0xa4, 0xa6, 0xa4, 0x9a, 0x9b, + 0x9b, 0x83, 0x72, 0x67, 0x6c, 0x6a, 0x5e, 0x5c, 0x52, 0x4a, 0x46, + 0x62, 0x8a, 0x95, 0x9a, 0x8e, 0x89, 0x87, 0x82, 0x88, 0x8b, 0x9d, + 0xac, 0xab, 0xa4, 0x9c, 0x9d, 0x8f, 0x77, 0x68, 0x63, 0x6a, 0x67, + 0x61, 0x5a, 0x52, 0x4f, 0x55, 0x78, 0x93, 0x9b, 0x93, 0x83, 0x84, + 0x81, 0x81, 0x86, 0x91, 0xa5, 0xac, 0xab, 0xa1, 0x9a, 0x92, 0x7f, + 0x6d, 0x60, 0x64, 0x6b, 0x69, 0x62, 0x55, 0x4e, 0x4e, 0x6e, 0x92, + 0x9d, 0x98, 0x84, 0x80, 0x7e, 0x7e, 0x82, 0x90, 0xa8, 0xb4, 0xb1, + 0xa3, 0x98, 0x92, 0x82, 0x6f, 0x5d, 0x5e, 0x68, 0x6d, 0x68, 0x58, + 0x4d, 0x4a, 0x69, 0x90, 0x9f, 0x9a, 0x82, 0x7c, 0x7c, 0x7e, 0x84, + 0x8d, 0xa5, 0xb5, 0xb9, 0xab, 0x99, 0x8f, 0x80, 0x71, 0x5e, 0x5b, + 0x66, 0x6f, 0x6e, 0x5c, 0x4c, 0x44, 0x63, 0x92, 0xa5, 0x9e, 0x7f, + 0x73, 0x77, 0x7f, 0x88, 0x8f, 0xa4, 0xb5, 0xbd, 0xaf, 0x9a, 0x8a, + 0x7b, 0x6f, 0x5f, 0x5c, 0x65, 0x71, 0x73, 0x64, 0x4f, 0x41, 0x57, + 0x88, 0xa6, 0xa4, 0x83, 0x6c, 0x6e, 0x7f, 0x8f, 0x95, 0xa2, 0xb3, + 0xbe, 0xb7, 0x9e, 0x82, 0x6f, 0x67, 0x66, 0x66, 0x6a, 0x6c, 0x6a, + 0x5e, 0x4e, 0x45, 0x60, 0x8e, 0xab, 0xa4, 0x7f, 0x68, 0x68, 0x7f, + 0x95, 0xa3, 0xad, 0xb3, 0xb8, 0xae, 0x99, 0x7d, 0x67, 0x5f, 0x63, + 0x6d, 0x71, 0x6e, 0x61, 0x54, 0x48, 0x4f, 0x75, 0x99, 0xa9, 0x96, + 0x77, 0x66, 0x6d, 0x84, 0x98, 0xa6, 0xab, 0xae, 0xad, 0xa4, 0x8f, + 0x77, 0x64, 0x5f, 0x69, 0x76, 0x7a, 0x72, 0x60, 0x50, 0x4d, 0x64, + 0x8a, 0xa1, 0x9d, 0x82, 0x6d, 0x69, 0x79, 0x8e, 0x9f, 0xa8, 0xac, + 0xab, 0xa4, 0x97, 0x83, 0x70, 0x63, 0x63, 0x6e, 0x78, 0x79, 0x6c, + 0x59, 0x4b, 0x52, 0x75, 0x98, 0xa7, 0x94, 0x76, 0x65, 0x6c, 0x83, + 0x9a, 0xa6, 0xa9, 0xac, 0xaa, 0xa4, 0x90, 0x76, 0x61, 0x5c, 0x68, + 0x7a, 0x81, 0x74, 0x5c, 0x47, 0x48, 0x6b, 0x95, 0xaa, 0x9b, 0x7a, + 0x63, 0x66, 0x7e, 0x98, 0xa9, 0xad, 0xad, 0xa9, 0xa2, 0x92, 0x7c, + 0x67, 0x5e, 0x66, 0x75, 0x7e, 0x76, 0x60, 0x49, 0x46, 0x65, 0x90, + 0xab, 0xa1, 0x7e, 0x63, 0x60, 0x79, 0x98, 0xac, 0xaf, 0xa9, 0xa4, + 0xa0, 0x97, 0x82, 0x6a, 0x5b, 0x5f, 0x72, 0x81, 0x7d, 0x64, 0x46, + 0x3e, 0x60, 0x94, 0xb4, 0xa7, 0x7d, 0x5a, 0x58, 0x78, 0xa0, 0xb5, + 0xb3, 0xa7, 0x9e, 0x9e, 0x98, 0x86, 0x6c, 0x5a, 0x5e, 0x72, 0x83, + 0x7d, 0x62, 0x42, 0x3d, 0x62, 0x98, 0xb8, 0xa6, 0x7a, 0x55, 0x56, + 0x79, 0xa4, 0xb9, 0xb5, 0xa4, 0x99, 0x9a, 0x98, 0x89, 0x6d, 0x59, + 0x5c, 0x70, 0x85, 0x82, 0x68, 0x47, 0x40, 0x61, 0x95, 0xb5, 0xa8, + 0x7c, 0x56, 0x53, 0x76, 0xa2, 0xba, 0xb7, 0xa2, 0x91, 0x8e, 0x8f, + 0x88, 0x75, 0x63, 0x61, 0x6f, 0x7f, 0x7e, 0x67, 0x49, 0x45, 0x67, + 0x99, 0xb5, 0xa4, 0x78, 0x53, 0x54, 0x78, 0xa7, 0xbf, 0xb8, 0x9f, + 0x8c, 0x88, 0x8c, 0x88, 0x78, 0x65, 0x61, 0x6f, 0x80, 0x81, 0x6a, + 0x4a, 0x42, 0x62, 0x94, 0xb4, 0xa9, 0x7e, 0x55, 0x4e, 0x70, 0xa2, + 0xc0, 0xbe, 0xa4, 0x8b, 0x84, 0x88, 0x88, 0x7a, 0x68, 0x62, 0x6d, + 0x7f, 0x81, 0x6d, 0x4e, 0x44, 0x62, 0x92, 0xb3, 0xa8, 0x7d, 0x55, + 0x4e, 0x71, 0xa4, 0xc4, 0xc1, 0xa4, 0x87, 0x7c, 0x81, 0x87, 0x7f, + 0x70, 0x66, 0x6b, 0x78, 0x7b, 0x6b, 0x52, 0x4c, 0x64, 0x8f, 0xac, + 0xa5, 0x81, 0x5b, 0x52, 0x6f, 0x9e, 0xbf, 0xc1, 0xa8, 0x8b, 0x7d, + 0x7e, 0x82, 0x7d, 0x72, 0x6b, 0x6e, 0x78, 0x78, 0x6a, 0x54, 0x50, + 0x68, 0x8f, 0xa9, 0xa1, 0x80, 0x5d, 0x55, 0x70, 0x9d, 0xbe, 0xc2, + 0xaa, 0x8b, 0x79, 0x77, 0x7e, 0x7e, 0x79, 0x72, 0x70, 0x72, 0x70, + 0x65, 0x57, 0x5a, 0x71, 0x91, 0xa2, 0x97, 0x7a, 0x5f, 0x5c, 0x77, + 0xa1, 0xbf, 0xc0, 0xa9, 0x8c, 0x7b, 0x79, 0x7e, 0x7d, 0x77, 0x71, + 0x71, 0x74, 0x70, 0x61, 0x51, 0x54, 0x6f, 0x92, 0xa5, 0x9c, 0x7c, + 0x5d, 0x57, 0x72, 0x9e, 0xbf, 0xc3, 0xad, 0x8e, 0x7a, 0x76, 0x7a, + 0x7d, 0x7b, 0x76, 0x74, 0x73, 0x6d, 0x60, 0x53, 0x58, 0x71, 0x90, + 0xa1, 0x98, 0x7c, 0x60, 0x5c, 0x74, 0x9b, 0xba, 0xc1, 0xae, 0x91, + 0x7c, 0x75, 0x79, 0x7d, 0x7e, 0x7b, 0x78, 0x74, 0x6b, 0x5f, 0x55, + 0x5a, 0x71, 0x8e, 0x9d, 0x96, 0x7d, 0x64, 0x5e, 0x73, 0x96, 0xb4, + 0xbd, 0xad, 0x93, 0x7e, 0x76, 0x79, 0x7d, 0x7e, 0x7c, 0x79, 0x75, + 0x6d, 0x61, 0x56, 0x59, 0x6d, 0x89, 0x9c, 0x98, 0x83, 0x69, 0x5e, + 0x6c, 0x8d, 0xad, 0xbb, 0xb1, 0x99, 0x83, 0x77, 0x77, 0x7b, 0x7f, + 0x7f, 0x7d, 0x78, 0x70, 0x64, 0x58, 0x58, 0x68, 0x82, 0x96, 0x98, + 0x87, 0x70, 0x61, 0x69, 0x83, 0xa2, 0xb5, 0xb3, 0xa0, 0x8a, 0x7b, + 0x76, 0x79, 0x7c, 0x80, 0x80, 0x7c, 0x74, 0x67, 0x5b, 0x57, 0x64, + 0x7c, 0x91, 0x97, 0x8b, 0x75, 0x65, 0x67, 0x7c, 0x99, 0xae, 0xb2, + 0xa4, 0x8f, 0x7e, 0x78, 0x7a, 0x7f, 0x82, 0x83, 0x7e, 0x76, 0x68, + 0x5a, 0x4f, 0x54, 0x6a, 0x86, 0x98, 0x95, 0x82, 0x6b, 0x60, 0x6a, + 0x87, 0xa7, 0xba, 0xb8, 0xa5, 0x8e, 0x7c, 0x75, 0x76, 0x7d, 0x83, + 0x85, 0x81, 0x73, 0x61, 0x51, 0x4d, 0x5e, 0x7b, 0x94, 0x9a, 0x8b, + 0x73, 0x62, 0x63, 0x79, 0x98, 0xb1, 0xb8, 0xab, 0x95, 0x82, 0x79, + 0x7a, 0x7f, 0x84, 0x86, 0x82, 0x7a, 0x6c, 0x5e, 0x53, 0x55, 0x67, + 0x80, 0x92, 0x93, 0x85, 0x72, 0x65, 0x69, 0x7d, 0x98, 0xae, 0xb3, + 0xaa, 0x97, 0x85, 0x7a, 0x76, 0x7a, 0x81, 0x87, 0x86, 0x7d, 0x6c, + 0x5a, 0x4f, 0x54, 0x6b, 0x86, 0x95, 0x92, 0x81, 0x6c, 0x63, 0x6b, + 0x83, 0x9e, 0xb0, 0xb0, 0xa3, 0x8e, 0x7e, 0x79, 0x7b, 0x82, 0x88, + 0x8a, 0x85, 0x7a, 0x6b, 0x5e, 0x56, 0x5a, 0x6a, 0x7f, 0x8d, 0x8e, + 0x82, 0x73, 0x69, 0x6c, 0x7d, 0x93, 0xa5, 0xac, 0xa5, 0x97, 0x88, + 0x7d, 0x7a, 0x7d, 0x84, 0x89, 0x89, 0x80, 0x70, 0x5f, 0x54, 0x56, + 0x67, 0x7e, 0x8e, 0x8f, 0x83, 0x72, 0x67, 0x6a, 0x7a, 0x91, 0xa4, + 0xaa, 0xa3, 0x94, 0x86, 0x7e, 0x7c, 0x81, 0x88, 0x8c, 0x8a, 0x82, + 0x75, 0x66, 0x5a, 0x54, 0x5d, 0x71, 0x86, 0x90, 0x89, 0x79, 0x68, + 0x62, 0x6d, 0x84, 0x9d, 0xae, 0xaf, 0xa4, 0x94, 0x86, 0x7f, 0x7f, + 0x84, 0x8b, 0x8f, 0x8a, 0x7d, 0x6a, 0x58, 0x4d, 0x52, 0x66, 0x7e, + 0x8e, 0x8d, 0x7f, 0x6d, 0x63, 0x67, 0x7a, 0x93, 0xa7, 0xae, 0xa7, + 0x98, 0x89, 0x81, 0x81, 0x86, 0x8c, 0x91, 0x90, 0x86, 0x76, 0x66, + 0x59, 0x54, 0x5a, 0x6b, 0x7e, 0x89, 0x85, 0x78, 0x6b, 0x65, 0x6c, + 0x7e, 0x93, 0xa2, 0xa6, 0xa0, 0x96, 0x8c, 0x88, 0x87, 0x89, 0x8d, + 0x8e, 0x8c, 0x84, 0x77, 0x68, 0x5c, 0x56, 0x5b, 0x6b, 0x7c, 0x85, + 0x82, 0x78, 0x6c, 0x68, 0x6f, 0x7e, 0x90, 0x9d, 0xa0, 0x9c, 0x94, + 0x8e, 0x8b, 0x8b, 0x8d, 0x8f, 0x90, 0x8d, 0x86, 0x7c, 0x71, 0x67, + 0x60, 0x5d, 0x64, 0x71, 0x7b, 0x7e, 0x79, 0x71, 0x6b, 0x6c, 0x75, + 0x83, 0x91, 0x9a, 0x9c, 0x99, 0x94, 0x90, 0x8d, 0x8c, 0x8d, 0x8f, + 0x8f, 0x8c, 0x84, 0x78, 0x6d, 0x64, 0x5f, 0x60, 0x69, 0x75, 0x7b, + 0x7b, 0x75, 0x6f, 0x6c, 0x70, 0x7a, 0x87, 0x92, 0x97, 0x98, 0x95, + 0x92, 0x8f, 0x8f, 0x90, 0x91, 0x92, 0x91, 0x8c, 0x83, 0x79, 0x71, + 0x69, 0x63, 0x5f, 0x61, 0x6a, 0x72, 0x73, 0x6f, 0x6b, 0x67, 0x6a, + 0x73, 0x80, 0x8d, 0x96, 0x9b, 0x9d, 0x9c, 0x9a, 0x99, 0x98, 0x97, + 0x97, 0x96, 0x93, 0x8c, 0x83, 0x79, 0x70, 0x67, 0x5f, 0x59, 0x5d, + 0x66, 0x6f, 0x71, 0x6e, 0x69, 0x66, 0x69, 0x72, 0x7f, 0x8c, 0x95, + 0x9a, 0x9c, 0x9c, 0x9b, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x96, 0x8f, + 0x85, 0x7c, 0x73, 0x6c, 0x64, 0x5c, 0x5b, 0x63, 0x6a, 0x6e, 0x6c, + 0x69, 0x66, 0x68, 0x6f, 0x7b, 0x86, 0x8f, 0x94, 0x97, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9b, 0x9a, 0x9a, 0x98, 0x94, 0x8d, 0x86, 0x7e, 0x78, + 0x6f, 0x66, 0x5e, 0x5a, 0x60, 0x67, 0x6b, 0x68, 0x65, 0x64, 0x65, + 0x6c, 0x76, 0x82, 0x8b, 0x91, 0x95, 0x99, 0x9b, 0x9c, 0x9d, 0x9d, + 0x9c, 0x9c, 0x9b, 0x98, 0x93, 0x8b, 0x83, 0x7b, 0x74, 0x6c, 0x65, + 0x5e, 0x5e, 0x63, 0x66, 0x65, 0x62, 0x61, 0x62, 0x67, 0x70, 0x7b, + 0x85, 0x8c, 0x90, 0x93, 0x97, 0x9a, 0x9d, 0x9e, 0x9f, 0x9f, 0x9f, + 0x9d, 0x99, 0x93, 0x8c, 0x86, 0x81, 0x7c, 0x74, 0x6b, 0x62, 0x5b, + 0x5b, 0x5f, 0x61, 0x60, 0x5f, 0x5f, 0x62, 0x69, 0x72, 0x7c, 0x85, + 0x8c, 0x90, 0x96, 0x9b, 0x9f, 0xa0, 0xa1, 0xa0, 0xa0, 0x9f, 0x9e, + 0x99, 0x94, 0x8d, 0x85, 0x80, 0x7a, 0x74, 0x6c, 0x65, 0x5d, 0x5b, + 0x5d, 0x60, 0x60, 0x60, 0x61, 0x64, 0x6b, 0x73, 0x7c, 0x83, 0x8a, + 0x8e, 0x93, 0x98, 0x9d, 0x9f, 0x9f, 0x9e, 0x9d, 0x9d, 0x9c, 0x99, + 0x95, 0x90, 0x8a, 0x85, 0x80, 0x7a, 0x74, 0x6b, 0x63, 0x5b, 0x59, + 0x5b, 0x5d, 0x5e, 0x5e, 0x60, 0x63, 0x69, 0x71, 0x7a, 0x82, 0x8a, + 0x8f, 0x95, 0x9b, 0x9f, 0xa1, 0xa0, 0x9f, 0x9e, 0x9d, 0x9d, 0x9b, + 0x98, 0x92, 0x8c, 0x85, 0x7f, 0x7a, 0x75, 0x6f, 0x67, 0x5e, 0x58, + 0x58, 0x5a, 0x5d, 0x5e, 0x60, 0x63, 0x68, 0x6e, 0x77, 0x80, 0x88, + 0x8e, 0x93, 0x98, 0x9c, 0x9f, 0xa0, 0x9f, 0x9d, 0x9c, 0x9c, 0x9b, + 0x99, 0x96, 0x90, 0x8a, 0x84, 0x7f, 0x7b, 0x76, 0x70, 0x67, 0x5e, + 0x57, 0x56, 0x59, 0x5d, 0x5f, 0x60, 0x62, 0x67, 0x6d, 0x76, 0x7e, + 0x86, 0x8d, 0x92, 0x97, 0x9b, 0x9d, 0x9f, 0x9e, 0x9d, 0x9c, 0x9c, + 0x9b, 0x99, 0x96, 0x92, 0x8d, 0x88, 0x83, 0x7e, 0x7a, 0x75, 0x6d, + 0x64, 0x5d, 0x58, 0x58, 0x5b, 0x5e, 0x60, 0x61, 0x64, 0x69, 0x70, + 0x79, 0x81, 0x88, 0x8e, 0x92, 0x96, 0x9a, 0x9c, 0x9c, 0x9c, 0x9b, + 0x9a, 0x99, 0x98, 0x96, 0x94, 0x91, 0x8d, 0x89, 0x85, 0x80, 0x7b, + 0x77, 0x71, 0x69, 0x61, 0x5b, 0x58, 0x5a, 0x5d, 0x5f, 0x61, 0x64, + 0x68, 0x6d, 0x75, 0x7d, 0x84, 0x8b, 0x90, 0x94, 0x97, 0x99, 0x9b, + 0x9b, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x94, 0x93, 0x90, 0x8c, 0x89, + 0x85, 0x80, 0x7b, 0x76, 0x70, 0x69, 0x61, 0x5c, 0x59, 0x5b, 0x5e, + 0x61, 0x62, 0x65, 0x6a, 0x6f, 0x76, 0x7d, 0x85, 0x8a, 0x8f, 0x92, + 0x96, 0x97, 0x99, 0x99, 0x99, 0x98, 0x97, 0x97, 0x95, 0x93, 0x91, + 0x8f, 0x8d, 0x8a, 0x87, 0x83, 0x7f, 0x7a, 0x74, 0x6e, 0x67, 0x61, + 0x5c, 0x5c, 0x5e, 0x61, 0x63, 0x66, 0x69, 0x6d, 0x72, 0x79, 0x80, + 0x86, 0x8b, 0x8e, 0x91, 0x93, 0x96, 0x97, 0x97, 0x97, 0x96, 0x95, + 0x94, 0x92, 0x91, 0x8f, 0x8d, 0x8b, 0x88, 0x85, 0x81, 0x7e, 0x7a, + 0x76, 0x71, 0x6d, 0x69, 0x65, 0x62, 0x60, 0x62, 0x66, 0x69, 0x6d, + 0x70, 0x74, 0x77, 0x7c, 0x81, 0x86, 0x8b, 0x8e, 0x90, 0x92, 0x94, + 0x95, 0x95, 0x95, 0x94, 0x93, 0x92, 0x90, 0x8e, 0x8c, 0x89, 0x86, + 0x82, 0x7f, 0x7b, 0x77, 0x73, 0x6e, 0x69, 0x61, 0x5f, 0x62, 0x66, + 0x69, 0x69, 0x6c, 0x6d, 0x72, 0x77, 0x7e, 0x84, 0x89, 0x8b, 0x8d, + 0x90, 0x91, 0x93, 0x93, 0x93, 0x93, 0x94, 0x93, 0x91, 0x8f, 0x8e, + 0x8c, 0x8b, 0x8b, 0x89, 0x87, 0x84, 0x81, 0x7d, 0x7a, 0x77, 0x73, + 0x70, 0x6e, 0x6b, 0x69, 0x68, 0x68, 0x69, 0x6b, 0x6e, 0x70, 0x74, + 0x77, 0x7a, 0x7d, 0x80, 0x83, 0x86, 0x88, 0x8b, 0x8d, 0x8f, 0x90, + 0x90, 0x91, 0x91, 0x90, 0x8f, 0x8d, 0x8b, 0x88, 0x86, 0x82, 0x7f, + 0x7c, 0x7a, 0x77, 0x74, 0x71, 0x6e, 0x6c, 0x6a, 0x69, 0x69, 0x6b, + 0x6f, 0x72, 0x75, 0x77, 0x7a, 0x7d, 0x81, 0x85, 0x89, 0x8c, 0x8e, + 0x90, 0x91, 0x92, 0x92, 0x93, 0x93, 0x92, 0x90, 0x8f, 0x8e, 0x8c, + 0x8a, 0x88, 0x87, 0x84, 0x82, 0x7f, 0x7d, 0x7a, 0x77, 0x74, 0x72, + 0x70, 0x6d, 0x6c, 0x6b, 0x6b, 0x6b, 0x6c, 0x6d, 0x70, 0x74, 0x78, + 0x7b, 0x7e, 0x81, 0x83, 0x87, 0x89, 0x8c, 0x8e, 0x90, 0x90, 0x90, + 0x90, 0x8f, 0x8f, 0x8d, 0x8c, 0x8a, 0x89, 0x87, 0x84, 0x82, 0x80, + 0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x73, 0x71, 0x70, 0x6f, 0x6f, + 0x6f, 0x6f, 0x71, 0x73, 0x75, 0x79, 0x7b, 0x7e, 0x80, 0x83, 0x85, + 0x88, 0x8a, 0x8c, 0x8d, 0x8e, 0x8e, 0x8e, 0x8d, 0x8c, 0x8b, 0x89, + 0x88, 0x86, 0x84, 0x83, 0x81, 0x7f, 0x7e, 0x7c, 0x7a, 0x79, 0x78, + 0x77, 0x75, 0x74, 0x74, 0x73, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x7a, 0x7c, 0x7f, 0x81, 0x83, 0x85, 0x87, 0x88, 0x89, 0x8a, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8a, 0x89, 0x88, 0x86, 0x84, 0x83, 0x81, 0x7f, + 0x7d, 0x7b, 0x79, 0x78, 0x76, 0x75, 0x74, 0x73, 0x73, 0x72, 0x73, + 0x73, 0x75, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80, 0x82, 0x84, 0x86, + 0x87, 0x88, 0x89, 0x89, 0x8a, 0x8a, 0x89, 0x89, 0x88, 0x87, 0x87, + 0x86, 0x85, 0x83, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, + 0x7a, 0x79, 0x79, 0x79, 0x78, 0x78, 0x79, 0x79, 0x7a, 0x7b, 0x7c, + 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, + 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7f, + 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, + }, + { // 5 + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x83, 0x82, 0x80, 0x7d, 0x7b, 0x7b, 0x7d, 0x80, 0x83, 0x83, + 0x81, 0x7e, 0x7b, 0x7b, 0x7d, 0x80, 0x83, 0x83, 0x82, 0x7f, 0x7d, + 0x7d, 0x7e, 0x80, 0x82, 0x83, 0x81, 0x7f, 0x7d, 0x7c, 0x7d, 0x7f, + 0x81, 0x82, 0x81, 0x7f, 0x7d, 0x7d, 0x7e, 0x80, 0x82, 0x82, 0x81, + 0x7f, 0x7e, 0x7d, 0x7e, 0x80, 0x81, 0x82, 0x81, 0x80, 0x7e, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, + 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x82, 0x85, 0x86, 0x83, 0x7d, + 0x77, 0x77, 0x7c, 0x83, 0x88, 0x87, 0x82, 0x7b, 0x77, 0x78, 0x7d, + 0x85, 0x89, 0x88, 0x82, 0x7b, 0x78, 0x78, 0x7d, 0x82, 0x85, 0x85, + 0x81, 0x7d, 0x7a, 0x7a, 0x7d, 0x81, 0x83, 0x83, 0x80, 0x7d, 0x7c, + 0x7d, 0x7f, 0x81, 0x81, 0x7f, 0x7c, 0x7a, 0x7b, 0x7e, 0x81, 0x83, + 0x82, 0x80, 0x7e, 0x7d, 0x7e, 0x81, 0x83, 0x83, 0x81, 0x7f, 0x7e, + 0x7f, 0x84, 0x88, 0x88, 0x84, 0x7d, 0x77, 0x74, 0x76, 0x7b, 0x82, + 0x86, 0x84, 0x80, 0x7b, 0x7b, 0x7e, 0x83, 0x87, 0x87, 0x83, 0x7d, + 0x78, 0x79, 0x7c, 0x81, 0x83, 0x83, 0x80, 0x7d, 0x7d, 0x7f, 0x82, + 0x83, 0x81, 0x80, 0x7f, 0x80, 0x82, 0x83, 0x82, 0x7e, 0x7a, 0x78, + 0x79, 0x7c, 0x7f, 0x80, 0x7e, 0x7c, 0x7b, 0x7d, 0x81, 0x84, 0x86, + 0x84, 0x80, 0x7f, 0x7f, 0x82, 0x85, 0x86, 0x85, 0x82, 0x7f, 0x7e, + 0x7e, 0x80, 0x80, 0x7f, 0x7d, 0x7b, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, + 0x79, 0x78, 0x79, 0x7b, 0x7e, 0x80, 0x81, 0x82, 0x83, 0x86, 0x89, + 0x8c, 0x8d, 0x8d, 0x8b, 0x89, 0x87, 0x87, 0x87, 0x86, 0x84, 0x7f, + 0x7a, 0x76, 0x73, 0x72, 0x73, 0x74, 0x73, 0x71, 0x6e, 0x6b, 0x69, + 0x6b, 0x70, 0x76, 0x80, 0x8a, 0x93, 0x9b, 0x9e, 0x9e, 0x9b, 0x98, + 0x95, 0x93, 0x93, 0x92, 0x90, 0x8a, 0x83, 0x7d, 0x76, 0x70, 0x6c, + 0x6a, 0x6a, 0x6b, 0x6a, 0x68, 0x62, 0x5b, 0x58, 0x58, 0x67, 0x7f, + 0x98, 0xaa, 0xac, 0xa2, 0x91, 0x86, 0x87, 0x92, 0xa2, 0xa7, 0xa1, + 0x90, 0x80, 0x7a, 0x7e, 0x89, 0x8f, 0x88, 0x78, 0x64, 0x5a, 0x5a, + 0x64, 0x6e, 0x6f, 0x66, 0x57, 0x4d, 0x4b, 0x64, 0x88, 0xaa, 0xbc, + 0xb2, 0x9b, 0x80, 0x74, 0x7d, 0x93, 0xa9, 0xae, 0xa5, 0x90, 0x7f, + 0x7d, 0x84, 0x91, 0x92, 0x87, 0x73, 0x5f, 0x5a, 0x5e, 0x6b, 0x73, + 0x71, 0x67, 0x57, 0x4f, 0x4d, 0x63, 0x82, 0xa1, 0xb3, 0xab, 0x98, + 0x7f, 0x72, 0x77, 0x8a, 0xa5, 0xb1, 0xae, 0x9c, 0x88, 0x7f, 0x7f, + 0x8a, 0x8c, 0x86, 0x76, 0x64, 0x5b, 0x5d, 0x68, 0x71, 0x72, 0x6b, + 0x5b, 0x51, 0x4a, 0x5b, 0x7b, 0x9b, 0xb3, 0xaf, 0x9c, 0x81, 0x6f, + 0x71, 0x87, 0xa6, 0xb7, 0xb7, 0xa3, 0x8a, 0x7d, 0x7c, 0x88, 0x8f, + 0x8c, 0x7b, 0x66, 0x5b, 0x5b, 0x67, 0x72, 0x76, 0x6f, 0x5d, 0x50, + 0x45, 0x4f, 0x70, 0x92, 0xb2, 0xb3, 0xa3, 0x87, 0x70, 0x6f, 0x7f, + 0xa1, 0xb7, 0xbb, 0xab, 0x90, 0x7f, 0x7b, 0x86, 0x8f, 0x8c, 0x7d, + 0x67, 0x5c, 0x5b, 0x66, 0x72, 0x73, 0x6c, 0x59, 0x4b, 0x42, 0x4d, + 0x70, 0x95, 0xb5, 0xb7, 0xa5, 0x87, 0x6f, 0x6c, 0x7d, 0x9d, 0xb6, + 0xbd, 0xaf, 0x96, 0x84, 0x7f, 0x86, 0x8b, 0x87, 0x7b, 0x68, 0x5f, + 0x60, 0x68, 0x72, 0x72, 0x6b, 0x5b, 0x4d, 0x45, 0x4c, 0x6c, 0x8f, + 0xaf, 0xb7, 0xa8, 0x8e, 0x73, 0x6b, 0x76, 0x96, 0xb2, 0xbf, 0xb7, + 0x9e, 0x88, 0x7e, 0x81, 0x87, 0x86, 0x7e, 0x6f, 0x65, 0x63, 0x68, + 0x71, 0x71, 0x6e, 0x5f, 0x52, 0x4a, 0x50, 0x6f, 0x92, 0xb0, 0xb4, + 0xa4, 0x87, 0x6d, 0x68, 0x77, 0x99, 0xb3, 0xbd, 0xb1, 0x99, 0x85, + 0x7e, 0x81, 0x88, 0x85, 0x7a, 0x6c, 0x64, 0x66, 0x6d, 0x75, 0x73, + 0x69, 0x59, 0x4c, 0x45, 0x57, 0x79, 0x9e, 0xb6, 0xb0, 0x9b, 0x7b, + 0x67, 0x68, 0x80, 0xa2, 0xb8, 0xbc, 0xaa, 0x92, 0x81, 0x7e, 0x83, + 0x87, 0x82, 0x75, 0x68, 0x65, 0x69, 0x72, 0x75, 0x6f, 0x61, 0x51, + 0x46, 0x4a, 0x69, 0x8f, 0xb1, 0xb8, 0xa6, 0x86, 0x68, 0x60, 0x70, + 0x94, 0xb2, 0xc0, 0xb7, 0x9d, 0x86, 0x7b, 0x7f, 0x86, 0x85, 0x7b, + 0x6e, 0x67, 0x67, 0x6f, 0x76, 0x74, 0x6a, 0x58, 0x4a, 0x43, 0x59, + 0x7d, 0xa4, 0xbb, 0xb2, 0x97, 0x72, 0x60, 0x63, 0x80, 0xa5, 0xbd, + 0xc1, 0xab, 0x90, 0x7c, 0x79, 0x80, 0x84, 0x81, 0x75, 0x6c, 0x68, + 0x6b, 0x72, 0x72, 0x6c, 0x5c, 0x4d, 0x43, 0x52, 0x76, 0xa0, 0xbb, + 0xb7, 0x9c, 0x75, 0x5c, 0x5d, 0x78, 0xa1, 0xbe, 0xc4, 0xb2, 0x93, + 0x7d, 0x76, 0x7d, 0x84, 0x83, 0x78, 0x6d, 0x69, 0x6b, 0x72, 0x73, + 0x6e, 0x5e, 0x4e, 0x42, 0x4f, 0x73, 0x9d, 0xbb, 0xb8, 0x9f, 0x77, + 0x5b, 0x59, 0x73, 0x9b, 0xbb, 0xc5, 0xb4, 0x96, 0x7e, 0x74, 0x7a, + 0x81, 0x84, 0x7c, 0x71, 0x6c, 0x6b, 0x71, 0x73, 0x6f, 0x62, 0x53, + 0x47, 0x52, 0x73, 0x9b, 0xb8, 0xb7, 0x9e, 0x77, 0x5a, 0x57, 0x71, + 0x99, 0xbb, 0xc5, 0xb5, 0x95, 0x7c, 0x72, 0x78, 0x81, 0x84, 0x7e, + 0x74, 0x6d, 0x6c, 0x71, 0x73, 0x70, 0x63, 0x56, 0x48, 0x54, 0x74, + 0x9b, 0xb7, 0xb5, 0x9d, 0x75, 0x5b, 0x58, 0x73, 0x9a, 0xbb, 0xc4, + 0xb3, 0x94, 0x7a, 0x71, 0x78, 0x82, 0x86, 0x80, 0x75, 0x6d, 0x6b, + 0x6f, 0x72, 0x6f, 0x63, 0x55, 0x4a, 0x5a, 0x7b, 0xa4, 0xbb, 0xb4, + 0x93, 0x6a, 0x52, 0x55, 0x78, 0xa3, 0xc3, 0xc5, 0xae, 0x8c, 0x73, + 0x6d, 0x76, 0x82, 0x86, 0x80, 0x76, 0x6f, 0x6e, 0x6f, 0x71, 0x6c, + 0x61, 0x53, 0x4c, 0x60, 0x82, 0xaa, 0xba, 0xaf, 0x8c, 0x64, 0x50, + 0x5a, 0x80, 0xa9, 0xc5, 0xc2, 0xa7, 0x85, 0x6f, 0x6e, 0x7a, 0x86, + 0x88, 0x80, 0x75, 0x6e, 0x6e, 0x70, 0x72, 0x6c, 0x62, 0x52, 0x4f, + 0x64, 0x87, 0xad, 0xba, 0xac, 0x86, 0x60, 0x4d, 0x5b, 0x83, 0xad, + 0xc7, 0xc1, 0xa4, 0x80, 0x6c, 0x6b, 0x79, 0x86, 0x89, 0x82, 0x76, + 0x6e, 0x6c, 0x6f, 0x70, 0x6b, 0x61, 0x52, 0x55, 0x6d, 0x93, 0xb3, + 0xb8, 0xa3, 0x7a, 0x58, 0x4d, 0x64, 0x8e, 0xb5, 0xc6, 0xba, 0x9a, + 0x7b, 0x6c, 0x6f, 0x7c, 0x85, 0x86, 0x7f, 0x77, 0x72, 0x70, 0x70, + 0x6e, 0x67, 0x5c, 0x51, 0x5c, 0x76, 0x9c, 0xb5, 0xb4, 0x99, 0x71, + 0x52, 0x4d, 0x6b, 0x96, 0xbc, 0xc6, 0xb4, 0x92, 0x74, 0x68, 0x6e, + 0x7e, 0x88, 0x89, 0x81, 0x76, 0x71, 0x6d, 0x6e, 0x6b, 0x65, 0x5a, + 0x55, 0x65, 0x84, 0xa9, 0xb8, 0xad, 0x88, 0x61, 0x49, 0x52, 0x78, + 0xa5, 0xc5, 0xc2, 0xa8, 0x84, 0x6b, 0x66, 0x72, 0x82, 0x8a, 0x89, + 0x80, 0x77, 0x72, 0x6e, 0x6d, 0x68, 0x62, 0x56, 0x5b, 0x72, 0x94, + 0xb1, 0xb5, 0xa1, 0x78, 0x56, 0x49, 0x5e, 0x88, 0xb2, 0xc5, 0xba, + 0x9a, 0x78, 0x68, 0x6b, 0x79, 0x87, 0x8b, 0x88, 0x7f, 0x77, 0x71, + 0x6e, 0x6c, 0x66, 0x5f, 0x58, 0x67, 0x81, 0xa4, 0xb5, 0xae, 0x8f, + 0x66, 0x4d, 0x4b, 0x6d, 0x98, 0xbc, 0xc3, 0xae, 0x8a, 0x6d, 0x65, + 0x6e, 0x7e, 0x88, 0x89, 0x84, 0x7d, 0x77, 0x73, 0x70, 0x68, 0x61, + 0x56, 0x5b, 0x73, 0x95, 0xb4, 0xb5, 0xa0, 0x76, 0x54, 0x44, 0x5a, + 0x82, 0xae, 0xc5, 0xbc, 0x9e, 0x79, 0x65, 0x64, 0x75, 0x84, 0x8c, + 0x8a, 0x84, 0x7d, 0x76, 0x72, 0x69, 0x63, 0x58, 0x57, 0x6c, 0x8c, + 0xb0, 0xbc, 0xae, 0x84, 0x59, 0x41, 0x4a, 0x72, 0x9e, 0xc0, 0xc2, + 0xad, 0x88, 0x6c, 0x61, 0x69, 0x77, 0x85, 0x8b, 0x8b, 0x8a, 0x84, + 0x7a, 0x6d, 0x5f, 0x55, 0x50, 0x62, 0x82, 0xa7, 0xbd, 0xb5, 0x97, + 0x69, 0x4a, 0x43, 0x5f, 0x86, 0xac, 0xbc, 0xb2, 0x9a, 0x7e, 0x6f, + 0x6b, 0x70, 0x76, 0x7c, 0x80, 0x87, 0x8c, 0x8d, 0x87, 0x7a, 0x6b, + 0x5d, 0x4e, 0x58, 0x71, 0x96, 0xb3, 0xb8, 0xa5, 0x7d, 0x5a, 0x46, + 0x56, 0x75, 0x9c, 0xb2, 0xb2, 0x9c, 0x83, 0x73, 0x6e, 0x75, 0x79, + 0x7d, 0x7b, 0x7e, 0x80, 0x85, 0x85, 0x80, 0x78, 0x6f, 0x6c, 0x6c, + 0x75, 0x7f, 0x89, 0x8e, 0x8b, 0x86, 0x7e, 0x7a, 0x75, 0x79, 0x80, + 0x8a, 0x92, 0x95, 0x90, 0x87, 0x7d, 0x76, 0x77, 0x7a, 0x80, 0x82, + 0x81, 0x7b, 0x73, 0x6c, 0x68, 0x67, 0x72, 0x81, 0x95, 0xa1, 0x9f, + 0x8f, 0x75, 0x61, 0x59, 0x68, 0x7f, 0x98, 0xa3, 0x9e, 0x8c, 0x7c, + 0x76, 0x7a, 0x83, 0x87, 0x84, 0x7b, 0x76, 0x77, 0x82, 0x8e, 0x93, + 0x8c, 0x7c, 0x6c, 0x64, 0x68, 0x74, 0x82, 0x87, 0x86, 0x7f, 0x7a, + 0x7c, 0x82, 0x89, 0x8c, 0x88, 0x80, 0x7b, 0x7a, 0x7f, 0x88, 0x8c, + 0x8c, 0x83, 0x7a, 0x71, 0x6d, 0x6b, 0x6b, 0x68, 0x63, 0x6e, 0x81, + 0x9f, 0xb1, 0xb0, 0x96, 0x6f, 0x4f, 0x44, 0x5a, 0x7e, 0xa6, 0xb6, + 0xaf, 0x93, 0x78, 0x6a, 0x6c, 0x76, 0x7d, 0x7d, 0x76, 0x72, 0x77, + 0x89, 0x9a, 0xa5, 0x9e, 0x89, 0x70, 0x5f, 0x5f, 0x6c, 0x82, 0x92, + 0x96, 0x90, 0x85, 0x7b, 0x79, 0x7a, 0x7c, 0x7a, 0x76, 0x71, 0x70, + 0x78, 0x84, 0x90, 0x94, 0x8f, 0x83, 0x75, 0x6e, 0x6f, 0x78, 0x83, + 0x8b, 0x8d, 0x8a, 0x84, 0x80, 0x7e, 0x7e, 0x7e, 0x7b, 0x77, 0x75, + 0x76, 0x7c, 0x83, 0x89, 0x8a, 0x85, 0x7e, 0x78, 0x75, 0x77, 0x7c, + 0x81, 0x83, 0x83, 0x82, 0x81, 0x81, 0x81, 0x82, 0x80, 0x7e, 0x7c, + 0x7b, 0x7d, 0x80, 0x83, 0x85, 0x84, 0x82, 0x7f, 0x7d, 0x7d, 0x7e, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x82, 0x82, 0x82, 0x80, 0x7e, + 0x7d, 0x7d, 0x7e, 0x80, 0x82, 0x82, 0x81, 0x80, 0x7f, 0x7f, 0x7f, + 0x80, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x82, 0x81, 0x80, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, + }, + { // 6 + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x87, + 0x89, 0x86, 0x86, 0x81, 0x7c, 0x7a, 0x77, 0x7a, 0x7d, 0x79, 0x79, + 0x78, 0x76, 0x77, 0x77, 0x7a, 0x7d, 0x7c, 0x7f, 0x83, 0x82, 0x84, + 0x84, 0x84, 0x84, 0x82, 0x7f, 0x7f, 0x7e, 0x7e, 0x80, 0x7e, 0x81, + 0x82, 0x82, 0x82, 0x7f, 0x81, 0x81, 0x7e, 0x7d, 0x7c, 0x81, 0x7e, + 0x7a, 0x7c, 0x79, 0x7d, 0x7c, 0x79, 0x7c, 0x7a, 0x7c, 0x7f, 0x7e, + 0x80, 0x83, 0x83, 0x85, 0x83, 0x84, 0x87, 0x86, 0x89, 0x86, 0x88, + 0x89, 0x86, 0x88, 0x86, 0x87, 0x84, 0x81, 0x7f, 0x7a, 0x77, 0x73, + 0x73, 0x71, 0x6e, 0x6b, 0x69, 0x69, 0x68, 0x6b, 0x70, 0x76, 0x7c, + 0x83, 0x8c, 0x94, 0x99, 0x9d, 0xa0, 0xa1, 0x9f, 0x9e, 0x9c, 0x9a, + 0x97, 0x92, 0x8c, 0x87, 0x80, 0x79, 0x6e, 0x6b, 0x69, 0x66, 0x63, + 0x5c, 0x5a, 0x56, 0x51, 0x51, 0x52, 0x5f, 0x84, 0x8d, 0x96, 0x92, + 0x93, 0xa1, 0x9d, 0x9f, 0x9b, 0x9b, 0xa1, 0x9f, 0x97, 0x95, 0x8f, + 0x95, 0x8b, 0x87, 0x84, 0x86, 0x8b, 0x85, 0x7f, 0x75, 0x73, 0x72, + 0x6e, 0x63, 0x5e, 0x55, 0x52, 0x44, 0x42, 0x3b, 0x5d, 0x86, 0x91, + 0x98, 0x86, 0x90, 0x9e, 0x9f, 0xa1, 0x98, 0x99, 0xa3, 0x9d, 0x9e, + 0x94, 0x95, 0x98, 0x90, 0x8d, 0x84, 0x8a, 0x8d, 0x8a, 0x80, 0x73, + 0x6e, 0x71, 0x6a, 0x64, 0x53, 0x50, 0x48, 0x40, 0x3d, 0x3b, 0x6a, + 0x8c, 0x9d, 0x9b, 0x89, 0x94, 0x9e, 0xa4, 0xa7, 0x98, 0x9a, 0x9a, + 0x9d, 0x9a, 0x92, 0x97, 0x91, 0x91, 0x89, 0x85, 0x8a, 0x8b, 0x8d, + 0x82, 0x78, 0x73, 0x6d, 0x6b, 0x60, 0x56, 0x4d, 0x45, 0x41, 0x3d, + 0x3d, 0x5f, 0x86, 0x9f, 0xa3, 0x91, 0x90, 0x96, 0xa0, 0xa6, 0x9c, + 0x95, 0x92, 0x98, 0x9b, 0x99, 0x98, 0x90, 0x91, 0x8b, 0x89, 0x8a, + 0x88, 0x8b, 0x84, 0x7e, 0x77, 0x70, 0x6c, 0x62, 0x5d, 0x52, 0x4a, + 0x43, 0x3d, 0x3c, 0x49, 0x76, 0x93, 0xa4, 0x9f, 0x8f, 0x95, 0x98, + 0xa2, 0xa3, 0x98, 0x96, 0x8f, 0x92, 0x9b, 0xa1, 0xa1, 0x94, 0x87, + 0x82, 0x87, 0x8e, 0x8e, 0x88, 0x7f, 0x78, 0x75, 0x6e, 0x65, 0x5a, + 0x54, 0x4f, 0x48, 0x42, 0x3d, 0x3d, 0x5f, 0x8a, 0xa4, 0xaa, 0x94, + 0x8c, 0x8f, 0x9b, 0xa9, 0xa0, 0x97, 0x8b, 0x8f, 0x9a, 0xa1, 0xa3, + 0x93, 0x8b, 0x84, 0x8b, 0x91, 0x8f, 0x8b, 0x7f, 0x7b, 0x79, 0x74, + 0x6e, 0x60, 0x5b, 0x55, 0x4e, 0x47, 0x3f, 0x3c, 0x41, 0x6b, 0x90, + 0xa8, 0xa8, 0x90, 0x8b, 0x8b, 0x9b, 0xa7, 0xa2, 0x9b, 0x8e, 0x93, + 0x98, 0x9f, 0x9e, 0x91, 0x8c, 0x86, 0x8f, 0x91, 0x8c, 0x83, 0x77, + 0x79, 0x78, 0x77, 0x6f, 0x61, 0x5a, 0x51, 0x4e, 0x48, 0x41, 0x39, + 0x47, 0x74, 0x99, 0xb1, 0xa4, 0x8e, 0x85, 0x88, 0xa0, 0xaa, 0xa8, + 0x98, 0x8a, 0x8e, 0x9a, 0xa9, 0xa3, 0x92, 0x81, 0x80, 0x8e, 0x96, + 0x93, 0x81, 0x71, 0x70, 0x74, 0x7a, 0x72, 0x63, 0x51, 0x48, 0x48, + 0x48, 0x47, 0x40, 0x51, 0x75, 0x9c, 0xb4, 0xa8, 0x91, 0x7e, 0x84, + 0x9d, 0xaf, 0xaf, 0x9a, 0x89, 0x8a, 0x9c, 0xab, 0xa5, 0x8d, 0x75, + 0x76, 0x88, 0x9a, 0x9a, 0x83, 0x6a, 0x60, 0x6a, 0x7a, 0x7a, 0x68, + 0x4e, 0x3f, 0x42, 0x4d, 0x52, 0x51, 0x5f, 0x78, 0x9c, 0xaf, 0xa8, + 0x94, 0x7d, 0x81, 0x98, 0xb0, 0xb7, 0xa4, 0x91, 0x86, 0x91, 0xa1, + 0xa1, 0x93, 0x7d, 0x78, 0x83, 0x94, 0x96, 0x84, 0x6c, 0x5d, 0x64, + 0x71, 0x78, 0x6d, 0x52, 0x3f, 0x39, 0x46, 0x54, 0x63, 0x76, 0x84, + 0x96, 0x9c, 0x9d, 0x95, 0x8c, 0x8f, 0x9a, 0xac, 0xb2, 0xac, 0x9e, + 0x8f, 0x8c, 0x8d, 0x91, 0x8f, 0x8a, 0x86, 0x83, 0x83, 0x7e, 0x77, + 0x6c, 0x68, 0x67, 0x68, 0x68, 0x60, 0x52, 0x46, 0x44, 0x4a, 0x5a, + 0x73, 0x88, 0x98, 0x9c, 0x96, 0x8e, 0x8a, 0x92, 0xa0, 0xad, 0xb1, + 0xa9, 0x9b, 0x8d, 0x88, 0x8a, 0x8e, 0x8d, 0x89, 0x84, 0x81, 0x80, + 0x7d, 0x77, 0x6f, 0x69, 0x66, 0x67, 0x67, 0x60, 0x52, 0x45, 0x40, + 0x45, 0x54, 0x6c, 0x84, 0x95, 0x9b, 0x97, 0x92, 0x8f, 0x96, 0xa2, + 0xb1, 0xb7, 0xb1, 0xa4, 0x94, 0x8c, 0x89, 0x8c, 0x8d, 0x8b, 0x87, + 0x82, 0x7e, 0x7a, 0x75, 0x6f, 0x6b, 0x6a, 0x6c, 0x6c, 0x66, 0x5b, + 0x50, 0x4b, 0x50, 0x5a, 0x66, 0x75, 0x7f, 0x89, 0x8f, 0x93, 0x95, + 0x96, 0x9a, 0x9e, 0xa4, 0xa8, 0xa7, 0x9f, 0x94, 0x8c, 0x87, 0x88, + 0x88, 0x89, 0x87, 0x82, 0x7d, 0x77, 0x73, 0x71, 0x72, 0x72, 0x73, + 0x71, 0x6c, 0x66, 0x60, 0x5e, 0x60, 0x65, 0x6b, 0x70, 0x76, 0x7b, + 0x81, 0x87, 0x8c, 0x90, 0x92, 0x94, 0x96, 0x98, 0x99, 0x99, 0x97, + 0x93, 0x8d, 0x87, 0x84, 0x84, 0x86, 0x87, 0x86, 0x7f, 0x76, 0x71, + 0x71, 0x76, 0x7c, 0x7f, 0x7b, 0x72, 0x6a, 0x67, 0x6b, 0x72, 0x77, + 0x77, 0x74, 0x71, 0x71, 0x76, 0x7e, 0x85, 0x89, 0x89, 0x87, 0x86, + 0x87, 0x8a, 0x8e, 0x91, 0x91, 0x8e, 0x8a, 0x87, 0x86, 0x88, 0x89, + 0x88, 0x83, 0x7e, 0x7a, 0x79, 0x7c, 0x7f, 0x81, 0x7f, 0x7a, 0x76, + 0x74, 0x76, 0x79, 0x7c, 0x7d, 0x7b, 0x77, 0x75, 0x76, 0x78, 0x7b, + 0x7e, 0x7f, 0x7e, 0x7c, 0x7c, 0x7e, 0x81, 0x85, 0x87, 0x87, 0x86, + 0x86, 0x86, 0x88, 0x8a, 0x8a, 0x89, 0x87, 0x85, 0x83, 0x82, 0x81, + 0x80, 0x7f, 0x7f, 0x7d, 0x7c, 0x7b, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, + 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, + 0x7f, 0x80, 0x81, 0x82, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, + 0x84, 0x83, 0x82, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7e, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x80, 0x89, 0x8f, 0x7e, 0x6a, 0x6a, 0x81, 0x94, 0x8f, 0x7b, + 0x6c, 0x6e, 0x7f, 0x8e, 0x8a, 0x7b, 0x73, 0x79, 0x84, 0x8b, 0x88, + 0x7e, 0x79, 0x7c, 0x84, 0x86, 0x81, 0x79, 0x77, 0x7c, 0x82, 0x84, + 0x7f, 0x7a, 0x7b, 0x80, 0x82, 0x80, 0x79, 0x89, 0x9d, 0x89, 0x70, + 0x70, 0x82, 0x8d, 0x88, 0x7c, 0x74, 0x74, 0x7c, 0x82, 0x7d, 0x76, + 0x77, 0x7c, 0x7f, 0x81, 0x80, 0x7b, 0x7f, 0x9d, 0xa8, 0x83, 0x5a, + 0x5d, 0x82, 0x9c, 0x92, 0x78, 0x5f, 0x5f, 0x79, 0x90, 0x8b, 0x76, + 0x7e, 0x8b, 0x86, 0x8a, 0x9c, 0x96, 0x76, 0x65, 0x76, 0x8d, 0x8f, + 0x7a, 0x68, 0x65, 0x80, 0x97, 0x7e, 0x65, 0x6c, 0x87, 0x93, 0x88, + 0x7d, 0x7d, 0x88, 0x8f, 0x8e, 0x89, 0x77, 0x6a, 0x6a, 0x82, 0xa1, + 0x96, 0x71, 0x59, 0x69, 0x87, 0x94, 0x89, 0x76, 0x6d, 0x74, 0x84, + 0x86, 0x81, 0x7f, 0x7f, 0x7e, 0x7d, 0x83, 0x86, 0x83, 0x7c, 0x7a, + 0x7d, 0x87, 0x93, 0x8a, 0x77, 0x75, 0x85, 0x8e, 0x85, 0x7b, 0x7e, + 0x80, 0x88, 0x8c, 0x85, 0x77, 0x6d, 0x73, 0x7c, 0x83, 0x83, 0x7e, + 0x79, 0x7a, 0x7f, 0x80, 0x7e, 0x7e, 0x7d, 0x7b, 0x7c, 0x7f, 0x85, + 0x86, 0x82, 0x7f, 0x80, 0x84, 0x84, 0x80, 0x7e, 0x81, 0x86, 0x85, + 0x84, 0x83, 0x83, 0x7e, 0x77, 0x79, 0x80, 0x84, 0x80, 0x7a, 0x7a, + 0x7d, 0x80, 0x83, 0x80, 0x7e, 0x7f, 0x83, 0x83, 0x7e, 0x7c, 0x7e, + 0x7e, 0x7e, 0x7f, 0x84, 0x96, 0x9e, 0x88, 0x6b, 0x65, 0x7f, 0x92, + 0x94, 0x88, 0x77, 0x6e, 0x6d, 0x76, 0x7c, 0x7c, 0x7a, 0x7c, 0x7d, + 0x7d, 0x84, 0x87, 0x84, 0x7e, 0x7e, 0x85, 0x84, 0x80, 0x7b, 0x79, + 0x7d, 0x81, 0x81, 0x7c, 0x7c, 0x7f, 0x81, 0x80, 0x7f, 0x80, 0x81, + 0x82, 0x82, 0x82, 0x81, 0x7f, 0x7f, 0x7e, 0x7d, 0x7f, 0x81, 0x81, + 0x7f, 0x7f, 0x80, 0x82, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x7e, + 0x7f, 0x81, 0x7f, 0x7d, 0x7d, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x81, 0x80, 0x7f, 0x7f, 0x84, 0x83, 0x7c, 0x7e, 0x82, 0x81, 0x7d, + 0x7c, 0x82, 0x83, 0x81, 0x7e, 0x7e, 0x81, 0x81, 0x80, 0x7c, 0x7d, + 0x81, 0x81, 0x7e, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x81, + 0x81, 0x7f, 0x7d, 0x7f, 0x81, 0x7e, 0x7c, 0x7e, 0x80, 0x82, 0x7e, + 0x7a, 0x7b, 0x7f, 0x83, 0x7f, 0x79, 0x7a, 0x7f, 0x81, 0x7e, 0x7c, + 0x80, 0x81, 0x7d, 0x7c, 0x80, 0x83, 0x80, 0x7d, 0x7f, 0x82, 0x83, + 0x81, 0x81, 0x82, 0x83, 0x80, 0x7e, 0x7d, 0x80, 0x85, 0x81, 0x7e, + 0x7d, 0x7f, 0x7f, 0x7d, 0x7f, 0x80, 0x80, 0x7e, 0x7c, 0x7f, 0x82, + 0x81, 0x81, 0x7f, 0x80, 0x83, 0x81, 0x7f, 0x7f, 0x81, 0x81, 0x81, + 0x80, 0x7e, 0x7f, 0x80, 0x80, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7e, + 0x7f, 0x80, 0x7e, 0x7d, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x82, 0x81, + 0x80, 0x82, 0x83, 0x82, 0x80, 0x80, 0x81, 0x81, 0x7f, 0x7e, 0x7e, + 0x7f, 0x7e, 0x7d, 0x7c, 0x7c, 0x7e, 0x7f, 0x7d, 0x7e, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x82, 0x83, 0x84, 0x83, 0x84, 0x83, 0x83, 0x83, + 0x83, 0x82, 0x80, 0x80, 0x81, 0x7e, 0x7d, 0x7c, 0x7b, 0x79, 0x78, + 0x79, 0x7a, 0x79, 0x79, 0x7a, 0x7b, 0x7e, 0x80, 0x82, 0x82, 0x82, + 0x83, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x87, 0x86, 0x85, 0x83, + 0x81, 0x80, 0x7d, 0x80, 0x81, 0x78, 0x6f, 0x6f, 0x75, 0x76, 0x72, + 0x71, 0x76, 0x7b, 0x7a, 0x7a, 0x7f, 0x85, 0x8b, 0x8e, 0x8e, 0x90, + 0x94, 0x96, 0x93, 0x8f, 0x8f, 0x8f, 0x88, 0x80, 0x79, 0x75, 0x73, + 0x6e, 0x68, 0x64, 0x63, 0x60, 0x5d, 0x5d, 0x62, 0x6d, 0x77, 0x7d, + 0x82, 0x89, 0x93, 0x9a, 0x9f, 0xa5, 0xab, 0xb0, 0xac, 0xa5, 0x9f, + 0x97, 0x8d, 0x81, 0x7a, 0x72, 0x6c, 0x66, 0x5f, 0x5a, 0x55, 0x51, + 0x4e, 0x50, 0x61, 0x71, 0x79, 0x7c, 0x82, 0x90, 0x97, 0x9d, 0xa2, + 0xaa, 0xb2, 0xb2, 0xac, 0xa4, 0x9d, 0x95, 0x88, 0x7b, 0x72, 0x70, + 0x6b, 0x62, 0x5a, 0x57, 0x58, 0x55, 0x4e, 0x4b, 0x5c, 0x72, 0x7b, + 0x79, 0x7c, 0x8b, 0x97, 0x9c, 0x9f, 0xa5, 0xb2, 0xb4, 0xaf, 0xa7, + 0xa3, 0xa0, 0x92, 0x80, 0x72, 0x70, 0x71, 0x69, 0x5f, 0x5b, 0x5c, + 0x5a, 0x53, 0x4b, 0x51, 0x69, 0x78, 0x79, 0x77, 0x7f, 0x90, 0x97, + 0x9c, 0xa1, 0xad, 0xb6, 0xb3, 0xac, 0xa7, 0xa5, 0x9c, 0x8a, 0x79, + 0x71, 0x71, 0x6c, 0x62, 0x5b, 0x5b, 0x5c, 0x56, 0x4c, 0x47, 0x59, + 0x72, 0x79, 0x75, 0x76, 0x87, 0x95, 0x99, 0x9c, 0xa5, 0xb4, 0xb7, + 0xb0, 0xa9, 0xa7, 0xa3, 0x95, 0x82, 0x73, 0x71, 0x70, 0x69, 0x5f, + 0x5c, 0x5f, 0x5e, 0x56, 0x4b, 0x4f, 0x68, 0x78, 0x79, 0x74, 0x7b, + 0x8e, 0x96, 0x98, 0x9d, 0xa9, 0xb4, 0xb1, 0xa8, 0xa4, 0xa3, 0x9c, + 0x8a, 0x79, 0x71, 0x72, 0x6f, 0x65, 0x5b, 0x5c, 0x60, 0x5a, 0x4e, + 0x46, 0x5a, 0x74, 0x7a, 0x76, 0x75, 0x88, 0x96, 0x99, 0x9b, 0xa3, + 0xb4, 0xb6, 0xaf, 0xa4, 0xa2, 0xa1, 0x93, 0x80, 0x71, 0x71, 0x70, + 0x68, 0x5c, 0x58, 0x5e, 0x5c, 0x52, 0x44, 0x4e, 0x6e, 0x7b, 0x78, + 0x72, 0x81, 0x95, 0x99, 0x9b, 0xa0, 0xb0, 0xb9, 0xb1, 0xa6, 0x9f, + 0xa0, 0x98, 0x84, 0x73, 0x70, 0x73, 0x6e, 0x63, 0x5b, 0x5e, 0x61, + 0x5a, 0x4e, 0x49, 0x61, 0x78, 0x7b, 0x74, 0x76, 0x8b, 0x98, 0x99, + 0x9b, 0xa5, 0xb5, 0xb6, 0xac, 0xa2, 0xa0, 0x9f, 0x91, 0x7e, 0x71, + 0x71, 0x71, 0x69, 0x5d, 0x5b, 0x5f, 0x5c, 0x51, 0x45, 0x55, 0x74, + 0x7c, 0x78, 0x73, 0x84, 0x96, 0x99, 0x9b, 0xa1, 0xb2, 0xb8, 0xb1, + 0xa5, 0x9d, 0x9d, 0x93, 0x81, 0x72, 0x70, 0x74, 0x6e, 0x64, 0x5c, + 0x5f, 0x61, 0x5a, 0x4c, 0x4d, 0x6a, 0x7b, 0x7a, 0x72, 0x79, 0x8f, + 0x98, 0x99, 0x9b, 0xa9, 0xb6, 0xb5, 0xa9, 0x9f, 0x9f, 0x9a, 0x89, + 0x77, 0x6f, 0x74, 0x72, 0x69, 0x5f, 0x5d, 0x60, 0x5b, 0x4e, 0x45, + 0x5d, 0x78, 0x7d, 0x76, 0x73, 0x87, 0x96, 0x98, 0x9a, 0xa3, 0xb4, + 0xb7, 0xae, 0xa2, 0x9e, 0x9c, 0x8f, 0x7c, 0x6e, 0x6f, 0x72, 0x6d, + 0x66, 0x65, 0x6a, 0x68, 0x5a, 0x4b, 0x4d, 0x6a, 0x7c, 0x78, 0x72, + 0x77, 0x8a, 0x91, 0x92, 0x98, 0xa5, 0xb3, 0xb1, 0xa8, 0xa0, 0xa0, + 0x9a, 0x89, 0x79, 0x72, 0x75, 0x73, 0x6a, 0x65, 0x66, 0x69, 0x60, + 0x4f, 0x45, 0x5b, 0x78, 0x7c, 0x75, 0x73, 0x84, 0x91, 0x92, 0x93, + 0x9e, 0xae, 0xb1, 0xa9, 0xa0, 0x9d, 0x9d, 0x90, 0x7c, 0x71, 0x73, + 0x77, 0x71, 0x69, 0x69, 0x70, 0x6f, 0x64, 0x4f, 0x4b, 0x66, 0x7a, + 0x7a, 0x70, 0x74, 0x88, 0x8f, 0x8e, 0x90, 0x9f, 0xae, 0xad, 0xa2, + 0x9b, 0x9e, 0x9c, 0x8c, 0x78, 0x71, 0x75, 0x76, 0x6c, 0x67, 0x6b, + 0x75, 0x73, 0x68, 0x55, 0x4b, 0x6a, 0x7b, 0x7d, 0x75, 0x74, 0x8b, + 0x8d, 0x8d, 0x8d, 0x9b, 0xac, 0xa6, 0xa0, 0x96, 0x9b, 0x99, 0x8b, + 0x7a, 0x70, 0x77, 0x75, 0x71, 0x6a, 0x6d, 0x73, 0x70, 0x69, 0x58, + 0x55, 0x6b, 0x7a, 0x7d, 0x78, 0x7b, 0x8a, 0x8e, 0x8e, 0x8f, 0x98, + 0xa3, 0xa0, 0x99, 0x92, 0x95, 0x93, 0x88, 0x7b, 0x74, 0x77, 0x77, + 0x72, 0x6e, 0x70, 0x75, 0x73, 0x6a, 0x5e, 0x56, 0x67, 0x74, 0x78, + 0x79, 0x7b, 0x8a, 0x8d, 0x8f, 0x90, 0x97, 0xa1, 0x9d, 0x98, 0x91, + 0x92, 0x90, 0x87, 0x7d, 0x76, 0x79, 0x79, 0x76, 0x73, 0x75, 0x7b, + 0x7a, 0x77, 0x6f, 0x69, 0x66, 0x68, 0x6f, 0x74, 0x7a, 0x7e, 0x84, + 0x89, 0x8b, 0x8f, 0x93, 0x96, 0x94, 0x92, 0x90, 0x8e, 0x8c, 0x87, + 0x82, 0x7d, 0x7b, 0x7a, 0x79, 0x79, 0x78, 0x77, 0x75, 0x70, 0x6a, + 0x5d, 0x5c, 0x6f, 0x7a, 0x80, 0x7b, 0x80, 0x8b, 0x8d, 0x90, 0x8e, + 0x94, 0x97, 0x92, 0x8a, 0x82, 0x83, 0x80, 0x7d, 0x79, 0x7a, 0x7f, + 0x81, 0x83, 0x82, 0x85, 0x88, 0x8a, 0x86, 0x80, 0x7d, 0x7a, 0x78, + 0x73, 0x70, 0x70, 0x72, 0x74, 0x75, 0x79, 0x7f, 0x86, 0x89, 0x8a, + 0x8a, 0x8b, 0x8b, 0x88, 0x85, 0x83, 0x81, 0x7e, 0x79, 0x74, 0x70, + 0x6e, 0x6c, 0x68, 0x67, 0x6a, 0x71, 0x77, 0x7b, 0x83, 0x8b, 0x90, + 0x91, 0x91, 0x92, 0x92, 0x91, 0x8d, 0x89, 0x86, 0x82, 0x7f, 0x7b, + 0x7b, 0x7e, 0x81, 0x84, 0x85, 0x89, 0x8b, 0x8b, 0x89, 0x86, 0x83, + 0x80, 0x7c, 0x77, 0x73, 0x71, 0x70, 0x70, 0x71, 0x74, 0x78, 0x7b, + 0x7c, 0x7e, 0x81, 0x84, 0x87, 0x87, 0x87, 0x85, 0x85, 0x85, 0x84, + 0x83, 0x82, 0x81, 0x7f, 0x7c, 0x79, 0x77, 0x75, 0x73, 0x71, 0x71, + 0x70, 0x73, 0x79, 0x7e, 0x83, 0x86, 0x89, 0x8b, 0x8c, 0x8d, 0x8c, + 0x8b, 0x89, 0x87, 0x83, 0x80, 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, 0x7f, + 0x81, 0x83, 0x83, 0x84, 0x85, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, + 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7f, 0x80, 0x80, 0x81, 0x81, + 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x85, + 0x85, 0x84, 0x81, 0x7f, 0x81, 0x7f, 0x7e, 0x7c, 0x7c, 0x7d, 0x7c, + 0x7b, 0x7b, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x81, 0x81, 0x81, 0x82, + 0x82, 0x84, 0x83, 0x83, 0x82, 0x82, 0x82, 0x81, 0x80, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7d, 0x7c, 0x7d, 0x7e, 0x7e, 0x7d, 0x7e, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + }, + { // 7 + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, + 0x80, 0x7f, 0x7f, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7b, 0x7b, + 0x7c, 0x7c, 0x7c, 0x7d, 0x7e, 0x7f, 0x7f, 0x80, 0x82, 0x83, 0x83, + 0x84, 0x85, 0x86, 0x86, 0x86, 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, + 0x80, 0x7e, 0x7c, 0x79, 0x77, 0x75, 0x73, 0x72, 0x71, 0x71, 0x71, + 0x73, 0x75, 0x77, 0x7b, 0x7f, 0x83, 0x86, 0x8a, 0x8d, 0x90, 0x92, + 0x94, 0x95, 0x95, 0x93, 0x90, 0x8d, 0x8a, 0x86, 0x81, 0x7d, 0x78, + 0x73, 0x6d, 0x69, 0x67, 0x65, 0x66, 0x67, 0x68, 0x6b, 0x6e, 0x71, + 0x75, 0x7d, 0x83, 0x88, 0x8d, 0x91, 0x95, 0x97, 0x98, 0x9a, 0x9c, + 0x9c, 0x9b, 0x99, 0x96, 0x92, 0x8d, 0x88, 0x84, 0x7e, 0x78, 0x71, + 0x6c, 0x66, 0x61, 0x5f, 0x62, 0x60, 0x5a, 0x62, 0x69, 0x68, 0x69, + 0x75, 0x82, 0x8a, 0x8b, 0x90, 0x98, 0x9d, 0x9f, 0xa1, 0xa3, 0xa2, + 0xa1, 0x9e, 0x99, 0x94, 0x8f, 0x8a, 0x81, 0x79, 0x71, 0x6b, 0x64, + 0x5f, 0x5f, 0x5d, 0x5e, 0x5e, 0x5f, 0x62, 0x65, 0x6c, 0x77, 0x7c, + 0x82, 0x8f, 0x8e, 0x92, 0x9a, 0x9b, 0x9e, 0xa1, 0xa2, 0xa1, 0x9d, + 0x9c, 0x99, 0x94, 0x8d, 0x88, 0x82, 0x79, 0x73, 0x6b, 0x66, 0x60, + 0x5f, 0x5c, 0x5a, 0x5a, 0x5c, 0x60, 0x63, 0x6b, 0x74, 0x7d, 0x82, + 0x88, 0x8f, 0x95, 0x9a, 0x9c, 0xa0, 0xa2, 0xa3, 0xa1, 0x9e, 0x9e, + 0x99, 0x93, 0x8b, 0x87, 0x80, 0x78, 0x6f, 0x68, 0x63, 0x5e, 0x5f, + 0x5b, 0x59, 0x5a, 0x5e, 0x61, 0x64, 0x6e, 0x77, 0x81, 0x85, 0x8a, + 0x92, 0x98, 0x9c, 0x9e, 0xa2, 0xa4, 0xa3, 0xa0, 0x9e, 0x9d, 0x98, + 0x92, 0x8a, 0x85, 0x7e, 0x75, 0x6d, 0x65, 0x61, 0x5e, 0x5e, 0x59, + 0x57, 0x59, 0x5d, 0x60, 0x64, 0x6f, 0x7a, 0x82, 0x85, 0x8c, 0x94, + 0x9b, 0x9d, 0x9e, 0xa4, 0xa6, 0xa4, 0x9f, 0x9e, 0x9d, 0x98, 0x90, + 0x88, 0x84, 0x7d, 0x73, 0x69, 0x63, 0x60, 0x5e, 0x5b, 0x57, 0x56, + 0x5a, 0x5e, 0x5f, 0x66, 0x73, 0x7e, 0x84, 0x88, 0x90, 0x98, 0x9f, + 0x9f, 0xa1, 0xa6, 0xa9, 0xa4, 0x9f, 0x9e, 0x9c, 0x95, 0x8a, 0x84, + 0x7e, 0x76, 0x69, 0x58, 0x50, 0x5a, 0x65, 0x61, 0x5f, 0x68, 0x70, + 0x64, 0x5b, 0x69, 0x7f, 0x84, 0x84, 0x98, 0xab, 0xad, 0xa2, 0xa0, + 0xa4, 0x98, 0x8d, 0x91, 0x9c, 0x95, 0x85, 0x81, 0x7e, 0x6d, 0x56, + 0x50, 0x4d, 0x54, 0x75, 0x88, 0x83, 0x78, 0x76, 0x73, 0x63, 0x66, + 0x7e, 0x92, 0x91, 0x9a, 0xa6, 0xa2, 0x92, 0x8b, 0x8a, 0x82, 0x80, + 0x8d, 0x99, 0x95, 0x8b, 0x84, 0x7a, 0x68, 0x5d, 0x58, 0x50, 0x4e, + 0x7b, 0xa1, 0x8f, 0x7d, 0x7c, 0x73, 0x52, 0x52, 0x7d, 0x99, 0x9c, + 0xa6, 0xb5, 0xa6, 0x88, 0x7f, 0x7f, 0x7c, 0x7b, 0x93, 0xa4, 0x99, + 0x87, 0x7f, 0x74, 0x60, 0x58, 0x55, 0x4f, 0x4e, 0x89, 0xad, 0x92, + 0x7a, 0x73, 0x6a, 0x49, 0x56, 0x85, 0xa5, 0xa5, 0xab, 0xb4, 0x9c, + 0x7a, 0x7a, 0x80, 0x7d, 0x84, 0x9d, 0xa7, 0x93, 0x81, 0x79, 0x6d, + 0x5b, 0x58, 0x54, 0x4c, 0x5d, 0xa0, 0xb3, 0x89, 0x72, 0x6d, 0x5c, + 0x42, 0x64, 0x99, 0xaf, 0xac, 0xb1, 0xad, 0x88, 0x72, 0x74, 0x7f, + 0x82, 0x8f, 0xa5, 0xa3, 0x8a, 0x74, 0x6f, 0x62, 0x59, 0x55, 0x56, + 0x4f, 0x7b, 0xb7, 0xa3, 0x7a, 0x6c, 0x69, 0x4c, 0x4f, 0x86, 0xb1, + 0xb1, 0xa9, 0xab, 0x93, 0x73, 0x70, 0x82, 0x88, 0x8a, 0x9a, 0xa0, + 0x90, 0x76, 0x6e, 0x6b, 0x61, 0x56, 0x50, 0x4e, 0x6d, 0xb1, 0xad, + 0x84, 0x6d, 0x68, 0x54, 0x49, 0x7b, 0xac, 0xb7, 0xaa, 0xaa, 0x9b, + 0x77, 0x6b, 0x7b, 0x8a, 0x8a, 0x96, 0xa1, 0x95, 0x79, 0x6a, 0x69, + 0x64, 0x57, 0x51, 0x4f, 0x71, 0xaf, 0xaf, 0x85, 0x6c, 0x68, 0x56, + 0x51, 0x7b, 0xac, 0xb4, 0xa8, 0xa6, 0x98, 0x77, 0x69, 0x7c, 0x8b, + 0x8c, 0x92, 0x9b, 0x90, 0x78, 0x68, 0x6d, 0x66, 0x53, 0x4c, 0x53, + 0x7c, 0xb3, 0xab, 0x81, 0x6c, 0x63, 0x52, 0x54, 0x8a, 0xb5, 0xb7, + 0xa9, 0xa4, 0x90, 0x72, 0x69, 0x7f, 0x90, 0x8e, 0x95, 0x99, 0x89, + 0x6e, 0x63, 0x6b, 0x60, 0x4f, 0x4a, 0x60, 0xa2, 0xb7, 0x94, 0x72, + 0x6b, 0x5c, 0x4d, 0x6f, 0xa8, 0xbc, 0xac, 0xa8, 0x9b, 0x7b, 0x64, + 0x78, 0x90, 0x8f, 0x8f, 0x9a, 0x90, 0x70, 0x5e, 0x6a, 0x6a, 0x51, + 0x49, 0x54, 0x94, 0xb8, 0x9b, 0x78, 0x6c, 0x63, 0x51, 0x66, 0x9e, + 0xbc, 0xad, 0xa3, 0x9f, 0x83, 0x6a, 0x75, 0x8d, 0x8d, 0x88, 0x94, + 0x91, 0x78, 0x5e, 0x65, 0x6a, 0x55, 0x43, 0x51, 0x9a, 0xba, 0x9a, + 0x74, 0x6f, 0x64, 0x4f, 0x6b, 0xa4, 0xc0, 0xab, 0xa1, 0x9d, 0x81, + 0x67, 0x77, 0x92, 0x91, 0x88, 0x91, 0x8e, 0x72, 0x59, 0x63, 0x6a, + 0x53, 0x40, 0x5e, 0xa8, 0xb4, 0x8c, 0x70, 0x6f, 0x5e, 0x53, 0x7b, + 0xb2, 0xbc, 0xa8, 0xa3, 0x96, 0x76, 0x69, 0x85, 0x96, 0x88, 0x82, + 0x8e, 0x87, 0x69, 0x60, 0x68, 0x63, 0x51, 0x4f, 0x88, 0xb0, 0x9c, + 0x79, 0x6f, 0x6c, 0x5b, 0x6b, 0x9c, 0xba, 0xac, 0x9e, 0x98, 0x84, + 0x67, 0x72, 0x8f, 0x90, 0x85, 0x87, 0x8e, 0x74, 0x59, 0x5c, 0x63, + 0x54, 0x49, 0x7d, 0xb6, 0xa3, 0x79, 0x6f, 0x6f, 0x5a, 0x62, 0x9a, + 0xc1, 0xb2, 0x9d, 0x9f, 0x89, 0x69, 0x6c, 0x8d, 0x92, 0x81, 0x85, + 0x8f, 0x79, 0x5c, 0x57, 0x5b, 0x4b, 0x4f, 0x91, 0xb8, 0x9b, 0x74, + 0x70, 0x6a, 0x57, 0x6d, 0xab, 0xc5, 0xb0, 0xa0, 0x96, 0x7e, 0x64, + 0x72, 0x8f, 0x92, 0x85, 0x89, 0x89, 0x6c, 0x56, 0x58, 0x57, 0x46, + 0x5f, 0xa2, 0xb6, 0x90, 0x70, 0x6f, 0x64, 0x57, 0x7c, 0xb3, 0xc5, + 0xaf, 0xa1, 0x96, 0x75, 0x60, 0x77, 0x8f, 0x8d, 0x87, 0x8b, 0x82, + 0x5f, 0x4c, 0x4f, 0x51, 0x58, 0x8a, 0xae, 0xa0, 0x7a, 0x6b, 0x6a, + 0x60, 0x70, 0xa4, 0xc6, 0xba, 0xa6, 0x95, 0x81, 0x64, 0x6b, 0x85, + 0x90, 0x88, 0x87, 0x82, 0x67, 0x4b, 0x4a, 0x4e, 0x5a, 0x8b, 0xa9, + 0xa0, 0x7a, 0x6e, 0x6a, 0x63, 0x71, 0xa2, 0xc3, 0xbe, 0xa7, 0x96, + 0x82, 0x69, 0x6b, 0x80, 0x8d, 0x89, 0x8b, 0x82, 0x6b, 0x4c, 0x43, + 0x41, 0x55, 0x87, 0xac, 0xa4, 0x85, 0x70, 0x63, 0x5e, 0x6f, 0xa0, + 0xbf, 0xc5, 0xb5, 0x9e, 0x81, 0x69, 0x69, 0x7a, 0x86, 0x8a, 0x8f, + 0x82, 0x67, 0x49, 0x3f, 0x40, 0x61, 0x95, 0xa8, 0x96, 0x7f, 0x73, + 0x65, 0x61, 0x7e, 0xac, 0xc2, 0xbc, 0xae, 0x9a, 0x7b, 0x67, 0x6a, + 0x7d, 0x86, 0x8a, 0x89, 0x7a, 0x59, 0x41, 0x3d, 0x54, 0x80, 0x9b, + 0x9d, 0x87, 0x79, 0x6c, 0x67, 0x74, 0x96, 0xb4, 0xbe, 0xb5, 0xa3, + 0x8b, 0x74, 0x6c, 0x72, 0x7d, 0x86, 0x8a, 0x82, 0x6f, 0x50, 0x40, + 0x41, 0x66, 0x8e, 0x9e, 0x93, 0x83, 0x75, 0x66, 0x67, 0x82, 0xa5, + 0xba, 0xbe, 0xb2, 0x9c, 0x7e, 0x6c, 0x6a, 0x72, 0x7c, 0x88, 0x88, + 0x78, 0x5a, 0x44, 0x3f, 0x61, 0x86, 0x94, 0x90, 0x84, 0x7b, 0x6c, + 0x6d, 0x85, 0xa7, 0xb4, 0xb6, 0xaf, 0x9e, 0x82, 0x70, 0x6f, 0x75, + 0x7a, 0x82, 0x84, 0x74, 0x59, 0x48, 0x48, 0x65, 0x85, 0x90, 0x8a, + 0x80, 0x7c, 0x72, 0x73, 0x89, 0xa4, 0xac, 0xaf, 0xab, 0xa0, 0x8b, + 0x77, 0x72, 0x73, 0x76, 0x7b, 0x81, 0x79, 0x60, 0x4c, 0x4c, 0x66, + 0x81, 0x8a, 0x87, 0x80, 0x7c, 0x74, 0x77, 0x8c, 0xa6, 0xb2, 0xb3, + 0xb0, 0xa3, 0x8b, 0x79, 0x72, 0x72, 0x74, 0x78, 0x7a, 0x6e, 0x57, + 0x45, 0x4a, 0x69, 0x82, 0x86, 0x81, 0x80, 0x7d, 0x76, 0x7e, 0x94, + 0xa8, 0xae, 0xac, 0xa8, 0x9d, 0x8b, 0x7b, 0x75, 0x76, 0x76, 0x78, + 0x79, 0x70, 0x5e, 0x51, 0x58, 0x6e, 0x7c, 0x7e, 0x7a, 0x7c, 0x7d, + 0x7b, 0x81, 0x90, 0x9e, 0x9f, 0x9b, 0x96, 0x92, 0x8b, 0x87, 0x87, + 0x8a, 0x89, 0x84, 0x7d, 0x75, 0x6d, 0x66, 0x67, 0x6c, 0x6d, 0x69, + 0x66, 0x69, 0x6f, 0x75, 0x7a, 0x82, 0x8d, 0x93, 0x93, 0x94, 0x97, + 0x9a, 0x98, 0x95, 0x94, 0x93, 0x8c, 0x82, 0x79, 0x73, 0x6c, 0x66, + 0x66, 0x68, 0x67, 0x64, 0x65, 0x6b, 0x71, 0x76, 0x7d, 0x88, 0x91, + 0x95, 0x96, 0x99, 0x9c, 0x9c, 0x99, 0x97, 0x95, 0x90, 0x85, 0x7d, + 0x75, 0x6e, 0x67, 0x65, 0x67, 0x66, 0x62, 0x63, 0x6a, 0x6f, 0x73, + 0x7a, 0x87, 0x90, 0x93, 0x95, 0x99, 0x9d, 0x9c, 0x9a, 0x98, 0x97, + 0x90, 0x87, 0x7f, 0x77, 0x6e, 0x66, 0x64, 0x66, 0x65, 0x63, 0x64, + 0x6a, 0x6e, 0x72, 0x7a, 0x86, 0x90, 0x93, 0x95, 0x99, 0x9d, 0x9b, + 0x99, 0x99, 0x98, 0x91, 0x87, 0x7f, 0x78, 0x6d, 0x62, 0x5f, 0x60, + 0x5d, 0x58, 0x59, 0x61, 0x68, 0x6b, 0x77, 0x89, 0x96, 0x9b, 0x9d, + 0xa5, 0xaa, 0xa7, 0xa3, 0xa4, 0xa2, 0x99, 0x8b, 0x80, 0x76, 0x69, + 0x5b, 0x58, 0x5b, 0x5a, 0x56, 0x57, 0x61, 0x67, 0x6b, 0x75, 0x87, + 0x95, 0x9a, 0x9d, 0xa4, 0xaa, 0xa8, 0xa4, 0xa4, 0xa3, 0x9a, 0x8d, + 0x82, 0x78, 0x6a, 0x5d, 0x58, 0x5a, 0x59, 0x56, 0x58, 0x60, 0x66, + 0x6a, 0x74, 0x85, 0x94, 0x9a, 0x9d, 0xa3, 0xa8, 0xa7, 0xa4, 0xa4, + 0xa3, 0x9b, 0x8d, 0x82, 0x78, 0x6b, 0x5e, 0x58, 0x5b, 0x5b, 0x56, + 0x57, 0x5f, 0x66, 0x69, 0x72, 0x82, 0x91, 0x98, 0x9c, 0xa2, 0xa8, + 0xa7, 0xa3, 0xa3, 0xa2, 0x9b, 0x90, 0x85, 0x7b, 0x6d, 0x5f, 0x59, + 0x5b, 0x5b, 0x57, 0x58, 0x60, 0x66, 0x69, 0x71, 0x82, 0x92, 0x97, + 0x9b, 0xa1, 0xa8, 0xa6, 0xa3, 0xa3, 0xa4, 0x9c, 0x90, 0x86, 0x7d, + 0x70, 0x62, 0x5a, 0x5b, 0x5b, 0x58, 0x57, 0x5d, 0x64, 0x68, 0x6e, + 0x7c, 0x8b, 0x95, 0x9a, 0x9f, 0xa5, 0xa7, 0xa5, 0xa3, 0xa3, 0x9f, + 0x95, 0x8b, 0x81, 0x75, 0x67, 0x5c, 0x5a, 0x5b, 0x59, 0x58, 0x5b, + 0x64, 0x68, 0x6b, 0x77, 0x89, 0x94, 0x98, 0x9d, 0xa4, 0xa7, 0xa4, + 0xa3, 0xa3, 0xa1, 0x97, 0x8c, 0x83, 0x79, 0x6b, 0x60, 0x5a, 0x5b, + 0x59, 0x58, 0x5a, 0x61, 0x66, 0x69, 0x72, 0x81, 0x8f, 0x96, 0x9a, + 0xa1, 0xa7, 0xa5, 0xa3, 0xa3, 0xa3, 0x9c, 0x90, 0x87, 0x7e, 0x71, + 0x64, 0x5b, 0x5b, 0x5b, 0x58, 0x58, 0x5e, 0x66, 0x69, 0x6e, 0x7b, + 0x8b, 0x94, 0x98, 0x9d, 0xa5, 0xa7, 0xa3, 0xa2, 0xa3, 0xa0, 0x95, + 0x8c, 0x85, 0x7b, 0x6d, 0x62, 0x5c, 0x5c, 0x5b, 0x59, 0x5a, 0x61, + 0x66, 0x69, 0x6f, 0x7d, 0x8b, 0x93, 0x98, 0x9e, 0xa4, 0xa5, 0xa3, + 0xa2, 0xa3, 0x9e, 0x94, 0x8b, 0x82, 0x77, 0x6a, 0x5f, 0x5b, 0x5c, + 0x5a, 0x5a, 0x5c, 0x63, 0x67, 0x6a, 0x74, 0x82, 0x8e, 0x95, 0x99, + 0xa0, 0xa5, 0xa4, 0xa2, 0xa2, 0xa2, 0x9b, 0x91, 0x88, 0x81, 0x76, + 0x6a, 0x60, 0x5b, 0x5c, 0x5b, 0x5a, 0x5c, 0x64, 0x69, 0x6b, 0x72, + 0x81, 0x8e, 0x94, 0x98, 0x9f, 0xa5, 0xa3, 0xa1, 0xa2, 0xa2, 0x9c, + 0x91, 0x89, 0x81, 0x75, 0x69, 0x60, 0x5b, 0x5c, 0x5b, 0x5a, 0x5c, + 0x64, 0x69, 0x6b, 0x73, 0x80, 0x8d, 0x93, 0x97, 0x9e, 0xa4, 0xa3, + 0xa1, 0xa1, 0xa2, 0x9d, 0x92, 0x8b, 0x84, 0x7a, 0x6e, 0x65, 0x5e, + 0x5c, 0x5d, 0x5c, 0x5d, 0x60, 0x67, 0x6a, 0x6e, 0x78, 0x85, 0x90, + 0x96, 0x9a, 0xa0, 0xa4, 0xa3, 0xa1, 0xa1, 0xa1, 0x99, 0x8f, 0x86, + 0x7e, 0x74, 0x6a, 0x61, 0x5f, 0x60, 0x61, 0x61, 0x63, 0x69, 0x6d, + 0x70, 0x76, 0x80, 0x8a, 0x90, 0x93, 0x98, 0x9d, 0x9e, 0x9c, 0x9c, + 0x9b, 0x97, 0x90, 0x89, 0x83, 0x7c, 0x74, 0x6c, 0x64, 0x62, 0x63, + 0x63, 0x63, 0x65, 0x6a, 0x6e, 0x70, 0x76, 0x81, 0x8b, 0x91, 0x94, + 0x98, 0x9d, 0x9d, 0x9b, 0x9a, 0x9a, 0x97, 0x8e, 0x87, 0x81, 0x7a, + 0x72, 0x69, 0x63, 0x64, 0x64, 0x63, 0x62, 0x65, 0x6c, 0x6f, 0x72, + 0x78, 0x83, 0x8c, 0x90, 0x93, 0x99, 0x9d, 0x9d, 0x9b, 0x9b, 0x9a, + 0x96, 0x8e, 0x89, 0x83, 0x7c, 0x73, 0x6c, 0x65, 0x63, 0x65, 0x64, + 0x63, 0x64, 0x6a, 0x6d, 0x70, 0x75, 0x80, 0x8b, 0x90, 0x92, 0x96, + 0x9c, 0x9e, 0x9c, 0x9a, 0x9a, 0x98, 0x90, 0x88, 0x82, 0x7d, 0x76, + 0x6d, 0x65, 0x62, 0x64, 0x66, 0x64, 0x63, 0x68, 0x6d, 0x6f, 0x72, + 0x7c, 0x88, 0x8f, 0x94, 0x9c, 0x9f, 0xa1, 0x9b, 0x95, 0x94, 0x96, + 0x92, 0x8c, 0x85, 0x7e, 0x71, 0x60, 0x56, 0x4e, 0x5d, 0x71, 0x7d, + 0x76, 0x79, 0x7a, 0x74, 0x6d, 0x75, 0x8d, 0x9f, 0xa3, 0xa4, 0xa7, + 0xa0, 0x8e, 0x81, 0x84, 0x82, 0x80, 0x7e, 0x84, 0x78, 0x67, 0x59, + 0x58, 0x50, 0x63, 0x80, 0x8c, 0x86, 0x7b, 0x7e, 0x77, 0x72, 0x7c, + 0x96, 0xa2, 0xa5, 0xa3, 0xa4, 0x92, 0x80, 0x7a, 0x81, 0x7f, 0x80, + 0x85, 0x86, 0x78, 0x63, 0x5b, 0x59, 0x4e, 0x54, 0x7f, 0x96, 0x8e, + 0x7c, 0x82, 0x7a, 0x6a, 0x75, 0x99, 0xaa, 0xa7, 0xa4, 0xa7, 0x94, + 0x7b, 0x79, 0x87, 0x86, 0x7d, 0x84, 0x89, 0x79, 0x62, 0x60, 0x5f, + 0x55, 0x46, 0x6f, 0x97, 0x94, 0x80, 0x7e, 0x7e, 0x66, 0x68, 0x8b, + 0xaa, 0xa7, 0xa8, 0xa8, 0x9a, 0x7d, 0x7a, 0x87, 0x8a, 0x82, 0x89, + 0x8d, 0x7e, 0x6d, 0x6a, 0x68, 0x59, 0x53, 0x4d, 0x6f, 0x91, 0x96, + 0x8a, 0x7c, 0x72, 0x65, 0x6b, 0x89, 0xa5, 0xac, 0xac, 0xa2, 0x93, + 0x7e, 0x7b, 0x86, 0x8c, 0x8b, 0x8c, 0x8c, 0x7c, 0x6e, 0x6d, 0x6c, + 0x5f, 0x5c, 0x51, 0x55, 0x81, 0x9c, 0x8f, 0x78, 0x75, 0x70, 0x63, + 0x72, 0x99, 0xab, 0xa7, 0xa2, 0x9c, 0x89, 0x7a, 0x84, 0x91, 0x8d, + 0x8a, 0x8d, 0x88, 0x74, 0x6f, 0x76, 0x71, 0x61, 0x5b, 0x50, 0x54, + 0x81, 0x9b, 0x94, 0x78, 0x71, 0x6c, 0x62, 0x70, 0x94, 0xab, 0xab, + 0xa3, 0x99, 0x8b, 0x7c, 0x7f, 0x8a, 0x92, 0x90, 0x91, 0x8b, 0x7d, + 0x6f, 0x72, 0x71, 0x68, 0x5c, 0x56, 0x4b, 0x61, 0x92, 0x9b, 0x86, + 0x71, 0x6e, 0x62, 0x60, 0x7b, 0xa3, 0xad, 0xa8, 0xa2, 0x97, 0x83, + 0x79, 0x87, 0x98, 0x95, 0x8f, 0x94, 0x8a, 0x7a, 0x6f, 0x79, 0x78, + 0x6d, 0x5c, 0x56, 0x4c, 0x4e, 0x84, 0xa7, 0x96, 0x6b, 0x65, 0x66, + 0x5c, 0x6a, 0x99, 0xb7, 0xb0, 0xa0, 0x9a, 0x8c, 0x79, 0x7f, 0x92, + 0x9b, 0x93, 0x94, 0x95, 0x86, 0x72, 0x71, 0x7a, 0x77, 0x67, 0x5e, + 0x5b, 0x4b, 0x53, 0x89, 0xa1, 0x84, 0x68, 0x69, 0x67, 0x5a, 0x6e, + 0x9d, 0xb3, 0xa6, 0x9d, 0x9c, 0x8c, 0x79, 0x82, 0x97, 0x9b, 0x97, + 0x98, 0x97, 0x83, 0x71, 0x74, 0x7e, 0x7e, 0x70, 0x64, 0x57, 0x4c, + 0x47, 0x6d, 0x99, 0x97, 0x77, 0x60, 0x5f, 0x5a, 0x64, 0x89, 0xaf, + 0xb3, 0xa4, 0x9b, 0x92, 0x80, 0x7c, 0x8e, 0xa0, 0x9e, 0x97, 0x97, + 0x90, 0x7d, 0x74, 0x7e, 0x85, 0x7f, 0x73, 0x67, 0x5a, 0x4d, 0x48, + 0x5b, 0x87, 0x99, 0x82, 0x65, 0x5a, 0x5d, 0x60, 0x76, 0x99, 0xb1, + 0xae, 0x9f, 0x95, 0x8b, 0x80, 0x84, 0x95, 0xa2, 0xa2, 0x9b, 0x94, + 0x86, 0x7c, 0x79, 0x82, 0x83, 0x7e, 0x74, 0x66, 0x58, 0x4d, 0x4f, + 0x53, 0x79, 0x96, 0x8a, 0x6d, 0x59, 0x5b, 0x60, 0x71, 0x91, 0xb2, + 0xb5, 0xa5, 0x92, 0x8b, 0x83, 0x80, 0x8e, 0xa3, 0xa9, 0x9b, 0x8f, + 0x8b, 0x85, 0x7d, 0x7d, 0x84, 0x83, 0x75, 0x6d, 0x66, 0x5a, 0x4c, + 0x50, 0x5b, 0x78, 0x90, 0x82, 0x68, 0x58, 0x5e, 0x67, 0x78, 0x95, + 0xb3, 0xb1, 0x9e, 0x8f, 0x8a, 0x86, 0x85, 0x92, 0x9d, 0xa0, 0x9a, + 0x92, 0x8a, 0x85, 0x81, 0x82, 0x83, 0x81, 0x77, 0x71, 0x6d, 0x63, + 0x56, 0x50, 0x56, 0x5f, 0x7c, 0x8a, 0x7c, 0x63, 0x5c, 0x65, 0x71, + 0x84, 0x9f, 0xb0, 0xa8, 0x98, 0x8d, 0x88, 0x85, 0x8c, 0x97, 0x9b, + 0x97, 0x93, 0x93, 0x8b, 0x82, 0x82, 0x86, 0x84, 0x7d, 0x77, 0x74, + 0x74, 0x6b, 0x62, 0x59, 0x59, 0x55, 0x5f, 0x7e, 0x88, 0x7a, 0x65, + 0x67, 0x6f, 0x77, 0x86, 0x9f, 0xac, 0xa2, 0x92, 0x8a, 0x8a, 0x88, + 0x8b, 0x93, 0x98, 0x97, 0x92, 0x90, 0x8b, 0x85, 0x83, 0x83, 0x84, + 0x7f, 0x78, 0x72, 0x72, 0x6e, 0x62, 0x57, 0x52, 0x55, 0x66, 0x80, + 0x8a, 0x7b, 0x67, 0x64, 0x6b, 0x7a, 0x8d, 0xa0, 0xaa, 0xa0, 0x90, + 0x86, 0x85, 0x87, 0x8e, 0x96, 0x99, 0x93, 0x8d, 0x8b, 0x88, 0x87, + 0x85, 0x88, 0x89, 0x84, 0x78, 0x72, 0x72, 0x71, 0x70, 0x69, 0x61, + 0x56, 0x4f, 0x5b, 0x7c, 0x8c, 0x81, 0x6e, 0x68, 0x71, 0x78, 0x84, + 0x96, 0xa4, 0xa1, 0x94, 0x89, 0x88, 0x8a, 0x8b, 0x90, 0x95, 0x95, + 0x8f, 0x8a, 0x89, 0x87, 0x87, 0x88, 0x89, 0x85, 0x7b, 0x73, 0x71, + 0x73, 0x73, 0x71, 0x65, 0x5b, 0x4e, 0x50, 0x6e, 0x8b, 0x8d, 0x77, + 0x68, 0x6b, 0x72, 0x7b, 0x8d, 0x9e, 0xa4, 0x9b, 0x8f, 0x8a, 0x89, + 0x88, 0x89, 0x91, 0x97, 0x95, 0x8e, 0x86, 0x85, 0x88, 0x87, 0x86, + 0x86, 0x82, 0x7a, 0x73, 0x71, 0x74, 0x74, 0x71, 0x6c, 0x67, 0x58, + 0x47, 0x55, 0x84, 0x9c, 0x89, 0x6c, 0x6a, 0x74, 0x74, 0x7e, 0x95, + 0xa9, 0xa5, 0x93, 0x89, 0x89, 0x89, 0x86, 0x8a, 0x94, 0x98, 0x91, + 0x88, 0x82, 0x82, 0x84, 0x85, 0x86, 0x84, 0x7d, 0x76, 0x73, 0x71, + 0x73, 0x74, 0x75, 0x70, 0x6b, 0x5e, 0x56, 0x49, 0x6e, 0xa5, 0xa1, + 0x7f, 0x5e, 0x6e, 0x7c, 0x7d, 0x89, 0xa2, 0xb0, 0x9f, 0x86, 0x80, + 0x86, 0x88, 0x88, 0x8c, 0x98, 0x95, 0x87, 0x7e, 0x7e, 0x83, 0x81, + 0x7f, 0x82, 0x80, 0x76, 0x6d, 0x6f, 0x75, 0x76, 0x70, 0x6f, 0x6f, + 0x6b, 0x62, 0x63, 0x70, 0x85, 0x90, 0x86, 0x7a, 0x78, 0x7e, 0x83, + 0x89, 0x98, 0xa5, 0xa2, 0x94, 0x89, 0x8a, 0x8c, 0x8a, 0x8d, 0x94, + 0x94, 0x8a, 0x81, 0x82, 0x81, 0x7f, 0x7a, 0x78, 0x75, 0x72, 0x6f, + 0x6d, 0x6b, 0x68, 0x62, 0x5a, 0x53, 0x58, 0x8b, 0xa4, 0x8b, 0x66, + 0x5d, 0x77, 0x83, 0x8b, 0x9b, 0xab, 0xa6, 0x90, 0x81, 0x84, 0x8c, + 0x8f, 0x8f, 0x92, 0x92, 0x8d, 0x84, 0x80, 0x81, 0x85, 0x86, 0x82, + 0x7e, 0x79, 0x75, 0x75, 0x76, 0x77, 0x76, 0x75, 0x74, 0x6e, 0x6f, + 0x6d, 0x6f, 0x78, 0x7d, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x82, 0x86, + 0x8a, 0x8b, 0x8a, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x88, 0x84, + 0x80, 0x7e, 0x80, 0x80, 0x7d, 0x79, 0x77, 0x74, 0x74, 0x74, 0x74, + 0x71, 0x70, 0x71, 0x74, 0x75, 0x76, 0x78, 0x7a, 0x7f, 0x82, 0x86, + 0x89, 0x89, 0x88, 0x89, 0x8d, 0x8f, 0x91, 0x91, 0x90, 0x8f, 0x8b, + 0x88, 0x87, 0x86, 0x86, 0x84, 0x81, 0x7f, 0x7d, 0x78, 0x74, 0x74, + 0x75, 0x75, 0x70, 0x6d, 0x6b, 0x6a, 0x6b, 0x6e, 0x6f, 0x7f, 0x90, + 0x8a, 0x7a, 0x6e, 0x79, 0x85, 0x8c, 0x92, 0x97, 0x98, 0x8e, 0x84, + 0x81, 0x85, 0x8a, 0x8b, 0x8b, 0x8c, 0x8a, 0x85, 0x7e, 0x7e, 0x82, + 0x84, 0x82, 0x80, 0x7e, 0x7c, 0x78, 0x75, 0x78, 0x7b, 0x7b, 0x78, + 0x76, 0x75, 0x74, 0x75, 0x77, 0x7b, 0x7e, 0x7e, 0x7f, 0x80, 0x80, + 0x80, 0x82, 0x84, 0x84, 0x84, 0x85, 0x86, 0x85, 0x83, 0x82, 0x82, + 0x82, 0x81, 0x81, 0x80, 0x7e, 0x7d, 0x7b, 0x7a, 0x7a, 0x7a, 0x7b, + 0x7b, 0x7a, 0x79, 0x78, 0x7a, 0x7d, 0x7e, 0x7e, 0x7d, 0x81, 0x82, + 0x81, 0x82, 0x83, 0x85, 0x84, 0x84, 0x85, 0x86, 0x86, 0x85, 0x84, + 0x84, 0x84, 0x84, 0x81, 0x80, 0x81, 0x80, 0x7e, 0x7d, 0x7d, 0x7d, + 0x7c, 0x7b, 0x7a, 0x7a, 0x7a, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7d, + 0x7e, 0x7e, 0x7e, 0x7f, 0x81, 0x82, 0x82, 0x83, 0x84, 0x83, 0x83, + 0x83, 0x84, 0x85, 0x84, 0x83, 0x83, 0x82, 0x81, 0x80, 0x80, 0x80, + 0x7f, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7c, + 0x7c, 0x7d, 0x7e, 0x7e, 0x7d, 0x7e, 0x80, 0x81, 0x80, 0x81, 0x82, + 0x83, 0x82, 0x81, 0x82, 0x83, 0x83, 0x82, 0x81, 0x81, 0x81, 0x80, + 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x81, + 0x81, 0x82, 0x82, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, + 0x81, 0x81, 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7d, 0x7d, + 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x81, 0x82, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, + }, + { // 8 + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x81, 0x81, 0x80, 0x7f, 0x7f, + 0x7e, 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x80, 0x81, 0x7f, 0x7e, 0x7f, 0x80, + 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7e, 0x7e, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, + 0x7e, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x7e, 0x80, 0x81, + 0x80, 0x7e, 0x7f, 0x81, 0x80, 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x7f, + 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x7e, 0x7f, 0x81, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x81, 0x80, 0x7d, 0x7f, 0x82, 0x81, 0x7d, 0x7e, 0x82, + 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x80, 0x7f, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7d, 0x7f, 0x80, 0x81, 0x82, 0x82, + 0x7f, 0x7d, 0x7d, 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x82, 0x7f, 0x7d, + 0x7f, 0x81, 0x80, 0x7e, 0x7f, 0x81, 0x7d, 0x7d, 0x80, 0x84, 0x80, + 0x7b, 0x7c, 0x7f, 0x83, 0x80, 0x7e, 0x7f, 0x81, 0x81, 0x7e, 0x82, + 0x83, 0x81, 0x7c, 0x79, 0x81, 0x83, 0x86, 0x81, 0x7d, 0x7c, 0x7b, + 0x83, 0x81, 0x80, 0x7e, 0x7e, 0x81, 0x7e, 0x7f, 0x84, 0x86, 0x7e, + 0x76, 0x79, 0x82, 0x8d, 0x84, 0x7b, 0x7d, 0x80, 0x85, 0x7c, 0x7c, + 0x85, 0x80, 0x75, 0x77, 0x82, 0x8d, 0x88, 0x7a, 0x74, 0x7b, 0x83, + 0x78, 0x7f, 0x87, 0x82, 0x7d, 0x7a, 0x84, 0x81, 0x7d, 0x82, 0x81, + 0x7e, 0x78, 0x7d, 0x87, 0x89, 0x80, 0x7b, 0x80, 0x84, 0x7c, 0x77, + 0x82, 0x87, 0x86, 0x7e, 0x7d, 0x81, 0x80, 0x7f, 0x7f, 0x82, 0x80, + 0x81, 0x7e, 0x7f, 0x7e, 0x78, 0x7d, 0x85, 0x8d, 0x80, 0x75, 0x79, + 0x80, 0x7e, 0x80, 0x8e, 0x8e, 0x7c, 0x6f, 0x75, 0x80, 0x8c, 0x8f, + 0x84, 0x7a, 0x6f, 0x73, 0x7c, 0x86, 0x85, 0x80, 0x83, 0x7d, 0x74, + 0x71, 0x86, 0x8b, 0x81, 0x7c, 0x7e, 0x7e, 0x7d, 0x81, 0x82, 0x89, + 0x87, 0x82, 0x7a, 0x76, 0x81, 0x86, 0x8a, 0x83, 0x7b, 0x87, 0x82, + 0x7c, 0x78, 0x80, 0x87, 0x82, 0x7d, 0x76, 0x82, 0x84, 0x7b, 0x73, + 0x78, 0x82, 0x78, 0x7b, 0x88, 0x7e, 0x73, 0x7b, 0x85, 0x85, 0x78, + 0x74, 0x87, 0x8b, 0x7f, 0x81, 0x8b, 0x8d, 0x7e, 0x79, 0x88, 0x8d, + 0x85, 0x7d, 0x7a, 0x83, 0x84, 0x7d, 0x84, 0x88, 0x81, 0x68, 0x67, + 0x71, 0x75, 0x85, 0x86, 0x88, 0x78, 0x67, 0x6f, 0x72, 0x7d, 0x7f, + 0x80, 0x8d, 0x84, 0x80, 0x81, 0x87, 0x8f, 0x88, 0x8d, 0x8e, 0x89, + 0x86, 0x86, 0x8b, 0x88, 0x86, 0x84, 0x84, 0x7c, 0x73, 0x76, 0x76, + 0x77, 0x72, 0x71, 0x71, 0x6d, 0x6d, 0x6e, 0x6d, 0x72, 0x7b, 0x7b, + 0x78, 0x72, 0x7a, 0x8a, 0x91, 0x99, 0x9d, 0x9a, 0x91, 0x87, 0x86, + 0x91, 0x9a, 0x9b, 0x9a, 0x90, 0x82, 0x75, 0x6e, 0x73, 0x78, 0x78, + 0x79, 0x78, 0x72, 0x64, 0x5b, 0x61, 0x63, 0x67, 0x61, 0x64, 0x7e, + 0x85, 0x7c, 0x79, 0x82, 0x8a, 0x86, 0x8c, 0x9e, 0xa4, 0x9e, 0x99, + 0x9d, 0x9d, 0x95, 0x96, 0x95, 0x90, 0x87, 0x7f, 0x7c, 0x77, 0x76, + 0x7a, 0x7d, 0x79, 0x73, 0x69, 0x5b, 0x51, 0x4a, 0x54, 0x5b, 0x55, + 0x7c, 0x9f, 0x8f, 0x7a, 0x67, 0x71, 0x77, 0x7e, 0xa3, 0xb8, 0xbd, + 0xac, 0x9d, 0x96, 0x89, 0x8c, 0x92, 0x9b, 0x97, 0x8e, 0x88, 0x79, + 0x73, 0x75, 0x7e, 0x81, 0x78, 0x6f, 0x64, 0x54, 0x4a, 0x49, 0x54, + 0x54, 0x59, 0x86, 0x9e, 0x8e, 0x73, 0x6b, 0x72, 0x6e, 0x83, 0xab, + 0xc0, 0xc0, 0xac, 0xa1, 0x91, 0x81, 0x86, 0x94, 0x9f, 0x98, 0x90, + 0x8c, 0x7c, 0x71, 0x74, 0x81, 0x83, 0x76, 0x6e, 0x63, 0x55, 0x40, + 0x3f, 0x53, 0x53, 0x58, 0x86, 0xa3, 0x8d, 0x74, 0x6f, 0x71, 0x6f, + 0x80, 0xac, 0xc4, 0xbe, 0xb1, 0xa8, 0x9a, 0x83, 0x7e, 0x8f, 0x98, + 0x96, 0x96, 0x94, 0x85, 0x74, 0x72, 0x7a, 0x7d, 0x76, 0x70, 0x6d, + 0x5f, 0x48, 0x3f, 0x4b, 0x4f, 0x4a, 0x6f, 0x94, 0x95, 0x81, 0x74, + 0x7c, 0x77, 0x79, 0x94, 0xb1, 0xba, 0xb3, 0xb0, 0xa9, 0x94, 0x85, + 0x88, 0x8f, 0x8c, 0x8d, 0x92, 0x8e, 0x7d, 0x75, 0x78, 0x7a, 0x79, + 0x73, 0x71, 0x66, 0x55, 0x47, 0x46, 0x4e, 0x48, 0x55, 0x7e, 0x8f, + 0x8a, 0x7d, 0x81, 0x82, 0x78, 0x85, 0x9e, 0xac, 0xaa, 0xa7, 0xad, + 0xa5, 0x95, 0x8a, 0x8d, 0x8d, 0x86, 0x86, 0x8a, 0x87, 0x7b, 0x79, + 0x7d, 0x7e, 0x75, 0x71, 0x73, 0x6a, 0x5d, 0x58, 0x5e, 0x5e, 0x5a, + 0x61, 0x71, 0x79, 0x76, 0x76, 0x79, 0x7d, 0x80, 0x85, 0x8e, 0x95, + 0x98, 0x96, 0x97, 0x96, 0x93, 0x90, 0x8f, 0x8e, 0x8a, 0x88, 0x86, + 0x86, 0x86, 0x86, 0x88, 0x89, 0x87, 0x84, 0x83, 0x81, 0x7e, 0x7c, + 0x7a, 0x79, 0x78, 0x77, 0x77, 0x76, 0x75, 0x75, 0x75, 0x76, 0x76, + 0x76, 0x77, 0x77, 0x78, 0x7a, 0x7d, 0x7e, 0x7f, 0x82, 0x83, 0x84, + 0x85, 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x85, + 0x84, 0x82, 0x80, 0x7f, 0x7d, 0x7b, 0x7a, 0x7a, 0x7a, 0x79, 0x7a, + 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, + 0x7f, 0x80, 0x81, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x80, 0x7f, 0x7e, 0x7e, + 0x7e, 0x7d, 0x7d, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, + 0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7e, 0x80, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x82, 0x84, 0x87, 0x7f, 0x75, + 0x87, 0x89, 0x7c, 0x7e, 0x7e, 0x7c, 0x7d, 0x7e, 0x7f, 0x7d, 0x7d, + 0x7e, 0x7c, 0x7c, 0x81, 0x82, 0x7f, 0x80, 0x81, 0x82, 0x82, 0x81, + 0x80, 0x7e, 0x7f, 0x81, 0x7e, 0x7d, 0x7d, 0x7e, 0x7e, 0x7d, 0x81, + 0x7f, 0x7e, 0x81, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x7f, 0x82, 0x80, + 0x7e, 0x7f, 0x83, 0x7f, 0x81, 0x7f, 0x7f, 0x7e, 0x7f, 0x81, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7d, 0x83, 0x80, 0x82, 0x80, 0x81, + 0x80, 0x7f, 0x7f, 0x80, 0x82, 0x7f, 0x81, 0x7e, 0x80, 0x7e, 0x80, + 0x7e, 0x80, 0x80, 0x81, 0x7e, 0x81, 0x80, 0x80, 0x81, 0x7d, 0x7f, + 0x7f, 0x80, 0x80, 0x82, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x81, 0x81, + 0x7f, 0x7d, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x81, 0x80, + 0x81, 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x7e, 0x7f, 0x7e, 0x7e, 0x81, + 0x7d, 0x80, 0x7f, 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x7d, 0x81, 0x7e, + 0x81, 0x81, 0x7e, 0x81, 0x7e, 0x81, 0x7f, 0x83, 0x7f, 0x81, 0x80, + 0x7f, 0x81, 0x7e, 0x80, 0x80, 0x80, 0x82, 0x7d, 0x7e, 0x80, 0x7d, + 0x81, 0x7f, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x81, 0x80, 0x80, + 0x7f, 0x7f, 0x81, 0x7e, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x7d, 0x80, + 0x7e, 0x80, 0x7f, 0x80, 0x82, 0x80, 0x81, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7d, 0x82, 0x7f, 0x7f, 0x82, 0x7d, + 0x7e, 0x81, 0x81, 0x80, 0x7f, 0x7e, 0x81, 0x7e, 0x80, 0x80, 0x7f, + 0x82, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x7f, 0x81, 0x7b, 0x80, 0x82, + 0x85, 0x8d, 0x82, 0x7a, 0x78, 0x7c, 0x7d, 0x84, 0x80, 0x7e, 0x7e, + 0x79, 0x7a, 0x7d, 0x7f, 0x7f, 0x7e, 0x83, 0x80, 0x80, 0x84, 0x82, + 0x80, 0x7f, 0x85, 0x7e, 0x80, 0x7d, 0x7c, 0x7d, 0x7e, 0x80, 0x7c, + 0x80, 0x82, 0x80, 0x7f, 0x80, 0x7e, 0x7d, 0x84, 0x80, 0x80, 0x84, + 0x7f, 0x7f, 0x7e, 0x83, 0x81, 0x81, 0x81, 0x7f, 0x7f, 0x7c, 0x81, + 0x80, 0x7e, 0x83, 0x7f, 0x7f, 0x81, 0x7e, 0x82, 0x7f, 0x80, 0x7f, + 0x81, 0x81, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x81, 0x7d, + 0x80, 0x80, 0x7b, 0x7e, 0x83, 0x80, 0x7d, 0x80, 0x80, 0x7e, 0x7e, + 0x80, 0x81, 0x81, 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x81, 0x7e, 0x7d, + 0x82, 0x82, 0x7e, 0x81, 0x81, 0x7d, 0x81, 0x83, 0x7d, 0x81, 0x82, + 0x7b, 0x7e, 0x82, 0x81, 0x80, 0x80, 0x81, 0x7e, 0x7f, 0x83, 0x7b, + 0x82, 0x7e, 0x7e, 0x81, 0x7e, 0x81, 0x7f, 0x81, 0x7d, 0x7d, 0x7f, + 0x7e, 0x80, 0x7f, 0x82, 0x7c, 0x7f, 0x83, 0x7d, 0x7f, 0x7c, 0x7f, + 0x7d, 0x81, 0x7e, 0x80, 0x80, 0x7f, 0x7d, 0x81, 0x7f, 0x81, 0x81, + 0x7d, 0x86, 0x7a, 0x7f, 0x82, 0x83, 0x81, 0x7f, 0x7d, 0x7e, 0x7d, + 0x83, 0x80, 0x7f, 0x80, 0x7d, 0x82, 0x7f, 0x82, 0x7c, 0x82, 0x82, + 0x81, 0x83, 0x82, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x82, 0x7e, + 0x82, 0x7e, 0x83, 0x80, 0x7f, 0x84, 0x7e, 0x83, 0x83, 0x7d, 0x83, + 0x81, 0x82, 0x7d, 0x81, 0x84, 0x80, 0x82, 0x7a, 0x85, 0x7a, 0x81, + 0x81, 0x7c, 0x82, 0x7b, 0x83, 0x7f, 0x84, 0x81, 0x7e, 0x7d, 0x81, + 0x7f, 0x80, 0x83, 0x78, 0x82, 0x84, 0x7e, 0x82, 0x7f, 0x7c, 0x7f, + 0x83, 0x7b, 0x81, 0x87, 0x7a, 0x80, 0x7e, 0x80, 0x7e, 0x80, 0x81, + 0x7f, 0x7f, 0x83, 0x80, 0x7e, 0x84, 0x79, 0x80, 0x82, 0x7d, 0x85, + 0x85, 0x7d, 0x7e, 0x82, 0x80, 0x7c, 0x83, 0x7c, 0x7a, 0x82, 0x7e, + 0x7e, 0x7f, 0x82, 0x7d, 0x7b, 0x83, 0x7c, 0x81, 0x7b, 0x80, 0x84, + 0x7f, 0x83, 0x7e, 0x83, 0x7c, 0x7f, 0x82, 0x7e, 0x80, 0x81, 0x7a, + 0x83, 0x7e, 0x7f, 0x81, 0x7e, 0x81, 0x7a, 0x81, 0x7b, 0x7c, 0x81, + 0x81, 0x82, 0x7d, 0x80, 0x7f, 0x7f, 0x85, 0x7e, 0x82, 0x7f, 0x81, + 0x7f, 0x82, 0x80, 0x81, 0x80, 0x7e, 0x80, 0x7d, 0x80, 0x7b, 0x84, + 0x7c, 0x80, 0x7f, 0x7e, 0x7e, 0x7d, 0x7e, 0x80, 0x7e, 0x7f, 0x7f, + 0x7f, 0x85, 0x81, 0x82, 0x7d, 0x85, 0x7a, 0x85, 0x83, 0x7e, 0x82, + 0x7c, 0x81, 0x7b, 0x83, 0x7e, 0x7d, 0x83, 0x79, 0x7f, 0x83, 0x7d, + 0x7f, 0x82, 0x7d, 0x80, 0x84, 0x79, 0x82, 0x7e, 0x7d, 0x83, 0x80, + 0x80, 0x7f, 0x82, 0x80, 0x80, 0x80, 0x82, 0x7e, 0x7b, 0x84, 0x81, + 0x7c, 0x80, 0x7f, 0x7c, 0x7e, 0x81, 0x7a, 0x82, 0x7d, 0x7c, 0x84, + 0x7d, 0x7f, 0x84, 0x81, 0x82, 0x87, 0x7f, 0x7e, 0x87, 0x7f, 0x7c, + 0x8b, 0x7e, 0x7f, 0x84, 0x7a, 0x81, 0x7e, 0x7d, 0x80, 0x80, 0x78, + 0x7c, 0x82, 0x75, 0x82, 0x7b, 0x7b, 0x81, 0x7f, 0x81, 0x7f, 0x87, + 0x7c, 0x88, 0x82, 0x82, 0x8a, 0x81, 0x86, 0x83, 0x81, 0x7e, 0x86, + 0x7b, 0x7c, 0x81, 0x76, 0x7b, 0x7a, 0x76, 0x77, 0x78, 0x74, 0x76, + 0x7b, 0x79, 0x7d, 0x7d, 0x84, 0x82, 0x82, 0x8c, 0x87, 0x8a, 0x92, + 0x8d, 0x87, 0x90, 0x89, 0x83, 0x8e, 0x81, 0x7b, 0x86, 0x74, 0x78, + 0x77, 0x6c, 0x6c, 0x69, 0x6e, 0x61, 0x72, 0x6c, 0x6b, 0x7b, 0x74, + 0x83, 0x8a, 0x91, 0x97, 0xa0, 0x9f, 0x9f, 0xa6, 0x99, 0x9a, 0x9d, + 0x8b, 0x88, 0x84, 0x72, 0x71, 0x6b, 0x60, 0x60, 0x58, 0x55, 0x54, + 0x5b, 0x68, 0x68, 0x79, 0x7d, 0x82, 0x88, 0x92, 0x9c, 0xa0, 0xaa, + 0xa8, 0xac, 0xa6, 0xa3, 0x9d, 0x95, 0x89, 0x89, 0x79, 0x74, 0x74, + 0x64, 0x62, 0x5f, 0x5b, 0x52, 0x5e, 0x54, 0x69, 0x6d, 0x68, 0x80, + 0x78, 0x7f, 0x8b, 0x91, 0x97, 0xa1, 0xa7, 0xac, 0xa6, 0xa8, 0x9e, + 0x95, 0x8e, 0x84, 0x7f, 0x75, 0x73, 0x69, 0x67, 0x60, 0x5e, 0x59, + 0x5b, 0x55, 0x5b, 0x75, 0x62, 0x75, 0x7e, 0x74, 0x89, 0x87, 0x93, + 0x9e, 0xa8, 0xa3, 0xb3, 0xae, 0xa0, 0xa7, 0x92, 0x8b, 0x87, 0x7b, + 0x74, 0x77, 0x65, 0x67, 0x61, 0x58, 0x5b, 0x59, 0x50, 0x64, 0x6c, + 0x60, 0x80, 0x75, 0x76, 0x8b, 0x87, 0x97, 0xa4, 0xa5, 0xab, 0xb5, + 0xac, 0xa5, 0xaa, 0x90, 0x88, 0x84, 0x72, 0x73, 0x72, 0x65, 0x68, + 0x61, 0x5a, 0x59, 0x58, 0x55, 0x68, 0x6e, 0x64, 0x81, 0x70, 0x77, + 0x89, 0x85, 0x96, 0xa2, 0xa6, 0xa9, 0xb5, 0xad, 0xaa, 0xa7, 0x94, + 0x8a, 0x85, 0x73, 0x73, 0x72, 0x65, 0x68, 0x5f, 0x5c, 0x58, 0x51, + 0x57, 0x70, 0x68, 0x6d, 0x84, 0x6e, 0x7e, 0x87, 0x87, 0x98, 0xa1, + 0xa3, 0xaf, 0xb5, 0xa9, 0xaf, 0xa3, 0x91, 0x8f, 0x7f, 0x72, 0x74, + 0x6a, 0x67, 0x6a, 0x5e, 0x5e, 0x58, 0x4e, 0x65, 0x6e, 0x64, 0x7f, + 0x78, 0x74, 0x8a, 0x83, 0x8f, 0x9e, 0x9e, 0xa4, 0xaf, 0xa7, 0xa9, + 0xa6, 0x95, 0x92, 0x85, 0x78, 0x76, 0x6e, 0x67, 0x6b, 0x64, 0x61, + 0x62, 0x50, 0x57, 0x72, 0x62, 0x71, 0x82, 0x6e, 0x80, 0x84, 0x82, + 0x98, 0x9b, 0x9d, 0xac, 0xa7, 0xa7, 0xac, 0x9e, 0x97, 0x8f, 0x7e, + 0x79, 0x75, 0x69, 0x6b, 0x66, 0x63, 0x63, 0x5e, 0x4d, 0x62, 0x75, + 0x5c, 0x84, 0x7a, 0x70, 0x8c, 0x7c, 0x8c, 0x99, 0x97, 0xa1, 0xad, + 0xa0, 0xa7, 0xa8, 0x94, 0x96, 0x8a, 0x79, 0x7e, 0x6f, 0x69, 0x6f, + 0x60, 0x64, 0x64, 0x5d, 0x4a, 0x79, 0x67, 0x5f, 0x95, 0x63, 0x82, + 0x89, 0x77, 0x9a, 0x98, 0x97, 0xaa, 0xa9, 0x9d, 0xb1, 0x9c, 0x94, + 0x95, 0x7e, 0x7a, 0x7c, 0x64, 0x6f, 0x66, 0x5e, 0x66, 0x5f, 0x52, + 0x55, 0x84, 0x4f, 0x81, 0x85, 0x5f, 0x9a, 0x77, 0x87, 0xa0, 0x91, + 0xa1, 0xad, 0x9d, 0xa7, 0xaa, 0x93, 0x99, 0x8b, 0x79, 0x7f, 0x73, + 0x66, 0x75, 0x61, 0x64, 0x6c, 0x5b, 0x5c, 0x5b, 0x80, 0x59, 0x83, + 0x7f, 0x68, 0x97, 0x71, 0x90, 0x96, 0x91, 0xa2, 0xa4, 0x9c, 0xa5, + 0xa2, 0x92, 0x96, 0x85, 0x7c, 0x7c, 0x6f, 0x6a, 0x70, 0x5f, 0x65, + 0x65, 0x58, 0x58, 0x5e, 0x74, 0x5d, 0x82, 0x78, 0x72, 0x90, 0x78, + 0x96, 0x95, 0x9a, 0xa5, 0xa4, 0xa1, 0xa7, 0x9e, 0x96, 0x92, 0x80, + 0x81, 0x75, 0x6f, 0x6d, 0x6b, 0x69, 0x66, 0x6a, 0x5f, 0x68, 0x61, + 0x6f, 0x71, 0x6f, 0x7e, 0x75, 0x82, 0x81, 0x89, 0x90, 0x99, 0x99, + 0xa0, 0x9e, 0x9d, 0x9d, 0x94, 0x92, 0x86, 0x82, 0x78, 0x75, 0x70, + 0x70, 0x6d, 0x6d, 0x6d, 0x6b, 0x6e, 0x6d, 0x6f, 0x72, 0x73, 0x75, + 0x78, 0x7c, 0x7d, 0x83, 0x86, 0x8b, 0x91, 0x92, 0x98, 0x95, 0x98, + 0x95, 0x91, 0x90, 0x88, 0x83, 0x80, 0x79, 0x78, 0x78, 0x73, 0x73, + 0x73, 0x6c, 0x71, 0x6f, 0x6c, 0x73, 0x70, 0x73, 0x77, 0x79, 0x7b, + 0x83, 0x84, 0x89, 0x90, 0x8f, 0x94, 0x95, 0x90, 0x94, 0x90, 0x88, + 0x8b, 0x80, 0x81, 0x7e, 0x79, 0x7a, 0x78, 0x77, 0x77, 0x77, 0x76, + 0x79, 0x78, 0x77, 0x7a, 0x78, 0x78, 0x7a, 0x78, 0x7d, 0x7f, 0x83, + 0x88, 0x8d, 0x8c, 0x93, 0x91, 0x91, 0x91, 0x8c, 0x8a, 0x84, 0x7e, + 0x74, 0x70, 0x60, 0x5d, 0x4f, 0x66, 0x53, 0x60, 0x73, 0x5d, 0x85, + 0x7b, 0x8f, 0xa1, 0x9f, 0xaf, 0xb3, 0xac, 0xac, 0xa7, 0x94, 0x91, + 0x80, 0x72, 0x6f, 0x60, 0x5f, 0x5f, 0x5f, 0x65, 0x71, 0x76, 0x81, + 0x8e, 0x8e, 0x9b, 0x99, 0x9b, 0x99, 0x94, 0x8d, 0x89, 0x7f, 0x78, + 0x75, 0x6b, 0x6d, 0x69, 0x69, 0x6c, 0x6e, 0x72, 0x7b, 0x7b, 0x85, + 0x87, 0x88, 0x8f, 0x8b, 0x8f, 0x8c, 0x89, 0x86, 0x84, 0x7e, 0x7d, + 0x7a, 0x76, 0x77, 0x75, 0x76, 0x77, 0x77, 0x7a, 0x7c, 0x7d, 0x7f, + 0x81, 0x81, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x81, 0x7f, + 0x7f, 0x7e, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, + 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x80, + }, + { // 9 + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7e, 0x81, 0x7e, 0x81, 0x7e, 0x81, 0x7e, 0x82, 0x7d, + 0x87, 0x7f, 0x7e, 0x82, 0x79, 0x83, 0x7a, 0x83, 0x7d, 0x83, 0x74, + 0x91, 0x7d, 0x7f, 0x84, 0x76, 0x87, 0x77, 0x87, 0x7f, 0x83, 0x7c, + 0x81, 0x7d, 0x7f, 0x7d, 0x7f, 0x7c, 0x7c, 0x80, 0x7e, 0x81, 0x7f, + 0x81, 0x80, 0x82, 0x7f, 0x82, 0x7c, 0x81, 0x7e, 0x80, 0x7d, 0x80, + 0x7e, 0x7f, 0x7f, 0x7f, 0x81, 0x7d, 0x82, 0x7d, 0x82, 0x7f, 0x81, + 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7e, 0x7f, 0x7d, 0x81, + 0x7d, 0x81, 0x80, 0x7f, 0x80, 0x7e, 0x82, 0x82, 0x85, 0x81, 0x81, + 0x81, 0x81, 0x80, 0x7d, 0x81, 0x80, 0x7c, 0x7f, 0x7e, 0x7e, 0x81, + 0x7e, 0x81, 0x7e, 0x80, 0x80, 0x7f, 0x81, 0x7f, 0x82, 0x80, 0x80, + 0x80, 0x7e, 0x7f, 0x7e, 0x7d, 0x7f, 0x7d, 0x7f, 0x7e, 0x7f, 0x80, + 0x80, 0x80, 0x7f, 0x81, 0x7f, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x7f, + 0x7e, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x7e, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x80, 0x7e, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x81, 0x7e, 0x81, 0x7f, 0x80, 0x7e, + 0x81, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, + 0x80, 0x7f, 0x81, 0x7e, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x81, + 0x7f, 0x82, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x81, 0x7e, 0x80, 0x7f, + 0x7e, 0x82, 0x7c, 0x83, 0x7c, 0x82, 0x7e, 0x81, 0x80, 0x7f, 0x7f, + 0x80, 0x80, 0x7e, 0x80, 0x7f, 0x81, 0x7c, 0x83, 0x7c, 0x84, 0x7d, + 0x82, 0x7f, 0x7f, 0x82, 0x7f, 0x7f, 0x7e, 0x81, 0x80, 0x81, 0x7c, + 0x84, 0x7b, 0x83, 0x7d, 0x83, 0x7e, 0x81, 0x80, 0x82, 0x81, 0x7e, + 0x84, 0x7c, 0x83, 0x7d, 0x82, 0x7f, 0x83, 0x7a, 0x83, 0x7c, 0x83, + 0x80, 0x80, 0x82, 0x80, 0x81, 0x7c, 0x85, 0x7b, 0x83, 0x7e, 0x7e, + 0x7f, 0x7f, 0x7f, 0x80, 0x7e, 0x82, 0x81, 0x80, 0x7e, 0x83, 0x7c, + 0x82, 0x81, 0x7d, 0x82, 0x7e, 0x81, 0x7f, 0x81, 0x7c, 0x85, 0x79, + 0x84, 0x7b, 0x81, 0x7e, 0x7e, 0x83, 0x7b, 0x82, 0x7b, 0x82, 0x7c, + 0x82, 0x7d, 0x84, 0x7e, 0x81, 0x80, 0x7e, 0x80, 0x7c, 0x83, 0x7c, + 0x85, 0x7b, 0x83, 0x7f, 0x7e, 0x83, 0x7d, 0x82, 0x7e, 0x80, 0x7f, + 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x82, 0x7e, 0x7e, 0x81, 0x7f, + 0x7f, 0x81, 0x7d, 0x81, 0x7c, 0x7e, 0x81, 0x7c, 0x82, 0x7f, 0x82, + 0x7b, 0x80, 0x7f, 0x7d, 0x83, 0x7b, 0x83, 0x7e, 0x80, 0x81, 0x7c, + 0x81, 0x7f, 0x7c, 0x7e, 0x7b, 0x80, 0x7d, 0x80, 0x83, 0x7d, 0x84, + 0x7d, 0x81, 0x81, 0x7e, 0x83, 0x7f, 0x83, 0x7e, 0x7e, 0x81, 0x7a, + 0x82, 0x7d, 0x7f, 0x7f, 0x7e, 0x7c, 0x82, 0x7f, 0x7d, 0x86, 0x7b, + 0x85, 0x7b, 0x82, 0x81, 0x7f, 0x82, 0x7e, 0x7d, 0x80, 0x7b, 0x80, + 0x81, 0x7d, 0x83, 0x7f, 0x81, 0x7f, 0x81, 0x80, 0x83, 0x7e, 0x81, + 0x81, 0x7f, 0x7f, 0x7e, 0x7e, 0x82, 0x7c, 0x7f, 0x7d, 0x7e, 0x7f, + 0x80, 0x7d, 0x80, 0x82, 0x7d, 0x86, 0x7c, 0x81, 0x81, 0x7e, 0x7f, + 0x7f, 0x80, 0x81, 0x7d, 0x81, 0x7c, 0x81, 0x7f, 0x7f, 0x84, 0x7d, + 0x83, 0x82, 0x7d, 0x86, 0x7e, 0x7e, 0x84, 0x78, 0x86, 0x7b, 0x80, + 0x82, 0x7f, 0x7e, 0x82, 0x80, 0x7d, 0x83, 0x7c, 0x83, 0x7f, 0x81, + 0x81, 0x7f, 0x81, 0x7f, 0x7e, 0x81, 0x7b, 0x82, 0x7f, 0x7c, 0x83, + 0x7e, 0x7f, 0x85, 0x79, 0x82, 0x7e, 0x7b, 0x84, 0x7a, 0x84, 0x80, + 0x7e, 0x81, 0x7e, 0x80, 0x80, 0x7e, 0x81, 0x83, 0x80, 0x81, 0x81, + 0x7f, 0x80, 0x81, 0x7f, 0x7b, 0x81, 0x7e, 0x7c, 0x80, 0x7d, 0x7d, + 0x7f, 0x7f, 0x7f, 0x83, 0x7d, 0x81, 0x80, 0x7e, 0x82, 0x81, 0x7c, + 0x85, 0x7d, 0x7f, 0x84, 0x78, 0x85, 0x79, 0x7e, 0x83, 0x7e, 0x7e, + 0x81, 0x80, 0x7f, 0x84, 0x7f, 0x82, 0x7f, 0x7f, 0x81, 0x7a, 0x82, + 0x7e, 0x80, 0x81, 0x7a, 0x87, 0x7b, 0x80, 0x85, 0x79, 0x83, 0x7f, + 0x7b, 0x84, 0x7b, 0x7f, 0x82, 0x7b, 0x83, 0x7d, 0x7d, 0x83, 0x7e, + 0x80, 0x83, 0x79, 0x82, 0x82, 0x7b, 0x87, 0x7e, 0x80, 0x82, 0x7a, + 0x82, 0x7e, 0x7b, 0x83, 0x7a, 0x80, 0x81, 0x7c, 0x84, 0x7f, 0x7f, + 0x82, 0x81, 0x7f, 0x81, 0x7e, 0x81, 0x80, 0x7f, 0x7f, 0x81, 0x7e, + 0x7e, 0x82, 0x7d, 0x7f, 0x80, 0x7e, 0x7f, 0x81, 0x7d, 0x81, 0x80, + 0x7f, 0x83, 0x7e, 0x82, 0x81, 0x7e, 0x83, 0x7d, 0x83, 0x7f, 0x7f, + 0x83, 0x7c, 0x83, 0x7f, 0x81, 0x82, 0x7c, 0x83, 0x7f, 0x7c, 0x83, + 0x7d, 0x80, 0x80, 0x7e, 0x80, 0x7e, 0x7d, 0x81, 0x7c, 0x81, 0x80, + 0x7d, 0x83, 0x7c, 0x83, 0x80, 0x7d, 0x83, 0x7f, 0x7f, 0x83, 0x7f, + 0x81, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7e, + 0x7e, 0x7f, 0x80, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, + 0x80, 0x82, 0x81, 0x81, 0x82, 0x81, 0x83, 0x81, 0x82, 0x81, 0x7e, + 0x80, 0x7c, 0x7c, 0x7e, 0x7a, 0x7c, 0x7c, 0x79, 0x7d, 0x7c, 0x7b, + 0x80, 0x7f, 0x80, 0x86, 0x83, 0x85, 0x89, 0x86, 0x87, 0x88, 0x85, + 0x86, 0x84, 0x81, 0x80, 0x7d, 0x79, 0x78, 0x74, 0x72, 0x71, 0x6f, + 0x6e, 0x71, 0x71, 0x74, 0x7d, 0x80, 0x88, 0x91, 0x90, 0x96, 0x99, + 0x96, 0x99, 0x98, 0x95, 0x95, 0x8d, 0x82, 0x7d, 0x6f, 0x68, 0x62, + 0x5d, 0x55, 0x54, 0x5f, 0x56, 0x67, 0x77, 0x71, 0x8d, 0x91, 0x98, + 0xac, 0xa9, 0xb1, 0xb4, 0xac, 0xa5, 0xa0, 0x94, 0x8a, 0x84, 0x71, + 0x68, 0x5e, 0x4d, 0x4a, 0x43, 0x53, 0x58, 0x59, 0x74, 0x70, 0x7d, + 0x91, 0x8d, 0xa5, 0xaa, 0xae, 0xb7, 0xb0, 0xaa, 0x9f, 0x97, 0x8a, + 0x83, 0x7a, 0x6b, 0x66, 0x55, 0x4a, 0x43, 0x42, 0x58, 0x54, 0x63, + 0x79, 0x71, 0x87, 0x91, 0x92, 0xa9, 0xb0, 0xb1, 0xb9, 0xb4, 0xa6, + 0xa1, 0x95, 0x85, 0x83, 0x77, 0x68, 0x62, 0x52, 0x45, 0x3e, 0x49, + 0x59, 0x56, 0x6d, 0x79, 0x76, 0x8b, 0x94, 0x96, 0xab, 0xb4, 0xb0, + 0xb9, 0xaf, 0xa3, 0x9e, 0x90, 0x84, 0x80, 0x75, 0x67, 0x5f, 0x4e, + 0x42, 0x3e, 0x51, 0x59, 0x5a, 0x79, 0x78, 0x7b, 0x93, 0x93, 0x9d, + 0xb2, 0xb3, 0xb3, 0xb8, 0xab, 0x9f, 0x99, 0x8a, 0x80, 0x7b, 0x6f, + 0x62, 0x58, 0x49, 0x3a, 0x44, 0x5a, 0x53, 0x69, 0x80, 0x75, 0x88, + 0x96, 0x96, 0xa5, 0xb6, 0xb3, 0xb5, 0xb5, 0xa4, 0x9c, 0x92, 0x85, + 0x7c, 0x76, 0x69, 0x5c, 0x53, 0x42, 0x3a, 0x51, 0x5c, 0x58, 0x77, + 0x7f, 0x78, 0x8f, 0x97, 0x98, 0xac, 0xb7, 0xb2, 0xb4, 0xaf, 0x9f, + 0x96, 0x8d, 0x80, 0x79, 0x72, 0x64, 0x56, 0x4c, 0x3b, 0x40, 0x5c, + 0x58, 0x63, 0x83, 0x7b, 0x81, 0x95, 0x99, 0x9f, 0xb2, 0xb7, 0xb1, + 0xb3, 0xa9, 0x99, 0x91, 0x88, 0x7b, 0x74, 0x6d, 0x5e, 0x51, 0x43, + 0x39, 0x4c, 0x5e, 0x5b, 0x75, 0x82, 0x7d, 0x8b, 0x98, 0x9d, 0xa5, + 0xb9, 0xb5, 0xb0, 0xaf, 0x9f, 0x94, 0x8b, 0x83, 0x77, 0x6f, 0x67, + 0x57, 0x4a, 0x3e, 0x3f, 0x59, 0x5f, 0x64, 0x81, 0x80, 0x80, 0x92, + 0x9b, 0x9e, 0xae, 0xb8, 0xb1, 0xaf, 0xa8, 0x9b, 0x8e, 0x88, 0x7f, + 0x71, 0x6d, 0x61, 0x50, 0x43, 0x3a, 0x4a, 0x5d, 0x5d, 0x73, 0x82, + 0x7e, 0x89, 0x96, 0x9e, 0xa3, 0xb8, 0xb8, 0xb0, 0xaf, 0xa3, 0x96, + 0x89, 0x85, 0x78, 0x6f, 0x6a, 0x5a, 0x4a, 0x3e, 0x3b, 0x55, 0x5f, + 0x61, 0x7f, 0x82, 0x80, 0x8e, 0x9a, 0x9d, 0xa9, 0xbb, 0xb3, 0xaf, + 0xaa, 0x9f, 0x90, 0x86, 0x83, 0x73, 0x6d, 0x65, 0x53, 0x45, 0x3b, + 0x44, 0x5d, 0x5f, 0x6c, 0x83, 0x82, 0x86, 0x91, 0x9f, 0x9e, 0xaf, + 0xbc, 0xaf, 0xad, 0xa5, 0x9b, 0x89, 0x84, 0x7f, 0x6f, 0x6b, 0x61, + 0x4f, 0x41, 0x3b, 0x4e, 0x60, 0x60, 0x76, 0x85, 0x82, 0x89, 0x96, + 0x9e, 0xa2, 0xb4, 0xb7, 0xae, 0xaa, 0xa2, 0x95, 0x86, 0x84, 0x79, + 0x6e, 0x68, 0x5c, 0x4c, 0x3e, 0x3f, 0x55, 0x61, 0x63, 0x7e, 0x86, + 0x83, 0x8d, 0x9a, 0x9f, 0xa4, 0xb7, 0xb3, 0xab, 0xa7, 0xa0, 0x90, + 0x82, 0x82, 0x74, 0x6c, 0x66, 0x59, 0x48, 0x3d, 0x44, 0x5d, 0x62, + 0x6a, 0x85, 0x84, 0x85, 0x8f, 0x9c, 0x9e, 0xa8, 0xb9, 0xaf, 0xaa, + 0xa5, 0x9c, 0x8b, 0x82, 0x80, 0x71, 0x6a, 0x65, 0x55, 0x45, 0x3c, + 0x4b, 0x61, 0x61, 0x72, 0x87, 0x83, 0x86, 0x92, 0x9f, 0x9c, 0xac, + 0xb9, 0xac, 0xa8, 0xa2, 0x9a, 0x86, 0x82, 0x7e, 0x6e, 0x69, 0x63, + 0x53, 0x41, 0x3d, 0x4d, 0x61, 0x63, 0x75, 0x88, 0x83, 0x86, 0x94, + 0x9e, 0x9e, 0xae, 0xba, 0xac, 0xa7, 0xa4, 0x99, 0x84, 0x82, 0x7f, + 0x6e, 0x68, 0x64, 0x51, 0x3f, 0x3f, 0x4f, 0x63, 0x64, 0x78, 0x88, + 0x83, 0x89, 0x94, 0x9e, 0x9f, 0xaf, 0xb8, 0xab, 0xa7, 0xa1, 0x97, + 0x85, 0x81, 0x7e, 0x6f, 0x68, 0x63, 0x52, 0x42, 0x40, 0x50, 0x64, + 0x66, 0x76, 0x89, 0x85, 0x87, 0x93, 0x9d, 0x9d, 0xaa, 0xb8, 0xaa, + 0xa4, 0xa2, 0x98, 0x85, 0x81, 0x7f, 0x70, 0x67, 0x64, 0x57, 0x45, + 0x42, 0x4c, 0x63, 0x67, 0x71, 0x89, 0x86, 0x85, 0x91, 0x9c, 0x9f, + 0xa5, 0xb5, 0xae, 0xa3, 0xa1, 0x9b, 0x89, 0x81, 0x7f, 0x73, 0x68, + 0x65, 0x5b, 0x49, 0x43, 0x49, 0x63, 0x69, 0x6c, 0x88, 0x89, 0x86, + 0x8f, 0x9c, 0x9e, 0xa0, 0xb5, 0xae, 0xa3, 0xa2, 0x9e, 0x8b, 0x7f, + 0x82, 0x75, 0x6a, 0x67, 0x5f, 0x4e, 0x45, 0x48, 0x5b, 0x6a, 0x6c, + 0x7f, 0x8a, 0x86, 0x8b, 0x96, 0x9e, 0x9d, 0xad, 0xb1, 0xa5, 0xa2, + 0x9e, 0x94, 0x81, 0x81, 0x7b, 0x6e, 0x69, 0x64, 0x57, 0x48, 0x46, + 0x52, 0x67, 0x6b, 0x75, 0x87, 0x87, 0x87, 0x90, 0x9a, 0x9c, 0xa3, + 0xaf, 0xaa, 0xa2, 0x9e, 0x9a, 0x88, 0x81, 0x7f, 0x74, 0x6c, 0x65, + 0x5f, 0x4d, 0x46, 0x47, 0x58, 0x6b, 0x6c, 0x7d, 0x8a, 0x8a, 0x8a, + 0x96, 0xa0, 0x9f, 0xab, 0xb3, 0xaa, 0xa2, 0x9e, 0x98, 0x84, 0x7f, + 0x7c, 0x71, 0x68, 0x61, 0x5a, 0x4a, 0x46, 0x49, 0x5e, 0x6c, 0x6f, + 0x82, 0x89, 0x89, 0x8b, 0x96, 0x9f, 0xa1, 0xac, 0xaf, 0xaa, 0xa1, + 0x9d, 0x93, 0x83, 0x7e, 0x77, 0x71, 0x67, 0x60, 0x57, 0x4a, 0x48, + 0x4c, 0x64, 0x6e, 0x71, 0x85, 0x8a, 0x89, 0x8c, 0x98, 0xa0, 0xa0, + 0xae, 0xaf, 0xa6, 0x9f, 0x99, 0x91, 0x80, 0x7e, 0x78, 0x6f, 0x66, + 0x60, 0x5c, 0x4e, 0x4b, 0x50, 0x63, 0x6f, 0x72, 0x82, 0x88, 0x89, + 0x8a, 0x94, 0x9b, 0x9e, 0xaa, 0xac, 0xa8, 0x9f, 0x98, 0x90, 0x85, + 0x7e, 0x78, 0x74, 0x6b, 0x64, 0x60, 0x55, 0x51, 0x50, 0x5c, 0x6f, + 0x72, 0x7a, 0x85, 0x89, 0x88, 0x8b, 0x99, 0x9b, 0xa3, 0xac, 0xa9, + 0xa2, 0x9a, 0x96, 0x8a, 0x7f, 0x7c, 0x76, 0x70, 0x67, 0x63, 0x5b, + 0x52, 0x52, 0x54, 0x69, 0x73, 0x75, 0x82, 0x87, 0x89, 0x88, 0x93, + 0x9d, 0xa0, 0xa7, 0xaa, 0xa7, 0x9b, 0x95, 0x8f, 0x85, 0x7d, 0x78, + 0x75, 0x6d, 0x65, 0x63, 0x5b, 0x55, 0x55, 0x5e, 0x6f, 0x71, 0x79, + 0x82, 0x84, 0x87, 0x88, 0x94, 0x99, 0x9f, 0xa8, 0xa6, 0xa4, 0x9a, + 0x96, 0x8d, 0x82, 0x7e, 0x78, 0x73, 0x6a, 0x65, 0x60, 0x55, 0x51, + 0x4d, 0x56, 0x6b, 0x70, 0x77, 0x80, 0x88, 0x89, 0x89, 0x9a, 0xa1, + 0xa6, 0xae, 0xb0, 0xab, 0x9c, 0x98, 0x8e, 0x82, 0x7b, 0x78, 0x74, + 0x6b, 0x65, 0x61, 0x5b, 0x54, 0x54, 0x54, 0x65, 0x70, 0x71, 0x79, + 0x80, 0x88, 0x86, 0x8f, 0x9e, 0xa2, 0xa9, 0xae, 0xad, 0xa2, 0x98, + 0x95, 0x89, 0x7f, 0x79, 0x78, 0x70, 0x68, 0x64, 0x62, 0x59, 0x55, + 0x56, 0x5c, 0x6c, 0x6e, 0x75, 0x7d, 0x83, 0x88, 0x8b, 0x97, 0x9f, + 0xa3, 0xac, 0xab, 0xa7, 0x9c, 0x96, 0x8d, 0x81, 0x7b, 0x7a, 0x78, + 0x71, 0x6d, 0x68, 0x66, 0x5e, 0x5c, 0x5b, 0x59, 0x6a, 0x6e, 0x70, + 0x78, 0x7f, 0x88, 0x85, 0x92, 0x9e, 0xa0, 0xa7, 0xa9, 0xa9, 0x9d, + 0x95, 0x90, 0x87, 0x7f, 0x7a, 0x7b, 0x74, 0x6e, 0x6a, 0x69, 0x64, + 0x5c, 0x5d, 0x59, 0x65, 0x6e, 0x6d, 0x76, 0x7e, 0x86, 0x86, 0x8d, + 0x9c, 0x9e, 0xa2, 0xa7, 0xa7, 0x9f, 0x95, 0x91, 0x87, 0x7e, 0x7b, + 0x7c, 0x7a, 0x75, 0x73, 0x72, 0x6e, 0x69, 0x64, 0x62, 0x5c, 0x62, + 0x6c, 0x6c, 0x72, 0x78, 0x83, 0x85, 0x89, 0x96, 0x9b, 0x9f, 0xa4, + 0xa6, 0xa1, 0x98, 0x92, 0x8c, 0x84, 0x7f, 0x7f, 0x7d, 0x79, 0x75, + 0x74, 0x70, 0x6b, 0x66, 0x61, 0x5a, 0x5a, 0x67, 0x6a, 0x6c, 0x75, + 0x80, 0x86, 0x86, 0x91, 0x9c, 0x9f, 0xa4, 0xa5, 0xa6, 0x9d, 0x93, + 0x8d, 0x86, 0x82, 0x7e, 0x7f, 0x7e, 0x7a, 0x77, 0x75, 0x72, 0x6e, + 0x68, 0x63, 0x5c, 0x59, 0x63, 0x68, 0x6b, 0x73, 0x7d, 0x85, 0x84, + 0x8e, 0x98, 0x9e, 0xa1, 0xa4, 0xa7, 0x9d, 0x94, 0x8e, 0x89, 0x83, + 0x7e, 0x82, 0x83, 0x7f, 0x7b, 0x7b, 0x79, 0x73, 0x6f, 0x69, 0x65, + 0x5b, 0x57, 0x64, 0x65, 0x69, 0x71, 0x7c, 0x83, 0x81, 0x8d, 0x98, + 0x9d, 0x9f, 0xa3, 0xa5, 0x9b, 0x94, 0x8f, 0x8b, 0x84, 0x81, 0x85, + 0x83, 0x81, 0x7e, 0x7f, 0x7d, 0x79, 0x77, 0x70, 0x69, 0x5f, 0x57, + 0x5b, 0x62, 0x64, 0x69, 0x72, 0x7b, 0x7d, 0x82, 0x8e, 0x97, 0x9c, + 0xa0, 0xa4, 0xa1, 0x98, 0x94, 0x90, 0x8b, 0x86, 0x86, 0x87, 0x84, + 0x82, 0x80, 0x80, 0x7d, 0x7b, 0x78, 0x72, 0x69, 0x60, 0x57, 0x56, + 0x5d, 0x62, 0x66, 0x6d, 0x77, 0x7e, 0x81, 0x8b, 0x96, 0x9c, 0xa0, + 0xa1, 0xa3, 0x9c, 0x93, 0x91, 0x8c, 0x87, 0x83, 0x84, 0x85, 0x83, + 0x82, 0x84, 0x85, 0x82, 0x7e, 0x7c, 0x77, 0x6d, 0x60, 0x59, 0x55, + 0x59, 0x5f, 0x63, 0x6c, 0x73, 0x7a, 0x7f, 0x87, 0x92, 0x98, 0x9f, + 0xa0, 0xa0, 0x9d, 0x96, 0x92, 0x8d, 0x89, 0x85, 0x83, 0x84, 0x83, + 0x83, 0x84, 0x86, 0x85, 0x83, 0x80, 0x7d, 0x78, 0x6f, 0x62, 0x59, + 0x54, 0x58, 0x5c, 0x61, 0x6a, 0x71, 0x78, 0x7e, 0x87, 0x91, 0x97, + 0x9e, 0xa0, 0x9f, 0x9d, 0x97, 0x92, 0x8c, 0x88, 0x84, 0x82, 0x83, + 0x82, 0x83, 0x85, 0x87, 0x87, 0x86, 0x84, 0x81, 0x7d, 0x77, 0x6f, + 0x64, 0x5a, 0x53, 0x57, 0x5f, 0x61, 0x69, 0x71, 0x7a, 0x7f, 0x84, + 0x91, 0x97, 0x9b, 0x9d, 0x9f, 0x9e, 0x96, 0x92, 0x8d, 0x89, 0x84, + 0x82, 0x84, 0x83, 0x83, 0x84, 0x87, 0x88, 0x86, 0x85, 0x83, 0x7f, + 0x7b, 0x76, 0x70, 0x67, 0x5e, 0x54, 0x54, 0x5f, 0x64, 0x68, 0x70, + 0x7b, 0x81, 0x82, 0x8c, 0x96, 0x9a, 0x9a, 0x9c, 0x9e, 0x97, 0x91, + 0x8d, 0x8b, 0x86, 0x82, 0x84, 0x85, 0x85, 0x83, 0x86, 0x88, 0x87, + 0x85, 0x83, 0x82, 0x7c, 0x76, 0x71, 0x6c, 0x63, 0x5b, 0x50, 0x5a, + 0x67, 0x65, 0x6e, 0x76, 0x83, 0x84, 0x84, 0x95, 0x98, 0x9a, 0x99, + 0x9b, 0x9c, 0x90, 0x8e, 0x8a, 0x89, 0x84, 0x81, 0x87, 0x85, 0x85, + 0x84, 0x88, 0x8a, 0x86, 0x84, 0x81, 0x80, 0x79, 0x73, 0x71, 0x6a, + 0x64, 0x5c, 0x5b, 0x5c, 0x62, 0x6b, 0x71, 0x7a, 0x7f, 0x86, 0x8a, + 0x8e, 0x94, 0x95, 0x98, 0x96, 0x95, 0x93, 0x8d, 0x8c, 0x88, 0x87, + 0x86, 0x86, 0x87, 0x86, 0x87, 0x87, 0x87, 0x86, 0x82, 0x80, 0x7c, + 0x79, 0x72, 0x6d, 0x67, 0x60, 0x59, 0x55, 0x63, 0x69, 0x6b, 0x74, + 0x7b, 0x86, 0x83, 0x8b, 0x95, 0x96, 0x98, 0x95, 0x98, 0x93, 0x8c, + 0x8b, 0x88, 0x86, 0x81, 0x84, 0x86, 0x85, 0x85, 0x86, 0x8a, 0x89, + 0x88, 0x87, 0x85, 0x81, 0x7a, 0x78, 0x75, 0x71, 0x6d, 0x6b, 0x6c, + 0x6a, 0x6b, 0x6e, 0x72, 0x75, 0x78, 0x7d, 0x7f, 0x81, 0x83, 0x86, + 0x89, 0x89, 0x8a, 0x8c, 0x8d, 0x8c, 0x8b, 0x8c, 0x8b, 0x89, 0x88, + 0x87, 0x85, 0x82, 0x80, 0x7e, 0x7b, 0x79, 0x76, 0x75, 0x73, 0x70, + 0x6d, 0x6b, 0x68, 0x66, 0x67, 0x6f, 0x76, 0x79, 0x7f, 0x84, 0x89, + 0x8b, 0x8d, 0x93, 0x94, 0x94, 0x92, 0x91, 0x8e, 0x88, 0x86, 0x84, + 0x84, 0x82, 0x82, 0x85, 0x85, 0x86, 0x86, 0x88, 0x88, 0x86, 0x84, + 0x82, 0x7f, 0x7b, 0x77, 0x75, 0x72, 0x70, 0x6e, 0x6f, 0x6f, 0x70, + 0x71, 0x73, 0x75, 0x77, 0x79, 0x7c, 0x7e, 0x80, 0x82, 0x85, 0x87, + 0x89, 0x8b, 0x8d, 0x8e, 0x8e, 0x8e, 0x8e, 0x8c, 0x8b, 0x88, 0x86, + 0x84, 0x81, 0x7e, 0x7c, 0x7a, 0x77, 0x76, 0x74, 0x72, 0x70, 0x6d, + 0x6b, 0x69, 0x64, 0x67, 0x72, 0x76, 0x79, 0x7d, 0x85, 0x89, 0x87, + 0x8d, 0x93, 0x93, 0x91, 0x8f, 0x91, 0x8b, 0x86, 0x84, 0x83, 0x81, + 0x7e, 0x80, 0x82, 0x83, 0x83, 0x85, 0x88, 0x88, 0x87, 0x86, 0x84, + 0x82, 0x7e, 0x7c, 0x7a, 0x78, 0x75, 0x74, 0x76, 0x76, 0x76, 0x78, + 0x7a, 0x7c, 0x7c, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x81, + 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x83, 0x83, 0x82, 0x82, 0x81, + 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7c, 0x7b, 0x7b, 0x7b, 0x7b, + 0x7c, 0x7c, 0x7c, 0x7d, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x81, + 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x82, 0x82, + 0x82, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, + }, + }, +} + +var beepSound = []byte{ + 0x80, 0x80, 0x81, 0x81, 0x7f, 0x7e, 0x7e, 0x80, 0x7e, 0x79, 0x76, + 0x78, 0x81, 0x8c, 0x8f, 0x88, 0x7d, 0x78, 0x7b, 0x80, 0x7d, 0x73, + 0x6c, 0x73, 0x88, 0x9b, 0x9d, 0x8c, 0x76, 0x6d, 0x74, 0x7e, 0x7c, + 0x70, 0x68, 0x75, 0x8f, 0xa4, 0xa2, 0x89, 0x6f, 0x66, 0x70, 0x7d, + 0x7e, 0x74, 0x6e, 0x7b, 0x93, 0xa5, 0x9f, 0x84, 0x6a, 0x62, 0x6e, + 0x7e, 0x81, 0x79, 0x73, 0x7e, 0x95, 0xa4, 0x9a, 0x7e, 0x64, 0x5f, + 0x6e, 0x81, 0x86, 0x7e, 0x78, 0x82, 0x96, 0xa1, 0x95, 0x78, 0x5f, + 0x5d, 0x70, 0x84, 0x8a, 0x83, 0x7c, 0x84, 0x94, 0x9d, 0x8f, 0x72, + 0x5c, 0x5c, 0x72, 0x89, 0x90, 0x87, 0x7f, 0x84, 0x92, 0x98, 0x89, + 0x6d, 0x59, 0x5e, 0x77, 0x8f, 0x95, 0x8a, 0x80, 0x82, 0x8e, 0x93, + 0x84, 0x6a, 0x58, 0x61, 0x7c, 0x94, 0x9a, 0x8d, 0x80, 0x80, 0x8a, + 0x8d, 0x7f, 0x67, 0x5a, 0x65, 0x82, 0x9a, 0x9d, 0x8e, 0x7d, 0x7c, + 0x84, 0x88, 0x7b, 0x66, 0x5c, 0x6a, 0x88, 0x9f, 0x9f, 0x8d, 0x7b, + 0x77, 0x7f, 0x84, 0x79, 0x67, 0x60, 0x70, 0x8e, 0xa3, 0xa0, 0x8a, + 0x76, 0x72, 0x7b, 0x81, 0x78, 0x69, 0x65, 0x76, 0x93, 0xa5, 0x9f, + 0x86, 0x70, 0x6c, 0x77, 0x7f, 0x79, 0x6c, 0x6a, 0x7c, 0x97, 0xa7, + 0x9d, 0x81, 0x6b, 0x68, 0x74, 0x7f, 0x7c, 0x71, 0x70, 0x81, 0x9a, + 0xa6, 0x99, 0x7c, 0x65, 0x64, 0x73, 0x81, 0x80, 0x76, 0x75, 0x84, + 0x9b, 0xa4, 0x94, 0x76, 0x60, 0x61, 0x74, 0x84, 0x84, 0x7b, 0x79, + 0x87, 0x9a, 0xa0, 0x8e, 0x70, 0x5c, 0x61, 0x76, 0x88, 0x89, 0x80, + 0x7d, 0x88, 0x98, 0x9c, 0x88, 0x6a, 0x59, 0x61, 0x79, 0x8d, 0x8e, + 0x84, 0x7e, 0x88, 0x95, 0x96, 0x82, 0x66, 0x58, 0x63, 0x7e, 0x93, + 0x93, 0x87, 0x7f, 0x86, 0x91, 0x91, 0x7d, 0x63, 0x58, 0x67, 0x84, + 0x98, 0x97, 0x89, 0x7e, 0x82, 0x8c, 0x8b, 0x78, 0x61, 0x5a, 0x6c, + 0x8a, 0x9e, 0x9a, 0x88, 0x7c, 0x7e, 0x87, 0x86, 0x76, 0x61, 0x5d, + 0x71, 0x8f, 0xa2, 0x9c, 0x87, 0x78, 0x79, 0x82, 0x82, 0x74, 0x63, + 0x62, 0x77, 0x95, 0xa5, 0x9b, 0x84, 0x73, 0x73, 0x7d, 0x80, 0x74, + 0x66, 0x67, 0x7d, 0x9a, 0xa7, 0x9a, 0x80, 0x6d, 0x6e, 0x7b, 0x7f, + 0x76, 0x6a, 0x6c, 0x83, 0x9d, 0xa7, 0x96, 0x7a, 0x68, 0x6b, 0x78, + 0x80, 0x79, 0x6f, 0x72, 0x88, 0x9f, 0xa5, 0x92, 0x74, 0x62, 0x67, + 0x78, 0x82, 0x7d, 0x74, 0x77, 0x8a, 0x9f, 0xa2, 0x8c, 0x6e, 0x5e, + 0x66, 0x79, 0x86, 0x82, 0x79, 0x7c, 0x8d, 0x9e, 0x9e, 0x86, 0x68, + 0x5b, 0x66, 0x7c, 0x8a, 0x87, 0x7e, 0x7e, 0x8d, 0x9c, 0x98, 0x80, + 0x63, 0x59, 0x67, 0x80, 0x8f, 0x8c, 0x81, 0x80, 0x8c, 0x98, 0x93, + 0x7b, 0x60, 0x58, 0x6a, 0x85, 0x94, 0x91, 0x84, 0x80, 0x89, 0x93, + 0x8d, 0x76, 0x5d, 0x5a, 0x6e, 0x8b, 0x9a, 0x94, 0x84, 0x7e, 0x85, + 0x8e, 0x88, 0x72, 0x5d, 0x5c, 0x73, 0x91, 0x9f, 0x96, 0x84, 0x7b, + 0x80, 0x88, 0x83, 0x70, 0x5e, 0x61, 0x79, 0x97, 0xa2, 0x97, 0x81, + 0x77, 0x7b, 0x84, 0x80, 0x6f, 0x60, 0x66, 0x80, 0x9c, 0xa4, 0x95, + 0x7d, 0x71, 0x76, 0x80, 0x7e, 0x70, 0x64, 0x6b, 0x86, 0xa0, 0xa5, + 0x93, 0x79, 0x6c, 0x72, 0x7d, 0x7e, 0x72, 0x68, 0x71, 0x8a, 0xa2, + 0xa4, 0x8f, 0x73, 0x67, 0x6e, 0x7c, 0x7f, 0x76, 0x6e, 0x77, 0x8e, + 0xa3, 0xa2, 0x89, 0x6d, 0x62, 0x6c, 0x7c, 0x82, 0x7b, 0x73, 0x7b, + 0x91, 0xa3, 0x9e, 0x84, 0x67, 0x5e, 0x6b, 0x7e, 0x86, 0x80, 0x78, + 0x7f, 0x92, 0xa0, 0x99, 0x7d, 0x62, 0x5c, 0x6b, 0x81, 0x8b, 0x84, + 0x7c, 0x81, 0x92, 0x9d, 0x93, 0x78, 0x5e, 0x5a, 0x6e, 0x86, 0x90, + 0x89, 0x80, 0x82, 0x90, 0x98, 0x8e, 0x72, 0x5b, 0x5b, 0x72, 0x8c, + 0x95, 0x8d, 0x81, 0x81, 0x8d, 0x93, 0x88, 0x6e, 0x5a, 0x5d, 0x76, + 0x91, 0x9a, 0x8f, 0x81, 0x7e, 0x88, 0x8e, 0x83, 0x6b, 0x5a, 0x61, + 0x7c, 0x97, 0x9e, 0x91, 0x80, 0x7b, 0x83, 0x89, 0x7e, 0x6a, 0x5c, + 0x66, 0x82, 0x9b, 0x9f, 0x8f, 0x7d, 0x78, 0x7e, 0x83, 0x7d, 0x70, + 0x6a, 0x72, 0x85, 0x93, 0x93, 0x88, 0x7c, 0x79, 0x7d, 0x80, 0x7d, + 0x78, 0x77, 0x7b, 0x83, 0x87, 0x86, 0x81, 0x7e, 0x7d, 0x7e, 0x7f, + 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, + 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, + 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, + 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, + 0x7f, 0x80, 0x7f, 0x7f, 0x80, +} diff --git a/vendor/github.com/mojocn/base64Captcha/store_memory.go b/vendor/github.com/mojocn/base64Captcha/store_memory.go new file mode 100644 index 00000000..d420dcf7 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/store_memory.go @@ -0,0 +1,115 @@ +// Copyright 2017 Eric Zhou. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package base64Captcha + +import ( + "container/list" + "sync" + "time" +) + +// expValue stores timestamp and id of captchas. It is used in the list inside +// memoryStore for indexing generated captchas by timestamp to enable garbage +// collection of expired captchas. +type idByTimeValue struct { + timestamp time.Time + id string +} + +// memoryStore is an internal store for captcha ids and their values. +type memoryStore struct { + sync.RWMutex + digitsById map[string]string + idByTime *list.List + // Number of items stored since last collection. + numStored int + // Number of saved items that triggers collection. + collectNum int + // Expiration time of captchas. + expiration time.Duration +} + +// NewMemoryStore returns a new standard memory store for captchas with the +// given collection threshold and expiration time (duration). The returned +// store must be registered with SetCustomStore to replace the default one. +func NewMemoryStore(collectNum int, expiration time.Duration) Store { + s := new(memoryStore) + s.digitsById = make(map[string]string) + s.idByTime = list.New() + s.collectNum = collectNum + s.expiration = expiration + return s +} + +func (s *memoryStore) Set(id string, value string) { + s.Lock() + s.digitsById[id] = value + s.idByTime.PushBack(idByTimeValue{time.Now(), id}) + s.numStored++ + s.Unlock() + if s.numStored > s.collectNum { + go s.collect() + } +} + +func (s *memoryStore) Verify(id, answer string, clear bool) bool { + v := s.Get(id, clear) + return v == answer +} + +func (s *memoryStore) Get(id string, clear bool) (value string) { + if !clear { + // When we don't need to clear captcha, acquire read lock. + s.RLock() + defer s.RUnlock() + } else { + s.Lock() + defer s.Unlock() + } + value, ok := s.digitsById[id] + if !ok { + return + } + if clear { + delete(s.digitsById, id) + } + return +} + +func (s *memoryStore) collect() { + now := time.Now() + s.Lock() + defer s.Unlock() + for e := s.idByTime.Front(); e != nil; { + e = s.collectOne(e, now) + } +} + +func (s *memoryStore) collectOne(e *list.Element, specifyTime time.Time) *list.Element { + + ev, ok := e.Value.(idByTimeValue) + if !ok { + return nil + } + + if ev.timestamp.Add(s.expiration).Before(specifyTime) { + delete(s.digitsById, ev.id) + next := e.Next() + s.idByTime.Remove(e) + s.numStored-- + return next + } + return nil +} diff --git a/vendor/github.com/mojocn/base64Captcha/store_memory_default.go b/vendor/github.com/mojocn/base64Captcha/store_memory_default.go new file mode 100644 index 00000000..09d2c3f4 --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/store_memory_default.go @@ -0,0 +1,12 @@ +package base64Captcha + +import "time" + +var ( + // GCLimitNumber The number of captchas created that triggers garbage collection used by default store. + GCLimitNumber = 10240 + // Expiration time of captchas used by default store. + Expiration = 10 * time.Minute + // DefaultMemStore is a shared storage for captchas, generated by New function. + DefaultMemStore = NewMemoryStore(GCLimitNumber, Expiration) +) diff --git a/vendor/github.com/mojocn/base64Captcha/util.go b/vendor/github.com/mojocn/base64Captcha/util.go new file mode 100644 index 00000000..aafc84ac --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/util.go @@ -0,0 +1,94 @@ +package base64Captcha + +import ( + "crypto/rand" + "fmt" + "io" + "os" + "path/filepath" +) + +//parseDigitsToString parse randomDigits to normal string +func parseDigitsToString(bytes []byte) string { + stringB := make([]byte, len(bytes)) + for idx, by := range bytes { + stringB[idx] = by + '0' + } + return string(stringB) +} +func stringToFakeByte(content string) []byte { + digits := make([]byte, len(content)) + for idx, cc := range content { + digits[idx] = byte(cc - '0') + } + return digits +} + +// randomDigits returns a byte slice of the given length containing +// pseudorandom numbers in range 0-9. The slice can be used as a captcha +// solution. +func randomDigits(length int) []byte { + return randomBytesMod(length, 10) +} + +// randomBytes returns a byte slice of the given length read from CSPRNG. +func randomBytes(length int) (b []byte) { + b = make([]byte, length) + if _, err := io.ReadFull(rand.Reader, b); err != nil { + panic("captcha: error reading random source: " + err.Error()) + } + return +} + +// randomBytesMod returns a byte slice of the given length, where each byte is +// a random number modulo mod. +func randomBytesMod(length int, mod byte) (b []byte) { + if length == 0 { + return nil + } + if mod == 0 { + panic("captcha: bad mod argument for randomBytesMod") + } + maxrb := 255 - byte(256%int(mod)) + b = make([]byte, length) + i := 0 + for { + r := randomBytes(length + (length / 4)) + for _, c := range r { + if c > maxrb { + // Skip this number to avoid modulo bias. + continue + } + b[i] = c % mod + i++ + if i == length { + return + } + } + } +} + +func itemWriteFile(cap Item, outputDir, fileName, fileExt string) error { + filePath := filepath.Join(outputDir, fileName+"."+fileExt) + if !pathExists(outputDir) { + _ = os.MkdirAll(outputDir, os.ModePerm) + } + file, err := os.Create(filePath) + if err != nil { + fmt.Printf("%s is invalid path.error:%v", filePath, err) + return err + } + defer file.Close() + _, err = cap.WriteTo(file) + return err +} +func pathExists(path string) bool { + _, err := os.Stat(path) + if err == nil { + return true + } + if os.IsNotExist(err) { + return false + } + return false +} diff --git a/vendor/github.com/mojocn/base64Captcha/util_audio.go b/vendor/github.com/mojocn/base64Captcha/util_audio.go new file mode 100644 index 00000000..ebd86c0f --- /dev/null +++ b/vendor/github.com/mojocn/base64Captcha/util_audio.go @@ -0,0 +1,77 @@ +package base64Captcha + +import ( + "math" +) + +const sampleRate = 8000 // Hz + +var endingBeepSound []byte + +func init() { + endingBeepSound = changeSpeed(beepSound, 1.4) +} + +// mixSound mixes src into dst. Dst must have length equal to or greater than +// src length. +func mixSound(dst, src []byte) { + for i, v := range src { + av := int(v) + bv := int(dst[i]) + if av < 128 && bv < 128 { + dst[i] = byte(av * bv / 128) + } else { + dst[i] = byte(2*(av+bv) - av*bv/128 - 256) + } + } +} + +func setSoundLevel(a []byte, level float64) { + for i, v := range a { + av := float64(v) + switch { + case av > 128: + if av = (av-128)*level + 128; av < 128 { + av = 128 + } + case av < 128: + if av = 128 - (128-av)*level; av > 128 { + av = 128 + } + default: + continue + } + a[i] = byte(av) + } +} + +// changeSpeed returns new PCM bytes from the bytes with the speed and pitch +// changed to the given value that must be in range [0, x]. +func changeSpeed(a []byte, speed float64) []byte { + b := make([]byte, int(math.Floor(float64(len(a))*speed))) + var p float64 + for _, v := range a { + for i := int(p); i < int(p+speed); i++ { + b[i] = v + } + p += speed + } + return b +} + +func makeSilence(length int) []byte { + b := make([]byte, length) + for i := range b { + b[i] = 128 + } + return b +} + +func reversedSound(a []byte) []byte { + n := len(a) + b := make([]byte, n) + for i, v := range a { + b[n-1-i] = v + } + return b +} diff --git a/vendor/github.com/opentracing/opentracing-go/.gitignore b/vendor/github.com/opentracing/opentracing-go/.gitignore new file mode 100644 index 00000000..c57100a5 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/.gitignore @@ -0,0 +1 @@ +coverage.txt diff --git a/vendor/github.com/opentracing/opentracing-go/.travis.yml b/vendor/github.com/opentracing/opentracing-go/.travis.yml new file mode 100644 index 00000000..b950e429 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/.travis.yml @@ -0,0 +1,20 @@ +language: go + +matrix: + include: + - go: "1.13.x" + - go: "1.14.x" + - go: "tip" + env: + - LINT=true + - COVERAGE=true + +install: + - if [ "$LINT" == true ]; then go get -u golang.org/x/lint/golint/... ; else echo 'skipping lint'; fi + - go get -u github.com/stretchr/testify/... + +script: + - make test + - go build ./... + - if [ "$LINT" == true ]; then make lint ; else echo 'skipping lint'; fi + - if [ "$COVERAGE" == true ]; then make cover && bash <(curl -s https://codecov.io/bash) ; else echo 'skipping coverage'; fi diff --git a/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md b/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md new file mode 100644 index 00000000..d3bfcf62 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md @@ -0,0 +1,63 @@ +Changes by Version +================== + + +1.2.0 (2020-07-01) +------------------- + +* Restore the ability to reset the current span in context to nil (#231) -- Yuri Shkuro +* Use error.object per OpenTracing Semantic Conventions (#179) -- Rahman Syed +* Convert nil pointer log field value to string "nil" (#230) -- Cyril Tovena +* Add Go module support (#215) -- Zaba505 +* Make SetTag helper types in ext public (#229) -- Blake Edwards +* Add log/fields helpers for keys from specification (#226) -- Dmitry Monakhov +* Improve noop impementation (#223) -- chanxuehong +* Add an extension to Tracer interface for custom go context creation (#220) -- Krzesimir Nowak +* Fix typo in comments (#222) -- meteorlxy +* Improve documentation for log.Object() to emphasize the requirement to pass immutable arguments (#219) -- 疯狂的小企鹅 +* [mock] Return ErrInvalidSpanContext if span context is not MockSpanContext (#216) -- Milad Irannejad + + +1.1.0 (2019-03-23) +------------------- + +Notable changes: +- The library is now released under Apache 2.0 license +- Use Set() instead of Add() in HTTPHeadersCarrier is functionally a breaking change (fixes issue [#159](https://github.com/opentracing/opentracing-go/issues/159)) +- 'golang.org/x/net/context' is replaced with 'context' from the standard library + +List of all changes: + +- Export StartSpanFromContextWithTracer (#214) +- Add IsGlobalTracerRegistered() to indicate if a tracer has been registered (#201) +- Use Set() instead of Add() in HTTPHeadersCarrier (#191) +- Update license to Apache 2.0 (#181) +- Replace 'golang.org/x/net/context' with 'context' (#176) +- Port of Python opentracing/harness/api_check.py to Go (#146) +- Fix race condition in MockSpan.Context() (#170) +- Add PeerHostIPv4.SetString() (#155) +- Add a Noop log field type to log to allow for optional fields (#150) + + +1.0.2 (2017-04-26) +------------------- + +- Add more semantic tags (#139) + + +1.0.1 (2017-02-06) +------------------- + +- Correct spelling in comments +- Address race in nextMockID() (#123) +- log: avoid panic marshaling nil error (#131) +- Deprecate InitGlobalTracer in favor of SetGlobalTracer (#128) +- Drop Go 1.5 that fails in Travis (#129) +- Add convenience methods Key() and Value() to log.Field +- Add convenience methods to log.Field (2 years, 6 months ago) + +1.0.0 (2016-09-26) +------------------- + +- This release implements OpenTracing Specification 1.0 (https://opentracing.io/spec) + diff --git a/vendor/github.com/opentracing/opentracing-go/LICENSE b/vendor/github.com/opentracing/opentracing-go/LICENSE new file mode 100644 index 00000000..f0027349 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016 The OpenTracing Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/opentracing/opentracing-go/Makefile b/vendor/github.com/opentracing/opentracing-go/Makefile new file mode 100644 index 00000000..62abb63f --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/Makefile @@ -0,0 +1,20 @@ +.DEFAULT_GOAL := test-and-lint + +.PHONY: test-and-lint +test-and-lint: test lint + +.PHONY: test +test: + go test -v -cover -race ./... + +.PHONY: cover +cover: + go test -v -coverprofile=coverage.txt -covermode=atomic -race ./... + +.PHONY: lint +lint: + go fmt ./... + golint ./... + @# Run again with magic to exit non-zero if golint outputs anything. + @! (golint ./... | read dummy) + go vet ./... diff --git a/vendor/github.com/opentracing/opentracing-go/README.md b/vendor/github.com/opentracing/opentracing-go/README.md new file mode 100644 index 00000000..6ef1d7c9 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/README.md @@ -0,0 +1,171 @@ +[![Gitter chat](http://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/opentracing/public) [![Build Status](https://travis-ci.org/opentracing/opentracing-go.svg?branch=master)](https://travis-ci.org/opentracing/opentracing-go) [![GoDoc](https://godoc.org/github.com/opentracing/opentracing-go?status.svg)](http://godoc.org/github.com/opentracing/opentracing-go) +[![Sourcegraph Badge](https://sourcegraph.com/github.com/opentracing/opentracing-go/-/badge.svg)](https://sourcegraph.com/github.com/opentracing/opentracing-go?badge) + +# OpenTracing API for Go + +This package is a Go platform API for OpenTracing. + +## Required Reading + +In order to understand the Go platform API, one must first be familiar with the +[OpenTracing project](https://opentracing.io) and +[terminology](https://opentracing.io/specification/) more specifically. + +## API overview for those adding instrumentation + +Everyday consumers of this `opentracing` package really only need to worry +about a couple of key abstractions: the `StartSpan` function, the `Span` +interface, and binding a `Tracer` at `main()`-time. Here are code snippets +demonstrating some important use cases. + +#### Singleton initialization + +The simplest starting point is `./default_tracer.go`. As early as possible, call + +```go + import "github.com/opentracing/opentracing-go" + import ".../some_tracing_impl" + + func main() { + opentracing.SetGlobalTracer( + // tracing impl specific: + some_tracing_impl.New(...), + ) + ... + } +``` + +#### Non-Singleton initialization + +If you prefer direct control to singletons, manage ownership of the +`opentracing.Tracer` implementation explicitly. + +#### Creating a Span given an existing Go `context.Context` + +If you use `context.Context` in your application, OpenTracing's Go library will +happily rely on it for `Span` propagation. To start a new (blocking child) +`Span`, you can use `StartSpanFromContext`. + +```go + func xyz(ctx context.Context, ...) { + ... + span, ctx := opentracing.StartSpanFromContext(ctx, "operation_name") + defer span.Finish() + span.LogFields( + log.String("event", "soft error"), + log.String("type", "cache timeout"), + log.Int("waited.millis", 1500)) + ... + } +``` + +#### Starting an empty trace by creating a "root span" + +It's always possible to create a "root" `Span` with no parent or other causal +reference. + +```go + func xyz() { + ... + sp := opentracing.StartSpan("operation_name") + defer sp.Finish() + ... + } +``` + +#### Creating a (child) Span given an existing (parent) Span + +```go + func xyz(parentSpan opentracing.Span, ...) { + ... + sp := opentracing.StartSpan( + "operation_name", + opentracing.ChildOf(parentSpan.Context())) + defer sp.Finish() + ... + } +``` + +#### Serializing to the wire + +```go + func makeSomeRequest(ctx context.Context) ... { + if span := opentracing.SpanFromContext(ctx); span != nil { + httpClient := &http.Client{} + httpReq, _ := http.NewRequest("GET", "http://myservice/", nil) + + // Transmit the span's TraceContext as HTTP headers on our + // outbound request. + opentracing.GlobalTracer().Inject( + span.Context(), + opentracing.HTTPHeaders, + opentracing.HTTPHeadersCarrier(httpReq.Header)) + + resp, err := httpClient.Do(httpReq) + ... + } + ... + } +``` + +#### Deserializing from the wire + +```go + http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + var serverSpan opentracing.Span + appSpecificOperationName := ... + wireContext, err := opentracing.GlobalTracer().Extract( + opentracing.HTTPHeaders, + opentracing.HTTPHeadersCarrier(req.Header)) + if err != nil { + // Optionally record something about err here + } + + // Create the span referring to the RPC client if available. + // If wireContext == nil, a root span will be created. + serverSpan = opentracing.StartSpan( + appSpecificOperationName, + ext.RPCServerOption(wireContext)) + + defer serverSpan.Finish() + + ctx := opentracing.ContextWithSpan(context.Background(), serverSpan) + ... + } +``` + +#### Conditionally capture a field using `log.Noop` + +In some situations, you may want to dynamically decide whether or not +to log a field. For example, you may want to capture additional data, +such as a customer ID, in non-production environments: + +```go + func Customer(order *Order) log.Field { + if os.Getenv("ENVIRONMENT") == "dev" { + return log.String("customer", order.Customer.ID) + } + return log.Noop() + } +``` + +#### Goroutine-safety + +The entire public API is goroutine-safe and does not require external +synchronization. + +## API pointers for those implementing a tracing system + +Tracing system implementors may be able to reuse or copy-paste-modify the `basictracer` package, found [here](https://github.com/opentracing/basictracer-go). In particular, see `basictracer.New(...)`. + +## API compatibility + +For the time being, "mild" backwards-incompatible changes may be made without changing the major version number. As OpenTracing and `opentracing-go` mature, backwards compatibility will become more of a priority. + +## Tracer test suite + +A test suite is available in the [harness](https://godoc.org/github.com/opentracing/opentracing-go/harness) package that can assist Tracer implementors to assert that their Tracer is working correctly. + +## Licensing + +[Apache 2.0 License](./LICENSE). diff --git a/vendor/github.com/opentracing/opentracing-go/ext.go b/vendor/github.com/opentracing/opentracing-go/ext.go new file mode 100644 index 00000000..e11977eb --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/ext.go @@ -0,0 +1,24 @@ +package opentracing + +import ( + "context" +) + +// TracerContextWithSpanExtension is an extension interface that the +// implementation of the Tracer interface may want to implement. It +// allows to have some control over the go context when the +// ContextWithSpan is invoked. +// +// The primary purpose of this extension are adapters from opentracing +// API to some other tracing API. +type TracerContextWithSpanExtension interface { + // ContextWithSpanHook gets called by the ContextWithSpan + // function, when the Tracer implementation also implements + // this interface. It allows to put extra information into the + // context and make it available to the callers of the + // ContextWithSpan. + // + // This hook is invoked before the ContextWithSpan function + // actually puts the span into the context. + ContextWithSpanHook(ctx context.Context, span Span) context.Context +} diff --git a/vendor/github.com/opentracing/opentracing-go/ext/field.go b/vendor/github.com/opentracing/opentracing-go/ext/field.go new file mode 100644 index 00000000..8282bd75 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/ext/field.go @@ -0,0 +1,17 @@ +package ext + +import ( + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/log" +) + +// LogError sets the error=true tag on the Span and logs err as an "error" event. +func LogError(span opentracing.Span, err error, fields ...log.Field) { + Error.Set(span, true) + ef := []log.Field{ + log.Event("error"), + log.Error(err), + } + ef = append(ef, fields...) + span.LogFields(ef...) +} diff --git a/vendor/github.com/opentracing/opentracing-go/ext/tags.go b/vendor/github.com/opentracing/opentracing-go/ext/tags.go new file mode 100644 index 00000000..a414b595 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/ext/tags.go @@ -0,0 +1,215 @@ +package ext + +import "github.com/opentracing/opentracing-go" + +// These constants define common tag names recommended for better portability across +// tracing systems and languages/platforms. +// +// The tag names are defined as typed strings, so that in addition to the usual use +// +// span.setTag(TagName, value) +// +// they also support value type validation via this additional syntax: +// +// TagName.Set(span, value) +// +var ( + ////////////////////////////////////////////////////////////////////// + // SpanKind (client/server or producer/consumer) + ////////////////////////////////////////////////////////////////////// + + // SpanKind hints at relationship between spans, e.g. client/server + SpanKind = spanKindTagName("span.kind") + + // SpanKindRPCClient marks a span representing the client-side of an RPC + // or other remote call + SpanKindRPCClientEnum = SpanKindEnum("client") + SpanKindRPCClient = opentracing.Tag{Key: string(SpanKind), Value: SpanKindRPCClientEnum} + + // SpanKindRPCServer marks a span representing the server-side of an RPC + // or other remote call + SpanKindRPCServerEnum = SpanKindEnum("server") + SpanKindRPCServer = opentracing.Tag{Key: string(SpanKind), Value: SpanKindRPCServerEnum} + + // SpanKindProducer marks a span representing the producer-side of a + // message bus + SpanKindProducerEnum = SpanKindEnum("producer") + SpanKindProducer = opentracing.Tag{Key: string(SpanKind), Value: SpanKindProducerEnum} + + // SpanKindConsumer marks a span representing the consumer-side of a + // message bus + SpanKindConsumerEnum = SpanKindEnum("consumer") + SpanKindConsumer = opentracing.Tag{Key: string(SpanKind), Value: SpanKindConsumerEnum} + + ////////////////////////////////////////////////////////////////////// + // Component name + ////////////////////////////////////////////////////////////////////// + + // Component is a low-cardinality identifier of the module, library, + // or package that is generating a span. + Component = StringTagName("component") + + ////////////////////////////////////////////////////////////////////// + // Sampling hint + ////////////////////////////////////////////////////////////////////// + + // SamplingPriority determines the priority of sampling this Span. + SamplingPriority = Uint16TagName("sampling.priority") + + ////////////////////////////////////////////////////////////////////// + // Peer tags. These tags can be emitted by either client-side or + // server-side to describe the other side/service in a peer-to-peer + // communications, like an RPC call. + ////////////////////////////////////////////////////////////////////// + + // PeerService records the service name of the peer. + PeerService = StringTagName("peer.service") + + // PeerAddress records the address name of the peer. This may be a "ip:port", + // a bare "hostname", a FQDN or even a database DSN substring + // like "mysql://username@127.0.0.1:3306/dbname" + PeerAddress = StringTagName("peer.address") + + // PeerHostname records the host name of the peer + PeerHostname = StringTagName("peer.hostname") + + // PeerHostIPv4 records IP v4 host address of the peer + PeerHostIPv4 = IPv4TagName("peer.ipv4") + + // PeerHostIPv6 records IP v6 host address of the peer + PeerHostIPv6 = StringTagName("peer.ipv6") + + // PeerPort records port number of the peer + PeerPort = Uint16TagName("peer.port") + + ////////////////////////////////////////////////////////////////////// + // HTTP Tags + ////////////////////////////////////////////////////////////////////// + + // HTTPUrl should be the URL of the request being handled in this segment + // of the trace, in standard URI format. The protocol is optional. + HTTPUrl = StringTagName("http.url") + + // HTTPMethod is the HTTP method of the request, and is case-insensitive. + HTTPMethod = StringTagName("http.method") + + // HTTPStatusCode is the numeric HTTP status code (200, 404, etc) of the + // HTTP response. + HTTPStatusCode = Uint16TagName("http.status_code") + + ////////////////////////////////////////////////////////////////////// + // DB Tags + ////////////////////////////////////////////////////////////////////// + + // DBInstance is database instance name. + DBInstance = StringTagName("db.instance") + + // DBStatement is a database statement for the given database type. + // It can be a query or a prepared statement (i.e., before substitution). + DBStatement = StringTagName("db.statement") + + // DBType is a database type. For any SQL database, "sql". + // For others, the lower-case database category, e.g. "redis" + DBType = StringTagName("db.type") + + // DBUser is a username for accessing database. + DBUser = StringTagName("db.user") + + ////////////////////////////////////////////////////////////////////// + // Message Bus Tag + ////////////////////////////////////////////////////////////////////// + + // MessageBusDestination is an address at which messages can be exchanged + MessageBusDestination = StringTagName("message_bus.destination") + + ////////////////////////////////////////////////////////////////////// + // Error Tag + ////////////////////////////////////////////////////////////////////// + + // Error indicates that operation represented by the span resulted in an error. + Error = BoolTagName("error") +) + +// --- + +// SpanKindEnum represents common span types +type SpanKindEnum string + +type spanKindTagName string + +// Set adds a string tag to the `span` +func (tag spanKindTagName) Set(span opentracing.Span, value SpanKindEnum) { + span.SetTag(string(tag), value) +} + +type rpcServerOption struct { + clientContext opentracing.SpanContext +} + +func (r rpcServerOption) Apply(o *opentracing.StartSpanOptions) { + if r.clientContext != nil { + opentracing.ChildOf(r.clientContext).Apply(o) + } + SpanKindRPCServer.Apply(o) +} + +// RPCServerOption returns a StartSpanOption appropriate for an RPC server span +// with `client` representing the metadata for the remote peer Span if available. +// In case client == nil, due to the client not being instrumented, this RPC +// server span will be a root span. +func RPCServerOption(client opentracing.SpanContext) opentracing.StartSpanOption { + return rpcServerOption{client} +} + +// --- + +// StringTagName is a common tag name to be set to a string value +type StringTagName string + +// Set adds a string tag to the `span` +func (tag StringTagName) Set(span opentracing.Span, value string) { + span.SetTag(string(tag), value) +} + +// --- + +// Uint32TagName is a common tag name to be set to a uint32 value +type Uint32TagName string + +// Set adds a uint32 tag to the `span` +func (tag Uint32TagName) Set(span opentracing.Span, value uint32) { + span.SetTag(string(tag), value) +} + +// --- + +// Uint16TagName is a common tag name to be set to a uint16 value +type Uint16TagName string + +// Set adds a uint16 tag to the `span` +func (tag Uint16TagName) Set(span opentracing.Span, value uint16) { + span.SetTag(string(tag), value) +} + +// --- + +// BoolTagName is a common tag name to be set to a bool value +type BoolTagName string + +// Set adds a bool tag to the `span` +func (tag BoolTagName) Set(span opentracing.Span, value bool) { + span.SetTag(string(tag), value) +} + +// IPv4TagName is a common tag name to be set to an ipv4 value +type IPv4TagName string + +// Set adds IP v4 host address of the peer as an uint32 value to the `span`, keep this for backward and zipkin compatibility +func (tag IPv4TagName) Set(span opentracing.Span, value uint32) { + span.SetTag(string(tag), value) +} + +// SetString records IP v4 host address of the peer as a .-separated tuple to the `span`. E.g., "127.0.0.1" +func (tag IPv4TagName) SetString(span opentracing.Span, value string) { + span.SetTag(string(tag), value) +} diff --git a/vendor/github.com/opentracing/opentracing-go/globaltracer.go b/vendor/github.com/opentracing/opentracing-go/globaltracer.go new file mode 100644 index 00000000..4f7066a9 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/globaltracer.go @@ -0,0 +1,42 @@ +package opentracing + +type registeredTracer struct { + tracer Tracer + isRegistered bool +} + +var ( + globalTracer = registeredTracer{NoopTracer{}, false} +) + +// SetGlobalTracer sets the [singleton] opentracing.Tracer returned by +// GlobalTracer(). Those who use GlobalTracer (rather than directly manage an +// opentracing.Tracer instance) should call SetGlobalTracer as early as +// possible in main(), prior to calling the `StartSpan` global func below. +// Prior to calling `SetGlobalTracer`, any Spans started via the `StartSpan` +// (etc) globals are noops. +func SetGlobalTracer(tracer Tracer) { + globalTracer = registeredTracer{tracer, true} +} + +// GlobalTracer returns the global singleton `Tracer` implementation. +// Before `SetGlobalTracer()` is called, the `GlobalTracer()` is a noop +// implementation that drops all data handed to it. +func GlobalTracer() Tracer { + return globalTracer.tracer +} + +// StartSpan defers to `Tracer.StartSpan`. See `GlobalTracer()`. +func StartSpan(operationName string, opts ...StartSpanOption) Span { + return globalTracer.tracer.StartSpan(operationName, opts...) +} + +// InitGlobalTracer is deprecated. Please use SetGlobalTracer. +func InitGlobalTracer(tracer Tracer) { + SetGlobalTracer(tracer) +} + +// IsGlobalTracerRegistered returns a `bool` to indicate if a tracer has been globally registered +func IsGlobalTracerRegistered() bool { + return globalTracer.isRegistered +} diff --git a/vendor/github.com/opentracing/opentracing-go/go.mod b/vendor/github.com/opentracing/opentracing-go/go.mod new file mode 100644 index 00000000..bf48bb5d --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/go.mod @@ -0,0 +1,5 @@ +module github.com/opentracing/opentracing-go + +go 1.14 + +require github.com/stretchr/testify v1.3.0 diff --git a/vendor/github.com/opentracing/opentracing-go/go.sum b/vendor/github.com/opentracing/opentracing-go/go.sum new file mode 100644 index 00000000..4347755a --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/go.sum @@ -0,0 +1,7 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/opentracing/opentracing-go/gocontext.go b/vendor/github.com/opentracing/opentracing-go/gocontext.go new file mode 100644 index 00000000..1831bc9b --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/gocontext.go @@ -0,0 +1,65 @@ +package opentracing + +import "context" + +type contextKey struct{} + +var activeSpanKey = contextKey{} + +// ContextWithSpan returns a new `context.Context` that holds a reference to +// the span. If span is nil, a new context without an active span is returned. +func ContextWithSpan(ctx context.Context, span Span) context.Context { + if span != nil { + if tracerWithHook, ok := span.Tracer().(TracerContextWithSpanExtension); ok { + ctx = tracerWithHook.ContextWithSpanHook(ctx, span) + } + } + return context.WithValue(ctx, activeSpanKey, span) +} + +// SpanFromContext returns the `Span` previously associated with `ctx`, or +// `nil` if no such `Span` could be found. +// +// NOTE: context.Context != SpanContext: the former is Go's intra-process +// context propagation mechanism, and the latter houses OpenTracing's per-Span +// identity and baggage information. +func SpanFromContext(ctx context.Context) Span { + val := ctx.Value(activeSpanKey) + if sp, ok := val.(Span); ok { + return sp + } + return nil +} + +// StartSpanFromContext starts and returns a Span with `operationName`, using +// any Span found within `ctx` as a ChildOfRef. If no such parent could be +// found, StartSpanFromContext creates a root (parentless) Span. +// +// The second return value is a context.Context object built around the +// returned Span. +// +// Example usage: +// +// SomeFunction(ctx context.Context, ...) { +// sp, ctx := opentracing.StartSpanFromContext(ctx, "SomeFunction") +// defer sp.Finish() +// ... +// } +func StartSpanFromContext(ctx context.Context, operationName string, opts ...StartSpanOption) (Span, context.Context) { + return StartSpanFromContextWithTracer(ctx, GlobalTracer(), operationName, opts...) +} + +// StartSpanFromContextWithTracer starts and returns a span with `operationName` +// using a span found within the context as a ChildOfRef. If that doesn't exist +// it creates a root span. It also returns a context.Context object built +// around the returned span. +// +// It's behavior is identical to StartSpanFromContext except that it takes an explicit +// tracer as opposed to using the global tracer. +func StartSpanFromContextWithTracer(ctx context.Context, tracer Tracer, operationName string, opts ...StartSpanOption) (Span, context.Context) { + if parentSpan := SpanFromContext(ctx); parentSpan != nil { + opts = append(opts, ChildOf(parentSpan.Context())) + } + span := tracer.StartSpan(operationName, opts...) + return span, ContextWithSpan(ctx, span) +} diff --git a/vendor/github.com/opentracing/opentracing-go/log/field.go b/vendor/github.com/opentracing/opentracing-go/log/field.go new file mode 100644 index 00000000..f222ded7 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/log/field.go @@ -0,0 +1,282 @@ +package log + +import ( + "fmt" + "math" +) + +type fieldType int + +const ( + stringType fieldType = iota + boolType + intType + int32Type + uint32Type + int64Type + uint64Type + float32Type + float64Type + errorType + objectType + lazyLoggerType + noopType +) + +// Field instances are constructed via LogBool, LogString, and so on. +// Tracing implementations may then handle them via the Field.Marshal +// method. +// +// "heavily influenced by" (i.e., partially stolen from) +// https://github.com/uber-go/zap +type Field struct { + key string + fieldType fieldType + numericVal int64 + stringVal string + interfaceVal interface{} +} + +// String adds a string-valued key:value pair to a Span.LogFields() record +func String(key, val string) Field { + return Field{ + key: key, + fieldType: stringType, + stringVal: val, + } +} + +// Bool adds a bool-valued key:value pair to a Span.LogFields() record +func Bool(key string, val bool) Field { + var numericVal int64 + if val { + numericVal = 1 + } + return Field{ + key: key, + fieldType: boolType, + numericVal: numericVal, + } +} + +// Int adds an int-valued key:value pair to a Span.LogFields() record +func Int(key string, val int) Field { + return Field{ + key: key, + fieldType: intType, + numericVal: int64(val), + } +} + +// Int32 adds an int32-valued key:value pair to a Span.LogFields() record +func Int32(key string, val int32) Field { + return Field{ + key: key, + fieldType: int32Type, + numericVal: int64(val), + } +} + +// Int64 adds an int64-valued key:value pair to a Span.LogFields() record +func Int64(key string, val int64) Field { + return Field{ + key: key, + fieldType: int64Type, + numericVal: val, + } +} + +// Uint32 adds a uint32-valued key:value pair to a Span.LogFields() record +func Uint32(key string, val uint32) Field { + return Field{ + key: key, + fieldType: uint32Type, + numericVal: int64(val), + } +} + +// Uint64 adds a uint64-valued key:value pair to a Span.LogFields() record +func Uint64(key string, val uint64) Field { + return Field{ + key: key, + fieldType: uint64Type, + numericVal: int64(val), + } +} + +// Float32 adds a float32-valued key:value pair to a Span.LogFields() record +func Float32(key string, val float32) Field { + return Field{ + key: key, + fieldType: float32Type, + numericVal: int64(math.Float32bits(val)), + } +} + +// Float64 adds a float64-valued key:value pair to a Span.LogFields() record +func Float64(key string, val float64) Field { + return Field{ + key: key, + fieldType: float64Type, + numericVal: int64(math.Float64bits(val)), + } +} + +// Error adds an error with the key "error.object" to a Span.LogFields() record +func Error(err error) Field { + return Field{ + key: "error.object", + fieldType: errorType, + interfaceVal: err, + } +} + +// Object adds an object-valued key:value pair to a Span.LogFields() record +// Please pass in an immutable object, otherwise there may be concurrency issues. +// Such as passing in the map, log.Object may result in "fatal error: concurrent map iteration and map write". +// Because span is sent asynchronously, it is possible that this map will also be modified. +func Object(key string, obj interface{}) Field { + return Field{ + key: key, + fieldType: objectType, + interfaceVal: obj, + } +} + +// Event creates a string-valued Field for span logs with key="event" and value=val. +func Event(val string) Field { + return String("event", val) +} + +// Message creates a string-valued Field for span logs with key="message" and value=val. +func Message(val string) Field { + return String("message", val) +} + +// LazyLogger allows for user-defined, late-bound logging of arbitrary data +type LazyLogger func(fv Encoder) + +// Lazy adds a LazyLogger to a Span.LogFields() record; the tracing +// implementation will call the LazyLogger function at an indefinite time in +// the future (after Lazy() returns). +func Lazy(ll LazyLogger) Field { + return Field{ + fieldType: lazyLoggerType, + interfaceVal: ll, + } +} + +// Noop creates a no-op log field that should be ignored by the tracer. +// It can be used to capture optional fields, for example those that should +// only be logged in non-production environment: +// +// func customerField(order *Order) log.Field { +// if os.Getenv("ENVIRONMENT") == "dev" { +// return log.String("customer", order.Customer.ID) +// } +// return log.Noop() +// } +// +// span.LogFields(log.String("event", "purchase"), customerField(order)) +// +func Noop() Field { + return Field{ + fieldType: noopType, + } +} + +// Encoder allows access to the contents of a Field (via a call to +// Field.Marshal). +// +// Tracer implementations typically provide an implementation of Encoder; +// OpenTracing callers typically do not need to concern themselves with it. +type Encoder interface { + EmitString(key, value string) + EmitBool(key string, value bool) + EmitInt(key string, value int) + EmitInt32(key string, value int32) + EmitInt64(key string, value int64) + EmitUint32(key string, value uint32) + EmitUint64(key string, value uint64) + EmitFloat32(key string, value float32) + EmitFloat64(key string, value float64) + EmitObject(key string, value interface{}) + EmitLazyLogger(value LazyLogger) +} + +// Marshal passes a Field instance through to the appropriate +// field-type-specific method of an Encoder. +func (lf Field) Marshal(visitor Encoder) { + switch lf.fieldType { + case stringType: + visitor.EmitString(lf.key, lf.stringVal) + case boolType: + visitor.EmitBool(lf.key, lf.numericVal != 0) + case intType: + visitor.EmitInt(lf.key, int(lf.numericVal)) + case int32Type: + visitor.EmitInt32(lf.key, int32(lf.numericVal)) + case int64Type: + visitor.EmitInt64(lf.key, int64(lf.numericVal)) + case uint32Type: + visitor.EmitUint32(lf.key, uint32(lf.numericVal)) + case uint64Type: + visitor.EmitUint64(lf.key, uint64(lf.numericVal)) + case float32Type: + visitor.EmitFloat32(lf.key, math.Float32frombits(uint32(lf.numericVal))) + case float64Type: + visitor.EmitFloat64(lf.key, math.Float64frombits(uint64(lf.numericVal))) + case errorType: + if err, ok := lf.interfaceVal.(error); ok { + visitor.EmitString(lf.key, err.Error()) + } else { + visitor.EmitString(lf.key, "") + } + case objectType: + visitor.EmitObject(lf.key, lf.interfaceVal) + case lazyLoggerType: + visitor.EmitLazyLogger(lf.interfaceVal.(LazyLogger)) + case noopType: + // intentionally left blank + } +} + +// Key returns the field's key. +func (lf Field) Key() string { + return lf.key +} + +// Value returns the field's value as interface{}. +func (lf Field) Value() interface{} { + switch lf.fieldType { + case stringType: + return lf.stringVal + case boolType: + return lf.numericVal != 0 + case intType: + return int(lf.numericVal) + case int32Type: + return int32(lf.numericVal) + case int64Type: + return int64(lf.numericVal) + case uint32Type: + return uint32(lf.numericVal) + case uint64Type: + return uint64(lf.numericVal) + case float32Type: + return math.Float32frombits(uint32(lf.numericVal)) + case float64Type: + return math.Float64frombits(uint64(lf.numericVal)) + case errorType, objectType, lazyLoggerType: + return lf.interfaceVal + case noopType: + return nil + default: + return nil + } +} + +// String returns a string representation of the key and value. +func (lf Field) String() string { + return fmt.Sprint(lf.key, ":", lf.Value()) +} diff --git a/vendor/github.com/opentracing/opentracing-go/log/util.go b/vendor/github.com/opentracing/opentracing-go/log/util.go new file mode 100644 index 00000000..d57e28aa --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/log/util.go @@ -0,0 +1,61 @@ +package log + +import ( + "fmt" + "reflect" +) + +// InterleavedKVToFields converts keyValues a la Span.LogKV() to a Field slice +// a la Span.LogFields(). +func InterleavedKVToFields(keyValues ...interface{}) ([]Field, error) { + if len(keyValues)%2 != 0 { + return nil, fmt.Errorf("non-even keyValues len: %d", len(keyValues)) + } + fields := make([]Field, len(keyValues)/2) + for i := 0; i*2 < len(keyValues); i++ { + key, ok := keyValues[i*2].(string) + if !ok { + return nil, fmt.Errorf( + "non-string key (pair #%d): %T", + i, keyValues[i*2]) + } + switch typedVal := keyValues[i*2+1].(type) { + case bool: + fields[i] = Bool(key, typedVal) + case string: + fields[i] = String(key, typedVal) + case int: + fields[i] = Int(key, typedVal) + case int8: + fields[i] = Int32(key, int32(typedVal)) + case int16: + fields[i] = Int32(key, int32(typedVal)) + case int32: + fields[i] = Int32(key, typedVal) + case int64: + fields[i] = Int64(key, typedVal) + case uint: + fields[i] = Uint64(key, uint64(typedVal)) + case uint64: + fields[i] = Uint64(key, typedVal) + case uint8: + fields[i] = Uint32(key, uint32(typedVal)) + case uint16: + fields[i] = Uint32(key, uint32(typedVal)) + case uint32: + fields[i] = Uint32(key, typedVal) + case float32: + fields[i] = Float32(key, typedVal) + case float64: + fields[i] = Float64(key, typedVal) + default: + if typedVal == nil || (reflect.ValueOf(typedVal).Kind() == reflect.Ptr && reflect.ValueOf(typedVal).IsNil()) { + fields[i] = String(key, "nil") + continue + } + // When in doubt, coerce to a string + fields[i] = String(key, fmt.Sprint(typedVal)) + } + } + return fields, nil +} diff --git a/vendor/github.com/opentracing/opentracing-go/mocktracer/mocklogrecord.go b/vendor/github.com/opentracing/opentracing-go/mocktracer/mocklogrecord.go new file mode 100644 index 00000000..2ce96d9d --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/mocktracer/mocklogrecord.go @@ -0,0 +1,105 @@ +package mocktracer + +import ( + "fmt" + "reflect" + "time" + + "github.com/opentracing/opentracing-go/log" +) + +// MockLogRecord represents data logged to a Span via Span.LogFields or +// Span.LogKV. +type MockLogRecord struct { + Timestamp time.Time + Fields []MockKeyValue +} + +// MockKeyValue represents a single key:value pair. +type MockKeyValue struct { + Key string + + // All MockLogRecord values are coerced to strings via fmt.Sprint(), though + // we retain their type separately. + ValueKind reflect.Kind + ValueString string +} + +// EmitString belongs to the log.Encoder interface +func (m *MockKeyValue) EmitString(key, value string) { + m.Key = key + m.ValueKind = reflect.TypeOf(value).Kind() + m.ValueString = fmt.Sprint(value) +} + +// EmitBool belongs to the log.Encoder interface +func (m *MockKeyValue) EmitBool(key string, value bool) { + m.Key = key + m.ValueKind = reflect.TypeOf(value).Kind() + m.ValueString = fmt.Sprint(value) +} + +// EmitInt belongs to the log.Encoder interface +func (m *MockKeyValue) EmitInt(key string, value int) { + m.Key = key + m.ValueKind = reflect.TypeOf(value).Kind() + m.ValueString = fmt.Sprint(value) +} + +// EmitInt32 belongs to the log.Encoder interface +func (m *MockKeyValue) EmitInt32(key string, value int32) { + m.Key = key + m.ValueKind = reflect.TypeOf(value).Kind() + m.ValueString = fmt.Sprint(value) +} + +// EmitInt64 belongs to the log.Encoder interface +func (m *MockKeyValue) EmitInt64(key string, value int64) { + m.Key = key + m.ValueKind = reflect.TypeOf(value).Kind() + m.ValueString = fmt.Sprint(value) +} + +// EmitUint32 belongs to the log.Encoder interface +func (m *MockKeyValue) EmitUint32(key string, value uint32) { + m.Key = key + m.ValueKind = reflect.TypeOf(value).Kind() + m.ValueString = fmt.Sprint(value) +} + +// EmitUint64 belongs to the log.Encoder interface +func (m *MockKeyValue) EmitUint64(key string, value uint64) { + m.Key = key + m.ValueKind = reflect.TypeOf(value).Kind() + m.ValueString = fmt.Sprint(value) +} + +// EmitFloat32 belongs to the log.Encoder interface +func (m *MockKeyValue) EmitFloat32(key string, value float32) { + m.Key = key + m.ValueKind = reflect.TypeOf(value).Kind() + m.ValueString = fmt.Sprint(value) +} + +// EmitFloat64 belongs to the log.Encoder interface +func (m *MockKeyValue) EmitFloat64(key string, value float64) { + m.Key = key + m.ValueKind = reflect.TypeOf(value).Kind() + m.ValueString = fmt.Sprint(value) +} + +// EmitObject belongs to the log.Encoder interface +func (m *MockKeyValue) EmitObject(key string, value interface{}) { + m.Key = key + m.ValueKind = reflect.TypeOf(value).Kind() + m.ValueString = fmt.Sprint(value) +} + +// EmitLazyLogger belongs to the log.Encoder interface +func (m *MockKeyValue) EmitLazyLogger(value log.LazyLogger) { + var meta MockKeyValue + value(&meta) + m.Key = meta.Key + m.ValueKind = meta.ValueKind + m.ValueString = meta.ValueString +} diff --git a/vendor/github.com/opentracing/opentracing-go/mocktracer/mockspan.go b/vendor/github.com/opentracing/opentracing-go/mocktracer/mockspan.go new file mode 100644 index 00000000..8c7932ce --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/mocktracer/mockspan.go @@ -0,0 +1,284 @@ +package mocktracer + +import ( + "fmt" + "sync" + "sync/atomic" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + "github.com/opentracing/opentracing-go/log" +) + +// MockSpanContext is an opentracing.SpanContext implementation. +// +// It is entirely unsuitable for production use, but appropriate for tests +// that want to verify tracing behavior in other frameworks/applications. +// +// By default all spans have Sampled=true flag, unless {"sampling.priority": 0} +// tag is set. +type MockSpanContext struct { + TraceID int + SpanID int + Sampled bool + Baggage map[string]string +} + +var mockIDSource = uint32(42) + +func nextMockID() int { + return int(atomic.AddUint32(&mockIDSource, 1)) +} + +// ForeachBaggageItem belongs to the SpanContext interface +func (c MockSpanContext) ForeachBaggageItem(handler func(k, v string) bool) { + for k, v := range c.Baggage { + if !handler(k, v) { + break + } + } +} + +// WithBaggageItem creates a new context with an extra baggage item. +func (c MockSpanContext) WithBaggageItem(key, value string) MockSpanContext { + var newBaggage map[string]string + if c.Baggage == nil { + newBaggage = map[string]string{key: value} + } else { + newBaggage = make(map[string]string, len(c.Baggage)+1) + for k, v := range c.Baggage { + newBaggage[k] = v + } + newBaggage[key] = value + } + // Use positional parameters so the compiler will help catch new fields. + return MockSpanContext{c.TraceID, c.SpanID, c.Sampled, newBaggage} +} + +// MockSpan is an opentracing.Span implementation that exports its internal +// state for testing purposes. +type MockSpan struct { + sync.RWMutex + + ParentID int + + OperationName string + StartTime time.Time + FinishTime time.Time + + // All of the below are protected by the embedded RWMutex. + SpanContext MockSpanContext + tags map[string]interface{} + logs []MockLogRecord + tracer *MockTracer +} + +func newMockSpan(t *MockTracer, name string, opts opentracing.StartSpanOptions) *MockSpan { + tags := opts.Tags + if tags == nil { + tags = map[string]interface{}{} + } + traceID := nextMockID() + parentID := int(0) + var baggage map[string]string + sampled := true + if len(opts.References) > 0 { + traceID = opts.References[0].ReferencedContext.(MockSpanContext).TraceID + parentID = opts.References[0].ReferencedContext.(MockSpanContext).SpanID + sampled = opts.References[0].ReferencedContext.(MockSpanContext).Sampled + baggage = opts.References[0].ReferencedContext.(MockSpanContext).Baggage + } + spanContext := MockSpanContext{traceID, nextMockID(), sampled, baggage} + startTime := opts.StartTime + if startTime.IsZero() { + startTime = time.Now() + } + return &MockSpan{ + ParentID: parentID, + OperationName: name, + StartTime: startTime, + tags: tags, + logs: []MockLogRecord{}, + SpanContext: spanContext, + + tracer: t, + } +} + +// Tags returns a copy of tags accumulated by the span so far +func (s *MockSpan) Tags() map[string]interface{} { + s.RLock() + defer s.RUnlock() + tags := make(map[string]interface{}) + for k, v := range s.tags { + tags[k] = v + } + return tags +} + +// Tag returns a single tag +func (s *MockSpan) Tag(k string) interface{} { + s.RLock() + defer s.RUnlock() + return s.tags[k] +} + +// Logs returns a copy of logs accumulated in the span so far +func (s *MockSpan) Logs() []MockLogRecord { + s.RLock() + defer s.RUnlock() + logs := make([]MockLogRecord, len(s.logs)) + copy(logs, s.logs) + return logs +} + +// Context belongs to the Span interface +func (s *MockSpan) Context() opentracing.SpanContext { + s.Lock() + defer s.Unlock() + return s.SpanContext +} + +// SetTag belongs to the Span interface +func (s *MockSpan) SetTag(key string, value interface{}) opentracing.Span { + s.Lock() + defer s.Unlock() + if key == string(ext.SamplingPriority) { + if v, ok := value.(uint16); ok { + s.SpanContext.Sampled = v > 0 + return s + } + if v, ok := value.(int); ok { + s.SpanContext.Sampled = v > 0 + return s + } + } + s.tags[key] = value + return s +} + +// SetBaggageItem belongs to the Span interface +func (s *MockSpan) SetBaggageItem(key, val string) opentracing.Span { + s.Lock() + defer s.Unlock() + s.SpanContext = s.SpanContext.WithBaggageItem(key, val) + return s +} + +// BaggageItem belongs to the Span interface +func (s *MockSpan) BaggageItem(key string) string { + s.RLock() + defer s.RUnlock() + return s.SpanContext.Baggage[key] +} + +// Finish belongs to the Span interface +func (s *MockSpan) Finish() { + s.Lock() + s.FinishTime = time.Now() + s.Unlock() + s.tracer.recordSpan(s) +} + +// FinishWithOptions belongs to the Span interface +func (s *MockSpan) FinishWithOptions(opts opentracing.FinishOptions) { + s.Lock() + s.FinishTime = opts.FinishTime + s.Unlock() + + // Handle any late-bound LogRecords. + for _, lr := range opts.LogRecords { + s.logFieldsWithTimestamp(lr.Timestamp, lr.Fields...) + } + // Handle (deprecated) BulkLogData. + for _, ld := range opts.BulkLogData { + if ld.Payload != nil { + s.logFieldsWithTimestamp( + ld.Timestamp, + log.String("event", ld.Event), + log.Object("payload", ld.Payload)) + } else { + s.logFieldsWithTimestamp( + ld.Timestamp, + log.String("event", ld.Event)) + } + } + + s.tracer.recordSpan(s) +} + +// String allows printing span for debugging +func (s *MockSpan) String() string { + return fmt.Sprintf( + "traceId=%d, spanId=%d, parentId=%d, sampled=%t, name=%s", + s.SpanContext.TraceID, s.SpanContext.SpanID, s.ParentID, + s.SpanContext.Sampled, s.OperationName) +} + +// LogFields belongs to the Span interface +func (s *MockSpan) LogFields(fields ...log.Field) { + s.logFieldsWithTimestamp(time.Now(), fields...) +} + +// The caller MUST NOT hold s.Lock +func (s *MockSpan) logFieldsWithTimestamp(ts time.Time, fields ...log.Field) { + lr := MockLogRecord{ + Timestamp: ts, + Fields: make([]MockKeyValue, len(fields)), + } + for i, f := range fields { + outField := &(lr.Fields[i]) + f.Marshal(outField) + } + + s.Lock() + defer s.Unlock() + s.logs = append(s.logs, lr) +} + +// LogKV belongs to the Span interface. +// +// This implementations coerces all "values" to strings, though that is not +// something all implementations need to do. Indeed, a motivated person can and +// probably should have this do a typed switch on the values. +func (s *MockSpan) LogKV(keyValues ...interface{}) { + if len(keyValues)%2 != 0 { + s.LogFields(log.Error(fmt.Errorf("Non-even keyValues len: %v", len(keyValues)))) + return + } + fields, err := log.InterleavedKVToFields(keyValues...) + if err != nil { + s.LogFields(log.Error(err), log.String("function", "LogKV")) + return + } + s.LogFields(fields...) +} + +// LogEvent belongs to the Span interface +func (s *MockSpan) LogEvent(event string) { + s.LogFields(log.String("event", event)) +} + +// LogEventWithPayload belongs to the Span interface +func (s *MockSpan) LogEventWithPayload(event string, payload interface{}) { + s.LogFields(log.String("event", event), log.Object("payload", payload)) +} + +// Log belongs to the Span interface +func (s *MockSpan) Log(data opentracing.LogData) { + panic("MockSpan.Log() no longer supported") +} + +// SetOperationName belongs to the Span interface +func (s *MockSpan) SetOperationName(operationName string) opentracing.Span { + s.Lock() + defer s.Unlock() + s.OperationName = operationName + return s +} + +// Tracer belongs to the Span interface +func (s *MockSpan) Tracer() opentracing.Tracer { + return s.tracer +} diff --git a/vendor/github.com/opentracing/opentracing-go/mocktracer/mocktracer.go b/vendor/github.com/opentracing/opentracing-go/mocktracer/mocktracer.go new file mode 100644 index 00000000..4533da7b --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/mocktracer/mocktracer.go @@ -0,0 +1,105 @@ +package mocktracer + +import ( + "sync" + + "github.com/opentracing/opentracing-go" +) + +// New returns a MockTracer opentracing.Tracer implementation that's intended +// to facilitate tests of OpenTracing instrumentation. +func New() *MockTracer { + t := &MockTracer{ + finishedSpans: []*MockSpan{}, + injectors: make(map[interface{}]Injector), + extractors: make(map[interface{}]Extractor), + } + + // register default injectors/extractors + textPropagator := new(TextMapPropagator) + t.RegisterInjector(opentracing.TextMap, textPropagator) + t.RegisterExtractor(opentracing.TextMap, textPropagator) + + httpPropagator := &TextMapPropagator{HTTPHeaders: true} + t.RegisterInjector(opentracing.HTTPHeaders, httpPropagator) + t.RegisterExtractor(opentracing.HTTPHeaders, httpPropagator) + + return t +} + +// MockTracer is only intended for testing OpenTracing instrumentation. +// +// It is entirely unsuitable for production use, but appropriate for tests +// that want to verify tracing behavior in other frameworks/applications. +type MockTracer struct { + sync.RWMutex + finishedSpans []*MockSpan + injectors map[interface{}]Injector + extractors map[interface{}]Extractor +} + +// FinishedSpans returns all spans that have been Finish()'ed since the +// MockTracer was constructed or since the last call to its Reset() method. +func (t *MockTracer) FinishedSpans() []*MockSpan { + t.RLock() + defer t.RUnlock() + spans := make([]*MockSpan, len(t.finishedSpans)) + copy(spans, t.finishedSpans) + return spans +} + +// Reset clears the internally accumulated finished spans. Note that any +// extant MockSpans will still append to finishedSpans when they Finish(), +// even after a call to Reset(). +func (t *MockTracer) Reset() { + t.Lock() + defer t.Unlock() + t.finishedSpans = []*MockSpan{} +} + +// StartSpan belongs to the Tracer interface. +func (t *MockTracer) StartSpan(operationName string, opts ...opentracing.StartSpanOption) opentracing.Span { + sso := opentracing.StartSpanOptions{} + for _, o := range opts { + o.Apply(&sso) + } + return newMockSpan(t, operationName, sso) +} + +// RegisterInjector registers injector for given format +func (t *MockTracer) RegisterInjector(format interface{}, injector Injector) { + t.injectors[format] = injector +} + +// RegisterExtractor registers extractor for given format +func (t *MockTracer) RegisterExtractor(format interface{}, extractor Extractor) { + t.extractors[format] = extractor +} + +// Inject belongs to the Tracer interface. +func (t *MockTracer) Inject(sm opentracing.SpanContext, format interface{}, carrier interface{}) error { + spanContext, ok := sm.(MockSpanContext) + if !ok { + return opentracing.ErrInvalidSpanContext + } + injector, ok := t.injectors[format] + if !ok { + return opentracing.ErrUnsupportedFormat + } + return injector.Inject(spanContext, carrier) +} + +// Extract belongs to the Tracer interface. +func (t *MockTracer) Extract(format interface{}, carrier interface{}) (opentracing.SpanContext, error) { + extractor, ok := t.extractors[format] + if !ok { + return nil, opentracing.ErrUnsupportedFormat + } + return extractor.Extract(carrier) +} + +func (t *MockTracer) recordSpan(span *MockSpan) { + t.Lock() + defer t.Unlock() + t.finishedSpans = append(t.finishedSpans, span) +} diff --git a/vendor/github.com/opentracing/opentracing-go/mocktracer/propagation.go b/vendor/github.com/opentracing/opentracing-go/mocktracer/propagation.go new file mode 100644 index 00000000..8364f1d1 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/mocktracer/propagation.go @@ -0,0 +1,120 @@ +package mocktracer + +import ( + "fmt" + "net/url" + "strconv" + "strings" + + "github.com/opentracing/opentracing-go" +) + +const mockTextMapIdsPrefix = "mockpfx-ids-" +const mockTextMapBaggagePrefix = "mockpfx-baggage-" + +var emptyContext = MockSpanContext{} + +// Injector is responsible for injecting SpanContext instances in a manner suitable +// for propagation via a format-specific "carrier" object. Typically the +// injection will take place across an RPC boundary, but message queues and +// other IPC mechanisms are also reasonable places to use an Injector. +type Injector interface { + // Inject takes `SpanContext` and injects it into `carrier`. The actual type + // of `carrier` depends on the `format` passed to `Tracer.Inject()`. + // + // Implementations may return opentracing.ErrInvalidCarrier or any other + // implementation-specific error if injection fails. + Inject(ctx MockSpanContext, carrier interface{}) error +} + +// Extractor is responsible for extracting SpanContext instances from a +// format-specific "carrier" object. Typically the extraction will take place +// on the server side of an RPC boundary, but message queues and other IPC +// mechanisms are also reasonable places to use an Extractor. +type Extractor interface { + // Extract decodes a SpanContext instance from the given `carrier`, + // or (nil, opentracing.ErrSpanContextNotFound) if no context could + // be found in the `carrier`. + Extract(carrier interface{}) (MockSpanContext, error) +} + +// TextMapPropagator implements Injector/Extractor for TextMap and HTTPHeaders formats. +type TextMapPropagator struct { + HTTPHeaders bool +} + +// Inject implements the Injector interface +func (t *TextMapPropagator) Inject(spanContext MockSpanContext, carrier interface{}) error { + writer, ok := carrier.(opentracing.TextMapWriter) + if !ok { + return opentracing.ErrInvalidCarrier + } + // Ids: + writer.Set(mockTextMapIdsPrefix+"traceid", strconv.Itoa(spanContext.TraceID)) + writer.Set(mockTextMapIdsPrefix+"spanid", strconv.Itoa(spanContext.SpanID)) + writer.Set(mockTextMapIdsPrefix+"sampled", fmt.Sprint(spanContext.Sampled)) + // Baggage: + for baggageKey, baggageVal := range spanContext.Baggage { + safeVal := baggageVal + if t.HTTPHeaders { + safeVal = url.QueryEscape(baggageVal) + } + writer.Set(mockTextMapBaggagePrefix+baggageKey, safeVal) + } + return nil +} + +// Extract implements the Extractor interface +func (t *TextMapPropagator) Extract(carrier interface{}) (MockSpanContext, error) { + reader, ok := carrier.(opentracing.TextMapReader) + if !ok { + return emptyContext, opentracing.ErrInvalidCarrier + } + rval := MockSpanContext{0, 0, true, nil} + err := reader.ForeachKey(func(key, val string) error { + lowerKey := strings.ToLower(key) + switch { + case lowerKey == mockTextMapIdsPrefix+"traceid": + // Ids: + i, err := strconv.Atoi(val) + if err != nil { + return err + } + rval.TraceID = i + case lowerKey == mockTextMapIdsPrefix+"spanid": + // Ids: + i, err := strconv.Atoi(val) + if err != nil { + return err + } + rval.SpanID = i + case lowerKey == mockTextMapIdsPrefix+"sampled": + b, err := strconv.ParseBool(val) + if err != nil { + return err + } + rval.Sampled = b + case strings.HasPrefix(lowerKey, mockTextMapBaggagePrefix): + // Baggage: + if rval.Baggage == nil { + rval.Baggage = make(map[string]string) + } + safeVal := val + if t.HTTPHeaders { + // unescape errors are ignored, nothing can be done + if rawVal, err := url.QueryUnescape(val); err == nil { + safeVal = rawVal + } + } + rval.Baggage[lowerKey[len(mockTextMapBaggagePrefix):]] = safeVal + } + return nil + }) + if rval.TraceID == 0 || rval.SpanID == 0 { + return emptyContext, opentracing.ErrSpanContextNotFound + } + if err != nil { + return emptyContext, err + } + return rval, nil +} diff --git a/vendor/github.com/opentracing/opentracing-go/noop.go b/vendor/github.com/opentracing/opentracing-go/noop.go new file mode 100644 index 00000000..f9b680a2 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/noop.go @@ -0,0 +1,64 @@ +package opentracing + +import "github.com/opentracing/opentracing-go/log" + +// A NoopTracer is a trivial, minimum overhead implementation of Tracer +// for which all operations are no-ops. +// +// The primary use of this implementation is in libraries, such as RPC +// frameworks, that make tracing an optional feature controlled by the +// end user. A no-op implementation allows said libraries to use it +// as the default Tracer and to write instrumentation that does +// not need to keep checking if the tracer instance is nil. +// +// For the same reason, the NoopTracer is the default "global" tracer +// (see GlobalTracer and SetGlobalTracer functions). +// +// WARNING: NoopTracer does not support baggage propagation. +type NoopTracer struct{} + +type noopSpan struct{} +type noopSpanContext struct{} + +var ( + defaultNoopSpanContext SpanContext = noopSpanContext{} + defaultNoopSpan Span = noopSpan{} + defaultNoopTracer Tracer = NoopTracer{} +) + +const ( + emptyString = "" +) + +// noopSpanContext: +func (n noopSpanContext) ForeachBaggageItem(handler func(k, v string) bool) {} + +// noopSpan: +func (n noopSpan) Context() SpanContext { return defaultNoopSpanContext } +func (n noopSpan) SetBaggageItem(key, val string) Span { return n } +func (n noopSpan) BaggageItem(key string) string { return emptyString } +func (n noopSpan) SetTag(key string, value interface{}) Span { return n } +func (n noopSpan) LogFields(fields ...log.Field) {} +func (n noopSpan) LogKV(keyVals ...interface{}) {} +func (n noopSpan) Finish() {} +func (n noopSpan) FinishWithOptions(opts FinishOptions) {} +func (n noopSpan) SetOperationName(operationName string) Span { return n } +func (n noopSpan) Tracer() Tracer { return defaultNoopTracer } +func (n noopSpan) LogEvent(event string) {} +func (n noopSpan) LogEventWithPayload(event string, payload interface{}) {} +func (n noopSpan) Log(data LogData) {} + +// StartSpan belongs to the Tracer interface. +func (n NoopTracer) StartSpan(operationName string, opts ...StartSpanOption) Span { + return defaultNoopSpan +} + +// Inject belongs to the Tracer interface. +func (n NoopTracer) Inject(sp SpanContext, format interface{}, carrier interface{}) error { + return nil +} + +// Extract belongs to the Tracer interface. +func (n NoopTracer) Extract(format interface{}, carrier interface{}) (SpanContext, error) { + return nil, ErrSpanContextNotFound +} diff --git a/vendor/github.com/opentracing/opentracing-go/propagation.go b/vendor/github.com/opentracing/opentracing-go/propagation.go new file mode 100644 index 00000000..b0c275eb --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/propagation.go @@ -0,0 +1,176 @@ +package opentracing + +import ( + "errors" + "net/http" +) + +/////////////////////////////////////////////////////////////////////////////// +// CORE PROPAGATION INTERFACES: +/////////////////////////////////////////////////////////////////////////////// + +var ( + // ErrUnsupportedFormat occurs when the `format` passed to Tracer.Inject() or + // Tracer.Extract() is not recognized by the Tracer implementation. + ErrUnsupportedFormat = errors.New("opentracing: Unknown or unsupported Inject/Extract format") + + // ErrSpanContextNotFound occurs when the `carrier` passed to + // Tracer.Extract() is valid and uncorrupted but has insufficient + // information to extract a SpanContext. + ErrSpanContextNotFound = errors.New("opentracing: SpanContext not found in Extract carrier") + + // ErrInvalidSpanContext errors occur when Tracer.Inject() is asked to + // operate on a SpanContext which it is not prepared to handle (for + // example, since it was created by a different tracer implementation). + ErrInvalidSpanContext = errors.New("opentracing: SpanContext type incompatible with tracer") + + // ErrInvalidCarrier errors occur when Tracer.Inject() or Tracer.Extract() + // implementations expect a different type of `carrier` than they are + // given. + ErrInvalidCarrier = errors.New("opentracing: Invalid Inject/Extract carrier") + + // ErrSpanContextCorrupted occurs when the `carrier` passed to + // Tracer.Extract() is of the expected type but is corrupted. + ErrSpanContextCorrupted = errors.New("opentracing: SpanContext data corrupted in Extract carrier") +) + +/////////////////////////////////////////////////////////////////////////////// +// BUILTIN PROPAGATION FORMATS: +/////////////////////////////////////////////////////////////////////////////// + +// BuiltinFormat is used to demarcate the values within package `opentracing` +// that are intended for use with the Tracer.Inject() and Tracer.Extract() +// methods. +type BuiltinFormat byte + +const ( + // Binary represents SpanContexts as opaque binary data. + // + // For Tracer.Inject(): the carrier must be an `io.Writer`. + // + // For Tracer.Extract(): the carrier must be an `io.Reader`. + Binary BuiltinFormat = iota + + // TextMap represents SpanContexts as key:value string pairs. + // + // Unlike HTTPHeaders, the TextMap format does not restrict the key or + // value character sets in any way. + // + // For Tracer.Inject(): the carrier must be a `TextMapWriter`. + // + // For Tracer.Extract(): the carrier must be a `TextMapReader`. + TextMap + + // HTTPHeaders represents SpanContexts as HTTP header string pairs. + // + // Unlike TextMap, the HTTPHeaders format requires that the keys and values + // be valid as HTTP headers as-is (i.e., character casing may be unstable + // and special characters are disallowed in keys, values should be + // URL-escaped, etc). + // + // For Tracer.Inject(): the carrier must be a `TextMapWriter`. + // + // For Tracer.Extract(): the carrier must be a `TextMapReader`. + // + // See HTTPHeadersCarrier for an implementation of both TextMapWriter + // and TextMapReader that defers to an http.Header instance for storage. + // For example, Inject(): + // + // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) + // err := span.Tracer().Inject( + // span.Context(), opentracing.HTTPHeaders, carrier) + // + // Or Extract(): + // + // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) + // clientContext, err := tracer.Extract( + // opentracing.HTTPHeaders, carrier) + // + HTTPHeaders +) + +// TextMapWriter is the Inject() carrier for the TextMap builtin format. With +// it, the caller can encode a SpanContext for propagation as entries in a map +// of unicode strings. +type TextMapWriter interface { + // Set a key:value pair to the carrier. Multiple calls to Set() for the + // same key leads to undefined behavior. + // + // NOTE: The backing store for the TextMapWriter may contain data unrelated + // to SpanContext. As such, Inject() and Extract() implementations that + // call the TextMapWriter and TextMapReader interfaces must agree on a + // prefix or other convention to distinguish their own key:value pairs. + Set(key, val string) +} + +// TextMapReader is the Extract() carrier for the TextMap builtin format. With it, +// the caller can decode a propagated SpanContext as entries in a map of +// unicode strings. +type TextMapReader interface { + // ForeachKey returns TextMap contents via repeated calls to the `handler` + // function. If any call to `handler` returns a non-nil error, ForeachKey + // terminates and returns that error. + // + // NOTE: The backing store for the TextMapReader may contain data unrelated + // to SpanContext. As such, Inject() and Extract() implementations that + // call the TextMapWriter and TextMapReader interfaces must agree on a + // prefix or other convention to distinguish their own key:value pairs. + // + // The "foreach" callback pattern reduces unnecessary copying in some cases + // and also allows implementations to hold locks while the map is read. + ForeachKey(handler func(key, val string) error) error +} + +// TextMapCarrier allows the use of regular map[string]string +// as both TextMapWriter and TextMapReader. +type TextMapCarrier map[string]string + +// ForeachKey conforms to the TextMapReader interface. +func (c TextMapCarrier) ForeachKey(handler func(key, val string) error) error { + for k, v := range c { + if err := handler(k, v); err != nil { + return err + } + } + return nil +} + +// Set implements Set() of opentracing.TextMapWriter +func (c TextMapCarrier) Set(key, val string) { + c[key] = val +} + +// HTTPHeadersCarrier satisfies both TextMapWriter and TextMapReader. +// +// Example usage for server side: +// +// carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) +// clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier) +// +// Example usage for client side: +// +// carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) +// err := tracer.Inject( +// span.Context(), +// opentracing.HTTPHeaders, +// carrier) +// +type HTTPHeadersCarrier http.Header + +// Set conforms to the TextMapWriter interface. +func (c HTTPHeadersCarrier) Set(key, val string) { + h := http.Header(c) + h.Set(key, val) +} + +// ForeachKey conforms to the TextMapReader interface. +func (c HTTPHeadersCarrier) ForeachKey(handler func(key, val string) error) error { + for k, vals := range c { + for _, v := range vals { + if err := handler(k, v); err != nil { + return err + } + } + } + return nil +} diff --git a/vendor/github.com/opentracing/opentracing-go/span.go b/vendor/github.com/opentracing/opentracing-go/span.go new file mode 100644 index 00000000..0d3fb534 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/span.go @@ -0,0 +1,189 @@ +package opentracing + +import ( + "time" + + "github.com/opentracing/opentracing-go/log" +) + +// SpanContext represents Span state that must propagate to descendant Spans and across process +// boundaries (e.g., a tuple). +type SpanContext interface { + // ForeachBaggageItem grants access to all baggage items stored in the + // SpanContext. + // The handler function will be called for each baggage key/value pair. + // The ordering of items is not guaranteed. + // + // The bool return value indicates if the handler wants to continue iterating + // through the rest of the baggage items; for example if the handler is trying to + // find some baggage item by pattern matching the name, it can return false + // as soon as the item is found to stop further iterations. + ForeachBaggageItem(handler func(k, v string) bool) +} + +// Span represents an active, un-finished span in the OpenTracing system. +// +// Spans are created by the Tracer interface. +type Span interface { + // Sets the end timestamp and finalizes Span state. + // + // With the exception of calls to Context() (which are always allowed), + // Finish() must be the last call made to any span instance, and to do + // otherwise leads to undefined behavior. + Finish() + // FinishWithOptions is like Finish() but with explicit control over + // timestamps and log data. + FinishWithOptions(opts FinishOptions) + + // Context() yields the SpanContext for this Span. Note that the return + // value of Context() is still valid after a call to Span.Finish(), as is + // a call to Span.Context() after a call to Span.Finish(). + Context() SpanContext + + // Sets or changes the operation name. + // + // Returns a reference to this Span for chaining. + SetOperationName(operationName string) Span + + // Adds a tag to the span. + // + // If there is a pre-existing tag set for `key`, it is overwritten. + // + // Tag values can be numeric types, strings, or bools. The behavior of + // other tag value types is undefined at the OpenTracing level. If a + // tracing system does not know how to handle a particular value type, it + // may ignore the tag, but shall not panic. + // + // Returns a reference to this Span for chaining. + SetTag(key string, value interface{}) Span + + // LogFields is an efficient and type-checked way to record key:value + // logging data about a Span, though the programming interface is a little + // more verbose than LogKV(). Here's an example: + // + // span.LogFields( + // log.String("event", "soft error"), + // log.String("type", "cache timeout"), + // log.Int("waited.millis", 1500)) + // + // Also see Span.FinishWithOptions() and FinishOptions.BulkLogData. + LogFields(fields ...log.Field) + + // LogKV is a concise, readable way to record key:value logging data about + // a Span, though unfortunately this also makes it less efficient and less + // type-safe than LogFields(). Here's an example: + // + // span.LogKV( + // "event", "soft error", + // "type", "cache timeout", + // "waited.millis", 1500) + // + // For LogKV (as opposed to LogFields()), the parameters must appear as + // key-value pairs, like + // + // span.LogKV(key1, val1, key2, val2, key3, val3, ...) + // + // The keys must all be strings. The values may be strings, numeric types, + // bools, Go error instances, or arbitrary structs. + // + // (Note to implementors: consider the log.InterleavedKVToFields() helper) + LogKV(alternatingKeyValues ...interface{}) + + // SetBaggageItem sets a key:value pair on this Span and its SpanContext + // that also propagates to descendants of this Span. + // + // SetBaggageItem() enables powerful functionality given a full-stack + // opentracing integration (e.g., arbitrary application data from a mobile + // app can make it, transparently, all the way into the depths of a storage + // system), and with it some powerful costs: use this feature with care. + // + // IMPORTANT NOTE #1: SetBaggageItem() will only propagate baggage items to + // *future* causal descendants of the associated Span. + // + // IMPORTANT NOTE #2: Use this thoughtfully and with care. Every key and + // value is copied into every local *and remote* child of the associated + // Span, and that can add up to a lot of network and cpu overhead. + // + // Returns a reference to this Span for chaining. + SetBaggageItem(restrictedKey, value string) Span + + // Gets the value for a baggage item given its key. Returns the empty string + // if the value isn't found in this Span. + BaggageItem(restrictedKey string) string + + // Provides access to the Tracer that created this Span. + Tracer() Tracer + + // Deprecated: use LogFields or LogKV + LogEvent(event string) + // Deprecated: use LogFields or LogKV + LogEventWithPayload(event string, payload interface{}) + // Deprecated: use LogFields or LogKV + Log(data LogData) +} + +// LogRecord is data associated with a single Span log. Every LogRecord +// instance must specify at least one Field. +type LogRecord struct { + Timestamp time.Time + Fields []log.Field +} + +// FinishOptions allows Span.FinishWithOptions callers to override the finish +// timestamp and provide log data via a bulk interface. +type FinishOptions struct { + // FinishTime overrides the Span's finish time, or implicitly becomes + // time.Now() if FinishTime.IsZero(). + // + // FinishTime must resolve to a timestamp that's >= the Span's StartTime + // (per StartSpanOptions). + FinishTime time.Time + + // LogRecords allows the caller to specify the contents of many LogFields() + // calls with a single slice. May be nil. + // + // None of the LogRecord.Timestamp values may be .IsZero() (i.e., they must + // be set explicitly). Also, they must be >= the Span's start timestamp and + // <= the FinishTime (or time.Now() if FinishTime.IsZero()). Otherwise the + // behavior of FinishWithOptions() is undefined. + // + // If specified, the caller hands off ownership of LogRecords at + // FinishWithOptions() invocation time. + // + // If specified, the (deprecated) BulkLogData must be nil or empty. + LogRecords []LogRecord + + // BulkLogData is DEPRECATED. + BulkLogData []LogData +} + +// LogData is DEPRECATED +type LogData struct { + Timestamp time.Time + Event string + Payload interface{} +} + +// ToLogRecord converts a deprecated LogData to a non-deprecated LogRecord +func (ld *LogData) ToLogRecord() LogRecord { + var literalTimestamp time.Time + if ld.Timestamp.IsZero() { + literalTimestamp = time.Now() + } else { + literalTimestamp = ld.Timestamp + } + rval := LogRecord{ + Timestamp: literalTimestamp, + } + if ld.Payload == nil { + rval.Fields = []log.Field{ + log.String("event", ld.Event), + } + } else { + rval.Fields = []log.Field{ + log.String("event", ld.Event), + log.Object("payload", ld.Payload), + } + } + return rval +} diff --git a/vendor/github.com/opentracing/opentracing-go/tracer.go b/vendor/github.com/opentracing/opentracing-go/tracer.go new file mode 100644 index 00000000..715f0ced --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/tracer.go @@ -0,0 +1,304 @@ +package opentracing + +import "time" + +// Tracer is a simple, thin interface for Span creation and SpanContext +// propagation. +type Tracer interface { + + // Create, start, and return a new Span with the given `operationName` and + // incorporate the given StartSpanOption `opts`. (Note that `opts` borrows + // from the "functional options" pattern, per + // http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis) + // + // A Span with no SpanReference options (e.g., opentracing.ChildOf() or + // opentracing.FollowsFrom()) becomes the root of its own trace. + // + // Examples: + // + // var tracer opentracing.Tracer = ... + // + // // The root-span case: + // sp := tracer.StartSpan("GetFeed") + // + // // The vanilla child span case: + // sp := tracer.StartSpan( + // "GetFeed", + // opentracing.ChildOf(parentSpan.Context())) + // + // // All the bells and whistles: + // sp := tracer.StartSpan( + // "GetFeed", + // opentracing.ChildOf(parentSpan.Context()), + // opentracing.Tag{"user_agent", loggedReq.UserAgent}, + // opentracing.StartTime(loggedReq.Timestamp), + // ) + // + StartSpan(operationName string, opts ...StartSpanOption) Span + + // Inject() takes the `sm` SpanContext instance and injects it for + // propagation within `carrier`. The actual type of `carrier` depends on + // the value of `format`. + // + // OpenTracing defines a common set of `format` values (see BuiltinFormat), + // and each has an expected carrier type. + // + // Other packages may declare their own `format` values, much like the keys + // used by `context.Context` (see https://godoc.org/context#WithValue). + // + // Example usage (sans error handling): + // + // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) + // err := tracer.Inject( + // span.Context(), + // opentracing.HTTPHeaders, + // carrier) + // + // NOTE: All opentracing.Tracer implementations MUST support all + // BuiltinFormats. + // + // Implementations may return opentracing.ErrUnsupportedFormat if `format` + // is not supported by (or not known by) the implementation. + // + // Implementations may return opentracing.ErrInvalidCarrier or any other + // implementation-specific error if the format is supported but injection + // fails anyway. + // + // See Tracer.Extract(). + Inject(sm SpanContext, format interface{}, carrier interface{}) error + + // Extract() returns a SpanContext instance given `format` and `carrier`. + // + // OpenTracing defines a common set of `format` values (see BuiltinFormat), + // and each has an expected carrier type. + // + // Other packages may declare their own `format` values, much like the keys + // used by `context.Context` (see + // https://godoc.org/golang.org/x/net/context#WithValue). + // + // Example usage (with StartSpan): + // + // + // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) + // clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier) + // + // // ... assuming the ultimate goal here is to resume the trace with a + // // server-side Span: + // var serverSpan opentracing.Span + // if err == nil { + // span = tracer.StartSpan( + // rpcMethodName, ext.RPCServerOption(clientContext)) + // } else { + // span = tracer.StartSpan(rpcMethodName) + // } + // + // + // NOTE: All opentracing.Tracer implementations MUST support all + // BuiltinFormats. + // + // Return values: + // - A successful Extract returns a SpanContext instance and a nil error + // - If there was simply no SpanContext to extract in `carrier`, Extract() + // returns (nil, opentracing.ErrSpanContextNotFound) + // - If `format` is unsupported or unrecognized, Extract() returns (nil, + // opentracing.ErrUnsupportedFormat) + // - If there are more fundamental problems with the `carrier` object, + // Extract() may return opentracing.ErrInvalidCarrier, + // opentracing.ErrSpanContextCorrupted, or implementation-specific + // errors. + // + // See Tracer.Inject(). + Extract(format interface{}, carrier interface{}) (SpanContext, error) +} + +// StartSpanOptions allows Tracer.StartSpan() callers and implementors a +// mechanism to override the start timestamp, specify Span References, and make +// a single Tag or multiple Tags available at Span start time. +// +// StartSpan() callers should look at the StartSpanOption interface and +// implementations available in this package. +// +// Tracer implementations can convert a slice of `StartSpanOption` instances +// into a `StartSpanOptions` struct like so: +// +// func StartSpan(opName string, opts ...opentracing.StartSpanOption) { +// sso := opentracing.StartSpanOptions{} +// for _, o := range opts { +// o.Apply(&sso) +// } +// ... +// } +// +type StartSpanOptions struct { + // Zero or more causal references to other Spans (via their SpanContext). + // If empty, start a "root" Span (i.e., start a new trace). + References []SpanReference + + // StartTime overrides the Span's start time, or implicitly becomes + // time.Now() if StartTime.IsZero(). + StartTime time.Time + + // Tags may have zero or more entries; the restrictions on map values are + // identical to those for Span.SetTag(). May be nil. + // + // If specified, the caller hands off ownership of Tags at + // StartSpan() invocation time. + Tags map[string]interface{} +} + +// StartSpanOption instances (zero or more) may be passed to Tracer.StartSpan. +// +// StartSpanOption borrows from the "functional options" pattern, per +// http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis +type StartSpanOption interface { + Apply(*StartSpanOptions) +} + +// SpanReferenceType is an enum type describing different categories of +// relationships between two Spans. If Span-2 refers to Span-1, the +// SpanReferenceType describes Span-1 from Span-2's perspective. For example, +// ChildOfRef means that Span-1 created Span-2. +// +// NOTE: Span-1 and Span-2 do *not* necessarily depend on each other for +// completion; e.g., Span-2 may be part of a background job enqueued by Span-1, +// or Span-2 may be sitting in a distributed queue behind Span-1. +type SpanReferenceType int + +const ( + // ChildOfRef refers to a parent Span that caused *and* somehow depends + // upon the new child Span. Often (but not always), the parent Span cannot + // finish until the child Span does. + // + // An timing diagram for a ChildOfRef that's blocked on the new Span: + // + // [-Parent Span---------] + // [-Child Span----] + // + // See http://opentracing.io/spec/ + // + // See opentracing.ChildOf() + ChildOfRef SpanReferenceType = iota + + // FollowsFromRef refers to a parent Span that does not depend in any way + // on the result of the new child Span. For instance, one might use + // FollowsFromRefs to describe pipeline stages separated by queues, + // or a fire-and-forget cache insert at the tail end of a web request. + // + // A FollowsFromRef Span is part of the same logical trace as the new Span: + // i.e., the new Span is somehow caused by the work of its FollowsFromRef. + // + // All of the following could be valid timing diagrams for children that + // "FollowFrom" a parent. + // + // [-Parent Span-] [-Child Span-] + // + // + // [-Parent Span--] + // [-Child Span-] + // + // + // [-Parent Span-] + // [-Child Span-] + // + // See http://opentracing.io/spec/ + // + // See opentracing.FollowsFrom() + FollowsFromRef +) + +// SpanReference is a StartSpanOption that pairs a SpanReferenceType and a +// referenced SpanContext. See the SpanReferenceType documentation for +// supported relationships. If SpanReference is created with +// ReferencedContext==nil, it has no effect. Thus it allows for a more concise +// syntax for starting spans: +// +// sc, _ := tracer.Extract(someFormat, someCarrier) +// span := tracer.StartSpan("operation", opentracing.ChildOf(sc)) +// +// The `ChildOf(sc)` option above will not panic if sc == nil, it will just +// not add the parent span reference to the options. +type SpanReference struct { + Type SpanReferenceType + ReferencedContext SpanContext +} + +// Apply satisfies the StartSpanOption interface. +func (r SpanReference) Apply(o *StartSpanOptions) { + if r.ReferencedContext != nil { + o.References = append(o.References, r) + } +} + +// ChildOf returns a StartSpanOption pointing to a dependent parent span. +// If sc == nil, the option has no effect. +// +// See ChildOfRef, SpanReference +func ChildOf(sc SpanContext) SpanReference { + return SpanReference{ + Type: ChildOfRef, + ReferencedContext: sc, + } +} + +// FollowsFrom returns a StartSpanOption pointing to a parent Span that caused +// the child Span but does not directly depend on its result in any way. +// If sc == nil, the option has no effect. +// +// See FollowsFromRef, SpanReference +func FollowsFrom(sc SpanContext) SpanReference { + return SpanReference{ + Type: FollowsFromRef, + ReferencedContext: sc, + } +} + +// StartTime is a StartSpanOption that sets an explicit start timestamp for the +// new Span. +type StartTime time.Time + +// Apply satisfies the StartSpanOption interface. +func (t StartTime) Apply(o *StartSpanOptions) { + o.StartTime = time.Time(t) +} + +// Tags are a generic map from an arbitrary string key to an opaque value type. +// The underlying tracing system is responsible for interpreting and +// serializing the values. +type Tags map[string]interface{} + +// Apply satisfies the StartSpanOption interface. +func (t Tags) Apply(o *StartSpanOptions) { + if o.Tags == nil { + o.Tags = make(map[string]interface{}) + } + for k, v := range t { + o.Tags[k] = v + } +} + +// Tag may be passed as a StartSpanOption to add a tag to new spans, +// or its Set method may be used to apply the tag to an existing Span, +// for example: +// +// tracer.StartSpan("opName", Tag{"Key", value}) +// +// or +// +// Tag{"key", value}.Set(span) +type Tag struct { + Key string + Value interface{} +} + +// Apply satisfies the StartSpanOption interface. +func (t Tag) Apply(o *StartSpanOptions) { + if o.Tags == nil { + o.Tags = make(map[string]interface{}) + } + o.Tags[t.Key] = t.Value +} + +// Set applies the tag to an existing Span. +func (t Tag) Set(s Span) { + s.SetTag(t.Key, t.Value) +} diff --git a/vendor/github.com/pborman/uuid/.travis.yml b/vendor/github.com/pborman/uuid/.travis.yml new file mode 100644 index 00000000..3deb4a12 --- /dev/null +++ b/vendor/github.com/pborman/uuid/.travis.yml @@ -0,0 +1,10 @@ +language: go + +go: + - "1.9" + - "1.10" + - "1.11" + - tip + +script: + - go test -v ./... diff --git a/vendor/github.com/pborman/uuid/CONTRIBUTING.md b/vendor/github.com/pborman/uuid/CONTRIBUTING.md new file mode 100644 index 00000000..04fdf09f --- /dev/null +++ b/vendor/github.com/pborman/uuid/CONTRIBUTING.md @@ -0,0 +1,10 @@ +# How to contribute + +We definitely welcome patches and contribution to this project! + +### Legal requirements + +In order to protect both you and ourselves, you will need to sign the +[Contributor License Agreement](https://cla.developers.google.com/clas). + +You may have already signed it for other Google projects. diff --git a/vendor/github.com/pborman/uuid/CONTRIBUTORS b/vendor/github.com/pborman/uuid/CONTRIBUTORS new file mode 100644 index 00000000..b382a04e --- /dev/null +++ b/vendor/github.com/pborman/uuid/CONTRIBUTORS @@ -0,0 +1 @@ +Paul Borman diff --git a/vendor/github.com/pborman/uuid/LICENSE b/vendor/github.com/pborman/uuid/LICENSE new file mode 100644 index 00000000..5dc68268 --- /dev/null +++ b/vendor/github.com/pborman/uuid/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009,2014 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/pborman/uuid/README.md b/vendor/github.com/pborman/uuid/README.md new file mode 100644 index 00000000..810ad40d --- /dev/null +++ b/vendor/github.com/pborman/uuid/README.md @@ -0,0 +1,15 @@ +This project was automatically exported from code.google.com/p/go-uuid + +# uuid ![build status](https://travis-ci.org/pborman/uuid.svg?branch=master) +The uuid package generates and inspects UUIDs based on [RFC 4122](http://tools.ietf.org/html/rfc4122) and DCE 1.1: Authentication and Security Services. + +This package now leverages the github.com/google/uuid package (which is based off an earlier version of this package). + +###### Install +`go get github.com/pborman/uuid` + +###### Documentation +[![GoDoc](https://godoc.org/github.com/pborman/uuid?status.svg)](http://godoc.org/github.com/pborman/uuid) + +Full `go doc` style documentation for the package can be viewed online without installing this package by using the GoDoc site here: +http://godoc.org/github.com/pborman/uuid diff --git a/vendor/github.com/pborman/uuid/dce.go b/vendor/github.com/pborman/uuid/dce.go new file mode 100644 index 00000000..50a0f2d0 --- /dev/null +++ b/vendor/github.com/pborman/uuid/dce.go @@ -0,0 +1,84 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "encoding/binary" + "fmt" + "os" +) + +// A Domain represents a Version 2 domain +type Domain byte + +// Domain constants for DCE Security (Version 2) UUIDs. +const ( + Person = Domain(0) + Group = Domain(1) + Org = Domain(2) +) + +// NewDCESecurity returns a DCE Security (Version 2) UUID. +// +// The domain should be one of Person, Group or Org. +// On a POSIX system the id should be the users UID for the Person +// domain and the users GID for the Group. The meaning of id for +// the domain Org or on non-POSIX systems is site defined. +// +// For a given domain/id pair the same token may be returned for up to +// 7 minutes and 10 seconds. +func NewDCESecurity(domain Domain, id uint32) UUID { + uuid := NewUUID() + if uuid != nil { + uuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2 + uuid[9] = byte(domain) + binary.BigEndian.PutUint32(uuid[0:], id) + } + return uuid +} + +// NewDCEPerson returns a DCE Security (Version 2) UUID in the person +// domain with the id returned by os.Getuid. +// +// NewDCEPerson(Person, uint32(os.Getuid())) +func NewDCEPerson() UUID { + return NewDCESecurity(Person, uint32(os.Getuid())) +} + +// NewDCEGroup returns a DCE Security (Version 2) UUID in the group +// domain with the id returned by os.Getgid. +// +// NewDCEGroup(Group, uint32(os.Getgid())) +func NewDCEGroup() UUID { + return NewDCESecurity(Group, uint32(os.Getgid())) +} + +// Domain returns the domain for a Version 2 UUID or false. +func (uuid UUID) Domain() (Domain, bool) { + if v, _ := uuid.Version(); v != 2 { + return 0, false + } + return Domain(uuid[9]), true +} + +// Id returns the id for a Version 2 UUID or false. +func (uuid UUID) Id() (uint32, bool) { + if v, _ := uuid.Version(); v != 2 { + return 0, false + } + return binary.BigEndian.Uint32(uuid[0:4]), true +} + +func (d Domain) String() string { + switch d { + case Person: + return "Person" + case Group: + return "Group" + case Org: + return "Org" + } + return fmt.Sprintf("Domain%d", int(d)) +} diff --git a/vendor/github.com/pborman/uuid/doc.go b/vendor/github.com/pborman/uuid/doc.go new file mode 100644 index 00000000..727d7616 --- /dev/null +++ b/vendor/github.com/pborman/uuid/doc.go @@ -0,0 +1,13 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The uuid package generates and inspects UUIDs. +// +// UUIDs are based on RFC 4122 and DCE 1.1: Authentication and Security +// Services. +// +// This package is a partial wrapper around the github.com/google/uuid package. +// This package represents a UUID as []byte while github.com/google/uuid +// represents a UUID as [16]byte. +package uuid diff --git a/vendor/github.com/pborman/uuid/go.mod b/vendor/github.com/pborman/uuid/go.mod new file mode 100644 index 00000000..099fc7de --- /dev/null +++ b/vendor/github.com/pborman/uuid/go.mod @@ -0,0 +1,3 @@ +module github.com/pborman/uuid + +require github.com/google/uuid v1.0.0 diff --git a/vendor/github.com/pborman/uuid/go.sum b/vendor/github.com/pborman/uuid/go.sum new file mode 100644 index 00000000..db2574a9 --- /dev/null +++ b/vendor/github.com/pborman/uuid/go.sum @@ -0,0 +1,2 @@ +github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= diff --git a/vendor/github.com/pborman/uuid/hash.go b/vendor/github.com/pborman/uuid/hash.go new file mode 100644 index 00000000..a0420c1e --- /dev/null +++ b/vendor/github.com/pborman/uuid/hash.go @@ -0,0 +1,53 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "crypto/md5" + "crypto/sha1" + "hash" +) + +// Well known Name Space IDs and UUIDs +var ( + NameSpace_DNS = Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8") + NameSpace_URL = Parse("6ba7b811-9dad-11d1-80b4-00c04fd430c8") + NameSpace_OID = Parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8") + NameSpace_X500 = Parse("6ba7b814-9dad-11d1-80b4-00c04fd430c8") + NIL = Parse("00000000-0000-0000-0000-000000000000") +) + +// NewHash returns a new UUID derived from the hash of space concatenated with +// data generated by h. The hash should be at least 16 byte in length. The +// first 16 bytes of the hash are used to form the UUID. The version of the +// UUID will be the lower 4 bits of version. NewHash is used to implement +// NewMD5 and NewSHA1. +func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID { + h.Reset() + h.Write(space) + h.Write([]byte(data)) + s := h.Sum(nil) + uuid := make([]byte, 16) + copy(uuid, s) + uuid[6] = (uuid[6] & 0x0f) | uint8((version&0xf)<<4) + uuid[8] = (uuid[8] & 0x3f) | 0x80 // RFC 4122 variant + return uuid +} + +// NewMD5 returns a new MD5 (Version 3) UUID based on the +// supplied name space and data. +// +// NewHash(md5.New(), space, data, 3) +func NewMD5(space UUID, data []byte) UUID { + return NewHash(md5.New(), space, data, 3) +} + +// NewSHA1 returns a new SHA1 (Version 5) UUID based on the +// supplied name space and data. +// +// 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/pborman/uuid/marshal.go b/vendor/github.com/pborman/uuid/marshal.go new file mode 100644 index 00000000..35b89352 --- /dev/null +++ b/vendor/github.com/pborman/uuid/marshal.go @@ -0,0 +1,85 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "errors" + "fmt" + + guuid "github.com/google/uuid" +) + +// MarshalText implements encoding.TextMarshaler. +func (u UUID) MarshalText() ([]byte, error) { + if len(u) != 16 { + return nil, nil + } + var js [36]byte + encodeHex(js[:], u) + return js[:], nil +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (u *UUID) UnmarshalText(data []byte) error { + if len(data) == 0 { + return nil + } + id := Parse(string(data)) + if id == nil { + return errors.New("invalid UUID") + } + *u = id + return nil +} + +// MarshalBinary implements encoding.BinaryMarshaler. +func (u UUID) MarshalBinary() ([]byte, error) { + return u[:], nil +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler. +func (u *UUID) UnmarshalBinary(data []byte) error { + if len(data) == 0 { + return nil + } + if len(data) != 16 { + return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) + } + var id [16]byte + copy(id[:], data) + *u = id[:] + return nil +} + +// MarshalText implements encoding.TextMarshaler. +func (u Array) MarshalText() ([]byte, error) { + var js [36]byte + encodeHex(js[:], u[:]) + return js[:], nil +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (u *Array) UnmarshalText(data []byte) error { + id, err := guuid.ParseBytes(data) + if err != nil { + return err + } + *u = Array(id) + return nil +} + +// MarshalBinary implements encoding.BinaryMarshaler. +func (u Array) MarshalBinary() ([]byte, error) { + return u[:], nil +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler. +func (u *Array) UnmarshalBinary(data []byte) error { + if len(data) != 16 { + return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) + } + copy(u[:], data) + return nil +} diff --git a/vendor/github.com/pborman/uuid/node.go b/vendor/github.com/pborman/uuid/node.go new file mode 100644 index 00000000..e524e010 --- /dev/null +++ b/vendor/github.com/pborman/uuid/node.go @@ -0,0 +1,50 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + guuid "github.com/google/uuid" +) + +// NodeInterface returns the name of the interface from which the NodeID was +// derived. The interface "user" is returned if the NodeID was set by +// SetNodeID. +func NodeInterface() string { + return guuid.NodeInterface() +} + +// SetNodeInterface selects the hardware address to be used for Version 1 UUIDs. +// If name is "" then the first usable interface found will be used or a random +// Node ID will be generated. If a named interface cannot be found then false +// is returned. +// +// SetNodeInterface never fails when name is "". +func SetNodeInterface(name string) bool { + return guuid.SetNodeInterface(name) +} + +// NodeID returns a slice of a copy of the current Node ID, setting the Node ID +// if not already set. +func NodeID() []byte { + return guuid.NodeID() +} + +// SetNodeID sets the Node ID to be used for Version 1 UUIDs. The first 6 bytes +// of id are used. If id is less than 6 bytes then false is returned and the +// Node ID is not set. +func SetNodeID(id []byte) bool { + return guuid.SetNodeID(id) +} + +// NodeID returns the 6 byte node id encoded in uuid. It returns nil if uuid is +// not valid. The NodeID is only well defined for version 1 and 2 UUIDs. +func (uuid UUID) NodeID() []byte { + if len(uuid) != 16 { + return nil + } + node := make([]byte, 6) + copy(node, uuid[10:]) + return node +} diff --git a/vendor/github.com/pborman/uuid/sql.go b/vendor/github.com/pborman/uuid/sql.go new file mode 100644 index 00000000..929c3847 --- /dev/null +++ b/vendor/github.com/pborman/uuid/sql.go @@ -0,0 +1,68 @@ +// Copyright 2015 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "database/sql/driver" + "errors" + "fmt" +) + +// Scan implements sql.Scanner so UUIDs can be read from databases transparently +// Currently, database types that map to string and []byte are supported. Please +// consult database-specific driver documentation for matching types. +func (uuid *UUID) Scan(src interface{}) error { + switch src.(type) { + case string: + // if an empty UUID comes from a table, we return a null UUID + if src.(string) == "" { + return nil + } + + // see uuid.Parse for required string format + parsed := Parse(src.(string)) + + if parsed == nil { + return errors.New("Scan: invalid UUID format") + } + + *uuid = parsed + case []byte: + b := src.([]byte) + + // if an empty UUID comes from a table, we return a null UUID + if len(b) == 0 { + return nil + } + + // assumes a simple slice of bytes if 16 bytes + // otherwise attempts to parse + if len(b) == 16 { + parsed := make([]byte, 16) + copy(parsed, b) + *uuid = UUID(parsed) + } else { + u := Parse(string(b)) + + if u == nil { + return errors.New("Scan: invalid UUID format") + } + + *uuid = u + } + + default: + return fmt.Errorf("Scan: unable to scan type %T into UUID", src) + } + + return nil +} + +// Value implements sql.Valuer so that UUIDs can be written to databases +// transparently. Currently, UUIDs map to strings. Please consult +// database-specific driver documentation for matching types. +func (uuid UUID) Value() (driver.Value, error) { + return uuid.String(), nil +} diff --git a/vendor/github.com/pborman/uuid/time.go b/vendor/github.com/pborman/uuid/time.go new file mode 100644 index 00000000..5c0960d8 --- /dev/null +++ b/vendor/github.com/pborman/uuid/time.go @@ -0,0 +1,57 @@ +// Copyright 2014 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "encoding/binary" + + guuid "github.com/google/uuid" +) + +// A Time represents a time as the number of 100's of nanoseconds since 15 Oct +// 1582. +type Time = guuid.Time + +// GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and +// clock sequence as well as adjusting the clock sequence as needed. An error +// is returned if the current time cannot be determined. +func GetTime() (Time, uint16, error) { return guuid.GetTime() } + +// ClockSequence returns the current clock sequence, generating one if not +// already set. The clock sequence is only used for Version 1 UUIDs. +// +// The uuid package does not use global static storage for the clock sequence or +// the last time a UUID was generated. Unless SetClockSequence a new random +// clock sequence is generated the first time a clock sequence is requested by +// ClockSequence, GetTime, or NewUUID. (section 4.2.1.1) sequence is generated +// for +func ClockSequence() int { return guuid.ClockSequence() } + +// SetClockSeq sets the clock sequence to the lower 14 bits of seq. Setting to +// -1 causes a new sequence to be generated. +func SetClockSequence(seq int) { guuid.SetClockSequence(seq) } + +// Time returns the time in 100s of nanoseconds since 15 Oct 1582 encoded in +// uuid. It returns false if uuid is not valid. The time is only well defined +// for version 1 and 2 UUIDs. +func (uuid UUID) Time() (Time, bool) { + if len(uuid) != 16 { + return 0, false + } + time := int64(binary.BigEndian.Uint32(uuid[0:4])) + time |= int64(binary.BigEndian.Uint16(uuid[4:6])) << 32 + time |= int64(binary.BigEndian.Uint16(uuid[6:8])&0xfff) << 48 + return Time(time), true +} + +// ClockSequence returns the clock sequence encoded in uuid. It returns false +// if uuid is not valid. The clock sequence is only well defined for version 1 +// and 2 UUIDs. +func (uuid UUID) ClockSequence() (int, bool) { + if len(uuid) != 16 { + return 0, false + } + return int(binary.BigEndian.Uint16(uuid[8:10])) & 0x3fff, true +} diff --git a/vendor/github.com/pborman/uuid/util.go b/vendor/github.com/pborman/uuid/util.go new file mode 100644 index 00000000..255b5e24 --- /dev/null +++ b/vendor/github.com/pborman/uuid/util.go @@ -0,0 +1,32 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +// xvalues returns the value of a byte as a hexadecimal digit or 255. +var xvalues = [256]byte{ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255, + 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +} + +// xtob converts the the first two hex bytes of x into a byte. +func xtob(x string) (byte, bool) { + b1 := xvalues[x[0]] + b2 := xvalues[x[1]] + return (b1 << 4) | b2, b1 != 255 && b2 != 255 +} diff --git a/vendor/github.com/pborman/uuid/uuid.go b/vendor/github.com/pborman/uuid/uuid.go new file mode 100644 index 00000000..33700042 --- /dev/null +++ b/vendor/github.com/pborman/uuid/uuid.go @@ -0,0 +1,162 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "bytes" + "crypto/rand" + "encoding/hex" + "io" + + guuid "github.com/google/uuid" +) + +// Array is a pass-by-value UUID that can be used as an effecient key in a map. +type Array [16]byte + +// UUID converts uuid into a slice. +func (uuid Array) UUID() UUID { + return uuid[:] +} + +// String returns the string representation of uuid, +// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. +func (uuid Array) String() string { + return guuid.UUID(uuid).String() +} + +// A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC +// 4122. +type UUID []byte + +// A Version represents a UUIDs version. +type Version = guuid.Version + +// A Variant represents a UUIDs variant. +type Variant = guuid.Variant + +// Constants returned by Variant. +const ( + Invalid = guuid.Invalid // Invalid UUID + RFC4122 = guuid.RFC4122 // The variant specified in RFC4122 + Reserved = guuid.Reserved // Reserved, NCS backward compatibility. + Microsoft = guuid.Microsoft // Reserved, Microsoft Corporation backward compatibility. + Future = guuid.Future // Reserved for future definition. +) + +var rander = rand.Reader // random function + +// New returns a new random (version 4) UUID as a string. It is a convenience +// function for NewRandom().String(). +func New() string { + return NewRandom().String() +} + +// Parse decodes s into a UUID or returns nil. See github.com/google/uuid for +// the formats parsed. +func Parse(s string) UUID { + gu, err := guuid.Parse(s) + if err == nil { + return gu[:] + } + return nil +} + +// ParseBytes is like Parse, except it parses a byte slice instead of a string. +func ParseBytes(b []byte) (UUID, error) { + gu, err := guuid.ParseBytes(b) + if err == nil { + return gu[:], nil + } + return nil, err +} + +// Equal returns true if uuid1 and uuid2 are equal. +func Equal(uuid1, uuid2 UUID) bool { + return bytes.Equal(uuid1, uuid2) +} + +// Array returns an array representation of uuid that can be used as a map key. +// Array panics if uuid is not valid. +func (uuid UUID) Array() Array { + if len(uuid) != 16 { + panic("invalid uuid") + } + var a Array + copy(a[:], uuid) + return a +} + +// String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +// , or "" if uuid is invalid. +func (uuid UUID) String() string { + if len(uuid) != 16 { + return "" + } + var buf [36]byte + encodeHex(buf[:], uuid) + return string(buf[:]) +} + +// URN returns the RFC 2141 URN form of uuid, +// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, or "" if uuid is invalid. +func (uuid UUID) URN() string { + if len(uuid) != 16 { + return "" + } + var buf [36 + 9]byte + copy(buf[:], "urn:uuid:") + encodeHex(buf[9:], uuid) + return string(buf[:]) +} + +func encodeHex(dst []byte, uuid UUID) { + hex.Encode(dst[:], uuid[:4]) + dst[8] = '-' + hex.Encode(dst[9:13], uuid[4:6]) + dst[13] = '-' + hex.Encode(dst[14:18], uuid[6:8]) + dst[18] = '-' + hex.Encode(dst[19:23], uuid[8:10]) + dst[23] = '-' + hex.Encode(dst[24:], uuid[10:]) +} + +// Variant returns the variant encoded in uuid. It returns Invalid if +// uuid is invalid. +func (uuid UUID) Variant() Variant { + if len(uuid) != 16 { + return Invalid + } + switch { + case (uuid[8] & 0xc0) == 0x80: + return RFC4122 + case (uuid[8] & 0xe0) == 0xc0: + return Microsoft + case (uuid[8] & 0xe0) == 0xe0: + return Future + default: + return Reserved + } +} + +// Version returns the version of uuid. It returns false if uuid is not +// valid. +func (uuid UUID) Version() (Version, bool) { + if len(uuid) != 16 { + return 0, false + } + return Version(uuid[6] >> 4), true +} + +// SetRand sets the random number generator to r, which implements io.Reader. +// If r.Read returns an error when the package requests random data then +// a panic will be issued. +// +// Calling SetRand with nil sets the random number generator to the default +// generator. +func SetRand(r io.Reader) { + guuid.SetRand(r) +} diff --git a/vendor/github.com/pborman/uuid/version1.go b/vendor/github.com/pborman/uuid/version1.go new file mode 100644 index 00000000..7af948da --- /dev/null +++ b/vendor/github.com/pborman/uuid/version1.go @@ -0,0 +1,23 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + guuid "github.com/google/uuid" +) + +// NewUUID returns a Version 1 UUID based on the current NodeID and clock +// sequence, and the current time. If the NodeID has not been set by SetNodeID +// or SetNodeInterface then it will be set automatically. If the NodeID cannot +// be set NewUUID returns nil. If clock sequence has not been set by +// SetClockSequence then it will be set automatically. If GetTime fails to +// return the current NewUUID returns nil. +func NewUUID() UUID { + gu, err := guuid.NewUUID() + if err == nil { + return UUID(gu[:]) + } + return nil +} diff --git a/vendor/github.com/pborman/uuid/version4.go b/vendor/github.com/pborman/uuid/version4.go new file mode 100644 index 00000000..b459d46d --- /dev/null +++ b/vendor/github.com/pborman/uuid/version4.go @@ -0,0 +1,26 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import guuid "github.com/google/uuid" + +// Random returns a Random (Version 4) UUID or panics. +// +// The strength of the UUIDs is based on the strength of the crypto/rand +// package. +// +// A note about uniqueness derived from the UUID Wikipedia entry: +// +// Randomly generated UUIDs have 122 random bits. One's annual risk of being +// hit by a meteorite is estimated to be one chance in 17 billion, that +// means the probability is about 0.00000000006 (6 × 10−11), +// equivalent to the odds of creating a few tens of trillions of UUIDs in a +// year and having one duplicate. +func NewRandom() UUID { + if gu, err := guuid.NewRandom(); err == nil { + return UUID(gu[:]) + } + return nil +} diff --git a/vendor/github.com/pelletier/go-toml/.dockerignore b/vendor/github.com/pelletier/go-toml/.dockerignore new file mode 100644 index 00000000..7b588347 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/.dockerignore @@ -0,0 +1,2 @@ +cmd/tomll/tomll +cmd/tomljson/tomljson diff --git a/vendor/github.com/pelletier/go-toml/.gitignore b/vendor/github.com/pelletier/go-toml/.gitignore index 99e38bbc..e6ba63a5 100644 --- a/vendor/github.com/pelletier/go-toml/.gitignore +++ b/vendor/github.com/pelletier/go-toml/.gitignore @@ -1,2 +1,5 @@ test_program/test_program_bin fuzz/ +cmd/tomll/tomll +cmd/tomljson/tomljson +cmd/tomltestgen/tomltestgen diff --git a/vendor/github.com/pelletier/go-toml/.travis.yml b/vendor/github.com/pelletier/go-toml/.travis.yml deleted file mode 100644 index c9fbf304..00000000 --- a/vendor/github.com/pelletier/go-toml/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -sudo: false -language: go -go: - - 1.8.x - - 1.9.x - - 1.10.x - - tip -matrix: - allow_failures: - - go: tip - fast_finish: true -script: - - if [ -n "$(go fmt ./...)" ]; then exit 1; fi - - ./test.sh - - ./benchmark.sh $TRAVIS_BRANCH https://github.com/$TRAVIS_REPO_SLUG.git -before_install: - - go get github.com/axw/gocov/gocov - - go get github.com/mattn/goveralls - - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi -branches: - only: [master] -after_success: - - $HOME/gopath/bin/goveralls -service=travis-ci -coverprofile=coverage.out -repotoken $COVERALLS_TOKEN diff --git a/vendor/github.com/pelletier/go-toml/CONTRIBUTING.md b/vendor/github.com/pelletier/go-toml/CONTRIBUTING.md new file mode 100644 index 00000000..405c911c --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/CONTRIBUTING.md @@ -0,0 +1,132 @@ +## Contributing + +Thank you for your interest in go-toml! We appreciate you considering +contributing to go-toml! + +The main goal is the project is to provide an easy-to-use TOML +implementation for Go that gets the job done and gets out of your way – +dealing with TOML is probably not the central piece of your project. + +As the single maintainer of go-toml, time is scarce. All help, big or +small, is more than welcomed! + +### Ask questions + +Any question you may have, somebody else might have it too. Always feel +free to ask them on the [issues tracker][issues-tracker]. We will try to +answer them as clearly and quickly as possible, time permitting. + +Asking questions also helps us identify areas where the documentation needs +improvement, or new features that weren't envisioned before. Sometimes, a +seemingly innocent question leads to the fix of a bug. Don't hesitate and +ask away! + +### Improve the documentation + +The best way to share your knowledge and experience with go-toml is to +improve the documentation. Fix a typo, clarify an interface, add an +example, anything goes! + +The documentation is present in the [README][readme] and thorough the +source code. On release, it gets updated on [GoDoc][godoc]. To make a +change to the documentation, create a pull request with your proposed +changes. For simple changes like that, the easiest way to go is probably +the "Fork this project and edit the file" button on Github, displayed at +the top right of the file. Unless it's a trivial change (for example a +typo), provide a little bit of context in your pull request description or +commit message. + +### Report a bug + +Found a bug! Sorry to hear that :(. Help us and other track them down and +fix by reporting it. [File a new bug report][bug-report] on the [issues +tracker][issues-tracker]. The template should provide enough guidance on +what to include. When in doubt: add more details! By reducing ambiguity and +providing more information, it decreases back and forth and saves everyone +time. + +### Code changes + +Want to contribute a patch? Very happy to hear that! + +First, some high-level rules: + +* A short proposal with some POC code is better than a lengthy piece of + text with no code. Code speaks louder than words. +* No backward-incompatible patch will be accepted unless discussed. + Sometimes it's hard, and Go's lack of versioning by default does not + help, but we try not to break people's programs unless we absolutely have + to. +* If you are writing a new feature or extending an existing one, make sure + to write some documentation. +* Bug fixes need to be accompanied with regression tests. +* New code needs to be tested. +* Your commit messages need to explain why the change is needed, even if + already included in the PR description. + +It does sound like a lot, but those best practices are here to save time +overall and continuously improve the quality of the project, which is +something everyone benefits from. + +#### Get started + +The fairly standard code contribution process looks like that: + +1. [Fork the project][fork]. +2. Make your changes, commit on any branch you like. +3. [Open up a pull request][pull-request] +4. Review, potential ask for changes. +5. Merge. You're in! + +Feel free to ask for help! You can create draft pull requests to gather +some early feedback! + +#### Run the tests + +You can run tests for go-toml using Go's test tool: `go test ./...`. +When creating a pull requests, all tests will be ran on Linux on a few Go +versions (Travis CI), and on Windows using the latest Go version +(AppVeyor). + +#### Style + +Try to look around and follow the same format and structure as the rest of +the code. We enforce using `go fmt` on the whole code base. + +--- + +### Maintainers-only + +#### Merge pull request + +Checklist: + +* Passing CI. +* Does not introduce backward-incompatible changes (unless discussed). +* Has relevant doc changes. +* Has relevant unit tests. + +1. Merge using "squash and merge". +2. Make sure to edit the commit message to keep all the useful information + nice and clean. +3. Make sure the commit title is clear and contains the PR number (#123). + +#### New release + +1. Go to [releases][releases]. Click on "X commits to master since this + release". +2. Make note of all the changes. Look for backward incompatible changes, + new features, and bug fixes. +3. Pick the new version using the above and semver. +4. Create a [new release][new-release]. +5. Follow the same format as [1.1.0][release-110]. + +[issues-tracker]: https://github.com/pelletier/go-toml/issues +[bug-report]: https://github.com/pelletier/go-toml/issues/new?template=bug_report.md +[godoc]: https://godoc.org/github.com/pelletier/go-toml +[readme]: ./README.md +[fork]: https://help.github.com/articles/fork-a-repo +[pull-request]: https://help.github.com/en/articles/creating-a-pull-request +[releases]: https://github.com/pelletier/go-toml/releases +[new-release]: https://github.com/pelletier/go-toml/releases/new +[release-110]: https://github.com/pelletier/go-toml/releases/tag/v1.1.0 diff --git a/vendor/github.com/pelletier/go-toml/Dockerfile b/vendor/github.com/pelletier/go-toml/Dockerfile new file mode 100644 index 00000000..fffdb016 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/Dockerfile @@ -0,0 +1,11 @@ +FROM golang:1.12-alpine3.9 as builder +WORKDIR /go/src/github.com/pelletier/go-toml +COPY . . +ENV CGO_ENABLED=0 +ENV GOOS=linux +RUN go install ./... + +FROM scratch +COPY --from=builder /go/bin/tomll /usr/bin/tomll +COPY --from=builder /go/bin/tomljson /usr/bin/tomljson +COPY --from=builder /go/bin/jsontoml /usr/bin/jsontoml diff --git a/vendor/github.com/pelletier/go-toml/PULL_REQUEST_TEMPLATE.md b/vendor/github.com/pelletier/go-toml/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..041cdc4a --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,5 @@ +**Issue:** add link to pelletier/go-toml issue here + +Explanation of what this pull request does. + +More detailed description of the decisions being made and the reasons why (if the patch is non-trivial). diff --git a/vendor/github.com/pelletier/go-toml/README.md b/vendor/github.com/pelletier/go-toml/README.md index 0d357acf..0ebf1504 100644 --- a/vendor/github.com/pelletier/go-toml/README.md +++ b/vendor/github.com/pelletier/go-toml/README.md @@ -7,9 +7,10 @@ This library supports TOML version [![GoDoc](https://godoc.org/github.com/pelletier/go-toml?status.svg)](http://godoc.org/github.com/pelletier/go-toml) [![license](https://img.shields.io/github/license/pelletier/go-toml.svg)](https://github.com/pelletier/go-toml/blob/master/LICENSE) -[![Build Status](https://travis-ci.org/pelletier/go-toml.svg?branch=master)](https://travis-ci.org/pelletier/go-toml) -[![Coverage Status](https://coveralls.io/repos/github/pelletier/go-toml/badge.svg?branch=master)](https://coveralls.io/github/pelletier/go-toml?branch=master) +[![Build Status](https://dev.azure.com/pelletierthomas/go-toml-ci/_apis/build/status/pelletier.go-toml?branchName=master)](https://dev.azure.com/pelletierthomas/go-toml-ci/_build/latest?definitionId=1&branchName=master) +[![codecov](https://codecov.io/gh/pelletier/go-toml/branch/master/graph/badge.svg)](https://codecov.io/gh/pelletier/go-toml) [![Go Report Card](https://goreportcard.com/badge/github.com/pelletier/go-toml)](https://goreportcard.com/report/github.com/pelletier/go-toml) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpelletier%2Fgo-toml.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpelletier%2Fgo-toml?ref=badge_shield) ## Features @@ -98,6 +99,30 @@ Go-toml provides two handy command line tools: go install github.com/pelletier/go-toml/cmd/tomljson tomljson --help ``` + + * `jsontoml`: Reads a JSON file and outputs a TOML representation. + + ``` + go install github.com/pelletier/go-toml/cmd/jsontoml + jsontoml --help + ``` + +### Docker image + +Those tools are also availble as a Docker image from +[dockerhub](https://hub.docker.com/r/pelletier/go-toml). For example, to +use `tomljson`: + +``` +docker run -v $PWD:/workdir pelletier/go-toml tomljson /workdir/example.toml +``` + +Only master (`latest`) and tagged versions are published to dockerhub. You +can build your own image as usual: + +``` +docker build -t go-toml . +``` ## Contribute @@ -107,12 +132,7 @@ much appreciated! ### Run tests -You have to make sure two kind of tests run: - -1. The Go unit tests -2. The TOML examples base - -You can run both of them using `./test.sh`. +`go test ./...` ### Fuzzing diff --git a/vendor/github.com/pelletier/go-toml/azure-pipelines.yml b/vendor/github.com/pelletier/go-toml/azure-pipelines.yml new file mode 100644 index 00000000..d8d7944b --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/azure-pipelines.yml @@ -0,0 +1,167 @@ +trigger: +- master + +stages: +- stage: fuzzit + displayName: "Run Fuzzit" + dependsOn: [] + condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master')) + jobs: + - job: submit + displayName: "Submit" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.13" + inputs: + version: "1.13" + - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" + - script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml + - script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml + - task: Bash@3 + inputs: + filePath: './fuzzit.sh' + env: + TYPE: fuzzing + FUZZIT_API_KEY: $(FUZZIT_API_KEY) + +- stage: run_checks + displayName: "Check" + dependsOn: [] + jobs: + - job: fmt + displayName: "fmt" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.13" + inputs: + version: "1.13" + - task: Go@0 + displayName: "go fmt ./..." + inputs: + command: 'custom' + customCommand: 'fmt' + arguments: './...' + - job: coverage + displayName: "coverage" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.13" + inputs: + version: "1.13" + - task: Go@0 + displayName: "Generate coverage" + inputs: + command: 'test' + arguments: "-race -coverprofile=coverage.txt -covermode=atomic" + - task: Bash@3 + inputs: + targetType: 'inline' + script: 'bash <(curl -s https://codecov.io/bash) -t $(CODECOV_TOKEN)' + - job: benchmark + displayName: "benchmark" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.13" + inputs: + version: "1.13" + - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" + - task: Bash@3 + inputs: + filePath: './benchmark.sh' + arguments: "master $(Build.Repository.Uri)" + + - job: fuzzing + displayName: "fuzzing" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.13" + inputs: + version: "1.13" + - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" + - script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml + - script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml + - task: Bash@3 + inputs: + filePath: './fuzzit.sh' + env: + TYPE: local-regression + + - job: go_unit_tests + displayName: "unit tests" + strategy: + matrix: + linux 1.13: + goVersion: '1.13' + imageName: 'ubuntu-latest' + mac 1.13: + goVersion: '1.13' + imageName: 'macos-10.13' + windows 1.13: + goVersion: '1.13' + imageName: 'vs2017-win2016' + linux 1.12: + goVersion: '1.12' + imageName: 'ubuntu-latest' + mac 1.12: + goVersion: '1.12' + imageName: 'macos-10.13' + windows 1.12: + goVersion: '1.12' + imageName: 'vs2017-win2016' + pool: + vmImage: $(imageName) + steps: + - task: GoTool@0 + displayName: "Install Go $(goVersion)" + inputs: + version: $(goVersion) + - task: Go@0 + displayName: "go test ./..." + inputs: + command: 'test' + arguments: './...' + +- stage: build_docker_image + displayName: "Build Docker image" + dependsOn: run_checks + jobs: + - job: build + displayName: "Build" + pool: + vmImage: ubuntu-latest + steps: + - task: Docker@2 + inputs: + command: 'build' + Dockerfile: 'Dockerfile' + buildContext: '.' + addPipelineData: false + +- stage: publish_docker_image + displayName: "Publish Docker image" + dependsOn: build_docker_image + condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master')) + jobs: + - job: publish + displayName: "Publish" + pool: + vmImage: ubuntu-latest + steps: + - task: Docker@2 + inputs: + containerRegistry: 'DockerHub' + repository: 'pelletier/go-toml' + command: 'buildAndPush' + Dockerfile: 'Dockerfile' + buildContext: '.' + tags: 'latest' \ No newline at end of file diff --git a/vendor/github.com/pelletier/go-toml/benchmark.sh b/vendor/github.com/pelletier/go-toml/benchmark.sh index 8b8bb528..7914fff4 100644 --- a/vendor/github.com/pelletier/go-toml/benchmark.sh +++ b/vendor/github.com/pelletier/go-toml/benchmark.sh @@ -1,6 +1,6 @@ #!/bin/bash -set -e +set -ex reference_ref=${1:-master} reference_git=${2:-.} @@ -8,7 +8,6 @@ reference_git=${2:-.} if ! `hash benchstat 2>/dev/null`; then echo "Installing benchstat" go get golang.org/x/perf/cmd/benchstat - go install golang.org/x/perf/cmd/benchstat fi tempdir=`mktemp -d /tmp/go-toml-benchmark-XXXXXX` @@ -29,4 +28,4 @@ go test -bench=. -benchmem | tee ${local_benchmark} echo "" echo "=== diff" -benchstat -delta-test=none ${ref_benchmark} ${local_benchmark} \ No newline at end of file +benchstat -delta-test=none ${ref_benchmark} ${local_benchmark} diff --git a/vendor/github.com/pelletier/go-toml/fuzzit.sh b/vendor/github.com/pelletier/go-toml/fuzzit.sh new file mode 100644 index 00000000..b575a608 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/fuzzit.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -xe + +# go-fuzz doesn't support modules yet, so ensure we do everything +# in the old style GOPATH way +export GO111MODULE="off" + +# install go-fuzz +go get -u github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build + +# target name can only contain lower-case letters (a-z), digits (0-9) and a dash (-) +# to add another target, make sure to create it with `fuzzit create target` +# before using `fuzzit create job` +TARGET=toml-fuzzer + +go-fuzz-build -libfuzzer -o ${TARGET}.a github.com/pelletier/go-toml +clang -fsanitize=fuzzer ${TARGET}.a -o ${TARGET} + +# install fuzzit for talking to fuzzit.dev service +# or latest version: +# https://github.com/fuzzitdev/fuzzit/releases/latest/download/fuzzit_Linux_x86_64 +wget -q -O fuzzit https://github.com/fuzzitdev/fuzzit/releases/download/v2.4.52/fuzzit_Linux_x86_64 +chmod a+x fuzzit + +# TODO: change kkowalczyk to go-toml and create toml-fuzzer target there +./fuzzit create job --type $TYPE go-toml/${TARGET} ${TARGET} diff --git a/vendor/github.com/pelletier/go-toml/go.mod b/vendor/github.com/pelletier/go-toml/go.mod new file mode 100644 index 00000000..a17e9331 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/go.mod @@ -0,0 +1,9 @@ +module github.com/pelletier/go-toml + +go 1.12 + +require ( + github.com/BurntSushi/toml v0.3.1 + github.com/davecgh/go-spew v1.1.1 + gopkg.in/yaml.v2 v2.2.4 +) diff --git a/vendor/github.com/pelletier/go-toml/go.sum b/vendor/github.com/pelletier/go-toml/go.sum new file mode 100644 index 00000000..1cd2613d --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/go.sum @@ -0,0 +1,11 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/pelletier/go-toml/keysparsing.go b/vendor/github.com/pelletier/go-toml/keysparsing.go index 284db646..e923bc4f 100644 --- a/vendor/github.com/pelletier/go-toml/keysparsing.go +++ b/vendor/github.com/pelletier/go-toml/keysparsing.go @@ -3,79 +3,107 @@ package toml import ( - "bytes" "errors" "fmt" "unicode" ) // Convert the bare key group string to an array. -// The input supports double quotation to allow "." inside the key name, +// The input supports double quotation and single quotation, // but escape sequences are not supported. Lexers must unescape them beforehand. func parseKey(key string) ([]string, error) { - groups := []string{} - var buffer bytes.Buffer - inQuotes := false - wasInQuotes := false - ignoreSpace := true - expectDot := false + runes := []rune(key) + var groups []string - for _, char := range key { - if ignoreSpace { - if char == ' ' { - continue - } - ignoreSpace = false + if len(key) == 0 { + return nil, errors.New("empty key") + } + + idx := 0 + for idx < len(runes) { + for ; idx < len(runes) && isSpace(runes[idx]); idx++ { + // skip leading whitespace } - switch char { - case '"': - if inQuotes { - groups = append(groups, buffer.String()) - buffer.Reset() - wasInQuotes = true - } - inQuotes = !inQuotes - expectDot = false - case '.': - if inQuotes { - buffer.WriteRune(char) - } else { - if !wasInQuotes { - if buffer.Len() == 0 { - return nil, errors.New("empty table key") + if idx >= len(runes) { + break + } + r := runes[idx] + if isValidBareChar(r) { + // parse bare key + startIdx := idx + endIdx := -1 + idx++ + for idx < len(runes) { + r = runes[idx] + if isValidBareChar(r) { + idx++ + } else if r == '.' { + endIdx = idx + break + } else if isSpace(r) { + endIdx = idx + for ; idx < len(runes) && isSpace(runes[idx]); idx++ { + // skip trailing whitespace } - groups = append(groups, buffer.String()) - buffer.Reset() + if idx < len(runes) && runes[idx] != '.' { + return nil, fmt.Errorf("invalid key character after whitespace: %c", runes[idx]) + } + break + } else { + return nil, fmt.Errorf("invalid bare key character: %c", r) } - ignoreSpace = true - expectDot = false - wasInQuotes = false } - case ' ': - if inQuotes { - buffer.WriteRune(char) - } else { - expectDot = true + if endIdx == -1 { + endIdx = idx } - default: - if !inQuotes && !isValidBareChar(char) { - return nil, fmt.Errorf("invalid bare character: %c", char) + groups = append(groups, string(runes[startIdx:endIdx])) + } else if r == '\'' { + // parse single quoted key + idx++ + startIdx := idx + for { + if idx >= len(runes) { + return nil, fmt.Errorf("unclosed single-quoted key") + } + r = runes[idx] + if r == '\'' { + groups = append(groups, string(runes[startIdx:idx])) + idx++ + break + } + idx++ } - if !inQuotes && expectDot { - return nil, errors.New("what?") + } else if r == '"' { + // parse double quoted key + idx++ + startIdx := idx + for { + if idx >= len(runes) { + return nil, fmt.Errorf("unclosed double-quoted key") + } + r = runes[idx] + if r == '"' { + groups = append(groups, string(runes[startIdx:idx])) + idx++ + break + } + idx++ } - buffer.WriteRune(char) - expectDot = false + } else if r == '.' { + idx++ + if idx >= len(runes) { + return nil, fmt.Errorf("unexpected end of key") + } + r = runes[idx] + if !isValidBareChar(r) && r != '\'' && r != '"' && r != ' ' { + return nil, fmt.Errorf("expecting key part after dot") + } + } else { + return nil, fmt.Errorf("invalid key character: %c", r) } } - if inQuotes { - return nil, errors.New("mismatched quotes") - } - if buffer.Len() > 0 { - groups = append(groups, buffer.String()) - } if len(groups) == 0 { - return nil, errors.New("empty key") + return nil, fmt.Errorf("empty key") } return groups, nil } diff --git a/vendor/github.com/pelletier/go-toml/lexer.go b/vendor/github.com/pelletier/go-toml/lexer.go index d11de428..10609809 100644 --- a/vendor/github.com/pelletier/go-toml/lexer.go +++ b/vendor/github.com/pelletier/go-toml/lexer.go @@ -309,7 +309,7 @@ func (l *tomlLexer) lexKey() tomlLexStateFn { if err != nil { return l.errorf(err.Error()) } - growingString += str + growingString += "\"" + str + "\"" l.next() continue } else if r == '\'' { @@ -318,13 +318,15 @@ func (l *tomlLexer) lexKey() tomlLexStateFn { if err != nil { return l.errorf(err.Error()) } - growingString += str + growingString += "'" + str + "'" l.next() continue } else if r == '\n' { return l.errorf("keys cannot contain new lines") } else if isSpace(r) { break + } else if r == '.' { + // skip } else if !isValidBareChar(r) { return l.errorf("keys cannot contain %c character", r) } @@ -731,7 +733,7 @@ func (l *tomlLexer) run() { } func init() { - dateRegexp = regexp.MustCompile(`^\d{1,4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})`) + dateRegexp = regexp.MustCompile(`^\d{1,4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})`) } // Entry point diff --git a/vendor/github.com/pelletier/go-toml/marshal.go b/vendor/github.com/pelletier/go-toml/marshal.go index 671da556..27867fba 100644 --- a/vendor/github.com/pelletier/go-toml/marshal.go +++ b/vendor/github.com/pelletier/go-toml/marshal.go @@ -6,20 +6,28 @@ import ( "fmt" "io" "reflect" + "sort" "strconv" "strings" "time" ) -const tagKeyMultiline = "multiline" +const ( + tagFieldName = "toml" + tagFieldComment = "comment" + tagCommented = "commented" + tagMultiline = "multiline" + tagDefault = "default" +) type tomlOpts struct { - name string - comment string - commented bool - multiline bool - include bool - omitempty bool + name string + comment string + commented bool + multiline bool + include bool + omitempty bool + defaultValue string } type encOpts struct { @@ -31,10 +39,37 @@ var encOptsDefaults = encOpts{ quoteMapKeys: false, } +type annotation struct { + tag string + comment string + commented string + multiline string + defaultValue string +} + +var annotationDefault = annotation{ + tag: tagFieldName, + comment: tagFieldComment, + commented: tagCommented, + multiline: tagMultiline, + defaultValue: tagDefault, +} + +type marshalOrder int + +// Orders the Encoder can write the fields to the output stream. +const ( + // Sort fields alphabetically. + OrderAlphabetical marshalOrder = iota + 1 + // Preserve the order the fields are encountered. For example, the order of fields in + // a struct. + OrderPreserve +) + var timeType = reflect.TypeOf(time.Time{}) var marshalerType = reflect.TypeOf(new(Marshaler)).Elem() -// Check if the given marshall type maps to a Tree primitive +// Check if the given marshal type maps to a Tree primitive func isPrimitive(mtype reflect.Type) bool { switch mtype.Kind() { case reflect.Ptr: @@ -56,7 +91,7 @@ func isPrimitive(mtype reflect.Type) bool { } } -// Check if the given marshall type maps to a Tree slice +// Check if the given marshal type maps to a Tree slice func isTreeSlice(mtype reflect.Type) bool { switch mtype.Kind() { case reflect.Slice: @@ -66,7 +101,7 @@ func isTreeSlice(mtype reflect.Type) bool { } } -// Check if the given marshall type maps to a non-Tree slice +// Check if the given marshal type maps to a non-Tree slice func isOtherSlice(mtype reflect.Type) bool { switch mtype.Kind() { case reflect.Ptr: @@ -78,7 +113,7 @@ func isOtherSlice(mtype reflect.Type) bool { } } -// Check if the given marshall type maps to a Tree +// Check if the given marshal type maps to a Tree func isTree(mtype reflect.Type) bool { switch mtype.Kind() { case reflect.Map: @@ -136,6 +171,8 @@ Tree primitive types and corresponding marshal types: string string, pointers to same bool bool, pointers to same time.Time time.Time{}, pointers to same + +For additional flexibility, use the Encoder API. */ func Marshal(v interface{}) ([]byte, error) { return NewEncoder(nil).marshal(v) @@ -145,13 +182,21 @@ func Marshal(v interface{}) ([]byte, error) { type Encoder struct { w io.Writer encOpts + annotation + line int + col int + order marshalOrder } // NewEncoder returns a new encoder that writes to w. func NewEncoder(w io.Writer) *Encoder { return &Encoder{ - w: w, - encOpts: encOptsDefaults, + w: w, + encOpts: encOptsDefaults, + annotation: annotationDefault, + line: 0, + col: 1, + order: OrderAlphabetical, } } @@ -197,11 +242,49 @@ func (e *Encoder) ArraysWithOneElementPerLine(v bool) *Encoder { return e } +// Order allows to change in which order fields will be written to the output stream. +func (e *Encoder) Order(ord marshalOrder) *Encoder { + e.order = ord + return e +} + +// SetTagName allows changing default tag "toml" +func (e *Encoder) SetTagName(v string) *Encoder { + e.tag = v + return e +} + +// SetTagComment allows changing default tag "comment" +func (e *Encoder) SetTagComment(v string) *Encoder { + e.comment = v + return e +} + +// SetTagCommented allows changing default tag "commented" +func (e *Encoder) SetTagCommented(v string) *Encoder { + e.commented = v + return e +} + +// SetTagMultiline allows changing default tag "multiline" +func (e *Encoder) SetTagMultiline(v string) *Encoder { + e.multiline = v + return e +} + func (e *Encoder) marshal(v interface{}) ([]byte, error) { mtype := reflect.TypeOf(v) - if mtype.Kind() != reflect.Struct { - return []byte{}, errors.New("Only a struct can be marshaled to TOML") + + switch mtype.Kind() { + case reflect.Struct, reflect.Map: + case reflect.Ptr: + if mtype.Elem().Kind() != reflect.Struct { + return []byte{}, errors.New("Only pointer to struct can be marshaled to TOML") + } + default: + return []byte{}, errors.New("Only a struct or map can be marshaled to TOML") } + sval := reflect.ValueOf(v) if isCustomMarshaler(mtype) { return callCustomMarshaler(sval) @@ -212,22 +295,27 @@ func (e *Encoder) marshal(v interface{}) ([]byte, error) { } var buf bytes.Buffer - _, err = t.writeTo(&buf, "", "", 0, e.arraysOneElementPerLine) + _, err = t.writeToOrdered(&buf, "", "", 0, e.arraysOneElementPerLine, e.order) return buf.Bytes(), err } +// Create next tree with a position based on Encoder.line +func (e *Encoder) nextTree() *Tree { + return newTreeWithPosition(Position{Line: e.line, Col: 1}) +} + // Convert given marshal struct or map value to toml tree func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, error) { if mtype.Kind() == reflect.Ptr { return e.valueToTree(mtype.Elem(), mval.Elem()) } - tval := newTree() + tval := e.nextTree() switch mtype.Kind() { case reflect.Struct: for i := 0; i < mtype.NumField(); i++ { mtypef, mvalf := mtype.Field(i), mval.Field(i) - opts := tomlOptions(mtypef) + opts := tomlOptions(mtypef, e.annotation) if opts.include && (!opts.omitempty || !isZero(mvalf)) { val, err := e.valueToToml(mtypef.Type, mvalf) if err != nil { @@ -242,7 +330,26 @@ func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, er } } case reflect.Map: - for _, key := range mval.MapKeys() { + keys := mval.MapKeys() + if e.order == OrderPreserve && len(keys) > 0 { + // Sorting []reflect.Value is not straight forward. + // + // OrderPreserve will support deterministic results when string is used + // as the key to maps. + typ := keys[0].Type() + kind := keys[0].Kind() + if kind == reflect.String { + ikeys := make([]string, len(keys)) + for i := range keys { + ikeys[i] = keys[i].Interface().(string) + } + sort.Strings(ikeys) + for i := range ikeys { + keys[i] = reflect.ValueOf(ikeys[i]).Convert(typ) + } + } + } + for _, key := range keys { mvalf := mval.MapIndex(key) val, err := e.valueToToml(mtype.Elem(), mvalf) if err != nil { @@ -290,6 +397,7 @@ func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (int // Convert given marshal value to toml value func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) { + e.line++ if mtype.Kind() == reflect.Ptr { return e.valueToToml(mtype.Elem(), mval.Elem()) } @@ -307,6 +415,9 @@ func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface case reflect.Bool: return mval.Bool(), nil case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if mtype.Kind() == reflect.Int64 && mtype == reflect.TypeOf(time.Duration(1)) { + return fmt.Sprint(mval), nil + } return mval.Int(), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: return mval.Uint(), nil @@ -326,7 +437,7 @@ func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface // Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for // sub-structs, and only definite types can be unmarshaled. func (t *Tree) Unmarshal(v interface{}) error { - d := Decoder{tval: t} + d := Decoder{tval: t, tagName: tagFieldName} return d.unmarshal(v) } @@ -334,8 +445,11 @@ func (t *Tree) Unmarshal(v interface{}) error { // See Marshal() documentation for types mapping table. func (t *Tree) Marshal() ([]byte, error) { var buf bytes.Buffer - err := NewEncoder(&buf).Encode(t) - return buf.Bytes(), err + _, err := t.WriteTo(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil } // Unmarshal parses the TOML-encoded data and stores the result in the value @@ -347,6 +461,14 @@ func (t *Tree) Marshal() ([]byte, error) { // The following struct annotations are supported: // // toml:"Field" Overrides the field's name to map to. +// default:"foo" Provides a default value. +// +// For default values, only fields of the following types are supported: +// * string +// * bool +// * int +// * int64 +// * float64 // // See Marshal() documentation for types mapping table. func Unmarshal(data []byte, v interface{}) error { @@ -362,6 +484,7 @@ type Decoder struct { r io.Reader tval *Tree encOpts + tagName string } // NewDecoder returns a new decoder that reads from r. @@ -369,6 +492,7 @@ func NewDecoder(r io.Reader) *Decoder { return &Decoder{ r: r, encOpts: encOptsDefaults, + tagName: tagFieldName, } } @@ -385,13 +509,29 @@ func (d *Decoder) Decode(v interface{}) error { return d.unmarshal(v) } +// SetTagName allows changing default tag "toml" +func (d *Decoder) SetTagName(v string) *Decoder { + d.tagName = v + return d +} + func (d *Decoder) unmarshal(v interface{}) error { mtype := reflect.TypeOf(v) - if mtype.Kind() != reflect.Ptr || mtype.Elem().Kind() != reflect.Struct { - return errors.New("Only a pointer to struct can be unmarshaled from TOML") + if mtype.Kind() != reflect.Ptr { + return errors.New("only a pointer to struct or map can be unmarshaled from TOML") } - sval, err := d.valueFromTree(mtype.Elem(), d.tval) + elem := mtype.Elem() + + switch elem.Kind() { + case reflect.Struct, reflect.Map: + default: + return errors.New("only a pointer to struct or map can be unmarshaled from TOML") + } + + vv := reflect.ValueOf(v).Elem() + + sval, err := d.valueFromTree(elem, d.tval, &vv) if err != nil { return err } @@ -399,34 +539,92 @@ func (d *Decoder) unmarshal(v interface{}) error { return nil } -// Convert toml tree to marshal struct or map, using marshal type -func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, error) { +// Convert toml tree to marshal struct or map, using marshal type. When mval1 +// is non-nil, merge fields into the given value instead of allocating a new one. +func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.Value) (reflect.Value, error) { if mtype.Kind() == reflect.Ptr { - return d.unwrapPointer(mtype, tval) + return d.unwrapPointer(mtype, tval, mval1) } var mval reflect.Value switch mtype.Kind() { case reflect.Struct: - mval = reflect.New(mtype).Elem() + if mval1 != nil { + mval = *mval1 + } else { + mval = reflect.New(mtype).Elem() + } + for i := 0; i < mtype.NumField(); i++ { mtypef := mtype.Field(i) - opts := tomlOptions(mtypef) + an := annotation{tag: d.tagName} + opts := tomlOptions(mtypef, an) if opts.include { baseKey := opts.name - keysToTry := []string{baseKey, strings.ToLower(baseKey), strings.ToTitle(baseKey)} + keysToTry := []string{ + baseKey, + strings.ToLower(baseKey), + strings.ToTitle(baseKey), + strings.ToLower(string(baseKey[0])) + baseKey[1:], + } + + found := false for _, key := range keysToTry { exists := tval.Has(key) if !exists { continue } val := tval.Get(key) - mvalf, err := d.valueFromToml(mtypef.Type, val) + fval := mval.Field(i) + mvalf, err := d.valueFromToml(mtypef.Type, val, &fval) if err != nil { return mval, formatError(err, tval.GetPosition(key)) } mval.Field(i).Set(mvalf) + found = true break } + + if !found && opts.defaultValue != "" { + mvalf := mval.Field(i) + var val interface{} + var err error + switch mvalf.Kind() { + case reflect.Bool: + val, err = strconv.ParseBool(opts.defaultValue) + if err != nil { + return mval.Field(i), err + } + case reflect.Int: + val, err = strconv.Atoi(opts.defaultValue) + if err != nil { + return mval.Field(i), err + } + case reflect.String: + val = opts.defaultValue + case reflect.Int64: + val, err = strconv.ParseInt(opts.defaultValue, 10, 64) + if err != nil { + return mval.Field(i), err + } + case reflect.Float64: + val, err = strconv.ParseFloat(opts.defaultValue, 64) + if err != nil { + return mval.Field(i), err + } + default: + return mval.Field(i), fmt.Errorf("unsuported field type for default option") + } + mval.Field(i).Set(reflect.ValueOf(val)) + } + + // save the old behavior above and try to check anonymous structs + if !found && opts.defaultValue == "" && mtypef.Anonymous && mtypef.Type.Kind() == reflect.Struct { + v, err := d.valueFromTree(mtypef.Type, tval, nil) + if err != nil { + return v, err + } + mval.Field(i).Set(v) + } } } case reflect.Map: @@ -434,11 +632,11 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, for _, key := range tval.Keys() { // TODO: path splits key val := tval.GetPath([]string{key}) - mvalf, err := d.valueFromToml(mtype.Elem(), val) + mvalf, err := d.valueFromToml(mtype.Elem(), val, nil) if err != nil { return mval, formatError(err, tval.GetPosition(key)) } - mval.SetMapIndex(reflect.ValueOf(key), mvalf) + mval.SetMapIndex(reflect.ValueOf(key).Convert(mtype.Key()), mvalf) } } return mval, nil @@ -448,7 +646,7 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) { mval := reflect.MakeSlice(mtype, len(tval), len(tval)) for i := 0; i < len(tval); i++ { - val, err := d.valueFromTree(mtype.Elem(), tval[i]) + val, err := d.valueFromTree(mtype.Elem(), tval[i], nil) if err != nil { return mval, err } @@ -461,7 +659,7 @@ func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect. func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) { mval := reflect.MakeSlice(mtype, len(tval), len(tval)) for i := 0; i < len(tval); i++ { - val, err := d.valueFromToml(mtype.Elem(), tval[i]) + val, err := d.valueFromToml(mtype.Elem(), tval[i], nil) if err != nil { return mval, err } @@ -470,26 +668,32 @@ func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (r return mval, nil } -// Convert toml value to marshal value, using marshal type -func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.Value, error) { +// Convert toml value to marshal value, using marshal type. When mval1 is non-nil +// and the given type is a struct value, merge fields into it. +func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) { if mtype.Kind() == reflect.Ptr { - return d.unwrapPointer(mtype, tval) + return d.unwrapPointer(mtype, tval, mval1) } - switch tval.(type) { + switch t := tval.(type) { case *Tree: + var mval11 *reflect.Value + if mtype.Kind() == reflect.Struct { + mval11 = mval1 + } + if isTree(mtype) { - return d.valueFromTree(mtype, tval.(*Tree)) + return d.valueFromTree(mtype, t, mval11) } return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a tree", tval, tval) case []*Tree: if isTreeSlice(mtype) { - return d.valueFromTreeSlice(mtype, tval.([]*Tree)) + return d.valueFromTreeSlice(mtype, t) } return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval) case []interface{}: if isOtherSlice(mtype) { - return d.valueFromOtherSlice(mtype, tval.([]interface{})) + return d.valueFromOtherSlice(mtype, t) } return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval) default: @@ -512,10 +716,17 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.V return val.Convert(mtype), nil case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: val := reflect.ValueOf(tval) + if mtype.Kind() == reflect.Int64 && mtype == reflect.TypeOf(time.Duration(1)) && val.Kind() == reflect.String { + d, err := time.ParseDuration(val.String()) + if err != nil { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v. %s", tval, tval, mtype.String(), err) + } + return reflect.ValueOf(d), nil + } if !val.Type().ConvertibleTo(mtype) { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Int()) { + if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Convert(mtype).Int()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } @@ -525,10 +736,11 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.V if !val.Type().ConvertibleTo(mtype) { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } - if val.Int() < 0 { + + if val.Convert(reflect.TypeOf(int(1))).Int() < 0 { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowUint(uint64(val.Int())) { + if reflect.Indirect(reflect.New(mtype)).OverflowUint(uint64(val.Convert(mtype).Uint())) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } @@ -538,7 +750,7 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.V if !val.Type().ConvertibleTo(mtype) { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Float()) { + if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Convert(mtype).Float()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } @@ -549,8 +761,15 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.V } } -func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}) (reflect.Value, error) { - val, err := d.valueFromToml(mtype.Elem(), tval) +func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) { + var melem *reflect.Value + + if mval1 != nil && !mval1.IsNil() && mtype.Elem().Kind() == reflect.Struct { + elem := mval1.Elem() + melem = &elem + } + + val, err := d.valueFromToml(mtype.Elem(), tval, melem) if err != nil { return reflect.ValueOf(nil), err } @@ -559,16 +778,25 @@ func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}) (reflect.V return mval, nil } -func tomlOptions(vf reflect.StructField) tomlOpts { - tag := vf.Tag.Get("toml") +func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { + tag := vf.Tag.Get(an.tag) parse := strings.Split(tag, ",") var comment string - if c := vf.Tag.Get("comment"); c != "" { + if c := vf.Tag.Get(an.comment); c != "" { comment = c } - commented, _ := strconv.ParseBool(vf.Tag.Get("commented")) - multiline, _ := strconv.ParseBool(vf.Tag.Get(tagKeyMultiline)) - result := tomlOpts{name: vf.Name, comment: comment, commented: commented, multiline: multiline, include: true, omitempty: false} + commented, _ := strconv.ParseBool(vf.Tag.Get(an.commented)) + multiline, _ := strconv.ParseBool(vf.Tag.Get(an.multiline)) + defaultValue := vf.Tag.Get(tagDefault) + result := tomlOpts{ + name: vf.Name, + comment: comment, + commented: commented, + multiline: multiline, + include: true, + omitempty: false, + defaultValue: defaultValue, + } if parse[0] != "" { if parse[0] == "-" && len(parse) == 1 { result.include = false diff --git a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml new file mode 100644 index 00000000..792b72ed --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml @@ -0,0 +1,39 @@ +title = "TOML Marshal Testing" + +[basic_lists] + floats = [12.3,45.6,78.9] + bools = [true,false,true] + dates = [1979-05-27T07:32:00Z,1980-05-27T07:32:00Z] + ints = [8001,8001,8002] + uints = [5002,5003] + strings = ["One","Two","Three"] + +[[subdocptrs]] + name = "Second" + +[basic_map] + one = "one" + two = "two" + +[subdoc] + + [subdoc.second] + name = "Second" + + [subdoc.first] + name = "First" + +[basic] + uint = 5001 + bool = true + float = 123.4 + float64 = 123.456782132399 + int = 5000 + string = "Bite me" + date = 1979-05-27T07:32:00Z + +[[subdoclist]] + name = "List.First" + +[[subdoclist]] + name = "List.Second" diff --git a/vendor/github.com/pelletier/go-toml/marshal_test.toml b/vendor/github.com/pelletier/go-toml/marshal_test.toml index 1c5f98e7..ba5e110b 100644 --- a/vendor/github.com/pelletier/go-toml/marshal_test.toml +++ b/vendor/github.com/pelletier/go-toml/marshal_test.toml @@ -4,6 +4,7 @@ title = "TOML Marshal Testing" bool = true date = 1979-05-27T07:32:00Z float = 123.4 + float64 = 123.456782132399 int = 5000 string = "Bite me" uint = 5001 diff --git a/vendor/github.com/pelletier/go-toml/parser.go b/vendor/github.com/pelletier/go-toml/parser.go index 2d27599a..09fec259 100644 --- a/vendor/github.com/pelletier/go-toml/parser.go +++ b/vendor/github.com/pelletier/go-toml/parser.go @@ -77,8 +77,10 @@ func (p *tomlParser) parseStart() tomlParserStateFn { return p.parseAssign case tokenEOF: return nil + case tokenError: + p.raiseError(tok, "parsing error: %s", tok.String()) default: - p.raiseError(tok, "unexpected token") + p.raiseError(tok, "unexpected token %s", tok.typ) } return nil } @@ -165,6 +167,11 @@ func (p *tomlParser) parseAssign() tomlParserStateFn { key := p.getToken() p.assume(tokenEqual) + parsedKey, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid key: %s", err.Error()) + } + value := p.parseRvalue() var tableKey []string if len(p.currentTable) > 0 { @@ -173,6 +180,9 @@ func (p *tomlParser) parseAssign() tomlParserStateFn { tableKey = []string{} } + prefixKey := parsedKey[0 : len(parsedKey)-1] + tableKey = append(tableKey, prefixKey...) + // find the table to assign, looking out for arrays of tables var targetNode *Tree switch node := p.tree.GetPath(tableKey).(type) { @@ -180,17 +190,19 @@ func (p *tomlParser) parseAssign() tomlParserStateFn { targetNode = node[len(node)-1] case *Tree: targetNode = node + case nil: + // create intermediate + if err := p.tree.createSubTree(tableKey, key.Position); err != nil { + p.raiseError(key, "could not create intermediate group: %s", err) + } + targetNode = p.tree.GetPath(tableKey).(*Tree) default: p.raiseError(key, "Unknown table type for path: %s", strings.Join(tableKey, ".")) } // assign value to the found table - keyVals := []string{key.val} - if len(keyVals) != 1 { - p.raiseError(key, "Invalid key") - } - keyVal := keyVals[0] + keyVal := parsedKey[len(parsedKey)-1] localKey := []string{keyVal} finalKey := append(tableKey, keyVal) if targetNode.GetPath(localKey) != nil { @@ -301,7 +313,11 @@ func (p *tomlParser) parseRvalue() interface{} { } return val case tokenDate: - val, err := time.ParseInLocation(time.RFC3339Nano, tok.val, time.UTC) + layout := time.RFC3339Nano + if !strings.Contains(tok.val, "T") { + layout = strings.Replace(layout, "T", " ", 1) + } + val, err := time.ParseInLocation(layout, tok.val, time.UTC) if err != nil { p.raiseError(tok, "%s", err) } @@ -338,7 +354,7 @@ Loop: case tokenRightCurlyBrace: p.getToken() break Loop - case tokenKey: + case tokenKey, tokenInteger, tokenString: if !tokenIsComma(previous) && previous != nil { p.raiseError(follow, "comma expected between fields in inline table") } diff --git a/vendor/github.com/pelletier/go-toml/test.sh b/vendor/github.com/pelletier/go-toml/test.sh deleted file mode 100644 index ba6adf3f..00000000 --- a/vendor/github.com/pelletier/go-toml/test.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash -# fail out of the script if anything here fails -set -e -set -o pipefail - -# set the path to the present working directory -export GOPATH=`pwd` - -function git_clone() { - path=$1 - branch=$2 - version=$3 - if [ ! -d "src/$path" ]; then - mkdir -p src/$path - git clone https://$path.git src/$path - fi - pushd src/$path - git checkout "$branch" - git reset --hard "$version" - popd -} - -# Remove potential previous runs -rm -rf src test_program_bin toml-test - -go get github.com/pelletier/go-buffruneio -go get github.com/davecgh/go-spew/spew -go get gopkg.in/yaml.v2 -go get github.com/BurntSushi/toml - -# get code for BurntSushi TOML validation -# pinning all to 'HEAD' for version 0.3.x work (TODO: pin to commit hash when tests stabilize) -git_clone github.com/BurntSushi/toml master HEAD -git_clone github.com/BurntSushi/toml-test master HEAD #was: 0.2.0 HEAD - -# build the BurntSushi test application -go build -o toml-test github.com/BurntSushi/toml-test - -# vendorize the current lib for testing -# NOTE: this basically mocks an install without having to go back out to github for code -mkdir -p src/github.com/pelletier/go-toml/cmd -mkdir -p src/github.com/pelletier/go-toml/query -cp *.go *.toml src/github.com/pelletier/go-toml -cp -R cmd/* src/github.com/pelletier/go-toml/cmd -cp -R query/* src/github.com/pelletier/go-toml/query -go build -o test_program_bin src/github.com/pelletier/go-toml/cmd/test_program.go - -# Run basic unit tests -go test github.com/pelletier/go-toml -covermode=count -coverprofile=coverage.out -go test github.com/pelletier/go-toml/cmd/tomljson -go test github.com/pelletier/go-toml/query - -# run the entire BurntSushi test suite -if [[ $# -eq 0 ]] ; then - echo "Running all BurntSushi tests" - ./toml-test ./test_program_bin | tee test_out -else - # run a specific test - test=$1 - test_path='src/github.com/BurntSushi/toml-test/tests' - valid_test="$test_path/valid/$test" - invalid_test="$test_path/invalid/$test" - - if [ -e "$valid_test.toml" ]; then - echo "Valid Test TOML for $test:" - echo "====" - cat "$valid_test.toml" - - echo "Valid Test JSON for $test:" - echo "====" - cat "$valid_test.json" - - echo "Go-TOML Output for $test:" - echo "====" - cat "$valid_test.toml" | ./test_program_bin - fi - - if [ -e "$invalid_test.toml" ]; then - echo "Invalid Test TOML for $test:" - echo "====" - cat "$invalid_test.toml" - - echo "Go-TOML Output for $test:" - echo "====" - echo "go-toml Output:" - cat "$invalid_test.toml" | ./test_program_bin - fi -fi diff --git a/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/pelletier/go-toml/toml.go index 98c185ad..358a9be5 100644 --- a/vendor/github.com/pelletier/go-toml/toml.go +++ b/vendor/github.com/pelletier/go-toml/toml.go @@ -27,9 +27,13 @@ type Tree struct { } func newTree() *Tree { + return newTreeWithPosition(Position{}) +} + +func newTreeWithPosition(pos Position) *Tree { return &Tree{ values: make(map[string]interface{}), - position: Position{}, + position: pos, } } @@ -194,10 +198,10 @@ func (t *Tree) SetWithOptions(key string, opts SetOptions, value interface{}) { // formatting instructions to the key, that will be reused by Marshal(). func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interface{}) { subtree := t - for _, intermediateKey := range keys[:len(keys)-1] { + for i, intermediateKey := range keys[:len(keys)-1] { nextTree, exists := subtree.values[intermediateKey] if !exists { - nextTree = newTree() + nextTree = newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col}) subtree.values[intermediateKey] = nextTree // add new element here } switch node := nextTree.(type) { @@ -207,7 +211,7 @@ func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interfac // go to most recent element if len(node) == 0 { // create element if it does not exist - subtree.values[intermediateKey] = append(node, newTree()) + subtree.values[intermediateKey] = append(node, newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col})) } subtree = node[len(node)-1] } @@ -215,19 +219,21 @@ func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interfac var toInsert interface{} - switch value.(type) { + switch v := value.(type) { case *Tree: - tt := value.(*Tree) - tt.comment = opts.Comment + v.comment = opts.Comment toInsert = value case []*Tree: toInsert = value case *tomlValue: - tt := value.(*tomlValue) - tt.comment = opts.Comment - toInsert = tt + v.comment = opts.Comment + toInsert = v default: - toInsert = &tomlValue{value: value, comment: opts.Comment, commented: opts.Commented, multiline: opts.Multiline} + toInsert = &tomlValue{value: value, + comment: opts.Comment, + commented: opts.Commented, + multiline: opts.Multiline, + position: Position{Line: subtree.position.Line + len(subtree.values) + 1, Col: subtree.position.Col}} } subtree.values[keys[len(keys)-1]] = toInsert @@ -256,44 +262,35 @@ func (t *Tree) SetPath(keys []string, value interface{}) { // SetPathWithComment is the same as SetPath, but allows you to provide comment // information to the key, that will be reused by Marshal(). func (t *Tree) SetPathWithComment(keys []string, comment string, commented bool, value interface{}) { - subtree := t - for _, intermediateKey := range keys[:len(keys)-1] { - nextTree, exists := subtree.values[intermediateKey] - if !exists { - nextTree = newTree() - subtree.values[intermediateKey] = nextTree // add new element here - } - switch node := nextTree.(type) { - case *Tree: - subtree = node - case []*Tree: - // go to most recent element - if len(node) == 0 { - // create element if it does not exist - subtree.values[intermediateKey] = append(node, newTree()) - } - subtree = node[len(node)-1] - } + t.SetPathWithOptions(keys, SetOptions{Comment: comment, Commented: commented}, value) +} + +// Delete removes a key from the tree. +// Key is a dot-separated path (e.g. a.b.c). +func (t *Tree) Delete(key string) error { + keys, err := parseKey(key) + if err != nil { + return err } + return t.DeletePath(keys) +} - var toInsert interface{} - - switch value.(type) { +// DeletePath removes a key from the tree. +// Keys is an array of path elements (e.g. {"a","b","c"}). +func (t *Tree) DeletePath(keys []string) error { + keyLen := len(keys) + if keyLen == 1 { + delete(t.values, keys[0]) + return nil + } + tree := t.GetPath(keys[:keyLen-1]) + item := keys[keyLen-1] + switch node := tree.(type) { case *Tree: - tt := value.(*Tree) - tt.comment = comment - toInsert = value - case []*Tree: - toInsert = value - case *tomlValue: - tt := value.(*tomlValue) - tt.comment = comment - toInsert = tt - default: - toInsert = &tomlValue{value: value, comment: comment, commented: commented} + delete(node.values, item) + return nil } - - subtree.values[keys[len(keys)-1]] = toInsert + return errors.New("no such key to delete") } // createSubTree takes a tree and a key and create the necessary intermediate @@ -305,10 +302,10 @@ func (t *Tree) SetPathWithComment(keys []string, comment string, commented bool, // Returns nil on success, error object on failure func (t *Tree) createSubTree(keys []string, pos Position) error { subtree := t - for _, intermediateKey := range keys { + for i, intermediateKey := range keys { nextTree, exists := subtree.values[intermediateKey] if !exists { - tree := newTree() + tree := newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col}) tree.position = pos subtree.values[intermediateKey] = tree nextTree = tree @@ -337,10 +334,39 @@ func LoadBytes(b []byte) (tree *Tree, err error) { err = errors.New(r.(string)) } }() + + if len(b) >= 4 && (hasUTF32BigEndianBOM4(b) || hasUTF32LittleEndianBOM4(b)) { + b = b[4:] + } else if len(b) >= 3 && hasUTF8BOM3(b) { + b = b[3:] + } else if len(b) >= 2 && (hasUTF16BigEndianBOM2(b) || hasUTF16LittleEndianBOM2(b)) { + b = b[2:] + } + tree = parseToml(lexToml(b)) return } +func hasUTF16BigEndianBOM2(b []byte) bool { + return b[0] == 0xFE && b[1] == 0xFF +} + +func hasUTF16LittleEndianBOM2(b []byte) bool { + return b[0] == 0xFF && b[1] == 0xFE +} + +func hasUTF8BOM3(b []byte) bool { + return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF +} + +func hasUTF32BigEndianBOM4(b []byte) bool { + return b[0] == 0x00 && b[1] == 0x00 && b[2] == 0xFE && b[3] == 0xFF +} + +func hasUTF32LittleEndianBOM4(b []byte) bool { + return b[0] == 0xFF && b[1] == 0xFE && b[2] == 0x00 && b[3] == 0x00 +} + // LoadReader creates a Tree from any io.Reader. func LoadReader(reader io.Reader) (tree *Tree, err error) { inputBytes, err := ioutil.ReadAll(reader) diff --git a/vendor/github.com/pelletier/go-toml/tomltree_write.go b/vendor/github.com/pelletier/go-toml/tomltree_write.go index e4049e29..4c96d3b0 100644 --- a/vendor/github.com/pelletier/go-toml/tomltree_write.go +++ b/vendor/github.com/pelletier/go-toml/tomltree_write.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "math" + "math/big" "reflect" "sort" "strconv" @@ -12,6 +13,18 @@ import ( "time" ) +type valueComplexity int + +const ( + valueSimple valueComplexity = iota + 1 + valueComplex +) + +type sortNode struct { + key string + complexity valueComplexity +} + // Encodes a string to a TOML-compliant multi-line string value // This function is a clone of the existing encodeTomlString function, except that whitespace characters // are preserved. Quotation marks and backslashes are also not escaped. @@ -94,12 +107,20 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen case int64: return strconv.FormatInt(value, 10), nil case float64: - // Ensure a round float does contain a decimal point. Otherwise feeding - // the output back to the parser would convert to an integer. - if math.Trunc(value) == value { - return strings.ToLower(strconv.FormatFloat(value, 'f', 1, 32)), nil + // Default bit length is full 64 + bits := 64 + // Float panics if nan is used + if !math.IsNaN(value) { + // if 32 bit accuracy is enough to exactly show, use 32 + _, acc := big.NewFloat(value).Float32() + if acc == big.Exact { + bits = 32 + } } - return strings.ToLower(strconv.FormatFloat(value, 'f', -1, 32)), nil + if math.Trunc(value) == value { + return strings.ToLower(strconv.FormatFloat(value, 'f', 1, bits)), nil + } + return strings.ToLower(strconv.FormatFloat(value, 'f', -1, bits)), nil case string: if tv.multiline { return "\"\"\"\n" + encodeMultilineTomlString(value) + "\"\"\"", nil @@ -153,117 +174,233 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen return "", fmt.Errorf("unsupported value type %T: %v", v, v) } -func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) { - simpleValuesKeys := make([]string, 0) - complexValuesKeys := make([]string, 0) +func getTreeArrayLine(trees []*Tree) (line int) { + // get lowest line number that is not 0 + for _, tv := range trees { + if tv.position.Line < line || line == 0 { + line = tv.position.Line + } + } + return +} + +func sortByLines(t *Tree) (vals []sortNode) { + var ( + line int + lines []int + tv *Tree + tom *tomlValue + node sortNode + ) + vals = make([]sortNode, 0) + m := make(map[int]sortNode) + + for k := range t.values { + v := t.values[k] + switch v.(type) { + case *Tree: + tv = v.(*Tree) + line = tv.position.Line + node = sortNode{key: k, complexity: valueComplex} + case []*Tree: + line = getTreeArrayLine(v.([]*Tree)) + node = sortNode{key: k, complexity: valueComplex} + default: + tom = v.(*tomlValue) + line = tom.position.Line + node = sortNode{key: k, complexity: valueSimple} + } + lines = append(lines, line) + vals = append(vals, node) + m[line] = node + } + sort.Ints(lines) + + for i, line := range lines { + vals[i] = m[line] + } + + return vals +} + +func sortAlphabetical(t *Tree) (vals []sortNode) { + var ( + node sortNode + simpVals []string + compVals []string + ) + vals = make([]sortNode, 0) + m := make(map[string]sortNode) for k := range t.values { v := t.values[k] switch v.(type) { case *Tree, []*Tree: - complexValuesKeys = append(complexValuesKeys, k) + node = sortNode{key: k, complexity: valueComplex} + compVals = append(compVals, node.key) default: - simpleValuesKeys = append(simpleValuesKeys, k) + node = sortNode{key: k, complexity: valueSimple} + simpVals = append(simpVals, node.key) } + vals = append(vals, node) + m[node.key] = node } - sort.Strings(simpleValuesKeys) - sort.Strings(complexValuesKeys) - - for _, k := range simpleValuesKeys { - v, ok := t.values[k].(*tomlValue) - if !ok { - return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) - } - - repr, err := tomlValueStringRepresentation(v, indent, arraysOneElementPerLine) - if err != nil { - return bytesCount, err - } - - if v.comment != "" { - comment := strings.Replace(v.comment, "\n", "\n"+indent+"#", -1) - start := "# " - if strings.HasPrefix(comment, "#") { - start = "" - } - writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment, "\n") - bytesCount += int64(writtenBytesCountComment) - if errc != nil { - return bytesCount, errc - } - } - - var commented string - if v.commented { - commented = "# " - } - writtenBytesCount, err := writeStrings(w, indent, commented, k, " = ", repr, "\n") - bytesCount += int64(writtenBytesCount) - if err != nil { - return bytesCount, err - } + // Simples first to match previous implementation + sort.Strings(simpVals) + i := 0 + for _, key := range simpVals { + vals[i] = m[key] + i++ } - for _, k := range complexValuesKeys { - v := t.values[k] + sort.Strings(compVals) + for _, key := range compVals { + vals[i] = m[key] + i++ + } - combinedKey := k - if keyspace != "" { - combinedKey = keyspace + "." + combinedKey - } - var commented string - if t.commented { - commented = "# " - } + return vals +} - switch node := v.(type) { - // node has to be of those two types given how keys are sorted above - case *Tree: - tv, ok := t.values[k].(*Tree) +func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) { + return t.writeToOrdered(w, indent, keyspace, bytesCount, arraysOneElementPerLine, OrderAlphabetical) +} + +func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord marshalOrder) (int64, error) { + var orderedVals []sortNode + + switch ord { + case OrderPreserve: + orderedVals = sortByLines(t) + default: + orderedVals = sortAlphabetical(t) + } + + for _, node := range orderedVals { + switch node.complexity { + case valueComplex: + k := node.key + v := t.values[k] + + combinedKey := k + if keyspace != "" { + combinedKey = keyspace + "." + combinedKey + } + var commented string + if t.commented { + commented = "# " + } + + switch node := v.(type) { + // node has to be of those two types given how keys are sorted above + case *Tree: + tv, ok := t.values[k].(*Tree) + if !ok { + return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) + } + if tv.comment != "" { + comment := strings.Replace(tv.comment, "\n", "\n"+indent+"#", -1) + start := "# " + if strings.HasPrefix(comment, "#") { + start = "" + } + writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment) + bytesCount += int64(writtenBytesCountComment) + if errc != nil { + return bytesCount, errc + } + } + writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[", combinedKey, "]\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + bytesCount, err = node.writeToOrdered(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine, ord) + if err != nil { + return bytesCount, err + } + case []*Tree: + for _, subTree := range node { + writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[[", combinedKey, "]]\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + + bytesCount, err = subTree.writeToOrdered(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine, ord) + if err != nil { + return bytesCount, err + } + } + } + default: // Simple + k := node.key + v, ok := t.values[k].(*tomlValue) if !ok { return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) } - if tv.comment != "" { - comment := strings.Replace(tv.comment, "\n", "\n"+indent+"#", -1) + + repr, err := tomlValueStringRepresentation(v, indent, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + + if v.comment != "" { + comment := strings.Replace(v.comment, "\n", "\n"+indent+"#", -1) start := "# " if strings.HasPrefix(comment, "#") { start = "" } - writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment) + writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment, "\n") bytesCount += int64(writtenBytesCountComment) if errc != nil { return bytesCount, errc } } - writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[", combinedKey, "]\n") + + var commented string + if v.commented { + commented = "# " + } + quotedKey := quoteKeyIfNeeded(k) + writtenBytesCount, err := writeStrings(w, indent, commented, quotedKey, " = ", repr, "\n") bytesCount += int64(writtenBytesCount) if err != nil { return bytesCount, err } - bytesCount, err = node.writeTo(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine) - if err != nil { - return bytesCount, err - } - case []*Tree: - for _, subTree := range node { - writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[[", combinedKey, "]]\n") - bytesCount += int64(writtenBytesCount) - if err != nil { - return bytesCount, err - } - - bytesCount, err = subTree.writeTo(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine) - if err != nil { - return bytesCount, err - } - } } } return bytesCount, nil } +// quote a key if it does not fit the bare key format (A-Za-z0-9_-) +// quoted keys use the same rules as strings +func quoteKeyIfNeeded(k string) string { + // when encoding a map with the 'quoteMapKeys' option enabled, the tree will contain + // keys that have already been quoted. + // not an ideal situation, but good enough of a stop gap. + if len(k) >= 2 && k[0] == '"' && k[len(k)-1] == '"' { + return k + } + isBare := true + for _, r := range k { + if !isValidBareChar(r) { + isBare = false + break + } + } + if isBare { + return k + } + return quoteKey(k) +} + +func quoteKey(k string) string { + return "\"" + encodeTomlString(k) + "\"" +} + func writeStrings(w io.Writer, s ...string) (int, error) { var n int for i := range s { @@ -286,12 +423,11 @@ func (t *Tree) WriteTo(w io.Writer) (int64, error) { // Output spans multiple lines, and is suitable for ingest by a TOML parser. // If the conversion cannot be performed, ToString returns a non-nil error. func (t *Tree) ToTomlString() (string, error) { - var buf bytes.Buffer - _, err := t.WriteTo(&buf) + b, err := t.Marshal() if err != nil { return "", err } - return buf.String(), nil + return string(b), nil } // String generates a human-readable representation of the current tree. diff --git a/vendor/github.com/pkg/errors/.gitignore b/vendor/github.com/pkg/errors/.gitignore new file mode 100644 index 00000000..daf913b1 --- /dev/null +++ b/vendor/github.com/pkg/errors/.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/pkg/errors/.travis.yml b/vendor/github.com/pkg/errors/.travis.yml new file mode 100644 index 00000000..9159de03 --- /dev/null +++ b/vendor/github.com/pkg/errors/.travis.yml @@ -0,0 +1,10 @@ +language: go +go_import_path: github.com/pkg/errors +go: + - 1.11.x + - 1.12.x + - 1.13.x + - tip + +script: + - make check diff --git a/vendor/github.com/pkg/errors/LICENSE b/vendor/github.com/pkg/errors/LICENSE new file mode 100644 index 00000000..835ba3e7 --- /dev/null +++ b/vendor/github.com/pkg/errors/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2015, Dave Cheney +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. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/pkg/errors/Makefile b/vendor/github.com/pkg/errors/Makefile new file mode 100644 index 00000000..ce9d7cde --- /dev/null +++ b/vendor/github.com/pkg/errors/Makefile @@ -0,0 +1,44 @@ +PKGS := github.com/pkg/errors +SRCDIRS := $(shell go list -f '{{.Dir}}' $(PKGS)) +GO := go + +check: test vet gofmt misspell unconvert staticcheck ineffassign unparam + +test: + $(GO) test $(PKGS) + +vet: | test + $(GO) vet $(PKGS) + +staticcheck: + $(GO) get honnef.co/go/tools/cmd/staticcheck + staticcheck -checks all $(PKGS) + +misspell: + $(GO) get github.com/client9/misspell/cmd/misspell + misspell \ + -locale GB \ + -error \ + *.md *.go + +unconvert: + $(GO) get github.com/mdempsky/unconvert + unconvert -v $(PKGS) + +ineffassign: + $(GO) get github.com/gordonklaus/ineffassign + find $(SRCDIRS) -name '*.go' | xargs ineffassign + +pedantic: check errcheck + +unparam: + $(GO) get mvdan.cc/unparam + unparam ./... + +errcheck: + $(GO) get github.com/kisielk/errcheck + errcheck $(PKGS) + +gofmt: + @echo Checking code is gofmted + @test -z "$(shell gofmt -s -l -d -e $(SRCDIRS) | tee /dev/stderr)" diff --git a/vendor/github.com/pkg/errors/README.md b/vendor/github.com/pkg/errors/README.md new file mode 100644 index 00000000..54dfdcb1 --- /dev/null +++ b/vendor/github.com/pkg/errors/README.md @@ -0,0 +1,59 @@ +# errors [![Travis-CI](https://travis-ci.org/pkg/errors.svg)](https://travis-ci.org/pkg/errors) [![AppVeyor](https://ci.appveyor.com/api/projects/status/b98mptawhudj53ep/branch/master?svg=true)](https://ci.appveyor.com/project/davecheney/errors/branch/master) [![GoDoc](https://godoc.org/github.com/pkg/errors?status.svg)](http://godoc.org/github.com/pkg/errors) [![Report card](https://goreportcard.com/badge/github.com/pkg/errors)](https://goreportcard.com/report/github.com/pkg/errors) [![Sourcegraph](https://sourcegraph.com/github.com/pkg/errors/-/badge.svg)](https://sourcegraph.com/github.com/pkg/errors?badge) + +Package errors provides simple error handling primitives. + +`go get github.com/pkg/errors` + +The traditional error handling idiom in Go is roughly akin to +```go +if err != nil { + return err +} +``` +which 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 + +The errors.Wrap function returns a new error that adds context to the original error. For example +```go +_, err := ioutil.ReadAll(r) +if err != nil { + return errors.Wrap(err, "read failed") +} +``` +## 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 can be inspected by `errors.Cause`. +```go +type causer interface { + Cause() error +} +``` +`errors.Cause` will recursively retrieve the topmost error which does not implement `causer`, which is assumed to be the original cause. For example: +```go +switch err := errors.Cause(err).(type) { +case *MyError: + // handle specifically +default: + // unknown error +} +``` + +[Read the package documentation for more information](https://godoc.org/github.com/pkg/errors). + +## Roadmap + +With the upcoming [Go2 error proposals](https://go.googlesource.com/proposal/+/master/design/go2draft.md) this package is moving into maintenance mode. The roadmap for a 1.0 release is as follows: + +- 0.9. Remove pre Go 1.9 and Go 1.10 support, address outstanding pull requests (if possible) +- 1.0. Final release. + +## Contributing + +Because of the Go2 errors changes, this package is not accepting proposals for new functionality. With that said, we welcome pull requests, bug fixes and issue reports. + +Before sending a PR, please discuss your change by raising an issue. + +## License + +BSD-2-Clause diff --git a/vendor/github.com/pkg/errors/appveyor.yml b/vendor/github.com/pkg/errors/appveyor.yml new file mode 100644 index 00000000..a932eade --- /dev/null +++ b/vendor/github.com/pkg/errors/appveyor.yml @@ -0,0 +1,32 @@ +version: build-{build}.{branch} + +clone_folder: C:\gopath\src\github.com\pkg\errors +shallow_clone: true # for startup speed + +environment: + GOPATH: C:\gopath + +platform: + - x64 + +# http://www.appveyor.com/docs/installed-software +install: + # some helpful output for debugging builds + - go version + - go env + # pre-installed MinGW at C:\MinGW is 32bit only + # but MSYS2 at C:\msys64 has mingw64 + - set PATH=C:\msys64\mingw64\bin;%PATH% + - gcc --version + - g++ --version + +build_script: + - go install -v ./... + +test_script: + - set PATH=C:\gopath\bin;%PATH% + - go test -v ./... + +#artifacts: +# - path: '%GOPATH%\bin\*.exe' +deploy: off diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pkg/errors/errors.go new file mode 100644 index 00000000..161aea25 --- /dev/null +++ b/vendor/github.com/pkg/errors/errors.go @@ -0,0 +1,288 @@ +// Package errors provides simple error handling primitives. +// +// The traditional error handling idiom in Go is roughly akin to +// +// 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 +// +// 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") +// } +// +// 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 +// +// 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 +// } +// +// 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 +// } +// +// Although the causer interface is not exported by this package, it is +// considered a part of its stable public interface. +// +// 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. +// +// 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 +// } +// +// The returned errors.StackTrace type is defined as +// +// 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) +// } +// } +// +// Although the stackTracer interface is not exported by this package, it is +// considered a part of its stable public interface. +// +// See the documentation for Frame.Format for more details. +package errors + +import ( + "fmt" + "io" +) + +// New returns an error with the supplied message. +// New also records the stack trace at the point it was called. +func New(message string) error { + return &fundamental{ + msg: message, + stack: callers(), + } +} + +// Errorf formats according to a format specifier and returns the string +// as a value that satisfies error. +// Errorf also records the stack trace at the point it was called. +func Errorf(format string, args ...interface{}) error { + return &fundamental{ + msg: fmt.Sprintf(format, args...), + stack: callers(), + } +} + +// fundamental is an error that has a message and a stack, but no caller. +type fundamental struct { + msg string + *stack +} + +func (f *fundamental) Error() string { return f.msg } + +func (f *fundamental) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + if s.Flag('+') { + io.WriteString(s, f.msg) + f.stack.Format(s, verb) + return + } + fallthrough + case 's': + io.WriteString(s, f.msg) + case 'q': + fmt.Fprintf(s, "%q", f.msg) + } +} + +// WithStack annotates err with a stack trace at the point WithStack was called. +// If err is nil, WithStack returns nil. +func WithStack(err error) error { + if err == nil { + return nil + } + return &withStack{ + err, + callers(), + } +} + +type withStack struct { + error + *stack +} + +func (w *withStack) Cause() error { return w.error } + +// Unwrap provides compatibility for Go 1.13 error chains. +func (w *withStack) Unwrap() error { return w.error } + +func (w *withStack) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + if s.Flag('+') { + fmt.Fprintf(s, "%+v", w.Cause()) + w.stack.Format(s, verb) + return + } + fallthrough + case 's': + io.WriteString(s, w.Error()) + case 'q': + fmt.Fprintf(s, "%q", w.Error()) + } +} + +// Wrap returns an error annotating err with a stack trace +// at the point Wrap is called, and the supplied message. +// If err is nil, Wrap returns nil. +func Wrap(err error, message string) error { + if err == nil { + return nil + } + err = &withMessage{ + cause: err, + msg: message, + } + return &withStack{ + err, + callers(), + } +} + +// Wrapf returns an error annotating err with a stack trace +// at the point Wrapf is called, and the format specifier. +// If err is nil, Wrapf returns nil. +func Wrapf(err error, format string, args ...interface{}) error { + if err == nil { + return nil + } + err = &withMessage{ + cause: err, + msg: fmt.Sprintf(format, args...), + } + return &withStack{ + err, + callers(), + } +} + +// WithMessage annotates err with a new message. +// If err is nil, WithMessage returns nil. +func WithMessage(err error, message string) error { + if err == nil { + return nil + } + return &withMessage{ + cause: err, + msg: message, + } +} + +// WithMessagef annotates err with the format specifier. +// If err is nil, WithMessagef returns nil. +func WithMessagef(err error, format string, args ...interface{}) error { + if err == nil { + return nil + } + return &withMessage{ + cause: err, + msg: fmt.Sprintf(format, args...), + } +} + +type withMessage struct { + cause error + msg string +} + +func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() } +func (w *withMessage) Cause() error { return w.cause } + +// Unwrap provides compatibility for Go 1.13 error chains. +func (w *withMessage) Unwrap() error { return w.cause } + +func (w *withMessage) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + if s.Flag('+') { + fmt.Fprintf(s, "%+v\n", w.Cause()) + io.WriteString(s, w.msg) + return + } + fallthrough + case 's', 'q': + io.WriteString(s, w.Error()) + } +} + +// Cause returns the underlying cause of the error, if possible. +// An error value has a cause if it implements the following +// interface: +// +// 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 +// investigation. +func Cause(err error) error { + type causer interface { + Cause() error + } + + for err != nil { + cause, ok := err.(causer) + if !ok { + break + } + err = cause.Cause() + } + return err +} diff --git a/vendor/github.com/pkg/errors/go113.go b/vendor/github.com/pkg/errors/go113.go new file mode 100644 index 00000000..be0d10d0 --- /dev/null +++ b/vendor/github.com/pkg/errors/go113.go @@ -0,0 +1,38 @@ +// +build go1.13 + +package errors + +import ( + stderrors "errors" +) + +// Is reports whether any error in err's chain matches target. +// +// The chain consists of err itself followed by the sequence of errors obtained by +// repeatedly calling Unwrap. +// +// An error is considered to match a target if it is equal to that target or if +// it implements a method Is(error) bool such that Is(target) returns true. +func Is(err, target error) bool { return stderrors.Is(err, target) } + +// As finds the first error in err's chain that matches target, and if so, sets +// target to that error value and returns true. +// +// The chain consists of err itself followed by the sequence of errors obtained by +// repeatedly calling Unwrap. +// +// An error matches target if the error's concrete value is assignable to the value +// pointed to by target, or if the error has a method As(interface{}) bool such that +// As(target) returns true. In the latter case, the As method is responsible for +// setting target. +// +// As will panic if target is not a non-nil pointer to either a type that implements +// error, or to any interface type. As returns false if err is nil. +func As(err error, target interface{}) bool { return stderrors.As(err, target) } + +// Unwrap returns the result of calling the Unwrap method on err, if err's +// type contains an Unwrap method returning error. +// Otherwise, Unwrap returns nil. +func Unwrap(err error) error { + return stderrors.Unwrap(err) +} diff --git a/vendor/github.com/pkg/errors/stack.go b/vendor/github.com/pkg/errors/stack.go new file mode 100644 index 00000000..779a8348 --- /dev/null +++ b/vendor/github.com/pkg/errors/stack.go @@ -0,0 +1,177 @@ +package errors + +import ( + "fmt" + "io" + "path" + "runtime" + "strconv" + "strings" +) + +// Frame represents a program counter inside a stack frame. +// For historical reasons if Frame is interpreted as a uintptr +// its value represents the program counter + 1. +type Frame uintptr + +// pc returns the program counter for this frame; +// multiple frames may have the same PC value. +func (f Frame) pc() uintptr { return uintptr(f) - 1 } + +// file returns the full path to the file that contains the +// function for this Frame's pc. +func (f Frame) file() string { + fn := runtime.FuncForPC(f.pc()) + if fn == nil { + return "unknown" + } + file, _ := fn.FileLine(f.pc()) + return file +} + +// line returns the line number of source code of the +// function for this Frame's pc. +func (f Frame) line() int { + fn := runtime.FuncForPC(f.pc()) + if fn == nil { + return 0 + } + _, line := fn.FileLine(f.pc()) + return line +} + +// name returns the name of this function, if known. +func (f Frame) name() string { + fn := runtime.FuncForPC(f.pc()) + if fn == nil { + return "unknown" + } + return fn.Name() +} + +// Format formats the frame according to the fmt.Formatter interface. +// +// %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 +func (f Frame) Format(s fmt.State, verb rune) { + switch verb { + case 's': + switch { + case s.Flag('+'): + io.WriteString(s, f.name()) + io.WriteString(s, "\n\t") + io.WriteString(s, f.file()) + default: + io.WriteString(s, path.Base(f.file())) + } + case 'd': + io.WriteString(s, strconv.Itoa(f.line())) + case 'n': + io.WriteString(s, funcname(f.name())) + case 'v': + f.Format(s, 's') + io.WriteString(s, ":") + f.Format(s, 'd') + } +} + +// MarshalText formats a stacktrace Frame as a text string. The output is the +// same as that of fmt.Sprintf("%+v", f), but without newlines or tabs. +func (f Frame) MarshalText() ([]byte, error) { + name := f.name() + if name == "unknown" { + return []byte(name), nil + } + return []byte(fmt.Sprintf("%s %s:%d", name, f.file(), f.line())), nil +} + +// StackTrace is stack of Frames from innermost (newest) to outermost (oldest). +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 +// +// 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. +func (st StackTrace) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + switch { + case s.Flag('+'): + for _, f := range st { + io.WriteString(s, "\n") + f.Format(s, verb) + } + case s.Flag('#'): + fmt.Fprintf(s, "%#v", []Frame(st)) + default: + st.formatSlice(s, verb) + } + case 's': + st.formatSlice(s, verb) + } +} + +// formatSlice will format this StackTrace into the given buffer as a slice of +// Frame, only valid when called with '%s' or '%v'. +func (st StackTrace) formatSlice(s fmt.State, verb rune) { + io.WriteString(s, "[") + for i, f := range st { + if i > 0 { + io.WriteString(s, " ") + } + f.Format(s, verb) + } + io.WriteString(s, "]") +} + +// stack represents a stack of program counters. +type stack []uintptr + +func (s *stack) Format(st fmt.State, verb rune) { + switch verb { + case 'v': + switch { + case st.Flag('+'): + for _, pc := range *s { + f := Frame(pc) + fmt.Fprintf(st, "\n%+v", f) + } + } + } +} + +func (s *stack) StackTrace() StackTrace { + f := make([]Frame, len(*s)) + for i := 0; i < len(f); i++ { + f[i] = Frame((*s)[i]) + } + return f +} + +func callers() *stack { + const depth = 32 + var pcs [depth]uintptr + n := runtime.Callers(3, pcs[:]) + var st stack = pcs[0:n] + return &st +} + +// funcname removes the path prefix component of a function's name reported by func.Name(). +func funcname(name string) string { + i := strings.LastIndex(name, "/") + name = name[i+1:] + i = strings.Index(name, ".") + return name[i+1:] +} diff --git a/vendor/github.com/prometheus/client_golang/LICENSE b/vendor/github.com/prometheus/client_golang/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/prometheus/client_golang/NOTICE b/vendor/github.com/prometheus/client_golang/NOTICE new file mode 100644 index 00000000..dd878a30 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/NOTICE @@ -0,0 +1,23 @@ +Prometheus instrumentation library for Go applications +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). + + +The following components are included in this product: + +perks - a fork of https://github.com/bmizerany/perks +https://github.com/beorn7/perks +Copyright 2013-2015 Blake Mizerany, Björn Rabenstein +See https://github.com/beorn7/perks/blob/master/README.md for license details. + +Go support for Protocol Buffers - Google's data interchange format +http://github.com/golang/protobuf/ +Copyright 2010 The Go Authors +See source code for license details. + +Support for streaming Protocol Buffer messages for the Go language (golang). +https://github.com/matttproud/golang_protobuf_extensions +Copyright 2013 Matt T. Proud +Licensed under the Apache License, Version 2.0 diff --git a/vendor/github.com/prometheus/client_golang/prometheus/.gitignore b/vendor/github.com/prometheus/client_golang/prometheus/.gitignore new file mode 100644 index 00000000..3460f034 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/.gitignore @@ -0,0 +1 @@ +command-line-arguments.test diff --git a/vendor/github.com/prometheus/client_golang/prometheus/README.md b/vendor/github.com/prometheus/client_golang/prometheus/README.md new file mode 100644 index 00000000..44986bff --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/README.md @@ -0,0 +1 @@ +See [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus). diff --git a/vendor/github.com/prometheus/client_golang/prometheus/build_info.go b/vendor/github.com/prometheus/client_golang/prometheus/build_info.go new file mode 100644 index 00000000..288f0e85 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/build_info.go @@ -0,0 +1,29 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build go1.12 + +package prometheus + +import "runtime/debug" + +// readBuildInfo is a wrapper around debug.ReadBuildInfo for Go 1.12+. +func readBuildInfo() (path, version, sum string) { + path, version, sum = "unknown", "unknown", "unknown" + if bi, ok := debug.ReadBuildInfo(); ok { + path = bi.Main.Path + version = bi.Main.Version + sum = bi.Main.Sum + } + return +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go b/vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go new file mode 100644 index 00000000..6609e287 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go @@ -0,0 +1,22 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !go1.12 + +package prometheus + +// readBuildInfo is a wrapper around debug.ReadBuildInfo for Go versions before +// 1.12. Remove this whole file once the minimum supported Go version is 1.12. +func readBuildInfo() (path, version, sum string) { + return "unknown", "unknown", "unknown" +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collector.go b/vendor/github.com/prometheus/client_golang/prometheus/collector.go new file mode 100644 index 00000000..1e839650 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/collector.go @@ -0,0 +1,120 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Collector is the interface implemented by anything that can be used by +// Prometheus to collect metrics. A Collector has to be registered for +// collection. See Registerer.Register. +// +// The stock metrics provided by this package (Gauge, Counter, Summary, +// Histogram, Untyped) are also Collectors (which only ever collect one metric, +// namely itself). An implementer of Collector may, however, collect multiple +// metrics in a coordinated fashion and/or create metrics on the fly. Examples +// for collectors already implemented in this library are the metric vectors +// (i.e. collection of multiple instances of the same Metric but with different +// label values) like GaugeVec or SummaryVec, and the ExpvarCollector. +type Collector interface { + // Describe sends the super-set of all possible descriptors of metrics + // collected by this Collector to the provided channel and returns once + // the last descriptor has been sent. The sent descriptors fulfill the + // consistency and uniqueness requirements described in the Desc + // documentation. + // + // It is valid if one and the same Collector sends duplicate + // descriptors. Those duplicates are simply ignored. However, two + // different Collectors must not send duplicate descriptors. + // + // Sending no descriptor at all marks the Collector as “unchecked”, + // i.e. no checks will be performed at registration time, and the + // Collector may yield any Metric it sees fit in its Collect method. + // + // This method idempotently sends the same descriptors throughout the + // lifetime of the Collector. It may be called concurrently and + // therefore must be implemented in a concurrency safe way. + // + // If a Collector encounters an error while executing this method, it + // must send an invalid descriptor (created with NewInvalidDesc) to + // signal the error to the registry. + Describe(chan<- *Desc) + // Collect is called by the Prometheus registry when collecting + // metrics. The implementation sends each collected metric via the + // provided channel and returns once the last metric has been sent. The + // descriptor of each sent metric is one of those returned by Describe + // (unless the Collector is unchecked, see above). Returned metrics that + // share the same descriptor must differ in their variable label + // values. + // + // This method may be called concurrently and must therefore be + // implemented in a concurrency safe way. Blocking occurs at the expense + // of total performance of rendering all registered metrics. Ideally, + // Collector implementations support concurrent readers. + Collect(chan<- Metric) +} + +// DescribeByCollect is a helper to implement the Describe method of a custom +// Collector. It collects the metrics from the provided Collector and sends +// their descriptors to the provided channel. +// +// If a Collector collects the same metrics throughout its lifetime, its +// Describe method can simply be implemented as: +// +// func (c customCollector) Describe(ch chan<- *Desc) { +// DescribeByCollect(c, ch) +// } +// +// However, this will not work if the metrics collected change dynamically over +// the lifetime of the Collector in a way that their combined set of descriptors +// changes as well. The shortcut implementation will then violate the contract +// of the Describe method. If a Collector sometimes collects no metrics at all +// (for example vectors like CounterVec, GaugeVec, etc., which only collect +// metrics after a metric with a fully specified label set has been accessed), +// it might even get registered as an unchecked Collector (cf. the Register +// method of the Registerer interface). Hence, only use this shortcut +// implementation of Describe if you are certain to fulfill the contract. +// +// The Collector example demonstrates a use of DescribeByCollect. +func DescribeByCollect(c Collector, descs chan<- *Desc) { + metrics := make(chan Metric) + go func() { + c.Collect(metrics) + close(metrics) + }() + for m := range metrics { + descs <- m.Desc() + } +} + +// selfCollector implements Collector for a single Metric so that the Metric +// collects itself. Add it as an anonymous field to a struct that implements +// Metric, and call init with the Metric itself as an argument. +type selfCollector struct { + self Metric +} + +// init provides the selfCollector with a reference to the metric it is supposed +// to collect. It is usually called within the factory function to create a +// metric. See example. +func (c *selfCollector) init(self Metric) { + c.self = self +} + +// Describe implements Collector. +func (c *selfCollector) Describe(ch chan<- *Desc) { + ch <- c.self.Desc() +} + +// Collect implements Collector. +func (c *selfCollector) Collect(ch chan<- Metric) { + ch <- c.self +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/vendor/github.com/prometheus/client_golang/prometheus/counter.go new file mode 100644 index 00000000..df72fcf3 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -0,0 +1,319 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "math" + "sync/atomic" + "time" + + dto "github.com/prometheus/client_model/go" +) + +// Counter is a Metric that represents a single numerical value that only ever +// goes up. That implies that it cannot be used to count items whose number can +// also go down, e.g. the number of currently running goroutines. Those +// "counters" are represented by Gauges. +// +// A Counter is typically used to count requests served, tasks completed, errors +// occurred, etc. +// +// To create Counter instances, use NewCounter. +type Counter interface { + Metric + Collector + + // Inc increments the counter by 1. Use Add to increment it by arbitrary + // non-negative values. + Inc() + // Add adds the given value to the counter. It panics if the value is < + // 0. + Add(float64) +} + +// ExemplarAdder is implemented by Counters that offer the option of adding a +// value to the Counter together with an exemplar. Its AddWithExemplar method +// works like the Add method of the Counter interface but also replaces the +// currently saved exemplar (if any) with a new one, created from the provided +// value, the current time as timestamp, and the provided labels. Empty Labels +// will lead to a valid (label-less) exemplar. But if Labels is nil, the current +// exemplar is left in place. AddWithExemplar panics if the value is < 0, if any +// of the provided labels are invalid, or if the provided labels contain more +// than 64 runes in total. +type ExemplarAdder interface { + AddWithExemplar(value float64, exemplar Labels) +} + +// CounterOpts is an alias for Opts. See there for doc comments. +type CounterOpts Opts + +// NewCounter creates a new Counter based on the provided CounterOpts. +// +// The returned implementation also implements ExemplarAdder. It is safe to +// perform the corresponding type assertion. +// +// The returned implementation tracks the counter value in two separate +// variables, a float64 and a uint64. The latter is used to track calls of the +// Inc method and calls of the Add method with a value that can be represented +// as a uint64. This allows atomic increments of the counter with optimal +// performance. (It is common to have an Inc call in very hot execution paths.) +// Both internal tracking values are added up in the Write method. This has to +// be taken into account when it comes to precision and overflow behavior. +func NewCounter(opts CounterOpts) Counter { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ) + result := &counter{desc: desc, labelPairs: desc.constLabelPairs, now: time.Now} + result.init(result) // Init self-collection. + return result +} + +type counter struct { + // valBits contains the bits of the represented float64 value, while + // valInt stores values that are exact integers. Both have to go first + // in the struct to guarantee alignment for atomic operations. + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + valBits uint64 + valInt uint64 + + selfCollector + desc *Desc + + labelPairs []*dto.LabelPair + exemplar atomic.Value // Containing nil or a *dto.Exemplar. + + now func() time.Time // To mock out time.Now() for testing. +} + +func (c *counter) Desc() *Desc { + return c.desc +} + +func (c *counter) Add(v float64) { + if v < 0 { + panic(errors.New("counter cannot decrease in value")) + } + + ival := uint64(v) + if float64(ival) == v { + atomic.AddUint64(&c.valInt, ival) + return + } + + for { + oldBits := atomic.LoadUint64(&c.valBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + v) + if atomic.CompareAndSwapUint64(&c.valBits, oldBits, newBits) { + return + } + } +} + +func (c *counter) AddWithExemplar(v float64, e Labels) { + c.Add(v) + c.updateExemplar(v, e) +} + +func (c *counter) Inc() { + atomic.AddUint64(&c.valInt, 1) +} + +func (c *counter) Write(out *dto.Metric) error { + fval := math.Float64frombits(atomic.LoadUint64(&c.valBits)) + ival := atomic.LoadUint64(&c.valInt) + val := fval + float64(ival) + + var exemplar *dto.Exemplar + if e := c.exemplar.Load(); e != nil { + exemplar = e.(*dto.Exemplar) + } + + return populateMetric(CounterValue, val, c.labelPairs, exemplar, out) +} + +func (c *counter) updateExemplar(v float64, l Labels) { + if l == nil { + return + } + e, err := newExemplar(v, c.now(), l) + if err != nil { + panic(err) + } + c.exemplar.Store(e) +} + +// CounterVec is a Collector that bundles a set of Counters that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. number of HTTP requests, partitioned by response code and +// method). Create instances with NewCounterVec. +type CounterVec struct { + *metricVec +} + +// NewCounterVec creates a new CounterVec based on the provided CounterOpts and +// partitioned by the given label names. +func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &CounterVec{ + metricVec: newMetricVec(desc, func(lvs ...string) Metric { + if len(lvs) != len(desc.variableLabels) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) + } + result := &counter{desc: desc, labelPairs: makeLabelPairs(desc, lvs), now: time.Now} + result.init(result) // Init self-collection. + return result + }), + } +} + +// GetMetricWithLabelValues returns the Counter for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Counter is created. +// +// It is possible to call this method without using the returned Counter to only +// create the new Counter but leave it at its starting value 0. See also the +// SummaryVec example. +// +// Keeping the Counter for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Counter from the CounterVec. In that case, +// the Counter will still exist, but it will not be exported anymore, even if a +// Counter with the same label values is created later. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc (minus any curried labels). +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (v *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { + metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// GetMetricWith returns the Counter for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Counter is created. Implications of +// creating a Counter without using it and keeping the Counter for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc (minus any curried labels). +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (v *CounterVec) GetMetricWith(labels Labels) (Counter, error) { + metric, err := v.metricVec.getMetricWith(labels) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. Not returning an +// error allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (v *CounterVec) WithLabelValues(lvs ...string) Counter { + c, err := v.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return c +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. Not returning an error allows shortcuts like +// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Add(42) +func (v *CounterVec) With(labels Labels) Counter { + c, err := v.GetMetricWith(labels) + if err != nil { + panic(err) + } + return c +} + +// CurryWith returns a vector curried with the provided labels, i.e. the +// returned vector has those labels pre-set for all labeled operations performed +// on it. The cardinality of the curried vector is reduced accordingly. The +// order of the remaining labels stays the same (just with the curried labels +// taken out of the sequence – which is relevant for the +// (GetMetric)WithLabelValues methods). It is possible to curry a curried +// vector, but only with labels not yet used for currying before. +// +// The metrics contained in the CounterVec are shared between the curried and +// uncurried vectors. They are just accessed differently. Curried and uncurried +// vectors behave identically in terms of collection. Only one must be +// registered with a given registry (usually the uncurried version). The Reset +// method deletes all metrics, even if called on a curried vector. +func (v *CounterVec) CurryWith(labels Labels) (*CounterVec, error) { + vec, err := v.curryWith(labels) + if vec != nil { + return &CounterVec{vec}, err + } + return nil, err +} + +// MustCurryWith works as CurryWith but panics where CurryWith would have +// returned an error. +func (v *CounterVec) MustCurryWith(labels Labels) *CounterVec { + vec, err := v.CurryWith(labels) + if err != nil { + panic(err) + } + return vec +} + +// CounterFunc is a Counter whose value is determined at collect time by calling a +// provided function. +// +// To create CounterFunc instances, use NewCounterFunc. +type CounterFunc interface { + Metric + Collector +} + +// NewCounterFunc creates a new CounterFunc based on the provided +// CounterOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a CounterFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. The function should also honor +// the contract for a Counter (values only go up, not down), but compliance will +// not be checked. +func NewCounterFunc(opts CounterOpts, function func() float64) CounterFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), CounterValue, function) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/vendor/github.com/prometheus/client_golang/prometheus/desc.go new file mode 100644 index 00000000..e3232d79 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -0,0 +1,185 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "fmt" + "sort" + "strings" + + "github.com/cespare/xxhash/v2" + "github.com/golang/protobuf/proto" + "github.com/prometheus/common/model" + + dto "github.com/prometheus/client_model/go" +) + +// Desc is the descriptor used by every Prometheus Metric. It is essentially +// the immutable meta-data of a Metric. The normal Metric implementations +// included in this package manage their Desc under the hood. Users only have to +// deal with Desc if they use advanced features like the ExpvarCollector or +// custom Collectors and Metrics. +// +// Descriptors registered with the same registry have to fulfill certain +// consistency and uniqueness criteria if they share the same fully-qualified +// name: They must have the same help string and the same label names (aka label +// dimensions) in each, constLabels and variableLabels, but they must differ in +// the values of the constLabels. +// +// Descriptors that share the same fully-qualified names and the same label +// values of their constLabels are considered equal. +// +// Use NewDesc to create new Desc instances. +type Desc struct { + // fqName has been built from Namespace, Subsystem, and Name. + fqName string + // help provides some helpful information about this metric. + help string + // constLabelPairs contains precalculated DTO label pairs based on + // the constant labels. + constLabelPairs []*dto.LabelPair + // VariableLabels contains names of labels for which the metric + // maintains variable values. + variableLabels []string + // id is a hash of the values of the ConstLabels and fqName. This + // must be unique among all registered descriptors and can therefore be + // used as an identifier of the descriptor. + id uint64 + // dimHash is a hash of the label names (preset and variable) and the + // Help string. Each Desc with the same fqName must have the same + // dimHash. + dimHash uint64 + // err is an error that occurred during construction. It is reported on + // registration time. + err error +} + +// NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc +// and will be reported on registration time. variableLabels and constLabels can +// be nil if no such labels should be set. fqName must not be empty. +// +// variableLabels only contain the label names. Their label values are variable +// and therefore not part of the Desc. (They are managed within the Metric.) +// +// For constLabels, the label values are constant. Therefore, they are fully +// specified in the Desc. See the Collector example for a usage pattern. +func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) *Desc { + d := &Desc{ + fqName: fqName, + help: help, + variableLabels: variableLabels, + } + if !model.IsValidMetricName(model.LabelValue(fqName)) { + d.err = fmt.Errorf("%q is not a valid metric name", fqName) + return d + } + // labelValues contains the label values of const labels (in order of + // their sorted label names) plus the fqName (at position 0). + labelValues := make([]string, 1, len(constLabels)+1) + labelValues[0] = fqName + labelNames := make([]string, 0, len(constLabels)+len(variableLabels)) + labelNameSet := map[string]struct{}{} + // First add only the const label names and sort them... + for labelName := range constLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name for metric %q", labelName, fqName) + return d + } + labelNames = append(labelNames, labelName) + labelNameSet[labelName] = struct{}{} + } + sort.Strings(labelNames) + // ... so that we can now add const label values in the order of their names. + for _, labelName := range labelNames { + labelValues = append(labelValues, constLabels[labelName]) + } + // Validate the const label values. They can't have a wrong cardinality, so + // use in len(labelValues) as expectedNumberOfValues. + if err := validateLabelValues(labelValues, len(labelValues)); err != nil { + d.err = err + return d + } + // Now add the variable label names, but prefix them with something that + // cannot be in a regular label name. That prevents matching the label + // dimension with a different mix between preset and variable labels. + for _, labelName := range variableLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name for metric %q", labelName, fqName) + return d + } + labelNames = append(labelNames, "$"+labelName) + labelNameSet[labelName] = struct{}{} + } + if len(labelNames) != len(labelNameSet) { + d.err = errors.New("duplicate label names") + return d + } + + xxh := xxhash.New() + for _, val := range labelValues { + xxh.WriteString(val) + xxh.Write(separatorByteSlice) + } + d.id = xxh.Sum64() + // Sort labelNames so that order doesn't matter for the hash. + sort.Strings(labelNames) + // Now hash together (in this order) the help string and the sorted + // label names. + xxh.Reset() + xxh.WriteString(help) + xxh.Write(separatorByteSlice) + for _, labelName := range labelNames { + xxh.WriteString(labelName) + xxh.Write(separatorByteSlice) + } + d.dimHash = xxh.Sum64() + + d.constLabelPairs = make([]*dto.LabelPair, 0, len(constLabels)) + for n, v := range constLabels { + d.constLabelPairs = append(d.constLabelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(v), + }) + } + sort.Sort(labelPairSorter(d.constLabelPairs)) + return d +} + +// NewInvalidDesc returns an invalid descriptor, i.e. a descriptor with the +// provided error set. If a collector returning such a descriptor is registered, +// registration will fail with the provided error. NewInvalidDesc can be used by +// a Collector to signal inability to describe itself. +func NewInvalidDesc(err error) *Desc { + return &Desc{ + err: err, + } +} + +func (d *Desc) String() string { + lpStrings := make([]string, 0, len(d.constLabelPairs)) + for _, lp := range d.constLabelPairs { + lpStrings = append( + lpStrings, + fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()), + ) + } + return fmt.Sprintf( + "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: %v}", + d.fqName, + d.help, + strings.Join(lpStrings, ","), + d.variableLabels, + ) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/doc.go b/vendor/github.com/prometheus/client_golang/prometheus/doc.go new file mode 100644 index 00000000..98450125 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/doc.go @@ -0,0 +1,199 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package prometheus is the core instrumentation package. It provides metrics +// primitives to instrument code for monitoring. It also offers a registry for +// metrics. Sub-packages allow to expose the registered metrics via HTTP +// (package promhttp) or push them to a Pushgateway (package push). There is +// also a sub-package promauto, which provides metrics constructors with +// automatic registration. +// +// All exported functions and methods are safe to be used concurrently unless +// specified otherwise. +// +// A Basic Example +// +// As a starting point, a very basic usage example: +// +// package main +// +// import ( +// "log" +// "net/http" +// +// "github.com/prometheus/client_golang/prometheus" +// "github.com/prometheus/client_golang/prometheus/promhttp" +// ) +// +// var ( +// cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{ +// Name: "cpu_temperature_celsius", +// Help: "Current temperature of the CPU.", +// }) +// hdFailures = prometheus.NewCounterVec( +// prometheus.CounterOpts{ +// Name: "hd_errors_total", +// Help: "Number of hard-disk errors.", +// }, +// []string{"device"}, +// ) +// ) +// +// func init() { +// // Metrics have to be registered to be exposed: +// prometheus.MustRegister(cpuTemp) +// prometheus.MustRegister(hdFailures) +// } +// +// func main() { +// cpuTemp.Set(65.3) +// hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() +// +// // The Handler function provides a default handler to expose metrics +// // via an HTTP server. "/metrics" is the usual endpoint for that. +// http.Handle("/metrics", promhttp.Handler()) +// log.Fatal(http.ListenAndServe(":8080", nil)) +// } +// +// +// This is a complete program that exports two metrics, a Gauge and a Counter, +// the latter with a label attached to turn it into a (one-dimensional) vector. +// +// Metrics +// +// The number of exported identifiers in this package might appear a bit +// overwhelming. However, in addition to the basic plumbing shown in the example +// above, you only need to understand the different metric types and their +// vector versions for basic usage. Furthermore, if you are not concerned with +// fine-grained control of when and how to register metrics with the registry, +// have a look at the promauto package, which will effectively allow you to +// ignore registration altogether in simple cases. +// +// Above, you have already touched the Counter and the Gauge. There are two more +// advanced metric types: the Summary and Histogram. A more thorough description +// of those four metric types can be found in the Prometheus docs: +// https://prometheus.io/docs/concepts/metric_types/ +// +// In addition to the fundamental metric types Gauge, Counter, Summary, and +// Histogram, a very important part of the Prometheus data model is the +// partitioning of samples along dimensions called labels, which results in +// metric vectors. The fundamental types are GaugeVec, CounterVec, SummaryVec, +// and HistogramVec. +// +// While only the fundamental metric types implement the Metric interface, both +// the metrics and their vector versions implement the Collector interface. A +// Collector manages the collection of a number of Metrics, but for convenience, +// a Metric can also “collect itself”. Note that Gauge, Counter, Summary, and +// Histogram are interfaces themselves while GaugeVec, CounterVec, SummaryVec, +// and HistogramVec are not. +// +// To create instances of Metrics and their vector versions, you need a suitable +// …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, or HistogramOpts. +// +// Custom Collectors and constant Metrics +// +// While you could create your own implementations of Metric, most likely you +// will only ever implement the Collector interface on your own. At a first +// glance, a custom Collector seems handy to bundle Metrics for common +// registration (with the prime example of the different metric vectors above, +// which bundle all the metrics of the same name but with different labels). +// +// There is a more involved use case, too: If you already have metrics +// available, created outside of the Prometheus context, you don't need the +// interface of the various Metric types. You essentially want to mirror the +// existing numbers into Prometheus Metrics during collection. An own +// implementation of the Collector interface is perfect for that. You can create +// Metric instances “on the fly” using NewConstMetric, NewConstHistogram, and +// NewConstSummary (and their respective Must… versions). NewConstMetric is used +// for all metric types with just a float64 as their value: Counter, Gauge, and +// a special “type” called Untyped. Use the latter if you are not sure if the +// mirrored metric is a Counter or a Gauge. Creation of the Metric instance +// happens in the Collect method. The Describe method has to return separate +// Desc instances, representative of the “throw-away” metrics to be created +// later. NewDesc comes in handy to create those Desc instances. Alternatively, +// you could return no Desc at all, which will mark the Collector “unchecked”. +// No checks are performed at registration time, but metric consistency will +// still be ensured at scrape time, i.e. any inconsistencies will lead to scrape +// errors. Thus, with unchecked Collectors, the responsibility to not collect +// metrics that lead to inconsistencies in the total scrape result lies with the +// implementer of the Collector. While this is not a desirable state, it is +// sometimes necessary. The typical use case is a situation where the exact +// metrics to be returned by a Collector cannot be predicted at registration +// time, but the implementer has sufficient knowledge of the whole system to +// guarantee metric consistency. +// +// The Collector example illustrates the use case. You can also look at the +// source code of the processCollector (mirroring process metrics), the +// goCollector (mirroring Go metrics), or the expvarCollector (mirroring expvar +// metrics) as examples that are used in this package itself. +// +// If you just need to call a function to get a single float value to collect as +// a metric, GaugeFunc, CounterFunc, or UntypedFunc might be interesting +// shortcuts. +// +// Advanced Uses of the Registry +// +// While MustRegister is the by far most common way of registering a Collector, +// sometimes you might want to handle the errors the registration might cause. +// As suggested by the name, MustRegister panics if an error occurs. With the +// Register function, the error is returned and can be handled. +// +// An error is returned if the registered Collector is incompatible or +// inconsistent with already registered metrics. The registry aims for +// consistency of the collected metrics according to the Prometheus data model. +// Inconsistencies are ideally detected at registration time, not at collect +// time. The former will usually be detected at start-up time of a program, +// while the latter will only happen at scrape time, possibly not even on the +// first scrape if the inconsistency only becomes relevant later. That is the +// main reason why a Collector and a Metric have to describe themselves to the +// registry. +// +// So far, everything we did operated on the so-called default registry, as it +// can be found in the global DefaultRegisterer variable. With NewRegistry, you +// can create a custom registry, or you can even implement the Registerer or +// Gatherer interfaces yourself. The methods Register and Unregister work in the +// same way on a custom registry as the global functions Register and Unregister +// on the default registry. +// +// There are a number of uses for custom registries: You can use registries with +// special properties, see NewPedanticRegistry. You can avoid global state, as +// it is imposed by the DefaultRegisterer. You can use multiple registries at +// the same time to expose different metrics in different ways. You can use +// separate registries for testing purposes. +// +// Also note that the DefaultRegisterer comes registered with a Collector for Go +// runtime metrics (via NewGoCollector) and a Collector for process metrics (via +// NewProcessCollector). With a custom registry, you are in control and decide +// yourself about the Collectors to register. +// +// HTTP Exposition +// +// The Registry implements the Gatherer interface. The caller of the Gather +// method can then expose the gathered metrics in some way. Usually, the metrics +// are served via HTTP on the /metrics endpoint. That's happening in the example +// above. The tools to expose metrics via HTTP are in the promhttp sub-package. +// +// Pushing to the Pushgateway +// +// Function for pushing to the Pushgateway can be found in the push sub-package. +// +// Graphite Bridge +// +// Functions and examples to push metrics from a Gatherer to Graphite can be +// found in the graphite sub-package. +// +// Other Means of Exposition +// +// More ways of exposing metrics can easily be added by following the approaches +// of the existing implementations. +package prometheus diff --git a/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go new file mode 100644 index 00000000..18a99d5f --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go @@ -0,0 +1,119 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "encoding/json" + "expvar" +) + +type expvarCollector struct { + exports map[string]*Desc +} + +// NewExpvarCollector returns a newly allocated expvar Collector that still has +// to be registered with a Prometheus registry. +// +// An expvar Collector collects metrics from the expvar interface. It provides a +// quick way to expose numeric values that are already exported via expvar as +// Prometheus metrics. Note that the data models of expvar and Prometheus are +// fundamentally different, and that the expvar Collector is inherently slower +// than native Prometheus metrics. Thus, the expvar Collector is probably great +// for experiments and prototying, but you should seriously consider a more +// direct implementation of Prometheus metrics for monitoring production +// systems. +// +// The exports map has the following meaning: +// +// The keys in the map correspond to expvar keys, i.e. for every expvar key you +// want to export as Prometheus metric, you need an entry in the exports +// map. The descriptor mapped to each key describes how to export the expvar +// value. It defines the name and the help string of the Prometheus metric +// proxying the expvar value. The type will always be Untyped. +// +// For descriptors without variable labels, the expvar value must be a number or +// a bool. The number is then directly exported as the Prometheus sample +// value. (For a bool, 'false' translates to 0 and 'true' to 1). Expvar values +// that are not numbers or bools are silently ignored. +// +// If the descriptor has one variable label, the expvar value must be an expvar +// map. The keys in the expvar map become the various values of the one +// Prometheus label. The values in the expvar map must be numbers or bools again +// as above. +// +// For descriptors with more than one variable label, the expvar must be a +// nested expvar map, i.e. where the values of the topmost map are maps again +// etc. until a depth is reached that corresponds to the number of labels. The +// leaves of that structure must be numbers or bools as above to serve as the +// sample values. +// +// Anything that does not fit into the scheme above is silently ignored. +func NewExpvarCollector(exports map[string]*Desc) Collector { + return &expvarCollector{ + exports: exports, + } +} + +// Describe implements Collector. +func (e *expvarCollector) Describe(ch chan<- *Desc) { + for _, desc := range e.exports { + ch <- desc + } +} + +// Collect implements Collector. +func (e *expvarCollector) Collect(ch chan<- Metric) { + for name, desc := range e.exports { + var m Metric + expVar := expvar.Get(name) + if expVar == nil { + continue + } + var v interface{} + labels := make([]string, len(desc.variableLabels)) + if err := json.Unmarshal([]byte(expVar.String()), &v); err != nil { + ch <- NewInvalidMetric(desc, err) + continue + } + var processValue func(v interface{}, i int) + processValue = func(v interface{}, i int) { + if i >= len(labels) { + copiedLabels := append(make([]string, 0, len(labels)), labels...) + switch v := v.(type) { + case float64: + m = MustNewConstMetric(desc, UntypedValue, v, copiedLabels...) + case bool: + if v { + m = MustNewConstMetric(desc, UntypedValue, 1, copiedLabels...) + } else { + m = MustNewConstMetric(desc, UntypedValue, 0, copiedLabels...) + } + default: + return + } + ch <- m + return + } + vm, ok := v.(map[string]interface{}) + if !ok { + return + } + for lv, val := range vm { + labels[i] = lv + processValue(val, i+1) + } + } + processValue(v, 0) + } +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/fnv.go b/vendor/github.com/prometheus/client_golang/prometheus/fnv.go new file mode 100644 index 00000000..3d383a73 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/fnv.go @@ -0,0 +1,42 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go new file mode 100644 index 00000000..d67573f7 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go @@ -0,0 +1,289 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "math" + "sync/atomic" + "time" + + dto "github.com/prometheus/client_model/go" +) + +// Gauge is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// A Gauge is typically used for measured values like temperatures or current +// memory usage, but also "counts" that can go up and down, like the number of +// running goroutines. +// +// To create Gauge instances, use NewGauge. +type Gauge interface { + Metric + Collector + + // Set sets the Gauge to an arbitrary value. + Set(float64) + // Inc increments the Gauge by 1. Use Add to increment it by arbitrary + // values. + Inc() + // Dec decrements the Gauge by 1. Use Sub to decrement it by arbitrary + // values. + Dec() + // Add adds the given value to the Gauge. (The value can be negative, + // resulting in a decrease of the Gauge.) + Add(float64) + // Sub subtracts the given value from the Gauge. (The value can be + // negative, resulting in an increase of the Gauge.) + Sub(float64) + + // SetToCurrentTime sets the Gauge to the current Unix time in seconds. + SetToCurrentTime() +} + +// GaugeOpts is an alias for Opts. See there for doc comments. +type GaugeOpts Opts + +// NewGauge creates a new Gauge based on the provided GaugeOpts. +// +// The returned implementation is optimized for a fast Set method. If you have a +// choice for managing the value of a Gauge via Set vs. Inc/Dec/Add/Sub, pick +// the former. For example, the Inc method of the returned Gauge is slower than +// the Inc method of a Counter returned by NewCounter. This matches the typical +// scenarios for Gauges and Counters, where the former tends to be Set-heavy and +// the latter Inc-heavy. +func NewGauge(opts GaugeOpts) Gauge { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ) + result := &gauge{desc: desc, labelPairs: desc.constLabelPairs} + result.init(result) // Init self-collection. + return result +} + +type gauge struct { + // valBits contains the bits of the represented float64 value. It has + // to go first in the struct to guarantee alignment for atomic + // operations. http://golang.org/pkg/sync/atomic/#pkg-note-BUG + valBits uint64 + + selfCollector + + desc *Desc + labelPairs []*dto.LabelPair +} + +func (g *gauge) Desc() *Desc { + return g.desc +} + +func (g *gauge) Set(val float64) { + atomic.StoreUint64(&g.valBits, math.Float64bits(val)) +} + +func (g *gauge) SetToCurrentTime() { + g.Set(float64(time.Now().UnixNano()) / 1e9) +} + +func (g *gauge) Inc() { + g.Add(1) +} + +func (g *gauge) Dec() { + g.Add(-1) +} + +func (g *gauge) Add(val float64) { + for { + oldBits := atomic.LoadUint64(&g.valBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + val) + if atomic.CompareAndSwapUint64(&g.valBits, oldBits, newBits) { + return + } + } +} + +func (g *gauge) Sub(val float64) { + g.Add(val * -1) +} + +func (g *gauge) Write(out *dto.Metric) error { + val := math.Float64frombits(atomic.LoadUint64(&g.valBits)) + return populateMetric(GaugeValue, val, g.labelPairs, nil, out) +} + +// GaugeVec is a Collector that bundles a set of Gauges that all share the same +// Desc, but have different values for their variable labels. This is used if +// you want to count the same thing partitioned by various dimensions +// (e.g. number of operations queued, partitioned by user and operation +// type). Create instances with NewGaugeVec. +type GaugeVec struct { + *metricVec +} + +// NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and +// partitioned by the given label names. +func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &GaugeVec{ + metricVec: newMetricVec(desc, func(lvs ...string) Metric { + if len(lvs) != len(desc.variableLabels) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) + } + result := &gauge{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} + result.init(result) // Init self-collection. + return result + }), + } +} + +// GetMetricWithLabelValues returns the Gauge for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Gauge is created. +// +// It is possible to call this method without using the returned Gauge to only +// create the new Gauge but leave it at its starting value 0. See also the +// SummaryVec example. +// +// Keeping the Gauge for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Gauge from the GaugeVec. In that case, the +// Gauge will still exist, but it will not be exported anymore, even if a +// Gauge with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc (minus any curried labels). +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +func (v *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { + metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// GetMetricWith returns the Gauge for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Gauge is created. Implications of +// creating a Gauge without using it and keeping the Gauge for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc (minus any curried labels). +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (v *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) { + metric, err := v.metricVec.getMetricWith(labels) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. Not returning an +// error allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (v *GaugeVec) WithLabelValues(lvs ...string) Gauge { + g, err := v.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return g +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. Not returning an error allows shortcuts like +// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Add(42) +func (v *GaugeVec) With(labels Labels) Gauge { + g, err := v.GetMetricWith(labels) + if err != nil { + panic(err) + } + return g +} + +// CurryWith returns a vector curried with the provided labels, i.e. the +// returned vector has those labels pre-set for all labeled operations performed +// on it. The cardinality of the curried vector is reduced accordingly. The +// order of the remaining labels stays the same (just with the curried labels +// taken out of the sequence – which is relevant for the +// (GetMetric)WithLabelValues methods). It is possible to curry a curried +// vector, but only with labels not yet used for currying before. +// +// The metrics contained in the GaugeVec are shared between the curried and +// uncurried vectors. They are just accessed differently. Curried and uncurried +// vectors behave identically in terms of collection. Only one must be +// registered with a given registry (usually the uncurried version). The Reset +// method deletes all metrics, even if called on a curried vector. +func (v *GaugeVec) CurryWith(labels Labels) (*GaugeVec, error) { + vec, err := v.curryWith(labels) + if vec != nil { + return &GaugeVec{vec}, err + } + return nil, err +} + +// MustCurryWith works as CurryWith but panics where CurryWith would have +// returned an error. +func (v *GaugeVec) MustCurryWith(labels Labels) *GaugeVec { + vec, err := v.CurryWith(labels) + if err != nil { + panic(err) + } + return vec +} + +// GaugeFunc is a Gauge whose value is determined at collect time by calling a +// provided function. +// +// To create GaugeFunc instances, use NewGaugeFunc. +type GaugeFunc interface { + Metric + Collector +} + +// NewGaugeFunc creates a new GaugeFunc based on the provided GaugeOpts. The +// value reported is determined by calling the given function from within the +// Write method. Take into account that metric collection may happen +// concurrently. Therefore, it must be safe to call the provided function +// concurrently. +// +// NewGaugeFunc is a good way to create an “info” style metric with a constant +// value of 1. Example: +// https://github.com/prometheus/common/blob/8558a5b7db3c84fa38b4766966059a7bd5bfa2ee/version/info.go#L36-L56 +func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, function) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go new file mode 100644 index 00000000..ea05cf42 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go @@ -0,0 +1,396 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "runtime" + "runtime/debug" + "sync" + "time" +) + +type goCollector struct { + goroutinesDesc *Desc + threadsDesc *Desc + gcDesc *Desc + goInfoDesc *Desc + + // ms... are memstats related. + msLast *runtime.MemStats // Previously collected memstats. + msLastTimestamp time.Time + msMtx sync.Mutex // Protects msLast and msLastTimestamp. + msMetrics memStatsMetrics + msRead func(*runtime.MemStats) // For mocking in tests. + msMaxWait time.Duration // Wait time for fresh memstats. + msMaxAge time.Duration // Maximum allowed age of old memstats. +} + +// NewGoCollector returns a collector that exports metrics about the current Go +// process. This includes memory stats. To collect those, runtime.ReadMemStats +// is called. This requires to “stop the world”, which usually only happens for +// garbage collection (GC). Take the following implications into account when +// deciding whether to use the Go collector: +// +// 1. The performance impact of stopping the world is the more relevant the more +// frequently metrics are collected. However, with Go1.9 or later the +// stop-the-world time per metrics collection is very short (~25µs) so that the +// performance impact will only matter in rare cases. However, with older Go +// versions, the stop-the-world duration depends on the heap size and can be +// quite significant (~1.7 ms/GiB as per +// https://go-review.googlesource.com/c/go/+/34937). +// +// 2. During an ongoing GC, nothing else can stop the world. Therefore, if the +// metrics collection happens to coincide with GC, it will only complete after +// GC has finished. Usually, GC is fast enough to not cause problems. However, +// with a very large heap, GC might take multiple seconds, which is enough to +// cause scrape timeouts in common setups. To avoid this problem, the Go +// collector will use the memstats from a previous collection if +// runtime.ReadMemStats takes more than 1s. However, if there are no previously +// collected memstats, or their collection is more than 5m ago, the collection +// will block until runtime.ReadMemStats succeeds. (The problem might be solved +// in Go1.13, see https://github.com/golang/go/issues/19812 for the related Go +// issue.) +func NewGoCollector() Collector { + return &goCollector{ + goroutinesDesc: NewDesc( + "go_goroutines", + "Number of goroutines that currently exist.", + nil, nil), + threadsDesc: NewDesc( + "go_threads", + "Number of OS threads created.", + nil, nil), + gcDesc: NewDesc( + "go_gc_duration_seconds", + "A summary of the pause duration of garbage collection cycles.", + nil, nil), + goInfoDesc: NewDesc( + "go_info", + "Information about the Go environment.", + nil, Labels{"version": runtime.Version()}), + msLast: &runtime.MemStats{}, + msRead: runtime.ReadMemStats, + msMaxWait: time.Second, + msMaxAge: 5 * time.Minute, + msMetrics: memStatsMetrics{ + { + desc: NewDesc( + memstatNamespace("alloc_bytes"), + "Number of bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Alloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("alloc_bytes_total"), + "Total number of bytes allocated, even if freed.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.TotalAlloc) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("sys_bytes"), + "Number of bytes obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Sys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("lookups_total"), + "Total number of pointer lookups.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Lookups) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("mallocs_total"), + "Total number of mallocs.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Mallocs) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("frees_total"), + "Total number of frees.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Frees) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("heap_alloc_bytes"), + "Number of heap bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapAlloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_sys_bytes"), + "Number of heap bytes obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_idle_bytes"), + "Number of heap bytes waiting to be used.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapIdle) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_inuse_bytes"), + "Number of heap bytes that are in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_released_bytes"), + "Number of heap bytes released to OS.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapReleased) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_objects"), + "Number of allocated objects.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapObjects) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_inuse_bytes"), + "Number of bytes in use by the stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_sys_bytes"), + "Number of bytes obtained from system for stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_inuse_bytes"), + "Number of bytes in use by mspan structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_sys_bytes"), + "Number of bytes used for mspan structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_inuse_bytes"), + "Number of bytes in use by mcache structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_sys_bytes"), + "Number of bytes used for mcache structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("buck_hash_sys_bytes"), + "Number of bytes used by the profiling bucket hash table.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.BuckHashSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("gc_sys_bytes"), + "Number of bytes used for garbage collection system metadata.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.GCSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("other_sys_bytes"), + "Number of bytes used for other system allocations.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.OtherSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("next_gc_bytes"), + "Number of heap bytes when next garbage collection will take place.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.NextGC) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("last_gc_time_seconds"), + "Number of seconds since 1970 of last garbage collection.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.LastGC) / 1e9 }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("gc_cpu_fraction"), + "The fraction of this program's available CPU time used by the GC since the program started.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return ms.GCCPUFraction }, + valType: GaugeValue, + }, + }, + } +} + +func memstatNamespace(s string) string { + return "go_memstats_" + s +} + +// Describe returns all descriptions of the collector. +func (c *goCollector) Describe(ch chan<- *Desc) { + ch <- c.goroutinesDesc + ch <- c.threadsDesc + ch <- c.gcDesc + ch <- c.goInfoDesc + for _, i := range c.msMetrics { + ch <- i.desc + } +} + +// Collect returns the current state of all metrics of the collector. +func (c *goCollector) Collect(ch chan<- Metric) { + var ( + ms = &runtime.MemStats{} + done = make(chan struct{}) + ) + // Start reading memstats first as it might take a while. + go func() { + c.msRead(ms) + c.msMtx.Lock() + c.msLast = ms + c.msLastTimestamp = time.Now() + c.msMtx.Unlock() + close(done) + }() + + ch <- MustNewConstMetric(c.goroutinesDesc, GaugeValue, float64(runtime.NumGoroutine())) + n, _ := runtime.ThreadCreateProfile(nil) + ch <- MustNewConstMetric(c.threadsDesc, GaugeValue, float64(n)) + + var stats debug.GCStats + stats.PauseQuantiles = make([]time.Duration, 5) + debug.ReadGCStats(&stats) + + quantiles := make(map[float64]float64) + for idx, pq := range stats.PauseQuantiles[1:] { + quantiles[float64(idx+1)/float64(len(stats.PauseQuantiles)-1)] = pq.Seconds() + } + quantiles[0.0] = stats.PauseQuantiles[0].Seconds() + ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), stats.PauseTotal.Seconds(), quantiles) + + ch <- MustNewConstMetric(c.goInfoDesc, GaugeValue, 1) + + timer := time.NewTimer(c.msMaxWait) + select { + case <-done: // Our own ReadMemStats succeeded in time. Use it. + timer.Stop() // Important for high collection frequencies to not pile up timers. + c.msCollect(ch, ms) + return + case <-timer.C: // Time out, use last memstats if possible. Continue below. + } + c.msMtx.Lock() + if time.Since(c.msLastTimestamp) < c.msMaxAge { + // Last memstats are recent enough. Collect from them under the lock. + c.msCollect(ch, c.msLast) + c.msMtx.Unlock() + return + } + // If we are here, the last memstats are too old or don't exist. We have + // to wait until our own ReadMemStats finally completes. For that to + // happen, we have to release the lock. + c.msMtx.Unlock() + <-done + c.msCollect(ch, ms) +} + +func (c *goCollector) msCollect(ch chan<- Metric, ms *runtime.MemStats) { + for _, i := range c.msMetrics { + ch <- MustNewConstMetric(i.desc, i.valType, i.eval(ms)) + } +} + +// memStatsMetrics provide description, value, and value type for memstat metrics. +type memStatsMetrics []struct { + desc *Desc + eval func(*runtime.MemStats) float64 + valType ValueType +} + +// NewBuildInfoCollector returns a collector collecting a single metric +// "go_build_info" with the constant value 1 and three labels "path", "version", +// and "checksum". Their label values contain the main module path, version, and +// checksum, respectively. The labels will only have meaningful values if the +// binary is built with Go module support and from source code retrieved from +// the source repository (rather than the local file system). This is usually +// accomplished by building from outside of GOPATH, specifying the full address +// of the main package, e.g. "GO111MODULE=on go run +// github.com/prometheus/client_golang/examples/random". If built without Go +// module support, all label values will be "unknown". If built with Go module +// support but using the source code from the local file system, the "path" will +// be set appropriately, but "checksum" will be empty and "version" will be +// "(devel)". +// +// This collector uses only the build information for the main module. See +// https://github.com/povilasv/prommod for an example of a collector for the +// module dependencies. +func NewBuildInfoCollector() Collector { + path, version, sum := readBuildInfo() + c := &selfCollector{MustNewConstMetric( + NewDesc( + "go_build_info", + "Build information about the main Go module.", + nil, Labels{"path": path, "version": version, "checksum": sum}, + ), + GaugeValue, 1)} + c.init(c.self) + return c +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go new file mode 100644 index 00000000..4271f438 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -0,0 +1,636 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "math" + "runtime" + "sort" + "sync" + "sync/atomic" + "time" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// A Histogram counts individual observations from an event or sample stream in +// configurable buckets. Similar to a summary, it also provides a sum of +// observations and an observation count. +// +// On the Prometheus server, quantiles can be calculated from a Histogram using +// the histogram_quantile function in the query language. +// +// Note that Histograms, in contrast to Summaries, can be aggregated with the +// Prometheus query language (see the documentation for detailed +// procedures). However, Histograms require the user to pre-define suitable +// buckets, and they are in general less accurate. The Observe method of a +// Histogram has a very low performance overhead in comparison with the Observe +// method of a Summary. +// +// To create Histogram instances, use NewHistogram. +type Histogram interface { + Metric + Collector + + // Observe adds a single observation to the histogram. + Observe(float64) +} + +// bucketLabel is used for the label that defines the upper bound of a +// bucket of a histogram ("le" -> "less or equal"). +const bucketLabel = "le" + +// DefBuckets are the default Histogram buckets. The default buckets are +// tailored to broadly measure the response time (in seconds) of a network +// service. Most likely, however, you will be required to define buckets +// customized to your use case. +var ( + DefBuckets = []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10} + + errBucketLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in histograms", bucketLabel, + ) +) + +// LinearBuckets creates 'count' buckets, each 'width' wide, where the lowest +// bucket has an upper bound of 'start'. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is zero or negative. +func LinearBuckets(start, width float64, count int) []float64 { + if count < 1 { + panic("LinearBuckets needs a positive count") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start += width + } + return buckets +} + +// ExponentialBuckets creates 'count' buckets, where the lowest bucket has an +// upper bound of 'start' and each following bucket's upper bound is 'factor' +// times the previous bucket's upper bound. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is 0 or negative, if 'start' is 0 or negative, +// or if 'factor' is less than or equal 1. +func ExponentialBuckets(start, factor float64, count int) []float64 { + if count < 1 { + panic("ExponentialBuckets needs a positive count") + } + if start <= 0 { + panic("ExponentialBuckets needs a positive start value") + } + if factor <= 1 { + panic("ExponentialBuckets needs a factor greater than 1") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start *= factor + } + return buckets +} + +// HistogramOpts bundles the options for creating a Histogram metric. It is +// mandatory to set Name to a non-empty string. All other fields are optional +// and can safely be left at their zero value, although it is strongly +// encouraged to set a Help string. +type HistogramOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Histogram (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Histogram must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Histogram. + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this metric. Metrics + // with the same fully-qualified name must have the same label names in + // their ConstLabels. + // + // ConstLabels are only used rarely. In particular, do not use them to + // attach the same labels to all your metrics. Those use cases are + // better covered by target labels set by the scraping Prometheus + // server, or by one specific metric (e.g. a build_info or a + // machine_role metric). See also + // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels + ConstLabels Labels + + // Buckets defines the buckets into which observations are counted. Each + // element in the slice is the upper inclusive bound of a bucket. The + // values must be sorted in strictly increasing order. There is no need + // to add a highest bucket with +Inf bound, it will be added + // implicitly. The default value is DefBuckets. + Buckets []float64 +} + +// NewHistogram creates a new Histogram based on the provided HistogramOpts. It +// panics if the buckets in HistogramOpts are not in strictly increasing order. +// +// The returned implementation also implements ExemplarObserver. It is safe to +// perform the corresponding type assertion. Exemplars are tracked separately +// for each bucket. +func NewHistogram(opts HistogramOpts) Histogram { + return newHistogram( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { + if len(desc.variableLabels) != len(labelValues) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, labelValues)) + } + + for _, n := range desc.variableLabels { + if n == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + + if len(opts.Buckets) == 0 { + opts.Buckets = DefBuckets + } + + h := &histogram{ + desc: desc, + upperBounds: opts.Buckets, + labelPairs: makeLabelPairs(desc, labelValues), + counts: [2]*histogramCounts{{}, {}}, + now: time.Now, + } + for i, upperBound := range h.upperBounds { + if i < len(h.upperBounds)-1 { + if upperBound >= h.upperBounds[i+1] { + panic(fmt.Errorf( + "histogram buckets must be in increasing order: %f >= %f", + upperBound, h.upperBounds[i+1], + )) + } + } else { + if math.IsInf(upperBound, +1) { + // The +Inf bucket is implicit. Remove it here. + h.upperBounds = h.upperBounds[:i] + } + } + } + // Finally we know the final length of h.upperBounds and can make buckets + // for both counts as well as exemplars: + h.counts[0].buckets = make([]uint64, len(h.upperBounds)) + h.counts[1].buckets = make([]uint64, len(h.upperBounds)) + h.exemplars = make([]atomic.Value, len(h.upperBounds)+1) + + h.init(h) // Init self-collection. + return h +} + +type histogramCounts struct { + // sumBits contains the bits of the float64 representing the sum of all + // observations. sumBits and count have to go first in the struct to + // guarantee alignment for atomic operations. + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + sumBits uint64 + count uint64 + buckets []uint64 +} + +type histogram struct { + // countAndHotIdx enables lock-free writes with use of atomic updates. + // The most significant bit is the hot index [0 or 1] of the count field + // below. Observe calls update the hot one. All remaining bits count the + // number of Observe calls. Observe starts by incrementing this counter, + // and finish by incrementing the count field in the respective + // histogramCounts, as a marker for completion. + // + // Calls of the Write method (which are non-mutating reads from the + // perspective of the histogram) swap the hot–cold under the writeMtx + // lock. A cooldown is awaited (while locked) by comparing the number of + // observations with the initiation count. Once they match, then the + // last observation on the now cool one has completed. All cool fields must + // be merged into the new hot before releasing writeMtx. + // + // Fields with atomic access first! See alignment constraint: + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + countAndHotIdx uint64 + + selfCollector + desc *Desc + writeMtx sync.Mutex // Only used in the Write method. + + // Two counts, one is "hot" for lock-free observations, the other is + // "cold" for writing out a dto.Metric. It has to be an array of + // pointers to guarantee 64bit alignment of the histogramCounts, see + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG. + counts [2]*histogramCounts + + upperBounds []float64 + labelPairs []*dto.LabelPair + exemplars []atomic.Value // One more than buckets (to include +Inf), each a *dto.Exemplar. + + now func() time.Time // To mock out time.Now() for testing. +} + +func (h *histogram) Desc() *Desc { + return h.desc +} + +func (h *histogram) Observe(v float64) { + h.observe(v, h.findBucket(v)) +} + +func (h *histogram) ObserveWithExemplar(v float64, e Labels) { + i := h.findBucket(v) + h.observe(v, i) + h.updateExemplar(v, i, e) +} + +func (h *histogram) Write(out *dto.Metric) error { + // For simplicity, we protect this whole method by a mutex. It is not in + // the hot path, i.e. Observe is called much more often than Write. The + // complication of making Write lock-free isn't worth it, if possible at + // all. + h.writeMtx.Lock() + defer h.writeMtx.Unlock() + + // Adding 1<<63 switches the hot index (from 0 to 1 or from 1 to 0) + // without touching the count bits. See the struct comments for a full + // description of the algorithm. + n := atomic.AddUint64(&h.countAndHotIdx, 1<<63) + // count is contained unchanged in the lower 63 bits. + count := n & ((1 << 63) - 1) + // The most significant bit tells us which counts is hot. The complement + // is thus the cold one. + hotCounts := h.counts[n>>63] + coldCounts := h.counts[(^n)>>63] + + // Await cooldown. + for count != atomic.LoadUint64(&coldCounts.count) { + runtime.Gosched() // Let observations get work done. + } + + his := &dto.Histogram{ + Bucket: make([]*dto.Bucket, len(h.upperBounds)), + SampleCount: proto.Uint64(count), + SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + } + var cumCount uint64 + for i, upperBound := range h.upperBounds { + cumCount += atomic.LoadUint64(&coldCounts.buckets[i]) + his.Bucket[i] = &dto.Bucket{ + CumulativeCount: proto.Uint64(cumCount), + UpperBound: proto.Float64(upperBound), + } + if e := h.exemplars[i].Load(); e != nil { + his.Bucket[i].Exemplar = e.(*dto.Exemplar) + } + } + // If there is an exemplar for the +Inf bucket, we have to add that bucket explicitly. + if e := h.exemplars[len(h.upperBounds)].Load(); e != nil { + b := &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(math.Inf(1)), + Exemplar: e.(*dto.Exemplar), + } + his.Bucket = append(his.Bucket, b) + } + + out.Histogram = his + out.Label = h.labelPairs + + // Finally add all the cold counts to the new hot counts and reset the cold counts. + atomic.AddUint64(&hotCounts.count, count) + atomic.StoreUint64(&coldCounts.count, 0) + for { + oldBits := atomic.LoadUint64(&hotCounts.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + his.GetSampleSum()) + if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { + atomic.StoreUint64(&coldCounts.sumBits, 0) + break + } + } + for i := range h.upperBounds { + atomic.AddUint64(&hotCounts.buckets[i], atomic.LoadUint64(&coldCounts.buckets[i])) + atomic.StoreUint64(&coldCounts.buckets[i], 0) + } + return nil +} + +// findBucket returns the index of the bucket for the provided value, or +// len(h.upperBounds) for the +Inf bucket. +func (h *histogram) findBucket(v float64) int { + // TODO(beorn7): For small numbers of buckets (<30), a linear search is + // slightly faster than the binary search. If we really care, we could + // switch from one search strategy to the other depending on the number + // of buckets. + // + // Microbenchmarks (BenchmarkHistogramNoLabels): + // 11 buckets: 38.3 ns/op linear - binary 48.7 ns/op + // 100 buckets: 78.1 ns/op linear - binary 54.9 ns/op + // 300 buckets: 154 ns/op linear - binary 61.6 ns/op + return sort.SearchFloat64s(h.upperBounds, v) +} + +// observe is the implementation for Observe without the findBucket part. +func (h *histogram) observe(v float64, bucket int) { + // We increment h.countAndHotIdx so that the counter in the lower + // 63 bits gets incremented. At the same time, we get the new value + // back, which we can use to find the currently-hot counts. + n := atomic.AddUint64(&h.countAndHotIdx, 1) + hotCounts := h.counts[n>>63] + + if bucket < len(h.upperBounds) { + atomic.AddUint64(&hotCounts.buckets[bucket], 1) + } + for { + oldBits := atomic.LoadUint64(&hotCounts.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + v) + if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { + break + } + } + // Increment count last as we take it as a signal that the observation + // is complete. + atomic.AddUint64(&hotCounts.count, 1) +} + +// updateExemplar replaces the exemplar for the provided bucket. With empty +// labels, it's a no-op. It panics if any of the labels is invalid. +func (h *histogram) updateExemplar(v float64, bucket int, l Labels) { + if l == nil { + return + } + e, err := newExemplar(v, h.now(), l) + if err != nil { + panic(err) + } + h.exemplars[bucket].Store(e) +} + +// HistogramVec is a Collector that bundles a set of Histograms that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewHistogramVec. +type HistogramVec struct { + *metricVec +} + +// NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and +// partitioned by the given label names. +func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &HistogramVec{ + metricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newHistogram(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues returns the Histogram for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Histogram is created. +// +// It is possible to call this method without using the returned Histogram to only +// create the new Histogram but leave it at its starting value, a Histogram without +// any observations. +// +// Keeping the Histogram for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Histogram from the HistogramVec. In that case, the +// Histogram will still exist, but it will not be exported anymore, even if a +// Histogram with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc (minus any curried labels). +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (v *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { + metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Observer), err + } + return nil, err +} + +// GetMetricWith returns the Histogram for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Histogram is created. Implications of +// creating a Histogram without using it and keeping the Histogram for later use +// are the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc (minus any curried labels). +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (v *HistogramVec) GetMetricWith(labels Labels) (Observer, error) { + metric, err := v.metricVec.getMetricWith(labels) + if metric != nil { + return metric.(Observer), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. Not returning an +// error allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (v *HistogramVec) WithLabelValues(lvs ...string) Observer { + h, err := v.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return h +} + +// With works as GetMetricWith but panics where GetMetricWithLabels would have +// returned an error. Not returning an error allows shortcuts like +// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (v *HistogramVec) With(labels Labels) Observer { + h, err := v.GetMetricWith(labels) + if err != nil { + panic(err) + } + return h +} + +// CurryWith returns a vector curried with the provided labels, i.e. the +// returned vector has those labels pre-set for all labeled operations performed +// on it. The cardinality of the curried vector is reduced accordingly. The +// order of the remaining labels stays the same (just with the curried labels +// taken out of the sequence – which is relevant for the +// (GetMetric)WithLabelValues methods). It is possible to curry a curried +// vector, but only with labels not yet used for currying before. +// +// The metrics contained in the HistogramVec are shared between the curried and +// uncurried vectors. They are just accessed differently. Curried and uncurried +// vectors behave identically in terms of collection. Only one must be +// registered with a given registry (usually the uncurried version). The Reset +// method deletes all metrics, even if called on a curried vector. +func (v *HistogramVec) CurryWith(labels Labels) (ObserverVec, error) { + vec, err := v.curryWith(labels) + if vec != nil { + return &HistogramVec{vec}, err + } + return nil, err +} + +// MustCurryWith works as CurryWith but panics where CurryWith would have +// returned an error. +func (v *HistogramVec) MustCurryWith(labels Labels) ObserverVec { + vec, err := v.CurryWith(labels) + if err != nil { + panic(err) + } + return vec +} + +type constHistogram struct { + desc *Desc + count uint64 + sum float64 + buckets map[float64]uint64 + labelPairs []*dto.LabelPair +} + +func (h *constHistogram) Desc() *Desc { + return h.desc +} + +func (h *constHistogram) Write(out *dto.Metric) error { + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, 0, len(h.buckets)) + + his.SampleCount = proto.Uint64(h.count) + his.SampleSum = proto.Float64(h.sum) + + for upperBound, count := range h.buckets { + buckets = append(buckets, &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(upperBound), + }) + } + + if len(buckets) > 0 { + sort.Sort(buckSort(buckets)) + } + his.Bucket = buckets + + out.Histogram = his + out.Label = h.labelPairs + + return nil +} + +// NewConstHistogram returns a metric representing a Prometheus histogram with +// fixed values for the count, sum, and bucket counts. As those parameters +// cannot be changed, the returned value does not implement the Histogram +// interface (but only the Metric interface). Users of this package will not +// have much use for it in regular operations. However, when implementing custom +// Collectors, it is useful as a throw-away metric that is generated on the fly +// to send it to Prometheus in the Collect method. +// +// buckets is a map of upper bounds to cumulative counts, excluding the +Inf +// bucket. +// +// NewConstHistogram returns an error if the length of labelValues is not +// consistent with the variable labels in Desc or if Desc is invalid. +func NewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) (Metric, error) { + if desc.err != nil { + return nil, desc.err + } + if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + return nil, err + } + return &constHistogram{ + desc: desc, + count: count, + sum: sum, + buckets: buckets, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstHistogram is a version of NewConstHistogram that panics where +// NewConstMetric would have returned an error. +func MustNewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) Metric { + m, err := NewConstHistogram(desc, count, sum, buckets, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type buckSort []*dto.Bucket + +func (s buckSort) Len() int { + return len(s) +} + +func (s buckSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s buckSort) Less(i, j int) bool { + return s[i].GetUpperBound() < s[j].GetUpperBound() +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go new file mode 100644 index 00000000..351c26e1 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go @@ -0,0 +1,85 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package internal + +import ( + "sort" + + dto "github.com/prometheus/client_model/go" +) + +// metricSorter is a sortable slice of *dto.Metric. +type metricSorter []*dto.Metric + +func (s metricSorter) Len() int { + return len(s) +} + +func (s metricSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s metricSorter) Less(i, j int) bool { + if len(s[i].Label) != len(s[j].Label) { + // This should not happen. The metrics are + // inconsistent. However, we have to deal with the fact, as + // people might use custom collectors or metric family injection + // to create inconsistent metrics. So let's simply compare the + // number of labels in this case. That will still yield + // reproducible sorting. + return len(s[i].Label) < len(s[j].Label) + } + for n, lp := range s[i].Label { + vi := lp.GetValue() + vj := s[j].Label[n].GetValue() + if vi != vj { + return vi < vj + } + } + + // We should never arrive here. Multiple metrics with the same + // label set in the same scrape will lead to undefined ingestion + // behavior. However, as above, we have to provide stable sorting + // here, even for inconsistent metrics. So sort equal metrics + // by their timestamp, with missing timestamps (implying "now") + // coming last. + if s[i].TimestampMs == nil { + return false + } + if s[j].TimestampMs == nil { + return true + } + return s[i].GetTimestampMs() < s[j].GetTimestampMs() +} + +// NormalizeMetricFamilies returns a MetricFamily slice with empty +// MetricFamilies pruned and the remaining MetricFamilies sorted by name within +// the slice, with the contained Metrics sorted within each MetricFamily. +func NormalizeMetricFamilies(metricFamiliesByName map[string]*dto.MetricFamily) []*dto.MetricFamily { + for _, mf := range metricFamiliesByName { + sort.Sort(metricSorter(mf.Metric)) + } + names := make([]string, 0, len(metricFamiliesByName)) + for name, mf := range metricFamiliesByName { + if len(mf.Metric) > 0 { + names = append(names, name) + } + } + sort.Strings(names) + result := make([]*dto.MetricFamily, 0, len(names)) + for _, name := range names { + result = append(result, metricFamiliesByName[name]) + } + return result +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/labels.go b/vendor/github.com/prometheus/client_golang/prometheus/labels.go new file mode 100644 index 00000000..2744443a --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/labels.go @@ -0,0 +1,87 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "fmt" + "strings" + "unicode/utf8" + + "github.com/prometheus/common/model" +) + +// Labels represents a collection of label name -> value mappings. This type is +// commonly used with the With(Labels) and GetMetricWith(Labels) methods of +// metric vector Collectors, e.g.: +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +// +// The other use-case is the specification of constant label pairs in Opts or to +// create a Desc. +type Labels map[string]string + +// reservedLabelPrefix is a prefix which is not legal in user-supplied +// label names. +const reservedLabelPrefix = "__" + +var errInconsistentCardinality = errors.New("inconsistent label cardinality") + +func makeInconsistentCardinalityError(fqName string, labels, labelValues []string) error { + return fmt.Errorf( + "%s: %q has %d variable labels named %q but %d values %q were provided", + errInconsistentCardinality, fqName, + len(labels), labels, + len(labelValues), labelValues, + ) +} + +func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { + if len(labels) != expectedNumberOfValues { + return fmt.Errorf( + "%s: expected %d label values but got %d in %#v", + errInconsistentCardinality, expectedNumberOfValues, + len(labels), labels, + ) + } + + for name, val := range labels { + if !utf8.ValidString(val) { + return fmt.Errorf("label %s: value %q is not valid UTF-8", name, val) + } + } + + return nil +} + +func validateLabelValues(vals []string, expectedNumberOfValues int) error { + if len(vals) != expectedNumberOfValues { + return fmt.Errorf( + "%s: expected %d label values but got %d in %#v", + errInconsistentCardinality, expectedNumberOfValues, + len(vals), vals, + ) + } + + for _, val := range vals { + if !utf8.ValidString(val) { + return fmt.Errorf("label value %q is not valid UTF-8", val) + } + } + + return nil +} + +func checkLabelName(l string) bool { + return model.LabelName(l).IsValid() && !strings.HasPrefix(l, reservedLabelPrefix) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/metric.go new file mode 100644 index 00000000..0df1eff8 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -0,0 +1,175 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "strings" + "time" + + "github.com/golang/protobuf/proto" + "github.com/prometheus/common/model" + + dto "github.com/prometheus/client_model/go" +) + +var separatorByteSlice = []byte{model.SeparatorByte} // For convenient use with xxhash. + +// A Metric models a single sample value with its meta data being exported to +// Prometheus. Implementations of Metric in this package are Gauge, Counter, +// Histogram, Summary, and Untyped. +type Metric interface { + // Desc returns the descriptor for the Metric. This method idempotently + // returns the same descriptor throughout the lifetime of the + // Metric. The returned descriptor is immutable by contract. A Metric + // unable to describe itself must return an invalid descriptor (created + // with NewInvalidDesc). + Desc() *Desc + // Write encodes the Metric into a "Metric" Protocol Buffer data + // transmission object. + // + // Metric implementations must observe concurrency safety as reads of + // this metric may occur at any time, and any blocking occurs at the + // expense of total performance of rendering all registered + // metrics. Ideally, Metric implementations should support concurrent + // readers. + // + // While populating dto.Metric, it is the responsibility of the + // implementation to ensure validity of the Metric protobuf (like valid + // UTF-8 strings or syntactically valid metric and label names). It is + // recommended to sort labels lexicographically. Callers of Write should + // still make sure of sorting if they depend on it. + Write(*dto.Metric) error + // TODO(beorn7): The original rationale of passing in a pre-allocated + // dto.Metric protobuf to save allocations has disappeared. The + // signature of this method should be changed to "Write() (*dto.Metric, + // error)". +} + +// Opts bundles the options for creating most Metric types. Each metric +// implementation XXX has its own XXXOpts type, but in most cases, it is just be +// an alias of this type (which might change when the requirement arises.) +// +// It is mandatory to set Name to a non-empty string. All other fields are +// optional and can safely be left at their zero value, although it is strongly +// encouraged to set a Help string. +type Opts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Metric (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the metric must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this metric. + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this metric. Metrics + // with the same fully-qualified name must have the same label names in + // their ConstLabels. + // + // ConstLabels are only used rarely. In particular, do not use them to + // attach the same labels to all your metrics. Those use cases are + // better covered by target labels set by the scraping Prometheus + // server, or by one specific metric (e.g. a build_info or a + // machine_role metric). See also + // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels + ConstLabels Labels +} + +// BuildFQName joins the given three name components by "_". Empty name +// components are ignored. If the name parameter itself is empty, an empty +// string is returned, no matter what. Metric implementations included in this +// library use this function internally to generate the fully-qualified metric +// name from the name component in their Opts. Users of the library will only +// need this function if they implement their own Metric or instantiate a Desc +// (with NewDesc) directly. +func BuildFQName(namespace, subsystem, name string) string { + if name == "" { + return "" + } + switch { + case namespace != "" && subsystem != "": + return strings.Join([]string{namespace, subsystem, name}, "_") + case namespace != "": + return strings.Join([]string{namespace, name}, "_") + case subsystem != "": + return strings.Join([]string{subsystem, name}, "_") + } + return name +} + +// labelPairSorter implements sort.Interface. It is used to sort a slice of +// dto.LabelPair pointers. +type labelPairSorter []*dto.LabelPair + +func (s labelPairSorter) Len() int { + return len(s) +} + +func (s labelPairSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s labelPairSorter) Less(i, j int) bool { + return s[i].GetName() < s[j].GetName() +} + +type invalidMetric struct { + desc *Desc + err error +} + +// NewInvalidMetric returns a metric whose Write method always returns the +// provided error. It is useful if a Collector finds itself unable to collect +// a metric and wishes to report an error to the registry. +func NewInvalidMetric(desc *Desc, err error) Metric { + return &invalidMetric{desc, err} +} + +func (m *invalidMetric) Desc() *Desc { return m.desc } + +func (m *invalidMetric) Write(*dto.Metric) error { return m.err } + +type timestampedMetric struct { + Metric + t time.Time +} + +func (m timestampedMetric) Write(pb *dto.Metric) error { + e := m.Metric.Write(pb) + pb.TimestampMs = proto.Int64(m.t.Unix()*1000 + int64(m.t.Nanosecond()/1000000)) + return e +} + +// NewMetricWithTimestamp returns a new Metric wrapping the provided Metric in a +// way that it has an explicit timestamp set to the provided Time. This is only +// useful in rare cases as the timestamp of a Prometheus metric should usually +// be set by the Prometheus server during scraping. Exceptions include mirroring +// metrics with given timestamps from other metric +// sources. +// +// NewMetricWithTimestamp works best with MustNewConstMetric, +// MustNewConstHistogram, and MustNewConstSummary, see example. +// +// Currently, the exposition formats used by Prometheus are limited to +// millisecond resolution. Thus, the provided time will be rounded down to the +// next full millisecond value. +func NewMetricWithTimestamp(t time.Time, m Metric) Metric { + return timestampedMetric{Metric: m, t: t} +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/observer.go b/vendor/github.com/prometheus/client_golang/prometheus/observer.go new file mode 100644 index 00000000..44128016 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/observer.go @@ -0,0 +1,64 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Observer is the interface that wraps the Observe method, which is used by +// Histogram and Summary to add observations. +type Observer interface { + Observe(float64) +} + +// The ObserverFunc type is an adapter to allow the use of ordinary +// functions as Observers. If f is a function with the appropriate +// signature, ObserverFunc(f) is an Observer that calls f. +// +// This adapter is usually used in connection with the Timer type, and there are +// two general use cases: +// +// The most common one is to use a Gauge as the Observer for a Timer. +// See the "Gauge" Timer example. +// +// The more advanced use case is to create a function that dynamically decides +// which Observer to use for observing the duration. See the "Complex" Timer +// example. +type ObserverFunc func(float64) + +// Observe calls f(value). It implements Observer. +func (f ObserverFunc) Observe(value float64) { + f(value) +} + +// ObserverVec is an interface implemented by `HistogramVec` and `SummaryVec`. +type ObserverVec interface { + GetMetricWith(Labels) (Observer, error) + GetMetricWithLabelValues(lvs ...string) (Observer, error) + With(Labels) Observer + WithLabelValues(...string) Observer + CurryWith(Labels) (ObserverVec, error) + MustCurryWith(Labels) ObserverVec + + Collector +} + +// ExemplarObserver is implemented by Observers that offer the option of +// observing a value together with an exemplar. Its ObserveWithExemplar method +// works like the Observe method of an Observer but also replaces the currently +// saved exemplar (if any) with a new one, created from the provided value, the +// current time as timestamp, and the provided Labels. Empty Labels will lead to +// a valid (label-less) exemplar. But if Labels is nil, the current exemplar is +// left in place. ObserveWithExemplar panics if any of the provided labels are +// invalid or if the provided labels contain more than 64 runes in total. +type ExemplarObserver interface { + ObserveWithExemplar(value float64, exemplar Labels) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go new file mode 100644 index 00000000..9b809794 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go @@ -0,0 +1,151 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "os" +) + +type processCollector struct { + collectFn func(chan<- Metric) + pidFn func() (int, error) + reportErrors bool + cpuTotal *Desc + openFDs, maxFDs *Desc + vsize, maxVsize *Desc + rss *Desc + startTime *Desc +} + +// ProcessCollectorOpts defines the behavior of a process metrics collector +// created with NewProcessCollector. +type ProcessCollectorOpts struct { + // PidFn returns the PID of the process the collector collects metrics + // for. It is called upon each collection. By default, the PID of the + // current process is used, as determined on construction time by + // calling os.Getpid(). + PidFn func() (int, error) + // If non-empty, each of the collected metrics is prefixed by the + // provided string and an underscore ("_"). + Namespace string + // If true, any error encountered during collection is reported as an + // invalid metric (see NewInvalidMetric). Otherwise, errors are ignored + // and the collected metrics will be incomplete. (Possibly, no metrics + // will be collected at all.) While that's usually not desired, it is + // appropriate for the common "mix-in" of process metrics, where process + // metrics are nice to have, but failing to collect them should not + // disrupt the collection of the remaining metrics. + ReportErrors bool +} + +// NewProcessCollector returns a collector which exports the current state of +// process metrics including CPU, memory and file descriptor usage as well as +// the process start time. The detailed behavior is defined by the provided +// ProcessCollectorOpts. The zero value of ProcessCollectorOpts creates a +// collector for the current process with an empty namespace string and no error +// reporting. +// +// The collector only works on operating systems with a Linux-style proc +// filesystem and on Microsoft Windows. On other operating systems, it will not +// collect any metrics. +func NewProcessCollector(opts ProcessCollectorOpts) Collector { + ns := "" + if len(opts.Namespace) > 0 { + ns = opts.Namespace + "_" + } + + c := &processCollector{ + reportErrors: opts.ReportErrors, + cpuTotal: NewDesc( + ns+"process_cpu_seconds_total", + "Total user and system CPU time spent in seconds.", + nil, nil, + ), + openFDs: NewDesc( + ns+"process_open_fds", + "Number of open file descriptors.", + nil, nil, + ), + maxFDs: NewDesc( + ns+"process_max_fds", + "Maximum number of open file descriptors.", + nil, nil, + ), + vsize: NewDesc( + ns+"process_virtual_memory_bytes", + "Virtual memory size in bytes.", + nil, nil, + ), + maxVsize: NewDesc( + ns+"process_virtual_memory_max_bytes", + "Maximum amount of virtual memory available in bytes.", + nil, nil, + ), + rss: NewDesc( + ns+"process_resident_memory_bytes", + "Resident memory size in bytes.", + nil, nil, + ), + startTime: NewDesc( + ns+"process_start_time_seconds", + "Start time of the process since unix epoch in seconds.", + nil, nil, + ), + } + + if opts.PidFn == nil { + pid := os.Getpid() + c.pidFn = func() (int, error) { return pid, nil } + } else { + c.pidFn = opts.PidFn + } + + // Set up process metric collection if supported by the runtime. + if canCollectProcess() { + c.collectFn = c.processCollect + } else { + c.collectFn = func(ch chan<- Metric) { + c.reportError(ch, nil, errors.New("process metrics not supported on this platform")) + } + } + + return c +} + +// Describe returns all descriptions of the collector. +func (c *processCollector) Describe(ch chan<- *Desc) { + ch <- c.cpuTotal + ch <- c.openFDs + ch <- c.maxFDs + ch <- c.vsize + ch <- c.maxVsize + ch <- c.rss + ch <- c.startTime +} + +// Collect returns the current state of all metrics of the collector. +func (c *processCollector) Collect(ch chan<- Metric) { + c.collectFn(ch) +} + +func (c *processCollector) reportError(ch chan<- Metric, desc *Desc, err error) { + if !c.reportErrors { + return + } + if desc == nil { + desc = NewInvalidDesc(err) + } + ch <- NewInvalidMetric(desc, err) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go new file mode 100644 index 00000000..3117461c --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go @@ -0,0 +1,65 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package prometheus + +import ( + "github.com/prometheus/procfs" +) + +func canCollectProcess() bool { + _, err := procfs.NewDefaultFS() + return err == nil +} + +func (c *processCollector) processCollect(ch chan<- Metric) { + pid, err := c.pidFn() + if err != nil { + c.reportError(ch, nil, err) + return + } + + p, err := procfs.NewProc(pid) + if err != nil { + c.reportError(ch, nil, err) + return + } + + if stat, err := p.Stat(); err == nil { + ch <- MustNewConstMetric(c.cpuTotal, CounterValue, stat.CPUTime()) + ch <- MustNewConstMetric(c.vsize, GaugeValue, float64(stat.VirtualMemory())) + ch <- MustNewConstMetric(c.rss, GaugeValue, float64(stat.ResidentMemory())) + if startTime, err := stat.StartTime(); err == nil { + ch <- MustNewConstMetric(c.startTime, GaugeValue, startTime) + } else { + c.reportError(ch, c.startTime, err) + } + } else { + c.reportError(ch, nil, err) + } + + if fds, err := p.FileDescriptorsLen(); err == nil { + ch <- MustNewConstMetric(c.openFDs, GaugeValue, float64(fds)) + } else { + c.reportError(ch, c.openFDs, err) + } + + if limits, err := p.Limits(); err == nil { + ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(limits.OpenFiles)) + ch <- MustNewConstMetric(c.maxVsize, GaugeValue, float64(limits.AddressSpace)) + } else { + c.reportError(ch, nil, err) + } +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go new file mode 100644 index 00000000..e0b935d1 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go @@ -0,0 +1,112 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +func canCollectProcess() bool { + return true +} + +var ( + modpsapi = syscall.NewLazyDLL("psapi.dll") + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + + procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo") + procGetProcessHandleCount = modkernel32.NewProc("GetProcessHandleCount") +) + +type processMemoryCounters struct { + // https://docs.microsoft.com/en-us/windows/desktop/api/psapi/ns-psapi-_process_memory_counters_ex + _ uint32 + PageFaultCount uint32 + PeakWorkingSetSize uint64 + WorkingSetSize uint64 + QuotaPeakPagedPoolUsage uint64 + QuotaPagedPoolUsage uint64 + QuotaPeakNonPagedPoolUsage uint64 + QuotaNonPagedPoolUsage uint64 + PagefileUsage uint64 + PeakPagefileUsage uint64 + PrivateUsage uint64 +} + +func getProcessMemoryInfo(handle windows.Handle) (processMemoryCounters, error) { + mem := processMemoryCounters{} + r1, _, err := procGetProcessMemoryInfo.Call( + uintptr(handle), + uintptr(unsafe.Pointer(&mem)), + uintptr(unsafe.Sizeof(mem)), + ) + if r1 != 1 { + return mem, err + } else { + return mem, nil + } +} + +func getProcessHandleCount(handle windows.Handle) (uint32, error) { + var count uint32 + r1, _, err := procGetProcessHandleCount.Call( + uintptr(handle), + uintptr(unsafe.Pointer(&count)), + ) + if r1 != 1 { + return 0, err + } else { + return count, nil + } +} + +func (c *processCollector) processCollect(ch chan<- Metric) { + h, err := windows.GetCurrentProcess() + if err != nil { + c.reportError(ch, nil, err) + return + } + + var startTime, exitTime, kernelTime, userTime windows.Filetime + err = windows.GetProcessTimes(h, &startTime, &exitTime, &kernelTime, &userTime) + if err != nil { + c.reportError(ch, nil, err) + return + } + ch <- MustNewConstMetric(c.startTime, GaugeValue, float64(startTime.Nanoseconds()/1e9)) + ch <- MustNewConstMetric(c.cpuTotal, CounterValue, fileTimeToSeconds(kernelTime)+fileTimeToSeconds(userTime)) + + mem, err := getProcessMemoryInfo(h) + if err != nil { + c.reportError(ch, nil, err) + return + } + ch <- MustNewConstMetric(c.vsize, GaugeValue, float64(mem.PrivateUsage)) + ch <- MustNewConstMetric(c.rss, GaugeValue, float64(mem.WorkingSetSize)) + + handles, err := getProcessHandleCount(h) + if err != nil { + c.reportError(ch, nil, err) + return + } + ch <- MustNewConstMetric(c.openFDs, GaugeValue, float64(handles)) + ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(16*1024*1024)) // Windows has a hard-coded max limit, not per-process. +} + +func fileTimeToSeconds(ft windows.Filetime) float64 { + return float64(uint64(ft.HighDateTime)<<32+uint64(ft.LowDateTime)) / 1e7 +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/vendor/github.com/prometheus/client_golang/prometheus/registry.go new file mode 100644 index 00000000..c05d6ee1 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -0,0 +1,947 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "sort" + "strings" + "sync" + "unicode/utf8" + + "github.com/cespare/xxhash/v2" + "github.com/golang/protobuf/proto" + "github.com/prometheus/common/expfmt" + + dto "github.com/prometheus/client_model/go" + + "github.com/prometheus/client_golang/prometheus/internal" +) + +const ( + // Capacity for the channel to collect metrics and descriptors. + capMetricChan = 1000 + capDescChan = 10 +) + +// DefaultRegisterer and DefaultGatherer are the implementations of the +// Registerer and Gatherer interface a number of convenience functions in this +// package act on. Initially, both variables point to the same Registry, which +// has a process collector (currently on Linux only, see NewProcessCollector) +// and a Go collector (see NewGoCollector, in particular the note about +// stop-the-world implication with Go versions older than 1.9) already +// registered. This approach to keep default instances as global state mirrors +// the approach of other packages in the Go standard library. Note that there +// are caveats. Change the variables with caution and only if you understand the +// consequences. Users who want to avoid global state altogether should not use +// the convenience functions and act on custom instances instead. +var ( + defaultRegistry = NewRegistry() + DefaultRegisterer Registerer = defaultRegistry + DefaultGatherer Gatherer = defaultRegistry +) + +func init() { + MustRegister(NewProcessCollector(ProcessCollectorOpts{})) + MustRegister(NewGoCollector()) +} + +// NewRegistry creates a new vanilla Registry without any Collectors +// pre-registered. +func NewRegistry() *Registry { + return &Registry{ + collectorsByID: map[uint64]Collector{}, + descIDs: map[uint64]struct{}{}, + dimHashesByName: map[string]uint64{}, + } +} + +// NewPedanticRegistry returns a registry that checks during collection if each +// collected Metric is consistent with its reported Desc, and if the Desc has +// actually been registered with the registry. Unchecked Collectors (those whose +// Describe method does not yield any descriptors) are excluded from the check. +// +// Usually, a Registry will be happy as long as the union of all collected +// Metrics is consistent and valid even if some metrics are not consistent with +// their own Desc or a Desc provided by their registered Collector. Well-behaved +// Collectors and Metrics will only provide consistent Descs. This Registry is +// useful to test the implementation of Collectors and Metrics. +func NewPedanticRegistry() *Registry { + r := NewRegistry() + r.pedanticChecksEnabled = true + return r +} + +// Registerer is the interface for the part of a registry in charge of +// registering and unregistering. Users of custom registries should use +// Registerer as type for registration purposes (rather than the Registry type +// directly). In that way, they are free to use custom Registerer implementation +// (e.g. for testing purposes). +type Registerer interface { + // Register registers a new Collector to be included in metrics + // collection. It returns an error if the descriptors provided by the + // Collector are invalid or if they — in combination with descriptors of + // already registered Collectors — do not fulfill the consistency and + // uniqueness criteria described in the documentation of metric.Desc. + // + // If the provided Collector is equal to a Collector already registered + // (which includes the case of re-registering the same Collector), the + // returned error is an instance of AlreadyRegisteredError, which + // contains the previously registered Collector. + // + // A Collector whose Describe method does not yield any Desc is treated + // as unchecked. Registration will always succeed. No check for + // re-registering (see previous paragraph) is performed. Thus, the + // caller is responsible for not double-registering the same unchecked + // Collector, and for providing a Collector that will not cause + // inconsistent metrics on collection. (This would lead to scrape + // errors.) + Register(Collector) error + // MustRegister works like Register but registers any number of + // Collectors and panics upon the first registration that causes an + // error. + MustRegister(...Collector) + // Unregister unregisters the Collector that equals the Collector passed + // in as an argument. (Two Collectors are considered equal if their + // Describe method yields the same set of descriptors.) The function + // returns whether a Collector was unregistered. Note that an unchecked + // Collector cannot be unregistered (as its Describe method does not + // yield any descriptor). + // + // Note that even after unregistering, it will not be possible to + // register a new Collector that is inconsistent with the unregistered + // Collector, e.g. a Collector collecting metrics with the same name but + // a different help string. The rationale here is that the same registry + // instance must only collect consistent metrics throughout its + // lifetime. + Unregister(Collector) bool +} + +// Gatherer is the interface for the part of a registry in charge of gathering +// the collected metrics into a number of MetricFamilies. The Gatherer interface +// comes with the same general implication as described for the Registerer +// interface. +type Gatherer interface { + // Gather calls the Collect method of the registered Collectors and then + // gathers the collected metrics into a lexicographically sorted slice + // of uniquely named MetricFamily protobufs. Gather ensures that the + // returned slice is valid and self-consistent so that it can be used + // for valid exposition. As an exception to the strict consistency + // requirements described for metric.Desc, Gather will tolerate + // different sets of label names for metrics of the same metric family. + // + // Even if an error occurs, Gather attempts to gather as many metrics as + // possible. Hence, if a non-nil error is returned, the returned + // MetricFamily slice could be nil (in case of a fatal error that + // prevented any meaningful metric collection) or contain a number of + // MetricFamily protobufs, some of which might be incomplete, and some + // might be missing altogether. The returned error (which might be a + // MultiError) explains the details. Note that this is mostly useful for + // debugging purposes. If the gathered protobufs are to be used for + // exposition in actual monitoring, it is almost always better to not + // expose an incomplete result and instead disregard the returned + // MetricFamily protobufs in case the returned error is non-nil. + Gather() ([]*dto.MetricFamily, error) +} + +// Register registers the provided Collector with the DefaultRegisterer. +// +// Register is a shortcut for DefaultRegisterer.Register(c). See there for more +// details. +func Register(c Collector) error { + return DefaultRegisterer.Register(c) +} + +// MustRegister registers the provided Collectors with the DefaultRegisterer and +// panics if any error occurs. +// +// MustRegister is a shortcut for DefaultRegisterer.MustRegister(cs...). See +// there for more details. +func MustRegister(cs ...Collector) { + DefaultRegisterer.MustRegister(cs...) +} + +// Unregister removes the registration of the provided Collector from the +// DefaultRegisterer. +// +// Unregister is a shortcut for DefaultRegisterer.Unregister(c). See there for +// more details. +func Unregister(c Collector) bool { + return DefaultRegisterer.Unregister(c) +} + +// GathererFunc turns a function into a Gatherer. +type GathererFunc func() ([]*dto.MetricFamily, error) + +// Gather implements Gatherer. +func (gf GathererFunc) Gather() ([]*dto.MetricFamily, error) { + return gf() +} + +// AlreadyRegisteredError is returned by the Register method if the Collector to +// be registered has already been registered before, or a different Collector +// that collects the same metrics has been registered before. Registration fails +// in that case, but you can detect from the kind of error what has +// happened. The error contains fields for the existing Collector and the +// (rejected) new Collector that equals the existing one. This can be used to +// find out if an equal Collector has been registered before and switch over to +// using the old one, as demonstrated in the example. +type AlreadyRegisteredError struct { + ExistingCollector, NewCollector Collector +} + +func (err AlreadyRegisteredError) Error() string { + return "duplicate metrics collector registration attempted" +} + +// MultiError is a slice of errors implementing the error interface. It is used +// by a Gatherer to report multiple errors during MetricFamily gathering. +type MultiError []error + +func (errs MultiError) Error() string { + if len(errs) == 0 { + return "" + } + buf := &bytes.Buffer{} + fmt.Fprintf(buf, "%d error(s) occurred:", len(errs)) + for _, err := range errs { + fmt.Fprintf(buf, "\n* %s", err) + } + return buf.String() +} + +// Append appends the provided error if it is not nil. +func (errs *MultiError) Append(err error) { + if err != nil { + *errs = append(*errs, err) + } +} + +// MaybeUnwrap returns nil if len(errs) is 0. It returns the first and only +// contained error as error if len(errs is 1). In all other cases, it returns +// the MultiError directly. This is helpful for returning a MultiError in a way +// that only uses the MultiError if needed. +func (errs MultiError) MaybeUnwrap() error { + switch len(errs) { + case 0: + return nil + case 1: + return errs[0] + default: + return errs + } +} + +// Registry registers Prometheus collectors, collects their metrics, and gathers +// them into MetricFamilies for exposition. It implements both Registerer and +// Gatherer. The zero value is not usable. Create instances with NewRegistry or +// NewPedanticRegistry. +type Registry struct { + mtx sync.RWMutex + collectorsByID map[uint64]Collector // ID is a hash of the descIDs. + descIDs map[uint64]struct{} + dimHashesByName map[string]uint64 + uncheckedCollectors []Collector + pedanticChecksEnabled bool +} + +// Register implements Registerer. +func (r *Registry) Register(c Collector) error { + var ( + descChan = make(chan *Desc, capDescChan) + newDescIDs = map[uint64]struct{}{} + newDimHashesByName = map[string]uint64{} + collectorID uint64 // All desc IDs XOR'd together. + duplicateDescErr error + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + r.mtx.Lock() + defer func() { + // Drain channel in case of premature return to not leak a goroutine. + for range descChan { + } + r.mtx.Unlock() + }() + // Conduct various tests... + for desc := range descChan { + + // Is the descriptor valid at all? + if desc.err != nil { + return fmt.Errorf("descriptor %s is invalid: %s", desc, desc.err) + } + + // Is the descID unique? + // (In other words: Is the fqName + constLabel combination unique?) + if _, exists := r.descIDs[desc.id]; exists { + duplicateDescErr = fmt.Errorf("descriptor %s already exists with the same fully-qualified name and const label values", desc) + } + // If it is not a duplicate desc in this collector, XOR it to + // the collectorID. (We allow duplicate descs within the same + // collector, but their existence must be a no-op.) + if _, exists := newDescIDs[desc.id]; !exists { + newDescIDs[desc.id] = struct{}{} + collectorID ^= desc.id + } + + // Are all the label names and the help string consistent with + // previous descriptors of the same name? + // First check existing descriptors... + if dimHash, exists := r.dimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("a previously registered descriptor with the same fully-qualified name as %s has different label names or a different help string", desc) + } + } else { + // ...then check the new descriptors already seen. + if dimHash, exists := newDimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("descriptors reported by collector have inconsistent label names or help strings for the same fully-qualified name, offender is %s", desc) + } + } else { + newDimHashesByName[desc.fqName] = desc.dimHash + } + } + } + // A Collector yielding no Desc at all is considered unchecked. + if len(newDescIDs) == 0 { + r.uncheckedCollectors = append(r.uncheckedCollectors, c) + return nil + } + if existing, exists := r.collectorsByID[collectorID]; exists { + switch e := existing.(type) { + case *wrappingCollector: + return AlreadyRegisteredError{ + ExistingCollector: e.unwrapRecursively(), + NewCollector: c, + } + default: + return AlreadyRegisteredError{ + ExistingCollector: e, + NewCollector: c, + } + } + } + // If the collectorID is new, but at least one of the descs existed + // before, we are in trouble. + if duplicateDescErr != nil { + return duplicateDescErr + } + + // Only after all tests have passed, actually register. + r.collectorsByID[collectorID] = c + for hash := range newDescIDs { + r.descIDs[hash] = struct{}{} + } + for name, dimHash := range newDimHashesByName { + r.dimHashesByName[name] = dimHash + } + return nil +} + +// Unregister implements Registerer. +func (r *Registry) Unregister(c Collector) bool { + var ( + descChan = make(chan *Desc, capDescChan) + descIDs = map[uint64]struct{}{} + collectorID uint64 // All desc IDs XOR'd together. + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + for desc := range descChan { + if _, exists := descIDs[desc.id]; !exists { + collectorID ^= desc.id + descIDs[desc.id] = struct{}{} + } + } + + r.mtx.RLock() + if _, exists := r.collectorsByID[collectorID]; !exists { + r.mtx.RUnlock() + return false + } + r.mtx.RUnlock() + + r.mtx.Lock() + defer r.mtx.Unlock() + + delete(r.collectorsByID, collectorID) + for id := range descIDs { + delete(r.descIDs, id) + } + // dimHashesByName is left untouched as those must be consistent + // throughout the lifetime of a program. + return true +} + +// MustRegister implements Registerer. +func (r *Registry) MustRegister(cs ...Collector) { + for _, c := range cs { + if err := r.Register(c); err != nil { + panic(err) + } + } +} + +// Gather implements Gatherer. +func (r *Registry) Gather() ([]*dto.MetricFamily, error) { + var ( + checkedMetricChan = make(chan Metric, capMetricChan) + uncheckedMetricChan = make(chan Metric, capMetricChan) + metricHashes = map[uint64]struct{}{} + wg sync.WaitGroup + errs MultiError // The collected errors to return in the end. + registeredDescIDs map[uint64]struct{} // Only used for pedantic checks + ) + + r.mtx.RLock() + goroutineBudget := len(r.collectorsByID) + len(r.uncheckedCollectors) + metricFamiliesByName := make(map[string]*dto.MetricFamily, len(r.dimHashesByName)) + checkedCollectors := make(chan Collector, len(r.collectorsByID)) + uncheckedCollectors := make(chan Collector, len(r.uncheckedCollectors)) + for _, collector := range r.collectorsByID { + checkedCollectors <- collector + } + for _, collector := range r.uncheckedCollectors { + uncheckedCollectors <- collector + } + // In case pedantic checks are enabled, we have to copy the map before + // giving up the RLock. + if r.pedanticChecksEnabled { + registeredDescIDs = make(map[uint64]struct{}, len(r.descIDs)) + for id := range r.descIDs { + registeredDescIDs[id] = struct{}{} + } + } + r.mtx.RUnlock() + + wg.Add(goroutineBudget) + + collectWorker := func() { + for { + select { + case collector := <-checkedCollectors: + collector.Collect(checkedMetricChan) + case collector := <-uncheckedCollectors: + collector.Collect(uncheckedMetricChan) + default: + return + } + wg.Done() + } + } + + // Start the first worker now to make sure at least one is running. + go collectWorker() + goroutineBudget-- + + // Close checkedMetricChan and uncheckedMetricChan once all collectors + // are collected. + go func() { + wg.Wait() + close(checkedMetricChan) + close(uncheckedMetricChan) + }() + + // Drain checkedMetricChan and uncheckedMetricChan in case of premature return. + defer func() { + if checkedMetricChan != nil { + for range checkedMetricChan { + } + } + if uncheckedMetricChan != nil { + for range uncheckedMetricChan { + } + } + }() + + // Copy the channel references so we can nil them out later to remove + // them from the select statements below. + cmc := checkedMetricChan + umc := uncheckedMetricChan + + for { + select { + case metric, ok := <-cmc: + if !ok { + cmc = nil + break + } + errs.Append(processMetric( + metric, metricFamiliesByName, + metricHashes, + registeredDescIDs, + )) + case metric, ok := <-umc: + if !ok { + umc = nil + break + } + errs.Append(processMetric( + metric, metricFamiliesByName, + metricHashes, + nil, + )) + default: + if goroutineBudget <= 0 || len(checkedCollectors)+len(uncheckedCollectors) == 0 { + // All collectors are already being worked on or + // we have already as many goroutines started as + // there are collectors. Do the same as above, + // just without the default. + select { + case metric, ok := <-cmc: + if !ok { + cmc = nil + break + } + errs.Append(processMetric( + metric, metricFamiliesByName, + metricHashes, + registeredDescIDs, + )) + case metric, ok := <-umc: + if !ok { + umc = nil + break + } + errs.Append(processMetric( + metric, metricFamiliesByName, + metricHashes, + nil, + )) + } + break + } + // Start more workers. + go collectWorker() + goroutineBudget-- + runtime.Gosched() + } + // Once both checkedMetricChan and uncheckdMetricChan are closed + // and drained, the contraption above will nil out cmc and umc, + // and then we can leave the collect loop here. + if cmc == nil && umc == nil { + break + } + } + return internal.NormalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// WriteToTextfile calls Gather on the provided Gatherer, encodes the result in the +// Prometheus text format, and writes it to a temporary file. Upon success, the +// temporary file is renamed to the provided filename. +// +// This is intended for use with the textfile collector of the node exporter. +// Note that the node exporter expects the filename to be suffixed with ".prom". +func WriteToTextfile(filename string, g Gatherer) error { + tmp, err := ioutil.TempFile(filepath.Dir(filename), filepath.Base(filename)) + if err != nil { + return err + } + defer os.Remove(tmp.Name()) + + mfs, err := g.Gather() + if err != nil { + return err + } + for _, mf := range mfs { + if _, err := expfmt.MetricFamilyToText(tmp, mf); err != nil { + return err + } + } + if err := tmp.Close(); err != nil { + return err + } + + if err := os.Chmod(tmp.Name(), 0644); err != nil { + return err + } + return os.Rename(tmp.Name(), filename) +} + +// processMetric is an internal helper method only used by the Gather method. +func processMetric( + metric Metric, + metricFamiliesByName map[string]*dto.MetricFamily, + metricHashes map[uint64]struct{}, + registeredDescIDs map[uint64]struct{}, +) error { + desc := metric.Desc() + // Wrapped metrics collected by an unchecked Collector can have an + // invalid Desc. + if desc.err != nil { + return desc.err + } + dtoMetric := &dto.Metric{} + if err := metric.Write(dtoMetric); err != nil { + return fmt.Errorf("error collecting metric %v: %s", desc, err) + } + metricFamily, ok := metricFamiliesByName[desc.fqName] + if ok { // Existing name. + if metricFamily.GetHelp() != desc.help { + return fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + desc.fqName, dtoMetric, desc.help, metricFamily.GetHelp(), + ) + } + // TODO(beorn7): Simplify switch once Desc has type. + switch metricFamily.GetType() { + case dto.MetricType_COUNTER: + if dtoMetric.Counter == nil { + return fmt.Errorf( + "collected metric %s %s should be a Counter", + desc.fqName, dtoMetric, + ) + } + case dto.MetricType_GAUGE: + if dtoMetric.Gauge == nil { + return fmt.Errorf( + "collected metric %s %s should be a Gauge", + desc.fqName, dtoMetric, + ) + } + case dto.MetricType_SUMMARY: + if dtoMetric.Summary == nil { + return fmt.Errorf( + "collected metric %s %s should be a Summary", + desc.fqName, dtoMetric, + ) + } + case dto.MetricType_UNTYPED: + if dtoMetric.Untyped == nil { + return fmt.Errorf( + "collected metric %s %s should be Untyped", + desc.fqName, dtoMetric, + ) + } + case dto.MetricType_HISTOGRAM: + if dtoMetric.Histogram == nil { + return fmt.Errorf( + "collected metric %s %s should be a Histogram", + desc.fqName, dtoMetric, + ) + } + default: + panic("encountered MetricFamily with invalid type") + } + } else { // New name. + metricFamily = &dto.MetricFamily{} + metricFamily.Name = proto.String(desc.fqName) + metricFamily.Help = proto.String(desc.help) + // TODO(beorn7): Simplify switch once Desc has type. + switch { + case dtoMetric.Gauge != nil: + metricFamily.Type = dto.MetricType_GAUGE.Enum() + case dtoMetric.Counter != nil: + metricFamily.Type = dto.MetricType_COUNTER.Enum() + case dtoMetric.Summary != nil: + metricFamily.Type = dto.MetricType_SUMMARY.Enum() + case dtoMetric.Untyped != nil: + metricFamily.Type = dto.MetricType_UNTYPED.Enum() + case dtoMetric.Histogram != nil: + metricFamily.Type = dto.MetricType_HISTOGRAM.Enum() + default: + return fmt.Errorf("empty metric collected: %s", dtoMetric) + } + if err := checkSuffixCollisions(metricFamily, metricFamiliesByName); err != nil { + return err + } + metricFamiliesByName[desc.fqName] = metricFamily + } + if err := checkMetricConsistency(metricFamily, dtoMetric, metricHashes); err != nil { + return err + } + if registeredDescIDs != nil { + // Is the desc registered at all? + if _, exist := registeredDescIDs[desc.id]; !exist { + return fmt.Errorf( + "collected metric %s %s with unregistered descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + if err := checkDescConsistency(metricFamily, dtoMetric, desc); err != nil { + return err + } + } + metricFamily.Metric = append(metricFamily.Metric, dtoMetric) + return nil +} + +// Gatherers is a slice of Gatherer instances that implements the Gatherer +// interface itself. Its Gather method calls Gather on all Gatherers in the +// slice in order and returns the merged results. Errors returned from the +// Gather calls are all returned in a flattened MultiError. Duplicate and +// inconsistent Metrics are skipped (first occurrence in slice order wins) and +// reported in the returned error. +// +// Gatherers can be used to merge the Gather results from multiple +// Registries. It also provides a way to directly inject existing MetricFamily +// protobufs into the gathering by creating a custom Gatherer with a Gather +// method that simply returns the existing MetricFamily protobufs. Note that no +// registration is involved (in contrast to Collector registration), so +// obviously registration-time checks cannot happen. Any inconsistencies between +// the gathered MetricFamilies are reported as errors by the Gather method, and +// inconsistent Metrics are dropped. Invalid parts of the MetricFamilies +// (e.g. syntactically invalid metric or label names) will go undetected. +type Gatherers []Gatherer + +// Gather implements Gatherer. +func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { + var ( + metricFamiliesByName = map[string]*dto.MetricFamily{} + metricHashes = map[uint64]struct{}{} + errs MultiError // The collected errors to return in the end. + ) + + for i, g := range gs { + mfs, err := g.Gather() + if err != nil { + if multiErr, ok := err.(MultiError); ok { + for _, err := range multiErr { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } else { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } + for _, mf := range mfs { + existingMF, exists := metricFamiliesByName[mf.GetName()] + if exists { + if existingMF.GetHelp() != mf.GetHelp() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has help %q but should have %q", + mf.GetName(), mf.GetHelp(), existingMF.GetHelp(), + )) + continue + } + if existingMF.GetType() != mf.GetType() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has type %s but should have %s", + mf.GetName(), mf.GetType(), existingMF.GetType(), + )) + continue + } + } else { + existingMF = &dto.MetricFamily{} + existingMF.Name = mf.Name + existingMF.Help = mf.Help + existingMF.Type = mf.Type + if err := checkSuffixCollisions(existingMF, metricFamiliesByName); err != nil { + errs = append(errs, err) + continue + } + metricFamiliesByName[mf.GetName()] = existingMF + } + for _, m := range mf.Metric { + if err := checkMetricConsistency(existingMF, m, metricHashes); err != nil { + errs = append(errs, err) + continue + } + existingMF.Metric = append(existingMF.Metric, m) + } + } + } + return internal.NormalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// checkSuffixCollisions checks for collisions with the “magic” suffixes the +// Prometheus text format and the internal metric representation of the +// Prometheus server add while flattening Summaries and Histograms. +func checkSuffixCollisions(mf *dto.MetricFamily, mfs map[string]*dto.MetricFamily) error { + var ( + newName = mf.GetName() + newType = mf.GetType() + newNameWithoutSuffix = "" + ) + switch { + case strings.HasSuffix(newName, "_count"): + newNameWithoutSuffix = newName[:len(newName)-6] + case strings.HasSuffix(newName, "_sum"): + newNameWithoutSuffix = newName[:len(newName)-4] + case strings.HasSuffix(newName, "_bucket"): + newNameWithoutSuffix = newName[:len(newName)-7] + } + if newNameWithoutSuffix != "" { + if existingMF, ok := mfs[newNameWithoutSuffix]; ok { + switch existingMF.GetType() { + case dto.MetricType_SUMMARY: + if !strings.HasSuffix(newName, "_bucket") { + return fmt.Errorf( + "collected metric named %q collides with previously collected summary named %q", + newName, newNameWithoutSuffix, + ) + } + case dto.MetricType_HISTOGRAM: + return fmt.Errorf( + "collected metric named %q collides with previously collected histogram named %q", + newName, newNameWithoutSuffix, + ) + } + } + } + if newType == dto.MetricType_SUMMARY || newType == dto.MetricType_HISTOGRAM { + if _, ok := mfs[newName+"_count"]; ok { + return fmt.Errorf( + "collected histogram or summary named %q collides with previously collected metric named %q", + newName, newName+"_count", + ) + } + if _, ok := mfs[newName+"_sum"]; ok { + return fmt.Errorf( + "collected histogram or summary named %q collides with previously collected metric named %q", + newName, newName+"_sum", + ) + } + } + if newType == dto.MetricType_HISTOGRAM { + if _, ok := mfs[newName+"_bucket"]; ok { + return fmt.Errorf( + "collected histogram named %q collides with previously collected metric named %q", + newName, newName+"_bucket", + ) + } + } + return nil +} + +// checkMetricConsistency checks if the provided Metric is consistent with the +// provided MetricFamily. It also hashes the Metric labels and the MetricFamily +// name. If the resulting hash is already in the provided metricHashes, an error +// is returned. If not, it is added to metricHashes. +func checkMetricConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + metricHashes map[uint64]struct{}, +) error { + name := metricFamily.GetName() + + // Type consistency with metric family. + if metricFamily.GetType() == dto.MetricType_GAUGE && dtoMetric.Gauge == nil || + metricFamily.GetType() == dto.MetricType_COUNTER && dtoMetric.Counter == nil || + metricFamily.GetType() == dto.MetricType_SUMMARY && dtoMetric.Summary == nil || + metricFamily.GetType() == dto.MetricType_HISTOGRAM && dtoMetric.Histogram == nil || + metricFamily.GetType() == dto.MetricType_UNTYPED && dtoMetric.Untyped == nil { + return fmt.Errorf( + "collected metric %q { %s} is not a %s", + name, dtoMetric, metricFamily.GetType(), + ) + } + + previousLabelName := "" + for _, labelPair := range dtoMetric.GetLabel() { + labelName := labelPair.GetName() + if labelName == previousLabelName { + return fmt.Errorf( + "collected metric %q { %s} has two or more labels with the same name: %s", + name, dtoMetric, labelName, + ) + } + if !checkLabelName(labelName) { + return fmt.Errorf( + "collected metric %q { %s} has a label with an invalid name: %s", + name, dtoMetric, labelName, + ) + } + if dtoMetric.Summary != nil && labelName == quantileLabel { + return fmt.Errorf( + "collected metric %q { %s} must not have an explicit %q label", + name, dtoMetric, quantileLabel, + ) + } + if !utf8.ValidString(labelPair.GetValue()) { + return fmt.Errorf( + "collected metric %q { %s} has a label named %q whose value is not utf8: %#v", + name, dtoMetric, labelName, labelPair.GetValue()) + } + previousLabelName = labelName + } + + // Is the metric unique (i.e. no other metric with the same name and the same labels)? + h := xxhash.New() + h.WriteString(name) + h.Write(separatorByteSlice) + // Make sure label pairs are sorted. We depend on it for the consistency + // check. + if !sort.IsSorted(labelPairSorter(dtoMetric.Label)) { + // We cannot sort dtoMetric.Label in place as it is immutable by contract. + copiedLabels := make([]*dto.LabelPair, len(dtoMetric.Label)) + copy(copiedLabels, dtoMetric.Label) + sort.Sort(labelPairSorter(copiedLabels)) + dtoMetric.Label = copiedLabels + } + for _, lp := range dtoMetric.Label { + h.WriteString(lp.GetName()) + h.Write(separatorByteSlice) + h.WriteString(lp.GetValue()) + h.Write(separatorByteSlice) + } + hSum := h.Sum64() + if _, exists := metricHashes[hSum]; exists { + return fmt.Errorf( + "collected metric %q { %s} was collected before with the same name and label values", + name, dtoMetric, + ) + } + metricHashes[hSum] = struct{}{} + return nil +} + +func checkDescConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + desc *Desc, +) error { + // Desc help consistency with metric family help. + if metricFamily.GetHelp() != desc.help { + return fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + metricFamily.GetName(), dtoMetric, metricFamily.GetHelp(), desc.help, + ) + } + + // Is the desc consistent with the content of the metric? + lpsFromDesc := make([]*dto.LabelPair, len(desc.constLabelPairs), len(dtoMetric.Label)) + copy(lpsFromDesc, desc.constLabelPairs) + for _, l := range desc.variableLabels { + lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ + Name: proto.String(l), + }) + } + if len(lpsFromDesc) != len(dtoMetric.Label) { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + sort.Sort(labelPairSorter(lpsFromDesc)) + for i, lpFromDesc := range lpsFromDesc { + lpFromMetric := dtoMetric.Label[i] + if lpFromDesc.GetName() != lpFromMetric.GetName() || + lpFromDesc.Value != nil && lpFromDesc.GetValue() != lpFromMetric.GetValue() { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + } + return nil +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/vendor/github.com/prometheus/client_golang/prometheus/summary.go new file mode 100644 index 00000000..ae42e761 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -0,0 +1,736 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "math" + "runtime" + "sort" + "sync" + "sync/atomic" + "time" + + "github.com/beorn7/perks/quantile" + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// quantileLabel is used for the label that defines the quantile in a +// summary. +const quantileLabel = "quantile" + +// A Summary captures individual observations from an event or sample stream and +// summarizes them in a manner similar to traditional summary statistics: 1. sum +// of observations, 2. observation count, 3. rank estimations. +// +// A typical use-case is the observation of request latencies. By default, a +// Summary provides the median, the 90th and the 99th percentile of the latency +// as rank estimations. However, the default behavior will change in the +// upcoming v1.0.0 of the library. There will be no rank estimations at all by +// default. For a sane transition, it is recommended to set the desired rank +// estimations explicitly. +// +// Note that the rank estimations cannot be aggregated in a meaningful way with +// the Prometheus query language (i.e. you cannot average or add them). If you +// need aggregatable quantiles (e.g. you want the 99th percentile latency of all +// queries served across all instances of a service), consider the Histogram +// metric type. See the Prometheus documentation for more details. +// +// To create Summary instances, use NewSummary. +type Summary interface { + Metric + Collector + + // Observe adds a single observation to the summary. + Observe(float64) +} + +var errQuantileLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in summaries", quantileLabel, +) + +// Default values for SummaryOpts. +const ( + // DefMaxAge is the default duration for which observations stay + // relevant. + DefMaxAge time.Duration = 10 * time.Minute + // DefAgeBuckets is the default number of buckets used to calculate the + // age of observations. + DefAgeBuckets = 5 + // DefBufCap is the standard buffer size for collecting Summary observations. + DefBufCap = 500 +) + +// SummaryOpts bundles the options for creating a Summary metric. It is +// mandatory to set Name to a non-empty string. While all other fields are +// optional and can safely be left at their zero value, it is recommended to set +// a help string and to explicitly set the Objectives field to the desired value +// as the default value will change in the upcoming v1.0.0 of the library. +type SummaryOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Summary (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Summary must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Summary. + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this metric. Metrics + // with the same fully-qualified name must have the same label names in + // their ConstLabels. + // + // Due to the way a Summary is represented in the Prometheus text format + // and how it is handled by the Prometheus server internally, “quantile” + // is an illegal label name. Construction of a Summary or SummaryVec + // will panic if this label name is used in ConstLabels. + // + // ConstLabels are only used rarely. In particular, do not use them to + // attach the same labels to all your metrics. Those use cases are + // better covered by target labels set by the scraping Prometheus + // server, or by one specific metric (e.g. a build_info or a + // machine_role metric). See also + // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels + ConstLabels Labels + + // Objectives defines the quantile rank estimates with their respective + // absolute error. If Objectives[q] = e, then the value reported for q + // will be the φ-quantile value for some φ between q-e and q+e. The + // default value is an empty map, resulting in a summary without + // quantiles. + Objectives map[float64]float64 + + // MaxAge defines the duration for which an observation stays relevant + // for the summary. Must be positive. The default value is DefMaxAge. + MaxAge time.Duration + + // AgeBuckets is the number of buckets used to exclude observations that + // are older than MaxAge from the summary. A higher number has a + // resource penalty, so only increase it if the higher resolution is + // really required. For very high observation rates, you might want to + // reduce the number of age buckets. With only one age bucket, you will + // effectively see a complete reset of the summary each time MaxAge has + // passed. The default value is DefAgeBuckets. + AgeBuckets uint32 + + // BufCap defines the default sample stream buffer size. The default + // value of DefBufCap should suffice for most uses. If there is a need + // to increase the value, a multiple of 500 is recommended (because that + // is the internal buffer size of the underlying package + // "github.com/bmizerany/perks/quantile"). + BufCap uint32 +} + +// Problem with the sliding-window decay algorithm... The Merge method of +// perk/quantile is actually not working as advertised - and it might be +// unfixable, as the underlying algorithm is apparently not capable of merging +// summaries in the first place. To avoid using Merge, we are currently adding +// observations to _each_ age bucket, i.e. the effort to add a sample is +// essentially multiplied by the number of age buckets. When rotating age +// buckets, we empty the previous head stream. On scrape time, we simply take +// the quantiles from the head stream (no merging required). Result: More effort +// on observation time, less effort on scrape time, which is exactly the +// opposite of what we try to accomplish, but at least the results are correct. +// +// The quite elegant previous contraption to merge the age buckets efficiently +// on scrape time (see code up commit 6b9530d72ea715f0ba612c0120e6e09fbf1d49d0) +// can't be used anymore. + +// NewSummary creates a new Summary based on the provided SummaryOpts. +func NewSummary(opts SummaryOpts) Summary { + return newSummary( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { + if len(desc.variableLabels) != len(labelValues) { + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, labelValues)) + } + + for _, n := range desc.variableLabels { + if n == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + + if opts.Objectives == nil { + opts.Objectives = map[float64]float64{} + } + + if opts.MaxAge < 0 { + panic(fmt.Errorf("illegal max age MaxAge=%v", opts.MaxAge)) + } + if opts.MaxAge == 0 { + opts.MaxAge = DefMaxAge + } + + if opts.AgeBuckets == 0 { + opts.AgeBuckets = DefAgeBuckets + } + + if opts.BufCap == 0 { + opts.BufCap = DefBufCap + } + + if len(opts.Objectives) == 0 { + // Use the lock-free implementation of a Summary without objectives. + s := &noObjectivesSummary{ + desc: desc, + labelPairs: makeLabelPairs(desc, labelValues), + counts: [2]*summaryCounts{{}, {}}, + } + s.init(s) // Init self-collection. + return s + } + + s := &summary{ + desc: desc, + + objectives: opts.Objectives, + sortedObjectives: make([]float64, 0, len(opts.Objectives)), + + labelPairs: makeLabelPairs(desc, labelValues), + + hotBuf: make([]float64, 0, opts.BufCap), + coldBuf: make([]float64, 0, opts.BufCap), + streamDuration: opts.MaxAge / time.Duration(opts.AgeBuckets), + } + s.headStreamExpTime = time.Now().Add(s.streamDuration) + s.hotBufExpTime = s.headStreamExpTime + + for i := uint32(0); i < opts.AgeBuckets; i++ { + s.streams = append(s.streams, s.newStream()) + } + s.headStream = s.streams[0] + + for qu := range s.objectives { + s.sortedObjectives = append(s.sortedObjectives, qu) + } + sort.Float64s(s.sortedObjectives) + + s.init(s) // Init self-collection. + return s +} + +type summary struct { + selfCollector + + bufMtx sync.Mutex // Protects hotBuf and hotBufExpTime. + mtx sync.Mutex // Protects every other moving part. + // Lock bufMtx before mtx if both are needed. + + desc *Desc + + objectives map[float64]float64 + sortedObjectives []float64 + + labelPairs []*dto.LabelPair + + sum float64 + cnt uint64 + + hotBuf, coldBuf []float64 + + streams []*quantile.Stream + streamDuration time.Duration + headStream *quantile.Stream + headStreamIdx int + headStreamExpTime, hotBufExpTime time.Time +} + +func (s *summary) Desc() *Desc { + return s.desc +} + +func (s *summary) Observe(v float64) { + s.bufMtx.Lock() + defer s.bufMtx.Unlock() + + now := time.Now() + if now.After(s.hotBufExpTime) { + s.asyncFlush(now) + } + s.hotBuf = append(s.hotBuf, v) + if len(s.hotBuf) == cap(s.hotBuf) { + s.asyncFlush(now) + } +} + +func (s *summary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.objectives)) + + s.bufMtx.Lock() + s.mtx.Lock() + // Swap bufs even if hotBuf is empty to set new hotBufExpTime. + s.swapBufs(time.Now()) + s.bufMtx.Unlock() + + s.flushColdBuf() + sum.SampleCount = proto.Uint64(s.cnt) + sum.SampleSum = proto.Float64(s.sum) + + for _, rank := range s.sortedObjectives { + var q float64 + if s.headStream.Count() == 0 { + q = math.NaN() + } else { + q = s.headStream.Query(rank) + } + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + s.mtx.Unlock() + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + return nil +} + +func (s *summary) newStream() *quantile.Stream { + return quantile.NewTargeted(s.objectives) +} + +// asyncFlush needs bufMtx locked. +func (s *summary) asyncFlush(now time.Time) { + s.mtx.Lock() + s.swapBufs(now) + + // Unblock the original goroutine that was responsible for the mutation + // that triggered the compaction. But hold onto the global non-buffer + // state mutex until the operation finishes. + go func() { + s.flushColdBuf() + s.mtx.Unlock() + }() +} + +// rotateStreams needs mtx AND bufMtx locked. +func (s *summary) maybeRotateStreams() { + for !s.hotBufExpTime.Equal(s.headStreamExpTime) { + s.headStream.Reset() + s.headStreamIdx++ + if s.headStreamIdx >= len(s.streams) { + s.headStreamIdx = 0 + } + s.headStream = s.streams[s.headStreamIdx] + s.headStreamExpTime = s.headStreamExpTime.Add(s.streamDuration) + } +} + +// flushColdBuf needs mtx locked. +func (s *summary) flushColdBuf() { + for _, v := range s.coldBuf { + for _, stream := range s.streams { + stream.Insert(v) + } + s.cnt++ + s.sum += v + } + s.coldBuf = s.coldBuf[0:0] + s.maybeRotateStreams() +} + +// swapBufs needs mtx AND bufMtx locked, coldBuf must be empty. +func (s *summary) swapBufs(now time.Time) { + if len(s.coldBuf) != 0 { + panic("coldBuf is not empty") + } + s.hotBuf, s.coldBuf = s.coldBuf, s.hotBuf + // hotBuf is now empty and gets new expiration set. + for now.After(s.hotBufExpTime) { + s.hotBufExpTime = s.hotBufExpTime.Add(s.streamDuration) + } +} + +type summaryCounts struct { + // sumBits contains the bits of the float64 representing the sum of all + // observations. sumBits and count have to go first in the struct to + // guarantee alignment for atomic operations. + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + sumBits uint64 + count uint64 +} + +type noObjectivesSummary struct { + // countAndHotIdx enables lock-free writes with use of atomic updates. + // The most significant bit is the hot index [0 or 1] of the count field + // below. Observe calls update the hot one. All remaining bits count the + // number of Observe calls. Observe starts by incrementing this counter, + // and finish by incrementing the count field in the respective + // summaryCounts, as a marker for completion. + // + // Calls of the Write method (which are non-mutating reads from the + // perspective of the summary) swap the hot–cold under the writeMtx + // lock. A cooldown is awaited (while locked) by comparing the number of + // observations with the initiation count. Once they match, then the + // last observation on the now cool one has completed. All cool fields must + // be merged into the new hot before releasing writeMtx. + + // Fields with atomic access first! See alignment constraint: + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + countAndHotIdx uint64 + + selfCollector + desc *Desc + writeMtx sync.Mutex // Only used in the Write method. + + // Two counts, one is "hot" for lock-free observations, the other is + // "cold" for writing out a dto.Metric. It has to be an array of + // pointers to guarantee 64bit alignment of the histogramCounts, see + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG. + counts [2]*summaryCounts + + labelPairs []*dto.LabelPair +} + +func (s *noObjectivesSummary) Desc() *Desc { + return s.desc +} + +func (s *noObjectivesSummary) Observe(v float64) { + // We increment h.countAndHotIdx so that the counter in the lower + // 63 bits gets incremented. At the same time, we get the new value + // back, which we can use to find the currently-hot counts. + n := atomic.AddUint64(&s.countAndHotIdx, 1) + hotCounts := s.counts[n>>63] + + for { + oldBits := atomic.LoadUint64(&hotCounts.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + v) + if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { + break + } + } + // Increment count last as we take it as a signal that the observation + // is complete. + atomic.AddUint64(&hotCounts.count, 1) +} + +func (s *noObjectivesSummary) Write(out *dto.Metric) error { + // For simplicity, we protect this whole method by a mutex. It is not in + // the hot path, i.e. Observe is called much more often than Write. The + // complication of making Write lock-free isn't worth it, if possible at + // all. + s.writeMtx.Lock() + defer s.writeMtx.Unlock() + + // Adding 1<<63 switches the hot index (from 0 to 1 or from 1 to 0) + // without touching the count bits. See the struct comments for a full + // description of the algorithm. + n := atomic.AddUint64(&s.countAndHotIdx, 1<<63) + // count is contained unchanged in the lower 63 bits. + count := n & ((1 << 63) - 1) + // The most significant bit tells us which counts is hot. The complement + // is thus the cold one. + hotCounts := s.counts[n>>63] + coldCounts := s.counts[(^n)>>63] + + // Await cooldown. + for count != atomic.LoadUint64(&coldCounts.count) { + runtime.Gosched() // Let observations get work done. + } + + sum := &dto.Summary{ + SampleCount: proto.Uint64(count), + SampleSum: proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))), + } + + out.Summary = sum + out.Label = s.labelPairs + + // Finally add all the cold counts to the new hot counts and reset the cold counts. + atomic.AddUint64(&hotCounts.count, count) + atomic.StoreUint64(&coldCounts.count, 0) + for { + oldBits := atomic.LoadUint64(&hotCounts.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + sum.GetSampleSum()) + if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { + atomic.StoreUint64(&coldCounts.sumBits, 0) + break + } + } + return nil +} + +type quantSort []*dto.Quantile + +func (s quantSort) Len() int { + return len(s) +} + +func (s quantSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s quantSort) Less(i, j int) bool { + return s[i].GetQuantile() < s[j].GetQuantile() +} + +// SummaryVec is a Collector that bundles a set of Summaries that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewSummaryVec. +type SummaryVec struct { + *metricVec +} + +// NewSummaryVec creates a new SummaryVec based on the provided SummaryOpts and +// partitioned by the given label names. +// +// Due to the way a Summary is represented in the Prometheus text format and how +// it is handled by the Prometheus server internally, “quantile” is an illegal +// label name. NewSummaryVec will panic if this label name is used. +func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { + for _, ln := range labelNames { + if ln == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &SummaryVec{ + metricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newSummary(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues returns the Summary for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Summary is created. +// +// It is possible to call this method without using the returned Summary to only +// create the new Summary but leave it at its starting value, a Summary without +// any observations. +// +// Keeping the Summary for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Summary from the SummaryVec. In that case, +// the Summary will still exist, but it will not be exported anymore, even if a +// Summary with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc (minus any curried labels). +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (v *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { + metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Observer), err + } + return nil, err +} + +// GetMetricWith returns the Summary for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Summary is created. Implications of +// creating a Summary without using it and keeping the Summary for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc (minus any curried labels). +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (v *SummaryVec) GetMetricWith(labels Labels) (Observer, error) { + metric, err := v.metricVec.getMetricWith(labels) + if metric != nil { + return metric.(Observer), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. Not returning an +// error allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (v *SummaryVec) WithLabelValues(lvs ...string) Observer { + s, err := v.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return s +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. Not returning an error allows shortcuts like +// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (v *SummaryVec) With(labels Labels) Observer { + s, err := v.GetMetricWith(labels) + if err != nil { + panic(err) + } + return s +} + +// CurryWith returns a vector curried with the provided labels, i.e. the +// returned vector has those labels pre-set for all labeled operations performed +// on it. The cardinality of the curried vector is reduced accordingly. The +// order of the remaining labels stays the same (just with the curried labels +// taken out of the sequence – which is relevant for the +// (GetMetric)WithLabelValues methods). It is possible to curry a curried +// vector, but only with labels not yet used for currying before. +// +// The metrics contained in the SummaryVec are shared between the curried and +// uncurried vectors. They are just accessed differently. Curried and uncurried +// vectors behave identically in terms of collection. Only one must be +// registered with a given registry (usually the uncurried version). The Reset +// method deletes all metrics, even if called on a curried vector. +func (v *SummaryVec) CurryWith(labels Labels) (ObserverVec, error) { + vec, err := v.curryWith(labels) + if vec != nil { + return &SummaryVec{vec}, err + } + return nil, err +} + +// MustCurryWith works as CurryWith but panics where CurryWith would have +// returned an error. +func (v *SummaryVec) MustCurryWith(labels Labels) ObserverVec { + vec, err := v.CurryWith(labels) + if err != nil { + panic(err) + } + return vec +} + +type constSummary struct { + desc *Desc + count uint64 + sum float64 + quantiles map[float64]float64 + labelPairs []*dto.LabelPair +} + +func (s *constSummary) Desc() *Desc { + return s.desc +} + +func (s *constSummary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.quantiles)) + + sum.SampleCount = proto.Uint64(s.count) + sum.SampleSum = proto.Float64(s.sum) + + for rank, q := range s.quantiles { + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + + return nil +} + +// NewConstSummary returns a metric representing a Prometheus summary with fixed +// values for the count, sum, and quantiles. As those parameters cannot be +// changed, the returned value does not implement the Summary interface (but +// only the Metric interface). Users of this package will not have much use for +// it in regular operations. However, when implementing custom Collectors, it is +// useful as a throw-away metric that is generated on the fly to send it to +// Prometheus in the Collect method. +// +// quantiles maps ranks to quantile values. For example, a median latency of +// 0.23s and a 99th percentile latency of 0.56s would be expressed as: +// map[float64]float64{0.5: 0.23, 0.99: 0.56} +// +// NewConstSummary returns an error if the length of labelValues is not +// consistent with the variable labels in Desc or if Desc is invalid. +func NewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) (Metric, error) { + if desc.err != nil { + return nil, desc.err + } + if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + return nil, err + } + return &constSummary{ + desc: desc, + count: count, + sum: sum, + quantiles: quantiles, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstSummary is a version of NewConstSummary that panics where +// NewConstMetric would have returned an error. +func MustNewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) Metric { + m, err := NewConstSummary(desc, count, sum, quantiles, labelValues...) + if err != nil { + panic(err) + } + return m +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/timer.go b/vendor/github.com/prometheus/client_golang/prometheus/timer.go new file mode 100644 index 00000000..8d5f1052 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/timer.go @@ -0,0 +1,54 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import "time" + +// Timer is a helper type to time functions. Use NewTimer to create new +// instances. +type Timer struct { + begin time.Time + observer Observer +} + +// NewTimer creates a new Timer. The provided Observer is used to observe a +// duration in seconds. Timer is usually used to time a function call in the +// following way: +// func TimeMe() { +// timer := NewTimer(myHistogram) +// defer timer.ObserveDuration() +// // Do actual work. +// } +func NewTimer(o Observer) *Timer { + return &Timer{ + begin: time.Now(), + observer: o, + } +} + +// ObserveDuration records the duration passed since the Timer was created with +// NewTimer. It calls the Observe method of the Observer provided during +// construction with the duration in seconds as an argument. The observed +// duration is also returned. ObserveDuration is usually called with a defer +// statement. +// +// Note that this method is only guaranteed to never observe negative durations +// if used with Go1.9+. +func (t *Timer) ObserveDuration() time.Duration { + d := time.Since(t.begin) + if t.observer != nil { + t.observer.Observe(d.Seconds()) + } + return d +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/untyped.go b/vendor/github.com/prometheus/client_golang/prometheus/untyped.go new file mode 100644 index 00000000..0f9ce63f --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/untyped.go @@ -0,0 +1,42 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// UntypedOpts is an alias for Opts. See there for doc comments. +type UntypedOpts Opts + +// UntypedFunc works like GaugeFunc but the collected metric is of type +// "Untyped". UntypedFunc is useful to mirror an external metric of unknown +// type. +// +// To create UntypedFunc instances, use NewUntypedFunc. +type UntypedFunc interface { + Metric + Collector +} + +// NewUntypedFunc creates a new UntypedFunc based on the provided +// UntypedOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where an UntypedFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func NewUntypedFunc(opts UntypedOpts, function func() float64) UntypedFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, function) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/value.go b/vendor/github.com/prometheus/client_golang/prometheus/value.go new file mode 100644 index 00000000..2be470ce --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -0,0 +1,204 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sort" + "time" + "unicode/utf8" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes" + + dto "github.com/prometheus/client_model/go" +) + +// ValueType is an enumeration of metric types that represent a simple value. +type ValueType int + +// Possible values for the ValueType enum. Use UntypedValue to mark a metric +// with an unknown type. +const ( + _ ValueType = iota + CounterValue + GaugeValue + UntypedValue +) + +// valueFunc is a generic metric for simple values retrieved on collect time +// from a function. It implements Metric and Collector. Its effective type is +// determined by ValueType. This is a low-level building block used by the +// library to back the implementations of CounterFunc, GaugeFunc, and +// UntypedFunc. +type valueFunc struct { + selfCollector + + desc *Desc + valType ValueType + function func() float64 + labelPairs []*dto.LabelPair +} + +// newValueFunc returns a newly allocated valueFunc with the given Desc and +// ValueType. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a valueFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func newValueFunc(desc *Desc, valueType ValueType, function func() float64) *valueFunc { + result := &valueFunc{ + desc: desc, + valType: valueType, + function: function, + labelPairs: makeLabelPairs(desc, nil), + } + result.init(result) + return result +} + +func (v *valueFunc) Desc() *Desc { + return v.desc +} + +func (v *valueFunc) Write(out *dto.Metric) error { + return populateMetric(v.valType, v.function(), v.labelPairs, nil, out) +} + +// NewConstMetric returns a metric with one fixed value that cannot be +// changed. Users of this package will not have much use for it in regular +// operations. However, when implementing custom Collectors, it is useful as a +// throw-away metric that is generated on the fly to send it to Prometheus in +// the Collect method. NewConstMetric returns an error if the length of +// labelValues is not consistent with the variable labels in Desc or if Desc is +// invalid. +func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) (Metric, error) { + if desc.err != nil { + return nil, desc.err + } + if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + return nil, err + } + return &constMetric{ + desc: desc, + valType: valueType, + val: value, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstMetric is a version of NewConstMetric that panics where +// NewConstMetric would have returned an error. +func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) Metric { + m, err := NewConstMetric(desc, valueType, value, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type constMetric struct { + desc *Desc + valType ValueType + val float64 + labelPairs []*dto.LabelPair +} + +func (m *constMetric) Desc() *Desc { + return m.desc +} + +func (m *constMetric) Write(out *dto.Metric) error { + return populateMetric(m.valType, m.val, m.labelPairs, nil, out) +} + +func populateMetric( + t ValueType, + v float64, + labelPairs []*dto.LabelPair, + e *dto.Exemplar, + m *dto.Metric, +) error { + m.Label = labelPairs + switch t { + case CounterValue: + m.Counter = &dto.Counter{Value: proto.Float64(v), Exemplar: e} + case GaugeValue: + m.Gauge = &dto.Gauge{Value: proto.Float64(v)} + case UntypedValue: + m.Untyped = &dto.Untyped{Value: proto.Float64(v)} + default: + return fmt.Errorf("encountered unknown type %v", t) + } + return nil +} + +func makeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { + totalLen := len(desc.variableLabels) + len(desc.constLabelPairs) + if totalLen == 0 { + // Super fast path. + return nil + } + if len(desc.variableLabels) == 0 { + // Moderately fast path. + return desc.constLabelPairs + } + labelPairs := make([]*dto.LabelPair, 0, totalLen) + for i, n := range desc.variableLabels { + labelPairs = append(labelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(labelValues[i]), + }) + } + labelPairs = append(labelPairs, desc.constLabelPairs...) + sort.Sort(labelPairSorter(labelPairs)) + return labelPairs +} + +// ExemplarMaxRunes is the max total number of runes allowed in exemplar labels. +const ExemplarMaxRunes = 64 + +// newExemplar creates a new dto.Exemplar from the provided values. An error is +// returned if any of the label names or values are invalid or if the total +// number of runes in the label names and values exceeds ExemplarMaxRunes. +func newExemplar(value float64, ts time.Time, l Labels) (*dto.Exemplar, error) { + e := &dto.Exemplar{} + e.Value = proto.Float64(value) + tsProto, err := ptypes.TimestampProto(ts) + if err != nil { + return nil, err + } + e.Timestamp = tsProto + labelPairs := make([]*dto.LabelPair, 0, len(l)) + var runes int + for name, value := range l { + if !checkLabelName(name) { + return nil, fmt.Errorf("exemplar label name %q is invalid", name) + } + runes += utf8.RuneCountInString(name) + if !utf8.ValidString(value) { + return nil, fmt.Errorf("exemplar label value %q is not valid UTF-8", value) + } + runes += utf8.RuneCountInString(value) + labelPairs = append(labelPairs, &dto.LabelPair{ + Name: proto.String(name), + Value: proto.String(value), + }) + } + if runes > ExemplarMaxRunes { + return nil, fmt.Errorf("exemplar labels have %d runes, exceeding the limit of %d", runes, ExemplarMaxRunes) + } + e.Label = labelPairs + return e, nil +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/vendor/github.com/prometheus/client_golang/prometheus/vec.go new file mode 100644 index 00000000..d53848dc --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -0,0 +1,484 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sync" + + "github.com/prometheus/common/model" +) + +// metricVec is a Collector to bundle metrics of the same name that differ in +// their label values. metricVec is not used directly (and therefore +// unexported). It is used as a building block for implementations of vectors of +// a given metric type, like GaugeVec, CounterVec, SummaryVec, and HistogramVec. +// It also handles label currying. +type metricVec struct { + *metricMap + + curry []curriedLabelValue + + // hashAdd and hashAddByte can be replaced for testing collision handling. + hashAdd func(h uint64, s string) uint64 + hashAddByte func(h uint64, b byte) uint64 +} + +// newMetricVec returns an initialized metricVec. +func newMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *metricVec { + return &metricVec{ + metricMap: &metricMap{ + metrics: map[uint64][]metricWithLabelValues{}, + desc: desc, + newMetric: newMetric, + }, + hashAdd: hashAdd, + hashAddByte: hashAddByte, + } +} + +// DeleteLabelValues removes the metric where the variable labels are the same +// as those passed in as labels (same order as the VariableLabels in Desc). It +// returns true if a metric was deleted. +// +// It is not an error if the number of label values is not the same as the +// number of VariableLabels in Desc. However, such inconsistent label count can +// never match an actual metric, so the method will always return false in that +// case. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider Delete(Labels) as an +// alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the CounterVec example. +func (m *metricVec) DeleteLabelValues(lvs ...string) bool { + h, err := m.hashLabelValues(lvs) + if err != nil { + return false + } + + return m.metricMap.deleteByHashWithLabelValues(h, lvs, m.curry) +} + +// Delete deletes the metric where the variable labels are the same as those +// passed in as labels. It returns true if a metric was deleted. +// +// It is not an error if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc. However, such inconsistent Labels +// can never match an actual metric, so the method will always return false in +// that case. +// +// This method is used for the same purpose as DeleteLabelValues(...string). See +// there for pros and cons of the two methods. +func (m *metricVec) Delete(labels Labels) bool { + h, err := m.hashLabels(labels) + if err != nil { + return false + } + + return m.metricMap.deleteByHashWithLabels(h, labels, m.curry) +} + +// Without explicit forwarding of Describe, Collect, Reset, those methods won't +// show up in GoDoc. + +// Describe implements Collector. +func (m *metricVec) Describe(ch chan<- *Desc) { m.metricMap.Describe(ch) } + +// Collect implements Collector. +func (m *metricVec) Collect(ch chan<- Metric) { m.metricMap.Collect(ch) } + +// Reset deletes all metrics in this vector. +func (m *metricVec) Reset() { m.metricMap.Reset() } + +func (m *metricVec) curryWith(labels Labels) (*metricVec, error) { + var ( + newCurry []curriedLabelValue + oldCurry = m.curry + iCurry int + ) + for i, label := range m.desc.variableLabels { + val, ok := labels[label] + if iCurry < len(oldCurry) && oldCurry[iCurry].index == i { + if ok { + return nil, fmt.Errorf("label name %q is already curried", label) + } + newCurry = append(newCurry, oldCurry[iCurry]) + iCurry++ + } else { + if !ok { + continue // Label stays uncurried. + } + newCurry = append(newCurry, curriedLabelValue{i, val}) + } + } + if l := len(oldCurry) + len(labels) - len(newCurry); l > 0 { + return nil, fmt.Errorf("%d unknown label(s) found during currying", l) + } + + return &metricVec{ + metricMap: m.metricMap, + curry: newCurry, + hashAdd: m.hashAdd, + hashAddByte: m.hashAddByte, + }, nil +} + +func (m *metricVec) getMetricWithLabelValues(lvs ...string) (Metric, error) { + h, err := m.hashLabelValues(lvs) + if err != nil { + return nil, err + } + + return m.metricMap.getOrCreateMetricWithLabelValues(h, lvs, m.curry), nil +} + +func (m *metricVec) getMetricWith(labels Labels) (Metric, error) { + h, err := m.hashLabels(labels) + if err != nil { + return nil, err + } + + return m.metricMap.getOrCreateMetricWithLabels(h, labels, m.curry), nil +} + +func (m *metricVec) hashLabelValues(vals []string) (uint64, error) { + if err := validateLabelValues(vals, len(m.desc.variableLabels)-len(m.curry)); err != nil { + return 0, err + } + + var ( + h = hashNew() + curry = m.curry + iVals, iCurry int + ) + for i := 0; i < len(m.desc.variableLabels); i++ { + if iCurry < len(curry) && curry[iCurry].index == i { + h = m.hashAdd(h, curry[iCurry].value) + iCurry++ + } else { + h = m.hashAdd(h, vals[iVals]) + iVals++ + } + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +func (m *metricVec) hashLabels(labels Labels) (uint64, error) { + if err := validateValuesInLabels(labels, len(m.desc.variableLabels)-len(m.curry)); err != nil { + return 0, err + } + + var ( + h = hashNew() + curry = m.curry + iCurry int + ) + for i, label := range m.desc.variableLabels { + val, ok := labels[label] + if iCurry < len(curry) && curry[iCurry].index == i { + if ok { + return 0, fmt.Errorf("label name %q is already curried", label) + } + h = m.hashAdd(h, curry[iCurry].value) + iCurry++ + } else { + if !ok { + return 0, fmt.Errorf("label name %q missing in label map", label) + } + h = m.hashAdd(h, val) + } + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +// metricWithLabelValues provides the metric and its label values for +// disambiguation on hash collision. +type metricWithLabelValues struct { + values []string + metric Metric +} + +// curriedLabelValue sets the curried value for a label at the given index. +type curriedLabelValue struct { + index int + value string +} + +// metricMap is a helper for metricVec and shared between differently curried +// metricVecs. +type metricMap struct { + mtx sync.RWMutex // Protects metrics. + metrics map[uint64][]metricWithLabelValues + desc *Desc + newMetric func(labelValues ...string) Metric +} + +// Describe implements Collector. It will send exactly one Desc to the provided +// channel. +func (m *metricMap) Describe(ch chan<- *Desc) { + ch <- m.desc +} + +// Collect implements Collector. +func (m *metricMap) Collect(ch chan<- Metric) { + m.mtx.RLock() + defer m.mtx.RUnlock() + + for _, metrics := range m.metrics { + for _, metric := range metrics { + ch <- metric.metric + } + } +} + +// Reset deletes all metrics in this vector. +func (m *metricMap) Reset() { + m.mtx.Lock() + defer m.mtx.Unlock() + + for h := range m.metrics { + delete(m.metrics, h) + } +} + +// deleteByHashWithLabelValues removes the metric from the hash bucket h. If +// there are multiple matches in the bucket, use lvs to select a metric and +// remove only that metric. +func (m *metricMap) deleteByHashWithLabelValues( + h uint64, lvs []string, curry []curriedLabelValue, +) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + metrics, ok := m.metrics[h] + if !ok { + return false + } + + i := findMetricWithLabelValues(metrics, lvs, curry) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.metrics[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.metrics, h) + } + return true +} + +// deleteByHashWithLabels removes the metric from the hash bucket h. If there +// are multiple matches in the bucket, use lvs to select a metric and remove +// only that metric. +func (m *metricMap) deleteByHashWithLabels( + h uint64, labels Labels, curry []curriedLabelValue, +) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + metrics, ok := m.metrics[h] + if !ok { + return false + } + i := findMetricWithLabels(m.desc, metrics, labels, curry) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.metrics[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.metrics, h) + } + return true +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *metricMap) getOrCreateMetricWithLabelValues( + hash uint64, lvs []string, curry []curriedLabelValue, +) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithHashAndLabelValues(hash, lvs, curry) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithHashAndLabelValues(hash, lvs, curry) + if !ok { + inlinedLVs := inlineLabelValues(lvs, curry) + metric = m.newMetric(inlinedLVs...) + m.metrics[hash] = append(m.metrics[hash], metricWithLabelValues{values: inlinedLVs, metric: metric}) + } + return metric +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *metricMap) getOrCreateMetricWithLabels( + hash uint64, labels Labels, curry []curriedLabelValue, +) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithHashAndLabels(hash, labels, curry) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithHashAndLabels(hash, labels, curry) + if !ok { + lvs := extractLabelValues(m.desc, labels, curry) + metric = m.newMetric(lvs...) + m.metrics[hash] = append(m.metrics[hash], metricWithLabelValues{values: lvs, metric: metric}) + } + return metric +} + +// getMetricWithHashAndLabelValues gets a metric while handling possible +// collisions in the hash space. Must be called while holding the read mutex. +func (m *metricMap) getMetricWithHashAndLabelValues( + h uint64, lvs []string, curry []curriedLabelValue, +) (Metric, bool) { + metrics, ok := m.metrics[h] + if ok { + if i := findMetricWithLabelValues(metrics, lvs, curry); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// getMetricWithHashAndLabels gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *metricMap) getMetricWithHashAndLabels( + h uint64, labels Labels, curry []curriedLabelValue, +) (Metric, bool) { + metrics, ok := m.metrics[h] + if ok { + if i := findMetricWithLabels(m.desc, metrics, labels, curry); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// findMetricWithLabelValues returns the index of the matching metric or +// len(metrics) if not found. +func findMetricWithLabelValues( + metrics []metricWithLabelValues, lvs []string, curry []curriedLabelValue, +) int { + for i, metric := range metrics { + if matchLabelValues(metric.values, lvs, curry) { + return i + } + } + return len(metrics) +} + +// findMetricWithLabels returns the index of the matching metric or len(metrics) +// if not found. +func findMetricWithLabels( + desc *Desc, metrics []metricWithLabelValues, labels Labels, curry []curriedLabelValue, +) int { + for i, metric := range metrics { + if matchLabels(desc, metric.values, labels, curry) { + return i + } + } + return len(metrics) +} + +func matchLabelValues(values []string, lvs []string, curry []curriedLabelValue) bool { + if len(values) != len(lvs)+len(curry) { + return false + } + var iLVs, iCurry int + for i, v := range values { + if iCurry < len(curry) && curry[iCurry].index == i { + if v != curry[iCurry].value { + return false + } + iCurry++ + continue + } + if v != lvs[iLVs] { + return false + } + iLVs++ + } + return true +} + +func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabelValue) bool { + if len(values) != len(labels)+len(curry) { + return false + } + iCurry := 0 + for i, k := range desc.variableLabels { + if iCurry < len(curry) && curry[iCurry].index == i { + if values[i] != curry[iCurry].value { + return false + } + iCurry++ + continue + } + if values[i] != labels[k] { + return false + } + } + return true +} + +func extractLabelValues(desc *Desc, labels Labels, curry []curriedLabelValue) []string { + labelValues := make([]string, len(labels)+len(curry)) + iCurry := 0 + for i, k := range desc.variableLabels { + if iCurry < len(curry) && curry[iCurry].index == i { + labelValues[i] = curry[iCurry].value + iCurry++ + continue + } + labelValues[i] = labels[k] + } + return labelValues +} + +func inlineLabelValues(lvs []string, curry []curriedLabelValue) []string { + labelValues := make([]string, len(lvs)+len(curry)) + var iCurry, iLVs int + for i := range labelValues { + if iCurry < len(curry) && curry[iCurry].index == i { + labelValues[i] = curry[iCurry].value + iCurry++ + continue + } + labelValues[i] = lvs[iLVs] + iLVs++ + } + return labelValues +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go new file mode 100644 index 00000000..e303eef6 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go @@ -0,0 +1,200 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sort" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// WrapRegistererWith returns a Registerer wrapping the provided +// Registerer. Collectors registered with the returned Registerer will be +// registered with the wrapped Registerer in a modified way. The modified +// Collector adds the provided Labels to all Metrics it collects (as +// ConstLabels). The Metrics collected by the unmodified Collector must not +// duplicate any of those labels. +// +// WrapRegistererWith provides a way to add fixed labels to a subset of +// Collectors. It should not be used to add fixed labels to all metrics exposed. +// +// Conflicts between Collectors registered through the original Registerer with +// Collectors registered through the wrapping Registerer will still be +// detected. Any AlreadyRegisteredError returned by the Register method of +// either Registerer will contain the ExistingCollector in the form it was +// provided to the respective registry. +// +// The Collector example demonstrates a use of WrapRegistererWith. +func WrapRegistererWith(labels Labels, reg Registerer) Registerer { + return &wrappingRegisterer{ + wrappedRegisterer: reg, + labels: labels, + } +} + +// WrapRegistererWithPrefix returns a Registerer wrapping the provided +// Registerer. Collectors registered with the returned Registerer will be +// registered with the wrapped Registerer in a modified way. The modified +// Collector adds the provided prefix to the name of all Metrics it collects. +// +// WrapRegistererWithPrefix is useful to have one place to prefix all metrics of +// a sub-system. To make this work, register metrics of the sub-system with the +// wrapping Registerer returned by WrapRegistererWithPrefix. It is rarely useful +// to use the same prefix for all metrics exposed. In particular, do not prefix +// metric names that are standardized across applications, as that would break +// horizontal monitoring, for example the metrics provided by the Go collector +// (see NewGoCollector) and the process collector (see NewProcessCollector). (In +// fact, those metrics are already prefixed with “go_” or “process_”, +// respectively.) +// +// Conflicts between Collectors registered through the original Registerer with +// Collectors registered through the wrapping Registerer will still be +// detected. Any AlreadyRegisteredError returned by the Register method of +// either Registerer will contain the ExistingCollector in the form it was +// provided to the respective registry. +func WrapRegistererWithPrefix(prefix string, reg Registerer) Registerer { + return &wrappingRegisterer{ + wrappedRegisterer: reg, + prefix: prefix, + } +} + +type wrappingRegisterer struct { + wrappedRegisterer Registerer + prefix string + labels Labels +} + +func (r *wrappingRegisterer) Register(c Collector) error { + return r.wrappedRegisterer.Register(&wrappingCollector{ + wrappedCollector: c, + prefix: r.prefix, + labels: r.labels, + }) +} + +func (r *wrappingRegisterer) MustRegister(cs ...Collector) { + for _, c := range cs { + if err := r.Register(c); err != nil { + panic(err) + } + } +} + +func (r *wrappingRegisterer) Unregister(c Collector) bool { + return r.wrappedRegisterer.Unregister(&wrappingCollector{ + wrappedCollector: c, + prefix: r.prefix, + labels: r.labels, + }) +} + +type wrappingCollector struct { + wrappedCollector Collector + prefix string + labels Labels +} + +func (c *wrappingCollector) Collect(ch chan<- Metric) { + wrappedCh := make(chan Metric) + go func() { + c.wrappedCollector.Collect(wrappedCh) + close(wrappedCh) + }() + for m := range wrappedCh { + ch <- &wrappingMetric{ + wrappedMetric: m, + prefix: c.prefix, + labels: c.labels, + } + } +} + +func (c *wrappingCollector) Describe(ch chan<- *Desc) { + wrappedCh := make(chan *Desc) + go func() { + c.wrappedCollector.Describe(wrappedCh) + close(wrappedCh) + }() + for desc := range wrappedCh { + ch <- wrapDesc(desc, c.prefix, c.labels) + } +} + +func (c *wrappingCollector) unwrapRecursively() Collector { + switch wc := c.wrappedCollector.(type) { + case *wrappingCollector: + return wc.unwrapRecursively() + default: + return wc + } +} + +type wrappingMetric struct { + wrappedMetric Metric + prefix string + labels Labels +} + +func (m *wrappingMetric) Desc() *Desc { + return wrapDesc(m.wrappedMetric.Desc(), m.prefix, m.labels) +} + +func (m *wrappingMetric) Write(out *dto.Metric) error { + if err := m.wrappedMetric.Write(out); err != nil { + return err + } + if len(m.labels) == 0 { + // No wrapping labels. + return nil + } + for ln, lv := range m.labels { + out.Label = append(out.Label, &dto.LabelPair{ + Name: proto.String(ln), + Value: proto.String(lv), + }) + } + sort.Sort(labelPairSorter(out.Label)) + return nil +} + +func wrapDesc(desc *Desc, prefix string, labels Labels) *Desc { + constLabels := Labels{} + for _, lp := range desc.constLabelPairs { + constLabels[*lp.Name] = *lp.Value + } + for ln, lv := range labels { + if _, alreadyUsed := constLabels[ln]; alreadyUsed { + return &Desc{ + fqName: desc.fqName, + help: desc.help, + variableLabels: desc.variableLabels, + constLabelPairs: desc.constLabelPairs, + err: fmt.Errorf("attempted wrapping with already existing label name %q", ln), + } + } + constLabels[ln] = lv + } + // NewDesc will do remaining validations. + newDesc := NewDesc(prefix+desc.fqName, desc.help, desc.variableLabels, constLabels) + // Propagate errors if there was any. This will override any errer + // created by NewDesc above, i.e. earlier errors get precedence. + if desc.err != nil { + newDesc.err = desc.err + } + return newDesc +} diff --git a/vendor/github.com/prometheus/client_model/LICENSE b/vendor/github.com/prometheus/client_model/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/prometheus/client_model/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/prometheus/client_model/NOTICE b/vendor/github.com/prometheus/client_model/NOTICE new file mode 100644 index 00000000..20110e41 --- /dev/null +++ b/vendor/github.com/prometheus/client_model/NOTICE @@ -0,0 +1,5 @@ +Data model artifacts for Prometheus. +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/vendor/github.com/prometheus/client_model/go/metrics.pb.go new file mode 100644 index 00000000..2f4930d9 --- /dev/null +++ b/vendor/github.com/prometheus/client_model/go/metrics.pb.go @@ -0,0 +1,723 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: metrics.proto + +package io_prometheus_client + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type MetricType int32 + +const ( + MetricType_COUNTER MetricType = 0 + MetricType_GAUGE MetricType = 1 + MetricType_SUMMARY MetricType = 2 + MetricType_UNTYPED MetricType = 3 + MetricType_HISTOGRAM MetricType = 4 +) + +var MetricType_name = map[int32]string{ + 0: "COUNTER", + 1: "GAUGE", + 2: "SUMMARY", + 3: "UNTYPED", + 4: "HISTOGRAM", +} + +var MetricType_value = map[string]int32{ + "COUNTER": 0, + "GAUGE": 1, + "SUMMARY": 2, + "UNTYPED": 3, + "HISTOGRAM": 4, +} + +func (x MetricType) Enum() *MetricType { + p := new(MetricType) + *p = x + return p +} + +func (x MetricType) String() string { + return proto.EnumName(MetricType_name, int32(x)) +} + +func (x *MetricType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MetricType_value, data, "MetricType") + if err != nil { + return err + } + *x = MetricType(value) + return nil +} + +func (MetricType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{0} +} + +type LabelPair struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LabelPair) Reset() { *m = LabelPair{} } +func (m *LabelPair) String() string { return proto.CompactTextString(m) } +func (*LabelPair) ProtoMessage() {} +func (*LabelPair) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{0} +} + +func (m *LabelPair) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LabelPair.Unmarshal(m, b) +} +func (m *LabelPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LabelPair.Marshal(b, m, deterministic) +} +func (m *LabelPair) XXX_Merge(src proto.Message) { + xxx_messageInfo_LabelPair.Merge(m, src) +} +func (m *LabelPair) XXX_Size() int { + return xxx_messageInfo_LabelPair.Size(m) +} +func (m *LabelPair) XXX_DiscardUnknown() { + xxx_messageInfo_LabelPair.DiscardUnknown(m) +} + +var xxx_messageInfo_LabelPair proto.InternalMessageInfo + +func (m *LabelPair) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *LabelPair) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +type Gauge struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Gauge) Reset() { *m = Gauge{} } +func (m *Gauge) String() string { return proto.CompactTextString(m) } +func (*Gauge) ProtoMessage() {} +func (*Gauge) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{1} +} + +func (m *Gauge) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Gauge.Unmarshal(m, b) +} +func (m *Gauge) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Gauge.Marshal(b, m, deterministic) +} +func (m *Gauge) XXX_Merge(src proto.Message) { + xxx_messageInfo_Gauge.Merge(m, src) +} +func (m *Gauge) XXX_Size() int { + return xxx_messageInfo_Gauge.Size(m) +} +func (m *Gauge) XXX_DiscardUnknown() { + xxx_messageInfo_Gauge.DiscardUnknown(m) +} + +var xxx_messageInfo_Gauge proto.InternalMessageInfo + +func (m *Gauge) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Counter struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + Exemplar *Exemplar `protobuf:"bytes,2,opt,name=exemplar" json:"exemplar,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Counter) Reset() { *m = Counter{} } +func (m *Counter) String() string { return proto.CompactTextString(m) } +func (*Counter) ProtoMessage() {} +func (*Counter) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{2} +} + +func (m *Counter) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Counter.Unmarshal(m, b) +} +func (m *Counter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Counter.Marshal(b, m, deterministic) +} +func (m *Counter) XXX_Merge(src proto.Message) { + xxx_messageInfo_Counter.Merge(m, src) +} +func (m *Counter) XXX_Size() int { + return xxx_messageInfo_Counter.Size(m) +} +func (m *Counter) XXX_DiscardUnknown() { + xxx_messageInfo_Counter.DiscardUnknown(m) +} + +var xxx_messageInfo_Counter proto.InternalMessageInfo + +func (m *Counter) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +func (m *Counter) GetExemplar() *Exemplar { + if m != nil { + return m.Exemplar + } + return nil +} + +type Quantile struct { + Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Quantile) Reset() { *m = Quantile{} } +func (m *Quantile) String() string { return proto.CompactTextString(m) } +func (*Quantile) ProtoMessage() {} +func (*Quantile) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{3} +} + +func (m *Quantile) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Quantile.Unmarshal(m, b) +} +func (m *Quantile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Quantile.Marshal(b, m, deterministic) +} +func (m *Quantile) XXX_Merge(src proto.Message) { + xxx_messageInfo_Quantile.Merge(m, src) +} +func (m *Quantile) XXX_Size() int { + return xxx_messageInfo_Quantile.Size(m) +} +func (m *Quantile) XXX_DiscardUnknown() { + xxx_messageInfo_Quantile.DiscardUnknown(m) +} + +var xxx_messageInfo_Quantile proto.InternalMessageInfo + +func (m *Quantile) GetQuantile() float64 { + if m != nil && m.Quantile != nil { + return *m.Quantile + } + return 0 +} + +func (m *Quantile) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Summary struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` + Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Summary) Reset() { *m = Summary{} } +func (m *Summary) String() string { return proto.CompactTextString(m) } +func (*Summary) ProtoMessage() {} +func (*Summary) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{4} +} + +func (m *Summary) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Summary.Unmarshal(m, b) +} +func (m *Summary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Summary.Marshal(b, m, deterministic) +} +func (m *Summary) XXX_Merge(src proto.Message) { + xxx_messageInfo_Summary.Merge(m, src) +} +func (m *Summary) XXX_Size() int { + return xxx_messageInfo_Summary.Size(m) +} +func (m *Summary) XXX_DiscardUnknown() { + xxx_messageInfo_Summary.DiscardUnknown(m) +} + +var xxx_messageInfo_Summary proto.InternalMessageInfo + +func (m *Summary) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Summary) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Summary) GetQuantile() []*Quantile { + if m != nil { + return m.Quantile + } + return nil +} + +type Untyped struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Untyped) Reset() { *m = Untyped{} } +func (m *Untyped) String() string { return proto.CompactTextString(m) } +func (*Untyped) ProtoMessage() {} +func (*Untyped) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{5} +} + +func (m *Untyped) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Untyped.Unmarshal(m, b) +} +func (m *Untyped) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Untyped.Marshal(b, m, deterministic) +} +func (m *Untyped) XXX_Merge(src proto.Message) { + xxx_messageInfo_Untyped.Merge(m, src) +} +func (m *Untyped) XXX_Size() int { + return xxx_messageInfo_Untyped.Size(m) +} +func (m *Untyped) XXX_DiscardUnknown() { + xxx_messageInfo_Untyped.DiscardUnknown(m) +} + +var xxx_messageInfo_Untyped proto.InternalMessageInfo + +func (m *Untyped) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Histogram struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` + Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Histogram) Reset() { *m = Histogram{} } +func (m *Histogram) String() string { return proto.CompactTextString(m) } +func (*Histogram) ProtoMessage() {} +func (*Histogram) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{6} +} + +func (m *Histogram) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Histogram.Unmarshal(m, b) +} +func (m *Histogram) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Histogram.Marshal(b, m, deterministic) +} +func (m *Histogram) XXX_Merge(src proto.Message) { + xxx_messageInfo_Histogram.Merge(m, src) +} +func (m *Histogram) XXX_Size() int { + return xxx_messageInfo_Histogram.Size(m) +} +func (m *Histogram) XXX_DiscardUnknown() { + xxx_messageInfo_Histogram.DiscardUnknown(m) +} + +var xxx_messageInfo_Histogram proto.InternalMessageInfo + +func (m *Histogram) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Histogram) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Histogram) GetBucket() []*Bucket { + if m != nil { + return m.Bucket + } + return nil +} + +type Bucket struct { + CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count,json=cumulativeCount" json:"cumulative_count,omitempty"` + UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound,json=upperBound" json:"upper_bound,omitempty"` + Exemplar *Exemplar `protobuf:"bytes,3,opt,name=exemplar" json:"exemplar,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Bucket) Reset() { *m = Bucket{} } +func (m *Bucket) String() string { return proto.CompactTextString(m) } +func (*Bucket) ProtoMessage() {} +func (*Bucket) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{7} +} + +func (m *Bucket) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Bucket.Unmarshal(m, b) +} +func (m *Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Bucket.Marshal(b, m, deterministic) +} +func (m *Bucket) XXX_Merge(src proto.Message) { + xxx_messageInfo_Bucket.Merge(m, src) +} +func (m *Bucket) XXX_Size() int { + return xxx_messageInfo_Bucket.Size(m) +} +func (m *Bucket) XXX_DiscardUnknown() { + xxx_messageInfo_Bucket.DiscardUnknown(m) +} + +var xxx_messageInfo_Bucket proto.InternalMessageInfo + +func (m *Bucket) GetCumulativeCount() uint64 { + if m != nil && m.CumulativeCount != nil { + return *m.CumulativeCount + } + return 0 +} + +func (m *Bucket) GetUpperBound() float64 { + if m != nil && m.UpperBound != nil { + return *m.UpperBound + } + return 0 +} + +func (m *Bucket) GetExemplar() *Exemplar { + if m != nil { + return m.Exemplar + } + return nil +} + +type Exemplar struct { + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` + Timestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=timestamp" json:"timestamp,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Exemplar) Reset() { *m = Exemplar{} } +func (m *Exemplar) String() string { return proto.CompactTextString(m) } +func (*Exemplar) ProtoMessage() {} +func (*Exemplar) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{8} +} + +func (m *Exemplar) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Exemplar.Unmarshal(m, b) +} +func (m *Exemplar) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Exemplar.Marshal(b, m, deterministic) +} +func (m *Exemplar) XXX_Merge(src proto.Message) { + xxx_messageInfo_Exemplar.Merge(m, src) +} +func (m *Exemplar) XXX_Size() int { + return xxx_messageInfo_Exemplar.Size(m) +} +func (m *Exemplar) XXX_DiscardUnknown() { + xxx_messageInfo_Exemplar.DiscardUnknown(m) +} + +var xxx_messageInfo_Exemplar proto.InternalMessageInfo + +func (m *Exemplar) GetLabel() []*LabelPair { + if m != nil { + return m.Label + } + return nil +} + +func (m *Exemplar) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +func (m *Exemplar) GetTimestamp() *timestamp.Timestamp { + if m != nil { + return m.Timestamp + } + return nil +} + +type Metric struct { + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` + Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` + Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` + Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` + Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` + TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms,json=timestampMs" json:"timestamp_ms,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Metric) Reset() { *m = Metric{} } +func (m *Metric) String() string { return proto.CompactTextString(m) } +func (*Metric) ProtoMessage() {} +func (*Metric) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{9} +} + +func (m *Metric) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Metric.Unmarshal(m, b) +} +func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Metric.Marshal(b, m, deterministic) +} +func (m *Metric) XXX_Merge(src proto.Message) { + xxx_messageInfo_Metric.Merge(m, src) +} +func (m *Metric) XXX_Size() int { + return xxx_messageInfo_Metric.Size(m) +} +func (m *Metric) XXX_DiscardUnknown() { + xxx_messageInfo_Metric.DiscardUnknown(m) +} + +var xxx_messageInfo_Metric proto.InternalMessageInfo + +func (m *Metric) GetLabel() []*LabelPair { + if m != nil { + return m.Label + } + return nil +} + +func (m *Metric) GetGauge() *Gauge { + if m != nil { + return m.Gauge + } + return nil +} + +func (m *Metric) GetCounter() *Counter { + if m != nil { + return m.Counter + } + return nil +} + +func (m *Metric) GetSummary() *Summary { + if m != nil { + return m.Summary + } + return nil +} + +func (m *Metric) GetUntyped() *Untyped { + if m != nil { + return m.Untyped + } + return nil +} + +func (m *Metric) GetHistogram() *Histogram { + if m != nil { + return m.Histogram + } + return nil +} + +func (m *Metric) GetTimestampMs() int64 { + if m != nil && m.TimestampMs != nil { + return *m.TimestampMs + } + return 0 +} + +type MetricFamily struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` + Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` + Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MetricFamily) Reset() { *m = MetricFamily{} } +func (m *MetricFamily) String() string { return proto.CompactTextString(m) } +func (*MetricFamily) ProtoMessage() {} +func (*MetricFamily) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{10} +} + +func (m *MetricFamily) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MetricFamily.Unmarshal(m, b) +} +func (m *MetricFamily) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MetricFamily.Marshal(b, m, deterministic) +} +func (m *MetricFamily) XXX_Merge(src proto.Message) { + xxx_messageInfo_MetricFamily.Merge(m, src) +} +func (m *MetricFamily) XXX_Size() int { + return xxx_messageInfo_MetricFamily.Size(m) +} +func (m *MetricFamily) XXX_DiscardUnknown() { + xxx_messageInfo_MetricFamily.DiscardUnknown(m) +} + +var xxx_messageInfo_MetricFamily proto.InternalMessageInfo + +func (m *MetricFamily) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MetricFamily) GetHelp() string { + if m != nil && m.Help != nil { + return *m.Help + } + return "" +} + +func (m *MetricFamily) GetType() MetricType { + if m != nil && m.Type != nil { + return *m.Type + } + return MetricType_COUNTER +} + +func (m *MetricFamily) GetMetric() []*Metric { + if m != nil { + return m.Metric + } + return nil +} + +func init() { + proto.RegisterEnum("io.prometheus.client.MetricType", MetricType_name, MetricType_value) + proto.RegisterType((*LabelPair)(nil), "io.prometheus.client.LabelPair") + proto.RegisterType((*Gauge)(nil), "io.prometheus.client.Gauge") + proto.RegisterType((*Counter)(nil), "io.prometheus.client.Counter") + proto.RegisterType((*Quantile)(nil), "io.prometheus.client.Quantile") + proto.RegisterType((*Summary)(nil), "io.prometheus.client.Summary") + proto.RegisterType((*Untyped)(nil), "io.prometheus.client.Untyped") + proto.RegisterType((*Histogram)(nil), "io.prometheus.client.Histogram") + proto.RegisterType((*Bucket)(nil), "io.prometheus.client.Bucket") + proto.RegisterType((*Exemplar)(nil), "io.prometheus.client.Exemplar") + proto.RegisterType((*Metric)(nil), "io.prometheus.client.Metric") + proto.RegisterType((*MetricFamily)(nil), "io.prometheus.client.MetricFamily") +} + +func init() { proto.RegisterFile("metrics.proto", fileDescriptor_6039342a2ba47b72) } + +var fileDescriptor_6039342a2ba47b72 = []byte{ + // 665 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0xcd, 0x6e, 0xd3, 0x4c, + 0x14, 0xfd, 0xdc, 0x38, 0x3f, 0xbe, 0x69, 0x3f, 0xa2, 0x51, 0x17, 0x56, 0xa1, 0x24, 0x78, 0x55, + 0x58, 0x38, 0xa2, 0x6a, 0x05, 0x2a, 0xb0, 0x68, 0x4b, 0x48, 0x91, 0x48, 0x5b, 0x26, 0xc9, 0xa2, + 0xb0, 0x88, 0x1c, 0x77, 0x70, 0x2c, 0x3c, 0xb1, 0xb1, 0x67, 0x2a, 0xb2, 0x66, 0xc1, 0x16, 0x5e, + 0x81, 0x17, 0x05, 0xcd, 0x8f, 0x6d, 0x2a, 0xb9, 0x95, 0x40, 0xec, 0x66, 0xee, 0x3d, 0xe7, 0xfa, + 0xcc, 0xf8, 0x9c, 0x81, 0x0d, 0x4a, 0x58, 0x1a, 0xfa, 0x99, 0x9b, 0xa4, 0x31, 0x8b, 0xd1, 0x66, + 0x18, 0x8b, 0x15, 0x25, 0x6c, 0x41, 0x78, 0xe6, 0xfa, 0x51, 0x48, 0x96, 0x6c, 0xab, 0x1b, 0xc4, + 0x71, 0x10, 0x91, 0xbe, 0xc4, 0xcc, 0xf9, 0x87, 0x3e, 0x0b, 0x29, 0xc9, 0x98, 0x47, 0x13, 0x45, + 0x73, 0xf6, 0xc1, 0x7a, 0xe3, 0xcd, 0x49, 0x74, 0xee, 0x85, 0x29, 0x42, 0x60, 0x2e, 0x3d, 0x4a, + 0x6c, 0xa3, 0x67, 0xec, 0x58, 0x58, 0xae, 0xd1, 0x26, 0xd4, 0xaf, 0xbc, 0x88, 0x13, 0x7b, 0x4d, + 0x16, 0xd5, 0xc6, 0xd9, 0x86, 0xfa, 0xd0, 0xe3, 0xc1, 0x6f, 0x6d, 0xc1, 0x31, 0xf2, 0xf6, 0x7b, + 0x68, 0x1e, 0xc7, 0x7c, 0xc9, 0x48, 0x5a, 0x0d, 0x40, 0x07, 0xd0, 0x22, 0x9f, 0x09, 0x4d, 0x22, + 0x2f, 0x95, 0x83, 0xdb, 0xbb, 0xf7, 0xdd, 0xaa, 0x03, 0xb8, 0x03, 0x8d, 0xc2, 0x05, 0xde, 0x79, + 0x0e, 0xad, 0xb7, 0xdc, 0x5b, 0xb2, 0x30, 0x22, 0x68, 0x0b, 0x5a, 0x9f, 0xf4, 0x5a, 0x7f, 0xa0, + 0xd8, 0x5f, 0x57, 0x5e, 0x48, 0xfb, 0x6a, 0x40, 0x73, 0xcc, 0x29, 0xf5, 0xd2, 0x15, 0x7a, 0x00, + 0xeb, 0x99, 0x47, 0x93, 0x88, 0xcc, 0x7c, 0xa1, 0x56, 0x4e, 0x30, 0x71, 0x5b, 0xd5, 0xe4, 0x01, + 0xd0, 0x36, 0x80, 0x86, 0x64, 0x9c, 0xea, 0x49, 0x96, 0xaa, 0x8c, 0x39, 0x15, 0xe7, 0x28, 0xbe, + 0x5f, 0xeb, 0xd5, 0x6e, 0x3e, 0x47, 0xae, 0xb8, 0xd4, 0xe7, 0x74, 0xa1, 0x39, 0x5d, 0xb2, 0x55, + 0x42, 0x2e, 0x6f, 0xb8, 0xc5, 0x2f, 0x06, 0x58, 0x27, 0x61, 0xc6, 0xe2, 0x20, 0xf5, 0xe8, 0x3f, + 0x10, 0xbb, 0x07, 0x8d, 0x39, 0xf7, 0x3f, 0x12, 0xa6, 0xa5, 0xde, 0xab, 0x96, 0x7a, 0x24, 0x31, + 0x58, 0x63, 0x9d, 0x6f, 0x06, 0x34, 0x54, 0x09, 0x3d, 0x84, 0x8e, 0xcf, 0x29, 0x8f, 0x3c, 0x16, + 0x5e, 0x5d, 0x97, 0x71, 0xa7, 0xac, 0x2b, 0x29, 0x5d, 0x68, 0xf3, 0x24, 0x21, 0xe9, 0x6c, 0x1e, + 0xf3, 0xe5, 0xa5, 0xd6, 0x02, 0xb2, 0x74, 0x24, 0x2a, 0xd7, 0x1c, 0x50, 0xfb, 0x43, 0x07, 0x7c, + 0x37, 0xa0, 0x95, 0x97, 0xd1, 0x3e, 0xd4, 0x23, 0xe1, 0x60, 0xdb, 0x90, 0x87, 0xea, 0x56, 0x4f, + 0x29, 0x4c, 0x8e, 0x15, 0xba, 0xda, 0x1d, 0xe8, 0x29, 0x58, 0x45, 0x42, 0xb4, 0xac, 0x2d, 0x57, + 0x65, 0xc8, 0xcd, 0x33, 0xe4, 0x4e, 0x72, 0x04, 0x2e, 0xc1, 0xce, 0xcf, 0x35, 0x68, 0x8c, 0x64, + 0x22, 0xff, 0x56, 0xd1, 0x63, 0xa8, 0x07, 0x22, 0x53, 0x3a, 0x10, 0x77, 0xab, 0x69, 0x32, 0x76, + 0x58, 0x21, 0xd1, 0x13, 0x68, 0xfa, 0x2a, 0x67, 0x5a, 0xec, 0x76, 0x35, 0x49, 0x87, 0x11, 0xe7, + 0x68, 0x41, 0xcc, 0x54, 0x08, 0x6c, 0xf3, 0x36, 0xa2, 0x4e, 0x0a, 0xce, 0xd1, 0x82, 0xc8, 0x95, + 0x69, 0xed, 0xfa, 0x6d, 0x44, 0xed, 0x6c, 0x9c, 0xa3, 0xd1, 0x0b, 0xb0, 0x16, 0xb9, 0x97, 0xed, + 0xa6, 0xa4, 0xde, 0x70, 0x31, 0x85, 0xe5, 0x71, 0xc9, 0x10, 0xee, 0x2f, 0xee, 0x7a, 0x46, 0x33, + 0xbb, 0xd1, 0x33, 0x76, 0x6a, 0xb8, 0x5d, 0xd4, 0x46, 0x99, 0xf3, 0xc3, 0x80, 0x75, 0xf5, 0x07, + 0x5e, 0x79, 0x34, 0x8c, 0x56, 0x95, 0xcf, 0x19, 0x02, 0x73, 0x41, 0xa2, 0x44, 0xbf, 0x66, 0x72, + 0x8d, 0xf6, 0xc0, 0x14, 0x1a, 0xe5, 0x15, 0xfe, 0xbf, 0xdb, 0xab, 0x56, 0xa5, 0x26, 0x4f, 0x56, + 0x09, 0xc1, 0x12, 0x2d, 0xd2, 0xa4, 0x5e, 0x60, 0xdb, 0xbc, 0x2d, 0x4d, 0x8a, 0x87, 0x35, 0xf6, + 0xd1, 0x08, 0xa0, 0x9c, 0x84, 0xda, 0xd0, 0x3c, 0x3e, 0x9b, 0x9e, 0x4e, 0x06, 0xb8, 0xf3, 0x1f, + 0xb2, 0xa0, 0x3e, 0x3c, 0x9c, 0x0e, 0x07, 0x1d, 0x43, 0xd4, 0xc7, 0xd3, 0xd1, 0xe8, 0x10, 0x5f, + 0x74, 0xd6, 0xc4, 0x66, 0x7a, 0x3a, 0xb9, 0x38, 0x1f, 0xbc, 0xec, 0xd4, 0xd0, 0x06, 0x58, 0x27, + 0xaf, 0xc7, 0x93, 0xb3, 0x21, 0x3e, 0x1c, 0x75, 0xcc, 0x23, 0x0c, 0x95, 0xef, 0xfe, 0xbb, 0x83, + 0x20, 0x64, 0x0b, 0x3e, 0x77, 0xfd, 0x98, 0xf6, 0xcb, 0x6e, 0x5f, 0x75, 0x67, 0x34, 0xbe, 0x24, + 0x51, 0x3f, 0x88, 0x9f, 0x85, 0xf1, 0xac, 0xec, 0xce, 0x54, 0xf7, 0x57, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xd0, 0x84, 0x91, 0x73, 0x59, 0x06, 0x00, 0x00, +} diff --git a/vendor/github.com/prometheus/common/LICENSE b/vendor/github.com/prometheus/common/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/prometheus/common/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/prometheus/common/NOTICE b/vendor/github.com/prometheus/common/NOTICE new file mode 100644 index 00000000..636a2c1a --- /dev/null +++ b/vendor/github.com/prometheus/common/NOTICE @@ -0,0 +1,5 @@ +Common libraries shared by Prometheus Go components. +Copyright 2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/prometheus/common/expfmt/decode.go new file mode 100644 index 00000000..c092723e --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/decode.go @@ -0,0 +1,429 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "fmt" + "io" + "math" + "mime" + "net/http" + + dto "github.com/prometheus/client_model/go" + + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/prometheus/common/model" +) + +// Decoder types decode an input stream into metric families. +type Decoder interface { + Decode(*dto.MetricFamily) error +} + +// DecodeOptions contains options used by the Decoder and in sample extraction. +type DecodeOptions struct { + // Timestamp is added to each value from the stream that has no explicit timestamp set. + Timestamp model.Time +} + +// ResponseFormat extracts the correct format from a HTTP response header. +// If no matching format can be found FormatUnknown is returned. +func ResponseFormat(h http.Header) Format { + ct := h.Get(hdrContentType) + + mediatype, params, err := mime.ParseMediaType(ct) + if err != nil { + return FmtUnknown + } + + const textType = "text/plain" + + switch mediatype { + case ProtoType: + if p, ok := params["proto"]; ok && p != ProtoProtocol { + return FmtUnknown + } + if e, ok := params["encoding"]; ok && e != "delimited" { + return FmtUnknown + } + return FmtProtoDelim + + case textType: + if v, ok := params["version"]; ok && v != TextVersion { + return FmtUnknown + } + return FmtText + } + + return FmtUnknown +} + +// NewDecoder returns a new decoder based on the given input format. +// If the input format does not imply otherwise, a text format decoder is returned. +func NewDecoder(r io.Reader, format Format) Decoder { + switch format { + case FmtProtoDelim: + return &protoDecoder{r: r} + } + return &textDecoder{r: r} +} + +// protoDecoder implements the Decoder interface for protocol buffers. +type protoDecoder struct { + r io.Reader +} + +// Decode implements the Decoder interface. +func (d *protoDecoder) Decode(v *dto.MetricFamily) error { + _, err := pbutil.ReadDelimited(d.r, v) + if err != nil { + return err + } + if !model.IsValidMetricName(model.LabelValue(v.GetName())) { + return fmt.Errorf("invalid metric name %q", v.GetName()) + } + for _, m := range v.GetMetric() { + if m == nil { + continue + } + for _, l := range m.GetLabel() { + if l == nil { + continue + } + if !model.LabelValue(l.GetValue()).IsValid() { + return fmt.Errorf("invalid label value %q", l.GetValue()) + } + if !model.LabelName(l.GetName()).IsValid() { + return fmt.Errorf("invalid label name %q", l.GetName()) + } + } + } + return nil +} + +// textDecoder implements the Decoder interface for the text protocol. +type textDecoder struct { + r io.Reader + p TextParser + fams []*dto.MetricFamily +} + +// Decode implements the Decoder interface. +func (d *textDecoder) Decode(v *dto.MetricFamily) error { + // TODO(fabxc): Wrap this as a line reader to make streaming safer. + if len(d.fams) == 0 { + // No cached metric families, read everything and parse metrics. + fams, err := d.p.TextToMetricFamilies(d.r) + if err != nil { + return err + } + if len(fams) == 0 { + return io.EOF + } + d.fams = make([]*dto.MetricFamily, 0, len(fams)) + for _, f := range fams { + d.fams = append(d.fams, f) + } + } + + *v = *d.fams[0] + d.fams = d.fams[1:] + + return nil +} + +// SampleDecoder wraps a Decoder to extract samples from the metric families +// decoded by the wrapped Decoder. +type SampleDecoder struct { + Dec Decoder + Opts *DecodeOptions + + f dto.MetricFamily +} + +// Decode calls the Decode method of the wrapped Decoder and then extracts the +// samples from the decoded MetricFamily into the provided model.Vector. +func (sd *SampleDecoder) Decode(s *model.Vector) error { + err := sd.Dec.Decode(&sd.f) + if err != nil { + return err + } + *s, err = extractSamples(&sd.f, sd.Opts) + return err +} + +// ExtractSamples builds a slice of samples from the provided metric +// families. If an error occurrs during sample extraction, it continues to +// extract from the remaining metric families. The returned error is the last +// error that has occurred. +func ExtractSamples(o *DecodeOptions, fams ...*dto.MetricFamily) (model.Vector, error) { + var ( + all model.Vector + lastErr error + ) + for _, f := range fams { + some, err := extractSamples(f, o) + if err != nil { + lastErr = err + continue + } + all = append(all, some...) + } + return all, lastErr +} + +func extractSamples(f *dto.MetricFamily, o *DecodeOptions) (model.Vector, error) { + switch f.GetType() { + case dto.MetricType_COUNTER: + return extractCounter(o, f), nil + case dto.MetricType_GAUGE: + return extractGauge(o, f), nil + case dto.MetricType_SUMMARY: + return extractSummary(o, f), nil + case dto.MetricType_UNTYPED: + return extractUntyped(o, f), nil + case dto.MetricType_HISTOGRAM: + return extractHistogram(o, f), nil + } + return nil, fmt.Errorf("expfmt.extractSamples: unknown metric family type %v", f.GetType()) +} + +func extractCounter(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Counter == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Counter.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractGauge(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Gauge == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Gauge.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractUntyped(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Untyped == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Untyped.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractSummary(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Summary == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + for _, q := range m.Summary.Quantile { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + // BUG(matt): Update other names to "quantile". + lset[model.LabelName(model.QuantileLabel)] = model.LabelValue(fmt.Sprint(q.GetQuantile())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetValue()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleCount()), + Timestamp: timestamp, + }) + } + + return samples +} + +func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Histogram == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + infSeen := false + + for _, q := range m.Histogram.Bucket { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue(fmt.Sprint(q.GetUpperBound())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + if math.IsInf(q.GetUpperBound(), +1) { + infSeen = true + } + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetCumulativeCount()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + count := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleCount()), + Timestamp: timestamp, + } + samples = append(samples, count) + + if !infSeen { + // Append an infinity bucket sample. + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue("+Inf") + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: count.Value, + Timestamp: timestamp, + }) + } + } + + return samples +} diff --git a/vendor/github.com/prometheus/common/expfmt/encode.go b/vendor/github.com/prometheus/common/expfmt/encode.go new file mode 100644 index 00000000..bd4e3474 --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/encode.go @@ -0,0 +1,162 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "fmt" + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" + + dto "github.com/prometheus/client_model/go" +) + +// Encoder types encode metric families into an underlying wire protocol. +type Encoder interface { + Encode(*dto.MetricFamily) error +} + +// Closer is implemented by Encoders that need to be closed to finalize +// encoding. (For example, OpenMetrics needs a final `# EOF` line.) +// +// Note that all Encoder implementations returned from this package implement +// Closer, too, even if the Close call is a no-op. This happens in preparation +// for adding a Close method to the Encoder interface directly in a (mildly +// breaking) release in the future. +type Closer interface { + Close() error +} + +type encoderCloser struct { + encode func(*dto.MetricFamily) error + close func() error +} + +func (ec encoderCloser) Encode(v *dto.MetricFamily) error { + return ec.encode(v) +} + +func (ec encoderCloser) Close() error { + return ec.close() +} + +// Negotiate returns the Content-Type based on the given Accept header. If no +// appropriate accepted type is found, FmtText is returned (which is the +// Prometheus text format). This function will never negotiate FmtOpenMetrics, +// as the support is still experimental. To include the option to negotiate +// FmtOpenMetrics, use NegotiateOpenMetrics. +func Negotiate(h http.Header) Format { + for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + ver := ac.Params["version"] + if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { + switch ac.Params["encoding"] { + case "delimited": + return FmtProtoDelim + case "text": + return FmtProtoText + case "compact-text": + return FmtProtoCompact + } + } + if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { + return FmtText + } + } + return FmtText +} + +// NegotiateIncludingOpenMetrics works like Negotiate but includes +// FmtOpenMetrics as an option for the result. Note that this function is +// temporary and will disappear once FmtOpenMetrics is fully supported and as +// such may be negotiated by the normal Negotiate function. +func NegotiateIncludingOpenMetrics(h http.Header) Format { + for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + ver := ac.Params["version"] + if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { + switch ac.Params["encoding"] { + case "delimited": + return FmtProtoDelim + case "text": + return FmtProtoText + case "compact-text": + return FmtProtoCompact + } + } + if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { + return FmtText + } + if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion || ver == "") { + return FmtOpenMetrics + } + } + return FmtText +} + +// NewEncoder returns a new encoder based on content type negotiation. All +// Encoder implementations returned by NewEncoder also implement Closer, and +// callers should always call the Close method. It is currently only required +// for FmtOpenMetrics, but a future (breaking) release will add the Close method +// to the Encoder interface directly. The current version of the Encoder +// interface is kept for backwards compatibility. +func NewEncoder(w io.Writer, format Format) Encoder { + switch format { + case FmtProtoDelim: + return encoderCloser{ + encode: func(v *dto.MetricFamily) error { + _, err := pbutil.WriteDelimited(w, v) + return err + }, + close: func() error { return nil }, + } + case FmtProtoCompact: + return encoderCloser{ + encode: func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, v.String()) + return err + }, + close: func() error { return nil }, + } + case FmtProtoText: + return encoderCloser{ + encode: func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) + return err + }, + close: func() error { return nil }, + } + case FmtText: + return encoderCloser{ + encode: func(v *dto.MetricFamily) error { + _, err := MetricFamilyToText(w, v) + return err + }, + close: func() error { return nil }, + } + case FmtOpenMetrics: + return encoderCloser{ + encode: func(v *dto.MetricFamily) error { + _, err := MetricFamilyToOpenMetrics(w, v) + return err + }, + close: func() error { + _, err := FinalizeOpenMetrics(w) + return err + }, + } + } + panic(fmt.Errorf("expfmt.NewEncoder: unknown format %q", format)) +} diff --git a/vendor/github.com/prometheus/common/expfmt/expfmt.go b/vendor/github.com/prometheus/common/expfmt/expfmt.go new file mode 100644 index 00000000..0f176fa6 --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/expfmt.go @@ -0,0 +1,41 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package expfmt contains tools for reading and writing Prometheus metrics. +package expfmt + +// Format specifies the HTTP content type of the different wire protocols. +type Format string + +// Constants to assemble the Content-Type values for the different wire protocols. +const ( + TextVersion = "0.0.4" + ProtoType = `application/vnd.google.protobuf` + ProtoProtocol = `io.prometheus.client.MetricFamily` + ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + OpenMetricsType = `application/openmetrics-text` + OpenMetricsVersion = "0.0.1" + + // The Content-Type values for the different wire protocols. + FmtUnknown Format = `` + FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` + FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` + FmtProtoText Format = ProtoFmt + ` encoding=text` + FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` + FmtOpenMetrics Format = OpenMetricsType + `; version=` + OpenMetricsVersion + `; charset=utf-8` +) + +const ( + hdrContentType = "Content-Type" + hdrAccept = "Accept" +) diff --git a/vendor/github.com/prometheus/common/expfmt/fuzz.go b/vendor/github.com/prometheus/common/expfmt/fuzz.go new file mode 100644 index 00000000..dc2eedee --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/fuzz.go @@ -0,0 +1,36 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Build only when actually fuzzing +// +build gofuzz + +package expfmt + +import "bytes" + +// Fuzz text metric parser with with github.com/dvyukov/go-fuzz: +// +// go-fuzz-build github.com/prometheus/common/expfmt +// go-fuzz -bin expfmt-fuzz.zip -workdir fuzz +// +// Further input samples should go in the folder fuzz/corpus. +func Fuzz(in []byte) int { + parser := TextParser{} + _, err := parser.TextToMetricFamilies(bytes.NewReader(in)) + + if err != nil { + return 0 + } + + return 1 +} diff --git a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go new file mode 100644 index 00000000..8a9313a3 --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go @@ -0,0 +1,527 @@ +// Copyright 2020 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "bufio" + "bytes" + "fmt" + "io" + "math" + "strconv" + "strings" + + "github.com/golang/protobuf/ptypes" + "github.com/prometheus/common/model" + + dto "github.com/prometheus/client_model/go" +) + +// MetricFamilyToOpenMetrics converts a MetricFamily proto message into the +// OpenMetrics text format and writes the resulting lines to 'out'. It returns +// the number of bytes written and any error encountered. The output will have +// the same order as the input, no further sorting is performed. Furthermore, +// this function assumes the input is already sanitized and does not perform any +// sanity checks. If the input contains duplicate metrics or invalid metric or +// label names, the conversion will result in invalid text format output. +// +// This function fulfills the type 'expfmt.encoder'. +// +// Note that OpenMetrics requires a final `# EOF` line. Since this function acts +// on individual metric families, it is the responsibility of the caller to +// append this line to 'out' once all metric families have been written. +// Conveniently, this can be done by calling FinalizeOpenMetrics. +// +// The output should be fully OpenMetrics compliant. However, there are a few +// missing features and peculiarities to avoid complications when switching from +// Prometheus to OpenMetrics or vice versa: +// +// - Counters are expected to have the `_total` suffix in their metric name. In +// the output, the suffix will be truncated from the `# TYPE` and `# HELP` +// line. A counter with a missing `_total` suffix is not an error. However, +// its type will be set to `unknown` in that case to avoid invalid OpenMetrics +// output. +// +// - No support for the following (optional) features: `# UNIT` line, `_created` +// line, info type, stateset type, gaugehistogram type. +// +// - The size of exemplar labels is not checked (i.e. it's possible to create +// exemplars that are larger than allowed by the OpenMetrics specification). +// +// - The value of Counters is not checked. (OpenMetrics doesn't allow counters +// with a `NaN` value.) +func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int, err error) { + name := in.GetName() + if name == "" { + return 0, fmt.Errorf("MetricFamily has no name: %s", in) + } + + // Try the interface upgrade. If it doesn't work, we'll use a + // bufio.Writer from the sync.Pool. + w, ok := out.(enhancedWriter) + if !ok { + b := bufPool.Get().(*bufio.Writer) + b.Reset(out) + w = b + defer func() { + bErr := b.Flush() + if err == nil { + err = bErr + } + bufPool.Put(b) + }() + } + + var ( + n int + metricType = in.GetType() + shortName = name + ) + if metricType == dto.MetricType_COUNTER && strings.HasSuffix(shortName, "_total") { + shortName = name[:len(name)-6] + } + + // Comments, first HELP, then TYPE. + if in.Help != nil { + n, err = w.WriteString("# HELP ") + written += n + if err != nil { + return + } + n, err = w.WriteString(shortName) + written += n + if err != nil { + return + } + err = w.WriteByte(' ') + written++ + if err != nil { + return + } + n, err = writeEscapedString(w, *in.Help, true) + written += n + if err != nil { + return + } + err = w.WriteByte('\n') + written++ + if err != nil { + return + } + } + n, err = w.WriteString("# TYPE ") + written += n + if err != nil { + return + } + n, err = w.WriteString(shortName) + written += n + if err != nil { + return + } + switch metricType { + case dto.MetricType_COUNTER: + if strings.HasSuffix(name, "_total") { + n, err = w.WriteString(" counter\n") + } else { + n, err = w.WriteString(" unknown\n") + } + case dto.MetricType_GAUGE: + n, err = w.WriteString(" gauge\n") + case dto.MetricType_SUMMARY: + n, err = w.WriteString(" summary\n") + case dto.MetricType_UNTYPED: + n, err = w.WriteString(" unknown\n") + case dto.MetricType_HISTOGRAM: + n, err = w.WriteString(" histogram\n") + default: + return written, fmt.Errorf("unknown metric type %s", metricType.String()) + } + written += n + if err != nil { + return + } + + // Finally the samples, one line for each. + for _, metric := range in.Metric { + switch metricType { + case dto.MetricType_COUNTER: + if metric.Counter == nil { + return written, fmt.Errorf( + "expected counter in metric %s %s", name, metric, + ) + } + // Note that we have ensured above that either the name + // ends on `_total` or that the rendered type is + // `unknown`. Therefore, no `_total` must be added here. + n, err = writeOpenMetricsSample( + w, name, "", metric, "", 0, + metric.Counter.GetValue(), 0, false, + metric.Counter.Exemplar, + ) + case dto.MetricType_GAUGE: + if metric.Gauge == nil { + return written, fmt.Errorf( + "expected gauge in metric %s %s", name, metric, + ) + } + n, err = writeOpenMetricsSample( + w, name, "", metric, "", 0, + metric.Gauge.GetValue(), 0, false, + nil, + ) + case dto.MetricType_UNTYPED: + if metric.Untyped == nil { + return written, fmt.Errorf( + "expected untyped in metric %s %s", name, metric, + ) + } + n, err = writeOpenMetricsSample( + w, name, "", metric, "", 0, + metric.Untyped.GetValue(), 0, false, + nil, + ) + case dto.MetricType_SUMMARY: + if metric.Summary == nil { + return written, fmt.Errorf( + "expected summary in metric %s %s", name, metric, + ) + } + for _, q := range metric.Summary.Quantile { + n, err = writeOpenMetricsSample( + w, name, "", metric, + model.QuantileLabel, q.GetQuantile(), + q.GetValue(), 0, false, + nil, + ) + written += n + if err != nil { + return + } + } + n, err = writeOpenMetricsSample( + w, name, "_sum", metric, "", 0, + metric.Summary.GetSampleSum(), 0, false, + nil, + ) + written += n + if err != nil { + return + } + n, err = writeOpenMetricsSample( + w, name, "_count", metric, "", 0, + 0, metric.Summary.GetSampleCount(), true, + nil, + ) + case dto.MetricType_HISTOGRAM: + if metric.Histogram == nil { + return written, fmt.Errorf( + "expected histogram in metric %s %s", name, metric, + ) + } + infSeen := false + for _, b := range metric.Histogram.Bucket { + n, err = writeOpenMetricsSample( + w, name, "_bucket", metric, + model.BucketLabel, b.GetUpperBound(), + 0, b.GetCumulativeCount(), true, + b.Exemplar, + ) + written += n + if err != nil { + return + } + if math.IsInf(b.GetUpperBound(), +1) { + infSeen = true + } + } + if !infSeen { + n, err = writeOpenMetricsSample( + w, name, "_bucket", metric, + model.BucketLabel, math.Inf(+1), + 0, metric.Histogram.GetSampleCount(), true, + nil, + ) + written += n + if err != nil { + return + } + } + n, err = writeOpenMetricsSample( + w, name, "_sum", metric, "", 0, + metric.Histogram.GetSampleSum(), 0, false, + nil, + ) + written += n + if err != nil { + return + } + n, err = writeOpenMetricsSample( + w, name, "_count", metric, "", 0, + 0, metric.Histogram.GetSampleCount(), true, + nil, + ) + default: + return written, fmt.Errorf( + "unexpected type in metric %s %s", name, metric, + ) + } + written += n + if err != nil { + return + } + } + return +} + +// FinalizeOpenMetrics writes the final `# EOF\n` line required by OpenMetrics. +func FinalizeOpenMetrics(w io.Writer) (written int, err error) { + return w.Write([]byte("# EOF\n")) +} + +// writeOpenMetricsSample writes a single sample in OpenMetrics text format to +// w, given the metric name, the metric proto message itself, optionally an +// additional label name with a float64 value (use empty string as label name if +// not required), the value (optionally as float64 or uint64, determined by +// useIntValue), and optionally an exemplar (use nil if not required). The +// function returns the number of bytes written and any error encountered. +func writeOpenMetricsSample( + w enhancedWriter, + name, suffix string, + metric *dto.Metric, + additionalLabelName string, additionalLabelValue float64, + floatValue float64, intValue uint64, useIntValue bool, + exemplar *dto.Exemplar, +) (int, error) { + var written int + n, err := w.WriteString(name) + written += n + if err != nil { + return written, err + } + if suffix != "" { + n, err = w.WriteString(suffix) + written += n + if err != nil { + return written, err + } + } + n, err = writeOpenMetricsLabelPairs( + w, metric.Label, additionalLabelName, additionalLabelValue, + ) + written += n + if err != nil { + return written, err + } + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + if useIntValue { + n, err = writeUint(w, intValue) + } else { + n, err = writeOpenMetricsFloat(w, floatValue) + } + written += n + if err != nil { + return written, err + } + if metric.TimestampMs != nil { + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + // TODO(beorn7): Format this directly without converting to a float first. + n, err = writeOpenMetricsFloat(w, float64(*metric.TimestampMs)/1000) + written += n + if err != nil { + return written, err + } + } + if exemplar != nil { + n, err = writeExemplar(w, exemplar) + written += n + if err != nil { + return written, err + } + } + err = w.WriteByte('\n') + written++ + if err != nil { + return written, err + } + return written, nil +} + +// writeOpenMetricsLabelPairs works like writeOpenMetrics but formats the float +// in OpenMetrics style. +func writeOpenMetricsLabelPairs( + w enhancedWriter, + in []*dto.LabelPair, + additionalLabelName string, additionalLabelValue float64, +) (int, error) { + if len(in) == 0 && additionalLabelName == "" { + return 0, nil + } + var ( + written int + separator byte = '{' + ) + for _, lp := range in { + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + n, err := w.WriteString(lp.GetName()) + written += n + if err != nil { + return written, err + } + n, err = w.WriteString(`="`) + written += n + if err != nil { + return written, err + } + n, err = writeEscapedString(w, lp.GetValue(), true) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + separator = ',' + } + if additionalLabelName != "" { + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + n, err := w.WriteString(additionalLabelName) + written += n + if err != nil { + return written, err + } + n, err = w.WriteString(`="`) + written += n + if err != nil { + return written, err + } + n, err = writeOpenMetricsFloat(w, additionalLabelValue) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + } + err := w.WriteByte('}') + written++ + if err != nil { + return written, err + } + return written, nil +} + +// writeExemplar writes the provided exemplar in OpenMetrics format to w. The +// function returns the number of bytes written and any error encountered. +func writeExemplar(w enhancedWriter, e *dto.Exemplar) (int, error) { + written := 0 + n, err := w.WriteString(" # ") + written += n + if err != nil { + return written, err + } + n, err = writeOpenMetricsLabelPairs(w, e.Label, "", 0) + written += n + if err != nil { + return written, err + } + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + n, err = writeOpenMetricsFloat(w, e.GetValue()) + written += n + if err != nil { + return written, err + } + if e.Timestamp != nil { + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + ts, err := ptypes.Timestamp((*e).Timestamp) + if err != nil { + return written, err + } + // TODO(beorn7): Format this directly from components of ts to + // avoid overflow/underflow and precision issues of the float + // conversion. + n, err = writeOpenMetricsFloat(w, float64(ts.UnixNano())/1e9) + written += n + if err != nil { + return written, err + } + } + return written, nil +} + +// writeOpenMetricsFloat works like writeFloat but appends ".0" if the resulting +// number would otherwise contain neither a "." nor an "e". +func writeOpenMetricsFloat(w enhancedWriter, f float64) (int, error) { + switch { + case f == 1: + return w.WriteString("1.0") + case f == 0: + return w.WriteString("0.0") + case f == -1: + return w.WriteString("-1.0") + case math.IsNaN(f): + return w.WriteString("NaN") + case math.IsInf(f, +1): + return w.WriteString("+Inf") + case math.IsInf(f, -1): + return w.WriteString("-Inf") + default: + bp := numBufPool.Get().(*[]byte) + *bp = strconv.AppendFloat((*bp)[:0], f, 'g', -1, 64) + if !bytes.ContainsAny(*bp, "e.") { + *bp = append(*bp, '.', '0') + } + written, err := w.Write(*bp) + numBufPool.Put(bp) + return written, err + } +} + +// writeUint is like writeInt just for uint64. +func writeUint(w enhancedWriter, u uint64) (int, error) { + bp := numBufPool.Get().(*[]byte) + *bp = strconv.AppendUint((*bp)[:0], u, 10) + written, err := w.Write(*bp) + numBufPool.Put(bp) + return written, err +} diff --git a/vendor/github.com/prometheus/common/expfmt/text_create.go b/vendor/github.com/prometheus/common/expfmt/text_create.go new file mode 100644 index 00000000..5ba503b0 --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/text_create.go @@ -0,0 +1,465 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "bufio" + "fmt" + "io" + "io/ioutil" + "math" + "strconv" + "strings" + "sync" + + "github.com/prometheus/common/model" + + dto "github.com/prometheus/client_model/go" +) + +// enhancedWriter has all the enhanced write functions needed here. bufio.Writer +// implements it. +type enhancedWriter interface { + io.Writer + WriteRune(r rune) (n int, err error) + WriteString(s string) (n int, err error) + WriteByte(c byte) error +} + +const ( + initialNumBufSize = 24 +) + +var ( + bufPool = sync.Pool{ + New: func() interface{} { + return bufio.NewWriter(ioutil.Discard) + }, + } + numBufPool = sync.Pool{ + New: func() interface{} { + b := make([]byte, 0, initialNumBufSize) + return &b + }, + } +) + +// MetricFamilyToText converts a MetricFamily proto message into text format and +// writes the resulting lines to 'out'. It returns the number of bytes written +// and any error encountered. The output will have the same order as the input, +// no further sorting is performed. Furthermore, this function assumes the input +// is already sanitized and does not perform any sanity checks. If the input +// contains duplicate metrics or invalid metric or label names, the conversion +// will result in invalid text format output. +// +// This method fulfills the type 'prometheus.encoder'. +func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err error) { + // Fail-fast checks. + if len(in.Metric) == 0 { + return 0, fmt.Errorf("MetricFamily has no metrics: %s", in) + } + name := in.GetName() + if name == "" { + return 0, fmt.Errorf("MetricFamily has no name: %s", in) + } + + // Try the interface upgrade. If it doesn't work, we'll use a + // bufio.Writer from the sync.Pool. + w, ok := out.(enhancedWriter) + if !ok { + b := bufPool.Get().(*bufio.Writer) + b.Reset(out) + w = b + defer func() { + bErr := b.Flush() + if err == nil { + err = bErr + } + bufPool.Put(b) + }() + } + + var n int + + // Comments, first HELP, then TYPE. + if in.Help != nil { + n, err = w.WriteString("# HELP ") + written += n + if err != nil { + return + } + n, err = w.WriteString(name) + written += n + if err != nil { + return + } + err = w.WriteByte(' ') + written++ + if err != nil { + return + } + n, err = writeEscapedString(w, *in.Help, false) + written += n + if err != nil { + return + } + err = w.WriteByte('\n') + written++ + if err != nil { + return + } + } + n, err = w.WriteString("# TYPE ") + written += n + if err != nil { + return + } + n, err = w.WriteString(name) + written += n + if err != nil { + return + } + metricType := in.GetType() + switch metricType { + case dto.MetricType_COUNTER: + n, err = w.WriteString(" counter\n") + case dto.MetricType_GAUGE: + n, err = w.WriteString(" gauge\n") + case dto.MetricType_SUMMARY: + n, err = w.WriteString(" summary\n") + case dto.MetricType_UNTYPED: + n, err = w.WriteString(" untyped\n") + case dto.MetricType_HISTOGRAM: + n, err = w.WriteString(" histogram\n") + default: + return written, fmt.Errorf("unknown metric type %s", metricType.String()) + } + written += n + if err != nil { + return + } + + // Finally the samples, one line for each. + for _, metric := range in.Metric { + switch metricType { + case dto.MetricType_COUNTER: + if metric.Counter == nil { + return written, fmt.Errorf( + "expected counter in metric %s %s", name, metric, + ) + } + n, err = writeSample( + w, name, "", metric, "", 0, + metric.Counter.GetValue(), + ) + case dto.MetricType_GAUGE: + if metric.Gauge == nil { + return written, fmt.Errorf( + "expected gauge in metric %s %s", name, metric, + ) + } + n, err = writeSample( + w, name, "", metric, "", 0, + metric.Gauge.GetValue(), + ) + case dto.MetricType_UNTYPED: + if metric.Untyped == nil { + return written, fmt.Errorf( + "expected untyped in metric %s %s", name, metric, + ) + } + n, err = writeSample( + w, name, "", metric, "", 0, + metric.Untyped.GetValue(), + ) + case dto.MetricType_SUMMARY: + if metric.Summary == nil { + return written, fmt.Errorf( + "expected summary in metric %s %s", name, metric, + ) + } + for _, q := range metric.Summary.Quantile { + n, err = writeSample( + w, name, "", metric, + model.QuantileLabel, q.GetQuantile(), + q.GetValue(), + ) + written += n + if err != nil { + return + } + } + n, err = writeSample( + w, name, "_sum", metric, "", 0, + metric.Summary.GetSampleSum(), + ) + written += n + if err != nil { + return + } + n, err = writeSample( + w, name, "_count", metric, "", 0, + float64(metric.Summary.GetSampleCount()), + ) + case dto.MetricType_HISTOGRAM: + if metric.Histogram == nil { + return written, fmt.Errorf( + "expected histogram in metric %s %s", name, metric, + ) + } + infSeen := false + for _, b := range metric.Histogram.Bucket { + n, err = writeSample( + w, name, "_bucket", metric, + model.BucketLabel, b.GetUpperBound(), + float64(b.GetCumulativeCount()), + ) + written += n + if err != nil { + return + } + if math.IsInf(b.GetUpperBound(), +1) { + infSeen = true + } + } + if !infSeen { + n, err = writeSample( + w, name, "_bucket", metric, + model.BucketLabel, math.Inf(+1), + float64(metric.Histogram.GetSampleCount()), + ) + written += n + if err != nil { + return + } + } + n, err = writeSample( + w, name, "_sum", metric, "", 0, + metric.Histogram.GetSampleSum(), + ) + written += n + if err != nil { + return + } + n, err = writeSample( + w, name, "_count", metric, "", 0, + float64(metric.Histogram.GetSampleCount()), + ) + default: + return written, fmt.Errorf( + "unexpected type in metric %s %s", name, metric, + ) + } + written += n + if err != nil { + return + } + } + return +} + +// writeSample writes a single sample in text format to w, given the metric +// name, the metric proto message itself, optionally an additional label name +// with a float64 value (use empty string as label name if not required), and +// the value. The function returns the number of bytes written and any error +// encountered. +func writeSample( + w enhancedWriter, + name, suffix string, + metric *dto.Metric, + additionalLabelName string, additionalLabelValue float64, + value float64, +) (int, error) { + var written int + n, err := w.WriteString(name) + written += n + if err != nil { + return written, err + } + if suffix != "" { + n, err = w.WriteString(suffix) + written += n + if err != nil { + return written, err + } + } + n, err = writeLabelPairs( + w, metric.Label, additionalLabelName, additionalLabelValue, + ) + written += n + if err != nil { + return written, err + } + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + n, err = writeFloat(w, value) + written += n + if err != nil { + return written, err + } + if metric.TimestampMs != nil { + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + n, err = writeInt(w, *metric.TimestampMs) + written += n + if err != nil { + return written, err + } + } + err = w.WriteByte('\n') + written++ + if err != nil { + return written, err + } + return written, nil +} + +// writeLabelPairs converts a slice of LabelPair proto messages plus the +// explicitly given additional label pair into text formatted as required by the +// text format and writes it to 'w'. An empty slice in combination with an empty +// string 'additionalLabelName' results in nothing being written. Otherwise, the +// label pairs are written, escaped as required by the text format, and enclosed +// in '{...}'. The function returns the number of bytes written and any error +// encountered. +func writeLabelPairs( + w enhancedWriter, + in []*dto.LabelPair, + additionalLabelName string, additionalLabelValue float64, +) (int, error) { + if len(in) == 0 && additionalLabelName == "" { + return 0, nil + } + var ( + written int + separator byte = '{' + ) + for _, lp := range in { + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + n, err := w.WriteString(lp.GetName()) + written += n + if err != nil { + return written, err + } + n, err = w.WriteString(`="`) + written += n + if err != nil { + return written, err + } + n, err = writeEscapedString(w, lp.GetValue(), true) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + separator = ',' + } + if additionalLabelName != "" { + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + n, err := w.WriteString(additionalLabelName) + written += n + if err != nil { + return written, err + } + n, err = w.WriteString(`="`) + written += n + if err != nil { + return written, err + } + n, err = writeFloat(w, additionalLabelValue) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + } + err := w.WriteByte('}') + written++ + if err != nil { + return written, err + } + return written, nil +} + +// writeEscapedString replaces '\' by '\\', new line character by '\n', and - if +// includeDoubleQuote is true - '"' by '\"'. +var ( + escaper = strings.NewReplacer("\\", `\\`, "\n", `\n`) + quotedEscaper = strings.NewReplacer("\\", `\\`, "\n", `\n`, "\"", `\"`) +) + +func writeEscapedString(w enhancedWriter, v string, includeDoubleQuote bool) (int, error) { + if includeDoubleQuote { + return quotedEscaper.WriteString(w, v) + } + return escaper.WriteString(w, v) +} + +// writeFloat is equivalent to fmt.Fprint with a float64 argument but hardcodes +// a few common cases for increased efficiency. For non-hardcoded cases, it uses +// strconv.AppendFloat to avoid allocations, similar to writeInt. +func writeFloat(w enhancedWriter, f float64) (int, error) { + switch { + case f == 1: + return 1, w.WriteByte('1') + case f == 0: + return 1, w.WriteByte('0') + case f == -1: + return w.WriteString("-1") + case math.IsNaN(f): + return w.WriteString("NaN") + case math.IsInf(f, +1): + return w.WriteString("+Inf") + case math.IsInf(f, -1): + return w.WriteString("-Inf") + default: + bp := numBufPool.Get().(*[]byte) + *bp = strconv.AppendFloat((*bp)[:0], f, 'g', -1, 64) + written, err := w.Write(*bp) + numBufPool.Put(bp) + return written, err + } +} + +// writeInt is equivalent to fmt.Fprint with an int64 argument but uses +// strconv.AppendInt with a byte slice taken from a sync.Pool to avoid +// allocations. +func writeInt(w enhancedWriter, i int64) (int, error) { + bp := numBufPool.Get().(*[]byte) + *bp = strconv.AppendInt((*bp)[:0], i, 10) + written, err := w.Write(*bp) + numBufPool.Put(bp) + return written, err +} diff --git a/vendor/github.com/prometheus/common/expfmt/text_parse.go b/vendor/github.com/prometheus/common/expfmt/text_parse.go new file mode 100644 index 00000000..342e5940 --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/text_parse.go @@ -0,0 +1,764 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "bufio" + "bytes" + "fmt" + "io" + "math" + "strconv" + "strings" + + dto "github.com/prometheus/client_model/go" + + "github.com/golang/protobuf/proto" + "github.com/prometheus/common/model" +) + +// A stateFn is a function that represents a state in a state machine. By +// executing it, the state is progressed to the next state. The stateFn returns +// another stateFn, which represents the new state. The end state is represented +// by nil. +type stateFn func() stateFn + +// ParseError signals errors while parsing the simple and flat text-based +// exchange format. +type ParseError struct { + Line int + Msg string +} + +// Error implements the error interface. +func (e ParseError) Error() string { + return fmt.Sprintf("text format parsing error in line %d: %s", e.Line, e.Msg) +} + +// TextParser is used to parse the simple and flat text-based exchange format. Its +// zero value is ready to use. +type TextParser struct { + metricFamiliesByName map[string]*dto.MetricFamily + buf *bufio.Reader // Where the parsed input is read through. + err error // Most recent error. + lineCount int // Tracks the line count for error messages. + currentByte byte // The most recent byte read. + currentToken bytes.Buffer // Re-used each time a token has to be gathered from multiple bytes. + currentMF *dto.MetricFamily + currentMetric *dto.Metric + currentLabelPair *dto.LabelPair + + // The remaining member variables are only used for summaries/histograms. + currentLabels map[string]string // All labels including '__name__' but excluding 'quantile'/'le' + // Summary specific. + summaries map[uint64]*dto.Metric // Key is created with LabelsToSignature. + currentQuantile float64 + // Histogram specific. + histograms map[uint64]*dto.Metric // Key is created with LabelsToSignature. + currentBucket float64 + // These tell us if the currently processed line ends on '_count' or + // '_sum' respectively and belong to a summary/histogram, representing the sample + // count and sum of that summary/histogram. + currentIsSummaryCount, currentIsSummarySum bool + currentIsHistogramCount, currentIsHistogramSum bool +} + +// TextToMetricFamilies reads 'in' as the simple and flat text-based exchange +// format and creates MetricFamily proto messages. It returns the MetricFamily +// proto messages in a map where the metric names are the keys, along with any +// error encountered. +// +// If the input contains duplicate metrics (i.e. lines with the same metric name +// and exactly the same label set), the resulting MetricFamily will contain +// duplicate Metric proto messages. Similar is true for duplicate label +// names. Checks for duplicates have to be performed separately, if required. +// Also note that neither the metrics within each MetricFamily are sorted nor +// the label pairs within each Metric. Sorting is not required for the most +// frequent use of this method, which is sample ingestion in the Prometheus +// server. However, for presentation purposes, you might want to sort the +// metrics, and in some cases, you must sort the labels, e.g. for consumption by +// the metric family injection hook of the Prometheus registry. +// +// Summaries and histograms are rather special beasts. You would probably not +// use them in the simple text format anyway. This method can deal with +// summaries and histograms if they are presented in exactly the way the +// text.Create function creates them. +// +// This method must not be called concurrently. If you want to parse different +// input concurrently, instantiate a separate Parser for each goroutine. +func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricFamily, error) { + p.reset(in) + for nextState := p.startOfLine; nextState != nil; nextState = nextState() { + // Magic happens here... + } + // Get rid of empty metric families. + for k, mf := range p.metricFamiliesByName { + if len(mf.GetMetric()) == 0 { + delete(p.metricFamiliesByName, k) + } + } + // If p.err is io.EOF now, we have run into a premature end of the input + // stream. Turn this error into something nicer and more + // meaningful. (io.EOF is often used as a signal for the legitimate end + // of an input stream.) + if p.err == io.EOF { + p.parseError("unexpected end of input stream") + } + return p.metricFamiliesByName, p.err +} + +func (p *TextParser) reset(in io.Reader) { + p.metricFamiliesByName = map[string]*dto.MetricFamily{} + if p.buf == nil { + p.buf = bufio.NewReader(in) + } else { + p.buf.Reset(in) + } + p.err = nil + p.lineCount = 0 + if p.summaries == nil || len(p.summaries) > 0 { + p.summaries = map[uint64]*dto.Metric{} + } + if p.histograms == nil || len(p.histograms) > 0 { + p.histograms = map[uint64]*dto.Metric{} + } + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() +} + +// startOfLine represents the state where the next byte read from p.buf is the +// start of a line (or whitespace leading up to it). +func (p *TextParser) startOfLine() stateFn { + p.lineCount++ + if p.skipBlankTab(); p.err != nil { + // End of input reached. This is the only case where + // that is not an error but a signal that we are done. + p.err = nil + return nil + } + switch p.currentByte { + case '#': + return p.startComment + case '\n': + return p.startOfLine // Empty line, start the next one. + } + return p.readingMetricName +} + +// startComment represents the state where the next byte read from p.buf is the +// start of a comment (or whitespace leading up to it). +func (p *TextParser) startComment() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + return p.startOfLine + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + // If we have hit the end of line already, there is nothing left + // to do. This is not considered a syntax error. + if p.currentByte == '\n' { + return p.startOfLine + } + keyword := p.currentToken.String() + if keyword != "HELP" && keyword != "TYPE" { + // Generic comment, ignore by fast forwarding to end of line. + for p.currentByte != '\n' { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return nil // Unexpected end of input. + } + } + return p.startOfLine + } + // There is something. Next has to be a metric name. + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenAsMetricName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + if !isBlankOrTab(p.currentByte) { + p.parseError("invalid metric name in comment") + return nil + } + p.setOrCreateCurrentMF() + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + switch keyword { + case "HELP": + return p.readingHelp + case "TYPE": + return p.readingType + } + panic(fmt.Sprintf("code error: unexpected keyword %q", keyword)) +} + +// readingMetricName represents the state where the last byte read (now in +// p.currentByte) is the first byte of a metric name. +func (p *TextParser) readingMetricName() stateFn { + if p.readTokenAsMetricName(); p.err != nil { + return nil + } + if p.currentToken.Len() == 0 { + p.parseError("invalid metric name") + return nil + } + p.setOrCreateCurrentMF() + // Now is the time to fix the type if it hasn't happened yet. + if p.currentMF.Type == nil { + p.currentMF.Type = dto.MetricType_UNTYPED.Enum() + } + p.currentMetric = &dto.Metric{} + // Do not append the newly created currentMetric to + // currentMF.Metric right now. First wait if this is a summary, + // and the metric exists already, which we can only know after + // having read all the labels. + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingLabels +} + +// readingLabels represents the state where the last byte read (now in +// p.currentByte) is either the first byte of the label set (i.e. a '{'), or the +// first byte of the value (otherwise). +func (p *TextParser) readingLabels() stateFn { + // Summaries/histograms are special. We have to reset the + // currentLabels map, currentQuantile and currentBucket before starting to + // read labels. + if p.currentMF.GetType() == dto.MetricType_SUMMARY || p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + p.currentLabels = map[string]string{} + p.currentLabels[string(model.MetricNameLabel)] = p.currentMF.GetName() + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() + } + if p.currentByte != '{' { + return p.readingValue + } + return p.startLabelName +} + +// startLabelName represents the state where the next byte read from p.buf is +// the start of a label name (or whitespace leading up to it). +func (p *TextParser) startLabelName() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '}' { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + } + if p.readTokenAsLabelName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() == 0 { + p.parseError(fmt.Sprintf("invalid label name for metric %q", p.currentMF.GetName())) + return nil + } + p.currentLabelPair = &dto.LabelPair{Name: proto.String(p.currentToken.String())} + if p.currentLabelPair.GetName() == string(model.MetricNameLabel) { + p.parseError(fmt.Sprintf("label name %q is reserved", model.MetricNameLabel)) + return nil + } + // Special summary/histogram treatment. Don't add 'quantile' and 'le' + // labels to 'real' labels. + if !(p.currentMF.GetType() == dto.MetricType_SUMMARY && p.currentLabelPair.GetName() == model.QuantileLabel) && + !(p.currentMF.GetType() == dto.MetricType_HISTOGRAM && p.currentLabelPair.GetName() == model.BucketLabel) { + p.currentMetric.Label = append(p.currentMetric.Label, p.currentLabelPair) + } + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '=' { + p.parseError(fmt.Sprintf("expected '=' after label name, found %q", p.currentByte)) + return nil + } + return p.startLabelValue +} + +// startLabelValue represents the state where the next byte read from p.buf is +// the start of a (quoted) label value (or whitespace leading up to it). +func (p *TextParser) startLabelValue() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '"' { + p.parseError(fmt.Sprintf("expected '\"' at start of label value, found %q", p.currentByte)) + return nil + } + if p.readTokenAsLabelValue(); p.err != nil { + return nil + } + if !model.LabelValue(p.currentToken.String()).IsValid() { + p.parseError(fmt.Sprintf("invalid label value %q", p.currentToken.String())) + return nil + } + p.currentLabelPair.Value = proto.String(p.currentToken.String()) + // Special treatment of summaries: + // - Quantile labels are special, will result in dto.Quantile later. + // - Other labels have to be added to currentLabels for signature calculation. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if p.currentLabelPair.GetName() == model.QuantileLabel { + if p.currentQuantile, p.err = parseFloat(p.currentLabelPair.GetValue()); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'quantile' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + // Similar special treatment of histograms. + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentLabelPair.GetName() == model.BucketLabel { + if p.currentBucket, p.err = parseFloat(p.currentLabelPair.GetValue()); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'le' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + switch p.currentByte { + case ',': + return p.startLabelName + + case '}': + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + default: + p.parseError(fmt.Sprintf("unexpected end of label value %q", p.currentLabelPair.GetValue())) + return nil + } +} + +// readingValue represents the state where the last byte read (now in +// p.currentByte) is the first byte of the sample value (i.e. a float). +func (p *TextParser) readingValue() stateFn { + // When we are here, we have read all the labels, so for the + // special case of a summary/histogram, we can finally find out + // if the metric already exists. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + signature := model.LabelsToSignature(p.currentLabels) + if summary := p.summaries[signature]; summary != nil { + p.currentMetric = summary + } else { + p.summaries[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + signature := model.LabelsToSignature(p.currentLabels) + if histogram := p.histograms[signature]; histogram != nil { + p.currentMetric = histogram + } else { + p.histograms[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else { + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + value, err := parseFloat(p.currentToken.String()) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value, got %q", p.currentToken.String())) + return nil + } + switch p.currentMF.GetType() { + case dto.MetricType_COUNTER: + p.currentMetric.Counter = &dto.Counter{Value: proto.Float64(value)} + case dto.MetricType_GAUGE: + p.currentMetric.Gauge = &dto.Gauge{Value: proto.Float64(value)} + case dto.MetricType_UNTYPED: + p.currentMetric.Untyped = &dto.Untyped{Value: proto.Float64(value)} + case dto.MetricType_SUMMARY: + // *sigh* + if p.currentMetric.Summary == nil { + p.currentMetric.Summary = &dto.Summary{} + } + switch { + case p.currentIsSummaryCount: + p.currentMetric.Summary.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsSummarySum: + p.currentMetric.Summary.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentQuantile): + p.currentMetric.Summary.Quantile = append( + p.currentMetric.Summary.Quantile, + &dto.Quantile{ + Quantile: proto.Float64(p.currentQuantile), + Value: proto.Float64(value), + }, + ) + } + case dto.MetricType_HISTOGRAM: + // *sigh* + if p.currentMetric.Histogram == nil { + p.currentMetric.Histogram = &dto.Histogram{} + } + switch { + case p.currentIsHistogramCount: + p.currentMetric.Histogram.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsHistogramSum: + p.currentMetric.Histogram.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentBucket): + p.currentMetric.Histogram.Bucket = append( + p.currentMetric.Histogram.Bucket, + &dto.Bucket{ + UpperBound: proto.Float64(p.currentBucket), + CumulativeCount: proto.Uint64(uint64(value)), + }, + ) + } + default: + p.err = fmt.Errorf("unexpected type for metric name %q", p.currentMF.GetName()) + } + if p.currentByte == '\n' { + return p.startOfLine + } + return p.startTimestamp +} + +// startTimestamp represents the state where the next byte read from p.buf is +// the start of the timestamp (or whitespace leading up to it). +func (p *TextParser) startTimestamp() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + timestamp, err := strconv.ParseInt(p.currentToken.String(), 10, 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected integer as timestamp, got %q", p.currentToken.String())) + return nil + } + p.currentMetric.TimestampMs = proto.Int64(timestamp) + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() > 0 { + p.parseError(fmt.Sprintf("spurious string after timestamp: %q", p.currentToken.String())) + return nil + } + return p.startOfLine +} + +// readingHelp represents the state where the last byte read (now in +// p.currentByte) is the first byte of the docstring after 'HELP'. +func (p *TextParser) readingHelp() stateFn { + if p.currentMF.Help != nil { + p.parseError(fmt.Sprintf("second HELP line for metric name %q", p.currentMF.GetName())) + return nil + } + // Rest of line is the docstring. + if p.readTokenUntilNewline(true); p.err != nil { + return nil // Unexpected end of input. + } + p.currentMF.Help = proto.String(p.currentToken.String()) + return p.startOfLine +} + +// readingType represents the state where the last byte read (now in +// p.currentByte) is the first byte of the type hint after 'HELP'. +func (p *TextParser) readingType() stateFn { + if p.currentMF.Type != nil { + p.parseError(fmt.Sprintf("second TYPE line for metric name %q, or TYPE reported after samples", p.currentMF.GetName())) + return nil + } + // Rest of line is the type. + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + metricType, ok := dto.MetricType_value[strings.ToUpper(p.currentToken.String())] + if !ok { + p.parseError(fmt.Sprintf("unknown metric type %q", p.currentToken.String())) + return nil + } + p.currentMF.Type = dto.MetricType(metricType).Enum() + return p.startOfLine +} + +// parseError sets p.err to a ParseError at the current line with the given +// message. +func (p *TextParser) parseError(msg string) { + p.err = ParseError{ + Line: p.lineCount, + Msg: msg, + } +} + +// skipBlankTab reads (and discards) bytes from p.buf until it encounters a byte +// that is neither ' ' nor '\t'. That byte is left in p.currentByte. +func (p *TextParser) skipBlankTab() { + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil || !isBlankOrTab(p.currentByte) { + return + } + } +} + +// skipBlankTabIfCurrentBlankTab works exactly as skipBlankTab but doesn't do +// anything if p.currentByte is neither ' ' nor '\t'. +func (p *TextParser) skipBlankTabIfCurrentBlankTab() { + if isBlankOrTab(p.currentByte) { + p.skipBlankTab() + } +} + +// readTokenUntilWhitespace copies bytes from p.buf into p.currentToken. The +// first byte considered is the byte already read (now in p.currentByte). The +// first whitespace byte encountered is still copied into p.currentByte, but not +// into p.currentToken. +func (p *TextParser) readTokenUntilWhitespace() { + p.currentToken.Reset() + for p.err == nil && !isBlankOrTab(p.currentByte) && p.currentByte != '\n' { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenUntilNewline copies bytes from p.buf into p.currentToken. The first +// byte considered is the byte already read (now in p.currentByte). The first +// newline byte encountered is still copied into p.currentByte, but not into +// p.currentToken. If recognizeEscapeSequence is true, two escape sequences are +// recognized: '\\' translates into '\', and '\n' into a line-feed character. +// All other escape sequences are invalid and cause an error. +func (p *TextParser) readTokenUntilNewline(recognizeEscapeSequence bool) { + p.currentToken.Reset() + escaped := false + for p.err == nil { + if recognizeEscapeSequence && escaped { + switch p.currentByte { + case '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + } else { + switch p.currentByte { + case '\n': + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenAsMetricName copies a metric name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a metric name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsMetricName() { + p.currentToken.Reset() + if !isValidMetricNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidMetricNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelName copies a label name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a label name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsLabelName() { + p.currentToken.Reset() + if !isValidLabelNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidLabelNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelValue copies a label value from p.buf into p.currentToken. +// In contrast to the other 'readTokenAs...' functions, which start with the +// last read byte in p.currentByte, this method ignores p.currentByte and starts +// with reading a new byte from p.buf. The first byte not part of a label value +// is still copied into p.currentByte, but not into p.currentToken. +func (p *TextParser) readTokenAsLabelValue() { + p.currentToken.Reset() + escaped := false + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return + } + if escaped { + switch p.currentByte { + case '"', '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + continue + } + switch p.currentByte { + case '"': + return + case '\n': + p.parseError(fmt.Sprintf("label value %q contains unescaped new-line", p.currentToken.String())) + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } +} + +func (p *TextParser) setOrCreateCurrentMF() { + p.currentIsSummaryCount = false + p.currentIsSummarySum = false + p.currentIsHistogramCount = false + p.currentIsHistogramSum = false + name := p.currentToken.String() + if p.currentMF = p.metricFamiliesByName[name]; p.currentMF != nil { + return + } + // Try out if this is a _sum or _count for a summary/histogram. + summaryName := summaryMetricName(name) + if p.currentMF = p.metricFamiliesByName[summaryName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if isCount(name) { + p.currentIsSummaryCount = true + } + if isSum(name) { + p.currentIsSummarySum = true + } + return + } + } + histogramName := histogramMetricName(name) + if p.currentMF = p.metricFamiliesByName[histogramName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if isCount(name) { + p.currentIsHistogramCount = true + } + if isSum(name) { + p.currentIsHistogramSum = true + } + return + } + } + p.currentMF = &dto.MetricFamily{Name: proto.String(name)} + p.metricFamiliesByName[name] = p.currentMF +} + +func isValidLabelNameStart(b byte) bool { + return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' +} + +func isValidLabelNameContinuation(b byte) bool { + return isValidLabelNameStart(b) || (b >= '0' && b <= '9') +} + +func isValidMetricNameStart(b byte) bool { + return isValidLabelNameStart(b) || b == ':' +} + +func isValidMetricNameContinuation(b byte) bool { + return isValidLabelNameContinuation(b) || b == ':' +} + +func isBlankOrTab(b byte) bool { + return b == ' ' || b == '\t' +} + +func isCount(name string) bool { + return len(name) > 6 && name[len(name)-6:] == "_count" +} + +func isSum(name string) bool { + return len(name) > 4 && name[len(name)-4:] == "_sum" +} + +func isBucket(name string) bool { + return len(name) > 7 && name[len(name)-7:] == "_bucket" +} + +func summaryMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + default: + return name + } +} + +func histogramMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + case isBucket(name): + return name[:len(name)-7] + default: + return name + } +} + +func parseFloat(s string) (float64, error) { + if strings.ContainsAny(s, "pP_") { + return 0, fmt.Errorf("unsupported character in float") + } + return strconv.ParseFloat(s, 64) +} diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt new file mode 100644 index 00000000..7723656d --- /dev/null +++ b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt @@ -0,0 +1,67 @@ +PACKAGE + +package goautoneg +import "bitbucket.org/ww/goautoneg" + +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the Open Knowledge Foundation Ltd. 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 +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +FUNCTIONS + +func Negotiate(header string, alternatives []string) (content_type string) +Negotiate the most appropriate content_type given the accept header +and a list of alternatives. + +func ParseAccept(header string) (accept []Accept) +Parse an Accept Header string returning a sorted list +of clauses + + +TYPES + +type Accept struct { + Type, SubType string + Q float32 + Params map[string]string +} +Structure to represent a clause in an HTTP Accept Header + + +SUBDIRECTORIES + + .hg diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go new file mode 100644 index 00000000..26e92288 --- /dev/null +++ b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go @@ -0,0 +1,162 @@ +/* +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the Open Knowledge Foundation Ltd. 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 +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ +package goautoneg + +import ( + "sort" + "strconv" + "strings" +) + +// Structure to represent a clause in an HTTP Accept Header +type Accept struct { + Type, SubType string + Q float64 + Params map[string]string +} + +// For internal use, so that we can use the sort interface +type accept_slice []Accept + +func (accept accept_slice) Len() int { + slice := []Accept(accept) + return len(slice) +} + +func (accept accept_slice) Less(i, j int) bool { + slice := []Accept(accept) + ai, aj := slice[i], slice[j] + if ai.Q > aj.Q { + return true + } + if ai.Type != "*" && aj.Type == "*" { + return true + } + if ai.SubType != "*" && aj.SubType == "*" { + return true + } + return false +} + +func (accept accept_slice) Swap(i, j int) { + slice := []Accept(accept) + slice[i], slice[j] = slice[j], slice[i] +} + +// Parse an Accept Header string returning a sorted list +// of clauses +func ParseAccept(header string) (accept []Accept) { + parts := strings.Split(header, ",") + accept = make([]Accept, 0, len(parts)) + for _, part := range parts { + part := strings.Trim(part, " ") + + a := Accept{} + a.Params = make(map[string]string) + a.Q = 1.0 + + mrp := strings.Split(part, ";") + + media_range := mrp[0] + sp := strings.Split(media_range, "/") + a.Type = strings.Trim(sp[0], " ") + + switch { + case len(sp) == 1 && a.Type == "*": + a.SubType = "*" + case len(sp) == 2: + a.SubType = strings.Trim(sp[1], " ") + default: + continue + } + + if len(mrp) == 1 { + accept = append(accept, a) + continue + } + + for _, param := range mrp[1:] { + sp := strings.SplitN(param, "=", 2) + if len(sp) != 2 { + continue + } + token := strings.Trim(sp[0], " ") + if token == "q" { + a.Q, _ = strconv.ParseFloat(sp[1], 32) + } else { + a.Params[token] = strings.Trim(sp[1], " ") + } + } + + accept = append(accept, a) + } + + slice := accept_slice(accept) + sort.Sort(slice) + + return +} + +// Negotiate the most appropriate content_type given the accept header +// and a list of alternatives. +func Negotiate(header string, alternatives []string) (content_type string) { + asp := make([][]string, 0, len(alternatives)) + for _, ctype := range alternatives { + asp = append(asp, strings.SplitN(ctype, "/", 2)) + } + for _, clause := range ParseAccept(header) { + for i, ctsp := range asp { + if clause.Type == ctsp[0] && clause.SubType == ctsp[1] { + content_type = alternatives[i] + return + } + if clause.Type == ctsp[0] && clause.SubType == "*" { + content_type = alternatives[i] + return + } + if clause.Type == "*" && clause.SubType == "*" { + content_type = alternatives[i] + return + } + } + } + return +} diff --git a/vendor/github.com/prometheus/common/model/alert.go b/vendor/github.com/prometheus/common/model/alert.go new file mode 100644 index 00000000..35e739c7 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/alert.go @@ -0,0 +1,136 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "time" +) + +type AlertStatus string + +const ( + AlertFiring AlertStatus = "firing" + AlertResolved AlertStatus = "resolved" +) + +// Alert is a generic representation of an alert in the Prometheus eco-system. +type Alert struct { + // Label value pairs for purpose of aggregation, matching, and disposition + // dispatching. This must minimally include an "alertname" label. + Labels LabelSet `json:"labels"` + + // Extra key/value information which does not define alert identity. + Annotations LabelSet `json:"annotations"` + + // The known time range for this alert. Both ends are optional. + StartsAt time.Time `json:"startsAt,omitempty"` + EndsAt time.Time `json:"endsAt,omitempty"` + GeneratorURL string `json:"generatorURL"` +} + +// Name returns the name of the alert. It is equivalent to the "alertname" label. +func (a *Alert) Name() string { + return string(a.Labels[AlertNameLabel]) +} + +// Fingerprint returns a unique hash for the alert. It is equivalent to +// the fingerprint of the alert's label set. +func (a *Alert) Fingerprint() Fingerprint { + return a.Labels.Fingerprint() +} + +func (a *Alert) String() string { + s := fmt.Sprintf("%s[%s]", a.Name(), a.Fingerprint().String()[:7]) + if a.Resolved() { + return s + "[resolved]" + } + return s + "[active]" +} + +// Resolved returns true iff the activity interval ended in the past. +func (a *Alert) Resolved() bool { + return a.ResolvedAt(time.Now()) +} + +// ResolvedAt returns true off the activity interval ended before +// the given timestamp. +func (a *Alert) ResolvedAt(ts time.Time) bool { + if a.EndsAt.IsZero() { + return false + } + return !a.EndsAt.After(ts) +} + +// Status returns the status of the alert. +func (a *Alert) Status() AlertStatus { + if a.Resolved() { + return AlertResolved + } + return AlertFiring +} + +// Validate checks whether the alert data is inconsistent. +func (a *Alert) Validate() error { + if a.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if !a.EndsAt.IsZero() && a.EndsAt.Before(a.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if err := a.Labels.Validate(); err != nil { + return fmt.Errorf("invalid label set: %s", err) + } + if len(a.Labels) == 0 { + return fmt.Errorf("at least one label pair required") + } + if err := a.Annotations.Validate(); err != nil { + return fmt.Errorf("invalid annotations: %s", err) + } + return nil +} + +// Alert is a list of alerts that can be sorted in chronological order. +type Alerts []*Alert + +func (as Alerts) Len() int { return len(as) } +func (as Alerts) Swap(i, j int) { as[i], as[j] = as[j], as[i] } + +func (as Alerts) Less(i, j int) bool { + if as[i].StartsAt.Before(as[j].StartsAt) { + return true + } + if as[i].EndsAt.Before(as[j].EndsAt) { + return true + } + return as[i].Fingerprint() < as[j].Fingerprint() +} + +// HasFiring returns true iff one of the alerts is not resolved. +func (as Alerts) HasFiring() bool { + for _, a := range as { + if !a.Resolved() { + return true + } + } + return false +} + +// Status returns StatusFiring iff at least one of the alerts is firing. +func (as Alerts) Status() AlertStatus { + if as.HasFiring() { + return AlertFiring + } + return AlertResolved +} diff --git a/vendor/github.com/prometheus/common/model/fingerprinting.go b/vendor/github.com/prometheus/common/model/fingerprinting.go new file mode 100644 index 00000000..fc4de410 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/fingerprinting.go @@ -0,0 +1,105 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "strconv" +) + +// Fingerprint provides a hash-capable representation of a Metric. +// For our purposes, FNV-1A 64-bit is used. +type Fingerprint uint64 + +// FingerprintFromString transforms a string representation into a Fingerprint. +func FingerprintFromString(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + return Fingerprint(num), err +} + +// ParseFingerprint parses the input string into a fingerprint. +func ParseFingerprint(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + if err != nil { + return 0, err + } + return Fingerprint(num), nil +} + +func (f Fingerprint) String() string { + return fmt.Sprintf("%016x", uint64(f)) +} + +// Fingerprints represents a collection of Fingerprint subject to a given +// natural sorting scheme. It implements sort.Interface. +type Fingerprints []Fingerprint + +// Len implements sort.Interface. +func (f Fingerprints) Len() int { + return len(f) +} + +// Less implements sort.Interface. +func (f Fingerprints) Less(i, j int) bool { + return f[i] < f[j] +} + +// Swap implements sort.Interface. +func (f Fingerprints) Swap(i, j int) { + f[i], f[j] = f[j], f[i] +} + +// FingerprintSet is a set of Fingerprints. +type FingerprintSet map[Fingerprint]struct{} + +// Equal returns true if both sets contain the same elements (and not more). +func (s FingerprintSet) Equal(o FingerprintSet) bool { + if len(s) != len(o) { + return false + } + + for k := range s { + if _, ok := o[k]; !ok { + return false + } + } + + return true +} + +// Intersection returns the elements contained in both sets. +func (s FingerprintSet) Intersection(o FingerprintSet) FingerprintSet { + myLength, otherLength := len(s), len(o) + if myLength == 0 || otherLength == 0 { + return FingerprintSet{} + } + + subSet := s + superSet := o + + if otherLength < myLength { + subSet = o + superSet = s + } + + out := FingerprintSet{} + + for k := range subSet { + if _, ok := superSet[k]; ok { + out[k] = struct{}{} + } + } + + return out +} diff --git a/vendor/github.com/prometheus/common/model/fnv.go b/vendor/github.com/prometheus/common/model/fnv.go new file mode 100644 index 00000000..038fc1c9 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/fnv.go @@ -0,0 +1,42 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/vendor/github.com/prometheus/common/model/labels.go b/vendor/github.com/prometheus/common/model/labels.go new file mode 100644 index 00000000..41051a01 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/labels.go @@ -0,0 +1,210 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "regexp" + "strings" + "unicode/utf8" +) + +const ( + // AlertNameLabel is the name of the label containing the an alert's name. + AlertNameLabel = "alertname" + + // ExportedLabelPrefix is the prefix to prepend to the label names present in + // exported metrics if a label of the same name is added by the server. + ExportedLabelPrefix = "exported_" + + // MetricNameLabel is the label name indicating the metric name of a + // timeseries. + MetricNameLabel = "__name__" + + // SchemeLabel is the name of the label that holds the scheme on which to + // scrape a target. + SchemeLabel = "__scheme__" + + // AddressLabel is the name of the label that holds the address of + // a scrape target. + AddressLabel = "__address__" + + // MetricsPathLabel is the name of the label that holds the path on which to + // scrape a target. + MetricsPathLabel = "__metrics_path__" + + // ReservedLabelPrefix is a prefix which is not legal in user-supplied + // label names. + ReservedLabelPrefix = "__" + + // MetaLabelPrefix is a prefix for labels that provide meta information. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. + MetaLabelPrefix = "__meta_" + + // TmpLabelPrefix is a prefix for temporary labels as part of relabelling. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. This is reserved for use in + // Prometheus configuration files by users. + TmpLabelPrefix = "__tmp_" + + // ParamLabelPrefix is a prefix for labels that provide URL parameters + // used to scrape a target. + ParamLabelPrefix = "__param_" + + // JobLabel is the label name indicating the job from which a timeseries + // was scraped. + JobLabel = "job" + + // InstanceLabel is the label name used for the instance label. + InstanceLabel = "instance" + + // BucketLabel is used for the label that defines the upper bound of a + // bucket of a histogram ("le" -> "less or equal"). + BucketLabel = "le" + + // QuantileLabel is used for the label that defines the quantile in a + // summary. + QuantileLabel = "quantile" +) + +// LabelNameRE is a regular expression matching valid label names. Note that the +// IsValid method of LabelName performs the same check but faster than a match +// with this regular expression. +var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") + +// A LabelName is a key for a LabelSet or Metric. It has a value associated +// therewith. +type LabelName string + +// IsValid is true iff the label name matches the pattern of LabelNameRE. This +// method, however, does not use LabelNameRE for the check but a much faster +// hardcoded implementation. +func (ln LabelName) IsValid() bool { + if len(ln) == 0 { + return false + } + for i, b := range ln { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (ln *LabelName) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (ln *LabelName) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// LabelNames is a sortable LabelName slice. In implements sort.Interface. +type LabelNames []LabelName + +func (l LabelNames) Len() int { + return len(l) +} + +func (l LabelNames) Less(i, j int) bool { + return l[i] < l[j] +} + +func (l LabelNames) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +func (l LabelNames) String() string { + labelStrings := make([]string, 0, len(l)) + for _, label := range l { + labelStrings = append(labelStrings, string(label)) + } + return strings.Join(labelStrings, ", ") +} + +// A LabelValue is an associated value for a LabelName. +type LabelValue string + +// IsValid returns true iff the string is a valid UTF8. +func (lv LabelValue) IsValid() bool { + return utf8.ValidString(string(lv)) +} + +// LabelValues is a sortable LabelValue slice. It implements sort.Interface. +type LabelValues []LabelValue + +func (l LabelValues) Len() int { + return len(l) +} + +func (l LabelValues) Less(i, j int) bool { + return string(l[i]) < string(l[j]) +} + +func (l LabelValues) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +// LabelPair pairs a name with a value. +type LabelPair struct { + Name LabelName + Value LabelValue +} + +// LabelPairs is a sortable slice of LabelPair pointers. It implements +// sort.Interface. +type LabelPairs []*LabelPair + +func (l LabelPairs) Len() int { + return len(l) +} + +func (l LabelPairs) Less(i, j int) bool { + switch { + case l[i].Name > l[j].Name: + return false + case l[i].Name < l[j].Name: + return true + case l[i].Value > l[j].Value: + return false + case l[i].Value < l[j].Value: + return true + default: + return false + } +} + +func (l LabelPairs) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} diff --git a/vendor/github.com/prometheus/common/model/labelset.go b/vendor/github.com/prometheus/common/model/labelset.go new file mode 100644 index 00000000..6eda08a7 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/labelset.go @@ -0,0 +1,169 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "sort" + "strings" +) + +// A LabelSet is a collection of LabelName and LabelValue pairs. The LabelSet +// may be fully-qualified down to the point where it may resolve to a single +// Metric in the data store or not. All operations that occur within the realm +// of a LabelSet can emit a vector of Metric entities to which the LabelSet may +// match. +type LabelSet map[LabelName]LabelValue + +// Validate checks whether all names and values in the label set +// are valid. +func (ls LabelSet) Validate() error { + for ln, lv := range ls { + if !ln.IsValid() { + return fmt.Errorf("invalid name %q", ln) + } + if !lv.IsValid() { + return fmt.Errorf("invalid value %q", lv) + } + } + return nil +} + +// Equal returns true iff both label sets have exactly the same key/value pairs. +func (ls LabelSet) Equal(o LabelSet) bool { + if len(ls) != len(o) { + return false + } + for ln, lv := range ls { + olv, ok := o[ln] + if !ok { + return false + } + if olv != lv { + return false + } + } + return true +} + +// Before compares the metrics, using the following criteria: +// +// If m has fewer labels than o, it is before o. If it has more, it is not. +// +// If the number of labels is the same, the superset of all label names is +// sorted alphanumerically. The first differing label pair found in that order +// determines the outcome: If the label does not exist at all in m, then m is +// before o, and vice versa. Otherwise the label value is compared +// alphanumerically. +// +// If m and o are equal, the method returns false. +func (ls LabelSet) Before(o LabelSet) bool { + if len(ls) < len(o) { + return true + } + if len(ls) > len(o) { + return false + } + + lns := make(LabelNames, 0, len(ls)+len(o)) + for ln := range ls { + lns = append(lns, ln) + } + for ln := range o { + lns = append(lns, ln) + } + // It's probably not worth it to de-dup lns. + sort.Sort(lns) + for _, ln := range lns { + mlv, ok := ls[ln] + if !ok { + return true + } + olv, ok := o[ln] + if !ok { + return false + } + if mlv < olv { + return true + } + if mlv > olv { + return false + } + } + return false +} + +// Clone returns a copy of the label set. +func (ls LabelSet) Clone() LabelSet { + lsn := make(LabelSet, len(ls)) + for ln, lv := range ls { + lsn[ln] = lv + } + return lsn +} + +// Merge is a helper function to non-destructively merge two label sets. +func (l LabelSet) Merge(other LabelSet) LabelSet { + result := make(LabelSet, len(l)) + + for k, v := range l { + result[k] = v + } + + for k, v := range other { + result[k] = v + } + + return result +} + +func (l LabelSet) String() string { + lstrs := make([]string, 0, len(l)) + for l, v := range l { + lstrs = append(lstrs, fmt.Sprintf("%s=%q", l, v)) + } + + sort.Strings(lstrs) + return fmt.Sprintf("{%s}", strings.Join(lstrs, ", ")) +} + +// Fingerprint returns the LabelSet's fingerprint. +func (ls LabelSet) Fingerprint() Fingerprint { + return labelSetToFingerprint(ls) +} + +// FastFingerprint returns the LabelSet's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (ls LabelSet) FastFingerprint() Fingerprint { + return labelSetToFastFingerprint(ls) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (l *LabelSet) UnmarshalJSON(b []byte) error { + var m map[LabelName]LabelValue + if err := json.Unmarshal(b, &m); err != nil { + return err + } + // encoding/json only unmarshals maps of the form map[string]T. It treats + // LabelName as a string and does not call its UnmarshalJSON method. + // Thus, we have to replicate the behavior here. + for ln := range m { + if !ln.IsValid() { + return fmt.Errorf("%q is not a valid label name", ln) + } + } + *l = LabelSet(m) + return nil +} diff --git a/vendor/github.com/prometheus/common/model/metric.go b/vendor/github.com/prometheus/common/model/metric.go new file mode 100644 index 00000000..00804b7f --- /dev/null +++ b/vendor/github.com/prometheus/common/model/metric.go @@ -0,0 +1,102 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "regexp" + "sort" + "strings" +) + +var ( + // MetricNameRE is a regular expression matching valid metric + // names. Note that the IsValidMetricName function performs the same + // check but faster than a match with this regular expression. + MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) +) + +// A Metric is similar to a LabelSet, but the key difference is that a Metric is +// a singleton and refers to one and only one stream of samples. +type Metric LabelSet + +// Equal compares the metrics. +func (m Metric) Equal(o Metric) bool { + return LabelSet(m).Equal(LabelSet(o)) +} + +// Before compares the metrics' underlying label sets. +func (m Metric) Before(o Metric) bool { + return LabelSet(m).Before(LabelSet(o)) +} + +// Clone returns a copy of the Metric. +func (m Metric) Clone() Metric { + clone := make(Metric, len(m)) + for k, v := range m { + clone[k] = v + } + return clone +} + +func (m Metric) String() string { + metricName, hasName := m[MetricNameLabel] + numLabels := len(m) - 1 + if !hasName { + numLabels = len(m) + } + labelStrings := make([]string, 0, numLabels) + for label, value := range m { + if label != MetricNameLabel { + labelStrings = append(labelStrings, fmt.Sprintf("%s=%q", label, value)) + } + } + + switch numLabels { + case 0: + if hasName { + return string(metricName) + } + return "{}" + default: + sort.Strings(labelStrings) + return fmt.Sprintf("%s{%s}", metricName, strings.Join(labelStrings, ", ")) + } +} + +// Fingerprint returns a Metric's Fingerprint. +func (m Metric) Fingerprint() Fingerprint { + return LabelSet(m).Fingerprint() +} + +// FastFingerprint returns a Metric's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (m Metric) FastFingerprint() Fingerprint { + return LabelSet(m).FastFingerprint() +} + +// IsValidMetricName returns true iff name matches the pattern of MetricNameRE. +// This function, however, does not use MetricNameRE for the check but a much +// faster hardcoded implementation. +func IsValidMetricName(n LabelValue) bool { + if len(n) == 0 { + return false + } + for i, b := range n { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} diff --git a/vendor/github.com/prometheus/common/model/model.go b/vendor/github.com/prometheus/common/model/model.go new file mode 100644 index 00000000..a7b96917 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/model.go @@ -0,0 +1,16 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package model contains common data structures that are shared across +// Prometheus components and libraries. +package model diff --git a/vendor/github.com/prometheus/common/model/signature.go b/vendor/github.com/prometheus/common/model/signature.go new file mode 100644 index 00000000..8762b13c --- /dev/null +++ b/vendor/github.com/prometheus/common/model/signature.go @@ -0,0 +1,144 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "sort" +) + +// SeparatorByte is a byte that cannot occur in valid UTF-8 sequences and is +// used to separate label names, label values, and other strings from each other +// when calculating their combined hash value (aka signature aka fingerprint). +const SeparatorByte byte = 255 + +var ( + // cache the signature of an empty label set. + emptyLabelSignature = hashNew() +) + +// LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a +// given label set. (Collisions are possible but unlikely if the number of label +// sets the function is applied to is small.) +func LabelsToSignature(labels map[string]string) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + labelNames := make([]string, 0, len(labels)) + for labelName := range labels { + labelNames = append(labelNames, labelName) + } + sort.Strings(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, labelName) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, labels[labelName]) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// labelSetToFingerprint works exactly as LabelsToSignature but takes a LabelSet as +// parameter (rather than a label map) and returns a Fingerprint. +func labelSetToFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + labelNames := make(LabelNames, 0, len(ls)) + for labelName := range ls { + labelNames = append(labelNames, labelName) + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(ls[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return Fingerprint(sum) +} + +// labelSetToFastFingerprint works similar to labelSetToFingerprint but uses a +// faster and less allocation-heavy hash function, which is more susceptible to +// create hash collisions. Therefore, collision detection should be applied. +func labelSetToFastFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + var result uint64 + for labelName, labelValue := range ls { + sum := hashNew() + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(labelValue)) + result ^= sum + } + return Fingerprint(result) +} + +// SignatureForLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and only includes the labels with the +// specified LabelNames into the signature calculation. The labels passed in +// will be sorted by this function. +func SignatureForLabels(m Metric, labels ...LabelName) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + sort.Sort(LabelNames(labels)) + + sum := hashNew() + for _, label := range labels { + sum = hashAdd(sum, string(label)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[label])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// SignatureWithoutLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and excludes the labels with any of the +// specified LabelNames from the signature calculation. +func SignatureWithoutLabels(m Metric, labels map[LabelName]struct{}) uint64 { + if len(m) == 0 { + return emptyLabelSignature + } + + labelNames := make(LabelNames, 0, len(m)) + for labelName := range m { + if _, exclude := labels[labelName]; !exclude { + labelNames = append(labelNames, labelName) + } + } + if len(labelNames) == 0 { + return emptyLabelSignature + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} diff --git a/vendor/github.com/prometheus/common/model/silence.go b/vendor/github.com/prometheus/common/model/silence.go new file mode 100644 index 00000000..bb99889d --- /dev/null +++ b/vendor/github.com/prometheus/common/model/silence.go @@ -0,0 +1,106 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "regexp" + "time" +) + +// Matcher describes a matches the value of a given label. +type Matcher struct { + Name LabelName `json:"name"` + Value string `json:"value"` + IsRegex bool `json:"isRegex"` +} + +func (m *Matcher) UnmarshalJSON(b []byte) error { + type plain Matcher + if err := json.Unmarshal(b, (*plain)(m)); err != nil { + return err + } + + if len(m.Name) == 0 { + return fmt.Errorf("label name in matcher must not be empty") + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return err + } + } + return nil +} + +// Validate returns true iff all fields of the matcher have valid values. +func (m *Matcher) Validate() error { + if !m.Name.IsValid() { + return fmt.Errorf("invalid name %q", m.Name) + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return fmt.Errorf("invalid regular expression %q", m.Value) + } + } else if !LabelValue(m.Value).IsValid() || len(m.Value) == 0 { + return fmt.Errorf("invalid value %q", m.Value) + } + return nil +} + +// Silence defines the representation of a silence definition in the Prometheus +// eco-system. +type Silence struct { + ID uint64 `json:"id,omitempty"` + + Matchers []*Matcher `json:"matchers"` + + StartsAt time.Time `json:"startsAt"` + EndsAt time.Time `json:"endsAt"` + + CreatedAt time.Time `json:"createdAt,omitempty"` + CreatedBy string `json:"createdBy"` + Comment string `json:"comment,omitempty"` +} + +// Validate returns true iff all fields of the silence have valid values. +func (s *Silence) Validate() error { + if len(s.Matchers) == 0 { + return fmt.Errorf("at least one matcher required") + } + for _, m := range s.Matchers { + if err := m.Validate(); err != nil { + return fmt.Errorf("invalid matcher: %s", err) + } + } + if s.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if s.EndsAt.IsZero() { + return fmt.Errorf("end time missing") + } + if s.EndsAt.Before(s.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if s.CreatedBy == "" { + return fmt.Errorf("creator information missing") + } + if s.Comment == "" { + return fmt.Errorf("comment missing") + } + if s.CreatedAt.IsZero() { + return fmt.Errorf("creation timestamp missing") + } + return nil +} diff --git a/vendor/github.com/prometheus/common/model/time.go b/vendor/github.com/prometheus/common/model/time.go new file mode 100644 index 00000000..7b0064fd --- /dev/null +++ b/vendor/github.com/prometheus/common/model/time.go @@ -0,0 +1,270 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "math" + "regexp" + "strconv" + "strings" + "time" +) + +const ( + // MinimumTick is the minimum supported time resolution. This has to be + // at least time.Second in order for the code below to work. + minimumTick = time.Millisecond + // second is the Time duration equivalent to one second. + second = int64(time.Second / minimumTick) + // The number of nanoseconds per minimum tick. + nanosPerTick = int64(minimumTick / time.Nanosecond) + + // Earliest is the earliest Time representable. Handy for + // initializing a high watermark. + Earliest = Time(math.MinInt64) + // Latest is the latest Time representable. Handy for initializing + // a low watermark. + Latest = Time(math.MaxInt64) +) + +// Time is the number of milliseconds since the epoch +// (1970-01-01 00:00 UTC) excluding leap seconds. +type Time int64 + +// Interval describes an interval between two timestamps. +type Interval struct { + Start, End Time +} + +// Now returns the current time as a Time. +func Now() Time { + return TimeFromUnixNano(time.Now().UnixNano()) +} + +// TimeFromUnix returns the Time equivalent to the Unix Time t +// provided in seconds. +func TimeFromUnix(t int64) Time { + return Time(t * second) +} + +// TimeFromUnixNano returns the Time equivalent to the Unix Time +// t provided in nanoseconds. +func TimeFromUnixNano(t int64) Time { + return Time(t / nanosPerTick) +} + +// Equal reports whether two Times represent the same instant. +func (t Time) Equal(o Time) bool { + return t == o +} + +// Before reports whether the Time t is before o. +func (t Time) Before(o Time) bool { + return t < o +} + +// After reports whether the Time t is after o. +func (t Time) After(o Time) bool { + return t > o +} + +// Add returns the Time t + d. +func (t Time) Add(d time.Duration) Time { + return t + Time(d/minimumTick) +} + +// Sub returns the Duration t - o. +func (t Time) Sub(o Time) time.Duration { + return time.Duration(t-o) * minimumTick +} + +// Time returns the time.Time representation of t. +func (t Time) Time() time.Time { + return time.Unix(int64(t)/second, (int64(t)%second)*nanosPerTick) +} + +// Unix returns t as a Unix time, the number of seconds elapsed +// since January 1, 1970 UTC. +func (t Time) Unix() int64 { + return int64(t) / second +} + +// UnixNano returns t as a Unix time, the number of nanoseconds elapsed +// since January 1, 1970 UTC. +func (t Time) UnixNano() int64 { + return int64(t) * nanosPerTick +} + +// The number of digits after the dot. +var dotPrecision = int(math.Log10(float64(second))) + +// String returns a string representation of the Time. +func (t Time) String() string { + return strconv.FormatFloat(float64(t)/float64(second), 'f', -1, 64) +} + +// MarshalJSON implements the json.Marshaler interface. +func (t Time) MarshalJSON() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (t *Time) UnmarshalJSON(b []byte) error { + p := strings.Split(string(b), ".") + switch len(p) { + case 1: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + *t = Time(v * second) + + case 2: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + v *= second + + prec := dotPrecision - len(p[1]) + if prec < 0 { + p[1] = p[1][:dotPrecision] + } else if prec > 0 { + p[1] = p[1] + strings.Repeat("0", prec) + } + + va, err := strconv.ParseInt(p[1], 10, 32) + if err != nil { + return err + } + + // If the value was something like -0.1 the negative is lost in the + // parsing because of the leading zero, this ensures that we capture it. + if len(p[0]) > 0 && p[0][0] == '-' && v+va > 0 { + *t = Time(v+va) * -1 + } else { + *t = Time(v + va) + } + + default: + return fmt.Errorf("invalid time %q", string(b)) + } + return nil +} + +// Duration wraps time.Duration. It is used to parse the custom duration format +// from YAML. +// This type should not propagate beyond the scope of input/output processing. +type Duration time.Duration + +// Set implements pflag/flag.Value +func (d *Duration) Set(s string) error { + var err error + *d, err = ParseDuration(s) + return err +} + +// Type implements pflag.Value +func (d *Duration) Type() string { + return "duration" +} + +var durationRE = regexp.MustCompile("^([0-9]+)(y|w|d|h|m|s|ms)$") + +// ParseDuration parses a string into a time.Duration, assuming that a year +// always has 365d, a week always has 7d, and a day always has 24h. +func ParseDuration(durationStr string) (Duration, error) { + matches := durationRE.FindStringSubmatch(durationStr) + if len(matches) != 3 { + return 0, fmt.Errorf("not a valid duration string: %q", durationStr) + } + var ( + n, _ = strconv.Atoi(matches[1]) + dur = time.Duration(n) * time.Millisecond + ) + switch unit := matches[2]; unit { + case "y": + dur *= 1000 * 60 * 60 * 24 * 365 + case "w": + dur *= 1000 * 60 * 60 * 24 * 7 + case "d": + dur *= 1000 * 60 * 60 * 24 + case "h": + dur *= 1000 * 60 * 60 + case "m": + dur *= 1000 * 60 + case "s": + dur *= 1000 + case "ms": + // Value already correct + default: + return 0, fmt.Errorf("invalid time unit in duration string: %q", unit) + } + return Duration(dur), nil +} + +func (d Duration) String() string { + var ( + ms = int64(time.Duration(d) / time.Millisecond) + unit = "ms" + ) + if ms == 0 { + return "0s" + } + factors := map[string]int64{ + "y": 1000 * 60 * 60 * 24 * 365, + "w": 1000 * 60 * 60 * 24 * 7, + "d": 1000 * 60 * 60 * 24, + "h": 1000 * 60 * 60, + "m": 1000 * 60, + "s": 1000, + "ms": 1, + } + + switch int64(0) { + case ms % factors["y"]: + unit = "y" + case ms % factors["w"]: + unit = "w" + case ms % factors["d"]: + unit = "d" + case ms % factors["h"]: + unit = "h" + case ms % factors["m"]: + unit = "m" + case ms % factors["s"]: + unit = "s" + } + return fmt.Sprintf("%v%v", ms/factors[unit], unit) +} + +// MarshalYAML implements the yaml.Marshaler interface. +func (d Duration) MarshalYAML() (interface{}, error) { + return d.String(), nil +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (d *Duration) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + dur, err := ParseDuration(s) + if err != nil { + return err + } + *d = dur + return nil +} diff --git a/vendor/github.com/prometheus/common/model/value.go b/vendor/github.com/prometheus/common/model/value.go new file mode 100644 index 00000000..c9d8fb1a --- /dev/null +++ b/vendor/github.com/prometheus/common/model/value.go @@ -0,0 +1,416 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "math" + "sort" + "strconv" + "strings" +) + +var ( + // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a + // non-existing sample pair. It is a SamplePair with timestamp Earliest and + // value 0.0. Note that the natural zero value of SamplePair has a timestamp + // of 0, which is possible to appear in a real SamplePair and thus not + // suitable to signal a non-existing SamplePair. + ZeroSamplePair = SamplePair{Timestamp: Earliest} + + // ZeroSample is the pseudo zero-value of Sample used to signal a + // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, + // and metric nil. Note that the natural zero value of Sample has a timestamp + // of 0, which is possible to appear in a real Sample and thus not suitable + // to signal a non-existing Sample. + ZeroSample = Sample{Timestamp: Earliest} +) + +// A SampleValue is a representation of a value for a given sample at a given +// time. +type SampleValue float64 + +// MarshalJSON implements json.Marshaler. +func (v SampleValue) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (v *SampleValue) UnmarshalJSON(b []byte) error { + if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { + return fmt.Errorf("sample value must be a quoted string") + } + f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) + if err != nil { + return err + } + *v = SampleValue(f) + return nil +} + +// Equal returns true if the value of v and o is equal or if both are NaN. Note +// that v==o is false if both are NaN. If you want the conventional float +// behavior, use == to compare two SampleValues. +func (v SampleValue) Equal(o SampleValue) bool { + if v == o { + return true + } + return math.IsNaN(float64(v)) && math.IsNaN(float64(o)) +} + +func (v SampleValue) String() string { + return strconv.FormatFloat(float64(v), 'f', -1, 64) +} + +// SamplePair pairs a SampleValue with a Timestamp. +type SamplePair struct { + Timestamp Time + Value SampleValue +} + +// MarshalJSON implements json.Marshaler. +func (s SamplePair) MarshalJSON() ([]byte, error) { + t, err := json.Marshal(s.Timestamp) + if err != nil { + return nil, err + } + v, err := json.Marshal(s.Value) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *SamplePair) UnmarshalJSON(b []byte) error { + v := [...]json.Unmarshaler{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Equal returns true if this SamplePair and o have equal Values and equal +// Timestamps. The semantics of Value equality is defined by SampleValue.Equal. +func (s *SamplePair) Equal(o *SamplePair) bool { + return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp)) +} + +func (s SamplePair) String() string { + return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp) +} + +// Sample is a sample pair associated with a metric. +type Sample struct { + Metric Metric `json:"metric"` + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +// Equal compares first the metrics, then the timestamp, then the value. The +// semantics of value equality is defined by SampleValue.Equal. +func (s *Sample) Equal(o *Sample) bool { + if s == o { + return true + } + + if !s.Metric.Equal(o.Metric) { + return false + } + if !s.Timestamp.Equal(o.Timestamp) { + return false + } + + return s.Value.Equal(o.Value) +} + +func (s Sample) String() string { + return fmt.Sprintf("%s => %s", s.Metric, SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }) +} + +// MarshalJSON implements json.Marshaler. +func (s Sample) MarshalJSON() ([]byte, error) { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + return json.Marshal(&v) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Sample) UnmarshalJSON(b []byte) error { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + s.Metric = v.Metric + s.Timestamp = v.Value.Timestamp + s.Value = v.Value.Value + + return nil +} + +// Samples is a sortable Sample slice. It implements sort.Interface. +type Samples []*Sample + +func (s Samples) Len() int { + return len(s) +} + +// Less compares first the metrics, then the timestamp. +func (s Samples) Less(i, j int) bool { + switch { + case s[i].Metric.Before(s[j].Metric): + return true + case s[j].Metric.Before(s[i].Metric): + return false + case s[i].Timestamp.Before(s[j].Timestamp): + return true + default: + return false + } +} + +func (s Samples) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Equal compares two sets of samples and returns true if they are equal. +func (s Samples) Equal(o Samples) bool { + if len(s) != len(o) { + return false + } + + for i, sample := range s { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// SampleStream is a stream of Values belonging to an attached COWMetric. +type SampleStream struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` +} + +func (ss SampleStream) String() string { + vals := make([]string, len(ss.Values)) + for i, v := range ss.Values { + vals[i] = v.String() + } + return fmt.Sprintf("%s =>\n%s", ss.Metric, strings.Join(vals, "\n")) +} + +// Value is a generic interface for values resulting from a query evaluation. +type Value interface { + Type() ValueType + String() string +} + +func (Matrix) Type() ValueType { return ValMatrix } +func (Vector) Type() ValueType { return ValVector } +func (*Scalar) Type() ValueType { return ValScalar } +func (*String) Type() ValueType { return ValString } + +type ValueType int + +const ( + ValNone ValueType = iota + ValScalar + ValVector + ValMatrix + ValString +) + +// MarshalJSON implements json.Marshaler. +func (et ValueType) MarshalJSON() ([]byte, error) { + return json.Marshal(et.String()) +} + +func (et *ValueType) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + switch s { + case "": + *et = ValNone + case "scalar": + *et = ValScalar + case "vector": + *et = ValVector + case "matrix": + *et = ValMatrix + case "string": + *et = ValString + default: + return fmt.Errorf("unknown value type %q", s) + } + return nil +} + +func (e ValueType) String() string { + switch e { + case ValNone: + return "" + case ValScalar: + return "scalar" + case ValVector: + return "vector" + case ValMatrix: + return "matrix" + case ValString: + return "string" + } + panic("ValueType.String: unhandled value type") +} + +// Scalar is a scalar value evaluated at the set timestamp. +type Scalar struct { + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s Scalar) String() string { + return fmt.Sprintf("scalar: %v @[%v]", s.Value, s.Timestamp) +} + +// MarshalJSON implements json.Marshaler. +func (s Scalar) MarshalJSON() ([]byte, error) { + v := strconv.FormatFloat(float64(s.Value), 'f', -1, 64) + return json.Marshal([...]interface{}{s.Timestamp, string(v)}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Scalar) UnmarshalJSON(b []byte) error { + var f string + v := [...]interface{}{&s.Timestamp, &f} + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + value, err := strconv.ParseFloat(f, 64) + if err != nil { + return fmt.Errorf("error parsing sample value: %s", err) + } + s.Value = SampleValue(value) + return nil +} + +// String is a string value evaluated at the set timestamp. +type String struct { + Value string `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s *String) String() string { + return s.Value +} + +// MarshalJSON implements json.Marshaler. +func (s String) MarshalJSON() ([]byte, error) { + return json.Marshal([]interface{}{s.Timestamp, s.Value}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *String) UnmarshalJSON(b []byte) error { + v := [...]interface{}{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Vector is basically only an alias for Samples, but the +// contract is that in a Vector, all Samples have the same timestamp. +type Vector []*Sample + +func (vec Vector) String() string { + entries := make([]string, len(vec)) + for i, s := range vec { + entries[i] = s.String() + } + return strings.Join(entries, "\n") +} + +func (vec Vector) Len() int { return len(vec) } +func (vec Vector) Swap(i, j int) { vec[i], vec[j] = vec[j], vec[i] } + +// Less compares first the metrics, then the timestamp. +func (vec Vector) Less(i, j int) bool { + switch { + case vec[i].Metric.Before(vec[j].Metric): + return true + case vec[j].Metric.Before(vec[i].Metric): + return false + case vec[i].Timestamp.Before(vec[j].Timestamp): + return true + default: + return false + } +} + +// Equal compares two sets of samples and returns true if they are equal. +func (vec Vector) Equal(o Vector) bool { + if len(vec) != len(o) { + return false + } + + for i, sample := range vec { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// Matrix is a list of time series. +type Matrix []*SampleStream + +func (m Matrix) Len() int { return len(m) } +func (m Matrix) Less(i, j int) bool { return m[i].Metric.Before(m[j].Metric) } +func (m Matrix) Swap(i, j int) { m[i], m[j] = m[j], m[i] } + +func (mat Matrix) String() string { + matCp := make(Matrix, len(mat)) + copy(matCp, mat) + sort.Sort(matCp) + + strs := make([]string, len(matCp)) + + for i, ss := range matCp { + strs[i] = ss.String() + } + + return strings.Join(strs, "\n") +} diff --git a/vendor/github.com/prometheus/procfs/.gitignore b/vendor/github.com/prometheus/procfs/.gitignore new file mode 100644 index 00000000..25e3659a --- /dev/null +++ b/vendor/github.com/prometheus/procfs/.gitignore @@ -0,0 +1 @@ +/fixtures/ diff --git a/vendor/github.com/prometheus/procfs/.golangci.yml b/vendor/github.com/prometheus/procfs/.golangci.yml new file mode 100644 index 00000000..7c4ce1fa --- /dev/null +++ b/vendor/github.com/prometheus/procfs/.golangci.yml @@ -0,0 +1,4 @@ +linters: + enable: + - staticcheck + - govet diff --git a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md b/vendor/github.com/prometheus/procfs/CONTRIBUTING.md new file mode 100644 index 00000000..943de761 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/CONTRIBUTING.md @@ -0,0 +1,121 @@ +# Contributing + +Prometheus uses GitHub to manage reviews of pull requests. + +* If you are a new contributor see: [Steps to Contribute](#steps-to-contribute) + +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) a suitable maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. + +* If you plan to do something more involved, first discuss your ideas + on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). + This will avoid unnecessary work and surely give you and us a good deal + of inspiration. Also please see our [non-goals issue](https://github.com/prometheus/docs/issues/149) on areas that the Prometheus community doesn't plan to work on. + +* Relevant coding style guidelines are the [Go Code Review + Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) + and the _Formatting and style_ section of Peter Bourgon's [Go: Best + Practices for Production + Environments](https://peter.bourgon.org/go-in-production/#formatting-and-style). + +* Be sure to sign off on the [DCO](https://github.com/probot/dco#how-it-works) + +## Steps to Contribute + +Should you wish to work on an issue, please claim it first by commenting on the GitHub issue that you want to work on it. This is to prevent duplicated efforts from contributors on the same issue. + +Please check the [`help-wanted`](https://github.com/prometheus/procfs/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) label to find issues that are good for getting started. If you have questions about one of the issues, with or without the tag, please comment on them and one of the maintainers will clarify it. For a quicker response, contact us over [IRC](https://prometheus.io/community). + +For quickly compiling and testing your changes do: +``` +make test # Make sure all the tests pass before you commit and push :) +``` + +We use [`golangci-lint`](https://github.com/golangci/golangci-lint) for linting the code. If it reports an issue and you think that the warning needs to be disregarded or is a false-positive, you can add a special comment `//nolint:linter1[,linter2,...]` before the offending line. Use this sparingly though, fixing the code to comply with the linter's recommendation is in general the preferred course of action. + +## Pull Request Checklist + +* Branch from the master branch and, if needed, rebase to the current master branch before submitting your pull request. If it doesn't merge cleanly with master you may be asked to rebase your changes. + +* Commits should be as small as possible, while ensuring that each commit is correct independently (i.e., each commit should compile and pass tests). + +* If your patch is not getting reviewed or you need a specific person to review it, you can @-reply a reviewer asking for a review in the pull request or a comment, or you can ask for a review on IRC channel [#prometheus](https://webchat.freenode.net/?channels=#prometheus) on irc.freenode.net (for the easiest start, [join via Riot](https://riot.im/app/#/room/#prometheus:matrix.org)). + +* Add tests relevant to the fixed bug or new feature. + +## Dependency management + +The Prometheus project uses [Go modules](https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more) to manage dependencies on external packages. This requires a working Go environment with version 1.12 or greater installed. + +All dependencies are vendored in the `vendor/` directory. + +To add or update a new dependency, use the `go get` command: + +```bash +# Pick the latest tagged release. +go get example.com/some/module/pkg + +# Pick a specific version. +go get example.com/some/module/pkg@vX.Y.Z +``` + +Tidy up the `go.mod` and `go.sum` files and copy the new/updated dependency to the `vendor/` directory: + + +```bash +# The GO111MODULE variable can be omitted when the code isn't located in GOPATH. +GO111MODULE=on go mod tidy + +GO111MODULE=on go mod vendor +``` + +You have to commit the changes to `go.mod`, `go.sum` and the `vendor/` directory before submitting the pull request. + + +## API Implementation Guidelines + +### Naming and Documentation + +Public functions and structs should normally be named according to the file(s) being read and parsed. For example, +the `fs.BuddyInfo()` function reads the file `/proc/buddyinfo`. In addition, the godoc for each public function +should contain the path to the file(s) being read and a URL of the linux kernel documentation describing the file(s). + +### Reading vs. Parsing + +Most functionality in this library consists of reading files and then parsing the text into structured data. In most +cases reading and parsing should be separated into different functions/methods with a public `fs.Thing()` method and +a private `parseThing(r Reader)` function. This provides a logical separation and allows parsing to be tested +directly without the need to read from the filesystem. Using a `Reader` argument is preferred over other data types +such as `string` or `*File` because it provides the most flexibility regarding the data source. When a set of files +in a directory needs to be parsed, then a `path` string parameter to the parse function can be used instead. + +### /proc and /sys filesystem I/O + +The `proc` and `sys` filesystems are pseudo file systems and work a bit differently from standard disk I/O. +Many of the files are changing continuously and the data being read can in some cases change between subsequent +reads in the same file. Also, most of the files are relatively small (less than a few KBs), and system calls +to the `stat` function will often return the wrong size. Therefore, for most files it's recommended to read the +full file in a single operation using an internal utility function called `util.ReadFileNoStat`. +This function is similar to `ioutil.ReadFile`, but it avoids the system call to `stat` to get the current size of +the file. + +Note that parsing the file's contents can still be performed one line at a time. This is done by first reading +the full file, and then using a scanner on the `[]byte` or `string` containing the data. + +``` + data, err := util.ReadFileNoStat("/proc/cpuinfo") + if err != nil { + return err + } + reader := bytes.NewReader(data) + scanner := bufio.NewScanner(reader) +``` + +The `/sys` filesystem contains many very small files which contain only a single numeric or text value. These files +can be read using an internal function called `util.SysReadFile` which is similar to `ioutil.ReadFile` but does +not bother to check the size of the file before reading. +``` + data, err := util.SysReadFile("/sys/class/power_supply/BAT0/capacity") +``` + diff --git a/vendor/github.com/prometheus/procfs/LICENSE b/vendor/github.com/prometheus/procfs/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/prometheus/procfs/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/prometheus/procfs/MAINTAINERS.md b/vendor/github.com/prometheus/procfs/MAINTAINERS.md new file mode 100644 index 00000000..56ba67d3 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/MAINTAINERS.md @@ -0,0 +1,2 @@ +* Johannes 'fish' Ziemke @discordianfish +* Paul Gier @pgier diff --git a/vendor/github.com/prometheus/procfs/Makefile b/vendor/github.com/prometheus/procfs/Makefile new file mode 100644 index 00000000..616a0d25 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/Makefile @@ -0,0 +1,29 @@ +# Copyright 2018 The Prometheus Authors +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +include Makefile.common + +%/.unpacked: %.ttar + @echo ">> extracting fixtures" + ./ttar -C $(dir $*) -x -f $*.ttar + touch $@ + +update_fixtures: + rm -vf fixtures/.unpacked + ./ttar -c -f fixtures.ttar fixtures/ + +.PHONY: build +build: + +.PHONY: test +test: fixtures/.unpacked common-test diff --git a/vendor/github.com/prometheus/procfs/Makefile.common b/vendor/github.com/prometheus/procfs/Makefile.common new file mode 100644 index 00000000..d7aea1b8 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/Makefile.common @@ -0,0 +1,275 @@ +# Copyright 2018 The Prometheus Authors +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# A common Makefile that includes rules to be reused in different prometheus projects. +# !!! Open PRs only against the prometheus/prometheus/Makefile.common repository! + +# Example usage : +# Create the main Makefile in the root project directory. +# include Makefile.common +# customTarget: +# @echo ">> Running customTarget" +# + +# Ensure GOBIN is not set during build so that promu is installed to the correct path +unexport GOBIN + +GO ?= go +GOFMT ?= $(GO)fmt +FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) +GOOPTS ?= +GOHOSTOS ?= $(shell $(GO) env GOHOSTOS) +GOHOSTARCH ?= $(shell $(GO) env GOHOSTARCH) + +GO_VERSION ?= $(shell $(GO) version) +GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) +PRE_GO_111 ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.') + +GOVENDOR := +GO111MODULE := +ifeq (, $(PRE_GO_111)) + ifneq (,$(wildcard go.mod)) + # Enforce Go modules support just in case the directory is inside GOPATH (and for Travis CI). + GO111MODULE := on + + ifneq (,$(wildcard vendor)) + # Always use the local vendor/ directory to satisfy the dependencies. + GOOPTS := $(GOOPTS) -mod=vendor + endif + endif +else + ifneq (,$(wildcard go.mod)) + ifneq (,$(wildcard vendor)) +$(warning This repository requires Go >= 1.11 because of Go modules) +$(warning Some recipes may not work as expected as the current Go runtime is '$(GO_VERSION_NUMBER)') + endif + else + # This repository isn't using Go modules (yet). + GOVENDOR := $(FIRST_GOPATH)/bin/govendor + endif +endif +PROMU := $(FIRST_GOPATH)/bin/promu +pkgs = ./... + +ifeq (arm, $(GOHOSTARCH)) + GOHOSTARM ?= $(shell GOARM= $(GO) env GOARM) + GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)v$(GOHOSTARM) +else + GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH) +endif + +PROMU_VERSION ?= 0.4.0 +PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz + +GOLANGCI_LINT := +GOLANGCI_LINT_OPTS ?= +GOLANGCI_LINT_VERSION ?= v1.16.0 +# golangci-lint only supports linux, darwin and windows platforms on i386/amd64. +# windows isn't included here because of the path separator being different. +ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) + ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386)) + GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint + endif +endif + +PREFIX ?= $(shell pwd) +BIN_DIR ?= $(shell pwd) +DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD)) +DOCKERFILE_PATH ?= ./ +DOCKER_REPO ?= prom + +DOCKER_ARCHS ?= amd64 + +BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS)) +PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS)) +TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS)) + +ifeq ($(GOHOSTARCH),amd64) + ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows)) + # Only supported on amd64 + test-flags := -race + endif +endif + +# This rule is used to forward a target like "build" to "common-build". This +# allows a new "build" target to be defined in a Makefile which includes this +# one and override "common-build" without override warnings. +%: common-% ; + +.PHONY: common-all +common-all: precheck style check_license lint unused build test + +.PHONY: common-style +common-style: + @echo ">> checking code style" + @fmtRes=$$($(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print)); \ + if [ -n "$${fmtRes}" ]; then \ + echo "gofmt checking failed!"; echo "$${fmtRes}"; echo; \ + echo "Please ensure you are using $$($(GO) version) for formatting code."; \ + exit 1; \ + fi + +.PHONY: common-check_license +common-check_license: + @echo ">> checking license header" + @licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \ + awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \ + done); \ + if [ -n "$${licRes}" ]; then \ + echo "license header checking failed:"; echo "$${licRes}"; \ + exit 1; \ + fi + +.PHONY: common-deps +common-deps: + @echo ">> getting dependencies" +ifdef GO111MODULE + GO111MODULE=$(GO111MODULE) $(GO) mod download +else + $(GO) get $(GOOPTS) -t ./... +endif + +.PHONY: common-test-short +common-test-short: + @echo ">> running short tests" + GO111MODULE=$(GO111MODULE) $(GO) test -short $(GOOPTS) $(pkgs) + +.PHONY: common-test +common-test: + @echo ">> running all tests" + GO111MODULE=$(GO111MODULE) $(GO) test $(test-flags) $(GOOPTS) $(pkgs) + +.PHONY: common-format +common-format: + @echo ">> formatting code" + GO111MODULE=$(GO111MODULE) $(GO) fmt $(pkgs) + +.PHONY: common-vet +common-vet: + @echo ">> vetting code" + GO111MODULE=$(GO111MODULE) $(GO) vet $(GOOPTS) $(pkgs) + +.PHONY: common-lint +common-lint: $(GOLANGCI_LINT) +ifdef GOLANGCI_LINT + @echo ">> running golangci-lint" +ifdef GO111MODULE +# 'go list' needs to be executed before staticcheck to prepopulate the modules cache. +# Otherwise staticcheck might fail randomly for some reason not yet explained. + GO111MODULE=$(GO111MODULE) $(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null + GO111MODULE=$(GO111MODULE) $(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs) +else + $(GOLANGCI_LINT) run $(pkgs) +endif +endif + +# For backward-compatibility. +.PHONY: common-staticcheck +common-staticcheck: lint + +.PHONY: common-unused +common-unused: $(GOVENDOR) +ifdef GOVENDOR + @echo ">> running check for unused packages" + @$(GOVENDOR) list +unused | grep . && exit 1 || echo 'No unused packages' +else +ifdef GO111MODULE + @echo ">> running check for unused/missing packages in go.mod" + GO111MODULE=$(GO111MODULE) $(GO) mod tidy +ifeq (,$(wildcard vendor)) + @git diff --exit-code -- go.sum go.mod +else + @echo ">> running check for unused packages in vendor/" + GO111MODULE=$(GO111MODULE) $(GO) mod vendor + @git diff --exit-code -- go.sum go.mod vendor/ +endif +endif +endif + +.PHONY: common-build +common-build: promu + @echo ">> building binaries" + GO111MODULE=$(GO111MODULE) $(PROMU) build --prefix $(PREFIX) + +.PHONY: common-tarball +common-tarball: promu + @echo ">> building release tarball" + $(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR) + +.PHONY: common-docker $(BUILD_DOCKER_ARCHS) +common-docker: $(BUILD_DOCKER_ARCHS) +$(BUILD_DOCKER_ARCHS): common-docker-%: + docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" \ + --build-arg ARCH="$*" \ + --build-arg OS="linux" \ + $(DOCKERFILE_PATH) + +.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS) +common-docker-publish: $(PUBLISH_DOCKER_ARCHS) +$(PUBLISH_DOCKER_ARCHS): common-docker-publish-%: + docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" + +.PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS) +common-docker-tag-latest: $(TAG_DOCKER_ARCHS) +$(TAG_DOCKER_ARCHS): common-docker-tag-latest-%: + docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" + +.PHONY: common-docker-manifest +common-docker-manifest: + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(DOCKER_IMAGE_TAG)) + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" + +.PHONY: promu +promu: $(PROMU) + +$(PROMU): + $(eval PROMU_TMP := $(shell mktemp -d)) + curl -s -L $(PROMU_URL) | tar -xvzf - -C $(PROMU_TMP) + mkdir -p $(FIRST_GOPATH)/bin + cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu + rm -r $(PROMU_TMP) + +.PHONY: proto +proto: + @echo ">> generating code from proto files" + @./scripts/genproto.sh + +ifdef GOLANGCI_LINT +$(GOLANGCI_LINT): + mkdir -p $(FIRST_GOPATH)/bin + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_LINT_VERSION)/install.sh \ + | sed -e '/install -d/d' \ + | sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION) +endif + +ifdef GOVENDOR +.PHONY: $(GOVENDOR) +$(GOVENDOR): + GOOS= GOARCH= $(GO) get -u github.com/kardianos/govendor +endif + +.PHONY: precheck +precheck:: + +define PRECHECK_COMMAND_template = +precheck:: $(1)_precheck + +PRECHECK_COMMAND_$(1) ?= $(1) $$(strip $$(PRECHECK_OPTIONS_$(1))) +.PHONY: $(1)_precheck +$(1)_precheck: + @if ! $$(PRECHECK_COMMAND_$(1)) 1>/dev/null 2>&1; then \ + echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \ + exit 1; \ + fi +endef diff --git a/vendor/github.com/prometheus/procfs/NOTICE b/vendor/github.com/prometheus/procfs/NOTICE new file mode 100644 index 00000000..53c5e9aa --- /dev/null +++ b/vendor/github.com/prometheus/procfs/NOTICE @@ -0,0 +1,7 @@ +procfs provides functions to retrieve system, kernel and process +metrics from the pseudo-filesystem proc. + +Copyright 2014-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/prometheus/procfs/README.md b/vendor/github.com/prometheus/procfs/README.md new file mode 100644 index 00000000..55d1e326 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/README.md @@ -0,0 +1,61 @@ +# procfs + +This package provides functions to retrieve system, kernel, and process +metrics from the pseudo-filesystems /proc and /sys. + +*WARNING*: This package is a work in progress. Its API may still break in +backwards-incompatible ways without warnings. Use it at your own risk. + +[![GoDoc](https://godoc.org/github.com/prometheus/procfs?status.png)](https://godoc.org/github.com/prometheus/procfs) +[![Build Status](https://travis-ci.org/prometheus/procfs.svg?branch=master)](https://travis-ci.org/prometheus/procfs) +[![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/procfs)](https://goreportcard.com/report/github.com/prometheus/procfs) + +## Usage + +The procfs library is organized by packages based on whether the gathered data is coming from +/proc, /sys, or both. Each package contains an `FS` type which represents the path to either /proc, +/sys, or both. For example, cpu statistics are gathered from +`/proc/stat` and are available via the root procfs package. First, the proc filesystem mount +point is initialized, and then the stat information is read. + +```go +fs, err := procfs.NewFS("/proc") +stats, err := fs.Stat() +``` + +Some sub-packages such as `blockdevice`, require access to both the proc and sys filesystems. + +```go + fs, err := blockdevice.NewFS("/proc", "/sys") + stats, err := fs.ProcDiskstats() +``` + +## Package Organization + +The packages in this project are organized according to (1) whether the data comes from the `/proc` or +`/sys` filesystem and (2) the type of information being retrieved. For example, most process information +can be gathered from the functions in the root `procfs` package. Information about block devices such as disk drives +is available in the `blockdevices` sub-package. + +## Building and Testing + +The procfs library is intended to be built as part of another application, so there are no distributable binaries. +However, most of the API includes unit tests which can be run with `make test`. + +### Updating Test Fixtures + +The procfs library includes a set of test fixtures which include many example files from +the `/proc` and `/sys` filesystems. These fixtures are included as a [ttar](https://github.com/ideaship/ttar) file +which is extracted automatically during testing. To add/update the test fixtures, first +ensure the `fixtures` directory is up to date by removing the existing directory and then +extracting the ttar file using `make fixtures/.unpacked` or just `make test`. + +```bash +rm -rf fixtures +make test +``` + +Next, make the required changes to the extracted files in the `fixtures` directory. When +the changes are complete, run `make update_fixtures` to create a new `fixtures.ttar` file +based on the updated `fixtures` directory. And finally, verify the changes using +`git diff fixtures.ttar`. diff --git a/vendor/github.com/prometheus/procfs/arp.go b/vendor/github.com/prometheus/procfs/arp.go new file mode 100644 index 00000000..916c9182 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/arp.go @@ -0,0 +1,85 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "io/ioutil" + "net" + "strings" +) + +// ARPEntry contains a single row of the columnar data represented in +// /proc/net/arp. +type ARPEntry struct { + // IP address + IPAddr net.IP + // MAC address + HWAddr net.HardwareAddr + // Name of the device + Device string +} + +// GatherARPEntries retrieves all the ARP entries, parse the relevant columns, +// and then return a slice of ARPEntry's. +func (fs FS) GatherARPEntries() ([]ARPEntry, error) { + data, err := ioutil.ReadFile(fs.proc.Path("net/arp")) + if err != nil { + return nil, fmt.Errorf("error reading arp %s: %s", fs.proc.Path("net/arp"), err) + } + + return parseARPEntries(data) +} + +func parseARPEntries(data []byte) ([]ARPEntry, error) { + lines := strings.Split(string(data), "\n") + entries := make([]ARPEntry, 0) + var err error + const ( + expectedDataWidth = 6 + expectedHeaderWidth = 9 + ) + for _, line := range lines { + columns := strings.Fields(line) + width := len(columns) + + if width == expectedHeaderWidth || width == 0 { + continue + } else if width == expectedDataWidth { + entry, err := parseARPEntry(columns) + if err != nil { + return []ARPEntry{}, fmt.Errorf("failed to parse ARP entry: %s", err) + } + entries = append(entries, entry) + } else { + return []ARPEntry{}, fmt.Errorf("%d columns were detected, but %d were expected", width, expectedDataWidth) + } + + } + + return entries, err +} + +func parseARPEntry(columns []string) (ARPEntry, error) { + ip := net.ParseIP(columns[0]) + mac := net.HardwareAddr(columns[3]) + + entry := ARPEntry{ + IPAddr: ip, + HWAddr: mac, + Device: columns[5], + } + + return entry, nil +} diff --git a/vendor/github.com/prometheus/procfs/buddyinfo.go b/vendor/github.com/prometheus/procfs/buddyinfo.go new file mode 100644 index 00000000..10bd067a --- /dev/null +++ b/vendor/github.com/prometheus/procfs/buddyinfo.go @@ -0,0 +1,85 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// A BuddyInfo is the details parsed from /proc/buddyinfo. +// The data is comprised of an array of free fragments of each size. +// The sizes are 2^n*PAGE_SIZE, where n is the array index. +type BuddyInfo struct { + Node string + Zone string + Sizes []float64 +} + +// BuddyInfo reads the buddyinfo statistics from the specified `proc` filesystem. +func (fs FS) BuddyInfo() ([]BuddyInfo, error) { + file, err := os.Open(fs.proc.Path("buddyinfo")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseBuddyInfo(file) +} + +func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { + var ( + buddyInfo = []BuddyInfo{} + scanner = bufio.NewScanner(r) + bucketCount = -1 + ) + + for scanner.Scan() { + var err error + line := scanner.Text() + parts := strings.Fields(line) + + if len(parts) < 4 { + return nil, fmt.Errorf("invalid number of fields when parsing buddyinfo") + } + + node := strings.TrimRight(parts[1], ",") + zone := strings.TrimRight(parts[3], ",") + arraySize := len(parts[4:]) + + if bucketCount == -1 { + bucketCount = arraySize + } else { + if bucketCount != arraySize { + return nil, fmt.Errorf("mismatch in number of buddyinfo buckets, previous count %d, new count %d", bucketCount, arraySize) + } + } + + sizes := make([]float64, arraySize) + for i := 0; i < arraySize; i++ { + sizes[i], err = strconv.ParseFloat(parts[i+4], 64) + if err != nil { + return nil, fmt.Errorf("invalid value in buddyinfo: %s", err) + } + } + + buddyInfo = append(buddyInfo, BuddyInfo{node, zone, sizes}) + } + + return buddyInfo, scanner.Err() +} diff --git a/vendor/github.com/prometheus/procfs/cpuinfo.go b/vendor/github.com/prometheus/procfs/cpuinfo.go new file mode 100644 index 00000000..2e022155 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/cpuinfo.go @@ -0,0 +1,167 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// CPUInfo contains general information about a system CPU found in /proc/cpuinfo +type CPUInfo struct { + Processor uint + VendorID string + CPUFamily string + Model string + ModelName string + Stepping string + Microcode string + CPUMHz float64 + CacheSize string + PhysicalID string + Siblings uint + CoreID string + CPUCores uint + APICID string + InitialAPICID string + FPU string + FPUException string + CPUIDLevel uint + WP string + Flags []string + Bugs []string + BogoMips float64 + CLFlushSize uint + CacheAlignment uint + AddressSizes string + PowerManagement string +} + +// CPUInfo returns information about current system CPUs. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +func (fs FS) CPUInfo() ([]CPUInfo, error) { + data, err := util.ReadFileNoStat(fs.proc.Path("cpuinfo")) + if err != nil { + return nil, err + } + return parseCPUInfo(data) +} + +// parseCPUInfo parses data from /proc/cpuinfo +func parseCPUInfo(info []byte) ([]CPUInfo, error) { + cpuinfo := []CPUInfo{} + i := -1 + scanner := bufio.NewScanner(bytes.NewReader(info)) + for scanner.Scan() { + line := scanner.Text() + if strings.TrimSpace(line) == "" { + continue + } + field := strings.SplitN(line, ": ", 2) + switch strings.TrimSpace(field[0]) { + case "processor": + cpuinfo = append(cpuinfo, CPUInfo{}) // start of the next processor + i++ + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].Processor = uint(v) + case "vendor_id": + cpuinfo[i].VendorID = field[1] + case "cpu family": + cpuinfo[i].CPUFamily = field[1] + case "model": + cpuinfo[i].Model = field[1] + case "model name": + cpuinfo[i].ModelName = field[1] + case "stepping": + cpuinfo[i].Stepping = field[1] + case "microcode": + cpuinfo[i].Microcode = field[1] + case "cpu MHz": + v, err := strconv.ParseFloat(field[1], 64) + if err != nil { + return nil, err + } + cpuinfo[i].CPUMHz = v + case "cache size": + cpuinfo[i].CacheSize = field[1] + case "physical id": + cpuinfo[i].PhysicalID = field[1] + case "siblings": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].Siblings = uint(v) + case "core id": + cpuinfo[i].CoreID = field[1] + case "cpu cores": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].CPUCores = uint(v) + case "apicid": + cpuinfo[i].APICID = field[1] + case "initial apicid": + cpuinfo[i].InitialAPICID = field[1] + case "fpu": + cpuinfo[i].FPU = field[1] + case "fpu_exception": + cpuinfo[i].FPUException = field[1] + case "cpuid level": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].CPUIDLevel = uint(v) + case "wp": + cpuinfo[i].WP = field[1] + case "flags": + cpuinfo[i].Flags = strings.Fields(field[1]) + case "bugs": + cpuinfo[i].Bugs = strings.Fields(field[1]) + case "bogomips": + v, err := strconv.ParseFloat(field[1], 64) + if err != nil { + return nil, err + } + cpuinfo[i].BogoMips = v + case "clflush size": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].CLFlushSize = uint(v) + case "cache_alignment": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].CacheAlignment = uint(v) + case "address sizes": + cpuinfo[i].AddressSizes = field[1] + case "power management": + cpuinfo[i].PowerManagement = field[1] + } + } + return cpuinfo, nil + +} diff --git a/vendor/github.com/prometheus/procfs/crypto.go b/vendor/github.com/prometheus/procfs/crypto.go new file mode 100644 index 00000000..19d4041b --- /dev/null +++ b/vendor/github.com/prometheus/procfs/crypto.go @@ -0,0 +1,131 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Crypto holds info parsed from /proc/crypto. +type Crypto struct { + Alignmask *uint64 + Async bool + Blocksize *uint64 + Chunksize *uint64 + Ctxsize *uint64 + Digestsize *uint64 + Driver string + Geniv string + Internal string + Ivsize *uint64 + Maxauthsize *uint64 + MaxKeysize *uint64 + MinKeysize *uint64 + Module string + Name string + Priority *int64 + Refcnt *int64 + Seedsize *uint64 + Selftest string + Type string + Walksize *uint64 +} + +// Crypto parses an crypto-file (/proc/crypto) and returns a slice of +// structs containing the relevant info. More information available here: +// https://kernel.readthedocs.io/en/sphinx-samples/crypto-API.html +func (fs FS) Crypto() ([]Crypto, error) { + data, err := ioutil.ReadFile(fs.proc.Path("crypto")) + if err != nil { + return nil, fmt.Errorf("error parsing crypto %s: %s", fs.proc.Path("crypto"), err) + } + crypto, err := parseCrypto(data) + if err != nil { + return nil, fmt.Errorf("error parsing crypto %s: %s", fs.proc.Path("crypto"), err) + } + return crypto, nil +} + +func parseCrypto(cryptoData []byte) ([]Crypto, error) { + crypto := []Crypto{} + + cryptoBlocks := bytes.Split(cryptoData, []byte("\n\n")) + + for _, block := range cryptoBlocks { + var newCryptoElem Crypto + + lines := strings.Split(string(block), "\n") + for _, line := range lines { + if strings.TrimSpace(line) == "" || line[0] == ' ' { + continue + } + fields := strings.Split(line, ":") + key := strings.TrimSpace(fields[0]) + value := strings.TrimSpace(fields[1]) + vp := util.NewValueParser(value) + + switch strings.TrimSpace(key) { + case "async": + b, err := strconv.ParseBool(value) + if err == nil { + newCryptoElem.Async = b + } + case "blocksize": + newCryptoElem.Blocksize = vp.PUInt64() + case "chunksize": + newCryptoElem.Chunksize = vp.PUInt64() + case "digestsize": + newCryptoElem.Digestsize = vp.PUInt64() + case "driver": + newCryptoElem.Driver = value + case "geniv": + newCryptoElem.Geniv = value + case "internal": + newCryptoElem.Internal = value + case "ivsize": + newCryptoElem.Ivsize = vp.PUInt64() + case "maxauthsize": + newCryptoElem.Maxauthsize = vp.PUInt64() + case "max keysize": + newCryptoElem.MaxKeysize = vp.PUInt64() + case "min keysize": + newCryptoElem.MinKeysize = vp.PUInt64() + case "module": + newCryptoElem.Module = value + case "name": + newCryptoElem.Name = value + case "priority": + newCryptoElem.Priority = vp.PInt64() + case "refcnt": + newCryptoElem.Refcnt = vp.PInt64() + case "seedsize": + newCryptoElem.Seedsize = vp.PUInt64() + case "selftest": + newCryptoElem.Selftest = value + case "type": + newCryptoElem.Type = value + case "walksize": + newCryptoElem.Walksize = vp.PUInt64() + } + } + crypto = append(crypto, newCryptoElem) + } + return crypto, nil +} diff --git a/vendor/github.com/prometheus/procfs/doc.go b/vendor/github.com/prometheus/procfs/doc.go new file mode 100644 index 00000000..e2acd6d4 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/doc.go @@ -0,0 +1,45 @@ +// Copyright 2014 Prometheus Team +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package procfs provides functions to retrieve system, kernel and process +// metrics from the pseudo-filesystem proc. +// +// Example: +// +// package main +// +// import ( +// "fmt" +// "log" +// +// "github.com/prometheus/procfs" +// ) +// +// func main() { +// p, err := procfs.Self() +// if err != nil { +// log.Fatalf("could not get process: %s", err) +// } +// +// stat, err := p.NewStat() +// if err != nil { +// log.Fatalf("could not get process stat: %s", err) +// } +// +// fmt.Printf("command: %s\n", stat.Comm) +// fmt.Printf("cpu time: %fs\n", stat.CPUTime()) +// fmt.Printf("vsize: %dB\n", stat.VirtualMemory()) +// fmt.Printf("rss: %dB\n", stat.ResidentMemory()) +// } +// +package procfs diff --git a/vendor/github.com/prometheus/procfs/fixtures.ttar b/vendor/github.com/prometheus/procfs/fixtures.ttar new file mode 100644 index 00000000..c50a18ac --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures.ttar @@ -0,0 +1,5318 @@ +# Archive created by ttar -c -f fixtures.ttar fixtures/ +Directory: fixtures +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26231 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/cmdline +Lines: 1 +vimNULLBYTEtest.goNULLBYTE+10NULLBYTEEOF +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/comm +Lines: 1 +vim +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/cwd +SymlinkTo: /usr/bin +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/environ +Lines: 1 +PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binNULLBYTEHOSTNAME=cd24e11f73a5NULLBYTETERM=xtermNULLBYTEGOLANG_VERSION=1.12.5NULLBYTEGOPATH=/goNULLBYTEHOME=/rootNULLBYTEEOF +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/exe +SymlinkTo: /usr/bin/vim +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26231/fd +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fd/0 +SymlinkTo: ../../symlinktargets/abc +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fd/1 +SymlinkTo: ../../symlinktargets/def +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fd/10 +SymlinkTo: ../../symlinktargets/xyz +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fd/2 +SymlinkTo: ../../symlinktargets/ghi +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fd/3 +SymlinkTo: ../../symlinktargets/uvw +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26231/fdinfo +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fdinfo/0 +Lines: 6 +pos: 0 +flags: 02004000 +mnt_id: 13 +inotify wd:3 ino:1 sdev:34 mask:fce ignored_mask:0 fhandle-bytes:c fhandle-type:81 f_handle:000000000100000000000000 +inotify wd:2 ino:1300016 sdev:fd00002 mask:fce ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:16003001ed3f022a +inotify wd:1 ino:2e0001 sdev:fd00000 mask:fce ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01002e00138e7c65 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fdinfo/1 +Lines: 4 +pos: 0 +flags: 02004002 +mnt_id: 13 +eventfd-count: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fdinfo/10 +Lines: 3 +pos: 0 +flags: 02004002 +mnt_id: 9 +Mode: 400 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fdinfo/2 +Lines: 3 +pos: 0 +flags: 02004002 +mnt_id: 9 +Mode: 400 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/fdinfo/3 +Lines: 3 +pos: 0 +flags: 02004002 +mnt_id: 9 +Mode: 400 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/io +Lines: 7 +rchar: 750339 +wchar: 818609 +syscr: 7405 +syscw: 5245 +read_bytes: 1024 +write_bytes: 2048 +cancelled_write_bytes: -1024 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/limits +Lines: 17 +Limit Soft Limit Hard Limit Units +Max cpu time unlimited unlimited seconds +Max file size unlimited unlimited bytes +Max data size unlimited unlimited bytes +Max stack size 8388608 unlimited bytes +Max core file size 0 unlimited bytes +Max resident set unlimited unlimited bytes +Max processes 62898 62898 processes +Max open files 2048 4096 files +Max locked memory 65536 65536 bytes +Max address space 8589934592 unlimited bytes +Max file locks unlimited unlimited locks +Max pending signals 62898 62898 signals +Max msgqueue size 819200 819200 bytes +Max nice priority 0 0 +Max realtime priority 0 0 +Max realtime timeout unlimited unlimited us +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/mountstats +Lines: 20 +device rootfs mounted on / with fstype rootfs +device sysfs mounted on /sys with fstype sysfs +device proc mounted on /proc with fstype proc +device /dev/sda1 mounted on / with fstype ext4 +device 192.168.1.1:/srv/test mounted on /mnt/nfs/test with fstype nfs4 statvers=1.1 + opts: rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.1,clientaddr=192.168.1.5,local_lock=none + age: 13968 + caps: caps=0xfff7,wtmult=512,dtsize=32768,bsize=0,namlen=255 + nfsv4: bm0=0xfdffafff,bm1=0xf9be3e,bm2=0x0,acl=0x0,pnfs=not configured + sec: flavor=1,pseudoflavor=1 + events: 52 226 0 0 1 13 398 0 0 331 0 47 0 0 77 0 0 77 0 0 0 0 0 0 0 0 0 + bytes: 1207640230 0 0 0 1210214218 0 295483 0 + RPC iostats version: 1.0 p/v: 100003/4 (nfs) + xprt: tcp 832 0 1 0 11 6428 6428 0 12154 0 24 26 5726 + per-op statistics + NULL: 0 0 0 0 0 0 0 0 + READ: 1298 1298 0 207680 1210292152 6 79386 79407 + WRITE: 0 0 0 0 0 0 0 0 + ACCESS: 2927395007 2927394995 0 526931094212 362996810236 18446743919241604546 1667369447 1953587717 + +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26231/net +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/net/dev +Lines: 4 +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eth0: 438 5 0 0 0 0 0 0 648 8 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26231/ns +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/ns/mnt +SymlinkTo: mnt:[4026531840] +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/ns/net +SymlinkTo: net:[4026531993] +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/root +SymlinkTo: / +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/schedstat +Lines: 1 +411605849 93680043 79 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/stat +Lines: 1 +26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/status +Lines: 53 + +Name: prometheus +Umask: 0022 +State: S (sleeping) +Tgid: 26231 +Ngid: 0 +Pid: 26231 +PPid: 1 +TracerPid: 0 +Uid: 0 0 0 0 +Gid: 0 0 0 0 +FDSize: 128 +Groups: +NStgid: 1 +NSpid: 1 +NSpgid: 1 +NSsid: 1 +VmPeak: 58472 kB +VmSize: 58440 kB +VmLck: 0 kB +VmPin: 0 kB +VmHWM: 8028 kB +VmRSS: 6716 kB +RssAnon: 2092 kB +RssFile: 4624 kB +RssShmem: 0 kB +VmData: 2580 kB +VmStk: 136 kB +VmExe: 948 kB +VmLib: 6816 kB +VmPTE: 128 kB +VmPMD: 12 kB +VmSwap: 660 kB +HugetlbPages: 0 kB +Threads: 1 +SigQ: 8/63965 +SigPnd: 0000000000000000 +ShdPnd: 0000000000000000 +SigBlk: 7be3c0fe28014a03 +SigIgn: 0000000000001000 +SigCgt: 00000001800004ec +CapInh: 0000000000000000 +CapPrm: 0000003fffffffff +CapEff: 0000003fffffffff +CapBnd: 0000003fffffffff +CapAmb: 0000000000000000 +Seccomp: 0 +Cpus_allowed: ff +Cpus_allowed_list: 0-7 +Mems_allowed: 00000000,00000001 +Mems_allowed_list: 0 +voluntary_ctxt_switches: 4742839 +nonvoluntary_ctxt_switches: 1727500 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26232 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/cmdline +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/comm +Lines: 1 +ata_sff +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/cwd +SymlinkTo: /does/not/exist +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26232/fd +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/fd/0 +SymlinkTo: ../../symlinktargets/abc +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/fd/1 +SymlinkTo: ../../symlinktargets/def +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/fd/2 +SymlinkTo: ../../symlinktargets/ghi +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/fd/3 +SymlinkTo: ../../symlinktargets/uvw +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/fd/4 +SymlinkTo: ../../symlinktargets/xyz +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/limits +Lines: 17 +Limit Soft Limit Hard Limit Units +Max cpu time unlimited unlimited seconds +Max file size unlimited unlimited bytes +Max data size unlimited unlimited bytes +Max stack size 8388608 unlimited bytes +Max core file size 0 unlimited bytes +Max resident set unlimited unlimited bytes +Max processes 29436 29436 processes +Max open files 1024 4096 files +Max locked memory 65536 65536 bytes +Max address space unlimited unlimited bytes +Max file locks unlimited unlimited locks +Max pending signals 29436 29436 signals +Max msgqueue size 819200 819200 bytes +Max nice priority 0 0 +Max realtime priority 0 0 +Max realtime timeout unlimited unlimited us +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/root +SymlinkTo: /does/not/exist +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26232/stat +Lines: 1 +33 (ata_sff) S 2 0 0 0 -1 69238880 0 0 0 0 0 0 0 0 0 -20 1 0 5 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26233 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26233/cmdline +Lines: 1 +com.github.uiautomatorNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26233/schedstat +Lines: 8 + ____________________________________ +< this is a malformed schedstat file > + ------------------------------------ + \ ^__^ + \ (oo)\_______ + (__)\ )\/\ + ||----w | + || || +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/584 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/584/stat +Lines: 2 +1020 ((a b ) ( c d) ) R 28378 1020 28378 34842 1020 4218880 286 0 0 0 0 0 0 0 20 0 1 0 10839175 10395648 155 18446744073709551615 4194304 4238788 140736466511168 140736466511168 140609271124624 0 0 0 0 0 0 0 17 5 0 0 0 0 0 6336016 6337300 25579520 140736466515030 140736466515061 140736466515061 140736466518002 0 +#!/bin/cat /proc/self/stat +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/buddyinfo +Lines: 3 +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/cpuinfo +Lines: 216 +processor : 0 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 799.998 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 0 +cpu cores : 4 +apicid : 0 +initial apicid : 0 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 1 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.037 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 1 +cpu cores : 4 +apicid : 2 +initial apicid : 2 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 2 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.010 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 2 +cpu cores : 4 +apicid : 4 +initial apicid : 4 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 3 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.028 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 3 +cpu cores : 4 +apicid : 6 +initial apicid : 6 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 4 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 799.989 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 0 +cpu cores : 4 +apicid : 1 +initial apicid : 1 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 5 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.083 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 1 +cpu cores : 4 +apicid : 3 +initial apicid : 3 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 6 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.017 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 2 +cpu cores : 4 +apicid : 5 +initial apicid : 5 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +processor : 7 +vendor_id : GenuineIntel +cpu family : 6 +model : 142 +model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz +stepping : 10 +microcode : 0xb4 +cpu MHz : 800.030 +cache size : 8192 KB +physical id : 0 +siblings : 8 +core id : 3 +cpu cores : 4 +apicid : 7 +initial apicid : 7 +fpu : yes +fpu_exception : yes +cpuid level : 22 +wp : yes +flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d +bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs +bogomips : 4224.00 +clflush size : 64 +cache_alignment : 64 +address sizes : 39 bits physical, 48 bits virtual +power management: + +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/crypto +Lines: 971 +name : ccm(aes) +driver : ccm_base(ctr(aes-aesni),cbcmac(aes-aesni)) +module : ccm +priority : 300 +refcnt : 4 +selftest : passed +internal : no +type : aead +async : no +blocksize : 1 +ivsize : 16 +maxauthsize : 16 +geniv : + +name : cbcmac(aes) +driver : cbcmac(aes-aesni) +module : ccm +priority : 300 +refcnt : 7 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 16 + +name : ecdh +driver : ecdh-generic +module : ecdh_generic +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : kpp + +name : ecb(arc4) +driver : ecb(arc4)-generic +module : arc4 +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : no +blocksize : 1 +min keysize : 1 +max keysize : 256 +ivsize : 0 +chunksize : 1 +walksize : 1 + +name : arc4 +driver : arc4-generic +module : arc4 +priority : 0 +refcnt : 3 +selftest : passed +internal : no +type : cipher +blocksize : 1 +min keysize : 1 +max keysize : 256 + +name : crct10dif +driver : crct10dif-pclmul +module : crct10dif_pclmul +priority : 200 +refcnt : 2 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 2 + +name : crc32 +driver : crc32-pclmul +module : crc32_pclmul +priority : 200 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 4 + +name : __ghash +driver : cryptd(__ghash-pclmulqdqni) +module : kernel +priority : 50 +refcnt : 1 +selftest : passed +internal : yes +type : ahash +async : yes +blocksize : 16 +digestsize : 16 + +name : ghash +driver : ghash-clmulni +module : ghash_clmulni_intel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : ahash +async : yes +blocksize : 16 +digestsize : 16 + +name : __ghash +driver : __ghash-pclmulqdqni +module : ghash_clmulni_intel +priority : 0 +refcnt : 1 +selftest : passed +internal : yes +type : shash +blocksize : 16 +digestsize : 16 + +name : crc32c +driver : crc32c-intel +module : crc32c_intel +priority : 200 +refcnt : 5 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 4 + +name : cbc(aes) +driver : cbc(aes-aesni) +module : kernel +priority : 300 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : no +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : ctr(aes) +driver : ctr(aes-aesni) +module : kernel +priority : 300 +refcnt : 5 +selftest : passed +internal : no +type : skcipher +async : no +blocksize : 1 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : pkcs1pad(rsa,sha256) +driver : pkcs1pad(rsa-generic,sha256) +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : akcipher + +name : __xts(aes) +driver : cryptd(__xts-aes-aesni) +module : kernel +priority : 451 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : yes +blocksize : 16 +min keysize : 32 +max keysize : 64 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : xts(aes) +driver : xts-aes-aesni +module : kernel +priority : 401 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : yes +blocksize : 16 +min keysize : 32 +max keysize : 64 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __ctr(aes) +driver : cryptd(__ctr-aes-aesni) +module : kernel +priority : 450 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : yes +blocksize : 1 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : ctr(aes) +driver : ctr-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : yes +blocksize : 1 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __cbc(aes) +driver : cryptd(__cbc-aes-aesni) +module : kernel +priority : 450 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : yes +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : cbc(aes) +driver : cbc-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : yes +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __ecb(aes) +driver : cryptd(__ecb-aes-aesni) +module : kernel +priority : 450 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : yes +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 0 +chunksize : 16 +walksize : 16 + +name : ecb(aes) +driver : ecb-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : yes +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 0 +chunksize : 16 +walksize : 16 + +name : __generic-gcm-aes-aesni +driver : cryptd(__driver-generic-gcm-aes-aesni) +module : kernel +priority : 50 +refcnt : 1 +selftest : passed +internal : yes +type : aead +async : yes +blocksize : 1 +ivsize : 12 +maxauthsize : 16 +geniv : + +name : gcm(aes) +driver : generic-gcm-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : aead +async : yes +blocksize : 1 +ivsize : 12 +maxauthsize : 16 +geniv : + +name : __generic-gcm-aes-aesni +driver : __driver-generic-gcm-aes-aesni +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : yes +type : aead +async : no +blocksize : 1 +ivsize : 12 +maxauthsize : 16 +geniv : + +name : __gcm-aes-aesni +driver : cryptd(__driver-gcm-aes-aesni) +module : kernel +priority : 50 +refcnt : 1 +selftest : passed +internal : yes +type : aead +async : yes +blocksize : 1 +ivsize : 8 +maxauthsize : 16 +geniv : + +name : rfc4106(gcm(aes)) +driver : rfc4106-gcm-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : no +type : aead +async : yes +blocksize : 1 +ivsize : 8 +maxauthsize : 16 +geniv : + +name : __gcm-aes-aesni +driver : __driver-gcm-aes-aesni +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : yes +type : aead +async : no +blocksize : 1 +ivsize : 8 +maxauthsize : 16 +geniv : + +name : __xts(aes) +driver : __xts-aes-aesni +module : kernel +priority : 401 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : no +blocksize : 16 +min keysize : 32 +max keysize : 64 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __ctr(aes) +driver : __ctr-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : no +blocksize : 1 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __cbc(aes) +driver : __cbc-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : no +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 16 +chunksize : 16 +walksize : 16 + +name : __ecb(aes) +driver : __ecb-aes-aesni +module : kernel +priority : 400 +refcnt : 1 +selftest : passed +internal : yes +type : skcipher +async : no +blocksize : 16 +min keysize : 16 +max keysize : 32 +ivsize : 0 +chunksize : 16 +walksize : 16 + +name : __aes +driver : __aes-aesni +module : kernel +priority : 300 +refcnt : 1 +selftest : passed +internal : yes +type : cipher +blocksize : 16 +min keysize : 16 +max keysize : 32 + +name : aes +driver : aes-aesni +module : kernel +priority : 300 +refcnt : 8 +selftest : passed +internal : no +type : cipher +blocksize : 16 +min keysize : 16 +max keysize : 32 + +name : hmac(sha1) +driver : hmac(sha1-generic) +module : kernel +priority : 100 +refcnt : 9 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 20 + +name : ghash +driver : ghash-generic +module : kernel +priority : 100 +refcnt : 3 +selftest : passed +internal : no +type : shash +blocksize : 16 +digestsize : 16 + +name : jitterentropy_rng +driver : jitterentropy_rng +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_hmac_sha256 +module : kernel +priority : 221 +refcnt : 2 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_hmac_sha512 +module : kernel +priority : 220 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_hmac_sha384 +module : kernel +priority : 219 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_hmac_sha1 +module : kernel +priority : 218 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_sha256 +module : kernel +priority : 217 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_sha512 +module : kernel +priority : 216 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_sha384 +module : kernel +priority : 215 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_sha1 +module : kernel +priority : 214 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_ctr_aes256 +module : kernel +priority : 213 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_ctr_aes192 +module : kernel +priority : 212 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_nopr_ctr_aes128 +module : kernel +priority : 211 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : hmac(sha256) +driver : hmac(sha256-generic) +module : kernel +priority : 100 +refcnt : 10 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 32 + +name : stdrng +driver : drbg_pr_hmac_sha256 +module : kernel +priority : 210 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_hmac_sha512 +module : kernel +priority : 209 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_hmac_sha384 +module : kernel +priority : 208 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_hmac_sha1 +module : kernel +priority : 207 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_sha256 +module : kernel +priority : 206 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_sha512 +module : kernel +priority : 205 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_sha384 +module : kernel +priority : 204 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_sha1 +module : kernel +priority : 203 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_ctr_aes256 +module : kernel +priority : 202 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_ctr_aes192 +module : kernel +priority : 201 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : stdrng +driver : drbg_pr_ctr_aes128 +module : kernel +priority : 200 +refcnt : 1 +selftest : passed +internal : no +type : rng +seedsize : 0 + +name : 842 +driver : 842-scomp +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : scomp + +name : 842 +driver : 842-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : compression + +name : lzo-rle +driver : lzo-rle-scomp +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : scomp + +name : lzo-rle +driver : lzo-rle-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : compression + +name : lzo +driver : lzo-scomp +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : scomp + +name : lzo +driver : lzo-generic +module : kernel +priority : 0 +refcnt : 9 +selftest : passed +internal : no +type : compression + +name : crct10dif +driver : crct10dif-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 2 + +name : crc32c +driver : crc32c-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 4 + +name : zlib-deflate +driver : zlib-deflate-scomp +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : scomp + +name : deflate +driver : deflate-scomp +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : scomp + +name : deflate +driver : deflate-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : compression + +name : aes +driver : aes-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : cipher +blocksize : 16 +min keysize : 16 +max keysize : 32 + +name : sha224 +driver : sha224-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 28 + +name : sha256 +driver : sha256-generic +module : kernel +priority : 100 +refcnt : 11 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 32 + +name : sha1 +driver : sha1-generic +module : kernel +priority : 100 +refcnt : 11 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 20 + +name : md5 +driver : md5-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 64 +digestsize : 16 + +name : ecb(cipher_null) +driver : ecb-cipher_null +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : skcipher +async : no +blocksize : 1 +min keysize : 0 +max keysize : 0 +ivsize : 0 +chunksize : 1 +walksize : 1 + +name : digest_null +driver : digest_null-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : shash +blocksize : 1 +digestsize : 0 + +name : compress_null +driver : compress_null-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : compression + +name : cipher_null +driver : cipher_null-generic +module : kernel +priority : 0 +refcnt : 1 +selftest : passed +internal : no +type : cipher +blocksize : 1 +min keysize : 0 +max keysize : 0 + +name : rsa +driver : rsa-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : akcipher + +name : dh +driver : dh-generic +module : kernel +priority : 100 +refcnt : 1 +selftest : passed +internal : no +type : kpp + +name : aes +driver : aes-asm +module : kernel +priority : 200 +refcnt : 1 +selftest : passed +internal : no +type : cipher +blocksize : 16 +min keysize : 16 +max keysize : 32 + +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/diskstats +Lines: 49 + 1 0 ram0 0 0 0 0 0 0 0 0 0 0 0 + 1 1 ram1 0 0 0 0 0 0 0 0 0 0 0 + 1 2 ram2 0 0 0 0 0 0 0 0 0 0 0 + 1 3 ram3 0 0 0 0 0 0 0 0 0 0 0 + 1 4 ram4 0 0 0 0 0 0 0 0 0 0 0 + 1 5 ram5 0 0 0 0 0 0 0 0 0 0 0 + 1 6 ram6 0 0 0 0 0 0 0 0 0 0 0 + 1 7 ram7 0 0 0 0 0 0 0 0 0 0 0 + 1 8 ram8 0 0 0 0 0 0 0 0 0 0 0 + 1 9 ram9 0 0 0 0 0 0 0 0 0 0 0 + 1 10 ram10 0 0 0 0 0 0 0 0 0 0 0 + 1 11 ram11 0 0 0 0 0 0 0 0 0 0 0 + 1 12 ram12 0 0 0 0 0 0 0 0 0 0 0 + 1 13 ram13 0 0 0 0 0 0 0 0 0 0 0 + 1 14 ram14 0 0 0 0 0 0 0 0 0 0 0 + 1 15 ram15 0 0 0 0 0 0 0 0 0 0 0 + 7 0 loop0 0 0 0 0 0 0 0 0 0 0 0 + 7 1 loop1 0 0 0 0 0 0 0 0 0 0 0 + 7 2 loop2 0 0 0 0 0 0 0 0 0 0 0 + 7 3 loop3 0 0 0 0 0 0 0 0 0 0 0 + 7 4 loop4 0 0 0 0 0 0 0 0 0 0 0 + 7 5 loop5 0 0 0 0 0 0 0 0 0 0 0 + 7 6 loop6 0 0 0 0 0 0 0 0 0 0 0 + 7 7 loop7 0 0 0 0 0 0 0 0 0 0 0 + 8 0 sda 25354637 34367663 1003346126 18492372 28444756 11134226 505697032 63877960 0 9653880 82621804 + 8 1 sda1 250 0 2000 36 0 0 0 0 0 36 36 + 8 2 sda2 246 0 1968 32 0 0 0 0 0 32 32 + 8 3 sda3 340 13 2818 52 11 8 152 8 0 56 60 + 8 4 sda4 25353629 34367650 1003337964 18492232 27448755 11134218 505696880 61593380 0 7576432 80332428 + 252 0 dm-0 59910002 0 1003337218 46229572 39231014 0 505696880 1158557800 0 11325968 1206301256 + 252 1 dm-1 388 0 3104 84 74 0 592 0 0 76 84 + 252 2 dm-2 11571 0 308350 6536 153522 0 5093416 122884 0 65400 129416 + 252 3 dm-3 3870 0 3870 104 0 0 0 0 0 16 104 + 252 4 dm-4 392 0 1034 28 38 0 137 16 0 24 44 + 252 5 dm-5 3729 0 84279 924 98918 0 1151688 104684 0 58848 105632 + 179 0 mmcblk0 192 3 1560 156 0 0 0 0 0 136 156 + 179 1 mmcblk0p1 17 3 160 24 0 0 0 0 0 24 24 + 179 2 mmcblk0p2 95 0 760 68 0 0 0 0 0 68 68 + 2 0 fd0 2 0 16 80 0 0 0 0 0 80 80 + 254 0 vda 1775784 15386 32670882 8655768 6038856 20711856 213637440 2069221364 0 41614592 2077872228 + 254 1 vda1 668 85 5984 956 207 4266 35784 32772 0 8808 33720 + 254 2 vda2 1774936 15266 32663262 8654692 5991028 20707590 213601656 2069152216 0 41607628 2077801992 + 11 0 sr0 0 0 0 0 0 0 0 0 0 0 0 + 259 0 nvme0n1 47114 4 4643973 21650 1078320 43950 39451633 1011053 0 222766 1032546 + 259 1 nvme0n1p1 1140 0 9370 16 1 0 1 0 0 16 16 + 259 2 nvme0n1p2 45914 4 4631243 21626 1036885 43950 39451632 919480 0 131580 940970 + 8 0 sdb 326552 841 9657779 84 41822 2895 1972905 5007 0 60730 67070 68851 0 1925173784 11130 + 8 1 sdb1 231 3 34466 4 24 23 106 0 0 64 64 0 0 0 0 + 8 2 sdb2 326310 838 9622281 67 40726 2872 1972799 4924 0 58250 64567 68851 0 1925173784 11130 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/fs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/fs/xfs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/fs/xfs/stat +Lines: 23 +extent_alloc 92447 97589 92448 93751 +abt 0 0 0 0 +blk_map 1767055 188820 184891 92447 92448 2140766 0 +bmbt 0 0 0 0 +dir 185039 92447 92444 136422 +trans 706 944304 0 +ig 185045 58807 0 126238 0 33637 22 +log 2883 113448 9 17360 739 +push_ail 945014 0 134260 15483 0 3940 464 159985 0 40 +xstrat 92447 0 +rw 107739 94045 +attr 4 0 0 0 +icluster 8677 7849 135802 +vnodes 92601 0 0 0 92444 92444 92444 0 +buf 2666287 7122 2659202 3599 2 7085 0 10297 7085 +abtb2 184941 1277345 13257 13278 0 0 0 0 0 0 0 0 0 0 2746147 +abtc2 345295 2416764 172637 172658 0 0 0 0 0 0 0 0 0 0 21406023 +bmbt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ibt2 343004 1358467 0 0 0 0 0 0 0 0 0 0 0 0 0 +fibt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +qm 0 0 0 0 0 0 0 0 +xpc 399724544 92823103 86219234 +debug 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/mdstat +Lines: 56 +Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] + +md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] sdd1[10](S) sdd2[11](S) + 5853468288 blocks super 1.2 level 6, 64k chunk, algorithm 2 [8/8] [UUUUUUUU] + +md127 : active raid1 sdi2[0] sdj2[1] + 312319552 blocks [2/2] [UU] + +md0 : active raid1 sdi1[0] sdj1[1] + 248896 blocks [2/2] [UU] + +md4 : inactive raid1 sda3[0](F) sdb3[1](S) + 4883648 blocks [2/2] [UU] + +md6 : active raid1 sdb2[2](F) sdc[1](S) sda2[0] + 195310144 blocks [2/1] [U_] + [=>...................] recovery = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec + +md8 : active raid1 sdb1[1] sda1[0] sdc[2](S) sde[3](S) + 195310144 blocks [2/2] [UU] + [=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec + +md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1](F) + 7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU] + bitmap: 0/30 pages [0KB], 65536KB chunk + +md9 : active raid1 sdc2[2] sdd2[3] sdb2[1] sda2[0] sde[4](F) sdf[5](F) sdg[6](S) + 523968 blocks super 1.2 [4/4] [UUUU] + resync=DELAYED + +md10 : active raid0 sda1[0] sdb1[1] + 314159265 blocks 64k chunks + +md11 : active (auto-read-only) raid1 sdb2[0] sdc2[1] sdc3[2](F) hda[4](S) ssdc2[3](S) + 4190208 blocks super 1.2 [2/2] [UU] + resync=PENDING + +md12 : active raid0 sdc2[0] sdd2[1] + 3886394368 blocks super 1.2 512k chunks + +md126 : active raid0 sdb[1] sdc[0] + 1855870976 blocks super external:/md127/0 128k chunks + +md219 : inactive sdb[2](S) sdc[1](S) sda[0](S) + 7932 blocks super external:imsm + +md00 : active raid0 xvdb[0] + 4186624 blocks super 1.2 256k chunks + +md120 : active linear sda1[1] sdb1[0] + 2095104 blocks super 1.2 0k rounding + +md101 : active (read-only) raid0 sdb[2] sdd[1] sdc[0] + 322560 blocks super 1.2 512k chunks + +unused devices: +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/meminfo +Lines: 42 +MemTotal: 15666184 kB +MemFree: 440324 kB +Buffers: 1020128 kB +Cached: 12007640 kB +SwapCached: 0 kB +Active: 6761276 kB +Inactive: 6532708 kB +Active(anon): 267256 kB +Inactive(anon): 268 kB +Active(file): 6494020 kB +Inactive(file): 6532440 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 0 kB +SwapFree: 0 kB +Dirty: 768 kB +Writeback: 0 kB +AnonPages: 266216 kB +Mapped: 44204 kB +Shmem: 1308 kB +Slab: 1807264 kB +SReclaimable: 1738124 kB +SUnreclaim: 69140 kB +KernelStack: 1616 kB +PageTables: 5288 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 7833092 kB +Committed_AS: 530844 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 36596 kB +VmallocChunk: 34359637840 kB +HardwareCorrupted: 0 kB +AnonHugePages: 12288 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 91136 kB +DirectMap2M: 16039936 kB +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/net +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/arp +Lines: 2 +IP address HW type Flags HW address Mask Device +192.168.224.1 0x1 0x2 00:50:56:c0:00:08 * ens33 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/dev +Lines: 6 +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed +vethf345468: 648 8 0 0 0 0 0 0 438 5 0 0 0 0 0 0 + lo: 1664039048 1566805 0 0 0 0 0 0 1664039048 1566805 0 0 0 0 0 0 +docker0: 2568 38 0 0 0 0 0 0 438 5 0 0 0 0 0 0 + eth0: 874354587 1036395 0 0 0 0 0 0 563352563 732147 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/ip_vs +Lines: 21 +IP Virtual Server version 1.2.1 (size=4096) +Prot LocalAddress:Port Scheduler Flags + -> RemoteAddress:Port Forward Weight ActiveConn InActConn +TCP C0A80016:0CEA wlc + -> C0A85216:0CEA Tunnel 100 248 2 + -> C0A85318:0CEA Tunnel 100 248 2 + -> C0A85315:0CEA Tunnel 100 248 1 +TCP C0A80039:0CEA wlc + -> C0A85416:0CEA Tunnel 0 0 0 + -> C0A85215:0CEA Tunnel 100 1499 0 + -> C0A83215:0CEA Tunnel 100 1498 0 +TCP C0A80037:0CEA wlc + -> C0A8321A:0CEA Tunnel 0 0 0 + -> C0A83120:0CEA Tunnel 100 0 0 +TCP [2620:0000:0000:0000:0000:0000:0000:0001]:0050 sh + -> [2620:0000:0000:0000:0000:0000:0000:0002]:0050 Route 1 0 0 + -> [2620:0000:0000:0000:0000:0000:0000:0003]:0050 Route 1 0 0 + -> [2620:0000:0000:0000:0000:0000:0000:0004]:0050 Route 1 1 1 +FWM 10001000 wlc + -> C0A8321A:0CEA Route 0 0 1 + -> C0A83215:0CEA Route 0 0 2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/ip_vs_stats +Lines: 6 + Total Incoming Outgoing Incoming Outgoing + Conns Packets Packets Bytes Bytes + 16AA370 E33656E5 0 51D8C8883AB3 0 + + Conns/s Pkts/s Pkts/s Bytes/s Bytes/s + 4 1FB3C 0 1282A8F 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/net/rpc +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/rpc/nfs +Lines: 5 +net 18628 0 18628 6 +rpc 4329785 0 4338291 +proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 +proc3 22 1 4084749 29200 94754 32580 186 47747 7981 8639 0 6356 0 6962 0 7958 0 0 241 4 4 2 39 +proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 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 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/rpc/nfsd +Lines: 11 +rc 0 6 18622 +fh 0 0 0 0 0 +io 157286400 0 +th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 +ra 32 0 0 0 0 0 0 0 0 0 0 0 +net 18628 0 18628 6 +rpc 18628 0 0 0 0 +proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 +proc3 22 2 112 0 2719 111 0 0 0 0 0 0 0 0 0 0 0 27 216 0 2 1 0 +proc4 2 2 10853 +proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 1272 0 0 0 1236 0 0 0 0 3 3 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 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/sockstat +Lines: 6 +sockets: used 1602 +TCP: inuse 35 orphan 0 tw 4 alloc 59 mem 22 +UDP: inuse 12 mem 62 +UDPLITE: inuse 0 +RAW: inuse 0 +FRAG: inuse 0 memory 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/sockstat6 +Lines: 5 +TCP6: inuse 17 +UDP6: inuse 9 +UDPLITE6: inuse 0 +RAW6: inuse 1 +FRAG6: inuse 0 memory 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/softnet_stat +Lines: 1 +00015c73 00020e76 F0000769 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/unix +Lines: 6 +Num RefCount Protocol Flags Type St Inode Path +0000000000000000: 00000002 00000000 00010000 0001 01 3442596 /var/run/postgresql/.s.PGSQL.5432 +0000000000000000: 0000000a 00000000 00010000 0005 01 10061 /run/udev/control +0000000000000000: 00000007 00000000 00000000 0002 01 12392 /dev/log +0000000000000000: 00000003 00000000 00000000 0001 03 4787297 /var/run/postgresql/.s.PGSQL.5432 +0000000000000000: 00000003 00000000 00000000 0001 03 5091797 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/unix_without_inode +Lines: 6 +Num RefCount Protocol Flags Type St Path +0000000000000000: 00000002 00000000 00010000 0001 01 /var/run/postgresql/.s.PGSQL.5432 +0000000000000000: 0000000a 00000000 00010000 0005 01 /run/udev/control +0000000000000000: 00000007 00000000 00000000 0002 01 /dev/log +0000000000000000: 00000003 00000000 00000000 0001 03 /var/run/postgresql/.s.PGSQL.5432 +0000000000000000: 00000003 00000000 00000000 0001 03 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/xfrm_stat +Lines: 28 +XfrmInError 1 +XfrmInBufferError 2 +XfrmInHdrError 4 +XfrmInNoStates 3 +XfrmInStateProtoError 40 +XfrmInStateModeError 100 +XfrmInStateSeqError 6000 +XfrmInStateExpired 4 +XfrmInStateMismatch 23451 +XfrmInStateInvalid 55555 +XfrmInTmplMismatch 51 +XfrmInNoPols 65432 +XfrmInPolBlock 100 +XfrmInPolError 10000 +XfrmOutError 1000000 +XfrmOutBundleGenError 43321 +XfrmOutBundleCheckError 555 +XfrmOutNoStates 869 +XfrmOutStateProtoError 4542 +XfrmOutStateModeError 4 +XfrmOutStateSeqError 543 +XfrmOutStateExpired 565 +XfrmOutPolBlock 43456 +XfrmOutPolDead 7656 +XfrmOutPolError 1454 +XfrmFwdHdrError 6654 +XfrmOutStateInvalid 28765 +XfrmAcquireError 24532 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/pressure +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/pressure/cpu +Lines: 1 +some avg10=0.10 avg60=2.00 avg300=3.85 total=15 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/pressure/io +Lines: 2 +some avg10=0.10 avg60=2.00 avg300=3.85 total=15 +full avg10=0.20 avg60=3.00 avg300=4.95 total=25 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/pressure/memory +Lines: 2 +some avg10=0.10 avg60=2.00 avg300=3.85 total=15 +full avg10=0.20 avg60=3.00 avg300=4.95 total=25 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/schedstat +Lines: 6 +version 15 +timestamp 15819019232 +cpu0 498494191 0 3533438552 2553969831 3853684107 2465731542 2045936778163039 343796328169361 4767485306 +domain0 00000000,00000003 212499247 210112015 1861015 1860405436 536440 369895 32599 210079416 25368550 24241256 384652 927363878 807233 6366 1647 24239609 2122447165 1886868564 121112060 2848625533 125678146 241025 1032026 1885836538 2545 12 2533 0 0 0 0 0 0 1387952561 21076581 0 +cpu1 518377256 0 4155211005 2778589869 10466382 2867629021 1904686152592476 364107263788241 5145567945 +domain0 00000000,00000003 217653037 215526982 1577949 1580427380 557469 393576 28538 215498444 28721913 27662819 371153 870843407 745912 5523 1639 27661180 2331056874 2107732788 111442342 652402556 123615235 196159 1045245 2106687543 2400 3 2397 0 0 0 0 0 0 1437804657 26220076 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/self +SymlinkTo: 26231 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/stat +Lines: 16 +cpu 301854 612 111922 8979004 3552 2 3944 0 0 0 +cpu0 44490 19 21045 1087069 220 1 3410 0 0 0 +cpu1 47869 23 16474 1110787 591 0 46 0 0 0 +cpu2 46504 36 15916 1112321 441 0 326 0 0 0 +cpu3 47054 102 15683 1113230 533 0 60 0 0 0 +cpu4 28413 25 10776 1140321 217 0 8 0 0 0 +cpu5 29271 101 11586 1136270 672 0 30 0 0 0 +cpu6 29152 36 10276 1139721 319 0 29 0 0 0 +cpu7 29098 268 10164 1139282 555 0 31 0 0 0 +intr 8885917 17 0 0 0 0 0 0 0 1 79281 0 0 0 0 0 0 0 231237 0 0 0 0 250586 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223424 190745 13 906 1283803 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 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 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 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 0 0 0 0 0 0 0 0 0 0 +ctxt 38014093 +btime 1418183276 +processes 26442 +procs_running 2 +procs_blocked 1 +softirq 5057579 250191 1481983 1647 211099 186066 0 1783454 622196 12499 508444 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/symlinktargets +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/symlinktargets/README +Lines: 2 +This directory contains some empty files that are the symlinks the files in the "fd" directory point to. +They are otherwise ignored by the tests +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/symlinktargets/abc +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/symlinktargets/def +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/symlinktargets/ghi +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/symlinktargets/uvw +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/symlinktargets/xyz +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/sys +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/sys/vm +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/admin_reserve_kbytes +Lines: 1 +8192 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/block_dump +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/compact_unevictable_allowed +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_background_bytes +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_background_ratio +Lines: 1 +10 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_bytes +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_expire_centisecs +Lines: 1 +3000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_ratio +Lines: 1 +20 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirty_writeback_centisecs +Lines: 1 +500 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/dirtytime_expire_seconds +Lines: 1 +43200 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/drop_caches +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/extfrag_threshold +Lines: 1 +500 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/hugetlb_shm_group +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/laptop_mode +Lines: 1 +5 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/legacy_va_layout +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/lowmem_reserve_ratio +Lines: 1 +256 256 32 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/max_map_count +Lines: 1 +65530 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/memory_failure_early_kill +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/memory_failure_recovery +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/min_free_kbytes +Lines: 1 +67584 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/min_slab_ratio +Lines: 1 +5 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/min_unmapped_ratio +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/mmap_min_addr +Lines: 1 +65536 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/nr_hugepages +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/nr_hugepages_mempolicy +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/nr_overcommit_hugepages +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/numa_stat +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/numa_zonelist_order +Lines: 1 +Node +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/oom_dump_tasks +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/oom_kill_allocating_task +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/overcommit_kbytes +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/overcommit_memory +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/overcommit_ratio +Lines: 1 +50 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/page-cluster +Lines: 1 +3 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/panic_on_oom +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/percpu_pagelist_fraction +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/stat_interval +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/swappiness +Lines: 1 +60 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/user_reserve_kbytes +Lines: 1 +131072 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/vfs_cache_pressure +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/watermark_boost_factor +Lines: 1 +15000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/watermark_scale_factor +Lines: 1 +10 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/sys/vm/zone_reclaim_mode +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/zoneinfo +Lines: 262 +Node 0, zone DMA + per-node stats + nr_inactive_anon 230981 + nr_active_anon 547580 + nr_inactive_file 316904 + nr_active_file 346282 + nr_unevictable 115467 + nr_slab_reclaimable 131220 + nr_slab_unreclaimable 47320 + nr_isolated_anon 0 + nr_isolated_file 0 + workingset_nodes 11627 + workingset_refault 466886 + workingset_activate 276925 + workingset_restore 84055 + workingset_nodereclaim 487 + nr_anon_pages 795576 + nr_mapped 215483 + nr_file_pages 761874 + nr_dirty 908 + nr_writeback 0 + nr_writeback_temp 0 + nr_shmem 224925 + nr_shmem_hugepages 0 + nr_shmem_pmdmapped 0 + nr_anon_transparent_hugepages 0 + nr_unstable 0 + nr_vmscan_write 12950 + nr_vmscan_immediate_reclaim 3033 + nr_dirtied 8007423 + nr_written 7752121 + nr_kernel_misc_reclaimable 0 + pages free 3952 + min 33 + low 41 + high 49 + spanned 4095 + present 3975 + managed 3956 + protection: (0, 2877, 7826, 7826, 7826) + nr_free_pages 3952 + nr_zone_inactive_anon 0 + nr_zone_active_anon 0 + nr_zone_inactive_file 0 + nr_zone_active_file 0 + nr_zone_unevictable 0 + nr_zone_write_pending 0 + nr_mlock 0 + nr_page_table_pages 0 + nr_kernel_stack 0 + nr_bounce 0 + nr_zspages 0 + nr_free_cma 0 + numa_hit 1 + numa_miss 0 + numa_foreign 0 + numa_interleave 0 + numa_local 1 + numa_other 0 + pagesets + cpu: 0 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 1 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 2 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 3 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 4 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 5 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 6 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + cpu: 7 + count: 0 + high: 0 + batch: 1 + vm stats threshold: 8 + node_unreclaimable: 0 + start_pfn: 1 +Node 0, zone DMA32 + pages free 204252 + min 19510 + low 21059 + high 22608 + spanned 1044480 + present 759231 + managed 742806 + protection: (0, 0, 4949, 4949, 4949) + nr_free_pages 204252 + nr_zone_inactive_anon 118558 + nr_zone_active_anon 106598 + nr_zone_inactive_file 75475 + nr_zone_active_file 70293 + nr_zone_unevictable 66195 + nr_zone_write_pending 64 + nr_mlock 4 + nr_page_table_pages 1756 + nr_kernel_stack 2208 + nr_bounce 0 + nr_zspages 0 + nr_free_cma 0 + numa_hit 113952967 + numa_miss 0 + numa_foreign 0 + numa_interleave 0 + numa_local 113952967 + numa_other 0 + pagesets + cpu: 0 + count: 345 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 1 + count: 356 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 2 + count: 325 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 3 + count: 346 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 4 + count: 321 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 5 + count: 316 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 6 + count: 373 + high: 378 + batch: 63 + vm stats threshold: 48 + cpu: 7 + count: 339 + high: 378 + batch: 63 + vm stats threshold: 48 + node_unreclaimable: 0 + start_pfn: 4096 +Node 0, zone Normal + pages free 18553 + min 11176 + low 13842 + high 16508 + spanned 1308160 + present 1308160 + managed 1268711 + protection: (0, 0, 0, 0, 0) + nr_free_pages 18553 + nr_zone_inactive_anon 112423 + nr_zone_active_anon 440982 + nr_zone_inactive_file 241429 + nr_zone_active_file 275989 + nr_zone_unevictable 49272 + nr_zone_write_pending 844 + nr_mlock 154 + nr_page_table_pages 9750 + nr_kernel_stack 15136 + nr_bounce 0 + nr_zspages 0 + nr_free_cma 0 + numa_hit 162718019 + numa_miss 0 + numa_foreign 0 + numa_interleave 26812 + numa_local 162718019 + numa_other 0 + pagesets + cpu: 0 + count: 316 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 1 + count: 366 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 2 + count: 60 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 3 + count: 256 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 4 + count: 253 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 5 + count: 159 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 6 + count: 311 + high: 378 + batch: 63 + vm stats threshold: 56 + cpu: 7 + count: 264 + high: 378 + batch: 63 + vm stats threshold: 56 + node_unreclaimable: 0 + start_pfn: 1048576 +Node 0, zone Movable + pages free 0 + min 0 + low 0 + high 0 + spanned 0 + present 0 + managed 0 + protection: (0, 0, 0, 0, 0) +Node 0, zone Device + pages free 0 + min 0 + low 0 + high 0 + spanned 0 + present 0 + managed 0 + protection: (0, 0, 0, 0, 0) +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/block +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/block/dm-0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/block/dm-0/stat +Lines: 1 +6447303 0 710266738 1529043 953216 0 31201176 4557464 0 796160 6088971 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/block/sda +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/block/sda/stat +Lines: 1 +9652963 396792 759304206 412943 8422549 6731723 286915323 13947418 0 5658367 19174573 1 2 3 12 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/board_id +Lines: 1 +SM_1141000001000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/fw_ver +Lines: 1 +2.31.5050 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/hca_type +Lines: 1 +MT4099 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/excessive_buffer_overrun_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_downed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_error_recovery +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/local_link_integrity_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_constraint_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_data +Lines: 1 +2221223609 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_packets +Lines: 1 +87169372 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_remote_physical_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_switch_relay_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_constraint_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_data +Lines: 1 +26509113295 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_discards +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_packets +Lines: 1 +85734114 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_wait +Lines: 1 +3599 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/symbol_error +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/phys_state +Lines: 1 +5: LinkUp +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/rate +Lines: 1 +40 Gb/sec (4X QDR) +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/state +Lines: 1 +4: ACTIVE +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/excessive_buffer_overrun_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/link_downed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/link_error_recovery +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/local_link_integrity_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_constraint_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_data +Lines: 1 +2460436784 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_packets +Lines: 1 +89332064 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_remote_physical_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_switch_relay_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_constraint_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_data +Lines: 1 +26540356890 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_discards +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_packets +Lines: 1 +88622850 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_wait +Lines: 1 +3846 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/symbol_error +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/phys_state +Lines: 1 +5: LinkUp +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/rate +Lines: 1 +40 Gb/sec (4X QDR) +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/state +Lines: 1 +4: ACTIVE +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/net +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/net/eth0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/addr_assign_type +Lines: 1 +3 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/addr_len +Lines: 1 +6 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/address +Lines: 1 +01:01:01:01:01:01 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/broadcast +Lines: 1 +ff:ff:ff:ff:ff:ff +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/carrier +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/carrier_changes +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/carrier_down_count +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/carrier_up_count +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/dev_id +Lines: 1 +0x20 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/device +SymlinkTo: ../../../devices/pci0000:00/0000:00:1f.6/ +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/dormant +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/duplex +Lines: 1 +full +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/flags +Lines: 1 +0x1303 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ifalias +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/ifindex +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/iflink +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/link_mode +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/mtu +Lines: 1 +1500 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/name_assign_type +Lines: 1 +2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/netdev_group +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/operstate +Lines: 1 +up +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/phys_port_id +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/phys_port_name +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/phys_switch_id +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/speed +Lines: 1 +1000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/tx_queue_len +Lines: 1 +1000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/net/eth0/type +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/power_supply +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/power_supply/AC +SymlinkTo: ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/power_supply/BAT0 +SymlinkTo: ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/powercap +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/powercap/intel-rapl +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl/enabled +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl/uevent +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/powercap/intel-rapl:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_max_power_uw +Lines: 1 +95000000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_name +Lines: 1 +long_term +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_power_limit_uw +Lines: 1 +4090000000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_0_time_window_us +Lines: 1 +999424 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_max_power_uw +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_name +Lines: 1 +short_term +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_power_limit_uw +Lines: 1 +4090000000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/constraint_1_time_window_us +Lines: 1 +2440 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/enabled +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/energy_uj +Lines: 1 +240422366267 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/max_energy_range_uj +Lines: 1 +262143328850 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/name +Lines: 1 +package-0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0/uevent +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/powercap/intel-rapl:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_max_power_uw +Lines: 0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_name +Lines: 1 +long_term +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_power_limit_uw +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/constraint_0_time_window_us +Lines: 1 +976 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/enabled +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/energy_uj +Lines: 1 +118821284256 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/max_energy_range_uj +Lines: 1 +262143328850 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/name +Lines: 1 +core +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/powercap/intel-rapl:0:0/uevent +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/thermal +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/thermal/cooling_device0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device0/cur_state +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device0/max_state +Lines: 1 +50 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device0/type +Lines: 1 +Processor +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/thermal/cooling_device1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device1/cur_state +Lines: 1 +-1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device1/max_state +Lines: 1 +27 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/cooling_device1/type +Lines: 1 +intel_powerclamp +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/thermal/thermal_zone0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone0/policy +Lines: 1 +step_wise +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone0/temp +Lines: 1 +49925 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone0/type +Lines: 1 +bcm2835_thermal +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/class/thermal/thermal_zone1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone1/mode +Lines: 1 +enabled +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone1/passive +Lines: 1 +0 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone1/policy +Lines: 1 +step_wise +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone1/temp +Lines: 1 +44000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/class/thermal/thermal_zone1/type +Lines: 1 +acpitz +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/device +SymlinkTo: ../../../ACPI0003:00 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/online +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/async +Lines: 1 +disabled +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/control +Lines: 1 +auto +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_active_kids +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_active_time +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_enabled +Lines: 1 +disabled +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_status +Lines: 1 +unsupported +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_suspended_time +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_usage +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup +Lines: 1 +enabled +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_abort_count +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_active +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_active_count +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_count +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_expire_count +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_last_time_ms +Lines: 1 +10598 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_max_time_ms +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_prevent_sleep_time_ms +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_total_time_ms +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/subsystem +SymlinkTo: ../../../../../../../../../class/power_supply +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/type +Lines: 1 +Mains +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/uevent +Lines: 2 +POWER_SUPPLY_NAME=AC +POWER_SUPPLY_ONLINE=0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/alarm +Lines: 1 +2369000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/capacity +Lines: 1 +98 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/capacity_level +Lines: 1 +Normal +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/charge_start_threshold +Lines: 1 +95 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/charge_stop_threshold +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/cycle_count +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/device +SymlinkTo: ../../../PNP0C0A:00 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_full +Lines: 1 +50060000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_full_design +Lines: 1 +47520000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_now +Lines: 1 +49450000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/manufacturer +Lines: 1 +LGC +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/model_name +Lines: 1 +LNV-45N1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/async +Lines: 1 +disabled +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/autosuspend_delay_ms +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/control +Lines: 1 +auto +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_active_kids +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_active_time +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_enabled +Lines: 1 +disabled +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_status +Lines: 1 +unsupported +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_suspended_time +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_usage +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power_now +Lines: 1 +4830000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/present +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/serial_number +Lines: 1 +38109 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/status +Lines: 1 +Discharging +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/subsystem +SymlinkTo: ../../../../../../../../../class/power_supply +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/technology +Lines: 1 +Li-ion +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/type +Lines: 1 +Battery +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/uevent +Lines: 16 +POWER_SUPPLY_NAME=BAT0 +POWER_SUPPLY_STATUS=Discharging +POWER_SUPPLY_PRESENT=1 +POWER_SUPPLY_TECHNOLOGY=Li-ion +POWER_SUPPLY_CYCLE_COUNT=0 +POWER_SUPPLY_VOLTAGE_MIN_DESIGN=10800000 +POWER_SUPPLY_VOLTAGE_NOW=11750000 +POWER_SUPPLY_POWER_NOW=5064000 +POWER_SUPPLY_ENERGY_FULL_DESIGN=47520000 +POWER_SUPPLY_ENERGY_FULL=47390000 +POWER_SUPPLY_ENERGY_NOW=40730000 +POWER_SUPPLY_CAPACITY=85 +POWER_SUPPLY_CAPACITY_LEVEL=Normal +POWER_SUPPLY_MODEL_NAME=LNV-45N1 +POWER_SUPPLY_MANUFACTURER=LGC +POWER_SUPPLY_SERIAL_NUMBER=38109 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_min_design +Lines: 1 +10800000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_now +Lines: 1 +12229000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/dirty_data +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/io_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/metadata_written +Lines: 1 +512 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/priority_stats +Lines: 5 +Unused: 99% +Metadata: 0% +Average: 10473 +Sectors per Q: 64 +Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/written +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/pci0000:00/0000:00:1f.6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/ari_enabled +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/broken_parity_status +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/class +Lines: 1 +0x020000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/consistent_dma_mask_bits +Lines: 1 +64 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/d3cold_allowed +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/device +Lines: 1 +0x15d7 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/dma_mask_bits +Lines: 1 +64 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/driver_override +Lines: 1 +(null) +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/irq +Lines: 1 +140 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/local_cpulist +Lines: 1 +0-7 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/local_cpus +Lines: 1 +ff +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/modalias +Lines: 1 +pci:v00008086d000015D7sv000017AAsd0000225Abc02sc00i00 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/msi_bus +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/numa_node +Lines: 1 +-1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/resource +Lines: 13 +0x00000000ec200000 0x00000000ec21ffff 0x0000000000040200 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +0x0000000000000000 0x0000000000000000 0x0000000000000000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/revision +Lines: 1 +0x21 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/subsystem_device +Lines: 1 +0x225a +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/subsystem_vendor +Lines: 1 +0x17aa +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/uevent +Lines: 6 +DRIVER=e1000e +PCI_CLASS=20000 +PCI_ID=8086:15D7 +PCI_SUBSYS_ID=17AA:225A +PCI_SLOT_NAME=0000:00:1f.6 +MODALIAS=pci:v00008086d000015D7sv000017AAsd0000225Abc02sc00i00 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/vendor +Lines: 1 +0x8086 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/rbd +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/rbd/0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/rbd/0/name +Lines: 1 +demo +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/rbd/0/pool +Lines: 1 +iscsi-images +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/rbd/1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/rbd/1/name +Lines: 1 +wrong +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/rbd/1/pool +Lines: 1 +wrong-images +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/clocksource +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/clocksource/clocksource0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/clocksource/clocksource0/available_clocksource +Lines: 1 +tsc hpet acpi_pm +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/clocksource/clocksource0/current_clocksource +Lines: 1 +tsc +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/cpufreq +SymlinkTo: ../cpufreq/policy0 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle/core_throttle_count +Lines: 1 +10084 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle/package_throttle_count +Lines: 1 +34818 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu0/topology +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_id +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_siblings +Lines: 1 +ff +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_siblings_list +Lines: 1 +0-7 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/physical_package_id +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/thread_siblings +Lines: 1 +11 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu0/topology/thread_siblings_list +Lines: 1 +0,4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu1 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu1/cpufreq +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freq +Lines: 1 +1200195 +Mode: 400 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_max_freq +Lines: 1 +3300000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_min_freq +Lines: 1 +1200000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_transition_latency +Lines: 1 +4294967295 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/related_cpus +Lines: 1 +1 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_available_governors +Lines: 1 +performance powersave +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_driver +Lines: 1 +intel_pstate +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor +Lines: 1 +powersave +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq +Lines: 1 +3300000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq +Lines: 1 +1200000 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_setspeed +Lines: 1 + +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle/core_throttle_count +Lines: 1 +523 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle/package_throttle_count +Lines: 1 +34818 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpu1/topology +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_id +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_siblings +Lines: 1 +ff +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_siblings_list +Lines: 1 +0-7 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/physical_package_id +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/thread_siblings +Lines: 1 +22 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpu1/topology/thread_siblings_list +Lines: 1 +1,5 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpufreq +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpufreq/policy0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/affected_cpus +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq +Lines: 1 +2400000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq +Lines: 1 +800000 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_transition_latency +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/related_cpus +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors +Lines: 1 +performance powersave +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq +Lines: 1 +1219917 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_driver +Lines: 1 +intel_pstate +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_governor +Lines: 1 +powersave +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq +Lines: 1 +2400000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq +Lines: 1 +800000 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed +Lines: 1 + +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/cpu/cpufreq/policy1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/average_key_size +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0 +Mode: 777 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/dirty_data +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/btree_cache_size +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0 +Mode: 777 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/io_errors +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/metadata_written +Lines: 1 +512 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/priority_stats +Lines: 5 +Unused: 99% +Metadata: 0% +Average: 10473 +Sectors per Q: 64 +Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/written +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache_available_percent +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/congested +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/active_journal_entries +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_nodes +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_read_average_duration_us +Lines: 1 +1305 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/cache_read_races +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/root_usage_percent +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hits +Lines: 1 +289 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hit_ratio +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/bypassed +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_hits +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hit_ratio +Lines: 1 +100 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hits +Lines: 1 +546 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_miss_collisions +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_misses +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_readaheads +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/tree_depth +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_may_use +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_readonly +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/bytes_used +Lines: 1 +808189952 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/disk_total +Lines: 1 +2147483648 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/disk_used +Lines: 1 +808189952 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/flags +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/raid0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/raid0/total_bytes +Lines: 1 +2147483648 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/raid0/used_bytes +Lines: 1 +808189952 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/total_bytes +Lines: 1 +2147483648 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/data/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/global_rsv_reserved +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/global_rsv_size +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_may_use +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_readonly +Lines: 1 +131072 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/bytes_used +Lines: 1 +933888 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/disk_total +Lines: 1 +2147483648 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/disk_used +Lines: 1 +1867776 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/flags +Lines: 1 +4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/raid1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/raid1/total_bytes +Lines: 1 +1073741824 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/raid1/used_bytes +Lines: 1 +933888 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/total_bytes +Lines: 1 +1073741824 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/metadata/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_may_use +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_readonly +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/bytes_used +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/disk_total +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/disk_used +Lines: 1 +32768 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/flags +Lines: 1 +2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/raid1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/raid1/total_bytes +Lines: 1 +8388608 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/raid1/used_bytes +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/total_bytes +Lines: 1 +8388608 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/allocation/system/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/clone_alignment +Lines: 1 +4096 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop25 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop25/size +Lines: 1 +20971520 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop26 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/devices/loop26/size +Lines: 1 +20971520 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/big_metadata +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/extended_iref +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/mixed_backref +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/features/skinny_metadata +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/label +Lines: 1 +fixture +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/metadata_uuid +Lines: 1 +0abb23a9-579b-43e6-ad30-227ef47fcb9d +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/nodesize +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/quota_override +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/0abb23a9-579b-43e6-ad30-227ef47fcb9d/sectorsize +Lines: 1 +4096 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_may_use +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_readonly +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/bytes_used +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/disk_total +Lines: 1 +644087808 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/disk_used +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/flags +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/raid5 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/raid5/total_bytes +Lines: 1 +644087808 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/raid5/used_bytes +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/total_bytes +Lines: 1 +644087808 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/data/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/global_rsv_reserved +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/global_rsv_size +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_may_use +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_readonly +Lines: 1 +262144 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/bytes_used +Lines: 1 +114688 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/disk_total +Lines: 1 +429391872 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/disk_used +Lines: 1 +114688 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/flags +Lines: 1 +4 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/raid6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/raid6/total_bytes +Lines: 1 +429391872 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/raid6/used_bytes +Lines: 1 +114688 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/total_bytes +Lines: 1 +429391872 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/metadata/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_may_use +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_readonly +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_reserved +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/bytes_used +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/disk_total +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/disk_used +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/flags +Lines: 1 +2 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/raid6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/raid6/total_bytes +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/raid6/used_bytes +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/total_bytes +Lines: 1 +16777216 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/allocation/system/total_bytes_pinned +Lines: 1 +0 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/clone_alignment +Lines: 1 +4096 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop22 +SymlinkTo: ../../../../devices/virtual/block/loop22 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop23 +SymlinkTo: ../../../../devices/virtual/block/loop23 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop24 +SymlinkTo: ../../../../devices/virtual/block/loop24 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/devices/loop25 +SymlinkTo: ../../../../devices/virtual/block/loop25 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/big_metadata +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/extended_iref +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/mixed_backref +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/raid56 +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/features/skinny_metadata +Lines: 1 +1 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/label +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/metadata_uuid +Lines: 1 +7f07c59f-6136-449c-ab87-e1cf2328731b +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/nodesize +Lines: 1 +16384 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/quota_override +Lines: 1 +0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/btrfs/7f07c59f-6136-449c-ab87-e1cf2328731b/sectorsize +Lines: 1 +4096 +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/xfs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/xfs/sda1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/xfs/sda1/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/xfs/sda1/stats/stats +Lines: 1 +extent_alloc 1 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/xfs/sdb1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/fs/xfs/sdb1/stats +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/fs/xfs/sdb1/stats/stats +Lines: 1 +extent_alloc 2 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/fileio_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/fileio_1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G/udev_path +Lines: 1 +/home/iscsi/file_back_1G +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/iblock_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1/udev_path +Lines: 1 +/dev/rbd1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/rbd_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo/udev_path +Lines: 1 +/dev/rbd/iscsi-images/demo +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/rd_mcp_119 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G/udev_path +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/7f4a4eb56d +SymlinkTo: ../../../../../../target/core/rd_mcp_119/ramdisk_lio_1G +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds +Lines: 1 +204950 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes +Lines: 1 +10325 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes +Lines: 1 +40325 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/795b7c7026 +SymlinkTo: ../../../../../../target/core/iblock_0/block_lio_rbd1 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds +Lines: 1 +104950 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes +Lines: 1 +20095 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes +Lines: 1 +71235 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/fff5e16686 +SymlinkTo: ../../../../../../target/core/fileio_1/file_lio_1G +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds +Lines: 1 +301950 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes +Lines: 1 +10195 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes +Lines: 1 +30195 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/enable +Lines: 1 +1 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/eba1edf893 +SymlinkTo: ../../../../../../target/core/rbd_0/iscsi-images-demo +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds +Lines: 1 +1234 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes +Lines: 1 +1504 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes +Lines: 1 +4733 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/github.com/prometheus/procfs/fs.go b/vendor/github.com/prometheus/procfs/fs.go new file mode 100644 index 00000000..0102ab0f --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fs.go @@ -0,0 +1,43 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "github.com/prometheus/procfs/internal/fs" +) + +// FS represents the pseudo-filesystem sys, which provides an interface to +// kernel data structures. +type FS struct { + proc fs.FS +} + +// DefaultMountPoint is the common mount point of the proc filesystem. +const DefaultMountPoint = fs.DefaultProcMountPoint + +// NewDefaultFS returns a new proc FS mounted under the default proc mountPoint. +// It will error if the mount point directory can't be read or is a file. +func NewDefaultFS() (FS, error) { + return NewFS(DefaultMountPoint) +} + +// NewFS returns a new proc FS mounted under the given proc mountPoint. It will error +// if the mount point directory can't be read or is a file. +func NewFS(mountPoint string) (FS, error) { + fs, err := fs.NewFS(mountPoint) + if err != nil { + return FS{}, err + } + return FS{fs}, nil +} diff --git a/vendor/github.com/prometheus/procfs/go.mod b/vendor/github.com/prometheus/procfs/go.mod new file mode 100644 index 00000000..0e04e5d1 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/go.mod @@ -0,0 +1,8 @@ +module github.com/prometheus/procfs + +go 1.12 + +require ( + github.com/google/go-cmp v0.3.1 + golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e +) diff --git a/vendor/github.com/prometheus/procfs/go.sum b/vendor/github.com/prometheus/procfs/go.sum new file mode 100644 index 00000000..33b824b0 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/go.sum @@ -0,0 +1,4 @@ +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/vendor/github.com/prometheus/procfs/internal/fs/fs.go b/vendor/github.com/prometheus/procfs/internal/fs/fs.go new file mode 100644 index 00000000..565e89e4 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/fs/fs.go @@ -0,0 +1,55 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fs + +import ( + "fmt" + "os" + "path/filepath" +) + +const ( + // DefaultProcMountPoint is the common mount point of the proc filesystem. + DefaultProcMountPoint = "/proc" + + // DefaultSysMountPoint is the common mount point of the sys filesystem. + DefaultSysMountPoint = "/sys" + + // DefaultConfigfsMountPoint is the common mount point of the configfs + DefaultConfigfsMountPoint = "/sys/kernel/config" +) + +// FS represents a pseudo-filesystem, normally /proc or /sys, which provides an +// interface to kernel data structures. +type FS string + +// NewFS returns a new FS mounted under the given mountPoint. It will error +// if the mount point can't be read. +func NewFS(mountPoint string) (FS, error) { + info, err := os.Stat(mountPoint) + if err != nil { + return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + } + if !info.IsDir() { + return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + } + + return FS(mountPoint), nil +} + +// Path appends the given path elements to the filesystem path, adding separators +// as necessary. +func (fs FS) Path(p ...string) string { + return filepath.Join(append([]string{string(fs)}, p...)...) +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/parse.go b/vendor/github.com/prometheus/procfs/internal/util/parse.go new file mode 100644 index 00000000..755591d9 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/parse.go @@ -0,0 +1,88 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "io/ioutil" + "strconv" + "strings" +) + +// ParseUint32s parses a slice of strings into a slice of uint32s. +func ParseUint32s(ss []string) ([]uint32, error) { + us := make([]uint32, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 32) + if err != nil { + return nil, err + } + + us = append(us, uint32(u)) + } + + return us, nil +} + +// ParseUint64s parses a slice of strings into a slice of uint64s. +func ParseUint64s(ss []string) ([]uint64, error) { + us := make([]uint64, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + us = append(us, u) + } + + return us, nil +} + +// ParsePInt64s parses a slice of strings into a slice of int64 pointers. +func ParsePInt64s(ss []string) ([]*int64, error) { + us := make([]*int64, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return nil, err + } + + us = append(us, &u) + } + + return us, nil +} + +// ReadUintFromFile reads a file and attempts to parse a uint64 from it. +func ReadUintFromFile(path string) (uint64, error) { + data, err := ioutil.ReadFile(path) + if err != nil { + return 0, err + } + return strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64) +} + +// ParseBool parses a string into a boolean pointer. +func ParseBool(b string) *bool { + var truth bool + switch b { + case "enabled": + truth = true + case "disabled": + truth = false + default: + return nil + } + return &truth +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/readfile.go b/vendor/github.com/prometheus/procfs/internal/util/readfile.go new file mode 100644 index 00000000..8051161b --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/readfile.go @@ -0,0 +1,38 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "io" + "io/ioutil" + "os" +) + +// ReadFileNoStat uses ioutil.ReadAll to read contents of entire file. +// This is similar to ioutil.ReadFile but without the call to os.Stat, because +// many files in /proc and /sys report incorrect file sizes (either 0 or 4096). +// Reads a max file size of 512kB. For files larger than this, a scanner +// should be used. +func ReadFileNoStat(filename string) ([]byte, error) { + const maxBufferSize = 1024 * 512 + + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + + reader := io.LimitReader(f, maxBufferSize) + return ioutil.ReadAll(reader) +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go new file mode 100644 index 00000000..c07de0b6 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go @@ -0,0 +1,48 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build linux,!appengine + +package util + +import ( + "bytes" + "os" + "syscall" +) + +// SysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly. +// https://github.com/prometheus/node_exporter/pull/728/files +// +// Note that this function will not read files larger than 128 bytes. +func SysReadFile(file string) (string, error) { + f, err := os.Open(file) + if err != nil { + return "", err + } + defer f.Close() + + // On some machines, hwmon drivers are broken and return EAGAIN. This causes + // Go's ioutil.ReadFile implementation to poll forever. + // + // Since we either want to read data or bail immediately, do the simplest + // possible read using syscall directly. + const sysFileBufferSize = 128 + b := make([]byte, sysFileBufferSize) + n, err := syscall.Read(int(f.Fd()), b) + if err != nil { + return "", err + } + + return string(bytes.TrimSpace(b[:n])), nil +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go new file mode 100644 index 00000000..bd55b453 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go @@ -0,0 +1,26 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build linux,appengine !linux + +package util + +import ( + "fmt" +) + +// SysReadFile is here implemented as a noop for builds that do not support +// the read syscall. For example Windows, or Linux on Google App Engine. +func SysReadFile(file string) (string, error) { + return "", fmt.Errorf("not supported on this platform") +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/valueparser.go b/vendor/github.com/prometheus/procfs/internal/util/valueparser.go new file mode 100644 index 00000000..fe2355d3 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/valueparser.go @@ -0,0 +1,91 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "strconv" +) + +// TODO(mdlayher): util packages are an anti-pattern and this should be moved +// somewhere else that is more focused in the future. + +// A ValueParser enables parsing a single string into a variety of data types +// in a concise and safe way. The Err method must be invoked after invoking +// any other methods to ensure a value was successfully parsed. +type ValueParser struct { + v string + err error +} + +// NewValueParser creates a ValueParser using the input string. +func NewValueParser(v string) *ValueParser { + return &ValueParser{v: v} +} + +// Int interprets the underlying value as an int and returns that value. +func (vp *ValueParser) Int() int { return int(vp.int64()) } + +// PInt64 interprets the underlying value as an int64 and returns a pointer to +// that value. +func (vp *ValueParser) PInt64() *int64 { + if vp.err != nil { + return nil + } + + v := vp.int64() + return &v +} + +// int64 interprets the underlying value as an int64 and returns that value. +// TODO: export if/when necessary. +func (vp *ValueParser) int64() int64 { + if vp.err != nil { + return 0 + } + + // A base value of zero makes ParseInt infer the correct base using the + // string's prefix, if any. + const base = 0 + v, err := strconv.ParseInt(vp.v, base, 64) + if err != nil { + vp.err = err + return 0 + } + + return v +} + +// PUInt64 interprets the underlying value as an uint64 and returns a pointer to +// that value. +func (vp *ValueParser) PUInt64() *uint64 { + if vp.err != nil { + return nil + } + + // A base value of zero makes ParseInt infer the correct base using the + // string's prefix, if any. + const base = 0 + v, err := strconv.ParseUint(vp.v, base, 64) + if err != nil { + vp.err = err + return nil + } + + return &v +} + +// Err returns the last error, if any, encountered by the ValueParser. +func (vp *ValueParser) Err() error { + return vp.err +} diff --git a/vendor/github.com/prometheus/procfs/ipvs.go b/vendor/github.com/prometheus/procfs/ipvs.go new file mode 100644 index 00000000..89e44774 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/ipvs.go @@ -0,0 +1,241 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "os" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// IPVSStats holds IPVS statistics, as exposed by the kernel in `/proc/net/ip_vs_stats`. +type IPVSStats struct { + // Total count of connections. + Connections uint64 + // Total incoming packages processed. + IncomingPackets uint64 + // Total outgoing packages processed. + OutgoingPackets uint64 + // Total incoming traffic. + IncomingBytes uint64 + // Total outgoing traffic. + OutgoingBytes uint64 +} + +// IPVSBackendStatus holds current metrics of one virtual / real address pair. +type IPVSBackendStatus struct { + // The local (virtual) IP address. + LocalAddress net.IP + // The remote (real) IP address. + RemoteAddress net.IP + // The local (virtual) port. + LocalPort uint16 + // The remote (real) port. + RemotePort uint16 + // The local firewall mark + LocalMark string + // The transport protocol (TCP, UDP). + Proto string + // The current number of active connections for this virtual/real address pair. + ActiveConn uint64 + // The current number of inactive connections for this virtual/real address pair. + InactConn uint64 + // The current weight of this virtual/real address pair. + Weight uint64 +} + +// IPVSStats reads the IPVS statistics from the specified `proc` filesystem. +func (fs FS) IPVSStats() (IPVSStats, error) { + data, err := util.ReadFileNoStat(fs.proc.Path("net/ip_vs_stats")) + if err != nil { + return IPVSStats{}, err + } + + return parseIPVSStats(bytes.NewReader(data)) +} + +// parseIPVSStats performs the actual parsing of `ip_vs_stats`. +func parseIPVSStats(r io.Reader) (IPVSStats, error) { + var ( + statContent []byte + statLines []string + statFields []string + stats IPVSStats + ) + + statContent, err := ioutil.ReadAll(r) + if err != nil { + return IPVSStats{}, err + } + + statLines = strings.SplitN(string(statContent), "\n", 4) + if len(statLines) != 4 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: too short") + } + + statFields = strings.Fields(statLines[2]) + if len(statFields) != 5 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: unexpected number of fields") + } + + stats.Connections, err = strconv.ParseUint(statFields[0], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingPackets, err = strconv.ParseUint(statFields[1], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingPackets, err = strconv.ParseUint(statFields[2], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingBytes, err = strconv.ParseUint(statFields[3], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingBytes, err = strconv.ParseUint(statFields[4], 16, 64) + if err != nil { + return IPVSStats{}, err + } + + return stats, nil +} + +// IPVSBackendStatus reads and returns the status of all (virtual,real) server pairs from the specified `proc` filesystem. +func (fs FS) IPVSBackendStatus() ([]IPVSBackendStatus, error) { + file, err := os.Open(fs.proc.Path("net/ip_vs")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseIPVSBackendStatus(file) +} + +func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) { + var ( + status []IPVSBackendStatus + scanner = bufio.NewScanner(file) + proto string + localMark string + localAddress net.IP + localPort uint16 + err error + ) + + for scanner.Scan() { + fields := strings.Fields(scanner.Text()) + if len(fields) == 0 { + continue + } + switch { + case fields[0] == "IP" || fields[0] == "Prot" || fields[1] == "RemoteAddress:Port": + continue + case fields[0] == "TCP" || fields[0] == "UDP": + if len(fields) < 2 { + continue + } + proto = fields[0] + localMark = "" + localAddress, localPort, err = parseIPPort(fields[1]) + if err != nil { + return nil, err + } + case fields[0] == "FWM": + if len(fields) < 2 { + continue + } + proto = fields[0] + localMark = fields[1] + localAddress = nil + localPort = 0 + case fields[0] == "->": + if len(fields) < 6 { + continue + } + remoteAddress, remotePort, err := parseIPPort(fields[1]) + if err != nil { + return nil, err + } + weight, err := strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, err + } + activeConn, err := strconv.ParseUint(fields[4], 10, 64) + if err != nil { + return nil, err + } + inactConn, err := strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + status = append(status, IPVSBackendStatus{ + LocalAddress: localAddress, + LocalPort: localPort, + LocalMark: localMark, + RemoteAddress: remoteAddress, + RemotePort: remotePort, + Proto: proto, + Weight: weight, + ActiveConn: activeConn, + InactConn: inactConn, + }) + } + } + return status, nil +} + +func parseIPPort(s string) (net.IP, uint16, error) { + var ( + ip net.IP + err error + ) + + switch len(s) { + case 13: + ip, err = hex.DecodeString(s[0:8]) + if err != nil { + return nil, 0, err + } + case 46: + ip = net.ParseIP(s[1:40]) + if ip == nil { + return nil, 0, fmt.Errorf("invalid IPv6 address: %s", s[1:40]) + } + default: + return nil, 0, fmt.Errorf("unexpected IP:Port: %s", s) + } + + portString := s[len(s)-4:] + if len(portString) != 4 { + return nil, 0, fmt.Errorf("unexpected port string format: %s", portString) + } + port, err := strconv.ParseUint(portString, 16, 16) + if err != nil { + return nil, 0, err + } + + return ip, uint16(port), nil +} diff --git a/vendor/github.com/prometheus/procfs/mdstat.go b/vendor/github.com/prometheus/procfs/mdstat.go new file mode 100644 index 00000000..2af3ada1 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/mdstat.go @@ -0,0 +1,194 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "io/ioutil" + "regexp" + "strconv" + "strings" +) + +var ( + statusLineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) + recoveryLineRE = regexp.MustCompile(`\((\d+)/\d+\)`) +) + +// MDStat holds info parsed from /proc/mdstat. +type MDStat struct { + // Name of the device. + Name string + // activity-state of the device. + ActivityState string + // Number of active disks. + DisksActive int64 + // Total number of disks the device requires. + DisksTotal int64 + // Number of failed disks. + DisksFailed int64 + // Spare disks in the device. + DisksSpare int64 + // Number of blocks the device holds. + BlocksTotal int64 + // Number of blocks on the device that are in sync. + BlocksSynced int64 +} + +// MDStat parses an mdstat-file (/proc/mdstat) and returns a slice of +// structs containing the relevant info. More information available here: +// https://raid.wiki.kernel.org/index.php/Mdstat +func (fs FS) MDStat() ([]MDStat, error) { + data, err := ioutil.ReadFile(fs.proc.Path("mdstat")) + if err != nil { + return nil, fmt.Errorf("error parsing mdstat %s: %s", fs.proc.Path("mdstat"), err) + } + mdstat, err := parseMDStat(data) + if err != nil { + return nil, fmt.Errorf("error parsing mdstat %s: %s", fs.proc.Path("mdstat"), err) + } + return mdstat, nil +} + +// parseMDStat parses data from mdstat file (/proc/mdstat) and returns a slice of +// structs containing the relevant info. +func parseMDStat(mdStatData []byte) ([]MDStat, error) { + mdStats := []MDStat{} + lines := strings.Split(string(mdStatData), "\n") + + for i, line := range lines { + if strings.TrimSpace(line) == "" || line[0] == ' ' || + strings.HasPrefix(line, "Personalities") || + strings.HasPrefix(line, "unused") { + continue + } + + deviceFields := strings.Fields(line) + if len(deviceFields) < 3 { + return nil, fmt.Errorf("not enough fields in mdline (expected at least 3): %s", line) + } + mdName := deviceFields[0] // mdx + state := deviceFields[2] // active or inactive + + if len(lines) <= i+3 { + return nil, fmt.Errorf( + "error parsing %s: too few lines for md device", + mdName, + ) + } + + // Failed disks have the suffix (F) & Spare disks have the suffix (S). + fail := int64(strings.Count(line, "(F)")) + spare := int64(strings.Count(line, "(S)")) + active, total, size, err := evalStatusLine(lines[i], lines[i+1]) + + if err != nil { + return nil, fmt.Errorf("error parsing md device lines: %s", err) + } + + syncLineIdx := i + 2 + if strings.Contains(lines[i+2], "bitmap") { // skip bitmap line + syncLineIdx++ + } + + // If device is syncing at the moment, get the number of currently + // synced bytes, otherwise that number equals the size of the device. + syncedBlocks := size + recovering := strings.Contains(lines[syncLineIdx], "recovery") + resyncing := strings.Contains(lines[syncLineIdx], "resync") + + // Append recovery and resyncing state info. + if recovering || resyncing { + if recovering { + state = "recovering" + } else { + state = "resyncing" + } + + // Handle case when resync=PENDING or resync=DELAYED. + if strings.Contains(lines[syncLineIdx], "PENDING") || + strings.Contains(lines[syncLineIdx], "DELAYED") { + syncedBlocks = 0 + } else { + syncedBlocks, err = evalRecoveryLine(lines[syncLineIdx]) + if err != nil { + return nil, fmt.Errorf("error parsing sync line in md device %s: %s", mdName, err) + } + } + } + + mdStats = append(mdStats, MDStat{ + Name: mdName, + ActivityState: state, + DisksActive: active, + DisksFailed: fail, + DisksSpare: spare, + DisksTotal: total, + BlocksTotal: size, + BlocksSynced: syncedBlocks, + }) + } + + return mdStats, nil +} + +func evalStatusLine(deviceLine, statusLine string) (active, total, size int64, err error) { + + sizeStr := strings.Fields(statusLine)[0] + size, err = strconv.ParseInt(sizeStr, 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err) + } + + if strings.Contains(deviceLine, "raid0") || strings.Contains(deviceLine, "linear") { + // In the device deviceLine, only disks have a number associated with them in []. + total = int64(strings.Count(deviceLine, "[")) + return total, total, size, nil + } + + if strings.Contains(deviceLine, "inactive") { + return 0, 0, size, nil + } + + matches := statusLineRE.FindStringSubmatch(statusLine) + if len(matches) != 4 { + return 0, 0, 0, fmt.Errorf("couldn't find all the substring matches: %s", statusLine) + } + + total, err = strconv.ParseInt(matches[2], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err) + } + + active, err = strconv.ParseInt(matches[3], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err) + } + + return active, total, size, nil +} + +func evalRecoveryLine(recoveryLine string) (syncedBlocks int64, err error) { + matches := recoveryLineRE.FindStringSubmatch(recoveryLine) + if len(matches) != 2 { + return 0, fmt.Errorf("unexpected recoveryLine: %s", recoveryLine) + } + + syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, fmt.Errorf("%s in recoveryLine: %s", err, recoveryLine) + } + + return syncedBlocks, nil +} diff --git a/vendor/github.com/prometheus/procfs/meminfo.go b/vendor/github.com/prometheus/procfs/meminfo.go new file mode 100644 index 00000000..50dab4bc --- /dev/null +++ b/vendor/github.com/prometheus/procfs/meminfo.go @@ -0,0 +1,277 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Meminfo represents memory statistics. +type Meminfo struct { + // Total usable ram (i.e. physical ram minus a few reserved + // bits and the kernel binary code) + MemTotal uint64 + // The sum of LowFree+HighFree + MemFree uint64 + // An estimate of how much memory is available for starting + // new applications, without swapping. Calculated from + // MemFree, SReclaimable, the size of the file LRU lists, and + // the low watermarks in each zone. The estimate takes into + // account that the system needs some page cache to function + // well, and that not all reclaimable slab will be + // reclaimable, due to items being in use. The impact of those + // factors will vary from system to system. + MemAvailable uint64 + // Relatively temporary storage for raw disk blocks shouldn't + // get tremendously large (20MB or so) + Buffers uint64 + Cached uint64 + // Memory that once was swapped out, is swapped back in but + // still also is in the swapfile (if memory is needed it + // doesn't need to be swapped out AGAIN because it is already + // in the swapfile. This saves I/O) + SwapCached uint64 + // Memory that has been used more recently and usually not + // reclaimed unless absolutely necessary. + Active uint64 + // Memory which has been less recently used. It is more + // eligible to be reclaimed for other purposes + Inactive uint64 + ActiveAnon uint64 + InactiveAnon uint64 + ActiveFile uint64 + InactiveFile uint64 + Unevictable uint64 + Mlocked uint64 + // total amount of swap space available + SwapTotal uint64 + // Memory which has been evicted from RAM, and is temporarily + // on the disk + SwapFree uint64 + // Memory which is waiting to get written back to the disk + Dirty uint64 + // Memory which is actively being written back to the disk + Writeback uint64 + // Non-file backed pages mapped into userspace page tables + AnonPages uint64 + // files which have been mapped, such as libraries + Mapped uint64 + Shmem uint64 + // in-kernel data structures cache + Slab uint64 + // Part of Slab, that might be reclaimed, such as caches + SReclaimable uint64 + // Part of Slab, that cannot be reclaimed on memory pressure + SUnreclaim uint64 + KernelStack uint64 + // amount of memory dedicated to the lowest level of page + // tables. + PageTables uint64 + // NFS pages sent to the server, but not yet committed to + // stable storage + NFSUnstable uint64 + // Memory used for block device "bounce buffers" + Bounce uint64 + // Memory used by FUSE for temporary writeback buffers + WritebackTmp uint64 + // Based on the overcommit ratio ('vm.overcommit_ratio'), + // this is the total amount of memory currently available to + // be allocated on the system. This limit is only adhered to + // if strict overcommit accounting is enabled (mode 2 in + // 'vm.overcommit_memory'). + // The CommitLimit is calculated with the following formula: + // CommitLimit = ([total RAM pages] - [total huge TLB pages]) * + // overcommit_ratio / 100 + [total swap pages] + // For example, on a system with 1G of physical RAM and 7G + // of swap with a `vm.overcommit_ratio` of 30 it would + // yield a CommitLimit of 7.3G. + // For more details, see the memory overcommit documentation + // in vm/overcommit-accounting. + CommitLimit uint64 + // The amount of memory presently allocated on the system. + // The committed memory is a sum of all of the memory which + // has been allocated by processes, even if it has not been + // "used" by them as of yet. A process which malloc()'s 1G + // of memory, but only touches 300M of it will show up as + // using 1G. This 1G is memory which has been "committed" to + // by the VM and can be used at any time by the allocating + // application. With strict overcommit enabled on the system + // (mode 2 in 'vm.overcommit_memory'),allocations which would + // exceed the CommitLimit (detailed above) will not be permitted. + // This is useful if one needs to guarantee that processes will + // not fail due to lack of memory once that memory has been + // successfully allocated. + CommittedAS uint64 + // total size of vmalloc memory area + VmallocTotal uint64 + // amount of vmalloc area which is used + VmallocUsed uint64 + // largest contiguous block of vmalloc area which is free + VmallocChunk uint64 + HardwareCorrupted uint64 + AnonHugePages uint64 + ShmemHugePages uint64 + ShmemPmdMapped uint64 + CmaTotal uint64 + CmaFree uint64 + HugePagesTotal uint64 + HugePagesFree uint64 + HugePagesRsvd uint64 + HugePagesSurp uint64 + Hugepagesize uint64 + DirectMap4k uint64 + DirectMap2M uint64 + DirectMap1G uint64 +} + +// Meminfo returns an information about current kernel/system memory statistics. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +func (fs FS) Meminfo() (Meminfo, error) { + b, err := util.ReadFileNoStat(fs.proc.Path("meminfo")) + if err != nil { + return Meminfo{}, err + } + + m, err := parseMemInfo(bytes.NewReader(b)) + if err != nil { + return Meminfo{}, fmt.Errorf("failed to parse meminfo: %v", err) + } + + return *m, nil +} + +func parseMemInfo(r io.Reader) (*Meminfo, error) { + var m Meminfo + s := bufio.NewScanner(r) + for s.Scan() { + // Each line has at least a name and value; we ignore the unit. + fields := strings.Fields(s.Text()) + if len(fields) < 2 { + return nil, fmt.Errorf("malformed meminfo line: %q", s.Text()) + } + + v, err := strconv.ParseUint(fields[1], 0, 64) + if err != nil { + return nil, err + } + + switch fields[0] { + case "MemTotal:": + m.MemTotal = v + case "MemFree:": + m.MemFree = v + case "MemAvailable:": + m.MemAvailable = v + case "Buffers:": + m.Buffers = v + case "Cached:": + m.Cached = v + case "SwapCached:": + m.SwapCached = v + case "Active:": + m.Active = v + case "Inactive:": + m.Inactive = v + case "Active(anon):": + m.ActiveAnon = v + case "Inactive(anon):": + m.InactiveAnon = v + case "Active(file):": + m.ActiveFile = v + case "Inactive(file):": + m.InactiveFile = v + case "Unevictable:": + m.Unevictable = v + case "Mlocked:": + m.Mlocked = v + case "SwapTotal:": + m.SwapTotal = v + case "SwapFree:": + m.SwapFree = v + case "Dirty:": + m.Dirty = v + case "Writeback:": + m.Writeback = v + case "AnonPages:": + m.AnonPages = v + case "Mapped:": + m.Mapped = v + case "Shmem:": + m.Shmem = v + case "Slab:": + m.Slab = v + case "SReclaimable:": + m.SReclaimable = v + case "SUnreclaim:": + m.SUnreclaim = v + case "KernelStack:": + m.KernelStack = v + case "PageTables:": + m.PageTables = v + case "NFS_Unstable:": + m.NFSUnstable = v + case "Bounce:": + m.Bounce = v + case "WritebackTmp:": + m.WritebackTmp = v + case "CommitLimit:": + m.CommitLimit = v + case "Committed_AS:": + m.CommittedAS = v + case "VmallocTotal:": + m.VmallocTotal = v + case "VmallocUsed:": + m.VmallocUsed = v + case "VmallocChunk:": + m.VmallocChunk = v + case "HardwareCorrupted:": + m.HardwareCorrupted = v + case "AnonHugePages:": + m.AnonHugePages = v + case "ShmemHugePages:": + m.ShmemHugePages = v + case "ShmemPmdMapped:": + m.ShmemPmdMapped = v + case "CmaTotal:": + m.CmaTotal = v + case "CmaFree:": + m.CmaFree = v + case "HugePages_Total:": + m.HugePagesTotal = v + case "HugePages_Free:": + m.HugePagesFree = v + case "HugePages_Rsvd:": + m.HugePagesRsvd = v + case "HugePages_Surp:": + m.HugePagesSurp = v + case "Hugepagesize:": + m.Hugepagesize = v + case "DirectMap4k:": + m.DirectMap4k = v + case "DirectMap2M:": + m.DirectMap2M = v + case "DirectMap1G:": + m.DirectMap1G = v + } + } + + return &m, nil +} diff --git a/vendor/github.com/prometheus/procfs/mountinfo.go b/vendor/github.com/prometheus/procfs/mountinfo.go new file mode 100644 index 00000000..bb01bb5a --- /dev/null +++ b/vendor/github.com/prometheus/procfs/mountinfo.go @@ -0,0 +1,180 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "fmt" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// A MountInfo is a type that describes the details, options +// for each mount, parsed from /proc/self/mountinfo. +// The fields described in each entry of /proc/self/mountinfo +// is described in the following man page. +// http://man7.org/linux/man-pages/man5/proc.5.html +type MountInfo struct { + // Unique Id for the mount + MountId int + // The Id of the parent mount + ParentId int + // The value of `st_dev` for the files on this FS + MajorMinorVer string + // The pathname of the directory in the FS that forms + // the root for this mount + Root string + // The pathname of the mount point relative to the root + MountPoint string + // Mount options + Options map[string]string + // Zero or more optional fields + OptionalFields map[string]string + // The Filesystem type + FSType string + // FS specific information or "none" + Source string + // Superblock options + SuperOptions map[string]string +} + +// Reads each line of the mountinfo file, and returns a list of formatted MountInfo structs. +func parseMountInfo(info []byte) ([]*MountInfo, error) { + mounts := []*MountInfo{} + scanner := bufio.NewScanner(bytes.NewReader(info)) + for scanner.Scan() { + mountString := scanner.Text() + parsedMounts, err := parseMountInfoString(mountString) + if err != nil { + return nil, err + } + mounts = append(mounts, parsedMounts) + } + + err := scanner.Err() + return mounts, err +} + +// Parses a mountinfo file line, and converts it to a MountInfo struct. +// An important check here is to see if the hyphen separator, as if it does not exist, +// it means that the line is malformed. +func parseMountInfoString(mountString string) (*MountInfo, error) { + var err error + + mountInfo := strings.Split(mountString, " ") + mountInfoLength := len(mountInfo) + if mountInfoLength < 11 { + return nil, fmt.Errorf("couldn't find enough fields in mount string: %s", mountString) + } + + if mountInfo[mountInfoLength-4] != "-" { + return nil, fmt.Errorf("couldn't find separator in expected field: %s", mountInfo[mountInfoLength-4]) + } + + mount := &MountInfo{ + MajorMinorVer: mountInfo[2], + Root: mountInfo[3], + MountPoint: mountInfo[4], + Options: mountOptionsParser(mountInfo[5]), + OptionalFields: nil, + FSType: mountInfo[mountInfoLength-3], + Source: mountInfo[mountInfoLength-2], + SuperOptions: mountOptionsParser(mountInfo[mountInfoLength-1]), + } + + mount.MountId, err = strconv.Atoi(mountInfo[0]) + if err != nil { + return nil, fmt.Errorf("failed to parse mount ID") + } + mount.ParentId, err = strconv.Atoi(mountInfo[1]) + if err != nil { + return nil, fmt.Errorf("failed to parse parent ID") + } + // Has optional fields, which is a space separated list of values. + // Example: shared:2 master:7 + if mountInfo[6] != "" { + mount.OptionalFields, err = mountOptionsParseOptionalFields(mountInfo[6 : mountInfoLength-4]) + if err != nil { + return nil, err + } + } + return mount, nil +} + +// mountOptionsIsValidField checks a string against a valid list of optional fields keys. +func mountOptionsIsValidField(s string) bool { + switch s { + case + "shared", + "master", + "propagate_from", + "unbindable": + return true + } + return false +} + +// mountOptionsParseOptionalFields parses a list of optional fields strings into a double map of strings. +func mountOptionsParseOptionalFields(o []string) (map[string]string, error) { + optionalFields := make(map[string]string) + for _, field := range o { + optionSplit := strings.SplitN(field, ":", 2) + value := "" + if len(optionSplit) == 2 { + value = optionSplit[1] + } + if mountOptionsIsValidField(optionSplit[0]) { + optionalFields[optionSplit[0]] = value + } + } + return optionalFields, nil +} + +// Parses the mount options, superblock options. +func mountOptionsParser(mountOptions string) map[string]string { + opts := make(map[string]string) + options := strings.Split(mountOptions, ",") + for _, opt := range options { + splitOption := strings.Split(opt, "=") + if len(splitOption) < 2 { + key := splitOption[0] + opts[key] = "" + } else { + key, value := splitOption[0], splitOption[1] + opts[key] = value + } + } + return opts +} + +// Retrieves mountinfo information from `/proc/self/mountinfo`. +func GetMounts() ([]*MountInfo, error) { + data, err := util.ReadFileNoStat("/proc/self/mountinfo") + if err != nil { + return nil, err + } + return parseMountInfo(data) +} + +// Retrieves mountinfo information from a processes' `/proc//mountinfo`. +func GetProcMounts(pid int) ([]*MountInfo, error) { + data, err := util.ReadFileNoStat(fmt.Sprintf("/proc/%d/mountinfo", pid)) + if err != nil { + return nil, err + } + return parseMountInfo(data) +} diff --git a/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/prometheus/procfs/mountstats.go new file mode 100644 index 00000000..35b2ef35 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/mountstats.go @@ -0,0 +1,621 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +// While implementing parsing of /proc/[pid]/mountstats, this blog was used +// heavily as a reference: +// https://utcc.utoronto.ca/~cks/space/blog/linux/NFSMountstatsIndex +// +// Special thanks to Chris Siebenmann for all of his posts explaining the +// various statistics available for NFS. + +import ( + "bufio" + "fmt" + "io" + "strconv" + "strings" + "time" +) + +// Constants shared between multiple functions. +const ( + deviceEntryLen = 8 + + fieldBytesLen = 8 + fieldEventsLen = 27 + + statVersion10 = "1.0" + statVersion11 = "1.1" + + fieldTransport10TCPLen = 10 + fieldTransport10UDPLen = 7 + + fieldTransport11TCPLen = 13 + fieldTransport11UDPLen = 10 +) + +// A Mount is a device mount parsed from /proc/[pid]/mountstats. +type Mount struct { + // Name of the device. + Device string + // The mount point of the device. + Mount string + // The filesystem type used by the device. + Type string + // If available additional statistics related to this Mount. + // Use a type assertion to determine if additional statistics are available. + Stats MountStats +} + +// A MountStats is a type which contains detailed statistics for a specific +// type of Mount. +type MountStats interface { + mountStats() +} + +// A MountStatsNFS is a MountStats implementation for NFSv3 and v4 mounts. +type MountStatsNFS struct { + // The version of statistics provided. + StatVersion string + // The mount options of the NFS mount. + Opts map[string]string + // The age of the NFS mount. + Age time.Duration + // Statistics related to byte counters for various operations. + Bytes NFSBytesStats + // Statistics related to various NFS event occurrences. + Events NFSEventsStats + // Statistics broken down by filesystem operation. + Operations []NFSOperationStats + // Statistics about the NFS RPC transport. + Transport NFSTransportStats +} + +// mountStats implements MountStats. +func (m MountStatsNFS) mountStats() {} + +// A NFSBytesStats contains statistics about the number of bytes read and written +// by an NFS client to and from an NFS server. +type NFSBytesStats struct { + // Number of bytes read using the read() syscall. + Read uint64 + // Number of bytes written using the write() syscall. + Write uint64 + // Number of bytes read using the read() syscall in O_DIRECT mode. + DirectRead uint64 + // Number of bytes written using the write() syscall in O_DIRECT mode. + DirectWrite uint64 + // Number of bytes read from the NFS server, in total. + ReadTotal uint64 + // Number of bytes written to the NFS server, in total. + WriteTotal uint64 + // Number of pages read directly via mmap()'d files. + ReadPages uint64 + // Number of pages written directly via mmap()'d files. + WritePages uint64 +} + +// A NFSEventsStats contains statistics about NFS event occurrences. +type NFSEventsStats struct { + // Number of times cached inode attributes are re-validated from the server. + InodeRevalidate uint64 + // Number of times cached dentry nodes are re-validated from the server. + DnodeRevalidate uint64 + // Number of times an inode cache is cleared. + DataInvalidate uint64 + // Number of times cached inode attributes are invalidated. + AttributeInvalidate uint64 + // Number of times files or directories have been open()'d. + VFSOpen uint64 + // Number of times a directory lookup has occurred. + VFSLookup uint64 + // Number of times permissions have been checked. + VFSAccess uint64 + // Number of updates (and potential writes) to pages. + VFSUpdatePage uint64 + // Number of pages read directly via mmap()'d files. + VFSReadPage uint64 + // Number of times a group of pages have been read. + VFSReadPages uint64 + // Number of pages written directly via mmap()'d files. + VFSWritePage uint64 + // Number of times a group of pages have been written. + VFSWritePages uint64 + // Number of times directory entries have been read with getdents(). + VFSGetdents uint64 + // Number of times attributes have been set on inodes. + VFSSetattr uint64 + // Number of pending writes that have been forcefully flushed to the server. + VFSFlush uint64 + // Number of times fsync() has been called on directories and files. + VFSFsync uint64 + // Number of times locking has been attempted on a file. + VFSLock uint64 + // Number of times files have been closed and released. + VFSFileRelease uint64 + // Unknown. Possibly unused. + CongestionWait uint64 + // Number of times files have been truncated. + Truncation uint64 + // Number of times a file has been grown due to writes beyond its existing end. + WriteExtension uint64 + // Number of times a file was removed while still open by another process. + SillyRename uint64 + // Number of times the NFS server gave less data than expected while reading. + ShortRead uint64 + // Number of times the NFS server wrote less data than expected while writing. + ShortWrite uint64 + // Number of times the NFS server indicated EJUKEBOX; retrieving data from + // offline storage. + JukeboxDelay uint64 + // Number of NFS v4.1+ pNFS reads. + PNFSRead uint64 + // Number of NFS v4.1+ pNFS writes. + PNFSWrite uint64 +} + +// A NFSOperationStats contains statistics for a single operation. +type NFSOperationStats struct { + // The name of the operation. + Operation string + // Number of requests performed for this operation. + Requests uint64 + // Number of times an actual RPC request has been transmitted for this operation. + Transmissions uint64 + // Number of times a request has had a major timeout. + MajorTimeouts uint64 + // Number of bytes sent for this operation, including RPC headers and payload. + BytesSent uint64 + // Number of bytes received for this operation, including RPC headers and payload. + BytesReceived uint64 + // Duration all requests spent queued for transmission before they were sent. + CumulativeQueueMilliseconds uint64 + // Duration it took to get a reply back after the request was transmitted. + CumulativeTotalResponseMilliseconds uint64 + // Duration from when a request was enqueued to when it was completely handled. + CumulativeTotalRequestMilliseconds uint64 +} + +// A NFSTransportStats contains statistics for the NFS mount RPC requests and +// responses. +type NFSTransportStats struct { + // The transport protocol used for the NFS mount. + Protocol string + // The local port used for the NFS mount. + Port uint64 + // Number of times the client has had to establish a connection from scratch + // to the NFS server. + Bind uint64 + // Number of times the client has made a TCP connection to the NFS server. + Connect uint64 + // Duration (in jiffies, a kernel internal unit of time) the NFS mount has + // spent waiting for connections to the server to be established. + ConnectIdleTime uint64 + // Duration since the NFS mount last saw any RPC traffic. + IdleTimeSeconds uint64 + // Number of RPC requests for this mount sent to the NFS server. + Sends uint64 + // Number of RPC responses for this mount received from the NFS server. + Receives uint64 + // Number of times the NFS server sent a response with a transaction ID + // unknown to this client. + BadTransactionIDs uint64 + // A running counter, incremented on each request as the current difference + // ebetween sends and receives. + CumulativeActiveRequests uint64 + // A running counter, incremented on each request by the current backlog + // queue size. + CumulativeBacklog uint64 + + // Stats below only available with stat version 1.1. + + // Maximum number of simultaneously active RPC requests ever used. + MaximumRPCSlotsUsed uint64 + // A running counter, incremented on each request as the current size of the + // sending queue. + CumulativeSendingQueue uint64 + // A running counter, incremented on each request as the current size of the + // pending queue. + CumulativePendingQueue uint64 +} + +// parseMountStats parses a /proc/[pid]/mountstats file and returns a slice +// of Mount structures containing detailed information about each mount. +// If available, statistics for each mount are parsed as well. +func parseMountStats(r io.Reader) ([]*Mount, error) { + const ( + device = "device" + statVersionPrefix = "statvers=" + + nfs3Type = "nfs" + nfs4Type = "nfs4" + ) + + var mounts []*Mount + + s := bufio.NewScanner(r) + for s.Scan() { + // Only look for device entries in this function + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 || ss[0] != device { + continue + } + + m, err := parseMount(ss) + if err != nil { + return nil, err + } + + // Does this mount also possess statistics information? + if len(ss) > deviceEntryLen { + // Only NFSv3 and v4 are supported for parsing statistics + if m.Type != nfs3Type && m.Type != nfs4Type { + return nil, fmt.Errorf("cannot parse MountStats for fstype %q", m.Type) + } + + statVersion := strings.TrimPrefix(ss[8], statVersionPrefix) + + stats, err := parseMountStatsNFS(s, statVersion) + if err != nil { + return nil, err + } + + m.Stats = stats + } + + mounts = append(mounts, m) + } + + return mounts, s.Err() +} + +// parseMount parses an entry in /proc/[pid]/mountstats in the format: +// device [device] mounted on [mount] with fstype [type] +func parseMount(ss []string) (*Mount, error) { + if len(ss) < deviceEntryLen { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + + // Check for specific words appearing at specific indices to ensure + // the format is consistent with what we expect + format := []struct { + i int + s string + }{ + {i: 0, s: "device"}, + {i: 2, s: "mounted"}, + {i: 3, s: "on"}, + {i: 5, s: "with"}, + {i: 6, s: "fstype"}, + } + + for _, f := range format { + if ss[f.i] != f.s { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + } + + return &Mount{ + Device: ss[1], + Mount: ss[4], + Type: ss[7], + }, nil +} + +// parseMountStatsNFS parses a MountStatsNFS by scanning additional information +// related to NFS statistics. +func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, error) { + // Field indicators for parsing specific types of data + const ( + fieldOpts = "opts:" + fieldAge = "age:" + fieldBytes = "bytes:" + fieldEvents = "events:" + fieldPerOpStats = "per-op" + fieldTransport = "xprt:" + ) + + stats := &MountStatsNFS{ + StatVersion: statVersion, + } + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + break + } + if len(ss) < 2 { + return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + } + + switch ss[0] { + case fieldOpts: + if stats.Opts == nil { + stats.Opts = map[string]string{} + } + for _, opt := range strings.Split(ss[1], ",") { + split := strings.Split(opt, "=") + if len(split) == 2 { + stats.Opts[split[0]] = split[1] + } else { + stats.Opts[opt] = "" + } + } + case fieldAge: + // Age integer is in seconds + d, err := time.ParseDuration(ss[1] + "s") + if err != nil { + return nil, err + } + + stats.Age = d + case fieldBytes: + bstats, err := parseNFSBytesStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Bytes = *bstats + case fieldEvents: + estats, err := parseNFSEventsStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Events = *estats + case fieldTransport: + if len(ss) < 3 { + return nil, fmt.Errorf("not enough information for NFS transport stats: %v", ss) + } + + tstats, err := parseNFSTransportStats(ss[1:], statVersion) + if err != nil { + return nil, err + } + + stats.Transport = *tstats + } + + // When encountering "per-operation statistics", we must break this + // loop and parse them separately to ensure we can terminate parsing + // before reaching another device entry; hence why this 'if' statement + // is not just another switch case + if ss[0] == fieldPerOpStats { + break + } + } + + if err := s.Err(); err != nil { + return nil, err + } + + // NFS per-operation stats appear last before the next device entry + perOpStats, err := parseNFSOperationStats(s) + if err != nil { + return nil, err + } + + stats.Operations = perOpStats + + return stats, nil +} + +// parseNFSBytesStats parses a NFSBytesStats line using an input set of +// integer fields. +func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) { + if len(ss) != fieldBytesLen { + return nil, fmt.Errorf("invalid NFS bytes stats: %v", ss) + } + + ns := make([]uint64, 0, fieldBytesLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSBytesStats{ + Read: ns[0], + Write: ns[1], + DirectRead: ns[2], + DirectWrite: ns[3], + ReadTotal: ns[4], + WriteTotal: ns[5], + ReadPages: ns[6], + WritePages: ns[7], + }, nil +} + +// parseNFSEventsStats parses a NFSEventsStats line using an input set of +// integer fields. +func parseNFSEventsStats(ss []string) (*NFSEventsStats, error) { + if len(ss) != fieldEventsLen { + return nil, fmt.Errorf("invalid NFS events stats: %v", ss) + } + + ns := make([]uint64, 0, fieldEventsLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSEventsStats{ + InodeRevalidate: ns[0], + DnodeRevalidate: ns[1], + DataInvalidate: ns[2], + AttributeInvalidate: ns[3], + VFSOpen: ns[4], + VFSLookup: ns[5], + VFSAccess: ns[6], + VFSUpdatePage: ns[7], + VFSReadPage: ns[8], + VFSReadPages: ns[9], + VFSWritePage: ns[10], + VFSWritePages: ns[11], + VFSGetdents: ns[12], + VFSSetattr: ns[13], + VFSFlush: ns[14], + VFSFsync: ns[15], + VFSLock: ns[16], + VFSFileRelease: ns[17], + CongestionWait: ns[18], + Truncation: ns[19], + WriteExtension: ns[20], + SillyRename: ns[21], + ShortRead: ns[22], + ShortWrite: ns[23], + JukeboxDelay: ns[24], + PNFSRead: ns[25], + PNFSWrite: ns[26], + }, nil +} + +// parseNFSOperationStats parses a slice of NFSOperationStats by scanning +// additional information about per-operation statistics until an empty +// line is reached. +func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { + const ( + // Number of expected fields in each per-operation statistics set + numFields = 9 + ) + + var ops []NFSOperationStats + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + // Must break when reading a blank line after per-operation stats to + // enable top-level function to parse the next device entry + break + } + + if len(ss) != numFields { + return nil, fmt.Errorf("invalid NFS per-operations stats: %v", ss) + } + + // Skip string operation name for integers + ns := make([]uint64, 0, numFields-1) + for _, st := range ss[1:] { + n, err := strconv.ParseUint(st, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + ops = append(ops, NFSOperationStats{ + Operation: strings.TrimSuffix(ss[0], ":"), + Requests: ns[0], + Transmissions: ns[1], + MajorTimeouts: ns[2], + BytesSent: ns[3], + BytesReceived: ns[4], + CumulativeQueueMilliseconds: ns[5], + CumulativeTotalResponseMilliseconds: ns[6], + CumulativeTotalRequestMilliseconds: ns[7], + }) + } + + return ops, s.Err() +} + +// parseNFSTransportStats parses a NFSTransportStats line using an input set of +// integer fields matched to a specific stats version. +func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats, error) { + // Extract the protocol field. It is the only string value in the line + protocol := ss[0] + ss = ss[1:] + + switch statVersion { + case statVersion10: + var expectedLength int + if protocol == "tcp" { + expectedLength = fieldTransport10TCPLen + } else if protocol == "udp" { + expectedLength = fieldTransport10UDPLen + } else { + return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.0 statement: %v", protocol, ss) + } + if len(ss) != expectedLength { + return nil, fmt.Errorf("invalid NFS transport stats 1.0 statement: %v", ss) + } + case statVersion11: + var expectedLength int + if protocol == "tcp" { + expectedLength = fieldTransport11TCPLen + } else if protocol == "udp" { + expectedLength = fieldTransport11UDPLen + } else { + return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.1 statement: %v", protocol, ss) + } + if len(ss) != expectedLength { + return nil, fmt.Errorf("invalid NFS transport stats 1.1 statement: %v", ss) + } + default: + return nil, fmt.Errorf("unrecognized NFS transport stats version: %q", statVersion) + } + + // Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay + // in a v1.0 response. Since the stat length is bigger for TCP stats, we use + // the TCP length here. + // + // Note: slice length must be set to length of v1.1 stats to avoid a panic when + // only v1.0 stats are present. + // See: https://github.com/prometheus/node_exporter/issues/571. + ns := make([]uint64, fieldTransport11TCPLen) + for i, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns[i] = n + } + + // The fields differ depending on the transport protocol (TCP or UDP) + // From https://utcc.utoronto.ca/%7Ecks/space/blog/linux/NFSMountstatsXprt + // + // For the udp RPC transport there is no connection count, connect idle time, + // or idle time (fields #3, #4, and #5); all other fields are the same. So + // we set them to 0 here. + if protocol == "udp" { + ns = append(ns[:2], append(make([]uint64, 3), ns[2:]...)...) + } + + return &NFSTransportStats{ + Protocol: protocol, + Port: ns[0], + Bind: ns[1], + Connect: ns[2], + ConnectIdleTime: ns[3], + IdleTimeSeconds: ns[4], + Sends: ns[5], + Receives: ns[6], + BadTransactionIDs: ns[7], + CumulativeActiveRequests: ns[8], + CumulativeBacklog: ns[9], + MaximumRPCSlotsUsed: ns[10], + CumulativeSendingQueue: ns[11], + CumulativePendingQueue: ns[12], + }, nil +} diff --git a/vendor/github.com/prometheus/procfs/net_dev.go b/vendor/github.com/prometheus/procfs/net_dev.go new file mode 100644 index 00000000..47a710be --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_dev.go @@ -0,0 +1,205 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "errors" + "os" + "sort" + "strconv" + "strings" +) + +// NetDevLine is single line parsed from /proc/net/dev or /proc/[pid]/net/dev. +type NetDevLine struct { + Name string `json:"name"` // The name of the interface. + RxBytes uint64 `json:"rx_bytes"` // Cumulative count of bytes received. + RxPackets uint64 `json:"rx_packets"` // Cumulative count of packets received. + RxErrors uint64 `json:"rx_errors"` // Cumulative count of receive errors encountered. + RxDropped uint64 `json:"rx_dropped"` // Cumulative count of packets dropped while receiving. + RxFIFO uint64 `json:"rx_fifo"` // Cumulative count of FIFO buffer errors. + RxFrame uint64 `json:"rx_frame"` // Cumulative count of packet framing errors. + RxCompressed uint64 `json:"rx_compressed"` // Cumulative count of compressed packets received by the device driver. + RxMulticast uint64 `json:"rx_multicast"` // Cumulative count of multicast frames received by the device driver. + TxBytes uint64 `json:"tx_bytes"` // Cumulative count of bytes transmitted. + TxPackets uint64 `json:"tx_packets"` // Cumulative count of packets transmitted. + TxErrors uint64 `json:"tx_errors"` // Cumulative count of transmit errors encountered. + TxDropped uint64 `json:"tx_dropped"` // Cumulative count of packets dropped while transmitting. + TxFIFO uint64 `json:"tx_fifo"` // Cumulative count of FIFO buffer errors. + TxCollisions uint64 `json:"tx_collisions"` // Cumulative count of collisions detected on the interface. + TxCarrier uint64 `json:"tx_carrier"` // Cumulative count of carrier losses detected by the device driver. + TxCompressed uint64 `json:"tx_compressed"` // Cumulative count of compressed packets transmitted by the device driver. +} + +// NetDev is parsed from /proc/net/dev or /proc/[pid]/net/dev. The map keys +// are interface names. +type NetDev map[string]NetDevLine + +// NetDev returns kernel/system statistics read from /proc/net/dev. +func (fs FS) NetDev() (NetDev, error) { + return newNetDev(fs.proc.Path("net/dev")) +} + +// NetDev returns kernel/system statistics read from /proc/[pid]/net/dev. +func (p Proc) NetDev() (NetDev, error) { + return newNetDev(p.path("net/dev")) +} + +// newNetDev creates a new NetDev from the contents of the given file. +func newNetDev(file string) (NetDev, error) { + f, err := os.Open(file) + if err != nil { + return NetDev{}, err + } + defer f.Close() + + netDev := NetDev{} + s := bufio.NewScanner(f) + for n := 0; s.Scan(); n++ { + // Skip the 2 header lines. + if n < 2 { + continue + } + + line, err := netDev.parseLine(s.Text()) + if err != nil { + return netDev, err + } + + netDev[line.Name] = *line + } + + return netDev, s.Err() +} + +// parseLine parses a single line from the /proc/net/dev file. Header lines +// must be filtered prior to calling this method. +func (netDev NetDev) parseLine(rawLine string) (*NetDevLine, error) { + parts := strings.SplitN(rawLine, ":", 2) + if len(parts) != 2 { + return nil, errors.New("invalid net/dev line, missing colon") + } + fields := strings.Fields(strings.TrimSpace(parts[1])) + + var err error + line := &NetDevLine{} + + // Interface Name + line.Name = strings.TrimSpace(parts[0]) + if line.Name == "" { + return nil, errors.New("invalid net/dev line, empty interface name") + } + + // RX + line.RxBytes, err = strconv.ParseUint(fields[0], 10, 64) + if err != nil { + return nil, err + } + line.RxPackets, err = strconv.ParseUint(fields[1], 10, 64) + if err != nil { + return nil, err + } + line.RxErrors, err = strconv.ParseUint(fields[2], 10, 64) + if err != nil { + return nil, err + } + line.RxDropped, err = strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, err + } + line.RxFIFO, err = strconv.ParseUint(fields[4], 10, 64) + if err != nil { + return nil, err + } + line.RxFrame, err = strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + line.RxCompressed, err = strconv.ParseUint(fields[6], 10, 64) + if err != nil { + return nil, err + } + line.RxMulticast, err = strconv.ParseUint(fields[7], 10, 64) + if err != nil { + return nil, err + } + + // TX + line.TxBytes, err = strconv.ParseUint(fields[8], 10, 64) + if err != nil { + return nil, err + } + line.TxPackets, err = strconv.ParseUint(fields[9], 10, 64) + if err != nil { + return nil, err + } + line.TxErrors, err = strconv.ParseUint(fields[10], 10, 64) + if err != nil { + return nil, err + } + line.TxDropped, err = strconv.ParseUint(fields[11], 10, 64) + if err != nil { + return nil, err + } + line.TxFIFO, err = strconv.ParseUint(fields[12], 10, 64) + if err != nil { + return nil, err + } + line.TxCollisions, err = strconv.ParseUint(fields[13], 10, 64) + if err != nil { + return nil, err + } + line.TxCarrier, err = strconv.ParseUint(fields[14], 10, 64) + if err != nil { + return nil, err + } + line.TxCompressed, err = strconv.ParseUint(fields[15], 10, 64) + if err != nil { + return nil, err + } + + return line, nil +} + +// Total aggregates the values across interfaces and returns a new NetDevLine. +// The Name field will be a sorted comma separated list of interface names. +func (netDev NetDev) Total() NetDevLine { + total := NetDevLine{} + + names := make([]string, 0, len(netDev)) + for _, ifc := range netDev { + names = append(names, ifc.Name) + total.RxBytes += ifc.RxBytes + total.RxPackets += ifc.RxPackets + total.RxErrors += ifc.RxErrors + total.RxDropped += ifc.RxDropped + total.RxFIFO += ifc.RxFIFO + total.RxFrame += ifc.RxFrame + total.RxCompressed += ifc.RxCompressed + total.RxMulticast += ifc.RxMulticast + total.TxBytes += ifc.TxBytes + total.TxPackets += ifc.TxPackets + total.TxErrors += ifc.TxErrors + total.TxDropped += ifc.TxDropped + total.TxFIFO += ifc.TxFIFO + total.TxCollisions += ifc.TxCollisions + total.TxCarrier += ifc.TxCarrier + total.TxCompressed += ifc.TxCompressed + } + sort.Strings(names) + total.Name = strings.Join(names, ", ") + + return total +} diff --git a/vendor/github.com/prometheus/procfs/net_sockstat.go b/vendor/github.com/prometheus/procfs/net_sockstat.go new file mode 100644 index 00000000..f91ef552 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_sockstat.go @@ -0,0 +1,163 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// A NetSockstat contains the output of /proc/net/sockstat{,6} for IPv4 or IPv6, +// respectively. +type NetSockstat struct { + // Used is non-nil for IPv4 sockstat results, but nil for IPv6. + Used *int + Protocols []NetSockstatProtocol +} + +// A NetSockstatProtocol contains statistics about a given socket protocol. +// Pointer fields indicate that the value may or may not be present on any +// given protocol. +type NetSockstatProtocol struct { + Protocol string + InUse int + Orphan *int + TW *int + Alloc *int + Mem *int + Memory *int +} + +// NetSockstat retrieves IPv4 socket statistics. +func (fs FS) NetSockstat() (*NetSockstat, error) { + return readSockstat(fs.proc.Path("net", "sockstat")) +} + +// NetSockstat6 retrieves IPv6 socket statistics. +// +// If IPv6 is disabled on this kernel, the returned error can be checked with +// os.IsNotExist. +func (fs FS) NetSockstat6() (*NetSockstat, error) { + return readSockstat(fs.proc.Path("net", "sockstat6")) +} + +// readSockstat opens and parses a NetSockstat from the input file. +func readSockstat(name string) (*NetSockstat, error) { + // This file is small and can be read with one syscall. + b, err := util.ReadFileNoStat(name) + if err != nil { + // Do not wrap this error so the caller can detect os.IsNotExist and + // similar conditions. + return nil, err + } + + stat, err := parseSockstat(bytes.NewReader(b)) + if err != nil { + return nil, fmt.Errorf("failed to read sockstats from %q: %v", name, err) + } + + return stat, nil +} + +// parseSockstat reads the contents of a sockstat file and parses a NetSockstat. +func parseSockstat(r io.Reader) (*NetSockstat, error) { + var stat NetSockstat + s := bufio.NewScanner(r) + for s.Scan() { + // Expect a minimum of a protocol and one key/value pair. + fields := strings.Split(s.Text(), " ") + if len(fields) < 3 { + return nil, fmt.Errorf("malformed sockstat line: %q", s.Text()) + } + + // The remaining fields are key/value pairs. + kvs, err := parseSockstatKVs(fields[1:]) + if err != nil { + return nil, fmt.Errorf("error parsing sockstat key/value pairs from %q: %v", s.Text(), err) + } + + // The first field is the protocol. We must trim its colon suffix. + proto := strings.TrimSuffix(fields[0], ":") + switch proto { + case "sockets": + // Special case: IPv4 has a sockets "used" key/value pair that we + // embed at the top level of the structure. + used := kvs["used"] + stat.Used = &used + default: + // Parse all other lines as individual protocols. + nsp := parseSockstatProtocol(kvs) + nsp.Protocol = proto + stat.Protocols = append(stat.Protocols, nsp) + } + } + + if err := s.Err(); err != nil { + return nil, err + } + + return &stat, nil +} + +// parseSockstatKVs parses a string slice into a map of key/value pairs. +func parseSockstatKVs(kvs []string) (map[string]int, error) { + if len(kvs)%2 != 0 { + return nil, errors.New("odd number of fields in key/value pairs") + } + + // Iterate two values at a time to gather key/value pairs. + out := make(map[string]int, len(kvs)/2) + for i := 0; i < len(kvs); i += 2 { + vp := util.NewValueParser(kvs[i+1]) + out[kvs[i]] = vp.Int() + + if err := vp.Err(); err != nil { + return nil, err + } + } + + return out, nil +} + +// parseSockstatProtocol parses a NetSockstatProtocol from the input kvs map. +func parseSockstatProtocol(kvs map[string]int) NetSockstatProtocol { + var nsp NetSockstatProtocol + for k, v := range kvs { + // Capture the range variable to ensure we get unique pointers for + // each of the optional fields. + v := v + switch k { + case "inuse": + nsp.InUse = v + case "orphan": + nsp.Orphan = &v + case "tw": + nsp.TW = &v + case "alloc": + nsp.Alloc = &v + case "mem": + nsp.Mem = &v + case "memory": + nsp.Memory = &v + } + } + + return nsp +} diff --git a/vendor/github.com/prometheus/procfs/net_softnet.go b/vendor/github.com/prometheus/procfs/net_softnet.go new file mode 100644 index 00000000..6fcad20a --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_softnet.go @@ -0,0 +1,91 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "io/ioutil" + "strconv" + "strings" +) + +// For the proc file format details, +// see https://elixir.bootlin.com/linux/v4.17/source/net/core/net-procfs.c#L162 +// and https://elixir.bootlin.com/linux/v4.17/source/include/linux/netdevice.h#L2810. + +// SoftnetEntry contains a single row of data from /proc/net/softnet_stat +type SoftnetEntry struct { + // Number of processed packets + Processed uint + // Number of dropped packets + Dropped uint + // Number of times processing packets ran out of quota + TimeSqueezed uint +} + +// GatherSoftnetStats reads /proc/net/softnet_stat, parse the relevant columns, +// and then return a slice of SoftnetEntry's. +func (fs FS) GatherSoftnetStats() ([]SoftnetEntry, error) { + data, err := ioutil.ReadFile(fs.proc.Path("net/softnet_stat")) + if err != nil { + return nil, fmt.Errorf("error reading softnet %s: %s", fs.proc.Path("net/softnet_stat"), err) + } + + return parseSoftnetEntries(data) +} + +func parseSoftnetEntries(data []byte) ([]SoftnetEntry, error) { + lines := strings.Split(string(data), "\n") + entries := make([]SoftnetEntry, 0) + var err error + const ( + expectedColumns = 11 + ) + for _, line := range lines { + columns := strings.Fields(line) + width := len(columns) + if width == 0 { + continue + } + if width != expectedColumns { + return []SoftnetEntry{}, fmt.Errorf("%d columns were detected, but %d were expected", width, expectedColumns) + } + var entry SoftnetEntry + if entry, err = parseSoftnetEntry(columns); err != nil { + return []SoftnetEntry{}, err + } + entries = append(entries, entry) + } + + return entries, nil +} + +func parseSoftnetEntry(columns []string) (SoftnetEntry, error) { + var err error + var processed, dropped, timeSqueezed uint64 + if processed, err = strconv.ParseUint(columns[0], 16, 32); err != nil { + return SoftnetEntry{}, fmt.Errorf("Unable to parse column 0: %s", err) + } + if dropped, err = strconv.ParseUint(columns[1], 16, 32); err != nil { + return SoftnetEntry{}, fmt.Errorf("Unable to parse column 1: %s", err) + } + if timeSqueezed, err = strconv.ParseUint(columns[2], 16, 32); err != nil { + return SoftnetEntry{}, fmt.Errorf("Unable to parse column 2: %s", err) + } + return SoftnetEntry{ + Processed: uint(processed), + Dropped: uint(dropped), + TimeSqueezed: uint(timeSqueezed), + }, nil +} diff --git a/vendor/github.com/prometheus/procfs/net_unix.go b/vendor/github.com/prometheus/procfs/net_unix.go new file mode 100644 index 00000000..93bd58f8 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_unix.go @@ -0,0 +1,271 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "errors" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// For the proc file format details, +// see https://elixir.bootlin.com/linux/v4.17/source/net/unix/af_unix.c#L2815 +// and https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/net.h#L48. + +const ( + netUnixKernelPtrIdx = iota + netUnixRefCountIdx + _ + netUnixFlagsIdx + netUnixTypeIdx + netUnixStateIdx + netUnixInodeIdx + + // Inode and Path are optional. + netUnixStaticFieldsCnt = 6 +) + +const ( + netUnixTypeStream = 1 + netUnixTypeDgram = 2 + netUnixTypeSeqpacket = 5 + + netUnixFlagListen = 1 << 16 + + netUnixStateUnconnected = 1 + netUnixStateConnecting = 2 + netUnixStateConnected = 3 + netUnixStateDisconnected = 4 +) + +var errInvalidKernelPtrFmt = errors.New("Invalid Num(the kernel table slot number) format") + +// NetUnixType is the type of the type field. +type NetUnixType uint64 + +// NetUnixFlags is the type of the flags field. +type NetUnixFlags uint64 + +// NetUnixState is the type of the state field. +type NetUnixState uint64 + +// NetUnixLine represents a line of /proc/net/unix. +type NetUnixLine struct { + KernelPtr string + RefCount uint64 + Protocol uint64 + Flags NetUnixFlags + Type NetUnixType + State NetUnixState + Inode uint64 + Path string +} + +// NetUnix holds the data read from /proc/net/unix. +type NetUnix struct { + Rows []*NetUnixLine +} + +// NewNetUnix returns data read from /proc/net/unix. +func NewNetUnix() (*NetUnix, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewNetUnix() +} + +// NewNetUnix returns data read from /proc/net/unix. +func (fs FS) NewNetUnix() (*NetUnix, error) { + return NewNetUnixByPath(fs.proc.Path("net/unix")) +} + +// NewNetUnixByPath returns data read from /proc/net/unix by file path. +// It might returns an error with partial parsed data, if an error occur after some data parsed. +func NewNetUnixByPath(path string) (*NetUnix, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + return NewNetUnixByReader(f) +} + +// NewNetUnixByReader returns data read from /proc/net/unix by a reader. +// It might returns an error with partial parsed data, if an error occur after some data parsed. +func NewNetUnixByReader(reader io.Reader) (*NetUnix, error) { + nu := &NetUnix{ + Rows: make([]*NetUnixLine, 0, 32), + } + scanner := bufio.NewScanner(reader) + // Omit the header line. + scanner.Scan() + header := scanner.Text() + // From the man page of proc(5), it does not contain an Inode field, + // but in actually it exists. + // This code works for both cases. + hasInode := strings.Contains(header, "Inode") + + minFieldsCnt := netUnixStaticFieldsCnt + if hasInode { + minFieldsCnt++ + } + for scanner.Scan() { + line := scanner.Text() + item, err := nu.parseLine(line, hasInode, minFieldsCnt) + if err != nil { + return nu, err + } + nu.Rows = append(nu.Rows, item) + } + + return nu, scanner.Err() +} + +func (u *NetUnix) parseLine(line string, hasInode bool, minFieldsCnt int) (*NetUnixLine, error) { + fields := strings.Fields(line) + fieldsLen := len(fields) + if fieldsLen < minFieldsCnt { + return nil, fmt.Errorf( + "Parse Unix domain failed: expect at least %d fields but got %d", + minFieldsCnt, fieldsLen) + } + kernelPtr, err := u.parseKernelPtr(fields[netUnixKernelPtrIdx]) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain num(%s) failed: %s", fields[netUnixKernelPtrIdx], err) + } + users, err := u.parseUsers(fields[netUnixRefCountIdx]) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain ref count(%s) failed: %s", fields[netUnixRefCountIdx], err) + } + flags, err := u.parseFlags(fields[netUnixFlagsIdx]) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain flags(%s) failed: %s", fields[netUnixFlagsIdx], err) + } + typ, err := u.parseType(fields[netUnixTypeIdx]) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain type(%s) failed: %s", fields[netUnixTypeIdx], err) + } + state, err := u.parseState(fields[netUnixStateIdx]) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain state(%s) failed: %s", fields[netUnixStateIdx], err) + } + var inode uint64 + if hasInode { + inodeStr := fields[netUnixInodeIdx] + inode, err = u.parseInode(inodeStr) + if err != nil { + return nil, fmt.Errorf("Parse Unix domain inode(%s) failed: %s", inodeStr, err) + } + } + + nuLine := &NetUnixLine{ + KernelPtr: kernelPtr, + RefCount: users, + Type: typ, + Flags: flags, + State: state, + Inode: inode, + } + + // Path field is optional. + if fieldsLen > minFieldsCnt { + pathIdx := netUnixInodeIdx + 1 + if !hasInode { + pathIdx-- + } + nuLine.Path = fields[pathIdx] + } + + return nuLine, nil +} + +func (u NetUnix) parseKernelPtr(str string) (string, error) { + if !strings.HasSuffix(str, ":") { + return "", errInvalidKernelPtrFmt + } + return str[:len(str)-1], nil +} + +func (u NetUnix) parseUsers(hexStr string) (uint64, error) { + return strconv.ParseUint(hexStr, 16, 32) +} + +func (u NetUnix) parseType(hexStr string) (NetUnixType, error) { + typ, err := strconv.ParseUint(hexStr, 16, 16) + if err != nil { + return 0, err + } + return NetUnixType(typ), nil +} + +func (u NetUnix) parseFlags(hexStr string) (NetUnixFlags, error) { + flags, err := strconv.ParseUint(hexStr, 16, 32) + if err != nil { + return 0, err + } + return NetUnixFlags(flags), nil +} + +func (u NetUnix) parseState(hexStr string) (NetUnixState, error) { + st, err := strconv.ParseInt(hexStr, 16, 8) + if err != nil { + return 0, err + } + return NetUnixState(st), nil +} + +func (u NetUnix) parseInode(inodeStr string) (uint64, error) { + return strconv.ParseUint(inodeStr, 10, 64) +} + +func (t NetUnixType) String() string { + switch t { + case netUnixTypeStream: + return "stream" + case netUnixTypeDgram: + return "dgram" + case netUnixTypeSeqpacket: + return "seqpacket" + } + return "unknown" +} + +func (f NetUnixFlags) String() string { + switch f { + case netUnixFlagListen: + return "listen" + default: + return "default" + } +} + +func (s NetUnixState) String() string { + switch s { + case netUnixStateUnconnected: + return "unconnected" + case netUnixStateConnecting: + return "connecting" + case netUnixStateConnected: + return "connected" + case netUnixStateDisconnected: + return "disconnected" + } + return "unknown" +} diff --git a/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/prometheus/procfs/proc.go new file mode 100644 index 00000000..330e472c --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc.go @@ -0,0 +1,298 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/fs" + "github.com/prometheus/procfs/internal/util" +) + +// Proc provides information about a running process. +type Proc struct { + // The process ID. + PID int + + fs fs.FS +} + +// Procs represents a list of Proc structs. +type Procs []Proc + +func (p Procs) Len() int { return len(p) } +func (p Procs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p Procs) Less(i, j int) bool { return p[i].PID < p[j].PID } + +// Self returns a process for the current process read via /proc/self. +func Self() (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.Self() +} + +// NewProc returns a process for the given pid under /proc. +func NewProc(pid int) (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.Proc(pid) +} + +// AllProcs returns a list of all currently available processes under /proc. +func AllProcs() (Procs, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Procs{}, err + } + return fs.AllProcs() +} + +// Self returns a process for the current process. +func (fs FS) Self() (Proc, error) { + p, err := os.Readlink(fs.proc.Path("self")) + if err != nil { + return Proc{}, err + } + pid, err := strconv.Atoi(strings.Replace(p, string(fs.proc), "", -1)) + if err != nil { + return Proc{}, err + } + return fs.Proc(pid) +} + +// NewProc returns a process for the given pid. +// +// Deprecated: use fs.Proc() instead +func (fs FS) NewProc(pid int) (Proc, error) { + return fs.Proc(pid) +} + +// Proc returns a process for the given pid. +func (fs FS) Proc(pid int) (Proc, error) { + if _, err := os.Stat(fs.proc.Path(strconv.Itoa(pid))); err != nil { + return Proc{}, err + } + return Proc{PID: pid, fs: fs.proc}, nil +} + +// AllProcs returns a list of all currently available processes. +func (fs FS) AllProcs() (Procs, error) { + d, err := os.Open(fs.proc.Path()) + if err != nil { + return Procs{}, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return Procs{}, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + p := Procs{} + for _, n := range names { + pid, err := strconv.ParseInt(n, 10, 64) + if err != nil { + continue + } + p = append(p, Proc{PID: int(pid), fs: fs.proc}) + } + + return p, nil +} + +// CmdLine returns the command line of a process. +func (p Proc) CmdLine() ([]string, error) { + data, err := util.ReadFileNoStat(p.path("cmdline")) + if err != nil { + return nil, err + } + + if len(data) < 1 { + return []string{}, nil + } + + return strings.Split(string(bytes.TrimRight(data, string("\x00"))), string(byte(0))), nil +} + +// Comm returns the command name of a process. +func (p Proc) Comm() (string, error) { + data, err := util.ReadFileNoStat(p.path("comm")) + if err != nil { + return "", err + } + + return strings.TrimSpace(string(data)), nil +} + +// Executable returns the absolute path of the executable command of a process. +func (p Proc) Executable() (string, error) { + exe, err := os.Readlink(p.path("exe")) + if os.IsNotExist(err) { + return "", nil + } + + return exe, err +} + +// Cwd returns the absolute path to the current working directory of the process. +func (p Proc) Cwd() (string, error) { + wd, err := os.Readlink(p.path("cwd")) + if os.IsNotExist(err) { + return "", nil + } + + return wd, err +} + +// RootDir returns the absolute path to the process's root directory (as set by chroot) +func (p Proc) RootDir() (string, error) { + rdir, err := os.Readlink(p.path("root")) + if os.IsNotExist(err) { + return "", nil + } + + return rdir, err +} + +// FileDescriptors returns the currently open file descriptors of a process. +func (p Proc) FileDescriptors() ([]uintptr, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + fds := make([]uintptr, len(names)) + for i, n := range names { + fd, err := strconv.ParseInt(n, 10, 32) + if err != nil { + return nil, fmt.Errorf("could not parse fd %s: %s", n, err) + } + fds[i] = uintptr(fd) + } + + return fds, nil +} + +// FileDescriptorTargets returns the targets of all file descriptors of a process. +// If a file descriptor is not a symlink to a file (like a socket), that value will be the empty string. +func (p Proc) FileDescriptorTargets() ([]string, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + targets := make([]string, len(names)) + + for i, name := range names { + target, err := os.Readlink(p.path("fd", name)) + if err == nil { + targets[i] = target + } + } + + return targets, nil +} + +// FileDescriptorsLen returns the number of currently open file descriptors of +// a process. +func (p Proc) FileDescriptorsLen() (int, error) { + fds, err := p.fileDescriptors() + if err != nil { + return 0, err + } + + return len(fds), nil +} + +// MountStats retrieves statistics and configuration for mount points in a +// process's namespace. +func (p Proc) MountStats() ([]*Mount, error) { + f, err := os.Open(p.path("mountstats")) + if err != nil { + return nil, err + } + defer f.Close() + + return parseMountStats(f) +} + +// MountInfo retrieves mount information for mount points in a +// process's namespace. +// It supplies information missing in `/proc/self/mounts` and +// fixes various other problems with that file too. +func (p Proc) MountInfo() ([]*MountInfo, error) { + data, err := util.ReadFileNoStat(p.path("mountinfo")) + if err != nil { + return nil, err + } + return parseMountInfo(data) +} + +func (p Proc) fileDescriptors() ([]string, error) { + d, err := os.Open(p.path("fd")) + if err != nil { + return nil, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return nil, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + return names, nil +} + +func (p Proc) path(pa ...string) string { + return p.fs.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) +} + +// FileDescriptorsInfo retrieves information about all file descriptors of +// the process. +func (p Proc) FileDescriptorsInfo() (ProcFDInfos, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + var fdinfos ProcFDInfos + + for _, n := range names { + fdinfo, err := p.FDInfo(n) + if err != nil { + continue + } + fdinfos = append(fdinfos, *fdinfo) + } + + return fdinfos, nil +} + +// Schedstat returns task scheduling information for the process. +func (p Proc) Schedstat() (ProcSchedstat, error) { + contents, err := ioutil.ReadFile(p.path("schedstat")) + if err != nil { + return ProcSchedstat{}, err + } + return parseProcSchedstat(string(contents)) +} diff --git a/vendor/github.com/prometheus/procfs/proc_environ.go b/vendor/github.com/prometheus/procfs/proc_environ.go new file mode 100644 index 00000000..6134b358 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_environ.go @@ -0,0 +1,37 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Environ reads process environments from /proc//environ +func (p Proc) Environ() ([]string, error) { + environments := make([]string, 0) + + data, err := util.ReadFileNoStat(p.path("environ")) + if err != nil { + return environments, err + } + + environments = strings.Split(string(data), "\000") + if len(environments) > 0 { + environments = environments[:len(environments)-1] + } + + return environments, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_fdinfo.go b/vendor/github.com/prometheus/procfs/proc_fdinfo.go new file mode 100644 index 00000000..4e7597f8 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_fdinfo.go @@ -0,0 +1,125 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "regexp" + + "github.com/prometheus/procfs/internal/util" +) + +// Regexp variables +var ( + rPos = regexp.MustCompile(`^pos:\s+(\d+)$`) + rFlags = regexp.MustCompile(`^flags:\s+(\d+)$`) + rMntID = regexp.MustCompile(`^mnt_id:\s+(\d+)$`) + rInotify = regexp.MustCompile(`^inotify`) +) + +// ProcFDInfo contains represents file descriptor information. +type ProcFDInfo struct { + // File descriptor + FD string + // File offset + Pos string + // File access mode and status flags + Flags string + // Mount point ID + MntID string + // List of inotify lines (structed) in the fdinfo file (kernel 3.8+ only) + InotifyInfos []InotifyInfo +} + +// FDInfo constructor. On kernels older than 3.8, InotifyInfos will always be empty. +func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) { + data, err := util.ReadFileNoStat(p.path("fdinfo", fd)) + if err != nil { + return nil, err + } + + var text, pos, flags, mntid string + var inotify []InotifyInfo + + scanner := bufio.NewScanner(bytes.NewReader(data)) + for scanner.Scan() { + text = scanner.Text() + if rPos.MatchString(text) { + pos = rPos.FindStringSubmatch(text)[1] + } else if rFlags.MatchString(text) { + flags = rFlags.FindStringSubmatch(text)[1] + } else if rMntID.MatchString(text) { + mntid = rMntID.FindStringSubmatch(text)[1] + } else if rInotify.MatchString(text) { + newInotify, err := parseInotifyInfo(text) + if err != nil { + return nil, err + } + inotify = append(inotify, *newInotify) + } + } + + i := &ProcFDInfo{ + FD: fd, + Pos: pos, + Flags: flags, + MntID: mntid, + InotifyInfos: inotify, + } + + return i, nil +} + +// InotifyInfo represents a single inotify line in the fdinfo file. +type InotifyInfo struct { + // Watch descriptor number + WD string + // Inode number + Ino string + // Device ID + Sdev string + // Mask of events being monitored + Mask string +} + +// InotifyInfo constructor. Only available on kernel 3.8+. +func parseInotifyInfo(line string) (*InotifyInfo, error) { + r := regexp.MustCompile(`^inotify\s+wd:([0-9a-f]+)\s+ino:([0-9a-f]+)\s+sdev:([0-9a-f]+)\s+mask:([0-9a-f]+)`) + m := r.FindStringSubmatch(line) + i := &InotifyInfo{ + WD: m[1], + Ino: m[2], + Sdev: m[3], + Mask: m[4], + } + return i, nil +} + +// ProcFDInfos represents a list of ProcFDInfo structs. +type ProcFDInfos []ProcFDInfo + +func (p ProcFDInfos) Len() int { return len(p) } +func (p ProcFDInfos) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p ProcFDInfos) Less(i, j int) bool { return p[i].FD < p[j].FD } + +// InotifyWatchLen returns the total number of inotify watches +func (p ProcFDInfos) InotifyWatchLen() (int, error) { + length := 0 + for _, f := range p { + length += len(f.InotifyInfos) + } + + return length, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_io.go b/vendor/github.com/prometheus/procfs/proc_io.go new file mode 100644 index 00000000..776f3497 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_io.go @@ -0,0 +1,59 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + + "github.com/prometheus/procfs/internal/util" +) + +// ProcIO models the content of /proc//io. +type ProcIO struct { + // Chars read. + RChar uint64 + // Chars written. + WChar uint64 + // Read syscalls. + SyscR uint64 + // Write syscalls. + SyscW uint64 + // Bytes read. + ReadBytes uint64 + // Bytes written. + WriteBytes uint64 + // Bytes written, but taking into account truncation. See + // Documentation/filesystems/proc.txt in the kernel sources for + // detailed explanation. + CancelledWriteBytes int64 +} + +// IO creates a new ProcIO instance from a given Proc instance. +func (p Proc) IO() (ProcIO, error) { + pio := ProcIO{} + + data, err := util.ReadFileNoStat(p.path("io")) + if err != nil { + return pio, err + } + + ioFormat := "rchar: %d\nwchar: %d\nsyscr: %d\nsyscw: %d\n" + + "read_bytes: %d\nwrite_bytes: %d\n" + + "cancelled_write_bytes: %d\n" + + _, err = fmt.Sscanf(string(data), ioFormat, &pio.RChar, &pio.WChar, &pio.SyscR, + &pio.SyscW, &pio.ReadBytes, &pio.WriteBytes, &pio.CancelledWriteBytes) + + return pio, err +} diff --git a/vendor/github.com/prometheus/procfs/proc_limits.go b/vendor/github.com/prometheus/procfs/proc_limits.go new file mode 100644 index 00000000..91ee24df --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_limits.go @@ -0,0 +1,157 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "os" + "regexp" + "strconv" +) + +// ProcLimits represents the soft limits for each of the process's resource +// limits. For more information see getrlimit(2): +// http://man7.org/linux/man-pages/man2/getrlimit.2.html. +type ProcLimits struct { + // CPU time limit in seconds. + CPUTime int64 + // Maximum size of files that the process may create. + FileSize int64 + // Maximum size of the process's data segment (initialized data, + // uninitialized data, and heap). + DataSize int64 + // Maximum size of the process stack in bytes. + StackSize int64 + // Maximum size of a core file. + CoreFileSize int64 + // Limit of the process's resident set in pages. + ResidentSet int64 + // Maximum number of processes that can be created for the real user ID of + // the calling process. + Processes int64 + // Value one greater than the maximum file descriptor number that can be + // opened by this process. + OpenFiles int64 + // Maximum number of bytes of memory that may be locked into RAM. + LockedMemory int64 + // Maximum size of the process's virtual memory address space in bytes. + AddressSpace int64 + // Limit on the combined number of flock(2) locks and fcntl(2) leases that + // this process may establish. + FileLocks int64 + // Limit of signals that may be queued for the real user ID of the calling + // process. + PendingSignals int64 + // Limit on the number of bytes that can be allocated for POSIX message + // queues for the real user ID of the calling process. + MsqqueueSize int64 + // Limit of the nice priority set using setpriority(2) or nice(2). + NicePriority int64 + // Limit of the real-time priority set using sched_setscheduler(2) or + // sched_setparam(2). + RealtimePriority int64 + // Limit (in microseconds) on the amount of CPU time that a process + // scheduled under a real-time scheduling policy may consume without making + // a blocking system call. + RealtimeTimeout int64 +} + +const ( + limitsFields = 3 + limitsUnlimited = "unlimited" +) + +var ( + limitsDelimiter = regexp.MustCompile(" +") +) + +// NewLimits returns the current soft limits of the process. +// +// Deprecated: use p.Limits() instead +func (p Proc) NewLimits() (ProcLimits, error) { + return p.Limits() +} + +// Limits returns the current soft limits of the process. +func (p Proc) Limits() (ProcLimits, error) { + f, err := os.Open(p.path("limits")) + if err != nil { + return ProcLimits{}, err + } + defer f.Close() + + var ( + l = ProcLimits{} + s = bufio.NewScanner(f) + ) + for s.Scan() { + fields := limitsDelimiter.Split(s.Text(), limitsFields) + if len(fields) != limitsFields { + return ProcLimits{}, fmt.Errorf( + "couldn't parse %s line %s", f.Name(), s.Text()) + } + + switch fields[0] { + case "Max cpu time": + l.CPUTime, err = parseInt(fields[1]) + case "Max file size": + l.FileSize, err = parseInt(fields[1]) + case "Max data size": + l.DataSize, err = parseInt(fields[1]) + case "Max stack size": + l.StackSize, err = parseInt(fields[1]) + case "Max core file size": + l.CoreFileSize, err = parseInt(fields[1]) + case "Max resident set": + l.ResidentSet, err = parseInt(fields[1]) + case "Max processes": + l.Processes, err = parseInt(fields[1]) + case "Max open files": + l.OpenFiles, err = parseInt(fields[1]) + case "Max locked memory": + l.LockedMemory, err = parseInt(fields[1]) + case "Max address space": + l.AddressSpace, err = parseInt(fields[1]) + case "Max file locks": + l.FileLocks, err = parseInt(fields[1]) + case "Max pending signals": + l.PendingSignals, err = parseInt(fields[1]) + case "Max msgqueue size": + l.MsqqueueSize, err = parseInt(fields[1]) + case "Max nice priority": + l.NicePriority, err = parseInt(fields[1]) + case "Max realtime priority": + l.RealtimePriority, err = parseInt(fields[1]) + case "Max realtime timeout": + l.RealtimeTimeout, err = parseInt(fields[1]) + } + if err != nil { + return ProcLimits{}, err + } + } + + return l, s.Err() +} + +func parseInt(s string) (int64, error) { + if s == limitsUnlimited { + return -1, nil + } + i, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return 0, fmt.Errorf("couldn't parse value %s: %s", s, err) + } + return i, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_ns.go b/vendor/github.com/prometheus/procfs/proc_ns.go new file mode 100644 index 00000000..c66740ff --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_ns.go @@ -0,0 +1,68 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "os" + "strconv" + "strings" +) + +// Namespace represents a single namespace of a process. +type Namespace struct { + Type string // Namespace type. + Inode uint32 // Inode number of the namespace. If two processes are in the same namespace their inodes will match. +} + +// Namespaces contains all of the namespaces that the process is contained in. +type Namespaces map[string]Namespace + +// Namespaces reads from /proc//ns/* to get the namespaces of which the +// process is a member. +func (p Proc) Namespaces() (Namespaces, error) { + d, err := os.Open(p.path("ns")) + if err != nil { + return nil, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return nil, fmt.Errorf("failed to read contents of ns dir: %v", err) + } + + ns := make(Namespaces, len(names)) + for _, name := range names { + target, err := os.Readlink(p.path("ns", name)) + if err != nil { + return nil, err + } + + fields := strings.SplitN(target, ":", 2) + if len(fields) != 2 { + return nil, fmt.Errorf("failed to parse namespace type and inode from '%v'", target) + } + + typ := fields[0] + inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse inode from '%v': %v", fields[1], err) + } + + ns[name] = Namespace{typ, uint32(inode)} + } + + return ns, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_psi.go b/vendor/github.com/prometheus/procfs/proc_psi.go new file mode 100644 index 00000000..0d7bee54 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_psi.go @@ -0,0 +1,100 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +// The PSI / pressure interface is described at +// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/accounting/psi.txt +// Each resource (cpu, io, memory, ...) is exposed as a single file. +// Each file may contain up to two lines, one for "some" pressure and one for "full" pressure. +// Each line contains several averages (over n seconds) and a total in µs. +// +// Example io pressure file: +// > some avg10=0.06 avg60=0.21 avg300=0.99 total=8537362 +// > full avg10=0.00 avg60=0.13 avg300=0.96 total=8183134 + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +const lineFormat = "avg10=%f avg60=%f avg300=%f total=%d" + +// PSILine is a single line of values as returned by /proc/pressure/* +// The Avg entries are averages over n seconds, as a percentage +// The Total line is in microseconds +type PSILine struct { + Avg10 float64 + Avg60 float64 + Avg300 float64 + Total uint64 +} + +// PSIStats represent pressure stall information from /proc/pressure/* +// Some indicates the share of time in which at least some tasks are stalled +// Full indicates the share of time in which all non-idle tasks are stalled simultaneously +type PSIStats struct { + Some *PSILine + Full *PSILine +} + +// PSIStatsForResource reads pressure stall information for the specified +// resource from /proc/pressure/. At time of writing this can be +// either "cpu", "memory" or "io". +func (fs FS) PSIStatsForResource(resource string) (PSIStats, error) { + data, err := util.ReadFileNoStat(fs.proc.Path(fmt.Sprintf("%s/%s", "pressure", resource))) + if err != nil { + return PSIStats{}, fmt.Errorf("psi_stats: unavailable for %s", resource) + } + + return parsePSIStats(resource, bytes.NewReader(data)) +} + +// parsePSIStats parses the specified file for pressure stall information +func parsePSIStats(resource string, r io.Reader) (PSIStats, error) { + psiStats := PSIStats{} + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + l := scanner.Text() + prefix := strings.Split(l, " ")[0] + switch prefix { + case "some": + psi := PSILine{} + _, err := fmt.Sscanf(l, fmt.Sprintf("some %s", lineFormat), &psi.Avg10, &psi.Avg60, &psi.Avg300, &psi.Total) + if err != nil { + return PSIStats{}, err + } + psiStats.Some = &psi + case "full": + psi := PSILine{} + _, err := fmt.Sscanf(l, fmt.Sprintf("full %s", lineFormat), &psi.Avg10, &psi.Avg60, &psi.Avg300, &psi.Total) + if err != nil { + return PSIStats{}, err + } + psiStats.Full = &psi + default: + // If we encounter a line with an unknown prefix, ignore it and move on + // Should new measurement types be added in the future we'll simply ignore them instead + // of erroring on retrieval + continue + } + } + + return psiStats, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/prometheus/procfs/proc_stat.go new file mode 100644 index 00000000..4517d2e9 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_stat.go @@ -0,0 +1,192 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bytes" + "fmt" + "os" + + "github.com/prometheus/procfs/internal/fs" + "github.com/prometheus/procfs/internal/util" +) + +// Originally, this USER_HZ value was dynamically retrieved via a sysconf call +// which required cgo. However, that caused a lot of problems regarding +// cross-compilation. Alternatives such as running a binary to determine the +// value, or trying to derive it in some other way were all problematic. After +// much research it was determined that USER_HZ is actually hardcoded to 100 on +// all Go-supported platforms as of the time of this writing. This is why we +// decided to hardcode it here as well. It is not impossible that there could +// be systems with exceptions, but they should be very exotic edge cases, and +// in that case, the worst outcome will be two misreported metrics. +// +// See also the following discussions: +// +// - https://github.com/prometheus/node_exporter/issues/52 +// - https://github.com/prometheus/procfs/pull/2 +// - http://stackoverflow.com/questions/17410841/how-does-user-hz-solve-the-jiffy-scaling-issue +const userHZ = 100 + +// ProcStat provides status information about the process, +// read from /proc/[pid]/stat. +type ProcStat struct { + // The process ID. + PID int + // The filename of the executable. + Comm string + // The process state. + State string + // The PID of the parent of this process. + PPID int + // The process group ID of the process. + PGRP int + // The session ID of the process. + Session int + // The controlling terminal of the process. + TTY int + // The ID of the foreground process group of the controlling terminal of + // the process. + TPGID int + // The kernel flags word of the process. + Flags uint + // The number of minor faults the process has made which have not required + // loading a memory page from disk. + MinFlt uint + // The number of minor faults that the process's waited-for children have + // made. + CMinFlt uint + // The number of major faults the process has made which have required + // loading a memory page from disk. + MajFlt uint + // The number of major faults that the process's waited-for children have + // made. + CMajFlt uint + // Amount of time that this process has been scheduled in user mode, + // measured in clock ticks. + UTime uint + // Amount of time that this process has been scheduled in kernel mode, + // measured in clock ticks. + STime uint + // Amount of time that this process's waited-for children have been + // scheduled in user mode, measured in clock ticks. + CUTime uint + // Amount of time that this process's waited-for children have been + // scheduled in kernel mode, measured in clock ticks. + CSTime uint + // For processes running a real-time scheduling policy, this is the negated + // scheduling priority, minus one. + Priority int + // The nice value, a value in the range 19 (low priority) to -20 (high + // priority). + Nice int + // Number of threads in this process. + NumThreads int + // The time the process started after system boot, the value is expressed + // in clock ticks. + Starttime uint64 + // Virtual memory size in bytes. + VSize uint + // Resident set size in pages. + RSS int + + proc fs.FS +} + +// NewStat returns the current status information of the process. +// +// Deprecated: use p.Stat() instead +func (p Proc) NewStat() (ProcStat, error) { + return p.Stat() +} + +// Stat returns the current status information of the process. +func (p Proc) Stat() (ProcStat, error) { + data, err := util.ReadFileNoStat(p.path("stat")) + if err != nil { + return ProcStat{}, err + } + + var ( + ignore int + + s = ProcStat{PID: p.PID, proc: p.fs} + l = bytes.Index(data, []byte("(")) + r = bytes.LastIndex(data, []byte(")")) + ) + + if l < 0 || r < 0 { + return ProcStat{}, fmt.Errorf( + "unexpected format, couldn't extract comm: %s", + data, + ) + } + + s.Comm = string(data[l+1 : r]) + _, err = fmt.Fscan( + bytes.NewBuffer(data[r+2:]), + &s.State, + &s.PPID, + &s.PGRP, + &s.Session, + &s.TTY, + &s.TPGID, + &s.Flags, + &s.MinFlt, + &s.CMinFlt, + &s.MajFlt, + &s.CMajFlt, + &s.UTime, + &s.STime, + &s.CUTime, + &s.CSTime, + &s.Priority, + &s.Nice, + &s.NumThreads, + &ignore, + &s.Starttime, + &s.VSize, + &s.RSS, + ) + if err != nil { + return ProcStat{}, err + } + + return s, nil +} + +// VirtualMemory returns the virtual memory size in bytes. +func (s ProcStat) VirtualMemory() uint { + return s.VSize +} + +// ResidentMemory returns the resident memory size in bytes. +func (s ProcStat) ResidentMemory() int { + return s.RSS * os.Getpagesize() +} + +// StartTime returns the unix timestamp of the process in seconds. +func (s ProcStat) StartTime() (float64, error) { + fs := FS{proc: s.proc} + stat, err := fs.Stat() + if err != nil { + return 0, err + } + return float64(stat.BootTime) + (float64(s.Starttime) / userHZ), nil +} + +// CPUTime returns the total CPU user and system time in seconds. +func (s ProcStat) CPUTime() float64 { + return float64(s.UTime+s.STime) / userHZ +} diff --git a/vendor/github.com/prometheus/procfs/proc_status.go b/vendor/github.com/prometheus/procfs/proc_status.go new file mode 100644 index 00000000..e30c2b88 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_status.go @@ -0,0 +1,161 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bytes" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ProcStatus provides status information about the process, +// read from /proc/[pid]/stat. +type ProcStatus struct { + // The process ID. + PID int + // The process name. + Name string + + // Thread group ID. + TGID int + + // Peak virtual memory size. + VmPeak uint64 + // Virtual memory size. + VmSize uint64 + // Locked memory size. + VmLck uint64 + // Pinned memory size. + VmPin uint64 + // Peak resident set size. + VmHWM uint64 + // Resident set size (sum of RssAnnon RssFile and RssShmem). + VmRSS uint64 + // Size of resident anonymous memory. + RssAnon uint64 + // Size of resident file mappings. + RssFile uint64 + // Size of resident shared memory. + RssShmem uint64 + // Size of data segments. + VmData uint64 + // Size of stack segments. + VmStk uint64 + // Size of text segments. + VmExe uint64 + // Shared library code size. + VmLib uint64 + // Page table entries size. + VmPTE uint64 + // Size of second-level page tables. + VmPMD uint64 + // Swapped-out virtual memory size by anonymous private. + VmSwap uint64 + // Size of hugetlb memory portions + HugetlbPages uint64 + + // Number of voluntary context switches. + VoluntaryCtxtSwitches uint64 + // Number of involuntary context switches. + NonVoluntaryCtxtSwitches uint64 +} + +// NewStatus returns the current status information of the process. +func (p Proc) NewStatus() (ProcStatus, error) { + data, err := util.ReadFileNoStat(p.path("status")) + if err != nil { + return ProcStatus{}, err + } + + s := ProcStatus{PID: p.PID} + + lines := strings.Split(string(data), "\n") + for _, line := range lines { + if !bytes.Contains([]byte(line), []byte(":")) { + continue + } + + kv := strings.SplitN(line, ":", 2) + + // removes spaces + k := string(strings.TrimSpace(kv[0])) + v := string(strings.TrimSpace(kv[1])) + // removes "kB" + v = string(bytes.Trim([]byte(v), " kB")) + + // value to int when possible + // we can skip error check here, 'cause vKBytes is not used when value is a string + vKBytes, _ := strconv.ParseUint(v, 10, 64) + // convert kB to B + vBytes := vKBytes * 1024 + + s.fillStatus(k, v, vKBytes, vBytes) + } + + return s, nil +} + +func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64, vUintBytes uint64) { + switch k { + case "Tgid": + s.TGID = int(vUint) + case "Name": + s.Name = vString + case "VmPeak": + s.VmPeak = vUintBytes + case "VmSize": + s.VmSize = vUintBytes + case "VmLck": + s.VmLck = vUintBytes + case "VmPin": + s.VmPin = vUintBytes + case "VmHWM": + s.VmHWM = vUintBytes + case "VmRSS": + s.VmRSS = vUintBytes + case "RssAnon": + s.RssAnon = vUintBytes + case "RssFile": + s.RssFile = vUintBytes + case "RssShmem": + s.RssShmem = vUintBytes + case "VmData": + s.VmData = vUintBytes + case "VmStk": + s.VmStk = vUintBytes + case "VmExe": + s.VmExe = vUintBytes + case "VmLib": + s.VmLib = vUintBytes + case "VmPTE": + s.VmPTE = vUintBytes + case "VmPMD": + s.VmPMD = vUintBytes + case "VmSwap": + s.VmSwap = vUintBytes + case "HugetlbPages": + s.HugetlbPages = vUintBytes + case "voluntary_ctxt_switches": + s.VoluntaryCtxtSwitches = vUint + case "nonvoluntary_ctxt_switches": + s.NonVoluntaryCtxtSwitches = vUint + } +} + +// TotalCtxtSwitches returns the total context switch. +func (s ProcStatus) TotalCtxtSwitches() uint64 { + return s.VoluntaryCtxtSwitches + s.NonVoluntaryCtxtSwitches +} diff --git a/vendor/github.com/prometheus/procfs/schedstat.go b/vendor/github.com/prometheus/procfs/schedstat.go new file mode 100644 index 00000000..a4c4089a --- /dev/null +++ b/vendor/github.com/prometheus/procfs/schedstat.go @@ -0,0 +1,118 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "errors" + "os" + "regexp" + "strconv" +) + +var ( + cpuLineRE = regexp.MustCompile(`cpu(\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+)`) + procLineRE = regexp.MustCompile(`(\d+) (\d+) (\d+)`) +) + +// Schedstat contains scheduler statistics from /proc/schedstat +// +// See +// https://www.kernel.org/doc/Documentation/scheduler/sched-stats.txt +// for a detailed description of what these numbers mean. +// +// Note the current kernel documentation claims some of the time units are in +// jiffies when they are actually in nanoseconds since 2.6.23 with the +// introduction of CFS. A fix to the documentation is pending. See +// https://lore.kernel.org/patchwork/project/lkml/list/?series=403473 +type Schedstat struct { + CPUs []*SchedstatCPU +} + +// SchedstatCPU contains the values from one "cpu" line +type SchedstatCPU struct { + CPUNum string + + RunningNanoseconds uint64 + WaitingNanoseconds uint64 + RunTimeslices uint64 +} + +// ProcSchedstat contains the values from /proc//schedstat +type ProcSchedstat struct { + RunningNanoseconds uint64 + WaitingNanoseconds uint64 + RunTimeslices uint64 +} + +// Schedstat reads data from /proc/schedstat +func (fs FS) Schedstat() (*Schedstat, error) { + file, err := os.Open(fs.proc.Path("schedstat")) + if err != nil { + return nil, err + } + defer file.Close() + + stats := &Schedstat{} + scanner := bufio.NewScanner(file) + + for scanner.Scan() { + match := cpuLineRE.FindStringSubmatch(scanner.Text()) + if match != nil { + cpu := &SchedstatCPU{} + cpu.CPUNum = match[1] + + cpu.RunningNanoseconds, err = strconv.ParseUint(match[8], 10, 64) + if err != nil { + continue + } + + cpu.WaitingNanoseconds, err = strconv.ParseUint(match[9], 10, 64) + if err != nil { + continue + } + + cpu.RunTimeslices, err = strconv.ParseUint(match[10], 10, 64) + if err != nil { + continue + } + + stats.CPUs = append(stats.CPUs, cpu) + } + } + + return stats, nil +} + +func parseProcSchedstat(contents string) (stats ProcSchedstat, err error) { + match := procLineRE.FindStringSubmatch(contents) + + if match != nil { + stats.RunningNanoseconds, err = strconv.ParseUint(match[1], 10, 64) + if err != nil { + return + } + + stats.WaitingNanoseconds, err = strconv.ParseUint(match[2], 10, 64) + if err != nil { + return + } + + stats.RunTimeslices, err = strconv.ParseUint(match[3], 10, 64) + return + } + + err = errors.New("could not parse schedstat") + return +} diff --git a/vendor/github.com/prometheus/procfs/stat.go b/vendor/github.com/prometheus/procfs/stat.go new file mode 100644 index 00000000..b2a6fc99 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/stat.go @@ -0,0 +1,244 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/fs" + "github.com/prometheus/procfs/internal/util" +) + +// CPUStat shows how much time the cpu spend in various stages. +type CPUStat struct { + User float64 + Nice float64 + System float64 + Idle float64 + Iowait float64 + IRQ float64 + SoftIRQ float64 + Steal float64 + Guest float64 + GuestNice float64 +} + +// SoftIRQStat represent the softirq statistics as exported in the procfs stat file. +// A nice introduction can be found at https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html +// It is possible to get per-cpu stats by reading /proc/softirqs +type SoftIRQStat struct { + Hi uint64 + Timer uint64 + NetTx uint64 + NetRx uint64 + Block uint64 + BlockIoPoll uint64 + Tasklet uint64 + Sched uint64 + Hrtimer uint64 + Rcu uint64 +} + +// Stat represents kernel/system statistics. +type Stat struct { + // Boot time in seconds since the Epoch. + BootTime uint64 + // Summed up cpu statistics. + CPUTotal CPUStat + // Per-CPU statistics. + CPU []CPUStat + // Number of times interrupts were handled, which contains numbered and unnumbered IRQs. + IRQTotal uint64 + // Number of times a numbered IRQ was triggered. + IRQ []uint64 + // Number of times a context switch happened. + ContextSwitches uint64 + // Number of times a process was created. + ProcessCreated uint64 + // Number of processes currently running. + ProcessesRunning uint64 + // Number of processes currently blocked (waiting for IO). + ProcessesBlocked uint64 + // Number of times a softirq was scheduled. + SoftIRQTotal uint64 + // Detailed softirq statistics. + SoftIRQ SoftIRQStat +} + +// Parse a cpu statistics line and returns the CPUStat struct plus the cpu id (or -1 for the overall sum). +func parseCPUStat(line string) (CPUStat, int64, error) { + cpuStat := CPUStat{} + var cpu string + + count, err := fmt.Sscanf(line, "%s %f %f %f %f %f %f %f %f %f %f", + &cpu, + &cpuStat.User, &cpuStat.Nice, &cpuStat.System, &cpuStat.Idle, + &cpuStat.Iowait, &cpuStat.IRQ, &cpuStat.SoftIRQ, &cpuStat.Steal, + &cpuStat.Guest, &cpuStat.GuestNice) + + if err != nil && err != io.EOF { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): %s", line, err) + } + if count == 0 { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): 0 elements parsed", line) + } + + cpuStat.User /= userHZ + cpuStat.Nice /= userHZ + cpuStat.System /= userHZ + cpuStat.Idle /= userHZ + cpuStat.Iowait /= userHZ + cpuStat.IRQ /= userHZ + cpuStat.SoftIRQ /= userHZ + cpuStat.Steal /= userHZ + cpuStat.Guest /= userHZ + cpuStat.GuestNice /= userHZ + + if cpu == "cpu" { + return cpuStat, -1, nil + } + + cpuID, err := strconv.ParseInt(cpu[3:], 10, 64) + if err != nil { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu/cpuid): %s", line, err) + } + + return cpuStat, cpuID, nil +} + +// Parse a softirq line. +func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) { + softIRQStat := SoftIRQStat{} + var total uint64 + var prefix string + + _, err := fmt.Sscanf(line, "%s %d %d %d %d %d %d %d %d %d %d %d", + &prefix, &total, + &softIRQStat.Hi, &softIRQStat.Timer, &softIRQStat.NetTx, &softIRQStat.NetRx, + &softIRQStat.Block, &softIRQStat.BlockIoPoll, + &softIRQStat.Tasklet, &softIRQStat.Sched, + &softIRQStat.Hrtimer, &softIRQStat.Rcu) + + if err != nil { + return SoftIRQStat{}, 0, fmt.Errorf("couldn't parse %s (softirq): %s", line, err) + } + + return softIRQStat, total, nil +} + +// NewStat returns information about current cpu/process statistics. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +// +// Deprecated: use fs.Stat() instead +func NewStat() (Stat, error) { + fs, err := NewFS(fs.DefaultProcMountPoint) + if err != nil { + return Stat{}, err + } + return fs.Stat() +} + +// NewStat returns information about current cpu/process statistics. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +// +// Deprecated: use fs.Stat() instead +func (fs FS) NewStat() (Stat, error) { + return fs.Stat() +} + +// Stat returns information about current cpu/process statistics. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +func (fs FS) Stat() (Stat, error) { + fileName := fs.proc.Path("stat") + data, err := util.ReadFileNoStat(fileName) + if err != nil { + return Stat{}, err + } + + stat := Stat{} + + scanner := bufio.NewScanner(bytes.NewReader(data)) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + continue + } + switch { + case parts[0] == "btime": + if stat.BootTime, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (btime): %s", parts[1], err) + } + case parts[0] == "intr": + if stat.IRQTotal, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (intr): %s", parts[1], err) + } + numberedIRQs := parts[2:] + stat.IRQ = make([]uint64, len(numberedIRQs)) + for i, count := range numberedIRQs { + if stat.IRQ[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (intr%d): %s", count, i, err) + } + } + case parts[0] == "ctxt": + if stat.ContextSwitches, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (ctxt): %s", parts[1], err) + } + case parts[0] == "processes": + if stat.ProcessCreated, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (processes): %s", parts[1], err) + } + case parts[0] == "procs_running": + if stat.ProcessesRunning, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (procs_running): %s", parts[1], err) + } + case parts[0] == "procs_blocked": + if stat.ProcessesBlocked, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (procs_blocked): %s", parts[1], err) + } + case parts[0] == "softirq": + softIRQStats, total, err := parseSoftIRQStat(line) + if err != nil { + return Stat{}, err + } + stat.SoftIRQTotal = total + stat.SoftIRQ = softIRQStats + case strings.HasPrefix(parts[0], "cpu"): + cpuStat, cpuID, err := parseCPUStat(line) + if err != nil { + return Stat{}, err + } + if cpuID == -1 { + stat.CPUTotal = cpuStat + } else { + for int64(len(stat.CPU)) <= cpuID { + stat.CPU = append(stat.CPU, CPUStat{}) + } + stat.CPU[cpuID] = cpuStat + } + } + } + + if err := scanner.Err(); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s: %s", fileName, err) + } + + return stat, nil +} diff --git a/vendor/github.com/prometheus/procfs/ttar b/vendor/github.com/prometheus/procfs/ttar new file mode 100644 index 00000000..19ef02b8 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/ttar @@ -0,0 +1,413 @@ +#!/usr/bin/env bash + +# Purpose: plain text tar format +# Limitations: - only suitable for text files, directories, and symlinks +# - stores only filename, content, and mode +# - not designed for untrusted input +# +# Note: must work with bash version 3.2 (macOS) + +# Copyright 2017 Roger Luethi +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit -o nounset + +# Sanitize environment (for instance, standard sorting of glob matches) +export LC_ALL=C + +path="" +CMD="" +ARG_STRING="$*" + +#------------------------------------------------------------------------------ +# Not all sed implementations can work on null bytes. In order to make ttar +# work out of the box on macOS, use Python as a stream editor. + +USE_PYTHON=0 + +PYTHON_CREATE_FILTER=$(cat << 'PCF' +#!/usr/bin/env python + +import re +import sys + +for line in sys.stdin: + line = re.sub(r'EOF', r'\EOF', line) + line = re.sub(r'NULLBYTE', r'\NULLBYTE', line) + line = re.sub('\x00', r'NULLBYTE', line) + sys.stdout.write(line) +PCF +) + +PYTHON_EXTRACT_FILTER=$(cat << 'PEF' +#!/usr/bin/env python + +import re +import sys + +for line in sys.stdin: + line = re.sub(r'(?/dev/null; then + echo "ERROR Python not found. Aborting." + exit 2 + fi + USE_PYTHON=1 + fi +} + +#------------------------------------------------------------------------------ + +function usage { + bname=$(basename "$0") + cat << USAGE +Usage: $bname [-C ] -c -f (create archive) + $bname -t -f (list archive contents) + $bname [-C ] -x -f (extract archive) + +Options: + -C (change directory) + -v (verbose) + --recursive-unlink (recursively delete existing directory if path + collides with file or directory to extract) + +Example: Change to sysfs directory, create ttar file from fixtures directory + $bname -C sysfs -c -f sysfs/fixtures.ttar fixtures/ +USAGE +exit "$1" +} + +function vecho { + if [ "${VERBOSE:-}" == "yes" ]; then + echo >&7 "$@" + fi +} + +function set_cmd { + if [ -n "$CMD" ]; then + echo "ERROR: more than one command given" + echo + usage 2 + fi + CMD=$1 +} + +unset VERBOSE +unset RECURSIVE_UNLINK + +while getopts :cf:-:htxvC: opt; do + case $opt in + c) + set_cmd "create" + ;; + f) + ARCHIVE=$OPTARG + ;; + h) + usage 0 + ;; + t) + set_cmd "list" + ;; + x) + set_cmd "extract" + ;; + v) + VERBOSE=yes + exec 7>&1 + ;; + C) + CDIR=$OPTARG + ;; + -) + case $OPTARG in + recursive-unlink) + RECURSIVE_UNLINK="yes" + ;; + *) + echo -e "Error: invalid option -$OPTARG" + echo + usage 1 + ;; + esac + ;; + *) + echo >&2 "ERROR: invalid option -$OPTARG" + echo + usage 1 + ;; + esac +done + +# Remove processed options from arguments +shift $(( OPTIND - 1 )); + +if [ "${CMD:-}" == "" ]; then + echo >&2 "ERROR: no command given" + echo + usage 1 +elif [ "${ARCHIVE:-}" == "" ]; then + echo >&2 "ERROR: no archive name given" + echo + usage 1 +fi + +function list { + local path="" + local size=0 + local line_no=0 + local ttar_file=$1 + if [ -n "${2:-}" ]; then + echo >&2 "ERROR: too many arguments." + echo + usage 1 + fi + if [ ! -e "$ttar_file" ]; then + echo >&2 "ERROR: file not found ($ttar_file)" + echo + usage 1 + fi + while read -r line; do + line_no=$(( line_no + 1 )) + if [ $size -gt 0 ]; then + size=$(( size - 1 )) + continue + fi + if [[ $line =~ ^Path:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + elif [[ $line =~ ^Lines:\ (.*)$ ]]; then + size=${BASH_REMATCH[1]} + echo "$path" + elif [[ $line =~ ^Directory:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + echo "$path/" + elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then + echo "$path -> ${BASH_REMATCH[1]}" + fi + done < "$ttar_file" +} + +function extract { + local path="" + local size=0 + local line_no=0 + local ttar_file=$1 + if [ -n "${2:-}" ]; then + echo >&2 "ERROR: too many arguments." + echo + usage 1 + fi + if [ ! -e "$ttar_file" ]; then + echo >&2 "ERROR: file not found ($ttar_file)" + echo + usage 1 + fi + while IFS= read -r line; do + line_no=$(( line_no + 1 )) + local eof_without_newline + if [ "$size" -gt 0 ]; then + if [[ "$line" =~ [^\\]EOF ]]; then + # An EOF not preceded by a backslash indicates that the line + # does not end with a newline + eof_without_newline=1 + else + eof_without_newline=0 + fi + # Replace NULLBYTE with null byte if at beginning of line + # Replace NULLBYTE with null byte unless preceded by backslash + # Remove one backslash in front of NULLBYTE (if any) + # Remove EOF unless preceded by backslash + # Remove one backslash in front of EOF + if [ $USE_PYTHON -eq 1 ]; then + echo -n "$line" | python -c "$PYTHON_EXTRACT_FILTER" >> "$path" + else + # The repeated pattern makes up for sed's lack of negative + # lookbehind assertions (for consecutive null bytes). + echo -n "$line" | \ + sed -e 's/^NULLBYTE/\x0/g; + s/\([^\\]\)NULLBYTE/\1\x0/g; + s/\([^\\]\)NULLBYTE/\1\x0/g; + s/\\NULLBYTE/NULLBYTE/g; + s/\([^\\]\)EOF/\1/g; + s/\\EOF/EOF/g; + ' >> "$path" + fi + if [[ "$eof_without_newline" -eq 0 ]]; then + echo >> "$path" + fi + size=$(( size - 1 )) + continue + fi + if [[ $line =~ ^Path:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + if [ -L "$path" ]; then + rm "$path" + elif [ -d "$path" ]; then + if [ "${RECURSIVE_UNLINK:-}" == "yes" ]; then + rm -r "$path" + else + # Safe because symlinks to directories are dealt with above + rmdir "$path" + fi + elif [ -e "$path" ]; then + rm "$path" + fi + elif [[ $line =~ ^Lines:\ (.*)$ ]]; then + size=${BASH_REMATCH[1]} + # Create file even if it is zero-length. + touch "$path" + vecho " $path" + elif [[ $line =~ ^Mode:\ (.*)$ ]]; then + mode=${BASH_REMATCH[1]} + chmod "$mode" "$path" + vecho "$mode" + elif [[ $line =~ ^Directory:\ (.*)$ ]]; then + path=${BASH_REMATCH[1]} + mkdir -p "$path" + vecho " $path/" + elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then + ln -s "${BASH_REMATCH[1]}" "$path" + vecho " $path -> ${BASH_REMATCH[1]}" + elif [[ $line =~ ^# ]]; then + # Ignore comments between files + continue + else + echo >&2 "ERROR: Unknown keyword on line $line_no: $line" + exit 1 + fi + done < "$ttar_file" +} + +function div { + echo "# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" \ + "- - - - - -" +} + +function get_mode { + local mfile=$1 + if [ -z "${STAT_OPTION:-}" ]; then + if stat -c '%a' "$mfile" >/dev/null 2>&1; then + # GNU stat + STAT_OPTION='-c' + STAT_FORMAT='%a' + else + # BSD stat + STAT_OPTION='-f' + # Octal output, user/group/other (omit file type, sticky bit) + STAT_FORMAT='%OLp' + fi + fi + stat "${STAT_OPTION}" "${STAT_FORMAT}" "$mfile" +} + +function _create { + shopt -s nullglob + local mode + local eof_without_newline + while (( "$#" )); do + file=$1 + if [ -L "$file" ]; then + echo "Path: $file" + symlinkTo=$(readlink "$file") + echo "SymlinkTo: $symlinkTo" + vecho " $file -> $symlinkTo" + div + elif [ -d "$file" ]; then + # Strip trailing slash (if there is one) + file=${file%/} + echo "Directory: $file" + mode=$(get_mode "$file") + echo "Mode: $mode" + vecho "$mode $file/" + div + # Find all files and dirs, including hidden/dot files + for x in "$file/"{*,.[^.]*}; do + _create "$x" + done + elif [ -f "$file" ]; then + echo "Path: $file" + lines=$(wc -l "$file"|awk '{print $1}') + eof_without_newline=0 + if [[ "$(wc -c "$file"|awk '{print $1}')" -gt 0 ]] && \ + [[ "$(tail -c 1 "$file" | wc -l)" -eq 0 ]]; then + eof_without_newline=1 + lines=$((lines+1)) + fi + echo "Lines: $lines" + # Add backslash in front of EOF + # Add backslash in front of NULLBYTE + # Replace null byte with NULLBYTE + if [ $USE_PYTHON -eq 1 ]; then + < "$file" python -c "$PYTHON_CREATE_FILTER" + else + < "$file" \ + sed 's/EOF/\\EOF/g; + s/NULLBYTE/\\NULLBYTE/g; + s/\x0/NULLBYTE/g; + ' + fi + if [[ "$eof_without_newline" -eq 1 ]]; then + # Finish line with EOF to indicate that the original line did + # not end with a linefeed + echo "EOF" + fi + mode=$(get_mode "$file") + echo "Mode: $mode" + vecho "$mode $file" + div + else + echo >&2 "ERROR: file not found ($file in $(pwd))" + exit 2 + fi + shift + done +} + +function create { + ttar_file=$1 + shift + if [ -z "${1:-}" ]; then + echo >&2 "ERROR: missing arguments." + echo + usage 1 + fi + if [ -e "$ttar_file" ]; then + rm "$ttar_file" + fi + exec > "$ttar_file" + echo "# Archive created by ttar $ARG_STRING" + _create "$@" +} + +test_environment + +if [ -n "${CDIR:-}" ]; then + if [[ "$ARCHIVE" != /* ]]; then + # Relative path: preserve the archive's location before changing + # directory + ARCHIVE="$(pwd)/$ARCHIVE" + fi + cd "$CDIR" +fi + +"$CMD" "$ARCHIVE" "$@" diff --git a/vendor/github.com/prometheus/procfs/vm.go b/vendor/github.com/prometheus/procfs/vm.go new file mode 100644 index 00000000..cb138914 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/vm.go @@ -0,0 +1,210 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package procfs + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// The VM interface is described at +// https://www.kernel.org/doc/Documentation/sysctl/vm.txt +// Each setting is exposed as a single file. +// Each file contains one line with a single numerical value, except lowmem_reserve_ratio which holds an array +// and numa_zonelist_order (deprecated) which is a string +type VM struct { + AdminReserveKbytes *int64 // /proc/sys/vm/admin_reserve_kbytes + BlockDump *int64 // /proc/sys/vm/block_dump + CompactUnevictableAllowed *int64 // /proc/sys/vm/compact_unevictable_allowed + DirtyBackgroundBytes *int64 // /proc/sys/vm/dirty_background_bytes + DirtyBackgroundRatio *int64 // /proc/sys/vm/dirty_background_ratio + DirtyBytes *int64 // /proc/sys/vm/dirty_bytes + DirtyExpireCentisecs *int64 // /proc/sys/vm/dirty_expire_centisecs + DirtyRatio *int64 // /proc/sys/vm/dirty_ratio + DirtytimeExpireSeconds *int64 // /proc/sys/vm/dirtytime_expire_seconds + DirtyWritebackCentisecs *int64 // /proc/sys/vm/dirty_writeback_centisecs + DropCaches *int64 // /proc/sys/vm/drop_caches + ExtfragThreshold *int64 // /proc/sys/vm/extfrag_threshold + HugetlbShmGroup *int64 // /proc/sys/vm/hugetlb_shm_group + LaptopMode *int64 // /proc/sys/vm/laptop_mode + LegacyVaLayout *int64 // /proc/sys/vm/legacy_va_layout + LowmemReserveRatio []*int64 // /proc/sys/vm/lowmem_reserve_ratio + MaxMapCount *int64 // /proc/sys/vm/max_map_count + MemoryFailureEarlyKill *int64 // /proc/sys/vm/memory_failure_early_kill + MemoryFailureRecovery *int64 // /proc/sys/vm/memory_failure_recovery + MinFreeKbytes *int64 // /proc/sys/vm/min_free_kbytes + MinSlabRatio *int64 // /proc/sys/vm/min_slab_ratio + MinUnmappedRatio *int64 // /proc/sys/vm/min_unmapped_ratio + MmapMinAddr *int64 // /proc/sys/vm/mmap_min_addr + NrHugepages *int64 // /proc/sys/vm/nr_hugepages + NrHugepagesMempolicy *int64 // /proc/sys/vm/nr_hugepages_mempolicy + NrOvercommitHugepages *int64 // /proc/sys/vm/nr_overcommit_hugepages + NumaStat *int64 // /proc/sys/vm/numa_stat + NumaZonelistOrder string // /proc/sys/vm/numa_zonelist_order + OomDumpTasks *int64 // /proc/sys/vm/oom_dump_tasks + OomKillAllocatingTask *int64 // /proc/sys/vm/oom_kill_allocating_task + OvercommitKbytes *int64 // /proc/sys/vm/overcommit_kbytes + OvercommitMemory *int64 // /proc/sys/vm/overcommit_memory + OvercommitRatio *int64 // /proc/sys/vm/overcommit_ratio + PageCluster *int64 // /proc/sys/vm/page-cluster + PanicOnOom *int64 // /proc/sys/vm/panic_on_oom + PercpuPagelistFraction *int64 // /proc/sys/vm/percpu_pagelist_fraction + StatInterval *int64 // /proc/sys/vm/stat_interval + Swappiness *int64 // /proc/sys/vm/swappiness + UserReserveKbytes *int64 // /proc/sys/vm/user_reserve_kbytes + VfsCachePressure *int64 // /proc/sys/vm/vfs_cache_pressure + WatermarkBoostFactor *int64 // /proc/sys/vm/watermark_boost_factor + WatermarkScaleFactor *int64 // /proc/sys/vm/watermark_scale_factor + ZoneReclaimMode *int64 // /proc/sys/vm/zone_reclaim_mode +} + +// VM reads the VM statistics from the specified `proc` filesystem. +func (fs FS) VM() (*VM, error) { + path := fs.proc.Path("sys/vm") + file, err := os.Stat(path) + if err != nil { + return nil, err + } + if !file.Mode().IsDir() { + return nil, fmt.Errorf("%s is not a directory", path) + } + + files, err := ioutil.ReadDir(path) + if err != nil { + return nil, err + } + + var vm VM + for _, f := range files { + if f.IsDir() { + continue + } + + name := filepath.Join(path, f.Name()) + // ignore errors on read, as there are some write only + // in /proc/sys/vm + value, err := util.SysReadFile(name) + if err != nil { + continue + } + vp := util.NewValueParser(value) + + switch f.Name() { + case "admin_reserve_kbytes": + vm.AdminReserveKbytes = vp.PInt64() + case "block_dump": + vm.BlockDump = vp.PInt64() + case "compact_unevictable_allowed": + vm.CompactUnevictableAllowed = vp.PInt64() + case "dirty_background_bytes": + vm.DirtyBackgroundBytes = vp.PInt64() + case "dirty_background_ratio": + vm.DirtyBackgroundRatio = vp.PInt64() + case "dirty_bytes": + vm.DirtyBytes = vp.PInt64() + case "dirty_expire_centisecs": + vm.DirtyExpireCentisecs = vp.PInt64() + case "dirty_ratio": + vm.DirtyRatio = vp.PInt64() + case "dirtytime_expire_seconds": + vm.DirtytimeExpireSeconds = vp.PInt64() + case "dirty_writeback_centisecs": + vm.DirtyWritebackCentisecs = vp.PInt64() + case "drop_caches": + vm.DropCaches = vp.PInt64() + case "extfrag_threshold": + vm.ExtfragThreshold = vp.PInt64() + case "hugetlb_shm_group": + vm.HugetlbShmGroup = vp.PInt64() + case "laptop_mode": + vm.LaptopMode = vp.PInt64() + case "legacy_va_layout": + vm.LegacyVaLayout = vp.PInt64() + case "lowmem_reserve_ratio": + stringSlice := strings.Fields(value) + pint64Slice := make([]*int64, 0, len(stringSlice)) + for _, value := range stringSlice { + vp := util.NewValueParser(value) + pint64Slice = append(pint64Slice, vp.PInt64()) + } + vm.LowmemReserveRatio = pint64Slice + case "max_map_count": + vm.MaxMapCount = vp.PInt64() + case "memory_failure_early_kill": + vm.MemoryFailureEarlyKill = vp.PInt64() + case "memory_failure_recovery": + vm.MemoryFailureRecovery = vp.PInt64() + case "min_free_kbytes": + vm.MinFreeKbytes = vp.PInt64() + case "min_slab_ratio": + vm.MinSlabRatio = vp.PInt64() + case "min_unmapped_ratio": + vm.MinUnmappedRatio = vp.PInt64() + case "mmap_min_addr": + vm.MmapMinAddr = vp.PInt64() + case "nr_hugepages": + vm.NrHugepages = vp.PInt64() + case "nr_hugepages_mempolicy": + vm.NrHugepagesMempolicy = vp.PInt64() + case "nr_overcommit_hugepages": + vm.NrOvercommitHugepages = vp.PInt64() + case "numa_stat": + vm.NumaStat = vp.PInt64() + case "numa_zonelist_order": + vm.NumaZonelistOrder = value + case "oom_dump_tasks": + vm.OomDumpTasks = vp.PInt64() + case "oom_kill_allocating_task": + vm.OomKillAllocatingTask = vp.PInt64() + case "overcommit_kbytes": + vm.OvercommitKbytes = vp.PInt64() + case "overcommit_memory": + vm.OvercommitMemory = vp.PInt64() + case "overcommit_ratio": + vm.OvercommitRatio = vp.PInt64() + case "page-cluster": + vm.PageCluster = vp.PInt64() + case "panic_on_oom": + vm.PanicOnOom = vp.PInt64() + case "percpu_pagelist_fraction": + vm.PercpuPagelistFraction = vp.PInt64() + case "stat_interval": + vm.StatInterval = vp.PInt64() + case "swappiness": + vm.Swappiness = vp.PInt64() + case "user_reserve_kbytes": + vm.UserReserveKbytes = vp.PInt64() + case "vfs_cache_pressure": + vm.VfsCachePressure = vp.PInt64() + case "watermark_boost_factor": + vm.WatermarkBoostFactor = vp.PInt64() + case "watermark_scale_factor": + vm.WatermarkScaleFactor = vp.PInt64() + case "zone_reclaim_mode": + vm.ZoneReclaimMode = vp.PInt64() + } + if err := vp.Err(); err != nil { + return nil, err + } + } + + return &vm, nil +} diff --git a/vendor/github.com/prometheus/procfs/xfrm.go b/vendor/github.com/prometheus/procfs/xfrm.go new file mode 100644 index 00000000..30aa417d --- /dev/null +++ b/vendor/github.com/prometheus/procfs/xfrm.go @@ -0,0 +1,187 @@ +// Copyright 2017 Prometheus Team +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +// XfrmStat models the contents of /proc/net/xfrm_stat. +type XfrmStat struct { + // All errors which are not matched by other + XfrmInError int + // No buffer is left + XfrmInBufferError int + // Header Error + XfrmInHdrError int + // No state found + // i.e. either inbound SPI, address, or IPSEC protocol at SA is wrong + XfrmInNoStates int + // Transformation protocol specific error + // e.g. SA Key is wrong + XfrmInStateProtoError int + // Transformation mode specific error + XfrmInStateModeError int + // Sequence error + // e.g. sequence number is out of window + XfrmInStateSeqError int + // State is expired + XfrmInStateExpired int + // State has mismatch option + // e.g. UDP encapsulation type is mismatched + XfrmInStateMismatch int + // State is invalid + XfrmInStateInvalid int + // No matching template for states + // e.g. Inbound SAs are correct but SP rule is wrong + XfrmInTmplMismatch int + // No policy is found for states + // e.g. Inbound SAs are correct but no SP is found + XfrmInNoPols int + // Policy discards + XfrmInPolBlock int + // Policy error + XfrmInPolError int + // All errors which are not matched by others + XfrmOutError int + // Bundle generation error + XfrmOutBundleGenError int + // Bundle check error + XfrmOutBundleCheckError int + // No state was found + XfrmOutNoStates int + // Transformation protocol specific error + XfrmOutStateProtoError int + // Transportation mode specific error + XfrmOutStateModeError int + // Sequence error + // i.e sequence number overflow + XfrmOutStateSeqError int + // State is expired + XfrmOutStateExpired int + // Policy discads + XfrmOutPolBlock int + // Policy is dead + XfrmOutPolDead int + // Policy Error + XfrmOutPolError int + XfrmFwdHdrError int + XfrmOutStateInvalid int + XfrmAcquireError int +} + +// NewXfrmStat reads the xfrm_stat statistics. +func NewXfrmStat() (XfrmStat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return XfrmStat{}, err + } + + return fs.NewXfrmStat() +} + +// NewXfrmStat reads the xfrm_stat statistics from the 'proc' filesystem. +func (fs FS) NewXfrmStat() (XfrmStat, error) { + file, err := os.Open(fs.proc.Path("net/xfrm_stat")) + if err != nil { + return XfrmStat{}, err + } + defer file.Close() + + var ( + x = XfrmStat{} + s = bufio.NewScanner(file) + ) + + for s.Scan() { + fields := strings.Fields(s.Text()) + + if len(fields) != 2 { + return XfrmStat{}, fmt.Errorf( + "couldn't parse %s line %s", file.Name(), s.Text()) + } + + name := fields[0] + value, err := strconv.Atoi(fields[1]) + if err != nil { + return XfrmStat{}, err + } + + switch name { + case "XfrmInError": + x.XfrmInError = value + case "XfrmInBufferError": + x.XfrmInBufferError = value + case "XfrmInHdrError": + x.XfrmInHdrError = value + case "XfrmInNoStates": + x.XfrmInNoStates = value + case "XfrmInStateProtoError": + x.XfrmInStateProtoError = value + case "XfrmInStateModeError": + x.XfrmInStateModeError = value + case "XfrmInStateSeqError": + x.XfrmInStateSeqError = value + case "XfrmInStateExpired": + x.XfrmInStateExpired = value + case "XfrmInStateInvalid": + x.XfrmInStateInvalid = value + case "XfrmInTmplMismatch": + x.XfrmInTmplMismatch = value + case "XfrmInNoPols": + x.XfrmInNoPols = value + case "XfrmInPolBlock": + x.XfrmInPolBlock = value + case "XfrmInPolError": + x.XfrmInPolError = value + case "XfrmOutError": + x.XfrmOutError = value + case "XfrmInStateMismatch": + x.XfrmInStateMismatch = value + case "XfrmOutBundleGenError": + x.XfrmOutBundleGenError = value + case "XfrmOutBundleCheckError": + x.XfrmOutBundleCheckError = value + case "XfrmOutNoStates": + x.XfrmOutNoStates = value + case "XfrmOutStateProtoError": + x.XfrmOutStateProtoError = value + case "XfrmOutStateModeError": + x.XfrmOutStateModeError = value + case "XfrmOutStateSeqError": + x.XfrmOutStateSeqError = value + case "XfrmOutStateExpired": + x.XfrmOutStateExpired = value + case "XfrmOutPolBlock": + x.XfrmOutPolBlock = value + case "XfrmOutPolDead": + x.XfrmOutPolDead = value + case "XfrmOutPolError": + x.XfrmOutPolError = value + case "XfrmFwdHdrError": + x.XfrmFwdHdrError = value + case "XfrmOutStateInvalid": + x.XfrmOutStateInvalid = value + case "XfrmAcquireError": + x.XfrmAcquireError = value + } + + } + + return x, s.Err() +} diff --git a/vendor/github.com/prometheus/procfs/zoneinfo.go b/vendor/github.com/prometheus/procfs/zoneinfo.go new file mode 100644 index 00000000..e941503d --- /dev/null +++ b/vendor/github.com/prometheus/procfs/zoneinfo.go @@ -0,0 +1,196 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "regexp" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Zoneinfo holds info parsed from /proc/zoneinfo. +type Zoneinfo struct { + Node string + Zone string + NrFreePages *int64 + Min *int64 + Low *int64 + High *int64 + Scanned *int64 + Spanned *int64 + Present *int64 + Managed *int64 + NrActiveAnon *int64 + NrInactiveAnon *int64 + NrIsolatedAnon *int64 + NrAnonPages *int64 + NrAnonTransparentHugepages *int64 + NrActiveFile *int64 + NrInactiveFile *int64 + NrIsolatedFile *int64 + NrFilePages *int64 + NrSlabReclaimable *int64 + NrSlabUnreclaimable *int64 + NrMlockStack *int64 + NrKernelStack *int64 + NrMapped *int64 + NrDirty *int64 + NrWriteback *int64 + NrUnevictable *int64 + NrShmem *int64 + NrDirtied *int64 + NrWritten *int64 + NumaHit *int64 + NumaMiss *int64 + NumaForeign *int64 + NumaInterleave *int64 + NumaLocal *int64 + NumaOther *int64 + Protection []*int64 +} + +var nodeZoneRE = regexp.MustCompile(`(\d+), zone\s+(\w+)`) + +// Zoneinfo parses an zoneinfo-file (/proc/zoneinfo) and returns a slice of +// structs containing the relevant info. More information available here: +// https://www.kernel.org/doc/Documentation/sysctl/vm.txt +func (fs FS) Zoneinfo() ([]Zoneinfo, error) { + data, err := ioutil.ReadFile(fs.proc.Path("zoneinfo")) + if err != nil { + return nil, fmt.Errorf("error reading zoneinfo %s: %s", fs.proc.Path("zoneinfo"), err) + } + zoneinfo, err := parseZoneinfo(data) + if err != nil { + return nil, fmt.Errorf("error parsing zoneinfo %s: %s", fs.proc.Path("zoneinfo"), err) + } + return zoneinfo, nil +} + +func parseZoneinfo(zoneinfoData []byte) ([]Zoneinfo, error) { + + zoneinfo := []Zoneinfo{} + + zoneinfoBlocks := bytes.Split(zoneinfoData, []byte("\nNode")) + for _, block := range zoneinfoBlocks { + var zoneinfoElement Zoneinfo + lines := strings.Split(string(block), "\n") + for _, line := range lines { + + if nodeZone := nodeZoneRE.FindStringSubmatch(line); nodeZone != nil { + zoneinfoElement.Node = nodeZone[1] + zoneinfoElement.Zone = nodeZone[2] + continue + } + if strings.HasPrefix(strings.TrimSpace(line), "per-node stats") { + zoneinfoElement.Zone = "" + continue + } + parts := strings.Fields(strings.TrimSpace(line)) + if len(parts) < 2 { + continue + } + vp := util.NewValueParser(parts[1]) + switch parts[0] { + case "nr_free_pages": + zoneinfoElement.NrFreePages = vp.PInt64() + case "min": + zoneinfoElement.Min = vp.PInt64() + case "low": + zoneinfoElement.Low = vp.PInt64() + case "high": + zoneinfoElement.High = vp.PInt64() + case "scanned": + zoneinfoElement.Scanned = vp.PInt64() + case "spanned": + zoneinfoElement.Spanned = vp.PInt64() + case "present": + zoneinfoElement.Present = vp.PInt64() + case "managed": + zoneinfoElement.Managed = vp.PInt64() + case "nr_active_anon": + zoneinfoElement.NrActiveAnon = vp.PInt64() + case "nr_inactive_anon": + zoneinfoElement.NrInactiveAnon = vp.PInt64() + case "nr_isolated_anon": + zoneinfoElement.NrIsolatedAnon = vp.PInt64() + case "nr_anon_pages": + zoneinfoElement.NrAnonPages = vp.PInt64() + case "nr_anon_transparent_hugepages": + zoneinfoElement.NrAnonTransparentHugepages = vp.PInt64() + case "nr_active_file": + zoneinfoElement.NrActiveFile = vp.PInt64() + case "nr_inactive_file": + zoneinfoElement.NrInactiveFile = vp.PInt64() + case "nr_isolated_file": + zoneinfoElement.NrIsolatedFile = vp.PInt64() + case "nr_file_pages": + zoneinfoElement.NrFilePages = vp.PInt64() + case "nr_slab_reclaimable": + zoneinfoElement.NrSlabReclaimable = vp.PInt64() + case "nr_slab_unreclaimable": + zoneinfoElement.NrSlabUnreclaimable = vp.PInt64() + case "nr_mlock_stack": + zoneinfoElement.NrMlockStack = vp.PInt64() + case "nr_kernel_stack": + zoneinfoElement.NrKernelStack = vp.PInt64() + case "nr_mapped": + zoneinfoElement.NrMapped = vp.PInt64() + case "nr_dirty": + zoneinfoElement.NrDirty = vp.PInt64() + case "nr_writeback": + zoneinfoElement.NrWriteback = vp.PInt64() + case "nr_unevictable": + zoneinfoElement.NrUnevictable = vp.PInt64() + case "nr_shmem": + zoneinfoElement.NrShmem = vp.PInt64() + case "nr_dirtied": + zoneinfoElement.NrDirtied = vp.PInt64() + case "nr_written": + zoneinfoElement.NrWritten = vp.PInt64() + case "numa_hit": + zoneinfoElement.NumaHit = vp.PInt64() + case "numa_miss": + zoneinfoElement.NumaMiss = vp.PInt64() + case "numa_foreign": + zoneinfoElement.NumaForeign = vp.PInt64() + case "numa_interleave": + zoneinfoElement.NumaInterleave = vp.PInt64() + case "numa_local": + zoneinfoElement.NumaLocal = vp.PInt64() + case "numa_other": + zoneinfoElement.NumaOther = vp.PInt64() + case "protection:": + protectionParts := strings.Split(line, ":") + protectionValues := strings.Replace(protectionParts[1], "(", "", 1) + protectionValues = strings.Replace(protectionValues, ")", "", 1) + protectionValues = strings.TrimSpace(protectionValues) + protectionStringMap := strings.Split(protectionValues, ", ") + val, err := util.ParsePInt64s(protectionStringMap) + if err == nil { + zoneinfoElement.Protection = val + } + } + + } + + zoneinfo = append(zoneinfo, zoneinfoElement) + } + return zoneinfo, nil +} diff --git a/vendor/github.com/satori/go.uuid/.travis.yml b/vendor/github.com/satori/go.uuid/.travis.yml new file mode 100644 index 00000000..20dd53b8 --- /dev/null +++ b/vendor/github.com/satori/go.uuid/.travis.yml @@ -0,0 +1,23 @@ +language: go +sudo: false +go: + - 1.2 + - 1.3 + - 1.4 + - 1.5 + - 1.6 + - 1.7 + - 1.8 + - 1.9 + - tip +matrix: + allow_failures: + - go: tip + fast_finish: true +before_install: + - go get github.com/mattn/goveralls + - go get golang.org/x/tools/cmd/cover +script: + - $HOME/gopath/bin/goveralls -service=travis-ci +notifications: + email: false diff --git a/vendor/github.com/satori/go.uuid/LICENSE b/vendor/github.com/satori/go.uuid/LICENSE new file mode 100644 index 00000000..926d5498 --- /dev/null +++ b/vendor/github.com/satori/go.uuid/LICENSE @@ -0,0 +1,20 @@ +Copyright (C) 2013-2018 by Maxim Bublis + +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/satori/go.uuid/README.md b/vendor/github.com/satori/go.uuid/README.md new file mode 100644 index 00000000..7b1a722d --- /dev/null +++ b/vendor/github.com/satori/go.uuid/README.md @@ -0,0 +1,65 @@ +# UUID package for Go language + +[![Build Status](https://travis-ci.org/satori/go.uuid.png?branch=master)](https://travis-ci.org/satori/go.uuid) +[![Coverage Status](https://coveralls.io/repos/github/satori/go.uuid/badge.svg?branch=master)](https://coveralls.io/github/satori/go.uuid) +[![GoDoc](http://godoc.org/github.com/satori/go.uuid?status.png)](http://godoc.org/github.com/satori/go.uuid) + +This package provides pure Go implementation of Universally Unique Identifier (UUID). Supported both creation and parsing of UUIDs. + +With 100% test coverage and benchmarks out of box. + +Supported versions: +* Version 1, based on timestamp and MAC address (RFC 4122) +* Version 2, based on timestamp, MAC address and POSIX UID/GID (DCE 1.1) +* Version 3, based on MD5 hashing (RFC 4122) +* Version 4, based on random numbers (RFC 4122) +* Version 5, based on SHA-1 hashing (RFC 4122) + +## Installation + +Use the `go` command: + + $ go get github.com/satori/go.uuid + +## Requirements + +UUID package requires Go >= 1.2. + +## Example + +```go +package main + +import ( + "fmt" + "github.com/satori/go.uuid" +) + +func main() { + // Creating UUID Version 4 + u1 := uuid.NewV4() + fmt.Printf("UUIDv4: %s\n", u1) + + // Parsing UUID from string input + u2, err := uuid.FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8") + if err != nil { + fmt.Printf("Something gone wrong: %s", err) + } + fmt.Printf("Successfully parsed: %s", u2) +} +``` + +## Documentation + +[Documentation](http://godoc.org/github.com/satori/go.uuid) is hosted at GoDoc project. + +## Links +* [RFC 4122](http://tools.ietf.org/html/rfc4122) +* [DCE 1.1: Authentication and Security Services](http://pubs.opengroup.org/onlinepubs/9696989899/chap5.htm#tagcjh_08_02_01_01) + +## Copyright + +Copyright (C) 2013-2018 by Maxim Bublis . + +UUID package released under MIT License. +See [LICENSE](https://github.com/satori/go.uuid/blob/master/LICENSE) for details. diff --git a/vendor/github.com/satori/go.uuid/codec.go b/vendor/github.com/satori/go.uuid/codec.go new file mode 100644 index 00000000..656892c5 --- /dev/null +++ b/vendor/github.com/satori/go.uuid/codec.go @@ -0,0 +1,206 @@ +// Copyright (C) 2013-2018 by Maxim Bublis +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package uuid + +import ( + "bytes" + "encoding/hex" + "fmt" +) + +// FromBytes returns UUID converted from raw byte slice input. +// It will return error if the slice isn't 16 bytes long. +func FromBytes(input []byte) (u UUID, err error) { + err = u.UnmarshalBinary(input) + return +} + +// FromBytesOrNil returns UUID converted from raw byte slice input. +// Same behavior as FromBytes, but returns a Nil UUID on error. +func FromBytesOrNil(input []byte) UUID { + uuid, err := FromBytes(input) + if err != nil { + return Nil + } + return uuid +} + +// FromString returns UUID parsed from string input. +// Input is expected in a form accepted by UnmarshalText. +func FromString(input string) (u UUID, err error) { + err = u.UnmarshalText([]byte(input)) + return +} + +// FromStringOrNil returns UUID parsed from string input. +// Same behavior as FromString, but returns a Nil UUID on error. +func FromStringOrNil(input string) UUID { + uuid, err := FromString(input) + if err != nil { + return Nil + } + return uuid +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The encoding is the same as returned by String. +func (u UUID) MarshalText() (text []byte, err error) { + text = []byte(u.String()) + return +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// Following formats are supported: +// "6ba7b810-9dad-11d1-80b4-00c04fd430c8", +// "{6ba7b810-9dad-11d1-80b4-00c04fd430c8}", +// "urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8" +// "6ba7b8109dad11d180b400c04fd430c8" +// ABNF for supported UUID text representation follows: +// uuid := canonical | hashlike | braced | urn +// plain := canonical | hashlike +// canonical := 4hexoct '-' 2hexoct '-' 2hexoct '-' 6hexoct +// hashlike := 12hexoct +// braced := '{' plain '}' +// urn := URN ':' UUID-NID ':' plain +// URN := 'urn' +// UUID-NID := 'uuid' +// 12hexoct := 6hexoct 6hexoct +// 6hexoct := 4hexoct 2hexoct +// 4hexoct := 2hexoct 2hexoct +// 2hexoct := hexoct hexoct +// hexoct := hexdig hexdig +// hexdig := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | +// 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | +// 'A' | 'B' | 'C' | 'D' | 'E' | 'F' +func (u *UUID) UnmarshalText(text []byte) (err error) { + switch len(text) { + case 32: + return u.decodeHashLike(text) + case 36: + return u.decodeCanonical(text) + case 38: + return u.decodeBraced(text) + case 41: + fallthrough + case 45: + return u.decodeURN(text) + default: + return fmt.Errorf("uuid: incorrect UUID length: %s", text) + } +} + +// decodeCanonical decodes UUID string in format +// "6ba7b810-9dad-11d1-80b4-00c04fd430c8". +func (u *UUID) decodeCanonical(t []byte) (err error) { + if t[8] != '-' || t[13] != '-' || t[18] != '-' || t[23] != '-' { + return fmt.Errorf("uuid: incorrect UUID format %s", t) + } + + src := t[:] + dst := u[:] + + for i, byteGroup := range byteGroups { + if i > 0 { + src = src[1:] // skip dash + } + _, err = hex.Decode(dst[:byteGroup/2], src[:byteGroup]) + if err != nil { + return + } + src = src[byteGroup:] + dst = dst[byteGroup/2:] + } + + return +} + +// decodeHashLike decodes UUID string in format +// "6ba7b8109dad11d180b400c04fd430c8". +func (u *UUID) decodeHashLike(t []byte) (err error) { + src := t[:] + dst := u[:] + + if _, err = hex.Decode(dst, src); err != nil { + return err + } + return +} + +// decodeBraced decodes UUID string in format +// "{6ba7b810-9dad-11d1-80b4-00c04fd430c8}" or in format +// "{6ba7b8109dad11d180b400c04fd430c8}". +func (u *UUID) decodeBraced(t []byte) (err error) { + l := len(t) + + if t[0] != '{' || t[l-1] != '}' { + return fmt.Errorf("uuid: incorrect UUID format %s", t) + } + + return u.decodePlain(t[1 : l-1]) +} + +// decodeURN decodes UUID string in format +// "urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8" or in format +// "urn:uuid:6ba7b8109dad11d180b400c04fd430c8". +func (u *UUID) decodeURN(t []byte) (err error) { + total := len(t) + + urn_uuid_prefix := t[:9] + + if !bytes.Equal(urn_uuid_prefix, urnPrefix) { + return fmt.Errorf("uuid: incorrect UUID format: %s", t) + } + + return u.decodePlain(t[9:total]) +} + +// decodePlain decodes UUID string in canonical format +// "6ba7b810-9dad-11d1-80b4-00c04fd430c8" or in hash-like format +// "6ba7b8109dad11d180b400c04fd430c8". +func (u *UUID) decodePlain(t []byte) (err error) { + switch len(t) { + case 32: + return u.decodeHashLike(t) + case 36: + return u.decodeCanonical(t) + default: + return fmt.Errorf("uuid: incorrrect UUID length: %s", t) + } +} + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (u UUID) MarshalBinary() (data []byte, err error) { + data = u.Bytes() + return +} + +// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. +// It will return error if the slice isn't 16 bytes long. +func (u *UUID) UnmarshalBinary(data []byte) (err error) { + if len(data) != Size { + err = fmt.Errorf("uuid: UUID must be exactly 16 bytes long, got %d bytes", len(data)) + return + } + copy(u[:], data) + + return +} diff --git a/vendor/github.com/satori/go.uuid/generator.go b/vendor/github.com/satori/go.uuid/generator.go new file mode 100644 index 00000000..3f2f1da2 --- /dev/null +++ b/vendor/github.com/satori/go.uuid/generator.go @@ -0,0 +1,239 @@ +// Copyright (C) 2013-2018 by Maxim Bublis +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package uuid + +import ( + "crypto/md5" + "crypto/rand" + "crypto/sha1" + "encoding/binary" + "hash" + "net" + "os" + "sync" + "time" +) + +// Difference in 100-nanosecond intervals between +// UUID epoch (October 15, 1582) and Unix epoch (January 1, 1970). +const epochStart = 122192928000000000 + +var ( + global = newDefaultGenerator() + + epochFunc = unixTimeFunc + posixUID = uint32(os.Getuid()) + posixGID = uint32(os.Getgid()) +) + +// NewV1 returns UUID based on current timestamp and MAC address. +func NewV1() UUID { + return global.NewV1() +} + +// NewV2 returns DCE Security UUID based on POSIX UID/GID. +func NewV2(domain byte) UUID { + return global.NewV2(domain) +} + +// NewV3 returns UUID based on MD5 hash of namespace UUID and name. +func NewV3(ns UUID, name string) UUID { + return global.NewV3(ns, name) +} + +// NewV4 returns random generated UUID. +func NewV4() UUID { + return global.NewV4() +} + +// NewV5 returns UUID based on SHA-1 hash of namespace UUID and name. +func NewV5(ns UUID, name string) UUID { + return global.NewV5(ns, name) +} + +// Generator provides interface for generating UUIDs. +type Generator interface { + NewV1() UUID + NewV2(domain byte) UUID + NewV3(ns UUID, name string) UUID + NewV4() UUID + NewV5(ns UUID, name string) UUID +} + +// Default generator implementation. +type generator struct { + storageOnce sync.Once + storageMutex sync.Mutex + + lastTime uint64 + clockSequence uint16 + hardwareAddr [6]byte +} + +func newDefaultGenerator() Generator { + return &generator{} +} + +// NewV1 returns UUID based on current timestamp and MAC address. +func (g *generator) NewV1() UUID { + u := UUID{} + + timeNow, clockSeq, hardwareAddr := g.getStorage() + + binary.BigEndian.PutUint32(u[0:], uint32(timeNow)) + binary.BigEndian.PutUint16(u[4:], uint16(timeNow>>32)) + binary.BigEndian.PutUint16(u[6:], uint16(timeNow>>48)) + binary.BigEndian.PutUint16(u[8:], clockSeq) + + copy(u[10:], hardwareAddr) + + u.SetVersion(V1) + u.SetVariant(VariantRFC4122) + + return u +} + +// NewV2 returns DCE Security UUID based on POSIX UID/GID. +func (g *generator) NewV2(domain byte) UUID { + u := UUID{} + + timeNow, clockSeq, hardwareAddr := g.getStorage() + + switch domain { + case DomainPerson: + binary.BigEndian.PutUint32(u[0:], posixUID) + case DomainGroup: + binary.BigEndian.PutUint32(u[0:], posixGID) + } + + binary.BigEndian.PutUint16(u[4:], uint16(timeNow>>32)) + binary.BigEndian.PutUint16(u[6:], uint16(timeNow>>48)) + binary.BigEndian.PutUint16(u[8:], clockSeq) + u[9] = domain + + copy(u[10:], hardwareAddr) + + u.SetVersion(V2) + u.SetVariant(VariantRFC4122) + + return u +} + +// NewV3 returns UUID based on MD5 hash of namespace UUID and name. +func (g *generator) NewV3(ns UUID, name string) UUID { + u := newFromHash(md5.New(), ns, name) + u.SetVersion(V3) + u.SetVariant(VariantRFC4122) + + return u +} + +// NewV4 returns random generated UUID. +func (g *generator) NewV4() UUID { + u := UUID{} + g.safeRandom(u[:]) + u.SetVersion(V4) + u.SetVariant(VariantRFC4122) + + return u +} + +// NewV5 returns UUID based on SHA-1 hash of namespace UUID and name. +func (g *generator) NewV5(ns UUID, name string) UUID { + u := newFromHash(sha1.New(), ns, name) + u.SetVersion(V5) + u.SetVariant(VariantRFC4122) + + return u +} + +func (g *generator) initStorage() { + g.initClockSequence() + g.initHardwareAddr() +} + +func (g *generator) initClockSequence() { + buf := make([]byte, 2) + g.safeRandom(buf) + g.clockSequence = binary.BigEndian.Uint16(buf) +} + +func (g *generator) initHardwareAddr() { + interfaces, err := net.Interfaces() + if err == nil { + for _, iface := range interfaces { + if len(iface.HardwareAddr) >= 6 { + copy(g.hardwareAddr[:], iface.HardwareAddr) + return + } + } + } + + // Initialize hardwareAddr randomly in case + // of real network interfaces absence + g.safeRandom(g.hardwareAddr[:]) + + // Set multicast bit as recommended in RFC 4122 + g.hardwareAddr[0] |= 0x01 +} + +func (g *generator) safeRandom(dest []byte) { + if _, err := rand.Read(dest); err != nil { + panic(err) + } +} + +// Returns UUID v1/v2 storage state. +// Returns epoch timestamp, clock sequence, and hardware address. +func (g *generator) getStorage() (uint64, uint16, []byte) { + g.storageOnce.Do(g.initStorage) + + g.storageMutex.Lock() + defer g.storageMutex.Unlock() + + timeNow := epochFunc() + // Clock changed backwards since last UUID generation. + // Should increase clock sequence. + if timeNow <= g.lastTime { + g.clockSequence++ + } + g.lastTime = timeNow + + return timeNow, g.clockSequence, g.hardwareAddr[:] +} + +// Returns difference in 100-nanosecond intervals between +// UUID epoch (October 15, 1582) and current time. +// This is default epoch calculation function. +func unixTimeFunc() uint64 { + return epochStart + uint64(time.Now().UnixNano()/100) +} + +// Returns UUID based on hashing of namespace UUID and name. +func newFromHash(h hash.Hash, ns UUID, name string) UUID { + u := UUID{} + h.Write(ns[:]) + h.Write([]byte(name)) + copy(u[:], h.Sum(nil)) + + return u +} diff --git a/vendor/github.com/satori/go.uuid/sql.go b/vendor/github.com/satori/go.uuid/sql.go new file mode 100644 index 00000000..56759d39 --- /dev/null +++ b/vendor/github.com/satori/go.uuid/sql.go @@ -0,0 +1,78 @@ +// Copyright (C) 2013-2018 by Maxim Bublis +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package uuid + +import ( + "database/sql/driver" + "fmt" +) + +// Value implements the driver.Valuer interface. +func (u UUID) Value() (driver.Value, error) { + return u.String(), nil +} + +// Scan implements the sql.Scanner interface. +// A 16-byte slice is handled by UnmarshalBinary, while +// a longer byte slice or a string is handled by UnmarshalText. +func (u *UUID) Scan(src interface{}) error { + switch src := src.(type) { + case []byte: + if len(src) == Size { + return u.UnmarshalBinary(src) + } + return u.UnmarshalText(src) + + case string: + return u.UnmarshalText([]byte(src)) + } + + return fmt.Errorf("uuid: cannot convert %T to UUID", src) +} + +// NullUUID can be used with the standard sql package to represent a +// UUID value that can be NULL in the database +type NullUUID struct { + UUID UUID + Valid bool +} + +// Value implements the driver.Valuer interface. +func (u NullUUID) Value() (driver.Value, error) { + if !u.Valid { + return nil, nil + } + // Delegate to UUID Value function + return u.UUID.Value() +} + +// Scan implements the sql.Scanner interface. +func (u *NullUUID) Scan(src interface{}) error { + if src == nil { + u.UUID, u.Valid = Nil, false + return nil + } + + // Delegate to UUID Scan function + u.Valid = true + return u.UUID.Scan(src) +} diff --git a/vendor/github.com/satori/go.uuid/uuid.go b/vendor/github.com/satori/go.uuid/uuid.go new file mode 100644 index 00000000..a2b8e2ca --- /dev/null +++ b/vendor/github.com/satori/go.uuid/uuid.go @@ -0,0 +1,161 @@ +// Copyright (C) 2013-2018 by Maxim Bublis +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// Package uuid provides implementation of Universally Unique Identifier (UUID). +// Supported versions are 1, 3, 4 and 5 (as specified in RFC 4122) and +// version 2 (as specified in DCE 1.1). +package uuid + +import ( + "bytes" + "encoding/hex" +) + +// Size of a UUID in bytes. +const Size = 16 + +// UUID representation compliant with specification +// described in RFC 4122. +type UUID [Size]byte + +// UUID versions +const ( + _ byte = iota + V1 + V2 + V3 + V4 + V5 +) + +// UUID layout variants. +const ( + VariantNCS byte = iota + VariantRFC4122 + VariantMicrosoft + VariantFuture +) + +// UUID DCE domains. +const ( + DomainPerson = iota + DomainGroup + DomainOrg +) + +// String parse helpers. +var ( + urnPrefix = []byte("urn:uuid:") + byteGroups = []int{8, 4, 4, 4, 12} +) + +// Nil is special form of UUID that is specified to have all +// 128 bits set to zero. +var Nil = UUID{} + +// Predefined namespace UUIDs. +var ( + NamespaceDNS = Must(FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8")) + NamespaceURL = Must(FromString("6ba7b811-9dad-11d1-80b4-00c04fd430c8")) + NamespaceOID = Must(FromString("6ba7b812-9dad-11d1-80b4-00c04fd430c8")) + NamespaceX500 = Must(FromString("6ba7b814-9dad-11d1-80b4-00c04fd430c8")) +) + +// Equal returns true if u1 and u2 equals, otherwise returns false. +func Equal(u1 UUID, u2 UUID) bool { + return bytes.Equal(u1[:], u2[:]) +} + +// Version returns algorithm version used to generate UUID. +func (u UUID) Version() byte { + return u[6] >> 4 +} + +// Variant returns UUID layout variant. +func (u UUID) Variant() byte { + switch { + case (u[8] >> 7) == 0x00: + return VariantNCS + case (u[8] >> 6) == 0x02: + return VariantRFC4122 + case (u[8] >> 5) == 0x06: + return VariantMicrosoft + case (u[8] >> 5) == 0x07: + fallthrough + default: + return VariantFuture + } +} + +// Bytes returns bytes slice representation of UUID. +func (u UUID) Bytes() []byte { + return u[:] +} + +// Returns canonical string representation of UUID: +// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. +func (u UUID) String() string { + buf := make([]byte, 36) + + hex.Encode(buf[0:8], u[0:4]) + buf[8] = '-' + hex.Encode(buf[9:13], u[4:6]) + buf[13] = '-' + hex.Encode(buf[14:18], u[6:8]) + buf[18] = '-' + hex.Encode(buf[19:23], u[8:10]) + buf[23] = '-' + hex.Encode(buf[24:], u[10:]) + + return string(buf) +} + +// SetVersion sets version bits. +func (u *UUID) SetVersion(v byte) { + u[6] = (u[6] & 0x0f) | (v << 4) +} + +// SetVariant sets variant bits. +func (u *UUID) SetVariant(v byte) { + switch v { + case VariantNCS: + u[8] = (u[8]&(0xff>>1) | (0x00 << 7)) + case VariantRFC4122: + u[8] = (u[8]&(0xff>>2) | (0x02 << 6)) + case VariantMicrosoft: + u[8] = (u[8]&(0xff>>3) | (0x06 << 5)) + case VariantFuture: + fallthrough + default: + u[8] = (u[8]&(0xff>>3) | (0x07 << 5)) + } +} + +// Must is a helper that wraps a call to a function returning (UUID, error) +// and panics if the error is non-nil. It is intended for use in variable +// initializations such as +// var packageUUID = uuid.Must(uuid.FromString("123e4567-e89b-12d3-a456-426655440000")); +func Must(u UUID, err error) UUID { + if err != nil { + panic(err) + } + return u +} diff --git a/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go b/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go deleted file mode 100644 index 83cb91a1..00000000 --- a/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go +++ /dev/null @@ -1,34 +0,0 @@ -// +build ignore - -/* -Input to cgo -godefs. -*/ - -package mem - -/* -#include -#include -#include -#include - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - CTLVm = 2 - CTLVfs = 10 - VmUvmexp = 4 // get uvmexp - VfsGeneric = 0 - VfsBcacheStat = 3 -) - -const ( - sizeOfUvmexp = C.sizeof_struct_uvmexp - sizeOfBcachestats = C.sizeof_struct_bcachestats -) - -type Uvmexp C.struct_uvmexp -type Bcachestats C.struct_bcachestats diff --git a/vendor/github.com/shirou/gopsutil/process/types_darwin.go b/vendor/github.com/shirou/gopsutil/process/types_darwin.go deleted file mode 100644 index 21216cd0..00000000 --- a/vendor/github.com/shirou/gopsutil/process/types_darwin.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Hand Writing -// - all pointer in ExternProc to uint64 - -// +build ignore - -/* -Input to cgo -godefs. -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ -// +godefs map struct_ [16]byte /* in6_addr */ - -package process - -/* -#define __DARWIN_UNIX03 0 -#define KERNEL -#define _DARWIN_USE_64_BIT_INODE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -struct ucred_queue { - struct ucred *tqe_next; - struct ucred **tqe_prev; - TRACEBUF -}; - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type UGid_t C.gid_t - -type KinfoProc C.struct_kinfo_proc - -type Eproc C.struct_eproc - -type Proc C.struct_proc - -type Session C.struct_session - -type ucred C.struct_ucred - -type Uucred C.struct__ucred - -type Upcred C.struct__pcred - -type Vmspace C.struct_vmspace - -type Sigacts C.struct_sigacts - -type ExternProc C.struct_extern_proc - -type Itimerval C.struct_itimerval - -type Vnode C.struct_vnode - -type Pgrp C.struct_pgrp - -type UserStruct C.struct_user - -type Au_session C.struct_au_session - -type Posix_cred C.struct_posix_cred - -type Label C.struct_label - -type AuditinfoAddr C.struct_auditinfo_addr -type AuMask C.struct_au_mask -type AuTidAddr C.struct_au_tid_addr - -// TAILQ(ucred) -type UcredQueue C.struct_ucred_queue diff --git a/vendor/github.com/shirou/gopsutil/process/types_freebsd.go b/vendor/github.com/shirou/gopsutil/process/types_freebsd.go deleted file mode 100644 index aa7b3462..00000000 --- a/vendor/github.com/shirou/gopsutil/process/types_freebsd.go +++ /dev/null @@ -1,95 +0,0 @@ -// +build ignore - -// We still need editing by hands. -// go tool cgo -godefs types_freebsd.go | sed 's/\*int64/int64/' | sed 's/\*byte/int64/' > process_freebsd_amd64.go - -/* -Input to cgo -godefs. -*/ - -// +godefs map struct_pargs int64 /* pargs */ -// +godefs map struct_proc int64 /* proc */ -// +godefs map struct_user int64 /* user */ -// +godefs map struct_vnode int64 /* vnode */ -// +godefs map struct_vnode int64 /* vnode */ -// +godefs map struct_filedesc int64 /* filedesc */ -// +godefs map struct_vmspace int64 /* vmspace */ -// +godefs map struct_pcb int64 /* pcb */ -// +godefs map struct_thread int64 /* thread */ -// +godefs map struct___sigset [16]byte /* sigset */ - -package process - -/* -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - CTLKern = 1 // "high kernel": proc, limits - KernProc = 14 // struct: process entries - KernProcPID = 1 // by process id - KernProcProc = 8 // only return procs - KernProcPathname = 12 // path to executable - KernProcArgs = 7 // get/set arguments/proctitle -) - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong -) - -const ( - sizeOfKinfoVmentry = C.sizeof_struct_kinfo_vmentry - sizeOfKinfoProc = C.sizeof_struct_kinfo_proc -) - -// from sys/proc.h -const ( - SIDL = 1 /* Process being created by fork. */ - SRUN = 2 /* Currently runnable. */ - SSLEEP = 3 /* Sleeping on an address. */ - SSTOP = 4 /* Process debugging or suspension. */ - SZOMB = 5 /* Awaiting collection by parent. */ - SWAIT = 6 /* Waiting for interrupt. */ - SLOCK = 7 /* Blocked on a lock. */ -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type KinfoProc C.struct_kinfo_proc - -type Priority C.struct_priority - -type KinfoVmentry C.struct_kinfo_vmentry diff --git a/vendor/github.com/shirou/gopsutil/process/types_openbsd.go b/vendor/github.com/shirou/gopsutil/process/types_openbsd.go deleted file mode 100644 index 09ac5902..00000000 --- a/vendor/github.com/shirou/gopsutil/process/types_openbsd.go +++ /dev/null @@ -1,103 +0,0 @@ -// +build ignore - -// We still need editing by hands. -// go tool cgo -godefs types_openbsd.go | sed 's/\*int64/int64/' | sed 's/\*byte/int64/' > process_openbsd_amd64.go - -/* -Input to cgo -godefs. -*/ - -// +godefs map struct_pargs int64 /* pargs */ -// +godefs map struct_proc int64 /* proc */ -// +godefs map struct_user int64 /* user */ -// +godefs map struct_vnode int64 /* vnode */ -// +godefs map struct_vnode int64 /* vnode */ -// +godefs map struct_filedesc int64 /* filedesc */ -// +godefs map struct_vmspace int64 /* vmspace */ -// +godefs map struct_pcb int64 /* pcb */ -// +godefs map struct_thread int64 /* thread */ -// +godefs map struct___sigset [16]byte /* sigset */ - -package process - -/* -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - CTLKern = 1 // "high kernel": proc, limits - KernProc = 66 // struct: process entries - KernProcAll = 0 - KernProcPID = 1 // by process id - KernProcProc = 8 // only return procs - KernProcPathname = 12 // path to executable - KernProcArgs = 55 // get/set arguments/proctitle - KernProcArgv = 1 - KernProcEnv = 3 -) - -const ( - ArgMax = 256 * 1024 // sys/syslimits.h:#define ARG_MAX -) - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong -) - -const ( - sizeOfKinfoVmentry = C.sizeof_struct_kinfo_vmentry - sizeOfKinfoProc = C.sizeof_struct_kinfo_proc -) - -// from sys/proc.h -const ( - SIDL = 1 /* Process being created by fork. */ - SRUN = 2 /* Currently runnable. */ - SSLEEP = 3 /* Sleeping on an address. */ - SSTOP = 4 /* Process debugging or suspension. */ - SZOMB = 5 /* Awaiting collection by parent. */ - SDEAD = 6 /* Thread is almost gone */ - SONPROC = 7 /* Thread is currently on a CPU. */ -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type KinfoProc C.struct_kinfo_proc - -type Priority C.struct_priority - -type KinfoVmentry C.struct_kinfo_vmentry diff --git a/vendor/github.com/spf13/afero/copyOnWriteFs.go b/vendor/github.com/spf13/afero/copyOnWriteFs.go index 9aef3979..e8108a85 100644 --- a/vendor/github.com/spf13/afero/copyOnWriteFs.go +++ b/vendor/github.com/spf13/afero/copyOnWriteFs.go @@ -267,7 +267,7 @@ func (u *CopyOnWriteFs) Mkdir(name string, perm os.FileMode) error { return u.layer.MkdirAll(name, perm) } if dir { - return syscall.EEXIST + return ErrFileExists } return u.layer.MkdirAll(name, perm) } @@ -282,7 +282,8 @@ func (u *CopyOnWriteFs) MkdirAll(name string, perm os.FileMode) error { return u.layer.MkdirAll(name, perm) } if dir { - return syscall.EEXIST + // This is in line with how os.MkdirAll behaves. + return nil } return u.layer.MkdirAll(name, perm) } diff --git a/vendor/github.com/spf13/afero/go.mod b/vendor/github.com/spf13/afero/go.mod index 9eff4fed..08685509 100644 --- a/vendor/github.com/spf13/afero/go.mod +++ b/vendor/github.com/spf13/afero/go.mod @@ -1 +1,3 @@ module github.com/spf13/afero + +require golang.org/x/text v0.3.0 diff --git a/vendor/github.com/spf13/afero/go.sum b/vendor/github.com/spf13/afero/go.sum new file mode 100644 index 00000000..6bad37b2 --- /dev/null +++ b/vendor/github.com/spf13/afero/go.sum @@ -0,0 +1,2 @@ +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/vendor/github.com/spf13/afero/unionFile.go b/vendor/github.com/spf13/afero/unionFile.go index 1e78f7d1..eda96312 100644 --- a/vendor/github.com/spf13/afero/unionFile.go +++ b/vendor/github.com/spf13/afero/unionFile.go @@ -155,7 +155,8 @@ var defaultUnionMergeDirsFn = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, err } // Readdir will weave the two directories together and -// return a single view of the overlayed directories +// return a single view of the overlayed directories. +// At the end of the directory view, the error is io.EOF if c > 0. func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) { var merge DirsMerger = f.Merger if merge == nil { @@ -185,9 +186,23 @@ func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) { } f.files = append(f.files, merged...) } - if c == -1 { + + if c <= 0 && len(f.files) == 0 { + return f.files, nil + } + + if f.off >= len(f.files) { + return nil, io.EOF + } + + if c <= 0 { return f.files[f.off:], nil } + + if c > len(f.files) { + c = len(f.files) + } + defer func() { f.off += c }() return f.files[f.off:c], nil } diff --git a/vendor/github.com/spf13/cast/.travis.yml b/vendor/github.com/spf13/cast/.travis.yml index 6420d1c2..c2518071 100644 --- a/vendor/github.com/spf13/cast/.travis.yml +++ b/vendor/github.com/spf13/cast/.travis.yml @@ -4,12 +4,18 @@ env: sudo: required go: - "1.11.x" + - "1.12.x" - tip os: - linux + - osx + - windows matrix: allow_failures: - go: tip + exclude: + - os: windows + go: tip fast_finish: true script: - - make check + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then go test -v -race ./...; else make check; fi diff --git a/vendor/github.com/spf13/cast/Makefile b/vendor/github.com/spf13/cast/Makefile index 7ccf8930..74629c2d 100644 --- a/vendor/github.com/spf13/cast/Makefile +++ b/vendor/github.com/spf13/cast/Makefile @@ -1,29 +1,25 @@ -# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html +GOVERSION := $(shell go version | cut -d ' ' -f 3 | cut -d '.' -f 2) -.PHONY: check fmt lint test test-race vet test-cover-html help +.PHONY: check fmt test test-race vet test-cover-html help .DEFAULT_GOAL := help -check: test-race fmt vet lint ## Run tests and linters +check: test-race fmt vet ## Run tests and linters test: ## Run tests go test ./... test-race: ## Run tests with race detector - go test -race ./... + go test -v -race ./... fmt: ## Run gofmt linter +ifeq "$(GOVERSION)" "12" @for d in `go list` ; do \ if [ "`gofmt -l -s $$GOPATH/src/$$d | tee /dev/stderr`" ]; then \ echo "^ improperly formatted go files" && echo && exit 1; \ fi \ done +endif -lint: ## Run golint linter - @for d in `go list` ; do \ - if [ "`golint $$d | tee /dev/stderr`" ]; then \ - echo "^ golint errors!" && echo && exit 1; \ - fi \ - done vet: ## Run go vet linter @if [ "`go vet | tee /dev/stderr`" ]; then \ diff --git a/vendor/github.com/spf13/cast/cast.go b/vendor/github.com/spf13/cast/cast.go index 9fba638d..58f674f2 100644 --- a/vendor/github.com/spf13/cast/cast.go +++ b/vendor/github.com/spf13/cast/cast.go @@ -20,6 +20,14 @@ func ToTime(i interface{}) time.Time { return v } +// ToTimeInDefaultLocationE casts an empty interface to time.Time, +// interpreting inputs without a timezone to be in the given location. +// To fall back to the local timezone, use time.Local as the last argument. +func ToTimeInDefaultLocation(i interface{}, location *time.Location) time.Time { + v, _ := ToTimeInDefaultLocationE(i, location) + return v +} + // ToDuration casts an interface to a time.Duration type. func ToDuration(i interface{}) time.Duration { v, _ := ToDurationE(i) diff --git a/vendor/github.com/spf13/cast/caste.go b/vendor/github.com/spf13/cast/caste.go index a4859fb0..3ccbc7ff 100644 --- a/vendor/github.com/spf13/cast/caste.go +++ b/vendor/github.com/spf13/cast/caste.go @@ -20,13 +20,20 @@ var errNegativeNotAllowed = errors.New("unable to cast negative value") // ToTimeE casts an interface to a time.Time type. func ToTimeE(i interface{}) (tim time.Time, err error) { + return ToTimeInDefaultLocationE(i, nil) +} + +// ToTimeInDefaultLocationE casts an empty interface to time.Time, +// interpreting inputs without a timezone to be in the given location. +// To fall back to the local timezone, use time.Local as the last argument. +func ToTimeInDefaultLocationE(i interface{}, location *time.Location) (tim time.Time, err error) { i = indirect(i) switch v := i.(type) { case time.Time: return v, nil case string: - return StringToDate(v) + return StringToDateInDefaultLocation(v, location) case int: return time.Unix(int64(v), 0), nil case int64: @@ -1204,43 +1211,97 @@ func ToDurationSliceE(i interface{}) ([]time.Duration, error) { // predefined list of formats. If no suitable format is found, an error is // returned. func StringToDate(s string) (time.Time, error) { - return parseDateWith(s, []string{ - time.RFC3339, - "2006-01-02T15:04:05", // iso8601 without timezone - time.RFC1123Z, - time.RFC1123, - time.RFC822Z, - time.RFC822, - time.RFC850, - time.ANSIC, - time.UnixDate, - time.RubyDate, - "2006-01-02 15:04:05.999999999 -0700 MST", // Time.String() - "2006-01-02", - "02 Jan 2006", - "2006-01-02T15:04:05-0700", // RFC3339 without timezone hh:mm colon - "2006-01-02 15:04:05 -07:00", - "2006-01-02 15:04:05 -0700", - "2006-01-02 15:04:05Z07:00", // RFC3339 without T - "2006-01-02 15:04:05Z0700", // RFC3339 without T or timezone hh:mm colon - "2006-01-02 15:04:05", - time.Kitchen, - time.Stamp, - time.StampMilli, - time.StampMicro, - time.StampNano, - }) + return parseDateWith(s, nil, timeFormats) } -func parseDateWith(s string, dates []string) (d time.Time, e error) { - for _, dateType := range dates { - if d, e = time.Parse(dateType, s); e == nil { +// StringToDateInDefaultLocation to parse a string into a time.Time type using a +// predefined list of formats, interpreting inputs without a timezone to be in +// the given location. +// To fall back to the local timezone, use time.Local as the last argument. +func StringToDateInDefaultLocation(s string, location *time.Location) (time.Time, error) { + return parseDateWith(s, location, timeFormats) +} + +func parseDateWith(s string, location *time.Location, formats []timeFormat) (d time.Time, e error) { + for _, format := range formats { + if d, e = time.Parse(format.format, s); e == nil { + + // Some time formats have a zone name, but no offset, so it gets + // put in that zone name (not the default one passed in to us), but + // without that zone's offset. So set the location manually. + // Note that we only do this when we get a location in the new *InDefaultLocation + // variants to avoid breaking existing behaviour in ToTime, however + // weird that existing behaviour may be. + if location != nil && !format.hasNumericTimezone() { + year, month, day := d.Date() + hour, min, sec := d.Clock() + d = time.Date(year, month, day, hour, min, sec, d.Nanosecond(), location) + } + return } } return d, fmt.Errorf("unable to parse date: %s", s) } +type timeFormatType int + +const ( + timeFormatShort timeFormatType = iota // time or date only, no timezone + timeFormatNoTimezone + + // All below have some kind of timezone information, a name and/or offset. + timeFormatNamedTimezone + + // All below have what we consider to be solid timezone information. + timeFormatNumericAndNamedTimezone + timeFormatNumericTimezone +) + +type timeFormat struct { + format string + typ timeFormatType +} + +func (f timeFormat) hasNumericTimezone() bool { + return f.typ >= timeFormatNumericAndNamedTimezone +} + +func (f timeFormat) hasAnyTimezone() bool { + return f.typ >= timeFormatNamedTimezone +} + +var ( + timeFormats = []timeFormat{ + {time.RFC3339, timeFormatNumericTimezone}, + {"2006-01-02T15:04:05", timeFormatNoTimezone}, // iso8601 without timezone + {time.RFC1123Z, timeFormatNumericTimezone}, + {time.RFC1123, timeFormatNamedTimezone}, + {time.RFC822Z, timeFormatNumericTimezone}, + {time.RFC822, timeFormatNamedTimezone}, + {time.RFC850, timeFormatNamedTimezone}, + {"2006-01-02 15:04:05.999999999 -0700 MST", timeFormatNumericAndNamedTimezone}, // Time.String() + {"2006-01-02T15:04:05-0700", timeFormatNumericTimezone}, // RFC3339 without timezone hh:mm colon + {"2006-01-02 15:04:05Z0700", timeFormatNumericTimezone}, // RFC3339 without T or timezone hh:mm colon + {"2006-01-02 15:04:05", timeFormatNoTimezone}, + {time.ANSIC, timeFormatNoTimezone}, + // Must try RubyDate before UnixDate, see: + // https://github.com/golang/go/issues/32358 + {time.RubyDate, timeFormatNumericTimezone}, + {time.UnixDate, timeFormatNamedTimezone}, + {"2006-01-02 15:04:05Z07:00", timeFormatNumericTimezone}, + {"2006-01-02", timeFormatShort}, + {"02 Jan 2006", timeFormatShort}, + {"2006-01-02 15:04:05 -07:00", timeFormatNumericTimezone}, + {"2006-01-02 15:04:05 -0700", timeFormatNumericTimezone}, + {time.Kitchen, timeFormatShort}, + {time.Stamp, timeFormatShort}, + {time.StampMilli, timeFormatShort}, + {time.StampMicro, timeFormatShort}, + {time.StampNano, timeFormatShort}, + } +) + // jsonStringToObject attempts to unmarshall a string as JSON into // the object passed as pointer. func jsonStringToObject(s string, v interface{}) error { diff --git a/vendor/github.com/spf13/jwalterweatherman/.gitignore b/vendor/github.com/spf13/jwalterweatherman/.gitignore index 00268614..a71f88af 100644 --- a/vendor/github.com/spf13/jwalterweatherman/.gitignore +++ b/vendor/github.com/spf13/jwalterweatherman/.gitignore @@ -20,3 +20,5 @@ _cgo_export.* _testmain.go *.exe +*.bench +go.sum \ No newline at end of file diff --git a/vendor/github.com/spf13/jwalterweatherman/default_notepad.go b/vendor/github.com/spf13/jwalterweatherman/default_notepad.go index bcb76340..a018c15c 100644 --- a/vendor/github.com/spf13/jwalterweatherman/default_notepad.go +++ b/vendor/github.com/spf13/jwalterweatherman/default_notepad.go @@ -64,6 +64,13 @@ func SetStdoutThreshold(threshold Threshold) { reloadDefaultNotepad() } +// SetStdoutOutput set the stdout output for the default notepad. Default is stdout. +func SetStdoutOutput(handle io.Writer) { + defaultNotepad.outHandle = handle + defaultNotepad.init() + reloadDefaultNotepad() +} + // SetPrefix set the prefix for the default logger. Empty by default. func SetPrefix(prefix string) { defaultNotepad.SetPrefix(prefix) @@ -76,6 +83,13 @@ func SetFlags(flags int) { reloadDefaultNotepad() } +// SetLogListeners configures the default logger with one or more log listeners. +func SetLogListeners(l ...LogListener) { + defaultNotepad.logListeners = l + defaultNotepad.init() + reloadDefaultNotepad() +} + // Level returns the current global log threshold. func LogThreshold() Threshold { return defaultNotepad.logThreshold @@ -95,19 +109,3 @@ func GetLogThreshold() Threshold { func GetStdoutThreshold() Threshold { return defaultNotepad.GetStdoutThreshold() } - -// LogCountForLevel returns the number of log invocations for a given threshold. -func LogCountForLevel(l Threshold) uint64 { - return defaultNotepad.LogCountForLevel(l) -} - -// LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations -// greater than or equal to a given threshold. -func LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 { - return defaultNotepad.LogCountForLevelsGreaterThanorEqualTo(threshold) -} - -// ResetLogCounters resets the invocation counters for all levels. -func ResetLogCounters() { - defaultNotepad.ResetLogCounters() -} diff --git a/vendor/github.com/spf13/jwalterweatherman/go.mod b/vendor/github.com/spf13/jwalterweatherman/go.mod index bce549c0..1dbcfd3e 100644 --- a/vendor/github.com/spf13/jwalterweatherman/go.mod +++ b/vendor/github.com/spf13/jwalterweatherman/go.mod @@ -1 +1,7 @@ module github.com/spf13/jwalterweatherman + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.2.2 +) diff --git a/vendor/github.com/spf13/jwalterweatherman/log_counter.go b/vendor/github.com/spf13/jwalterweatherman/log_counter.go index 11423ac4..41285f3d 100644 --- a/vendor/github.com/spf13/jwalterweatherman/log_counter.go +++ b/vendor/github.com/spf13/jwalterweatherman/log_counter.go @@ -6,50 +6,41 @@ package jwalterweatherman import ( + "io" "sync/atomic" ) -type logCounter struct { - counter uint64 +// Counter is an io.Writer that increments a counter on Write. +type Counter struct { + count uint64 } -func (c *logCounter) incr() { - atomic.AddUint64(&c.counter, 1) +func (c *Counter) incr() { + atomic.AddUint64(&c.count, 1) } -func (c *logCounter) resetCounter() { - atomic.StoreUint64(&c.counter, 0) +// Reset resets the counter. +func (c *Counter) Reset() { + atomic.StoreUint64(&c.count, 0) } -func (c *logCounter) getCount() uint64 { - return atomic.LoadUint64(&c.counter) +// Count returns the current count. +func (c *Counter) Count() uint64 { + return atomic.LoadUint64(&c.count) } -func (c *logCounter) Write(p []byte) (n int, err error) { +func (c *Counter) Write(p []byte) (n int, err error) { c.incr() return len(p), nil } -// LogCountForLevel returns the number of log invocations for a given threshold. -func (n *Notepad) LogCountForLevel(l Threshold) uint64 { - return n.logCounters[l].getCount() -} - -// LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations -// greater than or equal to a given threshold. -func (n *Notepad) LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 { - var cnt uint64 - - for i := int(threshold); i < len(n.logCounters); i++ { - cnt += n.LogCountForLevel(Threshold(i)) - } - - return cnt -} - -// ResetLogCounters resets the invocation counters for all levels. -func (n *Notepad) ResetLogCounters() { - for _, np := range n.logCounters { - np.resetCounter() +// LogCounter creates a LogListener that counts log statements >= the given threshold. +func LogCounter(counter *Counter, t1 Threshold) LogListener { + return func(t2 Threshold) io.Writer { + if t2 < t1 { + // Not interested in this threshold. + return nil + } + return counter } } diff --git a/vendor/github.com/spf13/jwalterweatherman/notepad.go b/vendor/github.com/spf13/jwalterweatherman/notepad.go index ae5aaf71..cc7957bf 100644 --- a/vendor/github.com/spf13/jwalterweatherman/notepad.go +++ b/vendor/github.com/spf13/jwalterweatherman/notepad.go @@ -8,6 +8,7 @@ package jwalterweatherman import ( "fmt" "io" + "io/ioutil" "log" ) @@ -58,13 +59,28 @@ type Notepad struct { prefix string flags int - // One per Threshold - logCounters [7]*logCounter + logListeners []LogListener } -// NewNotepad create a new notepad. -func NewNotepad(outThreshold Threshold, logThreshold Threshold, outHandle, logHandle io.Writer, prefix string, flags int) *Notepad { - n := &Notepad{} +// A LogListener can ble supplied to a Notepad to listen on log writes for a given +// threshold. This can be used to capture log events in unit tests and similar. +// Note that this function will be invoked once for each log threshold. If +// the given threshold is not of interest to you, return nil. +// Note that these listeners will receive log events for a given threshold, even +// if the current configuration says not to log it. That way you can count ERRORs even +// if you don't print them to the console. +type LogListener func(t Threshold) io.Writer + +// NewNotepad creates a new Notepad. +func NewNotepad( + outThreshold Threshold, + logThreshold Threshold, + outHandle, logHandle io.Writer, + prefix string, flags int, + logListeners ...LogListener, +) *Notepad { + + n := &Notepad{logListeners: logListeners} n.loggers = [7]**log.Logger{&n.TRACE, &n.DEBUG, &n.INFO, &n.WARN, &n.ERROR, &n.CRITICAL, &n.FATAL} n.outHandle = outHandle @@ -95,28 +111,43 @@ func (n *Notepad) init() { for t, logger := range n.loggers { threshold := Threshold(t) - counter := &logCounter{} - n.logCounters[t] = counter prefix := n.prefix + threshold.String() + " " switch { case threshold >= n.logThreshold && threshold >= n.stdoutThreshold: - *logger = log.New(io.MultiWriter(counter, logAndOut), prefix, n.flags) + *logger = log.New(n.createLogWriters(threshold, logAndOut), prefix, n.flags) case threshold >= n.logThreshold: - *logger = log.New(io.MultiWriter(counter, n.logHandle), prefix, n.flags) + *logger = log.New(n.createLogWriters(threshold, n.logHandle), prefix, n.flags) case threshold >= n.stdoutThreshold: - *logger = log.New(io.MultiWriter(counter, n.outHandle), prefix, n.flags) + *logger = log.New(n.createLogWriters(threshold, n.outHandle), prefix, n.flags) default: - // counter doesn't care about prefix and flags, so don't use them - // for performance. - *logger = log.New(counter, "", 0) + *logger = log.New(n.createLogWriters(threshold, ioutil.Discard), prefix, n.flags) } } } +func (n *Notepad) createLogWriters(t Threshold, handle io.Writer) io.Writer { + if len(n.logListeners) == 0 { + return handle + } + writers := []io.Writer{handle} + for _, l := range n.logListeners { + w := l(t) + if w != nil { + writers = append(writers, w) + } + } + + if len(writers) == 1 { + return handle + } + + return io.MultiWriter(writers...) +} + // SetLogThreshold changes the threshold above which messages are written to the // log file. func (n *Notepad) SetLogThreshold(threshold Threshold) { diff --git a/vendor/github.com/spf13/pflag/.travis.yml b/vendor/github.com/spf13/pflag/.travis.yml index f8a63b30..00d04cb9 100644 --- a/vendor/github.com/spf13/pflag/.travis.yml +++ b/vendor/github.com/spf13/pflag/.travis.yml @@ -3,8 +3,9 @@ sudo: false language: go go: - - 1.7.3 - - 1.8.1 + - 1.9.x + - 1.10.x + - 1.11.x - tip matrix: @@ -12,7 +13,7 @@ matrix: - go: tip install: - - go get github.com/golang/lint/golint + - go get golang.org/x/lint/golint - export PATH=$GOPATH/bin:$PATH - go install ./... diff --git a/vendor/github.com/spf13/pflag/README.md b/vendor/github.com/spf13/pflag/README.md index b052414d..7eacc5bd 100644 --- a/vendor/github.com/spf13/pflag/README.md +++ b/vendor/github.com/spf13/pflag/README.md @@ -86,8 +86,8 @@ fmt.Println("ip has value ", *ip) fmt.Println("flagvar has value ", flagvar) ``` -There are helpers function to get values later if you have the FlagSet but -it was difficult to keep up with all of the flag pointers in your code. +There are helper functions available to get the value stored in a Flag if you have a FlagSet but find +it difficult to keep up with all of the pointers in your code. If you have a pflag.FlagSet with a flag called 'flagname' of type int you can use GetInt() to get the int value. But notice that 'flagname' must exist and it must be an int. GetString("flagname") will fail. diff --git a/vendor/github.com/spf13/pflag/bool_slice.go b/vendor/github.com/spf13/pflag/bool_slice.go index 5af02f1a..3731370d 100644 --- a/vendor/github.com/spf13/pflag/bool_slice.go +++ b/vendor/github.com/spf13/pflag/bool_slice.go @@ -71,6 +71,44 @@ func (s *boolSliceValue) String() string { return "[" + out + "]" } +func (s *boolSliceValue) fromString(val string) (bool, error) { + return strconv.ParseBool(val) +} + +func (s *boolSliceValue) toString(val bool) string { + return strconv.FormatBool(val) +} + +func (s *boolSliceValue) Append(val string) error { + i, err := s.fromString(val) + if err != nil { + return err + } + *s.value = append(*s.value, i) + return nil +} + +func (s *boolSliceValue) Replace(val []string) error { + out := make([]bool, len(val)) + for i, d := range val { + var err error + out[i], err = s.fromString(d) + if err != nil { + return err + } + } + *s.value = out + return nil +} + +func (s *boolSliceValue) GetSlice() []string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = s.toString(d) + } + return out +} + func boolSliceConv(val string) (interface{}, error) { val = strings.Trim(val, "[]") // Empty string would cause a slice with one (empty) entry diff --git a/vendor/github.com/spf13/pflag/count.go b/vendor/github.com/spf13/pflag/count.go index aa126e44..a0b2679f 100644 --- a/vendor/github.com/spf13/pflag/count.go +++ b/vendor/github.com/spf13/pflag/count.go @@ -46,7 +46,7 @@ func (f *FlagSet) GetCount(name string) (int, error) { // CountVar defines a count flag with specified name, default value, and usage string. // The argument p points to an int variable in which to store the value of the flag. -// A count flag will add 1 to its value evey time it is found on the command line +// A count flag will add 1 to its value every time it is found on the command line func (f *FlagSet) CountVar(p *int, name string, usage string) { f.CountVarP(p, name, "", usage) } @@ -69,7 +69,7 @@ func CountVarP(p *int, name, shorthand string, usage string) { // Count defines a count flag with specified name, default value, and usage string. // The return value is the address of an int variable that stores the value of the flag. -// A count flag will add 1 to its value evey time it is found on the command line +// A count flag will add 1 to its value every time it is found on the command line func (f *FlagSet) Count(name string, usage string) *int { p := new(int) f.CountVarP(p, name, "", usage) diff --git a/vendor/github.com/spf13/pflag/duration_slice.go b/vendor/github.com/spf13/pflag/duration_slice.go index 52c6b6dc..badadda5 100644 --- a/vendor/github.com/spf13/pflag/duration_slice.go +++ b/vendor/github.com/spf13/pflag/duration_slice.go @@ -51,6 +51,44 @@ func (s *durationSliceValue) String() string { return "[" + strings.Join(out, ",") + "]" } +func (s *durationSliceValue) fromString(val string) (time.Duration, error) { + return time.ParseDuration(val) +} + +func (s *durationSliceValue) toString(val time.Duration) string { + return fmt.Sprintf("%s", val) +} + +func (s *durationSliceValue) Append(val string) error { + i, err := s.fromString(val) + if err != nil { + return err + } + *s.value = append(*s.value, i) + return nil +} + +func (s *durationSliceValue) Replace(val []string) error { + out := make([]time.Duration, len(val)) + for i, d := range val { + var err error + out[i], err = s.fromString(d) + if err != nil { + return err + } + } + *s.value = out + return nil +} + +func (s *durationSliceValue) GetSlice() []string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = s.toString(d) + } + return out +} + func durationSliceConv(val string) (interface{}, error) { val = strings.Trim(val, "[]") // Empty string would cause a slice with one (empty) entry diff --git a/vendor/github.com/spf13/pflag/flag.go b/vendor/github.com/spf13/pflag/flag.go index 9beeda8e..24a5036e 100644 --- a/vendor/github.com/spf13/pflag/flag.go +++ b/vendor/github.com/spf13/pflag/flag.go @@ -57,9 +57,9 @@ that give one-letter shorthands for flags. You can use these by appending var ip = flag.IntP("flagname", "f", 1234, "help message") var flagvar bool func init() { - flag.BoolVarP("boolname", "b", true, "help message") + flag.BoolVarP(&flagvar, "boolname", "b", true, "help message") } - flag.VarP(&flagVar, "varname", "v", 1234, "help message") + flag.VarP(&flagval, "varname", "v", "help message") Shorthand letters can be used with single dashes on the command line. Boolean shorthand flags can be combined with other shorthand flags. @@ -190,6 +190,18 @@ type Value interface { Type() string } +// SliceValue is a secondary interface to all flags which hold a list +// of values. This allows full control over the value of list flags, +// and avoids complicated marshalling and unmarshalling to csv. +type SliceValue interface { + // Append adds the specified value to the end of the flag value list. + Append(string) error + // Replace will fully overwrite any data currently in the flag value list. + Replace([]string) error + // GetSlice returns the flag value list as an array of strings. + GetSlice() []string +} + // sortFlags returns the flags as a slice in lexicographical sorted order. func sortFlags(flags map[NormalizedName]*Flag) []*Flag { list := make(sort.StringSlice, len(flags)) diff --git a/vendor/github.com/spf13/pflag/float32_slice.go b/vendor/github.com/spf13/pflag/float32_slice.go new file mode 100644 index 00000000..caa35274 --- /dev/null +++ b/vendor/github.com/spf13/pflag/float32_slice.go @@ -0,0 +1,174 @@ +package pflag + +import ( + "fmt" + "strconv" + "strings" +) + +// -- float32Slice Value +type float32SliceValue struct { + value *[]float32 + changed bool +} + +func newFloat32SliceValue(val []float32, p *[]float32) *float32SliceValue { + isv := new(float32SliceValue) + isv.value = p + *isv.value = val + return isv +} + +func (s *float32SliceValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make([]float32, len(ss)) + for i, d := range ss { + var err error + var temp64 float64 + temp64, err = strconv.ParseFloat(d, 32) + if err != nil { + return err + } + out[i] = float32(temp64) + + } + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + s.changed = true + return nil +} + +func (s *float32SliceValue) Type() string { + return "float32Slice" +} + +func (s *float32SliceValue) String() string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = fmt.Sprintf("%f", d) + } + return "[" + strings.Join(out, ",") + "]" +} + +func (s *float32SliceValue) fromString(val string) (float32, error) { + t64, err := strconv.ParseFloat(val, 32) + if err != nil { + return 0, err + } + return float32(t64), nil +} + +func (s *float32SliceValue) toString(val float32) string { + return fmt.Sprintf("%f", val) +} + +func (s *float32SliceValue) Append(val string) error { + i, err := s.fromString(val) + if err != nil { + return err + } + *s.value = append(*s.value, i) + return nil +} + +func (s *float32SliceValue) Replace(val []string) error { + out := make([]float32, len(val)) + for i, d := range val { + var err error + out[i], err = s.fromString(d) + if err != nil { + return err + } + } + *s.value = out + return nil +} + +func (s *float32SliceValue) GetSlice() []string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = s.toString(d) + } + return out +} + +func float32SliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []float32{}, nil + } + ss := strings.Split(val, ",") + out := make([]float32, len(ss)) + for i, d := range ss { + var err error + var temp64 float64 + temp64, err = strconv.ParseFloat(d, 32) + if err != nil { + return nil, err + } + out[i] = float32(temp64) + + } + return out, nil +} + +// GetFloat32Slice return the []float32 value of a flag with the given name +func (f *FlagSet) GetFloat32Slice(name string) ([]float32, error) { + val, err := f.getFlagType(name, "float32Slice", float32SliceConv) + if err != nil { + return []float32{}, err + } + return val.([]float32), nil +} + +// Float32SliceVar defines a float32Slice flag with specified name, default value, and usage string. +// The argument p points to a []float32 variable in which to store the value of the flag. +func (f *FlagSet) Float32SliceVar(p *[]float32, name string, value []float32, usage string) { + f.VarP(newFloat32SliceValue(value, p), name, "", usage) +} + +// Float32SliceVarP is like Float32SliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float32SliceVarP(p *[]float32, name, shorthand string, value []float32, usage string) { + f.VarP(newFloat32SliceValue(value, p), name, shorthand, usage) +} + +// Float32SliceVar defines a float32[] flag with specified name, default value, and usage string. +// The argument p points to a float32[] variable in which to store the value of the flag. +func Float32SliceVar(p *[]float32, name string, value []float32, usage string) { + CommandLine.VarP(newFloat32SliceValue(value, p), name, "", usage) +} + +// Float32SliceVarP is like Float32SliceVar, but accepts a shorthand letter that can be used after a single dash. +func Float32SliceVarP(p *[]float32, name, shorthand string, value []float32, usage string) { + CommandLine.VarP(newFloat32SliceValue(value, p), name, shorthand, usage) +} + +// Float32Slice defines a []float32 flag with specified name, default value, and usage string. +// The return value is the address of a []float32 variable that stores the value of the flag. +func (f *FlagSet) Float32Slice(name string, value []float32, usage string) *[]float32 { + p := []float32{} + f.Float32SliceVarP(&p, name, "", value, usage) + return &p +} + +// Float32SliceP is like Float32Slice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float32SliceP(name, shorthand string, value []float32, usage string) *[]float32 { + p := []float32{} + f.Float32SliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// Float32Slice defines a []float32 flag with specified name, default value, and usage string. +// The return value is the address of a []float32 variable that stores the value of the flag. +func Float32Slice(name string, value []float32, usage string) *[]float32 { + return CommandLine.Float32SliceP(name, "", value, usage) +} + +// Float32SliceP is like Float32Slice, but accepts a shorthand letter that can be used after a single dash. +func Float32SliceP(name, shorthand string, value []float32, usage string) *[]float32 { + return CommandLine.Float32SliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/spf13/pflag/float64_slice.go b/vendor/github.com/spf13/pflag/float64_slice.go new file mode 100644 index 00000000..85bf3073 --- /dev/null +++ b/vendor/github.com/spf13/pflag/float64_slice.go @@ -0,0 +1,166 @@ +package pflag + +import ( + "fmt" + "strconv" + "strings" +) + +// -- float64Slice Value +type float64SliceValue struct { + value *[]float64 + changed bool +} + +func newFloat64SliceValue(val []float64, p *[]float64) *float64SliceValue { + isv := new(float64SliceValue) + isv.value = p + *isv.value = val + return isv +} + +func (s *float64SliceValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make([]float64, len(ss)) + for i, d := range ss { + var err error + out[i], err = strconv.ParseFloat(d, 64) + if err != nil { + return err + } + + } + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + s.changed = true + return nil +} + +func (s *float64SliceValue) Type() string { + return "float64Slice" +} + +func (s *float64SliceValue) String() string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = fmt.Sprintf("%f", d) + } + return "[" + strings.Join(out, ",") + "]" +} + +func (s *float64SliceValue) fromString(val string) (float64, error) { + return strconv.ParseFloat(val, 64) +} + +func (s *float64SliceValue) toString(val float64) string { + return fmt.Sprintf("%f", val) +} + +func (s *float64SliceValue) Append(val string) error { + i, err := s.fromString(val) + if err != nil { + return err + } + *s.value = append(*s.value, i) + return nil +} + +func (s *float64SliceValue) Replace(val []string) error { + out := make([]float64, len(val)) + for i, d := range val { + var err error + out[i], err = s.fromString(d) + if err != nil { + return err + } + } + *s.value = out + return nil +} + +func (s *float64SliceValue) GetSlice() []string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = s.toString(d) + } + return out +} + +func float64SliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []float64{}, nil + } + ss := strings.Split(val, ",") + out := make([]float64, len(ss)) + for i, d := range ss { + var err error + out[i], err = strconv.ParseFloat(d, 64) + if err != nil { + return nil, err + } + + } + return out, nil +} + +// GetFloat64Slice return the []float64 value of a flag with the given name +func (f *FlagSet) GetFloat64Slice(name string) ([]float64, error) { + val, err := f.getFlagType(name, "float64Slice", float64SliceConv) + if err != nil { + return []float64{}, err + } + return val.([]float64), nil +} + +// Float64SliceVar defines a float64Slice flag with specified name, default value, and usage string. +// The argument p points to a []float64 variable in which to store the value of the flag. +func (f *FlagSet) Float64SliceVar(p *[]float64, name string, value []float64, usage string) { + f.VarP(newFloat64SliceValue(value, p), name, "", usage) +} + +// Float64SliceVarP is like Float64SliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float64SliceVarP(p *[]float64, name, shorthand string, value []float64, usage string) { + f.VarP(newFloat64SliceValue(value, p), name, shorthand, usage) +} + +// Float64SliceVar defines a float64[] flag with specified name, default value, and usage string. +// The argument p points to a float64[] variable in which to store the value of the flag. +func Float64SliceVar(p *[]float64, name string, value []float64, usage string) { + CommandLine.VarP(newFloat64SliceValue(value, p), name, "", usage) +} + +// Float64SliceVarP is like Float64SliceVar, but accepts a shorthand letter that can be used after a single dash. +func Float64SliceVarP(p *[]float64, name, shorthand string, value []float64, usage string) { + CommandLine.VarP(newFloat64SliceValue(value, p), name, shorthand, usage) +} + +// Float64Slice defines a []float64 flag with specified name, default value, and usage string. +// The return value is the address of a []float64 variable that stores the value of the flag. +func (f *FlagSet) Float64Slice(name string, value []float64, usage string) *[]float64 { + p := []float64{} + f.Float64SliceVarP(&p, name, "", value, usage) + return &p +} + +// Float64SliceP is like Float64Slice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float64SliceP(name, shorthand string, value []float64, usage string) *[]float64 { + p := []float64{} + f.Float64SliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// Float64Slice defines a []float64 flag with specified name, default value, and usage string. +// The return value is the address of a []float64 variable that stores the value of the flag. +func Float64Slice(name string, value []float64, usage string) *[]float64 { + return CommandLine.Float64SliceP(name, "", value, usage) +} + +// Float64SliceP is like Float64Slice, but accepts a shorthand letter that can be used after a single dash. +func Float64SliceP(name, shorthand string, value []float64, usage string) *[]float64 { + return CommandLine.Float64SliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/spf13/pflag/go.mod b/vendor/github.com/spf13/pflag/go.mod new file mode 100644 index 00000000..b2287eec --- /dev/null +++ b/vendor/github.com/spf13/pflag/go.mod @@ -0,0 +1,3 @@ +module github.com/spf13/pflag + +go 1.12 diff --git a/vendor/github.com/spf13/pflag/go.sum b/vendor/github.com/spf13/pflag/go.sum new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/spf13/pflag/int32_slice.go b/vendor/github.com/spf13/pflag/int32_slice.go new file mode 100644 index 00000000..ff128ff0 --- /dev/null +++ b/vendor/github.com/spf13/pflag/int32_slice.go @@ -0,0 +1,174 @@ +package pflag + +import ( + "fmt" + "strconv" + "strings" +) + +// -- int32Slice Value +type int32SliceValue struct { + value *[]int32 + changed bool +} + +func newInt32SliceValue(val []int32, p *[]int32) *int32SliceValue { + isv := new(int32SliceValue) + isv.value = p + *isv.value = val + return isv +} + +func (s *int32SliceValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make([]int32, len(ss)) + for i, d := range ss { + var err error + var temp64 int64 + temp64, err = strconv.ParseInt(d, 0, 32) + if err != nil { + return err + } + out[i] = int32(temp64) + + } + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + s.changed = true + return nil +} + +func (s *int32SliceValue) Type() string { + return "int32Slice" +} + +func (s *int32SliceValue) String() string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = fmt.Sprintf("%d", d) + } + return "[" + strings.Join(out, ",") + "]" +} + +func (s *int32SliceValue) fromString(val string) (int32, error) { + t64, err := strconv.ParseInt(val, 0, 32) + if err != nil { + return 0, err + } + return int32(t64), nil +} + +func (s *int32SliceValue) toString(val int32) string { + return fmt.Sprintf("%d", val) +} + +func (s *int32SliceValue) Append(val string) error { + i, err := s.fromString(val) + if err != nil { + return err + } + *s.value = append(*s.value, i) + return nil +} + +func (s *int32SliceValue) Replace(val []string) error { + out := make([]int32, len(val)) + for i, d := range val { + var err error + out[i], err = s.fromString(d) + if err != nil { + return err + } + } + *s.value = out + return nil +} + +func (s *int32SliceValue) GetSlice() []string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = s.toString(d) + } + return out +} + +func int32SliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []int32{}, nil + } + ss := strings.Split(val, ",") + out := make([]int32, len(ss)) + for i, d := range ss { + var err error + var temp64 int64 + temp64, err = strconv.ParseInt(d, 0, 32) + if err != nil { + return nil, err + } + out[i] = int32(temp64) + + } + return out, nil +} + +// GetInt32Slice return the []int32 value of a flag with the given name +func (f *FlagSet) GetInt32Slice(name string) ([]int32, error) { + val, err := f.getFlagType(name, "int32Slice", int32SliceConv) + if err != nil { + return []int32{}, err + } + return val.([]int32), nil +} + +// Int32SliceVar defines a int32Slice flag with specified name, default value, and usage string. +// The argument p points to a []int32 variable in which to store the value of the flag. +func (f *FlagSet) Int32SliceVar(p *[]int32, name string, value []int32, usage string) { + f.VarP(newInt32SliceValue(value, p), name, "", usage) +} + +// Int32SliceVarP is like Int32SliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int32SliceVarP(p *[]int32, name, shorthand string, value []int32, usage string) { + f.VarP(newInt32SliceValue(value, p), name, shorthand, usage) +} + +// Int32SliceVar defines a int32[] flag with specified name, default value, and usage string. +// The argument p points to a int32[] variable in which to store the value of the flag. +func Int32SliceVar(p *[]int32, name string, value []int32, usage string) { + CommandLine.VarP(newInt32SliceValue(value, p), name, "", usage) +} + +// Int32SliceVarP is like Int32SliceVar, but accepts a shorthand letter that can be used after a single dash. +func Int32SliceVarP(p *[]int32, name, shorthand string, value []int32, usage string) { + CommandLine.VarP(newInt32SliceValue(value, p), name, shorthand, usage) +} + +// Int32Slice defines a []int32 flag with specified name, default value, and usage string. +// The return value is the address of a []int32 variable that stores the value of the flag. +func (f *FlagSet) Int32Slice(name string, value []int32, usage string) *[]int32 { + p := []int32{} + f.Int32SliceVarP(&p, name, "", value, usage) + return &p +} + +// Int32SliceP is like Int32Slice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int32SliceP(name, shorthand string, value []int32, usage string) *[]int32 { + p := []int32{} + f.Int32SliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// Int32Slice defines a []int32 flag with specified name, default value, and usage string. +// The return value is the address of a []int32 variable that stores the value of the flag. +func Int32Slice(name string, value []int32, usage string) *[]int32 { + return CommandLine.Int32SliceP(name, "", value, usage) +} + +// Int32SliceP is like Int32Slice, but accepts a shorthand letter that can be used after a single dash. +func Int32SliceP(name, shorthand string, value []int32, usage string) *[]int32 { + return CommandLine.Int32SliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/spf13/pflag/int64_slice.go b/vendor/github.com/spf13/pflag/int64_slice.go new file mode 100644 index 00000000..25464638 --- /dev/null +++ b/vendor/github.com/spf13/pflag/int64_slice.go @@ -0,0 +1,166 @@ +package pflag + +import ( + "fmt" + "strconv" + "strings" +) + +// -- int64Slice Value +type int64SliceValue struct { + value *[]int64 + changed bool +} + +func newInt64SliceValue(val []int64, p *[]int64) *int64SliceValue { + isv := new(int64SliceValue) + isv.value = p + *isv.value = val + return isv +} + +func (s *int64SliceValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make([]int64, len(ss)) + for i, d := range ss { + var err error + out[i], err = strconv.ParseInt(d, 0, 64) + if err != nil { + return err + } + + } + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + s.changed = true + return nil +} + +func (s *int64SliceValue) Type() string { + return "int64Slice" +} + +func (s *int64SliceValue) String() string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = fmt.Sprintf("%d", d) + } + return "[" + strings.Join(out, ",") + "]" +} + +func (s *int64SliceValue) fromString(val string) (int64, error) { + return strconv.ParseInt(val, 0, 64) +} + +func (s *int64SliceValue) toString(val int64) string { + return fmt.Sprintf("%d", val) +} + +func (s *int64SliceValue) Append(val string) error { + i, err := s.fromString(val) + if err != nil { + return err + } + *s.value = append(*s.value, i) + return nil +} + +func (s *int64SliceValue) Replace(val []string) error { + out := make([]int64, len(val)) + for i, d := range val { + var err error + out[i], err = s.fromString(d) + if err != nil { + return err + } + } + *s.value = out + return nil +} + +func (s *int64SliceValue) GetSlice() []string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = s.toString(d) + } + return out +} + +func int64SliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []int64{}, nil + } + ss := strings.Split(val, ",") + out := make([]int64, len(ss)) + for i, d := range ss { + var err error + out[i], err = strconv.ParseInt(d, 0, 64) + if err != nil { + return nil, err + } + + } + return out, nil +} + +// GetInt64Slice return the []int64 value of a flag with the given name +func (f *FlagSet) GetInt64Slice(name string) ([]int64, error) { + val, err := f.getFlagType(name, "int64Slice", int64SliceConv) + if err != nil { + return []int64{}, err + } + return val.([]int64), nil +} + +// Int64SliceVar defines a int64Slice flag with specified name, default value, and usage string. +// The argument p points to a []int64 variable in which to store the value of the flag. +func (f *FlagSet) Int64SliceVar(p *[]int64, name string, value []int64, usage string) { + f.VarP(newInt64SliceValue(value, p), name, "", usage) +} + +// Int64SliceVarP is like Int64SliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int64SliceVarP(p *[]int64, name, shorthand string, value []int64, usage string) { + f.VarP(newInt64SliceValue(value, p), name, shorthand, usage) +} + +// Int64SliceVar defines a int64[] flag with specified name, default value, and usage string. +// The argument p points to a int64[] variable in which to store the value of the flag. +func Int64SliceVar(p *[]int64, name string, value []int64, usage string) { + CommandLine.VarP(newInt64SliceValue(value, p), name, "", usage) +} + +// Int64SliceVarP is like Int64SliceVar, but accepts a shorthand letter that can be used after a single dash. +func Int64SliceVarP(p *[]int64, name, shorthand string, value []int64, usage string) { + CommandLine.VarP(newInt64SliceValue(value, p), name, shorthand, usage) +} + +// Int64Slice defines a []int64 flag with specified name, default value, and usage string. +// The return value is the address of a []int64 variable that stores the value of the flag. +func (f *FlagSet) Int64Slice(name string, value []int64, usage string) *[]int64 { + p := []int64{} + f.Int64SliceVarP(&p, name, "", value, usage) + return &p +} + +// Int64SliceP is like Int64Slice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int64SliceP(name, shorthand string, value []int64, usage string) *[]int64 { + p := []int64{} + f.Int64SliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// Int64Slice defines a []int64 flag with specified name, default value, and usage string. +// The return value is the address of a []int64 variable that stores the value of the flag. +func Int64Slice(name string, value []int64, usage string) *[]int64 { + return CommandLine.Int64SliceP(name, "", value, usage) +} + +// Int64SliceP is like Int64Slice, but accepts a shorthand letter that can be used after a single dash. +func Int64SliceP(name, shorthand string, value []int64, usage string) *[]int64 { + return CommandLine.Int64SliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/spf13/pflag/int_slice.go b/vendor/github.com/spf13/pflag/int_slice.go index 1e7c9edd..e71c39d9 100644 --- a/vendor/github.com/spf13/pflag/int_slice.go +++ b/vendor/github.com/spf13/pflag/int_slice.go @@ -51,6 +51,36 @@ func (s *intSliceValue) String() string { return "[" + strings.Join(out, ",") + "]" } +func (s *intSliceValue) Append(val string) error { + i, err := strconv.Atoi(val) + if err != nil { + return err + } + *s.value = append(*s.value, i) + return nil +} + +func (s *intSliceValue) Replace(val []string) error { + out := make([]int, len(val)) + for i, d := range val { + var err error + out[i], err = strconv.Atoi(d) + if err != nil { + return err + } + } + *s.value = out + return nil +} + +func (s *intSliceValue) GetSlice() []string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = strconv.Itoa(d) + } + return out +} + func intSliceConv(val string) (interface{}, error) { val = strings.Trim(val, "[]") // Empty string would cause a slice with one (empty) entry diff --git a/vendor/github.com/spf13/pflag/ip_slice.go b/vendor/github.com/spf13/pflag/ip_slice.go index 7dd196fe..775faae4 100644 --- a/vendor/github.com/spf13/pflag/ip_slice.go +++ b/vendor/github.com/spf13/pflag/ip_slice.go @@ -72,9 +72,47 @@ func (s *ipSliceValue) String() string { return "[" + out + "]" } +func (s *ipSliceValue) fromString(val string) (net.IP, error) { + return net.ParseIP(strings.TrimSpace(val)), nil +} + +func (s *ipSliceValue) toString(val net.IP) string { + return val.String() +} + +func (s *ipSliceValue) Append(val string) error { + i, err := s.fromString(val) + if err != nil { + return err + } + *s.value = append(*s.value, i) + return nil +} + +func (s *ipSliceValue) Replace(val []string) error { + out := make([]net.IP, len(val)) + for i, d := range val { + var err error + out[i], err = s.fromString(d) + if err != nil { + return err + } + } + *s.value = out + return nil +} + +func (s *ipSliceValue) GetSlice() []string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = s.toString(d) + } + return out +} + func ipSliceConv(val string) (interface{}, error) { val = strings.Trim(val, "[]") - // Emtpy string would cause a slice with one (empty) entry + // Empty string would cause a slice with one (empty) entry if len(val) == 0 { return []net.IP{}, nil } diff --git a/vendor/github.com/spf13/pflag/string_array.go b/vendor/github.com/spf13/pflag/string_array.go index fa7bc601..4894af81 100644 --- a/vendor/github.com/spf13/pflag/string_array.go +++ b/vendor/github.com/spf13/pflag/string_array.go @@ -23,6 +23,32 @@ func (s *stringArrayValue) Set(val string) error { return nil } +func (s *stringArrayValue) Append(val string) error { + *s.value = append(*s.value, val) + return nil +} + +func (s *stringArrayValue) Replace(val []string) error { + out := make([]string, len(val)) + for i, d := range val { + var err error + out[i] = d + if err != nil { + return err + } + } + *s.value = out + return nil +} + +func (s *stringArrayValue) GetSlice() []string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = d + } + return out +} + func (s *stringArrayValue) Type() string { return "stringArray" } diff --git a/vendor/github.com/spf13/pflag/string_slice.go b/vendor/github.com/spf13/pflag/string_slice.go index 0cd3ccc0..3cb2e69d 100644 --- a/vendor/github.com/spf13/pflag/string_slice.go +++ b/vendor/github.com/spf13/pflag/string_slice.go @@ -62,6 +62,20 @@ func (s *stringSliceValue) String() string { return "[" + str + "]" } +func (s *stringSliceValue) Append(val string) error { + *s.value = append(*s.value, val) + return nil +} + +func (s *stringSliceValue) Replace(val []string) error { + *s.value = val + return nil +} + +func (s *stringSliceValue) GetSlice() []string { + return *s.value +} + func stringSliceConv(sval string) (interface{}, error) { sval = sval[1 : len(sval)-1] // An empty string would cause a slice with one (empty) string @@ -84,7 +98,7 @@ func (f *FlagSet) GetStringSlice(name string) ([]string, error) { // The argument p points to a []string variable in which to store the value of the flag. // Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. // For example: -// --ss="v1,v2" -ss="v3" +// --ss="v1,v2" --ss="v3" // will result in // []string{"v1", "v2", "v3"} func (f *FlagSet) StringSliceVar(p *[]string, name string, value []string, usage string) { @@ -100,7 +114,7 @@ func (f *FlagSet) StringSliceVarP(p *[]string, name, shorthand string, value []s // The argument p points to a []string variable in which to store the value of the flag. // Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. // For example: -// --ss="v1,v2" -ss="v3" +// --ss="v1,v2" --ss="v3" // will result in // []string{"v1", "v2", "v3"} func StringSliceVar(p *[]string, name string, value []string, usage string) { @@ -116,7 +130,7 @@ func StringSliceVarP(p *[]string, name, shorthand string, value []string, usage // The return value is the address of a []string variable that stores the value of the flag. // Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. // For example: -// --ss="v1,v2" -ss="v3" +// --ss="v1,v2" --ss="v3" // will result in // []string{"v1", "v2", "v3"} func (f *FlagSet) StringSlice(name string, value []string, usage string) *[]string { @@ -136,7 +150,7 @@ func (f *FlagSet) StringSliceP(name, shorthand string, value []string, usage str // The return value is the address of a []string variable that stores the value of the flag. // Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. // For example: -// --ss="v1,v2" -ss="v3" +// --ss="v1,v2" --ss="v3" // will result in // []string{"v1", "v2", "v3"} func StringSlice(name string, value []string, usage string) *[]string { diff --git a/vendor/github.com/spf13/pflag/string_to_int64.go b/vendor/github.com/spf13/pflag/string_to_int64.go new file mode 100644 index 00000000..a807a04a --- /dev/null +++ b/vendor/github.com/spf13/pflag/string_to_int64.go @@ -0,0 +1,149 @@ +package pflag + +import ( + "bytes" + "fmt" + "strconv" + "strings" +) + +// -- stringToInt64 Value +type stringToInt64Value struct { + value *map[string]int64 + changed bool +} + +func newStringToInt64Value(val map[string]int64, p *map[string]int64) *stringToInt64Value { + ssv := new(stringToInt64Value) + ssv.value = p + *ssv.value = val + return ssv +} + +// Format: a=1,b=2 +func (s *stringToInt64Value) Set(val string) error { + ss := strings.Split(val, ",") + out := make(map[string]int64, len(ss)) + for _, pair := range ss { + kv := strings.SplitN(pair, "=", 2) + if len(kv) != 2 { + return fmt.Errorf("%s must be formatted as key=value", pair) + } + var err error + out[kv[0]], err = strconv.ParseInt(kv[1], 10, 64) + if err != nil { + return err + } + } + if !s.changed { + *s.value = out + } else { + for k, v := range out { + (*s.value)[k] = v + } + } + s.changed = true + return nil +} + +func (s *stringToInt64Value) Type() string { + return "stringToInt64" +} + +func (s *stringToInt64Value) String() string { + var buf bytes.Buffer + i := 0 + for k, v := range *s.value { + if i > 0 { + buf.WriteRune(',') + } + buf.WriteString(k) + buf.WriteRune('=') + buf.WriteString(strconv.FormatInt(v, 10)) + i++ + } + return "[" + buf.String() + "]" +} + +func stringToInt64Conv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // An empty string would cause an empty map + if len(val) == 0 { + return map[string]int64{}, nil + } + ss := strings.Split(val, ",") + out := make(map[string]int64, len(ss)) + for _, pair := range ss { + kv := strings.SplitN(pair, "=", 2) + if len(kv) != 2 { + return nil, fmt.Errorf("%s must be formatted as key=value", pair) + } + var err error + out[kv[0]], err = strconv.ParseInt(kv[1], 10, 64) + if err != nil { + return nil, err + } + } + return out, nil +} + +// GetStringToInt64 return the map[string]int64 value of a flag with the given name +func (f *FlagSet) GetStringToInt64(name string) (map[string]int64, error) { + val, err := f.getFlagType(name, "stringToInt64", stringToInt64Conv) + if err != nil { + return map[string]int64{}, err + } + return val.(map[string]int64), nil +} + +// StringToInt64Var defines a string flag with specified name, default value, and usage string. +// The argument p point64s to a map[string]int64 variable in which to store the values of the multiple flags. +// The value of each argument will not try to be separated by comma +func (f *FlagSet) StringToInt64Var(p *map[string]int64, name string, value map[string]int64, usage string) { + f.VarP(newStringToInt64Value(value, p), name, "", usage) +} + +// StringToInt64VarP is like StringToInt64Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringToInt64VarP(p *map[string]int64, name, shorthand string, value map[string]int64, usage string) { + f.VarP(newStringToInt64Value(value, p), name, shorthand, usage) +} + +// StringToInt64Var defines a string flag with specified name, default value, and usage string. +// The argument p point64s to a map[string]int64 variable in which to store the value of the flag. +// The value of each argument will not try to be separated by comma +func StringToInt64Var(p *map[string]int64, name string, value map[string]int64, usage string) { + CommandLine.VarP(newStringToInt64Value(value, p), name, "", usage) +} + +// StringToInt64VarP is like StringToInt64Var, but accepts a shorthand letter that can be used after a single dash. +func StringToInt64VarP(p *map[string]int64, name, shorthand string, value map[string]int64, usage string) { + CommandLine.VarP(newStringToInt64Value(value, p), name, shorthand, usage) +} + +// StringToInt64 defines a string flag with specified name, default value, and usage string. +// The return value is the address of a map[string]int64 variable that stores the value of the flag. +// The value of each argument will not try to be separated by comma +func (f *FlagSet) StringToInt64(name string, value map[string]int64, usage string) *map[string]int64 { + p := map[string]int64{} + f.StringToInt64VarP(&p, name, "", value, usage) + return &p +} + +// StringToInt64P is like StringToInt64, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringToInt64P(name, shorthand string, value map[string]int64, usage string) *map[string]int64 { + p := map[string]int64{} + f.StringToInt64VarP(&p, name, shorthand, value, usage) + return &p +} + +// StringToInt64 defines a string flag with specified name, default value, and usage string. +// The return value is the address of a map[string]int64 variable that stores the value of the flag. +// The value of each argument will not try to be separated by comma +func StringToInt64(name string, value map[string]int64, usage string) *map[string]int64 { + return CommandLine.StringToInt64P(name, "", value, usage) +} + +// StringToInt64P is like StringToInt64, but accepts a shorthand letter that can be used after a single dash. +func StringToInt64P(name, shorthand string, value map[string]int64, usage string) *map[string]int64 { + return CommandLine.StringToInt64P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/spf13/pflag/uint_slice.go b/vendor/github.com/spf13/pflag/uint_slice.go index edd94c60..5fa92483 100644 --- a/vendor/github.com/spf13/pflag/uint_slice.go +++ b/vendor/github.com/spf13/pflag/uint_slice.go @@ -50,6 +50,48 @@ func (s *uintSliceValue) String() string { return "[" + strings.Join(out, ",") + "]" } +func (s *uintSliceValue) fromString(val string) (uint, error) { + t, err := strconv.ParseUint(val, 10, 0) + if err != nil { + return 0, err + } + return uint(t), nil +} + +func (s *uintSliceValue) toString(val uint) string { + return fmt.Sprintf("%d", val) +} + +func (s *uintSliceValue) Append(val string) error { + i, err := s.fromString(val) + if err != nil { + return err + } + *s.value = append(*s.value, i) + return nil +} + +func (s *uintSliceValue) Replace(val []string) error { + out := make([]uint, len(val)) + for i, d := range val { + var err error + out[i], err = s.fromString(d) + if err != nil { + return err + } + } + *s.value = out + return nil +} + +func (s *uintSliceValue) GetSlice() []string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = s.toString(d) + } + return out +} + func uintSliceConv(val string) (interface{}, error) { val = strings.Trim(val, "[]") // Empty string would cause a slice with one (empty) entry diff --git a/vendor/github.com/stretchr/testify/LICENSE b/vendor/github.com/stretchr/testify/LICENSE index 4b0421cf..473b670a 100644 --- a/vendor/github.com/stretchr/testify/LICENSE +++ b/vendor/github.com/stretchr/testify/LICENSE @@ -1,21 +1,22 @@ -MIT License +Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell -Copyright (c) 2012-2020 Mat Ryer, Tyler Bunnell and contributors. +Please consider promoting this project if you find it useful. -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: +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 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. +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/stretchr/testify/assert/assertion_compare.go b/vendor/github.com/stretchr/testify/assert/assertion_compare.go deleted file mode 100644 index dc200395..00000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_compare.go +++ /dev/null @@ -1,274 +0,0 @@ -package assert - -import ( - "fmt" - "reflect" -) - -type CompareType int - -const ( - compareLess CompareType = iota - 1 - compareEqual - compareGreater -) - -func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { - switch kind { - case reflect.Int: - { - intobj1 := obj1.(int) - intobj2 := obj2.(int) - if intobj1 > intobj2 { - return compareGreater, true - } - if intobj1 == intobj2 { - return compareEqual, true - } - if intobj1 < intobj2 { - return compareLess, true - } - } - case reflect.Int8: - { - int8obj1 := obj1.(int8) - int8obj2 := obj2.(int8) - if int8obj1 > int8obj2 { - return compareGreater, true - } - if int8obj1 == int8obj2 { - return compareEqual, true - } - if int8obj1 < int8obj2 { - return compareLess, true - } - } - case reflect.Int16: - { - int16obj1 := obj1.(int16) - int16obj2 := obj2.(int16) - if int16obj1 > int16obj2 { - return compareGreater, true - } - if int16obj1 == int16obj2 { - return compareEqual, true - } - if int16obj1 < int16obj2 { - return compareLess, true - } - } - case reflect.Int32: - { - int32obj1 := obj1.(int32) - int32obj2 := obj2.(int32) - if int32obj1 > int32obj2 { - return compareGreater, true - } - if int32obj1 == int32obj2 { - return compareEqual, true - } - if int32obj1 < int32obj2 { - return compareLess, true - } - } - case reflect.Int64: - { - int64obj1 := obj1.(int64) - int64obj2 := obj2.(int64) - if int64obj1 > int64obj2 { - return compareGreater, true - } - if int64obj1 == int64obj2 { - return compareEqual, true - } - if int64obj1 < int64obj2 { - return compareLess, true - } - } - case reflect.Uint: - { - uintobj1 := obj1.(uint) - uintobj2 := obj2.(uint) - if uintobj1 > uintobj2 { - return compareGreater, true - } - if uintobj1 == uintobj2 { - return compareEqual, true - } - if uintobj1 < uintobj2 { - return compareLess, true - } - } - case reflect.Uint8: - { - uint8obj1 := obj1.(uint8) - uint8obj2 := obj2.(uint8) - if uint8obj1 > uint8obj2 { - return compareGreater, true - } - if uint8obj1 == uint8obj2 { - return compareEqual, true - } - if uint8obj1 < uint8obj2 { - return compareLess, true - } - } - case reflect.Uint16: - { - uint16obj1 := obj1.(uint16) - uint16obj2 := obj2.(uint16) - if uint16obj1 > uint16obj2 { - return compareGreater, true - } - if uint16obj1 == uint16obj2 { - return compareEqual, true - } - if uint16obj1 < uint16obj2 { - return compareLess, true - } - } - case reflect.Uint32: - { - uint32obj1 := obj1.(uint32) - uint32obj2 := obj2.(uint32) - if uint32obj1 > uint32obj2 { - return compareGreater, true - } - if uint32obj1 == uint32obj2 { - return compareEqual, true - } - if uint32obj1 < uint32obj2 { - return compareLess, true - } - } - case reflect.Uint64: - { - uint64obj1 := obj1.(uint64) - uint64obj2 := obj2.(uint64) - if uint64obj1 > uint64obj2 { - return compareGreater, true - } - if uint64obj1 == uint64obj2 { - return compareEqual, true - } - if uint64obj1 < uint64obj2 { - return compareLess, true - } - } - case reflect.Float32: - { - float32obj1 := obj1.(float32) - float32obj2 := obj2.(float32) - if float32obj1 > float32obj2 { - return compareGreater, true - } - if float32obj1 == float32obj2 { - return compareEqual, true - } - if float32obj1 < float32obj2 { - return compareLess, true - } - } - case reflect.Float64: - { - float64obj1 := obj1.(float64) - float64obj2 := obj2.(float64) - if float64obj1 > float64obj2 { - return compareGreater, true - } - if float64obj1 == float64obj2 { - return compareEqual, true - } - if float64obj1 < float64obj2 { - return compareLess, true - } - } - case reflect.String: - { - stringobj1 := obj1.(string) - stringobj2 := obj2.(string) - if stringobj1 > stringobj2 { - return compareGreater, true - } - if stringobj1 == stringobj2 { - return compareEqual, true - } - if stringobj1 < stringobj2 { - return compareLess, true - } - } - } - - return compareEqual, false -} - -// Greater asserts that the first element is greater than the second -// -// assert.Greater(t, 2, 1) -// assert.Greater(t, float64(2), float64(1)) -// assert.Greater(t, "b", "a") -func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs) -} - -// GreaterOrEqual asserts that the first element is greater than or equal to the second -// -// assert.GreaterOrEqual(t, 2, 1) -// assert.GreaterOrEqual(t, 2, 2) -// assert.GreaterOrEqual(t, "b", "a") -// assert.GreaterOrEqual(t, "b", "b") -func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs) -} - -// Less asserts that the first element is less than the second -// -// assert.Less(t, 1, 2) -// assert.Less(t, float64(1), float64(2)) -// assert.Less(t, "a", "b") -func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs) -} - -// LessOrEqual asserts that the first element is less than or equal to the second -// -// assert.LessOrEqual(t, 1, 2) -// assert.LessOrEqual(t, 2, 2) -// assert.LessOrEqual(t, "a", "b") -// assert.LessOrEqual(t, "b", "b") -func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs) -} - -func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - compareResult, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if !containsValue(allowedComparesResults, compareResult) { - return Fail(t, fmt.Sprintf(failMessage, e1, e2), msgAndArgs...) - } - - return true -} - -func containsValue(values []CompareType, value CompareType) bool { - for _, v := range values { - if v == value { - return true - } - } - - return false -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go deleted file mode 100644 index 49370eb1..00000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ /dev/null @@ -1,644 +0,0 @@ -/* -* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen -* THIS FILE MUST NOT BE EDITED BY HAND - */ - -package assert - -import ( - http "net/http" - url "net/url" - time "time" -) - -// Conditionf uses a Comparison to assert a complex condition. -func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Condition(t, comp, append([]interface{}{msg}, args...)...) -} - -// Containsf asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") -// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") -// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") -func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Contains(t, s, contains, append([]interface{}{msg}, args...)...) -} - -// DirExistsf checks whether a directory exists in the given path. It also fails -// if the path is a file rather a directory or there is an error checking whether it exists. -func DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return DirExists(t, path, append([]interface{}{msg}, args...)...) -} - -// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") -func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return ElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...) -} - -// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// assert.Emptyf(t, obj, "error message %s", "formatted") -func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Empty(t, object, append([]interface{}{msg}, args...)...) -} - -// Equalf asserts that two objects are equal. -// -// assert.Equalf(t, 123, 123, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Equal(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// EqualErrorf asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") -func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...) -} - -// EqualValuesf asserts that two objects are equal or convertable to the same types -// and equal. -// -// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") -func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Errorf asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if assert.Errorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } -func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Error(t, err, append([]interface{}{msg}, args...)...) -} - -// Eventuallyf asserts that given condition will be met in waitFor time, -// periodically checking target function each tick. -// -// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") -func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Eventually(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...) -} - -// Exactlyf asserts that two objects are equal in value and type. -// -// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") -func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Exactly(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Failf reports a failure through -func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Fail(t, failureMessage, append([]interface{}{msg}, args...)...) -} - -// FailNowf fails test -func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return FailNow(t, failureMessage, append([]interface{}{msg}, args...)...) -} - -// Falsef asserts that the specified value is false. -// -// assert.Falsef(t, myBool, "error message %s", "formatted") -func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return False(t, value, append([]interface{}{msg}, args...)...) -} - -// FileExistsf checks whether a file exists in the given path. It also fails if -// the path points to a directory or there is an error when trying to check the file. -func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return FileExists(t, path, append([]interface{}{msg}, args...)...) -} - -// Greaterf asserts that the first element is greater than the second -// -// assert.Greaterf(t, 2, 1, "error message %s", "formatted") -// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") -// assert.Greaterf(t, "b", "a", "error message %s", "formatted") -func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Greater(t, e1, e2, append([]interface{}{msg}, args...)...) -} - -// GreaterOrEqualf asserts that the first element is greater than or equal to the second -// -// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") -// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") -// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted") -// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted") -func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return GreaterOrEqual(t, e1, e2, append([]interface{}{msg}, args...)...) -} - -// HTTPBodyContainsf asserts that a specified handler returns a -// body that contains a string. -// -// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return HTTPBodyContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) -} - -// HTTPBodyNotContainsf asserts that a specified handler returns a -// body that does not contain a string. -// -// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return HTTPBodyNotContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) -} - -// HTTPErrorf asserts that a specified handler returns an error status code. -// -// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return HTTPError(t, handler, method, url, values, append([]interface{}{msg}, args...)...) -} - -// HTTPRedirectf asserts that a specified handler returns a redirect status code. -// -// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...) -} - -// HTTPStatusCodef asserts that a specified handler returns a specified status code. -// -// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return HTTPStatusCode(t, handler, method, url, values, statuscode, append([]interface{}{msg}, args...)...) -} - -// HTTPSuccessf asserts that a specified handler returns a success status code. -// -// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return HTTPSuccess(t, handler, method, url, values, append([]interface{}{msg}, args...)...) -} - -// Implementsf asserts that an object is implemented by the specified interface. -// -// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") -func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...) -} - -// InDeltaf asserts that the two numerals are within delta of each other. -// -// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") -func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return InDeltaMapValues(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// InDeltaSlicef is the same as InDelta, except it compares two slices. -func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// InEpsilonf asserts that expected and actual have a relative error less than epsilon -func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) -} - -// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. -func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) -} - -// IsTypef asserts that the specified objects are of the same type. -func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return IsType(t, expectedType, object, append([]interface{}{msg}, args...)...) -} - -// JSONEqf asserts that two JSON strings are equivalent. -// -// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") -func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Lenf asserts that the specified object has specific length. -// Lenf also fails if the object has a type that len() not accept. -// -// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") -func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Len(t, object, length, append([]interface{}{msg}, args...)...) -} - -// Lessf asserts that the first element is less than the second -// -// assert.Lessf(t, 1, 2, "error message %s", "formatted") -// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") -// assert.Lessf(t, "a", "b", "error message %s", "formatted") -func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Less(t, e1, e2, append([]interface{}{msg}, args...)...) -} - -// LessOrEqualf asserts that the first element is less than or equal to the second -// -// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") -// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") -// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted") -// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted") -func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return LessOrEqual(t, e1, e2, append([]interface{}{msg}, args...)...) -} - -// Neverf asserts that the given condition doesn't satisfy in waitFor time, -// periodically checking the target function each tick. -// -// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") -func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Never(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...) -} - -// Nilf asserts that the specified object is nil. -// -// assert.Nilf(t, err, "error message %s", "formatted") -func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Nil(t, object, append([]interface{}{msg}, args...)...) -} - -// NoDirExistsf checks whether a directory does not exist in the given path. -// It fails if the path points to an existing _directory_ only. -func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NoDirExists(t, path, append([]interface{}{msg}, args...)...) -} - -// NoErrorf asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if assert.NoErrorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } -func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NoError(t, err, append([]interface{}{msg}, args...)...) -} - -// NoFileExistsf checks whether a file does not exist in a given path. It fails -// if the path points to an existing _file_ only. -func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NoFileExists(t, path, append([]interface{}{msg}, args...)...) -} - -// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") -func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NotContains(t, s, contains, append([]interface{}{msg}, args...)...) -} - -// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } -func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NotEmpty(t, object, append([]interface{}{msg}, args...)...) -} - -// NotEqualf asserts that the specified values are NOT equal. -// -// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// NotEqualValuesf asserts that two objects are not equal even when converted to the same type -// -// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") -func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// NotNilf asserts that the specified object is not nil. -// -// assert.NotNilf(t, err, "error message %s", "formatted") -func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NotNil(t, object, append([]interface{}{msg}, args...)...) -} - -// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") -func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NotPanics(t, f, append([]interface{}{msg}, args...)...) -} - -// NotRegexpf asserts that a specified regexp does not match a string. -// -// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") -// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") -func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...) -} - -// NotSamef asserts that two pointers do not reference the same object. -// -// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") -// -// Both arguments must be pointer variables. Pointer variable sameness is -// determined based on the equality of both type and value. -func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NotSame(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// NotSubsetf asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") -func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NotSubset(t, list, subset, append([]interface{}{msg}, args...)...) -} - -// NotZerof asserts that i is not the zero value for its type. -func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return NotZero(t, i, append([]interface{}{msg}, args...)...) -} - -// Panicsf asserts that the code inside the specified PanicTestFunc panics. -// -// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") -func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Panics(t, f, append([]interface{}{msg}, args...)...) -} - -// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc -// panics, and that the recovered panic value is an error that satisfies the -// EqualError comparison. -// -// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") -func PanicsWithErrorf(t TestingT, errString string, f PanicTestFunc, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return PanicsWithError(t, errString, f, append([]interface{}{msg}, args...)...) -} - -// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") -func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...) -} - -// Regexpf asserts that a specified regexp matches a string. -// -// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") -// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") -func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Regexp(t, rx, str, append([]interface{}{msg}, args...)...) -} - -// Samef asserts that two pointers reference the same object. -// -// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted") -// -// Both arguments must be pointer variables. Pointer variable sameness is -// determined based on the equality of both type and value. -func Samef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Same(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Subsetf asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") -func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Subset(t, list, subset, append([]interface{}{msg}, args...)...) -} - -// Truef asserts that the specified value is true. -// -// assert.Truef(t, myBool, "error message %s", "formatted") -func Truef(t TestingT, value bool, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return True(t, value, append([]interface{}{msg}, args...)...) -} - -// WithinDurationf asserts that the two times are within duration delta of each other. -// -// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") -func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// YAMLEqf asserts that two YAML strings are equivalent. -func YAMLEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return YAMLEq(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Zerof asserts that i is the zero value for its type. -func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Zero(t, i, append([]interface{}{msg}, args...)...) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl b/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl deleted file mode 100644 index d2bb0b81..00000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl +++ /dev/null @@ -1,5 +0,0 @@ -{{.CommentFormat}} -func {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool { - if h, ok := t.(tHelper); ok { h.Helper() } - return {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}}) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index 9db88942..e6a79604 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -1,1276 +1,387 @@ /* * CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen * THIS FILE MUST NOT BE EDITED BY HAND - */ +*/ package assert import ( + http "net/http" url "net/url" time "time" ) + // Condition uses a Comparison to assert a complex condition. func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Condition(a.t, comp, msgAndArgs...) } -// Conditionf uses a Comparison to assert a complex condition. -func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Conditionf(a.t, comp, msg, args...) -} // Contains asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. -// -// a.Contains("Hello World", "World") -// a.Contains(["Hello", "World"], "World") -// a.Contains({"Hello": "World"}, "Hello") +// +// a.Contains("Hello World", "World", "But 'Hello World' does contain 'World'") +// a.Contains(["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'") +// a.Contains({"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Contains(a.t, s, contains, msgAndArgs...) } -// Containsf asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// a.Containsf("Hello World", "World", "error message %s", "formatted") -// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") -// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") -func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Containsf(a.t, s, contains, msg, args...) -} - -// DirExists checks whether a directory exists in the given path. It also fails -// if the path is a file rather a directory or there is an error checking whether it exists. -func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return DirExists(a.t, path, msgAndArgs...) -} - -// DirExistsf checks whether a directory exists in the given path. It also fails -// if the path is a file rather a directory or there is an error checking whether it exists. -func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return DirExistsf(a.t, path, msg, args...) -} - -// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2]) -func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return ElementsMatch(a.t, listA, listB, msgAndArgs...) -} - -// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") -func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return ElementsMatchf(a.t, listA, listB, msg, args...) -} // Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. -// +// // a.Empty(obj) +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Empty(a.t, object, msgAndArgs...) } -// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// a.Emptyf(obj, "error message %s", "formatted") -func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Emptyf(a.t, object, msg, args...) -} // Equal asserts that two objects are equal. -// -// a.Equal(123, 123) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. +// +// a.Equal(123, 123, "123 and 123 should be equal") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Equal(a.t, expected, actual, msgAndArgs...) } + // EqualError asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. -// +// // actualObj, err := SomeFunction() -// a.EqualError(err, expectedErrorString) +// if assert.Error(t, err, "An error was expected") { +// assert.Equal(t, err, expectedError) +// } +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return EqualError(a.t, theError, errString, msgAndArgs...) } -// EqualErrorf asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") -func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return EqualErrorf(a.t, theError, errString, msg, args...) -} // EqualValues asserts that two objects are equal or convertable to the same types // and equal. -// -// a.EqualValues(uint32(123), int32(123)) +// +// a.EqualValues(uint32(123), int32(123), "123 and 123 should be equal") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return EqualValues(a.t, expected, actual, msgAndArgs...) } -// EqualValuesf asserts that two objects are equal or convertable to the same types -// and equal. -// -// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") -func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return EqualValuesf(a.t, expected, actual, msg, args...) -} - -// Equalf asserts that two objects are equal. -// -// a.Equalf(123, 123, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Equalf(a.t, expected, actual, msg, args...) -} // Error asserts that a function returned an error (i.e. not `nil`). -// +// // actualObj, err := SomeFunction() -// if a.Error(err) { -// assert.Equal(t, expectedError, err) +// if a.Error(err, "An error was expected") { +// assert.Equal(t, err, expectedError) // } +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Error(a.t, err, msgAndArgs...) } -// Errorf asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if a.Errorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } -func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Errorf(a.t, err, msg, args...) -} -// Eventually asserts that given condition will be met in waitFor time, -// periodically checking target function each tick. -// -// a.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond) -func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Eventually(a.t, condition, waitFor, tick, msgAndArgs...) -} - -// Eventuallyf asserts that given condition will be met in waitFor time, -// periodically checking target function each tick. -// -// a.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") -func (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Eventuallyf(a.t, condition, waitFor, tick, msg, args...) -} - -// Exactly asserts that two objects are equal in value and type. -// -// a.Exactly(int32(123), int64(123)) +// Exactly asserts that two objects are equal is value and type. +// +// a.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Exactly(a.t, expected, actual, msgAndArgs...) } -// Exactlyf asserts that two objects are equal in value and type. -// -// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") -func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Exactlyf(a.t, expected, actual, msg, args...) -} // Fail reports a failure through func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Fail(a.t, failureMessage, msgAndArgs...) } + // FailNow fails test func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return FailNow(a.t, failureMessage, msgAndArgs...) } -// FailNowf fails test -func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return FailNowf(a.t, failureMessage, msg, args...) -} - -// Failf reports a failure through -func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Failf(a.t, failureMessage, msg, args...) -} // False asserts that the specified value is false. -// -// a.False(myBool) +// +// a.False(myBool, "myBool should be false") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return False(a.t, value, msgAndArgs...) } -// Falsef asserts that the specified value is false. -// -// a.Falsef(myBool, "error message %s", "formatted") -func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Falsef(a.t, value, msg, args...) -} - -// FileExists checks whether a file exists in the given path. It also fails if -// the path points to a directory or there is an error when trying to check the file. -func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return FileExists(a.t, path, msgAndArgs...) -} - -// FileExistsf checks whether a file exists in the given path. It also fails if -// the path points to a directory or there is an error when trying to check the file. -func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return FileExistsf(a.t, path, msg, args...) -} - -// Greater asserts that the first element is greater than the second -// -// a.Greater(2, 1) -// a.Greater(float64(2), float64(1)) -// a.Greater("b", "a") -func (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Greater(a.t, e1, e2, msgAndArgs...) -} - -// GreaterOrEqual asserts that the first element is greater than or equal to the second -// -// a.GreaterOrEqual(2, 1) -// a.GreaterOrEqual(2, 2) -// a.GreaterOrEqual("b", "a") -// a.GreaterOrEqual("b", "b") -func (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return GreaterOrEqual(a.t, e1, e2, msgAndArgs...) -} - -// GreaterOrEqualf asserts that the first element is greater than or equal to the second -// -// a.GreaterOrEqualf(2, 1, "error message %s", "formatted") -// a.GreaterOrEqualf(2, 2, "error message %s", "formatted") -// a.GreaterOrEqualf("b", "a", "error message %s", "formatted") -// a.GreaterOrEqualf("b", "b", "error message %s", "formatted") -func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return GreaterOrEqualf(a.t, e1, e2, msg, args...) -} - -// Greaterf asserts that the first element is greater than the second -// -// a.Greaterf(2, 1, "error message %s", "formatted") -// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") -// a.Greaterf("b", "a", "error message %s", "formatted") -func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Greaterf(a.t, e1, e2, msg, args...) -} // HTTPBodyContains asserts that a specified handler returns a // body that contains a string. -// -// a.HTTPBodyContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") -// +// +// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...) +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContains(a.t, handler, method, url, values, str) } -// HTTPBodyContainsf asserts that a specified handler returns a -// body that contains a string. -// -// a.HTTPBodyContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...) -} // HTTPBodyNotContains asserts that a specified handler returns a // body that does not contain a string. -// -// a.HTTPBodyNotContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") -// +// +// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...) +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContains(a.t, handler, method, url, values, str) } -// HTTPBodyNotContainsf asserts that a specified handler returns a -// body that does not contain a string. -// -// a.HTTPBodyNotContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...) -} // HTTPError asserts that a specified handler returns an error status code. -// +// // a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// +// // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPError(a.t, handler, method, url, values, msgAndArgs...) +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPError(a.t, handler, method, url, values) } -// HTTPErrorf asserts that a specified handler returns an error status code. -// -// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPErrorf(a.t, handler, method, url, values, msg, args...) -} // HTTPRedirect asserts that a specified handler returns a redirect status code. -// +// // a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// +// // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...) +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirect(a.t, handler, method, url, values) } -// HTTPRedirectf asserts that a specified handler returns a redirect status code. -// -// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPRedirectf(a.t, handler, method, url, values, msg, args...) -} - -// HTTPStatusCode asserts that a specified handler returns a specified status code. -// -// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...) -} - -// HTTPStatusCodef asserts that a specified handler returns a specified status code. -// -// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...) -} // HTTPSuccess asserts that a specified handler returns a success status code. -// +// // a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) -// +// // Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...) +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccess(a.t, handler, method, url, values) } -// HTTPSuccessf asserts that a specified handler returns a success status code. -// -// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return HTTPSuccessf(a.t, handler, method, url, values, msg, args...) -} // Implements asserts that an object is implemented by the specified interface. -// -// a.Implements((*MyInterface)(nil), new(MyObject)) +// +// a.Implements((*MyInterface)(nil), new(MyObject), "MyObject") func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Implements(a.t, interfaceObject, object, msgAndArgs...) } -// Implementsf asserts that an object is implemented by the specified interface. -// -// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") -func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Implementsf(a.t, interfaceObject, object, msg, args...) -} // InDelta asserts that the two numerals are within delta of each other. -// -// a.InDelta(math.Pi, 22/7.0, 0.01) +// +// a.InDelta(math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return InDelta(a.t, expected, actual, delta, msgAndArgs...) } -// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...) -} - -// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...) -} // InDeltaSlice is the same as InDelta, except it compares two slices. func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) } -// InDeltaSlicef is the same as InDelta, except it compares two slices. -func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return InDeltaSlicef(a.t, expected, actual, delta, msg, args...) -} - -// InDeltaf asserts that the two numerals are within delta of each other. -// -// a.InDeltaf(math.Pi, 22/7.0, 0.01, "error message %s", "formatted") -func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return InDeltaf(a.t, expected, actual, delta, msg, args...) -} // InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) } -// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. -func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) + +// InEpsilonSlice is the same as InEpsilon, except it compares two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InEpsilonSlice(a.t, expected, actual, delta, msgAndArgs...) } -// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. -func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) -} - -// InEpsilonf asserts that expected and actual have a relative error less than epsilon -func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return InEpsilonf(a.t, expected, actual, epsilon, msg, args...) -} // IsType asserts that the specified objects are of the same type. func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return IsType(a.t, expectedType, object, msgAndArgs...) } -// IsTypef asserts that the specified objects are of the same type. -func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return IsTypef(a.t, expectedType, object, msg, args...) -} // JSONEq asserts that two JSON strings are equivalent. -// +// // a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return JSONEq(a.t, expected, actual, msgAndArgs...) } -// JSONEqf asserts that two JSON strings are equivalent. -// -// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") -func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return JSONEqf(a.t, expected, actual, msg, args...) -} // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. -// -// a.Len(mySlice, 3) +// +// a.Len(mySlice, 3, "The size of slice is not 3") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Len(a.t, object, length, msgAndArgs...) } -// Lenf asserts that the specified object has specific length. -// Lenf also fails if the object has a type that len() not accept. -// -// a.Lenf(mySlice, 3, "error message %s", "formatted") -func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Lenf(a.t, object, length, msg, args...) -} - -// Less asserts that the first element is less than the second -// -// a.Less(1, 2) -// a.Less(float64(1), float64(2)) -// a.Less("a", "b") -func (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Less(a.t, e1, e2, msgAndArgs...) -} - -// LessOrEqual asserts that the first element is less than or equal to the second -// -// a.LessOrEqual(1, 2) -// a.LessOrEqual(2, 2) -// a.LessOrEqual("a", "b") -// a.LessOrEqual("b", "b") -func (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return LessOrEqual(a.t, e1, e2, msgAndArgs...) -} - -// LessOrEqualf asserts that the first element is less than or equal to the second -// -// a.LessOrEqualf(1, 2, "error message %s", "formatted") -// a.LessOrEqualf(2, 2, "error message %s", "formatted") -// a.LessOrEqualf("a", "b", "error message %s", "formatted") -// a.LessOrEqualf("b", "b", "error message %s", "formatted") -func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return LessOrEqualf(a.t, e1, e2, msg, args...) -} - -// Lessf asserts that the first element is less than the second -// -// a.Lessf(1, 2, "error message %s", "formatted") -// a.Lessf(float64(1), float64(2), "error message %s", "formatted") -// a.Lessf("a", "b", "error message %s", "formatted") -func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Lessf(a.t, e1, e2, msg, args...) -} - -// Never asserts that the given condition doesn't satisfy in waitFor time, -// periodically checking the target function each tick. -// -// a.Never(func() bool { return false; }, time.Second, 10*time.Millisecond) -func (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Never(a.t, condition, waitFor, tick, msgAndArgs...) -} - -// Neverf asserts that the given condition doesn't satisfy in waitFor time, -// periodically checking the target function each tick. -// -// a.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") -func (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Neverf(a.t, condition, waitFor, tick, msg, args...) -} // Nil asserts that the specified object is nil. -// -// a.Nil(err) +// +// a.Nil(err, "err should be nothing") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Nil(a.t, object, msgAndArgs...) } -// Nilf asserts that the specified object is nil. -// -// a.Nilf(err, "error message %s", "formatted") -func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Nilf(a.t, object, msg, args...) -} - -// NoDirExists checks whether a directory does not exist in the given path. -// It fails if the path points to an existing _directory_ only. -func (a *Assertions) NoDirExists(path string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NoDirExists(a.t, path, msgAndArgs...) -} - -// NoDirExistsf checks whether a directory does not exist in the given path. -// It fails if the path points to an existing _directory_ only. -func (a *Assertions) NoDirExistsf(path string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NoDirExistsf(a.t, path, msg, args...) -} // NoError asserts that a function returned no error (i.e. `nil`). -// +// // actualObj, err := SomeFunction() // if a.NoError(err) { -// assert.Equal(t, expectedObj, actualObj) +// assert.Equal(t, actualObj, expectedObj) // } +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return NoError(a.t, err, msgAndArgs...) } -// NoErrorf asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if a.NoErrorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } -func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NoErrorf(a.t, err, msg, args...) -} - -// NoFileExists checks whether a file does not exist in a given path. It fails -// if the path points to an existing _file_ only. -func (a *Assertions) NoFileExists(path string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NoFileExists(a.t, path, msgAndArgs...) -} - -// NoFileExistsf checks whether a file does not exist in a given path. It fails -// if the path points to an existing _file_ only. -func (a *Assertions) NoFileExistsf(path string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NoFileExistsf(a.t, path, msg, args...) -} // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. -// -// a.NotContains("Hello World", "Earth") -// a.NotContains(["Hello", "World"], "Earth") -// a.NotContains({"Hello": "World"}, "Earth") +// +// a.NotContains("Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'") +// a.NotContains(["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'") +// a.NotContains({"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return NotContains(a.t, s, contains, msgAndArgs...) } -// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") -// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") -// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") -func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotContainsf(a.t, s, contains, msg, args...) -} // NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. -// +// // if a.NotEmpty(obj) { // assert.Equal(t, "two", obj[1]) // } +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return NotEmpty(a.t, object, msgAndArgs...) } -// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if a.NotEmptyf(obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } -func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotEmptyf(a.t, object, msg, args...) -} // NotEqual asserts that the specified values are NOT equal. -// -// a.NotEqual(obj1, obj2) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). +// +// a.NotEqual(obj1, obj2, "two objects shouldn't be equal") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return NotEqual(a.t, expected, actual, msgAndArgs...) } -// NotEqualValues asserts that two objects are not equal even when converted to the same type -// -// a.NotEqualValues(obj1, obj2) -func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotEqualValues(a.t, expected, actual, msgAndArgs...) -} - -// NotEqualValuesf asserts that two objects are not equal even when converted to the same type -// -// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") -func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotEqualValuesf(a.t, expected, actual, msg, args...) -} - -// NotEqualf asserts that the specified values are NOT equal. -// -// a.NotEqualf(obj1, obj2, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotEqualf(a.t, expected, actual, msg, args...) -} // NotNil asserts that the specified object is not nil. -// -// a.NotNil(err) +// +// a.NotNil(err, "err should be something") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return NotNil(a.t, object, msgAndArgs...) } -// NotNilf asserts that the specified object is not nil. -// -// a.NotNilf(err, "error message %s", "formatted") -func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotNilf(a.t, object, msg, args...) -} // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// a.NotPanics(func(){ RemainCalm() }) +// +// a.NotPanics(func(){ +// RemainCalm() +// }, "Calling RemainCalm() should NOT panic") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return NotPanics(a.t, f, msgAndArgs...) } -// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") -func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotPanicsf(a.t, f, msg, args...) -} // NotRegexp asserts that a specified regexp does not match a string. -// +// // a.NotRegexp(regexp.MustCompile("starts"), "it's starting") // a.NotRegexp("^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return NotRegexp(a.t, rx, str, msgAndArgs...) } -// NotRegexpf asserts that a specified regexp does not match a string. -// -// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") -// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") -func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotRegexpf(a.t, rx, str, msg, args...) -} -// NotSame asserts that two pointers do not reference the same object. -// -// a.NotSame(ptr1, ptr2) -// -// Both arguments must be pointer variables. Pointer variable sameness is -// determined based on the equality of both type and value. -func (a *Assertions) NotSame(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotSame(a.t, expected, actual, msgAndArgs...) -} - -// NotSamef asserts that two pointers do not reference the same object. -// -// a.NotSamef(ptr1, ptr2, "error message %s", "formatted") -// -// Both arguments must be pointer variables. Pointer variable sameness is -// determined based on the equality of both type and value. -func (a *Assertions) NotSamef(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotSamef(a.t, expected, actual, msg, args...) -} - -// NotSubset asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") -func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotSubset(a.t, list, subset, msgAndArgs...) -} - -// NotSubsetf asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") -func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotSubsetf(a.t, list, subset, msg, args...) -} - -// NotZero asserts that i is not the zero value for its type. +// NotZero asserts that i is not the zero value for its type and returns the truth. func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return NotZero(a.t, i, msgAndArgs...) } -// NotZerof asserts that i is not the zero value for its type. -func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return NotZerof(a.t, i, msg, args...) -} // Panics asserts that the code inside the specified PanicTestFunc panics. -// -// a.Panics(func(){ GoCrazy() }) +// +// a.Panics(func(){ +// GoCrazy() +// }, "Calling GoCrazy() should panic") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Panics(a.t, f, msgAndArgs...) } -// PanicsWithError asserts that the code inside the specified PanicTestFunc -// panics, and that the recovered panic value is an error that satisfies the -// EqualError comparison. -// -// a.PanicsWithError("crazy error", func(){ GoCrazy() }) -func (a *Assertions) PanicsWithError(errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return PanicsWithError(a.t, errString, f, msgAndArgs...) -} - -// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc -// panics, and that the recovered panic value is an error that satisfies the -// EqualError comparison. -// -// a.PanicsWithErrorf("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") -func (a *Assertions) PanicsWithErrorf(errString string, f PanicTestFunc, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return PanicsWithErrorf(a.t, errString, f, msg, args...) -} - -// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) -func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return PanicsWithValue(a.t, expected, f, msgAndArgs...) -} - -// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") -func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return PanicsWithValuef(a.t, expected, f, msg, args...) -} - -// Panicsf asserts that the code inside the specified PanicTestFunc panics. -// -// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") -func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Panicsf(a.t, f, msg, args...) -} // Regexp asserts that a specified regexp matches a string. -// +// // a.Regexp(regexp.MustCompile("start"), "it's starting") // a.Regexp("start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Regexp(a.t, rx, str, msgAndArgs...) } -// Regexpf asserts that a specified regexp matches a string. -// -// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") -// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") -func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Regexpf(a.t, rx, str, msg, args...) -} - -// Same asserts that two pointers reference the same object. -// -// a.Same(ptr1, ptr2) -// -// Both arguments must be pointer variables. Pointer variable sameness is -// determined based on the equality of both type and value. -func (a *Assertions) Same(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Same(a.t, expected, actual, msgAndArgs...) -} - -// Samef asserts that two pointers reference the same object. -// -// a.Samef(ptr1, ptr2, "error message %s", "formatted") -// -// Both arguments must be pointer variables. Pointer variable sameness is -// determined based on the equality of both type and value. -func (a *Assertions) Samef(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Samef(a.t, expected, actual, msg, args...) -} - -// Subset asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") -func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Subset(a.t, list, subset, msgAndArgs...) -} - -// Subsetf asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") -func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Subsetf(a.t, list, subset, msg, args...) -} // True asserts that the specified value is true. -// -// a.True(myBool) +// +// a.True(myBool, "myBool should be true") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return True(a.t, value, msgAndArgs...) } -// Truef asserts that the specified value is true. -// -// a.Truef(myBool, "error message %s", "formatted") -func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Truef(a.t, value, msg, args...) -} // WithinDuration asserts that the two times are within duration delta of each other. -// -// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s") +// +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return WithinDuration(a.t, expected, actual, delta, msgAndArgs...) } -// WithinDurationf asserts that the two times are within duration delta of each other. -// -// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") -func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return WithinDurationf(a.t, expected, actual, delta, msg, args...) -} -// YAMLEq asserts that two YAML strings are equivalent. -func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return YAMLEq(a.t, expected, actual, msgAndArgs...) -} - -// YAMLEqf asserts that two YAML strings are equivalent. -func (a *Assertions) YAMLEqf(expected string, actual string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return YAMLEqf(a.t, expected, actual, msg, args...) -} - -// Zero asserts that i is the zero value for its type. +// Zero asserts that i is the zero value for its type and returns the truth. func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } return Zero(a.t, i, msgAndArgs...) } - -// Zerof asserts that i is the zero value for its type. -func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return Zerof(a.t, i, msg, args...) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl b/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl index 188bb9e1..99f9acfb 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl @@ -1,5 +1,4 @@ {{.CommentWithoutT "a"}} func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool { - if h, ok := a.t.(tHelper); ok { h.Helper() } return {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) } diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index 914a10d8..d7c16c59 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -4,14 +4,11 @@ import ( "bufio" "bytes" "encoding/json" - "errors" "fmt" "math" - "os" "reflect" "regexp" "runtime" - "runtime/debug" "strings" "time" "unicode" @@ -19,33 +16,14 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/pmezard/go-difflib/difflib" - yaml "gopkg.in/yaml.v3" ) -//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl" - // TestingT is an interface wrapper around *testing.T type TestingT interface { Errorf(format string, args ...interface{}) } -// ComparisonAssertionFunc is a common function prototype when comparing two values. Can be useful -// for table driven tests. -type ComparisonAssertionFunc func(TestingT, interface{}, interface{}, ...interface{}) bool - -// ValueAssertionFunc is a common function prototype when validating a single value. Can be useful -// for table driven tests. -type ValueAssertionFunc func(TestingT, interface{}, ...interface{}) bool - -// BoolAssertionFunc is a common function prototype when validating a bool value. Can be useful -// for table driven tests. -type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool - -// ErrorAssertionFunc is a common function prototype when validating an error value. Can be useful -// for table driven tests. -type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool - -// Comparison is a custom function that returns true on success and false on failure +// Comparison a custom function that returns true on success and false on failure type Comparison func() (success bool) /* @@ -56,23 +34,13 @@ type Comparison func() (success bool) // // This function does no assertion of any kind. func ObjectsAreEqual(expected, actual interface{}) bool { + if expected == nil || actual == nil { return expected == actual } - exp, ok := expected.([]byte) - if !ok { - return reflect.DeepEqual(expected, actual) - } + return reflect.DeepEqual(expected, actual) - act, ok := actual.([]byte) - if !ok { - return false - } - if exp == nil || act == nil { - return exp == nil && act == nil - } - return bytes.Equal(exp, act) } // ObjectsAreEqualValues gets whether two objects are equal, or if their @@ -97,26 +65,24 @@ func ObjectsAreEqualValues(expected, actual interface{}) bool { /* CallerInfo is necessary because the assert functions use the testing object internally, causing it to print the file:line of the assert method, rather than where -the problem actually occurred in calling code.*/ +the problem actually occured in calling code.*/ // CallerInfo returns an array of strings containing the file and line number // of each stack frame leading from the current test to the assert call that // failed. func CallerInfo() []string { - var pc uintptr - var ok bool - var file string - var line int - var name string + pc := uintptr(0) + file := "" + line := 0 + ok := false + name := "" callers := []string{} for i := 0; ; i++ { pc, file, line, ok = runtime.Caller(i) if !ok { - // The breaks below failed to terminate the loop, and we ran off the - // end of the call stack. - break + return nil } // This is a huge edge case, but it will panic if this is the case, see #180 @@ -124,30 +90,18 @@ func CallerInfo() []string { break } + parts := strings.Split(file, "/") + dir := parts[len(parts)-2] + file = parts[len(parts)-1] + if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { + callers = append(callers, fmt.Sprintf("%s:%d", file, line)) + } + f := runtime.FuncForPC(pc) if f == nil { break } name = f.Name() - - // testing.tRunner is the standard library function that calls - // tests. Subtests are called directly by tRunner, without going through - // the Test/Benchmark/Example function that contains the t.Run calls, so - // with subtests we should break when we hit tRunner, without adding it - // to the list of callers. - if name == "testing.tRunner" { - break - } - - parts := strings.Split(file, "/") - file = parts[len(parts)-1] - if len(parts) > 1 { - dir := parts[len(parts)-2] - if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { - callers = append(callers, fmt.Sprintf("%s:%d", file, line)) - } - } - // Drop the package segments := strings.Split(name, ".") name = segments[len(segments)-1] @@ -176,16 +130,27 @@ func isTest(name, prefix string) bool { return !unicode.IsLower(rune) } +// getWhitespaceString returns a string that is long enough to overwrite the default +// output from the go testing framework. +func getWhitespaceString() string { + + _, file, line, ok := runtime.Caller(1) + if !ok { + return "" + } + parts := strings.Split(file, "/") + file = parts[len(parts)-1] + + return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line))) + +} + func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { if len(msgAndArgs) == 0 || msgAndArgs == nil { return "" } if len(msgAndArgs) == 1 { - msg := msgAndArgs[0] - if msgAsStr, ok := msg.(string); ok { - return msgAsStr - } - return fmt.Sprintf("%+v", msg) + return msgAndArgs[0].(string) } if len(msgAndArgs) > 1 { return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) @@ -193,18 +158,22 @@ func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { return "" } -// Aligns the provided message so that all lines after the first line start at the same location as the first line. -// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab). -// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the -// basis on which the alignment occurs). -func indentMessageLines(message string, longestLabelLen int) string { +// Indents all lines of the message by appending a number of tabs to each line, in an output format compatible with Go's +// test printing (see inner comment for specifics) +func indentMessageLines(message string, tabs int) string { outBuf := new(bytes.Buffer) for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { - // no need to align first line because it starts at the correct location (after the label) if i != 0 { - // append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab - outBuf.WriteString("\n\t" + strings.Repeat(" ", longestLabelLen+1) + "\t") + outBuf.WriteRune('\n') + } + for ii := 0; ii < tabs; ii++ { + outBuf.WriteRune('\t') + // Bizarrely, all lines except the first need one fewer tabs prepended, so deliberately advance the counter + // by 1 prematurely. + if ii == 0 && i > 0 { + ii++ + } } outBuf.WriteString(scanner.Text()) } @@ -218,9 +187,6 @@ type failNower interface { // FailNow fails test func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } Fail(t, failureMessage, msgAndArgs...) // We cannot extend TestingT with FailNow() and @@ -239,83 +205,46 @@ func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool // Fail reports a failure through func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - content := []labeledContent{ - {"Error Trace", strings.Join(CallerInfo(), "\n\t\t\t")}, - {"Error", failureMessage}, - } - - // Add test name if the Go version supports it - if n, ok := t.(interface { - Name() string - }); ok { - content = append(content, labeledContent{"Test", n.Name()}) - } message := messageFromMsgAndArgs(msgAndArgs...) - if len(message) > 0 { - content = append(content, labeledContent{"Messages", message}) - } - t.Errorf("\n%s", ""+labeledOutput(content...)) + errorTrace := strings.Join(CallerInfo(), "\n\r\t\t\t") + if len(message) > 0 { + t.Errorf("\r%s\r\tError Trace:\t%s\n"+ + "\r\tError:%s\n"+ + "\r\tMessages:\t%s\n\r", + getWhitespaceString(), + errorTrace, + indentMessageLines(failureMessage, 2), + message) + } else { + t.Errorf("\r%s\r\tError Trace:\t%s\n"+ + "\r\tError:%s\n\r", + getWhitespaceString(), + errorTrace, + indentMessageLines(failureMessage, 2)) + } return false } -type labeledContent struct { - label string - content string -} - -// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner: -// -// \t{{label}}:{{align_spaces}}\t{{content}}\n -// -// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label. -// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this -// alignment is achieved, "\t{{content}}\n" is added for the output. -// -// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line. -func labeledOutput(content ...labeledContent) string { - longestLabel := 0 - for _, v := range content { - if len(v.label) > longestLabel { - longestLabel = len(v.label) - } - } - var output string - for _, v := range content { - output += "\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n" - } - return output -} - // Implements asserts that an object is implemented by the specified interface. // -// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +// assert.Implements(t, (*MyInterface)(nil), new(MyObject), "MyObject") func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } + interfaceType := reflect.TypeOf(interfaceObject).Elem() - if object == nil { - return Fail(t, fmt.Sprintf("Cannot check if nil implements %v", interfaceType), msgAndArgs...) - } if !reflect.TypeOf(object).Implements(interfaceType) { return Fail(t, fmt.Sprintf("%T must implement %v", object, interfaceType), msgAndArgs...) } return true + } // IsType asserts that the specified objects are of the same type. func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) { return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...) @@ -326,166 +255,50 @@ func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs // Equal asserts that two objects are equal. // -// assert.Equal(t, 123, 123) +// assert.Equal(t, 123, 123, "123 and 123 should be equal") // -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. +// Returns whether the assertion was successful (true) or not (false). func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if err := validateEqualArgs(expected, actual); err != nil { - return Fail(t, fmt.Sprintf("Invalid operation: %#v == %#v (%s)", - expected, actual, err), msgAndArgs...) - } if !ObjectsAreEqual(expected, actual) { diff := diff(expected, actual) - expected, actual = formatUnequalValues(expected, actual) - return Fail(t, fmt.Sprintf("Not equal: \n"+ - "expected: %s\n"+ - "actual : %s%s", expected, actual, diff), msgAndArgs...) + return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+ + " != %#v (actual)%s", expected, actual, diff), msgAndArgs...) } return true } -// validateEqualArgs checks whether provided arguments can be safely used in the -// Equal/NotEqual functions. -func validateEqualArgs(expected, actual interface{}) error { - if expected == nil && actual == nil { - return nil - } - - if isFunction(expected) || isFunction(actual) { - return errors.New("cannot take func type as argument") - } - return nil -} - -// Same asserts that two pointers reference the same object. -// -// assert.Same(t, ptr1, ptr2) -// -// Both arguments must be pointer variables. Pointer variable sameness is -// determined based on the equality of both type and value. -func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - if !samePointers(expected, actual) { - return Fail(t, fmt.Sprintf("Not same: \n"+ - "expected: %p %#v\n"+ - "actual : %p %#v", expected, expected, actual, actual), msgAndArgs...) - } - - return true -} - -// NotSame asserts that two pointers do not reference the same object. -// -// assert.NotSame(t, ptr1, ptr2) -// -// Both arguments must be pointer variables. Pointer variable sameness is -// determined based on the equality of both type and value. -func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - if samePointers(expected, actual) { - return Fail(t, fmt.Sprintf( - "Expected and actual point to the same object: %p %#v", - expected, expected), msgAndArgs...) - } - return true -} - -// samePointers compares two generic interface objects and returns whether -// they point to the same object -func samePointers(first, second interface{}) bool { - firstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second) - if firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr { - return false - } - - firstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second) - if firstType != secondType { - return false - } - - // compare pointer addresses - return first == second -} - -// formatUnequalValues takes two values of arbitrary types and returns string -// representations appropriate to be presented to the user. -// -// If the values are not of like type, the returned strings will be prefixed -// with the type name, and the value will be enclosed in parenthesis similar -// to a type conversion in the Go grammar. -func formatUnequalValues(expected, actual interface{}) (e string, a string) { - if reflect.TypeOf(expected) != reflect.TypeOf(actual) { - return fmt.Sprintf("%T(%s)", expected, truncatingFormat(expected)), - fmt.Sprintf("%T(%s)", actual, truncatingFormat(actual)) - } - switch expected.(type) { - case time.Duration: - return fmt.Sprintf("%v", expected), fmt.Sprintf("%v", actual) - } - return truncatingFormat(expected), truncatingFormat(actual) -} - -// truncatingFormat formats the data and truncates it if it's too long. -// -// This helps keep formatted error messages lines from exceeding the -// bufio.MaxScanTokenSize max line length that the go testing framework imposes. -func truncatingFormat(data interface{}) string { - value := fmt.Sprintf("%#v", data) - max := bufio.MaxScanTokenSize - 100 // Give us some space the type info too if needed. - if len(value) > max { - value = value[0:max] + "<... truncated>" - } - return value -} - // EqualValues asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValues(t, uint32(123), int32(123)) +// assert.EqualValues(t, uint32(123), int32(123), "123 and 123 should be equal") +// +// Returns whether the assertion was successful (true) or not (false). func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if !ObjectsAreEqualValues(expected, actual) { - diff := diff(expected, actual) - expected, actual = formatUnequalValues(expected, actual) - return Fail(t, fmt.Sprintf("Not equal: \n"+ - "expected: %s\n"+ - "actual : %s%s", expected, actual, diff), msgAndArgs...) + return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+ + " != %#v (actual)", expected, actual), msgAndArgs...) } return true } -// Exactly asserts that two objects are equal in value and type. +// Exactly asserts that two objects are equal is value and type. // -// assert.Exactly(t, int32(123), int64(123)) +// assert.Exactly(t, int32(123), int64(123), "123 and 123 should NOT be equal") +// +// Returns whether the assertion was successful (true) or not (false). func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } aType := reflect.TypeOf(expected) bType := reflect.TypeOf(actual) if aType != bType { - return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...) + return Fail(t, fmt.Sprintf("Types expected to match exactly\n\r\t%v != %v", aType, bType), msgAndArgs...) } return Equal(t, expected, actual, msgAndArgs...) @@ -494,28 +307,16 @@ func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{} // NotNil asserts that the specified object is not nil. // -// assert.NotNil(t, err) +// assert.NotNil(t, err, "err should be something") +// +// Returns whether the assertion was successful (true) or not (false). func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { if !isNil(object) { return true } - if h, ok := t.(tHelper); ok { - h.Helper() - } return Fail(t, "Expected value not to be nil.", msgAndArgs...) } -// containsKind checks if a specified kind in the slice of kinds. -func containsKind(kinds []reflect.Kind, kind reflect.Kind) bool { - for i := 0; i < len(kinds); i++ { - if kind == kinds[i] { - return true - } - } - - return false -} - // isNil checks if a specified object is nil or not, without Failing. func isNil(object interface{}) bool { if object == nil { @@ -524,14 +325,7 @@ func isNil(object interface{}) bool { value := reflect.ValueOf(object) kind := value.Kind() - isNilableKind := containsKind( - []reflect.Kind{ - reflect.Chan, reflect.Func, - reflect.Interface, reflect.Map, - reflect.Ptr, reflect.Slice}, - kind) - - if isNilableKind && value.IsNil() { + if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() { return true } @@ -540,55 +334,88 @@ func isNil(object interface{}) bool { // Nil asserts that the specified object is nil. // -// assert.Nil(t, err) +// assert.Nil(t, err, "err should be nothing") +// +// Returns whether the assertion was successful (true) or not (false). func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { if isNil(object) { return true } - if h, ok := t.(tHelper); ok { - h.Helper() - } return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) } +var numericZeros = []interface{}{ + int(0), + int8(0), + int16(0), + int32(0), + int64(0), + uint(0), + uint8(0), + uint16(0), + uint32(0), + uint64(0), + float32(0), + float64(0), +} + // isEmpty gets whether the specified object is considered empty or not. func isEmpty(object interface{}) bool { - // get nil case out of the way if object == nil { return true + } else if object == "" { + return true + } else if object == false { + return true + } + + for _, v := range numericZeros { + if object == v { + return true + } } objValue := reflect.ValueOf(object) switch objValue.Kind() { - // collection types are empty when they have no element - case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: - return objValue.Len() == 0 - // pointers are empty if nil or if the value they point to is empty - case reflect.Ptr: - if objValue.IsNil() { - return true + case reflect.Map: + fallthrough + case reflect.Slice, reflect.Chan: + { + return (objValue.Len() == 0) + } + case reflect.Struct: + switch object.(type) { + case time.Time: + return object.(time.Time).IsZero() + } + case reflect.Ptr: + { + if objValue.IsNil() { + return true + } + switch object.(type) { + case *time.Time: + return object.(*time.Time).IsZero() + default: + return false + } } - deref := objValue.Elem().Interface() - return isEmpty(deref) - // for all other types, compare against the zero value - default: - zero := reflect.Zero(objValue.Type()) - return reflect.DeepEqual(object, zero.Interface()) } + return false } // Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // // assert.Empty(t, obj) +// +// Returns whether the assertion was successful (true) or not (false). func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + pass := isEmpty(object) if !pass { - if h, ok := t.(tHelper); ok { - h.Helper() - } Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) } @@ -602,12 +429,12 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { // if assert.NotEmpty(t, obj) { // assert.Equal(t, "two", obj[1]) // } +// +// Returns whether the assertion was successful (true) or not (false). func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + pass := !isEmpty(object) if !pass { - if h, ok := t.(tHelper); ok { - h.Helper() - } Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) } @@ -630,11 +457,10 @@ func getLen(x interface{}) (ok bool, length int) { // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. // -// assert.Len(t, mySlice, 3) +// assert.Len(t, mySlice, 3, "The size of slice is not 3") +// +// Returns whether the assertion was successful (true) or not (false). func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } ok, l := getLen(object) if !ok { return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...) @@ -648,12 +474,12 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) // True asserts that the specified value is true. // -// assert.True(t, myBool) +// assert.True(t, myBool, "myBool should be true") +// +// Returns whether the assertion was successful (true) or not (false). func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { - if !value { - if h, ok := t.(tHelper); ok { - h.Helper() - } + + if value != true { return Fail(t, "Should be true", msgAndArgs...) } @@ -663,12 +489,12 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { // False asserts that the specified value is false. // -// assert.False(t, myBool) +// assert.False(t, myBool, "myBool should be false") +// +// Returns whether the assertion was successful (true) or not (false). func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { - if value { - if h, ok := t.(tHelper); ok { - h.Helper() - } + + if value != false { return Fail(t, "Should be false", msgAndArgs...) } @@ -678,18 +504,10 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { // NotEqual asserts that the specified values are NOT equal. // -// assert.NotEqual(t, obj1, obj2) +// assert.NotEqual(t, obj1, obj2, "two objects shouldn't be equal") // -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). +// Returns whether the assertion was successful (true) or not (false). func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if err := validateEqualArgs(expected, actual); err != nil { - return Fail(t, fmt.Sprintf("Invalid operation: %#v != %#v (%s)", - expected, actual, err), msgAndArgs...) - } if ObjectsAreEqual(expected, actual) { return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) @@ -699,21 +517,6 @@ func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{ } -// NotEqualValues asserts that two objects are not equal even when converted to the same type -// -// assert.NotEqualValues(t, obj1, obj2) -func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - if ObjectsAreEqualValues(expected, actual) { - return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) - } - - return true -} - // containsElement try loop over the list check if the list includes the element. // return (false, false) if impossible. // return (true, false) if element was not found. @@ -721,7 +524,7 @@ func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...inte func includeElement(list interface{}, element interface{}) (ok, found bool) { listValue := reflect.ValueOf(list) - listKind := reflect.TypeOf(list).Kind() + elementValue := reflect.ValueOf(element) defer func() { if e := recover(); e != nil { ok = false @@ -729,12 +532,11 @@ func includeElement(list interface{}, element interface{}) (ok, found bool) { } }() - if listKind == reflect.String { - elementValue := reflect.ValueOf(element) + if reflect.TypeOf(list).Kind() == reflect.String { return true, strings.Contains(listValue.String(), elementValue.String()) } - if listKind == reflect.Map { + if reflect.TypeOf(list).Kind() == reflect.Map { mapKeys := listValue.MapKeys() for i := 0; i < len(mapKeys); i++ { if ObjectsAreEqual(mapKeys[i].Interface(), element) { @@ -756,20 +558,19 @@ func includeElement(list interface{}, element interface{}) (ok, found bool) { // Contains asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// assert.Contains(t, "Hello World", "World") -// assert.Contains(t, ["Hello", "World"], "World") -// assert.Contains(t, {"Hello": "World"}, "Hello") +// assert.Contains(t, "Hello World", "World", "But 'Hello World' does contain 'World'") +// assert.Contains(t, ["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'") +// assert.Contains(t, {"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'") +// +// Returns whether the assertion was successful (true) or not (false). func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } ok, found := includeElement(s, contains) if !ok { - return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...) + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) } if !found { - return Fail(t, fmt.Sprintf("%#v does not contain %#v", s, contains), msgAndArgs...) + return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) } return true @@ -779,13 +580,12 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// assert.NotContains(t, "Hello World", "Earth") -// assert.NotContains(t, ["Hello", "World"], "Earth") -// assert.NotContains(t, {"Hello": "World"}, "Earth") +// assert.NotContains(t, "Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'") +// assert.NotContains(t, ["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'") +// assert.NotContains(t, {"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'") +// +// Returns whether the assertion was successful (true) or not (false). func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } ok, found := includeElement(s, contains) if !ok { @@ -799,195 +599,8 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) } -// Subset asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") -func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if subset == nil { - return true // we consider nil to be equal to the nil set - } - - subsetValue := reflect.ValueOf(subset) - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - - listKind := reflect.TypeOf(list).Kind() - subsetKind := reflect.TypeOf(subset).Kind() - - if listKind != reflect.Array && listKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) - } - - if subsetKind != reflect.Array && subsetKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) - } - - for i := 0; i < subsetValue.Len(); i++ { - element := subsetValue.Index(i).Interface() - ok, found := includeElement(list, element) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) - } - if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, element), msgAndArgs...) - } - } - - return true -} - -// NotSubset asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") -func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if subset == nil { - return Fail(t, fmt.Sprintf("nil is the empty set which is a subset of every set"), msgAndArgs...) - } - - subsetValue := reflect.ValueOf(subset) - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - - listKind := reflect.TypeOf(list).Kind() - subsetKind := reflect.TypeOf(subset).Kind() - - if listKind != reflect.Array && listKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) - } - - if subsetKind != reflect.Array && subsetKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) - } - - for i := 0; i < subsetValue.Len(); i++ { - element := subsetValue.Index(i).Interface() - ok, found := includeElement(list, element) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) - } - if !found { - return true - } - } - - return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) -} - -// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) -func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if isEmpty(listA) && isEmpty(listB) { - return true - } - - if !isList(t, listA, msgAndArgs...) || !isList(t, listB, msgAndArgs...) { - return false - } - - extraA, extraB := diffLists(listA, listB) - - if len(extraA) == 0 && len(extraB) == 0 { - return true - } - - return Fail(t, formatListDiff(listA, listB, extraA, extraB), msgAndArgs...) -} - -// isList checks that the provided value is array or slice. -func isList(t TestingT, list interface{}, msgAndArgs ...interface{}) (ok bool) { - kind := reflect.TypeOf(list).Kind() - if kind != reflect.Array && kind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s, expecting array or slice", list, kind), - msgAndArgs...) - } - return true -} - -// diffLists diffs two arrays/slices and returns slices of elements that are only in A and only in B. -// If some element is present multiple times, each instance is counted separately (e.g. if something is 2x in A and -// 5x in B, it will be 0x in extraA and 3x in extraB). The order of items in both lists is ignored. -func diffLists(listA, listB interface{}) (extraA, extraB []interface{}) { - aValue := reflect.ValueOf(listA) - bValue := reflect.ValueOf(listB) - - aLen := aValue.Len() - bLen := bValue.Len() - - // Mark indexes in bValue that we already used - visited := make([]bool, bLen) - for i := 0; i < aLen; i++ { - element := aValue.Index(i).Interface() - found := false - for j := 0; j < bLen; j++ { - if visited[j] { - continue - } - if ObjectsAreEqual(bValue.Index(j).Interface(), element) { - visited[j] = true - found = true - break - } - } - if !found { - extraA = append(extraA, element) - } - } - - for j := 0; j < bLen; j++ { - if visited[j] { - continue - } - extraB = append(extraB, bValue.Index(j).Interface()) - } - - return -} - -func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) string { - var msg bytes.Buffer - - msg.WriteString("elements differ") - if len(extraA) > 0 { - msg.WriteString("\n\nextra elements in list A:\n") - msg.WriteString(spewConfig.Sdump(extraA)) - } - if len(extraB) > 0 { - msg.WriteString("\n\nextra elements in list B:\n") - msg.WriteString(spewConfig.Sdump(extraB)) - } - msg.WriteString("\n\nlistA:\n") - msg.WriteString(spewConfig.Sdump(listA)) - msg.WriteString("\n\nlistB:\n") - msg.WriteString(spewConfig.Sdump(listB)) - - return msg.String() -} - // Condition uses a Comparison to assert a complex condition. func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } result := comp() if !result { Fail(t, "Condition failed!", msgAndArgs...) @@ -1000,17 +613,15 @@ func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { type PanicTestFunc func() // didPanic returns true if the function passed to it panics. Otherwise, it returns false. -func didPanic(f PanicTestFunc) (bool, interface{}, string) { +func didPanic(f PanicTestFunc) (bool, interface{}) { didPanic := false var message interface{} - var stack string func() { defer func() { if message = recover(); message != nil { didPanic = true - stack = string(debug.Stack()) } }() @@ -1019,62 +630,21 @@ func didPanic(f PanicTestFunc) (bool, interface{}, string) { }() - return didPanic, message, stack + return didPanic, message } // Panics asserts that the code inside the specified PanicTestFunc panics. // -// assert.Panics(t, func(){ GoCrazy() }) +// assert.Panics(t, func(){ +// GoCrazy() +// }, "Calling GoCrazy() should panic") +// +// Returns whether the assertion was successful (true) or not (false). func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if funcDidPanic, panicValue, _ := didPanic(f); !funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) - } - - return true -} - -// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) -func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - funcDidPanic, panicValue, panickedStack := didPanic(f) - if !funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) - } - if panicValue != expected { - return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, expected, panicValue, panickedStack), msgAndArgs...) - } - - return true -} - -// PanicsWithError asserts that the code inside the specified PanicTestFunc -// panics, and that the recovered panic value is an error that satisfies the -// EqualError comparison. -// -// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) -func PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - funcDidPanic, panicValue, panickedStack := didPanic(f) - if !funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) - } - panicErr, ok := panicValue.(error) - if !ok || panicErr.Error() != errString { - return Fail(t, fmt.Sprintf("func %#v should panic with error message:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, errString, panicValue, panickedStack), msgAndArgs...) + if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) } return true @@ -1082,14 +652,15 @@ func PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs . // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. // -// assert.NotPanics(t, func(){ RemainCalm() }) +// assert.NotPanics(t, func(){ +// RemainCalm() +// }, "Calling RemainCalm() should NOT panic") +// +// Returns whether the assertion was successful (true) or not (false). func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if funcDidPanic, panicValue, panickedStack := didPanic(f); funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v\n\tPanic stack:\t%s", f, panicValue, panickedStack), msgAndArgs...) + if funcDidPanic, panicValue := didPanic(f); funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should not panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) } return true @@ -1097,11 +668,10 @@ func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { // WithinDuration asserts that the two times are within duration delta of each other. // -// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s") +// +// Returns whether the assertion was successful (true) or not (false). func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } dt := expected.Sub(actual) if dt < -delta || dt > delta { @@ -1116,8 +686,6 @@ func toFloat(x interface{}) (float64, bool) { xok := true switch xn := x.(type) { - case uint: - xf = float64(xn) case uint8: xf = float64(xn) case uint16: @@ -1139,8 +707,6 @@ func toFloat(x interface{}) (float64, bool) { case float32: xf = float64(xn) case float64: - xf = xn - case time.Duration: xf = float64(xn) default: xok = false @@ -1151,11 +717,10 @@ func toFloat(x interface{}) (float64, bool) { // InDelta asserts that the two numerals are within delta of each other. // -// assert.InDelta(t, math.Pi, 22/7.0, 0.01) +// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } af, aok := toFloat(expected) bf, bok := toFloat(actual) @@ -1165,7 +730,7 @@ func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs } if math.IsNaN(af) { - return Fail(t, fmt.Sprintf("Expected must not be NaN"), msgAndArgs...) + return Fail(t, fmt.Sprintf("Actual must not be NaN"), msgAndArgs...) } if math.IsNaN(bf) { @@ -1182,9 +747,6 @@ func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs // InDeltaSlice is the same as InDelta, except it compares two slices. func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if expected == nil || actual == nil || reflect.TypeOf(actual).Kind() != reflect.Slice || reflect.TypeOf(expected).Kind() != reflect.Slice { @@ -1195,7 +757,7 @@ func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAn expectedSlice := reflect.ValueOf(expected) for i := 0; i < actualSlice.Len(); i++ { - result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta, msgAndArgs...) + result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta) if !result { return result } @@ -1204,87 +766,33 @@ func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAn return true } -// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if expected == nil || actual == nil || - reflect.TypeOf(actual).Kind() != reflect.Map || - reflect.TypeOf(expected).Kind() != reflect.Map { - return Fail(t, "Arguments must be maps", msgAndArgs...) - } - - expectedMap := reflect.ValueOf(expected) - actualMap := reflect.ValueOf(actual) - - if expectedMap.Len() != actualMap.Len() { - return Fail(t, "Arguments must have the same number of keys", msgAndArgs...) - } - - for _, k := range expectedMap.MapKeys() { - ev := expectedMap.MapIndex(k) - av := actualMap.MapIndex(k) - - if !ev.IsValid() { - return Fail(t, fmt.Sprintf("missing key %q in expected map", k), msgAndArgs...) - } - - if !av.IsValid() { - return Fail(t, fmt.Sprintf("missing key %q in actual map", k), msgAndArgs...) - } - - if !InDelta( - t, - ev.Interface(), - av.Interface(), - delta, - msgAndArgs..., - ) { - return false - } - } - - return true -} - func calcRelativeError(expected, actual interface{}) (float64, error) { af, aok := toFloat(expected) if !aok { return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) } - if math.IsNaN(af) { - return 0, errors.New("expected value must not be NaN") - } if af == 0 { return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") } bf, bok := toFloat(actual) if !bok { - return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) - } - if math.IsNaN(bf) { - return 0, errors.New("actual value must not be NaN") + return 0, fmt.Errorf("expected value %q cannot be converted to float", actual) } return math.Abs(af-bf) / math.Abs(af), nil } // InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if math.IsNaN(epsilon) { - return Fail(t, "epsilon must not be NaN") - } actualEpsilon, err := calcRelativeError(expected, actual) if err != nil { return Fail(t, err.Error(), msgAndArgs...) } if actualEpsilon > epsilon { return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+ - " < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...) + " < %#v (actual)", actualEpsilon, epsilon), msgAndArgs...) } return true @@ -1292,9 +800,6 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd // InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if expected == nil || actual == nil || reflect.TypeOf(actual).Kind() != reflect.Slice || reflect.TypeOf(expected).Kind() != reflect.Slice { @@ -1322,57 +827,51 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m // // actualObj, err := SomeFunction() // if assert.NoError(t, err) { -// assert.Equal(t, expectedObj, actualObj) +// assert.Equal(t, actualObj, expectedObj) // } +// +// Returns whether the assertion was successful (true) or not (false). func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { - if err != nil { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) + if isNil(err) { + return true } - return true + return Fail(t, fmt.Sprintf("Received unexpected error %q", err), msgAndArgs...) } // Error asserts that a function returned an error (i.e. not `nil`). // // actualObj, err := SomeFunction() -// if assert.Error(t, err) { -// assert.Equal(t, expectedError, err) +// if assert.Error(t, err, "An error was expected") { +// assert.Equal(t, err, expectedError) // } +// +// Returns whether the assertion was successful (true) or not (false). func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { - if err == nil { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return Fail(t, "An error is expected but got nil.", msgAndArgs...) - } - return true + message := messageFromMsgAndArgs(msgAndArgs...) + return NotNil(t, err, "An error is expected but got nil. %s", message) + } // EqualError asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. // // actualObj, err := SomeFunction() -// assert.EqualError(t, err, expectedErrorString) +// if assert.Error(t, err, "An error was expected") { +// assert.Equal(t, err, expectedError) +// } +// +// Returns whether the assertion was successful (true) or not (false). func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if !Error(t, theError, msgAndArgs...) { + + message := messageFromMsgAndArgs(msgAndArgs...) + if !NotNil(t, theError, "An error is expected but got nil. %s", message) { return false } - expected := errString - actual := theError.Error() - // don't need to use deep equals here, we know they are both strings - if expected != actual { - return Fail(t, fmt.Sprintf("Error message not equal:\n"+ - "expected: %q\n"+ - "actual : %q", expected, actual), msgAndArgs...) - } - return true + s := "An error with value \"%s\" is expected but got \"%s\". %s" + return Equal(t, errString, theError.Error(), + s, errString, theError.Error(), message) } // matchRegexp return true if a specified regexp matches a string. @@ -1393,10 +892,9 @@ func matchRegexp(rx interface{}, str interface{}) bool { // // assert.Regexp(t, regexp.MustCompile("start"), "it's starting") // assert.Regexp(t, "start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } match := matchRegexp(rx, str) @@ -1411,10 +909,9 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface // // assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") // assert.NotRegexp(t, "^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } match := matchRegexp(rx, str) if match { @@ -1425,108 +922,28 @@ func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interf } -// Zero asserts that i is the zero value for its type. +// Zero asserts that i is the zero value for its type and returns the truth. func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { return Fail(t, fmt.Sprintf("Should be zero, but was %v", i), msgAndArgs...) } return true } -// NotZero asserts that i is not the zero value for its type. +// NotZero asserts that i is not the zero value for its type and returns the truth. func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { return Fail(t, fmt.Sprintf("Should not be zero, but was %v", i), msgAndArgs...) } return true } -// FileExists checks whether a file exists in the given path. It also fails if -// the path points to a directory or there is an error when trying to check the file. -func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - info, err := os.Lstat(path) - if err != nil { - if os.IsNotExist(err) { - return Fail(t, fmt.Sprintf("unable to find file %q", path), msgAndArgs...) - } - return Fail(t, fmt.Sprintf("error when running os.Lstat(%q): %s", path, err), msgAndArgs...) - } - if info.IsDir() { - return Fail(t, fmt.Sprintf("%q is a directory", path), msgAndArgs...) - } - return true -} - -// NoFileExists checks whether a file does not exist in a given path. It fails -// if the path points to an existing _file_ only. -func NoFileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - info, err := os.Lstat(path) - if err != nil { - return true - } - if info.IsDir() { - return true - } - return Fail(t, fmt.Sprintf("file %q exists", path), msgAndArgs...) -} - -// DirExists checks whether a directory exists in the given path. It also fails -// if the path is a file rather a directory or there is an error checking whether it exists. -func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - info, err := os.Lstat(path) - if err != nil { - if os.IsNotExist(err) { - return Fail(t, fmt.Sprintf("unable to find file %q", path), msgAndArgs...) - } - return Fail(t, fmt.Sprintf("error when running os.Lstat(%q): %s", path, err), msgAndArgs...) - } - if !info.IsDir() { - return Fail(t, fmt.Sprintf("%q is a file", path), msgAndArgs...) - } - return true -} - -// NoDirExists checks whether a directory does not exist in the given path. -// It fails if the path points to an existing _directory_ only. -func NoDirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - info, err := os.Lstat(path) - if err != nil { - if os.IsNotExist(err) { - return true - } - return true - } - if !info.IsDir() { - return true - } - return Fail(t, fmt.Sprintf("directory %q exists", path), msgAndArgs...) -} - // JSONEq asserts that two JSON strings are equivalent. // // assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } var expectedJSONAsInterface, actualJSONAsInterface interface{} if err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil { @@ -1540,24 +957,6 @@ func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{ return Equal(t, expectedJSONAsInterface, actualJSONAsInterface, msgAndArgs...) } -// YAMLEq asserts that two YAML strings are equivalent. -func YAMLEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - var expectedYAMLAsInterface, actualYAMLAsInterface interface{} - - if err := yaml.Unmarshal([]byte(expected), &expectedYAMLAsInterface); err != nil { - return Fail(t, fmt.Sprintf("Expected value ('%s') is not valid yaml.\nYAML parsing error: '%s'", expected, err.Error()), msgAndArgs...) - } - - if err := yaml.Unmarshal([]byte(actual), &actualYAMLAsInterface); err != nil { - return Fail(t, fmt.Sprintf("Input ('%s') needs to be valid yaml.\nYAML error: '%s'", actual, err.Error()), msgAndArgs...) - } - - return Equal(t, expectedYAMLAsInterface, actualYAMLAsInterface, msgAndArgs...) -} - func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { t := reflect.TypeOf(v) k := t.Kind() @@ -1570,7 +969,7 @@ func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { } // diff returns a diff of both values as long as both are of the same type and -// are a struct, map, slice, array or string. Otherwise it returns an empty string. +// are a struct, map, slice or array. Otherwise it returns an empty string. func diff(expected interface{}, actual interface{}) string { if expected == nil || actual == nil { return "" @@ -1583,18 +982,13 @@ func diff(expected interface{}, actual interface{}) string { return "" } - if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array && ek != reflect.String { + if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array { return "" } - var e, a string - if et != reflect.TypeOf("") { - e = spewConfig.Sdump(expected) - a = spewConfig.Sdump(actual) - } else { - e = reflect.ValueOf(expected).String() - a = reflect.ValueOf(actual).String() - } + spew.Config.SortKeys = true + e := spew.Sdump(expected) + a := spew.Sdump(actual) diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ A: difflib.SplitLines(e), @@ -1608,88 +1002,3 @@ func diff(expected interface{}, actual interface{}) string { return "\n\nDiff:\n" + diff } - -func isFunction(arg interface{}) bool { - if arg == nil { - return false - } - return reflect.TypeOf(arg).Kind() == reflect.Func -} - -var spewConfig = spew.ConfigState{ - Indent: " ", - DisablePointerAddresses: true, - DisableCapacities: true, - SortKeys: true, - DisableMethods: true, -} - -type tHelper interface { - Helper() -} - -// Eventually asserts that given condition will be met in waitFor time, -// periodically checking target function each tick. -// -// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond) -func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - ch := make(chan bool, 1) - - timer := time.NewTimer(waitFor) - defer timer.Stop() - - ticker := time.NewTicker(tick) - defer ticker.Stop() - - for tick := ticker.C; ; { - select { - case <-timer.C: - return Fail(t, "Condition never satisfied", msgAndArgs...) - case <-tick: - tick = nil - go func() { ch <- condition() }() - case v := <-ch: - if v { - return true - } - tick = ticker.C - } - } -} - -// Never asserts that the given condition doesn't satisfy in waitFor time, -// periodically checking the target function each tick. -// -// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) -func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - ch := make(chan bool, 1) - - timer := time.NewTimer(waitFor) - defer timer.Stop() - - ticker := time.NewTicker(tick) - defer ticker.Stop() - - for tick := ticker.C; ; { - select { - case <-timer.C: - return true - case <-tick: - tick = nil - go func() { ch <- condition() }() - case v := <-ch: - if v { - return Fail(t, "Condition satisfied", msgAndArgs...) - } - tick = ticker.C - } - } -} diff --git a/vendor/github.com/stretchr/testify/assert/forward_assertions.go b/vendor/github.com/stretchr/testify/assert/forward_assertions.go index df189d23..b867e95e 100644 --- a/vendor/github.com/stretchr/testify/assert/forward_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/forward_assertions.go @@ -13,4 +13,4 @@ func New(t TestingT) *Assertions { } } -//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs" +//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go index 4ed341dd..e1b9442b 100644 --- a/vendor/github.com/stretchr/testify/assert/http_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -8,17 +8,16 @@ import ( "strings" ) -// httpCode is a helper that returns HTTP code of the response. It returns -1 and -// an error if building a new request fails. -func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) { +// httpCode is a helper that returns HTTP code of the response. It returns -1 +// if building a new request fails. +func httpCode(handler http.HandlerFunc, method, url string, values url.Values) int { w := httptest.NewRecorder() - req, err := http.NewRequest(method, url, nil) + req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) if err != nil { - return -1, err + return -1 } - req.URL.RawQuery = values.Encode() handler(w, req) - return w.Code, nil + return w.Code } // HTTPSuccess asserts that a specified handler returns a success status code. @@ -26,21 +25,12 @@ func httpCode(handler http.HandlerFunc, method, url string, values url.Values) ( // assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) // // Returns whether the assertion was successful (true) or not (false). -func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code := httpCode(handler, method, url, values) + if code == -1 { + return false } - code, err := httpCode(handler, method, url, values) - if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - } - - isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent - if !isSuccessCode { - Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code)) - } - - return isSuccessCode + return code >= http.StatusOK && code <= http.StatusPartialContent } // HTTPRedirect asserts that a specified handler returns a redirect status code. @@ -48,21 +38,12 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value // assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). -func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code := httpCode(handler, method, url, values) + if code == -1 { + return false } - code, err := httpCode(handler, method, url, values) - if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - } - - isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect - if !isRedirectCode { - Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code)) - } - - return isRedirectCode + return code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect } // HTTPError asserts that a specified handler returns an error status code. @@ -70,43 +51,12 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu // assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). -func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() +func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code := httpCode(handler, method, url, values) + if code == -1 { + return false } - code, err := httpCode(handler, method, url, values) - if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - } - - isErrorCode := code >= http.StatusBadRequest - if !isErrorCode { - Fail(t, fmt.Sprintf("Expected HTTP error status code for %q but received %d", url+"?"+values.Encode(), code)) - } - - return isErrorCode -} - -// HTTPStatusCode asserts that a specified handler returns a specified status code. -// -// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - code, err := httpCode(handler, method, url, values) - if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - } - - successful := code == statuscode - if !successful { - Fail(t, fmt.Sprintf("Expected HTTP status code %d for %q but received %d", statuscode, url+"?"+values.Encode(), code)) - } - - return successful + return code >= http.StatusBadRequest } // HTTPBody is a helper that returns HTTP body of the response. It returns @@ -124,13 +74,10 @@ func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) s // HTTPBodyContains asserts that a specified handler returns a // body that contains a string. // -// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool { body := HTTPBody(handler, method, url, values) contains := strings.Contains(body, fmt.Sprint(str)) @@ -144,18 +91,15 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, // HTTPBodyNotContains asserts that a specified handler returns a // body that does not contain a string. // -// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool { body := HTTPBody(handler, method, url, values) contains := strings.Contains(body, fmt.Sprint(str)) if contains { - Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + Fail(t, "Expected response body for %s to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body) } return !contains diff --git a/vendor/github.com/stretchr/testify/require/doc.go b/vendor/github.com/stretchr/testify/require/doc.go new file mode 100644 index 00000000..169de392 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/doc.go @@ -0,0 +1,28 @@ +// Package require implements the same assertions as the `assert` package but +// stops test execution when a test fails. +// +// Example Usage +// +// The following is a complete example using require in a standard test function: +// import ( +// "testing" +// "github.com/stretchr/testify/require" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// require.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// Assertions +// +// The `require` package have same global functions as in the `assert` package, +// but instead of returning a boolean result they call `t.FailNow()`. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package require diff --git a/vendor/github.com/stretchr/testify/require/forward_requirements.go b/vendor/github.com/stretchr/testify/require/forward_requirements.go new file mode 100644 index 00000000..d3c2ab9b --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/forward_requirements.go @@ -0,0 +1,16 @@ +package require + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate go run ../_codegen/main.go -output-package=require -template=require_forward.go.tmpl diff --git a/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/stretchr/testify/require/require.go new file mode 100644 index 00000000..1bcfcb0d --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/require.go @@ -0,0 +1,464 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND +*/ + +package require + +import ( + + assert "github.com/stretchr/testify/assert" + http "net/http" + url "net/url" + time "time" +) + + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) { + if !assert.Condition(t, comp, msgAndArgs...) { + t.FailNow() + } +} + + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World", "But 'Hello World' does contain 'World'") +// assert.Contains(t, ["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'") +// assert.Contains(t, {"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'") +// +// Returns whether the assertion was successful (true) or not (false). +func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if !assert.Contains(t, s, contains, msgAndArgs...) { + t.FailNow() + } +} + + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +// +// Returns whether the assertion was successful (true) or not (false). +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.Empty(t, object, msgAndArgs...) { + t.FailNow() + } +} + + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123, "123 and 123 should be equal") +// +// Returns whether the assertion was successful (true) or not (false). +func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.Equal(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err, "An error was expected") { +// assert.Equal(t, err, expectedError) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) { + if !assert.EqualError(t, theError, errString, msgAndArgs...) { + t.FailNow() + } +} + + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123), "123 and 123 should be equal") +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.EqualValues(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err, "An error was expected") { +// assert.Equal(t, err, expectedError) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Error(t TestingT, err error, msgAndArgs ...interface{}) { + if !assert.Error(t, err, msgAndArgs...) { + t.FailNow() + } +} + + +// Exactly asserts that two objects are equal is value and type. +// +// assert.Exactly(t, int32(123), int64(123), "123 and 123 should NOT be equal") +// +// Returns whether the assertion was successful (true) or not (false). +func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.Exactly(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if !assert.Fail(t, failureMessage, msgAndArgs...) { + t.FailNow() + } +} + + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if !assert.FailNow(t, failureMessage, msgAndArgs...) { + t.FailNow() + } +} + + +// False asserts that the specified value is false. +// +// assert.False(t, myBool, "myBool should be false") +// +// Returns whether the assertion was successful (true) or not (false). +func False(t TestingT, value bool, msgAndArgs ...interface{}) { + if !assert.False(t, value, msgAndArgs...) { + t.FailNow() + } +} + + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyContains(t, handler, method, url, values, str) { + t.FailNow() + } +} + + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyNotContains(t, handler, method, url, values, str) { + t.FailNow() + } +} + + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPError(t, handler, method, url, values) { + t.FailNow() + } +} + + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPRedirect(t, handler, method, url, values) { + t.FailNow() + } +} + + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPSuccess(t, handler, method, url, values) { + t.FailNow() + } +} + + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject), "MyObject") +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + if !assert.Implements(t, interfaceObject, object, msgAndArgs...) { + t.FailNow() + } +} + + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDelta(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if !assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) { + t.FailNow() + } +} + + +// InEpsilonSlice is the same as InEpsilon, except it compares two slices. +func InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InEpsilonSlice(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + if !assert.IsType(t, expectedType, object, msgAndArgs...) { + t.FailNow() + } +} + + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { + if !assert.JSONEq(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3, "The size of slice is not 3") +// +// Returns whether the assertion was successful (true) or not (false). +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) { + if !assert.Len(t, object, length, msgAndArgs...) { + t.FailNow() + } +} + + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err, "err should be nothing") +// +// Returns whether the assertion was successful (true) or not (false). +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.Nil(t, object, msgAndArgs...) { + t.FailNow() + } +} + + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, actualObj, expectedObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoError(t TestingT, err error, msgAndArgs ...interface{}) { + if !assert.NoError(t, err, msgAndArgs...) { + t.FailNow() + } +} + + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'") +// assert.NotContains(t, ["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'") +// assert.NotContains(t, {"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if !assert.NotContains(t, s, contains, msgAndArgs...) { + t.FailNow() + } +} + + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.NotEmpty(t, object, msgAndArgs...) { + t.FailNow() + } +} + + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2, "two objects shouldn't be equal") +// +// Returns whether the assertion was successful (true) or not (false). +func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.NotEqual(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err, "err should be something") +// +// Returns whether the assertion was successful (true) or not (false). +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.NotNil(t, object, msgAndArgs...) { + t.FailNow() + } +} + + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ +// RemainCalm() +// }, "Calling RemainCalm() should NOT panic") +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.NotPanics(t, f, msgAndArgs...) { + t.FailNow() + } +} + + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if !assert.NotRegexp(t, rx, str, msgAndArgs...) { + t.FailNow() + } +} + + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if !assert.NotZero(t, i, msgAndArgs...) { + t.FailNow() + } +} + + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ +// GoCrazy() +// }, "Calling GoCrazy() should panic") +// +// Returns whether the assertion was successful (true) or not (false). +func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.Panics(t, f, msgAndArgs...) { + t.FailNow() + } +} + + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if !assert.Regexp(t, rx, str, msgAndArgs...) { + t.FailNow() + } +} + + +// True asserts that the specified value is true. +// +// assert.True(t, myBool, "myBool should be true") +// +// Returns whether the assertion was successful (true) or not (false). +func True(t TestingT, value bool, msgAndArgs ...interface{}) { + if !assert.True(t, value, msgAndArgs...) { + t.FailNow() + } +} + + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s") +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + if !assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + + +// Zero asserts that i is the zero value for its type and returns the truth. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if !assert.Zero(t, i, msgAndArgs...) { + t.FailNow() + } +} diff --git a/vendor/github.com/stretchr/testify/require/require.go.tmpl b/vendor/github.com/stretchr/testify/require/require.go.tmpl new file mode 100644 index 00000000..ab1b1e9f --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/require.go.tmpl @@ -0,0 +1,6 @@ +{{.Comment}} +func {{.DocInfo.Name}}(t TestingT, {{.Params}}) { + if !assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { + t.FailNow() + } +} diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/stretchr/testify/require/require_forward.go new file mode 100644 index 00000000..58324f10 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/require_forward.go @@ -0,0 +1,388 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND +*/ + +package require + +import ( + + assert "github.com/stretchr/testify/assert" + http "net/http" + url "net/url" + time "time" +) + + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) { + Condition(a.t, comp, msgAndArgs...) +} + + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World", "But 'Hello World' does contain 'World'") +// a.Contains(["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'") +// a.Contains({"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + Contains(a.t, s, contains, msgAndArgs...) +} + + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) { + Empty(a.t, object, msgAndArgs...) +} + + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123, "123 and 123 should be equal") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + Equal(a.t, expected, actual, msgAndArgs...) +} + + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err, "An error was expected") { +// assert.Equal(t, err, expectedError) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) { + EqualError(a.t, theError, errString, msgAndArgs...) +} + + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123), "123 and 123 should be equal") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + EqualValues(a.t, expected, actual, msgAndArgs...) +} + + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err, "An error was expected") { +// assert.Equal(t, err, expectedError) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) { + Error(a.t, err, msgAndArgs...) +} + + +// Exactly asserts that two objects are equal is value and type. +// +// a.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + Exactly(a.t, expected, actual, msgAndArgs...) +} + + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) { + Fail(a.t, failureMessage, msgAndArgs...) +} + + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) { + FailNow(a.t, failureMessage, msgAndArgs...) +} + + +// False asserts that the specified value is false. +// +// a.False(myBool, "myBool should be false") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) { + False(a.t, value, msgAndArgs...) +} + + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyContains(a.t, handler, method, url, values, str) +} + + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyNotContains(a.t, handler, method, url, values, str) +} + + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPError(a.t, handler, method, url, values) +} + + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPRedirect(a.t, handler, method, url, values) +} + + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPSuccess(a.t, handler, method, url, values) +} + + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject), "MyObject") +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + Implements(a.t, interfaceObject, object, msgAndArgs...) +} + + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + + +// InEpsilonSlice is the same as InEpsilon, except it compares two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InEpsilonSlice(a.t, expected, actual, delta, msgAndArgs...) +} + + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + IsType(a.t, expectedType, object, msgAndArgs...) +} + + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) { + JSONEq(a.t, expected, actual, msgAndArgs...) +} + + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3, "The size of slice is not 3") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) { + Len(a.t, object, length, msgAndArgs...) +} + + +// Nil asserts that the specified object is nil. +// +// a.Nil(err, "err should be nothing") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) { + Nil(a.t, object, msgAndArgs...) +} + + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, actualObj, expectedObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) { + NoError(a.t, err, msgAndArgs...) +} + + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'") +// a.NotContains(["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'") +// a.NotContains({"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + NotContains(a.t, s, contains, msgAndArgs...) +} + + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) { + NotEmpty(a.t, object, msgAndArgs...) +} + + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2, "two objects shouldn't be equal") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + NotEqual(a.t, expected, actual, msgAndArgs...) +} + + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err, "err should be something") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) { + NotNil(a.t, object, msgAndArgs...) +} + + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ +// RemainCalm() +// }, "Calling RemainCalm() should NOT panic") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + NotPanics(a.t, f, msgAndArgs...) +} + + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + NotRegexp(a.t, rx, str, msgAndArgs...) +} + + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) { + NotZero(a.t, i, msgAndArgs...) +} + + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ +// GoCrazy() +// }, "Calling GoCrazy() should panic") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + Panics(a.t, f, msgAndArgs...) +} + + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + Regexp(a.t, rx, str, msgAndArgs...) +} + + +// True asserts that the specified value is true. +// +// a.True(myBool, "myBool should be true") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) { + True(a.t, value, msgAndArgs...) +} + + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + + +// Zero asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) { + Zero(a.t, i, msgAndArgs...) +} diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl b/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl new file mode 100644 index 00000000..b93569e0 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl @@ -0,0 +1,4 @@ +{{.CommentWithoutT "a"}} +func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) { + {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) +} diff --git a/vendor/github.com/stretchr/testify/require/requirements.go b/vendor/github.com/stretchr/testify/require/requirements.go new file mode 100644 index 00000000..41147562 --- /dev/null +++ b/vendor/github.com/stretchr/testify/require/requirements.go @@ -0,0 +1,9 @@ +package require + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) + FailNow() +} + +//go:generate go run ../_codegen/main.go -output-package=require -template=require.go.tmpl diff --git a/vendor/github.com/subosito/gotenv/.travis.yml b/vendor/github.com/subosito/gotenv/.travis.yml deleted file mode 100644 index 3370d5f4..00000000 --- a/vendor/github.com/subosito/gotenv/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: go -go: - - 1.x -os: - - linux - - osx -script: - - go test -test.v -coverprofile=coverage.out -covermode=count -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/subosito/gotenv/README.md b/vendor/github.com/subosito/gotenv/README.md index d610cdf0..8c44d546 100644 --- a/vendor/github.com/subosito/gotenv/README.md +++ b/vendor/github.com/subosito/gotenv/README.md @@ -1,12 +1,11 @@ # gotenv -[![Build Status](https://travis-ci.org/subosito/gotenv.svg?branch=master)](https://travis-ci.org/subosito/gotenv) -[![Build status](https://ci.appveyor.com/api/projects/status/wb2e075xkfl0m0v2/branch/master?svg=true)](https://ci.appveyor.com/project/subosito/gotenv/branch/master) +[![Build Status](https://github.com/subosito/gotenv/workflows/Go%20workflow/badge.svg)](https://github.com/subosito/gotenv/actions) [![Coverage Status](https://badgen.net/codecov/c/github/subosito/gotenv)](https://codecov.io/gh/subosito/gotenv) [![Go Report Card](https://goreportcard.com/badge/github.com/subosito/gotenv)](https://goreportcard.com/report/github.com/subosito/gotenv) [![GoDoc](https://godoc.org/github.com/subosito/gotenv?status.svg)](https://godoc.org/github.com/subosito/gotenv) -Load environment variables dynamically in Go. +Load environment variables from `.env` or `io.Reader` in Go. ## Usage diff --git a/vendor/github.com/subosito/gotenv/appveyor.yml b/vendor/github.com/subosito/gotenv/appveyor.yml deleted file mode 100644 index 33b4c404..00000000 --- a/vendor/github.com/subosito/gotenv/appveyor.yml +++ /dev/null @@ -1,9 +0,0 @@ -build: off -clone_folder: c:\gopath\src\github.com\subosito\gotenv -environment: - GOPATH: c:\gopath -stack: go 1.10 -before_test: - - go get -t -test_script: - - go test -v -cover -race diff --git a/vendor/github.com/subosito/gotenv/go.mod b/vendor/github.com/subosito/gotenv/go.mod new file mode 100644 index 00000000..f99ba493 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/go.mod @@ -0,0 +1,5 @@ +module github.com/subosito/gotenv + +go 1.13 + +require github.com/stretchr/testify v1.4.0 diff --git a/vendor/github.com/subosito/gotenv/go.sum b/vendor/github.com/subosito/gotenv/go.sum new file mode 100644 index 00000000..8fdee585 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/go.sum @@ -0,0 +1,11 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/twotwotwo/sorts/LICENSE b/vendor/github.com/twotwotwo/sorts/LICENSE new file mode 100644 index 00000000..d4d336e3 --- /dev/null +++ b/vendor/github.com/twotwotwo/sorts/LICENSE @@ -0,0 +1,29 @@ +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2014-5 Randall Farmer. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/twotwotwo/sorts/README.md b/vendor/github.com/twotwotwo/sorts/README.md new file mode 100644 index 00000000..b9067a4f --- /dev/null +++ b/vendor/github.com/twotwotwo/sorts/README.md @@ -0,0 +1,31 @@ +# [sorts](http://godoc.org/github.com/twotwotwo/sorts) + +[sorts](http://godoc.org/github.com/twotwotwo/sorts) provides +parallel radix sorting by a string, []byte, or (u)int64 key, and a parallel +Quicksort(data). +[sorts/sortutil](http://godoc.org/github.com/twotwotwo/sorts/sortutil) +sorts common slice types and adds functions to help sort floats. + +Usually, stick to stdlib sort: that's fast, standard, and simpler. But this +package may help if sorting huge datasets is a bottleneck for you. To get a +sense of the potential gains, [some timings are available](https://docs.google.com/spreadsheets/d/1GkXMLXQ7oW5Bp0qwyYw0IiQElIq8B-IvNEYE_RPCTvA/edit#gid=0). + +To radix sort, +[implement sort.Interface](http://golang.org/pkg/sort/#Interface) +plus one more method, Key(i int), returning the key for an item as +string/[]byte/(u)int64, and call sorts.ByString, ByBytes, ByUint64, or +ByInt64. See the godoc for details and examples: +http://godoc.org/github.com/twotwotwo/sorts + +There's no Reverse(), but sorts.Flip(data) will flip ascending-sorted +data to descending. There's no stable sort. The string sorts just compare +byte values; é won't sort next to e. Set sorts.MaxProcs if you want to +limit concurrency. The package checks that data is sorted after every run +and panics(!) if not. + +Credit (but no blame, or claim of endorsement) to the authors of stdlib sort; +this uses its qSort, tests, and interface, and the clarity of its code +helped make this possible. + +I'd love to hear if you're using this. E-mail me at my github username at +GMail, or say hey on Twitter ([@rf](http://twitter.com/rf/)). diff --git a/vendor/github.com/twotwotwo/sorts/interfaces.go b/vendor/github.com/twotwotwo/sorts/interfaces.go new file mode 100644 index 00000000..912b01ef --- /dev/null +++ b/vendor/github.com/twotwotwo/sorts/interfaces.go @@ -0,0 +1,55 @@ +// Copyright 2009 The Go Authors. +// Copyright 2015 Randall Farmer. +// All rights reserved. + +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package sorts does parallel radix sorts of data by (u)int64, string, or +// []byte keys, and parallel quicksort. See the sorts/sortutil package for +// shortcuts for common slice types and help sorting floats. +package sorts + +import "sort" // for Interface + +// Uint64Interface represents a collection that can be sorted by a uint64 +// key. +type Uint64Interface interface { + sort.Interface + // Key provides a uint64 key for element i. + Key(i int) uint64 +} + +// Int64Interface represents a collection that can be sorted by an int64 +// key. +type Int64Interface interface { + sort.Interface + // Key provides an int64 key for element i. + Key(i int) int64 +} + +// StringInterface represents a collection that can be sorted by a string +// key. +type StringInterface interface { + sort.Interface + // Key provides the string key for element i. + Key(i int) string +} + +// BytesInterface represents a collection that can be sorted by a []byte +// key. +type BytesInterface interface { + sort.Interface + // Key provides the []byte key for element i. + Key(i int) []byte +} + +// Flip reverses the order of items in a sort.Interface. +func Flip(data sort.Interface) { + a, b := 0, data.Len()-1 + for b > a { + data.Swap(a, b) + a++ + b-- + } +} diff --git a/vendor/github.com/twotwotwo/sorts/parallel.go b/vendor/github.com/twotwotwo/sorts/parallel.go new file mode 100644 index 00000000..8dcbfc8f --- /dev/null +++ b/vendor/github.com/twotwotwo/sorts/parallel.go @@ -0,0 +1,81 @@ +package sorts + +import ( + "runtime" + "sort" + "sync" +) + +// helpers to coordinate parallel sorts + +type sortFunc func(sort.Interface, task, func(task)) + +// MaxProcs controls how many goroutines to start for large sorts. If 0, +// GOMAXPROCS will be used; if 1, all sorts will be serial. +var MaxProcs = 0 + +// minParallel is the size of the smallest collection we will try to sort in +// parallel. +var minParallel = 10000 + +// minOffload is the size of the smallest range that can be offloaded to +// another goroutine. +var minOffload = 127 + +// bufferRatio is how many sorting tasks to queue (buffer) up per +// worker goroutine. +var bufferRatio float32 = 1 + +// parallelSort calls the sorters with an asyncSort function that will hand +// the task off to another goroutine when possible. +func parallelSort(data sort.Interface, sorter sortFunc, initialTask task) { + max := runtime.GOMAXPROCS(0) + if MaxProcs > 0 && MaxProcs < max { + max = MaxProcs + } + l := data.Len() + if l < minParallel { + max = 1 + } + + var syncSort func(t task) + syncSort = func(t task) { + sorter(data, t, syncSort) + } + if max == 1 { + syncSort(initialTask) + return + } + + wg := new(sync.WaitGroup) + // buffer up one extra task to keep each cpu busy + sorts := make(chan task, int(float32(max)*bufferRatio)) + var asyncSort func(t task) + asyncSort = func(t task) { + if t.end-t.pos < minOffload { + sorter(data, t, syncSort) + return + } + wg.Add(1) + select { + case sorts <- t: + default: + sorter(data, t, asyncSort) + wg.Done() + } + } + doSortWork := func() { + for task := range sorts { + sorter(data, task, asyncSort) + wg.Done() + } + } + for i := 0; i < max; i++ { + go doSortWork() + } + + asyncSort(initialTask) + + wg.Wait() + close(sorts) +} diff --git a/vendor/github.com/twotwotwo/sorts/qsort.go b/vendor/github.com/twotwotwo/sorts/qsort.go new file mode 100644 index 00000000..ba1df81f --- /dev/null +++ b/vendor/github.com/twotwotwo/sorts/qsort.go @@ -0,0 +1,261 @@ +package sorts + +import ( + "sort" +) + +// Copyright 2009 The Go Authors. +// Copyright 2014-5 Randall Farmer. +// All rights reserved. + +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This copies code from Go's sort.go because we can't use something like +// sort.SortRange(data, a, b) to sort a range of data. Wrapping incoming +// data in another sort.Interface is possible, but kills speed. + +// Insertion sort +func insertionSort(data sort.Interface, a, b int) { + for i := a + 1; i < b; i++ { + for j := i; j > a && data.Less(j, j-1); j-- { + data.Swap(j, j-1) + } + } +} + +// siftDown implements the heap property on data[lo, hi). +// first is an offset into the array where the root of the heap lies. +func siftDown(data sort.Interface, lo, hi, first int) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && data.Less(first+child, first+child+1) { + child++ + } + if !data.Less(first+root, first+child) { + return + } + data.Swap(first+root, first+child) + root = child + } +} + +func heapSort(data sort.Interface, a, b int) { + first := a + lo := 0 + hi := b - a + + // Build heap with greatest element at top. + for i := (hi - 1) / 2; i >= 0; i-- { + siftDown(data, i, hi, first) + } + + // Pop elements, largest first, into end of data. + for i := hi - 1; i >= 0; i-- { + data.Swap(first, first+i) + siftDown(data, lo, i, first) + } +} + +// medianOfThree moves the median of the three values data[m0], data[m1], data[m2] into data[m1]. +func medianOfThree(data sort.Interface, m1, m0, m2 int) { + // sort 3 elements + if data.Less(m1, m0) { + data.Swap(m1, m0) + } + // data[m0] <= data[m1] + if data.Less(m2, m1) { + data.Swap(m2, m1) + // data[m0] <= data[m2] && data[m1] < data[m2] + if data.Less(m1, m0) { + data.Swap(m1, m0) + } + } + // now data[m0] <= data[m1] <= data[m2] +} + +func doPivot(data sort.Interface, lo, hi int) (midlo, midhi int) { + m := lo + (hi-lo)/2 // Written like this to avoid integer overflow. + if hi-lo > 40 { + // Tukey's ``Ninther,'' median of three medians of three. + s := (hi - lo) / 8 + medianOfThree(data, lo, lo+s, lo+2*s) + medianOfThree(data, m, m-s, m+s) + medianOfThree(data, hi-1, hi-1-s, hi-1-2*s) + } + medianOfThree(data, lo, m, hi-1) + + // Invariants are: + // data[lo] = pivot (set up by ChoosePivot) + // data[lo < i < a] < pivot + // data[a <= i < b] <= pivot + // data[b <= i < c] unexamined + // data[c <= i < hi-1] > pivot + // data[hi-1] >= pivot + pivot := lo + a, c := lo+1, hi-1 + + for ; a != c && data.Less(a, pivot); a++ { + } + b := a + for { + for ; b != c && !data.Less(pivot, b); b++ { // data[b] <= pivot + } + for ; b != c && data.Less(pivot, c-1); c-- { // data[c-1] > pivot + } + if b == c { + break + } + // data[b] > pivot; data[c-1] <= pivot + data.Swap(b, c-1) + b++ + c-- + } + // If hi-c<3 then there are duplicates (by property of median of nine). + // Let be a bit more conservative, and set border to 5. + protect := hi-c < 5 + if !protect && hi-c < (hi-lo)/4 { + // Lets test some points for equality to pivot + dups := 0 + if !data.Less(pivot, hi-1) { // data[hi-1] = pivot + data.Swap(c, hi-1) + c++ + dups++ + } + if !data.Less(b-1, pivot) { // data[b-1] = pivot + b-- + dups++ + } + // m-lo = (hi-lo)/2 > 6 + // b-lo > (hi-lo)*3/4-1 > 8 + // ==> m < b ==> data[m] <= pivot + if !data.Less(m, pivot) { // data[m] = pivot + data.Swap(m, b-1) + b-- + dups++ + } + // if at least 2 points are equal to pivot, assume skewed distribution + protect = dups > 1 + } + if protect { + // Protect against a lot of duplicates + // Add invariant: + // data[a <= i < b] unexamined + // data[b <= i < c] = pivot + for { + for ; a != b && !data.Less(b-1, pivot); b-- { // data[b] == pivot + } + for ; a != b && data.Less(a, pivot); a++ { // data[a] < pivot + } + if a == b { + break + } + // data[a] == pivot; data[b-1] < pivot + data.Swap(a, b-1) + a++ + b-- + } + } + // Swap pivot into middle + data.Swap(pivot, b-1) + return b - 1, c +} + +func quickSort(data sort.Interface, a, b, maxDepth int) { + for b-a > 12 { + if maxDepth == 0 { + heapSort(data, a, b) + return + } + maxDepth-- + mlo, mhi := doPivot(data, a, b) + // Avoiding recursion on the larger subproblem guarantees + // a stack depth of at most lg(b-a). + if mlo-a < b-mhi { + quickSort(data, a, mlo, maxDepth) + a = mhi // i.e., quickSort(data, mhi, b) + } else { + quickSort(data, mhi, b, maxDepth) + b = mlo // i.e., quickSort(data, a, mlo) + } + } + if b-a > 1 { + // Do ShellSort pass with gap 6 + // It could be written in this simplified form cause b-a <= 12 + for i := a + 6; i < b; i++ { + if data.Less(i, i-6) { + data.Swap(i, i-6) + } + } + insertionSort(data, a, b) + } +} + +// qSort quicksorts data immediately. +// It performs O(n*log(n)) comparisons and swaps. The sort is not stable. +func qSort(data sort.Interface, a, b int) { + // Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached. + n := b - a + maxDepth := 0 + for i := n; i > 0; i >>= 1 { + maxDepth++ + } + maxDepth *= 2 + quickSort(data, a, b, maxDepth) +} + +// Quicksort performs a parallel quicksort on data. +func Quicksort(data sort.Interface) { + a, b := 0, data.Len() + n := b - a + maxDepth := 0 + for i := n; i > 0; i >>= 1 { + maxDepth++ + } + maxDepth *= 2 + parallelSort(data, quickSortWorker, task{-maxDepth - 1, a, b}) +} + +// qSortPar starts a parallel quicksort. +func qSortPar(data sort.Interface, t task, sortRange func(task)) { + a, b := t.pos, t.end + n := b - a + maxDepth := 0 + for i := n; i > 0; i >>= 1 { + maxDepth++ + } + maxDepth *= 2 + quickSortWorker(data, task{-maxDepth - 1, a, b}, sortRange) +} + +// quickSortWorker is a parallel analogue of quickSort: it performs a pivot +// and might asynchronously sort one of the halves if it's large enough. +func quickSortWorker(data sort.Interface, t task, sortRange func(task)) { + maxDepth, a, b := 1-t.offs, t.pos, t.end + for b-a > minOffload { + if maxDepth == 0 { + heapSort(data, a, b) + return + } + maxDepth-- + mlo, mhi := doPivot(data, a, b) + // Avoiding recursion on the larger subproblem guarantees + // a stack depth of at most lg(b-a). + if mlo-a < b-mhi { + sortRange(task{-maxDepth - 1, a, mlo}) + a = mhi // i.e., quickSortWorker(data, mhi, b) + } else { + sortRange(task{-maxDepth - 1, mhi, b}) + b = mlo // i.e., quickSortWorker(data, a, mlo) + } + } + if b-a > 7 { + quickSort(data, a, b, maxDepth) + } else if b-a > 1 { + insertionSort(data, a, b) + } +} diff --git a/vendor/github.com/twotwotwo/sorts/radixsort.go b/vendor/github.com/twotwotwo/sorts/radixsort.go new file mode 100644 index 00000000..625b9185 --- /dev/null +++ b/vendor/github.com/twotwotwo/sorts/radixsort.go @@ -0,0 +1,534 @@ +// Copyright 2014-5 Randall Farmer. All rights reserved. + +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package sorts + +import ( + "bytes" + "sort" +) + +const radix = 8 +const mask = (1 << radix) - 1 + +// qSortCutoff is when we bail out to a quicksort. It's changed to 1 for +// certain tests so we can more easily exercise the radix sorting. This was +// around the break-even point in some sloppy tests. +var qSortCutoff = 1 << 7 + +const keyPanicMessage = "sort failed: Key and Less aren't consistent with each other" +const keyUint64Help = " (for float data, sortutil Key functions may help resolve this)" +const panicMessage = "sort failed: could be a data race, a bug in package sorts, or a subtle bug in the interface implementation" + +// maxRadixDepth limits how deeply the radix part of string sorts can +// recurse before we bail to quicksort. Each recursion uses 2KB stack. +const maxRadixDepth = 32 + +// task describes a range of data to be sorted and additional +// information the sorter needs: bitshift in a numeric sort, byte offset in +// a string sort, or maximum depth (expressed as -maxDepth-1) for a +// quicksort. +type task struct{ offs, pos, end int } + +// ByUint64 sorts data by a uint64 key. +func ByUint64(data Uint64Interface) { + l := data.Len() + if l < qSortCutoff { + qSort(data, 0, l) + return + } + + shift := guessIntShift(data, l) + parallelSort(data, radixSortUint64, task{offs: int(shift), end: l}) + + // check results if we radix sorted! + for i := 1; i < l; i++ { + if data.Less(i, i-1) { + if data.Key(i) > data.Key(i-1) { + panic(keyPanicMessage + keyUint64Help) + } + panic(panicMessage) + } + } +} + +// int64Key generates a uint64 from an int64 +func int64Key(i int64) uint64 { return uint64(i) ^ 1<<63 } + +// intwrapper tunrs an Int64Interface into a Uint64Interface for +// guessIntShift +type intwrapper struct{ Int64Interface } + +func (iw intwrapper) Key(i int) uint64 { + return int64Key(iw.Int64Interface.Key(i)) +} + +// ByInt64 sorts data by an int64 key. +func ByInt64(data Int64Interface) { + l := data.Len() + if l < qSortCutoff { + qSort(data, 0, l) + return + } + + shift := guessIntShift(intwrapper{data}, l) + parallelSort(data, radixSortInt64, task{offs: int(shift), end: l}) + + // check results! + for i := 1; i < l; i++ { + if data.Less(i, i-1) { + if data.Key(i) > data.Key(i-1) { + panic(keyPanicMessage + keyUint64Help) + } + panic(panicMessage) + } + } +} + +// ByString sorts data by a string key. +func ByString(data StringInterface) { + l := data.Len() + if l < qSortCutoff { + qSort(data, 0, l) + return + } + + parallelSort(data, radixSortString, task{end: l}) + + // check results if we radix sorted! + for i := 1; i < l; i++ { + if data.Less(i, i-1) { + if data.Key(i) > data.Key(i-1) { + panic(keyPanicMessage) + } + panic(panicMessage) + } + } +} + +// ByBytes sorts data by a []byte key. +func ByBytes(data BytesInterface) { + l := data.Len() + if l < qSortCutoff { + qSort(data, 0, l) + return + } + + parallelSort(data, radixSortBytes, task{end: l}) + + // check results if we radix sorted! + for i := 1; i < l; i++ { + if data.Less(i, i-1) { + if bytes.Compare(data.Key(i), data.Key(i-1)) > 0 { + panic(keyPanicMessage) + } + panic(panicMessage) + } + } +} + +// guessIntShift saves a pass when the data is distributed roughly uniformly +// in a small range (think shuffled indices into a small array), and rarely +// hurts much otherwise: either it just returns 64-radix quickly, or it +// returns too small a shift and the sort notices after one useless counting +// pass. +func guessIntShift(data Uint64Interface, l int) uint { + step := l >> 5 + if l > 1<<16 { + step = l >> 8 + } + if step == 0 { // only for tests w/qSortCutoff lowered + step = 1 + } + min := data.Key(l - 1) + max := min + for i := 0; i < l; i += step { + k := data.Key(i) + if k < min { + min = k + } + if k > max { + max = k + } + } + diff := min ^ max + log2diff := 0 + for diff != 0 { + log2diff++ + diff >>= 1 + } + shiftGuess := log2diff - radix + if shiftGuess < 0 { + return 0 + } + return uint(shiftGuess) +} + +/* +Thanks to (and please refer to): + +Victor J. Duvanenko, "Parallel In-Place Radix Sort Simplified", 2011, at +http://www.drdobbs.com/parallel/parallel-in-place-radix-sort-simplified/229000734 +for lots of practical discussion of performance + +Michael Herf, "Radix Tricks", 2001, at +http://stereopsis.com/radix.html +for the idea for Float32Key()/Float64Key() (via Pierre Tardiman, "Radix Sort +Revisited", 2000, at http://codercorner.com/RadixSortRevisited.htm) and more +performance talk. + +A handy slide deck summarizing Robert Sedgewick and Kevin Wayne's Algorithms +on string sorts: +http://algs4.cs.princeton.edu/lectures/51StringSorts.pdf +for a grounding in string sorts and pointer to American flag sort + +McIlroy, Bostic, and McIlroy, "Engineering Radix Sort", 1993 at +http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6990 +for laying out American flag sort + +- We're not using American flag sort's trick of keeping our own stack. It + might help on some data, but just bailing to qsort after 32 bytes is + enough to keep stack use from exploding. + +- I suspect the quicksort phase could be sped up, especially for strings. + If you collected the next, say, eight bytes of each string in an array, + sorted those, and only compared full strings as a tiebreaker, you could + likely avoid following a lot of pointers and use cache better. That's a + lot of work and a lot of code, though. + +- I'm sure with a radically different approach--like with a type like this: + type Index struct { Indices, Keys uint64 } + you could do a bunch of other cool things. + +*/ + +// All three radixSort functions below do a counting pass and a swapping +// pass, then recurse. They fall back to comparison sort for small buckets +// and equal ranges, and the int sorts try to skip bits that are identical +// across the whole range being sorted. + +func radixSortUint64(dataI sort.Interface, t task, sortRange func(task)) { + data := dataI.(Uint64Interface) + shift, a, b := uint(t.offs), t.pos, t.end + if b-a < qSortCutoff { + qSort(data, a, b) + return + } + + // use a single pass over the keys to bucket data and find min/max + // (for skipping over bits that are always identical) + var bucketStarts, bucketEnds [1 << radix]int + min := data.Key(a) + max := min + for i := a; i < b; i++ { + k := data.Key(i) + bucketStarts[(k>>shift)&mask]++ + if k < min { + min = k + } + if k > max { + max = k + } + } + + // skip past common prefixes, bail if all keys equal + diff := min ^ max + if diff == 0 { + qSortEqualKeyRange(data, a, b) + return + } + if diff>>shift == 0 || diff>>(shift+radix) != 0 { + // find highest 1 bit in diff + log2diff := 0 + for diff != 0 { + log2diff++ + diff >>= 1 + } + nextShift := log2diff - radix + if nextShift < 0 { + nextShift = 0 + } + sortRange(task{nextShift, a, b}) + return + } + + pos := a + for i, c := range bucketStarts { + bucketStarts[i] = pos + pos += c + bucketEnds[i] = pos + } + + for curBucket, bucketEnd := range bucketEnds { + i := bucketStarts[curBucket] + for i < bucketEnd { + destBucket := (data.Key(i) >> shift) & mask + if destBucket == uint64(curBucket) { + i++ + bucketStarts[destBucket]++ + continue + } + data.Swap(i, bucketStarts[destBucket]) + bucketStarts[destBucket]++ + } + } + + if shift == 0 { + pos = a + for _, end := range bucketEnds { + if end > pos+1 { + qSortEqualKeyRange(data, pos, end) + } + pos = end + } + return + } + + nextShift := shift - radix + if shift < radix { + nextShift = 0 + } + pos = a + for _, end := range bucketEnds { + if end > pos+1 { + sortRange(task{int(nextShift), pos, end}) + } + pos = end + } +} + +func radixSortInt64(dataI sort.Interface, t task, sortRange func(task)) { + data := dataI.(Int64Interface) + shift, a, b := uint(t.offs), t.pos, t.end + if b-a < qSortCutoff { + qSort(data, a, b) + return + } + + // use a single pass over the keys to bucket data and find min/max + // (for skipping over bits that are always identical) + var bucketStarts, bucketEnds [1 << radix]int + min := int64Key(data.Key(a)) + max := min + for i := a; i < b; i++ { + k := int64Key(data.Key(i)) + bucketStarts[(k>>shift)&mask]++ + if k < min { + min = k + } + if k > max { + max = k + } + } + + // skip past common prefixes, bail if all keys equal + diff := min ^ max + if diff == 0 { + qSortEqualKeyRange(data, a, b) + return + } + if diff>>shift == 0 || diff>>(shift+radix) != 0 { + // find highest 1 bit in diff + log2diff := 0 + for diff != 0 { + log2diff++ + diff >>= 1 + } + nextShift := log2diff - radix + if nextShift < 0 { + nextShift = 0 + } + sortRange(task{nextShift, a, b}) + return + } + + pos := a + for i, c := range bucketStarts { + bucketStarts[i] = pos + pos += c + bucketEnds[i] = pos + } + + for curBucket, bucketEnd := range bucketEnds { + i := bucketStarts[curBucket] + for i < bucketEnd { + destBucket := (int64Key(data.Key(i)) >> shift) & mask + if destBucket == uint64(curBucket) { + i++ + bucketStarts[destBucket]++ + continue + } + data.Swap(i, bucketStarts[destBucket]) + bucketStarts[destBucket]++ + } + } + + if shift == 0 { + // each bucket is a unique key + pos = a + for _, end := range bucketEnds { + if end > pos+1 { + qSortEqualKeyRange(data, pos, end) + } + pos = end + } + return + } + + nextShift := shift - radix + if shift < radix { + nextShift = 0 + } + pos = a + for _, end := range bucketEnds { + if end > pos+1 { + sortRange(task{int(nextShift), pos, end}) + } + pos = end + } +} + +func radixSortString(dataI sort.Interface, t task, sortRange func(task)) { + data := dataI.(StringInterface) + offset, a, b := t.offs, t.pos, t.end + if offset < 0 { + // in a parallel quicksort of items w/long common key prefix + quickSortWorker(data, t, sortRange) + return + } + if b-a < qSortCutoff { + qSort(data, a, b) + return + } + if offset == maxRadixDepth { + qSortPar(data, t, sortRange) + return + } + + // swap too-short strings to start and count bucket sizes + bucketStarts, bucketEnds := [256]int{}, [256]int{} + aInitial := a + for i := a; i < b; i++ { + k := data.Key(i) + if len(k) <= offset { + // swap too-short strings to start + data.Swap(a, i) + a++ + continue + } + bucketStarts[k[offset]]++ + } + if a > aInitial+1 { + qSortEqualKeyRange(data, aInitial, a) + } + + pos := a + for i, c := range bucketStarts { + bucketStarts[i] = pos + pos += c + bucketEnds[i] = pos + if bucketStarts[i] == a && bucketEnds[i] == b { + // everything was in the same bucket + sortRange(task{offset + 1, a, b}) + return + } + } + + i := a + for curBucket, bucketEnd := range bucketEnds { + start := i + i = bucketStarts[curBucket] + for i < bucketEnd { + destBucket := data.Key(i)[offset] + if destBucket == byte(curBucket) { + i++ + bucketStarts[destBucket]++ + continue + } + data.Swap(i, bucketStarts[destBucket]) + bucketStarts[destBucket]++ + } + if i > start+1 { + sortRange(task{offset + 1, start, i}) + } + } +} + +func radixSortBytes(dataI sort.Interface, t task, sortRange func(task)) { + data := dataI.(BytesInterface) + offset, a, b := t.offs, t.pos, t.end + if offset < 0 { + // in a parallel quicksort of items w/long common key prefix + quickSortWorker(data, t, sortRange) + return + } + if b-a < qSortCutoff { + qSort(data, a, b) + return + } + if offset == maxRadixDepth { + qSortPar(data, t, sortRange) + return + } + + // swap too-short strings to start and count bucket sizes + bucketStarts, bucketEnds := [256]int{}, [256]int{} + aInitial := a + for i := a; i < b; i++ { + k := data.Key(i) + if len(k) <= offset { + // swap too-short strings to start + data.Swap(a, i) + a++ + continue + } + bucketStarts[k[offset]]++ + } + if a > aInitial+1 { + qSortEqualKeyRange(data, aInitial, a) + } + + pos := a + for i, c := range bucketStarts { + bucketStarts[i] = pos + pos += c + bucketEnds[i] = pos + if bucketStarts[i] == a && bucketEnds[i] == b { + // everything was in the same bucket + sortRange(task{offset + 1, a, b}) + return + } + } + + i := a + for curBucket, bucketEnd := range bucketEnds { + start := i + i = bucketStarts[curBucket] + for i < bucketEnd { + destBucket := data.Key(i)[offset] + if destBucket == byte(curBucket) { + i++ + bucketStarts[destBucket]++ + continue + } + data.Swap(i, bucketStarts[destBucket]) + bucketStarts[destBucket]++ + } + if i > start+1 { + sortRange(task{offset + 1, start, i}) + } + } +} + +// qSortEqualKeyRange qSorts data[a:b] if it is not already sorted +func qSortEqualKeyRange(data sort.Interface, a, b int) { + for i := a; i < b-1; i++ { + if data.Less(i+1, i) { + qSort(data, a, b) + return + } + } + return +} diff --git a/vendor/github.com/uber-go/tally/.gitignore b/vendor/github.com/uber-go/tally/.gitignore new file mode 100644 index 00000000..897c298d --- /dev/null +++ b/vendor/github.com/uber-go/tally/.gitignore @@ -0,0 +1,33 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test +vendor +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 +*.pprof +*.out +*.log + +.DS_Store +node_modules/ +.idea/ diff --git a/vendor/github.com/uber-go/tally/.travis.yml b/vendor/github.com/uber-go/tally/.travis.yml new file mode 100644 index 00000000..e012c690 --- /dev/null +++ b/vendor/github.com/uber-go/tally/.travis.yml @@ -0,0 +1,23 @@ +language: go +sudo: false +go: + - 1.5 + - 1.6 + - 1.7 + - 1.8 + - tip +env: + global: + - GO15VENDOREXPERIMENT=1 +cache: + directories: + - vendor +install: + - npm i uber-licence + - make dependencies +script: + - make test + - make lint +after_success: + - make coveralls + diff --git a/vendor/github.com/uber-go/tally/LICENSE b/vendor/github.com/uber-go/tally/LICENSE new file mode 100644 index 00000000..a8fc8514 --- /dev/null +++ b/vendor/github.com/uber-go/tally/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 + +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/uber-go/tally/Makefile b/vendor/github.com/uber-go/tally/Makefile new file mode 100644 index 00000000..6b268caf --- /dev/null +++ b/vendor/github.com/uber-go/tally/Makefile @@ -0,0 +1,61 @@ +export GO15VENDOREXPERIMENT=1 + +BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem +PKGS ?= $(shell glide novendor) +PKG_FILES ?= *.go example/*.go m3 +LINT_IGNORE = m3/thrift\|thirdparty +LICENSE_IGNORE = thirdparty + +.PHONY: all +all: lint test + +.PHONY: dependencies +dependencies: + @echo "Installing Glide and locked dependencies..." + glide --version || go get -u -f github.com/Masterminds/glide + glide install + @echo "Installing test dependencies..." + go install ./vendor/github.com/axw/gocov/gocov + go install ./vendor/github.com/mattn/goveralls + @echo "Installing golint..." + go install ./vendor/github.com/golang/lint/golint + +.PHONY: lint +lint: + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(PKG_FILES) 2>&1 | grep -v '$(LINT_IGNORE)' | tee lint.log + @echo "Installing test dependencies for vet..." + @go test -i $(PKGS) + @echo "Checking lint..." + @$(foreach dir,$(PKGS),golint $(dir) 2>&1 | grep -v '$(LINT_IGNORE)' | tee -a lint.log;) + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e vendor -e Makefile | grep -v '$(LINT_IGNORE)' | tee -a lint.log + @echo "Checking for license headers..." + @./check_license.sh | grep -v '$(LICENSE_IGNORE)' | tee -a lint.log + @[ ! -s lint.log ] + +.PHONY: test +test: + go test -race -v $(PKGS) + +.PHONY: examples +examples: + mkdir -p ./bin + go build -o ./bin/print_example ./example/ + go build -o ./bin/m3_example ./m3/example/ + go build -o ./bin/prometheus_example ./prometheus/example/ + go build -o ./bin/statsd_example ./statsd/example/ + +.PHONY: cover +cover: + go test -cover -coverprofile cover.out -race -v $(PKGS) + +.PHONY: coveralls +coveralls: + goveralls -service=travis-ci || echo "Coveralls failed" + +.PHONY: bench +BENCH ?= . +bench: + @$(foreach pkg,$(PKGS),go test -bench=$(BENCH) -run="^$$" $(BENCH_FLAGS) $(pkg);) diff --git a/vendor/github.com/uber-go/tally/README.md b/vendor/github.com/uber-go/tally/README.md new file mode 100644 index 00000000..d36254fe --- /dev/null +++ b/vendor/github.com/uber-go/tally/README.md @@ -0,0 +1,212 @@ +# :heavy_check_mark: tally [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +Fast, buffered, hierarchical stats collection in Go. + +## Installation +`go get -u github.com/uber-go/tally` + +## Abstract + +Tally provides a common interface for emitting metrics, while letting you not worry about the velocity of metrics emission. + +By default it buffers counters, gauges and histograms at a specified interval but does not buffer timer values. This is primarily so timer values can have all their values sampled if desired and if not they can be sampled as summaries or histograms independently by a reporter. + +## Structure + +- Scope: Keeps track of metrics, and their common metadata. +- Metrics: Counters, Gauges, Timers and Histograms. +- Reporter: Implemented by you. Accepts aggregated values from the scope. Forwards the aggregated values to your metrics ingestion pipeline. + - The reporters already available listed alphabetically are: + - `github.com/uber-go/tally/m3`: Report m3 metrics, timers are not sampled and forwarded directly. + - `github.com/uber-go/tally/multi`: Report to multiple reporters, you can multi-write metrics to other reporters simply. + - `github.com/uber-go/tally/prometheus`: Report prometheus metrics, timers by default are made summaries with an option to make them histograms instead. + - `github.com/uber-go/tally/statsd`: Report statsd metrics, no support for tags. + +### Basics + + - Scopes created with tally provide race-safe registration and use of all metric types `Counter`, `Gauge`, `Timer`, `Histogram`. + - `NewRootScope(...)` returns a `Scope` and `io.Closer`, the second return value is used to stop the scope's goroutine reporting values from the scope to it's reporter. This is to reduce the footprint of `Scope` from the public API for those implementing it themselves to use in Go packages that take a tally `Scope`. + +### Acquire a Scope ### +```go +reporter = NewMyStatsReporter() // Implement as you will +tags := map[string]string{ + "dc": "east-1", + "type": "master", +} +reportEvery := time.Second + +scope := tally.NewRootScope(tally.ScopeOptions{ + Tags: tags, + Reporter: reporter, +}, reportEvery) +``` + +### Get/Create a metric, use it ### +```go +// Get a counter, increment a counter +reqCounter := scope.Counter("requests") // cache me +reqCounter.Inc(1) + +queueGauge := scope.Gauge("queue_length") // cache me +queueGauge.Update(42) +``` + +### Report your metrics ### +Use the inbuilt statsd reporter: + +```go +import ( + "io" + "github.com/cactus/go-statsd-client/statsd" + "github.com/uber-go/tally" + tallystatsd "github.com/uber-go/tally/statsd" + // ... +) + +func newScope() (tally.Scope, io.Closer) { + statter, _ := statsd.NewBufferedClient("127.0.0.1:8125", + "stats", 100*time.Millisecond, 1440) + + reporter := tallystatsd.NewReporter(statter, tallystatsd.Options{ + SampleRate: 1.0, + }) + + scope, closer := tally.NewRootScope(tally.ScopeOptions{ + Prefix: "my-service", + Tags: map[string]string{}, + Reporter: r, + }, time.Second) + + return scope, closer +} +``` + +Implement your own reporter using the `StatsReporter` interface: + +```go + +// BaseStatsReporter implements the shared reporter methods. +type BaseStatsReporter interface { + Capabilities() Capabilities + Flush() +} + +// StatsReporter is a backend for Scopes to report metrics to. +type StatsReporter interface { + BaseStatsReporter + + // ReportCounter reports a counter value + ReportCounter( + name string, + tags map[string]string, + value int64, + ) + + // ReportGauge reports a gauge value + ReportGauge( + name string, + tags map[string]string, + value float64, + ) + + // ReportTimer reports a timer value + ReportTimer( + name string, + tags map[string]string, + interval time.Duration, + ) + + // ReportHistogramValueSamples reports histogram samples for a bucket + ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound float64, + samples int64, + ) + + // ReportHistogramDurationSamples reports histogram samples for a bucket + ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound time.Duration, + samples int64, + ) +} +``` + +Or implement your own metrics implementation that matches the tally `Scope` interface to use different buffering semantics: + +```go +type Scope interface { + // Counter returns the Counter object corresponding to the name. + Counter(name string) Counter + + // Gauge returns the Gauge object corresponding to the name. + Gauge(name string) Gauge + + // Timer returns the Timer object corresponding to the name. + Timer(name string) Timer + + // Histogram returns the Histogram object corresponding to the name. + // To use default value and duration buckets configured for the scope + // simply pass tally.DefaultBuckets or nil. + // You can use tally.ValueBuckets{x, y, ...} for value buckets. + // You can use tally.DurationBuckets{x, y, ...} for duration buckets. + // You can use tally.MustMakeLinearValueBuckets(start, width, count) for linear values. + // You can use tally.MustMakeLinearDurationBuckets(start, width, count) for linear durations. + // You can use tally.MustMakeExponentialValueBuckets(start, factor, count) for exponential values. + // You can use tally.MustMakeExponentialDurationBuckets(start, factor, count) for exponential durations. + Histogram(name string, buckets Buckets) Histogram + + // Tagged returns a new child scope with the given tags and current tags. + Tagged(tags map[string]string) Scope + + // SubScope returns a new child scope appending a further name prefix. + SubScope(name string) Scope + + // Capabilities returns a description of metrics reporting capabilities. + Capabilities() Capabilities +} + +// Capabilities is a description of metrics reporting capabilities. +type Capabilities interface { + // Reporting returns whether the reporter has the ability to actively report. + Reporting() bool + + // Tagging returns whether the reporter has the capability for tagged metrics. + Tagging() bool +} +``` + +## Performance + +This stuff needs to be fast. With that in mind, we avoid locks and unnecessary memory allocations. + +``` +BenchmarkCounterInc-8 200000000 7.68 ns/op +BenchmarkReportCounterNoData-8 300000000 4.88 ns/op +BenchmarkReportCounterWithData-8 100000000 21.6 ns/op +BenchmarkGaugeSet-8 100000000 16.0 ns/op +BenchmarkReportGaugeNoData-8 100000000 10.4 ns/op +BenchmarkReportGaugeWithData-8 50000000 27.6 ns/op +BenchmarkTimerInterval-8 50000000 37.7 ns/op +BenchmarkTimerReport-8 300000000 5.69 ns/op +``` + +
+ +Released under the [MIT License](LICENSE). + +[doc-img]: https://godoc.org/github.com/uber-go/tally?status.svg +[doc]: https://godoc.org/github.com/uber-go/tally +[ci-img]: https://travis-ci.org/uber-go/tally.svg?branch=master +[ci]: https://travis-ci.org/uber-go/tally +[cov-img]: https://coveralls.io/repos/github/uber-go/tally/badge.svg?branch=master +[cov]: https://coveralls.io/github/uber-go/tally?branch=master +[glide.lock]: https://github.com/uber-go/tally/blob/master/glide.lock +[v1]: https://github.com/uber-go/tally/milestones diff --git a/vendor/github.com/uber-go/tally/check_license.sh b/vendor/github.com/uber-go/tally/check_license.sh new file mode 100644 index 00000000..f3b66823 --- /dev/null +++ b/vendor/github.com/uber-go/tally/check_license.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +./node_modules/.bin/uber-licence --version || npm i uber-licence@latest +./node_modules/.bin/uber-licence --dry --file "*.go" diff --git a/vendor/github.com/uber-go/tally/glide.lock b/vendor/github.com/uber-go/tally/glide.lock new file mode 100644 index 00000000..bb90fb08 --- /dev/null +++ b/vendor/github.com/uber-go/tally/glide.lock @@ -0,0 +1,74 @@ +hash: 6c5a37d4f995175d7ab310d09b5866057c683536b0ae3d8f478f87943aa03be4 +updated: 2019-11-07T15:02:21.080076-05:00 +imports: +- name: github.com/beorn7/perks + version: 3a771d992973f24aa725d07868b467d1ddfceafb + subpackages: + - quantile +- name: github.com/cactus/go-statsd-client + version: 138b925ccdf617776955904ba7759fce64406cec + subpackages: + - statsd +- name: github.com/golang/protobuf + version: 14aad3d5ea4c323bcd7a2137e735da24a76e814c + subpackages: + - proto +- name: github.com/m3db/prometheus_client_golang + version: 8ae269d24972b8695572fa6b2e3718b5ea82d6b4 + subpackages: + - prometheus + - prometheus/promhttp +- name: github.com/m3db/prometheus_client_model + version: d3fff8420252ef63bffb96f689d1a85096c97321 + subpackages: + - go +- name: github.com/m3db/prometheus_common + version: d550673fc477123acb69017380567e8fafc765fc + subpackages: + - expfmt + - internal/bitbucket.org/ww/goautoneg + - model +- name: github.com/m3db/prometheus_procfs + version: 1878d9fbb537119d24b21ca07effd591627cd160 +- name: github.com/matttproud/golang_protobuf_extensions + version: c12348ce28de40eed0136aa2b644d0ee0650e56c + subpackages: + - pbutil +- name: github.com/pkg/errors + version: ba968bfe8b2f7e042a574c888954fccecfa385b4 +- name: go.uber.org/atomic + version: 9dc4df04d0d1c39369750a9f6c32c39560672089 +- name: gopkg.in/validator.v2 + version: 135c24b11c19e52befcae2ec3fca5d9b78c4e98e +- name: gopkg.in/yaml.v2 + version: 5420a8b6744d3b0345ab293f6fcba19c978f1183 +testImports: +- name: github.com/axw/gocov + version: 54b98cfcac0c63fb3f9bd8e7ad241b724d4e985b + subpackages: + - gocov +- name: github.com/davecgh/go-spew + version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d + subpackages: + - spew +- name: github.com/golang/lint + version: c7bacac2b21ca01afa1dee0acf64df3ce047c28f + subpackages: + - golint +- name: github.com/mattn/goveralls + version: f4d273b02ce1b4e48acf3662b717aa987bfc4118 +- name: github.com/pborman/uuid + version: c55201b036063326c5b1b89ccfe45a184973d073 +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/stretchr/testify + version: d77da356e56a7428ad25149ca77381849a6a5232 + subpackages: + - assert + - require +- name: golang.org/x/tools + version: 3fe2afc9e626f32e91aff6eddb78b14743446865 + subpackages: + - cover diff --git a/vendor/github.com/uber-go/tally/glide.yaml b/vendor/github.com/uber-go/tally/glide.yaml new file mode 100644 index 00000000..8dd97e92 --- /dev/null +++ b/vendor/github.com/uber-go/tally/glide.yaml @@ -0,0 +1,44 @@ +package: github.com/uber-go/tally +import: +- package: github.com/cactus/go-statsd-client + version: ~3.1.0 + subpackages: + - statsd +- package: github.com/m3db/prometheus_client_golang + version: ^0.8.1 + subpackages: + - prometheus +- package: github.com/m3db/prometheus_client_model + version: ^0.1.0 +- package: github.com/m3db/prometheus_common + version: ^0.1.0 +- package: github.com/m3db/prometheus_procfs + version: ^0.8.1 +- package: go.uber.org/atomic + version: ^1 +- package: github.com/pkg/errors + version: ^0.8.1 +testImport: +- package: github.com/axw/gocov + version: 54b98cfcac0c63fb3f9bd8e7ad241b724d4e985b + subpackages: + - gocov +- package: github.com/mattn/goveralls + version: f4d273b02ce1b4e48acf3662b717aa987bfc4118 +- package: golang.org/x/tools + version: 3fe2afc9e626f32e91aff6eddb78b14743446865 + subpackages: + - cover +- package: github.com/golang/lint + version: c7bacac2b21ca01afa1dee0acf64df3ce047c28f + subpackages: + - golint +- package: github.com/pborman/uuid + version: c55201b036063326c5b1b89ccfe45a184973d073 +- package: github.com/stretchr/testify + version: d77da356e56a7428ad25149ca77381849a6a5232 + subpackages: + - assert + - require +- package: gopkg.in/validator.v2 +- package: gopkg.in/yaml.v2 diff --git a/vendor/github.com/uber-go/tally/histogram.go b/vendor/github.com/uber-go/tally/histogram.go new file mode 100644 index 00000000..96198b91 --- /dev/null +++ b/vendor/github.com/uber-go/tally/histogram.go @@ -0,0 +1,318 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "errors" + "fmt" + "math" + "sort" + "time" +) + +var ( + // DefaultBuckets can be passed to specify to default buckets. + DefaultBuckets Buckets + + errBucketsCountNeedsGreaterThanZero = errors.New("n needs to be > 0") + errBucketsStartNeedsGreaterThanZero = errors.New("start needs to be > 0") + errBucketsFactorNeedsGreaterThanOne = errors.New("factor needs to be > 1") +) + +// ValueBuckets is a set of float64 values that implements Buckets. +type ValueBuckets []float64 + +// Implements sort.Interface +func (v ValueBuckets) Len() int { + return len(v) +} + +// Implements sort.Interface +func (v ValueBuckets) Swap(i, j int) { + v[i], v[j] = v[j], v[i] +} + +// Implements sort.Interface +func (v ValueBuckets) Less(i, j int) bool { + return v[i] < v[j] +} + +func (v ValueBuckets) String() string { + values := make([]string, len(v)) + for i := range values { + values[i] = fmt.Sprintf("%f", v[i]) + } + return fmt.Sprint(values) +} + +// AsValues implements Buckets. +func (v ValueBuckets) AsValues() []float64 { + return []float64(v) +} + +// AsDurations implements Buckets and returns time.Duration +// representations of the float64 values divided by time.Second. +func (v ValueBuckets) AsDurations() []time.Duration { + values := make([]time.Duration, len(v)) + for i := range values { + values[i] = time.Duration(v[i] * float64(time.Second)) + } + return values +} + +// DurationBuckets is a set of time.Duration values that implements Buckets. +type DurationBuckets []time.Duration + +// Implements sort.Interface +func (v DurationBuckets) Len() int { + return len(v) +} + +// Implements sort.Interface +func (v DurationBuckets) Swap(i, j int) { + v[i], v[j] = v[j], v[i] +} + +// Implements sort.Interface +func (v DurationBuckets) Less(i, j int) bool { + return v[i] < v[j] +} + +func (v DurationBuckets) String() string { + values := make([]string, len(v)) + for i := range values { + values[i] = v[i].String() + } + return fmt.Sprintf("%v", values) +} + +// AsValues implements Buckets and returns float64 +// representations of the time.Duration values divided by time.Second. +func (v DurationBuckets) AsValues() []float64 { + values := make([]float64, len(v)) + for i := range values { + values[i] = float64(v[i]) / float64(time.Second) + } + return values +} + +// AsDurations implements Buckets. +func (v DurationBuckets) AsDurations() []time.Duration { + return []time.Duration(v) +} + +// BucketPairs creates a set of bucket pairs from a set +// of buckets describing the lower and upper bounds for +// each derived bucket. +func BucketPairs(buckets Buckets) []BucketPair { + if buckets == nil || buckets.Len() < 1 { + return []BucketPair{ + + bucketPair{ + lowerBoundValue: -math.MaxFloat64, + upperBoundValue: math.MaxFloat64, + lowerBoundDuration: time.Duration(math.MinInt64), + upperBoundDuration: time.Duration(math.MaxInt64), + }, + } + } + + var ( + asValueBuckets = copyAndSortValues(buckets.AsValues()) + asDurationBuckets = copyAndSortDurations(buckets.AsDurations()) + pairs = make([]BucketPair, 0, buckets.Len()+2) + ) + + pairs = append(pairs, bucketPair{ + lowerBoundValue: -math.MaxFloat64, + upperBoundValue: asValueBuckets[0], + lowerBoundDuration: time.Duration(math.MinInt64), + upperBoundDuration: asDurationBuckets[0], + }) + + prevValueBucket, prevDurationBucket := + asValueBuckets[0], asDurationBuckets[0] + + for i := 1; i < buckets.Len(); i++ { + pairs = append(pairs, bucketPair{ + lowerBoundValue: prevValueBucket, + upperBoundValue: asValueBuckets[i], + lowerBoundDuration: prevDurationBucket, + upperBoundDuration: asDurationBuckets[i], + }) + prevValueBucket, prevDurationBucket = + asValueBuckets[i], asDurationBuckets[i] + } + + pairs = append(pairs, bucketPair{ + lowerBoundValue: prevValueBucket, + upperBoundValue: math.MaxFloat64, + lowerBoundDuration: prevDurationBucket, + upperBoundDuration: time.Duration(math.MaxInt64), + }) + + return pairs +} + +func copyAndSortValues(values []float64) []float64 { + valuesCopy := make([]float64, len(values)) + for i := range values { + valuesCopy[i] = values[i] + } + sort.Sort(ValueBuckets(valuesCopy)) + return valuesCopy +} + +func copyAndSortDurations(durations []time.Duration) []time.Duration { + durationsCopy := make([]time.Duration, len(durations)) + for i := range durations { + durationsCopy[i] = durations[i] + } + sort.Sort(DurationBuckets(durationsCopy)) + return durationsCopy +} + +type bucketPair struct { + lowerBoundValue float64 + upperBoundValue float64 + lowerBoundDuration time.Duration + upperBoundDuration time.Duration +} + +func (p bucketPair) LowerBoundValue() float64 { + return p.lowerBoundValue +} + +func (p bucketPair) UpperBoundValue() float64 { + return p.upperBoundValue +} + +func (p bucketPair) LowerBoundDuration() time.Duration { + return p.lowerBoundDuration +} + +func (p bucketPair) UpperBoundDuration() time.Duration { + return p.upperBoundDuration +} + +// LinearValueBuckets creates a set of linear value buckets. +func LinearValueBuckets(start, width float64, n int) (ValueBuckets, error) { + if n <= 0 { + return nil, errBucketsCountNeedsGreaterThanZero + } + buckets := make([]float64, n) + for i := range buckets { + buckets[i] = start + (float64(i) * width) + } + return ValueBuckets(buckets), nil +} + +// MustMakeLinearValueBuckets creates a set of linear value buckets +// or panics. +func MustMakeLinearValueBuckets(start, width float64, n int) ValueBuckets { + buckets, err := LinearValueBuckets(start, width, n) + if err != nil { + panic(err) + } + return buckets +} + +// LinearDurationBuckets creates a set of linear duration buckets. +func LinearDurationBuckets(start, width time.Duration, n int) (DurationBuckets, error) { + if n <= 0 { + return nil, errBucketsCountNeedsGreaterThanZero + } + buckets := make([]time.Duration, n) + for i := range buckets { + buckets[i] = start + (time.Duration(i) * width) + } + return DurationBuckets(buckets), nil +} + +// MustMakeLinearDurationBuckets creates a set of linear duration buckets. +// or panics. +func MustMakeLinearDurationBuckets(start, width time.Duration, n int) DurationBuckets { + buckets, err := LinearDurationBuckets(start, width, n) + if err != nil { + panic(err) + } + return buckets +} + +// ExponentialValueBuckets creates a set of exponential value buckets. +func ExponentialValueBuckets(start, factor float64, n int) (ValueBuckets, error) { + if n <= 0 { + return nil, errBucketsCountNeedsGreaterThanZero + } + if start <= 0 { + return nil, errBucketsStartNeedsGreaterThanZero + } + if factor <= 1 { + return nil, errBucketsFactorNeedsGreaterThanOne + } + buckets := make([]float64, n) + curr := start + for i := range buckets { + buckets[i] = curr + curr *= factor + } + return ValueBuckets(buckets), nil +} + +// MustMakeExponentialValueBuckets creates a set of exponential value buckets +// or panics. +func MustMakeExponentialValueBuckets(start, factor float64, n int) ValueBuckets { + buckets, err := ExponentialValueBuckets(start, factor, n) + if err != nil { + panic(err) + } + return buckets +} + +// ExponentialDurationBuckets creates a set of exponential duration buckets. +func ExponentialDurationBuckets(start time.Duration, factor float64, n int) (DurationBuckets, error) { + if n <= 0 { + return nil, errBucketsCountNeedsGreaterThanZero + } + if start <= 0 { + return nil, errBucketsStartNeedsGreaterThanZero + } + if factor <= 1 { + return nil, errBucketsFactorNeedsGreaterThanOne + } + buckets := make([]time.Duration, n) + curr := start + for i := range buckets { + buckets[i] = curr + curr = time.Duration(float64(curr) * factor) + } + return DurationBuckets(buckets), nil +} + +// MustMakeExponentialDurationBuckets creates a set of exponential value buckets +// or panics. +func MustMakeExponentialDurationBuckets(start time.Duration, factor float64, n int) DurationBuckets { + buckets, err := ExponentialDurationBuckets(start, factor, n) + if err != nil { + panic(err) + } + return buckets +} diff --git a/vendor/github.com/uber-go/tally/key_gen.go b/vendor/github.com/uber-go/tally/key_gen.go new file mode 100644 index 00000000..de586e22 --- /dev/null +++ b/vendor/github.com/uber-go/tally/key_gen.go @@ -0,0 +1,111 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "bytes" + "sort" +) + +const ( + prefixSplitter = '+' + keyPairSplitter = ',' + keyNameSplitter = '=' +) + +var ( + keyGenPool = newKeyGenerationPool(1024, 1024, 32) + nilString = "" +) + +type keyGenerationPool struct { + bufferPool *ObjectPool + stringsPool *ObjectPool +} + +// KeyForStringMap generates a unique key for a map string set combination. +func KeyForStringMap( + stringMap map[string]string, +) string { + return KeyForPrefixedStringMap(nilString, stringMap) +} + +// KeyForPrefixedStringMap generates a unique key for a +// a prefix and a map string set combination. +func KeyForPrefixedStringMap( + prefix string, + stringMap map[string]string, +) string { + keys := keyGenPool.stringsPool.Get().([]string) + for k := range stringMap { + keys = append(keys, k) + } + + sort.Strings(keys) + + buf := keyGenPool.bufferPool.Get().(*bytes.Buffer) + + if prefix != nilString { + buf.WriteString(prefix) + buf.WriteByte(prefixSplitter) + } + + sortedKeysLen := len(stringMap) + for i := 0; i < sortedKeysLen; i++ { + buf.WriteString(keys[i]) + buf.WriteByte(keyNameSplitter) + buf.WriteString(stringMap[keys[i]]) + if i != sortedKeysLen-1 { + buf.WriteByte(keyPairSplitter) + } + } + + key := buf.String() + keyGenPool.release(buf, keys) + return key +} + +func newKeyGenerationPool(size, blen, slen int) *keyGenerationPool { + b := NewObjectPool(size) + b.Init(func() interface{} { + return bytes.NewBuffer(make([]byte, 0, blen)) + }) + + s := NewObjectPool(size) + s.Init(func() interface{} { + return make([]string, 0, slen) + }) + + return &keyGenerationPool{ + bufferPool: b, + stringsPool: s, + } +} + +func (s *keyGenerationPool) release(b *bytes.Buffer, strs []string) { + b.Reset() + s.bufferPool.Put(b) + + for i := range strs { + strs[i] = nilString + } + s.stringsPool.Put(strs[:0]) +} diff --git a/vendor/github.com/uber-go/tally/m3/config.go b/vendor/github.com/uber-go/tally/m3/config.go new file mode 100644 index 00000000..b7a617b4 --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/config.go @@ -0,0 +1,65 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3 + +// Configuration is a configuration for a M3 reporter. +type Configuration struct { + // HostPort is the host and port of the M3 server. + HostPort string `yaml:"hostPort" validate:"nonzero"` + + // HostPorts are the host and port of the M3 server. + HostPorts []string `yaml:"hostPorts"` + + // Service is the service tag to that this client emits. + Service string `yaml:"service" validate:"nonzero"` + + // Env is the env tag to use that this client emits. + Env string `yaml:"env" validate:"nonzero"` + + // CommonTags are tags that are common for all metrics this client emits. + CommonTags map[string]string `yaml:"tags" ` + + // Queue is the maximum metric queue size of client. + Queue int `yaml:"queue"` + + // PacketSize is the maximum packet size for a batch of metrics. + PacketSize int32 `yaml:"packetSize"` + + // IncludeHost is whether or not to include host tag. + IncludeHost bool `yaml:"includeHost"` +} + +// NewReporter creates a new M3 reporter from this configuration. +func (c Configuration) NewReporter() (Reporter, error) { + hostPorts := c.HostPorts + if len(hostPorts) == 0 { + hostPorts = []string{c.HostPort} + } + return NewReporter(Options{ + HostPorts: hostPorts, + Service: c.Service, + Env: c.Env, + CommonTags: c.CommonTags, + MaxQueueSize: c.Queue, + MaxPacketSizeBytes: c.PacketSize, + IncludeHost: c.IncludeHost, + }) +} diff --git a/vendor/github.com/uber-go/tally/m3/customtransports/buffered_read_transport.go b/vendor/github.com/uber-go/tally/m3/customtransports/buffered_read_transport.go new file mode 100644 index 00000000..fe0e5b41 --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/customtransports/buffered_read_transport.go @@ -0,0 +1,79 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package customtransport + +import ( + "bytes" + + "github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift" +) + +// TBufferedReadTransport is a thrift.TTransport that reads from a buffer +type TBufferedReadTransport struct { + readBuf *bytes.Buffer +} + +// NewTBufferedReadTransport creates a buffer backed TTransport +func NewTBufferedReadTransport(readBuf *bytes.Buffer) (*TBufferedReadTransport, error) { + return &TBufferedReadTransport{readBuf: readBuf}, nil +} + +// IsOpen does nothing as transport is not maintaining the connection +// Required to maintain thrift.TTransport interface +func (p *TBufferedReadTransport) IsOpen() bool { + return true +} + +// Open does nothing as transport is not maintaining the connection +// Required to maintain thrift.TTransport interface +func (p *TBufferedReadTransport) Open() error { + return nil +} + +// Close does nothing as transport is not maintaining the connection +// Required to maintain thrift.TTransport interface +func (p *TBufferedReadTransport) Close() error { + return nil +} + +// Read reads bytes from the local buffer and puts them in the specified buf +func (p *TBufferedReadTransport) Read(buf []byte) (int, error) { + in, err := p.readBuf.Read(buf) + return in, thrift.NewTTransportExceptionFromError(err) +} + +// RemainingBytes returns the number of bytes left to be read from the readBuf +func (p *TBufferedReadTransport) RemainingBytes() uint64 { + return uint64(p.readBuf.Len()) +} + +// Write writes bytes into the read buffer +// Required to maintain thrift.TTransport interface +func (p *TBufferedReadTransport) Write(buf []byte) (int, error) { + p.readBuf = bytes.NewBuffer(buf) + return len(buf), nil +} + +// Flush does nothing as udp server does not write responses back +// Required to maintain thrift.TTransport interface +func (p *TBufferedReadTransport) Flush() error { + return nil +} diff --git a/vendor/github.com/uber-go/tally/m3/customtransports/m3_calc_transport.go b/vendor/github.com/uber-go/tally/m3/customtransports/m3_calc_transport.go new file mode 100644 index 00000000..0c3d42ab --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/customtransports/m3_calc_transport.go @@ -0,0 +1,86 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package customtransport + +import ( + "sync/atomic" +) + +// TCalcTransport is a thrift TTransport that is used to calculate how many +// bytes are used when writing a thrift element. It is thread-safe +type TCalcTransport struct { + count int32 +} + +// GetCount returns the number of bytes that would be written +// Required to maintain thrift.TTransport interface +func (p *TCalcTransport) GetCount() int32 { + return atomic.LoadInt32(&p.count) +} + +// ResetCount resets the number of bytes written to 0 +func (p *TCalcTransport) ResetCount() { + atomic.StoreInt32(&p.count, 0) +} + +// Write adds the number of bytes written to the count +// Required to maintain thrift.TTransport interface +func (p *TCalcTransport) Write(buf []byte) (int, error) { + atomic.AddInt32(&p.count, int32(len(buf))) + return len(buf), nil +} + +// IsOpen does nothing as transport is not maintaining a connection +// Required to maintain thrift.TTransport interface +func (p *TCalcTransport) IsOpen() bool { + return true +} + +// Open does nothing as transport is not maintaining a connection +// Required to maintain thrift.TTransport interface +func (p *TCalcTransport) Open() error { + return nil +} + +// Close does nothing as transport is not maintaining a connection +// Required to maintain thrift.TTransport interface +func (p *TCalcTransport) Close() error { + return nil +} + +// Read does nothing as it's not required for calculations +// Required to maintain thrift.TTransport interface +func (p *TCalcTransport) Read(buf []byte) (int, error) { + return 0, nil +} + +// RemainingBytes returns the max number of bytes (same as Thrift's StreamTransport) as we +// do not know how many bytes we have left. +func (p *TCalcTransport) RemainingBytes() uint64 { + const maxSize = ^uint64(0) + return maxSize +} + +// Flush does nothing as it's not required for calculations +// Required to maintain thrift.TTransport interface +func (p *TCalcTransport) Flush() error { + return nil +} diff --git a/vendor/github.com/uber-go/tally/m3/reporter.go b/vendor/github.com/uber-go/tally/m3/reporter.go new file mode 100644 index 00000000..8412675e --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/reporter.go @@ -0,0 +1,624 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3 + +import ( + "errors" + "fmt" + "io" + "math" + "os" + "strconv" + "sync" + "time" + + "github.com/uber-go/tally" + customtransport "github.com/uber-go/tally/m3/customtransports" + m3thrift "github.com/uber-go/tally/m3/thrift" + "github.com/uber-go/tally/m3/thriftudp" + "github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift" +) + +// Protocol describes a M3 thrift transport protocol. +type Protocol int + +// Compact and Binary represent the compact and +// binary thrift protocols respectively. +const ( + Compact Protocol = iota + Binary +) + +const ( + // ServiceTag is the name of the M3 service tag. + ServiceTag = "service" + // EnvTag is the name of the M3 env tag. + EnvTag = "env" + // HostTag is the name of the M3 host tag. + HostTag = "host" + // DefaultMaxQueueSize is the default M3 reporter queue size. + DefaultMaxQueueSize = 4096 + // DefaultMaxPacketSize is the default M3 reporter max packet size. + DefaultMaxPacketSize = int32(1440) + // DefaultHistogramBucketIDName is the default histogram bucket ID tag name + DefaultHistogramBucketIDName = "bucketid" + // DefaultHistogramBucketName is the default histogram bucket name tag name + DefaultHistogramBucketName = "bucket" + // DefaultHistogramBucketTagPrecision is the default + // precision to use when formatting the metric tag + // with the histogram bucket bound values. + DefaultHistogramBucketTagPrecision = uint(6) + + emitMetricBatchOverhead = 19 + minMetricBucketIDTagLength = 4 +) + +// Initialize max vars in init function to avoid lint error. +var ( + maxInt64 int64 + maxFloat64 float64 +) + +func init() { + maxInt64 = math.MaxInt64 + maxFloat64 = math.MaxFloat64 +} + +type metricType int + +const ( + counterType metricType = iota + 1 + timerType + gaugeType +) + +var ( + errNoHostPorts = errors.New("at least one entry for HostPorts is required") + errCommonTagSize = errors.New("common tags serialized size exceeds packet size") + errAlreadyClosed = errors.New("reporter already closed") +) + +// Reporter is an M3 reporter. +type Reporter interface { + tally.CachedStatsReporter + io.Closer +} + +// reporter is a metrics backend that reports metrics to a local or +// remote M3 collector, metrics are batched together and emitted +// via either thrift compact or binary protocol in batch UDP packets. +type reporter struct { + client *m3thrift.M3Client + curBatch *m3thrift.MetricBatch + curBatchLock sync.Mutex + calc *customtransport.TCalcTransport + calcProto thrift.TProtocol + calcLock sync.Mutex + commonTags map[*m3thrift.MetricTag]bool + freeBytes int32 + processors sync.WaitGroup + resourcePool *resourcePool + bucketIDTagName string + bucketTagName string + bucketValFmt string + + status reporterStatus + metCh chan sizedMetric +} + +type reporterStatus struct { + sync.RWMutex + closed bool +} + +// Options is a set of options for the M3 reporter. +type Options struct { + HostPorts []string + Service string + Env string + CommonTags map[string]string + IncludeHost bool + Protocol Protocol + MaxQueueSize int + MaxPacketSizeBytes int32 + HistogramBucketIDName string + HistogramBucketName string + HistogramBucketTagPrecision uint +} + +// NewReporter creates a new M3 reporter. +func NewReporter(opts Options) (Reporter, error) { + if opts.MaxQueueSize <= 0 { + opts.MaxQueueSize = DefaultMaxQueueSize + } + if opts.MaxPacketSizeBytes <= 0 { + opts.MaxPacketSizeBytes = DefaultMaxPacketSize + } + if opts.HistogramBucketIDName == "" { + opts.HistogramBucketIDName = DefaultHistogramBucketIDName + } + if opts.HistogramBucketName == "" { + opts.HistogramBucketName = DefaultHistogramBucketName + } + if opts.HistogramBucketTagPrecision == 0 { + opts.HistogramBucketTagPrecision = DefaultHistogramBucketTagPrecision + } + + // Create M3 thrift client + var trans thrift.TTransport + var err error + if len(opts.HostPorts) == 0 { + err = errNoHostPorts + } else if len(opts.HostPorts) == 1 { + trans, err = thriftudp.NewTUDPClientTransport(opts.HostPorts[0], "") + } else { + trans, err = thriftudp.NewTMultiUDPClientTransport(opts.HostPorts, "") + } + if err != nil { + return nil, err + } + + var protocolFactory thrift.TProtocolFactory + if opts.Protocol == Compact { + protocolFactory = thrift.NewTCompactProtocolFactory() + } else { + protocolFactory = thrift.NewTBinaryProtocolFactoryDefault() + } + + client := m3thrift.NewM3ClientFactory(trans, protocolFactory) + resourcePool := newResourcePool(protocolFactory) + + // Create common tags + tags := resourcePool.getTagList() + for k, v := range opts.CommonTags { + tags[createTag(resourcePool, k, v)] = true + } + if opts.CommonTags[ServiceTag] == "" { + if opts.Service == "" { + return nil, fmt.Errorf("%s common tag is required", ServiceTag) + } + tags[createTag(resourcePool, ServiceTag, opts.Service)] = true + } + if opts.CommonTags[EnvTag] == "" { + if opts.Env == "" { + return nil, fmt.Errorf("%s common tag is required", EnvTag) + } + tags[createTag(resourcePool, EnvTag, opts.Env)] = true + } + if opts.IncludeHost { + if opts.CommonTags[HostTag] == "" { + hostname, err := os.Hostname() + if err != nil { + return nil, fmt.Errorf("error resolving host tag: %v", err) + } + tags[createTag(resourcePool, HostTag, hostname)] = true + } + } + + // Calculate size of common tags + batch := resourcePool.getBatch() + batch.CommonTags = tags + batch.Metrics = []*m3thrift.Metric{} + proto := resourcePool.getProto() + batch.Write(proto) + calc := proto.Transport().(*customtransport.TCalcTransport) + numOverheadBytes := emitMetricBatchOverhead + calc.GetCount() + calc.ResetCount() + + freeBytes := opts.MaxPacketSizeBytes - numOverheadBytes + if freeBytes <= 0 { + return nil, errCommonTagSize + } + + r := &reporter{ + client: client, + curBatch: batch, + calc: calc, + calcProto: proto, + commonTags: tags, + freeBytes: freeBytes, + resourcePool: resourcePool, + bucketIDTagName: opts.HistogramBucketIDName, + bucketTagName: opts.HistogramBucketName, + bucketValFmt: "%." + strconv.Itoa(int(opts.HistogramBucketTagPrecision)) + "f", + metCh: make(chan sizedMetric, opts.MaxQueueSize), + } + + r.processors.Add(1) + go r.process() + + return r, nil +} + +// AllocateCounter implements tally.CachedStatsReporter. +func (r *reporter) AllocateCounter( + name string, tags map[string]string, +) tally.CachedCount { + return r.allocateCounter(name, tags) +} + +func (r *reporter) allocateCounter( + name string, tags map[string]string, +) cachedMetric { + counter := r.newMetric(name, tags, counterType) + size := r.calculateSize(counter) + return cachedMetric{counter, r, size} +} + +// AllocateGauge implements tally.CachedStatsReporter. +func (r *reporter) AllocateGauge( + name string, tags map[string]string, +) tally.CachedGauge { + gauge := r.newMetric(name, tags, gaugeType) + size := r.calculateSize(gauge) + return cachedMetric{gauge, r, size} +} + +// AllocateTimer implements tally.CachedStatsReporter. +func (r *reporter) AllocateTimer( + name string, tags map[string]string, +) tally.CachedTimer { + timer := r.newMetric(name, tags, timerType) + size := r.calculateSize(timer) + return cachedMetric{timer, r, size} +} + +// AllocateHistogram implements tally.CachedStatsReporter. +func (r *reporter) AllocateHistogram( + name string, + tags map[string]string, + buckets tally.Buckets, +) tally.CachedHistogram { + var ( + cachedValueBuckets []cachedHistogramBucket + cachedDurationBuckets []cachedHistogramBucket + ) + bucketIDLen := len(strconv.Itoa(buckets.Len())) + bucketIDLen = int(math.Max(float64(bucketIDLen), + float64(minMetricBucketIDTagLength))) + bucketIDLenStr := strconv.Itoa(bucketIDLen) + bucketIDFmt := "%0" + bucketIDLenStr + "d" + for i, pair := range tally.BucketPairs(buckets) { + valueTags, durationTags := + make(map[string]string), make(map[string]string) + for k, v := range tags { + valueTags[k], durationTags[k] = v, v + } + + idTagValue := fmt.Sprintf(bucketIDFmt, i) + + valueTags[r.bucketIDTagName] = idTagValue + valueTags[r.bucketTagName] = fmt.Sprintf("%s-%s", + r.valueBucketString(pair.LowerBoundValue()), + r.valueBucketString(pair.UpperBoundValue())) + + cachedValueBuckets = append(cachedValueBuckets, + cachedHistogramBucket{pair.UpperBoundValue(), + pair.UpperBoundDuration(), + r.allocateCounter(name, valueTags)}) + + durationTags[r.bucketIDTagName] = idTagValue + durationTags[r.bucketTagName] = fmt.Sprintf("%s-%s", + r.durationBucketString(pair.LowerBoundDuration()), + r.durationBucketString(pair.UpperBoundDuration())) + + cachedDurationBuckets = append(cachedDurationBuckets, + cachedHistogramBucket{pair.UpperBoundValue(), + pair.UpperBoundDuration(), + r.allocateCounter(name, durationTags)}) + } + return cachedHistogram{r, name, tags, buckets, + cachedValueBuckets, cachedDurationBuckets} +} + +func (r *reporter) valueBucketString(v float64) string { + if v == math.MaxFloat64 { + return "infinity" + } + if v == -math.MaxFloat64 { + return "-infinity" + } + return fmt.Sprintf(r.bucketValFmt, v) +} + +func (r *reporter) durationBucketString(d time.Duration) string { + if d == 0 { + return "0" + } + if d == time.Duration(math.MaxInt64) { + return "infinity" + } + if d == time.Duration(math.MinInt64) { + return "-infinity" + } + return d.String() +} + +func (r *reporter) newMetric( + name string, + tags map[string]string, + t metricType, +) *m3thrift.Metric { + var ( + m = r.resourcePool.getMetric() + metVal = r.resourcePool.getValue() + ) + m.Name = name + if tags != nil { + metTags := r.resourcePool.getTagList() + for k, v := range tags { + val := v + metTag := r.resourcePool.getTag() + metTag.TagName = k + metTag.TagValue = &val + metTags[metTag] = true + } + m.Tags = metTags + } else { + m.Tags = nil + } + m.Timestamp = &maxInt64 + + switch t { + case counterType: + c := r.resourcePool.getCount() + c.I64Value = &maxInt64 + metVal.Count = c + case gaugeType: + g := r.resourcePool.getGauge() + g.DValue = &maxFloat64 + metVal.Gauge = g + case timerType: + t := r.resourcePool.getTimer() + t.I64Value = &maxInt64 + metVal.Timer = t + } + m.MetricValue = metVal + + return m +} + +func (r *reporter) calculateSize(m *m3thrift.Metric) int32 { + r.calcLock.Lock() + m.Write(r.calcProto) + size := r.calc.GetCount() + r.calc.ResetCount() + r.calcLock.Unlock() + return size +} + +func (r *reporter) reportCopyMetric( + m *m3thrift.Metric, + size int32, + t metricType, + iValue int64, + dValue float64, +) { + copy := r.resourcePool.getMetric() + copy.Name = m.Name + copy.Tags = m.Tags + timestampNano := time.Now().UnixNano() + copy.Timestamp = ×tampNano + copy.MetricValue = r.resourcePool.getValue() + + switch t { + case counterType: + c := r.resourcePool.getCount() + c.I64Value = &iValue + copy.MetricValue.Count = c + case gaugeType: + g := r.resourcePool.getGauge() + g.DValue = &dValue + copy.MetricValue.Gauge = g + case timerType: + t := r.resourcePool.getTimer() + t.I64Value = &iValue + copy.MetricValue.Timer = t + } + + r.status.RLock() + if !r.status.closed { + select { + case r.metCh <- sizedMetric{copy, size}: + default: + } + } + r.status.RUnlock() +} + +// Flush sends an empty sizedMetric to signal a flush. +func (r *reporter) Flush() { + r.status.RLock() + if !r.status.closed { + r.metCh <- sizedMetric{} + } + r.status.RUnlock() +} + +// Close waits for metrics to be flushed before closing the backend. +func (r *reporter) Close() (err error) { + r.status.Lock() + if r.status.closed { + r.status.Unlock() + return errAlreadyClosed + } + + r.status.closed = true + close(r.metCh) + r.status.Unlock() + + r.processors.Wait() + + return nil +} + +func (r *reporter) Capabilities() tally.Capabilities { + return r +} + +func (r *reporter) Reporting() bool { + return true +} + +func (r *reporter) Tagging() bool { + return true +} + +func (r *reporter) process() { + mets := make([]*m3thrift.Metric, 0, (r.freeBytes / 10)) + bytes := int32(0) + + for smet := range r.metCh { + if smet.m == nil { + // Explicit flush requested + if len(mets) > 0 { + mets = r.flush(mets) + bytes = 0 + } + continue + } + + if bytes+smet.size > r.freeBytes { + mets = r.flush(mets) + bytes = 0 + } + + mets = append(mets, smet.m) + bytes += smet.size + } + + if len(mets) > 0 { + // Final flush + r.flush(mets) + } + + r.processors.Done() +} + +func (r *reporter) flush( + mets []*m3thrift.Metric, +) []*m3thrift.Metric { + r.curBatchLock.Lock() + r.curBatch.Metrics = mets + r.client.EmitMetricBatch(r.curBatch) + r.curBatch.Metrics = nil + r.curBatchLock.Unlock() + + r.resourcePool.releaseShallowMetrics(mets) + + for i := range mets { + mets[i] = nil + } + return mets[:0] +} + +func createTag( + pool *resourcePool, + tagName, tagValue string, +) *m3thrift.MetricTag { + tag := pool.getTag() + tag.TagName = tagName + if tagValue != "" { + tag.TagValue = &tagValue + } + + return tag +} + +type cachedMetric struct { + metric *m3thrift.Metric + reporter *reporter + size int32 +} + +func (c cachedMetric) ReportCount(value int64) { + c.reporter.reportCopyMetric(c.metric, c.size, counterType, value, 0) +} + +func (c cachedMetric) ReportGauge(value float64) { + c.reporter.reportCopyMetric(c.metric, c.size, gaugeType, 0, value) +} + +func (c cachedMetric) ReportTimer(interval time.Duration) { + val := int64(interval) + c.reporter.reportCopyMetric(c.metric, c.size, timerType, val, 0) +} + +func (c cachedMetric) ReportSamples(value int64) { + c.reporter.reportCopyMetric(c.metric, c.size, counterType, value, 0) +} + +type noopMetric struct { +} + +func (c noopMetric) ReportCount(value int64) { +} + +func (c noopMetric) ReportGauge(value float64) { +} + +func (c noopMetric) ReportTimer(interval time.Duration) { +} + +func (c noopMetric) ReportSamples(value int64) { +} + +type cachedHistogram struct { + r *reporter + name string + tags map[string]string + buckets tally.Buckets + cachedValueBuckets []cachedHistogramBucket + cachedDurationBuckets []cachedHistogramBucket +} + +type cachedHistogramBucket struct { + valueUpperBound float64 + durationUpperBound time.Duration + metric cachedMetric +} + +func (h cachedHistogram) ValueBucket( + bucketLowerBound, bucketUpperBound float64, +) tally.CachedHistogramBucket { + for _, b := range h.cachedValueBuckets { + if b.valueUpperBound >= bucketUpperBound { + return b.metric + } + } + return noopMetric{} +} + +func (h cachedHistogram) DurationBucket( + bucketLowerBound, bucketUpperBound time.Duration, +) tally.CachedHistogramBucket { + for _, b := range h.cachedDurationBuckets { + if b.durationUpperBound >= bucketUpperBound { + return b.metric + } + } + return noopMetric{} +} + +type sizedMetric struct { + m *m3thrift.Metric + size int32 +} diff --git a/vendor/github.com/uber-go/tally/m3/resource_pool.go b/vendor/github.com/uber-go/tally/m3/resource_pool.go new file mode 100644 index 00000000..05db3aca --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/resource_pool.go @@ -0,0 +1,223 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3 + +import ( + "github.com/uber-go/tally" + customtransport "github.com/uber-go/tally/m3/customtransports" + m3thrift "github.com/uber-go/tally/m3/thrift" + "github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift" +) + +const ( + batchPoolSize = 10 + metricPoolSize = DefaultMaxQueueSize + valuePoolSize = DefaultMaxQueueSize + timerPoolSize = DefaultMaxQueueSize + tagPoolSize = DefaultMaxQueueSize + counterPoolSize = DefaultMaxQueueSize + gaugePoolSize = DefaultMaxQueueSize + protoPoolSize = 10 +) + +type resourcePool struct { + batchPool *tally.ObjectPool + metricPool *tally.ObjectPool + tagPool *tally.ObjectPool + valuePool *tally.ObjectPool + counterPool *tally.ObjectPool + gaugePool *tally.ObjectPool + timerPool *tally.ObjectPool + protoPool *tally.ObjectPool +} + +func newResourcePool(protoFac thrift.TProtocolFactory) *resourcePool { + batchPool := tally.NewObjectPool(batchPoolSize) + batchPool.Init(func() interface{} { + return m3thrift.NewMetricBatch() + }) + + metricPool := tally.NewObjectPool(metricPoolSize) + metricPool.Init(func() interface{} { + return m3thrift.NewMetric() + }) + + tagPool := tally.NewObjectPool(tagPoolSize) + tagPool.Init(func() interface{} { + return m3thrift.NewMetricTag() + }) + + valuePool := tally.NewObjectPool(valuePoolSize) + valuePool.Init(func() interface{} { + return m3thrift.NewMetricValue() + }) + + counterPool := tally.NewObjectPool(counterPoolSize) + counterPool.Init(func() interface{} { + return m3thrift.NewCountValue() + }) + + gaugePool := tally.NewObjectPool(gaugePoolSize) + gaugePool.Init(func() interface{} { + return m3thrift.NewGaugeValue() + }) + + timerPool := tally.NewObjectPool(timerPoolSize) + timerPool.Init(func() interface{} { + return m3thrift.NewTimerValue() + }) + + protoPool := tally.NewObjectPool(protoPoolSize) + protoPool.Init(func() interface{} { + return protoFac.GetProtocol(&customtransport.TCalcTransport{}) + }) + + return &resourcePool{ + batchPool: batchPool, + metricPool: metricPool, + tagPool: tagPool, + valuePool: valuePool, + counterPool: counterPool, + gaugePool: gaugePool, + timerPool: timerPool, + protoPool: protoPool, + } +} + +func (r *resourcePool) getBatch() *m3thrift.MetricBatch { + o := r.batchPool.Get() + return o.(*m3thrift.MetricBatch) +} + +func (r *resourcePool) getMetric() *m3thrift.Metric { + o := r.metricPool.Get() + return o.(*m3thrift.Metric) +} + +func (r *resourcePool) getTagList() map[*m3thrift.MetricTag]bool { + return map[*m3thrift.MetricTag]bool{} +} + +func (r *resourcePool) getTag() *m3thrift.MetricTag { + o := r.tagPool.Get() + return o.(*m3thrift.MetricTag) +} + +func (r *resourcePool) getValue() *m3thrift.MetricValue { + o := r.valuePool.Get() + return o.(*m3thrift.MetricValue) +} + +func (r *resourcePool) getCount() *m3thrift.CountValue { + o := r.counterPool.Get() + return o.(*m3thrift.CountValue) +} + +func (r *resourcePool) getGauge() *m3thrift.GaugeValue { + o := r.gaugePool.Get() + return o.(*m3thrift.GaugeValue) +} + +func (r *resourcePool) getTimer() *m3thrift.TimerValue { + o := r.timerPool.Get() + return o.(*m3thrift.TimerValue) +} + +func (r *resourcePool) getProto() thrift.TProtocol { + o := r.protoPool.Get() + return o.(thrift.TProtocol) +} + +func (r *resourcePool) releaseProto(proto thrift.TProtocol) { + calc := proto.Transport().(*customtransport.TCalcTransport) + calc.ResetCount() + r.protoPool.Put(proto) +} + +func (r *resourcePool) releaseBatch(batch *m3thrift.MetricBatch) { + batch.CommonTags = nil + for _, metric := range batch.Metrics { + r.releaseMetric(metric) + } + batch.Metrics = nil + r.batchPool.Put(batch) +} + +func (r *resourcePool) releaseMetricValue(metVal *m3thrift.MetricValue) { + if metVal.IsSetCount() { + metVal.Count.I64Value = nil + r.counterPool.Put(metVal.Count) + metVal.Count = nil + } else if metVal.IsSetGauge() { + metVal.Gauge.I64Value = nil + metVal.Gauge.DValue = nil + r.gaugePool.Put(metVal.Gauge) + metVal.Gauge = nil + } else if metVal.IsSetTimer() { + metVal.Timer.I64Value = nil + metVal.Timer.DValue = nil + r.timerPool.Put(metVal.Timer) + metVal.Timer = nil + } + r.valuePool.Put(metVal) +} + +func (r *resourcePool) releaseMetrics(mets []*m3thrift.Metric) { + for _, m := range mets { + r.releaseMetric(m) + } +} + +func (r *resourcePool) releaseShallowMetrics(mets []*m3thrift.Metric) { + for _, m := range mets { + r.releaseShallowMetric(m) + } +} + +func (r *resourcePool) releaseMetric(metric *m3thrift.Metric) { + metric.Name = "" + // Release Tags + for tag := range metric.Tags { + tag.TagName = "" + tag.TagValue = nil + r.tagPool.Put(tag) + } + metric.Tags = nil + + r.releaseShallowMetric(metric) +} + +func (r *resourcePool) releaseShallowMetric(metric *m3thrift.Metric) { + metric.Name = "" + metric.Tags = nil + metric.Timestamp = nil + + metVal := metric.MetricValue + if metVal == nil { + r.metricPool.Put(metric) + return + } + + r.releaseMetricValue(metVal) + metric.MetricValue = nil + + r.metricPool.Put(metric) +} diff --git a/vendor/github.com/uber-go/tally/m3/sanitize.go b/vendor/github.com/uber-go/tally/m3/sanitize.go new file mode 100644 index 00000000..a63aa60b --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/sanitize.go @@ -0,0 +1,44 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package m3 + +import ( + "github.com/uber-go/tally" +) + +var ( + // DefaultSanitizerOpts are the options for the default M3 sanitizer. + DefaultSanitizerOpts = tally.SanitizeOptions{ + NameCharacters: tally.ValidCharacters{ + Ranges: tally.AlphanumericRange, + Characters: tally.UnderscoreDashDotCharacters, + }, + KeyCharacters: tally.ValidCharacters{ + Ranges: tally.AlphanumericRange, + Characters: tally.UnderscoreDashCharacters, + }, + ValueCharacters: tally.ValidCharacters{ + Ranges: tally.AlphanumericRange, + Characters: tally.UnderscoreDashDotCharacters, + }, + ReplacementCharacter: tally.DefaultReplacementCharacter, + } +) diff --git a/vendor/github.com/uber-go/tally/m3/thrift/Makefile b/vendor/github.com/uber-go/tally/m3/thrift/Makefile new file mode 100644 index 00000000..56023b20 --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/thrift/Makefile @@ -0,0 +1,9 @@ +thrift_version := v1.0.0 + +gen-thrift: + @thrift --gen go:thrift_import="github.com/apache/thrift/lib/go/thrift" -out . $(thrift_version)/m3.thrift + @rm -rf m3/m3-remote + @mv m3/* . + @rm -rf m3 + @echo Generated thrift go files in metrics/m3/thrift/ + diff --git a/vendor/github.com/uber-go/tally/m3/thrift/constants.go b/vendor/github.com/uber-go/tally/m3/thrift/constants.go new file mode 100644 index 00000000..057882b9 --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/thrift/constants.go @@ -0,0 +1,39 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Autogenerated by Thrift Compiler (0.9.2) @generated +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package m3 + +import ( + "bytes" + "fmt" + + "github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +func init() { +} diff --git a/vendor/github.com/uber-go/tally/m3/thrift/m3.go b/vendor/github.com/uber-go/tally/m3/thrift/m3.go new file mode 100644 index 00000000..ee86deb2 --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/thrift/m3.go @@ -0,0 +1,266 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Autogenerated by Thrift Compiler (0.9.2) @generated +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package m3 + +import ( + "bytes" + "fmt" + + "github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +type M3 interface { //M3 Metrics Service + + // Emits a batch of metrics. + // + // Parameters: + // - Batch + EmitMetricBatch(batch *MetricBatch) (err error) +} + +//M3 Metrics Service +type M3Client struct { + Transport thrift.TTransport + ProtocolFactory thrift.TProtocolFactory + InputProtocol thrift.TProtocol + OutputProtocol thrift.TProtocol + SeqId int32 +} + +func NewM3ClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *M3Client { + return &M3Client{Transport: t, + ProtocolFactory: f, + InputProtocol: f.GetProtocol(t), + OutputProtocol: f.GetProtocol(t), + SeqId: 0, + } +} + +func NewM3ClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *M3Client { + return &M3Client{Transport: t, + ProtocolFactory: nil, + InputProtocol: iprot, + OutputProtocol: oprot, + SeqId: 0, + } +} + +// Emits a batch of metrics. +// +// Parameters: +// - Batch +func (p *M3Client) EmitMetricBatch(batch *MetricBatch) (err error) { + if err = p.sendEmitMetricBatch(batch); err != nil { + return + } + return +} + +func (p *M3Client) sendEmitMetricBatch(batch *MetricBatch) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("emitMetricBatch", thrift.ONEWAY, p.SeqId); err != nil { + return + } + args := EmitMetricBatchArgs{ + Batch: batch, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +type M3Processor struct { + processorMap map[string]thrift.TProcessorFunction + handler M3 +} + +func (p *M3Processor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { + p.processorMap[key] = processor +} + +func (p *M3Processor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { + processor, ok = p.processorMap[key] + return processor, ok +} + +func (p *M3Processor) ProcessorMap() map[string]thrift.TProcessorFunction { + return p.processorMap +} + +func NewM3Processor(handler M3) *M3Processor { + + self3 := &M3Processor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self3.processorMap["emitMetricBatch"] = &m3ProcessorEmitMetricBatch{handler: handler} + return self3 +} + +func (p *M3Processor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + name, _, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return false, err + } + if processor, ok := p.GetProcessorFunction(name); ok { + return processor.Process(seqId, iprot, oprot) + } + iprot.Skip(thrift.STRUCT) + iprot.ReadMessageEnd() + x4 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) + x4.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, x4 + +} + +type m3ProcessorEmitMetricBatch struct { + handler M3 +} + +func (p *m3ProcessorEmitMetricBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := EmitMetricBatchArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + return false, err + } + + iprot.ReadMessageEnd() + var err2 error + if err2 = p.handler.EmitMetricBatch(args.Batch); err2 != nil { + return true, err2 + } + return true, nil +} + +// HELPER FUNCTIONS AND STRUCTURES + +type EmitMetricBatchArgs struct { + Batch *MetricBatch `thrift:"batch,1" json:"batch"` +} + +func NewEmitMetricBatchArgs() *EmitMetricBatchArgs { + return &EmitMetricBatchArgs{} +} + +var EmitMetricBatchArgs_Batch_DEFAULT *MetricBatch + +func (p *EmitMetricBatchArgs) GetBatch() *MetricBatch { + if !p.IsSetBatch() { + return EmitMetricBatchArgs_Batch_DEFAULT + } + return p.Batch +} +func (p *EmitMetricBatchArgs) IsSetBatch() bool { + return p.Batch != nil +} + +func (p *EmitMetricBatchArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return fmt.Errorf("%T read error: %s", p, err) + } + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return fmt.Errorf("%T field %d read error: %s", p, fieldId, err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return fmt.Errorf("%T read struct end error: %s", p, err) + } + return nil +} + +func (p *EmitMetricBatchArgs) ReadField1(iprot thrift.TProtocol) error { + p.Batch = &MetricBatch{} + if err := p.Batch.Read(iprot); err != nil { + return fmt.Errorf("%T error reading struct: %s", p.Batch, err) + } + return nil +} + +func (p *EmitMetricBatchArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("emitMetricBatch_args"); err != nil { + return fmt.Errorf("%T write struct begin error: %s", p, err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return fmt.Errorf("write field stop error: %s", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return fmt.Errorf("write struct stop error: %s", err) + } + return nil +} + +func (p *EmitMetricBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("batch", thrift.STRUCT, 1); err != nil { + return fmt.Errorf("%T write field begin error 1:batch: %s", p, err) + } + if err := p.Batch.Write(oprot); err != nil { + return fmt.Errorf("%T error writing struct: %s", p.Batch, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 1:batch: %s", p, err) + } + return err +} + +func (p *EmitMetricBatchArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("EmitMetricBatchArgs(%+v)", *p) +} diff --git a/vendor/github.com/uber-go/tally/m3/thrift/ttypes.go b/vendor/github.com/uber-go/tally/m3/thrift/ttypes.go new file mode 100644 index 00000000..2e716ff5 --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/thrift/ttypes.go @@ -0,0 +1,1150 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Autogenerated by Thrift Compiler (0.9.2) @generated +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package m3 + +import ( + "bytes" + "fmt" + + "github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +var GoUnusedProtection__ int + +type MetricValue struct { + Count *CountValue `thrift:"count,1" json:"count"` + Gauge *GaugeValue `thrift:"gauge,2" json:"gauge"` + Timer *TimerValue `thrift:"timer,3" json:"timer"` +} + +func NewMetricValue() *MetricValue { + return &MetricValue{} +} + +var MetricValue_Count_DEFAULT CountValue + +func (p *MetricValue) GetCount() CountValue { + if !p.IsSetCount() { + return MetricValue_Count_DEFAULT + } + return *p.Count +} + +var MetricValue_Gauge_DEFAULT GaugeValue + +func (p *MetricValue) GetGauge() GaugeValue { + if !p.IsSetGauge() { + return MetricValue_Gauge_DEFAULT + } + return *p.Gauge +} + +var MetricValue_Timer_DEFAULT TimerValue + +func (p *MetricValue) GetTimer() TimerValue { + if !p.IsSetTimer() { + return MetricValue_Timer_DEFAULT + } + return *p.Timer +} +func (p *MetricValue) IsSetCount() bool { + return p.Count != nil +} + +func (p *MetricValue) IsSetGauge() bool { + return p.Gauge != nil +} + +func (p *MetricValue) IsSetTimer() bool { + return p.Timer != nil +} + +func (p *MetricValue) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return fmt.Errorf("%T read error: %s", p, err) + } + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return fmt.Errorf("%T field %d read error: %s", p, fieldId, err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return fmt.Errorf("%T read struct end error: %s", p, err) + } + return nil +} + +func (p *MetricValue) ReadField1(iprot thrift.TProtocol) error { + p.Count = &CountValue{} + if err := p.Count.Read(iprot); err != nil { + return fmt.Errorf("%T error reading struct: %s", p.Count, err) + } + return nil +} + +func (p *MetricValue) ReadField2(iprot thrift.TProtocol) error { + p.Gauge = &GaugeValue{} + if err := p.Gauge.Read(iprot); err != nil { + return fmt.Errorf("%T error reading struct: %s", p.Gauge, err) + } + return nil +} + +func (p *MetricValue) ReadField3(iprot thrift.TProtocol) error { + p.Timer = &TimerValue{} + if err := p.Timer.Read(iprot); err != nil { + return fmt.Errorf("%T error reading struct: %s", p.Timer, err) + } + return nil +} + +func (p *MetricValue) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("MetricValue"); err != nil { + return fmt.Errorf("%T write struct begin error: %s", p, err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return fmt.Errorf("write field stop error: %s", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return fmt.Errorf("write struct stop error: %s", err) + } + return nil +} + +func (p *MetricValue) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetCount() { + if err := oprot.WriteFieldBegin("count", thrift.STRUCT, 1); err != nil { + return fmt.Errorf("%T write field begin error 1:count: %s", p, err) + } + if err := p.Count.Write(oprot); err != nil { + return fmt.Errorf("%T error writing struct: %s", p.Count, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 1:count: %s", p, err) + } + } + return err +} + +func (p *MetricValue) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetGauge() { + if err := oprot.WriteFieldBegin("gauge", thrift.STRUCT, 2); err != nil { + return fmt.Errorf("%T write field begin error 2:gauge: %s", p, err) + } + if err := p.Gauge.Write(oprot); err != nil { + return fmt.Errorf("%T error writing struct: %s", p.Gauge, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 2:gauge: %s", p, err) + } + } + return err +} + +func (p *MetricValue) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetTimer() { + if err := oprot.WriteFieldBegin("timer", thrift.STRUCT, 3); err != nil { + return fmt.Errorf("%T write field begin error 3:timer: %s", p, err) + } + if err := p.Timer.Write(oprot); err != nil { + return fmt.Errorf("%T error writing struct: %s", p.Timer, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 3:timer: %s", p, err) + } + } + return err +} + +func (p *MetricValue) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("MetricValue(%+v)", *p) +} + +type CountValue struct { + I64Value *int64 `thrift:"i64Value,1" json:"i64Value"` +} + +func NewCountValue() *CountValue { + return &CountValue{} +} + +var CountValue_I64Value_DEFAULT int64 + +func (p *CountValue) GetI64Value() int64 { + if !p.IsSetI64Value() { + return CountValue_I64Value_DEFAULT + } + return *p.I64Value +} +func (p *CountValue) IsSetI64Value() bool { + return p.I64Value != nil +} + +func (p *CountValue) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return fmt.Errorf("%T read error: %s", p, err) + } + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return fmt.Errorf("%T field %d read error: %s", p, fieldId, err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return fmt.Errorf("%T read struct end error: %s", p, err) + } + return nil +} + +func (p *CountValue) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return fmt.Errorf("error reading field 1: %s", err) + } else { + p.I64Value = &v + } + return nil +} + +func (p *CountValue) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("CountValue"); err != nil { + return fmt.Errorf("%T write struct begin error: %s", p, err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return fmt.Errorf("write field stop error: %s", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return fmt.Errorf("write struct stop error: %s", err) + } + return nil +} + +func (p *CountValue) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetI64Value() { + if err := oprot.WriteFieldBegin("i64Value", thrift.I64, 1); err != nil { + return fmt.Errorf("%T write field begin error 1:i64Value: %s", p, err) + } + if err := oprot.WriteI64(int64(*p.I64Value)); err != nil { + return fmt.Errorf("%T.i64Value (1) field write error: %s", p, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 1:i64Value: %s", p, err) + } + } + return err +} + +func (p *CountValue) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("CountValue(%+v)", *p) +} + +type GaugeValue struct { + I64Value *int64 `thrift:"i64Value,1" json:"i64Value"` + DValue *float64 `thrift:"dValue,2" json:"dValue"` +} + +func NewGaugeValue() *GaugeValue { + return &GaugeValue{} +} + +var GaugeValue_I64Value_DEFAULT int64 + +func (p *GaugeValue) GetI64Value() int64 { + if !p.IsSetI64Value() { + return GaugeValue_I64Value_DEFAULT + } + return *p.I64Value +} + +var GaugeValue_DValue_DEFAULT float64 + +func (p *GaugeValue) GetDValue() float64 { + if !p.IsSetDValue() { + return GaugeValue_DValue_DEFAULT + } + return *p.DValue +} +func (p *GaugeValue) IsSetI64Value() bool { + return p.I64Value != nil +} + +func (p *GaugeValue) IsSetDValue() bool { + return p.DValue != nil +} + +func (p *GaugeValue) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return fmt.Errorf("%T read error: %s", p, err) + } + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return fmt.Errorf("%T field %d read error: %s", p, fieldId, err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return fmt.Errorf("%T read struct end error: %s", p, err) + } + return nil +} + +func (p *GaugeValue) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return fmt.Errorf("error reading field 1: %s", err) + } else { + p.I64Value = &v + } + return nil +} + +func (p *GaugeValue) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadDouble(); err != nil { + return fmt.Errorf("error reading field 2: %s", err) + } else { + p.DValue = &v + } + return nil +} + +func (p *GaugeValue) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("GaugeValue"); err != nil { + return fmt.Errorf("%T write struct begin error: %s", p, err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return fmt.Errorf("write field stop error: %s", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return fmt.Errorf("write struct stop error: %s", err) + } + return nil +} + +func (p *GaugeValue) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetI64Value() { + if err := oprot.WriteFieldBegin("i64Value", thrift.I64, 1); err != nil { + return fmt.Errorf("%T write field begin error 1:i64Value: %s", p, err) + } + if err := oprot.WriteI64(int64(*p.I64Value)); err != nil { + return fmt.Errorf("%T.i64Value (1) field write error: %s", p, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 1:i64Value: %s", p, err) + } + } + return err +} + +func (p *GaugeValue) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetDValue() { + if err := oprot.WriteFieldBegin("dValue", thrift.DOUBLE, 2); err != nil { + return fmt.Errorf("%T write field begin error 2:dValue: %s", p, err) + } + if err := oprot.WriteDouble(float64(*p.DValue)); err != nil { + return fmt.Errorf("%T.dValue (2) field write error: %s", p, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 2:dValue: %s", p, err) + } + } + return err +} + +func (p *GaugeValue) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("GaugeValue(%+v)", *p) +} + +type TimerValue struct { + I64Value *int64 `thrift:"i64Value,1" json:"i64Value"` + DValue *float64 `thrift:"dValue,2" json:"dValue"` +} + +func NewTimerValue() *TimerValue { + return &TimerValue{} +} + +var TimerValue_I64Value_DEFAULT int64 + +func (p *TimerValue) GetI64Value() int64 { + if !p.IsSetI64Value() { + return TimerValue_I64Value_DEFAULT + } + return *p.I64Value +} + +var TimerValue_DValue_DEFAULT float64 + +func (p *TimerValue) GetDValue() float64 { + if !p.IsSetDValue() { + return TimerValue_DValue_DEFAULT + } + return *p.DValue +} +func (p *TimerValue) IsSetI64Value() bool { + return p.I64Value != nil +} + +func (p *TimerValue) IsSetDValue() bool { + return p.DValue != nil +} + +func (p *TimerValue) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return fmt.Errorf("%T read error: %s", p, err) + } + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return fmt.Errorf("%T field %d read error: %s", p, fieldId, err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return fmt.Errorf("%T read struct end error: %s", p, err) + } + return nil +} + +func (p *TimerValue) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return fmt.Errorf("error reading field 1: %s", err) + } else { + p.I64Value = &v + } + return nil +} + +func (p *TimerValue) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadDouble(); err != nil { + return fmt.Errorf("error reading field 2: %s", err) + } else { + p.DValue = &v + } + return nil +} + +func (p *TimerValue) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("TimerValue"); err != nil { + return fmt.Errorf("%T write struct begin error: %s", p, err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return fmt.Errorf("write field stop error: %s", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return fmt.Errorf("write struct stop error: %s", err) + } + return nil +} + +func (p *TimerValue) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetI64Value() { + if err := oprot.WriteFieldBegin("i64Value", thrift.I64, 1); err != nil { + return fmt.Errorf("%T write field begin error 1:i64Value: %s", p, err) + } + if err := oprot.WriteI64(int64(*p.I64Value)); err != nil { + return fmt.Errorf("%T.i64Value (1) field write error: %s", p, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 1:i64Value: %s", p, err) + } + } + return err +} + +func (p *TimerValue) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetDValue() { + if err := oprot.WriteFieldBegin("dValue", thrift.DOUBLE, 2); err != nil { + return fmt.Errorf("%T write field begin error 2:dValue: %s", p, err) + } + if err := oprot.WriteDouble(float64(*p.DValue)); err != nil { + return fmt.Errorf("%T.dValue (2) field write error: %s", p, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 2:dValue: %s", p, err) + } + } + return err +} + +func (p *TimerValue) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("TimerValue(%+v)", *p) +} + +type MetricTag struct { + TagName string `thrift:"tagName,1" json:"tagName"` + TagValue *string `thrift:"tagValue,2" json:"tagValue"` +} + +func NewMetricTag() *MetricTag { + return &MetricTag{} +} + +func (p *MetricTag) GetTagName() string { + return p.TagName +} + +var MetricTag_TagValue_DEFAULT string + +func (p *MetricTag) GetTagValue() string { + if !p.IsSetTagValue() { + return MetricTag_TagValue_DEFAULT + } + return *p.TagValue +} +func (p *MetricTag) IsSetTagValue() bool { + return p.TagValue != nil +} + +func (p *MetricTag) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return fmt.Errorf("%T read error: %s", p, err) + } + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return fmt.Errorf("%T field %d read error: %s", p, fieldId, err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return fmt.Errorf("%T read struct end error: %s", p, err) + } + return nil +} + +func (p *MetricTag) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return fmt.Errorf("error reading field 1: %s", err) + } else { + p.TagName = v + } + return nil +} + +func (p *MetricTag) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return fmt.Errorf("error reading field 2: %s", err) + } else { + p.TagValue = &v + } + return nil +} + +func (p *MetricTag) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("MetricTag"); err != nil { + return fmt.Errorf("%T write struct begin error: %s", p, err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return fmt.Errorf("write field stop error: %s", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return fmt.Errorf("write struct stop error: %s", err) + } + return nil +} + +func (p *MetricTag) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("tagName", thrift.STRING, 1); err != nil { + return fmt.Errorf("%T write field begin error 1:tagName: %s", p, err) + } + if err := oprot.WriteString(string(p.TagName)); err != nil { + return fmt.Errorf("%T.tagName (1) field write error: %s", p, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 1:tagName: %s", p, err) + } + return err +} + +func (p *MetricTag) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetTagValue() { + if err := oprot.WriteFieldBegin("tagValue", thrift.STRING, 2); err != nil { + return fmt.Errorf("%T write field begin error 2:tagValue: %s", p, err) + } + if err := oprot.WriteString(string(*p.TagValue)); err != nil { + return fmt.Errorf("%T.tagValue (2) field write error: %s", p, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 2:tagValue: %s", p, err) + } + } + return err +} + +func (p *MetricTag) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("MetricTag(%+v)", *p) +} + +type Metric struct { + Name string `thrift:"name,1" json:"name"` + MetricValue *MetricValue `thrift:"metricValue,2" json:"metricValue"` + Timestamp *int64 `thrift:"timestamp,3" json:"timestamp"` + Tags map[*MetricTag]bool `thrift:"tags,4" json:"tags"` +} + +func NewMetric() *Metric { + return &Metric{} +} + +func (p *Metric) GetName() string { + return p.Name +} + +var Metric_MetricValue_DEFAULT *MetricValue + +func (p *Metric) GetMetricValue() *MetricValue { + if !p.IsSetMetricValue() { + return Metric_MetricValue_DEFAULT + } + return p.MetricValue +} + +var Metric_Timestamp_DEFAULT int64 + +func (p *Metric) GetTimestamp() int64 { + if !p.IsSetTimestamp() { + return Metric_Timestamp_DEFAULT + } + return *p.Timestamp +} + +var Metric_Tags_DEFAULT map[*MetricTag]bool + +func (p *Metric) GetTags() map[*MetricTag]bool { + return p.Tags +} +func (p *Metric) IsSetMetricValue() bool { + return p.MetricValue != nil +} + +func (p *Metric) IsSetTimestamp() bool { + return p.Timestamp != nil +} + +func (p *Metric) IsSetTags() bool { + return p.Tags != nil +} + +func (p *Metric) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return fmt.Errorf("%T read error: %s", p, err) + } + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return fmt.Errorf("%T field %d read error: %s", p, fieldId, err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + case 4: + if err := p.ReadField4(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return fmt.Errorf("%T read struct end error: %s", p, err) + } + return nil +} + +func (p *Metric) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return fmt.Errorf("error reading field 1: %s", err) + } else { + p.Name = v + } + return nil +} + +func (p *Metric) ReadField2(iprot thrift.TProtocol) error { + p.MetricValue = &MetricValue{} + if err := p.MetricValue.Read(iprot); err != nil { + return fmt.Errorf("%T error reading struct: %s", p.MetricValue, err) + } + return nil +} + +func (p *Metric) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return fmt.Errorf("error reading field 3: %s", err) + } else { + p.Timestamp = &v + } + return nil +} + +func (p *Metric) ReadField4(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadSetBegin() + if err != nil { + return fmt.Errorf("error reading set begin: %s", err) + } + tSet := make(map[*MetricTag]bool, size) + p.Tags = tSet + for i := 0; i < size; i++ { + _elem0 := &MetricTag{} + if err := _elem0.Read(iprot); err != nil { + return fmt.Errorf("%T error reading struct: %s", _elem0, err) + } + p.Tags[_elem0] = true + } + if err := iprot.ReadSetEnd(); err != nil { + return fmt.Errorf("error reading set end: %s", err) + } + return nil +} + +func (p *Metric) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Metric"); err != nil { + return fmt.Errorf("%T write struct begin error: %s", p, err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return fmt.Errorf("write field stop error: %s", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return fmt.Errorf("write struct stop error: %s", err) + } + return nil +} + +func (p *Metric) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("name", thrift.STRING, 1); err != nil { + return fmt.Errorf("%T write field begin error 1:name: %s", p, err) + } + if err := oprot.WriteString(string(p.Name)); err != nil { + return fmt.Errorf("%T.name (1) field write error: %s", p, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 1:name: %s", p, err) + } + return err +} + +func (p *Metric) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetMetricValue() { + if err := oprot.WriteFieldBegin("metricValue", thrift.STRUCT, 2); err != nil { + return fmt.Errorf("%T write field begin error 2:metricValue: %s", p, err) + } + if err := p.MetricValue.Write(oprot); err != nil { + return fmt.Errorf("%T error writing struct: %s", p.MetricValue, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 2:metricValue: %s", p, err) + } + } + return err +} + +func (p *Metric) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetTimestamp() { + if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 3); err != nil { + return fmt.Errorf("%T write field begin error 3:timestamp: %s", p, err) + } + if err := oprot.WriteI64(int64(*p.Timestamp)); err != nil { + return fmt.Errorf("%T.timestamp (3) field write error: %s", p, err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 3:timestamp: %s", p, err) + } + } + return err +} + +func (p *Metric) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetTags() { + if err := oprot.WriteFieldBegin("tags", thrift.SET, 4); err != nil { + return fmt.Errorf("%T write field begin error 4:tags: %s", p, err) + } + if err := oprot.WriteSetBegin(thrift.STRUCT, len(p.Tags)); err != nil { + return fmt.Errorf("error writing set begin: %s", err) + } + for v := range p.Tags { + if err := v.Write(oprot); err != nil { + return fmt.Errorf("%T error writing struct: %s", v, err) + } + } + if err := oprot.WriteSetEnd(); err != nil { + return fmt.Errorf("error writing set end: %s", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 4:tags: %s", p, err) + } + } + return err +} + +func (p *Metric) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Metric(%+v)", *p) +} + +type MetricBatch struct { + Metrics []*Metric `thrift:"metrics,1" json:"metrics"` + CommonTags map[*MetricTag]bool `thrift:"commonTags,2" json:"commonTags"` +} + +func NewMetricBatch() *MetricBatch { + return &MetricBatch{} +} + +func (p *MetricBatch) GetMetrics() []*Metric { + return p.Metrics +} + +var MetricBatch_CommonTags_DEFAULT map[*MetricTag]bool + +func (p *MetricBatch) GetCommonTags() map[*MetricTag]bool { + return p.CommonTags +} +func (p *MetricBatch) IsSetCommonTags() bool { + return p.CommonTags != nil +} + +func (p *MetricBatch) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return fmt.Errorf("%T read error: %s", p, err) + } + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return fmt.Errorf("%T field %d read error: %s", p, fieldId, err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return fmt.Errorf("%T read struct end error: %s", p, err) + } + return nil +} + +func (p *MetricBatch) ReadField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return fmt.Errorf("error reading list begin: %s", err) + } + tSlice := make([]*Metric, 0, size) + p.Metrics = tSlice + for i := 0; i < size; i++ { + _elem1 := &Metric{} + if err := _elem1.Read(iprot); err != nil { + return fmt.Errorf("%T error reading struct: %s", _elem1, err) + } + p.Metrics = append(p.Metrics, _elem1) + } + if err := iprot.ReadListEnd(); err != nil { + return fmt.Errorf("error reading list end: %s", err) + } + return nil +} + +func (p *MetricBatch) ReadField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadSetBegin() + if err != nil { + return fmt.Errorf("error reading set begin: %s", err) + } + tSet := make(map[*MetricTag]bool, size) + p.CommonTags = tSet + for i := 0; i < size; i++ { + _elem2 := &MetricTag{} + if err := _elem2.Read(iprot); err != nil { + return fmt.Errorf("%T error reading struct: %s", _elem2, err) + } + p.CommonTags[_elem2] = true + } + if err := iprot.ReadSetEnd(); err != nil { + return fmt.Errorf("error reading set end: %s", err) + } + return nil +} + +func (p *MetricBatch) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("MetricBatch"); err != nil { + return fmt.Errorf("%T write struct begin error: %s", p, err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return fmt.Errorf("write field stop error: %s", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return fmt.Errorf("write struct stop error: %s", err) + } + return nil +} + +func (p *MetricBatch) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("metrics", thrift.LIST, 1); err != nil { + return fmt.Errorf("%T write field begin error 1:metrics: %s", p, err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Metrics)); err != nil { + return fmt.Errorf("error writing list begin: %s", err) + } + for _, v := range p.Metrics { + if err := v.Write(oprot); err != nil { + return fmt.Errorf("%T error writing struct: %s", v, err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return fmt.Errorf("error writing list end: %s", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 1:metrics: %s", p, err) + } + return err +} + +func (p *MetricBatch) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetCommonTags() { + if err := oprot.WriteFieldBegin("commonTags", thrift.SET, 2); err != nil { + return fmt.Errorf("%T write field begin error 2:commonTags: %s", p, err) + } + if err := oprot.WriteSetBegin(thrift.STRUCT, len(p.CommonTags)); err != nil { + return fmt.Errorf("error writing set begin: %s", err) + } + for v := range p.CommonTags { + if err := v.Write(oprot); err != nil { + return fmt.Errorf("%T error writing struct: %s", v, err) + } + } + if err := oprot.WriteSetEnd(); err != nil { + return fmt.Errorf("error writing set end: %s", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return fmt.Errorf("%T write field end error 2:commonTags: %s", p, err) + } + } + return err +} + +func (p *MetricBatch) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("MetricBatch(%+v)", *p) +} diff --git a/vendor/github.com/uber-go/tally/m3/thriftudp/multitransport.go b/vendor/github.com/uber-go/tally/m3/thriftudp/multitransport.go new file mode 100644 index 00000000..c807aaae --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/thriftudp/multitransport.go @@ -0,0 +1,120 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thriftudp + +import ( + "fmt" + + "github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift" +) + +// TMultiUDPTransport does multiUDP as a thrift.TTransport +type TMultiUDPTransport struct { + transports []thrift.TTransport +} + +// NewTMultiUDPClientTransport creates a set of net.UDPConn-backed TTransports for Thrift clients +// All writes are buffered and flushed in one UDP packet. If locHostPort is not "", it +// will be used as the local address for the connection +// Example: +// trans, err := thriftudp.NewTMultiUDPClientTransport([]string{"192.168.1.1:9090","192.168.1.2:9090"}, "") +func NewTMultiUDPClientTransport( + destHostPorts []string, + locHostPort string, +) (*TMultiUDPTransport, error) { + var transports []thrift.TTransport + for i := range destHostPorts { + trans, err := NewTUDPClientTransport(destHostPorts[i], locHostPort) + if err != nil { + return nil, err + } + transports = append(transports, trans) + } + + return &TMultiUDPTransport{transports: transports}, nil +} + +// Open the connections of the underlying transports +func (p *TMultiUDPTransport) Open() error { + for _, trans := range p.transports { + if err := trans.Open(); err != nil { + return err + } + } + return nil +} + +// IsOpen returns true if the connections of the underlying transports are open +func (p *TMultiUDPTransport) IsOpen() bool { + for _, trans := range p.transports { + if open := trans.IsOpen(); !open { + return false + } + } + return true +} + +// Close closes the connections of the underlying transports +func (p *TMultiUDPTransport) Close() error { + for _, trans := range p.transports { + if err := trans.Close(); err != nil { + return err + } + } + return nil +} + +// Read is not supported for multiple underlying transports +func (p *TMultiUDPTransport) Read(buf []byte) (int, error) { + // Not applicable, required by TTransport however + return 0, fmt.Errorf("not supported") +} + +// RemainingBytes is not supported for multiple underlying transports +func (p *TMultiUDPTransport) RemainingBytes() uint64 { + // Not applicable, required by TTransport however + return 0 +} + +// Write writes specified buf to the write buffer of underlying transports +func (p *TMultiUDPTransport) Write(buff []byte) (int, error) { + n := 0 + for _, trans := range p.transports { + written, err := trans.Write(buff) + if err != nil { + return n, err + } + if written > n { + n = written + } + } + return n, nil +} + +// Flush flushes the write buffer of the underlying transports +func (p *TMultiUDPTransport) Flush() error { + for _, trans := range p.transports { + if err := trans.Flush(); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/uber-go/tally/m3/thriftudp/transport.go b/vendor/github.com/uber-go/tally/m3/thriftudp/transport.go new file mode 100644 index 00000000..613d6401 --- /dev/null +++ b/vendor/github.com/uber-go/tally/m3/thriftudp/transport.go @@ -0,0 +1,153 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thriftudp + +import ( + "bytes" + "net" + + "github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift" + + "go.uber.org/atomic" +) + +//MaxLength of UDP packet +const MaxLength = 65000 + +// TUDPTransport does UDP as a thrift.TTransport +type TUDPTransport struct { + conn *net.UDPConn + addr net.Addr + writeBuf bytes.Buffer + closed atomic.Bool +} + +// NewTUDPClientTransport creates a net.UDPConn-backed TTransport for Thrift clients +// All writes are buffered and flushed in one UDP packet. If locHostPort is not "", it +// will be used as the local address for the connection +// Example: +// trans, err := thriftudp.NewTUDPClientTransport("192.168.1.1:9090", "") +func NewTUDPClientTransport(destHostPort string, locHostPort string) (*TUDPTransport, error) { + destAddr, err := net.ResolveUDPAddr("udp", destHostPort) + if err != nil { + return nil, thrift.NewTTransportException(thrift.NOT_OPEN, err.Error()) + } + + var locAddr *net.UDPAddr + if locHostPort != "" { + locAddr, err = net.ResolveUDPAddr("udp", locHostPort) + if err != nil { + return nil, thrift.NewTTransportException(thrift.NOT_OPEN, err.Error()) + } + } + + conn, err := net.DialUDP(destAddr.Network(), locAddr, destAddr) + if err != nil { + return nil, thrift.NewTTransportException(thrift.NOT_OPEN, err.Error()) + } + + return &TUDPTransport{addr: destAddr, conn: conn}, nil +} + +// NewTUDPServerTransport creates a net.UDPConn-backed TTransport for Thrift servers +// It will listen for incoming udp packets on the specified host/port +// Example: +// trans, err := thriftudp.NewTUDPClientTransport("localhost:9001") +func NewTUDPServerTransport(hostPort string) (*TUDPTransport, error) { + addr, err := net.ResolveUDPAddr("udp", hostPort) + if err != nil { + return nil, thrift.NewTTransportException(thrift.NOT_OPEN, err.Error()) + } + conn, err := net.ListenUDP(addr.Network(), addr) + if err != nil { + return nil, thrift.NewTTransportException(thrift.NOT_OPEN, err.Error()) + } + return &TUDPTransport{addr: conn.LocalAddr(), conn: conn}, nil +} + +// Open does nothing as connection is opened on creation +// Required to maintain thrift.TTransport interface +func (p *TUDPTransport) Open() error { + return nil +} + +// Conn retrieves the underlying net.UDPConn +func (p *TUDPTransport) Conn() *net.UDPConn { + return p.conn +} + +// IsOpen returns true if the connection is open +func (p *TUDPTransport) IsOpen() bool { + return !p.closed.Load() +} + +// Close closes the transport and the underlying connection. +// Note: the current implementation allows Close to be called multiple times without an error. +func (p *TUDPTransport) Close() error { + if closed := p.closed.Swap(true); !closed { + return p.conn.Close() + } + return nil +} + +// Addr returns the address that the transport is listening on or writing to +func (p *TUDPTransport) Addr() net.Addr { + return p.addr +} + +// Read reads one UDP packet and puts it in the specified buf +func (p *TUDPTransport) Read(buf []byte) (int, error) { + if !p.IsOpen() { + return 0, thrift.NewTTransportException(thrift.NOT_OPEN, "Connection not open") + } + n, err := p.conn.Read(buf) + return n, thrift.NewTTransportExceptionFromError(err) +} + +// RemainingBytes returns the max number of bytes (same as Thrift's StreamTransport) as we +// do not know how many bytes we have left. +func (p *TUDPTransport) RemainingBytes() uint64 { + const maxSize = ^uint64(0) + return maxSize +} + +// Write writes specified buf to the write buffer +func (p *TUDPTransport) Write(buf []byte) (int, error) { + if !p.IsOpen() { + return 0, thrift.NewTTransportException(thrift.NOT_OPEN, "Connection not open") + } + if len(p.writeBuf.Bytes())+len(buf) > MaxLength { + return 0, thrift.NewTTransportException(thrift.INVALID_DATA, "Data does not fit within one UDP packet") + } + n, err := p.writeBuf.Write(buf) + return n, thrift.NewTTransportExceptionFromError(err) +} + +// Flush flushes the write buffer as one udp packet +func (p *TUDPTransport) Flush() error { + if !p.IsOpen() { + return thrift.NewTTransportException(thrift.NOT_OPEN, "Connection not open") + } + + _, err := p.conn.Write(p.writeBuf.Bytes()) + p.writeBuf.Reset() // always reset the buffer, even in case of an error + return err +} diff --git a/vendor/github.com/uber-go/tally/multi/README.md b/vendor/github.com/uber-go/tally/multi/README.md new file mode 100644 index 00000000..b8e67296 --- /dev/null +++ b/vendor/github.com/uber-go/tally/multi/README.md @@ -0,0 +1,13 @@ +# A buffered multi reporter + +Combine reporters to emit to many backends. + +Multiple `tally.StatsReporter` as a single reporter: +```go +reporter := NewMultiReporter(statsdReporter, ...) +``` + +Multiple `tally.CachedStatsReporter` as a single reporter: +```go +reporter := NewMultiCachedReporter(m3Reporter, promReporter, ...) +``` diff --git a/vendor/github.com/uber-go/tally/multi/reporter.go b/vendor/github.com/uber-go/tally/multi/reporter.go new file mode 100644 index 00000000..d6666697 --- /dev/null +++ b/vendor/github.com/uber-go/tally/multi/reporter.go @@ -0,0 +1,272 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package multi + +import ( + "time" + + "github.com/uber-go/tally" +) + +type multi struct { + multiBaseReporters multiBaseReporters + reporters []tally.StatsReporter +} + +// NewMultiReporter creates a new multi tally.StatsReporter. +func NewMultiReporter( + r ...tally.StatsReporter, +) tally.StatsReporter { + var baseReporters multiBaseReporters + for _, r := range r { + baseReporters = append(baseReporters, r) + } + return &multi{ + multiBaseReporters: baseReporters, + reporters: r, + } +} + +func (r *multi) ReportCounter( + name string, + tags map[string]string, + value int64, +) { + for _, r := range r.reporters { + r.ReportCounter(name, tags, value) + } +} + +func (r *multi) ReportGauge( + name string, + tags map[string]string, + value float64, +) { + for _, r := range r.reporters { + r.ReportGauge(name, tags, value) + } +} + +func (r *multi) ReportTimer( + name string, + tags map[string]string, + interval time.Duration, +) { + for _, r := range r.reporters { + r.ReportTimer(name, tags, interval) + } +} + +func (r *multi) ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets tally.Buckets, + bucketLowerBound, + bucketUpperBound float64, + samples int64, +) { + for _, r := range r.reporters { + r.ReportHistogramValueSamples(name, tags, buckets, + bucketLowerBound, bucketUpperBound, samples) + } +} + +func (r *multi) ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets tally.Buckets, + bucketLowerBound, + bucketUpperBound time.Duration, + samples int64, +) { + for _, r := range r.reporters { + r.ReportHistogramDurationSamples(name, tags, buckets, + bucketLowerBound, bucketUpperBound, samples) + } +} + +func (r *multi) Capabilities() tally.Capabilities { + return r.multiBaseReporters.Capabilities() +} + +func (r *multi) Flush() { + r.multiBaseReporters.Flush() +} + +type multiCached struct { + multiBaseReporters multiBaseReporters + reporters []tally.CachedStatsReporter +} + +// NewMultiCachedReporter creates a new multi tally.CachedStatsReporter. +func NewMultiCachedReporter( + r ...tally.CachedStatsReporter, +) tally.CachedStatsReporter { + var baseReporters multiBaseReporters + for _, r := range r { + baseReporters = append(baseReporters, r) + } + return &multiCached{ + multiBaseReporters: baseReporters, + reporters: r, + } +} + +func (r *multiCached) AllocateCounter( + name string, + tags map[string]string, +) tally.CachedCount { + metrics := make([]tally.CachedCount, 0, len(r.reporters)) + for _, r := range r.reporters { + metrics = append(metrics, r.AllocateCounter(name, tags)) + } + return multiMetric{counters: metrics} +} + +func (r *multiCached) AllocateGauge( + name string, + tags map[string]string, +) tally.CachedGauge { + metrics := make([]tally.CachedGauge, 0, len(r.reporters)) + for _, r := range r.reporters { + metrics = append(metrics, r.AllocateGauge(name, tags)) + } + return multiMetric{gauges: metrics} +} + +func (r *multiCached) AllocateTimer( + name string, + tags map[string]string, +) tally.CachedTimer { + metrics := make([]tally.CachedTimer, 0, len(r.reporters)) + for _, r := range r.reporters { + metrics = append(metrics, r.AllocateTimer(name, tags)) + } + return multiMetric{timers: metrics} +} + +func (r *multiCached) AllocateHistogram( + name string, + tags map[string]string, + buckets tally.Buckets, +) tally.CachedHistogram { + metrics := make([]tally.CachedHistogram, 0, len(r.reporters)) + for _, r := range r.reporters { + metrics = append(metrics, r.AllocateHistogram(name, tags, buckets)) + } + return multiMetric{histograms: metrics} +} + +func (r *multiCached) Capabilities() tally.Capabilities { + return r.multiBaseReporters.Capabilities() +} + +func (r *multiCached) Flush() { + r.multiBaseReporters.Flush() +} + +type multiMetric struct { + counters []tally.CachedCount + gauges []tally.CachedGauge + timers []tally.CachedTimer + histograms []tally.CachedHistogram +} + +func (m multiMetric) ReportCount(value int64) { + for _, m := range m.counters { + m.ReportCount(value) + } +} + +func (m multiMetric) ReportGauge(value float64) { + for _, m := range m.gauges { + m.ReportGauge(value) + } +} + +func (m multiMetric) ReportTimer(interval time.Duration) { + for _, m := range m.timers { + m.ReportTimer(interval) + } +} + +func (m multiMetric) ValueBucket( + bucketLowerBound, bucketUpperBound float64, +) tally.CachedHistogramBucket { + var multi []tally.CachedHistogramBucket + for _, m := range m.histograms { + multi = append(multi, + m.ValueBucket(bucketLowerBound, bucketUpperBound)) + } + return multiHistogramBucket{multi} +} + +func (m multiMetric) DurationBucket( + bucketLowerBound, bucketUpperBound time.Duration, +) tally.CachedHistogramBucket { + var multi []tally.CachedHistogramBucket + for _, m := range m.histograms { + multi = append(multi, + m.DurationBucket(bucketLowerBound, bucketUpperBound)) + } + return multiHistogramBucket{multi} +} + +type multiHistogramBucket struct { + multi []tally.CachedHistogramBucket +} + +func (m multiHistogramBucket) ReportSamples(value int64) { + for _, m := range m.multi { + m.ReportSamples(value) + } +} + +type multiBaseReporters []tally.BaseStatsReporter + +func (r multiBaseReporters) Capabilities() tally.Capabilities { + c := &capabilities{reporting: true, tagging: true} + for _, r := range r { + c.reporting = c.reporting && r.Capabilities().Reporting() + c.tagging = c.tagging && r.Capabilities().Tagging() + } + return c +} + +func (r multiBaseReporters) Flush() { + for _, r := range r { + r.Flush() + } +} + +type capabilities struct { + reporting bool + tagging bool + histograms bool +} + +func (c *capabilities) Reporting() bool { + return c.reporting +} + +func (c *capabilities) Tagging() bool { + return c.tagging +} diff --git a/vendor/github.com/uber-go/tally/pool.go b/vendor/github.com/uber-go/tally/pool.go new file mode 100644 index 00000000..e95c140f --- /dev/null +++ b/vendor/github.com/uber-go/tally/pool.go @@ -0,0 +1,63 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +// ObjectPool is an minimalistic object pool to avoid +// any circular dependencies on any other object pool. +type ObjectPool struct { + values chan interface{} + alloc func() interface{} +} + +// NewObjectPool creates a new pool. +func NewObjectPool(size int) *ObjectPool { + return &ObjectPool{ + values: make(chan interface{}, size), + } +} + +// Init initializes the object pool. +func (p *ObjectPool) Init(alloc func() interface{}) { + p.alloc = alloc + + for i := 0; i < cap(p.values); i++ { + p.values <- p.alloc() + } +} + +// Get gets an object from the pool. +func (p *ObjectPool) Get() interface{} { + var v interface{} + select { + case v = <-p.values: + default: + v = p.alloc() + } + return v +} + +// Put puts an object back to the pool. +func (p *ObjectPool) Put(obj interface{}) { + select { + case p.values <- obj: + default: + } +} diff --git a/vendor/github.com/uber-go/tally/prometheus/README.md b/vendor/github.com/uber-go/tally/prometheus/README.md new file mode 100644 index 00000000..3f6fdad2 --- /dev/null +++ b/vendor/github.com/uber-go/tally/prometheus/README.md @@ -0,0 +1,118 @@ +# A buffered Prometheus reporter + +See `examples/prometheus_main.go` for an end to end example. + +## Options + +You can use a specific Prometheus registry, and you can use +either summaries or histograms for timers. + +The reporter options are: + +```go +// Options is a set of options for the tally reporter. +type Options struct { + // Registerer is the prometheus registerer to register + // metrics with. Use nil to specify the default registerer. + Registerer prom.Registerer + + // DefaultTimerType is the default type timer type to create + // when using timers. It's default value is a histogram timer type. + DefaultTimerType TimerType + + // DefaultHistogramBuckets is the default histogram buckets + // to use. Use nil to specify the default histogram buckets. + DefaultHistogramBuckets []float64 + + // DefaultSummaryObjectives is the default summary objectives + // to use. Use nil to specify the default summary objectives. + DefaultSummaryObjectives map[float64]float64 + + // OnRegisterError defines a method to call to when registering + // a metric with the registerer fails. Use nil to specify + // to panic by default when registering a metric fails. + OnRegisterError func(err error) +} +``` + +The timer types are: + +```go +// TimerType describes a type of timer +type TimerType int + +const ( + // SummaryTimerType is a timer type that reports into a summary + SummaryTimerType TimerType = iota + + // HistogramTimerType is a timer type that reports into a histogram + HistogramTimerType +) +``` + +You can also pre-register help description text ahead of using a metric +that will be named and tagged identically with `tally`. You can also +access the Prometheus HTTP handler directly. + +The returned reporter interface: + +```go +// Reporter is a Prometheus backed tally reporter. +type Reporter interface { + tally.CachedStatsReporter + + // HTTPHandler provides the Prometheus HTTP scrape handler. + HTTPHandler() http.Handler + + // RegisterCounter is a helper method to initialize a counter + // in the Prometheus backend with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + RegisterCounter( + name string, + tagKeys []string, + desc string, + ) (*prom.CounterVec, error) + + // RegisterGauge is a helper method to initialize a gauge + // in the prometheus backend with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + RegisterGauge( + name string, + tagKeys []string, + desc string, + ) (*prom.GaugeVec, error) + + // RegisterTimer is a helper method to initialize a timer + // summary or histogram vector in the prometheus backend + // with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + // You may pass opts as nil to get the default timer type + // and objectives/buckets. + // You may also pass objectives/buckets as nil in opts to + // get the default objectives/buckets for the specified + // timer type. + RegisterTimer( + name string, + tagKeys []string, + desc string, + opts *RegisterTimerOptions, + ) (TimerUnion, error) +} +``` + +The register timer options: + +```go +// RegisterTimerOptions provides options when registering a timer on demand. +// By default you can pass nil for the options to get the reporter defaults. +type RegisterTimerOptions struct { + TimerType TimerType + HistogramBuckets []float64 + SummaryObjectives map[float64]float64 +} +``` + + diff --git a/vendor/github.com/uber-go/tally/prometheus/config.go b/vendor/github.com/uber-go/tally/prometheus/config.go new file mode 100644 index 00000000..97e1df82 --- /dev/null +++ b/vendor/github.com/uber-go/tally/prometheus/config.go @@ -0,0 +1,158 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package prometheus + +import ( + "fmt" + "log" + "net/http" + "os" + "strings" + + prom "github.com/m3db/prometheus_client_golang/prometheus" +) + +// Configuration is a configuration for a Prometheus reporter. +type Configuration struct { + // HandlerPath if specified will be used instead of using the default + // HTTP handler path "/metrics". + HandlerPath string `yaml:"handlerPath"` + + // ListenAddress if specified will be used instead of just registering the + // handler on the default HTTP serve mux without listening. + ListenAddress string `yaml:"listenAddress"` + + // TimerType is the default Prometheus type to use for Tally timers. + TimerType string `yaml:"timerType"` + + // DefaultHistogramBuckets if specified will set the default histogram + // buckets to be used by the reporter. + DefaultHistogramBuckets []HistogramObjective `yaml:"defaultHistogramBuckets"` + + // DefaultSummaryObjectives if specified will set the default summary + // objectives to be used by the reporter. + DefaultSummaryObjectives []SummaryObjective `yaml:"defaultSummaryObjectives"` + + // OnError specifies what to do when an error either with listening + // on the specified listen address or registering a metric with the + // Prometheus. By default the registerer will panic. + OnError string `yaml:"onError"` +} + +// HistogramObjective is a Prometheus histogram bucket. +// See: https://godoc.org/github.com/prometheus/client_golang/prometheus#HistogramOpts +type HistogramObjective struct { + Upper float64 `yaml:"upper"` +} + +// SummaryObjective is a Prometheus summary objective. +// See: https://godoc.org/github.com/prometheus/client_golang/prometheus#SummaryOpts +type SummaryObjective struct { + Percentile float64 `yaml:"percentile"` + AllowedError float64 `yaml:"allowedError"` +} + +// ConfigurationOptions allows some programatic options, such as using a +// specific registry and what error callback to register. +type ConfigurationOptions struct { + // Registry if not nil will specify the specific registry to use + // for registering metrics. + Registry *prom.Registry + // OnError allows for customization of what to do when a metric + // registration error fails, the default is to panic. + OnError func(e error) +} + +// NewReporter creates a new M3 reporter from this configuration. +func (c Configuration) NewReporter( + configOpts ConfigurationOptions, +) (Reporter, error) { + var opts Options + + if configOpts.Registry != nil { + opts.Registerer = configOpts.Registry + } + + if configOpts.OnError != nil { + opts.OnRegisterError = configOpts.OnError + } else { + switch c.OnError { + case "stderr": + opts.OnRegisterError = func(err error) { + fmt.Fprintf(os.Stderr, "tally prometheus reporter error: %v\n", err) + } + case "log": + opts.OnRegisterError = func(err error) { + log.Printf("tally prometheus reporter error: %v\n", err) + } + case "none": + opts.OnRegisterError = func(err error) {} + default: + opts.OnRegisterError = func(err error) { + panic(err) + } + } + } + + switch c.TimerType { + case "summary": + opts.DefaultTimerType = SummaryTimerType + case "histogram": + opts.DefaultTimerType = HistogramTimerType + } + + if len(c.DefaultHistogramBuckets) > 0 { + var values []float64 + for _, value := range c.DefaultHistogramBuckets { + values = append(values, value.Upper) + } + opts.DefaultHistogramBuckets = values + } + + if len(c.DefaultSummaryObjectives) > 0 { + values := make(map[float64]float64) + for _, value := range c.DefaultSummaryObjectives { + values[value.Percentile] = value.AllowedError + } + opts.DefaultSummaryObjectives = values + } + + reporter := NewReporter(opts) + + path := "/metrics" + if handlerPath := strings.TrimSpace(c.HandlerPath); handlerPath != "" { + path = handlerPath + } + + if addr := strings.TrimSpace(c.ListenAddress); addr == "" { + http.Handle(path, reporter.HTTPHandler()) + } else { + mux := http.NewServeMux() + mux.Handle(path, reporter.HTTPHandler()) + go func() { + if err := http.ListenAndServe(addr, mux); err != nil { + opts.OnRegisterError(err) + } + }() + } + + return reporter, nil +} diff --git a/vendor/github.com/uber-go/tally/prometheus/reporter.go b/vendor/github.com/uber-go/tally/prometheus/reporter.go new file mode 100644 index 00000000..066794e2 --- /dev/null +++ b/vendor/github.com/uber-go/tally/prometheus/reporter.go @@ -0,0 +1,610 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package prometheus + +import ( + "net/http" + "strings" + "sync" + "time" + + prom "github.com/m3db/prometheus_client_golang/prometheus" + "github.com/m3db/prometheus_client_golang/prometheus/promhttp" + "github.com/pkg/errors" + "github.com/uber-go/tally" +) + +const ( + // DefaultSeparator is the default separator that should be used with + // a tally scope for a prometheus reporter. + DefaultSeparator = "_" +) + +var ( + errUnknownTimerType = errors.New("unknown metric timer type") + ms = float64(time.Millisecond) / float64(time.Second) +) + +// DefaultHistogramBuckets is the default histogram buckets used when +// creating a new Histogram in the prometheus registry. +// See: https://godoc.org/github.com/prometheus/client_golang/prometheus#HistogramOpts +func DefaultHistogramBuckets() []float64 { + return []float64{ + ms, + 2 * ms, + 5 * ms, + 10 * ms, + 20 * ms, + 50 * ms, + 100 * ms, + 200 * ms, + 500 * ms, + 1000 * ms, + 2000 * ms, + 5000 * ms, + 10000 * ms, + } +} + +// DefaultSummaryObjectives is the default objectives used when +// creating a new Summary in the prometheus registry. +// See: https://godoc.org/github.com/prometheus/client_golang/prometheus#SummaryOpts +func DefaultSummaryObjectives() map[float64]float64 { + return map[float64]float64{ + 0.5: 0.01, + 0.75: 0.001, + 0.95: 0.001, + 0.99: 0.001, + 0.999: 0.0001, + } +} + +// Reporter is a Prometheus backed tally reporter. +type Reporter interface { + tally.CachedStatsReporter + + // HTTPHandler provides the Prometheus HTTP scrape handler. + HTTPHandler() http.Handler + + // RegisterCounter is a helper method to initialize a counter + // in the Prometheus backend with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + RegisterCounter( + name string, + tagKeys []string, + desc string, + ) (*prom.CounterVec, error) + + // RegisterGauge is a helper method to initialize a gauge + // in the prometheus backend with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + RegisterGauge( + name string, + tagKeys []string, + desc string, + ) (*prom.GaugeVec, error) + + // RegisterTimer is a helper method to initialize a timer + // summary or histogram vector in the prometheus backend + // with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + // You may pass opts as nil to get the default timer type + // and objectives/buckets. + // You may also pass objectives/buckets as nil in opts to + // get the default objectives/buckets for the specified + // timer type. + RegisterTimer( + name string, + tagKeys []string, + desc string, + opts *RegisterTimerOptions, + ) (TimerUnion, error) +} + +// RegisterTimerOptions provides options when registering a timer on demand. +// By default you can pass nil for the options to get the reporter defaults. +type RegisterTimerOptions struct { + TimerType TimerType + HistogramBuckets []float64 + SummaryObjectives map[float64]float64 +} + +// TimerUnion is a representation of either a summary or a histogram +// described by the TimerType. +type TimerUnion struct { + TimerType TimerType + Histogram *prom.HistogramVec + Summary *prom.SummaryVec +} + +type metricID string + +type reporter struct { + sync.RWMutex + registerer prom.Registerer + gatherer prom.Gatherer + timerType TimerType + objectives map[float64]float64 + buckets []float64 + onRegisterError func(e error) + counters map[metricID]*prom.CounterVec + gauges map[metricID]*prom.GaugeVec + timers map[metricID]*promTimerVec + histograms map[metricID]*prom.HistogramVec +} + +type promTimerVec struct { + summary *prom.SummaryVec + histogram *prom.HistogramVec +} + +type cachedMetric struct { + counter prom.Counter + gauge prom.Gauge + reportTimer func(d time.Duration) + histogram prom.Histogram + summary prom.Summary +} + +func (m *cachedMetric) ReportCount(value int64) { + m.counter.Add(float64(value)) +} + +func (m *cachedMetric) ReportGauge(value float64) { + m.gauge.Set(value) +} + +func (m *cachedMetric) ReportTimer(interval time.Duration) { + m.reportTimer(interval) +} + +func (m *cachedMetric) reportTimerHistogram(interval time.Duration) { + m.histogram.Observe(float64(interval) / float64(time.Second)) +} + +func (m *cachedMetric) reportTimerSummary(interval time.Duration) { + m.summary.Observe(float64(interval) / float64(time.Second)) +} + +func (m *cachedMetric) ValueBucket( + bucketLowerBound, bucketUpperBound float64, +) tally.CachedHistogramBucket { + return cachedHistogramBucket{m, bucketUpperBound} +} + +func (m *cachedMetric) DurationBucket( + bucketLowerBound, bucketUpperBound time.Duration, +) tally.CachedHistogramBucket { + upperBound := float64(bucketUpperBound) / float64(time.Second) + return cachedHistogramBucket{m, upperBound} +} + +type cachedHistogramBucket struct { + metric *cachedMetric + upperBound float64 +} + +func (b cachedHistogramBucket) ReportSamples(value int64) { + for i := int64(0); i < value; i++ { + b.metric.histogram.Observe(b.upperBound) + } +} + +type noopMetric struct{} + +func (m noopMetric) ReportCount(value int64) {} +func (m noopMetric) ReportGauge(value float64) {} +func (m noopMetric) ReportTimer(interval time.Duration) {} +func (m noopMetric) ReportSamples(value int64) {} +func (m noopMetric) ValueBucket(lower, upper float64) tally.CachedHistogramBucket { + return m +} +func (m noopMetric) DurationBucket(lower, upper time.Duration) tally.CachedHistogramBucket { + return m +} + +func (r *reporter) HTTPHandler() http.Handler { + return promhttp.HandlerFor(r.gatherer, promhttp.HandlerOpts{}) +} + +// TimerType describes a type of timer +type TimerType int + +const ( + // SummaryTimerType is a timer type that reports into a summary + SummaryTimerType TimerType = iota + + // HistogramTimerType is a timer type that reports into a histogram + HistogramTimerType +) + +// Options is a set of options for the tally reporter. +type Options struct { + // Registerer is the prometheus registerer to register + // metrics with. Use nil to specify the default registerer. + Registerer prom.Registerer + + // Gatherer is the prometheus gatherer to gather + // metrics with. Use nil to specify the default gatherer. + Gatherer prom.Gatherer + + // DefaultTimerType is the default type timer type to create + // when using timers. It's default value is a summary timer type. + DefaultTimerType TimerType + + // DefaultHistogramBuckets is the default histogram buckets + // to use. Use nil to specify the default histogram buckets. + DefaultHistogramBuckets []float64 + + // DefaultSummaryObjectives is the default summary objectives + // to use. Use nil to specify the default summary objectives. + DefaultSummaryObjectives map[float64]float64 + + // OnRegisterError defines a method to call to when registering + // a metric with the registerer fails. Use nil to specify + // to panic by default when registering fails. + OnRegisterError func(err error) +} + +// NewReporter returns a new Reporter for Prometheus client backed metrics +// objectives is the objectives used when creating a new Summary histogram for Timers. See +// https://godoc.org/github.com/prometheus/client_golang/prometheus#SummaryOpts for more details. +func NewReporter(opts Options) Reporter { + if opts.Registerer == nil { + opts.Registerer = prom.DefaultRegisterer + } else { + // A specific registerer was set, check if it's a registry and if + // no gatherer was set, then use that as the gatherer + if reg, ok := opts.Registerer.(*prom.Registry); ok && opts.Gatherer == nil { + opts.Gatherer = reg + } + } + if opts.Gatherer == nil { + opts.Gatherer = prom.DefaultGatherer + } + if opts.DefaultHistogramBuckets == nil { + opts.DefaultHistogramBuckets = DefaultHistogramBuckets() + } + if opts.DefaultSummaryObjectives == nil { + opts.DefaultSummaryObjectives = DefaultSummaryObjectives() + } + if opts.OnRegisterError == nil { + opts.OnRegisterError = func(err error) { + // n.b. Because our forked Prometheus client does not actually emit + // this message as a concrete error type (it uses fmt.Errorf), + // we need to check the error message. + if strings.Contains(err.Error(), "previously registered") { + err = errors.WithMessagef( + err, + "potential tally.Scope() vs Prometheus usage contract mismatch: "+ + "if this occurs after using Scope.Tagged(), different metric "+ + "names must be used than were registered with the parent scope", + ) + } + + panic(err) + } + } + + return &reporter{ + registerer: opts.Registerer, + gatherer: opts.Gatherer, + timerType: opts.DefaultTimerType, + buckets: opts.DefaultHistogramBuckets, + objectives: opts.DefaultSummaryObjectives, + onRegisterError: opts.OnRegisterError, + counters: make(map[metricID]*prom.CounterVec), + gauges: make(map[metricID]*prom.GaugeVec), + timers: make(map[metricID]*promTimerVec), + } +} + +func (r *reporter) RegisterCounter( + name string, + tagKeys []string, + desc string, +) (*prom.CounterVec, error) { + return r.counterVec(name, tagKeys, desc) +} + +func (r *reporter) counterVec( + name string, + tagKeys []string, + desc string, +) (*prom.CounterVec, error) { + id := canonicalMetricID(name, tagKeys) + + r.Lock() + defer r.Unlock() + + if ctr, ok := r.counters[id]; ok { + return ctr, nil + } + + ctr := prom.NewCounterVec( + prom.CounterOpts{ + Name: name, + Help: desc, + }, + tagKeys, + ) + + if err := r.registerer.Register(ctr); err != nil { + return nil, err + } + + r.counters[id] = ctr + return ctr, nil +} + +// AllocateCounter implements tally.CachedStatsReporter. +func (r *reporter) AllocateCounter(name string, tags map[string]string) tally.CachedCount { + tagKeys := keysFromMap(tags) + counterVec, err := r.counterVec(name, tagKeys, name+" counter") + if err != nil { + r.onRegisterError(err) + return noopMetric{} + } + return &cachedMetric{counter: counterVec.With(tags)} +} + +func (r *reporter) RegisterGauge( + name string, + tagKeys []string, + desc string, +) (*prom.GaugeVec, error) { + return r.gaugeVec(name, tagKeys, desc) +} + +func (r *reporter) gaugeVec( + name string, + tagKeys []string, + desc string, +) (*prom.GaugeVec, error) { + id := canonicalMetricID(name, tagKeys) + + r.Lock() + defer r.Unlock() + + if g, ok := r.gauges[id]; ok { + return g, nil + } + + g := prom.NewGaugeVec( + prom.GaugeOpts{ + Name: name, + Help: desc, + }, + tagKeys, + ) + + if err := r.registerer.Register(g); err != nil { + return nil, err + } + + r.gauges[id] = g + return g, nil +} + +// AllocateGauge implements tally.CachedStatsReporter. +func (r *reporter) AllocateGauge(name string, tags map[string]string) tally.CachedGauge { + tagKeys := keysFromMap(tags) + gaugeVec, err := r.gaugeVec(name, tagKeys, name+" gauge") + if err != nil { + r.onRegisterError(err) + return noopMetric{} + } + return &cachedMetric{gauge: gaugeVec.With(tags)} +} + +func (r *reporter) RegisterTimer( + name string, + tagKeys []string, + desc string, + opts *RegisterTimerOptions, +) (TimerUnion, error) { + timerType, buckets, objectives := r.timerConfig(opts) + switch timerType { + case HistogramTimerType: + h, err := r.histogramVec(name, tagKeys, desc, buckets) + return TimerUnion{TimerType: timerType, Histogram: h}, err + case SummaryTimerType: + s, err := r.summaryVec(name, tagKeys, desc, objectives) + return TimerUnion{TimerType: timerType, Summary: s}, err + } + return TimerUnion{}, errUnknownTimerType +} + +func (r *reporter) timerConfig( + opts *RegisterTimerOptions, +) ( + timerType TimerType, + buckets []float64, + objectives map[float64]float64, +) { + timerType = r.timerType + objectives = r.objectives + buckets = r.buckets + if opts != nil { + timerType = opts.TimerType + if opts.SummaryObjectives != nil { + objectives = opts.SummaryObjectives + } + if opts.HistogramBuckets != nil { + buckets = opts.HistogramBuckets + } + } + return +} + +func (r *reporter) summaryVec( + name string, + tagKeys []string, + desc string, + objectives map[float64]float64, +) (*prom.SummaryVec, error) { + id := canonicalMetricID(name, tagKeys) + + r.Lock() + defer r.Unlock() + + if s, ok := r.timers[id]; ok { + return s.summary, nil + } + + s := prom.NewSummaryVec( + prom.SummaryOpts{ + Name: name, + Help: desc, + Objectives: objectives, + }, + tagKeys, + ) + + if err := r.registerer.Register(s); err != nil { + return nil, err + } + + r.timers[id] = &promTimerVec{summary: s} + return s, nil +} + +func (r *reporter) histogramVec( + name string, + tagKeys []string, + desc string, + buckets []float64, +) (*prom.HistogramVec, error) { + id := canonicalMetricID(name, tagKeys) + + r.Lock() + defer r.Unlock() + + if h, ok := r.timers[id]; ok { + return h.histogram, nil + } + + h := prom.NewHistogramVec( + prom.HistogramOpts{ + Name: name, + Help: desc, + Buckets: buckets, + }, + tagKeys, + ) + + if err := r.registerer.Register(h); err != nil { + return nil, err + } + + r.timers[id] = &promTimerVec{histogram: h} + return h, nil +} + +// AllocateTimer implements tally.CachedStatsReporter. +func (r *reporter) AllocateTimer(name string, tags map[string]string) tally.CachedTimer { + var ( + timer tally.CachedTimer + err error + ) + tagKeys := keysFromMap(tags) + timerType, buckets, objectives := r.timerConfig(nil) + switch timerType { + case HistogramTimerType: + var histogramVec *prom.HistogramVec + histogramVec, err = r.histogramVec(name, tagKeys, name+" histogram", buckets) + if err == nil { + t := &cachedMetric{histogram: histogramVec.With(tags)} + t.reportTimer = t.reportTimerHistogram + timer = t + } + case SummaryTimerType: + var summaryVec *prom.SummaryVec + summaryVec, err = r.summaryVec(name, tagKeys, name+" summary", objectives) + if err == nil { + t := &cachedMetric{summary: summaryVec.With(tags)} + t.reportTimer = t.reportTimerSummary + timer = t + } + default: + err = errUnknownTimerType + } + if err != nil { + r.onRegisterError(err) + return noopMetric{} + } + return timer +} + +func (r *reporter) AllocateHistogram( + name string, + tags map[string]string, + buckets tally.Buckets, +) tally.CachedHistogram { + tagKeys := keysFromMap(tags) + histogramVec, err := r.histogramVec(name, tagKeys, name+" histogram", buckets.AsValues()) + if err != nil { + r.onRegisterError(err) + return noopMetric{} + } + return &cachedMetric{histogram: histogramVec.With(tags)} +} + +func (r *reporter) Capabilities() tally.Capabilities { + return r +} + +func (r *reporter) Reporting() bool { + return true +} + +func (r *reporter) Tagging() bool { + return true +} + +// Flush does nothing for prometheus +func (r *reporter) Flush() {} + +var metricIDKeyValue = "1" + +// NOTE: this generates a canonical MetricID for a given name+label keys, +// not values. This omits label values, as we track metrics as +// Vectors in order to support on-the-fly label changes. +func canonicalMetricID(name string, tagKeys []string) metricID { + keySet := make(map[string]string, len(tagKeys)) + for _, key := range tagKeys { + keySet[key] = metricIDKeyValue + } + return metricID(tally.KeyForPrefixedStringMap(name, keySet)) +} + +func keysFromMap(m map[string]string) []string { + labelKeys := make([]string, len(m)) + i := 0 + for k := range m { + labelKeys[i] = k + i++ + } + return labelKeys +} diff --git a/vendor/github.com/uber-go/tally/prometheus/sanitize.go b/vendor/github.com/uber-go/tally/prometheus/sanitize.go new file mode 100644 index 00000000..9a1d4864 --- /dev/null +++ b/vendor/github.com/uber-go/tally/prometheus/sanitize.go @@ -0,0 +1,44 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package prometheus + +import ( + "github.com/uber-go/tally" +) + +var ( + // DefaultSanitizerOpts are the options for the default Prometheus sanitizer. + DefaultSanitizerOpts = tally.SanitizeOptions{ + NameCharacters: tally.ValidCharacters{ + Ranges: tally.AlphanumericRange, + Characters: tally.UnderscoreCharacters, + }, + KeyCharacters: tally.ValidCharacters{ + Ranges: tally.AlphanumericRange, + Characters: tally.UnderscoreCharacters, + }, + ValueCharacters: tally.ValidCharacters{ + Ranges: tally.AlphanumericRange, + Characters: tally.UnderscoreCharacters, + }, + ReplacementCharacter: tally.DefaultReplacementCharacter, + } +) diff --git a/vendor/github.com/uber-go/tally/reporter.go b/vendor/github.com/uber-go/tally/reporter.go new file mode 100644 index 00000000..52e86e39 --- /dev/null +++ b/vendor/github.com/uber-go/tally/reporter.go @@ -0,0 +1,140 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import "time" + +// BaseStatsReporter implements the shared reporter methods. +type BaseStatsReporter interface { + // Capabilities returns the capabilities description of the reporter. + Capabilities() Capabilities + + // Flush asks the reporter to flush all reported values. + Flush() +} + +// StatsReporter is a backend for Scopes to report metrics to. +type StatsReporter interface { + BaseStatsReporter + + // ReportCounter reports a counter value + ReportCounter( + name string, + tags map[string]string, + value int64, + ) + + // ReportGauge reports a gauge value + ReportGauge( + name string, + tags map[string]string, + value float64, + ) + + // ReportTimer reports a timer value + ReportTimer( + name string, + tags map[string]string, + interval time.Duration, + ) + + // ReportHistogramValueSamples reports histogram samples for a bucket + ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound float64, + samples int64, + ) + + // ReportHistogramDurationSamples reports histogram samples for a bucket + ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound time.Duration, + samples int64, + ) +} + +// CachedStatsReporter is a backend for Scopes that pre allocates all +// counter, gauges, timers & histograms. This is harder to implement but more performant. +type CachedStatsReporter interface { + BaseStatsReporter + + // AllocateCounter pre allocates a counter data structure with name & tags. + AllocateCounter( + name string, + tags map[string]string, + ) CachedCount + + // AllocateGauge pre allocates a gauge data structure with name & tags. + AllocateGauge( + name string, + tags map[string]string, + ) CachedGauge + + // AllocateTimer pre allocates a timer data structure with name & tags. + AllocateTimer( + name string, + tags map[string]string, + ) CachedTimer + + // AllocateHistogram pre allocates a histogram data structure with name, tags, + // value buckets and duration buckets. + AllocateHistogram( + name string, + tags map[string]string, + buckets Buckets, + ) CachedHistogram +} + +// CachedCount interface for reporting an individual counter +type CachedCount interface { + ReportCount(value int64) +} + +// CachedGauge interface for reporting an individual gauge +type CachedGauge interface { + ReportGauge(value float64) +} + +// CachedTimer interface for reporting an individual timer +type CachedTimer interface { + ReportTimer(interval time.Duration) +} + +// CachedHistogram interface for reporting histogram samples to buckets +type CachedHistogram interface { + ValueBucket( + bucketLowerBound, bucketUpperBound float64, + ) CachedHistogramBucket + DurationBucket( + bucketLowerBound, bucketUpperBound time.Duration, + ) CachedHistogramBucket +} + +// CachedHistogramBucket interface for reporting histogram samples to a specific bucket +type CachedHistogramBucket interface { + ReportSamples(value int64) +} diff --git a/vendor/github.com/uber-go/tally/sanitize.go b/vendor/github.com/uber-go/tally/sanitize.go new file mode 100644 index 00000000..eb903616 --- /dev/null +++ b/vendor/github.com/uber-go/tally/sanitize.go @@ -0,0 +1,176 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "bytes" +) + +var ( + // DefaultReplacementCharacter is the default character used for + // replacements. + DefaultReplacementCharacter = '_' + + // AlphanumericRange is the range of alphanumeric characters. + AlphanumericRange = []SanitizeRange{ + {rune('a'), rune('z')}, + {rune('A'), rune('Z')}, + {rune('0'), rune('9')}} + + // UnderscoreCharacters is just an underscore character. + UnderscoreCharacters = []rune{ + '_'} + + // UnderscoreDashCharacters is a slice of underscore, and + // dash characters. + UnderscoreDashCharacters = []rune{ + '-', + '_'} + + // UnderscoreDashDotCharacters is a slice of underscore, + // dash, and dot characters. + UnderscoreDashDotCharacters = []rune{ + '.', + '-', + '_'} +) + +// SanitizeFn returns a sanitized version of the input string. +type SanitizeFn func(string) string + +// SanitizeRange is a range of characters (inclusive on both ends). +type SanitizeRange [2]rune + +// ValidCharacters is a collection of valid characters. +type ValidCharacters struct { + Ranges []SanitizeRange + Characters []rune +} + +// SanitizeOptions are the set of configurable options for sanitisation. +type SanitizeOptions struct { + NameCharacters ValidCharacters + KeyCharacters ValidCharacters + ValueCharacters ValidCharacters + ReplacementCharacter rune +} + +// Sanitizer sanitizes the provided input based on the function executed. +type Sanitizer interface { + // Name sanitizes the provided `name` string. + Name(n string) string + + // Key sanitizes the provided `key` string. + Key(k string) string + + // Value sanitizes the provided `value` string. + Value(v string) string +} + +// NewSanitizer returns a new sanitizer based on provided options. +func NewSanitizer(opts SanitizeOptions) Sanitizer { + return sanitizer{ + nameFn: opts.NameCharacters.sanitizeFn(opts.ReplacementCharacter), + keyFn: opts.KeyCharacters.sanitizeFn(opts.ReplacementCharacter), + valueFn: opts.ValueCharacters.sanitizeFn(opts.ReplacementCharacter), + } +} + +// NoOpSanitizeFn returns the input un-touched. +func NoOpSanitizeFn(v string) string { return v } + +// NewNoOpSanitizer returns a sanitizer which returns all inputs un-touched. +func NewNoOpSanitizer() Sanitizer { + return sanitizer{ + nameFn: NoOpSanitizeFn, + keyFn: NoOpSanitizeFn, + valueFn: NoOpSanitizeFn, + } +} + +type sanitizer struct { + nameFn SanitizeFn + keyFn SanitizeFn + valueFn SanitizeFn +} + +func (s sanitizer) Name(n string) string { + return s.nameFn(n) +} + +func (s sanitizer) Key(k string) string { + return s.keyFn(k) +} + +func (s sanitizer) Value(v string) string { + return s.valueFn(v) +} + +func (c *ValidCharacters) sanitizeFn(repChar rune) SanitizeFn { + return func(value string) string { + var buf *bytes.Buffer + for idx, ch := range value { + // first check if the provided character is valid + validCurr := false + for i := 0; !validCurr && i < len(c.Ranges); i++ { + if ch >= c.Ranges[i][0] && ch <= c.Ranges[i][1] { + validCurr = true + break + } + } + for i := 0; !validCurr && i < len(c.Characters); i++ { + if c.Characters[i] == ch { + validCurr = true + break + } + } + + // if it's valid, we can optimise allocations by avoiding copying + if validCurr { + if buf == nil { + continue // haven't deviated from string, still no need to init buffer + } + buf.WriteRune(ch) // we've deviated from string, write to buffer + continue + } + + // ie the character is invalid, and the buffer has not been initialised + // so we initialise buffer and backfill + if buf == nil { + buf = bytes.NewBuffer(make([]byte, 0, len(value))) + if idx > 0 { + buf.WriteString(value[:idx]) + } + } + + // write the replacement character + buf.WriteRune(repChar) + } + + // return input un-touched if the buffer has been not initialised + if buf == nil { + return value + } + + // otherwise, return the newly constructed buffer + return buf.String() + } +} diff --git a/vendor/github.com/uber-go/tally/scope.go b/vendor/github.com/uber-go/tally/scope.go new file mode 100644 index 00000000..40092fe7 --- /dev/null +++ b/vendor/github.com/uber-go/tally/scope.go @@ -0,0 +1,796 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "fmt" + "io" + "sync" + "time" +) + +var ( + // NoopScope is a scope that does nothing + NoopScope, _ = NewRootScope(ScopeOptions{Reporter: NullStatsReporter}, 0) + // DefaultSeparator is the default separator used to join nested scopes + DefaultSeparator = "." + + globalNow = time.Now + + defaultScopeBuckets = DurationBuckets{ + 0 * time.Millisecond, + 10 * time.Millisecond, + 25 * time.Millisecond, + 50 * time.Millisecond, + 75 * time.Millisecond, + 100 * time.Millisecond, + 200 * time.Millisecond, + 300 * time.Millisecond, + 400 * time.Millisecond, + 500 * time.Millisecond, + 600 * time.Millisecond, + 800 * time.Millisecond, + 1 * time.Second, + 2 * time.Second, + 5 * time.Second, + } +) + +type scope struct { + separator string + prefix string + tags map[string]string + reporter StatsReporter + cachedReporter CachedStatsReporter + baseReporter BaseStatsReporter + defaultBuckets Buckets + sanitizer Sanitizer + + registry *scopeRegistry + status scopeStatus + + cm sync.RWMutex + gm sync.RWMutex + tm sync.RWMutex + hm sync.RWMutex + + counters map[string]*counter + gauges map[string]*gauge + timers map[string]*timer + histograms map[string]*histogram +} + +type scopeStatus struct { + sync.RWMutex + closed bool + quit chan struct{} +} + +type scopeRegistry struct { + sync.RWMutex + subscopes map[string]*scope +} + +var scopeRegistryKey = KeyForPrefixedStringMap + +// ScopeOptions is a set of options to construct a scope. +type ScopeOptions struct { + Tags map[string]string + Prefix string + Reporter StatsReporter + CachedReporter CachedStatsReporter + Separator string + DefaultBuckets Buckets + SanitizeOptions *SanitizeOptions +} + +// NewRootScope creates a new root Scope with a set of options and +// a reporting interval. +// Must provide either a StatsReporter or a CachedStatsReporter. +func NewRootScope(opts ScopeOptions, interval time.Duration) (Scope, io.Closer) { + s := newRootScope(opts, interval) + return s, s +} + +// NewTestScope creates a new Scope without a stats reporter with the +// given prefix and adds the ability to take snapshots of metrics emitted +// to it. +func NewTestScope( + prefix string, + tags map[string]string, +) TestScope { + return newRootScope(ScopeOptions{Prefix: prefix, Tags: tags}, 0) +} + +func newRootScope(opts ScopeOptions, interval time.Duration) *scope { + sanitizer := NewNoOpSanitizer() + if o := opts.SanitizeOptions; o != nil { + sanitizer = NewSanitizer(*o) + } + + if opts.Tags == nil { + opts.Tags = make(map[string]string) + } + if opts.Separator == "" { + opts.Separator = DefaultSeparator + } + + var baseReporter BaseStatsReporter + if opts.Reporter != nil { + baseReporter = opts.Reporter + } else if opts.CachedReporter != nil { + baseReporter = opts.CachedReporter + } + + if opts.DefaultBuckets == nil || opts.DefaultBuckets.Len() < 1 { + opts.DefaultBuckets = defaultScopeBuckets + } + + s := &scope{ + separator: sanitizer.Name(opts.Separator), + prefix: sanitizer.Name(opts.Prefix), + reporter: opts.Reporter, + cachedReporter: opts.CachedReporter, + baseReporter: baseReporter, + defaultBuckets: opts.DefaultBuckets, + sanitizer: sanitizer, + + registry: &scopeRegistry{ + subscopes: make(map[string]*scope), + }, + status: scopeStatus{ + closed: false, + quit: make(chan struct{}, 1), + }, + + counters: make(map[string]*counter), + gauges: make(map[string]*gauge), + timers: make(map[string]*timer), + histograms: make(map[string]*histogram), + } + + // NB(r): Take a copy of the tags on creation + // so that it cannot be modified after set. + s.tags = s.copyAndSanitizeMap(opts.Tags) + + // Register the root scope + s.registry.subscopes[scopeRegistryKey(s.prefix, s.tags)] = s + + if interval > 0 { + go s.reportLoop(interval) + } + + return s +} + +// report dumps all aggregated stats into the reporter. Should be called automatically by the root scope periodically. +func (s *scope) report(r StatsReporter) { + s.cm.RLock() + for name, counter := range s.counters { + counter.report(s.fullyQualifiedName(name), s.tags, r) + } + s.cm.RUnlock() + + s.gm.RLock() + for name, gauge := range s.gauges { + gauge.report(s.fullyQualifiedName(name), s.tags, r) + } + s.gm.RUnlock() + + // we do nothing for timers here because timers report directly to ths StatsReporter without buffering + + s.hm.RLock() + for name, histogram := range s.histograms { + histogram.report(s.fullyQualifiedName(name), s.tags, r) + } + s.hm.RUnlock() +} + +func (s *scope) cachedReport() { + s.cm.RLock() + for _, counter := range s.counters { + counter.cachedReport() + } + s.cm.RUnlock() + + s.gm.RLock() + for _, gauge := range s.gauges { + gauge.cachedReport() + } + s.gm.RUnlock() + + // we do nothing for timers here because timers report directly to ths StatsReporter without buffering + + s.hm.RLock() + for _, histogram := range s.histograms { + histogram.cachedReport() + } + s.hm.RUnlock() +} + +// reportLoop is used by the root scope for periodic reporting +func (s *scope) reportLoop(interval time.Duration) { + ticker := time.NewTicker(interval) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + s.reportLoopRun() + case <-s.status.quit: + return + } + } +} + +func (s *scope) reportLoopRun() { + // Need to hold a status lock to ensure not to report + // and flush after a close + s.status.RLock() + defer s.status.RUnlock() + + if s.status.closed { + return + } + + s.reportRegistryWithLock() +} + +// reports current registry with scope status lock held +func (s *scope) reportRegistryWithLock() { + s.registry.RLock() + defer s.registry.RUnlock() + + if s.reporter != nil { + for _, ss := range s.registry.subscopes { + ss.report(s.reporter) + } + s.reporter.Flush() + } else if s.cachedReporter != nil { + for _, ss := range s.registry.subscopes { + ss.cachedReport() + } + s.cachedReporter.Flush() + } +} + +func (s *scope) Counter(name string) Counter { + name = s.sanitizer.Name(name) + if c, ok := s.counter(name); ok { + return c + } + + s.cm.Lock() + defer s.cm.Unlock() + + if c, ok := s.counters[name]; ok { + return c + } + + var cachedCounter CachedCount + if s.cachedReporter != nil { + cachedCounter = s.cachedReporter.AllocateCounter( + s.fullyQualifiedName(name), + s.tags, + ) + } + + c := newCounter(cachedCounter) + s.counters[name] = c + + return c +} + +func (s *scope) counter(sanitizedName string) (Counter, bool) { + s.cm.RLock() + defer s.cm.RUnlock() + + c, ok := s.counters[sanitizedName] + return c, ok +} + +func (s *scope) Gauge(name string) Gauge { + name = s.sanitizer.Name(name) + if g, ok := s.gauge(name); ok { + return g + } + + s.gm.Lock() + defer s.gm.Unlock() + + if g, ok := s.gauges[name]; ok { + return g + } + + var cachedGauge CachedGauge + if s.cachedReporter != nil { + cachedGauge = s.cachedReporter.AllocateGauge( + s.fullyQualifiedName(name), s.tags, + ) + } + + g := newGauge(cachedGauge) + s.gauges[name] = g + + return g +} + +func (s *scope) gauge(name string) (Gauge, bool) { + s.gm.RLock() + defer s.gm.RUnlock() + + g, ok := s.gauges[name] + return g, ok +} + +func (s *scope) Timer(name string) Timer { + name = s.sanitizer.Name(name) + if t, ok := s.timer(name); ok { + return t + } + + s.tm.Lock() + defer s.tm.Unlock() + + if t, ok := s.timers[name]; ok { + return t + } + + var cachedTimer CachedTimer + if s.cachedReporter != nil { + cachedTimer = s.cachedReporter.AllocateTimer( + s.fullyQualifiedName(name), s.tags, + ) + } + + t := newTimer( + s.fullyQualifiedName(name), s.tags, s.reporter, cachedTimer, + ) + s.timers[name] = t + + return t +} + +func (s *scope) timer(sanitizedName string) (Timer, bool) { + s.tm.RLock() + defer s.tm.RUnlock() + + t, ok := s.timers[sanitizedName] + return t, ok +} + +func (s *scope) Histogram(name string, b Buckets) Histogram { + name = s.sanitizer.Name(name) + if h, ok := s.histogram(name); ok { + return h + } + + if b == nil { + b = s.defaultBuckets + } + + s.hm.Lock() + defer s.hm.Unlock() + + if h, ok := s.histograms[name]; ok { + return h + } + + var cachedHistogram CachedHistogram + if s.cachedReporter != nil { + cachedHistogram = s.cachedReporter.AllocateHistogram( + s.fullyQualifiedName(name), s.tags, b, + ) + } + + h := newHistogram( + s.fullyQualifiedName(name), s.tags, s.reporter, b, cachedHistogram, + ) + s.histograms[name] = h + + return h +} + +func (s *scope) histogram(sanitizedName string) (Histogram, bool) { + s.hm.RLock() + defer s.hm.RUnlock() + + h, ok := s.histograms[sanitizedName] + return h, ok +} + +func (s *scope) Tagged(tags map[string]string) Scope { + tags = s.copyAndSanitizeMap(tags) + return s.subscope(s.prefix, tags) +} + +func (s *scope) SubScope(prefix string) Scope { + prefix = s.sanitizer.Name(prefix) + return s.subscope(s.fullyQualifiedName(prefix), nil) +} + +func (s *scope) cachedSubscope(key string) (*scope, bool) { + s.registry.RLock() + defer s.registry.RUnlock() + + ss, ok := s.registry.subscopes[key] + return ss, ok +} + +func (s *scope) subscope(prefix string, immutableTags map[string]string) Scope { + immutableTags = mergeRightTags(s.tags, immutableTags) + key := scopeRegistryKey(prefix, immutableTags) + + if ss, ok := s.cachedSubscope(key); ok { + return ss + } + + s.registry.Lock() + defer s.registry.Unlock() + + if ss, ok := s.registry.subscopes[key]; ok { + return ss + } + + subscope := &scope{ + separator: s.separator, + prefix: prefix, + // NB(prateek): don't need to copy the tags here, + // we assume the map provided is immutable. + tags: immutableTags, + reporter: s.reporter, + cachedReporter: s.cachedReporter, + baseReporter: s.baseReporter, + defaultBuckets: s.defaultBuckets, + sanitizer: s.sanitizer, + registry: s.registry, + + counters: make(map[string]*counter), + gauges: make(map[string]*gauge), + timers: make(map[string]*timer), + histograms: make(map[string]*histogram), + } + + s.registry.subscopes[key] = subscope + return subscope +} + +func (s *scope) Capabilities() Capabilities { + if s.baseReporter == nil { + return capabilitiesNone + } + return s.baseReporter.Capabilities() +} + +func (s *scope) Snapshot() Snapshot { + snap := newSnapshot() + + s.registry.RLock() + defer s.registry.RUnlock() + + for _, ss := range s.registry.subscopes { + // NB(r): tags are immutable, no lock required to read. + tags := make(map[string]string, len(s.tags)) + for k, v := range ss.tags { + tags[k] = v + } + + ss.cm.RLock() + for key, c := range ss.counters { + name := ss.fullyQualifiedName(key) + id := KeyForPrefixedStringMap(name, tags) + snap.counters[id] = &counterSnapshot{ + name: name, + tags: tags, + value: c.snapshot(), + } + } + ss.cm.RUnlock() + ss.gm.RLock() + for key, g := range ss.gauges { + name := ss.fullyQualifiedName(key) + id := KeyForPrefixedStringMap(name, tags) + snap.gauges[id] = &gaugeSnapshot{ + name: name, + tags: tags, + value: g.snapshot(), + } + } + ss.gm.RUnlock() + ss.tm.RLock() + for key, t := range ss.timers { + name := ss.fullyQualifiedName(key) + id := KeyForPrefixedStringMap(name, tags) + snap.timers[id] = &timerSnapshot{ + name: name, + tags: tags, + values: t.snapshot(), + } + } + ss.tm.RUnlock() + ss.hm.RLock() + for key, h := range ss.histograms { + name := ss.fullyQualifiedName(key) + id := KeyForPrefixedStringMap(name, tags) + snap.histograms[id] = &histogramSnapshot{ + name: name, + tags: tags, + values: h.snapshotValues(), + durations: h.snapshotDurations(), + } + } + ss.hm.RUnlock() + } + + return snap +} + +func (s *scope) Close() error { + s.status.Lock() + defer s.status.Unlock() + + // don't wait to close more than once (panic on double close of + // s.status.quit) + if s.status.closed { + return nil + } + + s.status.closed = true + close(s.status.quit) + s.reportRegistryWithLock() + + if closer, ok := s.baseReporter.(io.Closer); ok { + return closer.Close() + } + return nil +} + +// NB(prateek): We assume concatenation of sanitized inputs is +// sanitized. If that stops being true, then we need to sanitize the +// output of this function. +func (s *scope) fullyQualifiedName(name string) string { + if len(s.prefix) == 0 { + return name + } + // NB: we don't need to sanitize the output of this function as we + // sanitize all the the inputs (prefix, separator, name); and the + // output we're creating is a concatenation of the sanitized inputs. + // If we change the concatenation to involve other inputs or characters, + // we'll need to sanitize them too. + return fmt.Sprintf("%s%s%s", s.prefix, s.separator, name) +} + +func (s *scope) copyAndSanitizeMap(tags map[string]string) map[string]string { + result := make(map[string]string, len(tags)) + for k, v := range tags { + k = s.sanitizer.Key(k) + v = s.sanitizer.Value(v) + result[k] = v + } + return result +} + +// TestScope is a metrics collector that has no reporting, ensuring that +// all emitted values have a given prefix or set of tags +type TestScope interface { + Scope + + // Snapshot returns a copy of all values since the last report execution, + // this is an expensive operation and should only be use for testing purposes + Snapshot() Snapshot +} + +// Snapshot is a snapshot of values since last report execution +type Snapshot interface { + // Counters returns a snapshot of all counter summations since last report execution + Counters() map[string]CounterSnapshot + + // Gauges returns a snapshot of gauge last values since last report execution + Gauges() map[string]GaugeSnapshot + + // Timers returns a snapshot of timer values since last report execution + Timers() map[string]TimerSnapshot + + // Histograms returns a snapshot of histogram samples since last report execution + Histograms() map[string]HistogramSnapshot +} + +// CounterSnapshot is a snapshot of a counter +type CounterSnapshot interface { + // Name returns the name + Name() string + + // Tags returns the tags + Tags() map[string]string + + // Value returns the value + Value() int64 +} + +// GaugeSnapshot is a snapshot of a gauge +type GaugeSnapshot interface { + // Name returns the name + Name() string + + // Tags returns the tags + Tags() map[string]string + + // Value returns the value + Value() float64 +} + +// TimerSnapshot is a snapshot of a timer +type TimerSnapshot interface { + // Name returns the name + Name() string + + // Tags returns the tags + Tags() map[string]string + + // Values returns the values + Values() []time.Duration +} + +// HistogramSnapshot is a snapshot of a histogram +type HistogramSnapshot interface { + // Name returns the name + Name() string + + // Tags returns the tags + Tags() map[string]string + + // Values returns the sample values by upper bound for a valueHistogram + Values() map[float64]int64 + + // Durations returns the sample values by upper bound for a durationHistogram + Durations() map[time.Duration]int64 +} + +// mergeRightTags merges 2 sets of tags with the tags from tagsRight overriding values from tagsLeft +func mergeRightTags(tagsLeft, tagsRight map[string]string) map[string]string { + if tagsLeft == nil && tagsRight == nil { + return nil + } + if len(tagsRight) == 0 { + return tagsLeft + } + if len(tagsLeft) == 0 { + return tagsRight + } + + result := make(map[string]string, len(tagsLeft)+len(tagsRight)) + for k, v := range tagsLeft { + result[k] = v + } + for k, v := range tagsRight { + result[k] = v + } + return result +} + +type snapshot struct { + counters map[string]CounterSnapshot + gauges map[string]GaugeSnapshot + timers map[string]TimerSnapshot + histograms map[string]HistogramSnapshot +} + +func newSnapshot() *snapshot { + return &snapshot{ + counters: make(map[string]CounterSnapshot), + gauges: make(map[string]GaugeSnapshot), + timers: make(map[string]TimerSnapshot), + histograms: make(map[string]HistogramSnapshot), + } +} + +func (s *snapshot) Counters() map[string]CounterSnapshot { + return s.counters +} + +func (s *snapshot) Gauges() map[string]GaugeSnapshot { + return s.gauges +} + +func (s *snapshot) Timers() map[string]TimerSnapshot { + return s.timers +} + +func (s *snapshot) Histograms() map[string]HistogramSnapshot { + return s.histograms +} + +type counterSnapshot struct { + name string + tags map[string]string + value int64 +} + +func (s *counterSnapshot) Name() string { + return s.name +} + +func (s *counterSnapshot) Tags() map[string]string { + return s.tags +} + +func (s *counterSnapshot) Value() int64 { + return s.value +} + +type gaugeSnapshot struct { + name string + tags map[string]string + value float64 +} + +func (s *gaugeSnapshot) Name() string { + return s.name +} + +func (s *gaugeSnapshot) Tags() map[string]string { + return s.tags +} + +func (s *gaugeSnapshot) Value() float64 { + return s.value +} + +type timerSnapshot struct { + name string + tags map[string]string + values []time.Duration +} + +func (s *timerSnapshot) Name() string { + return s.name +} + +func (s *timerSnapshot) Tags() map[string]string { + return s.tags +} + +func (s *timerSnapshot) Values() []time.Duration { + return s.values +} + +type histogramSnapshot struct { + name string + tags map[string]string + values map[float64]int64 + durations map[time.Duration]int64 +} + +func (s *histogramSnapshot) Name() string { + return s.name +} + +func (s *histogramSnapshot) Tags() map[string]string { + return s.tags +} + +func (s *histogramSnapshot) Values() map[float64]int64 { + return s.values +} + +func (s *histogramSnapshot) Durations() map[time.Duration]int64 { + return s.durations +} diff --git a/vendor/github.com/uber-go/tally/stats.go b/vendor/github.com/uber-go/tally/stats.go new file mode 100644 index 00000000..aba2f9e8 --- /dev/null +++ b/vendor/github.com/uber-go/tally/stats.go @@ -0,0 +1,475 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "math" + "sort" + "sync" + "sync/atomic" + "time" +) + +var ( + capabilitiesNone = &capabilities{ + reporting: false, + tagging: false, + } + capabilitiesReportingNoTagging = &capabilities{ + reporting: true, + tagging: false, + } + capabilitiesReportingTagging = &capabilities{ + reporting: true, + tagging: true, + } +) + +type capabilities struct { + reporting bool + tagging bool +} + +func (c *capabilities) Reporting() bool { + return c.reporting +} + +func (c *capabilities) Tagging() bool { + return c.tagging +} + +type counter struct { + prev int64 + curr int64 + cachedCount CachedCount +} + +func newCounter(cachedCount CachedCount) *counter { + return &counter{cachedCount: cachedCount} +} + +func (c *counter) Inc(v int64) { + atomic.AddInt64(&c.curr, v) +} + +func (c *counter) value() int64 { + curr := atomic.LoadInt64(&c.curr) + + prev := atomic.LoadInt64(&c.prev) + if prev == curr { + return 0 + } + atomic.StoreInt64(&c.prev, curr) + return curr - prev +} + +func (c *counter) report(name string, tags map[string]string, r StatsReporter) { + delta := c.value() + if delta == 0 { + return + } + + r.ReportCounter(name, tags, delta) +} + +func (c *counter) cachedReport() { + delta := c.value() + if delta == 0 { + return + } + + c.cachedCount.ReportCount(delta) +} + +func (c *counter) snapshot() int64 { + return atomic.LoadInt64(&c.curr) - atomic.LoadInt64(&c.prev) +} + +type gauge struct { + updated uint64 + curr uint64 + cachedGauge CachedGauge +} + +func newGauge(cachedGauge CachedGauge) *gauge { + return &gauge{cachedGauge: cachedGauge} +} + +func (g *gauge) Update(v float64) { + atomic.StoreUint64(&g.curr, math.Float64bits(v)) + atomic.StoreUint64(&g.updated, 1) +} + +func (g *gauge) value() float64 { + return math.Float64frombits(atomic.LoadUint64(&g.curr)) +} + +func (g *gauge) report(name string, tags map[string]string, r StatsReporter) { + if atomic.SwapUint64(&g.updated, 0) == 1 { + r.ReportGauge(name, tags, g.value()) + } +} + +func (g *gauge) cachedReport() { + if atomic.SwapUint64(&g.updated, 0) == 1 { + g.cachedGauge.ReportGauge(g.value()) + } +} + +func (g *gauge) snapshot() float64 { + return math.Float64frombits(atomic.LoadUint64(&g.curr)) +} + +// NB(jra3): timers are a little special because they do no aggregate any data +// at the timer level. The reporter buffers may timer entries and periodically +// flushes. +type timer struct { + name string + tags map[string]string + reporter StatsReporter + cachedTimer CachedTimer + unreported timerValues +} + +type timerValues struct { + sync.RWMutex + values []time.Duration +} + +func newTimer( + name string, + tags map[string]string, + r StatsReporter, + cachedTimer CachedTimer, +) *timer { + t := &timer{ + name: name, + tags: tags, + reporter: r, + cachedTimer: cachedTimer, + } + if r == nil { + t.reporter = &timerNoReporterSink{timer: t} + } + return t +} + +func (t *timer) Record(interval time.Duration) { + if t.cachedTimer != nil { + t.cachedTimer.ReportTimer(interval) + } else { + t.reporter.ReportTimer(t.name, t.tags, interval) + } +} + +func (t *timer) Start() Stopwatch { + return NewStopwatch(globalNow(), t) +} + +func (t *timer) RecordStopwatch(stopwatchStart time.Time) { + d := globalNow().Sub(stopwatchStart) + t.Record(d) +} + +func (t *timer) snapshot() []time.Duration { + t.unreported.RLock() + snap := make([]time.Duration, len(t.unreported.values)) + for i := range t.unreported.values { + snap[i] = t.unreported.values[i] + } + t.unreported.RUnlock() + return snap +} + +type timerNoReporterSink struct { + sync.RWMutex + timer *timer +} + +func (r *timerNoReporterSink) ReportCounter( + name string, + tags map[string]string, + value int64, +) { +} + +func (r *timerNoReporterSink) ReportGauge( + name string, + tags map[string]string, + value float64, +) { +} + +func (r *timerNoReporterSink) ReportTimer( + name string, + tags map[string]string, + interval time.Duration, +) { + r.timer.unreported.Lock() + r.timer.unreported.values = append(r.timer.unreported.values, interval) + r.timer.unreported.Unlock() +} + +func (r *timerNoReporterSink) ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound float64, + samples int64, +) { +} + +func (r *timerNoReporterSink) ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound time.Duration, + samples int64, +) { +} + +func (r *timerNoReporterSink) Capabilities() Capabilities { + return capabilitiesReportingTagging +} + +func (r *timerNoReporterSink) Flush() { +} + +type histogram struct { + htype histogramType + name string + tags map[string]string + reporter StatsReporter + specification Buckets + buckets []histogramBucket + lookupByValue []float64 + lookupByDuration []int +} + +type histogramType int + +const ( + valueHistogramType histogramType = iota + durationHistogramType +) + +func newHistogram( + name string, + tags map[string]string, + reporter StatsReporter, + buckets Buckets, + cachedHistogram CachedHistogram, +) *histogram { + htype := valueHistogramType + if _, ok := buckets.(DurationBuckets); ok { + htype = durationHistogramType + } + + pairs := BucketPairs(buckets) + + h := &histogram{ + htype: htype, + name: name, + tags: tags, + reporter: reporter, + specification: buckets, + buckets: make([]histogramBucket, 0, len(pairs)), + lookupByValue: make([]float64, 0, len(pairs)), + lookupByDuration: make([]int, 0, len(pairs)), + } + + for _, pair := range pairs { + h.addBucket(newHistogramBucket(h, + pair.LowerBoundValue(), pair.UpperBoundValue(), + pair.LowerBoundDuration(), pair.UpperBoundDuration(), + cachedHistogram)) + } + + return h +} + +func (h *histogram) addBucket(b histogramBucket) { + h.buckets = append(h.buckets, b) + h.lookupByValue = append(h.lookupByValue, b.valueUpperBound) + h.lookupByDuration = append(h.lookupByDuration, int(b.durationUpperBound)) +} + +func (h *histogram) report(name string, tags map[string]string, r StatsReporter) { + for i := range h.buckets { + samples := h.buckets[i].samples.value() + if samples == 0 { + continue + } + switch h.htype { + case valueHistogramType: + r.ReportHistogramValueSamples(name, tags, h.specification, + h.buckets[i].valueLowerBound, h.buckets[i].valueUpperBound, + samples) + case durationHistogramType: + r.ReportHistogramDurationSamples(name, tags, h.specification, + h.buckets[i].durationLowerBound, h.buckets[i].durationUpperBound, + samples) + } + } +} + +func (h *histogram) cachedReport() { + for i := range h.buckets { + samples := h.buckets[i].samples.value() + if samples == 0 { + continue + } + switch h.htype { + case valueHistogramType: + h.buckets[i].cachedValueBucket.ReportSamples(samples) + case durationHistogramType: + h.buckets[i].cachedDurationBucket.ReportSamples(samples) + } + } +} + +func (h *histogram) RecordValue(value float64) { + // Find the highest inclusive of the bucket upper bound + // and emit directly to it. Since we use BucketPairs to derive + // buckets there will always be an inclusive bucket as + // we always have a math.MaxFloat64 bucket. + idx := sort.SearchFloat64s(h.lookupByValue, value) + h.buckets[idx].samples.Inc(1) +} + +func (h *histogram) RecordDuration(value time.Duration) { + // Find the highest inclusive of the bucket upper bound + // and emit directly to it. Since we use BucketPairs to derive + // buckets there will always be an inclusive bucket as + // we always have a math.MaxInt64 bucket. + idx := sort.SearchInts(h.lookupByDuration, int(value)) + h.buckets[idx].samples.Inc(1) +} + +func (h *histogram) Start() Stopwatch { + return NewStopwatch(globalNow(), h) +} + +func (h *histogram) RecordStopwatch(stopwatchStart time.Time) { + d := globalNow().Sub(stopwatchStart) + h.RecordDuration(d) +} + +func (h *histogram) snapshotValues() map[float64]int64 { + if h.htype == durationHistogramType { + return nil + } + + vals := make(map[float64]int64, len(h.buckets)) + for i := range h.buckets { + vals[h.buckets[i].valueUpperBound] = h.buckets[i].samples.value() + } + + return vals +} + +func (h *histogram) snapshotDurations() map[time.Duration]int64 { + if h.htype == valueHistogramType { + return nil + } + + durations := make(map[time.Duration]int64, len(h.buckets)) + for i := range h.buckets { + durations[h.buckets[i].durationUpperBound] = h.buckets[i].samples.value() + } + + return durations +} + +type histogramBucket struct { + h *histogram + samples *counter + valueLowerBound float64 + valueUpperBound float64 + durationLowerBound time.Duration + durationUpperBound time.Duration + cachedValueBucket CachedHistogramBucket + cachedDurationBucket CachedHistogramBucket +} + +func newHistogramBucket( + h *histogram, + valueLowerBound, + valueUpperBound float64, + durationLowerBound, + durationUpperBound time.Duration, + cachedHistogram CachedHistogram, +) histogramBucket { + bucket := histogramBucket{ + samples: newCounter(nil), + valueLowerBound: valueLowerBound, + valueUpperBound: valueUpperBound, + durationLowerBound: durationLowerBound, + durationUpperBound: durationUpperBound, + } + if cachedHistogram != nil { + bucket.cachedValueBucket = cachedHistogram.ValueBucket( + bucket.valueLowerBound, bucket.valueUpperBound, + ) + bucket.cachedDurationBucket = cachedHistogram.DurationBucket( + bucket.durationLowerBound, bucket.durationUpperBound, + ) + } + return bucket +} + +// NullStatsReporter is an implementation of StatsReporter than simply does nothing. +var NullStatsReporter StatsReporter = nullStatsReporter{} + +func (r nullStatsReporter) ReportCounter(name string, tags map[string]string, value int64) { +} +func (r nullStatsReporter) ReportGauge(name string, tags map[string]string, value float64) { +} +func (r nullStatsReporter) ReportTimer(name string, tags map[string]string, interval time.Duration) { +} +func (r nullStatsReporter) ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound float64, + samples int64, +) { +} + +func (r nullStatsReporter) ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound time.Duration, + samples int64, +) { +} +func (r nullStatsReporter) Capabilities() Capabilities { + return capabilitiesNone +} +func (r nullStatsReporter) Flush() { +} + +type nullStatsReporter struct{} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/application_exception.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/application_exception.go new file mode 100644 index 00000000..6655cc5a --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/application_exception.go @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +const ( + UNKNOWN_APPLICATION_EXCEPTION = 0 + UNKNOWN_METHOD = 1 + INVALID_MESSAGE_TYPE_EXCEPTION = 2 + WRONG_METHOD_NAME = 3 + BAD_SEQUENCE_ID = 4 + MISSING_RESULT = 5 + INTERNAL_ERROR = 6 + PROTOCOL_ERROR = 7 +) + +// Application level Thrift exception +type TApplicationException interface { + TException + TypeId() int32 + Read(iprot TProtocol) (TApplicationException, error) + Write(oprot TProtocol) error +} + +type tApplicationException struct { + message string + type_ int32 +} + +func (e tApplicationException) Error() string { + return e.message +} + +func NewTApplicationException(type_ int32, message string) TApplicationException { + return &tApplicationException{message, type_} +} + +func (p *tApplicationException) TypeId() int32 { + return p.type_ +} + +func (p *tApplicationException) Read(iprot TProtocol) (TApplicationException, error) { + _, err := iprot.ReadStructBegin() + if err != nil { + return nil, err + } + + message := "" + type_ := int32(UNKNOWN_APPLICATION_EXCEPTION) + + for { + _, ttype, id, err := iprot.ReadFieldBegin() + if err != nil { + return nil, err + } + if ttype == STOP { + break + } + switch id { + case 1: + if ttype == STRING { + if message, err = iprot.ReadString(); err != nil { + return nil, err + } + } else { + if err = SkipDefaultDepth(iprot, ttype); err != nil { + return nil, err + } + } + case 2: + if ttype == I32 { + if type_, err = iprot.ReadI32(); err != nil { + return nil, err + } + } else { + if err = SkipDefaultDepth(iprot, ttype); err != nil { + return nil, err + } + } + default: + if err = SkipDefaultDepth(iprot, ttype); err != nil { + return nil, err + } + } + if err = iprot.ReadFieldEnd(); err != nil { + return nil, err + } + } + return NewTApplicationException(type_, message), iprot.ReadStructEnd() +} + +func (p *tApplicationException) Write(oprot TProtocol) (err error) { + err = oprot.WriteStructBegin("TApplicationException") + if len(p.Error()) > 0 { + err = oprot.WriteFieldBegin("message", STRING, 1) + if err != nil { + return + } + err = oprot.WriteString(p.Error()) + if err != nil { + return + } + err = oprot.WriteFieldEnd() + if err != nil { + return + } + } + err = oprot.WriteFieldBegin("type", I32, 2) + if err != nil { + return + } + err = oprot.WriteI32(p.type_) + if err != nil { + return + } + err = oprot.WriteFieldEnd() + if err != nil { + return + } + err = oprot.WriteFieldStop() + if err != nil { + return + } + err = oprot.WriteStructEnd() + return +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/binary_protocol.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/binary_protocol.go new file mode 100644 index 00000000..690d3411 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/binary_protocol.go @@ -0,0 +1,514 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "math" +) + +type TBinaryProtocol struct { + trans TRichTransport + origTransport TTransport + reader io.Reader + writer io.Writer + strictRead bool + strictWrite bool + buffer [64]byte +} + +type TBinaryProtocolFactory struct { + strictRead bool + strictWrite bool +} + +func NewTBinaryProtocolTransport(t TTransport) *TBinaryProtocol { + return NewTBinaryProtocol(t, false, true) +} + +func NewTBinaryProtocol(t TTransport, strictRead, strictWrite bool) *TBinaryProtocol { + p := &TBinaryProtocol{origTransport: t, strictRead: strictRead, strictWrite: strictWrite} + if et, ok := t.(TRichTransport); ok { + p.trans = et + } else { + p.trans = NewTRichTransport(t) + } + p.reader = p.trans + p.writer = p.trans + return p +} + +func NewTBinaryProtocolFactoryDefault() *TBinaryProtocolFactory { + return NewTBinaryProtocolFactory(false, true) +} + +func NewTBinaryProtocolFactory(strictRead, strictWrite bool) *TBinaryProtocolFactory { + return &TBinaryProtocolFactory{strictRead: strictRead, strictWrite: strictWrite} +} + +func (p *TBinaryProtocolFactory) GetProtocol(t TTransport) TProtocol { + return NewTBinaryProtocol(t, p.strictRead, p.strictWrite) +} + +/** + * Writing Methods + */ + +func (p *TBinaryProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { + if p.strictWrite { + version := uint32(VERSION_1) | uint32(typeId) + e := p.WriteI32(int32(version)) + if e != nil { + return e + } + e = p.WriteString(name) + if e != nil { + return e + } + e = p.WriteI32(seqId) + return e + } else { + e := p.WriteString(name) + if e != nil { + return e + } + e = p.WriteByte(int8(typeId)) + if e != nil { + return e + } + e = p.WriteI32(seqId) + return e + } + return nil +} + +func (p *TBinaryProtocol) WriteMessageEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteStructBegin(name string) error { + return nil +} + +func (p *TBinaryProtocol) WriteStructEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + e := p.WriteByte(int8(typeId)) + if e != nil { + return e + } + e = p.WriteI16(id) + return e +} + +func (p *TBinaryProtocol) WriteFieldEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteFieldStop() error { + e := p.WriteByte(STOP) + return e +} + +func (p *TBinaryProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + e := p.WriteByte(int8(keyType)) + if e != nil { + return e + } + e = p.WriteByte(int8(valueType)) + if e != nil { + return e + } + e = p.WriteI32(int32(size)) + return e +} + +func (p *TBinaryProtocol) WriteMapEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteListBegin(elemType TType, size int) error { + e := p.WriteByte(int8(elemType)) + if e != nil { + return e + } + e = p.WriteI32(int32(size)) + return e +} + +func (p *TBinaryProtocol) WriteListEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteSetBegin(elemType TType, size int) error { + e := p.WriteByte(int8(elemType)) + if e != nil { + return e + } + e = p.WriteI32(int32(size)) + return e +} + +func (p *TBinaryProtocol) WriteSetEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteBool(value bool) error { + if value { + return p.WriteByte(1) + } + return p.WriteByte(0) +} + +func (p *TBinaryProtocol) WriteByte(value int8) error { + e := p.trans.WriteByte(byte(value)) + return NewTProtocolException(e) +} + +func (p *TBinaryProtocol) WriteI16(value int16) error { + v := p.buffer[0:2] + binary.BigEndian.PutUint16(v, uint16(value)) + _, e := p.writer.Write(v) + return NewTProtocolException(e) +} + +func (p *TBinaryProtocol) WriteI32(value int32) error { + v := p.buffer[0:4] + binary.BigEndian.PutUint32(v, uint32(value)) + _, e := p.writer.Write(v) + return NewTProtocolException(e) +} + +func (p *TBinaryProtocol) WriteI64(value int64) error { + v := p.buffer[0:8] + binary.BigEndian.PutUint64(v, uint64(value)) + _, err := p.writer.Write(v) + return NewTProtocolException(err) +} + +func (p *TBinaryProtocol) WriteDouble(value float64) error { + return p.WriteI64(int64(math.Float64bits(value))) +} + +func (p *TBinaryProtocol) WriteString(value string) error { + e := p.WriteI32(int32(len(value))) + if e != nil { + return e + } + _, err := p.trans.WriteString(value) + return NewTProtocolException(err) +} + +func (p *TBinaryProtocol) WriteBinary(value []byte) error { + e := p.WriteI32(int32(len(value))) + if e != nil { + return e + } + _, err := p.writer.Write(value) + return NewTProtocolException(err) +} + +/** + * Reading methods + */ + +func (p *TBinaryProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + size, e := p.ReadI32() + if e != nil { + return "", typeId, 0, NewTProtocolException(e) + } + if size < 0 { + typeId = TMessageType(size & 0x0ff) + version := int64(int64(size) & VERSION_MASK) + if version != VERSION_1 { + return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Bad version in ReadMessageBegin")) + } + name, e = p.ReadString() + if e != nil { + return name, typeId, seqId, NewTProtocolException(e) + } + seqId, e = p.ReadI32() + if e != nil { + return name, typeId, seqId, NewTProtocolException(e) + } + return name, typeId, seqId, nil + } + if p.strictRead { + return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Missing version in ReadMessageBegin")) + } + name, e2 := p.readStringBody(size) + if e2 != nil { + return name, typeId, seqId, e2 + } + b, e3 := p.ReadByte() + if e3 != nil { + return name, typeId, seqId, e3 + } + typeId = TMessageType(b) + seqId, e4 := p.ReadI32() + if e4 != nil { + return name, typeId, seqId, e4 + } + return name, typeId, seqId, nil +} + +func (p *TBinaryProtocol) ReadMessageEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadStructBegin() (name string, err error) { + return +} + +func (p *TBinaryProtocol) ReadStructEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadFieldBegin() (name string, typeId TType, seqId int16, err error) { + t, err := p.ReadByte() + typeId = TType(t) + if err != nil { + return name, typeId, seqId, err + } + if t != STOP { + seqId, err = p.ReadI16() + } + return name, typeId, seqId, err +} + +func (p *TBinaryProtocol) ReadFieldEnd() error { + return nil +} + +var invalidDataLength = NewTProtocolExceptionWithType(INVALID_DATA, errors.New("Invalid data length")) + +func (p *TBinaryProtocol) ReadMapBegin() (kType, vType TType, size int, err error) { + k, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + kType = TType(k) + v, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + vType = TType(v) + size32, e := p.ReadI32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + return kType, vType, size, nil +} + +func (p *TBinaryProtocol) ReadMapEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadListBegin() (elemType TType, size int, err error) { + b, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + elemType = TType(b) + size32, e := p.ReadI32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + + return +} + +func (p *TBinaryProtocol) ReadListEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadSetBegin() (elemType TType, size int, err error) { + b, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + elemType = TType(b) + size32, e := p.ReadI32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + return elemType, size, nil +} + +func (p *TBinaryProtocol) ReadSetEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadBool() (bool, error) { + b, e := p.ReadByte() + v := true + if b != 1 { + v = false + } + return v, e +} + +func (p *TBinaryProtocol) ReadByte() (int8, error) { + v, err := p.trans.ReadByte() + return int8(v), err +} + +func (p *TBinaryProtocol) ReadI16() (value int16, err error) { + buf := p.buffer[0:2] + err = p.readAll(buf) + value = int16(binary.BigEndian.Uint16(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadI32() (value int32, err error) { + buf := p.buffer[0:4] + err = p.readAll(buf) + value = int32(binary.BigEndian.Uint32(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadI64() (value int64, err error) { + buf := p.buffer[0:8] + err = p.readAll(buf) + value = int64(binary.BigEndian.Uint64(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadDouble() (value float64, err error) { + buf := p.buffer[0:8] + err = p.readAll(buf) + value = math.Float64frombits(binary.BigEndian.Uint64(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadString() (value string, err error) { + size, e := p.ReadI32() + if e != nil { + return "", e + } + if size < 0 { + err = invalidDataLength + return + } + + return p.readStringBody(size) +} + +func (p *TBinaryProtocol) ReadBinary() ([]byte, error) { + size, e := p.ReadI32() + if e != nil { + return nil, e + } + if size < 0 { + return nil, invalidDataLength + } + if uint64(size) > p.trans.RemainingBytes() { + return nil, invalidDataLength + } + + isize := int(size) + buf := make([]byte, isize) + _, err := io.ReadFull(p.trans, buf) + return buf, NewTProtocolException(err) +} + +func (p *TBinaryProtocol) Flush() (err error) { + return NewTProtocolException(p.trans.Flush()) +} + +func (p *TBinaryProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TBinaryProtocol) Transport() TTransport { + return p.origTransport +} + +func (p *TBinaryProtocol) readAll(buf []byte) error { + _, err := io.ReadFull(p.reader, buf) + return NewTProtocolException(err) +} + +const readLimit = 32768 + +func (p *TBinaryProtocol) readStringBody(size int32) (value string, err error) { + if size < 0 { + return "", nil + } + if uint64(size) > p.trans.RemainingBytes() { + return "", invalidDataLength + } + + var ( + buf bytes.Buffer + e error + b []byte + ) + + switch { + case int(size) <= len(p.buffer): + b = p.buffer[:size] // avoids allocation for small reads + case int(size) < readLimit: + b = make([]byte, size) + default: + b = make([]byte, readLimit) + } + + for size > 0 { + _, e = io.ReadFull(p.trans, b) + buf.Write(b) + if e != nil { + break + } + size -= readLimit + if size < readLimit && size > 0 { + b = b[:size] + } + } + return buf.String(), NewTProtocolException(e) +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/buffered_transport.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/buffered_transport.go new file mode 100644 index 00000000..f73a98b6 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/buffered_transport.go @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bufio" +) + +type TBufferedTransportFactory struct { + size int +} + +type TBufferedTransport struct { + bufio.ReadWriter + tp TTransport +} + +func (p *TBufferedTransportFactory) GetTransport(trans TTransport) TTransport { + return NewTBufferedTransport(trans, p.size) +} + +func NewTBufferedTransportFactory(bufferSize int) *TBufferedTransportFactory { + return &TBufferedTransportFactory{size: bufferSize} +} + +func NewTBufferedTransport(trans TTransport, bufferSize int) *TBufferedTransport { + return &TBufferedTransport{ + ReadWriter: bufio.ReadWriter{ + Reader: bufio.NewReaderSize(trans, bufferSize), + Writer: bufio.NewWriterSize(trans, bufferSize), + }, + tp: trans, + } +} + +func (p *TBufferedTransport) IsOpen() bool { + return p.tp.IsOpen() +} + +func (p *TBufferedTransport) Open() (err error) { + return p.tp.Open() +} + +func (p *TBufferedTransport) Close() (err error) { + return p.tp.Close() +} + +func (p *TBufferedTransport) Read(b []byte) (int, error) { + n, err := p.ReadWriter.Read(b) + if err != nil { + p.ReadWriter.Reader.Reset(p.tp) + } + return n, err +} + +func (p *TBufferedTransport) Write(b []byte) (int, error) { + n, err := p.ReadWriter.Write(b) + if err != nil { + p.ReadWriter.Writer.Reset(p.tp) + } + return n, err +} + +func (p *TBufferedTransport) Flush() error { + if err := p.ReadWriter.Flush(); err != nil { + p.ReadWriter.Writer.Reset(p.tp) + return err + } + return p.tp.Flush() +} + +func (p *TBufferedTransport) RemainingBytes() (num_bytes uint64) { + return p.tp.RemainingBytes() +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/compact_protocol.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/compact_protocol.go new file mode 100644 index 00000000..ffbd4cd1 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/compact_protocol.go @@ -0,0 +1,815 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "encoding/binary" + "fmt" + "io" + "math" +) + +const ( + COMPACT_PROTOCOL_ID = 0x082 + COMPACT_VERSION = 1 + COMPACT_VERSION_MASK = 0x1f + COMPACT_TYPE_MASK = 0x0E0 + COMPACT_TYPE_BITS = 0x07 + COMPACT_TYPE_SHIFT_AMOUNT = 5 +) + +type tCompactType byte + +const ( + COMPACT_BOOLEAN_TRUE = 0x01 + COMPACT_BOOLEAN_FALSE = 0x02 + COMPACT_BYTE = 0x03 + COMPACT_I16 = 0x04 + COMPACT_I32 = 0x05 + COMPACT_I64 = 0x06 + COMPACT_DOUBLE = 0x07 + COMPACT_BINARY = 0x08 + COMPACT_LIST = 0x09 + COMPACT_SET = 0x0A + COMPACT_MAP = 0x0B + COMPACT_STRUCT = 0x0C +) + +var ( + ttypeToCompactType map[TType]tCompactType +) + +func init() { + ttypeToCompactType = map[TType]tCompactType{ + STOP: STOP, + BOOL: COMPACT_BOOLEAN_TRUE, + BYTE: COMPACT_BYTE, + I16: COMPACT_I16, + I32: COMPACT_I32, + I64: COMPACT_I64, + DOUBLE: COMPACT_DOUBLE, + STRING: COMPACT_BINARY, + LIST: COMPACT_LIST, + SET: COMPACT_SET, + MAP: COMPACT_MAP, + STRUCT: COMPACT_STRUCT, + } +} + +type TCompactProtocolFactory struct{} + +func NewTCompactProtocolFactory() *TCompactProtocolFactory { + return &TCompactProtocolFactory{} +} + +func (p *TCompactProtocolFactory) GetProtocol(trans TTransport) TProtocol { + return NewTCompactProtocol(trans) +} + +type TCompactProtocol struct { + trans TRichTransport + origTransport TTransport + + // Used to keep track of the last field for the current and previous structs, + // so we can do the delta stuff. + lastField []int + lastFieldId int + + // If we encounter a boolean field begin, save the TField here so it can + // have the value incorporated. + booleanFieldName string + booleanFieldId int16 + booleanFieldPending bool + + // If we read a field header, and it's a boolean field, save the boolean + // value here so that readBool can use it. + boolValue bool + boolValueIsNotNull bool + buffer [64]byte +} + +// Create a TCompactProtocol given a TTransport +func NewTCompactProtocol(trans TTransport) *TCompactProtocol { + p := &TCompactProtocol{origTransport: trans, lastField: []int{}} + if et, ok := trans.(TRichTransport); ok { + p.trans = et + } else { + p.trans = NewTRichTransport(trans) + } + + return p + +} + +// +// Public Writing methods. +// + +// Write a message header to the wire. Compact Protocol messages contain the +// protocol version so we can migrate forwards in the future if need be. +func (p *TCompactProtocol) WriteMessageBegin(name string, typeId TMessageType, seqid int32) error { + err := p.writeByteDirect(COMPACT_PROTOCOL_ID) + if err != nil { + return NewTProtocolException(err) + } + err = p.writeByteDirect((COMPACT_VERSION & COMPACT_VERSION_MASK) | ((byte(typeId) << COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_MASK)) + if err != nil { + return NewTProtocolException(err) + } + _, err = p.writeVarint32(seqid) + if err != nil { + return NewTProtocolException(err) + } + e := p.WriteString(name) + return e + +} + +func (p *TCompactProtocol) WriteMessageEnd() error { return nil } + +// Write a struct begin. This doesn't actually put anything on the wire. We +// use it as an opportunity to put special placeholder markers on the field +// stack so we can get the field id deltas correct. +func (p *TCompactProtocol) WriteStructBegin(name string) error { + p.lastField = append(p.lastField, p.lastFieldId) + p.lastFieldId = 0 + return nil +} + +// Write a struct end. This doesn't actually put anything on the wire. We use +// this as an opportunity to pop the last field from the current struct off +// of the field stack. +func (p *TCompactProtocol) WriteStructEnd() error { + p.lastFieldId = p.lastField[len(p.lastField)-1] + p.lastField = p.lastField[:len(p.lastField)-1] + return nil +} + +func (p *TCompactProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + if typeId == BOOL { + // we want to possibly include the value, so we'll wait. + p.booleanFieldName, p.booleanFieldId, p.booleanFieldPending = name, id, true + return nil + } + _, err := p.writeFieldBeginInternal(name, typeId, id, 0xFF) + return NewTProtocolException(err) +} + +// The workhorse of writeFieldBegin. It has the option of doing a +// 'type override' of the type header. This is used specifically in the +// boolean field case. +func (p *TCompactProtocol) writeFieldBeginInternal(name string, typeId TType, id int16, typeOverride byte) (int, error) { + // short lastField = lastField_.pop(); + + // if there's a type override, use that. + var typeToWrite byte + if typeOverride == 0xFF { + typeToWrite = byte(p.getCompactType(typeId)) + } else { + typeToWrite = typeOverride + } + // check if we can use delta encoding for the field id + fieldId := int(id) + written := 0 + if fieldId > p.lastFieldId && fieldId-p.lastFieldId <= 15 { + // write them together + err := p.writeByteDirect(byte((fieldId-p.lastFieldId)<<4) | typeToWrite) + if err != nil { + return 0, err + } + } else { + // write them separate + err := p.writeByteDirect(typeToWrite) + if err != nil { + return 0, err + } + err = p.WriteI16(id) + written = 1 + 2 + if err != nil { + return 0, err + } + } + + p.lastFieldId = fieldId + // p.lastField.Push(field.id); + return written, nil +} + +func (p *TCompactProtocol) WriteFieldEnd() error { return nil } + +func (p *TCompactProtocol) WriteFieldStop() error { + err := p.writeByteDirect(STOP) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + if size == 0 { + err := p.writeByteDirect(0) + return NewTProtocolException(err) + } + _, err := p.writeVarint32(int32(size)) + if err != nil { + return NewTProtocolException(err) + } + err = p.writeByteDirect(byte(p.getCompactType(keyType))<<4 | byte(p.getCompactType(valueType))) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteMapEnd() error { return nil } + +// Write a list header. +func (p *TCompactProtocol) WriteListBegin(elemType TType, size int) error { + _, err := p.writeCollectionBegin(elemType, size) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteListEnd() error { return nil } + +// Write a set header. +func (p *TCompactProtocol) WriteSetBegin(elemType TType, size int) error { + _, err := p.writeCollectionBegin(elemType, size) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteSetEnd() error { return nil } + +func (p *TCompactProtocol) WriteBool(value bool) error { + v := byte(COMPACT_BOOLEAN_FALSE) + if value { + v = byte(COMPACT_BOOLEAN_TRUE) + } + if p.booleanFieldPending { + // we haven't written the field header yet + _, err := p.writeFieldBeginInternal(p.booleanFieldName, BOOL, p.booleanFieldId, v) + p.booleanFieldPending = false + return NewTProtocolException(err) + } + // we're not part of a field, so just write the value. + err := p.writeByteDirect(v) + return NewTProtocolException(err) +} + +// Write a byte. Nothing to see here! +func (p *TCompactProtocol) WriteByte(value int8) error { + err := p.writeByteDirect(byte(value)) + return NewTProtocolException(err) +} + +// Write an I16 as a zigzag varint. +func (p *TCompactProtocol) WriteI16(value int16) error { + _, err := p.writeVarint32(p.int32ToZigzag(int32(value))) + return NewTProtocolException(err) +} + +// Write an i32 as a zigzag varint. +func (p *TCompactProtocol) WriteI32(value int32) error { + _, err := p.writeVarint32(p.int32ToZigzag(value)) + return NewTProtocolException(err) +} + +// Write an i64 as a zigzag varint. +func (p *TCompactProtocol) WriteI64(value int64) error { + _, err := p.writeVarint64(p.int64ToZigzag(value)) + return NewTProtocolException(err) +} + +// Write a double to the wire as 8 bytes. +func (p *TCompactProtocol) WriteDouble(value float64) error { + buf := p.buffer[0:8] + binary.LittleEndian.PutUint64(buf, math.Float64bits(value)) + _, err := p.trans.Write(buf) + return NewTProtocolException(err) +} + +// Write a string to the wire with a varint size preceding. +func (p *TCompactProtocol) WriteString(value string) error { + _, e := p.writeVarint32(int32(len(value))) + if e != nil { + return NewTProtocolException(e) + } + if len(value) > 0 { + } + _, e = p.trans.WriteString(value) + return e +} + +// Write a byte array, using a varint for the size. +func (p *TCompactProtocol) WriteBinary(bin []byte) error { + _, e := p.writeVarint32(int32(len(bin))) + if e != nil { + return NewTProtocolException(e) + } + if len(bin) > 0 { + _, e = p.trans.Write(bin) + return NewTProtocolException(e) + } + return nil +} + +// +// Reading methods. +// + +// Read a message header. +func (p *TCompactProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + + protocolId, err := p.readByteDirect() + if err != nil { + return + } + + if protocolId != COMPACT_PROTOCOL_ID { + e := fmt.Errorf("Expected protocol id %02x but got %02x", COMPACT_PROTOCOL_ID, protocolId) + return "", typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, e) + } + + versionAndType, err := p.readByteDirect() + if err != nil { + return + } + + version := versionAndType & COMPACT_VERSION_MASK + typeId = TMessageType((versionAndType >> COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_BITS) + if version != COMPACT_VERSION { + e := fmt.Errorf("Expected version %02x but got %02x", COMPACT_VERSION, version) + err = NewTProtocolExceptionWithType(BAD_VERSION, e) + return + } + seqId, e := p.readVarint32() + if e != nil { + err = NewTProtocolException(e) + return + } + name, err = p.ReadString() + return +} + +func (p *TCompactProtocol) ReadMessageEnd() error { return nil } + +// Read a struct begin. There's nothing on the wire for this, but it is our +// opportunity to push a new struct begin marker onto the field stack. +func (p *TCompactProtocol) ReadStructBegin() (name string, err error) { + p.lastField = append(p.lastField, p.lastFieldId) + p.lastFieldId = 0 + return +} + +// Doesn't actually consume any wire data, just removes the last field for +// this struct from the field stack. +func (p *TCompactProtocol) ReadStructEnd() error { + // consume the last field we read off the wire. + p.lastFieldId = p.lastField[len(p.lastField)-1] + p.lastField = p.lastField[:len(p.lastField)-1] + return nil +} + +// Read a field header off the wire. +func (p *TCompactProtocol) ReadFieldBegin() (name string, typeId TType, id int16, err error) { + t, err := p.readByteDirect() + if err != nil { + return + } + + // if it's a stop, then we can return immediately, as the struct is over. + if (t & 0x0f) == STOP { + return "", STOP, 0, nil + } + + // mask off the 4 MSB of the type header. it could contain a field id delta. + modifier := int16((t & 0xf0) >> 4) + if modifier == 0 { + // not a delta. look ahead for the zigzag varint field id. + id, err = p.ReadI16() + if err != nil { + return + } + } else { + // has a delta. add the delta to the last read field id. + id = int16(p.lastFieldId) + modifier + } + typeId, e := p.getTType(tCompactType(t & 0x0f)) + if e != nil { + err = NewTProtocolException(e) + return + } + + // if this happens to be a boolean field, the value is encoded in the type + if p.isBoolType(t) { + // save the boolean value in a special instance variable. + p.boolValue = (byte(t)&0x0f == COMPACT_BOOLEAN_TRUE) + p.boolValueIsNotNull = true + } + + // push the new field onto the field stack so we can keep the deltas going. + p.lastFieldId = int(id) + return +} + +func (p *TCompactProtocol) ReadFieldEnd() error { return nil } + +// Read a map header off the wire. If the size is zero, skip reading the key +// and value type. This means that 0-length maps will yield TMaps without the +// "correct" types. +func (p *TCompactProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, err error) { + size32, e := p.readVarint32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + + keyAndValueType := byte(STOP) + if size != 0 { + keyAndValueType, err = p.readByteDirect() + if err != nil { + return + } + } + keyType, _ = p.getTType(tCompactType(keyAndValueType >> 4)) + valueType, _ = p.getTType(tCompactType(keyAndValueType & 0xf)) + return +} + +func (p *TCompactProtocol) ReadMapEnd() error { return nil } + +// Read a list header off the wire. If the list size is 0-14, the size will +// be packed into the element type header. If it's a longer list, the 4 MSB +// of the element type header will be 0xF, and a varint will follow with the +// true size. +func (p *TCompactProtocol) ReadListBegin() (elemType TType, size int, err error) { + size_and_type, err := p.readByteDirect() + if err != nil { + return + } + size = int((size_and_type >> 4) & 0x0f) + if size == 15 { + size2, e := p.readVarint32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size2 < 0 { + err = invalidDataLength + return + } + size = int(size2) + } + elemType, e := p.getTType(tCompactType(size_and_type)) + if e != nil { + err = NewTProtocolException(e) + return + } + return +} + +func (p *TCompactProtocol) ReadListEnd() error { return nil } + +// Read a set header off the wire. If the set size is 0-14, the size will +// be packed into the element type header. If it's a longer set, the 4 MSB +// of the element type header will be 0xF, and a varint will follow with the +// true size. +func (p *TCompactProtocol) ReadSetBegin() (elemType TType, size int, err error) { + return p.ReadListBegin() +} + +func (p *TCompactProtocol) ReadSetEnd() error { return nil } + +// Read a boolean off the wire. If this is a boolean field, the value should +// already have been read during readFieldBegin, so we'll just consume the +// pre-stored value. Otherwise, read a byte. +func (p *TCompactProtocol) ReadBool() (value bool, err error) { + if p.boolValueIsNotNull { + p.boolValueIsNotNull = false + return p.boolValue, nil + } + v, err := p.readByteDirect() + return v == COMPACT_BOOLEAN_TRUE, err +} + +// Read a single byte off the wire. Nothing interesting here. +func (p *TCompactProtocol) ReadByte() (int8, error) { + v, err := p.readByteDirect() + if err != nil { + return 0, NewTProtocolException(err) + } + return int8(v), err +} + +// Read an i16 from the wire as a zigzag varint. +func (p *TCompactProtocol) ReadI16() (value int16, err error) { + v, err := p.ReadI32() + return int16(v), err +} + +// Read an i32 from the wire as a zigzag varint. +func (p *TCompactProtocol) ReadI32() (value int32, err error) { + v, e := p.readVarint32() + if e != nil { + return 0, NewTProtocolException(e) + } + value = p.zigzagToInt32(v) + return value, nil +} + +// Read an i64 from the wire as a zigzag varint. +func (p *TCompactProtocol) ReadI64() (value int64, err error) { + v, e := p.readVarint64() + if e != nil { + return 0, NewTProtocolException(e) + } + value = p.zigzagToInt64(v) + return value, nil +} + +// No magic here - just read a double off the wire. +func (p *TCompactProtocol) ReadDouble() (value float64, err error) { + longBits := p.buffer[0:8] + _, e := io.ReadFull(p.trans, longBits) + if e != nil { + return 0.0, NewTProtocolException(e) + } + return math.Float64frombits(p.bytesToUint64(longBits)), nil +} + +// Reads a []byte (via readBinary), and then UTF-8 decodes it. +func (p *TCompactProtocol) ReadString() (value string, err error) { + length, e := p.readVarint32() + if e != nil { + return "", NewTProtocolException(e) + } + if length < 0 { + return "", invalidDataLength + } + if uint64(length) > p.trans.RemainingBytes() { + return "", invalidDataLength + } + + if length == 0 { + return "", nil + } + var buf []byte + if length <= int32(len(p.buffer)) { + buf = p.buffer[0:length] + } else { + buf = make([]byte, length) + } + _, e = io.ReadFull(p.trans, buf) + return string(buf), NewTProtocolException(e) +} + +// Read a []byte from the wire. +func (p *TCompactProtocol) ReadBinary() (value []byte, err error) { + length, e := p.readVarint32() + if e != nil { + return nil, NewTProtocolException(e) + } + if length == 0 { + return []byte{}, nil + } + if length < 0 { + return nil, invalidDataLength + } + if uint64(length) > p.trans.RemainingBytes() { + return nil, invalidDataLength + } + + buf := make([]byte, length) + _, e = io.ReadFull(p.trans, buf) + return buf, NewTProtocolException(e) +} + +func (p *TCompactProtocol) Flush() (err error) { + return NewTProtocolException(p.trans.Flush()) +} + +func (p *TCompactProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TCompactProtocol) Transport() TTransport { + return p.origTransport +} + +// +// Internal writing methods +// + +// Abstract method for writing the start of lists and sets. List and sets on +// the wire differ only by the type indicator. +func (p *TCompactProtocol) writeCollectionBegin(elemType TType, size int) (int, error) { + if size <= 14 { + return 1, p.writeByteDirect(byte(int32(size<<4) | int32(p.getCompactType(elemType)))) + } + err := p.writeByteDirect(0xf0 | byte(p.getCompactType(elemType))) + if err != nil { + return 0, err + } + m, err := p.writeVarint32(int32(size)) + return 1 + m, err +} + +// Write an i32 as a varint. Results in 1-5 bytes on the wire. +// TODO(pomack): make a permanent buffer like writeVarint64? +func (p *TCompactProtocol) writeVarint32(n int32) (int, error) { + i32buf := p.buffer[0:5] + idx := 0 + for { + if (n & ^0x7F) == 0 { + i32buf[idx] = byte(n) + idx++ + // p.writeByteDirect(byte(n)); + break + // return; + } else { + i32buf[idx] = byte((n & 0x7F) | 0x80) + idx++ + // p.writeByteDirect(byte(((n & 0x7F) | 0x80))); + u := uint32(n) + n = int32(u >> 7) + } + } + return p.trans.Write(i32buf[0:idx]) +} + +// Write an i64 as a varint. Results in 1-10 bytes on the wire. +func (p *TCompactProtocol) writeVarint64(n int64) (int, error) { + varint64out := p.buffer[0:10] + idx := 0 + for { + if (n & ^0x7F) == 0 { + varint64out[idx] = byte(n) + idx++ + break + } else { + varint64out[idx] = byte((n & 0x7F) | 0x80) + idx++ + u := uint64(n) + n = int64(u >> 7) + } + } + return p.trans.Write(varint64out[0:idx]) +} + +// Convert l into a zigzag long. This allows negative numbers to be +// represented compactly as a varint. +func (p *TCompactProtocol) int64ToZigzag(l int64) int64 { + return (l << 1) ^ (l >> 63) +} + +// Convert l into a zigzag long. This allows negative numbers to be +// represented compactly as a varint. +func (p *TCompactProtocol) int32ToZigzag(n int32) int32 { + return (n << 1) ^ (n >> 31) +} + +func (p *TCompactProtocol) fixedUint64ToBytes(n uint64, buf []byte) { + binary.LittleEndian.PutUint64(buf, n) +} + +func (p *TCompactProtocol) fixedInt64ToBytes(n int64, buf []byte) { + binary.LittleEndian.PutUint64(buf, uint64(n)) +} + +// Writes a byte without any possibility of all that field header nonsense. +// Used internally by other writing methods that know they need to write a byte. +func (p *TCompactProtocol) writeByteDirect(b byte) error { + return p.trans.WriteByte(b) +} + +// Writes a byte without any possibility of all that field header nonsense. +func (p *TCompactProtocol) writeIntAsByteDirect(n int) (int, error) { + return 1, p.writeByteDirect(byte(n)) +} + +// +// Internal reading methods +// + +// Read an i32 from the wire as a varint. The MSB of each byte is set +// if there is another byte to follow. This can read up to 5 bytes. +func (p *TCompactProtocol) readVarint32() (int32, error) { + // if the wire contains the right stuff, this will just truncate the i64 we + // read and get us the right sign. + v, err := p.readVarint64() + return int32(v), err +} + +// Read an i64 from the wire as a proper varint. The MSB of each byte is set +// if there is another byte to follow. This can read up to 10 bytes. +func (p *TCompactProtocol) readVarint64() (int64, error) { + shift := uint(0) + result := int64(0) + for { + b, err := p.readByteDirect() + if err != nil { + return 0, err + } + result |= int64(b&0x7f) << shift + if (b & 0x80) != 0x80 { + break + } + shift += 7 + } + return result, nil +} + +// Read a byte, unlike ReadByte that reads Thrift-byte that is i8. +func (p *TCompactProtocol) readByteDirect() (byte, error) { + return p.trans.ReadByte() +} + +// +// encoding helpers +// + +// Convert from zigzag int to int. +func (p *TCompactProtocol) zigzagToInt32(n int32) int32 { + u := uint32(n) + return int32(u>>1) ^ -(n & 1) +} + +// Convert from zigzag long to long. +func (p *TCompactProtocol) zigzagToInt64(n int64) int64 { + u := uint64(n) + return int64(u>>1) ^ -(n & 1) +} + +// Note that it's important that the mask bytes are long literals, +// otherwise they'll default to ints, and when you shift an int left 56 bits, +// you just get a messed up int. +func (p *TCompactProtocol) bytesToInt64(b []byte) int64 { + return int64(binary.LittleEndian.Uint64(b)) +} + +// Note that it's important that the mask bytes are long literals, +// otherwise they'll default to ints, and when you shift an int left 56 bits, +// you just get a messed up int. +func (p *TCompactProtocol) bytesToUint64(b []byte) uint64 { + return binary.LittleEndian.Uint64(b) +} + +// +// type testing and converting +// + +func (p *TCompactProtocol) isBoolType(b byte) bool { + return (b&0x0f) == COMPACT_BOOLEAN_TRUE || (b&0x0f) == COMPACT_BOOLEAN_FALSE +} + +// Given a tCompactType constant, convert it to its corresponding +// TType value. +func (p *TCompactProtocol) getTType(t tCompactType) (TType, error) { + switch byte(t) & 0x0f { + case STOP: + return STOP, nil + case COMPACT_BOOLEAN_FALSE, COMPACT_BOOLEAN_TRUE: + return BOOL, nil + case COMPACT_BYTE: + return BYTE, nil + case COMPACT_I16: + return I16, nil + case COMPACT_I32: + return I32, nil + case COMPACT_I64: + return I64, nil + case COMPACT_DOUBLE: + return DOUBLE, nil + case COMPACT_BINARY: + return STRING, nil + case COMPACT_LIST: + return LIST, nil + case COMPACT_SET: + return SET, nil + case COMPACT_MAP: + return MAP, nil + case COMPACT_STRUCT: + return STRUCT, nil + } + return STOP, TException(fmt.Errorf("don't know what type: %v", t&0x0f)) +} + +// Given a TType value, find the appropriate TCompactProtocol.Types constant. +func (p *TCompactProtocol) getCompactType(t TType) tCompactType { + return ttypeToCompactType[t] +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/debug_protocol.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/debug_protocol.go new file mode 100644 index 00000000..d37252cc --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/debug_protocol.go @@ -0,0 +1,269 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "log" +) + +type TDebugProtocol struct { + Delegate TProtocol + LogPrefix string +} + +type TDebugProtocolFactory struct { + Underlying TProtocolFactory + LogPrefix string +} + +func NewTDebugProtocolFactory(underlying TProtocolFactory, logPrefix string) *TDebugProtocolFactory { + return &TDebugProtocolFactory{ + Underlying: underlying, + LogPrefix: logPrefix, + } +} + +func (t *TDebugProtocolFactory) GetProtocol(trans TTransport) TProtocol { + return &TDebugProtocol{ + Delegate: t.Underlying.GetProtocol(trans), + LogPrefix: t.LogPrefix, + } +} + +func (tdp *TDebugProtocol) WriteMessageBegin(name string, typeId TMessageType, seqid int32) error { + err := tdp.Delegate.WriteMessageBegin(name, typeId, seqid) + log.Printf("%sWriteMessageBegin(name=%#v, typeId=%#v, seqid=%#v) => %#v", tdp.LogPrefix, name, typeId, seqid, err) + return err +} +func (tdp *TDebugProtocol) WriteMessageEnd() error { + err := tdp.Delegate.WriteMessageEnd() + log.Printf("%sWriteMessageEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteStructBegin(name string) error { + err := tdp.Delegate.WriteStructBegin(name) + log.Printf("%sWriteStructBegin(name=%#v) => %#v", tdp.LogPrefix, name, err) + return err +} +func (tdp *TDebugProtocol) WriteStructEnd() error { + err := tdp.Delegate.WriteStructEnd() + log.Printf("%sWriteStructEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + err := tdp.Delegate.WriteFieldBegin(name, typeId, id) + log.Printf("%sWriteFieldBegin(name=%#v, typeId=%#v, id%#v) => %#v", tdp.LogPrefix, name, typeId, id, err) + return err +} +func (tdp *TDebugProtocol) WriteFieldEnd() error { + err := tdp.Delegate.WriteFieldEnd() + log.Printf("%sWriteFieldEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteFieldStop() error { + err := tdp.Delegate.WriteFieldStop() + log.Printf("%sWriteFieldStop() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + err := tdp.Delegate.WriteMapBegin(keyType, valueType, size) + log.Printf("%sWriteMapBegin(keyType=%#v, valueType=%#v, size=%#v) => %#v", tdp.LogPrefix, keyType, valueType, size, err) + return err +} +func (tdp *TDebugProtocol) WriteMapEnd() error { + err := tdp.Delegate.WriteMapEnd() + log.Printf("%sWriteMapEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteListBegin(elemType TType, size int) error { + err := tdp.Delegate.WriteListBegin(elemType, size) + log.Printf("%sWriteListBegin(elemType=%#v, size=%#v) => %#v", tdp.LogPrefix, elemType, size, err) + return err +} +func (tdp *TDebugProtocol) WriteListEnd() error { + err := tdp.Delegate.WriteListEnd() + log.Printf("%sWriteListEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteSetBegin(elemType TType, size int) error { + err := tdp.Delegate.WriteSetBegin(elemType, size) + log.Printf("%sWriteSetBegin(elemType=%#v, size=%#v) => %#v", tdp.LogPrefix, elemType, size, err) + return err +} +func (tdp *TDebugProtocol) WriteSetEnd() error { + err := tdp.Delegate.WriteSetEnd() + log.Printf("%sWriteSetEnd() => %#v", tdp.LogPrefix, err) + return err +} +func (tdp *TDebugProtocol) WriteBool(value bool) error { + err := tdp.Delegate.WriteBool(value) + log.Printf("%sWriteBool(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteByte(value int8) error { + err := tdp.Delegate.WriteByte(value) + log.Printf("%sWriteByte(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteI16(value int16) error { + err := tdp.Delegate.WriteI16(value) + log.Printf("%sWriteI16(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteI32(value int32) error { + err := tdp.Delegate.WriteI32(value) + log.Printf("%sWriteI32(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteI64(value int64) error { + err := tdp.Delegate.WriteI64(value) + log.Printf("%sWriteI64(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteDouble(value float64) error { + err := tdp.Delegate.WriteDouble(value) + log.Printf("%sWriteDouble(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteString(value string) error { + err := tdp.Delegate.WriteString(value) + log.Printf("%sWriteString(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} +func (tdp *TDebugProtocol) WriteBinary(value []byte) error { + err := tdp.Delegate.WriteBinary(value) + log.Printf("%sWriteBinary(value=%#v) => %#v", tdp.LogPrefix, value, err) + return err +} + +func (tdp *TDebugProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error) { + name, typeId, seqid, err = tdp.Delegate.ReadMessageBegin() + log.Printf("%sReadMessageBegin() (name=%#v, typeId=%#v, seqid=%#v, err=%#v)", tdp.LogPrefix, name, typeId, seqid, err) + return +} +func (tdp *TDebugProtocol) ReadMessageEnd() (err error) { + err = tdp.Delegate.ReadMessageEnd() + log.Printf("%sReadMessageEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadStructBegin() (name string, err error) { + name, err = tdp.Delegate.ReadStructBegin() + log.Printf("%sReadStructBegin() (name%#v, err=%#v)", tdp.LogPrefix, name, err) + return +} +func (tdp *TDebugProtocol) ReadStructEnd() (err error) { + err = tdp.Delegate.ReadStructEnd() + log.Printf("%sReadStructEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadFieldBegin() (name string, typeId TType, id int16, err error) { + name, typeId, id, err = tdp.Delegate.ReadFieldBegin() + log.Printf("%sReadFieldBegin() (name=%#v, typeId=%#v, id=%#v, err=%#v)", tdp.LogPrefix, name, typeId, id, err) + return +} +func (tdp *TDebugProtocol) ReadFieldEnd() (err error) { + err = tdp.Delegate.ReadFieldEnd() + log.Printf("%sReadFieldEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, err error) { + keyType, valueType, size, err = tdp.Delegate.ReadMapBegin() + log.Printf("%sReadMapBegin() (keyType=%#v, valueType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, keyType, valueType, size, err) + return +} +func (tdp *TDebugProtocol) ReadMapEnd() (err error) { + err = tdp.Delegate.ReadMapEnd() + log.Printf("%sReadMapEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadListBegin() (elemType TType, size int, err error) { + elemType, size, err = tdp.Delegate.ReadListBegin() + log.Printf("%sReadListBegin() (elemType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, elemType, size, err) + return +} +func (tdp *TDebugProtocol) ReadListEnd() (err error) { + err = tdp.Delegate.ReadListEnd() + log.Printf("%sReadListEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadSetBegin() (elemType TType, size int, err error) { + elemType, size, err = tdp.Delegate.ReadSetBegin() + log.Printf("%sReadSetBegin() (elemType=%#v, size=%#v, err=%#v)", tdp.LogPrefix, elemType, size, err) + return +} +func (tdp *TDebugProtocol) ReadSetEnd() (err error) { + err = tdp.Delegate.ReadSetEnd() + log.Printf("%sReadSetEnd() err=%#v", tdp.LogPrefix, err) + return +} +func (tdp *TDebugProtocol) ReadBool() (value bool, err error) { + value, err = tdp.Delegate.ReadBool() + log.Printf("%sReadBool() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadByte() (value int8, err error) { + value, err = tdp.Delegate.ReadByte() + log.Printf("%sReadByte() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadI16() (value int16, err error) { + value, err = tdp.Delegate.ReadI16() + log.Printf("%sReadI16() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadI32() (value int32, err error) { + value, err = tdp.Delegate.ReadI32() + log.Printf("%sReadI32() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadI64() (value int64, err error) { + value, err = tdp.Delegate.ReadI64() + log.Printf("%sReadI64() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadDouble() (value float64, err error) { + value, err = tdp.Delegate.ReadDouble() + log.Printf("%sReadDouble() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadString() (value string, err error) { + value, err = tdp.Delegate.ReadString() + log.Printf("%sReadString() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) ReadBinary() (value []byte, err error) { + value, err = tdp.Delegate.ReadBinary() + log.Printf("%sReadBinary() (value=%#v, err=%#v)", tdp.LogPrefix, value, err) + return +} +func (tdp *TDebugProtocol) Skip(fieldType TType) (err error) { + err = tdp.Delegate.Skip(fieldType) + log.Printf("%sSkip(fieldType=%#v) (err=%#v)", tdp.LogPrefix, fieldType, err) + return +} +func (tdp *TDebugProtocol) Flush() (err error) { + err = tdp.Delegate.Flush() + log.Printf("%sFlush() (err=%#v)", tdp.LogPrefix, err) + return +} + +func (tdp *TDebugProtocol) Transport() TTransport { + return tdp.Delegate.Transport() +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/deserializer.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/deserializer.go new file mode 100644 index 00000000..91a0983a --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/deserializer.go @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +type TDeserializer struct { + Transport TTransport + Protocol TProtocol +} + +func NewTDeserializer() *TDeserializer { + var transport TTransport + transport = NewTMemoryBufferLen(1024) + + protocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport) + + return &TDeserializer{ + transport, + protocol} +} + +func (t *TDeserializer) ReadString(msg TStruct, s string) (err error) { + err = nil + if _, err = t.Transport.Write([]byte(s)); err != nil { + return + } + if err = msg.Read(t.Protocol); err != nil { + return + } + return +} + +func (t *TDeserializer) Read(msg TStruct, b []byte) (err error) { + err = nil + if _, err = t.Transport.Write(b); err != nil { + return + } + if err = msg.Read(t.Protocol); err != nil { + return + } + return +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/exception.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/exception.go new file mode 100644 index 00000000..ea8d6f66 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/exception.go @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" +) + +// Generic Thrift exception +type TException interface { + error +} + +// Prepends additional information to an error without losing the Thrift exception interface +func PrependError(prepend string, err error) error { + if t, ok := err.(TTransportException); ok { + return NewTTransportException(t.TypeId(), prepend+t.Error()) + } + if t, ok := err.(TProtocolException); ok { + return NewTProtocolExceptionWithType(t.TypeId(), errors.New(prepend+err.Error())) + } + if t, ok := err.(TApplicationException); ok { + return NewTApplicationException(t.TypeId(), prepend+t.Error()) + } + + return errors.New(prepend + err.Error()) +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/field.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/field.go new file mode 100644 index 00000000..9d665255 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/field.go @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Helper class that encapsulates field metadata. +type field struct { + name string + typeId TType + id int +} + +func newField(n string, t TType, i int) *field { + return &field{name: n, typeId: t, id: i} +} + +func (p *field) Name() string { + if p == nil { + return "" + } + return p.name +} + +func (p *field) TypeId() TType { + if p == nil { + return TType(VOID) + } + return p.typeId +} + +func (p *field) Id() int { + if p == nil { + return -1 + } + return p.id +} + +func (p *field) String() string { + if p == nil { + return "" + } + return "" +} + +var ANONYMOUS_FIELD *field + +type fieldSlice []field + +func (p fieldSlice) Len() int { + return len(p) +} + +func (p fieldSlice) Less(i, j int) bool { + return p[i].Id() < p[j].Id() +} + +func (p fieldSlice) Swap(i, j int) { + p[i], p[j] = p[j], p[i] +} + +func init() { + ANONYMOUS_FIELD = newField("", STOP, 0) +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/framed_transport.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/framed_transport.go new file mode 100644 index 00000000..d0bae21b --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/framed_transport.go @@ -0,0 +1,167 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bufio" + "bytes" + "encoding/binary" + "fmt" + "io" +) + +const DEFAULT_MAX_LENGTH = 16384000 + +type TFramedTransport struct { + transport TTransport + buf bytes.Buffer + reader *bufio.Reader + frameSize uint32 //Current remaining size of the frame. if ==0 read next frame header + buffer [4]byte + maxLength uint32 +} + +type tFramedTransportFactory struct { + factory TTransportFactory + maxLength uint32 +} + +func NewTFramedTransportFactory(factory TTransportFactory) TTransportFactory { + return &tFramedTransportFactory{factory: factory, maxLength: DEFAULT_MAX_LENGTH} +} + +func NewTFramedTransportFactoryMaxLength(factory TTransportFactory, maxLength uint32) TTransportFactory { + return &tFramedTransportFactory{factory: factory, maxLength: maxLength} +} + +func (p *tFramedTransportFactory) GetTransport(base TTransport) TTransport { + return NewTFramedTransportMaxLength(p.factory.GetTransport(base), p.maxLength) +} + +func NewTFramedTransport(transport TTransport) *TFramedTransport { + return &TFramedTransport{transport: transport, reader: bufio.NewReader(transport), maxLength: DEFAULT_MAX_LENGTH} +} + +func NewTFramedTransportMaxLength(transport TTransport, maxLength uint32) *TFramedTransport { + return &TFramedTransport{transport: transport, reader: bufio.NewReader(transport), maxLength: maxLength} +} + +func (p *TFramedTransport) Open() error { + return p.transport.Open() +} + +func (p *TFramedTransport) IsOpen() bool { + return p.transport.IsOpen() +} + +func (p *TFramedTransport) Close() error { + return p.transport.Close() +} + +func (p *TFramedTransport) Read(buf []byte) (l int, err error) { + if p.frameSize == 0 { + p.frameSize, err = p.readFrameHeader() + if err != nil { + return + } + } + if p.frameSize < uint32(len(buf)) { + frameSize := p.frameSize + tmp := make([]byte, p.frameSize) + l, err = p.Read(tmp) + copy(buf, tmp) + if err == nil { + err = NewTTransportExceptionFromError(fmt.Errorf("Not enough frame size %d to read %d bytes", frameSize, len(buf))) + return + } + } + got, err := p.reader.Read(buf) + p.frameSize = p.frameSize - uint32(got) + //sanity check + if p.frameSize < 0 { + return 0, NewTTransportException(UNKNOWN_TRANSPORT_EXCEPTION, "Negative frame size") + } + return got, NewTTransportExceptionFromError(err) +} + +func (p *TFramedTransport) ReadByte() (c byte, err error) { + if p.frameSize == 0 { + p.frameSize, err = p.readFrameHeader() + if err != nil { + return + } + } + if p.frameSize < 1 { + return 0, NewTTransportExceptionFromError(fmt.Errorf("Not enough frame size %d to read %d bytes", p.frameSize, 1)) + } + c, err = p.reader.ReadByte() + if err == nil { + p.frameSize-- + } + return +} + +func (p *TFramedTransport) Write(buf []byte) (int, error) { + n, err := p.buf.Write(buf) + return n, NewTTransportExceptionFromError(err) +} + +func (p *TFramedTransport) WriteByte(c byte) error { + return p.buf.WriteByte(c) +} + +func (p *TFramedTransport) WriteString(s string) (n int, err error) { + return p.buf.WriteString(s) +} + +func (p *TFramedTransport) Flush() error { + size := p.buf.Len() + buf := p.buffer[:4] + binary.BigEndian.PutUint32(buf, uint32(size)) + _, err := p.transport.Write(buf) + if err != nil { + return NewTTransportExceptionFromError(err) + } + if size > 0 { + if n, err := p.buf.WriteTo(p.transport); err != nil { + print("Error while flushing write buffer of size ", size, " to transport, only wrote ", n, " bytes: ", err.Error(), "\n") + return NewTTransportExceptionFromError(err) + } + } + err = p.transport.Flush() + return NewTTransportExceptionFromError(err) +} + +func (p *TFramedTransport) readFrameHeader() (uint32, error) { + buf := p.buffer[:4] + if _, err := io.ReadFull(p.reader, buf); err != nil { + return 0, err + } + size := binary.BigEndian.Uint32(buf) + if size < 0 || size > p.maxLength { + return 0, NewTTransportException(UNKNOWN_TRANSPORT_EXCEPTION, fmt.Sprintf("Incorrect frame size (%d)", size)) + } + return size, nil +} + +func (p *TFramedTransport) RemainingBytes() (num_bytes uint64) { + return uint64(p.frameSize) +} + diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/http_client.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/http_client.go new file mode 100644 index 00000000..88eb2c12 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/http_client.go @@ -0,0 +1,258 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bytes" + "io" + "io/ioutil" + "net/http" + "net/url" + "strconv" +) + +// Default to using the shared http client. Library users are +// free to change this global client or specify one through +// THttpClientOptions. +var DefaultHttpClient *http.Client = http.DefaultClient + +type THttpClient struct { + client *http.Client + response *http.Response + url *url.URL + requestBuffer *bytes.Buffer + header http.Header + nsecConnectTimeout int64 + nsecReadTimeout int64 +} + +type THttpClientTransportFactory struct { + options THttpClientOptions + url string + isPost bool +} + +func (p *THttpClientTransportFactory) GetTransport(trans TTransport) TTransport { + if trans != nil { + t, ok := trans.(*THttpClient) + if ok && t.url != nil { + if t.requestBuffer != nil { + t2, _ := NewTHttpPostClientWithOptions(t.url.String(), p.options) + return t2 + } + t2, _ := NewTHttpClientWithOptions(t.url.String(), p.options) + return t2 + } + } + if p.isPost { + s, _ := NewTHttpPostClientWithOptions(p.url, p.options) + return s + } + s, _ := NewTHttpClientWithOptions(p.url, p.options) + return s +} + +type THttpClientOptions struct { + // If nil, DefaultHttpClient is used + Client *http.Client +} + +func NewTHttpClientTransportFactory(url string) *THttpClientTransportFactory { + return NewTHttpClientTransportFactoryWithOptions(url, THttpClientOptions{}) +} + +func NewTHttpClientTransportFactoryWithOptions(url string, options THttpClientOptions) *THttpClientTransportFactory { + return &THttpClientTransportFactory{url: url, isPost: false, options: options} +} + +func NewTHttpPostClientTransportFactory(url string) *THttpClientTransportFactory { + return NewTHttpPostClientTransportFactoryWithOptions(url, THttpClientOptions{}) +} + +func NewTHttpPostClientTransportFactoryWithOptions(url string, options THttpClientOptions) *THttpClientTransportFactory { + return &THttpClientTransportFactory{url: url, isPost: true, options: options} +} + +func NewTHttpClientWithOptions(urlstr string, options THttpClientOptions) (TTransport, error) { + parsedURL, err := url.Parse(urlstr) + if err != nil { + return nil, err + } + response, err := http.Get(urlstr) + if err != nil { + return nil, err + } + client := options.Client + if client == nil { + client = DefaultHttpClient + } + httpHeader := map[string][]string{"Content-Type": []string{"application/x-thrift"}} + return &THttpClient{client: client, response: response, url: parsedURL, header: httpHeader}, nil +} + +func NewTHttpClient(urlstr string) (TTransport, error) { + return NewTHttpClientWithOptions(urlstr, THttpClientOptions{}) +} + +func NewTHttpPostClientWithOptions(urlstr string, options THttpClientOptions) (TTransport, error) { + parsedURL, err := url.Parse(urlstr) + if err != nil { + return nil, err + } + buf := make([]byte, 0, 1024) + client := options.Client + if client == nil { + client = DefaultHttpClient + } + httpHeader := map[string][]string{"Content-Type": []string{"application/x-thrift"}} + return &THttpClient{client: client, url: parsedURL, requestBuffer: bytes.NewBuffer(buf), header: httpHeader}, nil +} + +func NewTHttpPostClient(urlstr string) (TTransport, error) { + return NewTHttpPostClientWithOptions(urlstr, THttpClientOptions{}) +} + +// Set the HTTP Header for this specific Thrift Transport +// It is important that you first assert the TTransport as a THttpClient type +// like so: +// +// httpTrans := trans.(THttpClient) +// httpTrans.SetHeader("User-Agent","Thrift Client 1.0") +func (p *THttpClient) SetHeader(key string, value string) { + p.header.Add(key, value) +} + +// Get the HTTP Header represented by the supplied Header Key for this specific Thrift Transport +// It is important that you first assert the TTransport as a THttpClient type +// like so: +// +// httpTrans := trans.(THttpClient) +// hdrValue := httpTrans.GetHeader("User-Agent") +func (p *THttpClient) GetHeader(key string) string { + return p.header.Get(key) +} + +// Deletes the HTTP Header given a Header Key for this specific Thrift Transport +// It is important that you first assert the TTransport as a THttpClient type +// like so: +// +// httpTrans := trans.(THttpClient) +// httpTrans.DelHeader("User-Agent") +func (p *THttpClient) DelHeader(key string) { + p.header.Del(key) +} + +func (p *THttpClient) Open() error { + // do nothing + return nil +} + +func (p *THttpClient) IsOpen() bool { + return p.response != nil || p.requestBuffer != nil +} + +func (p *THttpClient) closeResponse() error { + var err error + if p.response != nil && p.response.Body != nil { + // The docs specify that if keepalive is enabled and the response body is not + // read to completion the connection will never be returned to the pool and + // reused. Errors are being ignored here because if the connection is invalid + // and this fails for some reason, the Close() method will do any remaining + // cleanup. + io.Copy(ioutil.Discard, p.response.Body) + + err = p.response.Body.Close() + } + + p.response = nil + return err +} + +func (p *THttpClient) Close() error { + if p.requestBuffer != nil { + p.requestBuffer.Reset() + p.requestBuffer = nil + } + return p.closeResponse() +} + +func (p *THttpClient) Read(buf []byte) (int, error) { + if p.response == nil { + return 0, NewTTransportException(NOT_OPEN, "Response buffer is empty, no request.") + } + n, err := p.response.Body.Read(buf) + if n > 0 && (err == nil || err == io.EOF) { + return n, nil + } + return n, NewTTransportExceptionFromError(err) +} + +func (p *THttpClient) ReadByte() (c byte, err error) { + return readByte(p.response.Body) +} + +func (p *THttpClient) Write(buf []byte) (int, error) { + n, err := p.requestBuffer.Write(buf) + return n, err +} + +func (p *THttpClient) WriteByte(c byte) error { + return p.requestBuffer.WriteByte(c) +} + +func (p *THttpClient) WriteString(s string) (n int, err error) { + return p.requestBuffer.WriteString(s) +} + +func (p *THttpClient) Flush() error { + // Close any previous response body to avoid leaking connections. + p.closeResponse() + + req, err := http.NewRequest("POST", p.url.String(), p.requestBuffer) + if err != nil { + return NewTTransportExceptionFromError(err) + } + req.Header = p.header + response, err := p.client.Do(req) + if err != nil { + return NewTTransportExceptionFromError(err) + } + if response.StatusCode != http.StatusOK { + // Close the response to avoid leaking file descriptors. closeResponse does + // more than just call Close(), so temporarily assign it and reuse the logic. + p.response = response + p.closeResponse() + + // TODO(pomack) log bad response + return NewTTransportException(UNKNOWN_TRANSPORT_EXCEPTION, "HTTP Response code: "+strconv.Itoa(response.StatusCode)) + } + p.response = response + return nil +} + +func (p *THttpClient) RemainingBytes() (num_bytes uint64) { + len := p.response.ContentLength + if len >= 0 { + return uint64(len) + } + + const maxSize = ^uint64(0) + return maxSize // the thruth is, we just don't know unless framed is used +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/http_transport.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/http_transport.go new file mode 100644 index 00000000..f6d7458d --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/http_transport.go @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import "net/http" + +// NewThriftHandlerFunc is a function that create a ready to use Apache Thrift Handler function +func NewThriftHandlerFunc(processor TProcessor, + inPfactory, outPfactory TProtocolFactory) func(w http.ResponseWriter, r *http.Request) { + + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Content-Type", "application/x-thrift") + + transport := NewStreamTransport(r.Body, w) + processor.Process(inPfactory.GetProtocol(transport), outPfactory.GetProtocol(transport)) + } +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/iostream_transport.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/iostream_transport.go new file mode 100644 index 00000000..794872ff --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/iostream_transport.go @@ -0,0 +1,214 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bufio" + "io" +) + +// StreamTransport is a Transport made of an io.Reader and/or an io.Writer +type StreamTransport struct { + io.Reader + io.Writer + isReadWriter bool + closed bool +} + +type StreamTransportFactory struct { + Reader io.Reader + Writer io.Writer + isReadWriter bool +} + +func (p *StreamTransportFactory) GetTransport(trans TTransport) TTransport { + if trans != nil { + t, ok := trans.(*StreamTransport) + if ok { + if t.isReadWriter { + return NewStreamTransportRW(t.Reader.(io.ReadWriter)) + } + if t.Reader != nil && t.Writer != nil { + return NewStreamTransport(t.Reader, t.Writer) + } + if t.Reader != nil && t.Writer == nil { + return NewStreamTransportR(t.Reader) + } + if t.Reader == nil && t.Writer != nil { + return NewStreamTransportW(t.Writer) + } + return &StreamTransport{} + } + } + if p.isReadWriter { + return NewStreamTransportRW(p.Reader.(io.ReadWriter)) + } + if p.Reader != nil && p.Writer != nil { + return NewStreamTransport(p.Reader, p.Writer) + } + if p.Reader != nil && p.Writer == nil { + return NewStreamTransportR(p.Reader) + } + if p.Reader == nil && p.Writer != nil { + return NewStreamTransportW(p.Writer) + } + return &StreamTransport{} +} + +func NewStreamTransportFactory(reader io.Reader, writer io.Writer, isReadWriter bool) *StreamTransportFactory { + return &StreamTransportFactory{Reader: reader, Writer: writer, isReadWriter: isReadWriter} +} + +func NewStreamTransport(r io.Reader, w io.Writer) *StreamTransport { + return &StreamTransport{Reader: bufio.NewReader(r), Writer: bufio.NewWriter(w)} +} + +func NewStreamTransportR(r io.Reader) *StreamTransport { + return &StreamTransport{Reader: bufio.NewReader(r)} +} + +func NewStreamTransportW(w io.Writer) *StreamTransport { + return &StreamTransport{Writer: bufio.NewWriter(w)} +} + +func NewStreamTransportRW(rw io.ReadWriter) *StreamTransport { + bufrw := bufio.NewReadWriter(bufio.NewReader(rw), bufio.NewWriter(rw)) + return &StreamTransport{Reader: bufrw, Writer: bufrw, isReadWriter: true} +} + +func (p *StreamTransport) IsOpen() bool { + return !p.closed +} + +// implicitly opened on creation, can't be reopened once closed +func (p *StreamTransport) Open() error { + if !p.closed { + return NewTTransportException(ALREADY_OPEN, "StreamTransport already open.") + } else { + return NewTTransportException(NOT_OPEN, "cannot reopen StreamTransport.") + } +} + +// Closes both the input and output streams. +func (p *StreamTransport) Close() error { + if p.closed { + return NewTTransportException(NOT_OPEN, "StreamTransport already closed.") + } + p.closed = true + closedReader := false + if p.Reader != nil { + c, ok := p.Reader.(io.Closer) + if ok { + e := c.Close() + closedReader = true + if e != nil { + return e + } + } + p.Reader = nil + } + if p.Writer != nil && (!closedReader || !p.isReadWriter) { + c, ok := p.Writer.(io.Closer) + if ok { + e := c.Close() + if e != nil { + return e + } + } + p.Writer = nil + } + return nil +} + +// Flushes the underlying output stream if not null. +func (p *StreamTransport) Flush() error { + if p.Writer == nil { + return NewTTransportException(NOT_OPEN, "Cannot flush null outputStream") + } + f, ok := p.Writer.(Flusher) + if ok { + err := f.Flush() + if err != nil { + return NewTTransportExceptionFromError(err) + } + } + return nil +} + +func (p *StreamTransport) Read(c []byte) (n int, err error) { + n, err = p.Reader.Read(c) + if err != nil { + err = NewTTransportExceptionFromError(err) + } + return +} + +func (p *StreamTransport) ReadByte() (c byte, err error) { + f, ok := p.Reader.(io.ByteReader) + if ok { + c, err = f.ReadByte() + } else { + c, err = readByte(p.Reader) + } + if err != nil { + err = NewTTransportExceptionFromError(err) + } + return +} + +func (p *StreamTransport) Write(c []byte) (n int, err error) { + n, err = p.Writer.Write(c) + if err != nil { + err = NewTTransportExceptionFromError(err) + } + return +} + +func (p *StreamTransport) WriteByte(c byte) (err error) { + f, ok := p.Writer.(io.ByteWriter) + if ok { + err = f.WriteByte(c) + } else { + err = writeByte(p.Writer, c) + } + if err != nil { + err = NewTTransportExceptionFromError(err) + } + return +} + +func (p *StreamTransport) WriteString(s string) (n int, err error) { + f, ok := p.Writer.(stringWriter) + if ok { + n, err = f.WriteString(s) + } else { + n, err = p.Writer.Write([]byte(s)) + } + if err != nil { + err = NewTTransportExceptionFromError(err) + } + return +} + +func (p *StreamTransport) RemainingBytes() (num_bytes uint64) { + const maxSize = ^uint64(0) + return maxSize // the thruth is, we just don't know unless framed is used +} + diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/json_protocol.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/json_protocol.go new file mode 100644 index 00000000..442fa914 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/json_protocol.go @@ -0,0 +1,583 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "encoding/base64" + "fmt" +) + +const ( + THRIFT_JSON_PROTOCOL_VERSION = 1 +) + +// for references to _ParseContext see tsimplejson_protocol.go + +// JSON protocol implementation for thrift. +// +// This protocol produces/consumes a simple output format +// suitable for parsing by scripting languages. It should not be +// confused with the full-featured TJSONProtocol. +// +type TJSONProtocol struct { + *TSimpleJSONProtocol +} + +// Constructor +func NewTJSONProtocol(t TTransport) *TJSONProtocol { + v := &TJSONProtocol{TSimpleJSONProtocol: NewTSimpleJSONProtocol(t)} + v.parseContextStack = append(v.parseContextStack, int(_CONTEXT_IN_TOPLEVEL)) + v.dumpContext = append(v.dumpContext, int(_CONTEXT_IN_TOPLEVEL)) + return v +} + +// Factory +type TJSONProtocolFactory struct{} + +func (p *TJSONProtocolFactory) GetProtocol(trans TTransport) TProtocol { + return NewTJSONProtocol(trans) +} + +func NewTJSONProtocolFactory() *TJSONProtocolFactory { + return &TJSONProtocolFactory{} +} + +func (p *TJSONProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { + p.resetContextStack() // THRIFT-3735 + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteI32(THRIFT_JSON_PROTOCOL_VERSION); e != nil { + return e + } + if e := p.WriteString(name); e != nil { + return e + } + if e := p.WriteByte(int8(typeId)); e != nil { + return e + } + if e := p.WriteI32(seqId); e != nil { + return e + } + return nil +} + +func (p *TJSONProtocol) WriteMessageEnd() error { + return p.OutputListEnd() +} + +func (p *TJSONProtocol) WriteStructBegin(name string) error { + if e := p.OutputObjectBegin(); e != nil { + return e + } + return nil +} + +func (p *TJSONProtocol) WriteStructEnd() error { + return p.OutputObjectEnd() +} + +func (p *TJSONProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + if e := p.WriteI16(id); e != nil { + return e + } + if e := p.OutputObjectBegin(); e != nil { + return e + } + s, e1 := p.TypeIdToString(typeId) + if e1 != nil { + return e1 + } + if e := p.WriteString(s); e != nil { + return e + } + return nil +} + +func (p *TJSONProtocol) WriteFieldEnd() error { + return p.OutputObjectEnd() +} + +func (p *TJSONProtocol) WriteFieldStop() error { return nil } + +func (p *TJSONProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + s, e1 := p.TypeIdToString(keyType) + if e1 != nil { + return e1 + } + if e := p.WriteString(s); e != nil { + return e + } + s, e1 = p.TypeIdToString(valueType) + if e1 != nil { + return e1 + } + if e := p.WriteString(s); e != nil { + return e + } + if e := p.WriteI64(int64(size)); e != nil { + return e + } + return p.OutputObjectBegin() +} + +func (p *TJSONProtocol) WriteMapEnd() error { + if e := p.OutputObjectEnd(); e != nil { + return e + } + return p.OutputListEnd() +} + +func (p *TJSONProtocol) WriteListBegin(elemType TType, size int) error { + return p.OutputElemListBegin(elemType, size) +} + +func (p *TJSONProtocol) WriteListEnd() error { + return p.OutputListEnd() +} + +func (p *TJSONProtocol) WriteSetBegin(elemType TType, size int) error { + return p.OutputElemListBegin(elemType, size) +} + +func (p *TJSONProtocol) WriteSetEnd() error { + return p.OutputListEnd() +} + +func (p *TJSONProtocol) WriteBool(b bool) error { + if b { + return p.WriteI32(1) + } + return p.WriteI32(0) +} + +func (p *TJSONProtocol) WriteByte(b int8) error { + return p.WriteI32(int32(b)) +} + +func (p *TJSONProtocol) WriteI16(v int16) error { + return p.WriteI32(int32(v)) +} + +func (p *TJSONProtocol) WriteI32(v int32) error { + return p.OutputI64(int64(v)) +} + +func (p *TJSONProtocol) WriteI64(v int64) error { + return p.OutputI64(int64(v)) +} + +func (p *TJSONProtocol) WriteDouble(v float64) error { + return p.OutputF64(v) +} + +func (p *TJSONProtocol) WriteString(v string) error { + return p.OutputString(v) +} + +func (p *TJSONProtocol) WriteBinary(v []byte) error { + // JSON library only takes in a string, + // not an arbitrary byte array, to ensure bytes are transmitted + // efficiently we must convert this into a valid JSON string + // therefore we use base64 encoding to avoid excessive escaping/quoting + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.write(JSON_QUOTE_BYTES); e != nil { + return NewTProtocolException(e) + } + writer := base64.NewEncoder(base64.StdEncoding, p.writer) + if _, e := writer.Write(v); e != nil { + p.writer.Reset(p.trans) // THRIFT-3735 + return NewTProtocolException(e) + } + if e := writer.Close(); e != nil { + return NewTProtocolException(e) + } + if _, e := p.write(JSON_QUOTE_BYTES); e != nil { + return NewTProtocolException(e) + } + return p.OutputPostValue() +} + +// Reading methods. +func (p *TJSONProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + p.resetContextStack() // THRIFT-3735 + if isNull, err := p.ParseListBegin(); isNull || err != nil { + return name, typeId, seqId, err + } + version, err := p.ReadI32() + if err != nil { + return name, typeId, seqId, err + } + if version != THRIFT_JSON_PROTOCOL_VERSION { + e := fmt.Errorf("Unknown Protocol version %d, expected version %d", version, THRIFT_JSON_PROTOCOL_VERSION) + return name, typeId, seqId, NewTProtocolExceptionWithType(INVALID_DATA, e) + + } + if name, err = p.ReadString(); err != nil { + return name, typeId, seqId, err + } + bTypeId, err := p.ReadByte() + typeId = TMessageType(bTypeId) + if err != nil { + return name, typeId, seqId, err + } + if seqId, err = p.ReadI32(); err != nil { + return name, typeId, seqId, err + } + return name, typeId, seqId, nil +} + +func (p *TJSONProtocol) ReadMessageEnd() error { + err := p.ParseListEnd() + return err +} + +func (p *TJSONProtocol) ReadStructBegin() (name string, err error) { + _, err = p.ParseObjectStart() + return "", err +} + +func (p *TJSONProtocol) ReadStructEnd() error { + return p.ParseObjectEnd() +} + +func (p *TJSONProtocol) ReadFieldBegin() (string, TType, int16, error) { + b, _ := p.reader.Peek(1) + if len(b) < 1 || b[0] == JSON_RBRACE[0] || b[0] == JSON_RBRACKET[0] { + return "", STOP, -1, nil + } + fieldId, err := p.ReadI16() + if err != nil { + return "", STOP, fieldId, err + } + if _, err = p.ParseObjectStart(); err != nil { + return "", STOP, fieldId, err + } + sType, err := p.ReadString() + if err != nil { + return "", STOP, fieldId, err + } + fType, err := p.StringToTypeId(sType) + return "", fType, fieldId, err +} + +func (p *TJSONProtocol) ReadFieldEnd() error { + return p.ParseObjectEnd() +} + +func (p *TJSONProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, VOID, 0, e + } + + // read keyType + sKeyType, e := p.ReadString() + if e != nil { + return keyType, valueType, size, e + } + keyType, e = p.StringToTypeId(sKeyType) + if e != nil { + return keyType, valueType, size, e + } + + // read valueType + sValueType, e := p.ReadString() + if e != nil { + return keyType, valueType, size, e + } + valueType, e = p.StringToTypeId(sValueType) + if e != nil { + return keyType, valueType, size, e + } + + // read size + iSize, e := p.ReadI64() + if e != nil { + return keyType, valueType, size, e + } + size = int(iSize) + + _, e = p.ParseObjectStart() + return keyType, valueType, size, e +} + +func (p *TJSONProtocol) ReadMapEnd() error { + e := p.ParseObjectEnd() + if e != nil { + return e + } + return p.ParseListEnd() +} + +func (p *TJSONProtocol) ReadListBegin() (elemType TType, size int, e error) { + return p.ParseElemListBegin() +} + +func (p *TJSONProtocol) ReadListEnd() error { + return p.ParseListEnd() +} + +func (p *TJSONProtocol) ReadSetBegin() (elemType TType, size int, e error) { + return p.ParseElemListBegin() +} + +func (p *TJSONProtocol) ReadSetEnd() error { + return p.ParseListEnd() +} + +func (p *TJSONProtocol) ReadBool() (bool, error) { + value, err := p.ReadI32() + return (value != 0), err +} + +func (p *TJSONProtocol) ReadByte() (int8, error) { + v, err := p.ReadI64() + return int8(v), err +} + +func (p *TJSONProtocol) ReadI16() (int16, error) { + v, err := p.ReadI64() + return int16(v), err +} + +func (p *TJSONProtocol) ReadI32() (int32, error) { + v, err := p.ReadI64() + return int32(v), err +} + +func (p *TJSONProtocol) ReadI64() (int64, error) { + v, _, err := p.ParseI64() + return v, err +} + +func (p *TJSONProtocol) ReadDouble() (float64, error) { + v, _, err := p.ParseF64() + return v, err +} + +func (p *TJSONProtocol) ReadString() (string, error) { + var v string + if err := p.ParsePreValue(); err != nil { + return v, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 && f[0] == JSON_QUOTE { + p.reader.ReadByte() + value, err := p.ParseStringBody() + v = value + if err != nil { + return v, err + } + } else if len(f) > 0 && f[0] == JSON_NULL[0] { + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return v, NewTProtocolException(err) + } + if string(b) != string(JSON_NULL) { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } else { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return v, p.ParsePostValue() +} + +func (p *TJSONProtocol) ReadBinary() ([]byte, error) { + var v []byte + if err := p.ParsePreValue(); err != nil { + return nil, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 && f[0] == JSON_QUOTE { + p.reader.ReadByte() + value, err := p.ParseBase64EncodedBody() + v = value + if err != nil { + return v, err + } + } else if len(f) > 0 && f[0] == JSON_NULL[0] { + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return v, NewTProtocolException(err) + } + if string(b) != string(JSON_NULL) { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } else { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + + return v, p.ParsePostValue() +} + +func (p *TJSONProtocol) Flush() (err error) { + err = p.writer.Flush() + if err == nil { + err = p.trans.Flush() + } + return NewTProtocolException(err) +} + +func (p *TJSONProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TJSONProtocol) Transport() TTransport { + return p.trans +} + +func (p *TJSONProtocol) OutputElemListBegin(elemType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + s, e1 := p.TypeIdToString(elemType) + if e1 != nil { + return e1 + } + if e := p.WriteString(s); e != nil { + return e + } + if e := p.WriteI64(int64(size)); e != nil { + return e + } + return nil +} + +func (p *TJSONProtocol) ParseElemListBegin() (elemType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, 0, e + } + sElemType, err := p.ReadString() + if err != nil { + return VOID, size, err + } + elemType, err = p.StringToTypeId(sElemType) + if err != nil { + return elemType, size, err + } + nSize, err2 := p.ReadI64() + size = int(nSize) + return elemType, size, err2 +} + +func (p *TJSONProtocol) readElemListBegin() (elemType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, 0, e + } + sElemType, err := p.ReadString() + if err != nil { + return VOID, size, err + } + elemType, err = p.StringToTypeId(sElemType) + if err != nil { + return elemType, size, err + } + nSize, err2 := p.ReadI64() + size = int(nSize) + return elemType, size, err2 +} + +func (p *TJSONProtocol) writeElemListBegin(elemType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + s, e1 := p.TypeIdToString(elemType) + if e1 != nil { + return e1 + } + if e := p.OutputString(s); e != nil { + return e + } + if e := p.OutputI64(int64(size)); e != nil { + return e + } + return nil +} + +func (p *TJSONProtocol) TypeIdToString(fieldType TType) (string, error) { + switch byte(fieldType) { + case BOOL: + return "tf", nil + case BYTE: + return "i8", nil + case I16: + return "i16", nil + case I32: + return "i32", nil + case I64: + return "i64", nil + case DOUBLE: + return "dbl", nil + case STRING: + return "str", nil + case STRUCT: + return "rec", nil + case MAP: + return "map", nil + case SET: + return "set", nil + case LIST: + return "lst", nil + } + + e := fmt.Errorf("Unknown fieldType: %d", int(fieldType)) + return "", NewTProtocolExceptionWithType(INVALID_DATA, e) +} + +func (p *TJSONProtocol) StringToTypeId(fieldType string) (TType, error) { + switch fieldType { + case "tf": + return TType(BOOL), nil + case "i8": + return TType(BYTE), nil + case "i16": + return TType(I16), nil + case "i32": + return TType(I32), nil + case "i64": + return TType(I64), nil + case "dbl": + return TType(DOUBLE), nil + case "str": + return TType(STRING), nil + case "rec": + return TType(STRUCT), nil + case "map": + return TType(MAP), nil + case "set": + return TType(SET), nil + case "lst": + return TType(LIST), nil + } + + e := fmt.Errorf("Unknown type identifier: %s", fieldType) + return TType(STOP), NewTProtocolExceptionWithType(INVALID_DATA, e) +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/memory_buffer.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/memory_buffer.go new file mode 100644 index 00000000..b62fd56f --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/memory_buffer.go @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bytes" +) + +// Memory buffer-based implementation of the TTransport interface. +type TMemoryBuffer struct { + *bytes.Buffer + size int +} + +type TMemoryBufferTransportFactory struct { + size int +} + +func (p *TMemoryBufferTransportFactory) GetTransport(trans TTransport) TTransport { + if trans != nil { + t, ok := trans.(*TMemoryBuffer) + if ok && t.size > 0 { + return NewTMemoryBufferLen(t.size) + } + } + return NewTMemoryBufferLen(p.size) +} + +func NewTMemoryBufferTransportFactory(size int) *TMemoryBufferTransportFactory { + return &TMemoryBufferTransportFactory{size: size} +} + +func NewTMemoryBuffer() *TMemoryBuffer { + return &TMemoryBuffer{Buffer: &bytes.Buffer{}, size: 0} +} + +func NewTMemoryBufferLen(size int) *TMemoryBuffer { + buf := make([]byte, 0, size) + return &TMemoryBuffer{Buffer: bytes.NewBuffer(buf), size: size} +} + +func (p *TMemoryBuffer) IsOpen() bool { + return true +} + +func (p *TMemoryBuffer) Open() error { + return nil +} + +func (p *TMemoryBuffer) Close() error { + p.Buffer.Reset() + return nil +} + +// Flushing a memory buffer is a no-op +func (p *TMemoryBuffer) Flush() error { + return nil +} + +func (p *TMemoryBuffer) RemainingBytes() (num_bytes uint64) { + return uint64(p.Buffer.Len()) +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/messagetype.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/messagetype.go new file mode 100644 index 00000000..25ab2e98 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/messagetype.go @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Message type constants in the Thrift protocol. +type TMessageType int32 + +const ( + INVALID_TMESSAGE_TYPE TMessageType = 0 + CALL TMessageType = 1 + REPLY TMessageType = 2 + EXCEPTION TMessageType = 3 + ONEWAY TMessageType = 4 +) diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/multiplexed_protocol.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/multiplexed_protocol.go new file mode 100644 index 00000000..3157e0d5 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/multiplexed_protocol.go @@ -0,0 +1,169 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "fmt" + "strings" +) + +/* +TMultiplexedProtocol is a protocol-independent concrete decorator +that allows a Thrift client to communicate with a multiplexing Thrift server, +by prepending the service name to the function name during function calls. + +NOTE: THIS IS NOT USED BY SERVERS. On the server, use TMultiplexedProcessor to handle request +from a multiplexing client. + +This example uses a single socket transport to invoke two services: + +socket := thrift.NewTSocketFromAddrTimeout(addr, TIMEOUT) +transport := thrift.NewTFramedTransport(socket) +protocol := thrift.NewTBinaryProtocolTransport(transport) + +mp := thrift.NewTMultiplexedProtocol(protocol, "Calculator") +service := Calculator.NewCalculatorClient(mp) + +mp2 := thrift.NewTMultiplexedProtocol(protocol, "WeatherReport") +service2 := WeatherReport.NewWeatherReportClient(mp2) + +err := transport.Open() +if err != nil { + t.Fatal("Unable to open client socket", err) +} + +fmt.Println(service.Add(2,2)) +fmt.Println(service2.GetTemperature()) +*/ + +type TMultiplexedProtocol struct { + TProtocol + serviceName string +} + +const MULTIPLEXED_SEPARATOR = ":" + +func NewTMultiplexedProtocol(protocol TProtocol, serviceName string) *TMultiplexedProtocol { + return &TMultiplexedProtocol{ + TProtocol: protocol, + serviceName: serviceName, + } +} + +func (t *TMultiplexedProtocol) WriteMessageBegin(name string, typeId TMessageType, seqid int32) error { + if typeId == CALL || typeId == ONEWAY { + return t.TProtocol.WriteMessageBegin(t.serviceName+MULTIPLEXED_SEPARATOR+name, typeId, seqid) + } else { + return t.TProtocol.WriteMessageBegin(name, typeId, seqid) + } +} + +/* +TMultiplexedProcessor is a TProcessor allowing +a single TServer to provide multiple services. + +To do so, you instantiate the processor and then register additional +processors with it, as shown in the following example: + +var processor = thrift.NewTMultiplexedProcessor() + +firstProcessor := +processor.RegisterProcessor("FirstService", firstProcessor) + +processor.registerProcessor( + "Calculator", + Calculator.NewCalculatorProcessor(&CalculatorHandler{}), +) + +processor.registerProcessor( + "WeatherReport", + WeatherReport.NewWeatherReportProcessor(&WeatherReportHandler{}), +) + +serverTransport, err := thrift.NewTServerSocketTimeout(addr, TIMEOUT) +if err != nil { + t.Fatal("Unable to create server socket", err) +} +server := thrift.NewTSimpleServer2(processor, serverTransport) +server.Serve(); +*/ + +type TMultiplexedProcessor struct { + serviceProcessorMap map[string]TProcessor + DefaultProcessor TProcessor +} + +func NewTMultiplexedProcessor() *TMultiplexedProcessor { + return &TMultiplexedProcessor{ + serviceProcessorMap: make(map[string]TProcessor), + } +} + +func (t *TMultiplexedProcessor) RegisterDefault(processor TProcessor) { + t.DefaultProcessor = processor +} + +func (t *TMultiplexedProcessor) RegisterProcessor(name string, processor TProcessor) { + if t.serviceProcessorMap == nil { + t.serviceProcessorMap = make(map[string]TProcessor) + } + t.serviceProcessorMap[name] = processor +} + +func (t *TMultiplexedProcessor) Process(in, out TProtocol) (bool, TException) { + name, typeId, seqid, err := in.ReadMessageBegin() + if err != nil { + return false, err + } + if typeId != CALL && typeId != ONEWAY { + return false, fmt.Errorf("Unexpected message type %v", typeId) + } + //extract the service name + v := strings.SplitN(name, MULTIPLEXED_SEPARATOR, 2) + if len(v) != 2 { + if t.DefaultProcessor != nil { + smb := NewStoredMessageProtocol(in, name, typeId, seqid) + return t.DefaultProcessor.Process(smb, out) + } + return false, fmt.Errorf("Service name not found in message name: %s. Did you forget to use a TMultiplexProtocol in your client?", name) + } + actualProcessor, ok := t.serviceProcessorMap[v[0]] + if !ok { + return false, fmt.Errorf("Service name not found: %s. Did you forget to call registerProcessor()?", v[0]) + } + smb := NewStoredMessageProtocol(in, v[1], typeId, seqid) + return actualProcessor.Process(smb, out) +} + +//Protocol that use stored message for ReadMessageBegin +type storedMessageProtocol struct { + TProtocol + name string + typeId TMessageType + seqid int32 +} + +func NewStoredMessageProtocol(protocol TProtocol, name string, typeId TMessageType, seqid int32) *storedMessageProtocol { + return &storedMessageProtocol{protocol, name, typeId, seqid} +} + +func (s *storedMessageProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error) { + return s.name, s.typeId, s.seqid, nil +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/numeric.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/numeric.go new file mode 100644 index 00000000..aa8daa9b --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/numeric.go @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "math" + "strconv" +) + +type Numeric interface { + Int64() int64 + Int32() int32 + Int16() int16 + Byte() byte + Int() int + Float64() float64 + Float32() float32 + String() string + isNull() bool +} + +type numeric struct { + iValue int64 + dValue float64 + sValue string + isNil bool +} + +var ( + INFINITY Numeric + NEGATIVE_INFINITY Numeric + NAN Numeric + ZERO Numeric + NUMERIC_NULL Numeric +) + +func NewNumericFromDouble(dValue float64) Numeric { + if math.IsInf(dValue, 1) { + return INFINITY + } + if math.IsInf(dValue, -1) { + return NEGATIVE_INFINITY + } + if math.IsNaN(dValue) { + return NAN + } + iValue := int64(dValue) + sValue := strconv.FormatFloat(dValue, 'g', 10, 64) + isNil := false + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromI64(iValue int64) Numeric { + dValue := float64(iValue) + sValue := string(iValue) + isNil := false + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromI32(iValue int32) Numeric { + dValue := float64(iValue) + sValue := string(iValue) + isNil := false + return &numeric{iValue: int64(iValue), dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromString(sValue string) Numeric { + if sValue == INFINITY.String() { + return INFINITY + } + if sValue == NEGATIVE_INFINITY.String() { + return NEGATIVE_INFINITY + } + if sValue == NAN.String() { + return NAN + } + iValue, _ := strconv.ParseInt(sValue, 10, 64) + dValue, _ := strconv.ParseFloat(sValue, 64) + isNil := len(sValue) == 0 + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromJSONString(sValue string, isNull bool) Numeric { + if isNull { + return NewNullNumeric() + } + if sValue == JSON_INFINITY { + return INFINITY + } + if sValue == JSON_NEGATIVE_INFINITY { + return NEGATIVE_INFINITY + } + if sValue == JSON_NAN { + return NAN + } + iValue, _ := strconv.ParseInt(sValue, 10, 64) + dValue, _ := strconv.ParseFloat(sValue, 64) + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNull} +} + +func NewNullNumeric() Numeric { + return &numeric{iValue: 0, dValue: 0.0, sValue: "", isNil: true} +} + +func (p *numeric) Int64() int64 { + return p.iValue +} + +func (p *numeric) Int32() int32 { + return int32(p.iValue) +} + +func (p *numeric) Int16() int16 { + return int16(p.iValue) +} + +func (p *numeric) Byte() byte { + return byte(p.iValue) +} + +func (p *numeric) Int() int { + return int(p.iValue) +} + +func (p *numeric) Float64() float64 { + return p.dValue +} + +func (p *numeric) Float32() float32 { + return float32(p.dValue) +} + +func (p *numeric) String() string { + return p.sValue +} + +func (p *numeric) isNull() bool { + return p.isNil +} + +func init() { + INFINITY = &numeric{iValue: 0, dValue: math.Inf(1), sValue: "Infinity", isNil: false} + NEGATIVE_INFINITY = &numeric{iValue: 0, dValue: math.Inf(-1), sValue: "-Infinity", isNil: false} + NAN = &numeric{iValue: 0, dValue: math.NaN(), sValue: "NaN", isNil: false} + ZERO = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: false} + NUMERIC_NULL = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: true} +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/pointerize.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/pointerize.go new file mode 100644 index 00000000..8d6b2c21 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/pointerize.go @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +/////////////////////////////////////////////////////////////////////////////// +// This file is home to helpers that convert from various base types to +// respective pointer types. This is necessary because Go does not permit +// references to constants, nor can a pointer type to base type be allocated +// and initialized in a single expression. +// +// E.g., this is not allowed: +// +// var ip *int = &5 +// +// But this *is* allowed: +// +// func IntPtr(i int) *int { return &i } +// var ip *int = IntPtr(5) +// +// Since pointers to base types are commonplace as [optional] fields in +// exported thrift structs, we factor such helpers here. +/////////////////////////////////////////////////////////////////////////////// + +func Float32Ptr(v float32) *float32 { return &v } +func Float64Ptr(v float64) *float64 { return &v } +func IntPtr(v int) *int { return &v } +func Int32Ptr(v int32) *int32 { return &v } +func Int64Ptr(v int64) *int64 { return &v } +func StringPtr(v string) *string { return &v } +func Uint32Ptr(v uint32) *uint32 { return &v } +func Uint64Ptr(v uint64) *uint64 { return &v } +func BoolPtr(v bool) *bool { return &v } +func ByteSlicePtr(v []byte) *[]byte { return &v } diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/processor.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/processor.go new file mode 100644 index 00000000..ca0d3faf --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/processor.go @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// A processor is a generic object which operates upon an input stream and +// writes to some output stream. +type TProcessor interface { + Process(in, out TProtocol) (bool, TException) +} + +type TProcessorFunction interface { + Process(seqId int32, in, out TProtocol) (bool, TException) +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/processor_factory.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/processor_factory.go new file mode 100644 index 00000000..9d645df2 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/processor_factory.go @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// The default processor factory just returns a singleton +// instance. +type TProcessorFactory interface { + GetProcessor(trans TTransport) TProcessor +} + +type tProcessorFactory struct { + processor TProcessor +} + +func NewTProcessorFactory(p TProcessor) TProcessorFactory { + return &tProcessorFactory{processor: p} +} + +func (p *tProcessorFactory) GetProcessor(trans TTransport) TProcessor { + return p.processor +} + +/** + * The default processor factory just returns a singleton + * instance. + */ +type TProcessorFunctionFactory interface { + GetProcessorFunction(trans TTransport) TProcessorFunction +} + +type tProcessorFunctionFactory struct { + processor TProcessorFunction +} + +func NewTProcessorFunctionFactory(p TProcessorFunction) TProcessorFunctionFactory { + return &tProcessorFunctionFactory{processor: p} +} + +func (p *tProcessorFunctionFactory) GetProcessorFunction(trans TTransport) TProcessorFunction { + return p.processor +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol.go new file mode 100644 index 00000000..45fa202e --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol.go @@ -0,0 +1,175 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" +) + +const ( + VERSION_MASK = 0xffff0000 + VERSION_1 = 0x80010000 +) + +type TProtocol interface { + WriteMessageBegin(name string, typeId TMessageType, seqid int32) error + WriteMessageEnd() error + WriteStructBegin(name string) error + WriteStructEnd() error + WriteFieldBegin(name string, typeId TType, id int16) error + WriteFieldEnd() error + WriteFieldStop() error + WriteMapBegin(keyType TType, valueType TType, size int) error + WriteMapEnd() error + WriteListBegin(elemType TType, size int) error + WriteListEnd() error + WriteSetBegin(elemType TType, size int) error + WriteSetEnd() error + WriteBool(value bool) error + WriteByte(value int8) error + WriteI16(value int16) error + WriteI32(value int32) error + WriteI64(value int64) error + WriteDouble(value float64) error + WriteString(value string) error + WriteBinary(value []byte) error + + ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error) + ReadMessageEnd() error + ReadStructBegin() (name string, err error) + ReadStructEnd() error + ReadFieldBegin() (name string, typeId TType, id int16, err error) + ReadFieldEnd() error + ReadMapBegin() (keyType TType, valueType TType, size int, err error) + ReadMapEnd() error + ReadListBegin() (elemType TType, size int, err error) + ReadListEnd() error + ReadSetBegin() (elemType TType, size int, err error) + ReadSetEnd() error + ReadBool() (value bool, err error) + ReadByte() (value int8, err error) + ReadI16() (value int16, err error) + ReadI32() (value int32, err error) + ReadI64() (value int64, err error) + ReadDouble() (value float64, err error) + ReadString() (value string, err error) + ReadBinary() (value []byte, err error) + + Skip(fieldType TType) (err error) + Flush() (err error) + + Transport() TTransport +} + +// The maximum recursive depth the skip() function will traverse +const DEFAULT_RECURSION_DEPTH = 64 + +// Skips over the next data element from the provided input TProtocol object. +func SkipDefaultDepth(prot TProtocol, typeId TType) (err error) { + return Skip(prot, typeId, DEFAULT_RECURSION_DEPTH) +} + +// Skips over the next data element from the provided input TProtocol object. +func Skip(self TProtocol, fieldType TType, maxDepth int) (err error) { + + if maxDepth <= 0 { + return NewTProtocolExceptionWithType( DEPTH_LIMIT, errors.New("Depth limit exceeded")) + } + + switch fieldType { + case STOP: + return + case BOOL: + _, err = self.ReadBool() + return + case BYTE: + _, err = self.ReadByte() + return + case I16: + _, err = self.ReadI16() + return + case I32: + _, err = self.ReadI32() + return + case I64: + _, err = self.ReadI64() + return + case DOUBLE: + _, err = self.ReadDouble() + return + case STRING: + _, err = self.ReadString() + return + case STRUCT: + if _, err = self.ReadStructBegin(); err != nil { + return err + } + for { + _, typeId, _, _ := self.ReadFieldBegin() + if typeId == STOP { + break + } + err := Skip(self, typeId, maxDepth-1) + if err != nil { + return err + } + self.ReadFieldEnd() + } + return self.ReadStructEnd() + case MAP: + keyType, valueType, size, err := self.ReadMapBegin() + if err != nil { + return err + } + for i := 0; i < size; i++ { + err := Skip(self, keyType, maxDepth-1) + if err != nil { + return err + } + self.Skip(valueType) + } + return self.ReadMapEnd() + case SET: + elemType, size, err := self.ReadSetBegin() + if err != nil { + return err + } + for i := 0; i < size; i++ { + err := Skip(self, elemType, maxDepth-1) + if err != nil { + return err + } + } + return self.ReadSetEnd() + case LIST: + elemType, size, err := self.ReadListBegin() + if err != nil { + return err + } + for i := 0; i < size; i++ { + err := Skip(self, elemType, maxDepth-1) + if err != nil { + return err + } + } + return self.ReadListEnd() + } + return nil +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol_exception.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol_exception.go new file mode 100644 index 00000000..6e357ee8 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol_exception.go @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "encoding/base64" +) + +// Thrift Protocol exception +type TProtocolException interface { + TException + TypeId() int +} + +const ( + UNKNOWN_PROTOCOL_EXCEPTION = 0 + INVALID_DATA = 1 + NEGATIVE_SIZE = 2 + SIZE_LIMIT = 3 + BAD_VERSION = 4 + NOT_IMPLEMENTED = 5 + DEPTH_LIMIT = 6 +) + +type tProtocolException struct { + typeId int + message string +} + +func (p *tProtocolException) TypeId() int { + return p.typeId +} + +func (p *tProtocolException) String() string { + return p.message +} + +func (p *tProtocolException) Error() string { + return p.message +} + +func NewTProtocolException(err error) TProtocolException { + if err == nil { + return nil + } + if e,ok := err.(TProtocolException); ok { + return e + } + if _, ok := err.(base64.CorruptInputError); ok { + return &tProtocolException{INVALID_DATA, err.Error()} + } + return &tProtocolException{UNKNOWN_PROTOCOL_EXCEPTION, err.Error()} +} + +func NewTProtocolExceptionWithType(errType int, err error) TProtocolException { + if err == nil { + return nil + } + return &tProtocolException{errType, err.Error()} +} + diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol_factory.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol_factory.go new file mode 100644 index 00000000..c40f796d --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/protocol_factory.go @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Factory interface for constructing protocol instances. +type TProtocolFactory interface { + GetProtocol(trans TTransport) TProtocol +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/rich_transport.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/rich_transport.go new file mode 100644 index 00000000..8e296a99 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/rich_transport.go @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import "io" + +type RichTransport struct { + TTransport +} + +// Wraps Transport to provide TRichTransport interface +func NewTRichTransport(trans TTransport) *RichTransport { + return &RichTransport{trans} +} + +func (r *RichTransport) ReadByte() (c byte, err error) { + return readByte(r.TTransport) +} + +func (r *RichTransport) WriteByte(c byte) error { + return writeByte(r.TTransport, c) +} + +func (r *RichTransport) WriteString(s string) (n int, err error) { + return r.Write([]byte(s)) +} + +func (r *RichTransport) RemainingBytes() (num_bytes uint64) { + return r.TTransport.RemainingBytes() +} + +func readByte(r io.Reader) (c byte, err error) { + v := [1]byte{0} + n, err := r.Read(v[0:1]) + if n > 0 && (err == nil || err == io.EOF) { + return v[0], nil + } + if n > 0 && err != nil { + return v[0], err + } + if err != nil { + return 0, err + } + return v[0], nil +} + +func writeByte(w io.Writer, c byte) error { + v := [1]byte{c} + _, err := w.Write(v[0:1]) + return err +} + diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/serializer.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/serializer.go new file mode 100644 index 00000000..77122299 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/serializer.go @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +type TSerializer struct { + Transport *TMemoryBuffer + Protocol TProtocol +} + +type TStruct interface { + Write(p TProtocol) error + Read(p TProtocol) error +} + +func NewTSerializer() *TSerializer { + transport := NewTMemoryBufferLen(1024) + protocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport) + + return &TSerializer{ + transport, + protocol} +} + +func (t *TSerializer) WriteString(msg TStruct) (s string, err error) { + t.Transport.Reset() + + if err = msg.Write(t.Protocol); err != nil { + return + } + + if err = t.Protocol.Flush(); err != nil { + return + } + if err = t.Transport.Flush(); err != nil { + return + } + + return t.Transport.String(), nil +} + +func (t *TSerializer) Write(msg TStruct) (b []byte, err error) { + t.Transport.Reset() + + if err = msg.Write(t.Protocol); err != nil { + return + } + + if err = t.Protocol.Flush(); err != nil { + return + } + + if err = t.Transport.Flush(); err != nil { + return + } + + b = append(b, t.Transport.Bytes()...) + return +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server.go new file mode 100644 index 00000000..f813fa35 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server.go @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +type TServer interface { + ProcessorFactory() TProcessorFactory + ServerTransport() TServerTransport + InputTransportFactory() TTransportFactory + OutputTransportFactory() TTransportFactory + InputProtocolFactory() TProtocolFactory + OutputProtocolFactory() TProtocolFactory + + // Starts the server + Serve() error + // Stops the server. This is optional on a per-implementation basis. Not + // all servers are required to be cleanly stoppable. + Stop() error +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server_socket.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server_socket.go new file mode 100644 index 00000000..d6e9495d --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server_socket.go @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "net" + "sync" + "time" +) + +type TServerSocket struct { + listener net.Listener + addr net.Addr + clientTimeout time.Duration + + // Protects the interrupted value to make it thread safe. + mu sync.RWMutex + interrupted bool +} + +func NewTServerSocket(listenAddr string) (*TServerSocket, error) { + return NewTServerSocketTimeout(listenAddr, 0) +} + +func NewTServerSocketTimeout(listenAddr string, clientTimeout time.Duration) (*TServerSocket, error) { + addr, err := net.ResolveTCPAddr("tcp", listenAddr) + if err != nil { + return nil, err + } + return &TServerSocket{addr: addr, clientTimeout: clientTimeout}, nil +} + +func (p *TServerSocket) Listen() error { + if p.IsListening() { + return nil + } + l, err := net.Listen(p.addr.Network(), p.addr.String()) + if err != nil { + return err + } + p.listener = l + return nil +} + +func (p *TServerSocket) Accept() (TTransport, error) { + p.mu.RLock() + interrupted := p.interrupted + p.mu.RUnlock() + + if interrupted { + return nil, errTransportInterrupted + } + if p.listener == nil { + return nil, NewTTransportException(NOT_OPEN, "No underlying server socket") + } + conn, err := p.listener.Accept() + if err != nil { + return nil, NewTTransportExceptionFromError(err) + } + return NewTSocketFromConnTimeout(conn, p.clientTimeout), nil +} + +// Checks whether the socket is listening. +func (p *TServerSocket) IsListening() bool { + return p.listener != nil +} + +// Connects the socket, creating a new socket object if necessary. +func (p *TServerSocket) Open() error { + if p.IsListening() { + return NewTTransportException(ALREADY_OPEN, "Server socket already open") + } + if l, err := net.Listen(p.addr.Network(), p.addr.String()); err != nil { + return err + } else { + p.listener = l + } + return nil +} + +func (p *TServerSocket) Addr() net.Addr { + if p.listener != nil { + return p.listener.Addr() + } + return p.addr +} + +func (p *TServerSocket) Close() error { + defer func() { + p.listener = nil + }() + if p.IsListening() { + return p.listener.Close() + } + return nil +} + +func (p *TServerSocket) Interrupt() error { + p.mu.Lock() + p.interrupted = true + p.Close() + p.mu.Unlock() + + return nil +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server_transport.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server_transport.go new file mode 100644 index 00000000..51c40b64 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/server_transport.go @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Server transport. Object which provides client transports. +type TServerTransport interface { + Listen() error + Accept() (TTransport, error) + Close() error + + // Optional method implementation. This signals to the server transport + // that it should break out of any accept() or listen() that it is currently + // blocked on. This method, if implemented, MUST be thread safe, as it may + // be called from a different thread context than the other TServerTransport + // methods. + Interrupt() error +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/simple_json_protocol.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/simple_json_protocol.go new file mode 100644 index 00000000..412a482d --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/simple_json_protocol.go @@ -0,0 +1,1337 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bufio" + "bytes" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "math" + "strconv" +) + +type _ParseContext int + +const ( + _CONTEXT_IN_TOPLEVEL _ParseContext = 1 + _CONTEXT_IN_LIST_FIRST _ParseContext = 2 + _CONTEXT_IN_LIST _ParseContext = 3 + _CONTEXT_IN_OBJECT_FIRST _ParseContext = 4 + _CONTEXT_IN_OBJECT_NEXT_KEY _ParseContext = 5 + _CONTEXT_IN_OBJECT_NEXT_VALUE _ParseContext = 6 +) + +func (p _ParseContext) String() string { + switch p { + case _CONTEXT_IN_TOPLEVEL: + return "TOPLEVEL" + case _CONTEXT_IN_LIST_FIRST: + return "LIST-FIRST" + case _CONTEXT_IN_LIST: + return "LIST" + case _CONTEXT_IN_OBJECT_FIRST: + return "OBJECT-FIRST" + case _CONTEXT_IN_OBJECT_NEXT_KEY: + return "OBJECT-NEXT-KEY" + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + return "OBJECT-NEXT-VALUE" + } + return "UNKNOWN-PARSE-CONTEXT" +} + +// JSON protocol implementation for thrift. +// +// This protocol produces/consumes a simple output format +// suitable for parsing by scripting languages. It should not be +// confused with the full-featured TJSONProtocol. +// +type TSimpleJSONProtocol struct { + trans TTransport + + parseContextStack []int + dumpContext []int + + writer *bufio.Writer + reader *bufio.Reader +} + +// Constructor +func NewTSimpleJSONProtocol(t TTransport) *TSimpleJSONProtocol { + v := &TSimpleJSONProtocol{trans: t, + writer: bufio.NewWriter(t), + reader: bufio.NewReader(t), + } + v.parseContextStack = append(v.parseContextStack, int(_CONTEXT_IN_TOPLEVEL)) + v.dumpContext = append(v.dumpContext, int(_CONTEXT_IN_TOPLEVEL)) + return v +} + +// Factory +type TSimpleJSONProtocolFactory struct{} + +func (p *TSimpleJSONProtocolFactory) GetProtocol(trans TTransport) TProtocol { + return NewTSimpleJSONProtocol(trans) +} + +func NewTSimpleJSONProtocolFactory() *TSimpleJSONProtocolFactory { + return &TSimpleJSONProtocolFactory{} +} + +var ( + JSON_COMMA []byte + JSON_COLON []byte + JSON_LBRACE []byte + JSON_RBRACE []byte + JSON_LBRACKET []byte + JSON_RBRACKET []byte + JSON_QUOTE byte + JSON_QUOTE_BYTES []byte + JSON_NULL []byte + JSON_TRUE []byte + JSON_FALSE []byte + JSON_INFINITY string + JSON_NEGATIVE_INFINITY string + JSON_NAN string + JSON_INFINITY_BYTES []byte + JSON_NEGATIVE_INFINITY_BYTES []byte + JSON_NAN_BYTES []byte + json_nonbase_map_elem_bytes []byte +) + +func init() { + JSON_COMMA = []byte{','} + JSON_COLON = []byte{':'} + JSON_LBRACE = []byte{'{'} + JSON_RBRACE = []byte{'}'} + JSON_LBRACKET = []byte{'['} + JSON_RBRACKET = []byte{']'} + JSON_QUOTE = '"' + JSON_QUOTE_BYTES = []byte{'"'} + JSON_NULL = []byte{'n', 'u', 'l', 'l'} + JSON_TRUE = []byte{'t', 'r', 'u', 'e'} + JSON_FALSE = []byte{'f', 'a', 'l', 's', 'e'} + JSON_INFINITY = "Infinity" + JSON_NEGATIVE_INFINITY = "-Infinity" + JSON_NAN = "NaN" + JSON_INFINITY_BYTES = []byte{'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'} + JSON_NEGATIVE_INFINITY_BYTES = []byte{'-', 'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'} + JSON_NAN_BYTES = []byte{'N', 'a', 'N'} + json_nonbase_map_elem_bytes = []byte{']', ',', '['} +} + +func jsonQuote(s string) string { + b, _ := json.Marshal(s) + s1 := string(b) + return s1 +} + +func jsonUnquote(s string) (string, bool) { + s1 := new(string) + err := json.Unmarshal([]byte(s), s1) + return *s1, err == nil +} + +func mismatch(expected, actual string) error { + return fmt.Errorf("Expected '%s' but found '%s' while parsing JSON.", expected, actual) +} + +func (p *TSimpleJSONProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { + p.resetContextStack() // THRIFT-3735 + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteString(name); e != nil { + return e + } + if e := p.WriteByte(int8(typeId)); e != nil { + return e + } + if e := p.WriteI32(seqId); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) WriteMessageEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteStructBegin(name string) error { + if e := p.OutputObjectBegin(); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) WriteStructEnd() error { + return p.OutputObjectEnd() +} + +func (p *TSimpleJSONProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + if e := p.WriteString(name); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) WriteFieldEnd() error { + //return p.OutputListEnd() + return nil +} + +func (p *TSimpleJSONProtocol) WriteFieldStop() error { return nil } + +func (p *TSimpleJSONProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteByte(int8(keyType)); e != nil { + return e + } + if e := p.WriteByte(int8(valueType)); e != nil { + return e + } + return p.WriteI32(int32(size)) +} + +func (p *TSimpleJSONProtocol) WriteMapEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteListBegin(elemType TType, size int) error { + return p.OutputElemListBegin(elemType, size) +} + +func (p *TSimpleJSONProtocol) WriteListEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteSetBegin(elemType TType, size int) error { + return p.OutputElemListBegin(elemType, size) +} + +func (p *TSimpleJSONProtocol) WriteSetEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteBool(b bool) error { + return p.OutputBool(b) +} + +func (p *TSimpleJSONProtocol) WriteByte(b int8) error { + return p.WriteI32(int32(b)) +} + +func (p *TSimpleJSONProtocol) WriteI16(v int16) error { + return p.WriteI32(int32(v)) +} + +func (p *TSimpleJSONProtocol) WriteI32(v int32) error { + return p.OutputI64(int64(v)) +} + +func (p *TSimpleJSONProtocol) WriteI64(v int64) error { + return p.OutputI64(int64(v)) +} + +func (p *TSimpleJSONProtocol) WriteDouble(v float64) error { + return p.OutputF64(v) +} + +func (p *TSimpleJSONProtocol) WriteString(v string) error { + return p.OutputString(v) +} + +func (p *TSimpleJSONProtocol) WriteBinary(v []byte) error { + // JSON library only takes in a string, + // not an arbitrary byte array, to ensure bytes are transmitted + // efficiently we must convert this into a valid JSON string + // therefore we use base64 encoding to avoid excessive escaping/quoting + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.write(JSON_QUOTE_BYTES); e != nil { + return NewTProtocolException(e) + } + writer := base64.NewEncoder(base64.StdEncoding, p.writer) + if _, e := writer.Write(v); e != nil { + p.writer.Reset(p.trans) // THRIFT-3735 + return NewTProtocolException(e) + } + if e := writer.Close(); e != nil { + return NewTProtocolException(e) + } + if _, e := p.write(JSON_QUOTE_BYTES); e != nil { + return NewTProtocolException(e) + } + return p.OutputPostValue() +} + +// Reading methods. +func (p *TSimpleJSONProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + p.resetContextStack() // THRIFT-3735 + if isNull, err := p.ParseListBegin(); isNull || err != nil { + return name, typeId, seqId, err + } + if name, err = p.ReadString(); err != nil { + return name, typeId, seqId, err + } + bTypeId, err := p.ReadByte() + typeId = TMessageType(bTypeId) + if err != nil { + return name, typeId, seqId, err + } + if seqId, err = p.ReadI32(); err != nil { + return name, typeId, seqId, err + } + return name, typeId, seqId, nil +} + +func (p *TSimpleJSONProtocol) ReadMessageEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadStructBegin() (name string, err error) { + _, err = p.ParseObjectStart() + return "", err +} + +func (p *TSimpleJSONProtocol) ReadStructEnd() error { + return p.ParseObjectEnd() +} + +func (p *TSimpleJSONProtocol) ReadFieldBegin() (string, TType, int16, error) { + if err := p.ParsePreValue(); err != nil { + return "", STOP, 0, err + } + b, _ := p.reader.Peek(1) + if len(b) > 0 { + switch b[0] { + case JSON_RBRACE[0]: + return "", STOP, 0, nil + case JSON_QUOTE: + p.reader.ReadByte() + name, err := p.ParseStringBody() + // simplejson is not meant to be read back into thrift + // - see http://wiki.apache.org/thrift/ThriftUsageJava + // - use JSON instead + if err != nil { + return name, STOP, 0, err + } + return name, STOP, -1, p.ParsePostValue() + /* + if err = p.ParsePostValue(); err != nil { + return name, STOP, 0, err + } + if isNull, err := p.ParseListBegin(); isNull || err != nil { + return name, STOP, 0, err + } + bType, err := p.ReadByte() + thetype := TType(bType) + if err != nil { + return name, thetype, 0, err + } + id, err := p.ReadI16() + return name, thetype, id, err + */ + } + e := fmt.Errorf("Expected \"}\" or '\"', but found: '%s'", string(b)) + return "", STOP, 0, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return "", STOP, 0, NewTProtocolException(io.EOF) +} + +func (p *TSimpleJSONProtocol) ReadFieldEnd() error { + return nil + //return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, VOID, 0, e + } + + // read keyType + bKeyType, e := p.ReadByte() + keyType = TType(bKeyType) + if e != nil { + return keyType, valueType, size, e + } + + // read valueType + bValueType, e := p.ReadByte() + valueType = TType(bValueType) + if e != nil { + return keyType, valueType, size, e + } + + // read size + iSize, err := p.ReadI64() + size = int(iSize) + return keyType, valueType, size, err +} + +func (p *TSimpleJSONProtocol) ReadMapEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadListBegin() (elemType TType, size int, e error) { + return p.ParseElemListBegin() +} + +func (p *TSimpleJSONProtocol) ReadListEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadSetBegin() (elemType TType, size int, e error) { + return p.ParseElemListBegin() +} + +func (p *TSimpleJSONProtocol) ReadSetEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadBool() (bool, error) { + var value bool + + if err := p.ParsePreValue(); err != nil { + return value, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 { + switch f[0] { + case JSON_TRUE[0]: + b := make([]byte, len(JSON_TRUE)) + _, err := p.reader.Read(b) + if err != nil { + return false, NewTProtocolException(err) + } + if string(b) == string(JSON_TRUE) { + value = true + } else { + e := fmt.Errorf("Expected \"true\" but found: %s", string(b)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + break + case JSON_FALSE[0]: + b := make([]byte, len(JSON_FALSE)) + _, err := p.reader.Read(b) + if err != nil { + return false, NewTProtocolException(err) + } + if string(b) == string(JSON_FALSE) { + value = false + } else { + e := fmt.Errorf("Expected \"false\" but found: %s", string(b)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + break + case JSON_NULL[0]: + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return false, NewTProtocolException(err) + } + if string(b) == string(JSON_NULL) { + value = false + } else { + e := fmt.Errorf("Expected \"null\" but found: %s", string(b)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + default: + e := fmt.Errorf("Expected \"true\", \"false\", or \"null\" but found: %s", string(f)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + return value, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ReadByte() (int8, error) { + v, err := p.ReadI64() + return int8(v), err +} + +func (p *TSimpleJSONProtocol) ReadI16() (int16, error) { + v, err := p.ReadI64() + return int16(v), err +} + +func (p *TSimpleJSONProtocol) ReadI32() (int32, error) { + v, err := p.ReadI64() + return int32(v), err +} + +func (p *TSimpleJSONProtocol) ReadI64() (int64, error) { + v, _, err := p.ParseI64() + return v, err +} + +func (p *TSimpleJSONProtocol) ReadDouble() (float64, error) { + v, _, err := p.ParseF64() + return v, err +} + +func (p *TSimpleJSONProtocol) ReadString() (string, error) { + var v string + if err := p.ParsePreValue(); err != nil { + return v, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 && f[0] == JSON_QUOTE { + p.reader.ReadByte() + value, err := p.ParseStringBody() + v = value + if err != nil { + return v, err + } + } else if len(f) > 0 && f[0] == JSON_NULL[0] { + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return v, NewTProtocolException(err) + } + if string(b) != string(JSON_NULL) { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } else { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return v, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ReadBinary() ([]byte, error) { + var v []byte + if err := p.ParsePreValue(); err != nil { + return nil, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 && f[0] == JSON_QUOTE { + p.reader.ReadByte() + value, err := p.ParseBase64EncodedBody() + v = value + if err != nil { + return v, err + } + } else if len(f) > 0 && f[0] == JSON_NULL[0] { + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return v, NewTProtocolException(err) + } + if string(b) != string(JSON_NULL) { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } else { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + + return v, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) Flush() (err error) { + return NewTProtocolException(p.writer.Flush()) +} + +func (p *TSimpleJSONProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TSimpleJSONProtocol) Transport() TTransport { + return p.trans +} + +func (p *TSimpleJSONProtocol) OutputPreValue() error { + cxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1]) + switch cxt { + case _CONTEXT_IN_LIST, _CONTEXT_IN_OBJECT_NEXT_KEY: + if _, e := p.write(JSON_COMMA); e != nil { + return NewTProtocolException(e) + } + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + if _, e := p.write(JSON_COLON); e != nil { + return NewTProtocolException(e) + } + break + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputPostValue() error { + cxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1]) + switch cxt { + case _CONTEXT_IN_LIST_FIRST: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST)) + break + case _CONTEXT_IN_OBJECT_FIRST: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) + break + case _CONTEXT_IN_OBJECT_NEXT_KEY: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_KEY)) + break + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputBool(value bool) error { + if e := p.OutputPreValue(); e != nil { + return e + } + var v string + if value { + v = string(JSON_TRUE) + } else { + v = string(JSON_FALSE) + } + switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + v = jsonQuote(v) + default: + } + if e := p.OutputStringData(v); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputNull() error { + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.write(JSON_NULL); e != nil { + return NewTProtocolException(e) + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputF64(value float64) error { + if e := p.OutputPreValue(); e != nil { + return e + } + var v string + if math.IsNaN(value) { + v = string(JSON_QUOTE) + JSON_NAN + string(JSON_QUOTE) + } else if math.IsInf(value, 1) { + v = string(JSON_QUOTE) + JSON_INFINITY + string(JSON_QUOTE) + } else if math.IsInf(value, -1) { + v = string(JSON_QUOTE) + JSON_NEGATIVE_INFINITY + string(JSON_QUOTE) + } else { + v = strconv.FormatFloat(value, 'g', -1, 64) + switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + v = string(JSON_QUOTE) + v + string(JSON_QUOTE) + default: + } + } + if e := p.OutputStringData(v); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputI64(value int64) error { + if e := p.OutputPreValue(); e != nil { + return e + } + v := strconv.FormatInt(value, 10) + switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + v = jsonQuote(v) + default: + } + if e := p.OutputStringData(v); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputString(s string) error { + if e := p.OutputPreValue(); e != nil { + return e + } + if e := p.OutputStringData(jsonQuote(s)); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputStringData(s string) error { + _, e := p.write([]byte(s)) + return NewTProtocolException(e) +} + +func (p *TSimpleJSONProtocol) OutputObjectBegin() error { + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.write(JSON_LBRACE); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_FIRST)) + return nil +} + +func (p *TSimpleJSONProtocol) OutputObjectEnd() error { + if _, e := p.write(JSON_RBRACE); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + if e := p.OutputPostValue(); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputListBegin() error { + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.write(JSON_LBRACKET); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST_FIRST)) + return nil +} + +func (p *TSimpleJSONProtocol) OutputListEnd() error { + if _, e := p.write(JSON_RBRACKET); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + if e := p.OutputPostValue(); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputElemListBegin(elemType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteByte(int8(elemType)); e != nil { + return e + } + if e := p.WriteI64(int64(size)); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) ParsePreValue() error { + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + b, _ := p.reader.Peek(1) + switch cxt { + case _CONTEXT_IN_LIST: + if len(b) > 0 { + switch b[0] { + case JSON_RBRACKET[0]: + return nil + case JSON_COMMA[0]: + p.reader.ReadByte() + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + return nil + default: + e := fmt.Errorf("Expected \"]\" or \",\" in list context, but found \"%s\"", string(b)) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + break + case _CONTEXT_IN_OBJECT_NEXT_KEY: + if len(b) > 0 { + switch b[0] { + case JSON_RBRACE[0]: + return nil + case JSON_COMMA[0]: + p.reader.ReadByte() + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + return nil + default: + e := fmt.Errorf("Expected \"}\" or \",\" in object context, but found \"%s\"", string(b)) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + if len(b) > 0 { + switch b[0] { + case JSON_COLON[0]: + p.reader.ReadByte() + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + return nil + default: + e := fmt.Errorf("Expected \":\" in object context, but found \"%s\"", string(b)) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + break + } + return nil +} + +func (p *TSimpleJSONProtocol) ParsePostValue() error { + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + switch cxt { + case _CONTEXT_IN_LIST_FIRST: + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST)) + break + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_KEY)) + break + } + return nil +} + +func (p *TSimpleJSONProtocol) readNonSignificantWhitespace() error { + for { + b, _ := p.reader.Peek(1) + if len(b) < 1 { + return nil + } + switch b[0] { + case ' ', '\r', '\n', '\t': + p.reader.ReadByte() + continue + default: + break + } + break + } + return nil +} + +func (p *TSimpleJSONProtocol) ParseStringBody() (string, error) { + line, err := p.reader.ReadString(JSON_QUOTE) + if err != nil { + return "", NewTProtocolException(err) + } + l := len(line) + // count number of escapes to see if we need to keep going + i := 1 + for ; i < l; i++ { + if line[l-i-1] != '\\' { + break + } + } + if i&0x01 == 1 { + v, ok := jsonUnquote(string(JSON_QUOTE) + line) + if !ok { + return "", NewTProtocolException(err) + } + return v, nil + } + s, err := p.ParseQuotedStringBody() + if err != nil { + return "", NewTProtocolException(err) + } + str := string(JSON_QUOTE) + line + s + v, ok := jsonUnquote(str) + if !ok { + e := fmt.Errorf("Unable to parse as JSON string %s", str) + return "", NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return v, nil +} + +func (p *TSimpleJSONProtocol) ParseQuotedStringBody() (string, error) { + line, err := p.reader.ReadString(JSON_QUOTE) + if err != nil { + return "", NewTProtocolException(err) + } + l := len(line) + // count number of escapes to see if we need to keep going + i := 1 + for ; i < l; i++ { + if line[l-i-1] != '\\' { + break + } + } + if i&0x01 == 1 { + return line, nil + } + s, err := p.ParseQuotedStringBody() + if err != nil { + return "", NewTProtocolException(err) + } + v := line + s + return v, nil +} + +func (p *TSimpleJSONProtocol) ParseBase64EncodedBody() ([]byte, error) { + line, err := p.reader.ReadBytes(JSON_QUOTE) + if err != nil { + return line, NewTProtocolException(err) + } + line2 := line[0 : len(line)-1] + l := len(line2) + if (l % 4) != 0 { + pad := 4 - (l % 4) + fill := [...]byte{'=', '=', '='} + line2 = append(line2, fill[:pad]...) + l = len(line2) + } + output := make([]byte, base64.StdEncoding.DecodedLen(l)) + n, err := base64.StdEncoding.Decode(output, line2) + return output[0:n], NewTProtocolException(err) +} + +func (p *TSimpleJSONProtocol) ParseI64() (int64, bool, error) { + if err := p.ParsePreValue(); err != nil { + return 0, false, err + } + var value int64 + var isnull bool + if p.safePeekContains(JSON_NULL) { + p.reader.Read(make([]byte, len(JSON_NULL))) + isnull = true + } else { + num, err := p.readNumeric() + isnull = (num == nil) + if !isnull { + value = num.Int64() + } + if err != nil { + return value, isnull, err + } + } + return value, isnull, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ParseF64() (float64, bool, error) { + if err := p.ParsePreValue(); err != nil { + return 0, false, err + } + var value float64 + var isnull bool + if p.safePeekContains(JSON_NULL) { + p.reader.Read(make([]byte, len(JSON_NULL))) + isnull = true + } else { + num, err := p.readNumeric() + isnull = (num == nil) + if !isnull { + value = num.Float64() + } + if err != nil { + return value, isnull, err + } + } + return value, isnull, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ParseObjectStart() (bool, error) { + if err := p.ParsePreValue(); err != nil { + return false, err + } + var b []byte + b, err := p.reader.Peek(1) + if err != nil { + return false, err + } + if len(b) > 0 && b[0] == JSON_LBRACE[0] { + p.reader.ReadByte() + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_FIRST)) + return false, nil + } else if p.safePeekContains(JSON_NULL) { + return true, nil + } + e := fmt.Errorf("Expected '{' or null, but found '%s'", string(b)) + return false, NewTProtocolExceptionWithType(INVALID_DATA, e) +} + +func (p *TSimpleJSONProtocol) ParseObjectEnd() error { + if isNull, err := p.readIfNull(); isNull || err != nil { + return err + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + if (cxt != _CONTEXT_IN_OBJECT_FIRST) && (cxt != _CONTEXT_IN_OBJECT_NEXT_KEY) { + e := fmt.Errorf("Expected to be in the Object Context, but not in Object Context (%d)", cxt) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + line, err := p.reader.ReadString(JSON_RBRACE[0]) + if err != nil { + return NewTProtocolException(err) + } + for _, char := range line { + switch char { + default: + e := fmt.Errorf("Expecting end of object \"}\", but found: \"%s\"", line) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + case ' ', '\n', '\r', '\t', '}': + break + } + } + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + return p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ParseListBegin() (isNull bool, err error) { + if e := p.ParsePreValue(); e != nil { + return false, e + } + var b []byte + b, err = p.reader.Peek(1) + if err != nil { + return false, err + } + if len(b) >= 1 && b[0] == JSON_LBRACKET[0] { + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST_FIRST)) + p.reader.ReadByte() + isNull = false + } else if p.safePeekContains(JSON_NULL) { + isNull = true + } else { + err = fmt.Errorf("Expected \"null\" or \"[\", received %q", b) + } + return isNull, NewTProtocolExceptionWithType(INVALID_DATA, err) +} + +func (p *TSimpleJSONProtocol) ParseElemListBegin() (elemType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, 0, e + } + bElemType, err := p.ReadByte() + elemType = TType(bElemType) + if err != nil { + return elemType, size, err + } + nSize, err2 := p.ReadI64() + size = int(nSize) + return elemType, size, err2 +} + +func (p *TSimpleJSONProtocol) ParseListEnd() error { + if isNull, err := p.readIfNull(); isNull || err != nil { + return err + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + if cxt != _CONTEXT_IN_LIST { + e := fmt.Errorf("Expected to be in the List Context, but not in List Context (%d)", cxt) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + line, err := p.reader.ReadString(JSON_RBRACKET[0]) + if err != nil { + return NewTProtocolException(err) + } + for _, char := range line { + switch char { + default: + e := fmt.Errorf("Expecting end of list \"]\", but found: \"%s\"", line) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + case ' ', '\n', '\r', '\t', rune(JSON_RBRACKET[0]): + break + } + } + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + if _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) == _CONTEXT_IN_TOPLEVEL { + return nil + } + return p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) readSingleValue() (interface{}, TType, error) { + e := p.readNonSignificantWhitespace() + if e != nil { + return nil, VOID, NewTProtocolException(e) + } + b, e := p.reader.Peek(1) + if len(b) > 0 { + c := b[0] + switch c { + case JSON_NULL[0]: + buf := make([]byte, len(JSON_NULL)) + _, e := p.reader.Read(buf) + if e != nil { + return nil, VOID, NewTProtocolException(e) + } + if string(JSON_NULL) != string(buf) { + e = mismatch(string(JSON_NULL), string(buf)) + return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return nil, VOID, nil + case JSON_QUOTE: + p.reader.ReadByte() + v, e := p.ParseStringBody() + if e != nil { + return v, UTF8, NewTProtocolException(e) + } + if v == JSON_INFINITY { + return INFINITY, DOUBLE, nil + } else if v == JSON_NEGATIVE_INFINITY { + return NEGATIVE_INFINITY, DOUBLE, nil + } else if v == JSON_NAN { + return NAN, DOUBLE, nil + } + return v, UTF8, nil + case JSON_TRUE[0]: + buf := make([]byte, len(JSON_TRUE)) + _, e := p.reader.Read(buf) + if e != nil { + return true, BOOL, NewTProtocolException(e) + } + if string(JSON_TRUE) != string(buf) { + e := mismatch(string(JSON_TRUE), string(buf)) + return true, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return true, BOOL, nil + case JSON_FALSE[0]: + buf := make([]byte, len(JSON_FALSE)) + _, e := p.reader.Read(buf) + if e != nil { + return false, BOOL, NewTProtocolException(e) + } + if string(JSON_FALSE) != string(buf) { + e := mismatch(string(JSON_FALSE), string(buf)) + return false, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return false, BOOL, nil + case JSON_LBRACKET[0]: + _, e := p.reader.ReadByte() + return make([]interface{}, 0), LIST, NewTProtocolException(e) + case JSON_LBRACE[0]: + _, e := p.reader.ReadByte() + return make(map[string]interface{}), STRUCT, NewTProtocolException(e) + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'e', 'E', '.', '+', '-', JSON_INFINITY[0], JSON_NAN[0]: + // assume numeric + v, e := p.readNumeric() + return v, DOUBLE, e + default: + e := fmt.Errorf("Expected element in list but found '%s' while parsing JSON.", string(c)) + return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + e = fmt.Errorf("Cannot read a single element while parsing JSON.") + return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) + +} + +func (p *TSimpleJSONProtocol) readIfNull() (bool, error) { + cont := true + for cont { + b, _ := p.reader.Peek(1) + if len(b) < 1 { + return false, nil + } + switch b[0] { + default: + return false, nil + case JSON_NULL[0]: + cont = false + break + case ' ', '\n', '\r', '\t': + p.reader.ReadByte() + break + } + } + if p.safePeekContains(JSON_NULL) { + p.reader.Read(make([]byte, len(JSON_NULL))) + return true, nil + } + return false, nil +} + +func (p *TSimpleJSONProtocol) readQuoteIfNext() { + b, _ := p.reader.Peek(1) + if len(b) > 0 && b[0] == JSON_QUOTE { + p.reader.ReadByte() + } +} + +func (p *TSimpleJSONProtocol) readNumeric() (Numeric, error) { + isNull, err := p.readIfNull() + if isNull || err != nil { + return NUMERIC_NULL, err + } + hasDecimalPoint := false + nextCanBeSign := true + hasE := false + MAX_LEN := 40 + buf := bytes.NewBuffer(make([]byte, 0, MAX_LEN)) + continueFor := true + inQuotes := false + for continueFor { + c, err := p.reader.ReadByte() + if err != nil { + if err == io.EOF { + break + } + return NUMERIC_NULL, NewTProtocolException(err) + } + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + buf.WriteByte(c) + nextCanBeSign = false + case '.': + if hasDecimalPoint { + e := fmt.Errorf("Unable to parse number with multiple decimal points '%s.'", buf.String()) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if hasE { + e := fmt.Errorf("Unable to parse number with decimal points in the exponent '%s.'", buf.String()) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + buf.WriteByte(c) + hasDecimalPoint, nextCanBeSign = true, false + case 'e', 'E': + if hasE { + e := fmt.Errorf("Unable to parse number with multiple exponents '%s%c'", buf.String(), c) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + buf.WriteByte(c) + hasE, nextCanBeSign = true, true + case '-', '+': + if !nextCanBeSign { + e := fmt.Errorf("Negative sign within number") + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + buf.WriteByte(c) + nextCanBeSign = false + case ' ', 0, '\t', '\n', '\r', JSON_RBRACE[0], JSON_RBRACKET[0], JSON_COMMA[0], JSON_COLON[0]: + p.reader.UnreadByte() + continueFor = false + case JSON_NAN[0]: + if buf.Len() == 0 { + buffer := make([]byte, len(JSON_NAN)) + buffer[0] = c + _, e := p.reader.Read(buffer[1:]) + if e != nil { + return NUMERIC_NULL, NewTProtocolException(e) + } + if JSON_NAN != string(buffer) { + e := mismatch(JSON_NAN, string(buffer)) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if inQuotes { + p.readQuoteIfNext() + } + return NAN, nil + } else { + e := fmt.Errorf("Unable to parse number starting with character '%c'", c) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + case JSON_INFINITY[0]: + if buf.Len() == 0 || (buf.Len() == 1 && buf.Bytes()[0] == '+') { + buffer := make([]byte, len(JSON_INFINITY)) + buffer[0] = c + _, e := p.reader.Read(buffer[1:]) + if e != nil { + return NUMERIC_NULL, NewTProtocolException(e) + } + if JSON_INFINITY != string(buffer) { + e := mismatch(JSON_INFINITY, string(buffer)) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if inQuotes { + p.readQuoteIfNext() + } + return INFINITY, nil + } else if buf.Len() == 1 && buf.Bytes()[0] == JSON_NEGATIVE_INFINITY[0] { + buffer := make([]byte, len(JSON_NEGATIVE_INFINITY)) + buffer[0] = JSON_NEGATIVE_INFINITY[0] + buffer[1] = c + _, e := p.reader.Read(buffer[2:]) + if e != nil { + return NUMERIC_NULL, NewTProtocolException(e) + } + if JSON_NEGATIVE_INFINITY != string(buffer) { + e := mismatch(JSON_NEGATIVE_INFINITY, string(buffer)) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if inQuotes { + p.readQuoteIfNext() + } + return NEGATIVE_INFINITY, nil + } else { + e := fmt.Errorf("Unable to parse number starting with character '%c' due to existing buffer %s", c, buf.String()) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + case JSON_QUOTE: + if !inQuotes { + inQuotes = true + } else { + break + } + default: + e := fmt.Errorf("Unable to parse number starting with character '%c'", c) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + if buf.Len() == 0 { + e := fmt.Errorf("Unable to parse number from empty string ''") + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return NewNumericFromJSONString(buf.String(), false), nil +} + +// Safely peeks into the buffer, reading only what is necessary +func (p *TSimpleJSONProtocol) safePeekContains(b []byte) bool { + for i := 0; i < len(b); i++ { + a, _ := p.reader.Peek(i + 1) + if len(a) == 0 || a[i] != b[i] { + return false + } + } + return true +} + +// Reset the context stack to its initial state. +func (p *TSimpleJSONProtocol) resetContextStack() { + p.parseContextStack = []int{int(_CONTEXT_IN_TOPLEVEL)} + p.dumpContext = []int{int(_CONTEXT_IN_TOPLEVEL)} +} + +func (p *TSimpleJSONProtocol) write(b []byte) (int, error) { + n, err := p.writer.Write(b) + if err != nil { + p.writer.Reset(p.trans) // THRIFT-3735 + } + return n, err +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/simple_server.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/simple_server.go new file mode 100644 index 00000000..4097c4ae --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/simple_server.go @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "log" + "runtime/debug" + "sync" +) + +// Simple, non-concurrent server for testing. +type TSimpleServer struct { + quit chan struct{} + + processorFactory TProcessorFactory + serverTransport TServerTransport + inputTransportFactory TTransportFactory + outputTransportFactory TTransportFactory + inputProtocolFactory TProtocolFactory + outputProtocolFactory TProtocolFactory +} + +func NewTSimpleServer2(processor TProcessor, serverTransport TServerTransport) *TSimpleServer { + return NewTSimpleServerFactory2(NewTProcessorFactory(processor), serverTransport) +} + +func NewTSimpleServer4(processor TProcessor, serverTransport TServerTransport, transportFactory TTransportFactory, protocolFactory TProtocolFactory) *TSimpleServer { + return NewTSimpleServerFactory4(NewTProcessorFactory(processor), + serverTransport, + transportFactory, + protocolFactory, + ) +} + +func NewTSimpleServer6(processor TProcessor, serverTransport TServerTransport, inputTransportFactory TTransportFactory, outputTransportFactory TTransportFactory, inputProtocolFactory TProtocolFactory, outputProtocolFactory TProtocolFactory) *TSimpleServer { + return NewTSimpleServerFactory6(NewTProcessorFactory(processor), + serverTransport, + inputTransportFactory, + outputTransportFactory, + inputProtocolFactory, + outputProtocolFactory, + ) +} + +func NewTSimpleServerFactory2(processorFactory TProcessorFactory, serverTransport TServerTransport) *TSimpleServer { + return NewTSimpleServerFactory6(processorFactory, + serverTransport, + NewTTransportFactory(), + NewTTransportFactory(), + NewTBinaryProtocolFactoryDefault(), + NewTBinaryProtocolFactoryDefault(), + ) +} + +func NewTSimpleServerFactory4(processorFactory TProcessorFactory, serverTransport TServerTransport, transportFactory TTransportFactory, protocolFactory TProtocolFactory) *TSimpleServer { + return NewTSimpleServerFactory6(processorFactory, + serverTransport, + transportFactory, + transportFactory, + protocolFactory, + protocolFactory, + ) +} + +func NewTSimpleServerFactory6(processorFactory TProcessorFactory, serverTransport TServerTransport, inputTransportFactory TTransportFactory, outputTransportFactory TTransportFactory, inputProtocolFactory TProtocolFactory, outputProtocolFactory TProtocolFactory) *TSimpleServer { + return &TSimpleServer{ + processorFactory: processorFactory, + serverTransport: serverTransport, + inputTransportFactory: inputTransportFactory, + outputTransportFactory: outputTransportFactory, + inputProtocolFactory: inputProtocolFactory, + outputProtocolFactory: outputProtocolFactory, + quit: make(chan struct{}, 1), + } +} + +func (p *TSimpleServer) ProcessorFactory() TProcessorFactory { + return p.processorFactory +} + +func (p *TSimpleServer) ServerTransport() TServerTransport { + return p.serverTransport +} + +func (p *TSimpleServer) InputTransportFactory() TTransportFactory { + return p.inputTransportFactory +} + +func (p *TSimpleServer) OutputTransportFactory() TTransportFactory { + return p.outputTransportFactory +} + +func (p *TSimpleServer) InputProtocolFactory() TProtocolFactory { + return p.inputProtocolFactory +} + +func (p *TSimpleServer) OutputProtocolFactory() TProtocolFactory { + return p.outputProtocolFactory +} + +func (p *TSimpleServer) Listen() error { + return p.serverTransport.Listen() +} + +func (p *TSimpleServer) AcceptLoop() error { + for { + client, err := p.serverTransport.Accept() + if err != nil { + select { + case <-p.quit: + return nil + default: + } + return err + } + if client != nil { + go func() { + if err := p.processRequests(client); err != nil { + log.Println("error processing request:", err) + } + }() + } + } +} + +func (p *TSimpleServer) Serve() error { + err := p.Listen() + if err != nil { + return err + } + p.AcceptLoop() + return nil +} + +var once sync.Once + +func (p *TSimpleServer) Stop() error { + q := func() { + p.quit <- struct{}{} + p.serverTransport.Interrupt() + } + once.Do(q) + return nil +} + +func (p *TSimpleServer) processRequests(client TTransport) error { + processor := p.processorFactory.GetProcessor(client) + inputTransport := p.inputTransportFactory.GetTransport(client) + outputTransport := p.outputTransportFactory.GetTransport(client) + inputProtocol := p.inputProtocolFactory.GetProtocol(inputTransport) + outputProtocol := p.outputProtocolFactory.GetProtocol(outputTransport) + defer func() { + if e := recover(); e != nil { + log.Printf("panic in processor: %s: %s", e, debug.Stack()) + } + }() + if inputTransport != nil { + defer inputTransport.Close() + } + if outputTransport != nil { + defer outputTransport.Close() + } + for { + ok, err := processor.Process(inputProtocol, outputProtocol) + if err, ok := err.(TTransportException); ok && err.TypeId() == END_OF_FILE { + return nil + } else if err != nil { + log.Printf("error processing request: %s", err) + return err + } + if err, ok := err.(TApplicationException); ok && err.TypeId() == UNKNOWN_METHOD { + continue + } + if !ok { + break + } + } + return nil +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/socket.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/socket.go new file mode 100644 index 00000000..82e28b4b --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/socket.go @@ -0,0 +1,166 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "net" + "time" +) + +type TSocket struct { + conn net.Conn + addr net.Addr + timeout time.Duration +} + +// NewTSocket creates a net.Conn-backed TTransport, given a host and port +// +// Example: +// trans, err := thrift.NewTSocket("localhost:9090") +func NewTSocket(hostPort string) (*TSocket, error) { + return NewTSocketTimeout(hostPort, 0) +} + +// NewTSocketTimeout creates a net.Conn-backed TTransport, given a host and port +// it also accepts a timeout as a time.Duration +func NewTSocketTimeout(hostPort string, timeout time.Duration) (*TSocket, error) { + //conn, err := net.DialTimeout(network, address, timeout) + addr, err := net.ResolveTCPAddr("tcp", hostPort) + if err != nil { + return nil, err + } + return NewTSocketFromAddrTimeout(addr, timeout), nil +} + +// Creates a TSocket from a net.Addr +func NewTSocketFromAddrTimeout(addr net.Addr, timeout time.Duration) *TSocket { + return &TSocket{addr: addr, timeout: timeout} +} + +// Creates a TSocket from an existing net.Conn +func NewTSocketFromConnTimeout(conn net.Conn, timeout time.Duration) *TSocket { + return &TSocket{conn: conn, addr: conn.RemoteAddr(), timeout: timeout} +} + +// Sets the socket timeout +func (p *TSocket) SetTimeout(timeout time.Duration) error { + p.timeout = timeout + return nil +} + +func (p *TSocket) pushDeadline(read, write bool) { + var t time.Time + if p.timeout > 0 { + t = time.Now().Add(time.Duration(p.timeout)) + } + if read && write { + p.conn.SetDeadline(t) + } else if read { + p.conn.SetReadDeadline(t) + } else if write { + p.conn.SetWriteDeadline(t) + } +} + +// Connects the socket, creating a new socket object if necessary. +func (p *TSocket) Open() error { + if p.IsOpen() { + return NewTTransportException(ALREADY_OPEN, "Socket already connected.") + } + if p.addr == nil { + return NewTTransportException(NOT_OPEN, "Cannot open nil address.") + } + if len(p.addr.Network()) == 0 { + return NewTTransportException(NOT_OPEN, "Cannot open bad network name.") + } + if len(p.addr.String()) == 0 { + return NewTTransportException(NOT_OPEN, "Cannot open bad address.") + } + var err error + if p.conn, err = net.DialTimeout(p.addr.Network(), p.addr.String(), p.timeout); err != nil { + return NewTTransportException(NOT_OPEN, err.Error()) + } + return nil +} + +// Retrieve the underlying net.Conn +func (p *TSocket) Conn() net.Conn { + return p.conn +} + +// Returns true if the connection is open +func (p *TSocket) IsOpen() bool { + if p.conn == nil { + return false + } + return true +} + +// Closes the socket. +func (p *TSocket) Close() error { + // Close the socket + if p.conn != nil { + err := p.conn.Close() + if err != nil { + return err + } + p.conn = nil + } + return nil +} + +//Returns the remote address of the socket. +func (p *TSocket) Addr() net.Addr { + return p.addr +} + +func (p *TSocket) Read(buf []byte) (int, error) { + if !p.IsOpen() { + return 0, NewTTransportException(NOT_OPEN, "Connection not open") + } + p.pushDeadline(true, false) + n, err := p.conn.Read(buf) + return n, NewTTransportExceptionFromError(err) +} + +func (p *TSocket) Write(buf []byte) (int, error) { + if !p.IsOpen() { + return 0, NewTTransportException(NOT_OPEN, "Connection not open") + } + p.pushDeadline(false, true) + return p.conn.Write(buf) +} + +func (p *TSocket) Flush() error { + return nil +} + +func (p *TSocket) Interrupt() error { + if !p.IsOpen() { + return nil + } + return p.conn.Close() +} + +func (p *TSocket) RemainingBytes() (num_bytes uint64) { + const maxSize = ^uint64(0) + return maxSize // the thruth is, we just don't know unless framed is used +} + diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/ssl_server_socket.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/ssl_server_socket.go new file mode 100644 index 00000000..58f859b0 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/ssl_server_socket.go @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "net" + "time" + "crypto/tls" +) + +type TSSLServerSocket struct { + listener net.Listener + addr net.Addr + clientTimeout time.Duration + interrupted bool + cfg *tls.Config +} + +func NewTSSLServerSocket(listenAddr string, cfg *tls.Config) (*TSSLServerSocket, error) { + return NewTSSLServerSocketTimeout(listenAddr, cfg, 0) +} + +func NewTSSLServerSocketTimeout(listenAddr string, cfg *tls.Config, clientTimeout time.Duration) (*TSSLServerSocket, error) { + addr, err := net.ResolveTCPAddr("tcp", listenAddr) + if err != nil { + return nil, err + } + return &TSSLServerSocket{addr: addr, clientTimeout: clientTimeout, cfg: cfg}, nil +} + +func (p *TSSLServerSocket) Listen() error { + if p.IsListening() { + return nil + } + l, err := tls.Listen(p.addr.Network(), p.addr.String(), p.cfg) + if err != nil { + return err + } + p.listener = l + return nil +} + +func (p *TSSLServerSocket) Accept() (TTransport, error) { + if p.interrupted { + return nil, errTransportInterrupted + } + if p.listener == nil { + return nil, NewTTransportException(NOT_OPEN, "No underlying server socket") + } + conn, err := p.listener.Accept() + if err != nil { + return nil, NewTTransportExceptionFromError(err) + } + return NewTSSLSocketFromConnTimeout(conn, p.cfg, p.clientTimeout), nil +} + +// Checks whether the socket is listening. +func (p *TSSLServerSocket) IsListening() bool { + return p.listener != nil +} + +// Connects the socket, creating a new socket object if necessary. +func (p *TSSLServerSocket) Open() error { + if p.IsListening() { + return NewTTransportException(ALREADY_OPEN, "Server socket already open") + } + if l, err := tls.Listen(p.addr.Network(), p.addr.String(), p.cfg); err != nil { + return err + } else { + p.listener = l + } + return nil +} + +func (p *TSSLServerSocket) Addr() net.Addr { + return p.addr +} + +func (p *TSSLServerSocket) Close() error { + defer func() { + p.listener = nil + }() + if p.IsListening() { + return p.listener.Close() + } + return nil +} + +func (p *TSSLServerSocket) Interrupt() error { + p.interrupted = true + return nil +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/ssl_socket.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/ssl_socket.go new file mode 100644 index 00000000..04d38508 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/ssl_socket.go @@ -0,0 +1,171 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "crypto/tls" + "net" + "time" +) + +type TSSLSocket struct { + conn net.Conn + // hostPort contains host:port (e.g. "asdf.com:12345"). The field is + // only valid if addr is nil. + hostPort string + // addr is nil when hostPort is not "", and is only used when the + // TSSLSocket is constructed from a net.Addr. + addr net.Addr + timeout time.Duration + cfg *tls.Config +} + +// NewTSSLSocket creates a net.Conn-backed TTransport, given a host and port and tls Configuration +// +// Example: +// trans, err := thrift.NewTSSLSocket("localhost:9090", nil) +func NewTSSLSocket(hostPort string, cfg *tls.Config) (*TSSLSocket, error) { + return NewTSSLSocketTimeout(hostPort, cfg, 0) +} + +// NewTSSLSocketTimeout creates a net.Conn-backed TTransport, given a host and port +// it also accepts a tls Configuration and a timeout as a time.Duration +func NewTSSLSocketTimeout(hostPort string, cfg *tls.Config, timeout time.Duration) (*TSSLSocket, error) { + return &TSSLSocket{hostPort: hostPort, timeout: timeout, cfg: cfg}, nil +} + +// Creates a TSSLSocket from a net.Addr +func NewTSSLSocketFromAddrTimeout(addr net.Addr, cfg *tls.Config, timeout time.Duration) *TSSLSocket { + return &TSSLSocket{addr: addr, timeout: timeout, cfg: cfg} +} + +// Creates a TSSLSocket from an existing net.Conn +func NewTSSLSocketFromConnTimeout(conn net.Conn, cfg *tls.Config, timeout time.Duration) *TSSLSocket { + return &TSSLSocket{conn: conn, addr: conn.RemoteAddr(), timeout: timeout, cfg: cfg} +} + +// Sets the socket timeout +func (p *TSSLSocket) SetTimeout(timeout time.Duration) error { + p.timeout = timeout + return nil +} + +func (p *TSSLSocket) pushDeadline(read, write bool) { + var t time.Time + if p.timeout > 0 { + t = time.Now().Add(time.Duration(p.timeout)) + } + if read && write { + p.conn.SetDeadline(t) + } else if read { + p.conn.SetReadDeadline(t) + } else if write { + p.conn.SetWriteDeadline(t) + } +} + +// Connects the socket, creating a new socket object if necessary. +func (p *TSSLSocket) Open() error { + var err error + // If we have a hostname, we need to pass the hostname to tls.Dial for + // certificate hostname checks. + if p.hostPort != "" { + if p.conn, err = tls.Dial("tcp", p.hostPort, p.cfg); err != nil { + return NewTTransportException(NOT_OPEN, err.Error()) + } + } else { + if p.IsOpen() { + return NewTTransportException(ALREADY_OPEN, "Socket already connected.") + } + if p.addr == nil { + return NewTTransportException(NOT_OPEN, "Cannot open nil address.") + } + if len(p.addr.Network()) == 0 { + return NewTTransportException(NOT_OPEN, "Cannot open bad network name.") + } + if len(p.addr.String()) == 0 { + return NewTTransportException(NOT_OPEN, "Cannot open bad address.") + } + if p.conn, err = tls.Dial(p.addr.Network(), p.addr.String(), p.cfg); err != nil { + return NewTTransportException(NOT_OPEN, err.Error()) + } + } + return nil +} + +// Retrieve the underlying net.Conn +func (p *TSSLSocket) Conn() net.Conn { + return p.conn +} + +// Returns true if the connection is open +func (p *TSSLSocket) IsOpen() bool { + if p.conn == nil { + return false + } + return true +} + +// Closes the socket. +func (p *TSSLSocket) Close() error { + // Close the socket + if p.conn != nil { + err := p.conn.Close() + if err != nil { + return err + } + p.conn = nil + } + return nil +} + +func (p *TSSLSocket) Read(buf []byte) (int, error) { + if !p.IsOpen() { + return 0, NewTTransportException(NOT_OPEN, "Connection not open") + } + p.pushDeadline(true, false) + n, err := p.conn.Read(buf) + return n, NewTTransportExceptionFromError(err) +} + +func (p *TSSLSocket) Write(buf []byte) (int, error) { + if !p.IsOpen() { + return 0, NewTTransportException(NOT_OPEN, "Connection not open") + } + p.pushDeadline(false, true) + return p.conn.Write(buf) +} + +func (p *TSSLSocket) Flush() error { + return nil +} + +func (p *TSSLSocket) Interrupt() error { + if !p.IsOpen() { + return nil + } + return p.conn.Close() +} + +func (p *TSSLSocket) RemainingBytes() (num_bytes uint64) { + const maxSize = ^uint64(0) + return maxSize // the thruth is, we just don't know unless framed is used +} + diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport.go new file mode 100644 index 00000000..45389965 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport.go @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" + "io" +) + +var errTransportInterrupted = errors.New("Transport Interrupted") + +type Flusher interface { + Flush() (err error) +} + +type ReadSizeProvider interface { + RemainingBytes() (num_bytes uint64) +} + + +// Encapsulates the I/O layer +type TTransport interface { + io.ReadWriteCloser + Flusher + ReadSizeProvider + + // Opens the transport for communication + Open() error + + // Returns true if the transport is open + IsOpen() bool +} + +type stringWriter interface { + WriteString(s string) (n int, err error) +} + + +// This is "enchanced" transport with extra capabilities. You need to use one of these +// to construct protocol. +// Notably, TSocket does not implement this interface, and it is always a mistake to use +// TSocket directly in protocol. +type TRichTransport interface { + io.ReadWriter + io.ByteReader + io.ByteWriter + stringWriter + Flusher + ReadSizeProvider +} + diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport_exception.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport_exception.go new file mode 100644 index 00000000..9505b446 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport_exception.go @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" + "io" +) + +type timeoutable interface { + Timeout() bool +} + +// Thrift Transport exception +type TTransportException interface { + TException + TypeId() int + Err() error +} + +const ( + UNKNOWN_TRANSPORT_EXCEPTION = 0 + NOT_OPEN = 1 + ALREADY_OPEN = 2 + TIMED_OUT = 3 + END_OF_FILE = 4 +) + +type tTransportException struct { + typeId int + err error +} + +func (p *tTransportException) TypeId() int { + return p.typeId +} + +func (p *tTransportException) Error() string { + return p.err.Error() +} + +func (p *tTransportException) Err() error { + return p.err +} + +func NewTTransportException(t int, e string) TTransportException { + return &tTransportException{typeId: t, err: errors.New(e)} +} + +func NewTTransportExceptionFromError(e error) TTransportException { + if e == nil { + return nil + } + + if t, ok := e.(TTransportException); ok { + return t + } + + switch v := e.(type) { + case TTransportException: + return v + case timeoutable: + if v.Timeout() { + return &tTransportException{typeId: TIMED_OUT, err: e} + } + } + + if e == io.EOF { + return &tTransportException{typeId: END_OF_FILE, err: e} + } + + return &tTransportException{typeId: UNKNOWN_TRANSPORT_EXCEPTION, err: e} +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport_factory.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport_factory.go new file mode 100644 index 00000000..533d1b43 --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/transport_factory.go @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Factory class used to create wrapped instance of Transports. +// This is used primarily in servers, which get Transports from +// a ServerTransport and then may want to mutate them (i.e. create +// a BufferedTransport from the underlying base transport) +type TTransportFactory interface { + GetTransport(trans TTransport) TTransport +} + +type tTransportFactory struct{} + +// Return a wrapped instance of the base Transport. +func (p *tTransportFactory) GetTransport(trans TTransport) TTransport { + return trans +} + +func NewTTransportFactory() TTransportFactory { + return &tTransportFactory{} +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/type.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/type.go new file mode 100644 index 00000000..4292ffca --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/type.go @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Type constants in the Thrift protocol +type TType byte + +const ( + STOP = 0 + VOID = 1 + BOOL = 2 + BYTE = 3 + I08 = 3 + DOUBLE = 4 + I16 = 6 + I32 = 8 + I64 = 10 + STRING = 11 + UTF7 = 11 + STRUCT = 12 + MAP = 13 + SET = 14 + LIST = 15 + UTF8 = 16 + UTF16 = 17 + //BINARY = 18 wrong and unusued +) + +var typeNames = map[int]string{ + STOP: "STOP", + VOID: "VOID", + BOOL: "BOOL", + BYTE: "BYTE", + DOUBLE: "DOUBLE", + I16: "I16", + I32: "I32", + I64: "I64", + STRING: "STRING", + STRUCT: "STRUCT", + MAP: "MAP", + SET: "SET", + LIST: "LIST", + UTF8: "UTF8", + UTF16: "UTF16", +} + +func (p TType) String() string { + if s, ok := typeNames[int(p)]; ok { + return s + } + return "Unknown" +} diff --git a/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/zlib_transport.go b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/zlib_transport.go new file mode 100644 index 00000000..e47455fe --- /dev/null +++ b/vendor/github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift/zlib_transport.go @@ -0,0 +1,117 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. + */ + +package thrift + +import ( + "compress/zlib" + "io" + "log" +) + +// TZlibTransportFactory is a factory for TZlibTransport instances +type TZlibTransportFactory struct { + level int +} + +// TZlibTransport is a TTransport implementation that makes use of zlib compression. +type TZlibTransport struct { + reader io.ReadCloser + transport TTransport + writer *zlib.Writer +} + +// GetTransport constructs a new instance of NewTZlibTransport +func (p *TZlibTransportFactory) GetTransport(trans TTransport) TTransport { + t, _ := NewTZlibTransport(trans, p.level) + return t +} + +// NewTZlibTransportFactory constructs a new instance of NewTZlibTransportFactory +func NewTZlibTransportFactory(level int) *TZlibTransportFactory { + return &TZlibTransportFactory{level: level} +} + +// NewTZlibTransport constructs a new instance of TZlibTransport +func NewTZlibTransport(trans TTransport, level int) (*TZlibTransport, error) { + w, err := zlib.NewWriterLevel(trans, level) + if err != nil { + log.Println(err) + return nil, err + } + + return &TZlibTransport{ + writer: w, + transport: trans, + }, nil +} + +// Close closes the reader and writer (flushing any unwritten data) and closes +// the underlying transport. +func (z *TZlibTransport) Close() error { + if z.reader != nil { + if err := z.reader.Close(); err != nil { + return err + } + } + if err := z.writer.Close(); err != nil { + return err + } + return z.transport.Close() +} + +// Flush flushes the writer and its underlying transport. +func (z *TZlibTransport) Flush() error { + if err := z.writer.Flush(); err != nil { + return err + } + return z.transport.Flush() +} + +// IsOpen returns true if the transport is open +func (z *TZlibTransport) IsOpen() bool { + return z.transport.IsOpen() +} + +// Open opens the transport for communication +func (z *TZlibTransport) Open() error { + return z.transport.Open() +} + +func (z *TZlibTransport) Read(p []byte) (int, error) { + if z.reader == nil { + r, err := zlib.NewReader(z.transport) + if err != nil { + return 0, NewTTransportExceptionFromError(err) + } + z.reader = r + } + + return z.reader.Read(p) +} + +// RemainingBytes returns the size in bytes of the data that is still to be +// read. +func (z *TZlibTransport) RemainingBytes() uint64 { + return z.transport.RemainingBytes() +} + +func (z *TZlibTransport) Write(p []byte) (int, error) { + return z.writer.Write(p) +} diff --git a/vendor/github.com/uber-go/tally/types.go b/vendor/github.com/uber-go/tally/types.go new file mode 100644 index 00000000..7b224406 --- /dev/null +++ b/vendor/github.com/uber-go/tally/types.go @@ -0,0 +1,157 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "fmt" + "sort" + "time" +) + +// Scope is a namespace wrapper around a stats reporter, ensuring that +// all emitted values have a given prefix or set of tags. +// +// IMPORTANT: When using Prometheus reporters, users must take care to +// not create metrics from both parent scopes and subscopes +// that have the same metric name but different tag keys, +// as metric allocation will panic. +type Scope interface { + // Counter returns the Counter object corresponding to the name. + Counter(name string) Counter + + // Gauge returns the Gauge object corresponding to the name. + Gauge(name string) Gauge + + // Timer returns the Timer object corresponding to the name. + Timer(name string) Timer + + // Histogram returns the Histogram object corresponding to the name. + // To use default value and duration buckets configured for the scope + // simply pass tally.DefaultBuckets or nil. + // You can use tally.ValueBuckets{x, y, ...} for value buckets. + // You can use tally.DurationBuckets{x, y, ...} for duration buckets. + // You can use tally.MustMakeLinearValueBuckets(start, width, count) for linear values. + // You can use tally.MustMakeLinearDurationBuckets(start, width, count) for linear durations. + // You can use tally.MustMakeExponentialValueBuckets(start, factor, count) for exponential values. + // You can use tally.MustMakeExponentialDurationBuckets(start, factor, count) for exponential durations. + Histogram(name string, buckets Buckets) Histogram + + // Tagged returns a new child scope with the given tags and current tags. + Tagged(tags map[string]string) Scope + + // SubScope returns a new child scope appending a further name prefix. + SubScope(name string) Scope + + // Capabilities returns a description of metrics reporting capabilities. + Capabilities() Capabilities +} + +// Counter is the interface for emitting counter type metrics. +type Counter interface { + // Inc increments the counter by a delta. + Inc(delta int64) +} + +// Gauge is the interface for emitting gauge metrics. +type Gauge interface { + // Update sets the gauges absolute value. + Update(value float64) +} + +// Timer is the interface for emitting timer metrics. +type Timer interface { + // Record a specific duration directly. + Record(value time.Duration) + + // Start gives you back a specific point in time to report via Stop. + Start() Stopwatch +} + +// Histogram is the interface for emitting histogram metrics +type Histogram interface { + // RecordValue records a specific value directly. + // Will use the configured value buckets for the histogram. + RecordValue(value float64) + + // RecordDuration records a specific duration directly. + // Will use the configured duration buckets for the histogram. + RecordDuration(value time.Duration) + + // Start gives you a specific point in time to then record a duration. + // Will use the configured duration buckets for the histogram. + Start() Stopwatch +} + +// Stopwatch is a helper for simpler tracking of elapsed time, use the +// Stop() method to report time elapsed since its created back to the +// timer or histogram. +type Stopwatch struct { + start time.Time + recorder StopwatchRecorder +} + +// NewStopwatch creates a new immutable stopwatch for recording the start +// time to a stopwatch reporter. +func NewStopwatch(start time.Time, r StopwatchRecorder) Stopwatch { + return Stopwatch{start: start, recorder: r} +} + +// Stop reports time elapsed since the stopwatch start to the recorder. +func (sw Stopwatch) Stop() { + sw.recorder.RecordStopwatch(sw.start) +} + +// StopwatchRecorder is a recorder that is called when a stopwatch is +// stopped with Stop(). +type StopwatchRecorder interface { + RecordStopwatch(stopwatchStart time.Time) +} + +// Buckets is an interface that can represent a set of buckets +// either as float64s or as durations. +type Buckets interface { + fmt.Stringer + sort.Interface + + // AsValues returns a representation of the buckets as float64s + AsValues() []float64 + + // AsDurations returns a representation of the buckets as time.Durations + AsDurations() []time.Duration +} + +// BucketPair describes the lower and upper bounds +// for a derived bucket from a buckets set. +type BucketPair interface { + LowerBoundValue() float64 + UpperBoundValue() float64 + LowerBoundDuration() time.Duration + UpperBoundDuration() time.Duration +} + +// Capabilities is a description of metrics reporting capabilities. +type Capabilities interface { + // Reporting returns whether the reporter has the ability to actively report. + Reporting() bool + + // Tagging returns whether the reporter has the capability for tagged metrics. + Tagging() bool +} diff --git a/vendor/github.com/uber/jaeger-client-go/.gitignore b/vendor/github.com/uber/jaeger-client-go/.gitignore new file mode 100644 index 00000000..27349079 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/.gitignore @@ -0,0 +1,15 @@ +*.out +*.test +*.xml +*.swp +.idea/ +.tmp/ +*.iml +*.cov +*.html +*.log +gen/thrift/js +gen/thrift/py +vendor/ +crossdock-main +crossdock/jaeger-docker-compose.yml diff --git a/vendor/github.com/uber/jaeger-client-go/.gitmodules b/vendor/github.com/uber/jaeger-client-go/.gitmodules new file mode 100644 index 00000000..295ebcf6 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/.gitmodules @@ -0,0 +1,3 @@ +[submodule "idl"] + path = idl + url = https://github.com/uber/jaeger-idl.git diff --git a/vendor/github.com/uber/jaeger-client-go/.travis.yml b/vendor/github.com/uber/jaeger-client-go/.travis.yml new file mode 100644 index 00000000..f9c9a777 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/.travis.yml @@ -0,0 +1,56 @@ +sudo: required + +language: go +go_import_path: github.com/uber/jaeger-client-go + +dist: trusty + +matrix: + include: + - go: 1.14.x + env: + - TESTS=true + - USE_DEP=true + - COVERAGE=true + - go: 1.14.x + env: + - USE_DEP=true + - CROSSDOCK=true + - go: 1.14.x + env: + - TESTS=true + - USE_DEP=false + - USE_GLIDE=true + # test with previous version of Go + - go: 1.13.x + env: + - TESTS=true + - USE_DEP=true + - CI_SKIP_LINT=true + +services: + - docker + +env: + global: + - DOCKER_COMPOSE_VERSION=1.8.0 + - COMMIT=${TRAVIS_COMMIT::8} + # DOCKER_PASS + - secure: "CnjVyxNvMC/dhr/eR7C+FiWucZ4/O5LfAuz9YU0qlnV6XLR7XXRtzZlfFKIImJT6xHp+OptTqAIXqUbvwK2OXDP1ZsLiWRm+2elb9/isGusWXjs3g817lX8njSUcIFILbfi+vAE7UD2BKjHxpmvWmCZidisU1rcaZ9OQNPqMnNIDxVx0FOTwYx+2hfkdjnN5dikzafBDQ6ZZV/mGbcaTG45GGFU6DHyVLzf9qCPXyXnz2+VDhcoPQsYkzE56XHCmHxvEfXxgfqYefJNUlFPhniAQySVsCNVDJ8QcCV6uHaXoIzxJKx9FdUnWKI1/AtpQsTZPgEm4Ujnt+kGJsXopXy2Xx4MZxmcTCBwAMjZxPMF7KoojbtDeOZgEMtf1tGPN6DTNc3NpVmr0BKZ44lhqk+vnd8HAiC1tHDEoSb1Esl7dMUUf1qZAh3MtT+NYi3mTwyx/ilXUS7KPyy7x0ezB3kGuMoLhvR2hrprqRr5NOV2hrd1au+IXmb+4IanFOsBlceBfs8P0JFMO/aw15r+HimSZpQsJx//IT0LReCZYXLe0/WVsF/8+HDwHKlO99gGpk4iXlNKKvdPWabihMp3I3peMrvL+jnlwh47RqHs/0Q71xsKjVWTn+Svq3FpVP0Pgyxhg+oG4WEByBiLnBQcZwSBhWexkJrNI73GzaZiIldk=" + # DOCKER_USER + - secure: "bpBSmypHzI4PnteM4cwLiMC2163Sj/4mEl+1dj+6NWl2tr1hREeVXKhsWBpah25n6BDyr2A4yhBZcWLaNKrsCKT3U37csAQTOFVeQ9x5xhPq+ohANd/OsspFsxNZaKwx161LizH/uTDotMxxevZacsyYWGNv/cRFkwcQ8upLkReRR6puJ+jNQC0BFpKWBJY/zpm5J7xFb7FO20LvQVyRgsgzqWmg9oRNVw9uwOfSY3btacftYctDLUbAr8YRNHd2C6dZnMAi8KdDTLXKTqjKmp6WidOmi92Ml7tOjB+bV6TOaVAhrcI5Rdje4rRWG4MucAjPMP0ZBW36KTfcGqFUcDhX7UqISe2WxoI+8ZD6fJ+nNtD3bk4YAUJB4BSs2sQdiYyjpHyGJR6RW50+3uRz2YbXpzVr9wqv2lZSl/xy3wC5Hag55uqzVlSiDw2pK8lctT3dnQveE7PqAI577PjF2NrHlgrBbykOwwUCNbRTmykzqoDnkxclmiZ+rflEeWsSYglePK/d6Gj9+N7wJZM5heprdJJMFTrzMWZ21Ll9ZGY9updCBKmJA8pBYiLHbu0lWOp+9QUGC+621Zq0d1PHhN6L4eXk/f3RNoZTr//cX6WdNmmO7tBbaGpmp/UYiYTY1WO9vP7tCDsT75k285HCfnIrlGRdbCZZbfuYNGPKIQ0=" + +install: + - make install-ci USE_DEP=$USE_DEP + - if [ "$CROSSDOCK" == true ]; then bash ./travis/install-crossdock-deps.sh ; fi + +script: + - if [ "$TESTS" == true ]; then make test-ci ; else echo 'skipping tests'; fi + - if [ "$CROSSDOCK" == true ]; then bash ./travis/build-crossdock.sh ; else echo 'skipping crossdock'; fi + +after_success: + - if [ "$COVERAGE" == true ]; then mv cover.out coverage.txt ; else echo 'skipping coverage'; fi + - if [ "$COVERAGE" == true ]; then bash <(curl -s https://codecov.io/bash) ; else echo 'skipping coverage'; fi + +after_failure: + - if [ "$CROSSDOCK" == true ]; then timeout 5 docker-compose -f crossdock/docker-compose.yml logs; fi diff --git a/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md b/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md new file mode 100644 index 00000000..cab87e9d --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md @@ -0,0 +1,351 @@ +Changes by Version +================== + +2.25.0 (2020-07-13) +------------------- +## Breaking changes +- [feat] Periodically re-resolve UDP server address, with opt-out (#520) -- Trevor Foster + + The re-resolving of UDP address is now enabled by default, to make the client more robust in Kubernetes deployments. + The old resolve-once behavior can be restored by setting DisableAttemptReconnecting=true in the Configuration struct, + or via JAEGER_REPORTER_ATTEMPT_RECONNECTING_DISABLED=true environment variable. + +## Bug fixes +- Do not add invalid context to references (#521) -- Yuri Shkuro + + +2.24.0 (2020-06-14) +------------------- +- Mention FromEnv() in the README, docs, and examples (#518) -- Martin Lercher +- Serialize access to RemotelyControlledSampler.sampler (#515) -- Dima +- Override reporter config only when agent host/port is set in env (#513) -- ilylia +- Converge on JAEGER_SAMPLING_ENDPOINT env variable (#511) -- Eundoo Song + + +2.23.1 (2020-04-28) +------------------- +- Fix regression by handling nil logger correctly ([#507](https://github.com/jaegertracing/jaeger-client-go/pull/507)) -- Prithvi Raj + + +2.23.0 (2020-04-22) +------------------- + +- Add the ability to log all span interactions at a new debug log level([#502](https://github.com/jaegertracing/jaeger-client-go/pull/502), [#503](https://github.com/jaegertracing/jaeger-client-go/pull/503), [#504](https://github.com/jaegertracing/jaeger-client-go/pull/504)) -- Prithvi Raj +- Chore (docs): fix typos ([#496](https://github.com/jaegertracing/jaeger-client-go/pull/496), [#498](https://github.com/jaegertracing/jaeger-client-go/pull/498)) -- Febrian Setianto and Ivan Babrou +- Unset highest bit of traceID in probabilistic sampler ([#490](https://github.com/jaegertracing/jaeger-client-go/pull/490)) -- Sokolov Yura + +2.22.1 (2020-01-16) +------------------- + +- Increase UDP batch overhead to account for data loss metrics ([#488](https://github.com/jaegertracing/jaeger-client-go/pull/488)) -- Yuri Shkuro + + +2.22.0 (2020-01-15) +------------------- + +- Report data loss stats to Jaeger backend ([#482](https://github.com/jaegertracing/jaeger-client-go/pull/482)) -- Yuri Shkuro +- Add limit on log records per span ([#483](https://github.com/jaegertracing/jaeger-client-go/pull/483)) -- Sokolov Yura + + +2.21.1 (2019-12-20) +------------------- + +- Update version correctly. + + +2.21.0 (2019-12-20) +------------------- + +- Clarify reporting error logs ([#469](https://github.com/jaegertracing/jaeger-client-go/pull/469)) -- Yuri Shkuro +- Do not strip leading zeros from trace IDs ([#472](https://github.com/jaegertracing/jaeger-client-go/pull/472)) -- Yuri Shkuro +- Chore (docs): fixed a couple of typos ([#475](https://github.com/jaegertracing/jaeger-client-go/pull/475)) -- Marc Bramaud +- Support custom HTTP headers when reporting spans over HTTP ([#479](https://github.com/jaegertracing/jaeger-client-go/pull/479)) -- Albert Teoh + + +2.20.1 (2019-11-08) +------------------- + +Minor patch via https://github.com/jaegertracing/jaeger-client-go/pull/468 + +- Make `AdaptiveSamplerUpdater` usable with default values; Resolves #467 +- Create `OperationNameLateBinding` sampler option and config option +- Make `SamplerOptions` var of public type, so that its functions are discoverable via godoc + + +2.20.0 (2019-11-06) +------------------- + +## New Features + +- Allow all in-process spans of a trace to share sampling state (#443) -- Prithvi Raj + + Sampling state is shared between all spans of the trace that are still in memory. + This allows implementation of delayed sampling decisions (see below). + +- Support delayed sampling decisions (#449) -- Yuri Shkuro + + This is a large structural change to how the samplers work. + It allows some samplers to be executed multiple times on different + span events (like setting a tag) and make a positive sampling decision + later in the span life cycle, or even based on children spans. + See [README](./README.md#delayed-sampling) for more details. + + There is a related minor change in behavior of the adaptive (per-operation) sampler, + which will no longer re-sample the trace when `span.SetOperation()` is called, i.e. the + operation used to make the sampling decision is always the one provided at span creation. + +- Add experimental tag matching sampler (#452) -- Yuri Shkuro + + A sampler that can sample a trace based on a certain tag added to the root + span or one of its local (in-process) children. The sampler can be used with + another experimental `PrioritySampler` that allows multiple samplers to try + to make a sampling decision, in a certain priority order. + +- [log/zap] Report whether a trace was sampled (#445) -- Abhinav Gupta +- Allow config.FromEnv() to enrich an existing config object (#436) -- Vineeth Reddy + +## Minor patches + +- Expose Sampler on Tracer and accept sampler options via Configuration (#460) -- Yuri Shkuro +- Fix github.com/uber-go/atomic import (#464) -- Yuri Shkuro +- Add nodejs to crossdock tests (#441) -- Bhavin Gandhi +- Bump Go compiler version to 1.13 (#453) -- Yuri Shkuro + +2.19.0 (2019-09-23) +------------------- + +- Upgrade jaeger-lib to 2.2 and unpin Prom client (#434) -- Yuri Shkuro + + +2.18.1 (2019-09-16) +------------------- + +- Remove go.mod / go.sum that interfere with `go get` (#432) + + +2.18.0 (2019-09-09) +------------------- + +- Add option "noDebugFlagOnForcedSampling" for tracer initialization [resolves #422] (#423) + + +2.17.0 (2019-08-30) +------------------- + +- Add a flag for firehose mode (#419) +- Default sampling server URL to agent (#414) +- Update default sampling rate when sampling strategy is refreshed (#413) +- Support "Self" Span Reference (#411) +- Don't complain about blank service name if tracing is Disabled (#410) Yuri +- Use IP address from tag if exist (#402) +- Expose span data to custom reporters [fixes #394] (#399) +- Fix the span allocation in the pool (#381) + + +2.16.0 (2019-03-24) +------------------- + +- Add baggage to B3 codec (#319) +- Add support for 128bit trace ids to zipkin thrift spans. (#378) +- Update zipkin propagation logic to support 128bit traceIDs (#373) +- Accept "true" for the x-b3-sampled header (#356) + +- Allow setting of PoolSpans from Config object (#322) +- Make propagators public to allow wrapping (#379) +- Change default metric namespace to use relevant separator for the metric backend (#364) +- Change metrics prefix to jaeger_tracer and add descriptions (#346) +- Bump OpenTracing to ^1.1.x (#383) +- Upgrade jaeger-lib to v2.0.0 (#359) +- Avoid defer when generating random number (#358) +- Use a pool of rand.Source to reduce lock contention when creating span ids (#357) +- Make JAEGER_ENDPOINT take priority over JAEGER_AGENT_XXX (#342) + + +2.15.0 (2018-10-10) +------------------- + +- Fix FollowsFrom spans ignoring baggage/debug header from dummy parent context (#313) +- Make maximum annotation length configurable in tracer options (#318) +- Support more environment variables in configuration (#323) +- Print error on Sampler Query failure (#328) +- Add an HTTPOption to support custom http.RoundTripper (#333) +- Return an error when an HTTP error code is seen in zipkin HTTP transport (#331) + + +2.14.0 (2018-04-30) +------------------- + +- Support throttling for debug traces (#274) +- Remove dependency on Apache Thrift (#303) +- Remove dependency on tchannel (#295) (#294) +- Test with Go 1.9 (#298) + + +2.13.0 (2018-04-15) +------------------- + +- Use value receiver for config.NewTracer() (#283) +- Lock span during jaeger thrift conversion (#273) +- Fix the RemotelyControlledSampler so that it terminates go-routine on Close() (#260) +- Added support for client configuration via env vars (#275) +- Allow overriding sampler in the Config (#270) + + +2.12.0 (2018-03-14) +------------------- + +- Use lock when retrieving span.Context() (#268) +- Add Configuration support for custom Injector and Extractor (#263) + + +2.11.2 (2018-01-12) +------------------- + +- Add Gopkg.toml to allow using the lib with `dep` + + +2.11.1 (2018-01-03) +------------------- + +- Do not enqueue spans after Reporter is closed (#235, #245) +- Change default flush interval to 1sec (#243) + + +2.11.0 (2017-11-27) +------------------- + +- Normalize metric names and tags to be compatible with Prometheus (#222) + + +2.10.0 (2017-11-14) +------------------- + +- Support custom tracing headers (#176) +- Add BaggageRestrictionManager (#178) and RemoteBaggageRestrictionManager (#182) +- Do not coerce baggage keys to lower case (#196) +- Log span name when span cannot be reported (#198) +- Add option to enable gen128Bit for tracer (#193) and allow custom generator for high bits of trace ID (#219) + + +2.9.0 (2017-07-29) +------------------ + +- Pin thrift <= 0.10 (#179) +- Introduce a parallel interface ContribObserver (#159) + + +2.8.0 (2017-07-05) +------------------ + +- Drop `jaeger.` prefix from `jaeger.hostname` process-level tag +- Add options to set tracer tags + + +2.7.0 (2017-06-21) +------------------ + +- Fix rate limiter balance [#135](https://github.com/uber/jaeger-client-go/pull/135) [#140](https://github.com/uber/jaeger-client-go/pull/140) +- Default client to send Jaeger.thrift [#147](https://github.com/uber/jaeger-client-go/pull/147) +- Save baggage in span [#153](https://github.com/uber/jaeger-client-go/pull/153) +- Move reporter.queueLength to the top of the struct to guarantee 64bit alignment [#158](https://github.com/uber/jaeger-client-go/pull/158) +- Support HTTP transport with jaeger.thrift [#161](https://github.com/uber/jaeger-client-go/pull/161) + + +2.6.0 (2017-03-28) +------------------ + +- Add config option to initialize RPC Metrics feature + + +2.5.0 (2017-03-23) +------------------ + +- Split request latency metric by success/failure [#123](https://github.com/uber/jaeger-client-go/pull/123) +- Add mutex to adaptive sampler and fix race condition [#124](https://github.com/uber/jaeger-client-go/pull/124) +- Fix rate limiter panic [#125](https://github.com/uber/jaeger-client-go/pull/125) + + +2.4.0 (2017-03-21) +------------------ + +- Remove `_ms` suffix from request latency metric name [#121](https://github.com/uber/jaeger-client-go/pull/121) +- Rename all metrics to "request" and "http_request" and use tags for other dimensions [#121](https://github.com/uber/jaeger-client-go/pull/121) + + +2.3.0 (2017-03-20) +------------------ + +- Make Span type public to allow access to non-std methods for testing [#117](https://github.com/uber/jaeger-client-go/pull/117) +- Add a structured way to extract traces for logging with zap [#118](https://github.com/uber/jaeger-client-go/pull/118) + + +2.2.1 (2017-03-14) +------------------ + +- Fix panic caused by updating the remote sampler from adaptive sampler to any other sampler type (https://github.com/uber/jaeger-client-go/pull/111) + + +2.2.0 (2017-03-10) +------------------ + +- Introduce Observer and SpanObserver (https://github.com/uber/jaeger-client-go/pull/94) +- Add RPC metrics emitter as Observer/SpanObserver (https://github.com/uber/jaeger-client-go/pull/103) + + +2.1.2 (2017-02-27) +------------------- + +- Fix leaky bucket bug (https://github.com/uber/jaeger-client-go/pull/99) +- Fix zap logger Infof (https://github.com/uber/jaeger-client-go/pull/100) +- Add tracer initialization godoc examples + + +2.1.1 (2017-02-21) +------------------- + +- Fix inefficient usage of zap.Logger + + +2.1.0 (2017-02-17) +------------------- + +- Add adapter for zap.Logger (https://github.com/uber-go/zap) +- Move logging API to ./log/ package + + +2.0.0 (2017-02-08) +------------------- + +- Support Adaptive Sampling +- Support 128bit Trace IDs +- Change trace/span IDs from uint64 to strong types TraceID and SpanID +- Add Zipkin HTTP B3 Propagation format support #72 +- Rip out existing metrics and use github.com/uber/jaeger-lib/metrics +- Change API for tracer, reporter, sampler initialization + + +1.6.0 (2016-10-14) +------------------- + +- Add Zipkin HTTP transport +- Support external baggage via jaeger-baggage header +- Unpin Thrift version, keep to master + + +1.5.1 (2016-09-27) +------------------- + +- Relax dependency on opentracing to ^1 + + +1.5.0 (2016-09-27) +------------------- + +- Upgrade to opentracing-go 1.0 +- Support KV logging for Spans + + +1.4.0 (2016-09-14) +------------------- + +- Support debug traces via HTTP header "jaeger-debug-id" diff --git a/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md b/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md new file mode 100644 index 00000000..41e2154c --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md @@ -0,0 +1,170 @@ +# How to Contribute to Jaeger + +We'd love your help! + +Jaeger is [Apache 2.0 licensed](LICENSE) and accepts contributions via GitHub +pull requests. This document outlines some of the conventions on development +workflow, commit message formatting, contact points and other resources to make +it easier to get your contribution accepted. + +We gratefully welcome improvements to documentation as well as to code. + +# Certificate of Origin + +By contributing to this project you agree to the [Developer Certificate of +Origin](https://developercertificate.org/) (DCO). This document was created +by the Linux Kernel community and is a simple statement that you, as a +contributor, have the legal right to make the contribution. See the [DCO](DCO) +file for details. + +## Getting Started + +This library uses [dep](https://golang.github.io/dep/) to manage dependencies. + +To get started, make sure you clone the Git repository into the correct location +`github.com/uber/jaeger-client-go` relative to `$GOPATH`: + +``` +mkdir -p $GOPATH/src/github.com/uber +cd $GOPATH/src/github.com/uber +git clone git@github.com:jaegertracing/jaeger-client-go.git jaeger-client-go +cd jaeger-client-go +git submodule update --init --recursive +``` + +Then install dependencies and run the tests: + +``` +make install +make test +``` + +## Imports grouping + +This projects follows the following pattern for grouping imports in Go files: + * imports from standard library + * imports from other projects + * imports from `jaeger-client-go` project + +For example: + +```go +import ( + "fmt" + + "github.com/uber/jaeger-lib/metrics" + "go.uber.org/zap" + + "github.com/uber/jaeger-client-go/config" +) +``` + +## Making A Change + +*Before making any significant changes, please [open an +issue](https://github.com/jaegertracing/jaeger-client-go/issues).* Discussing your proposed +changes ahead of time will make the contribution process smooth for everyone. + +Once we've discussed your changes and you've got your code ready, make sure +that tests are passing (`make test` or `make cover`) and open your PR. Your +pull request is most likely to be accepted if it: + +* Includes tests for new functionality. +* Follows the guidelines in [Effective + Go](https://golang.org/doc/effective_go.html) and the [Go team's common code + review comments](https://github.com/golang/go/wiki/CodeReviewComments). +* Has a [good commit message](https://chris.beams.io/posts/git-commit/): + * Separate subject from body with a blank line + * Limit the subject line to 50 characters + * Capitalize the subject line + * Do not end the subject line with a period + * Use the imperative mood in the subject line + * Wrap the body at 72 characters + * Use the body to explain _what_ and _why_ instead of _how_ +* Each commit must be signed by the author ([see below](#sign-your-work)). + +## License + +By contributing your code, you agree to license your contribution under the terms +of the [Apache License](LICENSE). + +If you are adding a new file it should have a header like below. The easiest +way to add such header is to run `make fmt`. + +``` +// Copyright (c) 2017 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +``` + +## Sign your work + +The sign-off is a simple line at the end of the explanation for the +patch, which certifies that you wrote it or otherwise have the right to +pass it on as an open-source patch. The rules are pretty simple: if you +can certify the below (from +[developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +then you just add a line to every git commit message: + + Signed-off-by: Joe Smith + +using your real name (sorry, no pseudonyms or anonymous contributions.) + +You can add the sign off when creating the git commit via `git commit -s`. + +If you want this to be automatic you can set up some aliases: + +``` +git config --add alias.amend "commit -s --amend" +git config --add alias.c "commit -s" +``` diff --git a/vendor/github.com/uber/jaeger-client-go/DCO b/vendor/github.com/uber/jaeger-client-go/DCO new file mode 100644 index 00000000..068953d4 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/DCO @@ -0,0 +1,37 @@ +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + diff --git a/vendor/github.com/uber/jaeger-client-go/Gopkg.lock b/vendor/github.com/uber/jaeger-client-go/Gopkg.lock new file mode 100644 index 00000000..387958b1 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/Gopkg.lock @@ -0,0 +1,401 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + digest = "1:9f3b30d9f8e0d7040f729b82dcbc8f0dead820a133b3147ce355fc451f32d761" + name = "github.com/BurntSushi/toml" + packages = ["."] + pruneopts = "UT" + revision = "3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005" + version = "v0.3.1" + +[[projects]] + digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" + name = "github.com/beorn7/perks" + packages = ["quantile"] + pruneopts = "UT" + revision = "37c8de3658fcb183f997c4e13e8337516ab753e6" + version = "v1.0.1" + +[[projects]] + branch = "master" + digest = "1:4c4c33075b704791d6a7f09dfb55c66769e8a1dc6adf87026292d274fe8ad113" + name = "github.com/codahale/hdrhistogram" + packages = ["."] + pruneopts = "UT" + revision = "3a0bb77429bd3a61596f5e8a3172445844342120" + +[[projects]] + branch = "master" + digest = "1:a382acd6150713655ded76ab5fbcbc7924a7808dab4312dda5d1f23dd8ce5277" + name = "github.com/crossdock/crossdock-go" + packages = [ + ".", + "assert", + "require", + ] + pruneopts = "UT" + revision = "049aabb0122b03bc9bd30cab8f3f91fb60166361" + +[[projects]] + digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" + name = "github.com/davecgh/go-spew" + packages = ["spew"] + pruneopts = "UT" + revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" + version = "v1.1.1" + +[[projects]] + digest = "1:7ae311278f7ccaa724de8f2cdec0a507ba3ee6dea8c77237e8157bcf64b0f28b" + name = "github.com/golang/mock" + packages = ["gomock"] + pruneopts = "UT" + revision = "3a35fb6e3e18b9dbfee291262260dee7372d2a92" + version = "v1.4.3" + +[[projects]] + digest = "1:573ca21d3669500ff845bdebee890eb7fc7f0f50c59f2132f2a0c6b03d85086a" + name = "github.com/golang/protobuf" + packages = ["proto"] + pruneopts = "UT" + revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7" + version = "v1.3.2" + +[[projects]] + digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" + name = "github.com/matttproud/golang_protobuf_extensions" + packages = ["pbutil"] + pruneopts = "UT" + revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" + version = "v1.0.1" + +[[projects]] + digest = "1:727b8f567a30d0739d6c26b9472b3422b351c93cf62095164c845a54b16fc18e" + name = "github.com/opentracing/opentracing-go" + packages = [ + ".", + "ext", + "harness", + "log", + ] + pruneopts = "UT" + revision = "659c90643e714681897ec2521c60567dd21da733" + version = "v1.1.0" + +[[projects]] + digest = "1:cf31692c14422fa27c83a05292eb5cbe0fb2775972e8f1f8446a71549bd8980b" + name = "github.com/pkg/errors" + packages = ["."] + pruneopts = "UT" + revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4" + version = "v0.8.1" + +[[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + pruneopts = "UT" + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + digest = "1:7097829edd12fd7211fca0d29496b44f94ef9e6d72f88fb64f3d7b06315818ad" + name = "github.com/prometheus/client_golang" + packages = [ + "prometheus", + "prometheus/internal", + ] + pruneopts = "UT" + revision = "170205fb58decfd011f1550d4cfb737230d7ae4f" + version = "v1.1.0" + +[[projects]] + branch = "master" + digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" + name = "github.com/prometheus/client_model" + packages = ["go"] + pruneopts = "UT" + revision = "14fe0d1b01d4d5fc031dd4bec1823bd3ebbe8016" + +[[projects]] + digest = "1:f119e3205d3a1f0f19dbd7038eb37528e2c6f0933269dc344e305951fb87d632" + name = "github.com/prometheus/common" + packages = [ + "expfmt", + "internal/bitbucket.org/ww/goautoneg", + "model", + ] + pruneopts = "UT" + revision = "287d3e634a1e550c9e463dd7e5a75a422c614505" + version = "v0.7.0" + +[[projects]] + digest = "1:a210815b437763623ecca8eb91e6a0bf4f2d6773c5a6c9aec0e28f19e5fd6deb" + name = "github.com/prometheus/procfs" + packages = [ + ".", + "internal/fs", + "internal/util", + ] + pruneopts = "UT" + revision = "499c85531f756d1129edd26485a5f73871eeb308" + version = "v0.0.5" + +[[projects]] + digest = "1:ac83cf90d08b63ad5f7e020ef480d319ae890c208f8524622a2f3136e2686b02" + name = "github.com/stretchr/objx" + packages = ["."] + pruneopts = "UT" + revision = "477a77ecc69700c7cdeb1fa9e129548e1c1c393c" + version = "v0.1.1" + +[[projects]] + digest = "1:d88ba57c4e8f5db6ce9ab6605a89f4542ee751b576884ba5271c2ba3d4b6f2d2" + name = "github.com/stretchr/testify" + packages = [ + "assert", + "mock", + "require", + "suite", + ] + pruneopts = "UT" + revision = "221dbe5ed46703ee255b1da0dec05086f5035f62" + version = "v1.4.0" + +[[projects]] + digest = "1:5b98956718573850caf7e0fd00b571a6657c4ef1f345ddf0c96b43ce355fe862" + name = "github.com/uber/jaeger-client-go" + packages = [ + ".", + "config", + "crossdock/client", + "crossdock/common", + "crossdock/endtoend", + "crossdock/log", + "crossdock/server", + "crossdock/thrift/tracetest", + "internal/baggage", + "internal/baggage/remote", + "internal/reporterstats", + "internal/spanlog", + "internal/throttler", + "internal/throttler/remote", + "log", + "log/zap/mock_opentracing", + "rpcmetrics", + "testutils", + "thrift", + "thrift-gen/agent", + "thrift-gen/baggage", + "thrift-gen/jaeger", + "thrift-gen/sampling", + "thrift-gen/zipkincore", + "transport", + "transport/zipkin", + "utils", + ] + pruneopts = "UT" + revision = "66c008c3d6ad856cac92a0af53186efbffa8e6a5" + version = "v2.24.0" + +[[projects]] + digest = "1:0ec60ffd594af00ba1660bc746aa0e443d27dd4003dee55f9d08a0b4ff5431a3" + name = "github.com/uber/jaeger-lib" + packages = [ + "metrics", + "metrics/metricstest", + "metrics/prometheus", + ] + pruneopts = "UT" + revision = "a87ae9d84fb038a8d79266298970720be7c80fcd" + version = "v2.2.0" + +[[projects]] + digest = "1:0bdcb0c740d79d400bd3f7946ac22a715c94db62b20bfd2e01cd50693aba0600" + name = "go.uber.org/atomic" + packages = ["."] + pruneopts = "UT" + revision = "9dc4df04d0d1c39369750a9f6c32c39560672089" + version = "v1.5.0" + +[[projects]] + digest = "1:002ebc50f3ef475ac325e1904be931d9dcba6dc6d73b5682afce0c63436e3902" + name = "go.uber.org/multierr" + packages = ["."] + pruneopts = "UT" + revision = "c3fc3d02ec864719d8e25be2d7dde1e35a36aa27" + version = "v1.3.0" + +[[projects]] + branch = "master" + digest = "1:3032e90a153750ea149f68bf081f97ca738f041fba45c41c80737f572ffdf2f4" + name = "go.uber.org/tools" + packages = ["update-license"] + pruneopts = "UT" + revision = "2cfd321de3ee5d5f8a5fda2521d1703478334d98" + +[[projects]] + digest = "1:98a70115729234dc73ee7bb83973cb39cb8fedf278d17df77264382bad0183ec" + name = "go.uber.org/zap" + packages = [ + ".", + "buffer", + "internal/bufferpool", + "internal/color", + "internal/exit", + "zapcore", + "zaptest/observer", + ] + pruneopts = "UT" + revision = "a6015e13fab9b744d96085308ce4e8f11bad1996" + version = "v1.12.0" + +[[projects]] + branch = "master" + digest = "1:21d7bad9b7da270fd2d50aba8971a041bd691165c95096a2a4c68db823cbc86a" + name = "golang.org/x/lint" + packages = [ + ".", + "golint", + ] + pruneopts = "UT" + revision = "16217165b5de779cb6a5e4fc81fa9c1166fda457" + +[[projects]] + branch = "master" + digest = "1:f8b491a7c25030a895a0e579742d07136e6958e77ef2d46e769db8eec4e58fcd" + name = "golang.org/x/net" + packages = [ + "context", + "context/ctxhttp", + ] + pruneopts = "UT" + revision = "0deb6923b6d97481cb43bc1043fe5b72a0143032" + +[[projects]] + branch = "master" + digest = "1:5dfb17d45415b7b8927382f53955a66f55f9d9d11557aa82f7f481d642ab247a" + name = "golang.org/x/sys" + packages = ["windows"] + pruneopts = "UT" + revision = "f43be2a4598cf3a47be9f94f0c28197ed9eae611" + +[[projects]] + branch = "master" + digest = "1:bae8b3bf837d9d7f601776f37f44e031d46943677beff8fb2eb9c7317d44de2f" + name = "golang.org/x/tools" + packages = [ + "go/analysis", + "go/analysis/passes/inspect", + "go/ast/astutil", + "go/ast/inspector", + "go/buildutil", + "go/gcexportdata", + "go/internal/gcimporter", + "go/internal/packagesdriver", + "go/packages", + "go/types/objectpath", + "go/types/typeutil", + "internal/fastwalk", + "internal/gopathwalk", + "internal/semver", + "internal/span", + ] + pruneopts = "UT" + revision = "8dbcdeb83d3faec5315146800b375c4962a42fc6" + +[[projects]] + digest = "1:59f10c1537d2199d9115d946927fe31165959a95190849c82ff11e05803528b0" + name = "gopkg.in/yaml.v2" + packages = ["."] + pruneopts = "UT" + revision = "f221b8435cfb71e54062f6c6e99e9ade30b124d5" + version = "v2.2.4" + +[[projects]] + digest = "1:131158a88aad1f94854d0aa21a64af2802d0a470fb0f01cb33c04fafd2047111" + name = "honnef.co/go/tools" + packages = [ + "arg", + "cmd/staticcheck", + "config", + "deprecated", + "facts", + "functions", + "go/types/typeutil", + "internal/cache", + "internal/passes/buildssa", + "internal/renameio", + "internal/sharedcheck", + "lint", + "lint/lintdsl", + "lint/lintutil", + "lint/lintutil/format", + "loader", + "printf", + "simple", + "ssa", + "ssautil", + "staticcheck", + "staticcheck/vrp", + "stylecheck", + "unused", + "version", + ] + pruneopts = "UT" + revision = "afd67930eec2a9ed3e9b19f684d17a062285f16a" + version = "2019.2.3" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [ + "github.com/crossdock/crossdock-go", + "github.com/golang/mock/gomock", + "github.com/opentracing/opentracing-go", + "github.com/opentracing/opentracing-go/ext", + "github.com/opentracing/opentracing-go/harness", + "github.com/opentracing/opentracing-go/log", + "github.com/pkg/errors", + "github.com/prometheus/client_golang/prometheus", + "github.com/stretchr/testify/assert", + "github.com/stretchr/testify/mock", + "github.com/stretchr/testify/require", + "github.com/stretchr/testify/suite", + "github.com/uber/jaeger-client-go", + "github.com/uber/jaeger-client-go/config", + "github.com/uber/jaeger-client-go/crossdock/client", + "github.com/uber/jaeger-client-go/crossdock/common", + "github.com/uber/jaeger-client-go/crossdock/endtoend", + "github.com/uber/jaeger-client-go/crossdock/log", + "github.com/uber/jaeger-client-go/crossdock/server", + "github.com/uber/jaeger-client-go/crossdock/thrift/tracetest", + "github.com/uber/jaeger-client-go/internal/baggage", + "github.com/uber/jaeger-client-go/internal/baggage/remote", + "github.com/uber/jaeger-client-go/internal/reporterstats", + "github.com/uber/jaeger-client-go/internal/spanlog", + "github.com/uber/jaeger-client-go/internal/throttler", + "github.com/uber/jaeger-client-go/internal/throttler/remote", + "github.com/uber/jaeger-client-go/log", + "github.com/uber/jaeger-client-go/log/zap/mock_opentracing", + "github.com/uber/jaeger-client-go/rpcmetrics", + "github.com/uber/jaeger-client-go/testutils", + "github.com/uber/jaeger-client-go/thrift", + "github.com/uber/jaeger-client-go/thrift-gen/agent", + "github.com/uber/jaeger-client-go/thrift-gen/baggage", + "github.com/uber/jaeger-client-go/thrift-gen/jaeger", + "github.com/uber/jaeger-client-go/thrift-gen/sampling", + "github.com/uber/jaeger-client-go/thrift-gen/zipkincore", + "github.com/uber/jaeger-client-go/transport", + "github.com/uber/jaeger-client-go/transport/zipkin", + "github.com/uber/jaeger-client-go/utils", + "github.com/uber/jaeger-lib/metrics", + "github.com/uber/jaeger-lib/metrics/metricstest", + "github.com/uber/jaeger-lib/metrics/prometheus", + "go.uber.org/atomic", + "go.uber.org/zap", + "go.uber.org/zap/zapcore", + "go.uber.org/zap/zaptest/observer", + ] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/uber/jaeger-client-go/Gopkg.toml b/vendor/github.com/uber/jaeger-client-go/Gopkg.toml new file mode 100644 index 00000000..1fed7f81 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/Gopkg.toml @@ -0,0 +1,31 @@ +[[constraint]] + name = "github.com/crossdock/crossdock-go" + branch = "master" + +[[constraint]] + name = "github.com/opentracing/opentracing-go" + version = "^1.1" + +[[constraint]] + name = "github.com/prometheus/client_golang" + version = "^1" + +[[constraint]] + name = "github.com/stretchr/testify" + version = "^1.1.3" + +[[constraint]] + name = "go.uber.org/atomic" + version = "^1" + +[[constraint]] + name = "github.com/uber/jaeger-lib" + version = "^2.2" + +[[constraint]] + name = "go.uber.org/zap" + version = "^1" + +[prune] + go-tests = true + unused-packages = true diff --git a/vendor/github.com/uber/jaeger-client-go/LICENSE b/vendor/github.com/uber/jaeger-client-go/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/uber/jaeger-client-go/Makefile b/vendor/github.com/uber/jaeger-client-go/Makefile new file mode 100644 index 00000000..d5e962cc --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/Makefile @@ -0,0 +1,134 @@ +PROJECT_ROOT=github.com/uber/jaeger-client-go +PACKAGES := . $(shell go list ./... | awk -F/ 'NR>1 {print "./"$$4"/..."}' | grep -v -e ./thrift-gen/... -e ./thrift/... | sort -u) +# all .go files that don't exist in hidden directories +ALL_SRC := $(shell find . -name "*.go" | grep -v -e vendor -e thrift-gen -e ./thrift/ \ + -e ".*/\..*" \ + -e ".*/_.*" \ + -e ".*/mocks.*") + +USE_DEP := true + +-include crossdock/rules.mk + +RACE=-race +GOTEST=go test -v $(RACE) +GOLINT=golint +GOVET=go vet +GOFMT=gofmt +FMT_LOG=fmt.log +LINT_LOG=lint.log + +THRIFT_VER=0.9.3 +THRIFT_IMG=thrift:$(THRIFT_VER) +THRIFT=docker run -v "${PWD}:/data" $(THRIFT_IMG) thrift +THRIFT_GO_ARGS=thrift_import="github.com/apache/thrift/lib/go/thrift" +THRIFT_GEN_DIR=thrift-gen + +PASS=$(shell printf "\033[32mPASS\033[0m") +FAIL=$(shell printf "\033[31mFAIL\033[0m") +COLORIZE=sed ''/PASS/s//$(PASS)/'' | sed ''/FAIL/s//$(FAIL)/'' + +.DEFAULT_GOAL := test-and-lint + +.PHONY: test-and-lint +test-and-lint: test fmt lint + +.PHONY: test +test: +ifeq ($(USE_DEP),true) + dep check +endif + bash -c "set -e; set -o pipefail; $(GOTEST) $(PACKAGES) | $(COLORIZE)" + +.PHONY: fmt +fmt: + $(GOFMT) -e -s -l -w $(ALL_SRC) + ./scripts/updateLicenses.sh + +.PHONY: lint +lint: + $(GOVET) $(PACKAGES) + @cat /dev/null > $(LINT_LOG) + @$(foreach pkg, $(PACKAGES), $(GOLINT) $(pkg) | grep -v crossdock/thrift >> $(LINT_LOG) || true;) + @[ ! -s "$(LINT_LOG)" ] || (echo "Lint Failures" | cat - $(LINT_LOG) && false) + @$(GOFMT) -e -s -l $(ALL_SRC) > $(FMT_LOG) + ./scripts/updateLicenses.sh >> $(FMT_LOG) + @[ ! -s "$(FMT_LOG)" ] || (echo "go fmt or license check failures, run 'make fmt'" | cat - $(FMT_LOG) && false) + + +.PHONY: install +install: + @echo install: USE_DEP=$(USE_DEP) USE_GLIDE=$(USE_GLIDE) +ifeq ($(USE_DEP),true) + dep version || make install-dep + dep ensure +endif +ifeq ($(USE_GLIDE),true) + glide --version || go get github.com/Masterminds/glide + glide install +endif + + +.PHONY: cover +cover: + $(GOTEST) -cover -coverprofile cover.out $(PACKAGES) + +.PHONY: cover-html +cover-html: cover + go tool cover -html=cover.out -o cover.html + +# This is not part of the regular test target because we don't want to slow it +# down. +.PHONY: test-examples +test-examples: + make -C examples + +.PHONY: thrift +thrift: idl-submodule thrift-compile + +# TODO at the moment we're not generating tchan_*.go files +.PHONY: thrift-compile +thrift-compile: thrift-image + $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/agent.thrift + $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/sampling.thrift + $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/jaeger.thrift + $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/zipkincore.thrift + $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/baggage.thrift + $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/crossdock/thrift/ /data/idl/thrift/crossdock/tracetest.thrift + sed -i '' 's|"zipkincore"|"$(PROJECT_ROOT)/thrift-gen/zipkincore"|g' $(THRIFT_GEN_DIR)/agent/*.go + sed -i '' 's|"jaeger"|"$(PROJECT_ROOT)/thrift-gen/jaeger"|g' $(THRIFT_GEN_DIR)/agent/*.go + sed -i '' 's|"github.com/apache/thrift/lib/go/thrift"|"github.com/uber/jaeger-client-go/thrift"|g' \ + $(THRIFT_GEN_DIR)/*/*.go crossdock/thrift/tracetest/*.go + rm -rf thrift-gen/*/*-remote + rm -rf crossdock/thrift/*/*-remote + rm -rf thrift-gen/jaeger/collector.go + +.PHONY: idl-submodule +idl-submodule: + git submodule init + git submodule update + +.PHONY: thrift-image +thrift-image: + $(THRIFT) -version + +.PHONY: install-dep +install-dep: + - curl -L -s https://github.com/golang/dep/releases/download/v0.5.0/dep-linux-amd64 -o $$GOPATH/bin/dep + - chmod +x $$GOPATH/bin/dep + +.PHONY: install-ci +install-ci: install + go get github.com/wadey/gocovmerge + go get github.com/mattn/goveralls + go get golang.org/x/tools/cmd/cover + go get golang.org/x/lint/golint + +.PHONY: test-ci +test-ci: cover +ifeq ($(CI_SKIP_LINT),true) + echo 'skipping lint' +else + make lint +endif + diff --git a/vendor/github.com/uber/jaeger-client-go/README.md b/vendor/github.com/uber/jaeger-client-go/README.md new file mode 100644 index 00000000..687f5780 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/README.md @@ -0,0 +1,324 @@ +[![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![OpenTracing 1.0 Enabled][ot-img]][ot-url] + +# Jaeger Bindings for Go OpenTracing API + +Instrumentation library that implements an +[OpenTracing Go](https://github.com/opentracing/opentracing-go) Tracer for Jaeger (https://jaegertracing.io). + +**IMPORTANT**: The library's import path is based on its original location under `github.com/uber`. Do not try to import it as `github.com/jaegertracing`, it will not compile. We might revisit this in the next major release. + * :white_check_mark: `import "github.com/uber/jaeger-client-go"` + * :x: `import "github.com/jaegertracing/jaeger-client-go"` + +## How to Contribute + +Please see [CONTRIBUTING.md](CONTRIBUTING.md). + +## Installation + +We recommended using a dependency manager like [dep](https://golang.github.io/dep/) +and [semantic versioning](http://semver.org/) when including this library into an application. +For example, Jaeger backend imports this library like this: + +```toml +[[constraint]] + name = "github.com/uber/jaeger-client-go" + version = "2.17" +``` + +If you instead want to use the latest version in `master`, you can pull it via `go get`. +Note that during `go get` you may see build errors due to incompatible dependencies, which is why +we recommend using semantic versions for dependencies. The error may be fixed by running +`make install` (it will install `dep` if you don't have it): + +```shell +go get -u github.com/uber/jaeger-client-go/ +cd $GOPATH/src/github.com/uber/jaeger-client-go/ +git submodule update --init --recursive +make install +``` + +## Initialization + +See tracer initialization examples in [godoc](https://godoc.org/github.com/uber/jaeger-client-go/config#pkg-examples) +and [config/example_test.go](./config/example_test.go). + +### Environment variables + +The tracer can be initialized with values coming from environment variables, if it is +[built from a config](https://pkg.go.dev/github.com/uber/jaeger-client-go/config?tab=doc#Configuration.NewTracer) +that was created via [FromEnv()](https://pkg.go.dev/github.com/uber/jaeger-client-go/config?tab=doc#FromEnv). +None of the env vars are required and all of them can be overridden via direct setting +of the property on the configuration object. + +Property| Description +--- | --- +JAEGER_SERVICE_NAME | The service name. +JAEGER_AGENT_HOST | The hostname for communicating with agent via UDP (default `localhost`). +JAEGER_AGENT_PORT | The port for communicating with agent via UDP (default `6831`). +JAEGER_ENDPOINT | The HTTP endpoint for sending spans directly to a collector, i.e. http://jaeger-collector:14268/api/traces. If specified, the agent host/port are ignored. +JAEGER_USER | Username to send as part of "Basic" authentication to the collector endpoint. +JAEGER_PASSWORD | Password to send as part of "Basic" authentication to the collector endpoint. +JAEGER_REPORTER_LOG_SPANS | Whether the reporter should also log the spans" `true` or `false` (default `false`). +JAEGER_REPORTER_MAX_QUEUE_SIZE | The reporter's maximum queue size (default `100`). +JAEGER_REPORTER_FLUSH_INTERVAL | The reporter's flush interval, with units, e.g. `500ms` or `2s` ([valid units][timeunits]; default `1s`). +JAEGER_REPORTER_ATTEMPT_RECONNECTING_DISABLED | When true, disables udp connection helper that periodically re-resolves the agent's hostname and reconnects if there was a change (default `false`). +JAEGER_REPORTER_ATTEMPT_RECONNECT_INTERVAL | Controls how often the agent client re-resolves the provided hostname in order to detect address changes ([valid units][timeunits]; default `30s`). +JAEGER_SAMPLER_TYPE | The sampler type: `remote`, `const`, `probabilistic`, `ratelimiting` (default `remote`). See also https://www.jaegertracing.io/docs/latest/sampling/. +JAEGER_SAMPLER_PARAM | The sampler parameter (number). +JAEGER_SAMPLER_MANAGER_HOST_PORT | (deprecated) The HTTP endpoint when using the `remote` sampler. +JAEGER_SAMPLING_ENDPOINT | The URL for the sampling configuration server when using sampler type `remote` (default `http://127.0.0.1:5778/sampling`). +JAEGER_SAMPLER_MAX_OPERATIONS | The maximum number of operations that the sampler will keep track of (default `2000`). +JAEGER_SAMPLER_REFRESH_INTERVAL | How often the `remote` sampler should poll the configuration server for the appropriate sampling strategy, e.g. "1m" or "30s" ([valid units][timeunits]; default `1m`). +JAEGER_TAGS | A comma separated list of `name=value` tracer-level tags, which get added to all reported spans. The value can also refer to an environment variable using the format `${envVarName:defaultValue}`. +JAEGER_DISABLED | Whether the tracer is disabled or not. If `true`, the `opentracing.NoopTracer` is used (default `false`). +JAEGER_RPC_METRICS | Whether to store RPC metrics, `true` or `false` (default `false`). + +By default, the client sends traces via UDP to the agent at `localhost:6831`. Use `JAEGER_AGENT_HOST` and +`JAEGER_AGENT_PORT` to send UDP traces to a different `host:port`. If `JAEGER_ENDPOINT` is set, the client sends traces +to the endpoint via `HTTP`, making the `JAEGER_AGENT_HOST` and `JAEGER_AGENT_PORT` unused. If `JAEGER_ENDPOINT` is +secured, HTTP basic authentication can be performed by setting the `JAEGER_USER` and `JAEGER_PASSWORD` environment +variables. + +### Closing the tracer via `io.Closer` + +The constructor function for Jaeger Tracer returns the tracer itself and an `io.Closer` instance. +It is recommended to structure your `main()` so that it calls the `Close()` function on the closer +before exiting, e.g. + +```go +tracer, closer, err := cfg.NewTracer(...) +defer closer.Close() +``` + +This is especially useful for command-line tools that enable tracing, as well as +for the long-running apps that support graceful shutdown. For example, if your deployment +system sends SIGTERM instead of killing the process and you trap that signal to do a graceful +exit, then having `defer closer.Close()` ensures that all buffered spans are flushed. + +### Metrics & Monitoring + +The tracer emits a number of different metrics, defined in +[metrics.go](metrics.go). The monitoring backend is expected to support +tag-based metric names, e.g. instead of `statsd`-style string names +like `counters.my-service.jaeger.spans.started.sampled`, the metrics +are defined by a short name and a collection of key/value tags, for +example: `name:jaeger.traces, state:started, sampled:y`. See [metrics.go](./metrics.go) +file for the full list and descriptions of emitted metrics. + +The monitoring backend is represented by the `metrics.Factory` interface from package +[`"github.com/uber/jaeger-lib/metrics"`](https://github.com/jaegertracing/jaeger-lib/tree/master/metrics). An implementation +of that interface can be passed as an option to either the Configuration object or the Tracer +constructor, for example: + +```go +import ( + "github.com/uber/jaeger-client-go/config" + "github.com/uber/jaeger-lib/metrics/prometheus" +) + + metricsFactory := prometheus.New() + tracer, closer, err := config.Configuration{ + ServiceName: "your-service-name", + }.NewTracer( + config.Metrics(metricsFactory), + ) +``` + +By default, a no-op `metrics.NullFactory` is used. + +### Logging + +The tracer can be configured with an optional logger, which will be +used to log communication errors, or log spans if a logging reporter +option is specified in the configuration. The logging API is abstracted +by the [Logger](logger.go) interface. A logger instance implementing +this interface can be set on the `Config` object before calling the +`New` method. + +Besides the [zap](https://github.com/uber-go/zap) implementation +bundled with this package there is also a [go-kit](https://github.com/go-kit/kit) +one in the [jaeger-lib](https://github.com/jaegertracing/jaeger-lib) repository. + +## Instrumentation for Tracing + +Since this tracer is fully compliant with OpenTracing API 1.0, +all code instrumentation should only use the API itself, as described +in the [opentracing-go](https://github.com/opentracing/opentracing-go) documentation. + +## Features + +### Reporters + +A "reporter" is a component that receives the finished spans and reports +them to somewhere. Under normal circumstances, the Tracer +should use the default `RemoteReporter`, which sends the spans out of +process via configurable "transport". For testing purposes, one can +use an `InMemoryReporter` that accumulates spans in a buffer and +allows to retrieve them for later verification. Also available are +`NullReporter`, a no-op reporter that does nothing, a `LoggingReporter` +which logs all finished spans using their `String()` method, and a +`CompositeReporter` that can be used to combine more than one reporter +into one, e.g. to attach a logging reporter to the main remote reporter. + +### Span Reporting Transports + +The remote reporter uses "transports" to actually send the spans out +of process. Currently the supported transports include: + * [Jaeger Thrift](https://github.com/jaegertracing/jaeger-idl/blob/master/thrift/agent.thrift) over UDP or HTTP, + * [Zipkin Thrift](https://github.com/jaegertracing/jaeger-idl/blob/master/thrift/zipkincore.thrift) over HTTP. + +### Sampling + +The tracer does not record all spans, but only those that have the +sampling bit set in the `flags`. When a new trace is started and a new +unique ID is generated, a sampling decision is made whether this trace +should be sampled. The sampling decision is propagated to all downstream +calls via the `flags` field of the trace context. The following samplers +are available: + 1. `RemotelyControlledSampler` uses one of the other simpler samplers + and periodically updates it by polling an external server. This + allows dynamic control of the sampling strategies. + 1. `ConstSampler` always makes the same sampling decision for all + trace IDs. it can be configured to either sample all traces, or + to sample none. + 1. `ProbabilisticSampler` uses a fixed sampling rate as a probability + for a given trace to be sampled. The actual decision is made by + comparing the trace ID with a random number multiplied by the + sampling rate. + 1. `RateLimitingSampler` can be used to allow only a certain fixed + number of traces to be sampled per second. + +#### Delayed sampling + +Version 2.20 introduced the ability to delay sampling decisions in the life cycle +of the root span. It involves several features and architectural changes: + * **Shared sampling state**: the sampling state is shared across all local + (i.e. in-process) spans for a given trace. + * **New `SamplerV2` API** allows the sampler to be called at multiple points + in the life cycle of a span: + * on span creation + * on overwriting span operation name + * on setting span tags + * on finishing the span + * **Final/non-final sampling state**: the new `SamplerV2` API allows the sampler + to indicate if the negative sampling decision is final or not (positive sampling + decisions are always final). If the decision is not final, the sampler will be + called again on further span life cycle events, like setting tags. + +These new features are used in the experimental `x.TagMatchingSampler`, which +can sample a trace based on a certain tag added to the root +span or one of its local (in-process) children. The sampler can be used with +another experimental `x.PrioritySampler` that allows multiple samplers to try +to make a sampling decision, in a certain priority order. + +### Baggage Injection + +The OpenTracing spec allows for [baggage][baggage], which are key value pairs that are added +to the span context and propagated throughout the trace. An external process can inject baggage +by setting the special HTTP Header `jaeger-baggage` on a request: + +```sh +curl -H "jaeger-baggage: key1=value1, key2=value2" http://myhost.com +``` + +Baggage can also be programatically set inside your service: + +```go +if span := opentracing.SpanFromContext(ctx); span != nil { + span.SetBaggageItem("key", "value") +} +``` + +Another service downstream of that can retrieve the baggage in a similar way: + +```go +if span := opentracing.SpanFromContext(ctx); span != nil { + val := span.BaggageItem("key") + println(val) +} +``` + +### Debug Traces (Forced Sampling) + +#### Programmatically + +The OpenTracing API defines a `sampling.priority` standard tag that +can be used to affect the sampling of a span and its children: + +```go +import ( + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" +) + +span := opentracing.SpanFromContext(ctx) +ext.SamplingPriority.Set(span, 1) +``` + +#### Via HTTP Headers + +Jaeger Tracer also understands a special HTTP Header `jaeger-debug-id`, +which can be set in the incoming request, e.g. + +```sh +curl -H "jaeger-debug-id: some-correlation-id" http://myhost.com +``` + +When Jaeger sees this header in the request that otherwise has no +tracing context, it ensures that the new trace started for this +request will be sampled in the "debug" mode (meaning it should survive +all downsampling that might happen in the collection pipeline), and the +root span will have a tag as if this statement was executed: + +```go +span.SetTag("jaeger-debug-id", "some-correlation-id") +``` + +This allows using Jaeger UI to find the trace by this tag. + +### Zipkin HTTP B3 compatible header propagation + +Jaeger Tracer supports Zipkin B3 Propagation HTTP headers, which are used +by a lot of Zipkin tracers. This means that you can use Jaeger in conjunction with e.g. [these OpenZipkin tracers](https://github.com/openzipkin). + +However it is not the default propagation format, see [here](zipkin/README.md#NewZipkinB3HTTPHeaderPropagator) how to set it up. + +## SelfRef + +Jaeger Tracer supports an additional [span reference][] type call `Self`, which was proposed +to the OpenTracing Specification (https://github.com/opentracing/specification/issues/81) +but not yet accepted. This allows the caller to provide an already created `SpanContext` +when starting a new span. The `Self` reference bypasses trace and span id generation, +as well as sampling decisions (i.e. the sampling bit in the `SpanContext.flags` must be +set appropriately by the caller). + +The `Self` reference supports the following use cases: + * the ability to provide externally generated trace and span IDs + * appending data to the same span from different processes, such as loading and continuing spans/traces from offline (ie log-based) storage + +Usage requires passing in a `SpanContext` and the `jaeger.Self` reference type: +``` +span := tracer.StartSpan( + "continued_span", + jaeger.SelfRef(yourSpanContext), +) +... +defer span.Finish() +``` + +## License + +[Apache 2.0 License](LICENSE). + + +[doc-img]: https://godoc.org/github.com/uber/jaeger-client-go?status.svg +[doc]: https://godoc.org/github.com/uber/jaeger-client-go +[ci-img]: https://travis-ci.org/jaegertracing/jaeger-client-go.svg?branch=master +[ci]: https://travis-ci.org/jaegertracing/jaeger-client-go +[cov-img]: https://codecov.io/gh/jaegertracing/jaeger-client-go/branch/master/graph/badge.svg +[cov]: https://codecov.io/gh/jaegertracing/jaeger-client-go +[ot-img]: https://img.shields.io/badge/OpenTracing--1.0-enabled-blue.svg +[ot-url]: http://opentracing.io +[baggage]: https://github.com/opentracing/specification/blob/master/specification.md#set-a-baggage-item +[timeunits]: https://golang.org/pkg/time/#ParseDuration +[span reference]: https://github.com/opentracing/specification/blob/1.1/specification.md#references-between-spans diff --git a/vendor/github.com/uber/jaeger-client-go/RELEASE.md b/vendor/github.com/uber/jaeger-client-go/RELEASE.md new file mode 100644 index 00000000..12438d84 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/RELEASE.md @@ -0,0 +1,12 @@ +# Release Process + +1. Create a PR "Preparing for release X.Y.Z" against master branch + * Alter CHANGELOG.md from ` (unreleased)` to ` (YYYY-MM-DD)` + * Use `git log --pretty=format:'- %s -- %an'` as the basis for for changelog entries + * Update `JaegerClientVersion` in constants.go to `Go-X.Y.Z` +2. Create a release "Release X.Y.Z" on Github + * Create Tag `vX.Y.Z` + * Copy CHANGELOG.md into the release notes +3. Create a PR "Back to development" against master branch + * Add ` (unreleased)` to CHANGELOG.md + * Update `JaegerClientVersion` in constants.go to `Go-dev` diff --git a/vendor/github.com/uber/jaeger-client-go/baggage_setter.go b/vendor/github.com/uber/jaeger-client-go/baggage_setter.go new file mode 100644 index 00000000..1037ca0e --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/baggage_setter.go @@ -0,0 +1,77 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "github.com/opentracing/opentracing-go/log" + + "github.com/uber/jaeger-client-go/internal/baggage" +) + +// baggageSetter is an actor that can set a baggage value on a Span given certain +// restrictions (eg. maxValueLength). +type baggageSetter struct { + restrictionManager baggage.RestrictionManager + metrics *Metrics +} + +func newBaggageSetter(restrictionManager baggage.RestrictionManager, metrics *Metrics) *baggageSetter { + return &baggageSetter{ + restrictionManager: restrictionManager, + metrics: metrics, + } +} + +// (NB) span should hold the lock before making this call +func (s *baggageSetter) setBaggage(span *Span, key, value string) { + var truncated bool + var prevItem string + restriction := s.restrictionManager.GetRestriction(span.serviceName(), key) + if !restriction.KeyAllowed() { + s.logFields(span, key, value, prevItem, truncated, restriction.KeyAllowed()) + s.metrics.BaggageUpdateFailure.Inc(1) + return + } + if len(value) > restriction.MaxValueLength() { + truncated = true + value = value[:restriction.MaxValueLength()] + s.metrics.BaggageTruncate.Inc(1) + } + prevItem = span.context.baggage[key] + s.logFields(span, key, value, prevItem, truncated, restriction.KeyAllowed()) + span.context = span.context.WithBaggageItem(key, value) + s.metrics.BaggageUpdateSuccess.Inc(1) +} + +func (s *baggageSetter) logFields(span *Span, key, value, prevItem string, truncated, valid bool) { + if !span.context.IsSampled() { + return + } + fields := []log.Field{ + log.String("event", "baggage"), + log.String("key", key), + log.String("value", value), + } + if prevItem != "" { + fields = append(fields, log.String("override", "true")) + } + if truncated { + fields = append(fields, log.String("truncated", "true")) + } + if !valid { + fields = append(fields, log.String("invalid", "true")) + } + span.logFieldsNoLocking(fields...) +} diff --git a/vendor/github.com/uber/jaeger-client-go/config/config.go b/vendor/github.com/uber/jaeger-client-go/config/config.go new file mode 100644 index 00000000..bb122829 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/config/config.go @@ -0,0 +1,434 @@ +// Copyright (c) 2017-2018 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "errors" + "fmt" + "io" + "strings" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/uber/jaeger-client-go/utils" + + "github.com/uber/jaeger-client-go" + "github.com/uber/jaeger-client-go/internal/baggage/remote" + throttler "github.com/uber/jaeger-client-go/internal/throttler/remote" + "github.com/uber/jaeger-client-go/rpcmetrics" + "github.com/uber/jaeger-client-go/transport" + "github.com/uber/jaeger-lib/metrics" +) + +const defaultSamplingProbability = 0.001 + +// Configuration configures and creates Jaeger Tracer +type Configuration struct { + // ServiceName specifies the service name to use on the tracer. + // Can be provided by FromEnv() via the environment variable named JAEGER_SERVICE_NAME + ServiceName string `yaml:"serviceName"` + + // Disabled can be provided by FromEnv() via the environment variable named JAEGER_DISABLED + Disabled bool `yaml:"disabled"` + + // RPCMetrics can be provided by FromEnv() via the environment variable named JAEGER_RPC_METRICS + RPCMetrics bool `yaml:"rpc_metrics"` + + // Tags can be provided by FromEnv() via the environment variable named JAEGER_TAGS + Tags []opentracing.Tag `yaml:"tags"` + + Sampler *SamplerConfig `yaml:"sampler"` + Reporter *ReporterConfig `yaml:"reporter"` + Headers *jaeger.HeadersConfig `yaml:"headers"` + BaggageRestrictions *BaggageRestrictionsConfig `yaml:"baggage_restrictions"` + Throttler *ThrottlerConfig `yaml:"throttler"` +} + +// SamplerConfig allows initializing a non-default sampler. All fields are optional. +type SamplerConfig struct { + // Type specifies the type of the sampler: const, probabilistic, rateLimiting, or remote. + // Can be provided by FromEnv() via the environment variable named JAEGER_SAMPLER_TYPE + Type string `yaml:"type"` + + // Param is a value passed to the sampler. + // Valid values for Param field are: + // - for "const" sampler, 0 or 1 for always false/true respectively + // - for "probabilistic" sampler, a probability between 0 and 1 + // - for "rateLimiting" sampler, the number of spans per second + // - for "remote" sampler, param is the same as for "probabilistic" + // and indicates the initial sampling rate before the actual one + // is received from the mothership. + // Can be provided by FromEnv() via the environment variable named JAEGER_SAMPLER_PARAM + Param float64 `yaml:"param"` + + // SamplingServerURL is the URL of sampling manager that can provide + // sampling strategy to this service. + // Can be provided by FromEnv() via the environment variable named JAEGER_SAMPLING_ENDPOINT + SamplingServerURL string `yaml:"samplingServerURL"` + + // SamplingRefreshInterval controls how often the remotely controlled sampler will poll + // sampling manager for the appropriate sampling strategy. + // Can be provided by FromEnv() via the environment variable named JAEGER_SAMPLER_REFRESH_INTERVAL + SamplingRefreshInterval time.Duration `yaml:"samplingRefreshInterval"` + + // MaxOperations is the maximum number of operations that the PerOperationSampler + // will keep track of. If an operation is not tracked, a default probabilistic + // sampler will be used rather than the per operation specific sampler. + // Can be provided by FromEnv() via the environment variable named JAEGER_SAMPLER_MAX_OPERATIONS. + MaxOperations int `yaml:"maxOperations"` + + // Opt-in feature for applications that require late binding of span name via explicit + // call to SetOperationName when using PerOperationSampler. When this feature is enabled, + // the sampler will return retryable=true from OnCreateSpan(), thus leaving the sampling + // decision as non-final (and the span as writeable). This may lead to degraded performance + // in applications that always provide the correct span name on trace creation. + // + // For backwards compatibility this option is off by default. + OperationNameLateBinding bool `yaml:"operationNameLateBinding"` + + // Options can be used to programmatically pass additional options to the Remote sampler. + Options []jaeger.SamplerOption +} + +// ReporterConfig configures the reporter. All fields are optional. +type ReporterConfig struct { + // QueueSize controls how many spans the reporter can keep in memory before it starts dropping + // new spans. The queue is continuously drained by a background go-routine, as fast as spans + // can be sent out of process. + // Can be provided by FromEnv() via the environment variable named JAEGER_REPORTER_MAX_QUEUE_SIZE + QueueSize int `yaml:"queueSize"` + + // BufferFlushInterval controls how often the buffer is force-flushed, even if it's not full. + // It is generally not useful, as it only matters for very low traffic services. + // Can be provided by FromEnv() via the environment variable named JAEGER_REPORTER_FLUSH_INTERVAL + BufferFlushInterval time.Duration + + // LogSpans, when true, enables LoggingReporter that runs in parallel with the main reporter + // and logs all submitted spans. Main Configuration.Logger must be initialized in the code + // for this option to have any effect. + // Can be provided by FromEnv() via the environment variable named JAEGER_REPORTER_LOG_SPANS + LogSpans bool `yaml:"logSpans"` + + // LocalAgentHostPort instructs reporter to send spans to jaeger-agent at this address. + // Can be provided by FromEnv() via the environment variable named JAEGER_AGENT_HOST / JAEGER_AGENT_PORT + LocalAgentHostPort string `yaml:"localAgentHostPort"` + + // DisableAttemptReconnecting when true, disables udp connection helper that periodically re-resolves + // the agent's hostname and reconnects if there was a change. This option only + // applies if LocalAgentHostPort is specified. + // Can be provided by FromEnv() via the environment variable named JAEGER_REPORTER_ATTEMPT_RECONNECTING_DISABLED + DisableAttemptReconnecting bool `yaml:"disableAttemptReconnecting"` + + // AttemptReconnectInterval controls how often the agent client re-resolves the provided hostname + // in order to detect address changes. This option only applies if DisableAttemptReconnecting is false. + // Can be provided by FromEnv() via the environment variable named JAEGER_REPORTER_ATTEMPT_RECONNECT_INTERVAL + AttemptReconnectInterval time.Duration + + // CollectorEndpoint instructs reporter to send spans to jaeger-collector at this URL. + // Can be provided by FromEnv() via the environment variable named JAEGER_ENDPOINT + CollectorEndpoint string `yaml:"collectorEndpoint"` + + // User instructs reporter to include a user for basic http authentication when sending spans to jaeger-collector. + // Can be provided by FromEnv() via the environment variable named JAEGER_USER + User string `yaml:"user"` + + // Password instructs reporter to include a password for basic http authentication when sending spans to + // jaeger-collector. + // Can be provided by FromEnv() via the environment variable named JAEGER_PASSWORD + Password string `yaml:"password"` + + // HTTPHeaders instructs the reporter to add these headers to the http request when reporting spans. + // This field takes effect only when using HTTPTransport by setting the CollectorEndpoint. + HTTPHeaders map[string]string `yaml:"http_headers"` +} + +// BaggageRestrictionsConfig configures the baggage restrictions manager which can be used to whitelist +// certain baggage keys. All fields are optional. +type BaggageRestrictionsConfig struct { + // DenyBaggageOnInitializationFailure controls the startup failure mode of the baggage restriction + // manager. If true, the manager will not allow any baggage to be written until baggage restrictions have + // been retrieved from jaeger-agent. If false, the manager wil allow any baggage to be written until baggage + // restrictions have been retrieved from jaeger-agent. + DenyBaggageOnInitializationFailure bool `yaml:"denyBaggageOnInitializationFailure"` + + // HostPort is the hostPort of jaeger-agent's baggage restrictions server + HostPort string `yaml:"hostPort"` + + // RefreshInterval controls how often the baggage restriction manager will poll + // jaeger-agent for the most recent baggage restrictions. + RefreshInterval time.Duration `yaml:"refreshInterval"` +} + +// ThrottlerConfig configures the throttler which can be used to throttle the +// rate at which the client may send debug requests. +type ThrottlerConfig struct { + // HostPort of jaeger-agent's credit server. + HostPort string `yaml:"hostPort"` + + // RefreshInterval controls how often the throttler will poll jaeger-agent + // for more throttling credits. + RefreshInterval time.Duration `yaml:"refreshInterval"` + + // SynchronousInitialization determines whether or not the throttler should + // synchronously fetch credits from the agent when an operation is seen for + // the first time. This should be set to true if the client will be used by + // a short lived service that needs to ensure that credits are fetched + // upfront such that sampling or throttling occurs. + SynchronousInitialization bool `yaml:"synchronousInitialization"` +} + +type nullCloser struct{} + +func (*nullCloser) Close() error { return nil } + +// New creates a new Jaeger Tracer, and a closer func that can be used to flush buffers +// before shutdown. +// +// Deprecated: use NewTracer() function +func (c Configuration) New( + serviceName string, + options ...Option, +) (opentracing.Tracer, io.Closer, error) { + if serviceName != "" { + c.ServiceName = serviceName + } + + return c.NewTracer(options...) +} + +// NewTracer returns a new tracer based on the current configuration, using the given options, +// and a closer func that can be used to flush buffers before shutdown. +func (c Configuration) NewTracer(options ...Option) (opentracing.Tracer, io.Closer, error) { + if c.Disabled { + return &opentracing.NoopTracer{}, &nullCloser{}, nil + } + + if c.ServiceName == "" { + return nil, nil, errors.New("no service name provided") + } + + opts := applyOptions(options...) + tracerMetrics := jaeger.NewMetrics(opts.metrics, nil) + if c.RPCMetrics { + Observer( + rpcmetrics.NewObserver( + opts.metrics.Namespace(metrics.NSOptions{Name: "jaeger-rpc", Tags: map[string]string{"component": "jaeger"}}), + rpcmetrics.DefaultNameNormalizer, + ), + )(&opts) // adds to c.observers + } + if c.Sampler == nil { + c.Sampler = &SamplerConfig{ + Type: jaeger.SamplerTypeRemote, + Param: defaultSamplingProbability, + } + } + if c.Reporter == nil { + c.Reporter = &ReporterConfig{} + } + + sampler := opts.sampler + if sampler == nil { + s, err := c.Sampler.NewSampler(c.ServiceName, tracerMetrics) + if err != nil { + return nil, nil, err + } + sampler = s + } + + reporter := opts.reporter + if reporter == nil { + r, err := c.Reporter.NewReporter(c.ServiceName, tracerMetrics, opts.logger) + if err != nil { + return nil, nil, err + } + reporter = r + } + + tracerOptions := []jaeger.TracerOption{ + jaeger.TracerOptions.Metrics(tracerMetrics), + jaeger.TracerOptions.Logger(opts.logger), + jaeger.TracerOptions.CustomHeaderKeys(c.Headers), + jaeger.TracerOptions.Gen128Bit(opts.gen128Bit), + jaeger.TracerOptions.PoolSpans(opts.poolSpans), + jaeger.TracerOptions.ZipkinSharedRPCSpan(opts.zipkinSharedRPCSpan), + jaeger.TracerOptions.MaxTagValueLength(opts.maxTagValueLength), + jaeger.TracerOptions.NoDebugFlagOnForcedSampling(opts.noDebugFlagOnForcedSampling), + } + + for _, tag := range opts.tags { + tracerOptions = append(tracerOptions, jaeger.TracerOptions.Tag(tag.Key, tag.Value)) + } + + for _, tag := range c.Tags { + tracerOptions = append(tracerOptions, jaeger.TracerOptions.Tag(tag.Key, tag.Value)) + } + + for _, obs := range opts.observers { + tracerOptions = append(tracerOptions, jaeger.TracerOptions.Observer(obs)) + } + + for _, cobs := range opts.contribObservers { + tracerOptions = append(tracerOptions, jaeger.TracerOptions.ContribObserver(cobs)) + } + + for format, injector := range opts.injectors { + tracerOptions = append(tracerOptions, jaeger.TracerOptions.Injector(format, injector)) + } + + for format, extractor := range opts.extractors { + tracerOptions = append(tracerOptions, jaeger.TracerOptions.Extractor(format, extractor)) + } + + if c.BaggageRestrictions != nil { + mgr := remote.NewRestrictionManager( + c.ServiceName, + remote.Options.Metrics(tracerMetrics), + remote.Options.Logger(opts.logger), + remote.Options.HostPort(c.BaggageRestrictions.HostPort), + remote.Options.RefreshInterval(c.BaggageRestrictions.RefreshInterval), + remote.Options.DenyBaggageOnInitializationFailure( + c.BaggageRestrictions.DenyBaggageOnInitializationFailure, + ), + ) + tracerOptions = append(tracerOptions, jaeger.TracerOptions.BaggageRestrictionManager(mgr)) + } + + if c.Throttler != nil { + debugThrottler := throttler.NewThrottler( + c.ServiceName, + throttler.Options.Metrics(tracerMetrics), + throttler.Options.Logger(opts.logger), + throttler.Options.HostPort(c.Throttler.HostPort), + throttler.Options.RefreshInterval(c.Throttler.RefreshInterval), + throttler.Options.SynchronousInitialization( + c.Throttler.SynchronousInitialization, + ), + ) + + tracerOptions = append(tracerOptions, jaeger.TracerOptions.DebugThrottler(debugThrottler)) + } + + tracer, closer := jaeger.NewTracer( + c.ServiceName, + sampler, + reporter, + tracerOptions..., + ) + + return tracer, closer, nil +} + +// InitGlobalTracer creates a new Jaeger Tracer, and sets it as global OpenTracing Tracer. +// It returns a closer func that can be used to flush buffers before shutdown. +func (c Configuration) InitGlobalTracer( + serviceName string, + options ...Option, +) (io.Closer, error) { + if c.Disabled { + return &nullCloser{}, nil + } + tracer, closer, err := c.New(serviceName, options...) + if err != nil { + return nil, err + } + opentracing.SetGlobalTracer(tracer) + return closer, nil +} + +// NewSampler creates a new sampler based on the configuration +func (sc *SamplerConfig) NewSampler( + serviceName string, + metrics *jaeger.Metrics, +) (jaeger.Sampler, error) { + samplerType := strings.ToLower(sc.Type) + if samplerType == jaeger.SamplerTypeConst { + return jaeger.NewConstSampler(sc.Param != 0), nil + } + if samplerType == jaeger.SamplerTypeProbabilistic { + if sc.Param >= 0 && sc.Param <= 1.0 { + return jaeger.NewProbabilisticSampler(sc.Param) + } + return nil, fmt.Errorf( + "invalid Param for probabilistic sampler; expecting value between 0 and 1, received %v", + sc.Param, + ) + } + if samplerType == jaeger.SamplerTypeRateLimiting { + return jaeger.NewRateLimitingSampler(sc.Param), nil + } + if samplerType == jaeger.SamplerTypeRemote || sc.Type == "" { + sc2 := *sc + sc2.Type = jaeger.SamplerTypeProbabilistic + initSampler, err := sc2.NewSampler(serviceName, nil) + if err != nil { + return nil, err + } + options := []jaeger.SamplerOption{ + jaeger.SamplerOptions.Metrics(metrics), + jaeger.SamplerOptions.InitialSampler(initSampler), + jaeger.SamplerOptions.SamplingServerURL(sc.SamplingServerURL), + jaeger.SamplerOptions.MaxOperations(sc.MaxOperations), + jaeger.SamplerOptions.OperationNameLateBinding(sc.OperationNameLateBinding), + jaeger.SamplerOptions.SamplingRefreshInterval(sc.SamplingRefreshInterval), + } + options = append(options, sc.Options...) + return jaeger.NewRemotelyControlledSampler(serviceName, options...), nil + } + return nil, fmt.Errorf("unknown sampler type (%s)", sc.Type) +} + +// NewReporter instantiates a new reporter that submits spans to the collector +func (rc *ReporterConfig) NewReporter( + serviceName string, + metrics *jaeger.Metrics, + logger jaeger.Logger, +) (jaeger.Reporter, error) { + sender, err := rc.newTransport(logger) + if err != nil { + return nil, err + } + reporter := jaeger.NewRemoteReporter( + sender, + jaeger.ReporterOptions.QueueSize(rc.QueueSize), + jaeger.ReporterOptions.BufferFlushInterval(rc.BufferFlushInterval), + jaeger.ReporterOptions.Logger(logger), + jaeger.ReporterOptions.Metrics(metrics)) + if rc.LogSpans && logger != nil { + logger.Infof("Initializing logging reporter\n") + reporter = jaeger.NewCompositeReporter(jaeger.NewLoggingReporter(logger), reporter) + } + return reporter, err +} + +func (rc *ReporterConfig) newTransport(logger jaeger.Logger) (jaeger.Transport, error) { + switch { + case rc.CollectorEndpoint != "": + httpOptions := []transport.HTTPOption{transport.HTTPBatchSize(1), transport.HTTPHeaders(rc.HTTPHeaders)} + if rc.User != "" && rc.Password != "" { + httpOptions = append(httpOptions, transport.HTTPBasicAuth(rc.User, rc.Password)) + } + return transport.NewHTTPTransport(rc.CollectorEndpoint, httpOptions...), nil + default: + return jaeger.NewUDPTransportWithParams(jaeger.UDPTransportParams{ + AgentClientUDPParams: utils.AgentClientUDPParams{ + HostPort: rc.LocalAgentHostPort, + Logger: logger, + DisableAttemptReconnecting: rc.DisableAttemptReconnecting, + AttemptReconnectInterval: rc.AttemptReconnectInterval, + }, + }) + } +} diff --git a/vendor/github.com/uber/jaeger-client-go/config/config_env.go b/vendor/github.com/uber/jaeger-client-go/config/config_env.go new file mode 100644 index 00000000..92d60cd5 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/config/config_env.go @@ -0,0 +1,259 @@ +// Copyright (c) 2018 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "fmt" + "net/url" + "os" + "strconv" + "strings" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/pkg/errors" + "github.com/uber/jaeger-client-go" +) + +const ( + // environment variable names + envServiceName = "JAEGER_SERVICE_NAME" + envDisabled = "JAEGER_DISABLED" + envRPCMetrics = "JAEGER_RPC_METRICS" + envTags = "JAEGER_TAGS" + envSamplerType = "JAEGER_SAMPLER_TYPE" + envSamplerParam = "JAEGER_SAMPLER_PARAM" + envSamplerManagerHostPort = "JAEGER_SAMPLER_MANAGER_HOST_PORT" // Deprecated by envSamplingEndpoint + envSamplingEndpoint = "JAEGER_SAMPLING_ENDPOINT" + envSamplerMaxOperations = "JAEGER_SAMPLER_MAX_OPERATIONS" + envSamplerRefreshInterval = "JAEGER_SAMPLER_REFRESH_INTERVAL" + envReporterMaxQueueSize = "JAEGER_REPORTER_MAX_QUEUE_SIZE" + envReporterFlushInterval = "JAEGER_REPORTER_FLUSH_INTERVAL" + envReporterLogSpans = "JAEGER_REPORTER_LOG_SPANS" + envReporterAttemptReconnectingDisabled = "JAEGER_REPORTER_ATTEMPT_RECONNECTING_DISABLED" + envReporterAttemptReconnectInterval = "JAEGER_REPORTER_ATTEMPT_RECONNECT_INTERVAL" + envEndpoint = "JAEGER_ENDPOINT" + envUser = "JAEGER_USER" + envPassword = "JAEGER_PASSWORD" + envAgentHost = "JAEGER_AGENT_HOST" + envAgentPort = "JAEGER_AGENT_PORT" +) + +// FromEnv uses environment variables to set the tracer's Configuration +func FromEnv() (*Configuration, error) { + c := &Configuration{} + return c.FromEnv() +} + +// FromEnv uses environment variables and overrides existing tracer's Configuration +func (c *Configuration) FromEnv() (*Configuration, error) { + if e := os.Getenv(envServiceName); e != "" { + c.ServiceName = e + } + + if e := os.Getenv(envRPCMetrics); e != "" { + if value, err := strconv.ParseBool(e); err == nil { + c.RPCMetrics = value + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envRPCMetrics, e) + } + } + + if e := os.Getenv(envDisabled); e != "" { + if value, err := strconv.ParseBool(e); err == nil { + c.Disabled = value + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envDisabled, e) + } + } + + if e := os.Getenv(envTags); e != "" { + c.Tags = parseTags(e) + } + + if c.Sampler == nil { + c.Sampler = &SamplerConfig{} + } + + if s, err := c.Sampler.samplerConfigFromEnv(); err == nil { + c.Sampler = s + } else { + return nil, errors.Wrap(err, "cannot obtain sampler config from env") + } + + if c.Reporter == nil { + c.Reporter = &ReporterConfig{} + } + + if r, err := c.Reporter.reporterConfigFromEnv(); err == nil { + c.Reporter = r + } else { + return nil, errors.Wrap(err, "cannot obtain reporter config from env") + } + + return c, nil +} + +// samplerConfigFromEnv creates a new SamplerConfig based on the environment variables +func (sc *SamplerConfig) samplerConfigFromEnv() (*SamplerConfig, error) { + if e := os.Getenv(envSamplerType); e != "" { + sc.Type = e + } + + if e := os.Getenv(envSamplerParam); e != "" { + if value, err := strconv.ParseFloat(e, 64); err == nil { + sc.Param = value + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envSamplerParam, e) + } + } + + if e := os.Getenv(envSamplingEndpoint); e != "" { + sc.SamplingServerURL = e + } else if e := os.Getenv(envSamplerManagerHostPort); e != "" { + sc.SamplingServerURL = e + } else if e := os.Getenv(envAgentHost); e != "" { + // Fallback if we know the agent host - try the sampling endpoint there + sc.SamplingServerURL = fmt.Sprintf("http://%s:%d/sampling", e, jaeger.DefaultSamplingServerPort) + } + + if e := os.Getenv(envSamplerMaxOperations); e != "" { + if value, err := strconv.ParseInt(e, 10, 0); err == nil { + sc.MaxOperations = int(value) + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envSamplerMaxOperations, e) + } + } + + if e := os.Getenv(envSamplerRefreshInterval); e != "" { + if value, err := time.ParseDuration(e); err == nil { + sc.SamplingRefreshInterval = value + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envSamplerRefreshInterval, e) + } + } + + return sc, nil +} + +// reporterConfigFromEnv creates a new ReporterConfig based on the environment variables +func (rc *ReporterConfig) reporterConfigFromEnv() (*ReporterConfig, error) { + if e := os.Getenv(envReporterMaxQueueSize); e != "" { + if value, err := strconv.ParseInt(e, 10, 0); err == nil { + rc.QueueSize = int(value) + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterMaxQueueSize, e) + } + } + + if e := os.Getenv(envReporterFlushInterval); e != "" { + if value, err := time.ParseDuration(e); err == nil { + rc.BufferFlushInterval = value + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterFlushInterval, e) + } + } + + if e := os.Getenv(envReporterLogSpans); e != "" { + if value, err := strconv.ParseBool(e); err == nil { + rc.LogSpans = value + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterLogSpans, e) + } + } + + if e := os.Getenv(envEndpoint); e != "" { + u, err := url.ParseRequestURI(e) + if err != nil { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envEndpoint, e) + } + rc.CollectorEndpoint = u.String() + user := os.Getenv(envUser) + pswd := os.Getenv(envPassword) + if user != "" && pswd == "" || user == "" && pswd != "" { + return nil, errors.Errorf("you must set %s and %s env vars together", envUser, envPassword) + } + rc.User = user + rc.Password = pswd + } else { + useEnv := false + host := jaeger.DefaultUDPSpanServerHost + if e := os.Getenv(envAgentHost); e != "" { + host = e + useEnv = true + } + + port := jaeger.DefaultUDPSpanServerPort + if e := os.Getenv(envAgentPort); e != "" { + if value, err := strconv.ParseInt(e, 10, 0); err == nil { + port = int(value) + useEnv = true + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envAgentPort, e) + } + } + if useEnv || rc.LocalAgentHostPort == "" { + rc.LocalAgentHostPort = fmt.Sprintf("%s:%d", host, port) + } + + if e := os.Getenv(envReporterAttemptReconnectingDisabled); e != "" { + if value, err := strconv.ParseBool(e); err == nil { + rc.DisableAttemptReconnecting = value + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterAttemptReconnectingDisabled, e) + } + } + + if !rc.DisableAttemptReconnecting { + if e := os.Getenv(envReporterAttemptReconnectInterval); e != "" { + if value, err := time.ParseDuration(e); err == nil { + rc.AttemptReconnectInterval = value + } else { + return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterAttemptReconnectInterval, e) + } + } + } + } + + return rc, nil +} + +// parseTags parses the given string into a collection of Tags. +// Spec for this value: +// - comma separated list of key=value +// - value can be specified using the notation ${envVar:defaultValue}, where `envVar` +// is an environment variable and `defaultValue` is the value to use in case the env var is not set +func parseTags(sTags string) []opentracing.Tag { + pairs := strings.Split(sTags, ",") + tags := make([]opentracing.Tag, 0) + for _, p := range pairs { + kv := strings.SplitN(p, "=", 2) + k, v := strings.TrimSpace(kv[0]), strings.TrimSpace(kv[1]) + + if strings.HasPrefix(v, "${") && strings.HasSuffix(v, "}") { + ed := strings.SplitN(v[2:len(v)-1], ":", 2) + e, d := ed[0], ed[1] + v = os.Getenv(e) + if v == "" && d != "" { + v = d + } + } + + tag := opentracing.Tag{Key: k, Value: v} + tags = append(tags, tag) + } + + return tags +} diff --git a/vendor/github.com/uber/jaeger-client-go/config/options.go b/vendor/github.com/uber/jaeger-client-go/config/options.go new file mode 100644 index 00000000..e0e50e83 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/config/options.go @@ -0,0 +1,165 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + opentracing "github.com/opentracing/opentracing-go" + "github.com/uber/jaeger-lib/metrics" + + "github.com/uber/jaeger-client-go" +) + +// Option is a function that sets some option on the client. +type Option func(c *Options) + +// Options control behavior of the client. +type Options struct { + metrics metrics.Factory + logger jaeger.Logger + reporter jaeger.Reporter + sampler jaeger.Sampler + contribObservers []jaeger.ContribObserver + observers []jaeger.Observer + gen128Bit bool + poolSpans bool + zipkinSharedRPCSpan bool + maxTagValueLength int + noDebugFlagOnForcedSampling bool + tags []opentracing.Tag + injectors map[interface{}]jaeger.Injector + extractors map[interface{}]jaeger.Extractor +} + +// Metrics creates an Option that initializes Metrics in the tracer, +// which is used to emit statistics about spans. +func Metrics(factory metrics.Factory) Option { + return func(c *Options) { + c.metrics = factory + } +} + +// Logger can be provided to log Reporter errors, as well as to log spans +// if Reporter.LogSpans is set to true. +func Logger(logger jaeger.Logger) Option { + return func(c *Options) { + c.logger = logger + } +} + +// Reporter can be provided explicitly to override the configuration. +// Useful for testing, e.g. by passing InMemoryReporter. +func Reporter(reporter jaeger.Reporter) Option { + return func(c *Options) { + c.reporter = reporter + } +} + +// Sampler can be provided explicitly to override the configuration. +func Sampler(sampler jaeger.Sampler) Option { + return func(c *Options) { + c.sampler = sampler + } +} + +// Observer can be registered with the Tracer to receive notifications about new Spans. +func Observer(observer jaeger.Observer) Option { + return func(c *Options) { + c.observers = append(c.observers, observer) + } +} + +// ContribObserver can be registered with the Tracer to receive notifications +// about new spans. +func ContribObserver(observer jaeger.ContribObserver) Option { + return func(c *Options) { + c.contribObservers = append(c.contribObservers, observer) + } +} + +// Gen128Bit specifies whether to generate 128bit trace IDs. +func Gen128Bit(gen128Bit bool) Option { + return func(c *Options) { + c.gen128Bit = gen128Bit + } +} + +// PoolSpans specifies whether to pool spans +func PoolSpans(poolSpans bool) Option { + return func(c *Options) { + c.poolSpans = poolSpans + } +} + +// ZipkinSharedRPCSpan creates an option that enables sharing span ID between client +// and server spans a la zipkin. If false, client and server spans will be assigned +// different IDs. +func ZipkinSharedRPCSpan(zipkinSharedRPCSpan bool) Option { + return func(c *Options) { + c.zipkinSharedRPCSpan = zipkinSharedRPCSpan + } +} + +// MaxTagValueLength can be provided to override the default max tag value length. +func MaxTagValueLength(maxTagValueLength int) Option { + return func(c *Options) { + c.maxTagValueLength = maxTagValueLength + } +} + +// NoDebugFlagOnForcedSampling can be used to decide whether debug flag will be set or not +// when calling span.setSamplingPriority to force sample a span. +func NoDebugFlagOnForcedSampling(noDebugFlagOnForcedSampling bool) Option { + return func(c *Options) { + c.noDebugFlagOnForcedSampling = noDebugFlagOnForcedSampling + } +} + +// Tag creates an option that adds a tracer-level tag. +func Tag(key string, value interface{}) Option { + return func(c *Options) { + c.tags = append(c.tags, opentracing.Tag{Key: key, Value: value}) + } +} + +// Injector registers an Injector with the given format. +func Injector(format interface{}, injector jaeger.Injector) Option { + return func(c *Options) { + c.injectors[format] = injector + } +} + +// Extractor registers an Extractor with the given format. +func Extractor(format interface{}, extractor jaeger.Extractor) Option { + return func(c *Options) { + c.extractors[format] = extractor + } +} + +func applyOptions(options ...Option) Options { + opts := Options{ + injectors: make(map[interface{}]jaeger.Injector), + extractors: make(map[interface{}]jaeger.Extractor), + } + for _, option := range options { + option(&opts) + } + if opts.metrics == nil { + opts.metrics = metrics.NullFactory + } + if opts.logger == nil { + opts.logger = jaeger.NullLogger + } + return opts +} diff --git a/vendor/github.com/uber/jaeger-client-go/constants.go b/vendor/github.com/uber/jaeger-client-go/constants.go new file mode 100644 index 00000000..2f63d590 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/constants.go @@ -0,0 +1,106 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "fmt" + + "github.com/opentracing/opentracing-go" +) + +const ( + // JaegerClientVersion is the version of the client library reported as Span tag. + JaegerClientVersion = "Go-2.25.0" + + // JaegerClientVersionTagKey is the name of the tag used to report client version. + JaegerClientVersionTagKey = "jaeger.version" + + // JaegerDebugHeader is the name of HTTP header or a TextMap carrier key which, + // if found in the carrier, forces the trace to be sampled as "debug" trace. + // The value of the header is recorded as the tag on the root span, so that the + // trace can be found in the UI using this value as a correlation ID. + JaegerDebugHeader = "jaeger-debug-id" + + // JaegerBaggageHeader is the name of the HTTP header that is used to submit baggage. + // It differs from TraceBaggageHeaderPrefix in that it can be used only in cases where + // a root span does not exist. + JaegerBaggageHeader = "jaeger-baggage" + + // TracerHostnameTagKey used to report host name of the process. + TracerHostnameTagKey = "hostname" + + // TracerIPTagKey used to report ip of the process. + TracerIPTagKey = "ip" + + // TracerUUIDTagKey used to report UUID of the client process. + TracerUUIDTagKey = "client-uuid" + + // SamplerTypeTagKey reports which sampler was used on the root span. + SamplerTypeTagKey = "sampler.type" + + // SamplerParamTagKey reports the parameter of the sampler, like sampling probability. + SamplerParamTagKey = "sampler.param" + + // TraceContextHeaderName is the http header name used to propagate tracing context. + // This must be in lower-case to avoid mismatches when decoding incoming headers. + TraceContextHeaderName = "uber-trace-id" + + // TracerStateHeaderName is deprecated. + // Deprecated: use TraceContextHeaderName + TracerStateHeaderName = TraceContextHeaderName + + // TraceBaggageHeaderPrefix is the prefix for http headers used to propagate baggage. + // This must be in lower-case to avoid mismatches when decoding incoming headers. + TraceBaggageHeaderPrefix = "uberctx-" + + // SamplerTypeConst is the type of sampler that always makes the same decision. + SamplerTypeConst = "const" + + // SamplerTypeRemote is the type of sampler that polls Jaeger agent for sampling strategy. + SamplerTypeRemote = "remote" + + // SamplerTypeProbabilistic is the type of sampler that samples traces + // with a certain fixed probability. + SamplerTypeProbabilistic = "probabilistic" + + // SamplerTypeRateLimiting is the type of sampler that samples + // only up to a fixed number of traces per second. + SamplerTypeRateLimiting = "ratelimiting" + + // SamplerTypeLowerBound is the type of sampler that samples + // at least a fixed number of traces per second. + SamplerTypeLowerBound = "lowerbound" + + // DefaultUDPSpanServerHost is the default host to send the spans to, via UDP + DefaultUDPSpanServerHost = "localhost" + + // DefaultUDPSpanServerPort is the default port to send the spans to, via UDP + DefaultUDPSpanServerPort = 6831 + + // DefaultSamplingServerPort is the default port to fetch sampling config from, via http + DefaultSamplingServerPort = 5778 + + // DefaultMaxTagValueLength is the default max length of byte array or string allowed in the tag value. + DefaultMaxTagValueLength = 256 + + // SelfRefType is a jaeger specific reference type that supports creating a span + // with an already defined context. + selfRefType opentracing.SpanReferenceType = 99 +) + +var ( + // DefaultSamplingServerURL is the default url to fetch sampling config from, via http + DefaultSamplingServerURL = fmt.Sprintf("http://127.0.0.1:%d/sampling", DefaultSamplingServerPort) +) diff --git a/vendor/github.com/uber/jaeger-client-go/contrib_observer.go b/vendor/github.com/uber/jaeger-client-go/contrib_observer.go new file mode 100644 index 00000000..4ce1881f --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/contrib_observer.go @@ -0,0 +1,56 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + opentracing "github.com/opentracing/opentracing-go" +) + +// ContribObserver can be registered with the Tracer to receive notifications +// about new Spans. Modelled after github.com/opentracing-contrib/go-observer. +type ContribObserver interface { + // Create and return a span observer. Called when a span starts. + // If the Observer is not interested in the given span, it must return (nil, false). + // E.g : + // func StartSpan(opName string, opts ...opentracing.StartSpanOption) { + // var sp opentracing.Span + // sso := opentracing.StartSpanOptions{} + // if spanObserver, ok := Observer.OnStartSpan(span, opName, sso); ok { + // // we have a valid SpanObserver + // } + // ... + // } + OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) (ContribSpanObserver, bool) +} + +// ContribSpanObserver is created by the Observer and receives notifications +// about other Span events. This interface is meant to match +// github.com/opentracing-contrib/go-observer, via duck typing, without +// directly importing the go-observer package. +type ContribSpanObserver interface { + OnSetOperationName(operationName string) + OnSetTag(key string, value interface{}) + OnFinish(options opentracing.FinishOptions) +} + +// wrapper observer for the old observers (see observer.go) +type oldObserver struct { + obs Observer +} + +func (o *oldObserver) OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) (ContribSpanObserver, bool) { + spanObserver := o.obs.OnStartSpan(operationName, options) + return spanObserver, spanObserver != nil +} diff --git a/vendor/github.com/uber/jaeger-client-go/doc.go b/vendor/github.com/uber/jaeger-client-go/doc.go new file mode 100644 index 00000000..4f554903 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/doc.go @@ -0,0 +1,24 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* +Package jaeger implements an OpenTracing (http://opentracing.io) Tracer. +It is currently using Zipkin-compatible data model and can be directly +itegrated with Zipkin backend (http://zipkin.io). + +For integration instructions please refer to the README: + +https://github.com/uber/jaeger-client-go/blob/master/README.md +*/ +package jaeger diff --git a/vendor/github.com/uber/jaeger-client-go/glide.lock b/vendor/github.com/uber/jaeger-client-go/glide.lock new file mode 100644 index 00000000..f4c05b2d --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/glide.lock @@ -0,0 +1,98 @@ +hash: a4a449cfc060c2d7be850a69b171e4382a3bd00d1a0a72cfc944facc3fe263bf +updated: 2019-09-23T17:10:15.213856-04:00 +imports: +- name: github.com/beorn7/perks + version: 37c8de3658fcb183f997c4e13e8337516ab753e6 + subpackages: + - quantile +- name: github.com/codahale/hdrhistogram + version: 3a0bb77429bd3a61596f5e8a3172445844342120 +- name: github.com/crossdock/crossdock-go + version: 049aabb0122b03bc9bd30cab8f3f91fb60166361 + subpackages: + - assert + - require +- name: github.com/davecgh/go-spew + version: d8f796af33cc11cb798c1aaeb27a4ebc5099927d + subpackages: + - spew +- name: github.com/golang/protobuf + version: 1680a479a2cfb3fa22b972af7e36d0a0fde47bf8 + subpackages: + - proto +- name: github.com/matttproud/golang_protobuf_extensions + version: c182affec369e30f25d3eb8cd8a478dee585ae7d + subpackages: + - pbutil +- name: github.com/opentracing/opentracing-go + version: 659c90643e714681897ec2521c60567dd21da733 + subpackages: + - ext + - harness + - log +- name: github.com/pkg/errors + version: ba968bfe8b2f7e042a574c888954fccecfa385b4 +- name: github.com/pmezard/go-difflib + version: 5d4384ee4fb2527b0a1256a821ebfc92f91efefc + subpackages: + - difflib +- name: github.com/prometheus/client_golang + version: 170205fb58decfd011f1550d4cfb737230d7ae4f + subpackages: + - prometheus + - prometheus/internal +- name: github.com/prometheus/client_model + version: 14fe0d1b01d4d5fc031dd4bec1823bd3ebbe8016 + subpackages: + - go +- name: github.com/prometheus/common + version: 287d3e634a1e550c9e463dd7e5a75a422c614505 + subpackages: + - expfmt + - internal/bitbucket.org/ww/goautoneg + - model +- name: github.com/prometheus/procfs + version: de25ac347ef9305868b04dc42425c973b863b18c + subpackages: + - internal/fs + - internal/util +- name: github.com/stretchr/testify + version: 85f2b59c4459e5bf57488796be8c3667cb8246d6 + subpackages: + - assert + - require + - suite +- name: github.com/uber-go/atomic + version: df976f2515e274675050de7b3f42545de80594fd +- name: github.com/uber/jaeger-lib + version: a87ae9d84fb038a8d79266298970720be7c80fcd + subpackages: + - metrics + - metrics/metricstest + - metrics/prometheus +- name: go.uber.org/atomic + version: df976f2515e274675050de7b3f42545de80594fd +- name: go.uber.org/multierr + version: 3c4937480c32f4c13a875a1829af76c98ca3d40a +- name: go.uber.org/zap + version: 27376062155ad36be76b0f12cf1572a221d3a48c + subpackages: + - buffer + - internal/bufferpool + - internal/color + - internal/exit + - zapcore +- name: golang.org/x/net + version: aa69164e4478b84860dc6769c710c699c67058a3 + subpackages: + - context + - context/ctxhttp +- name: golang.org/x/sys + version: 0a153f010e6963173baba2306531d173aa843137 + subpackages: + - windows +- name: gopkg.in/yaml.v2 + version: 51d6538a90f86fe93ac480b35f37b2be17fef232 +- name: github.com/golang/mock + version: 3a35fb6e3e18b9dbfee291262260dee7372d2a92 +testImports: [] diff --git a/vendor/github.com/uber/jaeger-client-go/glide.yaml b/vendor/github.com/uber/jaeger-client-go/glide.yaml new file mode 100644 index 00000000..eb58c67f --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/glide.yaml @@ -0,0 +1,28 @@ +package: github.com/uber/jaeger-client-go +import: +- package: github.com/opentracing/opentracing-go + version: ^1.1 + subpackages: + - ext + - log +- package: github.com/crossdock/crossdock-go +- package: github.com/uber/jaeger-lib + version: ^2.0.0 + subpackages: + - metrics +- package: github.com/pkg/errors + version: ~0.8.0 +- package: go.uber.org/zap + source: https://github.com/uber-go/zap.git + version: ^1 +- package: github.com/uber-go/atomic + version: ^1 +- package: github.com/prometheus/client_golang + version: ^1 +testImport: +- package: github.com/stretchr/testify + subpackages: + - assert + - require + - suite +- package: github.com/golang/mock diff --git a/vendor/github.com/uber/jaeger-client-go/header.go b/vendor/github.com/uber/jaeger-client-go/header.go new file mode 100644 index 00000000..5da70351 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/header.go @@ -0,0 +1,65 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +// HeadersConfig contains the values for the header keys that Jaeger will use. +// These values may be either custom or default depending on whether custom +// values were provided via a configuration. +type HeadersConfig struct { + // JaegerDebugHeader is the name of HTTP header or a TextMap carrier key which, + // if found in the carrier, forces the trace to be sampled as "debug" trace. + // The value of the header is recorded as the tag on the root span, so that the + // trace can be found in the UI using this value as a correlation ID. + JaegerDebugHeader string `yaml:"jaegerDebugHeader"` + + // JaegerBaggageHeader is the name of the HTTP header that is used to submit baggage. + // It differs from TraceBaggageHeaderPrefix in that it can be used only in cases where + // a root span does not exist. + JaegerBaggageHeader string `yaml:"jaegerBaggageHeader"` + + // TraceContextHeaderName is the http header name used to propagate tracing context. + // This must be in lower-case to avoid mismatches when decoding incoming headers. + TraceContextHeaderName string `yaml:"TraceContextHeaderName"` + + // TraceBaggageHeaderPrefix is the prefix for http headers used to propagate baggage. + // This must be in lower-case to avoid mismatches when decoding incoming headers. + TraceBaggageHeaderPrefix string `yaml:"traceBaggageHeaderPrefix"` +} + +// ApplyDefaults sets missing configuration keys to default values +func (c *HeadersConfig) ApplyDefaults() *HeadersConfig { + if c.JaegerBaggageHeader == "" { + c.JaegerBaggageHeader = JaegerBaggageHeader + } + if c.JaegerDebugHeader == "" { + c.JaegerDebugHeader = JaegerDebugHeader + } + if c.TraceBaggageHeaderPrefix == "" { + c.TraceBaggageHeaderPrefix = TraceBaggageHeaderPrefix + } + if c.TraceContextHeaderName == "" { + c.TraceContextHeaderName = TraceContextHeaderName + } + return c +} + +func getDefaultHeadersConfig() *HeadersConfig { + return &HeadersConfig{ + JaegerDebugHeader: JaegerDebugHeader, + JaegerBaggageHeader: JaegerBaggageHeader, + TraceContextHeaderName: TraceContextHeaderName, + TraceBaggageHeaderPrefix: TraceBaggageHeaderPrefix, + } +} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go b/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go new file mode 100644 index 00000000..74572931 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go @@ -0,0 +1,101 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package remote + +import ( + "time" + + "github.com/uber/jaeger-client-go" +) + +const ( + defaultMaxValueLength = 2048 + defaultRefreshInterval = time.Minute + defaultHostPort = "localhost:5778" +) + +// Option is a function that sets some option on the RestrictionManager +type Option func(options *options) + +// Options is a factory for all available options +var Options options + +type options struct { + denyBaggageOnInitializationFailure bool + metrics *jaeger.Metrics + logger jaeger.Logger + hostPort string + refreshInterval time.Duration +} + +// DenyBaggageOnInitializationFailure creates an Option that determines the startup failure mode of RestrictionManager. +// If DenyBaggageOnInitializationFailure is true, RestrictionManager will not allow any baggage to be written until baggage +// restrictions have been retrieved from agent. +// If DenyBaggageOnInitializationFailure is false, RestrictionManager will allow any baggage to be written until baggage +// restrictions have been retrieved from agent. +func (options) DenyBaggageOnInitializationFailure(b bool) Option { + return func(o *options) { + o.denyBaggageOnInitializationFailure = b + } +} + +// Metrics creates an Option that initializes Metrics on the RestrictionManager, which is used to emit statistics. +func (options) Metrics(m *jaeger.Metrics) Option { + return func(o *options) { + o.metrics = m + } +} + +// Logger creates an Option that sets the logger used by the RestrictionManager. +func (options) Logger(logger jaeger.Logger) Option { + return func(o *options) { + o.logger = logger + } +} + +// HostPort creates an Option that sets the hostPort of the local agent that contains the baggage restrictions. +func (options) HostPort(hostPort string) Option { + return func(o *options) { + o.hostPort = hostPort + } +} + +// RefreshInterval creates an Option that sets how often the RestrictionManager will poll local agent for +// the baggage restrictions. +func (options) RefreshInterval(refreshInterval time.Duration) Option { + return func(o *options) { + o.refreshInterval = refreshInterval + } +} + +func applyOptions(o ...Option) options { + opts := options{} + for _, option := range o { + option(&opts) + } + if opts.metrics == nil { + opts.metrics = jaeger.NewNullMetrics() + } + if opts.logger == nil { + opts.logger = jaeger.NullLogger + } + if opts.hostPort == "" { + opts.hostPort = defaultHostPort + } + if opts.refreshInterval == 0 { + opts.refreshInterval = defaultRefreshInterval + } + return opts +} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go b/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go new file mode 100644 index 00000000..a56515ac --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go @@ -0,0 +1,157 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package remote + +import ( + "fmt" + "net/url" + "sync" + "time" + + "github.com/uber/jaeger-client-go/internal/baggage" + thrift "github.com/uber/jaeger-client-go/thrift-gen/baggage" + "github.com/uber/jaeger-client-go/utils" +) + +type httpBaggageRestrictionManagerProxy struct { + url string +} + +func newHTTPBaggageRestrictionManagerProxy(hostPort, serviceName string) *httpBaggageRestrictionManagerProxy { + v := url.Values{} + v.Set("service", serviceName) + return &httpBaggageRestrictionManagerProxy{ + url: fmt.Sprintf("http://%s/baggageRestrictions?%s", hostPort, v.Encode()), + } +} + +func (s *httpBaggageRestrictionManagerProxy) GetBaggageRestrictions(serviceName string) ([]*thrift.BaggageRestriction, error) { + var out []*thrift.BaggageRestriction + if err := utils.GetJSON(s.url, &out); err != nil { + return nil, err + } + return out, nil +} + +// RestrictionManager manages baggage restrictions by retrieving baggage restrictions from agent +type RestrictionManager struct { + options + + mux sync.RWMutex + serviceName string + restrictions map[string]*baggage.Restriction + thriftProxy thrift.BaggageRestrictionManager + pollStopped sync.WaitGroup + stopPoll chan struct{} + invalidRestriction *baggage.Restriction + validRestriction *baggage.Restriction + + // Determines if the manager has successfully retrieved baggage restrictions from agent + initialized bool +} + +// NewRestrictionManager returns a BaggageRestrictionManager that polls the agent for the latest +// baggage restrictions. +func NewRestrictionManager(serviceName string, options ...Option) *RestrictionManager { + // TODO there is a developing use case where a single tracer can generate traces on behalf of many services. + // restrictionsMap will need to exist per service + opts := applyOptions(options...) + m := &RestrictionManager{ + serviceName: serviceName, + options: opts, + restrictions: make(map[string]*baggage.Restriction), + thriftProxy: newHTTPBaggageRestrictionManagerProxy(opts.hostPort, serviceName), + stopPoll: make(chan struct{}), + invalidRestriction: baggage.NewRestriction(false, 0), + validRestriction: baggage.NewRestriction(true, defaultMaxValueLength), + } + m.pollStopped.Add(1) + go m.pollManager() + return m +} + +// isReady returns true if the manager has retrieved baggage restrictions from the remote source. +func (m *RestrictionManager) isReady() bool { + m.mux.RLock() + defer m.mux.RUnlock() + return m.initialized +} + +// GetRestriction implements RestrictionManager#GetRestriction. +func (m *RestrictionManager) GetRestriction(service, key string) *baggage.Restriction { + m.mux.RLock() + defer m.mux.RUnlock() + if !m.initialized { + if m.denyBaggageOnInitializationFailure { + return m.invalidRestriction + } + return m.validRestriction + } + if restriction, ok := m.restrictions[key]; ok { + return restriction + } + return m.invalidRestriction +} + +// Close stops remote polling and closes the RemoteRestrictionManager. +func (m *RestrictionManager) Close() error { + close(m.stopPoll) + m.pollStopped.Wait() + return nil +} + +func (m *RestrictionManager) pollManager() { + defer m.pollStopped.Done() + // attempt to initialize baggage restrictions + if err := m.updateRestrictions(); err != nil { + m.logger.Error(fmt.Sprintf("Failed to initialize baggage restrictions: %s", err.Error())) + } + ticker := time.NewTicker(m.refreshInterval) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + if err := m.updateRestrictions(); err != nil { + m.logger.Error(fmt.Sprintf("Failed to update baggage restrictions: %s", err.Error())) + } + case <-m.stopPoll: + return + } + } +} + +func (m *RestrictionManager) updateRestrictions() error { + restrictions, err := m.thriftProxy.GetBaggageRestrictions(m.serviceName) + if err != nil { + m.metrics.BaggageRestrictionsUpdateFailure.Inc(1) + return err + } + newRestrictions := m.parseRestrictions(restrictions) + m.metrics.BaggageRestrictionsUpdateSuccess.Inc(1) + m.mux.Lock() + defer m.mux.Unlock() + m.initialized = true + m.restrictions = newRestrictions + return nil +} + +func (m *RestrictionManager) parseRestrictions(restrictions []*thrift.BaggageRestriction) map[string]*baggage.Restriction { + setters := make(map[string]*baggage.Restriction, len(restrictions)) + for _, restriction := range restrictions { + setters[restriction.BaggageKey] = baggage.NewRestriction(true, int(restriction.MaxValueLength)) + } + return setters +} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go b/vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go new file mode 100644 index 00000000..c16a5c56 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go @@ -0,0 +1,71 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package baggage + +const ( + defaultMaxValueLength = 2048 +) + +// Restriction determines whether a baggage key is allowed and contains any restrictions on the baggage value. +type Restriction struct { + keyAllowed bool + maxValueLength int +} + +// NewRestriction returns a new Restriction. +func NewRestriction(keyAllowed bool, maxValueLength int) *Restriction { + return &Restriction{ + keyAllowed: keyAllowed, + maxValueLength: maxValueLength, + } +} + +// KeyAllowed returns whether the baggage key for this restriction is allowed. +func (r *Restriction) KeyAllowed() bool { + return r.keyAllowed +} + +// MaxValueLength returns the max length for the baggage value. +func (r *Restriction) MaxValueLength() int { + return r.maxValueLength +} + +// RestrictionManager keeps track of valid baggage keys and their restrictions. The manager +// will return a Restriction for a specific baggage key which will determine whether the baggage +// key is allowed for the current service and any other applicable restrictions on the baggage +// value. +type RestrictionManager interface { + GetRestriction(service, key string) *Restriction +} + +// DefaultRestrictionManager allows any baggage key. +type DefaultRestrictionManager struct { + defaultRestriction *Restriction +} + +// NewDefaultRestrictionManager returns a DefaultRestrictionManager. +func NewDefaultRestrictionManager(maxValueLength int) *DefaultRestrictionManager { + if maxValueLength == 0 { + maxValueLength = defaultMaxValueLength + } + return &DefaultRestrictionManager{ + defaultRestriction: &Restriction{keyAllowed: true, maxValueLength: maxValueLength}, + } +} + +// GetRestriction implements RestrictionManager#GetRestriction. +func (m *DefaultRestrictionManager) GetRestriction(service, key string) *Restriction { + return m.defaultRestriction +} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/reporterstats/stats.go b/vendor/github.com/uber/jaeger-client-go/internal/reporterstats/stats.go new file mode 100644 index 00000000..fe0bef26 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/internal/reporterstats/stats.go @@ -0,0 +1,25 @@ +// Copyright (c) 2020 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package reporterstats + +// ReporterStats exposes some metrics from the RemoteReporter. +type ReporterStats interface { + SpansDroppedFromQueue() int64 +} + +// Receiver can be implemented by a Transport to be given ReporterStats. +type Receiver interface { + SetReporterStats(ReporterStats) +} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go b/vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go new file mode 100644 index 00000000..0e10b8a5 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go @@ -0,0 +1,81 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spanlog + +import ( + "encoding/json" + "fmt" + + "github.com/opentracing/opentracing-go/log" +) + +type fieldsAsMap map[string]string + +// MaterializeWithJSON converts log Fields into JSON string +// TODO refactor into pluggable materializer +func MaterializeWithJSON(logFields []log.Field) ([]byte, error) { + fields := fieldsAsMap(make(map[string]string, len(logFields))) + for _, field := range logFields { + field.Marshal(fields) + } + if event, ok := fields["event"]; ok && len(fields) == 1 { + return []byte(event), nil + } + return json.Marshal(fields) +} + +func (ml fieldsAsMap) EmitString(key, value string) { + ml[key] = value +} + +func (ml fieldsAsMap) EmitBool(key string, value bool) { + ml[key] = fmt.Sprintf("%t", value) +} + +func (ml fieldsAsMap) EmitInt(key string, value int) { + ml[key] = fmt.Sprintf("%d", value) +} + +func (ml fieldsAsMap) EmitInt32(key string, value int32) { + ml[key] = fmt.Sprintf("%d", value) +} + +func (ml fieldsAsMap) EmitInt64(key string, value int64) { + ml[key] = fmt.Sprintf("%d", value) +} + +func (ml fieldsAsMap) EmitUint32(key string, value uint32) { + ml[key] = fmt.Sprintf("%d", value) +} + +func (ml fieldsAsMap) EmitUint64(key string, value uint64) { + ml[key] = fmt.Sprintf("%d", value) +} + +func (ml fieldsAsMap) EmitFloat32(key string, value float32) { + ml[key] = fmt.Sprintf("%f", value) +} + +func (ml fieldsAsMap) EmitFloat64(key string, value float64) { + ml[key] = fmt.Sprintf("%f", value) +} + +func (ml fieldsAsMap) EmitObject(key string, value interface{}) { + ml[key] = fmt.Sprintf("%+v", value) +} + +func (ml fieldsAsMap) EmitLazyLogger(value log.LazyLogger) { + value(ml) +} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go b/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go new file mode 100644 index 00000000..f52c322f --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go @@ -0,0 +1,99 @@ +// Copyright (c) 2018 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package remote + +import ( + "time" + + "github.com/uber/jaeger-client-go" +) + +const ( + defaultHostPort = "localhost:5778" + defaultRefreshInterval = time.Second * 5 +) + +// Option is a function that sets some option on the Throttler +type Option func(options *options) + +// Options is a factory for all available options +var Options options + +type options struct { + metrics *jaeger.Metrics + logger jaeger.Logger + hostPort string + refreshInterval time.Duration + synchronousInitialization bool +} + +// Metrics creates an Option that initializes Metrics on the Throttler, which is used to emit statistics. +func (options) Metrics(m *jaeger.Metrics) Option { + return func(o *options) { + o.metrics = m + } +} + +// Logger creates an Option that sets the logger used by the Throttler. +func (options) Logger(logger jaeger.Logger) Option { + return func(o *options) { + o.logger = logger + } +} + +// HostPort creates an Option that sets the hostPort of the local agent that keeps track of credits. +func (options) HostPort(hostPort string) Option { + return func(o *options) { + o.hostPort = hostPort + } +} + +// RefreshInterval creates an Option that sets how often the Throttler will poll local agent for +// credits. +func (options) RefreshInterval(refreshInterval time.Duration) Option { + return func(o *options) { + o.refreshInterval = refreshInterval + } +} + +// SynchronousInitialization creates an Option that determines whether the throttler should synchronously +// fetch credits from the agent when an operation is seen for the first time. This should be set to true +// if the client will be used by a short lived service that needs to ensure that credits are fetched upfront +// such that sampling or throttling occurs. +func (options) SynchronousInitialization(b bool) Option { + return func(o *options) { + o.synchronousInitialization = b + } +} + +func applyOptions(o ...Option) options { + opts := options{} + for _, option := range o { + option(&opts) + } + if opts.metrics == nil { + opts.metrics = jaeger.NewNullMetrics() + } + if opts.logger == nil { + opts.logger = jaeger.NullLogger + } + if opts.hostPort == "" { + opts.hostPort = defaultHostPort + } + if opts.refreshInterval == 0 { + opts.refreshInterval = defaultRefreshInterval + } + return opts +} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go b/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go new file mode 100644 index 00000000..20f434fe --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go @@ -0,0 +1,216 @@ +// Copyright (c) 2018 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package remote + +import ( + "fmt" + "net/url" + "sync" + "sync/atomic" + "time" + + "github.com/pkg/errors" + + "github.com/uber/jaeger-client-go" + "github.com/uber/jaeger-client-go/utils" +) + +const ( + // minimumCredits is the minimum amount of credits necessary to not be throttled. + // i.e. if currentCredits > minimumCredits, then the operation will not be throttled. + minimumCredits = 1.0 +) + +var ( + errorUUIDNotSet = errors.New("Throttler UUID must be set") +) + +type operationBalance struct { + Operation string `json:"operation"` + Balance float64 `json:"balance"` +} + +type creditResponse struct { + Balances []operationBalance `json:"balances"` +} + +type httpCreditManagerProxy struct { + hostPort string +} + +func newHTTPCreditManagerProxy(hostPort string) *httpCreditManagerProxy { + return &httpCreditManagerProxy{ + hostPort: hostPort, + } +} + +// N.B. Operations list must not be empty. +func (m *httpCreditManagerProxy) FetchCredits(uuid, serviceName string, operations []string) (*creditResponse, error) { + params := url.Values{} + params.Set("service", serviceName) + params.Set("uuid", uuid) + for _, op := range operations { + params.Add("operations", op) + } + var resp creditResponse + if err := utils.GetJSON(fmt.Sprintf("http://%s/credits?%s", m.hostPort, params.Encode()), &resp); err != nil { + return nil, errors.Wrap(err, "Failed to receive credits from agent") + } + return &resp, nil +} + +// Throttler retrieves credits from agent and uses it to throttle operations. +type Throttler struct { + options + + mux sync.RWMutex + service string + uuid atomic.Value + creditManager *httpCreditManagerProxy + credits map[string]float64 // map of operation->credits + close chan struct{} + stopped sync.WaitGroup +} + +// NewThrottler returns a Throttler that polls agent for credits and uses them to throttle +// the service. +func NewThrottler(service string, options ...Option) *Throttler { + opts := applyOptions(options...) + creditManager := newHTTPCreditManagerProxy(opts.hostPort) + t := &Throttler{ + options: opts, + creditManager: creditManager, + service: service, + credits: make(map[string]float64), + close: make(chan struct{}), + } + t.stopped.Add(1) + go t.pollManager() + return t +} + +// IsAllowed implements Throttler#IsAllowed. +func (t *Throttler) IsAllowed(operation string) bool { + t.mux.Lock() + defer t.mux.Unlock() + value, ok := t.credits[operation] + if !ok || value == 0 { + if !ok { + // NOTE: This appears to be a no-op at first glance, but it stores + // the operation key in the map. Necessary for functionality of + // Throttler#operations method. + t.credits[operation] = 0 + } + if !t.synchronousInitialization { + t.metrics.ThrottledDebugSpans.Inc(1) + return false + } + // If it is the first time this operation is being checked, synchronously fetch + // the credits. + credits, err := t.fetchCredits([]string{operation}) + if err != nil { + // Failed to receive credits from agent, try again next time + t.logger.Error("Failed to fetch credits: " + err.Error()) + return false + } + if len(credits.Balances) == 0 { + // This shouldn't happen but just in case + return false + } + for _, opBalance := range credits.Balances { + t.credits[opBalance.Operation] += opBalance.Balance + } + } + return t.isAllowed(operation) +} + +// Close stops the throttler from fetching credits from remote. +func (t *Throttler) Close() error { + close(t.close) + t.stopped.Wait() + return nil +} + +// SetProcess implements ProcessSetter#SetProcess. It's imperative that the UUID is set before any remote +// requests are made. +func (t *Throttler) SetProcess(process jaeger.Process) { + if process.UUID != "" { + t.uuid.Store(process.UUID) + } +} + +// N.B. This function must be called with the Write Lock +func (t *Throttler) isAllowed(operation string) bool { + credits := t.credits[operation] + if credits < minimumCredits { + t.metrics.ThrottledDebugSpans.Inc(1) + return false + } + t.credits[operation] = credits - minimumCredits + return true +} + +func (t *Throttler) pollManager() { + defer t.stopped.Done() + ticker := time.NewTicker(t.refreshInterval) + defer ticker.Stop() + for { + select { + case <-ticker.C: + t.refreshCredits() + case <-t.close: + return + } + } +} + +func (t *Throttler) operations() []string { + t.mux.RLock() + defer t.mux.RUnlock() + operations := make([]string, 0, len(t.credits)) + for op := range t.credits { + operations = append(operations, op) + } + return operations +} + +func (t *Throttler) refreshCredits() { + operations := t.operations() + if len(operations) == 0 { + return + } + newCredits, err := t.fetchCredits(operations) + if err != nil { + t.metrics.ThrottlerUpdateFailure.Inc(1) + t.logger.Error("Failed to fetch credits: " + err.Error()) + return + } + t.metrics.ThrottlerUpdateSuccess.Inc(1) + + t.mux.Lock() + defer t.mux.Unlock() + for _, opBalance := range newCredits.Balances { + t.credits[opBalance.Operation] += opBalance.Balance + } +} + +func (t *Throttler) fetchCredits(operations []string) (*creditResponse, error) { + uuid := t.uuid.Load() + uuidStr, _ := uuid.(string) + if uuid == nil || uuidStr == "" { + return nil, errorUUIDNotSet + } + return t.creditManager.FetchCredits(uuidStr, t.service, operations) +} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go b/vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go new file mode 100644 index 00000000..196ed69c --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go @@ -0,0 +1,32 @@ +// Copyright (c) 2018 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package throttler + +// Throttler is used to rate limits operations. For example, given how debug spans +// are always sampled, a throttler can be enabled per client to rate limit the amount +// of debug spans a client can start. +type Throttler interface { + // IsAllowed determines whether the operation should be allowed and not be + // throttled. + IsAllowed(operation string) bool +} + +// DefaultThrottler doesn't throttle at all. +type DefaultThrottler struct{} + +// IsAllowed implements Throttler#IsAllowed. +func (t DefaultThrottler) IsAllowed(operation string) bool { + return true +} diff --git a/vendor/github.com/uber/jaeger-client-go/interop.go b/vendor/github.com/uber/jaeger-client-go/interop.go new file mode 100644 index 00000000..8402d087 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/interop.go @@ -0,0 +1,55 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "github.com/opentracing/opentracing-go" +) + +// TODO this file should not be needed after TChannel PR. + +type formatKey int + +// SpanContextFormat is a constant used as OpenTracing Format. +// Requires *SpanContext as carrier. +// This format is intended for interop with TChannel or other Zipkin-like tracers. +const SpanContextFormat formatKey = iota + +type jaegerTraceContextPropagator struct { + tracer *Tracer +} + +func (p *jaegerTraceContextPropagator) Inject( + ctx SpanContext, + abstractCarrier interface{}, +) error { + carrier, ok := abstractCarrier.(*SpanContext) + if !ok { + return opentracing.ErrInvalidCarrier + } + + carrier.CopyFrom(&ctx) + return nil +} + +func (p *jaegerTraceContextPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { + carrier, ok := abstractCarrier.(*SpanContext) + if !ok { + return emptyContext, opentracing.ErrInvalidCarrier + } + ctx := new(SpanContext) + ctx.CopyFrom(carrier) + return *ctx, nil +} diff --git a/vendor/github.com/uber/jaeger-client-go/jaeger_tag.go b/vendor/github.com/uber/jaeger-client-go/jaeger_tag.go new file mode 100644 index 00000000..868b2a5b --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/jaeger_tag.go @@ -0,0 +1,84 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "fmt" + + "github.com/opentracing/opentracing-go/log" + + j "github.com/uber/jaeger-client-go/thrift-gen/jaeger" +) + +type tags []*j.Tag + +// ConvertLogsToJaegerTags converts log Fields into jaeger tags. +func ConvertLogsToJaegerTags(logFields []log.Field) []*j.Tag { + fields := tags(make([]*j.Tag, 0, len(logFields))) + for _, field := range logFields { + field.Marshal(&fields) + } + return fields +} + +func (t *tags) EmitString(key, value string) { + *t = append(*t, &j.Tag{Key: key, VType: j.TagType_STRING, VStr: &value}) +} + +func (t *tags) EmitBool(key string, value bool) { + *t = append(*t, &j.Tag{Key: key, VType: j.TagType_BOOL, VBool: &value}) +} + +func (t *tags) EmitInt(key string, value int) { + vLong := int64(value) + *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) +} + +func (t *tags) EmitInt32(key string, value int32) { + vLong := int64(value) + *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) +} + +func (t *tags) EmitInt64(key string, value int64) { + *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &value}) +} + +func (t *tags) EmitUint32(key string, value uint32) { + vLong := int64(value) + *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) +} + +func (t *tags) EmitUint64(key string, value uint64) { + vLong := int64(value) + *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) +} + +func (t *tags) EmitFloat32(key string, value float32) { + vDouble := float64(value) + *t = append(*t, &j.Tag{Key: key, VType: j.TagType_DOUBLE, VDouble: &vDouble}) +} + +func (t *tags) EmitFloat64(key string, value float64) { + *t = append(*t, &j.Tag{Key: key, VType: j.TagType_DOUBLE, VDouble: &value}) +} + +func (t *tags) EmitObject(key string, value interface{}) { + vStr := fmt.Sprintf("%+v", value) + *t = append(*t, &j.Tag{Key: key, VType: j.TagType_STRING, VStr: &vStr}) +} + +func (t *tags) EmitLazyLogger(value log.LazyLogger) { + value(t) +} diff --git a/vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go b/vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go new file mode 100644 index 00000000..3ac2f8f9 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go @@ -0,0 +1,181 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "time" + + "github.com/opentracing/opentracing-go" + + j "github.com/uber/jaeger-client-go/thrift-gen/jaeger" + "github.com/uber/jaeger-client-go/utils" +) + +// BuildJaegerThrift builds jaeger span based on internal span. +// TODO: (breaking change) move to internal package. +func BuildJaegerThrift(span *Span) *j.Span { + span.Lock() + defer span.Unlock() + startTime := utils.TimeToMicrosecondsSinceEpochInt64(span.startTime) + duration := span.duration.Nanoseconds() / int64(time.Microsecond) + jaegerSpan := &j.Span{ + TraceIdLow: int64(span.context.traceID.Low), + TraceIdHigh: int64(span.context.traceID.High), + SpanId: int64(span.context.spanID), + ParentSpanId: int64(span.context.parentID), + OperationName: span.operationName, + Flags: int32(span.context.samplingState.flags()), + StartTime: startTime, + Duration: duration, + Tags: buildTags(span.tags, span.tracer.options.maxTagValueLength), + Logs: buildLogs(span.logs), + References: buildReferences(span.references), + } + return jaegerSpan +} + +// BuildJaegerProcessThrift creates a thrift Process type. +// TODO: (breaking change) move to internal package. +func BuildJaegerProcessThrift(span *Span) *j.Process { + span.Lock() + defer span.Unlock() + return buildJaegerProcessThrift(span.tracer) +} + +func buildJaegerProcessThrift(tracer *Tracer) *j.Process { + process := &j.Process{ + ServiceName: tracer.serviceName, + Tags: buildTags(tracer.tags, tracer.options.maxTagValueLength), + } + if tracer.process.UUID != "" { + process.Tags = append(process.Tags, &j.Tag{Key: TracerUUIDTagKey, VStr: &tracer.process.UUID, VType: j.TagType_STRING}) + } + return process +} + +func buildTags(tags []Tag, maxTagValueLength int) []*j.Tag { + jTags := make([]*j.Tag, 0, len(tags)) + for _, tag := range tags { + jTag := buildTag(&tag, maxTagValueLength) + jTags = append(jTags, jTag) + } + return jTags +} + +func buildLogs(logs []opentracing.LogRecord) []*j.Log { + jLogs := make([]*j.Log, 0, len(logs)) + for _, log := range logs { + jLog := &j.Log{ + Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(log.Timestamp), + Fields: ConvertLogsToJaegerTags(log.Fields), + } + jLogs = append(jLogs, jLog) + } + return jLogs +} + +func buildTag(tag *Tag, maxTagValueLength int) *j.Tag { + jTag := &j.Tag{Key: tag.key} + switch value := tag.value.(type) { + case string: + vStr := truncateString(value, maxTagValueLength) + jTag.VStr = &vStr + jTag.VType = j.TagType_STRING + case []byte: + if len(value) > maxTagValueLength { + value = value[:maxTagValueLength] + } + jTag.VBinary = value + jTag.VType = j.TagType_BINARY + case int: + vLong := int64(value) + jTag.VLong = &vLong + jTag.VType = j.TagType_LONG + case uint: + vLong := int64(value) + jTag.VLong = &vLong + jTag.VType = j.TagType_LONG + case int8: + vLong := int64(value) + jTag.VLong = &vLong + jTag.VType = j.TagType_LONG + case uint8: + vLong := int64(value) + jTag.VLong = &vLong + jTag.VType = j.TagType_LONG + case int16: + vLong := int64(value) + jTag.VLong = &vLong + jTag.VType = j.TagType_LONG + case uint16: + vLong := int64(value) + jTag.VLong = &vLong + jTag.VType = j.TagType_LONG + case int32: + vLong := int64(value) + jTag.VLong = &vLong + jTag.VType = j.TagType_LONG + case uint32: + vLong := int64(value) + jTag.VLong = &vLong + jTag.VType = j.TagType_LONG + case int64: + vLong := int64(value) + jTag.VLong = &vLong + jTag.VType = j.TagType_LONG + case uint64: + vLong := int64(value) + jTag.VLong = &vLong + jTag.VType = j.TagType_LONG + case float32: + vDouble := float64(value) + jTag.VDouble = &vDouble + jTag.VType = j.TagType_DOUBLE + case float64: + vDouble := float64(value) + jTag.VDouble = &vDouble + jTag.VType = j.TagType_DOUBLE + case bool: + vBool := value + jTag.VBool = &vBool + jTag.VType = j.TagType_BOOL + default: + vStr := truncateString(stringify(value), maxTagValueLength) + jTag.VStr = &vStr + jTag.VType = j.TagType_STRING + } + return jTag +} + +func buildReferences(references []Reference) []*j.SpanRef { + retMe := make([]*j.SpanRef, 0, len(references)) + for _, ref := range references { + if ref.Type == opentracing.ChildOfRef { + retMe = append(retMe, spanRef(ref.Context, j.SpanRefType_CHILD_OF)) + } else if ref.Type == opentracing.FollowsFromRef { + retMe = append(retMe, spanRef(ref.Context, j.SpanRefType_FOLLOWS_FROM)) + } + } + return retMe +} + +func spanRef(ctx SpanContext, refType j.SpanRefType) *j.SpanRef { + return &j.SpanRef{ + RefType: refType, + TraceIdLow: int64(ctx.traceID.Low), + TraceIdHigh: int64(ctx.traceID.High), + SpanId: int64(ctx.spanID), + } +} diff --git a/vendor/github.com/uber/jaeger-client-go/log/logger.go b/vendor/github.com/uber/jaeger-client-go/log/logger.go new file mode 100644 index 00000000..ced6e0ce --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/log/logger.go @@ -0,0 +1,141 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package log + +import ( + "bytes" + "fmt" + "log" + "sync" +) + +// Logger provides an abstract interface for logging from Reporters. +// Applications can provide their own implementation of this interface to adapt +// reporters logging to whatever logging library they prefer (stdlib log, +// logrus, go-logging, etc). +type Logger interface { + // Error logs a message at error priority + Error(msg string) + + // Infof logs a message at info priority + Infof(msg string, args ...interface{}) +} + +// StdLogger is implementation of the Logger interface that delegates to default `log` package +var StdLogger = &stdLogger{} + +type stdLogger struct{} + +func (l *stdLogger) Error(msg string) { + log.Printf("ERROR: %s", msg) +} + +// Infof logs a message at info priority +func (l *stdLogger) Infof(msg string, args ...interface{}) { + log.Printf(msg, args...) +} + +// Debugf logs a message at debug priority +func (l *stdLogger) Debugf(msg string, args ...interface{}) { + log.Printf(fmt.Sprintf("DEBUG: %s", msg), args...) +} + +// NullLogger is implementation of the Logger interface that is no-op +var NullLogger = &nullLogger{} + +type nullLogger struct{} + +func (l *nullLogger) Error(msg string) {} +func (l *nullLogger) Infof(msg string, args ...interface{}) {} +func (l *nullLogger) Debugf(msg string, args ...interface{}) {} + +// BytesBufferLogger implements Logger backed by a bytes.Buffer. +type BytesBufferLogger struct { + mux sync.Mutex + buf bytes.Buffer +} + +// Error implements Logger. +func (l *BytesBufferLogger) Error(msg string) { + l.mux.Lock() + l.buf.WriteString(fmt.Sprintf("ERROR: %s\n", msg)) + l.mux.Unlock() +} + +// Infof implements Logger. +func (l *BytesBufferLogger) Infof(msg string, args ...interface{}) { + l.mux.Lock() + l.buf.WriteString("INFO: " + fmt.Sprintf(msg, args...) + "\n") + l.mux.Unlock() +} + +// Debugf implements Logger. +func (l *BytesBufferLogger) Debugf(msg string, args ...interface{}) { + l.mux.Lock() + l.buf.WriteString("DEBUG: " + fmt.Sprintf(msg, args...) + "\n") + l.mux.Unlock() +} + +// String returns string representation of the underlying buffer. +func (l *BytesBufferLogger) String() string { + l.mux.Lock() + defer l.mux.Unlock() + return l.buf.String() +} + +// Flush empties the underlying buffer. +func (l *BytesBufferLogger) Flush() { + l.mux.Lock() + defer l.mux.Unlock() + l.buf.Reset() +} + +// DebugLogger is an interface which adds a debug logging level +type DebugLogger interface { + Logger + + // Debugf logs a message at debug priority + Debugf(msg string, args ...interface{}) +} + +// DebugLogAdapter is a log adapter that converts a Logger into a DebugLogger +// If the provided Logger doesn't satisfy the interface, a logger with debug +// disabled is returned +func DebugLogAdapter(logger Logger) DebugLogger { + if logger == nil { + return nil + } + if debugLogger, ok := logger.(DebugLogger); ok { + return debugLogger + } + logger.Infof("debug logging disabled") + return debugDisabledLogAdapter{logger: logger} +} + +type debugDisabledLogAdapter struct { + logger Logger +} + +func (d debugDisabledLogAdapter) Error(msg string) { + d.logger.Error(msg) +} + +func (d debugDisabledLogAdapter) Infof(msg string, args ...interface{}) { + d.logger.Infof(msg, args...) +} + +// Debugf is a nop +func (d debugDisabledLogAdapter) Debugf(msg string, args ...interface{}) { +} diff --git a/vendor/github.com/uber/jaeger-client-go/log/zap/field.go b/vendor/github.com/uber/jaeger-client-go/log/zap/field.go new file mode 100644 index 00000000..e29b3c9a --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/log/zap/field.go @@ -0,0 +1,207 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package zap + +import ( + "context" + "fmt" + + jaeger "github.com/uber/jaeger-client-go" + + opentracing "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/log" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// Trace creates a field that extracts tracing information from a context and +// includes it under the "trace" key. +// +// Because the opentracing APIs don't expose this information, the returned +// zap.Field is a no-op for contexts that don't contain a span or contain a +// non-Jaeger span. +// TODO: delegate to `spanContext` +func Trace(ctx context.Context) zapcore.Field { + if ctx == nil { + return zap.Skip() + } + return zap.Object("trace", trace{ctx}) +} + +type trace struct { + ctx context.Context +} + +func (t trace) MarshalLogObject(enc zapcore.ObjectEncoder) error { + span := opentracing.SpanFromContext(t.ctx) + if span == nil { + return nil + } + j, ok := span.Context().(jaeger.SpanContext) + if !ok { + return nil + } + if !j.IsValid() { + return fmt.Errorf("invalid span: %v", j.SpanID()) + } + enc.AddString("span", j.SpanID().String()) + enc.AddString("trace", j.TraceID().String()) + enc.AddBool("sampled", j.IsSampled()) + return nil +} + +type spanContext jaeger.SpanContext + +// Context creates a zap.Field which marshals all information contained in a jaeger context +func Context(sc jaeger.SpanContext) zapcore.Field { + return zap.Object("context", spanContext(sc)) +} + +func (s spanContext) MarshalLogObject(enc zapcore.ObjectEncoder) error { + ctx := jaeger.SpanContext(s) + enc.AddString("trace", ctx.TraceID().String()) + enc.AddString("span", ctx.SpanID().String()) + enc.AddString("parent", ctx.ParentID().String()) + enc.AddBool("debug", ctx.IsDebug()) + enc.AddBool("sampled", ctx.IsSampled()) + enc.AddBool("firehose", ctx.IsFirehose()) + enc.AddArray("baggage", baggageKVs(ctx)) + return nil +} + +type baggageKV struct { + key string + value string +} + +func (b baggageKV) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddString("key", b.key) + enc.AddString("value", b.value) + return nil +} + +type baggageKVs jaeger.SpanContext + +func (b baggageKVs) MarshalLogArray(enc zapcore.ArrayEncoder) error { + jaeger.SpanContext(b). + ForeachBaggageItem(func(k, v string) bool { + enc.AppendObject(baggageKV{ + key: k, + value: v, + }) + return true + }) + return nil +} + +type logRecord opentracing.LogRecord + +func (l logRecord) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddTime("ts", l.Timestamp) + enc.AddArray("fields", logFields(l.Fields)) + return nil +} + +type logRecords []opentracing.LogRecord + +func (l logRecords) MarshalLogArray(enc zapcore.ArrayEncoder) error { + for _, record := range l { + enc.AppendObject(logRecord(record)) + } + return nil +} + +type logField log.Field + +func (l logField) MarshalLogObject(enc zapcore.ObjectEncoder) error { + lf := log.Field(l) + enc.AddString("key", lf.Key()) + enc.AddString("value", fmt.Sprint(lf.Value())) + return nil +} + +type logFields []log.Field + +func (l logFields) MarshalLogArray(enc zapcore.ArrayEncoder) error { + for _, field := range l { + enc.AppendObject(logField(field)) + } + return nil +} + +type tags opentracing.Tags + +func (t tags) MarshalLogObject(enc zapcore.ObjectEncoder) error { + for k, v := range t { + enc.AddString("key", k) + enc.AddReflected("value", v) + } + return nil +} + +type reference opentracing.SpanReference + +func (r reference) MarshalLogObject(enc zapcore.ObjectEncoder) error { + if r.Type == opentracing.ChildOfRef { + enc.AddString("type", "child_of") + } else if r.Type == opentracing.FollowsFromRef { + enc.AddString("type", "follows_from") + } else { + enc.AddString("type", fmt.Sprintf("unknown(%d)", r.Type)) + } + + if jCtx, ok := r.ReferencedContext.(jaeger.SpanContext); ok { + enc.AddString("span", jCtx.SpanID().String()) + enc.AddString("trace", jCtx.TraceID().String()) + } + + return nil +} + +type references []opentracing.SpanReference + +func (r references) MarshalLogArray(enc zapcore.ArrayEncoder) error { + for _, spanReference := range r { + enc.AppendObject(reference(spanReference)) + } + return nil +} + +type span struct { + span *jaeger.Span +} + +// Span creates a zap.Field that marshals all information contained in a jaeger span +func Span(s opentracing.Span) zapcore.Field { + if s == nil { + return zap.String("err", "nil span") + } + if jSpan, ok := s.(*jaeger.Span); ok { + return zap.Object("span", span{span: jSpan}) + } + return zap.String("err", "non jaeger span") +} + +func (s span) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddObject("context", spanContext(s.span.SpanContext())) + enc.AddString("operation_name", s.span.OperationName()) + enc.AddDuration("duration", s.span.Duration()) + enc.AddTime("start_time", s.span.StartTime()) + + enc.AddArray("logs", logRecords(s.span.Logs())) + enc.AddObject("tags", tags(s.span.Tags())) + enc.AddArray("span_refs", references(s.span.References())) + return nil +} diff --git a/vendor/github.com/uber/jaeger-client-go/log/zap/logger.go b/vendor/github.com/uber/jaeger-client-go/log/zap/logger.go new file mode 100644 index 00000000..9dcfb30c --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/log/zap/logger.go @@ -0,0 +1,46 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package zap + +import ( + "go.uber.org/zap" +) + +// Logger is an adapter from zap Logger to jaeger-lib Logger. +type Logger struct { + logger *zap.SugaredLogger +} + +// NewLogger creates a new Logger. +func NewLogger(logger *zap.Logger) *Logger { + return &Logger{logger: logger.Sugar()} +} + +// Error logs a message at error priority +func (l *Logger) Error(msg string) { + l.logger.Error(msg) +} + +// Infof logs a message at info priority +func (l *Logger) Infof(msg string, args ...interface{}) { + l.logger.Infof(msg, args...) +} + +// Debugf logs a message at debug priority. +// TODO: treat the last arg specially similar to Slf4J +// - cast to zap.Span/etc if type assertion succeeds +func (l *Logger) Debugf(msg string, args ...interface{}) { + l.logger.Debugf(msg, args...) +} diff --git a/vendor/github.com/uber/jaeger-client-go/log/zap/tracer.go b/vendor/github.com/uber/jaeger-client-go/log/zap/tracer.go new file mode 100644 index 00000000..50e2ad5d --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/log/zap/tracer.go @@ -0,0 +1,168 @@ +// Copyright (c) 2020 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package zap + +import ( + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/log" + "github.com/uber/jaeger-client-go" + "go.uber.org/zap" +) + +// loggingTracer is a wrapper for the Jaeger tracer, which logs all span interactions +// It is intended to be used for debugging tracing issues +type loggingTracer struct { + logger *zap.Logger + tracer opentracing.Tracer +} + +// NewLoggingTracer creates a new tracer that logs all span interactions +func NewLoggingTracer(logger *zap.Logger, tracer opentracing.Tracer) opentracing.Tracer { + if jTracer, ok := tracer.(*jaeger.Tracer); ok { + logger.Info("loggingTracer created", + zap.Any("sampler", jTracer.Sampler()), + zap.Any("tags", jTracer.Tags())) + } else { + logger.Info("Non Jaeger Tracer supplied to loggingTracer") + } + + return loggingTracer{ + logger: logger, + tracer: tracer, + } +} + +func (l loggingTracer) StartSpan(operationName string, opts ...opentracing.StartSpanOption) opentracing.Span { + span := l.tracer.StartSpan(operationName, opts...) + fields := []zap.Field{ + zap.Stack("stack"), + zap.String("operation_name", operationName), + zap.Any("opts", opts), + } + + if jSpan, ok := span.(*jaeger.Span); ok { + ctx := jSpan.SpanContext() + fields = append(fields, Context(ctx)) + l.logger.Info("StartSpan", fields...) + return newLoggingSpan(l.logger, span) + } + + l.logger.Info("StartSpan", fields...) + return span +} + +func (l loggingTracer) Inject(ctx opentracing.SpanContext, format interface{}, carrier interface{}) error { + fields := []zap.Field{zap.Any("format", format), zap.Any("carrier", carrier)} + if jCtx, ok := ctx.(jaeger.SpanContext); ok { + fields = append(fields, Context(jCtx)) + } else { + l.logger.Error("Inject attempted with Non Jaeger Context") + } + + l.logger.Debug("Inject", fields...) + return l.tracer.Inject(ctx, format, carrier) +} + +func (l loggingTracer) Extract(format interface{}, carrier interface{}) (opentracing.SpanContext, error) { + l.logger.Debug("Extract", zap.Any("format", format), zap.Any("carrier", carrier)) + ctx, err := l.tracer.Extract(format, carrier) + if err != nil { + l.logger.Debug("Extract succeeded", Context(ctx.(jaeger.SpanContext))) + } else { + l.logger.Error("Extract failed", zap.Error(err)) + } + return ctx, err +} + +type loggingSpan struct { + logger *zap.Logger + delegate opentracing.Span +} + +func newLoggingSpan(logger *zap.Logger, span opentracing.Span) opentracing.Span { + return loggingSpan{ + delegate: span, + logger: logger, + } +} + +func (l loggingSpan) Finish() { + stack := zap.Stack("debug_stack") + l.logger.Info("Finish", Span(l.delegate), stack) + l.delegate.Finish() +} + +func (l loggingSpan) FinishWithOptions(opts opentracing.FinishOptions) { + l.logger.Info("FinishWithOptions", Span(l.delegate)) + l.delegate.FinishWithOptions(opts) +} + +func (l loggingSpan) Context() opentracing.SpanContext { + l.logger.Debug("Context") + return l.delegate.Context() +} + +func (l loggingSpan) SetOperationName(operationName string) opentracing.Span { + l.logger.Debug("SetOperationName", zap.String("operation_name", operationName)) + return l.delegate.SetOperationName(operationName) +} + +func (l loggingSpan) SetTag(key string, value interface{}) opentracing.Span { + l.logger.Debug("SetTag", zap.String("key", key), zap.Any("value", value)) + return l.delegate.SetTag(key, value) +} + +func (l loggingSpan) LogFields(fields ...log.Field) { + l.logger.Debug("LogFields", zap.Array("fields", logFields(fields))) + l.delegate.LogFields(fields...) +} + +func (l loggingSpan) LogKV(alternatingKeyValues ...interface{}) { + l.logger.Debug("LogKV", zap.Any("keyValues", alternatingKeyValues)) + l.delegate.LogKV(alternatingKeyValues...) +} + +func (l loggingSpan) SetBaggageItem(restrictedKey, value string) opentracing.Span { + l.logger.Debug("SetBaggageItem", zap.String("key", restrictedKey), zap.String("value", value)) + return l.delegate.SetBaggageItem(restrictedKey, value) +} + +func (l loggingSpan) BaggageItem(restrictedKey string) string { + l.logger.Debug("BaggageItem", zap.String("key", restrictedKey)) + return l.delegate.BaggageItem(restrictedKey) +} + +func (l loggingSpan) Tracer() opentracing.Tracer { + l.logger.Debug("Tracer") + return l.delegate.Tracer() +} + +func (l loggingSpan) LogEvent(event string) { + l.logger.Debug("Deprecated: LogEvent", zap.String("event", event)) + l.delegate.LogEvent(event) +} + +func (l loggingSpan) LogEventWithPayload(event string, payload interface{}) { + l.logger.Debug("Deprecated: LogEventWithPayload", zap.String("event", event), zap.Any("payload", payload)) + l.delegate.LogEventWithPayload(event, payload) +} + +func (l loggingSpan) Log(data opentracing.LogData) { + l.logger.Debug("Deprecated: Log", + zap.String("event", data.Event), + zap.Time("ts", data.Timestamp), + zap.Any("payload", data.Payload)) + l.delegate.Log(data) +} diff --git a/vendor/github.com/uber/jaeger-client-go/logger.go b/vendor/github.com/uber/jaeger-client-go/logger.go new file mode 100644 index 00000000..d4f0b501 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/logger.go @@ -0,0 +1,53 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import "log" + +// NB This will be deprecated in 3.0.0, please use jaeger-client-go/log/logger instead. + +// Logger provides an abstract interface for logging from Reporters. +// Applications can provide their own implementation of this interface to adapt +// reporters logging to whatever logging library they prefer (stdlib log, +// logrus, go-logging, etc). +type Logger interface { + // Error logs a message at error priority + Error(msg string) + + // Infof logs a message at info priority + Infof(msg string, args ...interface{}) +} + +// StdLogger is implementation of the Logger interface that delegates to default `log` package +var StdLogger = &stdLogger{} + +type stdLogger struct{} + +func (l *stdLogger) Error(msg string) { + log.Printf("ERROR: %s", msg) +} + +// Infof logs a message at info priority +func (l *stdLogger) Infof(msg string, args ...interface{}) { + log.Printf(msg, args...) +} + +// NullLogger is implementation of the Logger interface that delegates to default `log` package +var NullLogger = &nullLogger{} + +type nullLogger struct{} + +func (l *nullLogger) Error(msg string) {} +func (l *nullLogger) Infof(msg string, args ...interface{}) {} diff --git a/vendor/github.com/uber/jaeger-client-go/metrics.go b/vendor/github.com/uber/jaeger-client-go/metrics.go new file mode 100644 index 00000000..50e4e22d --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/metrics.go @@ -0,0 +1,119 @@ +// Copyright (c) 2017-2018 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "github.com/uber/jaeger-lib/metrics" +) + +// Metrics is a container of all stats emitted by Jaeger tracer. +type Metrics struct { + // Number of traces started by this tracer as sampled + TracesStartedSampled metrics.Counter `metric:"traces" tags:"state=started,sampled=y" help:"Number of traces started by this tracer as sampled"` + + // Number of traces started by this tracer as not sampled + TracesStartedNotSampled metrics.Counter `metric:"traces" tags:"state=started,sampled=n" help:"Number of traces started by this tracer as not sampled"` + + // Number of traces started by this tracer with delayed sampling + TracesStartedDelayedSampling metrics.Counter `metric:"traces" tags:"state=started,sampled=n" help:"Number of traces started by this tracer with delayed sampling"` + + // Number of externally started sampled traces this tracer joined + TracesJoinedSampled metrics.Counter `metric:"traces" tags:"state=joined,sampled=y" help:"Number of externally started sampled traces this tracer joined"` + + // Number of externally started not-sampled traces this tracer joined + TracesJoinedNotSampled metrics.Counter `metric:"traces" tags:"state=joined,sampled=n" help:"Number of externally started not-sampled traces this tracer joined"` + + // Number of sampled spans started by this tracer + SpansStartedSampled metrics.Counter `metric:"started_spans" tags:"sampled=y" help:"Number of spans started by this tracer as sampled"` + + // Number of not sampled spans started by this tracer + SpansStartedNotSampled metrics.Counter `metric:"started_spans" tags:"sampled=n" help:"Number of spans started by this tracer as not sampled"` + + // Number of spans with delayed sampling started by this tracer + SpansStartedDelayedSampling metrics.Counter `metric:"started_spans" tags:"sampled=delayed" help:"Number of spans started by this tracer with delayed sampling"` + + // Number of spans finished by this tracer + SpansFinishedSampled metrics.Counter `metric:"finished_spans" tags:"sampled=y" help:"Number of sampled spans finished by this tracer"` + + // Number of spans finished by this tracer + SpansFinishedNotSampled metrics.Counter `metric:"finished_spans" tags:"sampled=n" help:"Number of not-sampled spans finished by this tracer"` + + // Number of spans finished by this tracer + SpansFinishedDelayedSampling metrics.Counter `metric:"finished_spans" tags:"sampled=delayed" help:"Number of spans with delayed sampling finished by this tracer"` + + // Number of errors decoding tracing context + DecodingErrors metrics.Counter `metric:"span_context_decoding_errors" help:"Number of errors decoding tracing context"` + + // Number of spans successfully reported + ReporterSuccess metrics.Counter `metric:"reporter_spans" tags:"result=ok" help:"Number of spans successfully reported"` + + // Number of spans not reported due to a Sender failure + ReporterFailure metrics.Counter `metric:"reporter_spans" tags:"result=err" help:"Number of spans not reported due to a Sender failure"` + + // Number of spans dropped due to internal queue overflow + ReporterDropped metrics.Counter `metric:"reporter_spans" tags:"result=dropped" help:"Number of spans dropped due to internal queue overflow"` + + // Current number of spans in the reporter queue + ReporterQueueLength metrics.Gauge `metric:"reporter_queue_length" help:"Current number of spans in the reporter queue"` + + // Number of times the Sampler succeeded to retrieve sampling strategy + SamplerRetrieved metrics.Counter `metric:"sampler_queries" tags:"result=ok" help:"Number of times the Sampler succeeded to retrieve sampling strategy"` + + // Number of times the Sampler failed to retrieve sampling strategy + SamplerQueryFailure metrics.Counter `metric:"sampler_queries" tags:"result=err" help:"Number of times the Sampler failed to retrieve sampling strategy"` + + // Number of times the Sampler succeeded to retrieve and update sampling strategy + SamplerUpdated metrics.Counter `metric:"sampler_updates" tags:"result=ok" help:"Number of times the Sampler succeeded to retrieve and update sampling strategy"` + + // Number of times the Sampler failed to update sampling strategy + SamplerUpdateFailure metrics.Counter `metric:"sampler_updates" tags:"result=err" help:"Number of times the Sampler failed to update sampling strategy"` + + // Number of times baggage was successfully written or updated on spans. + BaggageUpdateSuccess metrics.Counter `metric:"baggage_updates" tags:"result=ok" help:"Number of times baggage was successfully written or updated on spans"` + + // Number of times baggage failed to write or update on spans. + BaggageUpdateFailure metrics.Counter `metric:"baggage_updates" tags:"result=err" help:"Number of times baggage failed to write or update on spans"` + + // Number of times baggage was truncated as per baggage restrictions. + BaggageTruncate metrics.Counter `metric:"baggage_truncations" help:"Number of times baggage was truncated as per baggage restrictions"` + + // Number of times baggage restrictions were successfully updated. + BaggageRestrictionsUpdateSuccess metrics.Counter `metric:"baggage_restrictions_updates" tags:"result=ok" help:"Number of times baggage restrictions were successfully updated"` + + // Number of times baggage restrictions failed to update. + BaggageRestrictionsUpdateFailure metrics.Counter `metric:"baggage_restrictions_updates" tags:"result=err" help:"Number of times baggage restrictions failed to update"` + + // Number of times debug spans were throttled. + ThrottledDebugSpans metrics.Counter `metric:"throttled_debug_spans" help:"Number of times debug spans were throttled"` + + // Number of times throttler successfully updated. + ThrottlerUpdateSuccess metrics.Counter `metric:"throttler_updates" tags:"result=ok" help:"Number of times throttler successfully updated"` + + // Number of times throttler failed to update. + ThrottlerUpdateFailure metrics.Counter `metric:"throttler_updates" tags:"result=err" help:"Number of times throttler failed to update"` +} + +// NewMetrics creates a new Metrics struct and initializes it. +func NewMetrics(factory metrics.Factory, globalTags map[string]string) *Metrics { + m := &Metrics{} + // TODO the namespace "jaeger" should be configurable + metrics.MustInit(m, factory.Namespace(metrics.NSOptions{Name: "jaeger"}).Namespace(metrics.NSOptions{Name: "tracer"}), globalTags) + return m +} + +// NewNullMetrics creates a new Metrics struct that won't report any metrics. +func NewNullMetrics() *Metrics { + return NewMetrics(metrics.NullFactory, nil) +} diff --git a/vendor/github.com/uber/jaeger-client-go/observer.go b/vendor/github.com/uber/jaeger-client-go/observer.go new file mode 100644 index 00000000..7bbd0288 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/observer.go @@ -0,0 +1,88 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import opentracing "github.com/opentracing/opentracing-go" + +// Observer can be registered with the Tracer to receive notifications about +// new Spans. +// +// Deprecated: use jaeger.ContribObserver instead. +type Observer interface { + OnStartSpan(operationName string, options opentracing.StartSpanOptions) SpanObserver +} + +// SpanObserver is created by the Observer and receives notifications about +// other Span events. +// +// Deprecated: use jaeger.ContribSpanObserver instead. +type SpanObserver interface { + OnSetOperationName(operationName string) + OnSetTag(key string, value interface{}) + OnFinish(options opentracing.FinishOptions) +} + +// compositeObserver is a dispatcher to other observers +type compositeObserver struct { + observers []ContribObserver +} + +// compositeSpanObserver is a dispatcher to other span observers +type compositeSpanObserver struct { + observers []ContribSpanObserver +} + +// noopSpanObserver is used when there are no observers registered +// on the Tracer or none of them returns span observers from OnStartSpan. +var noopSpanObserver = &compositeSpanObserver{} + +func (o *compositeObserver) append(contribObserver ContribObserver) { + o.observers = append(o.observers, contribObserver) +} + +func (o *compositeObserver) OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) ContribSpanObserver { + var spanObservers []ContribSpanObserver + for _, obs := range o.observers { + spanObs, ok := obs.OnStartSpan(sp, operationName, options) + if ok { + if spanObservers == nil { + spanObservers = make([]ContribSpanObserver, 0, len(o.observers)) + } + spanObservers = append(spanObservers, spanObs) + } + } + if len(spanObservers) == 0 { + return noopSpanObserver + } + return &compositeSpanObserver{observers: spanObservers} +} + +func (o *compositeSpanObserver) OnSetOperationName(operationName string) { + for _, obs := range o.observers { + obs.OnSetOperationName(operationName) + } +} + +func (o *compositeSpanObserver) OnSetTag(key string, value interface{}) { + for _, obs := range o.observers { + obs.OnSetTag(key, value) + } +} + +func (o *compositeSpanObserver) OnFinish(options opentracing.FinishOptions) { + for _, obs := range o.observers { + obs.OnFinish(options) + } +} diff --git a/vendor/github.com/uber/jaeger-client-go/process.go b/vendor/github.com/uber/jaeger-client-go/process.go new file mode 100644 index 00000000..30cbf996 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/process.go @@ -0,0 +1,29 @@ +// Copyright (c) 2018 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +// Process holds process specific metadata that's relevant to this client. +type Process struct { + Service string + UUID string + Tags []Tag +} + +// ProcessSetter sets a process. This can be used by any class that requires +// the process to be set as part of initialization. +// See internal/throttler/remote/throttler.go for an example. +type ProcessSetter interface { + SetProcess(process Process) +} diff --git a/vendor/github.com/uber/jaeger-client-go/propagation.go b/vendor/github.com/uber/jaeger-client-go/propagation.go new file mode 100644 index 00000000..42fd64b5 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/propagation.go @@ -0,0 +1,313 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "bytes" + "encoding/binary" + "fmt" + "io" + "log" + "net/url" + "strings" + "sync" + + opentracing "github.com/opentracing/opentracing-go" +) + +// Injector is responsible for injecting SpanContext instances in a manner suitable +// for propagation via a format-specific "carrier" object. Typically the +// injection will take place across an RPC boundary, but message queues and +// other IPC mechanisms are also reasonable places to use an Injector. +type Injector interface { + // Inject takes `SpanContext` and injects it into `carrier`. The actual type + // of `carrier` depends on the `format` passed to `Tracer.Inject()`. + // + // Implementations may return opentracing.ErrInvalidCarrier or any other + // implementation-specific error if injection fails. + Inject(ctx SpanContext, carrier interface{}) error +} + +// Extractor is responsible for extracting SpanContext instances from a +// format-specific "carrier" object. Typically the extraction will take place +// on the server side of an RPC boundary, but message queues and other IPC +// mechanisms are also reasonable places to use an Extractor. +type Extractor interface { + // Extract decodes a SpanContext instance from the given `carrier`, + // or (nil, opentracing.ErrSpanContextNotFound) if no context could + // be found in the `carrier`. + Extract(carrier interface{}) (SpanContext, error) +} + +// TextMapPropagator is a combined Injector and Extractor for TextMap format +type TextMapPropagator struct { + headerKeys *HeadersConfig + metrics Metrics + encodeValue func(string) string + decodeValue func(string) string +} + +// NewTextMapPropagator creates a combined Injector and Extractor for TextMap format +func NewTextMapPropagator(headerKeys *HeadersConfig, metrics Metrics) *TextMapPropagator { + return &TextMapPropagator{ + headerKeys: headerKeys, + metrics: metrics, + encodeValue: func(val string) string { + return val + }, + decodeValue: func(val string) string { + return val + }, + } +} + +// NewHTTPHeaderPropagator creates a combined Injector and Extractor for HTTPHeaders format +func NewHTTPHeaderPropagator(headerKeys *HeadersConfig, metrics Metrics) *TextMapPropagator { + return &TextMapPropagator{ + headerKeys: headerKeys, + metrics: metrics, + encodeValue: func(val string) string { + return url.QueryEscape(val) + }, + decodeValue: func(val string) string { + // ignore decoding errors, cannot do anything about them + if v, err := url.QueryUnescape(val); err == nil { + return v + } + return val + }, + } +} + +// BinaryPropagator is a combined Injector and Extractor for Binary format +type BinaryPropagator struct { + tracer *Tracer + buffers sync.Pool +} + +// NewBinaryPropagator creates a combined Injector and Extractor for Binary format +func NewBinaryPropagator(tracer *Tracer) *BinaryPropagator { + return &BinaryPropagator{ + tracer: tracer, + buffers: sync.Pool{New: func() interface{} { return &bytes.Buffer{} }}, + } +} + +// Inject implements Injector of TextMapPropagator +func (p *TextMapPropagator) Inject( + sc SpanContext, + abstractCarrier interface{}, +) error { + textMapWriter, ok := abstractCarrier.(opentracing.TextMapWriter) + if !ok { + return opentracing.ErrInvalidCarrier + } + + // Do not encode the string with trace context to avoid accidental double-encoding + // if people are using opentracing < 0.10.0. Our colon-separated representation + // of the trace context is already safe for HTTP headers. + textMapWriter.Set(p.headerKeys.TraceContextHeaderName, sc.String()) + for k, v := range sc.baggage { + safeKey := p.addBaggageKeyPrefix(k) + safeVal := p.encodeValue(v) + textMapWriter.Set(safeKey, safeVal) + } + return nil +} + +// Extract implements Extractor of TextMapPropagator +func (p *TextMapPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { + textMapReader, ok := abstractCarrier.(opentracing.TextMapReader) + if !ok { + return emptyContext, opentracing.ErrInvalidCarrier + } + var ctx SpanContext + var baggage map[string]string + err := textMapReader.ForeachKey(func(rawKey, value string) error { + key := strings.ToLower(rawKey) // TODO not necessary for plain TextMap + if key == p.headerKeys.TraceContextHeaderName { + var err error + safeVal := p.decodeValue(value) + if ctx, err = ContextFromString(safeVal); err != nil { + return err + } + } else if key == p.headerKeys.JaegerDebugHeader { + ctx.debugID = p.decodeValue(value) + } else if key == p.headerKeys.JaegerBaggageHeader { + if baggage == nil { + baggage = make(map[string]string) + } + for k, v := range p.parseCommaSeparatedMap(value) { + baggage[k] = v + } + } else if strings.HasPrefix(key, p.headerKeys.TraceBaggageHeaderPrefix) { + if baggage == nil { + baggage = make(map[string]string) + } + safeKey := p.removeBaggageKeyPrefix(key) + safeVal := p.decodeValue(value) + baggage[safeKey] = safeVal + } + return nil + }) + if err != nil { + p.metrics.DecodingErrors.Inc(1) + return emptyContext, err + } + if !ctx.traceID.IsValid() && ctx.debugID == "" && len(baggage) == 0 { + return emptyContext, opentracing.ErrSpanContextNotFound + } + ctx.baggage = baggage + return ctx, nil +} + +// Inject implements Injector of BinaryPropagator +func (p *BinaryPropagator) Inject( + sc SpanContext, + abstractCarrier interface{}, +) error { + carrier, ok := abstractCarrier.(io.Writer) + if !ok { + return opentracing.ErrInvalidCarrier + } + + // Handle the tracer context + if err := binary.Write(carrier, binary.BigEndian, sc.traceID); err != nil { + return err + } + if err := binary.Write(carrier, binary.BigEndian, sc.spanID); err != nil { + return err + } + if err := binary.Write(carrier, binary.BigEndian, sc.parentID); err != nil { + return err + } + if err := binary.Write(carrier, binary.BigEndian, sc.samplingState.flags()); err != nil { + return err + } + + // Handle the baggage items + if err := binary.Write(carrier, binary.BigEndian, int32(len(sc.baggage))); err != nil { + return err + } + for k, v := range sc.baggage { + if err := binary.Write(carrier, binary.BigEndian, int32(len(k))); err != nil { + return err + } + io.WriteString(carrier, k) + if err := binary.Write(carrier, binary.BigEndian, int32(len(v))); err != nil { + return err + } + io.WriteString(carrier, v) + } + + return nil +} + +// Extract implements Extractor of BinaryPropagator +func (p *BinaryPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { + carrier, ok := abstractCarrier.(io.Reader) + if !ok { + return emptyContext, opentracing.ErrInvalidCarrier + } + var ctx SpanContext + ctx.samplingState = &samplingState{} + + if err := binary.Read(carrier, binary.BigEndian, &ctx.traceID); err != nil { + return emptyContext, opentracing.ErrSpanContextCorrupted + } + if err := binary.Read(carrier, binary.BigEndian, &ctx.spanID); err != nil { + return emptyContext, opentracing.ErrSpanContextCorrupted + } + if err := binary.Read(carrier, binary.BigEndian, &ctx.parentID); err != nil { + return emptyContext, opentracing.ErrSpanContextCorrupted + } + + var flags byte + if err := binary.Read(carrier, binary.BigEndian, &flags); err != nil { + return emptyContext, opentracing.ErrSpanContextCorrupted + } + ctx.samplingState.setFlags(flags) + + // Handle the baggage items + var numBaggage int32 + if err := binary.Read(carrier, binary.BigEndian, &numBaggage); err != nil { + return emptyContext, opentracing.ErrSpanContextCorrupted + } + if iNumBaggage := int(numBaggage); iNumBaggage > 0 { + ctx.baggage = make(map[string]string, iNumBaggage) + buf := p.buffers.Get().(*bytes.Buffer) + defer p.buffers.Put(buf) + + var keyLen, valLen int32 + for i := 0; i < iNumBaggage; i++ { + if err := binary.Read(carrier, binary.BigEndian, &keyLen); err != nil { + return emptyContext, opentracing.ErrSpanContextCorrupted + } + buf.Reset() + buf.Grow(int(keyLen)) + if n, err := io.CopyN(buf, carrier, int64(keyLen)); err != nil || int32(n) != keyLen { + return emptyContext, opentracing.ErrSpanContextCorrupted + } + key := buf.String() + + if err := binary.Read(carrier, binary.BigEndian, &valLen); err != nil { + return emptyContext, opentracing.ErrSpanContextCorrupted + } + buf.Reset() + buf.Grow(int(valLen)) + if n, err := io.CopyN(buf, carrier, int64(valLen)); err != nil || int32(n) != valLen { + return emptyContext, opentracing.ErrSpanContextCorrupted + } + ctx.baggage[key] = buf.String() + } + } + + return ctx, nil +} + +// Converts a comma separated key value pair list into a map +// e.g. key1=value1, key2=value2, key3 = value3 +// is converted to map[string]string { "key1" : "value1", +// "key2" : "value2", +// "key3" : "value3" } +func (p *TextMapPropagator) parseCommaSeparatedMap(value string) map[string]string { + baggage := make(map[string]string) + value, err := url.QueryUnescape(value) + if err != nil { + log.Printf("Unable to unescape %s, %v", value, err) + return baggage + } + for _, kvpair := range strings.Split(value, ",") { + kv := strings.Split(strings.TrimSpace(kvpair), "=") + if len(kv) == 2 { + baggage[kv[0]] = kv[1] + } else { + log.Printf("Malformed value passed in for %s", p.headerKeys.JaegerBaggageHeader) + } + } + return baggage +} + +// Converts a baggage item key into an http header format, +// by prepending TraceBaggageHeaderPrefix and encoding the key string +func (p *TextMapPropagator) addBaggageKeyPrefix(key string) string { + // TODO encodeBaggageKeyAsHeader add caching and escaping + return fmt.Sprintf("%v%v", p.headerKeys.TraceBaggageHeaderPrefix, key) +} + +func (p *TextMapPropagator) removeBaggageKeyPrefix(key string) string { + // TODO decodeBaggageHeaderKey add caching and escaping + return key[len(p.headerKeys.TraceBaggageHeaderPrefix):] +} diff --git a/vendor/github.com/uber/jaeger-client-go/reference.go b/vendor/github.com/uber/jaeger-client-go/reference.go new file mode 100644 index 00000000..5646e78b --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/reference.go @@ -0,0 +1,23 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import "github.com/opentracing/opentracing-go" + +// Reference represents a causal reference to other Spans (via their SpanContext). +type Reference struct { + Type opentracing.SpanReferenceType + Context SpanContext +} diff --git a/vendor/github.com/uber/jaeger-client-go/reporter.go b/vendor/github.com/uber/jaeger-client-go/reporter.go new file mode 100644 index 00000000..a71a92c3 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/reporter.go @@ -0,0 +1,322 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "fmt" + "sync" + "sync/atomic" + "time" + + "github.com/opentracing/opentracing-go" + + "github.com/uber/jaeger-client-go/internal/reporterstats" + "github.com/uber/jaeger-client-go/log" +) + +// Reporter is called by the tracer when a span is completed to report the span to the tracing collector. +type Reporter interface { + // Report submits a new span to collectors, possibly asynchronously and/or with buffering. + // If the reporter is processing Span asynchronously then it needs to Retain() the span, + // and then Release() it when no longer needed, to avoid span data corruption. + Report(span *Span) + + // Close does a clean shutdown of the reporter, flushing any traces that may be buffered in memory. + Close() +} + +// ------------------------------ + +type nullReporter struct{} + +// NewNullReporter creates a no-op reporter that ignores all reported spans. +func NewNullReporter() Reporter { + return &nullReporter{} +} + +// Report implements Report() method of Reporter by doing nothing. +func (r *nullReporter) Report(span *Span) { + // no-op +} + +// Close implements Close() method of Reporter by doing nothing. +func (r *nullReporter) Close() { + // no-op +} + +// ------------------------------ + +type loggingReporter struct { + logger Logger +} + +// NewLoggingReporter creates a reporter that logs all reported spans to provided logger. +func NewLoggingReporter(logger Logger) Reporter { + return &loggingReporter{logger} +} + +// Report implements Report() method of Reporter by logging the span to the logger. +func (r *loggingReporter) Report(span *Span) { + r.logger.Infof("Reporting span %+v", span) +} + +// Close implements Close() method of Reporter by doing nothing. +func (r *loggingReporter) Close() { + // no-op +} + +// ------------------------------ + +// InMemoryReporter is used for testing, and simply collects spans in memory. +type InMemoryReporter struct { + spans []opentracing.Span + lock sync.Mutex +} + +// NewInMemoryReporter creates a reporter that stores spans in memory. +// NOTE: the Tracer should be created with options.PoolSpans = false. +func NewInMemoryReporter() *InMemoryReporter { + return &InMemoryReporter{ + spans: make([]opentracing.Span, 0, 10), + } +} + +// Report implements Report() method of Reporter by storing the span in the buffer. +func (r *InMemoryReporter) Report(span *Span) { + r.lock.Lock() + // Need to retain the span otherwise it will be released + r.spans = append(r.spans, span.Retain()) + r.lock.Unlock() +} + +// Close implements Close() method of Reporter +func (r *InMemoryReporter) Close() { + r.Reset() +} + +// SpansSubmitted returns the number of spans accumulated in the buffer. +func (r *InMemoryReporter) SpansSubmitted() int { + r.lock.Lock() + defer r.lock.Unlock() + return len(r.spans) +} + +// GetSpans returns accumulated spans as a copy of the buffer. +func (r *InMemoryReporter) GetSpans() []opentracing.Span { + r.lock.Lock() + defer r.lock.Unlock() + copied := make([]opentracing.Span, len(r.spans)) + copy(copied, r.spans) + return copied +} + +// Reset clears all accumulated spans. +func (r *InMemoryReporter) Reset() { + r.lock.Lock() + defer r.lock.Unlock() + + // Before reset the collection need to release Span memory + for _, span := range r.spans { + span.(*Span).Release() + } + r.spans = r.spans[:0] +} + +// ------------------------------ + +type compositeReporter struct { + reporters []Reporter +} + +// NewCompositeReporter creates a reporter that ignores all reported spans. +func NewCompositeReporter(reporters ...Reporter) Reporter { + return &compositeReporter{reporters: reporters} +} + +// Report implements Report() method of Reporter by delegating to each underlying reporter. +func (r *compositeReporter) Report(span *Span) { + for _, reporter := range r.reporters { + reporter.Report(span) + } +} + +// Close implements Close() method of Reporter by closing each underlying reporter. +func (r *compositeReporter) Close() { + for _, reporter := range r.reporters { + reporter.Close() + } +} + +// ------------- REMOTE REPORTER ----------------- + +type reporterQueueItemType int + +const ( + defaultQueueSize = 100 + defaultBufferFlushInterval = 1 * time.Second + + reporterQueueItemSpan reporterQueueItemType = iota + reporterQueueItemClose +) + +type reporterQueueItem struct { + itemType reporterQueueItemType + span *Span + close *sync.WaitGroup +} + +// reporterStats implements reporterstats.ReporterStats. +type reporterStats struct { + droppedCount int64 // provided to Transports to report data loss to the backend +} + +// SpansDroppedFromQueue implements reporterstats.ReporterStats. +func (r *reporterStats) SpansDroppedFromQueue() int64 { + return atomic.LoadInt64(&r.droppedCount) +} + +func (r *reporterStats) incDroppedCount() { + atomic.AddInt64(&r.droppedCount, 1) +} + +type remoteReporter struct { + // These fields must be first in the struct because `sync/atomic` expects 64-bit alignment. + // Cf. https://github.com/uber/jaeger-client-go/issues/155, https://goo.gl/zW7dgq + queueLength int64 // used to update metrics.Gauge + closed int64 // 0 - not closed, 1 - closed + + reporterOptions + + sender Transport + queue chan reporterQueueItem + reporterStats *reporterStats +} + +// NewRemoteReporter creates a new reporter that sends spans out of process by means of Sender. +// Calls to Report(Span) return immediately (side effect: if internal buffer is full the span is dropped). +// Periodically the transport buffer is flushed even if it hasn't reached max packet size. +// Calls to Close() block until all spans reported prior to the call to Close are flushed. +func NewRemoteReporter(sender Transport, opts ...ReporterOption) Reporter { + options := reporterOptions{} + for _, option := range opts { + option(&options) + } + if options.bufferFlushInterval <= 0 { + options.bufferFlushInterval = defaultBufferFlushInterval + } + if options.logger == nil { + options.logger = log.NullLogger + } + if options.metrics == nil { + options.metrics = NewNullMetrics() + } + if options.queueSize <= 0 { + options.queueSize = defaultQueueSize + } + reporter := &remoteReporter{ + reporterOptions: options, + sender: sender, + queue: make(chan reporterQueueItem, options.queueSize), + reporterStats: new(reporterStats), + } + if receiver, ok := sender.(reporterstats.Receiver); ok { + receiver.SetReporterStats(reporter.reporterStats) + } + go reporter.processQueue() + return reporter +} + +// Report implements Report() method of Reporter. +// It passes the span to a background go-routine for submission to Jaeger backend. +// If the internal queue is full, the span is dropped and metrics.ReporterDropped counter is incremented. +// If Report() is called after the reporter has been Close()-ed, the additional spans will not be +// sent to the backend, but the metrics.ReporterDropped counter may not reflect them correctly, +// because some of them may still be successfully added to the queue. +func (r *remoteReporter) Report(span *Span) { + select { + // Need to retain the span otherwise it will be released + case r.queue <- reporterQueueItem{itemType: reporterQueueItemSpan, span: span.Retain()}: + atomic.AddInt64(&r.queueLength, 1) + default: + r.metrics.ReporterDropped.Inc(1) + r.reporterStats.incDroppedCount() + } +} + +// Close implements Close() method of Reporter by waiting for the queue to be drained. +func (r *remoteReporter) Close() { + r.logger.Debugf("closing reporter") + if swapped := atomic.CompareAndSwapInt64(&r.closed, 0, 1); !swapped { + r.logger.Error("Repeated attempt to close the reporter is ignored") + return + } + r.sendCloseEvent() + _ = r.sender.Close() +} + +func (r *remoteReporter) sendCloseEvent() { + wg := &sync.WaitGroup{} + wg.Add(1) + item := reporterQueueItem{itemType: reporterQueueItemClose, close: wg} + + r.queue <- item // if the queue is full we will block until there is space + atomic.AddInt64(&r.queueLength, 1) + wg.Wait() +} + +// processQueue reads spans from the queue, converts them to Thrift, and stores them in an internal buffer. +// When the buffer length reaches batchSize, it is flushed by submitting the accumulated spans to Jaeger. +// Buffer also gets flushed automatically every batchFlushInterval seconds, just in case the tracer stopped +// reporting new spans. +func (r *remoteReporter) processQueue() { + // flush causes the Sender to flush its accumulated spans and clear the buffer + flush := func() { + if flushed, err := r.sender.Flush(); err != nil { + r.metrics.ReporterFailure.Inc(int64(flushed)) + r.logger.Error(fmt.Sprintf("failed to flush Jaeger spans to server: %s", err.Error())) + } else if flushed > 0 { + r.metrics.ReporterSuccess.Inc(int64(flushed)) + } + } + + timer := time.NewTicker(r.bufferFlushInterval) + for { + select { + case <-timer.C: + flush() + case item := <-r.queue: + atomic.AddInt64(&r.queueLength, -1) + switch item.itemType { + case reporterQueueItemSpan: + span := item.span + if flushed, err := r.sender.Append(span); err != nil { + r.metrics.ReporterFailure.Inc(int64(flushed)) + r.logger.Error(fmt.Sprintf("error reporting Jaeger span %q: %s", span.OperationName(), err.Error())) + } else if flushed > 0 { + r.metrics.ReporterSuccess.Inc(int64(flushed)) + // to reduce the number of gauge stats, we only emit queue length on flush + r.metrics.ReporterQueueLength.Update(atomic.LoadInt64(&r.queueLength)) + r.logger.Debugf("flushed %d spans", flushed) + } + span.Release() + case reporterQueueItemClose: + timer.Stop() + flush() + item.close.Done() + return + } + } + } +} diff --git a/vendor/github.com/uber/jaeger-client-go/reporter_options.go b/vendor/github.com/uber/jaeger-client-go/reporter_options.go new file mode 100644 index 00000000..2fc03054 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/reporter_options.go @@ -0,0 +1,71 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "time" + + "github.com/uber/jaeger-client-go/log" +) + +// ReporterOption is a function that sets some option on the reporter. +type ReporterOption func(c *reporterOptions) + +// ReporterOptions is a factory for all available ReporterOption's +var ReporterOptions reporterOptions + +// reporterOptions control behavior of the reporter. +type reporterOptions struct { + // queueSize is the size of internal queue where reported spans are stored before they are processed in the background + queueSize int + // bufferFlushInterval is how often the buffer is force-flushed, even if it's not full + bufferFlushInterval time.Duration + // logger is used to log errors of span submissions + logger log.DebugLogger + // metrics is used to record runtime stats + metrics *Metrics +} + +// QueueSize creates a ReporterOption that sets the size of the internal queue where +// spans are stored before they are processed. +func (reporterOptions) QueueSize(queueSize int) ReporterOption { + return func(r *reporterOptions) { + r.queueSize = queueSize + } +} + +// Metrics creates a ReporterOption that initializes Metrics in the reporter, +// which is used to record runtime statistics. +func (reporterOptions) Metrics(metrics *Metrics) ReporterOption { + return func(r *reporterOptions) { + r.metrics = metrics + } +} + +// BufferFlushInterval creates a ReporterOption that sets how often the queue +// is force-flushed. +func (reporterOptions) BufferFlushInterval(bufferFlushInterval time.Duration) ReporterOption { + return func(r *reporterOptions) { + r.bufferFlushInterval = bufferFlushInterval + } +} + +// Logger creates a ReporterOption that initializes the logger used to log +// errors of span submissions. +func (reporterOptions) Logger(logger Logger) ReporterOption { + return func(r *reporterOptions) { + r.logger = log.DebugLogAdapter(logger) + } +} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md new file mode 100644 index 00000000..879948e9 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md @@ -0,0 +1,5 @@ +An Observer that can be used to emit RPC metrics +================================================ + +It can be attached to the tracer during tracer construction. +See `ExampleObserver` function in [observer_test.go](./observer_test.go). diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go new file mode 100644 index 00000000..51aa11b3 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go @@ -0,0 +1,16 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package rpcmetrics implements an Observer that can be used to emit RPC metrics. +package rpcmetrics diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go new file mode 100644 index 00000000..30555243 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go @@ -0,0 +1,63 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rpcmetrics + +import "sync" + +// normalizedEndpoints is a cache for endpointName -> safeName mappings. +type normalizedEndpoints struct { + names map[string]string + maxSize int + defaultName string + normalizer NameNormalizer + mux sync.RWMutex +} + +func newNormalizedEndpoints(maxSize int, normalizer NameNormalizer) *normalizedEndpoints { + return &normalizedEndpoints{ + maxSize: maxSize, + normalizer: normalizer, + names: make(map[string]string, maxSize), + } +} + +// normalize looks up the name in the cache, if not found it uses normalizer +// to convert the name to a safe name. If called with more than maxSize unique +// names it returns "" for all other names beyond those already cached. +func (n *normalizedEndpoints) normalize(name string) string { + n.mux.RLock() + norm, ok := n.names[name] + l := len(n.names) + n.mux.RUnlock() + if ok { + return norm + } + if l >= n.maxSize { + return "" + } + return n.normalizeWithLock(name) +} + +func (n *normalizedEndpoints) normalizeWithLock(name string) string { + norm := n.normalizer.Normalize(name) + n.mux.Lock() + defer n.mux.Unlock() + // cache may have grown while we were not holding the lock + if len(n.names) >= n.maxSize { + return "" + } + n.names[name] = norm + return norm +} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go new file mode 100644 index 00000000..a8cec2fa --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go @@ -0,0 +1,124 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rpcmetrics + +import ( + "sync" + + "github.com/uber/jaeger-lib/metrics" +) + +const ( + otherEndpointsPlaceholder = "other" + endpointNameMetricTag = "endpoint" +) + +// Metrics is a collection of metrics for an endpoint describing +// throughput, success, errors, and performance. +type Metrics struct { + // RequestCountSuccess is a counter of the total number of successes. + RequestCountSuccess metrics.Counter `metric:"requests" tags:"error=false"` + + // RequestCountFailures is a counter of the number of times any failure has been observed. + RequestCountFailures metrics.Counter `metric:"requests" tags:"error=true"` + + // RequestLatencySuccess is a latency histogram of successful requests. + RequestLatencySuccess metrics.Timer `metric:"request_latency" tags:"error=false"` + + // RequestLatencyFailures is a latency histogram of failed requests. + RequestLatencyFailures metrics.Timer `metric:"request_latency" tags:"error=true"` + + // HTTPStatusCode2xx is a counter of the total number of requests with HTTP status code 200-299 + HTTPStatusCode2xx metrics.Counter `metric:"http_requests" tags:"status_code=2xx"` + + // HTTPStatusCode3xx is a counter of the total number of requests with HTTP status code 300-399 + HTTPStatusCode3xx metrics.Counter `metric:"http_requests" tags:"status_code=3xx"` + + // HTTPStatusCode4xx is a counter of the total number of requests with HTTP status code 400-499 + HTTPStatusCode4xx metrics.Counter `metric:"http_requests" tags:"status_code=4xx"` + + // HTTPStatusCode5xx is a counter of the total number of requests with HTTP status code 500-599 + HTTPStatusCode5xx metrics.Counter `metric:"http_requests" tags:"status_code=5xx"` +} + +func (m *Metrics) recordHTTPStatusCode(statusCode uint16) { + if statusCode >= 200 && statusCode < 300 { + m.HTTPStatusCode2xx.Inc(1) + } else if statusCode >= 300 && statusCode < 400 { + m.HTTPStatusCode3xx.Inc(1) + } else if statusCode >= 400 && statusCode < 500 { + m.HTTPStatusCode4xx.Inc(1) + } else if statusCode >= 500 && statusCode < 600 { + m.HTTPStatusCode5xx.Inc(1) + } +} + +// MetricsByEndpoint is a registry/cache of metrics for each unique endpoint name. +// Only maxNumberOfEndpoints Metrics are stored, all other endpoint names are mapped +// to a generic endpoint name "other". +type MetricsByEndpoint struct { + metricsFactory metrics.Factory + endpoints *normalizedEndpoints + metricsByEndpoint map[string]*Metrics + mux sync.RWMutex +} + +func newMetricsByEndpoint( + metricsFactory metrics.Factory, + normalizer NameNormalizer, + maxNumberOfEndpoints int, +) *MetricsByEndpoint { + return &MetricsByEndpoint{ + metricsFactory: metricsFactory, + endpoints: newNormalizedEndpoints(maxNumberOfEndpoints, normalizer), + metricsByEndpoint: make(map[string]*Metrics, maxNumberOfEndpoints+1), // +1 for "other" + } +} + +func (m *MetricsByEndpoint) get(endpoint string) *Metrics { + safeName := m.endpoints.normalize(endpoint) + if safeName == "" { + safeName = otherEndpointsPlaceholder + } + m.mux.RLock() + met := m.metricsByEndpoint[safeName] + m.mux.RUnlock() + if met != nil { + return met + } + + return m.getWithWriteLock(safeName) +} + +// split to make easier to test +func (m *MetricsByEndpoint) getWithWriteLock(safeName string) *Metrics { + m.mux.Lock() + defer m.mux.Unlock() + + // it is possible that the name has been already registered after we released + // the read lock and before we grabbed the write lock, so check for that. + if met, ok := m.metricsByEndpoint[safeName]; ok { + return met + } + + // it would be nice to create the struct before locking, since Init() is somewhat + // expensive, however some metrics backends (e.g. expvar) may not like duplicate metrics. + met := &Metrics{} + tags := map[string]string{endpointNameMetricTag: safeName} + metrics.Init(met, m.metricsFactory, tags) + + m.metricsByEndpoint[safeName] = met + return met +} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go new file mode 100644 index 00000000..148d84b3 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go @@ -0,0 +1,101 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rpcmetrics + +// NameNormalizer is used to convert the endpoint names to strings +// that can be safely used as tags in the metrics. +type NameNormalizer interface { + Normalize(name string) string +} + +// DefaultNameNormalizer converts endpoint names so that they contain only characters +// from the safe charset [a-zA-Z0-9-./_]. All other characters are replaced with '-'. +var DefaultNameNormalizer = &SimpleNameNormalizer{ + SafeSets: []SafeCharacterSet{ + &Range{From: 'a', To: 'z'}, + &Range{From: 'A', To: 'Z'}, + &Range{From: '0', To: '9'}, + &Char{'-'}, + &Char{'_'}, + &Char{'/'}, + &Char{'.'}, + }, + Replacement: '-', +} + +// SimpleNameNormalizer uses a set of safe character sets. +type SimpleNameNormalizer struct { + SafeSets []SafeCharacterSet + Replacement byte +} + +// SafeCharacterSet determines if the given character is "safe" +type SafeCharacterSet interface { + IsSafe(c byte) bool +} + +// Range implements SafeCharacterSet +type Range struct { + From, To byte +} + +// IsSafe implements SafeCharacterSet +func (r *Range) IsSafe(c byte) bool { + return c >= r.From && c <= r.To +} + +// Char implements SafeCharacterSet +type Char struct { + Val byte +} + +// IsSafe implements SafeCharacterSet +func (ch *Char) IsSafe(c byte) bool { + return c == ch.Val +} + +// Normalize checks each character in the string against SafeSets, +// and if it's not safe substitutes it with Replacement. +func (n *SimpleNameNormalizer) Normalize(name string) string { + var retMe []byte + nameBytes := []byte(name) + for i, b := range nameBytes { + if n.safeByte(b) { + if retMe != nil { + retMe[i] = b + } + } else { + if retMe == nil { + retMe = make([]byte, len(nameBytes)) + copy(retMe[0:i], nameBytes[0:i]) + } + retMe[i] = n.Replacement + } + } + if retMe == nil { + return name + } + return string(retMe) +} + +// safeByte checks if b against all safe charsets. +func (n *SimpleNameNormalizer) safeByte(b byte) bool { + for i := range n.SafeSets { + if n.SafeSets[i].IsSafe(b) { + return true + } + } + return false +} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go new file mode 100644 index 00000000..eca5ff6f --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go @@ -0,0 +1,171 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rpcmetrics + +import ( + "strconv" + "sync" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + "github.com/uber/jaeger-lib/metrics" + + jaeger "github.com/uber/jaeger-client-go" +) + +const defaultMaxNumberOfEndpoints = 200 + +// Observer is an observer that can emit RPC metrics. +type Observer struct { + metricsByEndpoint *MetricsByEndpoint +} + +// NewObserver creates a new observer that can emit RPC metrics. +func NewObserver(metricsFactory metrics.Factory, normalizer NameNormalizer) *Observer { + return &Observer{ + metricsByEndpoint: newMetricsByEndpoint( + metricsFactory, + normalizer, + defaultMaxNumberOfEndpoints, + ), + } +} + +// OnStartSpan creates a new Observer for the span. +func (o *Observer) OnStartSpan( + operationName string, + options opentracing.StartSpanOptions, +) jaeger.SpanObserver { + return NewSpanObserver(o.metricsByEndpoint, operationName, options) +} + +// SpanKind identifies the span as inboud, outbound, or internal +type SpanKind int + +const ( + // Local span kind + Local SpanKind = iota + // Inbound span kind + Inbound + // Outbound span kind + Outbound +) + +// SpanObserver collects RPC metrics +type SpanObserver struct { + metricsByEndpoint *MetricsByEndpoint + operationName string + startTime time.Time + mux sync.Mutex + kind SpanKind + httpStatusCode uint16 + err bool +} + +// NewSpanObserver creates a new SpanObserver that can emit RPC metrics. +func NewSpanObserver( + metricsByEndpoint *MetricsByEndpoint, + operationName string, + options opentracing.StartSpanOptions, +) *SpanObserver { + so := &SpanObserver{ + metricsByEndpoint: metricsByEndpoint, + operationName: operationName, + startTime: options.StartTime, + } + for k, v := range options.Tags { + so.handleTagInLock(k, v) + } + return so +} + +// handleTags watches for special tags +// - SpanKind +// - HttpStatusCode +// - Error +func (so *SpanObserver) handleTagInLock(key string, value interface{}) { + if key == string(ext.SpanKind) { + if v, ok := value.(ext.SpanKindEnum); ok { + value = string(v) + } + if v, ok := value.(string); ok { + if v == string(ext.SpanKindRPCClientEnum) { + so.kind = Outbound + } else if v == string(ext.SpanKindRPCServerEnum) { + so.kind = Inbound + } + } + return + } + if key == string(ext.HTTPStatusCode) { + if v, ok := value.(uint16); ok { + so.httpStatusCode = v + } else if v, ok := value.(int); ok { + so.httpStatusCode = uint16(v) + } else if v, ok := value.(string); ok { + if vv, err := strconv.Atoi(v); err == nil { + so.httpStatusCode = uint16(vv) + } + } + return + } + if key == string(ext.Error) { + if v, ok := value.(bool); ok { + so.err = v + } else if v, ok := value.(string); ok { + if vv, err := strconv.ParseBool(v); err == nil { + so.err = vv + } + } + return + } +} + +// OnFinish emits the RPC metrics. It only has an effect when operation name +// is not blank, and the span kind is an RPC server. +func (so *SpanObserver) OnFinish(options opentracing.FinishOptions) { + so.mux.Lock() + defer so.mux.Unlock() + + if so.operationName == "" || so.kind != Inbound { + return + } + + mets := so.metricsByEndpoint.get(so.operationName) + latency := options.FinishTime.Sub(so.startTime) + if so.err { + mets.RequestCountFailures.Inc(1) + mets.RequestLatencyFailures.Record(latency) + } else { + mets.RequestCountSuccess.Inc(1) + mets.RequestLatencySuccess.Record(latency) + } + mets.recordHTTPStatusCode(so.httpStatusCode) +} + +// OnSetOperationName records new operation name. +func (so *SpanObserver) OnSetOperationName(operationName string) { + so.mux.Lock() + so.operationName = operationName + so.mux.Unlock() +} + +// OnSetTag implements SpanObserver +func (so *SpanObserver) OnSetTag(key string, value interface{}) { + so.mux.Lock() + so.handleTagInLock(key, value) + so.mux.Unlock() +} diff --git a/vendor/github.com/uber/jaeger-client-go/sampler.go b/vendor/github.com/uber/jaeger-client-go/sampler.go new file mode 100644 index 00000000..d0be8ad5 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/sampler.go @@ -0,0 +1,516 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "fmt" + "math" + "strings" + "sync" + + "github.com/uber/jaeger-client-go/thrift-gen/sampling" + "github.com/uber/jaeger-client-go/utils" +) + +const ( + defaultMaxOperations = 2000 +) + +// Sampler decides whether a new trace should be sampled or not. +type Sampler interface { + // IsSampled decides whether a trace with given `id` and `operation` + // should be sampled. This function will also return the tags that + // can be used to identify the type of sampling that was applied to + // the root span. Most simple samplers would return two tags, + // sampler.type and sampler.param, similar to those used in the Configuration + IsSampled(id TraceID, operation string) (sampled bool, tags []Tag) + + // Close does a clean shutdown of the sampler, stopping any background + // go-routines it may have started. + Close() + + // Equal checks if the `other` sampler is functionally equivalent + // to this sampler. + // TODO (breaking change) remove this function. See PerOperationSampler.Equals for explanation. + Equal(other Sampler) bool +} + +// ----------------------- + +// ConstSampler is a sampler that always makes the same decision. +type ConstSampler struct { + legacySamplerV1Base + Decision bool + tags []Tag +} + +// NewConstSampler creates a ConstSampler. +func NewConstSampler(sample bool) *ConstSampler { + tags := []Tag{ + {key: SamplerTypeTagKey, value: SamplerTypeConst}, + {key: SamplerParamTagKey, value: sample}, + } + s := &ConstSampler{ + Decision: sample, + tags: tags, + } + s.delegate = s.IsSampled + return s +} + +// IsSampled implements IsSampled() of Sampler. +func (s *ConstSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { + return s.Decision, s.tags +} + +// Close implements Close() of Sampler. +func (s *ConstSampler) Close() { + // nothing to do +} + +// Equal implements Equal() of Sampler. +func (s *ConstSampler) Equal(other Sampler) bool { + if o, ok := other.(*ConstSampler); ok { + return s.Decision == o.Decision + } + return false +} + +// String is used to log sampler details. +func (s *ConstSampler) String() string { + return fmt.Sprintf("ConstSampler(decision=%t)", s.Decision) +} + +// ----------------------- + +// ProbabilisticSampler is a sampler that randomly samples a certain percentage +// of traces. +type ProbabilisticSampler struct { + legacySamplerV1Base + samplingRate float64 + samplingBoundary uint64 + tags []Tag +} + +const maxRandomNumber = ^(uint64(1) << 63) // i.e. 0x7fffffffffffffff + +// NewProbabilisticSampler creates a sampler that randomly samples a certain percentage of traces specified by the +// samplingRate, in the range between 0.0 and 1.0. +// +// It relies on the fact that new trace IDs are 63bit random numbers themselves, thus making the sampling decision +// without generating a new random number, but simply calculating if traceID < (samplingRate * 2^63). +// TODO remove the error from this function for next major release +func NewProbabilisticSampler(samplingRate float64) (*ProbabilisticSampler, error) { + if samplingRate < 0.0 || samplingRate > 1.0 { + return nil, fmt.Errorf("Sampling Rate must be between 0.0 and 1.0, received %f", samplingRate) + } + return newProbabilisticSampler(samplingRate), nil +} + +func newProbabilisticSampler(samplingRate float64) *ProbabilisticSampler { + s := new(ProbabilisticSampler) + s.delegate = s.IsSampled + return s.init(samplingRate) +} + +func (s *ProbabilisticSampler) init(samplingRate float64) *ProbabilisticSampler { + s.samplingRate = math.Max(0.0, math.Min(samplingRate, 1.0)) + s.samplingBoundary = uint64(float64(maxRandomNumber) * s.samplingRate) + s.tags = []Tag{ + {key: SamplerTypeTagKey, value: SamplerTypeProbabilistic}, + {key: SamplerParamTagKey, value: s.samplingRate}, + } + return s +} + +// SamplingRate returns the sampling probability this sampled was constructed with. +func (s *ProbabilisticSampler) SamplingRate() float64 { + return s.samplingRate +} + +// IsSampled implements IsSampled() of Sampler. +func (s *ProbabilisticSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { + return s.samplingBoundary >= id.Low&maxRandomNumber, s.tags +} + +// Close implements Close() of Sampler. +func (s *ProbabilisticSampler) Close() { + // nothing to do +} + +// Equal implements Equal() of Sampler. +func (s *ProbabilisticSampler) Equal(other Sampler) bool { + if o, ok := other.(*ProbabilisticSampler); ok { + return s.samplingBoundary == o.samplingBoundary + } + return false +} + +// Update modifies in-place the sampling rate. Locking must be done externally. +func (s *ProbabilisticSampler) Update(samplingRate float64) error { + if samplingRate < 0.0 || samplingRate > 1.0 { + return fmt.Errorf("Sampling Rate must be between 0.0 and 1.0, received %f", samplingRate) + } + s.init(samplingRate) + return nil +} + +// String is used to log sampler details. +func (s *ProbabilisticSampler) String() string { + return fmt.Sprintf("ProbabilisticSampler(samplingRate=%v)", s.samplingRate) +} + +// ----------------------- + +// RateLimitingSampler samples at most maxTracesPerSecond. The distribution of sampled traces follows +// burstiness of the service, i.e. a service with uniformly distributed requests will have those +// requests sampled uniformly as well, but if requests are bursty, especially sub-second, then a +// number of sequential requests can be sampled each second. +type RateLimitingSampler struct { + legacySamplerV1Base + maxTracesPerSecond float64 + rateLimiter *utils.ReconfigurableRateLimiter + tags []Tag +} + +// NewRateLimitingSampler creates new RateLimitingSampler. +func NewRateLimitingSampler(maxTracesPerSecond float64) *RateLimitingSampler { + s := new(RateLimitingSampler) + s.delegate = s.IsSampled + return s.init(maxTracesPerSecond) +} + +func (s *RateLimitingSampler) init(maxTracesPerSecond float64) *RateLimitingSampler { + if s.rateLimiter == nil { + s.rateLimiter = utils.NewRateLimiter(maxTracesPerSecond, math.Max(maxTracesPerSecond, 1.0)) + } else { + s.rateLimiter.Update(maxTracesPerSecond, math.Max(maxTracesPerSecond, 1.0)) + } + s.maxTracesPerSecond = maxTracesPerSecond + s.tags = []Tag{ + {key: SamplerTypeTagKey, value: SamplerTypeRateLimiting}, + {key: SamplerParamTagKey, value: maxTracesPerSecond}, + } + return s +} + +// IsSampled implements IsSampled() of Sampler. +func (s *RateLimitingSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { + return s.rateLimiter.CheckCredit(1.0), s.tags +} + +// Update reconfigures the rate limiter, while preserving its accumulated balance. +// Locking must be done externally. +func (s *RateLimitingSampler) Update(maxTracesPerSecond float64) { + if s.maxTracesPerSecond != maxTracesPerSecond { + s.init(maxTracesPerSecond) + } +} + +// Close does nothing. +func (s *RateLimitingSampler) Close() { + // nothing to do +} + +// Equal compares with another sampler. +func (s *RateLimitingSampler) Equal(other Sampler) bool { + if o, ok := other.(*RateLimitingSampler); ok { + return s.maxTracesPerSecond == o.maxTracesPerSecond + } + return false +} + +// String is used to log sampler details. +func (s *RateLimitingSampler) String() string { + return fmt.Sprintf("RateLimitingSampler(maxTracesPerSecond=%v)", s.maxTracesPerSecond) +} + +// ----------------------- + +// GuaranteedThroughputProbabilisticSampler is a sampler that leverages both ProbabilisticSampler and +// RateLimitingSampler. The RateLimitingSampler is used as a guaranteed lower bound sampler such that +// every operation is sampled at least once in a time interval defined by the lowerBound. ie a lowerBound +// of 1.0 / (60 * 10) will sample an operation at least once every 10 minutes. +// +// The ProbabilisticSampler is given higher priority when tags are emitted, ie. if IsSampled() for both +// samplers return true, the tags for ProbabilisticSampler will be used. +type GuaranteedThroughputProbabilisticSampler struct { + probabilisticSampler *ProbabilisticSampler + lowerBoundSampler *RateLimitingSampler + tags []Tag + samplingRate float64 + lowerBound float64 +} + +// NewGuaranteedThroughputProbabilisticSampler returns a delegating sampler that applies both +// ProbabilisticSampler and RateLimitingSampler. +func NewGuaranteedThroughputProbabilisticSampler( + lowerBound, samplingRate float64, +) (*GuaranteedThroughputProbabilisticSampler, error) { + return newGuaranteedThroughputProbabilisticSampler(lowerBound, samplingRate), nil +} + +func newGuaranteedThroughputProbabilisticSampler(lowerBound, samplingRate float64) *GuaranteedThroughputProbabilisticSampler { + s := &GuaranteedThroughputProbabilisticSampler{ + lowerBoundSampler: NewRateLimitingSampler(lowerBound), + lowerBound: lowerBound, + } + s.setProbabilisticSampler(samplingRate) + return s +} + +func (s *GuaranteedThroughputProbabilisticSampler) setProbabilisticSampler(samplingRate float64) { + if s.probabilisticSampler == nil { + s.probabilisticSampler = newProbabilisticSampler(samplingRate) + } else if s.samplingRate != samplingRate { + s.probabilisticSampler.init(samplingRate) + } + // since we don't validate samplingRate, sampler may have clamped it to [0, 1] interval + samplingRate = s.probabilisticSampler.SamplingRate() + if s.samplingRate != samplingRate || s.tags == nil { + s.samplingRate = s.probabilisticSampler.SamplingRate() + s.tags = []Tag{ + {key: SamplerTypeTagKey, value: SamplerTypeLowerBound}, + {key: SamplerParamTagKey, value: s.samplingRate}, + } + } +} + +// IsSampled implements IsSampled() of Sampler. +func (s *GuaranteedThroughputProbabilisticSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { + if sampled, tags := s.probabilisticSampler.IsSampled(id, operation); sampled { + s.lowerBoundSampler.IsSampled(id, operation) + return true, tags + } + sampled, _ := s.lowerBoundSampler.IsSampled(id, operation) + return sampled, s.tags +} + +// Close implements Close() of Sampler. +func (s *GuaranteedThroughputProbabilisticSampler) Close() { + s.probabilisticSampler.Close() + s.lowerBoundSampler.Close() +} + +// Equal implements Equal() of Sampler. +func (s *GuaranteedThroughputProbabilisticSampler) Equal(other Sampler) bool { + // NB The Equal() function is expensive and will be removed. See PerOperationSampler.Equal() for + // more information. + return false +} + +// this function should only be called while holding a Write lock +func (s *GuaranteedThroughputProbabilisticSampler) update(lowerBound, samplingRate float64) { + s.setProbabilisticSampler(samplingRate) + if s.lowerBound != lowerBound { + s.lowerBoundSampler.Update(lowerBound) + s.lowerBound = lowerBound + } +} + +func (s GuaranteedThroughputProbabilisticSampler) String() string { + return fmt.Sprintf("GuaranteedThroughputProbabilisticSampler(lowerBound=%f, samplingRate=%f)", s.lowerBound, s.samplingRate) +} + +// ----------------------- + +// PerOperationSampler is a delegating sampler that applies GuaranteedThroughputProbabilisticSampler +// on a per-operation basis. +type PerOperationSampler struct { + sync.RWMutex + + samplers map[string]*GuaranteedThroughputProbabilisticSampler + defaultSampler *ProbabilisticSampler + lowerBound float64 + maxOperations int + + // see description in PerOperationSamplerParams + operationNameLateBinding bool +} + +// NewAdaptiveSampler returns a new PerOperationSampler. +// Deprecated: please use NewPerOperationSampler. +func NewAdaptiveSampler(strategies *sampling.PerOperationSamplingStrategies, maxOperations int) (*PerOperationSampler, error) { + return NewPerOperationSampler(PerOperationSamplerParams{ + MaxOperations: maxOperations, + Strategies: strategies, + }), nil +} + +// PerOperationSamplerParams defines parameters when creating PerOperationSampler. +type PerOperationSamplerParams struct { + // Max number of operations that will be tracked. Other operations will be given default strategy. + MaxOperations int + + // Opt-in feature for applications that require late binding of span name via explicit call to SetOperationName. + // When this feature is enabled, the sampler will return retryable=true from OnCreateSpan(), thus leaving + // the sampling decision as non-final (and the span as writeable). This may lead to degraded performance + // in applications that always provide the correct span name on trace creation. + // + // For backwards compatibility this option is off by default. + OperationNameLateBinding bool + + // Initial configuration of the sampling strategies (usually retrieved from the backend by Remote Sampler). + Strategies *sampling.PerOperationSamplingStrategies +} + +// NewPerOperationSampler returns a new PerOperationSampler. +func NewPerOperationSampler(params PerOperationSamplerParams) *PerOperationSampler { + if params.MaxOperations <= 0 { + params.MaxOperations = defaultMaxOperations + } + samplers := make(map[string]*GuaranteedThroughputProbabilisticSampler) + for _, strategy := range params.Strategies.PerOperationStrategies { + sampler := newGuaranteedThroughputProbabilisticSampler( + params.Strategies.DefaultLowerBoundTracesPerSecond, + strategy.ProbabilisticSampling.SamplingRate, + ) + samplers[strategy.Operation] = sampler + } + return &PerOperationSampler{ + samplers: samplers, + defaultSampler: newProbabilisticSampler(params.Strategies.DefaultSamplingProbability), + lowerBound: params.Strategies.DefaultLowerBoundTracesPerSecond, + maxOperations: params.MaxOperations, + operationNameLateBinding: params.OperationNameLateBinding, + } +} + +// IsSampled is not used and only exists to match Sampler V1 API. +// TODO (breaking change) remove when upgrading everything to SamplerV2 +func (s *PerOperationSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { + return false, nil +} + +func (s *PerOperationSampler) trySampling(span *Span, operationName string) (bool, []Tag) { + samplerV1 := s.getSamplerForOperation(operationName) + var sampled bool + var tags []Tag + if span.context.samplingState.isLocalRootSpan(span.context.spanID) { + sampled, tags = samplerV1.IsSampled(span.context.TraceID(), operationName) + } + return sampled, tags +} + +// OnCreateSpan implements OnCreateSpan of SamplerV2. +func (s *PerOperationSampler) OnCreateSpan(span *Span) SamplingDecision { + sampled, tags := s.trySampling(span, span.OperationName()) + return SamplingDecision{Sample: sampled, Retryable: s.operationNameLateBinding, Tags: tags} +} + +// OnSetOperationName implements OnSetOperationName of SamplerV2. +func (s *PerOperationSampler) OnSetOperationName(span *Span, operationName string) SamplingDecision { + sampled, tags := s.trySampling(span, operationName) + return SamplingDecision{Sample: sampled, Retryable: false, Tags: tags} +} + +// OnSetTag implements OnSetTag of SamplerV2. +func (s *PerOperationSampler) OnSetTag(span *Span, key string, value interface{}) SamplingDecision { + return SamplingDecision{Sample: false, Retryable: true} +} + +// OnFinishSpan implements OnFinishSpan of SamplerV2. +func (s *PerOperationSampler) OnFinishSpan(span *Span) SamplingDecision { + return SamplingDecision{Sample: false, Retryable: true} +} + +func (s *PerOperationSampler) getSamplerForOperation(operation string) Sampler { + s.RLock() + sampler, ok := s.samplers[operation] + if ok { + defer s.RUnlock() + return sampler + } + s.RUnlock() + s.Lock() + defer s.Unlock() + + // Check if sampler has already been created + sampler, ok = s.samplers[operation] + if ok { + return sampler + } + // Store only up to maxOperations of unique ops. + if len(s.samplers) >= s.maxOperations { + return s.defaultSampler + } + newSampler := newGuaranteedThroughputProbabilisticSampler(s.lowerBound, s.defaultSampler.SamplingRate()) + s.samplers[operation] = newSampler + return newSampler +} + +// Close invokes Close on all underlying samplers. +func (s *PerOperationSampler) Close() { + s.Lock() + defer s.Unlock() + for _, sampler := range s.samplers { + sampler.Close() + } + s.defaultSampler.Close() +} + +func (s *PerOperationSampler) String() string { + var sb strings.Builder + + fmt.Fprintf(&sb, "PerOperationSampler(defaultSampler=%v, ", s.defaultSampler) + fmt.Fprintf(&sb, "lowerBound=%f, ", s.lowerBound) + fmt.Fprintf(&sb, "maxOperations=%d, ", s.maxOperations) + fmt.Fprintf(&sb, "operationNameLateBinding=%t, ", s.operationNameLateBinding) + fmt.Fprintf(&sb, "numOperations=%d,\n", len(s.samplers)) + fmt.Fprintf(&sb, "samplers=[") + for operationName, sampler := range s.samplers { + fmt.Fprintf(&sb, "\n(operationName=%s, sampler=%v)", operationName, sampler) + } + fmt.Fprintf(&sb, "])") + + return sb.String() +} + +// Equal is not used. +// TODO (breaking change) remove this in the future +func (s *PerOperationSampler) Equal(other Sampler) bool { + // NB The Equal() function is overly expensive for PerOperationSampler since it's composed of multiple + // samplers which all need to be initialized before this function can be called for a comparison. + // Therefore, PerOperationSampler uses the update() function to only alter the samplers that need + // changing. Hence this function always returns false so that the update function can be called. + // Once the Equal() function is removed from the Sampler API, this will no longer be needed. + return false +} + +func (s *PerOperationSampler) update(strategies *sampling.PerOperationSamplingStrategies) { + s.Lock() + defer s.Unlock() + newSamplers := map[string]*GuaranteedThroughputProbabilisticSampler{} + for _, strategy := range strategies.PerOperationStrategies { + operation := strategy.Operation + samplingRate := strategy.ProbabilisticSampling.SamplingRate + lowerBound := strategies.DefaultLowerBoundTracesPerSecond + if sampler, ok := s.samplers[operation]; ok { + sampler.update(lowerBound, samplingRate) + newSamplers[operation] = sampler + } else { + sampler := newGuaranteedThroughputProbabilisticSampler( + lowerBound, + samplingRate, + ) + newSamplers[operation] = sampler + } + } + s.lowerBound = strategies.DefaultLowerBoundTracesPerSecond + if s.defaultSampler.SamplingRate() != strategies.DefaultSamplingProbability { + s.defaultSampler = newProbabilisticSampler(strategies.DefaultSamplingProbability) + } + s.samplers = newSamplers +} diff --git a/vendor/github.com/uber/jaeger-client-go/sampler_remote.go b/vendor/github.com/uber/jaeger-client-go/sampler_remote.go new file mode 100644 index 00000000..f2edd5ca --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/sampler_remote.go @@ -0,0 +1,337 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "sync" + "sync/atomic" + "time" + + "github.com/uber/jaeger-client-go/log" + "github.com/uber/jaeger-client-go/thrift-gen/sampling" +) + +const ( + defaultSamplingRefreshInterval = time.Minute +) + +// SamplingStrategyFetcher is used to fetch sampling strategy updates from remote server. +type SamplingStrategyFetcher interface { + Fetch(service string) ([]byte, error) +} + +// SamplingStrategyParser is used to parse sampling strategy updates. The output object +// should be of the type that is recognized by the SamplerUpdaters. +type SamplingStrategyParser interface { + Parse(response []byte) (interface{}, error) +} + +// SamplerUpdater is used by RemotelyControlledSampler to apply sampling strategies, +// retrieved from remote config server, to the current sampler. The updater can modify +// the sampler in-place if sampler supports it, or create a new one. +// +// If the strategy does not contain configuration for the sampler in question, +// updater must return modifiedSampler=nil to give other updaters a chance to inspect +// the sampling strategy response. +// +// RemotelyControlledSampler invokes the updaters while holding a lock on the main sampler. +type SamplerUpdater interface { + Update(sampler SamplerV2, strategy interface{}) (modified SamplerV2, err error) +} + +// RemotelyControlledSampler is a delegating sampler that polls a remote server +// for the appropriate sampling strategy, constructs a corresponding sampler and +// delegates to it for sampling decisions. +type RemotelyControlledSampler struct { + // These fields must be first in the struct because `sync/atomic` expects 64-bit alignment. + // Cf. https://github.com/uber/jaeger-client-go/issues/155, https://goo.gl/zW7dgq + closed int64 // 0 - not closed, 1 - closed + + sync.RWMutex // used to serialize access to samplerOptions.sampler + samplerOptions + + serviceName string + doneChan chan *sync.WaitGroup +} + +// NewRemotelyControlledSampler creates a sampler that periodically pulls +// the sampling strategy from an HTTP sampling server (e.g. jaeger-agent). +func NewRemotelyControlledSampler( + serviceName string, + opts ...SamplerOption, +) *RemotelyControlledSampler { + options := new(samplerOptions).applyOptionsAndDefaults(opts...) + sampler := &RemotelyControlledSampler{ + samplerOptions: *options, + serviceName: serviceName, + doneChan: make(chan *sync.WaitGroup), + } + go sampler.pollController() + return sampler +} + +// IsSampled implements IsSampled() of Sampler. +// TODO (breaking change) remove when Sampler V1 is removed +func (s *RemotelyControlledSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { + return false, nil +} + +// OnCreateSpan implements OnCreateSpan of SamplerV2. +func (s *RemotelyControlledSampler) OnCreateSpan(span *Span) SamplingDecision { + return s.Sampler().OnCreateSpan(span) +} + +// OnSetOperationName implements OnSetOperationName of SamplerV2. +func (s *RemotelyControlledSampler) OnSetOperationName(span *Span, operationName string) SamplingDecision { + return s.Sampler().OnSetOperationName(span, operationName) +} + +// OnSetTag implements OnSetTag of SamplerV2. +func (s *RemotelyControlledSampler) OnSetTag(span *Span, key string, value interface{}) SamplingDecision { + return s.Sampler().OnSetTag(span, key, value) +} + +// OnFinishSpan implements OnFinishSpan of SamplerV2. +func (s *RemotelyControlledSampler) OnFinishSpan(span *Span) SamplingDecision { + return s.Sampler().OnFinishSpan(span) +} + +// Close implements Close() of Sampler. +func (s *RemotelyControlledSampler) Close() { + if swapped := atomic.CompareAndSwapInt64(&s.closed, 0, 1); !swapped { + s.logger.Error("Repeated attempt to close the sampler is ignored") + return + } + + var wg sync.WaitGroup + wg.Add(1) + s.doneChan <- &wg + wg.Wait() +} + +// Equal implements Equal() of Sampler. +func (s *RemotelyControlledSampler) Equal(other Sampler) bool { + // NB The Equal() function is expensive and will be removed. See PerOperationSampler.Equal() for + // more information. + return false +} + +func (s *RemotelyControlledSampler) pollController() { + ticker := time.NewTicker(s.samplingRefreshInterval) + defer ticker.Stop() + s.pollControllerWithTicker(ticker) +} + +func (s *RemotelyControlledSampler) pollControllerWithTicker(ticker *time.Ticker) { + for { + select { + case <-ticker.C: + s.UpdateSampler() + case wg := <-s.doneChan: + wg.Done() + return + } + } +} + +// Sampler returns the currently active sampler. +func (s *RemotelyControlledSampler) Sampler() SamplerV2 { + s.RLock() + defer s.RUnlock() + return s.sampler +} + +func (s *RemotelyControlledSampler) setSampler(sampler SamplerV2) { + s.Lock() + defer s.Unlock() + s.sampler = sampler +} + +// UpdateSampler forces the sampler to fetch sampling strategy from backend server. +// This function is called automatically on a timer, but can also be safely called manually, e.g. from tests. +func (s *RemotelyControlledSampler) UpdateSampler() { + res, err := s.samplingFetcher.Fetch(s.serviceName) + if err != nil { + s.metrics.SamplerQueryFailure.Inc(1) + s.logger.Infof("failed to fetch sampling strategy: %v", err) + return + } + strategy, err := s.samplingParser.Parse(res) + if err != nil { + s.metrics.SamplerUpdateFailure.Inc(1) + s.logger.Infof("failed to parse sampling strategy response: %v", err) + return + } + + s.Lock() + defer s.Unlock() + + s.metrics.SamplerRetrieved.Inc(1) + if err := s.updateSamplerViaUpdaters(strategy); err != nil { + s.metrics.SamplerUpdateFailure.Inc(1) + s.logger.Infof("failed to handle sampling strategy response %+v. Got error: %v", res, err) + return + } + s.metrics.SamplerUpdated.Inc(1) +} + +// NB: this function should only be called while holding a Write lock +func (s *RemotelyControlledSampler) updateSamplerViaUpdaters(strategy interface{}) error { + for _, updater := range s.updaters { + sampler, err := updater.Update(s.sampler, strategy) + if err != nil { + return err + } + if sampler != nil { + s.logger.Debugf("sampler updated: %+v", sampler) + s.sampler = sampler + return nil + } + } + return fmt.Errorf("unsupported sampling strategy %+v", strategy) +} + +// ----------------------- + +// ProbabilisticSamplerUpdater is used by RemotelyControlledSampler to parse sampling configuration. +type ProbabilisticSamplerUpdater struct{} + +// Update implements Update of SamplerUpdater. +func (u *ProbabilisticSamplerUpdater) Update(sampler SamplerV2, strategy interface{}) (SamplerV2, error) { + type response interface { + GetProbabilisticSampling() *sampling.ProbabilisticSamplingStrategy + } + var _ response = new(sampling.SamplingStrategyResponse) // sanity signature check + if resp, ok := strategy.(response); ok { + if probabilistic := resp.GetProbabilisticSampling(); probabilistic != nil { + if ps, ok := sampler.(*ProbabilisticSampler); ok { + if err := ps.Update(probabilistic.SamplingRate); err != nil { + return nil, err + } + return sampler, nil + } + return newProbabilisticSampler(probabilistic.SamplingRate), nil + } + } + return nil, nil +} + +// ----------------------- + +// RateLimitingSamplerUpdater is used by RemotelyControlledSampler to parse sampling configuration. +type RateLimitingSamplerUpdater struct{} + +// Update implements Update of SamplerUpdater. +func (u *RateLimitingSamplerUpdater) Update(sampler SamplerV2, strategy interface{}) (SamplerV2, error) { + type response interface { + GetRateLimitingSampling() *sampling.RateLimitingSamplingStrategy + } + var _ response = new(sampling.SamplingStrategyResponse) // sanity signature check + if resp, ok := strategy.(response); ok { + if rateLimiting := resp.GetRateLimitingSampling(); rateLimiting != nil { + rateLimit := float64(rateLimiting.MaxTracesPerSecond) + if rl, ok := sampler.(*RateLimitingSampler); ok { + rl.Update(rateLimit) + return rl, nil + } + return NewRateLimitingSampler(rateLimit), nil + } + } + return nil, nil +} + +// ----------------------- + +// AdaptiveSamplerUpdater is used by RemotelyControlledSampler to parse sampling configuration. +// Fields have the same meaning as in PerOperationSamplerParams. +type AdaptiveSamplerUpdater struct { + MaxOperations int + OperationNameLateBinding bool +} + +// Update implements Update of SamplerUpdater. +func (u *AdaptiveSamplerUpdater) Update(sampler SamplerV2, strategy interface{}) (SamplerV2, error) { + type response interface { + GetOperationSampling() *sampling.PerOperationSamplingStrategies + } + var _ response = new(sampling.SamplingStrategyResponse) // sanity signature check + if p, ok := strategy.(response); ok { + if operations := p.GetOperationSampling(); operations != nil { + if as, ok := sampler.(*PerOperationSampler); ok { + as.update(operations) + return as, nil + } + return NewPerOperationSampler(PerOperationSamplerParams{ + MaxOperations: u.MaxOperations, + OperationNameLateBinding: u.OperationNameLateBinding, + Strategies: operations, + }), nil + } + } + return nil, nil +} + +// ----------------------- + +type httpSamplingStrategyFetcher struct { + serverURL string + logger log.DebugLogger +} + +func (f *httpSamplingStrategyFetcher) Fetch(serviceName string) ([]byte, error) { + v := url.Values{} + v.Set("service", serviceName) + uri := f.serverURL + "?" + v.Encode() + + // TODO create and reuse http.Client with proper timeout settings, etc. + resp, err := http.Get(uri) + if err != nil { + return nil, err + } + + defer func() { + if err := resp.Body.Close(); err != nil { + f.logger.Error(fmt.Sprintf("failed to close HTTP response body: %+v", err)) + } + }() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + if resp.StatusCode >= 400 { + return nil, fmt.Errorf("StatusCode: %d, Body: %s", resp.StatusCode, body) + } + + return body, nil +} + +// ----------------------- + +type samplingStrategyParser struct{} + +func (p *samplingStrategyParser) Parse(response []byte) (interface{}, error) { + strategy := new(sampling.SamplingStrategyResponse) + if err := json.Unmarshal(response, strategy); err != nil { + return nil, err + } + return strategy, nil +} diff --git a/vendor/github.com/uber/jaeger-client-go/sampler_remote_options.go b/vendor/github.com/uber/jaeger-client-go/sampler_remote_options.go new file mode 100644 index 00000000..e4a6108b --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/sampler_remote_options.go @@ -0,0 +1,162 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "time" + + "github.com/uber/jaeger-client-go/log" +) + +// SamplerOption is a function that sets some option on the sampler +type SamplerOption func(options *samplerOptions) + +// SamplerOptions is a factory for all available SamplerOption's. +var SamplerOptions SamplerOptionsFactory + +// SamplerOptionsFactory is a factory for all available SamplerOption's. +// The type acts as a namespace for factory functions. It is public to +// make the functions discoverable via godoc. Recommended to be used +// via global SamplerOptions variable. +type SamplerOptionsFactory struct{} + +type samplerOptions struct { + metrics *Metrics + sampler SamplerV2 + logger log.DebugLogger + samplingServerURL string + samplingRefreshInterval time.Duration + samplingFetcher SamplingStrategyFetcher + samplingParser SamplingStrategyParser + updaters []SamplerUpdater + posParams PerOperationSamplerParams +} + +// Metrics creates a SamplerOption that initializes Metrics on the sampler, +// which is used to emit statistics. +func (SamplerOptionsFactory) Metrics(m *Metrics) SamplerOption { + return func(o *samplerOptions) { + o.metrics = m + } +} + +// MaxOperations creates a SamplerOption that sets the maximum number of +// operations the sampler will keep track of. +func (SamplerOptionsFactory) MaxOperations(maxOperations int) SamplerOption { + return func(o *samplerOptions) { + o.posParams.MaxOperations = maxOperations + } +} + +// OperationNameLateBinding creates a SamplerOption that sets the respective +// field in the PerOperationSamplerParams. +func (SamplerOptionsFactory) OperationNameLateBinding(enable bool) SamplerOption { + return func(o *samplerOptions) { + o.posParams.OperationNameLateBinding = enable + } +} + +// InitialSampler creates a SamplerOption that sets the initial sampler +// to use before a remote sampler is created and used. +func (SamplerOptionsFactory) InitialSampler(sampler Sampler) SamplerOption { + return func(o *samplerOptions) { + o.sampler = samplerV1toV2(sampler) + } +} + +// Logger creates a SamplerOption that sets the logger used by the sampler. +func (SamplerOptionsFactory) Logger(logger Logger) SamplerOption { + return func(o *samplerOptions) { + o.logger = log.DebugLogAdapter(logger) + } +} + +// SamplingServerURL creates a SamplerOption that sets the sampling server url +// of the local agent that contains the sampling strategies. +func (SamplerOptionsFactory) SamplingServerURL(samplingServerURL string) SamplerOption { + return func(o *samplerOptions) { + o.samplingServerURL = samplingServerURL + } +} + +// SamplingRefreshInterval creates a SamplerOption that sets how often the +// sampler will poll local agent for the appropriate sampling strategy. +func (SamplerOptionsFactory) SamplingRefreshInterval(samplingRefreshInterval time.Duration) SamplerOption { + return func(o *samplerOptions) { + o.samplingRefreshInterval = samplingRefreshInterval + } +} + +// SamplingStrategyFetcher creates a SamplerOption that initializes sampling strategy fetcher. +func (SamplerOptionsFactory) SamplingStrategyFetcher(fetcher SamplingStrategyFetcher) SamplerOption { + return func(o *samplerOptions) { + o.samplingFetcher = fetcher + } +} + +// SamplingStrategyParser creates a SamplerOption that initializes sampling strategy parser. +func (SamplerOptionsFactory) SamplingStrategyParser(parser SamplingStrategyParser) SamplerOption { + return func(o *samplerOptions) { + o.samplingParser = parser + } +} + +// Updaters creates a SamplerOption that initializes sampler updaters. +func (SamplerOptionsFactory) Updaters(updaters ...SamplerUpdater) SamplerOption { + return func(o *samplerOptions) { + o.updaters = updaters + } +} + +func (o *samplerOptions) applyOptionsAndDefaults(opts ...SamplerOption) *samplerOptions { + for _, option := range opts { + option(o) + } + if o.sampler == nil { + o.sampler = newProbabilisticSampler(0.001) + } + if o.logger == nil { + o.logger = log.NullLogger + } + if o.samplingServerURL == "" { + o.samplingServerURL = DefaultSamplingServerURL + } + if o.metrics == nil { + o.metrics = NewNullMetrics() + } + if o.samplingRefreshInterval <= 0 { + o.samplingRefreshInterval = defaultSamplingRefreshInterval + } + if o.samplingFetcher == nil { + o.samplingFetcher = &httpSamplingStrategyFetcher{ + serverURL: o.samplingServerURL, + logger: o.logger, + } + } + if o.samplingParser == nil { + o.samplingParser = new(samplingStrategyParser) + } + if o.updaters == nil { + o.updaters = []SamplerUpdater{ + &AdaptiveSamplerUpdater{ + MaxOperations: o.posParams.MaxOperations, + OperationNameLateBinding: o.posParams.OperationNameLateBinding, + }, + new(ProbabilisticSamplerUpdater), + new(RateLimitingSamplerUpdater), + } + } + return o +} diff --git a/vendor/github.com/uber/jaeger-client-go/sampler_v2.go b/vendor/github.com/uber/jaeger-client-go/sampler_v2.go new file mode 100644 index 00000000..a50671a2 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/sampler_v2.go @@ -0,0 +1,93 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +// SamplingDecision is returned by the V2 samplers. +type SamplingDecision struct { + Sample bool + Retryable bool + Tags []Tag +} + +// SamplerV2 is an extension of the V1 samplers that allows sampling decisions +// be made at different points of the span lifecycle. +type SamplerV2 interface { + OnCreateSpan(span *Span) SamplingDecision + OnSetOperationName(span *Span, operationName string) SamplingDecision + OnSetTag(span *Span, key string, value interface{}) SamplingDecision + OnFinishSpan(span *Span) SamplingDecision + + // Close does a clean shutdown of the sampler, stopping any background + // go-routines it may have started. + Close() +} + +// samplerV1toV2 wraps legacy V1 sampler into an adapter that make it look like V2. +func samplerV1toV2(s Sampler) SamplerV2 { + if s2, ok := s.(SamplerV2); ok { + return s2 + } + type legacySamplerV1toV2Adapter struct { + legacySamplerV1Base + } + return &legacySamplerV1toV2Adapter{ + legacySamplerV1Base: legacySamplerV1Base{ + delegate: s.IsSampled, + }, + } +} + +// SamplerV2Base can be used by V2 samplers to implement dummy V1 methods. +// Supporting V1 API is required because Tracer configuration only accepts V1 Sampler +// for backwards compatibility reasons. +// TODO (breaking change) remove this in the next major release +type SamplerV2Base struct{} + +// IsSampled implements IsSampled of Sampler. +func (SamplerV2Base) IsSampled(id TraceID, operation string) (sampled bool, tags []Tag) { + return false, nil +} + +// Close implements Close of Sampler. +func (SamplerV2Base) Close() {} + +// Equal implements Equal of Sampler. +func (SamplerV2Base) Equal(other Sampler) bool { return false } + +// legacySamplerV1Base is used as a base for simple samplers that only implement +// the legacy isSampled() function that is not sensitive to its arguments. +type legacySamplerV1Base struct { + delegate func(id TraceID, operation string) (sampled bool, tags []Tag) +} + +func (s *legacySamplerV1Base) OnCreateSpan(span *Span) SamplingDecision { + isSampled, tags := s.delegate(span.context.traceID, span.operationName) + return SamplingDecision{Sample: isSampled, Retryable: false, Tags: tags} +} + +func (s *legacySamplerV1Base) OnSetOperationName(span *Span, operationName string) SamplingDecision { + isSampled, tags := s.delegate(span.context.traceID, span.operationName) + return SamplingDecision{Sample: isSampled, Retryable: false, Tags: tags} +} + +func (s *legacySamplerV1Base) OnSetTag(span *Span, key string, value interface{}) SamplingDecision { + return SamplingDecision{Sample: false, Retryable: true} +} + +func (s *legacySamplerV1Base) OnFinishSpan(span *Span) SamplingDecision { + return SamplingDecision{Sample: false, Retryable: true} +} + +func (s *legacySamplerV1Base) Close() {} diff --git a/vendor/github.com/uber/jaeger-client-go/span.go b/vendor/github.com/uber/jaeger-client-go/span.go new file mode 100644 index 00000000..42c9112c --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/span.go @@ -0,0 +1,487 @@ +// Copyright (c) 2017-2018 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "sync" + "sync/atomic" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + "github.com/opentracing/opentracing-go/log" +) + +// Span implements opentracing.Span +type Span struct { + // referenceCounter used to increase the lifetime of + // the object before return it into the pool. + referenceCounter int32 + + sync.RWMutex + + tracer *Tracer + + // TODO: (breaking change) change to use a pointer + context SpanContext + + // The name of the "operation" this span is an instance of. + // Known as a "span name" in some implementations. + operationName string + + // firstInProcess, if true, indicates that this span is the root of the (sub)tree + // of spans in the current process. In other words it's true for the root spans, + // and the ingress spans when the process joins another trace. + firstInProcess bool + + // startTime is the timestamp indicating when the span began, with microseconds precision. + startTime time.Time + + // duration returns duration of the span with microseconds precision. + // Zero value means duration is unknown. + duration time.Duration + + // tags attached to this span + tags []Tag + + // The span's "micro-log" + logs []opentracing.LogRecord + + // The number of logs dropped because of MaxLogsPerSpan. + numDroppedLogs int + + // references for this span + references []Reference + + observer ContribSpanObserver +} + +// Tag is a simple key value wrapper. +// TODO (breaking change) deprecate in the next major release, use opentracing.Tag instead. +type Tag struct { + key string + value interface{} +} + +// NewTag creates a new Tag. +// TODO (breaking change) deprecate in the next major release, use opentracing.Tag instead. +func NewTag(key string, value interface{}) Tag { + return Tag{key: key, value: value} +} + +// SetOperationName sets or changes the operation name. +func (s *Span) SetOperationName(operationName string) opentracing.Span { + s.Lock() + s.operationName = operationName + s.Unlock() + if !s.isSamplingFinalized() { + decision := s.tracer.sampler.OnSetOperationName(s, operationName) + s.applySamplingDecision(decision, true) + } + s.observer.OnSetOperationName(operationName) + return s +} + +// SetTag implements SetTag() of opentracing.Span +func (s *Span) SetTag(key string, value interface{}) opentracing.Span { + return s.setTagInternal(key, value, true) +} + +func (s *Span) setTagInternal(key string, value interface{}, lock bool) opentracing.Span { + s.observer.OnSetTag(key, value) + if key == string(ext.SamplingPriority) && !setSamplingPriority(s, value) { + return s + } + if !s.isSamplingFinalized() { + decision := s.tracer.sampler.OnSetTag(s, key, value) + s.applySamplingDecision(decision, lock) + } + if s.isWriteable() { + if lock { + s.Lock() + defer s.Unlock() + } + s.appendTagNoLocking(key, value) + } + return s +} + +// SpanContext returns span context +func (s *Span) SpanContext() SpanContext { + s.Lock() + defer s.Unlock() + return s.context +} + +// StartTime returns span start time +func (s *Span) StartTime() time.Time { + s.Lock() + defer s.Unlock() + return s.startTime +} + +// Duration returns span duration +func (s *Span) Duration() time.Duration { + s.Lock() + defer s.Unlock() + return s.duration +} + +// Tags returns tags for span +func (s *Span) Tags() opentracing.Tags { + s.Lock() + defer s.Unlock() + var result = make(opentracing.Tags, len(s.tags)) + for _, tag := range s.tags { + result[tag.key] = tag.value + } + return result +} + +// Logs returns micro logs for span +func (s *Span) Logs() []opentracing.LogRecord { + s.Lock() + defer s.Unlock() + + logs := append([]opentracing.LogRecord(nil), s.logs...) + if s.numDroppedLogs != 0 { + fixLogs(logs, s.numDroppedLogs) + } + + return logs +} + +// References returns references for this span +func (s *Span) References() []opentracing.SpanReference { + s.Lock() + defer s.Unlock() + + if s.references == nil || len(s.references) == 0 { + return nil + } + + result := make([]opentracing.SpanReference, len(s.references)) + for i, r := range s.references { + result[i] = opentracing.SpanReference{Type: r.Type, ReferencedContext: r.Context} + } + return result +} + +func (s *Span) appendTagNoLocking(key string, value interface{}) { + s.tags = append(s.tags, Tag{key: key, value: value}) +} + +// LogFields implements opentracing.Span API +func (s *Span) LogFields(fields ...log.Field) { + s.Lock() + defer s.Unlock() + if !s.context.IsSampled() { + return + } + s.logFieldsNoLocking(fields...) +} + +// this function should only be called while holding a Write lock +func (s *Span) logFieldsNoLocking(fields ...log.Field) { + lr := opentracing.LogRecord{ + Fields: fields, + Timestamp: time.Now(), + } + s.appendLogNoLocking(lr) +} + +// LogKV implements opentracing.Span API +func (s *Span) LogKV(alternatingKeyValues ...interface{}) { + s.RLock() + sampled := s.context.IsSampled() + s.RUnlock() + if !sampled { + return + } + fields, err := log.InterleavedKVToFields(alternatingKeyValues...) + if err != nil { + s.LogFields(log.Error(err), log.String("function", "LogKV")) + return + } + s.LogFields(fields...) +} + +// LogEvent implements opentracing.Span API +func (s *Span) LogEvent(event string) { + s.Log(opentracing.LogData{Event: event}) +} + +// LogEventWithPayload implements opentracing.Span API +func (s *Span) LogEventWithPayload(event string, payload interface{}) { + s.Log(opentracing.LogData{Event: event, Payload: payload}) +} + +// Log implements opentracing.Span API +func (s *Span) Log(ld opentracing.LogData) { + s.Lock() + defer s.Unlock() + if s.context.IsSampled() { + if ld.Timestamp.IsZero() { + ld.Timestamp = s.tracer.timeNow() + } + s.appendLogNoLocking(ld.ToLogRecord()) + } +} + +// this function should only be called while holding a Write lock +func (s *Span) appendLogNoLocking(lr opentracing.LogRecord) { + maxLogs := s.tracer.options.maxLogsPerSpan + if maxLogs == 0 || len(s.logs) < maxLogs { + s.logs = append(s.logs, lr) + return + } + + // We have too many logs. We don't touch the first numOld logs; we treat the + // rest as a circular buffer and overwrite the oldest log among those. + numOld := (maxLogs - 1) / 2 + numNew := maxLogs - numOld + s.logs[numOld+s.numDroppedLogs%numNew] = lr + s.numDroppedLogs++ +} + +// rotateLogBuffer rotates the records in the buffer: records 0 to pos-1 move at +// the end (i.e. pos circular left shifts). +func rotateLogBuffer(buf []opentracing.LogRecord, pos int) { + // This algorithm is described in: + // http://www.cplusplus.com/reference/algorithm/rotate + for first, middle, next := 0, pos, pos; first != middle; { + buf[first], buf[next] = buf[next], buf[first] + first++ + next++ + if next == len(buf) { + next = middle + } else if first == middle { + middle = next + } + } +} + +func fixLogs(logs []opentracing.LogRecord, numDroppedLogs int) { + // We dropped some log events, which means that we used part of Logs as a + // circular buffer (see appendLog). De-circularize it. + numOld := (len(logs) - 1) / 2 + numNew := len(logs) - numOld + rotateLogBuffer(logs[numOld:], numDroppedLogs%numNew) + + // Replace the log in the middle (the oldest "new" log) with information + // about the dropped logs. This means that we are effectively dropping one + // more "new" log. + numDropped := numDroppedLogs + 1 + logs[numOld] = opentracing.LogRecord{ + // Keep the timestamp of the last dropped event. + Timestamp: logs[numOld].Timestamp, + Fields: []log.Field{ + log.String("event", "dropped Span logs"), + log.Int("dropped_log_count", numDropped), + log.String("component", "jaeger-client"), + }, + } +} + +func (s *Span) fixLogsIfDropped() { + if s.numDroppedLogs == 0 { + return + } + fixLogs(s.logs, s.numDroppedLogs) + s.numDroppedLogs = 0 +} + +// SetBaggageItem implements SetBaggageItem() of opentracing.SpanContext +func (s *Span) SetBaggageItem(key, value string) opentracing.Span { + s.Lock() + defer s.Unlock() + s.tracer.setBaggage(s, key, value) + return s +} + +// BaggageItem implements BaggageItem() of opentracing.SpanContext +func (s *Span) BaggageItem(key string) string { + s.RLock() + defer s.RUnlock() + return s.context.baggage[key] +} + +// Finish implements opentracing.Span API +// After finishing the Span object it returns back to the allocator unless the reporter retains it again, +// so after that, the Span object should no longer be used because it won't be valid anymore. +func (s *Span) Finish() { + s.FinishWithOptions(opentracing.FinishOptions{}) +} + +// FinishWithOptions implements opentracing.Span API +func (s *Span) FinishWithOptions(options opentracing.FinishOptions) { + if options.FinishTime.IsZero() { + options.FinishTime = s.tracer.timeNow() + } + s.observer.OnFinish(options) + s.Lock() + s.duration = options.FinishTime.Sub(s.startTime) + s.Unlock() + if !s.isSamplingFinalized() { + decision := s.tracer.sampler.OnFinishSpan(s) + s.applySamplingDecision(decision, true) + } + if s.context.IsSampled() { + s.Lock() + s.fixLogsIfDropped() + if len(options.LogRecords) > 0 || len(options.BulkLogData) > 0 { + // Note: bulk logs are not subject to maxLogsPerSpan limit + if options.LogRecords != nil { + s.logs = append(s.logs, options.LogRecords...) + } + for _, ld := range options.BulkLogData { + s.logs = append(s.logs, ld.ToLogRecord()) + } + } + s.Unlock() + } + // call reportSpan even for non-sampled traces, to return span to the pool + // and update metrics counter + s.tracer.reportSpan(s) +} + +// Context implements opentracing.Span API +func (s *Span) Context() opentracing.SpanContext { + s.Lock() + defer s.Unlock() + return s.context +} + +// Tracer implements opentracing.Span API +func (s *Span) Tracer() opentracing.Tracer { + return s.tracer +} + +func (s *Span) String() string { + s.RLock() + defer s.RUnlock() + return s.context.String() +} + +// OperationName allows retrieving current operation name. +func (s *Span) OperationName() string { + s.RLock() + defer s.RUnlock() + return s.operationName +} + +// Retain increases object counter to increase the lifetime of the object +func (s *Span) Retain() *Span { + atomic.AddInt32(&s.referenceCounter, 1) + return s +} + +// Release decrements object counter and return to the +// allocator manager when counter will below zero +func (s *Span) Release() { + if atomic.AddInt32(&s.referenceCounter, -1) == -1 { + s.tracer.spanAllocator.Put(s) + } +} + +// reset span state and release unused data +func (s *Span) reset() { + s.firstInProcess = false + s.context = emptyContext + s.operationName = "" + s.tracer = nil + s.startTime = time.Time{} + s.duration = 0 + s.observer = nil + atomic.StoreInt32(&s.referenceCounter, 0) + + // Note: To reuse memory we can save the pointers on the heap + s.tags = s.tags[:0] + s.logs = s.logs[:0] + s.numDroppedLogs = 0 + s.references = s.references[:0] +} + +func (s *Span) serviceName() string { + return s.tracer.serviceName +} + +func (s *Span) applySamplingDecision(decision SamplingDecision, lock bool) { + if !decision.Retryable { + s.context.samplingState.setFinal() + } + if decision.Sample { + s.context.samplingState.setSampled() + if len(decision.Tags) > 0 { + if lock { + s.Lock() + defer s.Unlock() + } + for _, tag := range decision.Tags { + s.appendTagNoLocking(tag.key, tag.value) + } + } + } +} + +// Span can be written to if it is sampled or the sampling decision has not been finalized. +func (s *Span) isWriteable() bool { + state := s.context.samplingState + return !state.isFinal() || state.isSampled() +} + +func (s *Span) isSamplingFinalized() bool { + return s.context.samplingState.isFinal() +} + +// setSamplingPriority returns true if the flag was updated successfully, false otherwise. +// The behavior of setSamplingPriority is surprising +// If noDebugFlagOnForcedSampling is set +// setSamplingPriority(span, 1) always sets only flagSampled +// If noDebugFlagOnForcedSampling is unset, and isDebugAllowed passes +// setSamplingPriority(span, 1) sets both flagSampled and flagDebug +// However, +// setSamplingPriority(span, 0) always only resets flagSampled +// +// This means that doing a setSamplingPriority(span, 1) followed by setSamplingPriority(span, 0) can +// leave flagDebug set +func setSamplingPriority(s *Span, value interface{}) bool { + val, ok := value.(uint16) + if !ok { + return false + } + if val == 0 { + s.context.samplingState.unsetSampled() + s.context.samplingState.setFinal() + return true + } + if s.tracer.options.noDebugFlagOnForcedSampling { + s.context.samplingState.setSampled() + s.context.samplingState.setFinal() + return true + } else if s.tracer.isDebugAllowed(s.operationName) { + s.context.samplingState.setDebugAndSampled() + s.context.samplingState.setFinal() + return true + } + return false +} + +// EnableFirehose enables firehose flag on the span context +func EnableFirehose(s *Span) { + s.Lock() + defer s.Unlock() + s.context.samplingState.setFirehose() +} diff --git a/vendor/github.com/uber/jaeger-client-go/span_allocator.go b/vendor/github.com/uber/jaeger-client-go/span_allocator.go new file mode 100644 index 00000000..6fe0cd0c --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/span_allocator.go @@ -0,0 +1,56 @@ +// Copyright (c) 2019 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import "sync" + +// SpanAllocator abstraction of managign span allocations +type SpanAllocator interface { + Get() *Span + Put(*Span) +} + +type syncPollSpanAllocator struct { + spanPool sync.Pool +} + +func newSyncPollSpanAllocator() SpanAllocator { + return &syncPollSpanAllocator{ + spanPool: sync.Pool{New: func() interface{} { + return &Span{} + }}, + } +} + +func (pool *syncPollSpanAllocator) Get() *Span { + return pool.spanPool.Get().(*Span) +} + +func (pool *syncPollSpanAllocator) Put(span *Span) { + span.reset() + pool.spanPool.Put(span) +} + +type simpleSpanAllocator struct{} + +func (pool simpleSpanAllocator) Get() *Span { + return &Span{} +} + +func (pool simpleSpanAllocator) Put(span *Span) { + // @comment https://github.com/jaegertracing/jaeger-client-go/pull/381#issuecomment-475904351 + // since finished spans are not reused, no need to reset them + // span.reset() +} diff --git a/vendor/github.com/uber/jaeger-client-go/span_context.go b/vendor/github.com/uber/jaeger-client-go/span_context.go new file mode 100644 index 00000000..ae9d94a9 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/span_context.go @@ -0,0 +1,387 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "errors" + "fmt" + "strconv" + "strings" + "sync" + + "go.uber.org/atomic" +) + +const ( + flagSampled = 1 + flagDebug = 2 + flagFirehose = 8 +) + +var ( + errEmptyTracerStateString = errors.New("Cannot convert empty string to tracer state") + errMalformedTracerStateString = errors.New("String does not match tracer state format") + + emptyContext = SpanContext{} +) + +// TraceID represents unique 128bit identifier of a trace +type TraceID struct { + High, Low uint64 +} + +// SpanID represents unique 64bit identifier of a span +type SpanID uint64 + +// SpanContext represents propagated span identity and state +type SpanContext struct { + // traceID represents globally unique ID of the trace. + // Usually generated as a random number. + traceID TraceID + + // spanID represents span ID that must be unique within its trace, + // but does not have to be globally unique. + spanID SpanID + + // parentID refers to the ID of the parent span. + // Should be 0 if the current span is a root span. + parentID SpanID + + // Distributed Context baggage. The is a snapshot in time. + baggage map[string]string + + // debugID can be set to some correlation ID when the context is being + // extracted from a TextMap carrier. + // + // See JaegerDebugHeader in constants.go + debugID string + + // samplingState is shared across all spans + samplingState *samplingState + + // remote indicates that span context represents a remote parent + remote bool +} + +type samplingState struct { + // Span context's state flags that are propagated across processes. Only lower 8 bits are used. + // We use an int32 instead of byte to be able to use CAS operations. + stateFlags atomic.Int32 + + // When state is not final, sampling will be retried on other span write operations, + // like SetOperationName / SetTag, and the spans will remain writable. + final atomic.Bool + + // localRootSpan stores the SpanID of the first span created in this process for a given trace. + localRootSpan SpanID + + // extendedState allows samplers to keep intermediate state. + // The keys and values in this map are completely opaque: interface{} -> interface{}. + extendedState sync.Map +} + +func (s *samplingState) isLocalRootSpan(id SpanID) bool { + return id == s.localRootSpan +} + +func (s *samplingState) setFlag(newFlag int32) { + swapped := false + for !swapped { + old := s.stateFlags.Load() + swapped = s.stateFlags.CAS(old, old|newFlag) + } +} + +func (s *samplingState) unsetFlag(newFlag int32) { + swapped := false + for !swapped { + old := s.stateFlags.Load() + swapped = s.stateFlags.CAS(old, old&^newFlag) + } +} + +func (s *samplingState) setSampled() { + s.setFlag(flagSampled) +} + +func (s *samplingState) unsetSampled() { + s.unsetFlag(flagSampled) +} + +func (s *samplingState) setDebugAndSampled() { + s.setFlag(flagDebug | flagSampled) +} + +func (s *samplingState) setFirehose() { + s.setFlag(flagFirehose) +} + +func (s *samplingState) setFlags(flags byte) { + s.stateFlags.Store(int32(flags)) +} + +func (s *samplingState) setFinal() { + s.final.Store(true) +} + +func (s *samplingState) flags() byte { + return byte(s.stateFlags.Load()) +} + +func (s *samplingState) isSampled() bool { + return s.stateFlags.Load()&flagSampled == flagSampled +} + +func (s *samplingState) isDebug() bool { + return s.stateFlags.Load()&flagDebug == flagDebug +} + +func (s *samplingState) isFirehose() bool { + return s.stateFlags.Load()&flagFirehose == flagFirehose +} + +func (s *samplingState) isFinal() bool { + return s.final.Load() +} + +func (s *samplingState) extendedStateForKey(key interface{}, initValue func() interface{}) interface{} { + if value, ok := s.extendedState.Load(key); ok { + return value + } + value := initValue() + value, _ = s.extendedState.LoadOrStore(key, value) + return value +} + +// ForeachBaggageItem implements ForeachBaggageItem() of opentracing.SpanContext +func (c SpanContext) ForeachBaggageItem(handler func(k, v string) bool) { + for k, v := range c.baggage { + if !handler(k, v) { + break + } + } +} + +// IsSampled returns whether this trace was chosen for permanent storage +// by the sampling mechanism of the tracer. +func (c SpanContext) IsSampled() bool { + return c.samplingState.isSampled() +} + +// IsDebug indicates whether sampling was explicitly requested by the service. +func (c SpanContext) IsDebug() bool { + return c.samplingState.isDebug() +} + +// IsSamplingFinalized indicates whether the sampling decision has been finalized. +func (c SpanContext) IsSamplingFinalized() bool { + return c.samplingState.isFinal() +} + +// IsFirehose indicates whether the firehose flag was set +func (c SpanContext) IsFirehose() bool { + return c.samplingState.isFirehose() +} + +// ExtendedSamplingState returns the custom state object for a given key. If the value for this key does not exist, +// it is initialized via initValue function. This state can be used by samplers (e.g. x.PrioritySampler). +func (c SpanContext) ExtendedSamplingState(key interface{}, initValue func() interface{}) interface{} { + return c.samplingState.extendedStateForKey(key, initValue) +} + +// IsValid indicates whether this context actually represents a valid trace. +func (c SpanContext) IsValid() bool { + return c.traceID.IsValid() && c.spanID != 0 +} + +// SetFirehose enables firehose mode for this trace. +func (c SpanContext) SetFirehose() { + c.samplingState.setFirehose() +} + +func (c SpanContext) String() string { + var flags int32 + if c.samplingState != nil { + flags = c.samplingState.stateFlags.Load() + } + if c.traceID.High == 0 { + return fmt.Sprintf("%016x:%016x:%016x:%x", c.traceID.Low, uint64(c.spanID), uint64(c.parentID), flags) + } + return fmt.Sprintf("%016x%016x:%016x:%016x:%x", c.traceID.High, c.traceID.Low, uint64(c.spanID), uint64(c.parentID), flags) +} + +// ContextFromString reconstructs the Context encoded in a string +func ContextFromString(value string) (SpanContext, error) { + var context SpanContext + if value == "" { + return emptyContext, errEmptyTracerStateString + } + parts := strings.Split(value, ":") + if len(parts) != 4 { + return emptyContext, errMalformedTracerStateString + } + var err error + if context.traceID, err = TraceIDFromString(parts[0]); err != nil { + return emptyContext, err + } + if context.spanID, err = SpanIDFromString(parts[1]); err != nil { + return emptyContext, err + } + if context.parentID, err = SpanIDFromString(parts[2]); err != nil { + return emptyContext, err + } + flags, err := strconv.ParseUint(parts[3], 10, 8) + if err != nil { + return emptyContext, err + } + context.samplingState = &samplingState{} + context.samplingState.setFlags(byte(flags)) + return context, nil +} + +// TraceID returns the trace ID of this span context +func (c SpanContext) TraceID() TraceID { + return c.traceID +} + +// SpanID returns the span ID of this span context +func (c SpanContext) SpanID() SpanID { + return c.spanID +} + +// ParentID returns the parent span ID of this span context +func (c SpanContext) ParentID() SpanID { + return c.parentID +} + +// Flags returns the bitmap containing such bits as 'sampled' and 'debug'. +func (c SpanContext) Flags() byte { + return c.samplingState.flags() +} + +// NewSpanContext creates a new instance of SpanContext +func NewSpanContext(traceID TraceID, spanID, parentID SpanID, sampled bool, baggage map[string]string) SpanContext { + samplingState := &samplingState{} + if sampled { + samplingState.setSampled() + } + + return SpanContext{ + traceID: traceID, + spanID: spanID, + parentID: parentID, + samplingState: samplingState, + baggage: baggage} +} + +// CopyFrom copies data from ctx into this context, including span identity and baggage. +// TODO This is only used by interop.go. Remove once TChannel Go supports OpenTracing. +func (c *SpanContext) CopyFrom(ctx *SpanContext) { + c.traceID = ctx.traceID + c.spanID = ctx.spanID + c.parentID = ctx.parentID + c.samplingState = ctx.samplingState + if l := len(ctx.baggage); l > 0 { + c.baggage = make(map[string]string, l) + for k, v := range ctx.baggage { + c.baggage[k] = v + } + } else { + c.baggage = nil + } +} + +// WithBaggageItem creates a new context with an extra baggage item. +func (c SpanContext) WithBaggageItem(key, value string) SpanContext { + var newBaggage map[string]string + if c.baggage == nil { + newBaggage = map[string]string{key: value} + } else { + newBaggage = make(map[string]string, len(c.baggage)+1) + for k, v := range c.baggage { + newBaggage[k] = v + } + newBaggage[key] = value + } + // Use positional parameters so the compiler will help catch new fields. + return SpanContext{c.traceID, c.spanID, c.parentID, newBaggage, "", c.samplingState, c.remote} +} + +// isDebugIDContainerOnly returns true when the instance of the context is only +// used to return the debug/correlation ID from extract() method. This happens +// in the situation when "jaeger-debug-id" header is passed in the carrier to +// the extract() method, but the request otherwise has no span context in it. +// Previously this would've returned opentracing.ErrSpanContextNotFound from the +// extract method, but now it returns a dummy context with only debugID filled in. +// +// See JaegerDebugHeader in constants.go +// See TextMapPropagator#Extract +func (c *SpanContext) isDebugIDContainerOnly() bool { + return !c.traceID.IsValid() && c.debugID != "" +} + +// ------- TraceID ------- + +func (t TraceID) String() string { + if t.High == 0 { + return fmt.Sprintf("%x", t.Low) + } + return fmt.Sprintf("%x%016x", t.High, t.Low) +} + +// TraceIDFromString creates a TraceID from a hexadecimal string +func TraceIDFromString(s string) (TraceID, error) { + var hi, lo uint64 + var err error + if len(s) > 32 { + return TraceID{}, fmt.Errorf("TraceID cannot be longer than 32 hex characters: %s", s) + } else if len(s) > 16 { + hiLen := len(s) - 16 + if hi, err = strconv.ParseUint(s[0:hiLen], 16, 64); err != nil { + return TraceID{}, err + } + if lo, err = strconv.ParseUint(s[hiLen:], 16, 64); err != nil { + return TraceID{}, err + } + } else { + if lo, err = strconv.ParseUint(s, 16, 64); err != nil { + return TraceID{}, err + } + } + return TraceID{High: hi, Low: lo}, nil +} + +// IsValid checks if the trace ID is valid, i.e. not zero. +func (t TraceID) IsValid() bool { + return t.High != 0 || t.Low != 0 +} + +// ------- SpanID ------- + +func (s SpanID) String() string { + return fmt.Sprintf("%x", uint64(s)) +} + +// SpanIDFromString creates a SpanID from a hexadecimal string +func SpanIDFromString(s string) (SpanID, error) { + if len(s) > 16 { + return SpanID(0), fmt.Errorf("SpanID cannot be longer than 16 hex characters: %s", s) + } + id, err := strconv.ParseUint(s, 16, 64) + if err != nil { + return SpanID(0), err + } + return SpanID(id), nil +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go new file mode 100644 index 00000000..e48811c5 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go @@ -0,0 +1,411 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package agent + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" + "github.com/uber/jaeger-client-go/thrift-gen/jaeger" + "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +var _ = jaeger.GoUnusedProtection__ +var _ = zipkincore.GoUnusedProtection__ + +type Agent interface { + // Parameters: + // - Spans + EmitZipkinBatch(spans []*zipkincore.Span) (err error) + // Parameters: + // - Batch + EmitBatch(batch *jaeger.Batch) (err error) +} + +type AgentClient struct { + Transport thrift.TTransport + ProtocolFactory thrift.TProtocolFactory + InputProtocol thrift.TProtocol + OutputProtocol thrift.TProtocol + SeqId int32 +} + +func NewAgentClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *AgentClient { + return &AgentClient{Transport: t, + ProtocolFactory: f, + InputProtocol: f.GetProtocol(t), + OutputProtocol: f.GetProtocol(t), + SeqId: 0, + } +} + +func NewAgentClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *AgentClient { + return &AgentClient{Transport: t, + ProtocolFactory: nil, + InputProtocol: iprot, + OutputProtocol: oprot, + SeqId: 0, + } +} + +// Parameters: +// - Spans +func (p *AgentClient) EmitZipkinBatch(spans []*zipkincore.Span) (err error) { + if err = p.sendEmitZipkinBatch(spans); err != nil { + return + } + return +} + +func (p *AgentClient) sendEmitZipkinBatch(spans []*zipkincore.Span) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("emitZipkinBatch", thrift.ONEWAY, p.SeqId); err != nil { + return + } + args := AgentEmitZipkinBatchArgs{ + Spans: spans, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +// Parameters: +// - Batch +func (p *AgentClient) EmitBatch(batch *jaeger.Batch) (err error) { + if err = p.sendEmitBatch(batch); err != nil { + return + } + return +} + +func (p *AgentClient) sendEmitBatch(batch *jaeger.Batch) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("emitBatch", thrift.ONEWAY, p.SeqId); err != nil { + return + } + args := AgentEmitBatchArgs{ + Batch: batch, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +type AgentProcessor struct { + processorMap map[string]thrift.TProcessorFunction + handler Agent +} + +func (p *AgentProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { + p.processorMap[key] = processor +} + +func (p *AgentProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { + processor, ok = p.processorMap[key] + return processor, ok +} + +func (p *AgentProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { + return p.processorMap +} + +func NewAgentProcessor(handler Agent) *AgentProcessor { + + self0 := &AgentProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self0.processorMap["emitZipkinBatch"] = &agentProcessorEmitZipkinBatch{handler: handler} + self0.processorMap["emitBatch"] = &agentProcessorEmitBatch{handler: handler} + return self0 +} + +func (p *AgentProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + name, _, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return false, err + } + if processor, ok := p.GetProcessorFunction(name); ok { + return processor.Process(seqId, iprot, oprot) + } + iprot.Skip(thrift.STRUCT) + iprot.ReadMessageEnd() + x1 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) + x1.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, x1 + +} + +type agentProcessorEmitZipkinBatch struct { + handler Agent +} + +func (p *agentProcessorEmitZipkinBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := AgentEmitZipkinBatchArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + return false, err + } + + iprot.ReadMessageEnd() + var err2 error + if err2 = p.handler.EmitZipkinBatch(args.Spans); err2 != nil { + return true, err2 + } + return true, nil +} + +type agentProcessorEmitBatch struct { + handler Agent +} + +func (p *agentProcessorEmitBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := AgentEmitBatchArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + return false, err + } + + iprot.ReadMessageEnd() + var err2 error + if err2 = p.handler.EmitBatch(args.Batch); err2 != nil { + return true, err2 + } + return true, nil +} + +// HELPER FUNCTIONS AND STRUCTURES + +// Attributes: +// - Spans +type AgentEmitZipkinBatchArgs struct { + Spans []*zipkincore.Span `thrift:"spans,1" json:"spans"` +} + +func NewAgentEmitZipkinBatchArgs() *AgentEmitZipkinBatchArgs { + return &AgentEmitZipkinBatchArgs{} +} + +func (p *AgentEmitZipkinBatchArgs) GetSpans() []*zipkincore.Span { + return p.Spans +} +func (p *AgentEmitZipkinBatchArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *AgentEmitZipkinBatchArgs) readField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*zipkincore.Span, 0, size) + p.Spans = tSlice + for i := 0; i < size; i++ { + _elem2 := &zipkincore.Span{} + if err := _elem2.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem2), err) + } + p.Spans = append(p.Spans, _elem2) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *AgentEmitZipkinBatchArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("emitZipkinBatch_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AgentEmitZipkinBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("spans", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:spans: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Spans { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:spans: ", p), err) + } + return err +} + +func (p *AgentEmitZipkinBatchArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AgentEmitZipkinBatchArgs(%+v)", *p) +} + +// Attributes: +// - Batch +type AgentEmitBatchArgs struct { + Batch *jaeger.Batch `thrift:"batch,1" json:"batch"` +} + +func NewAgentEmitBatchArgs() *AgentEmitBatchArgs { + return &AgentEmitBatchArgs{} +} + +var AgentEmitBatchArgs_Batch_DEFAULT *jaeger.Batch + +func (p *AgentEmitBatchArgs) GetBatch() *jaeger.Batch { + if !p.IsSetBatch() { + return AgentEmitBatchArgs_Batch_DEFAULT + } + return p.Batch +} +func (p *AgentEmitBatchArgs) IsSetBatch() bool { + return p.Batch != nil +} + +func (p *AgentEmitBatchArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *AgentEmitBatchArgs) readField1(iprot thrift.TProtocol) error { + p.Batch = &jaeger.Batch{} + if err := p.Batch.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Batch), err) + } + return nil +} + +func (p *AgentEmitBatchArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("emitBatch_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AgentEmitBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("batch", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:batch: ", p), err) + } + if err := p.Batch.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Batch), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:batch: ", p), err) + } + return err +} + +func (p *AgentEmitBatchArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AgentEmitBatchArgs(%+v)", *p) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go new file mode 100644 index 00000000..aa9857bb --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go @@ -0,0 +1,23 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package agent + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" + "github.com/uber/jaeger-client-go/thrift-gen/jaeger" + "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +var _ = jaeger.GoUnusedProtection__ +var _ = zipkincore.GoUnusedProtection__ + +func init() { +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go new file mode 100644 index 00000000..9c28f11c --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go @@ -0,0 +1,21 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package agent + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" + "github.com/uber/jaeger-client-go/thrift-gen/jaeger" + "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +var _ = jaeger.GoUnusedProtection__ +var _ = zipkincore.GoUnusedProtection__ +var GoUnusedProtection__ int diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go new file mode 100644 index 00000000..1f79c125 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go @@ -0,0 +1,435 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package baggage + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +type BaggageRestrictionManager interface { + // getBaggageRestrictions retrieves the baggage restrictions for a specific service. + // Usually, baggageRestrictions apply to all services however there may be situations + // where a baggageKey might only be allowed to be set by a specific service. + // + // Parameters: + // - ServiceName + GetBaggageRestrictions(serviceName string) (r []*BaggageRestriction, err error) +} + +type BaggageRestrictionManagerClient struct { + Transport thrift.TTransport + ProtocolFactory thrift.TProtocolFactory + InputProtocol thrift.TProtocol + OutputProtocol thrift.TProtocol + SeqId int32 +} + +func NewBaggageRestrictionManagerClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *BaggageRestrictionManagerClient { + return &BaggageRestrictionManagerClient{Transport: t, + ProtocolFactory: f, + InputProtocol: f.GetProtocol(t), + OutputProtocol: f.GetProtocol(t), + SeqId: 0, + } +} + +func NewBaggageRestrictionManagerClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *BaggageRestrictionManagerClient { + return &BaggageRestrictionManagerClient{Transport: t, + ProtocolFactory: nil, + InputProtocol: iprot, + OutputProtocol: oprot, + SeqId: 0, + } +} + +// getBaggageRestrictions retrieves the baggage restrictions for a specific service. +// Usually, baggageRestrictions apply to all services however there may be situations +// where a baggageKey might only be allowed to be set by a specific service. +// +// Parameters: +// - ServiceName +func (p *BaggageRestrictionManagerClient) GetBaggageRestrictions(serviceName string) (r []*BaggageRestriction, err error) { + if err = p.sendGetBaggageRestrictions(serviceName); err != nil { + return + } + return p.recvGetBaggageRestrictions() +} + +func (p *BaggageRestrictionManagerClient) sendGetBaggageRestrictions(serviceName string) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("getBaggageRestrictions", thrift.CALL, p.SeqId); err != nil { + return + } + args := BaggageRestrictionManagerGetBaggageRestrictionsArgs{ + ServiceName: serviceName, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *BaggageRestrictionManagerClient) recvGetBaggageRestrictions() (value []*BaggageRestriction, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "getBaggageRestrictions" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "getBaggageRestrictions failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "getBaggageRestrictions failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error0 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error1 error + error1, err = error0.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error1 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "getBaggageRestrictions failed: invalid message type") + return + } + result := BaggageRestrictionManagerGetBaggageRestrictionsResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + value = result.GetSuccess() + return +} + +type BaggageRestrictionManagerProcessor struct { + processorMap map[string]thrift.TProcessorFunction + handler BaggageRestrictionManager +} + +func (p *BaggageRestrictionManagerProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { + p.processorMap[key] = processor +} + +func (p *BaggageRestrictionManagerProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { + processor, ok = p.processorMap[key] + return processor, ok +} + +func (p *BaggageRestrictionManagerProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { + return p.processorMap +} + +func NewBaggageRestrictionManagerProcessor(handler BaggageRestrictionManager) *BaggageRestrictionManagerProcessor { + + self2 := &BaggageRestrictionManagerProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self2.processorMap["getBaggageRestrictions"] = &baggageRestrictionManagerProcessorGetBaggageRestrictions{handler: handler} + return self2 +} + +func (p *BaggageRestrictionManagerProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + name, _, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return false, err + } + if processor, ok := p.GetProcessorFunction(name); ok { + return processor.Process(seqId, iprot, oprot) + } + iprot.Skip(thrift.STRUCT) + iprot.ReadMessageEnd() + x3 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) + x3.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, x3 + +} + +type baggageRestrictionManagerProcessorGetBaggageRestrictions struct { + handler BaggageRestrictionManager +} + +func (p *baggageRestrictionManagerProcessorGetBaggageRestrictions) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := BaggageRestrictionManagerGetBaggageRestrictionsArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("getBaggageRestrictions", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := BaggageRestrictionManagerGetBaggageRestrictionsResult{} + var retval []*BaggageRestriction + var err2 error + if retval, err2 = p.handler.GetBaggageRestrictions(args.ServiceName); err2 != nil { + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getBaggageRestrictions: "+err2.Error()) + oprot.WriteMessageBegin("getBaggageRestrictions", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("getBaggageRestrictions", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +// HELPER FUNCTIONS AND STRUCTURES + +// Attributes: +// - ServiceName +type BaggageRestrictionManagerGetBaggageRestrictionsArgs struct { + ServiceName string `thrift:"serviceName,1" json:"serviceName"` +} + +func NewBaggageRestrictionManagerGetBaggageRestrictionsArgs() *BaggageRestrictionManagerGetBaggageRestrictionsArgs { + return &BaggageRestrictionManagerGetBaggageRestrictionsArgs{} +} + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) GetServiceName() string { + return p.ServiceName +} +func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ServiceName = v + } + return nil +} + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getBaggageRestrictions_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("serviceName", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:serviceName: ", p), err) + } + if err := oprot.WriteString(string(p.ServiceName)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.serviceName (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:serviceName: ", p), err) + } + return err +} + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("BaggageRestrictionManagerGetBaggageRestrictionsArgs(%+v)", *p) +} + +// Attributes: +// - Success +type BaggageRestrictionManagerGetBaggageRestrictionsResult struct { + Success []*BaggageRestriction `thrift:"success,0" json:"success,omitempty"` +} + +func NewBaggageRestrictionManagerGetBaggageRestrictionsResult() *BaggageRestrictionManagerGetBaggageRestrictionsResult { + return &BaggageRestrictionManagerGetBaggageRestrictionsResult{} +} + +var BaggageRestrictionManagerGetBaggageRestrictionsResult_Success_DEFAULT []*BaggageRestriction + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) GetSuccess() []*BaggageRestriction { + return p.Success +} +func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.readField0(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) readField0(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*BaggageRestriction, 0, size) + p.Success = tSlice + for i := 0; i < size; i++ { + _elem4 := &BaggageRestriction{} + if err := _elem4.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem4), err) + } + p.Success = append(p.Success, _elem4) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getBaggageRestrictions_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField0(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.LIST, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Success)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Success { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("BaggageRestrictionManagerGetBaggageRestrictionsResult(%+v)", *p) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go new file mode 100644 index 00000000..ed35ce9a --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go @@ -0,0 +1,18 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package baggage + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +func init() { +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go new file mode 100644 index 00000000..7888892f --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go @@ -0,0 +1,154 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package baggage + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +var GoUnusedProtection__ int + +// Attributes: +// - BaggageKey +// - MaxValueLength +type BaggageRestriction struct { + BaggageKey string `thrift:"baggageKey,1,required" json:"baggageKey"` + MaxValueLength int32 `thrift:"maxValueLength,2,required" json:"maxValueLength"` +} + +func NewBaggageRestriction() *BaggageRestriction { + return &BaggageRestriction{} +} + +func (p *BaggageRestriction) GetBaggageKey() string { + return p.BaggageKey +} + +func (p *BaggageRestriction) GetMaxValueLength() int32 { + return p.MaxValueLength +} +func (p *BaggageRestriction) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetBaggageKey bool = false + var issetMaxValueLength bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetBaggageKey = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + issetMaxValueLength = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetBaggageKey { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field BaggageKey is not set")) + } + if !issetMaxValueLength { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MaxValueLength is not set")) + } + return nil +} + +func (p *BaggageRestriction) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.BaggageKey = v + } + return nil +} + +func (p *BaggageRestriction) readField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.MaxValueLength = v + } + return nil +} + +func (p *BaggageRestriction) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("BaggageRestriction"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *BaggageRestriction) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("baggageKey", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:baggageKey: ", p), err) + } + if err := oprot.WriteString(string(p.BaggageKey)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.baggageKey (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:baggageKey: ", p), err) + } + return err +} + +func (p *BaggageRestriction) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("maxValueLength", thrift.I32, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:maxValueLength: ", p), err) + } + if err := oprot.WriteI32(int32(p.MaxValueLength)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.maxValueLength (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:maxValueLength: ", p), err) + } + return err +} + +func (p *BaggageRestriction) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("BaggageRestriction(%+v)", *p) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go new file mode 100644 index 00000000..b32c37dd --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go @@ -0,0 +1,242 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package jaeger + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +type Agent interface { + // Parameters: + // - Batch + EmitBatch(batch *Batch) (err error) +} + +type AgentClient struct { + Transport thrift.TTransport + ProtocolFactory thrift.TProtocolFactory + InputProtocol thrift.TProtocol + OutputProtocol thrift.TProtocol + SeqId int32 +} + +func NewAgentClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *AgentClient { + return &AgentClient{Transport: t, + ProtocolFactory: f, + InputProtocol: f.GetProtocol(t), + OutputProtocol: f.GetProtocol(t), + SeqId: 0, + } +} + +func NewAgentClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *AgentClient { + return &AgentClient{Transport: t, + ProtocolFactory: nil, + InputProtocol: iprot, + OutputProtocol: oprot, + SeqId: 0, + } +} + +// Parameters: +// - Batch +func (p *AgentClient) EmitBatch(batch *Batch) (err error) { + if err = p.sendEmitBatch(batch); err != nil { + return + } + return +} + +func (p *AgentClient) sendEmitBatch(batch *Batch) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("emitBatch", thrift.ONEWAY, p.SeqId); err != nil { + return + } + args := AgentEmitBatchArgs{ + Batch: batch, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +type AgentProcessor struct { + processorMap map[string]thrift.TProcessorFunction + handler Agent +} + +func (p *AgentProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { + p.processorMap[key] = processor +} + +func (p *AgentProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { + processor, ok = p.processorMap[key] + return processor, ok +} + +func (p *AgentProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { + return p.processorMap +} + +func NewAgentProcessor(handler Agent) *AgentProcessor { + + self6 := &AgentProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self6.processorMap["emitBatch"] = &agentProcessorEmitBatch{handler: handler} + return self6 +} + +func (p *AgentProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + name, _, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return false, err + } + if processor, ok := p.GetProcessorFunction(name); ok { + return processor.Process(seqId, iprot, oprot) + } + iprot.Skip(thrift.STRUCT) + iprot.ReadMessageEnd() + x7 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) + x7.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, x7 + +} + +type agentProcessorEmitBatch struct { + handler Agent +} + +func (p *agentProcessorEmitBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := AgentEmitBatchArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + return false, err + } + + iprot.ReadMessageEnd() + var err2 error + if err2 = p.handler.EmitBatch(args.Batch); err2 != nil { + return true, err2 + } + return true, nil +} + +// HELPER FUNCTIONS AND STRUCTURES + +// Attributes: +// - Batch +type AgentEmitBatchArgs struct { + Batch *Batch `thrift:"batch,1" json:"batch"` +} + +func NewAgentEmitBatchArgs() *AgentEmitBatchArgs { + return &AgentEmitBatchArgs{} +} + +var AgentEmitBatchArgs_Batch_DEFAULT *Batch + +func (p *AgentEmitBatchArgs) GetBatch() *Batch { + if !p.IsSetBatch() { + return AgentEmitBatchArgs_Batch_DEFAULT + } + return p.Batch +} +func (p *AgentEmitBatchArgs) IsSetBatch() bool { + return p.Batch != nil +} + +func (p *AgentEmitBatchArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *AgentEmitBatchArgs) readField1(iprot thrift.TProtocol) error { + p.Batch = &Batch{} + if err := p.Batch.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Batch), err) + } + return nil +} + +func (p *AgentEmitBatchArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("emitBatch_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *AgentEmitBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("batch", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:batch: ", p), err) + } + if err := p.Batch.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Batch), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:batch: ", p), err) + } + return err +} + +func (p *AgentEmitBatchArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("AgentEmitBatchArgs(%+v)", *p) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go new file mode 100644 index 00000000..621b8b1c --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go @@ -0,0 +1,18 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package jaeger + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +func init() { +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go new file mode 100644 index 00000000..e69c6d60 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go @@ -0,0 +1,2106 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package jaeger + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +var GoUnusedProtection__ int + +type TagType int64 + +const ( + TagType_STRING TagType = 0 + TagType_DOUBLE TagType = 1 + TagType_BOOL TagType = 2 + TagType_LONG TagType = 3 + TagType_BINARY TagType = 4 +) + +func (p TagType) String() string { + switch p { + case TagType_STRING: + return "STRING" + case TagType_DOUBLE: + return "DOUBLE" + case TagType_BOOL: + return "BOOL" + case TagType_LONG: + return "LONG" + case TagType_BINARY: + return "BINARY" + } + return "" +} + +func TagTypeFromString(s string) (TagType, error) { + switch s { + case "STRING": + return TagType_STRING, nil + case "DOUBLE": + return TagType_DOUBLE, nil + case "BOOL": + return TagType_BOOL, nil + case "LONG": + return TagType_LONG, nil + case "BINARY": + return TagType_BINARY, nil + } + return TagType(0), fmt.Errorf("not a valid TagType string") +} + +func TagTypePtr(v TagType) *TagType { return &v } + +func (p TagType) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *TagType) UnmarshalText(text []byte) error { + q, err := TagTypeFromString(string(text)) + if err != nil { + return err + } + *p = q + return nil +} + +type SpanRefType int64 + +const ( + SpanRefType_CHILD_OF SpanRefType = 0 + SpanRefType_FOLLOWS_FROM SpanRefType = 1 +) + +func (p SpanRefType) String() string { + switch p { + case SpanRefType_CHILD_OF: + return "CHILD_OF" + case SpanRefType_FOLLOWS_FROM: + return "FOLLOWS_FROM" + } + return "" +} + +func SpanRefTypeFromString(s string) (SpanRefType, error) { + switch s { + case "CHILD_OF": + return SpanRefType_CHILD_OF, nil + case "FOLLOWS_FROM": + return SpanRefType_FOLLOWS_FROM, nil + } + return SpanRefType(0), fmt.Errorf("not a valid SpanRefType string") +} + +func SpanRefTypePtr(v SpanRefType) *SpanRefType { return &v } + +func (p SpanRefType) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *SpanRefType) UnmarshalText(text []byte) error { + q, err := SpanRefTypeFromString(string(text)) + if err != nil { + return err + } + *p = q + return nil +} + +// Attributes: +// - Key +// - VType +// - VStr +// - VDouble +// - VBool +// - VLong +// - VBinary +type Tag struct { + Key string `thrift:"key,1,required" json:"key"` + VType TagType `thrift:"vType,2,required" json:"vType"` + VStr *string `thrift:"vStr,3" json:"vStr,omitempty"` + VDouble *float64 `thrift:"vDouble,4" json:"vDouble,omitempty"` + VBool *bool `thrift:"vBool,5" json:"vBool,omitempty"` + VLong *int64 `thrift:"vLong,6" json:"vLong,omitempty"` + VBinary []byte `thrift:"vBinary,7" json:"vBinary,omitempty"` +} + +func NewTag() *Tag { + return &Tag{} +} + +func (p *Tag) GetKey() string { + return p.Key +} + +func (p *Tag) GetVType() TagType { + return p.VType +} + +var Tag_VStr_DEFAULT string + +func (p *Tag) GetVStr() string { + if !p.IsSetVStr() { + return Tag_VStr_DEFAULT + } + return *p.VStr +} + +var Tag_VDouble_DEFAULT float64 + +func (p *Tag) GetVDouble() float64 { + if !p.IsSetVDouble() { + return Tag_VDouble_DEFAULT + } + return *p.VDouble +} + +var Tag_VBool_DEFAULT bool + +func (p *Tag) GetVBool() bool { + if !p.IsSetVBool() { + return Tag_VBool_DEFAULT + } + return *p.VBool +} + +var Tag_VLong_DEFAULT int64 + +func (p *Tag) GetVLong() int64 { + if !p.IsSetVLong() { + return Tag_VLong_DEFAULT + } + return *p.VLong +} + +var Tag_VBinary_DEFAULT []byte + +func (p *Tag) GetVBinary() []byte { + return p.VBinary +} +func (p *Tag) IsSetVStr() bool { + return p.VStr != nil +} + +func (p *Tag) IsSetVDouble() bool { + return p.VDouble != nil +} + +func (p *Tag) IsSetVBool() bool { + return p.VBool != nil +} + +func (p *Tag) IsSetVLong() bool { + return p.VLong != nil +} + +func (p *Tag) IsSetVBinary() bool { + return p.VBinary != nil +} + +func (p *Tag) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetKey bool = false + var issetVType bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetKey = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + issetVType = true + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + case 4: + if err := p.readField4(iprot); err != nil { + return err + } + case 5: + if err := p.readField5(iprot); err != nil { + return err + } + case 6: + if err := p.readField6(iprot); err != nil { + return err + } + case 7: + if err := p.readField7(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetKey { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Key is not set")) + } + if !issetVType { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field VType is not set")) + } + return nil +} + +func (p *Tag) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Key = v + } + return nil +} + +func (p *Tag) readField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + temp := TagType(v) + p.VType = temp + } + return nil +} + +func (p *Tag) readField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.VStr = &v + } + return nil +} + +func (p *Tag) readField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadDouble(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.VDouble = &v + } + return nil +} + +func (p *Tag) readField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.VBool = &v + } + return nil +} + +func (p *Tag) readField6(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 6: ", err) + } else { + p.VLong = &v + } + return nil +} + +func (p *Tag) readField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + p.VBinary = v + } + return nil +} + +func (p *Tag) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Tag"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Tag) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("key", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:key: ", p), err) + } + if err := oprot.WriteString(string(p.Key)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.key (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:key: ", p), err) + } + return err +} + +func (p *Tag) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("vType", thrift.I32, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:vType: ", p), err) + } + if err := oprot.WriteI32(int32(p.VType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.vType (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:vType: ", p), err) + } + return err +} + +func (p *Tag) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetVStr() { + if err := oprot.WriteFieldBegin("vStr", thrift.STRING, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:vStr: ", p), err) + } + if err := oprot.WriteString(string(*p.VStr)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.vStr (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:vStr: ", p), err) + } + } + return err +} + +func (p *Tag) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetVDouble() { + if err := oprot.WriteFieldBegin("vDouble", thrift.DOUBLE, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:vDouble: ", p), err) + } + if err := oprot.WriteDouble(float64(*p.VDouble)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.vDouble (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:vDouble: ", p), err) + } + } + return err +} + +func (p *Tag) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetVBool() { + if err := oprot.WriteFieldBegin("vBool", thrift.BOOL, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:vBool: ", p), err) + } + if err := oprot.WriteBool(bool(*p.VBool)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.vBool (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:vBool: ", p), err) + } + } + return err +} + +func (p *Tag) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetVLong() { + if err := oprot.WriteFieldBegin("vLong", thrift.I64, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:vLong: ", p), err) + } + if err := oprot.WriteI64(int64(*p.VLong)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.vLong (6) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:vLong: ", p), err) + } + } + return err +} + +func (p *Tag) writeField7(oprot thrift.TProtocol) (err error) { + if p.IsSetVBinary() { + if err := oprot.WriteFieldBegin("vBinary", thrift.STRING, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:vBinary: ", p), err) + } + if err := oprot.WriteBinary(p.VBinary); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.vBinary (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:vBinary: ", p), err) + } + } + return err +} + +func (p *Tag) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Tag(%+v)", *p) +} + +// Attributes: +// - Timestamp +// - Fields +type Log struct { + Timestamp int64 `thrift:"timestamp,1,required" json:"timestamp"` + Fields []*Tag `thrift:"fields,2,required" json:"fields"` +} + +func NewLog() *Log { + return &Log{} +} + +func (p *Log) GetTimestamp() int64 { + return p.Timestamp +} + +func (p *Log) GetFields() []*Tag { + return p.Fields +} +func (p *Log) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetTimestamp bool = false + var issetFields bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetTimestamp = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + issetFields = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetTimestamp { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamp is not set")) + } + if !issetFields { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Fields is not set")) + } + return nil +} + +func (p *Log) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Timestamp = v + } + return nil +} + +func (p *Log) readField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Tag, 0, size) + p.Fields = tSlice + for i := 0; i < size; i++ { + _elem0 := &Tag{} + if err := _elem0.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err) + } + p.Fields = append(p.Fields, _elem0) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *Log) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Log"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Log) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:timestamp: ", p), err) + } + if err := oprot.WriteI64(int64(p.Timestamp)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.timestamp (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:timestamp: ", p), err) + } + return err +} + +func (p *Log) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("fields", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:fields: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Fields)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Fields { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:fields: ", p), err) + } + return err +} + +func (p *Log) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Log(%+v)", *p) +} + +// Attributes: +// - RefType +// - TraceIdLow +// - TraceIdHigh +// - SpanId +type SpanRef struct { + RefType SpanRefType `thrift:"refType,1,required" json:"refType"` + TraceIdLow int64 `thrift:"traceIdLow,2,required" json:"traceIdLow"` + TraceIdHigh int64 `thrift:"traceIdHigh,3,required" json:"traceIdHigh"` + SpanId int64 `thrift:"spanId,4,required" json:"spanId"` +} + +func NewSpanRef() *SpanRef { + return &SpanRef{} +} + +func (p *SpanRef) GetRefType() SpanRefType { + return p.RefType +} + +func (p *SpanRef) GetTraceIdLow() int64 { + return p.TraceIdLow +} + +func (p *SpanRef) GetTraceIdHigh() int64 { + return p.TraceIdHigh +} + +func (p *SpanRef) GetSpanId() int64 { + return p.SpanId +} +func (p *SpanRef) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetRefType bool = false + var issetTraceIdLow bool = false + var issetTraceIdHigh bool = false + var issetSpanId bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetRefType = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + issetTraceIdLow = true + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + issetTraceIdHigh = true + case 4: + if err := p.readField4(iprot); err != nil { + return err + } + issetSpanId = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetRefType { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RefType is not set")) + } + if !issetTraceIdLow { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdLow is not set")) + } + if !issetTraceIdHigh { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdHigh is not set")) + } + if !issetSpanId { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SpanId is not set")) + } + return nil +} + +func (p *SpanRef) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + temp := SpanRefType(v) + p.RefType = temp + } + return nil +} + +func (p *SpanRef) readField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.TraceIdLow = v + } + return nil +} + +func (p *SpanRef) readField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.TraceIdHigh = v + } + return nil +} + +func (p *SpanRef) readField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.SpanId = v + } + return nil +} + +func (p *SpanRef) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("SpanRef"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *SpanRef) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("refType", thrift.I32, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:refType: ", p), err) + } + if err := oprot.WriteI32(int32(p.RefType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.refType (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:refType: ", p), err) + } + return err +} + +func (p *SpanRef) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("traceIdLow", thrift.I64, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:traceIdLow: ", p), err) + } + if err := oprot.WriteI64(int64(p.TraceIdLow)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.traceIdLow (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:traceIdLow: ", p), err) + } + return err +} + +func (p *SpanRef) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("traceIdHigh", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:traceIdHigh: ", p), err) + } + if err := oprot.WriteI64(int64(p.TraceIdHigh)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.traceIdHigh (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:traceIdHigh: ", p), err) + } + return err +} + +func (p *SpanRef) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("spanId", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:spanId: ", p), err) + } + if err := oprot.WriteI64(int64(p.SpanId)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.spanId (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:spanId: ", p), err) + } + return err +} + +func (p *SpanRef) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("SpanRef(%+v)", *p) +} + +// Attributes: +// - TraceIdLow +// - TraceIdHigh +// - SpanId +// - ParentSpanId +// - OperationName +// - References +// - Flags +// - StartTime +// - Duration +// - Tags +// - Logs +type Span struct { + TraceIdLow int64 `thrift:"traceIdLow,1,required" json:"traceIdLow"` + TraceIdHigh int64 `thrift:"traceIdHigh,2,required" json:"traceIdHigh"` + SpanId int64 `thrift:"spanId,3,required" json:"spanId"` + ParentSpanId int64 `thrift:"parentSpanId,4,required" json:"parentSpanId"` + OperationName string `thrift:"operationName,5,required" json:"operationName"` + References []*SpanRef `thrift:"references,6" json:"references,omitempty"` + Flags int32 `thrift:"flags,7,required" json:"flags"` + StartTime int64 `thrift:"startTime,8,required" json:"startTime"` + Duration int64 `thrift:"duration,9,required" json:"duration"` + Tags []*Tag `thrift:"tags,10" json:"tags,omitempty"` + Logs []*Log `thrift:"logs,11" json:"logs,omitempty"` +} + +func NewSpan() *Span { + return &Span{} +} + +func (p *Span) GetTraceIdLow() int64 { + return p.TraceIdLow +} + +func (p *Span) GetTraceIdHigh() int64 { + return p.TraceIdHigh +} + +func (p *Span) GetSpanId() int64 { + return p.SpanId +} + +func (p *Span) GetParentSpanId() int64 { + return p.ParentSpanId +} + +func (p *Span) GetOperationName() string { + return p.OperationName +} + +var Span_References_DEFAULT []*SpanRef + +func (p *Span) GetReferences() []*SpanRef { + return p.References +} + +func (p *Span) GetFlags() int32 { + return p.Flags +} + +func (p *Span) GetStartTime() int64 { + return p.StartTime +} + +func (p *Span) GetDuration() int64 { + return p.Duration +} + +var Span_Tags_DEFAULT []*Tag + +func (p *Span) GetTags() []*Tag { + return p.Tags +} + +var Span_Logs_DEFAULT []*Log + +func (p *Span) GetLogs() []*Log { + return p.Logs +} +func (p *Span) IsSetReferences() bool { + return p.References != nil +} + +func (p *Span) IsSetTags() bool { + return p.Tags != nil +} + +func (p *Span) IsSetLogs() bool { + return p.Logs != nil +} + +func (p *Span) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetTraceIdLow bool = false + var issetTraceIdHigh bool = false + var issetSpanId bool = false + var issetParentSpanId bool = false + var issetOperationName bool = false + var issetFlags bool = false + var issetStartTime bool = false + var issetDuration bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetTraceIdLow = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + issetTraceIdHigh = true + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + issetSpanId = true + case 4: + if err := p.readField4(iprot); err != nil { + return err + } + issetParentSpanId = true + case 5: + if err := p.readField5(iprot); err != nil { + return err + } + issetOperationName = true + case 6: + if err := p.readField6(iprot); err != nil { + return err + } + case 7: + if err := p.readField7(iprot); err != nil { + return err + } + issetFlags = true + case 8: + if err := p.readField8(iprot); err != nil { + return err + } + issetStartTime = true + case 9: + if err := p.readField9(iprot); err != nil { + return err + } + issetDuration = true + case 10: + if err := p.readField10(iprot); err != nil { + return err + } + case 11: + if err := p.readField11(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetTraceIdLow { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdLow is not set")) + } + if !issetTraceIdHigh { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdHigh is not set")) + } + if !issetSpanId { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SpanId is not set")) + } + if !issetParentSpanId { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ParentSpanId is not set")) + } + if !issetOperationName { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field OperationName is not set")) + } + if !issetFlags { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Flags is not set")) + } + if !issetStartTime { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StartTime is not set")) + } + if !issetDuration { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Duration is not set")) + } + return nil +} + +func (p *Span) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.TraceIdLow = v + } + return nil +} + +func (p *Span) readField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.TraceIdHigh = v + } + return nil +} + +func (p *Span) readField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.SpanId = v + } + return nil +} + +func (p *Span) readField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.ParentSpanId = v + } + return nil +} + +func (p *Span) readField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.OperationName = v + } + return nil +} + +func (p *Span) readField6(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*SpanRef, 0, size) + p.References = tSlice + for i := 0; i < size; i++ { + _elem1 := &SpanRef{} + if err := _elem1.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem1), err) + } + p.References = append(p.References, _elem1) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *Span) readField7(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 7: ", err) + } else { + p.Flags = v + } + return nil +} + +func (p *Span) readField8(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 8: ", err) + } else { + p.StartTime = v + } + return nil +} + +func (p *Span) readField9(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 9: ", err) + } else { + p.Duration = v + } + return nil +} + +func (p *Span) readField10(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Tag, 0, size) + p.Tags = tSlice + for i := 0; i < size; i++ { + _elem2 := &Tag{} + if err := _elem2.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem2), err) + } + p.Tags = append(p.Tags, _elem2) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *Span) readField11(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Log, 0, size) + p.Logs = tSlice + for i := 0; i < size; i++ { + _elem3 := &Log{} + if err := _elem3.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem3), err) + } + p.Logs = append(p.Logs, _elem3) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *Span) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Span"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField7(oprot); err != nil { + return err + } + if err := p.writeField8(oprot); err != nil { + return err + } + if err := p.writeField9(oprot); err != nil { + return err + } + if err := p.writeField10(oprot); err != nil { + return err + } + if err := p.writeField11(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Span) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("traceIdLow", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:traceIdLow: ", p), err) + } + if err := oprot.WriteI64(int64(p.TraceIdLow)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.traceIdLow (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:traceIdLow: ", p), err) + } + return err +} + +func (p *Span) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("traceIdHigh", thrift.I64, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:traceIdHigh: ", p), err) + } + if err := oprot.WriteI64(int64(p.TraceIdHigh)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.traceIdHigh (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:traceIdHigh: ", p), err) + } + return err +} + +func (p *Span) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("spanId", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:spanId: ", p), err) + } + if err := oprot.WriteI64(int64(p.SpanId)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.spanId (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:spanId: ", p), err) + } + return err +} + +func (p *Span) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("parentSpanId", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:parentSpanId: ", p), err) + } + if err := oprot.WriteI64(int64(p.ParentSpanId)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.parentSpanId (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:parentSpanId: ", p), err) + } + return err +} + +func (p *Span) writeField5(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("operationName", thrift.STRING, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:operationName: ", p), err) + } + if err := oprot.WriteString(string(p.OperationName)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.operationName (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:operationName: ", p), err) + } + return err +} + +func (p *Span) writeField6(oprot thrift.TProtocol) (err error) { + if p.IsSetReferences() { + if err := oprot.WriteFieldBegin("references", thrift.LIST, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:references: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.References)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.References { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:references: ", p), err) + } + } + return err +} + +func (p *Span) writeField7(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("flags", thrift.I32, 7); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:flags: ", p), err) + } + if err := oprot.WriteI32(int32(p.Flags)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.flags (7) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 7:flags: ", p), err) + } + return err +} + +func (p *Span) writeField8(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("startTime", thrift.I64, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:startTime: ", p), err) + } + if err := oprot.WriteI64(int64(p.StartTime)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.startTime (8) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:startTime: ", p), err) + } + return err +} + +func (p *Span) writeField9(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("duration", thrift.I64, 9); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:duration: ", p), err) + } + if err := oprot.WriteI64(int64(p.Duration)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.duration (9) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 9:duration: ", p), err) + } + return err +} + +func (p *Span) writeField10(oprot thrift.TProtocol) (err error) { + if p.IsSetTags() { + if err := oprot.WriteFieldBegin("tags", thrift.LIST, 10); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 10:tags: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Tags)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Tags { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 10:tags: ", p), err) + } + } + return err +} + +func (p *Span) writeField11(oprot thrift.TProtocol) (err error) { + if p.IsSetLogs() { + if err := oprot.WriteFieldBegin("logs", thrift.LIST, 11); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 11:logs: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Logs)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Logs { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 11:logs: ", p), err) + } + } + return err +} + +func (p *Span) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Span(%+v)", *p) +} + +// Attributes: +// - ServiceName +// - Tags +type Process struct { + ServiceName string `thrift:"serviceName,1,required" json:"serviceName"` + Tags []*Tag `thrift:"tags,2" json:"tags,omitempty"` +} + +func NewProcess() *Process { + return &Process{} +} + +func (p *Process) GetServiceName() string { + return p.ServiceName +} + +var Process_Tags_DEFAULT []*Tag + +func (p *Process) GetTags() []*Tag { + return p.Tags +} +func (p *Process) IsSetTags() bool { + return p.Tags != nil +} + +func (p *Process) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetServiceName bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetServiceName = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetServiceName { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ServiceName is not set")) + } + return nil +} + +func (p *Process) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ServiceName = v + } + return nil +} + +func (p *Process) readField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Tag, 0, size) + p.Tags = tSlice + for i := 0; i < size; i++ { + _elem4 := &Tag{} + if err := _elem4.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem4), err) + } + p.Tags = append(p.Tags, _elem4) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *Process) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Process"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Process) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("serviceName", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:serviceName: ", p), err) + } + if err := oprot.WriteString(string(p.ServiceName)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.serviceName (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:serviceName: ", p), err) + } + return err +} + +func (p *Process) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetTags() { + if err := oprot.WriteFieldBegin("tags", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:tags: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Tags)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Tags { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:tags: ", p), err) + } + } + return err +} + +func (p *Process) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Process(%+v)", *p) +} + +// Attributes: +// - FullQueueDroppedSpans +// - TooLargeDroppedSpans +// - FailedToEmitSpans +type ClientStats struct { + FullQueueDroppedSpans int64 `thrift:"fullQueueDroppedSpans,1,required" json:"fullQueueDroppedSpans"` + TooLargeDroppedSpans int64 `thrift:"tooLargeDroppedSpans,2,required" json:"tooLargeDroppedSpans"` + FailedToEmitSpans int64 `thrift:"failedToEmitSpans,3,required" json:"failedToEmitSpans"` +} + +func NewClientStats() *ClientStats { + return &ClientStats{} +} + +func (p *ClientStats) GetFullQueueDroppedSpans() int64 { + return p.FullQueueDroppedSpans +} + +func (p *ClientStats) GetTooLargeDroppedSpans() int64 { + return p.TooLargeDroppedSpans +} + +func (p *ClientStats) GetFailedToEmitSpans() int64 { + return p.FailedToEmitSpans +} +func (p *ClientStats) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetFullQueueDroppedSpans bool = false + var issetTooLargeDroppedSpans bool = false + var issetFailedToEmitSpans bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetFullQueueDroppedSpans = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + issetTooLargeDroppedSpans = true + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + issetFailedToEmitSpans = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetFullQueueDroppedSpans { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field FullQueueDroppedSpans is not set")) + } + if !issetTooLargeDroppedSpans { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TooLargeDroppedSpans is not set")) + } + if !issetFailedToEmitSpans { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field FailedToEmitSpans is not set")) + } + return nil +} + +func (p *ClientStats) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.FullQueueDroppedSpans = v + } + return nil +} + +func (p *ClientStats) readField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.TooLargeDroppedSpans = v + } + return nil +} + +func (p *ClientStats) readField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.FailedToEmitSpans = v + } + return nil +} + +func (p *ClientStats) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("ClientStats"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ClientStats) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("fullQueueDroppedSpans", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:fullQueueDroppedSpans: ", p), err) + } + if err := oprot.WriteI64(int64(p.FullQueueDroppedSpans)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.fullQueueDroppedSpans (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:fullQueueDroppedSpans: ", p), err) + } + return err +} + +func (p *ClientStats) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("tooLargeDroppedSpans", thrift.I64, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:tooLargeDroppedSpans: ", p), err) + } + if err := oprot.WriteI64(int64(p.TooLargeDroppedSpans)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.tooLargeDroppedSpans (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:tooLargeDroppedSpans: ", p), err) + } + return err +} + +func (p *ClientStats) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("failedToEmitSpans", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:failedToEmitSpans: ", p), err) + } + if err := oprot.WriteI64(int64(p.FailedToEmitSpans)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.failedToEmitSpans (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:failedToEmitSpans: ", p), err) + } + return err +} + +func (p *ClientStats) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ClientStats(%+v)", *p) +} + +// Attributes: +// - Process +// - Spans +// - SeqNo +// - Stats +type Batch struct { + Process *Process `thrift:"process,1,required" json:"process"` + Spans []*Span `thrift:"spans,2,required" json:"spans"` + SeqNo *int64 `thrift:"seqNo,3" json:"seqNo,omitempty"` + Stats *ClientStats `thrift:"stats,4" json:"stats,omitempty"` +} + +func NewBatch() *Batch { + return &Batch{} +} + +var Batch_Process_DEFAULT *Process + +func (p *Batch) GetProcess() *Process { + if !p.IsSetProcess() { + return Batch_Process_DEFAULT + } + return p.Process +} + +func (p *Batch) GetSpans() []*Span { + return p.Spans +} + +var Batch_SeqNo_DEFAULT int64 + +func (p *Batch) GetSeqNo() int64 { + if !p.IsSetSeqNo() { + return Batch_SeqNo_DEFAULT + } + return *p.SeqNo +} + +var Batch_Stats_DEFAULT *ClientStats + +func (p *Batch) GetStats() *ClientStats { + if !p.IsSetStats() { + return Batch_Stats_DEFAULT + } + return p.Stats +} +func (p *Batch) IsSetProcess() bool { + return p.Process != nil +} + +func (p *Batch) IsSetSeqNo() bool { + return p.SeqNo != nil +} + +func (p *Batch) IsSetStats() bool { + return p.Stats != nil +} + +func (p *Batch) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetProcess bool = false + var issetSpans bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetProcess = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + issetSpans = true + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + case 4: + if err := p.readField4(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetProcess { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Process is not set")) + } + if !issetSpans { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Spans is not set")) + } + return nil +} + +func (p *Batch) readField1(iprot thrift.TProtocol) error { + p.Process = &Process{} + if err := p.Process.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Process), err) + } + return nil +} + +func (p *Batch) readField2(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Span, 0, size) + p.Spans = tSlice + for i := 0; i < size; i++ { + _elem5 := &Span{} + if err := _elem5.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem5), err) + } + p.Spans = append(p.Spans, _elem5) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *Batch) readField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.SeqNo = &v + } + return nil +} + +func (p *Batch) readField4(iprot thrift.TProtocol) error { + p.Stats = &ClientStats{} + if err := p.Stats.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Stats), err) + } + return nil +} + +func (p *Batch) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Batch"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Batch) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("process", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:process: ", p), err) + } + if err := p.Process.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Process), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:process: ", p), err) + } + return err +} + +func (p *Batch) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("spans", thrift.LIST, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:spans: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Spans { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:spans: ", p), err) + } + return err +} + +func (p *Batch) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetSeqNo() { + if err := oprot.WriteFieldBegin("seqNo", thrift.I64, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:seqNo: ", p), err) + } + if err := oprot.WriteI64(int64(*p.SeqNo)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.seqNo (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:seqNo: ", p), err) + } + } + return err +} + +func (p *Batch) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetStats() { + if err := oprot.WriteFieldBegin("stats", thrift.STRUCT, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:stats: ", p), err) + } + if err := p.Stats.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Stats), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:stats: ", p), err) + } + } + return err +} + +func (p *Batch) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Batch(%+v)", *p) +} + +// Attributes: +// - Ok +type BatchSubmitResponse struct { + Ok bool `thrift:"ok,1,required" json:"ok"` +} + +func NewBatchSubmitResponse() *BatchSubmitResponse { + return &BatchSubmitResponse{} +} + +func (p *BatchSubmitResponse) GetOk() bool { + return p.Ok +} +func (p *BatchSubmitResponse) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetOk bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetOk = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetOk { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Ok is not set")) + } + return nil +} + +func (p *BatchSubmitResponse) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Ok = v + } + return nil +} + +func (p *BatchSubmitResponse) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("BatchSubmitResponse"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *BatchSubmitResponse) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("ok", thrift.BOOL, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ok: ", p), err) + } + if err := oprot.WriteBool(bool(p.Ok)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.ok (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ok: ", p), err) + } + return err +} + +func (p *BatchSubmitResponse) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("BatchSubmitResponse(%+v)", *p) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go new file mode 100644 index 00000000..0f6e3a88 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go @@ -0,0 +1,18 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package sampling + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +func init() { +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go new file mode 100644 index 00000000..33179cfe --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go @@ -0,0 +1,410 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package sampling + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +type SamplingManager interface { + // Parameters: + // - ServiceName + GetSamplingStrategy(serviceName string) (r *SamplingStrategyResponse, err error) +} + +type SamplingManagerClient struct { + Transport thrift.TTransport + ProtocolFactory thrift.TProtocolFactory + InputProtocol thrift.TProtocol + OutputProtocol thrift.TProtocol + SeqId int32 +} + +func NewSamplingManagerClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *SamplingManagerClient { + return &SamplingManagerClient{Transport: t, + ProtocolFactory: f, + InputProtocol: f.GetProtocol(t), + OutputProtocol: f.GetProtocol(t), + SeqId: 0, + } +} + +func NewSamplingManagerClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *SamplingManagerClient { + return &SamplingManagerClient{Transport: t, + ProtocolFactory: nil, + InputProtocol: iprot, + OutputProtocol: oprot, + SeqId: 0, + } +} + +// Parameters: +// - ServiceName +func (p *SamplingManagerClient) GetSamplingStrategy(serviceName string) (r *SamplingStrategyResponse, err error) { + if err = p.sendGetSamplingStrategy(serviceName); err != nil { + return + } + return p.recvGetSamplingStrategy() +} + +func (p *SamplingManagerClient) sendGetSamplingStrategy(serviceName string) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("getSamplingStrategy", thrift.CALL, p.SeqId); err != nil { + return + } + args := SamplingManagerGetSamplingStrategyArgs{ + ServiceName: serviceName, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *SamplingManagerClient) recvGetSamplingStrategy() (value *SamplingStrategyResponse, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "getSamplingStrategy" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "getSamplingStrategy failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "getSamplingStrategy failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error1 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error2 error + error2, err = error1.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error2 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "getSamplingStrategy failed: invalid message type") + return + } + result := SamplingManagerGetSamplingStrategyResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + value = result.GetSuccess() + return +} + +type SamplingManagerProcessor struct { + processorMap map[string]thrift.TProcessorFunction + handler SamplingManager +} + +func (p *SamplingManagerProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { + p.processorMap[key] = processor +} + +func (p *SamplingManagerProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { + processor, ok = p.processorMap[key] + return processor, ok +} + +func (p *SamplingManagerProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { + return p.processorMap +} + +func NewSamplingManagerProcessor(handler SamplingManager) *SamplingManagerProcessor { + + self3 := &SamplingManagerProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self3.processorMap["getSamplingStrategy"] = &samplingManagerProcessorGetSamplingStrategy{handler: handler} + return self3 +} + +func (p *SamplingManagerProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + name, _, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return false, err + } + if processor, ok := p.GetProcessorFunction(name); ok { + return processor.Process(seqId, iprot, oprot) + } + iprot.Skip(thrift.STRUCT) + iprot.ReadMessageEnd() + x4 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) + x4.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, x4 + +} + +type samplingManagerProcessorGetSamplingStrategy struct { + handler SamplingManager +} + +func (p *samplingManagerProcessorGetSamplingStrategy) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := SamplingManagerGetSamplingStrategyArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("getSamplingStrategy", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := SamplingManagerGetSamplingStrategyResult{} + var retval *SamplingStrategyResponse + var err2 error + if retval, err2 = p.handler.GetSamplingStrategy(args.ServiceName); err2 != nil { + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getSamplingStrategy: "+err2.Error()) + oprot.WriteMessageBegin("getSamplingStrategy", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("getSamplingStrategy", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +// HELPER FUNCTIONS AND STRUCTURES + +// Attributes: +// - ServiceName +type SamplingManagerGetSamplingStrategyArgs struct { + ServiceName string `thrift:"serviceName,1" json:"serviceName"` +} + +func NewSamplingManagerGetSamplingStrategyArgs() *SamplingManagerGetSamplingStrategyArgs { + return &SamplingManagerGetSamplingStrategyArgs{} +} + +func (p *SamplingManagerGetSamplingStrategyArgs) GetServiceName() string { + return p.ServiceName +} +func (p *SamplingManagerGetSamplingStrategyArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *SamplingManagerGetSamplingStrategyArgs) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.ServiceName = v + } + return nil +} + +func (p *SamplingManagerGetSamplingStrategyArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getSamplingStrategy_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *SamplingManagerGetSamplingStrategyArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("serviceName", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:serviceName: ", p), err) + } + if err := oprot.WriteString(string(p.ServiceName)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.serviceName (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:serviceName: ", p), err) + } + return err +} + +func (p *SamplingManagerGetSamplingStrategyArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("SamplingManagerGetSamplingStrategyArgs(%+v)", *p) +} + +// Attributes: +// - Success +type SamplingManagerGetSamplingStrategyResult struct { + Success *SamplingStrategyResponse `thrift:"success,0" json:"success,omitempty"` +} + +func NewSamplingManagerGetSamplingStrategyResult() *SamplingManagerGetSamplingStrategyResult { + return &SamplingManagerGetSamplingStrategyResult{} +} + +var SamplingManagerGetSamplingStrategyResult_Success_DEFAULT *SamplingStrategyResponse + +func (p *SamplingManagerGetSamplingStrategyResult) GetSuccess() *SamplingStrategyResponse { + if !p.IsSetSuccess() { + return SamplingManagerGetSamplingStrategyResult_Success_DEFAULT + } + return p.Success +} +func (p *SamplingManagerGetSamplingStrategyResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *SamplingManagerGetSamplingStrategyResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.readField0(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *SamplingManagerGetSamplingStrategyResult) readField0(iprot thrift.TProtocol) error { + p.Success = &SamplingStrategyResponse{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *SamplingManagerGetSamplingStrategyResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("getSamplingStrategy_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField0(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *SamplingManagerGetSamplingStrategyResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *SamplingManagerGetSamplingStrategyResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("SamplingManagerGetSamplingStrategyResult(%+v)", *p) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go new file mode 100644 index 00000000..9abaf054 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go @@ -0,0 +1,873 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package sampling + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +var GoUnusedProtection__ int + +type SamplingStrategyType int64 + +const ( + SamplingStrategyType_PROBABILISTIC SamplingStrategyType = 0 + SamplingStrategyType_RATE_LIMITING SamplingStrategyType = 1 +) + +func (p SamplingStrategyType) String() string { + switch p { + case SamplingStrategyType_PROBABILISTIC: + return "PROBABILISTIC" + case SamplingStrategyType_RATE_LIMITING: + return "RATE_LIMITING" + } + return "" +} + +func SamplingStrategyTypeFromString(s string) (SamplingStrategyType, error) { + switch s { + case "PROBABILISTIC": + return SamplingStrategyType_PROBABILISTIC, nil + case "RATE_LIMITING": + return SamplingStrategyType_RATE_LIMITING, nil + } + return SamplingStrategyType(0), fmt.Errorf("not a valid SamplingStrategyType string") +} + +func SamplingStrategyTypePtr(v SamplingStrategyType) *SamplingStrategyType { return &v } + +func (p SamplingStrategyType) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *SamplingStrategyType) UnmarshalText(text []byte) error { + q, err := SamplingStrategyTypeFromString(string(text)) + if err != nil { + return err + } + *p = q + return nil +} + +// Attributes: +// - SamplingRate +type ProbabilisticSamplingStrategy struct { + SamplingRate float64 `thrift:"samplingRate,1,required" json:"samplingRate"` +} + +func NewProbabilisticSamplingStrategy() *ProbabilisticSamplingStrategy { + return &ProbabilisticSamplingStrategy{} +} + +func (p *ProbabilisticSamplingStrategy) GetSamplingRate() float64 { + return p.SamplingRate +} +func (p *ProbabilisticSamplingStrategy) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetSamplingRate bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetSamplingRate = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetSamplingRate { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SamplingRate is not set")) + } + return nil +} + +func (p *ProbabilisticSamplingStrategy) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadDouble(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.SamplingRate = v + } + return nil +} + +func (p *ProbabilisticSamplingStrategy) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("ProbabilisticSamplingStrategy"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ProbabilisticSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("samplingRate", thrift.DOUBLE, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:samplingRate: ", p), err) + } + if err := oprot.WriteDouble(float64(p.SamplingRate)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.samplingRate (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:samplingRate: ", p), err) + } + return err +} + +func (p *ProbabilisticSamplingStrategy) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ProbabilisticSamplingStrategy(%+v)", *p) +} + +// Attributes: +// - MaxTracesPerSecond +type RateLimitingSamplingStrategy struct { + MaxTracesPerSecond int16 `thrift:"maxTracesPerSecond,1,required" json:"maxTracesPerSecond"` +} + +func NewRateLimitingSamplingStrategy() *RateLimitingSamplingStrategy { + return &RateLimitingSamplingStrategy{} +} + +func (p *RateLimitingSamplingStrategy) GetMaxTracesPerSecond() int16 { + return p.MaxTracesPerSecond +} +func (p *RateLimitingSamplingStrategy) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetMaxTracesPerSecond bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetMaxTracesPerSecond = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetMaxTracesPerSecond { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MaxTracesPerSecond is not set")) + } + return nil +} + +func (p *RateLimitingSamplingStrategy) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI16(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.MaxTracesPerSecond = v + } + return nil +} + +func (p *RateLimitingSamplingStrategy) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("RateLimitingSamplingStrategy"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *RateLimitingSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("maxTracesPerSecond", thrift.I16, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:maxTracesPerSecond: ", p), err) + } + if err := oprot.WriteI16(int16(p.MaxTracesPerSecond)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.maxTracesPerSecond (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:maxTracesPerSecond: ", p), err) + } + return err +} + +func (p *RateLimitingSamplingStrategy) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("RateLimitingSamplingStrategy(%+v)", *p) +} + +// Attributes: +// - Operation +// - ProbabilisticSampling +type OperationSamplingStrategy struct { + Operation string `thrift:"operation,1,required" json:"operation"` + ProbabilisticSampling *ProbabilisticSamplingStrategy `thrift:"probabilisticSampling,2,required" json:"probabilisticSampling"` +} + +func NewOperationSamplingStrategy() *OperationSamplingStrategy { + return &OperationSamplingStrategy{} +} + +func (p *OperationSamplingStrategy) GetOperation() string { + return p.Operation +} + +var OperationSamplingStrategy_ProbabilisticSampling_DEFAULT *ProbabilisticSamplingStrategy + +func (p *OperationSamplingStrategy) GetProbabilisticSampling() *ProbabilisticSamplingStrategy { + if !p.IsSetProbabilisticSampling() { + return OperationSamplingStrategy_ProbabilisticSampling_DEFAULT + } + return p.ProbabilisticSampling +} +func (p *OperationSamplingStrategy) IsSetProbabilisticSampling() bool { + return p.ProbabilisticSampling != nil +} + +func (p *OperationSamplingStrategy) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetOperation bool = false + var issetProbabilisticSampling bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetOperation = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + issetProbabilisticSampling = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetOperation { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Operation is not set")) + } + if !issetProbabilisticSampling { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ProbabilisticSampling is not set")) + } + return nil +} + +func (p *OperationSamplingStrategy) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Operation = v + } + return nil +} + +func (p *OperationSamplingStrategy) readField2(iprot thrift.TProtocol) error { + p.ProbabilisticSampling = &ProbabilisticSamplingStrategy{} + if err := p.ProbabilisticSampling.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.ProbabilisticSampling), err) + } + return nil +} + +func (p *OperationSamplingStrategy) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("OperationSamplingStrategy"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *OperationSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("operation", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:operation: ", p), err) + } + if err := oprot.WriteString(string(p.Operation)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.operation (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:operation: ", p), err) + } + return err +} + +func (p *OperationSamplingStrategy) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("probabilisticSampling", thrift.STRUCT, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:probabilisticSampling: ", p), err) + } + if err := p.ProbabilisticSampling.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.ProbabilisticSampling), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:probabilisticSampling: ", p), err) + } + return err +} + +func (p *OperationSamplingStrategy) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("OperationSamplingStrategy(%+v)", *p) +} + +// Attributes: +// - DefaultSamplingProbability +// - DefaultLowerBoundTracesPerSecond +// - PerOperationStrategies +// - DefaultUpperBoundTracesPerSecond +type PerOperationSamplingStrategies struct { + DefaultSamplingProbability float64 `thrift:"defaultSamplingProbability,1,required" json:"defaultSamplingProbability"` + DefaultLowerBoundTracesPerSecond float64 `thrift:"defaultLowerBoundTracesPerSecond,2,required" json:"defaultLowerBoundTracesPerSecond"` + PerOperationStrategies []*OperationSamplingStrategy `thrift:"perOperationStrategies,3,required" json:"perOperationStrategies"` + DefaultUpperBoundTracesPerSecond *float64 `thrift:"defaultUpperBoundTracesPerSecond,4" json:"defaultUpperBoundTracesPerSecond,omitempty"` +} + +func NewPerOperationSamplingStrategies() *PerOperationSamplingStrategies { + return &PerOperationSamplingStrategies{} +} + +func (p *PerOperationSamplingStrategies) GetDefaultSamplingProbability() float64 { + return p.DefaultSamplingProbability +} + +func (p *PerOperationSamplingStrategies) GetDefaultLowerBoundTracesPerSecond() float64 { + return p.DefaultLowerBoundTracesPerSecond +} + +func (p *PerOperationSamplingStrategies) GetPerOperationStrategies() []*OperationSamplingStrategy { + return p.PerOperationStrategies +} + +var PerOperationSamplingStrategies_DefaultUpperBoundTracesPerSecond_DEFAULT float64 + +func (p *PerOperationSamplingStrategies) GetDefaultUpperBoundTracesPerSecond() float64 { + if !p.IsSetDefaultUpperBoundTracesPerSecond() { + return PerOperationSamplingStrategies_DefaultUpperBoundTracesPerSecond_DEFAULT + } + return *p.DefaultUpperBoundTracesPerSecond +} +func (p *PerOperationSamplingStrategies) IsSetDefaultUpperBoundTracesPerSecond() bool { + return p.DefaultUpperBoundTracesPerSecond != nil +} + +func (p *PerOperationSamplingStrategies) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetDefaultSamplingProbability bool = false + var issetDefaultLowerBoundTracesPerSecond bool = false + var issetPerOperationStrategies bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetDefaultSamplingProbability = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + issetDefaultLowerBoundTracesPerSecond = true + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + issetPerOperationStrategies = true + case 4: + if err := p.readField4(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetDefaultSamplingProbability { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DefaultSamplingProbability is not set")) + } + if !issetDefaultLowerBoundTracesPerSecond { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DefaultLowerBoundTracesPerSecond is not set")) + } + if !issetPerOperationStrategies { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field PerOperationStrategies is not set")) + } + return nil +} + +func (p *PerOperationSamplingStrategies) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadDouble(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.DefaultSamplingProbability = v + } + return nil +} + +func (p *PerOperationSamplingStrategies) readField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadDouble(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.DefaultLowerBoundTracesPerSecond = v + } + return nil +} + +func (p *PerOperationSamplingStrategies) readField3(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*OperationSamplingStrategy, 0, size) + p.PerOperationStrategies = tSlice + for i := 0; i < size; i++ { + _elem0 := &OperationSamplingStrategy{} + if err := _elem0.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err) + } + p.PerOperationStrategies = append(p.PerOperationStrategies, _elem0) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *PerOperationSamplingStrategies) readField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadDouble(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.DefaultUpperBoundTracesPerSecond = &v + } + return nil +} + +func (p *PerOperationSamplingStrategies) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("PerOperationSamplingStrategies"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *PerOperationSamplingStrategies) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("defaultSamplingProbability", thrift.DOUBLE, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:defaultSamplingProbability: ", p), err) + } + if err := oprot.WriteDouble(float64(p.DefaultSamplingProbability)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.defaultSamplingProbability (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:defaultSamplingProbability: ", p), err) + } + return err +} + +func (p *PerOperationSamplingStrategies) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("defaultLowerBoundTracesPerSecond", thrift.DOUBLE, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:defaultLowerBoundTracesPerSecond: ", p), err) + } + if err := oprot.WriteDouble(float64(p.DefaultLowerBoundTracesPerSecond)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.defaultLowerBoundTracesPerSecond (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:defaultLowerBoundTracesPerSecond: ", p), err) + } + return err +} + +func (p *PerOperationSamplingStrategies) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("perOperationStrategies", thrift.LIST, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:perOperationStrategies: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.PerOperationStrategies)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.PerOperationStrategies { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:perOperationStrategies: ", p), err) + } + return err +} + +func (p *PerOperationSamplingStrategies) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetDefaultUpperBoundTracesPerSecond() { + if err := oprot.WriteFieldBegin("defaultUpperBoundTracesPerSecond", thrift.DOUBLE, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:defaultUpperBoundTracesPerSecond: ", p), err) + } + if err := oprot.WriteDouble(float64(*p.DefaultUpperBoundTracesPerSecond)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.defaultUpperBoundTracesPerSecond (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:defaultUpperBoundTracesPerSecond: ", p), err) + } + } + return err +} + +func (p *PerOperationSamplingStrategies) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("PerOperationSamplingStrategies(%+v)", *p) +} + +// Attributes: +// - StrategyType +// - ProbabilisticSampling +// - RateLimitingSampling +// - OperationSampling +type SamplingStrategyResponse struct { + StrategyType SamplingStrategyType `thrift:"strategyType,1,required" json:"strategyType"` + ProbabilisticSampling *ProbabilisticSamplingStrategy `thrift:"probabilisticSampling,2" json:"probabilisticSampling,omitempty"` + RateLimitingSampling *RateLimitingSamplingStrategy `thrift:"rateLimitingSampling,3" json:"rateLimitingSampling,omitempty"` + OperationSampling *PerOperationSamplingStrategies `thrift:"operationSampling,4" json:"operationSampling,omitempty"` +} + +func NewSamplingStrategyResponse() *SamplingStrategyResponse { + return &SamplingStrategyResponse{} +} + +func (p *SamplingStrategyResponse) GetStrategyType() SamplingStrategyType { + return p.StrategyType +} + +var SamplingStrategyResponse_ProbabilisticSampling_DEFAULT *ProbabilisticSamplingStrategy + +func (p *SamplingStrategyResponse) GetProbabilisticSampling() *ProbabilisticSamplingStrategy { + if !p.IsSetProbabilisticSampling() { + return SamplingStrategyResponse_ProbabilisticSampling_DEFAULT + } + return p.ProbabilisticSampling +} + +var SamplingStrategyResponse_RateLimitingSampling_DEFAULT *RateLimitingSamplingStrategy + +func (p *SamplingStrategyResponse) GetRateLimitingSampling() *RateLimitingSamplingStrategy { + if !p.IsSetRateLimitingSampling() { + return SamplingStrategyResponse_RateLimitingSampling_DEFAULT + } + return p.RateLimitingSampling +} + +var SamplingStrategyResponse_OperationSampling_DEFAULT *PerOperationSamplingStrategies + +func (p *SamplingStrategyResponse) GetOperationSampling() *PerOperationSamplingStrategies { + if !p.IsSetOperationSampling() { + return SamplingStrategyResponse_OperationSampling_DEFAULT + } + return p.OperationSampling +} +func (p *SamplingStrategyResponse) IsSetProbabilisticSampling() bool { + return p.ProbabilisticSampling != nil +} + +func (p *SamplingStrategyResponse) IsSetRateLimitingSampling() bool { + return p.RateLimitingSampling != nil +} + +func (p *SamplingStrategyResponse) IsSetOperationSampling() bool { + return p.OperationSampling != nil +} + +func (p *SamplingStrategyResponse) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetStrategyType bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetStrategyType = true + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + case 4: + if err := p.readField4(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetStrategyType { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StrategyType is not set")) + } + return nil +} + +func (p *SamplingStrategyResponse) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + temp := SamplingStrategyType(v) + p.StrategyType = temp + } + return nil +} + +func (p *SamplingStrategyResponse) readField2(iprot thrift.TProtocol) error { + p.ProbabilisticSampling = &ProbabilisticSamplingStrategy{} + if err := p.ProbabilisticSampling.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.ProbabilisticSampling), err) + } + return nil +} + +func (p *SamplingStrategyResponse) readField3(iprot thrift.TProtocol) error { + p.RateLimitingSampling = &RateLimitingSamplingStrategy{} + if err := p.RateLimitingSampling.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.RateLimitingSampling), err) + } + return nil +} + +func (p *SamplingStrategyResponse) readField4(iprot thrift.TProtocol) error { + p.OperationSampling = &PerOperationSamplingStrategies{} + if err := p.OperationSampling.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.OperationSampling), err) + } + return nil +} + +func (p *SamplingStrategyResponse) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("SamplingStrategyResponse"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *SamplingStrategyResponse) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("strategyType", thrift.I32, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:strategyType: ", p), err) + } + if err := oprot.WriteI32(int32(p.StrategyType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.strategyType (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:strategyType: ", p), err) + } + return err +} + +func (p *SamplingStrategyResponse) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetProbabilisticSampling() { + if err := oprot.WriteFieldBegin("probabilisticSampling", thrift.STRUCT, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:probabilisticSampling: ", p), err) + } + if err := p.ProbabilisticSampling.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.ProbabilisticSampling), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:probabilisticSampling: ", p), err) + } + } + return err +} + +func (p *SamplingStrategyResponse) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetRateLimitingSampling() { + if err := oprot.WriteFieldBegin("rateLimitingSampling", thrift.STRUCT, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rateLimitingSampling: ", p), err) + } + if err := p.RateLimitingSampling.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.RateLimitingSampling), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rateLimitingSampling: ", p), err) + } + } + return err +} + +func (p *SamplingStrategyResponse) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetOperationSampling() { + if err := oprot.WriteFieldBegin("operationSampling", thrift.STRUCT, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:operationSampling: ", p), err) + } + if err := p.OperationSampling.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.OperationSampling), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:operationSampling: ", p), err) + } + } + return err +} + +func (p *SamplingStrategyResponse) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("SamplingStrategyResponse(%+v)", *p) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go new file mode 100644 index 00000000..a53d46f0 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go @@ -0,0 +1,35 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package zipkincore + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +const CLIENT_SEND = "cs" +const CLIENT_RECV = "cr" +const SERVER_SEND = "ss" +const SERVER_RECV = "sr" +const MESSAGE_SEND = "ms" +const MESSAGE_RECV = "mr" +const WIRE_SEND = "ws" +const WIRE_RECV = "wr" +const CLIENT_SEND_FRAGMENT = "csf" +const CLIENT_RECV_FRAGMENT = "crf" +const SERVER_SEND_FRAGMENT = "ssf" +const SERVER_RECV_FRAGMENT = "srf" +const LOCAL_COMPONENT = "lc" +const CLIENT_ADDR = "ca" +const SERVER_ADDR = "sa" +const MESSAGE_ADDR = "ma" + +func init() { +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go new file mode 100644 index 00000000..15583e56 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go @@ -0,0 +1,1337 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package zipkincore + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +var GoUnusedProtection__ int + +type AnnotationType int64 + +const ( + AnnotationType_BOOL AnnotationType = 0 + AnnotationType_BYTES AnnotationType = 1 + AnnotationType_I16 AnnotationType = 2 + AnnotationType_I32 AnnotationType = 3 + AnnotationType_I64 AnnotationType = 4 + AnnotationType_DOUBLE AnnotationType = 5 + AnnotationType_STRING AnnotationType = 6 +) + +func (p AnnotationType) String() string { + switch p { + case AnnotationType_BOOL: + return "BOOL" + case AnnotationType_BYTES: + return "BYTES" + case AnnotationType_I16: + return "I16" + case AnnotationType_I32: + return "I32" + case AnnotationType_I64: + return "I64" + case AnnotationType_DOUBLE: + return "DOUBLE" + case AnnotationType_STRING: + return "STRING" + } + return "" +} + +func AnnotationTypeFromString(s string) (AnnotationType, error) { + switch s { + case "BOOL": + return AnnotationType_BOOL, nil + case "BYTES": + return AnnotationType_BYTES, nil + case "I16": + return AnnotationType_I16, nil + case "I32": + return AnnotationType_I32, nil + case "I64": + return AnnotationType_I64, nil + case "DOUBLE": + return AnnotationType_DOUBLE, nil + case "STRING": + return AnnotationType_STRING, nil + } + return AnnotationType(0), fmt.Errorf("not a valid AnnotationType string") +} + +func AnnotationTypePtr(v AnnotationType) *AnnotationType { return &v } + +func (p AnnotationType) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *AnnotationType) UnmarshalText(text []byte) error { + q, err := AnnotationTypeFromString(string(text)) + if err != nil { + return err + } + *p = q + return nil +} + +// Indicates the network context of a service recording an annotation with two +// exceptions. +// +// When a BinaryAnnotation, and key is CLIENT_ADDR or SERVER_ADDR, +// the endpoint indicates the source or destination of an RPC. This exception +// allows zipkin to display network context of uninstrumented services, or +// clients such as web browsers. +// +// Attributes: +// - Ipv4: IPv4 host address packed into 4 bytes. +// +// Ex for the ip 1.2.3.4, it would be (1 << 24) | (2 << 16) | (3 << 8) | 4 +// - Port: IPv4 port +// +// Note: this is to be treated as an unsigned integer, so watch for negatives. +// +// Conventionally, when the port isn't known, port = 0. +// - ServiceName: Service name in lowercase, such as "memcache" or "zipkin-web" +// +// Conventionally, when the service name isn't known, service_name = "unknown". +// - Ipv6: IPv6 host address packed into 16 bytes. Ex Inet6Address.getBytes() +type Endpoint struct { + Ipv4 int32 `thrift:"ipv4,1" json:"ipv4"` + Port int16 `thrift:"port,2" json:"port"` + ServiceName string `thrift:"service_name,3" json:"service_name"` + Ipv6 []byte `thrift:"ipv6,4" json:"ipv6,omitempty"` +} + +func NewEndpoint() *Endpoint { + return &Endpoint{} +} + +func (p *Endpoint) GetIpv4() int32 { + return p.Ipv4 +} + +func (p *Endpoint) GetPort() int16 { + return p.Port +} + +func (p *Endpoint) GetServiceName() string { + return p.ServiceName +} + +var Endpoint_Ipv6_DEFAULT []byte + +func (p *Endpoint) GetIpv6() []byte { + return p.Ipv6 +} +func (p *Endpoint) IsSetIpv6() bool { + return p.Ipv6 != nil +} + +func (p *Endpoint) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + case 4: + if err := p.readField4(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *Endpoint) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Ipv4 = v + } + return nil +} + +func (p *Endpoint) readField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI16(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Port = v + } + return nil +} + +func (p *Endpoint) readField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.ServiceName = v + } + return nil +} + +func (p *Endpoint) readField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.Ipv6 = v + } + return nil +} + +func (p *Endpoint) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Endpoint"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Endpoint) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("ipv4", thrift.I32, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ipv4: ", p), err) + } + if err := oprot.WriteI32(int32(p.Ipv4)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.ipv4 (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ipv4: ", p), err) + } + return err +} + +func (p *Endpoint) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("port", thrift.I16, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:port: ", p), err) + } + if err := oprot.WriteI16(int16(p.Port)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.port (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:port: ", p), err) + } + return err +} + +func (p *Endpoint) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("service_name", thrift.STRING, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:service_name: ", p), err) + } + if err := oprot.WriteString(string(p.ServiceName)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.service_name (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:service_name: ", p), err) + } + return err +} + +func (p *Endpoint) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetIpv6() { + if err := oprot.WriteFieldBegin("ipv6", thrift.STRING, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:ipv6: ", p), err) + } + if err := oprot.WriteBinary(p.Ipv6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.ipv6 (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:ipv6: ", p), err) + } + } + return err +} + +func (p *Endpoint) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Endpoint(%+v)", *p) +} + +// An annotation is similar to a log statement. It includes a host field which +// allows these events to be attributed properly, and also aggregatable. +// +// Attributes: +// - Timestamp: Microseconds from epoch. +// +// This value should use the most precise value possible. For example, +// gettimeofday or syncing nanoTime against a tick of currentTimeMillis. +// - Value +// - Host: Always the host that recorded the event. By specifying the host you allow +// rollup of all events (such as client requests to a service) by IP address. +type Annotation struct { + Timestamp int64 `thrift:"timestamp,1" json:"timestamp"` + Value string `thrift:"value,2" json:"value"` + Host *Endpoint `thrift:"host,3" json:"host,omitempty"` +} + +func NewAnnotation() *Annotation { + return &Annotation{} +} + +func (p *Annotation) GetTimestamp() int64 { + return p.Timestamp +} + +func (p *Annotation) GetValue() string { + return p.Value +} + +var Annotation_Host_DEFAULT *Endpoint + +func (p *Annotation) GetHost() *Endpoint { + if !p.IsSetHost() { + return Annotation_Host_DEFAULT + } + return p.Host +} +func (p *Annotation) IsSetHost() bool { + return p.Host != nil +} + +func (p *Annotation) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *Annotation) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Timestamp = v + } + return nil +} + +func (p *Annotation) readField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Value = v + } + return nil +} + +func (p *Annotation) readField3(iprot thrift.TProtocol) error { + p.Host = &Endpoint{} + if err := p.Host.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Host), err) + } + return nil +} + +func (p *Annotation) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Annotation"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Annotation) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:timestamp: ", p), err) + } + if err := oprot.WriteI64(int64(p.Timestamp)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.timestamp (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:timestamp: ", p), err) + } + return err +} + +func (p *Annotation) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("value", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:value: ", p), err) + } + if err := oprot.WriteString(string(p.Value)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.value (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:value: ", p), err) + } + return err +} + +func (p *Annotation) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetHost() { + if err := oprot.WriteFieldBegin("host", thrift.STRUCT, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:host: ", p), err) + } + if err := p.Host.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Host), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:host: ", p), err) + } + } + return err +} + +func (p *Annotation) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Annotation(%+v)", *p) +} + +// Binary annotations are tags applied to a Span to give it context. For +// example, a binary annotation of "http.uri" could the path to a resource in a +// RPC call. +// +// Binary annotations of type STRING are always queryable, though more a +// historical implementation detail than a structural concern. +// +// Binary annotations can repeat, and vary on the host. Similar to Annotation, +// the host indicates who logged the event. This allows you to tell the +// difference between the client and server side of the same key. For example, +// the key "http.uri" might be different on the client and server side due to +// rewriting, like "/api/v1/myresource" vs "/myresource. Via the host field, +// you can see the different points of view, which often help in debugging. +// +// Attributes: +// - Key +// - Value +// - AnnotationType +// - Host: The host that recorded tag, which allows you to differentiate between +// multiple tags with the same key. There are two exceptions to this. +// +// When the key is CLIENT_ADDR or SERVER_ADDR, host indicates the source or +// destination of an RPC. This exception allows zipkin to display network +// context of uninstrumented services, or clients such as web browsers. +type BinaryAnnotation struct { + Key string `thrift:"key,1" json:"key"` + Value []byte `thrift:"value,2" json:"value"` + AnnotationType AnnotationType `thrift:"annotation_type,3" json:"annotation_type"` + Host *Endpoint `thrift:"host,4" json:"host,omitempty"` +} + +func NewBinaryAnnotation() *BinaryAnnotation { + return &BinaryAnnotation{} +} + +func (p *BinaryAnnotation) GetKey() string { + return p.Key +} + +func (p *BinaryAnnotation) GetValue() []byte { + return p.Value +} + +func (p *BinaryAnnotation) GetAnnotationType() AnnotationType { + return p.AnnotationType +} + +var BinaryAnnotation_Host_DEFAULT *Endpoint + +func (p *BinaryAnnotation) GetHost() *Endpoint { + if !p.IsSetHost() { + return BinaryAnnotation_Host_DEFAULT + } + return p.Host +} +func (p *BinaryAnnotation) IsSetHost() bool { + return p.Host != nil +} + +func (p *BinaryAnnotation) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + case 2: + if err := p.readField2(iprot); err != nil { + return err + } + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + case 4: + if err := p.readField4(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *BinaryAnnotation) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Key = v + } + return nil +} + +func (p *BinaryAnnotation) readField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBinary(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Value = v + } + return nil +} + +func (p *BinaryAnnotation) readField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + temp := AnnotationType(v) + p.AnnotationType = temp + } + return nil +} + +func (p *BinaryAnnotation) readField4(iprot thrift.TProtocol) error { + p.Host = &Endpoint{} + if err := p.Host.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Host), err) + } + return nil +} + +func (p *BinaryAnnotation) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("BinaryAnnotation"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *BinaryAnnotation) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("key", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:key: ", p), err) + } + if err := oprot.WriteString(string(p.Key)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.key (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:key: ", p), err) + } + return err +} + +func (p *BinaryAnnotation) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("value", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:value: ", p), err) + } + if err := oprot.WriteBinary(p.Value); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.value (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:value: ", p), err) + } + return err +} + +func (p *BinaryAnnotation) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("annotation_type", thrift.I32, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:annotation_type: ", p), err) + } + if err := oprot.WriteI32(int32(p.AnnotationType)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.annotation_type (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:annotation_type: ", p), err) + } + return err +} + +func (p *BinaryAnnotation) writeField4(oprot thrift.TProtocol) (err error) { + if p.IsSetHost() { + if err := oprot.WriteFieldBegin("host", thrift.STRUCT, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:host: ", p), err) + } + if err := p.Host.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Host), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:host: ", p), err) + } + } + return err +} + +func (p *BinaryAnnotation) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("BinaryAnnotation(%+v)", *p) +} + +// A trace is a series of spans (often RPC calls) which form a latency tree. +// +// The root span is where trace_id = id and parent_id = Nil. The root span is +// usually the longest interval in the trace, starting with a SERVER_RECV +// annotation and ending with a SERVER_SEND. +// +// Attributes: +// - TraceID +// - Name: Span name in lowercase, rpc method for example +// +// Conventionally, when the span name isn't known, name = "unknown". +// - ID +// - ParentID +// - Annotations +// - BinaryAnnotations +// - Debug +// - Timestamp: Microseconds from epoch of the creation of this span. +// +// This value should be set directly by instrumentation, using the most +// precise value possible. For example, gettimeofday or syncing nanoTime +// against a tick of currentTimeMillis. +// +// For compatibility with instrumentation that precede this field, collectors +// or span stores can derive this via Annotation.timestamp. +// For example, SERVER_RECV.timestamp or CLIENT_SEND.timestamp. +// +// This field is optional for compatibility with old data: first-party span +// stores are expected to support this at time of introduction. +// - Duration: Measurement of duration in microseconds, used to support queries. +// +// This value should be set directly, where possible. Doing so encourages +// precise measurement decoupled from problems of clocks, such as skew or NTP +// updates causing time to move backwards. +// +// For compatibility with instrumentation that precede this field, collectors +// or span stores can derive this by subtracting Annotation.timestamp. +// For example, SERVER_SEND.timestamp - SERVER_RECV.timestamp. +// +// If this field is persisted as unset, zipkin will continue to work, except +// duration query support will be implementation-specific. Similarly, setting +// this field non-atomically is implementation-specific. +// +// This field is i64 vs i32 to support spans longer than 35 minutes. +// - TraceIDHigh: Optional unique 8-byte additional identifier for a trace. If non zero, this +// means the trace uses 128 bit traceIds instead of 64 bit. +type Span struct { + TraceID int64 `thrift:"trace_id,1" json:"trace_id"` + // unused field # 2 + Name string `thrift:"name,3" json:"name"` + ID int64 `thrift:"id,4" json:"id"` + ParentID *int64 `thrift:"parent_id,5" json:"parent_id,omitempty"` + Annotations []*Annotation `thrift:"annotations,6" json:"annotations"` + // unused field # 7 + BinaryAnnotations []*BinaryAnnotation `thrift:"binary_annotations,8" json:"binary_annotations"` + Debug bool `thrift:"debug,9" json:"debug,omitempty"` + Timestamp *int64 `thrift:"timestamp,10" json:"timestamp,omitempty"` + Duration *int64 `thrift:"duration,11" json:"duration,omitempty"` + TraceIDHigh *int64 `thrift:"trace_id_high,12" json:"trace_id_high,omitempty"` +} + +func NewSpan() *Span { + return &Span{} +} + +func (p *Span) GetTraceID() int64 { + return p.TraceID +} + +func (p *Span) GetName() string { + return p.Name +} + +func (p *Span) GetID() int64 { + return p.ID +} + +var Span_ParentID_DEFAULT int64 + +func (p *Span) GetParentID() int64 { + if !p.IsSetParentID() { + return Span_ParentID_DEFAULT + } + return *p.ParentID +} + +func (p *Span) GetAnnotations() []*Annotation { + return p.Annotations +} + +func (p *Span) GetBinaryAnnotations() []*BinaryAnnotation { + return p.BinaryAnnotations +} + +var Span_Debug_DEFAULT bool = false + +func (p *Span) GetDebug() bool { + return p.Debug +} + +var Span_Timestamp_DEFAULT int64 + +func (p *Span) GetTimestamp() int64 { + if !p.IsSetTimestamp() { + return Span_Timestamp_DEFAULT + } + return *p.Timestamp +} + +var Span_Duration_DEFAULT int64 + +func (p *Span) GetDuration() int64 { + if !p.IsSetDuration() { + return Span_Duration_DEFAULT + } + return *p.Duration +} + +var Span_TraceIDHigh_DEFAULT int64 + +func (p *Span) GetTraceIDHigh() int64 { + if !p.IsSetTraceIDHigh() { + return Span_TraceIDHigh_DEFAULT + } + return *p.TraceIDHigh +} +func (p *Span) IsSetParentID() bool { + return p.ParentID != nil +} + +func (p *Span) IsSetDebug() bool { + return p.Debug != Span_Debug_DEFAULT +} + +func (p *Span) IsSetTimestamp() bool { + return p.Timestamp != nil +} + +func (p *Span) IsSetDuration() bool { + return p.Duration != nil +} + +func (p *Span) IsSetTraceIDHigh() bool { + return p.TraceIDHigh != nil +} + +func (p *Span) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + case 3: + if err := p.readField3(iprot); err != nil { + return err + } + case 4: + if err := p.readField4(iprot); err != nil { + return err + } + case 5: + if err := p.readField5(iprot); err != nil { + return err + } + case 6: + if err := p.readField6(iprot); err != nil { + return err + } + case 8: + if err := p.readField8(iprot); err != nil { + return err + } + case 9: + if err := p.readField9(iprot); err != nil { + return err + } + case 10: + if err := p.readField10(iprot); err != nil { + return err + } + case 11: + if err := p.readField11(iprot); err != nil { + return err + } + case 12: + if err := p.readField12(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *Span) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.TraceID = v + } + return nil +} + +func (p *Span) readField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.Name = v + } + return nil +} + +func (p *Span) readField4(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 4: ", err) + } else { + p.ID = v + } + return nil +} + +func (p *Span) readField5(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 5: ", err) + } else { + p.ParentID = &v + } + return nil +} + +func (p *Span) readField6(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Annotation, 0, size) + p.Annotations = tSlice + for i := 0; i < size; i++ { + _elem0 := &Annotation{} + if err := _elem0.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err) + } + p.Annotations = append(p.Annotations, _elem0) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *Span) readField8(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*BinaryAnnotation, 0, size) + p.BinaryAnnotations = tSlice + for i := 0; i < size; i++ { + _elem1 := &BinaryAnnotation{} + if err := _elem1.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem1), err) + } + p.BinaryAnnotations = append(p.BinaryAnnotations, _elem1) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *Span) readField9(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 9: ", err) + } else { + p.Debug = v + } + return nil +} + +func (p *Span) readField10(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 10: ", err) + } else { + p.Timestamp = &v + } + return nil +} + +func (p *Span) readField11(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 11: ", err) + } else { + p.Duration = &v + } + return nil +} + +func (p *Span) readField12(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI64(); err != nil { + return thrift.PrependError("error reading field 12: ", err) + } else { + p.TraceIDHigh = &v + } + return nil +} + +func (p *Span) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Span"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := p.writeField4(oprot); err != nil { + return err + } + if err := p.writeField5(oprot); err != nil { + return err + } + if err := p.writeField6(oprot); err != nil { + return err + } + if err := p.writeField8(oprot); err != nil { + return err + } + if err := p.writeField9(oprot); err != nil { + return err + } + if err := p.writeField10(oprot); err != nil { + return err + } + if err := p.writeField11(oprot); err != nil { + return err + } + if err := p.writeField12(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Span) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("trace_id", thrift.I64, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:trace_id: ", p), err) + } + if err := oprot.WriteI64(int64(p.TraceID)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.trace_id (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:trace_id: ", p), err) + } + return err +} + +func (p *Span) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("name", thrift.STRING, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:name: ", p), err) + } + if err := oprot.WriteString(string(p.Name)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.name (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:name: ", p), err) + } + return err +} + +func (p *Span) writeField4(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("id", thrift.I64, 4); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:id: ", p), err) + } + if err := oprot.WriteI64(int64(p.ID)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.id (4) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 4:id: ", p), err) + } + return err +} + +func (p *Span) writeField5(oprot thrift.TProtocol) (err error) { + if p.IsSetParentID() { + if err := oprot.WriteFieldBegin("parent_id", thrift.I64, 5); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:parent_id: ", p), err) + } + if err := oprot.WriteI64(int64(*p.ParentID)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.parent_id (5) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 5:parent_id: ", p), err) + } + } + return err +} + +func (p *Span) writeField6(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("annotations", thrift.LIST, 6); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:annotations: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Annotations)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Annotations { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 6:annotations: ", p), err) + } + return err +} + +func (p *Span) writeField8(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("binary_annotations", thrift.LIST, 8); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:binary_annotations: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.BinaryAnnotations)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.BinaryAnnotations { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 8:binary_annotations: ", p), err) + } + return err +} + +func (p *Span) writeField9(oprot thrift.TProtocol) (err error) { + if p.IsSetDebug() { + if err := oprot.WriteFieldBegin("debug", thrift.BOOL, 9); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:debug: ", p), err) + } + if err := oprot.WriteBool(bool(p.Debug)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.debug (9) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 9:debug: ", p), err) + } + } + return err +} + +func (p *Span) writeField10(oprot thrift.TProtocol) (err error) { + if p.IsSetTimestamp() { + if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 10); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 10:timestamp: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Timestamp)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.timestamp (10) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 10:timestamp: ", p), err) + } + } + return err +} + +func (p *Span) writeField11(oprot thrift.TProtocol) (err error) { + if p.IsSetDuration() { + if err := oprot.WriteFieldBegin("duration", thrift.I64, 11); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 11:duration: ", p), err) + } + if err := oprot.WriteI64(int64(*p.Duration)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.duration (11) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 11:duration: ", p), err) + } + } + return err +} + +func (p *Span) writeField12(oprot thrift.TProtocol) (err error) { + if p.IsSetTraceIDHigh() { + if err := oprot.WriteFieldBegin("trace_id_high", thrift.I64, 12); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 12:trace_id_high: ", p), err) + } + if err := oprot.WriteI64(int64(*p.TraceIDHigh)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.trace_id_high (12) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 12:trace_id_high: ", p), err) + } + } + return err +} + +func (p *Span) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Span(%+v)", *p) +} + +// Attributes: +// - Ok +type Response struct { + Ok bool `thrift:"ok,1,required" json:"ok"` +} + +func NewResponse() *Response { + return &Response{} +} + +func (p *Response) GetOk() bool { + return p.Ok +} +func (p *Response) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetOk bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + issetOk = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetOk { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Ok is not set")) + } + return nil +} + +func (p *Response) readField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Ok = v + } + return nil +} + +func (p *Response) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("Response"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *Response) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("ok", thrift.BOOL, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ok: ", p), err) + } + if err := oprot.WriteBool(bool(p.Ok)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.ok (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ok: ", p), err) + } + return err +} + +func (p *Response) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Response(%+v)", *p) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go new file mode 100644 index 00000000..417e883d --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go @@ -0,0 +1,446 @@ +// Autogenerated by Thrift Compiler (0.9.3) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package zipkincore + +import ( + "bytes" + "fmt" + "github.com/uber/jaeger-client-go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +type ZipkinCollector interface { + // Parameters: + // - Spans + SubmitZipkinBatch(spans []*Span) (r []*Response, err error) +} + +type ZipkinCollectorClient struct { + Transport thrift.TTransport + ProtocolFactory thrift.TProtocolFactory + InputProtocol thrift.TProtocol + OutputProtocol thrift.TProtocol + SeqId int32 +} + +func NewZipkinCollectorClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *ZipkinCollectorClient { + return &ZipkinCollectorClient{Transport: t, + ProtocolFactory: f, + InputProtocol: f.GetProtocol(t), + OutputProtocol: f.GetProtocol(t), + SeqId: 0, + } +} + +func NewZipkinCollectorClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *ZipkinCollectorClient { + return &ZipkinCollectorClient{Transport: t, + ProtocolFactory: nil, + InputProtocol: iprot, + OutputProtocol: oprot, + SeqId: 0, + } +} + +// Parameters: +// - Spans +func (p *ZipkinCollectorClient) SubmitZipkinBatch(spans []*Span) (r []*Response, err error) { + if err = p.sendSubmitZipkinBatch(spans); err != nil { + return + } + return p.recvSubmitZipkinBatch() +} + +func (p *ZipkinCollectorClient) sendSubmitZipkinBatch(spans []*Span) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("submitZipkinBatch", thrift.CALL, p.SeqId); err != nil { + return + } + args := ZipkinCollectorSubmitZipkinBatchArgs{ + Spans: spans, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *ZipkinCollectorClient) recvSubmitZipkinBatch() (value []*Response, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "submitZipkinBatch" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "submitZipkinBatch failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "submitZipkinBatch failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error2 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error3 error + error3, err = error2.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error3 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "submitZipkinBatch failed: invalid message type") + return + } + result := ZipkinCollectorSubmitZipkinBatchResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + value = result.GetSuccess() + return +} + +type ZipkinCollectorProcessor struct { + processorMap map[string]thrift.TProcessorFunction + handler ZipkinCollector +} + +func (p *ZipkinCollectorProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { + p.processorMap[key] = processor +} + +func (p *ZipkinCollectorProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { + processor, ok = p.processorMap[key] + return processor, ok +} + +func (p *ZipkinCollectorProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { + return p.processorMap +} + +func NewZipkinCollectorProcessor(handler ZipkinCollector) *ZipkinCollectorProcessor { + + self4 := &ZipkinCollectorProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self4.processorMap["submitZipkinBatch"] = &zipkinCollectorProcessorSubmitZipkinBatch{handler: handler} + return self4 +} + +func (p *ZipkinCollectorProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + name, _, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return false, err + } + if processor, ok := p.GetProcessorFunction(name); ok { + return processor.Process(seqId, iprot, oprot) + } + iprot.Skip(thrift.STRUCT) + iprot.ReadMessageEnd() + x5 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) + x5.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, x5 + +} + +type zipkinCollectorProcessorSubmitZipkinBatch struct { + handler ZipkinCollector +} + +func (p *zipkinCollectorProcessorSubmitZipkinBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := ZipkinCollectorSubmitZipkinBatchArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("submitZipkinBatch", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := ZipkinCollectorSubmitZipkinBatchResult{} + var retval []*Response + var err2 error + if retval, err2 = p.handler.SubmitZipkinBatch(args.Spans); err2 != nil { + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing submitZipkinBatch: "+err2.Error()) + oprot.WriteMessageBegin("submitZipkinBatch", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("submitZipkinBatch", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +// HELPER FUNCTIONS AND STRUCTURES + +// Attributes: +// - Spans +type ZipkinCollectorSubmitZipkinBatchArgs struct { + Spans []*Span `thrift:"spans,1" json:"spans"` +} + +func NewZipkinCollectorSubmitZipkinBatchArgs() *ZipkinCollectorSubmitZipkinBatchArgs { + return &ZipkinCollectorSubmitZipkinBatchArgs{} +} + +func (p *ZipkinCollectorSubmitZipkinBatchArgs) GetSpans() []*Span { + return p.Spans +} +func (p *ZipkinCollectorSubmitZipkinBatchArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.readField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ZipkinCollectorSubmitZipkinBatchArgs) readField1(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Span, 0, size) + p.Spans = tSlice + for i := 0; i < size; i++ { + _elem6 := &Span{} + if err := _elem6.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem6), err) + } + p.Spans = append(p.Spans, _elem6) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *ZipkinCollectorSubmitZipkinBatchArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("submitZipkinBatch_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ZipkinCollectorSubmitZipkinBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("spans", thrift.LIST, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:spans: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Spans { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:spans: ", p), err) + } + return err +} + +func (p *ZipkinCollectorSubmitZipkinBatchArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ZipkinCollectorSubmitZipkinBatchArgs(%+v)", *p) +} + +// Attributes: +// - Success +type ZipkinCollectorSubmitZipkinBatchResult struct { + Success []*Response `thrift:"success,0" json:"success,omitempty"` +} + +func NewZipkinCollectorSubmitZipkinBatchResult() *ZipkinCollectorSubmitZipkinBatchResult { + return &ZipkinCollectorSubmitZipkinBatchResult{} +} + +var ZipkinCollectorSubmitZipkinBatchResult_Success_DEFAULT []*Response + +func (p *ZipkinCollectorSubmitZipkinBatchResult) GetSuccess() []*Response { + return p.Success +} +func (p *ZipkinCollectorSubmitZipkinBatchResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *ZipkinCollectorSubmitZipkinBatchResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.readField0(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *ZipkinCollectorSubmitZipkinBatchResult) readField0(iprot thrift.TProtocol) error { + _, size, err := iprot.ReadListBegin() + if err != nil { + return thrift.PrependError("error reading list begin: ", err) + } + tSlice := make([]*Response, 0, size) + p.Success = tSlice + for i := 0; i < size; i++ { + _elem7 := &Response{} + if err := _elem7.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem7), err) + } + p.Success = append(p.Success, _elem7) + } + if err := iprot.ReadListEnd(); err != nil { + return thrift.PrependError("error reading list end: ", err) + } + return nil +} + +func (p *ZipkinCollectorSubmitZipkinBatchResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("submitZipkinBatch_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField0(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ZipkinCollectorSubmitZipkinBatchResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.LIST, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Success)); err != nil { + return thrift.PrependError("error writing list begin: ", err) + } + for _, v := range p.Success { + if err := v.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) + } + } + if err := oprot.WriteListEnd(); err != nil { + return thrift.PrependError("error writing list end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *ZipkinCollectorSubmitZipkinBatchResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ZipkinCollectorSubmitZipkinBatchResult(%+v)", *p) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/.nocover b/vendor/github.com/uber/jaeger-client-go/thrift/.nocover new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/README.md b/vendor/github.com/uber/jaeger-client-go/thrift/README.md new file mode 100644 index 00000000..1d8e642e --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/README.md @@ -0,0 +1,7 @@ +# Apache Thrift + +This is a partial copy of Apache Thrift v0.10 (https://github.com/apache/thrift/commit/b2a4d4ae21c789b689dd162deb819665567f481c). + +It is vendored code to avoid compatibility issues introduced in Thrift v0.11. + +See https://github.com/jaegertracing/jaeger-client-go/pull/303. diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go new file mode 100644 index 00000000..6655cc5a --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +const ( + UNKNOWN_APPLICATION_EXCEPTION = 0 + UNKNOWN_METHOD = 1 + INVALID_MESSAGE_TYPE_EXCEPTION = 2 + WRONG_METHOD_NAME = 3 + BAD_SEQUENCE_ID = 4 + MISSING_RESULT = 5 + INTERNAL_ERROR = 6 + PROTOCOL_ERROR = 7 +) + +// Application level Thrift exception +type TApplicationException interface { + TException + TypeId() int32 + Read(iprot TProtocol) (TApplicationException, error) + Write(oprot TProtocol) error +} + +type tApplicationException struct { + message string + type_ int32 +} + +func (e tApplicationException) Error() string { + return e.message +} + +func NewTApplicationException(type_ int32, message string) TApplicationException { + return &tApplicationException{message, type_} +} + +func (p *tApplicationException) TypeId() int32 { + return p.type_ +} + +func (p *tApplicationException) Read(iprot TProtocol) (TApplicationException, error) { + _, err := iprot.ReadStructBegin() + if err != nil { + return nil, err + } + + message := "" + type_ := int32(UNKNOWN_APPLICATION_EXCEPTION) + + for { + _, ttype, id, err := iprot.ReadFieldBegin() + if err != nil { + return nil, err + } + if ttype == STOP { + break + } + switch id { + case 1: + if ttype == STRING { + if message, err = iprot.ReadString(); err != nil { + return nil, err + } + } else { + if err = SkipDefaultDepth(iprot, ttype); err != nil { + return nil, err + } + } + case 2: + if ttype == I32 { + if type_, err = iprot.ReadI32(); err != nil { + return nil, err + } + } else { + if err = SkipDefaultDepth(iprot, ttype); err != nil { + return nil, err + } + } + default: + if err = SkipDefaultDepth(iprot, ttype); err != nil { + return nil, err + } + } + if err = iprot.ReadFieldEnd(); err != nil { + return nil, err + } + } + return NewTApplicationException(type_, message), iprot.ReadStructEnd() +} + +func (p *tApplicationException) Write(oprot TProtocol) (err error) { + err = oprot.WriteStructBegin("TApplicationException") + if len(p.Error()) > 0 { + err = oprot.WriteFieldBegin("message", STRING, 1) + if err != nil { + return + } + err = oprot.WriteString(p.Error()) + if err != nil { + return + } + err = oprot.WriteFieldEnd() + if err != nil { + return + } + } + err = oprot.WriteFieldBegin("type", I32, 2) + if err != nil { + return + } + err = oprot.WriteI32(p.type_) + if err != nil { + return + } + err = oprot.WriteFieldEnd() + if err != nil { + return + } + err = oprot.WriteFieldStop() + if err != nil { + return + } + err = oprot.WriteStructEnd() + return +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go new file mode 100644 index 00000000..690d3411 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go @@ -0,0 +1,514 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "math" +) + +type TBinaryProtocol struct { + trans TRichTransport + origTransport TTransport + reader io.Reader + writer io.Writer + strictRead bool + strictWrite bool + buffer [64]byte +} + +type TBinaryProtocolFactory struct { + strictRead bool + strictWrite bool +} + +func NewTBinaryProtocolTransport(t TTransport) *TBinaryProtocol { + return NewTBinaryProtocol(t, false, true) +} + +func NewTBinaryProtocol(t TTransport, strictRead, strictWrite bool) *TBinaryProtocol { + p := &TBinaryProtocol{origTransport: t, strictRead: strictRead, strictWrite: strictWrite} + if et, ok := t.(TRichTransport); ok { + p.trans = et + } else { + p.trans = NewTRichTransport(t) + } + p.reader = p.trans + p.writer = p.trans + return p +} + +func NewTBinaryProtocolFactoryDefault() *TBinaryProtocolFactory { + return NewTBinaryProtocolFactory(false, true) +} + +func NewTBinaryProtocolFactory(strictRead, strictWrite bool) *TBinaryProtocolFactory { + return &TBinaryProtocolFactory{strictRead: strictRead, strictWrite: strictWrite} +} + +func (p *TBinaryProtocolFactory) GetProtocol(t TTransport) TProtocol { + return NewTBinaryProtocol(t, p.strictRead, p.strictWrite) +} + +/** + * Writing Methods + */ + +func (p *TBinaryProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { + if p.strictWrite { + version := uint32(VERSION_1) | uint32(typeId) + e := p.WriteI32(int32(version)) + if e != nil { + return e + } + e = p.WriteString(name) + if e != nil { + return e + } + e = p.WriteI32(seqId) + return e + } else { + e := p.WriteString(name) + if e != nil { + return e + } + e = p.WriteByte(int8(typeId)) + if e != nil { + return e + } + e = p.WriteI32(seqId) + return e + } + return nil +} + +func (p *TBinaryProtocol) WriteMessageEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteStructBegin(name string) error { + return nil +} + +func (p *TBinaryProtocol) WriteStructEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + e := p.WriteByte(int8(typeId)) + if e != nil { + return e + } + e = p.WriteI16(id) + return e +} + +func (p *TBinaryProtocol) WriteFieldEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteFieldStop() error { + e := p.WriteByte(STOP) + return e +} + +func (p *TBinaryProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + e := p.WriteByte(int8(keyType)) + if e != nil { + return e + } + e = p.WriteByte(int8(valueType)) + if e != nil { + return e + } + e = p.WriteI32(int32(size)) + return e +} + +func (p *TBinaryProtocol) WriteMapEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteListBegin(elemType TType, size int) error { + e := p.WriteByte(int8(elemType)) + if e != nil { + return e + } + e = p.WriteI32(int32(size)) + return e +} + +func (p *TBinaryProtocol) WriteListEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteSetBegin(elemType TType, size int) error { + e := p.WriteByte(int8(elemType)) + if e != nil { + return e + } + e = p.WriteI32(int32(size)) + return e +} + +func (p *TBinaryProtocol) WriteSetEnd() error { + return nil +} + +func (p *TBinaryProtocol) WriteBool(value bool) error { + if value { + return p.WriteByte(1) + } + return p.WriteByte(0) +} + +func (p *TBinaryProtocol) WriteByte(value int8) error { + e := p.trans.WriteByte(byte(value)) + return NewTProtocolException(e) +} + +func (p *TBinaryProtocol) WriteI16(value int16) error { + v := p.buffer[0:2] + binary.BigEndian.PutUint16(v, uint16(value)) + _, e := p.writer.Write(v) + return NewTProtocolException(e) +} + +func (p *TBinaryProtocol) WriteI32(value int32) error { + v := p.buffer[0:4] + binary.BigEndian.PutUint32(v, uint32(value)) + _, e := p.writer.Write(v) + return NewTProtocolException(e) +} + +func (p *TBinaryProtocol) WriteI64(value int64) error { + v := p.buffer[0:8] + binary.BigEndian.PutUint64(v, uint64(value)) + _, err := p.writer.Write(v) + return NewTProtocolException(err) +} + +func (p *TBinaryProtocol) WriteDouble(value float64) error { + return p.WriteI64(int64(math.Float64bits(value))) +} + +func (p *TBinaryProtocol) WriteString(value string) error { + e := p.WriteI32(int32(len(value))) + if e != nil { + return e + } + _, err := p.trans.WriteString(value) + return NewTProtocolException(err) +} + +func (p *TBinaryProtocol) WriteBinary(value []byte) error { + e := p.WriteI32(int32(len(value))) + if e != nil { + return e + } + _, err := p.writer.Write(value) + return NewTProtocolException(err) +} + +/** + * Reading methods + */ + +func (p *TBinaryProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + size, e := p.ReadI32() + if e != nil { + return "", typeId, 0, NewTProtocolException(e) + } + if size < 0 { + typeId = TMessageType(size & 0x0ff) + version := int64(int64(size) & VERSION_MASK) + if version != VERSION_1 { + return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Bad version in ReadMessageBegin")) + } + name, e = p.ReadString() + if e != nil { + return name, typeId, seqId, NewTProtocolException(e) + } + seqId, e = p.ReadI32() + if e != nil { + return name, typeId, seqId, NewTProtocolException(e) + } + return name, typeId, seqId, nil + } + if p.strictRead { + return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Missing version in ReadMessageBegin")) + } + name, e2 := p.readStringBody(size) + if e2 != nil { + return name, typeId, seqId, e2 + } + b, e3 := p.ReadByte() + if e3 != nil { + return name, typeId, seqId, e3 + } + typeId = TMessageType(b) + seqId, e4 := p.ReadI32() + if e4 != nil { + return name, typeId, seqId, e4 + } + return name, typeId, seqId, nil +} + +func (p *TBinaryProtocol) ReadMessageEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadStructBegin() (name string, err error) { + return +} + +func (p *TBinaryProtocol) ReadStructEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadFieldBegin() (name string, typeId TType, seqId int16, err error) { + t, err := p.ReadByte() + typeId = TType(t) + if err != nil { + return name, typeId, seqId, err + } + if t != STOP { + seqId, err = p.ReadI16() + } + return name, typeId, seqId, err +} + +func (p *TBinaryProtocol) ReadFieldEnd() error { + return nil +} + +var invalidDataLength = NewTProtocolExceptionWithType(INVALID_DATA, errors.New("Invalid data length")) + +func (p *TBinaryProtocol) ReadMapBegin() (kType, vType TType, size int, err error) { + k, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + kType = TType(k) + v, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + vType = TType(v) + size32, e := p.ReadI32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + return kType, vType, size, nil +} + +func (p *TBinaryProtocol) ReadMapEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadListBegin() (elemType TType, size int, err error) { + b, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + elemType = TType(b) + size32, e := p.ReadI32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + + return +} + +func (p *TBinaryProtocol) ReadListEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadSetBegin() (elemType TType, size int, err error) { + b, e := p.ReadByte() + if e != nil { + err = NewTProtocolException(e) + return + } + elemType = TType(b) + size32, e := p.ReadI32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + return elemType, size, nil +} + +func (p *TBinaryProtocol) ReadSetEnd() error { + return nil +} + +func (p *TBinaryProtocol) ReadBool() (bool, error) { + b, e := p.ReadByte() + v := true + if b != 1 { + v = false + } + return v, e +} + +func (p *TBinaryProtocol) ReadByte() (int8, error) { + v, err := p.trans.ReadByte() + return int8(v), err +} + +func (p *TBinaryProtocol) ReadI16() (value int16, err error) { + buf := p.buffer[0:2] + err = p.readAll(buf) + value = int16(binary.BigEndian.Uint16(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadI32() (value int32, err error) { + buf := p.buffer[0:4] + err = p.readAll(buf) + value = int32(binary.BigEndian.Uint32(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadI64() (value int64, err error) { + buf := p.buffer[0:8] + err = p.readAll(buf) + value = int64(binary.BigEndian.Uint64(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadDouble() (value float64, err error) { + buf := p.buffer[0:8] + err = p.readAll(buf) + value = math.Float64frombits(binary.BigEndian.Uint64(buf)) + return value, err +} + +func (p *TBinaryProtocol) ReadString() (value string, err error) { + size, e := p.ReadI32() + if e != nil { + return "", e + } + if size < 0 { + err = invalidDataLength + return + } + + return p.readStringBody(size) +} + +func (p *TBinaryProtocol) ReadBinary() ([]byte, error) { + size, e := p.ReadI32() + if e != nil { + return nil, e + } + if size < 0 { + return nil, invalidDataLength + } + if uint64(size) > p.trans.RemainingBytes() { + return nil, invalidDataLength + } + + isize := int(size) + buf := make([]byte, isize) + _, err := io.ReadFull(p.trans, buf) + return buf, NewTProtocolException(err) +} + +func (p *TBinaryProtocol) Flush() (err error) { + return NewTProtocolException(p.trans.Flush()) +} + +func (p *TBinaryProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TBinaryProtocol) Transport() TTransport { + return p.origTransport +} + +func (p *TBinaryProtocol) readAll(buf []byte) error { + _, err := io.ReadFull(p.reader, buf) + return NewTProtocolException(err) +} + +const readLimit = 32768 + +func (p *TBinaryProtocol) readStringBody(size int32) (value string, err error) { + if size < 0 { + return "", nil + } + if uint64(size) > p.trans.RemainingBytes() { + return "", invalidDataLength + } + + var ( + buf bytes.Buffer + e error + b []byte + ) + + switch { + case int(size) <= len(p.buffer): + b = p.buffer[:size] // avoids allocation for small reads + case int(size) < readLimit: + b = make([]byte, size) + default: + b = make([]byte, readLimit) + } + + for size > 0 { + _, e = io.ReadFull(p.trans, b) + buf.Write(b) + if e != nil { + break + } + size -= readLimit + if size < readLimit && size > 0 { + b = b[:size] + } + } + return buf.String(), NewTProtocolException(e) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go new file mode 100644 index 00000000..b9299f2f --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go @@ -0,0 +1,815 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "encoding/binary" + "fmt" + "io" + "math" +) + +const ( + COMPACT_PROTOCOL_ID = 0x082 + COMPACT_VERSION = 1 + COMPACT_VERSION_MASK = 0x1f + COMPACT_TYPE_MASK = 0x0E0 + COMPACT_TYPE_BITS = 0x07 + COMPACT_TYPE_SHIFT_AMOUNT = 5 +) + +type tCompactType byte + +const ( + COMPACT_BOOLEAN_TRUE = 0x01 + COMPACT_BOOLEAN_FALSE = 0x02 + COMPACT_BYTE = 0x03 + COMPACT_I16 = 0x04 + COMPACT_I32 = 0x05 + COMPACT_I64 = 0x06 + COMPACT_DOUBLE = 0x07 + COMPACT_BINARY = 0x08 + COMPACT_LIST = 0x09 + COMPACT_SET = 0x0A + COMPACT_MAP = 0x0B + COMPACT_STRUCT = 0x0C +) + +var ( + ttypeToCompactType map[TType]tCompactType +) + +func init() { + ttypeToCompactType = map[TType]tCompactType{ + STOP: STOP, + BOOL: COMPACT_BOOLEAN_TRUE, + BYTE: COMPACT_BYTE, + I16: COMPACT_I16, + I32: COMPACT_I32, + I64: COMPACT_I64, + DOUBLE: COMPACT_DOUBLE, + STRING: COMPACT_BINARY, + LIST: COMPACT_LIST, + SET: COMPACT_SET, + MAP: COMPACT_MAP, + STRUCT: COMPACT_STRUCT, + } +} + +type TCompactProtocolFactory struct{} + +func NewTCompactProtocolFactory() *TCompactProtocolFactory { + return &TCompactProtocolFactory{} +} + +func (p *TCompactProtocolFactory) GetProtocol(trans TTransport) TProtocol { + return NewTCompactProtocol(trans) +} + +type TCompactProtocol struct { + trans TRichTransport + origTransport TTransport + + // Used to keep track of the last field for the current and previous structs, + // so we can do the delta stuff. + lastField []int + lastFieldId int + + // If we encounter a boolean field begin, save the TField here so it can + // have the value incorporated. + booleanFieldName string + booleanFieldId int16 + booleanFieldPending bool + + // If we read a field header, and it's a boolean field, save the boolean + // value here so that readBool can use it. + boolValue bool + boolValueIsNotNull bool + buffer [64]byte +} + +// Create a TCompactProtocol given a TTransport +func NewTCompactProtocol(trans TTransport) *TCompactProtocol { + p := &TCompactProtocol{origTransport: trans, lastField: []int{}} + if et, ok := trans.(TRichTransport); ok { + p.trans = et + } else { + p.trans = NewTRichTransport(trans) + } + + return p + +} + +// +// Public Writing methods. +// + +// Write a message header to the wire. Compact Protocol messages contain the +// protocol version so we can migrate forwards in the future if need be. +func (p *TCompactProtocol) WriteMessageBegin(name string, typeId TMessageType, seqid int32) error { + err := p.writeByteDirect(COMPACT_PROTOCOL_ID) + if err != nil { + return NewTProtocolException(err) + } + err = p.writeByteDirect((COMPACT_VERSION & COMPACT_VERSION_MASK) | ((byte(typeId) << COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_MASK)) + if err != nil { + return NewTProtocolException(err) + } + _, err = p.writeVarint32(seqid) + if err != nil { + return NewTProtocolException(err) + } + e := p.WriteString(name) + return e + +} + +func (p *TCompactProtocol) WriteMessageEnd() error { return nil } + +// Write a struct begin. This doesn't actually put anything on the wire. We +// use it as an opportunity to put special placeholder markers on the field +// stack so we can get the field id deltas correct. +func (p *TCompactProtocol) WriteStructBegin(name string) error { + p.lastField = append(p.lastField, p.lastFieldId) + p.lastFieldId = 0 + return nil +} + +// Write a struct end. This doesn't actually put anything on the wire. We use +// this as an opportunity to pop the last field from the current struct off +// of the field stack. +func (p *TCompactProtocol) WriteStructEnd() error { + p.lastFieldId = p.lastField[len(p.lastField)-1] + p.lastField = p.lastField[:len(p.lastField)-1] + return nil +} + +func (p *TCompactProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + if typeId == BOOL { + // we want to possibly include the value, so we'll wait. + p.booleanFieldName, p.booleanFieldId, p.booleanFieldPending = name, id, true + return nil + } + _, err := p.writeFieldBeginInternal(name, typeId, id, 0xFF) + return NewTProtocolException(err) +} + +// The workhorse of writeFieldBegin. It has the option of doing a +// 'type override' of the type header. This is used specifically in the +// boolean field case. +func (p *TCompactProtocol) writeFieldBeginInternal(name string, typeId TType, id int16, typeOverride byte) (int, error) { + // short lastField = lastField_.pop(); + + // if there's a type override, use that. + var typeToWrite byte + if typeOverride == 0xFF { + typeToWrite = byte(p.getCompactType(typeId)) + } else { + typeToWrite = typeOverride + } + // check if we can use delta encoding for the field id + fieldId := int(id) + written := 0 + if fieldId > p.lastFieldId && fieldId-p.lastFieldId <= 15 { + // write them together + err := p.writeByteDirect(byte((fieldId-p.lastFieldId)<<4) | typeToWrite) + if err != nil { + return 0, err + } + } else { + // write them separate + err := p.writeByteDirect(typeToWrite) + if err != nil { + return 0, err + } + err = p.WriteI16(id) + written = 1 + 2 + if err != nil { + return 0, err + } + } + + p.lastFieldId = fieldId + // p.lastField.Push(field.id); + return written, nil +} + +func (p *TCompactProtocol) WriteFieldEnd() error { return nil } + +func (p *TCompactProtocol) WriteFieldStop() error { + err := p.writeByteDirect(STOP) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + if size == 0 { + err := p.writeByteDirect(0) + return NewTProtocolException(err) + } + _, err := p.writeVarint32(int32(size)) + if err != nil { + return NewTProtocolException(err) + } + err = p.writeByteDirect(byte(p.getCompactType(keyType))<<4 | byte(p.getCompactType(valueType))) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteMapEnd() error { return nil } + +// Write a list header. +func (p *TCompactProtocol) WriteListBegin(elemType TType, size int) error { + _, err := p.writeCollectionBegin(elemType, size) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteListEnd() error { return nil } + +// Write a set header. +func (p *TCompactProtocol) WriteSetBegin(elemType TType, size int) error { + _, err := p.writeCollectionBegin(elemType, size) + return NewTProtocolException(err) +} + +func (p *TCompactProtocol) WriteSetEnd() error { return nil } + +func (p *TCompactProtocol) WriteBool(value bool) error { + v := byte(COMPACT_BOOLEAN_FALSE) + if value { + v = byte(COMPACT_BOOLEAN_TRUE) + } + if p.booleanFieldPending { + // we haven't written the field header yet + _, err := p.writeFieldBeginInternal(p.booleanFieldName, BOOL, p.booleanFieldId, v) + p.booleanFieldPending = false + return NewTProtocolException(err) + } + // we're not part of a field, so just write the value. + err := p.writeByteDirect(v) + return NewTProtocolException(err) +} + +// Write a byte. Nothing to see here! +func (p *TCompactProtocol) WriteByte(value int8) error { + err := p.writeByteDirect(byte(value)) + return NewTProtocolException(err) +} + +// Write an I16 as a zigzag varint. +func (p *TCompactProtocol) WriteI16(value int16) error { + _, err := p.writeVarint32(p.int32ToZigzag(int32(value))) + return NewTProtocolException(err) +} + +// Write an i32 as a zigzag varint. +func (p *TCompactProtocol) WriteI32(value int32) error { + _, err := p.writeVarint32(p.int32ToZigzag(value)) + return NewTProtocolException(err) +} + +// Write an i64 as a zigzag varint. +func (p *TCompactProtocol) WriteI64(value int64) error { + _, err := p.writeVarint64(p.int64ToZigzag(value)) + return NewTProtocolException(err) +} + +// Write a double to the wire as 8 bytes. +func (p *TCompactProtocol) WriteDouble(value float64) error { + buf := p.buffer[0:8] + binary.LittleEndian.PutUint64(buf, math.Float64bits(value)) + _, err := p.trans.Write(buf) + return NewTProtocolException(err) +} + +// Write a string to the wire with a varint size preceding. +func (p *TCompactProtocol) WriteString(value string) error { + _, e := p.writeVarint32(int32(len(value))) + if e != nil { + return NewTProtocolException(e) + } + if len(value) > 0 { + } + _, e = p.trans.WriteString(value) + return e +} + +// Write a byte array, using a varint for the size. +func (p *TCompactProtocol) WriteBinary(bin []byte) error { + _, e := p.writeVarint32(int32(len(bin))) + if e != nil { + return NewTProtocolException(e) + } + if len(bin) > 0 { + _, e = p.trans.Write(bin) + return NewTProtocolException(e) + } + return nil +} + +// +// Reading methods. +// + +// Read a message header. +func (p *TCompactProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + + protocolId, err := p.readByteDirect() + if err != nil { + return + } + + if protocolId != COMPACT_PROTOCOL_ID { + e := fmt.Errorf("Expected protocol id %02x but got %02x", COMPACT_PROTOCOL_ID, protocolId) + return "", typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, e) + } + + versionAndType, err := p.readByteDirect() + if err != nil { + return + } + + version := versionAndType & COMPACT_VERSION_MASK + typeId = TMessageType((versionAndType >> COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_BITS) + if version != COMPACT_VERSION { + e := fmt.Errorf("Expected version %02x but got %02x", COMPACT_VERSION, version) + err = NewTProtocolExceptionWithType(BAD_VERSION, e) + return + } + seqId, e := p.readVarint32() + if e != nil { + err = NewTProtocolException(e) + return + } + name, err = p.ReadString() + return +} + +func (p *TCompactProtocol) ReadMessageEnd() error { return nil } + +// Read a struct begin. There's nothing on the wire for this, but it is our +// opportunity to push a new struct begin marker onto the field stack. +func (p *TCompactProtocol) ReadStructBegin() (name string, err error) { + p.lastField = append(p.lastField, p.lastFieldId) + p.lastFieldId = 0 + return +} + +// Doesn't actually consume any wire data, just removes the last field for +// this struct from the field stack. +func (p *TCompactProtocol) ReadStructEnd() error { + // consume the last field we read off the wire. + p.lastFieldId = p.lastField[len(p.lastField)-1] + p.lastField = p.lastField[:len(p.lastField)-1] + return nil +} + +// Read a field header off the wire. +func (p *TCompactProtocol) ReadFieldBegin() (name string, typeId TType, id int16, err error) { + t, err := p.readByteDirect() + if err != nil { + return + } + + // if it's a stop, then we can return immediately, as the struct is over. + if (t & 0x0f) == STOP { + return "", STOP, 0, nil + } + + // mask off the 4 MSB of the type header. it could contain a field id delta. + modifier := int16((t & 0xf0) >> 4) + if modifier == 0 { + // not a delta. look ahead for the zigzag varint field id. + id, err = p.ReadI16() + if err != nil { + return + } + } else { + // has a delta. add the delta to the last read field id. + id = int16(p.lastFieldId) + modifier + } + typeId, e := p.getTType(tCompactType(t & 0x0f)) + if e != nil { + err = NewTProtocolException(e) + return + } + + // if this happens to be a boolean field, the value is encoded in the type + if p.isBoolType(t) { + // save the boolean value in a special instance variable. + p.boolValue = (byte(t)&0x0f == COMPACT_BOOLEAN_TRUE) + p.boolValueIsNotNull = true + } + + // push the new field onto the field stack so we can keep the deltas going. + p.lastFieldId = int(id) + return +} + +func (p *TCompactProtocol) ReadFieldEnd() error { return nil } + +// Read a map header off the wire. If the size is zero, skip reading the key +// and value type. This means that 0-length maps will yield TMaps without the +// "correct" types. +func (p *TCompactProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, err error) { + size32, e := p.readVarint32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size32 < 0 { + err = invalidDataLength + return + } + size = int(size32) + + keyAndValueType := byte(STOP) + if size != 0 { + keyAndValueType, err = p.readByteDirect() + if err != nil { + return + } + } + keyType, _ = p.getTType(tCompactType(keyAndValueType >> 4)) + valueType, _ = p.getTType(tCompactType(keyAndValueType & 0xf)) + return +} + +func (p *TCompactProtocol) ReadMapEnd() error { return nil } + +// Read a list header off the wire. If the list size is 0-14, the size will +// be packed into the element type header. If it's a longer list, the 4 MSB +// of the element type header will be 0xF, and a varint will follow with the +// true size. +func (p *TCompactProtocol) ReadListBegin() (elemType TType, size int, err error) { + size_and_type, err := p.readByteDirect() + if err != nil { + return + } + size = int((size_and_type >> 4) & 0x0f) + if size == 15 { + size2, e := p.readVarint32() + if e != nil { + err = NewTProtocolException(e) + return + } + if size2 < 0 { + err = invalidDataLength + return + } + size = int(size2) + } + elemType, e := p.getTType(tCompactType(size_and_type)) + if e != nil { + err = NewTProtocolException(e) + return + } + return +} + +func (p *TCompactProtocol) ReadListEnd() error { return nil } + +// Read a set header off the wire. If the set size is 0-14, the size will +// be packed into the element type header. If it's a longer set, the 4 MSB +// of the element type header will be 0xF, and a varint will follow with the +// true size. +func (p *TCompactProtocol) ReadSetBegin() (elemType TType, size int, err error) { + return p.ReadListBegin() +} + +func (p *TCompactProtocol) ReadSetEnd() error { return nil } + +// Read a boolean off the wire. If this is a boolean field, the value should +// already have been read during readFieldBegin, so we'll just consume the +// pre-stored value. Otherwise, read a byte. +func (p *TCompactProtocol) ReadBool() (value bool, err error) { + if p.boolValueIsNotNull { + p.boolValueIsNotNull = false + return p.boolValue, nil + } + v, err := p.readByteDirect() + return v == COMPACT_BOOLEAN_TRUE, err +} + +// Read a single byte off the wire. Nothing interesting here. +func (p *TCompactProtocol) ReadByte() (int8, error) { + v, err := p.readByteDirect() + if err != nil { + return 0, NewTProtocolException(err) + } + return int8(v), err +} + +// Read an i16 from the wire as a zigzag varint. +func (p *TCompactProtocol) ReadI16() (value int16, err error) { + v, err := p.ReadI32() + return int16(v), err +} + +// Read an i32 from the wire as a zigzag varint. +func (p *TCompactProtocol) ReadI32() (value int32, err error) { + v, e := p.readVarint32() + if e != nil { + return 0, NewTProtocolException(e) + } + value = p.zigzagToInt32(v) + return value, nil +} + +// Read an i64 from the wire as a zigzag varint. +func (p *TCompactProtocol) ReadI64() (value int64, err error) { + v, e := p.readVarint64() + if e != nil { + return 0, NewTProtocolException(e) + } + value = p.zigzagToInt64(v) + return value, nil +} + +// No magic here - just read a double off the wire. +func (p *TCompactProtocol) ReadDouble() (value float64, err error) { + longBits := p.buffer[0:8] + _, e := io.ReadFull(p.trans, longBits) + if e != nil { + return 0.0, NewTProtocolException(e) + } + return math.Float64frombits(p.bytesToUint64(longBits)), nil +} + +// Reads a []byte (via readBinary), and then UTF-8 decodes it. +func (p *TCompactProtocol) ReadString() (value string, err error) { + length, e := p.readVarint32() + if e != nil { + return "", NewTProtocolException(e) + } + if length < 0 { + return "", invalidDataLength + } + if uint64(length) > p.trans.RemainingBytes() { + return "", invalidDataLength + } + + if length == 0 { + return "", nil + } + var buf []byte + if length <= int32(len(p.buffer)) { + buf = p.buffer[0:length] + } else { + buf = make([]byte, length) + } + _, e = io.ReadFull(p.trans, buf) + return string(buf), NewTProtocolException(e) +} + +// Read a []byte from the wire. +func (p *TCompactProtocol) ReadBinary() (value []byte, err error) { + length, e := p.readVarint32() + if e != nil { + return nil, NewTProtocolException(e) + } + if length == 0 { + return []byte{}, nil + } + if length < 0 { + return nil, invalidDataLength + } + if uint64(length) > p.trans.RemainingBytes() { + return nil, invalidDataLength + } + + buf := make([]byte, length) + _, e = io.ReadFull(p.trans, buf) + return buf, NewTProtocolException(e) +} + +func (p *TCompactProtocol) Flush() (err error) { + return NewTProtocolException(p.trans.Flush()) +} + +func (p *TCompactProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TCompactProtocol) Transport() TTransport { + return p.origTransport +} + +// +// Internal writing methods +// + +// Abstract method for writing the start of lists and sets. List and sets on +// the wire differ only by the type indicator. +func (p *TCompactProtocol) writeCollectionBegin(elemType TType, size int) (int, error) { + if size <= 14 { + return 1, p.writeByteDirect(byte(int32(size<<4) | int32(p.getCompactType(elemType)))) + } + err := p.writeByteDirect(0xf0 | byte(p.getCompactType(elemType))) + if err != nil { + return 0, err + } + m, err := p.writeVarint32(int32(size)) + return 1 + m, err +} + +// Write an i32 as a varint. Results in 1-5 bytes on the wire. +// TODO(pomack): make a permanent buffer like writeVarint64? +func (p *TCompactProtocol) writeVarint32(n int32) (int, error) { + i32buf := p.buffer[0:5] + idx := 0 + for { + if (n & ^0x7F) == 0 { + i32buf[idx] = byte(n) + idx++ + // p.writeByteDirect(byte(n)); + break + // return; + } else { + i32buf[idx] = byte((n & 0x7F) | 0x80) + idx++ + // p.writeByteDirect(byte(((n & 0x7F) | 0x80))); + u := uint32(n) + n = int32(u >> 7) + } + } + return p.trans.Write(i32buf[0:idx]) +} + +// Write an i64 as a varint. Results in 1-10 bytes on the wire. +func (p *TCompactProtocol) writeVarint64(n int64) (int, error) { + varint64out := p.buffer[0:10] + idx := 0 + for { + if (n & ^0x7F) == 0 { + varint64out[idx] = byte(n) + idx++ + break + } else { + varint64out[idx] = byte((n & 0x7F) | 0x80) + idx++ + u := uint64(n) + n = int64(u >> 7) + } + } + return p.trans.Write(varint64out[0:idx]) +} + +// Convert l into a zigzag long. This allows negative numbers to be +// represented compactly as a varint. +func (p *TCompactProtocol) int64ToZigzag(l int64) int64 { + return (l << 1) ^ (l >> 63) +} + +// Convert l into a zigzag long. This allows negative numbers to be +// represented compactly as a varint. +func (p *TCompactProtocol) int32ToZigzag(n int32) int32 { + return (n << 1) ^ (n >> 31) +} + +func (p *TCompactProtocol) fixedUint64ToBytes(n uint64, buf []byte) { + binary.LittleEndian.PutUint64(buf, n) +} + +func (p *TCompactProtocol) fixedInt64ToBytes(n int64, buf []byte) { + binary.LittleEndian.PutUint64(buf, uint64(n)) +} + +// Writes a byte without any possibility of all that field header nonsense. +// Used internally by other writing methods that know they need to write a byte. +func (p *TCompactProtocol) writeByteDirect(b byte) error { + return p.trans.WriteByte(b) +} + +// Writes a byte without any possibility of all that field header nonsense. +func (p *TCompactProtocol) writeIntAsByteDirect(n int) (int, error) { + return 1, p.writeByteDirect(byte(n)) +} + +// +// Internal reading methods +// + +// Read an i32 from the wire as a varint. The MSB of each byte is set +// if there is another byte to follow. This can read up to 5 bytes. +func (p *TCompactProtocol) readVarint32() (int32, error) { + // if the wire contains the right stuff, this will just truncate the i64 we + // read and get us the right sign. + v, err := p.readVarint64() + return int32(v), err +} + +// Read an i64 from the wire as a proper varint. The MSB of each byte is set +// if there is another byte to follow. This can read up to 10 bytes. +func (p *TCompactProtocol) readVarint64() (int64, error) { + shift := uint(0) + result := int64(0) + for { + b, err := p.readByteDirect() + if err != nil { + return 0, err + } + result |= int64(b&0x7f) << shift + if (b & 0x80) != 0x80 { + break + } + shift += 7 + } + return result, nil +} + +// Read a byte, unlike ReadByte that reads Thrift-byte that is i8. +func (p *TCompactProtocol) readByteDirect() (byte, error) { + return p.trans.ReadByte() +} + +// +// encoding helpers +// + +// Convert from zigzag int to int. +func (p *TCompactProtocol) zigzagToInt32(n int32) int32 { + u := uint32(n) + return int32(u>>1) ^ -(n & 1) +} + +// Convert from zigzag long to long. +func (p *TCompactProtocol) zigzagToInt64(n int64) int64 { + u := uint64(n) + return int64(u>>1) ^ -(n & 1) +} + +// Note that it's important that the mask bytes are long literals, +// otherwise they'll default to ints, and when you shift an int left 56 bits, +// you just get a messed up int. +func (p *TCompactProtocol) bytesToInt64(b []byte) int64 { + return int64(binary.LittleEndian.Uint64(b)) +} + +// Note that it's important that the mask bytes are long literals, +// otherwise they'll default to ints, and when you shift an int left 56 bits, +// you just get a messed up int. +func (p *TCompactProtocol) bytesToUint64(b []byte) uint64 { + return binary.LittleEndian.Uint64(b) +} + +// +// type testing and converting +// + +func (p *TCompactProtocol) isBoolType(b byte) bool { + return (b&0x0f) == COMPACT_BOOLEAN_TRUE || (b&0x0f) == COMPACT_BOOLEAN_FALSE +} + +// Given a tCompactType constant, convert it to its corresponding +// TType value. +func (p *TCompactProtocol) getTType(t tCompactType) (TType, error) { + switch byte(t) & 0x0f { + case STOP: + return STOP, nil + case COMPACT_BOOLEAN_FALSE, COMPACT_BOOLEAN_TRUE: + return BOOL, nil + case COMPACT_BYTE: + return BYTE, nil + case COMPACT_I16: + return I16, nil + case COMPACT_I32: + return I32, nil + case COMPACT_I64: + return I64, nil + case COMPACT_DOUBLE: + return DOUBLE, nil + case COMPACT_BINARY: + return STRING, nil + case COMPACT_LIST: + return LIST, nil + case COMPACT_SET: + return SET, nil + case COMPACT_MAP: + return MAP, nil + case COMPACT_STRUCT: + return STRUCT, nil + } + return STOP, TException(fmt.Errorf("don't know what type: %d", t&0x0f)) +} + +// Given a TType value, find the appropriate TCompactProtocol.Types constant. +func (p *TCompactProtocol) getCompactType(t TType) tCompactType { + return ttypeToCompactType[t] +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/exception.go new file mode 100644 index 00000000..ea8d6f66 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/exception.go @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" +) + +// Generic Thrift exception +type TException interface { + error +} + +// Prepends additional information to an error without losing the Thrift exception interface +func PrependError(prepend string, err error) error { + if t, ok := err.(TTransportException); ok { + return NewTTransportException(t.TypeId(), prepend+t.Error()) + } + if t, ok := err.(TProtocolException); ok { + return NewTProtocolExceptionWithType(t.TypeId(), errors.New(prepend+err.Error())) + } + if t, ok := err.(TApplicationException); ok { + return NewTApplicationException(t.TypeId(), prepend+t.Error()) + } + + return errors.New(prepend + err.Error()) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go b/vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go new file mode 100644 index 00000000..b62fd56f --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bytes" +) + +// Memory buffer-based implementation of the TTransport interface. +type TMemoryBuffer struct { + *bytes.Buffer + size int +} + +type TMemoryBufferTransportFactory struct { + size int +} + +func (p *TMemoryBufferTransportFactory) GetTransport(trans TTransport) TTransport { + if trans != nil { + t, ok := trans.(*TMemoryBuffer) + if ok && t.size > 0 { + return NewTMemoryBufferLen(t.size) + } + } + return NewTMemoryBufferLen(p.size) +} + +func NewTMemoryBufferTransportFactory(size int) *TMemoryBufferTransportFactory { + return &TMemoryBufferTransportFactory{size: size} +} + +func NewTMemoryBuffer() *TMemoryBuffer { + return &TMemoryBuffer{Buffer: &bytes.Buffer{}, size: 0} +} + +func NewTMemoryBufferLen(size int) *TMemoryBuffer { + buf := make([]byte, 0, size) + return &TMemoryBuffer{Buffer: bytes.NewBuffer(buf), size: size} +} + +func (p *TMemoryBuffer) IsOpen() bool { + return true +} + +func (p *TMemoryBuffer) Open() error { + return nil +} + +func (p *TMemoryBuffer) Close() error { + p.Buffer.Reset() + return nil +} + +// Flushing a memory buffer is a no-op +func (p *TMemoryBuffer) Flush() error { + return nil +} + +func (p *TMemoryBuffer) RemainingBytes() (num_bytes uint64) { + return uint64(p.Buffer.Len()) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go b/vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go new file mode 100644 index 00000000..25ab2e98 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Message type constants in the Thrift protocol. +type TMessageType int32 + +const ( + INVALID_TMESSAGE_TYPE TMessageType = 0 + CALL TMessageType = 1 + REPLY TMessageType = 2 + EXCEPTION TMessageType = 3 + ONEWAY TMessageType = 4 +) diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/numeric.go b/vendor/github.com/uber/jaeger-client-go/thrift/numeric.go new file mode 100644 index 00000000..aa8daa9b --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/numeric.go @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "math" + "strconv" +) + +type Numeric interface { + Int64() int64 + Int32() int32 + Int16() int16 + Byte() byte + Int() int + Float64() float64 + Float32() float32 + String() string + isNull() bool +} + +type numeric struct { + iValue int64 + dValue float64 + sValue string + isNil bool +} + +var ( + INFINITY Numeric + NEGATIVE_INFINITY Numeric + NAN Numeric + ZERO Numeric + NUMERIC_NULL Numeric +) + +func NewNumericFromDouble(dValue float64) Numeric { + if math.IsInf(dValue, 1) { + return INFINITY + } + if math.IsInf(dValue, -1) { + return NEGATIVE_INFINITY + } + if math.IsNaN(dValue) { + return NAN + } + iValue := int64(dValue) + sValue := strconv.FormatFloat(dValue, 'g', 10, 64) + isNil := false + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromI64(iValue int64) Numeric { + dValue := float64(iValue) + sValue := string(iValue) + isNil := false + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromI32(iValue int32) Numeric { + dValue := float64(iValue) + sValue := string(iValue) + isNil := false + return &numeric{iValue: int64(iValue), dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromString(sValue string) Numeric { + if sValue == INFINITY.String() { + return INFINITY + } + if sValue == NEGATIVE_INFINITY.String() { + return NEGATIVE_INFINITY + } + if sValue == NAN.String() { + return NAN + } + iValue, _ := strconv.ParseInt(sValue, 10, 64) + dValue, _ := strconv.ParseFloat(sValue, 64) + isNil := len(sValue) == 0 + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} +} + +func NewNumericFromJSONString(sValue string, isNull bool) Numeric { + if isNull { + return NewNullNumeric() + } + if sValue == JSON_INFINITY { + return INFINITY + } + if sValue == JSON_NEGATIVE_INFINITY { + return NEGATIVE_INFINITY + } + if sValue == JSON_NAN { + return NAN + } + iValue, _ := strconv.ParseInt(sValue, 10, 64) + dValue, _ := strconv.ParseFloat(sValue, 64) + return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNull} +} + +func NewNullNumeric() Numeric { + return &numeric{iValue: 0, dValue: 0.0, sValue: "", isNil: true} +} + +func (p *numeric) Int64() int64 { + return p.iValue +} + +func (p *numeric) Int32() int32 { + return int32(p.iValue) +} + +func (p *numeric) Int16() int16 { + return int16(p.iValue) +} + +func (p *numeric) Byte() byte { + return byte(p.iValue) +} + +func (p *numeric) Int() int { + return int(p.iValue) +} + +func (p *numeric) Float64() float64 { + return p.dValue +} + +func (p *numeric) Float32() float32 { + return float32(p.dValue) +} + +func (p *numeric) String() string { + return p.sValue +} + +func (p *numeric) isNull() bool { + return p.isNil +} + +func init() { + INFINITY = &numeric{iValue: 0, dValue: math.Inf(1), sValue: "Infinity", isNil: false} + NEGATIVE_INFINITY = &numeric{iValue: 0, dValue: math.Inf(-1), sValue: "-Infinity", isNil: false} + NAN = &numeric{iValue: 0, dValue: math.NaN(), sValue: "NaN", isNil: false} + ZERO = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: false} + NUMERIC_NULL = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: true} +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/processor.go b/vendor/github.com/uber/jaeger-client-go/thrift/processor.go new file mode 100644 index 00000000..ca0d3faf --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/processor.go @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// A processor is a generic object which operates upon an input stream and +// writes to some output stream. +type TProcessor interface { + Process(in, out TProtocol) (bool, TException) +} + +type TProcessorFunction interface { + Process(seqId int32, in, out TProtocol) (bool, TException) +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/protocol.go new file mode 100644 index 00000000..45fa202e --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/protocol.go @@ -0,0 +1,175 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" +) + +const ( + VERSION_MASK = 0xffff0000 + VERSION_1 = 0x80010000 +) + +type TProtocol interface { + WriteMessageBegin(name string, typeId TMessageType, seqid int32) error + WriteMessageEnd() error + WriteStructBegin(name string) error + WriteStructEnd() error + WriteFieldBegin(name string, typeId TType, id int16) error + WriteFieldEnd() error + WriteFieldStop() error + WriteMapBegin(keyType TType, valueType TType, size int) error + WriteMapEnd() error + WriteListBegin(elemType TType, size int) error + WriteListEnd() error + WriteSetBegin(elemType TType, size int) error + WriteSetEnd() error + WriteBool(value bool) error + WriteByte(value int8) error + WriteI16(value int16) error + WriteI32(value int32) error + WriteI64(value int64) error + WriteDouble(value float64) error + WriteString(value string) error + WriteBinary(value []byte) error + + ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error) + ReadMessageEnd() error + ReadStructBegin() (name string, err error) + ReadStructEnd() error + ReadFieldBegin() (name string, typeId TType, id int16, err error) + ReadFieldEnd() error + ReadMapBegin() (keyType TType, valueType TType, size int, err error) + ReadMapEnd() error + ReadListBegin() (elemType TType, size int, err error) + ReadListEnd() error + ReadSetBegin() (elemType TType, size int, err error) + ReadSetEnd() error + ReadBool() (value bool, err error) + ReadByte() (value int8, err error) + ReadI16() (value int16, err error) + ReadI32() (value int32, err error) + ReadI64() (value int64, err error) + ReadDouble() (value float64, err error) + ReadString() (value string, err error) + ReadBinary() (value []byte, err error) + + Skip(fieldType TType) (err error) + Flush() (err error) + + Transport() TTransport +} + +// The maximum recursive depth the skip() function will traverse +const DEFAULT_RECURSION_DEPTH = 64 + +// Skips over the next data element from the provided input TProtocol object. +func SkipDefaultDepth(prot TProtocol, typeId TType) (err error) { + return Skip(prot, typeId, DEFAULT_RECURSION_DEPTH) +} + +// Skips over the next data element from the provided input TProtocol object. +func Skip(self TProtocol, fieldType TType, maxDepth int) (err error) { + + if maxDepth <= 0 { + return NewTProtocolExceptionWithType( DEPTH_LIMIT, errors.New("Depth limit exceeded")) + } + + switch fieldType { + case STOP: + return + case BOOL: + _, err = self.ReadBool() + return + case BYTE: + _, err = self.ReadByte() + return + case I16: + _, err = self.ReadI16() + return + case I32: + _, err = self.ReadI32() + return + case I64: + _, err = self.ReadI64() + return + case DOUBLE: + _, err = self.ReadDouble() + return + case STRING: + _, err = self.ReadString() + return + case STRUCT: + if _, err = self.ReadStructBegin(); err != nil { + return err + } + for { + _, typeId, _, _ := self.ReadFieldBegin() + if typeId == STOP { + break + } + err := Skip(self, typeId, maxDepth-1) + if err != nil { + return err + } + self.ReadFieldEnd() + } + return self.ReadStructEnd() + case MAP: + keyType, valueType, size, err := self.ReadMapBegin() + if err != nil { + return err + } + for i := 0; i < size; i++ { + err := Skip(self, keyType, maxDepth-1) + if err != nil { + return err + } + self.Skip(valueType) + } + return self.ReadMapEnd() + case SET: + elemType, size, err := self.ReadSetBegin() + if err != nil { + return err + } + for i := 0; i < size; i++ { + err := Skip(self, elemType, maxDepth-1) + if err != nil { + return err + } + } + return self.ReadSetEnd() + case LIST: + elemType, size, err := self.ReadListBegin() + if err != nil { + return err + } + for i := 0; i < size; i++ { + err := Skip(self, elemType, maxDepth-1) + if err != nil { + return err + } + } + return self.ReadListEnd() + } + return nil +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go new file mode 100644 index 00000000..6e357ee8 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "encoding/base64" +) + +// Thrift Protocol exception +type TProtocolException interface { + TException + TypeId() int +} + +const ( + UNKNOWN_PROTOCOL_EXCEPTION = 0 + INVALID_DATA = 1 + NEGATIVE_SIZE = 2 + SIZE_LIMIT = 3 + BAD_VERSION = 4 + NOT_IMPLEMENTED = 5 + DEPTH_LIMIT = 6 +) + +type tProtocolException struct { + typeId int + message string +} + +func (p *tProtocolException) TypeId() int { + return p.typeId +} + +func (p *tProtocolException) String() string { + return p.message +} + +func (p *tProtocolException) Error() string { + return p.message +} + +func NewTProtocolException(err error) TProtocolException { + if err == nil { + return nil + } + if e,ok := err.(TProtocolException); ok { + return e + } + if _, ok := err.(base64.CorruptInputError); ok { + return &tProtocolException{INVALID_DATA, err.Error()} + } + return &tProtocolException{UNKNOWN_PROTOCOL_EXCEPTION, err.Error()} +} + +func NewTProtocolExceptionWithType(errType int, err error) TProtocolException { + if err == nil { + return nil + } + return &tProtocolException{errType, err.Error()} +} + diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go b/vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go new file mode 100644 index 00000000..c40f796d --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Factory interface for constructing protocol instances. +type TProtocolFactory interface { + GetProtocol(trans TTransport) TProtocol +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go b/vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go new file mode 100644 index 00000000..8e296a99 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import "io" + +type RichTransport struct { + TTransport +} + +// Wraps Transport to provide TRichTransport interface +func NewTRichTransport(trans TTransport) *RichTransport { + return &RichTransport{trans} +} + +func (r *RichTransport) ReadByte() (c byte, err error) { + return readByte(r.TTransport) +} + +func (r *RichTransport) WriteByte(c byte) error { + return writeByte(r.TTransport, c) +} + +func (r *RichTransport) WriteString(s string) (n int, err error) { + return r.Write([]byte(s)) +} + +func (r *RichTransport) RemainingBytes() (num_bytes uint64) { + return r.TTransport.RemainingBytes() +} + +func readByte(r io.Reader) (c byte, err error) { + v := [1]byte{0} + n, err := r.Read(v[0:1]) + if n > 0 && (err == nil || err == io.EOF) { + return v[0], nil + } + if n > 0 && err != nil { + return v[0], err + } + if err != nil { + return 0, err + } + return v[0], nil +} + +func writeByte(w io.Writer, c byte) error { + v := [1]byte{c} + _, err := w.Write(v[0:1]) + return err +} + diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/serializer.go b/vendor/github.com/uber/jaeger-client-go/thrift/serializer.go new file mode 100644 index 00000000..77122299 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/serializer.go @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +type TSerializer struct { + Transport *TMemoryBuffer + Protocol TProtocol +} + +type TStruct interface { + Write(p TProtocol) error + Read(p TProtocol) error +} + +func NewTSerializer() *TSerializer { + transport := NewTMemoryBufferLen(1024) + protocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport) + + return &TSerializer{ + transport, + protocol} +} + +func (t *TSerializer) WriteString(msg TStruct) (s string, err error) { + t.Transport.Reset() + + if err = msg.Write(t.Protocol); err != nil { + return + } + + if err = t.Protocol.Flush(); err != nil { + return + } + if err = t.Transport.Flush(); err != nil { + return + } + + return t.Transport.String(), nil +} + +func (t *TSerializer) Write(msg TStruct) (b []byte, err error) { + t.Transport.Reset() + + if err = msg.Write(t.Protocol); err != nil { + return + } + + if err = t.Protocol.Flush(); err != nil { + return + } + + if err = t.Transport.Flush(); err != nil { + return + } + + b = append(b, t.Transport.Bytes()...) + return +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go new file mode 100644 index 00000000..412a482d --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go @@ -0,0 +1,1337 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "bufio" + "bytes" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "math" + "strconv" +) + +type _ParseContext int + +const ( + _CONTEXT_IN_TOPLEVEL _ParseContext = 1 + _CONTEXT_IN_LIST_FIRST _ParseContext = 2 + _CONTEXT_IN_LIST _ParseContext = 3 + _CONTEXT_IN_OBJECT_FIRST _ParseContext = 4 + _CONTEXT_IN_OBJECT_NEXT_KEY _ParseContext = 5 + _CONTEXT_IN_OBJECT_NEXT_VALUE _ParseContext = 6 +) + +func (p _ParseContext) String() string { + switch p { + case _CONTEXT_IN_TOPLEVEL: + return "TOPLEVEL" + case _CONTEXT_IN_LIST_FIRST: + return "LIST-FIRST" + case _CONTEXT_IN_LIST: + return "LIST" + case _CONTEXT_IN_OBJECT_FIRST: + return "OBJECT-FIRST" + case _CONTEXT_IN_OBJECT_NEXT_KEY: + return "OBJECT-NEXT-KEY" + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + return "OBJECT-NEXT-VALUE" + } + return "UNKNOWN-PARSE-CONTEXT" +} + +// JSON protocol implementation for thrift. +// +// This protocol produces/consumes a simple output format +// suitable for parsing by scripting languages. It should not be +// confused with the full-featured TJSONProtocol. +// +type TSimpleJSONProtocol struct { + trans TTransport + + parseContextStack []int + dumpContext []int + + writer *bufio.Writer + reader *bufio.Reader +} + +// Constructor +func NewTSimpleJSONProtocol(t TTransport) *TSimpleJSONProtocol { + v := &TSimpleJSONProtocol{trans: t, + writer: bufio.NewWriter(t), + reader: bufio.NewReader(t), + } + v.parseContextStack = append(v.parseContextStack, int(_CONTEXT_IN_TOPLEVEL)) + v.dumpContext = append(v.dumpContext, int(_CONTEXT_IN_TOPLEVEL)) + return v +} + +// Factory +type TSimpleJSONProtocolFactory struct{} + +func (p *TSimpleJSONProtocolFactory) GetProtocol(trans TTransport) TProtocol { + return NewTSimpleJSONProtocol(trans) +} + +func NewTSimpleJSONProtocolFactory() *TSimpleJSONProtocolFactory { + return &TSimpleJSONProtocolFactory{} +} + +var ( + JSON_COMMA []byte + JSON_COLON []byte + JSON_LBRACE []byte + JSON_RBRACE []byte + JSON_LBRACKET []byte + JSON_RBRACKET []byte + JSON_QUOTE byte + JSON_QUOTE_BYTES []byte + JSON_NULL []byte + JSON_TRUE []byte + JSON_FALSE []byte + JSON_INFINITY string + JSON_NEGATIVE_INFINITY string + JSON_NAN string + JSON_INFINITY_BYTES []byte + JSON_NEGATIVE_INFINITY_BYTES []byte + JSON_NAN_BYTES []byte + json_nonbase_map_elem_bytes []byte +) + +func init() { + JSON_COMMA = []byte{','} + JSON_COLON = []byte{':'} + JSON_LBRACE = []byte{'{'} + JSON_RBRACE = []byte{'}'} + JSON_LBRACKET = []byte{'['} + JSON_RBRACKET = []byte{']'} + JSON_QUOTE = '"' + JSON_QUOTE_BYTES = []byte{'"'} + JSON_NULL = []byte{'n', 'u', 'l', 'l'} + JSON_TRUE = []byte{'t', 'r', 'u', 'e'} + JSON_FALSE = []byte{'f', 'a', 'l', 's', 'e'} + JSON_INFINITY = "Infinity" + JSON_NEGATIVE_INFINITY = "-Infinity" + JSON_NAN = "NaN" + JSON_INFINITY_BYTES = []byte{'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'} + JSON_NEGATIVE_INFINITY_BYTES = []byte{'-', 'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'} + JSON_NAN_BYTES = []byte{'N', 'a', 'N'} + json_nonbase_map_elem_bytes = []byte{']', ',', '['} +} + +func jsonQuote(s string) string { + b, _ := json.Marshal(s) + s1 := string(b) + return s1 +} + +func jsonUnquote(s string) (string, bool) { + s1 := new(string) + err := json.Unmarshal([]byte(s), s1) + return *s1, err == nil +} + +func mismatch(expected, actual string) error { + return fmt.Errorf("Expected '%s' but found '%s' while parsing JSON.", expected, actual) +} + +func (p *TSimpleJSONProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { + p.resetContextStack() // THRIFT-3735 + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteString(name); e != nil { + return e + } + if e := p.WriteByte(int8(typeId)); e != nil { + return e + } + if e := p.WriteI32(seqId); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) WriteMessageEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteStructBegin(name string) error { + if e := p.OutputObjectBegin(); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) WriteStructEnd() error { + return p.OutputObjectEnd() +} + +func (p *TSimpleJSONProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { + if e := p.WriteString(name); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) WriteFieldEnd() error { + //return p.OutputListEnd() + return nil +} + +func (p *TSimpleJSONProtocol) WriteFieldStop() error { return nil } + +func (p *TSimpleJSONProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteByte(int8(keyType)); e != nil { + return e + } + if e := p.WriteByte(int8(valueType)); e != nil { + return e + } + return p.WriteI32(int32(size)) +} + +func (p *TSimpleJSONProtocol) WriteMapEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteListBegin(elemType TType, size int) error { + return p.OutputElemListBegin(elemType, size) +} + +func (p *TSimpleJSONProtocol) WriteListEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteSetBegin(elemType TType, size int) error { + return p.OutputElemListBegin(elemType, size) +} + +func (p *TSimpleJSONProtocol) WriteSetEnd() error { + return p.OutputListEnd() +} + +func (p *TSimpleJSONProtocol) WriteBool(b bool) error { + return p.OutputBool(b) +} + +func (p *TSimpleJSONProtocol) WriteByte(b int8) error { + return p.WriteI32(int32(b)) +} + +func (p *TSimpleJSONProtocol) WriteI16(v int16) error { + return p.WriteI32(int32(v)) +} + +func (p *TSimpleJSONProtocol) WriteI32(v int32) error { + return p.OutputI64(int64(v)) +} + +func (p *TSimpleJSONProtocol) WriteI64(v int64) error { + return p.OutputI64(int64(v)) +} + +func (p *TSimpleJSONProtocol) WriteDouble(v float64) error { + return p.OutputF64(v) +} + +func (p *TSimpleJSONProtocol) WriteString(v string) error { + return p.OutputString(v) +} + +func (p *TSimpleJSONProtocol) WriteBinary(v []byte) error { + // JSON library only takes in a string, + // not an arbitrary byte array, to ensure bytes are transmitted + // efficiently we must convert this into a valid JSON string + // therefore we use base64 encoding to avoid excessive escaping/quoting + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.write(JSON_QUOTE_BYTES); e != nil { + return NewTProtocolException(e) + } + writer := base64.NewEncoder(base64.StdEncoding, p.writer) + if _, e := writer.Write(v); e != nil { + p.writer.Reset(p.trans) // THRIFT-3735 + return NewTProtocolException(e) + } + if e := writer.Close(); e != nil { + return NewTProtocolException(e) + } + if _, e := p.write(JSON_QUOTE_BYTES); e != nil { + return NewTProtocolException(e) + } + return p.OutputPostValue() +} + +// Reading methods. +func (p *TSimpleJSONProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { + p.resetContextStack() // THRIFT-3735 + if isNull, err := p.ParseListBegin(); isNull || err != nil { + return name, typeId, seqId, err + } + if name, err = p.ReadString(); err != nil { + return name, typeId, seqId, err + } + bTypeId, err := p.ReadByte() + typeId = TMessageType(bTypeId) + if err != nil { + return name, typeId, seqId, err + } + if seqId, err = p.ReadI32(); err != nil { + return name, typeId, seqId, err + } + return name, typeId, seqId, nil +} + +func (p *TSimpleJSONProtocol) ReadMessageEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadStructBegin() (name string, err error) { + _, err = p.ParseObjectStart() + return "", err +} + +func (p *TSimpleJSONProtocol) ReadStructEnd() error { + return p.ParseObjectEnd() +} + +func (p *TSimpleJSONProtocol) ReadFieldBegin() (string, TType, int16, error) { + if err := p.ParsePreValue(); err != nil { + return "", STOP, 0, err + } + b, _ := p.reader.Peek(1) + if len(b) > 0 { + switch b[0] { + case JSON_RBRACE[0]: + return "", STOP, 0, nil + case JSON_QUOTE: + p.reader.ReadByte() + name, err := p.ParseStringBody() + // simplejson is not meant to be read back into thrift + // - see http://wiki.apache.org/thrift/ThriftUsageJava + // - use JSON instead + if err != nil { + return name, STOP, 0, err + } + return name, STOP, -1, p.ParsePostValue() + /* + if err = p.ParsePostValue(); err != nil { + return name, STOP, 0, err + } + if isNull, err := p.ParseListBegin(); isNull || err != nil { + return name, STOP, 0, err + } + bType, err := p.ReadByte() + thetype := TType(bType) + if err != nil { + return name, thetype, 0, err + } + id, err := p.ReadI16() + return name, thetype, id, err + */ + } + e := fmt.Errorf("Expected \"}\" or '\"', but found: '%s'", string(b)) + return "", STOP, 0, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return "", STOP, 0, NewTProtocolException(io.EOF) +} + +func (p *TSimpleJSONProtocol) ReadFieldEnd() error { + return nil + //return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, VOID, 0, e + } + + // read keyType + bKeyType, e := p.ReadByte() + keyType = TType(bKeyType) + if e != nil { + return keyType, valueType, size, e + } + + // read valueType + bValueType, e := p.ReadByte() + valueType = TType(bValueType) + if e != nil { + return keyType, valueType, size, e + } + + // read size + iSize, err := p.ReadI64() + size = int(iSize) + return keyType, valueType, size, err +} + +func (p *TSimpleJSONProtocol) ReadMapEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadListBegin() (elemType TType, size int, e error) { + return p.ParseElemListBegin() +} + +func (p *TSimpleJSONProtocol) ReadListEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadSetBegin() (elemType TType, size int, e error) { + return p.ParseElemListBegin() +} + +func (p *TSimpleJSONProtocol) ReadSetEnd() error { + return p.ParseListEnd() +} + +func (p *TSimpleJSONProtocol) ReadBool() (bool, error) { + var value bool + + if err := p.ParsePreValue(); err != nil { + return value, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 { + switch f[0] { + case JSON_TRUE[0]: + b := make([]byte, len(JSON_TRUE)) + _, err := p.reader.Read(b) + if err != nil { + return false, NewTProtocolException(err) + } + if string(b) == string(JSON_TRUE) { + value = true + } else { + e := fmt.Errorf("Expected \"true\" but found: %s", string(b)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + break + case JSON_FALSE[0]: + b := make([]byte, len(JSON_FALSE)) + _, err := p.reader.Read(b) + if err != nil { + return false, NewTProtocolException(err) + } + if string(b) == string(JSON_FALSE) { + value = false + } else { + e := fmt.Errorf("Expected \"false\" but found: %s", string(b)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + break + case JSON_NULL[0]: + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return false, NewTProtocolException(err) + } + if string(b) == string(JSON_NULL) { + value = false + } else { + e := fmt.Errorf("Expected \"null\" but found: %s", string(b)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + default: + e := fmt.Errorf("Expected \"true\", \"false\", or \"null\" but found: %s", string(f)) + return value, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + return value, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ReadByte() (int8, error) { + v, err := p.ReadI64() + return int8(v), err +} + +func (p *TSimpleJSONProtocol) ReadI16() (int16, error) { + v, err := p.ReadI64() + return int16(v), err +} + +func (p *TSimpleJSONProtocol) ReadI32() (int32, error) { + v, err := p.ReadI64() + return int32(v), err +} + +func (p *TSimpleJSONProtocol) ReadI64() (int64, error) { + v, _, err := p.ParseI64() + return v, err +} + +func (p *TSimpleJSONProtocol) ReadDouble() (float64, error) { + v, _, err := p.ParseF64() + return v, err +} + +func (p *TSimpleJSONProtocol) ReadString() (string, error) { + var v string + if err := p.ParsePreValue(); err != nil { + return v, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 && f[0] == JSON_QUOTE { + p.reader.ReadByte() + value, err := p.ParseStringBody() + v = value + if err != nil { + return v, err + } + } else if len(f) > 0 && f[0] == JSON_NULL[0] { + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return v, NewTProtocolException(err) + } + if string(b) != string(JSON_NULL) { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } else { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return v, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ReadBinary() ([]byte, error) { + var v []byte + if err := p.ParsePreValue(); err != nil { + return nil, err + } + f, _ := p.reader.Peek(1) + if len(f) > 0 && f[0] == JSON_QUOTE { + p.reader.ReadByte() + value, err := p.ParseBase64EncodedBody() + v = value + if err != nil { + return v, err + } + } else if len(f) > 0 && f[0] == JSON_NULL[0] { + b := make([]byte, len(JSON_NULL)) + _, err := p.reader.Read(b) + if err != nil { + return v, NewTProtocolException(err) + } + if string(b) != string(JSON_NULL) { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } else { + e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) + return v, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + + return v, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) Flush() (err error) { + return NewTProtocolException(p.writer.Flush()) +} + +func (p *TSimpleJSONProtocol) Skip(fieldType TType) (err error) { + return SkipDefaultDepth(p, fieldType) +} + +func (p *TSimpleJSONProtocol) Transport() TTransport { + return p.trans +} + +func (p *TSimpleJSONProtocol) OutputPreValue() error { + cxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1]) + switch cxt { + case _CONTEXT_IN_LIST, _CONTEXT_IN_OBJECT_NEXT_KEY: + if _, e := p.write(JSON_COMMA); e != nil { + return NewTProtocolException(e) + } + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + if _, e := p.write(JSON_COLON); e != nil { + return NewTProtocolException(e) + } + break + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputPostValue() error { + cxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1]) + switch cxt { + case _CONTEXT_IN_LIST_FIRST: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST)) + break + case _CONTEXT_IN_OBJECT_FIRST: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) + break + case _CONTEXT_IN_OBJECT_NEXT_KEY: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_KEY)) + break + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputBool(value bool) error { + if e := p.OutputPreValue(); e != nil { + return e + } + var v string + if value { + v = string(JSON_TRUE) + } else { + v = string(JSON_FALSE) + } + switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + v = jsonQuote(v) + default: + } + if e := p.OutputStringData(v); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputNull() error { + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.write(JSON_NULL); e != nil { + return NewTProtocolException(e) + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputF64(value float64) error { + if e := p.OutputPreValue(); e != nil { + return e + } + var v string + if math.IsNaN(value) { + v = string(JSON_QUOTE) + JSON_NAN + string(JSON_QUOTE) + } else if math.IsInf(value, 1) { + v = string(JSON_QUOTE) + JSON_INFINITY + string(JSON_QUOTE) + } else if math.IsInf(value, -1) { + v = string(JSON_QUOTE) + JSON_NEGATIVE_INFINITY + string(JSON_QUOTE) + } else { + v = strconv.FormatFloat(value, 'g', -1, 64) + switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + v = string(JSON_QUOTE) + v + string(JSON_QUOTE) + default: + } + } + if e := p.OutputStringData(v); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputI64(value int64) error { + if e := p.OutputPreValue(); e != nil { + return e + } + v := strconv.FormatInt(value, 10) + switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + v = jsonQuote(v) + default: + } + if e := p.OutputStringData(v); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputString(s string) error { + if e := p.OutputPreValue(); e != nil { + return e + } + if e := p.OutputStringData(jsonQuote(s)); e != nil { + return e + } + return p.OutputPostValue() +} + +func (p *TSimpleJSONProtocol) OutputStringData(s string) error { + _, e := p.write([]byte(s)) + return NewTProtocolException(e) +} + +func (p *TSimpleJSONProtocol) OutputObjectBegin() error { + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.write(JSON_LBRACE); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_FIRST)) + return nil +} + +func (p *TSimpleJSONProtocol) OutputObjectEnd() error { + if _, e := p.write(JSON_RBRACE); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + if e := p.OutputPostValue(); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputListBegin() error { + if e := p.OutputPreValue(); e != nil { + return e + } + if _, e := p.write(JSON_LBRACKET); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST_FIRST)) + return nil +} + +func (p *TSimpleJSONProtocol) OutputListEnd() error { + if _, e := p.write(JSON_RBRACKET); e != nil { + return NewTProtocolException(e) + } + p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] + if e := p.OutputPostValue(); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) OutputElemListBegin(elemType TType, size int) error { + if e := p.OutputListBegin(); e != nil { + return e + } + if e := p.WriteByte(int8(elemType)); e != nil { + return e + } + if e := p.WriteI64(int64(size)); e != nil { + return e + } + return nil +} + +func (p *TSimpleJSONProtocol) ParsePreValue() error { + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + b, _ := p.reader.Peek(1) + switch cxt { + case _CONTEXT_IN_LIST: + if len(b) > 0 { + switch b[0] { + case JSON_RBRACKET[0]: + return nil + case JSON_COMMA[0]: + p.reader.ReadByte() + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + return nil + default: + e := fmt.Errorf("Expected \"]\" or \",\" in list context, but found \"%s\"", string(b)) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + break + case _CONTEXT_IN_OBJECT_NEXT_KEY: + if len(b) > 0 { + switch b[0] { + case JSON_RBRACE[0]: + return nil + case JSON_COMMA[0]: + p.reader.ReadByte() + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + return nil + default: + e := fmt.Errorf("Expected \"}\" or \",\" in object context, but found \"%s\"", string(b)) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + if len(b) > 0 { + switch b[0] { + case JSON_COLON[0]: + p.reader.ReadByte() + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + return nil + default: + e := fmt.Errorf("Expected \":\" in object context, but found \"%s\"", string(b)) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + break + } + return nil +} + +func (p *TSimpleJSONProtocol) ParsePostValue() error { + if e := p.readNonSignificantWhitespace(); e != nil { + return NewTProtocolException(e) + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + switch cxt { + case _CONTEXT_IN_LIST_FIRST: + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST)) + break + case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) + break + case _CONTEXT_IN_OBJECT_NEXT_VALUE: + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_KEY)) + break + } + return nil +} + +func (p *TSimpleJSONProtocol) readNonSignificantWhitespace() error { + for { + b, _ := p.reader.Peek(1) + if len(b) < 1 { + return nil + } + switch b[0] { + case ' ', '\r', '\n', '\t': + p.reader.ReadByte() + continue + default: + break + } + break + } + return nil +} + +func (p *TSimpleJSONProtocol) ParseStringBody() (string, error) { + line, err := p.reader.ReadString(JSON_QUOTE) + if err != nil { + return "", NewTProtocolException(err) + } + l := len(line) + // count number of escapes to see if we need to keep going + i := 1 + for ; i < l; i++ { + if line[l-i-1] != '\\' { + break + } + } + if i&0x01 == 1 { + v, ok := jsonUnquote(string(JSON_QUOTE) + line) + if !ok { + return "", NewTProtocolException(err) + } + return v, nil + } + s, err := p.ParseQuotedStringBody() + if err != nil { + return "", NewTProtocolException(err) + } + str := string(JSON_QUOTE) + line + s + v, ok := jsonUnquote(str) + if !ok { + e := fmt.Errorf("Unable to parse as JSON string %s", str) + return "", NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return v, nil +} + +func (p *TSimpleJSONProtocol) ParseQuotedStringBody() (string, error) { + line, err := p.reader.ReadString(JSON_QUOTE) + if err != nil { + return "", NewTProtocolException(err) + } + l := len(line) + // count number of escapes to see if we need to keep going + i := 1 + for ; i < l; i++ { + if line[l-i-1] != '\\' { + break + } + } + if i&0x01 == 1 { + return line, nil + } + s, err := p.ParseQuotedStringBody() + if err != nil { + return "", NewTProtocolException(err) + } + v := line + s + return v, nil +} + +func (p *TSimpleJSONProtocol) ParseBase64EncodedBody() ([]byte, error) { + line, err := p.reader.ReadBytes(JSON_QUOTE) + if err != nil { + return line, NewTProtocolException(err) + } + line2 := line[0 : len(line)-1] + l := len(line2) + if (l % 4) != 0 { + pad := 4 - (l % 4) + fill := [...]byte{'=', '=', '='} + line2 = append(line2, fill[:pad]...) + l = len(line2) + } + output := make([]byte, base64.StdEncoding.DecodedLen(l)) + n, err := base64.StdEncoding.Decode(output, line2) + return output[0:n], NewTProtocolException(err) +} + +func (p *TSimpleJSONProtocol) ParseI64() (int64, bool, error) { + if err := p.ParsePreValue(); err != nil { + return 0, false, err + } + var value int64 + var isnull bool + if p.safePeekContains(JSON_NULL) { + p.reader.Read(make([]byte, len(JSON_NULL))) + isnull = true + } else { + num, err := p.readNumeric() + isnull = (num == nil) + if !isnull { + value = num.Int64() + } + if err != nil { + return value, isnull, err + } + } + return value, isnull, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ParseF64() (float64, bool, error) { + if err := p.ParsePreValue(); err != nil { + return 0, false, err + } + var value float64 + var isnull bool + if p.safePeekContains(JSON_NULL) { + p.reader.Read(make([]byte, len(JSON_NULL))) + isnull = true + } else { + num, err := p.readNumeric() + isnull = (num == nil) + if !isnull { + value = num.Float64() + } + if err != nil { + return value, isnull, err + } + } + return value, isnull, p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ParseObjectStart() (bool, error) { + if err := p.ParsePreValue(); err != nil { + return false, err + } + var b []byte + b, err := p.reader.Peek(1) + if err != nil { + return false, err + } + if len(b) > 0 && b[0] == JSON_LBRACE[0] { + p.reader.ReadByte() + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_FIRST)) + return false, nil + } else if p.safePeekContains(JSON_NULL) { + return true, nil + } + e := fmt.Errorf("Expected '{' or null, but found '%s'", string(b)) + return false, NewTProtocolExceptionWithType(INVALID_DATA, e) +} + +func (p *TSimpleJSONProtocol) ParseObjectEnd() error { + if isNull, err := p.readIfNull(); isNull || err != nil { + return err + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + if (cxt != _CONTEXT_IN_OBJECT_FIRST) && (cxt != _CONTEXT_IN_OBJECT_NEXT_KEY) { + e := fmt.Errorf("Expected to be in the Object Context, but not in Object Context (%d)", cxt) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + line, err := p.reader.ReadString(JSON_RBRACE[0]) + if err != nil { + return NewTProtocolException(err) + } + for _, char := range line { + switch char { + default: + e := fmt.Errorf("Expecting end of object \"}\", but found: \"%s\"", line) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + case ' ', '\n', '\r', '\t', '}': + break + } + } + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + return p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) ParseListBegin() (isNull bool, err error) { + if e := p.ParsePreValue(); e != nil { + return false, e + } + var b []byte + b, err = p.reader.Peek(1) + if err != nil { + return false, err + } + if len(b) >= 1 && b[0] == JSON_LBRACKET[0] { + p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST_FIRST)) + p.reader.ReadByte() + isNull = false + } else if p.safePeekContains(JSON_NULL) { + isNull = true + } else { + err = fmt.Errorf("Expected \"null\" or \"[\", received %q", b) + } + return isNull, NewTProtocolExceptionWithType(INVALID_DATA, err) +} + +func (p *TSimpleJSONProtocol) ParseElemListBegin() (elemType TType, size int, e error) { + if isNull, e := p.ParseListBegin(); isNull || e != nil { + return VOID, 0, e + } + bElemType, err := p.ReadByte() + elemType = TType(bElemType) + if err != nil { + return elemType, size, err + } + nSize, err2 := p.ReadI64() + size = int(nSize) + return elemType, size, err2 +} + +func (p *TSimpleJSONProtocol) ParseListEnd() error { + if isNull, err := p.readIfNull(); isNull || err != nil { + return err + } + cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) + if cxt != _CONTEXT_IN_LIST { + e := fmt.Errorf("Expected to be in the List Context, but not in List Context (%d)", cxt) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + } + line, err := p.reader.ReadString(JSON_RBRACKET[0]) + if err != nil { + return NewTProtocolException(err) + } + for _, char := range line { + switch char { + default: + e := fmt.Errorf("Expecting end of list \"]\", but found: \"%s\"", line) + return NewTProtocolExceptionWithType(INVALID_DATA, e) + case ' ', '\n', '\r', '\t', rune(JSON_RBRACKET[0]): + break + } + } + p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] + if _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) == _CONTEXT_IN_TOPLEVEL { + return nil + } + return p.ParsePostValue() +} + +func (p *TSimpleJSONProtocol) readSingleValue() (interface{}, TType, error) { + e := p.readNonSignificantWhitespace() + if e != nil { + return nil, VOID, NewTProtocolException(e) + } + b, e := p.reader.Peek(1) + if len(b) > 0 { + c := b[0] + switch c { + case JSON_NULL[0]: + buf := make([]byte, len(JSON_NULL)) + _, e := p.reader.Read(buf) + if e != nil { + return nil, VOID, NewTProtocolException(e) + } + if string(JSON_NULL) != string(buf) { + e = mismatch(string(JSON_NULL), string(buf)) + return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return nil, VOID, nil + case JSON_QUOTE: + p.reader.ReadByte() + v, e := p.ParseStringBody() + if e != nil { + return v, UTF8, NewTProtocolException(e) + } + if v == JSON_INFINITY { + return INFINITY, DOUBLE, nil + } else if v == JSON_NEGATIVE_INFINITY { + return NEGATIVE_INFINITY, DOUBLE, nil + } else if v == JSON_NAN { + return NAN, DOUBLE, nil + } + return v, UTF8, nil + case JSON_TRUE[0]: + buf := make([]byte, len(JSON_TRUE)) + _, e := p.reader.Read(buf) + if e != nil { + return true, BOOL, NewTProtocolException(e) + } + if string(JSON_TRUE) != string(buf) { + e := mismatch(string(JSON_TRUE), string(buf)) + return true, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return true, BOOL, nil + case JSON_FALSE[0]: + buf := make([]byte, len(JSON_FALSE)) + _, e := p.reader.Read(buf) + if e != nil { + return false, BOOL, NewTProtocolException(e) + } + if string(JSON_FALSE) != string(buf) { + e := mismatch(string(JSON_FALSE), string(buf)) + return false, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return false, BOOL, nil + case JSON_LBRACKET[0]: + _, e := p.reader.ReadByte() + return make([]interface{}, 0), LIST, NewTProtocolException(e) + case JSON_LBRACE[0]: + _, e := p.reader.ReadByte() + return make(map[string]interface{}), STRUCT, NewTProtocolException(e) + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'e', 'E', '.', '+', '-', JSON_INFINITY[0], JSON_NAN[0]: + // assume numeric + v, e := p.readNumeric() + return v, DOUBLE, e + default: + e := fmt.Errorf("Expected element in list but found '%s' while parsing JSON.", string(c)) + return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + e = fmt.Errorf("Cannot read a single element while parsing JSON.") + return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) + +} + +func (p *TSimpleJSONProtocol) readIfNull() (bool, error) { + cont := true + for cont { + b, _ := p.reader.Peek(1) + if len(b) < 1 { + return false, nil + } + switch b[0] { + default: + return false, nil + case JSON_NULL[0]: + cont = false + break + case ' ', '\n', '\r', '\t': + p.reader.ReadByte() + break + } + } + if p.safePeekContains(JSON_NULL) { + p.reader.Read(make([]byte, len(JSON_NULL))) + return true, nil + } + return false, nil +} + +func (p *TSimpleJSONProtocol) readQuoteIfNext() { + b, _ := p.reader.Peek(1) + if len(b) > 0 && b[0] == JSON_QUOTE { + p.reader.ReadByte() + } +} + +func (p *TSimpleJSONProtocol) readNumeric() (Numeric, error) { + isNull, err := p.readIfNull() + if isNull || err != nil { + return NUMERIC_NULL, err + } + hasDecimalPoint := false + nextCanBeSign := true + hasE := false + MAX_LEN := 40 + buf := bytes.NewBuffer(make([]byte, 0, MAX_LEN)) + continueFor := true + inQuotes := false + for continueFor { + c, err := p.reader.ReadByte() + if err != nil { + if err == io.EOF { + break + } + return NUMERIC_NULL, NewTProtocolException(err) + } + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + buf.WriteByte(c) + nextCanBeSign = false + case '.': + if hasDecimalPoint { + e := fmt.Errorf("Unable to parse number with multiple decimal points '%s.'", buf.String()) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if hasE { + e := fmt.Errorf("Unable to parse number with decimal points in the exponent '%s.'", buf.String()) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + buf.WriteByte(c) + hasDecimalPoint, nextCanBeSign = true, false + case 'e', 'E': + if hasE { + e := fmt.Errorf("Unable to parse number with multiple exponents '%s%c'", buf.String(), c) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + buf.WriteByte(c) + hasE, nextCanBeSign = true, true + case '-', '+': + if !nextCanBeSign { + e := fmt.Errorf("Negative sign within number") + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + buf.WriteByte(c) + nextCanBeSign = false + case ' ', 0, '\t', '\n', '\r', JSON_RBRACE[0], JSON_RBRACKET[0], JSON_COMMA[0], JSON_COLON[0]: + p.reader.UnreadByte() + continueFor = false + case JSON_NAN[0]: + if buf.Len() == 0 { + buffer := make([]byte, len(JSON_NAN)) + buffer[0] = c + _, e := p.reader.Read(buffer[1:]) + if e != nil { + return NUMERIC_NULL, NewTProtocolException(e) + } + if JSON_NAN != string(buffer) { + e := mismatch(JSON_NAN, string(buffer)) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if inQuotes { + p.readQuoteIfNext() + } + return NAN, nil + } else { + e := fmt.Errorf("Unable to parse number starting with character '%c'", c) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + case JSON_INFINITY[0]: + if buf.Len() == 0 || (buf.Len() == 1 && buf.Bytes()[0] == '+') { + buffer := make([]byte, len(JSON_INFINITY)) + buffer[0] = c + _, e := p.reader.Read(buffer[1:]) + if e != nil { + return NUMERIC_NULL, NewTProtocolException(e) + } + if JSON_INFINITY != string(buffer) { + e := mismatch(JSON_INFINITY, string(buffer)) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if inQuotes { + p.readQuoteIfNext() + } + return INFINITY, nil + } else if buf.Len() == 1 && buf.Bytes()[0] == JSON_NEGATIVE_INFINITY[0] { + buffer := make([]byte, len(JSON_NEGATIVE_INFINITY)) + buffer[0] = JSON_NEGATIVE_INFINITY[0] + buffer[1] = c + _, e := p.reader.Read(buffer[2:]) + if e != nil { + return NUMERIC_NULL, NewTProtocolException(e) + } + if JSON_NEGATIVE_INFINITY != string(buffer) { + e := mismatch(JSON_NEGATIVE_INFINITY, string(buffer)) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + if inQuotes { + p.readQuoteIfNext() + } + return NEGATIVE_INFINITY, nil + } else { + e := fmt.Errorf("Unable to parse number starting with character '%c' due to existing buffer %s", c, buf.String()) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + case JSON_QUOTE: + if !inQuotes { + inQuotes = true + } else { + break + } + default: + e := fmt.Errorf("Unable to parse number starting with character '%c'", c) + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + } + if buf.Len() == 0 { + e := fmt.Errorf("Unable to parse number from empty string ''") + return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) + } + return NewNumericFromJSONString(buf.String(), false), nil +} + +// Safely peeks into the buffer, reading only what is necessary +func (p *TSimpleJSONProtocol) safePeekContains(b []byte) bool { + for i := 0; i < len(b); i++ { + a, _ := p.reader.Peek(i + 1) + if len(a) == 0 || a[i] != b[i] { + return false + } + } + return true +} + +// Reset the context stack to its initial state. +func (p *TSimpleJSONProtocol) resetContextStack() { + p.parseContextStack = []int{int(_CONTEXT_IN_TOPLEVEL)} + p.dumpContext = []int{int(_CONTEXT_IN_TOPLEVEL)} +} + +func (p *TSimpleJSONProtocol) write(b []byte) (int, error) { + n, err := p.writer.Write(b) + if err != nil { + p.writer.Reset(p.trans) // THRIFT-3735 + } + return n, err +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/transport.go b/vendor/github.com/uber/jaeger-client-go/thrift/transport.go new file mode 100644 index 00000000..45389965 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/transport.go @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" + "io" +) + +var errTransportInterrupted = errors.New("Transport Interrupted") + +type Flusher interface { + Flush() (err error) +} + +type ReadSizeProvider interface { + RemainingBytes() (num_bytes uint64) +} + + +// Encapsulates the I/O layer +type TTransport interface { + io.ReadWriteCloser + Flusher + ReadSizeProvider + + // Opens the transport for communication + Open() error + + // Returns true if the transport is open + IsOpen() bool +} + +type stringWriter interface { + WriteString(s string) (n int, err error) +} + + +// This is "enchanced" transport with extra capabilities. You need to use one of these +// to construct protocol. +// Notably, TSocket does not implement this interface, and it is always a mistake to use +// TSocket directly in protocol. +type TRichTransport interface { + io.ReadWriter + io.ByteReader + io.ByteWriter + stringWriter + Flusher + ReadSizeProvider +} + diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go new file mode 100644 index 00000000..9505b446 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +import ( + "errors" + "io" +) + +type timeoutable interface { + Timeout() bool +} + +// Thrift Transport exception +type TTransportException interface { + TException + TypeId() int + Err() error +} + +const ( + UNKNOWN_TRANSPORT_EXCEPTION = 0 + NOT_OPEN = 1 + ALREADY_OPEN = 2 + TIMED_OUT = 3 + END_OF_FILE = 4 +) + +type tTransportException struct { + typeId int + err error +} + +func (p *tTransportException) TypeId() int { + return p.typeId +} + +func (p *tTransportException) Error() string { + return p.err.Error() +} + +func (p *tTransportException) Err() error { + return p.err +} + +func NewTTransportException(t int, e string) TTransportException { + return &tTransportException{typeId: t, err: errors.New(e)} +} + +func NewTTransportExceptionFromError(e error) TTransportException { + if e == nil { + return nil + } + + if t, ok := e.(TTransportException); ok { + return t + } + + switch v := e.(type) { + case TTransportException: + return v + case timeoutable: + if v.Timeout() { + return &tTransportException{typeId: TIMED_OUT, err: e} + } + } + + if e == io.EOF { + return &tTransportException{typeId: END_OF_FILE, err: e} + } + + return &tTransportException{typeId: UNKNOWN_TRANSPORT_EXCEPTION, err: e} +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go b/vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go new file mode 100644 index 00000000..533d1b43 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Factory class used to create wrapped instance of Transports. +// This is used primarily in servers, which get Transports from +// a ServerTransport and then may want to mutate them (i.e. create +// a BufferedTransport from the underlying base transport) +type TTransportFactory interface { + GetTransport(trans TTransport) TTransport +} + +type tTransportFactory struct{} + +// Return a wrapped instance of the base Transport. +func (p *tTransportFactory) GetTransport(trans TTransport) TTransport { + return trans +} + +func NewTTransportFactory() TTransportFactory { + return &tTransportFactory{} +} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/type.go b/vendor/github.com/uber/jaeger-client-go/thrift/type.go new file mode 100644 index 00000000..4292ffca --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/thrift/type.go @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package thrift + +// Type constants in the Thrift protocol +type TType byte + +const ( + STOP = 0 + VOID = 1 + BOOL = 2 + BYTE = 3 + I08 = 3 + DOUBLE = 4 + I16 = 6 + I32 = 8 + I64 = 10 + STRING = 11 + UTF7 = 11 + STRUCT = 12 + MAP = 13 + SET = 14 + LIST = 15 + UTF8 = 16 + UTF16 = 17 + //BINARY = 18 wrong and unusued +) + +var typeNames = map[int]string{ + STOP: "STOP", + VOID: "VOID", + BOOL: "BOOL", + BYTE: "BYTE", + DOUBLE: "DOUBLE", + I16: "I16", + I32: "I32", + I64: "I64", + STRING: "STRING", + STRUCT: "STRUCT", + MAP: "MAP", + SET: "SET", + LIST: "LIST", + UTF8: "UTF8", + UTF16: "UTF16", +} + +func (p TType) String() string { + if s, ok := typeNames[int(p)]; ok { + return s + } + return "Unknown" +} diff --git a/vendor/github.com/uber/jaeger-client-go/tracer.go b/vendor/github.com/uber/jaeger-client-go/tracer.go new file mode 100644 index 00000000..477c6eae --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/tracer.go @@ -0,0 +1,491 @@ +// Copyright (c) 2017-2018 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "fmt" + "io" + "math/rand" + "os" + "reflect" + "strconv" + "sync" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + + "github.com/uber/jaeger-client-go/internal/baggage" + "github.com/uber/jaeger-client-go/internal/throttler" + "github.com/uber/jaeger-client-go/log" + "github.com/uber/jaeger-client-go/utils" +) + +// Tracer implements opentracing.Tracer. +type Tracer struct { + serviceName string + hostIPv4 uint32 // this is for zipkin endpoint conversion + + sampler SamplerV2 + reporter Reporter + metrics Metrics + logger log.DebugLogger + + timeNow func() time.Time + randomNumber func() uint64 + + options struct { + gen128Bit bool // whether to generate 128bit trace IDs + zipkinSharedRPCSpan bool + highTraceIDGenerator func() uint64 // custom high trace ID generator + maxTagValueLength int + noDebugFlagOnForcedSampling bool + maxLogsPerSpan int + // more options to come + } + // allocator of Span objects + spanAllocator SpanAllocator + + injectors map[interface{}]Injector + extractors map[interface{}]Extractor + + observer compositeObserver + + tags []Tag + process Process + + baggageRestrictionManager baggage.RestrictionManager + baggageSetter *baggageSetter + + debugThrottler throttler.Throttler +} + +// NewTracer creates Tracer implementation that reports tracing to Jaeger. +// The returned io.Closer can be used in shutdown hooks to ensure that the internal +// queue of the Reporter is drained and all buffered spans are submitted to collectors. +// TODO (breaking change) return *Tracer only, without closer. +func NewTracer( + serviceName string, + sampler Sampler, + reporter Reporter, + options ...TracerOption, +) (opentracing.Tracer, io.Closer) { + t := &Tracer{ + serviceName: serviceName, + sampler: samplerV1toV2(sampler), + reporter: reporter, + injectors: make(map[interface{}]Injector), + extractors: make(map[interface{}]Extractor), + metrics: *NewNullMetrics(), + spanAllocator: simpleSpanAllocator{}, + } + + for _, option := range options { + option(t) + } + + // register default injectors/extractors unless they are already provided via options + textPropagator := NewTextMapPropagator(getDefaultHeadersConfig(), t.metrics) + t.addCodec(opentracing.TextMap, textPropagator, textPropagator) + + httpHeaderPropagator := NewHTTPHeaderPropagator(getDefaultHeadersConfig(), t.metrics) + t.addCodec(opentracing.HTTPHeaders, httpHeaderPropagator, httpHeaderPropagator) + + binaryPropagator := NewBinaryPropagator(t) + t.addCodec(opentracing.Binary, binaryPropagator, binaryPropagator) + + // TODO remove after TChannel supports OpenTracing + interopPropagator := &jaegerTraceContextPropagator{tracer: t} + t.addCodec(SpanContextFormat, interopPropagator, interopPropagator) + + zipkinPropagator := &zipkinPropagator{tracer: t} + t.addCodec(ZipkinSpanFormat, zipkinPropagator, zipkinPropagator) + + if t.baggageRestrictionManager != nil { + t.baggageSetter = newBaggageSetter(t.baggageRestrictionManager, &t.metrics) + } else { + t.baggageSetter = newBaggageSetter(baggage.NewDefaultRestrictionManager(0), &t.metrics) + } + if t.debugThrottler == nil { + t.debugThrottler = throttler.DefaultThrottler{} + } + + if t.randomNumber == nil { + seedGenerator := utils.NewRand(time.Now().UnixNano()) + pool := sync.Pool{ + New: func() interface{} { + return rand.NewSource(seedGenerator.Int63()) + }, + } + + t.randomNumber = func() uint64 { + generator := pool.Get().(rand.Source) + number := uint64(generator.Int63()) + pool.Put(generator) + return number + } + } + if t.timeNow == nil { + t.timeNow = time.Now + } + if t.logger == nil { + t.logger = log.NullLogger + } + // Set tracer-level tags + t.tags = append(t.tags, Tag{key: JaegerClientVersionTagKey, value: JaegerClientVersion}) + if hostname, err := os.Hostname(); err == nil { + t.tags = append(t.tags, Tag{key: TracerHostnameTagKey, value: hostname}) + } + if ipval, ok := t.getTag(TracerIPTagKey); ok { + ipv4, err := utils.ParseIPToUint32(ipval.(string)) + if err != nil { + t.hostIPv4 = 0 + t.logger.Error("Unable to convert the externally provided ip to uint32: " + err.Error()) + } else { + t.hostIPv4 = ipv4 + } + } else if ip, err := utils.HostIP(); err == nil { + t.tags = append(t.tags, Tag{key: TracerIPTagKey, value: ip.String()}) + t.hostIPv4 = utils.PackIPAsUint32(ip) + } else { + t.logger.Error("Unable to determine this host's IP address: " + err.Error()) + } + + if t.options.gen128Bit { + if t.options.highTraceIDGenerator == nil { + t.options.highTraceIDGenerator = t.randomNumber + } + } else if t.options.highTraceIDGenerator != nil { + t.logger.Error("Overriding high trace ID generator but not generating " + + "128 bit trace IDs, consider enabling the \"Gen128Bit\" option") + } + if t.options.maxTagValueLength == 0 { + t.options.maxTagValueLength = DefaultMaxTagValueLength + } + t.process = Process{ + Service: serviceName, + UUID: strconv.FormatUint(t.randomNumber(), 16), + Tags: t.tags, + } + if throttler, ok := t.debugThrottler.(ProcessSetter); ok { + throttler.SetProcess(t.process) + } + + return t, t +} + +// addCodec adds registers injector and extractor for given propagation format if not already defined. +func (t *Tracer) addCodec(format interface{}, injector Injector, extractor Extractor) { + if _, ok := t.injectors[format]; !ok { + t.injectors[format] = injector + } + if _, ok := t.extractors[format]; !ok { + t.extractors[format] = extractor + } +} + +// StartSpan implements StartSpan() method of opentracing.Tracer. +func (t *Tracer) StartSpan( + operationName string, + options ...opentracing.StartSpanOption, +) opentracing.Span { + sso := opentracing.StartSpanOptions{} + for _, o := range options { + o.Apply(&sso) + } + return t.startSpanWithOptions(operationName, sso) +} + +func (t *Tracer) startSpanWithOptions( + operationName string, + options opentracing.StartSpanOptions, +) opentracing.Span { + if options.StartTime.IsZero() { + options.StartTime = t.timeNow() + } + + // Predicate whether the given span context is an empty reference + // or may be used as parent / debug ID / baggage items source + isEmptyReference := func(ctx SpanContext) bool { + return !ctx.IsValid() && !ctx.isDebugIDContainerOnly() && len(ctx.baggage) == 0 + } + + var references []Reference + var parent SpanContext + var hasParent bool // need this because `parent` is a value, not reference + var ctx SpanContext + var isSelfRef bool + for _, ref := range options.References { + ctxRef, ok := ref.ReferencedContext.(SpanContext) + if !ok { + t.logger.Error(fmt.Sprintf( + "Reference contains invalid type of SpanReference: %s", + reflect.ValueOf(ref.ReferencedContext))) + continue + } + if isEmptyReference(ctxRef) { + continue + } + + if ref.Type == selfRefType { + isSelfRef = true + ctx = ctxRef + continue + } + + if ctxRef.IsValid() { + // we don't want empty context that contains only debug-id or baggage + references = append(references, Reference{Type: ref.Type, Context: ctxRef}) + } + + if !hasParent { + parent = ctxRef + hasParent = ref.Type == opentracing.ChildOfRef + } + } + if !hasParent && !isEmptyReference(parent) { + // If ChildOfRef wasn't found but a FollowFromRef exists, use the context from + // the FollowFromRef as the parent + hasParent = true + } + + rpcServer := false + if v, ok := options.Tags[ext.SpanKindRPCServer.Key]; ok { + rpcServer = (v == ext.SpanKindRPCServerEnum || v == string(ext.SpanKindRPCServerEnum)) + } + + var internalTags []Tag + newTrace := false + if !isSelfRef { + if !hasParent || !parent.IsValid() { + newTrace = true + ctx.traceID.Low = t.randomID() + if t.options.gen128Bit { + ctx.traceID.High = t.options.highTraceIDGenerator() + } + ctx.spanID = SpanID(ctx.traceID.Low) + ctx.parentID = 0 + ctx.samplingState = &samplingState{ + localRootSpan: ctx.spanID, + } + if hasParent && parent.isDebugIDContainerOnly() && t.isDebugAllowed(operationName) { + ctx.samplingState.setDebugAndSampled() + internalTags = append(internalTags, Tag{key: JaegerDebugHeader, value: parent.debugID}) + } + } else { + ctx.traceID = parent.traceID + if rpcServer && t.options.zipkinSharedRPCSpan { + // Support Zipkin's one-span-per-RPC model + ctx.spanID = parent.spanID + ctx.parentID = parent.parentID + } else { + ctx.spanID = SpanID(t.randomID()) + ctx.parentID = parent.spanID + } + ctx.samplingState = parent.samplingState + if parent.remote { + ctx.samplingState.setFinal() + ctx.samplingState.localRootSpan = ctx.spanID + } + } + if hasParent { + // copy baggage items + if l := len(parent.baggage); l > 0 { + ctx.baggage = make(map[string]string, len(parent.baggage)) + for k, v := range parent.baggage { + ctx.baggage[k] = v + } + } + } + } + + sp := t.newSpan() + sp.context = ctx + sp.tracer = t + sp.operationName = operationName + sp.startTime = options.StartTime + sp.duration = 0 + sp.references = references + sp.firstInProcess = rpcServer || sp.context.parentID == 0 + + if !sp.isSamplingFinalized() { + decision := t.sampler.OnCreateSpan(sp) + sp.applySamplingDecision(decision, false) + } + sp.observer = t.observer.OnStartSpan(sp, operationName, options) + + if tagsTotalLength := len(options.Tags) + len(internalTags); tagsTotalLength > 0 { + if sp.tags == nil || cap(sp.tags) < tagsTotalLength { + sp.tags = make([]Tag, 0, tagsTotalLength) + } + sp.tags = append(sp.tags, internalTags...) + for k, v := range options.Tags { + sp.setTagInternal(k, v, false) + } + } + t.emitNewSpanMetrics(sp, newTrace) + return sp +} + +// Inject implements Inject() method of opentracing.Tracer +func (t *Tracer) Inject(ctx opentracing.SpanContext, format interface{}, carrier interface{}) error { + c, ok := ctx.(SpanContext) + if !ok { + return opentracing.ErrInvalidSpanContext + } + if injector, ok := t.injectors[format]; ok { + return injector.Inject(c, carrier) + } + return opentracing.ErrUnsupportedFormat +} + +// Extract implements Extract() method of opentracing.Tracer +func (t *Tracer) Extract( + format interface{}, + carrier interface{}, +) (opentracing.SpanContext, error) { + if extractor, ok := t.extractors[format]; ok { + spanCtx, err := extractor.Extract(carrier) + if err != nil { + return nil, err // ensure returned spanCtx is nil + } + spanCtx.remote = true + return spanCtx, nil + } + return nil, opentracing.ErrUnsupportedFormat +} + +// Close releases all resources used by the Tracer and flushes any remaining buffered spans. +func (t *Tracer) Close() error { + t.logger.Debugf("closing tracer") + t.reporter.Close() + t.sampler.Close() + if mgr, ok := t.baggageRestrictionManager.(io.Closer); ok { + _ = mgr.Close() + } + if throttler, ok := t.debugThrottler.(io.Closer); ok { + _ = throttler.Close() + } + return nil +} + +// Tags returns a slice of tracer-level tags. +func (t *Tracer) Tags() []opentracing.Tag { + tags := make([]opentracing.Tag, len(t.tags)) + for i, tag := range t.tags { + tags[i] = opentracing.Tag{Key: tag.key, Value: tag.value} + } + return tags +} + +// getTag returns the value of specific tag, if not exists, return nil. +// TODO only used by tests, move there. +func (t *Tracer) getTag(key string) (interface{}, bool) { + for _, tag := range t.tags { + if tag.key == key { + return tag.value, true + } + } + return nil, false +} + +// newSpan returns an instance of a clean Span object. +// If options.PoolSpans is true, the spans are retrieved from an object pool. +func (t *Tracer) newSpan() *Span { + return t.spanAllocator.Get() +} + +// emitNewSpanMetrics generates metrics on the number of started spans and traces. +// newTrace param: we cannot simply check for parentID==0 because in Zipkin model the +// server-side RPC span has the exact same trace/span/parent IDs as the +// calling client-side span, but obviously the server side span is +// no longer a root span of the trace. +func (t *Tracer) emitNewSpanMetrics(sp *Span, newTrace bool) { + if !sp.isSamplingFinalized() { + t.metrics.SpansStartedDelayedSampling.Inc(1) + if newTrace { + t.metrics.TracesStartedDelayedSampling.Inc(1) + } + // joining a trace is not possible, because sampling decision inherited from upstream is final + } else if sp.context.IsSampled() { + t.metrics.SpansStartedSampled.Inc(1) + if newTrace { + t.metrics.TracesStartedSampled.Inc(1) + } else if sp.firstInProcess { + t.metrics.TracesJoinedSampled.Inc(1) + } + } else { + t.metrics.SpansStartedNotSampled.Inc(1) + if newTrace { + t.metrics.TracesStartedNotSampled.Inc(1) + } else if sp.firstInProcess { + t.metrics.TracesJoinedNotSampled.Inc(1) + } + } +} + +func (t *Tracer) reportSpan(sp *Span) { + if !sp.isSamplingFinalized() { + t.metrics.SpansFinishedDelayedSampling.Inc(1) + } else if sp.context.IsSampled() { + t.metrics.SpansFinishedSampled.Inc(1) + } else { + t.metrics.SpansFinishedNotSampled.Inc(1) + } + + // Note: if the reporter is processing Span asynchronously then it needs to Retain() the span, + // and then Release() it when no longer needed. + // Otherwise, the span may be reused for another trace and its data may be overwritten. + if sp.context.IsSampled() { + t.reporter.Report(sp) + } + + sp.Release() +} + +// randomID generates a random trace/span ID, using tracer.random() generator. +// It never returns 0. +func (t *Tracer) randomID() uint64 { + val := t.randomNumber() + for val == 0 { + val = t.randomNumber() + } + return val +} + +// (NB) span must hold the lock before making this call +func (t *Tracer) setBaggage(sp *Span, key, value string) { + t.baggageSetter.setBaggage(sp, key, value) +} + +// (NB) span must hold the lock before making this call +func (t *Tracer) isDebugAllowed(operation string) bool { + return t.debugThrottler.IsAllowed(operation) +} + +// Sampler returns the sampler given to the tracer at creation. +func (t *Tracer) Sampler() SamplerV2 { + return t.sampler +} + +// SelfRef creates an opentracing compliant SpanReference from a jaeger +// SpanContext. This is a factory function in order to encapsulate jaeger specific +// types. +func SelfRef(ctx SpanContext) opentracing.SpanReference { + return opentracing.SpanReference{ + Type: selfRefType, + ReferencedContext: ctx, + } +} diff --git a/vendor/github.com/uber/jaeger-client-go/tracer_options.go b/vendor/github.com/uber/jaeger-client-go/tracer_options.go new file mode 100644 index 00000000..f0734b77 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/tracer_options.go @@ -0,0 +1,182 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "time" + + "github.com/opentracing/opentracing-go" + + "github.com/uber/jaeger-client-go/internal/baggage" + "github.com/uber/jaeger-client-go/internal/throttler" + "github.com/uber/jaeger-client-go/log" +) + +// TracerOption is a function that sets some option on the tracer +type TracerOption func(tracer *Tracer) + +// TracerOptions is a factory for all available TracerOption's +var TracerOptions tracerOptions + +type tracerOptions struct{} + +// Metrics creates a TracerOption that initializes Metrics on the tracer, +// which is used to emit statistics. +func (tracerOptions) Metrics(m *Metrics) TracerOption { + return func(tracer *Tracer) { + tracer.metrics = *m + } +} + +// Logger creates a TracerOption that gives the tracer a Logger. +func (tracerOptions) Logger(logger Logger) TracerOption { + return func(tracer *Tracer) { + tracer.logger = log.DebugLogAdapter(logger) + } +} + +func (tracerOptions) CustomHeaderKeys(headerKeys *HeadersConfig) TracerOption { + return func(tracer *Tracer) { + if headerKeys == nil { + return + } + textPropagator := NewTextMapPropagator(headerKeys.ApplyDefaults(), tracer.metrics) + tracer.addCodec(opentracing.TextMap, textPropagator, textPropagator) + + httpHeaderPropagator := NewHTTPHeaderPropagator(headerKeys.ApplyDefaults(), tracer.metrics) + tracer.addCodec(opentracing.HTTPHeaders, httpHeaderPropagator, httpHeaderPropagator) + } +} + +// TimeNow creates a TracerOption that gives the tracer a function +// used to generate timestamps for spans. +func (tracerOptions) TimeNow(timeNow func() time.Time) TracerOption { + return func(tracer *Tracer) { + tracer.timeNow = timeNow + } +} + +// RandomNumber creates a TracerOption that gives the tracer +// a thread-safe random number generator function for generating trace IDs. +func (tracerOptions) RandomNumber(randomNumber func() uint64) TracerOption { + return func(tracer *Tracer) { + tracer.randomNumber = randomNumber + } +} + +// PoolSpans creates a TracerOption that tells the tracer whether it should use +// an object pool to minimize span allocations. +// This should be used with care, only if the service is not running any async tasks +// that can access parent spans after those spans have been finished. +func (tracerOptions) PoolSpans(poolSpans bool) TracerOption { + return func(tracer *Tracer) { + if poolSpans { + tracer.spanAllocator = newSyncPollSpanAllocator() + } else { + tracer.spanAllocator = simpleSpanAllocator{} + } + } +} + +// Deprecated: HostIPv4 creates a TracerOption that identifies the current service/process. +// If not set, the factory method will obtain the current IP address. +// The TracerOption is deprecated; the tracer will attempt to automatically detect the IP. +func (tracerOptions) HostIPv4(hostIPv4 uint32) TracerOption { + return func(tracer *Tracer) { + tracer.hostIPv4 = hostIPv4 + } +} + +func (tracerOptions) Injector(format interface{}, injector Injector) TracerOption { + return func(tracer *Tracer) { + tracer.injectors[format] = injector + } +} + +func (tracerOptions) Extractor(format interface{}, extractor Extractor) TracerOption { + return func(tracer *Tracer) { + tracer.extractors[format] = extractor + } +} + +func (t tracerOptions) Observer(observer Observer) TracerOption { + return t.ContribObserver(&oldObserver{obs: observer}) +} + +func (tracerOptions) ContribObserver(observer ContribObserver) TracerOption { + return func(tracer *Tracer) { + tracer.observer.append(observer) + } +} + +func (tracerOptions) Gen128Bit(gen128Bit bool) TracerOption { + return func(tracer *Tracer) { + tracer.options.gen128Bit = gen128Bit + } +} + +func (tracerOptions) NoDebugFlagOnForcedSampling(noDebugFlagOnForcedSampling bool) TracerOption { + return func(tracer *Tracer) { + tracer.options.noDebugFlagOnForcedSampling = noDebugFlagOnForcedSampling + } +} + +func (tracerOptions) HighTraceIDGenerator(highTraceIDGenerator func() uint64) TracerOption { + return func(tracer *Tracer) { + tracer.options.highTraceIDGenerator = highTraceIDGenerator + } +} + +func (tracerOptions) MaxTagValueLength(maxTagValueLength int) TracerOption { + return func(tracer *Tracer) { + tracer.options.maxTagValueLength = maxTagValueLength + } +} + +// MaxLogsPerSpan limits the number of Logs in a span (if set to a nonzero +// value). If a span has more logs than this value, logs are dropped as +// necessary (and replaced with a log describing how many were dropped). +// +// About half of the MaxLogsPerSpan logs kept are the oldest logs, and about +// half are the newest logs. +func (tracerOptions) MaxLogsPerSpan(maxLogsPerSpan int) TracerOption { + return func(tracer *Tracer) { + tracer.options.maxLogsPerSpan = maxLogsPerSpan + } +} + +func (tracerOptions) ZipkinSharedRPCSpan(zipkinSharedRPCSpan bool) TracerOption { + return func(tracer *Tracer) { + tracer.options.zipkinSharedRPCSpan = zipkinSharedRPCSpan + } +} + +func (tracerOptions) Tag(key string, value interface{}) TracerOption { + return func(tracer *Tracer) { + tracer.tags = append(tracer.tags, Tag{key: key, value: value}) + } +} + +func (tracerOptions) BaggageRestrictionManager(mgr baggage.RestrictionManager) TracerOption { + return func(tracer *Tracer) { + tracer.baggageRestrictionManager = mgr + } +} + +func (tracerOptions) DebugThrottler(throttler throttler.Throttler) TracerOption { + return func(tracer *Tracer) { + tracer.debugThrottler = throttler + } +} diff --git a/vendor/github.com/uber/jaeger-client-go/transport.go b/vendor/github.com/uber/jaeger-client-go/transport.go new file mode 100644 index 00000000..c5f5b195 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/transport.go @@ -0,0 +1,38 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "io" +) + +// Transport abstracts the method of sending spans out of process. +// Implementations are NOT required to be thread-safe; the RemoteReporter +// is expected to only call methods on the Transport from the same go-routine. +type Transport interface { + // Append converts the span to the wire representation and adds it + // to sender's internal buffer. If the buffer exceeds its designated + // size, the transport should call Flush() and return the number of spans + // flushed, otherwise return 0. If error is returned, the returned number + // of spans is treated as failed span, and reported to metrics accordingly. + Append(span *Span) (int, error) + + // Flush submits the internal buffer to the remote server. It returns the + // number of spans flushed. If error is returned, the returned number of + // spans is treated as failed span, and reported to metrics accordingly. + Flush() (int, error) + + io.Closer +} diff --git a/vendor/github.com/uber/jaeger-client-go/transport/doc.go b/vendor/github.com/uber/jaeger-client-go/transport/doc.go new file mode 100644 index 00000000..6b961fb6 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/transport/doc.go @@ -0,0 +1,23 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package transport defines various transports that can be used with +// RemoteReporter to send spans out of process. Transport is responsible +// for serializing the spans into a specific format suitable for sending +// to the tracing backend. Examples may include Thrift over UDP, Thrift +// or JSON over HTTP, Thrift over Kafka, etc. +// +// Implementations are NOT required to be thread-safe; the RemoteReporter +// is expected to only call methods on the Transport from the same go-routine. +package transport diff --git a/vendor/github.com/uber/jaeger-client-go/transport/http.go b/vendor/github.com/uber/jaeger-client-go/transport/http.go new file mode 100644 index 00000000..bb7eb00c --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/transport/http.go @@ -0,0 +1,174 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package transport + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "net/http" + "time" + + "github.com/uber/jaeger-client-go/thrift" + + "github.com/uber/jaeger-client-go" + j "github.com/uber/jaeger-client-go/thrift-gen/jaeger" +) + +// Default timeout for http request in seconds +const defaultHTTPTimeout = time.Second * 5 + +// HTTPTransport implements Transport by forwarding spans to a http server. +type HTTPTransport struct { + url string + client *http.Client + batchSize int + spans []*j.Span + process *j.Process + httpCredentials *HTTPBasicAuthCredentials + headers map[string]string +} + +// HTTPBasicAuthCredentials stores credentials for HTTP basic auth. +type HTTPBasicAuthCredentials struct { + username string + password string +} + +// HTTPOption sets a parameter for the HttpCollector +type HTTPOption func(c *HTTPTransport) + +// HTTPTimeout sets maximum timeout for http request. +func HTTPTimeout(duration time.Duration) HTTPOption { + return func(c *HTTPTransport) { c.client.Timeout = duration } +} + +// HTTPBatchSize sets the maximum batch size, after which a collect will be +// triggered. The default batch size is 100 spans. +func HTTPBatchSize(n int) HTTPOption { + return func(c *HTTPTransport) { c.batchSize = n } +} + +// HTTPBasicAuth sets the credentials required to perform HTTP basic auth +func HTTPBasicAuth(username string, password string) HTTPOption { + return func(c *HTTPTransport) { + c.httpCredentials = &HTTPBasicAuthCredentials{username: username, password: password} + } +} + +// HTTPRoundTripper configures the underlying Transport on the *http.Client +// that is used +func HTTPRoundTripper(transport http.RoundTripper) HTTPOption { + return func(c *HTTPTransport) { + c.client.Transport = transport + } +} + +// HTTPHeaders defines the HTTP headers that will be attached to the jaeger client's HTTP request +func HTTPHeaders(headers map[string]string) HTTPOption { + return func(c *HTTPTransport) { + c.headers = headers + } +} + +// NewHTTPTransport returns a new HTTP-backend transport. url should be an http +// url of the collector to handle POST request, typically something like: +// http://hostname:14268/api/traces?format=jaeger.thrift +func NewHTTPTransport(url string, options ...HTTPOption) *HTTPTransport { + c := &HTTPTransport{ + url: url, + client: &http.Client{Timeout: defaultHTTPTimeout}, + batchSize: 100, + spans: []*j.Span{}, + } + + for _, option := range options { + option(c) + } + return c +} + +// Append implements Transport. +func (c *HTTPTransport) Append(span *jaeger.Span) (int, error) { + if c.process == nil { + c.process = jaeger.BuildJaegerProcessThrift(span) + } + jSpan := jaeger.BuildJaegerThrift(span) + c.spans = append(c.spans, jSpan) + if len(c.spans) >= c.batchSize { + return c.Flush() + } + return 0, nil +} + +// Flush implements Transport. +func (c *HTTPTransport) Flush() (int, error) { + count := len(c.spans) + if count == 0 { + return 0, nil + } + err := c.send(c.spans) + c.spans = c.spans[:0] + return count, err +} + +// Close implements Transport. +func (c *HTTPTransport) Close() error { + return nil +} + +func (c *HTTPTransport) send(spans []*j.Span) error { + batch := &j.Batch{ + Spans: spans, + Process: c.process, + } + body, err := serializeThrift(batch) + if err != nil { + return err + } + req, err := http.NewRequest("POST", c.url, body) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/x-thrift") + for k, v := range c.headers { + req.Header.Set(k, v) + } + + if c.httpCredentials != nil { + req.SetBasicAuth(c.httpCredentials.username, c.httpCredentials.password) + } + + resp, err := c.client.Do(req) + if err != nil { + return err + } + io.Copy(ioutil.Discard, resp.Body) + resp.Body.Close() + if resp.StatusCode >= http.StatusBadRequest { + return fmt.Errorf("error from collector: %d", resp.StatusCode) + } + return nil +} + +func serializeThrift(obj thrift.TStruct) (*bytes.Buffer, error) { + t := thrift.NewTMemoryBuffer() + p := thrift.NewTBinaryProtocolTransport(t) + if err := obj.Write(p); err != nil { + return nil, err + } + return t.Buffer, nil +} diff --git a/vendor/github.com/uber/jaeger-client-go/transport_udp.go b/vendor/github.com/uber/jaeger-client-go/transport_udp.go new file mode 100644 index 00000000..5734819a --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/transport_udp.go @@ -0,0 +1,193 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "errors" + "fmt" + + "github.com/uber/jaeger-client-go/internal/reporterstats" + "github.com/uber/jaeger-client-go/log" + "github.com/uber/jaeger-client-go/thrift" + j "github.com/uber/jaeger-client-go/thrift-gen/jaeger" + "github.com/uber/jaeger-client-go/utils" +) + +// Empirically obtained constant for how many bytes in the message are used for envelope. +// The total datagram size is: +// sizeof(Span) * numSpans + processByteSize + emitBatchOverhead <= maxPacketSize +// +// Note that due to the use of Compact Thrift protocol, overhead grows with the number of spans +// in the batch, because the length of the list is encoded as varint32, as well as SeqId. +// +// There is a unit test `TestEmitBatchOverhead` that validates this number, it fails at <68. +const emitBatchOverhead = 70 + +var errSpanTooLarge = errors.New("span is too large") + +type udpSender struct { + client *utils.AgentClientUDP + maxPacketSize int // max size of datagram in bytes + maxSpanBytes int // max number of bytes to record spans (excluding envelope) in the datagram + byteBufferSize int // current number of span bytes accumulated in the buffer + spanBuffer []*j.Span // spans buffered before a flush + thriftBuffer *thrift.TMemoryBuffer // buffer used to calculate byte size of a span + thriftProtocol thrift.TProtocol + process *j.Process + processByteSize int + + // reporterStats provides access to stats that are only known to Reporter + reporterStats reporterstats.ReporterStats + + // The following counters are always non-negative, but we need to send them in signed i64 Thrift fields, + // so we keep them as signed. At 10k QPS, overflow happens in about 300 million years. + batchSeqNo int64 + tooLargeDroppedSpans int64 + failedToEmitSpans int64 +} + +// UDPTransportParams allows specifying options for initializing a UDPTransport. An instance of this struct should +// be passed to NewUDPTransportWithParams. +type UDPTransportParams struct { + utils.AgentClientUDPParams +} + +// NewUDPTransportWithParams creates a reporter that submits spans to jaeger-agent. +// TODO: (breaking change) move to transport/ package. +func NewUDPTransportWithParams(params UDPTransportParams) (Transport, error) { + if len(params.HostPort) == 0 { + params.HostPort = fmt.Sprintf("%s:%d", DefaultUDPSpanServerHost, DefaultUDPSpanServerPort) + } + + if params.Logger == nil { + params.Logger = log.StdLogger + } + + if params.MaxPacketSize == 0 { + params.MaxPacketSize = utils.UDPPacketMaxLength + } + + protocolFactory := thrift.NewTCompactProtocolFactory() + + // Each span is first written to thriftBuffer to determine its size in bytes. + thriftBuffer := thrift.NewTMemoryBufferLen(params.MaxPacketSize) + thriftProtocol := protocolFactory.GetProtocol(thriftBuffer) + + client, err := utils.NewAgentClientUDPWithParams(params.AgentClientUDPParams) + if err != nil { + return nil, err + } + + return &udpSender{ + client: client, + maxSpanBytes: params.MaxPacketSize - emitBatchOverhead, + thriftBuffer: thriftBuffer, + thriftProtocol: thriftProtocol, + }, nil +} + +// NewUDPTransport creates a reporter that submits spans to jaeger-agent. +// TODO: (breaking change) move to transport/ package. +func NewUDPTransport(hostPort string, maxPacketSize int) (Transport, error) { + return NewUDPTransportWithParams(UDPTransportParams{ + AgentClientUDPParams: utils.AgentClientUDPParams{ + HostPort: hostPort, + MaxPacketSize: maxPacketSize, + }, + }) +} + +// SetReporterStats implements reporterstats.Receiver. +func (s *udpSender) SetReporterStats(rs reporterstats.ReporterStats) { + s.reporterStats = rs +} + +func (s *udpSender) calcSizeOfSerializedThrift(thriftStruct thrift.TStruct) int { + s.thriftBuffer.Reset() + _ = thriftStruct.Write(s.thriftProtocol) + return s.thriftBuffer.Len() +} + +func (s *udpSender) Append(span *Span) (int, error) { + if s.process == nil { + s.process = BuildJaegerProcessThrift(span) + s.processByteSize = s.calcSizeOfSerializedThrift(s.process) + s.byteBufferSize += s.processByteSize + } + jSpan := BuildJaegerThrift(span) + spanSize := s.calcSizeOfSerializedThrift(jSpan) + if spanSize > s.maxSpanBytes { + s.tooLargeDroppedSpans++ + return 1, errSpanTooLarge + } + + s.byteBufferSize += spanSize + if s.byteBufferSize <= s.maxSpanBytes { + s.spanBuffer = append(s.spanBuffer, jSpan) + if s.byteBufferSize < s.maxSpanBytes { + return 0, nil + } + return s.Flush() + } + // the latest span did not fit in the buffer + n, err := s.Flush() + s.spanBuffer = append(s.spanBuffer, jSpan) + s.byteBufferSize = spanSize + s.processByteSize + return n, err +} + +func (s *udpSender) Flush() (int, error) { + n := len(s.spanBuffer) + if n == 0 { + return 0, nil + } + s.batchSeqNo++ + batchSeqNo := int64(s.batchSeqNo) + err := s.client.EmitBatch(&j.Batch{ + Process: s.process, + Spans: s.spanBuffer, + SeqNo: &batchSeqNo, + Stats: s.makeStats(), + }) + s.resetBuffers() + if err != nil { + s.failedToEmitSpans += int64(n) + } + return n, err +} + +func (s *udpSender) Close() error { + return s.client.Close() +} + +func (s *udpSender) resetBuffers() { + for i := range s.spanBuffer { + s.spanBuffer[i] = nil + } + s.spanBuffer = s.spanBuffer[:0] + s.byteBufferSize = s.processByteSize +} + +func (s *udpSender) makeStats() *j.ClientStats { + var dropped int64 + if s.reporterStats != nil { + dropped = s.reporterStats.SpansDroppedFromQueue() + } + return &j.ClientStats{ + FullQueueDroppedSpans: dropped, + TooLargeDroppedSpans: s.tooLargeDroppedSpans, + FailedToEmitSpans: s.failedToEmitSpans, + } +} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/http_json.go b/vendor/github.com/uber/jaeger-client-go/utils/http_json.go new file mode 100644 index 00000000..237211f8 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/utils/http_json.go @@ -0,0 +1,54 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net/http" +) + +// GetJSON makes an HTTP call to the specified URL and parses the returned JSON into `out`. +func GetJSON(url string, out interface{}) error { + resp, err := http.Get(url) + if err != nil { + return err + } + return ReadJSON(resp, out) +} + +// ReadJSON reads JSON from http.Response and parses it into `out` +func ReadJSON(resp *http.Response, out interface{}) error { + defer resp.Body.Close() + + if resp.StatusCode >= 400 { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return fmt.Errorf("StatusCode: %d, Body: %s", resp.StatusCode, body) + } + + if out == nil { + io.Copy(ioutil.Discard, resp.Body) + return nil + } + + decoder := json.NewDecoder(resp.Body) + return decoder.Decode(out) +} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/localip.go b/vendor/github.com/uber/jaeger-client-go/utils/localip.go new file mode 100644 index 00000000..b51af771 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/utils/localip.go @@ -0,0 +1,84 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "errors" + "net" +) + +// This code is borrowed from https://github.com/uber/tchannel-go/blob/dev/localip.go + +// scoreAddr scores how likely the given addr is to be a remote address and returns the +// IP to use when listening. Any address which receives a negative score should not be used. +// Scores are calculated as: +// -1 for any unknown IP addresses. +// +300 for IPv4 addresses +// +100 for non-local addresses, extra +100 for "up" interaces. +func scoreAddr(iface net.Interface, addr net.Addr) (int, net.IP) { + var ip net.IP + if netAddr, ok := addr.(*net.IPNet); ok { + ip = netAddr.IP + } else if netIP, ok := addr.(*net.IPAddr); ok { + ip = netIP.IP + } else { + return -1, nil + } + + var score int + if ip.To4() != nil { + score += 300 + } + if iface.Flags&net.FlagLoopback == 0 && !ip.IsLoopback() { + score += 100 + if iface.Flags&net.FlagUp != 0 { + score += 100 + } + } + return score, ip +} + +// HostIP tries to find an IP that can be used by other machines to reach this machine. +func HostIP() (net.IP, error) { + interfaces, err := net.Interfaces() + if err != nil { + return nil, err + } + + bestScore := -1 + var bestIP net.IP + // Select the highest scoring IP as the best IP. + for _, iface := range interfaces { + addrs, err := iface.Addrs() + if err != nil { + // Skip this interface if there is an error. + continue + } + + for _, addr := range addrs { + score, ip := scoreAddr(iface, addr) + if score > bestScore { + bestScore = score + bestIP = ip + } + } + } + + if bestScore == -1 { + return nil, errors.New("no addresses to listen on") + } + + return bestIP, nil +} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/rand.go b/vendor/github.com/uber/jaeger-client-go/utils/rand.go new file mode 100644 index 00000000..9875f7f5 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/utils/rand.go @@ -0,0 +1,46 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "math/rand" + "sync" +) + +// lockedSource allows a random number generator to be used by multiple goroutines concurrently. +// The code is very similar to math/rand.lockedSource, which is unfortunately not exposed. +type lockedSource struct { + mut sync.Mutex + src rand.Source +} + +// NewRand returns a rand.Rand that is threadsafe. +func NewRand(seed int64) *rand.Rand { + return rand.New(&lockedSource{src: rand.NewSource(seed)}) +} + +func (r *lockedSource) Int63() (n int64) { + r.mut.Lock() + n = r.src.Int63() + r.mut.Unlock() + return +} + +// Seed implements Seed() of Source +func (r *lockedSource) Seed(seed int64) { + r.mut.Lock() + r.src.Seed(seed) + r.mut.Unlock() +} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go b/vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go new file mode 100644 index 00000000..bf2f1316 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go @@ -0,0 +1,112 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "sync" + "time" +) + +// RateLimiter is a filter used to check if a message that is worth itemCost units is within the rate limits. +// +// TODO (breaking change) remove this interface in favor of public struct below +// +// Deprecated, use ReconfigurableRateLimiter. +type RateLimiter interface { + CheckCredit(itemCost float64) bool +} + +// ReconfigurableRateLimiter is a rate limiter based on leaky bucket algorithm, formulated in terms of a +// credits balance that is replenished every time CheckCredit() method is called (tick) by the amount proportional +// to the time elapsed since the last tick, up to max of creditsPerSecond. A call to CheckCredit() takes a cost +// of an item we want to pay with the balance. If the balance exceeds the cost of the item, the item is "purchased" +// and the balance reduced, indicated by returned value of true. Otherwise the balance is unchanged and return false. +// +// This can be used to limit a rate of messages emitted by a service by instantiating the Rate Limiter with the +// max number of messages a service is allowed to emit per second, and calling CheckCredit(1.0) for each message +// to determine if the message is within the rate limit. +// +// It can also be used to limit the rate of traffic in bytes, by setting creditsPerSecond to desired throughput +// as bytes/second, and calling CheckCredit() with the actual message size. +// +// TODO (breaking change) rename to RateLimiter once the interface is removed +type ReconfigurableRateLimiter struct { + lock sync.Mutex + + creditsPerSecond float64 + balance float64 + maxBalance float64 + lastTick time.Time + + timeNow func() time.Time +} + +// NewRateLimiter creates a new ReconfigurableRateLimiter. +func NewRateLimiter(creditsPerSecond, maxBalance float64) *ReconfigurableRateLimiter { + return &ReconfigurableRateLimiter{ + creditsPerSecond: creditsPerSecond, + balance: maxBalance, + maxBalance: maxBalance, + lastTick: time.Now(), + timeNow: time.Now, + } +} + +// CheckCredit tries to reduce the current balance by itemCost provided that the current balance +// is not lest than itemCost. +func (rl *ReconfigurableRateLimiter) CheckCredit(itemCost float64) bool { + rl.lock.Lock() + defer rl.lock.Unlock() + + // if we have enough credits to pay for current item, then reduce balance and allow + if rl.balance >= itemCost { + rl.balance -= itemCost + return true + } + // otherwise check if balance can be increased due to time elapsed, and try again + rl.updateBalance() + if rl.balance >= itemCost { + rl.balance -= itemCost + return true + } + return false +} + +// updateBalance recalculates current balance based on time elapsed. Must be called while holding a lock. +func (rl *ReconfigurableRateLimiter) updateBalance() { + // calculate how much time passed since the last tick, and update current tick + currentTime := rl.timeNow() + elapsedTime := currentTime.Sub(rl.lastTick) + rl.lastTick = currentTime + // calculate how much credit have we accumulated since the last tick + rl.balance += elapsedTime.Seconds() * rl.creditsPerSecond + if rl.balance > rl.maxBalance { + rl.balance = rl.maxBalance + } +} + +// Update changes the main parameters of the rate limiter in-place, while retaining +// the current accumulated balance (pro-rated to the new maxBalance value). Using this method +// instead of creating a new rate limiter helps to avoid thundering herd when sampling +// strategies are updated. +func (rl *ReconfigurableRateLimiter) Update(creditsPerSecond, maxBalance float64) { + rl.lock.Lock() + defer rl.lock.Unlock() + + rl.updateBalance() // get up to date balance + rl.balance = rl.balance * maxBalance / rl.maxBalance + rl.creditsPerSecond = creditsPerSecond + rl.maxBalance = maxBalance +} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/reconnecting_udp_conn.go b/vendor/github.com/uber/jaeger-client-go/utils/reconnecting_udp_conn.go new file mode 100644 index 00000000..0dffc7fa --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/utils/reconnecting_udp_conn.go @@ -0,0 +1,189 @@ +// Copyright (c) 2020 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "fmt" + "net" + "sync" + "sync/atomic" + "time" + + "github.com/uber/jaeger-client-go/log" +) + +// reconnectingUDPConn is an implementation of udpConn that resolves hostPort every resolveTimeout, if the resolved address is +// different than the current conn then the new address is dialed and the conn is swapped. +type reconnectingUDPConn struct { + hostPort string + resolveFunc resolveFunc + dialFunc dialFunc + logger log.Logger + bufferBytes int64 + + connMtx sync.RWMutex + conn *net.UDPConn + destAddr *net.UDPAddr + closeChan chan struct{} +} + +type resolveFunc func(network string, hostPort string) (*net.UDPAddr, error) +type dialFunc func(network string, laddr, raddr *net.UDPAddr) (*net.UDPConn, error) + +// newReconnectingUDPConn returns a new udpConn that resolves hostPort every resolveTimeout, if the resolved address is +// different than the current conn then the new address is dialed and the conn is swapped. +func newReconnectingUDPConn(hostPort string, resolveTimeout time.Duration, resolveFunc resolveFunc, dialFunc dialFunc, logger log.Logger) (*reconnectingUDPConn, error) { + conn := &reconnectingUDPConn{ + hostPort: hostPort, + resolveFunc: resolveFunc, + dialFunc: dialFunc, + logger: logger, + closeChan: make(chan struct{}), + } + + if err := conn.attemptResolveAndDial(); err != nil { + logger.Error(fmt.Sprintf("failed resolving destination address on connection startup, with err: %q. retrying in %s", err.Error(), resolveTimeout)) + } + + go conn.reconnectLoop(resolveTimeout) + + return conn, nil +} + +func (c *reconnectingUDPConn) reconnectLoop(resolveTimeout time.Duration) { + ticker := time.NewTicker(resolveTimeout) + defer ticker.Stop() + + for { + select { + case <-c.closeChan: + return + case <-ticker.C: + if err := c.attemptResolveAndDial(); err != nil { + c.logger.Error(err.Error()) + } + } + } +} + +func (c *reconnectingUDPConn) attemptResolveAndDial() error { + newAddr, err := c.resolveFunc("udp", c.hostPort) + if err != nil { + return fmt.Errorf("failed to resolve new addr for host %q, with err: %w", c.hostPort, err) + } + + c.connMtx.RLock() + curAddr := c.destAddr + c.connMtx.RUnlock() + + // dont attempt dial if an addr was successfully dialed previously and, resolved addr is the same as current conn + if curAddr != nil && newAddr.String() == curAddr.String() { + return nil + } + + if err := c.attemptDialNewAddr(newAddr); err != nil { + return fmt.Errorf("failed to dial newly resolved addr '%s', with err: %w", newAddr, err) + } + + return nil +} + +func (c *reconnectingUDPConn) attemptDialNewAddr(newAddr *net.UDPAddr) error { + connUDP, err := c.dialFunc(newAddr.Network(), nil, newAddr) + if err != nil { + return err + } + + if bufferBytes := int(atomic.LoadInt64(&c.bufferBytes)); bufferBytes != 0 { + if err = connUDP.SetWriteBuffer(bufferBytes); err != nil { + return err + } + } + + c.connMtx.Lock() + c.destAddr = newAddr + // store prev to close later + prevConn := c.conn + c.conn = connUDP + c.connMtx.Unlock() + + if prevConn != nil { + return prevConn.Close() + } + + return nil +} + +// Write calls net.udpConn.Write, if it fails an attempt is made to connect to a new addr, if that succeeds the write is retried before returning +func (c *reconnectingUDPConn) Write(b []byte) (int, error) { + var bytesWritten int + var err error + + c.connMtx.RLock() + if c.conn == nil { + // if connection is not initialized indicate this with err in order to hook into retry logic + err = fmt.Errorf("UDP connection not yet initialized, an address has not been resolved") + } else { + bytesWritten, err = c.conn.Write(b) + } + c.connMtx.RUnlock() + + if err == nil { + return bytesWritten, nil + } + + // attempt to resolve and dial new address in case that's the problem, if resolve and dial succeeds, try write again + if reconnErr := c.attemptResolveAndDial(); reconnErr == nil { + c.connMtx.RLock() + defer c.connMtx.RUnlock() + return c.conn.Write(b) + } + + // return original error if reconn fails + return bytesWritten, err +} + +// Close stops the reconnectLoop, then closes the connection via net.udpConn 's implementation +func (c *reconnectingUDPConn) Close() error { + close(c.closeChan) + + // acquire rw lock before closing conn to ensure calls to Write drain + c.connMtx.Lock() + defer c.connMtx.Unlock() + + if c.conn != nil { + return c.conn.Close() + } + + return nil +} + +// SetWriteBuffer defers to the net.udpConn SetWriteBuffer implementation wrapped with a RLock. if no conn is currently held +// and SetWriteBuffer is called store bufferBytes to be set for new conns +func (c *reconnectingUDPConn) SetWriteBuffer(bytes int) error { + var err error + + c.connMtx.RLock() + if c.conn != nil { + err = c.conn.SetWriteBuffer(bytes) + } + c.connMtx.RUnlock() + + if err == nil { + atomic.StoreInt64(&c.bufferBytes, int64(bytes)) + } + + return err +} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/udp_client.go b/vendor/github.com/uber/jaeger-client-go/utils/udp_client.go new file mode 100644 index 00000000..2352643c --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/utils/udp_client.go @@ -0,0 +1,149 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "errors" + "fmt" + "io" + "net" + "time" + + "github.com/uber/jaeger-client-go/log" + "github.com/uber/jaeger-client-go/thrift" + + "github.com/uber/jaeger-client-go/thrift-gen/agent" + "github.com/uber/jaeger-client-go/thrift-gen/jaeger" + "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" +) + +// UDPPacketMaxLength is the max size of UDP packet we want to send, synced with jaeger-agent +const UDPPacketMaxLength = 65000 + +// AgentClientUDP is a UDP client to Jaeger agent that implements agent.Agent interface. +type AgentClientUDP struct { + agent.Agent + io.Closer + + connUDP udpConn + client *agent.AgentClient + maxPacketSize int // max size of datagram in bytes + thriftBuffer *thrift.TMemoryBuffer // buffer used to calculate byte size of a span +} + +type udpConn interface { + Write([]byte) (int, error) + SetWriteBuffer(int) error + Close() error +} + +// AgentClientUDPParams allows specifying options for initializing an AgentClientUDP. An instance of this struct should +// be passed to NewAgentClientUDPWithParams. +type AgentClientUDPParams struct { + HostPort string + MaxPacketSize int + Logger log.Logger + DisableAttemptReconnecting bool + AttemptReconnectInterval time.Duration +} + +// NewAgentClientUDPWithParams creates a client that sends spans to Jaeger Agent over UDP. +func NewAgentClientUDPWithParams(params AgentClientUDPParams) (*AgentClientUDP, error) { + // validate hostport + if _, _, err := net.SplitHostPort(params.HostPort); err != nil { + return nil, err + } + + if params.MaxPacketSize == 0 { + params.MaxPacketSize = UDPPacketMaxLength + } + + if params.Logger == nil { + params.Logger = log.StdLogger + } + + if !params.DisableAttemptReconnecting && params.AttemptReconnectInterval == 0 { + params.AttemptReconnectInterval = time.Second * 30 + } + + thriftBuffer := thrift.NewTMemoryBufferLen(params.MaxPacketSize) + protocolFactory := thrift.NewTCompactProtocolFactory() + client := agent.NewAgentClientFactory(thriftBuffer, protocolFactory) + + var connUDP udpConn + var err error + + if params.DisableAttemptReconnecting { + destAddr, err := net.ResolveUDPAddr("udp", params.HostPort) + if err != nil { + return nil, err + } + + connUDP, err = net.DialUDP(destAddr.Network(), nil, destAddr) + if err != nil { + return nil, err + } + } else { + // host is hostname, setup resolver loop in case host record changes during operation + connUDP, err = newReconnectingUDPConn(params.HostPort, params.AttemptReconnectInterval, net.ResolveUDPAddr, net.DialUDP, params.Logger) + if err != nil { + return nil, err + } + } + + if err := connUDP.SetWriteBuffer(params.MaxPacketSize); err != nil { + return nil, err + } + + return &AgentClientUDP{ + connUDP: connUDP, + client: client, + maxPacketSize: params.MaxPacketSize, + thriftBuffer: thriftBuffer, + }, nil +} + +// NewAgentClientUDP creates a client that sends spans to Jaeger Agent over UDP. +func NewAgentClientUDP(hostPort string, maxPacketSize int) (*AgentClientUDP, error) { + return NewAgentClientUDPWithParams(AgentClientUDPParams{ + HostPort: hostPort, + MaxPacketSize: maxPacketSize, + }) +} + +// EmitZipkinBatch implements EmitZipkinBatch() of Agent interface +func (a *AgentClientUDP) EmitZipkinBatch(spans []*zipkincore.Span) error { + return errors.New("Not implemented") +} + +// EmitBatch implements EmitBatch() of Agent interface +func (a *AgentClientUDP) EmitBatch(batch *jaeger.Batch) error { + a.thriftBuffer.Reset() + a.client.SeqId = 0 // we have no need for distinct SeqIds for our one-way UDP messages + if err := a.client.EmitBatch(batch); err != nil { + return err + } + if a.thriftBuffer.Len() > a.maxPacketSize { + return fmt.Errorf("data does not fit within one UDP packet; size %d, max %d, spans %d", + a.thriftBuffer.Len(), a.maxPacketSize, len(batch.Spans)) + } + _, err := a.connUDP.Write(a.thriftBuffer.Bytes()) + return err +} + +// Close implements Close() of io.Closer and closes the underlying UDP connection. +func (a *AgentClientUDP) Close() error { + return a.connUDP.Close() +} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/utils.go b/vendor/github.com/uber/jaeger-client-go/utils/utils.go new file mode 100644 index 00000000..ac3c325d --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/utils/utils.go @@ -0,0 +1,87 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "encoding/binary" + "errors" + "net" + "strconv" + "strings" + "time" +) + +var ( + // ErrEmptyIP an error for empty ip strings + ErrEmptyIP = errors.New("empty string given for ip") + + // ErrNotHostColonPort an error for invalid host port string + ErrNotHostColonPort = errors.New("expecting host:port") + + // ErrNotFourOctets an error for the wrong number of octets after splitting a string + ErrNotFourOctets = errors.New("Wrong number of octets") +) + +// ParseIPToUint32 converts a string ip (e.g. "x.y.z.w") to an uint32 +func ParseIPToUint32(ip string) (uint32, error) { + if ip == "" { + return 0, ErrEmptyIP + } + + if ip == "localhost" { + return 127<<24 | 1, nil + } + + octets := strings.Split(ip, ".") + if len(octets) != 4 { + return 0, ErrNotFourOctets + } + + var intIP uint32 + for i := 0; i < 4; i++ { + octet, err := strconv.Atoi(octets[i]) + if err != nil { + return 0, err + } + intIP = (intIP << 8) | uint32(octet) + } + + return intIP, nil +} + +// ParsePort converts port number from string to uin16 +func ParsePort(portString string) (uint16, error) { + port, err := strconv.ParseUint(portString, 10, 16) + return uint16(port), err +} + +// PackIPAsUint32 packs an IPv4 as uint32 +func PackIPAsUint32(ip net.IP) uint32 { + if ipv4 := ip.To4(); ipv4 != nil { + return binary.BigEndian.Uint32(ipv4) + } + return 0 +} + +// TimeToMicrosecondsSinceEpochInt64 converts Go time.Time to a long +// representing time since epoch in microseconds, which is used expected +// in the Jaeger spans encoded as Thrift. +func TimeToMicrosecondsSinceEpochInt64(t time.Time) int64 { + // ^^^ Passing time.Time by value is faster than passing a pointer! + // BenchmarkTimeByValue-8 2000000000 1.37 ns/op + // BenchmarkTimeByPtr-8 2000000000 1.98 ns/op + + return t.UnixNano() / 1000 +} diff --git a/vendor/github.com/uber/jaeger-client-go/zipkin.go b/vendor/github.com/uber/jaeger-client-go/zipkin.go new file mode 100644 index 00000000..98cab4b6 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/zipkin.go @@ -0,0 +1,77 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "github.com/opentracing/opentracing-go" +) + +// ZipkinSpanFormat is an OpenTracing carrier format constant +const ZipkinSpanFormat = "zipkin-span-format" + +// ExtractableZipkinSpan is a type of Carrier used for integration with Zipkin-aware +// RPC frameworks (like TChannel). It does not support baggage, only trace IDs. +type ExtractableZipkinSpan interface { + TraceID() uint64 + SpanID() uint64 + ParentID() uint64 + Flags() byte +} + +// InjectableZipkinSpan is a type of Carrier used for integration with Zipkin-aware +// RPC frameworks (like TChannel). It does not support baggage, only trace IDs. +type InjectableZipkinSpan interface { + SetTraceID(traceID uint64) + SetSpanID(spanID uint64) + SetParentID(parentID uint64) + SetFlags(flags byte) +} + +type zipkinPropagator struct { + tracer *Tracer +} + +func (p *zipkinPropagator) Inject( + ctx SpanContext, + abstractCarrier interface{}, +) error { + carrier, ok := abstractCarrier.(InjectableZipkinSpan) + if !ok { + return opentracing.ErrInvalidCarrier + } + + carrier.SetTraceID(ctx.TraceID().Low) // TODO this cannot work with 128bit IDs + carrier.SetSpanID(uint64(ctx.SpanID())) + carrier.SetParentID(uint64(ctx.ParentID())) + carrier.SetFlags(ctx.samplingState.flags()) + return nil +} + +func (p *zipkinPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { + carrier, ok := abstractCarrier.(ExtractableZipkinSpan) + if !ok { + return emptyContext, opentracing.ErrInvalidCarrier + } + if carrier.TraceID() == 0 { + return emptyContext, opentracing.ErrSpanContextNotFound + } + var ctx SpanContext + ctx.traceID.Low = carrier.TraceID() + ctx.spanID = SpanID(carrier.SpanID()) + ctx.parentID = SpanID(carrier.ParentID()) + ctx.samplingState = &samplingState{} + ctx.samplingState.setFlags(carrier.Flags()) + return ctx, nil +} diff --git a/vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go b/vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go new file mode 100644 index 00000000..73aeb000 --- /dev/null +++ b/vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go @@ -0,0 +1,329 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jaeger + +import ( + "encoding/binary" + "fmt" + "time" + + "github.com/opentracing/opentracing-go/ext" + + "github.com/uber/jaeger-client-go/internal/spanlog" + z "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" + "github.com/uber/jaeger-client-go/utils" +) + +const ( + // Zipkin UI does not work well with non-string tag values + allowPackedNumbers = false +) + +var specialTagHandlers = map[string]func(*zipkinSpan, interface{}){ + string(ext.SpanKind): setSpanKind, + string(ext.PeerHostIPv4): setPeerIPv4, + string(ext.PeerPort): setPeerPort, + string(ext.PeerService): setPeerService, + TracerIPTagKey: removeTag, +} + +// BuildZipkinThrift builds thrift span based on internal span. +// TODO: (breaking change) move to transport/zipkin and make private. +func BuildZipkinThrift(s *Span) *z.Span { + span := &zipkinSpan{Span: s} + span.handleSpecialTags() + parentID := int64(span.context.parentID) + var ptrParentID *int64 + if parentID != 0 { + ptrParentID = &parentID + } + traceIDHigh := int64(span.context.traceID.High) + var ptrTraceIDHigh *int64 + if traceIDHigh != 0 { + ptrTraceIDHigh = &traceIDHigh + } + timestamp := utils.TimeToMicrosecondsSinceEpochInt64(span.startTime) + duration := span.duration.Nanoseconds() / int64(time.Microsecond) + endpoint := &z.Endpoint{ + ServiceName: span.tracer.serviceName, + Ipv4: int32(span.tracer.hostIPv4)} + thriftSpan := &z.Span{ + TraceID: int64(span.context.traceID.Low), + TraceIDHigh: ptrTraceIDHigh, + ID: int64(span.context.spanID), + ParentID: ptrParentID, + Name: span.operationName, + Timestamp: ×tamp, + Duration: &duration, + Debug: span.context.IsDebug(), + Annotations: buildAnnotations(span, endpoint), + BinaryAnnotations: buildBinaryAnnotations(span, endpoint)} + return thriftSpan +} + +func buildAnnotations(span *zipkinSpan, endpoint *z.Endpoint) []*z.Annotation { + // automatically adding 2 Zipkin CoreAnnotations + annotations := make([]*z.Annotation, 0, 2+len(span.logs)) + var startLabel, endLabel string + if span.spanKind == string(ext.SpanKindRPCClientEnum) { + startLabel, endLabel = z.CLIENT_SEND, z.CLIENT_RECV + } else if span.spanKind == string(ext.SpanKindRPCServerEnum) { + startLabel, endLabel = z.SERVER_RECV, z.SERVER_SEND + } + if !span.startTime.IsZero() && startLabel != "" { + start := &z.Annotation{ + Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(span.startTime), + Value: startLabel, + Host: endpoint} + annotations = append(annotations, start) + if span.duration != 0 { + endTs := span.startTime.Add(span.duration) + end := &z.Annotation{ + Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(endTs), + Value: endLabel, + Host: endpoint} + annotations = append(annotations, end) + } + } + for _, log := range span.logs { + anno := &z.Annotation{ + Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(log.Timestamp), + Host: endpoint} + if content, err := spanlog.MaterializeWithJSON(log.Fields); err == nil { + anno.Value = truncateString(string(content), span.tracer.options.maxTagValueLength) + } else { + anno.Value = err.Error() + } + annotations = append(annotations, anno) + } + return annotations +} + +func buildBinaryAnnotations(span *zipkinSpan, endpoint *z.Endpoint) []*z.BinaryAnnotation { + // automatically adding local component or server/client address tag, and client version + annotations := make([]*z.BinaryAnnotation, 0, 2+len(span.tags)) + + if span.peerDefined() && span.isRPC() { + peer := z.Endpoint{ + Ipv4: span.peer.Ipv4, + Port: span.peer.Port, + ServiceName: span.peer.ServiceName} + label := z.CLIENT_ADDR + if span.isRPCClient() { + label = z.SERVER_ADDR + } + anno := &z.BinaryAnnotation{ + Key: label, + Value: []byte{1}, + AnnotationType: z.AnnotationType_BOOL, + Host: &peer} + annotations = append(annotations, anno) + } + if !span.isRPC() { + componentName := endpoint.ServiceName + for _, tag := range span.tags { + if tag.key == string(ext.Component) { + componentName = stringify(tag.value) + break + } + } + local := &z.BinaryAnnotation{ + Key: z.LOCAL_COMPONENT, + Value: []byte(componentName), + AnnotationType: z.AnnotationType_STRING, + Host: endpoint} + annotations = append(annotations, local) + } + for _, tag := range span.tags { + // "Special tags" are already handled by this point, we'd be double reporting the + // tags if we don't skip here + if _, ok := specialTagHandlers[tag.key]; ok { + continue + } + if anno := buildBinaryAnnotation(tag.key, tag.value, span.tracer.options.maxTagValueLength, nil); anno != nil { + annotations = append(annotations, anno) + } + } + return annotations +} + +func buildBinaryAnnotation(key string, val interface{}, maxTagValueLength int, endpoint *z.Endpoint) *z.BinaryAnnotation { + bann := &z.BinaryAnnotation{Key: key, Host: endpoint} + if value, ok := val.(string); ok { + bann.Value = []byte(truncateString(value, maxTagValueLength)) + bann.AnnotationType = z.AnnotationType_STRING + } else if value, ok := val.([]byte); ok { + if len(value) > maxTagValueLength { + value = value[:maxTagValueLength] + } + bann.Value = value + bann.AnnotationType = z.AnnotationType_BYTES + } else if value, ok := val.(int32); ok && allowPackedNumbers { + bann.Value = int32ToBytes(value) + bann.AnnotationType = z.AnnotationType_I32 + } else if value, ok := val.(int64); ok && allowPackedNumbers { + bann.Value = int64ToBytes(value) + bann.AnnotationType = z.AnnotationType_I64 + } else if value, ok := val.(int); ok && allowPackedNumbers { + bann.Value = int64ToBytes(int64(value)) + bann.AnnotationType = z.AnnotationType_I64 + } else if value, ok := val.(bool); ok { + bann.Value = []byte{boolToByte(value)} + bann.AnnotationType = z.AnnotationType_BOOL + } else { + value := stringify(val) + bann.Value = []byte(truncateString(value, maxTagValueLength)) + bann.AnnotationType = z.AnnotationType_STRING + } + return bann +} + +func stringify(value interface{}) string { + if s, ok := value.(string); ok { + return s + } + return fmt.Sprintf("%+v", value) +} + +func truncateString(value string, maxLength int) string { + // we ignore the problem of utf8 runes possibly being sliced in the middle, + // as it is rather expensive to iterate through each tag just to find rune + // boundaries. + if len(value) > maxLength { + return value[:maxLength] + } + return value +} + +func boolToByte(b bool) byte { + if b { + return 1 + } + return 0 +} + +// int32ToBytes converts int32 to bytes. +func int32ToBytes(i int32) []byte { + buf := make([]byte, 4) + binary.BigEndian.PutUint32(buf, uint32(i)) + return buf +} + +// int64ToBytes converts int64 to bytes. +func int64ToBytes(i int64) []byte { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, uint64(i)) + return buf +} + +type zipkinSpan struct { + *Span + + // peer points to the peer service participating in this span, + // e.g. the Client if this span is a server span, + // or Server if this span is a client span + peer struct { + Ipv4 int32 + Port int16 + ServiceName string + } + + // used to distinguish local vs. RPC Server vs. RPC Client spans + spanKind string +} + +func (s *zipkinSpan) handleSpecialTags() { + s.Lock() + defer s.Unlock() + if s.firstInProcess { + // append the process tags + s.tags = append(s.tags, s.tracer.tags...) + } + filteredTags := make([]Tag, 0, len(s.tags)) + for _, tag := range s.tags { + if handler, ok := specialTagHandlers[tag.key]; ok { + handler(s, tag.value) + } else { + filteredTags = append(filteredTags, tag) + } + } + s.tags = filteredTags +} + +func setSpanKind(s *zipkinSpan, value interface{}) { + if val, ok := value.(string); ok { + s.spanKind = val + return + } + if val, ok := value.(ext.SpanKindEnum); ok { + s.spanKind = string(val) + } +} + +func setPeerIPv4(s *zipkinSpan, value interface{}) { + if val, ok := value.(string); ok { + if ip, err := utils.ParseIPToUint32(val); err == nil { + s.peer.Ipv4 = int32(ip) + return + } + } + if val, ok := value.(uint32); ok { + s.peer.Ipv4 = int32(val) + return + } + if val, ok := value.(int32); ok { + s.peer.Ipv4 = val + } +} + +func setPeerPort(s *zipkinSpan, value interface{}) { + if val, ok := value.(string); ok { + if port, err := utils.ParsePort(val); err == nil { + s.peer.Port = int16(port) + return + } + } + if val, ok := value.(uint16); ok { + s.peer.Port = int16(val) + return + } + if val, ok := value.(int); ok { + s.peer.Port = int16(val) + } +} + +func setPeerService(s *zipkinSpan, value interface{}) { + if val, ok := value.(string); ok { + s.peer.ServiceName = val + } +} + +func removeTag(s *zipkinSpan, value interface{}) {} + +func (s *zipkinSpan) peerDefined() bool { + return s.peer.ServiceName != "" || s.peer.Ipv4 != 0 || s.peer.Port != 0 +} + +func (s *zipkinSpan) isRPC() bool { + s.RLock() + defer s.RUnlock() + return s.spanKind == string(ext.SpanKindRPCClientEnum) || s.spanKind == string(ext.SpanKindRPCServerEnum) +} + +func (s *zipkinSpan) isRPCClient() bool { + s.RLock() + defer s.RUnlock() + return s.spanKind == string(ext.SpanKindRPCClientEnum) +} diff --git a/vendor/github.com/uber/jaeger-lib/LICENSE b/vendor/github.com/uber/jaeger-lib/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/uber/jaeger-lib/metrics/counter.go b/vendor/github.com/uber/jaeger-lib/metrics/counter.go new file mode 100644 index 00000000..2a6a43ef --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/metrics/counter.go @@ -0,0 +1,28 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metrics + +// Counter tracks the number of times an event has occurred +type Counter interface { + // Inc adds the given value to the counter. + Inc(int64) +} + +// NullCounter counter that does nothing +var NullCounter Counter = nullCounter{} + +type nullCounter struct{} + +func (nullCounter) Inc(int64) {} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/factory.go b/vendor/github.com/uber/jaeger-lib/metrics/factory.go new file mode 100644 index 00000000..0ead061e --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/metrics/factory.go @@ -0,0 +1,78 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metrics + +import ( + "time" +) + +// NSOptions defines the name and tags map associated with a factory namespace +type NSOptions struct { + Name string + Tags map[string]string +} + +// Options defines the information associated with a metric +type Options struct { + Name string + Tags map[string]string + Help string +} + +// TimerOptions defines the information associated with a metric +type TimerOptions struct { + Name string + Tags map[string]string + Help string + Buckets []time.Duration +} + +// HistogramOptions defines the information associated with a metric +type HistogramOptions struct { + Name string + Tags map[string]string + Help string + Buckets []float64 +} + +// Factory creates new metrics +type Factory interface { + Counter(metric Options) Counter + Timer(metric TimerOptions) Timer + Gauge(metric Options) Gauge + Histogram(metric HistogramOptions) Histogram + + // Namespace returns a nested metrics factory. + Namespace(scope NSOptions) Factory +} + +// NullFactory is a metrics factory that returns NullCounter, NullTimer, and NullGauge. +var NullFactory Factory = nullFactory{} + +type nullFactory struct{} + +func (nullFactory) Counter(options Options) Counter { + return NullCounter +} +func (nullFactory) Timer(options TimerOptions) Timer { + return NullTimer +} +func (nullFactory) Gauge(options Options) Gauge { + return NullGauge +} +func (nullFactory) Histogram(options HistogramOptions) Histogram { + return NullHistogram +} +func (nullFactory) Namespace(scope NSOptions) Factory { return NullFactory } diff --git a/vendor/github.com/uber/jaeger-lib/metrics/gauge.go b/vendor/github.com/uber/jaeger-lib/metrics/gauge.go new file mode 100644 index 00000000..3c606391 --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/metrics/gauge.go @@ -0,0 +1,28 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metrics + +// Gauge returns instantaneous measurements of something as an int64 value +type Gauge interface { + // Update the gauge to the value passed in. + Update(int64) +} + +// NullGauge gauge that does nothing +var NullGauge Gauge = nullGauge{} + +type nullGauge struct{} + +func (nullGauge) Update(int64) {} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/histogram.go b/vendor/github.com/uber/jaeger-lib/metrics/histogram.go new file mode 100644 index 00000000..d3bd6174 --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/metrics/histogram.go @@ -0,0 +1,28 @@ +// Copyright (c) 2018 The Jaeger Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metrics + +// Histogram that keeps track of a distribution of values. +type Histogram interface { + // Records the value passed in. + Record(float64) +} + +// NullHistogram that does nothing +var NullHistogram Histogram = nullHistogram{} + +type nullHistogram struct{} + +func (nullHistogram) Record(float64) {} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/keys.go b/vendor/github.com/uber/jaeger-lib/metrics/keys.go new file mode 100644 index 00000000..c24445a1 --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/metrics/keys.go @@ -0,0 +1,35 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metrics + +import ( + "sort" +) + +// GetKey converts name+tags into a single string of the form +// "name|tag1=value1|...|tagN=valueN", where tag names are +// sorted alphabetically. +func GetKey(name string, tags map[string]string, tagsSep string, tagKVSep string) string { + keys := make([]string, 0, len(tags)) + for k := range tags { + keys = append(keys, k) + } + sort.Strings(keys) + key := name + for _, k := range keys { + key = key + tagsSep + k + tagKVSep + tags[k] + } + return key +} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/metrics.go b/vendor/github.com/uber/jaeger-lib/metrics/metrics.go new file mode 100644 index 00000000..0df0c662 --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/metrics/metrics.go @@ -0,0 +1,137 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metrics + +import ( + "fmt" + "reflect" + "strconv" + "strings" +) + +// MustInit initializes the passed in metrics and initializes its fields using the passed in factory. +// +// It uses reflection to initialize a struct containing metrics fields +// by assigning new Counter/Gauge/Timer values with the metric name retrieved +// from the `metric` tag and stats tags retrieved from the `tags` tag. +// +// Note: all fields of the struct must be exported, have a `metric` tag, and be +// of type Counter or Gauge or Timer. +// +// Errors during Init lead to a panic. +func MustInit(metrics interface{}, factory Factory, globalTags map[string]string) { + if err := Init(metrics, factory, globalTags); err != nil { + panic(err.Error()) + } +} + +// Init does the same as MustInit, but returns an error instead of +// panicking. +func Init(m interface{}, factory Factory, globalTags map[string]string) error { + // Allow user to opt out of reporting metrics by passing in nil. + if factory == nil { + factory = NullFactory + } + + counterPtrType := reflect.TypeOf((*Counter)(nil)).Elem() + gaugePtrType := reflect.TypeOf((*Gauge)(nil)).Elem() + timerPtrType := reflect.TypeOf((*Timer)(nil)).Elem() + histogramPtrType := reflect.TypeOf((*Histogram)(nil)).Elem() + + v := reflect.ValueOf(m).Elem() + t := v.Type() + for i := 0; i < t.NumField(); i++ { + tags := make(map[string]string) + for k, v := range globalTags { + tags[k] = v + } + var buckets []float64 + field := t.Field(i) + metric := field.Tag.Get("metric") + if metric == "" { + return fmt.Errorf("Field %s is missing a tag 'metric'", field.Name) + } + if tagString := field.Tag.Get("tags"); tagString != "" { + tagPairs := strings.Split(tagString, ",") + for _, tagPair := range tagPairs { + tag := strings.Split(tagPair, "=") + if len(tag) != 2 { + return fmt.Errorf( + "Field [%s]: Tag [%s] is not of the form key=value in 'tags' string [%s]", + field.Name, tagPair, tagString) + } + tags[tag[0]] = tag[1] + } + } + if bucketString := field.Tag.Get("buckets"); bucketString != "" { + if field.Type.AssignableTo(timerPtrType) { + // TODO: Parse timer duration buckets + return fmt.Errorf( + "Field [%s]: Buckets are not currently initialized for timer metrics", + field.Name) + } else if field.Type.AssignableTo(histogramPtrType) { + bucketValues := strings.Split(bucketString, ",") + for _, bucket := range bucketValues { + b, err := strconv.ParseFloat(bucket, 64) + if err != nil { + return fmt.Errorf( + "Field [%s]: Bucket [%s] could not be converted to float64 in 'buckets' string [%s]", + field.Name, bucket, bucketString) + } + buckets = append(buckets, b) + } + } else { + return fmt.Errorf( + "Field [%s]: Buckets should only be defined for Timer and Histogram metric types", + field.Name) + } + } + help := field.Tag.Get("help") + var obj interface{} + if field.Type.AssignableTo(counterPtrType) { + obj = factory.Counter(Options{ + Name: metric, + Tags: tags, + Help: help, + }) + } else if field.Type.AssignableTo(gaugePtrType) { + obj = factory.Gauge(Options{ + Name: metric, + Tags: tags, + Help: help, + }) + } else if field.Type.AssignableTo(timerPtrType) { + // TODO: Add buckets once parsed (see TODO above) + obj = factory.Timer(TimerOptions{ + Name: metric, + Tags: tags, + Help: help, + }) + } else if field.Type.AssignableTo(histogramPtrType) { + obj = factory.Histogram(HistogramOptions{ + Name: metric, + Tags: tags, + Help: help, + Buckets: buckets, + }) + } else { + return fmt.Errorf( + "Field %s is not a pointer to timer, gauge, or counter", + field.Name) + } + v.Field(i).Set(reflect.ValueOf(obj)) + } + return nil +} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go b/vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go new file mode 100644 index 00000000..4a8abdb5 --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go @@ -0,0 +1,43 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metrics + +import ( + "time" +) + +// StartStopwatch begins recording the executing time of an event, returning +// a Stopwatch that should be used to stop the recording the time for +// that event. Multiple events can be occurring simultaneously each +// represented by different active Stopwatches +func StartStopwatch(timer Timer) Stopwatch { + return Stopwatch{t: timer, start: time.Now()} +} + +// A Stopwatch tracks the execution time of a specific event +type Stopwatch struct { + t Timer + start time.Time +} + +// Stop stops executing of the stopwatch and records the amount of elapsed time +func (s Stopwatch) Stop() { + s.t.Record(s.ElapsedTime()) +} + +// ElapsedTime returns the amount of elapsed time (in time.Duration) +func (s Stopwatch) ElapsedTime() time.Duration { + return time.Since(s.start) +} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/tally/factory.go b/vendor/github.com/uber/jaeger-lib/metrics/tally/factory.go new file mode 100644 index 00000000..4397381d --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/metrics/tally/factory.go @@ -0,0 +1,72 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tally + +import ( + "github.com/uber-go/tally" + + "github.com/uber/jaeger-lib/metrics" +) + +// Wrap takes a tally Scope and returns jaeger-lib metrics.Factory. +func Wrap(scope tally.Scope) metrics.Factory { + return &factory{ + tally: scope, + } +} + +// TODO implement support for tags if tally.Scope does not support them +type factory struct { + tally tally.Scope +} + +func (f *factory) Counter(options metrics.Options) metrics.Counter { + scope := f.tally + if len(options.Tags) > 0 { + scope = scope.Tagged(options.Tags) + } + return NewCounter(scope.Counter(options.Name)) +} + +func (f *factory) Gauge(options metrics.Options) metrics.Gauge { + scope := f.tally + if len(options.Tags) > 0 { + scope = scope.Tagged(options.Tags) + } + return NewGauge(scope.Gauge(options.Name)) +} + +func (f *factory) Timer(options metrics.TimerOptions) metrics.Timer { + scope := f.tally + if len(options.Tags) > 0 { + scope = scope.Tagged(options.Tags) + } + // TODO: Determine whether buckets can be used + return NewTimer(scope.Timer(options.Name)) +} + +func (f *factory) Histogram(options metrics.HistogramOptions) metrics.Histogram { + scope := f.tally + if len(options.Tags) > 0 { + scope = scope.Tagged(options.Tags) + } + return NewHistogram(scope.Histogram(options.Name, tally.ValueBuckets(options.Buckets))) +} + +func (f *factory) Namespace(scope metrics.NSOptions) metrics.Factory { + return &factory{ + tally: f.tally.SubScope(scope.Name).Tagged(scope.Tags), + } +} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/tally/metrics.go b/vendor/github.com/uber/jaeger-lib/metrics/tally/metrics.go new file mode 100644 index 00000000..5069212d --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/metrics/tally/metrics.go @@ -0,0 +1,81 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tally + +import ( + "time" + + "github.com/uber-go/tally" +) + +// Counter is an adapter from go-tally Counter to jaeger-lib Counter +type Counter struct { + counter tally.Counter +} + +// NewCounter creates a new Counter +func NewCounter(counter tally.Counter) *Counter { + return &Counter{counter: counter} +} + +// Inc adds the given value to the counter. +func (c *Counter) Inc(delta int64) { + c.counter.Inc(delta) +} + +// Gauge is an adapter from go-tally Gauge to jaeger-lib Gauge +type Gauge struct { + gauge tally.Gauge +} + +// NewGauge creates a new Gauge +func NewGauge(gauge tally.Gauge) *Gauge { + return &Gauge{gauge: gauge} +} + +// Update the gauge to the value passed in. +func (g *Gauge) Update(value int64) { + g.gauge.Update(float64(value)) +} + +// Timer is an adapter from go-tally Histogram to jaeger-lib Timer +type Timer struct { + timer tally.Timer +} + +// NewTimer creates a new Timer +func NewTimer(timer tally.Timer) *Timer { + return &Timer{timer: timer} +} + +// Record saves the time passed in. +func (t *Timer) Record(delta time.Duration) { + t.timer.Record(delta) +} + +// Histogram is an adapter from go-tally Histogram to jaeger-lib Histogram +type Histogram struct { + histogram tally.Histogram +} + +// NewHistogram creates a new Histogram +func NewHistogram(histogram tally.Histogram) *Histogram { + return &Histogram{histogram: histogram} +} + +// Record saves the value passed in. +func (h *Histogram) Record(value float64) { + h.histogram.RecordValue(value) +} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/timer.go b/vendor/github.com/uber/jaeger-lib/metrics/timer.go new file mode 100644 index 00000000..e18d222a --- /dev/null +++ b/vendor/github.com/uber/jaeger-lib/metrics/timer.go @@ -0,0 +1,33 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package metrics + +import ( + "time" +) + +// Timer accumulates observations about how long some operation took, +// and also maintains a historgam of percentiles. +type Timer interface { + // Records the time passed in. + Record(time.Duration) +} + +// NullTimer timer that does nothing +var NullTimer Timer = nullTimer{} + +type nullTimer struct{} + +func (nullTimer) Record(time.Duration) {} diff --git a/vendor/github.com/uber/tchannel-go/.gitignore b/vendor/github.com/uber/tchannel-go/.gitignore new file mode 100644 index 00000000..5a61b82b --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/.gitignore @@ -0,0 +1,20 @@ +build +Godeps/_workspace +vendor/ +thrift-gen-release/ + +# Lint output +lint.log + +# Cover profiles +*.out + +# Editor and OS detritus +*~ +*.swp +.DS_Store +.idea +tchannel-go.iml +.vscode +.bin/ +.idea/ diff --git a/vendor/github.com/uber/tchannel-go/.travis.yml b/vendor/github.com/uber/tchannel-go/.travis.yml new file mode 100644 index 00000000..2f58fcac --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/.travis.yml @@ -0,0 +1,58 @@ +sudo: false +language: go + +cache: + directories: + - $HOME/.glide/cache + +go: +- 1.11.x +- 1.12.x + +matrix: + include: + - go: 1.12.x + env: CROSSDOCK=true + sudo: required + dist: trusty + services: + - docker + include: + - go: 1.12.x + env: NO_TEST=yes COVERAGE=yes LINT=yes + +env: + global: + - DOCKER_COMPOSE_VERSION=1.8.0 + - COMMIT=${TRAVIS_COMMIT::8} + # Set higher timeouts for Travis + - TEST_TIMEOUT_SCALE=20 + # Dump all debug logs on any failure + - LOGS_ON_FAILURE=1 + # DOCKER_EMAIL + - secure: OS9ccMrvJU1W3LgAltdxSn2iqeC/hS/V+xYZ2yfmGqYifzCWWa2R+GmQAfHaxQ6+ut4ISWJX/EYdtnqoUD3SBYRBOeY1fD47LFX0Q0gFnuxfgf3hS6jG5dpiK9nlp+Vj+fxnWkA2QxQQBzLDkdB1B7mBWBMt+MSuevq1QGxT6coy2XypZoAc2ohvTaznHX4PdISFS2Ddku5Zo7jqL80RYW+K1HeYxnjHYG/K7ZSZbhFQxBM5S9FSvwp8ooGiqQ7kIfK4DsOWiIBXx0fHDNHxJtNJfJeAfF9unqkeNx9QZmGcjMWzbmPqBhz231BRXPd+Z0ZyXZVnlLCzOXN2DsE/JffUTLWTxb6rJ6lrwwZ6oZm/YAM3YHRgjotiC92fjZpXEVoBPGtRMcD+P6iwbedKIeaYOj9XQ5OizKaMbJAwU5HfIUWz5iWW66SZf2NWRPwl0BX8qjL2G3yhwJwCzgIpcZ7zxIbVgtZgMcCG5K5i3/HyuGNGI2vqhXCYoFrqJu+T9t59m74ZyKf76e7bfOUQSGZlUMYVGxRtuCdjMACr4jbHD4lIBSnRGE0uat+OSle/+Ke9plP6W5b8XkALgJreOAgBa5Hnf+0ODeQnCaK0gJk6Ax5O9v4B9NEPae5hvdk1rHvG5ke/MXecu18y7wopMhJ/cpSJxRTfADmuCIdIhy4= + # DOCKER_USER + - secure: D6KY81H0sxRPvXjE2VeYz1c3vkpEUg/UoV0pRIrVlWD7HOKG6a92ZGUbwz8Ex+PRcTPPlEP1rwE/rJ/0uhrueynkXNBqQsDWT9ECsK7l92b931JY3sEM3eBJCL0whtorCLtXQ2l/g5PJS3AcNGDxP1zP07J2pcsgk2SBcZqnAq0h8U3M7/rLX8JroudG3JxmSvH6HqXkGDdOJXTCeyG9EVdrsUCVb0JY7Q0oMGMzIcZTkJ0Yts7mtjNS/VXDeSYnHxELuRgioLTJThjwBa31StZNTqnnzWh5kR2u/WZvjYf7eaHZfzZJa85CS8yIAAaMc//tu/13qxgAsdiT9TjEhx8hS0J2Wu/JXpCmbKkoHp42sX9aZDWJIR4ZQHaPEIdcTnAbPROhS0XGHqAvpcDAjWuwbtwpnB4Quz67GVpoZNQV4uHiu6fuRqY5kvkzv28K1jGeStUyNDwBtNGCvggB5OZlLYyo+2G7vu//LxV6FXsioqqKePn7xxQBtxgf2LGQEhmeO7iNUyXTy3EoaFrpl7ScQbi9XoCKN28Fi5Da9J5IOn0KQ4niRg126Xgk+vwNytj3qoP4xIZps3WavtTqXvbbGkGCIbIEDNzDFtqrdo2ZAA6YhtlwuB2/2Jbmva7zmma7VDMPapHVqe4tTsQoAl3IEeokV9wRFr/28vGDrKE= + # DOCKER_PASS + - secure: xzdXvoLEQRRz7x9YLdjyagn83lYgLX9hHlNJy0AnHUfbMpdjbnAzEDBnhorNfqoK/E2Vw4sx13+2M2ZbVQ0qfdjqUne/oBiNxzm+lTUyeZv5lhWeX5ZiJkfmecDmimK/mQBw+eah7ClzPmj3dsL2Oq4E8fd6LVCwO7ZyJUKyaeQ8/cLbJsfOSaBF40T1EFpvX8jim/dz3dtmW5ksHmjPMF3yGKTvSKuz4T2ZCe8CafvLI/Vlei/oNcJuZrIYMXsfSgjAtCW2VNeIgWetezr1KySZXe8rKVre4lyyT48t5OKXqNemxtRXE21pB7td0okpgpYTLfpwP1qP5x/87f3xFEzwBU0iJiTTXaeVifIK0irJwSm8IC63uURg7R0NYjj+183rhQkH37bfKIivj5xBbu/YID8LMTanBNRFkImlHogoSRBRt4ZdcJ7GY2gvN+2+XGWoRmRGwbp5sSHUZtntJoqMDQlu61uU2CX4CuXMy6G6I7um8CX63J0xywqDCbgB2XrQvcyiWRc4PCfnKKBtFKZRBU4aZwf/6r4BckU3NKXE8Sji98OEm2nNpyQmyKR7lfvulPTSWfwfTWUg5SAnzTcBshIsH8rFm8qU8f26WR7YoykgO3PKP/nHVItOkYs/i9roi7az9FX4nEPkgYkgwWV8d/4sJt8Uz+ll1WNIKOE= + +install: +- make install_ci + +script: +- test -n "$NO_TEST" || make test_ci +- test -z "$COVERAGE" || make cover_ci +- test -z "$LINT" || make install_lint lint +- make crossdock_logs_ci + +after_success: +- export REPO=tchannelhub/xdock-go +- export BRANCH=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo $TRAVIS_BRANCH; else echo $TRAVIS_PULL_REQUEST_BRANCH; fi) +- export TAG=`if [ "$BRANCH" == "master" ]; then echo "latest"; else echo $BRANCH; fi` +- echo "TRAVIS_BRANCH=$TRAVIS_BRANCH, REPO=$REPO, PR=$PR, BRANCH=$BRANCH, TAG=$TAG" +- export DOCKER=$(if [ "$CROSSDOCK" == "true" ]; then echo docker; else echo true; fi) +- $DOCKER login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS +- $DOCKER build -f crossdock/Dockerfile -t $REPO:$COMMIT . +- $DOCKER tag $REPO:$COMMIT $REPO:$TAG +- $DOCKER tag $REPO:$COMMIT $REPO:travis-$TRAVIS_BUILD_NUMBER +- $DOCKER push $REPO diff --git a/vendor/github.com/uber/tchannel-go/CHANGELOG.md b/vendor/github.com/uber/tchannel-go/CHANGELOG.md new file mode 100644 index 00000000..a2473b5e --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/CHANGELOG.md @@ -0,0 +1,290 @@ +Changelog +========= + +## [1.14.0] - 2019-05-20 +### Added + * Expose `CallOptions` caller name for transparent proxying (#741) + +## [1.13.0] - 2019-04-04 +### Added + * Add `MaxCloseTime` which sets a timeout for graceful connection close. (#724) + +### Changed + * Optimize Thrift string field serialization by eliminating `[]byte(string)` allocation. (#729) + +### Fixed + * Return an error if transport header keys/values exceed the maximum allowed string length. (#728) + +## [1.12.0] - 2018-11-13 +### Added + * Add a channel, `ClosedCh`, to wait for a channel to close. (#718) + * Add a Code of Conduct. (#711) + +### Changed + * Tweak error message when sending a large error to mention that we're out of space. (#716) + * Idle sweeper now skips connections that have pending calls. (#712) + +## [1.11.0] - 2018-06-25 +### Added + * thrift: Support health check type in Health endpoint. (#696) + +## [1.10.0] - 2018-04-02 +### Added + * Support blackholing requests to trigger client timeout without holding + on to resources. (#681) + * introspection: Include channel state in output. (#692) + * introspection: Add inactive connections to output. (#686) + +### Fixed + * Inherit deadlines from parent context if available, and timeout is + unspecified. + * Ensure outbound tracing headers take precedence over application + headers. (#683) + +## [1.9.0] - 2018-01-31 +### Added + * stats: Add tally reporter to emit tagged metrics. (#676) + * Add optional idle timeout, after which connections will be + closed. (#681) + +## [1.8.1] - 2017-11-21 +### Fixed + * Always log addresses as strings. (#669) + +## [1.8.0] - 2017-11-06 +### Added + * Add opt-in active connection health checks. (#318) + +### Changed + * Improve error logging on `thrift.Server` errors. (#663) + * Reduce memory usage for idle connections. (#658) + * Unpin and reduce dependencies in `glide.yaml` by using `testImports`. (#649) + +### Fixed + * Don't close connections on ping errors.(#655) + * Avoid holding on to closed connections' memory in peers. (#644) + +## [1.7.0] - 2017-08-04 +### Added +* Add `WithoutHeaders` to remove TChannel keys from a context. + +### Changed +* Cancel the context on incoming calls if the client connection is closed. + +## [1.6.0] - 2017-06-02 +### Added +* Add `OnPeerStatusChanged` channel option to receive a notification each time + the number of available connections changes for any given peer. + +### Changed +* Locks Apache Thrift to version 0.9.3, 0.10.0 to maintain backward-compatibility. +* Set DiffServ (QoS) bit on outbound connections. + +### Fixed +* Improve resilience of the frame parser. + +## [1.5.0] - 2017-03-21 +### Added +* Add `PeerList.Len` to expose the number of peers in the peer list. +* Add `PeerList.GetNew` to only return previously unselected peers. + +## [1.4.0] - 2017-03-01 +### Added +* Add version information to the channel's LocalPeerInfo. +* Add peers package for peer management utilities such as + consistent peer selection. + +### Fixed +* Fix SetScoreStrategy not rescoring existing peers. (#583). + +## [1.3.0] - 2017-02-01 +### Added +* Support Thrift namespaces for thrift-gen. +* Exposes the channel's RootPeerList with `channel.RootPeers()`. + +## [1.2.3] - 2017-01-19 +### Changed +* Improve error messages when an argument reader is closed without + reading the EOF. (#567) + +### Fixed +* thrift: Fix an issue where we return `nil` if we expected a Thrift exception + but none was found (e.g., exception is from the future). (#566) +* Fix ListenIP selecting docker interfaces over physical networks. (#565) +* Fix for error when a Thrift payload has completed decoding and attempts + to close the argument reader without waiting until EOF. (#564) +* thrift-gen: Fix "namespace go" being ignored even though the Apache thrift + generated code was respecting it. (#559) + +## [1.2.2] - 2016-12-21 +### Added +* Add a unique channel ID for introspection (#548) +* Expose local peer information on {Inbound,Outbound}Call (#537) +* Add remote peer info to connection logger and introspection (#514) + +### Fixed +* Don't drop existing headers on a context when using Wrap(ctx) (#547) +* Setting response headers is not goroutine safe, allow using a child context + for parallel sub-requests (#549). +* Fix context cancellation not cancelling Dial attempts (#541) +* Only select active connections for calls (#521) +* Treat hostPorts ending in ":0" in the init headers as ephemeral (#513) + +## [1.2.1] - 2016-09-29 +### Fixed +* Fix data race on headers when making concurrent calls using the same context. (#505) + +## [1.2.0] - 2016-09-15 +### Added +* Adds support for routing keys (the TChannel rk transport header). + +## [1.1.0] - 2016-08-25 +### Added +* Integrate OpenTracing for distributed tracing and context propagation. + As long as a Zipkin-style tracing is configured, TChannel frames still + send tracing information, and `CurrentSpan(ctx)` works as before. + All tracer configuration must be handled through OpenTracing. + (#426) + +### Changed +* Improve error messages when using the json package and the host:port + fails to connect. (#475) +* mockhyperbahn now using inbuilt TChannel relaying to implement in-process + forwarding. (#472) +* Drop go1.4 support and add support for go1.7. +* Pass thrift.Context to the thrift.Server's response callback (#465) + +## [1.0.9] - 2016-07-20 +### Added +* Expose meta endpoints on the "tchannel" service name. (#459) +* Add Go version and tchannel-go library version to introspection. (#457) +* Expose the number of connections on a channel. (#451) + +### Changed +* Better handling of peers where dialed host:port doesn't match the remote + connection's reported host:port. (#452) + +## [1.0.8] - 2016-07-15 +### Fixed +* Remove dependency on "testing" from "tchannel-go" introduced in v1.0.7. + +## [1.0.7] - 2016-07-15 + +### Added +* Add CallOptions() to IncomingCall which can be used as the call option + when making outbound calls to proxy all transport headers. +* Add tracing information to all error frames generated by the library. +* Add GetHandlers for getting all registered methods on a subchannel. +* Expose the peer information for outbound calls. +* Support a separate connection timeout from the context timeout, useful for + streaming calls where the stream timeout may be much longer than the + connection timeout. + +### Fixed +* Fix peer score not being calculated when adding a new outbound connections + +## [1.0.6] - 2016-06-16 +### Fixed +* Fix trace span encoding fields in the wrong order + +## [1.0.5] - 2016-04-04 +### Changed +* Use `context.Context` storage for headers so `thrift.Context` and + `tchannel.ContextWithHeaders` can be passed to functions that use + `context.Context`, and have them retain headers. +* `thrift.Server` allows a custom factory to be used for `thrift.Context` + creation based on the underlying `context.Context` and headers map. +* Store goroutine stack traces on channel creation that can be accessed + via introspection. + +## [1.0.4] - 2016-03-09 +### Added +* #228: Add registered methods to the introspection output. +* Add ability to set a global handler for a SubChannel. + +### Fixed +* Improve handling of network failures during pending calls. Previously, calls + would timeout, but now they fail as soon as the network failure is detected. +* Remove ephemeral peers with closed outbound connections. +* #233: Ensure errors returned from Thrift handlers have a non-nil value. + +# 1.0.3 (2016-02-15) + +### Added +* Introspection now includes information about all channels created + in the current process. + +### Changed +* Improved performance when writing Thrift structs +* Make closing message exchanges less disruptive, changes a panic due to + closing a channel twice to an error log. + +## [1.0.2] - 2016-01-29 +### Changed +* Extend the `ContextBuilder` API to support setting the transport-level + routing delegate header. +* Assorted logging and test improvements. + +### Fixed +* Set a timeout when making new outbound connections to avoid hanging. +* Fix for #196: Make the initial Hyperbahn advertise more tolerant of transient + timeouts. + +## [1.0.1] - 2016-01-19 +### Added +* Peers can now be removed using PeerList.Remove. +* Add ErrorHandlerFunc to create raw handlers that return errors. +* Retries try to avoid previously selected hosts, rather than just the + host:port. +* Create an ArgReader interface (which is an alias for io.ReadCloser) for + symmetry with ArgWriter. +* Add ArgReadable and ArgWritable interfaces for the common methods between + calls and responses. +* Expose Thrift binary encoding methods (thrift.ReadStruct, thrift.WriteStruct, + thrift.ReadHeaders, thrift.WriteHeaders) so callers can easily send Thrift + payloads over the streaming interface. + +### Fixed +* Bug fix for #181: Shuffle peers on PeerList.Add to avoid biases in peer + selection. + +## 1.0.0 - 2016-01-11 +### Added +* First stable release. +* Support making calls with JSON, Thrift or raw payloads. +* Services use thrift-gen, and implement handlers with a `func(ctx, arg) (res, + error)` signature. +* Support retries. +* Peer selection (peer heap, prefer incoming strategy, for use with Hyperbahn). +* Graceful channel shutdown. +* TCollector trace reporter with sampling support. +* Metrics collection with StatsD. +* Thrift support, including includes. + +[//]: # (Version Links) +[1.14.0]: https://github.com/uber/tchannel-go/compare/v1.13.0...v1.14.0 +[1.13.0]: https://github.com/uber/tchannel-go/compare/v1.12.0...v1.13.0 +[1.12.0]: https://github.com/uber/tchannel-go/compare/v1.11.0...v1.12.0 +[1.11.0]: https://github.com/uber/tchannel-go/compare/v1.10.0...v1.11.0 +[1.10.0]: https://github.com/uber/tchannel-go/compare/v1.9.0...v1.10.0 +[1.9.0]: https://github.com/uber/tchannel-go/compare/v1.8.1...v1.9.0 +[1.8.1]: https://github.com/uber/tchannel-go/compare/v1.8.0...v1.8.1 +[1.8.0]: https://github.com/uber/tchannel-go/compare/v1.7.0...v1.8.0 +[1.7.0]: https://github.com/uber/tchannel-go/compare/v1.6.0...v1.7.0 +[1.6.0]: https://github.com/uber/tchannel-go/compare/v1.5.0...v1.6.0 +[1.5.0]: https://github.com/uber/tchannel-go/compare/v1.4.0...v1.5.0 +[1.4.0]: https://github.com/uber/tchannel-go/compare/v1.3.0...v1.4.0 +[1.3.0]: https://github.com/uber/tchannel-go/compare/v1.2.3...v1.3.0 +[1.2.3]: https://github.com/uber/tchannel-go/compare/v1.2.2...v1.2.3 +[1.2.2]: https://github.com/uber/tchannel-go/compare/v1.2.1...v1.2.2 +[1.2.1]: https://github.com/uber/tchannel-go/compare/v1.2.0...v1.2.1 +[1.2.0]: https://github.com/uber/tchannel-go/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/uber/tchannel-go/compare/v1.0.9...v1.1.0 +[1.0.9]: https://github.com/uber/tchannel-go/compare/v1.0.8...v1.0.9 +[1.0.8]: https://github.com/uber/tchannel-go/compare/v1.0.7...v1.0.8 +[1.0.7]: https://github.com/uber/tchannel-go/compare/v1.0.6...v1.0.7 +[1.0.6]: https://github.com/uber/tchannel-go/compare/v1.0.5...v1.0.6 +[1.0.5]: https://github.com/uber/tchannel-go/compare/v1.0.4...v1.0.5 +[1.0.4]: https://github.com/uber/tchannel-go/compare/v1.0.2...v1.0.4 +[1.0.2]: https://github.com/uber/tchannel-go/compare/v1.0.1...v1.0.2 +[1.0.1]: https://github.com/uber/tchannel-go/compare/v1.0.0...v1.0.1 diff --git a/vendor/github.com/uber/tchannel-go/CODE_OF_CONDUCT.md b/vendor/github.com/uber/tchannel-go/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..e327d9aa --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/CODE_OF_CONDUCT.md @@ -0,0 +1,75 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, +body size, disability, ethnicity, gender identity and expression, level of +experience, 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 oss-conduct@uber.com. The project +team will review and investigate all complaints, and will respond in a way +that it deems 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 +[http://contributor-covenant.org/version/1/4][version]. + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/uber/tchannel-go/CONTRIBUTING.md b/vendor/github.com/uber/tchannel-go/CONTRIBUTING.md new file mode 100644 index 00000000..60f2846a --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/CONTRIBUTING.md @@ -0,0 +1,44 @@ +Contributing +============ + +We'd love your help making tchannel-go great! + +## Getting Started + +TChannel uses [glide](https://github.com/Masterminds/glide) to manage +dependencies. +To get started: + +```bash +go get github.com/uber/tchannel-go +make install_glide +make # tests should pass +``` + +## Making A Change + +*Before making any significant changes, please [open an +issue](https://github.com/uber/tchannel-go/issues).* Discussing your proposed +changes ahead of time will make the contribution process smooth for everyone. + +Once we've discussed your changes and you've got your code ready, make sure +that tests are passing (`make test` or `make cover`) and open your PR! Your +pull request is most likely to be accepted if it: + +* Includes tests for new functionality. +* Follows the guidelines in [Effective + Go](https://golang.org/doc/effective_go.html) and the [Go team's common code + review comments](https://github.com/golang/go/wiki/CodeReviewComments). +* Has a [good commit + message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). + +## Cutting a Release + +* Send a pull request against dev including: + * update CHANGELOG.md (`scripts/changelog_halp.sh`) + * update version.go +* Send a pull request for dev into master +* `git tag -m v0.0.0 -a v0.0.0` +* `git push origin --tags` +* Copy CHANGELOG.md fragment into release notes on + https://github.com/uber/tchannel-go/releases diff --git a/vendor/github.com/uber/tchannel-go/LICENSE.md b/vendor/github.com/uber/tchannel-go/LICENSE.md new file mode 100644 index 00000000..b090ca4f --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/LICENSE.md @@ -0,0 +1,19 @@ +Copyright (c) 2015 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/uber/tchannel-go/Makefile b/vendor/github.com/uber/tchannel-go/Makefile new file mode 100644 index 00000000..1f6d2cef --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/Makefile @@ -0,0 +1,157 @@ +export GO15VENDOREXPERIMENT=1 + +PATH := $(GOPATH)/bin:$(PATH) +EXAMPLES=./examples/bench/server ./examples/bench/client ./examples/ping ./examples/thrift ./examples/hyperbahn/echo-server +ALL_PKGS := $(shell glide nv) +PROD_PKGS := . ./http ./hyperbahn ./json ./peers ./pprof ./raw ./relay ./stats ./thrift $(EXAMPLES) +TEST_ARG ?= -race -v -timeout 5m +BUILD := ./build +THRIFT_GEN_RELEASE := ./thrift-gen-release +THRIFT_GEN_RELEASE_LINUX := $(THRIFT_GEN_RELEASE)/linux-x86_64 +THRIFT_GEN_RELEASE_DARWIN := $(THRIFT_GEN_RELEASE)/darwin-x86_64 + +PLATFORM := $(shell uname -s | tr '[:upper:]' '[:lower:]') +ARCH := $(shell uname -m) + +OLD_GOPATH := $(GOPATH) + +BIN := $(shell pwd)/.bin + +# Cross language test args +TEST_HOST=127.0.0.1 +TEST_PORT=0 + +-include crossdock/rules.mk + +all: test examples + +$(BIN)/thrift: + mkdir -p $(BIN) + scripts/install-thrift.sh $(BIN) + +packages_test: + go list -json ./... | jq -r '. | select ((.TestGoFiles | length) > 0) | .ImportPath' + +setup: + mkdir -p $(BUILD) + mkdir -p $(BUILD)/examples + mkdir -p $(THRIFT_GEN_RELEASE_LINUX) + mkdir -p $(THRIFT_GEN_RELEASE_DARWIN) + +# We want to remove `vendor` dir because thrift-gen tests don't work with it. +# However, glide install even with --cache-gopath option leaves GOPATH at HEAD, +# not at the desired versions from glide.lock, which are only applied to `vendor` +# dir. So we move `vendor` to a temp dir and prepend it to GOPATH. +# Note that glide itself is still executed against the original GOPATH. +install: + GOPATH=$(OLD_GOPATH) glide --debug install --cache --cache-gopath + +install_lint: + @echo "Installing golint, since we expect to lint" + GOPATH=$(OLD_GOPATH) go get -u -f golang.org/x/lint/golint + +install_glide: + # all we want is: GOPATH=$(OLD_GOPATH) go get -u github.com/Masterminds/glide + # but have to pin to 0.12.3 due to https://github.com/Masterminds/glide/issues/745 + GOPATH=$(OLD_GOPATH) go get -u github.com/Masterminds/glide && cd $(OLD_GOPATH)/src/github.com/Masterminds/glide && git checkout v0.12.3 && go install + +install_ci: $(BIN)/thrift install_glide install +ifdef CROSSDOCK + $(MAKE) install_docker_ci +endif + +install_test: + go test -i $(TEST_ARG) $(ALL_PKGS) + +help: + @egrep "^# target:" [Mm]akefile | sort - + +clean: + echo Cleaning build artifacts... + go clean + rm -rf $(BUILD) $(THRIFT_GEN_RELEASE) + echo + +fmt format: + echo Formatting Packages... + go fmt $(ALL_PKGS) + echo + +test_ci: +ifdef CROSSDOCK + $(MAKE) crossdock_ci +else + $(MAKE) test +endif + +test: clean setup install_test check_no_test_deps $(BIN)/thrift + @echo Testing packages: + PATH=$(BIN):$$PATH go test -parallel=4 $(TEST_ARG) $(ALL_PKGS) + @echo Running frame pool tests + PATH=$(BIN):$$PATH go test -run TestFramesReleased -stressTest $(TEST_ARG) + +check_no_test_deps: + ! go list -json $(PROD_PKGS) | jq -r '.Deps | select ((. | length) > 0) | .[]' | grep -e test -e mock | grep -v '^internal/testlog' + +benchmark: clean setup $(BIN)/thrift + echo Running benchmarks: + PATH=$(BIN)::$$PATH go test $(ALL_PKGS) -bench=. -cpu=1 -benchmem -run NONE + +cover_profile: clean setup $(BIN)/thrift + @echo Testing packages: + mkdir -p $(BUILD) + PATH=$(BIN)::$$PATH go test ./ $(TEST_ARG) -coverprofile=$(BUILD)/coverage.out + +cover: cover_profile + go tool cover -html=$(BUILD)/coverage.out + +cover_ci: + @echo "Uploading coverage" + $(MAKE) cover_profile + curl -s https://codecov.io/bash > $(BUILD)/codecov.bash + bash $(BUILD)/codecov.bash -f $(BUILD)/coverage.out + + +FILTER := grep -v -e '_string.go' -e '/gen-go/' -e '/mocks/' -e 'vendor/' +lint: + @echo "Running golint" + -golint $(ALL_PKGS) | $(FILTER) | tee lint.log + @echo "Running go vet" + -go vet $(ALL_PKGS) 2>&1 | fgrep -v -e "possible formatting directiv" -e "exit status" | tee -a lint.log + @echo "Verifying files are gofmt'd" + -gofmt -l . | $(FILTER) | tee -a lint.log + @echo "Checking for unresolved FIXMEs" + -git grep -i -n fixme | $(FILTER) | grep -v -e Makefile | tee -a lint.log + @[ ! -s lint.log ] + +thrift_example: thrift_gen + go build -o $(BUILD)/examples/thrift ./examples/thrift/main.go + +test_server: + ./build/examples/test_server --host ${TEST_HOST} --port ${TEST_PORT} + +examples: clean setup thrift_example + echo Building examples... + mkdir -p $(BUILD)/examples/ping $(BUILD)/examples/bench + go build -o $(BUILD)/examples/ping/pong ./examples/ping/main.go + go build -o $(BUILD)/examples/hyperbahn/echo-server ./examples/hyperbahn/echo-server/main.go + go build -o $(BUILD)/examples/bench/server ./examples/bench/server + go build -o $(BUILD)/examples/bench/client ./examples/bench/client + go build -o $(BUILD)/examples/bench/runner ./examples/bench/runner.go + go build -o $(BUILD)/examples/test_server ./examples/test_server + +thrift_gen: $(BIN)/thrift + go build -o $(BUILD)/thrift-gen ./thrift/thrift-gen + PATH=$(BIN):$$PATH $(BUILD)/thrift-gen --generateThrift --inputFile thrift/test.thrift --outputDir thrift/gen-go/ + PATH=$(BIN):$$PATH $(BUILD)/thrift-gen --generateThrift --inputFile examples/keyvalue/keyvalue.thrift --outputDir examples/keyvalue/gen-go + PATH=$(BIN):$$PATH $(BUILD)/thrift-gen --generateThrift --inputFile examples/thrift/example.thrift --outputDir examples/thrift/gen-go + PATH=$(BIN):$$PATH $(BUILD)/thrift-gen --generateThrift --inputFile hyperbahn/hyperbahn.thrift --outputDir hyperbahn/gen-go + +release_thrift_gen: clean setup + GOOS=linux GOARCH=amd64 go build -o $(THRIFT_GEN_RELEASE_LINUX)/thrift-gen ./thrift/thrift-gen + GOOS=darwin GOARCH=amd64 go build -o $(THRIFT_GEN_RELEASE_DARWIN)/thrift-gen ./thrift/thrift-gen + tar -czf thrift-gen-release.tar.gz $(THRIFT_GEN_RELEASE) + mv thrift-gen-release.tar.gz $(THRIFT_GEN_RELEASE)/ + +.PHONY: all help clean fmt format install install_ci install_lint install_glide release_thrift_gen packages_test check_no_test_deps test test_ci lint +.SILENT: all help clean fmt format test lint diff --git a/vendor/github.com/uber/tchannel-go/README.md b/vendor/github.com/uber/tchannel-go/README.md new file mode 100644 index 00000000..f670c991 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/README.md @@ -0,0 +1,67 @@ +# TChannel [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +[TChannel][tchan-spec] is a multiplexing and framing protocol for RPC calls. +tchannel-go is a Go implementation of the protocol, including client libraries +for [Hyperbahn][hyperbahn]. + +If you'd like to start by writing a small Thrift and TChannel service, check +out [this guide](guide/Thrift_Hyperbahn.md). For a less opinionated setup, see +the [contribution guidelines](CONTRIBUTING.md). + +## Overview + +TChannel is a network protocol that supports: + + * A request/response model, + * Multiplexing multiple requests across the same TCP socket, + * Out-of-order responses, + * Streaming requests and responses, + * Checksummed frames, + * Transport of arbitrary payloads, + * Easy implementation in many languages, and + * Redis-like performance. + +This protocol is intended to run on datacenter networks for inter-process +communication. + +## Protocol + +TChannel frames have a fixed-length header and 3 variable-length fields. The +underlying protocol does not assign meaning to these fields, but the included +client/server implementation uses the first field to represent a unique +endpoint or function name in an RPC model. The next two fields can be used for +arbitrary data. Some suggested way to use the 3 fields are: + +* URI path + HTTP method and headers as JSON + body, or +* Function name + headers + thrift/protobuf. + +Note, however, that the only encoding supported by TChannel is UTF-8. If you +want JSON, you'll need to stringify and parse outside of TChannel. + +This design supports efficient routing and forwarding: routers need to parse +the first or second field, but can forward the third field without parsing. + +There is no notion of client and server in this system. Every TChannel instance +is capable of making and receiving requests, and thus requires a unique port on +which to listen. This requirement may change in the future. + +See the [protocol specification][tchan-proto-spec] for more details. + +## Examples + + - [ping](examples/ping): A simple ping/pong example using raw TChannel. + - [thrift](examples/thrift): A Thrift server/client example. + - [keyvalue](examples/keyvalue): A keyvalue Thrift service with separate server and client binaries. + +
+This project is released under the [MIT License](LICENSE.md). + +[doc-img]: https://godoc.org/github.com/uber/tchannel-go?status.svg +[doc]: https://godoc.org/github.com/uber/tchannel-go +[ci-img]: https://travis-ci.com/uber/tchannel-go.svg?branch=master +[ci]: https://travis-ci.com/uber/tchannel-go +[cov-img]: https://coveralls.io/repos/uber/tchannel-go/badge.svg?branch=master&service=github +[cov]: https://coveralls.io/github/uber/tchannel-go?branch=master +[tchan-spec]: http://tchannel.readthedocs.org/en/latest/ +[tchan-proto-spec]: http://tchannel.readthedocs.org/en/latest/protocol/ +[hyperbahn]: https://github.com/uber/hyperbahn diff --git a/vendor/github.com/uber/tchannel-go/RELEASE.md b/vendor/github.com/uber/tchannel-go/RELEASE.md new file mode 100644 index 00000000..d0dae74f --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/RELEASE.md @@ -0,0 +1,52 @@ +Release process +=============== + +This document outlines how to create a release of tchannel-go + +1. Set up some environment variables for use later. + + ``` + # This is the version being released. + $ VERSION=1.8.0 + ``` + +2. Make sure you have the latest dev and create a branch off it. + + ``` + $ git checkout dev + $ git pull + $ git checkout -b release + ``` + +3. Update the `CHANGELOG.md` and `version.go` files. + + ``` + $ go run ./scripts/vbumper/main.go --version $VERSION + ``` + +4. Clean up the `CHANGELOG.md` to only mention noteworthy changes for users. + +5. Commit changes and create a PR against `dev` to prepare for release. + +6. Once the release PR has been accepted, run the following to release. + + ``` + $ git checkout master + $ git pull + $ git merge dev + $ git tag -a "v$VERSION" -m "v$VERSION" + $ git push origin master v$VERSION + ``` + +7. Go to and edit the release notes. + Copy changelog entries for this release and set the name to `v$VERSION`. + +8. Switch back to development. + + ``` + $ git checkout dev + $ git merge master + $ go run ./scripts/vbumper/main.go --version ${VERSION}-dev --skip-changelog + $ git commit -am "Back to development" + $ git push + ``` diff --git a/vendor/github.com/uber/tchannel-go/all_channels.go b/vendor/github.com/uber/tchannel-go/all_channels.go new file mode 100644 index 00000000..01d81403 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/all_channels.go @@ -0,0 +1,69 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "fmt" + "sync" +) + +// channelMap is used to ensure that applications don't create multiple channels with +// the same service name in a single process. +var channelMap = struct { + sync.Mutex + existing map[string][]*Channel +}{ + existing: make(map[string][]*Channel), +} + +func registerNewChannel(ch *Channel) { + serviceName := ch.ServiceName() + ch.createdStack = string(getStacks(false /* all */)) + ch.log.WithFields( + LogField{"channelPtr", fmt.Sprintf("%p", ch)}, + LogField{"createdStack", ch.createdStack}, + ).Info("Created new channel.") + + channelMap.Lock() + defer channelMap.Unlock() + + existing := channelMap.existing[serviceName] + channelMap.existing[serviceName] = append(existing, ch) +} + +func removeClosedChannel(ch *Channel) { + channelMap.Lock() + defer channelMap.Unlock() + + channels := channelMap.existing[ch.ServiceName()] + for i, v := range channels { + if v != ch { + continue + } + + // Replace current index with the last element, and truncate channels. + channels[i] = channels[len(channels)-1] + channels = channels[:len(channels)-1] + break + } + + channelMap.existing[ch.ServiceName()] = channels +} diff --git a/vendor/github.com/uber/tchannel-go/arguments.go b/vendor/github.com/uber/tchannel-go/arguments.go new file mode 100644 index 00000000..f0d46a25 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/arguments.go @@ -0,0 +1,150 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "bufio" + "encoding/json" + "io" + "io/ioutil" + + "github.com/uber/tchannel-go/internal/argreader" +) + +// ArgReader is the interface for the arg2 and arg3 streams on an +// OutboundCallResponse and an InboundCall +type ArgReader io.ReadCloser + +// ArgWriter is the interface for the arg2 and arg3 streams on an OutboundCall +// and an InboundCallResponse +type ArgWriter interface { + io.WriteCloser + + // Flush flushes the currently written bytes without waiting for the frame + // to be filled. + Flush() error +} + +// ArgWritable is an interface for providing arg2 and arg3 writer streams; +// implemented by reqResWriter e.g. OutboundCall and InboundCallResponse +type ArgWritable interface { + Arg2Writer() (ArgWriter, error) + Arg3Writer() (ArgWriter, error) +} + +// ArgReadable is an interface for providing arg2 and arg3 reader streams; +// implemented by reqResReader e.g. InboundCall and OutboundCallResponse. +type ArgReadable interface { + Arg2Reader() (ArgReader, error) + Arg3Reader() (ArgReader, error) +} + +// ArgReadHelper providers a simpler interface to reading arguments. +type ArgReadHelper struct { + reader ArgReader + err error +} + +// NewArgReader wraps the result of calling ArgXReader to provide a simpler +// interface for reading arguments. +func NewArgReader(reader ArgReader, err error) ArgReadHelper { + return ArgReadHelper{reader, err} +} + +func (r ArgReadHelper) read(f func() error) error { + if r.err != nil { + return r.err + } + if err := f(); err != nil { + return err + } + if err := argreader.EnsureEmpty(r.reader, "read arg"); err != nil { + return err + } + return r.reader.Close() +} + +// Read reads from the reader into the byte slice. +func (r ArgReadHelper) Read(bs *[]byte) error { + return r.read(func() error { + var err error + *bs, err = ioutil.ReadAll(r.reader) + return err + }) +} + +// ReadJSON deserializes JSON from the underlying reader into data. +func (r ArgReadHelper) ReadJSON(data interface{}) error { + return r.read(func() error { + // TChannel allows for 0 length values (not valid JSON), so we use a bufio.Reader + // to check whether data is of 0 length. + reader := bufio.NewReader(r.reader) + if _, err := reader.Peek(1); err == io.EOF { + // If the data is 0 length, then we don't try to read anything. + return nil + } else if err != nil { + return err + } + + d := json.NewDecoder(reader) + return d.Decode(data) + }) +} + +// ArgWriteHelper providers a simpler interface to writing arguments. +type ArgWriteHelper struct { + writer io.WriteCloser + err error +} + +// NewArgWriter wraps the result of calling ArgXWriter to provider a simpler +// interface for writing arguments. +func NewArgWriter(writer io.WriteCloser, err error) ArgWriteHelper { + return ArgWriteHelper{writer, err} +} + +func (w ArgWriteHelper) write(f func() error) error { + if w.err != nil { + return w.err + } + + if err := f(); err != nil { + return err + } + + return w.writer.Close() +} + +// Write writes the given bytes to the underlying writer. +func (w ArgWriteHelper) Write(bs []byte) error { + return w.write(func() error { + _, err := w.writer.Write(bs) + return err + }) +} + +// WriteJSON writes the given object as JSON. +func (w ArgWriteHelper) WriteJSON(data interface{}) error { + return w.write(func() error { + e := json.NewEncoder(w.writer) + return e.Encode(data) + }) +} diff --git a/vendor/github.com/uber/tchannel-go/calloptions.go b/vendor/github.com/uber/tchannel-go/calloptions.go new file mode 100644 index 00000000..fcb78a0a --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/calloptions.go @@ -0,0 +1,94 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +// Format is the arg scheme used for a specific call. +type Format string + +// The list of formats supported by tchannel. +const ( + HTTP Format = "http" + JSON Format = "json" + Raw Format = "raw" + Thrift Format = "thrift" +) + +func (f Format) String() string { + return string(f) +} + +// CallOptions are options for a specific call. +type CallOptions struct { + // Format is arg scheme used for this call, sent in the "as" header. + // This header is only set if the Format is set. + Format Format + + // ShardKey determines where this call request belongs, used with ringpop applications. + ShardKey string + + // RequestState stores request state across retry attempts. + RequestState *RequestState + + // RoutingKey identifies the destined traffic group. Relays may favor the + // routing key over the service name to route the request to a specialized + // traffic group. + RoutingKey string + + // RoutingDelegate identifies a traffic group capable of routing a request + // to an instance of the intended service. + RoutingDelegate string + + // CallerName defaults to the channel's service name for an outbound call. + // Optionally override this field to support transparent proxying when inbound + // caller names vary across calls. + CallerName string +} + +var defaultCallOptions = &CallOptions{} + +func (c *CallOptions) setHeaders(headers transportHeaders) { + headers[ArgScheme] = Raw.String() + c.overrideHeaders(headers) +} + +// overrideHeaders sets headers if the call options contains non-default values. +func (c *CallOptions) overrideHeaders(headers transportHeaders) { + if c.Format != "" { + headers[ArgScheme] = c.Format.String() + } + if c.ShardKey != "" { + headers[ShardKey] = c.ShardKey + } + if c.RoutingKey != "" { + headers[RoutingKey] = c.RoutingKey + } + if c.RoutingDelegate != "" { + headers[RoutingDelegate] = c.RoutingDelegate + } + if c.CallerName != "" { + headers[CallerName] = c.CallerName + } +} + +// setResponseHeaders copies some headers from the incoming call request to the response. +func setResponseHeaders(reqHeaders, respHeaders transportHeaders) { + respHeaders[ArgScheme] = reqHeaders[ArgScheme] +} diff --git a/vendor/github.com/uber/tchannel-go/channel.go b/vendor/github.com/uber/tchannel-go/channel.go new file mode 100644 index 00000000..4477d00e --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/channel.go @@ -0,0 +1,851 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "errors" + "fmt" + "net" + "os" + "path/filepath" + "runtime" + "strings" + "sync" + "time" + + "github.com/uber/tchannel-go/tnet" + + "github.com/opentracing/opentracing-go" + "go.uber.org/atomic" + "golang.org/x/net/context" +) + +var ( + errAlreadyListening = errors.New("channel already listening") + errInvalidStateForOp = errors.New("channel is in an invalid state for that method") + errMaxIdleTimeNotSet = errors.New("IdleCheckInterval is set but MaxIdleTime is zero") + + // ErrNoServiceName is returned when no service name is provided when + // creating a new channel. + ErrNoServiceName = errors.New("no service name provided") +) + +const ephemeralHostPort = "0.0.0.0:0" + +// ChannelOptions are used to control parameters on a create a TChannel +type ChannelOptions struct { + // Default Connection options + DefaultConnectionOptions ConnectionOptions + + // The name of the process, for logging and reporting to peers + ProcessName string + + // OnPeerStatusChanged is an optional callback that receives a notification + // whenever the channel establishes a usable connection to a peer, or loses + // a connection to a peer. + OnPeerStatusChanged func(*Peer) + + // The logger to use for this channel + Logger Logger + + // The host:port selection implementation to use for relaying. This is an + // unstable API - breaking changes are likely. + RelayHost RelayHost + + // The list of service names that should be handled locally by this channel. + // This is an unstable API - breaking changes are likely. + RelayLocalHandlers []string + + // The maximum allowable timeout for relayed calls (longer timeouts are + // clamped to this value). Passing zero uses the default of 2m. + // This is an unstable API - breaking changes are likely. + RelayMaxTimeout time.Duration + + // RelayTimerVerification will disable pooling of relay timers, and instead + // verify that timers are not used once they are released. + // This is an unstable API - breaking changes are likely. + RelayTimerVerification bool + + // The reporter to use for reporting stats for this channel. + StatsReporter StatsReporter + + // TimeNow is a variable for overriding time.Now in unit tests. + // Note: This is not a stable part of the API and may change. + TimeNow func() time.Time + + // TimeTicker is a variable for overriding time.Ticker in unit tests. + // Note: This is not a stable part of the API and may change. + TimeTicker func(d time.Duration) *time.Ticker + + // MaxIdleTime controls how long we allow an idle connection to exist + // before tearing it down. Must be set to non-zero if IdleCheckInterval + // is set. + MaxIdleTime time.Duration + + // IdleCheckInterval controls how often the channel runs a sweep over + // all active connections to see if they can be dropped. Connections that + // are idle for longer than MaxIdleTime are disconnected. If this is set to + // zero (the default), idle checking is disabled. + IdleCheckInterval time.Duration + + // Tracer is an OpenTracing Tracer used to manage distributed tracing spans. + // If not set, opentracing.GlobalTracer() is used. + Tracer opentracing.Tracer + + // Handler is an alternate handler for all inbound requests, overriding the + // default handler that delegates to a subchannel. + Handler Handler +} + +// ChannelState is the state of a channel. +type ChannelState int + +const ( + // ChannelClient is a channel that can be used as a client. + ChannelClient ChannelState = iota + 1 + + // ChannelListening is a channel that is listening for new connnections. + ChannelListening + + // ChannelStartClose is a channel that has received a Close request. + // The channel is no longer listening, and all new incoming connections are rejected. + ChannelStartClose + + // ChannelInboundClosed is a channel that has drained all incoming connections, but may + // have outgoing connections. All incoming calls and new outgoing calls are rejected. + ChannelInboundClosed + + // ChannelClosed is a channel that has closed completely. + ChannelClosed +) + +//go:generate stringer -type=ChannelState + +// A Channel is a bi-directional connection to the peering and routing network. +// Applications can use a Channel to make service calls to remote peers via +// BeginCall, or to listen for incoming calls from peers. Applications that +// want to receive requests should call one of Serve or ListenAndServe +// TODO(prashant): Shutdown all subchannels + peers when channel is closed. +type Channel struct { + channelConnectionCommon + + chID uint32 + createdStack string + commonStatsTags map[string]string + connectionOptions ConnectionOptions + peers *PeerList + relayHost RelayHost + relayMaxTimeout time.Duration + relayTimerVerify bool + handler Handler + onPeerStatusChanged func(*Peer) + closed chan struct{} + + // mutable contains all the members of Channel which are mutable. + mutable struct { + sync.RWMutex // protects members of the mutable struct. + state ChannelState + peerInfo LocalPeerInfo // May be ephemeral if this is a client only channel + l net.Listener // May be nil if this is a client only channel + idleSweep *idleSweep + conns map[uint32]*Connection + } +} + +// channelConnectionCommon is the list of common objects that both use +// and can be copied directly from the channel to the connection. +type channelConnectionCommon struct { + log Logger + relayLocal map[string]struct{} + statsReporter StatsReporter + tracer opentracing.Tracer + subChannels *subChannelMap + timeNow func() time.Time + timeTicker func(time.Duration) *time.Ticker +} + +// _nextChID is used to allocate unique IDs to every channel for debugging purposes. +var _nextChID atomic.Uint32 + +// Tracer returns the OpenTracing Tracer for this channel. If no tracer was provided +// in the configuration, returns opentracing.GlobalTracer(). Note that this approach +// allows opentracing.GlobalTracer() to be initialized _after_ the channel is created. +func (ccc channelConnectionCommon) Tracer() opentracing.Tracer { + if ccc.tracer != nil { + return ccc.tracer + } + return opentracing.GlobalTracer() +} + +// NewChannel creates a new Channel. The new channel can be used to send outbound requests +// to peers, but will not listen or handling incoming requests until one of ListenAndServe +// or Serve is called. The local service name should be passed to serviceName. +func NewChannel(serviceName string, opts *ChannelOptions) (*Channel, error) { + if serviceName == "" { + return nil, ErrNoServiceName + } + + if opts == nil { + opts = &ChannelOptions{} + } + + processName := opts.ProcessName + if processName == "" { + processName = fmt.Sprintf("%s[%d]", filepath.Base(os.Args[0]), os.Getpid()) + } + + logger := opts.Logger + if logger == nil { + logger = NullLogger + } + + statsReporter := opts.StatsReporter + if statsReporter == nil { + statsReporter = NullStatsReporter + } + + timeNow := opts.TimeNow + if timeNow == nil { + timeNow = time.Now + } + + timeTicker := opts.TimeTicker + if timeTicker == nil { + timeTicker = time.NewTicker + } + + chID := _nextChID.Inc() + logger = logger.WithFields( + LogField{"serviceName", serviceName}, + LogField{"process", processName}, + LogField{"chID", chID}, + ) + + if err := opts.validateIdleCheck(); err != nil { + return nil, err + } + + ch := &Channel{ + channelConnectionCommon: channelConnectionCommon{ + log: logger, + relayLocal: toStringSet(opts.RelayLocalHandlers), + statsReporter: statsReporter, + subChannels: &subChannelMap{}, + timeNow: timeNow, + timeTicker: timeTicker, + tracer: opts.Tracer, + }, + chID: chID, + connectionOptions: opts.DefaultConnectionOptions.withDefaults(), + relayHost: opts.RelayHost, + relayMaxTimeout: validateRelayMaxTimeout(opts.RelayMaxTimeout, logger), + relayTimerVerify: opts.RelayTimerVerification, + closed: make(chan struct{}), + } + ch.peers = newRootPeerList(ch, opts.OnPeerStatusChanged).newChild() + + if opts.Handler != nil { + ch.handler = opts.Handler + } else { + ch.handler = channelHandler{ch} + } + + ch.mutable.peerInfo = LocalPeerInfo{ + PeerInfo: PeerInfo{ + ProcessName: processName, + HostPort: ephemeralHostPort, + IsEphemeral: true, + Version: PeerVersion{ + Language: "go", + LanguageVersion: strings.TrimPrefix(runtime.Version(), "go"), + TChannelVersion: VersionInfo, + }, + }, + ServiceName: serviceName, + } + ch.mutable.state = ChannelClient + ch.mutable.conns = make(map[uint32]*Connection) + ch.createCommonStats() + + // Register internal unless the root handler has been overridden, since + // Register will panic. + if opts.Handler == nil { + ch.registerInternal() + } + + registerNewChannel(ch) + + if opts.RelayHost != nil { + opts.RelayHost.SetChannel(ch) + } + + // Start the idle connection timer. + ch.mutable.idleSweep = startIdleSweep(ch, opts) + + return ch, nil +} + +// ConnectionOptions returns the channel's connection options. +func (ch *Channel) ConnectionOptions() *ConnectionOptions { + return &ch.connectionOptions +} + +// Serve serves incoming requests using the provided listener. +// The local peer info is set synchronously, but the actual socket listening is done in +// a separate goroutine. +func (ch *Channel) Serve(l net.Listener) error { + mutable := &ch.mutable + mutable.Lock() + defer mutable.Unlock() + + if mutable.l != nil { + return errAlreadyListening + } + mutable.l = tnet.Wrap(l) + + if mutable.state != ChannelClient { + return errInvalidStateForOp + } + mutable.state = ChannelListening + + mutable.peerInfo.HostPort = l.Addr().String() + mutable.peerInfo.IsEphemeral = false + ch.log = ch.log.WithFields(LogField{"hostPort", mutable.peerInfo.HostPort}) + ch.log.Info("Channel is listening.") + go ch.serve() + return nil +} + +// ListenAndServe listens on the given address and serves incoming requests. +// The port may be 0, in which case the channel will use an OS assigned port +// This method does not block as the handling of connections is done in a goroutine. +func (ch *Channel) ListenAndServe(hostPort string) error { + mutable := &ch.mutable + mutable.RLock() + + if mutable.l != nil { + mutable.RUnlock() + return errAlreadyListening + } + + l, err := net.Listen("tcp", hostPort) + if err != nil { + mutable.RUnlock() + return err + } + + mutable.RUnlock() + return ch.Serve(l) +} + +// Registrar is the base interface for registering handlers on either the base +// Channel or the SubChannel +type Registrar interface { + // ServiceName returns the service name that this Registrar is for. + ServiceName() string + + // Register registers a handler for ServiceName and the given method. + Register(h Handler, methodName string) + + // Logger returns the logger for this Registrar. + Logger() Logger + + // StatsReporter returns the stats reporter for this Registrar + StatsReporter() StatsReporter + + // StatsTags returns the tags that should be used. + StatsTags() map[string]string + + // Peers returns the peer list for this Registrar. + Peers() *PeerList +} + +// Register registers a handler for a method. +// +// The handler is registered with the service name used when the Channel was +// created. To register a handler with a different service name, obtain a +// SubChannel for that service with GetSubChannel, and Register a handler +// under that. You may also use SetHandler on a SubChannel to set up a +// catch-all Handler for that service. See the docs for SetHandler for more +// information. +// +// Register panics if the channel was constructed with an alternate root +// handler. +func (ch *Channel) Register(h Handler, methodName string) { + if _, ok := ch.handler.(channelHandler); !ok { + panic("can't register handler when channel configured with alternate root handler") + } + ch.GetSubChannel(ch.PeerInfo().ServiceName).Register(h, methodName) +} + +// PeerInfo returns the current peer info for the channel +func (ch *Channel) PeerInfo() LocalPeerInfo { + ch.mutable.RLock() + peerInfo := ch.mutable.peerInfo + ch.mutable.RUnlock() + + return peerInfo +} + +func (ch *Channel) createCommonStats() { + ch.commonStatsTags = map[string]string{ + "app": ch.mutable.peerInfo.ProcessName, + "service": ch.mutable.peerInfo.ServiceName, + } + host, err := os.Hostname() + if err != nil { + ch.log.WithFields(ErrField(err)).Info("Channel creation failed to get host.") + return + } + ch.commonStatsTags["host"] = host + // TODO(prashant): Allow user to pass extra tags (such as cluster, version). +} + +// GetSubChannel returns a SubChannel for the given service name. If the subchannel does not +// exist, it is created. +func (ch *Channel) GetSubChannel(serviceName string, opts ...SubChannelOption) *SubChannel { + sub, added := ch.subChannels.getOrAdd(serviceName, ch) + if added { + for _, opt := range opts { + opt(sub) + } + } + return sub +} + +// Peers returns the PeerList for the channel. +func (ch *Channel) Peers() *PeerList { + return ch.peers +} + +// RootPeers returns the root PeerList for the channel, which is the sole place +// new Peers are created. All children of the root list (including ch.Peers()) +// automatically re-use peers from the root list and create new peers in the +// root list. +func (ch *Channel) RootPeers() *RootPeerList { + return ch.peers.parent +} + +// BeginCall starts a new call to a remote peer, returning an OutboundCall that can +// be used to write the arguments of the call. +func (ch *Channel) BeginCall(ctx context.Context, hostPort, serviceName, methodName string, callOptions *CallOptions) (*OutboundCall, error) { + p := ch.RootPeers().GetOrAdd(hostPort) + return p.BeginCall(ctx, serviceName, methodName, callOptions) +} + +// serve runs the listener to accept and manage new incoming connections, blocking +// until the channel is closed. +func (ch *Channel) serve() { + acceptBackoff := 0 * time.Millisecond + + for { + netConn, err := ch.mutable.l.Accept() + if err != nil { + // Backoff from new accepts if this is a temporary error + if ne, ok := err.(net.Error); ok && ne.Temporary() { + if acceptBackoff == 0 { + acceptBackoff = 5 * time.Millisecond + } else { + acceptBackoff *= 2 + } + if max := 1 * time.Second; acceptBackoff > max { + acceptBackoff = max + } + ch.log.WithFields( + ErrField(err), + LogField{"backoff", acceptBackoff}, + ).Warn("Accept error, will wait and retry.") + time.Sleep(acceptBackoff) + continue + } else { + // Only log an error if this didn't happen due to a Close. + if ch.State() >= ChannelStartClose { + return + } + ch.log.WithFields(ErrField(err)).Fatal("Unrecoverable accept error, closing server.") + return + } + } + + acceptBackoff = 0 + + // Perform the connection handshake in a background goroutine. + go func() { + // Register the connection in the peer once the channel is set up. + events := connectionEvents{ + OnActive: ch.inboundConnectionActive, + OnCloseStateChange: ch.connectionCloseStateChange, + OnExchangeUpdated: ch.exchangeUpdated, + } + if _, err := ch.inboundHandshake(context.Background(), netConn, events); err != nil { + netConn.Close() + } + }() + } +} + +// Ping sends a ping message to the given hostPort and waits for a response. +func (ch *Channel) Ping(ctx context.Context, hostPort string) error { + peer := ch.RootPeers().GetOrAdd(hostPort) + conn, err := peer.GetConnection(ctx) + if err != nil { + return err + } + + return conn.ping(ctx) +} + +// Logger returns the logger for this channel. +func (ch *Channel) Logger() Logger { + return ch.log +} + +// StatsReporter returns the stats reporter for this channel. +func (ch *Channel) StatsReporter() StatsReporter { + return ch.statsReporter +} + +// StatsTags returns the common tags that should be used when reporting stats. +// It returns a new map for each call. +func (ch *Channel) StatsTags() map[string]string { + m := make(map[string]string) + for k, v := range ch.commonStatsTags { + m[k] = v + } + return m +} + +// ServiceName returns the serviceName that this channel was created for. +func (ch *Channel) ServiceName() string { + return ch.PeerInfo().ServiceName +} + +// Connect creates a new outbound connection to hostPort. +func (ch *Channel) Connect(ctx context.Context, hostPort string) (*Connection, error) { + switch state := ch.State(); state { + case ChannelClient, ChannelListening: + break + default: + ch.log.Debugf("Connect rejecting new connection as state is %v", state) + return nil, errInvalidStateForOp + } + + // The context timeout applies to the whole call, but users may want a lower + // connect timeout (e.g. for streams). + if params := getTChannelParams(ctx); params != nil && params.connectTimeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, params.connectTimeout) + defer cancel() + } + + events := connectionEvents{ + OnActive: ch.outboundConnectionActive, + OnCloseStateChange: ch.connectionCloseStateChange, + OnExchangeUpdated: ch.exchangeUpdated, + } + + if err := ctx.Err(); err != nil { + return nil, GetContextError(err) + } + + timeout := getTimeout(ctx) + tcpConn, err := dialContext(ctx, hostPort) + if err != nil { + if ne, ok := err.(net.Error); ok && ne.Timeout() { + ch.log.WithFields( + LogField{"remoteHostPort", hostPort}, + LogField{"timeout", timeout}, + ).Info("Outbound net.Dial timed out.") + err = ErrTimeout + } else if ctx.Err() == context.Canceled { + ch.log.WithFields( + LogField{"remoteHostPort", hostPort}, + ).Info("Outbound net.Dial was cancelled.") + err = GetContextError(ErrRequestCancelled) + } else { + ch.log.WithFields( + ErrField(err), + LogField{"remoteHostPort", hostPort}, + ).Info("Outbound net.Dial failed.") + } + return nil, err + } + + conn, err := ch.outboundHandshake(ctx, tcpConn, hostPort, events) + if conn != nil { + // It's possible that the connection we just created responds with a host:port + // that is not what we tried to connect to. E.g., we may have connected to + // 127.0.0.1:1234, but the returned host:port may be 10.0.0.1:1234. + // In this case, the connection won't be added to 127.0.0.1:1234 peer + // and so future calls to that peer may end up creating new connections. To + // avoid this issue, and to avoid clients being aware of any TCP relays, we + // add the connection to the intended peer. + if hostPort != conn.remotePeerInfo.HostPort { + conn.log.Debugf("Outbound connection host:port mismatch, adding to peer %v", conn.remotePeerInfo.HostPort) + ch.addConnectionToPeer(hostPort, conn, outbound) + } + } + + return conn, err +} + +// exchangeUpdated updates the peer heap. +func (ch *Channel) exchangeUpdated(c *Connection) { + if c.remotePeerInfo.HostPort == "" { + // Hostport is unknown until we get init resp. + return + } + + p, ok := ch.RootPeers().Get(c.remotePeerInfo.HostPort) + if !ok { + return + } + + ch.updatePeer(p) +} + +// updatePeer updates the score of the peer and update it's position in heap as well. +func (ch *Channel) updatePeer(p *Peer) { + ch.peers.onPeerChange(p) + ch.subChannels.updatePeer(p) + p.callOnUpdateComplete() +} + +// addConnection adds the connection to the channel's list of connection +// if the channel is in a valid state to accept this connection. It returns +// whether the connection was added. +func (ch *Channel) addConnection(c *Connection, direction connectionDirection) bool { + ch.mutable.Lock() + defer ch.mutable.Unlock() + + if c.readState() != connectionActive { + return false + } + + switch state := ch.mutable.state; state { + case ChannelClient, ChannelListening: + break + default: + return false + } + + ch.mutable.conns[c.connID] = c + return true +} + +func (ch *Channel) connectionActive(c *Connection, direction connectionDirection) { + c.log.Debugf("New active %v connection for peer %v", direction, c.remotePeerInfo.HostPort) + + if added := ch.addConnection(c, direction); !added { + // The channel isn't in a valid state to accept this connection, close the connection. + c.close(LogField{"reason", "new active connection on closing channel"}) + return + } + + ch.addConnectionToPeer(c.remotePeerInfo.HostPort, c, direction) +} + +func (ch *Channel) addConnectionToPeer(hostPort string, c *Connection, direction connectionDirection) { + p := ch.RootPeers().GetOrAdd(hostPort) + if err := p.addConnection(c, direction); err != nil { + c.log.WithFields( + LogField{"remoteHostPort", c.remotePeerInfo.HostPort}, + LogField{"direction", direction}, + ErrField(err), + ).Warn("Failed to add connection to peer.") + } + + ch.updatePeer(p) +} + +func (ch *Channel) inboundConnectionActive(c *Connection) { + ch.connectionActive(c, inbound) +} + +func (ch *Channel) outboundConnectionActive(c *Connection) { + ch.connectionActive(c, outbound) +} + +// removeClosedConn removes a connection if it's closed. +// Until a connection is fully closed, the channel must keep track of it. +func (ch *Channel) removeClosedConn(c *Connection) { + if c.readState() != connectionClosed { + return + } + + ch.mutable.Lock() + delete(ch.mutable.conns, c.connID) + ch.mutable.Unlock() +} + +func (ch *Channel) getMinConnectionState() connectionState { + minState := connectionClosed + for _, c := range ch.mutable.conns { + if s := c.readState(); s < minState { + minState = s + } + } + return minState +} + +// connectionCloseStateChange is called when a connection's close state changes. +func (ch *Channel) connectionCloseStateChange(c *Connection) { + ch.removeClosedConn(c) + if peer, ok := ch.RootPeers().Get(c.remotePeerInfo.HostPort); ok { + peer.connectionCloseStateChange(c) + ch.updatePeer(peer) + } + if c.outboundHP != "" && c.outboundHP != c.remotePeerInfo.HostPort { + // Outbound connections may be in multiple peers. + if peer, ok := ch.RootPeers().Get(c.outboundHP); ok { + peer.connectionCloseStateChange(c) + ch.updatePeer(peer) + } + } + + chState := ch.State() + if chState != ChannelStartClose && chState != ChannelInboundClosed { + return + } + + ch.mutable.RLock() + minState := ch.getMinConnectionState() + ch.mutable.RUnlock() + + var updateTo ChannelState + if minState >= connectionClosed { + updateTo = ChannelClosed + } else if minState >= connectionInboundClosed && chState == ChannelStartClose { + updateTo = ChannelInboundClosed + } + + var updatedToState ChannelState + if updateTo > 0 { + ch.mutable.Lock() + // Recheck the state as it's possible another goroutine changed the state + // from what we expected, and so we might make a stale change. + if ch.mutable.state == chState { + ch.mutable.state = updateTo + updatedToState = updateTo + } + ch.mutable.Unlock() + chState = updateTo + } + + c.log.Debugf("ConnectionCloseStateChange channel state = %v connection minState = %v", + chState, minState) + + if updatedToState == ChannelClosed { + ch.onClosed() + } +} + +func (ch *Channel) onClosed() { + removeClosedChannel(ch) + + close(ch.closed) + ch.log.Infof("Channel closed.") +} + +// Closed returns whether this channel has been closed with .Close() +func (ch *Channel) Closed() bool { + return ch.State() == ChannelClosed +} + +// ClosedChan returns a channel that will close when the Channel has completely +// closed. +func (ch *Channel) ClosedChan() <-chan struct{} { + return ch.closed +} + +// State returns the current channel state. +func (ch *Channel) State() ChannelState { + ch.mutable.RLock() + state := ch.mutable.state + ch.mutable.RUnlock() + + return state +} + +// Close starts a graceful Close for the channel. This does not happen immediately: +// 1. This call closes the Listener and starts closing connections. +// 2. When all incoming connections are drained, the connection blocks new outgoing calls. +// 3. When all connections are drained, the channel's state is updated to Closed. +func (ch *Channel) Close() { + ch.Logger().Info("Channel.Close called.") + var connections []*Connection + var channelClosed bool + + func() { + ch.mutable.Lock() + defer ch.mutable.Unlock() + + if ch.mutable.state == ChannelClosed { + ch.Logger().Info("Channel already closed, skipping additional Close() calls") + return + } + + if ch.mutable.l != nil { + ch.mutable.l.Close() + } + + // Stop the idle connections timer. + ch.mutable.idleSweep.Stop() + + ch.mutable.state = ChannelStartClose + if len(ch.mutable.conns) == 0 { + ch.mutable.state = ChannelClosed + channelClosed = true + } + for _, c := range ch.mutable.conns { + connections = append(connections, c) + } + }() + + for _, c := range connections { + c.close(LogField{"reason", "channel closing"}) + } + + if channelClosed { + ch.onClosed() + } +} + +// RelayHost returns the channel's RelayHost, if any. +func (ch *Channel) RelayHost() RelayHost { + return ch.relayHost +} + +func (o *ChannelOptions) validateIdleCheck() error { + if o.IdleCheckInterval > 0 && o.MaxIdleTime <= 0 { + return errMaxIdleTimeNotSet + } + + return nil +} + +func toStringSet(ss []string) map[string]struct{} { + set := make(map[string]struct{}, len(ss)) + for _, s := range ss { + set[s] = struct{}{} + } + return set +} diff --git a/vendor/github.com/uber/tchannel-go/channelstate_string.go b/vendor/github.com/uber/tchannel-go/channelstate_string.go new file mode 100644 index 00000000..d34582c6 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/channelstate_string.go @@ -0,0 +1,17 @@ +// generated by stringer -type=ChannelState; DO NOT EDIT + +package tchannel + +import "fmt" + +const _ChannelState_name = "ChannelClientChannelListeningChannelStartCloseChannelInboundClosedChannelClosed" + +var _ChannelState_index = [...]uint8{0, 13, 29, 46, 66, 79} + +func (i ChannelState) String() string { + i -= 1 + if i < 0 || i+1 >= ChannelState(len(_ChannelState_index)) { + return fmt.Sprintf("ChannelState(%d)", i+1) + } + return _ChannelState_name[_ChannelState_index[i]:_ChannelState_index[i+1]] +} diff --git a/vendor/github.com/uber/tchannel-go/checksum.go b/vendor/github.com/uber/tchannel-go/checksum.go new file mode 100644 index 00000000..43e6d70b --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/checksum.go @@ -0,0 +1,175 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "hash" + "hash/crc32" + "sync" +) + +var checksumPools [checksumCount]sync.Pool + +// A ChecksumType is a checksum algorithm supported by TChannel for checksumming call bodies +type ChecksumType byte + +const ( + // ChecksumTypeNone indicates no checksum is included in the message + ChecksumTypeNone ChecksumType = 0 + + // ChecksumTypeCrc32 indicates the message checksum is calculated using crc32 + ChecksumTypeCrc32 ChecksumType = 1 + + // ChecksumTypeFarmhash indicates the message checksum is calculated using Farmhash + ChecksumTypeFarmhash ChecksumType = 2 + + // ChecksumTypeCrc32C indicates the message checksum is calculated using crc32c + ChecksumTypeCrc32C ChecksumType = 3 + + checksumCount = 4 +) + +func init() { + crc32CastagnoliTable := crc32.MakeTable(crc32.Castagnoli) + + ChecksumTypeNone.pool().New = func() interface{} { + return nullChecksum{} + } + ChecksumTypeCrc32.pool().New = func() interface{} { + return newHashChecksum(ChecksumTypeCrc32, crc32.NewIEEE()) + } + ChecksumTypeCrc32C.pool().New = func() interface{} { + return newHashChecksum(ChecksumTypeCrc32C, crc32.New(crc32CastagnoliTable)) + } + + // TODO: Implement farm hash. + ChecksumTypeFarmhash.pool().New = func() interface{} { + return nullChecksum{} + } +} + +// ChecksumSize returns the size in bytes of the checksum calculation +func (t ChecksumType) ChecksumSize() int { + switch t { + case ChecksumTypeNone: + return 0 + case ChecksumTypeCrc32, ChecksumTypeCrc32C: + return crc32.Size + case ChecksumTypeFarmhash: + return 4 + default: + return 0 + } +} + +// pool returns the sync.Pool used to pool checksums for this type. +func (t ChecksumType) pool() *sync.Pool { + return &checksumPools[int(t)] +} + +// New creates a new Checksum of the given type +func (t ChecksumType) New() Checksum { + s := t.pool().Get().(Checksum) + s.Reset() + return s +} + +// Release puts a Checksum back in the pool. +func (t ChecksumType) Release(checksum Checksum) { + t.pool().Put(checksum) +} + +// A Checksum calculates a running checksum against a bytestream +type Checksum interface { + // TypeCode returns the type of this checksum + TypeCode() ChecksumType + + // Size returns the size of the calculated checksum + Size() int + + // Add adds bytes to the checksum calculation + Add(b []byte) []byte + + // Sum returns the current checksum value + Sum() []byte + + // Release puts a Checksum back in the pool. + Release() + + // Reset resets the checksum state to the default 0 value. + Reset() +} + +// No checksum +type nullChecksum struct{} + +// TypeCode returns the type of the checksum +func (c nullChecksum) TypeCode() ChecksumType { return ChecksumTypeNone } + +// Size returns the size of the checksum data, in the case the null checksum this is zero +func (c nullChecksum) Size() int { return 0 } + +// Add adds a byteslice to the checksum calculation +func (c nullChecksum) Add(b []byte) []byte { return nil } + +// Sum returns the current checksum calculation +func (c nullChecksum) Sum() []byte { return nil } + +// Release puts a Checksum back in the pool. +func (c nullChecksum) Release() { + c.TypeCode().Release(c) +} + +// Reset resets the checksum state to the default 0 value. +func (c nullChecksum) Reset() {} + +// Hash Checksum +type hashChecksum struct { + checksumType ChecksumType + hash hash.Hash + sumCache []byte +} + +func newHashChecksum(t ChecksumType, hash hash.Hash) *hashChecksum { + return &hashChecksum{ + checksumType: t, + hash: hash, + sumCache: make([]byte, 0, 4), + } +} + +// TypeCode returns the type of the checksum +func (h *hashChecksum) TypeCode() ChecksumType { return h.checksumType } + +// Size returns the size of the checksum data +func (h *hashChecksum) Size() int { return h.hash.Size() } + +// Add adds a byte slice to the checksum calculation +func (h *hashChecksum) Add(b []byte) []byte { h.hash.Write(b); return h.Sum() } + +// Sum returns the current value of the checksum calculation +func (h *hashChecksum) Sum() []byte { return h.hash.Sum(h.sumCache) } + +// Release puts a Checksum back in the pool. +func (h *hashChecksum) Release() { h.TypeCode().Release(h) } + +// Reset resets the checksum state to the default 0 value. +func (h *hashChecksum) Reset() { h.hash.Reset() } diff --git a/vendor/github.com/uber/tchannel-go/codecov.yml b/vendor/github.com/uber/tchannel-go/codecov.yml new file mode 100644 index 00000000..15faf14e --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/codecov.yml @@ -0,0 +1,15 @@ +coverage: + range: 75..100 + round: down + precision: 2 + + status: + project: + default: + enabled: yes + target: 85% + if_not_found: success + if_ci_failed: error +ignore: +- "*_string.go" + diff --git a/vendor/github.com/uber/tchannel-go/connection.go b/vendor/github.com/uber/tchannel-go/connection.go new file mode 100644 index 00000000..937e1fd2 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/connection.go @@ -0,0 +1,873 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "errors" + "fmt" + "io" + "net" + "sync" + "time" + + "github.com/uber/tchannel-go/tos" + + "go.uber.org/atomic" + "golang.org/x/net/context" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +const ( + // CurrentProtocolVersion is the current version of the TChannel protocol + // supported by this stack + CurrentProtocolVersion = 0x02 + + // DefaultConnectTimeout is the default timeout used by net.Dial, if no timeout + // is specified in the context. + DefaultConnectTimeout = 5 * time.Second + + // defaultConnectionBufferSize is the default size for the connection's + // read and write channels. + defaultConnectionBufferSize = 512 +) + +// PeerVersion contains version related information for a specific peer. +// These values are extracted from the init headers. +type PeerVersion struct { + Language string `json:"language"` + LanguageVersion string `json:"languageVersion"` + TChannelVersion string `json:"tchannelVersion"` +} + +// PeerInfo contains information about a TChannel peer +type PeerInfo struct { + // The host and port that can be used to contact the peer, as encoded by net.JoinHostPort + HostPort string `json:"hostPort"` + + // The logical process name for the peer, used for only for logging / debugging + ProcessName string `json:"processName"` + + // IsEphemeral returns whether the remote host:port is ephemeral (e.g. not listening). + IsEphemeral bool `json:"isEphemeral"` + + // Version returns the version information for the remote peer. + Version PeerVersion `json:"version"` +} + +func (p PeerInfo) String() string { + return fmt.Sprintf("%s(%s)", p.HostPort, p.ProcessName) +} + +// IsEphemeralHostPort returns whether the connection is from an ephemeral host:port. +func (p PeerInfo) IsEphemeralHostPort() bool { + return p.IsEphemeral +} + +// LocalPeerInfo adds service name to the peer info, only required for the local peer. +type LocalPeerInfo struct { + PeerInfo + + // ServiceName is the service name for the local peer. + ServiceName string `json:"serviceName"` +} + +func (p LocalPeerInfo) String() string { + return fmt.Sprintf("%v: %v", p.ServiceName, p.PeerInfo) +} + +var ( + // ErrConnectionClosed is returned when a caller performs an method + // on a closed connection + ErrConnectionClosed = errors.New("connection is closed") + + // ErrSendBufferFull is returned when a message cannot be sent to the + // peer because the frame sending buffer has become full. Typically + // this indicates that the connection is stuck and writes have become + // backed up + ErrSendBufferFull = errors.New("connection send buffer is full, cannot send frame") + + // ErrConnectionNotReady is no longer used. + ErrConnectionNotReady = errors.New("connection is not yet ready") +) + +// errConnectionInvalidState is returned when the connection is in an unknown state. +type errConnectionUnknownState struct { + site string + state connectionState +} + +func (e errConnectionUnknownState) Error() string { + return fmt.Sprintf("connection is in unknown state: %v at %v", e.state, e.site) +} + +// ConnectionOptions are options that control the behavior of a Connection +type ConnectionOptions struct { + // The frame pool, allowing better management of frame buffers. Defaults to using raw heap. + FramePool FramePool + + // NOTE: This is deprecated and not used for anything. + RecvBufferSize int + + // The size of send channel buffers. Defaults to 512. + SendBufferSize int + + // The type of checksum to use when sending messages. + ChecksumType ChecksumType + + // ToS class name marked on outbound packets. + TosPriority tos.ToS + + // HealthChecks configures active connection health checking for this channel. + // By default, health checks are not enabled. + HealthChecks HealthCheckOptions + + // MaxCloseTime controls how long we allow a connection to complete pending + // calls before shutting down. Only used if it is non-zero. + MaxCloseTime time.Duration +} + +// connectionEvents are the events that can be triggered by a connection. +type connectionEvents struct { + // OnActive is called when a connection becomes active. + OnActive func(c *Connection) + + // OnCloseStateChange is called when a connection that is closing changes state. + OnCloseStateChange func(c *Connection) + + // OnExchangeUpdated is called when a message exchange added or removed. + OnExchangeUpdated func(c *Connection) +} + +// Connection represents a connection to a remote peer. +type Connection struct { + channelConnectionCommon + + connID uint32 + connDirection connectionDirection + opts ConnectionOptions + conn net.Conn + localPeerInfo LocalPeerInfo + remotePeerInfo PeerInfo + sendCh chan *Frame + stopCh chan struct{} + state connectionState + stateMut sync.RWMutex + inbound *messageExchangeSet + outbound *messageExchangeSet + handler Handler + nextMessageID atomic.Uint32 + events connectionEvents + commonStatsTags map[string]string + relay *Relayer + + // outboundHP is the host:port we used to create this outbound connection. + // It may not match remotePeerInfo.HostPort, in which case the connection is + // added to peers for both host:ports. For inbound connections, this is empty. + outboundHP string + + // closeNetworkCalled is used to avoid errors from being logged + // when this side closes a connection. + closeNetworkCalled atomic.Bool + // stoppedExchanges is atomically set when exchanges are stopped due to error. + stoppedExchanges atomic.Bool + // remotePeerAddress is used as a cache for remote peer address parsed into individual + // components that can be used to set peer tags on OpenTracing Span. + remotePeerAddress peerAddressComponents + + // healthCheckCtx/Quit are used to stop health checks. + healthCheckCtx context.Context + healthCheckQuit context.CancelFunc + healthCheckDone chan struct{} + healthCheckHistory *healthHistory + + // lastActivity is used to track how long the connection has been idle. + // (unix time, nano) + lastActivity atomic.Int64 +} + +type peerAddressComponents struct { + port uint16 + ipv4 uint32 + ipv6 string + hostname string +} + +// _nextConnID is used to allocate unique IDs to every connection for debugging purposes. +var _nextConnID atomic.Uint32 + +type connectionState int + +const ( + // Connection is fully active + connectionActive connectionState = iota + 1 + + // Connection is starting to close; new incoming requests are rejected, outbound + // requests are allowed to proceed + connectionStartClose + + // Connection has finished processing all active inbound, and is + // waiting for outbound requests to complete or timeout + connectionInboundClosed + + // Connection is fully closed + connectionClosed +) + +//go:generate stringer -type=connectionState + +func getTimeout(ctx context.Context) time.Duration { + deadline, ok := ctx.Deadline() + if !ok { + return DefaultConnectTimeout + } + + return deadline.Sub(time.Now()) +} + +func (co ConnectionOptions) withDefaults() ConnectionOptions { + if co.ChecksumType == ChecksumTypeNone { + co.ChecksumType = ChecksumTypeCrc32 + } + if co.FramePool == nil { + co.FramePool = DefaultFramePool + } + if co.SendBufferSize <= 0 { + co.SendBufferSize = defaultConnectionBufferSize + } + co.HealthChecks = co.HealthChecks.withDefaults() + return co +} + +func (ch *Channel) setConnectionTosPriority(tosPriority tos.ToS, c net.Conn) error { + tcpAddr, isTCP := c.RemoteAddr().(*net.TCPAddr) + if !isTCP { + return nil + } + + // Handle dual stack listeners and set Traffic Class. + var err error + switch ip := tcpAddr.IP; { + case ip.To16() != nil && ip.To4() == nil: + err = ipv6.NewConn(c).SetTrafficClass(int(tosPriority)) + case ip.To4() != nil: + err = ipv4.NewConn(c).SetTOS(int(tosPriority)) + } + return err +} + +func (ch *Channel) newConnection(conn net.Conn, initialID uint32, outboundHP string, remotePeer PeerInfo, remotePeerAddress peerAddressComponents, events connectionEvents) *Connection { + opts := ch.connectionOptions.withDefaults() + + connID := _nextConnID.Inc() + connDirection := inbound + log := ch.log.WithFields(LogFields{ + {"connID", connID}, + {"localAddr", conn.LocalAddr().String()}, + {"remoteAddr", conn.RemoteAddr().String()}, + {"remoteHostPort", remotePeer.HostPort}, + {"remoteIsEphemeral", remotePeer.IsEphemeral}, + {"remoteProcess", remotePeer.ProcessName}, + }...) + if outboundHP != "" { + connDirection = outbound + log = log.WithFields(LogField{"outboundHP", outboundHP}) + } + + log = log.WithFields(LogField{"connectionDirection", connDirection}) + peerInfo := ch.PeerInfo() + + c := &Connection{ + channelConnectionCommon: ch.channelConnectionCommon, + + connID: connID, + conn: conn, + connDirection: connDirection, + opts: opts, + state: connectionActive, + sendCh: make(chan *Frame, opts.SendBufferSize), + stopCh: make(chan struct{}), + localPeerInfo: peerInfo, + remotePeerInfo: remotePeer, + remotePeerAddress: remotePeerAddress, + outboundHP: outboundHP, + inbound: newMessageExchangeSet(log, messageExchangeSetInbound), + outbound: newMessageExchangeSet(log, messageExchangeSetOutbound), + handler: ch.handler, + events: events, + commonStatsTags: ch.commonStatsTags, + healthCheckHistory: newHealthHistory(), + lastActivity: *atomic.NewInt64(ch.timeNow().UnixNano()), + } + + if tosPriority := opts.TosPriority; tosPriority > 0 { + if err := ch.setConnectionTosPriority(tosPriority, conn); err != nil { + log.WithFields(ErrField(err)).Error("Failed to set ToS priority.") + } + } + + c.nextMessageID.Store(initialID) + c.log = log + c.inbound.onRemoved = c.checkExchanges + c.outbound.onRemoved = c.checkExchanges + c.inbound.onAdded = c.onExchangeAdded + c.outbound.onAdded = c.onExchangeAdded + + if ch.RelayHost() != nil { + c.relay = NewRelayer(ch, c) + } + + // Connections are activated as soon as they are created. + c.callOnActive() + + go c.readFrames(connID) + go c.writeFrames(connID) + return c +} + +func (c *Connection) onExchangeAdded() { + c.callOnExchangeChange() +} + +// IsActive returns whether this connection is in an active state. +func (c *Connection) IsActive() bool { + return c.readState() == connectionActive +} + +func (c *Connection) callOnActive() { + log := c.log + if remoteVersion := c.remotePeerInfo.Version; remoteVersion != (PeerVersion{}) { + log = log.WithFields(LogFields{ + {"remotePeerLanguage", remoteVersion.Language}, + {"remotePeerLanguageVersion", remoteVersion.LanguageVersion}, + {"remotePeerTChannelVersion", remoteVersion.TChannelVersion}, + }...) + } + log.Info("Created new active connection.") + + if f := c.events.OnActive; f != nil { + f(c) + } + + if c.opts.HealthChecks.enabled() { + c.healthCheckCtx, c.healthCheckQuit = context.WithCancel(context.Background()) + c.healthCheckDone = make(chan struct{}) + go c.healthCheck(c.connID) + } +} + +func (c *Connection) callOnCloseStateChange() { + if f := c.events.OnCloseStateChange; f != nil { + f(c) + } +} + +func (c *Connection) callOnExchangeChange() { + if f := c.events.OnExchangeUpdated; f != nil { + f(c) + } +} + +// ping sends a ping message and waits for a ping response. +func (c *Connection) ping(ctx context.Context) error { + req := &pingReq{id: c.NextMessageID()} + mex, err := c.outbound.newExchange(ctx, c.opts.FramePool, req.messageType(), req.ID(), 1) + if err != nil { + return c.connectionError("create ping exchange", err) + } + defer c.outbound.removeExchange(req.ID()) + + if err := c.sendMessage(req); err != nil { + return c.connectionError("send ping", err) + } + + return c.recvMessage(ctx, &pingRes{}, mex) +} + +// handlePingRes calls registered ping handlers. +func (c *Connection) handlePingRes(frame *Frame) bool { + if err := c.outbound.forwardPeerFrame(frame); err != nil { + c.log.WithFields(LogField{"response", frame.Header}).Warn("Unexpected ping response.") + return true + } + // ping req is waiting for this frame, and will release it. + return false +} + +// handlePingReq responds to the pingReq message with a pingRes. +func (c *Connection) handlePingReq(frame *Frame) { + if state := c.readState(); state != connectionActive { + c.protocolError(frame.Header.ID, errConnNotActive{"ping on incoming", state}) + return + } + + pingRes := &pingRes{id: frame.Header.ID} + if err := c.sendMessage(pingRes); err != nil { + c.connectionError("send pong", err) + } +} + +// sendMessage sends a standalone message (typically a control message) +func (c *Connection) sendMessage(msg message) error { + frame := c.opts.FramePool.Get() + if err := frame.write(msg); err != nil { + c.opts.FramePool.Release(frame) + return err + } + + select { + case c.sendCh <- frame: + return nil + default: + return ErrSendBufferFull + } +} + +// recvMessage blocks waiting for a standalone response message (typically a +// control message) +func (c *Connection) recvMessage(ctx context.Context, msg message, mex *messageExchange) error { + frame, err := mex.recvPeerFrameOfType(msg.messageType()) + if err != nil { + if err, ok := err.(errorMessage); ok { + return err.AsSystemError() + } + return err + } + + err = frame.read(msg) + c.opts.FramePool.Release(frame) + return err +} + +// RemotePeerInfo returns the peer info for the remote peer. +func (c *Connection) RemotePeerInfo() PeerInfo { + return c.remotePeerInfo +} + +// NextMessageID reserves the next available message id for this connection +func (c *Connection) NextMessageID() uint32 { + return c.nextMessageID.Inc() +} + +// SendSystemError sends an error frame for the given system error. +func (c *Connection) SendSystemError(id uint32, span Span, err error) error { + frame := c.opts.FramePool.Get() + + if err := frame.write(&errorMessage{ + id: id, + errCode: GetSystemErrorCode(err), + tracing: span, + message: GetSystemErrorMessage(err), + }); err != nil { + + // This shouldn't happen - it means writing the errorMessage is broken. + c.log.WithFields( + LogField{"remotePeer", c.remotePeerInfo}, + LogField{"id", id}, + ErrField(err), + ).Warn("Couldn't create outbound frame.") + return fmt.Errorf("failed to create outbound error frame: %v", err) + } + + // When sending errors, we hold the state rlock to ensure that sendCh is not closed + // as we are sending the frame. + return c.withStateRLock(func() error { + // Errors cannot be sent if the connection has been closed. + if c.state == connectionClosed { + c.log.WithFields( + LogField{"remotePeer", c.remotePeerInfo}, + LogField{"id", id}, + ).Info("Could not send error frame on closed connection.") + return fmt.Errorf("failed to send error frame, connection state %v", c.state) + } + + select { + case c.sendCh <- frame: // Good to go + return nil + default: // If the send buffer is full, log and return an error. + } + c.log.WithFields( + LogField{"remotePeer", c.remotePeerInfo}, + LogField{"id", id}, + ErrField(err), + ).Warn("Couldn't send outbound frame.") + return fmt.Errorf("failed to send error frame, buffer full") + }) +} + +func (c *Connection) logConnectionError(site string, err error) error { + errCode := ErrCodeNetwork + if err == io.EOF { + c.log.Debugf("Connection got EOF") + } else { + logger := c.log.WithFields( + LogField{"site", site}, + ErrField(err), + ) + + if se, ok := err.(SystemError); ok && se.Code() != ErrCodeNetwork { + errCode = se.Code() + logger.Error("Connection error.") + } else if ne, ok := err.(net.Error); ok && ne.Timeout() { + logger.Warn("Connection error due to timeout.") + } else { + logger.Info("Connection error.") + } + } + return NewWrappedSystemError(errCode, err) +} + +// connectionError handles a connection level error +func (c *Connection) connectionError(site string, err error) error { + var closeLogFields LogFields + if err == io.EOF { + closeLogFields = LogFields{{"reason", "network connection EOF"}} + } else { + closeLogFields = LogFields{ + {"reason", "connection error"}, + ErrField(err), + } + } + + c.stopHealthCheck() + err = c.logConnectionError(site, err) + c.close(closeLogFields...) + + // On any connection error, notify the exchanges of this error. + if c.stoppedExchanges.CAS(false, true) { + c.outbound.stopExchanges(err) + c.inbound.stopExchanges(err) + } + + // checkExchanges will close the connection due to stoppedExchanges. + c.checkExchanges() + return err +} + +func (c *Connection) protocolError(id uint32, err error) error { + c.log.WithFields(ErrField(err)).Warn("Protocol error.") + sysErr := NewWrappedSystemError(ErrCodeProtocol, err) + c.SendSystemError(id, Span{}, sysErr) + // Don't close the connection until the error has been sent. + c.close( + LogField{"reason", "protocol error"}, + ErrField(err), + ) + + // On any connection error, notify the exchanges of this error. + if c.stoppedExchanges.CAS(false, true) { + c.outbound.stopExchanges(sysErr) + c.inbound.stopExchanges(sysErr) + } + return sysErr +} + +// withStateLock performs an action with the connection state mutex locked +func (c *Connection) withStateLock(f func() error) error { + c.stateMut.Lock() + err := f() + c.stateMut.Unlock() + + return err +} + +// withStateRLock performs an action with the connection state mutex rlocked. +func (c *Connection) withStateRLock(f func() error) error { + c.stateMut.RLock() + err := f() + c.stateMut.RUnlock() + + return err +} + +func (c *Connection) readState() connectionState { + c.stateMut.RLock() + state := c.state + c.stateMut.RUnlock() + return state +} + +// readFrames is the loop that reads frames from the network connection and +// dispatches to the appropriate handler. Run within its own goroutine to +// prevent overlapping reads on the socket. Most handlers simply send the +// incoming frame to a channel; the init handlers are a notable exception, +// since we cannot process new frames until the initialization is complete. +func (c *Connection) readFrames(_ uint32) { + headerBuf := make([]byte, FrameHeaderSize) + + handleErr := func(err error) { + if !c.closeNetworkCalled.Load() { + c.connectionError("read frames", err) + } else { + c.log.Debugf("Ignoring error after connection was closed: %v", err) + } + } + + for { + // Read the header, avoid allocating the frame till we know the size + // we need to allocate. + if _, err := io.ReadFull(c.conn, headerBuf); err != nil { + handleErr(err) + return + } + + frame := c.opts.FramePool.Get() + if err := frame.ReadBody(headerBuf, c.conn); err != nil { + handleErr(err) + c.opts.FramePool.Release(frame) + return + } + + c.updateLastActivity(frame) + + var releaseFrame bool + if c.relay == nil { + releaseFrame = c.handleFrameNoRelay(frame) + } else { + releaseFrame = c.handleFrameRelay(frame) + } + if releaseFrame { + c.opts.FramePool.Release(frame) + } + } +} + +func (c *Connection) handleFrameRelay(frame *Frame) bool { + switch frame.Header.messageType { + case messageTypeCallReq, messageTypeCallReqContinue, messageTypeCallRes, messageTypeCallResContinue, messageTypeError: + if err := c.relay.Relay(frame); err != nil { + c.log.WithFields( + ErrField(err), + LogField{"header", frame.Header}, + LogField{"remotePeer", c.remotePeerInfo}, + ).Error("Failed to relay frame.") + } + return false + default: + return c.handleFrameNoRelay(frame) + } +} + +func (c *Connection) handleFrameNoRelay(frame *Frame) bool { + releaseFrame := true + + // call req and call res messages may not want the frame released immediately. + switch frame.Header.messageType { + case messageTypeCallReq: + releaseFrame = c.handleCallReq(frame) + case messageTypeCallReqContinue: + releaseFrame = c.handleCallReqContinue(frame) + case messageTypeCallRes: + releaseFrame = c.handleCallRes(frame) + case messageTypeCallResContinue: + releaseFrame = c.handleCallResContinue(frame) + case messageTypePingReq: + c.handlePingReq(frame) + case messageTypePingRes: + releaseFrame = c.handlePingRes(frame) + case messageTypeError: + releaseFrame = c.handleError(frame) + default: + // TODO(mmihic): Log and close connection with protocol error + c.log.WithFields( + LogField{"header", frame.Header}, + LogField{"remotePeer", c.remotePeerInfo}, + ).Error("Received unexpected frame.") + } + + return releaseFrame +} + +// writeFrames is the main loop that pulls frames from the send channel and +// writes them to the connection. +func (c *Connection) writeFrames(_ uint32) { + for { + select { + case f := <-c.sendCh: + if c.log.Enabled(LogLevelDebug) { + c.log.Debugf("Writing frame %s", f.Header) + } + + c.updateLastActivity(f) + err := f.WriteOut(c.conn) + c.opts.FramePool.Release(f) + if err != nil { + c.connectionError("write frames", err) + return + } + case <-c.stopCh: + // If there are frames in sendCh, we want to drain them. + if len(c.sendCh) > 0 { + continue + } + // Close the network once we're no longer writing frames. + c.closeNetwork() + return + } + } +} + +// updateLastActivity marks when the last message was received/sent on the channel. +// This is used for monitoring idle connections and timing them out. +func (c *Connection) updateLastActivity(frame *Frame) { + // Pings are ignored for last activity. + switch frame.Header.messageType { + case messageTypeCallReq, messageTypeCallReqContinue, messageTypeCallRes, messageTypeCallResContinue, messageTypeError: + c.lastActivity.Store(c.timeNow().UnixNano()) + } +} + +// hasPendingCalls returns whether there's any pending inbound or outbound calls on this connection. +func (c *Connection) hasPendingCalls() bool { + if c.inbound.count() > 0 || c.outbound.count() > 0 { + return true + } + if !c.relay.canClose() { + return true + } + + return false +} + +// checkExchanges is called whenever an exchange is removed, and when Close is called. +func (c *Connection) checkExchanges() { + c.callOnExchangeChange() + + moveState := func(fromState, toState connectionState) bool { + err := c.withStateLock(func() error { + if c.state != fromState { + return errors.New("") + } + c.state = toState + return nil + }) + return err == nil + } + + curState := c.readState() + origState := curState + + if curState != connectionClosed && c.stoppedExchanges.Load() { + if moveState(curState, connectionClosed) { + curState = connectionClosed + } + } + + if curState == connectionStartClose { + if !c.relay.canClose() { + return + } + if c.inbound.count() == 0 && moveState(connectionStartClose, connectionInboundClosed) { + curState = connectionInboundClosed + } + } + + if curState == connectionInboundClosed { + // Safety check -- this should never happen since we already did the check + // when transitioning to connectionInboundClosed. + if !c.relay.canClose() { + c.relay.logger.Error("Relay can't close even though state is InboundClosed.") + return + } + + if c.outbound.count() == 0 && moveState(connectionInboundClosed, connectionClosed) { + curState = connectionClosed + } + } + + if curState != origState { + // If the connection is closed, we can notify writeFrames to stop which + // closes the underlying network connection. We never close sendCh to avoid + // races causing panics, see 93ef5c112c8b321367ae52d2bd79396e2e874f31 + if curState == connectionClosed { + close(c.stopCh) + } + + c.log.WithFields( + LogField{"newState", curState}, + ).Debug("Connection state updated during shutdown.") + c.callOnCloseStateChange() + } +} + +func (c *Connection) close(fields ...LogField) error { + c.log.WithFields(fields...).Info("Connection closing.") + + // Update the state which will start blocking incoming calls. + if err := c.withStateLock(func() error { + switch s := c.state; s { + case connectionActive: + c.state = connectionStartClose + default: + return fmt.Errorf("connection must be Active to Close, but it is %v", s) + } + return nil + }); err != nil { + return err + } + + // Set a read deadline with any close timeout. This will cause a i/o timeout + // if the connection isn't closed by then. + if c.opts.MaxCloseTime > 0 { + c.conn.SetReadDeadline(c.timeNow().Add(c.opts.MaxCloseTime)) + } + + c.log.WithFields( + LogField{"newState", c.readState()}, + ).Debug("Connection state updated in Close.") + c.callOnCloseStateChange() + + // Check all in-flight requests to see whether we can transition the Close state. + c.checkExchanges() + + return nil +} + +// Close starts a graceful Close which will first reject incoming calls, reject outgoing calls +// before finally marking the connection state as closed. +func (c *Connection) Close() error { + return c.close(LogField{"reason", "user initiated"}) +} + +// closeNetwork closes the network connection and all network-related channels. +// This should only be done in response to a fatal connection or protocol +// error, or after all pending frames have been sent. +func (c *Connection) closeNetwork() { + // NB(mmihic): The sender goroutine will exit once the connection is + // closed; no need to close the send channel (and closing the send + // channel would be dangerous since other goroutine might be sending) + c.log.Debugf("Closing underlying network connection") + c.stopHealthCheck() + c.closeNetworkCalled.Store(true) + if err := c.conn.Close(); err != nil { + c.log.WithFields( + LogField{"remotePeer", c.remotePeerInfo}, + ErrField(err), + ).Warn("Couldn't close connection to peer.") + } +} + +// getLastActivityTime returns the timestamp of the last frame read or written, +// excluding pings. If no frames were transmitted yet, it will return the time +// this connection was created. +func (c *Connection) getLastActivityTime() time.Time { + return time.Unix(0, c.lastActivity.Load()) +} diff --git a/vendor/github.com/uber/tchannel-go/connection_direction.go b/vendor/github.com/uber/tchannel-go/connection_direction.go new file mode 100644 index 00000000..82f60547 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/connection_direction.go @@ -0,0 +1,41 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import "fmt" + +type connectionDirection int + +const ( + inbound connectionDirection = iota + 1 + outbound +) + +func (d connectionDirection) String() string { + switch d { + case inbound: + return "inbound" + case outbound: + return "outbound" + default: + return fmt.Sprintf("connectionDirection(%v)", int(d)) + } +} diff --git a/vendor/github.com/uber/tchannel-go/connectionstate_string.go b/vendor/github.com/uber/tchannel-go/connectionstate_string.go new file mode 100644 index 00000000..10907493 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/connectionstate_string.go @@ -0,0 +1,17 @@ +// Code generated by "stringer -type=connectionState"; DO NOT EDIT + +package tchannel + +import "fmt" + +const _connectionState_name = "connectionActiveconnectionStartCloseconnectionInboundClosedconnectionClosed" + +var _connectionState_index = [...]uint8{0, 16, 36, 59, 75} + +func (i connectionState) String() string { + i -= 1 + if i < 0 || i >= connectionState(len(_connectionState_index)-1) { + return fmt.Sprintf("connectionState(%d)", i+1) + } + return _connectionState_name[_connectionState_index[i]:_connectionState_index[i+1]] +} diff --git a/vendor/github.com/uber/tchannel-go/context.go b/vendor/github.com/uber/tchannel-go/context.go new file mode 100644 index 00000000..56ad4e29 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/context.go @@ -0,0 +1,123 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "time" + + "golang.org/x/net/context" +) + +const defaultTimeout = time.Second + +type contextKey int + +const ( + contextKeyTChannel contextKey = iota + contextKeyHeaders +) + +type tchannelCtxParams struct { + tracingDisabled bool + hideListeningOnOutbound bool + call IncomingCall + options *CallOptions + retryOptions *RetryOptions + connectTimeout time.Duration +} + +// IncomingCall exposes properties for incoming calls through the context. +type IncomingCall interface { + // CallerName returns the caller name from the CallerName transport header. + CallerName() string + + // ShardKey returns the shard key from the ShardKey transport header. + ShardKey() string + + // RoutingKey returns the routing key (referring to a traffic group) from + // RoutingKey transport header. + RoutingKey() string + + // RoutingDelegate returns the routing delegate from RoutingDelegate + // transport header. + RoutingDelegate() string + + // LocalPeer returns the local peer information. + LocalPeer() LocalPeerInfo + + // RemotePeer returns the caller's peer information. + // If the caller is an ephemeral peer, then the HostPort cannot be used to make new + // connections to the caller. + RemotePeer() PeerInfo + + // CallOptions returns the call options set for the incoming call. It can be + // useful for forwarding requests. + CallOptions() *CallOptions +} + +func getTChannelParams(ctx context.Context) *tchannelCtxParams { + if params, ok := ctx.Value(contextKeyTChannel).(*tchannelCtxParams); ok { + return params + } + return nil +} + +// NewContext returns a new root context used to make TChannel requests. +func NewContext(timeout time.Duration) (context.Context, context.CancelFunc) { + return NewContextBuilder(timeout).Build() +} + +// WrapContextForTest returns a copy of the given Context that is associated with the call. +// This should be used in units test only. +// NOTE: This method is deprecated. Callers should use NewContextBuilder().SetIncomingCallForTest. +func WrapContextForTest(ctx context.Context, call IncomingCall) context.Context { + getTChannelParams(ctx).call = call + return ctx +} + +// newIncomingContext creates a new context for an incoming call with the given span. +func newIncomingContext(call IncomingCall, timeout time.Duration) (context.Context, context.CancelFunc) { + return NewContextBuilder(timeout). + setIncomingCall(call). + Build() +} + +// CurrentCall returns the current incoming call, or nil if this is not an incoming call context. +func CurrentCall(ctx context.Context) IncomingCall { + if params := getTChannelParams(ctx); params != nil { + return params.call + } + return nil +} + +func currentCallOptions(ctx context.Context) *CallOptions { + if params := getTChannelParams(ctx); params != nil { + return params.options + } + return nil +} + +func isTracingDisabled(ctx context.Context) bool { + if params := getTChannelParams(ctx); params != nil { + return params.tracingDisabled + } + return false +} diff --git a/vendor/github.com/uber/tchannel-go/context_builder.go b/vendor/github.com/uber/tchannel-go/context_builder.go new file mode 100644 index 00000000..2f424aeb --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/context_builder.go @@ -0,0 +1,244 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "time" + + "golang.org/x/net/context" +) + +// ContextBuilder stores all TChannel-specific parameters that will +// be stored inside of a context. +type ContextBuilder struct { + // TracingDisabled disables trace reporting for calls using this context. + TracingDisabled bool + + // hideListeningOnOutbound disables sending the listening server's host:port + // when creating new outgoing connections. + hideListeningOnOutbound bool + + // replaceParentHeaders is set to true when SetHeaders() method is called. + // It forces headers from ParentContext to be ignored. When false, parent + // headers will be merged with headers accumulated by the builder. + replaceParentHeaders bool + + // If Timeout is zero, Build will default to defaultTimeout. + Timeout time.Duration + + // Headers are application headers that json/thrift will encode into arg2. + Headers map[string]string + + // CallOptions are TChannel call options for the specific call. + CallOptions *CallOptions + + // RetryOptions are the retry options for this call. + RetryOptions *RetryOptions + + // ConnectTimeout is the timeout for creating a TChannel connection. + ConnectTimeout time.Duration + + // ParentContext to build the new context from. If empty, context.Background() is used. + // The new (child) context inherits a number of properties from the parent context: + // - context fields, accessible via `ctx.Value(key)` + // - headers if parent is a ContextWithHeaders, unless replaced via SetHeaders() + ParentContext context.Context + + // Hidden fields: we do not want users outside of tchannel to set these. + incomingCall IncomingCall +} + +// NewContextBuilder returns a builder that can be used to create a Context. +func NewContextBuilder(timeout time.Duration) *ContextBuilder { + return &ContextBuilder{ + Timeout: timeout, + } +} + +// SetTimeout sets the timeout for the Context. +func (cb *ContextBuilder) SetTimeout(timeout time.Duration) *ContextBuilder { + cb.Timeout = timeout + return cb +} + +// AddHeader adds a single application header to the Context. +func (cb *ContextBuilder) AddHeader(key, value string) *ContextBuilder { + if cb.Headers == nil { + cb.Headers = map[string]string{key: value} + } else { + cb.Headers[key] = value + } + return cb +} + +// SetHeaders sets the application headers for this Context. +// If there is a ParentContext, its headers will be ignored after the call to this method. +func (cb *ContextBuilder) SetHeaders(headers map[string]string) *ContextBuilder { + cb.Headers = headers + cb.replaceParentHeaders = true + return cb +} + +// SetShardKey sets the ShardKey call option ("sk" transport header). +func (cb *ContextBuilder) SetShardKey(sk string) *ContextBuilder { + if cb.CallOptions == nil { + cb.CallOptions = new(CallOptions) + } + cb.CallOptions.ShardKey = sk + return cb +} + +// SetFormat sets the Format call option ("as" transport header). +func (cb *ContextBuilder) SetFormat(f Format) *ContextBuilder { + if cb.CallOptions == nil { + cb.CallOptions = new(CallOptions) + } + cb.CallOptions.Format = f + return cb +} + +// SetRoutingKey sets the RoutingKey call options ("rk" transport header). +func (cb *ContextBuilder) SetRoutingKey(rk string) *ContextBuilder { + if cb.CallOptions == nil { + cb.CallOptions = new(CallOptions) + } + cb.CallOptions.RoutingKey = rk + return cb +} + +// SetRoutingDelegate sets the RoutingDelegate call options ("rd" transport header). +func (cb *ContextBuilder) SetRoutingDelegate(rd string) *ContextBuilder { + if cb.CallOptions == nil { + cb.CallOptions = new(CallOptions) + } + cb.CallOptions.RoutingDelegate = rd + return cb +} + +// SetConnectTimeout sets the ConnectionTimeout for this context. +// The context timeout applies to the whole call, while the connect +// timeout only applies to creating a new connection. +func (cb *ContextBuilder) SetConnectTimeout(d time.Duration) *ContextBuilder { + cb.ConnectTimeout = d + return cb +} + +// HideListeningOnOutbound hides the host:port when creating new outbound +// connections. +func (cb *ContextBuilder) HideListeningOnOutbound() *ContextBuilder { + cb.hideListeningOnOutbound = true + return cb +} + +// DisableTracing disables tracing. +func (cb *ContextBuilder) DisableTracing() *ContextBuilder { + cb.TracingDisabled = true + return cb +} + +// SetIncomingCallForTest sets an IncomingCall in the context. +// This should only be used in unit tests. +func (cb *ContextBuilder) SetIncomingCallForTest(call IncomingCall) *ContextBuilder { + return cb.setIncomingCall(call) +} + +// SetRetryOptions sets RetryOptions in the context. +func (cb *ContextBuilder) SetRetryOptions(retryOptions *RetryOptions) *ContextBuilder { + cb.RetryOptions = retryOptions + return cb +} + +// SetTimeoutPerAttempt sets TimeoutPerAttempt in RetryOptions. +func (cb *ContextBuilder) SetTimeoutPerAttempt(timeoutPerAttempt time.Duration) *ContextBuilder { + if cb.RetryOptions == nil { + cb.RetryOptions = &RetryOptions{} + } + cb.RetryOptions.TimeoutPerAttempt = timeoutPerAttempt + return cb +} + +// SetParentContext sets the parent for the Context. +func (cb *ContextBuilder) SetParentContext(ctx context.Context) *ContextBuilder { + cb.ParentContext = ctx + return cb +} + +func (cb *ContextBuilder) setIncomingCall(call IncomingCall) *ContextBuilder { + cb.incomingCall = call + return cb +} + +func (cb *ContextBuilder) getHeaders() map[string]string { + if cb.ParentContext == nil || cb.replaceParentHeaders { + return cb.Headers + } + + parent, ok := cb.ParentContext.Value(contextKeyHeaders).(*headersContainer) + if !ok || len(parent.reqHeaders) == 0 { + return cb.Headers + } + + mergedHeaders := make(map[string]string, len(cb.Headers)+len(parent.reqHeaders)) + for k, v := range parent.reqHeaders { + mergedHeaders[k] = v + } + for k, v := range cb.Headers { + mergedHeaders[k] = v + } + return mergedHeaders +} + +// Build returns a ContextWithHeaders that can be used to make calls. +func (cb *ContextBuilder) Build() (ContextWithHeaders, context.CancelFunc) { + params := &tchannelCtxParams{ + options: cb.CallOptions, + call: cb.incomingCall, + retryOptions: cb.RetryOptions, + connectTimeout: cb.ConnectTimeout, + hideListeningOnOutbound: cb.hideListeningOnOutbound, + tracingDisabled: cb.TracingDisabled, + } + + parent := cb.ParentContext + if parent == nil { + parent = context.Background() + } else if headerCtx, ok := parent.(headerCtx); ok { + // Unwrap any headerCtx, since we'll be rewrapping anyway. + parent = headerCtx.Context + } + + var ( + ctx context.Context + cancel context.CancelFunc + ) + // All contexts created must have a timeout, but if the parent + // already has a timeout, and the user has not specified one, then we + // can use context.WithCancel + _, parentHasDeadline := parent.Deadline() + if cb.Timeout == 0 && parentHasDeadline { + ctx, cancel = context.WithCancel(parent) + } else { + ctx, cancel = context.WithTimeout(parent, cb.Timeout) + } + + ctx = context.WithValue(ctx, contextKeyTChannel, params) + return WrapWithHeaders(ctx, cb.getHeaders()), cancel +} diff --git a/vendor/github.com/uber/tchannel-go/context_header.go b/vendor/github.com/uber/tchannel-go/context_header.go new file mode 100644 index 00000000..3a333af0 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/context_header.go @@ -0,0 +1,121 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import "golang.org/x/net/context" + +// ContextWithHeaders is a Context which contains request and response headers. +type ContextWithHeaders interface { + context.Context + + // Headers returns the call request headers. + Headers() map[string]string + + // ResponseHeaders returns the call response headers. + ResponseHeaders() map[string]string + + // SetResponseHeaders sets the given response headers on the context. + SetResponseHeaders(map[string]string) + + // Child creates a child context which stores headers separately from + // the parent context. + Child() ContextWithHeaders +} + +type headerCtx struct { + context.Context +} + +// headersContainer stores the headers, and is itself stored in the context under `contextKeyHeaders` +type headersContainer struct { + reqHeaders map[string]string + respHeaders map[string]string +} + +func (c headerCtx) headers() *headersContainer { + if h, ok := c.Value(contextKeyHeaders).(*headersContainer); ok { + return h + } + return nil +} + +// Headers gets application headers out of the context. +func (c headerCtx) Headers() map[string]string { + if h := c.headers(); h != nil { + return h.reqHeaders + } + return nil +} + +// ResponseHeaders returns the response headers. +func (c headerCtx) ResponseHeaders() map[string]string { + if h := c.headers(); h != nil { + return h.respHeaders + } + return nil +} + +// SetResponseHeaders sets the response headers. +func (c headerCtx) SetResponseHeaders(headers map[string]string) { + if h := c.headers(); h != nil { + h.respHeaders = headers + return + } + panic("SetResponseHeaders called on ContextWithHeaders not created via WrapWithHeaders") +} + +// Child creates a child context with a separate container for headers. +func (c headerCtx) Child() ContextWithHeaders { + var headersCopy headersContainer + if h := c.headers(); h != nil { + headersCopy = *h + } + + return Wrap(context.WithValue(c.Context, contextKeyHeaders, &headersCopy)) +} + +// Wrap wraps an existing context.Context into a ContextWithHeaders. +// If the underlying context has headers, they are preserved. +func Wrap(ctx context.Context) ContextWithHeaders { + hctx := headerCtx{Context: ctx} + if h := hctx.headers(); h != nil { + return hctx + } + + // If there is no header container, we should create an empty one. + return WrapWithHeaders(ctx, nil) +} + +// WrapWithHeaders returns a Context that can be used to make a call with request headers. +// If the parent `ctx` is already an instance of ContextWithHeaders, its existing headers +// will be ignored. In order to merge new headers with parent headers, use ContextBuilder. +func WrapWithHeaders(ctx context.Context, headers map[string]string) ContextWithHeaders { + h := &headersContainer{ + reqHeaders: headers, + } + newCtx := context.WithValue(ctx, contextKeyHeaders, h) + return headerCtx{Context: newCtx} +} + +// WithoutHeaders hides any TChannel headers from the given context. +func WithoutHeaders(ctx context.Context) context.Context { + return context.WithValue(context.WithValue(ctx, contextKeyTChannel, nil), contextKeyHeaders, nil) +} diff --git a/vendor/github.com/uber/tchannel-go/dial_16.go b/vendor/github.com/uber/tchannel-go/dial_16.go new file mode 100644 index 00000000..583c9e32 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/dial_16.go @@ -0,0 +1,34 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// +build !go1.7 + +package tchannel + +import ( + "net" + + "golang.org/x/net/context" +) + +func dialContext(ctx context.Context, hostPort string) (net.Conn, error) { + timeout := getTimeout(ctx) + return net.DialTimeout("tcp", hostPort, timeout) +} diff --git a/vendor/github.com/uber/tchannel-go/dial_17.go b/vendor/github.com/uber/tchannel-go/dial_17.go new file mode 100644 index 00000000..fb84a0ef --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/dial_17.go @@ -0,0 +1,33 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// +build go1.7 + +package tchannel + +import ( + "context" + "net" +) + +func dialContext(ctx context.Context, hostPort string) (net.Conn, error) { + d := net.Dialer{} + return d.DialContext(ctx, "tcp", hostPort) +} diff --git a/vendor/github.com/uber/tchannel-go/doc.go b/vendor/github.com/uber/tchannel-go/doc.go new file mode 100644 index 00000000..f393f3bc --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/doc.go @@ -0,0 +1,26 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* +Package tchannel implements Go bindings for the TChannel protocol (https://github.com/uber/tchannel). + +A single Channel can be used for many concurrent requests to many hosts. +*/ +package tchannel diff --git a/vendor/github.com/uber/tchannel-go/errors.go b/vendor/github.com/uber/tchannel-go/errors.go new file mode 100644 index 00000000..a4083a3b --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/errors.go @@ -0,0 +1,236 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "fmt" + + "golang.org/x/net/context" +) + +const ( + // Message id for protocol level errors + invalidMessageID uint32 = 0xFFFFFFFF +) + +// A SystemErrCode indicates how a caller should handle a system error returned from a peer +type SystemErrCode byte + +//go:generate stringer -type=SystemErrCode + +const ( + // ErrCodeInvalid is an invalid error code, and should not be used + ErrCodeInvalid SystemErrCode = 0x00 + + // ErrCodeTimeout indicates the peer timed out. Callers can retry the request + // on another peer if the request is safe to retry. + ErrCodeTimeout SystemErrCode = 0x01 + + // ErrCodeCancelled indicates that the request was cancelled on the peer. Callers + // can retry the request on the same or another peer if the request is safe to retry + ErrCodeCancelled SystemErrCode = 0x02 + + // ErrCodeBusy indicates that the request was not dispatched because the peer + // was too busy to handle it. Callers can retry the request on another peer, and should + // reweight their connections to direct less traffic to this peer until it recovers. + ErrCodeBusy SystemErrCode = 0x03 + + // ErrCodeDeclined indicates that the request not dispatched because the peer + // declined to handle it, typically because the peer is not yet ready to handle it. + // Callers can retry the request on another peer, but should not reweight their connections + // and should continue to send traffic to this peer. + ErrCodeDeclined SystemErrCode = 0x04 + + // ErrCodeUnexpected indicates that the request failed for an unexpected reason, typically + // a crash or other unexpected handling. The request may have been processed before the failure; + // callers should retry the request on this or another peer only if the request is safe to retry + ErrCodeUnexpected SystemErrCode = 0x05 + + // ErrCodeBadRequest indicates that the request was malformed, and could not be processed. + // Callers should not bother to retry the request, as there is no chance it will be handled. + ErrCodeBadRequest SystemErrCode = 0x06 + + // ErrCodeNetwork indicates a network level error, such as a connection reset. + // Callers can retry the request if the request is safe to retry + ErrCodeNetwork SystemErrCode = 0x07 + + // ErrCodeProtocol indincates a fatal protocol error communicating with the peer. The connection + // will be terminated. + ErrCodeProtocol SystemErrCode = 0xFF +) + +var ( + // ErrServerBusy is a SystemError indicating the server is busy + ErrServerBusy = NewSystemError(ErrCodeBusy, "server busy") + + // ErrRequestCancelled is a SystemError indicating the request has been cancelled on the peer + ErrRequestCancelled = NewSystemError(ErrCodeCancelled, "request cancelled") + + // ErrTimeout is a SytemError indicating the request has timed out + ErrTimeout = NewSystemError(ErrCodeTimeout, "timeout") + + // ErrTimeoutRequired is a SystemError indicating that timeouts must be specified. + ErrTimeoutRequired = NewSystemError(ErrCodeBadRequest, "timeout required") + + // ErrChannelClosed is a SystemError indicating that the channel has been closed. + ErrChannelClosed = NewSystemError(ErrCodeDeclined, "closed channel") + + // ErrMethodTooLarge is a SystemError indicating that the method is too large. + ErrMethodTooLarge = NewSystemError(ErrCodeProtocol, "method too large") +) + +// MetricsKey is a string representation of the error code that's suitable for +// inclusion in metrics tags. +func (c SystemErrCode) MetricsKey() string { + switch c { + case ErrCodeInvalid: + // Shouldn't ever need this. + return "invalid" + case ErrCodeTimeout: + return "timeout" + case ErrCodeCancelled: + return "cancelled" + case ErrCodeBusy: + return "busy" + case ErrCodeDeclined: + return "declined" + case ErrCodeUnexpected: + return "unexpected-error" + case ErrCodeBadRequest: + return "bad-request" + case ErrCodeNetwork: + return "network-error" + case ErrCodeProtocol: + return "protocol-error" + default: + return c.String() + } +} + +func (c SystemErrCode) relayMetricsKey() string { + switch c { + case ErrCodeInvalid: + return "relay-invalid" + case ErrCodeTimeout: + return "relay-timeout" + case ErrCodeCancelled: + return "relay-cancelled" + case ErrCodeBusy: + return "relay-busy" + case ErrCodeDeclined: + return "relay-declined" + case ErrCodeUnexpected: + return "relay-unexpected-error" + case ErrCodeBadRequest: + return "relay-bad-request" + case ErrCodeNetwork: + return "relay-network-error" + case ErrCodeProtocol: + return "relay-protocol-error" + default: + return "relay-" + c.String() + } +} + +// A SystemError is a system-level error, containing an error code and message +// TODO(mmihic): Probably we want to hide this interface, and let application code +// just deal with standard raw errors. +type SystemError struct { + code SystemErrCode + msg string + wrapped error +} + +// NewSystemError defines a new SystemError with a code and message +func NewSystemError(code SystemErrCode, msg string, args ...interface{}) error { + return SystemError{code: code, msg: fmt.Sprintf(msg, args...)} +} + +// NewWrappedSystemError defines a new SystemError wrapping an existing error +func NewWrappedSystemError(code SystemErrCode, wrapped error) error { + if se, ok := wrapped.(SystemError); ok { + return se + } + + return SystemError{code: code, msg: fmt.Sprint(wrapped), wrapped: wrapped} +} + +// Error returns the code and message, conforming to the error interface +func (se SystemError) Error() string { + return fmt.Sprintf("tchannel error %v: %s", se.Code(), se.msg) +} + +// Wrapped returns the wrapped error +func (se SystemError) Wrapped() error { return se.wrapped } + +// Code returns the SystemError code, for sending to a peer +func (se SystemError) Code() SystemErrCode { + return se.code +} + +// Message returns the SystemError message. +func (se SystemError) Message() string { + return se.msg +} + +// GetContextError converts the context error to a tchannel error. +func GetContextError(err error) error { + if err == context.DeadlineExceeded { + return ErrTimeout + } + if err == context.Canceled { + return ErrRequestCancelled + } + return err +} + +// GetSystemErrorCode returns the code to report for the given error. If the error is a +// SystemError, we can get the code directly. Otherwise treat it as an unexpected error +func GetSystemErrorCode(err error) SystemErrCode { + if err == nil { + return ErrCodeInvalid + } + + if se, ok := err.(SystemError); ok { + return se.Code() + } + + return ErrCodeUnexpected +} + +// GetSystemErrorMessage returns the message to report for the given error. If the error is a +// SystemError, we can get the underlying message. Otherwise, use the Error() method. +func GetSystemErrorMessage(err error) string { + if se, ok := err.(SystemError); ok { + return se.Message() + } + + return err.Error() +} + +type errConnNotActive struct { + info string + state connectionState +} + +func (e errConnNotActive) Error() string { + return fmt.Sprintf("%v connection is not active: %v", e.info, e.state) +} diff --git a/vendor/github.com/uber/tchannel-go/fragmenting_reader.go b/vendor/github.com/uber/tchannel-go/fragmenting_reader.go new file mode 100644 index 00000000..129edbfa --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/fragmenting_reader.go @@ -0,0 +1,316 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "bytes" + "errors" + "io" + + "github.com/uber/tchannel-go/typed" +) + +var ( + errMismatchedChecksumTypes = errors.New("peer returned different checksum types between fragments") + errMismatchedChecksums = errors.New("different checksums between peer and local") + errChunkExceedsFragmentSize = errors.New("peer chunk size exceeds remaining data in fragment") + errAlreadyReadingArgument = errors.New("already reading argument") + errNotReadingArgument = errors.New("not reading argument") + errMoreDataInArgument = errors.New("closed argument reader when there is more data available to read") + errExpectedMoreArguments = errors.New("closed argument reader when there may be more data available to read") + errNoMoreFragments = errors.New("no more fragments") +) + +type readableFragment struct { + isDone bool + flags byte + checksumType ChecksumType + checksum []byte + contents *typed.ReadBuffer + onDone func() +} + +func (f *readableFragment) done() { + if f.isDone { + return + } + f.onDone() + f.isDone = true +} + +type fragmentReceiver interface { + // recvNextFragment returns the next received fragment, blocking until + // it's available or a deadline/cancel occurs + recvNextFragment(intial bool) (*readableFragment, error) + + // doneReading is called when the fragment receiver is finished reading all fragments. + // If an error frame is the last received frame, then doneReading is called with an error. + doneReading(unexpectedErr error) +} + +type fragmentingReadState int + +const ( + fragmentingReadStart fragmentingReadState = iota + fragmentingReadInArgument + fragmentingReadInLastArgument + fragmentingReadWaitingForArgument + fragmentingReadComplete +) + +func (s fragmentingReadState) isReadingArgument() bool { + return s == fragmentingReadInArgument || s == fragmentingReadInLastArgument +} + +type fragmentingReader struct { + logger Logger + state fragmentingReadState + remainingChunks [][]byte + curChunk []byte + hasMoreFragments bool + receiver fragmentReceiver + curFragment *readableFragment + checksum Checksum + err error +} + +func newFragmentingReader(logger Logger, receiver fragmentReceiver) *fragmentingReader { + return &fragmentingReader{ + logger: logger, + receiver: receiver, + hasMoreFragments: true, + } +} + +// The ArgReader will handle fragmentation as needed. Once the argument has +// been read, the ArgReader must be closed. +func (r *fragmentingReader) ArgReader(last bool) (ArgReader, error) { + if err := r.BeginArgument(last); err != nil { + return nil, err + } + return r, nil +} + +func (r *fragmentingReader) BeginArgument(last bool) error { + if r.err != nil { + return r.err + } + + switch { + case r.state.isReadingArgument(): + r.err = errAlreadyReadingArgument + return r.err + case r.state == fragmentingReadComplete: + r.err = errComplete + return r.err + } + + // We're guaranteed that either this is the first argument (in which + // case we need to get the first fragment and chunk) or that we have a + // valid curChunk (populated via Close) + if r.state == fragmentingReadStart { + if r.err = r.recvAndParseNextFragment(true); r.err != nil { + return r.err + } + } + + r.state = fragmentingReadInArgument + if last { + r.state = fragmentingReadInLastArgument + } + return nil +} + +func (r *fragmentingReader) Read(b []byte) (int, error) { + if r.err != nil { + return 0, r.err + } + + if !r.state.isReadingArgument() { + r.err = errNotReadingArgument + return 0, r.err + } + + totalRead := 0 + for { + // Copy as much data as we can from the current chunk + n := copy(b, r.curChunk) + totalRead += n + r.curChunk = r.curChunk[n:] + b = b[n:] + + if len(b) == 0 { + // There was enough data in the current chunk to + // satisfy the read. Advance our place in the current + // chunk and be done + return totalRead, nil + } + + // There wasn't enough data in the current chunk to satisfy the + // current read. If there are more chunks in the current + // fragment, then we've reach the end of this argument. Return + // an io.EOF so functions like ioutil.ReadFully know to finish + if len(r.remainingChunks) > 0 { + return totalRead, io.EOF + } + + // Try to fetch more fragments. If there are no more + // fragments, then we've reached the end of the argument + if !r.hasMoreFragments { + return totalRead, io.EOF + } + + if r.err = r.recvAndParseNextFragment(false); r.err != nil { + return totalRead, r.err + } + } +} + +func (r *fragmentingReader) Close() error { + last := r.state == fragmentingReadInLastArgument + if r.err != nil { + return r.err + } + + if !r.state.isReadingArgument() { + r.err = errNotReadingArgument + return r.err + } + + if len(r.curChunk) > 0 { + // There was more data remaining in the chunk + r.err = errMoreDataInArgument + return r.err + } + + // Several possibilities here: + // 1. The caller thinks this is the last argument, but there are chunks in the current + // fragment or more fragments in this message + // - give them an error + // 2. The caller thinks this is the last argument, and there are no more chunks and no more + // fragments + // - the stream is complete + // 3. The caller thinks there are more arguments, and there are more chunks in this fragment + // - advance to the next chunk, this is the first chunk for the next argument + // 4. The caller thinks there are more arguments, and there are no more chunks in this fragment, + // but there are more fragments in the message + // - retrieve the next fragment, confirm it has an empty chunk (indicating the end of the + // current argument), advance to the next check (which is the first chunk for the next arg) + // 5. The caller thinks there are more arguments, but there are no more chunks or fragments available + // - give them an err + if last { + if len(r.remainingChunks) > 0 || r.hasMoreFragments { + // We expect more arguments + r.err = errExpectedMoreArguments + return r.err + } + + r.doneReading(nil) + r.curFragment.done() + r.curChunk = nil + r.state = fragmentingReadComplete + return nil + } + + r.state = fragmentingReadWaitingForArgument + + // If there are more chunks in this fragment, advance to the next chunk. This is the first chunk + // for the next argument + if len(r.remainingChunks) > 0 { + r.curChunk, r.remainingChunks = r.remainingChunks[0], r.remainingChunks[1:] + return nil + } + + // If there are no more chunks in this fragment, and no more fragments, we have an issue + if !r.hasMoreFragments { + r.err = errNoMoreFragments + return r.err + } + + // There are no more chunks in this fragments, but more fragments - get the next fragment + if r.err = r.recvAndParseNextFragment(false); r.err != nil { + return r.err + } + + return nil +} + +func (r *fragmentingReader) recvAndParseNextFragment(initial bool) error { + if r.err != nil { + return r.err + } + + if r.curFragment != nil { + r.curFragment.done() + } + + r.curFragment, r.err = r.receiver.recvNextFragment(initial) + if r.err != nil { + if err, ok := r.err.(errorMessage); ok { + // Serialized system errors are still reported (e.g. latency, trace reporting). + r.err = err.AsSystemError() + r.doneReading(r.err) + } + return r.err + } + + // Set checksum, or confirm new checksum is the same type as the prior checksum + if r.checksum == nil { + r.checksum = r.curFragment.checksumType.New() + } else if r.checksum.TypeCode() != r.curFragment.checksumType { + return errMismatchedChecksumTypes + } + + // Split fragment into underlying chunks + r.hasMoreFragments = (r.curFragment.flags & hasMoreFragmentsFlag) == hasMoreFragmentsFlag + r.remainingChunks = nil + for r.curFragment.contents.BytesRemaining() > 0 && r.curFragment.contents.Err() == nil { + chunkSize := r.curFragment.contents.ReadUint16() + if chunkSize > uint16(r.curFragment.contents.BytesRemaining()) { + return errChunkExceedsFragmentSize + } + chunkData := r.curFragment.contents.ReadBytes(int(chunkSize)) + r.remainingChunks = append(r.remainingChunks, chunkData) + r.checksum.Add(chunkData) + } + + if r.curFragment.contents.Err() != nil { + return r.curFragment.contents.Err() + } + + // Validate checksums + localChecksum := r.checksum.Sum() + if bytes.Compare(r.curFragment.checksum, localChecksum) != 0 { + r.err = errMismatchedChecksums + return r.err + } + + // Pull out the first chunk to act as the current chunk + r.curChunk, r.remainingChunks = r.remainingChunks[0], r.remainingChunks[1:] + return nil +} + +func (r *fragmentingReader) doneReading(err error) { + if r.checksum != nil { + r.checksum.Release() + } + r.receiver.doneReading(err) +} diff --git a/vendor/github.com/uber/tchannel-go/fragmenting_writer.go b/vendor/github.com/uber/tchannel-go/fragmenting_writer.go new file mode 100644 index 00000000..9a9df2eb --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/fragmenting_writer.go @@ -0,0 +1,296 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "errors" + "fmt" + + "github.com/uber/tchannel-go/typed" +) + +var ( + errAlreadyWritingArgument = errors.New("already writing argument") + errNotWritingArgument = errors.New("not writing argument") + errComplete = errors.New("last argument already sent") +) + +const ( + chunkHeaderSize = 2 // each chunk is a uint16 + hasMoreFragmentsFlag = 0x01 // flags indicating there are more fragments coming +) + +// A writableFragment is a fragment that can be written to, containing a buffer +// for contents, a running checksum, and placeholders for the fragment flags +// and final checksum value +type writableFragment struct { + flagsRef typed.ByteRef + checksumRef typed.BytesRef + checksum Checksum + contents *typed.WriteBuffer + frame interface{} +} + +// finish finishes the fragment, updating the final checksum and fragment flags +func (f *writableFragment) finish(hasMoreFragments bool) { + f.checksumRef.Update(f.checksum.Sum()) + if hasMoreFragments { + f.flagsRef.Update(hasMoreFragmentsFlag) + } else { + f.checksum.Release() + } +} + +// A writableChunk is a chunk of data within a fragment, representing the +// contents of an argument within that fragment +type writableChunk struct { + size uint16 + sizeRef typed.Uint16Ref + checksum Checksum + contents *typed.WriteBuffer +} + +// newWritableChunk creates a new writable chunk around a checksum and a buffer to hold data +func newWritableChunk(checksum Checksum, contents *typed.WriteBuffer) *writableChunk { + return &writableChunk{ + size: 0, + sizeRef: contents.DeferUint16(), + checksum: checksum, + contents: contents, + } +} + +// writeAsFits writes as many bytes from the given slice as fits into the chunk +func (c *writableChunk) writeAsFits(b []byte) int { + if len(b) > c.contents.BytesRemaining() { + b = b[:c.contents.BytesRemaining()] + } + + c.checksum.Add(b) + c.contents.WriteBytes(b) + + written := len(b) + c.size += uint16(written) + return written +} + +// finish finishes the chunk, updating its chunk size +func (c *writableChunk) finish() { + c.sizeRef.Update(c.size) +} + +// A fragmentSender allocates and sends outbound fragments to a target +type fragmentSender interface { + // newFragment allocates a new fragment + newFragment(initial bool, checksum Checksum) (*writableFragment, error) + + // flushFragment flushes the given fragment + flushFragment(f *writableFragment) error + + // doneSending is called when the fragment receiver is finished sending all fragments. + doneSending() +} + +type fragmentingWriterState int + +const ( + fragmentingWriteStart fragmentingWriterState = iota + fragmentingWriteInArgument + fragmentingWriteInLastArgument + fragmentingWriteWaitingForArgument + fragmentingWriteComplete +) + +func (s fragmentingWriterState) isWritingArgument() bool { + return s == fragmentingWriteInArgument || s == fragmentingWriteInLastArgument +} + +// A fragmentingWriter writes one or more arguments to an underlying stream, +// breaking them into fragments as needed, and applying an overarching +// checksum. It relies on an underlying fragmentSender, which creates and +// flushes the fragments as needed +type fragmentingWriter struct { + logger Logger + sender fragmentSender + checksum Checksum + curFragment *writableFragment + curChunk *writableChunk + state fragmentingWriterState + err error +} + +// newFragmentingWriter creates a new fragmenting writer +func newFragmentingWriter(logger Logger, sender fragmentSender, checksum Checksum) *fragmentingWriter { + return &fragmentingWriter{ + logger: logger, + sender: sender, + checksum: checksum, + state: fragmentingWriteStart, + } +} + +// ArgWriter returns an ArgWriter to write an argument. The ArgWriter will handle +// fragmentation as needed. Once the argument is written, the ArgWriter must be closed. +func (w *fragmentingWriter) ArgWriter(last bool) (ArgWriter, error) { + if err := w.BeginArgument(last); err != nil { + return nil, err + } + return w, nil +} + +// BeginArgument tells the writer that the caller is starting a new argument. +// Must not be called while an existing argument is in place +func (w *fragmentingWriter) BeginArgument(last bool) error { + if w.err != nil { + return w.err + } + + switch { + case w.state == fragmentingWriteComplete: + w.err = errComplete + return w.err + case w.state.isWritingArgument(): + w.err = errAlreadyWritingArgument + return w.err + } + + // If we don't have a fragment, request one + if w.curFragment == nil { + initial := w.state == fragmentingWriteStart + if w.curFragment, w.err = w.sender.newFragment(initial, w.checksum); w.err != nil { + return w.err + } + } + + // If there's no room in the current fragment, freak out. This will + // only happen due to an implementation error in the TChannel stack + // itself + if w.curFragment.contents.BytesRemaining() <= chunkHeaderSize { + panic(fmt.Errorf("attempting to begin an argument in a fragment with only %d bytes available", + w.curFragment.contents.BytesRemaining())) + } + + w.curChunk = newWritableChunk(w.checksum, w.curFragment.contents) + w.state = fragmentingWriteInArgument + if last { + w.state = fragmentingWriteInLastArgument + } + return nil +} + +// Write writes argument data, breaking it into fragments as needed +func (w *fragmentingWriter) Write(b []byte) (int, error) { + if w.err != nil { + return 0, w.err + } + + if !w.state.isWritingArgument() { + w.err = errNotWritingArgument + return 0, w.err + } + + totalWritten := 0 + for { + bytesWritten := w.curChunk.writeAsFits(b) + totalWritten += bytesWritten + if bytesWritten == len(b) { + // The whole thing fit, we're done + return totalWritten, nil + } + + // There was more data than fit into the fragment, so flush the current fragment, + // start a new fragment and chunk, and continue writing + if w.err = w.Flush(); w.err != nil { + return totalWritten, w.err + } + + b = b[bytesWritten:] + } +} + +// Flush flushes the current fragment, and starts a new fragment and chunk. +func (w *fragmentingWriter) Flush() error { + w.curChunk.finish() + w.curFragment.finish(true) + if w.err = w.sender.flushFragment(w.curFragment); w.err != nil { + return w.err + } + + if w.curFragment, w.err = w.sender.newFragment(false, w.checksum); w.err != nil { + return w.err + } + + w.curChunk = newWritableChunk(w.checksum, w.curFragment.contents) + return nil +} + +// Close ends the current argument. +func (w *fragmentingWriter) Close() error { + last := w.state == fragmentingWriteInLastArgument + if w.err != nil { + return w.err + } + + if !w.state.isWritingArgument() { + w.err = errNotWritingArgument + return w.err + } + + w.curChunk.finish() + + // There are three possibilities here: + // 1. There are no more arguments + // flush with more_fragments=false, mark the stream as complete + // 2. There are more arguments, but we can't fit more data into this fragment + // flush with more_fragments=true, start new fragment, write empty chunk to indicate + // the current argument is complete + // 3. There are more arguments, and we can fit more data into this fragment + // update the chunk but leave the current fragment open + if last { + // No more arguments - flush this final fragment and mark ourselves complete + w.state = fragmentingWriteComplete + w.curFragment.finish(false) + w.err = w.sender.flushFragment(w.curFragment) + w.sender.doneSending() + return w.err + } + + w.state = fragmentingWriteWaitingForArgument + if w.curFragment.contents.BytesRemaining() > chunkHeaderSize { + // There's enough room in this fragment for the next argument's + // initial chunk, so we're done here + return nil + } + + // This fragment is full - flush and prepare for another argument + w.curFragment.finish(true) + if w.err = w.sender.flushFragment(w.curFragment); w.err != nil { + return w.err + } + + if w.curFragment, w.err = w.sender.newFragment(false, w.checksum); w.err != nil { + return w.err + } + + // Write an empty chunk to indicate this argument has ended + w.curFragment.contents.WriteUint16(0) + return nil +} diff --git a/vendor/github.com/uber/tchannel-go/frame.go b/vendor/github.com/uber/tchannel-go/frame.go new file mode 100644 index 00000000..6c550a29 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/frame.go @@ -0,0 +1,209 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "encoding/json" + "fmt" + "io" + "math" + + "github.com/uber/tchannel-go/typed" +) + +const ( + // MaxFrameSize is the total maximum size for a frame + MaxFrameSize = math.MaxUint16 + + // FrameHeaderSize is the size of the header element for a frame + FrameHeaderSize = 16 + + // MaxFramePayloadSize is the maximum size of the payload for a single frame + MaxFramePayloadSize = MaxFrameSize - FrameHeaderSize +) + +// FrameHeader is the header for a frame, containing the MessageType and size +type FrameHeader struct { + // The size of the frame including the header + size uint16 + + // The type of message represented by the frame + messageType messageType + + // Left empty + reserved1 byte + + // The id of the message represented by the frame + ID uint32 + + // Left empty + reserved [8]byte +} + +// SetPayloadSize sets the size of the frame payload +func (fh *FrameHeader) SetPayloadSize(size uint16) { + fh.size = size + FrameHeaderSize +} + +// PayloadSize returns the size of the frame payload +func (fh FrameHeader) PayloadSize() uint16 { + return fh.size - FrameHeaderSize +} + +// FrameSize returns the total size of the frame +func (fh FrameHeader) FrameSize() uint16 { + return fh.size +} + +func (fh FrameHeader) String() string { return fmt.Sprintf("%v[%d]", fh.messageType, fh.ID) } + +// MarshalJSON returns a `{"id":NNN, "msgType":MMM, "size":SSS}` representation +func (fh FrameHeader) MarshalJSON() ([]byte, error) { + s := struct { + ID uint32 `json:"id"` + MsgType messageType `json:"msgType"` + Size uint16 `json:"size"` + }{fh.ID, fh.messageType, fh.size} + return json.Marshal(s) +} + +func (fh *FrameHeader) read(r *typed.ReadBuffer) error { + fh.size = r.ReadUint16() + fh.messageType = messageType(r.ReadSingleByte()) + fh.reserved1 = r.ReadSingleByte() + fh.ID = r.ReadUint32() + r.ReadBytes(len(fh.reserved)) + return r.Err() +} + +func (fh *FrameHeader) write(w *typed.WriteBuffer) error { + w.WriteUint16(fh.size) + w.WriteSingleByte(byte(fh.messageType)) + w.WriteSingleByte(fh.reserved1) + w.WriteUint32(fh.ID) + w.WriteBytes(fh.reserved[:]) + return w.Err() +} + +// A Frame is a header and payload +type Frame struct { + buffer []byte // full buffer, including payload and header + headerBuffer []byte // slice referencing just the header + + // The header for the frame + Header FrameHeader + + // The payload for the frame + Payload []byte +} + +// NewFrame allocates a new frame with the given payload capacity +func NewFrame(payloadCapacity int) *Frame { + f := &Frame{} + f.buffer = make([]byte, payloadCapacity+FrameHeaderSize) + f.Payload = f.buffer[FrameHeaderSize:] + f.headerBuffer = f.buffer[:FrameHeaderSize] + return f +} + +// ReadBody takes in a previously read frame header, and only reads in the body +// based on the size specified in the header. This allows callers to defer +// the frame allocation till the body needs to be read. +func (f *Frame) ReadBody(header []byte, r io.Reader) error { + // Copy the header into the underlying buffer so we have an assembled frame + // that can be directly forwarded. + copy(f.buffer, header) + + // Parse the header into our typed struct. + if err := f.Header.read(typed.NewReadBuffer(header)); err != nil { + return err + } + + switch payloadSize := f.Header.PayloadSize(); { + case payloadSize > MaxFramePayloadSize: + return fmt.Errorf("invalid frame size %v", f.Header.size) + case payloadSize > 0: + _, err := io.ReadFull(r, f.SizedPayload()) + return err + default: + // No payload to read + return nil + } +} + +// ReadIn reads the frame from the given io.Reader. +// Deprecated: Only maintained for backwards compatibility. Callers should +// use ReadBody instead. +func (f *Frame) ReadIn(r io.Reader) error { + header := make([]byte, FrameHeaderSize) + if _, err := io.ReadFull(r, header); err != nil { + return err + } + + return f.ReadBody(header, r) +} + +// WriteOut writes the frame to the given io.Writer +func (f *Frame) WriteOut(w io.Writer) error { + var wbuf typed.WriteBuffer + wbuf.Wrap(f.headerBuffer) + + if err := f.Header.write(&wbuf); err != nil { + return err + } + + fullFrame := f.buffer[:f.Header.FrameSize()] + if _, err := w.Write(fullFrame); err != nil { + return err + } + + return nil +} + +// SizedPayload returns the slice of the payload actually used, as defined by the header +func (f *Frame) SizedPayload() []byte { + return f.Payload[:f.Header.PayloadSize()] +} + +// messageType returns the message type. +func (f *Frame) messageType() messageType { + return f.Header.messageType +} + +func (f *Frame) write(msg message) error { + var wbuf typed.WriteBuffer + wbuf.Wrap(f.Payload[:]) + if err := msg.write(&wbuf); err != nil { + return err + } + + f.Header.ID = msg.ID() + f.Header.reserved1 = 0 + f.Header.messageType = msg.messageType() + f.Header.SetPayloadSize(uint16(wbuf.BytesWritten())) + return nil +} + +func (f *Frame) read(msg message) error { + var rbuf typed.ReadBuffer + rbuf.Wrap(f.SizedPayload()) + return msg.read(&rbuf) +} diff --git a/vendor/github.com/uber/tchannel-go/frame_pool.go b/vendor/github.com/uber/tchannel-go/frame_pool.go new file mode 100644 index 00000000..53f62127 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/frame_pool.go @@ -0,0 +1,86 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import "sync" + +// A FramePool is a pool for managing and re-using frames +type FramePool interface { + // Retrieves a new frame from the pool + Get() *Frame + + // Releases a frame back to the pool + Release(f *Frame) +} + +// DefaultFramePool uses the SyncFramePool. +var DefaultFramePool = NewSyncFramePool() + +// DisabledFramePool is a pool that uses the heap and relies on GC. +var DisabledFramePool = disabledFramePool{} + +type disabledFramePool struct{} + +func (p disabledFramePool) Get() *Frame { return NewFrame(MaxFramePayloadSize) } +func (p disabledFramePool) Release(f *Frame) {} + +type syncFramePool struct { + pool *sync.Pool +} + +// NewSyncFramePool returns a frame pool that uses a sync.Pool. +func NewSyncFramePool() FramePool { + return &syncFramePool{ + pool: &sync.Pool{New: func() interface{} { return NewFrame(MaxFramePayloadSize) }}, + } +} + +func (p syncFramePool) Get() *Frame { + return p.pool.Get().(*Frame) +} + +func (p syncFramePool) Release(f *Frame) { + p.pool.Put(f) +} + +type channelFramePool chan *Frame + +// NewChannelFramePool returns a frame pool backed by a channel that has a max capacity. +func NewChannelFramePool(capacity int) FramePool { + return channelFramePool(make(chan *Frame, capacity)) +} + +func (c channelFramePool) Get() *Frame { + select { + case frame := <-c: + return frame + default: + return NewFrame(MaxFramePayloadSize) + } +} + +func (c channelFramePool) Release(f *Frame) { + select { + case c <- f: + default: + // Too many frames in the channel, discard it. + } +} diff --git a/vendor/github.com/uber/tchannel-go/glide.lock b/vendor/github.com/uber/tchannel-go/glide.lock new file mode 100644 index 00000000..9966e1d4 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/glide.lock @@ -0,0 +1,89 @@ +hash: d360c4cc43e9aee42a71d729286d4bbf5214384277f22d2869b67f7f04e41ccb +updated: 2019-05-01T16:26:07.049050757-07:00 +imports: +- name: github.com/apache/thrift + version: b2a4d4ae21c789b689dd162deb819665567f481c + subpackages: + - lib/go/thrift +- name: github.com/cactus/go-statsd-client + version: 138b925ccdf617776955904ba7759fce64406cec + subpackages: + - statsd +- name: github.com/opentracing/opentracing-go + version: 659c90643e714681897ec2521c60567dd21da733 + subpackages: + - ext + - log + - mocktracer +- name: github.com/samuel/go-thrift + version: e9042807f4f5bf47563df6992d3ea0857313e2be + subpackages: + - parser +- name: github.com/uber-go/tally + version: e9a67ec1839e1f6e5133dbcca2f57bec12fdeda2 +- name: github.com/uber/jaeger-client-go + version: 2f47546e3facd43297739439600bcf43f44cce5d + subpackages: + - internal/baggage + - internal/spanlog + - internal/throttler + - log + - thrift + - thrift-gen/agent + - thrift-gen/jaeger + - thrift-gen/sampling + - thrift-gen/zipkincore + - utils +- name: go.uber.org/atomic + version: df976f2515e274675050de7b3f42545de80594fd + subpackages: + - utils +- name: golang.org/x/net + version: aaf60122140d3fcf75376d319f0554393160eb50 + subpackages: + - bpf + - context + - internal/iana + - internal/socket + - ipv4 + - ipv6 +testImports: +- name: github.com/bmizerany/perks + version: d9a9656a3a4b1c2864fdb44db2ef8619772d92aa + subpackages: + - quantile +- name: github.com/crossdock/crossdock-go + version: 049aabb0122b03bc9bd30cab8f3f91fb60166361 +- name: github.com/davecgh/go-spew + version: 8991bc29aa16c548c550c7ff78260e27b9ab7c73 + subpackages: + - spew +- name: github.com/jessevdk/go-flags + version: c6ca198ec95c841fdb89fc0de7496fed11ab854e + subpackages: + - ext + - mocktracer +- name: github.com/pmezard/go-difflib + version: 792786c7400a136282c1664665ae0a8db921c6c2 + subpackages: + - difflib +- name: github.com/prashantv/protectmem + version: e20412882b3adb9cabd3e9013d68adbfff9ea946 +- name: github.com/streadway/quantile + version: b0c588724d25ae13f5afb3d90efec0edc636432b +- name: github.com/stretchr/objx + version: 8a3f7159479fbc75b30357fbc48f380b7320f08e +- name: github.com/stretchr/testify + version: ffdc059bfe9ce6a4e144ba849dbedead332c6053 + subpackages: + - assert + - mock + - require +- name: github.com/uber/jaeger-lib + version: 0e30338a695636fe5bcf7301e8030ce8dd2a8530 + subpackages: + - metrics +- name: go.uber.org/multierr + version: 3c4937480c32f4c13a875a1829af76c98ca3d40a +- name: gopkg.in/yaml.v2 + version: 5420a8b6744d3b0345ab293f6fcba19c978f1183 diff --git a/vendor/github.com/uber/tchannel-go/glide.yaml b/vendor/github.com/uber/tchannel-go/glide.yaml new file mode 100644 index 00000000..954fb33a --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/glide.yaml @@ -0,0 +1,60 @@ +package: github.com/uber/tchannel-go +excludeDirs: +- benchmark +- crossdock +- examples +- relay/relaytest +- testutils +- thrift/mocks +import: +- package: github.com/apache/thrift + version: '>=0.9.3, <0.11.0' + subpackages: + - lib/go/thrift +- package: github.com/cactus/go-statsd-client + version: ^3 + subpackages: + - statsd +- package: github.com/samuel/go-thrift + subpackages: + - parser +- package: golang.org/x/net + subpackages: + - context + - ipv4 + - ipv6 +- package: go.uber.org/atomic + version: ^1.3 + subpackages: + - utils +- package: github.com/opentracing/opentracing-go + version: ^1 +- package: github.com/uber/jaeger-client-go + version: ^2.7 +- package: github.com/uber-go/tally + version: ^3 +testImport: +- package: github.com/jessevdk/go-flags + version: ^1 + subpackages: + - ext + - mocktracer +- package: github.com/stretchr/testify + version: ^1.1 + subpackages: + - assert + - mock + - require +- package: github.com/bmizerany/perks + subpackages: + - quantile +- package: github.com/davecgh/go-spew + version: ^1 + subpackages: + - spew +- package: github.com/prashantv/protectmem +- package: github.com/streadway/quantile +- package: gopkg.in/yaml.v2 +- package: github.com/crossdock/crossdock-go +- package: go.uber.org/multierr + version: ^1.1.0 diff --git a/vendor/github.com/uber/tchannel-go/handlers.go b/vendor/github.com/uber/tchannel-go/handlers.go new file mode 100644 index 00000000..4682f60b --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/handlers.go @@ -0,0 +1,127 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "reflect" + "runtime" + "sync" + + "golang.org/x/net/context" +) + +// A Handler is an object that can be registered with a Channel to process +// incoming calls for a given service and method +type Handler interface { + // Handles an incoming call for service + Handle(ctx context.Context, call *InboundCall) +} + +// A HandlerFunc is an adapter to allow the use of ordinary functions as +// Channel handlers. If f is a function with the appropriate signature, then +// HandlerFunc(f) is a Handler object that calls f. +type HandlerFunc func(ctx context.Context, call *InboundCall) + +// Handle calls f(ctx, call) +func (f HandlerFunc) Handle(ctx context.Context, call *InboundCall) { f(ctx, call) } + +// An ErrorHandlerFunc is an adapter to allow the use of ordinary functions as +// Channel handlers, with error handling convenience. If f is a function with +// the appropriate signature, then ErrorHandlerFunc(f) is a Handler object that +// calls f. +type ErrorHandlerFunc func(ctx context.Context, call *InboundCall) error + +// Handle calls f(ctx, call) +func (f ErrorHandlerFunc) Handle(ctx context.Context, call *InboundCall) { + if err := f(ctx, call); err != nil { + if GetSystemErrorCode(err) == ErrCodeUnexpected { + call.log.WithFields(f.getLogFields()...).WithFields(ErrField(err)).Error("Unexpected handler error") + } + call.Response().SendSystemError(err) + } +} + +func (f ErrorHandlerFunc) getLogFields() LogFields { + ptr := reflect.ValueOf(f).Pointer() + handlerFunc := runtime.FuncForPC(ptr) // can't be nil + fileName, fileLine := handlerFunc.FileLine(ptr) + return LogFields{ + {"handlerFuncName", handlerFunc.Name()}, + {"handlerFuncFileName", fileName}, + {"handlerFuncFileLine", fileLine}, + } +} + +// Manages handlers +type handlerMap struct { + sync.RWMutex + + handlers map[string]Handler +} + +// Registers a handler +func (hmap *handlerMap) register(h Handler, method string) { + hmap.Lock() + defer hmap.Unlock() + + if hmap.handlers == nil { + hmap.handlers = make(map[string]Handler) + } + + hmap.handlers[method] = h +} + +// Finds the handler matching the given service and method. See https://github.com/golang/go/issues/3512 +// for the reason that method is []byte instead of a string +func (hmap *handlerMap) find(method []byte) Handler { + hmap.RLock() + handler := hmap.handlers[string(method)] + hmap.RUnlock() + + return handler +} + +func (hmap *handlerMap) Handle(ctx context.Context, call *InboundCall) { + c := call.conn + h := hmap.find(call.Method()) + if h == nil { + c.log.WithFields( + LogField{"serviceName", call.ServiceName()}, + LogField{"method", call.MethodString()}, + ).Error("Couldn't find handler.") + call.Response().SendSystemError( + NewSystemError(ErrCodeBadRequest, "no handler for service %q and method %q", call.ServiceName(), call.Method())) + return + } + + if c.log.Enabled(LogLevelDebug) { + c.log.Debugf("Dispatching %s:%s from %s", call.ServiceName(), call.Method(), c.remotePeerInfo) + } + h.Handle(ctx, call) +} + +// channelHandler is a Handler that wraps a Channel and delegates requests +// to SubChannels based on the inbound call's service name. +type channelHandler struct{ ch *Channel } + +func (c channelHandler) Handle(ctx context.Context, call *InboundCall) { + c.ch.GetSubChannel(call.ServiceName()).handler.Handle(ctx, call) +} diff --git a/vendor/github.com/uber/tchannel-go/health.go b/vendor/github.com/uber/tchannel-go/health.go new file mode 100644 index 00000000..947a81d5 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/health.go @@ -0,0 +1,176 @@ +// Copyright (c) 2017 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "sync" + "time" + + "golang.org/x/net/context" +) + +const ( + _defaultHealthCheckTimeout = time.Second + _defaultHealthCheckFailuresToClose = 5 + + _healthHistorySize = 256 +) + +// HealthCheckOptions are the parameters to configure active TChannel health +// checks. These are not intended to check application level health, but +// TCP connection health (similar to TCP keep-alives). The health checks use +// TChannel ping messages. +type HealthCheckOptions struct { + // The period between health checks. If this is zeor, active health checks + // are disabled. + Interval time.Duration + + // The timeout to use for a health check. + // If no value is specified, it defaults to time.Second. + Timeout time.Duration + + // FailuresToClose is the number of consecutive health check failures that + // will cause this connection to be closed. + // If no value is specified, it defaults to 5. + FailuresToClose int +} + +type healthHistory struct { + sync.RWMutex + + states []bool + + insertAt int + total int +} + +func newHealthHistory() *healthHistory { + return &healthHistory{ + states: make([]bool, _healthHistorySize), + } +} + +func (hh *healthHistory) add(b bool) { + hh.Lock() + defer hh.Unlock() + + hh.states[hh.insertAt] = b + hh.insertAt = (hh.insertAt + 1) % _healthHistorySize + hh.total++ +} + +func (hh *healthHistory) asBools() []bool { + hh.RLock() + defer hh.RUnlock() + + if hh.total < _healthHistorySize { + return append([]bool(nil), hh.states[:hh.total]...) + } + + states := hh.states + copyStates := make([]bool, 0, _healthHistorySize) + copyStates = append(copyStates, states[hh.insertAt:]...) + copyStates = append(copyStates, states[:hh.insertAt]...) + return copyStates +} + +func (hco HealthCheckOptions) enabled() bool { + return hco.Interval > 0 +} + +func (hco HealthCheckOptions) withDefaults() HealthCheckOptions { + if hco.Timeout == 0 { + hco.Timeout = _defaultHealthCheckTimeout + } + if hco.FailuresToClose == 0 { + hco.FailuresToClose = _defaultHealthCheckFailuresToClose + } + return hco +} + +// healthCheck will do periodic pings on the connection to check the state of the connection. +// We accept connID on the stack so can more easily debug panics or leaked goroutines. +func (c *Connection) healthCheck(connID uint32) { + defer close(c.healthCheckDone) + + opts := c.opts.HealthChecks + + ticker := c.timeTicker(opts.Interval) + defer ticker.Stop() + + consecutiveFailures := 0 + for { + select { + case <-ticker.C: + case <-c.healthCheckCtx.Done(): + return + } + + ctx, cancel := context.WithTimeout(c.healthCheckCtx, opts.Timeout) + err := c.ping(ctx) + cancel() + c.healthCheckHistory.add(err == nil) + if err == nil { + if c.log.Enabled(LogLevelDebug) { + c.log.Debug("Performed successful active health check.") + } + consecutiveFailures = 0 + continue + } + + // If the health check failed because the connection closed or health + // checks were stopped, we don't need to log or close the connection. + if GetSystemErrorCode(err) == ErrCodeCancelled || err == ErrInvalidConnectionState { + c.log.WithFields(ErrField(err)).Debug("Health checker stopped.") + return + } + + consecutiveFailures++ + c.log.WithFields(LogFields{ + {"consecutiveFailures", consecutiveFailures}, + ErrField(err), + {"failuresToClose", opts.FailuresToClose}, + }...).Warn("Failed active health check.") + + if consecutiveFailures >= opts.FailuresToClose { + c.close(LogFields{ + {"reason", "health check failure"}, + ErrField(err), + }...) + return + } + } +} + +func (c *Connection) stopHealthCheck() { + // Health checks are not enabled. + if c.healthCheckDone == nil { + return + } + + // Best effort check to see if health checks were stopped. + if c.healthCheckCtx.Err() != nil { + return + } + c.log.Debug("Stopping health checks.") + c.healthCheckQuit() + <-c.healthCheckDone +} diff --git a/vendor/github.com/uber/tchannel-go/idle_sweep.go b/vendor/github.com/uber/tchannel-go/idle_sweep.go new file mode 100644 index 00000000..94815e1b --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/idle_sweep.go @@ -0,0 +1,123 @@ +// Copyright (c) 2017 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import "time" + +// idleSweep controls a periodic task that looks for idle connections and clears +// them from the peer list. +// NOTE: This struct is not thread-safe on its own. Calls to Start() and Stop() +// should be guarded by locking ch.mutable +type idleSweep struct { + ch *Channel + maxIdleTime time.Duration + idleCheckInterval time.Duration + stopCh chan struct{} + started bool +} + +// startIdleSweep starts a poller that checks for idle connections at given +// intervals. +func startIdleSweep(ch *Channel, opts *ChannelOptions) *idleSweep { + is := &idleSweep{ + ch: ch, + maxIdleTime: opts.MaxIdleTime, + idleCheckInterval: opts.IdleCheckInterval, + } + + is.start() + return is +} + +// Start runs the goroutine responsible for checking idle connections. +func (is *idleSweep) start() { + if is.started || is.idleCheckInterval <= 0 { + return + } + + is.ch.log.WithFields( + LogField{"idleCheckInterval", is.idleCheckInterval}, + LogField{"maxIdleTime", is.maxIdleTime}, + ).Info("Starting idle connections poller.") + + is.started = true + is.stopCh = make(chan struct{}) + go is.pollerLoop() +} + +// Stop kills the poller checking for idle connections. +func (is *idleSweep) Stop() { + if !is.started { + return + } + + is.started = false + is.ch.log.Info("Stopping idle connections poller.") + close(is.stopCh) +} + +func (is *idleSweep) pollerLoop() { + ticker := is.ch.timeTicker(is.idleCheckInterval) + + for { + select { + case <-ticker.C: + is.checkIdleConnections() + case <-is.stopCh: + ticker.Stop() + return + } + } +} + +func (is *idleSweep) checkIdleConnections() { + now := is.ch.timeNow() + + // Acquire the read lock and examine which connections are idle. + idleConnections := make([]*Connection, 0, 10) + is.ch.mutable.RLock() + for _, conn := range is.ch.mutable.conns { + if idleTime := now.Sub(conn.getLastActivityTime()); idleTime >= is.maxIdleTime { + idleConnections = append(idleConnections, conn) + } + } + is.ch.mutable.RUnlock() + + for _, conn := range idleConnections { + // It's possible that the connection is already closed when we get here. + if !conn.IsActive() { + continue + } + + // We shouldn't get to a state where we have pending calls, but the connection + // is idle. This either means the max-idle time is too low, or there's a stuck call. + if conn.hasPendingCalls() { + conn.log.Error("Skip closing idle Connection as it has pending calls.") + continue + } + + is.ch.log.WithFields( + LogField{"remotePeer", conn.remotePeerInfo}, + LogField{"lastActivityTime", conn.getLastActivityTime()}, + ).Info("Closing idle inbound connection.") + conn.close(LogField{"reason", "Idle connection closed"}) + } +} diff --git a/vendor/github.com/uber/tchannel-go/inbound.go b/vendor/github.com/uber/tchannel-go/inbound.go new file mode 100644 index 00000000..c133ffa9 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/inbound.go @@ -0,0 +1,412 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "errors" + "fmt" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + "golang.org/x/net/context" +) + +var errInboundRequestAlreadyActive = errors.New("inbound request is already active; possible duplicate client id") + +// handleCallReq handles an incoming call request, registering a message +// exchange to receive further fragments for that call, and dispatching it in +// another goroutine +func (c *Connection) handleCallReq(frame *Frame) bool { + now := c.timeNow() + switch state := c.readState(); state { + case connectionActive: + break + case connectionStartClose, connectionInboundClosed, connectionClosed: + c.SendSystemError(frame.Header.ID, callReqSpan(frame), ErrChannelClosed) + return true + default: + panic(fmt.Errorf("unknown connection state for call req: %v", state)) + } + + callReq := new(callReq) + callReq.id = frame.Header.ID + initialFragment, err := parseInboundFragment(c.opts.FramePool, frame, callReq) + if err != nil { + // TODO(mmihic): Probably want to treat this as a protocol error + c.log.WithFields( + LogField{"header", frame.Header}, + ErrField(err), + ).Error("Couldn't decode initial fragment.") + return true + } + + call := new(InboundCall) + call.conn = c + ctx, cancel := newIncomingContext(call, callReq.TimeToLive) + + mex, err := c.inbound.newExchange(ctx, c.opts.FramePool, callReq.messageType(), frame.Header.ID, mexChannelBufferSize) + if err != nil { + if err == errDuplicateMex { + err = errInboundRequestAlreadyActive + } + c.log.WithFields(LogField{"header", frame.Header}).Error("Couldn't register exchange.") + c.protocolError(frame.Header.ID, errInboundRequestAlreadyActive) + return true + } + + // Close may have been called between the time we checked the state and us creating the exchange. + if c.readState() != connectionActive { + mex.shutdown() + return true + } + + response := new(InboundCallResponse) + response.call = call + response.calledAt = now + response.timeNow = c.timeNow + response.span = c.extractInboundSpan(callReq) + if response.span != nil { + mex.ctx = opentracing.ContextWithSpan(mex.ctx, response.span) + } + response.mex = mex + response.conn = c + response.cancel = cancel + response.log = c.log.WithFields(LogField{"In-Response", callReq.ID()}) + response.contents = newFragmentingWriter(response.log, response, initialFragment.checksumType.New()) + response.headers = transportHeaders{} + response.messageForFragment = func(initial bool) message { + if initial { + callRes := new(callRes) + callRes.Headers = response.headers + callRes.ResponseCode = responseOK + if response.applicationError { + callRes.ResponseCode = responseApplicationError + } + return callRes + } + + return new(callResContinue) + } + + call.mex = mex + call.initialFragment = initialFragment + call.serviceName = string(callReq.Service) + call.headers = callReq.Headers + call.response = response + call.log = c.log.WithFields(LogField{"In-Call", callReq.ID()}) + call.messageForFragment = func(initial bool) message { return new(callReqContinue) } + call.contents = newFragmentingReader(call.log, call) + call.statsReporter = c.statsReporter + call.createStatsTags(c.commonStatsTags) + + response.statsReporter = c.statsReporter + response.commonStatsTags = call.commonStatsTags + + setResponseHeaders(call.headers, response.headers) + go c.dispatchInbound(c.connID, callReq.ID(), call, frame) + return false +} + +// handleCallReqContinue handles the continuation of a call request, forwarding +// it to the request channel for that request, where it can be pulled during +// defragmentation +func (c *Connection) handleCallReqContinue(frame *Frame) bool { + if err := c.inbound.forwardPeerFrame(frame); err != nil { + // If forward fails, it's due to a timeout. We can free this frame. + return true + } + return false +} + +// createStatsTags creates the common stats tags, if they are not already created. +func (call *InboundCall) createStatsTags(connectionTags map[string]string) { + call.commonStatsTags = map[string]string{ + "calling-service": call.CallerName(), + } + for k, v := range connectionTags { + call.commonStatsTags[k] = v + } +} + +// dispatchInbound ispatches an inbound call to the appropriate handler +func (c *Connection) dispatchInbound(_ uint32, _ uint32, call *InboundCall, frame *Frame) { + if call.log.Enabled(LogLevelDebug) { + call.log.Debugf("Received incoming call for %s from %s", call.ServiceName(), c.remotePeerInfo) + } + + if err := call.readMethod(); err != nil { + call.log.WithFields( + LogField{"remotePeer", c.remotePeerInfo}, + ErrField(err), + ).Error("Couldn't read method.") + c.opts.FramePool.Release(frame) + return + } + + call.commonStatsTags["endpoint"] = call.methodString + call.statsReporter.IncCounter("inbound.calls.recvd", call.commonStatsTags, 1) + if span := call.response.span; span != nil { + span.SetOperationName(call.methodString) + } + + // TODO(prashant): This is an expensive way to check for cancellation. Use a heap for timeouts. + go func() { + select { + case <-call.mex.ctx.Done(): + // checking if message exchange timedout or was cancelled + // only two possible errors at this step: + // context.DeadlineExceeded + // context.Canceled + if call.mex.ctx.Err() != nil { + call.mex.inboundExpired() + } + case <-call.mex.errCh.c: + if c.log.Enabled(LogLevelDebug) { + call.log.Debugf("Wait for timeout/cancellation interrupted by error: %v", call.mex.errCh.err) + } + // when an exchange errors out, mark the exchange as expired + // and call cancel so the server handler's context is canceled + // TODO: move the cancel to the parent context at connnection level + call.response.cancel() + call.mex.inboundExpired() + } + }() + + c.handler.Handle(call.mex.ctx, call) +} + +// An InboundCall is an incoming call from a peer +type InboundCall struct { + reqResReader + + conn *Connection + response *InboundCallResponse + serviceName string + method []byte + methodString string + headers transportHeaders + statsReporter StatsReporter + commonStatsTags map[string]string +} + +// ServiceName returns the name of the service being called +func (call *InboundCall) ServiceName() string { + return call.serviceName +} + +// Method returns the method being called +func (call *InboundCall) Method() []byte { + return call.method +} + +// MethodString returns the method being called as a string. +func (call *InboundCall) MethodString() string { + return call.methodString +} + +// Format the format of the request from the ArgScheme transport header. +func (call *InboundCall) Format() Format { + return Format(call.headers[ArgScheme]) +} + +// CallerName returns the caller name from the CallerName transport header. +func (call *InboundCall) CallerName() string { + return call.headers[CallerName] +} + +// ShardKey returns the shard key from the ShardKey transport header. +func (call *InboundCall) ShardKey() string { + return call.headers[ShardKey] +} + +// RoutingKey returns the routing key from the RoutingKey transport header. +func (call *InboundCall) RoutingKey() string { + return call.headers[RoutingKey] +} + +// RoutingDelegate returns the routing delegate from the RoutingDelegate transport header. +func (call *InboundCall) RoutingDelegate() string { + return call.headers[RoutingDelegate] +} + +// LocalPeer returns the local peer information for this call. +func (call *InboundCall) LocalPeer() LocalPeerInfo { + return call.conn.localPeerInfo +} + +// RemotePeer returns the remote peer information for this call. +func (call *InboundCall) RemotePeer() PeerInfo { + return call.conn.RemotePeerInfo() +} + +// CallOptions returns a CallOptions struct suitable for forwarding a request. +func (call *InboundCall) CallOptions() *CallOptions { + return &CallOptions{ + CallerName: call.CallerName(), + Format: call.Format(), + ShardKey: call.ShardKey(), + RoutingDelegate: call.RoutingDelegate(), + RoutingKey: call.RoutingKey(), + } +} + +// Reads the entire method name (arg1) from the request stream. +func (call *InboundCall) readMethod() error { + var arg1 []byte + if err := NewArgReader(call.arg1Reader()).Read(&arg1); err != nil { + return call.failed(err) + } + + call.method = arg1 + call.methodString = string(arg1) + return nil +} + +// Arg2Reader returns an ArgReader to read the second argument. +// The ReadCloser must be closed once the argument has been read. +func (call *InboundCall) Arg2Reader() (ArgReader, error) { + return call.arg2Reader() +} + +// Arg3Reader returns an ArgReader to read the last argument. +// The ReadCloser must be closed once the argument has been read. +func (call *InboundCall) Arg3Reader() (ArgReader, error) { + return call.arg3Reader() +} + +// Response provides access to the InboundCallResponse object which can be used +// to write back to the calling peer +func (call *InboundCall) Response() *InboundCallResponse { + if call.err != nil { + // While reading Thrift, we cannot distinguish between malformed Thrift and other errors, + // and so we may try to respond with a bad request. We should ensure that the response + // is marked as failed if the request has failed so that we don't try to shutdown the exchange + // a second time. + call.response.err = call.err + } + return call.response +} + +func (call *InboundCall) doneReading(unexpected error) {} + +// An InboundCallResponse is used to send the response back to the calling peer +type InboundCallResponse struct { + reqResWriter + + call *InboundCall + cancel context.CancelFunc + // calledAt is the time the inbound call was routed to the application. + calledAt time.Time + timeNow func() time.Time + applicationError bool + systemError bool + headers transportHeaders + span opentracing.Span + statsReporter StatsReporter + commonStatsTags map[string]string +} + +// SendSystemError returns a system error response to the peer. The call is considered +// complete after this method is called, and no further data can be written. +func (response *InboundCallResponse) SendSystemError(err error) error { + if response.err != nil { + return response.err + } + // Fail all future attempts to read fragments + response.state = reqResWriterComplete + response.systemError = true + response.doneSending() + response.call.releasePreviousFragment() + + span := CurrentSpan(response.mex.ctx) + + return response.conn.SendSystemError(response.mex.msgID, *span, err) +} + +// SetApplicationError marks the response as being an application error. This method can +// only be called before any arguments have been sent to the calling peer. +func (response *InboundCallResponse) SetApplicationError() error { + if response.state > reqResWriterPreArg2 { + return response.failed(errReqResWriterStateMismatch{ + state: response.state, + expectedState: reqResWriterPreArg2, + }) + } + response.applicationError = true + return nil +} + +// Blackhole indicates no response will be sent, and cleans up any resources +// associated with this request. This allows for services to trigger a timeout in +// clients without holding on to any goroutines on the server. +func (response *InboundCallResponse) Blackhole() { + response.cancel() +} + +// Arg2Writer returns a WriteCloser that can be used to write the second argument. +// The returned writer must be closed once the write is complete. +func (response *InboundCallResponse) Arg2Writer() (ArgWriter, error) { + if err := NewArgWriter(response.arg1Writer()).Write(nil); err != nil { + return nil, err + } + return response.arg2Writer() +} + +// Arg3Writer returns a WriteCloser that can be used to write the last argument. +// The returned writer must be closed once the write is complete. +func (response *InboundCallResponse) Arg3Writer() (ArgWriter, error) { + return response.arg3Writer() +} + +// doneSending shuts down the message exchange for this call. +// For incoming calls, the last message is sending the call response. +func (response *InboundCallResponse) doneSending() { + // TODO(prashant): Move this to when the message is actually being sent. + now := response.timeNow() + + if span := response.span; span != nil { + if response.applicationError || response.systemError { + ext.Error.Set(span, true) + } + span.FinishWithOptions(opentracing.FinishOptions{FinishTime: now}) + } + + latency := now.Sub(response.calledAt) + response.statsReporter.RecordTimer("inbound.calls.latency", response.commonStatsTags, latency) + + if response.systemError { + // TODO(prashant): Report the error code type as per metrics doc and enable. + // response.statsReporter.IncCounter("inbound.calls.system-errors", response.commonStatsTags, 1) + } else if response.applicationError { + response.statsReporter.IncCounter("inbound.calls.app-errors", response.commonStatsTags, 1) + } else { + response.statsReporter.IncCounter("inbound.calls.success", response.commonStatsTags, 1) + } + + // Cancel the context since the response is complete. + response.cancel() + + // The message exchange is still open if there are no errors, call shutdown. + if response.err == nil { + response.mex.shutdown() + } +} diff --git a/vendor/github.com/uber/tchannel-go/internal/argreader/empty.go b/vendor/github.com/uber/tchannel-go/internal/argreader/empty.go new file mode 100644 index 00000000..98240b85 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/internal/argreader/empty.go @@ -0,0 +1,50 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package argreader + +import ( + "fmt" + "io" + "sync" +) + +var _bufPool = sync.Pool{ + New: func() interface{} { + b := make([]byte, 128) + return &b + }, +} + +// EnsureEmpty ensures that the specified reader is empty. If the reader is +// not empty, it returns an error with the specified stage in the message. +func EnsureEmpty(r io.Reader, stage string) error { + buf := _bufPool.Get().(*[]byte) + defer _bufPool.Put(buf) + + n, err := r.Read(*buf) + if n > 0 { + return fmt.Errorf("found unexpected bytes after %s, found (upto 128 bytes): %x", stage, (*buf)[:n]) + } + if err == io.EOF { + return nil + } + return err +} diff --git a/vendor/github.com/uber/tchannel-go/introspection.go b/vendor/github.com/uber/tchannel-go/introspection.go new file mode 100644 index 00000000..08f52e47 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/introspection.go @@ -0,0 +1,534 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "encoding/json" + "runtime" + "sort" + "strconv" + "time" + + "golang.org/x/net/context" +) + +// IntrospectionOptions are the options used when introspecting the Channel. +type IntrospectionOptions struct { + // IncludeExchanges will include all the IDs in the message exchanges. + IncludeExchanges bool `json:"includeExchanges"` + + // IncludeEmptyPeers will include peers, even if they have no connections. + IncludeEmptyPeers bool `json:"includeEmptyPeers"` + + // IncludeTombstones will include tombstones when introspecting relays. + IncludeTombstones bool `json:"includeTombstones"` + + // IncludeOtherChannels will include basic information about other channels + // created in the same process as this channel. + IncludeOtherChannels bool `json:"includeOtherChannels"` +} + +// RuntimeVersion includes version information about the runtime and +// the tchannel library. +type RuntimeVersion struct { + GoVersion string `json:"goVersion"` + LibraryVersion string `json:"tchannelVersion"` +} + +// RuntimeState is a snapshot of the runtime state for a channel. +type RuntimeState struct { + ID uint32 `json:"id"` + ChannelState string `json:"channelState"` + + // CreatedStack is the stack for how this channel was created. + CreatedStack string `json:"createdStack"` + + // LocalPeer is the local peer information (service name, host-port, etc). + LocalPeer LocalPeerInfo `json:"localPeer"` + + // SubChannels contains information about any subchannels. + SubChannels map[string]SubChannelRuntimeState `json:"subChannels"` + + // RootPeers contains information about all the peers on this channel and their connections. + RootPeers map[string]PeerRuntimeState `json:"rootPeers"` + + // Peers is the list of shared peers for this channel. + Peers []SubPeerScore `json:"peers"` + + // NumConnections is the number of connections stored in the channel. + NumConnections int `json:"numConnections"` + + // Connections is the list of connection IDs in the channel + Connections []uint32 ` json:"connections"` + + // InactiveConnections is the connection state for connections that are not active, + // and hence are not reported as part of root peers. + InactiveConnections []ConnectionRuntimeState `json:"inactiveConnections"` + + // OtherChannels is information about any other channels running in this process. + OtherChannels map[string][]ChannelInfo `json:"otherChannels,omitEmpty"` + + // RuntimeVersion is the version information about the runtime and the library. + RuntimeVersion RuntimeVersion `json:"runtimeVersion"` +} + +// GoRuntimeStateOptions are the options used when getting Go runtime state. +type GoRuntimeStateOptions struct { + // IncludeGoStacks will include all goroutine stacks. + IncludeGoStacks bool `json:"includeGoStacks"` +} + +// ChannelInfo is the state of other channels in the same process. +type ChannelInfo struct { + ID uint32 `json:"id"` + CreatedStack string `json:"createdStack"` + LocalPeer LocalPeerInfo `json:"localPeer"` +} + +// GoRuntimeState is a snapshot of runtime stats from the runtime. +type GoRuntimeState struct { + MemStats runtime.MemStats `json:"memStats"` + NumGoroutines int `json:"numGoRoutines"` + NumCPU int `json:"numCPU"` + NumCGo int64 `json:"numCGo"` + GoStacks []byte `json:"goStacks,omitempty"` +} + +// SubChannelRuntimeState is the runtime state for a subchannel. +type SubChannelRuntimeState struct { + Service string `json:"service"` + Isolated bool `json:"isolated"` + // IsolatedPeers is the list of all isolated peers for this channel. + IsolatedPeers []SubPeerScore `json:"isolatedPeers,omitempty"` + Handler HandlerRuntimeState `json:"handler"` +} + +// HandlerRuntimeState TODO +type HandlerRuntimeState struct { + Type handlerType `json:"type"` + Methods []string `json:"methods,omitempty"` +} + +type handlerType string + +func (h handlerType) String() string { return string(h) } + +const ( + methodHandler handlerType = "methods" + overrideHandler = "overriden" +) + +// SubPeerScore show the runtime state of a peer with score. +type SubPeerScore struct { + HostPort string `json:"hostPort"` + Score uint64 `json:"score"` +} + +// ConnectionRuntimeState is the runtime state for a single connection. +type ConnectionRuntimeState struct { + ID uint32 `json:"id"` + ConnectionState string `json:"connectionState"` + LocalHostPort string `json:"localHostPort"` + RemoteHostPort string `json:"remoteHostPort"` + OutboundHostPort string `json:"outboundHostPort"` + RemotePeer PeerInfo `json:"remotePeer"` + InboundExchange ExchangeSetRuntimeState `json:"inboundExchange"` + OutboundExchange ExchangeSetRuntimeState `json:"outboundExchange"` + Relayer RelayerRuntimeState `json:"relayer"` + HealthChecks []bool `json:"healthChecks,omitempty"` + LastActivity int64 `json:"lastActivity"` +} + +// RelayerRuntimeState is the runtime state for a single relayer. +type RelayerRuntimeState struct { + Count int `json:"count"` + InboundItems RelayItemSetState `json:"inboundItems"` + OutboundItems RelayItemSetState `json:"outboundItems"` + MaxTimeout time.Duration `json:"maxTimeout"` +} + +// ExchangeSetRuntimeState is the runtime state for a message exchange set. +type ExchangeSetRuntimeState struct { + Name string `json:"name"` + Count int `json:"count"` + Exchanges map[string]ExchangeRuntimeState `json:"exchanges,omitempty"` +} + +// RelayItemSetState is the runtime state for a list of relay items. +type RelayItemSetState struct { + Name string `json:"name"` + Count int `json:"count"` + Items map[string]RelayItemState `json:"items,omitempty"` +} + +// ExchangeRuntimeState is the runtime state for a single message exchange. +type ExchangeRuntimeState struct { + ID uint32 `json:"id"` + MessageType messageType `json:"messageType"` +} + +// RelayItemState is the runtime state for a single relay item. +type RelayItemState struct { + ID uint32 `json:"id"` + RemapID uint32 `json:"remapID"` + DestinationConnectionID uint32 `json:"destinationConnectionID"` + Tomb bool `json:"tomb"` +} + +// PeerRuntimeState is the runtime state for a single peer. +type PeerRuntimeState struct { + HostPort string `json:"hostPort"` + OutboundConnections []ConnectionRuntimeState `json:"outboundConnections"` + InboundConnections []ConnectionRuntimeState `json:"inboundConnections"` + ChosenCount uint64 `json:"chosenCount"` + SCCount uint32 `json:"scCount"` +} + +// IntrospectState returns the RuntimeState for this channel. +// Note: this is purely for debugging and monitoring, and may slow down your Channel. +func (ch *Channel) IntrospectState(opts *IntrospectionOptions) *RuntimeState { + if opts == nil { + opts = &IntrospectionOptions{} + } + + ch.mutable.RLock() + state := ch.mutable.state + numConns := len(ch.mutable.conns) + inactiveConns := make([]*Connection, 0, numConns) + connIDs := make([]uint32, 0, numConns) + for id, conn := range ch.mutable.conns { + connIDs = append(connIDs, id) + if !conn.IsActive() { + inactiveConns = append(inactiveConns, conn) + } + } + + ch.mutable.RUnlock() + + ch.State() + return &RuntimeState{ + ID: ch.chID, + ChannelState: state.String(), + CreatedStack: ch.createdStack, + LocalPeer: ch.PeerInfo(), + SubChannels: ch.subChannels.IntrospectState(opts), + RootPeers: ch.RootPeers().IntrospectState(opts), + Peers: ch.Peers().IntrospectList(opts), + NumConnections: numConns, + Connections: connIDs, + InactiveConnections: getConnectionRuntimeState(inactiveConns, opts), + OtherChannels: ch.IntrospectOthers(opts), + RuntimeVersion: introspectRuntimeVersion(), + } +} + +// IntrospectOthers returns the ChannelInfo for all other channels in this process. +func (ch *Channel) IntrospectOthers(opts *IntrospectionOptions) map[string][]ChannelInfo { + if !opts.IncludeOtherChannels { + return nil + } + + channelMap.Lock() + defer channelMap.Unlock() + + states := make(map[string][]ChannelInfo) + for svc, channels := range channelMap.existing { + channelInfos := make([]ChannelInfo, 0, len(channels)) + for _, otherChan := range channels { + if ch == otherChan { + continue + } + channelInfos = append(channelInfos, otherChan.ReportInfo(opts)) + } + states[svc] = channelInfos + } + + return states +} + +// ReportInfo returns ChannelInfo for a channel. +func (ch *Channel) ReportInfo(opts *IntrospectionOptions) ChannelInfo { + return ChannelInfo{ + ID: ch.chID, + CreatedStack: ch.createdStack, + LocalPeer: ch.PeerInfo(), + } +} + +type containsPeerList interface { + Copy() map[string]*Peer +} + +func fromPeerList(peers containsPeerList, opts *IntrospectionOptions) map[string]PeerRuntimeState { + m := make(map[string]PeerRuntimeState) + for _, peer := range peers.Copy() { + peerState := peer.IntrospectState(opts) + if len(peerState.InboundConnections)+len(peerState.OutboundConnections) > 0 || opts.IncludeEmptyPeers { + m[peer.HostPort()] = peerState + } + } + return m +} + +// IntrospectState returns the runtime state of the +func (l *RootPeerList) IntrospectState(opts *IntrospectionOptions) map[string]PeerRuntimeState { + return fromPeerList(l, opts) +} + +// IntrospectState returns the runtime state of the subchannels. +func (subChMap *subChannelMap) IntrospectState(opts *IntrospectionOptions) map[string]SubChannelRuntimeState { + m := make(map[string]SubChannelRuntimeState) + subChMap.RLock() + for k, sc := range subChMap.subchannels { + state := SubChannelRuntimeState{ + Service: k, + Isolated: sc.Isolated(), + } + if state.Isolated { + state.IsolatedPeers = sc.Peers().IntrospectList(opts) + } + if hmap, ok := sc.handler.(*handlerMap); ok { + state.Handler.Type = methodHandler + methods := make([]string, 0, len(hmap.handlers)) + for k := range hmap.handlers { + methods = append(methods, k) + } + sort.Strings(methods) + state.Handler.Methods = methods + } else { + state.Handler.Type = overrideHandler + } + m[k] = state + } + subChMap.RUnlock() + return m +} + +func getConnectionRuntimeState(conns []*Connection, opts *IntrospectionOptions) []ConnectionRuntimeState { + connStates := make([]ConnectionRuntimeState, len(conns)) + + for i, conn := range conns { + connStates[i] = conn.IntrospectState(opts) + } + + return connStates +} + +// IntrospectState returns the runtime state for this peer. +func (p *Peer) IntrospectState(opts *IntrospectionOptions) PeerRuntimeState { + p.RLock() + defer p.RUnlock() + + return PeerRuntimeState{ + HostPort: p.hostPort, + InboundConnections: getConnectionRuntimeState(p.inboundConnections, opts), + OutboundConnections: getConnectionRuntimeState(p.outboundConnections, opts), + ChosenCount: p.chosenCount.Load(), + SCCount: p.scCount, + } +} + +// IntrospectState returns the runtime state for this connection. +func (c *Connection) IntrospectState(opts *IntrospectionOptions) ConnectionRuntimeState { + c.stateMut.RLock() + defer c.stateMut.RUnlock() + + // TODO(prashantv): Add total number of health checks, and health check options. + state := ConnectionRuntimeState{ + ID: c.connID, + ConnectionState: c.state.String(), + LocalHostPort: c.conn.LocalAddr().String(), + RemoteHostPort: c.conn.RemoteAddr().String(), + OutboundHostPort: c.outboundHP, + RemotePeer: c.remotePeerInfo, + InboundExchange: c.inbound.IntrospectState(opts), + OutboundExchange: c.outbound.IntrospectState(opts), + HealthChecks: c.healthCheckHistory.asBools(), + LastActivity: c.lastActivity.Load(), + } + if c.relay != nil { + state.Relayer = c.relay.IntrospectState(opts) + } + return state +} + +// IntrospectState returns the runtime state for this relayer. +func (r *Relayer) IntrospectState(opts *IntrospectionOptions) RelayerRuntimeState { + count := r.inbound.Count() + r.outbound.Count() + return RelayerRuntimeState{ + Count: count, + InboundItems: r.inbound.IntrospectState(opts, "inbound"), + OutboundItems: r.outbound.IntrospectState(opts, "outbound"), + MaxTimeout: r.maxTimeout, + } +} + +// IntrospectState returns the runtime state for this relayItems. +func (ri *relayItems) IntrospectState(opts *IntrospectionOptions, name string) RelayItemSetState { + setState := RelayItemSetState{ + Name: name, + Count: ri.Count(), + } + if opts.IncludeExchanges { + ri.RLock() + defer ri.RUnlock() + + setState.Items = make(map[string]RelayItemState, len(ri.items)) + for k, v := range ri.items { + if !opts.IncludeTombstones && v.tomb { + continue + } + state := RelayItemState{ + ID: k, + RemapID: v.remapID, + DestinationConnectionID: v.destination.conn.connID, + Tomb: v.tomb, + } + setState.Items[strconv.Itoa(int(k))] = state + } + } + + return setState +} + +// IntrospectState returns the runtime state for this messsage exchange set. +func (mexset *messageExchangeSet) IntrospectState(opts *IntrospectionOptions) ExchangeSetRuntimeState { + mexset.RLock() + setState := ExchangeSetRuntimeState{ + Name: mexset.name, + Count: len(mexset.exchanges), + } + + if opts.IncludeExchanges { + setState.Exchanges = make(map[string]ExchangeRuntimeState, len(mexset.exchanges)) + for k, v := range mexset.exchanges { + state := ExchangeRuntimeState{ + ID: k, + MessageType: v.msgType, + } + setState.Exchanges[strconv.Itoa(int(k))] = state + } + } + + mexset.RUnlock() + return setState +} + +func getStacks(all bool) []byte { + var buf []byte + for n := 4096; n < 10*1024*1024; n *= 2 { + buf = make([]byte, n) + stackLen := runtime.Stack(buf, all) + if stackLen < n { + return buf[:stackLen] + } + } + + // return the first 10MB of stacks if we have more than 10MB. + return buf +} +func (ch *Channel) handleIntrospection(arg3 []byte) interface{} { + var opts IntrospectionOptions + json.Unmarshal(arg3, &opts) + return ch.IntrospectState(&opts) +} + +// IntrospectList returns the list of peers (hostport, score) in this peer list. +func (l *PeerList) IntrospectList(opts *IntrospectionOptions) []SubPeerScore { + var peers []SubPeerScore + l.RLock() + for _, ps := range l.peerHeap.peerScores { + peers = append(peers, SubPeerScore{ + HostPort: ps.Peer.hostPort, + Score: ps.score, + }) + } + l.RUnlock() + + return peers +} + +// IntrospectNumConnections returns the number of connections returns the number +// of connections. Note: like other introspection APIs, this is not a stable API. +func (ch *Channel) IntrospectNumConnections() int { + ch.mutable.RLock() + numConns := len(ch.mutable.conns) + ch.mutable.RUnlock() + return numConns +} + +func handleInternalRuntime(arg3 []byte) interface{} { + var opts GoRuntimeStateOptions + json.Unmarshal(arg3, &opts) + + state := GoRuntimeState{ + NumGoroutines: runtime.NumGoroutine(), + NumCPU: runtime.NumCPU(), + NumCGo: runtime.NumCgoCall(), + } + runtime.ReadMemStats(&state.MemStats) + if opts.IncludeGoStacks { + state.GoStacks = getStacks(true /* all */) + } + + return state +} + +func introspectRuntimeVersion() RuntimeVersion { + return RuntimeVersion{ + GoVersion: runtime.Version(), + LibraryVersion: VersionInfo, + } +} + +// registerInternal registers the following internal handlers which return runtime state: +// _gometa_introspect: TChannel internal state. +// _gometa_runtime: Golang runtime stats. +func (ch *Channel) registerInternal() { + endpoints := []struct { + name string + handler func([]byte) interface{} + }{ + {"_gometa_introspect", ch.handleIntrospection}, + {"_gometa_runtime", handleInternalRuntime}, + } + + tchanSC := ch.GetSubChannel("tchannel") + for _, ep := range endpoints { + // We need ep in our closure. + ep := ep + handler := func(ctx context.Context, call *InboundCall) { + var arg2, arg3 []byte + if err := NewArgReader(call.Arg2Reader()).Read(&arg2); err != nil { + return + } + if err := NewArgReader(call.Arg3Reader()).Read(&arg3); err != nil { + return + } + if err := NewArgWriter(call.Response().Arg2Writer()).Write(nil); err != nil { + return + } + NewArgWriter(call.Response().Arg3Writer()).WriteJSON(ep.handler(arg3)) + } + ch.Register(HandlerFunc(handler), ep.name) + tchanSC.Register(HandlerFunc(handler), ep.name) + } +} diff --git a/vendor/github.com/uber/tchannel-go/localip.go b/vendor/github.com/uber/tchannel-go/localip.go new file mode 100644 index 00000000..cda90fc8 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/localip.go @@ -0,0 +1,112 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "errors" + "net" +) + +// scoreAddr scores how likely the given addr is to be a remote address and returns the +// IP to use when listening. Any address which receives a negative score should not be used. +// Scores are calculated as: +// -1 for any unknown IP addreseses. +// +300 for IPv4 addresses +// +100 for non-local addresses, extra +100 for "up" interaces. +func scoreAddr(iface net.Interface, addr net.Addr) (int, net.IP) { + var ip net.IP + if netAddr, ok := addr.(*net.IPNet); ok { + ip = netAddr.IP + } else if netIP, ok := addr.(*net.IPAddr); ok { + ip = netIP.IP + } else { + return -1, nil + } + + var score int + if ip.To4() != nil { + score += 300 + } + if iface.Flags&net.FlagLoopback == 0 && !ip.IsLoopback() { + score += 100 + if iface.Flags&net.FlagUp != 0 { + score += 100 + } + } + if isLocalMacAddr(iface.HardwareAddr) { + score -= 50 + } + return score, ip +} + +func listenIP(interfaces []net.Interface) (net.IP, error) { + bestScore := -1 + var bestIP net.IP + // Select the highest scoring IP as the best IP. + for _, iface := range interfaces { + addrs, err := iface.Addrs() + if err != nil { + // Skip this interface if there is an error. + continue + } + + for _, addr := range addrs { + score, ip := scoreAddr(iface, addr) + if score > bestScore { + bestScore = score + bestIP = ip + } + } + } + + if bestScore == -1 { + return nil, errors.New("no addresses to listen on") + } + + return bestIP, nil +} + +// ListenIP returns the IP to bind to in Listen. It tries to find an IP that can be used +// by other machines to reach this machine. +func ListenIP() (net.IP, error) { + interfaces, err := net.Interfaces() + if err != nil { + return nil, err + } + return listenIP(interfaces) +} + +func mustParseMAC(s string) net.HardwareAddr { + addr, err := net.ParseMAC(s) + if err != nil { + panic(err) + } + return addr +} + +// If the first octet's second least-significant-bit is set, then it's local. +// https://en.wikipedia.org/wiki/MAC_address#Universal_vs._local +func isLocalMacAddr(addr net.HardwareAddr) bool { + if len(addr) == 0 { + return false + } + return addr[0]&2 == 2 +} diff --git a/vendor/github.com/uber/tchannel-go/logger.go b/vendor/github.com/uber/tchannel-go/logger.go new file mode 100644 index 00000000..092bffe3 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/logger.go @@ -0,0 +1,229 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "fmt" + "io" + "time" +) + +import ( + "os" +) + +// Logger provides an abstract interface for logging from TChannel. +// Applications can provide their own implementation of this interface to adapt +// TChannel logging to whatever logging library they prefer (stdlib log, +// logrus, go-logging, etc). The SimpleLogger adapts to the standard go log +// package. +type Logger interface { + // Enabled returns whether the given level is enabled. + Enabled(level LogLevel) bool + + // Fatal logs a message, then exits with os.Exit(1). + Fatal(msg string) + + // Error logs a message at error priority. + Error(msg string) + + // Warn logs a message at warning priority. + Warn(msg string) + + // Infof logs a message at info priority. + Infof(msg string, args ...interface{}) + + // Info logs a message at info priority. + Info(msg string) + + // Debugf logs a message at debug priority. + Debugf(msg string, args ...interface{}) + + // Debug logs a message at debug priority. + Debug(msg string) + + // Fields returns the fields that this logger contains. + Fields() LogFields + + // WithFields returns a logger with the current logger's fields and fields. + WithFields(fields ...LogField) Logger +} + +// LogField is a single field of additional information passed to the logger. +type LogField struct { + Key string + Value interface{} +} + +// ErrField wraps an error string as a LogField named "error" +func ErrField(err error) LogField { + return LogField{"error", err.Error()} +} + +// LogFields is a list of LogFields used to pass additional information to the logger. +type LogFields []LogField + +// NullLogger is a logger that emits nowhere +var NullLogger Logger = nullLogger{} + +type nullLogger struct { + fields LogFields +} + +func (nullLogger) Enabled(_ LogLevel) bool { return false } +func (nullLogger) Fatal(msg string) { os.Exit(1) } +func (nullLogger) Error(msg string) {} +func (nullLogger) Warn(msg string) {} +func (nullLogger) Infof(msg string, args ...interface{}) {} +func (nullLogger) Info(msg string) {} +func (nullLogger) Debugf(msg string, args ...interface{}) {} +func (nullLogger) Debug(msg string) {} +func (l nullLogger) Fields() LogFields { return l.fields } + +func (l nullLogger) WithFields(fields ...LogField) Logger { + newFields := make([]LogField, len(l.Fields())+len(fields)) + n := copy(newFields, l.Fields()) + copy(newFields[n:], fields) + return nullLogger{newFields} +} + +// SimpleLogger prints logging information to standard out. +var SimpleLogger = NewLogger(os.Stdout) + +type writerLogger struct { + writer io.Writer + fields LogFields +} + +const writerLoggerStamp = "15:04:05.000000" + +// NewLogger returns a Logger that writes to the given writer. +func NewLogger(writer io.Writer, fields ...LogField) Logger { + return &writerLogger{writer, fields} +} + +func (l writerLogger) Fatal(msg string) { + l.printfn("F", msg) + os.Exit(1) +} + +func (l writerLogger) Enabled(_ LogLevel) bool { return true } +func (l writerLogger) Error(msg string) { l.printfn("E", msg) } +func (l writerLogger) Warn(msg string) { l.printfn("W", msg) } +func (l writerLogger) Infof(msg string, args ...interface{}) { l.printfn("I", msg, args...) } +func (l writerLogger) Info(msg string) { l.printfn("I", msg) } +func (l writerLogger) Debugf(msg string, args ...interface{}) { l.printfn("D", msg, args...) } +func (l writerLogger) Debug(msg string) { l.printfn("D", msg) } +func (l writerLogger) printfn(prefix, msg string, args ...interface{}) { + fmt.Fprintf(l.writer, "%s [%s] %s tags: %v\n", time.Now().Format(writerLoggerStamp), prefix, fmt.Sprintf(msg, args...), l.fields) +} + +func (l writerLogger) Fields() LogFields { + return l.fields +} + +func (l writerLogger) WithFields(newFields ...LogField) Logger { + existingFields := l.Fields() + fields := make(LogFields, 0, len(existingFields)+1) + fields = append(fields, existingFields...) + fields = append(fields, newFields...) + return writerLogger{l.writer, fields} +} + +// LogLevel is the level of logging used by LevelLogger. +type LogLevel int + +// The minimum level that will be logged. e.g. LogLevelError only logs errors and fatals. +const ( + LogLevelAll LogLevel = iota + LogLevelDebug + LogLevelInfo + LogLevelWarn + LogLevelError + LogLevelFatal +) + +type levelLogger struct { + logger Logger + level LogLevel +} + +// NewLevelLogger returns a logger that only logs messages with a minimum of level. +func NewLevelLogger(logger Logger, level LogLevel) Logger { + return levelLogger{logger, level} +} + +func (l levelLogger) Enabled(level LogLevel) bool { + return l.level <= level +} + +func (l levelLogger) Fatal(msg string) { + if l.level <= LogLevelFatal { + l.logger.Fatal(msg) + } +} + +func (l levelLogger) Error(msg string) { + if l.level <= LogLevelError { + l.logger.Error(msg) + } +} + +func (l levelLogger) Warn(msg string) { + if l.level <= LogLevelWarn { + l.logger.Warn(msg) + } +} + +func (l levelLogger) Infof(msg string, args ...interface{}) { + if l.level <= LogLevelInfo { + l.logger.Infof(msg, args...) + } +} + +func (l levelLogger) Info(msg string) { + if l.level <= LogLevelInfo { + l.logger.Info(msg) + } +} + +func (l levelLogger) Debugf(msg string, args ...interface{}) { + if l.level <= LogLevelDebug { + l.logger.Debugf(msg, args...) + } +} + +func (l levelLogger) Debug(msg string) { + if l.level <= LogLevelDebug { + l.logger.Debug(msg) + } +} + +func (l levelLogger) Fields() LogFields { + return l.logger.Fields() +} + +func (l levelLogger) WithFields(fields ...LogField) Logger { + return levelLogger{ + logger: l.logger.WithFields(fields...), + level: l.level, + } +} diff --git a/vendor/github.com/uber/tchannel-go/messages.go b/vendor/github.com/uber/tchannel-go/messages.go new file mode 100644 index 00000000..afcbf0df --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/messages.go @@ -0,0 +1,338 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "time" + + "github.com/uber/tchannel-go/typed" +) + +// messageType defines a type of message +type messageType byte + +const ( + messageTypeInitReq messageType = 0x01 + messageTypeInitRes messageType = 0x02 + messageTypeCallReq messageType = 0x03 + messageTypeCallRes messageType = 0x04 + messageTypeCallReqContinue messageType = 0x13 + messageTypeCallResContinue messageType = 0x14 + messageTypePingReq messageType = 0xd0 + messageTypePingRes messageType = 0xd1 + messageTypeError messageType = 0xFF +) + +//go:generate stringer -type=messageType + +// message is the base interface for messages. Has an id and type, and knows +// how to read and write onto a binary stream +type message interface { + // ID returns the id of the message + ID() uint32 + + // messageType returns the type of the message + messageType() messageType + + // read reads the message from a binary stream + read(r *typed.ReadBuffer) error + + // write writes the message to a binary stream + write(w *typed.WriteBuffer) error +} + +type noBodyMsg struct{} + +func (noBodyMsg) read(r *typed.ReadBuffer) error { return nil } +func (noBodyMsg) write(w *typed.WriteBuffer) error { return nil } + +// initParams are parameters to an initReq/InitRes +type initParams map[string]string + +const ( + // InitParamHostPort contains the host and port of the peer process + InitParamHostPort = "host_port" + // InitParamProcessName contains the name of the peer process + InitParamProcessName = "process_name" + // InitParamTChannelLanguage contains the library language. + InitParamTChannelLanguage = "tchannel_language" + // InitParamTChannelLanguageVersion contains the language build/runtime version. + InitParamTChannelLanguageVersion = "tchannel_language_version" + // InitParamTChannelVersion contains the library version. + InitParamTChannelVersion = "tchannel_version" +) + +// initMessage is the base for messages in the initialization handshake +type initMessage struct { + id uint32 + Version uint16 + initParams initParams +} + +func (m *initMessage) read(r *typed.ReadBuffer) error { + m.Version = r.ReadUint16() + + m.initParams = initParams{} + np := r.ReadUint16() + for i := 0; i < int(np); i++ { + k := r.ReadLen16String() + v := r.ReadLen16String() + m.initParams[k] = v + } + + return r.Err() +} + +func (m *initMessage) write(w *typed.WriteBuffer) error { + w.WriteUint16(m.Version) + w.WriteUint16(uint16(len(m.initParams))) + + for k, v := range m.initParams { + w.WriteLen16String(k) + w.WriteLen16String(v) + } + + return w.Err() +} + +func (m *initMessage) ID() uint32 { + return m.id +} + +// An initReq contains context information sent from an initiating peer +type initReq struct { + initMessage +} + +func (m *initReq) messageType() messageType { return messageTypeInitReq } + +// An initRes contains context information returned to an initiating peer +type initRes struct { + initMessage +} + +func (m *initRes) messageType() messageType { return messageTypeInitRes } + +// TransportHeaderName is a type for transport header names. +type TransportHeaderName string + +func (cn TransportHeaderName) String() string { return string(cn) } + +// Known transport header keys for call requests. +// Note: transport header names must be <= 16 bytes: +// https://tchannel.readthedocs.io/en/latest/protocol/#transport-headers +const ( + // ArgScheme header specifies the format of the args. + ArgScheme TransportHeaderName = "as" + + // CallerName header specifies the name of the service making the call. + CallerName TransportHeaderName = "cn" + + // ClaimAtFinish header value is host:port specifying the instance to send a claim message + // to when response is being sent. + ClaimAtFinish TransportHeaderName = "caf" + + // ClaimAtStart header value is host:port specifying another instance to send a claim message + // to when work is started. + ClaimAtStart TransportHeaderName = "cas" + + // FailureDomain header describes a group of related requests to the same service that are + // likely to fail in the same way if they were to fail. + FailureDomain TransportHeaderName = "fd" + + // ShardKey header value is used by ringpop to deliver calls to a specific tchannel instance. + ShardKey TransportHeaderName = "sk" + + // RetryFlags header specifies whether retry policies. + RetryFlags TransportHeaderName = "re" + + // SpeculativeExecution header specifies the number of nodes on which to run the request. + SpeculativeExecution TransportHeaderName = "se" + + // RoutingDelegate header identifies an intermediate service which knows + // how to route the request to the intended recipient. + RoutingDelegate TransportHeaderName = "rd" + + // RoutingKey header identifies a traffic group containing instances of the + // requested service. A relay may use the routing key over the service if + // it knows about traffic groups. + RoutingKey TransportHeaderName = "rk" +) + +// transportHeaders are passed as part of a CallReq/CallRes +type transportHeaders map[TransportHeaderName]string + +func (ch transportHeaders) read(r *typed.ReadBuffer) { + nh := r.ReadSingleByte() + for i := 0; i < int(nh); i++ { + k := r.ReadLen8String() + v := r.ReadLen8String() + ch[TransportHeaderName(k)] = v + } +} + +func (ch transportHeaders) write(w *typed.WriteBuffer) { + w.WriteSingleByte(byte(len(ch))) + + for k, v := range ch { + w.WriteLen8String(k.String()) + w.WriteLen8String(v) + } +} + +// A callReq for service +type callReq struct { + id uint32 + TimeToLive time.Duration + Tracing Span + Headers transportHeaders + Service string +} + +func (m *callReq) ID() uint32 { return m.id } +func (m *callReq) messageType() messageType { return messageTypeCallReq } +func (m *callReq) read(r *typed.ReadBuffer) error { + m.TimeToLive = time.Duration(r.ReadUint32()) * time.Millisecond + m.Tracing.read(r) + m.Service = r.ReadLen8String() + m.Headers = transportHeaders{} + m.Headers.read(r) + return r.Err() +} + +func (m *callReq) write(w *typed.WriteBuffer) error { + w.WriteUint32(uint32(m.TimeToLive / time.Millisecond)) + m.Tracing.write(w) + w.WriteLen8String(m.Service) + m.Headers.write(w) + return w.Err() +} + +// A callReqContinue is continuation of a previous callReq +type callReqContinue struct { + noBodyMsg + id uint32 +} + +func (c *callReqContinue) ID() uint32 { return c.id } +func (c *callReqContinue) messageType() messageType { return messageTypeCallReqContinue } + +// ResponseCode to a CallReq +type ResponseCode byte + +const ( + responseOK ResponseCode = 0x00 + responseApplicationError ResponseCode = 0x01 +) + +// callRes is a response to a CallReq +type callRes struct { + id uint32 + ResponseCode ResponseCode + Tracing Span + Headers transportHeaders +} + +func (m *callRes) ID() uint32 { return m.id } +func (m *callRes) messageType() messageType { return messageTypeCallRes } + +func (m *callRes) read(r *typed.ReadBuffer) error { + m.ResponseCode = ResponseCode(r.ReadSingleByte()) + m.Tracing.read(r) + m.Headers = transportHeaders{} + m.Headers.read(r) + return r.Err() +} + +func (m *callRes) write(w *typed.WriteBuffer) error { + w.WriteSingleByte(byte(m.ResponseCode)) + m.Tracing.write(w) + m.Headers.write(w) + return w.Err() +} + +// callResContinue is a continuation of a previous CallRes +type callResContinue struct { + id uint32 +} + +func (c *callResContinue) ID() uint32 { return c.id } +func (c *callResContinue) messageType() messageType { return messageTypeCallResContinue } +func (c *callResContinue) read(r *typed.ReadBuffer) error { return nil } +func (c *callResContinue) write(w *typed.WriteBuffer) error { return nil } + +// An errorMessage is a system-level error response to a request or a protocol level error +type errorMessage struct { + id uint32 + errCode SystemErrCode + tracing Span + message string +} + +func (m *errorMessage) ID() uint32 { return m.id } +func (m *errorMessage) messageType() messageType { return messageTypeError } +func (m *errorMessage) read(r *typed.ReadBuffer) error { + m.errCode = SystemErrCode(r.ReadSingleByte()) + m.tracing.read(r) + m.message = r.ReadLen16String() + return r.Err() +} + +func (m *errorMessage) write(w *typed.WriteBuffer) error { + w.WriteSingleByte(byte(m.errCode)) + m.tracing.write(w) + w.WriteLen16String(m.message) + return w.Err() +} + +func (m errorMessage) AsSystemError() error { + // TODO(mmihic): Might be nice to return one of the well defined error types + return NewSystemError(m.errCode, m.message) +} + +// Error returns the error message from the converted +func (m errorMessage) Error() string { + return m.AsSystemError().Error() +} + +type pingReq struct { + noBodyMsg + id uint32 +} + +func (c *pingReq) ID() uint32 { return c.id } +func (c *pingReq) messageType() messageType { return messageTypePingReq } + +// pingRes is a ping response to a protocol level ping request. +type pingRes struct { + noBodyMsg + id uint32 +} + +func (c *pingRes) ID() uint32 { return c.id } +func (c *pingRes) messageType() messageType { return messageTypePingRes } + +func callReqSpan(f *Frame) Span { + rdr := typed.NewReadBuffer(f.Payload[_spanIndex : _spanIndex+_spanLength]) + var s Span + s.read(rdr) + return s +} diff --git a/vendor/github.com/uber/tchannel-go/messagetype_string.go b/vendor/github.com/uber/tchannel-go/messagetype_string.go new file mode 100644 index 00000000..dd6e33bb --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/messagetype_string.go @@ -0,0 +1,37 @@ +// generated by stringer -type=messageType; DO NOT EDIT + +package tchannel + +import "fmt" + +const ( + _messageType_name_0 = "messageTypeInitReqmessageTypeInitResmessageTypeCallReqmessageTypeCallRes" + _messageType_name_1 = "messageTypeCallReqContinuemessageTypeCallResContinue" + _messageType_name_2 = "messageTypePingReqmessageTypePingRes" + _messageType_name_3 = "messageTypeError" +) + +var ( + _messageType_index_0 = [...]uint8{0, 18, 36, 54, 72} + _messageType_index_1 = [...]uint8{0, 26, 52} + _messageType_index_2 = [...]uint8{0, 18, 36} + _messageType_index_3 = [...]uint8{0, 16} +) + +func (i messageType) String() string { + switch { + case 1 <= i && i <= 4: + i -= 1 + return _messageType_name_0[_messageType_index_0[i]:_messageType_index_0[i+1]] + case 19 <= i && i <= 20: + i -= 19 + return _messageType_name_1[_messageType_index_1[i]:_messageType_index_1[i+1]] + case 208 <= i && i <= 209: + i -= 208 + return _messageType_name_2[_messageType_index_2[i]:_messageType_index_2[i+1]] + case i == 255: + return _messageType_name_3 + default: + return fmt.Sprintf("messageType(%d)", i) + } +} diff --git a/vendor/github.com/uber/tchannel-go/mex.go b/vendor/github.com/uber/tchannel-go/mex.go new file mode 100644 index 00000000..405c2156 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/mex.go @@ -0,0 +1,492 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "errors" + "fmt" + "sync" + + "github.com/uber/tchannel-go/typed" + + "go.uber.org/atomic" + "golang.org/x/net/context" +) + +var ( + errDuplicateMex = errors.New("multiple attempts to use the message id") + errMexShutdown = errors.New("mex has been shutdown") + errMexSetShutdown = errors.New("mexset has been shutdown") + errMexChannelFull = NewSystemError(ErrCodeBusy, "cannot send frame to message exchange channel") + errUnexpectedFrameType = errors.New("unexpected frame received") +) + +const ( + messageExchangeSetInbound = "inbound" + messageExchangeSetOutbound = "outbound" + + // mexChannelBufferSize is the size of the message exchange channel buffer. + mexChannelBufferSize = 2 +) + +type errNotifier struct { + c chan struct{} + err error + notified atomic.Bool +} + +func newErrNotifier() errNotifier { + return errNotifier{c: make(chan struct{})} +} + +// Notify will store the error and notify all waiters on c that there's an error. +func (e *errNotifier) Notify(err error) error { + // The code should never try to Notify(nil). + if err == nil { + panic("cannot Notify with no error") + } + + // There may be some sort of race where we try to notify the mex twice. + if !e.notified.CAS(false, true) { + return fmt.Errorf("cannot broadcast error: %v, already have: %v", err, e.err) + } + + e.err = err + close(e.c) + return nil +} + +// checkErr returns previously notified errors (if any). +func (e *errNotifier) checkErr() error { + select { + case <-e.c: + return e.err + default: + return nil + } +} + +// A messageExchange tracks this Connections's side of a message exchange with a +// peer. Each message exchange has a channel that can be used to receive +// frames from the peer, and a Context that can controls when the exchange has +// timed out or been cancelled. +type messageExchange struct { + recvCh chan *Frame + errCh errNotifier + ctx context.Context + msgID uint32 + msgType messageType + mexset *messageExchangeSet + framePool FramePool + + shutdownAtomic atomic.Bool + errChNotified atomic.Bool +} + +// checkError is called before waiting on the mex channels. +// It returns any existing errors (timeout, cancellation, connection errors). +func (mex *messageExchange) checkError() error { + if err := mex.ctx.Err(); err != nil { + return GetContextError(err) + } + + return mex.errCh.checkErr() +} + +// forwardPeerFrame forwards a frame from a peer to the message exchange, where +// it can be pulled by whatever application thread is handling the exchange +func (mex *messageExchange) forwardPeerFrame(frame *Frame) error { + // We want a very specific priority here: + // 1. Timeouts/cancellation (mex.ctx errors) + // 2. Whether recvCh has buffer space (non-blocking select over mex.recvCh) + // 3. Other mex errors (mex.errCh) + // Which is why we check the context error only (instead of mex.checkError). + // In the mex.errCh case, we do a non-blocking write to recvCh to prioritize it. + if err := mex.ctx.Err(); err != nil { + return GetContextError(err) + } + + select { + case mex.recvCh <- frame: + return nil + case <-mex.ctx.Done(): + // Note: One slow reader processing a large request could stall the connection. + // If we see this, we need to increase the recvCh buffer size. + return GetContextError(mex.ctx.Err()) + case <-mex.errCh.c: + // Select will randomly choose a case, but we want to prioritize + // sending a frame over the errCh. Try a non-blocking write. + select { + case mex.recvCh <- frame: + return nil + default: + } + return mex.errCh.err + } +} + +func (mex *messageExchange) checkFrame(frame *Frame) error { + if frame.Header.ID != mex.msgID { + mex.mexset.log.WithFields( + LogField{"msgId", mex.msgID}, + LogField{"header", frame.Header}, + ).Error("recvPeerFrame received msg with unexpected ID.") + return errUnexpectedFrameType + } + return nil +} + +// recvPeerFrame waits for a new frame from the peer, or until the context +// expires or is cancelled +func (mex *messageExchange) recvPeerFrame() (*Frame, error) { + // We have to check frames/errors in a very specific order here: + // 1. Timeouts/cancellation (mex.ctx errors) + // 2. Any pending frames (non-blocking select over mex.recvCh) + // 3. Other mex errors (mex.errCh) + // Which is why we check the context error only (instead of mex.checkError)e + // In the mex.errCh case, we do a non-blocking read from recvCh to prioritize it. + if err := mex.ctx.Err(); err != nil { + return nil, GetContextError(err) + } + + select { + case frame := <-mex.recvCh: + if err := mex.checkFrame(frame); err != nil { + return nil, err + } + return frame, nil + case <-mex.ctx.Done(): + return nil, GetContextError(mex.ctx.Err()) + case <-mex.errCh.c: + // Select will randomly choose a case, but we want to prioritize + // receiving a frame over errCh. Try a non-blocking read. + select { + case frame := <-mex.recvCh: + if err := mex.checkFrame(frame); err != nil { + return nil, err + } + return frame, nil + default: + } + return nil, mex.errCh.err + } +} + +// recvPeerFrameOfType waits for a new frame of a given type from the peer, failing +// if the next frame received is not of that type. +// If an error frame is returned, then the errorMessage is returned as the error. +func (mex *messageExchange) recvPeerFrameOfType(msgType messageType) (*Frame, error) { + frame, err := mex.recvPeerFrame() + if err != nil { + return nil, err + } + + switch frame.Header.messageType { + case msgType: + return frame, nil + + case messageTypeError: + // If we read an error frame, we can release it once we deserialize it. + defer mex.framePool.Release(frame) + + errMsg := errorMessage{ + id: frame.Header.ID, + } + var rbuf typed.ReadBuffer + rbuf.Wrap(frame.SizedPayload()) + if err := errMsg.read(&rbuf); err != nil { + return nil, err + } + return nil, errMsg + + default: + // TODO(mmihic): Should be treated as a protocol error + mex.mexset.log.WithFields( + LogField{"header", frame.Header}, + LogField{"expectedType", msgType}, + LogField{"expectedID", mex.msgID}, + ).Warn("Received unexpected frame.") + return nil, errUnexpectedFrameType + } +} + +// shutdown shuts down the message exchange, removing it from the message +// exchange set so that it cannot receive more messages from the peer. The +// receive channel remains open, however, in case there are concurrent +// goroutines sending to it. +func (mex *messageExchange) shutdown() { + // The reader and writer side can both hit errors and try to shutdown the mex, + // so we ensure that it's only shut down once. + if !mex.shutdownAtomic.CAS(false, true) { + return + } + + if mex.errChNotified.CAS(false, true) { + mex.errCh.Notify(errMexShutdown) + } + + mex.mexset.removeExchange(mex.msgID) +} + +// inboundExpired is called when an exchange is canceled or it times out, +// but a handler may still be running in the background. Since the handler may +// still write to the exchange, we cannot shutdown the exchange, but we should +// remove it from the connection's exchange list. +func (mex *messageExchange) inboundExpired() { + mex.mexset.expireExchange(mex.msgID) +} + +// A messageExchangeSet manages a set of active message exchanges. It is +// mainly used to route frames from a peer to the appropriate messageExchange, +// or to cancel or mark a messageExchange as being in error. Each Connection +// maintains two messageExchangeSets, one to manage exchanges that it has +// initiated (outbound), and another to manage exchanges that the peer has +// initiated (inbound). The message-type specific handlers are responsible for +// ensuring that their message exchanges are properly registered and removed +// from the corresponding exchange set. +type messageExchangeSet struct { + sync.RWMutex + + log Logger + name string + onRemoved func() + onAdded func() + + // maps are mutable, and are protected by the mutex. + exchanges map[uint32]*messageExchange + expiredExchanges map[uint32]struct{} + shutdown bool +} + +// newMessageExchangeSet creates a new messageExchangeSet with a given name. +func newMessageExchangeSet(log Logger, name string) *messageExchangeSet { + return &messageExchangeSet{ + name: name, + log: log.WithFields(LogField{"exchange", name}), + exchanges: make(map[uint32]*messageExchange), + expiredExchanges: make(map[uint32]struct{}), + } +} + +// addExchange adds an exchange, it must be called with the mexset locked. +func (mexset *messageExchangeSet) addExchange(mex *messageExchange) error { + if mexset.shutdown { + return errMexSetShutdown + } + + if _, ok := mexset.exchanges[mex.msgID]; ok { + return errDuplicateMex + } + + mexset.exchanges[mex.msgID] = mex + return nil +} + +// newExchange creates and adds a new message exchange to this set +func (mexset *messageExchangeSet) newExchange(ctx context.Context, framePool FramePool, + msgType messageType, msgID uint32, bufferSize int) (*messageExchange, error) { + if mexset.log.Enabled(LogLevelDebug) { + mexset.log.Debugf("Creating new %s message exchange for [%v:%d]", mexset.name, msgType, msgID) + } + + mex := &messageExchange{ + msgType: msgType, + msgID: msgID, + ctx: ctx, + recvCh: make(chan *Frame, bufferSize), + errCh: newErrNotifier(), + mexset: mexset, + framePool: framePool, + } + + mexset.Lock() + addErr := mexset.addExchange(mex) + mexset.Unlock() + + if addErr != nil { + logger := mexset.log.WithFields( + LogField{"msgID", mex.msgID}, + LogField{"msgType", mex.msgType}, + LogField{"exchange", mexset.name}, + ) + if addErr == errMexSetShutdown { + logger.Warn("Attempted to create new mex after mexset shutdown.") + } else if addErr == errDuplicateMex { + logger.Warn("Duplicate msg ID for active and new mex.") + } + + return nil, addErr + } + + mexset.onAdded() + + // TODO(mmihic): Put into a deadline ordered heap so we can garbage collected expired exchanges + return mex, nil +} + +// deleteExchange will delete msgID, and return whether it was found or whether it was +// timed out. This method must be called with the lock. +func (mexset *messageExchangeSet) deleteExchange(msgID uint32) (found, timedOut bool) { + if _, found := mexset.exchanges[msgID]; found { + delete(mexset.exchanges, msgID) + return true, false + } + + if _, expired := mexset.expiredExchanges[msgID]; expired { + delete(mexset.expiredExchanges, msgID) + return false, true + } + + return false, false +} + +// removeExchange removes a message exchange from the set, if it exists. +func (mexset *messageExchangeSet) removeExchange(msgID uint32) { + if mexset.log.Enabled(LogLevelDebug) { + mexset.log.Debugf("Removing %s message exchange %d", mexset.name, msgID) + } + + mexset.Lock() + found, expired := mexset.deleteExchange(msgID) + mexset.Unlock() + + if !found && !expired { + mexset.log.WithFields( + LogField{"msgID", msgID}, + ).Error("Tried to remove exchange multiple times") + return + } + + // If the message exchange was found, then we perform clean up actions. + // These clean up actions can only be run once per exchange. + mexset.onRemoved() +} + +// expireExchange is similar to removeExchange, but it marks the exchange as +// expired. +func (mexset *messageExchangeSet) expireExchange(msgID uint32) { + mexset.log.Debugf( + "Removing %s message exchange %d due to timeout, cancellation or blackhole", + mexset.name, + msgID, + ) + + mexset.Lock() + // TODO(aniketp): explore if cancel can be called everytime we expire an exchange + found, expired := mexset.deleteExchange(msgID) + if found || expired { + // Record in expiredExchanges if we deleted the exchange. + mexset.expiredExchanges[msgID] = struct{}{} + } + mexset.Unlock() + + if expired { + mexset.log.WithFields(LogField{"msgID", msgID}).Info("Exchange expired already") + } + + mexset.onRemoved() +} + +func (mexset *messageExchangeSet) count() int { + mexset.RLock() + count := len(mexset.exchanges) + mexset.RUnlock() + + return count +} + +// forwardPeerFrame forwards a frame from the peer to the appropriate message +// exchange +func (mexset *messageExchangeSet) forwardPeerFrame(frame *Frame) error { + if mexset.log.Enabled(LogLevelDebug) { + mexset.log.Debugf("forwarding %s %s", mexset.name, frame.Header) + } + + mexset.RLock() + mex := mexset.exchanges[frame.Header.ID] + mexset.RUnlock() + + if mex == nil { + // This is ok since the exchange might have expired or been cancelled + mexset.log.WithFields( + LogField{"frameHeader", frame.Header.String()}, + LogField{"exchange", mexset.name}, + ).Info("Received frame for unknown message exchange.") + return nil + } + + if err := mex.forwardPeerFrame(frame); err != nil { + mexset.log.WithFields( + LogField{"frameHeader", frame.Header.String()}, + LogField{"frameSize", frame.Header.FrameSize()}, + LogField{"exchange", mexset.name}, + ErrField(err), + ).Info("Failed to forward frame.") + return err + } + + return nil +} + +// copyExchanges returns a copy of the exchanges if the exchange is active. +// The caller must lock the mexset. +func (mexset *messageExchangeSet) copyExchanges() (shutdown bool, exchanges map[uint32]*messageExchange) { + if mexset.shutdown { + return true, nil + } + + exchangesCopy := make(map[uint32]*messageExchange, len(mexset.exchanges)) + for k, mex := range mexset.exchanges { + exchangesCopy[k] = mex + } + + return false, exchangesCopy +} + +// stopExchanges stops all message exchanges to unblock all waiters on the mex. +// This should only be called on connection failures. +func (mexset *messageExchangeSet) stopExchanges(err error) { + if mexset.log.Enabled(LogLevelDebug) { + mexset.log.Debugf("stopping %v exchanges due to error: %v", mexset.count(), err) + } + + mexset.Lock() + shutdown, exchanges := mexset.copyExchanges() + mexset.shutdown = true + mexset.Unlock() + + if shutdown { + mexset.log.Debugf("mexset has already been shutdown") + return + } + + for _, mex := range exchanges { + // When there's a connection failure, we want to notify blocked callers that the + // call will fail, but we don't want to shutdown the exchange as only the + // arg reader/writer should shutdown the exchange. Otherwise, our guarantee + // on sendChRefs that there's no references to sendCh is violated since + // readers/writers could still have a reference to sendCh even though + // we shutdown the exchange and called Done on sendChRefs. + if mex.errChNotified.CAS(false, true) { + mex.errCh.Notify(err) + } + } +} diff --git a/vendor/github.com/uber/tchannel-go/outbound.go b/vendor/github.com/uber/tchannel-go/outbound.go new file mode 100644 index 00000000..09eb6762 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/outbound.go @@ -0,0 +1,379 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "fmt" + "time" + + "github.com/uber/tchannel-go/typed" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + "golang.org/x/net/context" +) + +// maxMethodSize is the maximum size of arg1. +const maxMethodSize = 16 * 1024 + +// beginCall begins an outbound call on the connection +func (c *Connection) beginCall(ctx context.Context, serviceName, methodName string, callOptions *CallOptions) (*OutboundCall, error) { + now := c.timeNow() + + switch state := c.readState(); state { + case connectionActive: + break + case connectionStartClose, connectionInboundClosed, connectionClosed: + return nil, ErrConnectionClosed + default: + return nil, errConnectionUnknownState{"beginCall", state} + } + + deadline, ok := ctx.Deadline() + if !ok { + // This case is handled by validateCall, so we should + // never get here. + return nil, ErrTimeoutRequired + } + + // If the timeToLive is less than a millisecond, it will be encoded as 0 on + // the wire, hence we return a timeout immediately. + timeToLive := deadline.Sub(now) + if timeToLive < time.Millisecond { + return nil, ErrTimeout + } + + if err := ctx.Err(); err != nil { + return nil, GetContextError(err) + } + + requestID := c.NextMessageID() + mex, err := c.outbound.newExchange(ctx, c.opts.FramePool, messageTypeCallReq, requestID, mexChannelBufferSize) + if err != nil { + return nil, err + } + + // Close may have been called between the time we checked the state and us creating the exchange. + if state := c.readState(); state != connectionActive { + mex.shutdown() + return nil, ErrConnectionClosed + } + + // Note: We don't verify number of transport headers as the library doesn't + // allow adding arbitrary headers. Ensure we never add >= 256 headers here. + headers := transportHeaders{ + CallerName: c.localPeerInfo.ServiceName, + } + callOptions.setHeaders(headers) + if opts := currentCallOptions(ctx); opts != nil { + opts.overrideHeaders(headers) + } + + call := new(OutboundCall) + call.mex = mex + call.conn = c + call.callReq = callReq{ + id: requestID, + Headers: headers, + Service: serviceName, + TimeToLive: timeToLive, + } + call.statsReporter = c.statsReporter + call.createStatsTags(c.commonStatsTags, callOptions, methodName) + call.log = c.log.WithFields(LogField{"Out-Call", requestID}) + + // TODO(mmihic): It'd be nice to do this without an fptr + call.messageForFragment = func(initial bool) message { + if initial { + return &call.callReq + } + + return new(callReqContinue) + } + + call.contents = newFragmentingWriter(call.log, call, c.opts.ChecksumType.New()) + + response := new(OutboundCallResponse) + response.startedAt = now + response.timeNow = c.timeNow + response.requestState = callOptions.RequestState + response.mex = mex + response.log = c.log.WithFields(LogField{"Out-Response", requestID}) + response.span = c.startOutboundSpan(ctx, serviceName, methodName, call, now) + response.messageForFragment = func(initial bool) message { + if initial { + return &response.callRes + } + + return new(callResContinue) + } + response.contents = newFragmentingReader(response.log, response) + response.statsReporter = call.statsReporter + response.commonStatsTags = call.commonStatsTags + + call.response = response + + if err := call.writeMethod([]byte(methodName)); err != nil { + return nil, err + } + return call, nil +} + +// handleCallRes handles an incoming call req message, forwarding the +// frame to the response channel waiting for it +func (c *Connection) handleCallRes(frame *Frame) bool { + if err := c.outbound.forwardPeerFrame(frame); err != nil { + return true + } + return false +} + +// handleCallResContinue handles an incoming call res continue message, +// forwarding the frame to the response channel waiting for it +func (c *Connection) handleCallResContinue(frame *Frame) bool { + if err := c.outbound.forwardPeerFrame(frame); err != nil { + return true + } + return false +} + +// An OutboundCall is an active call to a remote peer. A client makes a call +// by calling BeginCall on the Channel, writing argument content via +// ArgWriter2() ArgWriter3(), and then reading reading response data via the +// ArgReader2() and ArgReader3() methods on the Response() object. +type OutboundCall struct { + reqResWriter + + callReq callReq + response *OutboundCallResponse + statsReporter StatsReporter + commonStatsTags map[string]string +} + +// Response provides access to the call's response object, which can be used to +// read response arguments +func (call *OutboundCall) Response() *OutboundCallResponse { + return call.response +} + +// createStatsTags creates the common stats tags, if they are not already created. +func (call *OutboundCall) createStatsTags(connectionTags map[string]string, callOptions *CallOptions, method string) { + call.commonStatsTags = map[string]string{ + "target-service": call.callReq.Service, + } + for k, v := range connectionTags { + call.commonStatsTags[k] = v + } + if callOptions.Format != HTTP { + call.commonStatsTags["target-endpoint"] = string(method) + } +} + +// writeMethod writes the method (arg1) to the call +func (call *OutboundCall) writeMethod(method []byte) error { + call.statsReporter.IncCounter("outbound.calls.send", call.commonStatsTags, 1) + return NewArgWriter(call.arg1Writer()).Write(method) +} + +// Arg2Writer returns a WriteCloser that can be used to write the second argument. +// The returned writer must be closed once the write is complete. +func (call *OutboundCall) Arg2Writer() (ArgWriter, error) { + return call.arg2Writer() +} + +// Arg3Writer returns a WriteCloser that can be used to write the last argument. +// The returned writer must be closed once the write is complete. +func (call *OutboundCall) Arg3Writer() (ArgWriter, error) { + return call.arg3Writer() +} + +// LocalPeer returns the local peer information for this call. +func (call *OutboundCall) LocalPeer() LocalPeerInfo { + return call.conn.localPeerInfo +} + +// RemotePeer returns the remote peer information for this call. +func (call *OutboundCall) RemotePeer() PeerInfo { + return call.conn.RemotePeerInfo() +} + +func (call *OutboundCall) doneSending() {} + +// An OutboundCallResponse is the response to an outbound call +type OutboundCallResponse struct { + reqResReader + + callRes callRes + + requestState *RequestState + // startedAt is the time at which the outbound call was started. + startedAt time.Time + timeNow func() time.Time + span opentracing.Span + statsReporter StatsReporter + commonStatsTags map[string]string +} + +// ApplicationError returns true if the call resulted in an application level error +// TODO(mmihic): In current implementation, you must have called Arg2Reader before this +// method returns the proper value. We should instead have this block until the first +// fragment is available, if the first fragment hasn't been received. +func (response *OutboundCallResponse) ApplicationError() bool { + // TODO(mmihic): Wait for first fragment + return response.callRes.ResponseCode == responseApplicationError +} + +// Format the format of the request from the ArgScheme transport header. +func (response *OutboundCallResponse) Format() Format { + return Format(response.callRes.Headers[ArgScheme]) +} + +// Arg2Reader returns an ArgReader to read the second argument. +// The ReadCloser must be closed once the argument has been read. +func (response *OutboundCallResponse) Arg2Reader() (ArgReader, error) { + var method []byte + if err := NewArgReader(response.arg1Reader()).Read(&method); err != nil { + return nil, err + } + + return response.arg2Reader() +} + +// Arg3Reader returns an ArgReader to read the last argument. +// The ReadCloser must be closed once the argument has been read. +func (response *OutboundCallResponse) Arg3Reader() (ArgReader, error) { + return response.arg3Reader() +} + +// handleError handles an error coming back from the peer. If the error is a +// protocol level error, the entire connection will be closed. If the error is +// a request specific error, it will be written to the request's response +// channel and converted into a SystemError returned from the next reader or +// access call. +// The return value is whether the frame should be released immediately. +func (c *Connection) handleError(frame *Frame) bool { + errMsg := errorMessage{ + id: frame.Header.ID, + } + rbuf := typed.NewReadBuffer(frame.SizedPayload()) + if err := errMsg.read(rbuf); err != nil { + c.log.WithFields( + LogField{"remotePeer", c.remotePeerInfo}, + ErrField(err), + ).Warn("Unable to read error frame.") + c.connectionError("parsing error frame", err) + return true + } + + if errMsg.errCode == ErrCodeProtocol { + c.log.WithFields( + LogField{"remotePeer", c.remotePeerInfo}, + LogField{"error", errMsg.message}, + ).Warn("Peer reported protocol error.") + c.connectionError("received protocol error", errMsg.AsSystemError()) + return true + } + + if err := c.outbound.forwardPeerFrame(frame); err != nil { + c.log.WithFields( + LogField{"frameHeader", frame.Header.String()}, + LogField{"id", errMsg.id}, + LogField{"errorMessage", errMsg.message}, + LogField{"errorCode", errMsg.errCode}, + ErrField(err), + ).Info("Failed to forward error frame.") + return true + } + + // If the frame was forwarded, then the other side is responsible for releasing the frame. + return false +} + +func cloneTags(tags map[string]string) map[string]string { + newTags := make(map[string]string, len(tags)) + for k, v := range tags { + newTags[k] = v + } + return newTags +} + +// doneReading shuts down the message exchange for this call. +// For outgoing calls, the last message is reading the call response. +func (response *OutboundCallResponse) doneReading(unexpected error) { + now := response.timeNow() + + isSuccess := unexpected == nil && !response.ApplicationError() + lastAttempt := isSuccess || !response.requestState.HasRetries(unexpected) + + // TODO how should this work with retries? + if span := response.span; span != nil { + if unexpected != nil { + span.LogEventWithPayload("error", unexpected) + } + if !isSuccess && lastAttempt { + ext.Error.Set(span, true) + } + span.FinishWithOptions(opentracing.FinishOptions{FinishTime: now}) + } + + latency := now.Sub(response.startedAt) + response.statsReporter.RecordTimer("outbound.calls.per-attempt.latency", response.commonStatsTags, latency) + if lastAttempt { + requestLatency := response.requestState.SinceStart(now, latency) + response.statsReporter.RecordTimer("outbound.calls.latency", response.commonStatsTags, requestLatency) + } + if retryCount := response.requestState.RetryCount(); retryCount > 0 { + retryTags := cloneTags(response.commonStatsTags) + retryTags["retry-count"] = fmt.Sprint(retryCount) + response.statsReporter.IncCounter("outbound.calls.retries", retryTags, 1) + } + + if unexpected != nil { + // TODO(prashant): Report the error code type as per metrics doc and enable. + // response.statsReporter.IncCounter("outbound.calls.system-errors", response.commonStatsTags, 1) + } else if response.ApplicationError() { + // TODO(prashant): Figure out how to add "type" to tags, which TChannel does not know about. + response.statsReporter.IncCounter("outbound.calls.per-attempt.app-errors", response.commonStatsTags, 1) + if lastAttempt { + response.statsReporter.IncCounter("outbound.calls.app-errors", response.commonStatsTags, 1) + } + } else { + response.statsReporter.IncCounter("outbound.calls.success", response.commonStatsTags, 1) + } + + response.mex.shutdown() +} + +func validateCall(ctx context.Context, serviceName, methodName string, callOpts *CallOptions) error { + if serviceName == "" { + return ErrNoServiceName + } + + if len(methodName) > maxMethodSize { + return ErrMethodTooLarge + } + + if _, ok := ctx.Deadline(); !ok { + return ErrTimeoutRequired + } + + return nil +} diff --git a/vendor/github.com/uber/tchannel-go/peer.go b/vendor/github.com/uber/tchannel-go/peer.go new file mode 100644 index 00000000..bd268ca4 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/peer.go @@ -0,0 +1,614 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "container/heap" + "errors" + "strings" + "sync" + "time" + + "github.com/uber/tchannel-go/trand" + + "go.uber.org/atomic" + "golang.org/x/net/context" +) + +var ( + // ErrInvalidConnectionState indicates that the connection is not in a valid state. + // This may be due to a race between selecting the connection and it closing, so + // it is a network failure that can be retried. + ErrInvalidConnectionState = NewSystemError(ErrCodeNetwork, "connection is in an invalid state") + + // ErrNoPeers indicates that there are no peers. + ErrNoPeers = errors.New("no peers available") + + // ErrPeerNotFound indicates that the specified peer was not found. + ErrPeerNotFound = errors.New("peer not found") + + // ErrNoNewPeers indicates that no previously unselected peer is available. + ErrNoNewPeers = errors.New("no new peer available") + + peerRng = trand.NewSeeded() +) + +// Connectable is the interface used by peers to create connections. +type Connectable interface { + // Connect tries to connect to the given hostPort. + Connect(ctx context.Context, hostPort string) (*Connection, error) + // Logger returns the logger to use. + Logger() Logger +} + +// PeerList maintains a list of Peers. +type PeerList struct { + sync.RWMutex + + parent *RootPeerList + peersByHostPort map[string]*peerScore + peerHeap *peerHeap + scoreCalculator ScoreCalculator + lastSelected uint64 +} + +func newPeerList(root *RootPeerList) *PeerList { + return &PeerList{ + parent: root, + peersByHostPort: make(map[string]*peerScore), + scoreCalculator: newPreferIncomingCalculator(), + peerHeap: newPeerHeap(), + } +} + +// SetStrategy sets customized peer selection strategy. +func (l *PeerList) SetStrategy(sc ScoreCalculator) { + l.Lock() + defer l.Unlock() + + l.scoreCalculator = sc + for _, ps := range l.peersByHostPort { + newScore := l.scoreCalculator.GetScore(ps.Peer) + l.updatePeer(ps, newScore) + } +} + +// Siblings don't share peer lists (though they take care not to double-connect +// to the same hosts). +func (l *PeerList) newSibling() *PeerList { + sib := newPeerList(l.parent) + return sib +} + +// Add adds a peer to the list if it does not exist, or returns any existing peer. +func (l *PeerList) Add(hostPort string) *Peer { + if ps, ok := l.exists(hostPort); ok { + return ps.Peer + } + l.Lock() + defer l.Unlock() + + if p, ok := l.peersByHostPort[hostPort]; ok { + return p.Peer + } + + p := l.parent.Add(hostPort) + p.addSC() + ps := newPeerScore(p, l.scoreCalculator.GetScore(p)) + + l.peersByHostPort[hostPort] = ps + l.peerHeap.addPeer(ps) + return p +} + +// GetNew returns a new, previously unselected peer from the peer list, or nil, +// if no new unselected peer can be found. +func (l *PeerList) GetNew(prevSelected map[string]struct{}) (*Peer, error) { + l.Lock() + defer l.Unlock() + if l.peerHeap.Len() == 0 { + return nil, ErrNoPeers + } + + // Select a peer, avoiding previously selected peers. If all peers have been previously + // selected, then it's OK to repick them. + peer := l.choosePeer(prevSelected, true /* avoidHost */) + if peer == nil { + peer = l.choosePeer(prevSelected, false /* avoidHost */) + } + if peer == nil { + return nil, ErrNoNewPeers + } + return peer, nil +} + +// Get returns a peer from the peer list, or nil if none can be found, +// will avoid previously selected peers if possible. +func (l *PeerList) Get(prevSelected map[string]struct{}) (*Peer, error) { + peer, err := l.GetNew(prevSelected) + if err == ErrNoNewPeers { + l.Lock() + peer = l.choosePeer(nil, false /* avoidHost */) + l.Unlock() + } else if err != nil { + return nil, err + } + if peer == nil { + return nil, ErrNoPeers + } + return peer, nil +} + +// Remove removes a peer from the peer list. It returns an error if the peer cannot be found. +// Remove does not affect connections to the peer in any way. +func (l *PeerList) Remove(hostPort string) error { + l.Lock() + defer l.Unlock() + + p, ok := l.peersByHostPort[hostPort] + if !ok { + return ErrPeerNotFound + } + + p.delSC() + delete(l.peersByHostPort, hostPort) + l.peerHeap.removePeer(p) + + return nil +} +func (l *PeerList) choosePeer(prevSelected map[string]struct{}, avoidHost bool) *Peer { + var psPopList []*peerScore + var ps *peerScore + + canChoosePeer := func(hostPort string) bool { + if _, ok := prevSelected[hostPort]; ok { + return false + } + if avoidHost { + if _, ok := prevSelected[getHost(hostPort)]; ok { + return false + } + } + return true + } + + size := l.peerHeap.Len() + for i := 0; i < size; i++ { + popped := l.peerHeap.popPeer() + + if canChoosePeer(popped.HostPort()) { + ps = popped + break + } + psPopList = append(psPopList, popped) + } + + for _, p := range psPopList { + heap.Push(l.peerHeap, p) + } + + if ps == nil { + return nil + } + + l.peerHeap.pushPeer(ps) + ps.chosenCount.Inc() + return ps.Peer +} + +// GetOrAdd returns a peer for the given hostPort, creating one if it doesn't yet exist. +func (l *PeerList) GetOrAdd(hostPort string) *Peer { + if ps, ok := l.exists(hostPort); ok { + return ps.Peer + } + return l.Add(hostPort) +} + +// Copy returns a copy of the PeerList as a map from hostPort to peer. +func (l *PeerList) Copy() map[string]*Peer { + l.RLock() + defer l.RUnlock() + + listCopy := make(map[string]*Peer) + for k, v := range l.peersByHostPort { + listCopy[k] = v.Peer + } + return listCopy +} + +// Len returns the length of the PeerList. +func (l *PeerList) Len() int { + l.RLock() + defer l.RUnlock() + return l.peerHeap.Len() +} + +// exists checks if a hostport exists in the peer list. +func (l *PeerList) exists(hostPort string) (*peerScore, bool) { + l.RLock() + ps, ok := l.peersByHostPort[hostPort] + l.RUnlock() + + return ps, ok +} + +// getPeerScore is called to find the peer and its score from a host port key. +// Note that at least a Read lock must be held to call this function. +func (l *PeerList) getPeerScore(hostPort string) (*peerScore, uint64, bool) { + ps, ok := l.peersByHostPort[hostPort] + if !ok { + return nil, 0, false + } + return ps, ps.score, ok +} + +// onPeerChange is called when there is a change that may cause the peer's score to change. +// The new score is calculated, and the peer heap is updated with the new score if the score changes. +func (l *PeerList) onPeerChange(p *Peer) { + l.RLock() + ps, psScore, ok := l.getPeerScore(p.hostPort) + sc := l.scoreCalculator + l.RUnlock() + if !ok { + return + } + + newScore := sc.GetScore(ps.Peer) + if newScore == psScore { + return + } + + l.Lock() + l.updatePeer(ps, newScore) + l.Unlock() +} + +// updatePeer is called to update the score of the peer given the existing score. +// Note that a Write lock must be held to call this function. +func (l *PeerList) updatePeer(ps *peerScore, newScore uint64) { + if ps.score == newScore { + return + } + + ps.score = newScore + l.peerHeap.updatePeer(ps) +} + +// peerScore represents a peer and scoring for the peer heap. +// It is not safe for concurrent access, it should only be used through the PeerList. +type peerScore struct { + *Peer + + // score according to the current peer list's ScoreCalculator. + score uint64 + // index of the peerScore in the peerHeap. Used to interact with container/heap. + index int + // order is the tiebreaker for when score is equal. It is set when a peer + // is pushed to the heap based on peerHeap.order with jitter. + order uint64 +} + +func newPeerScore(p *Peer, score uint64) *peerScore { + return &peerScore{ + Peer: p, + score: score, + index: -1, + } +} + +// Peer represents a single autobahn service or client with a unique host:port. +type Peer struct { + sync.RWMutex + + channel Connectable + hostPort string + onStatusChanged func(*Peer) + onClosedConnRemoved func(*Peer) + + // scCount is the number of subchannels that this peer is added to. + scCount uint32 + + // connections are mutable, and are protected by the mutex. + newConnLock sync.Mutex + inboundConnections []*Connection + outboundConnections []*Connection + chosenCount atomic.Uint64 + + // onUpdate is a test-only hook. + onUpdate func(*Peer) +} + +func newPeer(channel Connectable, hostPort string, onStatusChanged func(*Peer), onClosedConnRemoved func(*Peer)) *Peer { + if hostPort == "" { + panic("Cannot create peer with blank hostPort") + } + if onStatusChanged == nil { + onStatusChanged = noopOnStatusChanged + } + return &Peer{ + channel: channel, + hostPort: hostPort, + onStatusChanged: onStatusChanged, + onClosedConnRemoved: onClosedConnRemoved, + } +} + +// HostPort returns the host:port used to connect to this peer. +func (p *Peer) HostPort() string { + return p.hostPort +} + +// getConn treats inbound and outbound connections as a single virtual list +// that can be indexed. The peer must be read-locked. +func (p *Peer) getConn(i int) *Connection { + inboundLen := len(p.inboundConnections) + if i < inboundLen { + return p.inboundConnections[i] + } + + return p.outboundConnections[i-inboundLen] +} + +func (p *Peer) getActiveConnLocked() (*Connection, bool) { + allConns := len(p.inboundConnections) + len(p.outboundConnections) + if allConns == 0 { + return nil, false + } + + // We cycle through the connection list, starting at a random point + // to avoid always choosing the same connection. + startOffset := peerRng.Intn(allConns) + for i := 0; i < allConns; i++ { + connIndex := (i + startOffset) % allConns + if conn := p.getConn(connIndex); conn.IsActive() { + return conn, true + } + } + + return nil, false +} + +// getActiveConn will randomly select an active connection. +// TODO(prashant): Should we clear inactive connections? +// TODO(prashant): Do we want some sort of scoring for connections? +func (p *Peer) getActiveConn() (*Connection, bool) { + p.RLock() + conn, ok := p.getActiveConnLocked() + p.RUnlock() + + return conn, ok +} + +// GetConnection returns an active connection to this peer. If no active connections +// are found, it will create a new outbound connection and return it. +func (p *Peer) GetConnection(ctx context.Context) (*Connection, error) { + if activeConn, ok := p.getActiveConn(); ok { + return activeConn, nil + } + + // Lock here to restrict new connection creation attempts to one goroutine + p.newConnLock.Lock() + defer p.newConnLock.Unlock() + + // Check active connections again in case someone else got ahead of us. + if activeConn, ok := p.getActiveConn(); ok { + return activeConn, nil + } + + // No active connections, make a new outgoing connection. + return p.Connect(ctx) +} + +// getConnectionRelay gets a connection, and uses the given timeout to lazily +// create a context if a new connection is required. +func (p *Peer) getConnectionRelay(timeout time.Duration) (*Connection, error) { + if conn, ok := p.getActiveConn(); ok { + return conn, nil + } + + // Lock here to restrict new connection creation attempts to one goroutine + p.newConnLock.Lock() + defer p.newConnLock.Unlock() + + // Check active connections again in case someone else got ahead of us. + if activeConn, ok := p.getActiveConn(); ok { + return activeConn, nil + } + + // When the relay creates outbound connections, we don't want those services + // to ever connect back to us and send us traffic. We hide the host:port + // so that service instances on remote machines don't try to connect back + // and don't try to send Hyperbahn traffic on this connection. + ctx, cancel := NewContextBuilder(timeout).HideListeningOnOutbound().Build() + defer cancel() + + return p.Connect(ctx) +} + +// addSC adds a reference to a peer from a subchannel (e.g. peer list). +func (p *Peer) addSC() { + p.Lock() + p.scCount++ + p.Unlock() +} + +// delSC removes a reference to a peer from a subchannel (e.g. peer list). +func (p *Peer) delSC() { + p.Lock() + p.scCount-- + p.Unlock() +} + +// canRemove returns whether this peer can be safely removed from the root peer list. +func (p *Peer) canRemove() bool { + p.RLock() + count := len(p.inboundConnections) + len(p.outboundConnections) + int(p.scCount) + p.RUnlock() + return count == 0 +} + +// addConnection adds an active connection to the peer's connection list. +// If a connection is not active, returns ErrInvalidConnectionState. +func (p *Peer) addConnection(c *Connection, direction connectionDirection) error { + conns := p.connectionsFor(direction) + + if c.readState() != connectionActive { + return ErrInvalidConnectionState + } + + p.Lock() + *conns = append(*conns, c) + p.Unlock() + + // Inform third parties that a peer gained a connection. + p.onStatusChanged(p) + + return nil +} + +func (p *Peer) connectionsFor(direction connectionDirection) *[]*Connection { + if direction == inbound { + return &p.inboundConnections + } + return &p.outboundConnections +} + +// removeConnection will check remove the connection if it exists on connsPtr +// and returns whether it removed the connection. +func (p *Peer) removeConnection(connsPtr *[]*Connection, changed *Connection) bool { + conns := *connsPtr + for i, c := range conns { + if c == changed { + // Remove the connection by moving the last item forward, and slicing the list. + last := len(conns) - 1 + conns[i], conns[last] = conns[last], nil + *connsPtr = conns[:last] + return true + } + } + + return false +} + +// connectionStateChanged is called when one of the peers' connections states changes. +// All non-active connections are removed from the peer. The connection will +// still be tracked by the channel until it's completely closed. +func (p *Peer) connectionCloseStateChange(changed *Connection) { + if changed.IsActive() { + return + } + + p.Lock() + found := p.removeConnection(&p.inboundConnections, changed) + if !found { + found = p.removeConnection(&p.outboundConnections, changed) + } + p.Unlock() + + if found { + p.onClosedConnRemoved(p) + // Inform third parties that a peer lost a connection. + p.onStatusChanged(p) + } +} + +// Connect adds a new outbound connection to the peer. +func (p *Peer) Connect(ctx context.Context) (*Connection, error) { + return p.channel.Connect(ctx, p.hostPort) +} + +// BeginCall starts a new call to this specific peer, returning an OutboundCall that can +// be used to write the arguments of the call. +func (p *Peer) BeginCall(ctx context.Context, serviceName, methodName string, callOptions *CallOptions) (*OutboundCall, error) { + if callOptions == nil { + callOptions = defaultCallOptions + } + callOptions.RequestState.AddSelectedPeer(p.HostPort()) + + if err := validateCall(ctx, serviceName, methodName, callOptions); err != nil { + return nil, err + } + + conn, err := p.GetConnection(ctx) + if err != nil { + return nil, err + } + + call, err := conn.beginCall(ctx, serviceName, methodName, callOptions) + if err != nil { + return nil, err + } + + return call, err +} + +// NumConnections returns the number of inbound and outbound connections for this peer. +func (p *Peer) NumConnections() (inbound int, outbound int) { + p.RLock() + inbound = len(p.inboundConnections) + outbound = len(p.outboundConnections) + p.RUnlock() + return inbound, outbound +} + +// NumPendingOutbound returns the number of pending outbound calls. +func (p *Peer) NumPendingOutbound() int { + count := 0 + p.RLock() + for _, c := range p.outboundConnections { + count += c.outbound.count() + } + + for _, c := range p.inboundConnections { + count += c.outbound.count() + } + p.RUnlock() + return count +} + +func (p *Peer) runWithConnections(f func(*Connection)) { + p.RLock() + for _, c := range p.inboundConnections { + f(c) + } + + for _, c := range p.outboundConnections { + f(c) + } + p.RUnlock() +} + +func (p *Peer) callOnUpdateComplete() { + p.RLock() + f := p.onUpdate + p.RUnlock() + + if f != nil { + f(p) + } +} + +func noopOnStatusChanged(*Peer) {} + +// isEphemeralHostPort returns if hostPort is the default ephemeral hostPort. +func isEphemeralHostPort(hostPort string) bool { + return hostPort == "" || hostPort == ephemeralHostPort || strings.HasSuffix(hostPort, ":0") +} diff --git a/vendor/github.com/uber/tchannel-go/peer_heap.go b/vendor/github.com/uber/tchannel-go/peer_heap.go new file mode 100644 index 00000000..e59ac376 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/peer_heap.go @@ -0,0 +1,122 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "container/heap" + "math/rand" + + "github.com/uber/tchannel-go/trand" +) + +// peerHeap maintains a min-heap of peers based on the peers' score. All method +// calls must be serialized externally. +type peerHeap struct { + peerScores []*peerScore + rng *rand.Rand + order uint64 +} + +func newPeerHeap() *peerHeap { + return &peerHeap{rng: trand.NewSeeded()} +} + +func (ph peerHeap) Len() int { return len(ph.peerScores) } + +func (ph *peerHeap) Less(i, j int) bool { + if ph.peerScores[i].score == ph.peerScores[j].score { + return ph.peerScores[i].order < ph.peerScores[j].order + } + return ph.peerScores[i].score < ph.peerScores[j].score +} + +func (ph peerHeap) Swap(i, j int) { + ph.peerScores[i], ph.peerScores[j] = ph.peerScores[j], ph.peerScores[i] + ph.peerScores[i].index = i + ph.peerScores[j].index = j +} + +// Push implements heap Push interface +func (ph *peerHeap) Push(x interface{}) { + n := len(ph.peerScores) + item := x.(*peerScore) + item.index = n + ph.peerScores = append(ph.peerScores, item) +} + +// Pop implements heap Pop interface +func (ph *peerHeap) Pop() interface{} { + old := *ph + n := len(old.peerScores) + item := old.peerScores[n-1] + item.index = -1 // for safety + ph.peerScores = old.peerScores[:n-1] + return item +} + +// updatePeer updates the score for the given peer. +func (ph *peerHeap) updatePeer(peerScore *peerScore) { + heap.Fix(ph, peerScore.index) +} + +// removePeer remove peer at specific index. +func (ph *peerHeap) removePeer(peerScore *peerScore) { + heap.Remove(ph, peerScore.index) +} + +// popPeer pops the top peer of the heap. +func (ph *peerHeap) popPeer() *peerScore { + return heap.Pop(ph).(*peerScore) +} + +// pushPeer pushes the new peer into the heap. +func (ph *peerHeap) pushPeer(peerScore *peerScore) { + ph.order++ + newOrder := ph.order + // randRange will affect the deviation of peer's chosenCount + randRange := ph.Len()/2 + 1 + peerScore.order = newOrder + uint64(ph.rng.Intn(randRange)) + heap.Push(ph, peerScore) +} + +func (ph *peerHeap) swapOrder(i, j int) { + if i == j { + return + } + + ph.peerScores[i].order, ph.peerScores[j].order = ph.peerScores[j].order, ph.peerScores[i].order + heap.Fix(ph, i) + heap.Fix(ph, j) +} + +// AddPeer adds a peer to the peer heap. +func (ph *peerHeap) addPeer(peerScore *peerScore) { + ph.pushPeer(peerScore) + + // Pick a random element, and swap the order with that peerScore. + r := ph.rng.Intn(ph.Len()) + ph.swapOrder(peerScore.index, r) +} + +// Exposed for testing purposes. +func (ph *peerHeap) peek() *peerScore { + return ph.peerScores[0] +} diff --git a/vendor/github.com/uber/tchannel-go/peer_strategies.go b/vendor/github.com/uber/tchannel-go/peer_strategies.go new file mode 100644 index 00000000..fd12e169 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/peer_strategies.go @@ -0,0 +1,89 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import "math" + +// ScoreCalculator defines the interface to calculate the score. +type ScoreCalculator interface { + GetScore(p *Peer) uint64 +} + +// ScoreCalculatorFunc is an adapter that allows functions to be used as ScoreCalculator +type ScoreCalculatorFunc func(p *Peer) uint64 + +// GetScore calls the underlying function. +func (f ScoreCalculatorFunc) GetScore(p *Peer) uint64 { + return f(p) +} + +type zeroCalculator struct{} + +func (zeroCalculator) GetScore(p *Peer) uint64 { + return 0 +} + +func newZeroCalculator() zeroCalculator { + return zeroCalculator{} +} + +type leastPendingCalculator struct{} + +func (leastPendingCalculator) GetScore(p *Peer) uint64 { + inbound, outbound := p.NumConnections() + if inbound+outbound == 0 { + return math.MaxUint64 + } + + return uint64(p.NumPendingOutbound()) +} + +// newLeastPendingCalculator returns a strategy prefers any connected peer. +// Within connected peers, least pending calls is used. Peers with less pending outbound calls +// get a smaller score. +func newLeastPendingCalculator() leastPendingCalculator { + return leastPendingCalculator{} +} + +type preferIncomingCalculator struct{} + +func (preferIncomingCalculator) GetScore(p *Peer) uint64 { + inbound, outbound := p.NumConnections() + if inbound+outbound == 0 { + return math.MaxUint64 + } + + numPendingOutbound := uint64(p.NumPendingOutbound()) + if inbound == 0 { + return math.MaxInt32 + numPendingOutbound + } + + return numPendingOutbound +} + +// newPreferIncomingCalculator returns a strategy that prefers peers with incoming connections. +// The scoring tiers are: +// Peers with incoming connections, peers with any connections, unconnected peers. +// Within each tier, least pending calls is used. Peers with less pending outbound calls +// get a smaller score. +func newPreferIncomingCalculator() preferIncomingCalculator { + return preferIncomingCalculator{} +} diff --git a/vendor/github.com/uber/tchannel-go/preinit_connection.go b/vendor/github.com/uber/tchannel-go/preinit_connection.go new file mode 100644 index 00000000..c80955e1 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/preinit_connection.go @@ -0,0 +1,250 @@ +// Copyright (c) 2017 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "encoding/binary" + "fmt" + "io" + "math" + "net" + "strconv" + "time" + + "golang.org/x/net/context" +) + +func (ch *Channel) outboundHandshake(ctx context.Context, c net.Conn, outboundHP string, events connectionEvents) (_ *Connection, err error) { + defer setInitDeadline(ctx, c)() + defer func() { + err = ch.initError(c, outbound, 1, err) + }() + + msg := &initReq{initMessage: ch.getInitMessage(ctx, 1)} + if err := ch.writeMessage(c, msg); err != nil { + return nil, err + } + + res := &initRes{} + id, err := ch.readMessage(c, res) + if err != nil { + return nil, err + } + + if id != msg.id { + return nil, NewSystemError(ErrCodeProtocol, "received initRes with invalid ID, wanted %v, got %v", msg.id, id) + } + + if res.Version != CurrentProtocolVersion { + return nil, unsupportedProtocolVersion(res.Version) + } + + remotePeer, remotePeerAddress, err := parseRemotePeer(res.initParams, c.RemoteAddr()) + if err != nil { + return nil, NewWrappedSystemError(ErrCodeProtocol, err) + } + + return ch.newConnection(c, 1 /* initialID */, outboundHP, remotePeer, remotePeerAddress, events), nil +} + +func (ch *Channel) inboundHandshake(ctx context.Context, c net.Conn, events connectionEvents) (_ *Connection, err error) { + id := uint32(math.MaxUint32) + + defer setInitDeadline(ctx, c)() + defer func() { + err = ch.initError(c, inbound, id, err) + }() + + req := &initReq{} + id, err = ch.readMessage(c, req) + if err != nil { + return nil, err + } + + if req.Version < CurrentProtocolVersion { + return nil, unsupportedProtocolVersion(req.Version) + } + + remotePeer, remotePeerAddress, err := parseRemotePeer(req.initParams, c.RemoteAddr()) + if err != nil { + return nil, NewWrappedSystemError(ErrCodeProtocol, err) + } + + res := &initRes{initMessage: ch.getInitMessage(ctx, id)} + if err := ch.writeMessage(c, res); err != nil { + return nil, err + } + + return ch.newConnection(c, 0 /* initialID */, "" /* outboundHP */, remotePeer, remotePeerAddress, events), nil +} + +func (ch *Channel) getInitParams() initParams { + localPeer := ch.PeerInfo() + return initParams{ + InitParamHostPort: localPeer.HostPort, + InitParamProcessName: localPeer.ProcessName, + InitParamTChannelLanguage: localPeer.Version.Language, + InitParamTChannelLanguageVersion: localPeer.Version.LanguageVersion, + InitParamTChannelVersion: localPeer.Version.TChannelVersion, + } +} + +func (ch *Channel) getInitMessage(ctx context.Context, id uint32) initMessage { + msg := initMessage{ + id: id, + Version: CurrentProtocolVersion, + initParams: ch.getInitParams(), + } + if p := getTChannelParams(ctx); p != nil && p.hideListeningOnOutbound { + msg.initParams[InitParamHostPort] = ephemeralHostPort + } + + return msg +} + +func (ch *Channel) initError(c net.Conn, connDir connectionDirection, id uint32, err error) error { + if err == nil { + return nil + } + + ch.log.WithFields(LogFields{ + {"connectionDirection", connDir}, + {"localAddr", c.LocalAddr().String()}, + {"remoteAddr", c.RemoteAddr().String()}, + ErrField(err), + }...).Error("Failed during connection handshake.") + + if ne, ok := err.(net.Error); ok && ne.Timeout() { + err = ErrTimeout + } + if err == io.EOF { + err = NewWrappedSystemError(ErrCodeNetwork, io.EOF) + } + ch.writeMessage(c, &errorMessage{ + id: id, + errCode: GetSystemErrorCode(err), + message: err.Error(), + }) + c.Close() + return err +} + +func (ch *Channel) writeMessage(c net.Conn, msg message) error { + frame := ch.connectionOptions.FramePool.Get() + defer ch.connectionOptions.FramePool.Release(frame) + + if err := frame.write(msg); err != nil { + return err + } + return frame.WriteOut(c) +} + +func (ch *Channel) readMessage(c net.Conn, msg message) (uint32, error) { + frame := ch.connectionOptions.FramePool.Get() + defer ch.connectionOptions.FramePool.Release(frame) + + if err := frame.ReadIn(c); err != nil { + return 0, err + } + + if frame.Header.messageType != msg.messageType() { + if frame.Header.messageType == messageTypeError { + return frame.Header.ID, readError(frame) + } + return frame.Header.ID, NewSystemError(ErrCodeProtocol, "expected message type %v, got %v", msg.messageType(), frame.Header.messageType) + } + + return frame.Header.ID, frame.read(msg) +} + +func parseRemotePeer(p initParams, remoteAddr net.Addr) (PeerInfo, peerAddressComponents, error) { + var ( + remotePeer PeerInfo + remotePeerAddress peerAddressComponents + ok bool + ) + + if remotePeer.HostPort, ok = p[InitParamHostPort]; !ok { + return remotePeer, remotePeerAddress, fmt.Errorf("header %v is required", InitParamHostPort) + } + if remotePeer.ProcessName, ok = p[InitParamProcessName]; !ok { + return remotePeer, remotePeerAddress, fmt.Errorf("header %v is required", InitParamProcessName) + } + + // If the remote host:port is ephemeral, use the socket address as the + // host:port and set IsEphemeral to true. + if isEphemeralHostPort(remotePeer.HostPort) { + remotePeer.HostPort = remoteAddr.String() + remotePeer.IsEphemeral = true + } + + remotePeer.Version.Language = p[InitParamTChannelLanguage] + remotePeer.Version.LanguageVersion = p[InitParamTChannelLanguageVersion] + remotePeer.Version.TChannelVersion = p[InitParamTChannelVersion] + + address := remotePeer.HostPort + if sHost, sPort, err := net.SplitHostPort(address); err == nil { + address = sHost + if p, err := strconv.ParseUint(sPort, 10, 16); err == nil { + remotePeerAddress.port = uint16(p) + } + } + if address == "localhost" { + remotePeerAddress.ipv4 = 127<<24 | 1 + } else if ip := net.ParseIP(address); ip != nil { + if ip4 := ip.To4(); ip4 != nil { + remotePeerAddress.ipv4 = binary.BigEndian.Uint32(ip4) + } else { + remotePeerAddress.ipv6 = address + } + } else { + remotePeerAddress.hostname = address + } + + return remotePeer, remotePeerAddress, nil +} + +func setInitDeadline(ctx context.Context, c net.Conn) func() { + deadline, ok := ctx.Deadline() + if !ok { + deadline = time.Now().Add(5 * time.Second) + } + + c.SetDeadline(deadline) + return func() { + c.SetDeadline(time.Time{}) + } +} + +func readError(frame *Frame) error { + errMsg := &errorMessage{ + id: frame.Header.ID, + } + if err := frame.read(errMsg); err != nil { + return err + } + + return errMsg.AsSystemError() +} + +func unsupportedProtocolVersion(got uint16) error { + return NewSystemError(ErrCodeProtocol, "unsupported protocol version %d from peer, expected %v", got, CurrentProtocolVersion) +} diff --git a/vendor/github.com/uber/tchannel-go/relay.go b/vendor/github.com/uber/tchannel-go/relay.go new file mode 100644 index 00000000..6d4f24e5 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/relay.go @@ -0,0 +1,656 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "errors" + "fmt" + "math" + "sync" + "time" + + "github.com/uber/tchannel-go/relay" + + "go.uber.org/atomic" +) + +const ( + // _maxRelayTombs is the maximum number of tombs we'll accumulate in a + // single relayItems. + _maxRelayTombs = 3e4 + // _relayTombTTL is the length of time we'll keep a tomb before GC'ing it. + _relayTombTTL = 3 * time.Second + // _defaultRelayMaxTimeout is the default max TTL for relayed calls. + _defaultRelayMaxTimeout = 2 * time.Minute +) + +// Error strings. +const ( + _relayErrorNotFound = "relay-not-found" + _relayErrorDestConnSlow = "relay-dest-conn-slow" + _relayErrorSourceConnSlow = "relay-source-conn-slow" +) + +var ( + errRelayMethodFragmented = NewSystemError(ErrCodeBadRequest, "relay handler cannot receive fragmented calls") + errFrameNotSent = NewSystemError(ErrCodeNetwork, "frame was not sent to remote side") + errBadRelayHost = NewSystemError(ErrCodeDeclined, "bad relay host implementation") + errUnknownID = errors.New("non-callReq for inactive ID") +) + +type relayItem struct { + remapID uint32 + tomb bool + local bool + call RelayCall + destination *Relayer + span Span + timeout *relayTimer +} + +type relayItems struct { + sync.RWMutex + + logger Logger + timeouts *relayTimerPool + tombs uint64 + items map[uint32]relayItem +} + +func newRelayItems(logger Logger) *relayItems { + return &relayItems{ + items: make(map[uint32]relayItem), + logger: logger, + } +} + +// Count returns the number of non-tombstone items in the relay. +func (r *relayItems) Count() int { + r.RLock() + n := len(r.items) - int(r.tombs) + r.RUnlock() + return n +} + +// Get checks for a relay item by ID, returning the item and a bool indicating +// whether the item was found. +func (r *relayItems) Get(id uint32) (relayItem, bool) { + r.RLock() + item, ok := r.items[id] + r.RUnlock() + + return item, ok +} + +// Add adds a relay item. +func (r *relayItems) Add(id uint32, item relayItem) { + r.Lock() + r.items[id] = item + r.Unlock() +} + +// Delete removes a relayItem completely (without leaving a tombstone). It +// returns the deleted item, along with a bool indicating whether we completed a +// relayed call. +func (r *relayItems) Delete(id uint32) (relayItem, bool) { + r.Lock() + item, ok := r.items[id] + if !ok { + r.Unlock() + r.logger.WithFields(LogField{"id", id}).Warn("Attempted to delete non-existent relay item.") + return item, false + } + delete(r.items, id) + if item.tomb { + r.tombs-- + } + r.Unlock() + + item.timeout.Release() + return item, !item.tomb +} + +// Entomb sets the tomb bit on a relayItem and schedules a garbage collection. It +// returns the entombed item, along with a bool indicating whether we completed +// a relayed call. +func (r *relayItems) Entomb(id uint32, deleteAfter time.Duration) (relayItem, bool) { + r.Lock() + if r.tombs > _maxRelayTombs { + r.Unlock() + r.logger.WithFields(LogField{"id", id}).Warn("Too many tombstones, deleting relay item immediately.") + return r.Delete(id) + } + item, ok := r.items[id] + if !ok { + r.Unlock() + r.logger.WithFields(LogField{"id", id}).Warn("Can't find relay item to entomb.") + return item, false + } + if item.tomb { + r.Unlock() + r.logger.WithFields(LogField{"id", id}).Warn("Re-entombing a tombstone.") + return item, false + } + r.tombs++ + item.tomb = true + r.items[id] = item + r.Unlock() + + // TODO: We should be clearing these out in batches, rather than creating + // individual timers for each item. + time.AfterFunc(deleteAfter, func() { r.Delete(id) }) + return item, true +} + +type frameType int + +const ( + requestFrame frameType = 0 + responseFrame frameType = 1 +) + +// A Relayer forwards frames. +type Relayer struct { + relayHost RelayHost + maxTimeout time.Duration + + // localHandlers is the set of service names that are handled by the local + // channel. + localHandler map[string]struct{} + + // outbound is the remapping for requests that originated on this + // connection, and are outbound towards some other connection. + // It stores remappings for all request frames read on this connection. + outbound *relayItems + + // inbound is the remapping for requests that originated on some other + // connection which was directed to this connection. + // It stores remappings for all response frames read on this connection. + inbound *relayItems + + // timeouts is the pool of timers used to track call timeouts. + // It allows timer re-use, while allowing timers to be created and started separately. + timeouts *relayTimerPool + + peers *RootPeerList + conn *Connection + relayConn *relay.Conn + logger Logger + pending atomic.Uint32 +} + +// NewRelayer constructs a Relayer. +func NewRelayer(ch *Channel, conn *Connection) *Relayer { + r := &Relayer{ + relayHost: ch.RelayHost(), + maxTimeout: ch.relayMaxTimeout, + localHandler: ch.relayLocal, + outbound: newRelayItems(conn.log.WithFields(LogField{"relayItems", "outbound"})), + inbound: newRelayItems(conn.log.WithFields(LogField{"relayItems", "inbound"})), + peers: ch.RootPeers(), + conn: conn, + relayConn: &relay.Conn{ + RemoteAddr: conn.conn.RemoteAddr().String(), + RemoteProcessName: conn.RemotePeerInfo().ProcessName, + IsOutbound: conn.connDirection == outbound, + }, + logger: conn.log, + } + r.timeouts = newRelayTimerPool(r.timeoutRelayItem, ch.relayTimerVerify) + return r +} + +// Relay is called for each frame that is read on the connection. +func (r *Relayer) Relay(f *Frame) error { + if f.messageType() != messageTypeCallReq { + err := r.handleNonCallReq(f) + if err == errUnknownID { + // This ID may be owned by an outgoing call, so check the outbound + // message exchange, and if it succeeds, then the frame has been + // handled successfully. + if err := r.conn.outbound.forwardPeerFrame(f); err == nil { + return nil + } + } + return err + } + return r.handleCallReq(newLazyCallReq(f)) +} + +// Receive receives frames intended for this connection. +// It returns whether the frame was sent and a reason for failure if it failed. +func (r *Relayer) Receive(f *Frame, fType frameType) (sent bool, failureReason string) { + id := f.Header.ID + + // If we receive a response frame, we expect to find that ID in our outbound. + // If we receive a request frame, we expect to find that ID in our inbound. + items := r.receiverItems(fType) + + item, ok := items.Get(id) + if !ok { + r.logger.WithFields( + LogField{"id", id}, + ).Warn("Received a frame without a RelayItem.") + return false, _relayErrorNotFound + } + + finished := finishesCall(f) + if item.tomb { + // Call timed out, ignore this frame. (We've already handled stats.) + // TODO: metrics for late-arriving frames. + return true, "" + } + + // If the call is finished, we stop the timeout to ensure + // we don't have concurrent calls to end the call. + if finished && !item.timeout.Stop() { + // Timeout goroutine is already ending this call. + return true, "" + } + + // call res frames don't include the OK bit, so we can't wait until the last + // frame of a relayed RPC to determine if the call succeeded. + if fType == responseFrame { + // If we've gotten a response frame, we're the originating relayer and + // should handle stats. + if succeeded, failMsg := determinesCallSuccess(f); succeeded { + item.call.Succeeded() + } else if len(failMsg) > 0 { + item.call.Failed(failMsg) + } + } + select { + case r.conn.sendCh <- f: + default: + // Buffer is full, so drop this frame and cancel the call. + r.logger.WithFields( + LogField{"id", id}, + ).Warn("Dropping call due to slow connection.") + + items := r.receiverItems(fType) + + err := _relayErrorDestConnSlow + // If we're dealing with a response frame, then the client is slow. + if fType == responseFrame { + err = _relayErrorSourceConnSlow + } + + r.failRelayItem(items, id, err) + return false, err + } + + if finished { + r.finishRelayItem(items, id) + } + + return true, "" +} + +func (r *Relayer) canHandleNewCall() (bool, connectionState) { + var ( + canHandle bool + curState connectionState + ) + + r.conn.withStateRLock(func() error { + curState = r.conn.state + canHandle = curState == connectionActive + if canHandle { + r.pending.Inc() + } + return nil + }) + return canHandle, curState +} + +func (r *Relayer) getDestination(f lazyCallReq, call RelayCall) (*Connection, bool, error) { + if _, ok := r.outbound.Get(f.Header.ID); ok { + r.logger.WithFields( + LogField{"id", f.Header.ID}, + LogField{"source", string(f.Caller())}, + LogField{"dest", string(f.Service())}, + LogField{"method", string(f.Method())}, + ).Warn("Received duplicate callReq.") + call.Failed(ErrCodeProtocol.relayMetricsKey()) + // TODO: this is a protocol error, kill the connection. + return nil, false, errors.New("callReq with already active ID") + } + + // Get the destination + peer, ok := call.Destination() + if !ok { + call.Failed("relay-bad-relay-host") + r.conn.SendSystemError(f.Header.ID, f.Span(), errBadRelayHost) + return nil, false, errBadRelayHost + } + + // TODO: Should connections use the call timeout? Or a separate timeout? + remoteConn, err := peer.getConnectionRelay(f.TTL()) + if err != nil { + r.logger.WithFields( + ErrField(err), + LogField{"source", string(f.Caller())}, + LogField{"dest", string(f.Service())}, + LogField{"method", string(f.Method())}, + LogField{"selectedPeer", peer}, + ).Warn("Failed to connect to relay host.") + call.Failed("relay-connection-failed") + r.conn.SendSystemError(f.Header.ID, f.Span(), NewWrappedSystemError(ErrCodeNetwork, err)) + return nil, false, nil + } + + return remoteConn, true, nil +} + +func (r *Relayer) handleCallReq(f lazyCallReq) error { + if handled := r.handleLocalCallReq(f); handled { + return nil + } + + call, err := r.relayHost.Start(f, r.relayConn) + if err != nil { + // If we have a RateLimitDropError we record the statistic, but + // we *don't* send an error frame back to the client. + if _, silentlyDrop := err.(relay.RateLimitDropError); silentlyDrop { + if call != nil { + call.Failed("relay-dropped") + call.End() + } + return nil + } + if _, ok := err.(SystemError); !ok { + err = NewSystemError(ErrCodeDeclined, err.Error()) + } + if call != nil { + call.Failed(GetSystemErrorCode(err).relayMetricsKey()) + call.End() + } + r.conn.SendSystemError(f.Header.ID, f.Span(), err) + + // If the RelayHost returns a protocol error, close the connection. + if GetSystemErrorCode(err) == ErrCodeProtocol { + return r.conn.close(LogField{"reason", "RelayHost returned protocol error"}) + } + return nil + } + + // Check that the current connection is in a valid state to handle a new call. + if canHandle, state := r.canHandleNewCall(); !canHandle { + call.Failed("relay-client-conn-inactive") + call.End() + err := errConnNotActive{"incoming", state} + r.conn.SendSystemError(f.Header.ID, f.Span(), NewWrappedSystemError(ErrCodeDeclined, err)) + return err + } + + // Get a remote connection and check whether it can handle this call. + remoteConn, ok, err := r.getDestination(f, call) + if err == nil && ok { + if canHandle, state := remoteConn.relay.canHandleNewCall(); !canHandle { + err = NewWrappedSystemError(ErrCodeNetwork, errConnNotActive{"selected remote", state}) + call.Failed("relay-remote-inactive") + r.conn.SendSystemError(f.Header.ID, f.Span(), NewWrappedSystemError(ErrCodeDeclined, err)) + } + } + if err != nil || !ok { + // Failed to get a remote connection, or the connection is not in the right + // state to handle this call. Since we already incremented pending on + // the current relay, we need to decrement it. + r.decrementPending() + call.End() + return err + } + + origID := f.Header.ID + destinationID := remoteConn.NextMessageID() + ttl := f.TTL() + if ttl > r.maxTimeout { + ttl = r.maxTimeout + f.SetTTL(r.maxTimeout) + } + span := f.Span() + // The remote side of the relay doesn't need to track stats. + remoteConn.relay.addRelayItem(false /* isOriginator */, destinationID, f.Header.ID, r, ttl, span, nil) + relayToDest := r.addRelayItem(true /* isOriginator */, f.Header.ID, destinationID, remoteConn.relay, ttl, span, call) + + f.Header.ID = destinationID + sent, failure := relayToDest.destination.Receive(f.Frame, requestFrame) + if !sent { + r.failRelayItem(r.outbound, origID, failure) + return nil + } + + return nil +} + +// Handle all frames except messageTypeCallReq. +func (r *Relayer) handleNonCallReq(f *Frame) error { + frameType := frameTypeFor(f) + finished := finishesCall(f) + + // If we read a request frame, we need to use the outbound map to decide + // the destination. Otherwise, we use the inbound map. + items := r.outbound + if frameType == responseFrame { + items = r.inbound + } + + item, ok := items.Get(f.Header.ID) + if !ok { + return errUnknownID + } + if item.tomb { + // Call timed out, ignore this frame. (We've already handled stats.) + // TODO: metrics for late-arriving frames. + return nil + } + + // If the call is finished, we stop the timeout to ensure + // we don't have concurrent calls to end the call. + if finished && !item.timeout.Stop() { + // Timeout goroutine is already ending this call. + return nil + } + + originalID := f.Header.ID + f.Header.ID = item.remapID + + sent, failure := item.destination.Receive(f, frameType) + if !sent { + r.failRelayItem(items, originalID, failure) + return nil + } + + if finished { + r.finishRelayItem(items, originalID) + } + return nil +} + +// addRelayItem adds a relay item to either outbound or inbound. +func (r *Relayer) addRelayItem(isOriginator bool, id, remapID uint32, destination *Relayer, ttl time.Duration, span Span, call RelayCall) relayItem { + item := relayItem{ + call: call, + remapID: remapID, + destination: destination, + span: span, + } + + items := r.inbound + if isOriginator { + items = r.outbound + } + item.timeout = r.timeouts.Get() + items.Add(id, item) + item.timeout.Start(ttl, items, id, isOriginator) + return item +} + +func (r *Relayer) timeoutRelayItem(items *relayItems, id uint32, isOriginator bool) { + item, ok := items.Entomb(id, _relayTombTTL) + if !ok { + return + } + if isOriginator { + r.conn.SendSystemError(id, item.span, ErrTimeout) + item.call.Failed("timeout") + item.call.End() + } + + r.decrementPending() +} + +// failRelayItem tombs the relay item so that future frames for this call are not +// forwarded. We keep the relay item tombed, rather than delete it to ensure that +// future frames do not cause error logs. +func (r *Relayer) failRelayItem(items *relayItems, id uint32, failure string) { + item, ok := items.Get(id) + if !ok { + items.logger.WithFields(LogField{"id", id}).Warn("Attempted to fail non-existent relay item.") + return + } + + // The call could time-out right as we entomb it, which would cause spurious + // error logs, so ensure we can stop the timeout. + if !item.timeout.Stop() { + return + } + + // Entomb it so that we don't get unknown exchange errors on further frames + // for this call. + item, ok = items.Entomb(id, _relayTombTTL) + if !ok { + return + } + if item.call != nil { + // If the client is too slow, then there's no point sending an error frame. + if failure != _relayErrorSourceConnSlow { + r.conn.SendSystemError(id, item.span, errFrameNotSent) + } + item.call.Failed(failure) + item.call.End() + } + + r.decrementPending() +} + +func (r *Relayer) finishRelayItem(items *relayItems, id uint32) { + item, ok := items.Delete(id) + if !ok { + return + } + if item.call != nil { + item.call.End() + } + r.decrementPending() +} + +func (r *Relayer) decrementPending() { + r.pending.Dec() + r.conn.checkExchanges() +} + +func (r *Relayer) canClose() bool { + if r == nil { + return true + } + return r.countPending() == 0 +} + +func (r *Relayer) countPending() uint32 { + return r.pending.Load() +} + +func (r *Relayer) receiverItems(fType frameType) *relayItems { + if fType == requestFrame { + return r.inbound + } + return r.outbound +} + +func (r *Relayer) handleLocalCallReq(cr lazyCallReq) bool { + // Check whether this is a service we want to handle locally. + if _, ok := r.localHandler[string(cr.Service())]; !ok { + return false + } + + f := cr.Frame + + // We can only handle non-fragmented calls in the relay channel. + // This is a simplification to avoid back references from a mex to a + // relayItem so that the relayItem is cleared when the call completes. + if cr.HasMoreFragments() { + r.logger.WithFields( + LogField{"id", cr.Header.ID}, + LogField{"source", string(cr.Caller())}, + LogField{"dest", string(cr.Service())}, + LogField{"method", string(cr.Method())}, + ).Error("Received fragmented callReq intended for local relay channel, can only handle unfragmented calls.") + r.conn.SendSystemError(f.Header.ID, cr.Span(), errRelayMethodFragmented) + return true + } + + if release := r.conn.handleFrameNoRelay(f); release { + r.conn.opts.FramePool.Release(f) + } + return true +} + +func frameTypeFor(f *Frame) frameType { + switch t := f.Header.messageType; t { + case messageTypeCallRes, messageTypeCallResContinue, messageTypeError, messageTypePingRes: + return responseFrame + case messageTypeCallReq, messageTypeCallReqContinue, messageTypePingReq: + return requestFrame + default: + panic(fmt.Sprintf("unsupported frame type: %v", t)) + } +} + +func determinesCallSuccess(f *Frame) (succeeded bool, failMsg string) { + switch f.messageType() { + case messageTypeError: + msg := newLazyError(f).Code().MetricsKey() + return false, msg + case messageTypeCallRes: + if newLazyCallRes(f).OK() { + return true, "" + } + return false, "application-error" + default: + return false, "" + } +} + +func validateRelayMaxTimeout(d time.Duration, logger Logger) time.Duration { + maxMillis := d / time.Millisecond + if maxMillis > 0 && maxMillis <= math.MaxUint32 { + return d + } + if d == 0 { + return _defaultRelayMaxTimeout + } + logger.WithFields( + LogField{"configuredMaxTimeout", d}, + LogField{"defaultMaxTimeout", _defaultRelayMaxTimeout}, + ).Warn("Configured RelayMaxTimeout is invalid, using default instead.") + return _defaultRelayMaxTimeout +} diff --git a/vendor/github.com/uber/tchannel-go/relay/relay.go b/vendor/github.com/uber/tchannel-go/relay/relay.go new file mode 100644 index 00000000..1ac0375e --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/relay/relay.go @@ -0,0 +1,65 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package relay contains relaying interfaces for external use. +// +// These interfaces are currently unstable, and aren't covered by the API +// backwards-compatibility guarantee. +package relay + +// CallFrame is an interface that abstracts access to the call req frame. +type CallFrame interface { + // Caller is the name of the originating service. + Caller() []byte + // Service is the name of the destination service. + Service() []byte + // Method is the name of the method being called. + Method() []byte + // RoutingDelegate is the name of the routing delegate, if any. + RoutingDelegate() []byte + // RoutingKey may refer to an alternate traffic group instead of the + // traffic group identified by the service name. + RoutingKey() []byte +} + +// Conn contains information about the underlying connection. +type Conn struct { + // RemoteAddr is the remote address of the underlying TCP connection. + RemoteAddr string + + // RemoteProcessName is the process name sent in the TChannel handshake. + RemoteProcessName string + + // IsOutbound returns whether this connection is an outbound connection + // initiated via the relay. + IsOutbound bool +} + +// RateLimitDropError is the error that should be returned from +// RelayHosts.Get if the request should be dropped silently. +// This is bit of a hack, because rate limiting of this nature isn't part of +// the actual TChannel protocol. +// The relayer will record that it has dropped the packet, but *won't* notify +// the client. +type RateLimitDropError struct{} + +func (e RateLimitDropError) Error() string { + return "frame dropped silently due to rate limiting" +} diff --git a/vendor/github.com/uber/tchannel-go/relay_api.go b/vendor/github.com/uber/tchannel-go/relay_api.go new file mode 100644 index 00000000..1f5e4db4 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/relay_api.go @@ -0,0 +1,54 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import "github.com/uber/tchannel-go/relay" + +// RelayHost is the interface used to create RelayCalls when the relay +// receives an incoming call. +type RelayHost interface { + // SetChannels is called on creation of the channel. It's used to set a + // channel reference which can be used to get references to *Peer. + SetChannel(ch *Channel) + + // Start starts a new RelayCall given the call frame and connection. + // It may return a call and an error, in which case the caller will + // call Failed/End on the RelayCall. + Start(relay.CallFrame, *relay.Conn) (RelayCall, error) +} + +// RelayCall abstracts away peer selection, stats, and any other business +// logic from the underlying relay implementation. A RelayCall may not +// have a destination if there was an error during peer selection +// (which should be returned from start). +type RelayCall interface { + // Destination returns the selected peer (if there was no error from Start). + Destination() (peer *Peer, ok bool) + + // The call succeeded (possibly after retrying). + Succeeded() + + // The call failed. + Failed(reason string) + + // End stats collection for this RPC. Will be called exactly once. + End() +} diff --git a/vendor/github.com/uber/tchannel-go/relay_messages.go b/vendor/github.com/uber/tchannel-go/relay_messages.go new file mode 100644 index 00000000..e990cb55 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/relay_messages.go @@ -0,0 +1,198 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "bytes" + "encoding/binary" + "fmt" + "time" +) + +var ( + _callerNameKeyBytes = []byte(CallerName) + _routingDelegateKeyBytes = []byte(RoutingDelegate) + _routingKeyKeyBytes = []byte(RoutingKey) +) + +const ( + // Common to many frame types. + _flagsIndex = 0 + + // For call req. + _ttlIndex = 1 + _ttlLen = 4 + _spanIndex = _ttlIndex + _ttlLen + _spanLength = 25 + _serviceLenIndex = _spanIndex + _spanLength + _serviceNameIndex = _serviceLenIndex + 1 + + // For call res and call res continue. + _resCodeOK = 0x00 + _resCodeIndex = 1 + + // For error. + _errCodeIndex = 0 +) + +type lazyError struct { + *Frame +} + +func newLazyError(f *Frame) lazyError { + if msgType := f.Header.messageType; msgType != messageTypeError { + panic(fmt.Errorf("newLazyError called for wrong messageType: %v", msgType)) + } + return lazyError{f} +} + +func (e lazyError) Code() SystemErrCode { + return SystemErrCode(e.Payload[_errCodeIndex]) +} + +type lazyCallRes struct { + *Frame +} + +func newLazyCallRes(f *Frame) lazyCallRes { + if msgType := f.Header.messageType; msgType != messageTypeCallRes { + panic(fmt.Errorf("newLazyCallRes called for wrong messageType: %v", msgType)) + } + return lazyCallRes{f} +} + +func (cr lazyCallRes) OK() bool { + return cr.Payload[_resCodeIndex] == _resCodeOK +} + +// TODO: Use []byte instead of string for caller/method to avoid allocations. +type lazyCallReq struct { + *Frame + + caller, method, delegate, key []byte +} + +// TODO: Consider pooling lazyCallReq and using pointers to the struct. + +func newLazyCallReq(f *Frame) lazyCallReq { + if msgType := f.Header.messageType; msgType != messageTypeCallReq { + panic(fmt.Errorf("newLazyCallReq called for wrong messageType: %v", msgType)) + } + + cr := lazyCallReq{Frame: f} + + serviceLen := f.Payload[_serviceLenIndex] + // nh:1 (hk~1 hv~1){nh} + headerStart := _serviceLenIndex + 1 /* length byte */ + serviceLen + numHeaders := int(f.Payload[headerStart]) + cur := int(headerStart) + 1 + for i := 0; i < numHeaders; i++ { + keyLen := int(f.Payload[cur]) + cur++ + key := f.Payload[cur : cur+keyLen] + cur += keyLen + + valLen := int(f.Payload[cur]) + cur++ + val := f.Payload[cur : cur+valLen] + cur += valLen + + if bytes.Equal(key, _callerNameKeyBytes) { + cr.caller = val + } else if bytes.Equal(key, _routingDelegateKeyBytes) { + cr.delegate = val + } else if bytes.Equal(key, _routingKeyKeyBytes) { + cr.key = val + } + } + + // csumtype:1 (csum:4){0,1} arg1~2 arg2~2 arg3~2 + checkSumType := ChecksumType(f.Payload[cur]) + cur += 1 /* checksum */ + checkSumType.ChecksumSize() + + // arg1~2 + arg1Len := int(binary.BigEndian.Uint16(f.Payload[cur : cur+2])) + cur += 2 + cr.method = f.Payload[cur : cur+arg1Len] + return cr +} + +// Caller returns the name of the originator of this callReq. +func (f lazyCallReq) Caller() []byte { + return f.caller +} + +// Service returns the name of the destination service for this callReq. +func (f lazyCallReq) Service() []byte { + l := f.Payload[_serviceLenIndex] + return f.Payload[_serviceNameIndex : _serviceNameIndex+l] +} + +// Method returns the name of the method being called. +func (f lazyCallReq) Method() []byte { + return f.method +} + +// RoutingDelegate returns the routing delegate for this call req, if any. +func (f lazyCallReq) RoutingDelegate() []byte { + return f.delegate +} + +// RoutingKey returns the routing delegate for this call req, if any. +func (f lazyCallReq) RoutingKey() []byte { + return f.key +} + +// TTL returns the time to live for this callReq. +func (f lazyCallReq) TTL() time.Duration { + ttl := binary.BigEndian.Uint32(f.Payload[_ttlIndex : _ttlIndex+_ttlLen]) + return time.Duration(ttl) * time.Millisecond +} + +// SetTTL overwrites the frame's TTL. +func (f lazyCallReq) SetTTL(d time.Duration) { + ttl := uint32(d / time.Millisecond) + binary.BigEndian.PutUint32(f.Payload[_ttlIndex:_ttlIndex+_ttlLen], ttl) +} + +// Span returns the Span +func (f lazyCallReq) Span() Span { + return callReqSpan(f.Frame) +} + +// HasMoreFragments returns whether the callReq has more fragments. +func (f lazyCallReq) HasMoreFragments() bool { + return f.Payload[_flagsIndex]&hasMoreFragmentsFlag != 0 +} + +// finishesCall checks whether this frame is the last one we should expect for +// this RPC req-res. +func finishesCall(f *Frame) bool { + switch f.messageType() { + case messageTypeError: + return true + case messageTypeCallRes, messageTypeCallResContinue: + flags := f.Payload[_flagsIndex] + return flags&hasMoreFragmentsFlag == 0 + default: + return false + } +} diff --git a/vendor/github.com/uber/tchannel-go/relay_timer_pool.go b/vendor/github.com/uber/tchannel-go/relay_timer_pool.go new file mode 100644 index 00000000..66fc7f33 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/relay_timer_pool.go @@ -0,0 +1,158 @@ +// Copyright (c) 2017 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "math" + "sync" + "time" +) + +type relayTimerTrigger func(items *relayItems, id uint32, isOriginator bool) + +type relayTimerPool struct { + pool sync.Pool + trigger relayTimerTrigger + verify bool +} + +type relayTimer struct { + pool *relayTimerPool // const + timer *time.Timer // const + + active bool // mutated on Start/Stop + stopped bool // mutated on Stop + released bool // mutated on Get/Release. + + // Per-timer parameters passed back when the timer is triggered. + items *relayItems + id uint32 + isOriginator bool +} + +func (rt *relayTimer) OnTimer() { + rt.verifyNotReleased() + items, id, isOriginator := rt.items, rt.id, rt.isOriginator + rt.markTimerInactive() + rt.pool.trigger(items, id, isOriginator) +} + +func newRelayTimerPool(trigger relayTimerTrigger, verify bool) *relayTimerPool { + return &relayTimerPool{ + trigger: trigger, + verify: verify, + } +} + +// Get returns a relay timer that has not started. Timers must be started explicitly +// using the Start function. +func (tp *relayTimerPool) Get() *relayTimer { + timer, ok := tp.pool.Get().(*relayTimer) + if ok { + timer.released = false + return timer + } + + rt := &relayTimer{ + pool: tp, + } + // Go timers are started by default. However, we need to separate creating + // the timer and starting the timer for use in the relay code paths. + // To make this work without more locks in the relayTimer, we create a Go timer + // with a huge timeout so it doesn't run, then stop it so we can start it later. + rt.timer = time.AfterFunc(time.Duration(math.MaxInt64), rt.OnTimer) + if !rt.timer.Stop() { + panic("relayTimer requires timers in stopped state, but failed to stop underlying timer") + } + return rt +} + +// Put returns a relayTimer back to the pool. +func (tp *relayTimerPool) Put(rt *relayTimer) { + if tp.verify { + // If we are trying to verify correct pool behavior, then we don't release + // the timer, and instead ensure no methods are called after being released. + return + } + tp.pool.Put(rt) +} + +// Start starts a timer with the given duration for the specified ID. +func (rt *relayTimer) Start(d time.Duration, items *relayItems, id uint32, isOriginator bool) { + rt.verifyNotReleased() + if rt.active { + panic("Tried to start an already-active timer") + } + + rt.active = true + rt.stopped = false + rt.items = items + rt.id = id + rt.isOriginator = isOriginator + + if wasActive := rt.timer.Reset(d); wasActive { + panic("relayTimer's underlying timer was Started multiple times without Stop") + } +} + +func (rt *relayTimer) markTimerInactive() { + rt.active = false + rt.items = nil + rt.id = 0 + rt.items = nil + rt.isOriginator = false +} + +// Stop stops the timer and returns whether the timer was stopped. +// If the timer has been executed, it returns false, but in all other +// cases, it returns true (even if the timer was stopped previously). +func (rt *relayTimer) Stop() bool { + rt.verifyNotReleased() + + if rt.stopped { + return true + } + + stopped := rt.timer.Stop() + if stopped { + rt.stopped = true + rt.markTimerInactive() + } + + return stopped +} + +// Release releases a timer back to the timer pool. The timer MUST have run or be +// stopped before Release is called. +func (rt *relayTimer) Release() { + rt.verifyNotReleased() + if rt.active { + panic("only stopped or completed timers can be released") + } + rt.released = true + rt.pool.Put(rt) +} + +func (rt *relayTimer) verifyNotReleased() { + if rt.released { + panic("Released timer cannot be used") + } +} diff --git a/vendor/github.com/uber/tchannel-go/reqres.go b/vendor/github.com/uber/tchannel-go/reqres.go new file mode 100644 index 00000000..de014c47 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/reqres.go @@ -0,0 +1,296 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "fmt" + + "github.com/uber/tchannel-go/typed" +) + +type errReqResWriterStateMismatch struct { + state reqResWriterState + expectedState reqResWriterState +} + +func (e errReqResWriterStateMismatch) Error() string { + return fmt.Sprintf("attempting write outside of expected state, in %v expected %v", + e.state, e.expectedState) +} + +type errReqResReaderStateMismatch struct { + state reqResReaderState + expectedState reqResReaderState +} + +func (e errReqResReaderStateMismatch) Error() string { + return fmt.Sprintf("attempting read outside of expected state, in %v expected %v", + e.state, e.expectedState) +} + +// reqResWriterState defines the state of a request/response writer +type reqResWriterState int + +const ( + reqResWriterPreArg1 reqResWriterState = iota + reqResWriterPreArg2 + reqResWriterPreArg3 + reqResWriterComplete +) + +//go:generate stringer -type=reqResWriterState + +// messageForFragment determines which message should be used for the given +// fragment +type messageForFragment func(initial bool) message + +// A reqResWriter writes out requests/responses. Exactly which it does is +// determined by its messageForFragment function which returns the appropriate +// message to use when building an initial or follow-on fragment. +type reqResWriter struct { + conn *Connection + contents *fragmentingWriter + mex *messageExchange + state reqResWriterState + messageForFragment messageForFragment + log Logger + err error +} + +//go:generate stringer -type=reqResReaderState + +func (w *reqResWriter) argWriter(last bool, inState reqResWriterState, outState reqResWriterState) (ArgWriter, error) { + if w.err != nil { + return nil, w.err + } + + if w.state != inState { + return nil, w.failed(errReqResWriterStateMismatch{state: w.state, expectedState: inState}) + } + + argWriter, err := w.contents.ArgWriter(last) + if err != nil { + return nil, w.failed(err) + } + + w.state = outState + return argWriter, nil +} + +func (w *reqResWriter) arg1Writer() (ArgWriter, error) { + return w.argWriter(false /* last */, reqResWriterPreArg1, reqResWriterPreArg2) +} + +func (w *reqResWriter) arg2Writer() (ArgWriter, error) { + return w.argWriter(false /* last */, reqResWriterPreArg2, reqResWriterPreArg3) +} + +func (w *reqResWriter) arg3Writer() (ArgWriter, error) { + return w.argWriter(true /* last */, reqResWriterPreArg3, reqResWriterComplete) +} + +// newFragment creates a new fragment for marshaling into +func (w *reqResWriter) newFragment(initial bool, checksum Checksum) (*writableFragment, error) { + if err := w.mex.checkError(); err != nil { + return nil, w.failed(err) + } + + message := w.messageForFragment(initial) + + // Create the frame + frame := w.conn.opts.FramePool.Get() + frame.Header.ID = w.mex.msgID + frame.Header.messageType = message.messageType() + + // Write the message into the fragment, reserving flags and checksum bytes + wbuf := typed.NewWriteBuffer(frame.Payload[:]) + fragment := new(writableFragment) + fragment.frame = frame + fragment.flagsRef = wbuf.DeferByte() + if err := message.write(wbuf); err != nil { + return nil, err + } + wbuf.WriteSingleByte(byte(checksum.TypeCode())) + fragment.checksumRef = wbuf.DeferBytes(checksum.Size()) + fragment.checksum = checksum + fragment.contents = wbuf + return fragment, wbuf.Err() +} + +// flushFragment sends a fragment to the peer over the connection +func (w *reqResWriter) flushFragment(fragment *writableFragment) error { + if w.err != nil { + return w.err + } + + frame := fragment.frame.(*Frame) + frame.Header.SetPayloadSize(uint16(fragment.contents.BytesWritten())) + + if err := w.mex.checkError(); err != nil { + return w.failed(err) + } + select { + case <-w.mex.ctx.Done(): + return w.failed(GetContextError(w.mex.ctx.Err())) + case <-w.mex.errCh.c: + return w.failed(w.mex.errCh.err) + case w.conn.sendCh <- frame: + return nil + } +} + +// failed marks the writer as having failed +func (w *reqResWriter) failed(err error) error { + w.log.Debugf("writer failed: %v existing err: %v", err, w.err) + if w.err != nil { + return w.err + } + + w.mex.shutdown() + w.err = err + return w.err +} + +// reqResReaderState defines the state of a request/response reader +type reqResReaderState int + +const ( + reqResReaderPreArg1 reqResReaderState = iota + reqResReaderPreArg2 + reqResReaderPreArg3 + reqResReaderComplete +) + +// A reqResReader is capable of reading arguments from a request or response object. +type reqResReader struct { + contents *fragmentingReader + mex *messageExchange + state reqResReaderState + messageForFragment messageForFragment + initialFragment *readableFragment + previousFragment *readableFragment + log Logger + err error +} + +// arg1Reader returns an ArgReader to read arg1. +func (r *reqResReader) arg1Reader() (ArgReader, error) { + return r.argReader(false /* last */, reqResReaderPreArg1, reqResReaderPreArg2) +} + +// arg2Reader returns an ArgReader to read arg2. +func (r *reqResReader) arg2Reader() (ArgReader, error) { + return r.argReader(false /* last */, reqResReaderPreArg2, reqResReaderPreArg3) +} + +// arg3Reader returns an ArgReader to read arg3. +func (r *reqResReader) arg3Reader() (ArgReader, error) { + return r.argReader(true /* last */, reqResReaderPreArg3, reqResReaderComplete) +} + +// argReader returns an ArgReader that can be used to read an argument. The +// ReadCloser must be closed once the argument has been read. +func (r *reqResReader) argReader(last bool, inState reqResReaderState, outState reqResReaderState) (ArgReader, error) { + if r.state != inState { + return nil, r.failed(errReqResReaderStateMismatch{state: r.state, expectedState: inState}) + } + + argReader, err := r.contents.ArgReader(last) + if err != nil { + return nil, r.failed(err) + } + + r.state = outState + return argReader, nil +} + +// recvNextFragment receives the next fragment from the underlying message exchange. +func (r *reqResReader) recvNextFragment(initial bool) (*readableFragment, error) { + if r.initialFragment != nil { + fragment := r.initialFragment + r.initialFragment = nil + r.previousFragment = fragment + return fragment, nil + } + + // Wait for the appropriate message from the peer + message := r.messageForFragment(initial) + frame, err := r.mex.recvPeerFrameOfType(message.messageType()) + if err != nil { + if err, ok := err.(errorMessage); ok { + // If we received a serialized error from the other side, then we should go through + // the normal doneReading path so stats get updated with this error. + r.err = err.AsSystemError() + return nil, err + } + + return nil, r.failed(err) + } + + // Parse the message and setup the fragment + fragment, err := parseInboundFragment(r.mex.framePool, frame, message) + if err != nil { + return nil, r.failed(err) + } + + r.previousFragment = fragment + return fragment, nil +} + +// releasePreviousFrament releases the last fragment returned by the reader if +// it's still around. This operation is idempotent. +func (r *reqResReader) releasePreviousFragment() { + fragment := r.previousFragment + r.previousFragment = nil + if fragment != nil { + fragment.done() + } +} + +// failed indicates the reader failed +func (r *reqResReader) failed(err error) error { + r.log.Debugf("reader failed: %v existing err: %v", err, r.err) + if r.err != nil { + return r.err + } + + r.mex.shutdown() + r.err = err + return r.err +} + +// parseInboundFragment parses an incoming fragment based on the given message +func parseInboundFragment(framePool FramePool, frame *Frame, message message) (*readableFragment, error) { + rbuf := typed.NewReadBuffer(frame.SizedPayload()) + fragment := new(readableFragment) + fragment.flags = rbuf.ReadSingleByte() + if err := message.read(rbuf); err != nil { + return nil, err + } + + fragment.checksumType = ChecksumType(rbuf.ReadSingleByte()) + fragment.checksum = rbuf.ReadBytes(fragment.checksumType.ChecksumSize()) + fragment.contents = rbuf + fragment.onDone = func() { + framePool.Release(frame) + } + return fragment, rbuf.Err() +} diff --git a/vendor/github.com/uber/tchannel-go/reqresreaderstate_string.go b/vendor/github.com/uber/tchannel-go/reqresreaderstate_string.go new file mode 100644 index 00000000..8669ffbc --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/reqresreaderstate_string.go @@ -0,0 +1,16 @@ +// generated by stringer -type=reqResReaderState; DO NOT EDIT + +package tchannel + +import "fmt" + +const _reqResReaderState_name = "reqResReaderPreArg1reqResReaderPreArg2reqResReaderPreArg3reqResReaderComplete" + +var _reqResReaderState_index = [...]uint8{0, 19, 38, 57, 77} + +func (i reqResReaderState) String() string { + if i < 0 || i+1 >= reqResReaderState(len(_reqResReaderState_index)) { + return fmt.Sprintf("reqResReaderState(%d)", i) + } + return _reqResReaderState_name[_reqResReaderState_index[i]:_reqResReaderState_index[i+1]] +} diff --git a/vendor/github.com/uber/tchannel-go/reqreswriterstate_string.go b/vendor/github.com/uber/tchannel-go/reqreswriterstate_string.go new file mode 100644 index 00000000..6ac637d4 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/reqreswriterstate_string.go @@ -0,0 +1,16 @@ +// generated by stringer -type=reqResWriterState; DO NOT EDIT + +package tchannel + +import "fmt" + +const _reqResWriterState_name = "reqResWriterPreArg1reqResWriterPreArg2reqResWriterPreArg3reqResWriterComplete" + +var _reqResWriterState_index = [...]uint8{0, 19, 38, 57, 77} + +func (i reqResWriterState) String() string { + if i < 0 || i+1 >= reqResWriterState(len(_reqResWriterState_index)) { + return fmt.Sprintf("reqResWriterState(%d)", i) + } + return _reqResWriterState_name[_reqResWriterState_index[i]:_reqResWriterState_index[i+1]] +} diff --git a/vendor/github.com/uber/tchannel-go/retry.go b/vendor/github.com/uber/tchannel-go/retry.go new file mode 100644 index 00000000..5559e5ad --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/retry.go @@ -0,0 +1,269 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "net" + "sync" + "time" + + "golang.org/x/net/context" +) + +// RetryOn represents the types of errors to retry on. +type RetryOn int + +//go:generate stringer -type=RetryOn + +const ( + // RetryDefault is currently the same as RetryConnectionError. + RetryDefault RetryOn = iota + + // RetryConnectionError retries on busy frames, declined frames, and connection errors. + RetryConnectionError + + // RetryNever never retries any errors. + RetryNever + + // RetryNonIdempotent will retry errors that occur before a request has been picked up. + // E.g. busy frames and declined frames. + // This should be used when making calls to non-idempotent endpoints. + RetryNonIdempotent + + // RetryUnexpected will retry busy frames, declined frames, and unenxpected frames. + RetryUnexpected + + // RetryIdempotent will retry all errors that can be retried. This should be used + // for idempotent endpoints. + RetryIdempotent +) + +// RequestState is a global request state that persists across retries. +type RequestState struct { + // Start is the time at which the request was initiated by the caller of RunWithRetry. + Start time.Time + // SelectedPeers is a set of host:ports that have been selected previously. + SelectedPeers map[string]struct{} + // Attempt is 1 for the first attempt, and so on. + Attempt int + retryOpts *RetryOptions +} + +// RetriableFunc is the type of function that can be passed to RunWithRetry. +type RetriableFunc func(context.Context, *RequestState) error + +func isNetError(err error) bool { + // TODO(prashantv): Should TChannel internally these to ErrCodeNetwork before returning + // them to the user? + _, ok := err.(net.Error) + return ok +} + +func getErrCode(err error) SystemErrCode { + code := GetSystemErrorCode(err) + if isNetError(err) { + code = ErrCodeNetwork + } + return code +} + +// CanRetry returns whether an error can be retried for the given retry option. +func (r RetryOn) CanRetry(err error) bool { + if r == RetryNever { + return false + } + if r == RetryDefault { + r = RetryConnectionError + } + + code := getErrCode(err) + + if code == ErrCodeBusy || code == ErrCodeDeclined { + return true + } + // Never retry bad requests, since it will probably cause another bad request. + if code == ErrCodeBadRequest { + return false + } + + switch r { + case RetryConnectionError: + return code == ErrCodeNetwork + case RetryUnexpected: + return code == ErrCodeUnexpected + case RetryIdempotent: + return true + } + + return false +} + +// RetryOptions are the retry options used to configure RunWithRetry. +type RetryOptions struct { + // MaxAttempts is the maximum number of calls and retries that will be made. + // If this is 0, the default number of attempts (5) is used. + MaxAttempts int + + // RetryOn is the types of errors to retry on. + RetryOn RetryOn + + // TimeoutPerAttempt is the per-retry timeout to use. + // If this is zero, then the original timeout is used. + TimeoutPerAttempt time.Duration +} + +var defaultRetryOptions = &RetryOptions{ + MaxAttempts: 5, +} + +var requestStatePool = sync.Pool{ + New: func() interface{} { return &RequestState{} }, +} + +func getRetryOptions(ctx context.Context) *RetryOptions { + params := getTChannelParams(ctx) + if params == nil { + return defaultRetryOptions + } + + opts := params.retryOptions + if opts == nil { + return defaultRetryOptions + } + + if opts.MaxAttempts == 0 { + opts.MaxAttempts = defaultRetryOptions.MaxAttempts + } + return opts +} + +// HasRetries will return true if there are more retries left. +func (rs *RequestState) HasRetries(err error) bool { + if rs == nil { + return false + } + rOpts := rs.retryOpts + return rs.Attempt < rOpts.MaxAttempts && rOpts.RetryOn.CanRetry(err) +} + +// SinceStart returns the time since the start of the request. If there is no request state, +// then the fallback is returned. +func (rs *RequestState) SinceStart(now time.Time, fallback time.Duration) time.Duration { + if rs == nil { + return fallback + } + return now.Sub(rs.Start) +} + +// PrevSelectedPeers returns the previously selected peers for this request. +func (rs *RequestState) PrevSelectedPeers() map[string]struct{} { + if rs == nil { + return nil + } + return rs.SelectedPeers +} + +// AddSelectedPeer adds a given peer to the set of selected peers. +func (rs *RequestState) AddSelectedPeer(hostPort string) { + if rs == nil { + return + } + + host := getHost(hostPort) + if rs.SelectedPeers == nil { + rs.SelectedPeers = map[string]struct{}{ + hostPort: {}, + host: {}, + } + } else { + rs.SelectedPeers[hostPort] = struct{}{} + rs.SelectedPeers[host] = struct{}{} + } +} + +// RetryCount returns the retry attempt this is. Essentially, Attempt - 1. +func (rs *RequestState) RetryCount() int { + if rs == nil { + return 0 + } + return rs.Attempt - 1 +} + +// RunWithRetry will take a function that makes the TChannel call, and will +// rerun it as specifed in the RetryOptions in the Context. +func (ch *Channel) RunWithRetry(runCtx context.Context, f RetriableFunc) error { + var err error + + opts := getRetryOptions(runCtx) + rs := ch.getRequestState(opts) + defer requestStatePool.Put(rs) + + for i := 0; i < opts.MaxAttempts; i++ { + rs.Attempt++ + + if opts.TimeoutPerAttempt == 0 { + err = f(runCtx, rs) + } else { + attemptCtx, cancel := context.WithTimeout(runCtx, opts.TimeoutPerAttempt) + err = f(attemptCtx, rs) + cancel() + } + + if err == nil { + return nil + } + if !opts.RetryOn.CanRetry(err) { + if ch.log.Enabled(LogLevelInfo) { + ch.log.WithFields(ErrField(err)).Info("Failed after non-retriable error.") + } + return err + } + + ch.log.WithFields( + ErrField(err), + LogField{"attempt", rs.Attempt}, + LogField{"maxAttempts", opts.MaxAttempts}, + ).Info("Retrying request after retryable error.") + } + + // Too many retries, return the last error + return err +} + +func (ch *Channel) getRequestState(retryOpts *RetryOptions) *RequestState { + rs := requestStatePool.Get().(*RequestState) + *rs = RequestState{ + Start: ch.timeNow(), + retryOpts: retryOpts, + } + return rs +} + +// getHost returns the host part of a host:port. If no ':' is found, it returns the +// original string. Note: This hand-rolled loop is faster than using strings.IndexByte. +func getHost(hostPort string) string { + for i := 0; i < len(hostPort); i++ { + if hostPort[i] == ':' { + return hostPort[:i] + } + } + return hostPort +} diff --git a/vendor/github.com/uber/tchannel-go/retryon_string.go b/vendor/github.com/uber/tchannel-go/retryon_string.go new file mode 100644 index 00000000..56d27128 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/retryon_string.go @@ -0,0 +1,16 @@ +// generated by stringer -type=RetryOn; DO NOT EDIT + +package tchannel + +import "fmt" + +const _RetryOn_name = "RetryDefaultRetryConnectionErrorRetryNeverRetryNonIdempotentRetryUnexpectedRetryIdempotent" + +var _RetryOn_index = [...]uint8{0, 12, 32, 42, 60, 75, 90} + +func (i RetryOn) String() string { + if i < 0 || i+1 >= RetryOn(len(_RetryOn_index)) { + return fmt.Sprintf("RetryOn(%d)", i) + } + return _RetryOn_name[_RetryOn_index[i]:_RetryOn_index[i+1]] +} diff --git a/vendor/github.com/uber/tchannel-go/root_peer_list.go b/vendor/github.com/uber/tchannel-go/root_peer_list.go new file mode 100644 index 00000000..127160fd --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/root_peer_list.go @@ -0,0 +1,122 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import "sync" + +// RootPeerList is the root peer list which is only used to connect to +// peers and share peers between subchannels. +type RootPeerList struct { + sync.RWMutex + + channel Connectable + onPeerStatusChanged func(*Peer) + peersByHostPort map[string]*Peer +} + +func newRootPeerList(ch Connectable, onPeerStatusChanged func(*Peer)) *RootPeerList { + return &RootPeerList{ + channel: ch, + onPeerStatusChanged: onPeerStatusChanged, + peersByHostPort: make(map[string]*Peer), + } +} + +// newChild returns a new isolated peer list that shares the underlying peers +// with the root peer list. +func (l *RootPeerList) newChild() *PeerList { + return newPeerList(l) +} + +// Add adds a peer to the root peer list if it does not exist, or return +// an existing peer if it exists. +func (l *RootPeerList) Add(hostPort string) *Peer { + l.RLock() + + if p, ok := l.peersByHostPort[hostPort]; ok { + l.RUnlock() + return p + } + + l.RUnlock() + l.Lock() + defer l.Unlock() + + if p, ok := l.peersByHostPort[hostPort]; ok { + return p + } + + var p *Peer + // To avoid duplicate connections, only the root list should create new + // peers. All other lists should keep refs to the root list's peers. + p = newPeer(l.channel, hostPort, l.onPeerStatusChanged, l.onClosedConnRemoved) + l.peersByHostPort[hostPort] = p + return p +} + +// GetOrAdd returns a peer for the given hostPort, creating one if it doesn't yet exist. +func (l *RootPeerList) GetOrAdd(hostPort string) *Peer { + peer, ok := l.Get(hostPort) + if ok { + return peer + } + + return l.Add(hostPort) +} + +// Get returns a peer for the given hostPort if it exists. +func (l *RootPeerList) Get(hostPort string) (*Peer, bool) { + l.RLock() + p, ok := l.peersByHostPort[hostPort] + l.RUnlock() + return p, ok +} + +func (l *RootPeerList) onClosedConnRemoved(peer *Peer) { + hostPort := peer.HostPort() + p, ok := l.Get(hostPort) + if !ok { + // It's possible that multiple connections were closed and removed at the same time, + // so multiple goroutines might be removing the peer from the root peer list. + return + } + + if p.canRemove() { + l.Lock() + delete(l.peersByHostPort, hostPort) + l.Unlock() + l.channel.Logger().WithFields( + LogField{"remoteHostPort", hostPort}, + ).Debug("Removed peer from root peer list.") + } +} + +// Copy returns a map of the peer list. This method should only be used for testing. +func (l *RootPeerList) Copy() map[string]*Peer { + l.RLock() + defer l.RUnlock() + + listCopy := make(map[string]*Peer) + for k, v := range l.peersByHostPort { + listCopy[k] = v + } + return listCopy +} diff --git a/vendor/github.com/uber/tchannel-go/stats.go b/vendor/github.com/uber/tchannel-go/stats.go new file mode 100644 index 00000000..b1373c64 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/stats.go @@ -0,0 +1,61 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "log" + "time" +) + +// StatsReporter is the the interface used to report stats. +type StatsReporter interface { + IncCounter(name string, tags map[string]string, value int64) + UpdateGauge(name string, tags map[string]string, value int64) + RecordTimer(name string, tags map[string]string, d time.Duration) +} + +// NullStatsReporter is a stats reporter that discards the statistics. +var NullStatsReporter StatsReporter = nullStatsReporter{} + +type nullStatsReporter struct{} + +func (nullStatsReporter) IncCounter(name string, tags map[string]string, value int64) {} +func (nullStatsReporter) UpdateGauge(name string, tags map[string]string, value int64) {} +func (nullStatsReporter) RecordTimer(name string, tags map[string]string, d time.Duration) {} + +// SimpleStatsReporter is a stats reporter that reports stats to the log. +var SimpleStatsReporter StatsReporter = simpleStatsReporter{} + +type simpleStatsReporter struct { + commonTags map[string]string +} + +func (simpleStatsReporter) IncCounter(name string, tags map[string]string, value int64) { + log.Printf("Stats: IncCounter(%v, %v) +%v", name, tags, value) +} + +func (simpleStatsReporter) UpdateGauge(name string, tags map[string]string, value int64) { + log.Printf("Stats: UpdateGauge(%v, %v) = %v", name, tags, value) +} + +func (simpleStatsReporter) RecordTimer(name string, tags map[string]string, d time.Duration) { + log.Printf("Stats: RecordTimer(%v, %v) = %v", name, tags, d) +} diff --git a/vendor/github.com/uber/tchannel-go/subchannel.go b/vendor/github.com/uber/tchannel-go/subchannel.go new file mode 100644 index 00000000..54b424c1 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/subchannel.go @@ -0,0 +1,220 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "fmt" + "sync" + + "github.com/opentracing/opentracing-go" + "golang.org/x/net/context" +) + +// SubChannelOption are used to set options for subchannels. +type SubChannelOption func(*SubChannel) + +// Isolated is a SubChannelOption that creates an isolated subchannel. +func Isolated(s *SubChannel) { + s.Lock() + s.peers = s.topChannel.peers.newSibling() + s.peers.SetStrategy(newLeastPendingCalculator()) + s.Unlock() +} + +// SubChannel allows calling a specific service on a channel. +// TODO(prashant): Allow creating a subchannel with default call options. +// TODO(prashant): Allow registering handlers on a subchannel. +type SubChannel struct { + sync.RWMutex + serviceName string + topChannel *Channel + defaultCallOptions *CallOptions + peers *PeerList + handler Handler + logger Logger + statsReporter StatsReporter +} + +// Map of subchannel and the corresponding service +type subChannelMap struct { + sync.RWMutex + subchannels map[string]*SubChannel +} + +func newSubChannel(serviceName string, ch *Channel) *SubChannel { + logger := ch.Logger().WithFields(LogField{"subchannel", serviceName}) + return &SubChannel{ + serviceName: serviceName, + peers: ch.peers, + topChannel: ch, + handler: &handlerMap{}, // use handlerMap by default + logger: logger, + statsReporter: ch.StatsReporter(), + } +} + +// ServiceName returns the service name that this subchannel is for. +func (c *SubChannel) ServiceName() string { + return c.serviceName +} + +// BeginCall starts a new call to a remote peer, returning an OutboundCall that can +// be used to write the arguments of the call. +func (c *SubChannel) BeginCall(ctx context.Context, methodName string, callOptions *CallOptions) (*OutboundCall, error) { + if callOptions == nil { + callOptions = defaultCallOptions + } + + peer, err := c.peers.Get(callOptions.RequestState.PrevSelectedPeers()) + if err != nil { + return nil, err + } + + return peer.BeginCall(ctx, c.ServiceName(), methodName, callOptions) +} + +// Peers returns the PeerList for this subchannel. +func (c *SubChannel) Peers() *PeerList { + return c.peers +} + +// Isolated returns whether this subchannel is an isolated subchannel. +func (c *SubChannel) Isolated() bool { + c.RLock() + defer c.RUnlock() + return c.topChannel.Peers() != c.peers +} + +// Register registers a handler on the subchannel for the given method. +// +// This function panics if the Handler for the SubChannel was overwritten with +// SetHandler. +func (c *SubChannel) Register(h Handler, methodName string) { + handlers, ok := c.handler.(*handlerMap) + if !ok { + panic(fmt.Sprintf( + "handler for SubChannel(%v) was changed to disallow method registration", + c.ServiceName(), + )) + } + handlers.register(h, methodName) +} + +// GetHandlers returns all handlers registered on this subchannel by method name. +// +// This function panics if the Handler for the SubChannel was overwritten with +// SetHandler. +func (c *SubChannel) GetHandlers() map[string]Handler { + handlers, ok := c.handler.(*handlerMap) + if !ok { + panic(fmt.Sprintf( + "handler for SubChannel(%v) was changed to disallow method registration", + c.ServiceName(), + )) + } + + handlers.RLock() + handlersMap := make(map[string]Handler, len(handlers.handlers)) + for k, v := range handlers.handlers { + handlersMap[k] = v + } + handlers.RUnlock() + return handlersMap +} + +// SetHandler changes the SubChannel's underlying handler. This may be used to +// set up a catch-all Handler for all requests received by this SubChannel. +// +// Methods registered on this SubChannel using Register() before calling +// SetHandler() will be forgotten. Further calls to Register() on this +// SubChannel after SetHandler() is called will cause panics. +func (c *SubChannel) SetHandler(h Handler) { + c.handler = h +} + +// Logger returns the logger for this subchannel. +func (c *SubChannel) Logger() Logger { + return c.logger +} + +// StatsReporter returns the stats reporter for this subchannel. +func (c *SubChannel) StatsReporter() StatsReporter { + return c.topChannel.StatsReporter() +} + +// StatsTags returns the stats tags for this subchannel. +func (c *SubChannel) StatsTags() map[string]string { + tags := c.topChannel.StatsTags() + tags["subchannel"] = c.serviceName + return tags +} + +// Tracer returns OpenTracing Tracer from the top channel. +func (c *SubChannel) Tracer() opentracing.Tracer { + return c.topChannel.Tracer() +} + +// Register a new subchannel for the given serviceName +func (subChMap *subChannelMap) registerNewSubChannel(serviceName string, ch *Channel) (_ *SubChannel, added bool) { + subChMap.Lock() + defer subChMap.Unlock() + + if subChMap.subchannels == nil { + subChMap.subchannels = make(map[string]*SubChannel) + } + + if sc, ok := subChMap.subchannels[serviceName]; ok { + return sc, false + } + + sc := newSubChannel(serviceName, ch) + subChMap.subchannels[serviceName] = sc + return sc, true +} + +// Get subchannel if, we have one +func (subChMap *subChannelMap) get(serviceName string) (*SubChannel, bool) { + subChMap.RLock() + sc, ok := subChMap.subchannels[serviceName] + subChMap.RUnlock() + return sc, ok +} + +// GetOrAdd a subchannel for the given serviceName on the map +func (subChMap *subChannelMap) getOrAdd(serviceName string, ch *Channel) (_ *SubChannel, added bool) { + if sc, ok := subChMap.get(serviceName); ok { + return sc, false + } + + return subChMap.registerNewSubChannel(serviceName, ch) +} + +func (subChMap *subChannelMap) updatePeer(p *Peer) { + subChMap.RLock() + for _, subCh := range subChMap.subchannels { + if subCh.Isolated() { + subCh.RLock() + subCh.Peers().onPeerChange(p) + subCh.RUnlock() + } + } + subChMap.RUnlock() +} diff --git a/vendor/github.com/uber/tchannel-go/systemerrcode_string.go b/vendor/github.com/uber/tchannel-go/systemerrcode_string.go new file mode 100644 index 00000000..be54362f --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/systemerrcode_string.go @@ -0,0 +1,26 @@ +// generated by stringer -type=SystemErrCode; DO NOT EDIT + +package tchannel + +import "fmt" + +const ( + _SystemErrCode_name_0 = "ErrCodeInvalidErrCodeTimeoutErrCodeCancelledErrCodeBusyErrCodeDeclinedErrCodeUnexpectedErrCodeBadRequestErrCodeNetwork" + _SystemErrCode_name_1 = "ErrCodeProtocol" +) + +var ( + _SystemErrCode_index_0 = [...]uint8{0, 14, 28, 44, 55, 70, 87, 104, 118} + _SystemErrCode_index_1 = [...]uint8{0, 15} +) + +func (i SystemErrCode) String() string { + switch { + case 0 <= i && i <= 7: + return _SystemErrCode_name_0[_SystemErrCode_index_0[i]:_SystemErrCode_index_0[i+1]] + case i == 255: + return _SystemErrCode_name_1 + default: + return fmt.Sprintf("SystemErrCode(%d)", i) + } +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/client.go b/vendor/github.com/uber/tchannel-go/thrift/client.go new file mode 100644 index 00000000..7a45126d --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/client.go @@ -0,0 +1,160 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thrift + +import ( + "github.com/uber/tchannel-go" + "github.com/uber/tchannel-go/internal/argreader" + + "github.com/apache/thrift/lib/go/thrift" + "golang.org/x/net/context" +) + +// client implements TChanClient and makes outgoing Thrift calls. +type client struct { + ch *tchannel.Channel + sc *tchannel.SubChannel + serviceName string + opts ClientOptions +} + +// ClientOptions are options to customize the client. +type ClientOptions struct { + // HostPort specifies a specific server to hit. + HostPort string +} + +// NewClient returns a Client that makes calls over the given tchannel to the given Hyperbahn service. +func NewClient(ch *tchannel.Channel, serviceName string, opts *ClientOptions) TChanClient { + client := &client{ + ch: ch, + sc: ch.GetSubChannel(serviceName), + serviceName: serviceName, + } + if opts != nil { + client.opts = *opts + } + return client +} + +func (c *client) startCall(ctx context.Context, method string, callOptions *tchannel.CallOptions) (*tchannel.OutboundCall, error) { + if c.opts.HostPort != "" { + return c.ch.BeginCall(ctx, c.opts.HostPort, c.serviceName, method, callOptions) + } + return c.sc.BeginCall(ctx, method, callOptions) +} + +func writeArgs(call *tchannel.OutboundCall, headers map[string]string, req thrift.TStruct) error { + writer, err := call.Arg2Writer() + if err != nil { + return err + } + headers = tchannel.InjectOutboundSpan(call.Response(), headers) + if err := WriteHeaders(writer, headers); err != nil { + return err + } + if err := writer.Close(); err != nil { + return err + } + + writer, err = call.Arg3Writer() + if err != nil { + return err + } + + if err := WriteStruct(writer, req); err != nil { + return err + } + + return writer.Close() +} + +// readResponse reads the response struct into resp, and returns: +// (response headers, whether there was an application error, unexpected error). +func readResponse(response *tchannel.OutboundCallResponse, resp thrift.TStruct) (map[string]string, bool, error) { + reader, err := response.Arg2Reader() + if err != nil { + return nil, false, err + } + + headers, err := ReadHeaders(reader) + if err != nil { + return nil, false, err + } + + if err := argreader.EnsureEmpty(reader, "reading response headers"); err != nil { + return nil, false, err + } + + if err := reader.Close(); err != nil { + return nil, false, err + } + + success := !response.ApplicationError() + reader, err = response.Arg3Reader() + if err != nil { + return headers, success, err + } + + if err := ReadStruct(reader, resp); err != nil { + return headers, success, err + } + + if err := argreader.EnsureEmpty(reader, "reading response body"); err != nil { + return nil, false, err + } + + return headers, success, reader.Close() +} + +func (c *client) Call(ctx Context, thriftService, methodName string, req, resp thrift.TStruct) (bool, error) { + var ( + headers = ctx.Headers() + + respHeaders map[string]string + isOK bool + ) + + err := c.ch.RunWithRetry(ctx, func(ctx context.Context, rs *tchannel.RequestState) error { + respHeaders, isOK = nil, false + + call, err := c.startCall(ctx, thriftService+"::"+methodName, &tchannel.CallOptions{ + Format: tchannel.Thrift, + RequestState: rs, + }) + if err != nil { + return err + } + + if err := writeArgs(call, headers, req); err != nil { + return err + } + + respHeaders, isOK, err = readResponse(call.Response(), resp) + return err + }) + if err != nil { + return false, err + } + + ctx.SetResponseHeaders(respHeaders) + return isOK, nil +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/context.go b/vendor/github.com/uber/tchannel-go/thrift/context.go new file mode 100644 index 00000000..9f04ef18 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/context.go @@ -0,0 +1,47 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thrift + +import ( + "time" + + "github.com/uber/tchannel-go" + "golang.org/x/net/context" +) + +// Context is a Thrift Context which contains request and response headers. +type Context tchannel.ContextWithHeaders + +// NewContext returns a Context that can be used to make Thrift calls. +func NewContext(timeout time.Duration) (Context, context.CancelFunc) { + ctx, cancel := tchannel.NewContext(timeout) + return Wrap(ctx), cancel +} + +// Wrap returns a Thrift Context that wraps around a Context. +func Wrap(ctx context.Context) Context { + return tchannel.Wrap(ctx) +} + +// WithHeaders returns a Context that can be used to make a call with request headers. +func WithHeaders(ctx context.Context, headers map[string]string) Context { + return tchannel.WrapWithHeaders(ctx, headers) +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/doc.go b/vendor/github.com/uber/tchannel-go/thrift/doc.go new file mode 100644 index 00000000..2635c46e --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/doc.go @@ -0,0 +1,44 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* +Package thrift adds support to use Thrift services over TChannel. + +To start listening to a Thrift service using TChannel, create the channel, +and register the service using: + server := thrift.NewServer(tchan) + server.Register(gen.NewTChan[SERVICE]Server(handler) + + // Any number of services can be registered on the same Thrift server. + server.Register(gen.NewTChan[SERVICE2]Server(handler) + +To use a Thrift client use the generated TChan client: + thriftClient := thrift.NewClient(ch, "hyperbahnService", nil) + client := gen.NewTChan[SERVICE]Client(thriftClient) + + // Any number of service clients can be made using the same Thrift client. + client2 := gen.NewTChan[SERVICE2]Client(thriftClient) + +This client can be used similar to a standard Thrift client, except a Context +is passed with options (such as timeout). + +TODO(prashant): Add and document header support. +*/ +package thrift diff --git a/vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/constants.go b/vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/constants.go new file mode 100644 index 00000000..40403d9c --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/constants.go @@ -0,0 +1,18 @@ +// Autogenerated by Thrift Compiler (1.0.0-dev) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package meta + +import ( + "bytes" + "fmt" + "github.com/apache/thrift/lib/go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +func init() { +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/meta.go b/vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/meta.go new file mode 100644 index 00000000..c865f794 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/meta.go @@ -0,0 +1,972 @@ +// Autogenerated by Thrift Compiler (1.0.0-dev) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package meta + +import ( + "bytes" + "fmt" + "github.com/apache/thrift/lib/go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +type Meta interface { + // Parameters: + // - Hr + Health(hr *HealthRequest) (r *HealthStatus, err error) + ThriftIDL() (r *ThriftIDLs, err error) + VersionInfo() (r *VersionInfo, err error) +} + +type MetaClient struct { + Transport thrift.TTransport + ProtocolFactory thrift.TProtocolFactory + InputProtocol thrift.TProtocol + OutputProtocol thrift.TProtocol + SeqId int32 +} + +func NewMetaClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *MetaClient { + return &MetaClient{Transport: t, + ProtocolFactory: f, + InputProtocol: f.GetProtocol(t), + OutputProtocol: f.GetProtocol(t), + SeqId: 0, + } +} + +func NewMetaClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *MetaClient { + return &MetaClient{Transport: t, + ProtocolFactory: nil, + InputProtocol: iprot, + OutputProtocol: oprot, + SeqId: 0, + } +} + +// Parameters: +// - Hr +func (p *MetaClient) Health(hr *HealthRequest) (r *HealthStatus, err error) { + if err = p.sendHealth(hr); err != nil { + return + } + return p.recvHealth() +} + +func (p *MetaClient) sendHealth(hr *HealthRequest) (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("health", thrift.CALL, p.SeqId); err != nil { + return + } + args := MetaHealthArgs{ + Hr: hr, + } + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *MetaClient) recvHealth() (value *HealthStatus, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "health" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "health failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "health failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error2 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error3 error + error3, err = error2.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error3 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "health failed: invalid message type") + return + } + result := MetaHealthResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + value = result.GetSuccess() + return +} + +func (p *MetaClient) ThriftIDL() (r *ThriftIDLs, err error) { + if err = p.sendThriftIDL(); err != nil { + return + } + return p.recvThriftIDL() +} + +func (p *MetaClient) sendThriftIDL() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("thriftIDL", thrift.CALL, p.SeqId); err != nil { + return + } + args := MetaThriftIDLArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *MetaClient) recvThriftIDL() (value *ThriftIDLs, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "thriftIDL" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "thriftIDL failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "thriftIDL failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error4 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error5 error + error5, err = error4.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error5 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "thriftIDL failed: invalid message type") + return + } + result := MetaThriftIDLResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + value = result.GetSuccess() + return +} + +func (p *MetaClient) VersionInfo() (r *VersionInfo, err error) { + if err = p.sendVersionInfo(); err != nil { + return + } + return p.recvVersionInfo() +} + +func (p *MetaClient) sendVersionInfo() (err error) { + oprot := p.OutputProtocol + if oprot == nil { + oprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.OutputProtocol = oprot + } + p.SeqId++ + if err = oprot.WriteMessageBegin("versionInfo", thrift.CALL, p.SeqId); err != nil { + return + } + args := MetaVersionInfoArgs{} + if err = args.Write(oprot); err != nil { + return + } + if err = oprot.WriteMessageEnd(); err != nil { + return + } + return oprot.Flush() +} + +func (p *MetaClient) recvVersionInfo() (value *VersionInfo, err error) { + iprot := p.InputProtocol + if iprot == nil { + iprot = p.ProtocolFactory.GetProtocol(p.Transport) + p.InputProtocol = iprot + } + method, mTypeId, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return + } + if method != "versionInfo" { + err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "versionInfo failed: wrong method name") + return + } + if p.SeqId != seqId { + err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "versionInfo failed: out of sequence response") + return + } + if mTypeId == thrift.EXCEPTION { + error6 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") + var error7 error + error7, err = error6.Read(iprot) + if err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + err = error7 + return + } + if mTypeId != thrift.REPLY { + err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "versionInfo failed: invalid message type") + return + } + result := MetaVersionInfoResult{} + if err = result.Read(iprot); err != nil { + return + } + if err = iprot.ReadMessageEnd(); err != nil { + return + } + value = result.GetSuccess() + return +} + +type MetaProcessor struct { + processorMap map[string]thrift.TProcessorFunction + handler Meta +} + +func (p *MetaProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { + p.processorMap[key] = processor +} + +func (p *MetaProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { + processor, ok = p.processorMap[key] + return processor, ok +} + +func (p *MetaProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { + return p.processorMap +} + +func NewMetaProcessor(handler Meta) *MetaProcessor { + + self8 := &MetaProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} + self8.processorMap["health"] = &metaProcessorHealth{handler: handler} + self8.processorMap["thriftIDL"] = &metaProcessorThriftIDL{handler: handler} + self8.processorMap["versionInfo"] = &metaProcessorVersionInfo{handler: handler} + return self8 +} + +func (p *MetaProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + name, _, seqId, err := iprot.ReadMessageBegin() + if err != nil { + return false, err + } + if processor, ok := p.GetProcessorFunction(name); ok { + return processor.Process(seqId, iprot, oprot) + } + iprot.Skip(thrift.STRUCT) + iprot.ReadMessageEnd() + x9 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) + oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) + x9.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, x9 + +} + +type metaProcessorHealth struct { + handler Meta +} + +func (p *metaProcessorHealth) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := MetaHealthArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("health", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := MetaHealthResult{} + var retval *HealthStatus + var err2 error + if retval, err2 = p.handler.Health(args.Hr); err2 != nil { + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing health: "+err2.Error()) + oprot.WriteMessageBegin("health", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("health", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type metaProcessorThriftIDL struct { + handler Meta +} + +func (p *metaProcessorThriftIDL) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := MetaThriftIDLArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("thriftIDL", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := MetaThriftIDLResult{} + var retval *ThriftIDLs + var err2 error + if retval, err2 = p.handler.ThriftIDL(); err2 != nil { + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing thriftIDL: "+err2.Error()) + oprot.WriteMessageBegin("thriftIDL", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("thriftIDL", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +type metaProcessorVersionInfo struct { + handler Meta +} + +func (p *metaProcessorVersionInfo) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { + args := MetaVersionInfoArgs{} + if err = args.Read(iprot); err != nil { + iprot.ReadMessageEnd() + x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) + oprot.WriteMessageBegin("versionInfo", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return false, err + } + + iprot.ReadMessageEnd() + result := MetaVersionInfoResult{} + var retval *VersionInfo + var err2 error + if retval, err2 = p.handler.VersionInfo(); err2 != nil { + x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing versionInfo: "+err2.Error()) + oprot.WriteMessageBegin("versionInfo", thrift.EXCEPTION, seqId) + x.Write(oprot) + oprot.WriteMessageEnd() + oprot.Flush() + return true, err2 + } else { + result.Success = retval + } + if err2 = oprot.WriteMessageBegin("versionInfo", thrift.REPLY, seqId); err2 != nil { + err = err2 + } + if err2 = result.Write(oprot); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { + err = err2 + } + if err2 = oprot.Flush(); err == nil && err2 != nil { + err = err2 + } + if err != nil { + return + } + return true, err +} + +// HELPER FUNCTIONS AND STRUCTURES + +// Attributes: +// - Hr +type MetaHealthArgs struct { + Hr *HealthRequest `thrift:"hr,1" db:"hr" json:"hr"` +} + +func NewMetaHealthArgs() *MetaHealthArgs { + return &MetaHealthArgs{} +} + +var MetaHealthArgs_Hr_DEFAULT *HealthRequest + +func (p *MetaHealthArgs) GetHr() *HealthRequest { + if !p.IsSetHr() { + return MetaHealthArgs_Hr_DEFAULT + } + return p.Hr +} +func (p *MetaHealthArgs) IsSetHr() bool { + return p.Hr != nil +} + +func (p *MetaHealthArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *MetaHealthArgs) ReadField1(iprot thrift.TProtocol) error { + p.Hr = &HealthRequest{} + if err := p.Hr.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Hr), err) + } + return nil +} + +func (p *MetaHealthArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("health_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *MetaHealthArgs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("hr", thrift.STRUCT, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:hr: ", p), err) + } + if err := p.Hr.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Hr), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:hr: ", p), err) + } + return err +} + +func (p *MetaHealthArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("MetaHealthArgs(%+v)", *p) +} + +// Attributes: +// - Success +type MetaHealthResult struct { + Success *HealthStatus `thrift:"success,0" db:"success" json:"success,omitempty"` +} + +func NewMetaHealthResult() *MetaHealthResult { + return &MetaHealthResult{} +} + +var MetaHealthResult_Success_DEFAULT *HealthStatus + +func (p *MetaHealthResult) GetSuccess() *HealthStatus { + if !p.IsSetSuccess() { + return MetaHealthResult_Success_DEFAULT + } + return p.Success +} +func (p *MetaHealthResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *MetaHealthResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *MetaHealthResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &HealthStatus{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *MetaHealthResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("health_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField0(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *MetaHealthResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *MetaHealthResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("MetaHealthResult(%+v)", *p) +} + +type MetaThriftIDLArgs struct { +} + +func NewMetaThriftIDLArgs() *MetaThriftIDLArgs { + return &MetaThriftIDLArgs{} +} + +func (p *MetaThriftIDLArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *MetaThriftIDLArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("thriftIDL_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *MetaThriftIDLArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("MetaThriftIDLArgs(%+v)", *p) +} + +// Attributes: +// - Success +type MetaThriftIDLResult struct { + Success *ThriftIDLs `thrift:"success,0" db:"success" json:"success,omitempty"` +} + +func NewMetaThriftIDLResult() *MetaThriftIDLResult { + return &MetaThriftIDLResult{} +} + +var MetaThriftIDLResult_Success_DEFAULT *ThriftIDLs + +func (p *MetaThriftIDLResult) GetSuccess() *ThriftIDLs { + if !p.IsSetSuccess() { + return MetaThriftIDLResult_Success_DEFAULT + } + return p.Success +} +func (p *MetaThriftIDLResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *MetaThriftIDLResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *MetaThriftIDLResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &ThriftIDLs{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *MetaThriftIDLResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("thriftIDL_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField0(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *MetaThriftIDLResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *MetaThriftIDLResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("MetaThriftIDLResult(%+v)", *p) +} + +type MetaVersionInfoArgs struct { +} + +func NewMetaVersionInfoArgs() *MetaVersionInfoArgs { + return &MetaVersionInfoArgs{} +} + +func (p *MetaVersionInfoArgs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *MetaVersionInfoArgs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("versionInfo_args"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *MetaVersionInfoArgs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("MetaVersionInfoArgs(%+v)", *p) +} + +// Attributes: +// - Success +type MetaVersionInfoResult struct { + Success *VersionInfo `thrift:"success,0" db:"success" json:"success,omitempty"` +} + +func NewMetaVersionInfoResult() *MetaVersionInfoResult { + return &MetaVersionInfoResult{} +} + +var MetaVersionInfoResult_Success_DEFAULT *VersionInfo + +func (p *MetaVersionInfoResult) GetSuccess() *VersionInfo { + if !p.IsSetSuccess() { + return MetaVersionInfoResult_Success_DEFAULT + } + return p.Success +} +func (p *MetaVersionInfoResult) IsSetSuccess() bool { + return p.Success != nil +} + +func (p *MetaVersionInfoResult) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 0: + if err := p.ReadField0(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *MetaVersionInfoResult) ReadField0(iprot thrift.TProtocol) error { + p.Success = &VersionInfo{} + if err := p.Success.Read(iprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) + } + return nil +} + +func (p *MetaVersionInfoResult) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("versionInfo_result"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField0(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *MetaVersionInfoResult) writeField0(oprot thrift.TProtocol) (err error) { + if p.IsSetSuccess() { + if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) + } + if err := p.Success.Write(oprot); err != nil { + return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) + } + } + return err +} + +func (p *MetaVersionInfoResult) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("MetaVersionInfoResult(%+v)", *p) +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/ttypes.go b/vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/ttypes.go new file mode 100644 index 00000000..1d42b818 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/gen-go/meta/ttypes.go @@ -0,0 +1,788 @@ +// Autogenerated by Thrift Compiler (1.0.0-dev) +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + +package meta + +import ( + "bytes" + "database/sql/driver" + "errors" + "fmt" + "github.com/apache/thrift/lib/go/thrift" +) + +// (needed to ensure safety because of naive import list construction.) +var _ = thrift.ZERO +var _ = fmt.Printf +var _ = bytes.Equal + +var GoUnusedProtection__ int + +type HealthState int64 + +const ( + HealthState_REFUSING HealthState = 0 + HealthState_ACCEPTING HealthState = 1 + HealthState_STOPPING HealthState = 2 + HealthState_STOPPED HealthState = 3 +) + +func (p HealthState) String() string { + switch p { + case HealthState_REFUSING: + return "REFUSING" + case HealthState_ACCEPTING: + return "ACCEPTING" + case HealthState_STOPPING: + return "STOPPING" + case HealthState_STOPPED: + return "STOPPED" + } + return "" +} + +func HealthStateFromString(s string) (HealthState, error) { + switch s { + case "REFUSING": + return HealthState_REFUSING, nil + case "ACCEPTING": + return HealthState_ACCEPTING, nil + case "STOPPING": + return HealthState_STOPPING, nil + case "STOPPED": + return HealthState_STOPPED, nil + } + return HealthState(0), fmt.Errorf("not a valid HealthState string") +} + +func HealthStatePtr(v HealthState) *HealthState { return &v } + +func (p HealthState) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *HealthState) UnmarshalText(text []byte) error { + q, err := HealthStateFromString(string(text)) + if err != nil { + return err + } + *p = q + return nil +} + +func (p *HealthState) Scan(value interface{}) error { + v, ok := value.(int64) + if !ok { + return errors.New("Scan value is not int64") + } + *p = HealthState(v) + return nil +} + +func (p *HealthState) Value() (driver.Value, error) { + if p == nil { + return nil, nil + } + return int64(*p), nil +} + +type HealthRequestType int64 + +const ( + HealthRequestType_PROCESS HealthRequestType = 0 + HealthRequestType_TRAFFIC HealthRequestType = 1 +) + +func (p HealthRequestType) String() string { + switch p { + case HealthRequestType_PROCESS: + return "PROCESS" + case HealthRequestType_TRAFFIC: + return "TRAFFIC" + } + return "" +} + +func HealthRequestTypeFromString(s string) (HealthRequestType, error) { + switch s { + case "PROCESS": + return HealthRequestType_PROCESS, nil + case "TRAFFIC": + return HealthRequestType_TRAFFIC, nil + } + return HealthRequestType(0), fmt.Errorf("not a valid HealthRequestType string") +} + +func HealthRequestTypePtr(v HealthRequestType) *HealthRequestType { return &v } + +func (p HealthRequestType) MarshalText() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *HealthRequestType) UnmarshalText(text []byte) error { + q, err := HealthRequestTypeFromString(string(text)) + if err != nil { + return err + } + *p = q + return nil +} + +func (p *HealthRequestType) Scan(value interface{}) error { + v, ok := value.(int64) + if !ok { + return errors.New("Scan value is not int64") + } + *p = HealthRequestType(v) + return nil +} + +func (p *HealthRequestType) Value() (driver.Value, error) { + if p == nil { + return nil, nil + } + return int64(*p), nil +} + +type Filename string + +func FilenamePtr(v Filename) *Filename { return &v } + +// Attributes: +// - Type +type HealthRequest struct { + Type *HealthRequestType `thrift:"type,1" db:"type" json:"type,omitempty"` +} + +func NewHealthRequest() *HealthRequest { + return &HealthRequest{} +} + +var HealthRequest_Type_DEFAULT HealthRequestType + +func (p *HealthRequest) GetType() HealthRequestType { + if !p.IsSetType() { + return HealthRequest_Type_DEFAULT + } + return *p.Type +} +func (p *HealthRequest) IsSetType() bool { + return p.Type != nil +} + +func (p *HealthRequest) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + return nil +} + +func (p *HealthRequest) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + temp := HealthRequestType(v) + p.Type = &temp + } + return nil +} + +func (p *HealthRequest) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("HealthRequest"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *HealthRequest) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetType() { + if err := oprot.WriteFieldBegin("type", thrift.I32, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:type: ", p), err) + } + if err := oprot.WriteI32(int32(*p.Type)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.type (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:type: ", p), err) + } + } + return err +} + +func (p *HealthRequest) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("HealthRequest(%+v)", *p) +} + +// Attributes: +// - Ok +// - Message +// - State +type HealthStatus struct { + Ok bool `thrift:"ok,1,required" db:"ok" json:"ok"` + Message *string `thrift:"message,2" db:"message" json:"message,omitempty"` + State *HealthState `thrift:"state,3" db:"state" json:"state,omitempty"` +} + +func NewHealthStatus() *HealthStatus { + return &HealthStatus{} +} + +func (p *HealthStatus) GetOk() bool { + return p.Ok +} + +var HealthStatus_Message_DEFAULT string + +func (p *HealthStatus) GetMessage() string { + if !p.IsSetMessage() { + return HealthStatus_Message_DEFAULT + } + return *p.Message +} + +var HealthStatus_State_DEFAULT HealthState + +func (p *HealthStatus) GetState() HealthState { + if !p.IsSetState() { + return HealthStatus_State_DEFAULT + } + return *p.State +} +func (p *HealthStatus) IsSetMessage() bool { + return p.Message != nil +} + +func (p *HealthStatus) IsSetState() bool { + return p.State != nil +} + +func (p *HealthStatus) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetOk bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetOk = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetOk { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Ok is not set")) + } + return nil +} + +func (p *HealthStatus) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadBool(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Ok = v + } + return nil +} + +func (p *HealthStatus) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.Message = &v + } + return nil +} + +func (p *HealthStatus) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadI32(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + temp := HealthState(v) + p.State = &temp + } + return nil +} + +func (p *HealthStatus) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("HealthStatus"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *HealthStatus) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("ok", thrift.BOOL, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ok: ", p), err) + } + if err := oprot.WriteBool(bool(p.Ok)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.ok (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ok: ", p), err) + } + return err +} + +func (p *HealthStatus) writeField2(oprot thrift.TProtocol) (err error) { + if p.IsSetMessage() { + if err := oprot.WriteFieldBegin("message", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:message: ", p), err) + } + if err := oprot.WriteString(string(*p.Message)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.message (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:message: ", p), err) + } + } + return err +} + +func (p *HealthStatus) writeField3(oprot thrift.TProtocol) (err error) { + if p.IsSetState() { + if err := oprot.WriteFieldBegin("state", thrift.I32, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:state: ", p), err) + } + if err := oprot.WriteI32(int32(*p.State)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.state (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:state: ", p), err) + } + } + return err +} + +func (p *HealthStatus) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("HealthStatus(%+v)", *p) +} + +// Attributes: +// - Idls +// - EntryPoint +type ThriftIDLs struct { + Idls map[Filename]string `thrift:"idls,1,required" db:"idls" json:"idls"` + EntryPoint Filename `thrift:"entryPoint,2,required" db:"entryPoint" json:"entryPoint"` +} + +func NewThriftIDLs() *ThriftIDLs { + return &ThriftIDLs{} +} + +func (p *ThriftIDLs) GetIdls() map[Filename]string { + return p.Idls +} + +func (p *ThriftIDLs) GetEntryPoint() Filename { + return p.EntryPoint +} +func (p *ThriftIDLs) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetIdls bool = false + var issetEntryPoint bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetIdls = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetEntryPoint = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetIdls { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Idls is not set")) + } + if !issetEntryPoint { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field EntryPoint is not set")) + } + return nil +} + +func (p *ThriftIDLs) ReadField1(iprot thrift.TProtocol) error { + _, _, size, err := iprot.ReadMapBegin() + if err != nil { + return thrift.PrependError("error reading map begin: ", err) + } + tMap := make(map[Filename]string, size) + p.Idls = tMap + for i := 0; i < size; i++ { + var _key0 Filename + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + temp := Filename(v) + _key0 = temp + } + var _val1 string + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 0: ", err) + } else { + _val1 = v + } + p.Idls[_key0] = _val1 + } + if err := iprot.ReadMapEnd(); err != nil { + return thrift.PrependError("error reading map end: ", err) + } + return nil +} + +func (p *ThriftIDLs) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + temp := Filename(v) + p.EntryPoint = temp + } + return nil +} + +func (p *ThriftIDLs) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("ThriftIDLs"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *ThriftIDLs) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("idls", thrift.MAP, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:idls: ", p), err) + } + if err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(p.Idls)); err != nil { + return thrift.PrependError("error writing map begin: ", err) + } + for k, v := range p.Idls { + if err := oprot.WriteString(string(k)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + if err := oprot.WriteString(string(v)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) + } + } + if err := oprot.WriteMapEnd(); err != nil { + return thrift.PrependError("error writing map end: ", err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:idls: ", p), err) + } + return err +} + +func (p *ThriftIDLs) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("entryPoint", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:entryPoint: ", p), err) + } + if err := oprot.WriteString(string(p.EntryPoint)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.entryPoint (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:entryPoint: ", p), err) + } + return err +} + +func (p *ThriftIDLs) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("ThriftIDLs(%+v)", *p) +} + +// Attributes: +// - Language +// - LanguageVersion +// - Version +type VersionInfo struct { + Language string `thrift:"language,1,required" db:"language" json:"language"` + LanguageVersion string `thrift:"language_version,2,required" db:"language_version" json:"language_version"` + Version string `thrift:"version,3,required" db:"version" json:"version"` +} + +func NewVersionInfo() *VersionInfo { + return &VersionInfo{} +} + +func (p *VersionInfo) GetLanguage() string { + return p.Language +} + +func (p *VersionInfo) GetLanguageVersion() string { + return p.LanguageVersion +} + +func (p *VersionInfo) GetVersion() string { + return p.Version +} +func (p *VersionInfo) Read(iprot thrift.TProtocol) error { + if _, err := iprot.ReadStructBegin(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) + } + + var issetLanguage bool = false + var issetLanguageVersion bool = false + var issetVersion bool = false + + for { + _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() + if err != nil { + return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if err := p.ReadField1(iprot); err != nil { + return err + } + issetLanguage = true + case 2: + if err := p.ReadField2(iprot); err != nil { + return err + } + issetLanguageVersion = true + case 3: + if err := p.ReadField3(iprot); err != nil { + return err + } + issetVersion = true + default: + if err := iprot.Skip(fieldTypeId); err != nil { + return err + } + } + if err := iprot.ReadFieldEnd(); err != nil { + return err + } + } + if err := iprot.ReadStructEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) + } + if !issetLanguage { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Language is not set")) + } + if !issetLanguageVersion { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field LanguageVersion is not set")) + } + if !issetVersion { + return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Version is not set")) + } + return nil +} + +func (p *VersionInfo) ReadField1(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 1: ", err) + } else { + p.Language = v + } + return nil +} + +func (p *VersionInfo) ReadField2(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 2: ", err) + } else { + p.LanguageVersion = v + } + return nil +} + +func (p *VersionInfo) ReadField3(iprot thrift.TProtocol) error { + if v, err := iprot.ReadString(); err != nil { + return thrift.PrependError("error reading field 3: ", err) + } else { + p.Version = v + } + return nil +} + +func (p *VersionInfo) Write(oprot thrift.TProtocol) error { + if err := oprot.WriteStructBegin("VersionInfo"); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) + } + if err := p.writeField1(oprot); err != nil { + return err + } + if err := p.writeField2(oprot); err != nil { + return err + } + if err := p.writeField3(oprot); err != nil { + return err + } + if err := oprot.WriteFieldStop(); err != nil { + return thrift.PrependError("write field stop error: ", err) + } + if err := oprot.WriteStructEnd(); err != nil { + return thrift.PrependError("write struct stop error: ", err) + } + return nil +} + +func (p *VersionInfo) writeField1(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("language", thrift.STRING, 1); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:language: ", p), err) + } + if err := oprot.WriteString(string(p.Language)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.language (1) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 1:language: ", p), err) + } + return err +} + +func (p *VersionInfo) writeField2(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("language_version", thrift.STRING, 2); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:language_version: ", p), err) + } + if err := oprot.WriteString(string(p.LanguageVersion)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.language_version (2) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 2:language_version: ", p), err) + } + return err +} + +func (p *VersionInfo) writeField3(oprot thrift.TProtocol) (err error) { + if err := oprot.WriteFieldBegin("version", thrift.STRING, 3); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:version: ", p), err) + } + if err := oprot.WriteString(string(p.Version)); err != nil { + return thrift.PrependError(fmt.Sprintf("%T.version (3) field write error: ", p), err) + } + if err := oprot.WriteFieldEnd(); err != nil { + return thrift.PrependError(fmt.Sprintf("%T write field end error 3:version: ", p), err) + } + return err +} + +func (p *VersionInfo) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("VersionInfo(%+v)", *p) +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/headers.go b/vendor/github.com/uber/tchannel-go/thrift/headers.go new file mode 100644 index 00000000..05becce3 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/headers.go @@ -0,0 +1,90 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thrift + +import ( + "fmt" + "io" + + "github.com/uber/tchannel-go/typed" +) + +// WriteHeaders writes the given key-value pairs using the following encoding: +// len~2 (k~4 v~4)~len +func WriteHeaders(w io.Writer, headers map[string]string) error { + // TODO(prashant): Since we are not writing length-prefixed data here, + // we can write out to the buffer, and if it fills up, flush it. + // Right now, we calculate the size of the required buffer and write it out. + + // Calculate the size of the buffer that we need. + size := 2 + for k, v := range headers { + size += 4 /* size of key/value lengths */ + size += len(k) + len(v) + } + + buf := make([]byte, size) + writeBuffer := typed.NewWriteBuffer(buf) + writeBuffer.WriteUint16(uint16(len(headers))) + for k, v := range headers { + writeBuffer.WriteLen16String(k) + writeBuffer.WriteLen16String(v) + } + + if err := writeBuffer.Err(); err != nil { + return err + } + + // Safety check to ensure the bytes written calculation is correct. + if writeBuffer.BytesWritten() != size { + return fmt.Errorf( + "writeHeaders size calculation wrong, expected to write %v bytes, only wrote %v bytes", + size, writeBuffer.BytesWritten()) + } + + _, err := writeBuffer.FlushTo(w) + return err +} + +func readHeaders(reader *typed.Reader) (map[string]string, error) { + numHeaders := reader.ReadUint16() + if numHeaders == 0 { + return nil, reader.Err() + } + + headers := make(map[string]string, numHeaders) + for i := 0; i < int(numHeaders) && reader.Err() == nil; i++ { + k := reader.ReadLen16String() + v := reader.ReadLen16String() + headers[k] = v + } + + return headers, reader.Err() +} + +// ReadHeaders reads key-value pairs encoded using WriteHeaders. +func ReadHeaders(r io.Reader) (map[string]string, error) { + reader := typed.NewReader(r) + m, err := readHeaders(reader) + reader.Release() + + return m, err +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/interfaces.go b/vendor/github.com/uber/tchannel-go/thrift/interfaces.go new file mode 100644 index 00000000..a04a7d5f --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/interfaces.go @@ -0,0 +1,46 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thrift + +import athrift "github.com/apache/thrift/lib/go/thrift" + +// This file defines interfaces that are used or exposed by thrift-gen generated code. +// TChanClient is used by the generated code to make outgoing requests. +// TChanServer is exposed by the generated code, and is called on incoming requests. + +// TChanClient abstracts calling a Thrift endpoint, and is used by the generated client code. +type TChanClient interface { + // Call should be passed the method to call and the request/response Thrift structs. + Call(ctx Context, serviceName, methodName string, req, resp athrift.TStruct) (success bool, err error) +} + +// TChanServer abstracts handling of an RPC that is implemented by the generated server code. +type TChanServer interface { + // Handle should read the request from the given reqReader, and return the response struct. + // The arguments returned are success, result struct, unexpected error + Handle(ctx Context, methodName string, protocol athrift.TProtocol) (success bool, resp athrift.TStruct, err error) + + // Service returns the service name. + Service() string + + // Methods returns the method names handled by this server. + Methods() []string +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/meta.go b/vendor/github.com/uber/tchannel-go/thrift/meta.go new file mode 100644 index 00000000..3000dfab --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/meta.go @@ -0,0 +1,108 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thrift + +import ( + "errors" + "runtime" + "strings" + + "github.com/uber/tchannel-go" + "github.com/uber/tchannel-go/thrift/gen-go/meta" +) + +// HealthFunc is the interface for custom health endpoints. +// ok is whether the service health is OK, and message is optional additional information for the health result. +type HealthFunc func(ctx Context) (ok bool, message string) + +// HealthRequestType is the type of health check. +type HealthRequestType int + +const ( + // Process health checks are used to check whether the process is up + // and should almost always return true immediately. + Process HealthRequestType = iota + + // Traffic health checks are used to check whether the process should + // receive traffic. This can be used to keep a process running, but + // not receiving health checks (e.g., during process warm-up). + Traffic +) + +// HealthRequest is optional parametres for a health request. +type HealthRequest struct { + // Type is the type of health check being requested. + Type HealthRequestType +} + +// HealthRequestFunc is a health check function that includes parameters +// about the health check. +type HealthRequestFunc func(Context, HealthRequest) (ok bool, message string) + +// healthHandler implements the default health check enpoint. +type metaHandler struct { + healthFn HealthRequestFunc +} + +// newMetaHandler return a new HealthHandler instance. +func newMetaHandler() *metaHandler { + return &metaHandler{healthFn: defaultHealth} +} + +// Health returns true as default Health endpoint. +func (h *metaHandler) Health(ctx Context, req *meta.HealthRequest) (*meta.HealthStatus, error) { + ok, message := h.healthFn(ctx, metaReqToReq(req)) + if message == "" { + return &meta.HealthStatus{Ok: ok}, nil + } + return &meta.HealthStatus{Ok: ok, Message: &message}, nil +} + +func (h *metaHandler) ThriftIDL(ctx Context) (*meta.ThriftIDLs, error) { + // TODO(prashant): Add thriftIDL to the generated code. + return nil, errors.New("unimplemented") +} + +func (h *metaHandler) VersionInfo(ctx Context) (*meta.VersionInfo, error) { + return &meta.VersionInfo{ + Language: "go", + LanguageVersion: strings.TrimPrefix(runtime.Version(), "go"), + Version: tchannel.VersionInfo, + }, nil +} + +func defaultHealth(ctx Context, r HealthRequest) (bool, string) { + return true, "" +} + +func (h *metaHandler) setHandler(f HealthRequestFunc) { + h.healthFn = f +} + +func metaReqToReq(r *meta.HealthRequest) HealthRequest { + if r == nil { + return HealthRequest{} + } + + return HealthRequest{ + Type: HealthRequestType(r.GetType()), + } +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/meta.thrift b/vendor/github.com/uber/tchannel-go/thrift/meta.thrift new file mode 100644 index 00000000..b036c1e9 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/meta.thrift @@ -0,0 +1,58 @@ +// The HealthState provides additional information when the +// health endpoint returns !ok. +enum HealthState { + REFUSING = 0, + ACCEPTING = 1, + STOPPING = 2, + STOPPED = 3, +} + +// The HealthRequestType is the type of health check, as a process may want to +// return that it's running, but not ready for traffic. +enum HealthRequestType { + // PROCESS indicates that the health check is for checking that + // the process is up. Handlers should always return "ok". + PROCESS = 0, + + // TRAFFIC indicates that the health check is for checking whether + // the process wants to receive traffic. The process may want to reject + // traffic due to warmup, or before shutdown to avoid in-flight requests + // when the process exits. + TRAFFIC = 1, +} + +struct HealthRequest { + 1: optional HealthRequestType type +} + +struct HealthStatus { + 1: required bool ok + 2: optional string message + 3: optional HealthState state +} + +typedef string filename + +struct ThriftIDLs { + // map: filename -> contents + 1: required map idls + // the entry IDL that imports others + 2: required filename entryPoint +} + +struct VersionInfo { + // short string naming the implementation language + 1: required string language + // language-specific version string representing runtime or build chain + 2: required string language_version + // semver version indicating the version of the tchannel library + 3: required string version +} + +service Meta { + // All arguments are optional. The default is a PROCESS health request. + HealthStatus health(1: HealthRequest hr) + + ThriftIDLs thriftIDL() + VersionInfo versionInfo() +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/options.go b/vendor/github.com/uber/tchannel-go/thrift/options.go new file mode 100644 index 00000000..050a3282 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/options.go @@ -0,0 +1,47 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thrift + +import ( + "github.com/apache/thrift/lib/go/thrift" + "golang.org/x/net/context" +) + +// RegisterOption is the interface for options to Register. +type RegisterOption interface { + Apply(h *handler) +} + +// PostResponseCB registers a callback that is run after a response has been +// compeltely processed (e.g. written to the channel). +// This gives the server a chance to clean up resources from the response object +type PostResponseCB func(ctx context.Context, method string, response thrift.TStruct) + +type optPostResponse PostResponseCB + +// OptPostResponse registers a PostResponseCB. +func OptPostResponse(cb PostResponseCB) RegisterOption { + return optPostResponse(cb) +} + +func (o optPostResponse) Apply(h *handler) { + h.postResponseCB = PostResponseCB(o) +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/server.go b/vendor/github.com/uber/tchannel-go/thrift/server.go new file mode 100644 index 00000000..a33146d4 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/server.go @@ -0,0 +1,240 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thrift + +import ( + "log" + "strings" + "sync" + + tchannel "github.com/uber/tchannel-go" + "github.com/uber/tchannel-go/internal/argreader" + + "github.com/apache/thrift/lib/go/thrift" + "golang.org/x/net/context" +) + +type handler struct { + server TChanServer + postResponseCB PostResponseCB +} + +// Server handles incoming TChannel calls and forwards them to the matching TChanServer. +type Server struct { + sync.RWMutex + ch tchannel.Registrar + log tchannel.Logger + handlers map[string]handler + metaHandler *metaHandler + ctxFn func(ctx context.Context, method string, headers map[string]string) Context +} + +// NewServer returns a server that can serve thrift services over TChannel. +func NewServer(registrar tchannel.Registrar) *Server { + metaHandler := newMetaHandler() + server := &Server{ + ch: registrar, + log: registrar.Logger(), + handlers: make(map[string]handler), + metaHandler: metaHandler, + ctxFn: defaultContextFn, + } + server.Register(newTChanMetaServer(metaHandler)) + if ch, ok := registrar.(*tchannel.Channel); ok { + // Register the meta endpoints on the "tchannel" service name. + NewServer(ch.GetSubChannel("tchannel")) + } + return server +} + +// Register registers the given TChanServer to be called on any incoming call for its' services. +// TODO(prashant): Replace Register call with this call. +func (s *Server) Register(svr TChanServer, opts ...RegisterOption) { + service := svr.Service() + handler := &handler{server: svr} + for _, opt := range opts { + opt.Apply(handler) + } + + s.Lock() + s.handlers[service] = *handler + s.Unlock() + + for _, m := range svr.Methods() { + s.ch.Register(s, service+"::"+m) + } +} + +// RegisterHealthHandler uses the user-specified function f for the Health endpoint. +func (s *Server) RegisterHealthHandler(f HealthFunc) { + wrapped := func(ctx Context, r HealthRequest) (bool, string) { + return f(ctx) + } + s.metaHandler.setHandler(wrapped) +} + +// RegisterHealthRequestHandler uses the user-specified function for the +// Health endpoint. The function receives the health request which includes +// information about the type of the request being performed. +func (s *Server) RegisterHealthRequestHandler(f HealthRequestFunc) { + s.metaHandler.setHandler(f) +} + +// SetContextFn sets the function used to convert a context.Context to a thrift.Context. +// Note: This API may change and is only intended to bridge different contexts. +func (s *Server) SetContextFn(f func(ctx context.Context, method string, headers map[string]string) Context) { + s.ctxFn = f +} + +func (s *Server) onError(call *tchannel.InboundCall, err error) { + // TODO(prashant): Expose incoming call errors through options for NewServer. + remotePeer := call.RemotePeer() + logger := s.log.WithFields( + tchannel.ErrField(err), + tchannel.LogField{Key: "method", Value: call.MethodString()}, + tchannel.LogField{Key: "callerName", Value: call.CallerName()}, + + // TODO: These are very similar to the connection fields, but we don't + // have access to the connection's logger. Consider exposing the + // connection through CurrentCall. + tchannel.LogField{Key: "localAddr", Value: call.LocalPeer().HostPort}, + tchannel.LogField{Key: "remoteHostPort", Value: remotePeer.HostPort}, + tchannel.LogField{Key: "remoteIsEphemeral", Value: remotePeer.IsEphemeral}, + tchannel.LogField{Key: "remoteProcess", Value: remotePeer.ProcessName}, + ) + + if tchannel.GetSystemErrorCode(err) == tchannel.ErrCodeTimeout { + logger.Debug("Thrift server timeout.") + } else { + logger.Error("Thrift server error.") + } +} + +func defaultContextFn(ctx context.Context, method string, headers map[string]string) Context { + return WithHeaders(ctx, headers) +} + +func (s *Server) handle(origCtx context.Context, handler handler, method string, call *tchannel.InboundCall) error { + reader, err := call.Arg2Reader() + if err != nil { + return err + } + headers, err := ReadHeaders(reader) + if err != nil { + return err + } + + if err := argreader.EnsureEmpty(reader, "reading request headers"); err != nil { + return err + } + + if err := reader.Close(); err != nil { + return err + } + + reader, err = call.Arg3Reader() + if err != nil { + return err + } + + tracer := tchannel.TracerFromRegistrar(s.ch) + origCtx = tchannel.ExtractInboundSpan(origCtx, call, headers, tracer) + ctx := s.ctxFn(origCtx, method, headers) + + wp := getProtocolReader(reader) + success, resp, err := handler.server.Handle(ctx, method, wp.protocol) + thriftProtocolPool.Put(wp) + + if handler.postResponseCB != nil { + defer handler.postResponseCB(ctx, method, resp) + } + + if err != nil { + if _, ok := err.(thrift.TProtocolException); ok { + // We failed to parse the Thrift generated code, so convert the error to bad request. + err = tchannel.NewSystemError(tchannel.ErrCodeBadRequest, err.Error()) + } + + reader.Close() + call.Response().SendSystemError(err) + return nil + } + + if err := argreader.EnsureEmpty(reader, "reading request body"); err != nil { + return err + } + if err := reader.Close(); err != nil { + return err + } + + if !success { + call.Response().SetApplicationError() + } + + writer, err := call.Response().Arg2Writer() + if err != nil { + return err + } + + if err := WriteHeaders(writer, ctx.ResponseHeaders()); err != nil { + return err + } + if err := writer.Close(); err != nil { + return err + } + + writer, err = call.Response().Arg3Writer() + wp = getProtocolWriter(writer) + resp.Write(wp.protocol) + thriftProtocolPool.Put(wp) + err = writer.Close() + + return err +} + +func getServiceMethod(method string) (string, string, bool) { + s := string(method) + sep := strings.Index(s, "::") + if sep == -1 { + return "", "", false + } + return s[:sep], s[sep+2:], true +} + +// Handle handles an incoming TChannel call and forwards it to the correct handler. +func (s *Server) Handle(ctx context.Context, call *tchannel.InboundCall) { + op := call.MethodString() + service, method, ok := getServiceMethod(op) + if !ok { + log.Fatalf("Handle got call for %s which does not match the expected call format", op) + } + + s.RLock() + handler, ok := s.handlers[service] + s.RUnlock() + if !ok { + log.Fatalf("Handle got call for service %v which is not registered", service) + } + + if err := s.handle(ctx, handler, method, call); err != nil { + s.onError(call, err) + } +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/struct.go b/vendor/github.com/uber/tchannel-go/thrift/struct.go new file mode 100644 index 00000000..33f80b16 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/struct.go @@ -0,0 +1,43 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thrift + +import ( + "io" + + "github.com/apache/thrift/lib/go/thrift" +) + +// WriteStruct writes the given Thrift struct to a writer. It pools TProtocols. +func WriteStruct(writer io.Writer, s thrift.TStruct) error { + wp := getProtocolWriter(writer) + err := s.Write(wp.protocol) + thriftProtocolPool.Put(wp) + return err +} + +// ReadStruct reads the given Thrift struct. It pools TProtocols. +func ReadStruct(reader io.Reader, s thrift.TStruct) error { + wp := getProtocolReader(reader) + err := s.Read(wp.protocol) + thriftProtocolPool.Put(wp) + return err +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/tchan-meta.go b/vendor/github.com/uber/tchannel-go/thrift/tchan-meta.go new file mode 100644 index 00000000..52c2c9c4 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/tchan-meta.go @@ -0,0 +1,176 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thrift + +import ( + "fmt" + + athrift "github.com/apache/thrift/lib/go/thrift" + gen "github.com/uber/tchannel-go/thrift/gen-go/meta" +) + +// Interfaces for the service and client for the services defined in the IDL. + +// tchanMeta is the interface that defines the server handler and client interface. +type tchanMeta interface { + Health(ctx Context, req *gen.HealthRequest) (*gen.HealthStatus, error) + ThriftIDL(ctx Context) (*gen.ThriftIDLs, error) + VersionInfo(ctx Context) (*gen.VersionInfo, error) +} + +// Implementation of a client and service handler. + +type tchanMetaClient struct { + thriftService string + client TChanClient +} + +func newTChanMetaClient(client TChanClient) tchanMeta { + return &tchanMetaClient{ + "Meta", + client, + } +} + +func (c *tchanMetaClient) Health(ctx Context, req *gen.HealthRequest) (*gen.HealthStatus, error) { + var resp gen.MetaHealthResult + args := gen.MetaHealthArgs{ + Hr: req, + } + success, err := c.client.Call(ctx, c.thriftService, "health", &args, &resp) + if err == nil && !success { + } + + return resp.GetSuccess(), err +} + +func (c *tchanMetaClient) ThriftIDL(ctx Context) (*gen.ThriftIDLs, error) { + var resp gen.MetaThriftIDLResult + args := gen.MetaThriftIDLArgs{} + success, err := c.client.Call(ctx, c.thriftService, "thriftIDL", &args, &resp) + if err == nil && !success { + } + + return resp.GetSuccess(), err +} + +func (c *tchanMetaClient) VersionInfo(ctx Context) (*gen.VersionInfo, error) { + var resp gen.MetaVersionInfoResult + args := gen.MetaVersionInfoArgs{} + success, err := c.client.Call(ctx, c.thriftService, "versionInfo", &args, &resp) + if err == nil && !success { + } + + return resp.GetSuccess(), err +} + +type tchanMetaServer struct { + handler tchanMeta +} + +func newTChanMetaServer(handler tchanMeta) TChanServer { + return &tchanMetaServer{ + handler, + } +} + +func (s *tchanMetaServer) Service() string { + return "Meta" +} + +func (s *tchanMetaServer) Methods() []string { + return []string{ + "health", + "thriftIDL", + "versionInfo", + } +} + +func (s *tchanMetaServer) Handle(ctx Context, methodName string, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + switch methodName { + case "health": + return s.handleHealth(ctx, protocol) + case "thriftIDL": + return s.handleThriftIDL(ctx, protocol) + case "versionInfo": + return s.handleVersionInfo(ctx, protocol) + + default: + return false, nil, fmt.Errorf("method %v not found in service %v", methodName, s.Service()) + } +} + +func (s *tchanMetaServer) handleHealth(ctx Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req gen.MetaHealthArgs + var res gen.MetaHealthResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.Health(ctx, req.Hr) + + if err != nil { + return false, nil, err + } + res.Success = r + + return err == nil, &res, nil +} + +func (s *tchanMetaServer) handleThriftIDL(ctx Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req gen.MetaThriftIDLArgs + var res gen.MetaThriftIDLResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.ThriftIDL(ctx) + + if err != nil { + return false, nil, err + } + res.Success = r + + return err == nil, &res, nil +} + +func (s *tchanMetaServer) handleVersionInfo(ctx Context, protocol athrift.TProtocol) (bool, athrift.TStruct, error) { + var req gen.MetaVersionInfoArgs + var res gen.MetaVersionInfoResult + + if err := req.Read(protocol); err != nil { + return false, nil, err + } + + r, err := + s.handler.VersionInfo(ctx) + + if err != nil { + return false, nil, err + } + res.Success = r + + return err == nil, &res, nil +} diff --git a/vendor/github.com/uber/tchannel-go/thrift/test.thrift b/vendor/github.com/uber/tchannel-go/thrift/test.thrift new file mode 100644 index 00000000..4bc72d73 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/test.thrift @@ -0,0 +1,33 @@ +struct Data { + 1: required bool b1, + 2: required string s2, + 3: required i32 i3 +} + +exception SimpleErr { + 1: string message +} + +exception NewErr { + 1: string message +} + +service SimpleService { + Data Call(1: Data arg) + void Simple() throws (1: SimpleErr simpleErr) + void SimpleFuture() throws (1: SimpleErr simpleErr, 2: NewErr newErr) +} + +service SecondService { + string Echo(1: string arg) +} + +struct HealthStatus { + 1: required bool ok + 2: optional string message +} + +// Meta contains the old health endpoint without arguments. +service Meta { + HealthStatus health() +} \ No newline at end of file diff --git a/vendor/github.com/uber/tchannel-go/thrift/transport.go b/vendor/github.com/uber/tchannel-go/thrift/transport.go new file mode 100644 index 00000000..821ff5bf --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/thrift/transport.go @@ -0,0 +1,138 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package thrift + +import ( + "errors" + "io" + "sync" + + "github.com/apache/thrift/lib/go/thrift" +) + +// readerWriterTransport is a transport that reads and writes from the underlying Reader/Writer. +type readWriterTransport struct { + io.Writer + io.Reader + readBuf [1]byte + writeBuf [1]byte + strBuf []byte +} + +var errNoBytesRead = errors.New("no bytes read") + +func (t *readWriterTransport) Open() error { + return nil +} + +func (t *readWriterTransport) Flush() error { + return nil +} + +func (t *readWriterTransport) IsOpen() bool { + return true +} + +func (t *readWriterTransport) Close() error { + return nil +} + +func (t *readWriterTransport) ReadByte() (byte, error) { + v := t.readBuf[0:1] + + var n int + var err error + + for { + n, err = t.Read(v) + if n > 0 || err != nil { + break + } + } + + if err == io.EOF && n > 0 { + err = nil + } + return v[0], err +} + +func (t *readWriterTransport) WriteByte(b byte) error { + v := t.writeBuf[:1] + + v[0] = b + _, err := t.Write(v) + return err +} + +func (t *readWriterTransport) WriteString(s string) (int, error) { + // TODO switch to io.StringWriter once we don't need to support < 1.12 + type stringWriter interface{ WriteString(string) (int, error) } + + if sw, ok := t.Writer.(stringWriter); ok { + return sw.WriteString(s) + } + + // This path frequently taken since thrift.TBinaryProtocol calls + // WriteString a lot, but fragmentingWriter does not implement WriteString; + // furthermore it is difficult to add a dual WriteString path to + // fragmentingWriter, since hash checksumming does not accept strings. + // + // Without this, io.WriteString ends up allocating every time. + b := append(t.strBuf[:0], s...) + t.strBuf = b[:0] + return t.Writer.Write(b) +} + +// RemainingBytes returns the max number of bytes (same as Thrift's StreamTransport) as we +// do not know how many bytes we have left. +func (t *readWriterTransport) RemainingBytes() uint64 { + const maxSize = ^uint64(0) + return maxSize +} + +var _ thrift.TRichTransport = &readWriterTransport{} + +type thriftProtocol struct { + transport *readWriterTransport + protocol *thrift.TBinaryProtocol +} + +var thriftProtocolPool = sync.Pool{ + New: func() interface{} { + transport := &readWriterTransport{} + protocol := thrift.NewTBinaryProtocolTransport(transport) + return &thriftProtocol{transport, protocol} + }, +} + +func getProtocolWriter(writer io.Writer) *thriftProtocol { + wp := thriftProtocolPool.Get().(*thriftProtocol) + wp.transport.Reader = nil + wp.transport.Writer = writer + return wp +} + +func getProtocolReader(reader io.Reader) *thriftProtocol { + wp := thriftProtocolPool.Get().(*thriftProtocol) + wp.transport.Reader = reader + wp.transport.Writer = nil + return wp +} diff --git a/vendor/github.com/uber/tchannel-go/tnet/listener.go b/vendor/github.com/uber/tchannel-go/tnet/listener.go new file mode 100644 index 00000000..c2b4db81 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/tnet/listener.go @@ -0,0 +1,96 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tnet + +import ( + "net" + "sync" +) + +// Wrap returns a new Listener around the provided net.Listener. +// The returned Listener has a guarantee that when Close returns, it will no longer +// accept any new connections. +// See: https://github.com/uber/tchannel-go/issues/141 +func Wrap(l net.Listener) net.Listener { + return &listener{Listener: l, cond: sync.NewCond(&sync.Mutex{})} +} + +// listener wraps a net.Listener and ensures that once Listener.Close returns, +// the underlying socket has been closed. +// +// The default Listener returns from Close before the underlying socket has been closed +// if another goroutine has an active reference (e.g. is in Accept). +// The following can happen: +// Goroutine 1 is running Accept, and is blocked, waiting for epoll +// Goroutine 2 calls Close. It sees an extra reference, and so cannot destroy +// the socket, but instead decrements a reference, marks the connection as closed +// and unblocks epoll. +// Goroutine 2 returns to the caller, makes a new connection. +// The new connection is sent to the socket (since it hasn't been destroyed) +// Goroutine 1 returns from epoll, and accepts the new connection. +// +// To avoid accepting connections after Close, we block Goroutine 2 from returning from Close +// till Accept returns an error to the user. +type listener struct { + net.Listener + + // cond is used signal Close when there are no references to the listener. + cond *sync.Cond + refs int +} + +func (s *listener) incRef() { + s.cond.L.Lock() + s.refs++ + s.cond.L.Unlock() +} + +func (s *listener) decRef() { + s.cond.L.Lock() + s.refs-- + newRefs := s.refs + s.cond.L.Unlock() + if newRefs == 0 { + s.cond.Broadcast() + } +} + +// Accept waits for and returns the next connection to the listener. +func (s *listener) Accept() (net.Conn, error) { + s.incRef() + defer s.decRef() + return s.Listener.Accept() +} + +// Close closes the listener. +// Any blocked Accept operations will be unblocked and return errors. +func (s *listener) Close() error { + if err := s.Listener.Close(); err != nil { + return err + } + + s.cond.L.Lock() + for s.refs > 0 { + s.cond.Wait() + } + s.cond.L.Unlock() + return nil +} diff --git a/vendor/github.com/uber/tchannel-go/tos/tos.go b/vendor/github.com/uber/tchannel-go/tos/tos.go new file mode 100644 index 00000000..0d6389c5 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/tos/tos.go @@ -0,0 +1,77 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tos + +// ToS represents a const value DF, CS3 etc +// Assured Forwarding (x=class, y=drop precedence) (RFC2597) +// Class Selector (RFC 2474) +// IP Precedence (Linux Socket Compat RFC 791 +type ToS uint8 + +// Assured Forwarding (x=class, y=drop precedence) (RFC2597) +// Class Selector (RFC 2474) + +const ( + // CS3 Class Selector 3 + CS3 ToS = 0x18 + // CS4 Class Selector 4 + CS4 ToS = 0x20 + // CS5 Class Selector 5 + CS5 ToS = 0x28 + // CS6 Class Selector 6 + CS6 ToS = 0x30 + // CS7 Class Selector 7 + CS7 ToS = 0x38 + // AF11 Assured Forward 11 + AF11 ToS = 0x0a + // AF12 Assured Forward 11 + AF12 ToS = 0x0c + // AF13 Assured Forward 12 + AF13 ToS = 0x0e + // AF21 Assured Forward 13 + AF21 ToS = 0x12 + // AF22 Assured Forward 21 + AF22 ToS = 0x14 + // AF23 Assured Forward 22 + AF23 ToS = 0x16 + // AF31 Assured Forward 23 + AF31 ToS = 0x1a + // AF32 Assured Forward 31 + AF32 ToS = 0x1c + // AF33 Assured Forward 32 + AF33 ToS = 0x1e + // AF41 Assured Forward 33 + AF41 ToS = 0x22 + // AF42 Assured Forward 41 + AF42 ToS = 0x24 + // AF43 Assured Forward 42 + AF43 ToS = 0x26 + // EF Expedited Forwarding (RFC 3246) + EF ToS = 0x2e + // Lowdelay 10 + Lowdelay ToS = 0x10 + // Throughput 8 + Throughput ToS = 0x08 + // Reliability 4 + Reliability ToS = 0x04 + // Lowcost 2 + Lowcost ToS = 0x02 +) diff --git a/vendor/github.com/uber/tchannel-go/tos/tos_string.go b/vendor/github.com/uber/tchannel-go/tos/tos_string.go new file mode 100644 index 00000000..13e2d4cf --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/tos/tos_string.go @@ -0,0 +1,53 @@ +package tos + +import "fmt" + +var ( + _tosNameToValue map[string]ToS + _tosValueToName = map[ToS]string{ + CS3: "CS3", + CS4: "CS4", + CS5: "CS5", + CS6: "CS6", + CS7: "CS7", + AF11: "AF11", + AF12: "AF12", + AF13: "AF13", + AF21: "AF21", + AF22: "AF22", + AF23: "AF23", + AF31: "AF31", + AF32: "AF32", + AF33: "AF33", + AF41: "AF41", + AF42: "AF42", + AF43: "AF43", + EF: "EF", + Lowdelay: "Lowdelay", + Throughput: "Throughput", + Reliability: "Reliability", + Lowcost: "Lowcost", + } +) + +func init() { + _tosNameToValue = make(map[string]ToS, len(_tosValueToName)) + for tos, tosString := range _tosValueToName { + _tosNameToValue[tosString] = tos + } +} + +// MarshalText implements TextMarshaler from encoding +func (r ToS) MarshalText() ([]byte, error) { + return []byte(_tosValueToName[r]), nil +} + +// UnmarshalText implements TextUnMarshaler from encoding +func (r *ToS) UnmarshalText(data []byte) error { + if v, ok := _tosNameToValue[string(data)]; ok { + *r = v + return nil + } + + return fmt.Errorf("invalid ToS %q", string(data)) +} diff --git a/vendor/github.com/uber/tchannel-go/tracing.go b/vendor/github.com/uber/tchannel-go/tracing.go new file mode 100644 index 00000000..57e90852 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/tracing.go @@ -0,0 +1,288 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "fmt" + "time" + + "github.com/uber/tchannel-go/trand" + "github.com/uber/tchannel-go/typed" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + "golang.org/x/net/context" +) + +// zipkinSpanFormat defines a name for OpenTracing carrier format that tracer may support. +// It is used to extract zipkin-style trace/span IDs from the OpenTracing Span, which are +// otherwise not exposed explicitly. +// NB: the string value is what's actually shared between implementations +const zipkinSpanFormat = "zipkin-span-format" + +// Span is an internal representation of Zipkin-compatible OpenTracing Span. +// It is used as OpenTracing inject/extract Carrier with ZipkinSpanFormat. +type Span struct { + traceID uint64 + parentID uint64 + spanID uint64 + flags byte +} + +var ( + // traceRng is a thread-safe random number generator for generating trace IDs. + traceRng = trand.NewSeeded() + + // emptySpan is returned from CurrentSpan(ctx) when there is no OpenTracing + // Span in ctx, to avoid returning nil. + emptySpan Span +) + +func (s Span) String() string { + return fmt.Sprintf("TraceID=%x,ParentID=%x,SpanID=%x", s.traceID, s.parentID, s.spanID) +} + +func (s *Span) read(r *typed.ReadBuffer) error { + s.spanID = r.ReadUint64() + s.parentID = r.ReadUint64() + s.traceID = r.ReadUint64() + s.flags = r.ReadSingleByte() + return r.Err() +} + +func (s *Span) write(w *typed.WriteBuffer) error { + w.WriteUint64(s.spanID) + w.WriteUint64(s.parentID) + w.WriteUint64(s.traceID) + w.WriteSingleByte(s.flags) + return w.Err() +} + +func (s *Span) initRandom() { + s.traceID = uint64(traceRng.Int63()) + s.spanID = s.traceID + s.parentID = 0 +} + +// TraceID returns the trace id for the entire call graph of requests. Established +// at the outermost edge service and propagated through all calls +func (s Span) TraceID() uint64 { return s.traceID } + +// ParentID returns the id of the parent span in this call graph +func (s Span) ParentID() uint64 { return s.parentID } + +// SpanID returns the id of this specific RPC +func (s Span) SpanID() uint64 { return s.spanID } + +// Flags returns flags bitmap. Interpretation of the bits is up to the tracing system. +func (s Span) Flags() byte { return s.flags } + +type injectableSpan Span + +// SetTraceID sets traceID +func (s *injectableSpan) SetTraceID(traceID uint64) { s.traceID = traceID } + +// SetSpanID sets spanID +func (s *injectableSpan) SetSpanID(spanID uint64) { s.spanID = spanID } + +// SetParentID sets parentID +func (s *injectableSpan) SetParentID(parentID uint64) { s.parentID = parentID } + +// SetFlags sets flags +func (s *injectableSpan) SetFlags(flags byte) { s.flags = flags } + +// initFromOpenTracing initializes injectableSpan fields from an OpenTracing Span, +// assuming the tracing implementation supports Zipkin-style span IDs. +func (s *injectableSpan) initFromOpenTracing(span opentracing.Span) error { + return span.Tracer().Inject(span.Context(), zipkinSpanFormat, s) +} + +// CurrentSpan extracts OpenTracing Span from the Context, and if found tries to +// extract zipkin-style trace/span IDs from it using ZipkinSpanFormat carrier. +// If there is no OpenTracing Span in the Context, an empty span is returned. +func CurrentSpan(ctx context.Context) *Span { + if sp := opentracing.SpanFromContext(ctx); sp != nil { + var injectable injectableSpan + if err := injectable.initFromOpenTracing(sp); err == nil { + span := Span(injectable) + return &span + } + // return empty span on error, instead of possibly a partially filled one + } + return &emptySpan +} + +// startOutboundSpan creates a new tracing span to represent the outbound RPC call. +// If the context already contains a span, it will be used as a parent, otherwise +// a new root span is created. +// +// If the tracer supports Zipkin-style trace IDs, then call.callReq.Tracing is +// initialized with those IDs. Otherwise it is assigned random values. +func (c *Connection) startOutboundSpan(ctx context.Context, serviceName, methodName string, call *OutboundCall, startTime time.Time) opentracing.Span { + var parent opentracing.SpanContext // ok to be nil + if s := opentracing.SpanFromContext(ctx); s != nil { + parent = s.Context() + } + span := c.Tracer().StartSpan( + methodName, + opentracing.ChildOf(parent), + opentracing.StartTime(startTime), + ) + if isTracingDisabled(ctx) { + ext.SamplingPriority.Set(span, 0) + } + ext.SpanKindRPCClient.Set(span) + ext.PeerService.Set(span, serviceName) + c.setPeerHostPort(span) + span.SetTag("as", call.callReq.Headers[ArgScheme]) + var injectable injectableSpan + if err := injectable.initFromOpenTracing(span); err == nil { + call.callReq.Tracing = Span(injectable) + } else { + call.callReq.Tracing.initRandom() + } + return span +} + +// InjectOutboundSpan retrieves OpenTracing Span from `response`, where it is stored +// when the outbound call is initiated. The tracing API is used to serialize the span +// into the application `headers`, which will propagate tracing context to the server. +// Returns modified headers containing serialized tracing context. +// +// Sometimes caller pass a shared instance of the `headers` map, so instead of modifying +// it we clone it into the new map (assuming that Tracer actually injects some tracing keys). +func InjectOutboundSpan(response *OutboundCallResponse, headers map[string]string) map[string]string { + span := response.span + if span == nil { + return headers + } + newHeaders := make(map[string]string) + carrier := tracingHeadersCarrier(newHeaders) + if err := span.Tracer().Inject(span.Context(), opentracing.TextMap, carrier); err != nil { + // Something had to go seriously wrong for Inject to fail, usually a setup problem. + // A good Tracer implementation may also emit a metric. + response.log.WithFields(ErrField(err)).Error("Failed to inject tracing span.") + } + if len(newHeaders) == 0 { + return headers // Tracer did not add any tracing headers, so return the original map + } + for k, v := range headers { + // Some applications propagate all inbound application headers to outbound calls (issue #682). + // If those headers include tracing headers we want to make sure to keep the new tracing headers. + if _, ok := newHeaders[k]; !ok { + newHeaders[k] = v + } + } + return newHeaders +} + +// extractInboundSpan attempts to create a new OpenTracing Span for inbound request +// using only trace IDs stored in the frame's tracing field. It only works if the +// tracer understand Zipkin-style trace IDs. If such attempt fails, another attempt +// will be made from the higher level function ExtractInboundSpan() once the +// application headers are read from the wire. +func (c *Connection) extractInboundSpan(callReq *callReq) opentracing.Span { + spanCtx, err := c.Tracer().Extract(zipkinSpanFormat, &callReq.Tracing) + if err != nil { + if err != opentracing.ErrUnsupportedFormat && err != opentracing.ErrSpanContextNotFound { + c.log.WithFields(ErrField(err)).Error("Failed to extract Zipkin-style span.") + } + return nil + } + if spanCtx == nil { + return nil + } + operationName := "" // not known at this point, will be set later + span := c.Tracer().StartSpan(operationName, ext.RPCServerOption(spanCtx)) + span.SetTag("as", callReq.Headers[ArgScheme]) + ext.PeerService.Set(span, callReq.Headers[CallerName]) + c.setPeerHostPort(span) + return span +} + +// ExtractInboundSpan is a higher level version of extractInboundSpan(). +// If the lower-level attempt to create a span from incoming request was +// successful (e.g. when then Tracer supports Zipkin-style trace IDs), +// then the application headers are only used to read the Baggage and add +// it to the existing span. Otherwise, the standard OpenTracing API supported +// by all tracers is used to deserialize the tracing context from the +// application headers and start a new server-side span. +// Once the span is started, it is wrapped in a new Context, which is returned. +func ExtractInboundSpan(ctx context.Context, call *InboundCall, headers map[string]string, tracer opentracing.Tracer) context.Context { + var span = call.Response().span + if span != nil { + if headers != nil { + // extract SpanContext from headers, but do not start another span with it, + // just get the baggage and copy to the already created span + carrier := tracingHeadersCarrier(headers) + if sc, err := tracer.Extract(opentracing.TextMap, carrier); err == nil { + sc.ForeachBaggageItem(func(k, v string) bool { + span.SetBaggageItem(k, v) + return true + }) + } + carrier.RemoveTracingKeys() + } + } else { + var parent opentracing.SpanContext + if headers != nil { + carrier := tracingHeadersCarrier(headers) + if p, err := tracer.Extract(opentracing.TextMap, carrier); err == nil { + parent = p + } + carrier.RemoveTracingKeys() + } + span = tracer.StartSpan(call.MethodString(), ext.RPCServerOption(parent)) + ext.PeerService.Set(span, call.CallerName()) + span.SetTag("as", string(call.Format())) + call.conn.setPeerHostPort(span) + call.Response().span = span + } + return opentracing.ContextWithSpan(ctx, span) +} + +func (c *Connection) setPeerHostPort(span opentracing.Span) { + if c.remotePeerAddress.ipv4 != 0 { + ext.PeerHostIPv4.Set(span, c.remotePeerAddress.ipv4) + } + if c.remotePeerAddress.ipv6 != "" { + ext.PeerHostIPv6.Set(span, c.remotePeerAddress.ipv6) + } + if c.remotePeerAddress.hostname != "" { + ext.PeerHostname.Set(span, c.remotePeerAddress.hostname) + } + if c.remotePeerAddress.port != 0 { + ext.PeerPort.Set(span, c.remotePeerAddress.port) + } +} + +type tracerProvider interface { + Tracer() opentracing.Tracer +} + +// TracerFromRegistrar returns an OpenTracing Tracer embedded in the Registrar, +// assuming that Registrar has a Tracer() method. Otherwise it returns default Global Tracer. +func TracerFromRegistrar(registrar Registrar) opentracing.Tracer { + if tracerProvider, ok := registrar.(tracerProvider); ok { + return tracerProvider.Tracer() + } + return opentracing.GlobalTracer() +} diff --git a/vendor/github.com/uber/tchannel-go/tracing_keys.go b/vendor/github.com/uber/tchannel-go/tracing_keys.go new file mode 100644 index 00000000..bab67b05 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/tracing_keys.go @@ -0,0 +1,103 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +import ( + "strings" + "sync" +) + +// tracingKeyPrefix is used to prefix all keys used by the OpenTracing Tracer to represent +// its trace context and baggage. The prefixing is done in order to distinguish tracing +// headers from the actual application headers and to hide the former from the user code. +const tracingKeyPrefix = "$tracing$" + +// tracingKeyMappingSize is the maximum number of tracing key mappings we cache. +const tracingKeyMappingSize = 100 + +type tracingKeysMapping struct { + sync.RWMutex + mapping map[string]string + mapper func(key string) string +} + +var tracingKeyEncoding = &tracingKeysMapping{ + mapping: make(map[string]string), + mapper: func(key string) string { + return tracingKeyPrefix + key + }, +} + +var tracingKeyDecoding = &tracingKeysMapping{ + mapping: make(map[string]string), + mapper: func(key string) string { + return key[len(tracingKeyPrefix):] + }, +} + +func (m *tracingKeysMapping) mapAndCache(key string) string { + m.RLock() + v, ok := m.mapping[key] + m.RUnlock() + if ok { + return v + } + m.Lock() + defer m.Unlock() + if v, ok := m.mapping[key]; ok { + return v + } + mappedKey := m.mapper(key) + if len(m.mapping) < tracingKeyMappingSize { + m.mapping[key] = mappedKey + } + return mappedKey +} + +type tracingHeadersCarrier map[string]string + +// Set implements Set() of opentracing.TextMapWriter +func (c tracingHeadersCarrier) Set(key, val string) { + prefixedKey := tracingKeyEncoding.mapAndCache(key) + c[prefixedKey] = val +} + +// ForeachKey conforms to the TextMapReader interface. +func (c tracingHeadersCarrier) ForeachKey(handler func(key, val string) error) error { + for k, v := range c { + if !strings.HasPrefix(k, tracingKeyPrefix) { + continue + } + noPrefixKey := tracingKeyDecoding.mapAndCache(k) + if err := handler(noPrefixKey, v); err != nil { + return err + } + } + return nil +} + +func (c tracingHeadersCarrier) RemoveTracingKeys() { + for key := range c { + if strings.HasPrefix(key, tracingKeyPrefix) { + delete(c, key) + } + } +} diff --git a/vendor/github.com/uber/tchannel-go/trand/rand.go b/vendor/github.com/uber/tchannel-go/trand/rand.go new file mode 100644 index 00000000..40feaf10 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/trand/rand.go @@ -0,0 +1,61 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package trand provides a thread-safe random number generator. +package trand + +import ( + "math/rand" + "sync" + "time" +) + +// lockedSource allows a random number generator to be used by multiple goroutines +// concurrently. The code is very similar to math/rand.lockedSource, which is +// unfortunately not exposed. +type lockedSource struct { + sync.Mutex + + src rand.Source +} + +// New returns a rand.Rand that is threadsafe. +func New(seed int64) *rand.Rand { + return rand.New(&lockedSource{src: rand.NewSource(seed)}) +} + +// NewSeeded returns a rand.Rand that's threadsafe and seeded with the current +// time. +func NewSeeded() *rand.Rand { + return New(time.Now().UnixNano()) +} + +func (r *lockedSource) Int63() (n int64) { + r.Lock() + n = r.src.Int63() + r.Unlock() + return +} + +func (r *lockedSource) Seed(seed int64) { + r.Lock() + r.src.Seed(seed) + r.Unlock() +} diff --git a/vendor/github.com/uber/tchannel-go/typed/buffer.go b/vendor/github.com/uber/tchannel-go/typed/buffer.go new file mode 100644 index 00000000..afdba30e --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/typed/buffer.go @@ -0,0 +1,434 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package typed + +import ( + "encoding/binary" + "errors" + "io" +) + +var ( + // ErrEOF is returned when trying to read past end of buffer + ErrEOF = errors.New("buffer is too small") + + // ErrBufferFull is returned when trying to write past end of buffer + ErrBufferFull = errors.New("no more room in buffer") + + // errStringTooLong is returned when writing a string with length larger + // than the allows length limit. Intentionally not exported, in case we + // want to add more context in future. + errStringTooLong = errors.New("string is too long") +) + +// A ReadBuffer is a wrapper around an underlying []byte with methods to read from +// that buffer in big-endian format. +type ReadBuffer struct { + buffer []byte + remaining []byte + err error +} + +// NewReadBuffer returns a ReadBuffer wrapping a byte slice +func NewReadBuffer(buffer []byte) *ReadBuffer { + return &ReadBuffer{buffer: buffer, remaining: buffer} +} + +// NewReadBufferWithSize returns a ReadBuffer with a given capacity +func NewReadBufferWithSize(size int) *ReadBuffer { + return &ReadBuffer{buffer: make([]byte, size), remaining: nil} +} + +// ReadSingleByte reads the next byte from the buffer +func (r *ReadBuffer) ReadSingleByte() byte { + b, _ := r.ReadByte() + return b +} + +// ReadByte returns the next byte from the buffer. +func (r *ReadBuffer) ReadByte() (byte, error) { + if r.err != nil { + return 0, r.err + } + + if len(r.remaining) < 1 { + r.err = ErrEOF + return 0, r.err + } + + b := r.remaining[0] + r.remaining = r.remaining[1:] + return b, nil +} + +// ReadBytes returns the next n bytes from the buffer +func (r *ReadBuffer) ReadBytes(n int) []byte { + if r.err != nil { + return nil + } + + if len(r.remaining) < n { + r.err = ErrEOF + return nil + } + + b := r.remaining[0:n] + r.remaining = r.remaining[n:] + return b +} + +// ReadString returns a string of size n from the buffer +func (r *ReadBuffer) ReadString(n int) string { + if b := r.ReadBytes(n); b != nil { + // TODO(mmihic): This creates a copy, which sucks + return string(b) + } + + return "" +} + +// ReadUint16 returns the next value in the buffer as a uint16 +func (r *ReadBuffer) ReadUint16() uint16 { + if b := r.ReadBytes(2); b != nil { + return binary.BigEndian.Uint16(b) + } + + return 0 +} + +// ReadUint32 returns the next value in the buffer as a uint32 +func (r *ReadBuffer) ReadUint32() uint32 { + if b := r.ReadBytes(4); b != nil { + return binary.BigEndian.Uint32(b) + } + + return 0 +} + +// ReadUint64 returns the next value in the buffer as a uint64 +func (r *ReadBuffer) ReadUint64() uint64 { + if b := r.ReadBytes(8); b != nil { + return binary.BigEndian.Uint64(b) + } + + return 0 +} + +// ReadUvarint reads an unsigned varint from the buffer. +func (r *ReadBuffer) ReadUvarint() uint64 { + v, _ := binary.ReadUvarint(r) + return v +} + +// ReadLen8String reads an 8-bit length preceded string value +func (r *ReadBuffer) ReadLen8String() string { + n := r.ReadSingleByte() + return r.ReadString(int(n)) +} + +// ReadLen16String reads a 16-bit length preceded string value +func (r *ReadBuffer) ReadLen16String() string { + n := r.ReadUint16() + return r.ReadString(int(n)) +} + +// BytesRemaining returns the number of unconsumed bytes remaining in the buffer +func (r *ReadBuffer) BytesRemaining() int { + return len(r.remaining) +} + +// FillFrom fills the buffer from a reader +func (r *ReadBuffer) FillFrom(ior io.Reader, n int) (int, error) { + if len(r.buffer) < n { + return 0, ErrEOF + } + + r.err = nil + r.remaining = r.buffer[:n] + return io.ReadFull(ior, r.remaining) +} + +// Wrap initializes the buffer to read from the given byte slice +func (r *ReadBuffer) Wrap(b []byte) { + r.buffer = b + r.remaining = b + r.err = nil +} + +// Err returns the error in the ReadBuffer +func (r *ReadBuffer) Err() error { return r.err } + +// A WriteBuffer is a wrapper around an underlying []byte with methods to write to +// that buffer in big-endian format. The buffer is of fixed size, and does not grow. +type WriteBuffer struct { + buffer []byte + remaining []byte + err error +} + +// NewWriteBuffer creates a WriteBuffer wrapping the given slice +func NewWriteBuffer(buffer []byte) *WriteBuffer { + return &WriteBuffer{buffer: buffer, remaining: buffer} +} + +// NewWriteBufferWithSize create a new WriteBuffer using an internal buffer of the given size +func NewWriteBufferWithSize(size int) *WriteBuffer { + return NewWriteBuffer(make([]byte, size)) +} + +// WriteSingleByte writes a single byte to the buffer +func (w *WriteBuffer) WriteSingleByte(n byte) { + if w.err != nil { + return + } + + if len(w.remaining) == 0 { + w.setErr(ErrBufferFull) + return + } + + w.remaining[0] = n + w.remaining = w.remaining[1:] +} + +// WriteBytes writes a slice of bytes to the buffer +func (w *WriteBuffer) WriteBytes(in []byte) { + if b := w.reserve(len(in)); b != nil { + copy(b, in) + } +} + +// WriteUint16 writes a big endian encoded uint16 value to the buffer +func (w *WriteBuffer) WriteUint16(n uint16) { + if b := w.reserve(2); b != nil { + binary.BigEndian.PutUint16(b, n) + } +} + +// WriteUint32 writes a big endian uint32 value to the buffer +func (w *WriteBuffer) WriteUint32(n uint32) { + if b := w.reserve(4); b != nil { + binary.BigEndian.PutUint32(b, n) + } +} + +// WriteUint64 writes a big endian uint64 to the buffer +func (w *WriteBuffer) WriteUint64(n uint64) { + if b := w.reserve(8); b != nil { + binary.BigEndian.PutUint64(b, n) + } +} + +// WriteUvarint writes an unsigned varint to the buffer +func (w *WriteBuffer) WriteUvarint(n uint64) { + // A uvarint could be up to 10 bytes long. + buf := make([]byte, 10) + varBytes := binary.PutUvarint(buf, n) + if b := w.reserve(varBytes); b != nil { + copy(b, buf[0:varBytes]) + } +} + +// WriteString writes a string to the buffer +func (w *WriteBuffer) WriteString(s string) { + // NB(mmihic): Don't just call WriteBytes; that will make a double copy + // of the string due to the cast + if b := w.reserve(len(s)); b != nil { + copy(b, s) + } +} + +// WriteLen8String writes an 8-bit length preceded string +func (w *WriteBuffer) WriteLen8String(s string) { + if int(byte(len(s))) != len(s) { + w.setErr(errStringTooLong) + } + + w.WriteSingleByte(byte(len(s))) + w.WriteString(s) +} + +// WriteLen16String writes a 16-bit length preceded string +func (w *WriteBuffer) WriteLen16String(s string) { + if int(uint16(len(s))) != len(s) { + w.setErr(errStringTooLong) + } + + w.WriteUint16(uint16(len(s))) + w.WriteString(s) +} + +// DeferByte reserves space in the buffer for a single byte, and returns a +// reference that can be used to update that byte later +func (w *WriteBuffer) DeferByte() ByteRef { + if len(w.remaining) == 0 { + w.setErr(ErrBufferFull) + return ByteRef(nil) + } + + // Always zero out references, since the caller expects the default to be 0. + w.remaining[0] = 0 + bufRef := ByteRef(w.remaining[0:]) + w.remaining = w.remaining[1:] + return bufRef +} + +// DeferUint16 reserves space in the buffer for a uint16, and returns a +// reference that can be used to update that uint16 +func (w *WriteBuffer) DeferUint16() Uint16Ref { + return Uint16Ref(w.deferred(2)) +} + +// DeferUint32 reserves space in the buffer for a uint32, and returns a +// reference that can be used to update that uint32 +func (w *WriteBuffer) DeferUint32() Uint32Ref { + return Uint32Ref(w.deferred(4)) +} + +// DeferUint64 reserves space in the buffer for a uint64, and returns a +// reference that can be used to update that uint64 +func (w *WriteBuffer) DeferUint64() Uint64Ref { + return Uint64Ref(w.deferred(8)) +} + +// DeferBytes reserves space in the buffer for a fixed sequence of bytes, and +// returns a reference that can be used to update those bytes +func (w *WriteBuffer) DeferBytes(n int) BytesRef { + return BytesRef(w.deferred(n)) +} + +func (w *WriteBuffer) deferred(n int) []byte { + bs := w.reserve(n) + for i := range bs { + bs[i] = 0 + } + return bs +} + +func (w *WriteBuffer) reserve(n int) []byte { + if w.err != nil { + return nil + } + + if len(w.remaining) < n { + w.setErr(ErrBufferFull) + return nil + } + + b := w.remaining[0:n] + w.remaining = w.remaining[n:] + return b +} + +// BytesRemaining returns the number of available bytes remaining in the bufffer +func (w *WriteBuffer) BytesRemaining() int { + return len(w.remaining) +} + +// FlushTo flushes the written buffer to the given writer +func (w *WriteBuffer) FlushTo(iow io.Writer) (int, error) { + dirty := w.buffer[0:w.BytesWritten()] + return iow.Write(dirty) +} + +// BytesWritten returns the number of bytes that have been written to the buffer +func (w *WriteBuffer) BytesWritten() int { return len(w.buffer) - len(w.remaining) } + +// Reset resets the buffer to an empty state, ready for writing +func (w *WriteBuffer) Reset() { + w.remaining = w.buffer + w.err = nil +} + +func (w *WriteBuffer) setErr(err error) { + // Only store the first error + if w.err != nil { + return + } + + w.err = err +} + +// Err returns the current error in the buffer +func (w *WriteBuffer) Err() error { return w.err } + +// Wrap initializes the buffer to wrap the given byte slice +func (w *WriteBuffer) Wrap(b []byte) { + w.buffer = b + w.remaining = b +} + +// A ByteRef is a reference to a byte in a bufffer +type ByteRef []byte + +// Update updates the byte in the buffer +func (ref ByteRef) Update(b byte) { + if ref != nil { + ref[0] = b + } +} + +// A Uint16Ref is a reference to a uint16 placeholder in a buffer +type Uint16Ref []byte + +// Update updates the uint16 in the buffer +func (ref Uint16Ref) Update(n uint16) { + if ref != nil { + binary.BigEndian.PutUint16(ref, n) + } +} + +// A Uint32Ref is a reference to a uint32 placeholder in a buffer +type Uint32Ref []byte + +// Update updates the uint32 in the buffer +func (ref Uint32Ref) Update(n uint32) { + if ref != nil { + binary.BigEndian.PutUint32(ref, n) + } +} + +// A Uint64Ref is a reference to a uin64 placeholder in a buffer +type Uint64Ref []byte + +// Update updates the uint64 in the buffer +func (ref Uint64Ref) Update(n uint64) { + if ref != nil { + binary.BigEndian.PutUint64(ref, n) + } +} + +// A BytesRef is a reference to a multi-byte placeholder in a buffer +type BytesRef []byte + +// Update updates the bytes in the buffer +func (ref BytesRef) Update(b []byte) { + if ref != nil { + copy(ref, b) + } +} + +// UpdateString updates the bytes in the buffer from a string +func (ref BytesRef) UpdateString(s string) { + if ref != nil { + copy(ref, s) + } +} diff --git a/vendor/github.com/uber/tchannel-go/typed/reader.go b/vendor/github.com/uber/tchannel-go/typed/reader.go new file mode 100644 index 00000000..054861d3 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/typed/reader.go @@ -0,0 +1,105 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package typed + +import ( + "encoding/binary" + "io" + "sync" +) + +const maxPoolStringLen = 32 + +// Reader is a reader that reads typed values from an io.Reader. +type Reader struct { + reader io.Reader + err error + buf [maxPoolStringLen]byte +} + +var readerPool = sync.Pool{ + New: func() interface{} { + return &Reader{} + }, +} + +// NewReader returns a reader that reads typed values from the reader. +func NewReader(reader io.Reader) *Reader { + r := readerPool.Get().(*Reader) + r.reader = reader + r.err = nil + return r +} + +// ReadUint16 reads a uint16. +func (r *Reader) ReadUint16() uint16 { + if r.err != nil { + return 0 + } + + buf := r.buf[:2] + + var readN int + readN, r.err = io.ReadFull(r.reader, buf) + if readN < 2 { + return 0 + } + return binary.BigEndian.Uint16(buf) +} + +// ReadString reads a string of length n. +func (r *Reader) ReadString(n int) string { + if r.err != nil { + return "" + } + + var buf []byte + if n <= maxPoolStringLen { + buf = r.buf[:n] + } else { + buf = make([]byte, n) + } + + var readN int + readN, r.err = io.ReadFull(r.reader, buf) + if readN < n { + return "" + } + s := string(buf) + + return s +} + +// ReadLen16String reads a uint16-length prefixed string. +func (r *Reader) ReadLen16String() string { + len := r.ReadUint16() + return r.ReadString(int(len)) +} + +// Err returns any errors hit while reading from the underlying reader. +func (r *Reader) Err() error { + return r.err +} + +// Release puts the Reader back in the pool. +func (r *Reader) Release() { + readerPool.Put(r) +} diff --git a/vendor/github.com/uber/tchannel-go/version.go b/vendor/github.com/uber/tchannel-go/version.go new file mode 100644 index 00000000..3564f554 --- /dev/null +++ b/vendor/github.com/uber/tchannel-go/version.go @@ -0,0 +1,26 @@ +// Copyright (c) 2015 Uber Technologies, Inc. + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tchannel + +// VersionInfo identifies the version of the TChannel library. +// Due to lack of proper package management, this version string will +// be maintained manually. +const VersionInfo = "1.14.0" diff --git a/vendor/github.com/ugorji/go/codec/xml.go b/vendor/github.com/ugorji/go/codec/xml.go deleted file mode 100644 index 63fcdfca..00000000 --- a/vendor/github.com/ugorji/go/codec/xml.go +++ /dev/null @@ -1,502 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build ignore - -package codec - -/* - -A strict Non-validating namespace-aware XML 1.0 parser and (en|de)coder. - -We are attempting this due to perceived issues with encoding/xml: - - Complicated. It tried to do too much, and is not as simple to use as json. - - Due to over-engineering, reflection is over-used AND performance suffers: - java is 6X faster:http://fabsk.eu/blog/category/informatique/dev/golang/ - even PYTHON performs better: http://outgoing.typepad.com/outgoing/2014/07/exploring-golang.html - -codec framework will offer the following benefits - - VASTLY improved performance (when using reflection-mode or codecgen) - - simplicity and consistency: with the rest of the supported formats - - all other benefits of codec framework (streaming, codegeneration, etc) - -codec is not a drop-in replacement for encoding/xml. -It is a replacement, based on the simplicity and performance of codec. -Look at it like JAXB for Go. - -Challenges: - - Need to output XML preamble, with all namespaces at the right location in the output. - - Each "end" block is dynamic, so we need to maintain a context-aware stack - - How to decide when to use an attribute VS an element - - How to handle chardata, attr, comment EXPLICITLY. - - Should it output fragments? - e.g. encoding a bool should just output true OR false, which is not well-formed XML. - -Extend the struct tag. See representative example: - type X struct { - ID uint8 `codec:"http://ugorji.net/x-namespace xid id,omitempty,toarray,attr,cdata"` - // format: [namespace-uri ][namespace-prefix ]local-name, ... - } - -Based on this, we encode - - fields as elements, BUT - encode as attributes if struct tag contains ",attr" and is a scalar (bool, number or string) - - text as entity-escaped text, BUT encode as CDATA if struct tag contains ",cdata". - -To handle namespaces: - - XMLHandle is denoted as being namespace-aware. - Consequently, we WILL use the ns:name pair to encode and decode if defined, else use the plain name. - - *Encoder and *Decoder know whether the Handle "prefers" namespaces. - - add *Encoder.getEncName(*structFieldInfo). - No one calls *structFieldInfo.indexForEncName directly anymore - - OR better yet: indexForEncName is namespace-aware, and helper.go is all namespace-aware - indexForEncName takes a parameter of the form namespace:local-name OR local-name - - add *Decoder.getStructFieldInfo(encName string) // encName here is either like abc, or h1:nsabc - by being a method on *Decoder, or maybe a method on the Handle itself. - No one accesses .encName anymore - - let encode.go and decode.go use these (for consistency) - - only problem exists for gen.go, where we create a big switch on encName. - Now, we also have to add a switch on strings.endsWith(kName, encNsName) - - gen.go will need to have many more methods, and then double-on the 2 switch loops like: - switch k { - case "abc" : x.abc() - case "def" : x.def() - default { - switch { - case !nsAware: panic(...) - case strings.endsWith(":abc"): x.abc() - case strings.endsWith(":def"): x.def() - default: panic(...) - } - } - } - -The structure below accommodates this: - - type typeInfo struct { - sfi []*structFieldInfo // sorted by encName - sfins // sorted by namespace - sfia // sorted, to have those with attributes at the top. Needed to write XML appropriately. - sfip // unsorted - } - type structFieldInfo struct { - encName - nsEncName - ns string - attr bool - cdata bool - } - -indexForEncName is now an internal helper function that takes a sorted array -(one of ti.sfins or ti.sfi). It is only used by *Encoder.getStructFieldInfo(...) - -There will be a separate parser from the builder. -The parser will have a method: next() xmlToken method. It has lookahead support, -so you can pop multiple tokens, make a determination, and push them back in the order popped. -This will be needed to determine whether we are "nakedly" decoding a container or not. -The stack will be implemented using a slice and push/pop happens at the [0] element. - -xmlToken has fields: - - type uint8: 0 | ElementStart | ElementEnd | AttrKey | AttrVal | Text - - value string - - ns string - -SEE: http://www.xml.com/pub/a/98/10/guide0.html?page=3#ENTDECL - -The following are skipped when parsing: - - External Entities (from external file) - - Notation Declaration e.g. - - Entity Declarations & References - - XML Declaration (assume UTF-8) - - XML Directive i.e. - - Other Declarations: Notation, etc. - - Comment - - Processing Instruction - - schema / DTD for validation: - We are not a VALIDATING parser. Validation is done elsewhere. - However, some parts of the DTD internal subset are used (SEE BELOW). - For Attribute List Declarations e.g. - - We considered using the ATTLIST to get "default" value, but not to validate the contents. (VETOED) - -The following XML features are supported - - Namespace - - Element - - Attribute - - cdata - - Unicode escape - -The following DTD (when as an internal sub-set) features are supported: - - Internal Entities e.g. - AND entities for the set: [<>&"'] - - Parameter entities e.g. - - -At decode time, a structure containing the following is kept - - namespace mapping - - default attribute values - - all internal entities (<>&"' and others written in the document) - -When decode starts, it parses XML namespace declarations and creates a map in the -xmlDecDriver. While parsing, that map continuously gets updated. -The only problem happens when a namespace declaration happens on the node that it defines. -e.g. -To handle this, each Element must be fully parsed at a time, -even if it amounts to multiple tokens which are returned one at a time on request. - -xmlns is a special attribute name. - - It is used to define namespaces, including the default - - It is never returned as an AttrKey or AttrVal. - *We may decide later to allow user to use it e.g. you want to parse the xmlns mappings into a field.* - -Number, bool, null, mapKey, etc can all be decoded from any xmlToken. -This accommodates map[int]string for example. - -It should be possible to create a schema from the types, -or vice versa (generate types from schema with appropriate tags). -This is however out-of-scope from this parsing project. - -We should write all namespace information at the first point that it is referenced in the tree, -and use the mapping for all child nodes and attributes. This means that state is maintained -at a point in the tree. This also means that calls to Decode or MustDecode will reset some state. - -When decoding, it is important to keep track of entity references and default attribute values. -It seems these can only be stored in the DTD components. We should honor them when decoding. - -Configuration for XMLHandle will look like this: - - XMLHandle - DefaultNS string - // Encoding: - NS map[string]string // ns URI to key, used for encoding - // Decoding: in case ENTITY declared in external schema or dtd, store info needed here - Entities map[string]string // map of entity rep to character - - -During encode, if a namespace mapping is not defined for a namespace found on a struct, -then we create a mapping for it using nsN (where N is 1..1000000, and doesn't conflict -with any other namespace mapping). - -Note that different fields in a struct can have different namespaces. -However, all fields will default to the namespace on the _struct field (if defined). - -An XML document is a name, a map of attributes and a list of children. -Consequently, we cannot "DecodeNaked" into a map[string]interface{} (for example). -We have to "DecodeNaked" into something that resembles XML data. - -To support DecodeNaked (decode into nil interface{}), we have to define some "supporting" types: - type Name struct { // Preferred. Less allocations due to conversions. - Local string - Space string - } - type Element struct { - Name Name - Attrs map[Name]string - Children []interface{} // each child is either *Element or string - } -Only two "supporting" types are exposed for XML: Name and Element. - -// ------------------ - -We considered 'type Name string' where Name is like "Space Local" (space-separated). -We decided against it, because each creation of a name would lead to -double allocation (first convert []byte to string, then concatenate them into a string). -The benefit is that it is faster to read Attrs from a map. But given that Element is a value -object, we want to eschew methods and have public exposed variables. - -We also considered the following, where xml types were not value objects, and we used -intelligent accessor methods to extract information and for performance. -*** WE DECIDED AGAINST THIS. *** - type Attr struct { - Name Name - Value string - } - // Element is a ValueObject: There are no accessor methods. - // Make element self-contained. - type Element struct { - Name Name - attrsMap map[string]string // where key is "Space Local" - attrs []Attr - childrenT []string - childrenE []Element - childrenI []int // each child is a index into T or E. - } - func (x *Element) child(i) interface{} // returns string or *Element - -// ------------------ - -Per XML spec and our default handling, white space is always treated as -insignificant between elements, except in a text node. The xml:space='preserve' -attribute is ignored. - -**Note: there is no xml: namespace. The xml: attributes were defined before namespaces.** -**So treat them as just "directives" that should be interpreted to mean something**. - -On encoding, we support indenting aka prettifying markup in the same way we support it for json. - -A document or element can only be encoded/decoded from/to a struct. In this mode: - - struct name maps to element name (or tag-info from _struct field) - - fields are mapped to child elements or attributes - -A map is either encoded as attributes on current element, or as a set of child elements. -Maps are encoded as attributes iff their keys and values are primitives (number, bool, string). - -A list is encoded as a set of child elements. - -Primitives (number, bool, string) are encoded as an element, attribute or text -depending on the context. - -Extensions must encode themselves as a text string. - -Encoding is tough, specifically when encoding mappings, because we need to encode -as either attribute or element. To do this, we need to default to encoding as attributes, -and then let Encoder inform the Handle when to start encoding as nodes. -i.e. Encoder does something like: - - h.EncodeMapStart() - h.Encode(), h.Encode(), ... - h.EncodeMapNotAttrSignal() // this is not a bool, because it's a signal - h.Encode(), h.Encode(), ... - h.EncodeEnd() - -Only XMLHandle understands this, and will set itself to start encoding as elements. - -This support extends to maps. For example, if a struct field is a map, and it has -the struct tag signifying it should be attr, then all its fields are encoded as attributes. -e.g. - - type X struct { - M map[string]int `codec:"m,attr"` // encode keys as attributes named - } - -Question: - - if encoding a map, what if map keys have spaces in them??? - Then they cannot be attributes or child elements. Error. - -Options to consider adding later: - - For attribute values, normalize by trimming beginning and ending white space, - and converting every white space sequence to a single space. - - ATTLIST restrictions are enforced. - e.g. default value of xml:space, skipping xml:XYZ style attributes, etc. - - Consider supporting NON-STRICT mode (e.g. to handle HTML parsing). - Some elements e.g. br, hr, etc need not close and should be auto-closed - ... (see http://www.w3.org/TR/html4/loose.dtd) - An expansive set of entities are pre-defined. - - Have easy way to create a HTML parser: - add a HTML() method to XMLHandle, that will set Strict=false, specify AutoClose, - and add HTML Entities to the list. - - Support validating element/attribute XMLName before writing it. - Keep this behind a flag, which is set to false by default (for performance). - type XMLHandle struct { - CheckName bool - } - -Misc: - -ROADMAP (1 weeks): - - build encoder (1 day) - - build decoder (based off xmlParser) (1 day) - - implement xmlParser (2 days). - Look at encoding/xml for inspiration. - - integrate and TEST (1 days) - - write article and post it (1 day) - -// ---------- MORE NOTES FROM 2017-11-30 ------------ - -when parsing -- parse the attributes first -- then parse the nodes - -basically: -- if encoding a field: we use the field name for the wrapper -- if encoding a non-field, then just use the element type name - - map[string]string ==> abcval... or - val... OR - val1val2... <- PREFERED - []string ==> v1v2... - string v1 ==> v1 - bool true ==> true - float 1.0 ==> 1.0 - ... - - F1 map[string]string ==> abcval... OR - val... OR - val... <- PREFERED - F2 []string ==> v1v2... - F3 bool ==> true - ... - -- a scalar is encoded as: - (value) of type T ==> - (value) of field F ==> -- A kv-pair is encoded as: - (key,value) ==> OR - (key,value) of field F ==> OR -- A map or struct is just a list of kv-pairs -- A list is encoded as sequences of same node e.g. - - - value21 - value22 -- we may have to singularize the field name, when entering into xml, - and pluralize them when encoding. -- bi-directional encode->decode->encode is not a MUST. - even encoding/xml cannot decode correctly what was encoded: - - see https://play.golang.org/p/224V_nyhMS - func main() { - fmt.Println("Hello, playground") - v := []interface{}{"hello", 1, true, nil, time.Now()} - s, err := xml.Marshal(v) - fmt.Printf("err: %v, \ns: %s\n", err, s) - var v2 []interface{} - err = xml.Unmarshal(s, &v2) - fmt.Printf("err: %v, \nv2: %v\n", err, v2) - type T struct { - V []interface{} - } - v3 := T{V: v} - s, err = xml.Marshal(v3) - fmt.Printf("err: %v, \ns: %s\n", err, s) - var v4 T - err = xml.Unmarshal(s, &v4) - fmt.Printf("err: %v, \nv4: %v\n", err, v4) - } - Output: - err: , - s: hello1true - err: , - v2: [] - err: , - s: hello1true2009-11-10T23:00:00Z - err: , - v4: {[ ]} -- -*/ - -// ----------- PARSER ------------------- - -type xmlTokenType uint8 - -const ( - _ xmlTokenType = iota << 1 - xmlTokenElemStart - xmlTokenElemEnd - xmlTokenAttrKey - xmlTokenAttrVal - xmlTokenText -) - -type xmlToken struct { - Type xmlTokenType - Value string - Namespace string // blank for AttrVal and Text -} - -type xmlParser struct { - r decReader - toks []xmlToken // list of tokens. - ptr int // ptr into the toks slice - done bool // nothing else to parse. r now returns EOF. -} - -func (x *xmlParser) next() (t *xmlToken) { - // once x.done, or x.ptr == len(x.toks) == 0, then return nil (to signify finish) - if !x.done && len(x.toks) == 0 { - x.nextTag() - } - // parses one element at a time (into possible many tokens) - if x.ptr < len(x.toks) { - t = &(x.toks[x.ptr]) - x.ptr++ - if x.ptr == len(x.toks) { - x.ptr = 0 - x.toks = x.toks[:0] - } - } - return -} - -// nextTag will parses the next element and fill up toks. -// It set done flag if/once EOF is reached. -func (x *xmlParser) nextTag() { - // ... -} - -// ----------- ENCODER ------------------- - -type xmlEncDriver struct { - e *Encoder - w encWriter - h *XMLHandle - b [64]byte // scratch - bs []byte // scratch - // s jsonStack - noBuiltInTypes -} - -// ----------- DECODER ------------------- - -type xmlDecDriver struct { - d *Decoder - h *XMLHandle - r decReader // *bytesDecReader decReader - ct valueType // container type. one of unset, array or map. - bstr [8]byte // scratch used for string \UXXX parsing - b [64]byte // scratch - - // wsSkipped bool // whitespace skipped - - // s jsonStack - - noBuiltInTypes -} - -// DecodeNaked will decode into an XMLNode - -// XMLName is a value object representing a namespace-aware NAME -type XMLName struct { - Local string - Space string -} - -// XMLNode represents a "union" of the different types of XML Nodes. -// Only one of fields (Text or *Element) is set. -type XMLNode struct { - Element *Element - Text string -} - -// XMLElement is a value object representing an fully-parsed XML element. -type XMLElement struct { - Name Name - Attrs map[XMLName]string - // Children is a list of child nodes, each being a *XMLElement or string - Children []XMLNode -} - -// ----------- HANDLE ------------------- - -type XMLHandle struct { - BasicHandle - textEncodingType - - DefaultNS string - NS map[string]string // ns URI to key, for encoding - Entities map[string]string // entity representation to string, for encoding. -} - -func (h *XMLHandle) newEncDriver(e *Encoder) encDriver { - return &xmlEncDriver{e: e, w: e.w, h: h} -} - -func (h *XMLHandle) newDecDriver(d *Decoder) decDriver { - // d := xmlDecDriver{r: r.(*bytesDecReader), h: h} - hd := xmlDecDriver{d: d, r: d.r, h: h} - hd.n.bytes = d.b[:] - return &hd -} - -var _ decDriver = (*xmlDecDriver)(nil) -var _ encDriver = (*xmlEncDriver)(nil) diff --git a/vendor/github.com/willf/bitset/.gitignore b/vendor/github.com/willf/bitset/.gitignore new file mode 100644 index 00000000..5c204d28 --- /dev/null +++ b/vendor/github.com/willf/bitset/.gitignore @@ -0,0 +1,26 @@ +# 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 + +target diff --git a/vendor/github.com/willf/bitset/.travis.yml b/vendor/github.com/willf/bitset/.travis.yml new file mode 100644 index 00000000..094aa5ce --- /dev/null +++ b/vendor/github.com/willf/bitset/.travis.yml @@ -0,0 +1,37 @@ +language: go + +sudo: false + +branches: + except: + - release + +branches: + only: + - master + - travis + +go: + - "1.11.x" + - tip + +matrix: + allow_failures: + - go: tip + +before_install: + - if [ -n "$GH_USER" ]; then git config --global github.user ${GH_USER}; fi; + - if [ -n "$GH_TOKEN" ]; then git config --global github.token ${GH_TOKEN}; fi; + - go get github.com/mattn/goveralls + +before_script: + - make deps + +script: + - make qa + +after_failure: + - cat ./target/test/report.xml + +after_success: + - if [ "$TRAVIS_GO_VERSION" = "1.11.1" ]; then $HOME/gopath/bin/goveralls -covermode=count -coverprofile=target/report/coverage.out -service=travis-ci; fi; diff --git a/vendor/github.com/willf/bitset/LICENSE b/vendor/github.com/willf/bitset/LICENSE new file mode 100644 index 00000000..59cab8a9 --- /dev/null +++ b/vendor/github.com/willf/bitset/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2014 Will Fitzgerald. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/willf/bitset/Makefile b/vendor/github.com/willf/bitset/Makefile new file mode 100644 index 00000000..ad71f6a4 --- /dev/null +++ b/vendor/github.com/willf/bitset/Makefile @@ -0,0 +1,197 @@ +# MAKEFILE +# +# @author Nicola Asuni +# @link https://github.com/willf/bitset +# ------------------------------------------------------------------------------ + +# List special make targets that are not associated with files +.PHONY: help all test format fmtcheck vet lint coverage cyclo ineffassign misspell structcheck varcheck errcheck gosimple astscan qa deps clean nuke + +# Use bash as shell (Note: Ubuntu now uses dash which doesn't support PIPESTATUS). +SHELL=/bin/bash + +# CVS path (path to the parent dir containing the project) +CVSPATH=github.com/willf + +# Project owner +OWNER=willf + +# Project vendor +VENDOR=willf + +# Project name +PROJECT=bitset + +# Project version +VERSION=$(shell cat VERSION) + +# Name of RPM or DEB package +PKGNAME=${VENDOR}-${PROJECT} + +# Current directory +CURRENTDIR=$(shell pwd) + +# GO lang path +ifneq ($(GOPATH),) + ifeq ($(findstring $(GOPATH),$(CURRENTDIR)),) + # the defined GOPATH is not valid + GOPATH= + endif +endif +ifeq ($(GOPATH),) + # extract the GOPATH + GOPATH=$(firstword $(subst /src/, ,$(CURRENTDIR))) +endif + +# --- MAKE TARGETS --- + +# Display general help about this command +help: + @echo "" + @echo "$(PROJECT) Makefile." + @echo "GOPATH=$(GOPATH)" + @echo "The following commands are available:" + @echo "" + @echo " make qa : Run all the tests" + @echo " make test : Run the unit tests" + @echo "" + @echo " make format : Format the source code" + @echo " make fmtcheck : Check if the source code has been formatted" + @echo " make vet : Check for suspicious constructs" + @echo " make lint : Check for style errors" + @echo " make coverage : Generate the coverage report" + @echo " make cyclo : Generate the cyclomatic complexity report" + @echo " make ineffassign : Detect ineffectual assignments" + @echo " make misspell : Detect commonly misspelled words in source files" + @echo " make structcheck : Find unused struct fields" + @echo " make varcheck : Find unused global variables and constants" + @echo " make errcheck : Check that error return values are used" + @echo " make gosimple : Suggest code simplifications" + @echo " make astscan : GO AST scanner" + @echo "" + @echo " make docs : Generate source code documentation" + @echo "" + @echo " make deps : Get the dependencies" + @echo " make clean : Remove any build artifact" + @echo " make nuke : Deletes any intermediate file" + @echo "" + +# Alias for help target +all: help + +# Run the unit tests +test: + @mkdir -p target/test + @mkdir -p target/report + GOPATH=$(GOPATH) \ + go test \ + -covermode=atomic \ + -bench=. \ + -race \ + -cpuprofile=target/report/cpu.out \ + -memprofile=target/report/mem.out \ + -mutexprofile=target/report/mutex.out \ + -coverprofile=target/report/coverage.out \ + -v ./... | \ + tee >(PATH=$(GOPATH)/bin:$(PATH) go-junit-report > target/test/report.xml); \ + test $${PIPESTATUS[0]} -eq 0 + +# Format the source code +format: + @find . -type f -name "*.go" -exec gofmt -s -w {} \; + +# Check if the source code has been formatted +fmtcheck: + @mkdir -p target + @find . -type f -name "*.go" -exec gofmt -s -d {} \; | tee target/format.diff + @test ! -s target/format.diff || { echo "ERROR: the source code has not been formatted - please use 'make format' or 'gofmt'"; exit 1; } + +# Check for syntax errors +vet: + GOPATH=$(GOPATH) go vet . + +# Check for style errors +lint: + GOPATH=$(GOPATH) PATH=$(GOPATH)/bin:$(PATH) golint . + +# Generate the coverage report +coverage: + @mkdir -p target/report + GOPATH=$(GOPATH) \ + go tool cover -html=target/report/coverage.out -o target/report/coverage.html + +# Report cyclomatic complexity +cyclo: + @mkdir -p target/report + GOPATH=$(GOPATH) gocyclo -avg ./ | tee target/report/cyclo.txt ; test $${PIPESTATUS[0]} -eq 0 + +# Detect ineffectual assignments +ineffassign: + @mkdir -p target/report + GOPATH=$(GOPATH) ineffassign ./ | tee target/report/ineffassign.txt ; test $${PIPESTATUS[0]} -eq 0 + +# Detect commonly misspelled words in source files +misspell: + @mkdir -p target/report + GOPATH=$(GOPATH) misspell -error ./ | tee target/report/misspell.txt ; test $${PIPESTATUS[0]} -eq 0 + +# Find unused struct fields +structcheck: + @mkdir -p target/report + GOPATH=$(GOPATH) structcheck -a ./ | tee target/report/structcheck.txt + +# Find unused global variables and constants +varcheck: + @mkdir -p target/report + GOPATH=$(GOPATH) varcheck -e ./ | tee target/report/varcheck.txt + +# Check that error return values are used +errcheck: + @mkdir -p target/report + GOPATH=$(GOPATH) errcheck ./ | tee target/report/errcheck.txt + +# Suggest code simplifications +gosimple: + @mkdir -p target/report + GOPATH=$(GOPATH) gosimple ./ | tee target/report/gosimple.txt + +# AST scanner +astscan: + @mkdir -p target/report + GOPATH=$(GOPATH) gosec . | tee target/report/astscan.txt ; test $${PIPESTATUS[0]} -eq 0 || true + +# Generate source docs +docs: + @mkdir -p target/docs + nohup sh -c 'GOPATH=$(GOPATH) godoc -http=127.0.0.1:6060' > target/godoc_server.log 2>&1 & + wget --directory-prefix=target/docs/ --execute robots=off --retry-connrefused --recursive --no-parent --adjust-extension --page-requisites --convert-links http://127.0.0.1:6060/pkg/github.com/${VENDOR}/${PROJECT}/ ; kill -9 `lsof -ti :6060` + @echo ''${PKGNAME}' Documentation ...' > target/docs/index.html + +# Alias to run all quality-assurance checks +qa: fmtcheck test vet lint coverage cyclo ineffassign misspell structcheck varcheck errcheck gosimple astscan + +# --- INSTALL --- + +# Get the dependencies +deps: + GOPATH=$(GOPATH) go get ./... + GOPATH=$(GOPATH) go get golang.org/x/lint/golint + GOPATH=$(GOPATH) go get github.com/jstemmer/go-junit-report + GOPATH=$(GOPATH) go get github.com/axw/gocov/gocov + GOPATH=$(GOPATH) go get github.com/fzipp/gocyclo + GOPATH=$(GOPATH) go get github.com/gordonklaus/ineffassign + GOPATH=$(GOPATH) go get github.com/client9/misspell/cmd/misspell + GOPATH=$(GOPATH) go get github.com/opennota/check/cmd/structcheck + GOPATH=$(GOPATH) go get github.com/opennota/check/cmd/varcheck + GOPATH=$(GOPATH) go get github.com/kisielk/errcheck + GOPATH=$(GOPATH) go get honnef.co/go/tools/cmd/gosimple + GOPATH=$(GOPATH) go get github.com/securego/gosec/cmd/gosec/... + +# Remove any build artifact +clean: + GOPATH=$(GOPATH) go clean ./... + +# Deletes any intermediate file +nuke: + rm -rf ./target + GOPATH=$(GOPATH) go clean -i ./... diff --git a/vendor/github.com/willf/bitset/README.md b/vendor/github.com/willf/bitset/README.md new file mode 100644 index 00000000..6c62b20c --- /dev/null +++ b/vendor/github.com/willf/bitset/README.md @@ -0,0 +1,96 @@ +# bitset + +*Go language library to map between non-negative integers and boolean values* + +[![Master Build Status](https://secure.travis-ci.org/willf/bitset.png?branch=master)](https://travis-ci.org/willf/bitset?branch=master) +[![Master Coverage Status](https://coveralls.io/repos/willf/bitset/badge.svg?branch=master&service=github)](https://coveralls.io/github/willf/bitset?branch=master) +[![Go Report Card](https://goreportcard.com/badge/github.com/willf/bitset)](https://goreportcard.com/report/github.com/willf/bitset) +[![GoDoc](https://godoc.org/github.com/willf/bitset?status.svg)](http://godoc.org/github.com/willf/bitset) + + +## Description + +Package bitset implements bitsets, a mapping between non-negative integers and boolean values. +It should be more efficient than map[uint] bool. + +It provides methods for setting, clearing, flipping, and testing individual integers. + +But it also provides set intersection, union, difference, complement, and symmetric operations, as well as tests to check whether any, all, or no bits are set, and querying a bitset's current length and number of positive bits. + +BitSets are expanded to the size of the largest set bit; the memory allocation is approximately Max bits, where Max is the largest set bit. BitSets are never shrunk. On creation, a hint can be given for the number of bits that will be used. + +Many of the methods, including Set, Clear, and Flip, return a BitSet pointer, which allows for chaining. + +### Example use: + +```go +package main + +import ( + "fmt" + "math/rand" + + "github.com/willf/bitset" +) + +func main() { + fmt.Printf("Hello from BitSet!\n") + var b bitset.BitSet + // play some Go Fish + for i := 0; i < 100; i++ { + card1 := uint(rand.Intn(52)) + card2 := uint(rand.Intn(52)) + b.Set(card1) + if b.Test(card2) { + fmt.Println("Go Fish!") + } + b.Clear(card1) + } + + // Chaining + b.Set(10).Set(11) + + for i, e := b.NextSet(0); e; i, e = b.NextSet(i + 1) { + fmt.Println("The following bit is set:", i) + } + if b.Intersection(bitset.New(100).Set(10)).Count() == 1 { + fmt.Println("Intersection works.") + } else { + fmt.Println("Intersection doesn't work???") + } +} +``` + +As an alternative to BitSets, one should check out the 'big' package, which provides a (less set-theoretical) view of bitsets. + +Godoc documentation is at: https://godoc.org/github.com/willf/bitset + + +## Implementation Note + +Go 1.9 introduced a native `math/bits` library. We provide backward compatibility to Go 1.7, which might be removed. + +It is possible that a later version will match the `math/bits` return signature for counts (which is `int`, rather than our library's `unit64`). If so, the version will be bumped. + +## Installation + +```bash +go get github.com/willf/bitset +``` + +## Contributing + +If you wish to contribute to this project, please branch and issue a pull request against master ("[GitHub Flow](https://guides.github.com/introduction/flow/)") + +This project include a Makefile that allows you to test and build the project with simple commands. +To see all available options: +```bash +make help +``` + +## Running all tests + +Before committing the code, please check if it passes all tests using (note: this will install some dependencies): +```bash +make qa +``` diff --git a/vendor/github.com/willf/bitset/bitset.go b/vendor/github.com/willf/bitset/bitset.go new file mode 100644 index 00000000..32044f5c --- /dev/null +++ b/vendor/github.com/willf/bitset/bitset.go @@ -0,0 +1,877 @@ +/* +Package bitset implements bitsets, a mapping +between non-negative integers and boolean values. It should be more +efficient than map[uint] bool. + +It provides methods for setting, clearing, flipping, and testing +individual integers. + +But it also provides set intersection, union, difference, +complement, and symmetric operations, as well as tests to +check whether any, all, or no bits are set, and querying a +bitset's current length and number of positive bits. + +BitSets are expanded to the size of the largest set bit; the +memory allocation is approximately Max bits, where Max is +the largest set bit. BitSets are never shrunk. On creation, +a hint can be given for the number of bits that will be used. + +Many of the methods, including Set,Clear, and Flip, return +a BitSet pointer, which allows for chaining. + +Example use: + + import "bitset" + var b BitSet + b.Set(10).Set(11) + if b.Test(1000) { + b.Clear(1000) + } + if B.Intersection(bitset.New(100).Set(10)).Count() > 1 { + fmt.Println("Intersection works.") + } + +As an alternative to BitSets, one should check out the 'big' package, +which provides a (less set-theoretical) view of bitsets. + +*/ +package bitset + +import ( + "bufio" + "bytes" + "encoding/base64" + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "io" + "strconv" +) + +// the wordSize of a bit set +const wordSize = uint(64) + +// log2WordSize is lg(wordSize) +const log2WordSize = uint(6) + +// allBits has every bit set +const allBits uint64 = 0xffffffffffffffff + +// default binary BigEndian +var binaryOrder binary.ByteOrder = binary.BigEndian + +// default json encoding base64.URLEncoding +var base64Encoding = base64.URLEncoding + +// Base64StdEncoding Marshal/Unmarshal BitSet with base64.StdEncoding(Default: base64.URLEncoding) +func Base64StdEncoding() { base64Encoding = base64.StdEncoding } + +// LittleEndian Marshal/Unmarshal Binary as Little Endian(Default: binary.BigEndian) +func LittleEndian() { binaryOrder = binary.LittleEndian } + +// A BitSet is a set of bits. The zero value of a BitSet is an empty set of length 0. +type BitSet struct { + length uint + set []uint64 +} + +// Error is used to distinguish errors (panics) generated in this package. +type Error string + +// safeSet will fixup b.set to be non-nil and return the field value +func (b *BitSet) safeSet() []uint64 { + if b.set == nil { + b.set = make([]uint64, wordsNeeded(0)) + } + return b.set +} + +// From is a constructor used to create a BitSet from an array of integers +func From(buf []uint64) *BitSet { + return &BitSet{uint(len(buf)) * 64, buf} +} + +// Bytes returns the bitset as array of integers +func (b *BitSet) Bytes() []uint64 { + return b.set +} + +// wordsNeeded calculates the number of words needed for i bits +func wordsNeeded(i uint) int { + if i > (Cap() - wordSize + 1) { + return int(Cap() >> log2WordSize) + } + return int((i + (wordSize - 1)) >> log2WordSize) +} + +// New creates a new BitSet with a hint that length bits will be required +func New(length uint) (bset *BitSet) { + defer func() { + if r := recover(); r != nil { + bset = &BitSet{ + 0, + make([]uint64, 0), + } + } + }() + + bset = &BitSet{ + length, + make([]uint64, wordsNeeded(length)), + } + + return bset +} + +// Cap returns the total possible capacity, or number of bits +func Cap() uint { + return ^uint(0) +} + +// Len returns the length of the BitSet in words +func (b *BitSet) Len() uint { + return b.length +} + +// extendSetMaybe adds additional words to incorporate new bits if needed +func (b *BitSet) extendSetMaybe(i uint) { + if i >= b.length { // if we need more bits, make 'em + nsize := wordsNeeded(i + 1) + if b.set == nil { + b.set = make([]uint64, nsize) + } else if cap(b.set) >= nsize { + b.set = b.set[:nsize] // fast resize + } else if len(b.set) < nsize { + newset := make([]uint64, nsize, 2*nsize) // increase capacity 2x + copy(newset, b.set) + b.set = newset + } + b.length = i + 1 + } +} + +// Test whether bit i is set. +func (b *BitSet) Test(i uint) bool { + if i >= b.length { + return false + } + return b.set[i>>log2WordSize]&(1<<(i&(wordSize-1))) != 0 +} + +// Set bit i to 1 +func (b *BitSet) Set(i uint) *BitSet { + b.extendSetMaybe(i) + b.set[i>>log2WordSize] |= 1 << (i & (wordSize - 1)) + return b +} + +// Clear bit i to 0 +func (b *BitSet) Clear(i uint) *BitSet { + if i >= b.length { + return b + } + b.set[i>>log2WordSize] &^= 1 << (i & (wordSize - 1)) + return b +} + +// SetTo sets bit i to value +func (b *BitSet) SetTo(i uint, value bool) *BitSet { + if value { + return b.Set(i) + } + return b.Clear(i) +} + +// Flip bit at i +func (b *BitSet) Flip(i uint) *BitSet { + if i >= b.length { + return b.Set(i) + } + b.set[i>>log2WordSize] ^= 1 << (i & (wordSize - 1)) + return b +} + +// Shrink shrinks BitSet to desired length in bits. It clears all bits > length +// and reduces the size and length of the set. +// +// A new slice is allocated to store the new bits, so you may see an increase in +// memory usage until the GC runs. Normally this should not be a problem, but if you +// have an extremely large BitSet its important to understand that the old BitSet will +// remain in memory until the GC frees it. +func (b *BitSet) Shrink(length uint) *BitSet { + idx := wordsNeeded(length + 1) + if idx > len(b.set) { + return b + } + shrunk := make([]uint64, idx) + copy(shrunk, b.set[:idx]) + b.set = shrunk + b.length = length + 1 + b.set[idx-1] &= (allBits >> (uint64(64) - uint64(length&(wordSize-1)) - 1)) + return b +} + +// InsertAt takes an index which indicates where a bit should be +// inserted. Then it shifts all the bits in the set to the left by 1, starting +// from the given index position, and sets the index position to 0. +// +// Depending on the size of your BitSet, and where you are inserting the new entry, +// this method could be extremely slow and in some cases might cause the entire BitSet +// to be recopied. +func (b *BitSet) InsertAt(idx uint) *BitSet { + insertAtElement := (idx >> log2WordSize) + + // if length of set is a multiple of wordSize we need to allocate more space first + if b.isLenExactMultiple() { + b.set = append(b.set, uint64(0)) + } + + var i uint + for i = uint(len(b.set) - 1); i > insertAtElement; i-- { + // all elements above the position where we want to insert can simply by shifted + b.set[i] <<= 1 + + // we take the most significant bit of the previous element and set it as + // the least significant bit of the current element + b.set[i] |= (b.set[i-1] & 0x8000000000000000) >> 63 + } + + // generate a mask to extract the data that we need to shift left + // within the element where we insert a bit + dataMask := ^(uint64(1)< 0x40000 { + buffer.WriteString("...") + break + } + buffer.WriteString(strconv.FormatInt(int64(i), 10)) + i, e = b.NextSet(i + 1) + if e { + buffer.WriteString(",") + } + } + buffer.WriteString("}") + return buffer.String() +} + +// DeleteAt deletes the bit at the given index position from +// within the bitset +// All the bits residing on the left of the deleted bit get +// shifted right by 1 +// The running time of this operation may potentially be +// relatively slow, O(length) +func (b *BitSet) DeleteAt(i uint) *BitSet { + // the index of the slice element where we'll delete a bit + deleteAtElement := i >> log2WordSize + + // generate a mask for the data that needs to be shifted right + // within that slice element that gets modified + dataMask := ^((uint64(1) << (i & (wordSize - 1))) - 1) + + // extract the data that we'll shift right from the slice element + data := b.set[deleteAtElement] & dataMask + + // set the masked area to 0 while leaving the rest as it is + b.set[deleteAtElement] &= ^dataMask + + // shift the previously extracted data to the right and then + // set it in the previously masked area + b.set[deleteAtElement] |= (data >> 1) & dataMask + + // loop over all the consecutive slice elements to copy each + // lowest bit into the highest position of the previous element, + // then shift the entire content to the right by 1 + for i := int(deleteAtElement) + 1; i < len(b.set); i++ { + b.set[i-1] |= (b.set[i] & 1) << 63 + b.set[i] >>= 1 + } + + b.length = b.length - 1 + + return b +} + +// NextSet returns the next bit set from the specified index, +// including possibly the current index +// along with an error code (true = valid, false = no set bit found) +// for i,e := v.NextSet(0); e; i,e = v.NextSet(i + 1) {...} +func (b *BitSet) NextSet(i uint) (uint, bool) { + x := int(i >> log2WordSize) + if x >= len(b.set) { + return 0, false + } + w := b.set[x] + w = w >> (i & (wordSize - 1)) + if w != 0 { + return i + trailingZeroes64(w), true + } + x = x + 1 + for x < len(b.set) { + if b.set[x] != 0 { + return uint(x)*wordSize + trailingZeroes64(b.set[x]), true + } + x = x + 1 + + } + return 0, false +} + +// NextSetMany returns many next bit sets from the specified index, +// including possibly the current index and up to cap(buffer). +// If the returned slice has len zero, then no more set bits were found +// +// buffer := make([]uint, 256) // this should be reused +// j := uint(0) +// j, buffer = bitmap.NextSetMany(j, buffer) +// for ; len(buffer) > 0; j, buffer = bitmap.NextSetMany(j,buffer) { +// for k := range buffer { +// do something with buffer[k] +// } +// j += 1 +// } +// +func (b *BitSet) NextSetMany(i uint, buffer []uint) (uint, []uint) { + myanswer := buffer + capacity := cap(buffer) + x := int(i >> log2WordSize) + if x >= len(b.set) || capacity == 0 { + return 0, myanswer[:0] + } + skip := i & (wordSize - 1) + word := b.set[x] >> skip + myanswer = myanswer[:capacity] + size := int(0) + for word != 0 { + r := trailingZeroes64(word) + t := word & ((^word) + 1) + myanswer[size] = r + i + size++ + if size == capacity { + goto End + } + word = word ^ t + } + x++ + for idx, word := range b.set[x:] { + for word != 0 { + r := trailingZeroes64(word) + t := word & ((^word) + 1) + myanswer[size] = r + (uint(x+idx) << 6) + size++ + if size == capacity { + goto End + } + word = word ^ t + } + } +End: + if size > 0 { + return myanswer[size-1], myanswer[:size] + } + return 0, myanswer[:0] +} + +// NextClear returns the next clear bit from the specified index, +// including possibly the current index +// along with an error code (true = valid, false = no bit found i.e. all bits are set) +func (b *BitSet) NextClear(i uint) (uint, bool) { + x := int(i >> log2WordSize) + if x >= len(b.set) { + return 0, false + } + w := b.set[x] + w = w >> (i & (wordSize - 1)) + wA := allBits >> (i & (wordSize - 1)) + index := i + trailingZeroes64(^w) + if w != wA && index < b.length { + return index, true + } + x++ + for x < len(b.set) { + index = uint(x)*wordSize + trailingZeroes64(^b.set[x]) + if b.set[x] != allBits && index < b.length { + return index, true + } + x++ + } + return 0, false +} + +// ClearAll clears the entire BitSet +func (b *BitSet) ClearAll() *BitSet { + if b != nil && b.set != nil { + for i := range b.set { + b.set[i] = 0 + } + } + return b +} + +// wordCount returns the number of words used in a bit set +func (b *BitSet) wordCount() int { + return len(b.set) +} + +// Clone this BitSet +func (b *BitSet) Clone() *BitSet { + c := New(b.length) + if b.set != nil { // Clone should not modify current object + copy(c.set, b.set) + } + return c +} + +// Copy into a destination BitSet +// Returning the size of the destination BitSet +// like array copy +func (b *BitSet) Copy(c *BitSet) (count uint) { + if c == nil { + return + } + if b.set != nil { // Copy should not modify current object + copy(c.set, b.set) + } + count = c.length + if b.length < c.length { + count = b.length + } + return +} + +// Count (number of set bits) +func (b *BitSet) Count() uint { + if b != nil && b.set != nil { + return uint(popcntSlice(b.set)) + } + return 0 +} + +// Equal tests the equvalence of two BitSets. +// False if they are of different sizes, otherwise true +// only if all the same bits are set +func (b *BitSet) Equal(c *BitSet) bool { + if c == nil { + return false + } + if b.length != c.length { + return false + } + if b.length == 0 { // if they have both length == 0, then could have nil set + return true + } + // testing for equality shoud not transform the bitset (no call to safeSet) + + for p, v := range b.set { + if c.set[p] != v { + return false + } + } + return true +} + +func panicIfNull(b *BitSet) { + if b == nil { + panic(Error("BitSet must not be null")) + } +} + +// Difference of base set and other set +// This is the BitSet equivalent of &^ (and not) +func (b *BitSet) Difference(compare *BitSet) (result *BitSet) { + panicIfNull(b) + panicIfNull(compare) + result = b.Clone() // clone b (in case b is bigger than compare) + l := int(compare.wordCount()) + if l > int(b.wordCount()) { + l = int(b.wordCount()) + } + for i := 0; i < l; i++ { + result.set[i] = b.set[i] &^ compare.set[i] + } + return +} + +// DifferenceCardinality computes the cardinality of the differnce +func (b *BitSet) DifferenceCardinality(compare *BitSet) uint { + panicIfNull(b) + panicIfNull(compare) + l := int(compare.wordCount()) + if l > int(b.wordCount()) { + l = int(b.wordCount()) + } + cnt := uint64(0) + cnt += popcntMaskSlice(b.set[:l], compare.set[:l]) + cnt += popcntSlice(b.set[l:]) + return uint(cnt) +} + +// InPlaceDifference computes the difference of base set and other set +// This is the BitSet equivalent of &^ (and not) +func (b *BitSet) InPlaceDifference(compare *BitSet) { + panicIfNull(b) + panicIfNull(compare) + l := int(compare.wordCount()) + if l > int(b.wordCount()) { + l = int(b.wordCount()) + } + for i := 0; i < l; i++ { + b.set[i] &^= compare.set[i] + } +} + +// Convenience function: return two bitsets ordered by +// increasing length. Note: neither can be nil +func sortByLength(a *BitSet, b *BitSet) (ap *BitSet, bp *BitSet) { + if a.length <= b.length { + ap, bp = a, b + } else { + ap, bp = b, a + } + return +} + +// Intersection of base set and other set +// This is the BitSet equivalent of & (and) +func (b *BitSet) Intersection(compare *BitSet) (result *BitSet) { + panicIfNull(b) + panicIfNull(compare) + b, compare = sortByLength(b, compare) + result = New(b.length) + for i, word := range b.set { + result.set[i] = word & compare.set[i] + } + return +} + +// IntersectionCardinality computes the cardinality of the union +func (b *BitSet) IntersectionCardinality(compare *BitSet) uint { + panicIfNull(b) + panicIfNull(compare) + b, compare = sortByLength(b, compare) + cnt := popcntAndSlice(b.set, compare.set) + return uint(cnt) +} + +// InPlaceIntersection destructively computes the intersection of +// base set and the compare set. +// This is the BitSet equivalent of & (and) +func (b *BitSet) InPlaceIntersection(compare *BitSet) { + panicIfNull(b) + panicIfNull(compare) + l := int(compare.wordCount()) + if l > int(b.wordCount()) { + l = int(b.wordCount()) + } + for i := 0; i < l; i++ { + b.set[i] &= compare.set[i] + } + for i := l; i < len(b.set); i++ { + b.set[i] = 0 + } + if compare.length > 0 { + b.extendSetMaybe(compare.length - 1) + } +} + +// Union of base set and other set +// This is the BitSet equivalent of | (or) +func (b *BitSet) Union(compare *BitSet) (result *BitSet) { + panicIfNull(b) + panicIfNull(compare) + b, compare = sortByLength(b, compare) + result = compare.Clone() + for i, word := range b.set { + result.set[i] = word | compare.set[i] + } + return +} + +// UnionCardinality computes the cardinality of the uniton of the base set +// and the compare set. +func (b *BitSet) UnionCardinality(compare *BitSet) uint { + panicIfNull(b) + panicIfNull(compare) + b, compare = sortByLength(b, compare) + cnt := popcntOrSlice(b.set, compare.set) + if len(compare.set) > len(b.set) { + cnt += popcntSlice(compare.set[len(b.set):]) + } + return uint(cnt) +} + +// InPlaceUnion creates the destructive union of base set and compare set. +// This is the BitSet equivalent of | (or). +func (b *BitSet) InPlaceUnion(compare *BitSet) { + panicIfNull(b) + panicIfNull(compare) + l := int(compare.wordCount()) + if l > int(b.wordCount()) { + l = int(b.wordCount()) + } + if compare.length > 0 { + b.extendSetMaybe(compare.length - 1) + } + for i := 0; i < l; i++ { + b.set[i] |= compare.set[i] + } + if len(compare.set) > l { + for i := l; i < len(compare.set); i++ { + b.set[i] = compare.set[i] + } + } +} + +// SymmetricDifference of base set and other set +// This is the BitSet equivalent of ^ (xor) +func (b *BitSet) SymmetricDifference(compare *BitSet) (result *BitSet) { + panicIfNull(b) + panicIfNull(compare) + b, compare = sortByLength(b, compare) + // compare is bigger, so clone it + result = compare.Clone() + for i, word := range b.set { + result.set[i] = word ^ compare.set[i] + } + return +} + +// SymmetricDifferenceCardinality computes the cardinality of the symmetric difference +func (b *BitSet) SymmetricDifferenceCardinality(compare *BitSet) uint { + panicIfNull(b) + panicIfNull(compare) + b, compare = sortByLength(b, compare) + cnt := popcntXorSlice(b.set, compare.set) + if len(compare.set) > len(b.set) { + cnt += popcntSlice(compare.set[len(b.set):]) + } + return uint(cnt) +} + +// InPlaceSymmetricDifference creates the destructive SymmetricDifference of base set and other set +// This is the BitSet equivalent of ^ (xor) +func (b *BitSet) InPlaceSymmetricDifference(compare *BitSet) { + panicIfNull(b) + panicIfNull(compare) + l := int(compare.wordCount()) + if l > int(b.wordCount()) { + l = int(b.wordCount()) + } + if compare.length > 0 { + b.extendSetMaybe(compare.length - 1) + } + for i := 0; i < l; i++ { + b.set[i] ^= compare.set[i] + } + if len(compare.set) > l { + for i := l; i < len(compare.set); i++ { + b.set[i] = compare.set[i] + } + } +} + +// Is the length an exact multiple of word sizes? +func (b *BitSet) isLenExactMultiple() bool { + return b.length%wordSize == 0 +} + +// Clean last word by setting unused bits to 0 +func (b *BitSet) cleanLastWord() { + if !b.isLenExactMultiple() { + b.set[len(b.set)-1] &= allBits >> (wordSize - b.length%wordSize) + } +} + +// Complement computes the (local) complement of a biset (up to length bits) +func (b *BitSet) Complement() (result *BitSet) { + panicIfNull(b) + result = New(b.length) + for i, word := range b.set { + result.set[i] = ^word + } + result.cleanLastWord() + return +} + +// All returns true if all bits are set, false otherwise. Returns true for +// empty sets. +func (b *BitSet) All() bool { + panicIfNull(b) + return b.Count() == b.length +} + +// None returns true if no bit is set, false otherwise. Retursn true for +// empty sets. +func (b *BitSet) None() bool { + panicIfNull(b) + if b != nil && b.set != nil { + for _, word := range b.set { + if word > 0 { + return false + } + } + return true + } + return true +} + +// Any returns true if any bit is set, false otherwise +func (b *BitSet) Any() bool { + panicIfNull(b) + return !b.None() +} + +// IsSuperSet returns true if this is a superset of the other set +func (b *BitSet) IsSuperSet(other *BitSet) bool { + for i, e := other.NextSet(0); e; i, e = other.NextSet(i + 1) { + if !b.Test(i) { + return false + } + } + return true +} + +// IsStrictSuperSet returns true if this is a strict superset of the other set +func (b *BitSet) IsStrictSuperSet(other *BitSet) bool { + return b.Count() > other.Count() && b.IsSuperSet(other) +} + +// DumpAsBits dumps a bit set as a string of bits +func (b *BitSet) DumpAsBits() string { + if b.set == nil { + return "." + } + buffer := bytes.NewBufferString("") + i := len(b.set) - 1 + for ; i >= 0; i-- { + fmt.Fprintf(buffer, "%064b.", b.set[i]) + } + return buffer.String() +} + +// BinaryStorageSize returns the binary storage requirements +func (b *BitSet) BinaryStorageSize() int { + return binary.Size(uint64(0)) + binary.Size(b.set) +} + +// WriteTo writes a BitSet to a stream +func (b *BitSet) WriteTo(stream io.Writer) (int64, error) { + length := uint64(b.length) + + // Write length + err := binary.Write(stream, binaryOrder, length) + if err != nil { + return 0, err + } + + // Write set + err = binary.Write(stream, binaryOrder, b.set) + return int64(b.BinaryStorageSize()), err +} + +// ReadFrom reads a BitSet from a stream written using WriteTo +func (b *BitSet) ReadFrom(stream io.Reader) (int64, error) { + var length uint64 + + // Read length first + err := binary.Read(stream, binaryOrder, &length) + if err != nil { + return 0, err + } + newset := New(uint(length)) + + if uint64(newset.length) != length { + return 0, errors.New("Unmarshalling error: type mismatch") + } + + // Read remaining bytes as set + err = binary.Read(stream, binaryOrder, newset.set) + if err != nil { + return 0, err + } + + *b = *newset + return int64(b.BinaryStorageSize()), nil +} + +// MarshalBinary encodes a BitSet into a binary form and returns the result. +func (b *BitSet) MarshalBinary() ([]byte, error) { + var buf bytes.Buffer + writer := bufio.NewWriter(&buf) + + _, err := b.WriteTo(writer) + if err != nil { + return []byte{}, err + } + + err = writer.Flush() + + return buf.Bytes(), err +} + +// UnmarshalBinary decodes the binary form generated by MarshalBinary. +func (b *BitSet) UnmarshalBinary(data []byte) error { + buf := bytes.NewReader(data) + reader := bufio.NewReader(buf) + + _, err := b.ReadFrom(reader) + + return err +} + +// MarshalJSON marshals a BitSet as a JSON structure +func (b *BitSet) MarshalJSON() ([]byte, error) { + buffer := bytes.NewBuffer(make([]byte, 0, b.BinaryStorageSize())) + _, err := b.WriteTo(buffer) + if err != nil { + return nil, err + } + + // URLEncode all bytes + return json.Marshal(base64Encoding.EncodeToString(buffer.Bytes())) +} + +// UnmarshalJSON unmarshals a BitSet from JSON created using MarshalJSON +func (b *BitSet) UnmarshalJSON(data []byte) error { + // Unmarshal as string + var s string + err := json.Unmarshal(data, &s) + if err != nil { + return err + } + + // URLDecode string + buf, err := base64Encoding.DecodeString(s) + if err != nil { + return err + } + + _, err = b.ReadFrom(bytes.NewReader(buf)) + return err +} diff --git a/vendor/github.com/willf/bitset/popcnt.go b/vendor/github.com/willf/bitset/popcnt.go new file mode 100644 index 00000000..76577a83 --- /dev/null +++ b/vendor/github.com/willf/bitset/popcnt.go @@ -0,0 +1,53 @@ +package bitset + +// bit population count, take from +// https://code.google.com/p/go/issues/detail?id=4988#c11 +// credit: https://code.google.com/u/arnehormann/ +func popcount(x uint64) (n uint64) { + x -= (x >> 1) & 0x5555555555555555 + x = (x>>2)&0x3333333333333333 + x&0x3333333333333333 + x += x >> 4 + x &= 0x0f0f0f0f0f0f0f0f + x *= 0x0101010101010101 + return x >> 56 +} + +func popcntSliceGo(s []uint64) uint64 { + cnt := uint64(0) + for _, x := range s { + cnt += popcount(x) + } + return cnt +} + +func popcntMaskSliceGo(s, m []uint64) uint64 { + cnt := uint64(0) + for i := range s { + cnt += popcount(s[i] &^ m[i]) + } + return cnt +} + +func popcntAndSliceGo(s, m []uint64) uint64 { + cnt := uint64(0) + for i := range s { + cnt += popcount(s[i] & m[i]) + } + return cnt +} + +func popcntOrSliceGo(s, m []uint64) uint64 { + cnt := uint64(0) + for i := range s { + cnt += popcount(s[i] | m[i]) + } + return cnt +} + +func popcntXorSliceGo(s, m []uint64) uint64 { + cnt := uint64(0) + for i := range s { + cnt += popcount(s[i] ^ m[i]) + } + return cnt +} diff --git a/vendor/github.com/willf/bitset/popcnt_19.go b/vendor/github.com/willf/bitset/popcnt_19.go new file mode 100644 index 00000000..fc8ff4f3 --- /dev/null +++ b/vendor/github.com/willf/bitset/popcnt_19.go @@ -0,0 +1,45 @@ +// +build go1.9 + +package bitset + +import "math/bits" + +func popcntSlice(s []uint64) uint64 { + var cnt int + for _, x := range s { + cnt += bits.OnesCount64(x) + } + return uint64(cnt) +} + +func popcntMaskSlice(s, m []uint64) uint64 { + var cnt int + for i := range s { + cnt += bits.OnesCount64(s[i] &^ m[i]) + } + return uint64(cnt) +} + +func popcntAndSlice(s, m []uint64) uint64 { + var cnt int + for i := range s { + cnt += bits.OnesCount64(s[i] & m[i]) + } + return uint64(cnt) +} + +func popcntOrSlice(s, m []uint64) uint64 { + var cnt int + for i := range s { + cnt += bits.OnesCount64(s[i] | m[i]) + } + return uint64(cnt) +} + +func popcntXorSlice(s, m []uint64) uint64 { + var cnt int + for i := range s { + cnt += bits.OnesCount64(s[i] ^ m[i]) + } + return uint64(cnt) +} diff --git a/vendor/github.com/willf/bitset/popcnt_amd64.go b/vendor/github.com/willf/bitset/popcnt_amd64.go new file mode 100644 index 00000000..4cf64f24 --- /dev/null +++ b/vendor/github.com/willf/bitset/popcnt_amd64.go @@ -0,0 +1,68 @@ +// +build !go1.9 +// +build amd64,!appengine + +package bitset + +// *** the following functions are defined in popcnt_amd64.s + +//go:noescape + +func hasAsm() bool + +// useAsm is a flag used to select the GO or ASM implementation of the popcnt function +var useAsm = hasAsm() + +//go:noescape + +func popcntSliceAsm(s []uint64) uint64 + +//go:noescape + +func popcntMaskSliceAsm(s, m []uint64) uint64 + +//go:noescape + +func popcntAndSliceAsm(s, m []uint64) uint64 + +//go:noescape + +func popcntOrSliceAsm(s, m []uint64) uint64 + +//go:noescape + +func popcntXorSliceAsm(s, m []uint64) uint64 + +func popcntSlice(s []uint64) uint64 { + if useAsm { + return popcntSliceAsm(s) + } + return popcntSliceGo(s) +} + +func popcntMaskSlice(s, m []uint64) uint64 { + if useAsm { + return popcntMaskSliceAsm(s, m) + } + return popcntMaskSliceGo(s, m) +} + +func popcntAndSlice(s, m []uint64) uint64 { + if useAsm { + return popcntAndSliceAsm(s, m) + } + return popcntAndSliceGo(s, m) +} + +func popcntOrSlice(s, m []uint64) uint64 { + if useAsm { + return popcntOrSliceAsm(s, m) + } + return popcntOrSliceGo(s, m) +} + +func popcntXorSlice(s, m []uint64) uint64 { + if useAsm { + return popcntXorSliceAsm(s, m) + } + return popcntXorSliceGo(s, m) +} diff --git a/vendor/github.com/willf/bitset/popcnt_amd64.s b/vendor/github.com/willf/bitset/popcnt_amd64.s new file mode 100644 index 00000000..666c0dcc --- /dev/null +++ b/vendor/github.com/willf/bitset/popcnt_amd64.s @@ -0,0 +1,104 @@ +// +build !go1.9 +// +build amd64,!appengine + +TEXT ·hasAsm(SB),4,$0-1 +MOVQ $1, AX +CPUID +SHRQ $23, CX +ANDQ $1, CX +MOVB CX, ret+0(FP) +RET + +#define POPCNTQ_DX_DX BYTE $0xf3; BYTE $0x48; BYTE $0x0f; BYTE $0xb8; BYTE $0xd2 + +TEXT ·popcntSliceAsm(SB),4,$0-32 +XORQ AX, AX +MOVQ s+0(FP), SI +MOVQ s_len+8(FP), CX +TESTQ CX, CX +JZ popcntSliceEnd +popcntSliceLoop: +BYTE $0xf3; BYTE $0x48; BYTE $0x0f; BYTE $0xb8; BYTE $0x16 // POPCNTQ (SI), DX +ADDQ DX, AX +ADDQ $8, SI +LOOP popcntSliceLoop +popcntSliceEnd: +MOVQ AX, ret+24(FP) +RET + +TEXT ·popcntMaskSliceAsm(SB),4,$0-56 +XORQ AX, AX +MOVQ s+0(FP), SI +MOVQ s_len+8(FP), CX +TESTQ CX, CX +JZ popcntMaskSliceEnd +MOVQ m+24(FP), DI +popcntMaskSliceLoop: +MOVQ (DI), DX +NOTQ DX +ANDQ (SI), DX +POPCNTQ_DX_DX +ADDQ DX, AX +ADDQ $8, SI +ADDQ $8, DI +LOOP popcntMaskSliceLoop +popcntMaskSliceEnd: +MOVQ AX, ret+48(FP) +RET + +TEXT ·popcntAndSliceAsm(SB),4,$0-56 +XORQ AX, AX +MOVQ s+0(FP), SI +MOVQ s_len+8(FP), CX +TESTQ CX, CX +JZ popcntAndSliceEnd +MOVQ m+24(FP), DI +popcntAndSliceLoop: +MOVQ (DI), DX +ANDQ (SI), DX +POPCNTQ_DX_DX +ADDQ DX, AX +ADDQ $8, SI +ADDQ $8, DI +LOOP popcntAndSliceLoop +popcntAndSliceEnd: +MOVQ AX, ret+48(FP) +RET + +TEXT ·popcntOrSliceAsm(SB),4,$0-56 +XORQ AX, AX +MOVQ s+0(FP), SI +MOVQ s_len+8(FP), CX +TESTQ CX, CX +JZ popcntOrSliceEnd +MOVQ m+24(FP), DI +popcntOrSliceLoop: +MOVQ (DI), DX +ORQ (SI), DX +POPCNTQ_DX_DX +ADDQ DX, AX +ADDQ $8, SI +ADDQ $8, DI +LOOP popcntOrSliceLoop +popcntOrSliceEnd: +MOVQ AX, ret+48(FP) +RET + +TEXT ·popcntXorSliceAsm(SB),4,$0-56 +XORQ AX, AX +MOVQ s+0(FP), SI +MOVQ s_len+8(FP), CX +TESTQ CX, CX +JZ popcntXorSliceEnd +MOVQ m+24(FP), DI +popcntXorSliceLoop: +MOVQ (DI), DX +XORQ (SI), DX +POPCNTQ_DX_DX +ADDQ DX, AX +ADDQ $8, SI +ADDQ $8, DI +LOOP popcntXorSliceLoop +popcntXorSliceEnd: +MOVQ AX, ret+48(FP) +RET diff --git a/vendor/github.com/willf/bitset/popcnt_generic.go b/vendor/github.com/willf/bitset/popcnt_generic.go new file mode 100644 index 00000000..21e0ff7b --- /dev/null +++ b/vendor/github.com/willf/bitset/popcnt_generic.go @@ -0,0 +1,24 @@ +// +build !go1.9 +// +build !amd64 appengine + +package bitset + +func popcntSlice(s []uint64) uint64 { + return popcntSliceGo(s) +} + +func popcntMaskSlice(s, m []uint64) uint64 { + return popcntMaskSliceGo(s, m) +} + +func popcntAndSlice(s, m []uint64) uint64 { + return popcntAndSliceGo(s, m) +} + +func popcntOrSlice(s, m []uint64) uint64 { + return popcntOrSliceGo(s, m) +} + +func popcntXorSlice(s, m []uint64) uint64 { + return popcntXorSliceGo(s, m) +} diff --git a/vendor/github.com/willf/bitset/trailing_zeros_18.go b/vendor/github.com/willf/bitset/trailing_zeros_18.go new file mode 100644 index 00000000..c52b61be --- /dev/null +++ b/vendor/github.com/willf/bitset/trailing_zeros_18.go @@ -0,0 +1,14 @@ +// +build !go1.9 + +package bitset + +var deBruijn = [...]byte{ + 0, 1, 56, 2, 57, 49, 28, 3, 61, 58, 42, 50, 38, 29, 17, 4, + 62, 47, 59, 36, 45, 43, 51, 22, 53, 39, 33, 30, 24, 18, 12, 5, + 63, 55, 48, 27, 60, 41, 37, 16, 46, 35, 44, 21, 52, 32, 23, 11, + 54, 26, 40, 15, 34, 20, 31, 10, 25, 14, 19, 9, 13, 8, 7, 6, +} + +func trailingZeroes64(v uint64) uint { + return uint(deBruijn[((v&-v)*0x03f79d71b4ca8b09)>>58]) +} diff --git a/vendor/github.com/willf/bitset/trailing_zeros_19.go b/vendor/github.com/willf/bitset/trailing_zeros_19.go new file mode 100644 index 00000000..36a988e7 --- /dev/null +++ b/vendor/github.com/willf/bitset/trailing_zeros_19.go @@ -0,0 +1,9 @@ +// +build go1.9 + +package bitset + +import "math/bits" + +func trailingZeroes64(v uint64) uint { + return uint(bits.TrailingZeros64(v)) +} diff --git a/vendor/go.etcd.io/etcd/LICENSE b/vendor/go.etcd.io/etcd/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/go.etcd.io/etcd/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/go.etcd.io/etcd/NOTICE b/vendor/go.etcd.io/etcd/NOTICE new file mode 100644 index 00000000..b39ddfa5 --- /dev/null +++ b/vendor/go.etcd.io/etcd/NOTICE @@ -0,0 +1,5 @@ +CoreOS Project +Copyright 2014 CoreOS, Inc + +This product includes software developed at CoreOS, Inc. +(http://www.coreos.com/). diff --git a/vendor/go.etcd.io/etcd/auth/authpb/auth.pb.go b/vendor/go.etcd.io/etcd/auth/authpb/auth.pb.go new file mode 100644 index 00000000..7e038df0 --- /dev/null +++ b/vendor/go.etcd.io/etcd/auth/authpb/auth.pb.go @@ -0,0 +1,977 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: auth.proto + +/* + Package authpb is a generated protocol buffer package. + + It is generated from these files: + auth.proto + + It has these top-level messages: + UserAddOptions + User + Permission + Role +*/ +package authpb + +import ( + "fmt" + + proto "github.com/golang/protobuf/proto" + + math "math" + + _ "github.com/gogo/protobuf/gogoproto" + + io "io" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Permission_Type int32 + +const ( + READ Permission_Type = 0 + WRITE Permission_Type = 1 + READWRITE Permission_Type = 2 +) + +var Permission_Type_name = map[int32]string{ + 0: "READ", + 1: "WRITE", + 2: "READWRITE", +} +var Permission_Type_value = map[string]int32{ + "READ": 0, + "WRITE": 1, + "READWRITE": 2, +} + +func (x Permission_Type) String() string { + return proto.EnumName(Permission_Type_name, int32(x)) +} +func (Permission_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorAuth, []int{2, 0} } + +type UserAddOptions struct { + NoPassword bool `protobuf:"varint,1,opt,name=no_password,json=noPassword,proto3" json:"no_password,omitempty"` +} + +func (m *UserAddOptions) Reset() { *m = UserAddOptions{} } +func (m *UserAddOptions) String() string { return proto.CompactTextString(m) } +func (*UserAddOptions) ProtoMessage() {} +func (*UserAddOptions) Descriptor() ([]byte, []int) { return fileDescriptorAuth, []int{0} } + +// User is a single entry in the bucket authUsers +type User struct { + Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Password []byte `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + Roles []string `protobuf:"bytes,3,rep,name=roles" json:"roles,omitempty"` + Options *UserAddOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"` +} + +func (m *User) Reset() { *m = User{} } +func (m *User) String() string { return proto.CompactTextString(m) } +func (*User) ProtoMessage() {} +func (*User) Descriptor() ([]byte, []int) { return fileDescriptorAuth, []int{1} } + +// Permission is a single entity +type Permission struct { + PermType Permission_Type `protobuf:"varint,1,opt,name=permType,proto3,enum=authpb.Permission_Type" json:"permType,omitempty"` + Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + RangeEnd []byte `protobuf:"bytes,3,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"` +} + +func (m *Permission) Reset() { *m = Permission{} } +func (m *Permission) String() string { return proto.CompactTextString(m) } +func (*Permission) ProtoMessage() {} +func (*Permission) Descriptor() ([]byte, []int) { return fileDescriptorAuth, []int{2} } + +// Role is a single entry in the bucket authRoles +type Role struct { + Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + KeyPermission []*Permission `protobuf:"bytes,2,rep,name=keyPermission" json:"keyPermission,omitempty"` +} + +func (m *Role) Reset() { *m = Role{} } +func (m *Role) String() string { return proto.CompactTextString(m) } +func (*Role) ProtoMessage() {} +func (*Role) Descriptor() ([]byte, []int) { return fileDescriptorAuth, []int{3} } + +func init() { + proto.RegisterType((*UserAddOptions)(nil), "authpb.UserAddOptions") + proto.RegisterType((*User)(nil), "authpb.User") + proto.RegisterType((*Permission)(nil), "authpb.Permission") + proto.RegisterType((*Role)(nil), "authpb.Role") + proto.RegisterEnum("authpb.Permission_Type", Permission_Type_name, Permission_Type_value) +} +func (m *UserAddOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UserAddOptions) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.NoPassword { + dAtA[i] = 0x8 + i++ + if m.NoPassword { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *User) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *User) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintAuth(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if len(m.Password) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintAuth(dAtA, i, uint64(len(m.Password))) + i += copy(dAtA[i:], m.Password) + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + dAtA[i] = 0x1a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if m.Options != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintAuth(dAtA, i, uint64(m.Options.Size())) + n1, err := m.Options.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + return i, nil +} + +func (m *Permission) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Permission) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.PermType != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintAuth(dAtA, i, uint64(m.PermType)) + } + if len(m.Key) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintAuth(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if len(m.RangeEnd) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintAuth(dAtA, i, uint64(len(m.RangeEnd))) + i += copy(dAtA[i:], m.RangeEnd) + } + return i, nil +} + +func (m *Role) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Role) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintAuth(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if len(m.KeyPermission) > 0 { + for _, msg := range m.KeyPermission { + dAtA[i] = 0x12 + i++ + i = encodeVarintAuth(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func encodeVarintAuth(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *UserAddOptions) Size() (n int) { + var l int + _ = l + if m.NoPassword { + n += 2 + } + return n +} + +func (m *User) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovAuth(uint64(l)) + } + l = len(m.Password) + if l > 0 { + n += 1 + l + sovAuth(uint64(l)) + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + l = len(s) + n += 1 + l + sovAuth(uint64(l)) + } + } + if m.Options != nil { + l = m.Options.Size() + n += 1 + l + sovAuth(uint64(l)) + } + return n +} + +func (m *Permission) Size() (n int) { + var l int + _ = l + if m.PermType != 0 { + n += 1 + sovAuth(uint64(m.PermType)) + } + l = len(m.Key) + if l > 0 { + n += 1 + l + sovAuth(uint64(l)) + } + l = len(m.RangeEnd) + if l > 0 { + n += 1 + l + sovAuth(uint64(l)) + } + return n +} + +func (m *Role) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovAuth(uint64(l)) + } + if len(m.KeyPermission) > 0 { + for _, e := range m.KeyPermission { + l = e.Size() + n += 1 + l + sovAuth(uint64(l)) + } + } + return n +} + +func sovAuth(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozAuth(x uint64) (n int) { + return sovAuth(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *UserAddOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UserAddOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UserAddOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NoPassword", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NoPassword = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipAuth(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAuth + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *User) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: User: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: User: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAuth + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = append(m.Name[:0], dAtA[iNdEx:postIndex]...) + if m.Name == nil { + m.Name = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAuth + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Password = append(m.Password[:0], dAtA[iNdEx:postIndex]...) + if m.Password == nil { + m.Password = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAuth + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAuth + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Options == nil { + m.Options = &UserAddOptions{} + } + if err := m.Options.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuth(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAuth + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Permission) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Permission: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Permission: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PermType", wireType) + } + m.PermType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PermType |= (Permission_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAuth + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RangeEnd", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAuth + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RangeEnd = append(m.RangeEnd[:0], dAtA[iNdEx:postIndex]...) + if m.RangeEnd == nil { + m.RangeEnd = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuth(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAuth + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Role) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Role: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Role: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAuth + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = append(m.Name[:0], dAtA[iNdEx:postIndex]...) + if m.Name == nil { + m.Name = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KeyPermission", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuth + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAuth + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KeyPermission = append(m.KeyPermission, &Permission{}) + if err := m.KeyPermission[len(m.KeyPermission)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuth(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAuth + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipAuth(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAuth + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAuth + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAuth + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthAuth + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAuth + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipAuth(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthAuth = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowAuth = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("auth.proto", fileDescriptorAuth) } + +var fileDescriptorAuth = []byte{ + // 338 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xcf, 0x4e, 0xea, 0x40, + 0x14, 0xc6, 0x3b, 0xb4, 0x70, 0xdb, 0xc3, 0x85, 0x90, 0x13, 0x72, 0x6f, 0x83, 0x49, 0x6d, 0xba, + 0x6a, 0x5c, 0x54, 0x85, 0x8d, 0x5b, 0x8c, 0x2c, 0x5c, 0x49, 0x26, 0x18, 0x97, 0xa4, 0xa4, 0x13, + 0x24, 0xc0, 0x4c, 0x33, 0x83, 0x31, 0x6c, 0x7c, 0x0e, 0x17, 0x3e, 0x10, 0x4b, 0x1e, 0x41, 0xf0, + 0x45, 0x4c, 0x67, 0xf8, 0x13, 0xa2, 0xbb, 0xef, 0x7c, 0xe7, 0xfb, 0x66, 0x7e, 0x99, 0x01, 0x48, + 0x5f, 0x16, 0xcf, 0x49, 0x2e, 0xc5, 0x42, 0x60, 0xa5, 0xd0, 0xf9, 0xa8, 0xd5, 0x1c, 0x8b, 0xb1, + 0xd0, 0xd6, 0x65, 0xa1, 0xcc, 0x36, 0xba, 0x86, 0xfa, 0xa3, 0x62, 0xb2, 0x9b, 0x65, 0x0f, 0xf9, + 0x62, 0x22, 0xb8, 0xc2, 0x73, 0xa8, 0x72, 0x31, 0xcc, 0x53, 0xa5, 0x5e, 0x85, 0xcc, 0x7c, 0x12, + 0x92, 0xd8, 0xa5, 0xc0, 0x45, 0x7f, 0xe7, 0x44, 0x6f, 0xe0, 0x14, 0x15, 0x44, 0x70, 0x78, 0x3a, + 0x67, 0x3a, 0xf1, 0x97, 0x6a, 0x8d, 0x2d, 0x70, 0x0f, 0xcd, 0x92, 0xf6, 0x0f, 0x33, 0x36, 0xa1, + 0x2c, 0xc5, 0x8c, 0x29, 0xdf, 0x0e, 0xed, 0xd8, 0xa3, 0x66, 0xc0, 0x2b, 0xf8, 0x23, 0xcc, 0xcd, + 0xbe, 0x13, 0x92, 0xb8, 0xda, 0xfe, 0x97, 0x18, 0xe0, 0xe4, 0x94, 0x8b, 0xee, 0x63, 0xd1, 0x07, + 0x01, 0xe8, 0x33, 0x39, 0x9f, 0x28, 0x35, 0x11, 0x1c, 0x3b, 0xe0, 0xe6, 0x4c, 0xce, 0x07, 0xcb, + 0xdc, 0xa0, 0xd4, 0xdb, 0xff, 0xf7, 0x27, 0x1c, 0x53, 0x49, 0xb1, 0xa6, 0x87, 0x20, 0x36, 0xc0, + 0x9e, 0xb2, 0xe5, 0x0e, 0xb1, 0x90, 0x78, 0x06, 0x9e, 0x4c, 0xf9, 0x98, 0x0d, 0x19, 0xcf, 0x7c, + 0xdb, 0xa0, 0x6b, 0xa3, 0xc7, 0xb3, 0xe8, 0x02, 0x1c, 0x5d, 0x73, 0xc1, 0xa1, 0xbd, 0xee, 0x5d, + 0xc3, 0x42, 0x0f, 0xca, 0x4f, 0xf4, 0x7e, 0xd0, 0x6b, 0x10, 0xac, 0x81, 0x57, 0x98, 0x66, 0x2c, + 0x45, 0x03, 0x70, 0xa8, 0x98, 0xb1, 0x5f, 0x9f, 0xe7, 0x06, 0x6a, 0x53, 0xb6, 0x3c, 0x62, 0xf9, + 0xa5, 0xd0, 0x8e, 0xab, 0x6d, 0xfc, 0x09, 0x4c, 0x4f, 0x83, 0xb7, 0xfe, 0x6a, 0x13, 0x58, 0xeb, + 0x4d, 0x60, 0xad, 0xb6, 0x01, 0x59, 0x6f, 0x03, 0xf2, 0xb9, 0x0d, 0xc8, 0xfb, 0x57, 0x60, 0x8d, + 0x2a, 0xfa, 0x23, 0x3b, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x61, 0x66, 0xc6, 0x9d, 0xf4, 0x01, + 0x00, 0x00, +} diff --git a/vendor/go.etcd.io/etcd/auth/authpb/auth.proto b/vendor/go.etcd.io/etcd/auth/authpb/auth.proto new file mode 100644 index 00000000..8f82b7cf --- /dev/null +++ b/vendor/go.etcd.io/etcd/auth/authpb/auth.proto @@ -0,0 +1,42 @@ +syntax = "proto3"; +package authpb; + +import "gogoproto/gogo.proto"; + +option (gogoproto.marshaler_all) = true; +option (gogoproto.sizer_all) = true; +option (gogoproto.unmarshaler_all) = true; +option (gogoproto.goproto_getters_all) = false; +option (gogoproto.goproto_enum_prefix_all) = false; + +message UserAddOptions { + bool no_password = 1; +}; + +// User is a single entry in the bucket authUsers +message User { + bytes name = 1; + bytes password = 2; + repeated string roles = 3; + UserAddOptions options = 4; +} + +// Permission is a single entity +message Permission { + enum Type { + READ = 0; + WRITE = 1; + READWRITE = 2; + } + Type permType = 1; + + bytes key = 2; + bytes range_end = 3; +} + +// Role is a single entry in the bucket authRoles +message Role { + bytes name = 1; + + repeated Permission keyPermission = 2; +} diff --git a/vendor/go.etcd.io/etcd/clientv3/README.md b/vendor/go.etcd.io/etcd/clientv3/README.md new file mode 100644 index 00000000..6c6fe7c6 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/README.md @@ -0,0 +1,85 @@ +# etcd/clientv3 + +[![Docs](https://img.shields.io/badge/docs-latest-green.svg)](https://etcd.io/docs) +[![Godoc](https://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://godoc.org/go.etcd.io/etcd/clientv3) + +`etcd/clientv3` is the official Go etcd client for v3. + +## Install + +```bash +go get go.etcd.io/etcd/clientv3 +``` + +## Get started + +Create client using `clientv3.New`: + +```go +cli, err := clientv3.New(clientv3.Config{ + Endpoints: []string{"localhost:2379", "localhost:22379", "localhost:32379"}, + DialTimeout: 5 * time.Second, +}) +if err != nil { + // handle error! +} +defer cli.Close() +``` + +etcd v3 uses [`gRPC`](https://www.grpc.io) for remote procedure calls. And `clientv3` uses +[`grpc-go`](https://github.com/grpc/grpc-go) to connect to etcd. Make sure to close the client after using it. +If the client is not closed, the connection will have leaky goroutines. To specify client request timeout, +pass `context.WithTimeout` to APIs: + +```go +ctx, cancel := context.WithTimeout(context.Background(), timeout) +resp, err := cli.Put(ctx, "sample_key", "sample_value") +cancel() +if err != nil { + // handle error! +} +// use the response +``` + +For full compatibility, it is recommended to vendor builds using etcd's vendored packages, using tools like `golang/dep`, as in [vendor directories](https://golang.org/cmd/go/#hdr-Vendor_Directories). + +## Error Handling + +etcd client returns 2 types of errors: + +1. context error: canceled or deadline exceeded. +2. gRPC error: see [api/v3rpc/rpctypes](https://godoc.org/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes). + +Here is the example code to handle client errors: + +```go +resp, err := cli.Put(ctx, "", "") +if err != nil { + switch err { + case context.Canceled: + log.Fatalf("ctx is canceled by another routine: %v", err) + case context.DeadlineExceeded: + log.Fatalf("ctx is attached with a deadline is exceeded: %v", err) + case rpctypes.ErrEmptyKey: + log.Fatalf("client-side error: %v", err) + default: + log.Fatalf("bad cluster endpoints, which are not etcd servers: %v", err) + } +} +``` + +## Metrics + +The etcd client optionally exposes RPC metrics through [go-grpc-prometheus](https://github.com/grpc-ecosystem/go-grpc-prometheus). See the [examples](https://github.com/etcd-io/etcd/blob/master/clientv3/example_metrics_test.go). + +## Namespacing + +The [namespace](https://godoc.org/go.etcd.io/etcd/clientv3/namespace) package provides `clientv3` interface wrappers to transparently isolate client requests to a user-defined prefix. + +## Request size limit + +Client request size limit is configurable via `clientv3.Config.MaxCallSendMsgSize` and `MaxCallRecvMsgSize` in bytes. If none given, client request send limit defaults to 2 MiB including gRPC overhead bytes. And receive limit defaults to `math.MaxInt32`. + +## Examples + +More code examples can be found at [GoDoc](https://godoc.org/go.etcd.io/etcd/clientv3). diff --git a/vendor/go.etcd.io/etcd/clientv3/auth.go b/vendor/go.etcd.io/etcd/clientv3/auth.go new file mode 100644 index 00000000..c954f1bf --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/auth.go @@ -0,0 +1,242 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + "fmt" + "strings" + + "go.etcd.io/etcd/auth/authpb" + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + "google.golang.org/grpc" +) + +type ( + AuthEnableResponse pb.AuthEnableResponse + AuthDisableResponse pb.AuthDisableResponse + AuthenticateResponse pb.AuthenticateResponse + AuthUserAddResponse pb.AuthUserAddResponse + AuthUserDeleteResponse pb.AuthUserDeleteResponse + AuthUserChangePasswordResponse pb.AuthUserChangePasswordResponse + AuthUserGrantRoleResponse pb.AuthUserGrantRoleResponse + AuthUserGetResponse pb.AuthUserGetResponse + AuthUserRevokeRoleResponse pb.AuthUserRevokeRoleResponse + AuthRoleAddResponse pb.AuthRoleAddResponse + AuthRoleGrantPermissionResponse pb.AuthRoleGrantPermissionResponse + AuthRoleGetResponse pb.AuthRoleGetResponse + AuthRoleRevokePermissionResponse pb.AuthRoleRevokePermissionResponse + AuthRoleDeleteResponse pb.AuthRoleDeleteResponse + AuthUserListResponse pb.AuthUserListResponse + AuthRoleListResponse pb.AuthRoleListResponse + + PermissionType authpb.Permission_Type + Permission authpb.Permission +) + +const ( + PermRead = authpb.READ + PermWrite = authpb.WRITE + PermReadWrite = authpb.READWRITE +) + +type UserAddOptions authpb.UserAddOptions + +type Auth interface { + // AuthEnable enables auth of an etcd cluster. + AuthEnable(ctx context.Context) (*AuthEnableResponse, error) + + // AuthDisable disables auth of an etcd cluster. + AuthDisable(ctx context.Context) (*AuthDisableResponse, error) + + // UserAdd adds a new user to an etcd cluster. + UserAdd(ctx context.Context, name string, password string) (*AuthUserAddResponse, error) + + // UserAddWithOptions adds a new user to an etcd cluster with some options. + UserAddWithOptions(ctx context.Context, name string, password string, opt *UserAddOptions) (*AuthUserAddResponse, error) + + // UserDelete deletes a user from an etcd cluster. + UserDelete(ctx context.Context, name string) (*AuthUserDeleteResponse, error) + + // UserChangePassword changes a password of a user. + UserChangePassword(ctx context.Context, name string, password string) (*AuthUserChangePasswordResponse, error) + + // UserGrantRole grants a role to a user. + UserGrantRole(ctx context.Context, user string, role string) (*AuthUserGrantRoleResponse, error) + + // UserGet gets a detailed information of a user. + UserGet(ctx context.Context, name string) (*AuthUserGetResponse, error) + + // UserList gets a list of all users. + UserList(ctx context.Context) (*AuthUserListResponse, error) + + // UserRevokeRole revokes a role of a user. + UserRevokeRole(ctx context.Context, name string, role string) (*AuthUserRevokeRoleResponse, error) + + // RoleAdd adds a new role to an etcd cluster. + RoleAdd(ctx context.Context, name string) (*AuthRoleAddResponse, error) + + // RoleGrantPermission grants a permission to a role. + RoleGrantPermission(ctx context.Context, name string, key, rangeEnd string, permType PermissionType) (*AuthRoleGrantPermissionResponse, error) + + // RoleGet gets a detailed information of a role. + RoleGet(ctx context.Context, role string) (*AuthRoleGetResponse, error) + + // RoleList gets a list of all roles. + RoleList(ctx context.Context) (*AuthRoleListResponse, error) + + // RoleRevokePermission revokes a permission from a role. + RoleRevokePermission(ctx context.Context, role string, key, rangeEnd string) (*AuthRoleRevokePermissionResponse, error) + + // RoleDelete deletes a role. + RoleDelete(ctx context.Context, role string) (*AuthRoleDeleteResponse, error) +} + +type authClient struct { + remote pb.AuthClient + callOpts []grpc.CallOption +} + +func NewAuth(c *Client) Auth { + api := &authClient{remote: RetryAuthClient(c)} + if c != nil { + api.callOpts = c.callOpts + } + return api +} + +func (auth *authClient) AuthEnable(ctx context.Context) (*AuthEnableResponse, error) { + resp, err := auth.remote.AuthEnable(ctx, &pb.AuthEnableRequest{}, auth.callOpts...) + return (*AuthEnableResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) AuthDisable(ctx context.Context) (*AuthDisableResponse, error) { + resp, err := auth.remote.AuthDisable(ctx, &pb.AuthDisableRequest{}, auth.callOpts...) + return (*AuthDisableResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) UserAdd(ctx context.Context, name string, password string) (*AuthUserAddResponse, error) { + resp, err := auth.remote.UserAdd(ctx, &pb.AuthUserAddRequest{Name: name, Password: password, Options: &authpb.UserAddOptions{NoPassword: false}}, auth.callOpts...) + return (*AuthUserAddResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) UserAddWithOptions(ctx context.Context, name string, password string, options *UserAddOptions) (*AuthUserAddResponse, error) { + resp, err := auth.remote.UserAdd(ctx, &pb.AuthUserAddRequest{Name: name, Password: password, Options: (*authpb.UserAddOptions)(options)}, auth.callOpts...) + return (*AuthUserAddResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) UserDelete(ctx context.Context, name string) (*AuthUserDeleteResponse, error) { + resp, err := auth.remote.UserDelete(ctx, &pb.AuthUserDeleteRequest{Name: name}, auth.callOpts...) + return (*AuthUserDeleteResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) UserChangePassword(ctx context.Context, name string, password string) (*AuthUserChangePasswordResponse, error) { + resp, err := auth.remote.UserChangePassword(ctx, &pb.AuthUserChangePasswordRequest{Name: name, Password: password}, auth.callOpts...) + return (*AuthUserChangePasswordResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) UserGrantRole(ctx context.Context, user string, role string) (*AuthUserGrantRoleResponse, error) { + resp, err := auth.remote.UserGrantRole(ctx, &pb.AuthUserGrantRoleRequest{User: user, Role: role}, auth.callOpts...) + return (*AuthUserGrantRoleResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) UserGet(ctx context.Context, name string) (*AuthUserGetResponse, error) { + resp, err := auth.remote.UserGet(ctx, &pb.AuthUserGetRequest{Name: name}, auth.callOpts...) + return (*AuthUserGetResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) UserList(ctx context.Context) (*AuthUserListResponse, error) { + resp, err := auth.remote.UserList(ctx, &pb.AuthUserListRequest{}, auth.callOpts...) + return (*AuthUserListResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) UserRevokeRole(ctx context.Context, name string, role string) (*AuthUserRevokeRoleResponse, error) { + resp, err := auth.remote.UserRevokeRole(ctx, &pb.AuthUserRevokeRoleRequest{Name: name, Role: role}, auth.callOpts...) + return (*AuthUserRevokeRoleResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) RoleAdd(ctx context.Context, name string) (*AuthRoleAddResponse, error) { + resp, err := auth.remote.RoleAdd(ctx, &pb.AuthRoleAddRequest{Name: name}, auth.callOpts...) + return (*AuthRoleAddResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) RoleGrantPermission(ctx context.Context, name string, key, rangeEnd string, permType PermissionType) (*AuthRoleGrantPermissionResponse, error) { + perm := &authpb.Permission{ + Key: []byte(key), + RangeEnd: []byte(rangeEnd), + PermType: authpb.Permission_Type(permType), + } + resp, err := auth.remote.RoleGrantPermission(ctx, &pb.AuthRoleGrantPermissionRequest{Name: name, Perm: perm}, auth.callOpts...) + return (*AuthRoleGrantPermissionResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) RoleGet(ctx context.Context, role string) (*AuthRoleGetResponse, error) { + resp, err := auth.remote.RoleGet(ctx, &pb.AuthRoleGetRequest{Role: role}, auth.callOpts...) + return (*AuthRoleGetResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) RoleList(ctx context.Context) (*AuthRoleListResponse, error) { + resp, err := auth.remote.RoleList(ctx, &pb.AuthRoleListRequest{}, auth.callOpts...) + return (*AuthRoleListResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) RoleRevokePermission(ctx context.Context, role string, key, rangeEnd string) (*AuthRoleRevokePermissionResponse, error) { + resp, err := auth.remote.RoleRevokePermission(ctx, &pb.AuthRoleRevokePermissionRequest{Role: role, Key: []byte(key), RangeEnd: []byte(rangeEnd)}, auth.callOpts...) + return (*AuthRoleRevokePermissionResponse)(resp), toErr(ctx, err) +} + +func (auth *authClient) RoleDelete(ctx context.Context, role string) (*AuthRoleDeleteResponse, error) { + resp, err := auth.remote.RoleDelete(ctx, &pb.AuthRoleDeleteRequest{Role: role}, auth.callOpts...) + return (*AuthRoleDeleteResponse)(resp), toErr(ctx, err) +} + +func StrToPermissionType(s string) (PermissionType, error) { + val, ok := authpb.Permission_Type_value[strings.ToUpper(s)] + if ok { + return PermissionType(val), nil + } + return PermissionType(-1), fmt.Errorf("invalid permission type: %s", s) +} + +type authenticator struct { + conn *grpc.ClientConn // conn in-use + remote pb.AuthClient + callOpts []grpc.CallOption +} + +func (auth *authenticator) authenticate(ctx context.Context, name string, password string) (*AuthenticateResponse, error) { + resp, err := auth.remote.Authenticate(ctx, &pb.AuthenticateRequest{Name: name, Password: password}, auth.callOpts...) + return (*AuthenticateResponse)(resp), toErr(ctx, err) +} + +func (auth *authenticator) close() { + auth.conn.Close() +} + +func newAuthenticator(ctx context.Context, target string, opts []grpc.DialOption, c *Client) (*authenticator, error) { + conn, err := grpc.DialContext(ctx, target, opts...) + if err != nil { + return nil, err + } + + api := &authenticator{ + conn: conn, + remote: pb.NewAuthClient(conn), + } + if c != nil { + api.callOpts = c.callOpts + } + return api, nil +} diff --git a/vendor/go.etcd.io/etcd/clientv3/balancer/balancer.go b/vendor/go.etcd.io/etcd/clientv3/balancer/balancer.go new file mode 100644 index 00000000..d02a7eec --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/balancer/balancer.go @@ -0,0 +1,293 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package balancer implements client balancer. +package balancer + +import ( + "strconv" + "sync" + "time" + + "go.etcd.io/etcd/clientv3/balancer/connectivity" + "go.etcd.io/etcd/clientv3/balancer/picker" + + "go.uber.org/zap" + "google.golang.org/grpc/balancer" + grpcconnectivity "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/resolver" + _ "google.golang.org/grpc/resolver/dns" // register DNS resolver + _ "google.golang.org/grpc/resolver/passthrough" // register passthrough resolver +) + +// Config defines balancer configurations. +type Config struct { + // Policy configures balancer policy. + Policy picker.Policy + + // Picker implements gRPC picker. + // Leave empty if "Policy" field is not custom. + // TODO: currently custom policy is not supported. + // Picker picker.Picker + + // Name defines an additional name for balancer. + // Useful for balancer testing to avoid register conflicts. + // If empty, defaults to policy name. + Name string + + // Logger configures balancer logging. + // If nil, logs are discarded. + Logger *zap.Logger +} + +// RegisterBuilder creates and registers a builder. Since this function calls balancer.Register, it +// must be invoked at initialization time. +func RegisterBuilder(cfg Config) { + bb := &builder{cfg} + balancer.Register(bb) + + bb.cfg.Logger.Debug( + "registered balancer", + zap.String("policy", bb.cfg.Policy.String()), + zap.String("name", bb.cfg.Name), + ) +} + +type builder struct { + cfg Config +} + +// Build is called initially when creating "ccBalancerWrapper". +// "grpc.Dial" is called to this client connection. +// Then, resolved addresses will be handled via "HandleResolvedAddrs". +func (b *builder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer { + bb := &baseBalancer{ + id: strconv.FormatInt(time.Now().UnixNano(), 36), + policy: b.cfg.Policy, + name: b.cfg.Name, + lg: b.cfg.Logger, + + addrToSc: make(map[resolver.Address]balancer.SubConn), + scToAddr: make(map[balancer.SubConn]resolver.Address), + scToSt: make(map[balancer.SubConn]grpcconnectivity.State), + + currentConn: nil, + connectivityRecorder: connectivity.New(b.cfg.Logger), + + // initialize picker always returns "ErrNoSubConnAvailable" + picker: picker.NewErr(balancer.ErrNoSubConnAvailable), + } + + // TODO: support multiple connections + bb.mu.Lock() + bb.currentConn = cc + bb.mu.Unlock() + + bb.lg.Info( + "built balancer", + zap.String("balancer-id", bb.id), + zap.String("policy", bb.policy.String()), + zap.String("resolver-target", cc.Target()), + ) + return bb +} + +// Name implements "grpc/balancer.Builder" interface. +func (b *builder) Name() string { return b.cfg.Name } + +// Balancer defines client balancer interface. +type Balancer interface { + // Balancer is called on specified client connection. Client initiates gRPC + // connection with "grpc.Dial(addr, grpc.WithBalancerName)", and then those resolved + // addresses are passed to "grpc/balancer.Balancer.HandleResolvedAddrs". + // For each resolved address, balancer calls "balancer.ClientConn.NewSubConn". + // "grpc/balancer.Balancer.HandleSubConnStateChange" is called when connectivity state + // changes, thus requires failover logic in this method. + balancer.Balancer + + // Picker calls "Pick" for every client request. + picker.Picker +} + +type baseBalancer struct { + id string + policy picker.Policy + name string + lg *zap.Logger + + mu sync.RWMutex + + addrToSc map[resolver.Address]balancer.SubConn + scToAddr map[balancer.SubConn]resolver.Address + scToSt map[balancer.SubConn]grpcconnectivity.State + + currentConn balancer.ClientConn + connectivityRecorder connectivity.Recorder + + picker picker.Picker +} + +// HandleResolvedAddrs implements "grpc/balancer.Balancer" interface. +// gRPC sends initial or updated resolved addresses from "Build". +func (bb *baseBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) { + if err != nil { + bb.lg.Warn("HandleResolvedAddrs called with error", zap.String("balancer-id", bb.id), zap.Error(err)) + return + } + bb.lg.Info("resolved", + zap.String("picker", bb.picker.String()), + zap.String("balancer-id", bb.id), + zap.Strings("addresses", addrsToStrings(addrs)), + ) + + bb.mu.Lock() + defer bb.mu.Unlock() + + resolved := make(map[resolver.Address]struct{}) + for _, addr := range addrs { + resolved[addr] = struct{}{} + if _, ok := bb.addrToSc[addr]; !ok { + sc, err := bb.currentConn.NewSubConn([]resolver.Address{addr}, balancer.NewSubConnOptions{}) + if err != nil { + bb.lg.Warn("NewSubConn failed", zap.String("picker", bb.picker.String()), zap.String("balancer-id", bb.id), zap.Error(err), zap.String("address", addr.Addr)) + continue + } + bb.lg.Info("created subconn", zap.String("address", addr.Addr)) + bb.addrToSc[addr] = sc + bb.scToAddr[sc] = addr + bb.scToSt[sc] = grpcconnectivity.Idle + sc.Connect() + } + } + + for addr, sc := range bb.addrToSc { + if _, ok := resolved[addr]; !ok { + // was removed by resolver or failed to create subconn + bb.currentConn.RemoveSubConn(sc) + delete(bb.addrToSc, addr) + + bb.lg.Info( + "removed subconn", + zap.String("picker", bb.picker.String()), + zap.String("balancer-id", bb.id), + zap.String("address", addr.Addr), + zap.String("subconn", scToString(sc)), + ) + + // Keep the state of this sc in bb.scToSt until sc's state becomes Shutdown. + // The entry will be deleted in HandleSubConnStateChange. + // (DO NOT) delete(bb.scToAddr, sc) + // (DO NOT) delete(bb.scToSt, sc) + } + } +} + +// HandleSubConnStateChange implements "grpc/balancer.Balancer" interface. +func (bb *baseBalancer) HandleSubConnStateChange(sc balancer.SubConn, s grpcconnectivity.State) { + bb.mu.Lock() + defer bb.mu.Unlock() + + old, ok := bb.scToSt[sc] + if !ok { + bb.lg.Warn( + "state change for an unknown subconn", + zap.String("picker", bb.picker.String()), + zap.String("balancer-id", bb.id), + zap.String("subconn", scToString(sc)), + zap.Int("subconn-size", len(bb.scToAddr)), + zap.String("state", s.String()), + ) + return + } + + bb.lg.Info( + "state changed", + zap.String("picker", bb.picker.String()), + zap.String("balancer-id", bb.id), + zap.Bool("connected", s == grpcconnectivity.Ready), + zap.String("subconn", scToString(sc)), + zap.Int("subconn-size", len(bb.scToAddr)), + zap.String("address", bb.scToAddr[sc].Addr), + zap.String("old-state", old.String()), + zap.String("new-state", s.String()), + ) + + bb.scToSt[sc] = s + switch s { + case grpcconnectivity.Idle: + sc.Connect() + case grpcconnectivity.Shutdown: + // When an address was removed by resolver, b called RemoveSubConn but + // kept the sc's state in scToSt. Remove state for this sc here. + delete(bb.scToAddr, sc) + delete(bb.scToSt, sc) + } + + oldAggrState := bb.connectivityRecorder.GetCurrentState() + bb.connectivityRecorder.RecordTransition(old, s) + + // Update balancer picker when one of the following happens: + // - this sc became ready from not-ready + // - this sc became not-ready from ready + // - the aggregated state of balancer became TransientFailure from non-TransientFailure + // - the aggregated state of balancer became non-TransientFailure from TransientFailure + if (s == grpcconnectivity.Ready) != (old == grpcconnectivity.Ready) || + (bb.connectivityRecorder.GetCurrentState() == grpcconnectivity.TransientFailure) != (oldAggrState == grpcconnectivity.TransientFailure) { + bb.updatePicker() + } + + bb.currentConn.UpdateBalancerState(bb.connectivityRecorder.GetCurrentState(), bb.picker) +} + +func (bb *baseBalancer) updatePicker() { + if bb.connectivityRecorder.GetCurrentState() == grpcconnectivity.TransientFailure { + bb.picker = picker.NewErr(balancer.ErrTransientFailure) + bb.lg.Info( + "updated picker to transient error picker", + zap.String("picker", bb.picker.String()), + zap.String("balancer-id", bb.id), + zap.String("policy", bb.policy.String()), + ) + return + } + + // only pass ready subconns to picker + scToAddr := make(map[balancer.SubConn]resolver.Address) + for addr, sc := range bb.addrToSc { + if st, ok := bb.scToSt[sc]; ok && st == grpcconnectivity.Ready { + scToAddr[sc] = addr + } + } + + bb.picker = picker.New(picker.Config{ + Policy: bb.policy, + Logger: bb.lg, + SubConnToResolverAddress: scToAddr, + }) + bb.lg.Info( + "updated picker", + zap.String("picker", bb.picker.String()), + zap.String("balancer-id", bb.id), + zap.String("policy", bb.policy.String()), + zap.Strings("subconn-ready", scsToStrings(scToAddr)), + zap.Int("subconn-size", len(scToAddr)), + ) +} + +// Close implements "grpc/balancer.Balancer" interface. +// Close is a nop because base balancer doesn't have internal state to clean up, +// and it doesn't need to call RemoveSubConn for the SubConns. +func (bb *baseBalancer) Close() { + // TODO +} diff --git a/vendor/go.etcd.io/etcd/clientv3/balancer/connectivity/connectivity.go b/vendor/go.etcd.io/etcd/clientv3/balancer/connectivity/connectivity.go new file mode 100644 index 00000000..4c4ad363 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/balancer/connectivity/connectivity.go @@ -0,0 +1,93 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package connectivity implements client connectivity operations. +package connectivity + +import ( + "sync" + + "go.uber.org/zap" + "google.golang.org/grpc/connectivity" +) + +// Recorder records gRPC connectivity. +type Recorder interface { + GetCurrentState() connectivity.State + RecordTransition(oldState, newState connectivity.State) +} + +// New returns a new Recorder. +func New(lg *zap.Logger) Recorder { + return &recorder{lg: lg} +} + +// recorder takes the connectivity states of multiple SubConns +// and returns one aggregated connectivity state. +// ref. https://github.com/grpc/grpc-go/blob/master/balancer/balancer.go +type recorder struct { + lg *zap.Logger + + mu sync.RWMutex + + cur connectivity.State + + numReady uint64 // Number of addrConns in ready state. + numConnecting uint64 // Number of addrConns in connecting state. + numTransientFailure uint64 // Number of addrConns in transientFailure. +} + +func (rc *recorder) GetCurrentState() (state connectivity.State) { + rc.mu.RLock() + defer rc.mu.RUnlock() + return rc.cur +} + +// RecordTransition records state change happening in subConn and based on that +// it evaluates what aggregated state should be. +// +// - If at least one SubConn in Ready, the aggregated state is Ready; +// - Else if at least one SubConn in Connecting, the aggregated state is Connecting; +// - Else the aggregated state is TransientFailure. +// +// Idle and Shutdown are not considered. +// +// ref. https://github.com/grpc/grpc-go/blob/master/balancer/balancer.go +func (rc *recorder) RecordTransition(oldState, newState connectivity.State) { + rc.mu.Lock() + defer rc.mu.Unlock() + + for idx, state := range []connectivity.State{oldState, newState} { + updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new. + switch state { + case connectivity.Ready: + rc.numReady += updateVal + case connectivity.Connecting: + rc.numConnecting += updateVal + case connectivity.TransientFailure: + rc.numTransientFailure += updateVal + default: + rc.lg.Warn("connectivity recorder received unknown state", zap.String("connectivity-state", state.String())) + } + } + + switch { // must be exclusive, no overlap + case rc.numReady > 0: + rc.cur = connectivity.Ready + case rc.numConnecting > 0: + rc.cur = connectivity.Connecting + default: + rc.cur = connectivity.TransientFailure + } +} diff --git a/vendor/go.etcd.io/etcd/clientv3/balancer/picker/doc.go b/vendor/go.etcd.io/etcd/clientv3/balancer/picker/doc.go new file mode 100644 index 00000000..35dabf55 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/balancer/picker/doc.go @@ -0,0 +1,16 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package picker defines/implements client balancer picker policy. +package picker diff --git a/vendor/go.etcd.io/etcd/clientv3/balancer/picker/err.go b/vendor/go.etcd.io/etcd/clientv3/balancer/picker/err.go new file mode 100644 index 00000000..f4b941d6 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/balancer/picker/err.go @@ -0,0 +1,39 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package picker + +import ( + "context" + + "google.golang.org/grpc/balancer" +) + +// NewErr returns a picker that always returns err on "Pick". +func NewErr(err error) Picker { + return &errPicker{p: Error, err: err} +} + +type errPicker struct { + p Policy + err error +} + +func (ep *errPicker) String() string { + return ep.p.String() +} + +func (ep *errPicker) Pick(context.Context, balancer.PickInfo) (balancer.SubConn, func(balancer.DoneInfo), error) { + return nil, nil, ep.err +} diff --git a/vendor/go.etcd.io/etcd/clientv3/balancer/picker/picker.go b/vendor/go.etcd.io/etcd/clientv3/balancer/picker/picker.go new file mode 100644 index 00000000..bd1a5d25 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/balancer/picker/picker.go @@ -0,0 +1,91 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package picker + +import ( + "fmt" + + "go.uber.org/zap" + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/resolver" +) + +// Picker defines balancer Picker methods. +type Picker interface { + balancer.Picker + String() string +} + +// Config defines picker configuration. +type Config struct { + // Policy specifies etcd clientv3's built in balancer policy. + Policy Policy + + // Logger defines picker logging object. + Logger *zap.Logger + + // SubConnToResolverAddress maps each gRPC sub-connection to an address. + // Basically, it is a list of addresses that the Picker can pick from. + SubConnToResolverAddress map[balancer.SubConn]resolver.Address +} + +// Policy defines balancer picker policy. +type Policy uint8 + +const ( + // Error is error picker policy. + Error Policy = iota + + // RoundrobinBalanced balances loads over multiple endpoints + // and implements failover in roundrobin fashion. + RoundrobinBalanced + + // Custom defines custom balancer picker. + // TODO: custom picker is not supported yet. + Custom +) + +func (p Policy) String() string { + switch p { + case Error: + return "picker-error" + + case RoundrobinBalanced: + return "picker-roundrobin-balanced" + + case Custom: + panic("'custom' picker policy is not supported yet") + + default: + panic(fmt.Errorf("invalid balancer picker policy (%d)", p)) + } +} + +// New creates a new Picker. +func New(cfg Config) Picker { + switch cfg.Policy { + case Error: + panic("'error' picker policy is not supported here; use 'picker.NewErr'") + + case RoundrobinBalanced: + return newRoundrobinBalanced(cfg) + + case Custom: + panic("'custom' picker policy is not supported yet") + + default: + panic(fmt.Errorf("invalid balancer picker policy (%d)", cfg.Policy)) + } +} diff --git a/vendor/go.etcd.io/etcd/clientv3/balancer/picker/roundrobin_balanced.go b/vendor/go.etcd.io/etcd/clientv3/balancer/picker/roundrobin_balanced.go new file mode 100644 index 00000000..e3971ecc --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/balancer/picker/roundrobin_balanced.go @@ -0,0 +1,95 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package picker + +import ( + "context" + "sync" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/resolver" +) + +// newRoundrobinBalanced returns a new roundrobin balanced picker. +func newRoundrobinBalanced(cfg Config) Picker { + scs := make([]balancer.SubConn, 0, len(cfg.SubConnToResolverAddress)) + for sc := range cfg.SubConnToResolverAddress { + scs = append(scs, sc) + } + return &rrBalanced{ + p: RoundrobinBalanced, + lg: cfg.Logger, + scs: scs, + scToAddr: cfg.SubConnToResolverAddress, + } +} + +type rrBalanced struct { + p Policy + + lg *zap.Logger + + mu sync.RWMutex + next int + scs []balancer.SubConn + scToAddr map[balancer.SubConn]resolver.Address +} + +func (rb *rrBalanced) String() string { return rb.p.String() } + +// Pick is called for every client request. +func (rb *rrBalanced) Pick(ctx context.Context, opts balancer.PickInfo) (balancer.SubConn, func(balancer.DoneInfo), error) { + rb.mu.RLock() + n := len(rb.scs) + rb.mu.RUnlock() + if n == 0 { + return nil, nil, balancer.ErrNoSubConnAvailable + } + + rb.mu.Lock() + cur := rb.next + sc := rb.scs[cur] + picked := rb.scToAddr[sc].Addr + rb.next = (rb.next + 1) % len(rb.scs) + rb.mu.Unlock() + + rb.lg.Debug( + "picked", + zap.String("picker", rb.p.String()), + zap.String("address", picked), + zap.Int("subconn-index", cur), + zap.Int("subconn-size", n), + ) + + doneFunc := func(info balancer.DoneInfo) { + // TODO: error handling? + fss := []zapcore.Field{ + zap.Error(info.Err), + zap.String("picker", rb.p.String()), + zap.String("address", picked), + zap.Bool("success", info.Err == nil), + zap.Bool("bytes-sent", info.BytesSent), + zap.Bool("bytes-received", info.BytesReceived), + } + if info.Err == nil { + rb.lg.Debug("balancer done", fss...) + } else { + rb.lg.Warn("balancer failed", fss...) + } + } + return sc, doneFunc, nil +} diff --git a/vendor/go.etcd.io/etcd/clientv3/balancer/resolver/endpoint/endpoint.go b/vendor/go.etcd.io/etcd/clientv3/balancer/resolver/endpoint/endpoint.go new file mode 100644 index 00000000..2837bd41 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/balancer/resolver/endpoint/endpoint.go @@ -0,0 +1,247 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package endpoint resolves etcd entpoints using grpc targets of the form 'endpoint:///'. +package endpoint + +import ( + "context" + "fmt" + "net" + "net/url" + "strings" + "sync" + + "google.golang.org/grpc/resolver" +) + +const scheme = "endpoint" + +var ( + targetPrefix = fmt.Sprintf("%s://", scheme) + + bldr *builder +) + +func init() { + bldr = &builder{ + resolverGroups: make(map[string]*ResolverGroup), + } + resolver.Register(bldr) +} + +type builder struct { + mu sync.RWMutex + resolverGroups map[string]*ResolverGroup +} + +// NewResolverGroup creates a new ResolverGroup with the given id. +func NewResolverGroup(id string) (*ResolverGroup, error) { + return bldr.newResolverGroup(id) +} + +// ResolverGroup keeps all endpoints of resolvers using a common endpoint:/// target +// up-to-date. +type ResolverGroup struct { + mu sync.RWMutex + id string + endpoints []string + resolvers []*Resolver +} + +func (e *ResolverGroup) addResolver(r *Resolver) { + e.mu.Lock() + addrs := epsToAddrs(e.endpoints...) + e.resolvers = append(e.resolvers, r) + e.mu.Unlock() + r.cc.NewAddress(addrs) +} + +func (e *ResolverGroup) removeResolver(r *Resolver) { + e.mu.Lock() + for i, er := range e.resolvers { + if er == r { + e.resolvers = append(e.resolvers[:i], e.resolvers[i+1:]...) + break + } + } + e.mu.Unlock() +} + +// SetEndpoints updates the endpoints for ResolverGroup. All registered resolver are updated +// immediately with the new endpoints. +func (e *ResolverGroup) SetEndpoints(endpoints []string) { + addrs := epsToAddrs(endpoints...) + e.mu.Lock() + e.endpoints = endpoints + for _, r := range e.resolvers { + r.cc.NewAddress(addrs) + } + e.mu.Unlock() +} + +// Target constructs a endpoint target using the endpoint id of the ResolverGroup. +func (e *ResolverGroup) Target(endpoint string) string { + return Target(e.id, endpoint) +} + +// Target constructs a endpoint resolver target. +func Target(id, endpoint string) string { + return fmt.Sprintf("%s://%s/%s", scheme, id, endpoint) +} + +// IsTarget checks if a given target string in an endpoint resolver target. +func IsTarget(target string) bool { + return strings.HasPrefix(target, "endpoint://") +} + +func (e *ResolverGroup) Close() { + bldr.close(e.id) +} + +// Build creates or reuses an etcd resolver for the etcd cluster name identified by the authority part of the target. +func (b *builder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { + if len(target.Authority) < 1 { + return nil, fmt.Errorf("'etcd' target scheme requires non-empty authority identifying etcd cluster being routed to") + } + id := target.Authority + es, err := b.getResolverGroup(id) + if err != nil { + return nil, fmt.Errorf("failed to build resolver: %v", err) + } + r := &Resolver{ + endpointID: id, + cc: cc, + } + es.addResolver(r) + return r, nil +} + +func (b *builder) newResolverGroup(id string) (*ResolverGroup, error) { + b.mu.RLock() + _, ok := b.resolverGroups[id] + b.mu.RUnlock() + if ok { + return nil, fmt.Errorf("Endpoint already exists for id: %s", id) + } + + es := &ResolverGroup{id: id} + b.mu.Lock() + b.resolverGroups[id] = es + b.mu.Unlock() + return es, nil +} + +func (b *builder) getResolverGroup(id string) (*ResolverGroup, error) { + b.mu.RLock() + es, ok := b.resolverGroups[id] + b.mu.RUnlock() + if !ok { + return nil, fmt.Errorf("ResolverGroup not found for id: %s", id) + } + return es, nil +} + +func (b *builder) close(id string) { + b.mu.Lock() + delete(b.resolverGroups, id) + b.mu.Unlock() +} + +func (b *builder) Scheme() string { + return scheme +} + +// Resolver provides a resolver for a single etcd cluster, identified by name. +type Resolver struct { + endpointID string + cc resolver.ClientConn + sync.RWMutex +} + +// TODO: use balancer.epsToAddrs +func epsToAddrs(eps ...string) (addrs []resolver.Address) { + addrs = make([]resolver.Address, 0, len(eps)) + for _, ep := range eps { + addrs = append(addrs, resolver.Address{Addr: ep}) + } + return addrs +} + +func (*Resolver) ResolveNow(o resolver.ResolveNowOptions) {} + +func (r *Resolver) Close() { + es, err := bldr.getResolverGroup(r.endpointID) + if err != nil { + return + } + es.removeResolver(r) +} + +// ParseEndpoint endpoint parses an endpoint of the form +// (http|https)://*|(unix|unixs)://) +// and returns a protocol ('tcp' or 'unix'), +// host (or filepath if a unix socket), +// scheme (http, https, unix, unixs). +func ParseEndpoint(endpoint string) (proto string, host string, scheme string) { + proto = "tcp" + host = endpoint + url, uerr := url.Parse(endpoint) + if uerr != nil || !strings.Contains(endpoint, "://") { + return proto, host, scheme + } + scheme = url.Scheme + + // strip scheme:// prefix since grpc dials by host + host = url.Host + switch url.Scheme { + case "http", "https": + case "unix", "unixs": + proto = "unix" + host = url.Host + url.Path + default: + proto, host = "", "" + } + return proto, host, scheme +} + +// ParseTarget parses a endpoint:/// string and returns the parsed id and endpoint. +// If the target is malformed, an error is returned. +func ParseTarget(target string) (string, string, error) { + noPrefix := strings.TrimPrefix(target, targetPrefix) + if noPrefix == target { + return "", "", fmt.Errorf("malformed target, %s prefix is required: %s", targetPrefix, target) + } + parts := strings.SplitN(noPrefix, "/", 2) + if len(parts) != 2 { + return "", "", fmt.Errorf("malformed target, expected %s:///, but got %s", scheme, target) + } + return parts[0], parts[1], nil +} + +// Dialer dials a endpoint using net.Dialer. +// Context cancelation and timeout are supported. +func Dialer(ctx context.Context, dialEp string) (net.Conn, error) { + proto, host, _ := ParseEndpoint(dialEp) + select { + case <-ctx.Done(): + return nil, ctx.Err() + default: + } + dialer := &net.Dialer{} + if deadline, ok := ctx.Deadline(); ok { + dialer.Deadline = deadline + } + return dialer.DialContext(ctx, proto, host) +} diff --git a/vendor/go.etcd.io/etcd/clientv3/balancer/utils.go b/vendor/go.etcd.io/etcd/clientv3/balancer/utils.go new file mode 100644 index 00000000..48eb8750 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/balancer/utils.go @@ -0,0 +1,68 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package balancer + +import ( + "fmt" + "net/url" + "sort" + "sync/atomic" + "time" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/resolver" +) + +func scToString(sc balancer.SubConn) string { + return fmt.Sprintf("%p", sc) +} + +func scsToStrings(scs map[balancer.SubConn]resolver.Address) (ss []string) { + ss = make([]string, 0, len(scs)) + for sc, a := range scs { + ss = append(ss, fmt.Sprintf("%s (%s)", a.Addr, scToString(sc))) + } + sort.Strings(ss) + return ss +} + +func addrsToStrings(addrs []resolver.Address) (ss []string) { + ss = make([]string, len(addrs)) + for i := range addrs { + ss[i] = addrs[i].Addr + } + sort.Strings(ss) + return ss +} + +func epsToAddrs(eps ...string) (addrs []resolver.Address) { + addrs = make([]resolver.Address, 0, len(eps)) + for _, ep := range eps { + u, err := url.Parse(ep) + if err != nil { + addrs = append(addrs, resolver.Address{Addr: ep, Type: resolver.Backend}) + continue + } + addrs = append(addrs, resolver.Address{Addr: u.Host, Type: resolver.Backend}) + } + return addrs +} + +var genN = new(uint32) + +func genName() string { + now := time.Now().UnixNano() + return fmt.Sprintf("%X%X", now, atomic.AddUint32(genN, 1)) +} diff --git a/vendor/go.etcd.io/etcd/clientv3/client.go b/vendor/go.etcd.io/etcd/clientv3/client.go new file mode 100644 index 00000000..a35ec679 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/client.go @@ -0,0 +1,664 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + "errors" + "fmt" + "net" + "os" + "strconv" + "strings" + "sync" + "time" + + "github.com/google/uuid" + "go.etcd.io/etcd/clientv3/balancer" + "go.etcd.io/etcd/clientv3/balancer/picker" + "go.etcd.io/etcd/clientv3/balancer/resolver/endpoint" + "go.etcd.io/etcd/clientv3/credentials" + "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" + "go.etcd.io/etcd/pkg/logutil" + "go.uber.org/zap" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + grpccredentials "google.golang.org/grpc/credentials" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/status" +) + +var ( + ErrNoAvailableEndpoints = errors.New("etcdclient: no available endpoints") + ErrOldCluster = errors.New("etcdclient: old cluster version") + + roundRobinBalancerName = fmt.Sprintf("etcd-%s", picker.RoundrobinBalanced.String()) +) + +func init() { + lg := zap.NewNop() + if os.Getenv("ETCD_CLIENT_DEBUG") != "" { + lcfg := logutil.DefaultZapLoggerConfig + lcfg.Level = zap.NewAtomicLevelAt(zap.DebugLevel) + + var err error + lg, err = lcfg.Build() // info level logging + if err != nil { + panic(err) + } + } + + // TODO: support custom balancer + balancer.RegisterBuilder(balancer.Config{ + Policy: picker.RoundrobinBalanced, + Name: roundRobinBalancerName, + Logger: lg, + }) +} + +// Client provides and manages an etcd v3 client session. +type Client struct { + Cluster + KV + Lease + Watcher + Auth + Maintenance + + conn *grpc.ClientConn + + cfg Config + creds grpccredentials.TransportCredentials + resolverGroup *endpoint.ResolverGroup + mu *sync.RWMutex + + ctx context.Context + cancel context.CancelFunc + + // Username is a user name for authentication. + Username string + // Password is a password for authentication. + Password string + authTokenBundle credentials.Bundle + + callOpts []grpc.CallOption + + lg *zap.Logger +} + +// New creates a new etcdv3 client from a given configuration. +func New(cfg Config) (*Client, error) { + if len(cfg.Endpoints) == 0 { + return nil, ErrNoAvailableEndpoints + } + + return newClient(&cfg) +} + +// NewCtxClient creates a client with a context but no underlying grpc +// connection. This is useful for embedded cases that override the +// service interface implementations and do not need connection management. +func NewCtxClient(ctx context.Context) *Client { + cctx, cancel := context.WithCancel(ctx) + return &Client{ctx: cctx, cancel: cancel} +} + +// NewFromURL creates a new etcdv3 client from a URL. +func NewFromURL(url string) (*Client, error) { + return New(Config{Endpoints: []string{url}}) +} + +// NewFromURLs creates a new etcdv3 client from URLs. +func NewFromURLs(urls []string) (*Client, error) { + return New(Config{Endpoints: urls}) +} + +// Close shuts down the client's etcd connections. +func (c *Client) Close() error { + c.cancel() + if c.Watcher != nil { + c.Watcher.Close() + } + if c.Lease != nil { + c.Lease.Close() + } + if c.resolverGroup != nil { + c.resolverGroup.Close() + } + if c.conn != nil { + return toErr(c.ctx, c.conn.Close()) + } + return c.ctx.Err() +} + +// Ctx is a context for "out of band" messages (e.g., for sending +// "clean up" message when another context is canceled). It is +// canceled on client Close(). +func (c *Client) Ctx() context.Context { return c.ctx } + +// Endpoints lists the registered endpoints for the client. +func (c *Client) Endpoints() []string { + // copy the slice; protect original endpoints from being changed + c.mu.RLock() + defer c.mu.RUnlock() + eps := make([]string, len(c.cfg.Endpoints)) + copy(eps, c.cfg.Endpoints) + return eps +} + +// SetEndpoints updates client's endpoints. +func (c *Client) SetEndpoints(eps ...string) { + c.mu.Lock() + defer c.mu.Unlock() + c.cfg.Endpoints = eps + c.resolverGroup.SetEndpoints(eps) +} + +// Sync synchronizes client's endpoints with the known endpoints from the etcd membership. +func (c *Client) Sync(ctx context.Context) error { + mresp, err := c.MemberList(ctx) + if err != nil { + return err + } + var eps []string + for _, m := range mresp.Members { + eps = append(eps, m.ClientURLs...) + } + c.SetEndpoints(eps...) + return nil +} + +func (c *Client) autoSync() { + if c.cfg.AutoSyncInterval == time.Duration(0) { + return + } + + for { + select { + case <-c.ctx.Done(): + return + case <-time.After(c.cfg.AutoSyncInterval): + ctx, cancel := context.WithTimeout(c.ctx, 5*time.Second) + err := c.Sync(ctx) + cancel() + if err != nil && err != c.ctx.Err() { + lg.Lvl(4).Infof("Auto sync endpoints failed: %v", err) + } + } + } +} + +func (c *Client) processCreds(scheme string) (creds grpccredentials.TransportCredentials) { + creds = c.creds + switch scheme { + case "unix": + case "http": + creds = nil + case "https", "unixs": + if creds != nil { + break + } + creds = credentials.NewBundle(credentials.Config{}).TransportCredentials() + default: + creds = nil + } + return creds +} + +// dialSetupOpts gives the dial opts prior to any authentication. +func (c *Client) dialSetupOpts(creds grpccredentials.TransportCredentials, dopts ...grpc.DialOption) (opts []grpc.DialOption, err error) { + if c.cfg.DialKeepAliveTime > 0 { + params := keepalive.ClientParameters{ + Time: c.cfg.DialKeepAliveTime, + Timeout: c.cfg.DialKeepAliveTimeout, + PermitWithoutStream: c.cfg.PermitWithoutStream, + } + opts = append(opts, grpc.WithKeepaliveParams(params)) + } + opts = append(opts, dopts...) + + dialer := endpoint.Dialer + if creds != nil { + opts = append(opts, grpc.WithTransportCredentials(creds)) + // gRPC load balancer workaround. See credentials.transportCredential for details. + if credsDialer, ok := creds.(TransportCredentialsWithDialer); ok { + dialer = credsDialer.Dialer + } + } else { + opts = append(opts, grpc.WithInsecure()) + } + opts = append(opts, grpc.WithContextDialer(dialer)) + + // Interceptor retry and backoff. + // TODO: Replace all of clientv3/retry.go with interceptor based retry, or with + // https://github.com/grpc/proposal/blob/master/A6-client-retries.md#retry-policy + // once it is available. + rrBackoff := withBackoff(c.roundRobinQuorumBackoff(defaultBackoffWaitBetween, defaultBackoffJitterFraction)) + opts = append(opts, + // Disable stream retry by default since go-grpc-middleware/retry does not support client streams. + // Streams that are safe to retry are enabled individually. + grpc.WithStreamInterceptor(c.streamClientInterceptor(c.lg, withMax(0), rrBackoff)), + grpc.WithUnaryInterceptor(c.unaryClientInterceptor(c.lg, withMax(defaultUnaryMaxRetries), rrBackoff)), + ) + + return opts, nil +} + +// Dial connects to a single endpoint using the client's config. +func (c *Client) Dial(ep string) (*grpc.ClientConn, error) { + creds, err := c.directDialCreds(ep) + if err != nil { + return nil, err + } + // Use the grpc passthrough resolver to directly dial a single endpoint. + // This resolver passes through the 'unix' and 'unixs' endpoints schemes used + // by etcd without modification, allowing us to directly dial endpoints and + // using the same dial functions that we use for load balancer dialing. + return c.dial(fmt.Sprintf("passthrough:///%s", ep), creds) +} + +func (c *Client) getToken(ctx context.Context) error { + var err error // return last error in a case of fail + var auth *authenticator + + eps := c.Endpoints() + for _, ep := range eps { + // use dial options without dopts to avoid reusing the client balancer + var dOpts []grpc.DialOption + _, host, _ := endpoint.ParseEndpoint(ep) + target := c.resolverGroup.Target(host) + creds := c.dialWithBalancerCreds(ep) + dOpts, err = c.dialSetupOpts(creds, c.cfg.DialOptions...) + if err != nil { + err = fmt.Errorf("failed to configure auth dialer: %v", err) + continue + } + dOpts = append(dOpts, grpc.WithBalancerName(roundRobinBalancerName)) + auth, err = newAuthenticator(ctx, target, dOpts, c) + if err != nil { + continue + } + defer auth.close() + + var resp *AuthenticateResponse + resp, err = auth.authenticate(ctx, c.Username, c.Password) + if err != nil { + // return err without retrying other endpoints + if err == rpctypes.ErrAuthNotEnabled { + return err + } + continue + } + + c.authTokenBundle.UpdateAuthToken(resp.Token) + return nil + } + + return err +} + +// dialWithBalancer dials the client's current load balanced resolver group. The scheme of the host +// of the provided endpoint determines the scheme used for all endpoints of the client connection. +func (c *Client) dialWithBalancer(ep string, dopts ...grpc.DialOption) (*grpc.ClientConn, error) { + _, host, _ := endpoint.ParseEndpoint(ep) + target := c.resolverGroup.Target(host) + creds := c.dialWithBalancerCreds(ep) + return c.dial(target, creds, dopts...) +} + +// dial configures and dials any grpc balancer target. +func (c *Client) dial(target string, creds grpccredentials.TransportCredentials, dopts ...grpc.DialOption) (*grpc.ClientConn, error) { + opts, err := c.dialSetupOpts(creds, dopts...) + if err != nil { + return nil, fmt.Errorf("failed to configure dialer: %v", err) + } + + if c.Username != "" && c.Password != "" { + c.authTokenBundle = credentials.NewBundle(credentials.Config{}) + + ctx, cancel := c.ctx, func() {} + if c.cfg.DialTimeout > 0 { + ctx, cancel = context.WithTimeout(ctx, c.cfg.DialTimeout) + } + + err = c.getToken(ctx) + if err != nil { + if toErr(ctx, err) != rpctypes.ErrAuthNotEnabled { + if err == ctx.Err() && ctx.Err() != c.ctx.Err() { + err = context.DeadlineExceeded + } + cancel() + return nil, err + } + } else { + opts = append(opts, grpc.WithPerRPCCredentials(c.authTokenBundle.PerRPCCredentials())) + } + cancel() + } + + opts = append(opts, c.cfg.DialOptions...) + + dctx := c.ctx + if c.cfg.DialTimeout > 0 { + var cancel context.CancelFunc + dctx, cancel = context.WithTimeout(c.ctx, c.cfg.DialTimeout) + defer cancel() // TODO: Is this right for cases where grpc.WithBlock() is not set on the dial options? + } + + conn, err := grpc.DialContext(dctx, target, opts...) + if err != nil { + return nil, err + } + return conn, nil +} + +func (c *Client) directDialCreds(ep string) (grpccredentials.TransportCredentials, error) { + _, host, scheme := endpoint.ParseEndpoint(ep) + creds := c.creds + if len(scheme) != 0 { + creds = c.processCreds(scheme) + if creds != nil { + clone := creds.Clone() + // Set the server name must to the endpoint hostname without port since grpc + // otherwise attempts to check if x509 cert is valid for the full endpoint + // including the scheme and port, which fails. + overrideServerName, _, err := net.SplitHostPort(host) + if err != nil { + // Either the host didn't have a port or the host could not be parsed. Either way, continue with the + // original host string. + overrideServerName = host + } + clone.OverrideServerName(overrideServerName) + creds = clone + } + } + return creds, nil +} + +func (c *Client) dialWithBalancerCreds(ep string) grpccredentials.TransportCredentials { + _, _, scheme := endpoint.ParseEndpoint(ep) + creds := c.creds + if len(scheme) != 0 { + creds = c.processCreds(scheme) + } + return creds +} + +func newClient(cfg *Config) (*Client, error) { + if cfg == nil { + cfg = &Config{} + } + var creds grpccredentials.TransportCredentials + if cfg.TLS != nil { + creds = credentials.NewBundle(credentials.Config{TLSConfig: cfg.TLS}).TransportCredentials() + } + + // use a temporary skeleton client to bootstrap first connection + baseCtx := context.TODO() + if cfg.Context != nil { + baseCtx = cfg.Context + } + + ctx, cancel := context.WithCancel(baseCtx) + client := &Client{ + conn: nil, + cfg: *cfg, + creds: creds, + ctx: ctx, + cancel: cancel, + mu: new(sync.RWMutex), + callOpts: defaultCallOpts, + } + + lcfg := logutil.DefaultZapLoggerConfig + if cfg.LogConfig != nil { + lcfg = *cfg.LogConfig + } + var err error + client.lg, err = lcfg.Build() + if err != nil { + return nil, err + } + + if cfg.Username != "" && cfg.Password != "" { + client.Username = cfg.Username + client.Password = cfg.Password + } + if cfg.MaxCallSendMsgSize > 0 || cfg.MaxCallRecvMsgSize > 0 { + if cfg.MaxCallRecvMsgSize > 0 && cfg.MaxCallSendMsgSize > cfg.MaxCallRecvMsgSize { + return nil, fmt.Errorf("gRPC message recv limit (%d bytes) must be greater than send limit (%d bytes)", cfg.MaxCallRecvMsgSize, cfg.MaxCallSendMsgSize) + } + callOpts := []grpc.CallOption{ + defaultFailFast, + defaultMaxCallSendMsgSize, + defaultMaxCallRecvMsgSize, + } + if cfg.MaxCallSendMsgSize > 0 { + callOpts[1] = grpc.MaxCallSendMsgSize(cfg.MaxCallSendMsgSize) + } + if cfg.MaxCallRecvMsgSize > 0 { + callOpts[2] = grpc.MaxCallRecvMsgSize(cfg.MaxCallRecvMsgSize) + } + client.callOpts = callOpts + } + + // Prepare a 'endpoint:///' resolver for the client and create a endpoint target to pass + // to dial so the client knows to use this resolver. + client.resolverGroup, err = endpoint.NewResolverGroup(fmt.Sprintf("client-%s", uuid.New().String())) + if err != nil { + client.cancel() + return nil, err + } + client.resolverGroup.SetEndpoints(cfg.Endpoints) + + if len(cfg.Endpoints) < 1 { + return nil, fmt.Errorf("at least one Endpoint must is required in client config") + } + dialEndpoint := cfg.Endpoints[0] + + // Use a provided endpoint target so that for https:// without any tls config given, then + // grpc will assume the certificate server name is the endpoint host. + conn, err := client.dialWithBalancer(dialEndpoint, grpc.WithBalancerName(roundRobinBalancerName)) + if err != nil { + client.cancel() + client.resolverGroup.Close() + return nil, err + } + // TODO: With the old grpc balancer interface, we waited until the dial timeout + // for the balancer to be ready. Is there an equivalent wait we should do with the new grpc balancer interface? + client.conn = conn + + client.Cluster = NewCluster(client) + client.KV = NewKV(client) + client.Lease = NewLease(client) + client.Watcher = NewWatcher(client) + client.Auth = NewAuth(client) + client.Maintenance = NewMaintenance(client) + + if cfg.RejectOldCluster { + if err := client.checkVersion(); err != nil { + client.Close() + return nil, err + } + } + + go client.autoSync() + return client, nil +} + +// roundRobinQuorumBackoff retries against quorum between each backoff. +// This is intended for use with a round robin load balancer. +func (c *Client) roundRobinQuorumBackoff(waitBetween time.Duration, jitterFraction float64) backoffFunc { + return func(attempt uint) time.Duration { + // after each round robin across quorum, backoff for our wait between duration + n := uint(len(c.Endpoints())) + quorum := (n/2 + 1) + if attempt%quorum == 0 { + c.lg.Debug("backoff", zap.Uint("attempt", attempt), zap.Uint("quorum", quorum), zap.Duration("waitBetween", waitBetween), zap.Float64("jitterFraction", jitterFraction)) + return jitterUp(waitBetween, jitterFraction) + } + c.lg.Debug("backoff skipped", zap.Uint("attempt", attempt), zap.Uint("quorum", quorum)) + return 0 + } +} + +func (c *Client) checkVersion() (err error) { + var wg sync.WaitGroup + + eps := c.Endpoints() + errc := make(chan error, len(eps)) + ctx, cancel := context.WithCancel(c.ctx) + if c.cfg.DialTimeout > 0 { + cancel() + ctx, cancel = context.WithTimeout(c.ctx, c.cfg.DialTimeout) + } + + wg.Add(len(eps)) + for _, ep := range eps { + // if cluster is current, any endpoint gives a recent version + go func(e string) { + defer wg.Done() + resp, rerr := c.Status(ctx, e) + if rerr != nil { + errc <- rerr + return + } + vs := strings.Split(resp.Version, ".") + maj, min := 0, 0 + if len(vs) >= 2 { + var serr error + if maj, serr = strconv.Atoi(vs[0]); serr != nil { + errc <- serr + return + } + if min, serr = strconv.Atoi(vs[1]); serr != nil { + errc <- serr + return + } + } + if maj < 3 || (maj == 3 && min < 2) { + rerr = ErrOldCluster + } + errc <- rerr + }(ep) + } + // wait for success + for range eps { + if err = <-errc; err == nil { + break + } + } + cancel() + wg.Wait() + return err +} + +// ActiveConnection returns the current in-use connection +func (c *Client) ActiveConnection() *grpc.ClientConn { return c.conn } + +// isHaltErr returns true if the given error and context indicate no forward +// progress can be made, even after reconnecting. +func isHaltErr(ctx context.Context, err error) bool { + if ctx != nil && ctx.Err() != nil { + return true + } + if err == nil { + return false + } + ev, _ := status.FromError(err) + // Unavailable codes mean the system will be right back. + // (e.g., can't connect, lost leader) + // Treat Internal codes as if something failed, leaving the + // system in an inconsistent state, but retrying could make progress. + // (e.g., failed in middle of send, corrupted frame) + // TODO: are permanent Internal errors possible from grpc? + return ev.Code() != codes.Unavailable && ev.Code() != codes.Internal +} + +// isUnavailableErr returns true if the given error is an unavailable error +func isUnavailableErr(ctx context.Context, err error) bool { + if ctx != nil && ctx.Err() != nil { + return false + } + if err == nil { + return false + } + ev, ok := status.FromError(err) + if ok { + // Unavailable codes mean the system will be right back. + // (e.g., can't connect, lost leader) + return ev.Code() == codes.Unavailable + } + return false +} + +func toErr(ctx context.Context, err error) error { + if err == nil { + return nil + } + err = rpctypes.Error(err) + if _, ok := err.(rpctypes.EtcdError); ok { + return err + } + if ev, ok := status.FromError(err); ok { + code := ev.Code() + switch code { + case codes.DeadlineExceeded: + fallthrough + case codes.Canceled: + if ctx.Err() != nil { + err = ctx.Err() + } + } + } + return err +} + +func canceledByCaller(stopCtx context.Context, err error) bool { + if stopCtx.Err() == nil || err == nil { + return false + } + + return err == context.Canceled || err == context.DeadlineExceeded +} + +// IsConnCanceled returns true, if error is from a closed gRPC connection. +// ref. https://github.com/grpc/grpc-go/pull/1854 +func IsConnCanceled(err error) bool { + if err == nil { + return false + } + + // >= gRPC v1.23.x + s, ok := status.FromError(err) + if ok { + // connection is canceled or server has already closed the connection + return s.Code() == codes.Canceled || s.Message() == "transport is closing" + } + + // >= gRPC v1.10.x + if err == context.Canceled { + return true + } + + // <= gRPC v1.7.x returns 'errors.New("grpc: the client connection is closing")' + return strings.Contains(err.Error(), "grpc: the client connection is closing") +} + +// TransportCredentialsWithDialer is for a gRPC load balancer workaround. See credentials.transportCredential for details. +type TransportCredentialsWithDialer interface { + grpccredentials.TransportCredentials + Dialer(ctx context.Context, dialEp string) (net.Conn, error) +} diff --git a/vendor/go.etcd.io/etcd/clientv3/cluster.go b/vendor/go.etcd.io/etcd/clientv3/cluster.go new file mode 100644 index 00000000..ce97e5c8 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/cluster.go @@ -0,0 +1,141 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + "go.etcd.io/etcd/pkg/types" + + "google.golang.org/grpc" +) + +type ( + Member pb.Member + MemberListResponse pb.MemberListResponse + MemberAddResponse pb.MemberAddResponse + MemberRemoveResponse pb.MemberRemoveResponse + MemberUpdateResponse pb.MemberUpdateResponse + MemberPromoteResponse pb.MemberPromoteResponse +) + +type Cluster interface { + // MemberList lists the current cluster membership. + MemberList(ctx context.Context) (*MemberListResponse, error) + + // MemberAdd adds a new member into the cluster. + MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) + + // MemberAddAsLearner adds a new learner member into the cluster. + MemberAddAsLearner(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) + + // MemberRemove removes an existing member from the cluster. + MemberRemove(ctx context.Context, id uint64) (*MemberRemoveResponse, error) + + // MemberUpdate updates the peer addresses of the member. + MemberUpdate(ctx context.Context, id uint64, peerAddrs []string) (*MemberUpdateResponse, error) + + // MemberPromote promotes a member from raft learner (non-voting) to raft voting member. + MemberPromote(ctx context.Context, id uint64) (*MemberPromoteResponse, error) +} + +type cluster struct { + remote pb.ClusterClient + callOpts []grpc.CallOption +} + +func NewCluster(c *Client) Cluster { + api := &cluster{remote: RetryClusterClient(c)} + if c != nil { + api.callOpts = c.callOpts + } + return api +} + +func NewClusterFromClusterClient(remote pb.ClusterClient, c *Client) Cluster { + api := &cluster{remote: remote} + if c != nil { + api.callOpts = c.callOpts + } + return api +} + +func (c *cluster) MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) { + return c.memberAdd(ctx, peerAddrs, false) +} + +func (c *cluster) MemberAddAsLearner(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) { + return c.memberAdd(ctx, peerAddrs, true) +} + +func (c *cluster) memberAdd(ctx context.Context, peerAddrs []string, isLearner bool) (*MemberAddResponse, error) { + // fail-fast before panic in rafthttp + if _, err := types.NewURLs(peerAddrs); err != nil { + return nil, err + } + + r := &pb.MemberAddRequest{ + PeerURLs: peerAddrs, + IsLearner: isLearner, + } + resp, err := c.remote.MemberAdd(ctx, r, c.callOpts...) + if err != nil { + return nil, toErr(ctx, err) + } + return (*MemberAddResponse)(resp), nil +} + +func (c *cluster) MemberRemove(ctx context.Context, id uint64) (*MemberRemoveResponse, error) { + r := &pb.MemberRemoveRequest{ID: id} + resp, err := c.remote.MemberRemove(ctx, r, c.callOpts...) + if err != nil { + return nil, toErr(ctx, err) + } + return (*MemberRemoveResponse)(resp), nil +} + +func (c *cluster) MemberUpdate(ctx context.Context, id uint64, peerAddrs []string) (*MemberUpdateResponse, error) { + // fail-fast before panic in rafthttp + if _, err := types.NewURLs(peerAddrs); err != nil { + return nil, err + } + + // it is safe to retry on update. + r := &pb.MemberUpdateRequest{ID: id, PeerURLs: peerAddrs} + resp, err := c.remote.MemberUpdate(ctx, r, c.callOpts...) + if err == nil { + return (*MemberUpdateResponse)(resp), nil + } + return nil, toErr(ctx, err) +} + +func (c *cluster) MemberList(ctx context.Context) (*MemberListResponse, error) { + // it is safe to retry on list. + resp, err := c.remote.MemberList(ctx, &pb.MemberListRequest{}, c.callOpts...) + if err == nil { + return (*MemberListResponse)(resp), nil + } + return nil, toErr(ctx, err) +} + +func (c *cluster) MemberPromote(ctx context.Context, id uint64) (*MemberPromoteResponse, error) { + r := &pb.MemberPromoteRequest{ID: id} + resp, err := c.remote.MemberPromote(ctx, r, c.callOpts...) + if err != nil { + return nil, toErr(ctx, err) + } + return (*MemberPromoteResponse)(resp), nil +} diff --git a/vendor/go.etcd.io/etcd/clientv3/compact_op.go b/vendor/go.etcd.io/etcd/clientv3/compact_op.go new file mode 100644 index 00000000..5779713d --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/compact_op.go @@ -0,0 +1,51 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" +) + +// CompactOp represents a compact operation. +type CompactOp struct { + revision int64 + physical bool +} + +// CompactOption configures compact operation. +type CompactOption func(*CompactOp) + +func (op *CompactOp) applyCompactOpts(opts []CompactOption) { + for _, opt := range opts { + opt(op) + } +} + +// OpCompact wraps slice CompactOption to create a CompactOp. +func OpCompact(rev int64, opts ...CompactOption) CompactOp { + ret := CompactOp{revision: rev} + ret.applyCompactOpts(opts) + return ret +} + +func (op CompactOp) toRequest() *pb.CompactionRequest { + return &pb.CompactionRequest{Revision: op.revision, Physical: op.physical} +} + +// WithCompactPhysical makes Compact wait until all compacted entries are +// removed from the etcd server's storage. +func WithCompactPhysical() CompactOption { + return func(op *CompactOp) { op.physical = true } +} diff --git a/vendor/go.etcd.io/etcd/clientv3/compare.go b/vendor/go.etcd.io/etcd/clientv3/compare.go new file mode 100644 index 00000000..01ed68e9 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/compare.go @@ -0,0 +1,140 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" +) + +type CompareTarget int +type CompareResult int + +const ( + CompareVersion CompareTarget = iota + CompareCreated + CompareModified + CompareValue +) + +type Cmp pb.Compare + +func Compare(cmp Cmp, result string, v interface{}) Cmp { + var r pb.Compare_CompareResult + + switch result { + case "=": + r = pb.Compare_EQUAL + case "!=": + r = pb.Compare_NOT_EQUAL + case ">": + r = pb.Compare_GREATER + case "<": + r = pb.Compare_LESS + default: + panic("Unknown result op") + } + + cmp.Result = r + switch cmp.Target { + case pb.Compare_VALUE: + val, ok := v.(string) + if !ok { + panic("bad compare value") + } + cmp.TargetUnion = &pb.Compare_Value{Value: []byte(val)} + case pb.Compare_VERSION: + cmp.TargetUnion = &pb.Compare_Version{Version: mustInt64(v)} + case pb.Compare_CREATE: + cmp.TargetUnion = &pb.Compare_CreateRevision{CreateRevision: mustInt64(v)} + case pb.Compare_MOD: + cmp.TargetUnion = &pb.Compare_ModRevision{ModRevision: mustInt64(v)} + case pb.Compare_LEASE: + cmp.TargetUnion = &pb.Compare_Lease{Lease: mustInt64orLeaseID(v)} + default: + panic("Unknown compare type") + } + return cmp +} + +func Value(key string) Cmp { + return Cmp{Key: []byte(key), Target: pb.Compare_VALUE} +} + +func Version(key string) Cmp { + return Cmp{Key: []byte(key), Target: pb.Compare_VERSION} +} + +func CreateRevision(key string) Cmp { + return Cmp{Key: []byte(key), Target: pb.Compare_CREATE} +} + +func ModRevision(key string) Cmp { + return Cmp{Key: []byte(key), Target: pb.Compare_MOD} +} + +// LeaseValue compares a key's LeaseID to a value of your choosing. The empty +// LeaseID is 0, otherwise known as `NoLease`. +func LeaseValue(key string) Cmp { + return Cmp{Key: []byte(key), Target: pb.Compare_LEASE} +} + +// KeyBytes returns the byte slice holding with the comparison key. +func (cmp *Cmp) KeyBytes() []byte { return cmp.Key } + +// WithKeyBytes sets the byte slice for the comparison key. +func (cmp *Cmp) WithKeyBytes(key []byte) { cmp.Key = key } + +// ValueBytes returns the byte slice holding the comparison value, if any. +func (cmp *Cmp) ValueBytes() []byte { + if tu, ok := cmp.TargetUnion.(*pb.Compare_Value); ok { + return tu.Value + } + return nil +} + +// WithValueBytes sets the byte slice for the comparison's value. +func (cmp *Cmp) WithValueBytes(v []byte) { cmp.TargetUnion.(*pb.Compare_Value).Value = v } + +// WithRange sets the comparison to scan the range [key, end). +func (cmp Cmp) WithRange(end string) Cmp { + cmp.RangeEnd = []byte(end) + return cmp +} + +// WithPrefix sets the comparison to scan all keys prefixed by the key. +func (cmp Cmp) WithPrefix() Cmp { + cmp.RangeEnd = getPrefix(cmp.Key) + return cmp +} + +// mustInt64 panics if val isn't an int or int64. It returns an int64 otherwise. +func mustInt64(val interface{}) int64 { + if v, ok := val.(int64); ok { + return v + } + if v, ok := val.(int); ok { + return int64(v) + } + panic("bad value") +} + +// mustInt64orLeaseID panics if val isn't a LeaseID, int or int64. It returns an +// int64 otherwise. +func mustInt64orLeaseID(val interface{}) int64 { + if v, ok := val.(LeaseID); ok { + return int64(v) + } + return mustInt64(val) +} diff --git a/vendor/go.etcd.io/etcd/clientv3/concurrency/doc.go b/vendor/go.etcd.io/etcd/clientv3/concurrency/doc.go new file mode 100644 index 00000000..dcdbf511 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/concurrency/doc.go @@ -0,0 +1,17 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package concurrency implements concurrency operations on top of +// etcd such as distributed locks, barriers, and elections. +package concurrency diff --git a/vendor/go.etcd.io/etcd/clientv3/concurrency/election.go b/vendor/go.etcd.io/etcd/clientv3/concurrency/election.go new file mode 100644 index 00000000..2521db6a --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/concurrency/election.go @@ -0,0 +1,254 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package concurrency + +import ( + "context" + "errors" + "fmt" + + v3 "go.etcd.io/etcd/clientv3" + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + "go.etcd.io/etcd/mvcc/mvccpb" +) + +var ( + ErrElectionNotLeader = errors.New("election: not leader") + ErrElectionNoLeader = errors.New("election: no leader") +) + +type Election struct { + session *Session + + keyPrefix string + + leaderKey string + leaderRev int64 + leaderSession *Session + hdr *pb.ResponseHeader +} + +// NewElection returns a new election on a given key prefix. +func NewElection(s *Session, pfx string) *Election { + return &Election{session: s, keyPrefix: pfx + "/"} +} + +// ResumeElection initializes an election with a known leader. +func ResumeElection(s *Session, pfx string, leaderKey string, leaderRev int64) *Election { + return &Election{ + keyPrefix: pfx, + session: s, + leaderKey: leaderKey, + leaderRev: leaderRev, + leaderSession: s, + } +} + +// Campaign puts a value as eligible for the election on the prefix +// key. +// Multiple sessions can participate in the election for the +// same prefix, but only one can be the leader at a time. +// +// If the context is 'context.TODO()/context.Background()', the Campaign +// will continue to be blocked for other keys to be deleted, unless server +// returns a non-recoverable error (e.g. ErrCompacted). +// Otherwise, until the context is not cancelled or timed-out, Campaign will +// continue to be blocked until it becomes the leader. +func (e *Election) Campaign(ctx context.Context, val string) error { + s := e.session + client := e.session.Client() + + k := fmt.Sprintf("%s%x", e.keyPrefix, s.Lease()) + txn := client.Txn(ctx).If(v3.Compare(v3.CreateRevision(k), "=", 0)) + txn = txn.Then(v3.OpPut(k, val, v3.WithLease(s.Lease()))) + txn = txn.Else(v3.OpGet(k)) + resp, err := txn.Commit() + if err != nil { + return err + } + e.leaderKey, e.leaderRev, e.leaderSession = k, resp.Header.Revision, s + if !resp.Succeeded { + kv := resp.Responses[0].GetResponseRange().Kvs[0] + e.leaderRev = kv.CreateRevision + if string(kv.Value) != val { + if err = e.Proclaim(ctx, val); err != nil { + e.Resign(ctx) + return err + } + } + } + + _, err = waitDeletes(ctx, client, e.keyPrefix, e.leaderRev-1) + if err != nil { + // clean up in case of context cancel + select { + case <-ctx.Done(): + e.Resign(client.Ctx()) + default: + e.leaderSession = nil + } + return err + } + e.hdr = resp.Header + + return nil +} + +// Proclaim lets the leader announce a new value without another election. +func (e *Election) Proclaim(ctx context.Context, val string) error { + if e.leaderSession == nil { + return ErrElectionNotLeader + } + client := e.session.Client() + cmp := v3.Compare(v3.CreateRevision(e.leaderKey), "=", e.leaderRev) + txn := client.Txn(ctx).If(cmp) + txn = txn.Then(v3.OpPut(e.leaderKey, val, v3.WithLease(e.leaderSession.Lease()))) + tresp, terr := txn.Commit() + if terr != nil { + return terr + } + if !tresp.Succeeded { + e.leaderKey = "" + return ErrElectionNotLeader + } + + e.hdr = tresp.Header + return nil +} + +// Resign lets a leader start a new election. +func (e *Election) Resign(ctx context.Context) (err error) { + if e.leaderSession == nil { + return nil + } + client := e.session.Client() + cmp := v3.Compare(v3.CreateRevision(e.leaderKey), "=", e.leaderRev) + resp, err := client.Txn(ctx).If(cmp).Then(v3.OpDelete(e.leaderKey)).Commit() + if err == nil { + e.hdr = resp.Header + } + e.leaderKey = "" + e.leaderSession = nil + return err +} + +// Leader returns the leader value for the current election. +func (e *Election) Leader(ctx context.Context) (*v3.GetResponse, error) { + client := e.session.Client() + resp, err := client.Get(ctx, e.keyPrefix, v3.WithFirstCreate()...) + if err != nil { + return nil, err + } else if len(resp.Kvs) == 0 { + // no leader currently elected + return nil, ErrElectionNoLeader + } + return resp, nil +} + +// Observe returns a channel that reliably observes ordered leader proposals +// as GetResponse values on every current elected leader key. It will not +// necessarily fetch all historical leader updates, but will always post the +// most recent leader value. +// +// The channel closes when the context is canceled or the underlying watcher +// is otherwise disrupted. +func (e *Election) Observe(ctx context.Context) <-chan v3.GetResponse { + retc := make(chan v3.GetResponse) + go e.observe(ctx, retc) + return retc +} + +func (e *Election) observe(ctx context.Context, ch chan<- v3.GetResponse) { + client := e.session.Client() + + defer close(ch) + for { + resp, err := client.Get(ctx, e.keyPrefix, v3.WithFirstCreate()...) + if err != nil { + return + } + + var kv *mvccpb.KeyValue + var hdr *pb.ResponseHeader + + if len(resp.Kvs) == 0 { + cctx, cancel := context.WithCancel(ctx) + // wait for first key put on prefix + opts := []v3.OpOption{v3.WithRev(resp.Header.Revision), v3.WithPrefix()} + wch := client.Watch(cctx, e.keyPrefix, opts...) + for kv == nil { + wr, ok := <-wch + if !ok || wr.Err() != nil { + cancel() + return + } + // only accept puts; a delete will make observe() spin + for _, ev := range wr.Events { + if ev.Type == mvccpb.PUT { + hdr, kv = &wr.Header, ev.Kv + // may have multiple revs; hdr.rev = the last rev + // set to kv's rev in case batch has multiple Puts + hdr.Revision = kv.ModRevision + break + } + } + } + cancel() + } else { + hdr, kv = resp.Header, resp.Kvs[0] + } + + select { + case ch <- v3.GetResponse{Header: hdr, Kvs: []*mvccpb.KeyValue{kv}}: + case <-ctx.Done(): + return + } + + cctx, cancel := context.WithCancel(ctx) + wch := client.Watch(cctx, string(kv.Key), v3.WithRev(hdr.Revision+1)) + keyDeleted := false + for !keyDeleted { + wr, ok := <-wch + if !ok { + cancel() + return + } + for _, ev := range wr.Events { + if ev.Type == mvccpb.DELETE { + keyDeleted = true + break + } + resp.Header = &wr.Header + resp.Kvs = []*mvccpb.KeyValue{ev.Kv} + select { + case ch <- *resp: + case <-cctx.Done(): + cancel() + return + } + } + } + cancel() + } +} + +// Key returns the leader key if elected, empty string otherwise. +func (e *Election) Key() string { return e.leaderKey } + +// Rev returns the leader key's creation revision, if elected. +func (e *Election) Rev() int64 { return e.leaderRev } + +// Header is the response header from the last successful election proposal. +func (e *Election) Header() *pb.ResponseHeader { return e.hdr } diff --git a/vendor/go.etcd.io/etcd/clientv3/concurrency/key.go b/vendor/go.etcd.io/etcd/clientv3/concurrency/key.go new file mode 100644 index 00000000..e4cf7751 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/concurrency/key.go @@ -0,0 +1,65 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package concurrency + +import ( + "context" + "fmt" + + v3 "go.etcd.io/etcd/clientv3" + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + "go.etcd.io/etcd/mvcc/mvccpb" +) + +func waitDelete(ctx context.Context, client *v3.Client, key string, rev int64) error { + cctx, cancel := context.WithCancel(ctx) + defer cancel() + + var wr v3.WatchResponse + wch := client.Watch(cctx, key, v3.WithRev(rev)) + for wr = range wch { + for _, ev := range wr.Events { + if ev.Type == mvccpb.DELETE { + return nil + } + } + } + if err := wr.Err(); err != nil { + return err + } + if err := ctx.Err(); err != nil { + return err + } + return fmt.Errorf("lost watcher waiting for delete") +} + +// waitDeletes efficiently waits until all keys matching the prefix and no greater +// than the create revision. +func waitDeletes(ctx context.Context, client *v3.Client, pfx string, maxCreateRev int64) (*pb.ResponseHeader, error) { + getOpts := append(v3.WithLastCreate(), v3.WithMaxCreateRev(maxCreateRev)) + for { + resp, err := client.Get(ctx, pfx, getOpts...) + if err != nil { + return nil, err + } + if len(resp.Kvs) == 0 { + return resp.Header, nil + } + lastKey := string(resp.Kvs[0].Key) + if err = waitDelete(ctx, client, lastKey, resp.Header.Revision); err != nil { + return nil, err + } + } +} diff --git a/vendor/go.etcd.io/etcd/clientv3/concurrency/mutex.go b/vendor/go.etcd.io/etcd/clientv3/concurrency/mutex.go new file mode 100644 index 00000000..01353419 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/concurrency/mutex.go @@ -0,0 +1,117 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package concurrency + +import ( + "context" + "fmt" + "sync" + + v3 "go.etcd.io/etcd/clientv3" + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" +) + +// Mutex implements the sync Locker interface with etcd +type Mutex struct { + s *Session + + pfx string + myKey string + myRev int64 + hdr *pb.ResponseHeader +} + +func NewMutex(s *Session, pfx string) *Mutex { + return &Mutex{s, pfx + "/", "", -1, nil} +} + +// Lock locks the mutex with a cancelable context. If the context is canceled +// while trying to acquire the lock, the mutex tries to clean its stale lock entry. +func (m *Mutex) Lock(ctx context.Context) error { + s := m.s + client := m.s.Client() + + m.myKey = fmt.Sprintf("%s%x", m.pfx, s.Lease()) + cmp := v3.Compare(v3.CreateRevision(m.myKey), "=", 0) + // put self in lock waiters via myKey; oldest waiter holds lock + put := v3.OpPut(m.myKey, "", v3.WithLease(s.Lease())) + // reuse key in case this session already holds the lock + get := v3.OpGet(m.myKey) + // fetch current holder to complete uncontended path with only one RPC + getOwner := v3.OpGet(m.pfx, v3.WithFirstCreate()...) + resp, err := client.Txn(ctx).If(cmp).Then(put, getOwner).Else(get, getOwner).Commit() + if err != nil { + return err + } + m.myRev = resp.Header.Revision + if !resp.Succeeded { + m.myRev = resp.Responses[0].GetResponseRange().Kvs[0].CreateRevision + } + // if no key on prefix / the minimum rev is key, already hold the lock + ownerKey := resp.Responses[1].GetResponseRange().Kvs + if len(ownerKey) == 0 || ownerKey[0].CreateRevision == m.myRev { + m.hdr = resp.Header + return nil + } + + // wait for deletion revisions prior to myKey + hdr, werr := waitDeletes(ctx, client, m.pfx, m.myRev-1) + // release lock key if wait failed + if werr != nil { + m.Unlock(client.Ctx()) + } else { + m.hdr = hdr + } + return werr +} + +func (m *Mutex) Unlock(ctx context.Context) error { + client := m.s.Client() + if _, err := client.Delete(ctx, m.myKey); err != nil { + return err + } + m.myKey = "\x00" + m.myRev = -1 + return nil +} + +func (m *Mutex) IsOwner() v3.Cmp { + return v3.Compare(v3.CreateRevision(m.myKey), "=", m.myRev) +} + +func (m *Mutex) Key() string { return m.myKey } + +// Header is the response header received from etcd on acquiring the lock. +func (m *Mutex) Header() *pb.ResponseHeader { return m.hdr } + +type lockerMutex struct{ *Mutex } + +func (lm *lockerMutex) Lock() { + client := lm.s.Client() + if err := lm.Mutex.Lock(client.Ctx()); err != nil { + panic(err) + } +} +func (lm *lockerMutex) Unlock() { + client := lm.s.Client() + if err := lm.Mutex.Unlock(client.Ctx()); err != nil { + panic(err) + } +} + +// NewLocker creates a sync.Locker backed by an etcd mutex. +func NewLocker(s *Session, pfx string) sync.Locker { + return &lockerMutex{NewMutex(s, pfx)} +} diff --git a/vendor/go.etcd.io/etcd/clientv3/concurrency/session.go b/vendor/go.etcd.io/etcd/clientv3/concurrency/session.go new file mode 100644 index 00000000..97eb7631 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/concurrency/session.go @@ -0,0 +1,141 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package concurrency + +import ( + "context" + "time" + + v3 "go.etcd.io/etcd/clientv3" +) + +const defaultSessionTTL = 60 + +// Session represents a lease kept alive for the lifetime of a client. +// Fault-tolerant applications may use sessions to reason about liveness. +type Session struct { + client *v3.Client + opts *sessionOptions + id v3.LeaseID + + cancel context.CancelFunc + donec <-chan struct{} +} + +// NewSession gets the leased session for a client. +func NewSession(client *v3.Client, opts ...SessionOption) (*Session, error) { + ops := &sessionOptions{ttl: defaultSessionTTL, ctx: client.Ctx()} + for _, opt := range opts { + opt(ops) + } + + id := ops.leaseID + if id == v3.NoLease { + resp, err := client.Grant(ops.ctx, int64(ops.ttl)) + if err != nil { + return nil, err + } + id = resp.ID + } + + ctx, cancel := context.WithCancel(ops.ctx) + keepAlive, err := client.KeepAlive(ctx, id) + if err != nil || keepAlive == nil { + cancel() + return nil, err + } + + donec := make(chan struct{}) + s := &Session{client: client, opts: ops, id: id, cancel: cancel, donec: donec} + + // keep the lease alive until client error or cancelled context + go func() { + defer close(donec) + for range keepAlive { + // eat messages until keep alive channel closes + } + }() + + return s, nil +} + +// Client is the etcd client that is attached to the session. +func (s *Session) Client() *v3.Client { + return s.client +} + +// Lease is the lease ID for keys bound to the session. +func (s *Session) Lease() v3.LeaseID { return s.id } + +// Done returns a channel that closes when the lease is orphaned, expires, or +// is otherwise no longer being refreshed. +func (s *Session) Done() <-chan struct{} { return s.donec } + +// Orphan ends the refresh for the session lease. This is useful +// in case the state of the client connection is indeterminate (revoke +// would fail) or when transferring lease ownership. +func (s *Session) Orphan() { + s.cancel() + <-s.donec +} + +// Close orphans the session and revokes the session lease. +func (s *Session) Close() error { + s.Orphan() + // if revoke takes longer than the ttl, lease is expired anyway + ctx, cancel := context.WithTimeout(s.opts.ctx, time.Duration(s.opts.ttl)*time.Second) + _, err := s.client.Revoke(ctx, s.id) + cancel() + return err +} + +type sessionOptions struct { + ttl int + leaseID v3.LeaseID + ctx context.Context +} + +// SessionOption configures Session. +type SessionOption func(*sessionOptions) + +// WithTTL configures the session's TTL in seconds. +// If TTL is <= 0, the default 60 seconds TTL will be used. +func WithTTL(ttl int) SessionOption { + return func(so *sessionOptions) { + if ttl > 0 { + so.ttl = ttl + } + } +} + +// WithLease specifies the existing leaseID to be used for the session. +// This is useful in process restart scenario, for example, to reclaim +// leadership from an election prior to restart. +func WithLease(leaseID v3.LeaseID) SessionOption { + return func(so *sessionOptions) { + so.leaseID = leaseID + } +} + +// WithContext assigns a context to the session instead of defaulting to +// using the client context. This is useful for canceling NewSession and +// Close operations immediately without having to close the client. If the +// context is canceled before Close() completes, the session's lease will be +// abandoned and left to expire instead of being revoked. +func WithContext(ctx context.Context) SessionOption { + return func(so *sessionOptions) { + so.ctx = ctx + } +} diff --git a/vendor/go.etcd.io/etcd/clientv3/concurrency/stm.go b/vendor/go.etcd.io/etcd/clientv3/concurrency/stm.go new file mode 100644 index 00000000..ee115107 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/concurrency/stm.go @@ -0,0 +1,387 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package concurrency + +import ( + "context" + "math" + + v3 "go.etcd.io/etcd/clientv3" +) + +// STM is an interface for software transactional memory. +type STM interface { + // Get returns the value for a key and inserts the key in the txn's read set. + // If Get fails, it aborts the transaction with an error, never returning. + Get(key ...string) string + // Put adds a value for a key to the write set. + Put(key, val string, opts ...v3.OpOption) + // Rev returns the revision of a key in the read set. + Rev(key string) int64 + // Del deletes a key. + Del(key string) + + // commit attempts to apply the txn's changes to the server. + commit() *v3.TxnResponse + reset() +} + +// Isolation is an enumeration of transactional isolation levels which +// describes how transactions should interfere and conflict. +type Isolation int + +const ( + // SerializableSnapshot provides serializable isolation and also checks + // for write conflicts. + SerializableSnapshot Isolation = iota + // Serializable reads within the same transaction attempt return data + // from the at the revision of the first read. + Serializable + // RepeatableReads reads within the same transaction attempt always + // return the same data. + RepeatableReads + // ReadCommitted reads keys from any committed revision. + ReadCommitted +) + +// stmError safely passes STM errors through panic to the STM error channel. +type stmError struct{ err error } + +type stmOptions struct { + iso Isolation + ctx context.Context + prefetch []string +} + +type stmOption func(*stmOptions) + +// WithIsolation specifies the transaction isolation level. +func WithIsolation(lvl Isolation) stmOption { + return func(so *stmOptions) { so.iso = lvl } +} + +// WithAbortContext specifies the context for permanently aborting the transaction. +func WithAbortContext(ctx context.Context) stmOption { + return func(so *stmOptions) { so.ctx = ctx } +} + +// WithPrefetch is a hint to prefetch a list of keys before trying to apply. +// If an STM transaction will unconditionally fetch a set of keys, prefetching +// those keys will save the round-trip cost from requesting each key one by one +// with Get(). +func WithPrefetch(keys ...string) stmOption { + return func(so *stmOptions) { so.prefetch = append(so.prefetch, keys...) } +} + +// NewSTM initiates a new STM instance, using serializable snapshot isolation by default. +func NewSTM(c *v3.Client, apply func(STM) error, so ...stmOption) (*v3.TxnResponse, error) { + opts := &stmOptions{ctx: c.Ctx()} + for _, f := range so { + f(opts) + } + if len(opts.prefetch) != 0 { + f := apply + apply = func(s STM) error { + s.Get(opts.prefetch...) + return f(s) + } + } + return runSTM(mkSTM(c, opts), apply) +} + +func mkSTM(c *v3.Client, opts *stmOptions) STM { + switch opts.iso { + case SerializableSnapshot: + s := &stmSerializable{ + stm: stm{client: c, ctx: opts.ctx}, + prefetch: make(map[string]*v3.GetResponse), + } + s.conflicts = func() []v3.Cmp { + return append(s.rset.cmps(), s.wset.cmps(s.rset.first()+1)...) + } + return s + case Serializable: + s := &stmSerializable{ + stm: stm{client: c, ctx: opts.ctx}, + prefetch: make(map[string]*v3.GetResponse), + } + s.conflicts = func() []v3.Cmp { return s.rset.cmps() } + return s + case RepeatableReads: + s := &stm{client: c, ctx: opts.ctx, getOpts: []v3.OpOption{v3.WithSerializable()}} + s.conflicts = func() []v3.Cmp { return s.rset.cmps() } + return s + case ReadCommitted: + s := &stm{client: c, ctx: opts.ctx, getOpts: []v3.OpOption{v3.WithSerializable()}} + s.conflicts = func() []v3.Cmp { return nil } + return s + default: + panic("unsupported stm") + } +} + +type stmResponse struct { + resp *v3.TxnResponse + err error +} + +func runSTM(s STM, apply func(STM) error) (*v3.TxnResponse, error) { + outc := make(chan stmResponse, 1) + go func() { + defer func() { + if r := recover(); r != nil { + e, ok := r.(stmError) + if !ok { + // client apply panicked + panic(r) + } + outc <- stmResponse{nil, e.err} + } + }() + var out stmResponse + for { + s.reset() + if out.err = apply(s); out.err != nil { + break + } + if out.resp = s.commit(); out.resp != nil { + break + } + } + outc <- out + }() + r := <-outc + return r.resp, r.err +} + +// stm implements repeatable-read software transactional memory over etcd +type stm struct { + client *v3.Client + ctx context.Context + // rset holds read key values and revisions + rset readSet + // wset holds overwritten keys and their values + wset writeSet + // getOpts are the opts used for gets + getOpts []v3.OpOption + // conflicts computes the current conflicts on the txn + conflicts func() []v3.Cmp +} + +type stmPut struct { + val string + op v3.Op +} + +type readSet map[string]*v3.GetResponse + +func (rs readSet) add(keys []string, txnresp *v3.TxnResponse) { + for i, resp := range txnresp.Responses { + rs[keys[i]] = (*v3.GetResponse)(resp.GetResponseRange()) + } +} + +// first returns the store revision from the first fetch +func (rs readSet) first() int64 { + ret := int64(math.MaxInt64 - 1) + for _, resp := range rs { + if rev := resp.Header.Revision; rev < ret { + ret = rev + } + } + return ret +} + +// cmps guards the txn from updates to read set +func (rs readSet) cmps() []v3.Cmp { + cmps := make([]v3.Cmp, 0, len(rs)) + for k, rk := range rs { + cmps = append(cmps, isKeyCurrent(k, rk)) + } + return cmps +} + +type writeSet map[string]stmPut + +func (ws writeSet) get(keys ...string) *stmPut { + for _, key := range keys { + if wv, ok := ws[key]; ok { + return &wv + } + } + return nil +} + +// cmps returns a cmp list testing no writes have happened past rev +func (ws writeSet) cmps(rev int64) []v3.Cmp { + cmps := make([]v3.Cmp, 0, len(ws)) + for key := range ws { + cmps = append(cmps, v3.Compare(v3.ModRevision(key), "<", rev)) + } + return cmps +} + +// puts is the list of ops for all pending writes +func (ws writeSet) puts() []v3.Op { + puts := make([]v3.Op, 0, len(ws)) + for _, v := range ws { + puts = append(puts, v.op) + } + return puts +} + +func (s *stm) Get(keys ...string) string { + if wv := s.wset.get(keys...); wv != nil { + return wv.val + } + return respToValue(s.fetch(keys...)) +} + +func (s *stm) Put(key, val string, opts ...v3.OpOption) { + s.wset[key] = stmPut{val, v3.OpPut(key, val, opts...)} +} + +func (s *stm) Del(key string) { s.wset[key] = stmPut{"", v3.OpDelete(key)} } + +func (s *stm) Rev(key string) int64 { + if resp := s.fetch(key); resp != nil && len(resp.Kvs) != 0 { + return resp.Kvs[0].ModRevision + } + return 0 +} + +func (s *stm) commit() *v3.TxnResponse { + txnresp, err := s.client.Txn(s.ctx).If(s.conflicts()...).Then(s.wset.puts()...).Commit() + if err != nil { + panic(stmError{err}) + } + if txnresp.Succeeded { + return txnresp + } + return nil +} + +func (s *stm) fetch(keys ...string) *v3.GetResponse { + if len(keys) == 0 { + return nil + } + ops := make([]v3.Op, len(keys)) + for i, key := range keys { + if resp, ok := s.rset[key]; ok { + return resp + } + ops[i] = v3.OpGet(key, s.getOpts...) + } + txnresp, err := s.client.Txn(s.ctx).Then(ops...).Commit() + if err != nil { + panic(stmError{err}) + } + s.rset.add(keys, txnresp) + return (*v3.GetResponse)(txnresp.Responses[0].GetResponseRange()) +} + +func (s *stm) reset() { + s.rset = make(map[string]*v3.GetResponse) + s.wset = make(map[string]stmPut) +} + +type stmSerializable struct { + stm + prefetch map[string]*v3.GetResponse +} + +func (s *stmSerializable) Get(keys ...string) string { + if wv := s.wset.get(keys...); wv != nil { + return wv.val + } + firstRead := len(s.rset) == 0 + for _, key := range keys { + if resp, ok := s.prefetch[key]; ok { + delete(s.prefetch, key) + s.rset[key] = resp + } + } + resp := s.stm.fetch(keys...) + if firstRead { + // txn's base revision is defined by the first read + s.getOpts = []v3.OpOption{ + v3.WithRev(resp.Header.Revision), + v3.WithSerializable(), + } + } + return respToValue(resp) +} + +func (s *stmSerializable) Rev(key string) int64 { + s.Get(key) + return s.stm.Rev(key) +} + +func (s *stmSerializable) gets() ([]string, []v3.Op) { + keys := make([]string, 0, len(s.rset)) + ops := make([]v3.Op, 0, len(s.rset)) + for k := range s.rset { + keys = append(keys, k) + ops = append(ops, v3.OpGet(k)) + } + return keys, ops +} + +func (s *stmSerializable) commit() *v3.TxnResponse { + keys, getops := s.gets() + txn := s.client.Txn(s.ctx).If(s.conflicts()...).Then(s.wset.puts()...) + // use Else to prefetch keys in case of conflict to save a round trip + txnresp, err := txn.Else(getops...).Commit() + if err != nil { + panic(stmError{err}) + } + if txnresp.Succeeded { + return txnresp + } + // load prefetch with Else data + s.rset.add(keys, txnresp) + s.prefetch = s.rset + s.getOpts = nil + return nil +} + +func isKeyCurrent(k string, r *v3.GetResponse) v3.Cmp { + if len(r.Kvs) != 0 { + return v3.Compare(v3.ModRevision(k), "=", r.Kvs[0].ModRevision) + } + return v3.Compare(v3.ModRevision(k), "=", 0) +} + +func respToValue(resp *v3.GetResponse) string { + if resp == nil || len(resp.Kvs) == 0 { + return "" + } + return string(resp.Kvs[0].Value) +} + +// NewSTMRepeatable is deprecated. +func NewSTMRepeatable(ctx context.Context, c *v3.Client, apply func(STM) error) (*v3.TxnResponse, error) { + return NewSTM(c, apply, WithAbortContext(ctx), WithIsolation(RepeatableReads)) +} + +// NewSTMSerializable is deprecated. +func NewSTMSerializable(ctx context.Context, c *v3.Client, apply func(STM) error) (*v3.TxnResponse, error) { + return NewSTM(c, apply, WithAbortContext(ctx), WithIsolation(Serializable)) +} + +// NewSTMReadCommitted is deprecated. +func NewSTMReadCommitted(ctx context.Context, c *v3.Client, apply func(STM) error) (*v3.TxnResponse, error) { + return NewSTM(c, apply, WithAbortContext(ctx), WithIsolation(ReadCommitted)) +} diff --git a/vendor/go.etcd.io/etcd/clientv3/config.go b/vendor/go.etcd.io/etcd/clientv3/config.go new file mode 100644 index 00000000..11d447d5 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/config.go @@ -0,0 +1,88 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + "crypto/tls" + "time" + + "go.uber.org/zap" + "google.golang.org/grpc" +) + +type Config struct { + // Endpoints is a list of URLs. + Endpoints []string `json:"endpoints"` + + // AutoSyncInterval is the interval to update endpoints with its latest members. + // 0 disables auto-sync. By default auto-sync is disabled. + AutoSyncInterval time.Duration `json:"auto-sync-interval"` + + // DialTimeout is the timeout for failing to establish a connection. + DialTimeout time.Duration `json:"dial-timeout"` + + // DialKeepAliveTime is the time after which client pings the server to see if + // transport is alive. + DialKeepAliveTime time.Duration `json:"dial-keep-alive-time"` + + // DialKeepAliveTimeout is the time that the client waits for a response for the + // keep-alive probe. If the response is not received in this time, the connection is closed. + DialKeepAliveTimeout time.Duration `json:"dial-keep-alive-timeout"` + + // MaxCallSendMsgSize is the client-side request send limit in bytes. + // If 0, it defaults to 2.0 MiB (2 * 1024 * 1024). + // Make sure that "MaxCallSendMsgSize" < server-side default send/recv limit. + // ("--max-request-bytes" flag to etcd or "embed.Config.MaxRequestBytes"). + MaxCallSendMsgSize int + + // MaxCallRecvMsgSize is the client-side response receive limit. + // If 0, it defaults to "math.MaxInt32", because range response can + // easily exceed request send limits. + // Make sure that "MaxCallRecvMsgSize" >= server-side default send/recv limit. + // ("--max-request-bytes" flag to etcd or "embed.Config.MaxRequestBytes"). + MaxCallRecvMsgSize int + + // TLS holds the client secure credentials, if any. + TLS *tls.Config + + // Username is a user name for authentication. + Username string `json:"username"` + + // Password is a password for authentication. + Password string `json:"password"` + + // RejectOldCluster when set will refuse to create a client against an outdated cluster. + RejectOldCluster bool `json:"reject-old-cluster"` + + // DialOptions is a list of dial options for the grpc client (e.g., for interceptors). + // For example, pass "grpc.WithBlock()" to block until the underlying connection is up. + // Without this, Dial returns immediately and connecting the server happens in background. + DialOptions []grpc.DialOption + + // Context is the default client context; it can be used to cancel grpc dial out and + // other operations that do not have an explicit context. + Context context.Context + + // LogConfig configures client-side logger. + // If nil, use the default logger. + // TODO: configure gRPC logger + LogConfig *zap.Config + + // PermitWithoutStream when set will allow client to send keepalive pings to server without any active streams(RPCs). + PermitWithoutStream bool `json:"permit-without-stream"` + + // TODO: support custom balancer picker +} diff --git a/vendor/go.etcd.io/etcd/clientv3/credentials/credentials.go b/vendor/go.etcd.io/etcd/clientv3/credentials/credentials.go new file mode 100644 index 00000000..63389c08 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/credentials/credentials.go @@ -0,0 +1,173 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package credentials implements gRPC credential interface with etcd specific logic. +// e.g., client handshake with custom authority parameter +package credentials + +import ( + "context" + "crypto/tls" + "net" + "sync" + + "go.etcd.io/etcd/clientv3/balancer/resolver/endpoint" + "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" + grpccredentials "google.golang.org/grpc/credentials" +) + +// Config defines gRPC credential configuration. +type Config struct { + TLSConfig *tls.Config +} + +// Bundle defines gRPC credential interface. +type Bundle interface { + grpccredentials.Bundle + UpdateAuthToken(token string) +} + +// NewBundle constructs a new gRPC credential bundle. +func NewBundle(cfg Config) Bundle { + return &bundle{ + tc: newTransportCredential(cfg.TLSConfig), + rc: newPerRPCCredential(), + } +} + +// bundle implements "grpccredentials.Bundle" interface. +type bundle struct { + tc *transportCredential + rc *perRPCCredential +} + +func (b *bundle) TransportCredentials() grpccredentials.TransportCredentials { + return b.tc +} + +func (b *bundle) PerRPCCredentials() grpccredentials.PerRPCCredentials { + return b.rc +} + +func (b *bundle) NewWithMode(mode string) (grpccredentials.Bundle, error) { + // no-op + return nil, nil +} + +// transportCredential implements "grpccredentials.TransportCredentials" interface. +// transportCredential wraps TransportCredentials to track which +// addresses are dialed for which endpoints, and then sets the authority when checking the endpoint's cert to the +// hostname or IP of the dialed endpoint. +// This is a workaround of a gRPC load balancer issue. gRPC uses the dialed target's service name as the authority when +// checking all endpoint certs, which does not work for etcd servers using their hostname or IP as the Subject Alternative Name +// in their TLS certs. +// To enable, include both WithTransportCredentials(creds) and WithContextDialer(creds.Dialer) +// when dialing. +type transportCredential struct { + gtc grpccredentials.TransportCredentials + mu sync.Mutex + // addrToEndpoint maps from the connection addresses that are dialed to the hostname or IP of the + // endpoint provided to the dialer when dialing + addrToEndpoint map[string]string +} + +func newTransportCredential(cfg *tls.Config) *transportCredential { + return &transportCredential{ + gtc: grpccredentials.NewTLS(cfg), + addrToEndpoint: map[string]string{}, + } +} + +func (tc *transportCredential) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (net.Conn, grpccredentials.AuthInfo, error) { + // Set the authority when checking the endpoint's cert to the hostname or IP of the dialed endpoint + tc.mu.Lock() + dialEp, ok := tc.addrToEndpoint[rawConn.RemoteAddr().String()] + tc.mu.Unlock() + if ok { + _, host, _ := endpoint.ParseEndpoint(dialEp) + authority = host + } + return tc.gtc.ClientHandshake(ctx, authority, rawConn) +} + +// return true if given string is an IP. +func isIP(ep string) bool { + return net.ParseIP(ep) != nil +} + +func (tc *transportCredential) ServerHandshake(rawConn net.Conn) (net.Conn, grpccredentials.AuthInfo, error) { + return tc.gtc.ServerHandshake(rawConn) +} + +func (tc *transportCredential) Info() grpccredentials.ProtocolInfo { + return tc.gtc.Info() +} + +func (tc *transportCredential) Clone() grpccredentials.TransportCredentials { + copy := map[string]string{} + tc.mu.Lock() + for k, v := range tc.addrToEndpoint { + copy[k] = v + } + tc.mu.Unlock() + return &transportCredential{ + gtc: tc.gtc.Clone(), + addrToEndpoint: copy, + } +} + +func (tc *transportCredential) OverrideServerName(serverNameOverride string) error { + return tc.gtc.OverrideServerName(serverNameOverride) +} + +func (tc *transportCredential) Dialer(ctx context.Context, dialEp string) (net.Conn, error) { + // Keep track of which addresses are dialed for which endpoints + conn, err := endpoint.Dialer(ctx, dialEp) + if conn != nil { + tc.mu.Lock() + tc.addrToEndpoint[conn.RemoteAddr().String()] = dialEp + tc.mu.Unlock() + } + return conn, err +} + +// perRPCCredential implements "grpccredentials.PerRPCCredentials" interface. +type perRPCCredential struct { + authToken string + authTokenMu sync.RWMutex +} + +func newPerRPCCredential() *perRPCCredential { return &perRPCCredential{} } + +func (rc *perRPCCredential) RequireTransportSecurity() bool { return false } + +func (rc *perRPCCredential) GetRequestMetadata(ctx context.Context, s ...string) (map[string]string, error) { + rc.authTokenMu.RLock() + authToken := rc.authToken + rc.authTokenMu.RUnlock() + return map[string]string{rpctypes.TokenFieldNameGRPC: authToken}, nil +} + +func (b *bundle) UpdateAuthToken(token string) { + if b.rc == nil { + return + } + b.rc.UpdateAuthToken(token) +} + +func (rc *perRPCCredential) UpdateAuthToken(token string) { + rc.authTokenMu.Lock() + rc.authToken = token + rc.authTokenMu.Unlock() +} diff --git a/vendor/go.etcd.io/etcd/clientv3/ctx.go b/vendor/go.etcd.io/etcd/clientv3/ctx.go new file mode 100644 index 00000000..54221983 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/ctx.go @@ -0,0 +1,64 @@ +// Copyright 2020 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + "strings" + + "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" + "go.etcd.io/etcd/version" + "google.golang.org/grpc/metadata" +) + +// WithRequireLeader requires client requests to only succeed +// when the cluster has a leader. +func WithRequireLeader(ctx context.Context) context.Context { + md, ok := metadata.FromOutgoingContext(ctx) + if !ok { // no outgoing metadata ctx key, create one + md = metadata.Pairs(rpctypes.MetadataRequireLeaderKey, rpctypes.MetadataHasLeader) + return metadata.NewOutgoingContext(ctx, md) + } + copied := md.Copy() // avoid racey updates + // overwrite/add 'hasleader' key/value + metadataSet(copied, rpctypes.MetadataRequireLeaderKey, rpctypes.MetadataHasLeader) + return metadata.NewOutgoingContext(ctx, copied) +} + +// embeds client version +func withVersion(ctx context.Context) context.Context { + md, ok := metadata.FromOutgoingContext(ctx) + if !ok { // no outgoing metadata ctx key, create one + md = metadata.Pairs(rpctypes.MetadataClientAPIVersionKey, version.APIVersion) + return metadata.NewOutgoingContext(ctx, md) + } + copied := md.Copy() // avoid racey updates + // overwrite/add version key/value + metadataSet(copied, rpctypes.MetadataClientAPIVersionKey, version.APIVersion) + return metadata.NewOutgoingContext(ctx, copied) +} + +func metadataGet(md metadata.MD, k string) []string { + k = strings.ToLower(k) + return md[k] +} + +func metadataSet(md metadata.MD, k string, vals ...string) { + if len(vals) == 0 { + return + } + k = strings.ToLower(k) + md[k] = vals +} diff --git a/vendor/go.etcd.io/etcd/clientv3/doc.go b/vendor/go.etcd.io/etcd/clientv3/doc.go new file mode 100644 index 00000000..913cd282 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/doc.go @@ -0,0 +1,106 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package clientv3 implements the official Go etcd client for v3. +// +// Create client using `clientv3.New`: +// +// // expect dial time-out on ipv4 blackhole +// _, err := clientv3.New(clientv3.Config{ +// Endpoints: []string{"http://254.0.0.1:12345"}, +// DialTimeout: 2 * time.Second, +// }) +// +// // etcd clientv3 >= v3.2.10, grpc/grpc-go >= v1.7.3 +// if err == context.DeadlineExceeded { +// // handle errors +// } +// +// // etcd clientv3 <= v3.2.9, grpc/grpc-go <= v1.2.1 +// if err == grpc.ErrClientConnTimeout { +// // handle errors +// } +// +// cli, err := clientv3.New(clientv3.Config{ +// Endpoints: []string{"localhost:2379", "localhost:22379", "localhost:32379"}, +// DialTimeout: 5 * time.Second, +// }) +// if err != nil { +// // handle error! +// } +// defer cli.Close() +// +// Make sure to close the client after using it. If the client is not closed, the +// connection will have leaky goroutines. +// +// To specify a client request timeout, wrap the context with context.WithTimeout: +// +// ctx, cancel := context.WithTimeout(context.Background(), timeout) +// resp, err := kvc.Put(ctx, "sample_key", "sample_value") +// cancel() +// if err != nil { +// // handle error! +// } +// // use the response +// +// The Client has internal state (watchers and leases), so Clients should be reused instead of created as needed. +// Clients are safe for concurrent use by multiple goroutines. +// +// etcd client returns 3 types of errors: +// +// 1. context error: canceled or deadline exceeded. +// 2. gRPC status error: e.g. when clock drifts in server-side before client's context deadline exceeded. +// 3. gRPC error: see https://github.com/etcd-io/etcd/blob/master/etcdserver/api/v3rpc/rpctypes/error.go +// +// Here is the example code to handle client errors: +// +// resp, err := kvc.Put(ctx, "", "") +// if err != nil { +// if err == context.Canceled { +// // ctx is canceled by another routine +// } else if err == context.DeadlineExceeded { +// // ctx is attached with a deadline and it exceeded +// } else if err == rpctypes.ErrEmptyKey { +// // client-side error: key is not provided +// } else if ev, ok := status.FromError(err); ok { +// code := ev.Code() +// if code == codes.DeadlineExceeded { +// // server-side context might have timed-out first (due to clock skew) +// // while original client-side context is not timed-out yet +// } +// } else { +// // bad cluster endpoints, which are not etcd servers +// } +// } +// +// go func() { cli.Close() }() +// _, err := kvc.Get(ctx, "a") +// if err != nil { +// // with etcd clientv3 <= v3.3 +// if err == context.Canceled { +// // grpc balancer calls 'Get' with an inflight client.Close +// } else if err == grpc.ErrClientConnClosing { // <= gRCP v1.7.x +// // grpc balancer calls 'Get' after client.Close. +// } +// // with etcd clientv3 >= v3.4 +// if clientv3.IsConnCanceled(err) { +// // gRPC client connection is closed +// } +// } +// +// The grpc load balancer is registered statically and is shared across etcd clients. +// To enable detailed load balancer logging, set the ETCD_CLIENT_DEBUG environment +// variable. E.g. "ETCD_CLIENT_DEBUG=1". +// +package clientv3 diff --git a/vendor/go.etcd.io/etcd/clientv3/kv.go b/vendor/go.etcd.io/etcd/clientv3/kv.go new file mode 100644 index 00000000..2b7864ad --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/kv.go @@ -0,0 +1,177 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + + "google.golang.org/grpc" +) + +type ( + CompactResponse pb.CompactionResponse + PutResponse pb.PutResponse + GetResponse pb.RangeResponse + DeleteResponse pb.DeleteRangeResponse + TxnResponse pb.TxnResponse +) + +type KV interface { + // Put puts a key-value pair into etcd. + // Note that key,value can be plain bytes array and string is + // an immutable representation of that bytes array. + // To get a string of bytes, do string([]byte{0x10, 0x20}). + Put(ctx context.Context, key, val string, opts ...OpOption) (*PutResponse, error) + + // Get retrieves keys. + // By default, Get will return the value for "key", if any. + // When passed WithRange(end), Get will return the keys in the range [key, end). + // When passed WithFromKey(), Get returns keys greater than or equal to key. + // When passed WithRev(rev) with rev > 0, Get retrieves keys at the given revision; + // if the required revision is compacted, the request will fail with ErrCompacted . + // When passed WithLimit(limit), the number of returned keys is bounded by limit. + // When passed WithSort(), the keys will be sorted. + Get(ctx context.Context, key string, opts ...OpOption) (*GetResponse, error) + + // Delete deletes a key, or optionally using WithRange(end), [key, end). + Delete(ctx context.Context, key string, opts ...OpOption) (*DeleteResponse, error) + + // Compact compacts etcd KV history before the given rev. + Compact(ctx context.Context, rev int64, opts ...CompactOption) (*CompactResponse, error) + + // Do applies a single Op on KV without a transaction. + // Do is useful when creating arbitrary operations to be issued at a + // later time; the user can range over the operations, calling Do to + // execute them. Get/Put/Delete, on the other hand, are best suited + // for when the operation should be issued at the time of declaration. + Do(ctx context.Context, op Op) (OpResponse, error) + + // Txn creates a transaction. + Txn(ctx context.Context) Txn +} + +type OpResponse struct { + put *PutResponse + get *GetResponse + del *DeleteResponse + txn *TxnResponse +} + +func (op OpResponse) Put() *PutResponse { return op.put } +func (op OpResponse) Get() *GetResponse { return op.get } +func (op OpResponse) Del() *DeleteResponse { return op.del } +func (op OpResponse) Txn() *TxnResponse { return op.txn } + +func (resp *PutResponse) OpResponse() OpResponse { + return OpResponse{put: resp} +} +func (resp *GetResponse) OpResponse() OpResponse { + return OpResponse{get: resp} +} +func (resp *DeleteResponse) OpResponse() OpResponse { + return OpResponse{del: resp} +} +func (resp *TxnResponse) OpResponse() OpResponse { + return OpResponse{txn: resp} +} + +type kv struct { + remote pb.KVClient + callOpts []grpc.CallOption +} + +func NewKV(c *Client) KV { + api := &kv{remote: RetryKVClient(c)} + if c != nil { + api.callOpts = c.callOpts + } + return api +} + +func NewKVFromKVClient(remote pb.KVClient, c *Client) KV { + api := &kv{remote: remote} + if c != nil { + api.callOpts = c.callOpts + } + return api +} + +func (kv *kv) Put(ctx context.Context, key, val string, opts ...OpOption) (*PutResponse, error) { + r, err := kv.Do(ctx, OpPut(key, val, opts...)) + return r.put, toErr(ctx, err) +} + +func (kv *kv) Get(ctx context.Context, key string, opts ...OpOption) (*GetResponse, error) { + r, err := kv.Do(ctx, OpGet(key, opts...)) + return r.get, toErr(ctx, err) +} + +func (kv *kv) Delete(ctx context.Context, key string, opts ...OpOption) (*DeleteResponse, error) { + r, err := kv.Do(ctx, OpDelete(key, opts...)) + return r.del, toErr(ctx, err) +} + +func (kv *kv) Compact(ctx context.Context, rev int64, opts ...CompactOption) (*CompactResponse, error) { + resp, err := kv.remote.Compact(ctx, OpCompact(rev, opts...).toRequest(), kv.callOpts...) + if err != nil { + return nil, toErr(ctx, err) + } + return (*CompactResponse)(resp), err +} + +func (kv *kv) Txn(ctx context.Context) Txn { + return &txn{ + kv: kv, + ctx: ctx, + callOpts: kv.callOpts, + } +} + +func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) { + var err error + switch op.t { + case tRange: + var resp *pb.RangeResponse + resp, err = kv.remote.Range(ctx, op.toRangeRequest(), kv.callOpts...) + if err == nil { + return OpResponse{get: (*GetResponse)(resp)}, nil + } + case tPut: + var resp *pb.PutResponse + r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID), PrevKv: op.prevKV, IgnoreValue: op.ignoreValue, IgnoreLease: op.ignoreLease} + resp, err = kv.remote.Put(ctx, r, kv.callOpts...) + if err == nil { + return OpResponse{put: (*PutResponse)(resp)}, nil + } + case tDeleteRange: + var resp *pb.DeleteRangeResponse + r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end, PrevKv: op.prevKV} + resp, err = kv.remote.DeleteRange(ctx, r, kv.callOpts...) + if err == nil { + return OpResponse{del: (*DeleteResponse)(resp)}, nil + } + case tTxn: + var resp *pb.TxnResponse + resp, err = kv.remote.Txn(ctx, op.toTxnRequest(), kv.callOpts...) + if err == nil { + return OpResponse{txn: (*TxnResponse)(resp)}, nil + } + default: + panic("Unknown op") + } + return OpResponse{}, toErr(ctx, err) +} diff --git a/vendor/go.etcd.io/etcd/clientv3/lease.go b/vendor/go.etcd.io/etcd/clientv3/lease.go new file mode 100644 index 00000000..c2796fc9 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/lease.go @@ -0,0 +1,596 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + "sync" + "time" + + "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + + "go.uber.org/zap" + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" +) + +type ( + LeaseRevokeResponse pb.LeaseRevokeResponse + LeaseID int64 +) + +// LeaseGrantResponse wraps the protobuf message LeaseGrantResponse. +type LeaseGrantResponse struct { + *pb.ResponseHeader + ID LeaseID + TTL int64 + Error string +} + +// LeaseKeepAliveResponse wraps the protobuf message LeaseKeepAliveResponse. +type LeaseKeepAliveResponse struct { + *pb.ResponseHeader + ID LeaseID + TTL int64 +} + +// LeaseTimeToLiveResponse wraps the protobuf message LeaseTimeToLiveResponse. +type LeaseTimeToLiveResponse struct { + *pb.ResponseHeader + ID LeaseID `json:"id"` + + // TTL is the remaining TTL in seconds for the lease; the lease will expire in under TTL+1 seconds. Expired lease will return -1. + TTL int64 `json:"ttl"` + + // GrantedTTL is the initial granted time in seconds upon lease creation/renewal. + GrantedTTL int64 `json:"granted-ttl"` + + // Keys is the list of keys attached to this lease. + Keys [][]byte `json:"keys"` +} + +// LeaseStatus represents a lease status. +type LeaseStatus struct { + ID LeaseID `json:"id"` + // TODO: TTL int64 +} + +// LeaseLeasesResponse wraps the protobuf message LeaseLeasesResponse. +type LeaseLeasesResponse struct { + *pb.ResponseHeader + Leases []LeaseStatus `json:"leases"` +} + +const ( + // defaultTTL is the assumed lease TTL used for the first keepalive + // deadline before the actual TTL is known to the client. + defaultTTL = 5 * time.Second + // NoLease is a lease ID for the absence of a lease. + NoLease LeaseID = 0 + + // retryConnWait is how long to wait before retrying request due to an error + retryConnWait = 500 * time.Millisecond +) + +// LeaseResponseChSize is the size of buffer to store unsent lease responses. +// WARNING: DO NOT UPDATE. +// Only for testing purposes. +var LeaseResponseChSize = 16 + +// ErrKeepAliveHalted is returned if client keep alive loop halts with an unexpected error. +// +// This usually means that automatic lease renewal via KeepAlive is broken, but KeepAliveOnce will still work as expected. +type ErrKeepAliveHalted struct { + Reason error +} + +func (e ErrKeepAliveHalted) Error() string { + s := "etcdclient: leases keep alive halted" + if e.Reason != nil { + s += ": " + e.Reason.Error() + } + return s +} + +type Lease interface { + // Grant creates a new lease. + Grant(ctx context.Context, ttl int64) (*LeaseGrantResponse, error) + + // Revoke revokes the given lease. + Revoke(ctx context.Context, id LeaseID) (*LeaseRevokeResponse, error) + + // TimeToLive retrieves the lease information of the given lease ID. + TimeToLive(ctx context.Context, id LeaseID, opts ...LeaseOption) (*LeaseTimeToLiveResponse, error) + + // Leases retrieves all leases. + Leases(ctx context.Context) (*LeaseLeasesResponse, error) + + // KeepAlive attempts to keep the given lease alive forever. If the keepalive responses posted + // to the channel are not consumed promptly the channel may become full. When full, the lease + // client will continue sending keep alive requests to the etcd server, but will drop responses + // until there is capacity on the channel to send more responses. + // + // If client keep alive loop halts with an unexpected error (e.g. "etcdserver: no leader") or + // canceled by the caller (e.g. context.Canceled), KeepAlive returns a ErrKeepAliveHalted error + // containing the error reason. + // + // The returned "LeaseKeepAliveResponse" channel closes if underlying keep + // alive stream is interrupted in some way the client cannot handle itself; + // given context "ctx" is canceled or timed out. + // + // TODO(v4.0): post errors to last keep alive message before closing + // (see https://github.com/etcd-io/etcd/pull/7866) + KeepAlive(ctx context.Context, id LeaseID) (<-chan *LeaseKeepAliveResponse, error) + + // KeepAliveOnce renews the lease once. The response corresponds to the + // first message from calling KeepAlive. If the response has a recoverable + // error, KeepAliveOnce will retry the RPC with a new keep alive message. + // + // In most of the cases, Keepalive should be used instead of KeepAliveOnce. + KeepAliveOnce(ctx context.Context, id LeaseID) (*LeaseKeepAliveResponse, error) + + // Close releases all resources Lease keeps for efficient communication + // with the etcd server. + Close() error +} + +type lessor struct { + mu sync.Mutex // guards all fields + + // donec is closed and loopErr is set when recvKeepAliveLoop stops + donec chan struct{} + loopErr error + + remote pb.LeaseClient + + stream pb.Lease_LeaseKeepAliveClient + streamCancel context.CancelFunc + + stopCtx context.Context + stopCancel context.CancelFunc + + keepAlives map[LeaseID]*keepAlive + + // firstKeepAliveTimeout is the timeout for the first keepalive request + // before the actual TTL is known to the lease client + firstKeepAliveTimeout time.Duration + + // firstKeepAliveOnce ensures stream starts after first KeepAlive call. + firstKeepAliveOnce sync.Once + + callOpts []grpc.CallOption + + lg *zap.Logger +} + +// keepAlive multiplexes a keepalive for a lease over multiple channels +type keepAlive struct { + chs []chan<- *LeaseKeepAliveResponse + ctxs []context.Context + // deadline is the time the keep alive channels close if no response + deadline time.Time + // nextKeepAlive is when to send the next keep alive message + nextKeepAlive time.Time + // donec is closed on lease revoke, expiration, or cancel. + donec chan struct{} +} + +func NewLease(c *Client) Lease { + return NewLeaseFromLeaseClient(RetryLeaseClient(c), c, c.cfg.DialTimeout+time.Second) +} + +func NewLeaseFromLeaseClient(remote pb.LeaseClient, c *Client, keepAliveTimeout time.Duration) Lease { + l := &lessor{ + donec: make(chan struct{}), + keepAlives: make(map[LeaseID]*keepAlive), + remote: remote, + firstKeepAliveTimeout: keepAliveTimeout, + lg: c.lg, + } + if l.firstKeepAliveTimeout == time.Second { + l.firstKeepAliveTimeout = defaultTTL + } + if c != nil { + l.callOpts = c.callOpts + } + reqLeaderCtx := WithRequireLeader(context.Background()) + l.stopCtx, l.stopCancel = context.WithCancel(reqLeaderCtx) + return l +} + +func (l *lessor) Grant(ctx context.Context, ttl int64) (*LeaseGrantResponse, error) { + r := &pb.LeaseGrantRequest{TTL: ttl} + resp, err := l.remote.LeaseGrant(ctx, r, l.callOpts...) + if err == nil { + gresp := &LeaseGrantResponse{ + ResponseHeader: resp.GetHeader(), + ID: LeaseID(resp.ID), + TTL: resp.TTL, + Error: resp.Error, + } + return gresp, nil + } + return nil, toErr(ctx, err) +} + +func (l *lessor) Revoke(ctx context.Context, id LeaseID) (*LeaseRevokeResponse, error) { + r := &pb.LeaseRevokeRequest{ID: int64(id)} + resp, err := l.remote.LeaseRevoke(ctx, r, l.callOpts...) + if err == nil { + return (*LeaseRevokeResponse)(resp), nil + } + return nil, toErr(ctx, err) +} + +func (l *lessor) TimeToLive(ctx context.Context, id LeaseID, opts ...LeaseOption) (*LeaseTimeToLiveResponse, error) { + r := toLeaseTimeToLiveRequest(id, opts...) + resp, err := l.remote.LeaseTimeToLive(ctx, r, l.callOpts...) + if err == nil { + gresp := &LeaseTimeToLiveResponse{ + ResponseHeader: resp.GetHeader(), + ID: LeaseID(resp.ID), + TTL: resp.TTL, + GrantedTTL: resp.GrantedTTL, + Keys: resp.Keys, + } + return gresp, nil + } + return nil, toErr(ctx, err) +} + +func (l *lessor) Leases(ctx context.Context) (*LeaseLeasesResponse, error) { + resp, err := l.remote.LeaseLeases(ctx, &pb.LeaseLeasesRequest{}, l.callOpts...) + if err == nil { + leases := make([]LeaseStatus, len(resp.Leases)) + for i := range resp.Leases { + leases[i] = LeaseStatus{ID: LeaseID(resp.Leases[i].ID)} + } + return &LeaseLeasesResponse{ResponseHeader: resp.GetHeader(), Leases: leases}, nil + } + return nil, toErr(ctx, err) +} + +func (l *lessor) KeepAlive(ctx context.Context, id LeaseID) (<-chan *LeaseKeepAliveResponse, error) { + ch := make(chan *LeaseKeepAliveResponse, LeaseResponseChSize) + + l.mu.Lock() + // ensure that recvKeepAliveLoop is still running + select { + case <-l.donec: + err := l.loopErr + l.mu.Unlock() + close(ch) + return ch, ErrKeepAliveHalted{Reason: err} + default: + } + ka, ok := l.keepAlives[id] + if !ok { + // create fresh keep alive + ka = &keepAlive{ + chs: []chan<- *LeaseKeepAliveResponse{ch}, + ctxs: []context.Context{ctx}, + deadline: time.Now().Add(l.firstKeepAliveTimeout), + nextKeepAlive: time.Now(), + donec: make(chan struct{}), + } + l.keepAlives[id] = ka + } else { + // add channel and context to existing keep alive + ka.ctxs = append(ka.ctxs, ctx) + ka.chs = append(ka.chs, ch) + } + l.mu.Unlock() + + go l.keepAliveCtxCloser(ctx, id, ka.donec) + l.firstKeepAliveOnce.Do(func() { + go l.recvKeepAliveLoop() + go l.deadlineLoop() + }) + + return ch, nil +} + +func (l *lessor) KeepAliveOnce(ctx context.Context, id LeaseID) (*LeaseKeepAliveResponse, error) { + for { + resp, err := l.keepAliveOnce(ctx, id) + if err == nil { + if resp.TTL <= 0 { + err = rpctypes.ErrLeaseNotFound + } + return resp, err + } + if isHaltErr(ctx, err) { + return nil, toErr(ctx, err) + } + } +} + +func (l *lessor) Close() error { + l.stopCancel() + // close for synchronous teardown if stream goroutines never launched + l.firstKeepAliveOnce.Do(func() { close(l.donec) }) + <-l.donec + return nil +} + +func (l *lessor) keepAliveCtxCloser(ctx context.Context, id LeaseID, donec <-chan struct{}) { + select { + case <-donec: + return + case <-l.donec: + return + case <-ctx.Done(): + } + + l.mu.Lock() + defer l.mu.Unlock() + + ka, ok := l.keepAlives[id] + if !ok { + return + } + + // close channel and remove context if still associated with keep alive + for i, c := range ka.ctxs { + if c == ctx { + close(ka.chs[i]) + ka.ctxs = append(ka.ctxs[:i], ka.ctxs[i+1:]...) + ka.chs = append(ka.chs[:i], ka.chs[i+1:]...) + break + } + } + // remove if no one more listeners + if len(ka.chs) == 0 { + delete(l.keepAlives, id) + } +} + +// closeRequireLeader scans keepAlives for ctxs that have require leader +// and closes the associated channels. +func (l *lessor) closeRequireLeader() { + l.mu.Lock() + defer l.mu.Unlock() + for _, ka := range l.keepAlives { + reqIdxs := 0 + // find all required leader channels, close, mark as nil + for i, ctx := range ka.ctxs { + md, ok := metadata.FromOutgoingContext(ctx) + if !ok { + continue + } + ks := md[rpctypes.MetadataRequireLeaderKey] + if len(ks) < 1 || ks[0] != rpctypes.MetadataHasLeader { + continue + } + close(ka.chs[i]) + ka.chs[i] = nil + reqIdxs++ + } + if reqIdxs == 0 { + continue + } + // remove all channels that required a leader from keepalive + newChs := make([]chan<- *LeaseKeepAliveResponse, len(ka.chs)-reqIdxs) + newCtxs := make([]context.Context, len(newChs)) + newIdx := 0 + for i := range ka.chs { + if ka.chs[i] == nil { + continue + } + newChs[newIdx], newCtxs[newIdx] = ka.chs[i], ka.ctxs[newIdx] + newIdx++ + } + ka.chs, ka.ctxs = newChs, newCtxs + } +} + +func (l *lessor) keepAliveOnce(ctx context.Context, id LeaseID) (*LeaseKeepAliveResponse, error) { + cctx, cancel := context.WithCancel(ctx) + defer cancel() + + stream, err := l.remote.LeaseKeepAlive(cctx, l.callOpts...) + if err != nil { + return nil, toErr(ctx, err) + } + + err = stream.Send(&pb.LeaseKeepAliveRequest{ID: int64(id)}) + if err != nil { + return nil, toErr(ctx, err) + } + + resp, rerr := stream.Recv() + if rerr != nil { + return nil, toErr(ctx, rerr) + } + + karesp := &LeaseKeepAliveResponse{ + ResponseHeader: resp.GetHeader(), + ID: LeaseID(resp.ID), + TTL: resp.TTL, + } + return karesp, nil +} + +func (l *lessor) recvKeepAliveLoop() (gerr error) { + defer func() { + l.mu.Lock() + close(l.donec) + l.loopErr = gerr + for _, ka := range l.keepAlives { + ka.close() + } + l.keepAlives = make(map[LeaseID]*keepAlive) + l.mu.Unlock() + }() + + for { + stream, err := l.resetRecv() + if err != nil { + if canceledByCaller(l.stopCtx, err) { + return err + } + } else { + for { + resp, err := stream.Recv() + if err != nil { + if canceledByCaller(l.stopCtx, err) { + return err + } + + if toErr(l.stopCtx, err) == rpctypes.ErrNoLeader { + l.closeRequireLeader() + } + break + } + + l.recvKeepAlive(resp) + } + } + + select { + case <-time.After(retryConnWait): + case <-l.stopCtx.Done(): + return l.stopCtx.Err() + } + } +} + +// resetRecv opens a new lease stream and starts sending keep alive requests. +func (l *lessor) resetRecv() (pb.Lease_LeaseKeepAliveClient, error) { + sctx, cancel := context.WithCancel(l.stopCtx) + stream, err := l.remote.LeaseKeepAlive(sctx, append(l.callOpts, withMax(0))...) + if err != nil { + cancel() + return nil, err + } + + l.mu.Lock() + defer l.mu.Unlock() + if l.stream != nil && l.streamCancel != nil { + l.streamCancel() + } + + l.streamCancel = cancel + l.stream = stream + + go l.sendKeepAliveLoop(stream) + return stream, nil +} + +// recvKeepAlive updates a lease based on its LeaseKeepAliveResponse +func (l *lessor) recvKeepAlive(resp *pb.LeaseKeepAliveResponse) { + karesp := &LeaseKeepAliveResponse{ + ResponseHeader: resp.GetHeader(), + ID: LeaseID(resp.ID), + TTL: resp.TTL, + } + + l.mu.Lock() + defer l.mu.Unlock() + + ka, ok := l.keepAlives[karesp.ID] + if !ok { + return + } + + if karesp.TTL <= 0 { + // lease expired; close all keep alive channels + delete(l.keepAlives, karesp.ID) + ka.close() + return + } + + // send update to all channels + nextKeepAlive := time.Now().Add((time.Duration(karesp.TTL) * time.Second) / 3.0) + ka.deadline = time.Now().Add(time.Duration(karesp.TTL) * time.Second) + for _, ch := range ka.chs { + select { + case ch <- karesp: + default: + if l.lg != nil { + l.lg.Warn("lease keepalive response queue is full; dropping response send", + zap.Int("queue-size", len(ch)), + zap.Int("queue-capacity", cap(ch)), + ) + } + } + // still advance in order to rate-limit keep-alive sends + ka.nextKeepAlive = nextKeepAlive + } +} + +// deadlineLoop reaps any keep alive channels that have not received a response +// within the lease TTL +func (l *lessor) deadlineLoop() { + for { + select { + case <-time.After(time.Second): + case <-l.donec: + return + } + now := time.Now() + l.mu.Lock() + for id, ka := range l.keepAlives { + if ka.deadline.Before(now) { + // waited too long for response; lease may be expired + ka.close() + delete(l.keepAlives, id) + } + } + l.mu.Unlock() + } +} + +// sendKeepAliveLoop sends keep alive requests for the lifetime of the given stream. +func (l *lessor) sendKeepAliveLoop(stream pb.Lease_LeaseKeepAliveClient) { + for { + var tosend []LeaseID + + now := time.Now() + l.mu.Lock() + for id, ka := range l.keepAlives { + if ka.nextKeepAlive.Before(now) { + tosend = append(tosend, id) + } + } + l.mu.Unlock() + + for _, id := range tosend { + r := &pb.LeaseKeepAliveRequest{ID: int64(id)} + if err := stream.Send(r); err != nil { + // TODO do something with this error? + return + } + } + + select { + case <-time.After(retryConnWait): + case <-stream.Context().Done(): + return + case <-l.donec: + return + case <-l.stopCtx.Done(): + return + } + } +} + +func (ka *keepAlive) close() { + close(ka.donec) + for _, ch := range ka.chs { + close(ch) + } +} diff --git a/vendor/go.etcd.io/etcd/clientv3/logger.go b/vendor/go.etcd.io/etcd/clientv3/logger.go new file mode 100644 index 00000000..f5ae0109 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/logger.go @@ -0,0 +1,101 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "io/ioutil" + "sync" + + "go.etcd.io/etcd/pkg/logutil" + + "google.golang.org/grpc/grpclog" +) + +var ( + lgMu sync.RWMutex + lg logutil.Logger +) + +type settableLogger struct { + l grpclog.LoggerV2 + mu sync.RWMutex +} + +func init() { + // disable client side logs by default + lg = &settableLogger{} + SetLogger(grpclog.NewLoggerV2(ioutil.Discard, ioutil.Discard, ioutil.Discard)) +} + +// SetLogger sets client-side Logger. +func SetLogger(l grpclog.LoggerV2) { + lgMu.Lock() + lg = logutil.NewLogger(l) + // override grpclog so that any changes happen with locking + grpclog.SetLoggerV2(lg) + lgMu.Unlock() +} + +// GetLogger returns the current logutil.Logger. +func GetLogger() logutil.Logger { + lgMu.RLock() + l := lg + lgMu.RUnlock() + return l +} + +// NewLogger returns a new Logger with logutil.Logger. +func NewLogger(gl grpclog.LoggerV2) logutil.Logger { + return &settableLogger{l: gl} +} + +func (s *settableLogger) get() grpclog.LoggerV2 { + s.mu.RLock() + l := s.l + s.mu.RUnlock() + return l +} + +// implement the grpclog.LoggerV2 interface + +func (s *settableLogger) Info(args ...interface{}) { s.get().Info(args...) } +func (s *settableLogger) Infof(format string, args ...interface{}) { s.get().Infof(format, args...) } +func (s *settableLogger) Infoln(args ...interface{}) { s.get().Infoln(args...) } +func (s *settableLogger) Warning(args ...interface{}) { s.get().Warning(args...) } +func (s *settableLogger) Warningf(format string, args ...interface{}) { + s.get().Warningf(format, args...) +} +func (s *settableLogger) Warningln(args ...interface{}) { s.get().Warningln(args...) } +func (s *settableLogger) Error(args ...interface{}) { s.get().Error(args...) } +func (s *settableLogger) Errorf(format string, args ...interface{}) { + s.get().Errorf(format, args...) +} +func (s *settableLogger) Errorln(args ...interface{}) { s.get().Errorln(args...) } +func (s *settableLogger) Fatal(args ...interface{}) { s.get().Fatal(args...) } +func (s *settableLogger) Fatalf(format string, args ...interface{}) { s.get().Fatalf(format, args...) } +func (s *settableLogger) Fatalln(args ...interface{}) { s.get().Fatalln(args...) } +func (s *settableLogger) Print(args ...interface{}) { s.get().Info(args...) } +func (s *settableLogger) Printf(format string, args ...interface{}) { s.get().Infof(format, args...) } +func (s *settableLogger) Println(args ...interface{}) { s.get().Infoln(args...) } +func (s *settableLogger) V(l int) bool { return s.get().V(l) } +func (s *settableLogger) Lvl(lvl int) grpclog.LoggerV2 { + s.mu.RLock() + l := s.l + s.mu.RUnlock() + if l.V(lvl) { + return s + } + return logutil.NewDiscardLogger() +} diff --git a/vendor/go.etcd.io/etcd/clientv3/maintenance.go b/vendor/go.etcd.io/etcd/clientv3/maintenance.go new file mode 100644 index 00000000..809b8a3b --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/maintenance.go @@ -0,0 +1,243 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + "fmt" + "io" + + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + "go.uber.org/zap" + + "google.golang.org/grpc" +) + +type ( + DefragmentResponse pb.DefragmentResponse + AlarmResponse pb.AlarmResponse + AlarmMember pb.AlarmMember + StatusResponse pb.StatusResponse + HashKVResponse pb.HashKVResponse + MoveLeaderResponse pb.MoveLeaderResponse +) + +type Maintenance interface { + // AlarmList gets all active alarms. + AlarmList(ctx context.Context) (*AlarmResponse, error) + + // AlarmDisarm disarms a given alarm. + AlarmDisarm(ctx context.Context, m *AlarmMember) (*AlarmResponse, error) + + // Defragment releases wasted space from internal fragmentation on a given etcd member. + // Defragment is only needed when deleting a large number of keys and want to reclaim + // the resources. + // Defragment is an expensive operation. User should avoid defragmenting multiple members + // at the same time. + // To defragment multiple members in the cluster, user need to call defragment multiple + // times with different endpoints. + Defragment(ctx context.Context, endpoint string) (*DefragmentResponse, error) + + // Status gets the status of the endpoint. + Status(ctx context.Context, endpoint string) (*StatusResponse, error) + + // HashKV returns a hash of the KV state at the time of the RPC. + // If revision is zero, the hash is computed on all keys. If the revision + // is non-zero, the hash is computed on all keys at or below the given revision. + HashKV(ctx context.Context, endpoint string, rev int64) (*HashKVResponse, error) + + // Snapshot provides a reader for a point-in-time snapshot of etcd. + // If the context "ctx" is canceled or timed out, reading from returned + // "io.ReadCloser" would error out (e.g. context.Canceled, context.DeadlineExceeded). + Snapshot(ctx context.Context) (io.ReadCloser, error) + + // MoveLeader requests current leader to transfer its leadership to the transferee. + // Request must be made to the leader. + MoveLeader(ctx context.Context, transfereeID uint64) (*MoveLeaderResponse, error) +} + +type maintenance struct { + lg *zap.Logger + dial func(endpoint string) (pb.MaintenanceClient, func(), error) + remote pb.MaintenanceClient + callOpts []grpc.CallOption +} + +func NewMaintenance(c *Client) Maintenance { + api := &maintenance{ + lg: c.lg, + dial: func(endpoint string) (pb.MaintenanceClient, func(), error) { + conn, err := c.Dial(endpoint) + if err != nil { + return nil, nil, fmt.Errorf("failed to dial endpoint %s with maintenance client: %v", endpoint, err) + } + cancel := func() { conn.Close() } + return RetryMaintenanceClient(c, conn), cancel, nil + }, + remote: RetryMaintenanceClient(c, c.conn), + } + if c != nil { + api.callOpts = c.callOpts + } + return api +} + +func NewMaintenanceFromMaintenanceClient(remote pb.MaintenanceClient, c *Client) Maintenance { + api := &maintenance{ + lg: c.lg, + dial: func(string) (pb.MaintenanceClient, func(), error) { + return remote, func() {}, nil + }, + remote: remote, + } + if c != nil { + api.callOpts = c.callOpts + } + return api +} + +func (m *maintenance) AlarmList(ctx context.Context) (*AlarmResponse, error) { + req := &pb.AlarmRequest{ + Action: pb.AlarmRequest_GET, + MemberID: 0, // all + Alarm: pb.AlarmType_NONE, // all + } + resp, err := m.remote.Alarm(ctx, req, m.callOpts...) + if err == nil { + return (*AlarmResponse)(resp), nil + } + return nil, toErr(ctx, err) +} + +func (m *maintenance) AlarmDisarm(ctx context.Context, am *AlarmMember) (*AlarmResponse, error) { + req := &pb.AlarmRequest{ + Action: pb.AlarmRequest_DEACTIVATE, + MemberID: am.MemberID, + Alarm: am.Alarm, + } + + if req.MemberID == 0 && req.Alarm == pb.AlarmType_NONE { + ar, err := m.AlarmList(ctx) + if err != nil { + return nil, toErr(ctx, err) + } + ret := AlarmResponse{} + for _, am := range ar.Alarms { + dresp, derr := m.AlarmDisarm(ctx, (*AlarmMember)(am)) + if derr != nil { + return nil, toErr(ctx, derr) + } + ret.Alarms = append(ret.Alarms, dresp.Alarms...) + } + return &ret, nil + } + + resp, err := m.remote.Alarm(ctx, req, m.callOpts...) + if err == nil { + return (*AlarmResponse)(resp), nil + } + return nil, toErr(ctx, err) +} + +func (m *maintenance) Defragment(ctx context.Context, endpoint string) (*DefragmentResponse, error) { + remote, cancel, err := m.dial(endpoint) + if err != nil { + return nil, toErr(ctx, err) + } + defer cancel() + resp, err := remote.Defragment(ctx, &pb.DefragmentRequest{}, m.callOpts...) + if err != nil { + return nil, toErr(ctx, err) + } + return (*DefragmentResponse)(resp), nil +} + +func (m *maintenance) Status(ctx context.Context, endpoint string) (*StatusResponse, error) { + remote, cancel, err := m.dial(endpoint) + if err != nil { + return nil, toErr(ctx, err) + } + defer cancel() + resp, err := remote.Status(ctx, &pb.StatusRequest{}, m.callOpts...) + if err != nil { + return nil, toErr(ctx, err) + } + return (*StatusResponse)(resp), nil +} + +func (m *maintenance) HashKV(ctx context.Context, endpoint string, rev int64) (*HashKVResponse, error) { + remote, cancel, err := m.dial(endpoint) + if err != nil { + + return nil, toErr(ctx, err) + } + defer cancel() + resp, err := remote.HashKV(ctx, &pb.HashKVRequest{Revision: rev}, m.callOpts...) + if err != nil { + return nil, toErr(ctx, err) + } + return (*HashKVResponse)(resp), nil +} + +func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) { + ss, err := m.remote.Snapshot(ctx, &pb.SnapshotRequest{}, append(m.callOpts, withMax(defaultStreamMaxRetries))...) + if err != nil { + return nil, toErr(ctx, err) + } + + m.lg.Info("opened snapshot stream; downloading") + pr, pw := io.Pipe() + go func() { + for { + resp, err := ss.Recv() + if err != nil { + switch err { + case io.EOF: + m.lg.Info("completed snapshot read; closing") + default: + m.lg.Warn("failed to receive from snapshot stream; closing", zap.Error(err)) + } + pw.CloseWithError(err) + return + } + + // can "resp == nil && err == nil" + // before we receive snapshot SHA digest? + // No, server sends EOF with an empty response + // after it sends SHA digest at the end + + if _, werr := pw.Write(resp.Blob); werr != nil { + pw.CloseWithError(werr) + return + } + } + }() + return &snapshotReadCloser{ctx: ctx, ReadCloser: pr}, nil +} + +type snapshotReadCloser struct { + ctx context.Context + io.ReadCloser +} + +func (rc *snapshotReadCloser) Read(p []byte) (n int, err error) { + n, err = rc.ReadCloser.Read(p) + return n, toErr(rc.ctx, err) +} + +func (m *maintenance) MoveLeader(ctx context.Context, transfereeID uint64) (*MoveLeaderResponse, error) { + resp, err := m.remote.MoveLeader(ctx, &pb.MoveLeaderRequest{TargetID: transfereeID}, m.callOpts...) + return (*MoveLeaderResponse)(resp), toErr(ctx, err) +} diff --git a/vendor/go.etcd.io/etcd/clientv3/op.go b/vendor/go.etcd.io/etcd/clientv3/op.go new file mode 100644 index 00000000..81ae31fd --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/op.go @@ -0,0 +1,560 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + +type opType int + +const ( + // A default Op has opType 0, which is invalid. + tRange opType = iota + 1 + tPut + tDeleteRange + tTxn +) + +var noPrefixEnd = []byte{0} + +// Op represents an Operation that kv can execute. +type Op struct { + t opType + key []byte + end []byte + + // for range + limit int64 + sort *SortOption + serializable bool + keysOnly bool + countOnly bool + minModRev int64 + maxModRev int64 + minCreateRev int64 + maxCreateRev int64 + + // for range, watch + rev int64 + + // for watch, put, delete + prevKV bool + + // for watch + // fragmentation should be disabled by default + // if true, split watch events when total exceeds + // "--max-request-bytes" flag value + 512-byte + fragment bool + + // for put + ignoreValue bool + ignoreLease bool + + // progressNotify is for progress updates. + progressNotify bool + // createdNotify is for created event + createdNotify bool + // filters for watchers + filterPut bool + filterDelete bool + + // for put + val []byte + leaseID LeaseID + + // txn + cmps []Cmp + thenOps []Op + elseOps []Op +} + +// accessors / mutators + +// IsTxn returns true if the "Op" type is transaction. +func (op Op) IsTxn() bool { + return op.t == tTxn +} + +// Txn returns the comparison(if) operations, "then" operations, and "else" operations. +func (op Op) Txn() ([]Cmp, []Op, []Op) { + return op.cmps, op.thenOps, op.elseOps +} + +// KeyBytes returns the byte slice holding the Op's key. +func (op Op) KeyBytes() []byte { return op.key } + +// WithKeyBytes sets the byte slice for the Op's key. +func (op *Op) WithKeyBytes(key []byte) { op.key = key } + +// RangeBytes returns the byte slice holding with the Op's range end, if any. +func (op Op) RangeBytes() []byte { return op.end } + +// Rev returns the requested revision, if any. +func (op Op) Rev() int64 { return op.rev } + +// IsPut returns true iff the operation is a Put. +func (op Op) IsPut() bool { return op.t == tPut } + +// IsGet returns true iff the operation is a Get. +func (op Op) IsGet() bool { return op.t == tRange } + +// IsDelete returns true iff the operation is a Delete. +func (op Op) IsDelete() bool { return op.t == tDeleteRange } + +// IsSerializable returns true if the serializable field is true. +func (op Op) IsSerializable() bool { return op.serializable } + +// IsKeysOnly returns whether keysOnly is set. +func (op Op) IsKeysOnly() bool { return op.keysOnly } + +// IsCountOnly returns whether countOnly is set. +func (op Op) IsCountOnly() bool { return op.countOnly } + +// MinModRev returns the operation's minimum modify revision. +func (op Op) MinModRev() int64 { return op.minModRev } + +// MaxModRev returns the operation's maximum modify revision. +func (op Op) MaxModRev() int64 { return op.maxModRev } + +// MinCreateRev returns the operation's minimum create revision. +func (op Op) MinCreateRev() int64 { return op.minCreateRev } + +// MaxCreateRev returns the operation's maximum create revision. +func (op Op) MaxCreateRev() int64 { return op.maxCreateRev } + +// WithRangeBytes sets the byte slice for the Op's range end. +func (op *Op) WithRangeBytes(end []byte) { op.end = end } + +// ValueBytes returns the byte slice holding the Op's value, if any. +func (op Op) ValueBytes() []byte { return op.val } + +// WithValueBytes sets the byte slice for the Op's value. +func (op *Op) WithValueBytes(v []byte) { op.val = v } + +func (op Op) toRangeRequest() *pb.RangeRequest { + if op.t != tRange { + panic("op.t != tRange") + } + r := &pb.RangeRequest{ + Key: op.key, + RangeEnd: op.end, + Limit: op.limit, + Revision: op.rev, + Serializable: op.serializable, + KeysOnly: op.keysOnly, + CountOnly: op.countOnly, + MinModRevision: op.minModRev, + MaxModRevision: op.maxModRev, + MinCreateRevision: op.minCreateRev, + MaxCreateRevision: op.maxCreateRev, + } + if op.sort != nil { + r.SortOrder = pb.RangeRequest_SortOrder(op.sort.Order) + r.SortTarget = pb.RangeRequest_SortTarget(op.sort.Target) + } + return r +} + +func (op Op) toTxnRequest() *pb.TxnRequest { + thenOps := make([]*pb.RequestOp, len(op.thenOps)) + for i, tOp := range op.thenOps { + thenOps[i] = tOp.toRequestOp() + } + elseOps := make([]*pb.RequestOp, len(op.elseOps)) + for i, eOp := range op.elseOps { + elseOps[i] = eOp.toRequestOp() + } + cmps := make([]*pb.Compare, len(op.cmps)) + for i := range op.cmps { + cmps[i] = (*pb.Compare)(&op.cmps[i]) + } + return &pb.TxnRequest{Compare: cmps, Success: thenOps, Failure: elseOps} +} + +func (op Op) toRequestOp() *pb.RequestOp { + switch op.t { + case tRange: + return &pb.RequestOp{Request: &pb.RequestOp_RequestRange{RequestRange: op.toRangeRequest()}} + case tPut: + r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID), PrevKv: op.prevKV, IgnoreValue: op.ignoreValue, IgnoreLease: op.ignoreLease} + return &pb.RequestOp{Request: &pb.RequestOp_RequestPut{RequestPut: r}} + case tDeleteRange: + r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end, PrevKv: op.prevKV} + return &pb.RequestOp{Request: &pb.RequestOp_RequestDeleteRange{RequestDeleteRange: r}} + case tTxn: + return &pb.RequestOp{Request: &pb.RequestOp_RequestTxn{RequestTxn: op.toTxnRequest()}} + default: + panic("Unknown Op") + } +} + +func (op Op) isWrite() bool { + if op.t == tTxn { + for _, tOp := range op.thenOps { + if tOp.isWrite() { + return true + } + } + for _, tOp := range op.elseOps { + if tOp.isWrite() { + return true + } + } + return false + } + return op.t != tRange +} + +// OpGet returns "get" operation based on given key and operation options. +func OpGet(key string, opts ...OpOption) Op { + // WithPrefix and WithFromKey are not supported together + if isWithPrefix(opts) && isWithFromKey(opts) { + panic("`WithPrefix` and `WithFromKey` cannot be set at the same time, choose one") + } + ret := Op{t: tRange, key: []byte(key)} + ret.applyOpts(opts) + return ret +} + +// OpDelete returns "delete" operation based on given key and operation options. +func OpDelete(key string, opts ...OpOption) Op { + // WithPrefix and WithFromKey are not supported together + if isWithPrefix(opts) && isWithFromKey(opts) { + panic("`WithPrefix` and `WithFromKey` cannot be set at the same time, choose one") + } + ret := Op{t: tDeleteRange, key: []byte(key)} + ret.applyOpts(opts) + switch { + case ret.leaseID != 0: + panic("unexpected lease in delete") + case ret.limit != 0: + panic("unexpected limit in delete") + case ret.rev != 0: + panic("unexpected revision in delete") + case ret.sort != nil: + panic("unexpected sort in delete") + case ret.serializable: + panic("unexpected serializable in delete") + case ret.countOnly: + panic("unexpected countOnly in delete") + case ret.minModRev != 0, ret.maxModRev != 0: + panic("unexpected mod revision filter in delete") + case ret.minCreateRev != 0, ret.maxCreateRev != 0: + panic("unexpected create revision filter in delete") + case ret.filterDelete, ret.filterPut: + panic("unexpected filter in delete") + case ret.createdNotify: + panic("unexpected createdNotify in delete") + } + return ret +} + +// OpPut returns "put" operation based on given key-value and operation options. +func OpPut(key, val string, opts ...OpOption) Op { + ret := Op{t: tPut, key: []byte(key), val: []byte(val)} + ret.applyOpts(opts) + switch { + case ret.end != nil: + panic("unexpected range in put") + case ret.limit != 0: + panic("unexpected limit in put") + case ret.rev != 0: + panic("unexpected revision in put") + case ret.sort != nil: + panic("unexpected sort in put") + case ret.serializable: + panic("unexpected serializable in put") + case ret.countOnly: + panic("unexpected countOnly in put") + case ret.minModRev != 0, ret.maxModRev != 0: + panic("unexpected mod revision filter in put") + case ret.minCreateRev != 0, ret.maxCreateRev != 0: + panic("unexpected create revision filter in put") + case ret.filterDelete, ret.filterPut: + panic("unexpected filter in put") + case ret.createdNotify: + panic("unexpected createdNotify in put") + } + return ret +} + +// OpTxn returns "txn" operation based on given transaction conditions. +func OpTxn(cmps []Cmp, thenOps []Op, elseOps []Op) Op { + return Op{t: tTxn, cmps: cmps, thenOps: thenOps, elseOps: elseOps} +} + +func opWatch(key string, opts ...OpOption) Op { + ret := Op{t: tRange, key: []byte(key)} + ret.applyOpts(opts) + switch { + case ret.leaseID != 0: + panic("unexpected lease in watch") + case ret.limit != 0: + panic("unexpected limit in watch") + case ret.sort != nil: + panic("unexpected sort in watch") + case ret.serializable: + panic("unexpected serializable in watch") + case ret.countOnly: + panic("unexpected countOnly in watch") + case ret.minModRev != 0, ret.maxModRev != 0: + panic("unexpected mod revision filter in watch") + case ret.minCreateRev != 0, ret.maxCreateRev != 0: + panic("unexpected create revision filter in watch") + } + return ret +} + +func (op *Op) applyOpts(opts []OpOption) { + for _, opt := range opts { + opt(op) + } +} + +// OpOption configures Operations like Get, Put, Delete. +type OpOption func(*Op) + +// WithLease attaches a lease ID to a key in 'Put' request. +func WithLease(leaseID LeaseID) OpOption { + return func(op *Op) { op.leaseID = leaseID } +} + +// WithLimit limits the number of results to return from 'Get' request. +// If WithLimit is given a 0 limit, it is treated as no limit. +func WithLimit(n int64) OpOption { return func(op *Op) { op.limit = n } } + +// WithRev specifies the store revision for 'Get' request. +// Or the start revision of 'Watch' request. +func WithRev(rev int64) OpOption { return func(op *Op) { op.rev = rev } } + +// WithSort specifies the ordering in 'Get' request. It requires +// 'WithRange' and/or 'WithPrefix' to be specified too. +// 'target' specifies the target to sort by: key, version, revisions, value. +// 'order' can be either 'SortNone', 'SortAscend', 'SortDescend'. +func WithSort(target SortTarget, order SortOrder) OpOption { + return func(op *Op) { + if target == SortByKey && order == SortAscend { + // If order != SortNone, server fetches the entire key-space, + // and then applies the sort and limit, if provided. + // Since by default the server returns results sorted by keys + // in lexicographically ascending order, the client should ignore + // SortOrder if the target is SortByKey. + order = SortNone + } + op.sort = &SortOption{target, order} + } +} + +// GetPrefixRangeEnd gets the range end of the prefix. +// 'Get(foo, WithPrefix())' is equal to 'Get(foo, WithRange(GetPrefixRangeEnd(foo))'. +func GetPrefixRangeEnd(prefix string) string { + return string(getPrefix([]byte(prefix))) +} + +func getPrefix(key []byte) []byte { + end := make([]byte, len(key)) + copy(end, key) + for i := len(end) - 1; i >= 0; i-- { + if end[i] < 0xff { + end[i] = end[i] + 1 + end = end[:i+1] + return end + } + } + // next prefix does not exist (e.g., 0xffff); + // default to WithFromKey policy + return noPrefixEnd +} + +// WithPrefix enables 'Get', 'Delete', or 'Watch' requests to operate +// on the keys with matching prefix. For example, 'Get(foo, WithPrefix())' +// can return 'foo1', 'foo2', and so on. +func WithPrefix() OpOption { + return func(op *Op) { + if len(op.key) == 0 { + op.key, op.end = []byte{0}, []byte{0} + return + } + op.end = getPrefix(op.key) + } +} + +// WithRange specifies the range of 'Get', 'Delete', 'Watch' requests. +// For example, 'Get' requests with 'WithRange(end)' returns +// the keys in the range [key, end). +// endKey must be lexicographically greater than start key. +func WithRange(endKey string) OpOption { + return func(op *Op) { op.end = []byte(endKey) } +} + +// WithFromKey specifies the range of 'Get', 'Delete', 'Watch' requests +// to be equal or greater than the key in the argument. +func WithFromKey() OpOption { + return func(op *Op) { + if len(op.key) == 0 { + op.key = []byte{0} + } + op.end = []byte("\x00") + } +} + +// WithSerializable makes 'Get' request serializable. By default, +// it's linearizable. Serializable requests are better for lower latency +// requirement. +func WithSerializable() OpOption { + return func(op *Op) { op.serializable = true } +} + +// WithKeysOnly makes the 'Get' request return only the keys and the corresponding +// values will be omitted. +func WithKeysOnly() OpOption { + return func(op *Op) { op.keysOnly = true } +} + +// WithCountOnly makes the 'Get' request return only the count of keys. +func WithCountOnly() OpOption { + return func(op *Op) { op.countOnly = true } +} + +// WithMinModRev filters out keys for Get with modification revisions less than the given revision. +func WithMinModRev(rev int64) OpOption { return func(op *Op) { op.minModRev = rev } } + +// WithMaxModRev filters out keys for Get with modification revisions greater than the given revision. +func WithMaxModRev(rev int64) OpOption { return func(op *Op) { op.maxModRev = rev } } + +// WithMinCreateRev filters out keys for Get with creation revisions less than the given revision. +func WithMinCreateRev(rev int64) OpOption { return func(op *Op) { op.minCreateRev = rev } } + +// WithMaxCreateRev filters out keys for Get with creation revisions greater than the given revision. +func WithMaxCreateRev(rev int64) OpOption { return func(op *Op) { op.maxCreateRev = rev } } + +// WithFirstCreate gets the key with the oldest creation revision in the request range. +func WithFirstCreate() []OpOption { return withTop(SortByCreateRevision, SortAscend) } + +// WithLastCreate gets the key with the latest creation revision in the request range. +func WithLastCreate() []OpOption { return withTop(SortByCreateRevision, SortDescend) } + +// WithFirstKey gets the lexically first key in the request range. +func WithFirstKey() []OpOption { return withTop(SortByKey, SortAscend) } + +// WithLastKey gets the lexically last key in the request range. +func WithLastKey() []OpOption { return withTop(SortByKey, SortDescend) } + +// WithFirstRev gets the key with the oldest modification revision in the request range. +func WithFirstRev() []OpOption { return withTop(SortByModRevision, SortAscend) } + +// WithLastRev gets the key with the latest modification revision in the request range. +func WithLastRev() []OpOption { return withTop(SortByModRevision, SortDescend) } + +// withTop gets the first key over the get's prefix given a sort order +func withTop(target SortTarget, order SortOrder) []OpOption { + return []OpOption{WithPrefix(), WithSort(target, order), WithLimit(1)} +} + +// WithProgressNotify makes watch server send periodic progress updates +// every 10 minutes when there is no incoming events. +// Progress updates have zero events in WatchResponse. +func WithProgressNotify() OpOption { + return func(op *Op) { + op.progressNotify = true + } +} + +// WithCreatedNotify makes watch server sends the created event. +func WithCreatedNotify() OpOption { + return func(op *Op) { + op.createdNotify = true + } +} + +// WithFilterPut discards PUT events from the watcher. +func WithFilterPut() OpOption { + return func(op *Op) { op.filterPut = true } +} + +// WithFilterDelete discards DELETE events from the watcher. +func WithFilterDelete() OpOption { + return func(op *Op) { op.filterDelete = true } +} + +// WithPrevKV gets the previous key-value pair before the event happens. If the previous KV is already compacted, +// nothing will be returned. +func WithPrevKV() OpOption { + return func(op *Op) { + op.prevKV = true + } +} + +// WithFragment to receive raw watch response with fragmentation. +// Fragmentation is disabled by default. If fragmentation is enabled, +// etcd watch server will split watch response before sending to clients +// when the total size of watch events exceed server-side request limit. +// The default server-side request limit is 1.5 MiB, which can be configured +// as "--max-request-bytes" flag value + gRPC-overhead 512 bytes. +// See "etcdserver/api/v3rpc/watch.go" for more details. +func WithFragment() OpOption { + return func(op *Op) { op.fragment = true } +} + +// WithIgnoreValue updates the key using its current value. +// This option can not be combined with non-empty values. +// Returns an error if the key does not exist. +func WithIgnoreValue() OpOption { + return func(op *Op) { + op.ignoreValue = true + } +} + +// WithIgnoreLease updates the key using its current lease. +// This option can not be combined with WithLease. +// Returns an error if the key does not exist. +func WithIgnoreLease() OpOption { + return func(op *Op) { + op.ignoreLease = true + } +} + +// LeaseOp represents an Operation that lease can execute. +type LeaseOp struct { + id LeaseID + + // for TimeToLive + attachedKeys bool +} + +// LeaseOption configures lease operations. +type LeaseOption func(*LeaseOp) + +func (op *LeaseOp) applyOpts(opts []LeaseOption) { + for _, opt := range opts { + opt(op) + } +} + +// WithAttachedKeys makes TimeToLive list the keys attached to the given lease ID. +func WithAttachedKeys() LeaseOption { + return func(op *LeaseOp) { op.attachedKeys = true } +} + +func toLeaseTimeToLiveRequest(id LeaseID, opts ...LeaseOption) *pb.LeaseTimeToLiveRequest { + ret := &LeaseOp{id: id} + ret.applyOpts(opts) + return &pb.LeaseTimeToLiveRequest{ID: int64(id), Keys: ret.attachedKeys} +} + +// isWithPrefix returns true if WithPrefix is being called in the op +func isWithPrefix(opts []OpOption) bool { return isOpFuncCalled("WithPrefix", opts) } + +// isWithFromKey returns true if WithFromKey is being called in the op +func isWithFromKey(opts []OpOption) bool { return isOpFuncCalled("WithFromKey", opts) } diff --git a/vendor/go.etcd.io/etcd/clientv3/options.go b/vendor/go.etcd.io/etcd/clientv3/options.go new file mode 100644 index 00000000..700714c0 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/options.go @@ -0,0 +1,65 @@ +// Copyright 2017 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "math" + "time" + + "google.golang.org/grpc" +) + +var ( + // client-side handling retrying of request failures where data was not written to the wire or + // where server indicates it did not process the data. gRPC default is default is "FailFast(true)" + // but for etcd we default to "FailFast(false)" to minimize client request error responses due to + // transient failures. + defaultFailFast = grpc.FailFast(false) + + // client-side request send limit, gRPC default is math.MaxInt32 + // Make sure that "client-side send limit < server-side default send/recv limit" + // Same value as "embed.DefaultMaxRequestBytes" plus gRPC overhead bytes + defaultMaxCallSendMsgSize = grpc.MaxCallSendMsgSize(2 * 1024 * 1024) + + // client-side response receive limit, gRPC default is 4MB + // Make sure that "client-side receive limit >= server-side default send/recv limit" + // because range response can easily exceed request send limits + // Default to math.MaxInt32; writes exceeding server-side send limit fails anyway + defaultMaxCallRecvMsgSize = grpc.MaxCallRecvMsgSize(math.MaxInt32) + + // client-side non-streaming retry limit, only applied to requests where server responds with + // a error code clearly indicating it was unable to process the request such as codes.Unavailable. + // If set to 0, retry is disabled. + defaultUnaryMaxRetries uint = 100 + + // client-side streaming retry limit, only applied to requests where server responds with + // a error code clearly indicating it was unable to process the request such as codes.Unavailable. + // If set to 0, retry is disabled. + defaultStreamMaxRetries = ^uint(0) // max uint + + // client-side retry backoff wait between requests. + defaultBackoffWaitBetween = 25 * time.Millisecond + + // client-side retry backoff default jitter fraction. + defaultBackoffJitterFraction = 0.10 +) + +// defaultCallOpts defines a list of default "gRPC.CallOption". +// Some options are exposed to "clientv3.Config". +// Defaults will be overridden by the settings in "clientv3.Config". +var defaultCallOpts = []grpc.CallOption{defaultFailFast, defaultMaxCallSendMsgSize, defaultMaxCallRecvMsgSize} + +// MaxLeaseTTL is the maximum lease TTL value +const MaxLeaseTTL = 9000000000 diff --git a/vendor/go.etcd.io/etcd/clientv3/retry.go b/vendor/go.etcd.io/etcd/clientv3/retry.go new file mode 100644 index 00000000..7e855de0 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/retry.go @@ -0,0 +1,298 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + + "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +type retryPolicy uint8 + +const ( + repeatable retryPolicy = iota + nonRepeatable +) + +func (rp retryPolicy) String() string { + switch rp { + case repeatable: + return "repeatable" + case nonRepeatable: + return "nonRepeatable" + default: + return "UNKNOWN" + } +} + +// isSafeRetryImmutableRPC returns "true" when an immutable request is safe for retry. +// +// immutable requests (e.g. Get) should be retried unless it's +// an obvious server-side error (e.g. rpctypes.ErrRequestTooLarge). +// +// Returning "false" means retry should stop, since client cannot +// handle itself even with retries. +func isSafeRetryImmutableRPC(err error) bool { + eErr := rpctypes.Error(err) + if serverErr, ok := eErr.(rpctypes.EtcdError); ok && serverErr.Code() != codes.Unavailable { + // interrupted by non-transient server-side or gRPC-side error + // client cannot handle itself (e.g. rpctypes.ErrCompacted) + return false + } + // only retry if unavailable + ev, ok := status.FromError(err) + if !ok { + // all errors from RPC is typed "grpc/status.(*statusError)" + // (ref. https://github.com/grpc/grpc-go/pull/1782) + // + // if the error type is not "grpc/status.(*statusError)", + // it could be from "Dial" + // TODO: do not retry for now + // ref. https://github.com/grpc/grpc-go/issues/1581 + return false + } + return ev.Code() == codes.Unavailable +} + +// isSafeRetryMutableRPC returns "true" when a mutable request is safe for retry. +// +// mutable requests (e.g. Put, Delete, Txn) should only be retried +// when the status code is codes.Unavailable when initial connection +// has not been established (no endpoint is up). +// +// Returning "false" means retry should stop, otherwise it violates +// write-at-most-once semantics. +func isSafeRetryMutableRPC(err error) bool { + if ev, ok := status.FromError(err); ok && ev.Code() != codes.Unavailable { + // not safe for mutable RPCs + // e.g. interrupted by non-transient error that client cannot handle itself, + // or transient error while the connection has already been established + return false + } + desc := rpctypes.ErrorDesc(err) + return desc == "there is no address available" || desc == "there is no connection available" +} + +type retryKVClient struct { + kc pb.KVClient +} + +// RetryKVClient implements a KVClient. +func RetryKVClient(c *Client) pb.KVClient { + return &retryKVClient{ + kc: pb.NewKVClient(c.conn), + } +} +func (rkv *retryKVClient) Range(ctx context.Context, in *pb.RangeRequest, opts ...grpc.CallOption) (resp *pb.RangeResponse, err error) { + return rkv.kc.Range(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rkv *retryKVClient) Put(ctx context.Context, in *pb.PutRequest, opts ...grpc.CallOption) (resp *pb.PutResponse, err error) { + return rkv.kc.Put(ctx, in, opts...) +} + +func (rkv *retryKVClient) DeleteRange(ctx context.Context, in *pb.DeleteRangeRequest, opts ...grpc.CallOption) (resp *pb.DeleteRangeResponse, err error) { + return rkv.kc.DeleteRange(ctx, in, opts...) +} + +func (rkv *retryKVClient) Txn(ctx context.Context, in *pb.TxnRequest, opts ...grpc.CallOption) (resp *pb.TxnResponse, err error) { + return rkv.kc.Txn(ctx, in, opts...) +} + +func (rkv *retryKVClient) Compact(ctx context.Context, in *pb.CompactionRequest, opts ...grpc.CallOption) (resp *pb.CompactionResponse, err error) { + return rkv.kc.Compact(ctx, in, opts...) +} + +type retryLeaseClient struct { + lc pb.LeaseClient +} + +// RetryLeaseClient implements a LeaseClient. +func RetryLeaseClient(c *Client) pb.LeaseClient { + return &retryLeaseClient{ + lc: pb.NewLeaseClient(c.conn), + } +} + +func (rlc *retryLeaseClient) LeaseTimeToLive(ctx context.Context, in *pb.LeaseTimeToLiveRequest, opts ...grpc.CallOption) (resp *pb.LeaseTimeToLiveResponse, err error) { + return rlc.lc.LeaseTimeToLive(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rlc *retryLeaseClient) LeaseLeases(ctx context.Context, in *pb.LeaseLeasesRequest, opts ...grpc.CallOption) (resp *pb.LeaseLeasesResponse, err error) { + return rlc.lc.LeaseLeases(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rlc *retryLeaseClient) LeaseGrant(ctx context.Context, in *pb.LeaseGrantRequest, opts ...grpc.CallOption) (resp *pb.LeaseGrantResponse, err error) { + return rlc.lc.LeaseGrant(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rlc *retryLeaseClient) LeaseRevoke(ctx context.Context, in *pb.LeaseRevokeRequest, opts ...grpc.CallOption) (resp *pb.LeaseRevokeResponse, err error) { + return rlc.lc.LeaseRevoke(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rlc *retryLeaseClient) LeaseKeepAlive(ctx context.Context, opts ...grpc.CallOption) (stream pb.Lease_LeaseKeepAliveClient, err error) { + return rlc.lc.LeaseKeepAlive(ctx, append(opts, withRetryPolicy(repeatable))...) +} + +type retryClusterClient struct { + cc pb.ClusterClient +} + +// RetryClusterClient implements a ClusterClient. +func RetryClusterClient(c *Client) pb.ClusterClient { + return &retryClusterClient{ + cc: pb.NewClusterClient(c.conn), + } +} + +func (rcc *retryClusterClient) MemberList(ctx context.Context, in *pb.MemberListRequest, opts ...grpc.CallOption) (resp *pb.MemberListResponse, err error) { + return rcc.cc.MemberList(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rcc *retryClusterClient) MemberAdd(ctx context.Context, in *pb.MemberAddRequest, opts ...grpc.CallOption) (resp *pb.MemberAddResponse, err error) { + return rcc.cc.MemberAdd(ctx, in, opts...) +} + +func (rcc *retryClusterClient) MemberRemove(ctx context.Context, in *pb.MemberRemoveRequest, opts ...grpc.CallOption) (resp *pb.MemberRemoveResponse, err error) { + return rcc.cc.MemberRemove(ctx, in, opts...) +} + +func (rcc *retryClusterClient) MemberUpdate(ctx context.Context, in *pb.MemberUpdateRequest, opts ...grpc.CallOption) (resp *pb.MemberUpdateResponse, err error) { + return rcc.cc.MemberUpdate(ctx, in, opts...) +} + +func (rcc *retryClusterClient) MemberPromote(ctx context.Context, in *pb.MemberPromoteRequest, opts ...grpc.CallOption) (resp *pb.MemberPromoteResponse, err error) { + return rcc.cc.MemberPromote(ctx, in, opts...) +} + +type retryMaintenanceClient struct { + mc pb.MaintenanceClient +} + +// RetryMaintenanceClient implements a Maintenance. +func RetryMaintenanceClient(c *Client, conn *grpc.ClientConn) pb.MaintenanceClient { + return &retryMaintenanceClient{ + mc: pb.NewMaintenanceClient(conn), + } +} + +func (rmc *retryMaintenanceClient) Alarm(ctx context.Context, in *pb.AlarmRequest, opts ...grpc.CallOption) (resp *pb.AlarmResponse, err error) { + return rmc.mc.Alarm(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rmc *retryMaintenanceClient) Status(ctx context.Context, in *pb.StatusRequest, opts ...grpc.CallOption) (resp *pb.StatusResponse, err error) { + return rmc.mc.Status(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rmc *retryMaintenanceClient) Hash(ctx context.Context, in *pb.HashRequest, opts ...grpc.CallOption) (resp *pb.HashResponse, err error) { + return rmc.mc.Hash(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rmc *retryMaintenanceClient) HashKV(ctx context.Context, in *pb.HashKVRequest, opts ...grpc.CallOption) (resp *pb.HashKVResponse, err error) { + return rmc.mc.HashKV(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rmc *retryMaintenanceClient) Snapshot(ctx context.Context, in *pb.SnapshotRequest, opts ...grpc.CallOption) (stream pb.Maintenance_SnapshotClient, err error) { + return rmc.mc.Snapshot(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rmc *retryMaintenanceClient) MoveLeader(ctx context.Context, in *pb.MoveLeaderRequest, opts ...grpc.CallOption) (resp *pb.MoveLeaderResponse, err error) { + return rmc.mc.MoveLeader(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rmc *retryMaintenanceClient) Defragment(ctx context.Context, in *pb.DefragmentRequest, opts ...grpc.CallOption) (resp *pb.DefragmentResponse, err error) { + return rmc.mc.Defragment(ctx, in, opts...) +} + +type retryAuthClient struct { + ac pb.AuthClient +} + +// RetryAuthClient implements a AuthClient. +func RetryAuthClient(c *Client) pb.AuthClient { + return &retryAuthClient{ + ac: pb.NewAuthClient(c.conn), + } +} + +func (rac *retryAuthClient) UserList(ctx context.Context, in *pb.AuthUserListRequest, opts ...grpc.CallOption) (resp *pb.AuthUserListResponse, err error) { + return rac.ac.UserList(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rac *retryAuthClient) UserGet(ctx context.Context, in *pb.AuthUserGetRequest, opts ...grpc.CallOption) (resp *pb.AuthUserGetResponse, err error) { + return rac.ac.UserGet(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rac *retryAuthClient) RoleGet(ctx context.Context, in *pb.AuthRoleGetRequest, opts ...grpc.CallOption) (resp *pb.AuthRoleGetResponse, err error) { + return rac.ac.RoleGet(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rac *retryAuthClient) RoleList(ctx context.Context, in *pb.AuthRoleListRequest, opts ...grpc.CallOption) (resp *pb.AuthRoleListResponse, err error) { + return rac.ac.RoleList(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + +func (rac *retryAuthClient) AuthEnable(ctx context.Context, in *pb.AuthEnableRequest, opts ...grpc.CallOption) (resp *pb.AuthEnableResponse, err error) { + return rac.ac.AuthEnable(ctx, in, opts...) +} + +func (rac *retryAuthClient) AuthDisable(ctx context.Context, in *pb.AuthDisableRequest, opts ...grpc.CallOption) (resp *pb.AuthDisableResponse, err error) { + return rac.ac.AuthDisable(ctx, in, opts...) +} + +func (rac *retryAuthClient) UserAdd(ctx context.Context, in *pb.AuthUserAddRequest, opts ...grpc.CallOption) (resp *pb.AuthUserAddResponse, err error) { + return rac.ac.UserAdd(ctx, in, opts...) +} + +func (rac *retryAuthClient) UserDelete(ctx context.Context, in *pb.AuthUserDeleteRequest, opts ...grpc.CallOption) (resp *pb.AuthUserDeleteResponse, err error) { + return rac.ac.UserDelete(ctx, in, opts...) +} + +func (rac *retryAuthClient) UserChangePassword(ctx context.Context, in *pb.AuthUserChangePasswordRequest, opts ...grpc.CallOption) (resp *pb.AuthUserChangePasswordResponse, err error) { + return rac.ac.UserChangePassword(ctx, in, opts...) +} + +func (rac *retryAuthClient) UserGrantRole(ctx context.Context, in *pb.AuthUserGrantRoleRequest, opts ...grpc.CallOption) (resp *pb.AuthUserGrantRoleResponse, err error) { + return rac.ac.UserGrantRole(ctx, in, opts...) +} + +func (rac *retryAuthClient) UserRevokeRole(ctx context.Context, in *pb.AuthUserRevokeRoleRequest, opts ...grpc.CallOption) (resp *pb.AuthUserRevokeRoleResponse, err error) { + return rac.ac.UserRevokeRole(ctx, in, opts...) +} + +func (rac *retryAuthClient) RoleAdd(ctx context.Context, in *pb.AuthRoleAddRequest, opts ...grpc.CallOption) (resp *pb.AuthRoleAddResponse, err error) { + return rac.ac.RoleAdd(ctx, in, opts...) +} + +func (rac *retryAuthClient) RoleDelete(ctx context.Context, in *pb.AuthRoleDeleteRequest, opts ...grpc.CallOption) (resp *pb.AuthRoleDeleteResponse, err error) { + return rac.ac.RoleDelete(ctx, in, opts...) +} + +func (rac *retryAuthClient) RoleGrantPermission(ctx context.Context, in *pb.AuthRoleGrantPermissionRequest, opts ...grpc.CallOption) (resp *pb.AuthRoleGrantPermissionResponse, err error) { + return rac.ac.RoleGrantPermission(ctx, in, opts...) +} + +func (rac *retryAuthClient) RoleRevokePermission(ctx context.Context, in *pb.AuthRoleRevokePermissionRequest, opts ...grpc.CallOption) (resp *pb.AuthRoleRevokePermissionResponse, err error) { + return rac.ac.RoleRevokePermission(ctx, in, opts...) +} + +func (rac *retryAuthClient) Authenticate(ctx context.Context, in *pb.AuthenticateRequest, opts ...grpc.CallOption) (resp *pb.AuthenticateResponse, err error) { + return rac.ac.Authenticate(ctx, in, opts...) +} diff --git a/vendor/go.etcd.io/etcd/clientv3/retry_interceptor.go b/vendor/go.etcd.io/etcd/clientv3/retry_interceptor.go new file mode 100644 index 00000000..2c266e55 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/retry_interceptor.go @@ -0,0 +1,392 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Based on github.com/grpc-ecosystem/go-grpc-middleware/retry, but modified to support the more +// fine grained error checking required by write-at-most-once retry semantics of etcd. + +package clientv3 + +import ( + "context" + "io" + "sync" + "time" + + "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" + "go.uber.org/zap" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// unaryClientInterceptor returns a new retrying unary client interceptor. +// +// The default configuration of the interceptor is to not retry *at all*. This behaviour can be +// changed through options (e.g. WithMax) on creation of the interceptor or on call (through grpc.CallOptions). +func (c *Client) unaryClientInterceptor(logger *zap.Logger, optFuncs ...retryOption) grpc.UnaryClientInterceptor { + intOpts := reuseOrNewWithCallOptions(defaultOptions, optFuncs) + return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + ctx = withVersion(ctx) + grpcOpts, retryOpts := filterCallOptions(opts) + callOpts := reuseOrNewWithCallOptions(intOpts, retryOpts) + // short circuit for simplicity, and avoiding allocations. + if callOpts.max == 0 { + return invoker(ctx, method, req, reply, cc, grpcOpts...) + } + var lastErr error + for attempt := uint(0); attempt < callOpts.max; attempt++ { + if err := waitRetryBackoff(ctx, attempt, callOpts); err != nil { + return err + } + logger.Debug( + "retrying of unary invoker", + zap.String("target", cc.Target()), + zap.Uint("attempt", attempt), + ) + lastErr = invoker(ctx, method, req, reply, cc, grpcOpts...) + if lastErr == nil { + return nil + } + logger.Warn( + "retrying of unary invoker failed", + zap.String("target", cc.Target()), + zap.Uint("attempt", attempt), + zap.Error(lastErr), + ) + if isContextError(lastErr) { + if ctx.Err() != nil { + // its the context deadline or cancellation. + return lastErr + } + // its the callCtx deadline or cancellation, in which case try again. + continue + } + if callOpts.retryAuth && rpctypes.Error(lastErr) == rpctypes.ErrInvalidAuthToken { + gterr := c.getToken(ctx) + if gterr != nil { + logger.Warn( + "retrying of unary invoker failed to fetch new auth token", + zap.String("target", cc.Target()), + zap.Error(gterr), + ) + return gterr // lastErr must be invalid auth token + } + continue + } + if !isSafeRetry(c.lg, lastErr, callOpts) { + return lastErr + } + } + return lastErr + } +} + +// streamClientInterceptor returns a new retrying stream client interceptor for server side streaming calls. +// +// The default configuration of the interceptor is to not retry *at all*. This behaviour can be +// changed through options (e.g. WithMax) on creation of the interceptor or on call (through grpc.CallOptions). +// +// Retry logic is available *only for ServerStreams*, i.e. 1:n streams, as the internal logic needs +// to buffer the messages sent by the client. If retry is enabled on any other streams (ClientStreams, +// BidiStreams), the retry interceptor will fail the call. +func (c *Client) streamClientInterceptor(logger *zap.Logger, optFuncs ...retryOption) grpc.StreamClientInterceptor { + intOpts := reuseOrNewWithCallOptions(defaultOptions, optFuncs) + return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { + ctx = withVersion(ctx) + grpcOpts, retryOpts := filterCallOptions(opts) + callOpts := reuseOrNewWithCallOptions(intOpts, retryOpts) + // short circuit for simplicity, and avoiding allocations. + if callOpts.max == 0 { + return streamer(ctx, desc, cc, method, grpcOpts...) + } + if desc.ClientStreams { + return nil, status.Errorf(codes.Unimplemented, "clientv3/retry_interceptor: cannot retry on ClientStreams, set Disable()") + } + newStreamer, err := streamer(ctx, desc, cc, method, grpcOpts...) + if err != nil { + logger.Error("streamer failed to create ClientStream", zap.Error(err)) + return nil, err // TODO(mwitkow): Maybe dial and transport errors should be retriable? + } + retryingStreamer := &serverStreamingRetryingStream{ + client: c, + ClientStream: newStreamer, + callOpts: callOpts, + ctx: ctx, + streamerCall: func(ctx context.Context) (grpc.ClientStream, error) { + return streamer(ctx, desc, cc, method, grpcOpts...) + }, + } + return retryingStreamer, nil + } +} + +// type serverStreamingRetryingStream is the implementation of grpc.ClientStream that acts as a +// proxy to the underlying call. If any of the RecvMsg() calls fail, it will try to reestablish +// a new ClientStream according to the retry policy. +type serverStreamingRetryingStream struct { + grpc.ClientStream + client *Client + bufferedSends []interface{} // single message that the client can sen + receivedGood bool // indicates whether any prior receives were successful + wasClosedSend bool // indicates that CloseSend was closed + ctx context.Context + callOpts *options + streamerCall func(ctx context.Context) (grpc.ClientStream, error) + mu sync.RWMutex +} + +func (s *serverStreamingRetryingStream) setStream(clientStream grpc.ClientStream) { + s.mu.Lock() + s.ClientStream = clientStream + s.mu.Unlock() +} + +func (s *serverStreamingRetryingStream) getStream() grpc.ClientStream { + s.mu.RLock() + defer s.mu.RUnlock() + return s.ClientStream +} + +func (s *serverStreamingRetryingStream) SendMsg(m interface{}) error { + s.mu.Lock() + s.bufferedSends = append(s.bufferedSends, m) + s.mu.Unlock() + return s.getStream().SendMsg(m) +} + +func (s *serverStreamingRetryingStream) CloseSend() error { + s.mu.Lock() + s.wasClosedSend = true + s.mu.Unlock() + return s.getStream().CloseSend() +} + +func (s *serverStreamingRetryingStream) Header() (metadata.MD, error) { + return s.getStream().Header() +} + +func (s *serverStreamingRetryingStream) Trailer() metadata.MD { + return s.getStream().Trailer() +} + +func (s *serverStreamingRetryingStream) RecvMsg(m interface{}) error { + attemptRetry, lastErr := s.receiveMsgAndIndicateRetry(m) + if !attemptRetry { + return lastErr // success or hard failure + } + + // We start off from attempt 1, because zeroth was already made on normal SendMsg(). + for attempt := uint(1); attempt < s.callOpts.max; attempt++ { + if err := waitRetryBackoff(s.ctx, attempt, s.callOpts); err != nil { + return err + } + newStream, err := s.reestablishStreamAndResendBuffer(s.ctx) + if err != nil { + s.client.lg.Error("failed reestablishStreamAndResendBuffer", zap.Error(err)) + return err // TODO(mwitkow): Maybe dial and transport errors should be retriable? + } + s.setStream(newStream) + + s.client.lg.Warn("retrying RecvMsg", zap.Error(lastErr)) + attemptRetry, lastErr = s.receiveMsgAndIndicateRetry(m) + if !attemptRetry { + return lastErr + } + } + return lastErr +} + +func (s *serverStreamingRetryingStream) receiveMsgAndIndicateRetry(m interface{}) (bool, error) { + s.mu.RLock() + wasGood := s.receivedGood + s.mu.RUnlock() + err := s.getStream().RecvMsg(m) + if err == nil || err == io.EOF { + s.mu.Lock() + s.receivedGood = true + s.mu.Unlock() + return false, err + } else if wasGood { + // previous RecvMsg in the stream succeeded, no retry logic should interfere + return false, err + } + if isContextError(err) { + if s.ctx.Err() != nil { + return false, err + } + // its the callCtx deadline or cancellation, in which case try again. + return true, err + } + if s.callOpts.retryAuth && rpctypes.Error(err) == rpctypes.ErrInvalidAuthToken { + gterr := s.client.getToken(s.ctx) + if gterr != nil { + s.client.lg.Warn("retry failed to fetch new auth token", zap.Error(gterr)) + return false, err // return the original error for simplicity + } + return true, err + + } + return isSafeRetry(s.client.lg, err, s.callOpts), err +} + +func (s *serverStreamingRetryingStream) reestablishStreamAndResendBuffer(callCtx context.Context) (grpc.ClientStream, error) { + s.mu.RLock() + bufferedSends := s.bufferedSends + s.mu.RUnlock() + newStream, err := s.streamerCall(callCtx) + if err != nil { + return nil, err + } + for _, msg := range bufferedSends { + if err := newStream.SendMsg(msg); err != nil { + return nil, err + } + } + if err := newStream.CloseSend(); err != nil { + return nil, err + } + return newStream, nil +} + +func waitRetryBackoff(ctx context.Context, attempt uint, callOpts *options) error { + waitTime := time.Duration(0) + if attempt > 0 { + waitTime = callOpts.backoffFunc(attempt) + } + if waitTime > 0 { + timer := time.NewTimer(waitTime) + select { + case <-ctx.Done(): + timer.Stop() + return contextErrToGrpcErr(ctx.Err()) + case <-timer.C: + } + } + return nil +} + +// isSafeRetry returns "true", if request is safe for retry with the given error. +func isSafeRetry(lg *zap.Logger, err error, callOpts *options) bool { + if isContextError(err) { + return false + } + switch callOpts.retryPolicy { + case repeatable: + return isSafeRetryImmutableRPC(err) + case nonRepeatable: + return isSafeRetryMutableRPC(err) + default: + lg.Warn("unrecognized retry policy", zap.String("retryPolicy", callOpts.retryPolicy.String())) + return false + } +} + +func isContextError(err error) bool { + return grpc.Code(err) == codes.DeadlineExceeded || grpc.Code(err) == codes.Canceled +} + +func contextErrToGrpcErr(err error) error { + switch err { + case context.DeadlineExceeded: + return status.Errorf(codes.DeadlineExceeded, err.Error()) + case context.Canceled: + return status.Errorf(codes.Canceled, err.Error()) + default: + return status.Errorf(codes.Unknown, err.Error()) + } +} + +var ( + defaultOptions = &options{ + retryPolicy: nonRepeatable, + max: 0, // disable + backoffFunc: backoffLinearWithJitter(50*time.Millisecond /*jitter*/, 0.10), + retryAuth: true, + } +) + +// backoffFunc denotes a family of functions that control the backoff duration between call retries. +// +// They are called with an identifier of the attempt, and should return a time the system client should +// hold off for. If the time returned is longer than the `context.Context.Deadline` of the request +// the deadline of the request takes precedence and the wait will be interrupted before proceeding +// with the next iteration. +type backoffFunc func(attempt uint) time.Duration + +// withRetryPolicy sets the retry policy of this call. +func withRetryPolicy(rp retryPolicy) retryOption { + return retryOption{applyFunc: func(o *options) { + o.retryPolicy = rp + }} +} + +// withMax sets the maximum number of retries on this call, or this interceptor. +func withMax(maxRetries uint) retryOption { + return retryOption{applyFunc: func(o *options) { + o.max = maxRetries + }} +} + +// WithBackoff sets the `BackoffFunc `used to control time between retries. +func withBackoff(bf backoffFunc) retryOption { + return retryOption{applyFunc: func(o *options) { + o.backoffFunc = bf + }} +} + +type options struct { + retryPolicy retryPolicy + max uint + backoffFunc backoffFunc + retryAuth bool +} + +// retryOption is a grpc.CallOption that is local to clientv3's retry interceptor. +type retryOption struct { + grpc.EmptyCallOption // make sure we implement private after() and before() fields so we don't panic. + applyFunc func(opt *options) +} + +func reuseOrNewWithCallOptions(opt *options, retryOptions []retryOption) *options { + if len(retryOptions) == 0 { + return opt + } + optCopy := &options{} + *optCopy = *opt + for _, f := range retryOptions { + f.applyFunc(optCopy) + } + return optCopy +} + +func filterCallOptions(callOptions []grpc.CallOption) (grpcOptions []grpc.CallOption, retryOptions []retryOption) { + for _, opt := range callOptions { + if co, ok := opt.(retryOption); ok { + retryOptions = append(retryOptions, co) + } else { + grpcOptions = append(grpcOptions, opt) + } + } + return grpcOptions, retryOptions +} + +// BackoffLinearWithJitter waits a set period of time, allowing for jitter (fractional adjustment). +// +// For example waitBetween=1s and jitter=0.10 can generate waits between 900ms and 1100ms. +func backoffLinearWithJitter(waitBetween time.Duration, jitterFraction float64) backoffFunc { + return func(attempt uint) time.Duration { + return jitterUp(waitBetween, jitterFraction) + } +} diff --git a/vendor/go.etcd.io/etcd/clientv3/sort.go b/vendor/go.etcd.io/etcd/clientv3/sort.go new file mode 100644 index 00000000..2bb9d9a1 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/sort.go @@ -0,0 +1,37 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +type SortTarget int +type SortOrder int + +const ( + SortNone SortOrder = iota + SortAscend + SortDescend +) + +const ( + SortByKey SortTarget = iota + SortByVersion + SortByCreateRevision + SortByModRevision + SortByValue +) + +type SortOption struct { + Target SortTarget + Order SortOrder +} diff --git a/vendor/go.etcd.io/etcd/clientv3/txn.go b/vendor/go.etcd.io/etcd/clientv3/txn.go new file mode 100644 index 00000000..c19715da --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/txn.go @@ -0,0 +1,151 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + "sync" + + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + + "google.golang.org/grpc" +) + +// Txn is the interface that wraps mini-transactions. +// +// Txn(context.TODO()).If( +// Compare(Value(k1), ">", v1), +// Compare(Version(k1), "=", 2) +// ).Then( +// OpPut(k2,v2), OpPut(k3,v3) +// ).Else( +// OpPut(k4,v4), OpPut(k5,v5) +// ).Commit() +// +type Txn interface { + // If takes a list of comparison. If all comparisons passed in succeed, + // the operations passed into Then() will be executed. Or the operations + // passed into Else() will be executed. + If(cs ...Cmp) Txn + + // Then takes a list of operations. The Ops list will be executed, if the + // comparisons passed in If() succeed. + Then(ops ...Op) Txn + + // Else takes a list of operations. The Ops list will be executed, if the + // comparisons passed in If() fail. + Else(ops ...Op) Txn + + // Commit tries to commit the transaction. + Commit() (*TxnResponse, error) +} + +type txn struct { + kv *kv + ctx context.Context + + mu sync.Mutex + cif bool + cthen bool + celse bool + + isWrite bool + + cmps []*pb.Compare + + sus []*pb.RequestOp + fas []*pb.RequestOp + + callOpts []grpc.CallOption +} + +func (txn *txn) If(cs ...Cmp) Txn { + txn.mu.Lock() + defer txn.mu.Unlock() + + if txn.cif { + panic("cannot call If twice!") + } + + if txn.cthen { + panic("cannot call If after Then!") + } + + if txn.celse { + panic("cannot call If after Else!") + } + + txn.cif = true + + for i := range cs { + txn.cmps = append(txn.cmps, (*pb.Compare)(&cs[i])) + } + + return txn +} + +func (txn *txn) Then(ops ...Op) Txn { + txn.mu.Lock() + defer txn.mu.Unlock() + + if txn.cthen { + panic("cannot call Then twice!") + } + if txn.celse { + panic("cannot call Then after Else!") + } + + txn.cthen = true + + for _, op := range ops { + txn.isWrite = txn.isWrite || op.isWrite() + txn.sus = append(txn.sus, op.toRequestOp()) + } + + return txn +} + +func (txn *txn) Else(ops ...Op) Txn { + txn.mu.Lock() + defer txn.mu.Unlock() + + if txn.celse { + panic("cannot call Else twice!") + } + + txn.celse = true + + for _, op := range ops { + txn.isWrite = txn.isWrite || op.isWrite() + txn.fas = append(txn.fas, op.toRequestOp()) + } + + return txn +} + +func (txn *txn) Commit() (*TxnResponse, error) { + txn.mu.Lock() + defer txn.mu.Unlock() + + r := &pb.TxnRequest{Compare: txn.cmps, Success: txn.sus, Failure: txn.fas} + + var resp *pb.TxnResponse + var err error + resp, err = txn.kv.remote.Txn(txn.ctx, r, txn.callOpts...) + if err != nil { + return nil, toErr(txn.ctx, err) + } + return (*TxnResponse)(resp), nil +} diff --git a/vendor/go.etcd.io/etcd/clientv3/utils.go b/vendor/go.etcd.io/etcd/clientv3/utils.go new file mode 100644 index 00000000..b998c41b --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/utils.go @@ -0,0 +1,49 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "math/rand" + "reflect" + "runtime" + "strings" + "time" +) + +// jitterUp adds random jitter to the duration. +// +// This adds or subtracts time from the duration within a given jitter fraction. +// For example for 10s and jitter 0.1, it will return a time within [9s, 11s]) +// +// Reference: https://godoc.org/github.com/grpc-ecosystem/go-grpc-middleware/util/backoffutils +func jitterUp(duration time.Duration, jitter float64) time.Duration { + multiplier := jitter * (rand.Float64()*2 - 1) + return time.Duration(float64(duration) * (1 + multiplier)) +} + +// Check if the provided function is being called in the op options. +func isOpFuncCalled(op string, opts []OpOption) bool { + for _, opt := range opts { + v := reflect.ValueOf(opt) + if v.Kind() == reflect.Func { + if opFunc := runtime.FuncForPC(v.Pointer()); opFunc != nil { + if strings.Contains(opFunc.Name(), op) { + return true + } + } + } + } + return false +} diff --git a/vendor/go.etcd.io/etcd/clientv3/watch.go b/vendor/go.etcd.io/etcd/clientv3/watch.go new file mode 100644 index 00000000..66e16ad6 --- /dev/null +++ b/vendor/go.etcd.io/etcd/clientv3/watch.go @@ -0,0 +1,1035 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "context" + "errors" + "fmt" + "sync" + "time" + + v3rpc "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" + pb "go.etcd.io/etcd/etcdserver/etcdserverpb" + mvccpb "go.etcd.io/etcd/mvcc/mvccpb" + + "go.uber.org/zap" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +const ( + EventTypeDelete = mvccpb.DELETE + EventTypePut = mvccpb.PUT + + closeSendErrTimeout = 250 * time.Millisecond +) + +type Event mvccpb.Event + +type WatchChan <-chan WatchResponse + +type Watcher interface { + // Watch watches on a key or prefix. The watched events will be returned + // through the returned channel. If revisions waiting to be sent over the + // watch are compacted, then the watch will be canceled by the server, the + // client will post a compacted error watch response, and the channel will close. + // If the context "ctx" is canceled or timed out, returned "WatchChan" is closed, + // and "WatchResponse" from this closed channel has zero events and nil "Err()". + // The context "ctx" MUST be canceled, as soon as watcher is no longer being used, + // to release the associated resources. + // + // If the context is "context.Background/TODO", returned "WatchChan" will + // not be closed and block until event is triggered, except when server + // returns a non-recoverable error (e.g. ErrCompacted). + // For example, when context passed with "WithRequireLeader" and the + // connected server has no leader (e.g. due to network partition), + // error "etcdserver: no leader" (ErrNoLeader) will be returned, + // and then "WatchChan" is closed with non-nil "Err()". + // In order to prevent a watch stream being stuck in a partitioned node, + // make sure to wrap context with "WithRequireLeader". + // + // Otherwise, as long as the context has not been canceled or timed out, + // watch will retry on other recoverable errors forever until reconnected. + // + // TODO: explicitly set context error in the last "WatchResponse" message and close channel? + // Currently, client contexts are overwritten with "valCtx" that never closes. + // TODO(v3.4): configure watch retry policy, limit maximum retry number + // (see https://github.com/etcd-io/etcd/issues/8980) + Watch(ctx context.Context, key string, opts ...OpOption) WatchChan + + // RequestProgress requests a progress notify response be sent in all watch channels. + RequestProgress(ctx context.Context) error + + // Close closes the watcher and cancels all watch requests. + Close() error +} + +type WatchResponse struct { + Header pb.ResponseHeader + Events []*Event + + // CompactRevision is the minimum revision the watcher may receive. + CompactRevision int64 + + // Canceled is used to indicate watch failure. + // If the watch failed and the stream was about to close, before the channel is closed, + // the channel sends a final response that has Canceled set to true with a non-nil Err(). + Canceled bool + + // Created is used to indicate the creation of the watcher. + Created bool + + closeErr error + + // cancelReason is a reason of canceling watch + cancelReason string +} + +// IsCreate returns true if the event tells that the key is newly created. +func (e *Event) IsCreate() bool { + return e.Type == EventTypePut && e.Kv.CreateRevision == e.Kv.ModRevision +} + +// IsModify returns true if the event tells that a new value is put on existing key. +func (e *Event) IsModify() bool { + return e.Type == EventTypePut && e.Kv.CreateRevision != e.Kv.ModRevision +} + +// Err is the error value if this WatchResponse holds an error. +func (wr *WatchResponse) Err() error { + switch { + case wr.closeErr != nil: + return v3rpc.Error(wr.closeErr) + case wr.CompactRevision != 0: + return v3rpc.ErrCompacted + case wr.Canceled: + if len(wr.cancelReason) != 0 { + return v3rpc.Error(status.Error(codes.FailedPrecondition, wr.cancelReason)) + } + return v3rpc.ErrFutureRev + } + return nil +} + +// IsProgressNotify returns true if the WatchResponse is progress notification. +func (wr *WatchResponse) IsProgressNotify() bool { + return len(wr.Events) == 0 && !wr.Canceled && !wr.Created && wr.CompactRevision == 0 && wr.Header.Revision != 0 +} + +// watcher implements the Watcher interface +type watcher struct { + remote pb.WatchClient + callOpts []grpc.CallOption + + // mu protects the grpc streams map + mu sync.RWMutex + + // streams holds all the active grpc streams keyed by ctx value. + streams map[string]*watchGrpcStream + lg *zap.Logger +} + +// watchGrpcStream tracks all watch resources attached to a single grpc stream. +type watchGrpcStream struct { + owner *watcher + remote pb.WatchClient + callOpts []grpc.CallOption + + // ctx controls internal remote.Watch requests + ctx context.Context + // ctxKey is the key used when looking up this stream's context + ctxKey string + cancel context.CancelFunc + + // substreams holds all active watchers on this grpc stream + substreams map[int64]*watcherStream + // resuming holds all resuming watchers on this grpc stream + resuming []*watcherStream + + // reqc sends a watch request from Watch() to the main goroutine + reqc chan watchStreamRequest + // respc receives data from the watch client + respc chan *pb.WatchResponse + // donec closes to broadcast shutdown + donec chan struct{} + // errc transmits errors from grpc Recv to the watch stream reconnect logic + errc chan error + // closingc gets the watcherStream of closing watchers + closingc chan *watcherStream + // wg is Done when all substream goroutines have exited + wg sync.WaitGroup + + // resumec closes to signal that all substreams should begin resuming + resumec chan struct{} + // closeErr is the error that closed the watch stream + closeErr error + + lg *zap.Logger +} + +// watchStreamRequest is a union of the supported watch request operation types +type watchStreamRequest interface { + toPB() *pb.WatchRequest +} + +// watchRequest is issued by the subscriber to start a new watcher +type watchRequest struct { + ctx context.Context + key string + end string + rev int64 + + // send created notification event if this field is true + createdNotify bool + // progressNotify is for progress updates + progressNotify bool + // fragmentation should be disabled by default + // if true, split watch events when total exceeds + // "--max-request-bytes" flag value + 512-byte + fragment bool + + // filters is the list of events to filter out + filters []pb.WatchCreateRequest_FilterType + // get the previous key-value pair before the event happens + prevKV bool + // retc receives a chan WatchResponse once the watcher is established + retc chan chan WatchResponse +} + +// progressRequest is issued by the subscriber to request watch progress +type progressRequest struct { +} + +// watcherStream represents a registered watcher +type watcherStream struct { + // initReq is the request that initiated this request + initReq watchRequest + + // outc publishes watch responses to subscriber + outc chan WatchResponse + // recvc buffers watch responses before publishing + recvc chan *WatchResponse + // donec closes when the watcherStream goroutine stops. + donec chan struct{} + // closing is set to true when stream should be scheduled to shutdown. + closing bool + // id is the registered watch id on the grpc stream + id int64 + + // buf holds all events received from etcd but not yet consumed by the client + buf []*WatchResponse +} + +func NewWatcher(c *Client) Watcher { + return NewWatchFromWatchClient(pb.NewWatchClient(c.conn), c) +} + +func NewWatchFromWatchClient(wc pb.WatchClient, c *Client) Watcher { + w := &watcher{ + remote: wc, + streams: make(map[string]*watchGrpcStream), + } + if c != nil { + w.callOpts = c.callOpts + w.lg = c.lg + } + return w +} + +// never closes +var valCtxCh = make(chan struct{}) +var zeroTime = time.Unix(0, 0) + +// ctx with only the values; never Done +type valCtx struct{ context.Context } + +func (vc *valCtx) Deadline() (time.Time, bool) { return zeroTime, false } +func (vc *valCtx) Done() <-chan struct{} { return valCtxCh } +func (vc *valCtx) Err() error { return nil } + +func (w *watcher) newWatcherGrpcStream(inctx context.Context) *watchGrpcStream { + ctx, cancel := context.WithCancel(&valCtx{inctx}) + wgs := &watchGrpcStream{ + owner: w, + remote: w.remote, + callOpts: w.callOpts, + ctx: ctx, + ctxKey: streamKeyFromCtx(inctx), + cancel: cancel, + substreams: make(map[int64]*watcherStream), + respc: make(chan *pb.WatchResponse), + reqc: make(chan watchStreamRequest), + donec: make(chan struct{}), + errc: make(chan error, 1), + closingc: make(chan *watcherStream), + resumec: make(chan struct{}), + lg: w.lg, + } + go wgs.run() + return wgs +} + +// Watch posts a watch request to run() and waits for a new watcher channel +func (w *watcher) Watch(ctx context.Context, key string, opts ...OpOption) WatchChan { + ow := opWatch(key, opts...) + + var filters []pb.WatchCreateRequest_FilterType + if ow.filterPut { + filters = append(filters, pb.WatchCreateRequest_NOPUT) + } + if ow.filterDelete { + filters = append(filters, pb.WatchCreateRequest_NODELETE) + } + + wr := &watchRequest{ + ctx: ctx, + createdNotify: ow.createdNotify, + key: string(ow.key), + end: string(ow.end), + rev: ow.rev, + progressNotify: ow.progressNotify, + fragment: ow.fragment, + filters: filters, + prevKV: ow.prevKV, + retc: make(chan chan WatchResponse, 1), + } + + ok := false + ctxKey := streamKeyFromCtx(ctx) + + // find or allocate appropriate grpc watch stream + w.mu.Lock() + if w.streams == nil { + // closed + w.mu.Unlock() + ch := make(chan WatchResponse) + close(ch) + return ch + } + wgs := w.streams[ctxKey] + if wgs == nil { + wgs = w.newWatcherGrpcStream(ctx) + w.streams[ctxKey] = wgs + } + donec := wgs.donec + reqc := wgs.reqc + w.mu.Unlock() + + // couldn't create channel; return closed channel + closeCh := make(chan WatchResponse, 1) + + // submit request + select { + case reqc <- wr: + ok = true + case <-wr.ctx.Done(): + case <-donec: + if wgs.closeErr != nil { + closeCh <- WatchResponse{Canceled: true, closeErr: wgs.closeErr} + break + } + // retry; may have dropped stream from no ctxs + return w.Watch(ctx, key, opts...) + } + + // receive channel + if ok { + select { + case ret := <-wr.retc: + return ret + case <-ctx.Done(): + case <-donec: + if wgs.closeErr != nil { + closeCh <- WatchResponse{Canceled: true, closeErr: wgs.closeErr} + break + } + // retry; may have dropped stream from no ctxs + return w.Watch(ctx, key, opts...) + } + } + + close(closeCh) + return closeCh +} + +func (w *watcher) Close() (err error) { + w.mu.Lock() + streams := w.streams + w.streams = nil + w.mu.Unlock() + for _, wgs := range streams { + if werr := wgs.close(); werr != nil { + err = werr + } + } + // Consider context.Canceled as a successful close + if err == context.Canceled { + err = nil + } + return err +} + +// RequestProgress requests a progress notify response be sent in all watch channels. +func (w *watcher) RequestProgress(ctx context.Context) (err error) { + ctxKey := streamKeyFromCtx(ctx) + + w.mu.Lock() + if w.streams == nil { + w.mu.Unlock() + return fmt.Errorf("no stream found for context") + } + wgs := w.streams[ctxKey] + if wgs == nil { + wgs = w.newWatcherGrpcStream(ctx) + w.streams[ctxKey] = wgs + } + donec := wgs.donec + reqc := wgs.reqc + w.mu.Unlock() + + pr := &progressRequest{} + + select { + case reqc <- pr: + return nil + case <-ctx.Done(): + if err == nil { + return ctx.Err() + } + return err + case <-donec: + if wgs.closeErr != nil { + return wgs.closeErr + } + // retry; may have dropped stream from no ctxs + return w.RequestProgress(ctx) + } +} + +func (w *watchGrpcStream) close() (err error) { + w.cancel() + <-w.donec + select { + case err = <-w.errc: + default: + } + return toErr(w.ctx, err) +} + +func (w *watcher) closeStream(wgs *watchGrpcStream) { + w.mu.Lock() + close(wgs.donec) + wgs.cancel() + if w.streams != nil { + delete(w.streams, wgs.ctxKey) + } + w.mu.Unlock() +} + +func (w *watchGrpcStream) addSubstream(resp *pb.WatchResponse, ws *watcherStream) { + // check watch ID for backward compatibility (<= v3.3) + if resp.WatchId == -1 || (resp.Canceled && resp.CancelReason != "") { + w.closeErr = v3rpc.Error(errors.New(resp.CancelReason)) + // failed; no channel + close(ws.recvc) + return + } + ws.id = resp.WatchId + w.substreams[ws.id] = ws +} + +func (w *watchGrpcStream) sendCloseSubstream(ws *watcherStream, resp *WatchResponse) { + select { + case ws.outc <- *resp: + case <-ws.initReq.ctx.Done(): + case <-time.After(closeSendErrTimeout): + } + close(ws.outc) +} + +func (w *watchGrpcStream) closeSubstream(ws *watcherStream) { + // send channel response in case stream was never established + select { + case ws.initReq.retc <- ws.outc: + default: + } + // close subscriber's channel + if closeErr := w.closeErr; closeErr != nil && ws.initReq.ctx.Err() == nil { + go w.sendCloseSubstream(ws, &WatchResponse{Canceled: true, closeErr: w.closeErr}) + } else if ws.outc != nil { + close(ws.outc) + } + if ws.id != -1 { + delete(w.substreams, ws.id) + return + } + for i := range w.resuming { + if w.resuming[i] == ws { + w.resuming[i] = nil + return + } + } +} + +// run is the root of the goroutines for managing a watcher client +func (w *watchGrpcStream) run() { + var wc pb.Watch_WatchClient + var closeErr error + + // substreams marked to close but goroutine still running; needed for + // avoiding double-closing recvc on grpc stream teardown + closing := make(map[*watcherStream]struct{}) + + defer func() { + w.closeErr = closeErr + // shutdown substreams and resuming substreams + for _, ws := range w.substreams { + if _, ok := closing[ws]; !ok { + close(ws.recvc) + closing[ws] = struct{}{} + } + } + for _, ws := range w.resuming { + if _, ok := closing[ws]; ws != nil && !ok { + close(ws.recvc) + closing[ws] = struct{}{} + } + } + w.joinSubstreams() + for range closing { + w.closeSubstream(<-w.closingc) + } + w.wg.Wait() + w.owner.closeStream(w) + }() + + // start a stream with the etcd grpc server + if wc, closeErr = w.newWatchClient(); closeErr != nil { + return + } + + cancelSet := make(map[int64]struct{}) + + var cur *pb.WatchResponse + for { + select { + // Watch() requested + case req := <-w.reqc: + switch wreq := req.(type) { + case *watchRequest: + outc := make(chan WatchResponse, 1) + // TODO: pass custom watch ID? + ws := &watcherStream{ + initReq: *wreq, + id: -1, + outc: outc, + // unbuffered so resumes won't cause repeat events + recvc: make(chan *WatchResponse), + } + + ws.donec = make(chan struct{}) + w.wg.Add(1) + go w.serveSubstream(ws, w.resumec) + + // queue up for watcher creation/resume + w.resuming = append(w.resuming, ws) + if len(w.resuming) == 1 { + // head of resume queue, can register a new watcher + if err := wc.Send(ws.initReq.toPB()); err != nil { + if w.lg != nil { + w.lg.Debug("error when sending request", zap.Error(err)) + } + } + } + case *progressRequest: + if err := wc.Send(wreq.toPB()); err != nil { + if w.lg != nil { + w.lg.Debug("error when sending request", zap.Error(err)) + } + } + } + + // new events from the watch client + case pbresp := <-w.respc: + if cur == nil || pbresp.Created || pbresp.Canceled { + cur = pbresp + } else if cur != nil && cur.WatchId == pbresp.WatchId { + // merge new events + cur.Events = append(cur.Events, pbresp.Events...) + // update "Fragment" field; last response with "Fragment" == false + cur.Fragment = pbresp.Fragment + } + + switch { + case pbresp.Created: + // response to head of queue creation + if ws := w.resuming[0]; ws != nil { + w.addSubstream(pbresp, ws) + w.dispatchEvent(pbresp) + w.resuming[0] = nil + } + + if ws := w.nextResume(); ws != nil { + if err := wc.Send(ws.initReq.toPB()); err != nil { + if w.lg != nil { + w.lg.Debug("error when sending request", zap.Error(err)) + } + } + } + + // reset for next iteration + cur = nil + + case pbresp.Canceled && pbresp.CompactRevision == 0: + delete(cancelSet, pbresp.WatchId) + if ws, ok := w.substreams[pbresp.WatchId]; ok { + // signal to stream goroutine to update closingc + close(ws.recvc) + closing[ws] = struct{}{} + } + + // reset for next iteration + cur = nil + + case cur.Fragment: + // watch response events are still fragmented + // continue to fetch next fragmented event arrival + continue + + default: + // dispatch to appropriate watch stream + ok := w.dispatchEvent(cur) + + // reset for next iteration + cur = nil + + if ok { + break + } + + // watch response on unexpected watch id; cancel id + if _, ok := cancelSet[pbresp.WatchId]; ok { + break + } + + cancelSet[pbresp.WatchId] = struct{}{} + cr := &pb.WatchRequest_CancelRequest{ + CancelRequest: &pb.WatchCancelRequest{ + WatchId: pbresp.WatchId, + }, + } + req := &pb.WatchRequest{RequestUnion: cr} + if w.lg != nil { + w.lg.Debug("sending watch cancel request for failed dispatch", zap.Int64("watch-id", pbresp.WatchId)) + } + if err := wc.Send(req); err != nil { + if w.lg != nil { + w.lg.Debug("failed to send watch cancel request", zap.Int64("watch-id", pbresp.WatchId), zap.Error(err)) + } + } + } + + // watch client failed on Recv; spawn another if possible + case err := <-w.errc: + if isHaltErr(w.ctx, err) || toErr(w.ctx, err) == v3rpc.ErrNoLeader { + closeErr = err + return + } + if wc, closeErr = w.newWatchClient(); closeErr != nil { + return + } + if ws := w.nextResume(); ws != nil { + if err := wc.Send(ws.initReq.toPB()); err != nil { + if w.lg != nil { + w.lg.Debug("error when sending request", zap.Error(err)) + } + } + } + cancelSet = make(map[int64]struct{}) + + case <-w.ctx.Done(): + return + + case ws := <-w.closingc: + if ws.id != -1 { + // client is closing an established watch; close it on the server proactively instead of waiting + // to close when the next message arrives + cancelSet[ws.id] = struct{}{} + cr := &pb.WatchRequest_CancelRequest{ + CancelRequest: &pb.WatchCancelRequest{ + WatchId: ws.id, + }, + } + req := &pb.WatchRequest{RequestUnion: cr} + if w.lg != nil { + w.lg.Debug("sending watch cancel request for closed watcher", zap.Int64("watch-id", ws.id)) + } + if err := wc.Send(req); err != nil { + if w.lg != nil { + w.lg.Debug("failed to send watch cancel request", zap.Int64("watch-id", ws.id), zap.Error(err)) + } + } + } + w.closeSubstream(ws) + delete(closing, ws) + // no more watchers on this stream, shutdown + if len(w.substreams)+len(w.resuming) == 0 { + return + } + } + } +} + +// nextResume chooses the next resuming to register with the grpc stream. Abandoned +// streams are marked as nil in the queue since the head must wait for its inflight registration. +func (w *watchGrpcStream) nextResume() *watcherStream { + for len(w.resuming) != 0 { + if w.resuming[0] != nil { + return w.resuming[0] + } + w.resuming = w.resuming[1:len(w.resuming)] + } + return nil +} + +// dispatchEvent sends a WatchResponse to the appropriate watcher stream +func (w *watchGrpcStream) dispatchEvent(pbresp *pb.WatchResponse) bool { + events := make([]*Event, len(pbresp.Events)) + for i, ev := range pbresp.Events { + events[i] = (*Event)(ev) + } + // TODO: return watch ID? + wr := &WatchResponse{ + Header: *pbresp.Header, + Events: events, + CompactRevision: pbresp.CompactRevision, + Created: pbresp.Created, + Canceled: pbresp.Canceled, + cancelReason: pbresp.CancelReason, + } + + // watch IDs are zero indexed, so request notify watch responses are assigned a watch ID of -1 to + // indicate they should be broadcast. + if wr.IsProgressNotify() && pbresp.WatchId == -1 { + return w.broadcastResponse(wr) + } + + return w.unicastResponse(wr, pbresp.WatchId) + +} + +// broadcastResponse send a watch response to all watch substreams. +func (w *watchGrpcStream) broadcastResponse(wr *WatchResponse) bool { + for _, ws := range w.substreams { + select { + case ws.recvc <- wr: + case <-ws.donec: + } + } + return true +} + +// unicastResponse sends a watch response to a specific watch substream. +func (w *watchGrpcStream) unicastResponse(wr *WatchResponse, watchId int64) bool { + ws, ok := w.substreams[watchId] + if !ok { + return false + } + select { + case ws.recvc <- wr: + case <-ws.donec: + return false + } + return true +} + +// serveWatchClient forwards messages from the grpc stream to run() +func (w *watchGrpcStream) serveWatchClient(wc pb.Watch_WatchClient) { + for { + resp, err := wc.Recv() + if err != nil { + select { + case w.errc <- err: + case <-w.donec: + } + return + } + select { + case w.respc <- resp: + case <-w.donec: + return + } + } +} + +// serveSubstream forwards watch responses from run() to the subscriber +func (w *watchGrpcStream) serveSubstream(ws *watcherStream, resumec chan struct{}) { + if ws.closing { + panic("created substream goroutine but substream is closing") + } + + // nextRev is the minimum expected next revision + nextRev := ws.initReq.rev + resuming := false + defer func() { + if !resuming { + ws.closing = true + } + close(ws.donec) + if !resuming { + w.closingc <- ws + } + w.wg.Done() + }() + + emptyWr := &WatchResponse{} + for { + curWr := emptyWr + outc := ws.outc + + if len(ws.buf) > 0 { + curWr = ws.buf[0] + } else { + outc = nil + } + select { + case outc <- *curWr: + if ws.buf[0].Err() != nil { + return + } + ws.buf[0] = nil + ws.buf = ws.buf[1:] + case wr, ok := <-ws.recvc: + if !ok { + // shutdown from closeSubstream + return + } + + if wr.Created { + if ws.initReq.retc != nil { + ws.initReq.retc <- ws.outc + // to prevent next write from taking the slot in buffered channel + // and posting duplicate create events + ws.initReq.retc = nil + + // send first creation event only if requested + if ws.initReq.createdNotify { + ws.outc <- *wr + } + // once the watch channel is returned, a current revision + // watch must resume at the store revision. This is necessary + // for the following case to work as expected: + // wch := m1.Watch("a") + // m2.Put("a", "b") + // <-wch + // If the revision is only bound on the first observed event, + // if wch is disconnected before the Put is issued, then reconnects + // after it is committed, it'll miss the Put. + if ws.initReq.rev == 0 { + nextRev = wr.Header.Revision + } + } + } else { + // current progress of watch; <= store revision + nextRev = wr.Header.Revision + } + + if len(wr.Events) > 0 { + nextRev = wr.Events[len(wr.Events)-1].Kv.ModRevision + 1 + } + ws.initReq.rev = nextRev + + // created event is already sent above, + // watcher should not post duplicate events + if wr.Created { + continue + } + + // TODO pause channel if buffer gets too large + ws.buf = append(ws.buf, wr) + case <-w.ctx.Done(): + return + case <-ws.initReq.ctx.Done(): + return + case <-resumec: + resuming = true + return + } + } + // lazily send cancel message if events on missing id +} + +func (w *watchGrpcStream) newWatchClient() (pb.Watch_WatchClient, error) { + // mark all substreams as resuming + close(w.resumec) + w.resumec = make(chan struct{}) + w.joinSubstreams() + for _, ws := range w.substreams { + ws.id = -1 + w.resuming = append(w.resuming, ws) + } + // strip out nils, if any + var resuming []*watcherStream + for _, ws := range w.resuming { + if ws != nil { + resuming = append(resuming, ws) + } + } + w.resuming = resuming + w.substreams = make(map[int64]*watcherStream) + + // connect to grpc stream while accepting watcher cancelation + stopc := make(chan struct{}) + donec := w.waitCancelSubstreams(stopc) + wc, err := w.openWatchClient() + close(stopc) + <-donec + + // serve all non-closing streams, even if there's a client error + // so that the teardown path can shutdown the streams as expected. + for _, ws := range w.resuming { + if ws.closing { + continue + } + ws.donec = make(chan struct{}) + w.wg.Add(1) + go w.serveSubstream(ws, w.resumec) + } + + if err != nil { + return nil, v3rpc.Error(err) + } + + // receive data from new grpc stream + go w.serveWatchClient(wc) + return wc, nil +} + +func (w *watchGrpcStream) waitCancelSubstreams(stopc <-chan struct{}) <-chan struct{} { + var wg sync.WaitGroup + wg.Add(len(w.resuming)) + donec := make(chan struct{}) + for i := range w.resuming { + go func(ws *watcherStream) { + defer wg.Done() + if ws.closing { + if ws.initReq.ctx.Err() != nil && ws.outc != nil { + close(ws.outc) + ws.outc = nil + } + return + } + select { + case <-ws.initReq.ctx.Done(): + // closed ws will be removed from resuming + ws.closing = true + close(ws.outc) + ws.outc = nil + w.wg.Add(1) + go func() { + defer w.wg.Done() + w.closingc <- ws + }() + case <-stopc: + } + }(w.resuming[i]) + } + go func() { + defer close(donec) + wg.Wait() + }() + return donec +} + +// joinSubstreams waits for all substream goroutines to complete. +func (w *watchGrpcStream) joinSubstreams() { + for _, ws := range w.substreams { + <-ws.donec + } + for _, ws := range w.resuming { + if ws != nil { + <-ws.donec + } + } +} + +var maxBackoff = 100 * time.Millisecond + +// openWatchClient retries opening a watch client until success or halt. +// manually retry in case "ws==nil && err==nil" +// TODO: remove FailFast=false +func (w *watchGrpcStream) openWatchClient() (ws pb.Watch_WatchClient, err error) { + backoff := time.Millisecond + for { + select { + case <-w.ctx.Done(): + if err == nil { + return nil, w.ctx.Err() + } + return nil, err + default: + } + if ws, err = w.remote.Watch(w.ctx, w.callOpts...); ws != nil && err == nil { + break + } + if isHaltErr(w.ctx, err) { + return nil, v3rpc.Error(err) + } + if isUnavailableErr(w.ctx, err) { + // retry, but backoff + if backoff < maxBackoff { + // 25% backoff factor + backoff = backoff + backoff/4 + if backoff > maxBackoff { + backoff = maxBackoff + } + } + time.Sleep(backoff) + } + } + return ws, nil +} + +// toPB converts an internal watch request structure to its protobuf WatchRequest structure. +func (wr *watchRequest) toPB() *pb.WatchRequest { + req := &pb.WatchCreateRequest{ + StartRevision: wr.rev, + Key: []byte(wr.key), + RangeEnd: []byte(wr.end), + ProgressNotify: wr.progressNotify, + Filters: wr.filters, + PrevKv: wr.prevKV, + Fragment: wr.fragment, + } + cr := &pb.WatchRequest_CreateRequest{CreateRequest: req} + return &pb.WatchRequest{RequestUnion: cr} +} + +// toPB converts an internal progress request structure to its protobuf WatchRequest structure. +func (pr *progressRequest) toPB() *pb.WatchRequest { + req := &pb.WatchProgressRequest{} + cr := &pb.WatchRequest_ProgressRequest{ProgressRequest: req} + return &pb.WatchRequest{RequestUnion: cr} +} + +func streamKeyFromCtx(ctx context.Context) string { + if md, ok := metadata.FromOutgoingContext(ctx); ok { + return fmt.Sprintf("%+v", md) + } + return "" +} diff --git a/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/doc.go b/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/doc.go new file mode 100644 index 00000000..f72c6a64 --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/doc.go @@ -0,0 +1,16 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package rpctypes has types and values shared by the etcd server and client for v3 RPC interaction. +package rpctypes diff --git a/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/error.go b/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/error.go new file mode 100644 index 00000000..e6a28146 --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/error.go @@ -0,0 +1,235 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rpctypes + +import ( + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// server-side error +var ( + ErrGRPCEmptyKey = status.New(codes.InvalidArgument, "etcdserver: key is not provided").Err() + ErrGRPCKeyNotFound = status.New(codes.InvalidArgument, "etcdserver: key not found").Err() + ErrGRPCValueProvided = status.New(codes.InvalidArgument, "etcdserver: value is provided").Err() + ErrGRPCLeaseProvided = status.New(codes.InvalidArgument, "etcdserver: lease is provided").Err() + ErrGRPCTooManyOps = status.New(codes.InvalidArgument, "etcdserver: too many operations in txn request").Err() + ErrGRPCDuplicateKey = status.New(codes.InvalidArgument, "etcdserver: duplicate key given in txn request").Err() + ErrGRPCCompacted = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted").Err() + ErrGRPCFutureRev = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision").Err() + ErrGRPCNoSpace = status.New(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded").Err() + + ErrGRPCLeaseNotFound = status.New(codes.NotFound, "etcdserver: requested lease not found").Err() + ErrGRPCLeaseExist = status.New(codes.FailedPrecondition, "etcdserver: lease already exists").Err() + ErrGRPCLeaseTTLTooLarge = status.New(codes.OutOfRange, "etcdserver: too large lease TTL").Err() + + ErrGRPCMemberExist = status.New(codes.FailedPrecondition, "etcdserver: member ID already exist").Err() + ErrGRPCPeerURLExist = status.New(codes.FailedPrecondition, "etcdserver: Peer URLs already exists").Err() + ErrGRPCMemberNotEnoughStarted = status.New(codes.FailedPrecondition, "etcdserver: re-configuration failed due to not enough started members").Err() + ErrGRPCMemberBadURLs = status.New(codes.InvalidArgument, "etcdserver: given member URLs are invalid").Err() + ErrGRPCMemberNotFound = status.New(codes.NotFound, "etcdserver: member not found").Err() + ErrGRPCMemberNotLearner = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member").Err() + ErrGRPCLearnerNotReady = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member which is in sync with leader").Err() + ErrGRPCTooManyLearners = status.New(codes.FailedPrecondition, "etcdserver: too many learner members in cluster").Err() + + ErrGRPCRequestTooLarge = status.New(codes.InvalidArgument, "etcdserver: request is too large").Err() + ErrGRPCRequestTooManyRequests = status.New(codes.ResourceExhausted, "etcdserver: too many requests").Err() + + ErrGRPCRootUserNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not exist").Err() + ErrGRPCRootRoleNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not have root role").Err() + ErrGRPCUserAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: user name already exists").Err() + ErrGRPCUserEmpty = status.New(codes.InvalidArgument, "etcdserver: user name is empty").Err() + ErrGRPCUserNotFound = status.New(codes.FailedPrecondition, "etcdserver: user name not found").Err() + ErrGRPCRoleAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: role name already exists").Err() + ErrGRPCRoleNotFound = status.New(codes.FailedPrecondition, "etcdserver: role name not found").Err() + ErrGRPCRoleEmpty = status.New(codes.InvalidArgument, "etcdserver: role name is empty").Err() + ErrGRPCAuthFailed = status.New(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password").Err() + ErrGRPCPermissionDenied = status.New(codes.PermissionDenied, "etcdserver: permission denied").Err() + ErrGRPCRoleNotGranted = status.New(codes.FailedPrecondition, "etcdserver: role is not granted to the user").Err() + ErrGRPCPermissionNotGranted = status.New(codes.FailedPrecondition, "etcdserver: permission is not granted to the role").Err() + ErrGRPCAuthNotEnabled = status.New(codes.FailedPrecondition, "etcdserver: authentication is not enabled").Err() + ErrGRPCInvalidAuthToken = status.New(codes.Unauthenticated, "etcdserver: invalid auth token").Err() + ErrGRPCInvalidAuthMgmt = status.New(codes.InvalidArgument, "etcdserver: invalid auth management").Err() + + ErrGRPCNoLeader = status.New(codes.Unavailable, "etcdserver: no leader").Err() + ErrGRPCNotLeader = status.New(codes.FailedPrecondition, "etcdserver: not leader").Err() + ErrGRPCLeaderChanged = status.New(codes.Unavailable, "etcdserver: leader changed").Err() + ErrGRPCNotCapable = status.New(codes.Unavailable, "etcdserver: not capable").Err() + ErrGRPCStopped = status.New(codes.Unavailable, "etcdserver: server stopped").Err() + ErrGRPCTimeout = status.New(codes.Unavailable, "etcdserver: request timed out").Err() + ErrGRPCTimeoutDueToLeaderFail = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to previous leader failure").Err() + ErrGRPCTimeoutDueToConnectionLost = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to connection lost").Err() + ErrGRPCUnhealthy = status.New(codes.Unavailable, "etcdserver: unhealthy cluster").Err() + ErrGRPCCorrupt = status.New(codes.DataLoss, "etcdserver: corrupt cluster").Err() + ErrGPRCNotSupportedForLearner = status.New(codes.Unavailable, "etcdserver: rpc not supported for learner").Err() + ErrGRPCBadLeaderTransferee = status.New(codes.FailedPrecondition, "etcdserver: bad leader transferee").Err() + + errStringToError = map[string]error{ + ErrorDesc(ErrGRPCEmptyKey): ErrGRPCEmptyKey, + ErrorDesc(ErrGRPCKeyNotFound): ErrGRPCKeyNotFound, + ErrorDesc(ErrGRPCValueProvided): ErrGRPCValueProvided, + ErrorDesc(ErrGRPCLeaseProvided): ErrGRPCLeaseProvided, + + ErrorDesc(ErrGRPCTooManyOps): ErrGRPCTooManyOps, + ErrorDesc(ErrGRPCDuplicateKey): ErrGRPCDuplicateKey, + ErrorDesc(ErrGRPCCompacted): ErrGRPCCompacted, + ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev, + ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace, + + ErrorDesc(ErrGRPCLeaseNotFound): ErrGRPCLeaseNotFound, + ErrorDesc(ErrGRPCLeaseExist): ErrGRPCLeaseExist, + ErrorDesc(ErrGRPCLeaseTTLTooLarge): ErrGRPCLeaseTTLTooLarge, + + ErrorDesc(ErrGRPCMemberExist): ErrGRPCMemberExist, + ErrorDesc(ErrGRPCPeerURLExist): ErrGRPCPeerURLExist, + ErrorDesc(ErrGRPCMemberNotEnoughStarted): ErrGRPCMemberNotEnoughStarted, + ErrorDesc(ErrGRPCMemberBadURLs): ErrGRPCMemberBadURLs, + ErrorDesc(ErrGRPCMemberNotFound): ErrGRPCMemberNotFound, + ErrorDesc(ErrGRPCMemberNotLearner): ErrGRPCMemberNotLearner, + ErrorDesc(ErrGRPCLearnerNotReady): ErrGRPCLearnerNotReady, + ErrorDesc(ErrGRPCTooManyLearners): ErrGRPCTooManyLearners, + + ErrorDesc(ErrGRPCRequestTooLarge): ErrGRPCRequestTooLarge, + ErrorDesc(ErrGRPCRequestTooManyRequests): ErrGRPCRequestTooManyRequests, + + ErrorDesc(ErrGRPCRootUserNotExist): ErrGRPCRootUserNotExist, + ErrorDesc(ErrGRPCRootRoleNotExist): ErrGRPCRootRoleNotExist, + ErrorDesc(ErrGRPCUserAlreadyExist): ErrGRPCUserAlreadyExist, + ErrorDesc(ErrGRPCUserEmpty): ErrGRPCUserEmpty, + ErrorDesc(ErrGRPCUserNotFound): ErrGRPCUserNotFound, + ErrorDesc(ErrGRPCRoleAlreadyExist): ErrGRPCRoleAlreadyExist, + ErrorDesc(ErrGRPCRoleNotFound): ErrGRPCRoleNotFound, + ErrorDesc(ErrGRPCRoleEmpty): ErrGRPCRoleEmpty, + ErrorDesc(ErrGRPCAuthFailed): ErrGRPCAuthFailed, + ErrorDesc(ErrGRPCPermissionDenied): ErrGRPCPermissionDenied, + ErrorDesc(ErrGRPCRoleNotGranted): ErrGRPCRoleNotGranted, + ErrorDesc(ErrGRPCPermissionNotGranted): ErrGRPCPermissionNotGranted, + ErrorDesc(ErrGRPCAuthNotEnabled): ErrGRPCAuthNotEnabled, + ErrorDesc(ErrGRPCInvalidAuthToken): ErrGRPCInvalidAuthToken, + ErrorDesc(ErrGRPCInvalidAuthMgmt): ErrGRPCInvalidAuthMgmt, + + ErrorDesc(ErrGRPCNoLeader): ErrGRPCNoLeader, + ErrorDesc(ErrGRPCNotLeader): ErrGRPCNotLeader, + ErrorDesc(ErrGRPCLeaderChanged): ErrGRPCLeaderChanged, + ErrorDesc(ErrGRPCNotCapable): ErrGRPCNotCapable, + ErrorDesc(ErrGRPCStopped): ErrGRPCStopped, + ErrorDesc(ErrGRPCTimeout): ErrGRPCTimeout, + ErrorDesc(ErrGRPCTimeoutDueToLeaderFail): ErrGRPCTimeoutDueToLeaderFail, + ErrorDesc(ErrGRPCTimeoutDueToConnectionLost): ErrGRPCTimeoutDueToConnectionLost, + ErrorDesc(ErrGRPCUnhealthy): ErrGRPCUnhealthy, + ErrorDesc(ErrGRPCCorrupt): ErrGRPCCorrupt, + ErrorDesc(ErrGPRCNotSupportedForLearner): ErrGPRCNotSupportedForLearner, + ErrorDesc(ErrGRPCBadLeaderTransferee): ErrGRPCBadLeaderTransferee, + } +) + +// client-side error +var ( + ErrEmptyKey = Error(ErrGRPCEmptyKey) + ErrKeyNotFound = Error(ErrGRPCKeyNotFound) + ErrValueProvided = Error(ErrGRPCValueProvided) + ErrLeaseProvided = Error(ErrGRPCLeaseProvided) + ErrTooManyOps = Error(ErrGRPCTooManyOps) + ErrDuplicateKey = Error(ErrGRPCDuplicateKey) + ErrCompacted = Error(ErrGRPCCompacted) + ErrFutureRev = Error(ErrGRPCFutureRev) + ErrNoSpace = Error(ErrGRPCNoSpace) + + ErrLeaseNotFound = Error(ErrGRPCLeaseNotFound) + ErrLeaseExist = Error(ErrGRPCLeaseExist) + ErrLeaseTTLTooLarge = Error(ErrGRPCLeaseTTLTooLarge) + + ErrMemberExist = Error(ErrGRPCMemberExist) + ErrPeerURLExist = Error(ErrGRPCPeerURLExist) + ErrMemberNotEnoughStarted = Error(ErrGRPCMemberNotEnoughStarted) + ErrMemberBadURLs = Error(ErrGRPCMemberBadURLs) + ErrMemberNotFound = Error(ErrGRPCMemberNotFound) + ErrMemberNotLearner = Error(ErrGRPCMemberNotLearner) + ErrMemberLearnerNotReady = Error(ErrGRPCLearnerNotReady) + ErrTooManyLearners = Error(ErrGRPCTooManyLearners) + + ErrRequestTooLarge = Error(ErrGRPCRequestTooLarge) + ErrTooManyRequests = Error(ErrGRPCRequestTooManyRequests) + + ErrRootUserNotExist = Error(ErrGRPCRootUserNotExist) + ErrRootRoleNotExist = Error(ErrGRPCRootRoleNotExist) + ErrUserAlreadyExist = Error(ErrGRPCUserAlreadyExist) + ErrUserEmpty = Error(ErrGRPCUserEmpty) + ErrUserNotFound = Error(ErrGRPCUserNotFound) + ErrRoleAlreadyExist = Error(ErrGRPCRoleAlreadyExist) + ErrRoleNotFound = Error(ErrGRPCRoleNotFound) + ErrRoleEmpty = Error(ErrGRPCRoleEmpty) + ErrAuthFailed = Error(ErrGRPCAuthFailed) + ErrPermissionDenied = Error(ErrGRPCPermissionDenied) + ErrRoleNotGranted = Error(ErrGRPCRoleNotGranted) + ErrPermissionNotGranted = Error(ErrGRPCPermissionNotGranted) + ErrAuthNotEnabled = Error(ErrGRPCAuthNotEnabled) + ErrInvalidAuthToken = Error(ErrGRPCInvalidAuthToken) + ErrInvalidAuthMgmt = Error(ErrGRPCInvalidAuthMgmt) + + ErrNoLeader = Error(ErrGRPCNoLeader) + ErrNotLeader = Error(ErrGRPCNotLeader) + ErrLeaderChanged = Error(ErrGRPCLeaderChanged) + ErrNotCapable = Error(ErrGRPCNotCapable) + ErrStopped = Error(ErrGRPCStopped) + ErrTimeout = Error(ErrGRPCTimeout) + ErrTimeoutDueToLeaderFail = Error(ErrGRPCTimeoutDueToLeaderFail) + ErrTimeoutDueToConnectionLost = Error(ErrGRPCTimeoutDueToConnectionLost) + ErrUnhealthy = Error(ErrGRPCUnhealthy) + ErrCorrupt = Error(ErrGRPCCorrupt) + ErrBadLeaderTransferee = Error(ErrGRPCBadLeaderTransferee) +) + +// EtcdError defines gRPC server errors. +// (https://github.com/grpc/grpc-go/blob/master/rpc_util.go#L319-L323) +type EtcdError struct { + code codes.Code + desc string +} + +// Code returns grpc/codes.Code. +// TODO: define clientv3/codes.Code. +func (e EtcdError) Code() codes.Code { + return e.code +} + +func (e EtcdError) Error() string { + return e.desc +} + +func Error(err error) error { + if err == nil { + return nil + } + verr, ok := errStringToError[ErrorDesc(err)] + if !ok { // not gRPC error + return err + } + ev, ok := status.FromError(verr) + var desc string + if ok { + desc = ev.Message() + } else { + desc = verr.Error() + } + return EtcdError{code: ev.Code(), desc: desc} +} + +func ErrorDesc(err error) string { + if s, ok := status.FromError(err); ok { + return s.Message() + } + return err.Error() +} diff --git a/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/md.go b/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/md.go new file mode 100644 index 00000000..90b8b835 --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/md.go @@ -0,0 +1,22 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rpctypes + +var ( + MetadataRequireLeaderKey = "hasleader" + MetadataHasLeader = "true" + + MetadataClientAPIVersionKey = "client-api-version" +) diff --git a/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/metadatafields.go b/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/metadatafields.go new file mode 100644 index 00000000..8f8ac60f --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes/metadatafields.go @@ -0,0 +1,20 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rpctypes + +var ( + TokenFieldNameGRPC = "token" + TokenFieldNameSwagger = "authorization" +) diff --git a/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/etcdserver.pb.go b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/etcdserver.pb.go new file mode 100644 index 00000000..9e9b42ce --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/etcdserver.pb.go @@ -0,0 +1,1041 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: etcdserver.proto + +/* + Package etcdserverpb is a generated protocol buffer package. + + It is generated from these files: + etcdserver.proto + raft_internal.proto + rpc.proto + + It has these top-level messages: + Request + Metadata + RequestHeader + InternalRaftRequest + EmptyResponse + InternalAuthenticateRequest + ResponseHeader + RangeRequest + RangeResponse + PutRequest + PutResponse + DeleteRangeRequest + DeleteRangeResponse + RequestOp + ResponseOp + Compare + TxnRequest + TxnResponse + CompactionRequest + CompactionResponse + HashRequest + HashKVRequest + HashKVResponse + HashResponse + SnapshotRequest + SnapshotResponse + WatchRequest + WatchCreateRequest + WatchCancelRequest + WatchProgressRequest + WatchResponse + LeaseGrantRequest + LeaseGrantResponse + LeaseRevokeRequest + LeaseRevokeResponse + LeaseCheckpoint + LeaseCheckpointRequest + LeaseCheckpointResponse + LeaseKeepAliveRequest + LeaseKeepAliveResponse + LeaseTimeToLiveRequest + LeaseTimeToLiveResponse + LeaseLeasesRequest + LeaseStatus + LeaseLeasesResponse + Member + MemberAddRequest + MemberAddResponse + MemberRemoveRequest + MemberRemoveResponse + MemberUpdateRequest + MemberUpdateResponse + MemberListRequest + MemberListResponse + MemberPromoteRequest + MemberPromoteResponse + DefragmentRequest + DefragmentResponse + MoveLeaderRequest + MoveLeaderResponse + AlarmRequest + AlarmMember + AlarmResponse + StatusRequest + StatusResponse + AuthEnableRequest + AuthDisableRequest + AuthenticateRequest + AuthUserAddRequest + AuthUserGetRequest + AuthUserDeleteRequest + AuthUserChangePasswordRequest + AuthUserGrantRoleRequest + AuthUserRevokeRoleRequest + AuthRoleAddRequest + AuthRoleGetRequest + AuthUserListRequest + AuthRoleListRequest + AuthRoleDeleteRequest + AuthRoleGrantPermissionRequest + AuthRoleRevokePermissionRequest + AuthEnableResponse + AuthDisableResponse + AuthenticateResponse + AuthUserAddResponse + AuthUserGetResponse + AuthUserDeleteResponse + AuthUserChangePasswordResponse + AuthUserGrantRoleResponse + AuthUserRevokeRoleResponse + AuthRoleAddResponse + AuthRoleGetResponse + AuthRoleListResponse + AuthUserListResponse + AuthRoleDeleteResponse + AuthRoleGrantPermissionResponse + AuthRoleRevokePermissionResponse +*/ +package etcdserverpb + +import ( + "fmt" + + proto "github.com/golang/protobuf/proto" + + math "math" + + _ "github.com/gogo/protobuf/gogoproto" + + io "io" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Request struct { + ID uint64 `protobuf:"varint,1,opt,name=ID" json:"ID"` + Method string `protobuf:"bytes,2,opt,name=Method" json:"Method"` + Path string `protobuf:"bytes,3,opt,name=Path" json:"Path"` + Val string `protobuf:"bytes,4,opt,name=Val" json:"Val"` + Dir bool `protobuf:"varint,5,opt,name=Dir" json:"Dir"` + PrevValue string `protobuf:"bytes,6,opt,name=PrevValue" json:"PrevValue"` + PrevIndex uint64 `protobuf:"varint,7,opt,name=PrevIndex" json:"PrevIndex"` + PrevExist *bool `protobuf:"varint,8,opt,name=PrevExist" json:"PrevExist,omitempty"` + Expiration int64 `protobuf:"varint,9,opt,name=Expiration" json:"Expiration"` + Wait bool `protobuf:"varint,10,opt,name=Wait" json:"Wait"` + Since uint64 `protobuf:"varint,11,opt,name=Since" json:"Since"` + Recursive bool `protobuf:"varint,12,opt,name=Recursive" json:"Recursive"` + Sorted bool `protobuf:"varint,13,opt,name=Sorted" json:"Sorted"` + Quorum bool `protobuf:"varint,14,opt,name=Quorum" json:"Quorum"` + Time int64 `protobuf:"varint,15,opt,name=Time" json:"Time"` + Stream bool `protobuf:"varint,16,opt,name=Stream" json:"Stream"` + Refresh *bool `protobuf:"varint,17,opt,name=Refresh" json:"Refresh,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Request) Reset() { *m = Request{} } +func (m *Request) String() string { return proto.CompactTextString(m) } +func (*Request) ProtoMessage() {} +func (*Request) Descriptor() ([]byte, []int) { return fileDescriptorEtcdserver, []int{0} } + +type Metadata struct { + NodeID uint64 `protobuf:"varint,1,opt,name=NodeID" json:"NodeID"` + ClusterID uint64 `protobuf:"varint,2,opt,name=ClusterID" json:"ClusterID"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Metadata) Reset() { *m = Metadata{} } +func (m *Metadata) String() string { return proto.CompactTextString(m) } +func (*Metadata) ProtoMessage() {} +func (*Metadata) Descriptor() ([]byte, []int) { return fileDescriptorEtcdserver, []int{1} } + +func init() { + proto.RegisterType((*Request)(nil), "etcdserverpb.Request") + proto.RegisterType((*Metadata)(nil), "etcdserverpb.Metadata") +} +func (m *Request) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Request) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(m.ID)) + dAtA[i] = 0x12 + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(len(m.Method))) + i += copy(dAtA[i:], m.Method) + dAtA[i] = 0x1a + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(len(m.Path))) + i += copy(dAtA[i:], m.Path) + dAtA[i] = 0x22 + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(len(m.Val))) + i += copy(dAtA[i:], m.Val) + dAtA[i] = 0x28 + i++ + if m.Dir { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x32 + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(len(m.PrevValue))) + i += copy(dAtA[i:], m.PrevValue) + dAtA[i] = 0x38 + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(m.PrevIndex)) + if m.PrevExist != nil { + dAtA[i] = 0x40 + i++ + if *m.PrevExist { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + dAtA[i] = 0x48 + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(m.Expiration)) + dAtA[i] = 0x50 + i++ + if m.Wait { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x58 + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(m.Since)) + dAtA[i] = 0x60 + i++ + if m.Recursive { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x68 + i++ + if m.Sorted { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x70 + i++ + if m.Quorum { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x78 + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(m.Time)) + dAtA[i] = 0x80 + i++ + dAtA[i] = 0x1 + i++ + if m.Stream { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + if m.Refresh != nil { + dAtA[i] = 0x88 + i++ + dAtA[i] = 0x1 + i++ + if *m.Refresh { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Metadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Metadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(m.NodeID)) + dAtA[i] = 0x10 + i++ + i = encodeVarintEtcdserver(dAtA, i, uint64(m.ClusterID)) + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func encodeVarintEtcdserver(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Request) Size() (n int) { + var l int + _ = l + n += 1 + sovEtcdserver(uint64(m.ID)) + l = len(m.Method) + n += 1 + l + sovEtcdserver(uint64(l)) + l = len(m.Path) + n += 1 + l + sovEtcdserver(uint64(l)) + l = len(m.Val) + n += 1 + l + sovEtcdserver(uint64(l)) + n += 2 + l = len(m.PrevValue) + n += 1 + l + sovEtcdserver(uint64(l)) + n += 1 + sovEtcdserver(uint64(m.PrevIndex)) + if m.PrevExist != nil { + n += 2 + } + n += 1 + sovEtcdserver(uint64(m.Expiration)) + n += 2 + n += 1 + sovEtcdserver(uint64(m.Since)) + n += 2 + n += 2 + n += 2 + n += 1 + sovEtcdserver(uint64(m.Time)) + n += 3 + if m.Refresh != nil { + n += 3 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Metadata) Size() (n int) { + var l int + _ = l + n += 1 + sovEtcdserver(uint64(m.NodeID)) + n += 1 + sovEtcdserver(uint64(m.ClusterID)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovEtcdserver(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozEtcdserver(x uint64) (n int) { + return sovEtcdserver(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Request) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Method", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEtcdserver + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Method = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEtcdserver + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Val", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEtcdserver + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Val = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Dir", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Dir = bool(v != 0) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevValue", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEtcdserver + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrevValue = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevIndex", wireType) + } + m.PrevIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PrevIndex |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevExist", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PrevExist = &b + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Expiration", wireType) + } + m.Expiration = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Expiration |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Wait", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Wait = bool(v != 0) + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Since", wireType) + } + m.Since = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Since |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Recursive", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Recursive = bool(v != 0) + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Sorted", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Sorted = bool(v != 0) + case 14: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Quorum", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Quorum = bool(v != 0) + case 15: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) + } + m.Time = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Time |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 16: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stream", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Stream = bool(v != 0) + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Refresh", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Refresh = &b + default: + iNdEx = preIndex + skippy, err := skipEtcdserver(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthEtcdserver + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Metadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Metadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Metadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeID", wireType) + } + m.NodeID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NodeID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterID", wireType) + } + m.ClusterID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ClusterID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipEtcdserver(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthEtcdserver + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipEtcdserver(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthEtcdserver + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEtcdserver + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipEtcdserver(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthEtcdserver = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowEtcdserver = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("etcdserver.proto", fileDescriptorEtcdserver) } + +var fileDescriptorEtcdserver = []byte{ + // 380 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0xd2, 0xdd, 0x6e, 0xda, 0x30, + 0x14, 0x07, 0x70, 0x0c, 0xe1, 0xcb, 0x63, 0x1b, 0xb3, 0xd0, 0x74, 0x84, 0xa6, 0x2c, 0x42, 0xbb, + 0xc8, 0xd5, 0xf6, 0x0e, 0x2c, 0x5c, 0x44, 0x2a, 0x15, 0x0d, 0x15, 0xbd, 0x76, 0xc9, 0x29, 0x58, + 0x02, 0x4c, 0x1d, 0x07, 0xf1, 0x06, 0x7d, 0x85, 0x3e, 0x12, 0x97, 0x7d, 0x82, 0xaa, 0xa5, 0x2f, + 0x52, 0x39, 0x24, 0xc4, 0xed, 0x5d, 0xf4, 0xfb, 0x9f, 0x1c, 0x1f, 0x7f, 0xd0, 0x2e, 0xea, 0x79, + 0x9c, 0xa0, 0xda, 0xa1, 0xfa, 0xbb, 0x55, 0x52, 0x4b, 0xd6, 0x29, 0x65, 0x7b, 0xdb, 0xef, 0x2d, + 0xe4, 0x42, 0x66, 0xc1, 0x3f, 0xf3, 0x75, 0xaa, 0x19, 0x3c, 0x38, 0xb4, 0x19, 0xe1, 0x7d, 0x8a, + 0x89, 0x66, 0x3d, 0x5a, 0x0d, 0x03, 0x20, 0x1e, 0xf1, 0x9d, 0xa1, 0x73, 0x78, 0xfe, 0x5d, 0x89, + 0xaa, 0x61, 0xc0, 0x7e, 0xd1, 0xc6, 0x18, 0xf5, 0x52, 0xc6, 0x50, 0xf5, 0x88, 0xdf, 0xce, 0x93, + 0xdc, 0x18, 0x50, 0x67, 0xc2, 0xf5, 0x12, 0x6a, 0x56, 0x96, 0x09, 0xfb, 0x49, 0x6b, 0x33, 0xbe, + 0x02, 0xc7, 0x0a, 0x0c, 0x18, 0x0f, 0x84, 0x82, 0xba, 0x47, 0xfc, 0x56, 0xe1, 0x81, 0x50, 0x6c, + 0x40, 0xdb, 0x13, 0x85, 0xbb, 0x19, 0x5f, 0xa5, 0x08, 0x0d, 0xeb, 0xaf, 0x92, 0x8b, 0x9a, 0x70, + 0x13, 0xe3, 0x1e, 0x9a, 0xd6, 0xa0, 0x25, 0x17, 0x35, 0xa3, 0xbd, 0x48, 0x34, 0xb4, 0xce, 0xab, + 0x90, 0xa8, 0x64, 0xf6, 0x87, 0xd2, 0xd1, 0x7e, 0x2b, 0x14, 0xd7, 0x42, 0x6e, 0xa0, 0xed, 0x11, + 0xbf, 0x96, 0x37, 0xb2, 0xdc, 0xec, 0xed, 0x86, 0x0b, 0x0d, 0xd4, 0x1a, 0x35, 0x13, 0xd6, 0xa7, + 0xf5, 0xa9, 0xd8, 0xcc, 0x11, 0xbe, 0x58, 0x33, 0x9c, 0xc8, 0xac, 0x1f, 0xe1, 0x3c, 0x55, 0x89, + 0xd8, 0x21, 0x74, 0xac, 0x5f, 0x4b, 0x36, 0x67, 0x3a, 0x95, 0x4a, 0x63, 0x0c, 0x5f, 0xad, 0x82, + 0xdc, 0x4c, 0x7a, 0x95, 0x4a, 0x95, 0xae, 0xe1, 0x9b, 0x9d, 0x9e, 0xcc, 0x4c, 0x75, 0x2d, 0xd6, + 0x08, 0xdf, 0xad, 0xa9, 0x33, 0xc9, 0xba, 0x6a, 0x85, 0x7c, 0x0d, 0xdd, 0x0f, 0x5d, 0x33, 0x63, + 0xae, 0xb9, 0xe8, 0x3b, 0x85, 0xc9, 0x12, 0x7e, 0x58, 0xa7, 0x52, 0xe0, 0xe0, 0x82, 0xb6, 0xc6, + 0xa8, 0x79, 0xcc, 0x35, 0x37, 0x9d, 0x2e, 0x65, 0x8c, 0x9f, 0x5e, 0x43, 0x6e, 0x66, 0x87, 0xff, + 0x57, 0x69, 0xa2, 0x51, 0x85, 0x41, 0xf6, 0x28, 0xce, 0xb7, 0x70, 0xe6, 0x61, 0xef, 0xf0, 0xea, + 0x56, 0x0e, 0x47, 0x97, 0x3c, 0x1d, 0x5d, 0xf2, 0x72, 0x74, 0xc9, 0xe3, 0x9b, 0x5b, 0x79, 0x0f, + 0x00, 0x00, 0xff, 0xff, 0xee, 0x40, 0xba, 0xd6, 0xa4, 0x02, 0x00, 0x00, +} diff --git a/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/etcdserver.proto b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/etcdserver.proto new file mode 100644 index 00000000..25e0aca5 --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/etcdserver.proto @@ -0,0 +1,34 @@ +syntax = "proto2"; +package etcdserverpb; + +import "gogoproto/gogo.proto"; + +option (gogoproto.marshaler_all) = true; +option (gogoproto.sizer_all) = true; +option (gogoproto.unmarshaler_all) = true; +option (gogoproto.goproto_getters_all) = false; + +message Request { + optional uint64 ID = 1 [(gogoproto.nullable) = false]; + optional string Method = 2 [(gogoproto.nullable) = false]; + optional string Path = 3 [(gogoproto.nullable) = false]; + optional string Val = 4 [(gogoproto.nullable) = false]; + optional bool Dir = 5 [(gogoproto.nullable) = false]; + optional string PrevValue = 6 [(gogoproto.nullable) = false]; + optional uint64 PrevIndex = 7 [(gogoproto.nullable) = false]; + optional bool PrevExist = 8 [(gogoproto.nullable) = true]; + optional int64 Expiration = 9 [(gogoproto.nullable) = false]; + optional bool Wait = 10 [(gogoproto.nullable) = false]; + optional uint64 Since = 11 [(gogoproto.nullable) = false]; + optional bool Recursive = 12 [(gogoproto.nullable) = false]; + optional bool Sorted = 13 [(gogoproto.nullable) = false]; + optional bool Quorum = 14 [(gogoproto.nullable) = false]; + optional int64 Time = 15 [(gogoproto.nullable) = false]; + optional bool Stream = 16 [(gogoproto.nullable) = false]; + optional bool Refresh = 17 [(gogoproto.nullable) = true]; +} + +message Metadata { + optional uint64 NodeID = 1 [(gogoproto.nullable) = false]; + optional uint64 ClusterID = 2 [(gogoproto.nullable) = false]; +} diff --git a/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal.pb.go b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal.pb.go new file mode 100644 index 00000000..b170499e --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal.pb.go @@ -0,0 +1,2127 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: raft_internal.proto + +package etcdserverpb + +import ( + "fmt" + + proto "github.com/golang/protobuf/proto" + + math "math" + + _ "github.com/gogo/protobuf/gogoproto" + + io "io" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type RequestHeader struct { + ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + // username is a username that is associated with an auth token of gRPC connection + Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` + // auth_revision is a revision number of auth.authStore. It is not related to mvcc + AuthRevision uint64 `protobuf:"varint,3,opt,name=auth_revision,json=authRevision,proto3" json:"auth_revision,omitempty"` +} + +func (m *RequestHeader) Reset() { *m = RequestHeader{} } +func (m *RequestHeader) String() string { return proto.CompactTextString(m) } +func (*RequestHeader) ProtoMessage() {} +func (*RequestHeader) Descriptor() ([]byte, []int) { return fileDescriptorRaftInternal, []int{0} } + +// An InternalRaftRequest is the union of all requests which can be +// sent via raft. +type InternalRaftRequest struct { + Header *RequestHeader `protobuf:"bytes,100,opt,name=header" json:"header,omitempty"` + ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + V2 *Request `protobuf:"bytes,2,opt,name=v2" json:"v2,omitempty"` + Range *RangeRequest `protobuf:"bytes,3,opt,name=range" json:"range,omitempty"` + Put *PutRequest `protobuf:"bytes,4,opt,name=put" json:"put,omitempty"` + DeleteRange *DeleteRangeRequest `protobuf:"bytes,5,opt,name=delete_range,json=deleteRange" json:"delete_range,omitempty"` + Txn *TxnRequest `protobuf:"bytes,6,opt,name=txn" json:"txn,omitempty"` + Compaction *CompactionRequest `protobuf:"bytes,7,opt,name=compaction" json:"compaction,omitempty"` + LeaseGrant *LeaseGrantRequest `protobuf:"bytes,8,opt,name=lease_grant,json=leaseGrant" json:"lease_grant,omitempty"` + LeaseRevoke *LeaseRevokeRequest `protobuf:"bytes,9,opt,name=lease_revoke,json=leaseRevoke" json:"lease_revoke,omitempty"` + Alarm *AlarmRequest `protobuf:"bytes,10,opt,name=alarm" json:"alarm,omitempty"` + LeaseCheckpoint *LeaseCheckpointRequest `protobuf:"bytes,11,opt,name=lease_checkpoint,json=leaseCheckpoint" json:"lease_checkpoint,omitempty"` + AuthEnable *AuthEnableRequest `protobuf:"bytes,1000,opt,name=auth_enable,json=authEnable" json:"auth_enable,omitempty"` + AuthDisable *AuthDisableRequest `protobuf:"bytes,1011,opt,name=auth_disable,json=authDisable" json:"auth_disable,omitempty"` + Authenticate *InternalAuthenticateRequest `protobuf:"bytes,1012,opt,name=authenticate" json:"authenticate,omitempty"` + AuthUserAdd *AuthUserAddRequest `protobuf:"bytes,1100,opt,name=auth_user_add,json=authUserAdd" json:"auth_user_add,omitempty"` + AuthUserDelete *AuthUserDeleteRequest `protobuf:"bytes,1101,opt,name=auth_user_delete,json=authUserDelete" json:"auth_user_delete,omitempty"` + AuthUserGet *AuthUserGetRequest `protobuf:"bytes,1102,opt,name=auth_user_get,json=authUserGet" json:"auth_user_get,omitempty"` + AuthUserChangePassword *AuthUserChangePasswordRequest `protobuf:"bytes,1103,opt,name=auth_user_change_password,json=authUserChangePassword" json:"auth_user_change_password,omitempty"` + AuthUserGrantRole *AuthUserGrantRoleRequest `protobuf:"bytes,1104,opt,name=auth_user_grant_role,json=authUserGrantRole" json:"auth_user_grant_role,omitempty"` + AuthUserRevokeRole *AuthUserRevokeRoleRequest `protobuf:"bytes,1105,opt,name=auth_user_revoke_role,json=authUserRevokeRole" json:"auth_user_revoke_role,omitempty"` + AuthUserList *AuthUserListRequest `protobuf:"bytes,1106,opt,name=auth_user_list,json=authUserList" json:"auth_user_list,omitempty"` + AuthRoleList *AuthRoleListRequest `protobuf:"bytes,1107,opt,name=auth_role_list,json=authRoleList" json:"auth_role_list,omitempty"` + AuthRoleAdd *AuthRoleAddRequest `protobuf:"bytes,1200,opt,name=auth_role_add,json=authRoleAdd" json:"auth_role_add,omitempty"` + AuthRoleDelete *AuthRoleDeleteRequest `protobuf:"bytes,1201,opt,name=auth_role_delete,json=authRoleDelete" json:"auth_role_delete,omitempty"` + AuthRoleGet *AuthRoleGetRequest `protobuf:"bytes,1202,opt,name=auth_role_get,json=authRoleGet" json:"auth_role_get,omitempty"` + AuthRoleGrantPermission *AuthRoleGrantPermissionRequest `protobuf:"bytes,1203,opt,name=auth_role_grant_permission,json=authRoleGrantPermission" json:"auth_role_grant_permission,omitempty"` + AuthRoleRevokePermission *AuthRoleRevokePermissionRequest `protobuf:"bytes,1204,opt,name=auth_role_revoke_permission,json=authRoleRevokePermission" json:"auth_role_revoke_permission,omitempty"` +} + +func (m *InternalRaftRequest) Reset() { *m = InternalRaftRequest{} } +func (m *InternalRaftRequest) String() string { return proto.CompactTextString(m) } +func (*InternalRaftRequest) ProtoMessage() {} +func (*InternalRaftRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaftInternal, []int{1} } + +type EmptyResponse struct { +} + +func (m *EmptyResponse) Reset() { *m = EmptyResponse{} } +func (m *EmptyResponse) String() string { return proto.CompactTextString(m) } +func (*EmptyResponse) ProtoMessage() {} +func (*EmptyResponse) Descriptor() ([]byte, []int) { return fileDescriptorRaftInternal, []int{2} } + +// What is the difference between AuthenticateRequest (defined in rpc.proto) and InternalAuthenticateRequest? +// InternalAuthenticateRequest has a member that is filled by etcdserver and shouldn't be user-facing. +// For avoiding misusage the field, we have an internal version of AuthenticateRequest. +type InternalAuthenticateRequest struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + // simple_token is generated in API layer (etcdserver/v3_server.go) + SimpleToken string `protobuf:"bytes,3,opt,name=simple_token,json=simpleToken,proto3" json:"simple_token,omitempty"` +} + +func (m *InternalAuthenticateRequest) Reset() { *m = InternalAuthenticateRequest{} } +func (m *InternalAuthenticateRequest) String() string { return proto.CompactTextString(m) } +func (*InternalAuthenticateRequest) ProtoMessage() {} +func (*InternalAuthenticateRequest) Descriptor() ([]byte, []int) { + return fileDescriptorRaftInternal, []int{3} +} + +func init() { + proto.RegisterType((*RequestHeader)(nil), "etcdserverpb.RequestHeader") + proto.RegisterType((*InternalRaftRequest)(nil), "etcdserverpb.InternalRaftRequest") + proto.RegisterType((*EmptyResponse)(nil), "etcdserverpb.EmptyResponse") + proto.RegisterType((*InternalAuthenticateRequest)(nil), "etcdserverpb.InternalAuthenticateRequest") +} +func (m *RequestHeader) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestHeader) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.ID)) + } + if len(m.Username) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(len(m.Username))) + i += copy(dAtA[i:], m.Username) + } + if m.AuthRevision != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRevision)) + } + return i, nil +} + +func (m *InternalRaftRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.ID)) + } + if m.V2 != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.V2.Size())) + n1, err := m.V2.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if m.Range != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.Range.Size())) + n2, err := m.Range.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + if m.Put != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.Put.Size())) + n3, err := m.Put.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + if m.DeleteRange != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.DeleteRange.Size())) + n4, err := m.DeleteRange.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + if m.Txn != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.Txn.Size())) + n5, err := m.Txn.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + if m.Compaction != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.Compaction.Size())) + n6, err := m.Compaction.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + } + if m.LeaseGrant != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.LeaseGrant.Size())) + n7, err := m.LeaseGrant.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + if m.LeaseRevoke != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.LeaseRevoke.Size())) + n8, err := m.LeaseRevoke.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + } + if m.Alarm != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.Alarm.Size())) + n9, err := m.Alarm.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 + } + if m.LeaseCheckpoint != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.LeaseCheckpoint.Size())) + n10, err := m.LeaseCheckpoint.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 + } + if m.Header != nil { + dAtA[i] = 0xa2 + i++ + dAtA[i] = 0x6 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.Header.Size())) + n11, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 + } + if m.AuthEnable != nil { + dAtA[i] = 0xc2 + i++ + dAtA[i] = 0x3e + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthEnable.Size())) + n12, err := m.AuthEnable.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + } + if m.AuthDisable != nil { + dAtA[i] = 0x9a + i++ + dAtA[i] = 0x3f + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthDisable.Size())) + n13, err := m.AuthDisable.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n13 + } + if m.Authenticate != nil { + dAtA[i] = 0xa2 + i++ + dAtA[i] = 0x3f + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.Authenticate.Size())) + n14, err := m.Authenticate.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n14 + } + if m.AuthUserAdd != nil { + dAtA[i] = 0xe2 + i++ + dAtA[i] = 0x44 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserAdd.Size())) + n15, err := m.AuthUserAdd.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n15 + } + if m.AuthUserDelete != nil { + dAtA[i] = 0xea + i++ + dAtA[i] = 0x44 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserDelete.Size())) + n16, err := m.AuthUserDelete.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n16 + } + if m.AuthUserGet != nil { + dAtA[i] = 0xf2 + i++ + dAtA[i] = 0x44 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserGet.Size())) + n17, err := m.AuthUserGet.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n17 + } + if m.AuthUserChangePassword != nil { + dAtA[i] = 0xfa + i++ + dAtA[i] = 0x44 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserChangePassword.Size())) + n18, err := m.AuthUserChangePassword.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n18 + } + if m.AuthUserGrantRole != nil { + dAtA[i] = 0x82 + i++ + dAtA[i] = 0x45 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserGrantRole.Size())) + n19, err := m.AuthUserGrantRole.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n19 + } + if m.AuthUserRevokeRole != nil { + dAtA[i] = 0x8a + i++ + dAtA[i] = 0x45 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserRevokeRole.Size())) + n20, err := m.AuthUserRevokeRole.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n20 + } + if m.AuthUserList != nil { + dAtA[i] = 0x92 + i++ + dAtA[i] = 0x45 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserList.Size())) + n21, err := m.AuthUserList.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n21 + } + if m.AuthRoleList != nil { + dAtA[i] = 0x9a + i++ + dAtA[i] = 0x45 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleList.Size())) + n22, err := m.AuthRoleList.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n22 + } + if m.AuthRoleAdd != nil { + dAtA[i] = 0x82 + i++ + dAtA[i] = 0x4b + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleAdd.Size())) + n23, err := m.AuthRoleAdd.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n23 + } + if m.AuthRoleDelete != nil { + dAtA[i] = 0x8a + i++ + dAtA[i] = 0x4b + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleDelete.Size())) + n24, err := m.AuthRoleDelete.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n24 + } + if m.AuthRoleGet != nil { + dAtA[i] = 0x92 + i++ + dAtA[i] = 0x4b + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleGet.Size())) + n25, err := m.AuthRoleGet.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n25 + } + if m.AuthRoleGrantPermission != nil { + dAtA[i] = 0x9a + i++ + dAtA[i] = 0x4b + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleGrantPermission.Size())) + n26, err := m.AuthRoleGrantPermission.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n26 + } + if m.AuthRoleRevokePermission != nil { + dAtA[i] = 0xa2 + i++ + dAtA[i] = 0x4b + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleRevokePermission.Size())) + n27, err := m.AuthRoleRevokePermission.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n27 + } + return i, nil +} + +func (m *EmptyResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EmptyResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *InternalAuthenticateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InternalAuthenticateRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if len(m.Password) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(len(m.Password))) + i += copy(dAtA[i:], m.Password) + } + if len(m.SimpleToken) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(len(m.SimpleToken))) + i += copy(dAtA[i:], m.SimpleToken) + } + return i, nil +} + +func encodeVarintRaftInternal(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *RequestHeader) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRaftInternal(uint64(m.ID)) + } + l = len(m.Username) + if l > 0 { + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.AuthRevision != 0 { + n += 1 + sovRaftInternal(uint64(m.AuthRevision)) + } + return n +} + +func (m *InternalRaftRequest) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRaftInternal(uint64(m.ID)) + } + if m.V2 != nil { + l = m.V2.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.Range != nil { + l = m.Range.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.Put != nil { + l = m.Put.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.DeleteRange != nil { + l = m.DeleteRange.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.Txn != nil { + l = m.Txn.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.Compaction != nil { + l = m.Compaction.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.LeaseGrant != nil { + l = m.LeaseGrant.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.LeaseRevoke != nil { + l = m.LeaseRevoke.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.Alarm != nil { + l = m.Alarm.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.LeaseCheckpoint != nil { + l = m.LeaseCheckpoint.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } + if m.Header != nil { + l = m.Header.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthEnable != nil { + l = m.AuthEnable.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthDisable != nil { + l = m.AuthDisable.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.Authenticate != nil { + l = m.Authenticate.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthUserAdd != nil { + l = m.AuthUserAdd.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthUserDelete != nil { + l = m.AuthUserDelete.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthUserGet != nil { + l = m.AuthUserGet.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthUserChangePassword != nil { + l = m.AuthUserChangePassword.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthUserGrantRole != nil { + l = m.AuthUserGrantRole.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthUserRevokeRole != nil { + l = m.AuthUserRevokeRole.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthUserList != nil { + l = m.AuthUserList.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthRoleList != nil { + l = m.AuthRoleList.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthRoleAdd != nil { + l = m.AuthRoleAdd.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthRoleDelete != nil { + l = m.AuthRoleDelete.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthRoleGet != nil { + l = m.AuthRoleGet.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthRoleGrantPermission != nil { + l = m.AuthRoleGrantPermission.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + if m.AuthRoleRevokePermission != nil { + l = m.AuthRoleRevokePermission.Size() + n += 2 + l + sovRaftInternal(uint64(l)) + } + return n +} + +func (m *EmptyResponse) Size() (n int) { + var l int + _ = l + return n +} + +func (m *InternalAuthenticateRequest) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRaftInternal(uint64(l)) + } + l = len(m.Password) + if l > 0 { + n += 1 + l + sovRaftInternal(uint64(l)) + } + l = len(m.SimpleToken) + if l > 0 { + n += 1 + l + sovRaftInternal(uint64(l)) + } + return n +} + +func sovRaftInternal(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozRaftInternal(x uint64) (n int) { + return sovRaftInternal(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *RequestHeader) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestHeader: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestHeader: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Username = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthRevision", wireType) + } + m.AuthRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AuthRevision |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRaftInternal(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaftInternal + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *InternalRaftRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InternalRaftRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InternalRaftRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field V2", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.V2 == nil { + m.V2 = &Request{} + } + if err := m.V2.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Range", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Range == nil { + m.Range = &RangeRequest{} + } + if err := m.Range.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Put", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Put == nil { + m.Put = &PutRequest{} + } + if err := m.Put.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeleteRange", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DeleteRange == nil { + m.DeleteRange = &DeleteRangeRequest{} + } + if err := m.DeleteRange.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Txn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Txn == nil { + m.Txn = &TxnRequest{} + } + if err := m.Txn.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Compaction", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Compaction == nil { + m.Compaction = &CompactionRequest{} + } + if err := m.Compaction.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LeaseGrant", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LeaseGrant == nil { + m.LeaseGrant = &LeaseGrantRequest{} + } + if err := m.LeaseGrant.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LeaseRevoke", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LeaseRevoke == nil { + m.LeaseRevoke = &LeaseRevokeRequest{} + } + if err := m.LeaseRevoke.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Alarm", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Alarm == nil { + m.Alarm = &AlarmRequest{} + } + if err := m.Alarm.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LeaseCheckpoint", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LeaseCheckpoint == nil { + m.LeaseCheckpoint = &LeaseCheckpointRequest{} + } + if err := m.LeaseCheckpoint.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 100: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &RequestHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1000: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthEnable", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthEnable == nil { + m.AuthEnable = &AuthEnableRequest{} + } + if err := m.AuthEnable.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1011: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthDisable", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthDisable == nil { + m.AuthDisable = &AuthDisableRequest{} + } + if err := m.AuthDisable.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1012: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authenticate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Authenticate == nil { + m.Authenticate = &InternalAuthenticateRequest{} + } + if err := m.Authenticate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1100: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthUserAdd", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthUserAdd == nil { + m.AuthUserAdd = &AuthUserAddRequest{} + } + if err := m.AuthUserAdd.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1101: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthUserDelete", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthUserDelete == nil { + m.AuthUserDelete = &AuthUserDeleteRequest{} + } + if err := m.AuthUserDelete.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1102: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthUserGet", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthUserGet == nil { + m.AuthUserGet = &AuthUserGetRequest{} + } + if err := m.AuthUserGet.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1103: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthUserChangePassword", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthUserChangePassword == nil { + m.AuthUserChangePassword = &AuthUserChangePasswordRequest{} + } + if err := m.AuthUserChangePassword.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1104: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthUserGrantRole", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthUserGrantRole == nil { + m.AuthUserGrantRole = &AuthUserGrantRoleRequest{} + } + if err := m.AuthUserGrantRole.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1105: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthUserRevokeRole", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthUserRevokeRole == nil { + m.AuthUserRevokeRole = &AuthUserRevokeRoleRequest{} + } + if err := m.AuthUserRevokeRole.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1106: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthUserList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthUserList == nil { + m.AuthUserList = &AuthUserListRequest{} + } + if err := m.AuthUserList.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1107: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthRoleList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthRoleList == nil { + m.AuthRoleList = &AuthRoleListRequest{} + } + if err := m.AuthRoleList.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1200: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthRoleAdd", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthRoleAdd == nil { + m.AuthRoleAdd = &AuthRoleAddRequest{} + } + if err := m.AuthRoleAdd.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1201: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthRoleDelete", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthRoleDelete == nil { + m.AuthRoleDelete = &AuthRoleDeleteRequest{} + } + if err := m.AuthRoleDelete.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1202: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthRoleGet", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthRoleGet == nil { + m.AuthRoleGet = &AuthRoleGetRequest{} + } + if err := m.AuthRoleGet.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1203: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthRoleGrantPermission", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthRoleGrantPermission == nil { + m.AuthRoleGrantPermission = &AuthRoleGrantPermissionRequest{} + } + if err := m.AuthRoleGrantPermission.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1204: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthRoleRevokePermission", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AuthRoleRevokePermission == nil { + m.AuthRoleRevokePermission = &AuthRoleRevokePermissionRequest{} + } + if err := m.AuthRoleRevokePermission.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRaftInternal(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaftInternal + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EmptyResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EmptyResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EmptyResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRaftInternal(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaftInternal + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *InternalAuthenticateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InternalAuthenticateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InternalAuthenticateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Password = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SimpleToken", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SimpleToken = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRaftInternal(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaftInternal + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipRaftInternal(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthRaftInternal + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipRaftInternal(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthRaftInternal = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowRaftInternal = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("raft_internal.proto", fileDescriptorRaftInternal) } + +var fileDescriptorRaftInternal = []byte{ + // 867 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x96, 0xcb, 0x52, 0x33, 0x45, + 0x14, 0xc7, 0x49, 0xb8, 0xa6, 0x13, 0x2e, 0x36, 0xa0, 0x6d, 0xa8, 0x8a, 0x10, 0xbc, 0xe0, 0x0d, + 0xad, 0xf0, 0x00, 0x1a, 0x13, 0x0a, 0xa8, 0xa2, 0x90, 0x9a, 0xc2, 0x2a, 0xab, 0x5c, 0x8c, 0xcd, + 0xcc, 0x21, 0x19, 0x99, 0xcc, 0x8c, 0x3d, 0x9d, 0x88, 0x6f, 0xe2, 0x63, 0x78, 0xdb, 0xbb, 0x65, + 0xe1, 0x05, 0xf5, 0x05, 0x14, 0x37, 0xee, 0xbf, 0xef, 0x01, 0xbe, 0xea, 0xcb, 0xf4, 0x64, 0x92, + 0x0e, 0xbb, 0xc9, 0x39, 0xff, 0xf3, 0xfb, 0x9f, 0x99, 0x3e, 0x07, 0x1a, 0x6d, 0x32, 0x7a, 0xc3, + 0xdd, 0x20, 0xe2, 0xc0, 0x22, 0x1a, 0x1e, 0x26, 0x2c, 0xe6, 0x31, 0xae, 0x01, 0xf7, 0xfc, 0x14, + 0xd8, 0x08, 0x58, 0x72, 0x5d, 0xdf, 0xea, 0xc5, 0xbd, 0x58, 0x26, 0x3e, 0x10, 0x4f, 0x4a, 0x53, + 0xdf, 0xc8, 0x35, 0x3a, 0x52, 0x61, 0x89, 0xa7, 0x1e, 0x9b, 0x5f, 0xa2, 0x55, 0x07, 0xbe, 0x1e, + 0x42, 0xca, 0x4f, 0x81, 0xfa, 0xc0, 0xf0, 0x1a, 0x2a, 0x9f, 0x75, 0x49, 0x69, 0xb7, 0x74, 0xb0, + 0xe0, 0x94, 0xcf, 0xba, 0xb8, 0x8e, 0x56, 0x86, 0xa9, 0xb0, 0x1c, 0x00, 0x29, 0xef, 0x96, 0x0e, + 0x2a, 0x8e, 0xf9, 0x8d, 0xf7, 0xd1, 0x2a, 0x1d, 0xf2, 0xbe, 0xcb, 0x60, 0x14, 0xa4, 0x41, 0x1c, + 0x91, 0x79, 0x59, 0x56, 0x13, 0x41, 0x47, 0xc7, 0x9a, 0xbf, 0xac, 0xa3, 0xcd, 0x33, 0xdd, 0xb5, + 0x43, 0x6f, 0xb8, 0xb6, 0x9b, 0x32, 0x7a, 0x03, 0x95, 0x47, 0x2d, 0x69, 0x51, 0x6d, 0x6d, 0x1f, + 0x8e, 0xbf, 0xd7, 0xa1, 0x2e, 0x71, 0xca, 0xa3, 0x16, 0xfe, 0x10, 0x2d, 0x32, 0x1a, 0xf5, 0x40, + 0x7a, 0x55, 0x5b, 0xf5, 0x09, 0xa5, 0x48, 0x65, 0x72, 0x25, 0xc4, 0xef, 0xa0, 0xf9, 0x64, 0xc8, + 0xc9, 0x82, 0xd4, 0x93, 0xa2, 0xfe, 0x72, 0x98, 0xf5, 0xe3, 0x08, 0x11, 0xee, 0xa0, 0x9a, 0x0f, + 0x21, 0x70, 0x70, 0x95, 0xc9, 0xa2, 0x2c, 0xda, 0x2d, 0x16, 0x75, 0xa5, 0xa2, 0x60, 0x55, 0xf5, + 0xf3, 0x98, 0x30, 0xe4, 0x77, 0x11, 0x59, 0xb2, 0x19, 0x5e, 0xdd, 0x45, 0xc6, 0x90, 0xdf, 0x45, + 0xf8, 0x23, 0x84, 0xbc, 0x78, 0x90, 0x50, 0x8f, 0x8b, 0xef, 0xb7, 0x2c, 0x4b, 0x5e, 0x2b, 0x96, + 0x74, 0x4c, 0x3e, 0xab, 0x1c, 0x2b, 0xc1, 0x1f, 0xa3, 0x6a, 0x08, 0x34, 0x05, 0xb7, 0xc7, 0x68, + 0xc4, 0xc9, 0x8a, 0x8d, 0x70, 0x2e, 0x04, 0x27, 0x22, 0x6f, 0x08, 0xa1, 0x09, 0x89, 0x77, 0x56, + 0x04, 0x06, 0xa3, 0xf8, 0x16, 0x48, 0xc5, 0xf6, 0xce, 0x12, 0xe1, 0x48, 0x81, 0x79, 0xe7, 0x30, + 0x8f, 0x89, 0x63, 0xa1, 0x21, 0x65, 0x03, 0x82, 0x6c, 0xc7, 0xd2, 0x16, 0x29, 0x73, 0x2c, 0x52, + 0x88, 0x3f, 0x45, 0x1b, 0xca, 0xd6, 0xeb, 0x83, 0x77, 0x9b, 0xc4, 0x41, 0xc4, 0x49, 0x55, 0x16, + 0xbf, 0x6e, 0xb1, 0xee, 0x18, 0x51, 0x86, 0x59, 0x0f, 0x8b, 0x71, 0x7c, 0x84, 0x96, 0xfa, 0x72, + 0x86, 0x89, 0x2f, 0x31, 0x3b, 0xd6, 0x21, 0x52, 0x63, 0xee, 0x68, 0x29, 0x6e, 0xa3, 0xaa, 0x1c, + 0x61, 0x88, 0xe8, 0x75, 0x08, 0xe4, 0x7f, 0xeb, 0x09, 0xb4, 0x87, 0xbc, 0x7f, 0x2c, 0x05, 0xe6, + 0xfb, 0x51, 0x13, 0xc2, 0x5d, 0x24, 0x07, 0xde, 0xf5, 0x83, 0x54, 0x32, 0x9e, 0x2d, 0xdb, 0x3e, + 0xa0, 0x60, 0x74, 0x95, 0xc2, 0x7c, 0x40, 0x9a, 0xc7, 0xf0, 0x85, 0xa2, 0x40, 0xc4, 0x03, 0x8f, + 0x72, 0x20, 0xcf, 0x15, 0xe5, 0xed, 0x22, 0x25, 0x5b, 0xa4, 0xf6, 0x98, 0x34, 0xc3, 0x15, 0xea, + 0xf1, 0xb1, 0xde, 0x4d, 0xb1, 0xac, 0x2e, 0xf5, 0x7d, 0xf2, 0xeb, 0xca, 0xac, 0xb6, 0x3e, 0x4b, + 0x81, 0xb5, 0x7d, 0xbf, 0xd0, 0x96, 0x8e, 0xe1, 0x0b, 0xb4, 0x91, 0x63, 0xd4, 0x90, 0x93, 0xdf, + 0x14, 0x69, 0xdf, 0x4e, 0xd2, 0xdb, 0xa1, 0x61, 0x6b, 0xb4, 0x10, 0x2e, 0xb6, 0xd5, 0x03, 0x4e, + 0x7e, 0x7f, 0xb2, 0xad, 0x13, 0xe0, 0x53, 0x6d, 0x9d, 0x00, 0xc7, 0x3d, 0xf4, 0x6a, 0x8e, 0xf1, + 0xfa, 0x62, 0xed, 0xdc, 0x84, 0xa6, 0xe9, 0x37, 0x31, 0xf3, 0xc9, 0x1f, 0x0a, 0xf9, 0xae, 0x1d, + 0xd9, 0x91, 0xea, 0x4b, 0x2d, 0xce, 0xe8, 0x2f, 0x53, 0x6b, 0x1a, 0x7f, 0x8e, 0xb6, 0xc6, 0xfa, + 0x15, 0xfb, 0xe2, 0xb2, 0x38, 0x04, 0xf2, 0xa0, 0x3c, 0xde, 0x9c, 0xd1, 0xb6, 0xdc, 0xb5, 0x38, + 0x3f, 0xea, 0x97, 0xe8, 0x64, 0x06, 0x7f, 0x81, 0xb6, 0x73, 0xb2, 0x5a, 0x3d, 0x85, 0xfe, 0x53, + 0xa1, 0xdf, 0xb2, 0xa3, 0xf5, 0x0e, 0x8e, 0xb1, 0x31, 0x9d, 0x4a, 0xe1, 0x53, 0xb4, 0x96, 0xc3, + 0xc3, 0x20, 0xe5, 0xe4, 0x2f, 0x45, 0xdd, 0xb3, 0x53, 0xcf, 0x83, 0x94, 0x17, 0xe6, 0x28, 0x0b, + 0x1a, 0x92, 0x68, 0x4d, 0x91, 0xfe, 0x9e, 0x49, 0x12, 0xd6, 0x53, 0xa4, 0x2c, 0x68, 0x8e, 0x5e, + 0x92, 0xc4, 0x44, 0x7e, 0x5f, 0x99, 0x75, 0xf4, 0xa2, 0x66, 0x72, 0x22, 0x75, 0xcc, 0x4c, 0xa4, + 0xc4, 0xe8, 0x89, 0xfc, 0xa1, 0x32, 0x6b, 0x22, 0x45, 0x95, 0x65, 0x22, 0xf3, 0x70, 0xb1, 0x2d, + 0x31, 0x91, 0x3f, 0x3e, 0xd9, 0xd6, 0xe4, 0x44, 0xea, 0x18, 0xfe, 0x0a, 0xd5, 0xc7, 0x30, 0x72, + 0x50, 0x12, 0x60, 0x83, 0x20, 0x95, 0xff, 0x18, 0x7f, 0x52, 0xcc, 0xf7, 0x66, 0x30, 0x85, 0xfc, + 0xd2, 0xa8, 0x33, 0xfe, 0x2b, 0xd4, 0x9e, 0xc7, 0x03, 0xb4, 0x93, 0x7b, 0xe9, 0xd1, 0x19, 0x33, + 0xfb, 0x59, 0x99, 0xbd, 0x6f, 0x37, 0x53, 0x53, 0x32, 0xed, 0x46, 0xe8, 0x0c, 0x41, 0x73, 0x1d, + 0xad, 0x1e, 0x0f, 0x12, 0xfe, 0xad, 0x03, 0x69, 0x12, 0x47, 0x29, 0x34, 0x13, 0xb4, 0xf3, 0xc4, + 0x1f, 0x22, 0x8c, 0xd1, 0x82, 0xbc, 0x2e, 0x94, 0xe4, 0x75, 0x41, 0x3e, 0x8b, 0x6b, 0x84, 0xd9, + 0x4f, 0x7d, 0x8d, 0xc8, 0x7e, 0xe3, 0x3d, 0x54, 0x4b, 0x83, 0x41, 0x12, 0x82, 0xcb, 0xe3, 0x5b, + 0x50, 0xb7, 0x88, 0x8a, 0x53, 0x55, 0xb1, 0x2b, 0x11, 0xfa, 0x64, 0xeb, 0xfe, 0xdf, 0xc6, 0xdc, + 0xfd, 0x63, 0xa3, 0xf4, 0xf0, 0xd8, 0x28, 0xfd, 0xf3, 0xd8, 0x28, 0x7d, 0xf7, 0x5f, 0x63, 0xee, + 0x7a, 0x49, 0xde, 0x61, 0x8e, 0x5e, 0x04, 0x00, 0x00, 0xff, 0xff, 0xed, 0x36, 0xf0, 0x6f, 0x1b, + 0x09, 0x00, 0x00, +} diff --git a/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal.proto b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal.proto new file mode 100644 index 00000000..7111f457 --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal.proto @@ -0,0 +1,75 @@ +syntax = "proto3"; +package etcdserverpb; + +import "gogoproto/gogo.proto"; +import "etcdserver.proto"; +import "rpc.proto"; + +option (gogoproto.marshaler_all) = true; +option (gogoproto.sizer_all) = true; +option (gogoproto.unmarshaler_all) = true; +option (gogoproto.goproto_getters_all) = false; + +message RequestHeader { + uint64 ID = 1; + // username is a username that is associated with an auth token of gRPC connection + string username = 2; + // auth_revision is a revision number of auth.authStore. It is not related to mvcc + uint64 auth_revision = 3; +} + +// An InternalRaftRequest is the union of all requests which can be +// sent via raft. +message InternalRaftRequest { + RequestHeader header = 100; + uint64 ID = 1; + + Request v2 = 2; + + RangeRequest range = 3; + PutRequest put = 4; + DeleteRangeRequest delete_range = 5; + TxnRequest txn = 6; + CompactionRequest compaction = 7; + + LeaseGrantRequest lease_grant = 8; + LeaseRevokeRequest lease_revoke = 9; + + AlarmRequest alarm = 10; + + LeaseCheckpointRequest lease_checkpoint = 11; + + AuthEnableRequest auth_enable = 1000; + AuthDisableRequest auth_disable = 1011; + + InternalAuthenticateRequest authenticate = 1012; + + AuthUserAddRequest auth_user_add = 1100; + AuthUserDeleteRequest auth_user_delete = 1101; + AuthUserGetRequest auth_user_get = 1102; + AuthUserChangePasswordRequest auth_user_change_password = 1103; + AuthUserGrantRoleRequest auth_user_grant_role = 1104; + AuthUserRevokeRoleRequest auth_user_revoke_role = 1105; + AuthUserListRequest auth_user_list = 1106; + AuthRoleListRequest auth_role_list = 1107; + + AuthRoleAddRequest auth_role_add = 1200; + AuthRoleDeleteRequest auth_role_delete = 1201; + AuthRoleGetRequest auth_role_get = 1202; + AuthRoleGrantPermissionRequest auth_role_grant_permission = 1203; + AuthRoleRevokePermissionRequest auth_role_revoke_permission = 1204; +} + +message EmptyResponse { +} + +// What is the difference between AuthenticateRequest (defined in rpc.proto) and InternalAuthenticateRequest? +// InternalAuthenticateRequest has a member that is filled by etcdserver and shouldn't be user-facing. +// For avoiding misusage the field, we have an internal version of AuthenticateRequest. +message InternalAuthenticateRequest { + string name = 1; + string password = 2; + + // simple_token is generated in API layer (etcdserver/v3_server.go) + string simple_token = 3; +} diff --git a/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal_stringer.go b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal_stringer.go new file mode 100644 index 00000000..31e121ee --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/raft_internal_stringer.go @@ -0,0 +1,183 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package etcdserverpb + +import ( + "fmt" + "strings" + + proto "github.com/golang/protobuf/proto" +) + +// InternalRaftStringer implements custom proto Stringer: +// redact password, replace value fields with value_size fields. +type InternalRaftStringer struct { + Request *InternalRaftRequest +} + +func (as *InternalRaftStringer) String() string { + switch { + case as.Request.LeaseGrant != nil: + return fmt.Sprintf("header:<%s> lease_grant:", + as.Request.Header.String(), + as.Request.LeaseGrant.TTL, + as.Request.LeaseGrant.ID, + ) + case as.Request.LeaseRevoke != nil: + return fmt.Sprintf("header:<%s> lease_revoke:", + as.Request.Header.String(), + as.Request.LeaseRevoke.ID, + ) + case as.Request.Authenticate != nil: + return fmt.Sprintf("header:<%s> authenticate:", + as.Request.Header.String(), + as.Request.Authenticate.Name, + as.Request.Authenticate.SimpleToken, + ) + case as.Request.AuthUserAdd != nil: + return fmt.Sprintf("header:<%s> auth_user_add:", + as.Request.Header.String(), + as.Request.AuthUserAdd.Name, + ) + case as.Request.AuthUserChangePassword != nil: + return fmt.Sprintf("header:<%s> auth_user_change_password:", + as.Request.Header.String(), + as.Request.AuthUserChangePassword.Name, + ) + case as.Request.Put != nil: + return fmt.Sprintf("header:<%s> put:<%s>", + as.Request.Header.String(), + NewLoggablePutRequest(as.Request.Put).String(), + ) + case as.Request.Txn != nil: + return fmt.Sprintf("header:<%s> txn:<%s>", + as.Request.Header.String(), + NewLoggableTxnRequest(as.Request.Txn).String(), + ) + default: + // nothing to redact + } + return as.Request.String() +} + +// txnRequestStringer implements a custom proto String to replace value bytes fields with value size +// fields in any nested txn and put operations. +type txnRequestStringer struct { + Request *TxnRequest +} + +func NewLoggableTxnRequest(request *TxnRequest) *txnRequestStringer { + return &txnRequestStringer{request} +} + +func (as *txnRequestStringer) String() string { + var compare []string + for _, c := range as.Request.Compare { + switch cv := c.TargetUnion.(type) { + case *Compare_Value: + compare = append(compare, newLoggableValueCompare(c, cv).String()) + default: + // nothing to redact + compare = append(compare, c.String()) + } + } + var success []string + for _, s := range as.Request.Success { + success = append(success, newLoggableRequestOp(s).String()) + } + var failure []string + for _, f := range as.Request.Failure { + failure = append(failure, newLoggableRequestOp(f).String()) + } + return fmt.Sprintf("compare:<%s> success:<%s> failure:<%s>", + strings.Join(compare, " "), + strings.Join(success, " "), + strings.Join(failure, " "), + ) +} + +// requestOpStringer implements a custom proto String to replace value bytes fields with value +// size fields in any nested txn and put operations. +type requestOpStringer struct { + Op *RequestOp +} + +func newLoggableRequestOp(op *RequestOp) *requestOpStringer { + return &requestOpStringer{op} +} + +func (as *requestOpStringer) String() string { + switch op := as.Op.Request.(type) { + case *RequestOp_RequestPut: + return fmt.Sprintf("request_put:<%s>", NewLoggablePutRequest(op.RequestPut).String()) + case *RequestOp_RequestTxn: + return fmt.Sprintf("request_txn:<%s>", NewLoggableTxnRequest(op.RequestTxn).String()) + default: + // nothing to redact + } + return as.Op.String() +} + +// loggableValueCompare implements a custom proto String for Compare.Value union member types to +// replace the value bytes field with a value size field. +// To preserve proto encoding of the key and range_end bytes, a faked out proto type is used here. +type loggableValueCompare struct { + Result Compare_CompareResult `protobuf:"varint,1,opt,name=result,proto3,enum=etcdserverpb.Compare_CompareResult"` + Target Compare_CompareTarget `protobuf:"varint,2,opt,name=target,proto3,enum=etcdserverpb.Compare_CompareTarget"` + Key []byte `protobuf:"bytes,3,opt,name=key,proto3"` + ValueSize int64 `protobuf:"varint,7,opt,name=value_size,proto3"` + RangeEnd []byte `protobuf:"bytes,64,opt,name=range_end,proto3"` +} + +func newLoggableValueCompare(c *Compare, cv *Compare_Value) *loggableValueCompare { + return &loggableValueCompare{ + c.Result, + c.Target, + c.Key, + int64(len(cv.Value)), + c.RangeEnd, + } +} + +func (m *loggableValueCompare) Reset() { *m = loggableValueCompare{} } +func (m *loggableValueCompare) String() string { return proto.CompactTextString(m) } +func (*loggableValueCompare) ProtoMessage() {} + +// loggablePutRequest implements a custom proto String to replace value bytes field with a value +// size field. +// To preserve proto encoding of the key bytes, a faked out proto type is used here. +type loggablePutRequest struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3"` + ValueSize int64 `protobuf:"varint,2,opt,name=value_size,proto3"` + Lease int64 `protobuf:"varint,3,opt,name=lease,proto3"` + PrevKv bool `protobuf:"varint,4,opt,name=prev_kv,proto3"` + IgnoreValue bool `protobuf:"varint,5,opt,name=ignore_value,proto3"` + IgnoreLease bool `protobuf:"varint,6,opt,name=ignore_lease,proto3"` +} + +func NewLoggablePutRequest(request *PutRequest) *loggablePutRequest { + return &loggablePutRequest{ + request.Key, + int64(len(request.Value)), + request.Lease, + request.PrevKv, + request.IgnoreValue, + request.IgnoreLease, + } +} + +func (m *loggablePutRequest) Reset() { *m = loggablePutRequest{} } +func (m *loggablePutRequest) String() string { return proto.CompactTextString(m) } +func (*loggablePutRequest) ProtoMessage() {} diff --git a/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/rpc.pb.go b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/rpc.pb.go new file mode 100644 index 00000000..6cbccc79 --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/rpc.pb.go @@ -0,0 +1,20088 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: rpc.proto + +package etcdserverpb + +import ( + "fmt" + + proto "github.com/golang/protobuf/proto" + + math "math" + + _ "github.com/gogo/protobuf/gogoproto" + + mvccpb "go.etcd.io/etcd/mvcc/mvccpb" + + authpb "go.etcd.io/etcd/auth/authpb" + + context "golang.org/x/net/context" + + grpc "google.golang.org/grpc" + + io "io" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type AlarmType int32 + +const ( + AlarmType_NONE AlarmType = 0 + AlarmType_NOSPACE AlarmType = 1 + AlarmType_CORRUPT AlarmType = 2 +) + +var AlarmType_name = map[int32]string{ + 0: "NONE", + 1: "NOSPACE", + 2: "CORRUPT", +} +var AlarmType_value = map[string]int32{ + "NONE": 0, + "NOSPACE": 1, + "CORRUPT": 2, +} + +func (x AlarmType) String() string { + return proto.EnumName(AlarmType_name, int32(x)) +} +func (AlarmType) EnumDescriptor() ([]byte, []int) { return fileDescriptorRpc, []int{0} } + +type RangeRequest_SortOrder int32 + +const ( + RangeRequest_NONE RangeRequest_SortOrder = 0 + RangeRequest_ASCEND RangeRequest_SortOrder = 1 + RangeRequest_DESCEND RangeRequest_SortOrder = 2 +) + +var RangeRequest_SortOrder_name = map[int32]string{ + 0: "NONE", + 1: "ASCEND", + 2: "DESCEND", +} +var RangeRequest_SortOrder_value = map[string]int32{ + "NONE": 0, + "ASCEND": 1, + "DESCEND": 2, +} + +func (x RangeRequest_SortOrder) String() string { + return proto.EnumName(RangeRequest_SortOrder_name, int32(x)) +} +func (RangeRequest_SortOrder) EnumDescriptor() ([]byte, []int) { return fileDescriptorRpc, []int{1, 0} } + +type RangeRequest_SortTarget int32 + +const ( + RangeRequest_KEY RangeRequest_SortTarget = 0 + RangeRequest_VERSION RangeRequest_SortTarget = 1 + RangeRequest_CREATE RangeRequest_SortTarget = 2 + RangeRequest_MOD RangeRequest_SortTarget = 3 + RangeRequest_VALUE RangeRequest_SortTarget = 4 +) + +var RangeRequest_SortTarget_name = map[int32]string{ + 0: "KEY", + 1: "VERSION", + 2: "CREATE", + 3: "MOD", + 4: "VALUE", +} +var RangeRequest_SortTarget_value = map[string]int32{ + "KEY": 0, + "VERSION": 1, + "CREATE": 2, + "MOD": 3, + "VALUE": 4, +} + +func (x RangeRequest_SortTarget) String() string { + return proto.EnumName(RangeRequest_SortTarget_name, int32(x)) +} +func (RangeRequest_SortTarget) EnumDescriptor() ([]byte, []int) { + return fileDescriptorRpc, []int{1, 1} +} + +type Compare_CompareResult int32 + +const ( + Compare_EQUAL Compare_CompareResult = 0 + Compare_GREATER Compare_CompareResult = 1 + Compare_LESS Compare_CompareResult = 2 + Compare_NOT_EQUAL Compare_CompareResult = 3 +) + +var Compare_CompareResult_name = map[int32]string{ + 0: "EQUAL", + 1: "GREATER", + 2: "LESS", + 3: "NOT_EQUAL", +} +var Compare_CompareResult_value = map[string]int32{ + "EQUAL": 0, + "GREATER": 1, + "LESS": 2, + "NOT_EQUAL": 3, +} + +func (x Compare_CompareResult) String() string { + return proto.EnumName(Compare_CompareResult_name, int32(x)) +} +func (Compare_CompareResult) EnumDescriptor() ([]byte, []int) { return fileDescriptorRpc, []int{9, 0} } + +type Compare_CompareTarget int32 + +const ( + Compare_VERSION Compare_CompareTarget = 0 + Compare_CREATE Compare_CompareTarget = 1 + Compare_MOD Compare_CompareTarget = 2 + Compare_VALUE Compare_CompareTarget = 3 + Compare_LEASE Compare_CompareTarget = 4 +) + +var Compare_CompareTarget_name = map[int32]string{ + 0: "VERSION", + 1: "CREATE", + 2: "MOD", + 3: "VALUE", + 4: "LEASE", +} +var Compare_CompareTarget_value = map[string]int32{ + "VERSION": 0, + "CREATE": 1, + "MOD": 2, + "VALUE": 3, + "LEASE": 4, +} + +func (x Compare_CompareTarget) String() string { + return proto.EnumName(Compare_CompareTarget_name, int32(x)) +} +func (Compare_CompareTarget) EnumDescriptor() ([]byte, []int) { return fileDescriptorRpc, []int{9, 1} } + +type WatchCreateRequest_FilterType int32 + +const ( + // filter out put event. + WatchCreateRequest_NOPUT WatchCreateRequest_FilterType = 0 + // filter out delete event. + WatchCreateRequest_NODELETE WatchCreateRequest_FilterType = 1 +) + +var WatchCreateRequest_FilterType_name = map[int32]string{ + 0: "NOPUT", + 1: "NODELETE", +} +var WatchCreateRequest_FilterType_value = map[string]int32{ + "NOPUT": 0, + "NODELETE": 1, +} + +func (x WatchCreateRequest_FilterType) String() string { + return proto.EnumName(WatchCreateRequest_FilterType_name, int32(x)) +} +func (WatchCreateRequest_FilterType) EnumDescriptor() ([]byte, []int) { + return fileDescriptorRpc, []int{21, 0} +} + +type AlarmRequest_AlarmAction int32 + +const ( + AlarmRequest_GET AlarmRequest_AlarmAction = 0 + AlarmRequest_ACTIVATE AlarmRequest_AlarmAction = 1 + AlarmRequest_DEACTIVATE AlarmRequest_AlarmAction = 2 +) + +var AlarmRequest_AlarmAction_name = map[int32]string{ + 0: "GET", + 1: "ACTIVATE", + 2: "DEACTIVATE", +} +var AlarmRequest_AlarmAction_value = map[string]int32{ + "GET": 0, + "ACTIVATE": 1, + "DEACTIVATE": 2, +} + +func (x AlarmRequest_AlarmAction) String() string { + return proto.EnumName(AlarmRequest_AlarmAction_name, int32(x)) +} +func (AlarmRequest_AlarmAction) EnumDescriptor() ([]byte, []int) { + return fileDescriptorRpc, []int{54, 0} +} + +type ResponseHeader struct { + // cluster_id is the ID of the cluster which sent the response. + ClusterId uint64 `protobuf:"varint,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // member_id is the ID of the member which sent the response. + MemberId uint64 `protobuf:"varint,2,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"` + // revision is the key-value store revision when the request was applied. + // For watch progress responses, the header.revision indicates progress. All future events + // recieved in this stream are guaranteed to have a higher revision number than the + // header.revision number. + Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` + // raft_term is the raft term when the request was applied. + RaftTerm uint64 `protobuf:"varint,4,opt,name=raft_term,json=raftTerm,proto3" json:"raft_term,omitempty"` +} + +func (m *ResponseHeader) Reset() { *m = ResponseHeader{} } +func (m *ResponseHeader) String() string { return proto.CompactTextString(m) } +func (*ResponseHeader) ProtoMessage() {} +func (*ResponseHeader) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{0} } + +func (m *ResponseHeader) GetClusterId() uint64 { + if m != nil { + return m.ClusterId + } + return 0 +} + +func (m *ResponseHeader) GetMemberId() uint64 { + if m != nil { + return m.MemberId + } + return 0 +} + +func (m *ResponseHeader) GetRevision() int64 { + if m != nil { + return m.Revision + } + return 0 +} + +func (m *ResponseHeader) GetRaftTerm() uint64 { + if m != nil { + return m.RaftTerm + } + return 0 +} + +type RangeRequest struct { + // key is the first key for the range. If range_end is not given, the request only looks up key. + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // range_end is the upper bound on the requested range [key, range_end). + // If range_end is '\0', the range is all keys >= key. + // If range_end is key plus one (e.g., "aa"+1 == "ab", "a\xff"+1 == "b"), + // then the range request gets all keys prefixed with key. + // If both key and range_end are '\0', then the range request returns all keys. + RangeEnd []byte `protobuf:"bytes,2,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"` + // limit is a limit on the number of keys returned for the request. When limit is set to 0, + // it is treated as no limit. + Limit int64 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` + // revision is the point-in-time of the key-value store to use for the range. + // If revision is less or equal to zero, the range is over the newest key-value store. + // If the revision has been compacted, ErrCompacted is returned as a response. + Revision int64 `protobuf:"varint,4,opt,name=revision,proto3" json:"revision,omitempty"` + // sort_order is the order for returned sorted results. + SortOrder RangeRequest_SortOrder `protobuf:"varint,5,opt,name=sort_order,json=sortOrder,proto3,enum=etcdserverpb.RangeRequest_SortOrder" json:"sort_order,omitempty"` + // sort_target is the key-value field to use for sorting. + SortTarget RangeRequest_SortTarget `protobuf:"varint,6,opt,name=sort_target,json=sortTarget,proto3,enum=etcdserverpb.RangeRequest_SortTarget" json:"sort_target,omitempty"` + // serializable sets the range request to use serializable member-local reads. + // Range requests are linearizable by default; linearizable requests have higher + // latency and lower throughput than serializable requests but reflect the current + // consensus of the cluster. For better performance, in exchange for possible stale reads, + // a serializable range request is served locally without needing to reach consensus + // with other nodes in the cluster. + Serializable bool `protobuf:"varint,7,opt,name=serializable,proto3" json:"serializable,omitempty"` + // keys_only when set returns only the keys and not the values. + KeysOnly bool `protobuf:"varint,8,opt,name=keys_only,json=keysOnly,proto3" json:"keys_only,omitempty"` + // count_only when set returns only the count of the keys in the range. + CountOnly bool `protobuf:"varint,9,opt,name=count_only,json=countOnly,proto3" json:"count_only,omitempty"` + // min_mod_revision is the lower bound for returned key mod revisions; all keys with + // lesser mod revisions will be filtered away. + MinModRevision int64 `protobuf:"varint,10,opt,name=min_mod_revision,json=minModRevision,proto3" json:"min_mod_revision,omitempty"` + // max_mod_revision is the upper bound for returned key mod revisions; all keys with + // greater mod revisions will be filtered away. + MaxModRevision int64 `protobuf:"varint,11,opt,name=max_mod_revision,json=maxModRevision,proto3" json:"max_mod_revision,omitempty"` + // min_create_revision is the lower bound for returned key create revisions; all keys with + // lesser create revisions will be filtered away. + MinCreateRevision int64 `protobuf:"varint,12,opt,name=min_create_revision,json=minCreateRevision,proto3" json:"min_create_revision,omitempty"` + // max_create_revision is the upper bound for returned key create revisions; all keys with + // greater create revisions will be filtered away. + MaxCreateRevision int64 `protobuf:"varint,13,opt,name=max_create_revision,json=maxCreateRevision,proto3" json:"max_create_revision,omitempty"` +} + +func (m *RangeRequest) Reset() { *m = RangeRequest{} } +func (m *RangeRequest) String() string { return proto.CompactTextString(m) } +func (*RangeRequest) ProtoMessage() {} +func (*RangeRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{1} } + +func (m *RangeRequest) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *RangeRequest) GetRangeEnd() []byte { + if m != nil { + return m.RangeEnd + } + return nil +} + +func (m *RangeRequest) GetLimit() int64 { + if m != nil { + return m.Limit + } + return 0 +} + +func (m *RangeRequest) GetRevision() int64 { + if m != nil { + return m.Revision + } + return 0 +} + +func (m *RangeRequest) GetSortOrder() RangeRequest_SortOrder { + if m != nil { + return m.SortOrder + } + return RangeRequest_NONE +} + +func (m *RangeRequest) GetSortTarget() RangeRequest_SortTarget { + if m != nil { + return m.SortTarget + } + return RangeRequest_KEY +} + +func (m *RangeRequest) GetSerializable() bool { + if m != nil { + return m.Serializable + } + return false +} + +func (m *RangeRequest) GetKeysOnly() bool { + if m != nil { + return m.KeysOnly + } + return false +} + +func (m *RangeRequest) GetCountOnly() bool { + if m != nil { + return m.CountOnly + } + return false +} + +func (m *RangeRequest) GetMinModRevision() int64 { + if m != nil { + return m.MinModRevision + } + return 0 +} + +func (m *RangeRequest) GetMaxModRevision() int64 { + if m != nil { + return m.MaxModRevision + } + return 0 +} + +func (m *RangeRequest) GetMinCreateRevision() int64 { + if m != nil { + return m.MinCreateRevision + } + return 0 +} + +func (m *RangeRequest) GetMaxCreateRevision() int64 { + if m != nil { + return m.MaxCreateRevision + } + return 0 +} + +type RangeResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // kvs is the list of key-value pairs matched by the range request. + // kvs is empty when count is requested. + Kvs []*mvccpb.KeyValue `protobuf:"bytes,2,rep,name=kvs" json:"kvs,omitempty"` + // more indicates if there are more keys to return in the requested range. + More bool `protobuf:"varint,3,opt,name=more,proto3" json:"more,omitempty"` + // count is set to the number of keys within the range when requested. + Count int64 `protobuf:"varint,4,opt,name=count,proto3" json:"count,omitempty"` +} + +func (m *RangeResponse) Reset() { *m = RangeResponse{} } +func (m *RangeResponse) String() string { return proto.CompactTextString(m) } +func (*RangeResponse) ProtoMessage() {} +func (*RangeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{2} } + +func (m *RangeResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *RangeResponse) GetKvs() []*mvccpb.KeyValue { + if m != nil { + return m.Kvs + } + return nil +} + +func (m *RangeResponse) GetMore() bool { + if m != nil { + return m.More + } + return false +} + +func (m *RangeResponse) GetCount() int64 { + if m != nil { + return m.Count + } + return 0 +} + +type PutRequest struct { + // key is the key, in bytes, to put into the key-value store. + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // value is the value, in bytes, to associate with the key in the key-value store. + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + // lease is the lease ID to associate with the key in the key-value store. A lease + // value of 0 indicates no lease. + Lease int64 `protobuf:"varint,3,opt,name=lease,proto3" json:"lease,omitempty"` + // If prev_kv is set, etcd gets the previous key-value pair before changing it. + // The previous key-value pair will be returned in the put response. + PrevKv bool `protobuf:"varint,4,opt,name=prev_kv,json=prevKv,proto3" json:"prev_kv,omitempty"` + // If ignore_value is set, etcd updates the key using its current value. + // Returns an error if the key does not exist. + IgnoreValue bool `protobuf:"varint,5,opt,name=ignore_value,json=ignoreValue,proto3" json:"ignore_value,omitempty"` + // If ignore_lease is set, etcd updates the key using its current lease. + // Returns an error if the key does not exist. + IgnoreLease bool `protobuf:"varint,6,opt,name=ignore_lease,json=ignoreLease,proto3" json:"ignore_lease,omitempty"` +} + +func (m *PutRequest) Reset() { *m = PutRequest{} } +func (m *PutRequest) String() string { return proto.CompactTextString(m) } +func (*PutRequest) ProtoMessage() {} +func (*PutRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{3} } + +func (m *PutRequest) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *PutRequest) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *PutRequest) GetLease() int64 { + if m != nil { + return m.Lease + } + return 0 +} + +func (m *PutRequest) GetPrevKv() bool { + if m != nil { + return m.PrevKv + } + return false +} + +func (m *PutRequest) GetIgnoreValue() bool { + if m != nil { + return m.IgnoreValue + } + return false +} + +func (m *PutRequest) GetIgnoreLease() bool { + if m != nil { + return m.IgnoreLease + } + return false +} + +type PutResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // if prev_kv is set in the request, the previous key-value pair will be returned. + PrevKv *mvccpb.KeyValue `protobuf:"bytes,2,opt,name=prev_kv,json=prevKv" json:"prev_kv,omitempty"` +} + +func (m *PutResponse) Reset() { *m = PutResponse{} } +func (m *PutResponse) String() string { return proto.CompactTextString(m) } +func (*PutResponse) ProtoMessage() {} +func (*PutResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{4} } + +func (m *PutResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *PutResponse) GetPrevKv() *mvccpb.KeyValue { + if m != nil { + return m.PrevKv + } + return nil +} + +type DeleteRangeRequest struct { + // key is the first key to delete in the range. + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // range_end is the key following the last key to delete for the range [key, range_end). + // If range_end is not given, the range is defined to contain only the key argument. + // If range_end is one bit larger than the given key, then the range is all the keys + // with the prefix (the given key). + // If range_end is '\0', the range is all keys greater than or equal to the key argument. + RangeEnd []byte `protobuf:"bytes,2,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"` + // If prev_kv is set, etcd gets the previous key-value pairs before deleting it. + // The previous key-value pairs will be returned in the delete response. + PrevKv bool `protobuf:"varint,3,opt,name=prev_kv,json=prevKv,proto3" json:"prev_kv,omitempty"` +} + +func (m *DeleteRangeRequest) Reset() { *m = DeleteRangeRequest{} } +func (m *DeleteRangeRequest) String() string { return proto.CompactTextString(m) } +func (*DeleteRangeRequest) ProtoMessage() {} +func (*DeleteRangeRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{5} } + +func (m *DeleteRangeRequest) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *DeleteRangeRequest) GetRangeEnd() []byte { + if m != nil { + return m.RangeEnd + } + return nil +} + +func (m *DeleteRangeRequest) GetPrevKv() bool { + if m != nil { + return m.PrevKv + } + return false +} + +type DeleteRangeResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // deleted is the number of keys deleted by the delete range request. + Deleted int64 `protobuf:"varint,2,opt,name=deleted,proto3" json:"deleted,omitempty"` + // if prev_kv is set in the request, the previous key-value pairs will be returned. + PrevKvs []*mvccpb.KeyValue `protobuf:"bytes,3,rep,name=prev_kvs,json=prevKvs" json:"prev_kvs,omitempty"` +} + +func (m *DeleteRangeResponse) Reset() { *m = DeleteRangeResponse{} } +func (m *DeleteRangeResponse) String() string { return proto.CompactTextString(m) } +func (*DeleteRangeResponse) ProtoMessage() {} +func (*DeleteRangeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{6} } + +func (m *DeleteRangeResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *DeleteRangeResponse) GetDeleted() int64 { + if m != nil { + return m.Deleted + } + return 0 +} + +func (m *DeleteRangeResponse) GetPrevKvs() []*mvccpb.KeyValue { + if m != nil { + return m.PrevKvs + } + return nil +} + +type RequestOp struct { + // request is a union of request types accepted by a transaction. + // + // Types that are valid to be assigned to Request: + // *RequestOp_RequestRange + // *RequestOp_RequestPut + // *RequestOp_RequestDeleteRange + // *RequestOp_RequestTxn + Request isRequestOp_Request `protobuf_oneof:"request"` +} + +func (m *RequestOp) Reset() { *m = RequestOp{} } +func (m *RequestOp) String() string { return proto.CompactTextString(m) } +func (*RequestOp) ProtoMessage() {} +func (*RequestOp) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{7} } + +type isRequestOp_Request interface { + isRequestOp_Request() + MarshalTo([]byte) (int, error) + Size() int +} + +type RequestOp_RequestRange struct { + RequestRange *RangeRequest `protobuf:"bytes,1,opt,name=request_range,json=requestRange,oneof"` +} +type RequestOp_RequestPut struct { + RequestPut *PutRequest `protobuf:"bytes,2,opt,name=request_put,json=requestPut,oneof"` +} +type RequestOp_RequestDeleteRange struct { + RequestDeleteRange *DeleteRangeRequest `protobuf:"bytes,3,opt,name=request_delete_range,json=requestDeleteRange,oneof"` +} +type RequestOp_RequestTxn struct { + RequestTxn *TxnRequest `protobuf:"bytes,4,opt,name=request_txn,json=requestTxn,oneof"` +} + +func (*RequestOp_RequestRange) isRequestOp_Request() {} +func (*RequestOp_RequestPut) isRequestOp_Request() {} +func (*RequestOp_RequestDeleteRange) isRequestOp_Request() {} +func (*RequestOp_RequestTxn) isRequestOp_Request() {} + +func (m *RequestOp) GetRequest() isRequestOp_Request { + if m != nil { + return m.Request + } + return nil +} + +func (m *RequestOp) GetRequestRange() *RangeRequest { + if x, ok := m.GetRequest().(*RequestOp_RequestRange); ok { + return x.RequestRange + } + return nil +} + +func (m *RequestOp) GetRequestPut() *PutRequest { + if x, ok := m.GetRequest().(*RequestOp_RequestPut); ok { + return x.RequestPut + } + return nil +} + +func (m *RequestOp) GetRequestDeleteRange() *DeleteRangeRequest { + if x, ok := m.GetRequest().(*RequestOp_RequestDeleteRange); ok { + return x.RequestDeleteRange + } + return nil +} + +func (m *RequestOp) GetRequestTxn() *TxnRequest { + if x, ok := m.GetRequest().(*RequestOp_RequestTxn); ok { + return x.RequestTxn + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*RequestOp) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _RequestOp_OneofMarshaler, _RequestOp_OneofUnmarshaler, _RequestOp_OneofSizer, []interface{}{ + (*RequestOp_RequestRange)(nil), + (*RequestOp_RequestPut)(nil), + (*RequestOp_RequestDeleteRange)(nil), + (*RequestOp_RequestTxn)(nil), + } +} + +func _RequestOp_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*RequestOp) + // request + switch x := m.Request.(type) { + case *RequestOp_RequestRange: + _ = b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.RequestRange); err != nil { + return err + } + case *RequestOp_RequestPut: + _ = b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.RequestPut); err != nil { + return err + } + case *RequestOp_RequestDeleteRange: + _ = b.EncodeVarint(3<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.RequestDeleteRange); err != nil { + return err + } + case *RequestOp_RequestTxn: + _ = b.EncodeVarint(4<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.RequestTxn); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("RequestOp.Request has unexpected type %T", x) + } + return nil +} + +func _RequestOp_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*RequestOp) + switch tag { + case 1: // request.request_range + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(RangeRequest) + err := b.DecodeMessage(msg) + m.Request = &RequestOp_RequestRange{msg} + return true, err + case 2: // request.request_put + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(PutRequest) + err := b.DecodeMessage(msg) + m.Request = &RequestOp_RequestPut{msg} + return true, err + case 3: // request.request_delete_range + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(DeleteRangeRequest) + err := b.DecodeMessage(msg) + m.Request = &RequestOp_RequestDeleteRange{msg} + return true, err + case 4: // request.request_txn + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(TxnRequest) + err := b.DecodeMessage(msg) + m.Request = &RequestOp_RequestTxn{msg} + return true, err + default: + return false, nil + } +} + +func _RequestOp_OneofSizer(msg proto.Message) (n int) { + m := msg.(*RequestOp) + // request + switch x := m.Request.(type) { + case *RequestOp_RequestRange: + s := proto.Size(x.RequestRange) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *RequestOp_RequestPut: + s := proto.Size(x.RequestPut) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *RequestOp_RequestDeleteRange: + s := proto.Size(x.RequestDeleteRange) + n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *RequestOp_RequestTxn: + s := proto.Size(x.RequestTxn) + n += proto.SizeVarint(4<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type ResponseOp struct { + // response is a union of response types returned by a transaction. + // + // Types that are valid to be assigned to Response: + // *ResponseOp_ResponseRange + // *ResponseOp_ResponsePut + // *ResponseOp_ResponseDeleteRange + // *ResponseOp_ResponseTxn + Response isResponseOp_Response `protobuf_oneof:"response"` +} + +func (m *ResponseOp) Reset() { *m = ResponseOp{} } +func (m *ResponseOp) String() string { return proto.CompactTextString(m) } +func (*ResponseOp) ProtoMessage() {} +func (*ResponseOp) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{8} } + +type isResponseOp_Response interface { + isResponseOp_Response() + MarshalTo([]byte) (int, error) + Size() int +} + +type ResponseOp_ResponseRange struct { + ResponseRange *RangeResponse `protobuf:"bytes,1,opt,name=response_range,json=responseRange,oneof"` +} +type ResponseOp_ResponsePut struct { + ResponsePut *PutResponse `protobuf:"bytes,2,opt,name=response_put,json=responsePut,oneof"` +} +type ResponseOp_ResponseDeleteRange struct { + ResponseDeleteRange *DeleteRangeResponse `protobuf:"bytes,3,opt,name=response_delete_range,json=responseDeleteRange,oneof"` +} +type ResponseOp_ResponseTxn struct { + ResponseTxn *TxnResponse `protobuf:"bytes,4,opt,name=response_txn,json=responseTxn,oneof"` +} + +func (*ResponseOp_ResponseRange) isResponseOp_Response() {} +func (*ResponseOp_ResponsePut) isResponseOp_Response() {} +func (*ResponseOp_ResponseDeleteRange) isResponseOp_Response() {} +func (*ResponseOp_ResponseTxn) isResponseOp_Response() {} + +func (m *ResponseOp) GetResponse() isResponseOp_Response { + if m != nil { + return m.Response + } + return nil +} + +func (m *ResponseOp) GetResponseRange() *RangeResponse { + if x, ok := m.GetResponse().(*ResponseOp_ResponseRange); ok { + return x.ResponseRange + } + return nil +} + +func (m *ResponseOp) GetResponsePut() *PutResponse { + if x, ok := m.GetResponse().(*ResponseOp_ResponsePut); ok { + return x.ResponsePut + } + return nil +} + +func (m *ResponseOp) GetResponseDeleteRange() *DeleteRangeResponse { + if x, ok := m.GetResponse().(*ResponseOp_ResponseDeleteRange); ok { + return x.ResponseDeleteRange + } + return nil +} + +func (m *ResponseOp) GetResponseTxn() *TxnResponse { + if x, ok := m.GetResponse().(*ResponseOp_ResponseTxn); ok { + return x.ResponseTxn + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*ResponseOp) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _ResponseOp_OneofMarshaler, _ResponseOp_OneofUnmarshaler, _ResponseOp_OneofSizer, []interface{}{ + (*ResponseOp_ResponseRange)(nil), + (*ResponseOp_ResponsePut)(nil), + (*ResponseOp_ResponseDeleteRange)(nil), + (*ResponseOp_ResponseTxn)(nil), + } +} + +func _ResponseOp_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*ResponseOp) + // response + switch x := m.Response.(type) { + case *ResponseOp_ResponseRange: + _ = b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ResponseRange); err != nil { + return err + } + case *ResponseOp_ResponsePut: + _ = b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ResponsePut); err != nil { + return err + } + case *ResponseOp_ResponseDeleteRange: + _ = b.EncodeVarint(3<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ResponseDeleteRange); err != nil { + return err + } + case *ResponseOp_ResponseTxn: + _ = b.EncodeVarint(4<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ResponseTxn); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("ResponseOp.Response has unexpected type %T", x) + } + return nil +} + +func _ResponseOp_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*ResponseOp) + switch tag { + case 1: // response.response_range + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(RangeResponse) + err := b.DecodeMessage(msg) + m.Response = &ResponseOp_ResponseRange{msg} + return true, err + case 2: // response.response_put + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(PutResponse) + err := b.DecodeMessage(msg) + m.Response = &ResponseOp_ResponsePut{msg} + return true, err + case 3: // response.response_delete_range + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(DeleteRangeResponse) + err := b.DecodeMessage(msg) + m.Response = &ResponseOp_ResponseDeleteRange{msg} + return true, err + case 4: // response.response_txn + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(TxnResponse) + err := b.DecodeMessage(msg) + m.Response = &ResponseOp_ResponseTxn{msg} + return true, err + default: + return false, nil + } +} + +func _ResponseOp_OneofSizer(msg proto.Message) (n int) { + m := msg.(*ResponseOp) + // response + switch x := m.Response.(type) { + case *ResponseOp_ResponseRange: + s := proto.Size(x.ResponseRange) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *ResponseOp_ResponsePut: + s := proto.Size(x.ResponsePut) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *ResponseOp_ResponseDeleteRange: + s := proto.Size(x.ResponseDeleteRange) + n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *ResponseOp_ResponseTxn: + s := proto.Size(x.ResponseTxn) + n += proto.SizeVarint(4<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Compare struct { + // result is logical comparison operation for this comparison. + Result Compare_CompareResult `protobuf:"varint,1,opt,name=result,proto3,enum=etcdserverpb.Compare_CompareResult" json:"result,omitempty"` + // target is the key-value field to inspect for the comparison. + Target Compare_CompareTarget `protobuf:"varint,2,opt,name=target,proto3,enum=etcdserverpb.Compare_CompareTarget" json:"target,omitempty"` + // key is the subject key for the comparison operation. + Key []byte `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // Types that are valid to be assigned to TargetUnion: + // *Compare_Version + // *Compare_CreateRevision + // *Compare_ModRevision + // *Compare_Value + // *Compare_Lease + TargetUnion isCompare_TargetUnion `protobuf_oneof:"target_union"` + // range_end compares the given target to all keys in the range [key, range_end). + // See RangeRequest for more details on key ranges. + RangeEnd []byte `protobuf:"bytes,64,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"` +} + +func (m *Compare) Reset() { *m = Compare{} } +func (m *Compare) String() string { return proto.CompactTextString(m) } +func (*Compare) ProtoMessage() {} +func (*Compare) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{9} } + +type isCompare_TargetUnion interface { + isCompare_TargetUnion() + MarshalTo([]byte) (int, error) + Size() int +} + +type Compare_Version struct { + Version int64 `protobuf:"varint,4,opt,name=version,proto3,oneof"` +} +type Compare_CreateRevision struct { + CreateRevision int64 `protobuf:"varint,5,opt,name=create_revision,json=createRevision,proto3,oneof"` +} +type Compare_ModRevision struct { + ModRevision int64 `protobuf:"varint,6,opt,name=mod_revision,json=modRevision,proto3,oneof"` +} +type Compare_Value struct { + Value []byte `protobuf:"bytes,7,opt,name=value,proto3,oneof"` +} +type Compare_Lease struct { + Lease int64 `protobuf:"varint,8,opt,name=lease,proto3,oneof"` +} + +func (*Compare_Version) isCompare_TargetUnion() {} +func (*Compare_CreateRevision) isCompare_TargetUnion() {} +func (*Compare_ModRevision) isCompare_TargetUnion() {} +func (*Compare_Value) isCompare_TargetUnion() {} +func (*Compare_Lease) isCompare_TargetUnion() {} + +func (m *Compare) GetTargetUnion() isCompare_TargetUnion { + if m != nil { + return m.TargetUnion + } + return nil +} + +func (m *Compare) GetResult() Compare_CompareResult { + if m != nil { + return m.Result + } + return Compare_EQUAL +} + +func (m *Compare) GetTarget() Compare_CompareTarget { + if m != nil { + return m.Target + } + return Compare_VERSION +} + +func (m *Compare) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *Compare) GetVersion() int64 { + if x, ok := m.GetTargetUnion().(*Compare_Version); ok { + return x.Version + } + return 0 +} + +func (m *Compare) GetCreateRevision() int64 { + if x, ok := m.GetTargetUnion().(*Compare_CreateRevision); ok { + return x.CreateRevision + } + return 0 +} + +func (m *Compare) GetModRevision() int64 { + if x, ok := m.GetTargetUnion().(*Compare_ModRevision); ok { + return x.ModRevision + } + return 0 +} + +func (m *Compare) GetValue() []byte { + if x, ok := m.GetTargetUnion().(*Compare_Value); ok { + return x.Value + } + return nil +} + +func (m *Compare) GetLease() int64 { + if x, ok := m.GetTargetUnion().(*Compare_Lease); ok { + return x.Lease + } + return 0 +} + +func (m *Compare) GetRangeEnd() []byte { + if m != nil { + return m.RangeEnd + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Compare) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Compare_OneofMarshaler, _Compare_OneofUnmarshaler, _Compare_OneofSizer, []interface{}{ + (*Compare_Version)(nil), + (*Compare_CreateRevision)(nil), + (*Compare_ModRevision)(nil), + (*Compare_Value)(nil), + (*Compare_Lease)(nil), + } +} + +func _Compare_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Compare) + // target_union + switch x := m.TargetUnion.(type) { + case *Compare_Version: + _ = b.EncodeVarint(4<<3 | proto.WireVarint) + _ = b.EncodeVarint(uint64(x.Version)) + case *Compare_CreateRevision: + _ = b.EncodeVarint(5<<3 | proto.WireVarint) + _ = b.EncodeVarint(uint64(x.CreateRevision)) + case *Compare_ModRevision: + _ = b.EncodeVarint(6<<3 | proto.WireVarint) + _ = b.EncodeVarint(uint64(x.ModRevision)) + case *Compare_Value: + _ = b.EncodeVarint(7<<3 | proto.WireBytes) + _ = b.EncodeRawBytes(x.Value) + case *Compare_Lease: + _ = b.EncodeVarint(8<<3 | proto.WireVarint) + _ = b.EncodeVarint(uint64(x.Lease)) + case nil: + default: + return fmt.Errorf("Compare.TargetUnion has unexpected type %T", x) + } + return nil +} + +func _Compare_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Compare) + switch tag { + case 4: // target_union.version + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.TargetUnion = &Compare_Version{int64(x)} + return true, err + case 5: // target_union.create_revision + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.TargetUnion = &Compare_CreateRevision{int64(x)} + return true, err + case 6: // target_union.mod_revision + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.TargetUnion = &Compare_ModRevision{int64(x)} + return true, err + case 7: // target_union.value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.TargetUnion = &Compare_Value{x} + return true, err + case 8: // target_union.lease + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.TargetUnion = &Compare_Lease{int64(x)} + return true, err + default: + return false, nil + } +} + +func _Compare_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Compare) + // target_union + switch x := m.TargetUnion.(type) { + case *Compare_Version: + n += proto.SizeVarint(4<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Version)) + case *Compare_CreateRevision: + n += proto.SizeVarint(5<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.CreateRevision)) + case *Compare_ModRevision: + n += proto.SizeVarint(6<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.ModRevision)) + case *Compare_Value: + n += proto.SizeVarint(7<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Value))) + n += len(x.Value) + case *Compare_Lease: + n += proto.SizeVarint(8<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Lease)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// From google paxosdb paper: +// Our implementation hinges around a powerful primitive which we call MultiOp. All other database +// operations except for iteration are implemented as a single call to MultiOp. A MultiOp is applied atomically +// and consists of three components: +// 1. A list of tests called guard. Each test in guard checks a single entry in the database. It may check +// for the absence or presence of a value, or compare with a given value. Two different tests in the guard +// may apply to the same or different entries in the database. All tests in the guard are applied and +// MultiOp returns the results. If all tests are true, MultiOp executes t op (see item 2 below), otherwise +// it executes f op (see item 3 below). +// 2. A list of database operations called t op. Each operation in the list is either an insert, delete, or +// lookup operation, and applies to a single database entry. Two different operations in the list may apply +// to the same or different entries in the database. These operations are executed +// if guard evaluates to +// true. +// 3. A list of database operations called f op. Like t op, but executed if guard evaluates to false. +type TxnRequest struct { + // compare is a list of predicates representing a conjunction of terms. + // If the comparisons succeed, then the success requests will be processed in order, + // and the response will contain their respective responses in order. + // If the comparisons fail, then the failure requests will be processed in order, + // and the response will contain their respective responses in order. + Compare []*Compare `protobuf:"bytes,1,rep,name=compare" json:"compare,omitempty"` + // success is a list of requests which will be applied when compare evaluates to true. + Success []*RequestOp `protobuf:"bytes,2,rep,name=success" json:"success,omitempty"` + // failure is a list of requests which will be applied when compare evaluates to false. + Failure []*RequestOp `protobuf:"bytes,3,rep,name=failure" json:"failure,omitempty"` +} + +func (m *TxnRequest) Reset() { *m = TxnRequest{} } +func (m *TxnRequest) String() string { return proto.CompactTextString(m) } +func (*TxnRequest) ProtoMessage() {} +func (*TxnRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{10} } + +func (m *TxnRequest) GetCompare() []*Compare { + if m != nil { + return m.Compare + } + return nil +} + +func (m *TxnRequest) GetSuccess() []*RequestOp { + if m != nil { + return m.Success + } + return nil +} + +func (m *TxnRequest) GetFailure() []*RequestOp { + if m != nil { + return m.Failure + } + return nil +} + +type TxnResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // succeeded is set to true if the compare evaluated to true or false otherwise. + Succeeded bool `protobuf:"varint,2,opt,name=succeeded,proto3" json:"succeeded,omitempty"` + // responses is a list of responses corresponding to the results from applying + // success if succeeded is true or failure if succeeded is false. + Responses []*ResponseOp `protobuf:"bytes,3,rep,name=responses" json:"responses,omitempty"` +} + +func (m *TxnResponse) Reset() { *m = TxnResponse{} } +func (m *TxnResponse) String() string { return proto.CompactTextString(m) } +func (*TxnResponse) ProtoMessage() {} +func (*TxnResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{11} } + +func (m *TxnResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *TxnResponse) GetSucceeded() bool { + if m != nil { + return m.Succeeded + } + return false +} + +func (m *TxnResponse) GetResponses() []*ResponseOp { + if m != nil { + return m.Responses + } + return nil +} + +// CompactionRequest compacts the key-value store up to a given revision. All superseded keys +// with a revision less than the compaction revision will be removed. +type CompactionRequest struct { + // revision is the key-value store revision for the compaction operation. + Revision int64 `protobuf:"varint,1,opt,name=revision,proto3" json:"revision,omitempty"` + // physical is set so the RPC will wait until the compaction is physically + // applied to the local database such that compacted entries are totally + // removed from the backend database. + Physical bool `protobuf:"varint,2,opt,name=physical,proto3" json:"physical,omitempty"` +} + +func (m *CompactionRequest) Reset() { *m = CompactionRequest{} } +func (m *CompactionRequest) String() string { return proto.CompactTextString(m) } +func (*CompactionRequest) ProtoMessage() {} +func (*CompactionRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{12} } + +func (m *CompactionRequest) GetRevision() int64 { + if m != nil { + return m.Revision + } + return 0 +} + +func (m *CompactionRequest) GetPhysical() bool { + if m != nil { + return m.Physical + } + return false +} + +type CompactionResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *CompactionResponse) Reset() { *m = CompactionResponse{} } +func (m *CompactionResponse) String() string { return proto.CompactTextString(m) } +func (*CompactionResponse) ProtoMessage() {} +func (*CompactionResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{13} } + +func (m *CompactionResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type HashRequest struct { +} + +func (m *HashRequest) Reset() { *m = HashRequest{} } +func (m *HashRequest) String() string { return proto.CompactTextString(m) } +func (*HashRequest) ProtoMessage() {} +func (*HashRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{14} } + +type HashKVRequest struct { + // revision is the key-value store revision for the hash operation. + Revision int64 `protobuf:"varint,1,opt,name=revision,proto3" json:"revision,omitempty"` +} + +func (m *HashKVRequest) Reset() { *m = HashKVRequest{} } +func (m *HashKVRequest) String() string { return proto.CompactTextString(m) } +func (*HashKVRequest) ProtoMessage() {} +func (*HashKVRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{15} } + +func (m *HashKVRequest) GetRevision() int64 { + if m != nil { + return m.Revision + } + return 0 +} + +type HashKVResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // hash is the hash value computed from the responding member's MVCC keys up to a given revision. + Hash uint32 `protobuf:"varint,2,opt,name=hash,proto3" json:"hash,omitempty"` + // compact_revision is the compacted revision of key-value store when hash begins. + CompactRevision int64 `protobuf:"varint,3,opt,name=compact_revision,json=compactRevision,proto3" json:"compact_revision,omitempty"` +} + +func (m *HashKVResponse) Reset() { *m = HashKVResponse{} } +func (m *HashKVResponse) String() string { return proto.CompactTextString(m) } +func (*HashKVResponse) ProtoMessage() {} +func (*HashKVResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{16} } + +func (m *HashKVResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *HashKVResponse) GetHash() uint32 { + if m != nil { + return m.Hash + } + return 0 +} + +func (m *HashKVResponse) GetCompactRevision() int64 { + if m != nil { + return m.CompactRevision + } + return 0 +} + +type HashResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // hash is the hash value computed from the responding member's KV's backend. + Hash uint32 `protobuf:"varint,2,opt,name=hash,proto3" json:"hash,omitempty"` +} + +func (m *HashResponse) Reset() { *m = HashResponse{} } +func (m *HashResponse) String() string { return proto.CompactTextString(m) } +func (*HashResponse) ProtoMessage() {} +func (*HashResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{17} } + +func (m *HashResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *HashResponse) GetHash() uint32 { + if m != nil { + return m.Hash + } + return 0 +} + +type SnapshotRequest struct { +} + +func (m *SnapshotRequest) Reset() { *m = SnapshotRequest{} } +func (m *SnapshotRequest) String() string { return proto.CompactTextString(m) } +func (*SnapshotRequest) ProtoMessage() {} +func (*SnapshotRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{18} } + +type SnapshotResponse struct { + // header has the current key-value store information. The first header in the snapshot + // stream indicates the point in time of the snapshot. + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // remaining_bytes is the number of blob bytes to be sent after this message + RemainingBytes uint64 `protobuf:"varint,2,opt,name=remaining_bytes,json=remainingBytes,proto3" json:"remaining_bytes,omitempty"` + // blob contains the next chunk of the snapshot in the snapshot stream. + Blob []byte `protobuf:"bytes,3,opt,name=blob,proto3" json:"blob,omitempty"` +} + +func (m *SnapshotResponse) Reset() { *m = SnapshotResponse{} } +func (m *SnapshotResponse) String() string { return proto.CompactTextString(m) } +func (*SnapshotResponse) ProtoMessage() {} +func (*SnapshotResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{19} } + +func (m *SnapshotResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *SnapshotResponse) GetRemainingBytes() uint64 { + if m != nil { + return m.RemainingBytes + } + return 0 +} + +func (m *SnapshotResponse) GetBlob() []byte { + if m != nil { + return m.Blob + } + return nil +} + +type WatchRequest struct { + // request_union is a request to either create a new watcher or cancel an existing watcher. + // + // Types that are valid to be assigned to RequestUnion: + // *WatchRequest_CreateRequest + // *WatchRequest_CancelRequest + // *WatchRequest_ProgressRequest + RequestUnion isWatchRequest_RequestUnion `protobuf_oneof:"request_union"` +} + +func (m *WatchRequest) Reset() { *m = WatchRequest{} } +func (m *WatchRequest) String() string { return proto.CompactTextString(m) } +func (*WatchRequest) ProtoMessage() {} +func (*WatchRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{20} } + +type isWatchRequest_RequestUnion interface { + isWatchRequest_RequestUnion() + MarshalTo([]byte) (int, error) + Size() int +} + +type WatchRequest_CreateRequest struct { + CreateRequest *WatchCreateRequest `protobuf:"bytes,1,opt,name=create_request,json=createRequest,oneof"` +} +type WatchRequest_CancelRequest struct { + CancelRequest *WatchCancelRequest `protobuf:"bytes,2,opt,name=cancel_request,json=cancelRequest,oneof"` +} +type WatchRequest_ProgressRequest struct { + ProgressRequest *WatchProgressRequest `protobuf:"bytes,3,opt,name=progress_request,json=progressRequest,oneof"` +} + +func (*WatchRequest_CreateRequest) isWatchRequest_RequestUnion() {} +func (*WatchRequest_CancelRequest) isWatchRequest_RequestUnion() {} +func (*WatchRequest_ProgressRequest) isWatchRequest_RequestUnion() {} + +func (m *WatchRequest) GetRequestUnion() isWatchRequest_RequestUnion { + if m != nil { + return m.RequestUnion + } + return nil +} + +func (m *WatchRequest) GetCreateRequest() *WatchCreateRequest { + if x, ok := m.GetRequestUnion().(*WatchRequest_CreateRequest); ok { + return x.CreateRequest + } + return nil +} + +func (m *WatchRequest) GetCancelRequest() *WatchCancelRequest { + if x, ok := m.GetRequestUnion().(*WatchRequest_CancelRequest); ok { + return x.CancelRequest + } + return nil +} + +func (m *WatchRequest) GetProgressRequest() *WatchProgressRequest { + if x, ok := m.GetRequestUnion().(*WatchRequest_ProgressRequest); ok { + return x.ProgressRequest + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*WatchRequest) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _WatchRequest_OneofMarshaler, _WatchRequest_OneofUnmarshaler, _WatchRequest_OneofSizer, []interface{}{ + (*WatchRequest_CreateRequest)(nil), + (*WatchRequest_CancelRequest)(nil), + (*WatchRequest_ProgressRequest)(nil), + } +} + +func _WatchRequest_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*WatchRequest) + // request_union + switch x := m.RequestUnion.(type) { + case *WatchRequest_CreateRequest: + _ = b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.CreateRequest); err != nil { + return err + } + case *WatchRequest_CancelRequest: + _ = b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.CancelRequest); err != nil { + return err + } + case *WatchRequest_ProgressRequest: + _ = b.EncodeVarint(3<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ProgressRequest); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("WatchRequest.RequestUnion has unexpected type %T", x) + } + return nil +} + +func _WatchRequest_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*WatchRequest) + switch tag { + case 1: // request_union.create_request + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(WatchCreateRequest) + err := b.DecodeMessage(msg) + m.RequestUnion = &WatchRequest_CreateRequest{msg} + return true, err + case 2: // request_union.cancel_request + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(WatchCancelRequest) + err := b.DecodeMessage(msg) + m.RequestUnion = &WatchRequest_CancelRequest{msg} + return true, err + case 3: // request_union.progress_request + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(WatchProgressRequest) + err := b.DecodeMessage(msg) + m.RequestUnion = &WatchRequest_ProgressRequest{msg} + return true, err + default: + return false, nil + } +} + +func _WatchRequest_OneofSizer(msg proto.Message) (n int) { + m := msg.(*WatchRequest) + // request_union + switch x := m.RequestUnion.(type) { + case *WatchRequest_CreateRequest: + s := proto.Size(x.CreateRequest) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *WatchRequest_CancelRequest: + s := proto.Size(x.CancelRequest) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *WatchRequest_ProgressRequest: + s := proto.Size(x.ProgressRequest) + n += proto.SizeVarint(3<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type WatchCreateRequest struct { + // key is the key to register for watching. + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // range_end is the end of the range [key, range_end) to watch. If range_end is not given, + // only the key argument is watched. If range_end is equal to '\0', all keys greater than + // or equal to the key argument are watched. + // If the range_end is one bit larger than the given key, + // then all keys with the prefix (the given key) will be watched. + RangeEnd []byte `protobuf:"bytes,2,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"` + // start_revision is an optional revision to watch from (inclusive). No start_revision is "now". + StartRevision int64 `protobuf:"varint,3,opt,name=start_revision,json=startRevision,proto3" json:"start_revision,omitempty"` + // progress_notify is set so that the etcd server will periodically send a WatchResponse with + // no events to the new watcher if there are no recent events. It is useful when clients + // wish to recover a disconnected watcher starting from a recent known revision. + // The etcd server may decide how often it will send notifications based on current load. + ProgressNotify bool `protobuf:"varint,4,opt,name=progress_notify,json=progressNotify,proto3" json:"progress_notify,omitempty"` + // filters filter the events at server side before it sends back to the watcher. + Filters []WatchCreateRequest_FilterType `protobuf:"varint,5,rep,packed,name=filters,enum=etcdserverpb.WatchCreateRequest_FilterType" json:"filters,omitempty"` + // If prev_kv is set, created watcher gets the previous KV before the event happens. + // If the previous KV is already compacted, nothing will be returned. + PrevKv bool `protobuf:"varint,6,opt,name=prev_kv,json=prevKv,proto3" json:"prev_kv,omitempty"` + // If watch_id is provided and non-zero, it will be assigned to this watcher. + // Since creating a watcher in etcd is not a synchronous operation, + // this can be used ensure that ordering is correct when creating multiple + // watchers on the same stream. Creating a watcher with an ID already in + // use on the stream will cause an error to be returned. + WatchId int64 `protobuf:"varint,7,opt,name=watch_id,json=watchId,proto3" json:"watch_id,omitempty"` + // fragment enables splitting large revisions into multiple watch responses. + Fragment bool `protobuf:"varint,8,opt,name=fragment,proto3" json:"fragment,omitempty"` +} + +func (m *WatchCreateRequest) Reset() { *m = WatchCreateRequest{} } +func (m *WatchCreateRequest) String() string { return proto.CompactTextString(m) } +func (*WatchCreateRequest) ProtoMessage() {} +func (*WatchCreateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{21} } + +func (m *WatchCreateRequest) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *WatchCreateRequest) GetRangeEnd() []byte { + if m != nil { + return m.RangeEnd + } + return nil +} + +func (m *WatchCreateRequest) GetStartRevision() int64 { + if m != nil { + return m.StartRevision + } + return 0 +} + +func (m *WatchCreateRequest) GetProgressNotify() bool { + if m != nil { + return m.ProgressNotify + } + return false +} + +func (m *WatchCreateRequest) GetFilters() []WatchCreateRequest_FilterType { + if m != nil { + return m.Filters + } + return nil +} + +func (m *WatchCreateRequest) GetPrevKv() bool { + if m != nil { + return m.PrevKv + } + return false +} + +func (m *WatchCreateRequest) GetWatchId() int64 { + if m != nil { + return m.WatchId + } + return 0 +} + +func (m *WatchCreateRequest) GetFragment() bool { + if m != nil { + return m.Fragment + } + return false +} + +type WatchCancelRequest struct { + // watch_id is the watcher id to cancel so that no more events are transmitted. + WatchId int64 `protobuf:"varint,1,opt,name=watch_id,json=watchId,proto3" json:"watch_id,omitempty"` +} + +func (m *WatchCancelRequest) Reset() { *m = WatchCancelRequest{} } +func (m *WatchCancelRequest) String() string { return proto.CompactTextString(m) } +func (*WatchCancelRequest) ProtoMessage() {} +func (*WatchCancelRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{22} } + +func (m *WatchCancelRequest) GetWatchId() int64 { + if m != nil { + return m.WatchId + } + return 0 +} + +// Requests the a watch stream progress status be sent in the watch response stream as soon as +// possible. +type WatchProgressRequest struct { +} + +func (m *WatchProgressRequest) Reset() { *m = WatchProgressRequest{} } +func (m *WatchProgressRequest) String() string { return proto.CompactTextString(m) } +func (*WatchProgressRequest) ProtoMessage() {} +func (*WatchProgressRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{23} } + +type WatchResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // watch_id is the ID of the watcher that corresponds to the response. + WatchId int64 `protobuf:"varint,2,opt,name=watch_id,json=watchId,proto3" json:"watch_id,omitempty"` + // created is set to true if the response is for a create watch request. + // The client should record the watch_id and expect to receive events for + // the created watcher from the same stream. + // All events sent to the created watcher will attach with the same watch_id. + Created bool `protobuf:"varint,3,opt,name=created,proto3" json:"created,omitempty"` + // canceled is set to true if the response is for a cancel watch request. + // No further events will be sent to the canceled watcher. + Canceled bool `protobuf:"varint,4,opt,name=canceled,proto3" json:"canceled,omitempty"` + // compact_revision is set to the minimum index if a watcher tries to watch + // at a compacted index. + // + // This happens when creating a watcher at a compacted revision or the watcher cannot + // catch up with the progress of the key-value store. + // + // The client should treat the watcher as canceled and should not try to create any + // watcher with the same start_revision again. + CompactRevision int64 `protobuf:"varint,5,opt,name=compact_revision,json=compactRevision,proto3" json:"compact_revision,omitempty"` + // cancel_reason indicates the reason for canceling the watcher. + CancelReason string `protobuf:"bytes,6,opt,name=cancel_reason,json=cancelReason,proto3" json:"cancel_reason,omitempty"` + // framgment is true if large watch response was split over multiple responses. + Fragment bool `protobuf:"varint,7,opt,name=fragment,proto3" json:"fragment,omitempty"` + Events []*mvccpb.Event `protobuf:"bytes,11,rep,name=events" json:"events,omitempty"` +} + +func (m *WatchResponse) Reset() { *m = WatchResponse{} } +func (m *WatchResponse) String() string { return proto.CompactTextString(m) } +func (*WatchResponse) ProtoMessage() {} +func (*WatchResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{24} } + +func (m *WatchResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *WatchResponse) GetWatchId() int64 { + if m != nil { + return m.WatchId + } + return 0 +} + +func (m *WatchResponse) GetCreated() bool { + if m != nil { + return m.Created + } + return false +} + +func (m *WatchResponse) GetCanceled() bool { + if m != nil { + return m.Canceled + } + return false +} + +func (m *WatchResponse) GetCompactRevision() int64 { + if m != nil { + return m.CompactRevision + } + return 0 +} + +func (m *WatchResponse) GetCancelReason() string { + if m != nil { + return m.CancelReason + } + return "" +} + +func (m *WatchResponse) GetFragment() bool { + if m != nil { + return m.Fragment + } + return false +} + +func (m *WatchResponse) GetEvents() []*mvccpb.Event { + if m != nil { + return m.Events + } + return nil +} + +type LeaseGrantRequest struct { + // TTL is the advisory time-to-live in seconds. Expired lease will return -1. + TTL int64 `protobuf:"varint,1,opt,name=TTL,proto3" json:"TTL,omitempty"` + // ID is the requested ID for the lease. If ID is set to 0, the lessor chooses an ID. + ID int64 `protobuf:"varint,2,opt,name=ID,proto3" json:"ID,omitempty"` +} + +func (m *LeaseGrantRequest) Reset() { *m = LeaseGrantRequest{} } +func (m *LeaseGrantRequest) String() string { return proto.CompactTextString(m) } +func (*LeaseGrantRequest) ProtoMessage() {} +func (*LeaseGrantRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{25} } + +func (m *LeaseGrantRequest) GetTTL() int64 { + if m != nil { + return m.TTL + } + return 0 +} + +func (m *LeaseGrantRequest) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +type LeaseGrantResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // ID is the lease ID for the granted lease. + ID int64 `protobuf:"varint,2,opt,name=ID,proto3" json:"ID,omitempty"` + // TTL is the server chosen lease time-to-live in seconds. + TTL int64 `protobuf:"varint,3,opt,name=TTL,proto3" json:"TTL,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *LeaseGrantResponse) Reset() { *m = LeaseGrantResponse{} } +func (m *LeaseGrantResponse) String() string { return proto.CompactTextString(m) } +func (*LeaseGrantResponse) ProtoMessage() {} +func (*LeaseGrantResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{26} } + +func (m *LeaseGrantResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *LeaseGrantResponse) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +func (m *LeaseGrantResponse) GetTTL() int64 { + if m != nil { + return m.TTL + } + return 0 +} + +func (m *LeaseGrantResponse) GetError() string { + if m != nil { + return m.Error + } + return "" +} + +type LeaseRevokeRequest struct { + // ID is the lease ID to revoke. When the ID is revoked, all associated keys will be deleted. + ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` +} + +func (m *LeaseRevokeRequest) Reset() { *m = LeaseRevokeRequest{} } +func (m *LeaseRevokeRequest) String() string { return proto.CompactTextString(m) } +func (*LeaseRevokeRequest) ProtoMessage() {} +func (*LeaseRevokeRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{27} } + +func (m *LeaseRevokeRequest) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +type LeaseRevokeResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *LeaseRevokeResponse) Reset() { *m = LeaseRevokeResponse{} } +func (m *LeaseRevokeResponse) String() string { return proto.CompactTextString(m) } +func (*LeaseRevokeResponse) ProtoMessage() {} +func (*LeaseRevokeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{28} } + +func (m *LeaseRevokeResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type LeaseCheckpoint struct { + // ID is the lease ID to checkpoint. + ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + // Remaining_TTL is the remaining time until expiry of the lease. + Remaining_TTL int64 `protobuf:"varint,2,opt,name=remaining_TTL,json=remainingTTL,proto3" json:"remaining_TTL,omitempty"` +} + +func (m *LeaseCheckpoint) Reset() { *m = LeaseCheckpoint{} } +func (m *LeaseCheckpoint) String() string { return proto.CompactTextString(m) } +func (*LeaseCheckpoint) ProtoMessage() {} +func (*LeaseCheckpoint) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{29} } + +func (m *LeaseCheckpoint) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +func (m *LeaseCheckpoint) GetRemaining_TTL() int64 { + if m != nil { + return m.Remaining_TTL + } + return 0 +} + +type LeaseCheckpointRequest struct { + Checkpoints []*LeaseCheckpoint `protobuf:"bytes,1,rep,name=checkpoints" json:"checkpoints,omitempty"` +} + +func (m *LeaseCheckpointRequest) Reset() { *m = LeaseCheckpointRequest{} } +func (m *LeaseCheckpointRequest) String() string { return proto.CompactTextString(m) } +func (*LeaseCheckpointRequest) ProtoMessage() {} +func (*LeaseCheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{30} } + +func (m *LeaseCheckpointRequest) GetCheckpoints() []*LeaseCheckpoint { + if m != nil { + return m.Checkpoints + } + return nil +} + +type LeaseCheckpointResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *LeaseCheckpointResponse) Reset() { *m = LeaseCheckpointResponse{} } +func (m *LeaseCheckpointResponse) String() string { return proto.CompactTextString(m) } +func (*LeaseCheckpointResponse) ProtoMessage() {} +func (*LeaseCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{31} } + +func (m *LeaseCheckpointResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type LeaseKeepAliveRequest struct { + // ID is the lease ID for the lease to keep alive. + ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` +} + +func (m *LeaseKeepAliveRequest) Reset() { *m = LeaseKeepAliveRequest{} } +func (m *LeaseKeepAliveRequest) String() string { return proto.CompactTextString(m) } +func (*LeaseKeepAliveRequest) ProtoMessage() {} +func (*LeaseKeepAliveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{32} } + +func (m *LeaseKeepAliveRequest) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +type LeaseKeepAliveResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // ID is the lease ID from the keep alive request. + ID int64 `protobuf:"varint,2,opt,name=ID,proto3" json:"ID,omitempty"` + // TTL is the new time-to-live for the lease. + TTL int64 `protobuf:"varint,3,opt,name=TTL,proto3" json:"TTL,omitempty"` +} + +func (m *LeaseKeepAliveResponse) Reset() { *m = LeaseKeepAliveResponse{} } +func (m *LeaseKeepAliveResponse) String() string { return proto.CompactTextString(m) } +func (*LeaseKeepAliveResponse) ProtoMessage() {} +func (*LeaseKeepAliveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{33} } + +func (m *LeaseKeepAliveResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *LeaseKeepAliveResponse) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +func (m *LeaseKeepAliveResponse) GetTTL() int64 { + if m != nil { + return m.TTL + } + return 0 +} + +type LeaseTimeToLiveRequest struct { + // ID is the lease ID for the lease. + ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + // keys is true to query all the keys attached to this lease. + Keys bool `protobuf:"varint,2,opt,name=keys,proto3" json:"keys,omitempty"` +} + +func (m *LeaseTimeToLiveRequest) Reset() { *m = LeaseTimeToLiveRequest{} } +func (m *LeaseTimeToLiveRequest) String() string { return proto.CompactTextString(m) } +func (*LeaseTimeToLiveRequest) ProtoMessage() {} +func (*LeaseTimeToLiveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{34} } + +func (m *LeaseTimeToLiveRequest) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +func (m *LeaseTimeToLiveRequest) GetKeys() bool { + if m != nil { + return m.Keys + } + return false +} + +type LeaseTimeToLiveResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // ID is the lease ID from the keep alive request. + ID int64 `protobuf:"varint,2,opt,name=ID,proto3" json:"ID,omitempty"` + // TTL is the remaining TTL in seconds for the lease; the lease will expire in under TTL+1 seconds. + TTL int64 `protobuf:"varint,3,opt,name=TTL,proto3" json:"TTL,omitempty"` + // GrantedTTL is the initial granted time in seconds upon lease creation/renewal. + GrantedTTL int64 `protobuf:"varint,4,opt,name=grantedTTL,proto3" json:"grantedTTL,omitempty"` + // Keys is the list of keys attached to this lease. + Keys [][]byte `protobuf:"bytes,5,rep,name=keys" json:"keys,omitempty"` +} + +func (m *LeaseTimeToLiveResponse) Reset() { *m = LeaseTimeToLiveResponse{} } +func (m *LeaseTimeToLiveResponse) String() string { return proto.CompactTextString(m) } +func (*LeaseTimeToLiveResponse) ProtoMessage() {} +func (*LeaseTimeToLiveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{35} } + +func (m *LeaseTimeToLiveResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *LeaseTimeToLiveResponse) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +func (m *LeaseTimeToLiveResponse) GetTTL() int64 { + if m != nil { + return m.TTL + } + return 0 +} + +func (m *LeaseTimeToLiveResponse) GetGrantedTTL() int64 { + if m != nil { + return m.GrantedTTL + } + return 0 +} + +func (m *LeaseTimeToLiveResponse) GetKeys() [][]byte { + if m != nil { + return m.Keys + } + return nil +} + +type LeaseLeasesRequest struct { +} + +func (m *LeaseLeasesRequest) Reset() { *m = LeaseLeasesRequest{} } +func (m *LeaseLeasesRequest) String() string { return proto.CompactTextString(m) } +func (*LeaseLeasesRequest) ProtoMessage() {} +func (*LeaseLeasesRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{36} } + +type LeaseStatus struct { + ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` +} + +func (m *LeaseStatus) Reset() { *m = LeaseStatus{} } +func (m *LeaseStatus) String() string { return proto.CompactTextString(m) } +func (*LeaseStatus) ProtoMessage() {} +func (*LeaseStatus) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{37} } + +func (m *LeaseStatus) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +type LeaseLeasesResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + Leases []*LeaseStatus `protobuf:"bytes,2,rep,name=leases" json:"leases,omitempty"` +} + +func (m *LeaseLeasesResponse) Reset() { *m = LeaseLeasesResponse{} } +func (m *LeaseLeasesResponse) String() string { return proto.CompactTextString(m) } +func (*LeaseLeasesResponse) ProtoMessage() {} +func (*LeaseLeasesResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{38} } + +func (m *LeaseLeasesResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *LeaseLeasesResponse) GetLeases() []*LeaseStatus { + if m != nil { + return m.Leases + } + return nil +} + +type Member struct { + // ID is the member ID for this member. + ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + // name is the human-readable name of the member. If the member is not started, the name will be an empty string. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // peerURLs is the list of URLs the member exposes to the cluster for communication. + PeerURLs []string `protobuf:"bytes,3,rep,name=peerURLs" json:"peerURLs,omitempty"` + // clientURLs is the list of URLs the member exposes to clients for communication. If the member is not started, clientURLs will be empty. + ClientURLs []string `protobuf:"bytes,4,rep,name=clientURLs" json:"clientURLs,omitempty"` + // isLearner indicates if the member is raft learner. + IsLearner bool `protobuf:"varint,5,opt,name=isLearner,proto3" json:"isLearner,omitempty"` +} + +func (m *Member) Reset() { *m = Member{} } +func (m *Member) String() string { return proto.CompactTextString(m) } +func (*Member) ProtoMessage() {} +func (*Member) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{39} } + +func (m *Member) GetID() uint64 { + if m != nil { + return m.ID + } + return 0 +} + +func (m *Member) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Member) GetPeerURLs() []string { + if m != nil { + return m.PeerURLs + } + return nil +} + +func (m *Member) GetClientURLs() []string { + if m != nil { + return m.ClientURLs + } + return nil +} + +func (m *Member) GetIsLearner() bool { + if m != nil { + return m.IsLearner + } + return false +} + +type MemberAddRequest struct { + // peerURLs is the list of URLs the added member will use to communicate with the cluster. + PeerURLs []string `protobuf:"bytes,1,rep,name=peerURLs" json:"peerURLs,omitempty"` + // isLearner indicates if the added member is raft learner. + IsLearner bool `protobuf:"varint,2,opt,name=isLearner,proto3" json:"isLearner,omitempty"` +} + +func (m *MemberAddRequest) Reset() { *m = MemberAddRequest{} } +func (m *MemberAddRequest) String() string { return proto.CompactTextString(m) } +func (*MemberAddRequest) ProtoMessage() {} +func (*MemberAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{40} } + +func (m *MemberAddRequest) GetPeerURLs() []string { + if m != nil { + return m.PeerURLs + } + return nil +} + +func (m *MemberAddRequest) GetIsLearner() bool { + if m != nil { + return m.IsLearner + } + return false +} + +type MemberAddResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // member is the member information for the added member. + Member *Member `protobuf:"bytes,2,opt,name=member" json:"member,omitempty"` + // members is a list of all members after adding the new member. + Members []*Member `protobuf:"bytes,3,rep,name=members" json:"members,omitempty"` +} + +func (m *MemberAddResponse) Reset() { *m = MemberAddResponse{} } +func (m *MemberAddResponse) String() string { return proto.CompactTextString(m) } +func (*MemberAddResponse) ProtoMessage() {} +func (*MemberAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{41} } + +func (m *MemberAddResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *MemberAddResponse) GetMember() *Member { + if m != nil { + return m.Member + } + return nil +} + +func (m *MemberAddResponse) GetMembers() []*Member { + if m != nil { + return m.Members + } + return nil +} + +type MemberRemoveRequest struct { + // ID is the member ID of the member to remove. + ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` +} + +func (m *MemberRemoveRequest) Reset() { *m = MemberRemoveRequest{} } +func (m *MemberRemoveRequest) String() string { return proto.CompactTextString(m) } +func (*MemberRemoveRequest) ProtoMessage() {} +func (*MemberRemoveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{42} } + +func (m *MemberRemoveRequest) GetID() uint64 { + if m != nil { + return m.ID + } + return 0 +} + +type MemberRemoveResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // members is a list of all members after removing the member. + Members []*Member `protobuf:"bytes,2,rep,name=members" json:"members,omitempty"` +} + +func (m *MemberRemoveResponse) Reset() { *m = MemberRemoveResponse{} } +func (m *MemberRemoveResponse) String() string { return proto.CompactTextString(m) } +func (*MemberRemoveResponse) ProtoMessage() {} +func (*MemberRemoveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{43} } + +func (m *MemberRemoveResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *MemberRemoveResponse) GetMembers() []*Member { + if m != nil { + return m.Members + } + return nil +} + +type MemberUpdateRequest struct { + // ID is the member ID of the member to update. + ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + // peerURLs is the new list of URLs the member will use to communicate with the cluster. + PeerURLs []string `protobuf:"bytes,2,rep,name=peerURLs" json:"peerURLs,omitempty"` +} + +func (m *MemberUpdateRequest) Reset() { *m = MemberUpdateRequest{} } +func (m *MemberUpdateRequest) String() string { return proto.CompactTextString(m) } +func (*MemberUpdateRequest) ProtoMessage() {} +func (*MemberUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{44} } + +func (m *MemberUpdateRequest) GetID() uint64 { + if m != nil { + return m.ID + } + return 0 +} + +func (m *MemberUpdateRequest) GetPeerURLs() []string { + if m != nil { + return m.PeerURLs + } + return nil +} + +type MemberUpdateResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // members is a list of all members after updating the member. + Members []*Member `protobuf:"bytes,2,rep,name=members" json:"members,omitempty"` +} + +func (m *MemberUpdateResponse) Reset() { *m = MemberUpdateResponse{} } +func (m *MemberUpdateResponse) String() string { return proto.CompactTextString(m) } +func (*MemberUpdateResponse) ProtoMessage() {} +func (*MemberUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{45} } + +func (m *MemberUpdateResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *MemberUpdateResponse) GetMembers() []*Member { + if m != nil { + return m.Members + } + return nil +} + +type MemberListRequest struct { +} + +func (m *MemberListRequest) Reset() { *m = MemberListRequest{} } +func (m *MemberListRequest) String() string { return proto.CompactTextString(m) } +func (*MemberListRequest) ProtoMessage() {} +func (*MemberListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{46} } + +type MemberListResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // members is a list of all members associated with the cluster. + Members []*Member `protobuf:"bytes,2,rep,name=members" json:"members,omitempty"` +} + +func (m *MemberListResponse) Reset() { *m = MemberListResponse{} } +func (m *MemberListResponse) String() string { return proto.CompactTextString(m) } +func (*MemberListResponse) ProtoMessage() {} +func (*MemberListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{47} } + +func (m *MemberListResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *MemberListResponse) GetMembers() []*Member { + if m != nil { + return m.Members + } + return nil +} + +type MemberPromoteRequest struct { + // ID is the member ID of the member to promote. + ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` +} + +func (m *MemberPromoteRequest) Reset() { *m = MemberPromoteRequest{} } +func (m *MemberPromoteRequest) String() string { return proto.CompactTextString(m) } +func (*MemberPromoteRequest) ProtoMessage() {} +func (*MemberPromoteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{48} } + +func (m *MemberPromoteRequest) GetID() uint64 { + if m != nil { + return m.ID + } + return 0 +} + +type MemberPromoteResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // members is a list of all members after promoting the member. + Members []*Member `protobuf:"bytes,2,rep,name=members" json:"members,omitempty"` +} + +func (m *MemberPromoteResponse) Reset() { *m = MemberPromoteResponse{} } +func (m *MemberPromoteResponse) String() string { return proto.CompactTextString(m) } +func (*MemberPromoteResponse) ProtoMessage() {} +func (*MemberPromoteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{49} } + +func (m *MemberPromoteResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *MemberPromoteResponse) GetMembers() []*Member { + if m != nil { + return m.Members + } + return nil +} + +type DefragmentRequest struct { +} + +func (m *DefragmentRequest) Reset() { *m = DefragmentRequest{} } +func (m *DefragmentRequest) String() string { return proto.CompactTextString(m) } +func (*DefragmentRequest) ProtoMessage() {} +func (*DefragmentRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{50} } + +type DefragmentResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *DefragmentResponse) Reset() { *m = DefragmentResponse{} } +func (m *DefragmentResponse) String() string { return proto.CompactTextString(m) } +func (*DefragmentResponse) ProtoMessage() {} +func (*DefragmentResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{51} } + +func (m *DefragmentResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type MoveLeaderRequest struct { + // targetID is the node ID for the new leader. + TargetID uint64 `protobuf:"varint,1,opt,name=targetID,proto3" json:"targetID,omitempty"` +} + +func (m *MoveLeaderRequest) Reset() { *m = MoveLeaderRequest{} } +func (m *MoveLeaderRequest) String() string { return proto.CompactTextString(m) } +func (*MoveLeaderRequest) ProtoMessage() {} +func (*MoveLeaderRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{52} } + +func (m *MoveLeaderRequest) GetTargetID() uint64 { + if m != nil { + return m.TargetID + } + return 0 +} + +type MoveLeaderResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *MoveLeaderResponse) Reset() { *m = MoveLeaderResponse{} } +func (m *MoveLeaderResponse) String() string { return proto.CompactTextString(m) } +func (*MoveLeaderResponse) ProtoMessage() {} +func (*MoveLeaderResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{53} } + +func (m *MoveLeaderResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AlarmRequest struct { + // action is the kind of alarm request to issue. The action + // may GET alarm statuses, ACTIVATE an alarm, or DEACTIVATE a + // raised alarm. + Action AlarmRequest_AlarmAction `protobuf:"varint,1,opt,name=action,proto3,enum=etcdserverpb.AlarmRequest_AlarmAction" json:"action,omitempty"` + // memberID is the ID of the member associated with the alarm. If memberID is 0, the + // alarm request covers all members. + MemberID uint64 `protobuf:"varint,2,opt,name=memberID,proto3" json:"memberID,omitempty"` + // alarm is the type of alarm to consider for this request. + Alarm AlarmType `protobuf:"varint,3,opt,name=alarm,proto3,enum=etcdserverpb.AlarmType" json:"alarm,omitempty"` +} + +func (m *AlarmRequest) Reset() { *m = AlarmRequest{} } +func (m *AlarmRequest) String() string { return proto.CompactTextString(m) } +func (*AlarmRequest) ProtoMessage() {} +func (*AlarmRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{54} } + +func (m *AlarmRequest) GetAction() AlarmRequest_AlarmAction { + if m != nil { + return m.Action + } + return AlarmRequest_GET +} + +func (m *AlarmRequest) GetMemberID() uint64 { + if m != nil { + return m.MemberID + } + return 0 +} + +func (m *AlarmRequest) GetAlarm() AlarmType { + if m != nil { + return m.Alarm + } + return AlarmType_NONE +} + +type AlarmMember struct { + // memberID is the ID of the member associated with the raised alarm. + MemberID uint64 `protobuf:"varint,1,opt,name=memberID,proto3" json:"memberID,omitempty"` + // alarm is the type of alarm which has been raised. + Alarm AlarmType `protobuf:"varint,2,opt,name=alarm,proto3,enum=etcdserverpb.AlarmType" json:"alarm,omitempty"` +} + +func (m *AlarmMember) Reset() { *m = AlarmMember{} } +func (m *AlarmMember) String() string { return proto.CompactTextString(m) } +func (*AlarmMember) ProtoMessage() {} +func (*AlarmMember) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{55} } + +func (m *AlarmMember) GetMemberID() uint64 { + if m != nil { + return m.MemberID + } + return 0 +} + +func (m *AlarmMember) GetAlarm() AlarmType { + if m != nil { + return m.Alarm + } + return AlarmType_NONE +} + +type AlarmResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // alarms is a list of alarms associated with the alarm request. + Alarms []*AlarmMember `protobuf:"bytes,2,rep,name=alarms" json:"alarms,omitempty"` +} + +func (m *AlarmResponse) Reset() { *m = AlarmResponse{} } +func (m *AlarmResponse) String() string { return proto.CompactTextString(m) } +func (*AlarmResponse) ProtoMessage() {} +func (*AlarmResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{56} } + +func (m *AlarmResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *AlarmResponse) GetAlarms() []*AlarmMember { + if m != nil { + return m.Alarms + } + return nil +} + +type StatusRequest struct { +} + +func (m *StatusRequest) Reset() { *m = StatusRequest{} } +func (m *StatusRequest) String() string { return proto.CompactTextString(m) } +func (*StatusRequest) ProtoMessage() {} +func (*StatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{57} } + +type StatusResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // version is the cluster protocol version used by the responding member. + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + // dbSize is the size of the backend database physically allocated, in bytes, of the responding member. + DbSize int64 `protobuf:"varint,3,opt,name=dbSize,proto3" json:"dbSize,omitempty"` + // leader is the member ID which the responding member believes is the current leader. + Leader uint64 `protobuf:"varint,4,opt,name=leader,proto3" json:"leader,omitempty"` + // raftIndex is the current raft committed index of the responding member. + RaftIndex uint64 `protobuf:"varint,5,opt,name=raftIndex,proto3" json:"raftIndex,omitempty"` + // raftTerm is the current raft term of the responding member. + RaftTerm uint64 `protobuf:"varint,6,opt,name=raftTerm,proto3" json:"raftTerm,omitempty"` + // raftAppliedIndex is the current raft applied index of the responding member. + RaftAppliedIndex uint64 `protobuf:"varint,7,opt,name=raftAppliedIndex,proto3" json:"raftAppliedIndex,omitempty"` + // errors contains alarm/health information and status. + Errors []string `protobuf:"bytes,8,rep,name=errors" json:"errors,omitempty"` + // dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member. + DbSizeInUse int64 `protobuf:"varint,9,opt,name=dbSizeInUse,proto3" json:"dbSizeInUse,omitempty"` + // isLearner indicates if the member is raft learner. + IsLearner bool `protobuf:"varint,10,opt,name=isLearner,proto3" json:"isLearner,omitempty"` +} + +func (m *StatusResponse) Reset() { *m = StatusResponse{} } +func (m *StatusResponse) String() string { return proto.CompactTextString(m) } +func (*StatusResponse) ProtoMessage() {} +func (*StatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{58} } + +func (m *StatusResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *StatusResponse) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + +func (m *StatusResponse) GetDbSize() int64 { + if m != nil { + return m.DbSize + } + return 0 +} + +func (m *StatusResponse) GetLeader() uint64 { + if m != nil { + return m.Leader + } + return 0 +} + +func (m *StatusResponse) GetRaftIndex() uint64 { + if m != nil { + return m.RaftIndex + } + return 0 +} + +func (m *StatusResponse) GetRaftTerm() uint64 { + if m != nil { + return m.RaftTerm + } + return 0 +} + +func (m *StatusResponse) GetRaftAppliedIndex() uint64 { + if m != nil { + return m.RaftAppliedIndex + } + return 0 +} + +func (m *StatusResponse) GetErrors() []string { + if m != nil { + return m.Errors + } + return nil +} + +func (m *StatusResponse) GetDbSizeInUse() int64 { + if m != nil { + return m.DbSizeInUse + } + return 0 +} + +func (m *StatusResponse) GetIsLearner() bool { + if m != nil { + return m.IsLearner + } + return false +} + +type AuthEnableRequest struct { +} + +func (m *AuthEnableRequest) Reset() { *m = AuthEnableRequest{} } +func (m *AuthEnableRequest) String() string { return proto.CompactTextString(m) } +func (*AuthEnableRequest) ProtoMessage() {} +func (*AuthEnableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{59} } + +type AuthDisableRequest struct { +} + +func (m *AuthDisableRequest) Reset() { *m = AuthDisableRequest{} } +func (m *AuthDisableRequest) String() string { return proto.CompactTextString(m) } +func (*AuthDisableRequest) ProtoMessage() {} +func (*AuthDisableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{60} } + +type AuthenticateRequest struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` +} + +func (m *AuthenticateRequest) Reset() { *m = AuthenticateRequest{} } +func (m *AuthenticateRequest) String() string { return proto.CompactTextString(m) } +func (*AuthenticateRequest) ProtoMessage() {} +func (*AuthenticateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{61} } + +func (m *AuthenticateRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *AuthenticateRequest) GetPassword() string { + if m != nil { + return m.Password + } + return "" +} + +type AuthUserAddRequest struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + Options *authpb.UserAddOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` +} + +func (m *AuthUserAddRequest) Reset() { *m = AuthUserAddRequest{} } +func (m *AuthUserAddRequest) String() string { return proto.CompactTextString(m) } +func (*AuthUserAddRequest) ProtoMessage() {} +func (*AuthUserAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{62} } + +func (m *AuthUserAddRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *AuthUserAddRequest) GetPassword() string { + if m != nil { + return m.Password + } + return "" +} + +func (m *AuthUserAddRequest) GetOptions() *authpb.UserAddOptions { + if m != nil { + return m.Options + } + return nil +} + +type AuthUserGetRequest struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (m *AuthUserGetRequest) Reset() { *m = AuthUserGetRequest{} } +func (m *AuthUserGetRequest) String() string { return proto.CompactTextString(m) } +func (*AuthUserGetRequest) ProtoMessage() {} +func (*AuthUserGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{63} } + +func (m *AuthUserGetRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +type AuthUserDeleteRequest struct { + // name is the name of the user to delete. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (m *AuthUserDeleteRequest) Reset() { *m = AuthUserDeleteRequest{} } +func (m *AuthUserDeleteRequest) String() string { return proto.CompactTextString(m) } +func (*AuthUserDeleteRequest) ProtoMessage() {} +func (*AuthUserDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{64} } + +func (m *AuthUserDeleteRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +type AuthUserChangePasswordRequest struct { + // name is the name of the user whose password is being changed. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // password is the new password for the user. + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` +} + +func (m *AuthUserChangePasswordRequest) Reset() { *m = AuthUserChangePasswordRequest{} } +func (m *AuthUserChangePasswordRequest) String() string { return proto.CompactTextString(m) } +func (*AuthUserChangePasswordRequest) ProtoMessage() {} +func (*AuthUserChangePasswordRequest) Descriptor() ([]byte, []int) { + return fileDescriptorRpc, []int{65} +} + +func (m *AuthUserChangePasswordRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *AuthUserChangePasswordRequest) GetPassword() string { + if m != nil { + return m.Password + } + return "" +} + +type AuthUserGrantRoleRequest struct { + // user is the name of the user which should be granted a given role. + User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + // role is the name of the role to grant to the user. + Role string `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` +} + +func (m *AuthUserGrantRoleRequest) Reset() { *m = AuthUserGrantRoleRequest{} } +func (m *AuthUserGrantRoleRequest) String() string { return proto.CompactTextString(m) } +func (*AuthUserGrantRoleRequest) ProtoMessage() {} +func (*AuthUserGrantRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{66} } + +func (m *AuthUserGrantRoleRequest) GetUser() string { + if m != nil { + return m.User + } + return "" +} + +func (m *AuthUserGrantRoleRequest) GetRole() string { + if m != nil { + return m.Role + } + return "" +} + +type AuthUserRevokeRoleRequest struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Role string `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` +} + +func (m *AuthUserRevokeRoleRequest) Reset() { *m = AuthUserRevokeRoleRequest{} } +func (m *AuthUserRevokeRoleRequest) String() string { return proto.CompactTextString(m) } +func (*AuthUserRevokeRoleRequest) ProtoMessage() {} +func (*AuthUserRevokeRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{67} } + +func (m *AuthUserRevokeRoleRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *AuthUserRevokeRoleRequest) GetRole() string { + if m != nil { + return m.Role + } + return "" +} + +type AuthRoleAddRequest struct { + // name is the name of the role to add to the authentication system. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (m *AuthRoleAddRequest) Reset() { *m = AuthRoleAddRequest{} } +func (m *AuthRoleAddRequest) String() string { return proto.CompactTextString(m) } +func (*AuthRoleAddRequest) ProtoMessage() {} +func (*AuthRoleAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{68} } + +func (m *AuthRoleAddRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +type AuthRoleGetRequest struct { + Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` +} + +func (m *AuthRoleGetRequest) Reset() { *m = AuthRoleGetRequest{} } +func (m *AuthRoleGetRequest) String() string { return proto.CompactTextString(m) } +func (*AuthRoleGetRequest) ProtoMessage() {} +func (*AuthRoleGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{69} } + +func (m *AuthRoleGetRequest) GetRole() string { + if m != nil { + return m.Role + } + return "" +} + +type AuthUserListRequest struct { +} + +func (m *AuthUserListRequest) Reset() { *m = AuthUserListRequest{} } +func (m *AuthUserListRequest) String() string { return proto.CompactTextString(m) } +func (*AuthUserListRequest) ProtoMessage() {} +func (*AuthUserListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{70} } + +type AuthRoleListRequest struct { +} + +func (m *AuthRoleListRequest) Reset() { *m = AuthRoleListRequest{} } +func (m *AuthRoleListRequest) String() string { return proto.CompactTextString(m) } +func (*AuthRoleListRequest) ProtoMessage() {} +func (*AuthRoleListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{71} } + +type AuthRoleDeleteRequest struct { + Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` +} + +func (m *AuthRoleDeleteRequest) Reset() { *m = AuthRoleDeleteRequest{} } +func (m *AuthRoleDeleteRequest) String() string { return proto.CompactTextString(m) } +func (*AuthRoleDeleteRequest) ProtoMessage() {} +func (*AuthRoleDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{72} } + +func (m *AuthRoleDeleteRequest) GetRole() string { + if m != nil { + return m.Role + } + return "" +} + +type AuthRoleGrantPermissionRequest struct { + // name is the name of the role which will be granted the permission. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // perm is the permission to grant to the role. + Perm *authpb.Permission `protobuf:"bytes,2,opt,name=perm" json:"perm,omitempty"` +} + +func (m *AuthRoleGrantPermissionRequest) Reset() { *m = AuthRoleGrantPermissionRequest{} } +func (m *AuthRoleGrantPermissionRequest) String() string { return proto.CompactTextString(m) } +func (*AuthRoleGrantPermissionRequest) ProtoMessage() {} +func (*AuthRoleGrantPermissionRequest) Descriptor() ([]byte, []int) { + return fileDescriptorRpc, []int{73} +} + +func (m *AuthRoleGrantPermissionRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *AuthRoleGrantPermissionRequest) GetPerm() *authpb.Permission { + if m != nil { + return m.Perm + } + return nil +} + +type AuthRoleRevokePermissionRequest struct { + Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + RangeEnd []byte `protobuf:"bytes,3,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"` +} + +func (m *AuthRoleRevokePermissionRequest) Reset() { *m = AuthRoleRevokePermissionRequest{} } +func (m *AuthRoleRevokePermissionRequest) String() string { return proto.CompactTextString(m) } +func (*AuthRoleRevokePermissionRequest) ProtoMessage() {} +func (*AuthRoleRevokePermissionRequest) Descriptor() ([]byte, []int) { + return fileDescriptorRpc, []int{74} +} + +func (m *AuthRoleRevokePermissionRequest) GetRole() string { + if m != nil { + return m.Role + } + return "" +} + +func (m *AuthRoleRevokePermissionRequest) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *AuthRoleRevokePermissionRequest) GetRangeEnd() []byte { + if m != nil { + return m.RangeEnd + } + return nil +} + +type AuthEnableResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthEnableResponse) Reset() { *m = AuthEnableResponse{} } +func (m *AuthEnableResponse) String() string { return proto.CompactTextString(m) } +func (*AuthEnableResponse) ProtoMessage() {} +func (*AuthEnableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{75} } + +func (m *AuthEnableResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AuthDisableResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthDisableResponse) Reset() { *m = AuthDisableResponse{} } +func (m *AuthDisableResponse) String() string { return proto.CompactTextString(m) } +func (*AuthDisableResponse) ProtoMessage() {} +func (*AuthDisableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{76} } + +func (m *AuthDisableResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AuthenticateResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // token is an authorized token that can be used in succeeding RPCs + Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` +} + +func (m *AuthenticateResponse) Reset() { *m = AuthenticateResponse{} } +func (m *AuthenticateResponse) String() string { return proto.CompactTextString(m) } +func (*AuthenticateResponse) ProtoMessage() {} +func (*AuthenticateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{77} } + +func (m *AuthenticateResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *AuthenticateResponse) GetToken() string { + if m != nil { + return m.Token + } + return "" +} + +type AuthUserAddResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthUserAddResponse) Reset() { *m = AuthUserAddResponse{} } +func (m *AuthUserAddResponse) String() string { return proto.CompactTextString(m) } +func (*AuthUserAddResponse) ProtoMessage() {} +func (*AuthUserAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{78} } + +func (m *AuthUserAddResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AuthUserGetResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + Roles []string `protobuf:"bytes,2,rep,name=roles" json:"roles,omitempty"` +} + +func (m *AuthUserGetResponse) Reset() { *m = AuthUserGetResponse{} } +func (m *AuthUserGetResponse) String() string { return proto.CompactTextString(m) } +func (*AuthUserGetResponse) ProtoMessage() {} +func (*AuthUserGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{79} } + +func (m *AuthUserGetResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *AuthUserGetResponse) GetRoles() []string { + if m != nil { + return m.Roles + } + return nil +} + +type AuthUserDeleteResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthUserDeleteResponse) Reset() { *m = AuthUserDeleteResponse{} } +func (m *AuthUserDeleteResponse) String() string { return proto.CompactTextString(m) } +func (*AuthUserDeleteResponse) ProtoMessage() {} +func (*AuthUserDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{80} } + +func (m *AuthUserDeleteResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AuthUserChangePasswordResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthUserChangePasswordResponse) Reset() { *m = AuthUserChangePasswordResponse{} } +func (m *AuthUserChangePasswordResponse) String() string { return proto.CompactTextString(m) } +func (*AuthUserChangePasswordResponse) ProtoMessage() {} +func (*AuthUserChangePasswordResponse) Descriptor() ([]byte, []int) { + return fileDescriptorRpc, []int{81} +} + +func (m *AuthUserChangePasswordResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AuthUserGrantRoleResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthUserGrantRoleResponse) Reset() { *m = AuthUserGrantRoleResponse{} } +func (m *AuthUserGrantRoleResponse) String() string { return proto.CompactTextString(m) } +func (*AuthUserGrantRoleResponse) ProtoMessage() {} +func (*AuthUserGrantRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{82} } + +func (m *AuthUserGrantRoleResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AuthUserRevokeRoleResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthUserRevokeRoleResponse) Reset() { *m = AuthUserRevokeRoleResponse{} } +func (m *AuthUserRevokeRoleResponse) String() string { return proto.CompactTextString(m) } +func (*AuthUserRevokeRoleResponse) ProtoMessage() {} +func (*AuthUserRevokeRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{83} } + +func (m *AuthUserRevokeRoleResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AuthRoleAddResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthRoleAddResponse) Reset() { *m = AuthRoleAddResponse{} } +func (m *AuthRoleAddResponse) String() string { return proto.CompactTextString(m) } +func (*AuthRoleAddResponse) ProtoMessage() {} +func (*AuthRoleAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{84} } + +func (m *AuthRoleAddResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AuthRoleGetResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + Perm []*authpb.Permission `protobuf:"bytes,2,rep,name=perm" json:"perm,omitempty"` +} + +func (m *AuthRoleGetResponse) Reset() { *m = AuthRoleGetResponse{} } +func (m *AuthRoleGetResponse) String() string { return proto.CompactTextString(m) } +func (*AuthRoleGetResponse) ProtoMessage() {} +func (*AuthRoleGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{85} } + +func (m *AuthRoleGetResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *AuthRoleGetResponse) GetPerm() []*authpb.Permission { + if m != nil { + return m.Perm + } + return nil +} + +type AuthRoleListResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + Roles []string `protobuf:"bytes,2,rep,name=roles" json:"roles,omitempty"` +} + +func (m *AuthRoleListResponse) Reset() { *m = AuthRoleListResponse{} } +func (m *AuthRoleListResponse) String() string { return proto.CompactTextString(m) } +func (*AuthRoleListResponse) ProtoMessage() {} +func (*AuthRoleListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{86} } + +func (m *AuthRoleListResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *AuthRoleListResponse) GetRoles() []string { + if m != nil { + return m.Roles + } + return nil +} + +type AuthUserListResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + Users []string `protobuf:"bytes,2,rep,name=users" json:"users,omitempty"` +} + +func (m *AuthUserListResponse) Reset() { *m = AuthUserListResponse{} } +func (m *AuthUserListResponse) String() string { return proto.CompactTextString(m) } +func (*AuthUserListResponse) ProtoMessage() {} +func (*AuthUserListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{87} } + +func (m *AuthUserListResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *AuthUserListResponse) GetUsers() []string { + if m != nil { + return m.Users + } + return nil +} + +type AuthRoleDeleteResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthRoleDeleteResponse) Reset() { *m = AuthRoleDeleteResponse{} } +func (m *AuthRoleDeleteResponse) String() string { return proto.CompactTextString(m) } +func (*AuthRoleDeleteResponse) ProtoMessage() {} +func (*AuthRoleDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{88} } + +func (m *AuthRoleDeleteResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AuthRoleGrantPermissionResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthRoleGrantPermissionResponse) Reset() { *m = AuthRoleGrantPermissionResponse{} } +func (m *AuthRoleGrantPermissionResponse) String() string { return proto.CompactTextString(m) } +func (*AuthRoleGrantPermissionResponse) ProtoMessage() {} +func (*AuthRoleGrantPermissionResponse) Descriptor() ([]byte, []int) { + return fileDescriptorRpc, []int{89} +} + +func (m *AuthRoleGrantPermissionResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +type AuthRoleRevokePermissionResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *AuthRoleRevokePermissionResponse) Reset() { *m = AuthRoleRevokePermissionResponse{} } +func (m *AuthRoleRevokePermissionResponse) String() string { return proto.CompactTextString(m) } +func (*AuthRoleRevokePermissionResponse) ProtoMessage() {} +func (*AuthRoleRevokePermissionResponse) Descriptor() ([]byte, []int) { + return fileDescriptorRpc, []int{90} +} + +func (m *AuthRoleRevokePermissionResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func init() { + proto.RegisterType((*ResponseHeader)(nil), "etcdserverpb.ResponseHeader") + proto.RegisterType((*RangeRequest)(nil), "etcdserverpb.RangeRequest") + proto.RegisterType((*RangeResponse)(nil), "etcdserverpb.RangeResponse") + proto.RegisterType((*PutRequest)(nil), "etcdserverpb.PutRequest") + proto.RegisterType((*PutResponse)(nil), "etcdserverpb.PutResponse") + proto.RegisterType((*DeleteRangeRequest)(nil), "etcdserverpb.DeleteRangeRequest") + proto.RegisterType((*DeleteRangeResponse)(nil), "etcdserverpb.DeleteRangeResponse") + proto.RegisterType((*RequestOp)(nil), "etcdserverpb.RequestOp") + proto.RegisterType((*ResponseOp)(nil), "etcdserverpb.ResponseOp") + proto.RegisterType((*Compare)(nil), "etcdserverpb.Compare") + proto.RegisterType((*TxnRequest)(nil), "etcdserverpb.TxnRequest") + proto.RegisterType((*TxnResponse)(nil), "etcdserverpb.TxnResponse") + proto.RegisterType((*CompactionRequest)(nil), "etcdserverpb.CompactionRequest") + proto.RegisterType((*CompactionResponse)(nil), "etcdserverpb.CompactionResponse") + proto.RegisterType((*HashRequest)(nil), "etcdserverpb.HashRequest") + proto.RegisterType((*HashKVRequest)(nil), "etcdserverpb.HashKVRequest") + proto.RegisterType((*HashKVResponse)(nil), "etcdserverpb.HashKVResponse") + proto.RegisterType((*HashResponse)(nil), "etcdserverpb.HashResponse") + proto.RegisterType((*SnapshotRequest)(nil), "etcdserverpb.SnapshotRequest") + proto.RegisterType((*SnapshotResponse)(nil), "etcdserverpb.SnapshotResponse") + proto.RegisterType((*WatchRequest)(nil), "etcdserverpb.WatchRequest") + proto.RegisterType((*WatchCreateRequest)(nil), "etcdserverpb.WatchCreateRequest") + proto.RegisterType((*WatchCancelRequest)(nil), "etcdserverpb.WatchCancelRequest") + proto.RegisterType((*WatchProgressRequest)(nil), "etcdserverpb.WatchProgressRequest") + proto.RegisterType((*WatchResponse)(nil), "etcdserverpb.WatchResponse") + proto.RegisterType((*LeaseGrantRequest)(nil), "etcdserverpb.LeaseGrantRequest") + proto.RegisterType((*LeaseGrantResponse)(nil), "etcdserverpb.LeaseGrantResponse") + proto.RegisterType((*LeaseRevokeRequest)(nil), "etcdserverpb.LeaseRevokeRequest") + proto.RegisterType((*LeaseRevokeResponse)(nil), "etcdserverpb.LeaseRevokeResponse") + proto.RegisterType((*LeaseCheckpoint)(nil), "etcdserverpb.LeaseCheckpoint") + proto.RegisterType((*LeaseCheckpointRequest)(nil), "etcdserverpb.LeaseCheckpointRequest") + proto.RegisterType((*LeaseCheckpointResponse)(nil), "etcdserverpb.LeaseCheckpointResponse") + proto.RegisterType((*LeaseKeepAliveRequest)(nil), "etcdserverpb.LeaseKeepAliveRequest") + proto.RegisterType((*LeaseKeepAliveResponse)(nil), "etcdserverpb.LeaseKeepAliveResponse") + proto.RegisterType((*LeaseTimeToLiveRequest)(nil), "etcdserverpb.LeaseTimeToLiveRequest") + proto.RegisterType((*LeaseTimeToLiveResponse)(nil), "etcdserverpb.LeaseTimeToLiveResponse") + proto.RegisterType((*LeaseLeasesRequest)(nil), "etcdserverpb.LeaseLeasesRequest") + proto.RegisterType((*LeaseStatus)(nil), "etcdserverpb.LeaseStatus") + proto.RegisterType((*LeaseLeasesResponse)(nil), "etcdserverpb.LeaseLeasesResponse") + proto.RegisterType((*Member)(nil), "etcdserverpb.Member") + proto.RegisterType((*MemberAddRequest)(nil), "etcdserverpb.MemberAddRequest") + proto.RegisterType((*MemberAddResponse)(nil), "etcdserverpb.MemberAddResponse") + proto.RegisterType((*MemberRemoveRequest)(nil), "etcdserverpb.MemberRemoveRequest") + proto.RegisterType((*MemberRemoveResponse)(nil), "etcdserverpb.MemberRemoveResponse") + proto.RegisterType((*MemberUpdateRequest)(nil), "etcdserverpb.MemberUpdateRequest") + proto.RegisterType((*MemberUpdateResponse)(nil), "etcdserverpb.MemberUpdateResponse") + proto.RegisterType((*MemberListRequest)(nil), "etcdserverpb.MemberListRequest") + proto.RegisterType((*MemberListResponse)(nil), "etcdserverpb.MemberListResponse") + proto.RegisterType((*MemberPromoteRequest)(nil), "etcdserverpb.MemberPromoteRequest") + proto.RegisterType((*MemberPromoteResponse)(nil), "etcdserverpb.MemberPromoteResponse") + proto.RegisterType((*DefragmentRequest)(nil), "etcdserverpb.DefragmentRequest") + proto.RegisterType((*DefragmentResponse)(nil), "etcdserverpb.DefragmentResponse") + proto.RegisterType((*MoveLeaderRequest)(nil), "etcdserverpb.MoveLeaderRequest") + proto.RegisterType((*MoveLeaderResponse)(nil), "etcdserverpb.MoveLeaderResponse") + proto.RegisterType((*AlarmRequest)(nil), "etcdserverpb.AlarmRequest") + proto.RegisterType((*AlarmMember)(nil), "etcdserverpb.AlarmMember") + proto.RegisterType((*AlarmResponse)(nil), "etcdserverpb.AlarmResponse") + proto.RegisterType((*StatusRequest)(nil), "etcdserverpb.StatusRequest") + proto.RegisterType((*StatusResponse)(nil), "etcdserverpb.StatusResponse") + proto.RegisterType((*AuthEnableRequest)(nil), "etcdserverpb.AuthEnableRequest") + proto.RegisterType((*AuthDisableRequest)(nil), "etcdserverpb.AuthDisableRequest") + proto.RegisterType((*AuthenticateRequest)(nil), "etcdserverpb.AuthenticateRequest") + proto.RegisterType((*AuthUserAddRequest)(nil), "etcdserverpb.AuthUserAddRequest") + proto.RegisterType((*AuthUserGetRequest)(nil), "etcdserverpb.AuthUserGetRequest") + proto.RegisterType((*AuthUserDeleteRequest)(nil), "etcdserverpb.AuthUserDeleteRequest") + proto.RegisterType((*AuthUserChangePasswordRequest)(nil), "etcdserverpb.AuthUserChangePasswordRequest") + proto.RegisterType((*AuthUserGrantRoleRequest)(nil), "etcdserverpb.AuthUserGrantRoleRequest") + proto.RegisterType((*AuthUserRevokeRoleRequest)(nil), "etcdserverpb.AuthUserRevokeRoleRequest") + proto.RegisterType((*AuthRoleAddRequest)(nil), "etcdserverpb.AuthRoleAddRequest") + proto.RegisterType((*AuthRoleGetRequest)(nil), "etcdserverpb.AuthRoleGetRequest") + proto.RegisterType((*AuthUserListRequest)(nil), "etcdserverpb.AuthUserListRequest") + proto.RegisterType((*AuthRoleListRequest)(nil), "etcdserverpb.AuthRoleListRequest") + proto.RegisterType((*AuthRoleDeleteRequest)(nil), "etcdserverpb.AuthRoleDeleteRequest") + proto.RegisterType((*AuthRoleGrantPermissionRequest)(nil), "etcdserverpb.AuthRoleGrantPermissionRequest") + proto.RegisterType((*AuthRoleRevokePermissionRequest)(nil), "etcdserverpb.AuthRoleRevokePermissionRequest") + proto.RegisterType((*AuthEnableResponse)(nil), "etcdserverpb.AuthEnableResponse") + proto.RegisterType((*AuthDisableResponse)(nil), "etcdserverpb.AuthDisableResponse") + proto.RegisterType((*AuthenticateResponse)(nil), "etcdserverpb.AuthenticateResponse") + proto.RegisterType((*AuthUserAddResponse)(nil), "etcdserverpb.AuthUserAddResponse") + proto.RegisterType((*AuthUserGetResponse)(nil), "etcdserverpb.AuthUserGetResponse") + proto.RegisterType((*AuthUserDeleteResponse)(nil), "etcdserverpb.AuthUserDeleteResponse") + proto.RegisterType((*AuthUserChangePasswordResponse)(nil), "etcdserverpb.AuthUserChangePasswordResponse") + proto.RegisterType((*AuthUserGrantRoleResponse)(nil), "etcdserverpb.AuthUserGrantRoleResponse") + proto.RegisterType((*AuthUserRevokeRoleResponse)(nil), "etcdserverpb.AuthUserRevokeRoleResponse") + proto.RegisterType((*AuthRoleAddResponse)(nil), "etcdserverpb.AuthRoleAddResponse") + proto.RegisterType((*AuthRoleGetResponse)(nil), "etcdserverpb.AuthRoleGetResponse") + proto.RegisterType((*AuthRoleListResponse)(nil), "etcdserverpb.AuthRoleListResponse") + proto.RegisterType((*AuthUserListResponse)(nil), "etcdserverpb.AuthUserListResponse") + proto.RegisterType((*AuthRoleDeleteResponse)(nil), "etcdserverpb.AuthRoleDeleteResponse") + proto.RegisterType((*AuthRoleGrantPermissionResponse)(nil), "etcdserverpb.AuthRoleGrantPermissionResponse") + proto.RegisterType((*AuthRoleRevokePermissionResponse)(nil), "etcdserverpb.AuthRoleRevokePermissionResponse") + proto.RegisterEnum("etcdserverpb.AlarmType", AlarmType_name, AlarmType_value) + proto.RegisterEnum("etcdserverpb.RangeRequest_SortOrder", RangeRequest_SortOrder_name, RangeRequest_SortOrder_value) + proto.RegisterEnum("etcdserverpb.RangeRequest_SortTarget", RangeRequest_SortTarget_name, RangeRequest_SortTarget_value) + proto.RegisterEnum("etcdserverpb.Compare_CompareResult", Compare_CompareResult_name, Compare_CompareResult_value) + proto.RegisterEnum("etcdserverpb.Compare_CompareTarget", Compare_CompareTarget_name, Compare_CompareTarget_value) + proto.RegisterEnum("etcdserverpb.WatchCreateRequest_FilterType", WatchCreateRequest_FilterType_name, WatchCreateRequest_FilterType_value) + proto.RegisterEnum("etcdserverpb.AlarmRequest_AlarmAction", AlarmRequest_AlarmAction_name, AlarmRequest_AlarmAction_value) +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// Client API for KV service + +type KVClient interface { + // Range gets the keys in the range from the key-value store. + Range(ctx context.Context, in *RangeRequest, opts ...grpc.CallOption) (*RangeResponse, error) + // Put puts the given key into the key-value store. + // A put request increments the revision of the key-value store + // and generates one event in the event history. + Put(ctx context.Context, in *PutRequest, opts ...grpc.CallOption) (*PutResponse, error) + // DeleteRange deletes the given range from the key-value store. + // A delete request increments the revision of the key-value store + // and generates a delete event in the event history for every deleted key. + DeleteRange(ctx context.Context, in *DeleteRangeRequest, opts ...grpc.CallOption) (*DeleteRangeResponse, error) + // Txn processes multiple requests in a single transaction. + // A txn request increments the revision of the key-value store + // and generates events with the same revision for every completed request. + // It is not allowed to modify the same key several times within one txn. + Txn(ctx context.Context, in *TxnRequest, opts ...grpc.CallOption) (*TxnResponse, error) + // Compact compacts the event history in the etcd key-value store. The key-value + // store should be periodically compacted or the event history will continue to grow + // indefinitely. + Compact(ctx context.Context, in *CompactionRequest, opts ...grpc.CallOption) (*CompactionResponse, error) +} + +type kVClient struct { + cc *grpc.ClientConn +} + +func NewKVClient(cc *grpc.ClientConn) KVClient { + return &kVClient{cc} +} + +func (c *kVClient) Range(ctx context.Context, in *RangeRequest, opts ...grpc.CallOption) (*RangeResponse, error) { + out := new(RangeResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.KV/Range", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *kVClient) Put(ctx context.Context, in *PutRequest, opts ...grpc.CallOption) (*PutResponse, error) { + out := new(PutResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.KV/Put", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *kVClient) DeleteRange(ctx context.Context, in *DeleteRangeRequest, opts ...grpc.CallOption) (*DeleteRangeResponse, error) { + out := new(DeleteRangeResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.KV/DeleteRange", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *kVClient) Txn(ctx context.Context, in *TxnRequest, opts ...grpc.CallOption) (*TxnResponse, error) { + out := new(TxnResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.KV/Txn", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *kVClient) Compact(ctx context.Context, in *CompactionRequest, opts ...grpc.CallOption) (*CompactionResponse, error) { + out := new(CompactionResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.KV/Compact", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for KV service + +type KVServer interface { + // Range gets the keys in the range from the key-value store. + Range(context.Context, *RangeRequest) (*RangeResponse, error) + // Put puts the given key into the key-value store. + // A put request increments the revision of the key-value store + // and generates one event in the event history. + Put(context.Context, *PutRequest) (*PutResponse, error) + // DeleteRange deletes the given range from the key-value store. + // A delete request increments the revision of the key-value store + // and generates a delete event in the event history for every deleted key. + DeleteRange(context.Context, *DeleteRangeRequest) (*DeleteRangeResponse, error) + // Txn processes multiple requests in a single transaction. + // A txn request increments the revision of the key-value store + // and generates events with the same revision for every completed request. + // It is not allowed to modify the same key several times within one txn. + Txn(context.Context, *TxnRequest) (*TxnResponse, error) + // Compact compacts the event history in the etcd key-value store. The key-value + // store should be periodically compacted or the event history will continue to grow + // indefinitely. + Compact(context.Context, *CompactionRequest) (*CompactionResponse, error) +} + +func RegisterKVServer(s *grpc.Server, srv KVServer) { + s.RegisterService(&_KV_serviceDesc, srv) +} + +func _KV_Range_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RangeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(KVServer).Range(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.KV/Range", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(KVServer).Range(ctx, req.(*RangeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _KV_Put_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PutRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(KVServer).Put(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.KV/Put", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(KVServer).Put(ctx, req.(*PutRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _KV_DeleteRange_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteRangeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(KVServer).DeleteRange(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.KV/DeleteRange", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(KVServer).DeleteRange(ctx, req.(*DeleteRangeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _KV_Txn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TxnRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(KVServer).Txn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.KV/Txn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(KVServer).Txn(ctx, req.(*TxnRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _KV_Compact_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CompactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(KVServer).Compact(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.KV/Compact", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(KVServer).Compact(ctx, req.(*CompactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _KV_serviceDesc = grpc.ServiceDesc{ + ServiceName: "etcdserverpb.KV", + HandlerType: (*KVServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Range", + Handler: _KV_Range_Handler, + }, + { + MethodName: "Put", + Handler: _KV_Put_Handler, + }, + { + MethodName: "DeleteRange", + Handler: _KV_DeleteRange_Handler, + }, + { + MethodName: "Txn", + Handler: _KV_Txn_Handler, + }, + { + MethodName: "Compact", + Handler: _KV_Compact_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "rpc.proto", +} + +// Client API for Watch service + +type WatchClient interface { + // Watch watches for events happening or that have happened. Both input and output + // are streams; the input stream is for creating and canceling watchers and the output + // stream sends events. One watch RPC can watch on multiple key ranges, streaming events + // for several watches at once. The entire event history can be watched starting from the + // last compaction revision. + Watch(ctx context.Context, opts ...grpc.CallOption) (Watch_WatchClient, error) +} + +type watchClient struct { + cc *grpc.ClientConn +} + +func NewWatchClient(cc *grpc.ClientConn) WatchClient { + return &watchClient{cc} +} + +func (c *watchClient) Watch(ctx context.Context, opts ...grpc.CallOption) (Watch_WatchClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Watch_serviceDesc.Streams[0], c.cc, "/etcdserverpb.Watch/Watch", opts...) + if err != nil { + return nil, err + } + x := &watchWatchClient{stream} + return x, nil +} + +type Watch_WatchClient interface { + Send(*WatchRequest) error + Recv() (*WatchResponse, error) + grpc.ClientStream +} + +type watchWatchClient struct { + grpc.ClientStream +} + +func (x *watchWatchClient) Send(m *WatchRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *watchWatchClient) Recv() (*WatchResponse, error) { + m := new(WatchResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// Server API for Watch service + +type WatchServer interface { + // Watch watches for events happening or that have happened. Both input and output + // are streams; the input stream is for creating and canceling watchers and the output + // stream sends events. One watch RPC can watch on multiple key ranges, streaming events + // for several watches at once. The entire event history can be watched starting from the + // last compaction revision. + Watch(Watch_WatchServer) error +} + +func RegisterWatchServer(s *grpc.Server, srv WatchServer) { + s.RegisterService(&_Watch_serviceDesc, srv) +} + +func _Watch_Watch_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(WatchServer).Watch(&watchWatchServer{stream}) +} + +type Watch_WatchServer interface { + Send(*WatchResponse) error + Recv() (*WatchRequest, error) + grpc.ServerStream +} + +type watchWatchServer struct { + grpc.ServerStream +} + +func (x *watchWatchServer) Send(m *WatchResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *watchWatchServer) Recv() (*WatchRequest, error) { + m := new(WatchRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +var _Watch_serviceDesc = grpc.ServiceDesc{ + ServiceName: "etcdserverpb.Watch", + HandlerType: (*WatchServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "Watch", + Handler: _Watch_Watch_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "rpc.proto", +} + +// Client API for Lease service + +type LeaseClient interface { + // LeaseGrant creates a lease which expires if the server does not receive a keepAlive + // within a given time to live period. All keys attached to the lease will be expired and + // deleted if the lease expires. Each expired key generates a delete event in the event history. + LeaseGrant(ctx context.Context, in *LeaseGrantRequest, opts ...grpc.CallOption) (*LeaseGrantResponse, error) + // LeaseRevoke revokes a lease. All keys attached to the lease will expire and be deleted. + LeaseRevoke(ctx context.Context, in *LeaseRevokeRequest, opts ...grpc.CallOption) (*LeaseRevokeResponse, error) + // LeaseKeepAlive keeps the lease alive by streaming keep alive requests from the client + // to the server and streaming keep alive responses from the server to the client. + LeaseKeepAlive(ctx context.Context, opts ...grpc.CallOption) (Lease_LeaseKeepAliveClient, error) + // LeaseTimeToLive retrieves lease information. + LeaseTimeToLive(ctx context.Context, in *LeaseTimeToLiveRequest, opts ...grpc.CallOption) (*LeaseTimeToLiveResponse, error) + // LeaseLeases lists all existing leases. + LeaseLeases(ctx context.Context, in *LeaseLeasesRequest, opts ...grpc.CallOption) (*LeaseLeasesResponse, error) +} + +type leaseClient struct { + cc *grpc.ClientConn +} + +func NewLeaseClient(cc *grpc.ClientConn) LeaseClient { + return &leaseClient{cc} +} + +func (c *leaseClient) LeaseGrant(ctx context.Context, in *LeaseGrantRequest, opts ...grpc.CallOption) (*LeaseGrantResponse, error) { + out := new(LeaseGrantResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Lease/LeaseGrant", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *leaseClient) LeaseRevoke(ctx context.Context, in *LeaseRevokeRequest, opts ...grpc.CallOption) (*LeaseRevokeResponse, error) { + out := new(LeaseRevokeResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Lease/LeaseRevoke", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *leaseClient) LeaseKeepAlive(ctx context.Context, opts ...grpc.CallOption) (Lease_LeaseKeepAliveClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Lease_serviceDesc.Streams[0], c.cc, "/etcdserverpb.Lease/LeaseKeepAlive", opts...) + if err != nil { + return nil, err + } + x := &leaseLeaseKeepAliveClient{stream} + return x, nil +} + +type Lease_LeaseKeepAliveClient interface { + Send(*LeaseKeepAliveRequest) error + Recv() (*LeaseKeepAliveResponse, error) + grpc.ClientStream +} + +type leaseLeaseKeepAliveClient struct { + grpc.ClientStream +} + +func (x *leaseLeaseKeepAliveClient) Send(m *LeaseKeepAliveRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *leaseLeaseKeepAliveClient) Recv() (*LeaseKeepAliveResponse, error) { + m := new(LeaseKeepAliveResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *leaseClient) LeaseTimeToLive(ctx context.Context, in *LeaseTimeToLiveRequest, opts ...grpc.CallOption) (*LeaseTimeToLiveResponse, error) { + out := new(LeaseTimeToLiveResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Lease/LeaseTimeToLive", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *leaseClient) LeaseLeases(ctx context.Context, in *LeaseLeasesRequest, opts ...grpc.CallOption) (*LeaseLeasesResponse, error) { + out := new(LeaseLeasesResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Lease/LeaseLeases", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Lease service + +type LeaseServer interface { + // LeaseGrant creates a lease which expires if the server does not receive a keepAlive + // within a given time to live period. All keys attached to the lease will be expired and + // deleted if the lease expires. Each expired key generates a delete event in the event history. + LeaseGrant(context.Context, *LeaseGrantRequest) (*LeaseGrantResponse, error) + // LeaseRevoke revokes a lease. All keys attached to the lease will expire and be deleted. + LeaseRevoke(context.Context, *LeaseRevokeRequest) (*LeaseRevokeResponse, error) + // LeaseKeepAlive keeps the lease alive by streaming keep alive requests from the client + // to the server and streaming keep alive responses from the server to the client. + LeaseKeepAlive(Lease_LeaseKeepAliveServer) error + // LeaseTimeToLive retrieves lease information. + LeaseTimeToLive(context.Context, *LeaseTimeToLiveRequest) (*LeaseTimeToLiveResponse, error) + // LeaseLeases lists all existing leases. + LeaseLeases(context.Context, *LeaseLeasesRequest) (*LeaseLeasesResponse, error) +} + +func RegisterLeaseServer(s *grpc.Server, srv LeaseServer) { + s.RegisterService(&_Lease_serviceDesc, srv) +} + +func _Lease_LeaseGrant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LeaseGrantRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LeaseServer).LeaseGrant(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Lease/LeaseGrant", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LeaseServer).LeaseGrant(ctx, req.(*LeaseGrantRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Lease_LeaseRevoke_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LeaseRevokeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LeaseServer).LeaseRevoke(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Lease/LeaseRevoke", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LeaseServer).LeaseRevoke(ctx, req.(*LeaseRevokeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Lease_LeaseKeepAlive_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(LeaseServer).LeaseKeepAlive(&leaseLeaseKeepAliveServer{stream}) +} + +type Lease_LeaseKeepAliveServer interface { + Send(*LeaseKeepAliveResponse) error + Recv() (*LeaseKeepAliveRequest, error) + grpc.ServerStream +} + +type leaseLeaseKeepAliveServer struct { + grpc.ServerStream +} + +func (x *leaseLeaseKeepAliveServer) Send(m *LeaseKeepAliveResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *leaseLeaseKeepAliveServer) Recv() (*LeaseKeepAliveRequest, error) { + m := new(LeaseKeepAliveRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _Lease_LeaseTimeToLive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LeaseTimeToLiveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LeaseServer).LeaseTimeToLive(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Lease/LeaseTimeToLive", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LeaseServer).LeaseTimeToLive(ctx, req.(*LeaseTimeToLiveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Lease_LeaseLeases_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LeaseLeasesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LeaseServer).LeaseLeases(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Lease/LeaseLeases", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LeaseServer).LeaseLeases(ctx, req.(*LeaseLeasesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Lease_serviceDesc = grpc.ServiceDesc{ + ServiceName: "etcdserverpb.Lease", + HandlerType: (*LeaseServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "LeaseGrant", + Handler: _Lease_LeaseGrant_Handler, + }, + { + MethodName: "LeaseRevoke", + Handler: _Lease_LeaseRevoke_Handler, + }, + { + MethodName: "LeaseTimeToLive", + Handler: _Lease_LeaseTimeToLive_Handler, + }, + { + MethodName: "LeaseLeases", + Handler: _Lease_LeaseLeases_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "LeaseKeepAlive", + Handler: _Lease_LeaseKeepAlive_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "rpc.proto", +} + +// Client API for Cluster service + +type ClusterClient interface { + // MemberAdd adds a member into the cluster. + MemberAdd(ctx context.Context, in *MemberAddRequest, opts ...grpc.CallOption) (*MemberAddResponse, error) + // MemberRemove removes an existing member from the cluster. + MemberRemove(ctx context.Context, in *MemberRemoveRequest, opts ...grpc.CallOption) (*MemberRemoveResponse, error) + // MemberUpdate updates the member configuration. + MemberUpdate(ctx context.Context, in *MemberUpdateRequest, opts ...grpc.CallOption) (*MemberUpdateResponse, error) + // MemberList lists all the members in the cluster. + MemberList(ctx context.Context, in *MemberListRequest, opts ...grpc.CallOption) (*MemberListResponse, error) + // MemberPromote promotes a member from raft learner (non-voting) to raft voting member. + MemberPromote(ctx context.Context, in *MemberPromoteRequest, opts ...grpc.CallOption) (*MemberPromoteResponse, error) +} + +type clusterClient struct { + cc *grpc.ClientConn +} + +func NewClusterClient(cc *grpc.ClientConn) ClusterClient { + return &clusterClient{cc} +} + +func (c *clusterClient) MemberAdd(ctx context.Context, in *MemberAddRequest, opts ...grpc.CallOption) (*MemberAddResponse, error) { + out := new(MemberAddResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Cluster/MemberAdd", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *clusterClient) MemberRemove(ctx context.Context, in *MemberRemoveRequest, opts ...grpc.CallOption) (*MemberRemoveResponse, error) { + out := new(MemberRemoveResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Cluster/MemberRemove", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *clusterClient) MemberUpdate(ctx context.Context, in *MemberUpdateRequest, opts ...grpc.CallOption) (*MemberUpdateResponse, error) { + out := new(MemberUpdateResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Cluster/MemberUpdate", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *clusterClient) MemberList(ctx context.Context, in *MemberListRequest, opts ...grpc.CallOption) (*MemberListResponse, error) { + out := new(MemberListResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Cluster/MemberList", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *clusterClient) MemberPromote(ctx context.Context, in *MemberPromoteRequest, opts ...grpc.CallOption) (*MemberPromoteResponse, error) { + out := new(MemberPromoteResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Cluster/MemberPromote", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Cluster service + +type ClusterServer interface { + // MemberAdd adds a member into the cluster. + MemberAdd(context.Context, *MemberAddRequest) (*MemberAddResponse, error) + // MemberRemove removes an existing member from the cluster. + MemberRemove(context.Context, *MemberRemoveRequest) (*MemberRemoveResponse, error) + // MemberUpdate updates the member configuration. + MemberUpdate(context.Context, *MemberUpdateRequest) (*MemberUpdateResponse, error) + // MemberList lists all the members in the cluster. + MemberList(context.Context, *MemberListRequest) (*MemberListResponse, error) + // MemberPromote promotes a member from raft learner (non-voting) to raft voting member. + MemberPromote(context.Context, *MemberPromoteRequest) (*MemberPromoteResponse, error) +} + +func RegisterClusterServer(s *grpc.Server, srv ClusterServer) { + s.RegisterService(&_Cluster_serviceDesc, srv) +} + +func _Cluster_MemberAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MemberAddRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClusterServer).MemberAdd(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Cluster/MemberAdd", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClusterServer).MemberAdd(ctx, req.(*MemberAddRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Cluster_MemberRemove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MemberRemoveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClusterServer).MemberRemove(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Cluster/MemberRemove", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClusterServer).MemberRemove(ctx, req.(*MemberRemoveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Cluster_MemberUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MemberUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClusterServer).MemberUpdate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Cluster/MemberUpdate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClusterServer).MemberUpdate(ctx, req.(*MemberUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Cluster_MemberList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MemberListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClusterServer).MemberList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Cluster/MemberList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClusterServer).MemberList(ctx, req.(*MemberListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Cluster_MemberPromote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MemberPromoteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClusterServer).MemberPromote(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Cluster/MemberPromote", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClusterServer).MemberPromote(ctx, req.(*MemberPromoteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Cluster_serviceDesc = grpc.ServiceDesc{ + ServiceName: "etcdserverpb.Cluster", + HandlerType: (*ClusterServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "MemberAdd", + Handler: _Cluster_MemberAdd_Handler, + }, + { + MethodName: "MemberRemove", + Handler: _Cluster_MemberRemove_Handler, + }, + { + MethodName: "MemberUpdate", + Handler: _Cluster_MemberUpdate_Handler, + }, + { + MethodName: "MemberList", + Handler: _Cluster_MemberList_Handler, + }, + { + MethodName: "MemberPromote", + Handler: _Cluster_MemberPromote_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "rpc.proto", +} + +// Client API for Maintenance service + +type MaintenanceClient interface { + // Alarm activates, deactivates, and queries alarms regarding cluster health. + Alarm(ctx context.Context, in *AlarmRequest, opts ...grpc.CallOption) (*AlarmResponse, error) + // Status gets the status of the member. + Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) + // Defragment defragments a member's backend database to recover storage space. + Defragment(ctx context.Context, in *DefragmentRequest, opts ...grpc.CallOption) (*DefragmentResponse, error) + // Hash computes the hash of whole backend keyspace, + // including key, lease, and other buckets in storage. + // This is designed for testing ONLY! + // Do not rely on this in production with ongoing transactions, + // since Hash operation does not hold MVCC locks. + // Use "HashKV" API instead for "key" bucket consistency checks. + Hash(ctx context.Context, in *HashRequest, opts ...grpc.CallOption) (*HashResponse, error) + // HashKV computes the hash of all MVCC keys up to a given revision. + // It only iterates "key" bucket in backend storage. + HashKV(ctx context.Context, in *HashKVRequest, opts ...grpc.CallOption) (*HashKVResponse, error) + // Snapshot sends a snapshot of the entire backend from a member over a stream to a client. + Snapshot(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (Maintenance_SnapshotClient, error) + // MoveLeader requests current leader node to transfer its leadership to transferee. + MoveLeader(ctx context.Context, in *MoveLeaderRequest, opts ...grpc.CallOption) (*MoveLeaderResponse, error) +} + +type maintenanceClient struct { + cc *grpc.ClientConn +} + +func NewMaintenanceClient(cc *grpc.ClientConn) MaintenanceClient { + return &maintenanceClient{cc} +} + +func (c *maintenanceClient) Alarm(ctx context.Context, in *AlarmRequest, opts ...grpc.CallOption) (*AlarmResponse, error) { + out := new(AlarmResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Maintenance/Alarm", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *maintenanceClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) { + out := new(StatusResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Maintenance/Status", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *maintenanceClient) Defragment(ctx context.Context, in *DefragmentRequest, opts ...grpc.CallOption) (*DefragmentResponse, error) { + out := new(DefragmentResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Maintenance/Defragment", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *maintenanceClient) Hash(ctx context.Context, in *HashRequest, opts ...grpc.CallOption) (*HashResponse, error) { + out := new(HashResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Maintenance/Hash", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *maintenanceClient) HashKV(ctx context.Context, in *HashKVRequest, opts ...grpc.CallOption) (*HashKVResponse, error) { + out := new(HashKVResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Maintenance/HashKV", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *maintenanceClient) Snapshot(ctx context.Context, in *SnapshotRequest, opts ...grpc.CallOption) (Maintenance_SnapshotClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Maintenance_serviceDesc.Streams[0], c.cc, "/etcdserverpb.Maintenance/Snapshot", opts...) + if err != nil { + return nil, err + } + x := &maintenanceSnapshotClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Maintenance_SnapshotClient interface { + Recv() (*SnapshotResponse, error) + grpc.ClientStream +} + +type maintenanceSnapshotClient struct { + grpc.ClientStream +} + +func (x *maintenanceSnapshotClient) Recv() (*SnapshotResponse, error) { + m := new(SnapshotResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *maintenanceClient) MoveLeader(ctx context.Context, in *MoveLeaderRequest, opts ...grpc.CallOption) (*MoveLeaderResponse, error) { + out := new(MoveLeaderResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Maintenance/MoveLeader", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Maintenance service + +type MaintenanceServer interface { + // Alarm activates, deactivates, and queries alarms regarding cluster health. + Alarm(context.Context, *AlarmRequest) (*AlarmResponse, error) + // Status gets the status of the member. + Status(context.Context, *StatusRequest) (*StatusResponse, error) + // Defragment defragments a member's backend database to recover storage space. + Defragment(context.Context, *DefragmentRequest) (*DefragmentResponse, error) + // Hash computes the hash of whole backend keyspace, + // including key, lease, and other buckets in storage. + // This is designed for testing ONLY! + // Do not rely on this in production with ongoing transactions, + // since Hash operation does not hold MVCC locks. + // Use "HashKV" API instead for "key" bucket consistency checks. + Hash(context.Context, *HashRequest) (*HashResponse, error) + // HashKV computes the hash of all MVCC keys up to a given revision. + // It only iterates "key" bucket in backend storage. + HashKV(context.Context, *HashKVRequest) (*HashKVResponse, error) + // Snapshot sends a snapshot of the entire backend from a member over a stream to a client. + Snapshot(*SnapshotRequest, Maintenance_SnapshotServer) error + // MoveLeader requests current leader node to transfer its leadership to transferee. + MoveLeader(context.Context, *MoveLeaderRequest) (*MoveLeaderResponse, error) +} + +func RegisterMaintenanceServer(s *grpc.Server, srv MaintenanceServer) { + s.RegisterService(&_Maintenance_serviceDesc, srv) +} + +func _Maintenance_Alarm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AlarmRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MaintenanceServer).Alarm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Maintenance/Alarm", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MaintenanceServer).Alarm(ctx, req.(*AlarmRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Maintenance_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MaintenanceServer).Status(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Maintenance/Status", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MaintenanceServer).Status(ctx, req.(*StatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Maintenance_Defragment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DefragmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MaintenanceServer).Defragment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Maintenance/Defragment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MaintenanceServer).Defragment(ctx, req.(*DefragmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Maintenance_Hash_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HashRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MaintenanceServer).Hash(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Maintenance/Hash", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MaintenanceServer).Hash(ctx, req.(*HashRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Maintenance_HashKV_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HashKVRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MaintenanceServer).HashKV(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Maintenance/HashKV", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MaintenanceServer).HashKV(ctx, req.(*HashKVRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Maintenance_Snapshot_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SnapshotRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(MaintenanceServer).Snapshot(m, &maintenanceSnapshotServer{stream}) +} + +type Maintenance_SnapshotServer interface { + Send(*SnapshotResponse) error + grpc.ServerStream +} + +type maintenanceSnapshotServer struct { + grpc.ServerStream +} + +func (x *maintenanceSnapshotServer) Send(m *SnapshotResponse) error { + return x.ServerStream.SendMsg(m) +} + +func _Maintenance_MoveLeader_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MoveLeaderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MaintenanceServer).MoveLeader(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Maintenance/MoveLeader", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MaintenanceServer).MoveLeader(ctx, req.(*MoveLeaderRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Maintenance_serviceDesc = grpc.ServiceDesc{ + ServiceName: "etcdserverpb.Maintenance", + HandlerType: (*MaintenanceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Alarm", + Handler: _Maintenance_Alarm_Handler, + }, + { + MethodName: "Status", + Handler: _Maintenance_Status_Handler, + }, + { + MethodName: "Defragment", + Handler: _Maintenance_Defragment_Handler, + }, + { + MethodName: "Hash", + Handler: _Maintenance_Hash_Handler, + }, + { + MethodName: "HashKV", + Handler: _Maintenance_HashKV_Handler, + }, + { + MethodName: "MoveLeader", + Handler: _Maintenance_MoveLeader_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "Snapshot", + Handler: _Maintenance_Snapshot_Handler, + ServerStreams: true, + }, + }, + Metadata: "rpc.proto", +} + +// Client API for Auth service + +type AuthClient interface { + // AuthEnable enables authentication. + AuthEnable(ctx context.Context, in *AuthEnableRequest, opts ...grpc.CallOption) (*AuthEnableResponse, error) + // AuthDisable disables authentication. + AuthDisable(ctx context.Context, in *AuthDisableRequest, opts ...grpc.CallOption) (*AuthDisableResponse, error) + // Authenticate processes an authenticate request. + Authenticate(ctx context.Context, in *AuthenticateRequest, opts ...grpc.CallOption) (*AuthenticateResponse, error) + // UserAdd adds a new user. User name cannot be empty. + UserAdd(ctx context.Context, in *AuthUserAddRequest, opts ...grpc.CallOption) (*AuthUserAddResponse, error) + // UserGet gets detailed user information. + UserGet(ctx context.Context, in *AuthUserGetRequest, opts ...grpc.CallOption) (*AuthUserGetResponse, error) + // UserList gets a list of all users. + UserList(ctx context.Context, in *AuthUserListRequest, opts ...grpc.CallOption) (*AuthUserListResponse, error) + // UserDelete deletes a specified user. + UserDelete(ctx context.Context, in *AuthUserDeleteRequest, opts ...grpc.CallOption) (*AuthUserDeleteResponse, error) + // UserChangePassword changes the password of a specified user. + UserChangePassword(ctx context.Context, in *AuthUserChangePasswordRequest, opts ...grpc.CallOption) (*AuthUserChangePasswordResponse, error) + // UserGrant grants a role to a specified user. + UserGrantRole(ctx context.Context, in *AuthUserGrantRoleRequest, opts ...grpc.CallOption) (*AuthUserGrantRoleResponse, error) + // UserRevokeRole revokes a role of specified user. + UserRevokeRole(ctx context.Context, in *AuthUserRevokeRoleRequest, opts ...grpc.CallOption) (*AuthUserRevokeRoleResponse, error) + // RoleAdd adds a new role. Role name cannot be empty. + RoleAdd(ctx context.Context, in *AuthRoleAddRequest, opts ...grpc.CallOption) (*AuthRoleAddResponse, error) + // RoleGet gets detailed role information. + RoleGet(ctx context.Context, in *AuthRoleGetRequest, opts ...grpc.CallOption) (*AuthRoleGetResponse, error) + // RoleList gets lists of all roles. + RoleList(ctx context.Context, in *AuthRoleListRequest, opts ...grpc.CallOption) (*AuthRoleListResponse, error) + // RoleDelete deletes a specified role. + RoleDelete(ctx context.Context, in *AuthRoleDeleteRequest, opts ...grpc.CallOption) (*AuthRoleDeleteResponse, error) + // RoleGrantPermission grants a permission of a specified key or range to a specified role. + RoleGrantPermission(ctx context.Context, in *AuthRoleGrantPermissionRequest, opts ...grpc.CallOption) (*AuthRoleGrantPermissionResponse, error) + // RoleRevokePermission revokes a key or range permission of a specified role. + RoleRevokePermission(ctx context.Context, in *AuthRoleRevokePermissionRequest, opts ...grpc.CallOption) (*AuthRoleRevokePermissionResponse, error) +} + +type authClient struct { + cc *grpc.ClientConn +} + +func NewAuthClient(cc *grpc.ClientConn) AuthClient { + return &authClient{cc} +} + +func (c *authClient) AuthEnable(ctx context.Context, in *AuthEnableRequest, opts ...grpc.CallOption) (*AuthEnableResponse, error) { + out := new(AuthEnableResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/AuthEnable", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) AuthDisable(ctx context.Context, in *AuthDisableRequest, opts ...grpc.CallOption) (*AuthDisableResponse, error) { + out := new(AuthDisableResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/AuthDisable", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) Authenticate(ctx context.Context, in *AuthenticateRequest, opts ...grpc.CallOption) (*AuthenticateResponse, error) { + out := new(AuthenticateResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/Authenticate", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) UserAdd(ctx context.Context, in *AuthUserAddRequest, opts ...grpc.CallOption) (*AuthUserAddResponse, error) { + out := new(AuthUserAddResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/UserAdd", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) UserGet(ctx context.Context, in *AuthUserGetRequest, opts ...grpc.CallOption) (*AuthUserGetResponse, error) { + out := new(AuthUserGetResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/UserGet", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) UserList(ctx context.Context, in *AuthUserListRequest, opts ...grpc.CallOption) (*AuthUserListResponse, error) { + out := new(AuthUserListResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/UserList", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) UserDelete(ctx context.Context, in *AuthUserDeleteRequest, opts ...grpc.CallOption) (*AuthUserDeleteResponse, error) { + out := new(AuthUserDeleteResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/UserDelete", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) UserChangePassword(ctx context.Context, in *AuthUserChangePasswordRequest, opts ...grpc.CallOption) (*AuthUserChangePasswordResponse, error) { + out := new(AuthUserChangePasswordResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/UserChangePassword", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) UserGrantRole(ctx context.Context, in *AuthUserGrantRoleRequest, opts ...grpc.CallOption) (*AuthUserGrantRoleResponse, error) { + out := new(AuthUserGrantRoleResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/UserGrantRole", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) UserRevokeRole(ctx context.Context, in *AuthUserRevokeRoleRequest, opts ...grpc.CallOption) (*AuthUserRevokeRoleResponse, error) { + out := new(AuthUserRevokeRoleResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/UserRevokeRole", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) RoleAdd(ctx context.Context, in *AuthRoleAddRequest, opts ...grpc.CallOption) (*AuthRoleAddResponse, error) { + out := new(AuthRoleAddResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/RoleAdd", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) RoleGet(ctx context.Context, in *AuthRoleGetRequest, opts ...grpc.CallOption) (*AuthRoleGetResponse, error) { + out := new(AuthRoleGetResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/RoleGet", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) RoleList(ctx context.Context, in *AuthRoleListRequest, opts ...grpc.CallOption) (*AuthRoleListResponse, error) { + out := new(AuthRoleListResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/RoleList", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) RoleDelete(ctx context.Context, in *AuthRoleDeleteRequest, opts ...grpc.CallOption) (*AuthRoleDeleteResponse, error) { + out := new(AuthRoleDeleteResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/RoleDelete", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) RoleGrantPermission(ctx context.Context, in *AuthRoleGrantPermissionRequest, opts ...grpc.CallOption) (*AuthRoleGrantPermissionResponse, error) { + out := new(AuthRoleGrantPermissionResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/RoleGrantPermission", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authClient) RoleRevokePermission(ctx context.Context, in *AuthRoleRevokePermissionRequest, opts ...grpc.CallOption) (*AuthRoleRevokePermissionResponse, error) { + out := new(AuthRoleRevokePermissionResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Auth/RoleRevokePermission", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Auth service + +type AuthServer interface { + // AuthEnable enables authentication. + AuthEnable(context.Context, *AuthEnableRequest) (*AuthEnableResponse, error) + // AuthDisable disables authentication. + AuthDisable(context.Context, *AuthDisableRequest) (*AuthDisableResponse, error) + // Authenticate processes an authenticate request. + Authenticate(context.Context, *AuthenticateRequest) (*AuthenticateResponse, error) + // UserAdd adds a new user. User name cannot be empty. + UserAdd(context.Context, *AuthUserAddRequest) (*AuthUserAddResponse, error) + // UserGet gets detailed user information. + UserGet(context.Context, *AuthUserGetRequest) (*AuthUserGetResponse, error) + // UserList gets a list of all users. + UserList(context.Context, *AuthUserListRequest) (*AuthUserListResponse, error) + // UserDelete deletes a specified user. + UserDelete(context.Context, *AuthUserDeleteRequest) (*AuthUserDeleteResponse, error) + // UserChangePassword changes the password of a specified user. + UserChangePassword(context.Context, *AuthUserChangePasswordRequest) (*AuthUserChangePasswordResponse, error) + // UserGrant grants a role to a specified user. + UserGrantRole(context.Context, *AuthUserGrantRoleRequest) (*AuthUserGrantRoleResponse, error) + // UserRevokeRole revokes a role of specified user. + UserRevokeRole(context.Context, *AuthUserRevokeRoleRequest) (*AuthUserRevokeRoleResponse, error) + // RoleAdd adds a new role. Role name cannot be empty. + RoleAdd(context.Context, *AuthRoleAddRequest) (*AuthRoleAddResponse, error) + // RoleGet gets detailed role information. + RoleGet(context.Context, *AuthRoleGetRequest) (*AuthRoleGetResponse, error) + // RoleList gets lists of all roles. + RoleList(context.Context, *AuthRoleListRequest) (*AuthRoleListResponse, error) + // RoleDelete deletes a specified role. + RoleDelete(context.Context, *AuthRoleDeleteRequest) (*AuthRoleDeleteResponse, error) + // RoleGrantPermission grants a permission of a specified key or range to a specified role. + RoleGrantPermission(context.Context, *AuthRoleGrantPermissionRequest) (*AuthRoleGrantPermissionResponse, error) + // RoleRevokePermission revokes a key or range permission of a specified role. + RoleRevokePermission(context.Context, *AuthRoleRevokePermissionRequest) (*AuthRoleRevokePermissionResponse, error) +} + +func RegisterAuthServer(s *grpc.Server, srv AuthServer) { + s.RegisterService(&_Auth_serviceDesc, srv) +} + +func _Auth_AuthEnable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthEnableRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).AuthEnable(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/AuthEnable", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).AuthEnable(ctx, req.(*AuthEnableRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_AuthDisable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthDisableRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).AuthDisable(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/AuthDisable", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).AuthDisable(ctx, req.(*AuthDisableRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_Authenticate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthenticateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).Authenticate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/Authenticate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).Authenticate(ctx, req.(*AuthenticateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_UserAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthUserAddRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).UserAdd(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/UserAdd", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).UserAdd(ctx, req.(*AuthUserAddRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_UserGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthUserGetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).UserGet(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/UserGet", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).UserGet(ctx, req.(*AuthUserGetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_UserList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthUserListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).UserList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/UserList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).UserList(ctx, req.(*AuthUserListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_UserDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthUserDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).UserDelete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/UserDelete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).UserDelete(ctx, req.(*AuthUserDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_UserChangePassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthUserChangePasswordRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).UserChangePassword(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/UserChangePassword", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).UserChangePassword(ctx, req.(*AuthUserChangePasswordRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_UserGrantRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthUserGrantRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).UserGrantRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/UserGrantRole", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).UserGrantRole(ctx, req.(*AuthUserGrantRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_UserRevokeRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthUserRevokeRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).UserRevokeRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/UserRevokeRole", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).UserRevokeRole(ctx, req.(*AuthUserRevokeRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_RoleAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthRoleAddRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).RoleAdd(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/RoleAdd", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).RoleAdd(ctx, req.(*AuthRoleAddRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_RoleGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthRoleGetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).RoleGet(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/RoleGet", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).RoleGet(ctx, req.(*AuthRoleGetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_RoleList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthRoleListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).RoleList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/RoleList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).RoleList(ctx, req.(*AuthRoleListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_RoleDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthRoleDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).RoleDelete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/RoleDelete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).RoleDelete(ctx, req.(*AuthRoleDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_RoleGrantPermission_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthRoleGrantPermissionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).RoleGrantPermission(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/RoleGrantPermission", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).RoleGrantPermission(ctx, req.(*AuthRoleGrantPermissionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Auth_RoleRevokePermission_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthRoleRevokePermissionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServer).RoleRevokePermission(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Auth/RoleRevokePermission", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServer).RoleRevokePermission(ctx, req.(*AuthRoleRevokePermissionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Auth_serviceDesc = grpc.ServiceDesc{ + ServiceName: "etcdserverpb.Auth", + HandlerType: (*AuthServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "AuthEnable", + Handler: _Auth_AuthEnable_Handler, + }, + { + MethodName: "AuthDisable", + Handler: _Auth_AuthDisable_Handler, + }, + { + MethodName: "Authenticate", + Handler: _Auth_Authenticate_Handler, + }, + { + MethodName: "UserAdd", + Handler: _Auth_UserAdd_Handler, + }, + { + MethodName: "UserGet", + Handler: _Auth_UserGet_Handler, + }, + { + MethodName: "UserList", + Handler: _Auth_UserList_Handler, + }, + { + MethodName: "UserDelete", + Handler: _Auth_UserDelete_Handler, + }, + { + MethodName: "UserChangePassword", + Handler: _Auth_UserChangePassword_Handler, + }, + { + MethodName: "UserGrantRole", + Handler: _Auth_UserGrantRole_Handler, + }, + { + MethodName: "UserRevokeRole", + Handler: _Auth_UserRevokeRole_Handler, + }, + { + MethodName: "RoleAdd", + Handler: _Auth_RoleAdd_Handler, + }, + { + MethodName: "RoleGet", + Handler: _Auth_RoleGet_Handler, + }, + { + MethodName: "RoleList", + Handler: _Auth_RoleList_Handler, + }, + { + MethodName: "RoleDelete", + Handler: _Auth_RoleDelete_Handler, + }, + { + MethodName: "RoleGrantPermission", + Handler: _Auth_RoleGrantPermission_Handler, + }, + { + MethodName: "RoleRevokePermission", + Handler: _Auth_RoleRevokePermission_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "rpc.proto", +} + +func (m *ResponseHeader) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseHeader) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ClusterId != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ClusterId)) + } + if m.MemberId != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.MemberId)) + } + if m.Revision != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Revision)) + } + if m.RaftTerm != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.RaftTerm)) + } + return i, nil +} + +func (m *RangeRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RangeRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if len(m.RangeEnd) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.RangeEnd))) + i += copy(dAtA[i:], m.RangeEnd) + } + if m.Limit != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Limit)) + } + if m.Revision != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Revision)) + } + if m.SortOrder != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.SortOrder)) + } + if m.SortTarget != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.SortTarget)) + } + if m.Serializable { + dAtA[i] = 0x38 + i++ + if m.Serializable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.KeysOnly { + dAtA[i] = 0x40 + i++ + if m.KeysOnly { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.CountOnly { + dAtA[i] = 0x48 + i++ + if m.CountOnly { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.MinModRevision != 0 { + dAtA[i] = 0x50 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.MinModRevision)) + } + if m.MaxModRevision != 0 { + dAtA[i] = 0x58 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.MaxModRevision)) + } + if m.MinCreateRevision != 0 { + dAtA[i] = 0x60 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.MinCreateRevision)) + } + if m.MaxCreateRevision != 0 { + dAtA[i] = 0x68 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.MaxCreateRevision)) + } + return i, nil +} + +func (m *RangeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RangeResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n1, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if len(m.Kvs) > 0 { + for _, msg := range m.Kvs { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.More { + dAtA[i] = 0x18 + i++ + if m.More { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Count != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Count)) + } + return i, nil +} + +func (m *PutRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PutRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if len(m.Value) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if m.Lease != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Lease)) + } + if m.PrevKv { + dAtA[i] = 0x20 + i++ + if m.PrevKv { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.IgnoreValue { + dAtA[i] = 0x28 + i++ + if m.IgnoreValue { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.IgnoreLease { + dAtA[i] = 0x30 + i++ + if m.IgnoreLease { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *PutResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PutResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n2, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + if m.PrevKv != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.PrevKv.Size())) + n3, err := m.PrevKv.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + return i, nil +} + +func (m *DeleteRangeRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeleteRangeRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if len(m.RangeEnd) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.RangeEnd))) + i += copy(dAtA[i:], m.RangeEnd) + } + if m.PrevKv { + dAtA[i] = 0x18 + i++ + if m.PrevKv { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *DeleteRangeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeleteRangeResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n4, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + if m.Deleted != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Deleted)) + } + if len(m.PrevKvs) > 0 { + for _, msg := range m.PrevKvs { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *RequestOp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestOp) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Request != nil { + nn5, err := m.Request.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += nn5 + } + return i, nil +} + +func (m *RequestOp_RequestRange) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.RequestRange != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.RequestRange.Size())) + n6, err := m.RequestRange.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + } + return i, nil +} +func (m *RequestOp_RequestPut) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.RequestPut != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.RequestPut.Size())) + n7, err := m.RequestPut.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + return i, nil +} +func (m *RequestOp_RequestDeleteRange) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.RequestDeleteRange != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.RequestDeleteRange.Size())) + n8, err := m.RequestDeleteRange.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + } + return i, nil +} +func (m *RequestOp_RequestTxn) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.RequestTxn != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.RequestTxn.Size())) + n9, err := m.RequestTxn.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 + } + return i, nil +} +func (m *ResponseOp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseOp) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Response != nil { + nn10, err := m.Response.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += nn10 + } + return i, nil +} + +func (m *ResponseOp_ResponseRange) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.ResponseRange != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ResponseRange.Size())) + n11, err := m.ResponseRange.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 + } + return i, nil +} +func (m *ResponseOp_ResponsePut) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.ResponsePut != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ResponsePut.Size())) + n12, err := m.ResponsePut.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + } + return i, nil +} +func (m *ResponseOp_ResponseDeleteRange) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.ResponseDeleteRange != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ResponseDeleteRange.Size())) + n13, err := m.ResponseDeleteRange.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n13 + } + return i, nil +} +func (m *ResponseOp_ResponseTxn) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.ResponseTxn != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ResponseTxn.Size())) + n14, err := m.ResponseTxn.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n14 + } + return i, nil +} +func (m *Compare) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Compare) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Result != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Result)) + } + if m.Target != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Target)) + } + if len(m.Key) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if m.TargetUnion != nil { + nn15, err := m.TargetUnion.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += nn15 + } + if len(m.RangeEnd) > 0 { + dAtA[i] = 0x82 + i++ + dAtA[i] = 0x4 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.RangeEnd))) + i += copy(dAtA[i:], m.RangeEnd) + } + return i, nil +} + +func (m *Compare_Version) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x20 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Version)) + return i, nil +} +func (m *Compare_CreateRevision) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x28 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.CreateRevision)) + return i, nil +} +func (m *Compare_ModRevision) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x30 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ModRevision)) + return i, nil +} +func (m *Compare_Value) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.Value != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + return i, nil +} +func (m *Compare_Lease) MarshalTo(dAtA []byte) (int, error) { + i := 0 + dAtA[i] = 0x40 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Lease)) + return i, nil +} +func (m *TxnRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxnRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Compare) > 0 { + for _, msg := range m.Compare { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Success) > 0 { + for _, msg := range m.Success { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Failure) > 0 { + for _, msg := range m.Failure { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *TxnResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxnResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n16, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n16 + } + if m.Succeeded { + dAtA[i] = 0x10 + i++ + if m.Succeeded { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if len(m.Responses) > 0 { + for _, msg := range m.Responses { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *CompactionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CompactionRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Revision != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Revision)) + } + if m.Physical { + dAtA[i] = 0x10 + i++ + if m.Physical { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *CompactionResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CompactionResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n17, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n17 + } + return i, nil +} + +func (m *HashRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HashRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *HashKVRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HashKVRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Revision != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Revision)) + } + return i, nil +} + +func (m *HashKVResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HashKVResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n18, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n18 + } + if m.Hash != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Hash)) + } + if m.CompactRevision != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.CompactRevision)) + } + return i, nil +} + +func (m *HashResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HashResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n19, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n19 + } + if m.Hash != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Hash)) + } + return i, nil +} + +func (m *SnapshotRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SnapshotRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *SnapshotResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SnapshotResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n20, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n20 + } + if m.RemainingBytes != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.RemainingBytes)) + } + if len(m.Blob) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Blob))) + i += copy(dAtA[i:], m.Blob) + } + return i, nil +} + +func (m *WatchRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WatchRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.RequestUnion != nil { + nn21, err := m.RequestUnion.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += nn21 + } + return i, nil +} + +func (m *WatchRequest_CreateRequest) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.CreateRequest != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.CreateRequest.Size())) + n22, err := m.CreateRequest.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n22 + } + return i, nil +} +func (m *WatchRequest_CancelRequest) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.CancelRequest != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.CancelRequest.Size())) + n23, err := m.CancelRequest.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n23 + } + return i, nil +} +func (m *WatchRequest_ProgressRequest) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.ProgressRequest != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ProgressRequest.Size())) + n24, err := m.ProgressRequest.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n24 + } + return i, nil +} +func (m *WatchCreateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WatchCreateRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if len(m.RangeEnd) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.RangeEnd))) + i += copy(dAtA[i:], m.RangeEnd) + } + if m.StartRevision != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.StartRevision)) + } + if m.ProgressNotify { + dAtA[i] = 0x20 + i++ + if m.ProgressNotify { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if len(m.Filters) > 0 { + dAtA26 := make([]byte, len(m.Filters)*10) + var j25 int + for _, num := range m.Filters { + for num >= 1<<7 { + dAtA26[j25] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j25++ + } + dAtA26[j25] = uint8(num) + j25++ + } + dAtA[i] = 0x2a + i++ + i = encodeVarintRpc(dAtA, i, uint64(j25)) + i += copy(dAtA[i:], dAtA26[:j25]) + } + if m.PrevKv { + dAtA[i] = 0x30 + i++ + if m.PrevKv { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.WatchId != 0 { + dAtA[i] = 0x38 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.WatchId)) + } + if m.Fragment { + dAtA[i] = 0x40 + i++ + if m.Fragment { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *WatchCancelRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WatchCancelRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.WatchId != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.WatchId)) + } + return i, nil +} + +func (m *WatchProgressRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WatchProgressRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *WatchResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WatchResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n27, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n27 + } + if m.WatchId != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.WatchId)) + } + if m.Created { + dAtA[i] = 0x18 + i++ + if m.Created { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Canceled { + dAtA[i] = 0x20 + i++ + if m.Canceled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.CompactRevision != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.CompactRevision)) + } + if len(m.CancelReason) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.CancelReason))) + i += copy(dAtA[i:], m.CancelReason) + } + if m.Fragment { + dAtA[i] = 0x38 + i++ + if m.Fragment { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if len(m.Events) > 0 { + for _, msg := range m.Events { + dAtA[i] = 0x5a + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *LeaseGrantRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseGrantRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.TTL != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.TTL)) + } + if m.ID != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + return i, nil +} + +func (m *LeaseGrantResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseGrantResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n28, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n28 + } + if m.ID != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + if m.TTL != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.TTL)) + } + if len(m.Error) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Error))) + i += copy(dAtA[i:], m.Error) + } + return i, nil +} + +func (m *LeaseRevokeRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseRevokeRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + return i, nil +} + +func (m *LeaseRevokeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseRevokeResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n29, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n29 + } + return i, nil +} + +func (m *LeaseCheckpoint) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseCheckpoint) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + if m.Remaining_TTL != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Remaining_TTL)) + } + return i, nil +} + +func (m *LeaseCheckpointRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseCheckpointRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Checkpoints) > 0 { + for _, msg := range m.Checkpoints { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *LeaseCheckpointResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseCheckpointResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n30, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n30 + } + return i, nil +} + +func (m *LeaseKeepAliveRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseKeepAliveRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + return i, nil +} + +func (m *LeaseKeepAliveResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseKeepAliveResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n31, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n31 + } + if m.ID != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + if m.TTL != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.TTL)) + } + return i, nil +} + +func (m *LeaseTimeToLiveRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseTimeToLiveRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + if m.Keys { + dAtA[i] = 0x10 + i++ + if m.Keys { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *LeaseTimeToLiveResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseTimeToLiveResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n32, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n32 + } + if m.ID != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + if m.TTL != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.TTL)) + } + if m.GrantedTTL != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.GrantedTTL)) + } + if len(m.Keys) > 0 { + for _, b := range m.Keys { + dAtA[i] = 0x2a + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(b))) + i += copy(dAtA[i:], b) + } + } + return i, nil +} + +func (m *LeaseLeasesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseLeasesRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *LeaseStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + return i, nil +} + +func (m *LeaseLeasesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseLeasesResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n33, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n33 + } + if len(m.Leases) > 0 { + for _, msg := range m.Leases { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Member) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Member) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + if len(m.Name) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if len(m.PeerURLs) > 0 { + for _, s := range m.PeerURLs { + dAtA[i] = 0x1a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.ClientURLs) > 0 { + for _, s := range m.ClientURLs { + dAtA[i] = 0x22 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if m.IsLearner { + dAtA[i] = 0x28 + i++ + if m.IsLearner { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *MemberAddRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MemberAddRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.PeerURLs) > 0 { + for _, s := range m.PeerURLs { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if m.IsLearner { + dAtA[i] = 0x10 + i++ + if m.IsLearner { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *MemberAddResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MemberAddResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n34, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n34 + } + if m.Member != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Member.Size())) + n35, err := m.Member.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n35 + } + if len(m.Members) > 0 { + for _, msg := range m.Members { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *MemberRemoveRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MemberRemoveRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + return i, nil +} + +func (m *MemberRemoveResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MemberRemoveResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n36, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n36 + } + if len(m.Members) > 0 { + for _, msg := range m.Members { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *MemberUpdateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MemberUpdateRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + if len(m.PeerURLs) > 0 { + for _, s := range m.PeerURLs { + dAtA[i] = 0x12 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *MemberUpdateResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MemberUpdateResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n37, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n37 + } + if len(m.Members) > 0 { + for _, msg := range m.Members { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *MemberListRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MemberListRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *MemberListResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MemberListResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n38, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n38 + } + if len(m.Members) > 0 { + for _, msg := range m.Members { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *MemberPromoteRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MemberPromoteRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + return i, nil +} + +func (m *MemberPromoteResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MemberPromoteResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n39, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n39 + } + if len(m.Members) > 0 { + for _, msg := range m.Members { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *DefragmentRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DefragmentRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *DefragmentResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DefragmentResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n40, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n40 + } + return i, nil +} + +func (m *MoveLeaderRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MoveLeaderRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.TargetID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.TargetID)) + } + return i, nil +} + +func (m *MoveLeaderResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MoveLeaderResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n41, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n41 + } + return i, nil +} + +func (m *AlarmRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AlarmRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Action != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Action)) + } + if m.MemberID != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.MemberID)) + } + if m.Alarm != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Alarm)) + } + return i, nil +} + +func (m *AlarmMember) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AlarmMember) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.MemberID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.MemberID)) + } + if m.Alarm != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Alarm)) + } + return i, nil +} + +func (m *AlarmResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AlarmResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n42, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n42 + } + if len(m.Alarms) > 0 { + for _, msg := range m.Alarms { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *StatusRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *StatusResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StatusResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n43, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n43 + } + if len(m.Version) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Version))) + i += copy(dAtA[i:], m.Version) + } + if m.DbSize != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.DbSize)) + } + if m.Leader != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Leader)) + } + if m.RaftIndex != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.RaftIndex)) + } + if m.RaftTerm != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.RaftTerm)) + } + if m.RaftAppliedIndex != 0 { + dAtA[i] = 0x38 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.RaftAppliedIndex)) + } + if len(m.Errors) > 0 { + for _, s := range m.Errors { + dAtA[i] = 0x42 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if m.DbSizeInUse != 0 { + dAtA[i] = 0x48 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.DbSizeInUse)) + } + if m.IsLearner { + dAtA[i] = 0x50 + i++ + if m.IsLearner { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *AuthEnableRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthEnableRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *AuthDisableRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthDisableRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *AuthenticateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthenticateRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if len(m.Password) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Password))) + i += copy(dAtA[i:], m.Password) + } + return i, nil +} + +func (m *AuthUserAddRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserAddRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if len(m.Password) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Password))) + i += copy(dAtA[i:], m.Password) + } + if m.Options != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Options.Size())) + n44, err := m.Options.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n44 + } + return i, nil +} + +func (m *AuthUserGetRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserGetRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + return i, nil +} + +func (m *AuthUserDeleteRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserDeleteRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + return i, nil +} + +func (m *AuthUserChangePasswordRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserChangePasswordRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if len(m.Password) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Password))) + i += copy(dAtA[i:], m.Password) + } + return i, nil +} + +func (m *AuthUserGrantRoleRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserGrantRoleRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.User) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.User))) + i += copy(dAtA[i:], m.User) + } + if len(m.Role) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Role))) + i += copy(dAtA[i:], m.Role) + } + return i, nil +} + +func (m *AuthUserRevokeRoleRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserRevokeRoleRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if len(m.Role) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Role))) + i += copy(dAtA[i:], m.Role) + } + return i, nil +} + +func (m *AuthRoleAddRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleAddRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + return i, nil +} + +func (m *AuthRoleGetRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleGetRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Role) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Role))) + i += copy(dAtA[i:], m.Role) + } + return i, nil +} + +func (m *AuthUserListRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserListRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *AuthRoleListRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleListRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *AuthRoleDeleteRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleDeleteRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Role) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Role))) + i += copy(dAtA[i:], m.Role) + } + return i, nil +} + +func (m *AuthRoleGrantPermissionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleGrantPermissionRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if m.Perm != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Perm.Size())) + n45, err := m.Perm.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n45 + } + return i, nil +} + +func (m *AuthRoleRevokePermissionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleRevokePermissionRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Role) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Role))) + i += copy(dAtA[i:], m.Role) + } + if len(m.Key) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if len(m.RangeEnd) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.RangeEnd))) + i += copy(dAtA[i:], m.RangeEnd) + } + return i, nil +} + +func (m *AuthEnableResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthEnableResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n46, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n46 + } + return i, nil +} + +func (m *AuthDisableResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthDisableResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n47, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n47 + } + return i, nil +} + +func (m *AuthenticateResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthenticateResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n48, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n48 + } + if len(m.Token) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Token))) + i += copy(dAtA[i:], m.Token) + } + return i, nil +} + +func (m *AuthUserAddResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserAddResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n49, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n49 + } + return i, nil +} + +func (m *AuthUserGetResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserGetResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n50, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n50 + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + dAtA[i] = 0x12 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *AuthUserDeleteResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserDeleteResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n51, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n51 + } + return i, nil +} + +func (m *AuthUserChangePasswordResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserChangePasswordResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n52, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n52 + } + return i, nil +} + +func (m *AuthUserGrantRoleResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserGrantRoleResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n53, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n53 + } + return i, nil +} + +func (m *AuthUserRevokeRoleResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserRevokeRoleResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n54, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n54 + } + return i, nil +} + +func (m *AuthRoleAddResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleAddResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n55, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n55 + } + return i, nil +} + +func (m *AuthRoleGetResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleGetResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n56, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n56 + } + if len(m.Perm) > 0 { + for _, msg := range m.Perm { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *AuthRoleListResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleListResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n57, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n57 + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + dAtA[i] = 0x12 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *AuthUserListResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthUserListResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n58, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n58 + } + if len(m.Users) > 0 { + for _, s := range m.Users { + dAtA[i] = 0x12 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *AuthRoleDeleteResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleDeleteResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n59, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n59 + } + return i, nil +} + +func (m *AuthRoleGrantPermissionResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleGrantPermissionResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n60, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n60 + } + return i, nil +} + +func (m *AuthRoleRevokePermissionResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AuthRoleRevokePermissionResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n61, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n61 + } + return i, nil +} + +func encodeVarintRpc(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *ResponseHeader) Size() (n int) { + var l int + _ = l + if m.ClusterId != 0 { + n += 1 + sovRpc(uint64(m.ClusterId)) + } + if m.MemberId != 0 { + n += 1 + sovRpc(uint64(m.MemberId)) + } + if m.Revision != 0 { + n += 1 + sovRpc(uint64(m.Revision)) + } + if m.RaftTerm != 0 { + n += 1 + sovRpc(uint64(m.RaftTerm)) + } + return n +} + +func (m *RangeRequest) Size() (n int) { + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.RangeEnd) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.Limit != 0 { + n += 1 + sovRpc(uint64(m.Limit)) + } + if m.Revision != 0 { + n += 1 + sovRpc(uint64(m.Revision)) + } + if m.SortOrder != 0 { + n += 1 + sovRpc(uint64(m.SortOrder)) + } + if m.SortTarget != 0 { + n += 1 + sovRpc(uint64(m.SortTarget)) + } + if m.Serializable { + n += 2 + } + if m.KeysOnly { + n += 2 + } + if m.CountOnly { + n += 2 + } + if m.MinModRevision != 0 { + n += 1 + sovRpc(uint64(m.MinModRevision)) + } + if m.MaxModRevision != 0 { + n += 1 + sovRpc(uint64(m.MaxModRevision)) + } + if m.MinCreateRevision != 0 { + n += 1 + sovRpc(uint64(m.MinCreateRevision)) + } + if m.MaxCreateRevision != 0 { + n += 1 + sovRpc(uint64(m.MaxCreateRevision)) + } + return n +} + +func (m *RangeResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Kvs) > 0 { + for _, e := range m.Kvs { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + if m.More { + n += 2 + } + if m.Count != 0 { + n += 1 + sovRpc(uint64(m.Count)) + } + return n +} + +func (m *PutRequest) Size() (n int) { + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.Lease != 0 { + n += 1 + sovRpc(uint64(m.Lease)) + } + if m.PrevKv { + n += 2 + } + if m.IgnoreValue { + n += 2 + } + if m.IgnoreLease { + n += 2 + } + return n +} + +func (m *PutResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.PrevKv != nil { + l = m.PrevKv.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *DeleteRangeRequest) Size() (n int) { + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.RangeEnd) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.PrevKv { + n += 2 + } + return n +} + +func (m *DeleteRangeResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.Deleted != 0 { + n += 1 + sovRpc(uint64(m.Deleted)) + } + if len(m.PrevKvs) > 0 { + for _, e := range m.PrevKvs { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *RequestOp) Size() (n int) { + var l int + _ = l + if m.Request != nil { + n += m.Request.Size() + } + return n +} + +func (m *RequestOp_RequestRange) Size() (n int) { + var l int + _ = l + if m.RequestRange != nil { + l = m.RequestRange.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *RequestOp_RequestPut) Size() (n int) { + var l int + _ = l + if m.RequestPut != nil { + l = m.RequestPut.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *RequestOp_RequestDeleteRange) Size() (n int) { + var l int + _ = l + if m.RequestDeleteRange != nil { + l = m.RequestDeleteRange.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *RequestOp_RequestTxn) Size() (n int) { + var l int + _ = l + if m.RequestTxn != nil { + l = m.RequestTxn.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *ResponseOp) Size() (n int) { + var l int + _ = l + if m.Response != nil { + n += m.Response.Size() + } + return n +} + +func (m *ResponseOp_ResponseRange) Size() (n int) { + var l int + _ = l + if m.ResponseRange != nil { + l = m.ResponseRange.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *ResponseOp_ResponsePut) Size() (n int) { + var l int + _ = l + if m.ResponsePut != nil { + l = m.ResponsePut.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *ResponseOp_ResponseDeleteRange) Size() (n int) { + var l int + _ = l + if m.ResponseDeleteRange != nil { + l = m.ResponseDeleteRange.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *ResponseOp_ResponseTxn) Size() (n int) { + var l int + _ = l + if m.ResponseTxn != nil { + l = m.ResponseTxn.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *Compare) Size() (n int) { + var l int + _ = l + if m.Result != 0 { + n += 1 + sovRpc(uint64(m.Result)) + } + if m.Target != 0 { + n += 1 + sovRpc(uint64(m.Target)) + } + l = len(m.Key) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.TargetUnion != nil { + n += m.TargetUnion.Size() + } + l = len(m.RangeEnd) + if l > 0 { + n += 2 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *Compare_Version) Size() (n int) { + var l int + _ = l + n += 1 + sovRpc(uint64(m.Version)) + return n +} +func (m *Compare_CreateRevision) Size() (n int) { + var l int + _ = l + n += 1 + sovRpc(uint64(m.CreateRevision)) + return n +} +func (m *Compare_ModRevision) Size() (n int) { + var l int + _ = l + n += 1 + sovRpc(uint64(m.ModRevision)) + return n +} +func (m *Compare_Value) Size() (n int) { + var l int + _ = l + if m.Value != nil { + l = len(m.Value) + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *Compare_Lease) Size() (n int) { + var l int + _ = l + n += 1 + sovRpc(uint64(m.Lease)) + return n +} +func (m *TxnRequest) Size() (n int) { + var l int + _ = l + if len(m.Compare) > 0 { + for _, e := range m.Compare { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + if len(m.Success) > 0 { + for _, e := range m.Success { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + if len(m.Failure) > 0 { + for _, e := range m.Failure { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *TxnResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.Succeeded { + n += 2 + } + if len(m.Responses) > 0 { + for _, e := range m.Responses { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *CompactionRequest) Size() (n int) { + var l int + _ = l + if m.Revision != 0 { + n += 1 + sovRpc(uint64(m.Revision)) + } + if m.Physical { + n += 2 + } + return n +} + +func (m *CompactionResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *HashRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *HashKVRequest) Size() (n int) { + var l int + _ = l + if m.Revision != 0 { + n += 1 + sovRpc(uint64(m.Revision)) + } + return n +} + +func (m *HashKVResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.Hash != 0 { + n += 1 + sovRpc(uint64(m.Hash)) + } + if m.CompactRevision != 0 { + n += 1 + sovRpc(uint64(m.CompactRevision)) + } + return n +} + +func (m *HashResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.Hash != 0 { + n += 1 + sovRpc(uint64(m.Hash)) + } + return n +} + +func (m *SnapshotRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *SnapshotResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.RemainingBytes != 0 { + n += 1 + sovRpc(uint64(m.RemainingBytes)) + } + l = len(m.Blob) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *WatchRequest) Size() (n int) { + var l int + _ = l + if m.RequestUnion != nil { + n += m.RequestUnion.Size() + } + return n +} + +func (m *WatchRequest_CreateRequest) Size() (n int) { + var l int + _ = l + if m.CreateRequest != nil { + l = m.CreateRequest.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *WatchRequest_CancelRequest) Size() (n int) { + var l int + _ = l + if m.CancelRequest != nil { + l = m.CancelRequest.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *WatchRequest_ProgressRequest) Size() (n int) { + var l int + _ = l + if m.ProgressRequest != nil { + l = m.ProgressRequest.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} +func (m *WatchCreateRequest) Size() (n int) { + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.RangeEnd) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.StartRevision != 0 { + n += 1 + sovRpc(uint64(m.StartRevision)) + } + if m.ProgressNotify { + n += 2 + } + if len(m.Filters) > 0 { + l = 0 + for _, e := range m.Filters { + l += sovRpc(uint64(e)) + } + n += 1 + sovRpc(uint64(l)) + l + } + if m.PrevKv { + n += 2 + } + if m.WatchId != 0 { + n += 1 + sovRpc(uint64(m.WatchId)) + } + if m.Fragment { + n += 2 + } + return n +} + +func (m *WatchCancelRequest) Size() (n int) { + var l int + _ = l + if m.WatchId != 0 { + n += 1 + sovRpc(uint64(m.WatchId)) + } + return n +} + +func (m *WatchProgressRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *WatchResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.WatchId != 0 { + n += 1 + sovRpc(uint64(m.WatchId)) + } + if m.Created { + n += 2 + } + if m.Canceled { + n += 2 + } + if m.CompactRevision != 0 { + n += 1 + sovRpc(uint64(m.CompactRevision)) + } + l = len(m.CancelReason) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.Fragment { + n += 2 + } + if len(m.Events) > 0 { + for _, e := range m.Events { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *LeaseGrantRequest) Size() (n int) { + var l int + _ = l + if m.TTL != 0 { + n += 1 + sovRpc(uint64(m.TTL)) + } + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + return n +} + +func (m *LeaseGrantResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + if m.TTL != 0 { + n += 1 + sovRpc(uint64(m.TTL)) + } + l = len(m.Error) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *LeaseRevokeRequest) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + return n +} + +func (m *LeaseRevokeResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *LeaseCheckpoint) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + if m.Remaining_TTL != 0 { + n += 1 + sovRpc(uint64(m.Remaining_TTL)) + } + return n +} + +func (m *LeaseCheckpointRequest) Size() (n int) { + var l int + _ = l + if len(m.Checkpoints) > 0 { + for _, e := range m.Checkpoints { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *LeaseCheckpointResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *LeaseKeepAliveRequest) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + return n +} + +func (m *LeaseKeepAliveResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + if m.TTL != 0 { + n += 1 + sovRpc(uint64(m.TTL)) + } + return n +} + +func (m *LeaseTimeToLiveRequest) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + if m.Keys { + n += 2 + } + return n +} + +func (m *LeaseTimeToLiveResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + if m.TTL != 0 { + n += 1 + sovRpc(uint64(m.TTL)) + } + if m.GrantedTTL != 0 { + n += 1 + sovRpc(uint64(m.GrantedTTL)) + } + if len(m.Keys) > 0 { + for _, b := range m.Keys { + l = len(b) + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *LeaseLeasesRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *LeaseStatus) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + return n +} + +func (m *LeaseLeasesResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Leases) > 0 { + for _, e := range m.Leases { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *Member) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.PeerURLs) > 0 { + for _, s := range m.PeerURLs { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } + if len(m.ClientURLs) > 0 { + for _, s := range m.ClientURLs { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } + if m.IsLearner { + n += 2 + } + return n +} + +func (m *MemberAddRequest) Size() (n int) { + var l int + _ = l + if len(m.PeerURLs) > 0 { + for _, s := range m.PeerURLs { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } + if m.IsLearner { + n += 2 + } + return n +} + +func (m *MemberAddResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.Member != nil { + l = m.Member.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Members) > 0 { + for _, e := range m.Members { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *MemberRemoveRequest) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + return n +} + +func (m *MemberRemoveResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Members) > 0 { + for _, e := range m.Members { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *MemberUpdateRequest) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + if len(m.PeerURLs) > 0 { + for _, s := range m.PeerURLs { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *MemberUpdateResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Members) > 0 { + for _, e := range m.Members { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *MemberListRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *MemberListResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Members) > 0 { + for _, e := range m.Members { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *MemberPromoteRequest) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + return n +} + +func (m *MemberPromoteResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Members) > 0 { + for _, e := range m.Members { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *DefragmentRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *DefragmentResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *MoveLeaderRequest) Size() (n int) { + var l int + _ = l + if m.TargetID != 0 { + n += 1 + sovRpc(uint64(m.TargetID)) + } + return n +} + +func (m *MoveLeaderResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AlarmRequest) Size() (n int) { + var l int + _ = l + if m.Action != 0 { + n += 1 + sovRpc(uint64(m.Action)) + } + if m.MemberID != 0 { + n += 1 + sovRpc(uint64(m.MemberID)) + } + if m.Alarm != 0 { + n += 1 + sovRpc(uint64(m.Alarm)) + } + return n +} + +func (m *AlarmMember) Size() (n int) { + var l int + _ = l + if m.MemberID != 0 { + n += 1 + sovRpc(uint64(m.MemberID)) + } + if m.Alarm != 0 { + n += 1 + sovRpc(uint64(m.Alarm)) + } + return n +} + +func (m *AlarmResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Alarms) > 0 { + for _, e := range m.Alarms { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *StatusRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *StatusResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.Version) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.DbSize != 0 { + n += 1 + sovRpc(uint64(m.DbSize)) + } + if m.Leader != 0 { + n += 1 + sovRpc(uint64(m.Leader)) + } + if m.RaftIndex != 0 { + n += 1 + sovRpc(uint64(m.RaftIndex)) + } + if m.RaftTerm != 0 { + n += 1 + sovRpc(uint64(m.RaftTerm)) + } + if m.RaftAppliedIndex != 0 { + n += 1 + sovRpc(uint64(m.RaftAppliedIndex)) + } + if len(m.Errors) > 0 { + for _, s := range m.Errors { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } + if m.DbSizeInUse != 0 { + n += 1 + sovRpc(uint64(m.DbSizeInUse)) + } + if m.IsLearner { + n += 2 + } + return n +} + +func (m *AuthEnableRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *AuthDisableRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *AuthenticateRequest) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.Password) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserAddRequest) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.Password) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.Options != nil { + l = m.Options.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserGetRequest) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserDeleteRequest) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserChangePasswordRequest) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.Password) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserGrantRoleRequest) Size() (n int) { + var l int + _ = l + l = len(m.User) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.Role) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserRevokeRoleRequest) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.Role) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthRoleAddRequest) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthRoleGetRequest) Size() (n int) { + var l int + _ = l + l = len(m.Role) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserListRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *AuthRoleListRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *AuthRoleDeleteRequest) Size() (n int) { + var l int + _ = l + l = len(m.Role) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthRoleGrantPermissionRequest) Size() (n int) { + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.Perm != nil { + l = m.Perm.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthRoleRevokePermissionRequest) Size() (n int) { + var l int + _ = l + l = len(m.Role) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.Key) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.RangeEnd) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthEnableResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthDisableResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthenticateResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + l = len(m.Token) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserAddResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserGetResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *AuthUserDeleteResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserChangePasswordResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserGrantRoleResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthUserRevokeRoleResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthRoleAddResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthRoleGetResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Perm) > 0 { + for _, e := range m.Perm { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *AuthRoleListResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *AuthUserListResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Users) > 0 { + for _, s := range m.Users { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *AuthRoleDeleteResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthRoleGrantPermissionResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func (m *AuthRoleRevokePermissionResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + +func sovRpc(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozRpc(x uint64) (n int) { + return sovRpc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *ResponseHeader) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseHeader: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseHeader: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + m.ClusterId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ClusterId |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemberId", wireType) + } + m.MemberId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MemberId |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + } + m.Revision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Revision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RaftTerm", wireType) + } + m.RaftTerm = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RaftTerm |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RangeRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RangeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RangeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RangeEnd", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RangeEnd = append(m.RangeEnd[:0], dAtA[iNdEx:postIndex]...) + if m.RangeEnd == nil { + m.RangeEnd = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + } + m.Revision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Revision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SortOrder", wireType) + } + m.SortOrder = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SortOrder |= (RangeRequest_SortOrder(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SortTarget", wireType) + } + m.SortTarget = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SortTarget |= (RangeRequest_SortTarget(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Serializable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Serializable = bool(v != 0) + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field KeysOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.KeysOnly = bool(v != 0) + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CountOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CountOnly = bool(v != 0) + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinModRevision", wireType) + } + m.MinModRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MinModRevision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxModRevision", wireType) + } + m.MaxModRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxModRevision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinCreateRevision", wireType) + } + m.MinCreateRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MinCreateRevision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxCreateRevision", wireType) + } + m.MaxCreateRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxCreateRevision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RangeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RangeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RangeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kvs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kvs = append(m.Kvs, &mvccpb.KeyValue{}) + if err := m.Kvs[len(m.Kvs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field More", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.More = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Count", wireType) + } + m.Count = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Count |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PutRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PutRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PutRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Lease", wireType) + } + m.Lease = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Lease |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PrevKv = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoreValue", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IgnoreValue = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoreLease", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IgnoreLease = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PutResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PutResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PutResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PrevKv == nil { + m.PrevKv = &mvccpb.KeyValue{} + } + if err := m.PrevKv.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeleteRangeRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeleteRangeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeleteRangeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RangeEnd", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RangeEnd = append(m.RangeEnd[:0], dAtA[iNdEx:postIndex]...) + if m.RangeEnd == nil { + m.RangeEnd = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PrevKv = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeleteRangeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeleteRangeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeleteRangeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Deleted", wireType) + } + m.Deleted = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Deleted |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKvs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrevKvs = append(m.PrevKvs, &mvccpb.KeyValue{}) + if err := m.PrevKvs[len(m.PrevKvs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RequestOp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestOp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestOp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestRange", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RangeRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Request = &RequestOp_RequestRange{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestPut", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &PutRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Request = &RequestOp_RequestPut{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestDeleteRange", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &DeleteRangeRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Request = &RequestOp_RequestDeleteRange{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestTxn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &TxnRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Request = &RequestOp_RequestTxn{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseOp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseOp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseOp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponseRange", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RangeResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Response = &ResponseOp_ResponseRange{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponsePut", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &PutResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Response = &ResponseOp_ResponsePut{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponseDeleteRange", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &DeleteRangeResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Response = &ResponseOp_ResponseDeleteRange{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponseTxn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &TxnResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Response = &ResponseOp_ResponseTxn{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Compare) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Compare: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Compare: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + } + m.Result = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Result |= (Compare_CompareResult(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + m.Target = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Target |= (Compare_CompareTarget(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.TargetUnion = &Compare_Version{v} + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateRevision", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.TargetUnion = &Compare_CreateRevision{v} + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ModRevision", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.TargetUnion = &Compare_ModRevision{v} + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := make([]byte, postIndex-iNdEx) + copy(v, dAtA[iNdEx:postIndex]) + m.TargetUnion = &Compare_Value{v} + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Lease", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.TargetUnion = &Compare_Lease{v} + case 64: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RangeEnd", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RangeEnd = append(m.RangeEnd[:0], dAtA[iNdEx:postIndex]...) + if m.RangeEnd == nil { + m.RangeEnd = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxnRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxnRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxnRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Compare", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Compare = append(m.Compare, &Compare{}) + if err := m.Compare[len(m.Compare)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Success", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Success = append(m.Success, &RequestOp{}) + if err := m.Success[len(m.Success)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Failure", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Failure = append(m.Failure, &RequestOp{}) + if err := m.Failure[len(m.Failure)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxnResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxnResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxnResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Succeeded", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Succeeded = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Responses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Responses = append(m.Responses, &ResponseOp{}) + if err := m.Responses[len(m.Responses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CompactionRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CompactionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CompactionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + } + m.Revision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Revision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Physical", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Physical = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CompactionResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CompactionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CompactionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HashRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HashRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HashRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HashKVRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HashKVRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HashKVRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + } + m.Revision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Revision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HashKVResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HashKVResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HashKVResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + m.Hash = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Hash |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CompactRevision", wireType) + } + m.CompactRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CompactRevision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HashResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HashResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HashResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + m.Hash = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Hash |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SnapshotRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SnapshotRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SnapshotRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SnapshotResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SnapshotResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SnapshotResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RemainingBytes", wireType) + } + m.RemainingBytes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RemainingBytes |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Blob", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Blob = append(m.Blob[:0], dAtA[iNdEx:postIndex]...) + if m.Blob == nil { + m.Blob = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WatchRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WatchRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WatchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &WatchCreateRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.RequestUnion = &WatchRequest_CreateRequest{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CancelRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &WatchCancelRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.RequestUnion = &WatchRequest_CancelRequest{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProgressRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &WatchProgressRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.RequestUnion = &WatchRequest_ProgressRequest{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WatchCreateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WatchCreateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WatchCreateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RangeEnd", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RangeEnd = append(m.RangeEnd[:0], dAtA[iNdEx:postIndex]...) + if m.RangeEnd == nil { + m.RangeEnd = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartRevision", wireType) + } + m.StartRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.StartRevision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ProgressNotify", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ProgressNotify = bool(v != 0) + case 5: + if wireType == 0 { + var v WatchCreateRequest_FilterType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (WatchCreateRequest_FilterType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Filters = append(m.Filters, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v WatchCreateRequest_FilterType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (WatchCreateRequest_FilterType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Filters = append(m.Filters, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Filters", wireType) + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PrevKv = bool(v != 0) + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field WatchId", wireType) + } + m.WatchId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.WatchId |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Fragment", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Fragment = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WatchCancelRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WatchCancelRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WatchCancelRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field WatchId", wireType) + } + m.WatchId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.WatchId |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WatchProgressRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WatchProgressRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WatchProgressRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WatchResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WatchResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WatchResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field WatchId", wireType) + } + m.WatchId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.WatchId |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Created", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Created = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Canceled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Canceled = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CompactRevision", wireType) + } + m.CompactRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CompactRevision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CancelReason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CancelReason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Fragment", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Fragment = bool(v != 0) + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Events", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Events = append(m.Events, &mvccpb.Event{}) + if err := m.Events[len(m.Events)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseGrantRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseGrantRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseGrantRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TTL", wireType) + } + m.TTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TTL |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseGrantResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseGrantResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseGrantResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TTL", wireType) + } + m.TTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TTL |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseRevokeRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseRevokeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseRevokeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseRevokeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseRevokeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseRevokeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseCheckpoint) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseCheckpoint: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseCheckpoint: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Remaining_TTL", wireType) + } + m.Remaining_TTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Remaining_TTL |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseCheckpointRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseCheckpointRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseCheckpointRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Checkpoints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Checkpoints = append(m.Checkpoints, &LeaseCheckpoint{}) + if err := m.Checkpoints[len(m.Checkpoints)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseCheckpointResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseCheckpointResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseCheckpointResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseKeepAliveRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseKeepAliveRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseKeepAliveRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseKeepAliveResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseKeepAliveResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseKeepAliveResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TTL", wireType) + } + m.TTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TTL |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseTimeToLiveRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseTimeToLiveRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseTimeToLiveRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Keys", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Keys = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseTimeToLiveResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseTimeToLiveResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseTimeToLiveResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TTL", wireType) + } + m.TTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TTL |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GrantedTTL", wireType) + } + m.GrantedTTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GrantedTTL |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keys", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keys = append(m.Keys, make([]byte, postIndex-iNdEx)) + copy(m.Keys[len(m.Keys)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseLeasesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseLeasesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseLeasesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseLeasesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseLeasesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseLeasesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Leases", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Leases = append(m.Leases, &LeaseStatus{}) + if err := m.Leases[len(m.Leases)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Member) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Member: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Member: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PeerURLs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PeerURLs = append(m.PeerURLs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientURLs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientURLs = append(m.ClientURLs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsLearner", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IsLearner = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MemberAddRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MemberAddRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MemberAddRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PeerURLs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PeerURLs = append(m.PeerURLs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsLearner", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IsLearner = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MemberAddResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MemberAddResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MemberAddResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Member", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Member == nil { + m.Member = &Member{} + } + if err := m.Member.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Members", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Members = append(m.Members, &Member{}) + if err := m.Members[len(m.Members)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MemberRemoveRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MemberRemoveRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MemberRemoveRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MemberRemoveResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MemberRemoveResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MemberRemoveResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Members", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Members = append(m.Members, &Member{}) + if err := m.Members[len(m.Members)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MemberUpdateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MemberUpdateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MemberUpdateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PeerURLs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PeerURLs = append(m.PeerURLs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MemberUpdateResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MemberUpdateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MemberUpdateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Members", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Members = append(m.Members, &Member{}) + if err := m.Members[len(m.Members)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MemberListRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MemberListRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MemberListRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MemberListResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MemberListResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MemberListResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Members", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Members = append(m.Members, &Member{}) + if err := m.Members[len(m.Members)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MemberPromoteRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MemberPromoteRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MemberPromoteRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MemberPromoteResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MemberPromoteResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MemberPromoteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Members", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Members = append(m.Members, &Member{}) + if err := m.Members[len(m.Members)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DefragmentRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DefragmentRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DefragmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DefragmentResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DefragmentResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DefragmentResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MoveLeaderRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MoveLeaderRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MoveLeaderRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetID", wireType) + } + m.TargetID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TargetID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MoveLeaderResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MoveLeaderResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MoveLeaderResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AlarmRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AlarmRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AlarmRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + m.Action = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Action |= (AlarmRequest_AlarmAction(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemberID", wireType) + } + m.MemberID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MemberID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Alarm", wireType) + } + m.Alarm = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Alarm |= (AlarmType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AlarmMember) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AlarmMember: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AlarmMember: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemberID", wireType) + } + m.MemberID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MemberID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Alarm", wireType) + } + m.Alarm = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Alarm |= (AlarmType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AlarmResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AlarmResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AlarmResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Alarms", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Alarms = append(m.Alarms, &AlarmMember{}) + if err := m.Alarms[len(m.Alarms)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StatusRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StatusRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StatusResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: StatusResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatusResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DbSize", wireType) + } + m.DbSize = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DbSize |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Leader", wireType) + } + m.Leader = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Leader |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RaftIndex", wireType) + } + m.RaftIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RaftIndex |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RaftTerm", wireType) + } + m.RaftTerm = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RaftTerm |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RaftAppliedIndex", wireType) + } + m.RaftAppliedIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RaftAppliedIndex |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Errors", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Errors = append(m.Errors, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DbSizeInUse", wireType) + } + m.DbSizeInUse = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DbSizeInUse |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsLearner", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IsLearner = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthEnableRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthEnableRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthEnableRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthDisableRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthDisableRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthDisableRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthenticateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthenticateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthenticateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Password = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserAddRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserAddRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserAddRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Password = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Options == nil { + m.Options = &authpb.UserAddOptions{} + } + if err := m.Options.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserGetRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserGetRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserGetRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserDeleteRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserDeleteRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserDeleteRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserChangePasswordRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserChangePasswordRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserChangePasswordRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Password = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserGrantRoleRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserGrantRoleRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserGrantRoleRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.User = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserRevokeRoleRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserRevokeRoleRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserRevokeRoleRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleAddRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleAddRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleAddRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleGetRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleGetRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleGetRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserListRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserListRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserListRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleListRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleListRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleListRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleDeleteRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleDeleteRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleDeleteRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleGrantPermissionRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleGrantPermissionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleGrantPermissionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Perm", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Perm == nil { + m.Perm = &authpb.Permission{} + } + if err := m.Perm.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleRevokePermissionRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleRevokePermissionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleRevokePermissionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Role = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RangeEnd", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RangeEnd = append(m.RangeEnd[:0], dAtA[iNdEx:postIndex]...) + if m.RangeEnd == nil { + m.RangeEnd = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthEnableResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthEnableResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthEnableResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthDisableResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthDisableResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthDisableResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthenticateResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthenticateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthenticateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Token", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Token = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserAddResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserAddResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserAddResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserGetResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserGetResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserGetResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserDeleteResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserDeleteResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserDeleteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserChangePasswordResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserChangePasswordResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserChangePasswordResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserGrantRoleResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserGrantRoleResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserGrantRoleResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserRevokeRoleResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserRevokeRoleResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserRevokeRoleResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleAddResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleAddResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleAddResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleGetResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleGetResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleGetResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Perm", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Perm = append(m.Perm, &authpb.Permission{}) + if err := m.Perm[len(m.Perm)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleListResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleListResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleListResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthUserListResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthUserListResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthUserListResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Users = append(m.Users, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleDeleteResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleDeleteResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleDeleteResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleGrantPermissionResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleGrantPermissionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleGrantPermissionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuthRoleRevokePermissionResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuthRoleRevokePermissionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuthRoleRevokePermissionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipRpc(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRpc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRpc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRpc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthRpc + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRpc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipRpc(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthRpc = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowRpc = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) } + +var fileDescriptorRpc = []byte{ + // 3928 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x5b, 0x6f, 0x23, 0xc9, + 0x75, 0x56, 0x93, 0xe2, 0xed, 0xf0, 0x22, 0xaa, 0x74, 0x19, 0x0e, 0x67, 0x46, 0xa3, 0xad, 0xd9, + 0xd9, 0xd5, 0xce, 0xec, 0x8a, 0x6b, 0xd9, 0x4e, 0x80, 0x49, 0xe2, 0x58, 0x23, 0x71, 0x67, 0xb4, + 0xd2, 0x88, 0xda, 0x16, 0x67, 0xf6, 0x02, 0x23, 0x42, 0x8b, 0x2c, 0x49, 0x1d, 0x91, 0xdd, 0x74, + 0x77, 0x93, 0x23, 0x6d, 0x2e, 0x0e, 0x0c, 0xc7, 0x40, 0xf2, 0x68, 0x03, 0x41, 0xf2, 0x90, 0xa7, + 0x20, 0x08, 0xfc, 0x90, 0xe7, 0x00, 0xf9, 0x05, 0x79, 0xca, 0x05, 0xf9, 0x03, 0xc1, 0xc6, 0x2f, + 0xc9, 0xaf, 0x30, 0xea, 0xd6, 0x5d, 0x7d, 0xa3, 0xc6, 0xa6, 0x77, 0x5f, 0xa4, 0xae, 0x53, 0xa7, + 0xce, 0x39, 0x75, 0xaa, 0xea, 0x9c, 0xd3, 0x5f, 0x17, 0xa1, 0xe4, 0x8c, 0x7a, 0x9b, 0x23, 0xc7, + 0xf6, 0x6c, 0x54, 0x21, 0x5e, 0xaf, 0xef, 0x12, 0x67, 0x42, 0x9c, 0xd1, 0x69, 0x73, 0xf9, 0xdc, + 0x3e, 0xb7, 0x59, 0x47, 0x8b, 0x3e, 0x71, 0x9e, 0xe6, 0x6d, 0xca, 0xd3, 0x1a, 0x4e, 0x7a, 0x3d, + 0xf6, 0x67, 0x74, 0xda, 0xba, 0x9c, 0x88, 0xae, 0x3b, 0xac, 0xcb, 0x18, 0x7b, 0x17, 0xec, 0xcf, + 0xe8, 0x94, 0xfd, 0x13, 0x9d, 0x77, 0xcf, 0x6d, 0xfb, 0x7c, 0x40, 0x5a, 0xc6, 0xc8, 0x6c, 0x19, + 0x96, 0x65, 0x7b, 0x86, 0x67, 0xda, 0x96, 0xcb, 0x7b, 0xf1, 0x5f, 0x6a, 0x50, 0xd3, 0x89, 0x3b, + 0xb2, 0x2d, 0x97, 0x3c, 0x27, 0x46, 0x9f, 0x38, 0xe8, 0x1e, 0x40, 0x6f, 0x30, 0x76, 0x3d, 0xe2, + 0x9c, 0x98, 0xfd, 0x86, 0xb6, 0xae, 0x6d, 0xcc, 0xeb, 0x25, 0x41, 0xd9, 0xeb, 0xa3, 0x3b, 0x50, + 0x1a, 0x92, 0xe1, 0x29, 0xef, 0xcd, 0xb0, 0xde, 0x22, 0x27, 0xec, 0xf5, 0x51, 0x13, 0x8a, 0x0e, + 0x99, 0x98, 0xae, 0x69, 0x5b, 0x8d, 0xec, 0xba, 0xb6, 0x91, 0xd5, 0xfd, 0x36, 0x1d, 0xe8, 0x18, + 0x67, 0xde, 0x89, 0x47, 0x9c, 0x61, 0x63, 0x9e, 0x0f, 0xa4, 0x84, 0x2e, 0x71, 0x86, 0xf8, 0x27, + 0x39, 0xa8, 0xe8, 0x86, 0x75, 0x4e, 0x74, 0xf2, 0xc3, 0x31, 0x71, 0x3d, 0x54, 0x87, 0xec, 0x25, + 0xb9, 0x66, 0xea, 0x2b, 0x3a, 0x7d, 0xe4, 0xe3, 0xad, 0x73, 0x72, 0x42, 0x2c, 0xae, 0xb8, 0x42, + 0xc7, 0x5b, 0xe7, 0xa4, 0x6d, 0xf5, 0xd1, 0x32, 0xe4, 0x06, 0xe6, 0xd0, 0xf4, 0x84, 0x56, 0xde, + 0x08, 0x99, 0x33, 0x1f, 0x31, 0x67, 0x07, 0xc0, 0xb5, 0x1d, 0xef, 0xc4, 0x76, 0xfa, 0xc4, 0x69, + 0xe4, 0xd6, 0xb5, 0x8d, 0xda, 0xd6, 0xdb, 0x9b, 0xea, 0x42, 0x6c, 0xaa, 0x06, 0x6d, 0x1e, 0xdb, + 0x8e, 0xd7, 0xa1, 0xbc, 0x7a, 0xc9, 0x95, 0x8f, 0xe8, 0x23, 0x28, 0x33, 0x21, 0x9e, 0xe1, 0x9c, + 0x13, 0xaf, 0x91, 0x67, 0x52, 0x1e, 0xde, 0x20, 0xa5, 0xcb, 0x98, 0x75, 0xa6, 0x9e, 0x3f, 0x23, + 0x0c, 0x15, 0x97, 0x38, 0xa6, 0x31, 0x30, 0xbf, 0x34, 0x4e, 0x07, 0xa4, 0x51, 0x58, 0xd7, 0x36, + 0x8a, 0x7a, 0x88, 0x46, 0xe7, 0x7f, 0x49, 0xae, 0xdd, 0x13, 0xdb, 0x1a, 0x5c, 0x37, 0x8a, 0x8c, + 0xa1, 0x48, 0x09, 0x1d, 0x6b, 0x70, 0xcd, 0x16, 0xcd, 0x1e, 0x5b, 0x1e, 0xef, 0x2d, 0xb1, 0xde, + 0x12, 0xa3, 0xb0, 0xee, 0x0d, 0xa8, 0x0f, 0x4d, 0xeb, 0x64, 0x68, 0xf7, 0x4f, 0x7c, 0x87, 0x00, + 0x73, 0x48, 0x6d, 0x68, 0x5a, 0x2f, 0xec, 0xbe, 0x2e, 0xdd, 0x42, 0x39, 0x8d, 0xab, 0x30, 0x67, + 0x59, 0x70, 0x1a, 0x57, 0x2a, 0xe7, 0x26, 0x2c, 0x51, 0x99, 0x3d, 0x87, 0x18, 0x1e, 0x09, 0x98, + 0x2b, 0x8c, 0x79, 0x71, 0x68, 0x5a, 0x3b, 0xac, 0x27, 0xc4, 0x6f, 0x5c, 0xc5, 0xf8, 0xab, 0x82, + 0xdf, 0xb8, 0x0a, 0xf3, 0xe3, 0x4d, 0x28, 0xf9, 0x3e, 0x47, 0x45, 0x98, 0x3f, 0xec, 0x1c, 0xb6, + 0xeb, 0x73, 0x08, 0x20, 0xbf, 0x7d, 0xbc, 0xd3, 0x3e, 0xdc, 0xad, 0x6b, 0xa8, 0x0c, 0x85, 0xdd, + 0x36, 0x6f, 0x64, 0xf0, 0x53, 0x80, 0xc0, 0xbb, 0xa8, 0x00, 0xd9, 0xfd, 0xf6, 0xe7, 0xf5, 0x39, + 0xca, 0xf3, 0xaa, 0xad, 0x1f, 0xef, 0x75, 0x0e, 0xeb, 0x1a, 0x1d, 0xbc, 0xa3, 0xb7, 0xb7, 0xbb, + 0xed, 0x7a, 0x86, 0x72, 0xbc, 0xe8, 0xec, 0xd6, 0xb3, 0xa8, 0x04, 0xb9, 0x57, 0xdb, 0x07, 0x2f, + 0xdb, 0xf5, 0x79, 0xfc, 0x73, 0x0d, 0xaa, 0x62, 0xbd, 0xf8, 0x99, 0x40, 0xdf, 0x81, 0xfc, 0x05, + 0x3b, 0x17, 0x6c, 0x2b, 0x96, 0xb7, 0xee, 0x46, 0x16, 0x37, 0x74, 0x76, 0x74, 0xc1, 0x8b, 0x30, + 0x64, 0x2f, 0x27, 0x6e, 0x23, 0xb3, 0x9e, 0xdd, 0x28, 0x6f, 0xd5, 0x37, 0xf9, 0x81, 0xdd, 0xdc, + 0x27, 0xd7, 0xaf, 0x8c, 0xc1, 0x98, 0xe8, 0xb4, 0x13, 0x21, 0x98, 0x1f, 0xda, 0x0e, 0x61, 0x3b, + 0xb6, 0xa8, 0xb3, 0x67, 0xba, 0x8d, 0xd9, 0xa2, 0x89, 0xdd, 0xca, 0x1b, 0xf8, 0x17, 0x1a, 0xc0, + 0xd1, 0xd8, 0x4b, 0x3f, 0x1a, 0xcb, 0x90, 0x9b, 0x50, 0xc1, 0xe2, 0x58, 0xf0, 0x06, 0x3b, 0x13, + 0xc4, 0x70, 0x89, 0x7f, 0x26, 0x68, 0x03, 0xdd, 0x82, 0xc2, 0xc8, 0x21, 0x93, 0x93, 0xcb, 0x09, + 0x53, 0x52, 0xd4, 0xf3, 0xb4, 0xb9, 0x3f, 0x41, 0x6f, 0x41, 0xc5, 0x3c, 0xb7, 0x6c, 0x87, 0x9c, + 0x70, 0x59, 0x39, 0xd6, 0x5b, 0xe6, 0x34, 0x66, 0xb7, 0xc2, 0xc2, 0x05, 0xe7, 0x55, 0x96, 0x03, + 0x4a, 0xc2, 0x16, 0x94, 0x99, 0xa9, 0x33, 0xb9, 0xef, 0xbd, 0xc0, 0xc6, 0x0c, 0x1b, 0x16, 0x77, + 0xa1, 0xb0, 0x1a, 0xff, 0x00, 0xd0, 0x2e, 0x19, 0x10, 0x8f, 0xcc, 0x12, 0x3d, 0x14, 0x9f, 0x64, + 0x55, 0x9f, 0xe0, 0x9f, 0x69, 0xb0, 0x14, 0x12, 0x3f, 0xd3, 0xb4, 0x1a, 0x50, 0xe8, 0x33, 0x61, + 0xdc, 0x82, 0xac, 0x2e, 0x9b, 0xe8, 0x31, 0x14, 0x85, 0x01, 0x6e, 0x23, 0x9b, 0xb2, 0x69, 0x0a, + 0xdc, 0x26, 0x17, 0xff, 0x22, 0x03, 0x25, 0x31, 0xd1, 0xce, 0x08, 0x6d, 0x43, 0xd5, 0xe1, 0x8d, + 0x13, 0x36, 0x1f, 0x61, 0x51, 0x33, 0x3d, 0x08, 0x3d, 0x9f, 0xd3, 0x2b, 0x62, 0x08, 0x23, 0xa3, + 0xdf, 0x83, 0xb2, 0x14, 0x31, 0x1a, 0x7b, 0xc2, 0xe5, 0x8d, 0xb0, 0x80, 0x60, 0xff, 0x3d, 0x9f, + 0xd3, 0x41, 0xb0, 0x1f, 0x8d, 0x3d, 0xd4, 0x85, 0x65, 0x39, 0x98, 0xcf, 0x46, 0x98, 0x91, 0x65, + 0x52, 0xd6, 0xc3, 0x52, 0xe2, 0x4b, 0xf5, 0x7c, 0x4e, 0x47, 0x62, 0xbc, 0xd2, 0xa9, 0x9a, 0xe4, + 0x5d, 0xf1, 0xe0, 0x1d, 0x33, 0xa9, 0x7b, 0x65, 0xc5, 0x4d, 0xea, 0x5e, 0x59, 0x4f, 0x4b, 0x50, + 0x10, 0x2d, 0xfc, 0x2f, 0x19, 0x00, 0xb9, 0x1a, 0x9d, 0x11, 0xda, 0x85, 0x9a, 0x23, 0x5a, 0x21, + 0x6f, 0xdd, 0x49, 0xf4, 0x96, 0x58, 0xc4, 0x39, 0xbd, 0x2a, 0x07, 0x71, 0xe3, 0xbe, 0x07, 0x15, + 0x5f, 0x4a, 0xe0, 0xb0, 0xdb, 0x09, 0x0e, 0xf3, 0x25, 0x94, 0xe5, 0x00, 0xea, 0xb2, 0x4f, 0x61, + 0xc5, 0x1f, 0x9f, 0xe0, 0xb3, 0xb7, 0xa6, 0xf8, 0xcc, 0x17, 0xb8, 0x24, 0x25, 0xa8, 0x5e, 0x53, + 0x0d, 0x0b, 0xdc, 0x76, 0x3b, 0xc1, 0x6d, 0x71, 0xc3, 0xa8, 0xe3, 0x80, 0xe6, 0x4b, 0xde, 0xc4, + 0xff, 0x97, 0x85, 0xc2, 0x8e, 0x3d, 0x1c, 0x19, 0x0e, 0x5d, 0x8d, 0xbc, 0x43, 0xdc, 0xf1, 0xc0, + 0x63, 0xee, 0xaa, 0x6d, 0x3d, 0x08, 0x4b, 0x14, 0x6c, 0xf2, 0xbf, 0xce, 0x58, 0x75, 0x31, 0x84, + 0x0e, 0x16, 0xe9, 0x31, 0xf3, 0x06, 0x83, 0x45, 0x72, 0x14, 0x43, 0xe4, 0x41, 0xce, 0x06, 0x07, + 0xb9, 0x09, 0x85, 0x09, 0x71, 0x82, 0x94, 0xfe, 0x7c, 0x4e, 0x97, 0x04, 0xf4, 0x1e, 0x2c, 0x44, + 0xd3, 0x4b, 0x4e, 0xf0, 0xd4, 0x7a, 0xe1, 0x6c, 0xf4, 0x00, 0x2a, 0xa1, 0x1c, 0x97, 0x17, 0x7c, + 0xe5, 0xa1, 0x92, 0xe2, 0x56, 0x65, 0x5c, 0xa5, 0xf9, 0xb8, 0xf2, 0x7c, 0x4e, 0x46, 0xd6, 0x55, + 0x19, 0x59, 0x8b, 0x62, 0x94, 0x88, 0xad, 0xa1, 0x20, 0xf3, 0xfd, 0x70, 0x90, 0xc1, 0xdf, 0x87, + 0x6a, 0xc8, 0x41, 0x34, 0xef, 0xb4, 0x3f, 0x79, 0xb9, 0x7d, 0xc0, 0x93, 0xd4, 0x33, 0x96, 0x97, + 0xf4, 0xba, 0x46, 0x73, 0xdd, 0x41, 0xfb, 0xf8, 0xb8, 0x9e, 0x41, 0x55, 0x28, 0x1d, 0x76, 0xba, + 0x27, 0x9c, 0x2b, 0x8b, 0x9f, 0xf9, 0x12, 0x44, 0x92, 0x53, 0x72, 0xdb, 0x9c, 0x92, 0xdb, 0x34, + 0x99, 0xdb, 0x32, 0x41, 0x6e, 0x63, 0x69, 0xee, 0xa0, 0xbd, 0x7d, 0xdc, 0xae, 0xcf, 0x3f, 0xad, + 0x41, 0x85, 0xfb, 0xf7, 0x64, 0x6c, 0xd1, 0x54, 0xfb, 0x0f, 0x1a, 0x40, 0x70, 0x9a, 0x50, 0x0b, + 0x0a, 0x3d, 0xae, 0xa7, 0xa1, 0xb1, 0x60, 0xb4, 0x92, 0xb8, 0x64, 0xba, 0xe4, 0x42, 0xdf, 0x82, + 0x82, 0x3b, 0xee, 0xf5, 0x88, 0x2b, 0x53, 0xde, 0xad, 0x68, 0x3c, 0x14, 0xd1, 0x4a, 0x97, 0x7c, + 0x74, 0xc8, 0x99, 0x61, 0x0e, 0xc6, 0x2c, 0x01, 0x4e, 0x1f, 0x22, 0xf8, 0xf0, 0xdf, 0x69, 0x50, + 0x56, 0x36, 0xef, 0x6f, 0x18, 0x84, 0xef, 0x42, 0x89, 0xd9, 0x40, 0xfa, 0x22, 0x0c, 0x17, 0xf5, + 0x80, 0x80, 0x7e, 0x07, 0x4a, 0xf2, 0x04, 0xc8, 0x48, 0xdc, 0x48, 0x16, 0xdb, 0x19, 0xe9, 0x01, + 0x2b, 0xde, 0x87, 0x45, 0xe6, 0x95, 0x1e, 0x2d, 0xae, 0xa5, 0x1f, 0xd5, 0xf2, 0x53, 0x8b, 0x94, + 0x9f, 0x4d, 0x28, 0x8e, 0x2e, 0xae, 0x5d, 0xb3, 0x67, 0x0c, 0x84, 0x15, 0x7e, 0x1b, 0x7f, 0x0c, + 0x48, 0x15, 0x36, 0xcb, 0x74, 0x71, 0x15, 0xca, 0xcf, 0x0d, 0xf7, 0x42, 0x98, 0x84, 0x1f, 0x43, + 0x95, 0x36, 0xf7, 0x5f, 0xbd, 0x81, 0x8d, 0xec, 0xe5, 0x40, 0x72, 0xcf, 0xe4, 0x73, 0x04, 0xf3, + 0x17, 0x86, 0x7b, 0xc1, 0x26, 0x5a, 0xd5, 0xd9, 0x33, 0x7a, 0x0f, 0xea, 0x3d, 0x3e, 0xc9, 0x93, + 0xc8, 0x2b, 0xc3, 0x82, 0xa0, 0xfb, 0x95, 0xe0, 0x67, 0x50, 0xe1, 0x73, 0xf8, 0x6d, 0x1b, 0x81, + 0x17, 0x61, 0xe1, 0xd8, 0x32, 0x46, 0xee, 0x85, 0x2d, 0xb3, 0x1b, 0x9d, 0x74, 0x3d, 0xa0, 0xcd, + 0xa4, 0xf1, 0x5d, 0x58, 0x70, 0xc8, 0xd0, 0x30, 0x2d, 0xd3, 0x3a, 0x3f, 0x39, 0xbd, 0xf6, 0x88, + 0x2b, 0x5e, 0x98, 0x6a, 0x3e, 0xf9, 0x29, 0xa5, 0x52, 0xd3, 0x4e, 0x07, 0xf6, 0xa9, 0x08, 0x73, + 0xec, 0x19, 0xff, 0x34, 0x03, 0x95, 0x4f, 0x0d, 0xaf, 0x27, 0x97, 0x0e, 0xed, 0x41, 0xcd, 0x0f, + 0x6e, 0x8c, 0x22, 0x6c, 0x89, 0xa4, 0x58, 0x36, 0x46, 0x96, 0xd2, 0x32, 0x3b, 0x56, 0x7b, 0x2a, + 0x81, 0x89, 0x32, 0xac, 0x1e, 0x19, 0xf8, 0xa2, 0x32, 0xe9, 0xa2, 0x18, 0xa3, 0x2a, 0x4a, 0x25, + 0xa0, 0x0e, 0xd4, 0x47, 0x8e, 0x7d, 0xee, 0x10, 0xd7, 0xf5, 0x85, 0xf1, 0x34, 0x86, 0x13, 0x84, + 0x1d, 0x09, 0xd6, 0x40, 0xdc, 0xc2, 0x28, 0x4c, 0x7a, 0xba, 0x10, 0xd4, 0x33, 0x3c, 0x38, 0xfd, + 0x57, 0x06, 0x50, 0x7c, 0x52, 0xbf, 0x6e, 0x89, 0xf7, 0x10, 0x6a, 0xae, 0x67, 0x38, 0xb1, 0xcd, + 0x56, 0x65, 0x54, 0x3f, 0xe2, 0xbf, 0x0b, 0xbe, 0x41, 0x27, 0x96, 0xed, 0x99, 0x67, 0xd7, 0xa2, + 0x4a, 0xae, 0x49, 0xf2, 0x21, 0xa3, 0xa2, 0x36, 0x14, 0xce, 0xcc, 0x81, 0x47, 0x1c, 0xb7, 0x91, + 0x5b, 0xcf, 0x6e, 0xd4, 0xb6, 0x1e, 0xdf, 0xb4, 0x0c, 0x9b, 0x1f, 0x31, 0xfe, 0xee, 0xf5, 0x88, + 0xe8, 0x72, 0xac, 0x5a, 0x79, 0xe6, 0x43, 0xd5, 0xf8, 0x6d, 0x28, 0xbe, 0xa6, 0x22, 0xe8, 0x5b, + 0x76, 0x81, 0x17, 0x8b, 0xac, 0xcd, 0x5f, 0xb2, 0xcf, 0x1c, 0xe3, 0x7c, 0x48, 0x2c, 0x4f, 0xbe, + 0x07, 0xca, 0x36, 0x7e, 0x08, 0x10, 0xa8, 0xa1, 0x21, 0xff, 0xb0, 0x73, 0xf4, 0xb2, 0x5b, 0x9f, + 0x43, 0x15, 0x28, 0x1e, 0x76, 0x76, 0xdb, 0x07, 0x6d, 0x9a, 0x1f, 0x70, 0x4b, 0xba, 0x34, 0xb4, + 0x96, 0xaa, 0x4e, 0x2d, 0xa4, 0x13, 0xaf, 0xc2, 0x72, 0xd2, 0x02, 0xd2, 0x5a, 0xb4, 0x2a, 0x76, + 0xe9, 0x4c, 0x47, 0x45, 0x55, 0x9d, 0x09, 0x4f, 0xb7, 0x01, 0x05, 0xbe, 0x7b, 0xfb, 0xa2, 0x38, + 0x97, 0x4d, 0xea, 0x08, 0xbe, 0x19, 0x49, 0x5f, 0xac, 0x92, 0xdf, 0x4e, 0x0c, 0x2f, 0xb9, 0xc4, + 0xf0, 0x82, 0x1e, 0x40, 0xd5, 0x3f, 0x0d, 0x86, 0x2b, 0x6a, 0x81, 0x92, 0x5e, 0x91, 0x1b, 0x9d, + 0xd2, 0x42, 0x4e, 0x2f, 0x84, 0x9d, 0x8e, 0x1e, 0x42, 0x9e, 0x4c, 0x88, 0xe5, 0xb9, 0x8d, 0x32, + 0xcb, 0x18, 0x55, 0x59, 0xbb, 0xb7, 0x29, 0x55, 0x17, 0x9d, 0xf8, 0xbb, 0xb0, 0xc8, 0xde, 0x91, + 0x9e, 0x39, 0x86, 0xa5, 0xbe, 0xcc, 0x75, 0xbb, 0x07, 0xc2, 0xdd, 0xf4, 0x11, 0xd5, 0x20, 0xb3, + 0xb7, 0x2b, 0x9c, 0x90, 0xd9, 0xdb, 0xc5, 0x3f, 0xd6, 0x00, 0xa9, 0xe3, 0x66, 0xf2, 0x73, 0x44, + 0xb8, 0x54, 0x9f, 0x0d, 0xd4, 0x2f, 0x43, 0x8e, 0x38, 0x8e, 0xed, 0x30, 0x8f, 0x96, 0x74, 0xde, + 0xc0, 0x6f, 0x0b, 0x1b, 0x74, 0x32, 0xb1, 0x2f, 0xfd, 0x33, 0xc8, 0xa5, 0x69, 0xbe, 0xa9, 0xfb, + 0xb0, 0x14, 0xe2, 0x9a, 0x29, 0x73, 0x7d, 0x04, 0x0b, 0x4c, 0xd8, 0xce, 0x05, 0xe9, 0x5d, 0x8e, + 0x6c, 0xd3, 0x8a, 0xe9, 0xa3, 0x2b, 0x17, 0x04, 0x58, 0x3a, 0x0f, 0x3e, 0xb1, 0x8a, 0x4f, 0xec, + 0x76, 0x0f, 0xf0, 0xe7, 0xb0, 0x1a, 0x91, 0x23, 0xcd, 0xff, 0x43, 0x28, 0xf7, 0x7c, 0xa2, 0x2b, + 0x6a, 0x9d, 0x7b, 0x61, 0xe3, 0xa2, 0x43, 0xd5, 0x11, 0xb8, 0x03, 0xb7, 0x62, 0xa2, 0x67, 0x9a, + 0xf3, 0xbb, 0xb0, 0xc2, 0x04, 0xee, 0x13, 0x32, 0xda, 0x1e, 0x98, 0x93, 0x54, 0x4f, 0x8f, 0xc4, + 0xa4, 0x14, 0xc6, 0xaf, 0x77, 0x5f, 0xe0, 0xdf, 0x17, 0x1a, 0xbb, 0xe6, 0x90, 0x74, 0xed, 0x83, + 0x74, 0xdb, 0x68, 0x36, 0xbb, 0x24, 0xd7, 0xae, 0x28, 0x6b, 0xd8, 0x33, 0xfe, 0x47, 0x4d, 0xb8, + 0x4a, 0x1d, 0xfe, 0x35, 0xef, 0xe4, 0x35, 0x80, 0x73, 0x7a, 0x64, 0x48, 0x9f, 0x76, 0x70, 0x44, + 0x45, 0xa1, 0xf8, 0x76, 0xd2, 0xf8, 0x5d, 0x11, 0x76, 0x2e, 0x8b, 0x7d, 0xce, 0xfe, 0xf8, 0x51, + 0xee, 0x1e, 0x94, 0x19, 0xe1, 0xd8, 0x33, 0xbc, 0xb1, 0x1b, 0x5b, 0x8c, 0x3f, 0x17, 0xdb, 0x5e, + 0x0e, 0x9a, 0x69, 0x5e, 0xdf, 0x82, 0x3c, 0x7b, 0x99, 0x90, 0xa5, 0xf4, 0xed, 0x84, 0xfd, 0xc8, + 0xed, 0xd0, 0x05, 0x23, 0xfe, 0xa9, 0x06, 0xf9, 0x17, 0x0c, 0x82, 0x55, 0x4c, 0x9b, 0x97, 0x6b, + 0x61, 0x19, 0x43, 0x0e, 0x0c, 0x95, 0x74, 0xf6, 0xcc, 0x4a, 0x4f, 0x42, 0x9c, 0x97, 0xfa, 0x01, + 0x2f, 0x71, 0x4b, 0xba, 0xdf, 0xa6, 0x3e, 0xeb, 0x0d, 0x4c, 0x62, 0x79, 0xac, 0x77, 0x9e, 0xf5, + 0x2a, 0x14, 0x5a, 0x3d, 0x9b, 0xee, 0x01, 0x31, 0x1c, 0x4b, 0x80, 0xa6, 0x45, 0x3d, 0x20, 0xe0, + 0x03, 0xa8, 0x73, 0x3b, 0xb6, 0xfb, 0x7d, 0xa5, 0xc0, 0xf4, 0xb5, 0x69, 0x11, 0x6d, 0x21, 0x69, + 0x99, 0xa8, 0xb4, 0x7f, 0xd2, 0x60, 0x51, 0x11, 0x37, 0x93, 0x57, 0xdf, 0x87, 0x3c, 0x07, 0xa9, + 0x45, 0xa5, 0xb3, 0x1c, 0x1e, 0xc5, 0xd5, 0xe8, 0x82, 0x07, 0x6d, 0x42, 0x81, 0x3f, 0xc9, 0x77, + 0x80, 0x64, 0x76, 0xc9, 0x84, 0x1f, 0xc2, 0x92, 0x20, 0x91, 0xa1, 0x9d, 0x74, 0x30, 0xd8, 0x62, + 0xe0, 0x3f, 0x85, 0xe5, 0x30, 0xdb, 0x4c, 0x53, 0x52, 0x8c, 0xcc, 0xbc, 0x89, 0x91, 0xdb, 0xd2, + 0xc8, 0x97, 0xa3, 0xbe, 0x52, 0x47, 0x45, 0x77, 0x8c, 0xba, 0x5e, 0x99, 0xf0, 0x7a, 0x05, 0x13, + 0x90, 0x22, 0xbe, 0xd1, 0x09, 0x2c, 0xc9, 0xed, 0x70, 0x60, 0xba, 0x7e, 0xb9, 0xfe, 0x25, 0x20, + 0x95, 0xf8, 0x8d, 0x1a, 0xf4, 0x8e, 0x74, 0xc7, 0x91, 0x63, 0x0f, 0xed, 0x54, 0x97, 0xe2, 0x3f, + 0x83, 0x95, 0x08, 0xdf, 0x37, 0xed, 0xb7, 0x5d, 0x22, 0x8b, 0x15, 0xe9, 0xb7, 0x8f, 0x01, 0xa9, + 0xc4, 0x99, 0xb2, 0x56, 0x0b, 0x16, 0x5f, 0xd8, 0x13, 0x1a, 0xfe, 0x28, 0x35, 0x38, 0xf7, 0x1c, + 0x63, 0xf0, 0x5d, 0xe1, 0xb7, 0xa9, 0x72, 0x75, 0xc0, 0x4c, 0xca, 0xff, 0x43, 0x83, 0xca, 0xf6, + 0xc0, 0x70, 0x86, 0x52, 0xf1, 0xf7, 0x20, 0xcf, 0xdf, 0x9c, 0x05, 0x58, 0xf5, 0x4e, 0x58, 0x8c, + 0xca, 0xcb, 0x1b, 0xdb, 0xfc, 0x3d, 0x5b, 0x8c, 0xa2, 0x86, 0x8b, 0xef, 0x59, 0xbb, 0x91, 0xef, + 0x5b, 0xbb, 0xe8, 0x03, 0xc8, 0x19, 0x74, 0x08, 0x4b, 0x33, 0xb5, 0x28, 0x66, 0xc1, 0xa4, 0xb1, + 0xfa, 0x9e, 0x73, 0xe1, 0xef, 0x40, 0x59, 0xd1, 0x80, 0x0a, 0x90, 0x7d, 0xd6, 0x16, 0xc5, 0xf8, + 0xf6, 0x4e, 0x77, 0xef, 0x15, 0x07, 0x6b, 0x6a, 0x00, 0xbb, 0x6d, 0xbf, 0x9d, 0xc1, 0x9f, 0x89, + 0x51, 0x22, 0xa4, 0xab, 0xf6, 0x68, 0x69, 0xf6, 0x64, 0xde, 0xc8, 0x9e, 0x2b, 0xa8, 0x8a, 0xe9, + 0xcf, 0x9a, 0xa2, 0x98, 0xbc, 0x94, 0x14, 0xa5, 0x18, 0xaf, 0x0b, 0x46, 0xbc, 0x00, 0x55, 0x91, + 0xb4, 0xc4, 0xfe, 0xfb, 0xf7, 0x0c, 0xd4, 0x24, 0x65, 0x56, 0x50, 0x5d, 0xe2, 0x81, 0x3c, 0xc9, + 0xf9, 0x68, 0xe0, 0x2a, 0xe4, 0xfb, 0xa7, 0xc7, 0xe6, 0x97, 0xf2, 0x03, 0x88, 0x68, 0x51, 0xfa, + 0x80, 0xeb, 0xe1, 0x5f, 0x21, 0x45, 0x8b, 0x66, 0x23, 0xc7, 0x38, 0xf3, 0xf6, 0xac, 0x3e, 0xb9, + 0x62, 0xb9, 0x6d, 0x5e, 0x0f, 0x08, 0x0c, 0x28, 0x11, 0x5f, 0x2b, 0xd9, 0x0b, 0x82, 0xf2, 0xf5, + 0x12, 0x3d, 0x82, 0x3a, 0x7d, 0xde, 0x1e, 0x8d, 0x06, 0x26, 0xe9, 0x73, 0x01, 0x05, 0xc6, 0x13, + 0xa3, 0x53, 0xed, 0xac, 0xa4, 0x76, 0x1b, 0x45, 0x16, 0x5d, 0x45, 0x0b, 0xad, 0x43, 0x99, 0xdb, + 0xb7, 0x67, 0xbd, 0x74, 0x09, 0xfb, 0x84, 0x97, 0xd5, 0x55, 0x52, 0x38, 0x5b, 0x42, 0x34, 0x5b, + 0x2e, 0xc1, 0xe2, 0xf6, 0xd8, 0xbb, 0x68, 0x5b, 0xc6, 0xe9, 0x40, 0x46, 0x22, 0x5a, 0xce, 0x50, + 0xe2, 0xae, 0xe9, 0xaa, 0xd4, 0x36, 0x2c, 0x51, 0x2a, 0xb1, 0x3c, 0xb3, 0xa7, 0x64, 0x02, 0x59, + 0x2b, 0x68, 0x91, 0x5a, 0xc1, 0x70, 0xdd, 0xd7, 0xb6, 0xd3, 0x17, 0xee, 0xf5, 0xdb, 0x78, 0xc2, + 0x85, 0xbf, 0x74, 0x43, 0xf9, 0xfe, 0xd7, 0x94, 0x82, 0x3e, 0x84, 0x82, 0x3d, 0x62, 0x9f, 0xa4, + 0x05, 0x6e, 0xb0, 0xba, 0xc9, 0x3f, 0x62, 0x6f, 0x0a, 0xc1, 0x1d, 0xde, 0xab, 0x4b, 0x36, 0xbc, + 0x11, 0xe8, 0x7d, 0x46, 0xbc, 0x29, 0x7a, 0xf1, 0x63, 0x58, 0x91, 0x9c, 0x02, 0x26, 0x9f, 0xc2, + 0xdc, 0x81, 0x7b, 0x92, 0x79, 0xe7, 0xc2, 0xb0, 0xce, 0xc9, 0x91, 0x30, 0xf1, 0x37, 0xf5, 0xcf, + 0x53, 0x68, 0xf8, 0x76, 0xb2, 0x57, 0x37, 0x7b, 0xa0, 0x1a, 0x30, 0x76, 0xc5, 0x4e, 0x2f, 0xe9, + 0xec, 0x99, 0xd2, 0x1c, 0x7b, 0xe0, 0xd7, 0x6a, 0xf4, 0x19, 0xef, 0xc0, 0x6d, 0x29, 0x43, 0xbc, + 0x54, 0x85, 0x85, 0xc4, 0x0c, 0x4a, 0x12, 0x22, 0x1c, 0x46, 0x87, 0x4e, 0x5f, 0x28, 0x95, 0x33, + 0xec, 0x5a, 0x26, 0x53, 0x53, 0x64, 0xae, 0xf0, 0x3d, 0x44, 0x0d, 0x53, 0xd3, 0xb1, 0x20, 0x53, + 0x01, 0x2a, 0x59, 0x2c, 0x04, 0x25, 0xc7, 0x16, 0x22, 0x26, 0xfa, 0x07, 0xb0, 0xe6, 0x1b, 0x41, + 0xfd, 0x76, 0x44, 0x9c, 0xa1, 0xe9, 0xba, 0x0a, 0xb0, 0x9a, 0x34, 0xf1, 0x77, 0x60, 0x7e, 0x44, + 0x44, 0x24, 0x2c, 0x6f, 0x21, 0xb9, 0x89, 0x94, 0xc1, 0xac, 0x1f, 0xf7, 0xe1, 0xbe, 0x94, 0xce, + 0x3d, 0x9a, 0x28, 0x3e, 0x6a, 0x94, 0x84, 0x9b, 0x32, 0x29, 0x70, 0x53, 0x36, 0x02, 0xf6, 0x7f, + 0xcc, 0x1d, 0x29, 0x4f, 0xe3, 0x4c, 0x19, 0x6e, 0x9f, 0xfb, 0xd4, 0x3f, 0xc4, 0x33, 0x09, 0x3b, + 0x85, 0xe5, 0xf0, 0xd9, 0x9f, 0x29, 0xf8, 0x2e, 0x43, 0xce, 0xb3, 0x2f, 0x89, 0x0c, 0xbd, 0xbc, + 0x21, 0x0d, 0xf6, 0x03, 0xc3, 0x4c, 0x06, 0x1b, 0x81, 0x30, 0xb6, 0x25, 0x67, 0xb5, 0x97, 0xae, + 0xa6, 0xac, 0x6c, 0x79, 0x03, 0x1f, 0xc2, 0x6a, 0x34, 0x4c, 0xcc, 0x64, 0xf2, 0x2b, 0xbe, 0x81, + 0x93, 0x22, 0xc9, 0x4c, 0x72, 0x3f, 0x09, 0x82, 0x81, 0x12, 0x50, 0x66, 0x12, 0xa9, 0x43, 0x33, + 0x29, 0xbe, 0xfc, 0x36, 0xf6, 0xab, 0x1f, 0x6e, 0x66, 0x12, 0xe6, 0x06, 0xc2, 0x66, 0x5f, 0xfe, + 0x20, 0x46, 0x64, 0xa7, 0xc6, 0x08, 0x71, 0x48, 0x82, 0x28, 0xf6, 0x35, 0x6c, 0x3a, 0xa1, 0x23, + 0x08, 0xa0, 0xb3, 0xea, 0xa0, 0x39, 0xc4, 0xd7, 0xc1, 0x1a, 0x72, 0x63, 0xab, 0x61, 0x77, 0xa6, + 0xc5, 0xf8, 0x34, 0x88, 0x9d, 0xb1, 0xc8, 0x3c, 0x93, 0xe0, 0xcf, 0x60, 0x3d, 0x3d, 0x28, 0xcf, + 0x22, 0xf9, 0x51, 0x0b, 0x4a, 0x7e, 0x19, 0xac, 0xdc, 0x22, 0x2a, 0x43, 0xe1, 0xb0, 0x73, 0x7c, + 0xb4, 0xbd, 0xd3, 0xe6, 0xd7, 0x88, 0x76, 0x3a, 0xba, 0xfe, 0xf2, 0xa8, 0x5b, 0xcf, 0x6c, 0xfd, + 0x32, 0x0b, 0x99, 0xfd, 0x57, 0xe8, 0x73, 0xc8, 0xf1, 0x6f, 0xea, 0x53, 0x2e, 0x52, 0x34, 0xa7, + 0x5d, 0x1b, 0xc0, 0xb7, 0x7e, 0xfc, 0xdf, 0xbf, 0xfc, 0x79, 0x66, 0x11, 0x57, 0x5a, 0x93, 0x6f, + 0xb7, 0x2e, 0x27, 0x2d, 0x96, 0x1b, 0x9e, 0x68, 0x8f, 0xd0, 0x27, 0x90, 0x3d, 0x1a, 0x7b, 0x28, + 0xf5, 0x82, 0x45, 0x33, 0xfd, 0x26, 0x01, 0x5e, 0x61, 0x42, 0x17, 0x30, 0x08, 0xa1, 0xa3, 0xb1, + 0x47, 0x45, 0xfe, 0x10, 0xca, 0xea, 0x3d, 0x80, 0x1b, 0x6f, 0x5d, 0x34, 0x6f, 0xbe, 0x63, 0x80, + 0xef, 0x31, 0x55, 0xb7, 0x30, 0x12, 0xaa, 0xf8, 0x4d, 0x05, 0x75, 0x16, 0xdd, 0x2b, 0x0b, 0xa5, + 0xde, 0xc9, 0x68, 0xa6, 0x5f, 0x3b, 0x88, 0xcd, 0xc2, 0xbb, 0xb2, 0xa8, 0xc8, 0x3f, 0x16, 0x37, + 0x0e, 0x7a, 0x1e, 0xba, 0x9f, 0xf0, 0xc5, 0x59, 0xfd, 0xb6, 0xda, 0x5c, 0x4f, 0x67, 0x10, 0x4a, + 0xee, 0x32, 0x25, 0xab, 0x78, 0x51, 0x28, 0xe9, 0xf9, 0x2c, 0x4f, 0xb4, 0x47, 0x5b, 0x3d, 0xc8, + 0xb1, 0xef, 0x16, 0xe8, 0x0b, 0xf9, 0xd0, 0x4c, 0xf8, 0x80, 0x93, 0xb2, 0xd0, 0xa1, 0x2f, 0x1e, + 0x78, 0x99, 0x29, 0xaa, 0xe1, 0x12, 0x55, 0xc4, 0xbe, 0x5a, 0x3c, 0xd1, 0x1e, 0x6d, 0x68, 0x1f, + 0x6a, 0x5b, 0xff, 0x9c, 0x83, 0x1c, 0x03, 0xec, 0xd0, 0x25, 0x40, 0x80, 0xe1, 0x47, 0x67, 0x17, + 0xfb, 0x2a, 0x10, 0x9d, 0x5d, 0x1c, 0xfe, 0xc7, 0x4d, 0xa6, 0x74, 0x19, 0x2f, 0x50, 0xa5, 0x0c, + 0x07, 0x6c, 0x31, 0x68, 0x93, 0xfa, 0xf1, 0xaf, 0x34, 0x81, 0x57, 0xf2, 0xb3, 0x84, 0x92, 0xa4, + 0x85, 0x80, 0xfc, 0xe8, 0x76, 0x48, 0x00, 0xf1, 0xf1, 0x77, 0x99, 0xc2, 0x16, 0xae, 0x07, 0x0a, + 0x1d, 0xc6, 0xf1, 0x44, 0x7b, 0xf4, 0x45, 0x03, 0x2f, 0x09, 0x2f, 0x47, 0x7a, 0xd0, 0x8f, 0xa0, + 0x16, 0x06, 0xaa, 0xd1, 0x83, 0x04, 0x5d, 0x51, 0xbc, 0xbb, 0xf9, 0xf6, 0x74, 0x26, 0x61, 0xd3, + 0x1a, 0xb3, 0x49, 0x28, 0xe7, 0x9a, 0x2f, 0x09, 0x19, 0x19, 0x94, 0x49, 0xac, 0x01, 0xfa, 0x7b, + 0x4d, 0x7c, 0x47, 0x08, 0x90, 0x67, 0x94, 0x24, 0x3d, 0x86, 0x6b, 0x37, 0x1f, 0xde, 0xc0, 0x25, + 0x8c, 0xf8, 0x03, 0x66, 0xc4, 0xef, 0xe2, 0xe5, 0xc0, 0x08, 0xcf, 0x1c, 0x12, 0xcf, 0x16, 0x56, + 0x7c, 0x71, 0x17, 0xdf, 0x0a, 0x39, 0x27, 0xd4, 0x1b, 0x2c, 0x16, 0x47, 0x8f, 0x13, 0x17, 0x2b, + 0x84, 0x46, 0x27, 0x2e, 0x56, 0x18, 0x7a, 0x4e, 0x5a, 0x2c, 0x8e, 0x15, 0x27, 0x2d, 0x96, 0xdf, + 0xb3, 0xf5, 0xff, 0xf3, 0x50, 0xd8, 0xe1, 0x37, 0x7d, 0x91, 0x0d, 0x25, 0x1f, 0x7c, 0x45, 0x6b, + 0x49, 0x08, 0x53, 0xf0, 0x2e, 0xd1, 0xbc, 0x9f, 0xda, 0x2f, 0x0c, 0x7a, 0x8b, 0x19, 0x74, 0x07, + 0xaf, 0x52, 0xcd, 0xe2, 0x32, 0x71, 0x8b, 0xc3, 0x18, 0x2d, 0xa3, 0xdf, 0xa7, 0x8e, 0xf8, 0x13, + 0xa8, 0xa8, 0xe8, 0x28, 0x7a, 0x2b, 0x11, 0xd5, 0x52, 0x01, 0xd6, 0x26, 0x9e, 0xc6, 0x22, 0x34, + 0xbf, 0xcd, 0x34, 0xaf, 0xe1, 0xdb, 0x09, 0x9a, 0x1d, 0xc6, 0x1a, 0x52, 0xce, 0x91, 0xcd, 0x64, + 0xe5, 0x21, 0xe0, 0x34, 0x59, 0x79, 0x18, 0x18, 0x9d, 0xaa, 0x7c, 0xcc, 0x58, 0xa9, 0x72, 0x17, + 0x20, 0xc0, 0x30, 0x51, 0xa2, 0x2f, 0x95, 0x97, 0xa9, 0x68, 0x70, 0x88, 0xc3, 0x9f, 0x18, 0x33, + 0xb5, 0x62, 0xdf, 0x45, 0xd4, 0x0e, 0x4c, 0xd7, 0xe3, 0x07, 0xb3, 0x1a, 0x02, 0x25, 0x51, 0xe2, + 0x7c, 0xc2, 0xc8, 0x66, 0xf3, 0xc1, 0x54, 0x1e, 0xa1, 0xfd, 0x21, 0xd3, 0x7e, 0x1f, 0x37, 0x13, + 0xb4, 0x8f, 0x38, 0x2f, 0xdd, 0x6c, 0x7f, 0x9d, 0x87, 0xf2, 0x0b, 0xc3, 0xb4, 0x3c, 0x62, 0x19, + 0x56, 0x8f, 0xa0, 0x53, 0xc8, 0xb1, 0x4c, 0x1d, 0x0d, 0xc4, 0x2a, 0x60, 0x17, 0x0d, 0xc4, 0x21, + 0x34, 0x0b, 0xaf, 0x33, 0xc5, 0x4d, 0xbc, 0x42, 0x15, 0x0f, 0x03, 0xd1, 0x2d, 0x06, 0x42, 0xd1, + 0x49, 0x9f, 0x41, 0x5e, 0x7c, 0xc3, 0x89, 0x08, 0x0a, 0x81, 0x53, 0xcd, 0xbb, 0xc9, 0x9d, 0x49, + 0x7b, 0x59, 0x55, 0xe3, 0x32, 0x3e, 0xaa, 0x67, 0x02, 0x10, 0xa0, 0xab, 0xd1, 0x15, 0x8d, 0x81, + 0xb1, 0xcd, 0xf5, 0x74, 0x86, 0x24, 0x9f, 0xaa, 0x3a, 0xfb, 0x3e, 0x2f, 0xd5, 0xfb, 0x47, 0x30, + 0xff, 0xdc, 0x70, 0x2f, 0x50, 0x24, 0xf7, 0x2a, 0x37, 0x80, 0x9a, 0xcd, 0xa4, 0x2e, 0xa1, 0xe5, + 0x3e, 0xd3, 0x72, 0x9b, 0x87, 0x32, 0x55, 0xcb, 0x85, 0xe1, 0xd2, 0xa4, 0x86, 0xfa, 0x90, 0xe7, + 0x17, 0x82, 0xa2, 0xfe, 0x0b, 0x5d, 0x2a, 0x8a, 0xfa, 0x2f, 0x7c, 0x87, 0xe8, 0x66, 0x2d, 0x23, + 0x28, 0xca, 0x1b, 0x38, 0x28, 0xf2, 0x39, 0x36, 0x72, 0x5b, 0xa7, 0xb9, 0x96, 0xd6, 0x2d, 0x74, + 0x3d, 0x60, 0xba, 0xee, 0xe1, 0x46, 0x6c, 0xad, 0x04, 0xe7, 0x13, 0xed, 0xd1, 0x87, 0x1a, 0xfa, + 0x11, 0x40, 0x00, 0x48, 0xc7, 0x4e, 0x60, 0x14, 0xdb, 0x8e, 0x9d, 0xc0, 0x18, 0x96, 0x8d, 0x37, + 0x99, 0xde, 0x0d, 0xfc, 0x20, 0xaa, 0xd7, 0x73, 0x0c, 0xcb, 0x3d, 0x23, 0xce, 0x07, 0x1c, 0x74, + 0x74, 0x2f, 0xcc, 0x11, 0x3d, 0x0c, 0xff, 0xba, 0x00, 0xf3, 0xb4, 0x02, 0xa6, 0x85, 0x42, 0x00, + 0x1c, 0x44, 0x2d, 0x89, 0x01, 0x7c, 0x51, 0x4b, 0xe2, 0x98, 0x43, 0xb8, 0x50, 0x60, 0xbf, 0x11, + 0x21, 0x8c, 0x81, 0x3a, 0xda, 0x86, 0xb2, 0x82, 0x2c, 0xa0, 0x04, 0x61, 0x61, 0xe4, 0x30, 0x9a, + 0x7a, 0x12, 0x60, 0x09, 0x7c, 0x87, 0xe9, 0x5b, 0xe1, 0xa9, 0x87, 0xe9, 0xeb, 0x73, 0x0e, 0xaa, + 0xf0, 0x35, 0x54, 0x54, 0xf4, 0x01, 0x25, 0xc8, 0x8b, 0xa0, 0x92, 0xd1, 0x30, 0x9b, 0x04, 0x5e, + 0x84, 0x0f, 0xbe, 0xff, 0x3b, 0x18, 0xc9, 0x46, 0x15, 0x0f, 0xa0, 0x20, 0xe0, 0x88, 0xa4, 0x59, + 0x86, 0x21, 0xcc, 0xa4, 0x59, 0x46, 0xb0, 0x8c, 0x70, 0x71, 0xc9, 0x34, 0xd2, 0x37, 0x2e, 0x99, + 0xca, 0x84, 0xb6, 0x67, 0xc4, 0x4b, 0xd3, 0x16, 0xa0, 0x6b, 0x69, 0xda, 0x94, 0xb7, 0xdd, 0x34, + 0x6d, 0xe7, 0xc4, 0x13, 0xc7, 0x45, 0xbe, 0x45, 0xa2, 0x14, 0x61, 0x6a, 0xfa, 0xc0, 0xd3, 0x58, + 0x92, 0x6a, 0xff, 0x40, 0xa1, 0xcc, 0x1d, 0x57, 0x00, 0x01, 0x58, 0x12, 0x2d, 0xe8, 0x12, 0x11, + 0xd7, 0x68, 0x41, 0x97, 0x8c, 0xb7, 0x84, 0x43, 0x43, 0xa0, 0x97, 0xbf, 0x7a, 0x50, 0xcd, 0x3f, + 0xd3, 0x00, 0xc5, 0x71, 0x15, 0xf4, 0x38, 0x59, 0x7a, 0x22, 0x8e, 0xdb, 0x7c, 0xff, 0xcd, 0x98, + 0x93, 0xa2, 0x7d, 0x60, 0x52, 0x8f, 0x71, 0x8f, 0x5e, 0x53, 0xa3, 0xfe, 0x42, 0x83, 0x6a, 0x08, + 0x94, 0x41, 0xef, 0xa4, 0xac, 0x69, 0x04, 0x06, 0x6e, 0xbe, 0x7b, 0x23, 0x5f, 0x52, 0xa5, 0xab, + 0xec, 0x00, 0x59, 0xf2, 0xff, 0x44, 0x83, 0x5a, 0x18, 0xc4, 0x41, 0x29, 0xb2, 0x63, 0x30, 0x72, + 0x73, 0xe3, 0x66, 0xc6, 0xe9, 0xcb, 0x13, 0x54, 0xfb, 0x03, 0x28, 0x08, 0xd8, 0x27, 0x69, 0xe3, + 0x87, 0x01, 0xe8, 0xa4, 0x8d, 0x1f, 0xc1, 0x8c, 0x12, 0x36, 0xbe, 0x63, 0x0f, 0x88, 0x72, 0xcc, + 0x04, 0x2e, 0x94, 0xa6, 0x6d, 0xfa, 0x31, 0x8b, 0x80, 0x4a, 0x69, 0xda, 0x82, 0x63, 0x26, 0x01, + 0x21, 0x94, 0x22, 0xec, 0x86, 0x63, 0x16, 0xc5, 0x93, 0x12, 0x8e, 0x19, 0x53, 0xa8, 0x1c, 0xb3, + 0x00, 0xba, 0x49, 0x3a, 0x66, 0x31, 0x3c, 0x3d, 0xe9, 0x98, 0xc5, 0xd1, 0x9f, 0x84, 0x75, 0x64, + 0x7a, 0x43, 0xc7, 0x6c, 0x29, 0x01, 0xe5, 0x41, 0xef, 0xa7, 0x38, 0x31, 0x11, 0xa6, 0x6f, 0x7e, + 0xf0, 0x86, 0xdc, 0xa9, 0x7b, 0x9c, 0xbb, 0x5f, 0xee, 0xf1, 0xbf, 0xd1, 0x60, 0x39, 0x09, 0x21, + 0x42, 0x29, 0x7a, 0x52, 0xe0, 0xfd, 0xe6, 0xe6, 0x9b, 0xb2, 0x4f, 0xf7, 0x96, 0xbf, 0xeb, 0x9f, + 0xd6, 0xff, 0xed, 0xab, 0x35, 0xed, 0x3f, 0xbf, 0x5a, 0xd3, 0xfe, 0xe7, 0xab, 0x35, 0xed, 0x6f, + 0xff, 0x77, 0x6d, 0xee, 0x34, 0xcf, 0x7e, 0x5d, 0xf9, 0xed, 0x5f, 0x05, 0x00, 0x00, 0xff, 0xff, + 0x52, 0x4e, 0xd7, 0x33, 0xe4, 0x39, 0x00, 0x00, +} diff --git a/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/rpc.proto b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/rpc.proto new file mode 100644 index 00000000..423eabad --- /dev/null +++ b/vendor/go.etcd.io/etcd/etcdserver/etcdserverpb/rpc.proto @@ -0,0 +1,1146 @@ +syntax = "proto3"; +package etcdserverpb; + +import "gogoproto/gogo.proto"; +import "etcd/mvcc/mvccpb/kv.proto"; +import "etcd/auth/authpb/auth.proto"; + +// for grpc-gateway +import "google/api/annotations.proto"; + +option (gogoproto.marshaler_all) = true; +option (gogoproto.unmarshaler_all) = true; + +service KV { + // Range gets the keys in the range from the key-value store. + rpc Range(RangeRequest) returns (RangeResponse) { + option (google.api.http) = { + post: "/v3/kv/range" + body: "*" + }; + } + + // Put puts the given key into the key-value store. + // A put request increments the revision of the key-value store + // and generates one event in the event history. + rpc Put(PutRequest) returns (PutResponse) { + option (google.api.http) = { + post: "/v3/kv/put" + body: "*" + }; + } + + // DeleteRange deletes the given range from the key-value store. + // A delete request increments the revision of the key-value store + // and generates a delete event in the event history for every deleted key. + rpc DeleteRange(DeleteRangeRequest) returns (DeleteRangeResponse) { + option (google.api.http) = { + post: "/v3/kv/deleterange" + body: "*" + }; + } + + // Txn processes multiple requests in a single transaction. + // A txn request increments the revision of the key-value store + // and generates events with the same revision for every completed request. + // It is not allowed to modify the same key several times within one txn. + rpc Txn(TxnRequest) returns (TxnResponse) { + option (google.api.http) = { + post: "/v3/kv/txn" + body: "*" + }; + } + + // Compact compacts the event history in the etcd key-value store. The key-value + // store should be periodically compacted or the event history will continue to grow + // indefinitely. + rpc Compact(CompactionRequest) returns (CompactionResponse) { + option (google.api.http) = { + post: "/v3/kv/compaction" + body: "*" + }; + } +} + +service Watch { + // Watch watches for events happening or that have happened. Both input and output + // are streams; the input stream is for creating and canceling watchers and the output + // stream sends events. One watch RPC can watch on multiple key ranges, streaming events + // for several watches at once. The entire event history can be watched starting from the + // last compaction revision. + rpc Watch(stream WatchRequest) returns (stream WatchResponse) { + option (google.api.http) = { + post: "/v3/watch" + body: "*" + }; + } +} + +service Lease { + // LeaseGrant creates a lease which expires if the server does not receive a keepAlive + // within a given time to live period. All keys attached to the lease will be expired and + // deleted if the lease expires. Each expired key generates a delete event in the event history. + rpc LeaseGrant(LeaseGrantRequest) returns (LeaseGrantResponse) { + option (google.api.http) = { + post: "/v3/lease/grant" + body: "*" + }; + } + + // LeaseRevoke revokes a lease. All keys attached to the lease will expire and be deleted. + rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) { + option (google.api.http) = { + post: "/v3/lease/revoke" + body: "*" + additional_bindings { + post: "/v3/kv/lease/revoke" + body: "*" + } + }; + } + + // LeaseKeepAlive keeps the lease alive by streaming keep alive requests from the client + // to the server and streaming keep alive responses from the server to the client. + rpc LeaseKeepAlive(stream LeaseKeepAliveRequest) returns (stream LeaseKeepAliveResponse) { + option (google.api.http) = { + post: "/v3/lease/keepalive" + body: "*" + }; + } + + // LeaseTimeToLive retrieves lease information. + rpc LeaseTimeToLive(LeaseTimeToLiveRequest) returns (LeaseTimeToLiveResponse) { + option (google.api.http) = { + post: "/v3/lease/timetolive" + body: "*" + additional_bindings { + post: "/v3/kv/lease/timetolive" + body: "*" + } + }; + } + + // LeaseLeases lists all existing leases. + rpc LeaseLeases(LeaseLeasesRequest) returns (LeaseLeasesResponse) { + option (google.api.http) = { + post: "/v3/lease/leases" + body: "*" + additional_bindings { + post: "/v3/kv/lease/leases" + body: "*" + } + }; + } +} + +service Cluster { + // MemberAdd adds a member into the cluster. + rpc MemberAdd(MemberAddRequest) returns (MemberAddResponse) { + option (google.api.http) = { + post: "/v3/cluster/member/add" + body: "*" + }; + } + + // MemberRemove removes an existing member from the cluster. + rpc MemberRemove(MemberRemoveRequest) returns (MemberRemoveResponse) { + option (google.api.http) = { + post: "/v3/cluster/member/remove" + body: "*" + }; + } + + // MemberUpdate updates the member configuration. + rpc MemberUpdate(MemberUpdateRequest) returns (MemberUpdateResponse) { + option (google.api.http) = { + post: "/v3/cluster/member/update" + body: "*" + }; + } + + // MemberList lists all the members in the cluster. + rpc MemberList(MemberListRequest) returns (MemberListResponse) { + option (google.api.http) = { + post: "/v3/cluster/member/list" + body: "*" + }; + } + + // MemberPromote promotes a member from raft learner (non-voting) to raft voting member. + rpc MemberPromote(MemberPromoteRequest) returns (MemberPromoteResponse) { + option (google.api.http) = { + post: "/v3/cluster/member/promote" + body: "*" + }; + } +} + +service Maintenance { + // Alarm activates, deactivates, and queries alarms regarding cluster health. + rpc Alarm(AlarmRequest) returns (AlarmResponse) { + option (google.api.http) = { + post: "/v3/maintenance/alarm" + body: "*" + }; + } + + // Status gets the status of the member. + rpc Status(StatusRequest) returns (StatusResponse) { + option (google.api.http) = { + post: "/v3/maintenance/status" + body: "*" + }; + } + + // Defragment defragments a member's backend database to recover storage space. + rpc Defragment(DefragmentRequest) returns (DefragmentResponse) { + option (google.api.http) = { + post: "/v3/maintenance/defragment" + body: "*" + }; + } + + // Hash computes the hash of whole backend keyspace, + // including key, lease, and other buckets in storage. + // This is designed for testing ONLY! + // Do not rely on this in production with ongoing transactions, + // since Hash operation does not hold MVCC locks. + // Use "HashKV" API instead for "key" bucket consistency checks. + rpc Hash(HashRequest) returns (HashResponse) { + option (google.api.http) = { + post: "/v3/maintenance/hash" + body: "*" + }; + } + + // HashKV computes the hash of all MVCC keys up to a given revision. + // It only iterates "key" bucket in backend storage. + rpc HashKV(HashKVRequest) returns (HashKVResponse) { + option (google.api.http) = { + post: "/v3/maintenance/hash" + body: "*" + }; + } + + // Snapshot sends a snapshot of the entire backend from a member over a stream to a client. + rpc Snapshot(SnapshotRequest) returns (stream SnapshotResponse) { + option (google.api.http) = { + post: "/v3/maintenance/snapshot" + body: "*" + }; + } + + // MoveLeader requests current leader node to transfer its leadership to transferee. + rpc MoveLeader(MoveLeaderRequest) returns (MoveLeaderResponse) { + option (google.api.http) = { + post: "/v3/maintenance/transfer-leadership" + body: "*" + }; + } +} + +service Auth { + // AuthEnable enables authentication. + rpc AuthEnable(AuthEnableRequest) returns (AuthEnableResponse) { + option (google.api.http) = { + post: "/v3/auth/enable" + body: "*" + }; + } + + // AuthDisable disables authentication. + rpc AuthDisable(AuthDisableRequest) returns (AuthDisableResponse) { + option (google.api.http) = { + post: "/v3/auth/disable" + body: "*" + }; + } + + // Authenticate processes an authenticate request. + rpc Authenticate(AuthenticateRequest) returns (AuthenticateResponse) { + option (google.api.http) = { + post: "/v3/auth/authenticate" + body: "*" + }; + } + + // UserAdd adds a new user. User name cannot be empty. + rpc UserAdd(AuthUserAddRequest) returns (AuthUserAddResponse) { + option (google.api.http) = { + post: "/v3/auth/user/add" + body: "*" + }; + } + + // UserGet gets detailed user information. + rpc UserGet(AuthUserGetRequest) returns (AuthUserGetResponse) { + option (google.api.http) = { + post: "/v3/auth/user/get" + body: "*" + }; + } + + // UserList gets a list of all users. + rpc UserList(AuthUserListRequest) returns (AuthUserListResponse) { + option (google.api.http) = { + post: "/v3/auth/user/list" + body: "*" + }; + } + + // UserDelete deletes a specified user. + rpc UserDelete(AuthUserDeleteRequest) returns (AuthUserDeleteResponse) { + option (google.api.http) = { + post: "/v3/auth/user/delete" + body: "*" + }; + } + + // UserChangePassword changes the password of a specified user. + rpc UserChangePassword(AuthUserChangePasswordRequest) returns (AuthUserChangePasswordResponse) { + option (google.api.http) = { + post: "/v3/auth/user/changepw" + body: "*" + }; + } + + // UserGrant grants a role to a specified user. + rpc UserGrantRole(AuthUserGrantRoleRequest) returns (AuthUserGrantRoleResponse) { + option (google.api.http) = { + post: "/v3/auth/user/grant" + body: "*" + }; + } + + // UserRevokeRole revokes a role of specified user. + rpc UserRevokeRole(AuthUserRevokeRoleRequest) returns (AuthUserRevokeRoleResponse) { + option (google.api.http) = { + post: "/v3/auth/user/revoke" + body: "*" + }; + } + + // RoleAdd adds a new role. Role name cannot be empty. + rpc RoleAdd(AuthRoleAddRequest) returns (AuthRoleAddResponse) { + option (google.api.http) = { + post: "/v3/auth/role/add" + body: "*" + }; + } + + // RoleGet gets detailed role information. + rpc RoleGet(AuthRoleGetRequest) returns (AuthRoleGetResponse) { + option (google.api.http) = { + post: "/v3/auth/role/get" + body: "*" + }; + } + + // RoleList gets lists of all roles. + rpc RoleList(AuthRoleListRequest) returns (AuthRoleListResponse) { + option (google.api.http) = { + post: "/v3/auth/role/list" + body: "*" + }; + } + + // RoleDelete deletes a specified role. + rpc RoleDelete(AuthRoleDeleteRequest) returns (AuthRoleDeleteResponse) { + option (google.api.http) = { + post: "/v3/auth/role/delete" + body: "*" + }; + } + + // RoleGrantPermission grants a permission of a specified key or range to a specified role. + rpc RoleGrantPermission(AuthRoleGrantPermissionRequest) returns (AuthRoleGrantPermissionResponse) { + option (google.api.http) = { + post: "/v3/auth/role/grant" + body: "*" + }; + } + + // RoleRevokePermission revokes a key or range permission of a specified role. + rpc RoleRevokePermission(AuthRoleRevokePermissionRequest) returns (AuthRoleRevokePermissionResponse) { + option (google.api.http) = { + post: "/v3/auth/role/revoke" + body: "*" + }; + } +} + +message ResponseHeader { + // cluster_id is the ID of the cluster which sent the response. + uint64 cluster_id = 1; + // member_id is the ID of the member which sent the response. + uint64 member_id = 2; + // revision is the key-value store revision when the request was applied. + // For watch progress responses, the header.revision indicates progress. All future events + // recieved in this stream are guaranteed to have a higher revision number than the + // header.revision number. + int64 revision = 3; + // raft_term is the raft term when the request was applied. + uint64 raft_term = 4; +} + +message RangeRequest { + enum SortOrder { + NONE = 0; // default, no sorting + ASCEND = 1; // lowest target value first + DESCEND = 2; // highest target value first + } + enum SortTarget { + KEY = 0; + VERSION = 1; + CREATE = 2; + MOD = 3; + VALUE = 4; + } + + // key is the first key for the range. If range_end is not given, the request only looks up key. + bytes key = 1; + // range_end is the upper bound on the requested range [key, range_end). + // If range_end is '\0', the range is all keys >= key. + // If range_end is key plus one (e.g., "aa"+1 == "ab", "a\xff"+1 == "b"), + // then the range request gets all keys prefixed with key. + // If both key and range_end are '\0', then the range request returns all keys. + bytes range_end = 2; + // limit is a limit on the number of keys returned for the request. When limit is set to 0, + // it is treated as no limit. + int64 limit = 3; + // revision is the point-in-time of the key-value store to use for the range. + // If revision is less or equal to zero, the range is over the newest key-value store. + // If the revision has been compacted, ErrCompacted is returned as a response. + int64 revision = 4; + + // sort_order is the order for returned sorted results. + SortOrder sort_order = 5; + + // sort_target is the key-value field to use for sorting. + SortTarget sort_target = 6; + + // serializable sets the range request to use serializable member-local reads. + // Range requests are linearizable by default; linearizable requests have higher + // latency and lower throughput than serializable requests but reflect the current + // consensus of the cluster. For better performance, in exchange for possible stale reads, + // a serializable range request is served locally without needing to reach consensus + // with other nodes in the cluster. + bool serializable = 7; + + // keys_only when set returns only the keys and not the values. + bool keys_only = 8; + + // count_only when set returns only the count of the keys in the range. + bool count_only = 9; + + // min_mod_revision is the lower bound for returned key mod revisions; all keys with + // lesser mod revisions will be filtered away. + int64 min_mod_revision = 10; + + // max_mod_revision is the upper bound for returned key mod revisions; all keys with + // greater mod revisions will be filtered away. + int64 max_mod_revision = 11; + + // min_create_revision is the lower bound for returned key create revisions; all keys with + // lesser create revisions will be filtered away. + int64 min_create_revision = 12; + + // max_create_revision is the upper bound for returned key create revisions; all keys with + // greater create revisions will be filtered away. + int64 max_create_revision = 13; +} + +message RangeResponse { + ResponseHeader header = 1; + // kvs is the list of key-value pairs matched by the range request. + // kvs is empty when count is requested. + repeated mvccpb.KeyValue kvs = 2; + // more indicates if there are more keys to return in the requested range. + bool more = 3; + // count is set to the number of keys within the range when requested. + int64 count = 4; +} + +message PutRequest { + // key is the key, in bytes, to put into the key-value store. + bytes key = 1; + // value is the value, in bytes, to associate with the key in the key-value store. + bytes value = 2; + // lease is the lease ID to associate with the key in the key-value store. A lease + // value of 0 indicates no lease. + int64 lease = 3; + + // If prev_kv is set, etcd gets the previous key-value pair before changing it. + // The previous key-value pair will be returned in the put response. + bool prev_kv = 4; + + // If ignore_value is set, etcd updates the key using its current value. + // Returns an error if the key does not exist. + bool ignore_value = 5; + + // If ignore_lease is set, etcd updates the key using its current lease. + // Returns an error if the key does not exist. + bool ignore_lease = 6; +} + +message PutResponse { + ResponseHeader header = 1; + // if prev_kv is set in the request, the previous key-value pair will be returned. + mvccpb.KeyValue prev_kv = 2; +} + +message DeleteRangeRequest { + // key is the first key to delete in the range. + bytes key = 1; + // range_end is the key following the last key to delete for the range [key, range_end). + // If range_end is not given, the range is defined to contain only the key argument. + // If range_end is one bit larger than the given key, then the range is all the keys + // with the prefix (the given key). + // If range_end is '\0', the range is all keys greater than or equal to the key argument. + bytes range_end = 2; + + // If prev_kv is set, etcd gets the previous key-value pairs before deleting it. + // The previous key-value pairs will be returned in the delete response. + bool prev_kv = 3; +} + +message DeleteRangeResponse { + ResponseHeader header = 1; + // deleted is the number of keys deleted by the delete range request. + int64 deleted = 2; + // if prev_kv is set in the request, the previous key-value pairs will be returned. + repeated mvccpb.KeyValue prev_kvs = 3; +} + +message RequestOp { + // request is a union of request types accepted by a transaction. + oneof request { + RangeRequest request_range = 1; + PutRequest request_put = 2; + DeleteRangeRequest request_delete_range = 3; + TxnRequest request_txn = 4; + } +} + +message ResponseOp { + // response is a union of response types returned by a transaction. + oneof response { + RangeResponse response_range = 1; + PutResponse response_put = 2; + DeleteRangeResponse response_delete_range = 3; + TxnResponse response_txn = 4; + } +} + +message Compare { + enum CompareResult { + EQUAL = 0; + GREATER = 1; + LESS = 2; + NOT_EQUAL = 3; + } + enum CompareTarget { + VERSION = 0; + CREATE = 1; + MOD = 2; + VALUE = 3; + LEASE = 4; + } + // result is logical comparison operation for this comparison. + CompareResult result = 1; + // target is the key-value field to inspect for the comparison. + CompareTarget target = 2; + // key is the subject key for the comparison operation. + bytes key = 3; + oneof target_union { + // version is the version of the given key + int64 version = 4; + // create_revision is the creation revision of the given key + int64 create_revision = 5; + // mod_revision is the last modified revision of the given key. + int64 mod_revision = 6; + // value is the value of the given key, in bytes. + bytes value = 7; + // lease is the lease id of the given key. + int64 lease = 8; + // leave room for more target_union field tags, jump to 64 + } + + // range_end compares the given target to all keys in the range [key, range_end). + // See RangeRequest for more details on key ranges. + bytes range_end = 64; + // TODO: fill out with most of the rest of RangeRequest fields when needed. +} + +// From google paxosdb paper: +// Our implementation hinges around a powerful primitive which we call MultiOp. All other database +// operations except for iteration are implemented as a single call to MultiOp. A MultiOp is applied atomically +// and consists of three components: +// 1. A list of tests called guard. Each test in guard checks a single entry in the database. It may check +// for the absence or presence of a value, or compare with a given value. Two different tests in the guard +// may apply to the same or different entries in the database. All tests in the guard are applied and +// MultiOp returns the results. If all tests are true, MultiOp executes t op (see item 2 below), otherwise +// it executes f op (see item 3 below). +// 2. A list of database operations called t op. Each operation in the list is either an insert, delete, or +// lookup operation, and applies to a single database entry. Two different operations in the list may apply +// to the same or different entries in the database. These operations are executed +// if guard evaluates to +// true. +// 3. A list of database operations called f op. Like t op, but executed if guard evaluates to false. +message TxnRequest { + // compare is a list of predicates representing a conjunction of terms. + // If the comparisons succeed, then the success requests will be processed in order, + // and the response will contain their respective responses in order. + // If the comparisons fail, then the failure requests will be processed in order, + // and the response will contain their respective responses in order. + repeated Compare compare = 1; + // success is a list of requests which will be applied when compare evaluates to true. + repeated RequestOp success = 2; + // failure is a list of requests which will be applied when compare evaluates to false. + repeated RequestOp failure = 3; +} + +message TxnResponse { + ResponseHeader header = 1; + // succeeded is set to true if the compare evaluated to true or false otherwise. + bool succeeded = 2; + // responses is a list of responses corresponding to the results from applying + // success if succeeded is true or failure if succeeded is false. + repeated ResponseOp responses = 3; +} + +// CompactionRequest compacts the key-value store up to a given revision. All superseded keys +// with a revision less than the compaction revision will be removed. +message CompactionRequest { + // revision is the key-value store revision for the compaction operation. + int64 revision = 1; + // physical is set so the RPC will wait until the compaction is physically + // applied to the local database such that compacted entries are totally + // removed from the backend database. + bool physical = 2; +} + +message CompactionResponse { + ResponseHeader header = 1; +} + +message HashRequest { +} + +message HashKVRequest { + // revision is the key-value store revision for the hash operation. + int64 revision = 1; +} + +message HashKVResponse { + ResponseHeader header = 1; + // hash is the hash value computed from the responding member's MVCC keys up to a given revision. + uint32 hash = 2; + // compact_revision is the compacted revision of key-value store when hash begins. + int64 compact_revision = 3; +} + +message HashResponse { + ResponseHeader header = 1; + // hash is the hash value computed from the responding member's KV's backend. + uint32 hash = 2; +} + +message SnapshotRequest { +} + +message SnapshotResponse { + // header has the current key-value store information. The first header in the snapshot + // stream indicates the point in time of the snapshot. + ResponseHeader header = 1; + + // remaining_bytes is the number of blob bytes to be sent after this message + uint64 remaining_bytes = 2; + + // blob contains the next chunk of the snapshot in the snapshot stream. + bytes blob = 3; +} + +message WatchRequest { + // request_union is a request to either create a new watcher or cancel an existing watcher. + oneof request_union { + WatchCreateRequest create_request = 1; + WatchCancelRequest cancel_request = 2; + WatchProgressRequest progress_request = 3; + } +} + +message WatchCreateRequest { + // key is the key to register for watching. + bytes key = 1; + + // range_end is the end of the range [key, range_end) to watch. If range_end is not given, + // only the key argument is watched. If range_end is equal to '\0', all keys greater than + // or equal to the key argument are watched. + // If the range_end is one bit larger than the given key, + // then all keys with the prefix (the given key) will be watched. + bytes range_end = 2; + + // start_revision is an optional revision to watch from (inclusive). No start_revision is "now". + int64 start_revision = 3; + + // progress_notify is set so that the etcd server will periodically send a WatchResponse with + // no events to the new watcher if there are no recent events. It is useful when clients + // wish to recover a disconnected watcher starting from a recent known revision. + // The etcd server may decide how often it will send notifications based on current load. + bool progress_notify = 4; + + enum FilterType { + // filter out put event. + NOPUT = 0; + // filter out delete event. + NODELETE = 1; + } + + // filters filter the events at server side before it sends back to the watcher. + repeated FilterType filters = 5; + + // If prev_kv is set, created watcher gets the previous KV before the event happens. + // If the previous KV is already compacted, nothing will be returned. + bool prev_kv = 6; + + // If watch_id is provided and non-zero, it will be assigned to this watcher. + // Since creating a watcher in etcd is not a synchronous operation, + // this can be used ensure that ordering is correct when creating multiple + // watchers on the same stream. Creating a watcher with an ID already in + // use on the stream will cause an error to be returned. + int64 watch_id = 7; + + // fragment enables splitting large revisions into multiple watch responses. + bool fragment = 8; +} + +message WatchCancelRequest { + // watch_id is the watcher id to cancel so that no more events are transmitted. + int64 watch_id = 1; +} + +// Requests the a watch stream progress status be sent in the watch response stream as soon as +// possible. +message WatchProgressRequest { +} + +message WatchResponse { + ResponseHeader header = 1; + // watch_id is the ID of the watcher that corresponds to the response. + int64 watch_id = 2; + + // created is set to true if the response is for a create watch request. + // The client should record the watch_id and expect to receive events for + // the created watcher from the same stream. + // All events sent to the created watcher will attach with the same watch_id. + bool created = 3; + + // canceled is set to true if the response is for a cancel watch request. + // No further events will be sent to the canceled watcher. + bool canceled = 4; + + // compact_revision is set to the minimum index if a watcher tries to watch + // at a compacted index. + // + // This happens when creating a watcher at a compacted revision or the watcher cannot + // catch up with the progress of the key-value store. + // + // The client should treat the watcher as canceled and should not try to create any + // watcher with the same start_revision again. + int64 compact_revision = 5; + + // cancel_reason indicates the reason for canceling the watcher. + string cancel_reason = 6; + + // framgment is true if large watch response was split over multiple responses. + bool fragment = 7; + + repeated mvccpb.Event events = 11; +} + +message LeaseGrantRequest { + // TTL is the advisory time-to-live in seconds. Expired lease will return -1. + int64 TTL = 1; + // ID is the requested ID for the lease. If ID is set to 0, the lessor chooses an ID. + int64 ID = 2; +} + +message LeaseGrantResponse { + ResponseHeader header = 1; + // ID is the lease ID for the granted lease. + int64 ID = 2; + // TTL is the server chosen lease time-to-live in seconds. + int64 TTL = 3; + string error = 4; +} + +message LeaseRevokeRequest { + // ID is the lease ID to revoke. When the ID is revoked, all associated keys will be deleted. + int64 ID = 1; +} + +message LeaseRevokeResponse { + ResponseHeader header = 1; +} + +message LeaseCheckpoint { + // ID is the lease ID to checkpoint. + int64 ID = 1; + + // Remaining_TTL is the remaining time until expiry of the lease. + int64 remaining_TTL = 2; +} + +message LeaseCheckpointRequest { + repeated LeaseCheckpoint checkpoints = 1; +} + +message LeaseCheckpointResponse { + ResponseHeader header = 1; +} + +message LeaseKeepAliveRequest { + // ID is the lease ID for the lease to keep alive. + int64 ID = 1; +} + +message LeaseKeepAliveResponse { + ResponseHeader header = 1; + // ID is the lease ID from the keep alive request. + int64 ID = 2; + // TTL is the new time-to-live for the lease. + int64 TTL = 3; +} + +message LeaseTimeToLiveRequest { + // ID is the lease ID for the lease. + int64 ID = 1; + // keys is true to query all the keys attached to this lease. + bool keys = 2; +} + +message LeaseTimeToLiveResponse { + ResponseHeader header = 1; + // ID is the lease ID from the keep alive request. + int64 ID = 2; + // TTL is the remaining TTL in seconds for the lease; the lease will expire in under TTL+1 seconds. + int64 TTL = 3; + // GrantedTTL is the initial granted time in seconds upon lease creation/renewal. + int64 grantedTTL = 4; + // Keys is the list of keys attached to this lease. + repeated bytes keys = 5; +} + +message LeaseLeasesRequest { +} + +message LeaseStatus { + int64 ID = 1; + // TODO: int64 TTL = 2; +} + +message LeaseLeasesResponse { + ResponseHeader header = 1; + repeated LeaseStatus leases = 2; +} + +message Member { + // ID is the member ID for this member. + uint64 ID = 1; + // name is the human-readable name of the member. If the member is not started, the name will be an empty string. + string name = 2; + // peerURLs is the list of URLs the member exposes to the cluster for communication. + repeated string peerURLs = 3; + // clientURLs is the list of URLs the member exposes to clients for communication. If the member is not started, clientURLs will be empty. + repeated string clientURLs = 4; + // isLearner indicates if the member is raft learner. + bool isLearner = 5; +} + +message MemberAddRequest { + // peerURLs is the list of URLs the added member will use to communicate with the cluster. + repeated string peerURLs = 1; + // isLearner indicates if the added member is raft learner. + bool isLearner = 2; +} + +message MemberAddResponse { + ResponseHeader header = 1; + // member is the member information for the added member. + Member member = 2; + // members is a list of all members after adding the new member. + repeated Member members = 3; +} + +message MemberRemoveRequest { + // ID is the member ID of the member to remove. + uint64 ID = 1; +} + +message MemberRemoveResponse { + ResponseHeader header = 1; + // members is a list of all members after removing the member. + repeated Member members = 2; +} + +message MemberUpdateRequest { + // ID is the member ID of the member to update. + uint64 ID = 1; + // peerURLs is the new list of URLs the member will use to communicate with the cluster. + repeated string peerURLs = 2; +} + +message MemberUpdateResponse{ + ResponseHeader header = 1; + // members is a list of all members after updating the member. + repeated Member members = 2; +} + +message MemberListRequest { +} + +message MemberListResponse { + ResponseHeader header = 1; + // members is a list of all members associated with the cluster. + repeated Member members = 2; +} + +message MemberPromoteRequest { + // ID is the member ID of the member to promote. + uint64 ID = 1; +} + +message MemberPromoteResponse { + ResponseHeader header = 1; + // members is a list of all members after promoting the member. + repeated Member members = 2; +} + +message DefragmentRequest { +} + +message DefragmentResponse { + ResponseHeader header = 1; +} + +message MoveLeaderRequest { + // targetID is the node ID for the new leader. + uint64 targetID = 1; +} + +message MoveLeaderResponse { + ResponseHeader header = 1; +} + +enum AlarmType { + NONE = 0; // default, used to query if any alarm is active + NOSPACE = 1; // space quota is exhausted + CORRUPT = 2; // kv store corruption detected +} + +message AlarmRequest { + enum AlarmAction { + GET = 0; + ACTIVATE = 1; + DEACTIVATE = 2; + } + // action is the kind of alarm request to issue. The action + // may GET alarm statuses, ACTIVATE an alarm, or DEACTIVATE a + // raised alarm. + AlarmAction action = 1; + // memberID is the ID of the member associated with the alarm. If memberID is 0, the + // alarm request covers all members. + uint64 memberID = 2; + // alarm is the type of alarm to consider for this request. + AlarmType alarm = 3; +} + +message AlarmMember { + // memberID is the ID of the member associated with the raised alarm. + uint64 memberID = 1; + // alarm is the type of alarm which has been raised. + AlarmType alarm = 2; +} + +message AlarmResponse { + ResponseHeader header = 1; + // alarms is a list of alarms associated with the alarm request. + repeated AlarmMember alarms = 2; +} + +message StatusRequest { +} + +message StatusResponse { + ResponseHeader header = 1; + // version is the cluster protocol version used by the responding member. + string version = 2; + // dbSize is the size of the backend database physically allocated, in bytes, of the responding member. + int64 dbSize = 3; + // leader is the member ID which the responding member believes is the current leader. + uint64 leader = 4; + // raftIndex is the current raft committed index of the responding member. + uint64 raftIndex = 5; + // raftTerm is the current raft term of the responding member. + uint64 raftTerm = 6; + // raftAppliedIndex is the current raft applied index of the responding member. + uint64 raftAppliedIndex = 7; + // errors contains alarm/health information and status. + repeated string errors = 8; + // dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member. + int64 dbSizeInUse = 9; + // isLearner indicates if the member is raft learner. + bool isLearner = 10; +} + +message AuthEnableRequest { +} + +message AuthDisableRequest { +} + +message AuthenticateRequest { + string name = 1; + string password = 2; +} + +message AuthUserAddRequest { + string name = 1; + string password = 2; + authpb.UserAddOptions options = 3; +} + +message AuthUserGetRequest { + string name = 1; +} + +message AuthUserDeleteRequest { + // name is the name of the user to delete. + string name = 1; +} + +message AuthUserChangePasswordRequest { + // name is the name of the user whose password is being changed. + string name = 1; + // password is the new password for the user. + string password = 2; +} + +message AuthUserGrantRoleRequest { + // user is the name of the user which should be granted a given role. + string user = 1; + // role is the name of the role to grant to the user. + string role = 2; +} + +message AuthUserRevokeRoleRequest { + string name = 1; + string role = 2; +} + +message AuthRoleAddRequest { + // name is the name of the role to add to the authentication system. + string name = 1; +} + +message AuthRoleGetRequest { + string role = 1; +} + +message AuthUserListRequest { +} + +message AuthRoleListRequest { +} + +message AuthRoleDeleteRequest { + string role = 1; +} + +message AuthRoleGrantPermissionRequest { + // name is the name of the role which will be granted the permission. + string name = 1; + // perm is the permission to grant to the role. + authpb.Permission perm = 2; +} + +message AuthRoleRevokePermissionRequest { + string role = 1; + bytes key = 2; + bytes range_end = 3; +} + +message AuthEnableResponse { + ResponseHeader header = 1; +} + +message AuthDisableResponse { + ResponseHeader header = 1; +} + +message AuthenticateResponse { + ResponseHeader header = 1; + // token is an authorized token that can be used in succeeding RPCs + string token = 2; +} + +message AuthUserAddResponse { + ResponseHeader header = 1; +} + +message AuthUserGetResponse { + ResponseHeader header = 1; + + repeated string roles = 2; +} + +message AuthUserDeleteResponse { + ResponseHeader header = 1; +} + +message AuthUserChangePasswordResponse { + ResponseHeader header = 1; +} + +message AuthUserGrantRoleResponse { + ResponseHeader header = 1; +} + +message AuthUserRevokeRoleResponse { + ResponseHeader header = 1; +} + +message AuthRoleAddResponse { + ResponseHeader header = 1; +} + +message AuthRoleGetResponse { + ResponseHeader header = 1; + + repeated authpb.Permission perm = 2; +} + +message AuthRoleListResponse { + ResponseHeader header = 1; + + repeated string roles = 2; +} + +message AuthUserListResponse { + ResponseHeader header = 1; + + repeated string users = 2; +} + +message AuthRoleDeleteResponse { + ResponseHeader header = 1; +} + +message AuthRoleGrantPermissionResponse { + ResponseHeader header = 1; +} + +message AuthRoleRevokePermissionResponse { + ResponseHeader header = 1; +} diff --git a/vendor/go.etcd.io/etcd/mvcc/mvccpb/kv.pb.go b/vendor/go.etcd.io/etcd/mvcc/mvccpb/kv.pb.go new file mode 100644 index 00000000..23fe337a --- /dev/null +++ b/vendor/go.etcd.io/etcd/mvcc/mvccpb/kv.pb.go @@ -0,0 +1,718 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: kv.proto + +/* + Package mvccpb is a generated protocol buffer package. + + It is generated from these files: + kv.proto + + It has these top-level messages: + KeyValue + Event +*/ +package mvccpb + +import ( + "fmt" + + proto "github.com/golang/protobuf/proto" + + math "math" + + _ "github.com/gogo/protobuf/gogoproto" + + io "io" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Event_EventType int32 + +const ( + PUT Event_EventType = 0 + DELETE Event_EventType = 1 +) + +var Event_EventType_name = map[int32]string{ + 0: "PUT", + 1: "DELETE", +} +var Event_EventType_value = map[string]int32{ + "PUT": 0, + "DELETE": 1, +} + +func (x Event_EventType) String() string { + return proto.EnumName(Event_EventType_name, int32(x)) +} +func (Event_EventType) EnumDescriptor() ([]byte, []int) { return fileDescriptorKv, []int{1, 0} } + +type KeyValue struct { + // key is the key in bytes. An empty key is not allowed. + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // create_revision is the revision of last creation on this key. + CreateRevision int64 `protobuf:"varint,2,opt,name=create_revision,json=createRevision,proto3" json:"create_revision,omitempty"` + // mod_revision is the revision of last modification on this key. + ModRevision int64 `protobuf:"varint,3,opt,name=mod_revision,json=modRevision,proto3" json:"mod_revision,omitempty"` + // version is the version of the key. A deletion resets + // the version to zero and any modification of the key + // increases its version. + Version int64 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` + // value is the value held by the key, in bytes. + Value []byte `protobuf:"bytes,5,opt,name=value,proto3" json:"value,omitempty"` + // lease is the ID of the lease that attached to key. + // When the attached lease expires, the key will be deleted. + // If lease is 0, then no lease is attached to the key. + Lease int64 `protobuf:"varint,6,opt,name=lease,proto3" json:"lease,omitempty"` +} + +func (m *KeyValue) Reset() { *m = KeyValue{} } +func (m *KeyValue) String() string { return proto.CompactTextString(m) } +func (*KeyValue) ProtoMessage() {} +func (*KeyValue) Descriptor() ([]byte, []int) { return fileDescriptorKv, []int{0} } + +type Event struct { + // type is the kind of event. If type is a PUT, it indicates + // new data has been stored to the key. If type is a DELETE, + // it indicates the key was deleted. + Type Event_EventType `protobuf:"varint,1,opt,name=type,proto3,enum=mvccpb.Event_EventType" json:"type,omitempty"` + // kv holds the KeyValue for the event. + // A PUT event contains current kv pair. + // A PUT event with kv.Version=1 indicates the creation of a key. + // A DELETE/EXPIRE event contains the deleted key with + // its modification revision set to the revision of deletion. + Kv *KeyValue `protobuf:"bytes,2,opt,name=kv" json:"kv,omitempty"` + // prev_kv holds the key-value pair before the event happens. + PrevKv *KeyValue `protobuf:"bytes,3,opt,name=prev_kv,json=prevKv" json:"prev_kv,omitempty"` +} + +func (m *Event) Reset() { *m = Event{} } +func (m *Event) String() string { return proto.CompactTextString(m) } +func (*Event) ProtoMessage() {} +func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorKv, []int{1} } + +func init() { + proto.RegisterType((*KeyValue)(nil), "mvccpb.KeyValue") + proto.RegisterType((*Event)(nil), "mvccpb.Event") + proto.RegisterEnum("mvccpb.Event_EventType", Event_EventType_name, Event_EventType_value) +} +func (m *KeyValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KeyValue) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintKv(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if m.CreateRevision != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintKv(dAtA, i, uint64(m.CreateRevision)) + } + if m.ModRevision != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintKv(dAtA, i, uint64(m.ModRevision)) + } + if m.Version != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintKv(dAtA, i, uint64(m.Version)) + } + if len(m.Value) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintKv(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if m.Lease != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintKv(dAtA, i, uint64(m.Lease)) + } + return i, nil +} + +func (m *Event) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Event) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintKv(dAtA, i, uint64(m.Type)) + } + if m.Kv != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintKv(dAtA, i, uint64(m.Kv.Size())) + n1, err := m.Kv.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if m.PrevKv != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintKv(dAtA, i, uint64(m.PrevKv.Size())) + n2, err := m.PrevKv.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + return i, nil +} + +func encodeVarintKv(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *KeyValue) Size() (n int) { + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKv(uint64(l)) + } + if m.CreateRevision != 0 { + n += 1 + sovKv(uint64(m.CreateRevision)) + } + if m.ModRevision != 0 { + n += 1 + sovKv(uint64(m.ModRevision)) + } + if m.Version != 0 { + n += 1 + sovKv(uint64(m.Version)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovKv(uint64(l)) + } + if m.Lease != 0 { + n += 1 + sovKv(uint64(m.Lease)) + } + return n +} + +func (m *Event) Size() (n int) { + var l int + _ = l + if m.Type != 0 { + n += 1 + sovKv(uint64(m.Type)) + } + if m.Kv != nil { + l = m.Kv.Size() + n += 1 + l + sovKv(uint64(l)) + } + if m.PrevKv != nil { + l = m.PrevKv.Size() + n += 1 + l + sovKv(uint64(l)) + } + return n +} + +func sovKv(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozKv(x uint64) (n int) { + return sovKv(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *KeyValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KeyValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KeyValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKv + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateRevision", wireType) + } + m.CreateRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CreateRevision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ModRevision", wireType) + } + m.ModRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ModRevision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + m.Version = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Version |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKv + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Lease", wireType) + } + m.Lease = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Lease |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipKv(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKv + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Event) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Event: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Event_EventType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kv", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthKv + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Kv == nil { + m.Kv = &KeyValue{} + } + if err := m.Kv.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthKv + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PrevKv == nil { + m.PrevKv = &KeyValue{} + } + if err := m.PrevKv.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKv(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKv + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipKv(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKv + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKv + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKv + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthKv + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKv + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipKv(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthKv = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowKv = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("kv.proto", fileDescriptorKv) } + +var fileDescriptorKv = []byte{ + // 303 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x41, 0x4e, 0xc2, 0x40, + 0x14, 0x86, 0x3b, 0x14, 0x0a, 0x3e, 0x08, 0x36, 0x13, 0x12, 0x27, 0x2e, 0x26, 0x95, 0x8d, 0x18, + 0x13, 0x4c, 0xf0, 0x06, 0xc6, 0xae, 0x70, 0x61, 0x1a, 0x74, 0x4b, 0x4a, 0x79, 0x21, 0xa4, 0x94, + 0x69, 0x4a, 0x9d, 0xa4, 0x37, 0x71, 0xef, 0xde, 0x73, 0xb0, 0xe4, 0x08, 0x52, 0x2f, 0x62, 0xfa, + 0xc6, 0xe2, 0xc6, 0xcd, 0xe4, 0xfd, 0xff, 0xff, 0x65, 0xe6, 0x7f, 0x03, 0x9d, 0x58, 0x8f, 0xd3, + 0x4c, 0xe5, 0x8a, 0x3b, 0x89, 0x8e, 0xa2, 0x74, 0x71, 0x39, 0x58, 0xa9, 0x95, 0x22, 0xeb, 0xae, + 0x9a, 0x4c, 0x3a, 0xfc, 0x64, 0xd0, 0x99, 0x62, 0xf1, 0x1a, 0x6e, 0xde, 0x90, 0xbb, 0x60, 0xc7, + 0x58, 0x08, 0xe6, 0xb1, 0x51, 0x2f, 0xa8, 0x46, 0x7e, 0x0d, 0xe7, 0x51, 0x86, 0x61, 0x8e, 0xf3, + 0x0c, 0xf5, 0x7a, 0xb7, 0x56, 0x5b, 0xd1, 0xf0, 0xd8, 0xc8, 0x0e, 0xfa, 0xc6, 0x0e, 0x7e, 0x5d, + 0x7e, 0x05, 0xbd, 0x44, 0x2d, 0xff, 0x28, 0x9b, 0xa8, 0x6e, 0xa2, 0x96, 0x27, 0x44, 0x40, 0x5b, + 0x63, 0x46, 0x69, 0x93, 0xd2, 0x5a, 0xf2, 0x01, 0xb4, 0x74, 0x55, 0x40, 0xb4, 0xe8, 0x65, 0x23, + 0x2a, 0x77, 0x83, 0xe1, 0x0e, 0x85, 0x43, 0xb4, 0x11, 0xc3, 0x0f, 0x06, 0x2d, 0x5f, 0xe3, 0x36, + 0xe7, 0xb7, 0xd0, 0xcc, 0x8b, 0x14, 0xa9, 0x6e, 0x7f, 0x72, 0x31, 0x36, 0x7b, 0x8e, 0x29, 0x34, + 0xe7, 0xac, 0x48, 0x31, 0x20, 0x88, 0x7b, 0xd0, 0x88, 0x35, 0x75, 0xef, 0x4e, 0xdc, 0x1a, 0xad, + 0x17, 0x0f, 0x1a, 0xb1, 0xe6, 0x37, 0xd0, 0x4e, 0x33, 0xd4, 0xf3, 0x58, 0x53, 0xf9, 0xff, 0x30, + 0xa7, 0x02, 0xa6, 0x7a, 0xe8, 0xc1, 0xd9, 0xe9, 0x7e, 0xde, 0x06, 0xfb, 0xf9, 0x65, 0xe6, 0x5a, + 0x1c, 0xc0, 0x79, 0xf4, 0x9f, 0xfc, 0x99, 0xef, 0xb2, 0x07, 0xb1, 0x3f, 0x4a, 0xeb, 0x70, 0x94, + 0xd6, 0xbe, 0x94, 0xec, 0x50, 0x4a, 0xf6, 0x55, 0x4a, 0xf6, 0xfe, 0x2d, 0xad, 0x85, 0x43, 0xff, + 0x7e, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x45, 0x92, 0x5d, 0xa1, 0x01, 0x00, 0x00, +} diff --git a/vendor/go.etcd.io/etcd/mvcc/mvccpb/kv.proto b/vendor/go.etcd.io/etcd/mvcc/mvccpb/kv.proto new file mode 100644 index 00000000..23c911b7 --- /dev/null +++ b/vendor/go.etcd.io/etcd/mvcc/mvccpb/kv.proto @@ -0,0 +1,49 @@ +syntax = "proto3"; +package mvccpb; + +import "gogoproto/gogo.proto"; + +option (gogoproto.marshaler_all) = true; +option (gogoproto.sizer_all) = true; +option (gogoproto.unmarshaler_all) = true; +option (gogoproto.goproto_getters_all) = false; +option (gogoproto.goproto_enum_prefix_all) = false; + +message KeyValue { + // key is the key in bytes. An empty key is not allowed. + bytes key = 1; + // create_revision is the revision of last creation on this key. + int64 create_revision = 2; + // mod_revision is the revision of last modification on this key. + int64 mod_revision = 3; + // version is the version of the key. A deletion resets + // the version to zero and any modification of the key + // increases its version. + int64 version = 4; + // value is the value held by the key, in bytes. + bytes value = 5; + // lease is the ID of the lease that attached to key. + // When the attached lease expires, the key will be deleted. + // If lease is 0, then no lease is attached to the key. + int64 lease = 6; +} + +message Event { + enum EventType { + PUT = 0; + DELETE = 1; + } + // type is the kind of event. If type is a PUT, it indicates + // new data has been stored to the key. If type is a DELETE, + // it indicates the key was deleted. + EventType type = 1; + // kv holds the KeyValue for the event. + // A PUT event contains current kv pair. + // A PUT event with kv.Version=1 indicates the creation of a key. + // A DELETE/EXPIRE event contains the deleted key with + // its modification revision set to the revision of deletion. + KeyValue kv = 2; + + // prev_kv holds the key-value pair before the event happens. + KeyValue prev_kv = 3; +} diff --git a/vendor/go.etcd.io/etcd/pkg/logutil/discard_logger.go b/vendor/go.etcd.io/etcd/pkg/logutil/discard_logger.go new file mode 100644 index 00000000..81b0a9d0 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/logutil/discard_logger.go @@ -0,0 +1,46 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "log" + + "google.golang.org/grpc/grpclog" +) + +// assert that "discardLogger" satisfy "Logger" interface +var _ Logger = &discardLogger{} + +// NewDiscardLogger returns a new Logger that discards everything except "fatal". +func NewDiscardLogger() Logger { return &discardLogger{} } + +type discardLogger struct{} + +func (l *discardLogger) Info(args ...interface{}) {} +func (l *discardLogger) Infoln(args ...interface{}) {} +func (l *discardLogger) Infof(format string, args ...interface{}) {} +func (l *discardLogger) Warning(args ...interface{}) {} +func (l *discardLogger) Warningln(args ...interface{}) {} +func (l *discardLogger) Warningf(format string, args ...interface{}) {} +func (l *discardLogger) Error(args ...interface{}) {} +func (l *discardLogger) Errorln(args ...interface{}) {} +func (l *discardLogger) Errorf(format string, args ...interface{}) {} +func (l *discardLogger) Fatal(args ...interface{}) { log.Fatal(args...) } +func (l *discardLogger) Fatalln(args ...interface{}) { log.Fatalln(args...) } +func (l *discardLogger) Fatalf(format string, args ...interface{}) { log.Fatalf(format, args...) } +func (l *discardLogger) V(lvl int) bool { + return false +} +func (l *discardLogger) Lvl(lvl int) grpclog.LoggerV2 { return l } diff --git a/vendor/go.etcd.io/etcd/pkg/logutil/doc.go b/vendor/go.etcd.io/etcd/pkg/logutil/doc.go new file mode 100644 index 00000000..e919f249 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/logutil/doc.go @@ -0,0 +1,16 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package logutil includes utilities to facilitate logging. +package logutil diff --git a/vendor/go.etcd.io/etcd/pkg/logutil/log_level.go b/vendor/go.etcd.io/etcd/pkg/logutil/log_level.go new file mode 100644 index 00000000..d57e1739 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/logutil/log_level.go @@ -0,0 +1,70 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "fmt" + + "github.com/coreos/pkg/capnslog" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +var DefaultLogLevel = "info" + +// ConvertToZapLevel converts log level string to zapcore.Level. +func ConvertToZapLevel(lvl string) zapcore.Level { + switch lvl { + case "debug": + return zap.DebugLevel + case "info": + return zap.InfoLevel + case "warn": + return zap.WarnLevel + case "error": + return zap.ErrorLevel + case "dpanic": + return zap.DPanicLevel + case "panic": + return zap.PanicLevel + case "fatal": + return zap.FatalLevel + default: + panic(fmt.Sprintf("unknown level %q", lvl)) + } +} + +// ConvertToCapnslogLogLevel convert log level string to capnslog.LogLevel. +// TODO: deprecate this in 3.5 +func ConvertToCapnslogLogLevel(lvl string) capnslog.LogLevel { + switch lvl { + case "debug": + return capnslog.DEBUG + case "info": + return capnslog.INFO + case "warn": + return capnslog.WARNING + case "error": + return capnslog.ERROR + case "dpanic": + return capnslog.CRITICAL + case "panic": + return capnslog.CRITICAL + case "fatal": + return capnslog.CRITICAL + default: + panic(fmt.Sprintf("unknown level %q", lvl)) + } +} diff --git a/vendor/go.etcd.io/etcd/pkg/logutil/logger.go b/vendor/go.etcd.io/etcd/pkg/logutil/logger.go new file mode 100644 index 00000000..e7da80ef --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/logutil/logger.go @@ -0,0 +1,64 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import "google.golang.org/grpc/grpclog" + +// Logger defines logging interface. +// TODO: deprecate in v3.5. +type Logger interface { + grpclog.LoggerV2 + + // Lvl returns logger if logger's verbosity level >= "lvl". + // Otherwise, logger that discards everything. + Lvl(lvl int) grpclog.LoggerV2 +} + +// assert that "defaultLogger" satisfy "Logger" interface +var _ Logger = &defaultLogger{} + +// NewLogger wraps "grpclog.LoggerV2" that implements "Logger" interface. +// +// For example: +// +// var defaultLogger Logger +// g := grpclog.NewLoggerV2WithVerbosity(os.Stderr, os.Stderr, os.Stderr, 4) +// defaultLogger = NewLogger(g) +// +func NewLogger(g grpclog.LoggerV2) Logger { return &defaultLogger{g: g} } + +type defaultLogger struct { + g grpclog.LoggerV2 +} + +func (l *defaultLogger) Info(args ...interface{}) { l.g.Info(args...) } +func (l *defaultLogger) Infoln(args ...interface{}) { l.g.Info(args...) } +func (l *defaultLogger) Infof(format string, args ...interface{}) { l.g.Infof(format, args...) } +func (l *defaultLogger) Warning(args ...interface{}) { l.g.Warning(args...) } +func (l *defaultLogger) Warningln(args ...interface{}) { l.g.Warning(args...) } +func (l *defaultLogger) Warningf(format string, args ...interface{}) { l.g.Warningf(format, args...) } +func (l *defaultLogger) Error(args ...interface{}) { l.g.Error(args...) } +func (l *defaultLogger) Errorln(args ...interface{}) { l.g.Error(args...) } +func (l *defaultLogger) Errorf(format string, args ...interface{}) { l.g.Errorf(format, args...) } +func (l *defaultLogger) Fatal(args ...interface{}) { l.g.Fatal(args...) } +func (l *defaultLogger) Fatalln(args ...interface{}) { l.g.Fatal(args...) } +func (l *defaultLogger) Fatalf(format string, args ...interface{}) { l.g.Fatalf(format, args...) } +func (l *defaultLogger) V(lvl int) bool { return l.g.V(lvl) } +func (l *defaultLogger) Lvl(lvl int) grpclog.LoggerV2 { + if l.g.V(lvl) { + return l + } + return &discardLogger{} +} diff --git a/vendor/go.etcd.io/etcd/pkg/logutil/merge_logger.go b/vendor/go.etcd.io/etcd/pkg/logutil/merge_logger.go new file mode 100644 index 00000000..866b6f7a --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/logutil/merge_logger.go @@ -0,0 +1,194 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "fmt" + "sync" + "time" + + "github.com/coreos/pkg/capnslog" +) + +var ( + defaultMergePeriod = time.Second + defaultTimeOutputScale = 10 * time.Millisecond + + outputInterval = time.Second +) + +// line represents a log line that can be printed out +// through capnslog.PackageLogger. +type line struct { + level capnslog.LogLevel + str string +} + +func (l line) append(s string) line { + return line{ + level: l.level, + str: l.str + " " + s, + } +} + +// status represents the merge status of a line. +type status struct { + period time.Duration + + start time.Time // start time of latest merge period + count int // number of merged lines from starting +} + +func (s *status) isInMergePeriod(now time.Time) bool { + return s.period == 0 || s.start.Add(s.period).After(now) +} + +func (s *status) isEmpty() bool { return s.count == 0 } + +func (s *status) summary(now time.Time) string { + ts := s.start.Round(defaultTimeOutputScale) + took := now.Round(defaultTimeOutputScale).Sub(ts) + return fmt.Sprintf("[merged %d repeated lines in %s]", s.count, took) +} + +func (s *status) reset(now time.Time) { + s.start = now + s.count = 0 +} + +// MergeLogger supports merge logging, which merges repeated log lines +// and prints summary log lines instead. +// +// For merge logging, MergeLogger prints out the line when the line appears +// at the first time. MergeLogger holds the same log line printed within +// defaultMergePeriod, and prints out summary log line at the end of defaultMergePeriod. +// It stops merging when the line doesn't appear within the +// defaultMergePeriod. +type MergeLogger struct { + *capnslog.PackageLogger + + mu sync.Mutex // protect statusm + statusm map[line]*status +} + +func NewMergeLogger(logger *capnslog.PackageLogger) *MergeLogger { + l := &MergeLogger{ + PackageLogger: logger, + statusm: make(map[line]*status), + } + go l.outputLoop() + return l +} + +func (l *MergeLogger) MergeInfo(entries ...interface{}) { + l.merge(line{ + level: capnslog.INFO, + str: fmt.Sprint(entries...), + }) +} + +func (l *MergeLogger) MergeInfof(format string, args ...interface{}) { + l.merge(line{ + level: capnslog.INFO, + str: fmt.Sprintf(format, args...), + }) +} + +func (l *MergeLogger) MergeNotice(entries ...interface{}) { + l.merge(line{ + level: capnslog.NOTICE, + str: fmt.Sprint(entries...), + }) +} + +func (l *MergeLogger) MergeNoticef(format string, args ...interface{}) { + l.merge(line{ + level: capnslog.NOTICE, + str: fmt.Sprintf(format, args...), + }) +} + +func (l *MergeLogger) MergeWarning(entries ...interface{}) { + l.merge(line{ + level: capnslog.WARNING, + str: fmt.Sprint(entries...), + }) +} + +func (l *MergeLogger) MergeWarningf(format string, args ...interface{}) { + l.merge(line{ + level: capnslog.WARNING, + str: fmt.Sprintf(format, args...), + }) +} + +func (l *MergeLogger) MergeError(entries ...interface{}) { + l.merge(line{ + level: capnslog.ERROR, + str: fmt.Sprint(entries...), + }) +} + +func (l *MergeLogger) MergeErrorf(format string, args ...interface{}) { + l.merge(line{ + level: capnslog.ERROR, + str: fmt.Sprintf(format, args...), + }) +} + +func (l *MergeLogger) merge(ln line) { + l.mu.Lock() + + // increase count if the logger is merging the line + if status, ok := l.statusm[ln]; ok { + status.count++ + l.mu.Unlock() + return + } + + // initialize status of the line + l.statusm[ln] = &status{ + period: defaultMergePeriod, + start: time.Now(), + } + // release the lock before IO operation + l.mu.Unlock() + // print out the line at its first time + l.PackageLogger.Logf(ln.level, ln.str) +} + +func (l *MergeLogger) outputLoop() { + for now := range time.Tick(outputInterval) { + var outputs []line + + l.mu.Lock() + for ln, status := range l.statusm { + if status.isInMergePeriod(now) { + continue + } + if status.isEmpty() { + delete(l.statusm, ln) + continue + } + outputs = append(outputs, ln.append(status.summary(now))) + status.reset(now) + } + l.mu.Unlock() + + for _, o := range outputs { + l.PackageLogger.Logf(o.level, o.str) + } + } +} diff --git a/vendor/go.etcd.io/etcd/pkg/logutil/package_logger.go b/vendor/go.etcd.io/etcd/pkg/logutil/package_logger.go new file mode 100644 index 00000000..729cbdb5 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/logutil/package_logger.go @@ -0,0 +1,60 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "github.com/coreos/pkg/capnslog" + "google.golang.org/grpc/grpclog" +) + +// assert that "packageLogger" satisfy "Logger" interface +var _ Logger = &packageLogger{} + +// NewPackageLogger wraps "*capnslog.PackageLogger" that implements "Logger" interface. +// +// For example: +// +// var defaultLogger Logger +// defaultLogger = NewPackageLogger("go.etcd.io/etcd", "snapshot") +// +func NewPackageLogger(repo, pkg string) Logger { + return &packageLogger{p: capnslog.NewPackageLogger(repo, pkg)} +} + +type packageLogger struct { + p *capnslog.PackageLogger +} + +func (l *packageLogger) Info(args ...interface{}) { l.p.Info(args...) } +func (l *packageLogger) Infoln(args ...interface{}) { l.p.Info(args...) } +func (l *packageLogger) Infof(format string, args ...interface{}) { l.p.Infof(format, args...) } +func (l *packageLogger) Warning(args ...interface{}) { l.p.Warning(args...) } +func (l *packageLogger) Warningln(args ...interface{}) { l.p.Warning(args...) } +func (l *packageLogger) Warningf(format string, args ...interface{}) { l.p.Warningf(format, args...) } +func (l *packageLogger) Error(args ...interface{}) { l.p.Error(args...) } +func (l *packageLogger) Errorln(args ...interface{}) { l.p.Error(args...) } +func (l *packageLogger) Errorf(format string, args ...interface{}) { l.p.Errorf(format, args...) } +func (l *packageLogger) Fatal(args ...interface{}) { l.p.Fatal(args...) } +func (l *packageLogger) Fatalln(args ...interface{}) { l.p.Fatal(args...) } +func (l *packageLogger) Fatalf(format string, args ...interface{}) { l.p.Fatalf(format, args...) } +func (l *packageLogger) V(lvl int) bool { + return l.p.LevelAt(capnslog.LogLevel(lvl)) +} +func (l *packageLogger) Lvl(lvl int) grpclog.LoggerV2 { + if l.p.LevelAt(capnslog.LogLevel(lvl)) { + return l + } + return &discardLogger{} +} diff --git a/vendor/go.etcd.io/etcd/pkg/logutil/zap.go b/vendor/go.etcd.io/etcd/pkg/logutil/zap.go new file mode 100644 index 00000000..8fc6e03b --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/logutil/zap.go @@ -0,0 +1,91 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "sort" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// DefaultZapLoggerConfig defines default zap logger configuration. +var DefaultZapLoggerConfig = zap.Config{ + Level: zap.NewAtomicLevelAt(ConvertToZapLevel(DefaultLogLevel)), + + Development: false, + Sampling: &zap.SamplingConfig{ + Initial: 100, + Thereafter: 100, + }, + + Encoding: "json", + + // copied from "zap.NewProductionEncoderConfig" with some updates + EncoderConfig: zapcore.EncoderConfig{ + TimeKey: "ts", + LevelKey: "level", + NameKey: "logger", + CallerKey: "caller", + MessageKey: "msg", + StacktraceKey: "stacktrace", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + }, + + // Use "/dev/null" to discard all + OutputPaths: []string{"stderr"}, + ErrorOutputPaths: []string{"stderr"}, +} + +// MergeOutputPaths merges logging output paths, resolving conflicts. +func MergeOutputPaths(cfg zap.Config) zap.Config { + outputs := make(map[string]struct{}) + for _, v := range cfg.OutputPaths { + outputs[v] = struct{}{} + } + outputSlice := make([]string, 0) + if _, ok := outputs["/dev/null"]; ok { + // "/dev/null" to discard all + outputSlice = []string{"/dev/null"} + } else { + for k := range outputs { + outputSlice = append(outputSlice, k) + } + } + cfg.OutputPaths = outputSlice + sort.Strings(cfg.OutputPaths) + + errOutputs := make(map[string]struct{}) + for _, v := range cfg.ErrorOutputPaths { + errOutputs[v] = struct{}{} + } + errOutputSlice := make([]string, 0) + if _, ok := errOutputs["/dev/null"]; ok { + // "/dev/null" to discard all + errOutputSlice = []string{"/dev/null"} + } else { + for k := range errOutputs { + errOutputSlice = append(errOutputSlice, k) + } + } + cfg.ErrorOutputPaths = errOutputSlice + sort.Strings(cfg.ErrorOutputPaths) + + return cfg +} diff --git a/vendor/go.etcd.io/etcd/pkg/logutil/zap_grpc.go b/vendor/go.etcd.io/etcd/pkg/logutil/zap_grpc.go new file mode 100644 index 00000000..3f48d813 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/logutil/zap_grpc.go @@ -0,0 +1,111 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "google.golang.org/grpc/grpclog" +) + +// NewGRPCLoggerV2 converts "*zap.Logger" to "grpclog.LoggerV2". +// It discards all INFO level logging in gRPC, if debug level +// is not enabled in "*zap.Logger". +func NewGRPCLoggerV2(lcfg zap.Config) (grpclog.LoggerV2, error) { + lg, err := lcfg.Build(zap.AddCallerSkip(1)) // to annotate caller outside of "logutil" + if err != nil { + return nil, err + } + return &zapGRPCLogger{lg: lg, sugar: lg.Sugar()}, nil +} + +// NewGRPCLoggerV2FromZapCore creates "grpclog.LoggerV2" from "zap.Core" +// and "zapcore.WriteSyncer". It discards all INFO level logging in gRPC, +// if debug level is not enabled in "*zap.Logger". +func NewGRPCLoggerV2FromZapCore(cr zapcore.Core, syncer zapcore.WriteSyncer) grpclog.LoggerV2 { + // "AddCallerSkip" to annotate caller outside of "logutil" + lg := zap.New(cr, zap.AddCaller(), zap.AddCallerSkip(1), zap.ErrorOutput(syncer)) + return &zapGRPCLogger{lg: lg, sugar: lg.Sugar()} +} + +type zapGRPCLogger struct { + lg *zap.Logger + sugar *zap.SugaredLogger +} + +func (zl *zapGRPCLogger) Info(args ...interface{}) { + if !zl.lg.Core().Enabled(zapcore.DebugLevel) { + return + } + zl.sugar.Info(args...) +} + +func (zl *zapGRPCLogger) Infoln(args ...interface{}) { + if !zl.lg.Core().Enabled(zapcore.DebugLevel) { + return + } + zl.sugar.Info(args...) +} + +func (zl *zapGRPCLogger) Infof(format string, args ...interface{}) { + if !zl.lg.Core().Enabled(zapcore.DebugLevel) { + return + } + zl.sugar.Infof(format, args...) +} + +func (zl *zapGRPCLogger) Warning(args ...interface{}) { + zl.sugar.Warn(args...) +} + +func (zl *zapGRPCLogger) Warningln(args ...interface{}) { + zl.sugar.Warn(args...) +} + +func (zl *zapGRPCLogger) Warningf(format string, args ...interface{}) { + zl.sugar.Warnf(format, args...) +} + +func (zl *zapGRPCLogger) Error(args ...interface{}) { + zl.sugar.Error(args...) +} + +func (zl *zapGRPCLogger) Errorln(args ...interface{}) { + zl.sugar.Error(args...) +} + +func (zl *zapGRPCLogger) Errorf(format string, args ...interface{}) { + zl.sugar.Errorf(format, args...) +} + +func (zl *zapGRPCLogger) Fatal(args ...interface{}) { + zl.sugar.Fatal(args...) +} + +func (zl *zapGRPCLogger) Fatalln(args ...interface{}) { + zl.sugar.Fatal(args...) +} + +func (zl *zapGRPCLogger) Fatalf(format string, args ...interface{}) { + zl.sugar.Fatalf(format, args...) +} + +func (zl *zapGRPCLogger) V(l int) bool { + // infoLog == 0 + if l <= 0 { // debug level, then we ignore info level in gRPC + return !zl.lg.Core().Enabled(zapcore.DebugLevel) + } + return true +} diff --git a/vendor/go.etcd.io/etcd/pkg/logutil/zap_journal.go b/vendor/go.etcd.io/etcd/pkg/logutil/zap_journal.go new file mode 100644 index 00000000..fcd39038 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/logutil/zap_journal.go @@ -0,0 +1,92 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package logutil + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + + "go.etcd.io/etcd/pkg/systemd" + + "github.com/coreos/go-systemd/journal" + "go.uber.org/zap/zapcore" +) + +// NewJournalWriter wraps "io.Writer" to redirect log output +// to the local systemd journal. If journald send fails, it fails +// back to writing to the original writer. +// The decode overhead is only <30µs per write. +// Reference: https://github.com/coreos/pkg/blob/master/capnslog/journald_formatter.go +func NewJournalWriter(wr io.Writer) (io.Writer, error) { + return &journalWriter{Writer: wr}, systemd.DialJournal() +} + +type journalWriter struct { + io.Writer +} + +// WARN: assume that etcd uses default field names in zap encoder config +// make sure to keep this up-to-date! +type logLine struct { + Level string `json:"level"` + Caller string `json:"caller"` +} + +func (w *journalWriter) Write(p []byte) (int, error) { + line := &logLine{} + if err := json.NewDecoder(bytes.NewReader(p)).Decode(line); err != nil { + return 0, err + } + + var pri journal.Priority + switch line.Level { + case zapcore.DebugLevel.String(): + pri = journal.PriDebug + case zapcore.InfoLevel.String(): + pri = journal.PriInfo + + case zapcore.WarnLevel.String(): + pri = journal.PriWarning + case zapcore.ErrorLevel.String(): + pri = journal.PriErr + + case zapcore.DPanicLevel.String(): + pri = journal.PriCrit + case zapcore.PanicLevel.String(): + pri = journal.PriCrit + case zapcore.FatalLevel.String(): + pri = journal.PriCrit + + default: + panic(fmt.Errorf("unknown log level: %q", line.Level)) + } + + err := journal.Send(string(p), pri, map[string]string{ + "PACKAGE": filepath.Dir(line.Caller), + "SYSLOG_IDENTIFIER": filepath.Base(os.Args[0]), + }) + if err != nil { + // "journal" also falls back to stderr + // "fmt.Fprintln(os.Stderr, s)" + return w.Writer.Write(p) + } + return 0, nil +} diff --git a/vendor/go.etcd.io/etcd/pkg/logutil/zap_raft.go b/vendor/go.etcd.io/etcd/pkg/logutil/zap_raft.go new file mode 100644 index 00000000..f016b305 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/logutil/zap_raft.go @@ -0,0 +1,102 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "errors" + + "go.etcd.io/etcd/raft" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// NewRaftLogger builds "raft.Logger" from "*zap.Config". +func NewRaftLogger(lcfg *zap.Config) (raft.Logger, error) { + if lcfg == nil { + return nil, errors.New("nil zap.Config") + } + lg, err := lcfg.Build(zap.AddCallerSkip(1)) // to annotate caller outside of "logutil" + if err != nil { + return nil, err + } + return &zapRaftLogger{lg: lg, sugar: lg.Sugar()}, nil +} + +// NewRaftLoggerZap converts "*zap.Logger" to "raft.Logger". +func NewRaftLoggerZap(lg *zap.Logger) raft.Logger { + return &zapRaftLogger{lg: lg, sugar: lg.Sugar()} +} + +// NewRaftLoggerFromZapCore creates "raft.Logger" from "zap.Core" +// and "zapcore.WriteSyncer". +func NewRaftLoggerFromZapCore(cr zapcore.Core, syncer zapcore.WriteSyncer) raft.Logger { + // "AddCallerSkip" to annotate caller outside of "logutil" + lg := zap.New(cr, zap.AddCaller(), zap.AddCallerSkip(1), zap.ErrorOutput(syncer)) + return &zapRaftLogger{lg: lg, sugar: lg.Sugar()} +} + +type zapRaftLogger struct { + lg *zap.Logger + sugar *zap.SugaredLogger +} + +func (zl *zapRaftLogger) Debug(args ...interface{}) { + zl.sugar.Debug(args...) +} + +func (zl *zapRaftLogger) Debugf(format string, args ...interface{}) { + zl.sugar.Debugf(format, args...) +} + +func (zl *zapRaftLogger) Error(args ...interface{}) { + zl.sugar.Error(args...) +} + +func (zl *zapRaftLogger) Errorf(format string, args ...interface{}) { + zl.sugar.Errorf(format, args...) +} + +func (zl *zapRaftLogger) Info(args ...interface{}) { + zl.sugar.Info(args...) +} + +func (zl *zapRaftLogger) Infof(format string, args ...interface{}) { + zl.sugar.Infof(format, args...) +} + +func (zl *zapRaftLogger) Warning(args ...interface{}) { + zl.sugar.Warn(args...) +} + +func (zl *zapRaftLogger) Warningf(format string, args ...interface{}) { + zl.sugar.Warnf(format, args...) +} + +func (zl *zapRaftLogger) Fatal(args ...interface{}) { + zl.sugar.Fatal(args...) +} + +func (zl *zapRaftLogger) Fatalf(format string, args ...interface{}) { + zl.sugar.Fatalf(format, args...) +} + +func (zl *zapRaftLogger) Panic(args ...interface{}) { + zl.sugar.Panic(args...) +} + +func (zl *zapRaftLogger) Panicf(format string, args ...interface{}) { + zl.sugar.Panicf(format, args...) +} diff --git a/vendor/go.etcd.io/etcd/pkg/systemd/doc.go b/vendor/go.etcd.io/etcd/pkg/systemd/doc.go new file mode 100644 index 00000000..30e77ce0 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/systemd/doc.go @@ -0,0 +1,16 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package systemd provides utility functions for systemd. +package systemd diff --git a/vendor/go.etcd.io/etcd/pkg/systemd/journal.go b/vendor/go.etcd.io/etcd/pkg/systemd/journal.go new file mode 100644 index 00000000..b861c694 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/systemd/journal.go @@ -0,0 +1,29 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package systemd + +import "net" + +// DialJournal returns no error if the process can dial journal socket. +// Returns an error if dial failed, whichi indicates journald is not available +// (e.g. run embedded etcd as docker daemon). +// Reference: https://github.com/coreos/go-systemd/blob/master/journal/journal.go. +func DialJournal() error { + conn, err := net.Dial("unixgram", "/run/systemd/journal/socket") + if conn != nil { + defer conn.Close() + } + return err +} diff --git a/vendor/go.etcd.io/etcd/pkg/types/doc.go b/vendor/go.etcd.io/etcd/pkg/types/doc.go new file mode 100644 index 00000000..de8ef0bd --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/types/doc.go @@ -0,0 +1,17 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package types declares various data types and implements type-checking +// functions. +package types diff --git a/vendor/go.etcd.io/etcd/pkg/types/id.go b/vendor/go.etcd.io/etcd/pkg/types/id.go new file mode 100644 index 00000000..ae00388d --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/types/id.go @@ -0,0 +1,39 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import "strconv" + +// ID represents a generic identifier which is canonically +// stored as a uint64 but is typically represented as a +// base-16 string for input/output +type ID uint64 + +func (i ID) String() string { + return strconv.FormatUint(uint64(i), 16) +} + +// IDFromString attempts to create an ID from a base-16 string. +func IDFromString(s string) (ID, error) { + i, err := strconv.ParseUint(s, 16, 64) + return ID(i), err +} + +// IDSlice implements the sort interface +type IDSlice []ID + +func (p IDSlice) Len() int { return len(p) } +func (p IDSlice) Less(i, j int) bool { return uint64(p[i]) < uint64(p[j]) } +func (p IDSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/go.etcd.io/etcd/pkg/types/set.go b/vendor/go.etcd.io/etcd/pkg/types/set.go new file mode 100644 index 00000000..e7a3cdc9 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/types/set.go @@ -0,0 +1,195 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "reflect" + "sort" + "sync" +) + +type Set interface { + Add(string) + Remove(string) + Contains(string) bool + Equals(Set) bool + Length() int + Values() []string + Copy() Set + Sub(Set) Set +} + +func NewUnsafeSet(values ...string) *unsafeSet { + set := &unsafeSet{make(map[string]struct{})} + for _, v := range values { + set.Add(v) + } + return set +} + +func NewThreadsafeSet(values ...string) *tsafeSet { + us := NewUnsafeSet(values...) + return &tsafeSet{us, sync.RWMutex{}} +} + +type unsafeSet struct { + d map[string]struct{} +} + +// Add adds a new value to the set (no-op if the value is already present) +func (us *unsafeSet) Add(value string) { + us.d[value] = struct{}{} +} + +// Remove removes the given value from the set +func (us *unsafeSet) Remove(value string) { + delete(us.d, value) +} + +// Contains returns whether the set contains the given value +func (us *unsafeSet) Contains(value string) (exists bool) { + _, exists = us.d[value] + return exists +} + +// ContainsAll returns whether the set contains all given values +func (us *unsafeSet) ContainsAll(values []string) bool { + for _, s := range values { + if !us.Contains(s) { + return false + } + } + return true +} + +// Equals returns whether the contents of two sets are identical +func (us *unsafeSet) Equals(other Set) bool { + v1 := sort.StringSlice(us.Values()) + v2 := sort.StringSlice(other.Values()) + v1.Sort() + v2.Sort() + return reflect.DeepEqual(v1, v2) +} + +// Length returns the number of elements in the set +func (us *unsafeSet) Length() int { + return len(us.d) +} + +// Values returns the values of the Set in an unspecified order. +func (us *unsafeSet) Values() (values []string) { + values = make([]string, 0) + for val := range us.d { + values = append(values, val) + } + return values +} + +// Copy creates a new Set containing the values of the first +func (us *unsafeSet) Copy() Set { + cp := NewUnsafeSet() + for val := range us.d { + cp.Add(val) + } + + return cp +} + +// Sub removes all elements in other from the set +func (us *unsafeSet) Sub(other Set) Set { + oValues := other.Values() + result := us.Copy().(*unsafeSet) + + for _, val := range oValues { + if _, ok := result.d[val]; !ok { + continue + } + delete(result.d, val) + } + + return result +} + +type tsafeSet struct { + us *unsafeSet + m sync.RWMutex +} + +func (ts *tsafeSet) Add(value string) { + ts.m.Lock() + defer ts.m.Unlock() + ts.us.Add(value) +} + +func (ts *tsafeSet) Remove(value string) { + ts.m.Lock() + defer ts.m.Unlock() + ts.us.Remove(value) +} + +func (ts *tsafeSet) Contains(value string) (exists bool) { + ts.m.RLock() + defer ts.m.RUnlock() + return ts.us.Contains(value) +} + +func (ts *tsafeSet) Equals(other Set) bool { + ts.m.RLock() + defer ts.m.RUnlock() + + // If ts and other represent the same variable, avoid calling + // ts.us.Equals(other), to avoid double RLock bug + if _other, ok := other.(*tsafeSet); ok { + if _other == ts { + return true + } + } + return ts.us.Equals(other) +} + +func (ts *tsafeSet) Length() int { + ts.m.RLock() + defer ts.m.RUnlock() + return ts.us.Length() +} + +func (ts *tsafeSet) Values() (values []string) { + ts.m.RLock() + defer ts.m.RUnlock() + return ts.us.Values() +} + +func (ts *tsafeSet) Copy() Set { + ts.m.RLock() + defer ts.m.RUnlock() + usResult := ts.us.Copy().(*unsafeSet) + return &tsafeSet{usResult, sync.RWMutex{}} +} + +func (ts *tsafeSet) Sub(other Set) Set { + ts.m.RLock() + defer ts.m.RUnlock() + + // If ts and other represent the same variable, avoid calling + // ts.us.Sub(other), to avoid double RLock bug + if _other, ok := other.(*tsafeSet); ok { + if _other == ts { + usResult := NewUnsafeSet() + return &tsafeSet{usResult, sync.RWMutex{}} + } + } + usResult := ts.us.Sub(other).(*unsafeSet) + return &tsafeSet{usResult, sync.RWMutex{}} +} diff --git a/vendor/go.etcd.io/etcd/pkg/types/slice.go b/vendor/go.etcd.io/etcd/pkg/types/slice.go new file mode 100644 index 00000000..0dd9ca79 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/types/slice.go @@ -0,0 +1,22 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +// Uint64Slice implements sort interface +type Uint64Slice []uint64 + +func (p Uint64Slice) Len() int { return len(p) } +func (p Uint64Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Uint64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/go.etcd.io/etcd/pkg/types/urls.go b/vendor/go.etcd.io/etcd/pkg/types/urls.go new file mode 100644 index 00000000..9e5d03ff --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/types/urls.go @@ -0,0 +1,82 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "errors" + "fmt" + "net" + "net/url" + "sort" + "strings" +) + +type URLs []url.URL + +func NewURLs(strs []string) (URLs, error) { + all := make([]url.URL, len(strs)) + if len(all) == 0 { + return nil, errors.New("no valid URLs given") + } + for i, in := range strs { + in = strings.TrimSpace(in) + u, err := url.Parse(in) + if err != nil { + return nil, err + } + if u.Scheme != "http" && u.Scheme != "https" && u.Scheme != "unix" && u.Scheme != "unixs" { + return nil, fmt.Errorf("URL scheme must be http, https, unix, or unixs: %s", in) + } + if _, _, err := net.SplitHostPort(u.Host); err != nil { + return nil, fmt.Errorf(`URL address does not have the form "host:port": %s`, in) + } + if u.Path != "" { + return nil, fmt.Errorf("URL must not contain a path: %s", in) + } + all[i] = *u + } + us := URLs(all) + us.Sort() + + return us, nil +} + +func MustNewURLs(strs []string) URLs { + urls, err := NewURLs(strs) + if err != nil { + panic(err) + } + return urls +} + +func (us URLs) String() string { + return strings.Join(us.StringSlice(), ",") +} + +func (us *URLs) Sort() { + sort.Sort(us) +} +func (us URLs) Len() int { return len(us) } +func (us URLs) Less(i, j int) bool { return us[i].String() < us[j].String() } +func (us URLs) Swap(i, j int) { us[i], us[j] = us[j], us[i] } + +func (us URLs) StringSlice() []string { + out := make([]string, len(us)) + for i := range us { + out[i] = us[i].String() + } + + return out +} diff --git a/vendor/go.etcd.io/etcd/pkg/types/urlsmap.go b/vendor/go.etcd.io/etcd/pkg/types/urlsmap.go new file mode 100644 index 00000000..47690cc3 --- /dev/null +++ b/vendor/go.etcd.io/etcd/pkg/types/urlsmap.go @@ -0,0 +1,107 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "fmt" + "sort" + "strings" +) + +// URLsMap is a map from a name to its URLs. +type URLsMap map[string]URLs + +// NewURLsMap returns a URLsMap instantiated from the given string, +// which consists of discovery-formatted names-to-URLs, like: +// mach0=http://1.1.1.1:2380,mach0=http://2.2.2.2::2380,mach1=http://3.3.3.3:2380,mach2=http://4.4.4.4:2380 +func NewURLsMap(s string) (URLsMap, error) { + m := parse(s) + + cl := URLsMap{} + for name, urls := range m { + us, err := NewURLs(urls) + if err != nil { + return nil, err + } + cl[name] = us + } + return cl, nil +} + +// NewURLsMapFromStringMap takes a map of strings and returns a URLsMap. The +// string values in the map can be multiple values separated by the sep string. +func NewURLsMapFromStringMap(m map[string]string, sep string) (URLsMap, error) { + var err error + um := URLsMap{} + for k, v := range m { + um[k], err = NewURLs(strings.Split(v, sep)) + if err != nil { + return nil, err + } + } + return um, nil +} + +// String turns URLsMap into discovery-formatted name-to-URLs sorted by name. +func (c URLsMap) String() string { + var pairs []string + for name, urls := range c { + for _, url := range urls { + pairs = append(pairs, fmt.Sprintf("%s=%s", name, url.String())) + } + } + sort.Strings(pairs) + return strings.Join(pairs, ",") +} + +// URLs returns a list of all URLs. +// The returned list is sorted in ascending lexicographical order. +func (c URLsMap) URLs() []string { + var urls []string + for _, us := range c { + for _, u := range us { + urls = append(urls, u.String()) + } + } + sort.Strings(urls) + return urls +} + +// Len returns the size of URLsMap. +func (c URLsMap) Len() int { + return len(c) +} + +// parse parses the given string and returns a map listing the values specified for each key. +func parse(s string) map[string][]string { + m := make(map[string][]string) + for s != "" { + key := s + if i := strings.IndexAny(key, ","); i >= 0 { + key, s = key[:i], key[i+1:] + } else { + s = "" + } + if key == "" { + continue + } + value := "" + if i := strings.Index(key, "="); i >= 0 { + key, value = key[:i], key[i+1:] + } + m[key] = append(m[key], value) + } + return m +} diff --git a/vendor/go.etcd.io/etcd/raft/OWNERS b/vendor/go.etcd.io/etcd/raft/OWNERS new file mode 100644 index 00000000..ab781066 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/OWNERS @@ -0,0 +1,19 @@ +approvers: +- heyitsanthony +- philips +- fanminshi +- gyuho +- mitake +- jpbetz +- xiang90 +- bdarnell +reviewers: +- heyitsanthony +- philips +- fanminshi +- gyuho +- mitake +- jpbetz +- xiang90 +- bdarnell +- tschottdorf diff --git a/vendor/go.etcd.io/etcd/raft/README.md b/vendor/go.etcd.io/etcd/raft/README.md new file mode 100644 index 00000000..83cf0403 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/README.md @@ -0,0 +1,197 @@ +# Raft library + +Raft is a protocol with which a cluster of nodes can maintain a replicated state machine. +The state machine is kept in sync through the use of a replicated log. +For more details on Raft, see "In Search of an Understandable Consensus Algorithm" +(https://raft.github.io/raft.pdf) by Diego Ongaro and John Ousterhout. + +This Raft library is stable and feature complete. As of 2016, it is **the most widely used** Raft library in production, serving tens of thousands clusters each day. It powers distributed systems such as etcd, Kubernetes, Docker Swarm, Cloud Foundry Diego, CockroachDB, TiDB, Project Calico, Flannel, and more. + +Most Raft implementations have a monolithic design, including storage handling, messaging serialization, and network transport. This library instead follows a minimalistic design philosophy by only implementing the core raft algorithm. This minimalism buys flexibility, determinism, and performance. + +To keep the codebase small as well as provide flexibility, the library only implements the Raft algorithm; both network and disk IO are left to the user. Library users must implement their own transportation layer for message passing between Raft peers over the wire. Similarly, users must implement their own storage layer to persist the Raft log and state. + +In order to easily test the Raft library, its behavior should be deterministic. To achieve this determinism, the library models Raft as a state machine. The state machine takes a `Message` as input. A message can either be a local timer update or a network message sent from a remote peer. The state machine's output is a 3-tuple `{[]Messages, []LogEntries, NextState}` consisting of an array of `Messages`, `log entries`, and `Raft state changes`. For state machines with the same state, the same state machine input should always generate the same state machine output. + +A simple example application, _raftexample_, is also available to help illustrate how to use this package in practice: https://github.com/etcd-io/etcd/tree/master/contrib/raftexample + +# Features + +This raft implementation is a full feature implementation of Raft protocol. Features includes: + +- Leader election +- Log replication +- Log compaction +- Membership changes +- Leadership transfer extension +- Efficient linearizable read-only queries served by both the leader and followers + - leader checks with quorum and bypasses Raft log before processing read-only queries + - followers asks leader to get a safe read index before processing read-only queries +- More efficient lease-based linearizable read-only queries served by both the leader and followers + - leader bypasses Raft log and processing read-only queries locally + - followers asks leader to get a safe read index before processing read-only queries + - this approach relies on the clock of the all the machines in raft group + +This raft implementation also includes a few optional enhancements: + +- Optimistic pipelining to reduce log replication latency +- Flow control for log replication +- Batching Raft messages to reduce synchronized network I/O calls +- Batching log entries to reduce disk synchronized I/O +- Writing to leader's disk in parallel +- Internal proposal redirection from followers to leader +- Automatic stepping down when the leader loses quorum +- Protection against unbounded log growth when quorum is lost + +## Notable Users + +- [cockroachdb](https://github.com/cockroachdb/cockroach) A Scalable, Survivable, Strongly-Consistent SQL Database +- [dgraph](https://github.com/dgraph-io/dgraph) A Scalable, Distributed, Low Latency, High Throughput Graph Database +- [etcd](https://github.com/etcd-io/etcd) A distributed reliable key-value store +- [tikv](https://github.com/pingcap/tikv) A Distributed transactional key value database powered by Rust and Raft +- [swarmkit](https://github.com/docker/swarmkit) A toolkit for orchestrating distributed systems at any scale. +- [chain core](https://github.com/chain/chain) Software for operating permissioned, multi-asset blockchain networks + +## Usage + +The primary object in raft is a Node. Either start a Node from scratch using raft.StartNode or start a Node from some initial state using raft.RestartNode. + +To start a three-node cluster +```go + storage := raft.NewMemoryStorage() + c := &Config{ + ID: 0x01, + ElectionTick: 10, + HeartbeatTick: 1, + Storage: storage, + MaxSizePerMsg: 4096, + MaxInflightMsgs: 256, + } + // Set peer list to the other nodes in the cluster. + // Note that they need to be started separately as well. + n := raft.StartNode(c, []raft.Peer{{ID: 0x02}, {ID: 0x03}}) +``` + +Start a single node cluster, like so: +```go + // Create storage and config as shown above. + // Set peer list to itself, so this node can become the leader of this single-node cluster. + peers := []raft.Peer{{ID: 0x01}} + n := raft.StartNode(c, peers) +``` + +To allow a new node to join this cluster, do not pass in any peers. First, add the node to the existing cluster by calling `ProposeConfChange` on any existing node inside the cluster. Then, start the node with an empty peer list, like so: +```go + // Create storage and config as shown above. + n := raft.StartNode(c, nil) +``` + +To restart a node from previous state: +```go + storage := raft.NewMemoryStorage() + + // Recover the in-memory storage from persistent snapshot, state and entries. + storage.ApplySnapshot(snapshot) + storage.SetHardState(state) + storage.Append(entries) + + c := &Config{ + ID: 0x01, + ElectionTick: 10, + HeartbeatTick: 1, + Storage: storage, + MaxSizePerMsg: 4096, + MaxInflightMsgs: 256, + } + + // Restart raft without peer information. + // Peer information is already included in the storage. + n := raft.RestartNode(c) +``` + +After creating a Node, the user has a few responsibilities: + +First, read from the Node.Ready() channel and process the updates it contains. These steps may be performed in parallel, except as noted in step 2. + +1. Write Entries, HardState and Snapshot to persistent storage in order, i.e. Entries first, then HardState and Snapshot if they are not empty. If persistent storage supports atomic writes then all of them can be written together. Note that when writing an Entry with Index i, any previously-persisted entries with Index >= i must be discarded. + +2. Send all Messages to the nodes named in the To field. It is important that no messages be sent until the latest HardState has been persisted to disk, and all Entries written by any previous Ready batch (Messages may be sent while entries from the same batch are being persisted). To reduce the I/O latency, an optimization can be applied to make leader write to disk in parallel with its followers (as explained at section 10.2.1 in Raft thesis). If any Message has type MsgSnap, call Node.ReportSnapshot() after it has been sent (these messages may be large). Note: Marshalling messages is not thread-safe; it is important to make sure that no new entries are persisted while marshalling. The easiest way to achieve this is to serialise the messages directly inside the main raft loop. + +3. Apply Snapshot (if any) and CommittedEntries to the state machine. If any committed Entry has Type EntryConfChange, call Node.ApplyConfChange() to apply it to the node. The configuration change may be cancelled at this point by setting the NodeID field to zero before calling ApplyConfChange (but ApplyConfChange must be called one way or the other, and the decision to cancel must be based solely on the state machine and not external information such as the observed health of the node). + +4. Call Node.Advance() to signal readiness for the next batch of updates. This may be done at any time after step 1, although all updates must be processed in the order they were returned by Ready. + +Second, all persisted log entries must be made available via an implementation of the Storage interface. The provided MemoryStorage type can be used for this (if repopulating its state upon a restart), or a custom disk-backed implementation can be supplied. + +Third, after receiving a message from another node, pass it to Node.Step: + +```go + func recvRaftRPC(ctx context.Context, m raftpb.Message) { + n.Step(ctx, m) + } +``` + +Finally, call `Node.Tick()` at regular intervals (probably via a `time.Ticker`). Raft has two important timeouts: heartbeat and the election timeout. However, internally to the raft package time is represented by an abstract "tick". + +The total state machine handling loop will look something like this: + +```go + for { + select { + case <-s.Ticker: + n.Tick() + case rd := <-s.Node.Ready(): + saveToStorage(rd.HardState, rd.Entries, rd.Snapshot) + send(rd.Messages) + if !raft.IsEmptySnap(rd.Snapshot) { + processSnapshot(rd.Snapshot) + } + for _, entry := range rd.CommittedEntries { + process(entry) + if entry.Type == raftpb.EntryConfChange { + var cc raftpb.ConfChange + cc.Unmarshal(entry.Data) + s.Node.ApplyConfChange(cc) + } + } + s.Node.Advance() + case <-s.done: + return + } + } +``` + +To propose changes to the state machine from the node to take application data, serialize it into a byte slice and call: + +```go + n.Propose(ctx, data) +``` + +If the proposal is committed, data will appear in committed entries with type raftpb.EntryNormal. There is no guarantee that a proposed command will be committed; the command may have to be reproposed after a timeout. + +To add or remove node in a cluster, build ConfChange struct 'cc' and call: + +```go + n.ProposeConfChange(ctx, cc) +``` + +After config change is committed, some committed entry with type raftpb.EntryConfChange will be returned. This must be applied to node through: + +```go + var cc raftpb.ConfChange + cc.Unmarshal(data) + n.ApplyConfChange(cc) +``` + +Note: An ID represents a unique node in a cluster for all time. A +given ID MUST be used only once even if the old node has been removed. +This means that for example IP addresses make poor node IDs since they +may be reused. Node IDs must be non-zero. + +## Implementation notes + +This implementation is up to date with the final Raft thesis (https://github.com/ongardie/dissertation/blob/master/stanford.pdf), although this implementation of the membership change protocol differs somewhat from that described in chapter 4. The key invariant that membership changes happen one node at a time is preserved, but in our implementation the membership change takes effect when its entry is applied, not when it is added to the log (so the entry is committed under the old membership instead of the new). This is equivalent in terms of safety, since the old and new configurations are guaranteed to overlap. + +To ensure there is no attempt to commit two membership changes at once by matching log positions (which would be unsafe since they should have different quorum requirements), any proposed membership change is simply disallowed while any uncommitted change appears in the leader's log. + +This approach introduces a problem when removing a member from a two-member cluster: If one of the members dies before the other one receives the commit of the confchange entry, then the member cannot be removed any more since the cluster cannot make progress. For this reason it is highly recommended to use three or more nodes in every cluster. diff --git a/vendor/go.etcd.io/etcd/raft/bootstrap.go b/vendor/go.etcd.io/etcd/raft/bootstrap.go new file mode 100644 index 00000000..bd82b204 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/bootstrap.go @@ -0,0 +1,80 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import ( + "errors" + + pb "go.etcd.io/etcd/raft/raftpb" +) + +// Bootstrap initializes the RawNode for first use by appending configuration +// changes for the supplied peers. This method returns an error if the Storage +// is nonempty. +// +// It is recommended that instead of calling this method, applications bootstrap +// their state manually by setting up a Storage that has a first index > 1 and +// which stores the desired ConfState as its InitialState. +func (rn *RawNode) Bootstrap(peers []Peer) error { + if len(peers) == 0 { + return errors.New("must provide at least one peer to Bootstrap") + } + lastIndex, err := rn.raft.raftLog.storage.LastIndex() + if err != nil { + return err + } + + if lastIndex != 0 { + return errors.New("can't bootstrap a nonempty Storage") + } + + // We've faked out initial entries above, but nothing has been + // persisted. Start with an empty HardState (thus the first Ready will + // emit a HardState update for the app to persist). + rn.prevHardSt = emptyState + + // TODO(tbg): remove StartNode and give the application the right tools to + // bootstrap the initial membership in a cleaner way. + rn.raft.becomeFollower(1, None) + ents := make([]pb.Entry, len(peers)) + for i, peer := range peers { + cc := pb.ConfChange{Type: pb.ConfChangeAddNode, NodeID: peer.ID, Context: peer.Context} + data, err := cc.Marshal() + if err != nil { + return err + } + + ents[i] = pb.Entry{Type: pb.EntryConfChange, Term: 1, Index: uint64(i + 1), Data: data} + } + rn.raft.raftLog.append(ents...) + + // Now apply them, mainly so that the application can call Campaign + // immediately after StartNode in tests. Note that these nodes will + // be added to raft twice: here and when the application's Ready + // loop calls ApplyConfChange. The calls to addNode must come after + // all calls to raftLog.append so progress.next is set after these + // bootstrapping entries (it is an error if we try to append these + // entries since they have already been committed). + // We do not set raftLog.applied so the application will be able + // to observe all conf changes via Ready.CommittedEntries. + // + // TODO(bdarnell): These entries are still unstable; do we need to preserve + // the invariant that committed < unstable? + rn.raft.raftLog.committed = uint64(len(ents)) + for _, peer := range peers { + rn.raft.applyConfChange(pb.ConfChange{NodeID: peer.ID, Type: pb.ConfChangeAddNode}.AsV2()) + } + return nil +} diff --git a/vendor/go.etcd.io/etcd/raft/confchange/confchange.go b/vendor/go.etcd.io/etcd/raft/confchange/confchange.go new file mode 100644 index 00000000..a0dc486d --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/confchange/confchange.go @@ -0,0 +1,425 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package confchange + +import ( + "errors" + "fmt" + "strings" + + "go.etcd.io/etcd/raft/quorum" + pb "go.etcd.io/etcd/raft/raftpb" + "go.etcd.io/etcd/raft/tracker" +) + +// Changer facilitates configuration changes. It exposes methods to handle +// simple and joint consensus while performing the proper validation that allows +// refusing invalid configuration changes before they affect the active +// configuration. +type Changer struct { + Tracker tracker.ProgressTracker + LastIndex uint64 +} + +// EnterJoint verifies that the outgoing (=right) majority config of the joint +// config is empty and initializes it with a copy of the incoming (=left) +// majority config. That is, it transitions from +// +// (1 2 3)&&() +// to +// (1 2 3)&&(1 2 3). +// +// The supplied changes are then applied to the incoming majority config, +// resulting in a joint configuration that in terms of the Raft thesis[1] +// (Section 4.3) corresponds to `C_{new,old}`. +// +// [1]: https://github.com/ongardie/dissertation/blob/master/online-trim.pdf +func (c Changer) EnterJoint(autoLeave bool, ccs ...pb.ConfChangeSingle) (tracker.Config, tracker.ProgressMap, error) { + cfg, prs, err := c.checkAndCopy() + if err != nil { + return c.err(err) + } + if joint(cfg) { + err := errors.New("config is already joint") + return c.err(err) + } + if len(incoming(cfg.Voters)) == 0 { + // We allow adding nodes to an empty config for convenience (testing and + // bootstrap), but you can't enter a joint state. + err := errors.New("can't make a zero-voter config joint") + return c.err(err) + } + // Clear the outgoing config. + *outgoingPtr(&cfg.Voters) = quorum.MajorityConfig{} + // Copy incoming to outgoing. + for id := range incoming(cfg.Voters) { + outgoing(cfg.Voters)[id] = struct{}{} + } + + if err := c.apply(&cfg, prs, ccs...); err != nil { + return c.err(err) + } + cfg.AutoLeave = autoLeave + return checkAndReturn(cfg, prs) +} + +// LeaveJoint transitions out of a joint configuration. It is an error to call +// this method if the configuration is not joint, i.e. if the outgoing majority +// config Voters[1] is empty. +// +// The outgoing majority config of the joint configuration will be removed, +// that is, the incoming config is promoted as the sole decision maker. In the +// notation of the Raft thesis[1] (Section 4.3), this method transitions from +// `C_{new,old}` into `C_new`. +// +// At the same time, any staged learners (LearnersNext) the addition of which +// was held back by an overlapping voter in the former outgoing config will be +// inserted into Learners. +// +// [1]: https://github.com/ongardie/dissertation/blob/master/online-trim.pdf +func (c Changer) LeaveJoint() (tracker.Config, tracker.ProgressMap, error) { + cfg, prs, err := c.checkAndCopy() + if err != nil { + return c.err(err) + } + if !joint(cfg) { + err := errors.New("can't leave a non-joint config") + return c.err(err) + } + if len(outgoing(cfg.Voters)) == 0 { + err := fmt.Errorf("configuration is not joint: %v", cfg) + return c.err(err) + } + for id := range cfg.LearnersNext { + nilAwareAdd(&cfg.Learners, id) + prs[id].IsLearner = true + } + cfg.LearnersNext = nil + + for id := range outgoing(cfg.Voters) { + _, isVoter := incoming(cfg.Voters)[id] + _, isLearner := cfg.Learners[id] + + if !isVoter && !isLearner { + delete(prs, id) + } + } + *outgoingPtr(&cfg.Voters) = nil + cfg.AutoLeave = false + + return checkAndReturn(cfg, prs) +} + +// Simple carries out a series of configuration changes that (in aggregate) +// mutates the incoming majority config Voters[0] by at most one. This method +// will return an error if that is not the case, if the resulting quorum is +// zero, or if the configuration is in a joint state (i.e. if there is an +// outgoing configuration). +func (c Changer) Simple(ccs ...pb.ConfChangeSingle) (tracker.Config, tracker.ProgressMap, error) { + cfg, prs, err := c.checkAndCopy() + if err != nil { + return c.err(err) + } + if joint(cfg) { + err := errors.New("can't apply simple config change in joint config") + return c.err(err) + } + if err := c.apply(&cfg, prs, ccs...); err != nil { + return c.err(err) + } + if n := symdiff(incoming(c.Tracker.Voters), incoming(cfg.Voters)); n > 1 { + return tracker.Config{}, nil, errors.New("more than one voter changed without entering joint config") + } + if err := checkInvariants(cfg, prs); err != nil { + return tracker.Config{}, tracker.ProgressMap{}, nil + } + + return checkAndReturn(cfg, prs) +} + +// apply a change to the configuration. By convention, changes to voters are +// always made to the incoming majority config Voters[0]. Voters[1] is either +// empty or preserves the outgoing majority configuration while in a joint state. +func (c Changer) apply(cfg *tracker.Config, prs tracker.ProgressMap, ccs ...pb.ConfChangeSingle) error { + for _, cc := range ccs { + if cc.NodeID == 0 { + // etcd replaces the NodeID with zero if it decides (downstream of + // raft) to not apply a change, so we have to have explicit code + // here to ignore these. + continue + } + switch cc.Type { + case pb.ConfChangeAddNode: + c.makeVoter(cfg, prs, cc.NodeID) + case pb.ConfChangeAddLearnerNode: + c.makeLearner(cfg, prs, cc.NodeID) + case pb.ConfChangeRemoveNode: + c.remove(cfg, prs, cc.NodeID) + case pb.ConfChangeUpdateNode: + default: + return fmt.Errorf("unexpected conf type %d", cc.Type) + } + } + if len(incoming(cfg.Voters)) == 0 { + return errors.New("removed all voters") + } + return nil +} + +// makeVoter adds or promotes the given ID to be a voter in the incoming +// majority config. +func (c Changer) makeVoter(cfg *tracker.Config, prs tracker.ProgressMap, id uint64) { + pr := prs[id] + if pr == nil { + c.initProgress(cfg, prs, id, false /* isLearner */) + return + } + + pr.IsLearner = false + nilAwareDelete(&cfg.Learners, id) + nilAwareDelete(&cfg.LearnersNext, id) + incoming(cfg.Voters)[id] = struct{}{} + return +} + +// makeLearner makes the given ID a learner or stages it to be a learner once +// an active joint configuration is exited. +// +// The former happens when the peer is not a part of the outgoing config, in +// which case we either add a new learner or demote a voter in the incoming +// config. +// +// The latter case occurs when the configuration is joint and the peer is a +// voter in the outgoing config. In that case, we do not want to add the peer +// as a learner because then we'd have to track a peer as a voter and learner +// simultaneously. Instead, we add the learner to LearnersNext, so that it will +// be added to Learners the moment the outgoing config is removed by +// LeaveJoint(). +func (c Changer) makeLearner(cfg *tracker.Config, prs tracker.ProgressMap, id uint64) { + pr := prs[id] + if pr == nil { + c.initProgress(cfg, prs, id, true /* isLearner */) + return + } + if pr.IsLearner { + return + } + // Remove any existing voter in the incoming config... + c.remove(cfg, prs, id) + // ... but save the Progress. + prs[id] = pr + // Use LearnersNext if we can't add the learner to Learners directly, i.e. + // if the peer is still tracked as a voter in the outgoing config. It will + // be turned into a learner in LeaveJoint(). + // + // Otherwise, add a regular learner right away. + if _, onRight := outgoing(cfg.Voters)[id]; onRight { + nilAwareAdd(&cfg.LearnersNext, id) + } else { + pr.IsLearner = true + nilAwareAdd(&cfg.Learners, id) + } +} + +// remove this peer as a voter or learner from the incoming config. +func (c Changer) remove(cfg *tracker.Config, prs tracker.ProgressMap, id uint64) { + if _, ok := prs[id]; !ok { + return + } + + delete(incoming(cfg.Voters), id) + nilAwareDelete(&cfg.Learners, id) + nilAwareDelete(&cfg.LearnersNext, id) + + // If the peer is still a voter in the outgoing config, keep the Progress. + if _, onRight := outgoing(cfg.Voters)[id]; !onRight { + delete(prs, id) + } +} + +// initProgress initializes a new progress for the given node or learner. +func (c Changer) initProgress(cfg *tracker.Config, prs tracker.ProgressMap, id uint64, isLearner bool) { + if !isLearner { + incoming(cfg.Voters)[id] = struct{}{} + } else { + nilAwareAdd(&cfg.Learners, id) + } + prs[id] = &tracker.Progress{ + // Initializing the Progress with the last index means that the follower + // can be probed (with the last index). + // + // TODO(tbg): seems awfully optimistic. Using the first index would be + // better. The general expectation here is that the follower has no log + // at all (and will thus likely need a snapshot), though the app may + // have applied a snapshot out of band before adding the replica (thus + // making the first index the better choice). + Next: c.LastIndex, + Match: 0, + Inflights: tracker.NewInflights(c.Tracker.MaxInflight), + IsLearner: isLearner, + // When a node is first added, we should mark it as recently active. + // Otherwise, CheckQuorum may cause us to step down if it is invoked + // before the added node has had a chance to communicate with us. + RecentActive: true, + } +} + +// checkInvariants makes sure that the config and progress are compatible with +// each other. This is used to check both what the Changer is initialized with, +// as well as what it returns. +func checkInvariants(cfg tracker.Config, prs tracker.ProgressMap) error { + // NB: intentionally allow the empty config. In production we'll never see a + // non-empty config (we prevent it from being created) but we will need to + // be able to *create* an initial config, for example during bootstrap (or + // during tests). Instead of having to hand-code this, we allow + // transitioning from an empty config into any other legal and non-empty + // config. + for _, ids := range []map[uint64]struct{}{ + cfg.Voters.IDs(), + cfg.Learners, + cfg.LearnersNext, + } { + for id := range ids { + if _, ok := prs[id]; !ok { + return fmt.Errorf("no progress for %d", id) + } + } + } + + // Any staged learner was staged because it could not be directly added due + // to a conflicting voter in the outgoing config. + for id := range cfg.LearnersNext { + if _, ok := outgoing(cfg.Voters)[id]; !ok { + return fmt.Errorf("%d is in LearnersNext, but not Voters[1]", id) + } + if prs[id].IsLearner { + return fmt.Errorf("%d is in LearnersNext, but is already marked as learner", id) + } + } + // Conversely Learners and Voters doesn't intersect at all. + for id := range cfg.Learners { + if _, ok := outgoing(cfg.Voters)[id]; ok { + return fmt.Errorf("%d is in Learners and Voters[1]", id) + } + if _, ok := incoming(cfg.Voters)[id]; ok { + return fmt.Errorf("%d is in Learners and Voters[0]", id) + } + if !prs[id].IsLearner { + return fmt.Errorf("%d is in Learners, but is not marked as learner", id) + } + } + + if !joint(cfg) { + // We enforce that empty maps are nil instead of zero. + if outgoing(cfg.Voters) != nil { + return fmt.Errorf("Voters[1] must be nil when not joint") + } + if cfg.LearnersNext != nil { + return fmt.Errorf("LearnersNext must be nil when not joint") + } + if cfg.AutoLeave { + return fmt.Errorf("AutoLeave must be false when not joint") + } + } + + return nil +} + +// checkAndCopy copies the tracker's config and progress map (deeply enough for +// the purposes of the Changer) and returns those copies. It returns an error +// if checkInvariants does. +func (c Changer) checkAndCopy() (tracker.Config, tracker.ProgressMap, error) { + cfg := c.Tracker.Config.Clone() + prs := tracker.ProgressMap{} + + for id, pr := range c.Tracker.Progress { + // A shallow copy is enough because we only mutate the Learner field. + ppr := *pr + prs[id] = &ppr + } + return checkAndReturn(cfg, prs) +} + +// checkAndReturn calls checkInvariants on the input and returns either the +// resulting error or the input. +func checkAndReturn(cfg tracker.Config, prs tracker.ProgressMap) (tracker.Config, tracker.ProgressMap, error) { + if err := checkInvariants(cfg, prs); err != nil { + return tracker.Config{}, tracker.ProgressMap{}, err + } + return cfg, prs, nil +} + +// err returns zero values and an error. +func (c Changer) err(err error) (tracker.Config, tracker.ProgressMap, error) { + return tracker.Config{}, nil, err +} + +// nilAwareAdd populates a map entry, creating the map if necessary. +func nilAwareAdd(m *map[uint64]struct{}, id uint64) { + if *m == nil { + *m = map[uint64]struct{}{} + } + (*m)[id] = struct{}{} +} + +// nilAwareDelete deletes from a map, nil'ing the map itself if it is empty after. +func nilAwareDelete(m *map[uint64]struct{}, id uint64) { + if *m == nil { + return + } + delete(*m, id) + if len(*m) == 0 { + *m = nil + } +} + +// symdiff returns the count of the symmetric difference between the sets of +// uint64s, i.e. len( (l - r) \union (r - l)). +func symdiff(l, r map[uint64]struct{}) int { + var n int + pairs := [][2]quorum.MajorityConfig{ + {l, r}, // count elems in l but not in r + {r, l}, // count elems in r but not in l + } + for _, p := range pairs { + for id := range p[0] { + if _, ok := p[1][id]; !ok { + n++ + } + } + } + return n +} + +func joint(cfg tracker.Config) bool { + return len(outgoing(cfg.Voters)) > 0 +} + +func incoming(voters quorum.JointConfig) quorum.MajorityConfig { return voters[0] } +func outgoing(voters quorum.JointConfig) quorum.MajorityConfig { return voters[1] } +func outgoingPtr(voters *quorum.JointConfig) *quorum.MajorityConfig { return &voters[1] } + +// Describe prints the type and NodeID of the configuration changes as a +// space-delimited string. +func Describe(ccs ...pb.ConfChangeSingle) string { + var buf strings.Builder + for _, cc := range ccs { + if buf.Len() > 0 { + buf.WriteByte(' ') + } + fmt.Fprintf(&buf, "%s(%d)", cc.Type, cc.NodeID) + } + return buf.String() +} diff --git a/vendor/go.etcd.io/etcd/raft/confchange/restore.go b/vendor/go.etcd.io/etcd/raft/confchange/restore.go new file mode 100644 index 00000000..724068da --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/confchange/restore.go @@ -0,0 +1,155 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package confchange + +import ( + pb "go.etcd.io/etcd/raft/raftpb" + "go.etcd.io/etcd/raft/tracker" +) + +// toConfChangeSingle translates a conf state into 1) a slice of operations creating +// first the config that will become the outgoing one, and then the incoming one, and +// b) another slice that, when applied to the config resulted from 1), represents the +// ConfState. +func toConfChangeSingle(cs pb.ConfState) (out []pb.ConfChangeSingle, in []pb.ConfChangeSingle) { + // Example to follow along this code: + // voters=(1 2 3) learners=(5) outgoing=(1 2 4 6) learners_next=(4) + // + // This means that before entering the joint config, the configuration + // had voters (1 2 4) and perhaps some learners that are already gone. + // The new set of voters is (1 2 3), i.e. (1 2) were kept around, and (4 6) + // are no longer voters; however 4 is poised to become a learner upon leaving + // the joint state. + // We can't tell whether 5 was a learner before entering the joint config, + // but it doesn't matter (we'll pretend that it wasn't). + // + // The code below will construct + // outgoing = add 1; add 2; add 4; add 6 + // incoming = remove 1; remove 2; remove 4; remove 6 + // add 1; add 2; add 3; + // add-learner 5; + // add-learner 4; + // + // So, when starting with an empty config, after applying 'outgoing' we have + // + // quorum=(1 2 4 6) + // + // From which we enter a joint state via 'incoming' + // + // quorum=(1 2 3)&&(1 2 4 6) learners=(5) learners_next=(4) + // + // as desired. + + for _, id := range cs.VotersOutgoing { + // If there are outgoing voters, first add them one by one so that the + // (non-joint) config has them all. + out = append(out, pb.ConfChangeSingle{ + Type: pb.ConfChangeAddNode, + NodeID: id, + }) + + } + + // We're done constructing the outgoing slice, now on to the incoming one + // (which will apply on top of the config created by the outgoing slice). + + // First, we'll remove all of the outgoing voters. + for _, id := range cs.VotersOutgoing { + in = append(in, pb.ConfChangeSingle{ + Type: pb.ConfChangeRemoveNode, + NodeID: id, + }) + } + // Then we'll add the incoming voters and learners. + for _, id := range cs.Voters { + in = append(in, pb.ConfChangeSingle{ + Type: pb.ConfChangeAddNode, + NodeID: id, + }) + } + for _, id := range cs.Learners { + in = append(in, pb.ConfChangeSingle{ + Type: pb.ConfChangeAddLearnerNode, + NodeID: id, + }) + } + // Same for LearnersNext; these are nodes we want to be learners but which + // are currently voters in the outgoing config. + for _, id := range cs.LearnersNext { + in = append(in, pb.ConfChangeSingle{ + Type: pb.ConfChangeAddLearnerNode, + NodeID: id, + }) + } + return out, in +} + +func chain(chg Changer, ops ...func(Changer) (tracker.Config, tracker.ProgressMap, error)) (tracker.Config, tracker.ProgressMap, error) { + for _, op := range ops { + cfg, prs, err := op(chg) + if err != nil { + return tracker.Config{}, nil, err + } + chg.Tracker.Config = cfg + chg.Tracker.Progress = prs + } + return chg.Tracker.Config, chg.Tracker.Progress, nil +} + +// Restore takes a Changer (which must represent an empty configuration), and +// runs a sequence of changes enacting the configuration described in the +// ConfState. +// +// TODO(tbg) it's silly that this takes a Changer. Unravel this by making sure +// the Changer only needs a ProgressMap (not a whole Tracker) at which point +// this can just take LastIndex and MaxInflight directly instead and cook up +// the results from that alone. +func Restore(chg Changer, cs pb.ConfState) (tracker.Config, tracker.ProgressMap, error) { + outgoing, incoming := toConfChangeSingle(cs) + + var ops []func(Changer) (tracker.Config, tracker.ProgressMap, error) + + if len(outgoing) == 0 { + // No outgoing config, so just apply the incoming changes one by one. + for _, cc := range incoming { + cc := cc // loop-local copy + ops = append(ops, func(chg Changer) (tracker.Config, tracker.ProgressMap, error) { + return chg.Simple(cc) + }) + } + } else { + // The ConfState describes a joint configuration. + // + // First, apply all of the changes of the outgoing config one by one, so + // that it temporarily becomes the incoming active config. For example, + // if the config is (1 2 3)&(2 3 4), this will establish (2 3 4)&(). + for _, cc := range outgoing { + cc := cc // loop-local copy + ops = append(ops, func(chg Changer) (tracker.Config, tracker.ProgressMap, error) { + return chg.Simple(cc) + }) + } + // Now enter the joint state, which rotates the above additions into the + // outgoing config, and adds the incoming config in. Continuing the + // example above, we'd get (1 2 3)&(2 3 4), i.e. the incoming operations + // would be removing 2,3,4 and then adding in 1,2,3 while transitioning + // into a joint state. + ops = append(ops, func(chg Changer) (tracker.Config, tracker.ProgressMap, error) { + return chg.EnterJoint(cs.AutoLeave, incoming...) + }) + } + + return chain(chg, ops...) +} diff --git a/vendor/go.etcd.io/etcd/raft/design.md b/vendor/go.etcd.io/etcd/raft/design.md new file mode 100644 index 00000000..7bc0531d --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/design.md @@ -0,0 +1,57 @@ +## Progress + +Progress represents a follower’s progress in the view of the leader. Leader maintains progresses of all followers, and sends `replication message` to the follower based on its progress. + +`replication message` is a `msgApp` with log entries. + +A progress has two attribute: `match` and `next`. `match` is the index of the highest known matched entry. If leader knows nothing about follower’s replication status, `match` is set to zero. `next` is the index of the first entry that will be replicated to the follower. Leader puts entries from `next` to its latest one in next `replication message`. + +A progress is in one of the three state: `probe`, `replicate`, `snapshot`. + +``` + +--------------------------------------------------------+ + | send snapshot | + | | + +---------+----------+ +----------v---------+ + +---> probe | | snapshot | + | | max inflight = 1 <----------------------------------+ max inflight = 0 | + | +---------+----------+ +--------------------+ + | | 1. snapshot success + | | (next=snapshot.index + 1) + | | 2. snapshot failure + | | (no change) + | | 3. receives msgAppResp(rej=false&&index>lastsnap.index) + | | (match=m.index,next=match+1) +receives msgAppResp(rej=true) +(next=match+1)| | + | | + | | + | | receives msgAppResp(rej=false&&index>match) + | | (match=m.index,next=match+1) + | | + | | + | | + | +---------v----------+ + | | replicate | + +---+ max inflight = n | + +--------------------+ +``` + +When the progress of a follower is in `probe` state, leader sends at most one `replication message` per heartbeat interval. The leader sends `replication message` slowly and probing the actual progress of the follower. A `msgHeartbeatResp` or a `msgAppResp` with reject might trigger the sending of the next `replication message`. + +When the progress of a follower is in `replicate` state, leader sends `replication message`, then optimistically increases `next` to the latest entry sent. This is an optimized state for fast replicating log entries to the follower. + +When the progress of a follower is in `snapshot` state, leader stops sending any `replication message`. + +A newly elected leader sets the progresses of all the followers to `probe` state with `match` = 0 and `next` = last index. The leader slowly (at most once per heartbeat) sends `replication message` to the follower and probes its progress. + +A progress changes to `replicate` when the follower replies with a non-rejection `msgAppResp`, which implies that it has matched the index sent. At this point, leader starts to stream log entries to the follower fast. The progress will fall back to `probe` when the follower replies a rejection `msgAppResp` or the link layer reports the follower is unreachable. We aggressively reset `next` to `match`+1 since if we receive any `msgAppResp` soon, both `match` and `next` will increase directly to the `index` in `msgAppResp`. (We might end up with sending some duplicate entries when aggressively reset `next` too low. see open question) + +A progress changes from `probe` to `snapshot` when the follower falls very far behind and requires a snapshot. After sending `msgSnap`, the leader waits until the success, failure or abortion of the previous snapshot sent. The progress will go back to `probe` after the sending result is applied. + +### Flow Control + +1. limit the max size of message sent per message. Max should be configurable. +Lower the cost at probing state as we limit the size per message; lower the penalty when aggressively decreased to a too low `next` + +2. limit the # of in flight messages < N when in `replicate` state. N should be configurable. Most implementation will have a sending buffer on top of its actual network transport layer (not blocking raft node). We want to make sure raft does not overflow that buffer, which can cause message dropping and triggering a bunch of unnecessary resending repeatedly. diff --git a/vendor/go.etcd.io/etcd/raft/doc.go b/vendor/go.etcd.io/etcd/raft/doc.go new file mode 100644 index 00000000..68fe6f0a --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/doc.go @@ -0,0 +1,300 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* +Package raft sends and receives messages in the Protocol Buffer format +defined in the raftpb package. + +Raft is a protocol with which a cluster of nodes can maintain a replicated state machine. +The state machine is kept in sync through the use of a replicated log. +For more details on Raft, see "In Search of an Understandable Consensus Algorithm" +(https://raft.github.io/raft.pdf) by Diego Ongaro and John Ousterhout. + +A simple example application, _raftexample_, is also available to help illustrate +how to use this package in practice: +https://github.com/etcd-io/etcd/tree/master/contrib/raftexample + +Usage + +The primary object in raft is a Node. You either start a Node from scratch +using raft.StartNode or start a Node from some initial state using raft.RestartNode. + +To start a node from scratch: + + storage := raft.NewMemoryStorage() + c := &Config{ + ID: 0x01, + ElectionTick: 10, + HeartbeatTick: 1, + Storage: storage, + MaxSizePerMsg: 4096, + MaxInflightMsgs: 256, + } + n := raft.StartNode(c, []raft.Peer{{ID: 0x02}, {ID: 0x03}}) + +To restart a node from previous state: + + storage := raft.NewMemoryStorage() + + // recover the in-memory storage from persistent + // snapshot, state and entries. + storage.ApplySnapshot(snapshot) + storage.SetHardState(state) + storage.Append(entries) + + c := &Config{ + ID: 0x01, + ElectionTick: 10, + HeartbeatTick: 1, + Storage: storage, + MaxSizePerMsg: 4096, + MaxInflightMsgs: 256, + } + + // restart raft without peer information. + // peer information is already included in the storage. + n := raft.RestartNode(c) + +Now that you are holding onto a Node you have a few responsibilities: + +First, you must read from the Node.Ready() channel and process the updates +it contains. These steps may be performed in parallel, except as noted in step +2. + +1. Write HardState, Entries, and Snapshot to persistent storage if they are +not empty. Note that when writing an Entry with Index i, any +previously-persisted entries with Index >= i must be discarded. + +2. Send all Messages to the nodes named in the To field. It is important that +no messages be sent until the latest HardState has been persisted to disk, +and all Entries written by any previous Ready batch (Messages may be sent while +entries from the same batch are being persisted). To reduce the I/O latency, an +optimization can be applied to make leader write to disk in parallel with its +followers (as explained at section 10.2.1 in Raft thesis). If any Message has type +MsgSnap, call Node.ReportSnapshot() after it has been sent (these messages may be +large). + +Note: Marshalling messages is not thread-safe; it is important that you +make sure that no new entries are persisted while marshalling. +The easiest way to achieve this is to serialize the messages directly inside +your main raft loop. + +3. Apply Snapshot (if any) and CommittedEntries to the state machine. +If any committed Entry has Type EntryConfChange, call Node.ApplyConfChange() +to apply it to the node. The configuration change may be cancelled at this point +by setting the NodeID field to zero before calling ApplyConfChange +(but ApplyConfChange must be called one way or the other, and the decision to cancel +must be based solely on the state machine and not external information such as +the observed health of the node). + +4. Call Node.Advance() to signal readiness for the next batch of updates. +This may be done at any time after step 1, although all updates must be processed +in the order they were returned by Ready. + +Second, all persisted log entries must be made available via an +implementation of the Storage interface. The provided MemoryStorage +type can be used for this (if you repopulate its state upon a +restart), or you can supply your own disk-backed implementation. + +Third, when you receive a message from another node, pass it to Node.Step: + + func recvRaftRPC(ctx context.Context, m raftpb.Message) { + n.Step(ctx, m) + } + +Finally, you need to call Node.Tick() at regular intervals (probably +via a time.Ticker). Raft has two important timeouts: heartbeat and the +election timeout. However, internally to the raft package time is +represented by an abstract "tick". + +The total state machine handling loop will look something like this: + + for { + select { + case <-s.Ticker: + n.Tick() + case rd := <-s.Node.Ready(): + saveToStorage(rd.State, rd.Entries, rd.Snapshot) + send(rd.Messages) + if !raft.IsEmptySnap(rd.Snapshot) { + processSnapshot(rd.Snapshot) + } + for _, entry := range rd.CommittedEntries { + process(entry) + if entry.Type == raftpb.EntryConfChange { + var cc raftpb.ConfChange + cc.Unmarshal(entry.Data) + s.Node.ApplyConfChange(cc) + } + } + s.Node.Advance() + case <-s.done: + return + } + } + +To propose changes to the state machine from your node take your application +data, serialize it into a byte slice and call: + + n.Propose(ctx, data) + +If the proposal is committed, data will appear in committed entries with type +raftpb.EntryNormal. There is no guarantee that a proposed command will be +committed; you may have to re-propose after a timeout. + +To add or remove a node in a cluster, build ConfChange struct 'cc' and call: + + n.ProposeConfChange(ctx, cc) + +After config change is committed, some committed entry with type +raftpb.EntryConfChange will be returned. You must apply it to node through: + + var cc raftpb.ConfChange + cc.Unmarshal(data) + n.ApplyConfChange(cc) + +Note: An ID represents a unique node in a cluster for all time. A +given ID MUST be used only once even if the old node has been removed. +This means that for example IP addresses make poor node IDs since they +may be reused. Node IDs must be non-zero. + +Implementation notes + +This implementation is up to date with the final Raft thesis +(https://github.com/ongardie/dissertation/blob/master/stanford.pdf), although our +implementation of the membership change protocol differs somewhat from +that described in chapter 4. The key invariant that membership changes +happen one node at a time is preserved, but in our implementation the +membership change takes effect when its entry is applied, not when it +is added to the log (so the entry is committed under the old +membership instead of the new). This is equivalent in terms of safety, +since the old and new configurations are guaranteed to overlap. + +To ensure that we do not attempt to commit two membership changes at +once by matching log positions (which would be unsafe since they +should have different quorum requirements), we simply disallow any +proposed membership change while any uncommitted change appears in +the leader's log. + +This approach introduces a problem when you try to remove a member +from a two-member cluster: If one of the members dies before the +other one receives the commit of the confchange entry, then the member +cannot be removed any more since the cluster cannot make progress. +For this reason it is highly recommended to use three or more nodes in +every cluster. + +MessageType + +Package raft sends and receives message in Protocol Buffer format (defined +in raftpb package). Each state (follower, candidate, leader) implements its +own 'step' method ('stepFollower', 'stepCandidate', 'stepLeader') when +advancing with the given raftpb.Message. Each step is determined by its +raftpb.MessageType. Note that every step is checked by one common method +'Step' that safety-checks the terms of node and incoming message to prevent +stale log entries: + + 'MsgHup' is used for election. If a node is a follower or candidate, the + 'tick' function in 'raft' struct is set as 'tickElection'. If a follower or + candidate has not received any heartbeat before the election timeout, it + passes 'MsgHup' to its Step method and becomes (or remains) a candidate to + start a new election. + + 'MsgBeat' is an internal type that signals the leader to send a heartbeat of + the 'MsgHeartbeat' type. If a node is a leader, the 'tick' function in + the 'raft' struct is set as 'tickHeartbeat', and triggers the leader to + send periodic 'MsgHeartbeat' messages to its followers. + + 'MsgProp' proposes to append data to its log entries. This is a special + type to redirect proposals to leader. Therefore, send method overwrites + raftpb.Message's term with its HardState's term to avoid attaching its + local term to 'MsgProp'. When 'MsgProp' is passed to the leader's 'Step' + method, the leader first calls the 'appendEntry' method to append entries + to its log, and then calls 'bcastAppend' method to send those entries to + its peers. When passed to candidate, 'MsgProp' is dropped. When passed to + follower, 'MsgProp' is stored in follower's mailbox(msgs) by the send + method. It is stored with sender's ID and later forwarded to leader by + rafthttp package. + + 'MsgApp' contains log entries to replicate. A leader calls bcastAppend, + which calls sendAppend, which sends soon-to-be-replicated logs in 'MsgApp' + type. When 'MsgApp' is passed to candidate's Step method, candidate reverts + back to follower, because it indicates that there is a valid leader sending + 'MsgApp' messages. Candidate and follower respond to this message in + 'MsgAppResp' type. + + 'MsgAppResp' is response to log replication request('MsgApp'). When + 'MsgApp' is passed to candidate or follower's Step method, it responds by + calling 'handleAppendEntries' method, which sends 'MsgAppResp' to raft + mailbox. + + 'MsgVote' requests votes for election. When a node is a follower or + candidate and 'MsgHup' is passed to its Step method, then the node calls + 'campaign' method to campaign itself to become a leader. Once 'campaign' + method is called, the node becomes candidate and sends 'MsgVote' to peers + in cluster to request votes. When passed to leader or candidate's Step + method and the message's Term is lower than leader's or candidate's, + 'MsgVote' will be rejected ('MsgVoteResp' is returned with Reject true). + If leader or candidate receives 'MsgVote' with higher term, it will revert + back to follower. When 'MsgVote' is passed to follower, it votes for the + sender only when sender's last term is greater than MsgVote's term or + sender's last term is equal to MsgVote's term but sender's last committed + index is greater than or equal to follower's. + + 'MsgVoteResp' contains responses from voting request. When 'MsgVoteResp' is + passed to candidate, the candidate calculates how many votes it has won. If + it's more than majority (quorum), it becomes leader and calls 'bcastAppend'. + If candidate receives majority of votes of denials, it reverts back to + follower. + + 'MsgPreVote' and 'MsgPreVoteResp' are used in an optional two-phase election + protocol. When Config.PreVote is true, a pre-election is carried out first + (using the same rules as a regular election), and no node increases its term + number unless the pre-election indicates that the campaigning node would win. + This minimizes disruption when a partitioned node rejoins the cluster. + + 'MsgSnap' requests to install a snapshot message. When a node has just + become a leader or the leader receives 'MsgProp' message, it calls + 'bcastAppend' method, which then calls 'sendAppend' method to each + follower. In 'sendAppend', if a leader fails to get term or entries, + the leader requests snapshot by sending 'MsgSnap' type message. + + 'MsgSnapStatus' tells the result of snapshot install message. When a + follower rejected 'MsgSnap', it indicates the snapshot request with + 'MsgSnap' had failed from network issues which causes the network layer + to fail to send out snapshots to its followers. Then leader considers + follower's progress as probe. When 'MsgSnap' were not rejected, it + indicates that the snapshot succeeded and the leader sets follower's + progress to probe and resumes its log replication. + + 'MsgHeartbeat' sends heartbeat from leader. When 'MsgHeartbeat' is passed + to candidate and message's term is higher than candidate's, the candidate + reverts back to follower and updates its committed index from the one in + this heartbeat. And it sends the message to its mailbox. When + 'MsgHeartbeat' is passed to follower's Step method and message's term is + higher than follower's, the follower updates its leaderID with the ID + from the message. + + 'MsgHeartbeatResp' is a response to 'MsgHeartbeat'. When 'MsgHeartbeatResp' + is passed to leader's Step method, the leader knows which follower + responded. And only when the leader's last committed index is greater than + follower's Match index, the leader runs 'sendAppend` method. + + 'MsgUnreachable' tells that request(message) wasn't delivered. When + 'MsgUnreachable' is passed to leader's Step method, the leader discovers + that the follower that sent this 'MsgUnreachable' is not reachable, often + indicating 'MsgApp' is lost. When follower's progress state is replicate, + the leader sets it back to probe. + +*/ +package raft diff --git a/vendor/go.etcd.io/etcd/raft/log.go b/vendor/go.etcd.io/etcd/raft/log.go new file mode 100644 index 00000000..77eedfcc --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/log.go @@ -0,0 +1,372 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import ( + "fmt" + "log" + + pb "go.etcd.io/etcd/raft/raftpb" +) + +type raftLog struct { + // storage contains all stable entries since the last snapshot. + storage Storage + + // unstable contains all unstable entries and snapshot. + // they will be saved into storage. + unstable unstable + + // committed is the highest log position that is known to be in + // stable storage on a quorum of nodes. + committed uint64 + // applied is the highest log position that the application has + // been instructed to apply to its state machine. + // Invariant: applied <= committed + applied uint64 + + logger Logger + + // maxNextEntsSize is the maximum number aggregate byte size of the messages + // returned from calls to nextEnts. + maxNextEntsSize uint64 +} + +// newLog returns log using the given storage and default options. It +// recovers the log to the state that it just commits and applies the +// latest snapshot. +func newLog(storage Storage, logger Logger) *raftLog { + return newLogWithSize(storage, logger, noLimit) +} + +// newLogWithSize returns a log using the given storage and max +// message size. +func newLogWithSize(storage Storage, logger Logger, maxNextEntsSize uint64) *raftLog { + if storage == nil { + log.Panic("storage must not be nil") + } + log := &raftLog{ + storage: storage, + logger: logger, + maxNextEntsSize: maxNextEntsSize, + } + firstIndex, err := storage.FirstIndex() + if err != nil { + panic(err) // TODO(bdarnell) + } + lastIndex, err := storage.LastIndex() + if err != nil { + panic(err) // TODO(bdarnell) + } + log.unstable.offset = lastIndex + 1 + log.unstable.logger = logger + // Initialize our committed and applied pointers to the time of the last compaction. + log.committed = firstIndex - 1 + log.applied = firstIndex - 1 + + return log +} + +func (l *raftLog) String() string { + return fmt.Sprintf("committed=%d, applied=%d, unstable.offset=%d, len(unstable.Entries)=%d", l.committed, l.applied, l.unstable.offset, len(l.unstable.entries)) +} + +// maybeAppend returns (0, false) if the entries cannot be appended. Otherwise, +// it returns (last index of new entries, true). +func (l *raftLog) maybeAppend(index, logTerm, committed uint64, ents ...pb.Entry) (lastnewi uint64, ok bool) { + if l.matchTerm(index, logTerm) { + lastnewi = index + uint64(len(ents)) + ci := l.findConflict(ents) + switch { + case ci == 0: + case ci <= l.committed: + l.logger.Panicf("entry %d conflict with committed entry [committed(%d)]", ci, l.committed) + default: + offset := index + 1 + l.append(ents[ci-offset:]...) + } + l.commitTo(min(committed, lastnewi)) + return lastnewi, true + } + return 0, false +} + +func (l *raftLog) append(ents ...pb.Entry) uint64 { + if len(ents) == 0 { + return l.lastIndex() + } + if after := ents[0].Index - 1; after < l.committed { + l.logger.Panicf("after(%d) is out of range [committed(%d)]", after, l.committed) + } + l.unstable.truncateAndAppend(ents) + return l.lastIndex() +} + +// findConflict finds the index of the conflict. +// It returns the first pair of conflicting entries between the existing +// entries and the given entries, if there are any. +// If there is no conflicting entries, and the existing entries contains +// all the given entries, zero will be returned. +// If there is no conflicting entries, but the given entries contains new +// entries, the index of the first new entry will be returned. +// An entry is considered to be conflicting if it has the same index but +// a different term. +// The first entry MUST have an index equal to the argument 'from'. +// The index of the given entries MUST be continuously increasing. +func (l *raftLog) findConflict(ents []pb.Entry) uint64 { + for _, ne := range ents { + if !l.matchTerm(ne.Index, ne.Term) { + if ne.Index <= l.lastIndex() { + l.logger.Infof("found conflict at index %d [existing term: %d, conflicting term: %d]", + ne.Index, l.zeroTermOnErrCompacted(l.term(ne.Index)), ne.Term) + } + return ne.Index + } + } + return 0 +} + +func (l *raftLog) unstableEntries() []pb.Entry { + if len(l.unstable.entries) == 0 { + return nil + } + return l.unstable.entries +} + +// nextEnts returns all the available entries for execution. +// If applied is smaller than the index of snapshot, it returns all committed +// entries after the index of snapshot. +func (l *raftLog) nextEnts() (ents []pb.Entry) { + off := max(l.applied+1, l.firstIndex()) + if l.committed+1 > off { + ents, err := l.slice(off, l.committed+1, l.maxNextEntsSize) + if err != nil { + l.logger.Panicf("unexpected error when getting unapplied entries (%v)", err) + } + return ents + } + return nil +} + +// hasNextEnts returns if there is any available entries for execution. This +// is a fast check without heavy raftLog.slice() in raftLog.nextEnts(). +func (l *raftLog) hasNextEnts() bool { + off := max(l.applied+1, l.firstIndex()) + return l.committed+1 > off +} + +func (l *raftLog) snapshot() (pb.Snapshot, error) { + if l.unstable.snapshot != nil { + return *l.unstable.snapshot, nil + } + return l.storage.Snapshot() +} + +func (l *raftLog) firstIndex() uint64 { + if i, ok := l.unstable.maybeFirstIndex(); ok { + return i + } + index, err := l.storage.FirstIndex() + if err != nil { + panic(err) // TODO(bdarnell) + } + return index +} + +func (l *raftLog) lastIndex() uint64 { + if i, ok := l.unstable.maybeLastIndex(); ok { + return i + } + i, err := l.storage.LastIndex() + if err != nil { + panic(err) // TODO(bdarnell) + } + return i +} + +func (l *raftLog) commitTo(tocommit uint64) { + // never decrease commit + if l.committed < tocommit { + if l.lastIndex() < tocommit { + l.logger.Panicf("tocommit(%d) is out of range [lastIndex(%d)]. Was the raft log corrupted, truncated, or lost?", tocommit, l.lastIndex()) + } + l.committed = tocommit + } +} + +func (l *raftLog) appliedTo(i uint64) { + if i == 0 { + return + } + if l.committed < i || i < l.applied { + l.logger.Panicf("applied(%d) is out of range [prevApplied(%d), committed(%d)]", i, l.applied, l.committed) + } + l.applied = i +} + +func (l *raftLog) stableTo(i, t uint64) { l.unstable.stableTo(i, t) } + +func (l *raftLog) stableSnapTo(i uint64) { l.unstable.stableSnapTo(i) } + +func (l *raftLog) lastTerm() uint64 { + t, err := l.term(l.lastIndex()) + if err != nil { + l.logger.Panicf("unexpected error when getting the last term (%v)", err) + } + return t +} + +func (l *raftLog) term(i uint64) (uint64, error) { + // the valid term range is [index of dummy entry, last index] + dummyIndex := l.firstIndex() - 1 + if i < dummyIndex || i > l.lastIndex() { + // TODO: return an error instead? + return 0, nil + } + + if t, ok := l.unstable.maybeTerm(i); ok { + return t, nil + } + + t, err := l.storage.Term(i) + if err == nil { + return t, nil + } + if err == ErrCompacted || err == ErrUnavailable { + return 0, err + } + panic(err) // TODO(bdarnell) +} + +func (l *raftLog) entries(i, maxsize uint64) ([]pb.Entry, error) { + if i > l.lastIndex() { + return nil, nil + } + return l.slice(i, l.lastIndex()+1, maxsize) +} + +// allEntries returns all entries in the log. +func (l *raftLog) allEntries() []pb.Entry { + ents, err := l.entries(l.firstIndex(), noLimit) + if err == nil { + return ents + } + if err == ErrCompacted { // try again if there was a racing compaction + return l.allEntries() + } + // TODO (xiangli): handle error? + panic(err) +} + +// isUpToDate determines if the given (lastIndex,term) log is more up-to-date +// by comparing the index and term of the last entries in the existing logs. +// If the logs have last entries with different terms, then the log with the +// later term is more up-to-date. If the logs end with the same term, then +// whichever log has the larger lastIndex is more up-to-date. If the logs are +// the same, the given log is up-to-date. +func (l *raftLog) isUpToDate(lasti, term uint64) bool { + return term > l.lastTerm() || (term == l.lastTerm() && lasti >= l.lastIndex()) +} + +func (l *raftLog) matchTerm(i, term uint64) bool { + t, err := l.term(i) + if err != nil { + return false + } + return t == term +} + +func (l *raftLog) maybeCommit(maxIndex, term uint64) bool { + if maxIndex > l.committed && l.zeroTermOnErrCompacted(l.term(maxIndex)) == term { + l.commitTo(maxIndex) + return true + } + return false +} + +func (l *raftLog) restore(s pb.Snapshot) { + l.logger.Infof("log [%s] starts to restore snapshot [index: %d, term: %d]", l, s.Metadata.Index, s.Metadata.Term) + l.committed = s.Metadata.Index + l.unstable.restore(s) +} + +// slice returns a slice of log entries from lo through hi-1, inclusive. +func (l *raftLog) slice(lo, hi, maxSize uint64) ([]pb.Entry, error) { + err := l.mustCheckOutOfBounds(lo, hi) + if err != nil { + return nil, err + } + if lo == hi { + return nil, nil + } + var ents []pb.Entry + if lo < l.unstable.offset { + storedEnts, err := l.storage.Entries(lo, min(hi, l.unstable.offset), maxSize) + if err == ErrCompacted { + return nil, err + } else if err == ErrUnavailable { + l.logger.Panicf("entries[%d:%d) is unavailable from storage", lo, min(hi, l.unstable.offset)) + } else if err != nil { + panic(err) // TODO(bdarnell) + } + + // check if ents has reached the size limitation + if uint64(len(storedEnts)) < min(hi, l.unstable.offset)-lo { + return storedEnts, nil + } + + ents = storedEnts + } + if hi > l.unstable.offset { + unstable := l.unstable.slice(max(lo, l.unstable.offset), hi) + if len(ents) > 0 { + combined := make([]pb.Entry, len(ents)+len(unstable)) + n := copy(combined, ents) + copy(combined[n:], unstable) + ents = combined + } else { + ents = unstable + } + } + return limitSize(ents, maxSize), nil +} + +// l.firstIndex <= lo <= hi <= l.firstIndex + len(l.entries) +func (l *raftLog) mustCheckOutOfBounds(lo, hi uint64) error { + if lo > hi { + l.logger.Panicf("invalid slice %d > %d", lo, hi) + } + fi := l.firstIndex() + if lo < fi { + return ErrCompacted + } + + length := l.lastIndex() + 1 - fi + if lo < fi || hi > fi+length { + l.logger.Panicf("slice[%d,%d) out of bound [%d,%d]", lo, hi, fi, l.lastIndex()) + } + return nil +} + +func (l *raftLog) zeroTermOnErrCompacted(t uint64, err error) uint64 { + if err == nil { + return t + } + if err == ErrCompacted { + return 0 + } + l.logger.Panicf("unexpected error (%v)", err) + return 0 +} diff --git a/vendor/go.etcd.io/etcd/raft/log_unstable.go b/vendor/go.etcd.io/etcd/raft/log_unstable.go new file mode 100644 index 00000000..1bff5a7b --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/log_unstable.go @@ -0,0 +1,157 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import pb "go.etcd.io/etcd/raft/raftpb" + +// unstable.entries[i] has raft log position i+unstable.offset. +// Note that unstable.offset may be less than the highest log +// position in storage; this means that the next write to storage +// might need to truncate the log before persisting unstable.entries. +type unstable struct { + // the incoming unstable snapshot, if any. + snapshot *pb.Snapshot + // all entries that have not yet been written to storage. + entries []pb.Entry + offset uint64 + + logger Logger +} + +// maybeFirstIndex returns the index of the first possible entry in entries +// if it has a snapshot. +func (u *unstable) maybeFirstIndex() (uint64, bool) { + if u.snapshot != nil { + return u.snapshot.Metadata.Index + 1, true + } + return 0, false +} + +// maybeLastIndex returns the last index if it has at least one +// unstable entry or snapshot. +func (u *unstable) maybeLastIndex() (uint64, bool) { + if l := len(u.entries); l != 0 { + return u.offset + uint64(l) - 1, true + } + if u.snapshot != nil { + return u.snapshot.Metadata.Index, true + } + return 0, false +} + +// maybeTerm returns the term of the entry at index i, if there +// is any. +func (u *unstable) maybeTerm(i uint64) (uint64, bool) { + if i < u.offset { + if u.snapshot != nil && u.snapshot.Metadata.Index == i { + return u.snapshot.Metadata.Term, true + } + return 0, false + } + + last, ok := u.maybeLastIndex() + if !ok { + return 0, false + } + if i > last { + return 0, false + } + + return u.entries[i-u.offset].Term, true +} + +func (u *unstable) stableTo(i, t uint64) { + gt, ok := u.maybeTerm(i) + if !ok { + return + } + // if i < offset, term is matched with the snapshot + // only update the unstable entries if term is matched with + // an unstable entry. + if gt == t && i >= u.offset { + u.entries = u.entries[i+1-u.offset:] + u.offset = i + 1 + u.shrinkEntriesArray() + } +} + +// shrinkEntriesArray discards the underlying array used by the entries slice +// if most of it isn't being used. This avoids holding references to a bunch of +// potentially large entries that aren't needed anymore. Simply clearing the +// entries wouldn't be safe because clients might still be using them. +func (u *unstable) shrinkEntriesArray() { + // We replace the array if we're using less than half of the space in + // it. This number is fairly arbitrary, chosen as an attempt to balance + // memory usage vs number of allocations. It could probably be improved + // with some focused tuning. + const lenMultiple = 2 + if len(u.entries) == 0 { + u.entries = nil + } else if len(u.entries)*lenMultiple < cap(u.entries) { + newEntries := make([]pb.Entry, len(u.entries)) + copy(newEntries, u.entries) + u.entries = newEntries + } +} + +func (u *unstable) stableSnapTo(i uint64) { + if u.snapshot != nil && u.snapshot.Metadata.Index == i { + u.snapshot = nil + } +} + +func (u *unstable) restore(s pb.Snapshot) { + u.offset = s.Metadata.Index + 1 + u.entries = nil + u.snapshot = &s +} + +func (u *unstable) truncateAndAppend(ents []pb.Entry) { + after := ents[0].Index + switch { + case after == u.offset+uint64(len(u.entries)): + // after is the next index in the u.entries + // directly append + u.entries = append(u.entries, ents...) + case after <= u.offset: + u.logger.Infof("replace the unstable entries from index %d", after) + // The log is being truncated to before our current offset + // portion, so set the offset and replace the entries + u.offset = after + u.entries = ents + default: + // truncate to after and copy to u.entries + // then append + u.logger.Infof("truncate the unstable entries before index %d", after) + u.entries = append([]pb.Entry{}, u.slice(u.offset, after)...) + u.entries = append(u.entries, ents...) + } +} + +func (u *unstable) slice(lo uint64, hi uint64) []pb.Entry { + u.mustCheckOutOfBounds(lo, hi) + return u.entries[lo-u.offset : hi-u.offset] +} + +// u.offset <= lo <= hi <= u.offset+len(u.entries) +func (u *unstable) mustCheckOutOfBounds(lo, hi uint64) { + if lo > hi { + u.logger.Panicf("invalid unstable.slice %d > %d", lo, hi) + } + upper := u.offset + uint64(len(u.entries)) + if lo < u.offset || hi > upper { + u.logger.Panicf("unstable.slice[%d,%d) out of bound [%d,%d]", lo, hi, u.offset, upper) + } +} diff --git a/vendor/go.etcd.io/etcd/raft/logger.go b/vendor/go.etcd.io/etcd/raft/logger.go new file mode 100644 index 00000000..6d896296 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/logger.go @@ -0,0 +1,132 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "sync" +) + +type Logger interface { + Debug(v ...interface{}) + Debugf(format string, v ...interface{}) + + Error(v ...interface{}) + Errorf(format string, v ...interface{}) + + Info(v ...interface{}) + Infof(format string, v ...interface{}) + + Warning(v ...interface{}) + Warningf(format string, v ...interface{}) + + Fatal(v ...interface{}) + Fatalf(format string, v ...interface{}) + + Panic(v ...interface{}) + Panicf(format string, v ...interface{}) +} + +func SetLogger(l Logger) { + raftLoggerMu.Lock() + raftLogger = l + raftLoggerMu.Unlock() +} + +var ( + defaultLogger = &DefaultLogger{Logger: log.New(os.Stderr, "raft", log.LstdFlags)} + discardLogger = &DefaultLogger{Logger: log.New(ioutil.Discard, "", 0)} + raftLoggerMu sync.Mutex + raftLogger = Logger(defaultLogger) +) + +const ( + calldepth = 2 +) + +// DefaultLogger is a default implementation of the Logger interface. +type DefaultLogger struct { + *log.Logger + debug bool +} + +func (l *DefaultLogger) EnableTimestamps() { + l.SetFlags(l.Flags() | log.Ldate | log.Ltime) +} + +func (l *DefaultLogger) EnableDebug() { + l.debug = true +} + +func (l *DefaultLogger) Debug(v ...interface{}) { + if l.debug { + l.Output(calldepth, header("DEBUG", fmt.Sprint(v...))) + } +} + +func (l *DefaultLogger) Debugf(format string, v ...interface{}) { + if l.debug { + l.Output(calldepth, header("DEBUG", fmt.Sprintf(format, v...))) + } +} + +func (l *DefaultLogger) Info(v ...interface{}) { + l.Output(calldepth, header("INFO", fmt.Sprint(v...))) +} + +func (l *DefaultLogger) Infof(format string, v ...interface{}) { + l.Output(calldepth, header("INFO", fmt.Sprintf(format, v...))) +} + +func (l *DefaultLogger) Error(v ...interface{}) { + l.Output(calldepth, header("ERROR", fmt.Sprint(v...))) +} + +func (l *DefaultLogger) Errorf(format string, v ...interface{}) { + l.Output(calldepth, header("ERROR", fmt.Sprintf(format, v...))) +} + +func (l *DefaultLogger) Warning(v ...interface{}) { + l.Output(calldepth, header("WARN", fmt.Sprint(v...))) +} + +func (l *DefaultLogger) Warningf(format string, v ...interface{}) { + l.Output(calldepth, header("WARN", fmt.Sprintf(format, v...))) +} + +func (l *DefaultLogger) Fatal(v ...interface{}) { + l.Output(calldepth, header("FATAL", fmt.Sprint(v...))) + os.Exit(1) +} + +func (l *DefaultLogger) Fatalf(format string, v ...interface{}) { + l.Output(calldepth, header("FATAL", fmt.Sprintf(format, v...))) + os.Exit(1) +} + +func (l *DefaultLogger) Panic(v ...interface{}) { + l.Logger.Panic(v...) +} + +func (l *DefaultLogger) Panicf(format string, v ...interface{}) { + l.Logger.Panicf(format, v...) +} + +func header(lvl, msg string) string { + return fmt.Sprintf("%s: %s", lvl, msg) +} diff --git a/vendor/go.etcd.io/etcd/raft/node.go b/vendor/go.etcd.io/etcd/raft/node.go new file mode 100644 index 00000000..ab6185b9 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/node.go @@ -0,0 +1,584 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import ( + "context" + "errors" + + pb "go.etcd.io/etcd/raft/raftpb" +) + +type SnapshotStatus int + +const ( + SnapshotFinish SnapshotStatus = 1 + SnapshotFailure SnapshotStatus = 2 +) + +var ( + emptyState = pb.HardState{} + + // ErrStopped is returned by methods on Nodes that have been stopped. + ErrStopped = errors.New("raft: stopped") +) + +// SoftState provides state that is useful for logging and debugging. +// The state is volatile and does not need to be persisted to the WAL. +type SoftState struct { + Lead uint64 // must use atomic operations to access; keep 64-bit aligned. + RaftState StateType +} + +func (a *SoftState) equal(b *SoftState) bool { + return a.Lead == b.Lead && a.RaftState == b.RaftState +} + +// Ready encapsulates the entries and messages that are ready to read, +// be saved to stable storage, committed or sent to other peers. +// All fields in Ready are read-only. +type Ready struct { + // The current volatile state of a Node. + // SoftState will be nil if there is no update. + // It is not required to consume or store SoftState. + *SoftState + + // The current state of a Node to be saved to stable storage BEFORE + // Messages are sent. + // HardState will be equal to empty state if there is no update. + pb.HardState + + // ReadStates can be used for node to serve linearizable read requests locally + // when its applied index is greater than the index in ReadState. + // Note that the readState will be returned when raft receives msgReadIndex. + // The returned is only valid for the request that requested to read. + ReadStates []ReadState + + // Entries specifies entries to be saved to stable storage BEFORE + // Messages are sent. + Entries []pb.Entry + + // Snapshot specifies the snapshot to be saved to stable storage. + Snapshot pb.Snapshot + + // CommittedEntries specifies entries to be committed to a + // store/state-machine. These have previously been committed to stable + // store. + CommittedEntries []pb.Entry + + // Messages specifies outbound messages to be sent AFTER Entries are + // committed to stable storage. + // If it contains a MsgSnap message, the application MUST report back to raft + // when the snapshot has been received or has failed by calling ReportSnapshot. + Messages []pb.Message + + // MustSync indicates whether the HardState and Entries must be synchronously + // written to disk or if an asynchronous write is permissible. + MustSync bool +} + +func isHardStateEqual(a, b pb.HardState) bool { + return a.Term == b.Term && a.Vote == b.Vote && a.Commit == b.Commit +} + +// IsEmptyHardState returns true if the given HardState is empty. +func IsEmptyHardState(st pb.HardState) bool { + return isHardStateEqual(st, emptyState) +} + +// IsEmptySnap returns true if the given Snapshot is empty. +func IsEmptySnap(sp pb.Snapshot) bool { + return sp.Metadata.Index == 0 +} + +func (rd Ready) containsUpdates() bool { + return rd.SoftState != nil || !IsEmptyHardState(rd.HardState) || + !IsEmptySnap(rd.Snapshot) || len(rd.Entries) > 0 || + len(rd.CommittedEntries) > 0 || len(rd.Messages) > 0 || len(rd.ReadStates) != 0 +} + +// appliedCursor extracts from the Ready the highest index the client has +// applied (once the Ready is confirmed via Advance). If no information is +// contained in the Ready, returns zero. +func (rd Ready) appliedCursor() uint64 { + if n := len(rd.CommittedEntries); n > 0 { + return rd.CommittedEntries[n-1].Index + } + if index := rd.Snapshot.Metadata.Index; index > 0 { + return index + } + return 0 +} + +// Node represents a node in a raft cluster. +type Node interface { + // Tick increments the internal logical clock for the Node by a single tick. Election + // timeouts and heartbeat timeouts are in units of ticks. + Tick() + // Campaign causes the Node to transition to candidate state and start campaigning to become leader. + Campaign(ctx context.Context) error + // Propose proposes that data be appended to the log. Note that proposals can be lost without + // notice, therefore it is user's job to ensure proposal retries. + Propose(ctx context.Context, data []byte) error + // ProposeConfChange proposes a configuration change. Like any proposal, the + // configuration change may be dropped with or without an error being + // returned. In particular, configuration changes are dropped unless the + // leader has certainty that there is no prior unapplied configuration + // change in its log. + // + // The method accepts either a pb.ConfChange (deprecated) or pb.ConfChangeV2 + // message. The latter allows arbitrary configuration changes via joint + // consensus, notably including replacing a voter. Passing a ConfChangeV2 + // message is only allowed if all Nodes participating in the cluster run a + // version of this library aware of the V2 API. See pb.ConfChangeV2 for + // usage details and semantics. + ProposeConfChange(ctx context.Context, cc pb.ConfChangeI) error + + // Step advances the state machine using the given message. ctx.Err() will be returned, if any. + Step(ctx context.Context, msg pb.Message) error + + // Ready returns a channel that returns the current point-in-time state. + // Users of the Node must call Advance after retrieving the state returned by Ready. + // + // NOTE: No committed entries from the next Ready may be applied until all committed entries + // and snapshots from the previous one have finished. + Ready() <-chan Ready + + // Advance notifies the Node that the application has saved progress up to the last Ready. + // It prepares the node to return the next available Ready. + // + // The application should generally call Advance after it applies the entries in last Ready. + // + // However, as an optimization, the application may call Advance while it is applying the + // commands. For example. when the last Ready contains a snapshot, the application might take + // a long time to apply the snapshot data. To continue receiving Ready without blocking raft + // progress, it can call Advance before finishing applying the last ready. + Advance() + // ApplyConfChange applies a config change (previously passed to + // ProposeConfChange) to the node. This must be called whenever a config + // change is observed in Ready.CommittedEntries. + // + // Returns an opaque non-nil ConfState protobuf which must be recorded in + // snapshots. + ApplyConfChange(cc pb.ConfChangeI) *pb.ConfState + + // TransferLeadership attempts to transfer leadership to the given transferee. + TransferLeadership(ctx context.Context, lead, transferee uint64) + + // ReadIndex request a read state. The read state will be set in the ready. + // Read state has a read index. Once the application advances further than the read + // index, any linearizable read requests issued before the read request can be + // processed safely. The read state will have the same rctx attached. + ReadIndex(ctx context.Context, rctx []byte) error + + // Status returns the current status of the raft state machine. + Status() Status + // ReportUnreachable reports the given node is not reachable for the last send. + ReportUnreachable(id uint64) + // ReportSnapshot reports the status of the sent snapshot. The id is the raft ID of the follower + // who is meant to receive the snapshot, and the status is SnapshotFinish or SnapshotFailure. + // Calling ReportSnapshot with SnapshotFinish is a no-op. But, any failure in applying a + // snapshot (for e.g., while streaming it from leader to follower), should be reported to the + // leader with SnapshotFailure. When leader sends a snapshot to a follower, it pauses any raft + // log probes until the follower can apply the snapshot and advance its state. If the follower + // can't do that, for e.g., due to a crash, it could end up in a limbo, never getting any + // updates from the leader. Therefore, it is crucial that the application ensures that any + // failure in snapshot sending is caught and reported back to the leader; so it can resume raft + // log probing in the follower. + ReportSnapshot(id uint64, status SnapshotStatus) + // Stop performs any necessary termination of the Node. + Stop() +} + +type Peer struct { + ID uint64 + Context []byte +} + +// StartNode returns a new Node given configuration and a list of raft peers. +// It appends a ConfChangeAddNode entry for each given peer to the initial log. +// +// Peers must not be zero length; call RestartNode in that case. +func StartNode(c *Config, peers []Peer) Node { + if len(peers) == 0 { + panic("no peers given; use RestartNode instead") + } + rn, err := NewRawNode(c) + if err != nil { + panic(err) + } + rn.Bootstrap(peers) + + n := newNode(rn) + + go n.run() + return &n +} + +// RestartNode is similar to StartNode but does not take a list of peers. +// The current membership of the cluster will be restored from the Storage. +// If the caller has an existing state machine, pass in the last log index that +// has been applied to it; otherwise use zero. +func RestartNode(c *Config) Node { + rn, err := NewRawNode(c) + if err != nil { + panic(err) + } + n := newNode(rn) + go n.run() + return &n +} + +type msgWithResult struct { + m pb.Message + result chan error +} + +// node is the canonical implementation of the Node interface +type node struct { + propc chan msgWithResult + recvc chan pb.Message + confc chan pb.ConfChangeV2 + confstatec chan pb.ConfState + readyc chan Ready + advancec chan struct{} + tickc chan struct{} + done chan struct{} + stop chan struct{} + status chan chan Status + + rn *RawNode +} + +func newNode(rn *RawNode) node { + return node{ + propc: make(chan msgWithResult), + recvc: make(chan pb.Message), + confc: make(chan pb.ConfChangeV2), + confstatec: make(chan pb.ConfState), + readyc: make(chan Ready), + advancec: make(chan struct{}), + // make tickc a buffered chan, so raft node can buffer some ticks when the node + // is busy processing raft messages. Raft node will resume process buffered + // ticks when it becomes idle. + tickc: make(chan struct{}, 128), + done: make(chan struct{}), + stop: make(chan struct{}), + status: make(chan chan Status), + rn: rn, + } +} + +func (n *node) Stop() { + select { + case n.stop <- struct{}{}: + // Not already stopped, so trigger it + case <-n.done: + // Node has already been stopped - no need to do anything + return + } + // Block until the stop has been acknowledged by run() + <-n.done +} + +func (n *node) run() { + var propc chan msgWithResult + var readyc chan Ready + var advancec chan struct{} + var rd Ready + + r := n.rn.raft + + lead := None + + for { + if advancec != nil { + readyc = nil + } else if n.rn.HasReady() { + // Populate a Ready. Note that this Ready is not guaranteed to + // actually be handled. We will arm readyc, but there's no guarantee + // that we will actually send on it. It's possible that we will + // service another channel instead, loop around, and then populate + // the Ready again. We could instead force the previous Ready to be + // handled first, but it's generally good to emit larger Readys plus + // it simplifies testing (by emitting less frequently and more + // predictably). + rd = n.rn.readyWithoutAccept() + readyc = n.readyc + } + + if lead != r.lead { + if r.hasLeader() { + if lead == None { + r.logger.Infof("raft.node: %x elected leader %x at term %d", r.id, r.lead, r.Term) + } else { + r.logger.Infof("raft.node: %x changed leader from %x to %x at term %d", r.id, lead, r.lead, r.Term) + } + propc = n.propc + } else { + r.logger.Infof("raft.node: %x lost leader %x at term %d", r.id, lead, r.Term) + propc = nil + } + lead = r.lead + } + + select { + // TODO: maybe buffer the config propose if there exists one (the way + // described in raft dissertation) + // Currently it is dropped in Step silently. + case pm := <-propc: + m := pm.m + m.From = r.id + err := r.Step(m) + if pm.result != nil { + pm.result <- err + close(pm.result) + } + case m := <-n.recvc: + // filter out response message from unknown From. + if pr := r.prs.Progress[m.From]; pr != nil || !IsResponseMsg(m.Type) { + r.Step(m) + } + case cc := <-n.confc: + _, okBefore := r.prs.Progress[r.id] + cs := r.applyConfChange(cc) + // If the node was removed, block incoming proposals. Note that we + // only do this if the node was in the config before. Nodes may be + // a member of the group without knowing this (when they're catching + // up on the log and don't have the latest config) and we don't want + // to block the proposal channel in that case. + // + // NB: propc is reset when the leader changes, which, if we learn + // about it, sort of implies that we got readded, maybe? This isn't + // very sound and likely has bugs. + if _, okAfter := r.prs.Progress[r.id]; okBefore && !okAfter { + var found bool + for _, sl := range [][]uint64{cs.Voters, cs.VotersOutgoing} { + for _, id := range sl { + if id == r.id { + found = true + } + } + } + if !found { + propc = nil + } + } + select { + case n.confstatec <- cs: + case <-n.done: + } + case <-n.tickc: + n.rn.Tick() + case readyc <- rd: + n.rn.acceptReady(rd) + advancec = n.advancec + case <-advancec: + n.rn.Advance(rd) + rd = Ready{} + advancec = nil + case c := <-n.status: + c <- getStatus(r) + case <-n.stop: + close(n.done) + return + } + } +} + +// Tick increments the internal logical clock for this Node. Election timeouts +// and heartbeat timeouts are in units of ticks. +func (n *node) Tick() { + select { + case n.tickc <- struct{}{}: + case <-n.done: + default: + n.rn.raft.logger.Warningf("%x (leader %v) A tick missed to fire. Node blocks too long!", n.rn.raft.id, n.rn.raft.id == n.rn.raft.lead) + } +} + +func (n *node) Campaign(ctx context.Context) error { return n.step(ctx, pb.Message{Type: pb.MsgHup}) } + +func (n *node) Propose(ctx context.Context, data []byte) error { + return n.stepWait(ctx, pb.Message{Type: pb.MsgProp, Entries: []pb.Entry{{Data: data}}}) +} + +func (n *node) Step(ctx context.Context, m pb.Message) error { + // ignore unexpected local messages receiving over network + if IsLocalMsg(m.Type) { + // TODO: return an error? + return nil + } + return n.step(ctx, m) +} + +func confChangeToMsg(c pb.ConfChangeI) (pb.Message, error) { + typ, data, err := pb.MarshalConfChange(c) + if err != nil { + return pb.Message{}, err + } + return pb.Message{Type: pb.MsgProp, Entries: []pb.Entry{{Type: typ, Data: data}}}, nil +} + +func (n *node) ProposeConfChange(ctx context.Context, cc pb.ConfChangeI) error { + msg, err := confChangeToMsg(cc) + if err != nil { + return err + } + return n.Step(ctx, msg) +} + +func (n *node) step(ctx context.Context, m pb.Message) error { + return n.stepWithWaitOption(ctx, m, false) +} + +func (n *node) stepWait(ctx context.Context, m pb.Message) error { + return n.stepWithWaitOption(ctx, m, true) +} + +// Step advances the state machine using msgs. The ctx.Err() will be returned, +// if any. +func (n *node) stepWithWaitOption(ctx context.Context, m pb.Message, wait bool) error { + if m.Type != pb.MsgProp { + select { + case n.recvc <- m: + return nil + case <-ctx.Done(): + return ctx.Err() + case <-n.done: + return ErrStopped + } + } + ch := n.propc + pm := msgWithResult{m: m} + if wait { + pm.result = make(chan error, 1) + } + select { + case ch <- pm: + if !wait { + return nil + } + case <-ctx.Done(): + return ctx.Err() + case <-n.done: + return ErrStopped + } + select { + case err := <-pm.result: + if err != nil { + return err + } + case <-ctx.Done(): + return ctx.Err() + case <-n.done: + return ErrStopped + } + return nil +} + +func (n *node) Ready() <-chan Ready { return n.readyc } + +func (n *node) Advance() { + select { + case n.advancec <- struct{}{}: + case <-n.done: + } +} + +func (n *node) ApplyConfChange(cc pb.ConfChangeI) *pb.ConfState { + var cs pb.ConfState + select { + case n.confc <- cc.AsV2(): + case <-n.done: + } + select { + case cs = <-n.confstatec: + case <-n.done: + } + return &cs +} + +func (n *node) Status() Status { + c := make(chan Status) + select { + case n.status <- c: + return <-c + case <-n.done: + return Status{} + } +} + +func (n *node) ReportUnreachable(id uint64) { + select { + case n.recvc <- pb.Message{Type: pb.MsgUnreachable, From: id}: + case <-n.done: + } +} + +func (n *node) ReportSnapshot(id uint64, status SnapshotStatus) { + rej := status == SnapshotFailure + + select { + case n.recvc <- pb.Message{Type: pb.MsgSnapStatus, From: id, Reject: rej}: + case <-n.done: + } +} + +func (n *node) TransferLeadership(ctx context.Context, lead, transferee uint64) { + select { + // manually set 'from' and 'to', so that leader can voluntarily transfers its leadership + case n.recvc <- pb.Message{Type: pb.MsgTransferLeader, From: transferee, To: lead}: + case <-n.done: + case <-ctx.Done(): + } +} + +func (n *node) ReadIndex(ctx context.Context, rctx []byte) error { + return n.step(ctx, pb.Message{Type: pb.MsgReadIndex, Entries: []pb.Entry{{Data: rctx}}}) +} + +func newReady(r *raft, prevSoftSt *SoftState, prevHardSt pb.HardState) Ready { + rd := Ready{ + Entries: r.raftLog.unstableEntries(), + CommittedEntries: r.raftLog.nextEnts(), + Messages: r.msgs, + } + if softSt := r.softState(); !softSt.equal(prevSoftSt) { + rd.SoftState = softSt + } + if hardSt := r.hardState(); !isHardStateEqual(hardSt, prevHardSt) { + rd.HardState = hardSt + } + if r.raftLog.unstable.snapshot != nil { + rd.Snapshot = *r.raftLog.unstable.snapshot + } + if len(r.readStates) != 0 { + rd.ReadStates = r.readStates + } + rd.MustSync = MustSync(r.hardState(), prevHardSt, len(rd.Entries)) + return rd +} + +// MustSync returns true if the hard state and count of Raft entries indicate +// that a synchronous write to persistent storage is required. +func MustSync(st, prevst pb.HardState, entsnum int) bool { + // Persistent state on all servers: + // (Updated on stable storage before responding to RPCs) + // currentTerm + // votedFor + // log entries[] + return entsnum != 0 || st.Vote != prevst.Vote || st.Term != prevst.Term +} diff --git a/vendor/go.etcd.io/etcd/raft/quorum/joint.go b/vendor/go.etcd.io/etcd/raft/quorum/joint.go new file mode 100644 index 00000000..e3741e0b --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/quorum/joint.go @@ -0,0 +1,75 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package quorum + +// JointConfig is a configuration of two groups of (possibly overlapping) +// majority configurations. Decisions require the support of both majorities. +type JointConfig [2]MajorityConfig + +func (c JointConfig) String() string { + if len(c[1]) > 0 { + return c[0].String() + "&&" + c[1].String() + } + return c[0].String() +} + +// IDs returns a newly initialized map representing the set of voters present +// in the joint configuration. +func (c JointConfig) IDs() map[uint64]struct{} { + m := map[uint64]struct{}{} + for _, cc := range c { + for id := range cc { + m[id] = struct{}{} + } + } + return m +} + +// Describe returns a (multi-line) representation of the commit indexes for the +// given lookuper. +func (c JointConfig) Describe(l AckedIndexer) string { + return MajorityConfig(c.IDs()).Describe(l) +} + +// CommittedIndex returns the largest committed index for the given joint +// quorum. An index is jointly committed if it is committed in both constituent +// majorities. +func (c JointConfig) CommittedIndex(l AckedIndexer) Index { + idx0 := c[0].CommittedIndex(l) + idx1 := c[1].CommittedIndex(l) + if idx0 < idx1 { + return idx0 + } + return idx1 +} + +// VoteResult takes a mapping of voters to yes/no (true/false) votes and returns +// a result indicating whether the vote is pending, lost, or won. A joint quorum +// requires both majority quorums to vote in favor. +func (c JointConfig) VoteResult(votes map[uint64]bool) VoteResult { + r1 := c[0].VoteResult(votes) + r2 := c[1].VoteResult(votes) + + if r1 == r2 { + // If they agree, return the agreed state. + return r1 + } + if r1 == VoteLost || r2 == VoteLost { + // If either config has lost, loss is the only possible outcome. + return VoteLost + } + // One side won, the other one is pending, so the whole outcome is. + return VotePending +} diff --git a/vendor/go.etcd.io/etcd/raft/quorum/majority.go b/vendor/go.etcd.io/etcd/raft/quorum/majority.go new file mode 100644 index 00000000..8858a36b --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/quorum/majority.go @@ -0,0 +1,210 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package quorum + +import ( + "fmt" + "math" + "sort" + "strings" +) + +// MajorityConfig is a set of IDs that uses majority quorums to make decisions. +type MajorityConfig map[uint64]struct{} + +func (c MajorityConfig) String() string { + sl := make([]uint64, 0, len(c)) + for id := range c { + sl = append(sl, id) + } + sort.Slice(sl, func(i, j int) bool { return sl[i] < sl[j] }) + var buf strings.Builder + buf.WriteByte('(') + for i := range sl { + if i > 0 { + buf.WriteByte(' ') + } + fmt.Fprint(&buf, sl[i]) + } + buf.WriteByte(')') + return buf.String() +} + +// Describe returns a (multi-line) representation of the commit indexes for the +// given lookuper. +func (c MajorityConfig) Describe(l AckedIndexer) string { + if len(c) == 0 { + return "" + } + type tup struct { + id uint64 + idx Index + ok bool // idx found? + bar int // length of bar displayed for this tup + } + + // Below, populate .bar so that the i-th largest commit index has bar i (we + // plot this as sort of a progress bar). The actual code is a bit more + // complicated and also makes sure that equal index => equal bar. + + n := len(c) + info := make([]tup, 0, n) + for id := range c { + idx, ok := l.AckedIndex(id) + info = append(info, tup{id: id, idx: idx, ok: ok}) + } + + // Sort by index + sort.Slice(info, func(i, j int) bool { + if info[i].idx == info[j].idx { + return info[i].id < info[j].id + } + return info[i].idx < info[j].idx + }) + + // Populate .bar. + for i := range info { + if i > 0 && info[i-1].idx < info[i].idx { + info[i].bar = i + } + } + + // Sort by ID. + sort.Slice(info, func(i, j int) bool { + return info[i].id < info[j].id + }) + + var buf strings.Builder + + // Print. + fmt.Fprint(&buf, strings.Repeat(" ", n)+" idx\n") + for i := range info { + bar := info[i].bar + if !info[i].ok { + fmt.Fprint(&buf, "?"+strings.Repeat(" ", n)) + } else { + fmt.Fprint(&buf, strings.Repeat("x", bar)+">"+strings.Repeat(" ", n-bar)) + } + fmt.Fprintf(&buf, " %5d (id=%d)\n", info[i].idx, info[i].id) + } + return buf.String() +} + +// Slice returns the MajorityConfig as a sorted slice. +func (c MajorityConfig) Slice() []uint64 { + var sl []uint64 + for id := range c { + sl = append(sl, id) + } + sort.Slice(sl, func(i, j int) bool { return sl[i] < sl[j] }) + return sl +} + +func insertionSort(sl []uint64) { + a, b := 0, len(sl) + for i := a + 1; i < b; i++ { + for j := i; j > a && sl[j] < sl[j-1]; j-- { + sl[j], sl[j-1] = sl[j-1], sl[j] + } + } +} + +// CommittedIndex computes the committed index from those supplied via the +// provided AckedIndexer (for the active config). +func (c MajorityConfig) CommittedIndex(l AckedIndexer) Index { + n := len(c) + if n == 0 { + // This plays well with joint quorums which, when one half is the zero + // MajorityConfig, should behave like the other half. + return math.MaxUint64 + } + + // Use an on-stack slice to collect the committed indexes when n <= 7 + // (otherwise we alloc). The alternative is to stash a slice on + // MajorityConfig, but this impairs usability (as is, MajorityConfig is just + // a map, and that's nice). The assumption is that running with a + // replication factor of >7 is rare, and in cases in which it happens + // performance is a lesser concern (additionally the performance + // implications of an allocation here are far from drastic). + var stk [7]uint64 + var srt []uint64 + if len(stk) >= n { + srt = stk[:n] + } else { + srt = make([]uint64, n) + } + + { + // Fill the slice with the indexes observed. Any unused slots will be + // left as zero; these correspond to voters that may report in, but + // haven't yet. We fill from the right (since the zeroes will end up on + // the left after sorting below anyway). + i := n - 1 + for id := range c { + if idx, ok := l.AckedIndex(id); ok { + srt[i] = uint64(idx) + i-- + } + } + } + + // Sort by index. Use a bespoke algorithm (copied from the stdlib's sort + // package) to keep srt on the stack. + insertionSort(srt) + + // The smallest index into the array for which the value is acked by a + // quorum. In other words, from the end of the slice, move n/2+1 to the + // left (accounting for zero-indexing). + pos := n - (n/2 + 1) + return Index(srt[pos]) +} + +// VoteResult takes a mapping of voters to yes/no (true/false) votes and returns +// a result indicating whether the vote is pending (i.e. neither a quorum of +// yes/no has been reached), won (a quorum of yes has been reached), or lost (a +// quorum of no has been reached). +func (c MajorityConfig) VoteResult(votes map[uint64]bool) VoteResult { + if len(c) == 0 { + // By convention, the elections on an empty config win. This comes in + // handy with joint quorums because it'll make a half-populated joint + // quorum behave like a majority quorum. + return VoteWon + } + + ny := [2]int{} // vote counts for no and yes, respectively + + var missing int + for id := range c { + v, ok := votes[id] + if !ok { + missing++ + continue + } + if v { + ny[1]++ + } else { + ny[0]++ + } + } + + q := len(c)/2 + 1 + if ny[1] >= q { + return VoteWon + } + if ny[1]+missing >= q { + return VotePending + } + return VoteLost +} diff --git a/vendor/go.etcd.io/etcd/raft/quorum/quorum.go b/vendor/go.etcd.io/etcd/raft/quorum/quorum.go new file mode 100644 index 00000000..2899e46c --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/quorum/quorum.go @@ -0,0 +1,58 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package quorum + +import ( + "math" + "strconv" +) + +// Index is a Raft log position. +type Index uint64 + +func (i Index) String() string { + if i == math.MaxUint64 { + return "∞" + } + return strconv.FormatUint(uint64(i), 10) +} + +// AckedIndexer allows looking up a commit index for a given ID of a voter +// from a corresponding MajorityConfig. +type AckedIndexer interface { + AckedIndex(voterID uint64) (idx Index, found bool) +} + +type mapAckIndexer map[uint64]Index + +func (m mapAckIndexer) AckedIndex(id uint64) (Index, bool) { + idx, ok := m[id] + return idx, ok +} + +// VoteResult indicates the outcome of a vote. +// +//go:generate stringer -type=VoteResult +type VoteResult uint8 + +const ( + // VotePending indicates that the decision of the vote depends on future + // votes, i.e. neither "yes" or "no" has reached quorum yet. + VotePending VoteResult = 1 + iota + // VoteLost indicates that the quorum has voted "no". + VoteLost + // VoteWon indicates that the quorum has voted "yes". + VoteWon +) diff --git a/vendor/go.etcd.io/etcd/raft/quorum/voteresult_string.go b/vendor/go.etcd.io/etcd/raft/quorum/voteresult_string.go new file mode 100644 index 00000000..9eca8fd0 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/quorum/voteresult_string.go @@ -0,0 +1,26 @@ +// Code generated by "stringer -type=VoteResult"; DO NOT EDIT. + +package quorum + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[VotePending-1] + _ = x[VoteLost-2] + _ = x[VoteWon-3] +} + +const _VoteResult_name = "VotePendingVoteLostVoteWon" + +var _VoteResult_index = [...]uint8{0, 11, 19, 26} + +func (i VoteResult) String() string { + i -= 1 + if i >= VoteResult(len(_VoteResult_index)-1) { + return "VoteResult(" + strconv.FormatInt(int64(i+1), 10) + ")" + } + return _VoteResult_name[_VoteResult_index[i]:_VoteResult_index[i+1]] +} diff --git a/vendor/go.etcd.io/etcd/raft/raft.go b/vendor/go.etcd.io/etcd/raft/raft.go new file mode 100644 index 00000000..d3c3f425 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/raft.go @@ -0,0 +1,1656 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import ( + "bytes" + "errors" + "fmt" + "math" + "math/rand" + "sort" + "strings" + "sync" + "time" + + "go.etcd.io/etcd/raft/confchange" + "go.etcd.io/etcd/raft/quorum" + pb "go.etcd.io/etcd/raft/raftpb" + "go.etcd.io/etcd/raft/tracker" +) + +// None is a placeholder node ID used when there is no leader. +const None uint64 = 0 +const noLimit = math.MaxUint64 + +// Possible values for StateType. +const ( + StateFollower StateType = iota + StateCandidate + StateLeader + StatePreCandidate + numStates +) + +type ReadOnlyOption int + +const ( + // ReadOnlySafe guarantees the linearizability of the read only request by + // communicating with the quorum. It is the default and suggested option. + ReadOnlySafe ReadOnlyOption = iota + // ReadOnlyLeaseBased ensures linearizability of the read only request by + // relying on the leader lease. It can be affected by clock drift. + // If the clock drift is unbounded, leader might keep the lease longer than it + // should (clock can move backward/pause without any bound). ReadIndex is not safe + // in that case. + ReadOnlyLeaseBased +) + +// Possible values for CampaignType +const ( + // campaignPreElection represents the first phase of a normal election when + // Config.PreVote is true. + campaignPreElection CampaignType = "CampaignPreElection" + // campaignElection represents a normal (time-based) election (the second phase + // of the election when Config.PreVote is true). + campaignElection CampaignType = "CampaignElection" + // campaignTransfer represents the type of leader transfer + campaignTransfer CampaignType = "CampaignTransfer" +) + +// ErrProposalDropped is returned when the proposal is ignored by some cases, +// so that the proposer can be notified and fail fast. +var ErrProposalDropped = errors.New("raft proposal dropped") + +// lockedRand is a small wrapper around rand.Rand to provide +// synchronization among multiple raft groups. Only the methods needed +// by the code are exposed (e.g. Intn). +type lockedRand struct { + mu sync.Mutex + rand *rand.Rand +} + +func (r *lockedRand) Intn(n int) int { + r.mu.Lock() + v := r.rand.Intn(n) + r.mu.Unlock() + return v +} + +var globalRand = &lockedRand{ + rand: rand.New(rand.NewSource(time.Now().UnixNano())), +} + +// CampaignType represents the type of campaigning +// the reason we use the type of string instead of uint64 +// is because it's simpler to compare and fill in raft entries +type CampaignType string + +// StateType represents the role of a node in a cluster. +type StateType uint64 + +var stmap = [...]string{ + "StateFollower", + "StateCandidate", + "StateLeader", + "StatePreCandidate", +} + +func (st StateType) String() string { + return stmap[uint64(st)] +} + +// Config contains the parameters to start a raft. +type Config struct { + // ID is the identity of the local raft. ID cannot be 0. + ID uint64 + + // peers contains the IDs of all nodes (including self) in the raft cluster. It + // should only be set when starting a new raft cluster. Restarting raft from + // previous configuration will panic if peers is set. peer is private and only + // used for testing right now. + peers []uint64 + + // learners contains the IDs of all learner nodes (including self if the + // local node is a learner) in the raft cluster. learners only receives + // entries from the leader node. It does not vote or promote itself. + learners []uint64 + + // ElectionTick is the number of Node.Tick invocations that must pass between + // elections. That is, if a follower does not receive any message from the + // leader of current term before ElectionTick has elapsed, it will become + // candidate and start an election. ElectionTick must be greater than + // HeartbeatTick. We suggest ElectionTick = 10 * HeartbeatTick to avoid + // unnecessary leader switching. + ElectionTick int + // HeartbeatTick is the number of Node.Tick invocations that must pass between + // heartbeats. That is, a leader sends heartbeat messages to maintain its + // leadership every HeartbeatTick ticks. + HeartbeatTick int + + // Storage is the storage for raft. raft generates entries and states to be + // stored in storage. raft reads the persisted entries and states out of + // Storage when it needs. raft reads out the previous state and configuration + // out of storage when restarting. + Storage Storage + // Applied is the last applied index. It should only be set when restarting + // raft. raft will not return entries to the application smaller or equal to + // Applied. If Applied is unset when restarting, raft might return previous + // applied entries. This is a very application dependent configuration. + Applied uint64 + + // MaxSizePerMsg limits the max byte size of each append message. Smaller + // value lowers the raft recovery cost(initial probing and message lost + // during normal operation). On the other side, it might affect the + // throughput during normal replication. Note: math.MaxUint64 for unlimited, + // 0 for at most one entry per message. + MaxSizePerMsg uint64 + // MaxCommittedSizePerReady limits the size of the committed entries which + // can be applied. + MaxCommittedSizePerReady uint64 + // MaxUncommittedEntriesSize limits the aggregate byte size of the + // uncommitted entries that may be appended to a leader's log. Once this + // limit is exceeded, proposals will begin to return ErrProposalDropped + // errors. Note: 0 for no limit. + MaxUncommittedEntriesSize uint64 + // MaxInflightMsgs limits the max number of in-flight append messages during + // optimistic replication phase. The application transportation layer usually + // has its own sending buffer over TCP/UDP. Setting MaxInflightMsgs to avoid + // overflowing that sending buffer. TODO (xiangli): feedback to application to + // limit the proposal rate? + MaxInflightMsgs int + + // CheckQuorum specifies if the leader should check quorum activity. Leader + // steps down when quorum is not active for an electionTimeout. + CheckQuorum bool + + // PreVote enables the Pre-Vote algorithm described in raft thesis section + // 9.6. This prevents disruption when a node that has been partitioned away + // rejoins the cluster. + PreVote bool + + // ReadOnlyOption specifies how the read only request is processed. + // + // ReadOnlySafe guarantees the linearizability of the read only request by + // communicating with the quorum. It is the default and suggested option. + // + // ReadOnlyLeaseBased ensures linearizability of the read only request by + // relying on the leader lease. It can be affected by clock drift. + // If the clock drift is unbounded, leader might keep the lease longer than it + // should (clock can move backward/pause without any bound). ReadIndex is not safe + // in that case. + // CheckQuorum MUST be enabled if ReadOnlyOption is ReadOnlyLeaseBased. + ReadOnlyOption ReadOnlyOption + + // Logger is the logger used for raft log. For multinode which can host + // multiple raft group, each raft group can have its own logger + Logger Logger + + // DisableProposalForwarding set to true means that followers will drop + // proposals, rather than forwarding them to the leader. One use case for + // this feature would be in a situation where the Raft leader is used to + // compute the data of a proposal, for example, adding a timestamp from a + // hybrid logical clock to data in a monotonically increasing way. Forwarding + // should be disabled to prevent a follower with an inaccurate hybrid + // logical clock from assigning the timestamp and then forwarding the data + // to the leader. + DisableProposalForwarding bool +} + +func (c *Config) validate() error { + if c.ID == None { + return errors.New("cannot use none as id") + } + + if c.HeartbeatTick <= 0 { + return errors.New("heartbeat tick must be greater than 0") + } + + if c.ElectionTick <= c.HeartbeatTick { + return errors.New("election tick must be greater than heartbeat tick") + } + + if c.Storage == nil { + return errors.New("storage cannot be nil") + } + + if c.MaxUncommittedEntriesSize == 0 { + c.MaxUncommittedEntriesSize = noLimit + } + + // default MaxCommittedSizePerReady to MaxSizePerMsg because they were + // previously the same parameter. + if c.MaxCommittedSizePerReady == 0 { + c.MaxCommittedSizePerReady = c.MaxSizePerMsg + } + + if c.MaxInflightMsgs <= 0 { + return errors.New("max inflight messages must be greater than 0") + } + + if c.Logger == nil { + c.Logger = raftLogger + } + + if c.ReadOnlyOption == ReadOnlyLeaseBased && !c.CheckQuorum { + return errors.New("CheckQuorum must be enabled when ReadOnlyOption is ReadOnlyLeaseBased") + } + + return nil +} + +type raft struct { + id uint64 + + Term uint64 + Vote uint64 + + readStates []ReadState + + // the log + raftLog *raftLog + + maxMsgSize uint64 + maxUncommittedSize uint64 + // TODO(tbg): rename to trk. + prs tracker.ProgressTracker + + state StateType + + // isLearner is true if the local raft node is a learner. + isLearner bool + + msgs []pb.Message + + // the leader id + lead uint64 + // leadTransferee is id of the leader transfer target when its value is not zero. + // Follow the procedure defined in raft thesis 3.10. + leadTransferee uint64 + // Only one conf change may be pending (in the log, but not yet + // applied) at a time. This is enforced via pendingConfIndex, which + // is set to a value >= the log index of the latest pending + // configuration change (if any). Config changes are only allowed to + // be proposed if the leader's applied index is greater than this + // value. + pendingConfIndex uint64 + // an estimate of the size of the uncommitted tail of the Raft log. Used to + // prevent unbounded log growth. Only maintained by the leader. Reset on + // term changes. + uncommittedSize uint64 + + readOnly *readOnly + + // number of ticks since it reached last electionTimeout when it is leader + // or candidate. + // number of ticks since it reached last electionTimeout or received a + // valid message from current leader when it is a follower. + electionElapsed int + + // number of ticks since it reached last heartbeatTimeout. + // only leader keeps heartbeatElapsed. + heartbeatElapsed int + + checkQuorum bool + preVote bool + + heartbeatTimeout int + electionTimeout int + // randomizedElectionTimeout is a random number between + // [electiontimeout, 2 * electiontimeout - 1]. It gets reset + // when raft changes its state to follower or candidate. + randomizedElectionTimeout int + disableProposalForwarding bool + + tick func() + step stepFunc + + logger Logger +} + +func newRaft(c *Config) *raft { + if err := c.validate(); err != nil { + panic(err.Error()) + } + raftlog := newLogWithSize(c.Storage, c.Logger, c.MaxCommittedSizePerReady) + hs, cs, err := c.Storage.InitialState() + if err != nil { + panic(err) // TODO(bdarnell) + } + + if len(c.peers) > 0 || len(c.learners) > 0 { + if len(cs.Voters) > 0 || len(cs.Learners) > 0 { + // TODO(bdarnell): the peers argument is always nil except in + // tests; the argument should be removed and these tests should be + // updated to specify their nodes through a snapshot. + panic("cannot specify both newRaft(peers, learners) and ConfState.(Voters, Learners)") + } + cs.Voters = c.peers + cs.Learners = c.learners + } + + r := &raft{ + id: c.ID, + lead: None, + isLearner: false, + raftLog: raftlog, + maxMsgSize: c.MaxSizePerMsg, + maxUncommittedSize: c.MaxUncommittedEntriesSize, + prs: tracker.MakeProgressTracker(c.MaxInflightMsgs), + electionTimeout: c.ElectionTick, + heartbeatTimeout: c.HeartbeatTick, + logger: c.Logger, + checkQuorum: c.CheckQuorum, + preVote: c.PreVote, + readOnly: newReadOnly(c.ReadOnlyOption), + disableProposalForwarding: c.DisableProposalForwarding, + } + + cfg, prs, err := confchange.Restore(confchange.Changer{ + Tracker: r.prs, + LastIndex: raftlog.lastIndex(), + }, cs) + if err != nil { + panic(err) + } + assertConfStatesEquivalent(r.logger, cs, r.switchToConfig(cfg, prs)) + + if !IsEmptyHardState(hs) { + r.loadState(hs) + } + if c.Applied > 0 { + raftlog.appliedTo(c.Applied) + } + r.becomeFollower(r.Term, None) + + var nodesStrs []string + for _, n := range r.prs.VoterNodes() { + nodesStrs = append(nodesStrs, fmt.Sprintf("%x", n)) + } + + r.logger.Infof("newRaft %x [peers: [%s], term: %d, commit: %d, applied: %d, lastindex: %d, lastterm: %d]", + r.id, strings.Join(nodesStrs, ","), r.Term, r.raftLog.committed, r.raftLog.applied, r.raftLog.lastIndex(), r.raftLog.lastTerm()) + return r +} + +func (r *raft) hasLeader() bool { return r.lead != None } + +func (r *raft) softState() *SoftState { return &SoftState{Lead: r.lead, RaftState: r.state} } + +func (r *raft) hardState() pb.HardState { + return pb.HardState{ + Term: r.Term, + Vote: r.Vote, + Commit: r.raftLog.committed, + } +} + +// send persists state to stable storage and then sends to its mailbox. +func (r *raft) send(m pb.Message) { + m.From = r.id + if m.Type == pb.MsgVote || m.Type == pb.MsgVoteResp || m.Type == pb.MsgPreVote || m.Type == pb.MsgPreVoteResp { + if m.Term == 0 { + // All {pre-,}campaign messages need to have the term set when + // sending. + // - MsgVote: m.Term is the term the node is campaigning for, + // non-zero as we increment the term when campaigning. + // - MsgVoteResp: m.Term is the new r.Term if the MsgVote was + // granted, non-zero for the same reason MsgVote is + // - MsgPreVote: m.Term is the term the node will campaign, + // non-zero as we use m.Term to indicate the next term we'll be + // campaigning for + // - MsgPreVoteResp: m.Term is the term received in the original + // MsgPreVote if the pre-vote was granted, non-zero for the + // same reasons MsgPreVote is + panic(fmt.Sprintf("term should be set when sending %s", m.Type)) + } + } else { + if m.Term != 0 { + panic(fmt.Sprintf("term should not be set when sending %s (was %d)", m.Type, m.Term)) + } + // do not attach term to MsgProp, MsgReadIndex + // proposals are a way to forward to the leader and + // should be treated as local message. + // MsgReadIndex is also forwarded to leader. + if m.Type != pb.MsgProp && m.Type != pb.MsgReadIndex { + m.Term = r.Term + } + } + r.msgs = append(r.msgs, m) +} + +// sendAppend sends an append RPC with new entries (if any) and the +// current commit index to the given peer. +func (r *raft) sendAppend(to uint64) { + r.maybeSendAppend(to, true) +} + +// maybeSendAppend sends an append RPC with new entries to the given peer, +// if necessary. Returns true if a message was sent. The sendIfEmpty +// argument controls whether messages with no entries will be sent +// ("empty" messages are useful to convey updated Commit indexes, but +// are undesirable when we're sending multiple messages in a batch). +func (r *raft) maybeSendAppend(to uint64, sendIfEmpty bool) bool { + pr := r.prs.Progress[to] + if pr.IsPaused() { + return false + } + m := pb.Message{} + m.To = to + + term, errt := r.raftLog.term(pr.Next - 1) + ents, erre := r.raftLog.entries(pr.Next, r.maxMsgSize) + if len(ents) == 0 && !sendIfEmpty { + return false + } + + if errt != nil || erre != nil { // send snapshot if we failed to get term or entries + if !pr.RecentActive { + r.logger.Debugf("ignore sending snapshot to %x since it is not recently active", to) + return false + } + + m.Type = pb.MsgSnap + snapshot, err := r.raftLog.snapshot() + if err != nil { + if err == ErrSnapshotTemporarilyUnavailable { + r.logger.Debugf("%x failed to send snapshot to %x because snapshot is temporarily unavailable", r.id, to) + return false + } + panic(err) // TODO(bdarnell) + } + if IsEmptySnap(snapshot) { + panic("need non-empty snapshot") + } + m.Snapshot = snapshot + sindex, sterm := snapshot.Metadata.Index, snapshot.Metadata.Term + r.logger.Debugf("%x [firstindex: %d, commit: %d] sent snapshot[index: %d, term: %d] to %x [%s]", + r.id, r.raftLog.firstIndex(), r.raftLog.committed, sindex, sterm, to, pr) + pr.BecomeSnapshot(sindex) + r.logger.Debugf("%x paused sending replication messages to %x [%s]", r.id, to, pr) + } else { + m.Type = pb.MsgApp + m.Index = pr.Next - 1 + m.LogTerm = term + m.Entries = ents + m.Commit = r.raftLog.committed + if n := len(m.Entries); n != 0 { + switch pr.State { + // optimistically increase the next when in StateReplicate + case tracker.StateReplicate: + last := m.Entries[n-1].Index + pr.OptimisticUpdate(last) + pr.Inflights.Add(last) + case tracker.StateProbe: + pr.ProbeSent = true + default: + r.logger.Panicf("%x is sending append in unhandled state %s", r.id, pr.State) + } + } + } + r.send(m) + return true +} + +// sendHeartbeat sends a heartbeat RPC to the given peer. +func (r *raft) sendHeartbeat(to uint64, ctx []byte) { + // Attach the commit as min(to.matched, r.committed). + // When the leader sends out heartbeat message, + // the receiver(follower) might not be matched with the leader + // or it might not have all the committed entries. + // The leader MUST NOT forward the follower's commit to + // an unmatched index. + commit := min(r.prs.Progress[to].Match, r.raftLog.committed) + m := pb.Message{ + To: to, + Type: pb.MsgHeartbeat, + Commit: commit, + Context: ctx, + } + + r.send(m) +} + +// bcastAppend sends RPC, with entries to all peers that are not up-to-date +// according to the progress recorded in r.prs. +func (r *raft) bcastAppend() { + r.prs.Visit(func(id uint64, _ *tracker.Progress) { + if id == r.id { + return + } + r.sendAppend(id) + }) +} + +// bcastHeartbeat sends RPC, without entries to all the peers. +func (r *raft) bcastHeartbeat() { + lastCtx := r.readOnly.lastPendingRequestCtx() + if len(lastCtx) == 0 { + r.bcastHeartbeatWithCtx(nil) + } else { + r.bcastHeartbeatWithCtx([]byte(lastCtx)) + } +} + +func (r *raft) bcastHeartbeatWithCtx(ctx []byte) { + r.prs.Visit(func(id uint64, _ *tracker.Progress) { + if id == r.id { + return + } + r.sendHeartbeat(id, ctx) + }) +} + +func (r *raft) advance(rd Ready) { + // If entries were applied (or a snapshot), update our cursor for + // the next Ready. Note that if the current HardState contains a + // new Commit index, this does not mean that we're also applying + // all of the new entries due to commit pagination by size. + if index := rd.appliedCursor(); index > 0 { + r.raftLog.appliedTo(index) + if r.prs.Config.AutoLeave && index >= r.pendingConfIndex && r.state == StateLeader { + // If the current (and most recent, at least for this leader's term) + // configuration should be auto-left, initiate that now. + ccdata, err := (&pb.ConfChangeV2{}).Marshal() + if err != nil { + panic(err) + } + ent := pb.Entry{ + Type: pb.EntryConfChangeV2, + Data: ccdata, + } + if !r.appendEntry(ent) { + // If we could not append the entry, bump the pending conf index + // so that we'll try again later. + // + // TODO(tbg): test this case. + r.pendingConfIndex = r.raftLog.lastIndex() + } else { + r.logger.Infof("initiating automatic transition out of joint configuration %s", r.prs.Config) + } + } + } + r.reduceUncommittedSize(rd.CommittedEntries) + + if len(rd.Entries) > 0 { + e := rd.Entries[len(rd.Entries)-1] + r.raftLog.stableTo(e.Index, e.Term) + } + if !IsEmptySnap(rd.Snapshot) { + r.raftLog.stableSnapTo(rd.Snapshot.Metadata.Index) + } +} + +// maybeCommit attempts to advance the commit index. Returns true if +// the commit index changed (in which case the caller should call +// r.bcastAppend). +func (r *raft) maybeCommit() bool { + mci := r.prs.Committed() + return r.raftLog.maybeCommit(mci, r.Term) +} + +func (r *raft) reset(term uint64) { + if r.Term != term { + r.Term = term + r.Vote = None + } + r.lead = None + + r.electionElapsed = 0 + r.heartbeatElapsed = 0 + r.resetRandomizedElectionTimeout() + + r.abortLeaderTransfer() + + r.prs.ResetVotes() + r.prs.Visit(func(id uint64, pr *tracker.Progress) { + *pr = tracker.Progress{ + Match: 0, + Next: r.raftLog.lastIndex() + 1, + Inflights: tracker.NewInflights(r.prs.MaxInflight), + IsLearner: pr.IsLearner, + } + if id == r.id { + pr.Match = r.raftLog.lastIndex() + } + }) + + r.pendingConfIndex = 0 + r.uncommittedSize = 0 + r.readOnly = newReadOnly(r.readOnly.option) +} + +func (r *raft) appendEntry(es ...pb.Entry) (accepted bool) { + li := r.raftLog.lastIndex() + for i := range es { + es[i].Term = r.Term + es[i].Index = li + 1 + uint64(i) + } + // Track the size of this uncommitted proposal. + if !r.increaseUncommittedSize(es) { + r.logger.Debugf( + "%x appending new entries to log would exceed uncommitted entry size limit; dropping proposal", + r.id, + ) + // Drop the proposal. + return false + } + // use latest "last" index after truncate/append + li = r.raftLog.append(es...) + r.prs.Progress[r.id].MaybeUpdate(li) + // Regardless of maybeCommit's return, our caller will call bcastAppend. + r.maybeCommit() + return true +} + +// tickElection is run by followers and candidates after r.electionTimeout. +func (r *raft) tickElection() { + r.electionElapsed++ + + if r.promotable() && r.pastElectionTimeout() { + r.electionElapsed = 0 + r.Step(pb.Message{From: r.id, Type: pb.MsgHup}) + } +} + +// tickHeartbeat is run by leaders to send a MsgBeat after r.heartbeatTimeout. +func (r *raft) tickHeartbeat() { + r.heartbeatElapsed++ + r.electionElapsed++ + + if r.electionElapsed >= r.electionTimeout { + r.electionElapsed = 0 + if r.checkQuorum { + r.Step(pb.Message{From: r.id, Type: pb.MsgCheckQuorum}) + } + // If current leader cannot transfer leadership in electionTimeout, it becomes leader again. + if r.state == StateLeader && r.leadTransferee != None { + r.abortLeaderTransfer() + } + } + + if r.state != StateLeader { + return + } + + if r.heartbeatElapsed >= r.heartbeatTimeout { + r.heartbeatElapsed = 0 + r.Step(pb.Message{From: r.id, Type: pb.MsgBeat}) + } +} + +func (r *raft) becomeFollower(term uint64, lead uint64) { + r.step = stepFollower + r.reset(term) + r.tick = r.tickElection + r.lead = lead + r.state = StateFollower + r.logger.Infof("%x became follower at term %d", r.id, r.Term) +} + +func (r *raft) becomeCandidate() { + // TODO(xiangli) remove the panic when the raft implementation is stable + if r.state == StateLeader { + panic("invalid transition [leader -> candidate]") + } + r.step = stepCandidate + r.reset(r.Term + 1) + r.tick = r.tickElection + r.Vote = r.id + r.state = StateCandidate + r.logger.Infof("%x became candidate at term %d", r.id, r.Term) +} + +func (r *raft) becomePreCandidate() { + // TODO(xiangli) remove the panic when the raft implementation is stable + if r.state == StateLeader { + panic("invalid transition [leader -> pre-candidate]") + } + // Becoming a pre-candidate changes our step functions and state, + // but doesn't change anything else. In particular it does not increase + // r.Term or change r.Vote. + r.step = stepCandidate + r.prs.ResetVotes() + r.tick = r.tickElection + r.lead = None + r.state = StatePreCandidate + r.logger.Infof("%x became pre-candidate at term %d", r.id, r.Term) +} + +func (r *raft) becomeLeader() { + // TODO(xiangli) remove the panic when the raft implementation is stable + if r.state == StateFollower { + panic("invalid transition [follower -> leader]") + } + r.step = stepLeader + r.reset(r.Term) + r.tick = r.tickHeartbeat + r.lead = r.id + r.state = StateLeader + // Followers enter replicate mode when they've been successfully probed + // (perhaps after having received a snapshot as a result). The leader is + // trivially in this state. Note that r.reset() has initialized this + // progress with the last index already. + r.prs.Progress[r.id].BecomeReplicate() + + // Conservatively set the pendingConfIndex to the last index in the + // log. There may or may not be a pending config change, but it's + // safe to delay any future proposals until we commit all our + // pending log entries, and scanning the entire tail of the log + // could be expensive. + r.pendingConfIndex = r.raftLog.lastIndex() + + emptyEnt := pb.Entry{Data: nil} + if !r.appendEntry(emptyEnt) { + // This won't happen because we just called reset() above. + r.logger.Panic("empty entry was dropped") + } + // As a special case, don't count the initial empty entry towards the + // uncommitted log quota. This is because we want to preserve the + // behavior of allowing one entry larger than quota if the current + // usage is zero. + r.reduceUncommittedSize([]pb.Entry{emptyEnt}) + r.logger.Infof("%x became leader at term %d", r.id, r.Term) +} + +// campaign transitions the raft instance to candidate state. This must only be +// called after verifying that this is a legitimate transition. +func (r *raft) campaign(t CampaignType) { + if !r.promotable() { + // This path should not be hit (callers are supposed to check), but + // better safe than sorry. + r.logger.Warningf("%x is unpromotable; campaign() should have been called", r.id) + } + var term uint64 + var voteMsg pb.MessageType + if t == campaignPreElection { + r.becomePreCandidate() + voteMsg = pb.MsgPreVote + // PreVote RPCs are sent for the next term before we've incremented r.Term. + term = r.Term + 1 + } else { + r.becomeCandidate() + voteMsg = pb.MsgVote + term = r.Term + } + if _, _, res := r.poll(r.id, voteRespMsgType(voteMsg), true); res == quorum.VoteWon { + // We won the election after voting for ourselves (which must mean that + // this is a single-node cluster). Advance to the next state. + if t == campaignPreElection { + r.campaign(campaignElection) + } else { + r.becomeLeader() + } + return + } + var ids []uint64 + { + idMap := r.prs.Voters.IDs() + ids = make([]uint64, 0, len(idMap)) + for id := range idMap { + ids = append(ids, id) + } + sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] }) + } + for _, id := range ids { + if id == r.id { + continue + } + r.logger.Infof("%x [logterm: %d, index: %d] sent %s request to %x at term %d", + r.id, r.raftLog.lastTerm(), r.raftLog.lastIndex(), voteMsg, id, r.Term) + + var ctx []byte + if t == campaignTransfer { + ctx = []byte(t) + } + r.send(pb.Message{Term: term, To: id, Type: voteMsg, Index: r.raftLog.lastIndex(), LogTerm: r.raftLog.lastTerm(), Context: ctx}) + } +} + +func (r *raft) poll(id uint64, t pb.MessageType, v bool) (granted int, rejected int, result quorum.VoteResult) { + if v { + r.logger.Infof("%x received %s from %x at term %d", r.id, t, id, r.Term) + } else { + r.logger.Infof("%x received %s rejection from %x at term %d", r.id, t, id, r.Term) + } + r.prs.RecordVote(id, v) + return r.prs.TallyVotes() +} + +func (r *raft) Step(m pb.Message) error { + // Handle the message term, which may result in our stepping down to a follower. + switch { + case m.Term == 0: + // local message + case m.Term > r.Term: + if m.Type == pb.MsgVote || m.Type == pb.MsgPreVote { + force := bytes.Equal(m.Context, []byte(campaignTransfer)) + inLease := r.checkQuorum && r.lead != None && r.electionElapsed < r.electionTimeout + if !force && inLease { + // If a server receives a RequestVote request within the minimum election timeout + // of hearing from a current leader, it does not update its term or grant its vote + r.logger.Infof("%x [logterm: %d, index: %d, vote: %x] ignored %s from %x [logterm: %d, index: %d] at term %d: lease is not expired (remaining ticks: %d)", + r.id, r.raftLog.lastTerm(), r.raftLog.lastIndex(), r.Vote, m.Type, m.From, m.LogTerm, m.Index, r.Term, r.electionTimeout-r.electionElapsed) + return nil + } + } + switch { + case m.Type == pb.MsgPreVote: + // Never change our term in response to a PreVote + case m.Type == pb.MsgPreVoteResp && !m.Reject: + // We send pre-vote requests with a term in our future. If the + // pre-vote is granted, we will increment our term when we get a + // quorum. If it is not, the term comes from the node that + // rejected our vote so we should become a follower at the new + // term. + default: + r.logger.Infof("%x [term: %d] received a %s message with higher term from %x [term: %d]", + r.id, r.Term, m.Type, m.From, m.Term) + if m.Type == pb.MsgApp || m.Type == pb.MsgHeartbeat || m.Type == pb.MsgSnap { + r.becomeFollower(m.Term, m.From) + } else { + r.becomeFollower(m.Term, None) + } + } + + case m.Term < r.Term: + if (r.checkQuorum || r.preVote) && (m.Type == pb.MsgHeartbeat || m.Type == pb.MsgApp) { + // We have received messages from a leader at a lower term. It is possible + // that these messages were simply delayed in the network, but this could + // also mean that this node has advanced its term number during a network + // partition, and it is now unable to either win an election or to rejoin + // the majority on the old term. If checkQuorum is false, this will be + // handled by incrementing term numbers in response to MsgVote with a + // higher term, but if checkQuorum is true we may not advance the term on + // MsgVote and must generate other messages to advance the term. The net + // result of these two features is to minimize the disruption caused by + // nodes that have been removed from the cluster's configuration: a + // removed node will send MsgVotes (or MsgPreVotes) which will be ignored, + // but it will not receive MsgApp or MsgHeartbeat, so it will not create + // disruptive term increases, by notifying leader of this node's activeness. + // The above comments also true for Pre-Vote + // + // When follower gets isolated, it soon starts an election ending + // up with a higher term than leader, although it won't receive enough + // votes to win the election. When it regains connectivity, this response + // with "pb.MsgAppResp" of higher term would force leader to step down. + // However, this disruption is inevitable to free this stuck node with + // fresh election. This can be prevented with Pre-Vote phase. + r.send(pb.Message{To: m.From, Type: pb.MsgAppResp}) + } else if m.Type == pb.MsgPreVote { + // Before Pre-Vote enable, there may have candidate with higher term, + // but less log. After update to Pre-Vote, the cluster may deadlock if + // we drop messages with a lower term. + r.logger.Infof("%x [logterm: %d, index: %d, vote: %x] rejected %s from %x [logterm: %d, index: %d] at term %d", + r.id, r.raftLog.lastTerm(), r.raftLog.lastIndex(), r.Vote, m.Type, m.From, m.LogTerm, m.Index, r.Term) + r.send(pb.Message{To: m.From, Term: r.Term, Type: pb.MsgPreVoteResp, Reject: true}) + } else { + // ignore other cases + r.logger.Infof("%x [term: %d] ignored a %s message with lower term from %x [term: %d]", + r.id, r.Term, m.Type, m.From, m.Term) + } + return nil + } + + switch m.Type { + case pb.MsgHup: + if r.state != StateLeader { + if !r.promotable() { + r.logger.Warningf("%x is unpromotable and can not campaign; ignoring MsgHup", r.id) + return nil + } + ents, err := r.raftLog.slice(r.raftLog.applied+1, r.raftLog.committed+1, noLimit) + if err != nil { + r.logger.Panicf("unexpected error getting unapplied entries (%v)", err) + } + if n := numOfPendingConf(ents); n != 0 && r.raftLog.committed > r.raftLog.applied { + r.logger.Warningf("%x cannot campaign at term %d since there are still %d pending configuration changes to apply", r.id, r.Term, n) + return nil + } + + r.logger.Infof("%x is starting a new election at term %d", r.id, r.Term) + if r.preVote { + r.campaign(campaignPreElection) + } else { + r.campaign(campaignElection) + } + } else { + r.logger.Debugf("%x ignoring MsgHup because already leader", r.id) + } + + case pb.MsgVote, pb.MsgPreVote: + // We can vote if this is a repeat of a vote we've already cast... + canVote := r.Vote == m.From || + // ...we haven't voted and we don't think there's a leader yet in this term... + (r.Vote == None && r.lead == None) || + // ...or this is a PreVote for a future term... + (m.Type == pb.MsgPreVote && m.Term > r.Term) + // ...and we believe the candidate is up to date. + if canVote && r.raftLog.isUpToDate(m.Index, m.LogTerm) { + // Note: it turns out that that learners must be allowed to cast votes. + // This seems counter- intuitive but is necessary in the situation in which + // a learner has been promoted (i.e. is now a voter) but has not learned + // about this yet. + // For example, consider a group in which id=1 is a learner and id=2 and + // id=3 are voters. A configuration change promoting 1 can be committed on + // the quorum `{2,3}` without the config change being appended to the + // learner's log. If the leader (say 2) fails, there are de facto two + // voters remaining. Only 3 can win an election (due to its log containing + // all committed entries), but to do so it will need 1 to vote. But 1 + // considers itself a learner and will continue to do so until 3 has + // stepped up as leader, replicates the conf change to 1, and 1 applies it. + // Ultimately, by receiving a request to vote, the learner realizes that + // the candidate believes it to be a voter, and that it should act + // accordingly. The candidate's config may be stale, too; but in that case + // it won't win the election, at least in the absence of the bug discussed + // in: + // https://github.com/etcd-io/etcd/issues/7625#issuecomment-488798263. + r.logger.Infof("%x [logterm: %d, index: %d, vote: %x] cast %s for %x [logterm: %d, index: %d] at term %d", + r.id, r.raftLog.lastTerm(), r.raftLog.lastIndex(), r.Vote, m.Type, m.From, m.LogTerm, m.Index, r.Term) + // When responding to Msg{Pre,}Vote messages we include the term + // from the message, not the local term. To see why, consider the + // case where a single node was previously partitioned away and + // it's local term is now out of date. If we include the local term + // (recall that for pre-votes we don't update the local term), the + // (pre-)campaigning node on the other end will proceed to ignore + // the message (it ignores all out of date messages). + // The term in the original message and current local term are the + // same in the case of regular votes, but different for pre-votes. + r.send(pb.Message{To: m.From, Term: m.Term, Type: voteRespMsgType(m.Type)}) + if m.Type == pb.MsgVote { + // Only record real votes. + r.electionElapsed = 0 + r.Vote = m.From + } + } else { + r.logger.Infof("%x [logterm: %d, index: %d, vote: %x] rejected %s from %x [logterm: %d, index: %d] at term %d", + r.id, r.raftLog.lastTerm(), r.raftLog.lastIndex(), r.Vote, m.Type, m.From, m.LogTerm, m.Index, r.Term) + r.send(pb.Message{To: m.From, Term: r.Term, Type: voteRespMsgType(m.Type), Reject: true}) + } + + default: + err := r.step(r, m) + if err != nil { + return err + } + } + return nil +} + +type stepFunc func(r *raft, m pb.Message) error + +func stepLeader(r *raft, m pb.Message) error { + // These message types do not require any progress for m.From. + switch m.Type { + case pb.MsgBeat: + r.bcastHeartbeat() + return nil + case pb.MsgCheckQuorum: + // The leader should always see itself as active. As a precaution, handle + // the case in which the leader isn't in the configuration any more (for + // example if it just removed itself). + // + // TODO(tbg): I added a TODO in removeNode, it doesn't seem that the + // leader steps down when removing itself. I might be missing something. + if pr := r.prs.Progress[r.id]; pr != nil { + pr.RecentActive = true + } + if !r.prs.QuorumActive() { + r.logger.Warningf("%x stepped down to follower since quorum is not active", r.id) + r.becomeFollower(r.Term, None) + } + // Mark everyone (but ourselves) as inactive in preparation for the next + // CheckQuorum. + r.prs.Visit(func(id uint64, pr *tracker.Progress) { + if id != r.id { + pr.RecentActive = false + } + }) + return nil + case pb.MsgProp: + if len(m.Entries) == 0 { + r.logger.Panicf("%x stepped empty MsgProp", r.id) + } + if r.prs.Progress[r.id] == nil { + // If we are not currently a member of the range (i.e. this node + // was removed from the configuration while serving as leader), + // drop any new proposals. + return ErrProposalDropped + } + if r.leadTransferee != None { + r.logger.Debugf("%x [term %d] transfer leadership to %x is in progress; dropping proposal", r.id, r.Term, r.leadTransferee) + return ErrProposalDropped + } + + for i := range m.Entries { + e := &m.Entries[i] + var cc pb.ConfChangeI + if e.Type == pb.EntryConfChange { + var ccc pb.ConfChange + if err := ccc.Unmarshal(e.Data); err != nil { + panic(err) + } + cc = ccc + } else if e.Type == pb.EntryConfChangeV2 { + var ccc pb.ConfChangeV2 + if err := ccc.Unmarshal(e.Data); err != nil { + panic(err) + } + cc = ccc + } + if cc != nil { + alreadyPending := r.pendingConfIndex > r.raftLog.applied + alreadyJoint := len(r.prs.Config.Voters[1]) > 0 + wantsLeaveJoint := len(cc.AsV2().Changes) == 0 + + var refused string + if alreadyPending { + refused = fmt.Sprintf("possible unapplied conf change at index %d (applied to %d)", r.pendingConfIndex, r.raftLog.applied) + } else if alreadyJoint && !wantsLeaveJoint { + refused = "must transition out of joint config first" + } else if !alreadyJoint && wantsLeaveJoint { + refused = "not in joint state; refusing empty conf change" + } + + if refused != "" { + r.logger.Infof("%x ignoring conf change %v at config %s: %s", r.id, cc, r.prs.Config, refused) + m.Entries[i] = pb.Entry{Type: pb.EntryNormal} + } else { + r.pendingConfIndex = r.raftLog.lastIndex() + uint64(i) + 1 + } + } + } + + if !r.appendEntry(m.Entries...) { + return ErrProposalDropped + } + r.bcastAppend() + return nil + case pb.MsgReadIndex: + // If more than the local vote is needed, go through a full broadcast, + // otherwise optimize. + if !r.prs.IsSingleton() { + if r.raftLog.zeroTermOnErrCompacted(r.raftLog.term(r.raftLog.committed)) != r.Term { + // Reject read only request when this leader has not committed any log entry at its term. + return nil + } + + // thinking: use an interally defined context instead of the user given context. + // We can express this in terms of the term and index instead of a user-supplied value. + // This would allow multiple reads to piggyback on the same message. + switch r.readOnly.option { + case ReadOnlySafe: + r.readOnly.addRequest(r.raftLog.committed, m) + // The local node automatically acks the request. + r.readOnly.recvAck(r.id, m.Entries[0].Data) + r.bcastHeartbeatWithCtx(m.Entries[0].Data) + case ReadOnlyLeaseBased: + ri := r.raftLog.committed + if m.From == None || m.From == r.id { // from local member + r.readStates = append(r.readStates, ReadState{Index: ri, RequestCtx: m.Entries[0].Data}) + } else { + r.send(pb.Message{To: m.From, Type: pb.MsgReadIndexResp, Index: ri, Entries: m.Entries}) + } + } + } else { // only one voting member (the leader) in the cluster + if m.From == None || m.From == r.id { // from leader itself + r.readStates = append(r.readStates, ReadState{Index: r.raftLog.committed, RequestCtx: m.Entries[0].Data}) + } else { // from learner member + r.send(pb.Message{To: m.From, Type: pb.MsgReadIndexResp, Index: r.raftLog.committed, Entries: m.Entries}) + } + } + + return nil + } + + // All other message types require a progress for m.From (pr). + pr := r.prs.Progress[m.From] + if pr == nil { + r.logger.Debugf("%x no progress available for %x", r.id, m.From) + return nil + } + switch m.Type { + case pb.MsgAppResp: + pr.RecentActive = true + + if m.Reject { + r.logger.Debugf("%x received MsgAppResp(MsgApp was rejected, lastindex: %d) from %x for index %d", + r.id, m.RejectHint, m.From, m.Index) + if pr.MaybeDecrTo(m.Index, m.RejectHint) { + r.logger.Debugf("%x decreased progress of %x to [%s]", r.id, m.From, pr) + if pr.State == tracker.StateReplicate { + pr.BecomeProbe() + } + r.sendAppend(m.From) + } + } else { + oldPaused := pr.IsPaused() + if pr.MaybeUpdate(m.Index) { + switch { + case pr.State == tracker.StateProbe: + pr.BecomeReplicate() + case pr.State == tracker.StateSnapshot && pr.Match >= pr.PendingSnapshot: + // TODO(tbg): we should also enter this branch if a snapshot is + // received that is below pr.PendingSnapshot but which makes it + // possible to use the log again. + r.logger.Debugf("%x recovered from needing snapshot, resumed sending replication messages to %x [%s]", r.id, m.From, pr) + // Transition back to replicating state via probing state + // (which takes the snapshot into account). If we didn't + // move to replicating state, that would only happen with + // the next round of appends (but there may not be a next + // round for a while, exposing an inconsistent RaftStatus). + pr.BecomeProbe() + pr.BecomeReplicate() + case pr.State == tracker.StateReplicate: + pr.Inflights.FreeLE(m.Index) + } + + if r.maybeCommit() { + r.bcastAppend() + } else if oldPaused { + // If we were paused before, this node may be missing the + // latest commit index, so send it. + r.sendAppend(m.From) + } + // We've updated flow control information above, which may + // allow us to send multiple (size-limited) in-flight messages + // at once (such as when transitioning from probe to + // replicate, or when freeTo() covers multiple messages). If + // we have more entries to send, send as many messages as we + // can (without sending empty messages for the commit index) + for r.maybeSendAppend(m.From, false) { + } + // Transfer leadership is in progress. + if m.From == r.leadTransferee && pr.Match == r.raftLog.lastIndex() { + r.logger.Infof("%x sent MsgTimeoutNow to %x after received MsgAppResp", r.id, m.From) + r.sendTimeoutNow(m.From) + } + } + } + case pb.MsgHeartbeatResp: + pr.RecentActive = true + pr.ProbeSent = false + + // free one slot for the full inflights window to allow progress. + if pr.State == tracker.StateReplicate && pr.Inflights.Full() { + pr.Inflights.FreeFirstOne() + } + if pr.Match < r.raftLog.lastIndex() { + r.sendAppend(m.From) + } + + if r.readOnly.option != ReadOnlySafe || len(m.Context) == 0 { + return nil + } + + if r.prs.Voters.VoteResult(r.readOnly.recvAck(m.From, m.Context)) != quorum.VoteWon { + return nil + } + + rss := r.readOnly.advance(m) + for _, rs := range rss { + req := rs.req + if req.From == None || req.From == r.id { // from local member + r.readStates = append(r.readStates, ReadState{Index: rs.index, RequestCtx: req.Entries[0].Data}) + } else { + r.send(pb.Message{To: req.From, Type: pb.MsgReadIndexResp, Index: rs.index, Entries: req.Entries}) + } + } + case pb.MsgSnapStatus: + if pr.State != tracker.StateSnapshot { + return nil + } + // TODO(tbg): this code is very similar to the snapshot handling in + // MsgAppResp above. In fact, the code there is more correct than the + // code here and should likely be updated to match (or even better, the + // logic pulled into a newly created Progress state machine handler). + if !m.Reject { + pr.BecomeProbe() + r.logger.Debugf("%x snapshot succeeded, resumed sending replication messages to %x [%s]", r.id, m.From, pr) + } else { + // NB: the order here matters or we'll be probing erroneously from + // the snapshot index, but the snapshot never applied. + pr.PendingSnapshot = 0 + pr.BecomeProbe() + r.logger.Debugf("%x snapshot failed, resumed sending replication messages to %x [%s]", r.id, m.From, pr) + } + // If snapshot finish, wait for the MsgAppResp from the remote node before sending + // out the next MsgApp. + // If snapshot failure, wait for a heartbeat interval before next try + pr.ProbeSent = true + case pb.MsgUnreachable: + // During optimistic replication, if the remote becomes unreachable, + // there is huge probability that a MsgApp is lost. + if pr.State == tracker.StateReplicate { + pr.BecomeProbe() + } + r.logger.Debugf("%x failed to send message to %x because it is unreachable [%s]", r.id, m.From, pr) + case pb.MsgTransferLeader: + if pr.IsLearner { + r.logger.Debugf("%x is learner. Ignored transferring leadership", r.id) + return nil + } + leadTransferee := m.From + lastLeadTransferee := r.leadTransferee + if lastLeadTransferee != None { + if lastLeadTransferee == leadTransferee { + r.logger.Infof("%x [term %d] transfer leadership to %x is in progress, ignores request to same node %x", + r.id, r.Term, leadTransferee, leadTransferee) + return nil + } + r.abortLeaderTransfer() + r.logger.Infof("%x [term %d] abort previous transferring leadership to %x", r.id, r.Term, lastLeadTransferee) + } + if leadTransferee == r.id { + r.logger.Debugf("%x is already leader. Ignored transferring leadership to self", r.id) + return nil + } + // Transfer leadership to third party. + r.logger.Infof("%x [term %d] starts to transfer leadership to %x", r.id, r.Term, leadTransferee) + // Transfer leadership should be finished in one electionTimeout, so reset r.electionElapsed. + r.electionElapsed = 0 + r.leadTransferee = leadTransferee + if pr.Match == r.raftLog.lastIndex() { + r.sendTimeoutNow(leadTransferee) + r.logger.Infof("%x sends MsgTimeoutNow to %x immediately as %x already has up-to-date log", r.id, leadTransferee, leadTransferee) + } else { + r.sendAppend(leadTransferee) + } + } + return nil +} + +// stepCandidate is shared by StateCandidate and StatePreCandidate; the difference is +// whether they respond to MsgVoteResp or MsgPreVoteResp. +func stepCandidate(r *raft, m pb.Message) error { + // Only handle vote responses corresponding to our candidacy (while in + // StateCandidate, we may get stale MsgPreVoteResp messages in this term from + // our pre-candidate state). + var myVoteRespType pb.MessageType + if r.state == StatePreCandidate { + myVoteRespType = pb.MsgPreVoteResp + } else { + myVoteRespType = pb.MsgVoteResp + } + switch m.Type { + case pb.MsgProp: + r.logger.Infof("%x no leader at term %d; dropping proposal", r.id, r.Term) + return ErrProposalDropped + case pb.MsgApp: + r.becomeFollower(m.Term, m.From) // always m.Term == r.Term + r.handleAppendEntries(m) + case pb.MsgHeartbeat: + r.becomeFollower(m.Term, m.From) // always m.Term == r.Term + r.handleHeartbeat(m) + case pb.MsgSnap: + r.becomeFollower(m.Term, m.From) // always m.Term == r.Term + r.handleSnapshot(m) + case myVoteRespType: + gr, rj, res := r.poll(m.From, m.Type, !m.Reject) + r.logger.Infof("%x has received %d %s votes and %d vote rejections", r.id, gr, m.Type, rj) + switch res { + case quorum.VoteWon: + if r.state == StatePreCandidate { + r.campaign(campaignElection) + } else { + r.becomeLeader() + r.bcastAppend() + } + case quorum.VoteLost: + // pb.MsgPreVoteResp contains future term of pre-candidate + // m.Term > r.Term; reuse r.Term + r.becomeFollower(r.Term, None) + } + case pb.MsgTimeoutNow: + r.logger.Debugf("%x [term %d state %v] ignored MsgTimeoutNow from %x", r.id, r.Term, r.state, m.From) + } + return nil +} + +func stepFollower(r *raft, m pb.Message) error { + switch m.Type { + case pb.MsgProp: + if r.lead == None { + r.logger.Infof("%x no leader at term %d; dropping proposal", r.id, r.Term) + return ErrProposalDropped + } else if r.disableProposalForwarding { + r.logger.Infof("%x not forwarding to leader %x at term %d; dropping proposal", r.id, r.lead, r.Term) + return ErrProposalDropped + } + m.To = r.lead + r.send(m) + case pb.MsgApp: + r.electionElapsed = 0 + r.lead = m.From + r.handleAppendEntries(m) + case pb.MsgHeartbeat: + r.electionElapsed = 0 + r.lead = m.From + r.handleHeartbeat(m) + case pb.MsgSnap: + r.electionElapsed = 0 + r.lead = m.From + r.handleSnapshot(m) + case pb.MsgTransferLeader: + if r.lead == None { + r.logger.Infof("%x no leader at term %d; dropping leader transfer msg", r.id, r.Term) + return nil + } + m.To = r.lead + r.send(m) + case pb.MsgTimeoutNow: + if r.promotable() { + r.logger.Infof("%x [term %d] received MsgTimeoutNow from %x and starts an election to get leadership.", r.id, r.Term, m.From) + // Leadership transfers never use pre-vote even if r.preVote is true; we + // know we are not recovering from a partition so there is no need for the + // extra round trip. + r.campaign(campaignTransfer) + } else { + r.logger.Infof("%x received MsgTimeoutNow from %x but is not promotable", r.id, m.From) + } + case pb.MsgReadIndex: + if r.lead == None { + r.logger.Infof("%x no leader at term %d; dropping index reading msg", r.id, r.Term) + return nil + } + m.To = r.lead + r.send(m) + case pb.MsgReadIndexResp: + if len(m.Entries) != 1 { + r.logger.Errorf("%x invalid format of MsgReadIndexResp from %x, entries count: %d", r.id, m.From, len(m.Entries)) + return nil + } + r.readStates = append(r.readStates, ReadState{Index: m.Index, RequestCtx: m.Entries[0].Data}) + } + return nil +} + +func (r *raft) handleAppendEntries(m pb.Message) { + if m.Index < r.raftLog.committed { + r.send(pb.Message{To: m.From, Type: pb.MsgAppResp, Index: r.raftLog.committed}) + return + } + + if mlastIndex, ok := r.raftLog.maybeAppend(m.Index, m.LogTerm, m.Commit, m.Entries...); ok { + r.send(pb.Message{To: m.From, Type: pb.MsgAppResp, Index: mlastIndex}) + } else { + r.logger.Debugf("%x [logterm: %d, index: %d] rejected MsgApp [logterm: %d, index: %d] from %x", + r.id, r.raftLog.zeroTermOnErrCompacted(r.raftLog.term(m.Index)), m.Index, m.LogTerm, m.Index, m.From) + r.send(pb.Message{To: m.From, Type: pb.MsgAppResp, Index: m.Index, Reject: true, RejectHint: r.raftLog.lastIndex()}) + } +} + +func (r *raft) handleHeartbeat(m pb.Message) { + r.raftLog.commitTo(m.Commit) + r.send(pb.Message{To: m.From, Type: pb.MsgHeartbeatResp, Context: m.Context}) +} + +func (r *raft) handleSnapshot(m pb.Message) { + sindex, sterm := m.Snapshot.Metadata.Index, m.Snapshot.Metadata.Term + if r.restore(m.Snapshot) { + r.logger.Infof("%x [commit: %d] restored snapshot [index: %d, term: %d]", + r.id, r.raftLog.committed, sindex, sterm) + r.send(pb.Message{To: m.From, Type: pb.MsgAppResp, Index: r.raftLog.lastIndex()}) + } else { + r.logger.Infof("%x [commit: %d] ignored snapshot [index: %d, term: %d]", + r.id, r.raftLog.committed, sindex, sterm) + r.send(pb.Message{To: m.From, Type: pb.MsgAppResp, Index: r.raftLog.committed}) + } +} + +// restore recovers the state machine from a snapshot. It restores the log and the +// configuration of state machine. If this method returns false, the snapshot was +// ignored, either because it was obsolete or because of an error. +func (r *raft) restore(s pb.Snapshot) bool { + if s.Metadata.Index <= r.raftLog.committed { + return false + } + if r.state != StateFollower { + // This is defense-in-depth: if the leader somehow ended up applying a + // snapshot, it could move into a new term without moving into a + // follower state. This should never fire, but if it did, we'd have + // prevented damage by returning early, so log only a loud warning. + // + // At the time of writing, the instance is guaranteed to be in follower + // state when this method is called. + r.logger.Warningf("%x attempted to restore snapshot as leader; should never happen", r.id) + r.becomeFollower(r.Term+1, None) + return false + } + + // More defense-in-depth: throw away snapshot if recipient is not in the + // config. This shouuldn't ever happen (at the time of writing) but lots of + // code here and there assumes that r.id is in the progress tracker. + found := false + cs := s.Metadata.ConfState + for _, set := range [][]uint64{ + cs.Voters, + cs.Learners, + } { + for _, id := range set { + if id == r.id { + found = true + break + } + } + } + if !found { + r.logger.Warningf( + "%x attempted to restore snapshot but it is not in the ConfState %v; should never happen", + r.id, cs, + ) + return false + } + + // Now go ahead and actually restore. + + if r.raftLog.matchTerm(s.Metadata.Index, s.Metadata.Term) { + r.logger.Infof("%x [commit: %d, lastindex: %d, lastterm: %d] fast-forwarded commit to snapshot [index: %d, term: %d]", + r.id, r.raftLog.committed, r.raftLog.lastIndex(), r.raftLog.lastTerm(), s.Metadata.Index, s.Metadata.Term) + r.raftLog.commitTo(s.Metadata.Index) + return false + } + + r.raftLog.restore(s) + + // Reset the configuration and add the (potentially updated) peers in anew. + r.prs = tracker.MakeProgressTracker(r.prs.MaxInflight) + cfg, prs, err := confchange.Restore(confchange.Changer{ + Tracker: r.prs, + LastIndex: r.raftLog.lastIndex(), + }, cs) + + if err != nil { + // This should never happen. Either there's a bug in our config change + // handling or the client corrupted the conf change. + panic(fmt.Sprintf("unable to restore config %+v: %s", cs, err)) + } + + assertConfStatesEquivalent(r.logger, cs, r.switchToConfig(cfg, prs)) + + pr := r.prs.Progress[r.id] + pr.MaybeUpdate(pr.Next - 1) // TODO(tbg): this is untested and likely unneeded + + r.logger.Infof("%x [commit: %d, lastindex: %d, lastterm: %d] restored snapshot [index: %d, term: %d]", + r.id, r.raftLog.committed, r.raftLog.lastIndex(), r.raftLog.lastTerm(), s.Metadata.Index, s.Metadata.Term) + return true +} + +// promotable indicates whether state machine can be promoted to leader, +// which is true when its own id is in progress list. +func (r *raft) promotable() bool { + pr := r.prs.Progress[r.id] + return pr != nil && !pr.IsLearner +} + +func (r *raft) applyConfChange(cc pb.ConfChangeV2) pb.ConfState { + cfg, prs, err := func() (tracker.Config, tracker.ProgressMap, error) { + changer := confchange.Changer{ + Tracker: r.prs, + LastIndex: r.raftLog.lastIndex(), + } + if cc.LeaveJoint() { + return changer.LeaveJoint() + } else if autoLeave, ok := cc.EnterJoint(); ok { + return changer.EnterJoint(autoLeave, cc.Changes...) + } + return changer.Simple(cc.Changes...) + }() + + if err != nil { + // TODO(tbg): return the error to the caller. + panic(err) + } + + return r.switchToConfig(cfg, prs) +} + +// switchToConfig reconfigures this node to use the provided configuration. It +// updates the in-memory state and, when necessary, carries out additional +// actions such as reacting to the removal of nodes or changed quorum +// requirements. +// +// The inputs usually result from restoring a ConfState or applying a ConfChange. +func (r *raft) switchToConfig(cfg tracker.Config, prs tracker.ProgressMap) pb.ConfState { + r.prs.Config = cfg + r.prs.Progress = prs + + r.logger.Infof("%x switched to configuration %s", r.id, r.prs.Config) + cs := r.prs.ConfState() + pr, ok := r.prs.Progress[r.id] + + // Update whether the node itself is a learner, resetting to false when the + // node is removed. + r.isLearner = ok && pr.IsLearner + + if (!ok || r.isLearner) && r.state == StateLeader { + // This node is leader and was removed or demoted. We prevent demotions + // at the time writing but hypothetically we handle them the same way as + // removing the leader: stepping down into the next Term. + // + // TODO(tbg): step down (for sanity) and ask follower with largest Match + // to TimeoutNow (to avoid interruption). This might still drop some + // proposals but it's better than nothing. + // + // TODO(tbg): test this branch. It is untested at the time of writing. + return cs + } + + // The remaining steps only make sense if this node is the leader and there + // are other nodes. + if r.state != StateLeader || len(cs.Voters) == 0 { + return cs + } + + if r.maybeCommit() { + // If the configuration change means that more entries are committed now, + // broadcast/append to everyone in the updated config. + r.bcastAppend() + } else { + // Otherwise, still probe the newly added replicas; there's no reason to + // let them wait out a heartbeat interval (or the next incoming + // proposal). + r.prs.Visit(func(id uint64, pr *tracker.Progress) { + r.maybeSendAppend(id, false /* sendIfEmpty */) + }) + } + // If the the leadTransferee was removed, abort the leadership transfer. + if _, tOK := r.prs.Progress[r.leadTransferee]; !tOK && r.leadTransferee != 0 { + r.abortLeaderTransfer() + } + + return cs +} + +func (r *raft) loadState(state pb.HardState) { + if state.Commit < r.raftLog.committed || state.Commit > r.raftLog.lastIndex() { + r.logger.Panicf("%x state.commit %d is out of range [%d, %d]", r.id, state.Commit, r.raftLog.committed, r.raftLog.lastIndex()) + } + r.raftLog.committed = state.Commit + r.Term = state.Term + r.Vote = state.Vote +} + +// pastElectionTimeout returns true iff r.electionElapsed is greater +// than or equal to the randomized election timeout in +// [electiontimeout, 2 * electiontimeout - 1]. +func (r *raft) pastElectionTimeout() bool { + return r.electionElapsed >= r.randomizedElectionTimeout +} + +func (r *raft) resetRandomizedElectionTimeout() { + r.randomizedElectionTimeout = r.electionTimeout + globalRand.Intn(r.electionTimeout) +} + +func (r *raft) sendTimeoutNow(to uint64) { + r.send(pb.Message{To: to, Type: pb.MsgTimeoutNow}) +} + +func (r *raft) abortLeaderTransfer() { + r.leadTransferee = None +} + +// increaseUncommittedSize computes the size of the proposed entries and +// determines whether they would push leader over its maxUncommittedSize limit. +// If the new entries would exceed the limit, the method returns false. If not, +// the increase in uncommitted entry size is recorded and the method returns +// true. +func (r *raft) increaseUncommittedSize(ents []pb.Entry) bool { + var s uint64 + for _, e := range ents { + s += uint64(PayloadSize(e)) + } + + if r.uncommittedSize > 0 && r.uncommittedSize+s > r.maxUncommittedSize { + // If the uncommitted tail of the Raft log is empty, allow any size + // proposal. Otherwise, limit the size of the uncommitted tail of the + // log and drop any proposal that would push the size over the limit. + return false + } + r.uncommittedSize += s + return true +} + +// reduceUncommittedSize accounts for the newly committed entries by decreasing +// the uncommitted entry size limit. +func (r *raft) reduceUncommittedSize(ents []pb.Entry) { + if r.uncommittedSize == 0 { + // Fast-path for followers, who do not track or enforce the limit. + return + } + + var s uint64 + for _, e := range ents { + s += uint64(PayloadSize(e)) + } + if s > r.uncommittedSize { + // uncommittedSize may underestimate the size of the uncommitted Raft + // log tail but will never overestimate it. Saturate at 0 instead of + // allowing overflow. + r.uncommittedSize = 0 + } else { + r.uncommittedSize -= s + } +} + +func numOfPendingConf(ents []pb.Entry) int { + n := 0 + for i := range ents { + if ents[i].Type == pb.EntryConfChange { + n++ + } + } + return n +} diff --git a/vendor/go.etcd.io/etcd/raft/raftpb/confchange.go b/vendor/go.etcd.io/etcd/raft/raftpb/confchange.go new file mode 100644 index 00000000..46a7a702 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/raftpb/confchange.go @@ -0,0 +1,170 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raftpb + +import ( + "fmt" + "strconv" + "strings" + + "github.com/gogo/protobuf/proto" +) + +// ConfChangeI abstracts over ConfChangeV2 and (legacy) ConfChange to allow +// treating them in a unified manner. +type ConfChangeI interface { + AsV2() ConfChangeV2 + AsV1() (ConfChange, bool) +} + +// MarshalConfChange calls Marshal on the underlying ConfChange or ConfChangeV2 +// and returns the result along with the corresponding EntryType. +func MarshalConfChange(c ConfChangeI) (EntryType, []byte, error) { + var typ EntryType + var ccdata []byte + var err error + if ccv1, ok := c.AsV1(); ok { + typ = EntryConfChange + ccdata, err = ccv1.Marshal() + } else { + ccv2 := c.AsV2() + typ = EntryConfChangeV2 + ccdata, err = ccv2.Marshal() + } + return typ, ccdata, err +} + +// AsV2 returns a V2 configuration change carrying out the same operation. +func (c ConfChange) AsV2() ConfChangeV2 { + return ConfChangeV2{ + Changes: []ConfChangeSingle{{ + Type: c.Type, + NodeID: c.NodeID, + }}, + Context: c.Context, + } +} + +// AsV1 returns the ConfChange and true. +func (c ConfChange) AsV1() (ConfChange, bool) { + return c, true +} + +// AsV2 is the identity. +func (c ConfChangeV2) AsV2() ConfChangeV2 { return c } + +// AsV1 returns ConfChange{} and false. +func (c ConfChangeV2) AsV1() (ConfChange, bool) { return ConfChange{}, false } + +// EnterJoint returns two bools. The second bool is true if and only if this +// config change will use Joint Consensus, which is the case if it contains more +// than one change or if the use of Joint Consensus was requested explicitly. +// The first bool can only be true if second one is, and indicates whether the +// Joint State will be left automatically. +func (c *ConfChangeV2) EnterJoint() (autoLeave bool, ok bool) { + // NB: in theory, more config changes could qualify for the "simple" + // protocol but it depends on the config on top of which the changes apply. + // For example, adding two learners is not OK if both nodes are part of the + // base config (i.e. two voters are turned into learners in the process of + // applying the conf change). In practice, these distinctions should not + // matter, so we keep it simple and use Joint Consensus liberally. + if c.Transition != ConfChangeTransitionAuto || len(c.Changes) > 1 { + // Use Joint Consensus. + var autoLeave bool + switch c.Transition { + case ConfChangeTransitionAuto: + autoLeave = true + case ConfChangeTransitionJointImplicit: + autoLeave = true + case ConfChangeTransitionJointExplicit: + default: + panic(fmt.Sprintf("unknown transition: %+v", c)) + } + return autoLeave, true + } + return false, false +} + +// LeaveJoint is true if the configuration change leaves a joint configuration. +// This is the case if the ConfChangeV2 is zero, with the possible exception of +// the Context field. +func (c *ConfChangeV2) LeaveJoint() bool { + cpy := *c + cpy.Context = nil + return proto.Equal(&cpy, &ConfChangeV2{}) +} + +// ConfChangesFromString parses a Space-delimited sequence of operations into a +// slice of ConfChangeSingle. The supported operations are: +// - vn: make n a voter, +// - ln: make n a learner, +// - rn: remove n, and +// - un: update n. +func ConfChangesFromString(s string) ([]ConfChangeSingle, error) { + var ccs []ConfChangeSingle + toks := strings.Split(strings.TrimSpace(s), " ") + if toks[0] == "" { + toks = nil + } + for _, tok := range toks { + if len(tok) < 2 { + return nil, fmt.Errorf("unknown token %s", tok) + } + var cc ConfChangeSingle + switch tok[0] { + case 'v': + cc.Type = ConfChangeAddNode + case 'l': + cc.Type = ConfChangeAddLearnerNode + case 'r': + cc.Type = ConfChangeRemoveNode + case 'u': + cc.Type = ConfChangeUpdateNode + default: + return nil, fmt.Errorf("unknown input: %s", tok) + } + id, err := strconv.ParseUint(tok[1:], 10, 64) + if err != nil { + return nil, err + } + cc.NodeID = id + ccs = append(ccs, cc) + } + return ccs, nil +} + +// ConfChangesToString is the inverse to ConfChangesFromString. +func ConfChangesToString(ccs []ConfChangeSingle) string { + var buf strings.Builder + for i, cc := range ccs { + if i > 0 { + buf.WriteByte(' ') + } + switch cc.Type { + case ConfChangeAddNode: + buf.WriteByte('v') + case ConfChangeAddLearnerNode: + buf.WriteByte('l') + case ConfChangeRemoveNode: + buf.WriteByte('r') + case ConfChangeUpdateNode: + buf.WriteByte('u') + default: + buf.WriteString("unknown") + } + fmt.Fprintf(&buf, "%d", cc.NodeID) + } + return buf.String() +} diff --git a/vendor/go.etcd.io/etcd/raft/raftpb/confstate.go b/vendor/go.etcd.io/etcd/raft/raftpb/confstate.go new file mode 100644 index 00000000..4bda9321 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/raftpb/confstate.go @@ -0,0 +1,45 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raftpb + +import ( + "fmt" + "reflect" + "sort" +) + +// Equivalent returns a nil error if the inputs describe the same configuration. +// On mismatch, returns a descriptive error showing the differences. +func (cs ConfState) Equivalent(cs2 ConfState) error { + cs1 := cs + orig1, orig2 := cs1, cs2 + s := func(sl *[]uint64) { + *sl = append([]uint64(nil), *sl...) + sort.Slice(*sl, func(i, j int) bool { return (*sl)[i] < (*sl)[j] }) + } + + for _, cs := range []*ConfState{&cs1, &cs2} { + s(&cs.Voters) + s(&cs.Learners) + s(&cs.VotersOutgoing) + s(&cs.LearnersNext) + cs.XXX_unrecognized = nil + } + + if !reflect.DeepEqual(cs1, cs2) { + return fmt.Errorf("ConfStates not equivalent after sorting:\n%+#v\n%+#v\nInputs were:\n%+#v\n%+#v", cs1, cs2, orig1, orig2) + } + return nil +} diff --git a/vendor/go.etcd.io/etcd/raft/raftpb/raft.pb.go b/vendor/go.etcd.io/etcd/raft/raftpb/raft.pb.go new file mode 100644 index 00000000..fcf259c8 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/raftpb/raft.pb.go @@ -0,0 +1,2646 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: raft.proto + +/* + Package raftpb is a generated protocol buffer package. + + It is generated from these files: + raft.proto + + It has these top-level messages: + Entry + SnapshotMetadata + Snapshot + Message + HardState + ConfState + ConfChange + ConfChangeSingle + ConfChangeV2 +*/ +package raftpb + +import ( + "fmt" + + proto "github.com/golang/protobuf/proto" + + math "math" + + _ "github.com/gogo/protobuf/gogoproto" + + io "io" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type EntryType int32 + +const ( + EntryNormal EntryType = 0 + EntryConfChange EntryType = 1 + EntryConfChangeV2 EntryType = 2 +) + +var EntryType_name = map[int32]string{ + 0: "EntryNormal", + 1: "EntryConfChange", + 2: "EntryConfChangeV2", +} +var EntryType_value = map[string]int32{ + "EntryNormal": 0, + "EntryConfChange": 1, + "EntryConfChangeV2": 2, +} + +func (x EntryType) Enum() *EntryType { + p := new(EntryType) + *p = x + return p +} +func (x EntryType) String() string { + return proto.EnumName(EntryType_name, int32(x)) +} +func (x *EntryType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(EntryType_value, data, "EntryType") + if err != nil { + return err + } + *x = EntryType(value) + return nil +} +func (EntryType) EnumDescriptor() ([]byte, []int) { return fileDescriptorRaft, []int{0} } + +type MessageType int32 + +const ( + MsgHup MessageType = 0 + MsgBeat MessageType = 1 + MsgProp MessageType = 2 + MsgApp MessageType = 3 + MsgAppResp MessageType = 4 + MsgVote MessageType = 5 + MsgVoteResp MessageType = 6 + MsgSnap MessageType = 7 + MsgHeartbeat MessageType = 8 + MsgHeartbeatResp MessageType = 9 + MsgUnreachable MessageType = 10 + MsgSnapStatus MessageType = 11 + MsgCheckQuorum MessageType = 12 + MsgTransferLeader MessageType = 13 + MsgTimeoutNow MessageType = 14 + MsgReadIndex MessageType = 15 + MsgReadIndexResp MessageType = 16 + MsgPreVote MessageType = 17 + MsgPreVoteResp MessageType = 18 +) + +var MessageType_name = map[int32]string{ + 0: "MsgHup", + 1: "MsgBeat", + 2: "MsgProp", + 3: "MsgApp", + 4: "MsgAppResp", + 5: "MsgVote", + 6: "MsgVoteResp", + 7: "MsgSnap", + 8: "MsgHeartbeat", + 9: "MsgHeartbeatResp", + 10: "MsgUnreachable", + 11: "MsgSnapStatus", + 12: "MsgCheckQuorum", + 13: "MsgTransferLeader", + 14: "MsgTimeoutNow", + 15: "MsgReadIndex", + 16: "MsgReadIndexResp", + 17: "MsgPreVote", + 18: "MsgPreVoteResp", +} +var MessageType_value = map[string]int32{ + "MsgHup": 0, + "MsgBeat": 1, + "MsgProp": 2, + "MsgApp": 3, + "MsgAppResp": 4, + "MsgVote": 5, + "MsgVoteResp": 6, + "MsgSnap": 7, + "MsgHeartbeat": 8, + "MsgHeartbeatResp": 9, + "MsgUnreachable": 10, + "MsgSnapStatus": 11, + "MsgCheckQuorum": 12, + "MsgTransferLeader": 13, + "MsgTimeoutNow": 14, + "MsgReadIndex": 15, + "MsgReadIndexResp": 16, + "MsgPreVote": 17, + "MsgPreVoteResp": 18, +} + +func (x MessageType) Enum() *MessageType { + p := new(MessageType) + *p = x + return p +} +func (x MessageType) String() string { + return proto.EnumName(MessageType_name, int32(x)) +} +func (x *MessageType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MessageType_value, data, "MessageType") + if err != nil { + return err + } + *x = MessageType(value) + return nil +} +func (MessageType) EnumDescriptor() ([]byte, []int) { return fileDescriptorRaft, []int{1} } + +// ConfChangeTransition specifies the behavior of a configuration change with +// respect to joint consensus. +type ConfChangeTransition int32 + +const ( + // Automatically use the simple protocol if possible, otherwise fall back + // to ConfChangeJointImplicit. Most applications will want to use this. + ConfChangeTransitionAuto ConfChangeTransition = 0 + // Use joint consensus unconditionally, and transition out of them + // automatically (by proposing a zero configuration change). + // + // This option is suitable for applications that want to minimize the time + // spent in the joint configuration and do not store the joint configuration + // in the state machine (outside of InitialState). + ConfChangeTransitionJointImplicit ConfChangeTransition = 1 + // Use joint consensus and remain in the joint configuration until the + // application proposes a no-op configuration change. This is suitable for + // applications that want to explicitly control the transitions, for example + // to use a custom payload (via the Context field). + ConfChangeTransitionJointExplicit ConfChangeTransition = 2 +) + +var ConfChangeTransition_name = map[int32]string{ + 0: "ConfChangeTransitionAuto", + 1: "ConfChangeTransitionJointImplicit", + 2: "ConfChangeTransitionJointExplicit", +} +var ConfChangeTransition_value = map[string]int32{ + "ConfChangeTransitionAuto": 0, + "ConfChangeTransitionJointImplicit": 1, + "ConfChangeTransitionJointExplicit": 2, +} + +func (x ConfChangeTransition) Enum() *ConfChangeTransition { + p := new(ConfChangeTransition) + *p = x + return p +} +func (x ConfChangeTransition) String() string { + return proto.EnumName(ConfChangeTransition_name, int32(x)) +} +func (x *ConfChangeTransition) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ConfChangeTransition_value, data, "ConfChangeTransition") + if err != nil { + return err + } + *x = ConfChangeTransition(value) + return nil +} +func (ConfChangeTransition) EnumDescriptor() ([]byte, []int) { return fileDescriptorRaft, []int{2} } + +type ConfChangeType int32 + +const ( + ConfChangeAddNode ConfChangeType = 0 + ConfChangeRemoveNode ConfChangeType = 1 + ConfChangeUpdateNode ConfChangeType = 2 + ConfChangeAddLearnerNode ConfChangeType = 3 +) + +var ConfChangeType_name = map[int32]string{ + 0: "ConfChangeAddNode", + 1: "ConfChangeRemoveNode", + 2: "ConfChangeUpdateNode", + 3: "ConfChangeAddLearnerNode", +} +var ConfChangeType_value = map[string]int32{ + "ConfChangeAddNode": 0, + "ConfChangeRemoveNode": 1, + "ConfChangeUpdateNode": 2, + "ConfChangeAddLearnerNode": 3, +} + +func (x ConfChangeType) Enum() *ConfChangeType { + p := new(ConfChangeType) + *p = x + return p +} +func (x ConfChangeType) String() string { + return proto.EnumName(ConfChangeType_name, int32(x)) +} +func (x *ConfChangeType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ConfChangeType_value, data, "ConfChangeType") + if err != nil { + return err + } + *x = ConfChangeType(value) + return nil +} +func (ConfChangeType) EnumDescriptor() ([]byte, []int) { return fileDescriptorRaft, []int{3} } + +type Entry struct { + Term uint64 `protobuf:"varint,2,opt,name=Term" json:"Term"` + Index uint64 `protobuf:"varint,3,opt,name=Index" json:"Index"` + Type EntryType `protobuf:"varint,1,opt,name=Type,enum=raftpb.EntryType" json:"Type"` + Data []byte `protobuf:"bytes,4,opt,name=Data" json:"Data,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Entry) Reset() { *m = Entry{} } +func (m *Entry) String() string { return proto.CompactTextString(m) } +func (*Entry) ProtoMessage() {} +func (*Entry) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{0} } + +type SnapshotMetadata struct { + ConfState ConfState `protobuf:"bytes,1,opt,name=conf_state,json=confState" json:"conf_state"` + Index uint64 `protobuf:"varint,2,opt,name=index" json:"index"` + Term uint64 `protobuf:"varint,3,opt,name=term" json:"term"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SnapshotMetadata) Reset() { *m = SnapshotMetadata{} } +func (m *SnapshotMetadata) String() string { return proto.CompactTextString(m) } +func (*SnapshotMetadata) ProtoMessage() {} +func (*SnapshotMetadata) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{1} } + +type Snapshot struct { + Data []byte `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` + Metadata SnapshotMetadata `protobuf:"bytes,2,opt,name=metadata" json:"metadata"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Snapshot) Reset() { *m = Snapshot{} } +func (m *Snapshot) String() string { return proto.CompactTextString(m) } +func (*Snapshot) ProtoMessage() {} +func (*Snapshot) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{2} } + +type Message struct { + Type MessageType `protobuf:"varint,1,opt,name=type,enum=raftpb.MessageType" json:"type"` + To uint64 `protobuf:"varint,2,opt,name=to" json:"to"` + From uint64 `protobuf:"varint,3,opt,name=from" json:"from"` + Term uint64 `protobuf:"varint,4,opt,name=term" json:"term"` + LogTerm uint64 `protobuf:"varint,5,opt,name=logTerm" json:"logTerm"` + Index uint64 `protobuf:"varint,6,opt,name=index" json:"index"` + Entries []Entry `protobuf:"bytes,7,rep,name=entries" json:"entries"` + Commit uint64 `protobuf:"varint,8,opt,name=commit" json:"commit"` + Snapshot Snapshot `protobuf:"bytes,9,opt,name=snapshot" json:"snapshot"` + Reject bool `protobuf:"varint,10,opt,name=reject" json:"reject"` + RejectHint uint64 `protobuf:"varint,11,opt,name=rejectHint" json:"rejectHint"` + Context []byte `protobuf:"bytes,12,opt,name=context" json:"context,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Message) Reset() { *m = Message{} } +func (m *Message) String() string { return proto.CompactTextString(m) } +func (*Message) ProtoMessage() {} +func (*Message) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{3} } + +type HardState struct { + Term uint64 `protobuf:"varint,1,opt,name=term" json:"term"` + Vote uint64 `protobuf:"varint,2,opt,name=vote" json:"vote"` + Commit uint64 `protobuf:"varint,3,opt,name=commit" json:"commit"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *HardState) Reset() { *m = HardState{} } +func (m *HardState) String() string { return proto.CompactTextString(m) } +func (*HardState) ProtoMessage() {} +func (*HardState) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{4} } + +type ConfState struct { + // The voters in the incoming config. (If the configuration is not joint, + // then the outgoing config is empty). + Voters []uint64 `protobuf:"varint,1,rep,name=voters" json:"voters,omitempty"` + // The learners in the incoming config. + Learners []uint64 `protobuf:"varint,2,rep,name=learners" json:"learners,omitempty"` + // The voters in the outgoing config. + VotersOutgoing []uint64 `protobuf:"varint,3,rep,name=voters_outgoing,json=votersOutgoing" json:"voters_outgoing,omitempty"` + // The nodes that will become learners when the outgoing config is removed. + // These nodes are necessarily currently in nodes_joint (or they would have + // been added to the incoming config right away). + LearnersNext []uint64 `protobuf:"varint,4,rep,name=learners_next,json=learnersNext" json:"learners_next,omitempty"` + // If set, the config is joint and Raft will automatically transition into + // the final config (i.e. remove the outgoing config) when this is safe. + AutoLeave bool `protobuf:"varint,5,opt,name=auto_leave,json=autoLeave" json:"auto_leave"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ConfState) Reset() { *m = ConfState{} } +func (m *ConfState) String() string { return proto.CompactTextString(m) } +func (*ConfState) ProtoMessage() {} +func (*ConfState) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{5} } + +type ConfChange struct { + Type ConfChangeType `protobuf:"varint,2,opt,name=type,enum=raftpb.ConfChangeType" json:"type"` + NodeID uint64 `protobuf:"varint,3,opt,name=node_id,json=nodeId" json:"node_id"` + Context []byte `protobuf:"bytes,4,opt,name=context" json:"context,omitempty"` + // NB: this is used only by etcd to thread through a unique identifier. + // Ideally it should really use the Context instead. No counterpart to + // this field exists in ConfChangeV2. + ID uint64 `protobuf:"varint,1,opt,name=id" json:"id"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ConfChange) Reset() { *m = ConfChange{} } +func (m *ConfChange) String() string { return proto.CompactTextString(m) } +func (*ConfChange) ProtoMessage() {} +func (*ConfChange) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{6} } + +// ConfChangeSingle is an individual configuration change operation. Multiple +// such operations can be carried out atomically via a ConfChangeV2. +type ConfChangeSingle struct { + Type ConfChangeType `protobuf:"varint,1,opt,name=type,enum=raftpb.ConfChangeType" json:"type"` + NodeID uint64 `protobuf:"varint,2,opt,name=node_id,json=nodeId" json:"node_id"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ConfChangeSingle) Reset() { *m = ConfChangeSingle{} } +func (m *ConfChangeSingle) String() string { return proto.CompactTextString(m) } +func (*ConfChangeSingle) ProtoMessage() {} +func (*ConfChangeSingle) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{7} } + +// ConfChangeV2 messages initiate configuration changes. They support both the +// simple "one at a time" membership change protocol and full Joint Consensus +// allowing for arbitrary changes in membership. +// +// The supplied context is treated as an opaque payload and can be used to +// attach an action on the state machine to the application of the config change +// proposal. Note that contrary to Joint Consensus as outlined in the Raft +// paper[1], configuration changes become active when they are *applied* to the +// state machine (not when they are appended to the log). +// +// The simple protocol can be used whenever only a single change is made. +// +// Non-simple changes require the use of Joint Consensus, for which two +// configuration changes are run. The first configuration change specifies the +// desired changes and transitions the Raft group into the joint configuration, +// in which quorum requires a majority of both the pre-changes and post-changes +// configuration. Joint Consensus avoids entering fragile intermediate +// configurations that could compromise survivability. For example, without the +// use of Joint Consensus and running across three availability zones with a +// replication factor of three, it is not possible to replace a voter without +// entering an intermediate configuration that does not survive the outage of +// one availability zone. +// +// The provided ConfChangeTransition specifies how (and whether) Joint Consensus +// is used, and assigns the task of leaving the joint configuration either to +// Raft or the application. Leaving the joint configuration is accomplished by +// proposing a ConfChangeV2 with only and optionally the Context field +// populated. +// +// For details on Raft membership changes, see: +// +// [1]: https://github.com/ongardie/dissertation/blob/master/online-trim.pdf +type ConfChangeV2 struct { + Transition ConfChangeTransition `protobuf:"varint,1,opt,name=transition,enum=raftpb.ConfChangeTransition" json:"transition"` + Changes []ConfChangeSingle `protobuf:"bytes,2,rep,name=changes" json:"changes"` + Context []byte `protobuf:"bytes,3,opt,name=context" json:"context,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ConfChangeV2) Reset() { *m = ConfChangeV2{} } +func (m *ConfChangeV2) String() string { return proto.CompactTextString(m) } +func (*ConfChangeV2) ProtoMessage() {} +func (*ConfChangeV2) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{8} } + +func init() { + proto.RegisterType((*Entry)(nil), "raftpb.Entry") + proto.RegisterType((*SnapshotMetadata)(nil), "raftpb.SnapshotMetadata") + proto.RegisterType((*Snapshot)(nil), "raftpb.Snapshot") + proto.RegisterType((*Message)(nil), "raftpb.Message") + proto.RegisterType((*HardState)(nil), "raftpb.HardState") + proto.RegisterType((*ConfState)(nil), "raftpb.ConfState") + proto.RegisterType((*ConfChange)(nil), "raftpb.ConfChange") + proto.RegisterType((*ConfChangeSingle)(nil), "raftpb.ConfChangeSingle") + proto.RegisterType((*ConfChangeV2)(nil), "raftpb.ConfChangeV2") + proto.RegisterEnum("raftpb.EntryType", EntryType_name, EntryType_value) + proto.RegisterEnum("raftpb.MessageType", MessageType_name, MessageType_value) + proto.RegisterEnum("raftpb.ConfChangeTransition", ConfChangeTransition_name, ConfChangeTransition_value) + proto.RegisterEnum("raftpb.ConfChangeType", ConfChangeType_name, ConfChangeType_value) +} +func (m *Entry) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Entry) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Type)) + dAtA[i] = 0x10 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Term)) + dAtA[i] = 0x18 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Index)) + if m.Data != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintRaft(dAtA, i, uint64(len(m.Data))) + i += copy(dAtA[i:], m.Data) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SnapshotMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SnapshotMetadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.ConfState.Size())) + n1, err := m.ConfState.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + dAtA[i] = 0x10 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Index)) + dAtA[i] = 0x18 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Term)) + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Snapshot) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Snapshot) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Data != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRaft(dAtA, i, uint64(len(m.Data))) + i += copy(dAtA[i:], m.Data) + } + dAtA[i] = 0x12 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Metadata.Size())) + n2, err := m.Metadata.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Message) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Message) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Type)) + dAtA[i] = 0x10 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.To)) + dAtA[i] = 0x18 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.From)) + dAtA[i] = 0x20 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Term)) + dAtA[i] = 0x28 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.LogTerm)) + dAtA[i] = 0x30 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Index)) + if len(m.Entries) > 0 { + for _, msg := range m.Entries { + dAtA[i] = 0x3a + i++ + i = encodeVarintRaft(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + dAtA[i] = 0x40 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Commit)) + dAtA[i] = 0x4a + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Snapshot.Size())) + n3, err := m.Snapshot.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + dAtA[i] = 0x50 + i++ + if m.Reject { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x58 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.RejectHint)) + if m.Context != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintRaft(dAtA, i, uint64(len(m.Context))) + i += copy(dAtA[i:], m.Context) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *HardState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HardState) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Term)) + dAtA[i] = 0x10 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Vote)) + dAtA[i] = 0x18 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Commit)) + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ConfState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConfState) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Voters) > 0 { + for _, num := range m.Voters { + dAtA[i] = 0x8 + i++ + i = encodeVarintRaft(dAtA, i, uint64(num)) + } + } + if len(m.Learners) > 0 { + for _, num := range m.Learners { + dAtA[i] = 0x10 + i++ + i = encodeVarintRaft(dAtA, i, uint64(num)) + } + } + if len(m.VotersOutgoing) > 0 { + for _, num := range m.VotersOutgoing { + dAtA[i] = 0x18 + i++ + i = encodeVarintRaft(dAtA, i, uint64(num)) + } + } + if len(m.LearnersNext) > 0 { + for _, num := range m.LearnersNext { + dAtA[i] = 0x20 + i++ + i = encodeVarintRaft(dAtA, i, uint64(num)) + } + } + dAtA[i] = 0x28 + i++ + if m.AutoLeave { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ConfChange) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConfChange) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.ID)) + dAtA[i] = 0x10 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Type)) + dAtA[i] = 0x18 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.NodeID)) + if m.Context != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintRaft(dAtA, i, uint64(len(m.Context))) + i += copy(dAtA[i:], m.Context) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ConfChangeSingle) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConfChangeSingle) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Type)) + dAtA[i] = 0x10 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.NodeID)) + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ConfChangeV2) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConfChangeV2) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintRaft(dAtA, i, uint64(m.Transition)) + if len(m.Changes) > 0 { + for _, msg := range m.Changes { + dAtA[i] = 0x12 + i++ + i = encodeVarintRaft(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Context != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintRaft(dAtA, i, uint64(len(m.Context))) + i += copy(dAtA[i:], m.Context) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func encodeVarintRaft(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Entry) Size() (n int) { + var l int + _ = l + n += 1 + sovRaft(uint64(m.Type)) + n += 1 + sovRaft(uint64(m.Term)) + n += 1 + sovRaft(uint64(m.Index)) + if m.Data != nil { + l = len(m.Data) + n += 1 + l + sovRaft(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SnapshotMetadata) Size() (n int) { + var l int + _ = l + l = m.ConfState.Size() + n += 1 + l + sovRaft(uint64(l)) + n += 1 + sovRaft(uint64(m.Index)) + n += 1 + sovRaft(uint64(m.Term)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Snapshot) Size() (n int) { + var l int + _ = l + if m.Data != nil { + l = len(m.Data) + n += 1 + l + sovRaft(uint64(l)) + } + l = m.Metadata.Size() + n += 1 + l + sovRaft(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Message) Size() (n int) { + var l int + _ = l + n += 1 + sovRaft(uint64(m.Type)) + n += 1 + sovRaft(uint64(m.To)) + n += 1 + sovRaft(uint64(m.From)) + n += 1 + sovRaft(uint64(m.Term)) + n += 1 + sovRaft(uint64(m.LogTerm)) + n += 1 + sovRaft(uint64(m.Index)) + if len(m.Entries) > 0 { + for _, e := range m.Entries { + l = e.Size() + n += 1 + l + sovRaft(uint64(l)) + } + } + n += 1 + sovRaft(uint64(m.Commit)) + l = m.Snapshot.Size() + n += 1 + l + sovRaft(uint64(l)) + n += 2 + n += 1 + sovRaft(uint64(m.RejectHint)) + if m.Context != nil { + l = len(m.Context) + n += 1 + l + sovRaft(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *HardState) Size() (n int) { + var l int + _ = l + n += 1 + sovRaft(uint64(m.Term)) + n += 1 + sovRaft(uint64(m.Vote)) + n += 1 + sovRaft(uint64(m.Commit)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ConfState) Size() (n int) { + var l int + _ = l + if len(m.Voters) > 0 { + for _, e := range m.Voters { + n += 1 + sovRaft(uint64(e)) + } + } + if len(m.Learners) > 0 { + for _, e := range m.Learners { + n += 1 + sovRaft(uint64(e)) + } + } + if len(m.VotersOutgoing) > 0 { + for _, e := range m.VotersOutgoing { + n += 1 + sovRaft(uint64(e)) + } + } + if len(m.LearnersNext) > 0 { + for _, e := range m.LearnersNext { + n += 1 + sovRaft(uint64(e)) + } + } + n += 2 + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ConfChange) Size() (n int) { + var l int + _ = l + n += 1 + sovRaft(uint64(m.ID)) + n += 1 + sovRaft(uint64(m.Type)) + n += 1 + sovRaft(uint64(m.NodeID)) + if m.Context != nil { + l = len(m.Context) + n += 1 + l + sovRaft(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ConfChangeSingle) Size() (n int) { + var l int + _ = l + n += 1 + sovRaft(uint64(m.Type)) + n += 1 + sovRaft(uint64(m.NodeID)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ConfChangeV2) Size() (n int) { + var l int + _ = l + n += 1 + sovRaft(uint64(m.Transition)) + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovRaft(uint64(l)) + } + } + if m.Context != nil { + l = len(m.Context) + n += 1 + l + sovRaft(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovRaft(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozRaft(x uint64) (n int) { + return sovRaft(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Entry) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Entry: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Entry: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (EntryType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Term", wireType) + } + m.Term = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Term |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + m.Index = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Index |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRaft(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaft + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SnapshotMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SnapshotMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SnapshotMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConfState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + m.Index = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Index |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Term", wireType) + } + m.Term = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Term |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRaft(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaft + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Snapshot) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Snapshot: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Snapshot: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRaft(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaft + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Message) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Message: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Message: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (MessageType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field To", wireType) + } + m.To = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.To |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field From", wireType) + } + m.From = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.From |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Term", wireType) + } + m.Term = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Term |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LogTerm", wireType) + } + m.LogTerm = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LogTerm |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + m.Index = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Index |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Entries = append(m.Entries, Entry{}) + if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType) + } + m.Commit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Commit |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Snapshot", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Snapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Reject", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Reject = bool(v != 0) + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RejectHint", wireType) + } + m.RejectHint = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RejectHint |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Context", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Context = append(m.Context[:0], dAtA[iNdEx:postIndex]...) + if m.Context == nil { + m.Context = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRaft(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaft + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HardState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HardState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HardState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Term", wireType) + } + m.Term = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Term |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Vote", wireType) + } + m.Vote = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Vote |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType) + } + m.Commit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Commit |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRaft(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaft + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConfState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConfState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Voters = append(m.Voters, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Voters = append(m.Voters, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Voters", wireType) + } + case 2: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Learners = append(m.Learners, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Learners = append(m.Learners, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Learners", wireType) + } + case 3: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.VotersOutgoing = append(m.VotersOutgoing, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.VotersOutgoing = append(m.VotersOutgoing, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field VotersOutgoing", wireType) + } + case 4: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LearnersNext = append(m.LearnersNext, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LearnersNext = append(m.LearnersNext, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field LearnersNext", wireType) + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AutoLeave", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AutoLeave = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipRaft(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaft + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConfChange) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConfChange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfChange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (ConfChangeType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeID", wireType) + } + m.NodeID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NodeID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Context", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Context = append(m.Context[:0], dAtA[iNdEx:postIndex]...) + if m.Context == nil { + m.Context = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRaft(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaft + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConfChangeSingle) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConfChangeSingle: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfChangeSingle: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (ConfChangeType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeID", wireType) + } + m.NodeID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NodeID |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRaft(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaft + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConfChangeV2) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConfChangeV2: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfChangeV2: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Transition", wireType) + } + m.Transition = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Transition |= (ConfChangeTransition(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, ConfChangeSingle{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Context", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaft + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRaft + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Context = append(m.Context[:0], dAtA[iNdEx:postIndex]...) + if m.Context == nil { + m.Context = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRaft(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRaft + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipRaft(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRaft + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRaft + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRaft + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthRaft + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRaft + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipRaft(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthRaft = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowRaft = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("raft.proto", fileDescriptorRaft) } + +var fileDescriptorRaft = []byte{ + // 1009 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xcd, 0x6e, 0xe3, 0x36, + 0x17, 0xb5, 0x64, 0xc5, 0x3f, 0xd7, 0x8e, 0xc3, 0xdc, 0xc9, 0x37, 0x20, 0x82, 0xc0, 0xe3, 0xcf, + 0xd3, 0x62, 0x8c, 0x14, 0x93, 0x16, 0x5e, 0x14, 0x45, 0x77, 0xf9, 0x19, 0x20, 0x29, 0xe2, 0x74, + 0xea, 0x64, 0xb2, 0x28, 0x50, 0x04, 0x8c, 0x45, 0x2b, 0x6a, 0x2d, 0x51, 0xa0, 0xe8, 0x34, 0xd9, + 0x14, 0x45, 0x9f, 0xa2, 0x9b, 0xd9, 0xf6, 0x01, 0xfa, 0x14, 0x59, 0x0e, 0xd0, 0xfd, 0xa0, 0x93, + 0xbe, 0x48, 0x41, 0x8a, 0xb2, 0x65, 0x27, 0x98, 0x45, 0x77, 0xe4, 0x39, 0x87, 0xf7, 0x9e, 0x7b, + 0x79, 0x45, 0x01, 0x48, 0x36, 0x56, 0x3b, 0x89, 0x14, 0x4a, 0x60, 0x45, 0xaf, 0x93, 0xcb, 0xcd, + 0x8d, 0x40, 0x04, 0xc2, 0x40, 0x9f, 0xeb, 0x55, 0xc6, 0x76, 0x7f, 0x81, 0x95, 0x57, 0xb1, 0x92, + 0xb7, 0xf8, 0x19, 0x78, 0x67, 0xb7, 0x09, 0xa7, 0x4e, 0xc7, 0xe9, 0xb5, 0xfa, 0xeb, 0x3b, 0xd9, + 0xa9, 0x1d, 0x43, 0x6a, 0x62, 0xcf, 0xbb, 0x7b, 0xff, 0xac, 0x34, 0x34, 0x22, 0xa4, 0xe0, 0x9d, + 0x71, 0x19, 0x51, 0xb7, 0xe3, 0xf4, 0xbc, 0x19, 0xc3, 0x65, 0x84, 0x9b, 0xb0, 0x72, 0x14, 0xfb, + 0xfc, 0x86, 0x96, 0x0b, 0x54, 0x06, 0x21, 0x82, 0x77, 0xc0, 0x14, 0xa3, 0x5e, 0xc7, 0xe9, 0x35, + 0x87, 0x66, 0xdd, 0xfd, 0xd5, 0x01, 0x72, 0x1a, 0xb3, 0x24, 0xbd, 0x12, 0x6a, 0xc0, 0x15, 0xf3, + 0x99, 0x62, 0xf8, 0x25, 0xc0, 0x48, 0xc4, 0xe3, 0x8b, 0x54, 0x31, 0x95, 0x39, 0x6a, 0xcc, 0x1d, + 0xed, 0x8b, 0x78, 0x7c, 0xaa, 0x09, 0x1b, 0xbc, 0x3e, 0xca, 0x01, 0x9d, 0x3c, 0x34, 0xc9, 0x8b, + 0xbe, 0x32, 0x48, 0x5b, 0x56, 0xda, 0x72, 0xd1, 0x97, 0x41, 0xba, 0xdf, 0x43, 0x2d, 0x77, 0xa0, + 0x2d, 0x6a, 0x07, 0x26, 0x67, 0x73, 0x68, 0xd6, 0xf8, 0x35, 0xd4, 0x22, 0xeb, 0xcc, 0x04, 0x6e, + 0xf4, 0x69, 0xee, 0x65, 0xd9, 0xb9, 0x8d, 0x3b, 0xd3, 0x77, 0xdf, 0x96, 0xa1, 0x3a, 0xe0, 0x69, + 0xca, 0x02, 0x8e, 0x2f, 0xc1, 0x53, 0xf3, 0x0e, 0x3f, 0xc9, 0x63, 0x58, 0xba, 0xd8, 0x63, 0x2d, + 0xc3, 0x0d, 0x70, 0x95, 0x58, 0xa8, 0xc4, 0x55, 0x42, 0x97, 0x31, 0x96, 0x62, 0xa9, 0x0c, 0x8d, + 0xcc, 0x0a, 0xf4, 0x96, 0x0b, 0xc4, 0x36, 0x54, 0x27, 0x22, 0x30, 0x17, 0xb6, 0x52, 0x20, 0x73, + 0x70, 0xde, 0xb6, 0xca, 0xc3, 0xb6, 0xbd, 0x84, 0x2a, 0x8f, 0x95, 0x0c, 0x79, 0x4a, 0xab, 0x9d, + 0x72, 0xaf, 0xd1, 0x5f, 0x5d, 0x98, 0x8c, 0x3c, 0x94, 0xd5, 0xe0, 0x16, 0x54, 0x46, 0x22, 0x8a, + 0x42, 0x45, 0x6b, 0x85, 0x58, 0x16, 0xc3, 0x3e, 0xd4, 0x52, 0xdb, 0x31, 0x5a, 0x37, 0x9d, 0x24, + 0xcb, 0x9d, 0xcc, 0x3b, 0x98, 0xeb, 0x74, 0x44, 0xc9, 0x7f, 0xe4, 0x23, 0x45, 0xa1, 0xe3, 0xf4, + 0x6a, 0x79, 0xc4, 0x0c, 0xc3, 0x4f, 0x00, 0xb2, 0xd5, 0x61, 0x18, 0x2b, 0xda, 0x28, 0xe4, 0x2c, + 0xe0, 0x48, 0xa1, 0x3a, 0x12, 0xb1, 0xe2, 0x37, 0x8a, 0x36, 0xcd, 0xc5, 0xe6, 0xdb, 0xee, 0x0f, + 0x50, 0x3f, 0x64, 0xd2, 0xcf, 0xc6, 0x27, 0xef, 0xa0, 0xf3, 0xa0, 0x83, 0x14, 0xbc, 0x6b, 0xa1, + 0xf8, 0xe2, 0xbc, 0x6b, 0xa4, 0x50, 0x70, 0xf9, 0x61, 0xc1, 0xdd, 0x3f, 0x1d, 0xa8, 0xcf, 0xe6, + 0x15, 0x9f, 0x42, 0x45, 0x9f, 0x91, 0x29, 0x75, 0x3a, 0xe5, 0x9e, 0x37, 0xb4, 0x3b, 0xdc, 0x84, + 0xda, 0x84, 0x33, 0x19, 0x6b, 0xc6, 0x35, 0xcc, 0x6c, 0x8f, 0x2f, 0x60, 0x2d, 0x53, 0x5d, 0x88, + 0xa9, 0x0a, 0x44, 0x18, 0x07, 0xb4, 0x6c, 0x24, 0xad, 0x0c, 0xfe, 0xd6, 0xa2, 0xf8, 0x1c, 0x56, + 0xf3, 0x43, 0x17, 0xb1, 0xae, 0xd4, 0x33, 0xb2, 0x66, 0x0e, 0x9e, 0xf0, 0x1b, 0x85, 0xcf, 0x01, + 0xd8, 0x54, 0x89, 0x8b, 0x09, 0x67, 0xd7, 0xdc, 0x0c, 0x43, 0xde, 0xd0, 0xba, 0xc6, 0x8f, 0x35, + 0xdc, 0x7d, 0xeb, 0x00, 0x68, 0xd3, 0xfb, 0x57, 0x2c, 0x0e, 0xf4, 0x47, 0xe5, 0x86, 0xbe, 0xed, + 0x09, 0x68, 0xed, 0xfd, 0xfb, 0x67, 0xee, 0xd1, 0xc1, 0xd0, 0x0d, 0x7d, 0xfc, 0xc2, 0x8e, 0xb4, + 0x6b, 0x46, 0xfa, 0x69, 0xf1, 0x13, 0xcd, 0x4e, 0x3f, 0x98, 0xea, 0x17, 0x50, 0x8d, 0x85, 0xcf, + 0x2f, 0x42, 0xdf, 0x36, 0xac, 0x65, 0x43, 0x56, 0x4e, 0x84, 0xcf, 0x8f, 0x0e, 0x86, 0x15, 0x4d, + 0x1f, 0xf9, 0xc5, 0x3b, 0xf3, 0x16, 0xef, 0x2c, 0x02, 0x32, 0x4f, 0x70, 0x1a, 0xc6, 0xc1, 0x84, + 0xcf, 0x8c, 0x38, 0xff, 0xc5, 0x88, 0xfb, 0x31, 0x23, 0xdd, 0x3f, 0x1c, 0x68, 0xce, 0xe3, 0x9c, + 0xf7, 0x71, 0x0f, 0x40, 0x49, 0x16, 0xa7, 0xa1, 0x0a, 0x45, 0x6c, 0x33, 0x6e, 0x3d, 0x92, 0x71, + 0xa6, 0xc9, 0x27, 0x72, 0x7e, 0x0a, 0xbf, 0x82, 0xea, 0xc8, 0xa8, 0xb2, 0x1b, 0x2f, 0x3c, 0x29, + 0xcb, 0xa5, 0xe5, 0x5f, 0x98, 0x95, 0x17, 0xfb, 0x52, 0x5e, 0xe8, 0xcb, 0xf6, 0x21, 0xd4, 0x67, + 0xaf, 0x35, 0xae, 0x41, 0xc3, 0x6c, 0x4e, 0x84, 0x8c, 0xd8, 0x84, 0x94, 0xf0, 0x09, 0xac, 0x19, + 0x60, 0x1e, 0x9f, 0x38, 0xf8, 0x3f, 0x58, 0x5f, 0x02, 0xcf, 0xfb, 0xc4, 0xdd, 0xfe, 0xcb, 0x85, + 0x46, 0xe1, 0x59, 0x42, 0x80, 0xca, 0x20, 0x0d, 0x0e, 0xa7, 0x09, 0x29, 0x61, 0x03, 0xaa, 0x83, + 0x34, 0xd8, 0xe3, 0x4c, 0x11, 0xc7, 0x6e, 0x5e, 0x4b, 0x91, 0x10, 0xd7, 0xaa, 0x76, 0x93, 0x84, + 0x94, 0xb1, 0x05, 0x90, 0xad, 0x87, 0x3c, 0x4d, 0x88, 0x67, 0x85, 0xe7, 0x42, 0x71, 0xb2, 0xa2, + 0xbd, 0xd9, 0x8d, 0x61, 0x2b, 0x96, 0xd5, 0x4f, 0x00, 0xa9, 0x22, 0x81, 0xa6, 0x4e, 0xc6, 0x99, + 0x54, 0x97, 0x3a, 0x4b, 0x0d, 0x37, 0x80, 0x14, 0x11, 0x73, 0xa8, 0x8e, 0x08, 0xad, 0x41, 0x1a, + 0xbc, 0x89, 0x25, 0x67, 0xa3, 0x2b, 0x76, 0x39, 0xe1, 0x04, 0x70, 0x1d, 0x56, 0x6d, 0x20, 0xfd, + 0xc5, 0x4d, 0x53, 0xd2, 0xb0, 0xb2, 0xfd, 0x2b, 0x3e, 0xfa, 0xe9, 0xbb, 0xa9, 0x90, 0xd3, 0x88, + 0x34, 0x75, 0xd9, 0x83, 0x34, 0x30, 0x17, 0x34, 0xe6, 0xf2, 0x98, 0x33, 0x9f, 0x4b, 0xb2, 0x6a, + 0x4f, 0x9f, 0x85, 0x11, 0x17, 0x53, 0x75, 0x22, 0x7e, 0x26, 0x2d, 0x6b, 0x66, 0xc8, 0x99, 0x6f, + 0x7e, 0x61, 0x64, 0xcd, 0x9a, 0x99, 0x21, 0xc6, 0x0c, 0xb1, 0xf5, 0xbe, 0x96, 0xdc, 0x94, 0xb8, + 0x6e, 0xb3, 0xda, 0xbd, 0xd1, 0xe0, 0xf6, 0x6f, 0x0e, 0x6c, 0x3c, 0x36, 0x1e, 0xb8, 0x05, 0xf4, + 0x31, 0x7c, 0x77, 0xaa, 0x04, 0x29, 0xe1, 0xa7, 0xf0, 0xff, 0xc7, 0xd8, 0x6f, 0x44, 0x18, 0xab, + 0xa3, 0x28, 0x99, 0x84, 0xa3, 0x50, 0x5f, 0xc5, 0xc7, 0x64, 0xaf, 0x6e, 0xac, 0xcc, 0xdd, 0xbe, + 0x85, 0xd6, 0xe2, 0x47, 0xa1, 0x9b, 0x31, 0x47, 0x76, 0x7d, 0x5f, 0x8f, 0x3f, 0x29, 0x21, 0x2d, + 0x9a, 0x1d, 0xf2, 0x48, 0x5c, 0x73, 0xc3, 0x38, 0x8b, 0xcc, 0x9b, 0xc4, 0x67, 0x2a, 0x63, 0xdc, + 0xc5, 0x42, 0x76, 0x7d, 0xff, 0x38, 0x7b, 0x7b, 0x0c, 0x5b, 0xde, 0xa3, 0x77, 0x1f, 0xda, 0xa5, + 0x77, 0x1f, 0xda, 0xa5, 0xbb, 0xfb, 0xb6, 0xf3, 0xee, 0xbe, 0xed, 0xfc, 0x7d, 0xdf, 0x76, 0x7e, + 0xff, 0xa7, 0x5d, 0xfa, 0x37, 0x00, 0x00, 0xff, 0xff, 0x87, 0x11, 0x6d, 0xd6, 0xaf, 0x08, 0x00, + 0x00, +} diff --git a/vendor/go.etcd.io/etcd/raft/raftpb/raft.proto b/vendor/go.etcd.io/etcd/raft/raftpb/raft.proto new file mode 100644 index 00000000..23d62ec2 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/raftpb/raft.proto @@ -0,0 +1,177 @@ +syntax = "proto2"; +package raftpb; + +import "gogoproto/gogo.proto"; + +option (gogoproto.marshaler_all) = true; +option (gogoproto.sizer_all) = true; +option (gogoproto.unmarshaler_all) = true; +option (gogoproto.goproto_getters_all) = false; +option (gogoproto.goproto_enum_prefix_all) = false; + +enum EntryType { + EntryNormal = 0; + EntryConfChange = 1; // corresponds to pb.ConfChange + EntryConfChangeV2 = 2; // corresponds to pb.ConfChangeV2 +} + +message Entry { + optional uint64 Term = 2 [(gogoproto.nullable) = false]; // must be 64-bit aligned for atomic operations + optional uint64 Index = 3 [(gogoproto.nullable) = false]; // must be 64-bit aligned for atomic operations + optional EntryType Type = 1 [(gogoproto.nullable) = false]; + optional bytes Data = 4; +} + +message SnapshotMetadata { + optional ConfState conf_state = 1 [(gogoproto.nullable) = false]; + optional uint64 index = 2 [(gogoproto.nullable) = false]; + optional uint64 term = 3 [(gogoproto.nullable) = false]; +} + +message Snapshot { + optional bytes data = 1; + optional SnapshotMetadata metadata = 2 [(gogoproto.nullable) = false]; +} + +enum MessageType { + MsgHup = 0; + MsgBeat = 1; + MsgProp = 2; + MsgApp = 3; + MsgAppResp = 4; + MsgVote = 5; + MsgVoteResp = 6; + MsgSnap = 7; + MsgHeartbeat = 8; + MsgHeartbeatResp = 9; + MsgUnreachable = 10; + MsgSnapStatus = 11; + MsgCheckQuorum = 12; + MsgTransferLeader = 13; + MsgTimeoutNow = 14; + MsgReadIndex = 15; + MsgReadIndexResp = 16; + MsgPreVote = 17; + MsgPreVoteResp = 18; +} + +message Message { + optional MessageType type = 1 [(gogoproto.nullable) = false]; + optional uint64 to = 2 [(gogoproto.nullable) = false]; + optional uint64 from = 3 [(gogoproto.nullable) = false]; + optional uint64 term = 4 [(gogoproto.nullable) = false]; + optional uint64 logTerm = 5 [(gogoproto.nullable) = false]; + optional uint64 index = 6 [(gogoproto.nullable) = false]; + repeated Entry entries = 7 [(gogoproto.nullable) = false]; + optional uint64 commit = 8 [(gogoproto.nullable) = false]; + optional Snapshot snapshot = 9 [(gogoproto.nullable) = false]; + optional bool reject = 10 [(gogoproto.nullable) = false]; + optional uint64 rejectHint = 11 [(gogoproto.nullable) = false]; + optional bytes context = 12; +} + +message HardState { + optional uint64 term = 1 [(gogoproto.nullable) = false]; + optional uint64 vote = 2 [(gogoproto.nullable) = false]; + optional uint64 commit = 3 [(gogoproto.nullable) = false]; +} + +// ConfChangeTransition specifies the behavior of a configuration change with +// respect to joint consensus. +enum ConfChangeTransition { + // Automatically use the simple protocol if possible, otherwise fall back + // to ConfChangeJointImplicit. Most applications will want to use this. + ConfChangeTransitionAuto = 0; + // Use joint consensus unconditionally, and transition out of them + // automatically (by proposing a zero configuration change). + // + // This option is suitable for applications that want to minimize the time + // spent in the joint configuration and do not store the joint configuration + // in the state machine (outside of InitialState). + ConfChangeTransitionJointImplicit = 1; + // Use joint consensus and remain in the joint configuration until the + // application proposes a no-op configuration change. This is suitable for + // applications that want to explicitly control the transitions, for example + // to use a custom payload (via the Context field). + ConfChangeTransitionJointExplicit = 2; +} + +message ConfState { + // The voters in the incoming config. (If the configuration is not joint, + // then the outgoing config is empty). + repeated uint64 voters = 1; + // The learners in the incoming config. + repeated uint64 learners = 2; + // The voters in the outgoing config. + repeated uint64 voters_outgoing = 3; + // The nodes that will become learners when the outgoing config is removed. + // These nodes are necessarily currently in nodes_joint (or they would have + // been added to the incoming config right away). + repeated uint64 learners_next = 4; + // If set, the config is joint and Raft will automatically transition into + // the final config (i.e. remove the outgoing config) when this is safe. + optional bool auto_leave = 5 [(gogoproto.nullable) = false]; +} + +enum ConfChangeType { + ConfChangeAddNode = 0; + ConfChangeRemoveNode = 1; + ConfChangeUpdateNode = 2; + ConfChangeAddLearnerNode = 3; +} + +message ConfChange { + optional ConfChangeType type = 2 [(gogoproto.nullable) = false]; + optional uint64 node_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "NodeID" ]; + optional bytes context = 4; + + // NB: this is used only by etcd to thread through a unique identifier. + // Ideally it should really use the Context instead. No counterpart to + // this field exists in ConfChangeV2. + optional uint64 id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ID" ]; +} + +// ConfChangeSingle is an individual configuration change operation. Multiple +// such operations can be carried out atomically via a ConfChangeV2. +message ConfChangeSingle { + optional ConfChangeType type = 1 [(gogoproto.nullable) = false]; + optional uint64 node_id = 2 [(gogoproto.nullable) = false, (gogoproto.customname) = "NodeID"]; +} + +// ConfChangeV2 messages initiate configuration changes. They support both the +// simple "one at a time" membership change protocol and full Joint Consensus +// allowing for arbitrary changes in membership. +// +// The supplied context is treated as an opaque payload and can be used to +// attach an action on the state machine to the application of the config change +// proposal. Note that contrary to Joint Consensus as outlined in the Raft +// paper[1], configuration changes become active when they are *applied* to the +// state machine (not when they are appended to the log). +// +// The simple protocol can be used whenever only a single change is made. +// +// Non-simple changes require the use of Joint Consensus, for which two +// configuration changes are run. The first configuration change specifies the +// desired changes and transitions the Raft group into the joint configuration, +// in which quorum requires a majority of both the pre-changes and post-changes +// configuration. Joint Consensus avoids entering fragile intermediate +// configurations that could compromise survivability. For example, without the +// use of Joint Consensus and running across three availability zones with a +// replication factor of three, it is not possible to replace a voter without +// entering an intermediate configuration that does not survive the outage of +// one availability zone. +// +// The provided ConfChangeTransition specifies how (and whether) Joint Consensus +// is used, and assigns the task of leaving the joint configuration either to +// Raft or the application. Leaving the joint configuration is accomplished by +// proposing a ConfChangeV2 with only and optionally the Context field +// populated. +// +// For details on Raft membership changes, see: +// +// [1]: https://github.com/ongardie/dissertation/blob/master/online-trim.pdf +message ConfChangeV2 { + optional ConfChangeTransition transition = 1 [(gogoproto.nullable) = false]; + repeated ConfChangeSingle changes = 2 [(gogoproto.nullable) = false]; + optional bytes context = 3; +} diff --git a/vendor/go.etcd.io/etcd/raft/rawnode.go b/vendor/go.etcd.io/etcd/raft/rawnode.go new file mode 100644 index 00000000..90eb6949 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/rawnode.go @@ -0,0 +1,239 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import ( + "errors" + + pb "go.etcd.io/etcd/raft/raftpb" + "go.etcd.io/etcd/raft/tracker" +) + +// ErrStepLocalMsg is returned when try to step a local raft message +var ErrStepLocalMsg = errors.New("raft: cannot step raft local message") + +// ErrStepPeerNotFound is returned when try to step a response message +// but there is no peer found in raft.prs for that node. +var ErrStepPeerNotFound = errors.New("raft: cannot step as peer not found") + +// RawNode is a thread-unsafe Node. +// The methods of this struct correspond to the methods of Node and are described +// more fully there. +type RawNode struct { + raft *raft + prevSoftSt *SoftState + prevHardSt pb.HardState +} + +// NewRawNode instantiates a RawNode from the given configuration. +// +// See Bootstrap() for bootstrapping an initial state; this replaces the former +// 'peers' argument to this method (with identical behavior). However, It is +// recommended that instead of calling Bootstrap, applications bootstrap their +// state manually by setting up a Storage that has a first index > 1 and which +// stores the desired ConfState as its InitialState. +func NewRawNode(config *Config) (*RawNode, error) { + r := newRaft(config) + rn := &RawNode{ + raft: r, + } + rn.prevSoftSt = r.softState() + rn.prevHardSt = r.hardState() + return rn, nil +} + +// Tick advances the internal logical clock by a single tick. +func (rn *RawNode) Tick() { + rn.raft.tick() +} + +// TickQuiesced advances the internal logical clock by a single tick without +// performing any other state machine processing. It allows the caller to avoid +// periodic heartbeats and elections when all of the peers in a Raft group are +// known to be at the same state. Expected usage is to periodically invoke Tick +// or TickQuiesced depending on whether the group is "active" or "quiesced". +// +// WARNING: Be very careful about using this method as it subverts the Raft +// state machine. You should probably be using Tick instead. +func (rn *RawNode) TickQuiesced() { + rn.raft.electionElapsed++ +} + +// Campaign causes this RawNode to transition to candidate state. +func (rn *RawNode) Campaign() error { + return rn.raft.Step(pb.Message{ + Type: pb.MsgHup, + }) +} + +// Propose proposes data be appended to the raft log. +func (rn *RawNode) Propose(data []byte) error { + return rn.raft.Step(pb.Message{ + Type: pb.MsgProp, + From: rn.raft.id, + Entries: []pb.Entry{ + {Data: data}, + }}) +} + +// ProposeConfChange proposes a config change. See (Node).ProposeConfChange for +// details. +func (rn *RawNode) ProposeConfChange(cc pb.ConfChangeI) error { + m, err := confChangeToMsg(cc) + if err != nil { + return err + } + return rn.raft.Step(m) +} + +// ApplyConfChange applies a config change to the local node. +func (rn *RawNode) ApplyConfChange(cc pb.ConfChangeI) *pb.ConfState { + cs := rn.raft.applyConfChange(cc.AsV2()) + return &cs +} + +// Step advances the state machine using the given message. +func (rn *RawNode) Step(m pb.Message) error { + // ignore unexpected local messages receiving over network + if IsLocalMsg(m.Type) { + return ErrStepLocalMsg + } + if pr := rn.raft.prs.Progress[m.From]; pr != nil || !IsResponseMsg(m.Type) { + return rn.raft.Step(m) + } + return ErrStepPeerNotFound +} + +// Ready returns the outstanding work that the application needs to handle. This +// includes appending and applying entries or a snapshot, updating the HardState, +// and sending messages. The returned Ready() *must* be handled and subsequently +// passed back via Advance(). +func (rn *RawNode) Ready() Ready { + rd := rn.readyWithoutAccept() + rn.acceptReady(rd) + return rd +} + +// readyWithoutAccept returns a Ready. This is a read-only operation, i.e. there +// is no obligation that the Ready must be handled. +func (rn *RawNode) readyWithoutAccept() Ready { + return newReady(rn.raft, rn.prevSoftSt, rn.prevHardSt) +} + +// acceptReady is called when the consumer of the RawNode has decided to go +// ahead and handle a Ready. Nothing must alter the state of the RawNode between +// this call and the prior call to Ready(). +func (rn *RawNode) acceptReady(rd Ready) { + if rd.SoftState != nil { + rn.prevSoftSt = rd.SoftState + } + if len(rd.ReadStates) != 0 { + rn.raft.readStates = nil + } + rn.raft.msgs = nil +} + +// HasReady called when RawNode user need to check if any Ready pending. +// Checking logic in this method should be consistent with Ready.containsUpdates(). +func (rn *RawNode) HasReady() bool { + r := rn.raft + if !r.softState().equal(rn.prevSoftSt) { + return true + } + if hardSt := r.hardState(); !IsEmptyHardState(hardSt) && !isHardStateEqual(hardSt, rn.prevHardSt) { + return true + } + if r.raftLog.unstable.snapshot != nil && !IsEmptySnap(*r.raftLog.unstable.snapshot) { + return true + } + if len(r.msgs) > 0 || len(r.raftLog.unstableEntries()) > 0 || r.raftLog.hasNextEnts() { + return true + } + if len(r.readStates) != 0 { + return true + } + return false +} + +// Advance notifies the RawNode that the application has applied and saved progress in the +// last Ready results. +func (rn *RawNode) Advance(rd Ready) { + if !IsEmptyHardState(rd.HardState) { + rn.prevHardSt = rd.HardState + } + rn.raft.advance(rd) +} + +// Status returns the current status of the given group. This allocates, see +// BasicStatus and WithProgress for allocation-friendlier choices. +func (rn *RawNode) Status() Status { + status := getStatus(rn.raft) + return status +} + +// BasicStatus returns a BasicStatus. Notably this does not contain the +// Progress map; see WithProgress for an allocation-free way to inspect it. +func (rn *RawNode) BasicStatus() BasicStatus { + return getBasicStatus(rn.raft) +} + +// ProgressType indicates the type of replica a Progress corresponds to. +type ProgressType byte + +const ( + // ProgressTypePeer accompanies a Progress for a regular peer replica. + ProgressTypePeer ProgressType = iota + // ProgressTypeLearner accompanies a Progress for a learner replica. + ProgressTypeLearner +) + +// WithProgress is a helper to introspect the Progress for this node and its +// peers. +func (rn *RawNode) WithProgress(visitor func(id uint64, typ ProgressType, pr tracker.Progress)) { + rn.raft.prs.Visit(func(id uint64, pr *tracker.Progress) { + typ := ProgressTypePeer + if pr.IsLearner { + typ = ProgressTypeLearner + } + p := *pr + p.Inflights = nil + visitor(id, typ, p) + }) +} + +// ReportUnreachable reports the given node is not reachable for the last send. +func (rn *RawNode) ReportUnreachable(id uint64) { + _ = rn.raft.Step(pb.Message{Type: pb.MsgUnreachable, From: id}) +} + +// ReportSnapshot reports the status of the sent snapshot. +func (rn *RawNode) ReportSnapshot(id uint64, status SnapshotStatus) { + rej := status == SnapshotFailure + + _ = rn.raft.Step(pb.Message{Type: pb.MsgSnapStatus, From: id, Reject: rej}) +} + +// TransferLeader tries to transfer leadership to the given transferee. +func (rn *RawNode) TransferLeader(transferee uint64) { + _ = rn.raft.Step(pb.Message{Type: pb.MsgTransferLeader, From: transferee}) +} + +// ReadIndex requests a read state. The read state will be set in ready. +// Read State has a read index. Once the application advances further than the read +// index, any linearizable read requests issued before the read request can be +// processed safely. The read state will have the same rctx attached. +func (rn *RawNode) ReadIndex(rctx []byte) { + _ = rn.raft.Step(pb.Message{Type: pb.MsgReadIndex, Entries: []pb.Entry{{Data: rctx}}}) +} diff --git a/vendor/go.etcd.io/etcd/raft/read_only.go b/vendor/go.etcd.io/etcd/raft/read_only.go new file mode 100644 index 00000000..6987f1bd --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/read_only.go @@ -0,0 +1,121 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import pb "go.etcd.io/etcd/raft/raftpb" + +// ReadState provides state for read only query. +// It's caller's responsibility to call ReadIndex first before getting +// this state from ready, it's also caller's duty to differentiate if this +// state is what it requests through RequestCtx, eg. given a unique id as +// RequestCtx +type ReadState struct { + Index uint64 + RequestCtx []byte +} + +type readIndexStatus struct { + req pb.Message + index uint64 + // NB: this never records 'false', but it's more convenient to use this + // instead of a map[uint64]struct{} due to the API of quorum.VoteResult. If + // this becomes performance sensitive enough (doubtful), quorum.VoteResult + // can change to an API that is closer to that of CommittedIndex. + acks map[uint64]bool +} + +type readOnly struct { + option ReadOnlyOption + pendingReadIndex map[string]*readIndexStatus + readIndexQueue []string +} + +func newReadOnly(option ReadOnlyOption) *readOnly { + return &readOnly{ + option: option, + pendingReadIndex: make(map[string]*readIndexStatus), + } +} + +// addRequest adds a read only reuqest into readonly struct. +// `index` is the commit index of the raft state machine when it received +// the read only request. +// `m` is the original read only request message from the local or remote node. +func (ro *readOnly) addRequest(index uint64, m pb.Message) { + s := string(m.Entries[0].Data) + if _, ok := ro.pendingReadIndex[s]; ok { + return + } + ro.pendingReadIndex[s] = &readIndexStatus{index: index, req: m, acks: make(map[uint64]bool)} + ro.readIndexQueue = append(ro.readIndexQueue, s) +} + +// recvAck notifies the readonly struct that the raft state machine received +// an acknowledgment of the heartbeat that attached with the read only request +// context. +func (ro *readOnly) recvAck(id uint64, context []byte) map[uint64]bool { + rs, ok := ro.pendingReadIndex[string(context)] + if !ok { + return nil + } + + rs.acks[id] = true + return rs.acks +} + +// advance advances the read only request queue kept by the readonly struct. +// It dequeues the requests until it finds the read only request that has +// the same context as the given `m`. +func (ro *readOnly) advance(m pb.Message) []*readIndexStatus { + var ( + i int + found bool + ) + + ctx := string(m.Context) + rss := []*readIndexStatus{} + + for _, okctx := range ro.readIndexQueue { + i++ + rs, ok := ro.pendingReadIndex[okctx] + if !ok { + panic("cannot find corresponding read state from pending map") + } + rss = append(rss, rs) + if okctx == ctx { + found = true + break + } + } + + if found { + ro.readIndexQueue = ro.readIndexQueue[i:] + for _, rs := range rss { + delete(ro.pendingReadIndex, string(rs.req.Entries[0].Data)) + } + return rss + } + + return nil +} + +// lastPendingRequestCtx returns the context of the last pending read only +// request in readonly struct. +func (ro *readOnly) lastPendingRequestCtx() string { + if len(ro.readIndexQueue) == 0 { + return "" + } + return ro.readIndexQueue[len(ro.readIndexQueue)-1] +} diff --git a/vendor/go.etcd.io/etcd/raft/status.go b/vendor/go.etcd.io/etcd/raft/status.go new file mode 100644 index 00000000..adc60486 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/status.go @@ -0,0 +1,106 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import ( + "fmt" + + pb "go.etcd.io/etcd/raft/raftpb" + "go.etcd.io/etcd/raft/tracker" +) + +// Status contains information about this Raft peer and its view of the system. +// The Progress is only populated on the leader. +type Status struct { + BasicStatus + Config tracker.Config + Progress map[uint64]tracker.Progress +} + +// BasicStatus contains basic information about the Raft peer. It does not allocate. +type BasicStatus struct { + ID uint64 + + pb.HardState + SoftState + + Applied uint64 + + LeadTransferee uint64 +} + +func getProgressCopy(r *raft) map[uint64]tracker.Progress { + m := make(map[uint64]tracker.Progress) + r.prs.Visit(func(id uint64, pr *tracker.Progress) { + var p tracker.Progress + p = *pr + p.Inflights = pr.Inflights.Clone() + pr = nil + + m[id] = p + }) + return m +} + +func getBasicStatus(r *raft) BasicStatus { + s := BasicStatus{ + ID: r.id, + LeadTransferee: r.leadTransferee, + } + s.HardState = r.hardState() + s.SoftState = *r.softState() + s.Applied = r.raftLog.applied + return s +} + +// getStatus gets a copy of the current raft status. +func getStatus(r *raft) Status { + var s Status + s.BasicStatus = getBasicStatus(r) + if s.RaftState == StateLeader { + s.Progress = getProgressCopy(r) + } + s.Config = r.prs.Config.Clone() + return s +} + +// MarshalJSON translates the raft status into JSON. +// TODO: try to simplify this by introducing ID type into raft +func (s Status) MarshalJSON() ([]byte, error) { + j := fmt.Sprintf(`{"id":"%x","term":%d,"vote":"%x","commit":%d,"lead":"%x","raftState":%q,"applied":%d,"progress":{`, + s.ID, s.Term, s.Vote, s.Commit, s.Lead, s.RaftState, s.Applied) + + if len(s.Progress) == 0 { + j += "}," + } else { + for k, v := range s.Progress { + subj := fmt.Sprintf(`"%x":{"match":%d,"next":%d,"state":%q},`, k, v.Match, v.Next, v.State) + j += subj + } + // remove the trailing "," + j = j[:len(j)-1] + "}," + } + + j += fmt.Sprintf(`"leadtransferee":"%x"}`, s.LeadTransferee) + return []byte(j), nil +} + +func (s Status) String() string { + b, err := s.MarshalJSON() + if err != nil { + raftLogger.Panicf("unexpected error: %v", err) + } + return string(b) +} diff --git a/vendor/go.etcd.io/etcd/raft/storage.go b/vendor/go.etcd.io/etcd/raft/storage.go new file mode 100644 index 00000000..6be57459 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/storage.go @@ -0,0 +1,273 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import ( + "errors" + "sync" + + pb "go.etcd.io/etcd/raft/raftpb" +) + +// ErrCompacted is returned by Storage.Entries/Compact when a requested +// index is unavailable because it predates the last snapshot. +var ErrCompacted = errors.New("requested index is unavailable due to compaction") + +// ErrSnapOutOfDate is returned by Storage.CreateSnapshot when a requested +// index is older than the existing snapshot. +var ErrSnapOutOfDate = errors.New("requested index is older than the existing snapshot") + +// ErrUnavailable is returned by Storage interface when the requested log entries +// are unavailable. +var ErrUnavailable = errors.New("requested entry at index is unavailable") + +// ErrSnapshotTemporarilyUnavailable is returned by the Storage interface when the required +// snapshot is temporarily unavailable. +var ErrSnapshotTemporarilyUnavailable = errors.New("snapshot is temporarily unavailable") + +// Storage is an interface that may be implemented by the application +// to retrieve log entries from storage. +// +// If any Storage method returns an error, the raft instance will +// become inoperable and refuse to participate in elections; the +// application is responsible for cleanup and recovery in this case. +type Storage interface { + // TODO(tbg): split this into two interfaces, LogStorage and StateStorage. + + // InitialState returns the saved HardState and ConfState information. + InitialState() (pb.HardState, pb.ConfState, error) + // Entries returns a slice of log entries in the range [lo,hi). + // MaxSize limits the total size of the log entries returned, but + // Entries returns at least one entry if any. + Entries(lo, hi, maxSize uint64) ([]pb.Entry, error) + // Term returns the term of entry i, which must be in the range + // [FirstIndex()-1, LastIndex()]. The term of the entry before + // FirstIndex is retained for matching purposes even though the + // rest of that entry may not be available. + Term(i uint64) (uint64, error) + // LastIndex returns the index of the last entry in the log. + LastIndex() (uint64, error) + // FirstIndex returns the index of the first log entry that is + // possibly available via Entries (older entries have been incorporated + // into the latest Snapshot; if storage only contains the dummy entry the + // first log entry is not available). + FirstIndex() (uint64, error) + // Snapshot returns the most recent snapshot. + // If snapshot is temporarily unavailable, it should return ErrSnapshotTemporarilyUnavailable, + // so raft state machine could know that Storage needs some time to prepare + // snapshot and call Snapshot later. + Snapshot() (pb.Snapshot, error) +} + +// MemoryStorage implements the Storage interface backed by an +// in-memory array. +type MemoryStorage struct { + // Protects access to all fields. Most methods of MemoryStorage are + // run on the raft goroutine, but Append() is run on an application + // goroutine. + sync.Mutex + + hardState pb.HardState + snapshot pb.Snapshot + // ents[i] has raft log position i+snapshot.Metadata.Index + ents []pb.Entry +} + +// NewMemoryStorage creates an empty MemoryStorage. +func NewMemoryStorage() *MemoryStorage { + return &MemoryStorage{ + // When starting from scratch populate the list with a dummy entry at term zero. + ents: make([]pb.Entry, 1), + } +} + +// InitialState implements the Storage interface. +func (ms *MemoryStorage) InitialState() (pb.HardState, pb.ConfState, error) { + return ms.hardState, ms.snapshot.Metadata.ConfState, nil +} + +// SetHardState saves the current HardState. +func (ms *MemoryStorage) SetHardState(st pb.HardState) error { + ms.Lock() + defer ms.Unlock() + ms.hardState = st + return nil +} + +// Entries implements the Storage interface. +func (ms *MemoryStorage) Entries(lo, hi, maxSize uint64) ([]pb.Entry, error) { + ms.Lock() + defer ms.Unlock() + offset := ms.ents[0].Index + if lo <= offset { + return nil, ErrCompacted + } + if hi > ms.lastIndex()+1 { + raftLogger.Panicf("entries' hi(%d) is out of bound lastindex(%d)", hi, ms.lastIndex()) + } + // only contains dummy entries. + if len(ms.ents) == 1 { + return nil, ErrUnavailable + } + + ents := ms.ents[lo-offset : hi-offset] + return limitSize(ents, maxSize), nil +} + +// Term implements the Storage interface. +func (ms *MemoryStorage) Term(i uint64) (uint64, error) { + ms.Lock() + defer ms.Unlock() + offset := ms.ents[0].Index + if i < offset { + return 0, ErrCompacted + } + if int(i-offset) >= len(ms.ents) { + return 0, ErrUnavailable + } + return ms.ents[i-offset].Term, nil +} + +// LastIndex implements the Storage interface. +func (ms *MemoryStorage) LastIndex() (uint64, error) { + ms.Lock() + defer ms.Unlock() + return ms.lastIndex(), nil +} + +func (ms *MemoryStorage) lastIndex() uint64 { + return ms.ents[0].Index + uint64(len(ms.ents)) - 1 +} + +// FirstIndex implements the Storage interface. +func (ms *MemoryStorage) FirstIndex() (uint64, error) { + ms.Lock() + defer ms.Unlock() + return ms.firstIndex(), nil +} + +func (ms *MemoryStorage) firstIndex() uint64 { + return ms.ents[0].Index + 1 +} + +// Snapshot implements the Storage interface. +func (ms *MemoryStorage) Snapshot() (pb.Snapshot, error) { + ms.Lock() + defer ms.Unlock() + return ms.snapshot, nil +} + +// ApplySnapshot overwrites the contents of this Storage object with +// those of the given snapshot. +func (ms *MemoryStorage) ApplySnapshot(snap pb.Snapshot) error { + ms.Lock() + defer ms.Unlock() + + //handle check for old snapshot being applied + msIndex := ms.snapshot.Metadata.Index + snapIndex := snap.Metadata.Index + if msIndex >= snapIndex { + return ErrSnapOutOfDate + } + + ms.snapshot = snap + ms.ents = []pb.Entry{{Term: snap.Metadata.Term, Index: snap.Metadata.Index}} + return nil +} + +// CreateSnapshot makes a snapshot which can be retrieved with Snapshot() and +// can be used to reconstruct the state at that point. +// If any configuration changes have been made since the last compaction, +// the result of the last ApplyConfChange must be passed in. +func (ms *MemoryStorage) CreateSnapshot(i uint64, cs *pb.ConfState, data []byte) (pb.Snapshot, error) { + ms.Lock() + defer ms.Unlock() + if i <= ms.snapshot.Metadata.Index { + return pb.Snapshot{}, ErrSnapOutOfDate + } + + offset := ms.ents[0].Index + if i > ms.lastIndex() { + raftLogger.Panicf("snapshot %d is out of bound lastindex(%d)", i, ms.lastIndex()) + } + + ms.snapshot.Metadata.Index = i + ms.snapshot.Metadata.Term = ms.ents[i-offset].Term + if cs != nil { + ms.snapshot.Metadata.ConfState = *cs + } + ms.snapshot.Data = data + return ms.snapshot, nil +} + +// Compact discards all log entries prior to compactIndex. +// It is the application's responsibility to not attempt to compact an index +// greater than raftLog.applied. +func (ms *MemoryStorage) Compact(compactIndex uint64) error { + ms.Lock() + defer ms.Unlock() + offset := ms.ents[0].Index + if compactIndex <= offset { + return ErrCompacted + } + if compactIndex > ms.lastIndex() { + raftLogger.Panicf("compact %d is out of bound lastindex(%d)", compactIndex, ms.lastIndex()) + } + + i := compactIndex - offset + ents := make([]pb.Entry, 1, 1+uint64(len(ms.ents))-i) + ents[0].Index = ms.ents[i].Index + ents[0].Term = ms.ents[i].Term + ents = append(ents, ms.ents[i+1:]...) + ms.ents = ents + return nil +} + +// Append the new entries to storage. +// TODO (xiangli): ensure the entries are continuous and +// entries[0].Index > ms.entries[0].Index +func (ms *MemoryStorage) Append(entries []pb.Entry) error { + if len(entries) == 0 { + return nil + } + + ms.Lock() + defer ms.Unlock() + + first := ms.firstIndex() + last := entries[0].Index + uint64(len(entries)) - 1 + + // shortcut if there is no new entry. + if last < first { + return nil + } + // truncate compacted entries + if first > entries[0].Index { + entries = entries[first-entries[0].Index:] + } + + offset := entries[0].Index - ms.ents[0].Index + switch { + case uint64(len(ms.ents)) > offset: + ms.ents = append([]pb.Entry{}, ms.ents[:offset]...) + ms.ents = append(ms.ents, entries...) + case uint64(len(ms.ents)) == offset: + ms.ents = append(ms.ents, entries...) + default: + raftLogger.Panicf("missing log entry [last: %d, append at: %d]", + ms.lastIndex(), entries[0].Index) + } + return nil +} diff --git a/vendor/go.etcd.io/etcd/raft/tracker/inflights.go b/vendor/go.etcd.io/etcd/raft/tracker/inflights.go new file mode 100644 index 00000000..1a056341 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/tracker/inflights.go @@ -0,0 +1,132 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tracker + +// Inflights limits the number of MsgApp (represented by the largest index +// contained within) sent to followers but not yet acknowledged by them. Callers +// use Full() to check whether more messages can be sent, call Add() whenever +// they are sending a new append, and release "quota" via FreeLE() whenever an +// ack is received. +type Inflights struct { + // the starting index in the buffer + start int + // number of inflights in the buffer + count int + + // the size of the buffer + size int + + // buffer contains the index of the last entry + // inside one message. + buffer []uint64 +} + +// NewInflights sets up an Inflights that allows up to 'size' inflight messages. +func NewInflights(size int) *Inflights { + return &Inflights{ + size: size, + } +} + +// Clone returns an *Inflights that is identical to but shares no memory with +// the receiver. +func (in *Inflights) Clone() *Inflights { + ins := *in + ins.buffer = append([]uint64(nil), in.buffer...) + return &ins +} + +// Add notifies the Inflights that a new message with the given index is being +// dispatched. Full() must be called prior to Add() to verify that there is room +// for one more message, and consecutive calls to add Add() must provide a +// monotonic sequence of indexes. +func (in *Inflights) Add(inflight uint64) { + if in.Full() { + panic("cannot add into a Full inflights") + } + next := in.start + in.count + size := in.size + if next >= size { + next -= size + } + if next >= len(in.buffer) { + in.grow() + } + in.buffer[next] = inflight + in.count++ +} + +// grow the inflight buffer by doubling up to inflights.size. We grow on demand +// instead of preallocating to inflights.size to handle systems which have +// thousands of Raft groups per process. +func (in *Inflights) grow() { + newSize := len(in.buffer) * 2 + if newSize == 0 { + newSize = 1 + } else if newSize > in.size { + newSize = in.size + } + newBuffer := make([]uint64, newSize) + copy(newBuffer, in.buffer) + in.buffer = newBuffer +} + +// FreeLE frees the inflights smaller or equal to the given `to` flight. +func (in *Inflights) FreeLE(to uint64) { + if in.count == 0 || to < in.buffer[in.start] { + // out of the left side of the window + return + } + + idx := in.start + var i int + for i = 0; i < in.count; i++ { + if to < in.buffer[idx] { // found the first large inflight + break + } + + // increase index and maybe rotate + size := in.size + if idx++; idx >= size { + idx -= size + } + } + // free i inflights and set new start index + in.count -= i + in.start = idx + if in.count == 0 { + // inflights is empty, reset the start index so that we don't grow the + // buffer unnecessarily. + in.start = 0 + } +} + +// FreeFirstOne releases the first inflight. This is a no-op if nothing is +// inflight. +func (in *Inflights) FreeFirstOne() { in.FreeLE(in.buffer[in.start]) } + +// Full returns true if no more messages can be sent at the moment. +func (in *Inflights) Full() bool { + return in.count == in.size +} + +// Count returns the number of inflight messages. +func (in *Inflights) Count() int { return in.count } + +// reset frees all inflights. +func (in *Inflights) reset() { + in.count = 0 + in.start = 0 +} diff --git a/vendor/go.etcd.io/etcd/raft/tracker/progress.go b/vendor/go.etcd.io/etcd/raft/tracker/progress.go new file mode 100644 index 00000000..62c81f45 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/tracker/progress.go @@ -0,0 +1,259 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tracker + +import ( + "fmt" + "sort" + "strings" +) + +// Progress represents a follower’s progress in the view of the leader. Leader +// maintains progresses of all followers, and sends entries to the follower +// based on its progress. +// +// NB(tbg): Progress is basically a state machine whose transitions are mostly +// strewn around `*raft.raft`. Additionally, some fields are only used when in a +// certain State. All of this isn't ideal. +type Progress struct { + Match, Next uint64 + // State defines how the leader should interact with the follower. + // + // When in StateProbe, leader sends at most one replication message + // per heartbeat interval. It also probes actual progress of the follower. + // + // When in StateReplicate, leader optimistically increases next + // to the latest entry sent after sending replication message. This is + // an optimized state for fast replicating log entries to the follower. + // + // When in StateSnapshot, leader should have sent out snapshot + // before and stops sending any replication message. + State StateType + + // PendingSnapshot is used in StateSnapshot. + // If there is a pending snapshot, the pendingSnapshot will be set to the + // index of the snapshot. If pendingSnapshot is set, the replication process of + // this Progress will be paused. raft will not resend snapshot until the pending one + // is reported to be failed. + PendingSnapshot uint64 + + // RecentActive is true if the progress is recently active. Receiving any messages + // from the corresponding follower indicates the progress is active. + // RecentActive can be reset to false after an election timeout. + // + // TODO(tbg): the leader should always have this set to true. + RecentActive bool + + // ProbeSent is used while this follower is in StateProbe. When ProbeSent is + // true, raft should pause sending replication message to this peer until + // ProbeSent is reset. See ProbeAcked() and IsPaused(). + ProbeSent bool + + // Inflights is a sliding window for the inflight messages. + // Each inflight message contains one or more log entries. + // The max number of entries per message is defined in raft config as MaxSizePerMsg. + // Thus inflight effectively limits both the number of inflight messages + // and the bandwidth each Progress can use. + // When inflights is Full, no more message should be sent. + // When a leader sends out a message, the index of the last + // entry should be added to inflights. The index MUST be added + // into inflights in order. + // When a leader receives a reply, the previous inflights should + // be freed by calling inflights.FreeLE with the index of the last + // received entry. + Inflights *Inflights + + // IsLearner is true if this progress is tracked for a learner. + IsLearner bool +} + +// ResetState moves the Progress into the specified State, resetting ProbeSent, +// PendingSnapshot, and Inflights. +func (pr *Progress) ResetState(state StateType) { + pr.ProbeSent = false + pr.PendingSnapshot = 0 + pr.State = state + pr.Inflights.reset() +} + +func max(a, b uint64) uint64 { + if a > b { + return a + } + return b +} + +func min(a, b uint64) uint64 { + if a > b { + return b + } + return a +} + +// ProbeAcked is called when this peer has accepted an append. It resets +// ProbeSent to signal that additional append messages should be sent without +// further delay. +func (pr *Progress) ProbeAcked() { + pr.ProbeSent = false +} + +// BecomeProbe transitions into StateProbe. Next is reset to Match+1 or, +// optionally and if larger, the index of the pending snapshot. +func (pr *Progress) BecomeProbe() { + // If the original state is StateSnapshot, progress knows that + // the pending snapshot has been sent to this peer successfully, then + // probes from pendingSnapshot + 1. + if pr.State == StateSnapshot { + pendingSnapshot := pr.PendingSnapshot + pr.ResetState(StateProbe) + pr.Next = max(pr.Match+1, pendingSnapshot+1) + } else { + pr.ResetState(StateProbe) + pr.Next = pr.Match + 1 + } +} + +// BecomeReplicate transitions into StateReplicate, resetting Next to Match+1. +func (pr *Progress) BecomeReplicate() { + pr.ResetState(StateReplicate) + pr.Next = pr.Match + 1 +} + +// BecomeSnapshot moves the Progress to StateSnapshot with the specified pending +// snapshot index. +func (pr *Progress) BecomeSnapshot(snapshoti uint64) { + pr.ResetState(StateSnapshot) + pr.PendingSnapshot = snapshoti +} + +// MaybeUpdate is called when an MsgAppResp arrives from the follower, with the +// index acked by it. The method returns false if the given n index comes from +// an outdated message. Otherwise it updates the progress and returns true. +func (pr *Progress) MaybeUpdate(n uint64) bool { + var updated bool + if pr.Match < n { + pr.Match = n + updated = true + pr.ProbeAcked() + } + if pr.Next < n+1 { + pr.Next = n + 1 + } + return updated +} + +// OptimisticUpdate signals that appends all the way up to and including index n +// are in-flight. As a result, Next is increased to n+1. +func (pr *Progress) OptimisticUpdate(n uint64) { pr.Next = n + 1 } + +// MaybeDecrTo adjusts the Progress to the receipt of a MsgApp rejection. The +// arguments are the index the follower rejected to append to its log, and its +// last index. +// +// Rejections can happen spuriously as messages are sent out of order or +// duplicated. In such cases, the rejection pertains to an index that the +// Progress already knows were previously acknowledged, and false is returned +// without changing the Progress. +// +// If the rejection is genuine, Next is lowered sensibly, and the Progress is +// cleared for sending log entries. +func (pr *Progress) MaybeDecrTo(rejected, last uint64) bool { + if pr.State == StateReplicate { + // The rejection must be stale if the progress has matched and "rejected" + // is smaller than "match". + if rejected <= pr.Match { + return false + } + // Directly decrease next to match + 1. + // + // TODO(tbg): why not use last if it's larger? + pr.Next = pr.Match + 1 + return true + } + + // The rejection must be stale if "rejected" does not match next - 1. This + // is because non-replicating followers are probed one entry at a time. + if pr.Next-1 != rejected { + return false + } + + if pr.Next = min(rejected, last+1); pr.Next < 1 { + pr.Next = 1 + } + pr.ProbeSent = false + return true +} + +// IsPaused returns whether sending log entries to this node has been throttled. +// This is done when a node has rejected recent MsgApps, is currently waiting +// for a snapshot, or has reached the MaxInflightMsgs limit. In normal +// operation, this is false. A throttled node will be contacted less frequently +// until it has reached a state in which it's able to accept a steady stream of +// log entries again. +func (pr *Progress) IsPaused() bool { + switch pr.State { + case StateProbe: + return pr.ProbeSent + case StateReplicate: + return pr.Inflights.Full() + case StateSnapshot: + return true + default: + panic("unexpected state") + } +} + +func (pr *Progress) String() string { + var buf strings.Builder + fmt.Fprintf(&buf, "%s match=%d next=%d", pr.State, pr.Match, pr.Next) + if pr.IsLearner { + fmt.Fprint(&buf, " learner") + } + if pr.IsPaused() { + fmt.Fprint(&buf, " paused") + } + if pr.PendingSnapshot > 0 { + fmt.Fprintf(&buf, " pendingSnap=%d", pr.PendingSnapshot) + } + if !pr.RecentActive { + fmt.Fprintf(&buf, " inactive") + } + if n := pr.Inflights.Count(); n > 0 { + fmt.Fprintf(&buf, " inflight=%d", n) + if pr.Inflights.Full() { + fmt.Fprint(&buf, "[full]") + } + } + return buf.String() +} + +// ProgressMap is a map of *Progress. +type ProgressMap map[uint64]*Progress + +// String prints the ProgressMap in sorted key order, one Progress per line. +func (m ProgressMap) String() string { + ids := make([]uint64, 0, len(m)) + for k := range m { + ids = append(ids, k) + } + sort.Slice(ids, func(i, j int) bool { + return ids[i] < ids[j] + }) + var buf strings.Builder + for _, id := range ids { + fmt.Fprintf(&buf, "%d: %s\n", id, m[id]) + } + return buf.String() +} diff --git a/vendor/go.etcd.io/etcd/raft/tracker/state.go b/vendor/go.etcd.io/etcd/raft/tracker/state.go new file mode 100644 index 00000000..285b4b8f --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/tracker/state.go @@ -0,0 +1,42 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tracker + +// StateType is the state of a tracked follower. +type StateType uint64 + +const ( + // StateProbe indicates a follower whose last index isn't known. Such a + // follower is "probed" (i.e. an append sent periodically) to narrow down + // its last index. In the ideal (and common) case, only one round of probing + // is necessary as the follower will react with a hint. Followers that are + // probed over extended periods of time are often offline. + StateProbe StateType = iota + // StateReplicate is the state steady in which a follower eagerly receives + // log entries to append to its log. + StateReplicate + // StateSnapshot indicates a follower that needs log entries not available + // from the leader's Raft log. Such a follower needs a full snapshot to + // return to StateReplicate. + StateSnapshot +) + +var prstmap = [...]string{ + "StateProbe", + "StateReplicate", + "StateSnapshot", +} + +func (st StateType) String() string { return prstmap[uint64(st)] } diff --git a/vendor/go.etcd.io/etcd/raft/tracker/tracker.go b/vendor/go.etcd.io/etcd/raft/tracker/tracker.go new file mode 100644 index 00000000..a4581143 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/tracker/tracker.go @@ -0,0 +1,288 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tracker + +import ( + "fmt" + "sort" + "strings" + + "go.etcd.io/etcd/raft/quorum" + pb "go.etcd.io/etcd/raft/raftpb" +) + +// Config reflects the configuration tracked in a ProgressTracker. +type Config struct { + Voters quorum.JointConfig + // AutoLeave is true if the configuration is joint and a transition to the + // incoming configuration should be carried out automatically by Raft when + // this is possible. If false, the configuration will be joint until the + // application initiates the transition manually. + AutoLeave bool + // Learners is a set of IDs corresponding to the learners active in the + // current configuration. + // + // Invariant: Learners and Voters does not intersect, i.e. if a peer is in + // either half of the joint config, it can't be a learner; if it is a + // learner it can't be in either half of the joint config. This invariant + // simplifies the implementation since it allows peers to have clarity about + // its current role without taking into account joint consensus. + Learners map[uint64]struct{} + // When we turn a voter into a learner during a joint consensus transition, + // we cannot add the learner directly when entering the joint state. This is + // because this would violate the invariant that the intersection of + // voters and learners is empty. For example, assume a Voter is removed and + // immediately re-added as a learner (or in other words, it is demoted): + // + // Initially, the configuration will be + // + // voters: {1 2 3} + // learners: {} + // + // and we want to demote 3. Entering the joint configuration, we naively get + // + // voters: {1 2} & {1 2 3} + // learners: {3} + // + // but this violates the invariant (3 is both voter and learner). Instead, + // we get + // + // voters: {1 2} & {1 2 3} + // learners: {} + // next_learners: {3} + // + // Where 3 is now still purely a voter, but we are remembering the intention + // to make it a learner upon transitioning into the final configuration: + // + // voters: {1 2} + // learners: {3} + // next_learners: {} + // + // Note that next_learners is not used while adding a learner that is not + // also a voter in the joint config. In this case, the learner is added + // right away when entering the joint configuration, so that it is caught up + // as soon as possible. + LearnersNext map[uint64]struct{} +} + +func (c Config) String() string { + var buf strings.Builder + fmt.Fprintf(&buf, "voters=%s", c.Voters) + if c.Learners != nil { + fmt.Fprintf(&buf, " learners=%s", quorum.MajorityConfig(c.Learners).String()) + } + if c.LearnersNext != nil { + fmt.Fprintf(&buf, " learners_next=%s", quorum.MajorityConfig(c.LearnersNext).String()) + } + if c.AutoLeave { + fmt.Fprintf(&buf, " autoleave") + } + return buf.String() +} + +// Clone returns a copy of the Config that shares no memory with the original. +func (c *Config) Clone() Config { + clone := func(m map[uint64]struct{}) map[uint64]struct{} { + if m == nil { + return nil + } + mm := make(map[uint64]struct{}, len(m)) + for k := range m { + mm[k] = struct{}{} + } + return mm + } + return Config{ + Voters: quorum.JointConfig{clone(c.Voters[0]), clone(c.Voters[1])}, + Learners: clone(c.Learners), + LearnersNext: clone(c.LearnersNext), + } +} + +// ProgressTracker tracks the currently active configuration and the information +// known about the nodes and learners in it. In particular, it tracks the match +// index for each peer which in turn allows reasoning about the committed index. +type ProgressTracker struct { + Config + + Progress ProgressMap + + Votes map[uint64]bool + + MaxInflight int +} + +// MakeProgressTracker initializes a ProgressTracker. +func MakeProgressTracker(maxInflight int) ProgressTracker { + p := ProgressTracker{ + MaxInflight: maxInflight, + Config: Config{ + Voters: quorum.JointConfig{ + quorum.MajorityConfig{}, + nil, // only populated when used + }, + Learners: nil, // only populated when used + LearnersNext: nil, // only populated when used + }, + Votes: map[uint64]bool{}, + Progress: map[uint64]*Progress{}, + } + return p +} + +// ConfState returns a ConfState representing the active configuration. +func (p *ProgressTracker) ConfState() pb.ConfState { + return pb.ConfState{ + Voters: p.Voters[0].Slice(), + VotersOutgoing: p.Voters[1].Slice(), + Learners: quorum.MajorityConfig(p.Learners).Slice(), + LearnersNext: quorum.MajorityConfig(p.LearnersNext).Slice(), + AutoLeave: p.AutoLeave, + } +} + +// IsSingleton returns true if (and only if) there is only one voting member +// (i.e. the leader) in the current configuration. +func (p *ProgressTracker) IsSingleton() bool { + return len(p.Voters[0]) == 1 && len(p.Voters[1]) == 0 +} + +type matchAckIndexer map[uint64]*Progress + +var _ quorum.AckedIndexer = matchAckIndexer(nil) + +// AckedIndex implements IndexLookuper. +func (l matchAckIndexer) AckedIndex(id uint64) (quorum.Index, bool) { + pr, ok := l[id] + if !ok { + return 0, false + } + return quorum.Index(pr.Match), true +} + +// Committed returns the largest log index known to be committed based on what +// the voting members of the group have acknowledged. +func (p *ProgressTracker) Committed() uint64 { + return uint64(p.Voters.CommittedIndex(matchAckIndexer(p.Progress))) +} + +func insertionSort(sl []uint64) { + a, b := 0, len(sl) + for i := a + 1; i < b; i++ { + for j := i; j > a && sl[j] < sl[j-1]; j-- { + sl[j], sl[j-1] = sl[j-1], sl[j] + } + } +} + +// Visit invokes the supplied closure for all tracked progresses in stable order. +func (p *ProgressTracker) Visit(f func(id uint64, pr *Progress)) { + n := len(p.Progress) + // We need to sort the IDs and don't want to allocate since this is hot code. + // The optimization here mirrors that in `(MajorityConfig).CommittedIndex`, + // see there for details. + var sl [7]uint64 + ids := sl[:] + if len(sl) >= n { + ids = sl[:n] + } else { + ids = make([]uint64, n) + } + for id := range p.Progress { + n-- + ids[n] = id + } + insertionSort(ids) + for _, id := range ids { + f(id, p.Progress[id]) + } +} + +// QuorumActive returns true if the quorum is active from the view of the local +// raft state machine. Otherwise, it returns false. +func (p *ProgressTracker) QuorumActive() bool { + votes := map[uint64]bool{} + p.Visit(func(id uint64, pr *Progress) { + if pr.IsLearner { + return + } + votes[id] = pr.RecentActive + }) + + return p.Voters.VoteResult(votes) == quorum.VoteWon +} + +// VoterNodes returns a sorted slice of voters. +func (p *ProgressTracker) VoterNodes() []uint64 { + m := p.Voters.IDs() + nodes := make([]uint64, 0, len(m)) + for id := range m { + nodes = append(nodes, id) + } + sort.Slice(nodes, func(i, j int) bool { return nodes[i] < nodes[j] }) + return nodes +} + +// LearnerNodes returns a sorted slice of learners. +func (p *ProgressTracker) LearnerNodes() []uint64 { + if len(p.Learners) == 0 { + return nil + } + nodes := make([]uint64, 0, len(p.Learners)) + for id := range p.Learners { + nodes = append(nodes, id) + } + sort.Slice(nodes, func(i, j int) bool { return nodes[i] < nodes[j] }) + return nodes +} + +// ResetVotes prepares for a new round of vote counting via recordVote. +func (p *ProgressTracker) ResetVotes() { + p.Votes = map[uint64]bool{} +} + +// RecordVote records that the node with the given id voted for this Raft +// instance if v == true (and declined it otherwise). +func (p *ProgressTracker) RecordVote(id uint64, v bool) { + _, ok := p.Votes[id] + if !ok { + p.Votes[id] = v + } +} + +// TallyVotes returns the number of granted and rejected Votes, and whether the +// election outcome is known. +func (p *ProgressTracker) TallyVotes() (granted int, rejected int, _ quorum.VoteResult) { + // Make sure to populate granted/rejected correctly even if the Votes slice + // contains members no longer part of the configuration. This doesn't really + // matter in the way the numbers are used (they're informational), but might + // as well get it right. + for id, pr := range p.Progress { + if pr.IsLearner { + continue + } + v, voted := p.Votes[id] + if !voted { + continue + } + if v { + granted++ + } else { + rejected++ + } + } + result := p.Voters.VoteResult(p.Votes) + return granted, rejected, result +} diff --git a/vendor/go.etcd.io/etcd/raft/util.go b/vendor/go.etcd.io/etcd/raft/util.go new file mode 100644 index 00000000..785cf735 --- /dev/null +++ b/vendor/go.etcd.io/etcd/raft/util.go @@ -0,0 +1,233 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package raft + +import ( + "bytes" + "fmt" + "strings" + + pb "go.etcd.io/etcd/raft/raftpb" +) + +func (st StateType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf("%q", st.String())), nil +} + +func min(a, b uint64) uint64 { + if a > b { + return b + } + return a +} + +func max(a, b uint64) uint64 { + if a > b { + return a + } + return b +} + +func IsLocalMsg(msgt pb.MessageType) bool { + return msgt == pb.MsgHup || msgt == pb.MsgBeat || msgt == pb.MsgUnreachable || + msgt == pb.MsgSnapStatus || msgt == pb.MsgCheckQuorum +} + +func IsResponseMsg(msgt pb.MessageType) bool { + return msgt == pb.MsgAppResp || msgt == pb.MsgVoteResp || msgt == pb.MsgHeartbeatResp || msgt == pb.MsgUnreachable || msgt == pb.MsgPreVoteResp +} + +// voteResponseType maps vote and prevote message types to their corresponding responses. +func voteRespMsgType(msgt pb.MessageType) pb.MessageType { + switch msgt { + case pb.MsgVote: + return pb.MsgVoteResp + case pb.MsgPreVote: + return pb.MsgPreVoteResp + default: + panic(fmt.Sprintf("not a vote message: %s", msgt)) + } +} + +func DescribeHardState(hs pb.HardState) string { + var buf strings.Builder + fmt.Fprintf(&buf, "Term:%d", hs.Term) + if hs.Vote != 0 { + fmt.Fprintf(&buf, " Vote:%d", hs.Vote) + } + fmt.Fprintf(&buf, " Commit:%d", hs.Commit) + return buf.String() +} + +func DescribeSoftState(ss SoftState) string { + return fmt.Sprintf("Lead:%d State:%s", ss.Lead, ss.RaftState) +} + +func DescribeConfState(state pb.ConfState) string { + return fmt.Sprintf( + "Voters:%v VotersOutgoing:%v Learners:%v LearnersNext:%v AutoLeave:%v", + state.Voters, state.VotersOutgoing, state.Learners, state.LearnersNext, state.AutoLeave, + ) +} + +func DescribeSnapshot(snap pb.Snapshot) string { + m := snap.Metadata + return fmt.Sprintf("Index:%d Term:%d ConfState:%s", m.Index, m.Term, DescribeConfState(m.ConfState)) +} + +func DescribeReady(rd Ready, f EntryFormatter) string { + var buf strings.Builder + if rd.SoftState != nil { + fmt.Fprint(&buf, DescribeSoftState(*rd.SoftState)) + buf.WriteByte('\n') + } + if !IsEmptyHardState(rd.HardState) { + fmt.Fprintf(&buf, "HardState %s", DescribeHardState(rd.HardState)) + buf.WriteByte('\n') + } + if len(rd.ReadStates) > 0 { + fmt.Fprintf(&buf, "ReadStates %v\n", rd.ReadStates) + } + if len(rd.Entries) > 0 { + buf.WriteString("Entries:\n") + fmt.Fprint(&buf, DescribeEntries(rd.Entries, f)) + } + if !IsEmptySnap(rd.Snapshot) { + fmt.Fprintf(&buf, "Snapshot %s\n", DescribeSnapshot(rd.Snapshot)) + } + if len(rd.CommittedEntries) > 0 { + buf.WriteString("CommittedEntries:\n") + fmt.Fprint(&buf, DescribeEntries(rd.CommittedEntries, f)) + } + if len(rd.Messages) > 0 { + buf.WriteString("Messages:\n") + for _, msg := range rd.Messages { + fmt.Fprint(&buf, DescribeMessage(msg, f)) + buf.WriteByte('\n') + } + } + if buf.Len() > 0 { + return fmt.Sprintf("Ready MustSync=%t:\n%s", rd.MustSync, buf.String()) + } + return "" +} + +// EntryFormatter can be implemented by the application to provide human-readable formatting +// of entry data. Nil is a valid EntryFormatter and will use a default format. +type EntryFormatter func([]byte) string + +// DescribeMessage returns a concise human-readable description of a +// Message for debugging. +func DescribeMessage(m pb.Message, f EntryFormatter) string { + var buf bytes.Buffer + fmt.Fprintf(&buf, "%x->%x %v Term:%d Log:%d/%d", m.From, m.To, m.Type, m.Term, m.LogTerm, m.Index) + if m.Reject { + fmt.Fprintf(&buf, " Rejected (Hint: %d)", m.RejectHint) + } + if m.Commit != 0 { + fmt.Fprintf(&buf, " Commit:%d", m.Commit) + } + if len(m.Entries) > 0 { + fmt.Fprintf(&buf, " Entries:[") + for i, e := range m.Entries { + if i != 0 { + buf.WriteString(", ") + } + buf.WriteString(DescribeEntry(e, f)) + } + fmt.Fprintf(&buf, "]") + } + if !IsEmptySnap(m.Snapshot) { + fmt.Fprintf(&buf, " Snapshot: %s", DescribeSnapshot(m.Snapshot)) + } + return buf.String() +} + +// PayloadSize is the size of the payload of this Entry. Notably, it does not +// depend on its Index or Term. +func PayloadSize(e pb.Entry) int { + return len(e.Data) +} + +// DescribeEntry returns a concise human-readable description of an +// Entry for debugging. +func DescribeEntry(e pb.Entry, f EntryFormatter) string { + if f == nil { + f = func(data []byte) string { return fmt.Sprintf("%q", data) } + } + + formatConfChange := func(cc pb.ConfChangeI) string { + // TODO(tbg): give the EntryFormatter a type argument so that it gets + // a chance to expose the Context. + return pb.ConfChangesToString(cc.AsV2().Changes) + } + + var formatted string + switch e.Type { + case pb.EntryNormal: + formatted = f(e.Data) + case pb.EntryConfChange: + var cc pb.ConfChange + if err := cc.Unmarshal(e.Data); err != nil { + formatted = err.Error() + } else { + formatted = formatConfChange(cc) + } + case pb.EntryConfChangeV2: + var cc pb.ConfChangeV2 + if err := cc.Unmarshal(e.Data); err != nil { + formatted = err.Error() + } else { + formatted = formatConfChange(cc) + } + } + if formatted != "" { + formatted = " " + formatted + } + return fmt.Sprintf("%d/%d %s%s", e.Term, e.Index, e.Type, formatted) +} + +// DescribeEntries calls DescribeEntry for each Entry, adding a newline to +// each. +func DescribeEntries(ents []pb.Entry, f EntryFormatter) string { + var buf bytes.Buffer + for _, e := range ents { + _, _ = buf.WriteString(DescribeEntry(e, f) + "\n") + } + return buf.String() +} + +func limitSize(ents []pb.Entry, maxSize uint64) []pb.Entry { + if len(ents) == 0 { + return ents + } + size := ents[0].Size() + var limit int + for limit = 1; limit < len(ents); limit++ { + size += ents[limit].Size() + if uint64(size) > maxSize { + break + } + } + return ents[:limit] +} + +func assertConfStatesEquivalent(l Logger, cs1, cs2 pb.ConfState) { + err := cs1.Equivalent(cs2) + if err == nil { + return + } + l.Panic(err) +} diff --git a/vendor/go.etcd.io/etcd/version/version.go b/vendor/go.etcd.io/etcd/version/version.go new file mode 100644 index 00000000..ee97e461 --- /dev/null +++ b/vendor/go.etcd.io/etcd/version/version.go @@ -0,0 +1,56 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package version implements etcd version parsing and contains latest version +// information. +package version + +import ( + "fmt" + "strings" + + "github.com/coreos/go-semver/semver" +) + +var ( + // MinClusterVersion is the min cluster version this etcd binary is compatible with. + MinClusterVersion = "3.0.0" + Version = "3.4.13" + APIVersion = "unknown" + + // Git SHA Value will be set during build + GitSHA = "Not provided (use ./build instead of go build)" +) + +func init() { + ver, err := semver.NewVersion(Version) + if err == nil { + APIVersion = fmt.Sprintf("%d.%d", ver.Major, ver.Minor) + } +} + +type Versions struct { + Server string `json:"etcdserver"` + Cluster string `json:"etcdcluster"` + // TODO: raft state machine version +} + +// Cluster only keeps the major.minor. +func Cluster(v string) string { + vs := strings.Split(v, ".") + if len(vs) <= 2 { + return v + } + return fmt.Sprintf("%s.%s", vs[0], vs[1]) +} diff --git a/vendor/go.uber.org/atomic/.codecov.yml b/vendor/go.uber.org/atomic/.codecov.yml new file mode 100644 index 00000000..6d4d1be7 --- /dev/null +++ b/vendor/go.uber.org/atomic/.codecov.yml @@ -0,0 +1,15 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 100 # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure + diff --git a/vendor/go.uber.org/atomic/.gitignore b/vendor/go.uber.org/atomic/.gitignore new file mode 100644 index 00000000..c3fa2538 --- /dev/null +++ b/vendor/go.uber.org/atomic/.gitignore @@ -0,0 +1,12 @@ +/bin +.DS_Store +/vendor +cover.html +cover.out +lint.log + +# Binaries +*.test + +# Profiling output +*.prof diff --git a/vendor/go.uber.org/atomic/.travis.yml b/vendor/go.uber.org/atomic/.travis.yml new file mode 100644 index 00000000..4e73268b --- /dev/null +++ b/vendor/go.uber.org/atomic/.travis.yml @@ -0,0 +1,27 @@ +sudo: false +language: go +go_import_path: go.uber.org/atomic + +env: + global: + - GO111MODULE=on + +matrix: + include: + - go: 1.12.x + - go: 1.13.x + env: LINT=1 + +cache: + directories: + - vendor + +before_install: + - go version + +script: + - test -z "$LINT" || make lint + - make cover + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/go.uber.org/atomic/CHANGELOG.md b/vendor/go.uber.org/atomic/CHANGELOG.md new file mode 100644 index 00000000..aef8b6eb --- /dev/null +++ b/vendor/go.uber.org/atomic/CHANGELOG.md @@ -0,0 +1,64 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.6.0] - 2020-02-24 +### Changed +- Drop library dependency on `golang.org/x/{lint, tools}`. + +## [1.5.1] - 2019-11-19 +- Fix bug where `Bool.CAS` and `Bool.Toggle` do work correctly together + causing `CAS` to fail even though the old value matches. + +## [1.5.0] - 2019-10-29 +### Changed +- With Go modules, only the `go.uber.org/atomic` import path is supported now. + If you need to use the old import path, please add a `replace` directive to + your `go.mod`. + +## [1.4.0] - 2019-05-01 +### Added + - Add `atomic.Error` type for atomic operations on `error` values. + +## [1.3.2] - 2018-05-02 +### Added +- Add `atomic.Duration` type for atomic operations on `time.Duration` values. + +## [1.3.1] - 2017-11-14 +### Fixed +- Revert optimization for `atomic.String.Store("")` which caused data races. + +## [1.3.0] - 2017-11-13 +### Added +- Add `atomic.Bool.CAS` for compare-and-swap semantics on bools. + +### Changed +- Optimize `atomic.String.Store("")` by avoiding an allocation. + +## [1.2.0] - 2017-04-12 +### Added +- Shadow `atomic.Value` from `sync/atomic`. + +## [1.1.0] - 2017-03-10 +### Added +- Add atomic `Float64` type. + +### Changed +- Support new `go.uber.org/atomic` import path. + +## [1.0.0] - 2016-07-18 + +- Initial release. + +[1.6.0]: https://github.com/uber-go/atomic/compare/v1.5.1...v1.6.0 +[1.5.1]: https://github.com/uber-go/atomic/compare/v1.5.0...v1.5.1 +[1.5.0]: https://github.com/uber-go/atomic/compare/v1.4.0...v1.5.0 +[1.4.0]: https://github.com/uber-go/atomic/compare/v1.3.2...v1.4.0 +[1.3.2]: https://github.com/uber-go/atomic/compare/v1.3.1...v1.3.2 +[1.3.1]: https://github.com/uber-go/atomic/compare/v1.3.0...v1.3.1 +[1.3.0]: https://github.com/uber-go/atomic/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/uber-go/atomic/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/uber-go/atomic/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/uber-go/atomic/releases/tag/v1.0.0 diff --git a/vendor/go.uber.org/atomic/LICENSE.txt b/vendor/go.uber.org/atomic/LICENSE.txt new file mode 100644 index 00000000..8765c9fb --- /dev/null +++ b/vendor/go.uber.org/atomic/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2016 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/go.uber.org/atomic/Makefile b/vendor/go.uber.org/atomic/Makefile new file mode 100644 index 00000000..39af0fb6 --- /dev/null +++ b/vendor/go.uber.org/atomic/Makefile @@ -0,0 +1,35 @@ +# Directory to place `go install`ed binaries into. +export GOBIN ?= $(shell pwd)/bin + +GOLINT = $(GOBIN)/golint + +GO_FILES ?= *.go + +.PHONY: build +build: + go build ./... + +.PHONY: test +test: + go test -race ./... + +.PHONY: gofmt +gofmt: + $(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX)) + gofmt -e -s -l $(GO_FILES) > $(FMT_LOG) || true + @[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" && cat $(FMT_LOG) && false) + +$(GOLINT): + go install golang.org/x/lint/golint + +.PHONY: golint +golint: $(GOLINT) + $(GOLINT) ./... + +.PHONY: lint +lint: gofmt golint + +.PHONY: cover +cover: + go test -coverprofile=cover.out -coverpkg ./... -v ./... + go tool cover -html=cover.out -o cover.html diff --git a/vendor/go.uber.org/atomic/README.md b/vendor/go.uber.org/atomic/README.md new file mode 100644 index 00000000..ade0c20f --- /dev/null +++ b/vendor/go.uber.org/atomic/README.md @@ -0,0 +1,63 @@ +# atomic [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][reportcard-img]][reportcard] + +Simple wrappers for primitive types to enforce atomic access. + +## Installation + +```shell +$ go get -u go.uber.org/atomic@v1 +``` + +### Legacy Import Path + +As of v1.5.0, the import path `go.uber.org/atomic` is the only supported way +of using this package. If you are using Go modules, this package will fail to +compile with the legacy import path path `github.com/uber-go/atomic`. + +We recommend migrating your code to the new import path but if you're unable +to do so, or if your dependencies are still using the old import path, you +will have to add a `replace` directive to your `go.mod` file downgrading the +legacy import path to an older version. + +``` +replace github.com/uber-go/atomic => github.com/uber-go/atomic v1.4.0 +``` + +You can do so automatically by running the following command. + +```shell +$ go mod edit -replace github.com/uber-go/atomic=github.com/uber-go/atomic@v1.4.0 +``` + +## Usage + +The standard library's `sync/atomic` is powerful, but it's easy to forget which +variables must be accessed atomically. `go.uber.org/atomic` preserves all the +functionality of the standard library, but wraps the primitive types to +provide a safer, more convenient API. + +```go +var atom atomic.Uint32 +atom.Store(42) +atom.Sub(2) +atom.CAS(40, 11) +``` + +See the [documentation][doc] for a complete API specification. + +## Development Status + +Stable. + +--- + +Released under the [MIT License](LICENSE.txt). + +[doc-img]: https://godoc.org/github.com/uber-go/atomic?status.svg +[doc]: https://godoc.org/go.uber.org/atomic +[ci-img]: https://travis-ci.com/uber-go/atomic.svg?branch=master +[ci]: https://travis-ci.com/uber-go/atomic +[cov-img]: https://codecov.io/gh/uber-go/atomic/branch/master/graph/badge.svg +[cov]: https://codecov.io/gh/uber-go/atomic +[reportcard-img]: https://goreportcard.com/badge/go.uber.org/atomic +[reportcard]: https://goreportcard.com/report/go.uber.org/atomic diff --git a/vendor/go.uber.org/atomic/atomic.go b/vendor/go.uber.org/atomic/atomic.go new file mode 100644 index 00000000..ad5fa098 --- /dev/null +++ b/vendor/go.uber.org/atomic/atomic.go @@ -0,0 +1,356 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package atomic provides simple wrappers around numerics to enforce atomic +// access. +package atomic + +import ( + "math" + "sync/atomic" + "time" +) + +// Int32 is an atomic wrapper around an int32. +type Int32 struct{ v int32 } + +// NewInt32 creates an Int32. +func NewInt32(i int32) *Int32 { + return &Int32{i} +} + +// Load atomically loads the wrapped value. +func (i *Int32) Load() int32 { + return atomic.LoadInt32(&i.v) +} + +// Add atomically adds to the wrapped int32 and returns the new value. +func (i *Int32) Add(n int32) int32 { + return atomic.AddInt32(&i.v, n) +} + +// Sub atomically subtracts from the wrapped int32 and returns the new value. +func (i *Int32) Sub(n int32) int32 { + return atomic.AddInt32(&i.v, -n) +} + +// Inc atomically increments the wrapped int32 and returns the new value. +func (i *Int32) Inc() int32 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int32 and returns the new value. +func (i *Int32) Dec() int32 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Int32) CAS(old, new int32) bool { + return atomic.CompareAndSwapInt32(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Int32) Store(n int32) { + atomic.StoreInt32(&i.v, n) +} + +// Swap atomically swaps the wrapped int32 and returns the old value. +func (i *Int32) Swap(n int32) int32 { + return atomic.SwapInt32(&i.v, n) +} + +// Int64 is an atomic wrapper around an int64. +type Int64 struct{ v int64 } + +// NewInt64 creates an Int64. +func NewInt64(i int64) *Int64 { + return &Int64{i} +} + +// Load atomically loads the wrapped value. +func (i *Int64) Load() int64 { + return atomic.LoadInt64(&i.v) +} + +// Add atomically adds to the wrapped int64 and returns the new value. +func (i *Int64) Add(n int64) int64 { + return atomic.AddInt64(&i.v, n) +} + +// Sub atomically subtracts from the wrapped int64 and returns the new value. +func (i *Int64) Sub(n int64) int64 { + return atomic.AddInt64(&i.v, -n) +} + +// Inc atomically increments the wrapped int64 and returns the new value. +func (i *Int64) Inc() int64 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int64 and returns the new value. +func (i *Int64) Dec() int64 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Int64) CAS(old, new int64) bool { + return atomic.CompareAndSwapInt64(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Int64) Store(n int64) { + atomic.StoreInt64(&i.v, n) +} + +// Swap atomically swaps the wrapped int64 and returns the old value. +func (i *Int64) Swap(n int64) int64 { + return atomic.SwapInt64(&i.v, n) +} + +// Uint32 is an atomic wrapper around an uint32. +type Uint32 struct{ v uint32 } + +// NewUint32 creates a Uint32. +func NewUint32(i uint32) *Uint32 { + return &Uint32{i} +} + +// Load atomically loads the wrapped value. +func (i *Uint32) Load() uint32 { + return atomic.LoadUint32(&i.v) +} + +// Add atomically adds to the wrapped uint32 and returns the new value. +func (i *Uint32) Add(n uint32) uint32 { + return atomic.AddUint32(&i.v, n) +} + +// Sub atomically subtracts from the wrapped uint32 and returns the new value. +func (i *Uint32) Sub(n uint32) uint32 { + return atomic.AddUint32(&i.v, ^(n - 1)) +} + +// Inc atomically increments the wrapped uint32 and returns the new value. +func (i *Uint32) Inc() uint32 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped int32 and returns the new value. +func (i *Uint32) Dec() uint32 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Uint32) CAS(old, new uint32) bool { + return atomic.CompareAndSwapUint32(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Uint32) Store(n uint32) { + atomic.StoreUint32(&i.v, n) +} + +// Swap atomically swaps the wrapped uint32 and returns the old value. +func (i *Uint32) Swap(n uint32) uint32 { + return atomic.SwapUint32(&i.v, n) +} + +// Uint64 is an atomic wrapper around a uint64. +type Uint64 struct{ v uint64 } + +// NewUint64 creates a Uint64. +func NewUint64(i uint64) *Uint64 { + return &Uint64{i} +} + +// Load atomically loads the wrapped value. +func (i *Uint64) Load() uint64 { + return atomic.LoadUint64(&i.v) +} + +// Add atomically adds to the wrapped uint64 and returns the new value. +func (i *Uint64) Add(n uint64) uint64 { + return atomic.AddUint64(&i.v, n) +} + +// Sub atomically subtracts from the wrapped uint64 and returns the new value. +func (i *Uint64) Sub(n uint64) uint64 { + return atomic.AddUint64(&i.v, ^(n - 1)) +} + +// Inc atomically increments the wrapped uint64 and returns the new value. +func (i *Uint64) Inc() uint64 { + return i.Add(1) +} + +// Dec atomically decrements the wrapped uint64 and returns the new value. +func (i *Uint64) Dec() uint64 { + return i.Sub(1) +} + +// CAS is an atomic compare-and-swap. +func (i *Uint64) CAS(old, new uint64) bool { + return atomic.CompareAndSwapUint64(&i.v, old, new) +} + +// Store atomically stores the passed value. +func (i *Uint64) Store(n uint64) { + atomic.StoreUint64(&i.v, n) +} + +// Swap atomically swaps the wrapped uint64 and returns the old value. +func (i *Uint64) Swap(n uint64) uint64 { + return atomic.SwapUint64(&i.v, n) +} + +// Bool is an atomic Boolean. +type Bool struct{ v uint32 } + +// NewBool creates a Bool. +func NewBool(initial bool) *Bool { + return &Bool{boolToInt(initial)} +} + +// Load atomically loads the Boolean. +func (b *Bool) Load() bool { + return truthy(atomic.LoadUint32(&b.v)) +} + +// CAS is an atomic compare-and-swap. +func (b *Bool) CAS(old, new bool) bool { + return atomic.CompareAndSwapUint32(&b.v, boolToInt(old), boolToInt(new)) +} + +// Store atomically stores the passed value. +func (b *Bool) Store(new bool) { + atomic.StoreUint32(&b.v, boolToInt(new)) +} + +// Swap sets the given value and returns the previous value. +func (b *Bool) Swap(new bool) bool { + return truthy(atomic.SwapUint32(&b.v, boolToInt(new))) +} + +// Toggle atomically negates the Boolean and returns the previous value. +func (b *Bool) Toggle() bool { + for { + old := b.Load() + if b.CAS(old, !old) { + return old + } + } +} + +func truthy(n uint32) bool { + return n == 1 +} + +func boolToInt(b bool) uint32 { + if b { + return 1 + } + return 0 +} + +// Float64 is an atomic wrapper around float64. +type Float64 struct { + v uint64 +} + +// NewFloat64 creates a Float64. +func NewFloat64(f float64) *Float64 { + return &Float64{math.Float64bits(f)} +} + +// Load atomically loads the wrapped value. +func (f *Float64) Load() float64 { + return math.Float64frombits(atomic.LoadUint64(&f.v)) +} + +// Store atomically stores the passed value. +func (f *Float64) Store(s float64) { + atomic.StoreUint64(&f.v, math.Float64bits(s)) +} + +// Add atomically adds to the wrapped float64 and returns the new value. +func (f *Float64) Add(s float64) float64 { + for { + old := f.Load() + new := old + s + if f.CAS(old, new) { + return new + } + } +} + +// Sub atomically subtracts from the wrapped float64 and returns the new value. +func (f *Float64) Sub(s float64) float64 { + return f.Add(-s) +} + +// CAS is an atomic compare-and-swap. +func (f *Float64) CAS(old, new float64) bool { + return atomic.CompareAndSwapUint64(&f.v, math.Float64bits(old), math.Float64bits(new)) +} + +// Duration is an atomic wrapper around time.Duration +// https://godoc.org/time#Duration +type Duration struct { + v Int64 +} + +// NewDuration creates a Duration. +func NewDuration(d time.Duration) *Duration { + return &Duration{v: *NewInt64(int64(d))} +} + +// Load atomically loads the wrapped value. +func (d *Duration) Load() time.Duration { + return time.Duration(d.v.Load()) +} + +// Store atomically stores the passed value. +func (d *Duration) Store(n time.Duration) { + d.v.Store(int64(n)) +} + +// Add atomically adds to the wrapped time.Duration and returns the new value. +func (d *Duration) Add(n time.Duration) time.Duration { + return time.Duration(d.v.Add(int64(n))) +} + +// Sub atomically subtracts from the wrapped time.Duration and returns the new value. +func (d *Duration) Sub(n time.Duration) time.Duration { + return time.Duration(d.v.Sub(int64(n))) +} + +// Swap atomically swaps the wrapped time.Duration and returns the old value. +func (d *Duration) Swap(n time.Duration) time.Duration { + return time.Duration(d.v.Swap(int64(n))) +} + +// CAS is an atomic compare-and-swap. +func (d *Duration) CAS(old, new time.Duration) bool { + return d.v.CAS(int64(old), int64(new)) +} + +// Value shadows the type of the same name from sync/atomic +// https://godoc.org/sync/atomic#Value +type Value struct{ atomic.Value } diff --git a/vendor/go.uber.org/atomic/error.go b/vendor/go.uber.org/atomic/error.go new file mode 100644 index 00000000..0489d19b --- /dev/null +++ b/vendor/go.uber.org/atomic/error.go @@ -0,0 +1,55 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package atomic + +// Error is an atomic type-safe wrapper around Value for errors +type Error struct{ v Value } + +// errorHolder is non-nil holder for error object. +// atomic.Value panics on saving nil object, so err object needs to be +// wrapped with valid object first. +type errorHolder struct{ err error } + +// NewError creates new atomic error object +func NewError(err error) *Error { + e := &Error{} + if err != nil { + e.Store(err) + } + return e +} + +// Load atomically loads the wrapped error +func (e *Error) Load() error { + v := e.v.Load() + if v == nil { + return nil + } + + eh := v.(errorHolder) + return eh.err +} + +// Store atomically stores error. +// NOTE: a holder object is allocated on each Store call. +func (e *Error) Store(err error) { + e.v.Store(errorHolder{err: err}) +} diff --git a/vendor/go.uber.org/atomic/go.mod b/vendor/go.uber.org/atomic/go.mod new file mode 100644 index 00000000..a935daeb --- /dev/null +++ b/vendor/go.uber.org/atomic/go.mod @@ -0,0 +1,10 @@ +module go.uber.org/atomic + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/stretchr/testify v1.3.0 + golang.org/x/lint v0.0.0-20190930215403-16217165b5de + golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c // indirect +) + +go 1.13 diff --git a/vendor/go.uber.org/atomic/go.sum b/vendor/go.uber.org/atomic/go.sum new file mode 100644 index 00000000..51b2b62a --- /dev/null +++ b/vendor/go.uber.org/atomic/go.sum @@ -0,0 +1,22 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c h1:IGkKhmfzcztjm6gYkykvu/NiS8kaqbCWAEWWAyf8J5U= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/vendor/go.uber.org/atomic/string.go b/vendor/go.uber.org/atomic/string.go new file mode 100644 index 00000000..ede8136f --- /dev/null +++ b/vendor/go.uber.org/atomic/string.go @@ -0,0 +1,49 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package atomic + +// String is an atomic type-safe wrapper around Value for strings. +type String struct{ v Value } + +// NewString creates a String. +func NewString(str string) *String { + s := &String{} + if str != "" { + s.Store(str) + } + return s +} + +// Load atomically loads the wrapped string. +func (s *String) Load() string { + v := s.v.Load() + if v == nil { + return "" + } + return v.(string) +} + +// Store atomically stores the passed string. +// Note: Converting the string to an interface{} to store in the Value +// requires an allocation. +func (s *String) Store(str string) { + s.v.Store(str) +} diff --git a/vendor/go.uber.org/multierr/.codecov.yml b/vendor/go.uber.org/multierr/.codecov.yml new file mode 100644 index 00000000..6d4d1be7 --- /dev/null +++ b/vendor/go.uber.org/multierr/.codecov.yml @@ -0,0 +1,15 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 100 # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure + diff --git a/vendor/go.uber.org/multierr/.gitignore b/vendor/go.uber.org/multierr/.gitignore new file mode 100644 index 00000000..b9a05e3d --- /dev/null +++ b/vendor/go.uber.org/multierr/.gitignore @@ -0,0 +1,4 @@ +/vendor +cover.html +cover.out +/bin diff --git a/vendor/go.uber.org/multierr/.travis.yml b/vendor/go.uber.org/multierr/.travis.yml new file mode 100644 index 00000000..786c917a --- /dev/null +++ b/vendor/go.uber.org/multierr/.travis.yml @@ -0,0 +1,29 @@ +sudo: false +language: go +go_import_path: go.uber.org/multierr + +env: + global: + - GO15VENDOREXPERIMENT=1 + - GO111MODULE=on + +go: + - 1.11.x + - 1.12.x + - 1.13.x + +cache: + directories: + - vendor + +before_install: +- go version + +script: +- | + set -e + make lint + make cover + +after_success: +- bash <(curl -s https://codecov.io/bash) diff --git a/vendor/go.uber.org/multierr/CHANGELOG.md b/vendor/go.uber.org/multierr/CHANGELOG.md new file mode 100644 index 00000000..abb355a0 --- /dev/null +++ b/vendor/go.uber.org/multierr/CHANGELOG.md @@ -0,0 +1,48 @@ +Releases +======== + +v1.4.0 (2019-11-04) +=================== + +- Add `AppendInto` function to more ergonomically build errors inside a + loop. + + +v1.3.0 (2019-10-29) +=================== + +- Switch to Go modules. + + +v1.2.0 (2019-09-26) +=================== + +- Support extracting and matching against wrapped errors with `errors.As` + and `errors.Is`. + + +v1.1.0 (2017-06-30) +=================== + +- Added an `Errors(error) []error` function to extract the underlying list of + errors for a multierr error. + + +v1.0.0 (2017-05-31) +=================== + +No changes since v0.2.0. This release is committing to making no breaking +changes to the current API in the 1.X series. + + +v0.2.0 (2017-04-11) +=================== + +- Repeatedly appending to the same error is now faster due to fewer + allocations. + + +v0.1.0 (2017-31-03) +=================== + +- Initial release diff --git a/vendor/go.uber.org/multierr/LICENSE.txt b/vendor/go.uber.org/multierr/LICENSE.txt new file mode 100644 index 00000000..858e0247 --- /dev/null +++ b/vendor/go.uber.org/multierr/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2017 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/go.uber.org/multierr/Makefile b/vendor/go.uber.org/multierr/Makefile new file mode 100644 index 00000000..41601823 --- /dev/null +++ b/vendor/go.uber.org/multierr/Makefile @@ -0,0 +1,42 @@ +# Directory to put `go install`ed binaries in. +export GOBIN ?= $(shell pwd)/bin + +GO_FILES := $(shell \ + find . '(' -path '*/.*' -o -path './vendor' ')' -prune \ + -o -name '*.go' -print | cut -b3-) + +.PHONY: build +build: + go build ./... + +.PHONY: test +test: + go test -race ./... + +.PHONY: gofmt +gofmt: + $(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX)) + @gofmt -e -s -l $(GO_FILES) > $(FMT_LOG) || true + @[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" | cat - $(FMT_LOG) && false) + +.PHONY: golint +golint: + @go install golang.org/x/lint/golint + @$(GOBIN)/golint ./... + +.PHONY: staticcheck +staticcheck: + @go install honnef.co/go/tools/cmd/staticcheck + @$(GOBIN)/staticcheck ./... + +.PHONY: lint +lint: gofmt golint staticcheck + +.PHONY: cover +cover: + go test -coverprofile=cover.out -coverpkg=./... -v ./... + go tool cover -html=cover.out -o cover.html + +update-license: + @go install go.uber.org/tools/update-license + @$(GOBIN)/update-license $(GO_FILES) diff --git a/vendor/go.uber.org/multierr/README.md b/vendor/go.uber.org/multierr/README.md new file mode 100644 index 00000000..751bd65e --- /dev/null +++ b/vendor/go.uber.org/multierr/README.md @@ -0,0 +1,23 @@ +# multierr [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +`multierr` allows combining one or more Go `error`s together. + +## Installation + + go get -u go.uber.org/multierr + +## Status + +Stable: No breaking changes will be made before 2.0. + +------------------------------------------------------------------------------- + +Released under the [MIT License]. + +[MIT License]: LICENSE.txt +[doc-img]: https://godoc.org/go.uber.org/multierr?status.svg +[doc]: https://godoc.org/go.uber.org/multierr +[ci-img]: https://travis-ci.com/uber-go/multierr.svg?branch=master +[cov-img]: https://codecov.io/gh/uber-go/multierr/branch/master/graph/badge.svg +[ci]: https://travis-ci.com/uber-go/multierr +[cov]: https://codecov.io/gh/uber-go/multierr diff --git a/vendor/go.uber.org/multierr/error.go b/vendor/go.uber.org/multierr/error.go new file mode 100644 index 00000000..0ee6fe8b --- /dev/null +++ b/vendor/go.uber.org/multierr/error.go @@ -0,0 +1,449 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package multierr allows combining one or more errors together. +// +// Overview +// +// Errors can be combined with the use of the Combine function. +// +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// conn.Close(), +// ) +// +// If only two errors are being combined, the Append function may be used +// instead. +// +// err = multierr.Append(reader.Close(), writer.Close()) +// +// This makes it possible to record resource cleanup failures from deferred +// blocks with the help of named return values. +// +// func sendRequest(req Request) (err error) { +// conn, err := openConnection() +// if err != nil { +// return err +// } +// defer func() { +// err = multierr.Append(err, conn.Close()) +// }() +// // ... +// } +// +// The underlying list of errors for a returned error object may be retrieved +// with the Errors function. +// +// errors := multierr.Errors(err) +// if len(errors) > 0 { +// fmt.Println("The following errors occurred:") +// } +// +// Advanced Usage +// +// Errors returned by Combine and Append MAY implement the following +// interface. +// +// type errorGroup interface { +// // Returns a slice containing the underlying list of errors. +// // +// // This slice MUST NOT be modified by the caller. +// Errors() []error +// } +// +// Note that if you need access to list of errors behind a multierr error, you +// should prefer using the Errors function. That said, if you need cheap +// read-only access to the underlying errors slice, you can attempt to cast +// the error to this interface. You MUST handle the failure case gracefully +// because errors returned by Combine and Append are not guaranteed to +// implement this interface. +// +// var errors []error +// group, ok := err.(errorGroup) +// if ok { +// errors = group.Errors() +// } else { +// errors = []error{err} +// } +package multierr // import "go.uber.org/multierr" + +import ( + "bytes" + "fmt" + "io" + "strings" + "sync" + + "go.uber.org/atomic" +) + +var ( + // Separator for single-line error messages. + _singlelineSeparator = []byte("; ") + + // Prefix for multi-line messages + _multilinePrefix = []byte("the following errors occurred:") + + // Prefix for the first and following lines of an item in a list of + // multi-line error messages. + // + // For example, if a single item is: + // + // foo + // bar + // + // It will become, + // + // - foo + // bar + _multilineSeparator = []byte("\n - ") + _multilineIndent = []byte(" ") +) + +// _bufferPool is a pool of bytes.Buffers. +var _bufferPool = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, +} + +type errorGroup interface { + Errors() []error +} + +// Errors returns a slice containing zero or more errors that the supplied +// error is composed of. If the error is nil, the returned slice is empty. +// +// err := multierr.Append(r.Close(), w.Close()) +// errors := multierr.Errors(err) +// +// If the error is not composed of other errors, the returned slice contains +// just the error that was passed in. +// +// Callers of this function are free to modify the returned slice. +func Errors(err error) []error { + if err == nil { + return nil + } + + // Note that we're casting to multiError, not errorGroup. Our contract is + // that returned errors MAY implement errorGroup. Errors, however, only + // has special behavior for multierr-specific error objects. + // + // This behavior can be expanded in the future but I think it's prudent to + // start with as little as possible in terms of contract and possibility + // of misuse. + eg, ok := err.(*multiError) + if !ok { + return []error{err} + } + + errors := eg.Errors() + result := make([]error, len(errors)) + copy(result, errors) + return result +} + +// multiError is an error that holds one or more errors. +// +// An instance of this is guaranteed to be non-empty and flattened. That is, +// none of the errors inside multiError are other multiErrors. +// +// multiError formats to a semi-colon delimited list of error messages with +// %v and with a more readable multi-line format with %+v. +type multiError struct { + copyNeeded atomic.Bool + errors []error +} + +var _ errorGroup = (*multiError)(nil) + +// Errors returns the list of underlying errors. +// +// This slice MUST NOT be modified. +func (merr *multiError) Errors() []error { + if merr == nil { + return nil + } + return merr.errors +} + +func (merr *multiError) Error() string { + if merr == nil { + return "" + } + + buff := _bufferPool.Get().(*bytes.Buffer) + buff.Reset() + + merr.writeSingleline(buff) + + result := buff.String() + _bufferPool.Put(buff) + return result +} + +func (merr *multiError) Format(f fmt.State, c rune) { + if c == 'v' && f.Flag('+') { + merr.writeMultiline(f) + } else { + merr.writeSingleline(f) + } +} + +func (merr *multiError) writeSingleline(w io.Writer) { + first := true + for _, item := range merr.errors { + if first { + first = false + } else { + w.Write(_singlelineSeparator) + } + io.WriteString(w, item.Error()) + } +} + +func (merr *multiError) writeMultiline(w io.Writer) { + w.Write(_multilinePrefix) + for _, item := range merr.errors { + w.Write(_multilineSeparator) + writePrefixLine(w, _multilineIndent, fmt.Sprintf("%+v", item)) + } +} + +// Writes s to the writer with the given prefix added before each line after +// the first. +func writePrefixLine(w io.Writer, prefix []byte, s string) { + first := true + for len(s) > 0 { + if first { + first = false + } else { + w.Write(prefix) + } + + idx := strings.IndexByte(s, '\n') + if idx < 0 { + idx = len(s) - 1 + } + + io.WriteString(w, s[:idx+1]) + s = s[idx+1:] + } +} + +type inspectResult struct { + // Number of top-level non-nil errors + Count int + + // Total number of errors including multiErrors + Capacity int + + // Index of the first non-nil error in the list. Value is meaningless if + // Count is zero. + FirstErrorIdx int + + // Whether the list contains at least one multiError + ContainsMultiError bool +} + +// Inspects the given slice of errors so that we can efficiently allocate +// space for it. +func inspect(errors []error) (res inspectResult) { + first := true + for i, err := range errors { + if err == nil { + continue + } + + res.Count++ + if first { + first = false + res.FirstErrorIdx = i + } + + if merr, ok := err.(*multiError); ok { + res.Capacity += len(merr.errors) + res.ContainsMultiError = true + } else { + res.Capacity++ + } + } + return +} + +// fromSlice converts the given list of errors into a single error. +func fromSlice(errors []error) error { + res := inspect(errors) + switch res.Count { + case 0: + return nil + case 1: + // only one non-nil entry + return errors[res.FirstErrorIdx] + case len(errors): + if !res.ContainsMultiError { + // already flat + return &multiError{errors: errors} + } + } + + nonNilErrs := make([]error, 0, res.Capacity) + for _, err := range errors[res.FirstErrorIdx:] { + if err == nil { + continue + } + + if nested, ok := err.(*multiError); ok { + nonNilErrs = append(nonNilErrs, nested.errors...) + } else { + nonNilErrs = append(nonNilErrs, err) + } + } + + return &multiError{errors: nonNilErrs} +} + +// Combine combines the passed errors into a single error. +// +// If zero arguments were passed or if all items are nil, a nil error is +// returned. +// +// Combine(nil, nil) // == nil +// +// If only a single error was passed, it is returned as-is. +// +// Combine(err) // == err +// +// Combine skips over nil arguments so this function may be used to combine +// together errors from operations that fail independently of each other. +// +// multierr.Combine( +// reader.Close(), +// writer.Close(), +// pipe.Close(), +// ) +// +// If any of the passed errors is a multierr error, it will be flattened along +// with the other errors. +// +// multierr.Combine(multierr.Combine(err1, err2), err3) +// // is the same as +// multierr.Combine(err1, err2, err3) +// +// The returned error formats into a readable multi-line error message if +// formatted with %+v. +// +// fmt.Sprintf("%+v", multierr.Combine(err1, err2)) +func Combine(errors ...error) error { + return fromSlice(errors) +} + +// Append appends the given errors together. Either value may be nil. +// +// This function is a specialization of Combine for the common case where +// there are only two errors. +// +// err = multierr.Append(reader.Close(), writer.Close()) +// +// The following pattern may also be used to record failure of deferred +// operations without losing information about the original error. +// +// func doSomething(..) (err error) { +// f := acquireResource() +// defer func() { +// err = multierr.Append(err, f.Close()) +// }() +func Append(left error, right error) error { + switch { + case left == nil: + return right + case right == nil: + return left + } + + if _, ok := right.(*multiError); !ok { + if l, ok := left.(*multiError); ok && !l.copyNeeded.Swap(true) { + // Common case where the error on the left is constantly being + // appended to. + errs := append(l.errors, right) + return &multiError{errors: errs} + } else if !ok { + // Both errors are single errors. + return &multiError{errors: []error{left, right}} + } + } + + // Either right or both, left and right, are multiErrors. Rely on usual + // expensive logic. + errors := [2]error{left, right} + return fromSlice(errors[0:]) +} + +// AppendInto appends an error into the destination of an error pointer and +// returns whether the error being appended was non-nil. +// +// var err error +// multierr.AppendInto(&err, r.Close()) +// multierr.AppendInto(&err, w.Close()) +// +// The above is equivalent to, +// +// err := multierr.Append(r.Close(), w.Close()) +// +// As AppendInto reports whether the provided error was non-nil, it may be +// used to build a multierr error in a loop more ergonomically. For example: +// +// var err error +// for line := range lines { +// var item Item +// if multierr.AppendInto(&err, parse(line, &item)) { +// continue +// } +// items = append(items, item) +// } +// +// Compare this with a verison that relies solely on Append: +// +// var err error +// for line := range lines { +// var item Item +// if parseErr := parse(line, &item); parseErr != nil { +// err = multierr.Append(err, parseErr) +// continue +// } +// items = append(items, item) +// } +func AppendInto(into *error, err error) (errored bool) { + if into == nil { + // We panic if 'into' is nil. This is not documented above + // because suggesting that the pointer must be non-nil may + // confuse users into thinking that the error that it points + // to must be non-nil. + panic("misuse of multierr.AppendInto: into pointer must not be nil") + } + + if err == nil { + return false + } + *into = Append(*into, err) + return true +} diff --git a/vendor/go.uber.org/multierr/glide.yaml b/vendor/go.uber.org/multierr/glide.yaml new file mode 100644 index 00000000..6ef084ec --- /dev/null +++ b/vendor/go.uber.org/multierr/glide.yaml @@ -0,0 +1,8 @@ +package: go.uber.org/multierr +import: +- package: go.uber.org/atomic + version: ^1 +testImport: +- package: github.com/stretchr/testify + subpackages: + - assert diff --git a/vendor/go.uber.org/multierr/go.mod b/vendor/go.uber.org/multierr/go.mod new file mode 100644 index 00000000..5463fac7 --- /dev/null +++ b/vendor/go.uber.org/multierr/go.mod @@ -0,0 +1,12 @@ +module go.uber.org/multierr + +go 1.12 + +require ( + github.com/stretchr/testify v1.3.0 + go.uber.org/atomic v1.5.0 + go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee + golang.org/x/lint v0.0.0-20190930215403-16217165b5de + golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 // indirect + honnef.co/go/tools v0.0.1-2019.2.3 +) diff --git a/vendor/go.uber.org/multierr/go.sum b/vendor/go.uber.org/multierr/go.sum new file mode 100644 index 00000000..b460913d --- /dev/null +++ b/vendor/go.uber.org/multierr/go.sum @@ -0,0 +1,45 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c h1:IGkKhmfzcztjm6gYkykvu/NiS8kaqbCWAEWWAyf8J5U= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/vendor/go.uber.org/multierr/go113.go b/vendor/go.uber.org/multierr/go113.go new file mode 100644 index 00000000..264b0eac --- /dev/null +++ b/vendor/go.uber.org/multierr/go113.go @@ -0,0 +1,52 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// +build go1.13 + +package multierr + +import "errors" + +// As attempts to find the first error in the error list that matches the type +// of the value that target points to. +// +// This function allows errors.As to traverse the values stored on the +// multierr error. +func (merr *multiError) As(target interface{}) bool { + for _, err := range merr.Errors() { + if errors.As(err, target) { + return true + } + } + return false +} + +// Is attempts to match the provided error against errors in the error list. +// +// This function allows errors.Is to traverse the values stored on the +// multierr error. +func (merr *multiError) Is(target error) bool { + for _, err := range merr.Errors() { + if errors.Is(err, target) { + return true + } + } + return false +} diff --git a/vendor/go.uber.org/multierr/tools.go b/vendor/go.uber.org/multierr/tools.go new file mode 100644 index 00000000..df93f072 --- /dev/null +++ b/vendor/go.uber.org/multierr/tools.go @@ -0,0 +1,30 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// +build tools + +package multierr + +import ( + // Tools we use during development. + _ "go.uber.org/tools/update-license" + _ "golang.org/x/lint/golint" + _ "honnef.co/go/tools/cmd/staticcheck" +) diff --git a/vendor/go.uber.org/tools/LICENSE b/vendor/go.uber.org/tools/LICENSE new file mode 100644 index 00000000..858e0247 --- /dev/null +++ b/vendor/go.uber.org/tools/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2017 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/go.uber.org/tools/update-license/.gitignore b/vendor/go.uber.org/tools/update-license/.gitignore new file mode 100644 index 00000000..b167772c --- /dev/null +++ b/vendor/go.uber.org/tools/update-license/.gitignore @@ -0,0 +1 @@ +update-license diff --git a/vendor/go.uber.org/tools/update-license/README.md b/vendor/go.uber.org/tools/update-license/README.md new file mode 100644 index 00000000..5887df1d --- /dev/null +++ b/vendor/go.uber.org/tools/update-license/README.md @@ -0,0 +1,24 @@ +# update-license + +This is a small tool that updates the license header for Uber's open source Golang files. + +## Installation + +``` +go get go.uber.org/tools/update-license +``` + +## Usage + +``` +update-license go_files... +``` + +## Further Work + +* Support more licenses by name (MIT, Apache 2.0, etc), file path, url (http GET) +* Support custom owner (not just "Uber Technologies, Inc.") +* Support more languages than go (cover go, java, js, py to start, along with LICENSE, LICENSE.txt) +* Talk about removing custom logic for header comments (ie `@generated`, `Code generated by`), it probably makes more sense just to put the license at the top +* Better detection support for existing licenses so they can be removed +* Verbose, dry run support diff --git a/vendor/go.uber.org/tools/update-license/licenses.go b/vendor/go.uber.org/tools/update-license/licenses.go new file mode 100644 index 00000000..76957c21 --- /dev/null +++ b/vendor/go.uber.org/tools/update-license/licenses.go @@ -0,0 +1,56 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package main + +var licenseTemplates = map[string]string{ + "Apache-2.0": `// Copyright {{.Year}} {{.Owner}} +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License.`, + "MIT": `// Copyright (c) {{.Year}} {{.Owner}} +// +// 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/go.uber.org/tools/update-license/main.go b/vendor/go.uber.org/tools/update-license/main.go new file mode 100644 index 00000000..269fd9b4 --- /dev/null +++ b/vendor/go.uber.org/tools/update-license/main.go @@ -0,0 +1,228 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package main + +import ( + "bytes" + "flag" + "fmt" + "html/template" + "io/ioutil" + "log" + "os" + "path/filepath" + "sort" + "strings" + "time" +) + +const ( + // how many lines to check for an existing copyright + // this logic is not great and we should probably do something else + // but this was copied from the python script + copyrightLineLimit = 5 + headerPrefix = "// Copyright" +) + +var ( + flagDryRun = flag.Bool("dry", false, "Do not edit files and just print out what files would be edited") + flagOwner = flag.String("owner", "Uber Technologies, Inc.", "Copyright owner") + flagLicense = flag.String( + "license", + "MIT", + fmt.Sprintf( + "Type of license to use [%s]", + strings.Join(validLicenses(), ", "), + ), + ) + + lineSkipPrefixes = []string{ + "// Code generated by", + "// @generated", + } +) + +func main() { + log.SetFlags(0) + log.SetOutput(os.Stdout) + log.SetPrefix("") + if err := do(); err != nil { + log.Fatal(err) + } +} + +func do() error { + flag.Parse() + + if len(flag.Args()) < 1 { + return fmt.Errorf("usage: %s GO_FILES", os.Args[0]) + } + + return updateFiles( + flag.Args(), + time.Now().UTC().Year(), + *flagLicense, + *flagOwner, + *flagDryRun, + ) +} + +func fullLicense(ts string, year int, owner string) string { + var buf bytes.Buffer + t, err := template.New("").Parse(ts) + if err != nil { + log.Panic("failed to parse license template", err) + } + + data := struct { + Year int + Owner string + }{year, owner} + if err := t.Execute(&buf, data); err != nil { + log.Panic("failed to execture license template", err) + } + + return strings.TrimSpace(buf.String()) +} + +// validLicenses grabs all the license templates from the folder +func validLicenses() []string { + res := make([]string, 0, len(licenseTemplates)) + + for k := range licenseTemplates { + res = append(res, k) + } + + sort.Strings(res) + return res +} + +func updateFiles( + filePaths []string, + year int, + license string, + owner string, + dryRun bool, +) error { + if err := checkFilePaths(filePaths); err != nil { + return err + } + for _, filePath := range filePaths { + if err := updateFile(filePath, year, license, owner, dryRun); err != nil { + return err + } + } + return nil +} + +func checkFilePaths(filePaths []string) error { + for _, filePath := range filePaths { + if filepath.Ext(filePath) != ".go" { + return fmt.Errorf("%s is not a go file", filePath) + } + } + return nil +} + +func updateFile( + filePath string, + year int, + license string, + owner string, + dryRun bool, +) error { + data, err := ioutil.ReadFile(filePath) + if err != nil { + return err + } + newData := updateData(data, year, license, owner) + if !bytes.Equal(data, newData) { + if dryRun { + log.Print(filePath) + return nil + } + // we could do something more complicated so that we do not + // need to pass 0644 as the file mode, but in this case it should + // never actually be used to create a file since we know the file + // already exists, and it's easier to use the ReadFile/WriteFile + // logic as it is right now, and since this is just a generation + // program, this should be acceptable + return ioutil.WriteFile(filePath, newData, 0644) + } + return nil +} + +func updateData( + data []byte, + year int, + license string, + owner string, +) []byte { + licenseText := fullLicense(string(licenseTemplates[license]), year, owner) + + return []byte( + strings.Join( + updateLines(strings.Split(string(data), "\n"), licenseText), + "\n", + ), + ) +} + +// a value in the returned slice may contain newlines itself +func updateLines(lines []string, license string) []string { + for i, line := range lines { + if i >= copyrightLineLimit { + break + } + if strings.HasPrefix(line, headerPrefix) { + // assume that the new license text always starts with the copyright + // string. Pretty safe to assume, right? RIGHT? + lines[i] = strings.Split(license, "\n")[0] + return lines + } + } + return addToLines(lines, license) +} + +// a value in the returned slice may contain newlines itself +func addToLines(lines []string, license string) []string { + i := 0 + for len(lines) > i && lineContainsSkipPrefix(lines[i]) { + i++ + // skip comments under the generated line too + for strings.HasPrefix(lines[i], "//") { + i++ + } + } + if i == 0 { + return append([]string{license, ""}, lines...) + } + return append(lines[0:i], append([]string{"", license}, lines[i:]...)...) +} + +func lineContainsSkipPrefix(line string) bool { + for _, skipPrefix := range lineSkipPrefixes { + if strings.HasPrefix(line, skipPrefix) { + return true + } + } + return false +} diff --git a/vendor/go.uber.org/zap/.codecov.yml b/vendor/go.uber.org/zap/.codecov.yml new file mode 100644 index 00000000..8e5ca7d3 --- /dev/null +++ b/vendor/go.uber.org/zap/.codecov.yml @@ -0,0 +1,17 @@ +coverage: + range: 80..100 + round: down + precision: 2 + + status: + project: # measuring the overall project coverage + default: # context, you can create multiple ones with custom titles + enabled: yes # must be yes|true to enable this status + target: 95% # specify the target coverage for each commit status + # option: "auto" (must increase from parent commit or pull request base) + # option: "X%" a static target percentage to hit + if_not_found: success # if parent is not found report status as success, error, or failure + if_ci_failed: error # if ci fails report status as success, error, or failure +ignore: + - internal/readme/readme.go + diff --git a/vendor/go.uber.org/zap/.gitignore b/vendor/go.uber.org/zap/.gitignore new file mode 100644 index 00000000..da9d9d00 --- /dev/null +++ b/vendor/go.uber.org/zap/.gitignore @@ -0,0 +1,32 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test +vendor + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof +*.pprof +*.out +*.log + +/bin +cover.out +cover.html diff --git a/vendor/go.uber.org/zap/.readme.tmpl b/vendor/go.uber.org/zap/.readme.tmpl new file mode 100644 index 00000000..3154a1e6 --- /dev/null +++ b/vendor/go.uber.org/zap/.readme.tmpl @@ -0,0 +1,109 @@ +# :zap: zap [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +Blazing fast, structured, leveled logging in Go. + +## Installation + +`go get -u go.uber.org/zap` + +Note that zap only supports the two most recent minor versions of Go. + +## Quick Start + +In contexts where performance is nice, but not critical, use the +`SugaredLogger`. It's 4-10x faster than other structured logging +packages and includes both structured and `printf`-style APIs. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() // flushes buffer, if any +sugar := logger.Sugar() +sugar.Infow("failed to fetch URL", + // Structured context as loosely typed key-value pairs. + "url", url, + "attempt", 3, + "backoff", time.Second, +) +sugar.Infof("Failed to fetch URL: %s", url) +``` + +When performance and type safety are critical, use the `Logger`. It's even +faster than the `SugaredLogger` and allocates far less, but it only supports +structured logging. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() +logger.Info("failed to fetch URL", + // Structured context as strongly typed Field values. + zap.String("url", url), + zap.Int("attempt", 3), + zap.Duration("backoff", time.Second), +) +``` + +See the [documentation][doc] and [FAQ](FAQ.md) for more details. + +## Performance + +For applications that log in the hot path, reflection-based serialization and +string formatting are prohibitively expensive — they're CPU-intensive +and make many small allocations. Put differently, using `encoding/json` and +`fmt.Fprintf` to log tons of `interface{}`s makes your application slow. + +Zap takes a different approach. It includes a reflection-free, zero-allocation +JSON encoder, and the base `Logger` strives to avoid serialization overhead +and allocations wherever possible. By building the high-level `SugaredLogger` +on that foundation, zap lets users *choose* when they need to count every +allocation and when they'd prefer a more familiar, loosely typed API. + +As measured by its own [benchmarking suite][], not only is zap more performant +than comparable structured logging packages — it's also faster than the +standard library. Like all benchmarks, take these with a grain of salt.[1](#footnote-versions) + +Log a message and 10 fields: + +{{.BenchmarkAddingFields}} + +Log a message with a logger that already has 10 fields of context: + +{{.BenchmarkAccumulatedContext}} + +Log a static string, without any context or `printf`-style templating: + +{{.BenchmarkWithoutFields}} + +## Development Status: Stable + +All APIs are finalized, and no breaking changes will be made in the 1.x series +of releases. Users of semver-aware dependency management systems should pin +zap to `^1`. + +## Contributing + +We encourage and support an active, healthy community of contributors — +including you! Details are in the [contribution guide](CONTRIBUTING.md) and +the [code of conduct](CODE_OF_CONDUCT.md). The zap maintainers keep an eye on +issues and pull requests, but you can also report any negative conduct to +oss-conduct@uber.com. That email list is a private, safe space; even the zap +maintainers don't have access, so don't hesitate to hold us to a high +standard. + +
+ +Released under the [MIT License](LICENSE.txt). + +1 In particular, keep in mind that we may be +benchmarking against slightly older versions of other packages. Versions are +pinned in zap's [glide.lock][] file. [↩](#anchor-versions) + +[doc-img]: https://godoc.org/go.uber.org/zap?status.svg +[doc]: https://godoc.org/go.uber.org/zap +[ci-img]: https://travis-ci.com/uber-go/zap.svg?branch=master +[ci]: https://travis-ci.com/uber-go/zap +[cov-img]: https://codecov.io/gh/uber-go/zap/branch/master/graph/badge.svg +[cov]: https://codecov.io/gh/uber-go/zap +[benchmarking suite]: https://github.com/uber-go/zap/tree/master/benchmarks +[glide.lock]: https://github.com/uber-go/zap/blob/master/glide.lock + diff --git a/vendor/go.uber.org/zap/.travis.yml b/vendor/go.uber.org/zap/.travis.yml new file mode 100644 index 00000000..647b4ee4 --- /dev/null +++ b/vendor/go.uber.org/zap/.travis.yml @@ -0,0 +1,23 @@ +language: go +sudo: false + +go_import_path: go.uber.org/zap +env: + global: + - TEST_TIMEOUT_SCALE=10 + - GO111MODULE=on + +matrix: + include: + - go: 1.12.x + - go: 1.13.x + env: LINT=1 + +script: + - test -z "$LINT" || make lint + - make test + - make bench + +after_success: + - make cover + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/go.uber.org/zap/CHANGELOG.md b/vendor/go.uber.org/zap/CHANGELOG.md new file mode 100644 index 00000000..bebdb748 --- /dev/null +++ b/vendor/go.uber.org/zap/CHANGELOG.md @@ -0,0 +1,352 @@ +# Changelog + +## 1.13.0 (13 Nov 2019) + +Enhancements: +* [#758][]: Add `Intp`, `Stringp`, and other similar `*p` field constructors + to log pointers to primitives with support for `nil` values. + +Thanks to @jbizzle for their contributions to this release. + +## 1.12.0 (29 Oct 2019) + +Enhancements: +* [#751][]: Migrate to Go modules. + +## 1.11.0 (21 Oct 2019) + +Enhancements: +* [#725][]: Add `zapcore.OmitKey` to omit keys in an `EncoderConfig`. +* [#736][]: Add `RFC3339` and `RFC3339Nano` time encoders. + +Thanks to @juicemia, @uhthomas for their contributions to this release. + +## 1.10.0 (29 Apr 2019) + +Bugfixes: +* [#657][]: Fix `MapObjectEncoder.AppendByteString` not adding value as a + string. +* [#706][]: Fix incorrect call depth to determine caller in Go 1.12. + +Enhancements: +* [#610][]: Add `zaptest.WrapOptions` to wrap `zap.Option` for creating test + loggers. +* [#675][]: Don't panic when encoding a String field. +* [#704][]: Disable HTML escaping for JSON objects encoded using the + reflect-based encoder. + +Thanks to @iaroslav-ciupin, @lelenanam, @joa, @NWilson for their contributions +to this release. + +## v1.9.1 (06 Aug 2018) + +Bugfixes: + +* [#614][]: MapObjectEncoder should not ignore empty slices. + +## v1.9.0 (19 Jul 2018) + +Enhancements: +* [#602][]: Reduce number of allocations when logging with reflection. +* [#572][], [#606][]: Expose a registry for third-party logging sinks. + +Thanks to @nfarah86, @AlekSi, @JeanMertz, @philippgille, @etsangsplk, and +@dimroc for their contributions to this release. + +## v1.8.0 (13 Apr 2018) + +Enhancements: +* [#508][]: Make log level configurable when redirecting the standard + library's logger. +* [#518][]: Add a logger that writes to a `*testing.TB`. +* [#577][]: Add a top-level alias for `zapcore.Field` to clean up GoDoc. + +Bugfixes: +* [#574][]: Add a missing import comment to `go.uber.org/zap/buffer`. + +Thanks to @DiSiqueira and @djui for their contributions to this release. + +## v1.7.1 (25 Sep 2017) + +Bugfixes: +* [#504][]: Store strings when using AddByteString with the map encoder. + +## v1.7.0 (21 Sep 2017) + +Enhancements: + +* [#487][]: Add `NewStdLogAt`, which extends `NewStdLog` by allowing the user + to specify the level of the logged messages. + +## v1.6.0 (30 Aug 2017) + +Enhancements: + +* [#491][]: Omit zap stack frames from stacktraces. +* [#490][]: Add a `ContextMap` method to observer logs for simpler + field validation in tests. + +## v1.5.0 (22 Jul 2017) + +Enhancements: + +* [#460][] and [#470][]: Support errors produced by `go.uber.org/multierr`. +* [#465][]: Support user-supplied encoders for logger names. + +Bugfixes: + +* [#477][]: Fix a bug that incorrectly truncated deep stacktraces. + +Thanks to @richard-tunein and @pavius for their contributions to this release. + +## v1.4.1 (08 Jun 2017) + +This release fixes two bugs. + +Bugfixes: + +* [#435][]: Support a variety of case conventions when unmarshaling levels. +* [#444][]: Fix a panic in the observer. + +## v1.4.0 (12 May 2017) + +This release adds a few small features and is fully backward-compatible. + +Enhancements: + +* [#424][]: Add a `LineEnding` field to `EncoderConfig`, allowing users to + override the Unix-style default. +* [#425][]: Preserve time zones when logging times. +* [#431][]: Make `zap.AtomicLevel` implement `fmt.Stringer`, which makes a + variety of operations a bit simpler. + +## v1.3.0 (25 Apr 2017) + +This release adds an enhancement to zap's testing helpers as well as the +ability to marshal an AtomicLevel. It is fully backward-compatible. + +Enhancements: + +* [#415][]: Add a substring-filtering helper to zap's observer. This is + particularly useful when testing the `SugaredLogger`. +* [#416][]: Make `AtomicLevel` implement `encoding.TextMarshaler`. + +## v1.2.0 (13 Apr 2017) + +This release adds a gRPC compatibility wrapper. It is fully backward-compatible. + +Enhancements: + +* [#402][]: Add a `zapgrpc` package that wraps zap's Logger and implements + `grpclog.Logger`. + +## v1.1.0 (31 Mar 2017) + +This release fixes two bugs and adds some enhancements to zap's testing helpers. +It is fully backward-compatible. + +Bugfixes: + +* [#385][]: Fix caller path trimming on Windows. +* [#396][]: Fix a panic when attempting to use non-existent directories with + zap's configuration struct. + +Enhancements: + +* [#386][]: Add filtering helpers to zaptest's observing logger. + +Thanks to @moitias for contributing to this release. + +## v1.0.0 (14 Mar 2017) + +This is zap's first stable release. All exported APIs are now final, and no +further breaking changes will be made in the 1.x release series. Anyone using a +semver-aware dependency manager should now pin to `^1`. + +Breaking changes: + +* [#366][]: Add byte-oriented APIs to encoders to log UTF-8 encoded text without + casting from `[]byte` to `string`. +* [#364][]: To support buffering outputs, add `Sync` methods to `zapcore.Core`, + `zap.Logger`, and `zap.SugaredLogger`. +* [#371][]: Rename the `testutils` package to `zaptest`, which is less likely to + clash with other testing helpers. + +Bugfixes: + +* [#362][]: Make the ISO8601 time formatters fixed-width, which is friendlier + for tab-separated console output. +* [#369][]: Remove the automatic locks in `zapcore.NewCore`, which allows zap to + work with concurrency-safe `WriteSyncer` implementations. +* [#347][]: Stop reporting errors when trying to `fsync` standard out on Linux + systems. +* [#373][]: Report the correct caller from zap's standard library + interoperability wrappers. + +Enhancements: + +* [#348][]: Add a registry allowing third-party encodings to work with zap's + built-in `Config`. +* [#327][]: Make the representation of logger callers configurable (like times, + levels, and durations). +* [#376][]: Allow third-party encoders to use their own buffer pools, which + removes the last performance advantage that zap's encoders have over plugins. +* [#346][]: Add `CombineWriteSyncers`, a convenience function to tee multiple + `WriteSyncer`s and lock the result. +* [#365][]: Make zap's stacktraces compatible with mid-stack inlining (coming in + Go 1.9). +* [#372][]: Export zap's observing logger as `zaptest/observer`. This makes it + easier for particularly punctilious users to unit test their application's + logging. + +Thanks to @suyash, @htrendev, @flisky, @Ulexus, and @skipor for their +contributions to this release. + +## v1.0.0-rc.3 (7 Mar 2017) + +This is the third release candidate for zap's stable release. There are no +breaking changes. + +Bugfixes: + +* [#339][]: Byte slices passed to `zap.Any` are now correctly treated as binary blobs + rather than `[]uint8`. + +Enhancements: + +* [#307][]: Users can opt into colored output for log levels. +* [#353][]: In addition to hijacking the output of the standard library's + package-global logging functions, users can now construct a zap-backed + `log.Logger` instance. +* [#311][]: Frames from common runtime functions and some of zap's internal + machinery are now omitted from stacktraces. + +Thanks to @ansel1 and @suyash for their contributions to this release. + +## v1.0.0-rc.2 (21 Feb 2017) + +This is the second release candidate for zap's stable release. It includes two +breaking changes. + +Breaking changes: + +* [#316][]: Zap's global loggers are now fully concurrency-safe + (previously, users had to ensure that `ReplaceGlobals` was called before the + loggers were in use). However, they must now be accessed via the `L()` and + `S()` functions. Users can update their projects with + + ``` + gofmt -r "zap.L -> zap.L()" -w . + gofmt -r "zap.S -> zap.S()" -w . + ``` +* [#309][] and [#317][]: RC1 was mistakenly shipped with invalid + JSON and YAML struct tags on all config structs. This release fixes the tags + and adds static analysis to prevent similar bugs in the future. + +Bugfixes: + +* [#321][]: Redirecting the standard library's `log` output now + correctly reports the logger's caller. + +Enhancements: + +* [#325][] and [#333][]: Zap now transparently supports non-standard, rich + errors like those produced by `github.com/pkg/errors`. +* [#326][]: Though `New(nil)` continues to return a no-op logger, `NewNop()` is + now preferred. Users can update their projects with `gofmt -r 'zap.New(nil) -> + zap.NewNop()' -w .`. +* [#300][]: Incorrectly importing zap as `github.com/uber-go/zap` now returns a + more informative error. + +Thanks to @skipor and @chapsuk for their contributions to this release. + +## v1.0.0-rc.1 (14 Feb 2017) + +This is the first release candidate for zap's stable release. There are multiple +breaking changes and improvements from the pre-release version. Most notably: + +* **Zap's import path is now "go.uber.org/zap"** — all users will + need to update their code. +* User-facing types and functions remain in the `zap` package. Code relevant + largely to extension authors is now in the `zapcore` package. +* The `zapcore.Core` type makes it easy for third-party packages to use zap's + internals but provide a different user-facing API. +* `Logger` is now a concrete type instead of an interface. +* A less verbose (though slower) logging API is included by default. +* Package-global loggers `L` and `S` are included. +* A human-friendly console encoder is included. +* A declarative config struct allows common logger configurations to be managed + as configuration instead of code. +* Sampling is more accurate, and doesn't depend on the standard library's shared + timer heap. + +## v0.1.0-beta.1 (6 Feb 2017) + +This is a minor version, tagged to allow users to pin to the pre-1.0 APIs and +upgrade at their leisure. Since this is the first tagged release, there are no +backward compatibility concerns and all functionality is new. + +Early zap adopters should pin to the 0.1.x minor version until they're ready to +upgrade to the upcoming stable release. + +[#316]: https://github.com/uber-go/zap/pull/316 +[#309]: https://github.com/uber-go/zap/pull/309 +[#317]: https://github.com/uber-go/zap/pull/317 +[#321]: https://github.com/uber-go/zap/pull/321 +[#325]: https://github.com/uber-go/zap/pull/325 +[#333]: https://github.com/uber-go/zap/pull/333 +[#326]: https://github.com/uber-go/zap/pull/326 +[#300]: https://github.com/uber-go/zap/pull/300 +[#339]: https://github.com/uber-go/zap/pull/339 +[#307]: https://github.com/uber-go/zap/pull/307 +[#353]: https://github.com/uber-go/zap/pull/353 +[#311]: https://github.com/uber-go/zap/pull/311 +[#366]: https://github.com/uber-go/zap/pull/366 +[#364]: https://github.com/uber-go/zap/pull/364 +[#371]: https://github.com/uber-go/zap/pull/371 +[#362]: https://github.com/uber-go/zap/pull/362 +[#369]: https://github.com/uber-go/zap/pull/369 +[#347]: https://github.com/uber-go/zap/pull/347 +[#373]: https://github.com/uber-go/zap/pull/373 +[#348]: https://github.com/uber-go/zap/pull/348 +[#327]: https://github.com/uber-go/zap/pull/327 +[#376]: https://github.com/uber-go/zap/pull/376 +[#346]: https://github.com/uber-go/zap/pull/346 +[#365]: https://github.com/uber-go/zap/pull/365 +[#372]: https://github.com/uber-go/zap/pull/372 +[#385]: https://github.com/uber-go/zap/pull/385 +[#396]: https://github.com/uber-go/zap/pull/396 +[#386]: https://github.com/uber-go/zap/pull/386 +[#402]: https://github.com/uber-go/zap/pull/402 +[#415]: https://github.com/uber-go/zap/pull/415 +[#416]: https://github.com/uber-go/zap/pull/416 +[#424]: https://github.com/uber-go/zap/pull/424 +[#425]: https://github.com/uber-go/zap/pull/425 +[#431]: https://github.com/uber-go/zap/pull/431 +[#435]: https://github.com/uber-go/zap/pull/435 +[#444]: https://github.com/uber-go/zap/pull/444 +[#477]: https://github.com/uber-go/zap/pull/477 +[#465]: https://github.com/uber-go/zap/pull/465 +[#460]: https://github.com/uber-go/zap/pull/460 +[#470]: https://github.com/uber-go/zap/pull/470 +[#487]: https://github.com/uber-go/zap/pull/487 +[#490]: https://github.com/uber-go/zap/pull/490 +[#491]: https://github.com/uber-go/zap/pull/491 +[#504]: https://github.com/uber-go/zap/pull/504 +[#508]: https://github.com/uber-go/zap/pull/508 +[#518]: https://github.com/uber-go/zap/pull/518 +[#577]: https://github.com/uber-go/zap/pull/577 +[#574]: https://github.com/uber-go/zap/pull/574 +[#602]: https://github.com/uber-go/zap/pull/602 +[#572]: https://github.com/uber-go/zap/pull/572 +[#606]: https://github.com/uber-go/zap/pull/606 +[#614]: https://github.com/uber-go/zap/pull/614 +[#657]: https://github.com/uber-go/zap/pull/657 +[#706]: https://github.com/uber-go/zap/pull/706 +[#610]: https://github.com/uber-go/zap/pull/610 +[#675]: https://github.com/uber-go/zap/pull/675 +[#704]: https://github.com/uber-go/zap/pull/704 +[#725]: https://github.com/uber-go/zap/pull/725 +[#736]: https://github.com/uber-go/zap/pull/736 +[#751]: https://github.com/uber-go/zap/pull/751 +[#758]: https://github.com/uber-go/zap/pull/758 diff --git a/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md b/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..e327d9aa --- /dev/null +++ b/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md @@ -0,0 +1,75 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, +body size, disability, ethnicity, gender identity and expression, level of +experience, 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 oss-conduct@uber.com. The project +team will review and investigate all complaints, and will respond in a way +that it deems 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 +[http://contributor-covenant.org/version/1/4][version]. + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/go.uber.org/zap/CONTRIBUTING.md b/vendor/go.uber.org/zap/CONTRIBUTING.md new file mode 100644 index 00000000..9454bbaf --- /dev/null +++ b/vendor/go.uber.org/zap/CONTRIBUTING.md @@ -0,0 +1,81 @@ +# Contributing + +We'd love your help making zap the very best structured logging library in Go! + +If you'd like to add new exported APIs, please [open an issue][open-issue] +describing your proposal — discussing API changes ahead of time makes +pull request review much smoother. In your issue, pull request, and any other +communications, please remember to treat your fellow contributors with +respect! We take our [code of conduct](CODE_OF_CONDUCT.md) seriously. + +Note that you'll need to sign [Uber's Contributor License Agreement][cla] +before we can accept any of your contributions. If necessary, a bot will remind +you to accept the CLA when you open your pull request. + +## Setup + +[Fork][fork], then clone the repository: + +``` +mkdir -p $GOPATH/src/go.uber.org +cd $GOPATH/src/go.uber.org +git clone git@github.com:your_github_username/zap.git +cd zap +git remote add upstream https://github.com/uber-go/zap.git +git fetch upstream +``` + +Install zap's dependencies: + +``` +make dependencies +``` + +Make sure that the tests and the linters pass: + +``` +make test +make lint +``` + +If you're not using the minor version of Go specified in the Makefile's +`LINTABLE_MINOR_VERSIONS` variable, `make lint` doesn't do anything. This is +fine, but it means that you'll only discover lint failures after you open your +pull request. + +## Making Changes + +Start by creating a new branch for your changes: + +``` +cd $GOPATH/src/go.uber.org/zap +git checkout master +git fetch upstream +git rebase upstream/master +git checkout -b cool_new_feature +``` + +Make your changes, then ensure that `make lint` and `make test` still pass. If +you're satisfied with your changes, push them to your fork. + +``` +git push origin cool_new_feature +``` + +Then use the GitHub UI to open a pull request. + +At this point, you're waiting on us to review your changes. We *try* to respond +to issues and pull requests within a few business days, and we may suggest some +improvements or alternatives. Once your changes are approved, one of the +project maintainers will merge them. + +We're much more likely to approve your changes if you: + +* Add tests for new functionality. +* Write a [good commit message][commit-message]. +* Maintain backward compatibility. + +[fork]: https://github.com/uber-go/zap/fork +[open-issue]: https://github.com/uber-go/zap/issues/new +[cla]: https://cla-assistant.io/uber-go/zap +[commit-message]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html diff --git a/vendor/go.uber.org/zap/FAQ.md b/vendor/go.uber.org/zap/FAQ.md new file mode 100644 index 00000000..4256d35c --- /dev/null +++ b/vendor/go.uber.org/zap/FAQ.md @@ -0,0 +1,155 @@ +# Frequently Asked Questions + +## Design + +### Why spend so much effort on logger performance? + +Of course, most applications won't notice the impact of a slow logger: they +already take tens or hundreds of milliseconds for each operation, so an extra +millisecond doesn't matter. + +On the other hand, why *not* make structured logging fast? The `SugaredLogger` +isn't any harder to use than other logging packages, and the `Logger` makes +structured logging possible in performance-sensitive contexts. Across a fleet +of Go microservices, making each application even slightly more efficient adds +up quickly. + +### Why aren't `Logger` and `SugaredLogger` interfaces? + +Unlike the familiar `io.Writer` and `http.Handler`, `Logger` and +`SugaredLogger` interfaces would include *many* methods. As [Rob Pike points +out][go-proverbs], "The bigger the interface, the weaker the abstraction." +Interfaces are also rigid — *any* change requires releasing a new major +version, since it breaks all third-party implementations. + +Making the `Logger` and `SugaredLogger` concrete types doesn't sacrifice much +abstraction, and it lets us add methods without introducing breaking changes. +Your applications should define and depend upon an interface that includes +just the methods you use. + +### Why sample application logs? + +Applications often experience runs of errors, either because of a bug or +because of a misbehaving user. Logging errors is usually a good idea, but it +can easily make this bad situation worse: not only is your application coping +with a flood of errors, it's also spending extra CPU cycles and I/O logging +those errors. Since writes are typically serialized, logging limits throughput +when you need it most. + +Sampling fixes this problem by dropping repetitive log entries. Under normal +conditions, your application writes out every entry. When similar entries are +logged hundreds or thousands of times each second, though, zap begins dropping +duplicates to preserve throughput. + +### Why do the structured logging APIs take a message in addition to fields? + +Subjectively, we find it helpful to accompany structured context with a brief +description. This isn't critical during development, but it makes debugging +and operating unfamiliar systems much easier. + +More concretely, zap's sampling algorithm uses the message to identify +duplicate entries. In our experience, this is a practical middle ground +between random sampling (which often drops the exact entry that you need while +debugging) and hashing the complete entry (which is prohibitively expensive). + +### Why include package-global loggers? + +Since so many other logging packages include a global logger, many +applications aren't designed to accept loggers as explicit parameters. +Changing function signatures is often a breaking change, so zap includes +global loggers to simplify migration. + +Avoid them where possible. + +### Why include dedicated Panic and Fatal log levels? + +In general, application code should handle errors gracefully instead of using +`panic` or `os.Exit`. However, every rule has exceptions, and it's common to +crash when an error is truly unrecoverable. To avoid losing any information +— especially the reason for the crash — the logger must flush any +buffered entries before the process exits. + +Zap makes this easy by offering `Panic` and `Fatal` logging methods that +automatically flush before exiting. Of course, this doesn't guarantee that +logs will never be lost, but it eliminates a common error. + +See the discussion in uber-go/zap#207 for more details. + +### What's `DPanic`? + +`DPanic` stands for "panic in development." In development, it logs at +`PanicLevel`; otherwise, it logs at `ErrorLevel`. `DPanic` makes it easier to +catch errors that are theoretically possible, but shouldn't actually happen, +*without* crashing in production. + +If you've ever written code like this, you need `DPanic`: + +```go +if err != nil { + panic(fmt.Sprintf("shouldn't ever get here: %v", err)) +} +``` + +## Installation + +### What does the error `expects import "go.uber.org/zap"` mean? + +Either zap was installed incorrectly or you're referencing the wrong package +name in your code. + +Zap's source code happens to be hosted on GitHub, but the [import +path][import-path] is `go.uber.org/zap`. This gives us, the project +maintainers, the freedom to move the source code if necessary. However, it +means that you need to take a little care when installing and using the +package. + +If you follow two simple rules, everything should work: install zap with `go +get -u go.uber.org/zap`, and always import it in your code with `import +"go.uber.org/zap"`. Your code shouldn't contain *any* references to +`github.com/uber-go/zap`. + +## Usage + +### Does zap support log rotation? + +Zap doesn't natively support rotating log files, since we prefer to leave this +to an external program like `logrotate`. + +However, it's easy to integrate a log rotation package like +[`gopkg.in/natefinch/lumberjack.v2`][lumberjack] as a `zapcore.WriteSyncer`. + +```go +// lumberjack.Logger is already safe for concurrent use, so we don't need to +// lock it. +w := zapcore.AddSync(&lumberjack.Logger{ + Filename: "/var/log/myapp/foo.log", + MaxSize: 500, // megabytes + MaxBackups: 3, + MaxAge: 28, // days +}) +core := zapcore.NewCore( + zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), + w, + zap.InfoLevel, +) +logger := zap.New(core) +``` + +## Extensions + +We'd love to support every logging need within zap itself, but we're only +familiar with a handful of log ingestion systems, flag-parsing packages, and +the like. Rather than merging code that we can't effectively debug and +support, we'd rather grow an ecosystem of zap extensions. + +We're aware of the following extensions, but haven't used them ourselves: + +| Package | Integration | +| --- | --- | +| `github.com/tchap/zapext` | Sentry, syslog | +| `github.com/fgrosse/zaptest` | Ginkgo | +| `github.com/blendle/zapdriver` | Stackdriver | + +[go-proverbs]: https://go-proverbs.github.io/ +[import-path]: https://golang.org/cmd/go/#hdr-Remote_import_paths +[lumberjack]: https://godoc.org/gopkg.in/natefinch/lumberjack.v2 diff --git a/vendor/go.uber.org/zap/LICENSE.txt b/vendor/go.uber.org/zap/LICENSE.txt new file mode 100644 index 00000000..6652bed4 --- /dev/null +++ b/vendor/go.uber.org/zap/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2016-2017 Uber Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/go.uber.org/zap/Makefile b/vendor/go.uber.org/zap/Makefile new file mode 100644 index 00000000..21e436c4 --- /dev/null +++ b/vendor/go.uber.org/zap/Makefile @@ -0,0 +1,57 @@ +export GOBIN ?= $(shell pwd)/bin + +GOLINT = $(GOBIN)/golint +BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem + +# Directories containing independent Go modules. +# +# We track coverage only for the main module. +MODULE_DIRS = . ./benchmarks + +# Many Go tools take file globs or directories as arguments instead of packages. +GO_FILES := $(shell \ + find . '(' -path '*/.*' -o -path './vendor' ')' -prune \ + -o -name '*.go' -print | cut -b3-) + +.PHONY: all +all: lint test + +.PHONY: lint +lint: $(GOLINT) + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(GO_FILES) 2>&1 | tee lint.log + @echo "Checking vet..." + @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go vet ./... 2>&1) &&) true | tee -a lint.log + @echo "Checking lint..." + @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && $(GOLINT) ./... 2>&1) &&) true | tee -a lint.log + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e Makefile | tee -a lint.log + @echo "Checking for license headers..." + @./checklicense.sh | tee -a lint.log + @[ ! -s lint.log ] + +$(GOLINT): + go install golang.org/x/lint/golint + +.PHONY: test +test: + @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go test -race ./...) &&) true + +.PHONY: cover +cover: + go test -race -coverprofile=cover.out -coverpkg=./... ./... + go tool cover -html=cover.out -o cover.html + +.PHONY: bench +BENCH ?= . +bench: + @$(foreach dir,$(MODULE_DIRS), ( \ + cd $(dir) && \ + go list ./... | xargs -n1 go test -bench=$(BENCH) -run="^$$" $(BENCH_FLAGS) \ + ) &&) true + +.PHONY: updatereadme +updatereadme: + rm -f README.md + cat .readme.tmpl | go run internal/readme/readme.go > README.md diff --git a/vendor/go.uber.org/zap/README.md b/vendor/go.uber.org/zap/README.md new file mode 100644 index 00000000..bcea28a1 --- /dev/null +++ b/vendor/go.uber.org/zap/README.md @@ -0,0 +1,134 @@ +# :zap: zap [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +Blazing fast, structured, leveled logging in Go. + +## Installation + +`go get -u go.uber.org/zap` + +Note that zap only supports the two most recent minor versions of Go. + +## Quick Start + +In contexts where performance is nice, but not critical, use the +`SugaredLogger`. It's 4-10x faster than other structured logging +packages and includes both structured and `printf`-style APIs. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() // flushes buffer, if any +sugar := logger.Sugar() +sugar.Infow("failed to fetch URL", + // Structured context as loosely typed key-value pairs. + "url", url, + "attempt", 3, + "backoff", time.Second, +) +sugar.Infof("Failed to fetch URL: %s", url) +``` + +When performance and type safety are critical, use the `Logger`. It's even +faster than the `SugaredLogger` and allocates far less, but it only supports +structured logging. + +```go +logger, _ := zap.NewProduction() +defer logger.Sync() +logger.Info("failed to fetch URL", + // Structured context as strongly typed Field values. + zap.String("url", url), + zap.Int("attempt", 3), + zap.Duration("backoff", time.Second), +) +``` + +See the [documentation][doc] and [FAQ](FAQ.md) for more details. + +## Performance + +For applications that log in the hot path, reflection-based serialization and +string formatting are prohibitively expensive — they're CPU-intensive +and make many small allocations. Put differently, using `encoding/json` and +`fmt.Fprintf` to log tons of `interface{}`s makes your application slow. + +Zap takes a different approach. It includes a reflection-free, zero-allocation +JSON encoder, and the base `Logger` strives to avoid serialization overhead +and allocations wherever possible. By building the high-level `SugaredLogger` +on that foundation, zap lets users *choose* when they need to count every +allocation and when they'd prefer a more familiar, loosely typed API. + +As measured by its own [benchmarking suite][], not only is zap more performant +than comparable structured logging packages — it's also faster than the +standard library. Like all benchmarks, take these with a grain of salt.[1](#footnote-versions) + +Log a message and 10 fields: + +| Package | Time | Time % to zap | Objects Allocated | +| :------ | :--: | :-----------: | :---------------: | +| :zap: zap | 862 ns/op | +0% | 5 allocs/op +| :zap: zap (sugared) | 1250 ns/op | +45% | 11 allocs/op +| zerolog | 4021 ns/op | +366% | 76 allocs/op +| go-kit | 4542 ns/op | +427% | 105 allocs/op +| apex/log | 26785 ns/op | +3007% | 115 allocs/op +| logrus | 29501 ns/op | +3322% | 125 allocs/op +| log15 | 29906 ns/op | +3369% | 122 allocs/op + +Log a message with a logger that already has 10 fields of context: + +| Package | Time | Time % to zap | Objects Allocated | +| :------ | :--: | :-----------: | :---------------: | +| :zap: zap | 126 ns/op | +0% | 0 allocs/op +| :zap: zap (sugared) | 187 ns/op | +48% | 2 allocs/op +| zerolog | 88 ns/op | -30% | 0 allocs/op +| go-kit | 5087 ns/op | +3937% | 103 allocs/op +| log15 | 18548 ns/op | +14621% | 73 allocs/op +| apex/log | 26012 ns/op | +20544% | 104 allocs/op +| logrus | 27236 ns/op | +21516% | 113 allocs/op + +Log a static string, without any context or `printf`-style templating: + +| Package | Time | Time % to zap | Objects Allocated | +| :------ | :--: | :-----------: | :---------------: | +| :zap: zap | 118 ns/op | +0% | 0 allocs/op +| :zap: zap (sugared) | 191 ns/op | +62% | 2 allocs/op +| zerolog | 93 ns/op | -21% | 0 allocs/op +| go-kit | 280 ns/op | +137% | 11 allocs/op +| standard library | 499 ns/op | +323% | 2 allocs/op +| apex/log | 1990 ns/op | +1586% | 10 allocs/op +| logrus | 3129 ns/op | +2552% | 24 allocs/op +| log15 | 3887 ns/op | +3194% | 23 allocs/op + +## Development Status: Stable + +All APIs are finalized, and no breaking changes will be made in the 1.x series +of releases. Users of semver-aware dependency management systems should pin +zap to `^1`. + +## Contributing + +We encourage and support an active, healthy community of contributors — +including you! Details are in the [contribution guide](CONTRIBUTING.md) and +the [code of conduct](CODE_OF_CONDUCT.md). The zap maintainers keep an eye on +issues and pull requests, but you can also report any negative conduct to +oss-conduct@uber.com. That email list is a private, safe space; even the zap +maintainers don't have access, so don't hesitate to hold us to a high +standard. + +
+ +Released under the [MIT License](LICENSE.txt). + +1 In particular, keep in mind that we may be +benchmarking against slightly older versions of other packages. Versions are +pinned in the [benchmarks/go.mod][] file. [↩](#anchor-versions) + +[doc-img]: https://godoc.org/go.uber.org/zap?status.svg +[doc]: https://godoc.org/go.uber.org/zap +[ci-img]: https://travis-ci.com/uber-go/zap.svg?branch=master +[ci]: https://travis-ci.com/uber-go/zap +[cov-img]: https://codecov.io/gh/uber-go/zap/branch/master/graph/badge.svg +[cov]: https://codecov.io/gh/uber-go/zap +[benchmarking suite]: https://github.com/uber-go/zap/tree/master/benchmarks +[benchmarks/go.mod]: https://github.com/uber-go/zap/blob/master/benchmarks/go.mod + diff --git a/vendor/go.uber.org/zap/array.go b/vendor/go.uber.org/zap/array.go new file mode 100644 index 00000000..5be3704a --- /dev/null +++ b/vendor/go.uber.org/zap/array.go @@ -0,0 +1,320 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "time" + + "go.uber.org/zap/zapcore" +) + +// Array constructs a field with the given key and ArrayMarshaler. It provides +// a flexible, but still type-safe and efficient, way to add array-like types +// to the logging context. The struct's MarshalLogArray method is called lazily. +func Array(key string, val zapcore.ArrayMarshaler) Field { + return Field{Key: key, Type: zapcore.ArrayMarshalerType, Interface: val} +} + +// Bools constructs a field that carries a slice of bools. +func Bools(key string, bs []bool) Field { + return Array(key, bools(bs)) +} + +// ByteStrings constructs a field that carries a slice of []byte, each of which +// must be UTF-8 encoded text. +func ByteStrings(key string, bss [][]byte) Field { + return Array(key, byteStringsArray(bss)) +} + +// Complex128s constructs a field that carries a slice of complex numbers. +func Complex128s(key string, nums []complex128) Field { + return Array(key, complex128s(nums)) +} + +// Complex64s constructs a field that carries a slice of complex numbers. +func Complex64s(key string, nums []complex64) Field { + return Array(key, complex64s(nums)) +} + +// Durations constructs a field that carries a slice of time.Durations. +func Durations(key string, ds []time.Duration) Field { + return Array(key, durations(ds)) +} + +// Float64s constructs a field that carries a slice of floats. +func Float64s(key string, nums []float64) Field { + return Array(key, float64s(nums)) +} + +// Float32s constructs a field that carries a slice of floats. +func Float32s(key string, nums []float32) Field { + return Array(key, float32s(nums)) +} + +// Ints constructs a field that carries a slice of integers. +func Ints(key string, nums []int) Field { + return Array(key, ints(nums)) +} + +// Int64s constructs a field that carries a slice of integers. +func Int64s(key string, nums []int64) Field { + return Array(key, int64s(nums)) +} + +// Int32s constructs a field that carries a slice of integers. +func Int32s(key string, nums []int32) Field { + return Array(key, int32s(nums)) +} + +// Int16s constructs a field that carries a slice of integers. +func Int16s(key string, nums []int16) Field { + return Array(key, int16s(nums)) +} + +// Int8s constructs a field that carries a slice of integers. +func Int8s(key string, nums []int8) Field { + return Array(key, int8s(nums)) +} + +// Strings constructs a field that carries a slice of strings. +func Strings(key string, ss []string) Field { + return Array(key, stringArray(ss)) +} + +// Times constructs a field that carries a slice of time.Times. +func Times(key string, ts []time.Time) Field { + return Array(key, times(ts)) +} + +// Uints constructs a field that carries a slice of unsigned integers. +func Uints(key string, nums []uint) Field { + return Array(key, uints(nums)) +} + +// Uint64s constructs a field that carries a slice of unsigned integers. +func Uint64s(key string, nums []uint64) Field { + return Array(key, uint64s(nums)) +} + +// Uint32s constructs a field that carries a slice of unsigned integers. +func Uint32s(key string, nums []uint32) Field { + return Array(key, uint32s(nums)) +} + +// Uint16s constructs a field that carries a slice of unsigned integers. +func Uint16s(key string, nums []uint16) Field { + return Array(key, uint16s(nums)) +} + +// Uint8s constructs a field that carries a slice of unsigned integers. +func Uint8s(key string, nums []uint8) Field { + return Array(key, uint8s(nums)) +} + +// Uintptrs constructs a field that carries a slice of pointer addresses. +func Uintptrs(key string, us []uintptr) Field { + return Array(key, uintptrs(us)) +} + +// Errors constructs a field that carries a slice of errors. +func Errors(key string, errs []error) Field { + return Array(key, errArray(errs)) +} + +type bools []bool + +func (bs bools) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range bs { + arr.AppendBool(bs[i]) + } + return nil +} + +type byteStringsArray [][]byte + +func (bss byteStringsArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range bss { + arr.AppendByteString(bss[i]) + } + return nil +} + +type complex128s []complex128 + +func (nums complex128s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendComplex128(nums[i]) + } + return nil +} + +type complex64s []complex64 + +func (nums complex64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendComplex64(nums[i]) + } + return nil +} + +type durations []time.Duration + +func (ds durations) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range ds { + arr.AppendDuration(ds[i]) + } + return nil +} + +type float64s []float64 + +func (nums float64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendFloat64(nums[i]) + } + return nil +} + +type float32s []float32 + +func (nums float32s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendFloat32(nums[i]) + } + return nil +} + +type ints []int + +func (nums ints) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt(nums[i]) + } + return nil +} + +type int64s []int64 + +func (nums int64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt64(nums[i]) + } + return nil +} + +type int32s []int32 + +func (nums int32s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt32(nums[i]) + } + return nil +} + +type int16s []int16 + +func (nums int16s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt16(nums[i]) + } + return nil +} + +type int8s []int8 + +func (nums int8s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendInt8(nums[i]) + } + return nil +} + +type stringArray []string + +func (ss stringArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range ss { + arr.AppendString(ss[i]) + } + return nil +} + +type times []time.Time + +func (ts times) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range ts { + arr.AppendTime(ts[i]) + } + return nil +} + +type uints []uint + +func (nums uints) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint(nums[i]) + } + return nil +} + +type uint64s []uint64 + +func (nums uint64s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint64(nums[i]) + } + return nil +} + +type uint32s []uint32 + +func (nums uint32s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint32(nums[i]) + } + return nil +} + +type uint16s []uint16 + +func (nums uint16s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint16(nums[i]) + } + return nil +} + +type uint8s []uint8 + +func (nums uint8s) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUint8(nums[i]) + } + return nil +} + +type uintptrs []uintptr + +func (nums uintptrs) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range nums { + arr.AppendUintptr(nums[i]) + } + return nil +} diff --git a/vendor/go.uber.org/zap/buffer/buffer.go b/vendor/go.uber.org/zap/buffer/buffer.go new file mode 100644 index 00000000..7592e8c6 --- /dev/null +++ b/vendor/go.uber.org/zap/buffer/buffer.go @@ -0,0 +1,115 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package buffer provides a thin wrapper around a byte slice. Unlike the +// standard library's bytes.Buffer, it supports a portion of the strconv +// package's zero-allocation formatters. +package buffer // import "go.uber.org/zap/buffer" + +import "strconv" + +const _size = 1024 // by default, create 1 KiB buffers + +// Buffer is a thin wrapper around a byte slice. It's intended to be pooled, so +// the only way to construct one is via a Pool. +type Buffer struct { + bs []byte + pool Pool +} + +// AppendByte writes a single byte to the Buffer. +func (b *Buffer) AppendByte(v byte) { + b.bs = append(b.bs, v) +} + +// AppendString writes a string to the Buffer. +func (b *Buffer) AppendString(s string) { + b.bs = append(b.bs, s...) +} + +// AppendInt appends an integer to the underlying buffer (assuming base 10). +func (b *Buffer) AppendInt(i int64) { + b.bs = strconv.AppendInt(b.bs, i, 10) +} + +// AppendUint appends an unsigned integer to the underlying buffer (assuming +// base 10). +func (b *Buffer) AppendUint(i uint64) { + b.bs = strconv.AppendUint(b.bs, i, 10) +} + +// AppendBool appends a bool to the underlying buffer. +func (b *Buffer) AppendBool(v bool) { + b.bs = strconv.AppendBool(b.bs, v) +} + +// AppendFloat appends a float to the underlying buffer. It doesn't quote NaN +// or +/- Inf. +func (b *Buffer) AppendFloat(f float64, bitSize int) { + b.bs = strconv.AppendFloat(b.bs, f, 'f', -1, bitSize) +} + +// Len returns the length of the underlying byte slice. +func (b *Buffer) Len() int { + return len(b.bs) +} + +// Cap returns the capacity of the underlying byte slice. +func (b *Buffer) Cap() int { + return cap(b.bs) +} + +// Bytes returns a mutable reference to the underlying byte slice. +func (b *Buffer) Bytes() []byte { + return b.bs +} + +// String returns a string copy of the underlying byte slice. +func (b *Buffer) String() string { + return string(b.bs) +} + +// Reset resets the underlying byte slice. Subsequent writes re-use the slice's +// backing array. +func (b *Buffer) Reset() { + b.bs = b.bs[:0] +} + +// Write implements io.Writer. +func (b *Buffer) Write(bs []byte) (int, error) { + b.bs = append(b.bs, bs...) + return len(bs), nil +} + +// TrimNewline trims any final "\n" byte from the end of the buffer. +func (b *Buffer) TrimNewline() { + if i := len(b.bs) - 1; i >= 0 { + if b.bs[i] == '\n' { + b.bs = b.bs[:i] + } + } +} + +// Free returns the Buffer to its Pool. +// +// Callers must not retain references to the Buffer after calling Free. +func (b *Buffer) Free() { + b.pool.put(b) +} diff --git a/vendor/go.uber.org/zap/buffer/pool.go b/vendor/go.uber.org/zap/buffer/pool.go new file mode 100644 index 00000000..8fb3e202 --- /dev/null +++ b/vendor/go.uber.org/zap/buffer/pool.go @@ -0,0 +1,49 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package buffer + +import "sync" + +// A Pool is a type-safe wrapper around a sync.Pool. +type Pool struct { + p *sync.Pool +} + +// NewPool constructs a new Pool. +func NewPool() Pool { + return Pool{p: &sync.Pool{ + New: func() interface{} { + return &Buffer{bs: make([]byte, 0, _size)} + }, + }} +} + +// Get retrieves a Buffer from the pool, creating one if necessary. +func (p Pool) Get() *Buffer { + buf := p.p.Get().(*Buffer) + buf.Reset() + buf.pool = p + return buf +} + +func (p Pool) put(buf *Buffer) { + p.p.Put(buf) +} diff --git a/vendor/go.uber.org/zap/checklicense.sh b/vendor/go.uber.org/zap/checklicense.sh new file mode 100644 index 00000000..345ac8b8 --- /dev/null +++ b/vendor/go.uber.org/zap/checklicense.sh @@ -0,0 +1,17 @@ +#!/bin/bash -e + +ERROR_COUNT=0 +while read -r file +do + case "$(head -1 "${file}")" in + *"Copyright (c) "*" Uber Technologies, Inc.") + # everything's cool + ;; + *) + echo "$file is missing license header." + (( ERROR_COUNT++ )) + ;; + esac +done < <(git ls-files "*\.go") + +exit $ERROR_COUNT diff --git a/vendor/go.uber.org/zap/config.go b/vendor/go.uber.org/zap/config.go new file mode 100644 index 00000000..6fe17d9e --- /dev/null +++ b/vendor/go.uber.org/zap/config.go @@ -0,0 +1,243 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "sort" + "time" + + "go.uber.org/zap/zapcore" +) + +// SamplingConfig sets a sampling strategy for the logger. Sampling caps the +// global CPU and I/O load that logging puts on your process while attempting +// to preserve a representative subset of your logs. +// +// Values configured here are per-second. See zapcore.NewSampler for details. +type SamplingConfig struct { + Initial int `json:"initial" yaml:"initial"` + Thereafter int `json:"thereafter" yaml:"thereafter"` +} + +// Config offers a declarative way to construct a logger. It doesn't do +// anything that can't be done with New, Options, and the various +// zapcore.WriteSyncer and zapcore.Core wrappers, but it's a simpler way to +// toggle common options. +// +// Note that Config intentionally supports only the most common options. More +// unusual logging setups (logging to network connections or message queues, +// splitting output between multiple files, etc.) are possible, but require +// direct use of the zapcore package. For sample code, see the package-level +// BasicConfiguration and AdvancedConfiguration examples. +// +// For an example showing runtime log level changes, see the documentation for +// AtomicLevel. +type Config struct { + // Level is the minimum enabled logging level. Note that this is a dynamic + // level, so calling Config.Level.SetLevel will atomically change the log + // level of all loggers descended from this config. + Level AtomicLevel `json:"level" yaml:"level"` + // Development puts the logger in development mode, which changes the + // behavior of DPanicLevel and takes stacktraces more liberally. + Development bool `json:"development" yaml:"development"` + // DisableCaller stops annotating logs with the calling function's file + // name and line number. By default, all logs are annotated. + DisableCaller bool `json:"disableCaller" yaml:"disableCaller"` + // DisableStacktrace completely disables automatic stacktrace capturing. By + // default, stacktraces are captured for WarnLevel and above logs in + // development and ErrorLevel and above in production. + DisableStacktrace bool `json:"disableStacktrace" yaml:"disableStacktrace"` + // Sampling sets a sampling policy. A nil SamplingConfig disables sampling. + Sampling *SamplingConfig `json:"sampling" yaml:"sampling"` + // Encoding sets the logger's encoding. Valid values are "json" and + // "console", as well as any third-party encodings registered via + // RegisterEncoder. + Encoding string `json:"encoding" yaml:"encoding"` + // EncoderConfig sets options for the chosen encoder. See + // zapcore.EncoderConfig for details. + EncoderConfig zapcore.EncoderConfig `json:"encoderConfig" yaml:"encoderConfig"` + // OutputPaths is a list of URLs or file paths to write logging output to. + // See Open for details. + OutputPaths []string `json:"outputPaths" yaml:"outputPaths"` + // ErrorOutputPaths is a list of URLs to write internal logger errors to. + // The default is standard error. + // + // Note that this setting only affects internal errors; for sample code that + // sends error-level logs to a different location from info- and debug-level + // logs, see the package-level AdvancedConfiguration example. + ErrorOutputPaths []string `json:"errorOutputPaths" yaml:"errorOutputPaths"` + // InitialFields is a collection of fields to add to the root logger. + InitialFields map[string]interface{} `json:"initialFields" yaml:"initialFields"` +} + +// NewProductionEncoderConfig returns an opinionated EncoderConfig for +// production environments. +func NewProductionEncoderConfig() zapcore.EncoderConfig { + return zapcore.EncoderConfig{ + TimeKey: "ts", + LevelKey: "level", + NameKey: "logger", + CallerKey: "caller", + MessageKey: "msg", + StacktraceKey: "stacktrace", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.EpochTimeEncoder, + EncodeDuration: zapcore.SecondsDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } +} + +// NewProductionConfig is a reasonable production logging configuration. +// Logging is enabled at InfoLevel and above. +// +// It uses a JSON encoder, writes to standard error, and enables sampling. +// Stacktraces are automatically included on logs of ErrorLevel and above. +func NewProductionConfig() Config { + return Config{ + Level: NewAtomicLevelAt(InfoLevel), + Development: false, + Sampling: &SamplingConfig{ + Initial: 100, + Thereafter: 100, + }, + Encoding: "json", + EncoderConfig: NewProductionEncoderConfig(), + OutputPaths: []string{"stderr"}, + ErrorOutputPaths: []string{"stderr"}, + } +} + +// NewDevelopmentEncoderConfig returns an opinionated EncoderConfig for +// development environments. +func NewDevelopmentEncoderConfig() zapcore.EncoderConfig { + return zapcore.EncoderConfig{ + // Keys can be anything except the empty string. + TimeKey: "T", + LevelKey: "L", + NameKey: "N", + CallerKey: "C", + MessageKey: "M", + StacktraceKey: "S", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.CapitalLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } +} + +// NewDevelopmentConfig is a reasonable development logging configuration. +// Logging is enabled at DebugLevel and above. +// +// It enables development mode (which makes DPanicLevel logs panic), uses a +// console encoder, writes to standard error, and disables sampling. +// Stacktraces are automatically included on logs of WarnLevel and above. +func NewDevelopmentConfig() Config { + return Config{ + Level: NewAtomicLevelAt(DebugLevel), + Development: true, + Encoding: "console", + EncoderConfig: NewDevelopmentEncoderConfig(), + OutputPaths: []string{"stderr"}, + ErrorOutputPaths: []string{"stderr"}, + } +} + +// Build constructs a logger from the Config and Options. +func (cfg Config) Build(opts ...Option) (*Logger, error) { + enc, err := cfg.buildEncoder() + if err != nil { + return nil, err + } + + sink, errSink, err := cfg.openSinks() + if err != nil { + return nil, err + } + + log := New( + zapcore.NewCore(enc, sink, cfg.Level), + cfg.buildOptions(errSink)..., + ) + if len(opts) > 0 { + log = log.WithOptions(opts...) + } + return log, nil +} + +func (cfg Config) buildOptions(errSink zapcore.WriteSyncer) []Option { + opts := []Option{ErrorOutput(errSink)} + + if cfg.Development { + opts = append(opts, Development()) + } + + if !cfg.DisableCaller { + opts = append(opts, AddCaller()) + } + + stackLevel := ErrorLevel + if cfg.Development { + stackLevel = WarnLevel + } + if !cfg.DisableStacktrace { + opts = append(opts, AddStacktrace(stackLevel)) + } + + if cfg.Sampling != nil { + opts = append(opts, WrapCore(func(core zapcore.Core) zapcore.Core { + return zapcore.NewSampler(core, time.Second, int(cfg.Sampling.Initial), int(cfg.Sampling.Thereafter)) + })) + } + + if len(cfg.InitialFields) > 0 { + fs := make([]Field, 0, len(cfg.InitialFields)) + keys := make([]string, 0, len(cfg.InitialFields)) + for k := range cfg.InitialFields { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + fs = append(fs, Any(k, cfg.InitialFields[k])) + } + opts = append(opts, Fields(fs...)) + } + + return opts +} + +func (cfg Config) openSinks() (zapcore.WriteSyncer, zapcore.WriteSyncer, error) { + sink, closeOut, err := Open(cfg.OutputPaths...) + if err != nil { + return nil, nil, err + } + errSink, _, err := Open(cfg.ErrorOutputPaths...) + if err != nil { + closeOut() + return nil, nil, err + } + return sink, errSink, nil +} + +func (cfg Config) buildEncoder() (zapcore.Encoder, error) { + return newEncoder(cfg.Encoding, cfg.EncoderConfig) +} diff --git a/vendor/go.uber.org/zap/doc.go b/vendor/go.uber.org/zap/doc.go new file mode 100644 index 00000000..8638dd1b --- /dev/null +++ b/vendor/go.uber.org/zap/doc.go @@ -0,0 +1,113 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package zap provides fast, structured, leveled logging. +// +// For applications that log in the hot path, reflection-based serialization +// and string formatting are prohibitively expensive - they're CPU-intensive +// and make many small allocations. Put differently, using json.Marshal and +// fmt.Fprintf to log tons of interface{} makes your application slow. +// +// Zap takes a different approach. It includes a reflection-free, +// zero-allocation JSON encoder, and the base Logger strives to avoid +// serialization overhead and allocations wherever possible. By building the +// high-level SugaredLogger on that foundation, zap lets users choose when +// they need to count every allocation and when they'd prefer a more familiar, +// loosely typed API. +// +// Choosing a Logger +// +// In contexts where performance is nice, but not critical, use the +// SugaredLogger. It's 4-10x faster than other structured logging packages and +// supports both structured and printf-style logging. Like log15 and go-kit, +// the SugaredLogger's structured logging APIs are loosely typed and accept a +// variadic number of key-value pairs. (For more advanced use cases, they also +// accept strongly typed fields - see the SugaredLogger.With documentation for +// details.) +// sugar := zap.NewExample().Sugar() +// defer sugar.Sync() +// sugar.Infow("failed to fetch URL", +// "url", "http://example.com", +// "attempt", 3, +// "backoff", time.Second, +// ) +// sugar.Infof("failed to fetch URL: %s", "http://example.com") +// +// By default, loggers are unbuffered. However, since zap's low-level APIs +// allow buffering, calling Sync before letting your process exit is a good +// habit. +// +// In the rare contexts where every microsecond and every allocation matter, +// use the Logger. It's even faster than the SugaredLogger and allocates far +// less, but it only supports strongly-typed, structured logging. +// logger := zap.NewExample() +// defer logger.Sync() +// logger.Info("failed to fetch URL", +// zap.String("url", "http://example.com"), +// zap.Int("attempt", 3), +// zap.Duration("backoff", time.Second), +// ) +// +// Choosing between the Logger and SugaredLogger doesn't need to be an +// application-wide decision: converting between the two is simple and +// inexpensive. +// logger := zap.NewExample() +// defer logger.Sync() +// sugar := logger.Sugar() +// plain := sugar.Desugar() +// +// Configuring Zap +// +// The simplest way to build a Logger is to use zap's opinionated presets: +// NewExample, NewProduction, and NewDevelopment. These presets build a logger +// with a single function call: +// logger, err := zap.NewProduction() +// if err != nil { +// log.Fatalf("can't initialize zap logger: %v", err) +// } +// defer logger.Sync() +// +// Presets are fine for small projects, but larger projects and organizations +// naturally require a bit more customization. For most users, zap's Config +// struct strikes the right balance between flexibility and convenience. See +// the package-level BasicConfiguration example for sample code. +// +// More unusual configurations (splitting output between files, sending logs +// to a message queue, etc.) are possible, but require direct use of +// go.uber.org/zap/zapcore. See the package-level AdvancedConfiguration +// example for sample code. +// +// Extending Zap +// +// The zap package itself is a relatively thin wrapper around the interfaces +// in go.uber.org/zap/zapcore. Extending zap to support a new encoding (e.g., +// BSON), a new log sink (e.g., Kafka), or something more exotic (perhaps an +// exception aggregation service, like Sentry or Rollbar) typically requires +// implementing the zapcore.Encoder, zapcore.WriteSyncer, or zapcore.Core +// interfaces. See the zapcore documentation for details. +// +// Similarly, package authors can use the high-performance Encoder and Core +// implementations in the zapcore package to build their own loggers. +// +// Frequently Asked Questions +// +// An FAQ covering everything from installation errors to design decisions is +// available at https://github.com/uber-go/zap/blob/master/FAQ.md. +package zap // import "go.uber.org/zap" diff --git a/vendor/go.uber.org/zap/encoder.go b/vendor/go.uber.org/zap/encoder.go new file mode 100644 index 00000000..2e9d3c34 --- /dev/null +++ b/vendor/go.uber.org/zap/encoder.go @@ -0,0 +1,75 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "errors" + "fmt" + "sync" + + "go.uber.org/zap/zapcore" +) + +var ( + errNoEncoderNameSpecified = errors.New("no encoder name specified") + + _encoderNameToConstructor = map[string]func(zapcore.EncoderConfig) (zapcore.Encoder, error){ + "console": func(encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { + return zapcore.NewConsoleEncoder(encoderConfig), nil + }, + "json": func(encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { + return zapcore.NewJSONEncoder(encoderConfig), nil + }, + } + _encoderMutex sync.RWMutex +) + +// RegisterEncoder registers an encoder constructor, which the Config struct +// can then reference. By default, the "json" and "console" encoders are +// registered. +// +// Attempting to register an encoder whose name is already taken returns an +// error. +func RegisterEncoder(name string, constructor func(zapcore.EncoderConfig) (zapcore.Encoder, error)) error { + _encoderMutex.Lock() + defer _encoderMutex.Unlock() + if name == "" { + return errNoEncoderNameSpecified + } + if _, ok := _encoderNameToConstructor[name]; ok { + return fmt.Errorf("encoder already registered for name %q", name) + } + _encoderNameToConstructor[name] = constructor + return nil +} + +func newEncoder(name string, encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { + _encoderMutex.RLock() + defer _encoderMutex.RUnlock() + if name == "" { + return nil, errNoEncoderNameSpecified + } + constructor, ok := _encoderNameToConstructor[name] + if !ok { + return nil, fmt.Errorf("no encoder registered for name %q", name) + } + return constructor(encoderConfig) +} diff --git a/vendor/go.uber.org/zap/error.go b/vendor/go.uber.org/zap/error.go new file mode 100644 index 00000000..65982a51 --- /dev/null +++ b/vendor/go.uber.org/zap/error.go @@ -0,0 +1,80 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "sync" + + "go.uber.org/zap/zapcore" +) + +var _errArrayElemPool = sync.Pool{New: func() interface{} { + return &errArrayElem{} +}} + +// Error is shorthand for the common idiom NamedError("error", err). +func Error(err error) Field { + return NamedError("error", err) +} + +// NamedError constructs a field that lazily stores err.Error() under the +// provided key. Errors which also implement fmt.Formatter (like those produced +// by github.com/pkg/errors) will also have their verbose representation stored +// under key+"Verbose". If passed a nil error, the field is a no-op. +// +// For the common case in which the key is simply "error", the Error function +// is shorter and less repetitive. +func NamedError(key string, err error) Field { + if err == nil { + return Skip() + } + return Field{Key: key, Type: zapcore.ErrorType, Interface: err} +} + +type errArray []error + +func (errs errArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range errs { + if errs[i] == nil { + continue + } + // To represent each error as an object with an "error" attribute and + // potentially an "errorVerbose" attribute, we need to wrap it in a + // type that implements LogObjectMarshaler. To prevent this from + // allocating, pool the wrapper type. + elem := _errArrayElemPool.Get().(*errArrayElem) + elem.error = errs[i] + arr.AppendObject(elem) + elem.error = nil + _errArrayElemPool.Put(elem) + } + return nil +} + +type errArrayElem struct { + error +} + +func (e *errArrayElem) MarshalLogObject(enc zapcore.ObjectEncoder) error { + // Re-use the error field's logic, which supports non-standard error types. + Error(e.error).AddTo(enc) + return nil +} diff --git a/vendor/go.uber.org/zap/field.go b/vendor/go.uber.org/zap/field.go new file mode 100644 index 00000000..83c1ea24 --- /dev/null +++ b/vendor/go.uber.org/zap/field.go @@ -0,0 +1,525 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "fmt" + "math" + "time" + + "go.uber.org/zap/zapcore" +) + +// Field is an alias for Field. Aliasing this type dramatically +// improves the navigability of this package's API documentation. +type Field = zapcore.Field + +// Skip constructs a no-op field, which is often useful when handling invalid +// inputs in other Field constructors. +func Skip() Field { + return Field{Type: zapcore.SkipType} +} + +// nilField returns a field which will marshal explicitly as nil. See motivation +// in https://github.com/uber-go/zap/issues/753 . If we ever make breaking +// changes and add zapcore.NilType and zapcore.ObjectEncoder.AddNil, the +// implementation here should be changed to reflect that. +func nilField(key string) Field { return Reflect(key, nil) } + +// Binary constructs a field that carries an opaque binary blob. +// +// Binary data is serialized in an encoding-appropriate format. For example, +// zap's JSON encoder base64-encodes binary blobs. To log UTF-8 encoded text, +// use ByteString. +func Binary(key string, val []byte) Field { + return Field{Key: key, Type: zapcore.BinaryType, Interface: val} +} + +// Bool constructs a field that carries a bool. +func Bool(key string, val bool) Field { + var ival int64 + if val { + ival = 1 + } + return Field{Key: key, Type: zapcore.BoolType, Integer: ival} +} + +// Boolp constructs a field that carries a *bool. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Boolp(key string, val *bool) Field { + if val == nil { + return nilField(key) + } + return Bool(key, *val) +} + +// ByteString constructs a field that carries UTF-8 encoded text as a []byte. +// To log opaque binary blobs (which aren't necessarily valid UTF-8), use +// Binary. +func ByteString(key string, val []byte) Field { + return Field{Key: key, Type: zapcore.ByteStringType, Interface: val} +} + +// Complex128 constructs a field that carries a complex number. Unlike most +// numeric fields, this costs an allocation (to convert the complex128 to +// interface{}). +func Complex128(key string, val complex128) Field { + return Field{Key: key, Type: zapcore.Complex128Type, Interface: val} +} + +// Complex128p constructs a field that carries a *complex128. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Complex128p(key string, val *complex128) Field { + if val == nil { + return nilField(key) + } + return Complex128(key, *val) +} + +// Complex64 constructs a field that carries a complex number. Unlike most +// numeric fields, this costs an allocation (to convert the complex64 to +// interface{}). +func Complex64(key string, val complex64) Field { + return Field{Key: key, Type: zapcore.Complex64Type, Interface: val} +} + +// Complex64p constructs a field that carries a *complex64. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Complex64p(key string, val *complex64) Field { + if val == nil { + return nilField(key) + } + return Complex64(key, *val) +} + +// Float64 constructs a field that carries a float64. The way the +// floating-point value is represented is encoder-dependent, so marshaling is +// necessarily lazy. +func Float64(key string, val float64) Field { + return Field{Key: key, Type: zapcore.Float64Type, Integer: int64(math.Float64bits(val))} +} + +// Float64p constructs a field that carries a *float64. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Float64p(key string, val *float64) Field { + if val == nil { + return nilField(key) + } + return Float64(key, *val) +} + +// Float32 constructs a field that carries a float32. The way the +// floating-point value is represented is encoder-dependent, so marshaling is +// necessarily lazy. +func Float32(key string, val float32) Field { + return Field{Key: key, Type: zapcore.Float32Type, Integer: int64(math.Float32bits(val))} +} + +// Float32p constructs a field that carries a *float32. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Float32p(key string, val *float32) Field { + if val == nil { + return nilField(key) + } + return Float32(key, *val) +} + +// Int constructs a field with the given key and value. +func Int(key string, val int) Field { + return Int64(key, int64(val)) +} + +// Intp constructs a field that carries a *int. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Intp(key string, val *int) Field { + if val == nil { + return nilField(key) + } + return Int(key, *val) +} + +// Int64 constructs a field with the given key and value. +func Int64(key string, val int64) Field { + return Field{Key: key, Type: zapcore.Int64Type, Integer: val} +} + +// Int64p constructs a field that carries a *int64. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Int64p(key string, val *int64) Field { + if val == nil { + return nilField(key) + } + return Int64(key, *val) +} + +// Int32 constructs a field with the given key and value. +func Int32(key string, val int32) Field { + return Field{Key: key, Type: zapcore.Int32Type, Integer: int64(val)} +} + +// Int32p constructs a field that carries a *int32. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Int32p(key string, val *int32) Field { + if val == nil { + return nilField(key) + } + return Int32(key, *val) +} + +// Int16 constructs a field with the given key and value. +func Int16(key string, val int16) Field { + return Field{Key: key, Type: zapcore.Int16Type, Integer: int64(val)} +} + +// Int16p constructs a field that carries a *int16. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Int16p(key string, val *int16) Field { + if val == nil { + return nilField(key) + } + return Int16(key, *val) +} + +// Int8 constructs a field with the given key and value. +func Int8(key string, val int8) Field { + return Field{Key: key, Type: zapcore.Int8Type, Integer: int64(val)} +} + +// Int8p constructs a field that carries a *int8. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Int8p(key string, val *int8) Field { + if val == nil { + return nilField(key) + } + return Int8(key, *val) +} + +// String constructs a field with the given key and value. +func String(key string, val string) Field { + return Field{Key: key, Type: zapcore.StringType, String: val} +} + +// Stringp constructs a field that carries a *string. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Stringp(key string, val *string) Field { + if val == nil { + return nilField(key) + } + return String(key, *val) +} + +// Uint constructs a field with the given key and value. +func Uint(key string, val uint) Field { + return Uint64(key, uint64(val)) +} + +// Uintp constructs a field that carries a *uint. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Uintp(key string, val *uint) Field { + if val == nil { + return nilField(key) + } + return Uint(key, *val) +} + +// Uint64 constructs a field with the given key and value. +func Uint64(key string, val uint64) Field { + return Field{Key: key, Type: zapcore.Uint64Type, Integer: int64(val)} +} + +// Uint64p constructs a field that carries a *uint64. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Uint64p(key string, val *uint64) Field { + if val == nil { + return nilField(key) + } + return Uint64(key, *val) +} + +// Uint32 constructs a field with the given key and value. +func Uint32(key string, val uint32) Field { + return Field{Key: key, Type: zapcore.Uint32Type, Integer: int64(val)} +} + +// Uint32p constructs a field that carries a *uint32. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Uint32p(key string, val *uint32) Field { + if val == nil { + return nilField(key) + } + return Uint32(key, *val) +} + +// Uint16 constructs a field with the given key and value. +func Uint16(key string, val uint16) Field { + return Field{Key: key, Type: zapcore.Uint16Type, Integer: int64(val)} +} + +// Uint16p constructs a field that carries a *uint16. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Uint16p(key string, val *uint16) Field { + if val == nil { + return nilField(key) + } + return Uint16(key, *val) +} + +// Uint8 constructs a field with the given key and value. +func Uint8(key string, val uint8) Field { + return Field{Key: key, Type: zapcore.Uint8Type, Integer: int64(val)} +} + +// Uint8p constructs a field that carries a *uint8. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Uint8p(key string, val *uint8) Field { + if val == nil { + return nilField(key) + } + return Uint8(key, *val) +} + +// Uintptr constructs a field with the given key and value. +func Uintptr(key string, val uintptr) Field { + return Field{Key: key, Type: zapcore.UintptrType, Integer: int64(val)} +} + +// Uintptrp constructs a field that carries a *uintptr. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Uintptrp(key string, val *uintptr) Field { + if val == nil { + return nilField(key) + } + return Uintptr(key, *val) +} + +// Reflect constructs a field with the given key and an arbitrary object. It uses +// an encoding-appropriate, reflection-based function to lazily serialize nearly +// any object into the logging context, but it's relatively slow and +// allocation-heavy. Outside tests, Any is always a better choice. +// +// If encoding fails (e.g., trying to serialize a map[int]string to JSON), Reflect +// includes the error message in the final log output. +func Reflect(key string, val interface{}) Field { + return Field{Key: key, Type: zapcore.ReflectType, Interface: val} +} + +// Namespace creates a named, isolated scope within the logger's context. All +// subsequent fields will be added to the new namespace. +// +// This helps prevent key collisions when injecting loggers into sub-components +// or third-party libraries. +func Namespace(key string) Field { + return Field{Key: key, Type: zapcore.NamespaceType} +} + +// Stringer constructs a field with the given key and the output of the value's +// String method. The Stringer's String method is called lazily. +func Stringer(key string, val fmt.Stringer) Field { + return Field{Key: key, Type: zapcore.StringerType, Interface: val} +} + +// Time constructs a Field with the given key and value. The encoder +// controls how the time is serialized. +func Time(key string, val time.Time) Field { + return Field{Key: key, Type: zapcore.TimeType, Integer: val.UnixNano(), Interface: val.Location()} +} + +// Timep constructs a field that carries a *time.Time. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Timep(key string, val *time.Time) Field { + if val == nil { + return nilField(key) + } + return Time(key, *val) +} + +// Stack constructs a field that stores a stacktrace of the current goroutine +// under provided key. Keep in mind that taking a stacktrace is eager and +// expensive (relatively speaking); this function both makes an allocation and +// takes about two microseconds. +func Stack(key string) Field { + // Returning the stacktrace as a string costs an allocation, but saves us + // from expanding the zapcore.Field union struct to include a byte slice. Since + // taking a stacktrace is already so expensive (~10us), the extra allocation + // is okay. + return String(key, takeStacktrace()) +} + +// Duration constructs a field with the given key and value. The encoder +// controls how the duration is serialized. +func Duration(key string, val time.Duration) Field { + return Field{Key: key, Type: zapcore.DurationType, Integer: int64(val)} +} + +// Durationp constructs a field that carries a *time.Duration. The returned Field will safely +// and explicitly represent `nil` when appropriate. +func Durationp(key string, val *time.Duration) Field { + if val == nil { + return nilField(key) + } + return Duration(key, *val) +} + +// Object constructs a field with the given key and ObjectMarshaler. It +// provides a flexible, but still type-safe and efficient, way to add map- or +// struct-like user-defined types to the logging context. The struct's +// MarshalLogObject method is called lazily. +func Object(key string, val zapcore.ObjectMarshaler) Field { + return Field{Key: key, Type: zapcore.ObjectMarshalerType, Interface: val} +} + +// Any takes a key and an arbitrary value and chooses the best way to represent +// them as a field, falling back to a reflection-based approach only if +// necessary. +// +// Since byte/uint8 and rune/int32 are aliases, Any can't differentiate between +// them. To minimize surprises, []byte values are treated as binary blobs, byte +// values are treated as uint8, and runes are always treated as integers. +func Any(key string, value interface{}) Field { + switch val := value.(type) { + case zapcore.ObjectMarshaler: + return Object(key, val) + case zapcore.ArrayMarshaler: + return Array(key, val) + case bool: + return Bool(key, val) + case *bool: + return Boolp(key, val) + case []bool: + return Bools(key, val) + case complex128: + return Complex128(key, val) + case *complex128: + return Complex128p(key, val) + case []complex128: + return Complex128s(key, val) + case complex64: + return Complex64(key, val) + case *complex64: + return Complex64p(key, val) + case []complex64: + return Complex64s(key, val) + case float64: + return Float64(key, val) + case *float64: + return Float64p(key, val) + case []float64: + return Float64s(key, val) + case float32: + return Float32(key, val) + case *float32: + return Float32p(key, val) + case []float32: + return Float32s(key, val) + case int: + return Int(key, val) + case *int: + return Intp(key, val) + case []int: + return Ints(key, val) + case int64: + return Int64(key, val) + case *int64: + return Int64p(key, val) + case []int64: + return Int64s(key, val) + case int32: + return Int32(key, val) + case *int32: + return Int32p(key, val) + case []int32: + return Int32s(key, val) + case int16: + return Int16(key, val) + case *int16: + return Int16p(key, val) + case []int16: + return Int16s(key, val) + case int8: + return Int8(key, val) + case *int8: + return Int8p(key, val) + case []int8: + return Int8s(key, val) + case string: + return String(key, val) + case *string: + return Stringp(key, val) + case []string: + return Strings(key, val) + case uint: + return Uint(key, val) + case *uint: + return Uintp(key, val) + case []uint: + return Uints(key, val) + case uint64: + return Uint64(key, val) + case *uint64: + return Uint64p(key, val) + case []uint64: + return Uint64s(key, val) + case uint32: + return Uint32(key, val) + case *uint32: + return Uint32p(key, val) + case []uint32: + return Uint32s(key, val) + case uint16: + return Uint16(key, val) + case *uint16: + return Uint16p(key, val) + case []uint16: + return Uint16s(key, val) + case uint8: + return Uint8(key, val) + case *uint8: + return Uint8p(key, val) + case []byte: + return Binary(key, val) + case uintptr: + return Uintptr(key, val) + case *uintptr: + return Uintptrp(key, val) + case []uintptr: + return Uintptrs(key, val) + case time.Time: + return Time(key, val) + case *time.Time: + return Timep(key, val) + case []time.Time: + return Times(key, val) + case time.Duration: + return Duration(key, val) + case *time.Duration: + return Durationp(key, val) + case []time.Duration: + return Durations(key, val) + case error: + return NamedError(key, val) + case []error: + return Errors(key, val) + case fmt.Stringer: + return Stringer(key, val) + default: + return Reflect(key, val) + } +} diff --git a/vendor/go.uber.org/zap/flag.go b/vendor/go.uber.org/zap/flag.go new file mode 100644 index 00000000..13128750 --- /dev/null +++ b/vendor/go.uber.org/zap/flag.go @@ -0,0 +1,39 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "flag" + + "go.uber.org/zap/zapcore" +) + +// LevelFlag uses the standard library's flag.Var to declare a global flag +// with the specified name, default, and usage guidance. The returned value is +// a pointer to the value of the flag. +// +// If you don't want to use the flag package's global state, you can use any +// non-nil *Level as a flag.Value with your own *flag.FlagSet. +func LevelFlag(name string, defaultLevel zapcore.Level, usage string) *zapcore.Level { + lvl := defaultLevel + flag.Var(&lvl, name, usage) + return &lvl +} diff --git a/vendor/go.uber.org/zap/glide.yaml b/vendor/go.uber.org/zap/glide.yaml new file mode 100644 index 00000000..8e1d05e9 --- /dev/null +++ b/vendor/go.uber.org/zap/glide.yaml @@ -0,0 +1,34 @@ +package: go.uber.org/zap +license: MIT +import: +- package: go.uber.org/atomic + version: ^1 +- package: go.uber.org/multierr + version: ^1 +testImport: +- package: github.com/satori/go.uuid +- package: github.com/sirupsen/logrus +- package: github.com/apex/log + subpackages: + - handlers/json +- package: github.com/go-kit/kit + subpackages: + - log +- package: github.com/stretchr/testify + subpackages: + - assert + - require +- package: gopkg.in/inconshreveable/log15.v2 +- package: github.com/mattn/goveralls +- package: github.com/pborman/uuid +- package: github.com/pkg/errors +- package: github.com/rs/zerolog +- package: golang.org/x/tools + subpackages: + - cover +- package: golang.org/x/lint + subpackages: + - golint +- package: github.com/axw/gocov + subpackages: + - gocov diff --git a/vendor/go.uber.org/zap/global.go b/vendor/go.uber.org/zap/global.go new file mode 100644 index 00000000..c1ac0507 --- /dev/null +++ b/vendor/go.uber.org/zap/global.go @@ -0,0 +1,168 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "bytes" + "fmt" + "log" + "os" + "sync" + + "go.uber.org/zap/zapcore" +) + +const ( + _loggerWriterDepth = 2 + _programmerErrorTemplate = "You've found a bug in zap! Please file a bug at " + + "https://github.com/uber-go/zap/issues/new and reference this error: %v" +) + +var ( + _globalMu sync.RWMutex + _globalL = NewNop() + _globalS = _globalL.Sugar() +) + +// L returns the global Logger, which can be reconfigured with ReplaceGlobals. +// It's safe for concurrent use. +func L() *Logger { + _globalMu.RLock() + l := _globalL + _globalMu.RUnlock() + return l +} + +// S returns the global SugaredLogger, which can be reconfigured with +// ReplaceGlobals. It's safe for concurrent use. +func S() *SugaredLogger { + _globalMu.RLock() + s := _globalS + _globalMu.RUnlock() + return s +} + +// ReplaceGlobals replaces the global Logger and SugaredLogger, and returns a +// function to restore the original values. It's safe for concurrent use. +func ReplaceGlobals(logger *Logger) func() { + _globalMu.Lock() + prev := _globalL + _globalL = logger + _globalS = logger.Sugar() + _globalMu.Unlock() + return func() { ReplaceGlobals(prev) } +} + +// NewStdLog returns a *log.Logger which writes to the supplied zap Logger at +// InfoLevel. To redirect the standard library's package-global logging +// functions, use RedirectStdLog instead. +func NewStdLog(l *Logger) *log.Logger { + logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth)) + f := logger.Info + return log.New(&loggerWriter{f}, "" /* prefix */, 0 /* flags */) +} + +// NewStdLogAt returns *log.Logger which writes to supplied zap logger at +// required level. +func NewStdLogAt(l *Logger, level zapcore.Level) (*log.Logger, error) { + logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth)) + logFunc, err := levelToFunc(logger, level) + if err != nil { + return nil, err + } + return log.New(&loggerWriter{logFunc}, "" /* prefix */, 0 /* flags */), nil +} + +// RedirectStdLog redirects output from the standard library's package-global +// logger to the supplied logger at InfoLevel. Since zap already handles caller +// annotations, timestamps, etc., it automatically disables the standard +// library's annotations and prefixing. +// +// It returns a function to restore the original prefix and flags and reset the +// standard library's output to os.Stderr. +func RedirectStdLog(l *Logger) func() { + f, err := redirectStdLogAt(l, InfoLevel) + if err != nil { + // Can't get here, since passing InfoLevel to redirectStdLogAt always + // works. + panic(fmt.Sprintf(_programmerErrorTemplate, err)) + } + return f +} + +// RedirectStdLogAt redirects output from the standard library's package-global +// logger to the supplied logger at the specified level. Since zap already +// handles caller annotations, timestamps, etc., it automatically disables the +// standard library's annotations and prefixing. +// +// It returns a function to restore the original prefix and flags and reset the +// standard library's output to os.Stderr. +func RedirectStdLogAt(l *Logger, level zapcore.Level) (func(), error) { + return redirectStdLogAt(l, level) +} + +func redirectStdLogAt(l *Logger, level zapcore.Level) (func(), error) { + flags := log.Flags() + prefix := log.Prefix() + log.SetFlags(0) + log.SetPrefix("") + logger := l.WithOptions(AddCallerSkip(_stdLogDefaultDepth + _loggerWriterDepth)) + logFunc, err := levelToFunc(logger, level) + if err != nil { + return nil, err + } + log.SetOutput(&loggerWriter{logFunc}) + return func() { + log.SetFlags(flags) + log.SetPrefix(prefix) + log.SetOutput(os.Stderr) + }, nil +} + +func levelToFunc(logger *Logger, lvl zapcore.Level) (func(string, ...Field), error) { + switch lvl { + case DebugLevel: + return logger.Debug, nil + case InfoLevel: + return logger.Info, nil + case WarnLevel: + return logger.Warn, nil + case ErrorLevel: + return logger.Error, nil + case DPanicLevel: + return logger.DPanic, nil + case PanicLevel: + return logger.Panic, nil + case FatalLevel: + return logger.Fatal, nil + } + return nil, fmt.Errorf("unrecognized level: %q", lvl) +} + +type loggerWriter struct { + logFunc func(msg string, fields ...Field) +} + +func (l *loggerWriter) Write(p []byte) (int, error) { + p = bytes.TrimSpace(p) + l.logFunc(string(p)) + return len(p), nil +} diff --git a/vendor/go.uber.org/zap/global_go112.go b/vendor/go.uber.org/zap/global_go112.go new file mode 100644 index 00000000..6b5dbda8 --- /dev/null +++ b/vendor/go.uber.org/zap/global_go112.go @@ -0,0 +1,26 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// See #682 for more information. +// +build go1.12 + +package zap + +const _stdLogDefaultDepth = 1 diff --git a/vendor/go.uber.org/zap/global_prego112.go b/vendor/go.uber.org/zap/global_prego112.go new file mode 100644 index 00000000..d3ab9af9 --- /dev/null +++ b/vendor/go.uber.org/zap/global_prego112.go @@ -0,0 +1,26 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// See #682 for more information. +// +build !go1.12 + +package zap + +const _stdLogDefaultDepth = 2 diff --git a/vendor/go.uber.org/zap/go.mod b/vendor/go.uber.org/zap/go.mod new file mode 100644 index 00000000..1fb6bba0 --- /dev/null +++ b/vendor/go.uber.org/zap/go.mod @@ -0,0 +1,11 @@ +module go.uber.org/zap + +go 1.13 + +require ( + github.com/pkg/errors v0.8.1 + github.com/stretchr/testify v1.4.0 + go.uber.org/atomic v1.5.0 + go.uber.org/multierr v1.3.0 + golang.org/x/lint v0.0.0-20190930215403-16217165b5de +) diff --git a/vendor/go.uber.org/zap/go.sum b/vendor/go.uber.org/zap/go.sum new file mode 100644 index 00000000..9ff6735d --- /dev/null +++ b/vendor/go.uber.org/zap/go.sum @@ -0,0 +1,56 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c h1:IGkKhmfzcztjm6gYkykvu/NiS8kaqbCWAEWWAyf8J5U= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/vendor/go.uber.org/zap/http_handler.go b/vendor/go.uber.org/zap/http_handler.go new file mode 100644 index 00000000..1b0ecaca --- /dev/null +++ b/vendor/go.uber.org/zap/http_handler.go @@ -0,0 +1,81 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "encoding/json" + "fmt" + "net/http" + + "go.uber.org/zap/zapcore" +) + +// ServeHTTP is a simple JSON endpoint that can report on or change the current +// logging level. +// +// GET requests return a JSON description of the current logging level. PUT +// requests change the logging level and expect a payload like: +// {"level":"info"} +// +// It's perfectly safe to change the logging level while a program is running. +func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { + type errorResponse struct { + Error string `json:"error"` + } + type payload struct { + Level *zapcore.Level `json:"level"` + } + + enc := json.NewEncoder(w) + + switch r.Method { + + case http.MethodGet: + current := lvl.Level() + enc.Encode(payload{Level: ¤t}) + + case http.MethodPut: + var req payload + + if errmess := func() string { + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + return fmt.Sprintf("Request body must be well-formed JSON: %v", err) + } + if req.Level == nil { + return "Must specify a logging level." + } + return "" + }(); errmess != "" { + w.WriteHeader(http.StatusBadRequest) + enc.Encode(errorResponse{Error: errmess}) + return + } + + lvl.SetLevel(*req.Level) + enc.Encode(req) + + default: + w.WriteHeader(http.StatusMethodNotAllowed) + enc.Encode(errorResponse{ + Error: "Only GET and PUT are supported.", + }) + } +} diff --git a/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go b/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go new file mode 100644 index 00000000..dad583aa --- /dev/null +++ b/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go @@ -0,0 +1,31 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package bufferpool houses zap's shared internal buffer pool. Third-party +// packages can recreate the same functionality with buffers.NewPool. +package bufferpool + +import "go.uber.org/zap/buffer" + +var ( + _pool = buffer.NewPool() + // Get retrieves a buffer from the pool, creating one if necessary. + Get = _pool.Get +) diff --git a/vendor/go.uber.org/zap/internal/color/color.go b/vendor/go.uber.org/zap/internal/color/color.go new file mode 100644 index 00000000..c4d5d02a --- /dev/null +++ b/vendor/go.uber.org/zap/internal/color/color.go @@ -0,0 +1,44 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package color adds coloring functionality for TTY output. +package color + +import "fmt" + +// Foreground colors. +const ( + Black Color = iota + 30 + Red + Green + Yellow + Blue + Magenta + Cyan + White +) + +// Color represents a text color. +type Color uint8 + +// Add adds the coloring to the given string. +func (c Color) Add(s string) string { + return fmt.Sprintf("\x1b[%dm%s\x1b[0m", uint8(c), s) +} diff --git a/vendor/go.uber.org/zap/internal/exit/exit.go b/vendor/go.uber.org/zap/internal/exit/exit.go new file mode 100644 index 00000000..dfc5b05f --- /dev/null +++ b/vendor/go.uber.org/zap/internal/exit/exit.go @@ -0,0 +1,64 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package exit provides stubs so that unit tests can exercise code that calls +// os.Exit(1). +package exit + +import "os" + +var real = func() { os.Exit(1) } + +// Exit normally terminates the process by calling os.Exit(1). If the package +// is stubbed, it instead records a call in the testing spy. +func Exit() { + real() +} + +// A StubbedExit is a testing fake for os.Exit. +type StubbedExit struct { + Exited bool + prev func() +} + +// Stub substitutes a fake for the call to os.Exit(1). +func Stub() *StubbedExit { + s := &StubbedExit{prev: real} + real = s.exit + return s +} + +// WithStub runs the supplied function with Exit stubbed. It returns the stub +// used, so that users can test whether the process would have crashed. +func WithStub(f func()) *StubbedExit { + s := Stub() + defer s.Unstub() + f() + return s +} + +// Unstub restores the previous exit function. +func (se *StubbedExit) Unstub() { + real = se.prev +} + +func (se *StubbedExit) exit() { + se.Exited = true +} diff --git a/vendor/go.uber.org/zap/level.go b/vendor/go.uber.org/zap/level.go new file mode 100644 index 00000000..3567a9a1 --- /dev/null +++ b/vendor/go.uber.org/zap/level.go @@ -0,0 +1,132 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "go.uber.org/atomic" + "go.uber.org/zap/zapcore" +) + +const ( + // DebugLevel logs are typically voluminous, and are usually disabled in + // production. + DebugLevel = zapcore.DebugLevel + // InfoLevel is the default logging priority. + InfoLevel = zapcore.InfoLevel + // WarnLevel logs are more important than Info, but don't need individual + // human review. + WarnLevel = zapcore.WarnLevel + // ErrorLevel logs are high-priority. If an application is running smoothly, + // it shouldn't generate any error-level logs. + ErrorLevel = zapcore.ErrorLevel + // DPanicLevel logs are particularly important errors. In development the + // logger panics after writing the message. + DPanicLevel = zapcore.DPanicLevel + // PanicLevel logs a message, then panics. + PanicLevel = zapcore.PanicLevel + // FatalLevel logs a message, then calls os.Exit(1). + FatalLevel = zapcore.FatalLevel +) + +// LevelEnablerFunc is a convenient way to implement zapcore.LevelEnabler with +// an anonymous function. +// +// It's particularly useful when splitting log output between different +// outputs (e.g., standard error and standard out). For sample code, see the +// package-level AdvancedConfiguration example. +type LevelEnablerFunc func(zapcore.Level) bool + +// Enabled calls the wrapped function. +func (f LevelEnablerFunc) Enabled(lvl zapcore.Level) bool { return f(lvl) } + +// An AtomicLevel is an atomically changeable, dynamic logging level. It lets +// you safely change the log level of a tree of loggers (the root logger and +// any children created by adding context) at runtime. +// +// The AtomicLevel itself is an http.Handler that serves a JSON endpoint to +// alter its level. +// +// AtomicLevels must be created with the NewAtomicLevel constructor to allocate +// their internal atomic pointer. +type AtomicLevel struct { + l *atomic.Int32 +} + +// NewAtomicLevel creates an AtomicLevel with InfoLevel and above logging +// enabled. +func NewAtomicLevel() AtomicLevel { + return AtomicLevel{ + l: atomic.NewInt32(int32(InfoLevel)), + } +} + +// NewAtomicLevelAt is a convenience function that creates an AtomicLevel +// and then calls SetLevel with the given level. +func NewAtomicLevelAt(l zapcore.Level) AtomicLevel { + a := NewAtomicLevel() + a.SetLevel(l) + return a +} + +// Enabled implements the zapcore.LevelEnabler interface, which allows the +// AtomicLevel to be used in place of traditional static levels. +func (lvl AtomicLevel) Enabled(l zapcore.Level) bool { + return lvl.Level().Enabled(l) +} + +// Level returns the minimum enabled log level. +func (lvl AtomicLevel) Level() zapcore.Level { + return zapcore.Level(int8(lvl.l.Load())) +} + +// SetLevel alters the logging level. +func (lvl AtomicLevel) SetLevel(l zapcore.Level) { + lvl.l.Store(int32(l)) +} + +// String returns the string representation of the underlying Level. +func (lvl AtomicLevel) String() string { + return lvl.Level().String() +} + +// UnmarshalText unmarshals the text to an AtomicLevel. It uses the same text +// representations as the static zapcore.Levels ("debug", "info", "warn", +// "error", "dpanic", "panic", and "fatal"). +func (lvl *AtomicLevel) UnmarshalText(text []byte) error { + if lvl.l == nil { + lvl.l = &atomic.Int32{} + } + + var l zapcore.Level + if err := l.UnmarshalText(text); err != nil { + return err + } + + lvl.SetLevel(l) + return nil +} + +// MarshalText marshals the AtomicLevel to a byte slice. It uses the same +// text representation as the static zapcore.Levels ("debug", "info", "warn", +// "error", "dpanic", "panic", and "fatal"). +func (lvl AtomicLevel) MarshalText() (text []byte, err error) { + return lvl.Level().MarshalText() +} diff --git a/vendor/go.uber.org/zap/logger.go b/vendor/go.uber.org/zap/logger.go new file mode 100644 index 00000000..dc8f6e3a --- /dev/null +++ b/vendor/go.uber.org/zap/logger.go @@ -0,0 +1,305 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "fmt" + "io/ioutil" + "os" + "runtime" + "strings" + "time" + + "go.uber.org/zap/zapcore" +) + +// A Logger provides fast, leveled, structured logging. All methods are safe +// for concurrent use. +// +// The Logger is designed for contexts in which every microsecond and every +// allocation matters, so its API intentionally favors performance and type +// safety over brevity. For most applications, the SugaredLogger strikes a +// better balance between performance and ergonomics. +type Logger struct { + core zapcore.Core + + development bool + name string + errorOutput zapcore.WriteSyncer + + addCaller bool + addStack zapcore.LevelEnabler + + callerSkip int +} + +// New constructs a new Logger from the provided zapcore.Core and Options. If +// the passed zapcore.Core is nil, it falls back to using a no-op +// implementation. +// +// This is the most flexible way to construct a Logger, but also the most +// verbose. For typical use cases, the highly-opinionated presets +// (NewProduction, NewDevelopment, and NewExample) or the Config struct are +// more convenient. +// +// For sample code, see the package-level AdvancedConfiguration example. +func New(core zapcore.Core, options ...Option) *Logger { + if core == nil { + return NewNop() + } + log := &Logger{ + core: core, + errorOutput: zapcore.Lock(os.Stderr), + addStack: zapcore.FatalLevel + 1, + } + return log.WithOptions(options...) +} + +// NewNop returns a no-op Logger. It never writes out logs or internal errors, +// and it never runs user-defined hooks. +// +// Using WithOptions to replace the Core or error output of a no-op Logger can +// re-enable logging. +func NewNop() *Logger { + return &Logger{ + core: zapcore.NewNopCore(), + errorOutput: zapcore.AddSync(ioutil.Discard), + addStack: zapcore.FatalLevel + 1, + } +} + +// NewProduction builds a sensible production Logger that writes InfoLevel and +// above logs to standard error as JSON. +// +// It's a shortcut for NewProductionConfig().Build(...Option). +func NewProduction(options ...Option) (*Logger, error) { + return NewProductionConfig().Build(options...) +} + +// NewDevelopment builds a development Logger that writes DebugLevel and above +// logs to standard error in a human-friendly format. +// +// It's a shortcut for NewDevelopmentConfig().Build(...Option). +func NewDevelopment(options ...Option) (*Logger, error) { + return NewDevelopmentConfig().Build(options...) +} + +// NewExample builds a Logger that's designed for use in zap's testable +// examples. It writes DebugLevel and above logs to standard out as JSON, but +// omits the timestamp and calling function to keep example output +// short and deterministic. +func NewExample(options ...Option) *Logger { + encoderCfg := zapcore.EncoderConfig{ + MessageKey: "msg", + LevelKey: "level", + NameKey: "logger", + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.ISO8601TimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + } + core := zapcore.NewCore(zapcore.NewJSONEncoder(encoderCfg), os.Stdout, DebugLevel) + return New(core).WithOptions(options...) +} + +// Sugar wraps the Logger to provide a more ergonomic, but slightly slower, +// API. Sugaring a Logger is quite inexpensive, so it's reasonable for a +// single application to use both Loggers and SugaredLoggers, converting +// between them on the boundaries of performance-sensitive code. +func (log *Logger) Sugar() *SugaredLogger { + core := log.clone() + core.callerSkip += 2 + return &SugaredLogger{core} +} + +// Named adds a new path segment to the logger's name. Segments are joined by +// periods. By default, Loggers are unnamed. +func (log *Logger) Named(s string) *Logger { + if s == "" { + return log + } + l := log.clone() + if log.name == "" { + l.name = s + } else { + l.name = strings.Join([]string{l.name, s}, ".") + } + return l +} + +// WithOptions clones the current Logger, applies the supplied Options, and +// returns the resulting Logger. It's safe to use concurrently. +func (log *Logger) WithOptions(opts ...Option) *Logger { + c := log.clone() + for _, opt := range opts { + opt.apply(c) + } + return c +} + +// With creates a child logger and adds structured context to it. Fields added +// to the child don't affect the parent, and vice versa. +func (log *Logger) With(fields ...Field) *Logger { + if len(fields) == 0 { + return log + } + l := log.clone() + l.core = l.core.With(fields) + return l +} + +// Check returns a CheckedEntry if logging a message at the specified level +// is enabled. It's a completely optional optimization; in high-performance +// applications, Check can help avoid allocating a slice to hold fields. +func (log *Logger) Check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { + return log.check(lvl, msg) +} + +// Debug logs a message at DebugLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Debug(msg string, fields ...Field) { + if ce := log.check(DebugLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Info logs a message at InfoLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Info(msg string, fields ...Field) { + if ce := log.check(InfoLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Warn logs a message at WarnLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Warn(msg string, fields ...Field) { + if ce := log.check(WarnLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Error logs a message at ErrorLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Error(msg string, fields ...Field) { + if ce := log.check(ErrorLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// DPanic logs a message at DPanicLevel. The message includes any fields +// passed at the log site, as well as any fields accumulated on the logger. +// +// If the logger is in development mode, it then panics (DPanic means +// "development panic"). This is useful for catching errors that are +// recoverable, but shouldn't ever happen. +func (log *Logger) DPanic(msg string, fields ...Field) { + if ce := log.check(DPanicLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Panic logs a message at PanicLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +// +// The logger then panics, even if logging at PanicLevel is disabled. +func (log *Logger) Panic(msg string, fields ...Field) { + if ce := log.check(PanicLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Fatal logs a message at FatalLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +// +// The logger then calls os.Exit(1), even if logging at FatalLevel is +// disabled. +func (log *Logger) Fatal(msg string, fields ...Field) { + if ce := log.check(FatalLevel, msg); ce != nil { + ce.Write(fields...) + } +} + +// Sync calls the underlying Core's Sync method, flushing any buffered log +// entries. Applications should take care to call Sync before exiting. +func (log *Logger) Sync() error { + return log.core.Sync() +} + +// Core returns the Logger's underlying zapcore.Core. +func (log *Logger) Core() zapcore.Core { + return log.core +} + +func (log *Logger) clone() *Logger { + copy := *log + return © +} + +func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { + // check must always be called directly by a method in the Logger interface + // (e.g., Check, Info, Fatal). + const callerSkipOffset = 2 + + // Create basic checked entry thru the core; this will be non-nil if the + // log message will actually be written somewhere. + ent := zapcore.Entry{ + LoggerName: log.name, + Time: time.Now(), + Level: lvl, + Message: msg, + } + ce := log.core.Check(ent, nil) + willWrite := ce != nil + + // Set up any required terminal behavior. + switch ent.Level { + case zapcore.PanicLevel: + ce = ce.Should(ent, zapcore.WriteThenPanic) + case zapcore.FatalLevel: + ce = ce.Should(ent, zapcore.WriteThenFatal) + case zapcore.DPanicLevel: + if log.development { + ce = ce.Should(ent, zapcore.WriteThenPanic) + } + } + + // Only do further annotation if we're going to write this message; checked + // entries that exist only for terminal behavior don't benefit from + // annotation. + if !willWrite { + return ce + } + + // Thread the error output through to the CheckedEntry. + ce.ErrorOutput = log.errorOutput + if log.addCaller { + ce.Entry.Caller = zapcore.NewEntryCaller(runtime.Caller(log.callerSkip + callerSkipOffset)) + if !ce.Entry.Caller.Defined { + fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", time.Now().UTC()) + log.errorOutput.Sync() + } + } + if log.addStack.Enabled(ce.Entry.Level) { + ce.Entry.Stack = Stack("").String + } + + return ce +} diff --git a/vendor/go.uber.org/zap/options.go b/vendor/go.uber.org/zap/options.go new file mode 100644 index 00000000..7a6b0fca --- /dev/null +++ b/vendor/go.uber.org/zap/options.go @@ -0,0 +1,109 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import "go.uber.org/zap/zapcore" + +// An Option configures a Logger. +type Option interface { + apply(*Logger) +} + +// optionFunc wraps a func so it satisfies the Option interface. +type optionFunc func(*Logger) + +func (f optionFunc) apply(log *Logger) { + f(log) +} + +// WrapCore wraps or replaces the Logger's underlying zapcore.Core. +func WrapCore(f func(zapcore.Core) zapcore.Core) Option { + return optionFunc(func(log *Logger) { + log.core = f(log.core) + }) +} + +// Hooks registers functions which will be called each time the Logger writes +// out an Entry. Repeated use of Hooks is additive. +// +// Hooks are useful for simple side effects, like capturing metrics for the +// number of emitted logs. More complex side effects, including anything that +// requires access to the Entry's structured fields, should be implemented as +// a zapcore.Core instead. See zapcore.RegisterHooks for details. +func Hooks(hooks ...func(zapcore.Entry) error) Option { + return optionFunc(func(log *Logger) { + log.core = zapcore.RegisterHooks(log.core, hooks...) + }) +} + +// Fields adds fields to the Logger. +func Fields(fs ...Field) Option { + return optionFunc(func(log *Logger) { + log.core = log.core.With(fs) + }) +} + +// ErrorOutput sets the destination for errors generated by the Logger. Note +// that this option only affects internal errors; for sample code that sends +// error-level logs to a different location from info- and debug-level logs, +// see the package-level AdvancedConfiguration example. +// +// The supplied WriteSyncer must be safe for concurrent use. The Open and +// zapcore.Lock functions are the simplest ways to protect files with a mutex. +func ErrorOutput(w zapcore.WriteSyncer) Option { + return optionFunc(func(log *Logger) { + log.errorOutput = w + }) +} + +// Development puts the logger in development mode, which makes DPanic-level +// logs panic instead of simply logging an error. +func Development() Option { + return optionFunc(func(log *Logger) { + log.development = true + }) +} + +// AddCaller configures the Logger to annotate each message with the filename +// and line number of zap's caller. +func AddCaller() Option { + return optionFunc(func(log *Logger) { + log.addCaller = true + }) +} + +// AddCallerSkip increases the number of callers skipped by caller annotation +// (as enabled by the AddCaller option). When building wrappers around the +// Logger and SugaredLogger, supplying this Option prevents zap from always +// reporting the wrapper code as the caller. +func AddCallerSkip(skip int) Option { + return optionFunc(func(log *Logger) { + log.callerSkip += skip + }) +} + +// AddStacktrace configures the Logger to record a stack trace for all messages at +// or above a given level. +func AddStacktrace(lvl zapcore.LevelEnabler) Option { + return optionFunc(func(log *Logger) { + log.addStack = lvl + }) +} diff --git a/vendor/go.uber.org/zap/sink.go b/vendor/go.uber.org/zap/sink.go new file mode 100644 index 00000000..ff0becfe --- /dev/null +++ b/vendor/go.uber.org/zap/sink.go @@ -0,0 +1,161 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "errors" + "fmt" + "io" + "net/url" + "os" + "strings" + "sync" + + "go.uber.org/zap/zapcore" +) + +const schemeFile = "file" + +var ( + _sinkMutex sync.RWMutex + _sinkFactories map[string]func(*url.URL) (Sink, error) // keyed by scheme +) + +func init() { + resetSinkRegistry() +} + +func resetSinkRegistry() { + _sinkMutex.Lock() + defer _sinkMutex.Unlock() + + _sinkFactories = map[string]func(*url.URL) (Sink, error){ + schemeFile: newFileSink, + } +} + +// Sink defines the interface to write to and close logger destinations. +type Sink interface { + zapcore.WriteSyncer + io.Closer +} + +type nopCloserSink struct{ zapcore.WriteSyncer } + +func (nopCloserSink) Close() error { return nil } + +type errSinkNotFound struct { + scheme string +} + +func (e *errSinkNotFound) Error() string { + return fmt.Sprintf("no sink found for scheme %q", e.scheme) +} + +// RegisterSink registers a user-supplied factory for all sinks with a +// particular scheme. +// +// All schemes must be ASCII, valid under section 3.1 of RFC 3986 +// (https://tools.ietf.org/html/rfc3986#section-3.1), and must not already +// have a factory registered. Zap automatically registers a factory for the +// "file" scheme. +func RegisterSink(scheme string, factory func(*url.URL) (Sink, error)) error { + _sinkMutex.Lock() + defer _sinkMutex.Unlock() + + if scheme == "" { + return errors.New("can't register a sink factory for empty string") + } + normalized, err := normalizeScheme(scheme) + if err != nil { + return fmt.Errorf("%q is not a valid scheme: %v", scheme, err) + } + if _, ok := _sinkFactories[normalized]; ok { + return fmt.Errorf("sink factory already registered for scheme %q", normalized) + } + _sinkFactories[normalized] = factory + return nil +} + +func newSink(rawURL string) (Sink, error) { + u, err := url.Parse(rawURL) + if err != nil { + return nil, fmt.Errorf("can't parse %q as a URL: %v", rawURL, err) + } + if u.Scheme == "" { + u.Scheme = schemeFile + } + + _sinkMutex.RLock() + factory, ok := _sinkFactories[u.Scheme] + _sinkMutex.RUnlock() + if !ok { + return nil, &errSinkNotFound{u.Scheme} + } + return factory(u) +} + +func newFileSink(u *url.URL) (Sink, error) { + if u.User != nil { + return nil, fmt.Errorf("user and password not allowed with file URLs: got %v", u) + } + if u.Fragment != "" { + return nil, fmt.Errorf("fragments not allowed with file URLs: got %v", u) + } + if u.RawQuery != "" { + return nil, fmt.Errorf("query parameters not allowed with file URLs: got %v", u) + } + // Error messages are better if we check hostname and port separately. + if u.Port() != "" { + return nil, fmt.Errorf("ports not allowed with file URLs: got %v", u) + } + if hn := u.Hostname(); hn != "" && hn != "localhost" { + return nil, fmt.Errorf("file URLs must leave host empty or use localhost: got %v", u) + } + switch u.Path { + case "stdout": + return nopCloserSink{os.Stdout}, nil + case "stderr": + return nopCloserSink{os.Stderr}, nil + } + return os.OpenFile(u.Path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) +} + +func normalizeScheme(s string) (string, error) { + // https://tools.ietf.org/html/rfc3986#section-3.1 + s = strings.ToLower(s) + if first := s[0]; 'a' > first || 'z' < first { + return "", errors.New("must start with a letter") + } + for i := 1; i < len(s); i++ { // iterate over bytes, not runes + c := s[i] + switch { + case 'a' <= c && c <= 'z': + continue + case '0' <= c && c <= '9': + continue + case c == '.' || c == '+' || c == '-': + continue + } + return "", fmt.Errorf("may not contain %q", c) + } + return s, nil +} diff --git a/vendor/go.uber.org/zap/stacktrace.go b/vendor/go.uber.org/zap/stacktrace.go new file mode 100644 index 00000000..100fac21 --- /dev/null +++ b/vendor/go.uber.org/zap/stacktrace.go @@ -0,0 +1,126 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "runtime" + "strings" + "sync" + + "go.uber.org/zap/internal/bufferpool" +) + +const _zapPackage = "go.uber.org/zap" + +var ( + _stacktracePool = sync.Pool{ + New: func() interface{} { + return newProgramCounters(64) + }, + } + + // We add "." and "/" suffixes to the package name to ensure we only match + // the exact package and not any package with the same prefix. + _zapStacktracePrefixes = addPrefix(_zapPackage, ".", "/") + _zapStacktraceVendorContains = addPrefix("/vendor/", _zapStacktracePrefixes...) +) + +func takeStacktrace() string { + buffer := bufferpool.Get() + defer buffer.Free() + programCounters := _stacktracePool.Get().(*programCounters) + defer _stacktracePool.Put(programCounters) + + var numFrames int + for { + // Skip the call to runtime.Counters and takeStacktrace so that the + // program counters start at the caller of takeStacktrace. + numFrames = runtime.Callers(2, programCounters.pcs) + if numFrames < len(programCounters.pcs) { + break + } + // Don't put the too-short counter slice back into the pool; this lets + // the pool adjust if we consistently take deep stacktraces. + programCounters = newProgramCounters(len(programCounters.pcs) * 2) + } + + i := 0 + skipZapFrames := true // skip all consecutive zap frames at the beginning. + frames := runtime.CallersFrames(programCounters.pcs[:numFrames]) + + // Note: On the last iteration, frames.Next() returns false, with a valid + // frame, but we ignore this frame. The last frame is a a runtime frame which + // adds noise, since it's only either runtime.main or runtime.goexit. + for frame, more := frames.Next(); more; frame, more = frames.Next() { + if skipZapFrames && isZapFrame(frame.Function) { + continue + } else { + skipZapFrames = false + } + + if i != 0 { + buffer.AppendByte('\n') + } + i++ + buffer.AppendString(frame.Function) + buffer.AppendByte('\n') + buffer.AppendByte('\t') + buffer.AppendString(frame.File) + buffer.AppendByte(':') + buffer.AppendInt(int64(frame.Line)) + } + + return buffer.String() +} + +func isZapFrame(function string) bool { + for _, prefix := range _zapStacktracePrefixes { + if strings.HasPrefix(function, prefix) { + return true + } + } + + // We can't use a prefix match here since the location of the vendor + // directory affects the prefix. Instead we do a contains match. + for _, contains := range _zapStacktraceVendorContains { + if strings.Contains(function, contains) { + return true + } + } + + return false +} + +type programCounters struct { + pcs []uintptr +} + +func newProgramCounters(size int) *programCounters { + return &programCounters{make([]uintptr, size)} +} + +func addPrefix(prefix string, ss ...string) []string { + withPrefix := make([]string, len(ss)) + for i, s := range ss { + withPrefix[i] = prefix + s + } + return withPrefix +} diff --git a/vendor/go.uber.org/zap/sugar.go b/vendor/go.uber.org/zap/sugar.go new file mode 100644 index 00000000..77ca227f --- /dev/null +++ b/vendor/go.uber.org/zap/sugar.go @@ -0,0 +1,304 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "fmt" + + "go.uber.org/zap/zapcore" + + "go.uber.org/multierr" +) + +const ( + _oddNumberErrMsg = "Ignored key without a value." + _nonStringKeyErrMsg = "Ignored key-value pairs with non-string keys." +) + +// A SugaredLogger wraps the base Logger functionality in a slower, but less +// verbose, API. Any Logger can be converted to a SugaredLogger with its Sugar +// method. +// +// Unlike the Logger, the SugaredLogger doesn't insist on structured logging. +// For each log level, it exposes three methods: one for loosely-typed +// structured logging, one for println-style formatting, and one for +// printf-style formatting. For example, SugaredLoggers can produce InfoLevel +// output with Infow ("info with" structured context), Info, or Infof. +type SugaredLogger struct { + base *Logger +} + +// Desugar unwraps a SugaredLogger, exposing the original Logger. Desugaring +// is quite inexpensive, so it's reasonable for a single application to use +// both Loggers and SugaredLoggers, converting between them on the boundaries +// of performance-sensitive code. +func (s *SugaredLogger) Desugar() *Logger { + base := s.base.clone() + base.callerSkip -= 2 + return base +} + +// Named adds a sub-scope to the logger's name. See Logger.Named for details. +func (s *SugaredLogger) Named(name string) *SugaredLogger { + return &SugaredLogger{base: s.base.Named(name)} +} + +// With adds a variadic number of fields to the logging context. It accepts a +// mix of strongly-typed Field objects and loosely-typed key-value pairs. When +// processing pairs, the first element of the pair is used as the field key +// and the second as the field value. +// +// For example, +// sugaredLogger.With( +// "hello", "world", +// "failure", errors.New("oh no"), +// Stack(), +// "count", 42, +// "user", User{Name: "alice"}, +// ) +// is the equivalent of +// unsugared.With( +// String("hello", "world"), +// String("failure", "oh no"), +// Stack(), +// Int("count", 42), +// Object("user", User{Name: "alice"}), +// ) +// +// Note that the keys in key-value pairs should be strings. In development, +// passing a non-string key panics. In production, the logger is more +// forgiving: a separate error is logged, but the key-value pair is skipped +// and execution continues. Passing an orphaned key triggers similar behavior: +// panics in development and errors in production. +func (s *SugaredLogger) With(args ...interface{}) *SugaredLogger { + return &SugaredLogger{base: s.base.With(s.sweetenFields(args)...)} +} + +// Debug uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Debug(args ...interface{}) { + s.log(DebugLevel, "", args, nil) +} + +// Info uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Info(args ...interface{}) { + s.log(InfoLevel, "", args, nil) +} + +// Warn uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Warn(args ...interface{}) { + s.log(WarnLevel, "", args, nil) +} + +// Error uses fmt.Sprint to construct and log a message. +func (s *SugaredLogger) Error(args ...interface{}) { + s.log(ErrorLevel, "", args, nil) +} + +// DPanic uses fmt.Sprint to construct and log a message. In development, the +// logger then panics. (See DPanicLevel for details.) +func (s *SugaredLogger) DPanic(args ...interface{}) { + s.log(DPanicLevel, "", args, nil) +} + +// Panic uses fmt.Sprint to construct and log a message, then panics. +func (s *SugaredLogger) Panic(args ...interface{}) { + s.log(PanicLevel, "", args, nil) +} + +// Fatal uses fmt.Sprint to construct and log a message, then calls os.Exit. +func (s *SugaredLogger) Fatal(args ...interface{}) { + s.log(FatalLevel, "", args, nil) +} + +// Debugf uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Debugf(template string, args ...interface{}) { + s.log(DebugLevel, template, args, nil) +} + +// Infof uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Infof(template string, args ...interface{}) { + s.log(InfoLevel, template, args, nil) +} + +// Warnf uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Warnf(template string, args ...interface{}) { + s.log(WarnLevel, template, args, nil) +} + +// Errorf uses fmt.Sprintf to log a templated message. +func (s *SugaredLogger) Errorf(template string, args ...interface{}) { + s.log(ErrorLevel, template, args, nil) +} + +// DPanicf uses fmt.Sprintf to log a templated message. In development, the +// logger then panics. (See DPanicLevel for details.) +func (s *SugaredLogger) DPanicf(template string, args ...interface{}) { + s.log(DPanicLevel, template, args, nil) +} + +// Panicf uses fmt.Sprintf to log a templated message, then panics. +func (s *SugaredLogger) Panicf(template string, args ...interface{}) { + s.log(PanicLevel, template, args, nil) +} + +// Fatalf uses fmt.Sprintf to log a templated message, then calls os.Exit. +func (s *SugaredLogger) Fatalf(template string, args ...interface{}) { + s.log(FatalLevel, template, args, nil) +} + +// Debugw logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +// +// When debug-level logging is disabled, this is much faster than +// s.With(keysAndValues).Debug(msg) +func (s *SugaredLogger) Debugw(msg string, keysAndValues ...interface{}) { + s.log(DebugLevel, msg, nil, keysAndValues) +} + +// Infow logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) Infow(msg string, keysAndValues ...interface{}) { + s.log(InfoLevel, msg, nil, keysAndValues) +} + +// Warnw logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) Warnw(msg string, keysAndValues ...interface{}) { + s.log(WarnLevel, msg, nil, keysAndValues) +} + +// Errorw logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) Errorw(msg string, keysAndValues ...interface{}) { + s.log(ErrorLevel, msg, nil, keysAndValues) +} + +// DPanicw logs a message with some additional context. In development, the +// logger then panics. (See DPanicLevel for details.) The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) DPanicw(msg string, keysAndValues ...interface{}) { + s.log(DPanicLevel, msg, nil, keysAndValues) +} + +// Panicw logs a message with some additional context, then panics. The +// variadic key-value pairs are treated as they are in With. +func (s *SugaredLogger) Panicw(msg string, keysAndValues ...interface{}) { + s.log(PanicLevel, msg, nil, keysAndValues) +} + +// Fatalw logs a message with some additional context, then calls os.Exit. The +// variadic key-value pairs are treated as they are in With. +func (s *SugaredLogger) Fatalw(msg string, keysAndValues ...interface{}) { + s.log(FatalLevel, msg, nil, keysAndValues) +} + +// Sync flushes any buffered log entries. +func (s *SugaredLogger) Sync() error { + return s.base.Sync() +} + +func (s *SugaredLogger) log(lvl zapcore.Level, template string, fmtArgs []interface{}, context []interface{}) { + // If logging at this level is completely disabled, skip the overhead of + // string formatting. + if lvl < DPanicLevel && !s.base.Core().Enabled(lvl) { + return + } + + // Format with Sprint, Sprintf, or neither. + msg := template + if msg == "" && len(fmtArgs) > 0 { + msg = fmt.Sprint(fmtArgs...) + } else if msg != "" && len(fmtArgs) > 0 { + msg = fmt.Sprintf(template, fmtArgs...) + } + + if ce := s.base.Check(lvl, msg); ce != nil { + ce.Write(s.sweetenFields(context)...) + } +} + +func (s *SugaredLogger) sweetenFields(args []interface{}) []Field { + if len(args) == 0 { + return nil + } + + // Allocate enough space for the worst case; if users pass only structured + // fields, we shouldn't penalize them with extra allocations. + fields := make([]Field, 0, len(args)) + var invalid invalidPairs + + for i := 0; i < len(args); { + // This is a strongly-typed field. Consume it and move on. + if f, ok := args[i].(Field); ok { + fields = append(fields, f) + i++ + continue + } + + // Make sure this element isn't a dangling key. + if i == len(args)-1 { + s.base.DPanic(_oddNumberErrMsg, Any("ignored", args[i])) + break + } + + // Consume this value and the next, treating them as a key-value pair. If the + // key isn't a string, add this pair to the slice of invalid pairs. + key, val := args[i], args[i+1] + if keyStr, ok := key.(string); !ok { + // Subsequent errors are likely, so allocate once up front. + if cap(invalid) == 0 { + invalid = make(invalidPairs, 0, len(args)/2) + } + invalid = append(invalid, invalidPair{i, key, val}) + } else { + fields = append(fields, Any(keyStr, val)) + } + i += 2 + } + + // If we encountered any invalid key-value pairs, log an error. + if len(invalid) > 0 { + s.base.DPanic(_nonStringKeyErrMsg, Array("invalid", invalid)) + } + return fields +} + +type invalidPair struct { + position int + key, value interface{} +} + +func (p invalidPair) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddInt64("position", int64(p.position)) + Any("key", p.key).AddTo(enc) + Any("value", p.value).AddTo(enc) + return nil +} + +type invalidPairs []invalidPair + +func (ps invalidPairs) MarshalLogArray(enc zapcore.ArrayEncoder) error { + var err error + for i := range ps { + err = multierr.Append(err, enc.AppendObject(ps[i])) + } + return err +} diff --git a/vendor/go.uber.org/zap/time.go b/vendor/go.uber.org/zap/time.go new file mode 100644 index 00000000..c5a1f162 --- /dev/null +++ b/vendor/go.uber.org/zap/time.go @@ -0,0 +1,27 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import "time" + +func timeToMillis(t time.Time) int64 { + return t.UnixNano() / int64(time.Millisecond) +} diff --git a/vendor/go.uber.org/zap/tools.go b/vendor/go.uber.org/zap/tools.go new file mode 100644 index 00000000..2b6366be --- /dev/null +++ b/vendor/go.uber.org/zap/tools.go @@ -0,0 +1,28 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// +build tools + +package zap + +import ( + // Tools we use during development. + _ "golang.org/x/lint/golint" +) diff --git a/vendor/go.uber.org/zap/writer.go b/vendor/go.uber.org/zap/writer.go new file mode 100644 index 00000000..86a709ab --- /dev/null +++ b/vendor/go.uber.org/zap/writer.go @@ -0,0 +1,99 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zap + +import ( + "fmt" + "io" + "io/ioutil" + + "go.uber.org/zap/zapcore" + + "go.uber.org/multierr" +) + +// Open is a high-level wrapper that takes a variadic number of URLs, opens or +// creates each of the specified resources, and combines them into a locked +// WriteSyncer. It also returns any error encountered and a function to close +// any opened files. +// +// Passing no URLs returns a no-op WriteSyncer. Zap handles URLs without a +// scheme and URLs with the "file" scheme. Third-party code may register +// factories for other schemes using RegisterSink. +// +// URLs with the "file" scheme must use absolute paths on the local +// filesystem. No user, password, port, fragments, or query parameters are +// allowed, and the hostname must be empty or "localhost". +// +// Since it's common to write logs to the local filesystem, URLs without a +// scheme (e.g., "/var/log/foo.log") are treated as local file paths. Without +// a scheme, the special paths "stdout" and "stderr" are interpreted as +// os.Stdout and os.Stderr. When specified without a scheme, relative file +// paths also work. +func Open(paths ...string) (zapcore.WriteSyncer, func(), error) { + writers, close, err := open(paths) + if err != nil { + return nil, nil, err + } + + writer := CombineWriteSyncers(writers...) + return writer, close, nil +} + +func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { + writers := make([]zapcore.WriteSyncer, 0, len(paths)) + closers := make([]io.Closer, 0, len(paths)) + close := func() { + for _, c := range closers { + c.Close() + } + } + + var openErr error + for _, path := range paths { + sink, err := newSink(path) + if err != nil { + openErr = multierr.Append(openErr, fmt.Errorf("couldn't open sink %q: %v", path, err)) + continue + } + writers = append(writers, sink) + closers = append(closers, sink) + } + if openErr != nil { + close() + return writers, nil, openErr + } + + return writers, close, nil +} + +// CombineWriteSyncers is a utility that combines multiple WriteSyncers into a +// single, locked WriteSyncer. If no inputs are supplied, it returns a no-op +// WriteSyncer. +// +// It's provided purely as a convenience; the result is no different from +// using zapcore.NewMultiWriteSyncer and zapcore.Lock individually. +func CombineWriteSyncers(writers ...zapcore.WriteSyncer) zapcore.WriteSyncer { + if len(writers) == 0 { + return zapcore.AddSync(ioutil.Discard) + } + return zapcore.Lock(zapcore.NewMultiWriteSyncer(writers...)) +} diff --git a/vendor/go.uber.org/zap/zapcore/console_encoder.go b/vendor/go.uber.org/zap/zapcore/console_encoder.go new file mode 100644 index 00000000..b7875966 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/console_encoder.go @@ -0,0 +1,147 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "fmt" + "sync" + + "go.uber.org/zap/buffer" + "go.uber.org/zap/internal/bufferpool" +) + +var _sliceEncoderPool = sync.Pool{ + New: func() interface{} { + return &sliceArrayEncoder{elems: make([]interface{}, 0, 2)} + }, +} + +func getSliceEncoder() *sliceArrayEncoder { + return _sliceEncoderPool.Get().(*sliceArrayEncoder) +} + +func putSliceEncoder(e *sliceArrayEncoder) { + e.elems = e.elems[:0] + _sliceEncoderPool.Put(e) +} + +type consoleEncoder struct { + *jsonEncoder +} + +// NewConsoleEncoder creates an encoder whose output is designed for human - +// rather than machine - consumption. It serializes the core log entry data +// (message, level, timestamp, etc.) in a plain-text format and leaves the +// structured context as JSON. +// +// Note that although the console encoder doesn't use the keys specified in the +// encoder configuration, it will omit any element whose key is set to the empty +// string. +func NewConsoleEncoder(cfg EncoderConfig) Encoder { + return consoleEncoder{newJSONEncoder(cfg, true)} +} + +func (c consoleEncoder) Clone() Encoder { + return consoleEncoder{c.jsonEncoder.Clone().(*jsonEncoder)} +} + +func (c consoleEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, error) { + line := bufferpool.Get() + + // We don't want the entry's metadata to be quoted and escaped (if it's + // encoded as strings), which means that we can't use the JSON encoder. The + // simplest option is to use the memory encoder and fmt.Fprint. + // + // If this ever becomes a performance bottleneck, we can implement + // ArrayEncoder for our plain-text format. + arr := getSliceEncoder() + if c.TimeKey != "" && c.EncodeTime != nil { + c.EncodeTime(ent.Time, arr) + } + if c.LevelKey != "" && c.EncodeLevel != nil { + c.EncodeLevel(ent.Level, arr) + } + if ent.LoggerName != "" && c.NameKey != "" { + nameEncoder := c.EncodeName + + if nameEncoder == nil { + // Fall back to FullNameEncoder for backward compatibility. + nameEncoder = FullNameEncoder + } + + nameEncoder(ent.LoggerName, arr) + } + if ent.Caller.Defined && c.CallerKey != "" && c.EncodeCaller != nil { + c.EncodeCaller(ent.Caller, arr) + } + for i := range arr.elems { + if i > 0 { + line.AppendByte('\t') + } + fmt.Fprint(line, arr.elems[i]) + } + putSliceEncoder(arr) + + // Add the message itself. + if c.MessageKey != "" { + c.addTabIfNecessary(line) + line.AppendString(ent.Message) + } + + // Add any structured context. + c.writeContext(line, fields) + + // If there's no stacktrace key, honor that; this allows users to force + // single-line output. + if ent.Stack != "" && c.StacktraceKey != "" { + line.AppendByte('\n') + line.AppendString(ent.Stack) + } + + if c.LineEnding != "" { + line.AppendString(c.LineEnding) + } else { + line.AppendString(DefaultLineEnding) + } + return line, nil +} + +func (c consoleEncoder) writeContext(line *buffer.Buffer, extra []Field) { + context := c.jsonEncoder.Clone().(*jsonEncoder) + defer context.buf.Free() + + addFields(context, extra) + context.closeOpenNamespaces() + if context.buf.Len() == 0 { + return + } + + c.addTabIfNecessary(line) + line.AppendByte('{') + line.Write(context.buf.Bytes()) + line.AppendByte('}') +} + +func (c consoleEncoder) addTabIfNecessary(line *buffer.Buffer) { + if line.Len() > 0 { + line.AppendByte('\t') + } +} diff --git a/vendor/go.uber.org/zap/zapcore/core.go b/vendor/go.uber.org/zap/zapcore/core.go new file mode 100644 index 00000000..a1ef8b03 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/core.go @@ -0,0 +1,113 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +// Core is a minimal, fast logger interface. It's designed for library authors +// to wrap in a more user-friendly API. +type Core interface { + LevelEnabler + + // With adds structured context to the Core. + With([]Field) Core + // Check determines whether the supplied Entry should be logged (using the + // embedded LevelEnabler and possibly some extra logic). If the entry + // should be logged, the Core adds itself to the CheckedEntry and returns + // the result. + // + // Callers must use Check before calling Write. + Check(Entry, *CheckedEntry) *CheckedEntry + // Write serializes the Entry and any Fields supplied at the log site and + // writes them to their destination. + // + // If called, Write should always log the Entry and Fields; it should not + // replicate the logic of Check. + Write(Entry, []Field) error + // Sync flushes buffered logs (if any). + Sync() error +} + +type nopCore struct{} + +// NewNopCore returns a no-op Core. +func NewNopCore() Core { return nopCore{} } +func (nopCore) Enabled(Level) bool { return false } +func (n nopCore) With([]Field) Core { return n } +func (nopCore) Check(_ Entry, ce *CheckedEntry) *CheckedEntry { return ce } +func (nopCore) Write(Entry, []Field) error { return nil } +func (nopCore) Sync() error { return nil } + +// NewCore creates a Core that writes logs to a WriteSyncer. +func NewCore(enc Encoder, ws WriteSyncer, enab LevelEnabler) Core { + return &ioCore{ + LevelEnabler: enab, + enc: enc, + out: ws, + } +} + +type ioCore struct { + LevelEnabler + enc Encoder + out WriteSyncer +} + +func (c *ioCore) With(fields []Field) Core { + clone := c.clone() + addFields(clone.enc, fields) + return clone +} + +func (c *ioCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + if c.Enabled(ent.Level) { + return ce.AddCore(ent, c) + } + return ce +} + +func (c *ioCore) Write(ent Entry, fields []Field) error { + buf, err := c.enc.EncodeEntry(ent, fields) + if err != nil { + return err + } + _, err = c.out.Write(buf.Bytes()) + buf.Free() + if err != nil { + return err + } + if ent.Level > ErrorLevel { + // Since we may be crashing the program, sync the output. Ignore Sync + // errors, pending a clean solution to issue #370. + c.Sync() + } + return nil +} + +func (c *ioCore) Sync() error { + return c.out.Sync() +} + +func (c *ioCore) clone() *ioCore { + return &ioCore{ + LevelEnabler: c.LevelEnabler, + enc: c.enc.Clone(), + out: c.out, + } +} diff --git a/vendor/go.uber.org/zap/zapcore/doc.go b/vendor/go.uber.org/zap/zapcore/doc.go new file mode 100644 index 00000000..31000e91 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/doc.go @@ -0,0 +1,24 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// Package zapcore defines and implements the low-level interfaces upon which +// zap is built. By providing alternate implementations of these interfaces, +// external packages can extend zap's capabilities. +package zapcore // import "go.uber.org/zap/zapcore" diff --git a/vendor/go.uber.org/zap/zapcore/encoder.go b/vendor/go.uber.org/zap/zapcore/encoder.go new file mode 100644 index 00000000..5e0a69be --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/encoder.go @@ -0,0 +1,371 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "time" + + "go.uber.org/zap/buffer" +) + +// DefaultLineEnding defines the default line ending when writing logs. +// Alternate line endings specified in EncoderConfig can override this +// behavior. +const DefaultLineEnding = "\n" + +// OmitKey defines the key to use when callers want to remove a key from log output. +const OmitKey = "" + +// A LevelEncoder serializes a Level to a primitive type. +type LevelEncoder func(Level, PrimitiveArrayEncoder) + +// LowercaseLevelEncoder serializes a Level to a lowercase string. For example, +// InfoLevel is serialized to "info". +func LowercaseLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + enc.AppendString(l.String()) +} + +// LowercaseColorLevelEncoder serializes a Level to a lowercase string and adds coloring. +// For example, InfoLevel is serialized to "info" and colored blue. +func LowercaseColorLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + s, ok := _levelToLowercaseColorString[l] + if !ok { + s = _unknownLevelColor.Add(l.String()) + } + enc.AppendString(s) +} + +// CapitalLevelEncoder serializes a Level to an all-caps string. For example, +// InfoLevel is serialized to "INFO". +func CapitalLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + enc.AppendString(l.CapitalString()) +} + +// CapitalColorLevelEncoder serializes a Level to an all-caps string and adds color. +// For example, InfoLevel is serialized to "INFO" and colored blue. +func CapitalColorLevelEncoder(l Level, enc PrimitiveArrayEncoder) { + s, ok := _levelToCapitalColorString[l] + if !ok { + s = _unknownLevelColor.Add(l.CapitalString()) + } + enc.AppendString(s) +} + +// UnmarshalText unmarshals text to a LevelEncoder. "capital" is unmarshaled to +// CapitalLevelEncoder, "coloredCapital" is unmarshaled to CapitalColorLevelEncoder, +// "colored" is unmarshaled to LowercaseColorLevelEncoder, and anything else +// is unmarshaled to LowercaseLevelEncoder. +func (e *LevelEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "capital": + *e = CapitalLevelEncoder + case "capitalColor": + *e = CapitalColorLevelEncoder + case "color": + *e = LowercaseColorLevelEncoder + default: + *e = LowercaseLevelEncoder + } + return nil +} + +// A TimeEncoder serializes a time.Time to a primitive type. +type TimeEncoder func(time.Time, PrimitiveArrayEncoder) + +// EpochTimeEncoder serializes a time.Time to a floating-point number of seconds +// since the Unix epoch. +func EpochTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + nanos := t.UnixNano() + sec := float64(nanos) / float64(time.Second) + enc.AppendFloat64(sec) +} + +// EpochMillisTimeEncoder serializes a time.Time to a floating-point number of +// milliseconds since the Unix epoch. +func EpochMillisTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + nanos := t.UnixNano() + millis := float64(nanos) / float64(time.Millisecond) + enc.AppendFloat64(millis) +} + +// EpochNanosTimeEncoder serializes a time.Time to an integer number of +// nanoseconds since the Unix epoch. +func EpochNanosTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + enc.AppendInt64(t.UnixNano()) +} + +// ISO8601TimeEncoder serializes a time.Time to an ISO8601-formatted string +// with millisecond precision. +func ISO8601TimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + enc.AppendString(t.Format("2006-01-02T15:04:05.000Z0700")) +} + +// RFC3339TimeEncoder serializes a time.Time to an RFC3339-formatted string. +func RFC3339TimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + enc.AppendString(t.Format(time.RFC3339)) +} + +// RFC3339NanoTimeEncoder serializes a time.Time to an RFC3339-formatted string +// with nanosecond precision. +func RFC3339NanoTimeEncoder(t time.Time, enc PrimitiveArrayEncoder) { + enc.AppendString(t.Format(time.RFC3339Nano)) +} + +// UnmarshalText unmarshals text to a TimeEncoder. +// "rfc3339nano" and "RFC3339Nano" are unmarshaled to RFC3339NanoTimeEncoder. +// "rfc3339" and "RFC3339" are unmarshaled to RFC3339TimeEncoder. +// "iso8601" and "ISO8601" are unmarshaled to ISO8601TimeEncoder. +// "millis" is unmarshaled to EpochMillisTimeEncoder. +// "nanos" is unmarshaled to EpochNanosEncoder. +// Anything else is unmarshaled to EpochTimeEncoder. +func (e *TimeEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "rfc3339nano", "RFC3339Nano": + *e = RFC3339NanoTimeEncoder + case "rfc3339", "RFC3339": + *e = RFC3339TimeEncoder + case "iso8601", "ISO8601": + *e = ISO8601TimeEncoder + case "millis": + *e = EpochMillisTimeEncoder + case "nanos": + *e = EpochNanosTimeEncoder + default: + *e = EpochTimeEncoder + } + return nil +} + +// A DurationEncoder serializes a time.Duration to a primitive type. +type DurationEncoder func(time.Duration, PrimitiveArrayEncoder) + +// SecondsDurationEncoder serializes a time.Duration to a floating-point number of seconds elapsed. +func SecondsDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) { + enc.AppendFloat64(float64(d) / float64(time.Second)) +} + +// NanosDurationEncoder serializes a time.Duration to an integer number of +// nanoseconds elapsed. +func NanosDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) { + enc.AppendInt64(int64(d)) +} + +// StringDurationEncoder serializes a time.Duration using its built-in String +// method. +func StringDurationEncoder(d time.Duration, enc PrimitiveArrayEncoder) { + enc.AppendString(d.String()) +} + +// UnmarshalText unmarshals text to a DurationEncoder. "string" is unmarshaled +// to StringDurationEncoder, and anything else is unmarshaled to +// NanosDurationEncoder. +func (e *DurationEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "string": + *e = StringDurationEncoder + case "nanos": + *e = NanosDurationEncoder + default: + *e = SecondsDurationEncoder + } + return nil +} + +// A CallerEncoder serializes an EntryCaller to a primitive type. +type CallerEncoder func(EntryCaller, PrimitiveArrayEncoder) + +// FullCallerEncoder serializes a caller in /full/path/to/package/file:line +// format. +func FullCallerEncoder(caller EntryCaller, enc PrimitiveArrayEncoder) { + // TODO: consider using a byte-oriented API to save an allocation. + enc.AppendString(caller.String()) +} + +// ShortCallerEncoder serializes a caller in package/file:line format, trimming +// all but the final directory from the full path. +func ShortCallerEncoder(caller EntryCaller, enc PrimitiveArrayEncoder) { + // TODO: consider using a byte-oriented API to save an allocation. + enc.AppendString(caller.TrimmedPath()) +} + +// UnmarshalText unmarshals text to a CallerEncoder. "full" is unmarshaled to +// FullCallerEncoder and anything else is unmarshaled to ShortCallerEncoder. +func (e *CallerEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "full": + *e = FullCallerEncoder + default: + *e = ShortCallerEncoder + } + return nil +} + +// A NameEncoder serializes a period-separated logger name to a primitive +// type. +type NameEncoder func(string, PrimitiveArrayEncoder) + +// FullNameEncoder serializes the logger name as-is. +func FullNameEncoder(loggerName string, enc PrimitiveArrayEncoder) { + enc.AppendString(loggerName) +} + +// UnmarshalText unmarshals text to a NameEncoder. Currently, everything is +// unmarshaled to FullNameEncoder. +func (e *NameEncoder) UnmarshalText(text []byte) error { + switch string(text) { + case "full": + *e = FullNameEncoder + default: + *e = FullNameEncoder + } + return nil +} + +// An EncoderConfig allows users to configure the concrete encoders supplied by +// zapcore. +type EncoderConfig struct { + // Set the keys used for each log entry. If any key is empty, that portion + // of the entry is omitted. + MessageKey string `json:"messageKey" yaml:"messageKey"` + LevelKey string `json:"levelKey" yaml:"levelKey"` + TimeKey string `json:"timeKey" yaml:"timeKey"` + NameKey string `json:"nameKey" yaml:"nameKey"` + CallerKey string `json:"callerKey" yaml:"callerKey"` + StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"` + LineEnding string `json:"lineEnding" yaml:"lineEnding"` + // Configure the primitive representations of common complex types. For + // example, some users may want all time.Times serialized as floating-point + // seconds since epoch, while others may prefer ISO8601 strings. + EncodeLevel LevelEncoder `json:"levelEncoder" yaml:"levelEncoder"` + EncodeTime TimeEncoder `json:"timeEncoder" yaml:"timeEncoder"` + EncodeDuration DurationEncoder `json:"durationEncoder" yaml:"durationEncoder"` + EncodeCaller CallerEncoder `json:"callerEncoder" yaml:"callerEncoder"` + // Unlike the other primitive type encoders, EncodeName is optional. The + // zero value falls back to FullNameEncoder. + EncodeName NameEncoder `json:"nameEncoder" yaml:"nameEncoder"` +} + +// ObjectEncoder is a strongly-typed, encoding-agnostic interface for adding a +// map- or struct-like object to the logging context. Like maps, ObjectEncoders +// aren't safe for concurrent use (though typical use shouldn't require locks). +type ObjectEncoder interface { + // Logging-specific marshalers. + AddArray(key string, marshaler ArrayMarshaler) error + AddObject(key string, marshaler ObjectMarshaler) error + + // Built-in types. + AddBinary(key string, value []byte) // for arbitrary bytes + AddByteString(key string, value []byte) // for UTF-8 encoded bytes + AddBool(key string, value bool) + AddComplex128(key string, value complex128) + AddComplex64(key string, value complex64) + AddDuration(key string, value time.Duration) + AddFloat64(key string, value float64) + AddFloat32(key string, value float32) + AddInt(key string, value int) + AddInt64(key string, value int64) + AddInt32(key string, value int32) + AddInt16(key string, value int16) + AddInt8(key string, value int8) + AddString(key, value string) + AddTime(key string, value time.Time) + AddUint(key string, value uint) + AddUint64(key string, value uint64) + AddUint32(key string, value uint32) + AddUint16(key string, value uint16) + AddUint8(key string, value uint8) + AddUintptr(key string, value uintptr) + + // AddReflected uses reflection to serialize arbitrary objects, so it can be + // slow and allocation-heavy. + AddReflected(key string, value interface{}) error + // OpenNamespace opens an isolated namespace where all subsequent fields will + // be added. Applications can use namespaces to prevent key collisions when + // injecting loggers into sub-components or third-party libraries. + OpenNamespace(key string) +} + +// ArrayEncoder is a strongly-typed, encoding-agnostic interface for adding +// array-like objects to the logging context. Of note, it supports mixed-type +// arrays even though they aren't typical in Go. Like slices, ArrayEncoders +// aren't safe for concurrent use (though typical use shouldn't require locks). +type ArrayEncoder interface { + // Built-in types. + PrimitiveArrayEncoder + + // Time-related types. + AppendDuration(time.Duration) + AppendTime(time.Time) + + // Logging-specific marshalers. + AppendArray(ArrayMarshaler) error + AppendObject(ObjectMarshaler) error + + // AppendReflected uses reflection to serialize arbitrary objects, so it's + // slow and allocation-heavy. + AppendReflected(value interface{}) error +} + +// PrimitiveArrayEncoder is the subset of the ArrayEncoder interface that deals +// only in Go's built-in types. It's included only so that Duration- and +// TimeEncoders cannot trigger infinite recursion. +type PrimitiveArrayEncoder interface { + // Built-in types. + AppendBool(bool) + AppendByteString([]byte) // for UTF-8 encoded bytes + AppendComplex128(complex128) + AppendComplex64(complex64) + AppendFloat64(float64) + AppendFloat32(float32) + AppendInt(int) + AppendInt64(int64) + AppendInt32(int32) + AppendInt16(int16) + AppendInt8(int8) + AppendString(string) + AppendUint(uint) + AppendUint64(uint64) + AppendUint32(uint32) + AppendUint16(uint16) + AppendUint8(uint8) + AppendUintptr(uintptr) +} + +// Encoder is a format-agnostic interface for all log entry marshalers. Since +// log encoders don't need to support the same wide range of use cases as +// general-purpose marshalers, it's possible to make them faster and +// lower-allocation. +// +// Implementations of the ObjectEncoder interface's methods can, of course, +// freely modify the receiver. However, the Clone and EncodeEntry methods will +// be called concurrently and shouldn't modify the receiver. +type Encoder interface { + ObjectEncoder + + // Clone copies the encoder, ensuring that adding fields to the copy doesn't + // affect the original. + Clone() Encoder + + // EncodeEntry encodes an entry and fields, along with any accumulated + // context, into a byte buffer and returns it. Any fields that are empty, + // including fields on the `Entry` type, should be omitted. + EncodeEntry(Entry, []Field) (*buffer.Buffer, error) +} diff --git a/vendor/go.uber.org/zap/zapcore/entry.go b/vendor/go.uber.org/zap/zapcore/entry.go new file mode 100644 index 00000000..8273abdf --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/entry.go @@ -0,0 +1,258 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "fmt" + "strings" + "sync" + "time" + + "go.uber.org/zap/internal/bufferpool" + "go.uber.org/zap/internal/exit" + + "go.uber.org/multierr" +) + +var ( + _cePool = sync.Pool{New: func() interface{} { + // Pre-allocate some space for cores. + return &CheckedEntry{ + cores: make([]Core, 4), + } + }} +) + +func getCheckedEntry() *CheckedEntry { + ce := _cePool.Get().(*CheckedEntry) + ce.reset() + return ce +} + +func putCheckedEntry(ce *CheckedEntry) { + if ce == nil { + return + } + _cePool.Put(ce) +} + +// NewEntryCaller makes an EntryCaller from the return signature of +// runtime.Caller. +func NewEntryCaller(pc uintptr, file string, line int, ok bool) EntryCaller { + if !ok { + return EntryCaller{} + } + return EntryCaller{ + PC: pc, + File: file, + Line: line, + Defined: true, + } +} + +// EntryCaller represents the caller of a logging function. +type EntryCaller struct { + Defined bool + PC uintptr + File string + Line int +} + +// String returns the full path and line number of the caller. +func (ec EntryCaller) String() string { + return ec.FullPath() +} + +// FullPath returns a /full/path/to/package/file:line description of the +// caller. +func (ec EntryCaller) FullPath() string { + if !ec.Defined { + return "undefined" + } + buf := bufferpool.Get() + buf.AppendString(ec.File) + buf.AppendByte(':') + buf.AppendInt(int64(ec.Line)) + caller := buf.String() + buf.Free() + return caller +} + +// TrimmedPath returns a package/file:line description of the caller, +// preserving only the leaf directory name and file name. +func (ec EntryCaller) TrimmedPath() string { + if !ec.Defined { + return "undefined" + } + // nb. To make sure we trim the path correctly on Windows too, we + // counter-intuitively need to use '/' and *not* os.PathSeparator here, + // because the path given originates from Go stdlib, specifically + // runtime.Caller() which (as of Mar/17) returns forward slashes even on + // Windows. + // + // See https://github.com/golang/go/issues/3335 + // and https://github.com/golang/go/issues/18151 + // + // for discussion on the issue on Go side. + // + // Find the last separator. + // + idx := strings.LastIndexByte(ec.File, '/') + if idx == -1 { + return ec.FullPath() + } + // Find the penultimate separator. + idx = strings.LastIndexByte(ec.File[:idx], '/') + if idx == -1 { + return ec.FullPath() + } + buf := bufferpool.Get() + // Keep everything after the penultimate separator. + buf.AppendString(ec.File[idx+1:]) + buf.AppendByte(':') + buf.AppendInt(int64(ec.Line)) + caller := buf.String() + buf.Free() + return caller +} + +// An Entry represents a complete log message. The entry's structured context +// is already serialized, but the log level, time, message, and call site +// information are available for inspection and modification. Any fields left +// empty will be omitted when encoding. +// +// Entries are pooled, so any functions that accept them MUST be careful not to +// retain references to them. +type Entry struct { + Level Level + Time time.Time + LoggerName string + Message string + Caller EntryCaller + Stack string +} + +// CheckWriteAction indicates what action to take after a log entry is +// processed. Actions are ordered in increasing severity. +type CheckWriteAction uint8 + +const ( + // WriteThenNoop indicates that nothing special needs to be done. It's the + // default behavior. + WriteThenNoop CheckWriteAction = iota + // WriteThenPanic causes a panic after Write. + WriteThenPanic + // WriteThenFatal causes a fatal os.Exit after Write. + WriteThenFatal +) + +// CheckedEntry is an Entry together with a collection of Cores that have +// already agreed to log it. +// +// CheckedEntry references should be created by calling AddCore or Should on a +// nil *CheckedEntry. References are returned to a pool after Write, and MUST +// NOT be retained after calling their Write method. +type CheckedEntry struct { + Entry + ErrorOutput WriteSyncer + dirty bool // best-effort detection of pool misuse + should CheckWriteAction + cores []Core +} + +func (ce *CheckedEntry) reset() { + ce.Entry = Entry{} + ce.ErrorOutput = nil + ce.dirty = false + ce.should = WriteThenNoop + for i := range ce.cores { + // don't keep references to cores + ce.cores[i] = nil + } + ce.cores = ce.cores[:0] +} + +// Write writes the entry to the stored Cores, returns any errors, and returns +// the CheckedEntry reference to a pool for immediate re-use. Finally, it +// executes any required CheckWriteAction. +func (ce *CheckedEntry) Write(fields ...Field) { + if ce == nil { + return + } + + if ce.dirty { + if ce.ErrorOutput != nil { + // Make a best effort to detect unsafe re-use of this CheckedEntry. + // If the entry is dirty, log an internal error; because the + // CheckedEntry is being used after it was returned to the pool, + // the message may be an amalgamation from multiple call sites. + fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", time.Now(), ce.Entry) + ce.ErrorOutput.Sync() + } + return + } + ce.dirty = true + + var err error + for i := range ce.cores { + err = multierr.Append(err, ce.cores[i].Write(ce.Entry, fields)) + } + if ce.ErrorOutput != nil { + if err != nil { + fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", time.Now(), err) + ce.ErrorOutput.Sync() + } + } + + should, msg := ce.should, ce.Message + putCheckedEntry(ce) + + switch should { + case WriteThenPanic: + panic(msg) + case WriteThenFatal: + exit.Exit() + } +} + +// AddCore adds a Core that has agreed to log this CheckedEntry. It's intended to be +// used by Core.Check implementations, and is safe to call on nil CheckedEntry +// references. +func (ce *CheckedEntry) AddCore(ent Entry, core Core) *CheckedEntry { + if ce == nil { + ce = getCheckedEntry() + ce.Entry = ent + } + ce.cores = append(ce.cores, core) + return ce +} + +// Should sets this CheckedEntry's CheckWriteAction, which controls whether a +// Core will panic or fatal after writing this log entry. Like AddCore, it's +// safe to call on nil CheckedEntry references. +func (ce *CheckedEntry) Should(ent Entry, should CheckWriteAction) *CheckedEntry { + if ce == nil { + ce = getCheckedEntry() + ce.Entry = ent + } + ce.should = should + return ce +} diff --git a/vendor/go.uber.org/zap/zapcore/error.go b/vendor/go.uber.org/zap/zapcore/error.go new file mode 100644 index 00000000..a67c7bac --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/error.go @@ -0,0 +1,120 @@ +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "fmt" + "sync" +) + +// Encodes the given error into fields of an object. A field with the given +// name is added for the error message. +// +// If the error implements fmt.Formatter, a field with the name ${key}Verbose +// is also added with the full verbose error message. +// +// Finally, if the error implements errorGroup (from go.uber.org/multierr) or +// causer (from github.com/pkg/errors), a ${key}Causes field is added with an +// array of objects containing the errors this error was comprised of. +// +// { +// "error": err.Error(), +// "errorVerbose": fmt.Sprintf("%+v", err), +// "errorCauses": [ +// ... +// ], +// } +func encodeError(key string, err error, enc ObjectEncoder) error { + basic := err.Error() + enc.AddString(key, basic) + + switch e := err.(type) { + case errorGroup: + return enc.AddArray(key+"Causes", errArray(e.Errors())) + case fmt.Formatter: + verbose := fmt.Sprintf("%+v", e) + if verbose != basic { + // This is a rich error type, like those produced by + // github.com/pkg/errors. + enc.AddString(key+"Verbose", verbose) + } + } + return nil +} + +type errorGroup interface { + // Provides read-only access to the underlying list of errors, preferably + // without causing any allocs. + Errors() []error +} + +type causer interface { + // Provides access to the error that caused this error. + Cause() error +} + +// Note that errArry and errArrayElem are very similar to the version +// implemented in the top-level error.go file. We can't re-use this because +// that would require exporting errArray as part of the zapcore API. + +// Encodes a list of errors using the standard error encoding logic. +type errArray []error + +func (errs errArray) MarshalLogArray(arr ArrayEncoder) error { + for i := range errs { + if errs[i] == nil { + continue + } + + el := newErrArrayElem(errs[i]) + arr.AppendObject(el) + el.Free() + } + return nil +} + +var _errArrayElemPool = sync.Pool{New: func() interface{} { + return &errArrayElem{} +}} + +// Encodes any error into a {"error": ...} re-using the same errors logic. +// +// May be passed in place of an array to build a single-element array. +type errArrayElem struct{ err error } + +func newErrArrayElem(err error) *errArrayElem { + e := _errArrayElemPool.Get().(*errArrayElem) + e.err = err + return e +} + +func (e *errArrayElem) MarshalLogArray(arr ArrayEncoder) error { + return arr.AppendObject(e) +} + +func (e *errArrayElem) MarshalLogObject(enc ObjectEncoder) error { + return encodeError("error", e.err, enc) +} + +func (e *errArrayElem) Free() { + e.err = nil + _errArrayElemPool.Put(e) +} diff --git a/vendor/go.uber.org/zap/zapcore/field.go b/vendor/go.uber.org/zap/zapcore/field.go new file mode 100644 index 00000000..ae772e4a --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/field.go @@ -0,0 +1,212 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "bytes" + "fmt" + "math" + "reflect" + "time" +) + +// A FieldType indicates which member of the Field union struct should be used +// and how it should be serialized. +type FieldType uint8 + +const ( + // UnknownType is the default field type. Attempting to add it to an encoder will panic. + UnknownType FieldType = iota + // ArrayMarshalerType indicates that the field carries an ArrayMarshaler. + ArrayMarshalerType + // ObjectMarshalerType indicates that the field carries an ObjectMarshaler. + ObjectMarshalerType + // BinaryType indicates that the field carries an opaque binary blob. + BinaryType + // BoolType indicates that the field carries a bool. + BoolType + // ByteStringType indicates that the field carries UTF-8 encoded bytes. + ByteStringType + // Complex128Type indicates that the field carries a complex128. + Complex128Type + // Complex64Type indicates that the field carries a complex128. + Complex64Type + // DurationType indicates that the field carries a time.Duration. + DurationType + // Float64Type indicates that the field carries a float64. + Float64Type + // Float32Type indicates that the field carries a float32. + Float32Type + // Int64Type indicates that the field carries an int64. + Int64Type + // Int32Type indicates that the field carries an int32. + Int32Type + // Int16Type indicates that the field carries an int16. + Int16Type + // Int8Type indicates that the field carries an int8. + Int8Type + // StringType indicates that the field carries a string. + StringType + // TimeType indicates that the field carries a time.Time. + TimeType + // Uint64Type indicates that the field carries a uint64. + Uint64Type + // Uint32Type indicates that the field carries a uint32. + Uint32Type + // Uint16Type indicates that the field carries a uint16. + Uint16Type + // Uint8Type indicates that the field carries a uint8. + Uint8Type + // UintptrType indicates that the field carries a uintptr. + UintptrType + // ReflectType indicates that the field carries an interface{}, which should + // be serialized using reflection. + ReflectType + // NamespaceType signals the beginning of an isolated namespace. All + // subsequent fields should be added to the new namespace. + NamespaceType + // StringerType indicates that the field carries a fmt.Stringer. + StringerType + // ErrorType indicates that the field carries an error. + ErrorType + // SkipType indicates that the field is a no-op. + SkipType +) + +// A Field is a marshaling operation used to add a key-value pair to a logger's +// context. Most fields are lazily marshaled, so it's inexpensive to add fields +// to disabled debug-level log statements. +type Field struct { + Key string + Type FieldType + Integer int64 + String string + Interface interface{} +} + +// AddTo exports a field through the ObjectEncoder interface. It's primarily +// useful to library authors, and shouldn't be necessary in most applications. +func (f Field) AddTo(enc ObjectEncoder) { + var err error + + switch f.Type { + case ArrayMarshalerType: + err = enc.AddArray(f.Key, f.Interface.(ArrayMarshaler)) + case ObjectMarshalerType: + err = enc.AddObject(f.Key, f.Interface.(ObjectMarshaler)) + case BinaryType: + enc.AddBinary(f.Key, f.Interface.([]byte)) + case BoolType: + enc.AddBool(f.Key, f.Integer == 1) + case ByteStringType: + enc.AddByteString(f.Key, f.Interface.([]byte)) + case Complex128Type: + enc.AddComplex128(f.Key, f.Interface.(complex128)) + case Complex64Type: + enc.AddComplex64(f.Key, f.Interface.(complex64)) + case DurationType: + enc.AddDuration(f.Key, time.Duration(f.Integer)) + case Float64Type: + enc.AddFloat64(f.Key, math.Float64frombits(uint64(f.Integer))) + case Float32Type: + enc.AddFloat32(f.Key, math.Float32frombits(uint32(f.Integer))) + case Int64Type: + enc.AddInt64(f.Key, f.Integer) + case Int32Type: + enc.AddInt32(f.Key, int32(f.Integer)) + case Int16Type: + enc.AddInt16(f.Key, int16(f.Integer)) + case Int8Type: + enc.AddInt8(f.Key, int8(f.Integer)) + case StringType: + enc.AddString(f.Key, f.String) + case TimeType: + if f.Interface != nil { + enc.AddTime(f.Key, time.Unix(0, f.Integer).In(f.Interface.(*time.Location))) + } else { + // Fall back to UTC if location is nil. + enc.AddTime(f.Key, time.Unix(0, f.Integer)) + } + case Uint64Type: + enc.AddUint64(f.Key, uint64(f.Integer)) + case Uint32Type: + enc.AddUint32(f.Key, uint32(f.Integer)) + case Uint16Type: + enc.AddUint16(f.Key, uint16(f.Integer)) + case Uint8Type: + enc.AddUint8(f.Key, uint8(f.Integer)) + case UintptrType: + enc.AddUintptr(f.Key, uintptr(f.Integer)) + case ReflectType: + err = enc.AddReflected(f.Key, f.Interface) + case NamespaceType: + enc.OpenNamespace(f.Key) + case StringerType: + err = encodeStringer(f.Key, f.Interface, enc) + case ErrorType: + encodeError(f.Key, f.Interface.(error), enc) + case SkipType: + break + default: + panic(fmt.Sprintf("unknown field type: %v", f)) + } + + if err != nil { + enc.AddString(fmt.Sprintf("%sError", f.Key), err.Error()) + } +} + +// Equals returns whether two fields are equal. For non-primitive types such as +// errors, marshalers, or reflect types, it uses reflect.DeepEqual. +func (f Field) Equals(other Field) bool { + if f.Type != other.Type { + return false + } + if f.Key != other.Key { + return false + } + + switch f.Type { + case BinaryType, ByteStringType: + return bytes.Equal(f.Interface.([]byte), other.Interface.([]byte)) + case ArrayMarshalerType, ObjectMarshalerType, ErrorType, ReflectType: + return reflect.DeepEqual(f.Interface, other.Interface) + default: + return f == other + } +} + +func addFields(enc ObjectEncoder, fields []Field) { + for i := range fields { + fields[i].AddTo(enc) + } +} + +func encodeStringer(key string, stringer interface{}, enc ObjectEncoder) (err error) { + defer func() { + if v := recover(); v != nil { + err = fmt.Errorf("PANIC=%v", v) + } + }() + + enc.AddString(key, stringer.(fmt.Stringer).String()) + return +} diff --git a/vendor/go.uber.org/zap/zapcore/hook.go b/vendor/go.uber.org/zap/zapcore/hook.go new file mode 100644 index 00000000..5db4afb3 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/hook.go @@ -0,0 +1,68 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import "go.uber.org/multierr" + +type hooked struct { + Core + funcs []func(Entry) error +} + +// RegisterHooks wraps a Core and runs a collection of user-defined callback +// hooks each time a message is logged. Execution of the callbacks is blocking. +// +// This offers users an easy way to register simple callbacks (e.g., metrics +// collection) without implementing the full Core interface. +func RegisterHooks(core Core, hooks ...func(Entry) error) Core { + funcs := append([]func(Entry) error{}, hooks...) + return &hooked{ + Core: core, + funcs: funcs, + } +} + +func (h *hooked) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + // Let the wrapped Core decide whether to log this message or not. This + // also gives the downstream a chance to register itself directly with the + // CheckedEntry. + if downstream := h.Core.Check(ent, ce); downstream != nil { + return downstream.AddCore(ent, h) + } + return ce +} + +func (h *hooked) With(fields []Field) Core { + return &hooked{ + Core: h.Core.With(fields), + funcs: h.funcs, + } +} + +func (h *hooked) Write(ent Entry, _ []Field) error { + // Since our downstream had a chance to register itself directly with the + // CheckedMessage, we don't need to call it here. + var err error + for i := range h.funcs { + err = multierr.Append(err, h.funcs[i](ent)) + } + return err +} diff --git a/vendor/go.uber.org/zap/zapcore/json_encoder.go b/vendor/go.uber.org/zap/zapcore/json_encoder.go new file mode 100644 index 00000000..56256be8 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/json_encoder.go @@ -0,0 +1,517 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "encoding/base64" + "encoding/json" + "math" + "sync" + "time" + "unicode/utf8" + + "go.uber.org/zap/buffer" + "go.uber.org/zap/internal/bufferpool" +) + +// For JSON-escaping; see jsonEncoder.safeAddString below. +const _hex = "0123456789abcdef" + +var _jsonPool = sync.Pool{New: func() interface{} { + return &jsonEncoder{} +}} + +func getJSONEncoder() *jsonEncoder { + return _jsonPool.Get().(*jsonEncoder) +} + +func putJSONEncoder(enc *jsonEncoder) { + if enc.reflectBuf != nil { + enc.reflectBuf.Free() + } + enc.EncoderConfig = nil + enc.buf = nil + enc.spaced = false + enc.openNamespaces = 0 + enc.reflectBuf = nil + enc.reflectEnc = nil + _jsonPool.Put(enc) +} + +type jsonEncoder struct { + *EncoderConfig + buf *buffer.Buffer + spaced bool // include spaces after colons and commas + openNamespaces int + + // for encoding generic values by reflection + reflectBuf *buffer.Buffer + reflectEnc *json.Encoder +} + +// NewJSONEncoder creates a fast, low-allocation JSON encoder. The encoder +// appropriately escapes all field keys and values. +// +// Note that the encoder doesn't deduplicate keys, so it's possible to produce +// a message like +// {"foo":"bar","foo":"baz"} +// This is permitted by the JSON specification, but not encouraged. Many +// libraries will ignore duplicate key-value pairs (typically keeping the last +// pair) when unmarshaling, but users should attempt to avoid adding duplicate +// keys. +func NewJSONEncoder(cfg EncoderConfig) Encoder { + return newJSONEncoder(cfg, false) +} + +func newJSONEncoder(cfg EncoderConfig, spaced bool) *jsonEncoder { + return &jsonEncoder{ + EncoderConfig: &cfg, + buf: bufferpool.Get(), + spaced: spaced, + } +} + +func (enc *jsonEncoder) AddArray(key string, arr ArrayMarshaler) error { + enc.addKey(key) + return enc.AppendArray(arr) +} + +func (enc *jsonEncoder) AddObject(key string, obj ObjectMarshaler) error { + enc.addKey(key) + return enc.AppendObject(obj) +} + +func (enc *jsonEncoder) AddBinary(key string, val []byte) { + enc.AddString(key, base64.StdEncoding.EncodeToString(val)) +} + +func (enc *jsonEncoder) AddByteString(key string, val []byte) { + enc.addKey(key) + enc.AppendByteString(val) +} + +func (enc *jsonEncoder) AddBool(key string, val bool) { + enc.addKey(key) + enc.AppendBool(val) +} + +func (enc *jsonEncoder) AddComplex128(key string, val complex128) { + enc.addKey(key) + enc.AppendComplex128(val) +} + +func (enc *jsonEncoder) AddDuration(key string, val time.Duration) { + enc.addKey(key) + enc.AppendDuration(val) +} + +func (enc *jsonEncoder) AddFloat64(key string, val float64) { + enc.addKey(key) + enc.AppendFloat64(val) +} + +func (enc *jsonEncoder) AddInt64(key string, val int64) { + enc.addKey(key) + enc.AppendInt64(val) +} + +func (enc *jsonEncoder) resetReflectBuf() { + if enc.reflectBuf == nil { + enc.reflectBuf = bufferpool.Get() + enc.reflectEnc = json.NewEncoder(enc.reflectBuf) + + // For consistency with our custom JSON encoder. + enc.reflectEnc.SetEscapeHTML(false) + } else { + enc.reflectBuf.Reset() + } +} + +var nullLiteralBytes = []byte("null") + +// Only invoke the standard JSON encoder if there is actually something to +// encode; otherwise write JSON null literal directly. +func (enc *jsonEncoder) encodeReflected(obj interface{}) ([]byte, error) { + if obj == nil { + return nullLiteralBytes, nil + } + enc.resetReflectBuf() + if err := enc.reflectEnc.Encode(obj); err != nil { + return nil, err + } + enc.reflectBuf.TrimNewline() + return enc.reflectBuf.Bytes(), nil +} + +func (enc *jsonEncoder) AddReflected(key string, obj interface{}) error { + valueBytes, err := enc.encodeReflected(obj) + if err != nil { + return err + } + enc.addKey(key) + _, err = enc.buf.Write(valueBytes) + return err +} + +func (enc *jsonEncoder) OpenNamespace(key string) { + enc.addKey(key) + enc.buf.AppendByte('{') + enc.openNamespaces++ +} + +func (enc *jsonEncoder) AddString(key, val string) { + enc.addKey(key) + enc.AppendString(val) +} + +func (enc *jsonEncoder) AddTime(key string, val time.Time) { + enc.addKey(key) + enc.AppendTime(val) +} + +func (enc *jsonEncoder) AddUint64(key string, val uint64) { + enc.addKey(key) + enc.AppendUint64(val) +} + +func (enc *jsonEncoder) AppendArray(arr ArrayMarshaler) error { + enc.addElementSeparator() + enc.buf.AppendByte('[') + err := arr.MarshalLogArray(enc) + enc.buf.AppendByte(']') + return err +} + +func (enc *jsonEncoder) AppendObject(obj ObjectMarshaler) error { + enc.addElementSeparator() + enc.buf.AppendByte('{') + err := obj.MarshalLogObject(enc) + enc.buf.AppendByte('}') + return err +} + +func (enc *jsonEncoder) AppendBool(val bool) { + enc.addElementSeparator() + enc.buf.AppendBool(val) +} + +func (enc *jsonEncoder) AppendByteString(val []byte) { + enc.addElementSeparator() + enc.buf.AppendByte('"') + enc.safeAddByteString(val) + enc.buf.AppendByte('"') +} + +func (enc *jsonEncoder) AppendComplex128(val complex128) { + enc.addElementSeparator() + // Cast to a platform-independent, fixed-size type. + r, i := float64(real(val)), float64(imag(val)) + enc.buf.AppendByte('"') + // Because we're always in a quoted string, we can use strconv without + // special-casing NaN and +/-Inf. + enc.buf.AppendFloat(r, 64) + enc.buf.AppendByte('+') + enc.buf.AppendFloat(i, 64) + enc.buf.AppendByte('i') + enc.buf.AppendByte('"') +} + +func (enc *jsonEncoder) AppendDuration(val time.Duration) { + cur := enc.buf.Len() + enc.EncodeDuration(val, enc) + if cur == enc.buf.Len() { + // User-supplied EncodeDuration is a no-op. Fall back to nanoseconds to keep + // JSON valid. + enc.AppendInt64(int64(val)) + } +} + +func (enc *jsonEncoder) AppendInt64(val int64) { + enc.addElementSeparator() + enc.buf.AppendInt(val) +} + +func (enc *jsonEncoder) AppendReflected(val interface{}) error { + valueBytes, err := enc.encodeReflected(val) + if err != nil { + return err + } + enc.addElementSeparator() + _, err = enc.buf.Write(valueBytes) + return err +} + +func (enc *jsonEncoder) AppendString(val string) { + enc.addElementSeparator() + enc.buf.AppendByte('"') + enc.safeAddString(val) + enc.buf.AppendByte('"') +} + +func (enc *jsonEncoder) AppendTime(val time.Time) { + cur := enc.buf.Len() + enc.EncodeTime(val, enc) + if cur == enc.buf.Len() { + // User-supplied EncodeTime is a no-op. Fall back to nanos since epoch to keep + // output JSON valid. + enc.AppendInt64(val.UnixNano()) + } +} + +func (enc *jsonEncoder) AppendUint64(val uint64) { + enc.addElementSeparator() + enc.buf.AppendUint(val) +} + +func (enc *jsonEncoder) AddComplex64(k string, v complex64) { enc.AddComplex128(k, complex128(v)) } +func (enc *jsonEncoder) AddFloat32(k string, v float32) { enc.AddFloat64(k, float64(v)) } +func (enc *jsonEncoder) AddInt(k string, v int) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt32(k string, v int32) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt16(k string, v int16) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt8(k string, v int8) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddUint(k string, v uint) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint32(k string, v uint32) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint16(k string, v uint16) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint8(k string, v uint8) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUintptr(k string, v uintptr) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AppendComplex64(v complex64) { enc.AppendComplex128(complex128(v)) } +func (enc *jsonEncoder) AppendFloat64(v float64) { enc.appendFloat(v, 64) } +func (enc *jsonEncoder) AppendFloat32(v float32) { enc.appendFloat(float64(v), 32) } +func (enc *jsonEncoder) AppendInt(v int) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt32(v int32) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt16(v int16) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt8(v int8) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendUint(v uint) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint32(v uint32) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint16(v uint16) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint8(v uint8) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUintptr(v uintptr) { enc.AppendUint64(uint64(v)) } + +func (enc *jsonEncoder) Clone() Encoder { + clone := enc.clone() + clone.buf.Write(enc.buf.Bytes()) + return clone +} + +func (enc *jsonEncoder) clone() *jsonEncoder { + clone := getJSONEncoder() + clone.EncoderConfig = enc.EncoderConfig + clone.spaced = enc.spaced + clone.openNamespaces = enc.openNamespaces + clone.buf = bufferpool.Get() + return clone +} + +func (enc *jsonEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, error) { + final := enc.clone() + final.buf.AppendByte('{') + + if final.LevelKey != "" { + final.addKey(final.LevelKey) + cur := final.buf.Len() + final.EncodeLevel(ent.Level, final) + if cur == final.buf.Len() { + // User-supplied EncodeLevel was a no-op. Fall back to strings to keep + // output JSON valid. + final.AppendString(ent.Level.String()) + } + } + if final.TimeKey != "" { + final.AddTime(final.TimeKey, ent.Time) + } + if ent.LoggerName != "" && final.NameKey != "" { + final.addKey(final.NameKey) + cur := final.buf.Len() + nameEncoder := final.EncodeName + + // if no name encoder provided, fall back to FullNameEncoder for backwards + // compatibility + if nameEncoder == nil { + nameEncoder = FullNameEncoder + } + + nameEncoder(ent.LoggerName, final) + if cur == final.buf.Len() { + // User-supplied EncodeName was a no-op. Fall back to strings to + // keep output JSON valid. + final.AppendString(ent.LoggerName) + } + } + if ent.Caller.Defined && final.CallerKey != "" { + final.addKey(final.CallerKey) + cur := final.buf.Len() + final.EncodeCaller(ent.Caller, final) + if cur == final.buf.Len() { + // User-supplied EncodeCaller was a no-op. Fall back to strings to + // keep output JSON valid. + final.AppendString(ent.Caller.String()) + } + } + if final.MessageKey != "" { + final.addKey(enc.MessageKey) + final.AppendString(ent.Message) + } + if enc.buf.Len() > 0 { + final.addElementSeparator() + final.buf.Write(enc.buf.Bytes()) + } + addFields(final, fields) + final.closeOpenNamespaces() + if ent.Stack != "" && final.StacktraceKey != "" { + final.AddString(final.StacktraceKey, ent.Stack) + } + final.buf.AppendByte('}') + if final.LineEnding != "" { + final.buf.AppendString(final.LineEnding) + } else { + final.buf.AppendString(DefaultLineEnding) + } + + ret := final.buf + putJSONEncoder(final) + return ret, nil +} + +func (enc *jsonEncoder) truncate() { + enc.buf.Reset() +} + +func (enc *jsonEncoder) closeOpenNamespaces() { + for i := 0; i < enc.openNamespaces; i++ { + enc.buf.AppendByte('}') + } +} + +func (enc *jsonEncoder) addKey(key string) { + enc.addElementSeparator() + enc.buf.AppendByte('"') + enc.safeAddString(key) + enc.buf.AppendByte('"') + enc.buf.AppendByte(':') + if enc.spaced { + enc.buf.AppendByte(' ') + } +} + +func (enc *jsonEncoder) addElementSeparator() { + last := enc.buf.Len() - 1 + if last < 0 { + return + } + switch enc.buf.Bytes()[last] { + case '{', '[', ':', ',', ' ': + return + default: + enc.buf.AppendByte(',') + if enc.spaced { + enc.buf.AppendByte(' ') + } + } +} + +func (enc *jsonEncoder) appendFloat(val float64, bitSize int) { + enc.addElementSeparator() + switch { + case math.IsNaN(val): + enc.buf.AppendString(`"NaN"`) + case math.IsInf(val, 1): + enc.buf.AppendString(`"+Inf"`) + case math.IsInf(val, -1): + enc.buf.AppendString(`"-Inf"`) + default: + enc.buf.AppendFloat(val, bitSize) + } +} + +// safeAddString JSON-escapes a string and appends it to the internal buffer. +// Unlike the standard library's encoder, it doesn't attempt to protect the +// user from browser vulnerabilities or JSONP-related problems. +func (enc *jsonEncoder) safeAddString(s string) { + for i := 0; i < len(s); { + if enc.tryAddRuneSelf(s[i]) { + i++ + continue + } + r, size := utf8.DecodeRuneInString(s[i:]) + if enc.tryAddRuneError(r, size) { + i++ + continue + } + enc.buf.AppendString(s[i : i+size]) + i += size + } +} + +// safeAddByteString is no-alloc equivalent of safeAddString(string(s)) for s []byte. +func (enc *jsonEncoder) safeAddByteString(s []byte) { + for i := 0; i < len(s); { + if enc.tryAddRuneSelf(s[i]) { + i++ + continue + } + r, size := utf8.DecodeRune(s[i:]) + if enc.tryAddRuneError(r, size) { + i++ + continue + } + enc.buf.Write(s[i : i+size]) + i += size + } +} + +// tryAddRuneSelf appends b if it is valid UTF-8 character represented in a single byte. +func (enc *jsonEncoder) tryAddRuneSelf(b byte) bool { + if b >= utf8.RuneSelf { + return false + } + if 0x20 <= b && b != '\\' && b != '"' { + enc.buf.AppendByte(b) + return true + } + switch b { + case '\\', '"': + enc.buf.AppendByte('\\') + enc.buf.AppendByte(b) + case '\n': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('n') + case '\r': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('r') + case '\t': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('t') + default: + // Encode bytes < 0x20, except for the escape sequences above. + enc.buf.AppendString(`\u00`) + enc.buf.AppendByte(_hex[b>>4]) + enc.buf.AppendByte(_hex[b&0xF]) + } + return true +} + +func (enc *jsonEncoder) tryAddRuneError(r rune, size int) bool { + if r == utf8.RuneError && size == 1 { + enc.buf.AppendString(`\ufffd`) + return true + } + return false +} diff --git a/vendor/go.uber.org/zap/zapcore/level.go b/vendor/go.uber.org/zap/zapcore/level.go new file mode 100644 index 00000000..e575c9f4 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/level.go @@ -0,0 +1,175 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "bytes" + "errors" + "fmt" +) + +var errUnmarshalNilLevel = errors.New("can't unmarshal a nil *Level") + +// A Level is a logging priority. Higher levels are more important. +type Level int8 + +const ( + // DebugLevel logs are typically voluminous, and are usually disabled in + // production. + DebugLevel Level = iota - 1 + // InfoLevel is the default logging priority. + InfoLevel + // WarnLevel logs are more important than Info, but don't need individual + // human review. + WarnLevel + // ErrorLevel logs are high-priority. If an application is running smoothly, + // it shouldn't generate any error-level logs. + ErrorLevel + // DPanicLevel logs are particularly important errors. In development the + // logger panics after writing the message. + DPanicLevel + // PanicLevel logs a message, then panics. + PanicLevel + // FatalLevel logs a message, then calls os.Exit(1). + FatalLevel + + _minLevel = DebugLevel + _maxLevel = FatalLevel +) + +// String returns a lower-case ASCII representation of the log level. +func (l Level) String() string { + switch l { + case DebugLevel: + return "debug" + case InfoLevel: + return "info" + case WarnLevel: + return "warn" + case ErrorLevel: + return "error" + case DPanicLevel: + return "dpanic" + case PanicLevel: + return "panic" + case FatalLevel: + return "fatal" + default: + return fmt.Sprintf("Level(%d)", l) + } +} + +// CapitalString returns an all-caps ASCII representation of the log level. +func (l Level) CapitalString() string { + // Printing levels in all-caps is common enough that we should export this + // functionality. + switch l { + case DebugLevel: + return "DEBUG" + case InfoLevel: + return "INFO" + case WarnLevel: + return "WARN" + case ErrorLevel: + return "ERROR" + case DPanicLevel: + return "DPANIC" + case PanicLevel: + return "PANIC" + case FatalLevel: + return "FATAL" + default: + return fmt.Sprintf("LEVEL(%d)", l) + } +} + +// MarshalText marshals the Level to text. Note that the text representation +// drops the -Level suffix (see example). +func (l Level) MarshalText() ([]byte, error) { + return []byte(l.String()), nil +} + +// UnmarshalText unmarshals text to a level. Like MarshalText, UnmarshalText +// expects the text representation of a Level to drop the -Level suffix (see +// example). +// +// In particular, this makes it easy to configure logging levels using YAML, +// TOML, or JSON files. +func (l *Level) UnmarshalText(text []byte) error { + if l == nil { + return errUnmarshalNilLevel + } + if !l.unmarshalText(text) && !l.unmarshalText(bytes.ToLower(text)) { + return fmt.Errorf("unrecognized level: %q", text) + } + return nil +} + +func (l *Level) unmarshalText(text []byte) bool { + switch string(text) { + case "debug", "DEBUG": + *l = DebugLevel + case "info", "INFO", "": // make the zero value useful + *l = InfoLevel + case "warn", "WARN": + *l = WarnLevel + case "error", "ERROR": + *l = ErrorLevel + case "dpanic", "DPANIC": + *l = DPanicLevel + case "panic", "PANIC": + *l = PanicLevel + case "fatal", "FATAL": + *l = FatalLevel + default: + return false + } + return true +} + +// Set sets the level for the flag.Value interface. +func (l *Level) Set(s string) error { + return l.UnmarshalText([]byte(s)) +} + +// Get gets the level for the flag.Getter interface. +func (l *Level) Get() interface{} { + return *l +} + +// Enabled returns true if the given level is at or above this level. +func (l Level) Enabled(lvl Level) bool { + return lvl >= l +} + +// LevelEnabler decides whether a given logging level is enabled when logging a +// message. +// +// Enablers are intended to be used to implement deterministic filters; +// concerns like sampling are better implemented as a Core. +// +// Each concrete Level value implements a static LevelEnabler which returns +// true for itself and all higher logging levels. For example WarnLevel.Enabled() +// will return true for WarnLevel, ErrorLevel, DPanicLevel, PanicLevel, and +// FatalLevel, but return false for InfoLevel and DebugLevel. +type LevelEnabler interface { + Enabled(Level) bool +} diff --git a/vendor/go.uber.org/zap/zapcore/level_strings.go b/vendor/go.uber.org/zap/zapcore/level_strings.go new file mode 100644 index 00000000..7af8dadc --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/level_strings.go @@ -0,0 +1,46 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import "go.uber.org/zap/internal/color" + +var ( + _levelToColor = map[Level]color.Color{ + DebugLevel: color.Magenta, + InfoLevel: color.Blue, + WarnLevel: color.Yellow, + ErrorLevel: color.Red, + DPanicLevel: color.Red, + PanicLevel: color.Red, + FatalLevel: color.Red, + } + _unknownLevelColor = color.Red + + _levelToLowercaseColorString = make(map[Level]string, len(_levelToColor)) + _levelToCapitalColorString = make(map[Level]string, len(_levelToColor)) +) + +func init() { + for level, color := range _levelToColor { + _levelToLowercaseColorString[level] = color.Add(level.String()) + _levelToCapitalColorString[level] = color.Add(level.CapitalString()) + } +} diff --git a/vendor/go.uber.org/zap/zapcore/marshaler.go b/vendor/go.uber.org/zap/zapcore/marshaler.go new file mode 100644 index 00000000..2627a653 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/marshaler.go @@ -0,0 +1,53 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +// ObjectMarshaler allows user-defined types to efficiently add themselves to the +// logging context, and to selectively omit information which shouldn't be +// included in logs (e.g., passwords). +type ObjectMarshaler interface { + MarshalLogObject(ObjectEncoder) error +} + +// ObjectMarshalerFunc is a type adapter that turns a function into an +// ObjectMarshaler. +type ObjectMarshalerFunc func(ObjectEncoder) error + +// MarshalLogObject calls the underlying function. +func (f ObjectMarshalerFunc) MarshalLogObject(enc ObjectEncoder) error { + return f(enc) +} + +// ArrayMarshaler allows user-defined types to efficiently add themselves to the +// logging context, and to selectively omit information which shouldn't be +// included in logs (e.g., passwords). +type ArrayMarshaler interface { + MarshalLogArray(ArrayEncoder) error +} + +// ArrayMarshalerFunc is a type adapter that turns a function into an +// ArrayMarshaler. +type ArrayMarshalerFunc func(ArrayEncoder) error + +// MarshalLogArray calls the underlying function. +func (f ArrayMarshalerFunc) MarshalLogArray(enc ArrayEncoder) error { + return f(enc) +} diff --git a/vendor/go.uber.org/zap/zapcore/memory_encoder.go b/vendor/go.uber.org/zap/zapcore/memory_encoder.go new file mode 100644 index 00000000..dfead082 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/memory_encoder.go @@ -0,0 +1,179 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import "time" + +// MapObjectEncoder is an ObjectEncoder backed by a simple +// map[string]interface{}. It's not fast enough for production use, but it's +// helpful in tests. +type MapObjectEncoder struct { + // Fields contains the entire encoded log context. + Fields map[string]interface{} + // cur is a pointer to the namespace we're currently writing to. + cur map[string]interface{} +} + +// NewMapObjectEncoder creates a new map-backed ObjectEncoder. +func NewMapObjectEncoder() *MapObjectEncoder { + m := make(map[string]interface{}) + return &MapObjectEncoder{ + Fields: m, + cur: m, + } +} + +// AddArray implements ObjectEncoder. +func (m *MapObjectEncoder) AddArray(key string, v ArrayMarshaler) error { + arr := &sliceArrayEncoder{elems: make([]interface{}, 0)} + err := v.MarshalLogArray(arr) + m.cur[key] = arr.elems + return err +} + +// AddObject implements ObjectEncoder. +func (m *MapObjectEncoder) AddObject(k string, v ObjectMarshaler) error { + newMap := NewMapObjectEncoder() + m.cur[k] = newMap.Fields + return v.MarshalLogObject(newMap) +} + +// AddBinary implements ObjectEncoder. +func (m *MapObjectEncoder) AddBinary(k string, v []byte) { m.cur[k] = v } + +// AddByteString implements ObjectEncoder. +func (m *MapObjectEncoder) AddByteString(k string, v []byte) { m.cur[k] = string(v) } + +// AddBool implements ObjectEncoder. +func (m *MapObjectEncoder) AddBool(k string, v bool) { m.cur[k] = v } + +// AddDuration implements ObjectEncoder. +func (m MapObjectEncoder) AddDuration(k string, v time.Duration) { m.cur[k] = v } + +// AddComplex128 implements ObjectEncoder. +func (m *MapObjectEncoder) AddComplex128(k string, v complex128) { m.cur[k] = v } + +// AddComplex64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddComplex64(k string, v complex64) { m.cur[k] = v } + +// AddFloat64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddFloat64(k string, v float64) { m.cur[k] = v } + +// AddFloat32 implements ObjectEncoder. +func (m *MapObjectEncoder) AddFloat32(k string, v float32) { m.cur[k] = v } + +// AddInt implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt(k string, v int) { m.cur[k] = v } + +// AddInt64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt64(k string, v int64) { m.cur[k] = v } + +// AddInt32 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt32(k string, v int32) { m.cur[k] = v } + +// AddInt16 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt16(k string, v int16) { m.cur[k] = v } + +// AddInt8 implements ObjectEncoder. +func (m *MapObjectEncoder) AddInt8(k string, v int8) { m.cur[k] = v } + +// AddString implements ObjectEncoder. +func (m *MapObjectEncoder) AddString(k string, v string) { m.cur[k] = v } + +// AddTime implements ObjectEncoder. +func (m MapObjectEncoder) AddTime(k string, v time.Time) { m.cur[k] = v } + +// AddUint implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint(k string, v uint) { m.cur[k] = v } + +// AddUint64 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint64(k string, v uint64) { m.cur[k] = v } + +// AddUint32 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint32(k string, v uint32) { m.cur[k] = v } + +// AddUint16 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint16(k string, v uint16) { m.cur[k] = v } + +// AddUint8 implements ObjectEncoder. +func (m *MapObjectEncoder) AddUint8(k string, v uint8) { m.cur[k] = v } + +// AddUintptr implements ObjectEncoder. +func (m *MapObjectEncoder) AddUintptr(k string, v uintptr) { m.cur[k] = v } + +// AddReflected implements ObjectEncoder. +func (m *MapObjectEncoder) AddReflected(k string, v interface{}) error { + m.cur[k] = v + return nil +} + +// OpenNamespace implements ObjectEncoder. +func (m *MapObjectEncoder) OpenNamespace(k string) { + ns := make(map[string]interface{}) + m.cur[k] = ns + m.cur = ns +} + +// sliceArrayEncoder is an ArrayEncoder backed by a simple []interface{}. Like +// the MapObjectEncoder, it's not designed for production use. +type sliceArrayEncoder struct { + elems []interface{} +} + +func (s *sliceArrayEncoder) AppendArray(v ArrayMarshaler) error { + enc := &sliceArrayEncoder{} + err := v.MarshalLogArray(enc) + s.elems = append(s.elems, enc.elems) + return err +} + +func (s *sliceArrayEncoder) AppendObject(v ObjectMarshaler) error { + m := NewMapObjectEncoder() + err := v.MarshalLogObject(m) + s.elems = append(s.elems, m.Fields) + return err +} + +func (s *sliceArrayEncoder) AppendReflected(v interface{}) error { + s.elems = append(s.elems, v) + return nil +} + +func (s *sliceArrayEncoder) AppendBool(v bool) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendByteString(v []byte) { s.elems = append(s.elems, string(v)) } +func (s *sliceArrayEncoder) AppendComplex128(v complex128) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendComplex64(v complex64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendDuration(v time.Duration) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendFloat64(v float64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendFloat32(v float32) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt(v int) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt64(v int64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt32(v int32) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt16(v int16) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendInt8(v int8) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendString(v string) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendTime(v time.Time) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint(v uint) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint64(v uint64) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint32(v uint32) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint16(v uint16) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUint8(v uint8) { s.elems = append(s.elems, v) } +func (s *sliceArrayEncoder) AppendUintptr(v uintptr) { s.elems = append(s.elems, v) } diff --git a/vendor/go.uber.org/zap/zapcore/sampler.go b/vendor/go.uber.org/zap/zapcore/sampler.go new file mode 100644 index 00000000..e3164186 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/sampler.go @@ -0,0 +1,134 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "time" + + "go.uber.org/atomic" +) + +const ( + _numLevels = _maxLevel - _minLevel + 1 + _countersPerLevel = 4096 +) + +type counter struct { + resetAt atomic.Int64 + counter atomic.Uint64 +} + +type counters [_numLevels][_countersPerLevel]counter + +func newCounters() *counters { + return &counters{} +} + +func (cs *counters) get(lvl Level, key string) *counter { + i := lvl - _minLevel + j := fnv32a(key) % _countersPerLevel + return &cs[i][j] +} + +// fnv32a, adapted from "hash/fnv", but without a []byte(string) alloc +func fnv32a(s string) uint32 { + const ( + offset32 = 2166136261 + prime32 = 16777619 + ) + hash := uint32(offset32) + for i := 0; i < len(s); i++ { + hash ^= uint32(s[i]) + hash *= prime32 + } + return hash +} + +func (c *counter) IncCheckReset(t time.Time, tick time.Duration) uint64 { + tn := t.UnixNano() + resetAfter := c.resetAt.Load() + if resetAfter > tn { + return c.counter.Inc() + } + + c.counter.Store(1) + + newResetAfter := tn + tick.Nanoseconds() + if !c.resetAt.CAS(resetAfter, newResetAfter) { + // We raced with another goroutine trying to reset, and it also reset + // the counter to 1, so we need to reincrement the counter. + return c.counter.Inc() + } + + return 1 +} + +type sampler struct { + Core + + counts *counters + tick time.Duration + first, thereafter uint64 +} + +// NewSampler creates a Core that samples incoming entries, which caps the CPU +// and I/O load of logging while attempting to preserve a representative subset +// of your logs. +// +// Zap samples by logging the first N entries with a given level and message +// each tick. If more Entries with the same level and message are seen during +// the same interval, every Mth message is logged and the rest are dropped. +// +// Keep in mind that zap's sampling implementation is optimized for speed over +// absolute precision; under load, each tick may be slightly over- or +// under-sampled. +func NewSampler(core Core, tick time.Duration, first, thereafter int) Core { + return &sampler{ + Core: core, + tick: tick, + counts: newCounters(), + first: uint64(first), + thereafter: uint64(thereafter), + } +} + +func (s *sampler) With(fields []Field) Core { + return &sampler{ + Core: s.Core.With(fields), + tick: s.tick, + counts: s.counts, + first: s.first, + thereafter: s.thereafter, + } +} + +func (s *sampler) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + if !s.Enabled(ent.Level) { + return ce + } + + counter := s.counts.get(ent.Level, ent.Message) + n := counter.IncCheckReset(ent.Time, s.tick) + if n > s.first && (n-s.first)%s.thereafter != 0 { + return ce + } + return s.Core.Check(ent, ce) +} diff --git a/vendor/go.uber.org/zap/zapcore/tee.go b/vendor/go.uber.org/zap/zapcore/tee.go new file mode 100644 index 00000000..07a32eef --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/tee.go @@ -0,0 +1,81 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import "go.uber.org/multierr" + +type multiCore []Core + +// NewTee creates a Core that duplicates log entries into two or more +// underlying Cores. +// +// Calling it with a single Core returns the input unchanged, and calling +// it with no input returns a no-op Core. +func NewTee(cores ...Core) Core { + switch len(cores) { + case 0: + return NewNopCore() + case 1: + return cores[0] + default: + return multiCore(cores) + } +} + +func (mc multiCore) With(fields []Field) Core { + clone := make(multiCore, len(mc)) + for i := range mc { + clone[i] = mc[i].With(fields) + } + return clone +} + +func (mc multiCore) Enabled(lvl Level) bool { + for i := range mc { + if mc[i].Enabled(lvl) { + return true + } + } + return false +} + +func (mc multiCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { + for i := range mc { + ce = mc[i].Check(ent, ce) + } + return ce +} + +func (mc multiCore) Write(ent Entry, fields []Field) error { + var err error + for i := range mc { + err = multierr.Append(err, mc[i].Write(ent, fields)) + } + return err +} + +func (mc multiCore) Sync() error { + var err error + for i := range mc { + err = multierr.Append(err, mc[i].Sync()) + } + return err +} diff --git a/vendor/go.uber.org/zap/zapcore/write_syncer.go b/vendor/go.uber.org/zap/zapcore/write_syncer.go new file mode 100644 index 00000000..209e25fe --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/write_syncer.go @@ -0,0 +1,123 @@ +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "io" + "sync" + + "go.uber.org/multierr" +) + +// A WriteSyncer is an io.Writer that can also flush any buffered data. Note +// that *os.File (and thus, os.Stderr and os.Stdout) implement WriteSyncer. +type WriteSyncer interface { + io.Writer + Sync() error +} + +// AddSync converts an io.Writer to a WriteSyncer. It attempts to be +// intelligent: if the concrete type of the io.Writer implements WriteSyncer, +// we'll use the existing Sync method. If it doesn't, we'll add a no-op Sync. +func AddSync(w io.Writer) WriteSyncer { + switch w := w.(type) { + case WriteSyncer: + return w + default: + return writerWrapper{w} + } +} + +type lockedWriteSyncer struct { + sync.Mutex + ws WriteSyncer +} + +// Lock wraps a WriteSyncer in a mutex to make it safe for concurrent use. In +// particular, *os.Files must be locked before use. +func Lock(ws WriteSyncer) WriteSyncer { + if _, ok := ws.(*lockedWriteSyncer); ok { + // no need to layer on another lock + return ws + } + return &lockedWriteSyncer{ws: ws} +} + +func (s *lockedWriteSyncer) Write(bs []byte) (int, error) { + s.Lock() + n, err := s.ws.Write(bs) + s.Unlock() + return n, err +} + +func (s *lockedWriteSyncer) Sync() error { + s.Lock() + err := s.ws.Sync() + s.Unlock() + return err +} + +type writerWrapper struct { + io.Writer +} + +func (w writerWrapper) Sync() error { + return nil +} + +type multiWriteSyncer []WriteSyncer + +// NewMultiWriteSyncer creates a WriteSyncer that duplicates its writes +// and sync calls, much like io.MultiWriter. +func NewMultiWriteSyncer(ws ...WriteSyncer) WriteSyncer { + if len(ws) == 1 { + return ws[0] + } + // Copy to protect against https://github.com/golang/go/issues/7809 + return multiWriteSyncer(append([]WriteSyncer(nil), ws...)) +} + +// See https://golang.org/src/io/multi.go +// When not all underlying syncers write the same number of bytes, +// the smallest number is returned even though Write() is called on +// all of them. +func (ws multiWriteSyncer) Write(p []byte) (int, error) { + var writeErr error + nWritten := 0 + for _, w := range ws { + n, err := w.Write(p) + writeErr = multierr.Append(writeErr, err) + if nWritten == 0 && n != 0 { + nWritten = n + } else if n < nWritten { + nWritten = n + } + } + return nWritten, writeErr +} + +func (ws multiWriteSyncer) Sync() error { + var err error + for _, w := range ws { + err = multierr.Append(err, w.Sync()) + } + return err +} diff --git a/vendor/golang.org/x/image/AUTHORS b/vendor/golang.org/x/image/AUTHORS new file mode 100644 index 00000000..15167cd7 --- /dev/null +++ b/vendor/golang.org/x/image/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/image/CONTRIBUTORS b/vendor/golang.org/x/image/CONTRIBUTORS new file mode 100644 index 00000000..1c4577e9 --- /dev/null +++ b/vendor/golang.org/x/image/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/gorilla/context/LICENSE b/vendor/golang.org/x/image/LICENSE similarity index 83% rename from vendor/github.com/gorilla/context/LICENSE rename to vendor/golang.org/x/image/LICENSE index 0e5fb872..6a66aea5 100644 --- a/vendor/github.com/gorilla/context/LICENSE +++ b/vendor/golang.org/x/image/LICENSE @@ -1,16 +1,16 @@ -Copyright (c) 2012 Rodrigo Moraes. All rights reserved. +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 + * 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 + * 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 + * 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. diff --git a/vendor/golang.org/x/image/PATENTS b/vendor/golang.org/x/image/PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/vendor/golang.org/x/image/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/image/font/font.go b/vendor/golang.org/x/image/font/font.go new file mode 100644 index 00000000..4d9d63c2 --- /dev/null +++ b/vendor/golang.org/x/image/font/font.go @@ -0,0 +1,371 @@ +// 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. + +// Package font defines an interface for font faces, for drawing text on an +// image. +// +// Other packages provide font face implementations. For example, a truetype +// package would provide one based on .ttf font files. +package font // import "golang.org/x/image/font" + +import ( + "image" + "image/draw" + "io" + "unicode/utf8" + + "golang.org/x/image/math/fixed" +) + +// TODO: who is responsible for caches (glyph images, glyph indices, kerns)? +// The Drawer or the Face? + +// Face is a font face. Its glyphs are often derived from a font file, such as +// "Comic_Sans_MS.ttf", but a face has a specific size, style, weight and +// hinting. For example, the 12pt and 18pt versions of Comic Sans are two +// different faces, even if derived from the same font file. +// +// A Face is not safe for concurrent use by multiple goroutines, as its methods +// may re-use implementation-specific caches and mask image buffers. +// +// To create a Face, look to other packages that implement specific font file +// formats. +type Face interface { + io.Closer + + // Glyph returns the draw.DrawMask parameters (dr, mask, maskp) to draw r's + // glyph at the sub-pixel destination location dot, and that glyph's + // advance width. + // + // It returns !ok if the face does not contain a glyph for r. + // + // The contents of the mask image returned by one Glyph call may change + // after the next Glyph call. Callers that want to cache the mask must make + // a copy. + Glyph(dot fixed.Point26_6, r rune) ( + dr image.Rectangle, mask image.Image, maskp image.Point, advance fixed.Int26_6, ok bool) + + // GlyphBounds returns the bounding box of r's glyph, drawn at a dot equal + // to the origin, and that glyph's advance width. + // + // It returns !ok if the face does not contain a glyph for r. + // + // The glyph's ascent and descent equal -bounds.Min.Y and +bounds.Max.Y. A + // visual depiction of what these metrics are is at + // https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/Art/glyph_metrics_2x.png + GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance fixed.Int26_6, ok bool) + + // GlyphAdvance returns the advance width of r's glyph. + // + // It returns !ok if the face does not contain a glyph for r. + GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool) + + // Kern returns the horizontal adjustment for the kerning pair (r0, r1). A + // positive kern means to move the glyphs further apart. + Kern(r0, r1 rune) fixed.Int26_6 + + // Metrics returns the metrics for this Face. + Metrics() Metrics + + // TODO: ColoredGlyph for various emoji? + // TODO: Ligatures? Shaping? +} + +// Metrics holds the metrics for a Face. A visual depiction is at +// https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/Art/glyph_metrics_2x.png +type Metrics struct { + // Height is the recommended amount of vertical space between two lines of + // text. + Height fixed.Int26_6 + + // Ascent is the distance from the top of a line to its baseline. + Ascent fixed.Int26_6 + + // Descent is the distance from the bottom of a line to its baseline. The + // value is typically positive, even though a descender goes below the + // baseline. + Descent fixed.Int26_6 + + // XHeight is the distance from the top of non-ascending lowercase letters + // to the baseline. + XHeight fixed.Int26_6 + + // CapHeight is the distance from the top of uppercase letters to the + // baseline. + CapHeight fixed.Int26_6 + + // CaretSlope is the slope of a caret as a vector with the Y axis pointing up. + // The slope {0, 1} is the vertical caret. + CaretSlope image.Point +} + +// Drawer draws text on a destination image. +// +// A Drawer is not safe for concurrent use by multiple goroutines, since its +// Face is not. +type Drawer struct { + // Dst is the destination image. + Dst draw.Image + // Src is the source image. + Src image.Image + // Face provides the glyph mask images. + Face Face + // Dot is the baseline location to draw the next glyph. The majority of the + // affected pixels will be above and to the right of the dot, but some may + // be below or to the left. For example, drawing a 'j' in an italic face + // may affect pixels below and to the left of the dot. + Dot fixed.Point26_6 + + // TODO: Clip image.Image? + // TODO: SrcP image.Point for Src images other than *image.Uniform? How + // does it get updated during DrawString? +} + +// TODO: should DrawString return the last rune drawn, so the next DrawString +// call can kern beforehand? Or should that be the responsibility of the caller +// if they really want to do that, since they have to explicitly shift d.Dot +// anyway? What if ligatures span more than two runes? What if grapheme +// clusters span multiple runes? +// +// TODO: do we assume that the input is in any particular Unicode Normalization +// Form? +// +// TODO: have DrawRunes(s []rune)? DrawRuneReader(io.RuneReader)?? If we take +// io.RuneReader, we can't assume that we can rewind the stream. +// +// TODO: how does this work with line breaking: drawing text up until a +// vertical line? Should DrawString return the number of runes drawn? + +// DrawBytes draws s at the dot and advances the dot's location. +// +// It is equivalent to DrawString(string(s)) but may be more efficient. +func (d *Drawer) DrawBytes(s []byte) { + prevC := rune(-1) + for len(s) > 0 { + c, size := utf8.DecodeRune(s) + s = s[size:] + if prevC >= 0 { + d.Dot.X += d.Face.Kern(prevC, c) + } + dr, mask, maskp, advance, ok := d.Face.Glyph(d.Dot, c) + if !ok { + // TODO: is falling back on the U+FFFD glyph the responsibility of + // the Drawer or the Face? + // TODO: set prevC = '\ufffd'? + continue + } + draw.DrawMask(d.Dst, dr, d.Src, image.Point{}, mask, maskp, draw.Over) + d.Dot.X += advance + prevC = c + } +} + +// DrawString draws s at the dot and advances the dot's location. +func (d *Drawer) DrawString(s string) { + prevC := rune(-1) + for _, c := range s { + if prevC >= 0 { + d.Dot.X += d.Face.Kern(prevC, c) + } + dr, mask, maskp, advance, ok := d.Face.Glyph(d.Dot, c) + if !ok { + // TODO: is falling back on the U+FFFD glyph the responsibility of + // the Drawer or the Face? + // TODO: set prevC = '\ufffd'? + continue + } + draw.DrawMask(d.Dst, dr, d.Src, image.Point{}, mask, maskp, draw.Over) + d.Dot.X += advance + prevC = c + } +} + +// BoundBytes returns the bounding box of s, drawn at the drawer dot, as well as +// the advance. +// +// It is equivalent to BoundBytes(string(s)) but may be more efficient. +func (d *Drawer) BoundBytes(s []byte) (bounds fixed.Rectangle26_6, advance fixed.Int26_6) { + bounds, advance = BoundBytes(d.Face, s) + bounds.Min = bounds.Min.Add(d.Dot) + bounds.Max = bounds.Max.Add(d.Dot) + return +} + +// BoundString returns the bounding box of s, drawn at the drawer dot, as well +// as the advance. +func (d *Drawer) BoundString(s string) (bounds fixed.Rectangle26_6, advance fixed.Int26_6) { + bounds, advance = BoundString(d.Face, s) + bounds.Min = bounds.Min.Add(d.Dot) + bounds.Max = bounds.Max.Add(d.Dot) + return +} + +// MeasureBytes returns how far dot would advance by drawing s. +// +// It is equivalent to MeasureString(string(s)) but may be more efficient. +func (d *Drawer) MeasureBytes(s []byte) (advance fixed.Int26_6) { + return MeasureBytes(d.Face, s) +} + +// MeasureString returns how far dot would advance by drawing s. +func (d *Drawer) MeasureString(s string) (advance fixed.Int26_6) { + return MeasureString(d.Face, s) +} + +// BoundBytes returns the bounding box of s with f, drawn at a dot equal to the +// origin, as well as the advance. +// +// It is equivalent to BoundString(string(s)) but may be more efficient. +func BoundBytes(f Face, s []byte) (bounds fixed.Rectangle26_6, advance fixed.Int26_6) { + prevC := rune(-1) + for len(s) > 0 { + c, size := utf8.DecodeRune(s) + s = s[size:] + if prevC >= 0 { + advance += f.Kern(prevC, c) + } + b, a, ok := f.GlyphBounds(c) + if !ok { + // TODO: is falling back on the U+FFFD glyph the responsibility of + // the Drawer or the Face? + // TODO: set prevC = '\ufffd'? + continue + } + b.Min.X += advance + b.Max.X += advance + bounds = bounds.Union(b) + advance += a + prevC = c + } + return +} + +// BoundString returns the bounding box of s with f, drawn at a dot equal to the +// origin, as well as the advance. +func BoundString(f Face, s string) (bounds fixed.Rectangle26_6, advance fixed.Int26_6) { + prevC := rune(-1) + for _, c := range s { + if prevC >= 0 { + advance += f.Kern(prevC, c) + } + b, a, ok := f.GlyphBounds(c) + if !ok { + // TODO: is falling back on the U+FFFD glyph the responsibility of + // the Drawer or the Face? + // TODO: set prevC = '\ufffd'? + continue + } + b.Min.X += advance + b.Max.X += advance + bounds = bounds.Union(b) + advance += a + prevC = c + } + return +} + +// MeasureBytes returns how far dot would advance by drawing s with f. +// +// It is equivalent to MeasureString(string(s)) but may be more efficient. +func MeasureBytes(f Face, s []byte) (advance fixed.Int26_6) { + prevC := rune(-1) + for len(s) > 0 { + c, size := utf8.DecodeRune(s) + s = s[size:] + if prevC >= 0 { + advance += f.Kern(prevC, c) + } + a, ok := f.GlyphAdvance(c) + if !ok { + // TODO: is falling back on the U+FFFD glyph the responsibility of + // the Drawer or the Face? + // TODO: set prevC = '\ufffd'? + continue + } + advance += a + prevC = c + } + return advance +} + +// MeasureString returns how far dot would advance by drawing s with f. +func MeasureString(f Face, s string) (advance fixed.Int26_6) { + prevC := rune(-1) + for _, c := range s { + if prevC >= 0 { + advance += f.Kern(prevC, c) + } + a, ok := f.GlyphAdvance(c) + if !ok { + // TODO: is falling back on the U+FFFD glyph the responsibility of + // the Drawer or the Face? + // TODO: set prevC = '\ufffd'? + continue + } + advance += a + prevC = c + } + return advance +} + +// Hinting selects how to quantize a vector font's glyph nodes. +// +// Not all fonts support hinting. +type Hinting int + +const ( + HintingNone Hinting = iota + HintingVertical + HintingFull +) + +// Stretch selects a normal, condensed, or expanded face. +// +// Not all fonts support stretches. +type Stretch int + +const ( + StretchUltraCondensed Stretch = -4 + StretchExtraCondensed Stretch = -3 + StretchCondensed Stretch = -2 + StretchSemiCondensed Stretch = -1 + StretchNormal Stretch = +0 + StretchSemiExpanded Stretch = +1 + StretchExpanded Stretch = +2 + StretchExtraExpanded Stretch = +3 + StretchUltraExpanded Stretch = +4 +) + +// Style selects a normal, italic, or oblique face. +// +// Not all fonts support styles. +type Style int + +const ( + StyleNormal Style = iota + StyleItalic + StyleOblique +) + +// Weight selects a normal, light or bold face. +// +// Not all fonts support weights. +// +// The named Weight constants (e.g. WeightBold) correspond to CSS' common +// weight names (e.g. "Bold"), but the numerical values differ, so that in Go, +// the zero value means to use a normal weight. For the CSS names and values, +// see https://developer.mozilla.org/en/docs/Web/CSS/font-weight +type Weight int + +const ( + WeightThin Weight = -3 // CSS font-weight value 100. + WeightExtraLight Weight = -2 // CSS font-weight value 200. + WeightLight Weight = -1 // CSS font-weight value 300. + WeightNormal Weight = +0 // CSS font-weight value 400. + WeightMedium Weight = +1 // CSS font-weight value 500. + WeightSemiBold Weight = +2 // CSS font-weight value 600. + WeightBold Weight = +3 // CSS font-weight value 700. + WeightExtraBold Weight = +4 // CSS font-weight value 800. + WeightBlack Weight = +5 // CSS font-weight value 900. +) diff --git a/vendor/golang.org/x/image/math/fixed/fixed.go b/vendor/golang.org/x/image/math/fixed/fixed.go new file mode 100644 index 00000000..3d916638 --- /dev/null +++ b/vendor/golang.org/x/image/math/fixed/fixed.go @@ -0,0 +1,410 @@ +// 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. + +// Package fixed implements fixed-point integer types. +package fixed // import "golang.org/x/image/math/fixed" + +import ( + "fmt" +) + +// TODO: implement fmt.Formatter for %f and %g. + +// I returns the integer value i as an Int26_6. +// +// For example, passing the integer value 2 yields Int26_6(128). +func I(i int) Int26_6 { + return Int26_6(i << 6) +} + +// Int26_6 is a signed 26.6 fixed-point number. +// +// The integer part ranges from -33554432 to 33554431, inclusive. The +// fractional part has 6 bits of precision. +// +// For example, the number one-and-a-quarter is Int26_6(1<<6 + 1<<4). +type Int26_6 int32 + +// String returns a human-readable representation of a 26.6 fixed-point number. +// +// For example, the number one-and-a-quarter becomes "1:16". +func (x Int26_6) String() string { + const shift, mask = 6, 1<<6 - 1 + if x >= 0 { + return fmt.Sprintf("%d:%02d", int32(x>>shift), int32(x&mask)) + } + x = -x + if x >= 0 { + return fmt.Sprintf("-%d:%02d", int32(x>>shift), int32(x&mask)) + } + return "-33554432:00" // The minimum value is -(1<<25). +} + +// Floor returns the greatest integer value less than or equal to x. +// +// Its return type is int, not Int26_6. +func (x Int26_6) Floor() int { return int((x + 0x00) >> 6) } + +// Round returns the nearest integer value to x. Ties are rounded up. +// +// Its return type is int, not Int26_6. +func (x Int26_6) Round() int { return int((x + 0x20) >> 6) } + +// Ceil returns the least integer value greater than or equal to x. +// +// Its return type is int, not Int26_6. +func (x Int26_6) Ceil() int { return int((x + 0x3f) >> 6) } + +// Mul returns x*y in 26.6 fixed-point arithmetic. +func (x Int26_6) Mul(y Int26_6) Int26_6 { + return Int26_6((int64(x)*int64(y) + 1<<5) >> 6) +} + +// Int52_12 is a signed 52.12 fixed-point number. +// +// The integer part ranges from -2251799813685248 to 2251799813685247, +// inclusive. The fractional part has 12 bits of precision. +// +// For example, the number one-and-a-quarter is Int52_12(1<<12 + 1<<10). +type Int52_12 int64 + +// String returns a human-readable representation of a 52.12 fixed-point +// number. +// +// For example, the number one-and-a-quarter becomes "1:1024". +func (x Int52_12) String() string { + const shift, mask = 12, 1<<12 - 1 + if x >= 0 { + return fmt.Sprintf("%d:%04d", int64(x>>shift), int64(x&mask)) + } + x = -x + if x >= 0 { + return fmt.Sprintf("-%d:%04d", int64(x>>shift), int64(x&mask)) + } + return "-2251799813685248:0000" // The minimum value is -(1<<51). +} + +// Floor returns the greatest integer value less than or equal to x. +// +// Its return type is int, not Int52_12. +func (x Int52_12) Floor() int { return int((x + 0x000) >> 12) } + +// Round returns the nearest integer value to x. Ties are rounded up. +// +// Its return type is int, not Int52_12. +func (x Int52_12) Round() int { return int((x + 0x800) >> 12) } + +// Ceil returns the least integer value greater than or equal to x. +// +// Its return type is int, not Int52_12. +func (x Int52_12) Ceil() int { return int((x + 0xfff) >> 12) } + +// Mul returns x*y in 52.12 fixed-point arithmetic. +func (x Int52_12) Mul(y Int52_12) Int52_12 { + const M, N = 52, 12 + lo, hi := muli64(int64(x), int64(y)) + ret := Int52_12(hi<>N) + ret += Int52_12((lo >> (N - 1)) & 1) // Round to nearest, instead of rounding down. + return ret +} + +// muli64 multiplies two int64 values, returning the 128-bit signed integer +// result as two uint64 values. +// +// This implementation is similar to $GOROOT/src/runtime/softfloat64.go's mullu +// function, which is in turn adapted from Hacker's Delight. +func muli64(u, v int64) (lo, hi uint64) { + const ( + s = 32 + mask = 1<> s) + u0 := uint64(u & mask) + v1 := uint64(v >> s) + v0 := uint64(v & mask) + + w0 := u0 * v0 + t := u1*v0 + w0>>s + w1 := t & mask + w2 := uint64(int64(t) >> s) + w1 += u0 * v1 + return uint64(u) * uint64(v), u1*v1 + w2 + uint64(int64(w1)>>s) +} + +// P returns the integer values x and y as a Point26_6. +// +// For example, passing the integer values (2, -3) yields Point26_6{128, -192}. +func P(x, y int) Point26_6 { + return Point26_6{Int26_6(x << 6), Int26_6(y << 6)} +} + +// Point26_6 is a 26.6 fixed-point coordinate pair. +// +// It is analogous to the image.Point type in the standard library. +type Point26_6 struct { + X, Y Int26_6 +} + +// Add returns the vector p+q. +func (p Point26_6) Add(q Point26_6) Point26_6 { + return Point26_6{p.X + q.X, p.Y + q.Y} +} + +// Sub returns the vector p-q. +func (p Point26_6) Sub(q Point26_6) Point26_6 { + return Point26_6{p.X - q.X, p.Y - q.Y} +} + +// Mul returns the vector p*k. +func (p Point26_6) Mul(k Int26_6) Point26_6 { + return Point26_6{p.X * k / 64, p.Y * k / 64} +} + +// Div returns the vector p/k. +func (p Point26_6) Div(k Int26_6) Point26_6 { + return Point26_6{p.X * 64 / k, p.Y * 64 / k} +} + +// In returns whether p is in r. +func (p Point26_6) In(r Rectangle26_6) bool { + return r.Min.X <= p.X && p.X < r.Max.X && r.Min.Y <= p.Y && p.Y < r.Max.Y +} + +// Point52_12 is a 52.12 fixed-point coordinate pair. +// +// It is analogous to the image.Point type in the standard library. +type Point52_12 struct { + X, Y Int52_12 +} + +// Add returns the vector p+q. +func (p Point52_12) Add(q Point52_12) Point52_12 { + return Point52_12{p.X + q.X, p.Y + q.Y} +} + +// Sub returns the vector p-q. +func (p Point52_12) Sub(q Point52_12) Point52_12 { + return Point52_12{p.X - q.X, p.Y - q.Y} +} + +// Mul returns the vector p*k. +func (p Point52_12) Mul(k Int52_12) Point52_12 { + return Point52_12{p.X * k / 4096, p.Y * k / 4096} +} + +// Div returns the vector p/k. +func (p Point52_12) Div(k Int52_12) Point52_12 { + return Point52_12{p.X * 4096 / k, p.Y * 4096 / k} +} + +// In returns whether p is in r. +func (p Point52_12) In(r Rectangle52_12) bool { + return r.Min.X <= p.X && p.X < r.Max.X && r.Min.Y <= p.Y && p.Y < r.Max.Y +} + +// R returns the integer values minX, minY, maxX, maxY as a Rectangle26_6. +// +// For example, passing the integer values (0, 1, 2, 3) yields +// Rectangle26_6{Point26_6{0, 64}, Point26_6{128, 192}}. +// +// Like the image.Rect function in the standard library, the returned rectangle +// has minimum and maximum coordinates swapped if necessary so that it is +// well-formed. +func R(minX, minY, maxX, maxY int) Rectangle26_6 { + if minX > maxX { + minX, maxX = maxX, minX + } + if minY > maxY { + minY, maxY = maxY, minY + } + return Rectangle26_6{ + Point26_6{ + Int26_6(minX << 6), + Int26_6(minY << 6), + }, + Point26_6{ + Int26_6(maxX << 6), + Int26_6(maxY << 6), + }, + } +} + +// Rectangle26_6 is a 26.6 fixed-point coordinate rectangle. The Min bound is +// inclusive and the Max bound is exclusive. It is well-formed if Min.X <= +// Max.X and likewise for Y. +// +// It is analogous to the image.Rectangle type in the standard library. +type Rectangle26_6 struct { + Min, Max Point26_6 +} + +// Add returns the rectangle r translated by p. +func (r Rectangle26_6) Add(p Point26_6) Rectangle26_6 { + return Rectangle26_6{ + Point26_6{r.Min.X + p.X, r.Min.Y + p.Y}, + Point26_6{r.Max.X + p.X, r.Max.Y + p.Y}, + } +} + +// Sub returns the rectangle r translated by -p. +func (r Rectangle26_6) Sub(p Point26_6) Rectangle26_6 { + return Rectangle26_6{ + Point26_6{r.Min.X - p.X, r.Min.Y - p.Y}, + Point26_6{r.Max.X - p.X, r.Max.Y - p.Y}, + } +} + +// Intersect returns the largest rectangle contained by both r and s. If the +// two rectangles do not overlap then the zero rectangle will be returned. +func (r Rectangle26_6) Intersect(s Rectangle26_6) Rectangle26_6 { + if r.Min.X < s.Min.X { + r.Min.X = s.Min.X + } + if r.Min.Y < s.Min.Y { + r.Min.Y = s.Min.Y + } + if r.Max.X > s.Max.X { + r.Max.X = s.Max.X + } + if r.Max.Y > s.Max.Y { + r.Max.Y = s.Max.Y + } + // Letting r0 and s0 be the values of r and s at the time that the method + // is called, this next line is equivalent to: + // + // if max(r0.Min.X, s0.Min.X) >= min(r0.Max.X, s0.Max.X) || likewiseForY { etc } + if r.Empty() { + return Rectangle26_6{} + } + return r +} + +// Union returns the smallest rectangle that contains both r and s. +func (r Rectangle26_6) Union(s Rectangle26_6) Rectangle26_6 { + if r.Empty() { + return s + } + if s.Empty() { + return r + } + if r.Min.X > s.Min.X { + r.Min.X = s.Min.X + } + if r.Min.Y > s.Min.Y { + r.Min.Y = s.Min.Y + } + if r.Max.X < s.Max.X { + r.Max.X = s.Max.X + } + if r.Max.Y < s.Max.Y { + r.Max.Y = s.Max.Y + } + return r +} + +// Empty returns whether the rectangle contains no points. +func (r Rectangle26_6) Empty() bool { + return r.Min.X >= r.Max.X || r.Min.Y >= r.Max.Y +} + +// In returns whether every point in r is in s. +func (r Rectangle26_6) In(s Rectangle26_6) bool { + if r.Empty() { + return true + } + // Note that r.Max is an exclusive bound for r, so that r.In(s) + // does not require that r.Max.In(s). + return s.Min.X <= r.Min.X && r.Max.X <= s.Max.X && + s.Min.Y <= r.Min.Y && r.Max.Y <= s.Max.Y +} + +// Rectangle52_12 is a 52.12 fixed-point coordinate rectangle. The Min bound is +// inclusive and the Max bound is exclusive. It is well-formed if Min.X <= +// Max.X and likewise for Y. +// +// It is analogous to the image.Rectangle type in the standard library. +type Rectangle52_12 struct { + Min, Max Point52_12 +} + +// Add returns the rectangle r translated by p. +func (r Rectangle52_12) Add(p Point52_12) Rectangle52_12 { + return Rectangle52_12{ + Point52_12{r.Min.X + p.X, r.Min.Y + p.Y}, + Point52_12{r.Max.X + p.X, r.Max.Y + p.Y}, + } +} + +// Sub returns the rectangle r translated by -p. +func (r Rectangle52_12) Sub(p Point52_12) Rectangle52_12 { + return Rectangle52_12{ + Point52_12{r.Min.X - p.X, r.Min.Y - p.Y}, + Point52_12{r.Max.X - p.X, r.Max.Y - p.Y}, + } +} + +// Intersect returns the largest rectangle contained by both r and s. If the +// two rectangles do not overlap then the zero rectangle will be returned. +func (r Rectangle52_12) Intersect(s Rectangle52_12) Rectangle52_12 { + if r.Min.X < s.Min.X { + r.Min.X = s.Min.X + } + if r.Min.Y < s.Min.Y { + r.Min.Y = s.Min.Y + } + if r.Max.X > s.Max.X { + r.Max.X = s.Max.X + } + if r.Max.Y > s.Max.Y { + r.Max.Y = s.Max.Y + } + // Letting r0 and s0 be the values of r and s at the time that the method + // is called, this next line is equivalent to: + // + // if max(r0.Min.X, s0.Min.X) >= min(r0.Max.X, s0.Max.X) || likewiseForY { etc } + if r.Empty() { + return Rectangle52_12{} + } + return r +} + +// Union returns the smallest rectangle that contains both r and s. +func (r Rectangle52_12) Union(s Rectangle52_12) Rectangle52_12 { + if r.Empty() { + return s + } + if s.Empty() { + return r + } + if r.Min.X > s.Min.X { + r.Min.X = s.Min.X + } + if r.Min.Y > s.Min.Y { + r.Min.Y = s.Min.Y + } + if r.Max.X < s.Max.X { + r.Max.X = s.Max.X + } + if r.Max.Y < s.Max.Y { + r.Max.Y = s.Max.Y + } + return r +} + +// Empty returns whether the rectangle contains no points. +func (r Rectangle52_12) Empty() bool { + return r.Min.X >= r.Max.X || r.Min.Y >= r.Max.Y +} + +// In returns whether every point in r is in s. +func (r Rectangle52_12) In(s Rectangle52_12) bool { + if r.Empty() { + return true + } + // Note that r.Max is an exclusive bound for r, so that r.In(s) + // does not require that r.Max.In(s). + return s.Min.X <= r.Min.X && r.Max.X <= s.Max.X && + s.Min.Y <= r.Min.Y && r.Max.Y <= s.Max.Y +} diff --git a/vendor/golang.org/x/lint/.travis.yml b/vendor/golang.org/x/lint/.travis.yml new file mode 100644 index 00000000..50553ebd --- /dev/null +++ b/vendor/golang.org/x/lint/.travis.yml @@ -0,0 +1,19 @@ +sudo: false +language: go +go: + - 1.10.x + - 1.11.x + - master + +go_import_path: golang.org/x/lint + +install: + - go get -t -v ./... + +script: + - go test -v -race ./... + +matrix: + allow_failures: + - go: master + fast_finish: true diff --git a/vendor/golang.org/x/lint/CONTRIBUTING.md b/vendor/golang.org/x/lint/CONTRIBUTING.md new file mode 100644 index 00000000..1fadda62 --- /dev/null +++ b/vendor/golang.org/x/lint/CONTRIBUTING.md @@ -0,0 +1,15 @@ +# Contributing to Golint + +## Before filing an issue: + +### Are you having trouble building golint? + +Check you have the latest version of its dependencies. Run +``` +go get -u golang.org/x/lint/golint +``` +If you still have problems, consider searching for existing issues before filing a new issue. + +## Before sending a pull request: + +Have you understood the purpose of golint? Make sure to carefully read `README`. diff --git a/vendor/golang.org/x/lint/LICENSE b/vendor/golang.org/x/lint/LICENSE new file mode 100644 index 00000000..65d761bc --- /dev/null +++ b/vendor/golang.org/x/lint/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2013 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/lint/README.md b/vendor/golang.org/x/lint/README.md new file mode 100644 index 00000000..4968b13a --- /dev/null +++ b/vendor/golang.org/x/lint/README.md @@ -0,0 +1,88 @@ +Golint is a linter for Go source code. + +[![Build Status](https://travis-ci.org/golang/lint.svg?branch=master)](https://travis-ci.org/golang/lint) + +## Installation + +Golint requires a +[supported release of Go](https://golang.org/doc/devel/release.html#policy). + + go get -u golang.org/x/lint/golint + +To find out where `golint` was installed you can run `go list -f {{.Target}} golang.org/x/lint/golint`. For `golint` to be used globally add that directory to the `$PATH` environment setting. + +## Usage + +Invoke `golint` with one or more filenames, directories, or packages named +by its import path. Golint uses the same +[import path syntax](https://golang.org/cmd/go/#hdr-Import_path_syntax) as +the `go` command and therefore +also supports relative import paths like `./...`. Additionally the `...` +wildcard can be used as suffix on relative and absolute file paths to recurse +into them. + +The output of this tool is a list of suggestions in Vim quickfix format, +which is accepted by lots of different editors. + +## Purpose + +Golint differs from gofmt. Gofmt reformats Go source code, whereas +golint prints out style mistakes. + +Golint differs from govet. Govet is concerned with correctness, whereas +golint is concerned with coding style. Golint is in use at Google, and it +seeks to match the accepted style of the open source Go project. + +The suggestions made by golint are exactly that: suggestions. +Golint is not perfect, and has both false positives and false negatives. +Do not treat its output as a gold standard. We will not be adding pragmas +or other knobs to suppress specific warnings, so do not expect or require +code to be completely "lint-free". +In short, this tool is not, and will never be, trustworthy enough for its +suggestions to be enforced automatically, for example as part of a build process. +Golint makes suggestions for many of the mechanically checkable items listed in +[Effective Go](https://golang.org/doc/effective_go.html) and the +[CodeReviewComments wiki page](https://golang.org/wiki/CodeReviewComments). + +## Scope + +Golint is meant to carry out the stylistic conventions put forth in +[Effective Go](https://golang.org/doc/effective_go.html) and +[CodeReviewComments](https://golang.org/wiki/CodeReviewComments). +Changes that are not aligned with those documents will not be considered. + +## Contributions + +Contributions to this project are welcome provided they are [in scope](#scope), +though please send mail before starting work on anything major. +Contributors retain their copyright, so we need you to fill out +[a short form](https://developers.google.com/open-source/cla/individual) +before we can accept your contribution. + +## Vim + +Add this to your ~/.vimrc: + + set rtp+=$GOPATH/src/golang.org/x/lint/misc/vim + +If you have multiple entries in your GOPATH, replace `$GOPATH` with the right value. + +Running `:Lint` will run golint on the current file and populate the quickfix list. + +Optionally, add this to your `~/.vimrc` to automatically run `golint` on `:w` + + autocmd BufWritePost,FileWritePost *.go execute 'Lint' | cwindow + + +## Emacs + +Add this to your `.emacs` file: + + (add-to-list 'load-path (concat (getenv "GOPATH") "/src/golang.org/x/lint/misc/emacs/")) + (require 'golint) + +If you have multiple entries in your GOPATH, replace `$GOPATH` with the right value. + +Running M-x golint will run golint on the current file. + +For more usage, see [Compilation-Mode](http://www.gnu.org/software/emacs/manual/html_node/emacs/Compilation-Mode.html). diff --git a/vendor/golang.org/x/lint/go.mod b/vendor/golang.org/x/lint/go.mod new file mode 100644 index 00000000..44179f3a --- /dev/null +++ b/vendor/golang.org/x/lint/go.mod @@ -0,0 +1,5 @@ +module golang.org/x/lint + +go 1.11 + +require golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f diff --git a/vendor/golang.org/x/lint/go.sum b/vendor/golang.org/x/lint/go.sum new file mode 100644 index 00000000..539c98a9 --- /dev/null +++ b/vendor/golang.org/x/lint/go.sum @@ -0,0 +1,8 @@ +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f h1:kDxGY2VmgABOe55qheT/TFqUMtcTHnomIPS1iv3G4Ms= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/vendor/golang.org/x/lint/golint/golint.go b/vendor/golang.org/x/lint/golint/golint.go new file mode 100644 index 00000000..ac024b6d --- /dev/null +++ b/vendor/golang.org/x/lint/golint/golint.go @@ -0,0 +1,159 @@ +// Copyright (c) 2013 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 or at +// https://developers.google.com/open-source/licenses/bsd. + +// golint lints the Go source files named on its command line. +package main + +import ( + "flag" + "fmt" + "go/build" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "golang.org/x/lint" +) + +var ( + minConfidence = flag.Float64("min_confidence", 0.8, "minimum confidence of a problem to print it") + setExitStatus = flag.Bool("set_exit_status", false, "set exit status to 1 if any issues are found") + suggestions int +) + +func usage() { + fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "\tgolint [flags] # runs on package in current directory\n") + fmt.Fprintf(os.Stderr, "\tgolint [flags] [packages]\n") + fmt.Fprintf(os.Stderr, "\tgolint [flags] [directories] # where a '/...' suffix includes all sub-directories\n") + fmt.Fprintf(os.Stderr, "\tgolint [flags] [files] # all must belong to a single package\n") + fmt.Fprintf(os.Stderr, "Flags:\n") + flag.PrintDefaults() +} + +func main() { + flag.Usage = usage + flag.Parse() + + if flag.NArg() == 0 { + lintDir(".") + } else { + // dirsRun, filesRun, and pkgsRun indicate whether golint is applied to + // directory, file or package targets. The distinction affects which + // checks are run. It is no valid to mix target types. + var dirsRun, filesRun, pkgsRun int + var args []string + for _, arg := range flag.Args() { + if strings.HasSuffix(arg, "/...") && isDir(arg[:len(arg)-len("/...")]) { + dirsRun = 1 + for _, dirname := range allPackagesInFS(arg) { + args = append(args, dirname) + } + } else if isDir(arg) { + dirsRun = 1 + args = append(args, arg) + } else if exists(arg) { + filesRun = 1 + args = append(args, arg) + } else { + pkgsRun = 1 + args = append(args, arg) + } + } + + if dirsRun+filesRun+pkgsRun != 1 { + usage() + os.Exit(2) + } + switch { + case dirsRun == 1: + for _, dir := range args { + lintDir(dir) + } + case filesRun == 1: + lintFiles(args...) + case pkgsRun == 1: + for _, pkg := range importPaths(args) { + lintPackage(pkg) + } + } + } + + if *setExitStatus && suggestions > 0 { + fmt.Fprintf(os.Stderr, "Found %d lint suggestions; failing.\n", suggestions) + os.Exit(1) + } +} + +func isDir(filename string) bool { + fi, err := os.Stat(filename) + return err == nil && fi.IsDir() +} + +func exists(filename string) bool { + _, err := os.Stat(filename) + return err == nil +} + +func lintFiles(filenames ...string) { + files := make(map[string][]byte) + for _, filename := range filenames { + src, err := ioutil.ReadFile(filename) + if err != nil { + fmt.Fprintln(os.Stderr, err) + continue + } + files[filename] = src + } + + l := new(lint.Linter) + ps, err := l.LintFiles(files) + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + return + } + for _, p := range ps { + if p.Confidence >= *minConfidence { + fmt.Printf("%v: %s\n", p.Position, p.Text) + suggestions++ + } + } +} + +func lintDir(dirname string) { + pkg, err := build.ImportDir(dirname, 0) + lintImportedPackage(pkg, err) +} + +func lintPackage(pkgname string) { + pkg, err := build.Import(pkgname, ".", 0) + lintImportedPackage(pkg, err) +} + +func lintImportedPackage(pkg *build.Package, err error) { + if err != nil { + if _, nogo := err.(*build.NoGoError); nogo { + // Don't complain if the failure is due to no Go source files. + return + } + fmt.Fprintln(os.Stderr, err) + return + } + + var files []string + files = append(files, pkg.GoFiles...) + files = append(files, pkg.CgoFiles...) + files = append(files, pkg.TestGoFiles...) + if pkg.Dir != "." { + for i, f := range files { + files[i] = filepath.Join(pkg.Dir, f) + } + } + // TODO(dsymonds): Do foo_test too (pkg.XTestGoFiles) + + lintFiles(files...) +} diff --git a/vendor/golang.org/x/lint/golint/import.go b/vendor/golang.org/x/lint/golint/import.go new file mode 100644 index 00000000..2ba9dea7 --- /dev/null +++ b/vendor/golang.org/x/lint/golint/import.go @@ -0,0 +1,309 @@ +package main + +/* + +This file holds a direct copy of the import path matching code of +https://github.com/golang/go/blob/master/src/cmd/go/main.go. It can be +replaced when https://golang.org/issue/8768 is resolved. + +It has been updated to follow upstream changes in a few ways. + +*/ + +import ( + "fmt" + "go/build" + "log" + "os" + "path" + "path/filepath" + "regexp" + "runtime" + "strings" +) + +var ( + buildContext = build.Default + goroot = filepath.Clean(runtime.GOROOT()) + gorootSrc = filepath.Join(goroot, "src") +) + +// importPathsNoDotExpansion returns the import paths to use for the given +// command line, but it does no ... expansion. +func importPathsNoDotExpansion(args []string) []string { + if len(args) == 0 { + return []string{"."} + } + var out []string + for _, a := range args { + // Arguments are supposed to be import paths, but + // as a courtesy to Windows developers, rewrite \ to / + // in command-line arguments. Handles .\... and so on. + if filepath.Separator == '\\' { + a = strings.Replace(a, `\`, `/`, -1) + } + + // Put argument in canonical form, but preserve leading ./. + if strings.HasPrefix(a, "./") { + a = "./" + path.Clean(a) + if a == "./." { + a = "." + } + } else { + a = path.Clean(a) + } + if a == "all" || a == "std" { + out = append(out, allPackages(a)...) + continue + } + out = append(out, a) + } + return out +} + +// importPaths returns the import paths to use for the given command line. +func importPaths(args []string) []string { + args = importPathsNoDotExpansion(args) + var out []string + for _, a := range args { + if strings.Contains(a, "...") { + if build.IsLocalImport(a) { + out = append(out, allPackagesInFS(a)...) + } else { + out = append(out, allPackages(a)...) + } + continue + } + out = append(out, a) + } + return out +} + +// matchPattern(pattern)(name) reports whether +// name matches pattern. Pattern is a limited glob +// pattern in which '...' means 'any string' and there +// is no other special syntax. +func matchPattern(pattern string) func(name string) bool { + re := regexp.QuoteMeta(pattern) + re = strings.Replace(re, `\.\.\.`, `.*`, -1) + // Special case: foo/... matches foo too. + if strings.HasSuffix(re, `/.*`) { + re = re[:len(re)-len(`/.*`)] + `(/.*)?` + } + reg := regexp.MustCompile(`^` + re + `$`) + return func(name string) bool { + return reg.MatchString(name) + } +} + +// hasPathPrefix reports whether the path s begins with the +// elements in prefix. +func hasPathPrefix(s, prefix string) bool { + switch { + default: + return false + case len(s) == len(prefix): + return s == prefix + case len(s) > len(prefix): + if prefix != "" && prefix[len(prefix)-1] == '/' { + return strings.HasPrefix(s, prefix) + } + return s[len(prefix)] == '/' && s[:len(prefix)] == prefix + } +} + +// treeCanMatchPattern(pattern)(name) reports whether +// name or children of name can possibly match pattern. +// Pattern is the same limited glob accepted by matchPattern. +func treeCanMatchPattern(pattern string) func(name string) bool { + wildCard := false + if i := strings.Index(pattern, "..."); i >= 0 { + wildCard = true + pattern = pattern[:i] + } + return func(name string) bool { + return len(name) <= len(pattern) && hasPathPrefix(pattern, name) || + wildCard && strings.HasPrefix(name, pattern) + } +} + +// allPackages returns all the packages that can be found +// under the $GOPATH directories and $GOROOT matching pattern. +// The pattern is either "all" (all packages), "std" (standard packages) +// or a path including "...". +func allPackages(pattern string) []string { + pkgs := matchPackages(pattern) + if len(pkgs) == 0 { + fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern) + } + return pkgs +} + +func matchPackages(pattern string) []string { + match := func(string) bool { return true } + treeCanMatch := func(string) bool { return true } + if pattern != "all" && pattern != "std" { + match = matchPattern(pattern) + treeCanMatch = treeCanMatchPattern(pattern) + } + + have := map[string]bool{ + "builtin": true, // ignore pseudo-package that exists only for documentation + } + if !buildContext.CgoEnabled { + have["runtime/cgo"] = true // ignore during walk + } + var pkgs []string + + // Commands + cmd := filepath.Join(goroot, "src/cmd") + string(filepath.Separator) + filepath.Walk(cmd, func(path string, fi os.FileInfo, err error) error { + if err != nil || !fi.IsDir() || path == cmd { + return nil + } + name := path[len(cmd):] + if !treeCanMatch(name) { + return filepath.SkipDir + } + // Commands are all in cmd/, not in subdirectories. + if strings.Contains(name, string(filepath.Separator)) { + return filepath.SkipDir + } + + // We use, e.g., cmd/gofmt as the pseudo import path for gofmt. + name = "cmd/" + name + if have[name] { + return nil + } + have[name] = true + if !match(name) { + return nil + } + _, err = buildContext.ImportDir(path, 0) + if err != nil { + if _, noGo := err.(*build.NoGoError); !noGo { + log.Print(err) + } + return nil + } + pkgs = append(pkgs, name) + return nil + }) + + for _, src := range buildContext.SrcDirs() { + if (pattern == "std" || pattern == "cmd") && src != gorootSrc { + continue + } + src = filepath.Clean(src) + string(filepath.Separator) + root := src + if pattern == "cmd" { + root += "cmd" + string(filepath.Separator) + } + filepath.Walk(root, func(path string, fi os.FileInfo, err error) error { + if err != nil || !fi.IsDir() || path == src { + return nil + } + + // Avoid .foo, _foo, and testdata directory trees. + _, elem := filepath.Split(path) + if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" { + return filepath.SkipDir + } + + name := filepath.ToSlash(path[len(src):]) + if pattern == "std" && (strings.Contains(name, ".") || name == "cmd") { + // The name "std" is only the standard library. + // If the name is cmd, it's the root of the command tree. + return filepath.SkipDir + } + if !treeCanMatch(name) { + return filepath.SkipDir + } + if have[name] { + return nil + } + have[name] = true + if !match(name) { + return nil + } + _, err = buildContext.ImportDir(path, 0) + if err != nil { + if _, noGo := err.(*build.NoGoError); noGo { + return nil + } + } + pkgs = append(pkgs, name) + return nil + }) + } + return pkgs +} + +// allPackagesInFS is like allPackages but is passed a pattern +// beginning ./ or ../, meaning it should scan the tree rooted +// at the given directory. There are ... in the pattern too. +func allPackagesInFS(pattern string) []string { + pkgs := matchPackagesInFS(pattern) + if len(pkgs) == 0 { + fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern) + } + return pkgs +} + +func matchPackagesInFS(pattern string) []string { + // Find directory to begin the scan. + // Could be smarter but this one optimization + // is enough for now, since ... is usually at the + // end of a path. + i := strings.Index(pattern, "...") + dir, _ := path.Split(pattern[:i]) + + // pattern begins with ./ or ../. + // path.Clean will discard the ./ but not the ../. + // We need to preserve the ./ for pattern matching + // and in the returned import paths. + prefix := "" + if strings.HasPrefix(pattern, "./") { + prefix = "./" + } + match := matchPattern(pattern) + + var pkgs []string + filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error { + if err != nil || !fi.IsDir() { + return nil + } + if path == dir { + // filepath.Walk starts at dir and recurses. For the recursive case, + // the path is the result of filepath.Join, which calls filepath.Clean. + // The initial case is not Cleaned, though, so we do this explicitly. + // + // This converts a path like "./io/" to "io". Without this step, running + // "cd $GOROOT/src/pkg; go list ./io/..." would incorrectly skip the io + // package, because prepending the prefix "./" to the unclean path would + // result in "././io", and match("././io") returns false. + path = filepath.Clean(path) + } + + // Avoid .foo, _foo, and testdata directory trees, but do not avoid "." or "..". + _, elem := filepath.Split(path) + dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".." + if dot || strings.HasPrefix(elem, "_") || elem == "testdata" { + return filepath.SkipDir + } + + name := prefix + filepath.ToSlash(path) + if !match(name) { + return nil + } + if _, err = build.ImportDir(path, 0); err != nil { + if _, noGo := err.(*build.NoGoError); !noGo { + log.Print(err) + } + return nil + } + pkgs = append(pkgs, name) + return nil + }) + return pkgs +} diff --git a/vendor/golang.org/x/lint/golint/importcomment.go b/vendor/golang.org/x/lint/golint/importcomment.go new file mode 100644 index 00000000..d5b32f73 --- /dev/null +++ b/vendor/golang.org/x/lint/golint/importcomment.go @@ -0,0 +1,13 @@ +// Copyright (c) 2018 The Go Authors. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file or at +// https://developers.google.com/open-source/licenses/bsd. + +// +build go1.12 + +// Require use of the correct import path only for Go 1.12+ users, so +// any breakages coincide with people updating their CI configs or +// whatnot. + +package main // import "golang.org/x/lint/golint" diff --git a/vendor/golang.org/x/lint/lint.go b/vendor/golang.org/x/lint/lint.go new file mode 100644 index 00000000..532a75ad --- /dev/null +++ b/vendor/golang.org/x/lint/lint.go @@ -0,0 +1,1614 @@ +// Copyright (c) 2013 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 or at +// https://developers.google.com/open-source/licenses/bsd. + +// Package lint contains a linter for Go source code. +package lint // import "golang.org/x/lint" + +import ( + "bufio" + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/printer" + "go/token" + "go/types" + "regexp" + "sort" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/gcexportdata" +) + +const styleGuideBase = "https://golang.org/wiki/CodeReviewComments" + +// A Linter lints Go source code. +type Linter struct { +} + +// Problem represents a problem in some source code. +type Problem struct { + Position token.Position // position in source file + Text string // the prose that describes the problem + Link string // (optional) the link to the style guide for the problem + Confidence float64 // a value in (0,1] estimating the confidence in this problem's correctness + LineText string // the source line + Category string // a short name for the general category of the problem + + // If the problem has a suggested fix (the minority case), + // ReplacementLine is a full replacement for the relevant line of the source file. + ReplacementLine string +} + +func (p *Problem) String() string { + if p.Link != "" { + return p.Text + "\n\n" + p.Link + } + return p.Text +} + +type byPosition []Problem + +func (p byPosition) Len() int { return len(p) } +func (p byPosition) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +func (p byPosition) Less(i, j int) bool { + pi, pj := p[i].Position, p[j].Position + + if pi.Filename != pj.Filename { + return pi.Filename < pj.Filename + } + if pi.Line != pj.Line { + return pi.Line < pj.Line + } + if pi.Column != pj.Column { + return pi.Column < pj.Column + } + + return p[i].Text < p[j].Text +} + +// Lint lints src. +func (l *Linter) Lint(filename string, src []byte) ([]Problem, error) { + return l.LintFiles(map[string][]byte{filename: src}) +} + +// LintFiles lints a set of files of a single package. +// The argument is a map of filename to source. +func (l *Linter) LintFiles(files map[string][]byte) ([]Problem, error) { + pkg := &pkg{ + fset: token.NewFileSet(), + files: make(map[string]*file), + } + var pkgName string + for filename, src := range files { + if isGenerated(src) { + continue // See issue #239 + } + f, err := parser.ParseFile(pkg.fset, filename, src, parser.ParseComments) + if err != nil { + return nil, err + } + if pkgName == "" { + pkgName = f.Name.Name + } else if f.Name.Name != pkgName { + return nil, fmt.Errorf("%s is in package %s, not %s", filename, f.Name.Name, pkgName) + } + pkg.files[filename] = &file{ + pkg: pkg, + f: f, + fset: pkg.fset, + src: src, + filename: filename, + } + } + if len(pkg.files) == 0 { + return nil, nil + } + return pkg.lint(), nil +} + +var ( + genHdr = []byte("// Code generated ") + genFtr = []byte(" DO NOT EDIT.") +) + +// isGenerated reports whether the source file is generated code +// according the rules from https://golang.org/s/generatedcode. +func isGenerated(src []byte) bool { + sc := bufio.NewScanner(bytes.NewReader(src)) + for sc.Scan() { + b := sc.Bytes() + if bytes.HasPrefix(b, genHdr) && bytes.HasSuffix(b, genFtr) && len(b) >= len(genHdr)+len(genFtr) { + return true + } + } + return false +} + +// pkg represents a package being linted. +type pkg struct { + fset *token.FileSet + files map[string]*file + + typesPkg *types.Package + typesInfo *types.Info + + // sortable is the set of types in the package that implement sort.Interface. + sortable map[string]bool + // main is whether this is a "main" package. + main bool + + problems []Problem +} + +func (p *pkg) lint() []Problem { + if err := p.typeCheck(); err != nil { + /* TODO(dsymonds): Consider reporting these errors when golint operates on entire packages. + if e, ok := err.(types.Error); ok { + pos := p.fset.Position(e.Pos) + conf := 1.0 + if strings.Contains(e.Msg, "can't find import: ") { + // Golint is probably being run in a context that doesn't support + // typechecking (e.g. package files aren't found), so don't warn about it. + conf = 0 + } + if conf > 0 { + p.errorfAt(pos, conf, category("typechecking"), e.Msg) + } + + // TODO(dsymonds): Abort if !e.Soft? + } + */ + } + + p.scanSortable() + p.main = p.isMain() + + for _, f := range p.files { + f.lint() + } + + sort.Sort(byPosition(p.problems)) + + return p.problems +} + +// file represents a file being linted. +type file struct { + pkg *pkg + f *ast.File + fset *token.FileSet + src []byte + filename string +} + +func (f *file) isTest() bool { return strings.HasSuffix(f.filename, "_test.go") } + +func (f *file) lint() { + f.lintPackageComment() + f.lintImports() + f.lintBlankImports() + f.lintExported() + f.lintNames() + f.lintElses() + f.lintRanges() + f.lintErrorf() + f.lintErrors() + f.lintErrorStrings() + f.lintReceiverNames() + f.lintIncDec() + f.lintErrorReturn() + f.lintUnexportedReturn() + f.lintTimeNames() + f.lintContextKeyTypes() + f.lintContextArgs() +} + +type link string +type category string + +// The variadic arguments may start with link and category types, +// and must end with a format string and any arguments. +// It returns the new Problem. +func (f *file) errorf(n ast.Node, confidence float64, args ...interface{}) *Problem { + pos := f.fset.Position(n.Pos()) + if pos.Filename == "" { + pos.Filename = f.filename + } + return f.pkg.errorfAt(pos, confidence, args...) +} + +func (p *pkg) errorfAt(pos token.Position, confidence float64, args ...interface{}) *Problem { + problem := Problem{ + Position: pos, + Confidence: confidence, + } + if pos.Filename != "" { + // The file might not exist in our mapping if a //line directive was encountered. + if f, ok := p.files[pos.Filename]; ok { + problem.LineText = srcLine(f.src, pos) + } + } + +argLoop: + for len(args) > 1 { // always leave at least the format string in args + switch v := args[0].(type) { + case link: + problem.Link = string(v) + case category: + problem.Category = string(v) + default: + break argLoop + } + args = args[1:] + } + + problem.Text = fmt.Sprintf(args[0].(string), args[1:]...) + + p.problems = append(p.problems, problem) + return &p.problems[len(p.problems)-1] +} + +var newImporter = func(fset *token.FileSet) types.ImporterFrom { + return gcexportdata.NewImporter(fset, make(map[string]*types.Package)) +} + +func (p *pkg) typeCheck() error { + config := &types.Config{ + // By setting a no-op error reporter, the type checker does as much work as possible. + Error: func(error) {}, + Importer: newImporter(p.fset), + } + info := &types.Info{ + Types: make(map[ast.Expr]types.TypeAndValue), + Defs: make(map[*ast.Ident]types.Object), + Uses: make(map[*ast.Ident]types.Object), + Scopes: make(map[ast.Node]*types.Scope), + } + var anyFile *file + var astFiles []*ast.File + for _, f := range p.files { + anyFile = f + astFiles = append(astFiles, f.f) + } + pkg, err := config.Check(anyFile.f.Name.Name, p.fset, astFiles, info) + // Remember the typechecking info, even if config.Check failed, + // since we will get partial information. + p.typesPkg = pkg + p.typesInfo = info + return err +} + +func (p *pkg) typeOf(expr ast.Expr) types.Type { + if p.typesInfo == nil { + return nil + } + return p.typesInfo.TypeOf(expr) +} + +func (p *pkg) isNamedType(typ types.Type, importPath, name string) bool { + n, ok := typ.(*types.Named) + if !ok { + return false + } + tn := n.Obj() + return tn != nil && tn.Pkg() != nil && tn.Pkg().Path() == importPath && tn.Name() == name +} + +// scopeOf returns the tightest scope encompassing id. +func (p *pkg) scopeOf(id *ast.Ident) *types.Scope { + var scope *types.Scope + if obj := p.typesInfo.ObjectOf(id); obj != nil { + scope = obj.Parent() + } + if scope == p.typesPkg.Scope() { + // We were given a top-level identifier. + // Use the file-level scope instead of the package-level scope. + pos := id.Pos() + for _, f := range p.files { + if f.f.Pos() <= pos && pos < f.f.End() { + scope = p.typesInfo.Scopes[f.f] + break + } + } + } + return scope +} + +func (p *pkg) scanSortable() { + p.sortable = make(map[string]bool) + + // bitfield for which methods exist on each type. + const ( + Len = 1 << iota + Less + Swap + ) + nmap := map[string]int{"Len": Len, "Less": Less, "Swap": Swap} + has := make(map[string]int) + for _, f := range p.files { + f.walk(func(n ast.Node) bool { + fn, ok := n.(*ast.FuncDecl) + if !ok || fn.Recv == nil || len(fn.Recv.List) == 0 { + return true + } + // TODO(dsymonds): We could check the signature to be more precise. + recv := receiverType(fn) + if i, ok := nmap[fn.Name.Name]; ok { + has[recv] |= i + } + return false + }) + } + for typ, ms := range has { + if ms == Len|Less|Swap { + p.sortable[typ] = true + } + } +} + +func (p *pkg) isMain() bool { + for _, f := range p.files { + if f.isMain() { + return true + } + } + return false +} + +func (f *file) isMain() bool { + if f.f.Name.Name == "main" { + return true + } + return false +} + +// lintPackageComment checks package comments. It complains if +// there is no package comment, or if it is not of the right form. +// This has a notable false positive in that a package comment +// could rightfully appear in a different file of the same package, +// but that's not easy to fix since this linter is file-oriented. +func (f *file) lintPackageComment() { + if f.isTest() { + return + } + + const ref = styleGuideBase + "#package-comments" + prefix := "Package " + f.f.Name.Name + " " + + // Look for a detached package comment. + // First, scan for the last comment that occurs before the "package" keyword. + var lastCG *ast.CommentGroup + for _, cg := range f.f.Comments { + if cg.Pos() > f.f.Package { + // Gone past "package" keyword. + break + } + lastCG = cg + } + if lastCG != nil && strings.HasPrefix(lastCG.Text(), prefix) { + endPos := f.fset.Position(lastCG.End()) + pkgPos := f.fset.Position(f.f.Package) + if endPos.Line+1 < pkgPos.Line { + // There isn't a great place to anchor this error; + // the start of the blank lines between the doc and the package statement + // is at least pointing at the location of the problem. + pos := token.Position{ + Filename: endPos.Filename, + // Offset not set; it is non-trivial, and doesn't appear to be needed. + Line: endPos.Line + 1, + Column: 1, + } + f.pkg.errorfAt(pos, 0.9, link(ref), category("comments"), "package comment is detached; there should be no blank lines between it and the package statement") + return + } + } + + if f.f.Doc == nil { + f.errorf(f.f, 0.2, link(ref), category("comments"), "should have a package comment, unless it's in another file for this package") + return + } + s := f.f.Doc.Text() + if ts := strings.TrimLeft(s, " \t"); ts != s { + f.errorf(f.f.Doc, 1, link(ref), category("comments"), "package comment should not have leading space") + s = ts + } + // Only non-main packages need to keep to this form. + if !f.pkg.main && !strings.HasPrefix(s, prefix) { + f.errorf(f.f.Doc, 1, link(ref), category("comments"), `package comment should be of the form "%s..."`, prefix) + } +} + +// lintBlankImports complains if a non-main package has blank imports that are +// not documented. +func (f *file) lintBlankImports() { + // In package main and in tests, we don't complain about blank imports. + if f.pkg.main || f.isTest() { + return + } + + // The first element of each contiguous group of blank imports should have + // an explanatory comment of some kind. + for i, imp := range f.f.Imports { + pos := f.fset.Position(imp.Pos()) + + if !isBlank(imp.Name) { + continue // Ignore non-blank imports. + } + if i > 0 { + prev := f.f.Imports[i-1] + prevPos := f.fset.Position(prev.Pos()) + if isBlank(prev.Name) && prevPos.Line+1 == pos.Line { + continue // A subsequent blank in a group. + } + } + + // This is the first blank import of a group. + if imp.Doc == nil && imp.Comment == nil { + ref := "" + f.errorf(imp, 1, link(ref), category("imports"), "a blank import should be only in a main or test package, or have a comment justifying it") + } + } +} + +// lintImports examines import blocks. +func (f *file) lintImports() { + for i, is := range f.f.Imports { + _ = i + if is.Name != nil && is.Name.Name == "." && !f.isTest() { + f.errorf(is, 1, link(styleGuideBase+"#import-dot"), category("imports"), "should not use dot imports") + } + + } +} + +const docCommentsLink = styleGuideBase + "#doc-comments" + +// lintExported examines the exported names. +// It complains if any required doc comments are missing, +// or if they are not of the right form. The exact rules are in +// lintFuncDoc, lintTypeDoc and lintValueSpecDoc; this function +// also tracks the GenDecl structure being traversed to permit +// doc comments for constants to be on top of the const block. +// It also complains if the names stutter when combined with +// the package name. +func (f *file) lintExported() { + if f.isTest() { + return + } + + var lastGen *ast.GenDecl // last GenDecl entered. + + // Set of GenDecls that have already had missing comments flagged. + genDeclMissingComments := make(map[*ast.GenDecl]bool) + + f.walk(func(node ast.Node) bool { + switch v := node.(type) { + case *ast.GenDecl: + if v.Tok == token.IMPORT { + return false + } + // token.CONST, token.TYPE or token.VAR + lastGen = v + return true + case *ast.FuncDecl: + f.lintFuncDoc(v) + if v.Recv == nil { + // Only check for stutter on functions, not methods. + // Method names are not used package-qualified. + f.checkStutter(v.Name, "func") + } + // Don't proceed inside funcs. + return false + case *ast.TypeSpec: + // inside a GenDecl, which usually has the doc + doc := v.Doc + if doc == nil { + doc = lastGen.Doc + } + f.lintTypeDoc(v, doc) + f.checkStutter(v.Name, "type") + // Don't proceed inside types. + return false + case *ast.ValueSpec: + f.lintValueSpecDoc(v, lastGen, genDeclMissingComments) + return false + } + return true + }) +} + +var ( + allCapsRE = regexp.MustCompile(`^[A-Z0-9_]+$`) + anyCapsRE = regexp.MustCompile(`[A-Z]`) +) + +// knownNameExceptions is a set of names that are known to be exempt from naming checks. +// This is usually because they are constrained by having to match names in the +// standard library. +var knownNameExceptions = map[string]bool{ + "LastInsertId": true, // must match database/sql + "kWh": true, +} + +func isInTopLevel(f *ast.File, ident *ast.Ident) bool { + path, _ := astutil.PathEnclosingInterval(f, ident.Pos(), ident.End()) + for _, f := range path { + switch f.(type) { + case *ast.File, *ast.GenDecl, *ast.ValueSpec, *ast.Ident: + continue + } + return false + } + return true +} + +// lintNames examines all names in the file. +// It complains if any use underscores or incorrect known initialisms. +func (f *file) lintNames() { + // Package names need slightly different handling than other names. + if strings.Contains(f.f.Name.Name, "_") && !strings.HasSuffix(f.f.Name.Name, "_test") { + f.errorf(f.f, 1, link("http://golang.org/doc/effective_go.html#package-names"), category("naming"), "don't use an underscore in package name") + } + if anyCapsRE.MatchString(f.f.Name.Name) { + f.errorf(f.f, 1, link("http://golang.org/doc/effective_go.html#package-names"), category("mixed-caps"), "don't use MixedCaps in package name; %s should be %s", f.f.Name.Name, strings.ToLower(f.f.Name.Name)) + } + + check := func(id *ast.Ident, thing string) { + if id.Name == "_" { + return + } + if knownNameExceptions[id.Name] { + return + } + + // Handle two common styles from other languages that don't belong in Go. + if len(id.Name) >= 5 && allCapsRE.MatchString(id.Name) && strings.Contains(id.Name, "_") { + capCount := 0 + for _, c := range id.Name { + if 'A' <= c && c <= 'Z' { + capCount++ + } + } + if capCount >= 2 { + f.errorf(id, 0.8, link(styleGuideBase+"#mixed-caps"), category("naming"), "don't use ALL_CAPS in Go names; use CamelCase") + return + } + } + if thing == "const" || (thing == "var" && isInTopLevel(f.f, id)) { + if len(id.Name) > 2 && id.Name[0] == 'k' && id.Name[1] >= 'A' && id.Name[1] <= 'Z' { + should := string(id.Name[1]+'a'-'A') + id.Name[2:] + f.errorf(id, 0.8, link(styleGuideBase+"#mixed-caps"), category("naming"), "don't use leading k in Go names; %s %s should be %s", thing, id.Name, should) + } + } + + should := lintName(id.Name) + if id.Name == should { + return + } + + if len(id.Name) > 2 && strings.Contains(id.Name[1:], "_") { + f.errorf(id, 0.9, link("http://golang.org/doc/effective_go.html#mixed-caps"), category("naming"), "don't use underscores in Go names; %s %s should be %s", thing, id.Name, should) + return + } + f.errorf(id, 0.8, link(styleGuideBase+"#initialisms"), category("naming"), "%s %s should be %s", thing, id.Name, should) + } + checkList := func(fl *ast.FieldList, thing string) { + if fl == nil { + return + } + for _, f := range fl.List { + for _, id := range f.Names { + check(id, thing) + } + } + } + f.walk(func(node ast.Node) bool { + switch v := node.(type) { + case *ast.AssignStmt: + if v.Tok == token.ASSIGN { + return true + } + for _, exp := range v.Lhs { + if id, ok := exp.(*ast.Ident); ok { + check(id, "var") + } + } + case *ast.FuncDecl: + if f.isTest() && (strings.HasPrefix(v.Name.Name, "Example") || strings.HasPrefix(v.Name.Name, "Test") || strings.HasPrefix(v.Name.Name, "Benchmark")) { + return true + } + + thing := "func" + if v.Recv != nil { + thing = "method" + } + + // Exclude naming warnings for functions that are exported to C but + // not exported in the Go API. + // See https://github.com/golang/lint/issues/144. + if ast.IsExported(v.Name.Name) || !isCgoExported(v) { + check(v.Name, thing) + } + + checkList(v.Type.Params, thing+" parameter") + checkList(v.Type.Results, thing+" result") + case *ast.GenDecl: + if v.Tok == token.IMPORT { + return true + } + var thing string + switch v.Tok { + case token.CONST: + thing = "const" + case token.TYPE: + thing = "type" + case token.VAR: + thing = "var" + } + for _, spec := range v.Specs { + switch s := spec.(type) { + case *ast.TypeSpec: + check(s.Name, thing) + case *ast.ValueSpec: + for _, id := range s.Names { + check(id, thing) + } + } + } + case *ast.InterfaceType: + // Do not check interface method names. + // They are often constrainted by the method names of concrete types. + for _, x := range v.Methods.List { + ft, ok := x.Type.(*ast.FuncType) + if !ok { // might be an embedded interface name + continue + } + checkList(ft.Params, "interface method parameter") + checkList(ft.Results, "interface method result") + } + case *ast.RangeStmt: + if v.Tok == token.ASSIGN { + return true + } + if id, ok := v.Key.(*ast.Ident); ok { + check(id, "range var") + } + if id, ok := v.Value.(*ast.Ident); ok { + check(id, "range var") + } + case *ast.StructType: + for _, f := range v.Fields.List { + for _, id := range f.Names { + check(id, "struct field") + } + } + } + return true + }) +} + +// lintName returns a different name if it should be different. +func lintName(name string) (should string) { + // Fast path for simple cases: "_" and all lowercase. + if name == "_" { + return name + } + allLower := true + for _, r := range name { + if !unicode.IsLower(r) { + allLower = false + break + } + } + if allLower { + return name + } + + // Split camelCase at any lower->upper transition, and split on underscores. + // Check each word for common initialisms. + runes := []rune(name) + w, i := 0, 0 // index of start of word, scan + for i+1 <= len(runes) { + eow := false // whether we hit the end of a word + if i+1 == len(runes) { + eow = true + } else if runes[i+1] == '_' { + // underscore; shift the remainder forward over any run of underscores + eow = true + n := 1 + for i+n+1 < len(runes) && runes[i+n+1] == '_' { + n++ + } + + // Leave at most one underscore if the underscore is between two digits + if i+n+1 < len(runes) && unicode.IsDigit(runes[i]) && unicode.IsDigit(runes[i+n+1]) { + n-- + } + + copy(runes[i+1:], runes[i+n+1:]) + runes = runes[:len(runes)-n] + } else if unicode.IsLower(runes[i]) && !unicode.IsLower(runes[i+1]) { + // lower->non-lower + eow = true + } + i++ + if !eow { + continue + } + + // [w,i) is a word. + word := string(runes[w:i]) + if u := strings.ToUpper(word); commonInitialisms[u] { + // Keep consistent case, which is lowercase only at the start. + if w == 0 && unicode.IsLower(runes[w]) { + u = strings.ToLower(u) + } + // All the common initialisms are ASCII, + // so we can replace the bytes exactly. + copy(runes[w:], []rune(u)) + } else if w > 0 && strings.ToLower(word) == word { + // already all lowercase, and not the first word, so uppercase the first character. + runes[w] = unicode.ToUpper(runes[w]) + } + w = i + } + return string(runes) +} + +// commonInitialisms is a set of common initialisms. +// Only add entries that are highly unlikely to be non-initialisms. +// For instance, "ID" is fine (Freudian code is rare), but "AND" is not. +var commonInitialisms = map[string]bool{ + "ACL": true, + "API": true, + "ASCII": true, + "CPU": true, + "CSS": true, + "DNS": true, + "EOF": true, + "GUID": true, + "HTML": true, + "HTTP": true, + "HTTPS": true, + "ID": true, + "IP": true, + "JSON": true, + "LHS": true, + "QPS": true, + "RAM": true, + "RHS": true, + "RPC": true, + "SLA": true, + "SMTP": true, + "SQL": true, + "SSH": true, + "TCP": true, + "TLS": true, + "TTL": true, + "UDP": true, + "UI": true, + "UID": true, + "UUID": true, + "URI": true, + "URL": true, + "UTF8": true, + "VM": true, + "XML": true, + "XMPP": true, + "XSRF": true, + "XSS": true, +} + +// lintTypeDoc examines the doc comment on a type. +// It complains if they are missing from an exported type, +// or if they are not of the standard form. +func (f *file) lintTypeDoc(t *ast.TypeSpec, doc *ast.CommentGroup) { + if !ast.IsExported(t.Name.Name) { + return + } + if doc == nil { + f.errorf(t, 1, link(docCommentsLink), category("comments"), "exported type %v should have comment or be unexported", t.Name) + return + } + + s := doc.Text() + articles := [...]string{"A", "An", "The"} + for _, a := range articles { + if strings.HasPrefix(s, a+" ") { + s = s[len(a)+1:] + break + } + } + if !strings.HasPrefix(s, t.Name.Name+" ") { + f.errorf(doc, 1, link(docCommentsLink), category("comments"), `comment on exported type %v should be of the form "%v ..." (with optional leading article)`, t.Name, t.Name) + } +} + +var commonMethods = map[string]bool{ + "Error": true, + "Read": true, + "ServeHTTP": true, + "String": true, + "Write": true, +} + +// lintFuncDoc examines doc comments on functions and methods. +// It complains if they are missing, or not of the right form. +// It has specific exclusions for well-known methods (see commonMethods above). +func (f *file) lintFuncDoc(fn *ast.FuncDecl) { + if !ast.IsExported(fn.Name.Name) { + // func is unexported + return + } + kind := "function" + name := fn.Name.Name + if fn.Recv != nil && len(fn.Recv.List) > 0 { + // method + kind = "method" + recv := receiverType(fn) + if !ast.IsExported(recv) { + // receiver is unexported + return + } + if commonMethods[name] { + return + } + switch name { + case "Len", "Less", "Swap": + if f.pkg.sortable[recv] { + return + } + } + name = recv + "." + name + } + if fn.Doc == nil { + f.errorf(fn, 1, link(docCommentsLink), category("comments"), "exported %s %s should have comment or be unexported", kind, name) + return + } + s := fn.Doc.Text() + prefix := fn.Name.Name + " " + if !strings.HasPrefix(s, prefix) { + f.errorf(fn.Doc, 1, link(docCommentsLink), category("comments"), `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix) + } +} + +// lintValueSpecDoc examines package-global variables and constants. +// It complains if they are not individually declared, +// or if they are not suitably documented in the right form (unless they are in a block that is commented). +func (f *file) lintValueSpecDoc(vs *ast.ValueSpec, gd *ast.GenDecl, genDeclMissingComments map[*ast.GenDecl]bool) { + kind := "var" + if gd.Tok == token.CONST { + kind = "const" + } + + if len(vs.Names) > 1 { + // Check that none are exported except for the first. + for _, n := range vs.Names[1:] { + if ast.IsExported(n.Name) { + f.errorf(vs, 1, category("comments"), "exported %s %s should have its own declaration", kind, n.Name) + return + } + } + } + + // Only one name. + name := vs.Names[0].Name + if !ast.IsExported(name) { + return + } + + if vs.Doc == nil && gd.Doc == nil { + if genDeclMissingComments[gd] { + return + } + block := "" + if kind == "const" && gd.Lparen.IsValid() { + block = " (or a comment on this block)" + } + f.errorf(vs, 1, link(docCommentsLink), category("comments"), "exported %s %s should have comment%s or be unexported", kind, name, block) + genDeclMissingComments[gd] = true + return + } + // If this GenDecl has parens and a comment, we don't check its comment form. + if gd.Lparen.IsValid() && gd.Doc != nil { + return + } + // The relevant text to check will be on either vs.Doc or gd.Doc. + // Use vs.Doc preferentially. + doc := vs.Doc + if doc == nil { + doc = gd.Doc + } + prefix := name + " " + if !strings.HasPrefix(doc.Text(), prefix) { + f.errorf(doc, 1, link(docCommentsLink), category("comments"), `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix) + } +} + +func (f *file) checkStutter(id *ast.Ident, thing string) { + pkg, name := f.f.Name.Name, id.Name + if !ast.IsExported(name) { + // unexported name + return + } + // A name stutters if the package name is a strict prefix + // and the next character of the name starts a new word. + if len(name) <= len(pkg) { + // name is too short to stutter. + // This permits the name to be the same as the package name. + return + } + if !strings.EqualFold(pkg, name[:len(pkg)]) { + return + } + // We can assume the name is well-formed UTF-8. + // If the next rune after the package name is uppercase or an underscore + // the it's starting a new word and thus this name stutters. + rem := name[len(pkg):] + if next, _ := utf8.DecodeRuneInString(rem); next == '_' || unicode.IsUpper(next) { + f.errorf(id, 0.8, link(styleGuideBase+"#package-names"), category("naming"), "%s name will be used as %s.%s by other packages, and that stutters; consider calling this %s", thing, pkg, name, rem) + } +} + +// zeroLiteral is a set of ast.BasicLit values that are zero values. +// It is not exhaustive. +var zeroLiteral = map[string]bool{ + "false": true, // bool + // runes + `'\x00'`: true, + `'\000'`: true, + // strings + `""`: true, + "``": true, + // numerics + "0": true, + "0.": true, + "0.0": true, + "0i": true, +} + +// lintElses examines else blocks. It complains about any else block whose if block ends in a return. +func (f *file) lintElses() { + // We don't want to flag if { } else if { } else { } constructions. + // They will appear as an IfStmt whose Else field is also an IfStmt. + // Record such a node so we ignore it when we visit it. + ignore := make(map[*ast.IfStmt]bool) + + f.walk(func(node ast.Node) bool { + ifStmt, ok := node.(*ast.IfStmt) + if !ok || ifStmt.Else == nil { + return true + } + if elseif, ok := ifStmt.Else.(*ast.IfStmt); ok { + ignore[elseif] = true + return true + } + if ignore[ifStmt] { + return true + } + if _, ok := ifStmt.Else.(*ast.BlockStmt); !ok { + // only care about elses without conditions + return true + } + if len(ifStmt.Body.List) == 0 { + return true + } + shortDecl := false // does the if statement have a ":=" initialization statement? + if ifStmt.Init != nil { + if as, ok := ifStmt.Init.(*ast.AssignStmt); ok && as.Tok == token.DEFINE { + shortDecl = true + } + } + lastStmt := ifStmt.Body.List[len(ifStmt.Body.List)-1] + if _, ok := lastStmt.(*ast.ReturnStmt); ok { + extra := "" + if shortDecl { + extra = " (move short variable declaration to its own line if necessary)" + } + f.errorf(ifStmt.Else, 1, link(styleGuideBase+"#indent-error-flow"), category("indent"), "if block ends with a return statement, so drop this else and outdent its block"+extra) + } + return true + }) +} + +// lintRanges examines range clauses. It complains about redundant constructions. +func (f *file) lintRanges() { + f.walk(func(node ast.Node) bool { + rs, ok := node.(*ast.RangeStmt) + if !ok { + return true + } + + if isIdent(rs.Key, "_") && (rs.Value == nil || isIdent(rs.Value, "_")) { + p := f.errorf(rs.Key, 1, category("range-loop"), "should omit values from range; this loop is equivalent to `for range ...`") + + newRS := *rs // shallow copy + newRS.Value = nil + newRS.Key = nil + p.ReplacementLine = f.firstLineOf(&newRS, rs) + + return true + } + + if isIdent(rs.Value, "_") { + p := f.errorf(rs.Value, 1, category("range-loop"), "should omit 2nd value from range; this loop is equivalent to `for %s %s range ...`", f.render(rs.Key), rs.Tok) + + newRS := *rs // shallow copy + newRS.Value = nil + p.ReplacementLine = f.firstLineOf(&newRS, rs) + } + + return true + }) +} + +// lintErrorf examines errors.New and testing.Error calls. It complains if its only argument is an fmt.Sprintf invocation. +func (f *file) lintErrorf() { + f.walk(func(node ast.Node) bool { + ce, ok := node.(*ast.CallExpr) + if !ok || len(ce.Args) != 1 { + return true + } + isErrorsNew := isPkgDot(ce.Fun, "errors", "New") + var isTestingError bool + se, ok := ce.Fun.(*ast.SelectorExpr) + if ok && se.Sel.Name == "Error" { + if typ := f.pkg.typeOf(se.X); typ != nil { + isTestingError = typ.String() == "*testing.T" + } + } + if !isErrorsNew && !isTestingError { + return true + } + if !f.imports("errors") { + return true + } + arg := ce.Args[0] + ce, ok = arg.(*ast.CallExpr) + if !ok || !isPkgDot(ce.Fun, "fmt", "Sprintf") { + return true + } + errorfPrefix := "fmt" + if isTestingError { + errorfPrefix = f.render(se.X) + } + p := f.errorf(node, 1, category("errors"), "should replace %s(fmt.Sprintf(...)) with %s.Errorf(...)", f.render(se), errorfPrefix) + + m := f.srcLineWithMatch(ce, `^(.*)`+f.render(se)+`\(fmt\.Sprintf\((.*)\)\)(.*)$`) + if m != nil { + p.ReplacementLine = m[1] + errorfPrefix + ".Errorf(" + m[2] + ")" + m[3] + } + + return true + }) +} + +// lintErrors examines global error vars. It complains if they aren't named in the standard way. +func (f *file) lintErrors() { + for _, decl := range f.f.Decls { + gd, ok := decl.(*ast.GenDecl) + if !ok || gd.Tok != token.VAR { + continue + } + for _, spec := range gd.Specs { + spec := spec.(*ast.ValueSpec) + if len(spec.Names) != 1 || len(spec.Values) != 1 { + continue + } + ce, ok := spec.Values[0].(*ast.CallExpr) + if !ok { + continue + } + if !isPkgDot(ce.Fun, "errors", "New") && !isPkgDot(ce.Fun, "fmt", "Errorf") { + continue + } + + id := spec.Names[0] + prefix := "err" + if id.IsExported() { + prefix = "Err" + } + if !strings.HasPrefix(id.Name, prefix) { + f.errorf(id, 0.9, category("naming"), "error var %s should have name of the form %sFoo", id.Name, prefix) + } + } + } +} + +func lintErrorString(s string) (isClean bool, conf float64) { + const basicConfidence = 0.8 + const capConfidence = basicConfidence - 0.2 + first, firstN := utf8.DecodeRuneInString(s) + last, _ := utf8.DecodeLastRuneInString(s) + if last == '.' || last == ':' || last == '!' || last == '\n' { + return false, basicConfidence + } + if unicode.IsUpper(first) { + // People use proper nouns and exported Go identifiers in error strings, + // so decrease the confidence of warnings for capitalization. + if len(s) <= firstN { + return false, capConfidence + } + // Flag strings starting with something that doesn't look like an initialism. + if second, _ := utf8.DecodeRuneInString(s[firstN:]); !unicode.IsUpper(second) { + return false, capConfidence + } + } + return true, 0 +} + +// lintErrorStrings examines error strings. +// It complains if they are capitalized or end in punctuation or a newline. +func (f *file) lintErrorStrings() { + f.walk(func(node ast.Node) bool { + ce, ok := node.(*ast.CallExpr) + if !ok { + return true + } + if !isPkgDot(ce.Fun, "errors", "New") && !isPkgDot(ce.Fun, "fmt", "Errorf") { + return true + } + if len(ce.Args) < 1 { + return true + } + str, ok := ce.Args[0].(*ast.BasicLit) + if !ok || str.Kind != token.STRING { + return true + } + s, _ := strconv.Unquote(str.Value) // can assume well-formed Go + if s == "" { + return true + } + clean, conf := lintErrorString(s) + if clean { + return true + } + + f.errorf(str, conf, link(styleGuideBase+"#error-strings"), category("errors"), + "error strings should not be capitalized or end with punctuation or a newline") + return true + }) +} + +// lintReceiverNames examines receiver names. It complains about inconsistent +// names used for the same type and names such as "this". +func (f *file) lintReceiverNames() { + typeReceiver := map[string]string{} + f.walk(func(n ast.Node) bool { + fn, ok := n.(*ast.FuncDecl) + if !ok || fn.Recv == nil || len(fn.Recv.List) == 0 { + return true + } + names := fn.Recv.List[0].Names + if len(names) < 1 { + return true + } + name := names[0].Name + const ref = styleGuideBase + "#receiver-names" + if name == "_" { + f.errorf(n, 1, link(ref), category("naming"), `receiver name should not be an underscore, omit the name if it is unused`) + return true + } + if name == "this" || name == "self" { + f.errorf(n, 1, link(ref), category("naming"), `receiver name should be a reflection of its identity; don't use generic names such as "this" or "self"`) + return true + } + recv := receiverType(fn) + if prev, ok := typeReceiver[recv]; ok && prev != name { + f.errorf(n, 1, link(ref), category("naming"), "receiver name %s should be consistent with previous receiver name %s for %s", name, prev, recv) + return true + } + typeReceiver[recv] = name + return true + }) +} + +// lintIncDec examines statements that increment or decrement a variable. +// It complains if they don't use x++ or x--. +func (f *file) lintIncDec() { + f.walk(func(n ast.Node) bool { + as, ok := n.(*ast.AssignStmt) + if !ok { + return true + } + if len(as.Lhs) != 1 { + return true + } + if !isOne(as.Rhs[0]) { + return true + } + var suffix string + switch as.Tok { + case token.ADD_ASSIGN: + suffix = "++" + case token.SUB_ASSIGN: + suffix = "--" + default: + return true + } + f.errorf(as, 0.8, category("unary-op"), "should replace %s with %s%s", f.render(as), f.render(as.Lhs[0]), suffix) + return true + }) +} + +// lintErrorReturn examines function declarations that return an error. +// It complains if the error isn't the last parameter. +func (f *file) lintErrorReturn() { + f.walk(func(n ast.Node) bool { + fn, ok := n.(*ast.FuncDecl) + if !ok || fn.Type.Results == nil { + return true + } + ret := fn.Type.Results.List + if len(ret) <= 1 { + return true + } + if isIdent(ret[len(ret)-1].Type, "error") { + return true + } + // An error return parameter should be the last parameter. + // Flag any error parameters found before the last. + for _, r := range ret[:len(ret)-1] { + if isIdent(r.Type, "error") { + f.errorf(fn, 0.9, category("arg-order"), "error should be the last type when returning multiple items") + break // only flag one + } + } + return true + }) +} + +// lintUnexportedReturn examines exported function declarations. +// It complains if any return an unexported type. +func (f *file) lintUnexportedReturn() { + f.walk(func(n ast.Node) bool { + fn, ok := n.(*ast.FuncDecl) + if !ok { + return true + } + if fn.Type.Results == nil { + return false + } + if !fn.Name.IsExported() { + return false + } + thing := "func" + if fn.Recv != nil && len(fn.Recv.List) > 0 { + thing = "method" + if !ast.IsExported(receiverType(fn)) { + // Don't report exported methods of unexported types, + // such as private implementations of sort.Interface. + return false + } + } + for _, ret := range fn.Type.Results.List { + typ := f.pkg.typeOf(ret.Type) + if exportedType(typ) { + continue + } + f.errorf(ret.Type, 0.8, category("unexported-type-in-api"), + "exported %s %s returns unexported type %s, which can be annoying to use", + thing, fn.Name.Name, typ) + break // only flag one + } + return false + }) +} + +// exportedType reports whether typ is an exported type. +// It is imprecise, and will err on the side of returning true, +// such as for composite types. +func exportedType(typ types.Type) bool { + switch T := typ.(type) { + case *types.Named: + // Builtin types have no package. + return T.Obj().Pkg() == nil || T.Obj().Exported() + case *types.Map: + return exportedType(T.Key()) && exportedType(T.Elem()) + case interface { + Elem() types.Type + }: // array, slice, pointer, chan + return exportedType(T.Elem()) + } + // Be conservative about other types, such as struct, interface, etc. + return true +} + +// timeSuffixes is a list of name suffixes that imply a time unit. +// This is not an exhaustive list. +var timeSuffixes = []string{ + "Sec", "Secs", "Seconds", + "Msec", "Msecs", + "Milli", "Millis", "Milliseconds", + "Usec", "Usecs", "Microseconds", + "MS", "Ms", +} + +func (f *file) lintTimeNames() { + f.walk(func(node ast.Node) bool { + v, ok := node.(*ast.ValueSpec) + if !ok { + return true + } + for _, name := range v.Names { + origTyp := f.pkg.typeOf(name) + // Look for time.Duration or *time.Duration; + // the latter is common when using flag.Duration. + typ := origTyp + if pt, ok := typ.(*types.Pointer); ok { + typ = pt.Elem() + } + if !f.pkg.isNamedType(typ, "time", "Duration") { + continue + } + suffix := "" + for _, suf := range timeSuffixes { + if strings.HasSuffix(name.Name, suf) { + suffix = suf + break + } + } + if suffix == "" { + continue + } + f.errorf(v, 0.9, category("time"), "var %s is of type %v; don't use unit-specific suffix %q", name.Name, origTyp, suffix) + } + return true + }) +} + +// lintContextKeyTypes checks for call expressions to context.WithValue with +// basic types used for the key argument. +// See: https://golang.org/issue/17293 +func (f *file) lintContextKeyTypes() { + f.walk(func(node ast.Node) bool { + switch node := node.(type) { + case *ast.CallExpr: + f.checkContextKeyType(node) + } + + return true + }) +} + +// checkContextKeyType reports an error if the call expression calls +// context.WithValue with a key argument of basic type. +func (f *file) checkContextKeyType(x *ast.CallExpr) { + sel, ok := x.Fun.(*ast.SelectorExpr) + if !ok { + return + } + pkg, ok := sel.X.(*ast.Ident) + if !ok || pkg.Name != "context" { + return + } + if sel.Sel.Name != "WithValue" { + return + } + + // key is second argument to context.WithValue + if len(x.Args) != 3 { + return + } + key := f.pkg.typesInfo.Types[x.Args[1]] + + if ktyp, ok := key.Type.(*types.Basic); ok && ktyp.Kind() != types.Invalid { + f.errorf(x, 1.0, category("context"), fmt.Sprintf("should not use basic type %s as key in context.WithValue", key.Type)) + } +} + +// lintContextArgs examines function declarations that contain an +// argument with a type of context.Context +// It complains if that argument isn't the first parameter. +func (f *file) lintContextArgs() { + f.walk(func(n ast.Node) bool { + fn, ok := n.(*ast.FuncDecl) + if !ok || len(fn.Type.Params.List) <= 1 { + return true + } + // A context.Context should be the first parameter of a function. + // Flag any that show up after the first. + for _, arg := range fn.Type.Params.List[1:] { + if isPkgDot(arg.Type, "context", "Context") { + f.errorf(fn, 0.9, link("https://golang.org/pkg/context/"), category("arg-order"), "context.Context should be the first parameter of a function") + break // only flag one + } + } + return true + }) +} + +// containsComments returns whether the interval [start, end) contains any +// comments without "// MATCH " prefix. +func (f *file) containsComments(start, end token.Pos) bool { + for _, cgroup := range f.f.Comments { + comments := cgroup.List + if comments[0].Slash >= end { + // All comments starting with this group are after end pos. + return false + } + if comments[len(comments)-1].Slash < start { + // Comments group ends before start pos. + continue + } + for _, c := range comments { + if start <= c.Slash && c.Slash < end && !strings.HasPrefix(c.Text, "// MATCH ") { + return true + } + } + } + return false +} + +// receiverType returns the named type of the method receiver, sans "*", +// or "invalid-type" if fn.Recv is ill formed. +func receiverType(fn *ast.FuncDecl) string { + switch e := fn.Recv.List[0].Type.(type) { + case *ast.Ident: + return e.Name + case *ast.StarExpr: + if id, ok := e.X.(*ast.Ident); ok { + return id.Name + } + } + // The parser accepts much more than just the legal forms. + return "invalid-type" +} + +func (f *file) walk(fn func(ast.Node) bool) { + ast.Walk(walker(fn), f.f) +} + +func (f *file) render(x interface{}) string { + var buf bytes.Buffer + if err := printer.Fprint(&buf, f.fset, x); err != nil { + panic(err) + } + return buf.String() +} + +func (f *file) debugRender(x interface{}) string { + var buf bytes.Buffer + if err := ast.Fprint(&buf, f.fset, x, nil); err != nil { + panic(err) + } + return buf.String() +} + +// walker adapts a function to satisfy the ast.Visitor interface. +// The function return whether the walk should proceed into the node's children. +type walker func(ast.Node) bool + +func (w walker) Visit(node ast.Node) ast.Visitor { + if w(node) { + return w + } + return nil +} + +func isIdent(expr ast.Expr, ident string) bool { + id, ok := expr.(*ast.Ident) + return ok && id.Name == ident +} + +// isBlank returns whether id is the blank identifier "_". +// If id == nil, the answer is false. +func isBlank(id *ast.Ident) bool { return id != nil && id.Name == "_" } + +func isPkgDot(expr ast.Expr, pkg, name string) bool { + sel, ok := expr.(*ast.SelectorExpr) + return ok && isIdent(sel.X, pkg) && isIdent(sel.Sel, name) +} + +func isOne(expr ast.Expr) bool { + lit, ok := expr.(*ast.BasicLit) + return ok && lit.Kind == token.INT && lit.Value == "1" +} + +func isCgoExported(f *ast.FuncDecl) bool { + if f.Recv != nil || f.Doc == nil { + return false + } + + cgoExport := regexp.MustCompile(fmt.Sprintf("(?m)^//export %s$", regexp.QuoteMeta(f.Name.Name))) + for _, c := range f.Doc.List { + if cgoExport.MatchString(c.Text) { + return true + } + } + return false +} + +var basicTypeKinds = map[types.BasicKind]string{ + types.UntypedBool: "bool", + types.UntypedInt: "int", + types.UntypedRune: "rune", + types.UntypedFloat: "float64", + types.UntypedComplex: "complex128", + types.UntypedString: "string", +} + +// isUntypedConst reports whether expr is an untyped constant, +// and indicates what its default type is. +// scope may be nil. +func (f *file) isUntypedConst(expr ast.Expr) (defType string, ok bool) { + // Re-evaluate expr outside of its context to see if it's untyped. + // (An expr evaluated within, for example, an assignment context will get the type of the LHS.) + exprStr := f.render(expr) + tv, err := types.Eval(f.fset, f.pkg.typesPkg, expr.Pos(), exprStr) + if err != nil { + return "", false + } + if b, ok := tv.Type.(*types.Basic); ok { + if dt, ok := basicTypeKinds[b.Kind()]; ok { + return dt, true + } + } + + return "", false +} + +// firstLineOf renders the given node and returns its first line. +// It will also match the indentation of another node. +func (f *file) firstLineOf(node, match ast.Node) string { + line := f.render(node) + if i := strings.Index(line, "\n"); i >= 0 { + line = line[:i] + } + return f.indentOf(match) + line +} + +func (f *file) indentOf(node ast.Node) string { + line := srcLine(f.src, f.fset.Position(node.Pos())) + for i, r := range line { + switch r { + case ' ', '\t': + default: + return line[:i] + } + } + return line // unusual or empty line +} + +func (f *file) srcLineWithMatch(node ast.Node, pattern string) (m []string) { + line := srcLine(f.src, f.fset.Position(node.Pos())) + line = strings.TrimSuffix(line, "\n") + rx := regexp.MustCompile(pattern) + return rx.FindStringSubmatch(line) +} + +// imports returns true if the current file imports the specified package path. +func (f *file) imports(importPath string) bool { + all := astutil.Imports(f.fset, f.f) + for _, p := range all { + for _, i := range p { + uq, err := strconv.Unquote(i.Path.Value) + if err == nil && importPath == uq { + return true + } + } + } + return false +} + +// srcLine returns the complete line at p, including the terminating newline. +func srcLine(src []byte, p token.Position) string { + // Run to end of line in both directions if not at line start/end. + lo, hi := p.Offset, p.Offset+1 + for lo > 0 && src[lo-1] != '\n' { + lo-- + } + for hi < len(src) && src[hi-1] != '\n' { + hi++ + } + return string(src[lo:hi]) +} diff --git a/vendor/golang.org/x/net/bpf/asm.go b/vendor/golang.org/x/net/bpf/asm.go new file mode 100644 index 00000000..15e21b18 --- /dev/null +++ b/vendor/golang.org/x/net/bpf/asm.go @@ -0,0 +1,41 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bpf + +import "fmt" + +// Assemble converts insts into raw instructions suitable for loading +// into a BPF virtual machine. +// +// Currently, no optimization is attempted, the assembled program flow +// is exactly as provided. +func Assemble(insts []Instruction) ([]RawInstruction, error) { + ret := make([]RawInstruction, len(insts)) + var err error + for i, inst := range insts { + ret[i], err = inst.Assemble() + if err != nil { + return nil, fmt.Errorf("assembling instruction %d: %s", i+1, err) + } + } + return ret, nil +} + +// Disassemble attempts to parse raw back into +// Instructions. Unrecognized RawInstructions are assumed to be an +// extension not implemented by this package, and are passed through +// unchanged to the output. The allDecoded value reports whether insts +// contains no RawInstructions. +func Disassemble(raw []RawInstruction) (insts []Instruction, allDecoded bool) { + insts = make([]Instruction, len(raw)) + allDecoded = true + for i, r := range raw { + insts[i] = r.Disassemble() + if _, ok := insts[i].(RawInstruction); ok { + allDecoded = false + } + } + return insts, allDecoded +} diff --git a/vendor/golang.org/x/net/bpf/constants.go b/vendor/golang.org/x/net/bpf/constants.go new file mode 100644 index 00000000..12f3ee83 --- /dev/null +++ b/vendor/golang.org/x/net/bpf/constants.go @@ -0,0 +1,222 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bpf + +// A Register is a register of the BPF virtual machine. +type Register uint16 + +const ( + // RegA is the accumulator register. RegA is always the + // destination register of ALU operations. + RegA Register = iota + // RegX is the indirection register, used by LoadIndirect + // operations. + RegX +) + +// An ALUOp is an arithmetic or logic operation. +type ALUOp uint16 + +// ALU binary operation types. +const ( + ALUOpAdd ALUOp = iota << 4 + ALUOpSub + ALUOpMul + ALUOpDiv + ALUOpOr + ALUOpAnd + ALUOpShiftLeft + ALUOpShiftRight + aluOpNeg // Not exported because it's the only unary ALU operation, and gets its own instruction type. + ALUOpMod + ALUOpXor +) + +// A JumpTest is a comparison operator used in conditional jumps. +type JumpTest uint16 + +// Supported operators for conditional jumps. +// K can be RegX for JumpIfX +const ( + // K == A + JumpEqual JumpTest = iota + // K != A + JumpNotEqual + // K > A + JumpGreaterThan + // K < A + JumpLessThan + // K >= A + JumpGreaterOrEqual + // K <= A + JumpLessOrEqual + // K & A != 0 + JumpBitsSet + // K & A == 0 + JumpBitsNotSet +) + +// An Extension is a function call provided by the kernel that +// performs advanced operations that are expensive or impossible +// within the BPF virtual machine. +// +// Extensions are only implemented by the Linux kernel. +// +// TODO: should we prune this list? Some of these extensions seem +// either broken or near-impossible to use correctly, whereas other +// (len, random, ifindex) are quite useful. +type Extension int + +// Extension functions available in the Linux kernel. +const ( + // extOffset is the negative maximum number of instructions used + // to load instructions by overloading the K argument. + extOffset = -0x1000 + // ExtLen returns the length of the packet. + ExtLen Extension = 1 + // ExtProto returns the packet's L3 protocol type. + ExtProto Extension = 0 + // ExtType returns the packet's type (skb->pkt_type in the kernel) + // + // TODO: better documentation. How nice an API do we want to + // provide for these esoteric extensions? + ExtType Extension = 4 + // ExtPayloadOffset returns the offset of the packet payload, or + // the first protocol header that the kernel does not know how to + // parse. + ExtPayloadOffset Extension = 52 + // ExtInterfaceIndex returns the index of the interface on which + // the packet was received. + ExtInterfaceIndex Extension = 8 + // ExtNetlinkAttr returns the netlink attribute of type X at + // offset A. + ExtNetlinkAttr Extension = 12 + // ExtNetlinkAttrNested returns the nested netlink attribute of + // type X at offset A. + ExtNetlinkAttrNested Extension = 16 + // ExtMark returns the packet's mark value. + ExtMark Extension = 20 + // ExtQueue returns the packet's assigned hardware queue. + ExtQueue Extension = 24 + // ExtLinkLayerType returns the packet's hardware address type + // (e.g. Ethernet, Infiniband). + ExtLinkLayerType Extension = 28 + // ExtRXHash returns the packets receive hash. + // + // TODO: figure out what this rxhash actually is. + ExtRXHash Extension = 32 + // ExtCPUID returns the ID of the CPU processing the current + // packet. + ExtCPUID Extension = 36 + // ExtVLANTag returns the packet's VLAN tag. + ExtVLANTag Extension = 44 + // ExtVLANTagPresent returns non-zero if the packet has a VLAN + // tag. + // + // TODO: I think this might be a lie: it reads bit 0x1000 of the + // VLAN header, which changed meaning in recent revisions of the + // spec - this extension may now return meaningless information. + ExtVLANTagPresent Extension = 48 + // ExtVLANProto returns 0x8100 if the frame has a VLAN header, + // 0x88a8 if the frame has a "Q-in-Q" double VLAN header, or some + // other value if no VLAN information is present. + ExtVLANProto Extension = 60 + // ExtRand returns a uniformly random uint32. + ExtRand Extension = 56 +) + +// The following gives names to various bit patterns used in opcode construction. + +const ( + opMaskCls uint16 = 0x7 + // opClsLoad masks + opMaskLoadDest = 0x01 + opMaskLoadWidth = 0x18 + opMaskLoadMode = 0xe0 + // opClsALU & opClsJump + opMaskOperand = 0x08 + opMaskOperator = 0xf0 +) + +const ( + // +---------------+-----------------+---+---+---+ + // | AddrMode (3b) | LoadWidth (2b) | 0 | 0 | 0 | + // +---------------+-----------------+---+---+---+ + opClsLoadA uint16 = iota + // +---------------+-----------------+---+---+---+ + // | AddrMode (3b) | LoadWidth (2b) | 0 | 0 | 1 | + // +---------------+-----------------+---+---+---+ + opClsLoadX + // +---+---+---+---+---+---+---+---+ + // | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + // +---+---+---+---+---+---+---+---+ + opClsStoreA + // +---+---+---+---+---+---+---+---+ + // | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | + // +---+---+---+---+---+---+---+---+ + opClsStoreX + // +---------------+-----------------+---+---+---+ + // | Operator (4b) | OperandSrc (1b) | 1 | 0 | 0 | + // +---------------+-----------------+---+---+---+ + opClsALU + // +-----------------------------+---+---+---+---+ + // | TestOperator (4b) | 0 | 1 | 0 | 1 | + // +-----------------------------+---+---+---+---+ + opClsJump + // +---+-------------------------+---+---+---+---+ + // | 0 | 0 | 0 | RetSrc (1b) | 0 | 1 | 1 | 0 | + // +---+-------------------------+---+---+---+---+ + opClsReturn + // +---+-------------------------+---+---+---+---+ + // | 0 | 0 | 0 | TXAorTAX (1b) | 0 | 1 | 1 | 1 | + // +---+-------------------------+---+---+---+---+ + opClsMisc +) + +const ( + opAddrModeImmediate uint16 = iota << 5 + opAddrModeAbsolute + opAddrModeIndirect + opAddrModeScratch + opAddrModePacketLen // actually an extension, not an addressing mode. + opAddrModeMemShift +) + +const ( + opLoadWidth4 uint16 = iota << 3 + opLoadWidth2 + opLoadWidth1 +) + +// Operand for ALU and Jump instructions +type opOperand uint16 + +// Supported operand sources. +const ( + opOperandConstant opOperand = iota << 3 + opOperandX +) + +// An jumpOp is a conditional jump condition. +type jumpOp uint16 + +// Supported jump conditions. +const ( + opJumpAlways jumpOp = iota << 4 + opJumpEqual + opJumpGT + opJumpGE + opJumpSet +) + +const ( + opRetSrcConstant uint16 = iota << 4 + opRetSrcA +) + +const ( + opMiscTAX = 0x00 + opMiscTXA = 0x80 +) diff --git a/vendor/golang.org/x/net/bpf/doc.go b/vendor/golang.org/x/net/bpf/doc.go new file mode 100644 index 00000000..ae62feb5 --- /dev/null +++ b/vendor/golang.org/x/net/bpf/doc.go @@ -0,0 +1,82 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* + +Package bpf implements marshaling and unmarshaling of programs for the +Berkeley Packet Filter virtual machine, and provides a Go implementation +of the virtual machine. + +BPF's main use is to specify a packet filter for network taps, so that +the kernel doesn't have to expensively copy every packet it sees to +userspace. However, it's been repurposed to other areas where running +user code in-kernel is needed. For example, Linux's seccomp uses BPF +to apply security policies to system calls. For simplicity, this +documentation refers only to packets, but other uses of BPF have their +own data payloads. + +BPF programs run in a restricted virtual machine. It has almost no +access to kernel functions, and while conditional branches are +allowed, they can only jump forwards, to guarantee that there are no +infinite loops. + +The virtual machine + +The BPF VM is an accumulator machine. Its main register, called +register A, is an implicit source and destination in all arithmetic +and logic operations. The machine also has 16 scratch registers for +temporary storage, and an indirection register (register X) for +indirect memory access. All registers are 32 bits wide. + +Each run of a BPF program is given one packet, which is placed in the +VM's read-only "main memory". LoadAbsolute and LoadIndirect +instructions can fetch up to 32 bits at a time into register A for +examination. + +The goal of a BPF program is to produce and return a verdict (uint32), +which tells the kernel what to do with the packet. In the context of +packet filtering, the returned value is the number of bytes of the +packet to forward to userspace, or 0 to ignore the packet. Other +contexts like seccomp define their own return values. + +In order to simplify programs, attempts to read past the end of the +packet terminate the program execution with a verdict of 0 (ignore +packet). This means that the vast majority of BPF programs don't need +to do any explicit bounds checking. + +In addition to the bytes of the packet, some BPF programs have access +to extensions, which are essentially calls to kernel utility +functions. Currently, the only extensions supported by this package +are the Linux packet filter extensions. + +Examples + +This packet filter selects all ARP packets. + + bpf.Assemble([]bpf.Instruction{ + // Load "EtherType" field from the ethernet header. + bpf.LoadAbsolute{Off: 12, Size: 2}, + // Skip over the next instruction if EtherType is not ARP. + bpf.JumpIf{Cond: bpf.JumpNotEqual, Val: 0x0806, SkipTrue: 1}, + // Verdict is "send up to 4k of the packet to userspace." + bpf.RetConstant{Val: 4096}, + // Verdict is "ignore packet." + bpf.RetConstant{Val: 0}, + }) + +This packet filter captures a random 1% sample of traffic. + + bpf.Assemble([]bpf.Instruction{ + // Get a 32-bit random number from the Linux kernel. + bpf.LoadExtension{Num: bpf.ExtRand}, + // 1% dice roll? + bpf.JumpIf{Cond: bpf.JumpLessThan, Val: 2^32/100, SkipFalse: 1}, + // Capture. + bpf.RetConstant{Val: 4096}, + // Ignore. + bpf.RetConstant{Val: 0}, + }) + +*/ +package bpf // import "golang.org/x/net/bpf" diff --git a/vendor/golang.org/x/net/bpf/instructions.go b/vendor/golang.org/x/net/bpf/instructions.go new file mode 100644 index 00000000..3cffcaa0 --- /dev/null +++ b/vendor/golang.org/x/net/bpf/instructions.go @@ -0,0 +1,726 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bpf + +import "fmt" + +// An Instruction is one instruction executed by the BPF virtual +// machine. +type Instruction interface { + // Assemble assembles the Instruction into a RawInstruction. + Assemble() (RawInstruction, error) +} + +// A RawInstruction is a raw BPF virtual machine instruction. +type RawInstruction struct { + // Operation to execute. + Op uint16 + // For conditional jump instructions, the number of instructions + // to skip if the condition is true/false. + Jt uint8 + Jf uint8 + // Constant parameter. The meaning depends on the Op. + K uint32 +} + +// Assemble implements the Instruction Assemble method. +func (ri RawInstruction) Assemble() (RawInstruction, error) { return ri, nil } + +// Disassemble parses ri into an Instruction and returns it. If ri is +// not recognized by this package, ri itself is returned. +func (ri RawInstruction) Disassemble() Instruction { + switch ri.Op & opMaskCls { + case opClsLoadA, opClsLoadX: + reg := Register(ri.Op & opMaskLoadDest) + sz := 0 + switch ri.Op & opMaskLoadWidth { + case opLoadWidth4: + sz = 4 + case opLoadWidth2: + sz = 2 + case opLoadWidth1: + sz = 1 + default: + return ri + } + switch ri.Op & opMaskLoadMode { + case opAddrModeImmediate: + if sz != 4 { + return ri + } + return LoadConstant{Dst: reg, Val: ri.K} + case opAddrModeScratch: + if sz != 4 || ri.K > 15 { + return ri + } + return LoadScratch{Dst: reg, N: int(ri.K)} + case opAddrModeAbsolute: + if ri.K > extOffset+0xffffffff { + return LoadExtension{Num: Extension(-extOffset + ri.K)} + } + return LoadAbsolute{Size: sz, Off: ri.K} + case opAddrModeIndirect: + return LoadIndirect{Size: sz, Off: ri.K} + case opAddrModePacketLen: + if sz != 4 { + return ri + } + return LoadExtension{Num: ExtLen} + case opAddrModeMemShift: + return LoadMemShift{Off: ri.K} + default: + return ri + } + + case opClsStoreA: + if ri.Op != opClsStoreA || ri.K > 15 { + return ri + } + return StoreScratch{Src: RegA, N: int(ri.K)} + + case opClsStoreX: + if ri.Op != opClsStoreX || ri.K > 15 { + return ri + } + return StoreScratch{Src: RegX, N: int(ri.K)} + + case opClsALU: + switch op := ALUOp(ri.Op & opMaskOperator); op { + case ALUOpAdd, ALUOpSub, ALUOpMul, ALUOpDiv, ALUOpOr, ALUOpAnd, ALUOpShiftLeft, ALUOpShiftRight, ALUOpMod, ALUOpXor: + switch operand := opOperand(ri.Op & opMaskOperand); operand { + case opOperandX: + return ALUOpX{Op: op} + case opOperandConstant: + return ALUOpConstant{Op: op, Val: ri.K} + default: + return ri + } + case aluOpNeg: + return NegateA{} + default: + return ri + } + + case opClsJump: + switch op := jumpOp(ri.Op & opMaskOperator); op { + case opJumpAlways: + return Jump{Skip: ri.K} + case opJumpEqual, opJumpGT, opJumpGE, opJumpSet: + cond, skipTrue, skipFalse := jumpOpToTest(op, ri.Jt, ri.Jf) + switch operand := opOperand(ri.Op & opMaskOperand); operand { + case opOperandX: + return JumpIfX{Cond: cond, SkipTrue: skipTrue, SkipFalse: skipFalse} + case opOperandConstant: + return JumpIf{Cond: cond, Val: ri.K, SkipTrue: skipTrue, SkipFalse: skipFalse} + default: + return ri + } + default: + return ri + } + + case opClsReturn: + switch ri.Op { + case opClsReturn | opRetSrcA: + return RetA{} + case opClsReturn | opRetSrcConstant: + return RetConstant{Val: ri.K} + default: + return ri + } + + case opClsMisc: + switch ri.Op { + case opClsMisc | opMiscTAX: + return TAX{} + case opClsMisc | opMiscTXA: + return TXA{} + default: + return ri + } + + default: + panic("unreachable") // switch is exhaustive on the bit pattern + } +} + +func jumpOpToTest(op jumpOp, skipTrue uint8, skipFalse uint8) (JumpTest, uint8, uint8) { + var test JumpTest + + // Decode "fake" jump conditions that don't appear in machine code + // Ensures the Assemble -> Disassemble stage recreates the same instructions + // See https://github.com/golang/go/issues/18470 + if skipTrue == 0 { + switch op { + case opJumpEqual: + test = JumpNotEqual + case opJumpGT: + test = JumpLessOrEqual + case opJumpGE: + test = JumpLessThan + case opJumpSet: + test = JumpBitsNotSet + } + + return test, skipFalse, 0 + } + + switch op { + case opJumpEqual: + test = JumpEqual + case opJumpGT: + test = JumpGreaterThan + case opJumpGE: + test = JumpGreaterOrEqual + case opJumpSet: + test = JumpBitsSet + } + + return test, skipTrue, skipFalse +} + +// LoadConstant loads Val into register Dst. +type LoadConstant struct { + Dst Register + Val uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadConstant) Assemble() (RawInstruction, error) { + return assembleLoad(a.Dst, 4, opAddrModeImmediate, a.Val) +} + +// String returns the instruction in assembler notation. +func (a LoadConstant) String() string { + switch a.Dst { + case RegA: + return fmt.Sprintf("ld #%d", a.Val) + case RegX: + return fmt.Sprintf("ldx #%d", a.Val) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadScratch loads scratch[N] into register Dst. +type LoadScratch struct { + Dst Register + N int // 0-15 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadScratch) Assemble() (RawInstruction, error) { + if a.N < 0 || a.N > 15 { + return RawInstruction{}, fmt.Errorf("invalid scratch slot %d", a.N) + } + return assembleLoad(a.Dst, 4, opAddrModeScratch, uint32(a.N)) +} + +// String returns the instruction in assembler notation. +func (a LoadScratch) String() string { + switch a.Dst { + case RegA: + return fmt.Sprintf("ld M[%d]", a.N) + case RegX: + return fmt.Sprintf("ldx M[%d]", a.N) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadAbsolute loads packet[Off:Off+Size] as an integer value into +// register A. +type LoadAbsolute struct { + Off uint32 + Size int // 1, 2 or 4 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadAbsolute) Assemble() (RawInstruction, error) { + return assembleLoad(RegA, a.Size, opAddrModeAbsolute, a.Off) +} + +// String returns the instruction in assembler notation. +func (a LoadAbsolute) String() string { + switch a.Size { + case 1: // byte + return fmt.Sprintf("ldb [%d]", a.Off) + case 2: // half word + return fmt.Sprintf("ldh [%d]", a.Off) + case 4: // word + if a.Off > extOffset+0xffffffff { + return LoadExtension{Num: Extension(a.Off + 0x1000)}.String() + } + return fmt.Sprintf("ld [%d]", a.Off) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadIndirect loads packet[X+Off:X+Off+Size] as an integer value +// into register A. +type LoadIndirect struct { + Off uint32 + Size int // 1, 2 or 4 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadIndirect) Assemble() (RawInstruction, error) { + return assembleLoad(RegA, a.Size, opAddrModeIndirect, a.Off) +} + +// String returns the instruction in assembler notation. +func (a LoadIndirect) String() string { + switch a.Size { + case 1: // byte + return fmt.Sprintf("ldb [x + %d]", a.Off) + case 2: // half word + return fmt.Sprintf("ldh [x + %d]", a.Off) + case 4: // word + return fmt.Sprintf("ld [x + %d]", a.Off) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// LoadMemShift multiplies the first 4 bits of the byte at packet[Off] +// by 4 and stores the result in register X. +// +// This instruction is mainly useful to load into X the length of an +// IPv4 packet header in a single instruction, rather than have to do +// the arithmetic on the header's first byte by hand. +type LoadMemShift struct { + Off uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a LoadMemShift) Assemble() (RawInstruction, error) { + return assembleLoad(RegX, 1, opAddrModeMemShift, a.Off) +} + +// String returns the instruction in assembler notation. +func (a LoadMemShift) String() string { + return fmt.Sprintf("ldx 4*([%d]&0xf)", a.Off) +} + +// LoadExtension invokes a linux-specific extension and stores the +// result in register A. +type LoadExtension struct { + Num Extension +} + +// Assemble implements the Instruction Assemble method. +func (a LoadExtension) Assemble() (RawInstruction, error) { + if a.Num == ExtLen { + return assembleLoad(RegA, 4, opAddrModePacketLen, 0) + } + return assembleLoad(RegA, 4, opAddrModeAbsolute, uint32(extOffset+a.Num)) +} + +// String returns the instruction in assembler notation. +func (a LoadExtension) String() string { + switch a.Num { + case ExtLen: + return "ld #len" + case ExtProto: + return "ld #proto" + case ExtType: + return "ld #type" + case ExtPayloadOffset: + return "ld #poff" + case ExtInterfaceIndex: + return "ld #ifidx" + case ExtNetlinkAttr: + return "ld #nla" + case ExtNetlinkAttrNested: + return "ld #nlan" + case ExtMark: + return "ld #mark" + case ExtQueue: + return "ld #queue" + case ExtLinkLayerType: + return "ld #hatype" + case ExtRXHash: + return "ld #rxhash" + case ExtCPUID: + return "ld #cpu" + case ExtVLANTag: + return "ld #vlan_tci" + case ExtVLANTagPresent: + return "ld #vlan_avail" + case ExtVLANProto: + return "ld #vlan_tpid" + case ExtRand: + return "ld #rand" + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// StoreScratch stores register Src into scratch[N]. +type StoreScratch struct { + Src Register + N int // 0-15 +} + +// Assemble implements the Instruction Assemble method. +func (a StoreScratch) Assemble() (RawInstruction, error) { + if a.N < 0 || a.N > 15 { + return RawInstruction{}, fmt.Errorf("invalid scratch slot %d", a.N) + } + var op uint16 + switch a.Src { + case RegA: + op = opClsStoreA + case RegX: + op = opClsStoreX + default: + return RawInstruction{}, fmt.Errorf("invalid source register %v", a.Src) + } + + return RawInstruction{ + Op: op, + K: uint32(a.N), + }, nil +} + +// String returns the instruction in assembler notation. +func (a StoreScratch) String() string { + switch a.Src { + case RegA: + return fmt.Sprintf("st M[%d]", a.N) + case RegX: + return fmt.Sprintf("stx M[%d]", a.N) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// ALUOpConstant executes A = A Val. +type ALUOpConstant struct { + Op ALUOp + Val uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a ALUOpConstant) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsALU | uint16(opOperandConstant) | uint16(a.Op), + K: a.Val, + }, nil +} + +// String returns the instruction in assembler notation. +func (a ALUOpConstant) String() string { + switch a.Op { + case ALUOpAdd: + return fmt.Sprintf("add #%d", a.Val) + case ALUOpSub: + return fmt.Sprintf("sub #%d", a.Val) + case ALUOpMul: + return fmt.Sprintf("mul #%d", a.Val) + case ALUOpDiv: + return fmt.Sprintf("div #%d", a.Val) + case ALUOpMod: + return fmt.Sprintf("mod #%d", a.Val) + case ALUOpAnd: + return fmt.Sprintf("and #%d", a.Val) + case ALUOpOr: + return fmt.Sprintf("or #%d", a.Val) + case ALUOpXor: + return fmt.Sprintf("xor #%d", a.Val) + case ALUOpShiftLeft: + return fmt.Sprintf("lsh #%d", a.Val) + case ALUOpShiftRight: + return fmt.Sprintf("rsh #%d", a.Val) + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// ALUOpX executes A = A X +type ALUOpX struct { + Op ALUOp +} + +// Assemble implements the Instruction Assemble method. +func (a ALUOpX) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsALU | uint16(opOperandX) | uint16(a.Op), + }, nil +} + +// String returns the instruction in assembler notation. +func (a ALUOpX) String() string { + switch a.Op { + case ALUOpAdd: + return "add x" + case ALUOpSub: + return "sub x" + case ALUOpMul: + return "mul x" + case ALUOpDiv: + return "div x" + case ALUOpMod: + return "mod x" + case ALUOpAnd: + return "and x" + case ALUOpOr: + return "or x" + case ALUOpXor: + return "xor x" + case ALUOpShiftLeft: + return "lsh x" + case ALUOpShiftRight: + return "rsh x" + default: + return fmt.Sprintf("unknown instruction: %#v", a) + } +} + +// NegateA executes A = -A. +type NegateA struct{} + +// Assemble implements the Instruction Assemble method. +func (a NegateA) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsALU | uint16(aluOpNeg), + }, nil +} + +// String returns the instruction in assembler notation. +func (a NegateA) String() string { + return fmt.Sprintf("neg") +} + +// Jump skips the following Skip instructions in the program. +type Jump struct { + Skip uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a Jump) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsJump | uint16(opJumpAlways), + K: a.Skip, + }, nil +} + +// String returns the instruction in assembler notation. +func (a Jump) String() string { + return fmt.Sprintf("ja %d", a.Skip) +} + +// JumpIf skips the following Skip instructions in the program if A +// Val is true. +type JumpIf struct { + Cond JumpTest + Val uint32 + SkipTrue uint8 + SkipFalse uint8 +} + +// Assemble implements the Instruction Assemble method. +func (a JumpIf) Assemble() (RawInstruction, error) { + return jumpToRaw(a.Cond, opOperandConstant, a.Val, a.SkipTrue, a.SkipFalse) +} + +// String returns the instruction in assembler notation. +func (a JumpIf) String() string { + return jumpToString(a.Cond, fmt.Sprintf("#%d", a.Val), a.SkipTrue, a.SkipFalse) +} + +// JumpIfX skips the following Skip instructions in the program if A +// X is true. +type JumpIfX struct { + Cond JumpTest + SkipTrue uint8 + SkipFalse uint8 +} + +// Assemble implements the Instruction Assemble method. +func (a JumpIfX) Assemble() (RawInstruction, error) { + return jumpToRaw(a.Cond, opOperandX, 0, a.SkipTrue, a.SkipFalse) +} + +// String returns the instruction in assembler notation. +func (a JumpIfX) String() string { + return jumpToString(a.Cond, "x", a.SkipTrue, a.SkipFalse) +} + +// jumpToRaw assembles a jump instruction into a RawInstruction +func jumpToRaw(test JumpTest, operand opOperand, k uint32, skipTrue, skipFalse uint8) (RawInstruction, error) { + var ( + cond jumpOp + flip bool + ) + switch test { + case JumpEqual: + cond = opJumpEqual + case JumpNotEqual: + cond, flip = opJumpEqual, true + case JumpGreaterThan: + cond = opJumpGT + case JumpLessThan: + cond, flip = opJumpGE, true + case JumpGreaterOrEqual: + cond = opJumpGE + case JumpLessOrEqual: + cond, flip = opJumpGT, true + case JumpBitsSet: + cond = opJumpSet + case JumpBitsNotSet: + cond, flip = opJumpSet, true + default: + return RawInstruction{}, fmt.Errorf("unknown JumpTest %v", test) + } + jt, jf := skipTrue, skipFalse + if flip { + jt, jf = jf, jt + } + return RawInstruction{ + Op: opClsJump | uint16(cond) | uint16(operand), + Jt: jt, + Jf: jf, + K: k, + }, nil +} + +// jumpToString converts a jump instruction to assembler notation +func jumpToString(cond JumpTest, operand string, skipTrue, skipFalse uint8) string { + switch cond { + // K == A + case JumpEqual: + return conditionalJump(operand, skipTrue, skipFalse, "jeq", "jneq") + // K != A + case JumpNotEqual: + return fmt.Sprintf("jneq %s,%d", operand, skipTrue) + // K > A + case JumpGreaterThan: + return conditionalJump(operand, skipTrue, skipFalse, "jgt", "jle") + // K < A + case JumpLessThan: + return fmt.Sprintf("jlt %s,%d", operand, skipTrue) + // K >= A + case JumpGreaterOrEqual: + return conditionalJump(operand, skipTrue, skipFalse, "jge", "jlt") + // K <= A + case JumpLessOrEqual: + return fmt.Sprintf("jle %s,%d", operand, skipTrue) + // K & A != 0 + case JumpBitsSet: + if skipFalse > 0 { + return fmt.Sprintf("jset %s,%d,%d", operand, skipTrue, skipFalse) + } + return fmt.Sprintf("jset %s,%d", operand, skipTrue) + // K & A == 0, there is no assembler instruction for JumpBitNotSet, use JumpBitSet and invert skips + case JumpBitsNotSet: + return jumpToString(JumpBitsSet, operand, skipFalse, skipTrue) + default: + return fmt.Sprintf("unknown JumpTest %#v", cond) + } +} + +func conditionalJump(operand string, skipTrue, skipFalse uint8, positiveJump, negativeJump string) string { + if skipTrue > 0 { + if skipFalse > 0 { + return fmt.Sprintf("%s %s,%d,%d", positiveJump, operand, skipTrue, skipFalse) + } + return fmt.Sprintf("%s %s,%d", positiveJump, operand, skipTrue) + } + return fmt.Sprintf("%s %s,%d", negativeJump, operand, skipFalse) +} + +// RetA exits the BPF program, returning the value of register A. +type RetA struct{} + +// Assemble implements the Instruction Assemble method. +func (a RetA) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsReturn | opRetSrcA, + }, nil +} + +// String returns the instruction in assembler notation. +func (a RetA) String() string { + return fmt.Sprintf("ret a") +} + +// RetConstant exits the BPF program, returning a constant value. +type RetConstant struct { + Val uint32 +} + +// Assemble implements the Instruction Assemble method. +func (a RetConstant) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsReturn | opRetSrcConstant, + K: a.Val, + }, nil +} + +// String returns the instruction in assembler notation. +func (a RetConstant) String() string { + return fmt.Sprintf("ret #%d", a.Val) +} + +// TXA copies the value of register X to register A. +type TXA struct{} + +// Assemble implements the Instruction Assemble method. +func (a TXA) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsMisc | opMiscTXA, + }, nil +} + +// String returns the instruction in assembler notation. +func (a TXA) String() string { + return fmt.Sprintf("txa") +} + +// TAX copies the value of register A to register X. +type TAX struct{} + +// Assemble implements the Instruction Assemble method. +func (a TAX) Assemble() (RawInstruction, error) { + return RawInstruction{ + Op: opClsMisc | opMiscTAX, + }, nil +} + +// String returns the instruction in assembler notation. +func (a TAX) String() string { + return fmt.Sprintf("tax") +} + +func assembleLoad(dst Register, loadSize int, mode uint16, k uint32) (RawInstruction, error) { + var ( + cls uint16 + sz uint16 + ) + switch dst { + case RegA: + cls = opClsLoadA + case RegX: + cls = opClsLoadX + default: + return RawInstruction{}, fmt.Errorf("invalid target register %v", dst) + } + switch loadSize { + case 1: + sz = opLoadWidth1 + case 2: + sz = opLoadWidth2 + case 4: + sz = opLoadWidth4 + default: + return RawInstruction{}, fmt.Errorf("invalid load byte length %d", sz) + } + return RawInstruction{ + Op: cls | sz | mode, + K: k, + }, nil +} diff --git a/vendor/golang.org/x/net/bpf/setter.go b/vendor/golang.org/x/net/bpf/setter.go new file mode 100644 index 00000000..43e35f0a --- /dev/null +++ b/vendor/golang.org/x/net/bpf/setter.go @@ -0,0 +1,10 @@ +// 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. + +package bpf + +// A Setter is a type which can attach a compiled BPF filter to itself. +type Setter interface { + SetBPF(filter []RawInstruction) error +} diff --git a/vendor/golang.org/x/net/bpf/vm.go b/vendor/golang.org/x/net/bpf/vm.go new file mode 100644 index 00000000..73f57f1f --- /dev/null +++ b/vendor/golang.org/x/net/bpf/vm.go @@ -0,0 +1,150 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bpf + +import ( + "errors" + "fmt" +) + +// A VM is an emulated BPF virtual machine. +type VM struct { + filter []Instruction +} + +// NewVM returns a new VM using the input BPF program. +func NewVM(filter []Instruction) (*VM, error) { + if len(filter) == 0 { + return nil, errors.New("one or more Instructions must be specified") + } + + for i, ins := range filter { + check := len(filter) - (i + 1) + switch ins := ins.(type) { + // Check for out-of-bounds jumps in instructions + case Jump: + if check <= int(ins.Skip) { + return nil, fmt.Errorf("cannot jump %d instructions; jumping past program bounds", ins.Skip) + } + case JumpIf: + if check <= int(ins.SkipTrue) { + return nil, fmt.Errorf("cannot jump %d instructions in true case; jumping past program bounds", ins.SkipTrue) + } + if check <= int(ins.SkipFalse) { + return nil, fmt.Errorf("cannot jump %d instructions in false case; jumping past program bounds", ins.SkipFalse) + } + case JumpIfX: + if check <= int(ins.SkipTrue) { + return nil, fmt.Errorf("cannot jump %d instructions in true case; jumping past program bounds", ins.SkipTrue) + } + if check <= int(ins.SkipFalse) { + return nil, fmt.Errorf("cannot jump %d instructions in false case; jumping past program bounds", ins.SkipFalse) + } + // Check for division or modulus by zero + case ALUOpConstant: + if ins.Val != 0 { + break + } + + switch ins.Op { + case ALUOpDiv, ALUOpMod: + return nil, errors.New("cannot divide by zero using ALUOpConstant") + } + // Check for unknown extensions + case LoadExtension: + switch ins.Num { + case ExtLen: + default: + return nil, fmt.Errorf("extension %d not implemented", ins.Num) + } + } + } + + // Make sure last instruction is a return instruction + switch filter[len(filter)-1].(type) { + case RetA, RetConstant: + default: + return nil, errors.New("BPF program must end with RetA or RetConstant") + } + + // Though our VM works using disassembled instructions, we + // attempt to assemble the input filter anyway to ensure it is compatible + // with an operating system VM. + _, err := Assemble(filter) + + return &VM{ + filter: filter, + }, err +} + +// Run runs the VM's BPF program against the input bytes. +// Run returns the number of bytes accepted by the BPF program, and any errors +// which occurred while processing the program. +func (v *VM) Run(in []byte) (int, error) { + var ( + // Registers of the virtual machine + regA uint32 + regX uint32 + regScratch [16]uint32 + + // OK is true if the program should continue processing the next + // instruction, or false if not, causing the loop to break + ok = true + ) + + // TODO(mdlayher): implement: + // - NegateA: + // - would require a change from uint32 registers to int32 + // registers + + // TODO(mdlayher): add interop tests that check signedness of ALU + // operations against kernel implementation, and make sure Go + // implementation matches behavior + + for i := 0; i < len(v.filter) && ok; i++ { + ins := v.filter[i] + + switch ins := ins.(type) { + case ALUOpConstant: + regA = aluOpConstant(ins, regA) + case ALUOpX: + regA, ok = aluOpX(ins, regA, regX) + case Jump: + i += int(ins.Skip) + case JumpIf: + jump := jumpIf(ins, regA) + i += jump + case JumpIfX: + jump := jumpIfX(ins, regA, regX) + i += jump + case LoadAbsolute: + regA, ok = loadAbsolute(ins, in) + case LoadConstant: + regA, regX = loadConstant(ins, regA, regX) + case LoadExtension: + regA = loadExtension(ins, in) + case LoadIndirect: + regA, ok = loadIndirect(ins, in, regX) + case LoadMemShift: + regX, ok = loadMemShift(ins, in) + case LoadScratch: + regA, regX = loadScratch(ins, regScratch, regA, regX) + case RetA: + return int(regA), nil + case RetConstant: + return int(ins.Val), nil + case StoreScratch: + regScratch = storeScratch(ins, regScratch, regA, regX) + case TAX: + regX = regA + case TXA: + regA = regX + default: + return 0, fmt.Errorf("unknown Instruction at index %d: %T", i, ins) + } + } + + return 0, nil +} diff --git a/vendor/golang.org/x/net/bpf/vm_instructions.go b/vendor/golang.org/x/net/bpf/vm_instructions.go new file mode 100644 index 00000000..cf8947c3 --- /dev/null +++ b/vendor/golang.org/x/net/bpf/vm_instructions.go @@ -0,0 +1,182 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bpf + +import ( + "encoding/binary" + "fmt" +) + +func aluOpConstant(ins ALUOpConstant, regA uint32) uint32 { + return aluOpCommon(ins.Op, regA, ins.Val) +} + +func aluOpX(ins ALUOpX, regA uint32, regX uint32) (uint32, bool) { + // Guard against division or modulus by zero by terminating + // the program, as the OS BPF VM does + if regX == 0 { + switch ins.Op { + case ALUOpDiv, ALUOpMod: + return 0, false + } + } + + return aluOpCommon(ins.Op, regA, regX), true +} + +func aluOpCommon(op ALUOp, regA uint32, value uint32) uint32 { + switch op { + case ALUOpAdd: + return regA + value + case ALUOpSub: + return regA - value + case ALUOpMul: + return regA * value + case ALUOpDiv: + // Division by zero not permitted by NewVM and aluOpX checks + return regA / value + case ALUOpOr: + return regA | value + case ALUOpAnd: + return regA & value + case ALUOpShiftLeft: + return regA << value + case ALUOpShiftRight: + return regA >> value + case ALUOpMod: + // Modulus by zero not permitted by NewVM and aluOpX checks + return regA % value + case ALUOpXor: + return regA ^ value + default: + return regA + } +} + +func jumpIf(ins JumpIf, regA uint32) int { + return jumpIfCommon(ins.Cond, ins.SkipTrue, ins.SkipFalse, regA, ins.Val) +} + +func jumpIfX(ins JumpIfX, regA uint32, regX uint32) int { + return jumpIfCommon(ins.Cond, ins.SkipTrue, ins.SkipFalse, regA, regX) +} + +func jumpIfCommon(cond JumpTest, skipTrue, skipFalse uint8, regA uint32, value uint32) int { + var ok bool + + switch cond { + case JumpEqual: + ok = regA == value + case JumpNotEqual: + ok = regA != value + case JumpGreaterThan: + ok = regA > value + case JumpLessThan: + ok = regA < value + case JumpGreaterOrEqual: + ok = regA >= value + case JumpLessOrEqual: + ok = regA <= value + case JumpBitsSet: + ok = (regA & value) != 0 + case JumpBitsNotSet: + ok = (regA & value) == 0 + } + + if ok { + return int(skipTrue) + } + + return int(skipFalse) +} + +func loadAbsolute(ins LoadAbsolute, in []byte) (uint32, bool) { + offset := int(ins.Off) + size := int(ins.Size) + + return loadCommon(in, offset, size) +} + +func loadConstant(ins LoadConstant, regA uint32, regX uint32) (uint32, uint32) { + switch ins.Dst { + case RegA: + regA = ins.Val + case RegX: + regX = ins.Val + } + + return regA, regX +} + +func loadExtension(ins LoadExtension, in []byte) uint32 { + switch ins.Num { + case ExtLen: + return uint32(len(in)) + default: + panic(fmt.Sprintf("unimplemented extension: %d", ins.Num)) + } +} + +func loadIndirect(ins LoadIndirect, in []byte, regX uint32) (uint32, bool) { + offset := int(ins.Off) + int(regX) + size := int(ins.Size) + + return loadCommon(in, offset, size) +} + +func loadMemShift(ins LoadMemShift, in []byte) (uint32, bool) { + offset := int(ins.Off) + + // Size of LoadMemShift is always 1 byte + if !inBounds(len(in), offset, 1) { + return 0, false + } + + // Mask off high 4 bits and multiply low 4 bits by 4 + return uint32(in[offset]&0x0f) * 4, true +} + +func inBounds(inLen int, offset int, size int) bool { + return offset+size <= inLen +} + +func loadCommon(in []byte, offset int, size int) (uint32, bool) { + if !inBounds(len(in), offset, size) { + return 0, false + } + + switch size { + case 1: + return uint32(in[offset]), true + case 2: + return uint32(binary.BigEndian.Uint16(in[offset : offset+size])), true + case 4: + return uint32(binary.BigEndian.Uint32(in[offset : offset+size])), true + default: + panic(fmt.Sprintf("invalid load size: %d", size)) + } +} + +func loadScratch(ins LoadScratch, regScratch [16]uint32, regA uint32, regX uint32) (uint32, uint32) { + switch ins.Dst { + case RegA: + regA = regScratch[ins.N] + case RegX: + regX = regScratch[ins.N] + } + + return regA, regX +} + +func storeScratch(ins StoreScratch, regScratch [16]uint32, regA uint32, regX uint32) [16]uint32 { + switch ins.Src { + case RegA: + regScratch[ins.N] = regA + case RegX: + regScratch[ins.N] = regX + } + + return regScratch +} diff --git a/vendor/golang.org/x/net/http/httpguts/guts.go b/vendor/golang.org/x/net/http/httpguts/guts.go new file mode 100644 index 00000000..e6cd0ced --- /dev/null +++ b/vendor/golang.org/x/net/http/httpguts/guts.go @@ -0,0 +1,50 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package httpguts provides functions implementing various details +// of the HTTP specification. +// +// This package is shared by the standard library (which vendors it) +// and x/net/http2. It comes with no API stability promise. +package httpguts + +import ( + "net/textproto" + "strings" +) + +// ValidTrailerHeader reports whether name is a valid header field name to appear +// in trailers. +// See RFC 7230, Section 4.1.2 +func ValidTrailerHeader(name string) bool { + name = textproto.CanonicalMIMEHeaderKey(name) + if strings.HasPrefix(name, "If-") || badTrailer[name] { + return false + } + return true +} + +var badTrailer = map[string]bool{ + "Authorization": true, + "Cache-Control": true, + "Connection": true, + "Content-Encoding": true, + "Content-Length": true, + "Content-Range": true, + "Content-Type": true, + "Expect": true, + "Host": true, + "Keep-Alive": true, + "Max-Forwards": true, + "Pragma": true, + "Proxy-Authenticate": true, + "Proxy-Authorization": true, + "Proxy-Connection": true, + "Range": true, + "Realm": true, + "Te": true, + "Trailer": true, + "Transfer-Encoding": true, + "Www-Authenticate": true, +} diff --git a/vendor/golang.org/x/net/http/httpguts/httplex.go b/vendor/golang.org/x/net/http/httpguts/httplex.go new file mode 100644 index 00000000..e7de24ee --- /dev/null +++ b/vendor/golang.org/x/net/http/httpguts/httplex.go @@ -0,0 +1,346 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package httpguts + +import ( + "net" + "strings" + "unicode/utf8" + + "golang.org/x/net/idna" +) + +var isTokenTable = [127]bool{ + '!': true, + '#': true, + '$': true, + '%': true, + '&': true, + '\'': true, + '*': true, + '+': true, + '-': true, + '.': true, + '0': true, + '1': true, + '2': true, + '3': true, + '4': true, + '5': true, + '6': true, + '7': true, + '8': true, + '9': true, + 'A': true, + 'B': true, + 'C': true, + 'D': true, + 'E': true, + 'F': true, + 'G': true, + 'H': true, + 'I': true, + 'J': true, + 'K': true, + 'L': true, + 'M': true, + 'N': true, + 'O': true, + 'P': true, + 'Q': true, + 'R': true, + 'S': true, + 'T': true, + 'U': true, + 'W': true, + 'V': true, + 'X': true, + 'Y': true, + 'Z': true, + '^': true, + '_': true, + '`': true, + 'a': true, + 'b': true, + 'c': true, + 'd': true, + 'e': true, + 'f': true, + 'g': true, + 'h': true, + 'i': true, + 'j': true, + 'k': true, + 'l': true, + 'm': true, + 'n': true, + 'o': true, + 'p': true, + 'q': true, + 'r': true, + 's': true, + 't': true, + 'u': true, + 'v': true, + 'w': true, + 'x': true, + 'y': true, + 'z': true, + '|': true, + '~': true, +} + +func IsTokenRune(r rune) bool { + i := int(r) + return i < len(isTokenTable) && isTokenTable[i] +} + +func isNotToken(r rune) bool { + return !IsTokenRune(r) +} + +// HeaderValuesContainsToken reports whether any string in values +// contains the provided token, ASCII case-insensitively. +func HeaderValuesContainsToken(values []string, token string) bool { + for _, v := range values { + if headerValueContainsToken(v, token) { + return true + } + } + return false +} + +// isOWS reports whether b is an optional whitespace byte, as defined +// by RFC 7230 section 3.2.3. +func isOWS(b byte) bool { return b == ' ' || b == '\t' } + +// trimOWS returns x with all optional whitespace removes from the +// beginning and end. +func trimOWS(x string) string { + // TODO: consider using strings.Trim(x, " \t") instead, + // if and when it's fast enough. See issue 10292. + // But this ASCII-only code will probably always beat UTF-8 + // aware code. + for len(x) > 0 && isOWS(x[0]) { + x = x[1:] + } + for len(x) > 0 && isOWS(x[len(x)-1]) { + x = x[:len(x)-1] + } + return x +} + +// headerValueContainsToken reports whether v (assumed to be a +// 0#element, in the ABNF extension described in RFC 7230 section 7) +// contains token amongst its comma-separated tokens, ASCII +// case-insensitively. +func headerValueContainsToken(v string, token string) bool { + v = trimOWS(v) + if comma := strings.IndexByte(v, ','); comma != -1 { + return tokenEqual(trimOWS(v[:comma]), token) || headerValueContainsToken(v[comma+1:], token) + } + return tokenEqual(v, token) +} + +// lowerASCII returns the ASCII lowercase version of b. +func lowerASCII(b byte) byte { + if 'A' <= b && b <= 'Z' { + return b + ('a' - 'A') + } + return b +} + +// tokenEqual reports whether t1 and t2 are equal, ASCII case-insensitively. +func tokenEqual(t1, t2 string) bool { + if len(t1) != len(t2) { + return false + } + for i, b := range t1 { + if b >= utf8.RuneSelf { + // No UTF-8 or non-ASCII allowed in tokens. + return false + } + if lowerASCII(byte(b)) != lowerASCII(t2[i]) { + return false + } + } + return true +} + +// isLWS reports whether b is linear white space, according +// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 +// LWS = [CRLF] 1*( SP | HT ) +func isLWS(b byte) bool { return b == ' ' || b == '\t' } + +// isCTL reports whether b is a control byte, according +// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 +// CTL = +func isCTL(b byte) bool { + const del = 0x7f // a CTL + return b < ' ' || b == del +} + +// ValidHeaderFieldName reports whether v is a valid HTTP/1.x header name. +// HTTP/2 imposes the additional restriction that uppercase ASCII +// letters are not allowed. +// +// RFC 7230 says: +// header-field = field-name ":" OWS field-value OWS +// field-name = token +// token = 1*tchar +// tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / +// "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA +func ValidHeaderFieldName(v string) bool { + if len(v) == 0 { + return false + } + for _, r := range v { + if !IsTokenRune(r) { + return false + } + } + return true +} + +// ValidHostHeader reports whether h is a valid host header. +func ValidHostHeader(h string) bool { + // The latest spec is actually this: + // + // http://tools.ietf.org/html/rfc7230#section-5.4 + // Host = uri-host [ ":" port ] + // + // Where uri-host is: + // http://tools.ietf.org/html/rfc3986#section-3.2.2 + // + // But we're going to be much more lenient for now and just + // search for any byte that's not a valid byte in any of those + // expressions. + for i := 0; i < len(h); i++ { + if !validHostByte[h[i]] { + return false + } + } + return true +} + +// See the validHostHeader comment. +var validHostByte = [256]bool{ + '0': true, '1': true, '2': true, '3': true, '4': true, '5': true, '6': true, '7': true, + '8': true, '9': true, + + 'a': true, 'b': true, 'c': true, 'd': true, 'e': true, 'f': true, 'g': true, 'h': true, + 'i': true, 'j': true, 'k': true, 'l': true, 'm': true, 'n': true, 'o': true, 'p': true, + 'q': true, 'r': true, 's': true, 't': true, 'u': true, 'v': true, 'w': true, 'x': true, + 'y': true, 'z': true, + + 'A': true, 'B': true, 'C': true, 'D': true, 'E': true, 'F': true, 'G': true, 'H': true, + 'I': true, 'J': true, 'K': true, 'L': true, 'M': true, 'N': true, 'O': true, 'P': true, + 'Q': true, 'R': true, 'S': true, 'T': true, 'U': true, 'V': true, 'W': true, 'X': true, + 'Y': true, 'Z': true, + + '!': true, // sub-delims + '$': true, // sub-delims + '%': true, // pct-encoded (and used in IPv6 zones) + '&': true, // sub-delims + '(': true, // sub-delims + ')': true, // sub-delims + '*': true, // sub-delims + '+': true, // sub-delims + ',': true, // sub-delims + '-': true, // unreserved + '.': true, // unreserved + ':': true, // IPv6address + Host expression's optional port + ';': true, // sub-delims + '=': true, // sub-delims + '[': true, + '\'': true, // sub-delims + ']': true, + '_': true, // unreserved + '~': true, // unreserved +} + +// ValidHeaderFieldValue reports whether v is a valid "field-value" according to +// http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 : +// +// message-header = field-name ":" [ field-value ] +// field-value = *( field-content | LWS ) +// field-content = +// +// http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 : +// +// TEXT = +// LWS = [CRLF] 1*( SP | HT ) +// CTL = +// +// RFC 7230 says: +// field-value = *( field-content / obs-fold ) +// obj-fold = N/A to http2, and deprecated +// field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] +// field-vchar = VCHAR / obs-text +// obs-text = %x80-FF +// VCHAR = "any visible [USASCII] character" +// +// http2 further says: "Similarly, HTTP/2 allows header field values +// that are not valid. While most of the values that can be encoded +// will not alter header field parsing, carriage return (CR, ASCII +// 0xd), line feed (LF, ASCII 0xa), and the zero character (NUL, ASCII +// 0x0) might be exploited by an attacker if they are translated +// verbatim. Any request or response that contains a character not +// permitted in a header field value MUST be treated as malformed +// (Section 8.1.2.6). Valid characters are defined by the +// field-content ABNF rule in Section 3.2 of [RFC7230]." +// +// This function does not (yet?) properly handle the rejection of +// strings that begin or end with SP or HTAB. +func ValidHeaderFieldValue(v string) bool { + for i := 0; i < len(v); i++ { + b := v[i] + if isCTL(b) && !isLWS(b) { + return false + } + } + return true +} + +func isASCII(s string) bool { + for i := 0; i < len(s); i++ { + if s[i] >= utf8.RuneSelf { + return false + } + } + return true +} + +// PunycodeHostPort returns the IDNA Punycode version +// of the provided "host" or "host:port" string. +func PunycodeHostPort(v string) (string, error) { + if isASCII(v) { + return v, nil + } + + host, port, err := net.SplitHostPort(v) + if err != nil { + // The input 'v' argument was just a "host" argument, + // without a port. This error should not be returned + // to the caller. + host = v + port = "" + } + host, err = idna.ToASCII(host) + if err != nil { + // Non-UTF-8? Not representable in Punycode, in any + // case. + return "", err + } + if port == "" { + return host, nil + } + return net.JoinHostPort(host, port), nil +} diff --git a/vendor/golang.org/x/net/http2/.gitignore b/vendor/golang.org/x/net/http2/.gitignore new file mode 100644 index 00000000..190f1223 --- /dev/null +++ b/vendor/golang.org/x/net/http2/.gitignore @@ -0,0 +1,2 @@ +*~ +h2i/h2i diff --git a/vendor/golang.org/x/net/http2/Dockerfile b/vendor/golang.org/x/net/http2/Dockerfile new file mode 100644 index 00000000..53fc5257 --- /dev/null +++ b/vendor/golang.org/x/net/http2/Dockerfile @@ -0,0 +1,51 @@ +# +# This Dockerfile builds a recent curl with HTTP/2 client support, using +# a recent nghttp2 build. +# +# See the Makefile for how to tag it. If Docker and that image is found, the +# Go tests use this curl binary for integration tests. +# + +FROM ubuntu:trusty + +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y git-core build-essential wget + +RUN apt-get install -y --no-install-recommends \ + autotools-dev libtool pkg-config zlib1g-dev \ + libcunit1-dev libssl-dev libxml2-dev libevent-dev \ + automake autoconf + +# The list of packages nghttp2 recommends for h2load: +RUN apt-get install -y --no-install-recommends make binutils \ + autoconf automake autotools-dev \ + libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev \ + libev-dev libevent-dev libjansson-dev libjemalloc-dev \ + cython python3.4-dev python-setuptools + +# Note: setting NGHTTP2_VER before the git clone, so an old git clone isn't cached: +ENV NGHTTP2_VER 895da9a +RUN cd /root && git clone https://github.com/tatsuhiro-t/nghttp2.git + +WORKDIR /root/nghttp2 +RUN git reset --hard $NGHTTP2_VER +RUN autoreconf -i +RUN automake +RUN autoconf +RUN ./configure +RUN make +RUN make install + +WORKDIR /root +RUN wget http://curl.haxx.se/download/curl-7.45.0.tar.gz +RUN tar -zxvf curl-7.45.0.tar.gz +WORKDIR /root/curl-7.45.0 +RUN ./configure --with-ssl --with-nghttp2=/usr/local +RUN make +RUN make install +RUN ldconfig + +CMD ["-h"] +ENTRYPOINT ["/usr/local/bin/curl"] + diff --git a/vendor/golang.org/x/net/http2/Makefile b/vendor/golang.org/x/net/http2/Makefile new file mode 100644 index 00000000..55fd826f --- /dev/null +++ b/vendor/golang.org/x/net/http2/Makefile @@ -0,0 +1,3 @@ +curlimage: + docker build -t gohttp2/curl . + diff --git a/vendor/golang.org/x/net/http2/README b/vendor/golang.org/x/net/http2/README new file mode 100644 index 00000000..360d5aa3 --- /dev/null +++ b/vendor/golang.org/x/net/http2/README @@ -0,0 +1,20 @@ +This is a work-in-progress HTTP/2 implementation for Go. + +It will eventually live in the Go standard library and won't require +any changes to your code to use. It will just be automatic. + +Status: + +* The server support is pretty good. A few things are missing + but are being worked on. +* The client work has just started but shares a lot of code + is coming along much quicker. + +Docs are at https://godoc.org/golang.org/x/net/http2 + +Demo test server at https://http2.golang.org/ + +Help & bug reports welcome! + +Contributing: https://golang.org/doc/contribute.html +Bugs: https://golang.org/issue/new?title=x/net/http2:+ diff --git a/vendor/golang.org/x/net/http2/ciphers.go b/vendor/golang.org/x/net/http2/ciphers.go new file mode 100644 index 00000000..c9a0cf3b --- /dev/null +++ b/vendor/golang.org/x/net/http2/ciphers.go @@ -0,0 +1,641 @@ +// 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. + +package http2 + +// A list of the possible cipher suite ids. Taken from +// https://www.iana.org/assignments/tls-parameters/tls-parameters.txt + +const ( + cipher_TLS_NULL_WITH_NULL_NULL uint16 = 0x0000 + cipher_TLS_RSA_WITH_NULL_MD5 uint16 = 0x0001 + cipher_TLS_RSA_WITH_NULL_SHA uint16 = 0x0002 + cipher_TLS_RSA_EXPORT_WITH_RC4_40_MD5 uint16 = 0x0003 + cipher_TLS_RSA_WITH_RC4_128_MD5 uint16 = 0x0004 + cipher_TLS_RSA_WITH_RC4_128_SHA uint16 = 0x0005 + cipher_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 uint16 = 0x0006 + cipher_TLS_RSA_WITH_IDEA_CBC_SHA uint16 = 0x0007 + cipher_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0008 + cipher_TLS_RSA_WITH_DES_CBC_SHA uint16 = 0x0009 + cipher_TLS_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x000A + cipher_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x000B + cipher_TLS_DH_DSS_WITH_DES_CBC_SHA uint16 = 0x000C + cipher_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA uint16 = 0x000D + cipher_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x000E + cipher_TLS_DH_RSA_WITH_DES_CBC_SHA uint16 = 0x000F + cipher_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x0010 + cipher_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0011 + cipher_TLS_DHE_DSS_WITH_DES_CBC_SHA uint16 = 0x0012 + cipher_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA uint16 = 0x0013 + cipher_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0014 + cipher_TLS_DHE_RSA_WITH_DES_CBC_SHA uint16 = 0x0015 + cipher_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x0016 + cipher_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 uint16 = 0x0017 + cipher_TLS_DH_anon_WITH_RC4_128_MD5 uint16 = 0x0018 + cipher_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0019 + cipher_TLS_DH_anon_WITH_DES_CBC_SHA uint16 = 0x001A + cipher_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA uint16 = 0x001B + // Reserved uint16 = 0x001C-1D + cipher_TLS_KRB5_WITH_DES_CBC_SHA uint16 = 0x001E + cipher_TLS_KRB5_WITH_3DES_EDE_CBC_SHA uint16 = 0x001F + cipher_TLS_KRB5_WITH_RC4_128_SHA uint16 = 0x0020 + cipher_TLS_KRB5_WITH_IDEA_CBC_SHA uint16 = 0x0021 + cipher_TLS_KRB5_WITH_DES_CBC_MD5 uint16 = 0x0022 + cipher_TLS_KRB5_WITH_3DES_EDE_CBC_MD5 uint16 = 0x0023 + cipher_TLS_KRB5_WITH_RC4_128_MD5 uint16 = 0x0024 + cipher_TLS_KRB5_WITH_IDEA_CBC_MD5 uint16 = 0x0025 + cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA uint16 = 0x0026 + cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA uint16 = 0x0027 + cipher_TLS_KRB5_EXPORT_WITH_RC4_40_SHA uint16 = 0x0028 + cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 uint16 = 0x0029 + cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5 uint16 = 0x002A + cipher_TLS_KRB5_EXPORT_WITH_RC4_40_MD5 uint16 = 0x002B + cipher_TLS_PSK_WITH_NULL_SHA uint16 = 0x002C + cipher_TLS_DHE_PSK_WITH_NULL_SHA uint16 = 0x002D + cipher_TLS_RSA_PSK_WITH_NULL_SHA uint16 = 0x002E + cipher_TLS_RSA_WITH_AES_128_CBC_SHA uint16 = 0x002F + cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA uint16 = 0x0030 + cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA uint16 = 0x0031 + cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA uint16 = 0x0032 + cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA uint16 = 0x0033 + cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA uint16 = 0x0034 + cipher_TLS_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0035 + cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA uint16 = 0x0036 + cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0037 + cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA uint16 = 0x0038 + cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0039 + cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA uint16 = 0x003A + cipher_TLS_RSA_WITH_NULL_SHA256 uint16 = 0x003B + cipher_TLS_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x003C + cipher_TLS_RSA_WITH_AES_256_CBC_SHA256 uint16 = 0x003D + cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA256 uint16 = 0x003E + cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x003F + cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 uint16 = 0x0040 + cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0041 + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0042 + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0043 + cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0044 + cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0045 + cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0046 + // Reserved uint16 = 0x0047-4F + // Reserved uint16 = 0x0050-58 + // Reserved uint16 = 0x0059-5C + // Unassigned uint16 = 0x005D-5F + // Reserved uint16 = 0x0060-66 + cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x0067 + cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA256 uint16 = 0x0068 + cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA256 uint16 = 0x0069 + cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 uint16 = 0x006A + cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 uint16 = 0x006B + cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA256 uint16 = 0x006C + cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA256 uint16 = 0x006D + // Unassigned uint16 = 0x006E-83 + cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0084 + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0085 + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0086 + cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0087 + cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0088 + cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0089 + cipher_TLS_PSK_WITH_RC4_128_SHA uint16 = 0x008A + cipher_TLS_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0x008B + cipher_TLS_PSK_WITH_AES_128_CBC_SHA uint16 = 0x008C + cipher_TLS_PSK_WITH_AES_256_CBC_SHA uint16 = 0x008D + cipher_TLS_DHE_PSK_WITH_RC4_128_SHA uint16 = 0x008E + cipher_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0x008F + cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA uint16 = 0x0090 + cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA uint16 = 0x0091 + cipher_TLS_RSA_PSK_WITH_RC4_128_SHA uint16 = 0x0092 + cipher_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0x0093 + cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA uint16 = 0x0094 + cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA uint16 = 0x0095 + cipher_TLS_RSA_WITH_SEED_CBC_SHA uint16 = 0x0096 + cipher_TLS_DH_DSS_WITH_SEED_CBC_SHA uint16 = 0x0097 + cipher_TLS_DH_RSA_WITH_SEED_CBC_SHA uint16 = 0x0098 + cipher_TLS_DHE_DSS_WITH_SEED_CBC_SHA uint16 = 0x0099 + cipher_TLS_DHE_RSA_WITH_SEED_CBC_SHA uint16 = 0x009A + cipher_TLS_DH_anon_WITH_SEED_CBC_SHA uint16 = 0x009B + cipher_TLS_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x009C + cipher_TLS_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x009D + cipher_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x009E + cipher_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x009F + cipher_TLS_DH_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x00A0 + cipher_TLS_DH_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x00A1 + cipher_TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 uint16 = 0x00A2 + cipher_TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 uint16 = 0x00A3 + cipher_TLS_DH_DSS_WITH_AES_128_GCM_SHA256 uint16 = 0x00A4 + cipher_TLS_DH_DSS_WITH_AES_256_GCM_SHA384 uint16 = 0x00A5 + cipher_TLS_DH_anon_WITH_AES_128_GCM_SHA256 uint16 = 0x00A6 + cipher_TLS_DH_anon_WITH_AES_256_GCM_SHA384 uint16 = 0x00A7 + cipher_TLS_PSK_WITH_AES_128_GCM_SHA256 uint16 = 0x00A8 + cipher_TLS_PSK_WITH_AES_256_GCM_SHA384 uint16 = 0x00A9 + cipher_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 uint16 = 0x00AA + cipher_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 uint16 = 0x00AB + cipher_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 uint16 = 0x00AC + cipher_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 uint16 = 0x00AD + cipher_TLS_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0x00AE + cipher_TLS_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0x00AF + cipher_TLS_PSK_WITH_NULL_SHA256 uint16 = 0x00B0 + cipher_TLS_PSK_WITH_NULL_SHA384 uint16 = 0x00B1 + cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0x00B2 + cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0x00B3 + cipher_TLS_DHE_PSK_WITH_NULL_SHA256 uint16 = 0x00B4 + cipher_TLS_DHE_PSK_WITH_NULL_SHA384 uint16 = 0x00B5 + cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0x00B6 + cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0x00B7 + cipher_TLS_RSA_PSK_WITH_NULL_SHA256 uint16 = 0x00B8 + cipher_TLS_RSA_PSK_WITH_NULL_SHA384 uint16 = 0x00B9 + cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BA + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BB + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BC + cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BD + cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BE + cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BF + cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C0 + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C1 + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C2 + cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C3 + cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C4 + cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C5 + // Unassigned uint16 = 0x00C6-FE + cipher_TLS_EMPTY_RENEGOTIATION_INFO_SCSV uint16 = 0x00FF + // Unassigned uint16 = 0x01-55,* + cipher_TLS_FALLBACK_SCSV uint16 = 0x5600 + // Unassigned uint16 = 0x5601 - 0xC000 + cipher_TLS_ECDH_ECDSA_WITH_NULL_SHA uint16 = 0xC001 + cipher_TLS_ECDH_ECDSA_WITH_RC4_128_SHA uint16 = 0xC002 + cipher_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC003 + cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA uint16 = 0xC004 + cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA uint16 = 0xC005 + cipher_TLS_ECDHE_ECDSA_WITH_NULL_SHA uint16 = 0xC006 + cipher_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA uint16 = 0xC007 + cipher_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC008 + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA uint16 = 0xC009 + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA uint16 = 0xC00A + cipher_TLS_ECDH_RSA_WITH_NULL_SHA uint16 = 0xC00B + cipher_TLS_ECDH_RSA_WITH_RC4_128_SHA uint16 = 0xC00C + cipher_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC00D + cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA uint16 = 0xC00E + cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA uint16 = 0xC00F + cipher_TLS_ECDHE_RSA_WITH_NULL_SHA uint16 = 0xC010 + cipher_TLS_ECDHE_RSA_WITH_RC4_128_SHA uint16 = 0xC011 + cipher_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC012 + cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA uint16 = 0xC013 + cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA uint16 = 0xC014 + cipher_TLS_ECDH_anon_WITH_NULL_SHA uint16 = 0xC015 + cipher_TLS_ECDH_anon_WITH_RC4_128_SHA uint16 = 0xC016 + cipher_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA uint16 = 0xC017 + cipher_TLS_ECDH_anon_WITH_AES_128_CBC_SHA uint16 = 0xC018 + cipher_TLS_ECDH_anon_WITH_AES_256_CBC_SHA uint16 = 0xC019 + cipher_TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC01A + cipher_TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC01B + cipher_TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA uint16 = 0xC01C + cipher_TLS_SRP_SHA_WITH_AES_128_CBC_SHA uint16 = 0xC01D + cipher_TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA uint16 = 0xC01E + cipher_TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA uint16 = 0xC01F + cipher_TLS_SRP_SHA_WITH_AES_256_CBC_SHA uint16 = 0xC020 + cipher_TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA uint16 = 0xC021 + cipher_TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA uint16 = 0xC022 + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC023 + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC024 + cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC025 + cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC026 + cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC027 + cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC028 + cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC029 + cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC02A + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC02B + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC02C + cipher_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC02D + cipher_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC02E + cipher_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC02F + cipher_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC030 + cipher_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC031 + cipher_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC032 + cipher_TLS_ECDHE_PSK_WITH_RC4_128_SHA uint16 = 0xC033 + cipher_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0xC034 + cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA uint16 = 0xC035 + cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA uint16 = 0xC036 + cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0xC037 + cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0xC038 + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA uint16 = 0xC039 + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA256 uint16 = 0xC03A + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA384 uint16 = 0xC03B + cipher_TLS_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC03C + cipher_TLS_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC03D + cipher_TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC03E + cipher_TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC03F + cipher_TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC040 + cipher_TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC041 + cipher_TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC042 + cipher_TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC043 + cipher_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC044 + cipher_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC045 + cipher_TLS_DH_anon_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC046 + cipher_TLS_DH_anon_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC047 + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC048 + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC049 + cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC04A + cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC04B + cipher_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC04C + cipher_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC04D + cipher_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC04E + cipher_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC04F + cipher_TLS_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC050 + cipher_TLS_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC051 + cipher_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC052 + cipher_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC053 + cipher_TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC054 + cipher_TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC055 + cipher_TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC056 + cipher_TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC057 + cipher_TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC058 + cipher_TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC059 + cipher_TLS_DH_anon_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC05A + cipher_TLS_DH_anon_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC05B + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC05C + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC05D + cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC05E + cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC05F + cipher_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC060 + cipher_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC061 + cipher_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC062 + cipher_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC063 + cipher_TLS_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC064 + cipher_TLS_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC065 + cipher_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC066 + cipher_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC067 + cipher_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC068 + cipher_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC069 + cipher_TLS_PSK_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC06A + cipher_TLS_PSK_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC06B + cipher_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC06C + cipher_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC06D + cipher_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC06E + cipher_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC06F + cipher_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC070 + cipher_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC071 + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC072 + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC073 + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC074 + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC075 + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC076 + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC077 + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC078 + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC079 + cipher_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC07A + cipher_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC07B + cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC07C + cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC07D + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC07E + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC07F + cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC080 + cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC081 + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC082 + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC083 + cipher_TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC084 + cipher_TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC085 + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC086 + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC087 + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC088 + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC089 + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC08A + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC08B + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC08C + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC08D + cipher_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC08E + cipher_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC08F + cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC090 + cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC091 + cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC092 + cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC093 + cipher_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC094 + cipher_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC095 + cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC096 + cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC097 + cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC098 + cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC099 + cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC09A + cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC09B + cipher_TLS_RSA_WITH_AES_128_CCM uint16 = 0xC09C + cipher_TLS_RSA_WITH_AES_256_CCM uint16 = 0xC09D + cipher_TLS_DHE_RSA_WITH_AES_128_CCM uint16 = 0xC09E + cipher_TLS_DHE_RSA_WITH_AES_256_CCM uint16 = 0xC09F + cipher_TLS_RSA_WITH_AES_128_CCM_8 uint16 = 0xC0A0 + cipher_TLS_RSA_WITH_AES_256_CCM_8 uint16 = 0xC0A1 + cipher_TLS_DHE_RSA_WITH_AES_128_CCM_8 uint16 = 0xC0A2 + cipher_TLS_DHE_RSA_WITH_AES_256_CCM_8 uint16 = 0xC0A3 + cipher_TLS_PSK_WITH_AES_128_CCM uint16 = 0xC0A4 + cipher_TLS_PSK_WITH_AES_256_CCM uint16 = 0xC0A5 + cipher_TLS_DHE_PSK_WITH_AES_128_CCM uint16 = 0xC0A6 + cipher_TLS_DHE_PSK_WITH_AES_256_CCM uint16 = 0xC0A7 + cipher_TLS_PSK_WITH_AES_128_CCM_8 uint16 = 0xC0A8 + cipher_TLS_PSK_WITH_AES_256_CCM_8 uint16 = 0xC0A9 + cipher_TLS_PSK_DHE_WITH_AES_128_CCM_8 uint16 = 0xC0AA + cipher_TLS_PSK_DHE_WITH_AES_256_CCM_8 uint16 = 0xC0AB + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CCM uint16 = 0xC0AC + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CCM uint16 = 0xC0AD + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 uint16 = 0xC0AE + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 uint16 = 0xC0AF + // Unassigned uint16 = 0xC0B0-FF + // Unassigned uint16 = 0xC1-CB,* + // Unassigned uint16 = 0xCC00-A7 + cipher_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCA8 + cipher_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCA9 + cipher_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAA + cipher_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAB + cipher_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAC + cipher_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAD + cipher_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAE +) + +// isBadCipher reports whether the cipher is blacklisted by the HTTP/2 spec. +// References: +// https://tools.ietf.org/html/rfc7540#appendix-A +// Reject cipher suites from Appendix A. +// "This list includes those cipher suites that do not +// offer an ephemeral key exchange and those that are +// based on the TLS null, stream or block cipher type" +func isBadCipher(cipher uint16) bool { + switch cipher { + case cipher_TLS_NULL_WITH_NULL_NULL, + cipher_TLS_RSA_WITH_NULL_MD5, + cipher_TLS_RSA_WITH_NULL_SHA, + cipher_TLS_RSA_EXPORT_WITH_RC4_40_MD5, + cipher_TLS_RSA_WITH_RC4_128_MD5, + cipher_TLS_RSA_WITH_RC4_128_SHA, + cipher_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5, + cipher_TLS_RSA_WITH_IDEA_CBC_SHA, + cipher_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_RSA_WITH_DES_CBC_SHA, + cipher_TLS_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_DH_DSS_WITH_DES_CBC_SHA, + cipher_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_DH_RSA_WITH_DES_CBC_SHA, + cipher_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_DES_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_DES_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5, + cipher_TLS_DH_anon_WITH_RC4_128_MD5, + cipher_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_DH_anon_WITH_DES_CBC_SHA, + cipher_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_KRB5_WITH_DES_CBC_SHA, + cipher_TLS_KRB5_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_KRB5_WITH_RC4_128_SHA, + cipher_TLS_KRB5_WITH_IDEA_CBC_SHA, + cipher_TLS_KRB5_WITH_DES_CBC_MD5, + cipher_TLS_KRB5_WITH_3DES_EDE_CBC_MD5, + cipher_TLS_KRB5_WITH_RC4_128_MD5, + cipher_TLS_KRB5_WITH_IDEA_CBC_MD5, + cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA, + cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA, + cipher_TLS_KRB5_EXPORT_WITH_RC4_40_SHA, + cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5, + cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5, + cipher_TLS_KRB5_EXPORT_WITH_RC4_40_MD5, + cipher_TLS_PSK_WITH_NULL_SHA, + cipher_TLS_DHE_PSK_WITH_NULL_SHA, + cipher_TLS_RSA_PSK_WITH_NULL_SHA, + cipher_TLS_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA, + cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA, + cipher_TLS_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA, + cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA, + cipher_TLS_RSA_WITH_NULL_SHA256, + cipher_TLS_RSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_RSA_WITH_AES_256_CBC_SHA256, + cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA256, + cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA256, + cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA256, + cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA256, + cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA256, + cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_PSK_WITH_RC4_128_SHA, + cipher_TLS_PSK_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_PSK_WITH_AES_128_CBC_SHA, + cipher_TLS_PSK_WITH_AES_256_CBC_SHA, + cipher_TLS_DHE_PSK_WITH_RC4_128_SHA, + cipher_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, + cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, + cipher_TLS_RSA_PSK_WITH_RC4_128_SHA, + cipher_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, + cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, + cipher_TLS_RSA_WITH_SEED_CBC_SHA, + cipher_TLS_DH_DSS_WITH_SEED_CBC_SHA, + cipher_TLS_DH_RSA_WITH_SEED_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_SEED_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_SEED_CBC_SHA, + cipher_TLS_DH_anon_WITH_SEED_CBC_SHA, + cipher_TLS_RSA_WITH_AES_128_GCM_SHA256, + cipher_TLS_RSA_WITH_AES_256_GCM_SHA384, + cipher_TLS_DH_RSA_WITH_AES_128_GCM_SHA256, + cipher_TLS_DH_RSA_WITH_AES_256_GCM_SHA384, + cipher_TLS_DH_DSS_WITH_AES_128_GCM_SHA256, + cipher_TLS_DH_DSS_WITH_AES_256_GCM_SHA384, + cipher_TLS_DH_anon_WITH_AES_128_GCM_SHA256, + cipher_TLS_DH_anon_WITH_AES_256_GCM_SHA384, + cipher_TLS_PSK_WITH_AES_128_GCM_SHA256, + cipher_TLS_PSK_WITH_AES_256_GCM_SHA384, + cipher_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, + cipher_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, + cipher_TLS_PSK_WITH_AES_128_CBC_SHA256, + cipher_TLS_PSK_WITH_AES_256_CBC_SHA384, + cipher_TLS_PSK_WITH_NULL_SHA256, + cipher_TLS_PSK_WITH_NULL_SHA384, + cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, + cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, + cipher_TLS_DHE_PSK_WITH_NULL_SHA256, + cipher_TLS_DHE_PSK_WITH_NULL_SHA384, + cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, + cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, + cipher_TLS_RSA_PSK_WITH_NULL_SHA256, + cipher_TLS_RSA_PSK_WITH_NULL_SHA384, + cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_EMPTY_RENEGOTIATION_INFO_SCSV, + cipher_TLS_ECDH_ECDSA_WITH_NULL_SHA, + cipher_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, + cipher_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_NULL_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDH_RSA_WITH_NULL_SHA, + cipher_TLS_ECDH_RSA_WITH_RC4_128_SHA, + cipher_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDHE_RSA_WITH_NULL_SHA, + cipher_TLS_ECDHE_RSA_WITH_RC4_128_SHA, + cipher_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDH_anon_WITH_NULL_SHA, + cipher_TLS_ECDH_anon_WITH_RC4_128_SHA, + cipher_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDH_anon_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDH_anon_WITH_AES_256_CBC_SHA, + cipher_TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_SRP_SHA_WITH_AES_128_CBC_SHA, + cipher_TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA, + cipher_TLS_SRP_SHA_WITH_AES_256_CBC_SHA, + cipher_TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, + cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, + cipher_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, + cipher_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, + cipher_TLS_ECDHE_PSK_WITH_RC4_128_SHA, + cipher_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, + cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA, + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA256, + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA384, + cipher_TLS_RSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_RSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DH_anon_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DH_anon_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_RSA_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_RSA_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_DH_anon_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_DH_anon_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_PSK_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_PSK_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_PSK_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_PSK_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_RSA_WITH_AES_128_CCM, + cipher_TLS_RSA_WITH_AES_256_CCM, + cipher_TLS_RSA_WITH_AES_128_CCM_8, + cipher_TLS_RSA_WITH_AES_256_CCM_8, + cipher_TLS_PSK_WITH_AES_128_CCM, + cipher_TLS_PSK_WITH_AES_256_CCM, + cipher_TLS_PSK_WITH_AES_128_CCM_8, + cipher_TLS_PSK_WITH_AES_256_CCM_8: + return true + default: + return false + } +} diff --git a/vendor/golang.org/x/net/http2/client_conn_pool.go b/vendor/golang.org/x/net/http2/client_conn_pool.go new file mode 100644 index 00000000..3a67636f --- /dev/null +++ b/vendor/golang.org/x/net/http2/client_conn_pool.go @@ -0,0 +1,278 @@ +// 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. + +// Transport code's client connection pooling. + +package http2 + +import ( + "crypto/tls" + "net/http" + "sync" +) + +// ClientConnPool manages a pool of HTTP/2 client connections. +type ClientConnPool interface { + GetClientConn(req *http.Request, addr string) (*ClientConn, error) + MarkDead(*ClientConn) +} + +// clientConnPoolIdleCloser is the interface implemented by ClientConnPool +// implementations which can close their idle connections. +type clientConnPoolIdleCloser interface { + ClientConnPool + closeIdleConnections() +} + +var ( + _ clientConnPoolIdleCloser = (*clientConnPool)(nil) + _ clientConnPoolIdleCloser = noDialClientConnPool{} +) + +// TODO: use singleflight for dialing and addConnCalls? +type clientConnPool struct { + t *Transport + + mu sync.Mutex // TODO: maybe switch to RWMutex + // TODO: add support for sharing conns based on cert names + // (e.g. share conn for googleapis.com and appspot.com) + conns map[string][]*ClientConn // key is host:port + dialing map[string]*dialCall // currently in-flight dials + keys map[*ClientConn][]string + addConnCalls map[string]*addConnCall // in-flight addConnIfNeede calls +} + +func (p *clientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) { + return p.getClientConn(req, addr, dialOnMiss) +} + +const ( + dialOnMiss = true + noDialOnMiss = false +) + +// shouldTraceGetConn reports whether getClientConn should call any +// ClientTrace.GetConn hook associated with the http.Request. +// +// This complexity is needed to avoid double calls of the GetConn hook +// during the back-and-forth between net/http and x/net/http2 (when the +// net/http.Transport is upgraded to also speak http2), as well as support +// the case where x/net/http2 is being used directly. +func (p *clientConnPool) shouldTraceGetConn(st clientConnIdleState) bool { + // If our Transport wasn't made via ConfigureTransport, always + // trace the GetConn hook if provided, because that means the + // http2 package is being used directly and it's the one + // dialing, as opposed to net/http. + if _, ok := p.t.ConnPool.(noDialClientConnPool); !ok { + return true + } + // Otherwise, only use the GetConn hook if this connection has + // been used previously for other requests. For fresh + // connections, the net/http package does the dialing. + return !st.freshConn +} + +func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMiss bool) (*ClientConn, error) { + if isConnectionCloseRequest(req) && dialOnMiss { + // It gets its own connection. + traceGetConn(req, addr) + const singleUse = true + cc, err := p.t.dialClientConn(addr, singleUse) + if err != nil { + return nil, err + } + return cc, nil + } + p.mu.Lock() + for _, cc := range p.conns[addr] { + if st := cc.idleState(); st.canTakeNewRequest { + if p.shouldTraceGetConn(st) { + traceGetConn(req, addr) + } + p.mu.Unlock() + return cc, nil + } + } + if !dialOnMiss { + p.mu.Unlock() + return nil, ErrNoCachedConn + } + traceGetConn(req, addr) + call := p.getStartDialLocked(addr) + p.mu.Unlock() + <-call.done + return call.res, call.err +} + +// dialCall is an in-flight Transport dial call to a host. +type dialCall struct { + _ incomparable + p *clientConnPool + done chan struct{} // closed when done + res *ClientConn // valid after done is closed + err error // valid after done is closed +} + +// requires p.mu is held. +func (p *clientConnPool) getStartDialLocked(addr string) *dialCall { + if call, ok := p.dialing[addr]; ok { + // A dial is already in-flight. Don't start another. + return call + } + call := &dialCall{p: p, done: make(chan struct{})} + if p.dialing == nil { + p.dialing = make(map[string]*dialCall) + } + p.dialing[addr] = call + go call.dial(addr) + return call +} + +// run in its own goroutine. +func (c *dialCall) dial(addr string) { + const singleUse = false // shared conn + c.res, c.err = c.p.t.dialClientConn(addr, singleUse) + close(c.done) + + c.p.mu.Lock() + delete(c.p.dialing, addr) + if c.err == nil { + c.p.addConnLocked(addr, c.res) + } + c.p.mu.Unlock() +} + +// addConnIfNeeded makes a NewClientConn out of c if a connection for key doesn't +// already exist. It coalesces concurrent calls with the same key. +// This is used by the http1 Transport code when it creates a new connection. Because +// the http1 Transport doesn't de-dup TCP dials to outbound hosts (because it doesn't know +// the protocol), it can get into a situation where it has multiple TLS connections. +// This code decides which ones live or die. +// The return value used is whether c was used. +// c is never closed. +func (p *clientConnPool) addConnIfNeeded(key string, t *Transport, c *tls.Conn) (used bool, err error) { + p.mu.Lock() + for _, cc := range p.conns[key] { + if cc.CanTakeNewRequest() { + p.mu.Unlock() + return false, nil + } + } + call, dup := p.addConnCalls[key] + if !dup { + if p.addConnCalls == nil { + p.addConnCalls = make(map[string]*addConnCall) + } + call = &addConnCall{ + p: p, + done: make(chan struct{}), + } + p.addConnCalls[key] = call + go call.run(t, key, c) + } + p.mu.Unlock() + + <-call.done + if call.err != nil { + return false, call.err + } + return !dup, nil +} + +type addConnCall struct { + _ incomparable + p *clientConnPool + done chan struct{} // closed when done + err error +} + +func (c *addConnCall) run(t *Transport, key string, tc *tls.Conn) { + cc, err := t.NewClientConn(tc) + + p := c.p + p.mu.Lock() + if err != nil { + c.err = err + } else { + p.addConnLocked(key, cc) + } + delete(p.addConnCalls, key) + p.mu.Unlock() + close(c.done) +} + +// p.mu must be held +func (p *clientConnPool) addConnLocked(key string, cc *ClientConn) { + for _, v := range p.conns[key] { + if v == cc { + return + } + } + if p.conns == nil { + p.conns = make(map[string][]*ClientConn) + } + if p.keys == nil { + p.keys = make(map[*ClientConn][]string) + } + p.conns[key] = append(p.conns[key], cc) + p.keys[cc] = append(p.keys[cc], key) +} + +func (p *clientConnPool) MarkDead(cc *ClientConn) { + p.mu.Lock() + defer p.mu.Unlock() + for _, key := range p.keys[cc] { + vv, ok := p.conns[key] + if !ok { + continue + } + newList := filterOutClientConn(vv, cc) + if len(newList) > 0 { + p.conns[key] = newList + } else { + delete(p.conns, key) + } + } + delete(p.keys, cc) +} + +func (p *clientConnPool) closeIdleConnections() { + p.mu.Lock() + defer p.mu.Unlock() + // TODO: don't close a cc if it was just added to the pool + // milliseconds ago and has never been used. There's currently + // a small race window with the HTTP/1 Transport's integration + // where it can add an idle conn just before using it, and + // somebody else can concurrently call CloseIdleConns and + // break some caller's RoundTrip. + for _, vv := range p.conns { + for _, cc := range vv { + cc.closeIfIdle() + } + } +} + +func filterOutClientConn(in []*ClientConn, exclude *ClientConn) []*ClientConn { + out := in[:0] + for _, v := range in { + if v != exclude { + out = append(out, v) + } + } + // If we filtered it out, zero out the last item to prevent + // the GC from seeing it. + if len(in) != len(out) { + in[len(in)-1] = nil + } + return out +} + +// noDialClientConnPool is an implementation of http2.ClientConnPool +// which never dials. We let the HTTP/1.1 client dial and use its TLS +// connection instead. +type noDialClientConnPool struct{ *clientConnPool } + +func (p noDialClientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) { + return p.getClientConn(req, addr, noDialOnMiss) +} diff --git a/vendor/golang.org/x/net/http2/databuffer.go b/vendor/golang.org/x/net/http2/databuffer.go new file mode 100644 index 00000000..a3067f8d --- /dev/null +++ b/vendor/golang.org/x/net/http2/databuffer.go @@ -0,0 +1,146 @@ +// 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 http2 + +import ( + "errors" + "fmt" + "sync" +) + +// Buffer chunks are allocated from a pool to reduce pressure on GC. +// The maximum wasted space per dataBuffer is 2x the largest size class, +// which happens when the dataBuffer has multiple chunks and there is +// one unread byte in both the first and last chunks. We use a few size +// classes to minimize overheads for servers that typically receive very +// small request bodies. +// +// TODO: Benchmark to determine if the pools are necessary. The GC may have +// improved enough that we can instead allocate chunks like this: +// make([]byte, max(16<<10, expectedBytesRemaining)) +var ( + dataChunkSizeClasses = []int{ + 1 << 10, + 2 << 10, + 4 << 10, + 8 << 10, + 16 << 10, + } + dataChunkPools = [...]sync.Pool{ + {New: func() interface{} { return make([]byte, 1<<10) }}, + {New: func() interface{} { return make([]byte, 2<<10) }}, + {New: func() interface{} { return make([]byte, 4<<10) }}, + {New: func() interface{} { return make([]byte, 8<<10) }}, + {New: func() interface{} { return make([]byte, 16<<10) }}, + } +) + +func getDataBufferChunk(size int64) []byte { + i := 0 + for ; i < len(dataChunkSizeClasses)-1; i++ { + if size <= int64(dataChunkSizeClasses[i]) { + break + } + } + return dataChunkPools[i].Get().([]byte) +} + +func putDataBufferChunk(p []byte) { + for i, n := range dataChunkSizeClasses { + if len(p) == n { + dataChunkPools[i].Put(p) + return + } + } + panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) +} + +// dataBuffer is an io.ReadWriter backed by a list of data chunks. +// Each dataBuffer is used to read DATA frames on a single stream. +// The buffer is divided into chunks so the server can limit the +// total memory used by a single connection without limiting the +// request body size on any single stream. +type dataBuffer struct { + chunks [][]byte + r int // next byte to read is chunks[0][r] + w int // next byte to write is chunks[len(chunks)-1][w] + size int // total buffered bytes + expected int64 // we expect at least this many bytes in future Write calls (ignored if <= 0) +} + +var errReadEmpty = errors.New("read from empty dataBuffer") + +// Read copies bytes from the buffer into p. +// It is an error to read when no data is available. +func (b *dataBuffer) Read(p []byte) (int, error) { + if b.size == 0 { + return 0, errReadEmpty + } + var ntotal int + for len(p) > 0 && b.size > 0 { + readFrom := b.bytesFromFirstChunk() + n := copy(p, readFrom) + p = p[n:] + ntotal += n + b.r += n + b.size -= n + // If the first chunk has been consumed, advance to the next chunk. + if b.r == len(b.chunks[0]) { + putDataBufferChunk(b.chunks[0]) + end := len(b.chunks) - 1 + copy(b.chunks[:end], b.chunks[1:]) + b.chunks[end] = nil + b.chunks = b.chunks[:end] + b.r = 0 + } + } + return ntotal, nil +} + +func (b *dataBuffer) bytesFromFirstChunk() []byte { + if len(b.chunks) == 1 { + return b.chunks[0][b.r:b.w] + } + return b.chunks[0][b.r:] +} + +// Len returns the number of bytes of the unread portion of the buffer. +func (b *dataBuffer) Len() int { + return b.size +} + +// Write appends p to the buffer. +func (b *dataBuffer) Write(p []byte) (int, error) { + ntotal := len(p) + for len(p) > 0 { + // If the last chunk is empty, allocate a new chunk. Try to allocate + // enough to fully copy p plus any additional bytes we expect to + // receive. However, this may allocate less than len(p). + want := int64(len(p)) + if b.expected > want { + want = b.expected + } + chunk := b.lastChunkOrAlloc(want) + n := copy(chunk[b.w:], p) + p = p[n:] + b.w += n + b.size += n + b.expected -= int64(n) + } + return ntotal, nil +} + +func (b *dataBuffer) lastChunkOrAlloc(want int64) []byte { + if len(b.chunks) != 0 { + last := b.chunks[len(b.chunks)-1] + if b.w < len(last) { + return last + } + } + chunk := getDataBufferChunk(want) + b.chunks = append(b.chunks, chunk) + b.w = 0 + return chunk +} diff --git a/vendor/golang.org/x/net/http2/errors.go b/vendor/golang.org/x/net/http2/errors.go new file mode 100644 index 00000000..71f2c463 --- /dev/null +++ b/vendor/golang.org/x/net/http2/errors.go @@ -0,0 +1,133 @@ +// 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 http2 + +import ( + "errors" + "fmt" +) + +// An ErrCode is an unsigned 32-bit error code as defined in the HTTP/2 spec. +type ErrCode uint32 + +const ( + ErrCodeNo ErrCode = 0x0 + ErrCodeProtocol ErrCode = 0x1 + ErrCodeInternal ErrCode = 0x2 + ErrCodeFlowControl ErrCode = 0x3 + ErrCodeSettingsTimeout ErrCode = 0x4 + ErrCodeStreamClosed ErrCode = 0x5 + ErrCodeFrameSize ErrCode = 0x6 + ErrCodeRefusedStream ErrCode = 0x7 + ErrCodeCancel ErrCode = 0x8 + ErrCodeCompression ErrCode = 0x9 + ErrCodeConnect ErrCode = 0xa + ErrCodeEnhanceYourCalm ErrCode = 0xb + ErrCodeInadequateSecurity ErrCode = 0xc + ErrCodeHTTP11Required ErrCode = 0xd +) + +var errCodeName = map[ErrCode]string{ + ErrCodeNo: "NO_ERROR", + ErrCodeProtocol: "PROTOCOL_ERROR", + ErrCodeInternal: "INTERNAL_ERROR", + ErrCodeFlowControl: "FLOW_CONTROL_ERROR", + ErrCodeSettingsTimeout: "SETTINGS_TIMEOUT", + ErrCodeStreamClosed: "STREAM_CLOSED", + ErrCodeFrameSize: "FRAME_SIZE_ERROR", + ErrCodeRefusedStream: "REFUSED_STREAM", + ErrCodeCancel: "CANCEL", + ErrCodeCompression: "COMPRESSION_ERROR", + ErrCodeConnect: "CONNECT_ERROR", + ErrCodeEnhanceYourCalm: "ENHANCE_YOUR_CALM", + ErrCodeInadequateSecurity: "INADEQUATE_SECURITY", + ErrCodeHTTP11Required: "HTTP_1_1_REQUIRED", +} + +func (e ErrCode) String() string { + if s, ok := errCodeName[e]; ok { + return s + } + return fmt.Sprintf("unknown error code 0x%x", uint32(e)) +} + +// ConnectionError is an error that results in the termination of the +// entire connection. +type ConnectionError ErrCode + +func (e ConnectionError) Error() string { return fmt.Sprintf("connection error: %s", ErrCode(e)) } + +// StreamError is an error that only affects one stream within an +// HTTP/2 connection. +type StreamError struct { + StreamID uint32 + Code ErrCode + Cause error // optional additional detail +} + +func streamError(id uint32, code ErrCode) StreamError { + return StreamError{StreamID: id, Code: code} +} + +func (e StreamError) Error() string { + if e.Cause != nil { + return fmt.Sprintf("stream error: stream ID %d; %v; %v", e.StreamID, e.Code, e.Cause) + } + return fmt.Sprintf("stream error: stream ID %d; %v", e.StreamID, e.Code) +} + +// 6.9.1 The Flow Control Window +// "If a sender receives a WINDOW_UPDATE that causes a flow control +// window to exceed this maximum it MUST terminate either the stream +// or the connection, as appropriate. For streams, [...]; for the +// connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code." +type goAwayFlowError struct{} + +func (goAwayFlowError) Error() string { return "connection exceeded flow control window size" } + +// connError represents an HTTP/2 ConnectionError error code, along +// with a string (for debugging) explaining why. +// +// Errors of this type are only returned by the frame parser functions +// and converted into ConnectionError(Code), after stashing away +// the Reason into the Framer's errDetail field, accessible via +// the (*Framer).ErrorDetail method. +type connError struct { + Code ErrCode // the ConnectionError error code + Reason string // additional reason +} + +func (e connError) Error() string { + return fmt.Sprintf("http2: connection error: %v: %v", e.Code, e.Reason) +} + +type pseudoHeaderError string + +func (e pseudoHeaderError) Error() string { + return fmt.Sprintf("invalid pseudo-header %q", string(e)) +} + +type duplicatePseudoHeaderError string + +func (e duplicatePseudoHeaderError) Error() string { + return fmt.Sprintf("duplicate pseudo-header %q", string(e)) +} + +type headerFieldNameError string + +func (e headerFieldNameError) Error() string { + return fmt.Sprintf("invalid header field name %q", string(e)) +} + +type headerFieldValueError string + +func (e headerFieldValueError) Error() string { + return fmt.Sprintf("invalid header field value %q", string(e)) +} + +var ( + errMixPseudoHeaderTypes = errors.New("mix of request and response pseudo headers") + errPseudoAfterRegular = errors.New("pseudo header field after regular") +) diff --git a/vendor/golang.org/x/net/http2/flow.go b/vendor/golang.org/x/net/http2/flow.go new file mode 100644 index 00000000..b51f0e0c --- /dev/null +++ b/vendor/golang.org/x/net/http2/flow.go @@ -0,0 +1,52 @@ +// 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. + +// Flow control + +package http2 + +// flow is the flow control window's size. +type flow struct { + _ incomparable + + // n is the number of DATA bytes we're allowed to send. + // A flow is kept both on a conn and a per-stream. + n int32 + + // conn points to the shared connection-level flow that is + // shared by all streams on that conn. It is nil for the flow + // that's on the conn directly. + conn *flow +} + +func (f *flow) setConnFlow(cf *flow) { f.conn = cf } + +func (f *flow) available() int32 { + n := f.n + if f.conn != nil && f.conn.n < n { + n = f.conn.n + } + return n +} + +func (f *flow) take(n int32) { + if n > f.available() { + panic("internal error: took too much") + } + f.n -= n + if f.conn != nil { + f.conn.n -= n + } +} + +// add adds n bytes (positive or negative) to the flow control window. +// It returns false if the sum would exceed 2^31-1. +func (f *flow) add(n int32) bool { + sum := f.n + n + if (sum > n) == (f.n > 0) { + f.n = sum + return true + } + return false +} diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go new file mode 100644 index 00000000..514c126c --- /dev/null +++ b/vendor/golang.org/x/net/http2/frame.go @@ -0,0 +1,1614 @@ +// 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 http2 + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "log" + "strings" + "sync" + + "golang.org/x/net/http/httpguts" + "golang.org/x/net/http2/hpack" +) + +const frameHeaderLen = 9 + +var padZeros = make([]byte, 255) // zeros for padding + +// A FrameType is a registered frame type as defined in +// http://http2.github.io/http2-spec/#rfc.section.11.2 +type FrameType uint8 + +const ( + FrameData FrameType = 0x0 + FrameHeaders FrameType = 0x1 + FramePriority FrameType = 0x2 + FrameRSTStream FrameType = 0x3 + FrameSettings FrameType = 0x4 + FramePushPromise FrameType = 0x5 + FramePing FrameType = 0x6 + FrameGoAway FrameType = 0x7 + FrameWindowUpdate FrameType = 0x8 + FrameContinuation FrameType = 0x9 +) + +var frameName = map[FrameType]string{ + FrameData: "DATA", + FrameHeaders: "HEADERS", + FramePriority: "PRIORITY", + FrameRSTStream: "RST_STREAM", + FrameSettings: "SETTINGS", + FramePushPromise: "PUSH_PROMISE", + FramePing: "PING", + FrameGoAway: "GOAWAY", + FrameWindowUpdate: "WINDOW_UPDATE", + FrameContinuation: "CONTINUATION", +} + +func (t FrameType) String() string { + if s, ok := frameName[t]; ok { + return s + } + return fmt.Sprintf("UNKNOWN_FRAME_TYPE_%d", uint8(t)) +} + +// Flags is a bitmask of HTTP/2 flags. +// The meaning of flags varies depending on the frame type. +type Flags uint8 + +// Has reports whether f contains all (0 or more) flags in v. +func (f Flags) Has(v Flags) bool { + return (f & v) == v +} + +// Frame-specific FrameHeader flag bits. +const ( + // Data Frame + FlagDataEndStream Flags = 0x1 + FlagDataPadded Flags = 0x8 + + // Headers Frame + FlagHeadersEndStream Flags = 0x1 + FlagHeadersEndHeaders Flags = 0x4 + FlagHeadersPadded Flags = 0x8 + FlagHeadersPriority Flags = 0x20 + + // Settings Frame + FlagSettingsAck Flags = 0x1 + + // Ping Frame + FlagPingAck Flags = 0x1 + + // Continuation Frame + FlagContinuationEndHeaders Flags = 0x4 + + FlagPushPromiseEndHeaders Flags = 0x4 + FlagPushPromisePadded Flags = 0x8 +) + +var flagName = map[FrameType]map[Flags]string{ + FrameData: { + FlagDataEndStream: "END_STREAM", + FlagDataPadded: "PADDED", + }, + FrameHeaders: { + FlagHeadersEndStream: "END_STREAM", + FlagHeadersEndHeaders: "END_HEADERS", + FlagHeadersPadded: "PADDED", + FlagHeadersPriority: "PRIORITY", + }, + FrameSettings: { + FlagSettingsAck: "ACK", + }, + FramePing: { + FlagPingAck: "ACK", + }, + FrameContinuation: { + FlagContinuationEndHeaders: "END_HEADERS", + }, + FramePushPromise: { + FlagPushPromiseEndHeaders: "END_HEADERS", + FlagPushPromisePadded: "PADDED", + }, +} + +// a frameParser parses a frame given its FrameHeader and payload +// bytes. The length of payload will always equal fh.Length (which +// might be 0). +type frameParser func(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error) + +var frameParsers = map[FrameType]frameParser{ + FrameData: parseDataFrame, + FrameHeaders: parseHeadersFrame, + FramePriority: parsePriorityFrame, + FrameRSTStream: parseRSTStreamFrame, + FrameSettings: parseSettingsFrame, + FramePushPromise: parsePushPromise, + FramePing: parsePingFrame, + FrameGoAway: parseGoAwayFrame, + FrameWindowUpdate: parseWindowUpdateFrame, + FrameContinuation: parseContinuationFrame, +} + +func typeFrameParser(t FrameType) frameParser { + if f := frameParsers[t]; f != nil { + return f + } + return parseUnknownFrame +} + +// A FrameHeader is the 9 byte header of all HTTP/2 frames. +// +// See http://http2.github.io/http2-spec/#FrameHeader +type FrameHeader struct { + valid bool // caller can access []byte fields in the Frame + + // Type is the 1 byte frame type. There are ten standard frame + // types, but extension frame types may be written by WriteRawFrame + // and will be returned by ReadFrame (as UnknownFrame). + Type FrameType + + // Flags are the 1 byte of 8 potential bit flags per frame. + // They are specific to the frame type. + Flags Flags + + // Length is the length of the frame, not including the 9 byte header. + // The maximum size is one byte less than 16MB (uint24), but only + // frames up to 16KB are allowed without peer agreement. + Length uint32 + + // StreamID is which stream this frame is for. Certain frames + // are not stream-specific, in which case this field is 0. + StreamID uint32 +} + +// Header returns h. It exists so FrameHeaders can be embedded in other +// specific frame types and implement the Frame interface. +func (h FrameHeader) Header() FrameHeader { return h } + +func (h FrameHeader) String() string { + var buf bytes.Buffer + buf.WriteString("[FrameHeader ") + h.writeDebug(&buf) + buf.WriteByte(']') + return buf.String() +} + +func (h FrameHeader) writeDebug(buf *bytes.Buffer) { + buf.WriteString(h.Type.String()) + if h.Flags != 0 { + buf.WriteString(" flags=") + set := 0 + for i := uint8(0); i < 8; i++ { + if h.Flags&(1< 1 { + buf.WriteByte('|') + } + name := flagName[h.Type][Flags(1<>24), + byte(streamID>>16), + byte(streamID>>8), + byte(streamID)) +} + +func (f *Framer) endWrite() error { + // Now that we know the final size, fill in the FrameHeader in + // the space previously reserved for it. Abuse append. + length := len(f.wbuf) - frameHeaderLen + if length >= (1 << 24) { + return ErrFrameTooLarge + } + _ = append(f.wbuf[:0], + byte(length>>16), + byte(length>>8), + byte(length)) + if f.logWrites { + f.logWrite() + } + + n, err := f.w.Write(f.wbuf) + if err == nil && n != len(f.wbuf) { + err = io.ErrShortWrite + } + return err +} + +func (f *Framer) logWrite() { + if f.debugFramer == nil { + f.debugFramerBuf = new(bytes.Buffer) + f.debugFramer = NewFramer(nil, f.debugFramerBuf) + f.debugFramer.logReads = false // we log it ourselves, saying "wrote" below + // Let us read anything, even if we accidentally wrote it + // in the wrong order: + f.debugFramer.AllowIllegalReads = true + } + f.debugFramerBuf.Write(f.wbuf) + fr, err := f.debugFramer.ReadFrame() + if err != nil { + f.debugWriteLoggerf("http2: Framer %p: failed to decode just-written frame", f) + return + } + f.debugWriteLoggerf("http2: Framer %p: wrote %v", f, summarizeFrame(fr)) +} + +func (f *Framer) writeByte(v byte) { f.wbuf = append(f.wbuf, v) } +func (f *Framer) writeBytes(v []byte) { f.wbuf = append(f.wbuf, v...) } +func (f *Framer) writeUint16(v uint16) { f.wbuf = append(f.wbuf, byte(v>>8), byte(v)) } +func (f *Framer) writeUint32(v uint32) { + f.wbuf = append(f.wbuf, byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) +} + +const ( + minMaxFrameSize = 1 << 14 + maxFrameSize = 1<<24 - 1 +) + +// SetReuseFrames allows the Framer to reuse Frames. +// If called on a Framer, Frames returned by calls to ReadFrame are only +// valid until the next call to ReadFrame. +func (fr *Framer) SetReuseFrames() { + if fr.frameCache != nil { + return + } + fr.frameCache = &frameCache{} +} + +type frameCache struct { + dataFrame DataFrame +} + +func (fc *frameCache) getDataFrame() *DataFrame { + if fc == nil { + return &DataFrame{} + } + return &fc.dataFrame +} + +// NewFramer returns a Framer that writes frames to w and reads them from r. +func NewFramer(w io.Writer, r io.Reader) *Framer { + fr := &Framer{ + w: w, + r: r, + logReads: logFrameReads, + logWrites: logFrameWrites, + debugReadLoggerf: log.Printf, + debugWriteLoggerf: log.Printf, + } + fr.getReadBuf = func(size uint32) []byte { + if cap(fr.readBuf) >= int(size) { + return fr.readBuf[:size] + } + fr.readBuf = make([]byte, size) + return fr.readBuf + } + fr.SetMaxReadFrameSize(maxFrameSize) + return fr +} + +// SetMaxReadFrameSize sets the maximum size of a frame +// that will be read by a subsequent call to ReadFrame. +// It is the caller's responsibility to advertise this +// limit with a SETTINGS frame. +func (fr *Framer) SetMaxReadFrameSize(v uint32) { + if v > maxFrameSize { + v = maxFrameSize + } + fr.maxReadSize = v +} + +// ErrorDetail returns a more detailed error of the last error +// returned by Framer.ReadFrame. For instance, if ReadFrame +// returns a StreamError with code PROTOCOL_ERROR, ErrorDetail +// will say exactly what was invalid. ErrorDetail is not guaranteed +// to return a non-nil value and like the rest of the http2 package, +// its return value is not protected by an API compatibility promise. +// ErrorDetail is reset after the next call to ReadFrame. +func (fr *Framer) ErrorDetail() error { + return fr.errDetail +} + +// ErrFrameTooLarge is returned from Framer.ReadFrame when the peer +// sends a frame that is larger than declared with SetMaxReadFrameSize. +var ErrFrameTooLarge = errors.New("http2: frame too large") + +// terminalReadFrameError reports whether err is an unrecoverable +// error from ReadFrame and no other frames should be read. +func terminalReadFrameError(err error) bool { + if _, ok := err.(StreamError); ok { + return false + } + return err != nil +} + +// ReadFrame reads a single frame. The returned Frame is only valid +// until the next call to ReadFrame. +// +// If the frame is larger than previously set with SetMaxReadFrameSize, the +// returned error is ErrFrameTooLarge. Other errors may be of type +// ConnectionError, StreamError, or anything else from the underlying +// reader. +func (fr *Framer) ReadFrame() (Frame, error) { + fr.errDetail = nil + if fr.lastFrame != nil { + fr.lastFrame.invalidate() + } + fh, err := readFrameHeader(fr.headerBuf[:], fr.r) + if err != nil { + return nil, err + } + if fh.Length > fr.maxReadSize { + return nil, ErrFrameTooLarge + } + payload := fr.getReadBuf(fh.Length) + if _, err := io.ReadFull(fr.r, payload); err != nil { + return nil, err + } + f, err := typeFrameParser(fh.Type)(fr.frameCache, fh, payload) + if err != nil { + if ce, ok := err.(connError); ok { + return nil, fr.connError(ce.Code, ce.Reason) + } + return nil, err + } + if err := fr.checkFrameOrder(f); err != nil { + return nil, err + } + if fr.logReads { + fr.debugReadLoggerf("http2: Framer %p: read %v", fr, summarizeFrame(f)) + } + if fh.Type == FrameHeaders && fr.ReadMetaHeaders != nil { + return fr.readMetaFrame(f.(*HeadersFrame)) + } + return f, nil +} + +// connError returns ConnectionError(code) but first +// stashes away a public reason to the caller can optionally relay it +// to the peer before hanging up on them. This might help others debug +// their implementations. +func (fr *Framer) connError(code ErrCode, reason string) error { + fr.errDetail = errors.New(reason) + return ConnectionError(code) +} + +// checkFrameOrder reports an error if f is an invalid frame to return +// next from ReadFrame. Mostly it checks whether HEADERS and +// CONTINUATION frames are contiguous. +func (fr *Framer) checkFrameOrder(f Frame) error { + last := fr.lastFrame + fr.lastFrame = f + if fr.AllowIllegalReads { + return nil + } + + fh := f.Header() + if fr.lastHeaderStream != 0 { + if fh.Type != FrameContinuation { + return fr.connError(ErrCodeProtocol, + fmt.Sprintf("got %s for stream %d; expected CONTINUATION following %s for stream %d", + fh.Type, fh.StreamID, + last.Header().Type, fr.lastHeaderStream)) + } + if fh.StreamID != fr.lastHeaderStream { + return fr.connError(ErrCodeProtocol, + fmt.Sprintf("got CONTINUATION for stream %d; expected stream %d", + fh.StreamID, fr.lastHeaderStream)) + } + } else if fh.Type == FrameContinuation { + return fr.connError(ErrCodeProtocol, fmt.Sprintf("unexpected CONTINUATION for stream %d", fh.StreamID)) + } + + switch fh.Type { + case FrameHeaders, FrameContinuation: + if fh.Flags.Has(FlagHeadersEndHeaders) { + fr.lastHeaderStream = 0 + } else { + fr.lastHeaderStream = fh.StreamID + } + } + + return nil +} + +// A DataFrame conveys arbitrary, variable-length sequences of octets +// associated with a stream. +// See http://http2.github.io/http2-spec/#rfc.section.6.1 +type DataFrame struct { + FrameHeader + data []byte +} + +func (f *DataFrame) StreamEnded() bool { + return f.FrameHeader.Flags.Has(FlagDataEndStream) +} + +// Data returns the frame's data octets, not including any padding +// size byte or padding suffix bytes. +// The caller must not retain the returned memory past the next +// call to ReadFrame. +func (f *DataFrame) Data() []byte { + f.checkValid() + return f.data +} + +func parseDataFrame(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error) { + if fh.StreamID == 0 { + // DATA frames MUST be associated with a stream. If a + // DATA frame is received whose stream identifier + // field is 0x0, the recipient MUST respond with a + // connection error (Section 5.4.1) of type + // PROTOCOL_ERROR. + return nil, connError{ErrCodeProtocol, "DATA frame with stream ID 0"} + } + f := fc.getDataFrame() + f.FrameHeader = fh + + var padSize byte + if fh.Flags.Has(FlagDataPadded) { + var err error + payload, padSize, err = readByte(payload) + if err != nil { + return nil, err + } + } + if int(padSize) > len(payload) { + // If the length of the padding is greater than the + // length of the frame payload, the recipient MUST + // treat this as a connection error. + // Filed: https://github.com/http2/http2-spec/issues/610 + return nil, connError{ErrCodeProtocol, "pad size larger than data payload"} + } + f.data = payload[:len(payload)-int(padSize)] + return f, nil +} + +var ( + errStreamID = errors.New("invalid stream ID") + errDepStreamID = errors.New("invalid dependent stream ID") + errPadLength = errors.New("pad length too large") + errPadBytes = errors.New("padding bytes must all be zeros unless AllowIllegalWrites is enabled") +) + +func validStreamIDOrZero(streamID uint32) bool { + return streamID&(1<<31) == 0 +} + +func validStreamID(streamID uint32) bool { + return streamID != 0 && streamID&(1<<31) == 0 +} + +// WriteData writes a DATA frame. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility not to violate the maximum frame size +// and to not call other Write methods concurrently. +func (f *Framer) WriteData(streamID uint32, endStream bool, data []byte) error { + return f.WriteDataPadded(streamID, endStream, data, nil) +} + +// WriteDataPadded writes a DATA frame with optional padding. +// +// If pad is nil, the padding bit is not sent. +// The length of pad must not exceed 255 bytes. +// The bytes of pad must all be zero, unless f.AllowIllegalWrites is set. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility not to violate the maximum frame size +// and to not call other Write methods concurrently. +func (f *Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []byte) error { + if !validStreamID(streamID) && !f.AllowIllegalWrites { + return errStreamID + } + if len(pad) > 0 { + if len(pad) > 255 { + return errPadLength + } + if !f.AllowIllegalWrites { + for _, b := range pad { + if b != 0 { + // "Padding octets MUST be set to zero when sending." + return errPadBytes + } + } + } + } + var flags Flags + if endStream { + flags |= FlagDataEndStream + } + if pad != nil { + flags |= FlagDataPadded + } + f.startWrite(FrameData, flags, streamID) + if pad != nil { + f.wbuf = append(f.wbuf, byte(len(pad))) + } + f.wbuf = append(f.wbuf, data...) + f.wbuf = append(f.wbuf, pad...) + return f.endWrite() +} + +// A SettingsFrame conveys configuration parameters that affect how +// endpoints communicate, such as preferences and constraints on peer +// behavior. +// +// See http://http2.github.io/http2-spec/#SETTINGS +type SettingsFrame struct { + FrameHeader + p []byte +} + +func parseSettingsFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { + if fh.Flags.Has(FlagSettingsAck) && fh.Length > 0 { + // When this (ACK 0x1) bit is set, the payload of the + // SETTINGS frame MUST be empty. Receipt of a + // SETTINGS frame with the ACK flag set and a length + // field value other than 0 MUST be treated as a + // connection error (Section 5.4.1) of type + // FRAME_SIZE_ERROR. + return nil, ConnectionError(ErrCodeFrameSize) + } + if fh.StreamID != 0 { + // SETTINGS frames always apply to a connection, + // never a single stream. The stream identifier for a + // SETTINGS frame MUST be zero (0x0). If an endpoint + // receives a SETTINGS frame whose stream identifier + // field is anything other than 0x0, the endpoint MUST + // respond with a connection error (Section 5.4.1) of + // type PROTOCOL_ERROR. + return nil, ConnectionError(ErrCodeProtocol) + } + if len(p)%6 != 0 { + // Expecting even number of 6 byte settings. + return nil, ConnectionError(ErrCodeFrameSize) + } + f := &SettingsFrame{FrameHeader: fh, p: p} + if v, ok := f.Value(SettingInitialWindowSize); ok && v > (1<<31)-1 { + // Values above the maximum flow control window size of 2^31 - 1 MUST + // be treated as a connection error (Section 5.4.1) of type + // FLOW_CONTROL_ERROR. + return nil, ConnectionError(ErrCodeFlowControl) + } + return f, nil +} + +func (f *SettingsFrame) IsAck() bool { + return f.FrameHeader.Flags.Has(FlagSettingsAck) +} + +func (f *SettingsFrame) Value(id SettingID) (v uint32, ok bool) { + f.checkValid() + for i := 0; i < f.NumSettings(); i++ { + if s := f.Setting(i); s.ID == id { + return s.Val, true + } + } + return 0, false +} + +// Setting returns the setting from the frame at the given 0-based index. +// The index must be >= 0 and less than f.NumSettings(). +func (f *SettingsFrame) Setting(i int) Setting { + buf := f.p + return Setting{ + ID: SettingID(binary.BigEndian.Uint16(buf[i*6 : i*6+2])), + Val: binary.BigEndian.Uint32(buf[i*6+2 : i*6+6]), + } +} + +func (f *SettingsFrame) NumSettings() int { return len(f.p) / 6 } + +// HasDuplicates reports whether f contains any duplicate setting IDs. +func (f *SettingsFrame) HasDuplicates() bool { + num := f.NumSettings() + if num == 0 { + return false + } + // If it's small enough (the common case), just do the n^2 + // thing and avoid a map allocation. + if num < 10 { + for i := 0; i < num; i++ { + idi := f.Setting(i).ID + for j := i + 1; j < num; j++ { + idj := f.Setting(j).ID + if idi == idj { + return true + } + } + } + return false + } + seen := map[SettingID]bool{} + for i := 0; i < num; i++ { + id := f.Setting(i).ID + if seen[id] { + return true + } + seen[id] = true + } + return false +} + +// ForeachSetting runs fn for each setting. +// It stops and returns the first error. +func (f *SettingsFrame) ForeachSetting(fn func(Setting) error) error { + f.checkValid() + for i := 0; i < f.NumSettings(); i++ { + if err := fn(f.Setting(i)); err != nil { + return err + } + } + return nil +} + +// WriteSettings writes a SETTINGS frame with zero or more settings +// specified and the ACK bit not set. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteSettings(settings ...Setting) error { + f.startWrite(FrameSettings, 0, 0) + for _, s := range settings { + f.writeUint16(uint16(s.ID)) + f.writeUint32(s.Val) + } + return f.endWrite() +} + +// WriteSettingsAck writes an empty SETTINGS frame with the ACK bit set. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteSettingsAck() error { + f.startWrite(FrameSettings, FlagSettingsAck, 0) + return f.endWrite() +} + +// A PingFrame is a mechanism for measuring a minimal round trip time +// from the sender, as well as determining whether an idle connection +// is still functional. +// See http://http2.github.io/http2-spec/#rfc.section.6.7 +type PingFrame struct { + FrameHeader + Data [8]byte +} + +func (f *PingFrame) IsAck() bool { return f.Flags.Has(FlagPingAck) } + +func parsePingFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) { + if len(payload) != 8 { + return nil, ConnectionError(ErrCodeFrameSize) + } + if fh.StreamID != 0 { + return nil, ConnectionError(ErrCodeProtocol) + } + f := &PingFrame{FrameHeader: fh} + copy(f.Data[:], payload) + return f, nil +} + +func (f *Framer) WritePing(ack bool, data [8]byte) error { + var flags Flags + if ack { + flags = FlagPingAck + } + f.startWrite(FramePing, flags, 0) + f.writeBytes(data[:]) + return f.endWrite() +} + +// A GoAwayFrame informs the remote peer to stop creating streams on this connection. +// See http://http2.github.io/http2-spec/#rfc.section.6.8 +type GoAwayFrame struct { + FrameHeader + LastStreamID uint32 + ErrCode ErrCode + debugData []byte +} + +// DebugData returns any debug data in the GOAWAY frame. Its contents +// are not defined. +// The caller must not retain the returned memory past the next +// call to ReadFrame. +func (f *GoAwayFrame) DebugData() []byte { + f.checkValid() + return f.debugData +} + +func parseGoAwayFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { + if fh.StreamID != 0 { + return nil, ConnectionError(ErrCodeProtocol) + } + if len(p) < 8 { + return nil, ConnectionError(ErrCodeFrameSize) + } + return &GoAwayFrame{ + FrameHeader: fh, + LastStreamID: binary.BigEndian.Uint32(p[:4]) & (1<<31 - 1), + ErrCode: ErrCode(binary.BigEndian.Uint32(p[4:8])), + debugData: p[8:], + }, nil +} + +func (f *Framer) WriteGoAway(maxStreamID uint32, code ErrCode, debugData []byte) error { + f.startWrite(FrameGoAway, 0, 0) + f.writeUint32(maxStreamID & (1<<31 - 1)) + f.writeUint32(uint32(code)) + f.writeBytes(debugData) + return f.endWrite() +} + +// An UnknownFrame is the frame type returned when the frame type is unknown +// or no specific frame type parser exists. +type UnknownFrame struct { + FrameHeader + p []byte +} + +// Payload returns the frame's payload (after the header). It is not +// valid to call this method after a subsequent call to +// Framer.ReadFrame, nor is it valid to retain the returned slice. +// The memory is owned by the Framer and is invalidated when the next +// frame is read. +func (f *UnknownFrame) Payload() []byte { + f.checkValid() + return f.p +} + +func parseUnknownFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { + return &UnknownFrame{fh, p}, nil +} + +// A WindowUpdateFrame is used to implement flow control. +// See http://http2.github.io/http2-spec/#rfc.section.6.9 +type WindowUpdateFrame struct { + FrameHeader + Increment uint32 // never read with high bit set +} + +func parseWindowUpdateFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { + if len(p) != 4 { + return nil, ConnectionError(ErrCodeFrameSize) + } + inc := binary.BigEndian.Uint32(p[:4]) & 0x7fffffff // mask off high reserved bit + if inc == 0 { + // A receiver MUST treat the receipt of a + // WINDOW_UPDATE frame with an flow control window + // increment of 0 as a stream error (Section 5.4.2) of + // type PROTOCOL_ERROR; errors on the connection flow + // control window MUST be treated as a connection + // error (Section 5.4.1). + if fh.StreamID == 0 { + return nil, ConnectionError(ErrCodeProtocol) + } + return nil, streamError(fh.StreamID, ErrCodeProtocol) + } + return &WindowUpdateFrame{ + FrameHeader: fh, + Increment: inc, + }, nil +} + +// WriteWindowUpdate writes a WINDOW_UPDATE frame. +// The increment value must be between 1 and 2,147,483,647, inclusive. +// If the Stream ID is zero, the window update applies to the +// connection as a whole. +func (f *Framer) WriteWindowUpdate(streamID, incr uint32) error { + // "The legal range for the increment to the flow control window is 1 to 2^31-1 (2,147,483,647) octets." + if (incr < 1 || incr > 2147483647) && !f.AllowIllegalWrites { + return errors.New("illegal window increment value") + } + f.startWrite(FrameWindowUpdate, 0, streamID) + f.writeUint32(incr) + return f.endWrite() +} + +// A HeadersFrame is used to open a stream and additionally carries a +// header block fragment. +type HeadersFrame struct { + FrameHeader + + // Priority is set if FlagHeadersPriority is set in the FrameHeader. + Priority PriorityParam + + headerFragBuf []byte // not owned +} + +func (f *HeadersFrame) HeaderBlockFragment() []byte { + f.checkValid() + return f.headerFragBuf +} + +func (f *HeadersFrame) HeadersEnded() bool { + return f.FrameHeader.Flags.Has(FlagHeadersEndHeaders) +} + +func (f *HeadersFrame) StreamEnded() bool { + return f.FrameHeader.Flags.Has(FlagHeadersEndStream) +} + +func (f *HeadersFrame) HasPriority() bool { + return f.FrameHeader.Flags.Has(FlagHeadersPriority) +} + +func parseHeadersFrame(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) { + hf := &HeadersFrame{ + FrameHeader: fh, + } + if fh.StreamID == 0 { + // HEADERS frames MUST be associated with a stream. If a HEADERS frame + // is received whose stream identifier field is 0x0, the recipient MUST + // respond with a connection error (Section 5.4.1) of type + // PROTOCOL_ERROR. + return nil, connError{ErrCodeProtocol, "HEADERS frame with stream ID 0"} + } + var padLength uint8 + if fh.Flags.Has(FlagHeadersPadded) { + if p, padLength, err = readByte(p); err != nil { + return + } + } + if fh.Flags.Has(FlagHeadersPriority) { + var v uint32 + p, v, err = readUint32(p) + if err != nil { + return nil, err + } + hf.Priority.StreamDep = v & 0x7fffffff + hf.Priority.Exclusive = (v != hf.Priority.StreamDep) // high bit was set + p, hf.Priority.Weight, err = readByte(p) + if err != nil { + return nil, err + } + } + if len(p)-int(padLength) <= 0 { + return nil, streamError(fh.StreamID, ErrCodeProtocol) + } + hf.headerFragBuf = p[:len(p)-int(padLength)] + return hf, nil +} + +// HeadersFrameParam are the parameters for writing a HEADERS frame. +type HeadersFrameParam struct { + // StreamID is the required Stream ID to initiate. + StreamID uint32 + // BlockFragment is part (or all) of a Header Block. + BlockFragment []byte + + // EndStream indicates that the header block is the last that + // the endpoint will send for the identified stream. Setting + // this flag causes the stream to enter one of "half closed" + // states. + EndStream bool + + // EndHeaders indicates that this frame contains an entire + // header block and is not followed by any + // CONTINUATION frames. + EndHeaders bool + + // PadLength is the optional number of bytes of zeros to add + // to this frame. + PadLength uint8 + + // Priority, if non-zero, includes stream priority information + // in the HEADER frame. + Priority PriorityParam +} + +// WriteHeaders writes a single HEADERS frame. +// +// This is a low-level header writing method. Encoding headers and +// splitting them into any necessary CONTINUATION frames is handled +// elsewhere. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteHeaders(p HeadersFrameParam) error { + if !validStreamID(p.StreamID) && !f.AllowIllegalWrites { + return errStreamID + } + var flags Flags + if p.PadLength != 0 { + flags |= FlagHeadersPadded + } + if p.EndStream { + flags |= FlagHeadersEndStream + } + if p.EndHeaders { + flags |= FlagHeadersEndHeaders + } + if !p.Priority.IsZero() { + flags |= FlagHeadersPriority + } + f.startWrite(FrameHeaders, flags, p.StreamID) + if p.PadLength != 0 { + f.writeByte(p.PadLength) + } + if !p.Priority.IsZero() { + v := p.Priority.StreamDep + if !validStreamIDOrZero(v) && !f.AllowIllegalWrites { + return errDepStreamID + } + if p.Priority.Exclusive { + v |= 1 << 31 + } + f.writeUint32(v) + f.writeByte(p.Priority.Weight) + } + f.wbuf = append(f.wbuf, p.BlockFragment...) + f.wbuf = append(f.wbuf, padZeros[:p.PadLength]...) + return f.endWrite() +} + +// A PriorityFrame specifies the sender-advised priority of a stream. +// See http://http2.github.io/http2-spec/#rfc.section.6.3 +type PriorityFrame struct { + FrameHeader + PriorityParam +} + +// PriorityParam are the stream prioritzation parameters. +type PriorityParam struct { + // StreamDep is a 31-bit stream identifier for the + // stream that this stream depends on. Zero means no + // dependency. + StreamDep uint32 + + // Exclusive is whether the dependency is exclusive. + Exclusive bool + + // Weight is the stream's zero-indexed weight. It should be + // set together with StreamDep, or neither should be set. Per + // the spec, "Add one to the value to obtain a weight between + // 1 and 256." + Weight uint8 +} + +func (p PriorityParam) IsZero() bool { + return p == PriorityParam{} +} + +func parsePriorityFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) { + if fh.StreamID == 0 { + return nil, connError{ErrCodeProtocol, "PRIORITY frame with stream ID 0"} + } + if len(payload) != 5 { + return nil, connError{ErrCodeFrameSize, fmt.Sprintf("PRIORITY frame payload size was %d; want 5", len(payload))} + } + v := binary.BigEndian.Uint32(payload[:4]) + streamID := v & 0x7fffffff // mask off high bit + return &PriorityFrame{ + FrameHeader: fh, + PriorityParam: PriorityParam{ + Weight: payload[4], + StreamDep: streamID, + Exclusive: streamID != v, // was high bit set? + }, + }, nil +} + +// WritePriority writes a PRIORITY frame. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WritePriority(streamID uint32, p PriorityParam) error { + if !validStreamID(streamID) && !f.AllowIllegalWrites { + return errStreamID + } + if !validStreamIDOrZero(p.StreamDep) { + return errDepStreamID + } + f.startWrite(FramePriority, 0, streamID) + v := p.StreamDep + if p.Exclusive { + v |= 1 << 31 + } + f.writeUint32(v) + f.writeByte(p.Weight) + return f.endWrite() +} + +// A RSTStreamFrame allows for abnormal termination of a stream. +// See http://http2.github.io/http2-spec/#rfc.section.6.4 +type RSTStreamFrame struct { + FrameHeader + ErrCode ErrCode +} + +func parseRSTStreamFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { + if len(p) != 4 { + return nil, ConnectionError(ErrCodeFrameSize) + } + if fh.StreamID == 0 { + return nil, ConnectionError(ErrCodeProtocol) + } + return &RSTStreamFrame{fh, ErrCode(binary.BigEndian.Uint32(p[:4]))}, nil +} + +// WriteRSTStream writes a RST_STREAM frame. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteRSTStream(streamID uint32, code ErrCode) error { + if !validStreamID(streamID) && !f.AllowIllegalWrites { + return errStreamID + } + f.startWrite(FrameRSTStream, 0, streamID) + f.writeUint32(uint32(code)) + return f.endWrite() +} + +// A ContinuationFrame is used to continue a sequence of header block fragments. +// See http://http2.github.io/http2-spec/#rfc.section.6.10 +type ContinuationFrame struct { + FrameHeader + headerFragBuf []byte +} + +func parseContinuationFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { + if fh.StreamID == 0 { + return nil, connError{ErrCodeProtocol, "CONTINUATION frame with stream ID 0"} + } + return &ContinuationFrame{fh, p}, nil +} + +func (f *ContinuationFrame) HeaderBlockFragment() []byte { + f.checkValid() + return f.headerFragBuf +} + +func (f *ContinuationFrame) HeadersEnded() bool { + return f.FrameHeader.Flags.Has(FlagContinuationEndHeaders) +} + +// WriteContinuation writes a CONTINUATION frame. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WriteContinuation(streamID uint32, endHeaders bool, headerBlockFragment []byte) error { + if !validStreamID(streamID) && !f.AllowIllegalWrites { + return errStreamID + } + var flags Flags + if endHeaders { + flags |= FlagContinuationEndHeaders + } + f.startWrite(FrameContinuation, flags, streamID) + f.wbuf = append(f.wbuf, headerBlockFragment...) + return f.endWrite() +} + +// A PushPromiseFrame is used to initiate a server stream. +// See http://http2.github.io/http2-spec/#rfc.section.6.6 +type PushPromiseFrame struct { + FrameHeader + PromiseID uint32 + headerFragBuf []byte // not owned +} + +func (f *PushPromiseFrame) HeaderBlockFragment() []byte { + f.checkValid() + return f.headerFragBuf +} + +func (f *PushPromiseFrame) HeadersEnded() bool { + return f.FrameHeader.Flags.Has(FlagPushPromiseEndHeaders) +} + +func parsePushPromise(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) { + pp := &PushPromiseFrame{ + FrameHeader: fh, + } + if pp.StreamID == 0 { + // PUSH_PROMISE frames MUST be associated with an existing, + // peer-initiated stream. The stream identifier of a + // PUSH_PROMISE frame indicates the stream it is associated + // with. If the stream identifier field specifies the value + // 0x0, a recipient MUST respond with a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + return nil, ConnectionError(ErrCodeProtocol) + } + // The PUSH_PROMISE frame includes optional padding. + // Padding fields and flags are identical to those defined for DATA frames + var padLength uint8 + if fh.Flags.Has(FlagPushPromisePadded) { + if p, padLength, err = readByte(p); err != nil { + return + } + } + + p, pp.PromiseID, err = readUint32(p) + if err != nil { + return + } + pp.PromiseID = pp.PromiseID & (1<<31 - 1) + + if int(padLength) > len(p) { + // like the DATA frame, error out if padding is longer than the body. + return nil, ConnectionError(ErrCodeProtocol) + } + pp.headerFragBuf = p[:len(p)-int(padLength)] + return pp, nil +} + +// PushPromiseParam are the parameters for writing a PUSH_PROMISE frame. +type PushPromiseParam struct { + // StreamID is the required Stream ID to initiate. + StreamID uint32 + + // PromiseID is the required Stream ID which this + // Push Promises + PromiseID uint32 + + // BlockFragment is part (or all) of a Header Block. + BlockFragment []byte + + // EndHeaders indicates that this frame contains an entire + // header block and is not followed by any + // CONTINUATION frames. + EndHeaders bool + + // PadLength is the optional number of bytes of zeros to add + // to this frame. + PadLength uint8 +} + +// WritePushPromise writes a single PushPromise Frame. +// +// As with Header Frames, This is the low level call for writing +// individual frames. Continuation frames are handled elsewhere. +// +// It will perform exactly one Write to the underlying Writer. +// It is the caller's responsibility to not call other Write methods concurrently. +func (f *Framer) WritePushPromise(p PushPromiseParam) error { + if !validStreamID(p.StreamID) && !f.AllowIllegalWrites { + return errStreamID + } + var flags Flags + if p.PadLength != 0 { + flags |= FlagPushPromisePadded + } + if p.EndHeaders { + flags |= FlagPushPromiseEndHeaders + } + f.startWrite(FramePushPromise, flags, p.StreamID) + if p.PadLength != 0 { + f.writeByte(p.PadLength) + } + if !validStreamID(p.PromiseID) && !f.AllowIllegalWrites { + return errStreamID + } + f.writeUint32(p.PromiseID) + f.wbuf = append(f.wbuf, p.BlockFragment...) + f.wbuf = append(f.wbuf, padZeros[:p.PadLength]...) + return f.endWrite() +} + +// WriteRawFrame writes a raw frame. This can be used to write +// extension frames unknown to this package. +func (f *Framer) WriteRawFrame(t FrameType, flags Flags, streamID uint32, payload []byte) error { + f.startWrite(t, flags, streamID) + f.writeBytes(payload) + return f.endWrite() +} + +func readByte(p []byte) (remain []byte, b byte, err error) { + if len(p) == 0 { + return nil, 0, io.ErrUnexpectedEOF + } + return p[1:], p[0], nil +} + +func readUint32(p []byte) (remain []byte, v uint32, err error) { + if len(p) < 4 { + return nil, 0, io.ErrUnexpectedEOF + } + return p[4:], binary.BigEndian.Uint32(p[:4]), nil +} + +type streamEnder interface { + StreamEnded() bool +} + +type headersEnder interface { + HeadersEnded() bool +} + +type headersOrContinuation interface { + headersEnder + HeaderBlockFragment() []byte +} + +// A MetaHeadersFrame is the representation of one HEADERS frame and +// zero or more contiguous CONTINUATION frames and the decoding of +// their HPACK-encoded contents. +// +// This type of frame does not appear on the wire and is only returned +// by the Framer when Framer.ReadMetaHeaders is set. +type MetaHeadersFrame struct { + *HeadersFrame + + // Fields are the fields contained in the HEADERS and + // CONTINUATION frames. The underlying slice is owned by the + // Framer and must not be retained after the next call to + // ReadFrame. + // + // Fields are guaranteed to be in the correct http2 order and + // not have unknown pseudo header fields or invalid header + // field names or values. Required pseudo header fields may be + // missing, however. Use the MetaHeadersFrame.Pseudo accessor + // method access pseudo headers. + Fields []hpack.HeaderField + + // Truncated is whether the max header list size limit was hit + // and Fields is incomplete. The hpack decoder state is still + // valid, however. + Truncated bool +} + +// PseudoValue returns the given pseudo header field's value. +// The provided pseudo field should not contain the leading colon. +func (mh *MetaHeadersFrame) PseudoValue(pseudo string) string { + for _, hf := range mh.Fields { + if !hf.IsPseudo() { + return "" + } + if hf.Name[1:] == pseudo { + return hf.Value + } + } + return "" +} + +// RegularFields returns the regular (non-pseudo) header fields of mh. +// The caller does not own the returned slice. +func (mh *MetaHeadersFrame) RegularFields() []hpack.HeaderField { + for i, hf := range mh.Fields { + if !hf.IsPseudo() { + return mh.Fields[i:] + } + } + return nil +} + +// PseudoFields returns the pseudo header fields of mh. +// The caller does not own the returned slice. +func (mh *MetaHeadersFrame) PseudoFields() []hpack.HeaderField { + for i, hf := range mh.Fields { + if !hf.IsPseudo() { + return mh.Fields[:i] + } + } + return mh.Fields +} + +func (mh *MetaHeadersFrame) checkPseudos() error { + var isRequest, isResponse bool + pf := mh.PseudoFields() + for i, hf := range pf { + switch hf.Name { + case ":method", ":path", ":scheme", ":authority": + isRequest = true + case ":status": + isResponse = true + default: + return pseudoHeaderError(hf.Name) + } + // Check for duplicates. + // This would be a bad algorithm, but N is 4. + // And this doesn't allocate. + for _, hf2 := range pf[:i] { + if hf.Name == hf2.Name { + return duplicatePseudoHeaderError(hf.Name) + } + } + } + if isRequest && isResponse { + return errMixPseudoHeaderTypes + } + return nil +} + +func (fr *Framer) maxHeaderStringLen() int { + v := fr.maxHeaderListSize() + if uint32(int(v)) == v { + return int(v) + } + // They had a crazy big number for MaxHeaderBytes anyway, + // so give them unlimited header lengths: + return 0 +} + +// readMetaFrame returns 0 or more CONTINUATION frames from fr and +// merge them into the provided hf and returns a MetaHeadersFrame +// with the decoded hpack values. +func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) { + if fr.AllowIllegalReads { + return nil, errors.New("illegal use of AllowIllegalReads with ReadMetaHeaders") + } + mh := &MetaHeadersFrame{ + HeadersFrame: hf, + } + var remainSize = fr.maxHeaderListSize() + var sawRegular bool + + var invalid error // pseudo header field errors + hdec := fr.ReadMetaHeaders + hdec.SetEmitEnabled(true) + hdec.SetMaxStringLength(fr.maxHeaderStringLen()) + hdec.SetEmitFunc(func(hf hpack.HeaderField) { + if VerboseLogs && fr.logReads { + fr.debugReadLoggerf("http2: decoded hpack field %+v", hf) + } + if !httpguts.ValidHeaderFieldValue(hf.Value) { + invalid = headerFieldValueError(hf.Value) + } + isPseudo := strings.HasPrefix(hf.Name, ":") + if isPseudo { + if sawRegular { + invalid = errPseudoAfterRegular + } + } else { + sawRegular = true + if !validWireHeaderFieldName(hf.Name) { + invalid = headerFieldNameError(hf.Name) + } + } + + if invalid != nil { + hdec.SetEmitEnabled(false) + return + } + + size := hf.Size() + if size > remainSize { + hdec.SetEmitEnabled(false) + mh.Truncated = true + return + } + remainSize -= size + + mh.Fields = append(mh.Fields, hf) + }) + // Lose reference to MetaHeadersFrame: + defer hdec.SetEmitFunc(func(hf hpack.HeaderField) {}) + + var hc headersOrContinuation = hf + for { + frag := hc.HeaderBlockFragment() + if _, err := hdec.Write(frag); err != nil { + return nil, ConnectionError(ErrCodeCompression) + } + + if hc.HeadersEnded() { + break + } + if f, err := fr.ReadFrame(); err != nil { + return nil, err + } else { + hc = f.(*ContinuationFrame) // guaranteed by checkFrameOrder + } + } + + mh.HeadersFrame.headerFragBuf = nil + mh.HeadersFrame.invalidate() + + if err := hdec.Close(); err != nil { + return nil, ConnectionError(ErrCodeCompression) + } + if invalid != nil { + fr.errDetail = invalid + if VerboseLogs { + log.Printf("http2: invalid header: %v", invalid) + } + return nil, StreamError{mh.StreamID, ErrCodeProtocol, invalid} + } + if err := mh.checkPseudos(); err != nil { + fr.errDetail = err + if VerboseLogs { + log.Printf("http2: invalid pseudo headers: %v", err) + } + return nil, StreamError{mh.StreamID, ErrCodeProtocol, err} + } + return mh, nil +} + +func summarizeFrame(f Frame) string { + var buf bytes.Buffer + f.Header().writeDebug(&buf) + switch f := f.(type) { + case *SettingsFrame: + n := 0 + f.ForeachSetting(func(s Setting) error { + n++ + if n == 1 { + buf.WriteString(", settings:") + } + fmt.Fprintf(&buf, " %v=%v,", s.ID, s.Val) + return nil + }) + if n > 0 { + buf.Truncate(buf.Len() - 1) // remove trailing comma + } + case *DataFrame: + data := f.Data() + const max = 256 + if len(data) > max { + data = data[:max] + } + fmt.Fprintf(&buf, " data=%q", data) + if len(f.Data()) > max { + fmt.Fprintf(&buf, " (%d bytes omitted)", len(f.Data())-max) + } + case *WindowUpdateFrame: + if f.StreamID == 0 { + buf.WriteString(" (conn)") + } + fmt.Fprintf(&buf, " incr=%v", f.Increment) + case *PingFrame: + fmt.Fprintf(&buf, " ping=%q", f.Data[:]) + case *GoAwayFrame: + fmt.Fprintf(&buf, " LastStreamID=%v ErrCode=%v Debug=%q", + f.LastStreamID, f.ErrCode, f.debugData) + case *RSTStreamFrame: + fmt.Fprintf(&buf, " ErrCode=%v", f.ErrCode) + } + return buf.String() +} diff --git a/vendor/golang.org/x/net/http2/go111.go b/vendor/golang.org/x/net/http2/go111.go new file mode 100644 index 00000000..3a131016 --- /dev/null +++ b/vendor/golang.org/x/net/http2/go111.go @@ -0,0 +1,29 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.11 + +package http2 + +import ( + "net/http/httptrace" + "net/textproto" +) + +func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { + return trace != nil && trace.WroteHeaderField != nil +} + +func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) { + if trace != nil && trace.WroteHeaderField != nil { + trace.WroteHeaderField(k, []string{v}) + } +} + +func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { + if trace != nil { + return trace.Got1xxResponse + } + return nil +} diff --git a/vendor/golang.org/x/net/http2/gotrack.go b/vendor/golang.org/x/net/http2/gotrack.go new file mode 100644 index 00000000..9933c9f8 --- /dev/null +++ b/vendor/golang.org/x/net/http2/gotrack.go @@ -0,0 +1,170 @@ +// 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. + +// Defensive debug-only utility to track that functions run on the +// goroutine that they're supposed to. + +package http2 + +import ( + "bytes" + "errors" + "fmt" + "os" + "runtime" + "strconv" + "sync" +) + +var DebugGoroutines = os.Getenv("DEBUG_HTTP2_GOROUTINES") == "1" + +type goroutineLock uint64 + +func newGoroutineLock() goroutineLock { + if !DebugGoroutines { + return 0 + } + return goroutineLock(curGoroutineID()) +} + +func (g goroutineLock) check() { + if !DebugGoroutines { + return + } + if curGoroutineID() != uint64(g) { + panic("running on the wrong goroutine") + } +} + +func (g goroutineLock) checkNotOn() { + if !DebugGoroutines { + return + } + if curGoroutineID() == uint64(g) { + panic("running on the wrong goroutine") + } +} + +var goroutineSpace = []byte("goroutine ") + +func curGoroutineID() uint64 { + bp := littleBuf.Get().(*[]byte) + defer littleBuf.Put(bp) + b := *bp + b = b[:runtime.Stack(b, false)] + // Parse the 4707 out of "goroutine 4707 [" + b = bytes.TrimPrefix(b, goroutineSpace) + i := bytes.IndexByte(b, ' ') + if i < 0 { + panic(fmt.Sprintf("No space found in %q", b)) + } + b = b[:i] + n, err := parseUintBytes(b, 10, 64) + if err != nil { + panic(fmt.Sprintf("Failed to parse goroutine ID out of %q: %v", b, err)) + } + return n +} + +var littleBuf = sync.Pool{ + New: func() interface{} { + buf := make([]byte, 64) + return &buf + }, +} + +// parseUintBytes is like strconv.ParseUint, but using a []byte. +func parseUintBytes(s []byte, base int, bitSize int) (n uint64, err error) { + var cutoff, maxVal uint64 + + if bitSize == 0 { + bitSize = int(strconv.IntSize) + } + + s0 := s + switch { + case len(s) < 1: + err = strconv.ErrSyntax + goto Error + + case 2 <= base && base <= 36: + // valid base; nothing to do + + case base == 0: + // Look for octal, hex prefix. + switch { + case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'): + base = 16 + s = s[2:] + if len(s) < 1 { + err = strconv.ErrSyntax + goto Error + } + case s[0] == '0': + base = 8 + default: + base = 10 + } + + default: + err = errors.New("invalid base " + strconv.Itoa(base)) + goto Error + } + + n = 0 + cutoff = cutoff64(base) + maxVal = 1<= base { + n = 0 + err = strconv.ErrSyntax + goto Error + } + + if n >= cutoff { + // n*base overflows + n = 1<<64 - 1 + err = strconv.ErrRange + goto Error + } + n *= uint64(base) + + n1 := n + uint64(v) + if n1 < n || n1 > maxVal { + // n+v overflows + n = 1<<64 - 1 + err = strconv.ErrRange + goto Error + } + n = n1 + } + + return n, nil + +Error: + return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err} +} + +// Return the first number n such that n*base >= 1<<64. +func cutoff64(base int) uint64 { + if base < 2 { + return 0 + } + return (1<<64-1)/uint64(base) + 1 +} diff --git a/vendor/golang.org/x/net/http2/headermap.go b/vendor/golang.org/x/net/http2/headermap.go new file mode 100644 index 00000000..c3ff3fa1 --- /dev/null +++ b/vendor/golang.org/x/net/http2/headermap.go @@ -0,0 +1,88 @@ +// 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 http2 + +import ( + "net/http" + "strings" + "sync" +) + +var ( + commonBuildOnce sync.Once + commonLowerHeader map[string]string // Go-Canonical-Case -> lower-case + commonCanonHeader map[string]string // lower-case -> Go-Canonical-Case +) + +func buildCommonHeaderMapsOnce() { + commonBuildOnce.Do(buildCommonHeaderMaps) +} + +func buildCommonHeaderMaps() { + common := []string{ + "accept", + "accept-charset", + "accept-encoding", + "accept-language", + "accept-ranges", + "age", + "access-control-allow-origin", + "allow", + "authorization", + "cache-control", + "content-disposition", + "content-encoding", + "content-language", + "content-length", + "content-location", + "content-range", + "content-type", + "cookie", + "date", + "etag", + "expect", + "expires", + "from", + "host", + "if-match", + "if-modified-since", + "if-none-match", + "if-unmodified-since", + "last-modified", + "link", + "location", + "max-forwards", + "proxy-authenticate", + "proxy-authorization", + "range", + "referer", + "refresh", + "retry-after", + "server", + "set-cookie", + "strict-transport-security", + "trailer", + "transfer-encoding", + "user-agent", + "vary", + "via", + "www-authenticate", + } + commonLowerHeader = make(map[string]string, len(common)) + commonCanonHeader = make(map[string]string, len(common)) + for _, v := range common { + chk := http.CanonicalHeaderKey(v) + commonLowerHeader[chk] = v + commonCanonHeader[v] = chk + } +} + +func lowerHeader(v string) string { + buildCommonHeaderMapsOnce() + if s, ok := commonLowerHeader[v]; ok { + return s + } + return strings.ToLower(v) +} diff --git a/vendor/golang.org/x/net/http2/hpack/encode.go b/vendor/golang.org/x/net/http2/hpack/encode.go new file mode 100644 index 00000000..97f17831 --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/encode.go @@ -0,0 +1,240 @@ +// 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 hpack + +import ( + "io" +) + +const ( + uint32Max = ^uint32(0) + initialHeaderTableSize = 4096 +) + +type Encoder struct { + dynTab dynamicTable + // minSize is the minimum table size set by + // SetMaxDynamicTableSize after the previous Header Table Size + // Update. + minSize uint32 + // maxSizeLimit is the maximum table size this encoder + // supports. This will protect the encoder from too large + // size. + maxSizeLimit uint32 + // tableSizeUpdate indicates whether "Header Table Size + // Update" is required. + tableSizeUpdate bool + w io.Writer + buf []byte +} + +// NewEncoder returns a new Encoder which performs HPACK encoding. An +// encoded data is written to w. +func NewEncoder(w io.Writer) *Encoder { + e := &Encoder{ + minSize: uint32Max, + maxSizeLimit: initialHeaderTableSize, + tableSizeUpdate: false, + w: w, + } + e.dynTab.table.init() + e.dynTab.setMaxSize(initialHeaderTableSize) + return e +} + +// WriteField encodes f into a single Write to e's underlying Writer. +// This function may also produce bytes for "Header Table Size Update" +// if necessary. If produced, it is done before encoding f. +func (e *Encoder) WriteField(f HeaderField) error { + e.buf = e.buf[:0] + + if e.tableSizeUpdate { + e.tableSizeUpdate = false + if e.minSize < e.dynTab.maxSize { + e.buf = appendTableSize(e.buf, e.minSize) + } + e.minSize = uint32Max + e.buf = appendTableSize(e.buf, e.dynTab.maxSize) + } + + idx, nameValueMatch := e.searchTable(f) + if nameValueMatch { + e.buf = appendIndexed(e.buf, idx) + } else { + indexing := e.shouldIndex(f) + if indexing { + e.dynTab.add(f) + } + + if idx == 0 { + e.buf = appendNewName(e.buf, f, indexing) + } else { + e.buf = appendIndexedName(e.buf, f, idx, indexing) + } + } + n, err := e.w.Write(e.buf) + if err == nil && n != len(e.buf) { + err = io.ErrShortWrite + } + return err +} + +// searchTable searches f in both stable and dynamic header tables. +// The static header table is searched first. Only when there is no +// exact match for both name and value, the dynamic header table is +// then searched. If there is no match, i is 0. If both name and value +// match, i is the matched index and nameValueMatch becomes true. If +// only name matches, i points to that index and nameValueMatch +// becomes false. +func (e *Encoder) searchTable(f HeaderField) (i uint64, nameValueMatch bool) { + i, nameValueMatch = staticTable.search(f) + if nameValueMatch { + return i, true + } + + j, nameValueMatch := e.dynTab.table.search(f) + if nameValueMatch || (i == 0 && j != 0) { + return j + uint64(staticTable.len()), nameValueMatch + } + + return i, false +} + +// SetMaxDynamicTableSize changes the dynamic header table size to v. +// The actual size is bounded by the value passed to +// SetMaxDynamicTableSizeLimit. +func (e *Encoder) SetMaxDynamicTableSize(v uint32) { + if v > e.maxSizeLimit { + v = e.maxSizeLimit + } + if v < e.minSize { + e.minSize = v + } + e.tableSizeUpdate = true + e.dynTab.setMaxSize(v) +} + +// SetMaxDynamicTableSizeLimit changes the maximum value that can be +// specified in SetMaxDynamicTableSize to v. By default, it is set to +// 4096, which is the same size of the default dynamic header table +// size described in HPACK specification. If the current maximum +// dynamic header table size is strictly greater than v, "Header Table +// Size Update" will be done in the next WriteField call and the +// maximum dynamic header table size is truncated to v. +func (e *Encoder) SetMaxDynamicTableSizeLimit(v uint32) { + e.maxSizeLimit = v + if e.dynTab.maxSize > v { + e.tableSizeUpdate = true + e.dynTab.setMaxSize(v) + } +} + +// shouldIndex reports whether f should be indexed. +func (e *Encoder) shouldIndex(f HeaderField) bool { + return !f.Sensitive && f.Size() <= e.dynTab.maxSize +} + +// appendIndexed appends index i, as encoded in "Indexed Header Field" +// representation, to dst and returns the extended buffer. +func appendIndexed(dst []byte, i uint64) []byte { + first := len(dst) + dst = appendVarInt(dst, 7, i) + dst[first] |= 0x80 + return dst +} + +// appendNewName appends f, as encoded in one of "Literal Header field +// - New Name" representation variants, to dst and returns the +// extended buffer. +// +// If f.Sensitive is true, "Never Indexed" representation is used. If +// f.Sensitive is false and indexing is true, "Incremental Indexing" +// representation is used. +func appendNewName(dst []byte, f HeaderField, indexing bool) []byte { + dst = append(dst, encodeTypeByte(indexing, f.Sensitive)) + dst = appendHpackString(dst, f.Name) + return appendHpackString(dst, f.Value) +} + +// appendIndexedName appends f and index i referring indexed name +// entry, as encoded in one of "Literal Header field - Indexed Name" +// representation variants, to dst and returns the extended buffer. +// +// If f.Sensitive is true, "Never Indexed" representation is used. If +// f.Sensitive is false and indexing is true, "Incremental Indexing" +// representation is used. +func appendIndexedName(dst []byte, f HeaderField, i uint64, indexing bool) []byte { + first := len(dst) + var n byte + if indexing { + n = 6 + } else { + n = 4 + } + dst = appendVarInt(dst, n, i) + dst[first] |= encodeTypeByte(indexing, f.Sensitive) + return appendHpackString(dst, f.Value) +} + +// appendTableSize appends v, as encoded in "Header Table Size Update" +// representation, to dst and returns the extended buffer. +func appendTableSize(dst []byte, v uint32) []byte { + first := len(dst) + dst = appendVarInt(dst, 5, uint64(v)) + dst[first] |= 0x20 + return dst +} + +// appendVarInt appends i, as encoded in variable integer form using n +// bit prefix, to dst and returns the extended buffer. +// +// See +// http://http2.github.io/http2-spec/compression.html#integer.representation +func appendVarInt(dst []byte, n byte, i uint64) []byte { + k := uint64((1 << n) - 1) + if i < k { + return append(dst, byte(i)) + } + dst = append(dst, byte(k)) + i -= k + for ; i >= 128; i >>= 7 { + dst = append(dst, byte(0x80|(i&0x7f))) + } + return append(dst, byte(i)) +} + +// appendHpackString appends s, as encoded in "String Literal" +// representation, to dst and returns the extended buffer. +// +// s will be encoded in Huffman codes only when it produces strictly +// shorter byte string. +func appendHpackString(dst []byte, s string) []byte { + huffmanLength := HuffmanEncodeLength(s) + if huffmanLength < uint64(len(s)) { + first := len(dst) + dst = appendVarInt(dst, 7, huffmanLength) + dst = AppendHuffmanString(dst, s) + dst[first] |= 0x80 + } else { + dst = appendVarInt(dst, 7, uint64(len(s))) + dst = append(dst, s...) + } + return dst +} + +// encodeTypeByte returns type byte. If sensitive is true, type byte +// for "Never Indexed" representation is returned. If sensitive is +// false and indexing is true, type byte for "Incremental Indexing" +// representation is returned. Otherwise, type byte for "Without +// Indexing" is returned. +func encodeTypeByte(indexing, sensitive bool) byte { + if sensitive { + return 0x10 + } + if indexing { + return 0x40 + } + return 0 +} diff --git a/vendor/golang.org/x/net/http2/hpack/hpack.go b/vendor/golang.org/x/net/http2/hpack/hpack.go new file mode 100644 index 00000000..85f18a2b --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/hpack.go @@ -0,0 +1,504 @@ +// 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 hpack implements HPACK, a compression format for +// efficiently representing HTTP header fields in the context of HTTP/2. +// +// See http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-09 +package hpack + +import ( + "bytes" + "errors" + "fmt" +) + +// A DecodingError is something the spec defines as a decoding error. +type DecodingError struct { + Err error +} + +func (de DecodingError) Error() string { + return fmt.Sprintf("decoding error: %v", de.Err) +} + +// An InvalidIndexError is returned when an encoder references a table +// entry before the static table or after the end of the dynamic table. +type InvalidIndexError int + +func (e InvalidIndexError) Error() string { + return fmt.Sprintf("invalid indexed representation index %d", int(e)) +} + +// A HeaderField is a name-value pair. Both the name and value are +// treated as opaque sequences of octets. +type HeaderField struct { + Name, Value string + + // Sensitive means that this header field should never be + // indexed. + Sensitive bool +} + +// IsPseudo reports whether the header field is an http2 pseudo header. +// That is, it reports whether it starts with a colon. +// It is not otherwise guaranteed to be a valid pseudo header field, +// though. +func (hf HeaderField) IsPseudo() bool { + return len(hf.Name) != 0 && hf.Name[0] == ':' +} + +func (hf HeaderField) String() string { + var suffix string + if hf.Sensitive { + suffix = " (sensitive)" + } + return fmt.Sprintf("header field %q = %q%s", hf.Name, hf.Value, suffix) +} + +// Size returns the size of an entry per RFC 7541 section 4.1. +func (hf HeaderField) Size() uint32 { + // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1 + // "The size of the dynamic table is the sum of the size of + // its entries. The size of an entry is the sum of its name's + // length in octets (as defined in Section 5.2), its value's + // length in octets (see Section 5.2), plus 32. The size of + // an entry is calculated using the length of the name and + // value without any Huffman encoding applied." + + // This can overflow if somebody makes a large HeaderField + // Name and/or Value by hand, but we don't care, because that + // won't happen on the wire because the encoding doesn't allow + // it. + return uint32(len(hf.Name) + len(hf.Value) + 32) +} + +// A Decoder is the decoding context for incremental processing of +// header blocks. +type Decoder struct { + dynTab dynamicTable + emit func(f HeaderField) + + emitEnabled bool // whether calls to emit are enabled + maxStrLen int // 0 means unlimited + + // buf is the unparsed buffer. It's only written to + // saveBuf if it was truncated in the middle of a header + // block. Because it's usually not owned, we can only + // process it under Write. + buf []byte // not owned; only valid during Write + + // saveBuf is previous data passed to Write which we weren't able + // to fully parse before. Unlike buf, we own this data. + saveBuf bytes.Buffer + + firstField bool // processing the first field of the header block +} + +// NewDecoder returns a new decoder with the provided maximum dynamic +// table size. The emitFunc will be called for each valid field +// parsed, in the same goroutine as calls to Write, before Write returns. +func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decoder { + d := &Decoder{ + emit: emitFunc, + emitEnabled: true, + firstField: true, + } + d.dynTab.table.init() + d.dynTab.allowedMaxSize = maxDynamicTableSize + d.dynTab.setMaxSize(maxDynamicTableSize) + return d +} + +// ErrStringLength is returned by Decoder.Write when the max string length +// (as configured by Decoder.SetMaxStringLength) would be violated. +var ErrStringLength = errors.New("hpack: string too long") + +// SetMaxStringLength sets the maximum size of a HeaderField name or +// value string. If a string exceeds this length (even after any +// decompression), Write will return ErrStringLength. +// A value of 0 means unlimited and is the default from NewDecoder. +func (d *Decoder) SetMaxStringLength(n int) { + d.maxStrLen = n +} + +// SetEmitFunc changes the callback used when new header fields +// are decoded. +// It must be non-nil. It does not affect EmitEnabled. +func (d *Decoder) SetEmitFunc(emitFunc func(f HeaderField)) { + d.emit = emitFunc +} + +// SetEmitEnabled controls whether the emitFunc provided to NewDecoder +// should be called. The default is true. +// +// This facility exists to let servers enforce MAX_HEADER_LIST_SIZE +// while still decoding and keeping in-sync with decoder state, but +// without doing unnecessary decompression or generating unnecessary +// garbage for header fields past the limit. +func (d *Decoder) SetEmitEnabled(v bool) { d.emitEnabled = v } + +// EmitEnabled reports whether calls to the emitFunc provided to NewDecoder +// are currently enabled. The default is true. +func (d *Decoder) EmitEnabled() bool { return d.emitEnabled } + +// TODO: add method *Decoder.Reset(maxSize, emitFunc) to let callers re-use Decoders and their +// underlying buffers for garbage reasons. + +func (d *Decoder) SetMaxDynamicTableSize(v uint32) { + d.dynTab.setMaxSize(v) +} + +// SetAllowedMaxDynamicTableSize sets the upper bound that the encoded +// stream (via dynamic table size updates) may set the maximum size +// to. +func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) { + d.dynTab.allowedMaxSize = v +} + +type dynamicTable struct { + // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2 + table headerFieldTable + size uint32 // in bytes + maxSize uint32 // current maxSize + allowedMaxSize uint32 // maxSize may go up to this, inclusive +} + +func (dt *dynamicTable) setMaxSize(v uint32) { + dt.maxSize = v + dt.evict() +} + +func (dt *dynamicTable) add(f HeaderField) { + dt.table.addEntry(f) + dt.size += f.Size() + dt.evict() +} + +// If we're too big, evict old stuff. +func (dt *dynamicTable) evict() { + var n int + for dt.size > dt.maxSize && n < dt.table.len() { + dt.size -= dt.table.ents[n].Size() + n++ + } + dt.table.evictOldest(n) +} + +func (d *Decoder) maxTableIndex() int { + // This should never overflow. RFC 7540 Section 6.5.2 limits the size of + // the dynamic table to 2^32 bytes, where each entry will occupy more than + // one byte. Further, the staticTable has a fixed, small length. + return d.dynTab.table.len() + staticTable.len() +} + +func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) { + // See Section 2.3.3. + if i == 0 { + return + } + if i <= uint64(staticTable.len()) { + return staticTable.ents[i-1], true + } + if i > uint64(d.maxTableIndex()) { + return + } + // In the dynamic table, newer entries have lower indices. + // However, dt.ents[0] is the oldest entry. Hence, dt.ents is + // the reversed dynamic table. + dt := d.dynTab.table + return dt.ents[dt.len()-(int(i)-staticTable.len())], true +} + +// Decode decodes an entire block. +// +// TODO: remove this method and make it incremental later? This is +// easier for debugging now. +func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) { + var hf []HeaderField + saveFunc := d.emit + defer func() { d.emit = saveFunc }() + d.emit = func(f HeaderField) { hf = append(hf, f) } + if _, err := d.Write(p); err != nil { + return nil, err + } + if err := d.Close(); err != nil { + return nil, err + } + return hf, nil +} + +// Close declares that the decoding is complete and resets the Decoder +// to be reused again for a new header block. If there is any remaining +// data in the decoder's buffer, Close returns an error. +func (d *Decoder) Close() error { + if d.saveBuf.Len() > 0 { + d.saveBuf.Reset() + return DecodingError{errors.New("truncated headers")} + } + d.firstField = true + return nil +} + +func (d *Decoder) Write(p []byte) (n int, err error) { + if len(p) == 0 { + // Prevent state machine CPU attacks (making us redo + // work up to the point of finding out we don't have + // enough data) + return + } + // Only copy the data if we have to. Optimistically assume + // that p will contain a complete header block. + if d.saveBuf.Len() == 0 { + d.buf = p + } else { + d.saveBuf.Write(p) + d.buf = d.saveBuf.Bytes() + d.saveBuf.Reset() + } + + for len(d.buf) > 0 { + err = d.parseHeaderFieldRepr() + if err == errNeedMore { + // Extra paranoia, making sure saveBuf won't + // get too large. All the varint and string + // reading code earlier should already catch + // overlong things and return ErrStringLength, + // but keep this as a last resort. + const varIntOverhead = 8 // conservative + if d.maxStrLen != 0 && int64(len(d.buf)) > 2*(int64(d.maxStrLen)+varIntOverhead) { + return 0, ErrStringLength + } + d.saveBuf.Write(d.buf) + return len(p), nil + } + d.firstField = false + if err != nil { + break + } + } + return len(p), err +} + +// errNeedMore is an internal sentinel error value that means the +// buffer is truncated and we need to read more data before we can +// continue parsing. +var errNeedMore = errors.New("need more data") + +type indexType int + +const ( + indexedTrue indexType = iota + indexedFalse + indexedNever +) + +func (v indexType) indexed() bool { return v == indexedTrue } +func (v indexType) sensitive() bool { return v == indexedNever } + +// returns errNeedMore if there isn't enough data available. +// any other error is fatal. +// consumes d.buf iff it returns nil. +// precondition: must be called with len(d.buf) > 0 +func (d *Decoder) parseHeaderFieldRepr() error { + b := d.buf[0] + switch { + case b&128 != 0: + // Indexed representation. + // High bit set? + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.1 + return d.parseFieldIndexed() + case b&192 == 64: + // 6.2.1 Literal Header Field with Incremental Indexing + // 0b10xxxxxx: top two bits are 10 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.1 + return d.parseFieldLiteral(6, indexedTrue) + case b&240 == 0: + // 6.2.2 Literal Header Field without Indexing + // 0b0000xxxx: top four bits are 0000 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.2 + return d.parseFieldLiteral(4, indexedFalse) + case b&240 == 16: + // 6.2.3 Literal Header Field never Indexed + // 0b0001xxxx: top four bits are 0001 + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.3 + return d.parseFieldLiteral(4, indexedNever) + case b&224 == 32: + // 6.3 Dynamic Table Size Update + // Top three bits are '001'. + // http://http2.github.io/http2-spec/compression.html#rfc.section.6.3 + return d.parseDynamicTableSizeUpdate() + } + + return DecodingError{errors.New("invalid encoding")} +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseFieldIndexed() error { + buf := d.buf + idx, buf, err := readVarInt(7, buf) + if err != nil { + return err + } + hf, ok := d.at(idx) + if !ok { + return DecodingError{InvalidIndexError(idx)} + } + d.buf = buf + return d.callEmit(HeaderField{Name: hf.Name, Value: hf.Value}) +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error { + buf := d.buf + nameIdx, buf, err := readVarInt(n, buf) + if err != nil { + return err + } + + var hf HeaderField + wantStr := d.emitEnabled || it.indexed() + if nameIdx > 0 { + ihf, ok := d.at(nameIdx) + if !ok { + return DecodingError{InvalidIndexError(nameIdx)} + } + hf.Name = ihf.Name + } else { + hf.Name, buf, err = d.readString(buf, wantStr) + if err != nil { + return err + } + } + hf.Value, buf, err = d.readString(buf, wantStr) + if err != nil { + return err + } + d.buf = buf + if it.indexed() { + d.dynTab.add(hf) + } + hf.Sensitive = it.sensitive() + return d.callEmit(hf) +} + +func (d *Decoder) callEmit(hf HeaderField) error { + if d.maxStrLen != 0 { + if len(hf.Name) > d.maxStrLen || len(hf.Value) > d.maxStrLen { + return ErrStringLength + } + } + if d.emitEnabled { + d.emit(hf) + } + return nil +} + +// (same invariants and behavior as parseHeaderFieldRepr) +func (d *Decoder) parseDynamicTableSizeUpdate() error { + // RFC 7541, sec 4.2: This dynamic table size update MUST occur at the + // beginning of the first header block following the change to the dynamic table size. + if !d.firstField && d.dynTab.size > 0 { + return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")} + } + + buf := d.buf + size, buf, err := readVarInt(5, buf) + if err != nil { + return err + } + if size > uint64(d.dynTab.allowedMaxSize) { + return DecodingError{errors.New("dynamic table size update too large")} + } + d.dynTab.setMaxSize(uint32(size)) + d.buf = buf + return nil +} + +var errVarintOverflow = DecodingError{errors.New("varint integer overflow")} + +// readVarInt reads an unsigned variable length integer off the +// beginning of p. n is the parameter as described in +// http://http2.github.io/http2-spec/compression.html#rfc.section.5.1. +// +// n must always be between 1 and 8. +// +// The returned remain buffer is either a smaller suffix of p, or err != nil. +// The error is errNeedMore if p doesn't contain a complete integer. +func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) { + if n < 1 || n > 8 { + panic("bad n") + } + if len(p) == 0 { + return 0, p, errNeedMore + } + i = uint64(p[0]) + if n < 8 { + i &= (1 << uint64(n)) - 1 + } + if i < (1< 0 { + b := p[0] + p = p[1:] + i += uint64(b&127) << m + if b&128 == 0 { + return i, p, nil + } + m += 7 + if m >= 63 { // TODO: proper overflow check. making this up. + return 0, origP, errVarintOverflow + } + } + return 0, origP, errNeedMore +} + +// readString decodes an hpack string from p. +// +// wantStr is whether s will be used. If false, decompression and +// []byte->string garbage are skipped if s will be ignored +// anyway. This does mean that huffman decoding errors for non-indexed +// strings past the MAX_HEADER_LIST_SIZE are ignored, but the server +// is returning an error anyway, and because they're not indexed, the error +// won't affect the decoding state. +func (d *Decoder) readString(p []byte, wantStr bool) (s string, remain []byte, err error) { + if len(p) == 0 { + return "", p, errNeedMore + } + isHuff := p[0]&128 != 0 + strLen, p, err := readVarInt(7, p) + if err != nil { + return "", p, err + } + if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) { + return "", nil, ErrStringLength + } + if uint64(len(p)) < strLen { + return "", p, errNeedMore + } + if !isHuff { + if wantStr { + s = string(p[:strLen]) + } + return s, p[strLen:], nil + } + + if wantStr { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() // don't trust others + defer bufPool.Put(buf) + if err := huffmanDecode(buf, d.maxStrLen, p[:strLen]); err != nil { + buf.Reset() + return "", nil, err + } + s = buf.String() + buf.Reset() // be nice to GC + } + return s, p[strLen:], nil +} diff --git a/vendor/golang.org/x/net/http2/hpack/huffman.go b/vendor/golang.org/x/net/http2/hpack/huffman.go new file mode 100644 index 00000000..a1ab2f05 --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/huffman.go @@ -0,0 +1,229 @@ +// 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 hpack + +import ( + "bytes" + "errors" + "io" + "sync" +) + +var bufPool = sync.Pool{ + New: func() interface{} { return new(bytes.Buffer) }, +} + +// HuffmanDecode decodes the string in v and writes the expanded +// result to w, returning the number of bytes written to w and the +// Write call's return value. At most one Write call is made. +func HuffmanDecode(w io.Writer, v []byte) (int, error) { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() + defer bufPool.Put(buf) + if err := huffmanDecode(buf, 0, v); err != nil { + return 0, err + } + return w.Write(buf.Bytes()) +} + +// HuffmanDecodeToString decodes the string in v. +func HuffmanDecodeToString(v []byte) (string, error) { + buf := bufPool.Get().(*bytes.Buffer) + buf.Reset() + defer bufPool.Put(buf) + if err := huffmanDecode(buf, 0, v); err != nil { + return "", err + } + return buf.String(), nil +} + +// ErrInvalidHuffman is returned for errors found decoding +// Huffman-encoded strings. +var ErrInvalidHuffman = errors.New("hpack: invalid Huffman-encoded data") + +// huffmanDecode decodes v to buf. +// If maxLen is greater than 0, attempts to write more to buf than +// maxLen bytes will return ErrStringLength. +func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error { + rootHuffmanNode := getRootHuffmanNode() + n := rootHuffmanNode + // cur is the bit buffer that has not been fed into n. + // cbits is the number of low order bits in cur that are valid. + // sbits is the number of bits of the symbol prefix being decoded. + cur, cbits, sbits := uint(0), uint8(0), uint8(0) + for _, b := range v { + cur = cur<<8 | uint(b) + cbits += 8 + sbits += 8 + for cbits >= 8 { + idx := byte(cur >> (cbits - 8)) + n = n.children[idx] + if n == nil { + return ErrInvalidHuffman + } + if n.children == nil { + if maxLen != 0 && buf.Len() == maxLen { + return ErrStringLength + } + buf.WriteByte(n.sym) + cbits -= n.codeLen + n = rootHuffmanNode + sbits = cbits + } else { + cbits -= 8 + } + } + } + for cbits > 0 { + n = n.children[byte(cur<<(8-cbits))] + if n == nil { + return ErrInvalidHuffman + } + if n.children != nil || n.codeLen > cbits { + break + } + if maxLen != 0 && buf.Len() == maxLen { + return ErrStringLength + } + buf.WriteByte(n.sym) + cbits -= n.codeLen + n = rootHuffmanNode + sbits = cbits + } + if sbits > 7 { + // Either there was an incomplete symbol, or overlong padding. + // Both are decoding errors per RFC 7541 section 5.2. + return ErrInvalidHuffman + } + if mask := uint(1< 8 { + codeLen -= 8 + i := uint8(code >> codeLen) + if cur.children[i] == nil { + cur.children[i] = newInternalNode() + } + cur = cur.children[i] + } + shift := 8 - codeLen + start, end := int(uint8(code<> (nbits - rembits)) + dst[len(dst)-1] |= t + } + + return dst +} + +// HuffmanEncodeLength returns the number of bytes required to encode +// s in Huffman codes. The result is round up to byte boundary. +func HuffmanEncodeLength(s string) uint64 { + n := uint64(0) + for i := 0; i < len(s); i++ { + n += uint64(huffmanCodeLen[s[i]]) + } + return (n + 7) / 8 +} + +// appendByteToHuffmanCode appends Huffman code for c to dst and +// returns the extended buffer and the remaining bits in the last +// element. The appending is not byte aligned and the remaining bits +// in the last element of dst is given in rembits. +func appendByteToHuffmanCode(dst []byte, rembits uint8, c byte) ([]byte, uint8) { + code := huffmanCodes[c] + nbits := huffmanCodeLen[c] + + for { + if rembits > nbits { + t := uint8(code << (rembits - nbits)) + dst[len(dst)-1] |= t + rembits -= nbits + break + } + + t := uint8(code >> (nbits - rembits)) + dst[len(dst)-1] |= t + + nbits -= rembits + rembits = 8 + + if nbits == 0 { + break + } + + dst = append(dst, 0) + } + + return dst, rembits +} diff --git a/vendor/golang.org/x/net/http2/hpack/tables.go b/vendor/golang.org/x/net/http2/hpack/tables.go new file mode 100644 index 00000000..a66cfbea --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/tables.go @@ -0,0 +1,479 @@ +// 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 hpack + +import ( + "fmt" +) + +// headerFieldTable implements a list of HeaderFields. +// This is used to implement the static and dynamic tables. +type headerFieldTable struct { + // For static tables, entries are never evicted. + // + // For dynamic tables, entries are evicted from ents[0] and added to the end. + // Each entry has a unique id that starts at one and increments for each + // entry that is added. This unique id is stable across evictions, meaning + // it can be used as a pointer to a specific entry. As in hpack, unique ids + // are 1-based. The unique id for ents[k] is k + evictCount + 1. + // + // Zero is not a valid unique id. + // + // evictCount should not overflow in any remotely practical situation. In + // practice, we will have one dynamic table per HTTP/2 connection. If we + // assume a very powerful server that handles 1M QPS per connection and each + // request adds (then evicts) 100 entries from the table, it would still take + // 2M years for evictCount to overflow. + ents []HeaderField + evictCount uint64 + + // byName maps a HeaderField name to the unique id of the newest entry with + // the same name. See above for a definition of "unique id". + byName map[string]uint64 + + // byNameValue maps a HeaderField name/value pair to the unique id of the newest + // entry with the same name and value. See above for a definition of "unique id". + byNameValue map[pairNameValue]uint64 +} + +type pairNameValue struct { + name, value string +} + +func (t *headerFieldTable) init() { + t.byName = make(map[string]uint64) + t.byNameValue = make(map[pairNameValue]uint64) +} + +// len reports the number of entries in the table. +func (t *headerFieldTable) len() int { + return len(t.ents) +} + +// addEntry adds a new entry. +func (t *headerFieldTable) addEntry(f HeaderField) { + id := uint64(t.len()) + t.evictCount + 1 + t.byName[f.Name] = id + t.byNameValue[pairNameValue{f.Name, f.Value}] = id + t.ents = append(t.ents, f) +} + +// evictOldest evicts the n oldest entries in the table. +func (t *headerFieldTable) evictOldest(n int) { + if n > t.len() { + panic(fmt.Sprintf("evictOldest(%v) on table with %v entries", n, t.len())) + } + for k := 0; k < n; k++ { + f := t.ents[k] + id := t.evictCount + uint64(k) + 1 + if t.byName[f.Name] == id { + delete(t.byName, f.Name) + } + if p := (pairNameValue{f.Name, f.Value}); t.byNameValue[p] == id { + delete(t.byNameValue, p) + } + } + copy(t.ents, t.ents[n:]) + for k := t.len() - n; k < t.len(); k++ { + t.ents[k] = HeaderField{} // so strings can be garbage collected + } + t.ents = t.ents[:t.len()-n] + if t.evictCount+uint64(n) < t.evictCount { + panic("evictCount overflow") + } + t.evictCount += uint64(n) +} + +// search finds f in the table. If there is no match, i is 0. +// If both name and value match, i is the matched index and nameValueMatch +// becomes true. If only name matches, i points to that index and +// nameValueMatch becomes false. +// +// The returned index is a 1-based HPACK index. For dynamic tables, HPACK says +// that index 1 should be the newest entry, but t.ents[0] is the oldest entry, +// meaning t.ents is reversed for dynamic tables. Hence, when t is a dynamic +// table, the return value i actually refers to the entry t.ents[t.len()-i]. +// +// All tables are assumed to be a dynamic tables except for the global +// staticTable pointer. +// +// See Section 2.3.3. +func (t *headerFieldTable) search(f HeaderField) (i uint64, nameValueMatch bool) { + if !f.Sensitive { + if id := t.byNameValue[pairNameValue{f.Name, f.Value}]; id != 0 { + return t.idToIndex(id), true + } + } + if id := t.byName[f.Name]; id != 0 { + return t.idToIndex(id), false + } + return 0, false +} + +// idToIndex converts a unique id to an HPACK index. +// See Section 2.3.3. +func (t *headerFieldTable) idToIndex(id uint64) uint64 { + if id <= t.evictCount { + panic(fmt.Sprintf("id (%v) <= evictCount (%v)", id, t.evictCount)) + } + k := id - t.evictCount - 1 // convert id to an index t.ents[k] + if t != staticTable { + return uint64(t.len()) - k // dynamic table + } + return k + 1 +} + +// http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B +var staticTable = newStaticTable() +var staticTableEntries = [...]HeaderField{ + {Name: ":authority"}, + {Name: ":method", Value: "GET"}, + {Name: ":method", Value: "POST"}, + {Name: ":path", Value: "/"}, + {Name: ":path", Value: "/index.html"}, + {Name: ":scheme", Value: "http"}, + {Name: ":scheme", Value: "https"}, + {Name: ":status", Value: "200"}, + {Name: ":status", Value: "204"}, + {Name: ":status", Value: "206"}, + {Name: ":status", Value: "304"}, + {Name: ":status", Value: "400"}, + {Name: ":status", Value: "404"}, + {Name: ":status", Value: "500"}, + {Name: "accept-charset"}, + {Name: "accept-encoding", Value: "gzip, deflate"}, + {Name: "accept-language"}, + {Name: "accept-ranges"}, + {Name: "accept"}, + {Name: "access-control-allow-origin"}, + {Name: "age"}, + {Name: "allow"}, + {Name: "authorization"}, + {Name: "cache-control"}, + {Name: "content-disposition"}, + {Name: "content-encoding"}, + {Name: "content-language"}, + {Name: "content-length"}, + {Name: "content-location"}, + {Name: "content-range"}, + {Name: "content-type"}, + {Name: "cookie"}, + {Name: "date"}, + {Name: "etag"}, + {Name: "expect"}, + {Name: "expires"}, + {Name: "from"}, + {Name: "host"}, + {Name: "if-match"}, + {Name: "if-modified-since"}, + {Name: "if-none-match"}, + {Name: "if-range"}, + {Name: "if-unmodified-since"}, + {Name: "last-modified"}, + {Name: "link"}, + {Name: "location"}, + {Name: "max-forwards"}, + {Name: "proxy-authenticate"}, + {Name: "proxy-authorization"}, + {Name: "range"}, + {Name: "referer"}, + {Name: "refresh"}, + {Name: "retry-after"}, + {Name: "server"}, + {Name: "set-cookie"}, + {Name: "strict-transport-security"}, + {Name: "transfer-encoding"}, + {Name: "user-agent"}, + {Name: "vary"}, + {Name: "via"}, + {Name: "www-authenticate"}, +} + +func newStaticTable() *headerFieldTable { + t := &headerFieldTable{} + t.init() + for _, e := range staticTableEntries[:] { + t.addEntry(e) + } + return t +} + +var huffmanCodes = [256]uint32{ + 0x1ff8, + 0x7fffd8, + 0xfffffe2, + 0xfffffe3, + 0xfffffe4, + 0xfffffe5, + 0xfffffe6, + 0xfffffe7, + 0xfffffe8, + 0xffffea, + 0x3ffffffc, + 0xfffffe9, + 0xfffffea, + 0x3ffffffd, + 0xfffffeb, + 0xfffffec, + 0xfffffed, + 0xfffffee, + 0xfffffef, + 0xffffff0, + 0xffffff1, + 0xffffff2, + 0x3ffffffe, + 0xffffff3, + 0xffffff4, + 0xffffff5, + 0xffffff6, + 0xffffff7, + 0xffffff8, + 0xffffff9, + 0xffffffa, + 0xffffffb, + 0x14, + 0x3f8, + 0x3f9, + 0xffa, + 0x1ff9, + 0x15, + 0xf8, + 0x7fa, + 0x3fa, + 0x3fb, + 0xf9, + 0x7fb, + 0xfa, + 0x16, + 0x17, + 0x18, + 0x0, + 0x1, + 0x2, + 0x19, + 0x1a, + 0x1b, + 0x1c, + 0x1d, + 0x1e, + 0x1f, + 0x5c, + 0xfb, + 0x7ffc, + 0x20, + 0xffb, + 0x3fc, + 0x1ffa, + 0x21, + 0x5d, + 0x5e, + 0x5f, + 0x60, + 0x61, + 0x62, + 0x63, + 0x64, + 0x65, + 0x66, + 0x67, + 0x68, + 0x69, + 0x6a, + 0x6b, + 0x6c, + 0x6d, + 0x6e, + 0x6f, + 0x70, + 0x71, + 0x72, + 0xfc, + 0x73, + 0xfd, + 0x1ffb, + 0x7fff0, + 0x1ffc, + 0x3ffc, + 0x22, + 0x7ffd, + 0x3, + 0x23, + 0x4, + 0x24, + 0x5, + 0x25, + 0x26, + 0x27, + 0x6, + 0x74, + 0x75, + 0x28, + 0x29, + 0x2a, + 0x7, + 0x2b, + 0x76, + 0x2c, + 0x8, + 0x9, + 0x2d, + 0x77, + 0x78, + 0x79, + 0x7a, + 0x7b, + 0x7ffe, + 0x7fc, + 0x3ffd, + 0x1ffd, + 0xffffffc, + 0xfffe6, + 0x3fffd2, + 0xfffe7, + 0xfffe8, + 0x3fffd3, + 0x3fffd4, + 0x3fffd5, + 0x7fffd9, + 0x3fffd6, + 0x7fffda, + 0x7fffdb, + 0x7fffdc, + 0x7fffdd, + 0x7fffde, + 0xffffeb, + 0x7fffdf, + 0xffffec, + 0xffffed, + 0x3fffd7, + 0x7fffe0, + 0xffffee, + 0x7fffe1, + 0x7fffe2, + 0x7fffe3, + 0x7fffe4, + 0x1fffdc, + 0x3fffd8, + 0x7fffe5, + 0x3fffd9, + 0x7fffe6, + 0x7fffe7, + 0xffffef, + 0x3fffda, + 0x1fffdd, + 0xfffe9, + 0x3fffdb, + 0x3fffdc, + 0x7fffe8, + 0x7fffe9, + 0x1fffde, + 0x7fffea, + 0x3fffdd, + 0x3fffde, + 0xfffff0, + 0x1fffdf, + 0x3fffdf, + 0x7fffeb, + 0x7fffec, + 0x1fffe0, + 0x1fffe1, + 0x3fffe0, + 0x1fffe2, + 0x7fffed, + 0x3fffe1, + 0x7fffee, + 0x7fffef, + 0xfffea, + 0x3fffe2, + 0x3fffe3, + 0x3fffe4, + 0x7ffff0, + 0x3fffe5, + 0x3fffe6, + 0x7ffff1, + 0x3ffffe0, + 0x3ffffe1, + 0xfffeb, + 0x7fff1, + 0x3fffe7, + 0x7ffff2, + 0x3fffe8, + 0x1ffffec, + 0x3ffffe2, + 0x3ffffe3, + 0x3ffffe4, + 0x7ffffde, + 0x7ffffdf, + 0x3ffffe5, + 0xfffff1, + 0x1ffffed, + 0x7fff2, + 0x1fffe3, + 0x3ffffe6, + 0x7ffffe0, + 0x7ffffe1, + 0x3ffffe7, + 0x7ffffe2, + 0xfffff2, + 0x1fffe4, + 0x1fffe5, + 0x3ffffe8, + 0x3ffffe9, + 0xffffffd, + 0x7ffffe3, + 0x7ffffe4, + 0x7ffffe5, + 0xfffec, + 0xfffff3, + 0xfffed, + 0x1fffe6, + 0x3fffe9, + 0x1fffe7, + 0x1fffe8, + 0x7ffff3, + 0x3fffea, + 0x3fffeb, + 0x1ffffee, + 0x1ffffef, + 0xfffff4, + 0xfffff5, + 0x3ffffea, + 0x7ffff4, + 0x3ffffeb, + 0x7ffffe6, + 0x3ffffec, + 0x3ffffed, + 0x7ffffe7, + 0x7ffffe8, + 0x7ffffe9, + 0x7ffffea, + 0x7ffffeb, + 0xffffffe, + 0x7ffffec, + 0x7ffffed, + 0x7ffffee, + 0x7ffffef, + 0x7fffff0, + 0x3ffffee, +} + +var huffmanCodeLen = [256]uint8{ + 13, 23, 28, 28, 28, 28, 28, 28, 28, 24, 30, 28, 28, 30, 28, 28, + 28, 28, 28, 28, 28, 28, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 6, 10, 10, 12, 13, 6, 8, 11, 10, 10, 8, 11, 8, 6, 6, 6, + 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 8, 15, 6, 12, 10, + 13, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 13, 19, 13, 14, 6, + 15, 5, 6, 5, 6, 5, 6, 6, 6, 5, 7, 7, 6, 6, 6, 5, + 6, 7, 6, 5, 5, 6, 7, 7, 7, 7, 7, 15, 11, 14, 13, 28, + 20, 22, 20, 20, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 24, 23, + 24, 24, 22, 23, 24, 23, 23, 23, 23, 21, 22, 23, 22, 23, 23, 24, + 22, 21, 20, 22, 22, 23, 23, 21, 23, 22, 22, 24, 21, 22, 23, 23, + 21, 21, 22, 21, 23, 22, 23, 23, 20, 22, 22, 22, 23, 22, 22, 23, + 26, 26, 20, 19, 22, 23, 22, 25, 26, 26, 26, 27, 27, 26, 24, 25, + 19, 21, 26, 27, 27, 26, 27, 24, 21, 21, 26, 26, 28, 27, 27, 27, + 20, 24, 20, 21, 22, 21, 21, 23, 22, 22, 25, 25, 24, 24, 26, 23, + 26, 27, 26, 26, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 27, 26, +} diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go new file mode 100644 index 00000000..5571ccfd --- /dev/null +++ b/vendor/golang.org/x/net/http2/http2.go @@ -0,0 +1,385 @@ +// 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 http2 implements the HTTP/2 protocol. +// +// This package is low-level and intended to be used directly by very +// few people. Most users will use it indirectly through the automatic +// use by the net/http package (from Go 1.6 and later). +// For use in earlier Go versions see ConfigureServer. (Transport support +// requires Go 1.6 or later) +// +// See https://http2.github.io/ for more information on HTTP/2. +// +// See https://http2.golang.org/ for a test server running this code. +// +package http2 // import "golang.org/x/net/http2" + +import ( + "bufio" + "crypto/tls" + "fmt" + "io" + "net/http" + "os" + "sort" + "strconv" + "strings" + "sync" + + "golang.org/x/net/http/httpguts" +) + +var ( + VerboseLogs bool + logFrameWrites bool + logFrameReads bool + inTests bool +) + +func init() { + e := os.Getenv("GODEBUG") + if strings.Contains(e, "http2debug=1") { + VerboseLogs = true + } + if strings.Contains(e, "http2debug=2") { + VerboseLogs = true + logFrameWrites = true + logFrameReads = true + } +} + +const ( + // ClientPreface is the string that must be sent by new + // connections from clients. + ClientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" + + // SETTINGS_MAX_FRAME_SIZE default + // http://http2.github.io/http2-spec/#rfc.section.6.5.2 + initialMaxFrameSize = 16384 + + // NextProtoTLS is the NPN/ALPN protocol negotiated during + // HTTP/2's TLS setup. + NextProtoTLS = "h2" + + // http://http2.github.io/http2-spec/#SettingValues + initialHeaderTableSize = 4096 + + initialWindowSize = 65535 // 6.9.2 Initial Flow Control Window Size + + defaultMaxReadFrameSize = 1 << 20 +) + +var ( + clientPreface = []byte(ClientPreface) +) + +type streamState int + +// HTTP/2 stream states. +// +// See http://tools.ietf.org/html/rfc7540#section-5.1. +// +// For simplicity, the server code merges "reserved (local)" into +// "half-closed (remote)". This is one less state transition to track. +// The only downside is that we send PUSH_PROMISEs slightly less +// liberally than allowable. More discussion here: +// https://lists.w3.org/Archives/Public/ietf-http-wg/2016JulSep/0599.html +// +// "reserved (remote)" is omitted since the client code does not +// support server push. +const ( + stateIdle streamState = iota + stateOpen + stateHalfClosedLocal + stateHalfClosedRemote + stateClosed +) + +var stateName = [...]string{ + stateIdle: "Idle", + stateOpen: "Open", + stateHalfClosedLocal: "HalfClosedLocal", + stateHalfClosedRemote: "HalfClosedRemote", + stateClosed: "Closed", +} + +func (st streamState) String() string { + return stateName[st] +} + +// Setting is a setting parameter: which setting it is, and its value. +type Setting struct { + // ID is which setting is being set. + // See http://http2.github.io/http2-spec/#SettingValues + ID SettingID + + // Val is the value. + Val uint32 +} + +func (s Setting) String() string { + return fmt.Sprintf("[%v = %d]", s.ID, s.Val) +} + +// Valid reports whether the setting is valid. +func (s Setting) Valid() error { + // Limits and error codes from 6.5.2 Defined SETTINGS Parameters + switch s.ID { + case SettingEnablePush: + if s.Val != 1 && s.Val != 0 { + return ConnectionError(ErrCodeProtocol) + } + case SettingInitialWindowSize: + if s.Val > 1<<31-1 { + return ConnectionError(ErrCodeFlowControl) + } + case SettingMaxFrameSize: + if s.Val < 16384 || s.Val > 1<<24-1 { + return ConnectionError(ErrCodeProtocol) + } + } + return nil +} + +// A SettingID is an HTTP/2 setting as defined in +// http://http2.github.io/http2-spec/#iana-settings +type SettingID uint16 + +const ( + SettingHeaderTableSize SettingID = 0x1 + SettingEnablePush SettingID = 0x2 + SettingMaxConcurrentStreams SettingID = 0x3 + SettingInitialWindowSize SettingID = 0x4 + SettingMaxFrameSize SettingID = 0x5 + SettingMaxHeaderListSize SettingID = 0x6 +) + +var settingName = map[SettingID]string{ + SettingHeaderTableSize: "HEADER_TABLE_SIZE", + SettingEnablePush: "ENABLE_PUSH", + SettingMaxConcurrentStreams: "MAX_CONCURRENT_STREAMS", + SettingInitialWindowSize: "INITIAL_WINDOW_SIZE", + SettingMaxFrameSize: "MAX_FRAME_SIZE", + SettingMaxHeaderListSize: "MAX_HEADER_LIST_SIZE", +} + +func (s SettingID) String() string { + if v, ok := settingName[s]; ok { + return v + } + return fmt.Sprintf("UNKNOWN_SETTING_%d", uint16(s)) +} + +// validWireHeaderFieldName reports whether v is a valid header field +// name (key). See httpguts.ValidHeaderName for the base rules. +// +// Further, http2 says: +// "Just as in HTTP/1.x, header field names are strings of ASCII +// characters that are compared in a case-insensitive +// fashion. However, header field names MUST be converted to +// lowercase prior to their encoding in HTTP/2. " +func validWireHeaderFieldName(v string) bool { + if len(v) == 0 { + return false + } + for _, r := range v { + if !httpguts.IsTokenRune(r) { + return false + } + if 'A' <= r && r <= 'Z' { + return false + } + } + return true +} + +func httpCodeString(code int) string { + switch code { + case 200: + return "200" + case 404: + return "404" + } + return strconv.Itoa(code) +} + +// from pkg io +type stringWriter interface { + WriteString(s string) (n int, err error) +} + +// A gate lets two goroutines coordinate their activities. +type gate chan struct{} + +func (g gate) Done() { g <- struct{}{} } +func (g gate) Wait() { <-g } + +// A closeWaiter is like a sync.WaitGroup but only goes 1 to 0 (open to closed). +type closeWaiter chan struct{} + +// Init makes a closeWaiter usable. +// It exists because so a closeWaiter value can be placed inside a +// larger struct and have the Mutex and Cond's memory in the same +// allocation. +func (cw *closeWaiter) Init() { + *cw = make(chan struct{}) +} + +// Close marks the closeWaiter as closed and unblocks any waiters. +func (cw closeWaiter) Close() { + close(cw) +} + +// Wait waits for the closeWaiter to become closed. +func (cw closeWaiter) Wait() { + <-cw +} + +// bufferedWriter is a buffered writer that writes to w. +// Its buffered writer is lazily allocated as needed, to minimize +// idle memory usage with many connections. +type bufferedWriter struct { + _ incomparable + w io.Writer // immutable + bw *bufio.Writer // non-nil when data is buffered +} + +func newBufferedWriter(w io.Writer) *bufferedWriter { + return &bufferedWriter{w: w} +} + +// bufWriterPoolBufferSize is the size of bufio.Writer's +// buffers created using bufWriterPool. +// +// TODO: pick a less arbitrary value? this is a bit under +// (3 x typical 1500 byte MTU) at least. Other than that, +// not much thought went into it. +const bufWriterPoolBufferSize = 4 << 10 + +var bufWriterPool = sync.Pool{ + New: func() interface{} { + return bufio.NewWriterSize(nil, bufWriterPoolBufferSize) + }, +} + +func (w *bufferedWriter) Available() int { + if w.bw == nil { + return bufWriterPoolBufferSize + } + return w.bw.Available() +} + +func (w *bufferedWriter) Write(p []byte) (n int, err error) { + if w.bw == nil { + bw := bufWriterPool.Get().(*bufio.Writer) + bw.Reset(w.w) + w.bw = bw + } + return w.bw.Write(p) +} + +func (w *bufferedWriter) Flush() error { + bw := w.bw + if bw == nil { + return nil + } + err := bw.Flush() + bw.Reset(nil) + bufWriterPool.Put(bw) + w.bw = nil + return err +} + +func mustUint31(v int32) uint32 { + if v < 0 || v > 2147483647 { + panic("out of range") + } + return uint32(v) +} + +// bodyAllowedForStatus reports whether a given response status code +// permits a body. See RFC 7230, section 3.3. +func bodyAllowedForStatus(status int) bool { + switch { + case status >= 100 && status <= 199: + return false + case status == 204: + return false + case status == 304: + return false + } + return true +} + +type httpError struct { + _ incomparable + msg string + timeout bool +} + +func (e *httpError) Error() string { return e.msg } +func (e *httpError) Timeout() bool { return e.timeout } +func (e *httpError) Temporary() bool { return true } + +var errTimeout error = &httpError{msg: "http2: timeout awaiting response headers", timeout: true} + +type connectionStater interface { + ConnectionState() tls.ConnectionState +} + +var sorterPool = sync.Pool{New: func() interface{} { return new(sorter) }} + +type sorter struct { + v []string // owned by sorter +} + +func (s *sorter) Len() int { return len(s.v) } +func (s *sorter) Swap(i, j int) { s.v[i], s.v[j] = s.v[j], s.v[i] } +func (s *sorter) Less(i, j int) bool { return s.v[i] < s.v[j] } + +// Keys returns the sorted keys of h. +// +// The returned slice is only valid until s used again or returned to +// its pool. +func (s *sorter) Keys(h http.Header) []string { + keys := s.v[:0] + for k := range h { + keys = append(keys, k) + } + s.v = keys + sort.Sort(s) + return keys +} + +func (s *sorter) SortStrings(ss []string) { + // Our sorter works on s.v, which sorter owns, so + // stash it away while we sort the user's buffer. + save := s.v + s.v = ss + sort.Sort(s) + s.v = save +} + +// validPseudoPath reports whether v is a valid :path pseudo-header +// value. It must be either: +// +// *) a non-empty string starting with '/' +// *) the string '*', for OPTIONS requests. +// +// For now this is only used a quick check for deciding when to clean +// up Opaque URLs before sending requests from the Transport. +// See golang.org/issue/16847 +// +// We used to enforce that the path also didn't start with "//", but +// Google's GFE accepts such paths and Chrome sends them, so ignore +// that part of the spec. See golang.org/issue/19103. +func validPseudoPath(v string) bool { + return (len(v) > 0 && v[0] == '/') || v == "*" +} + +// incomparable is a zero-width, non-comparable type. Adding it to a struct +// makes that struct also non-comparable, and generally doesn't add +// any size (as long as it's first). +type incomparable [0]func() diff --git a/vendor/golang.org/x/net/http2/not_go111.go b/vendor/golang.org/x/net/http2/not_go111.go new file mode 100644 index 00000000..161bca7c --- /dev/null +++ b/vendor/golang.org/x/net/http2/not_go111.go @@ -0,0 +1,20 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.11 + +package http2 + +import ( + "net/http/httptrace" + "net/textproto" +) + +func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { return false } + +func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) {} + +func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { + return nil +} diff --git a/vendor/golang.org/x/net/http2/pipe.go b/vendor/golang.org/x/net/http2/pipe.go new file mode 100644 index 00000000..2a5399ec --- /dev/null +++ b/vendor/golang.org/x/net/http2/pipe.go @@ -0,0 +1,168 @@ +// 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 http2 + +import ( + "errors" + "io" + "sync" +) + +// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like +// io.Pipe except there are no PipeReader/PipeWriter halves, and the +// underlying buffer is an interface. (io.Pipe is always unbuffered) +type pipe struct { + mu sync.Mutex + c sync.Cond // c.L lazily initialized to &p.mu + b pipeBuffer // nil when done reading + unread int // bytes unread when done + err error // read error once empty. non-nil means closed. + breakErr error // immediate read error (caller doesn't see rest of b) + donec chan struct{} // closed on error + readFn func() // optional code to run in Read before error +} + +type pipeBuffer interface { + Len() int + io.Writer + io.Reader +} + +func (p *pipe) Len() int { + p.mu.Lock() + defer p.mu.Unlock() + if p.b == nil { + return p.unread + } + return p.b.Len() +} + +// Read waits until data is available and copies bytes +// from the buffer into p. +func (p *pipe) Read(d []byte) (n int, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + for { + if p.breakErr != nil { + return 0, p.breakErr + } + if p.b != nil && p.b.Len() > 0 { + return p.b.Read(d) + } + if p.err != nil { + if p.readFn != nil { + p.readFn() // e.g. copy trailers + p.readFn = nil // not sticky like p.err + } + p.b = nil + return 0, p.err + } + p.c.Wait() + } +} + +var errClosedPipeWrite = errors.New("write on closed buffer") + +// Write copies bytes from p into the buffer and wakes a reader. +// It is an error to write more data than the buffer can hold. +func (p *pipe) Write(d []byte) (n int, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + defer p.c.Signal() + if p.err != nil { + return 0, errClosedPipeWrite + } + if p.breakErr != nil { + p.unread += len(d) + return len(d), nil // discard when there is no reader + } + return p.b.Write(d) +} + +// CloseWithError causes the next Read (waking up a current blocked +// Read if needed) to return the provided err after all data has been +// read. +// +// The error must be non-nil. +func (p *pipe) CloseWithError(err error) { p.closeWithError(&p.err, err, nil) } + +// BreakWithError causes the next Read (waking up a current blocked +// Read if needed) to return the provided err immediately, without +// waiting for unread data. +func (p *pipe) BreakWithError(err error) { p.closeWithError(&p.breakErr, err, nil) } + +// closeWithErrorAndCode is like CloseWithError but also sets some code to run +// in the caller's goroutine before returning the error. +func (p *pipe) closeWithErrorAndCode(err error, fn func()) { p.closeWithError(&p.err, err, fn) } + +func (p *pipe) closeWithError(dst *error, err error, fn func()) { + if err == nil { + panic("err must be non-nil") + } + p.mu.Lock() + defer p.mu.Unlock() + if p.c.L == nil { + p.c.L = &p.mu + } + defer p.c.Signal() + if *dst != nil { + // Already been done. + return + } + p.readFn = fn + if dst == &p.breakErr { + if p.b != nil { + p.unread += p.b.Len() + } + p.b = nil + } + *dst = err + p.closeDoneLocked() +} + +// requires p.mu be held. +func (p *pipe) closeDoneLocked() { + if p.donec == nil { + return + } + // Close if unclosed. This isn't racy since we always + // hold p.mu while closing. + select { + case <-p.donec: + default: + close(p.donec) + } +} + +// Err returns the error (if any) first set by BreakWithError or CloseWithError. +func (p *pipe) Err() error { + p.mu.Lock() + defer p.mu.Unlock() + if p.breakErr != nil { + return p.breakErr + } + return p.err +} + +// Done returns a channel which is closed if and when this pipe is closed +// with CloseWithError. +func (p *pipe) Done() <-chan struct{} { + p.mu.Lock() + defer p.mu.Unlock() + if p.donec == nil { + p.donec = make(chan struct{}) + if p.err != nil || p.breakErr != nil { + // Already hit an error. + p.closeDoneLocked() + } + } + return p.donec +} diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go new file mode 100644 index 00000000..345b7cd8 --- /dev/null +++ b/vendor/golang.org/x/net/http2/server.go @@ -0,0 +1,2964 @@ +// 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. + +// TODO: turn off the serve goroutine when idle, so +// an idle conn only has the readFrames goroutine active. (which could +// also be optimized probably to pin less memory in crypto/tls). This +// would involve tracking when the serve goroutine is active (atomic +// int32 read/CAS probably?) and starting it up when frames arrive, +// and shutting it down when all handlers exit. the occasional PING +// packets could use time.AfterFunc to call sc.wakeStartServeLoop() +// (which is a no-op if already running) and then queue the PING write +// as normal. The serve loop would then exit in most cases (if no +// Handlers running) and not be woken up again until the PING packet +// returns. + +// TODO (maybe): add a mechanism for Handlers to going into +// half-closed-local mode (rw.(io.Closer) test?) but not exit their +// handler, and continue to be able to read from the +// Request.Body. This would be a somewhat semantic change from HTTP/1 +// (or at least what we expose in net/http), so I'd probably want to +// add it there too. For now, this package says that returning from +// the Handler ServeHTTP function means you're both done reading and +// done writing, without a way to stop just one or the other. + +package http2 + +import ( + "bufio" + "bytes" + "context" + "crypto/tls" + "errors" + "fmt" + "io" + "log" + "math" + "net" + "net/http" + "net/textproto" + "net/url" + "os" + "reflect" + "runtime" + "strconv" + "strings" + "sync" + "time" + + "golang.org/x/net/http/httpguts" + "golang.org/x/net/http2/hpack" +) + +const ( + prefaceTimeout = 10 * time.Second + firstSettingsTimeout = 2 * time.Second // should be in-flight with preface anyway + handlerChunkWriteSize = 4 << 10 + defaultMaxStreams = 250 // TODO: make this 100 as the GFE seems to? + maxQueuedControlFrames = 10000 +) + +var ( + errClientDisconnected = errors.New("client disconnected") + errClosedBody = errors.New("body closed by handler") + errHandlerComplete = errors.New("http2: request body closed due to handler exiting") + errStreamClosed = errors.New("http2: stream closed") +) + +var responseWriterStatePool = sync.Pool{ + New: func() interface{} { + rws := &responseWriterState{} + rws.bw = bufio.NewWriterSize(chunkWriter{rws}, handlerChunkWriteSize) + return rws + }, +} + +// Test hooks. +var ( + testHookOnConn func() + testHookGetServerConn func(*serverConn) + testHookOnPanicMu *sync.Mutex // nil except in tests + testHookOnPanic func(sc *serverConn, panicVal interface{}) (rePanic bool) +) + +// Server is an HTTP/2 server. +type Server struct { + // MaxHandlers limits the number of http.Handler ServeHTTP goroutines + // which may run at a time over all connections. + // Negative or zero no limit. + // TODO: implement + MaxHandlers int + + // MaxConcurrentStreams optionally specifies the number of + // concurrent streams that each client may have open at a + // time. This is unrelated to the number of http.Handler goroutines + // which may be active globally, which is MaxHandlers. + // If zero, MaxConcurrentStreams defaults to at least 100, per + // the HTTP/2 spec's recommendations. + MaxConcurrentStreams uint32 + + // MaxReadFrameSize optionally specifies the largest frame + // this server is willing to read. A valid value is between + // 16k and 16M, inclusive. If zero or otherwise invalid, a + // default value is used. + MaxReadFrameSize uint32 + + // PermitProhibitedCipherSuites, if true, permits the use of + // cipher suites prohibited by the HTTP/2 spec. + PermitProhibitedCipherSuites bool + + // IdleTimeout specifies how long until idle clients should be + // closed with a GOAWAY frame. PING frames are not considered + // activity for the purposes of IdleTimeout. + IdleTimeout time.Duration + + // MaxUploadBufferPerConnection is the size of the initial flow + // control window for each connections. The HTTP/2 spec does not + // allow this to be smaller than 65535 or larger than 2^32-1. + // If the value is outside this range, a default value will be + // used instead. + MaxUploadBufferPerConnection int32 + + // MaxUploadBufferPerStream is the size of the initial flow control + // window for each stream. The HTTP/2 spec does not allow this to + // be larger than 2^32-1. If the value is zero or larger than the + // maximum, a default value will be used instead. + MaxUploadBufferPerStream int32 + + // NewWriteScheduler constructs a write scheduler for a connection. + // If nil, a default scheduler is chosen. + NewWriteScheduler func() WriteScheduler + + // Internal state. This is a pointer (rather than embedded directly) + // so that we don't embed a Mutex in this struct, which will make the + // struct non-copyable, which might break some callers. + state *serverInternalState +} + +func (s *Server) initialConnRecvWindowSize() int32 { + if s.MaxUploadBufferPerConnection > initialWindowSize { + return s.MaxUploadBufferPerConnection + } + return 1 << 20 +} + +func (s *Server) initialStreamRecvWindowSize() int32 { + if s.MaxUploadBufferPerStream > 0 { + return s.MaxUploadBufferPerStream + } + return 1 << 20 +} + +func (s *Server) maxReadFrameSize() uint32 { + if v := s.MaxReadFrameSize; v >= minMaxFrameSize && v <= maxFrameSize { + return v + } + return defaultMaxReadFrameSize +} + +func (s *Server) maxConcurrentStreams() uint32 { + if v := s.MaxConcurrentStreams; v > 0 { + return v + } + return defaultMaxStreams +} + +// maxQueuedControlFrames is the maximum number of control frames like +// SETTINGS, PING and RST_STREAM that will be queued for writing before +// the connection is closed to prevent memory exhaustion attacks. +func (s *Server) maxQueuedControlFrames() int { + // TODO: if anybody asks, add a Server field, and remember to define the + // behavior of negative values. + return maxQueuedControlFrames +} + +type serverInternalState struct { + mu sync.Mutex + activeConns map[*serverConn]struct{} +} + +func (s *serverInternalState) registerConn(sc *serverConn) { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + s.activeConns[sc] = struct{}{} + s.mu.Unlock() +} + +func (s *serverInternalState) unregisterConn(sc *serverConn) { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + delete(s.activeConns, sc) + s.mu.Unlock() +} + +func (s *serverInternalState) startGracefulShutdown() { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + for sc := range s.activeConns { + sc.startGracefulShutdown() + } + s.mu.Unlock() +} + +// ConfigureServer adds HTTP/2 support to a net/http Server. +// +// The configuration conf may be nil. +// +// ConfigureServer must be called before s begins serving. +func ConfigureServer(s *http.Server, conf *Server) error { + if s == nil { + panic("nil *http.Server") + } + if conf == nil { + conf = new(Server) + } + conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})} + if h1, h2 := s, conf; h2.IdleTimeout == 0 { + if h1.IdleTimeout != 0 { + h2.IdleTimeout = h1.IdleTimeout + } else { + h2.IdleTimeout = h1.ReadTimeout + } + } + s.RegisterOnShutdown(conf.state.startGracefulShutdown) + + if s.TLSConfig == nil { + s.TLSConfig = new(tls.Config) + } else if s.TLSConfig.CipherSuites != nil { + // If they already provided a CipherSuite list, return + // an error if it has a bad order or is missing + // ECDHE_RSA_WITH_AES_128_GCM_SHA256 or ECDHE_ECDSA_WITH_AES_128_GCM_SHA256. + haveRequired := false + sawBad := false + for i, cs := range s.TLSConfig.CipherSuites { + switch cs { + case tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + // Alternative MTI cipher to not discourage ECDSA-only servers. + // See http://golang.org/cl/30721 for further information. + tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: + haveRequired = true + } + if isBadCipher(cs) { + sawBad = true + } else if sawBad { + return fmt.Errorf("http2: TLSConfig.CipherSuites index %d contains an HTTP/2-approved cipher suite (%#04x), but it comes after unapproved cipher suites. With this configuration, clients that don't support previous, approved cipher suites may be given an unapproved one and reject the connection.", i, cs) + } + } + if !haveRequired { + return fmt.Errorf("http2: TLSConfig.CipherSuites is missing an HTTP/2-required AES_128_GCM_SHA256 cipher (need at least one of TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 or TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256).") + } + } + + // Note: not setting MinVersion to tls.VersionTLS12, + // as we don't want to interfere with HTTP/1.1 traffic + // on the user's server. We enforce TLS 1.2 later once + // we accept a connection. Ideally this should be done + // during next-proto selection, but using TLS <1.2 with + // HTTP/2 is still the client's bug. + + s.TLSConfig.PreferServerCipherSuites = true + + haveNPN := false + for _, p := range s.TLSConfig.NextProtos { + if p == NextProtoTLS { + haveNPN = true + break + } + } + if !haveNPN { + s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, NextProtoTLS) + } + + if s.TLSNextProto == nil { + s.TLSNextProto = map[string]func(*http.Server, *tls.Conn, http.Handler){} + } + protoHandler := func(hs *http.Server, c *tls.Conn, h http.Handler) { + if testHookOnConn != nil { + testHookOnConn() + } + // The TLSNextProto interface predates contexts, so + // the net/http package passes down its per-connection + // base context via an exported but unadvertised + // method on the Handler. This is for internal + // net/http<=>http2 use only. + var ctx context.Context + type baseContexter interface { + BaseContext() context.Context + } + if bc, ok := h.(baseContexter); ok { + ctx = bc.BaseContext() + } + conf.ServeConn(c, &ServeConnOpts{ + Context: ctx, + Handler: h, + BaseConfig: hs, + }) + } + s.TLSNextProto[NextProtoTLS] = protoHandler + return nil +} + +// ServeConnOpts are options for the Server.ServeConn method. +type ServeConnOpts struct { + // Context is the base context to use. + // If nil, context.Background is used. + Context context.Context + + // BaseConfig optionally sets the base configuration + // for values. If nil, defaults are used. + BaseConfig *http.Server + + // Handler specifies which handler to use for processing + // requests. If nil, BaseConfig.Handler is used. If BaseConfig + // or BaseConfig.Handler is nil, http.DefaultServeMux is used. + Handler http.Handler +} + +func (o *ServeConnOpts) context() context.Context { + if o != nil && o.Context != nil { + return o.Context + } + return context.Background() +} + +func (o *ServeConnOpts) baseConfig() *http.Server { + if o != nil && o.BaseConfig != nil { + return o.BaseConfig + } + return new(http.Server) +} + +func (o *ServeConnOpts) handler() http.Handler { + if o != nil { + if o.Handler != nil { + return o.Handler + } + if o.BaseConfig != nil && o.BaseConfig.Handler != nil { + return o.BaseConfig.Handler + } + } + return http.DefaultServeMux +} + +// ServeConn serves HTTP/2 requests on the provided connection and +// blocks until the connection is no longer readable. +// +// ServeConn starts speaking HTTP/2 assuming that c has not had any +// reads or writes. It writes its initial settings frame and expects +// to be able to read the preface and settings frame from the +// client. If c has a ConnectionState method like a *tls.Conn, the +// ConnectionState is used to verify the TLS ciphersuite and to set +// the Request.TLS field in Handlers. +// +// ServeConn does not support h2c by itself. Any h2c support must be +// implemented in terms of providing a suitably-behaving net.Conn. +// +// The opts parameter is optional. If nil, default values are used. +func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { + baseCtx, cancel := serverConnBaseContext(c, opts) + defer cancel() + + sc := &serverConn{ + srv: s, + hs: opts.baseConfig(), + conn: c, + baseCtx: baseCtx, + remoteAddrStr: c.RemoteAddr().String(), + bw: newBufferedWriter(c), + handler: opts.handler(), + streams: make(map[uint32]*stream), + readFrameCh: make(chan readFrameResult), + wantWriteFrameCh: make(chan FrameWriteRequest, 8), + serveMsgCh: make(chan interface{}, 8), + wroteFrameCh: make(chan frameWriteResult, 1), // buffered; one send in writeFrameAsync + bodyReadCh: make(chan bodyReadMsg), // buffering doesn't matter either way + doneServing: make(chan struct{}), + clientMaxStreams: math.MaxUint32, // Section 6.5.2: "Initially, there is no limit to this value" + advMaxStreams: s.maxConcurrentStreams(), + initialStreamSendWindowSize: initialWindowSize, + maxFrameSize: initialMaxFrameSize, + headerTableSize: initialHeaderTableSize, + serveG: newGoroutineLock(), + pushEnabled: true, + } + + s.state.registerConn(sc) + defer s.state.unregisterConn(sc) + + // The net/http package sets the write deadline from the + // http.Server.WriteTimeout during the TLS handshake, but then + // passes the connection off to us with the deadline already set. + // Write deadlines are set per stream in serverConn.newStream. + // Disarm the net.Conn write deadline here. + if sc.hs.WriteTimeout != 0 { + sc.conn.SetWriteDeadline(time.Time{}) + } + + if s.NewWriteScheduler != nil { + sc.writeSched = s.NewWriteScheduler() + } else { + sc.writeSched = NewRandomWriteScheduler() + } + + // These start at the RFC-specified defaults. If there is a higher + // configured value for inflow, that will be updated when we send a + // WINDOW_UPDATE shortly after sending SETTINGS. + sc.flow.add(initialWindowSize) + sc.inflow.add(initialWindowSize) + sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf) + + fr := NewFramer(sc.bw, c) + fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) + fr.MaxHeaderListSize = sc.maxHeaderListSize() + fr.SetMaxReadFrameSize(s.maxReadFrameSize()) + sc.framer = fr + + if tc, ok := c.(connectionStater); ok { + sc.tlsState = new(tls.ConnectionState) + *sc.tlsState = tc.ConnectionState() + // 9.2 Use of TLS Features + // An implementation of HTTP/2 over TLS MUST use TLS + // 1.2 or higher with the restrictions on feature set + // and cipher suite described in this section. Due to + // implementation limitations, it might not be + // possible to fail TLS negotiation. An endpoint MUST + // immediately terminate an HTTP/2 connection that + // does not meet the TLS requirements described in + // this section with a connection error (Section + // 5.4.1) of type INADEQUATE_SECURITY. + if sc.tlsState.Version < tls.VersionTLS12 { + sc.rejectConn(ErrCodeInadequateSecurity, "TLS version too low") + return + } + + if sc.tlsState.ServerName == "" { + // Client must use SNI, but we don't enforce that anymore, + // since it was causing problems when connecting to bare IP + // addresses during development. + // + // TODO: optionally enforce? Or enforce at the time we receive + // a new request, and verify the ServerName matches the :authority? + // But that precludes proxy situations, perhaps. + // + // So for now, do nothing here again. + } + + if !s.PermitProhibitedCipherSuites && isBadCipher(sc.tlsState.CipherSuite) { + // "Endpoints MAY choose to generate a connection error + // (Section 5.4.1) of type INADEQUATE_SECURITY if one of + // the prohibited cipher suites are negotiated." + // + // We choose that. In my opinion, the spec is weak + // here. It also says both parties must support at least + // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 so there's no + // excuses here. If we really must, we could allow an + // "AllowInsecureWeakCiphers" option on the server later. + // Let's see how it plays out first. + sc.rejectConn(ErrCodeInadequateSecurity, fmt.Sprintf("Prohibited TLS 1.2 Cipher Suite: %x", sc.tlsState.CipherSuite)) + return + } + } + + if hook := testHookGetServerConn; hook != nil { + hook(sc) + } + sc.serve() +} + +func serverConnBaseContext(c net.Conn, opts *ServeConnOpts) (ctx context.Context, cancel func()) { + ctx, cancel = context.WithCancel(opts.context()) + ctx = context.WithValue(ctx, http.LocalAddrContextKey, c.LocalAddr()) + if hs := opts.baseConfig(); hs != nil { + ctx = context.WithValue(ctx, http.ServerContextKey, hs) + } + return +} + +func (sc *serverConn) rejectConn(err ErrCode, debug string) { + sc.vlogf("http2: server rejecting conn: %v, %s", err, debug) + // ignoring errors. hanging up anyway. + sc.framer.WriteGoAway(0, err, []byte(debug)) + sc.bw.Flush() + sc.conn.Close() +} + +type serverConn struct { + // Immutable: + srv *Server + hs *http.Server + conn net.Conn + bw *bufferedWriter // writing to conn + handler http.Handler + baseCtx context.Context + framer *Framer + doneServing chan struct{} // closed when serverConn.serve ends + readFrameCh chan readFrameResult // written by serverConn.readFrames + wantWriteFrameCh chan FrameWriteRequest // from handlers -> serve + wroteFrameCh chan frameWriteResult // from writeFrameAsync -> serve, tickles more frame writes + bodyReadCh chan bodyReadMsg // from handlers -> serve + serveMsgCh chan interface{} // misc messages & code to send to / run on the serve loop + flow flow // conn-wide (not stream-specific) outbound flow control + inflow flow // conn-wide inbound flow control + tlsState *tls.ConnectionState // shared by all handlers, like net/http + remoteAddrStr string + writeSched WriteScheduler + + // Everything following is owned by the serve loop; use serveG.check(): + serveG goroutineLock // used to verify funcs are on serve() + pushEnabled bool + sawFirstSettings bool // got the initial SETTINGS frame after the preface + needToSendSettingsAck bool + unackedSettings int // how many SETTINGS have we sent without ACKs? + queuedControlFrames int // control frames in the writeSched queue + clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit) + advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client + curClientStreams uint32 // number of open streams initiated by the client + curPushedStreams uint32 // number of open streams initiated by server push + maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests + maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes + streams map[uint32]*stream + initialStreamSendWindowSize int32 + maxFrameSize int32 + headerTableSize uint32 + peerMaxHeaderListSize uint32 // zero means unknown (default) + canonHeader map[string]string // http2-lower-case -> Go-Canonical-Case + writingFrame bool // started writing a frame (on serve goroutine or separate) + writingFrameAsync bool // started a frame on its own goroutine but haven't heard back on wroteFrameCh + needsFrameFlush bool // last frame write wasn't a flush + inGoAway bool // we've started to or sent GOAWAY + inFrameScheduleLoop bool // whether we're in the scheduleFrameWrite loop + needToSendGoAway bool // we need to schedule a GOAWAY frame write + goAwayCode ErrCode + shutdownTimer *time.Timer // nil until used + idleTimer *time.Timer // nil if unused + + // Owned by the writeFrameAsync goroutine: + headerWriteBuf bytes.Buffer + hpackEncoder *hpack.Encoder + + // Used by startGracefulShutdown. + shutdownOnce sync.Once +} + +func (sc *serverConn) maxHeaderListSize() uint32 { + n := sc.hs.MaxHeaderBytes + if n <= 0 { + n = http.DefaultMaxHeaderBytes + } + // http2's count is in a slightly different unit and includes 32 bytes per pair. + // So, take the net/http.Server value and pad it up a bit, assuming 10 headers. + const perFieldOverhead = 32 // per http2 spec + const typicalHeaders = 10 // conservative + return uint32(n + typicalHeaders*perFieldOverhead) +} + +func (sc *serverConn) curOpenStreams() uint32 { + sc.serveG.check() + return sc.curClientStreams + sc.curPushedStreams +} + +// stream represents a stream. This is the minimal metadata needed by +// the serve goroutine. Most of the actual stream state is owned by +// the http.Handler's goroutine in the responseWriter. Because the +// responseWriter's responseWriterState is recycled at the end of a +// handler, this struct intentionally has no pointer to the +// *responseWriter{,State} itself, as the Handler ending nils out the +// responseWriter's state field. +type stream struct { + // immutable: + sc *serverConn + id uint32 + body *pipe // non-nil if expecting DATA frames + cw closeWaiter // closed wait stream transitions to closed state + ctx context.Context + cancelCtx func() + + // owned by serverConn's serve loop: + bodyBytes int64 // body bytes seen so far + declBodyBytes int64 // or -1 if undeclared + flow flow // limits writing from Handler to client + inflow flow // what the client is allowed to POST/etc to us + state streamState + resetQueued bool // RST_STREAM queued for write; set by sc.resetStream + gotTrailerHeader bool // HEADER frame for trailers was seen + wroteHeaders bool // whether we wrote headers (not status 100) + writeDeadline *time.Timer // nil if unused + + trailer http.Header // accumulated trailers + reqTrailer http.Header // handler's Request.Trailer +} + +func (sc *serverConn) Framer() *Framer { return sc.framer } +func (sc *serverConn) CloseConn() error { return sc.conn.Close() } +func (sc *serverConn) Flush() error { return sc.bw.Flush() } +func (sc *serverConn) HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) { + return sc.hpackEncoder, &sc.headerWriteBuf +} + +func (sc *serverConn) state(streamID uint32) (streamState, *stream) { + sc.serveG.check() + // http://tools.ietf.org/html/rfc7540#section-5.1 + if st, ok := sc.streams[streamID]; ok { + return st.state, st + } + // "The first use of a new stream identifier implicitly closes all + // streams in the "idle" state that might have been initiated by + // that peer with a lower-valued stream identifier. For example, if + // a client sends a HEADERS frame on stream 7 without ever sending a + // frame on stream 5, then stream 5 transitions to the "closed" + // state when the first frame for stream 7 is sent or received." + if streamID%2 == 1 { + if streamID <= sc.maxClientStreamID { + return stateClosed, nil + } + } else { + if streamID <= sc.maxPushPromiseID { + return stateClosed, nil + } + } + return stateIdle, nil +} + +// setConnState calls the net/http ConnState hook for this connection, if configured. +// Note that the net/http package does StateNew and StateClosed for us. +// There is currently no plan for StateHijacked or hijacking HTTP/2 connections. +func (sc *serverConn) setConnState(state http.ConnState) { + if sc.hs.ConnState != nil { + sc.hs.ConnState(sc.conn, state) + } +} + +func (sc *serverConn) vlogf(format string, args ...interface{}) { + if VerboseLogs { + sc.logf(format, args...) + } +} + +func (sc *serverConn) logf(format string, args ...interface{}) { + if lg := sc.hs.ErrorLog; lg != nil { + lg.Printf(format, args...) + } else { + log.Printf(format, args...) + } +} + +// errno returns v's underlying uintptr, else 0. +// +// TODO: remove this helper function once http2 can use build +// tags. See comment in isClosedConnError. +func errno(v error) uintptr { + if rv := reflect.ValueOf(v); rv.Kind() == reflect.Uintptr { + return uintptr(rv.Uint()) + } + return 0 +} + +// isClosedConnError reports whether err is an error from use of a closed +// network connection. +func isClosedConnError(err error) bool { + if err == nil { + return false + } + + // TODO: remove this string search and be more like the Windows + // case below. That might involve modifying the standard library + // to return better error types. + str := err.Error() + if strings.Contains(str, "use of closed network connection") { + return true + } + + // TODO(bradfitz): x/tools/cmd/bundle doesn't really support + // build tags, so I can't make an http2_windows.go file with + // Windows-specific stuff. Fix that and move this, once we + // have a way to bundle this into std's net/http somehow. + if runtime.GOOS == "windows" { + if oe, ok := err.(*net.OpError); ok && oe.Op == "read" { + if se, ok := oe.Err.(*os.SyscallError); ok && se.Syscall == "wsarecv" { + const WSAECONNABORTED = 10053 + const WSAECONNRESET = 10054 + if n := errno(se.Err); n == WSAECONNRESET || n == WSAECONNABORTED { + return true + } + } + } + } + return false +} + +func (sc *serverConn) condlogf(err error, format string, args ...interface{}) { + if err == nil { + return + } + if err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) || err == errPrefaceTimeout { + // Boring, expected errors. + sc.vlogf(format, args...) + } else { + sc.logf(format, args...) + } +} + +func (sc *serverConn) canonicalHeader(v string) string { + sc.serveG.check() + buildCommonHeaderMapsOnce() + cv, ok := commonCanonHeader[v] + if ok { + return cv + } + cv, ok = sc.canonHeader[v] + if ok { + return cv + } + if sc.canonHeader == nil { + sc.canonHeader = make(map[string]string) + } + cv = http.CanonicalHeaderKey(v) + sc.canonHeader[v] = cv + return cv +} + +type readFrameResult struct { + f Frame // valid until readMore is called + err error + + // readMore should be called once the consumer no longer needs or + // retains f. After readMore, f is invalid and more frames can be + // read. + readMore func() +} + +// readFrames is the loop that reads incoming frames. +// It takes care to only read one frame at a time, blocking until the +// consumer is done with the frame. +// It's run on its own goroutine. +func (sc *serverConn) readFrames() { + gate := make(gate) + gateDone := gate.Done + for { + f, err := sc.framer.ReadFrame() + select { + case sc.readFrameCh <- readFrameResult{f, err, gateDone}: + case <-sc.doneServing: + return + } + select { + case <-gate: + case <-sc.doneServing: + return + } + if terminalReadFrameError(err) { + return + } + } +} + +// frameWriteResult is the message passed from writeFrameAsync to the serve goroutine. +type frameWriteResult struct { + _ incomparable + wr FrameWriteRequest // what was written (or attempted) + err error // result of the writeFrame call +} + +// writeFrameAsync runs in its own goroutine and writes a single frame +// and then reports when it's done. +// At most one goroutine can be running writeFrameAsync at a time per +// serverConn. +func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest) { + err := wr.write.writeFrame(sc) + sc.wroteFrameCh <- frameWriteResult{wr: wr, err: err} +} + +func (sc *serverConn) closeAllStreamsOnConnClose() { + sc.serveG.check() + for _, st := range sc.streams { + sc.closeStream(st, errClientDisconnected) + } +} + +func (sc *serverConn) stopShutdownTimer() { + sc.serveG.check() + if t := sc.shutdownTimer; t != nil { + t.Stop() + } +} + +func (sc *serverConn) notePanic() { + // Note: this is for serverConn.serve panicking, not http.Handler code. + if testHookOnPanicMu != nil { + testHookOnPanicMu.Lock() + defer testHookOnPanicMu.Unlock() + } + if testHookOnPanic != nil { + if e := recover(); e != nil { + if testHookOnPanic(sc, e) { + panic(e) + } + } + } +} + +func (sc *serverConn) serve() { + sc.serveG.check() + defer sc.notePanic() + defer sc.conn.Close() + defer sc.closeAllStreamsOnConnClose() + defer sc.stopShutdownTimer() + defer close(sc.doneServing) // unblocks handlers trying to send + + if VerboseLogs { + sc.vlogf("http2: server connection from %v on %p", sc.conn.RemoteAddr(), sc.hs) + } + + sc.writeFrame(FrameWriteRequest{ + write: writeSettings{ + {SettingMaxFrameSize, sc.srv.maxReadFrameSize()}, + {SettingMaxConcurrentStreams, sc.advMaxStreams}, + {SettingMaxHeaderListSize, sc.maxHeaderListSize()}, + {SettingInitialWindowSize, uint32(sc.srv.initialStreamRecvWindowSize())}, + }, + }) + sc.unackedSettings++ + + // Each connection starts with intialWindowSize inflow tokens. + // If a higher value is configured, we add more tokens. + if diff := sc.srv.initialConnRecvWindowSize() - initialWindowSize; diff > 0 { + sc.sendWindowUpdate(nil, int(diff)) + } + + if err := sc.readPreface(); err != nil { + sc.condlogf(err, "http2: server: error reading preface from client %v: %v", sc.conn.RemoteAddr(), err) + return + } + // Now that we've got the preface, get us out of the + // "StateNew" state. We can't go directly to idle, though. + // Active means we read some data and anticipate a request. We'll + // do another Active when we get a HEADERS frame. + sc.setConnState(http.StateActive) + sc.setConnState(http.StateIdle) + + if sc.srv.IdleTimeout != 0 { + sc.idleTimer = time.AfterFunc(sc.srv.IdleTimeout, sc.onIdleTimer) + defer sc.idleTimer.Stop() + } + + go sc.readFrames() // closed by defer sc.conn.Close above + + settingsTimer := time.AfterFunc(firstSettingsTimeout, sc.onSettingsTimer) + defer settingsTimer.Stop() + + loopNum := 0 + for { + loopNum++ + select { + case wr := <-sc.wantWriteFrameCh: + if se, ok := wr.write.(StreamError); ok { + sc.resetStream(se) + break + } + sc.writeFrame(wr) + case res := <-sc.wroteFrameCh: + sc.wroteFrame(res) + case res := <-sc.readFrameCh: + if !sc.processFrameFromReader(res) { + return + } + res.readMore() + if settingsTimer != nil { + settingsTimer.Stop() + settingsTimer = nil + } + case m := <-sc.bodyReadCh: + sc.noteBodyRead(m.st, m.n) + case msg := <-sc.serveMsgCh: + switch v := msg.(type) { + case func(int): + v(loopNum) // for testing + case *serverMessage: + switch v { + case settingsTimerMsg: + sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr()) + return + case idleTimerMsg: + sc.vlogf("connection is idle") + sc.goAway(ErrCodeNo) + case shutdownTimerMsg: + sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr()) + return + case gracefulShutdownMsg: + sc.startGracefulShutdownInternal() + default: + panic("unknown timer") + } + case *startPushRequest: + sc.startPush(v) + default: + panic(fmt.Sprintf("unexpected type %T", v)) + } + } + + // If the peer is causing us to generate a lot of control frames, + // but not reading them from us, assume they are trying to make us + // run out of memory. + if sc.queuedControlFrames > sc.srv.maxQueuedControlFrames() { + sc.vlogf("http2: too many control frames in send queue, closing connection") + return + } + + // Start the shutdown timer after sending a GOAWAY. When sending GOAWAY + // with no error code (graceful shutdown), don't start the timer until + // all open streams have been completed. + sentGoAway := sc.inGoAway && !sc.needToSendGoAway && !sc.writingFrame + gracefulShutdownComplete := sc.goAwayCode == ErrCodeNo && sc.curOpenStreams() == 0 + if sentGoAway && sc.shutdownTimer == nil && (sc.goAwayCode != ErrCodeNo || gracefulShutdownComplete) { + sc.shutDownIn(goAwayTimeout) + } + } +} + +func (sc *serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) { + select { + case <-sc.doneServing: + case <-sharedCh: + close(privateCh) + } +} + +type serverMessage int + +// Message values sent to serveMsgCh. +var ( + settingsTimerMsg = new(serverMessage) + idleTimerMsg = new(serverMessage) + shutdownTimerMsg = new(serverMessage) + gracefulShutdownMsg = new(serverMessage) +) + +func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) } +func (sc *serverConn) onIdleTimer() { sc.sendServeMsg(idleTimerMsg) } +func (sc *serverConn) onShutdownTimer() { sc.sendServeMsg(shutdownTimerMsg) } + +func (sc *serverConn) sendServeMsg(msg interface{}) { + sc.serveG.checkNotOn() // NOT + select { + case sc.serveMsgCh <- msg: + case <-sc.doneServing: + } +} + +var errPrefaceTimeout = errors.New("timeout waiting for client preface") + +// readPreface reads the ClientPreface greeting from the peer or +// returns errPrefaceTimeout on timeout, or an error if the greeting +// is invalid. +func (sc *serverConn) readPreface() error { + errc := make(chan error, 1) + go func() { + // Read the client preface + buf := make([]byte, len(ClientPreface)) + if _, err := io.ReadFull(sc.conn, buf); err != nil { + errc <- err + } else if !bytes.Equal(buf, clientPreface) { + errc <- fmt.Errorf("bogus greeting %q", buf) + } else { + errc <- nil + } + }() + timer := time.NewTimer(prefaceTimeout) // TODO: configurable on *Server? + defer timer.Stop() + select { + case <-timer.C: + return errPrefaceTimeout + case err := <-errc: + if err == nil { + if VerboseLogs { + sc.vlogf("http2: server: client %v said hello", sc.conn.RemoteAddr()) + } + } + return err + } +} + +var errChanPool = sync.Pool{ + New: func() interface{} { return make(chan error, 1) }, +} + +var writeDataPool = sync.Pool{ + New: func() interface{} { return new(writeData) }, +} + +// writeDataFromHandler writes DATA response frames from a handler on +// the given stream. +func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error { + ch := errChanPool.Get().(chan error) + writeArg := writeDataPool.Get().(*writeData) + *writeArg = writeData{stream.id, data, endStream} + err := sc.writeFrameFromHandler(FrameWriteRequest{ + write: writeArg, + stream: stream, + done: ch, + }) + if err != nil { + return err + } + var frameWriteDone bool // the frame write is done (successfully or not) + select { + case err = <-ch: + frameWriteDone = true + case <-sc.doneServing: + return errClientDisconnected + case <-stream.cw: + // If both ch and stream.cw were ready (as might + // happen on the final Write after an http.Handler + // ends), prefer the write result. Otherwise this + // might just be us successfully closing the stream. + // The writeFrameAsync and serve goroutines guarantee + // that the ch send will happen before the stream.cw + // close. + select { + case err = <-ch: + frameWriteDone = true + default: + return errStreamClosed + } + } + errChanPool.Put(ch) + if frameWriteDone { + writeDataPool.Put(writeArg) + } + return err +} + +// writeFrameFromHandler sends wr to sc.wantWriteFrameCh, but aborts +// if the connection has gone away. +// +// This must not be run from the serve goroutine itself, else it might +// deadlock writing to sc.wantWriteFrameCh (which is only mildly +// buffered and is read by serve itself). If you're on the serve +// goroutine, call writeFrame instead. +func (sc *serverConn) writeFrameFromHandler(wr FrameWriteRequest) error { + sc.serveG.checkNotOn() // NOT + select { + case sc.wantWriteFrameCh <- wr: + return nil + case <-sc.doneServing: + // Serve loop is gone. + // Client has closed their connection to the server. + return errClientDisconnected + } +} + +// writeFrame schedules a frame to write and sends it if there's nothing +// already being written. +// +// There is no pushback here (the serve goroutine never blocks). It's +// the http.Handlers that block, waiting for their previous frames to +// make it onto the wire +// +// If you're not on the serve goroutine, use writeFrameFromHandler instead. +func (sc *serverConn) writeFrame(wr FrameWriteRequest) { + sc.serveG.check() + + // If true, wr will not be written and wr.done will not be signaled. + var ignoreWrite bool + + // We are not allowed to write frames on closed streams. RFC 7540 Section + // 5.1.1 says: "An endpoint MUST NOT send frames other than PRIORITY on + // a closed stream." Our server never sends PRIORITY, so that exception + // does not apply. + // + // The serverConn might close an open stream while the stream's handler + // is still running. For example, the server might close a stream when it + // receives bad data from the client. If this happens, the handler might + // attempt to write a frame after the stream has been closed (since the + // handler hasn't yet been notified of the close). In this case, we simply + // ignore the frame. The handler will notice that the stream is closed when + // it waits for the frame to be written. + // + // As an exception to this rule, we allow sending RST_STREAM after close. + // This allows us to immediately reject new streams without tracking any + // state for those streams (except for the queued RST_STREAM frame). This + // may result in duplicate RST_STREAMs in some cases, but the client should + // ignore those. + if wr.StreamID() != 0 { + _, isReset := wr.write.(StreamError) + if state, _ := sc.state(wr.StreamID()); state == stateClosed && !isReset { + ignoreWrite = true + } + } + + // Don't send a 100-continue response if we've already sent headers. + // See golang.org/issue/14030. + switch wr.write.(type) { + case *writeResHeaders: + wr.stream.wroteHeaders = true + case write100ContinueHeadersFrame: + if wr.stream.wroteHeaders { + // We do not need to notify wr.done because this frame is + // never written with wr.done != nil. + if wr.done != nil { + panic("wr.done != nil for write100ContinueHeadersFrame") + } + ignoreWrite = true + } + } + + if !ignoreWrite { + if wr.isControl() { + sc.queuedControlFrames++ + // For extra safety, detect wraparounds, which should not happen, + // and pull the plug. + if sc.queuedControlFrames < 0 { + sc.conn.Close() + } + } + sc.writeSched.Push(wr) + } + sc.scheduleFrameWrite() +} + +// startFrameWrite starts a goroutine to write wr (in a separate +// goroutine since that might block on the network), and updates the +// serve goroutine's state about the world, updated from info in wr. +func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) { + sc.serveG.check() + if sc.writingFrame { + panic("internal error: can only be writing one frame at a time") + } + + st := wr.stream + if st != nil { + switch st.state { + case stateHalfClosedLocal: + switch wr.write.(type) { + case StreamError, handlerPanicRST, writeWindowUpdate: + // RFC 7540 Section 5.1 allows sending RST_STREAM, PRIORITY, and WINDOW_UPDATE + // in this state. (We never send PRIORITY from the server, so that is not checked.) + default: + panic(fmt.Sprintf("internal error: attempt to send frame on a half-closed-local stream: %v", wr)) + } + case stateClosed: + panic(fmt.Sprintf("internal error: attempt to send frame on a closed stream: %v", wr)) + } + } + if wpp, ok := wr.write.(*writePushPromise); ok { + var err error + wpp.promisedID, err = wpp.allocatePromisedID() + if err != nil { + sc.writingFrameAsync = false + wr.replyToWriter(err) + return + } + } + + sc.writingFrame = true + sc.needsFrameFlush = true + if wr.write.staysWithinBuffer(sc.bw.Available()) { + sc.writingFrameAsync = false + err := wr.write.writeFrame(sc) + sc.wroteFrame(frameWriteResult{wr: wr, err: err}) + } else { + sc.writingFrameAsync = true + go sc.writeFrameAsync(wr) + } +} + +// errHandlerPanicked is the error given to any callers blocked in a read from +// Request.Body when the main goroutine panics. Since most handlers read in the +// main ServeHTTP goroutine, this will show up rarely. +var errHandlerPanicked = errors.New("http2: handler panicked") + +// wroteFrame is called on the serve goroutine with the result of +// whatever happened on writeFrameAsync. +func (sc *serverConn) wroteFrame(res frameWriteResult) { + sc.serveG.check() + if !sc.writingFrame { + panic("internal error: expected to be already writing a frame") + } + sc.writingFrame = false + sc.writingFrameAsync = false + + wr := res.wr + + if writeEndsStream(wr.write) { + st := wr.stream + if st == nil { + panic("internal error: expecting non-nil stream") + } + switch st.state { + case stateOpen: + // Here we would go to stateHalfClosedLocal in + // theory, but since our handler is done and + // the net/http package provides no mechanism + // for closing a ResponseWriter while still + // reading data (see possible TODO at top of + // this file), we go into closed state here + // anyway, after telling the peer we're + // hanging up on them. We'll transition to + // stateClosed after the RST_STREAM frame is + // written. + st.state = stateHalfClosedLocal + // Section 8.1: a server MAY request that the client abort + // transmission of a request without error by sending a + // RST_STREAM with an error code of NO_ERROR after sending + // a complete response. + sc.resetStream(streamError(st.id, ErrCodeNo)) + case stateHalfClosedRemote: + sc.closeStream(st, errHandlerComplete) + } + } else { + switch v := wr.write.(type) { + case StreamError: + // st may be unknown if the RST_STREAM was generated to reject bad input. + if st, ok := sc.streams[v.StreamID]; ok { + sc.closeStream(st, v) + } + case handlerPanicRST: + sc.closeStream(wr.stream, errHandlerPanicked) + } + } + + // Reply (if requested) to unblock the ServeHTTP goroutine. + wr.replyToWriter(res.err) + + sc.scheduleFrameWrite() +} + +// scheduleFrameWrite tickles the frame writing scheduler. +// +// If a frame is already being written, nothing happens. This will be called again +// when the frame is done being written. +// +// If a frame isn't being written and we need to send one, the best frame +// to send is selected by writeSched. +// +// If a frame isn't being written and there's nothing else to send, we +// flush the write buffer. +func (sc *serverConn) scheduleFrameWrite() { + sc.serveG.check() + if sc.writingFrame || sc.inFrameScheduleLoop { + return + } + sc.inFrameScheduleLoop = true + for !sc.writingFrameAsync { + if sc.needToSendGoAway { + sc.needToSendGoAway = false + sc.startFrameWrite(FrameWriteRequest{ + write: &writeGoAway{ + maxStreamID: sc.maxClientStreamID, + code: sc.goAwayCode, + }, + }) + continue + } + if sc.needToSendSettingsAck { + sc.needToSendSettingsAck = false + sc.startFrameWrite(FrameWriteRequest{write: writeSettingsAck{}}) + continue + } + if !sc.inGoAway || sc.goAwayCode == ErrCodeNo { + if wr, ok := sc.writeSched.Pop(); ok { + if wr.isControl() { + sc.queuedControlFrames-- + } + sc.startFrameWrite(wr) + continue + } + } + if sc.needsFrameFlush { + sc.startFrameWrite(FrameWriteRequest{write: flushFrameWriter{}}) + sc.needsFrameFlush = false // after startFrameWrite, since it sets this true + continue + } + break + } + sc.inFrameScheduleLoop = false +} + +// startGracefulShutdown gracefully shuts down a connection. This +// sends GOAWAY with ErrCodeNo to tell the client we're gracefully +// shutting down. The connection isn't closed until all current +// streams are done. +// +// startGracefulShutdown returns immediately; it does not wait until +// the connection has shut down. +func (sc *serverConn) startGracefulShutdown() { + sc.serveG.checkNotOn() // NOT + sc.shutdownOnce.Do(func() { sc.sendServeMsg(gracefulShutdownMsg) }) +} + +// After sending GOAWAY, the connection will close after goAwayTimeout. +// If we close the connection immediately after sending GOAWAY, there may +// be unsent data in our kernel receive buffer, which will cause the kernel +// to send a TCP RST on close() instead of a FIN. This RST will abort the +// connection immediately, whether or not the client had received the GOAWAY. +// +// Ideally we should delay for at least 1 RTT + epsilon so the client has +// a chance to read the GOAWAY and stop sending messages. Measuring RTT +// is hard, so we approximate with 1 second. See golang.org/issue/18701. +// +// This is a var so it can be shorter in tests, where all requests uses the +// loopback interface making the expected RTT very small. +// +// TODO: configurable? +var goAwayTimeout = 1 * time.Second + +func (sc *serverConn) startGracefulShutdownInternal() { + sc.goAway(ErrCodeNo) +} + +func (sc *serverConn) goAway(code ErrCode) { + sc.serveG.check() + if sc.inGoAway { + return + } + sc.inGoAway = true + sc.needToSendGoAway = true + sc.goAwayCode = code + sc.scheduleFrameWrite() +} + +func (sc *serverConn) shutDownIn(d time.Duration) { + sc.serveG.check() + sc.shutdownTimer = time.AfterFunc(d, sc.onShutdownTimer) +} + +func (sc *serverConn) resetStream(se StreamError) { + sc.serveG.check() + sc.writeFrame(FrameWriteRequest{write: se}) + if st, ok := sc.streams[se.StreamID]; ok { + st.resetQueued = true + } +} + +// processFrameFromReader processes the serve loop's read from readFrameCh from the +// frame-reading goroutine. +// processFrameFromReader returns whether the connection should be kept open. +func (sc *serverConn) processFrameFromReader(res readFrameResult) bool { + sc.serveG.check() + err := res.err + if err != nil { + if err == ErrFrameTooLarge { + sc.goAway(ErrCodeFrameSize) + return true // goAway will close the loop + } + clientGone := err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) + if clientGone { + // TODO: could we also get into this state if + // the peer does a half close + // (e.g. CloseWrite) because they're done + // sending frames but they're still wanting + // our open replies? Investigate. + // TODO: add CloseWrite to crypto/tls.Conn first + // so we have a way to test this? I suppose + // just for testing we could have a non-TLS mode. + return false + } + } else { + f := res.f + if VerboseLogs { + sc.vlogf("http2: server read frame %v", summarizeFrame(f)) + } + err = sc.processFrame(f) + if err == nil { + return true + } + } + + switch ev := err.(type) { + case StreamError: + sc.resetStream(ev) + return true + case goAwayFlowError: + sc.goAway(ErrCodeFlowControl) + return true + case ConnectionError: + sc.logf("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev) + sc.goAway(ErrCode(ev)) + return true // goAway will handle shutdown + default: + if res.err != nil { + sc.vlogf("http2: server closing client connection; error reading frame from client %s: %v", sc.conn.RemoteAddr(), err) + } else { + sc.logf("http2: server closing client connection: %v", err) + } + return false + } +} + +func (sc *serverConn) processFrame(f Frame) error { + sc.serveG.check() + + // First frame received must be SETTINGS. + if !sc.sawFirstSettings { + if _, ok := f.(*SettingsFrame); !ok { + return ConnectionError(ErrCodeProtocol) + } + sc.sawFirstSettings = true + } + + switch f := f.(type) { + case *SettingsFrame: + return sc.processSettings(f) + case *MetaHeadersFrame: + return sc.processHeaders(f) + case *WindowUpdateFrame: + return sc.processWindowUpdate(f) + case *PingFrame: + return sc.processPing(f) + case *DataFrame: + return sc.processData(f) + case *RSTStreamFrame: + return sc.processResetStream(f) + case *PriorityFrame: + return sc.processPriority(f) + case *GoAwayFrame: + return sc.processGoAway(f) + case *PushPromiseFrame: + // A client cannot push. Thus, servers MUST treat the receipt of a PUSH_PROMISE + // frame as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. + return ConnectionError(ErrCodeProtocol) + default: + sc.vlogf("http2: server ignoring frame: %v", f.Header()) + return nil + } +} + +func (sc *serverConn) processPing(f *PingFrame) error { + sc.serveG.check() + if f.IsAck() { + // 6.7 PING: " An endpoint MUST NOT respond to PING frames + // containing this flag." + return nil + } + if f.StreamID != 0 { + // "PING frames are not associated with any individual + // stream. If a PING frame is received with a stream + // identifier field value other than 0x0, the recipient MUST + // respond with a connection error (Section 5.4.1) of type + // PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + if sc.inGoAway && sc.goAwayCode != ErrCodeNo { + return nil + } + sc.writeFrame(FrameWriteRequest{write: writePingAck{f}}) + return nil +} + +func (sc *serverConn) processWindowUpdate(f *WindowUpdateFrame) error { + sc.serveG.check() + switch { + case f.StreamID != 0: // stream-level flow control + state, st := sc.state(f.StreamID) + if state == stateIdle { + // Section 5.1: "Receiving any frame other than HEADERS + // or PRIORITY on a stream in this state MUST be + // treated as a connection error (Section 5.4.1) of + // type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + if st == nil { + // "WINDOW_UPDATE can be sent by a peer that has sent a + // frame bearing the END_STREAM flag. This means that a + // receiver could receive a WINDOW_UPDATE frame on a "half + // closed (remote)" or "closed" stream. A receiver MUST + // NOT treat this as an error, see Section 5.1." + return nil + } + if !st.flow.add(int32(f.Increment)) { + return streamError(f.StreamID, ErrCodeFlowControl) + } + default: // connection-level flow control + if !sc.flow.add(int32(f.Increment)) { + return goAwayFlowError{} + } + } + sc.scheduleFrameWrite() + return nil +} + +func (sc *serverConn) processResetStream(f *RSTStreamFrame) error { + sc.serveG.check() + + state, st := sc.state(f.StreamID) + if state == stateIdle { + // 6.4 "RST_STREAM frames MUST NOT be sent for a + // stream in the "idle" state. If a RST_STREAM frame + // identifying an idle stream is received, the + // recipient MUST treat this as a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + return ConnectionError(ErrCodeProtocol) + } + if st != nil { + st.cancelCtx() + sc.closeStream(st, streamError(f.StreamID, f.ErrCode)) + } + return nil +} + +func (sc *serverConn) closeStream(st *stream, err error) { + sc.serveG.check() + if st.state == stateIdle || st.state == stateClosed { + panic(fmt.Sprintf("invariant; can't close stream in state %v", st.state)) + } + st.state = stateClosed + if st.writeDeadline != nil { + st.writeDeadline.Stop() + } + if st.isPushed() { + sc.curPushedStreams-- + } else { + sc.curClientStreams-- + } + delete(sc.streams, st.id) + if len(sc.streams) == 0 { + sc.setConnState(http.StateIdle) + if sc.srv.IdleTimeout != 0 { + sc.idleTimer.Reset(sc.srv.IdleTimeout) + } + if h1ServerKeepAlivesDisabled(sc.hs) { + sc.startGracefulShutdownInternal() + } + } + if p := st.body; p != nil { + // Return any buffered unread bytes worth of conn-level flow control. + // See golang.org/issue/16481 + sc.sendWindowUpdate(nil, p.Len()) + + p.CloseWithError(err) + } + st.cw.Close() // signals Handler's CloseNotifier, unblocks writes, etc + sc.writeSched.CloseStream(st.id) +} + +func (sc *serverConn) processSettings(f *SettingsFrame) error { + sc.serveG.check() + if f.IsAck() { + sc.unackedSettings-- + if sc.unackedSettings < 0 { + // Why is the peer ACKing settings we never sent? + // The spec doesn't mention this case, but + // hang up on them anyway. + return ConnectionError(ErrCodeProtocol) + } + return nil + } + if f.NumSettings() > 100 || f.HasDuplicates() { + // This isn't actually in the spec, but hang up on + // suspiciously large settings frames or those with + // duplicate entries. + return ConnectionError(ErrCodeProtocol) + } + if err := f.ForeachSetting(sc.processSetting); err != nil { + return err + } + // TODO: judging by RFC 7540, Section 6.5.3 each SETTINGS frame should be + // acknowledged individually, even if multiple are received before the ACK. + sc.needToSendSettingsAck = true + sc.scheduleFrameWrite() + return nil +} + +func (sc *serverConn) processSetting(s Setting) error { + sc.serveG.check() + if err := s.Valid(); err != nil { + return err + } + if VerboseLogs { + sc.vlogf("http2: server processing setting %v", s) + } + switch s.ID { + case SettingHeaderTableSize: + sc.headerTableSize = s.Val + sc.hpackEncoder.SetMaxDynamicTableSize(s.Val) + case SettingEnablePush: + sc.pushEnabled = s.Val != 0 + case SettingMaxConcurrentStreams: + sc.clientMaxStreams = s.Val + case SettingInitialWindowSize: + return sc.processSettingInitialWindowSize(s.Val) + case SettingMaxFrameSize: + sc.maxFrameSize = int32(s.Val) // the maximum valid s.Val is < 2^31 + case SettingMaxHeaderListSize: + sc.peerMaxHeaderListSize = s.Val + default: + // Unknown setting: "An endpoint that receives a SETTINGS + // frame with any unknown or unsupported identifier MUST + // ignore that setting." + if VerboseLogs { + sc.vlogf("http2: server ignoring unknown setting %v", s) + } + } + return nil +} + +func (sc *serverConn) processSettingInitialWindowSize(val uint32) error { + sc.serveG.check() + // Note: val already validated to be within range by + // processSetting's Valid call. + + // "A SETTINGS frame can alter the initial flow control window + // size for all current streams. When the value of + // SETTINGS_INITIAL_WINDOW_SIZE changes, a receiver MUST + // adjust the size of all stream flow control windows that it + // maintains by the difference between the new value and the + // old value." + old := sc.initialStreamSendWindowSize + sc.initialStreamSendWindowSize = int32(val) + growth := int32(val) - old // may be negative + for _, st := range sc.streams { + if !st.flow.add(growth) { + // 6.9.2 Initial Flow Control Window Size + // "An endpoint MUST treat a change to + // SETTINGS_INITIAL_WINDOW_SIZE that causes any flow + // control window to exceed the maximum size as a + // connection error (Section 5.4.1) of type + // FLOW_CONTROL_ERROR." + return ConnectionError(ErrCodeFlowControl) + } + } + return nil +} + +func (sc *serverConn) processData(f *DataFrame) error { + sc.serveG.check() + if sc.inGoAway && sc.goAwayCode != ErrCodeNo { + return nil + } + data := f.Data() + + // "If a DATA frame is received whose stream is not in "open" + // or "half closed (local)" state, the recipient MUST respond + // with a stream error (Section 5.4.2) of type STREAM_CLOSED." + id := f.Header().StreamID + state, st := sc.state(id) + if id == 0 || state == stateIdle { + // Section 5.1: "Receiving any frame other than HEADERS + // or PRIORITY on a stream in this state MUST be + // treated as a connection error (Section 5.4.1) of + // type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + if st == nil || state != stateOpen || st.gotTrailerHeader || st.resetQueued { + // This includes sending a RST_STREAM if the stream is + // in stateHalfClosedLocal (which currently means that + // the http.Handler returned, so it's done reading & + // done writing). Try to stop the client from sending + // more DATA. + + // But still enforce their connection-level flow control, + // and return any flow control bytes since we're not going + // to consume them. + if sc.inflow.available() < int32(f.Length) { + return streamError(id, ErrCodeFlowControl) + } + // Deduct the flow control from inflow, since we're + // going to immediately add it back in + // sendWindowUpdate, which also schedules sending the + // frames. + sc.inflow.take(int32(f.Length)) + sc.sendWindowUpdate(nil, int(f.Length)) // conn-level + + if st != nil && st.resetQueued { + // Already have a stream error in flight. Don't send another. + return nil + } + return streamError(id, ErrCodeStreamClosed) + } + if st.body == nil { + panic("internal error: should have a body in this state") + } + + // Sender sending more than they'd declared? + if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes { + st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes)) + // RFC 7540, sec 8.1.2.6: A request or response is also malformed if the + // value of a content-length header field does not equal the sum of the + // DATA frame payload lengths that form the body. + return streamError(id, ErrCodeProtocol) + } + if f.Length > 0 { + // Check whether the client has flow control quota. + if st.inflow.available() < int32(f.Length) { + return streamError(id, ErrCodeFlowControl) + } + st.inflow.take(int32(f.Length)) + + if len(data) > 0 { + wrote, err := st.body.Write(data) + if err != nil { + return streamError(id, ErrCodeStreamClosed) + } + if wrote != len(data) { + panic("internal error: bad Writer") + } + st.bodyBytes += int64(len(data)) + } + + // Return any padded flow control now, since we won't + // refund it later on body reads. + if pad := int32(f.Length) - int32(len(data)); pad > 0 { + sc.sendWindowUpdate32(nil, pad) + sc.sendWindowUpdate32(st, pad) + } + } + if f.StreamEnded() { + st.endStream() + } + return nil +} + +func (sc *serverConn) processGoAway(f *GoAwayFrame) error { + sc.serveG.check() + if f.ErrCode != ErrCodeNo { + sc.logf("http2: received GOAWAY %+v, starting graceful shutdown", f) + } else { + sc.vlogf("http2: received GOAWAY %+v, starting graceful shutdown", f) + } + sc.startGracefulShutdownInternal() + // http://tools.ietf.org/html/rfc7540#section-6.8 + // We should not create any new streams, which means we should disable push. + sc.pushEnabled = false + return nil +} + +// isPushed reports whether the stream is server-initiated. +func (st *stream) isPushed() bool { + return st.id%2 == 0 +} + +// endStream closes a Request.Body's pipe. It is called when a DATA +// frame says a request body is over (or after trailers). +func (st *stream) endStream() { + sc := st.sc + sc.serveG.check() + + if st.declBodyBytes != -1 && st.declBodyBytes != st.bodyBytes { + st.body.CloseWithError(fmt.Errorf("request declared a Content-Length of %d but only wrote %d bytes", + st.declBodyBytes, st.bodyBytes)) + } else { + st.body.closeWithErrorAndCode(io.EOF, st.copyTrailersToHandlerRequest) + st.body.CloseWithError(io.EOF) + } + st.state = stateHalfClosedRemote +} + +// copyTrailersToHandlerRequest is run in the Handler's goroutine in +// its Request.Body.Read just before it gets io.EOF. +func (st *stream) copyTrailersToHandlerRequest() { + for k, vv := range st.trailer { + if _, ok := st.reqTrailer[k]; ok { + // Only copy it over it was pre-declared. + st.reqTrailer[k] = vv + } + } +} + +// onWriteTimeout is run on its own goroutine (from time.AfterFunc) +// when the stream's WriteTimeout has fired. +func (st *stream) onWriteTimeout() { + st.sc.writeFrameFromHandler(FrameWriteRequest{write: streamError(st.id, ErrCodeInternal)}) +} + +func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { + sc.serveG.check() + id := f.StreamID + if sc.inGoAway { + // Ignore. + return nil + } + // http://tools.ietf.org/html/rfc7540#section-5.1.1 + // Streams initiated by a client MUST use odd-numbered stream + // identifiers. [...] An endpoint that receives an unexpected + // stream identifier MUST respond with a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + if id%2 != 1 { + return ConnectionError(ErrCodeProtocol) + } + // A HEADERS frame can be used to create a new stream or + // send a trailer for an open one. If we already have a stream + // open, let it process its own HEADERS frame (trailers at this + // point, if it's valid). + if st := sc.streams[f.StreamID]; st != nil { + if st.resetQueued { + // We're sending RST_STREAM to close the stream, so don't bother + // processing this frame. + return nil + } + // RFC 7540, sec 5.1: If an endpoint receives additional frames, other than + // WINDOW_UPDATE, PRIORITY, or RST_STREAM, for a stream that is in + // this state, it MUST respond with a stream error (Section 5.4.2) of + // type STREAM_CLOSED. + if st.state == stateHalfClosedRemote { + return streamError(id, ErrCodeStreamClosed) + } + return st.processTrailerHeaders(f) + } + + // [...] The identifier of a newly established stream MUST be + // numerically greater than all streams that the initiating + // endpoint has opened or reserved. [...] An endpoint that + // receives an unexpected stream identifier MUST respond with + // a connection error (Section 5.4.1) of type PROTOCOL_ERROR. + if id <= sc.maxClientStreamID { + return ConnectionError(ErrCodeProtocol) + } + sc.maxClientStreamID = id + + if sc.idleTimer != nil { + sc.idleTimer.Stop() + } + + // http://tools.ietf.org/html/rfc7540#section-5.1.2 + // [...] Endpoints MUST NOT exceed the limit set by their peer. An + // endpoint that receives a HEADERS frame that causes their + // advertised concurrent stream limit to be exceeded MUST treat + // this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR + // or REFUSED_STREAM. + if sc.curClientStreams+1 > sc.advMaxStreams { + if sc.unackedSettings == 0 { + // They should know better. + return streamError(id, ErrCodeProtocol) + } + // Assume it's a network race, where they just haven't + // received our last SETTINGS update. But actually + // this can't happen yet, because we don't yet provide + // a way for users to adjust server parameters at + // runtime. + return streamError(id, ErrCodeRefusedStream) + } + + initialState := stateOpen + if f.StreamEnded() { + initialState = stateHalfClosedRemote + } + st := sc.newStream(id, 0, initialState) + + if f.HasPriority() { + if err := checkPriority(f.StreamID, f.Priority); err != nil { + return err + } + sc.writeSched.AdjustStream(st.id, f.Priority) + } + + rw, req, err := sc.newWriterAndRequest(st, f) + if err != nil { + return err + } + st.reqTrailer = req.Trailer + if st.reqTrailer != nil { + st.trailer = make(http.Header) + } + st.body = req.Body.(*requestBody).pipe // may be nil + st.declBodyBytes = req.ContentLength + + handler := sc.handler.ServeHTTP + if f.Truncated { + // Their header list was too long. Send a 431 error. + handler = handleHeaderListTooLong + } else if err := checkValidHTTP2RequestHeaders(req.Header); err != nil { + handler = new400Handler(err) + } + + // The net/http package sets the read deadline from the + // http.Server.ReadTimeout during the TLS handshake, but then + // passes the connection off to us with the deadline already + // set. Disarm it here after the request headers are read, + // similar to how the http1 server works. Here it's + // technically more like the http1 Server's ReadHeaderTimeout + // (in Go 1.8), though. That's a more sane option anyway. + if sc.hs.ReadTimeout != 0 { + sc.conn.SetReadDeadline(time.Time{}) + } + + go sc.runHandler(rw, req, handler) + return nil +} + +func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error { + sc := st.sc + sc.serveG.check() + if st.gotTrailerHeader { + return ConnectionError(ErrCodeProtocol) + } + st.gotTrailerHeader = true + if !f.StreamEnded() { + return streamError(st.id, ErrCodeProtocol) + } + + if len(f.PseudoFields()) > 0 { + return streamError(st.id, ErrCodeProtocol) + } + if st.trailer != nil { + for _, hf := range f.RegularFields() { + key := sc.canonicalHeader(hf.Name) + if !httpguts.ValidTrailerHeader(key) { + // TODO: send more details to the peer somehow. But http2 has + // no way to send debug data at a stream level. Discuss with + // HTTP folk. + return streamError(st.id, ErrCodeProtocol) + } + st.trailer[key] = append(st.trailer[key], hf.Value) + } + } + st.endStream() + return nil +} + +func checkPriority(streamID uint32, p PriorityParam) error { + if streamID == p.StreamDep { + // Section 5.3.1: "A stream cannot depend on itself. An endpoint MUST treat + // this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR." + // Section 5.3.3 says that a stream can depend on one of its dependencies, + // so it's only self-dependencies that are forbidden. + return streamError(streamID, ErrCodeProtocol) + } + return nil +} + +func (sc *serverConn) processPriority(f *PriorityFrame) error { + if sc.inGoAway { + return nil + } + if err := checkPriority(f.StreamID, f.PriorityParam); err != nil { + return err + } + sc.writeSched.AdjustStream(f.StreamID, f.PriorityParam) + return nil +} + +func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream { + sc.serveG.check() + if id == 0 { + panic("internal error: cannot create stream with id 0") + } + + ctx, cancelCtx := context.WithCancel(sc.baseCtx) + st := &stream{ + sc: sc, + id: id, + state: state, + ctx: ctx, + cancelCtx: cancelCtx, + } + st.cw.Init() + st.flow.conn = &sc.flow // link to conn-level counter + st.flow.add(sc.initialStreamSendWindowSize) + st.inflow.conn = &sc.inflow // link to conn-level counter + st.inflow.add(sc.srv.initialStreamRecvWindowSize()) + if sc.hs.WriteTimeout != 0 { + st.writeDeadline = time.AfterFunc(sc.hs.WriteTimeout, st.onWriteTimeout) + } + + sc.streams[id] = st + sc.writeSched.OpenStream(st.id, OpenStreamOptions{PusherID: pusherID}) + if st.isPushed() { + sc.curPushedStreams++ + } else { + sc.curClientStreams++ + } + if sc.curOpenStreams() == 1 { + sc.setConnState(http.StateActive) + } + + return st +} + +func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*responseWriter, *http.Request, error) { + sc.serveG.check() + + rp := requestParam{ + method: f.PseudoValue("method"), + scheme: f.PseudoValue("scheme"), + authority: f.PseudoValue("authority"), + path: f.PseudoValue("path"), + } + + isConnect := rp.method == "CONNECT" + if isConnect { + if rp.path != "" || rp.scheme != "" || rp.authority == "" { + return nil, nil, streamError(f.StreamID, ErrCodeProtocol) + } + } else if rp.method == "" || rp.path == "" || (rp.scheme != "https" && rp.scheme != "http") { + // See 8.1.2.6 Malformed Requests and Responses: + // + // Malformed requests or responses that are detected + // MUST be treated as a stream error (Section 5.4.2) + // of type PROTOCOL_ERROR." + // + // 8.1.2.3 Request Pseudo-Header Fields + // "All HTTP/2 requests MUST include exactly one valid + // value for the :method, :scheme, and :path + // pseudo-header fields" + return nil, nil, streamError(f.StreamID, ErrCodeProtocol) + } + + bodyOpen := !f.StreamEnded() + if rp.method == "HEAD" && bodyOpen { + // HEAD requests can't have bodies + return nil, nil, streamError(f.StreamID, ErrCodeProtocol) + } + + rp.header = make(http.Header) + for _, hf := range f.RegularFields() { + rp.header.Add(sc.canonicalHeader(hf.Name), hf.Value) + } + if rp.authority == "" { + rp.authority = rp.header.Get("Host") + } + + rw, req, err := sc.newWriterAndRequestNoBody(st, rp) + if err != nil { + return nil, nil, err + } + if bodyOpen { + if vv, ok := rp.header["Content-Length"]; ok { + req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64) + } else { + req.ContentLength = -1 + } + req.Body.(*requestBody).pipe = &pipe{ + b: &dataBuffer{expected: req.ContentLength}, + } + } + return rw, req, nil +} + +type requestParam struct { + method string + scheme, authority, path string + header http.Header +} + +func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*responseWriter, *http.Request, error) { + sc.serveG.check() + + var tlsState *tls.ConnectionState // nil if not scheme https + if rp.scheme == "https" { + tlsState = sc.tlsState + } + + needsContinue := rp.header.Get("Expect") == "100-continue" + if needsContinue { + rp.header.Del("Expect") + } + // Merge Cookie headers into one "; "-delimited value. + if cookies := rp.header["Cookie"]; len(cookies) > 1 { + rp.header.Set("Cookie", strings.Join(cookies, "; ")) + } + + // Setup Trailers + var trailer http.Header + for _, v := range rp.header["Trailer"] { + for _, key := range strings.Split(v, ",") { + key = http.CanonicalHeaderKey(textproto.TrimString(key)) + switch key { + case "Transfer-Encoding", "Trailer", "Content-Length": + // Bogus. (copy of http1 rules) + // Ignore. + default: + if trailer == nil { + trailer = make(http.Header) + } + trailer[key] = nil + } + } + } + delete(rp.header, "Trailer") + + var url_ *url.URL + var requestURI string + if rp.method == "CONNECT" { + url_ = &url.URL{Host: rp.authority} + requestURI = rp.authority // mimic HTTP/1 server behavior + } else { + var err error + url_, err = url.ParseRequestURI(rp.path) + if err != nil { + return nil, nil, streamError(st.id, ErrCodeProtocol) + } + requestURI = rp.path + } + + body := &requestBody{ + conn: sc, + stream: st, + needsContinue: needsContinue, + } + req := &http.Request{ + Method: rp.method, + URL: url_, + RemoteAddr: sc.remoteAddrStr, + Header: rp.header, + RequestURI: requestURI, + Proto: "HTTP/2.0", + ProtoMajor: 2, + ProtoMinor: 0, + TLS: tlsState, + Host: rp.authority, + Body: body, + Trailer: trailer, + } + req = req.WithContext(st.ctx) + + rws := responseWriterStatePool.Get().(*responseWriterState) + bwSave := rws.bw + *rws = responseWriterState{} // zero all the fields + rws.conn = sc + rws.bw = bwSave + rws.bw.Reset(chunkWriter{rws}) + rws.stream = st + rws.req = req + rws.body = body + + rw := &responseWriter{rws: rws} + return rw, req, nil +} + +// Run on its own goroutine. +func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { + didPanic := true + defer func() { + rw.rws.stream.cancelCtx() + if didPanic { + e := recover() + sc.writeFrameFromHandler(FrameWriteRequest{ + write: handlerPanicRST{rw.rws.stream.id}, + stream: rw.rws.stream, + }) + // Same as net/http: + if e != nil && e != http.ErrAbortHandler { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf) + } + return + } + rw.handlerDone() + }() + handler(rw, req) + didPanic = false +} + +func handleHeaderListTooLong(w http.ResponseWriter, r *http.Request) { + // 10.5.1 Limits on Header Block Size: + // .. "A server that receives a larger header block than it is + // willing to handle can send an HTTP 431 (Request Header Fields Too + // Large) status code" + const statusRequestHeaderFieldsTooLarge = 431 // only in Go 1.6+ + w.WriteHeader(statusRequestHeaderFieldsTooLarge) + io.WriteString(w, "

HTTP Error 431

Request Header Field(s) Too Large

") +} + +// called from handler goroutines. +// h may be nil. +func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) error { + sc.serveG.checkNotOn() // NOT on + var errc chan error + if headerData.h != nil { + // If there's a header map (which we don't own), so we have to block on + // waiting for this frame to be written, so an http.Flush mid-handler + // writes out the correct value of keys, before a handler later potentially + // mutates it. + errc = errChanPool.Get().(chan error) + } + if err := sc.writeFrameFromHandler(FrameWriteRequest{ + write: headerData, + stream: st, + done: errc, + }); err != nil { + return err + } + if errc != nil { + select { + case err := <-errc: + errChanPool.Put(errc) + return err + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + } + } + return nil +} + +// called from handler goroutines. +func (sc *serverConn) write100ContinueHeaders(st *stream) { + sc.writeFrameFromHandler(FrameWriteRequest{ + write: write100ContinueHeadersFrame{st.id}, + stream: st, + }) +} + +// A bodyReadMsg tells the server loop that the http.Handler read n +// bytes of the DATA from the client on the given stream. +type bodyReadMsg struct { + st *stream + n int +} + +// called from handler goroutines. +// Notes that the handler for the given stream ID read n bytes of its body +// and schedules flow control tokens to be sent. +func (sc *serverConn) noteBodyReadFromHandler(st *stream, n int, err error) { + sc.serveG.checkNotOn() // NOT on + if n > 0 { + select { + case sc.bodyReadCh <- bodyReadMsg{st, n}: + case <-sc.doneServing: + } + } +} + +func (sc *serverConn) noteBodyRead(st *stream, n int) { + sc.serveG.check() + sc.sendWindowUpdate(nil, n) // conn-level + if st.state != stateHalfClosedRemote && st.state != stateClosed { + // Don't send this WINDOW_UPDATE if the stream is closed + // remotely. + sc.sendWindowUpdate(st, n) + } +} + +// st may be nil for conn-level +func (sc *serverConn) sendWindowUpdate(st *stream, n int) { + sc.serveG.check() + // "The legal range for the increment to the flow control + // window is 1 to 2^31-1 (2,147,483,647) octets." + // A Go Read call on 64-bit machines could in theory read + // a larger Read than this. Very unlikely, but we handle it here + // rather than elsewhere for now. + const maxUint31 = 1<<31 - 1 + for n >= maxUint31 { + sc.sendWindowUpdate32(st, maxUint31) + n -= maxUint31 + } + sc.sendWindowUpdate32(st, int32(n)) +} + +// st may be nil for conn-level +func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) { + sc.serveG.check() + if n == 0 { + return + } + if n < 0 { + panic("negative update") + } + var streamID uint32 + if st != nil { + streamID = st.id + } + sc.writeFrame(FrameWriteRequest{ + write: writeWindowUpdate{streamID: streamID, n: uint32(n)}, + stream: st, + }) + var ok bool + if st == nil { + ok = sc.inflow.add(n) + } else { + ok = st.inflow.add(n) + } + if !ok { + panic("internal error; sent too many window updates without decrements?") + } +} + +// requestBody is the Handler's Request.Body type. +// Read and Close may be called concurrently. +type requestBody struct { + _ incomparable + stream *stream + conn *serverConn + closed bool // for use by Close only + sawEOF bool // for use by Read only + pipe *pipe // non-nil if we have a HTTP entity message body + needsContinue bool // need to send a 100-continue +} + +func (b *requestBody) Close() error { + if b.pipe != nil && !b.closed { + b.pipe.BreakWithError(errClosedBody) + } + b.closed = true + return nil +} + +func (b *requestBody) Read(p []byte) (n int, err error) { + if b.needsContinue { + b.needsContinue = false + b.conn.write100ContinueHeaders(b.stream) + } + if b.pipe == nil || b.sawEOF { + return 0, io.EOF + } + n, err = b.pipe.Read(p) + if err == io.EOF { + b.sawEOF = true + } + if b.conn == nil && inTests { + return + } + b.conn.noteBodyReadFromHandler(b.stream, n, err) + return +} + +// responseWriter is the http.ResponseWriter implementation. It's +// intentionally small (1 pointer wide) to minimize garbage. The +// responseWriterState pointer inside is zeroed at the end of a +// request (in handlerDone) and calls on the responseWriter thereafter +// simply crash (caller's mistake), but the much larger responseWriterState +// and buffers are reused between multiple requests. +type responseWriter struct { + rws *responseWriterState +} + +// Optional http.ResponseWriter interfaces implemented. +var ( + _ http.CloseNotifier = (*responseWriter)(nil) + _ http.Flusher = (*responseWriter)(nil) + _ stringWriter = (*responseWriter)(nil) +) + +type responseWriterState struct { + // immutable within a request: + stream *stream + req *http.Request + body *requestBody // to close at end of request, if DATA frames didn't + conn *serverConn + + // TODO: adjust buffer writing sizes based on server config, frame size updates from peer, etc + bw *bufio.Writer // writing to a chunkWriter{this *responseWriterState} + + // mutated by http.Handler goroutine: + handlerHeader http.Header // nil until called + snapHeader http.Header // snapshot of handlerHeader at WriteHeader time + trailers []string // set in writeChunk + status int // status code passed to WriteHeader + wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. + sentHeader bool // have we sent the header frame? + handlerDone bool // handler has finished + dirty bool // a Write failed; don't reuse this responseWriterState + + sentContentLen int64 // non-zero if handler set a Content-Length header + wroteBytes int64 + + closeNotifierMu sync.Mutex // guards closeNotifierCh + closeNotifierCh chan bool // nil until first used +} + +type chunkWriter struct{ rws *responseWriterState } + +func (cw chunkWriter) Write(p []byte) (n int, err error) { return cw.rws.writeChunk(p) } + +func (rws *responseWriterState) hasTrailers() bool { return len(rws.trailers) > 0 } + +func (rws *responseWriterState) hasNonemptyTrailers() bool { + for _, trailer := range rws.trailers { + if _, ok := rws.handlerHeader[trailer]; ok { + return true + } + } + return false +} + +// declareTrailer is called for each Trailer header when the +// response header is written. It notes that a header will need to be +// written in the trailers at the end of the response. +func (rws *responseWriterState) declareTrailer(k string) { + k = http.CanonicalHeaderKey(k) + if !httpguts.ValidTrailerHeader(k) { + // Forbidden by RFC 7230, section 4.1.2. + rws.conn.logf("ignoring invalid trailer %q", k) + return + } + if !strSliceContains(rws.trailers, k) { + rws.trailers = append(rws.trailers, k) + } +} + +// writeChunk writes chunks from the bufio.Writer. But because +// bufio.Writer may bypass its chunking, sometimes p may be +// arbitrarily large. +// +// writeChunk is also responsible (on the first chunk) for sending the +// HEADER response. +func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { + if !rws.wroteHeader { + rws.writeHeader(200) + } + + isHeadResp := rws.req.Method == "HEAD" + if !rws.sentHeader { + rws.sentHeader = true + var ctype, clen string + if clen = rws.snapHeader.Get("Content-Length"); clen != "" { + rws.snapHeader.Del("Content-Length") + clen64, err := strconv.ParseInt(clen, 10, 64) + if err == nil && clen64 >= 0 { + rws.sentContentLen = clen64 + } else { + clen = "" + } + } + if clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) { + clen = strconv.Itoa(len(p)) + } + _, hasContentType := rws.snapHeader["Content-Type"] + // If the Content-Encoding is non-blank, we shouldn't + // sniff the body. See Issue golang.org/issue/31753. + ce := rws.snapHeader.Get("Content-Encoding") + hasCE := len(ce) > 0 + if !hasCE && !hasContentType && bodyAllowedForStatus(rws.status) && len(p) > 0 { + ctype = http.DetectContentType(p) + } + var date string + if _, ok := rws.snapHeader["Date"]; !ok { + // TODO(bradfitz): be faster here, like net/http? measure. + date = time.Now().UTC().Format(http.TimeFormat) + } + + for _, v := range rws.snapHeader["Trailer"] { + foreachHeaderElement(v, rws.declareTrailer) + } + + // "Connection" headers aren't allowed in HTTP/2 (RFC 7540, 8.1.2.2), + // but respect "Connection" == "close" to mean sending a GOAWAY and tearing + // down the TCP connection when idle, like we do for HTTP/1. + // TODO: remove more Connection-specific header fields here, in addition + // to "Connection". + if _, ok := rws.snapHeader["Connection"]; ok { + v := rws.snapHeader.Get("Connection") + delete(rws.snapHeader, "Connection") + if v == "close" { + rws.conn.startGracefulShutdown() + } + } + + endStream := (rws.handlerDone && !rws.hasTrailers() && len(p) == 0) || isHeadResp + err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + streamID: rws.stream.id, + httpResCode: rws.status, + h: rws.snapHeader, + endStream: endStream, + contentType: ctype, + contentLength: clen, + date: date, + }) + if err != nil { + rws.dirty = true + return 0, err + } + if endStream { + return 0, nil + } + } + if isHeadResp { + return len(p), nil + } + if len(p) == 0 && !rws.handlerDone { + return 0, nil + } + + if rws.handlerDone { + rws.promoteUndeclaredTrailers() + } + + // only send trailers if they have actually been defined by the + // server handler. + hasNonemptyTrailers := rws.hasNonemptyTrailers() + endStream := rws.handlerDone && !hasNonemptyTrailers + if len(p) > 0 || endStream { + // only send a 0 byte DATA frame if we're ending the stream. + if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { + rws.dirty = true + return 0, err + } + } + + if rws.handlerDone && hasNonemptyTrailers { + err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + streamID: rws.stream.id, + h: rws.handlerHeader, + trailers: rws.trailers, + endStream: true, + }) + if err != nil { + rws.dirty = true + } + return len(p), err + } + return len(p), nil +} + +// TrailerPrefix is a magic prefix for ResponseWriter.Header map keys +// that, if present, signals that the map entry is actually for +// the response trailers, and not the response headers. The prefix +// is stripped after the ServeHTTP call finishes and the values are +// sent in the trailers. +// +// This mechanism is intended only for trailers that are not known +// prior to the headers being written. If the set of trailers is fixed +// or known before the header is written, the normal Go trailers mechanism +// is preferred: +// https://golang.org/pkg/net/http/#ResponseWriter +// https://golang.org/pkg/net/http/#example_ResponseWriter_trailers +const TrailerPrefix = "Trailer:" + +// promoteUndeclaredTrailers permits http.Handlers to set trailers +// after the header has already been flushed. Because the Go +// ResponseWriter interface has no way to set Trailers (only the +// Header), and because we didn't want to expand the ResponseWriter +// interface, and because nobody used trailers, and because RFC 7230 +// says you SHOULD (but not must) predeclare any trailers in the +// header, the official ResponseWriter rules said trailers in Go must +// be predeclared, and then we reuse the same ResponseWriter.Header() +// map to mean both Headers and Trailers. When it's time to write the +// Trailers, we pick out the fields of Headers that were declared as +// trailers. That worked for a while, until we found the first major +// user of Trailers in the wild: gRPC (using them only over http2), +// and gRPC libraries permit setting trailers mid-stream without +// predeclaring them. So: change of plans. We still permit the old +// way, but we also permit this hack: if a Header() key begins with +// "Trailer:", the suffix of that key is a Trailer. Because ':' is an +// invalid token byte anyway, there is no ambiguity. (And it's already +// filtered out) It's mildly hacky, but not terrible. +// +// This method runs after the Handler is done and promotes any Header +// fields to be trailers. +func (rws *responseWriterState) promoteUndeclaredTrailers() { + for k, vv := range rws.handlerHeader { + if !strings.HasPrefix(k, TrailerPrefix) { + continue + } + trailerKey := strings.TrimPrefix(k, TrailerPrefix) + rws.declareTrailer(trailerKey) + rws.handlerHeader[http.CanonicalHeaderKey(trailerKey)] = vv + } + + if len(rws.trailers) > 1 { + sorter := sorterPool.Get().(*sorter) + sorter.SortStrings(rws.trailers) + sorterPool.Put(sorter) + } +} + +func (w *responseWriter) Flush() { + rws := w.rws + if rws == nil { + panic("Header called after Handler finished") + } + if rws.bw.Buffered() > 0 { + if err := rws.bw.Flush(); err != nil { + // Ignore the error. The frame writer already knows. + return + } + } else { + // The bufio.Writer won't call chunkWriter.Write + // (writeChunk with zero bytes, so we have to do it + // ourselves to force the HTTP response header and/or + // final DATA frame (with END_STREAM) to be sent. + rws.writeChunk(nil) + } +} + +func (w *responseWriter) CloseNotify() <-chan bool { + rws := w.rws + if rws == nil { + panic("CloseNotify called after Handler finished") + } + rws.closeNotifierMu.Lock() + ch := rws.closeNotifierCh + if ch == nil { + ch = make(chan bool, 1) + rws.closeNotifierCh = ch + cw := rws.stream.cw + go func() { + cw.Wait() // wait for close + ch <- true + }() + } + rws.closeNotifierMu.Unlock() + return ch +} + +func (w *responseWriter) Header() http.Header { + rws := w.rws + if rws == nil { + panic("Header called after Handler finished") + } + if rws.handlerHeader == nil { + rws.handlerHeader = make(http.Header) + } + return rws.handlerHeader +} + +// checkWriteHeaderCode is a copy of net/http's checkWriteHeaderCode. +func checkWriteHeaderCode(code int) { + // Issue 22880: require valid WriteHeader status codes. + // For now we only enforce that it's three digits. + // In the future we might block things over 599 (600 and above aren't defined + // at http://httpwg.org/specs/rfc7231.html#status.codes) + // and we might block under 200 (once we have more mature 1xx support). + // But for now any three digits. + // + // We used to send "HTTP/1.1 000 0" on the wire in responses but there's + // no equivalent bogus thing we can realistically send in HTTP/2, + // so we'll consistently panic instead and help people find their bugs + // early. (We can't return an error from WriteHeader even if we wanted to.) + if code < 100 || code > 999 { + panic(fmt.Sprintf("invalid WriteHeader code %v", code)) + } +} + +func (w *responseWriter) WriteHeader(code int) { + rws := w.rws + if rws == nil { + panic("WriteHeader called after Handler finished") + } + rws.writeHeader(code) +} + +func (rws *responseWriterState) writeHeader(code int) { + if !rws.wroteHeader { + checkWriteHeaderCode(code) + rws.wroteHeader = true + rws.status = code + if len(rws.handlerHeader) > 0 { + rws.snapHeader = cloneHeader(rws.handlerHeader) + } + } +} + +func cloneHeader(h http.Header) http.Header { + h2 := make(http.Header, len(h)) + for k, vv := range h { + vv2 := make([]string, len(vv)) + copy(vv2, vv) + h2[k] = vv2 + } + return h2 +} + +// The Life Of A Write is like this: +// +// * Handler calls w.Write or w.WriteString -> +// * -> rws.bw (*bufio.Writer) -> +// * (Handler might call Flush) +// * -> chunkWriter{rws} +// * -> responseWriterState.writeChunk(p []byte) +// * -> responseWriterState.writeChunk (most of the magic; see comment there) +func (w *responseWriter) Write(p []byte) (n int, err error) { + return w.write(len(p), p, "") +} + +func (w *responseWriter) WriteString(s string) (n int, err error) { + return w.write(len(s), nil, s) +} + +// either dataB or dataS is non-zero. +func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, err error) { + rws := w.rws + if rws == nil { + panic("Write called after Handler finished") + } + if !rws.wroteHeader { + w.WriteHeader(200) + } + if !bodyAllowedForStatus(rws.status) { + return 0, http.ErrBodyNotAllowed + } + rws.wroteBytes += int64(len(dataB)) + int64(len(dataS)) // only one can be set + if rws.sentContentLen != 0 && rws.wroteBytes > rws.sentContentLen { + // TODO: send a RST_STREAM + return 0, errors.New("http2: handler wrote more than declared Content-Length") + } + + if dataB != nil { + return rws.bw.Write(dataB) + } else { + return rws.bw.WriteString(dataS) + } +} + +func (w *responseWriter) handlerDone() { + rws := w.rws + dirty := rws.dirty + rws.handlerDone = true + w.Flush() + w.rws = nil + if !dirty { + // Only recycle the pool if all prior Write calls to + // the serverConn goroutine completed successfully. If + // they returned earlier due to resets from the peer + // there might still be write goroutines outstanding + // from the serverConn referencing the rws memory. See + // issue 20704. + responseWriterStatePool.Put(rws) + } +} + +// Push errors. +var ( + ErrRecursivePush = errors.New("http2: recursive push not allowed") + ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS") +) + +var _ http.Pusher = (*responseWriter)(nil) + +func (w *responseWriter) Push(target string, opts *http.PushOptions) error { + st := w.rws.stream + sc := st.sc + sc.serveG.checkNotOn() + + // No recursive pushes: "PUSH_PROMISE frames MUST only be sent on a peer-initiated stream." + // http://tools.ietf.org/html/rfc7540#section-6.6 + if st.isPushed() { + return ErrRecursivePush + } + + if opts == nil { + opts = new(http.PushOptions) + } + + // Default options. + if opts.Method == "" { + opts.Method = "GET" + } + if opts.Header == nil { + opts.Header = http.Header{} + } + wantScheme := "http" + if w.rws.req.TLS != nil { + wantScheme = "https" + } + + // Validate the request. + u, err := url.Parse(target) + if err != nil { + return err + } + if u.Scheme == "" { + if !strings.HasPrefix(target, "/") { + return fmt.Errorf("target must be an absolute URL or an absolute path: %q", target) + } + u.Scheme = wantScheme + u.Host = w.rws.req.Host + } else { + if u.Scheme != wantScheme { + return fmt.Errorf("cannot push URL with scheme %q from request with scheme %q", u.Scheme, wantScheme) + } + if u.Host == "" { + return errors.New("URL must have a host") + } + } + for k := range opts.Header { + if strings.HasPrefix(k, ":") { + return fmt.Errorf("promised request headers cannot include pseudo header %q", k) + } + // These headers are meaningful only if the request has a body, + // but PUSH_PROMISE requests cannot have a body. + // http://tools.ietf.org/html/rfc7540#section-8.2 + // Also disallow Host, since the promised URL must be absolute. + switch strings.ToLower(k) { + case "content-length", "content-encoding", "trailer", "te", "expect", "host": + return fmt.Errorf("promised request headers cannot include %q", k) + } + } + if err := checkValidHTTP2RequestHeaders(opts.Header); err != nil { + return err + } + + // The RFC effectively limits promised requests to GET and HEAD: + // "Promised requests MUST be cacheable [GET, HEAD, or POST], and MUST be safe [GET or HEAD]" + // http://tools.ietf.org/html/rfc7540#section-8.2 + if opts.Method != "GET" && opts.Method != "HEAD" { + return fmt.Errorf("method %q must be GET or HEAD", opts.Method) + } + + msg := &startPushRequest{ + parent: st, + method: opts.Method, + url: u, + header: cloneHeader(opts.Header), + done: errChanPool.Get().(chan error), + } + + select { + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + case sc.serveMsgCh <- msg: + } + + select { + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + case err := <-msg.done: + errChanPool.Put(msg.done) + return err + } +} + +type startPushRequest struct { + parent *stream + method string + url *url.URL + header http.Header + done chan error +} + +func (sc *serverConn) startPush(msg *startPushRequest) { + sc.serveG.check() + + // http://tools.ietf.org/html/rfc7540#section-6.6. + // PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that + // is in either the "open" or "half-closed (remote)" state. + if msg.parent.state != stateOpen && msg.parent.state != stateHalfClosedRemote { + // responseWriter.Push checks that the stream is peer-initiated. + msg.done <- errStreamClosed + return + } + + // http://tools.ietf.org/html/rfc7540#section-6.6. + if !sc.pushEnabled { + msg.done <- http.ErrNotSupported + return + } + + // PUSH_PROMISE frames must be sent in increasing order by stream ID, so + // we allocate an ID for the promised stream lazily, when the PUSH_PROMISE + // is written. Once the ID is allocated, we start the request handler. + allocatePromisedID := func() (uint32, error) { + sc.serveG.check() + + // Check this again, just in case. Technically, we might have received + // an updated SETTINGS by the time we got around to writing this frame. + if !sc.pushEnabled { + return 0, http.ErrNotSupported + } + // http://tools.ietf.org/html/rfc7540#section-6.5.2. + if sc.curPushedStreams+1 > sc.clientMaxStreams { + return 0, ErrPushLimitReached + } + + // http://tools.ietf.org/html/rfc7540#section-5.1.1. + // Streams initiated by the server MUST use even-numbered identifiers. + // A server that is unable to establish a new stream identifier can send a GOAWAY + // frame so that the client is forced to open a new connection for new streams. + if sc.maxPushPromiseID+2 >= 1<<31 { + sc.startGracefulShutdownInternal() + return 0, ErrPushLimitReached + } + sc.maxPushPromiseID += 2 + promisedID := sc.maxPushPromiseID + + // http://tools.ietf.org/html/rfc7540#section-8.2. + // Strictly speaking, the new stream should start in "reserved (local)", then + // transition to "half closed (remote)" after sending the initial HEADERS, but + // we start in "half closed (remote)" for simplicity. + // See further comments at the definition of stateHalfClosedRemote. + promised := sc.newStream(promisedID, msg.parent.id, stateHalfClosedRemote) + rw, req, err := sc.newWriterAndRequestNoBody(promised, requestParam{ + method: msg.method, + scheme: msg.url.Scheme, + authority: msg.url.Host, + path: msg.url.RequestURI(), + header: cloneHeader(msg.header), // clone since handler runs concurrently with writing the PUSH_PROMISE + }) + if err != nil { + // Should not happen, since we've already validated msg.url. + panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err)) + } + + go sc.runHandler(rw, req, sc.handler.ServeHTTP) + return promisedID, nil + } + + sc.writeFrame(FrameWriteRequest{ + write: &writePushPromise{ + streamID: msg.parent.id, + method: msg.method, + url: msg.url, + h: msg.header, + allocatePromisedID: allocatePromisedID, + }, + stream: msg.parent, + done: msg.done, + }) +} + +// foreachHeaderElement splits v according to the "#rule" construction +// in RFC 7230 section 7 and calls fn for each non-empty element. +func foreachHeaderElement(v string, fn func(string)) { + v = textproto.TrimString(v) + if v == "" { + return + } + if !strings.Contains(v, ",") { + fn(v) + return + } + for _, f := range strings.Split(v, ",") { + if f = textproto.TrimString(f); f != "" { + fn(f) + } + } +} + +// From http://httpwg.org/specs/rfc7540.html#rfc.section.8.1.2.2 +var connHeaders = []string{ + "Connection", + "Keep-Alive", + "Proxy-Connection", + "Transfer-Encoding", + "Upgrade", +} + +// checkValidHTTP2RequestHeaders checks whether h is a valid HTTP/2 request, +// per RFC 7540 Section 8.1.2.2. +// The returned error is reported to users. +func checkValidHTTP2RequestHeaders(h http.Header) error { + for _, k := range connHeaders { + if _, ok := h[k]; ok { + return fmt.Errorf("request header %q is not valid in HTTP/2", k) + } + } + te := h["Te"] + if len(te) > 0 && (len(te) > 1 || (te[0] != "trailers" && te[0] != "")) { + return errors.New(`request header "TE" may only be "trailers" in HTTP/2`) + } + return nil +} + +func new400Handler(err error) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + http.Error(w, err.Error(), http.StatusBadRequest) + } +} + +// h1ServerKeepAlivesDisabled reports whether hs has its keep-alives +// disabled. See comments on h1ServerShutdownChan above for why +// the code is written this way. +func h1ServerKeepAlivesDisabled(hs *http.Server) bool { + var x interface{} = hs + type I interface { + doKeepAlives() bool + } + if hs, ok := x.(I); ok { + return !hs.doKeepAlives() + } + return false +} diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go new file mode 100644 index 00000000..2482f7bf --- /dev/null +++ b/vendor/golang.org/x/net/http2/transport.go @@ -0,0 +1,2733 @@ +// 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. + +// Transport code. + +package http2 + +import ( + "bufio" + "bytes" + "compress/gzip" + "context" + "crypto/rand" + "crypto/tls" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "math" + mathrand "math/rand" + "net" + "net/http" + "net/http/httptrace" + "net/textproto" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + + "golang.org/x/net/http/httpguts" + "golang.org/x/net/http2/hpack" + "golang.org/x/net/idna" +) + +const ( + // transportDefaultConnFlow is how many connection-level flow control + // tokens we give the server at start-up, past the default 64k. + transportDefaultConnFlow = 1 << 30 + + // transportDefaultStreamFlow is how many stream-level flow + // control tokens we announce to the peer, and how many bytes + // we buffer per stream. + transportDefaultStreamFlow = 4 << 20 + + // transportDefaultStreamMinRefresh is the minimum number of bytes we'll send + // a stream-level WINDOW_UPDATE for at a time. + transportDefaultStreamMinRefresh = 4 << 10 + + defaultUserAgent = "Go-http-client/2.0" +) + +// Transport is an HTTP/2 Transport. +// +// A Transport internally caches connections to servers. It is safe +// for concurrent use by multiple goroutines. +type Transport struct { + // DialTLS specifies an optional dial function for creating + // TLS connections for requests. + // + // If DialTLS is nil, tls.Dial is used. + // + // If the returned net.Conn has a ConnectionState method like tls.Conn, + // it will be used to set http.Response.TLS. + DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error) + + // TLSClientConfig specifies the TLS configuration to use with + // tls.Client. If nil, the default configuration is used. + TLSClientConfig *tls.Config + + // ConnPool optionally specifies an alternate connection pool to use. + // If nil, the default is used. + ConnPool ClientConnPool + + // DisableCompression, if true, prevents the Transport from + // requesting compression with an "Accept-Encoding: gzip" + // request header when the Request contains no existing + // Accept-Encoding value. If the Transport requests gzip on + // its own and gets a gzipped response, it's transparently + // decoded in the Response.Body. However, if the user + // explicitly requested gzip it is not automatically + // uncompressed. + DisableCompression bool + + // AllowHTTP, if true, permits HTTP/2 requests using the insecure, + // plain-text "http" scheme. Note that this does not enable h2c support. + AllowHTTP bool + + // MaxHeaderListSize is the http2 SETTINGS_MAX_HEADER_LIST_SIZE to + // send in the initial settings frame. It is how many bytes + // of response headers are allowed. Unlike the http2 spec, zero here + // means to use a default limit (currently 10MB). If you actually + // want to advertise an unlimited value to the peer, Transport + // interprets the highest possible value here (0xffffffff or 1<<32-1) + // to mean no limit. + MaxHeaderListSize uint32 + + // StrictMaxConcurrentStreams controls whether the server's + // SETTINGS_MAX_CONCURRENT_STREAMS should be respected + // globally. If false, new TCP connections are created to the + // server as needed to keep each under the per-connection + // SETTINGS_MAX_CONCURRENT_STREAMS limit. If true, the + // server's SETTINGS_MAX_CONCURRENT_STREAMS is interpreted as + // a global limit and callers of RoundTrip block when needed, + // waiting for their turn. + StrictMaxConcurrentStreams bool + + // ReadIdleTimeout is the timeout after which a health check using ping + // frame will be carried out if no frame is received on the connection. + // Note that a ping response will is considered a received frame, so if + // there is no other traffic on the connection, the health check will + // be performed every ReadIdleTimeout interval. + // If zero, no health check is performed. + ReadIdleTimeout time.Duration + + // PingTimeout is the timeout after which the connection will be closed + // if a response to Ping is not received. + // Defaults to 15s. + PingTimeout time.Duration + + // t1, if non-nil, is the standard library Transport using + // this transport. Its settings are used (but not its + // RoundTrip method, etc). + t1 *http.Transport + + connPoolOnce sync.Once + connPoolOrDef ClientConnPool // non-nil version of ConnPool +} + +func (t *Transport) maxHeaderListSize() uint32 { + if t.MaxHeaderListSize == 0 { + return 10 << 20 + } + if t.MaxHeaderListSize == 0xffffffff { + return 0 + } + return t.MaxHeaderListSize +} + +func (t *Transport) disableCompression() bool { + return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression) +} + +func (t *Transport) pingTimeout() time.Duration { + if t.PingTimeout == 0 { + return 15 * time.Second + } + return t.PingTimeout + +} + +// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2. +// It returns an error if t1 has already been HTTP/2-enabled. +func ConfigureTransport(t1 *http.Transport) error { + _, err := configureTransport(t1) + return err +} + +func configureTransport(t1 *http.Transport) (*Transport, error) { + connPool := new(clientConnPool) + t2 := &Transport{ + ConnPool: noDialClientConnPool{connPool}, + t1: t1, + } + connPool.t = t2 + if err := registerHTTPSProtocol(t1, noDialH2RoundTripper{t2}); err != nil { + return nil, err + } + if t1.TLSClientConfig == nil { + t1.TLSClientConfig = new(tls.Config) + } + if !strSliceContains(t1.TLSClientConfig.NextProtos, "h2") { + t1.TLSClientConfig.NextProtos = append([]string{"h2"}, t1.TLSClientConfig.NextProtos...) + } + if !strSliceContains(t1.TLSClientConfig.NextProtos, "http/1.1") { + t1.TLSClientConfig.NextProtos = append(t1.TLSClientConfig.NextProtos, "http/1.1") + } + upgradeFn := func(authority string, c *tls.Conn) http.RoundTripper { + addr := authorityAddr("https", authority) + if used, err := connPool.addConnIfNeeded(addr, t2, c); err != nil { + go c.Close() + return erringRoundTripper{err} + } else if !used { + // Turns out we don't need this c. + // For example, two goroutines made requests to the same host + // at the same time, both kicking off TCP dials. (since protocol + // was unknown) + go c.Close() + } + return t2 + } + if m := t1.TLSNextProto; len(m) == 0 { + t1.TLSNextProto = map[string]func(string, *tls.Conn) http.RoundTripper{ + "h2": upgradeFn, + } + } else { + m["h2"] = upgradeFn + } + return t2, nil +} + +func (t *Transport) connPool() ClientConnPool { + t.connPoolOnce.Do(t.initConnPool) + return t.connPoolOrDef +} + +func (t *Transport) initConnPool() { + if t.ConnPool != nil { + t.connPoolOrDef = t.ConnPool + } else { + t.connPoolOrDef = &clientConnPool{t: t} + } +} + +// ClientConn is the state of a single HTTP/2 client connection to an +// HTTP/2 server. +type ClientConn struct { + t *Transport + tconn net.Conn // usually *tls.Conn, except specialized impls + tlsState *tls.ConnectionState // nil only for specialized impls + reused uint32 // whether conn is being reused; atomic + singleUse bool // whether being used for a single http.Request + + // readLoop goroutine fields: + readerDone chan struct{} // closed on error + readerErr error // set before readerDone is closed + + idleTimeout time.Duration // or 0 for never + idleTimer *time.Timer + + mu sync.Mutex // guards following + cond *sync.Cond // hold mu; broadcast on flow/closed changes + flow flow // our conn-level flow control quota (cs.flow is per stream) + inflow flow // peer's conn-level flow control + closing bool + closed bool + wantSettingsAck bool // we sent a SETTINGS frame and haven't heard back + goAway *GoAwayFrame // if non-nil, the GoAwayFrame we received + goAwayDebug string // goAway frame's debug data, retained as a string + streams map[uint32]*clientStream // client-initiated + nextStreamID uint32 + pendingRequests int // requests blocked and waiting to be sent because len(streams) == maxConcurrentStreams + pings map[[8]byte]chan struct{} // in flight ping data to notification channel + bw *bufio.Writer + br *bufio.Reader + fr *Framer + lastActive time.Time + lastIdle time.Time // time last idle + // Settings from peer: (also guarded by mu) + maxFrameSize uint32 + maxConcurrentStreams uint32 + peerMaxHeaderListSize uint64 + initialWindowSize uint32 + + hbuf bytes.Buffer // HPACK encoder writes into this + henc *hpack.Encoder + freeBuf [][]byte + + wmu sync.Mutex // held while writing; acquire AFTER mu if holding both + werr error // first write error that has occurred +} + +// clientStream is the state for a single HTTP/2 stream. One of these +// is created for each Transport.RoundTrip call. +type clientStream struct { + cc *ClientConn + req *http.Request + trace *httptrace.ClientTrace // or nil + ID uint32 + resc chan resAndError + bufPipe pipe // buffered pipe with the flow-controlled response payload + startedWrite bool // started request body write; guarded by cc.mu + requestedGzip bool + on100 func() // optional code to run if get a 100 continue response + + flow flow // guarded by cc.mu + inflow flow // guarded by cc.mu + bytesRemain int64 // -1 means unknown; owned by transportResponseBody.Read + readErr error // sticky read error; owned by transportResponseBody.Read + stopReqBody error // if non-nil, stop writing req body; guarded by cc.mu + didReset bool // whether we sent a RST_STREAM to the server; guarded by cc.mu + + peerReset chan struct{} // closed on peer reset + resetErr error // populated before peerReset is closed + + done chan struct{} // closed when stream remove from cc.streams map; close calls guarded by cc.mu + + // owned by clientConnReadLoop: + firstByte bool // got the first response byte + pastHeaders bool // got first MetaHeadersFrame (actual headers) + pastTrailers bool // got optional second MetaHeadersFrame (trailers) + num1xx uint8 // number of 1xx responses seen + + trailer http.Header // accumulated trailers + resTrailer *http.Header // client's Response.Trailer +} + +// awaitRequestCancel waits for the user to cancel a request or for the done +// channel to be signaled. A non-nil error is returned only if the request was +// canceled. +func awaitRequestCancel(req *http.Request, done <-chan struct{}) error { + ctx := req.Context() + if req.Cancel == nil && ctx.Done() == nil { + return nil + } + select { + case <-req.Cancel: + return errRequestCanceled + case <-ctx.Done(): + return ctx.Err() + case <-done: + return nil + } +} + +var got1xxFuncForTests func(int, textproto.MIMEHeader) error + +// get1xxTraceFunc returns the value of request's httptrace.ClientTrace.Got1xxResponse func, +// if any. It returns nil if not set or if the Go version is too old. +func (cs *clientStream) get1xxTraceFunc() func(int, textproto.MIMEHeader) error { + if fn := got1xxFuncForTests; fn != nil { + return fn + } + return traceGot1xxResponseFunc(cs.trace) +} + +// awaitRequestCancel waits for the user to cancel a request, its context to +// expire, or for the request to be done (any way it might be removed from the +// cc.streams map: peer reset, successful completion, TCP connection breakage, +// etc). If the request is canceled, then cs will be canceled and closed. +func (cs *clientStream) awaitRequestCancel(req *http.Request) { + if err := awaitRequestCancel(req, cs.done); err != nil { + cs.cancelStream() + cs.bufPipe.CloseWithError(err) + } +} + +func (cs *clientStream) cancelStream() { + cc := cs.cc + cc.mu.Lock() + didReset := cs.didReset + cs.didReset = true + cc.mu.Unlock() + + if !didReset { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + cc.forgetStreamID(cs.ID) + } +} + +// checkResetOrDone reports any error sent in a RST_STREAM frame by the +// server, or errStreamClosed if the stream is complete. +func (cs *clientStream) checkResetOrDone() error { + select { + case <-cs.peerReset: + return cs.resetErr + case <-cs.done: + return errStreamClosed + default: + return nil + } +} + +func (cs *clientStream) getStartedWrite() bool { + cc := cs.cc + cc.mu.Lock() + defer cc.mu.Unlock() + return cs.startedWrite +} + +func (cs *clientStream) abortRequestBodyWrite(err error) { + if err == nil { + panic("nil error") + } + cc := cs.cc + cc.mu.Lock() + cs.stopReqBody = err + cc.cond.Broadcast() + cc.mu.Unlock() +} + +type stickyErrWriter struct { + w io.Writer + err *error +} + +func (sew stickyErrWriter) Write(p []byte) (n int, err error) { + if *sew.err != nil { + return 0, *sew.err + } + n, err = sew.w.Write(p) + *sew.err = err + return +} + +// noCachedConnError is the concrete type of ErrNoCachedConn, which +// needs to be detected by net/http regardless of whether it's its +// bundled version (in h2_bundle.go with a rewritten type name) or +// from a user's x/net/http2. As such, as it has a unique method name +// (IsHTTP2NoCachedConnError) that net/http sniffs for via func +// isNoCachedConnError. +type noCachedConnError struct{} + +func (noCachedConnError) IsHTTP2NoCachedConnError() {} +func (noCachedConnError) Error() string { return "http2: no cached connection was available" } + +// isNoCachedConnError reports whether err is of type noCachedConnError +// or its equivalent renamed type in net/http2's h2_bundle.go. Both types +// may coexist in the same running program. +func isNoCachedConnError(err error) bool { + _, ok := err.(interface{ IsHTTP2NoCachedConnError() }) + return ok +} + +var ErrNoCachedConn error = noCachedConnError{} + +// RoundTripOpt are options for the Transport.RoundTripOpt method. +type RoundTripOpt struct { + // OnlyCachedConn controls whether RoundTripOpt may + // create a new TCP connection. If set true and + // no cached connection is available, RoundTripOpt + // will return ErrNoCachedConn. + OnlyCachedConn bool +} + +func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { + return t.RoundTripOpt(req, RoundTripOpt{}) +} + +// authorityAddr returns a given authority (a host/IP, or host:port / ip:port) +// and returns a host:port. The port 443 is added if needed. +func authorityAddr(scheme string, authority string) (addr string) { + host, port, err := net.SplitHostPort(authority) + if err != nil { // authority didn't have a port + port = "443" + if scheme == "http" { + port = "80" + } + host = authority + } + if a, err := idna.ToASCII(host); err == nil { + host = a + } + // IPv6 address literal, without a port: + if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") { + return host + ":" + port + } + return net.JoinHostPort(host, port) +} + +// RoundTripOpt is like RoundTrip, but takes options. +func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) { + if !(req.URL.Scheme == "https" || (req.URL.Scheme == "http" && t.AllowHTTP)) { + return nil, errors.New("http2: unsupported scheme") + } + + addr := authorityAddr(req.URL.Scheme, req.URL.Host) + for retry := 0; ; retry++ { + cc, err := t.connPool().GetClientConn(req, addr) + if err != nil { + t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err) + return nil, err + } + reused := !atomic.CompareAndSwapUint32(&cc.reused, 0, 1) + traceGotConn(req, cc, reused) + res, gotErrAfterReqBodyWrite, err := cc.roundTrip(req) + if err != nil && retry <= 6 { + if req, err = shouldRetryRequest(req, err, gotErrAfterReqBodyWrite); err == nil { + // After the first retry, do exponential backoff with 10% jitter. + if retry == 0 { + continue + } + backoff := float64(uint(1) << (uint(retry) - 1)) + backoff += backoff * (0.1 * mathrand.Float64()) + select { + case <-time.After(time.Second * time.Duration(backoff)): + continue + case <-req.Context().Done(): + return nil, req.Context().Err() + } + } + } + if err != nil { + t.vlogf("RoundTrip failure: %v", err) + return nil, err + } + return res, nil + } +} + +// CloseIdleConnections closes any connections which were previously +// connected from previous requests but are now sitting idle. +// It does not interrupt any connections currently in use. +func (t *Transport) CloseIdleConnections() { + if cp, ok := t.connPool().(clientConnPoolIdleCloser); ok { + cp.closeIdleConnections() + } +} + +var ( + errClientConnClosed = errors.New("http2: client conn is closed") + errClientConnUnusable = errors.New("http2: client conn not usable") + errClientConnGotGoAway = errors.New("http2: Transport received Server's graceful shutdown GOAWAY") +) + +// shouldRetryRequest is called by RoundTrip when a request fails to get +// response headers. It is always called with a non-nil error. +// It returns either a request to retry (either the same request, or a +// modified clone), or an error if the request can't be replayed. +func shouldRetryRequest(req *http.Request, err error, afterBodyWrite bool) (*http.Request, error) { + if !canRetryError(err) { + return nil, err + } + // If the Body is nil (or http.NoBody), it's safe to reuse + // this request and its Body. + if req.Body == nil || req.Body == http.NoBody { + return req, nil + } + + // If the request body can be reset back to its original + // state via the optional req.GetBody, do that. + if req.GetBody != nil { + // TODO: consider a req.Body.Close here? or audit that all caller paths do? + body, err := req.GetBody() + if err != nil { + return nil, err + } + newReq := *req + newReq.Body = body + return &newReq, nil + } + + // The Request.Body can't reset back to the beginning, but we + // don't seem to have started to read from it yet, so reuse + // the request directly. The "afterBodyWrite" means the + // bodyWrite process has started, which becomes true before + // the first Read. + if !afterBodyWrite { + return req, nil + } + + return nil, fmt.Errorf("http2: Transport: cannot retry err [%v] after Request.Body was written; define Request.GetBody to avoid this error", err) +} + +func canRetryError(err error) bool { + if err == errClientConnUnusable || err == errClientConnGotGoAway { + return true + } + if se, ok := err.(StreamError); ok { + return se.Code == ErrCodeRefusedStream + } + return false +} + +func (t *Transport) dialClientConn(addr string, singleUse bool) (*ClientConn, error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + tconn, err := t.dialTLS()("tcp", addr, t.newTLSConfig(host)) + if err != nil { + return nil, err + } + return t.newClientConn(tconn, singleUse) +} + +func (t *Transport) newTLSConfig(host string) *tls.Config { + cfg := new(tls.Config) + if t.TLSClientConfig != nil { + *cfg = *t.TLSClientConfig.Clone() + } + if !strSliceContains(cfg.NextProtos, NextProtoTLS) { + cfg.NextProtos = append([]string{NextProtoTLS}, cfg.NextProtos...) + } + if cfg.ServerName == "" { + cfg.ServerName = host + } + return cfg +} + +func (t *Transport) dialTLS() func(string, string, *tls.Config) (net.Conn, error) { + if t.DialTLS != nil { + return t.DialTLS + } + return t.dialTLSDefault +} + +func (t *Transport) dialTLSDefault(network, addr string, cfg *tls.Config) (net.Conn, error) { + cn, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + if err := cn.Handshake(); err != nil { + return nil, err + } + if !cfg.InsecureSkipVerify { + if err := cn.VerifyHostname(cfg.ServerName); err != nil { + return nil, err + } + } + state := cn.ConnectionState() + if p := state.NegotiatedProtocol; p != NextProtoTLS { + return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, NextProtoTLS) + } + if !state.NegotiatedProtocolIsMutual { + return nil, errors.New("http2: could not negotiate protocol mutually") + } + return cn, nil +} + +// disableKeepAlives reports whether connections should be closed as +// soon as possible after handling the first request. +func (t *Transport) disableKeepAlives() bool { + return t.t1 != nil && t.t1.DisableKeepAlives +} + +func (t *Transport) expectContinueTimeout() time.Duration { + if t.t1 == nil { + return 0 + } + return t.t1.ExpectContinueTimeout +} + +func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) { + return t.newClientConn(c, t.disableKeepAlives()) +} + +func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, error) { + cc := &ClientConn{ + t: t, + tconn: c, + readerDone: make(chan struct{}), + nextStreamID: 1, + maxFrameSize: 16 << 10, // spec default + initialWindowSize: 65535, // spec default + maxConcurrentStreams: 1000, // "infinite", per spec. 1000 seems good enough. + peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead. + streams: make(map[uint32]*clientStream), + singleUse: singleUse, + wantSettingsAck: true, + pings: make(map[[8]byte]chan struct{}), + } + if d := t.idleConnTimeout(); d != 0 { + cc.idleTimeout = d + cc.idleTimer = time.AfterFunc(d, cc.onIdleTimeout) + } + if VerboseLogs { + t.vlogf("http2: Transport creating client conn %p to %v", cc, c.RemoteAddr()) + } + + cc.cond = sync.NewCond(&cc.mu) + cc.flow.add(int32(initialWindowSize)) + + // TODO: adjust this writer size to account for frame size + + // MTU + crypto/tls record padding. + cc.bw = bufio.NewWriter(stickyErrWriter{c, &cc.werr}) + cc.br = bufio.NewReader(c) + cc.fr = NewFramer(cc.bw, cc.br) + cc.fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) + cc.fr.MaxHeaderListSize = t.maxHeaderListSize() + + // TODO: SetMaxDynamicTableSize, SetMaxDynamicTableSizeLimit on + // henc in response to SETTINGS frames? + cc.henc = hpack.NewEncoder(&cc.hbuf) + + if t.AllowHTTP { + cc.nextStreamID = 3 + } + + if cs, ok := c.(connectionStater); ok { + state := cs.ConnectionState() + cc.tlsState = &state + } + + initialSettings := []Setting{ + {ID: SettingEnablePush, Val: 0}, + {ID: SettingInitialWindowSize, Val: transportDefaultStreamFlow}, + } + if max := t.maxHeaderListSize(); max != 0 { + initialSettings = append(initialSettings, Setting{ID: SettingMaxHeaderListSize, Val: max}) + } + + cc.bw.Write(clientPreface) + cc.fr.WriteSettings(initialSettings...) + cc.fr.WriteWindowUpdate(0, transportDefaultConnFlow) + cc.inflow.add(transportDefaultConnFlow + initialWindowSize) + cc.bw.Flush() + if cc.werr != nil { + return nil, cc.werr + } + + go cc.readLoop() + return cc, nil +} + +func (cc *ClientConn) healthCheck() { + pingTimeout := cc.t.pingTimeout() + // We don't need to periodically ping in the health check, because the readLoop of ClientConn will + // trigger the healthCheck again if there is no frame received. + ctx, cancel := context.WithTimeout(context.Background(), pingTimeout) + defer cancel() + err := cc.Ping(ctx) + if err != nil { + cc.closeForLostPing() + cc.t.connPool().MarkDead(cc) + return + } +} + +func (cc *ClientConn) setGoAway(f *GoAwayFrame) { + cc.mu.Lock() + defer cc.mu.Unlock() + + old := cc.goAway + cc.goAway = f + + // Merge the previous and current GoAway error frames. + if cc.goAwayDebug == "" { + cc.goAwayDebug = string(f.DebugData()) + } + if old != nil && old.ErrCode != ErrCodeNo { + cc.goAway.ErrCode = old.ErrCode + } + last := f.LastStreamID + for streamID, cs := range cc.streams { + if streamID > last { + select { + case cs.resc <- resAndError{err: errClientConnGotGoAway}: + default: + } + } + } +} + +// CanTakeNewRequest reports whether the connection can take a new request, +// meaning it has not been closed or received or sent a GOAWAY. +func (cc *ClientConn) CanTakeNewRequest() bool { + cc.mu.Lock() + defer cc.mu.Unlock() + return cc.canTakeNewRequestLocked() +} + +// clientConnIdleState describes the suitability of a client +// connection to initiate a new RoundTrip request. +type clientConnIdleState struct { + canTakeNewRequest bool + freshConn bool // whether it's unused by any previous request +} + +func (cc *ClientConn) idleState() clientConnIdleState { + cc.mu.Lock() + defer cc.mu.Unlock() + return cc.idleStateLocked() +} + +func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) { + if cc.singleUse && cc.nextStreamID > 1 { + return + } + var maxConcurrentOkay bool + if cc.t.StrictMaxConcurrentStreams { + // We'll tell the caller we can take a new request to + // prevent the caller from dialing a new TCP + // connection, but then we'll block later before + // writing it. + maxConcurrentOkay = true + } else { + maxConcurrentOkay = int64(len(cc.streams)+1) < int64(cc.maxConcurrentStreams) + } + + st.canTakeNewRequest = cc.goAway == nil && !cc.closed && !cc.closing && maxConcurrentOkay && + int64(cc.nextStreamID)+2*int64(cc.pendingRequests) < math.MaxInt32 && + !cc.tooIdleLocked() + st.freshConn = cc.nextStreamID == 1 && st.canTakeNewRequest + return +} + +func (cc *ClientConn) canTakeNewRequestLocked() bool { + st := cc.idleStateLocked() + return st.canTakeNewRequest +} + +// tooIdleLocked reports whether this connection has been been sitting idle +// for too much wall time. +func (cc *ClientConn) tooIdleLocked() bool { + // The Round(0) strips the monontonic clock reading so the + // times are compared based on their wall time. We don't want + // to reuse a connection that's been sitting idle during + // VM/laptop suspend if monotonic time was also frozen. + return cc.idleTimeout != 0 && !cc.lastIdle.IsZero() && time.Since(cc.lastIdle.Round(0)) > cc.idleTimeout +} + +// onIdleTimeout is called from a time.AfterFunc goroutine. It will +// only be called when we're idle, but because we're coming from a new +// goroutine, there could be a new request coming in at the same time, +// so this simply calls the synchronized closeIfIdle to shut down this +// connection. The timer could just call closeIfIdle, but this is more +// clear. +func (cc *ClientConn) onIdleTimeout() { + cc.closeIfIdle() +} + +func (cc *ClientConn) closeIfIdle() { + cc.mu.Lock() + if len(cc.streams) > 0 { + cc.mu.Unlock() + return + } + cc.closed = true + nextID := cc.nextStreamID + // TODO: do clients send GOAWAY too? maybe? Just Close: + cc.mu.Unlock() + + if VerboseLogs { + cc.vlogf("http2: Transport closing idle conn %p (forSingleUse=%v, maxStream=%v)", cc, cc.singleUse, nextID-2) + } + cc.tconn.Close() +} + +var shutdownEnterWaitStateHook = func() {} + +// Shutdown gracefully close the client connection, waiting for running streams to complete. +func (cc *ClientConn) Shutdown(ctx context.Context) error { + if err := cc.sendGoAway(); err != nil { + return err + } + // Wait for all in-flight streams to complete or connection to close + done := make(chan error, 1) + cancelled := false // guarded by cc.mu + go func() { + cc.mu.Lock() + defer cc.mu.Unlock() + for { + if len(cc.streams) == 0 || cc.closed { + cc.closed = true + done <- cc.tconn.Close() + break + } + if cancelled { + break + } + cc.cond.Wait() + } + }() + shutdownEnterWaitStateHook() + select { + case err := <-done: + return err + case <-ctx.Done(): + cc.mu.Lock() + // Free the goroutine above + cancelled = true + cc.cond.Broadcast() + cc.mu.Unlock() + return ctx.Err() + } +} + +func (cc *ClientConn) sendGoAway() error { + cc.mu.Lock() + defer cc.mu.Unlock() + cc.wmu.Lock() + defer cc.wmu.Unlock() + if cc.closing { + // GOAWAY sent already + return nil + } + // Send a graceful shutdown frame to server + maxStreamID := cc.nextStreamID + if err := cc.fr.WriteGoAway(maxStreamID, ErrCodeNo, nil); err != nil { + return err + } + if err := cc.bw.Flush(); err != nil { + return err + } + // Prevent new requests + cc.closing = true + return nil +} + +// closes the client connection immediately. In-flight requests are interrupted. +// err is sent to streams. +func (cc *ClientConn) closeForError(err error) error { + cc.mu.Lock() + defer cc.cond.Broadcast() + defer cc.mu.Unlock() + for id, cs := range cc.streams { + select { + case cs.resc <- resAndError{err: err}: + default: + } + cs.bufPipe.CloseWithError(err) + delete(cc.streams, id) + } + cc.closed = true + return cc.tconn.Close() +} + +// Close closes the client connection immediately. +// +// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead. +func (cc *ClientConn) Close() error { + err := errors.New("http2: client connection force closed via ClientConn.Close") + return cc.closeForError(err) +} + +// closes the client connection immediately. In-flight requests are interrupted. +func (cc *ClientConn) closeForLostPing() error { + err := errors.New("http2: client connection lost") + return cc.closeForError(err) +} + +const maxAllocFrameSize = 512 << 10 + +// frameBuffer returns a scratch buffer suitable for writing DATA frames. +// They're capped at the min of the peer's max frame size or 512KB +// (kinda arbitrarily), but definitely capped so we don't allocate 4GB +// bufers. +func (cc *ClientConn) frameScratchBuffer() []byte { + cc.mu.Lock() + size := cc.maxFrameSize + if size > maxAllocFrameSize { + size = maxAllocFrameSize + } + for i, buf := range cc.freeBuf { + if len(buf) >= int(size) { + cc.freeBuf[i] = nil + cc.mu.Unlock() + return buf[:size] + } + } + cc.mu.Unlock() + return make([]byte, size) +} + +func (cc *ClientConn) putFrameScratchBuffer(buf []byte) { + cc.mu.Lock() + defer cc.mu.Unlock() + const maxBufs = 4 // arbitrary; 4 concurrent requests per conn? investigate. + if len(cc.freeBuf) < maxBufs { + cc.freeBuf = append(cc.freeBuf, buf) + return + } + for i, old := range cc.freeBuf { + if old == nil { + cc.freeBuf[i] = buf + return + } + } + // forget about it. +} + +// errRequestCanceled is a copy of net/http's errRequestCanceled because it's not +// exported. At least they'll be DeepEqual for h1-vs-h2 comparisons tests. +var errRequestCanceled = errors.New("net/http: request canceled") + +func commaSeparatedTrailers(req *http.Request) (string, error) { + keys := make([]string, 0, len(req.Trailer)) + for k := range req.Trailer { + k = http.CanonicalHeaderKey(k) + switch k { + case "Transfer-Encoding", "Trailer", "Content-Length": + return "", fmt.Errorf("invalid Trailer key %q", k) + } + keys = append(keys, k) + } + if len(keys) > 0 { + sort.Strings(keys) + return strings.Join(keys, ","), nil + } + return "", nil +} + +func (cc *ClientConn) responseHeaderTimeout() time.Duration { + if cc.t.t1 != nil { + return cc.t.t1.ResponseHeaderTimeout + } + // No way to do this (yet?) with just an http2.Transport. Probably + // no need. Request.Cancel this is the new way. We only need to support + // this for compatibility with the old http.Transport fields when + // we're doing transparent http2. + return 0 +} + +// checkConnHeaders checks whether req has any invalid connection-level headers. +// per RFC 7540 section 8.1.2.2: Connection-Specific Header Fields. +// Certain headers are special-cased as okay but not transmitted later. +func checkConnHeaders(req *http.Request) error { + if v := req.Header.Get("Upgrade"); v != "" { + return fmt.Errorf("http2: invalid Upgrade request header: %q", req.Header["Upgrade"]) + } + if vv := req.Header["Transfer-Encoding"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "chunked") { + return fmt.Errorf("http2: invalid Transfer-Encoding request header: %q", vv) + } + if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && !strings.EqualFold(vv[0], "close") && !strings.EqualFold(vv[0], "keep-alive")) { + return fmt.Errorf("http2: invalid Connection request header: %q", vv) + } + return nil +} + +// actualContentLength returns a sanitized version of +// req.ContentLength, where 0 actually means zero (not unknown) and -1 +// means unknown. +func actualContentLength(req *http.Request) int64 { + if req.Body == nil || req.Body == http.NoBody { + return 0 + } + if req.ContentLength != 0 { + return req.ContentLength + } + return -1 +} + +func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { + resp, _, err := cc.roundTrip(req) + return resp, err +} + +func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAfterReqBodyWrite bool, err error) { + if err := checkConnHeaders(req); err != nil { + return nil, false, err + } + if cc.idleTimer != nil { + cc.idleTimer.Stop() + } + + trailers, err := commaSeparatedTrailers(req) + if err != nil { + return nil, false, err + } + hasTrailers := trailers != "" + + cc.mu.Lock() + if err := cc.awaitOpenSlotForRequest(req); err != nil { + cc.mu.Unlock() + return nil, false, err + } + + body := req.Body + contentLen := actualContentLength(req) + hasBody := contentLen != 0 + + // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere? + var requestedGzip bool + if !cc.t.disableCompression() && + req.Header.Get("Accept-Encoding") == "" && + req.Header.Get("Range") == "" && + req.Method != "HEAD" { + // Request gzip only, not deflate. Deflate is ambiguous and + // not as universally supported anyway. + // See: https://zlib.net/zlib_faq.html#faq39 + // + // Note that we don't request this for HEAD requests, + // due to a bug in nginx: + // http://trac.nginx.org/nginx/ticket/358 + // https://golang.org/issue/5522 + // + // We don't request gzip if the request is for a range, since + // auto-decoding a portion of a gzipped document will just fail + // anyway. See https://golang.org/issue/8923 + requestedGzip = true + } + + // we send: HEADERS{1}, CONTINUATION{0,} + DATA{0,} (DATA is + // sent by writeRequestBody below, along with any Trailers, + // again in form HEADERS{1}, CONTINUATION{0,}) + hdrs, err := cc.encodeHeaders(req, requestedGzip, trailers, contentLen) + if err != nil { + cc.mu.Unlock() + return nil, false, err + } + + cs := cc.newStream() + cs.req = req + cs.trace = httptrace.ContextClientTrace(req.Context()) + cs.requestedGzip = requestedGzip + bodyWriter := cc.t.getBodyWriterState(cs, body) + cs.on100 = bodyWriter.on100 + + cc.wmu.Lock() + endStream := !hasBody && !hasTrailers + werr := cc.writeHeaders(cs.ID, endStream, int(cc.maxFrameSize), hdrs) + cc.wmu.Unlock() + traceWroteHeaders(cs.trace) + cc.mu.Unlock() + + if werr != nil { + if hasBody { + req.Body.Close() // per RoundTripper contract + bodyWriter.cancel() + } + cc.forgetStreamID(cs.ID) + // Don't bother sending a RST_STREAM (our write already failed; + // no need to keep writing) + traceWroteRequest(cs.trace, werr) + return nil, false, werr + } + + var respHeaderTimer <-chan time.Time + if hasBody { + bodyWriter.scheduleBodyWrite() + } else { + traceWroteRequest(cs.trace, nil) + if d := cc.responseHeaderTimeout(); d != 0 { + timer := time.NewTimer(d) + defer timer.Stop() + respHeaderTimer = timer.C + } + } + + readLoopResCh := cs.resc + bodyWritten := false + ctx := req.Context() + + handleReadLoopResponse := func(re resAndError) (*http.Response, bool, error) { + res := re.res + if re.err != nil || res.StatusCode > 299 { + // On error or status code 3xx, 4xx, 5xx, etc abort any + // ongoing write, assuming that the server doesn't care + // about our request body. If the server replied with 1xx or + // 2xx, however, then assume the server DOES potentially + // want our body (e.g. full-duplex streaming: + // golang.org/issue/13444). If it turns out the server + // doesn't, they'll RST_STREAM us soon enough. This is a + // heuristic to avoid adding knobs to Transport. Hopefully + // we can keep it. + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWrite) + } + if re.err != nil { + cc.forgetStreamID(cs.ID) + return nil, cs.getStartedWrite(), re.err + } + res.Request = req + res.TLS = cc.tlsState + return res, false, nil + } + + for { + select { + case re := <-readLoopResCh: + return handleReadLoopResponse(re) + case <-respHeaderTimer: + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + cc.forgetStreamID(cs.ID) + return nil, cs.getStartedWrite(), errTimeout + case <-ctx.Done(): + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + cc.forgetStreamID(cs.ID) + return nil, cs.getStartedWrite(), ctx.Err() + case <-req.Cancel: + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + bodyWriter.cancel() + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + cc.forgetStreamID(cs.ID) + return nil, cs.getStartedWrite(), errRequestCanceled + case <-cs.peerReset: + // processResetStream already removed the + // stream from the streams map; no need for + // forgetStreamID. + return nil, cs.getStartedWrite(), cs.resetErr + case err := <-bodyWriter.resc: + // Prefer the read loop's response, if available. Issue 16102. + select { + case re := <-readLoopResCh: + return handleReadLoopResponse(re) + default: + } + if err != nil { + cc.forgetStreamID(cs.ID) + return nil, cs.getStartedWrite(), err + } + bodyWritten = true + if d := cc.responseHeaderTimeout(); d != 0 { + timer := time.NewTimer(d) + defer timer.Stop() + respHeaderTimer = timer.C + } + } + } +} + +// awaitOpenSlotForRequest waits until len(streams) < maxConcurrentStreams. +// Must hold cc.mu. +func (cc *ClientConn) awaitOpenSlotForRequest(req *http.Request) error { + var waitingForConn chan struct{} + var waitingForConnErr error // guarded by cc.mu + for { + cc.lastActive = time.Now() + if cc.closed || !cc.canTakeNewRequestLocked() { + if waitingForConn != nil { + close(waitingForConn) + } + return errClientConnUnusable + } + cc.lastIdle = time.Time{} + if int64(len(cc.streams))+1 <= int64(cc.maxConcurrentStreams) { + if waitingForConn != nil { + close(waitingForConn) + } + return nil + } + // Unfortunately, we cannot wait on a condition variable and channel at + // the same time, so instead, we spin up a goroutine to check if the + // request is canceled while we wait for a slot to open in the connection. + if waitingForConn == nil { + waitingForConn = make(chan struct{}) + go func() { + if err := awaitRequestCancel(req, waitingForConn); err != nil { + cc.mu.Lock() + waitingForConnErr = err + cc.cond.Broadcast() + cc.mu.Unlock() + } + }() + } + cc.pendingRequests++ + cc.cond.Wait() + cc.pendingRequests-- + if waitingForConnErr != nil { + return waitingForConnErr + } + } +} + +// requires cc.wmu be held +func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, maxFrameSize int, hdrs []byte) error { + first := true // first frame written (HEADERS is first, then CONTINUATION) + for len(hdrs) > 0 && cc.werr == nil { + chunk := hdrs + if len(chunk) > maxFrameSize { + chunk = chunk[:maxFrameSize] + } + hdrs = hdrs[len(chunk):] + endHeaders := len(hdrs) == 0 + if first { + cc.fr.WriteHeaders(HeadersFrameParam{ + StreamID: streamID, + BlockFragment: chunk, + EndStream: endStream, + EndHeaders: endHeaders, + }) + first = false + } else { + cc.fr.WriteContinuation(streamID, endHeaders, chunk) + } + } + // TODO(bradfitz): this Flush could potentially block (as + // could the WriteHeaders call(s) above), which means they + // wouldn't respond to Request.Cancel being readable. That's + // rare, but this should probably be in a goroutine. + cc.bw.Flush() + return cc.werr +} + +// internal error values; they don't escape to callers +var ( + // abort request body write; don't send cancel + errStopReqBodyWrite = errors.New("http2: aborting request body write") + + // abort request body write, but send stream reset of cancel. + errStopReqBodyWriteAndCancel = errors.New("http2: canceling request") + + errReqBodyTooLong = errors.New("http2: request body larger than specified content length") +) + +func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) { + cc := cs.cc + sentEnd := false // whether we sent the final DATA frame w/ END_STREAM + buf := cc.frameScratchBuffer() + defer cc.putFrameScratchBuffer(buf) + + defer func() { + traceWroteRequest(cs.trace, err) + // TODO: write h12Compare test showing whether + // Request.Body is closed by the Transport, + // and in multiple cases: server replies <=299 and >299 + // while still writing request body + cerr := bodyCloser.Close() + if err == nil { + err = cerr + } + }() + + req := cs.req + hasTrailers := req.Trailer != nil + remainLen := actualContentLength(req) + hasContentLen := remainLen != -1 + + var sawEOF bool + for !sawEOF { + n, err := body.Read(buf[:len(buf)-1]) + if hasContentLen { + remainLen -= int64(n) + if remainLen == 0 && err == nil { + // The request body's Content-Length was predeclared and + // we just finished reading it all, but the underlying io.Reader + // returned the final chunk with a nil error (which is one of + // the two valid things a Reader can do at EOF). Because we'd prefer + // to send the END_STREAM bit early, double-check that we're actually + // at EOF. Subsequent reads should return (0, EOF) at this point. + // If either value is different, we return an error in one of two ways below. + var n1 int + n1, err = body.Read(buf[n:]) + remainLen -= int64(n1) + } + if remainLen < 0 { + err = errReqBodyTooLong + cc.writeStreamReset(cs.ID, ErrCodeCancel, err) + return err + } + } + if err == io.EOF { + sawEOF = true + err = nil + } else if err != nil { + cc.writeStreamReset(cs.ID, ErrCodeCancel, err) + return err + } + + remain := buf[:n] + for len(remain) > 0 && err == nil { + var allowed int32 + allowed, err = cs.awaitFlowControl(len(remain)) + switch { + case err == errStopReqBodyWrite: + return err + case err == errStopReqBodyWriteAndCancel: + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + return err + case err != nil: + return err + } + cc.wmu.Lock() + data := remain[:allowed] + remain = remain[allowed:] + sentEnd = sawEOF && len(remain) == 0 && !hasTrailers + err = cc.fr.WriteData(cs.ID, sentEnd, data) + if err == nil { + // TODO(bradfitz): this flush is for latency, not bandwidth. + // Most requests won't need this. Make this opt-in or + // opt-out? Use some heuristic on the body type? Nagel-like + // timers? Based on 'n'? Only last chunk of this for loop, + // unless flow control tokens are low? For now, always. + // If we change this, see comment below. + err = cc.bw.Flush() + } + cc.wmu.Unlock() + } + if err != nil { + return err + } + } + + if sentEnd { + // Already sent END_STREAM (which implies we have no + // trailers) and flushed, because currently all + // WriteData frames above get a flush. So we're done. + return nil + } + + var trls []byte + if hasTrailers { + cc.mu.Lock() + trls, err = cc.encodeTrailers(req) + cc.mu.Unlock() + if err != nil { + cc.writeStreamReset(cs.ID, ErrCodeInternal, err) + cc.forgetStreamID(cs.ID) + return err + } + } + + cc.mu.Lock() + maxFrameSize := int(cc.maxFrameSize) + cc.mu.Unlock() + + cc.wmu.Lock() + defer cc.wmu.Unlock() + + // Two ways to send END_STREAM: either with trailers, or + // with an empty DATA frame. + if len(trls) > 0 { + err = cc.writeHeaders(cs.ID, true, maxFrameSize, trls) + } else { + err = cc.fr.WriteData(cs.ID, true, nil) + } + if ferr := cc.bw.Flush(); ferr != nil && err == nil { + err = ferr + } + return err +} + +// awaitFlowControl waits for [1, min(maxBytes, cc.cs.maxFrameSize)] flow +// control tokens from the server. +// It returns either the non-zero number of tokens taken or an error +// if the stream is dead. +func (cs *clientStream) awaitFlowControl(maxBytes int) (taken int32, err error) { + cc := cs.cc + cc.mu.Lock() + defer cc.mu.Unlock() + for { + if cc.closed { + return 0, errClientConnClosed + } + if cs.stopReqBody != nil { + return 0, cs.stopReqBody + } + if err := cs.checkResetOrDone(); err != nil { + return 0, err + } + if a := cs.flow.available(); a > 0 { + take := a + if int(take) > maxBytes { + + take = int32(maxBytes) // can't truncate int; take is int32 + } + if take > int32(cc.maxFrameSize) { + take = int32(cc.maxFrameSize) + } + cs.flow.take(take) + return take, nil + } + cc.cond.Wait() + } +} + +// requires cc.mu be held. +func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) { + cc.hbuf.Reset() + + host := req.Host + if host == "" { + host = req.URL.Host + } + host, err := httpguts.PunycodeHostPort(host) + if err != nil { + return nil, err + } + + var path string + if req.Method != "CONNECT" { + path = req.URL.RequestURI() + if !validPseudoPath(path) { + orig := path + path = strings.TrimPrefix(path, req.URL.Scheme+"://"+host) + if !validPseudoPath(path) { + if req.URL.Opaque != "" { + return nil, fmt.Errorf("invalid request :path %q from URL.Opaque = %q", orig, req.URL.Opaque) + } else { + return nil, fmt.Errorf("invalid request :path %q", orig) + } + } + } + } + + // Check for any invalid headers and return an error before we + // potentially pollute our hpack state. (We want to be able to + // continue to reuse the hpack encoder for future requests) + for k, vv := range req.Header { + if !httpguts.ValidHeaderFieldName(k) { + return nil, fmt.Errorf("invalid HTTP header name %q", k) + } + for _, v := range vv { + if !httpguts.ValidHeaderFieldValue(v) { + return nil, fmt.Errorf("invalid HTTP header value %q for header %q", v, k) + } + } + } + + enumerateHeaders := func(f func(name, value string)) { + // 8.1.2.3 Request Pseudo-Header Fields + // The :path pseudo-header field includes the path and query parts of the + // target URI (the path-absolute production and optionally a '?' character + // followed by the query production (see Sections 3.3 and 3.4 of + // [RFC3986]). + f(":authority", host) + m := req.Method + if m == "" { + m = http.MethodGet + } + f(":method", m) + if req.Method != "CONNECT" { + f(":path", path) + f(":scheme", req.URL.Scheme) + } + if trailers != "" { + f("trailer", trailers) + } + + var didUA bool + for k, vv := range req.Header { + if strings.EqualFold(k, "host") || strings.EqualFold(k, "content-length") { + // Host is :authority, already sent. + // Content-Length is automatic, set below. + continue + } else if strings.EqualFold(k, "connection") || strings.EqualFold(k, "proxy-connection") || + strings.EqualFold(k, "transfer-encoding") || strings.EqualFold(k, "upgrade") || + strings.EqualFold(k, "keep-alive") { + // Per 8.1.2.2 Connection-Specific Header + // Fields, don't send connection-specific + // fields. We have already checked if any + // are error-worthy so just ignore the rest. + continue + } else if strings.EqualFold(k, "user-agent") { + // Match Go's http1 behavior: at most one + // User-Agent. If set to nil or empty string, + // then omit it. Otherwise if not mentioned, + // include the default (below). + didUA = true + if len(vv) < 1 { + continue + } + vv = vv[:1] + if vv[0] == "" { + continue + } + } else if strings.EqualFold(k, "cookie") { + // Per 8.1.2.5 To allow for better compression efficiency, the + // Cookie header field MAY be split into separate header fields, + // each with one or more cookie-pairs. + for _, v := range vv { + for { + p := strings.IndexByte(v, ';') + if p < 0 { + break + } + f("cookie", v[:p]) + p++ + // strip space after semicolon if any. + for p+1 <= len(v) && v[p] == ' ' { + p++ + } + v = v[p:] + } + if len(v) > 0 { + f("cookie", v) + } + } + continue + } + + for _, v := range vv { + f(k, v) + } + } + if shouldSendReqContentLength(req.Method, contentLength) { + f("content-length", strconv.FormatInt(contentLength, 10)) + } + if addGzipHeader { + f("accept-encoding", "gzip") + } + if !didUA { + f("user-agent", defaultUserAgent) + } + } + + // Do a first pass over the headers counting bytes to ensure + // we don't exceed cc.peerMaxHeaderListSize. This is done as a + // separate pass before encoding the headers to prevent + // modifying the hpack state. + hlSize := uint64(0) + enumerateHeaders(func(name, value string) { + hf := hpack.HeaderField{Name: name, Value: value} + hlSize += uint64(hf.Size()) + }) + + if hlSize > cc.peerMaxHeaderListSize { + return nil, errRequestHeaderListSize + } + + trace := httptrace.ContextClientTrace(req.Context()) + traceHeaders := traceHasWroteHeaderField(trace) + + // Header list size is ok. Write the headers. + enumerateHeaders(func(name, value string) { + name = strings.ToLower(name) + cc.writeHeader(name, value) + if traceHeaders { + traceWroteHeaderField(trace, name, value) + } + }) + + return cc.hbuf.Bytes(), nil +} + +// shouldSendReqContentLength reports whether the http2.Transport should send +// a "content-length" request header. This logic is basically a copy of the net/http +// transferWriter.shouldSendContentLength. +// The contentLength is the corrected contentLength (so 0 means actually 0, not unknown). +// -1 means unknown. +func shouldSendReqContentLength(method string, contentLength int64) bool { + if contentLength > 0 { + return true + } + if contentLength < 0 { + return false + } + // For zero bodies, whether we send a content-length depends on the method. + // It also kinda doesn't matter for http2 either way, with END_STREAM. + switch method { + case "POST", "PUT", "PATCH": + return true + default: + return false + } +} + +// requires cc.mu be held. +func (cc *ClientConn) encodeTrailers(req *http.Request) ([]byte, error) { + cc.hbuf.Reset() + + hlSize := uint64(0) + for k, vv := range req.Trailer { + for _, v := range vv { + hf := hpack.HeaderField{Name: k, Value: v} + hlSize += uint64(hf.Size()) + } + } + if hlSize > cc.peerMaxHeaderListSize { + return nil, errRequestHeaderListSize + } + + for k, vv := range req.Trailer { + // Transfer-Encoding, etc.. have already been filtered at the + // start of RoundTrip + lowKey := strings.ToLower(k) + for _, v := range vv { + cc.writeHeader(lowKey, v) + } + } + return cc.hbuf.Bytes(), nil +} + +func (cc *ClientConn) writeHeader(name, value string) { + if VerboseLogs { + log.Printf("http2: Transport encoding header %q = %q", name, value) + } + cc.henc.WriteField(hpack.HeaderField{Name: name, Value: value}) +} + +type resAndError struct { + _ incomparable + res *http.Response + err error +} + +// requires cc.mu be held. +func (cc *ClientConn) newStream() *clientStream { + cs := &clientStream{ + cc: cc, + ID: cc.nextStreamID, + resc: make(chan resAndError, 1), + peerReset: make(chan struct{}), + done: make(chan struct{}), + } + cs.flow.add(int32(cc.initialWindowSize)) + cs.flow.setConnFlow(&cc.flow) + cs.inflow.add(transportDefaultStreamFlow) + cs.inflow.setConnFlow(&cc.inflow) + cc.nextStreamID += 2 + cc.streams[cs.ID] = cs + return cs +} + +func (cc *ClientConn) forgetStreamID(id uint32) { + cc.streamByID(id, true) +} + +func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream { + cc.mu.Lock() + defer cc.mu.Unlock() + cs := cc.streams[id] + if andRemove && cs != nil && !cc.closed { + cc.lastActive = time.Now() + delete(cc.streams, id) + if len(cc.streams) == 0 && cc.idleTimer != nil { + cc.idleTimer.Reset(cc.idleTimeout) + cc.lastIdle = time.Now() + } + close(cs.done) + // Wake up checkResetOrDone via clientStream.awaitFlowControl and + // wake up RoundTrip if there is a pending request. + cc.cond.Broadcast() + } + return cs +} + +// clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop. +type clientConnReadLoop struct { + _ incomparable + cc *ClientConn + closeWhenIdle bool +} + +// readLoop runs in its own goroutine and reads and dispatches frames. +func (cc *ClientConn) readLoop() { + rl := &clientConnReadLoop{cc: cc} + defer rl.cleanup() + cc.readerErr = rl.run() + if ce, ok := cc.readerErr.(ConnectionError); ok { + cc.wmu.Lock() + cc.fr.WriteGoAway(0, ErrCode(ce), nil) + cc.wmu.Unlock() + } +} + +// GoAwayError is returned by the Transport when the server closes the +// TCP connection after sending a GOAWAY frame. +type GoAwayError struct { + LastStreamID uint32 + ErrCode ErrCode + DebugData string +} + +func (e GoAwayError) Error() string { + return fmt.Sprintf("http2: server sent GOAWAY and closed the connection; LastStreamID=%v, ErrCode=%v, debug=%q", + e.LastStreamID, e.ErrCode, e.DebugData) +} + +func isEOFOrNetReadError(err error) bool { + if err == io.EOF { + return true + } + ne, ok := err.(*net.OpError) + return ok && ne.Op == "read" +} + +func (rl *clientConnReadLoop) cleanup() { + cc := rl.cc + defer cc.tconn.Close() + defer cc.t.connPool().MarkDead(cc) + defer close(cc.readerDone) + + if cc.idleTimer != nil { + cc.idleTimer.Stop() + } + + // Close any response bodies if the server closes prematurely. + // TODO: also do this if we've written the headers but not + // gotten a response yet. + err := cc.readerErr + cc.mu.Lock() + if cc.goAway != nil && isEOFOrNetReadError(err) { + err = GoAwayError{ + LastStreamID: cc.goAway.LastStreamID, + ErrCode: cc.goAway.ErrCode, + DebugData: cc.goAwayDebug, + } + } else if err == io.EOF { + err = io.ErrUnexpectedEOF + } + for _, cs := range cc.streams { + cs.bufPipe.CloseWithError(err) // no-op if already closed + select { + case cs.resc <- resAndError{err: err}: + default: + } + close(cs.done) + } + cc.closed = true + cc.cond.Broadcast() + cc.mu.Unlock() +} + +func (rl *clientConnReadLoop) run() error { + cc := rl.cc + rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse + gotReply := false // ever saw a HEADERS reply + gotSettings := false + readIdleTimeout := cc.t.ReadIdleTimeout + var t *time.Timer + if readIdleTimeout != 0 { + t = time.AfterFunc(readIdleTimeout, cc.healthCheck) + defer t.Stop() + } + for { + f, err := cc.fr.ReadFrame() + if t != nil { + t.Reset(readIdleTimeout) + } + if err != nil { + cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err) + } + if se, ok := err.(StreamError); ok { + if cs := cc.streamByID(se.StreamID, false); cs != nil { + cs.cc.writeStreamReset(cs.ID, se.Code, err) + cs.cc.forgetStreamID(cs.ID) + if se.Cause == nil { + se.Cause = cc.fr.errDetail + } + rl.endStreamError(cs, se) + } + continue + } else if err != nil { + return err + } + if VerboseLogs { + cc.vlogf("http2: Transport received %s", summarizeFrame(f)) + } + if !gotSettings { + if _, ok := f.(*SettingsFrame); !ok { + cc.logf("protocol error: received %T before a SETTINGS frame", f) + return ConnectionError(ErrCodeProtocol) + } + gotSettings = true + } + maybeIdle := false // whether frame might transition us to idle + + switch f := f.(type) { + case *MetaHeadersFrame: + err = rl.processHeaders(f) + maybeIdle = true + gotReply = true + case *DataFrame: + err = rl.processData(f) + maybeIdle = true + case *GoAwayFrame: + err = rl.processGoAway(f) + maybeIdle = true + case *RSTStreamFrame: + err = rl.processResetStream(f) + maybeIdle = true + case *SettingsFrame: + err = rl.processSettings(f) + case *PushPromiseFrame: + err = rl.processPushPromise(f) + case *WindowUpdateFrame: + err = rl.processWindowUpdate(f) + case *PingFrame: + err = rl.processPing(f) + default: + cc.logf("Transport: unhandled response frame type %T", f) + } + if err != nil { + if VerboseLogs { + cc.vlogf("http2: Transport conn %p received error from processing frame %v: %v", cc, summarizeFrame(f), err) + } + return err + } + if rl.closeWhenIdle && gotReply && maybeIdle { + cc.closeIfIdle() + } + } +} + +func (rl *clientConnReadLoop) processHeaders(f *MetaHeadersFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, false) + if cs == nil { + // We'd get here if we canceled a request while the + // server had its response still in flight. So if this + // was just something we canceled, ignore it. + return nil + } + if f.StreamEnded() { + // Issue 20521: If the stream has ended, streamByID() causes + // clientStream.done to be closed, which causes the request's bodyWriter + // to be closed with an errStreamClosed, which may be received by + // clientConn.RoundTrip before the result of processing these headers. + // Deferring stream closure allows the header processing to occur first. + // clientConn.RoundTrip may still receive the bodyWriter error first, but + // the fix for issue 16102 prioritises any response. + // + // Issue 22413: If there is no request body, we should close the + // stream before writing to cs.resc so that the stream is closed + // immediately once RoundTrip returns. + if cs.req.Body != nil { + defer cc.forgetStreamID(f.StreamID) + } else { + cc.forgetStreamID(f.StreamID) + } + } + if !cs.firstByte { + if cs.trace != nil { + // TODO(bradfitz): move first response byte earlier, + // when we first read the 9 byte header, not waiting + // until all the HEADERS+CONTINUATION frames have been + // merged. This works for now. + traceFirstResponseByte(cs.trace) + } + cs.firstByte = true + } + if !cs.pastHeaders { + cs.pastHeaders = true + } else { + return rl.processTrailers(cs, f) + } + + res, err := rl.handleResponse(cs, f) + if err != nil { + if _, ok := err.(ConnectionError); ok { + return err + } + // Any other error type is a stream error. + cs.cc.writeStreamReset(f.StreamID, ErrCodeProtocol, err) + cc.forgetStreamID(cs.ID) + cs.resc <- resAndError{err: err} + return nil // return nil from process* funcs to keep conn alive + } + if res == nil { + // (nil, nil) special case. See handleResponse docs. + return nil + } + cs.resTrailer = &res.Trailer + cs.resc <- resAndError{res: res} + return nil +} + +// may return error types nil, or ConnectionError. Any other error value +// is a StreamError of type ErrCodeProtocol. The returned error in that case +// is the detail. +// +// As a special case, handleResponse may return (nil, nil) to skip the +// frame (currently only used for 1xx responses). +func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFrame) (*http.Response, error) { + if f.Truncated { + return nil, errResponseHeaderListSize + } + + status := f.PseudoValue("status") + if status == "" { + return nil, errors.New("malformed response from server: missing status pseudo header") + } + statusCode, err := strconv.Atoi(status) + if err != nil { + return nil, errors.New("malformed response from server: malformed non-numeric status pseudo header") + } + + regularFields := f.RegularFields() + strs := make([]string, len(regularFields)) + header := make(http.Header, len(regularFields)) + res := &http.Response{ + Proto: "HTTP/2.0", + ProtoMajor: 2, + Header: header, + StatusCode: statusCode, + Status: status + " " + http.StatusText(statusCode), + } + for _, hf := range regularFields { + key := http.CanonicalHeaderKey(hf.Name) + if key == "Trailer" { + t := res.Trailer + if t == nil { + t = make(http.Header) + res.Trailer = t + } + foreachHeaderElement(hf.Value, func(v string) { + t[http.CanonicalHeaderKey(v)] = nil + }) + } else { + vv := header[key] + if vv == nil && len(strs) > 0 { + // More than likely this will be a single-element key. + // Most headers aren't multi-valued. + // Set the capacity on strs[0] to 1, so any future append + // won't extend the slice into the other strings. + vv, strs = strs[:1:1], strs[1:] + vv[0] = hf.Value + header[key] = vv + } else { + header[key] = append(vv, hf.Value) + } + } + } + + if statusCode >= 100 && statusCode <= 199 { + cs.num1xx++ + const max1xxResponses = 5 // arbitrary bound on number of informational responses, same as net/http + if cs.num1xx > max1xxResponses { + return nil, errors.New("http2: too many 1xx informational responses") + } + if fn := cs.get1xxTraceFunc(); fn != nil { + if err := fn(statusCode, textproto.MIMEHeader(header)); err != nil { + return nil, err + } + } + if statusCode == 100 { + traceGot100Continue(cs.trace) + if cs.on100 != nil { + cs.on100() // forces any write delay timer to fire + } + } + cs.pastHeaders = false // do it all again + return nil, nil + } + + streamEnded := f.StreamEnded() + isHead := cs.req.Method == "HEAD" + if !streamEnded || isHead { + res.ContentLength = -1 + if clens := res.Header["Content-Length"]; len(clens) == 1 { + if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil { + res.ContentLength = clen64 + } else { + // TODO: care? unlike http/1, it won't mess up our framing, so it's + // more safe smuggling-wise to ignore. + } + } else if len(clens) > 1 { + // TODO: care? unlike http/1, it won't mess up our framing, so it's + // more safe smuggling-wise to ignore. + } + } + + if streamEnded || isHead { + res.Body = noBody + return res, nil + } + + cs.bufPipe = pipe{b: &dataBuffer{expected: res.ContentLength}} + cs.bytesRemain = res.ContentLength + res.Body = transportResponseBody{cs} + go cs.awaitRequestCancel(cs.req) + + if cs.requestedGzip && res.Header.Get("Content-Encoding") == "gzip" { + res.Header.Del("Content-Encoding") + res.Header.Del("Content-Length") + res.ContentLength = -1 + res.Body = &gzipReader{body: res.Body} + res.Uncompressed = true + } + return res, nil +} + +func (rl *clientConnReadLoop) processTrailers(cs *clientStream, f *MetaHeadersFrame) error { + if cs.pastTrailers { + // Too many HEADERS frames for this stream. + return ConnectionError(ErrCodeProtocol) + } + cs.pastTrailers = true + if !f.StreamEnded() { + // We expect that any headers for trailers also + // has END_STREAM. + return ConnectionError(ErrCodeProtocol) + } + if len(f.PseudoFields()) > 0 { + // No pseudo header fields are defined for trailers. + // TODO: ConnectionError might be overly harsh? Check. + return ConnectionError(ErrCodeProtocol) + } + + trailer := make(http.Header) + for _, hf := range f.RegularFields() { + key := http.CanonicalHeaderKey(hf.Name) + trailer[key] = append(trailer[key], hf.Value) + } + cs.trailer = trailer + + rl.endStream(cs) + return nil +} + +// transportResponseBody is the concrete type of Transport.RoundTrip's +// Response.Body. It is an io.ReadCloser. On Read, it reads from cs.body. +// On Close it sends RST_STREAM if EOF wasn't already seen. +type transportResponseBody struct { + cs *clientStream +} + +func (b transportResponseBody) Read(p []byte) (n int, err error) { + cs := b.cs + cc := cs.cc + + if cs.readErr != nil { + return 0, cs.readErr + } + n, err = b.cs.bufPipe.Read(p) + if cs.bytesRemain != -1 { + if int64(n) > cs.bytesRemain { + n = int(cs.bytesRemain) + if err == nil { + err = errors.New("net/http: server replied with more than declared Content-Length; truncated") + cc.writeStreamReset(cs.ID, ErrCodeProtocol, err) + } + cs.readErr = err + return int(cs.bytesRemain), err + } + cs.bytesRemain -= int64(n) + if err == io.EOF && cs.bytesRemain > 0 { + err = io.ErrUnexpectedEOF + cs.readErr = err + return n, err + } + } + if n == 0 { + // No flow control tokens to send back. + return + } + + cc.mu.Lock() + defer cc.mu.Unlock() + + var connAdd, streamAdd int32 + // Check the conn-level first, before the stream-level. + if v := cc.inflow.available(); v < transportDefaultConnFlow/2 { + connAdd = transportDefaultConnFlow - v + cc.inflow.add(connAdd) + } + if err == nil { // No need to refresh if the stream is over or failed. + // Consider any buffered body data (read from the conn but not + // consumed by the client) when computing flow control for this + // stream. + v := int(cs.inflow.available()) + cs.bufPipe.Len() + if v < transportDefaultStreamFlow-transportDefaultStreamMinRefresh { + streamAdd = int32(transportDefaultStreamFlow - v) + cs.inflow.add(streamAdd) + } + } + if connAdd != 0 || streamAdd != 0 { + cc.wmu.Lock() + defer cc.wmu.Unlock() + if connAdd != 0 { + cc.fr.WriteWindowUpdate(0, mustUint31(connAdd)) + } + if streamAdd != 0 { + cc.fr.WriteWindowUpdate(cs.ID, mustUint31(streamAdd)) + } + cc.bw.Flush() + } + return +} + +var errClosedResponseBody = errors.New("http2: response body closed") + +func (b transportResponseBody) Close() error { + cs := b.cs + cc := cs.cc + + serverSentStreamEnd := cs.bufPipe.Err() == io.EOF + unread := cs.bufPipe.Len() + + if unread > 0 || !serverSentStreamEnd { + cc.mu.Lock() + cc.wmu.Lock() + if !serverSentStreamEnd { + cc.fr.WriteRSTStream(cs.ID, ErrCodeCancel) + cs.didReset = true + } + // Return connection-level flow control. + if unread > 0 { + cc.inflow.add(int32(unread)) + cc.fr.WriteWindowUpdate(0, uint32(unread)) + } + cc.bw.Flush() + cc.wmu.Unlock() + cc.mu.Unlock() + } + + cs.bufPipe.BreakWithError(errClosedResponseBody) + cc.forgetStreamID(cs.ID) + return nil +} + +func (rl *clientConnReadLoop) processData(f *DataFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, f.StreamEnded()) + data := f.Data() + if cs == nil { + cc.mu.Lock() + neverSent := cc.nextStreamID + cc.mu.Unlock() + if f.StreamID >= neverSent { + // We never asked for this. + cc.logf("http2: Transport received unsolicited DATA frame; closing connection") + return ConnectionError(ErrCodeProtocol) + } + // We probably did ask for this, but canceled. Just ignore it. + // TODO: be stricter here? only silently ignore things which + // we canceled, but not things which were closed normally + // by the peer? Tough without accumulating too much state. + + // But at least return their flow control: + if f.Length > 0 { + cc.mu.Lock() + cc.inflow.add(int32(f.Length)) + cc.mu.Unlock() + + cc.wmu.Lock() + cc.fr.WriteWindowUpdate(0, uint32(f.Length)) + cc.bw.Flush() + cc.wmu.Unlock() + } + return nil + } + if !cs.firstByte { + cc.logf("protocol error: received DATA before a HEADERS frame") + rl.endStreamError(cs, StreamError{ + StreamID: f.StreamID, + Code: ErrCodeProtocol, + }) + return nil + } + if f.Length > 0 { + if cs.req.Method == "HEAD" && len(data) > 0 { + cc.logf("protocol error: received DATA on a HEAD request") + rl.endStreamError(cs, StreamError{ + StreamID: f.StreamID, + Code: ErrCodeProtocol, + }) + return nil + } + // Check connection-level flow control. + cc.mu.Lock() + if cs.inflow.available() >= int32(f.Length) { + cs.inflow.take(int32(f.Length)) + } else { + cc.mu.Unlock() + return ConnectionError(ErrCodeFlowControl) + } + // Return any padded flow control now, since we won't + // refund it later on body reads. + var refund int + if pad := int(f.Length) - len(data); pad > 0 { + refund += pad + } + // Return len(data) now if the stream is already closed, + // since data will never be read. + didReset := cs.didReset + if didReset { + refund += len(data) + } + if refund > 0 { + cc.inflow.add(int32(refund)) + cc.wmu.Lock() + cc.fr.WriteWindowUpdate(0, uint32(refund)) + if !didReset { + cs.inflow.add(int32(refund)) + cc.fr.WriteWindowUpdate(cs.ID, uint32(refund)) + } + cc.bw.Flush() + cc.wmu.Unlock() + } + cc.mu.Unlock() + + if len(data) > 0 && !didReset { + if _, err := cs.bufPipe.Write(data); err != nil { + rl.endStreamError(cs, err) + return err + } + } + } + + if f.StreamEnded() { + rl.endStream(cs) + } + return nil +} + +func (rl *clientConnReadLoop) endStream(cs *clientStream) { + // TODO: check that any declared content-length matches, like + // server.go's (*stream).endStream method. + rl.endStreamError(cs, nil) +} + +func (rl *clientConnReadLoop) endStreamError(cs *clientStream, err error) { + var code func() + if err == nil { + err = io.EOF + code = cs.copyTrailers + } + if isConnectionCloseRequest(cs.req) { + rl.closeWhenIdle = true + } + cs.bufPipe.closeWithErrorAndCode(err, code) + + select { + case cs.resc <- resAndError{err: err}: + default: + } +} + +func (cs *clientStream) copyTrailers() { + for k, vv := range cs.trailer { + t := cs.resTrailer + if *t == nil { + *t = make(http.Header) + } + (*t)[k] = vv + } +} + +func (rl *clientConnReadLoop) processGoAway(f *GoAwayFrame) error { + cc := rl.cc + cc.t.connPool().MarkDead(cc) + if f.ErrCode != 0 { + // TODO: deal with GOAWAY more. particularly the error code + cc.vlogf("transport got GOAWAY with error code = %v", f.ErrCode) + } + cc.setGoAway(f) + return nil +} + +func (rl *clientConnReadLoop) processSettings(f *SettingsFrame) error { + cc := rl.cc + cc.mu.Lock() + defer cc.mu.Unlock() + + if f.IsAck() { + if cc.wantSettingsAck { + cc.wantSettingsAck = false + return nil + } + return ConnectionError(ErrCodeProtocol) + } + + err := f.ForeachSetting(func(s Setting) error { + switch s.ID { + case SettingMaxFrameSize: + cc.maxFrameSize = s.Val + case SettingMaxConcurrentStreams: + cc.maxConcurrentStreams = s.Val + case SettingMaxHeaderListSize: + cc.peerMaxHeaderListSize = uint64(s.Val) + case SettingInitialWindowSize: + // Values above the maximum flow-control + // window size of 2^31-1 MUST be treated as a + // connection error (Section 5.4.1) of type + // FLOW_CONTROL_ERROR. + if s.Val > math.MaxInt32 { + return ConnectionError(ErrCodeFlowControl) + } + + // Adjust flow control of currently-open + // frames by the difference of the old initial + // window size and this one. + delta := int32(s.Val) - int32(cc.initialWindowSize) + for _, cs := range cc.streams { + cs.flow.add(delta) + } + cc.cond.Broadcast() + + cc.initialWindowSize = s.Val + default: + // TODO(bradfitz): handle more settings? SETTINGS_HEADER_TABLE_SIZE probably. + cc.vlogf("Unhandled Setting: %v", s) + } + return nil + }) + if err != nil { + return err + } + + cc.wmu.Lock() + defer cc.wmu.Unlock() + + cc.fr.WriteSettingsAck() + cc.bw.Flush() + return cc.werr +} + +func (rl *clientConnReadLoop) processWindowUpdate(f *WindowUpdateFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, false) + if f.StreamID != 0 && cs == nil { + return nil + } + + cc.mu.Lock() + defer cc.mu.Unlock() + + fl := &cc.flow + if cs != nil { + fl = &cs.flow + } + if !fl.add(int32(f.Increment)) { + return ConnectionError(ErrCodeFlowControl) + } + cc.cond.Broadcast() + return nil +} + +func (rl *clientConnReadLoop) processResetStream(f *RSTStreamFrame) error { + cs := rl.cc.streamByID(f.StreamID, true) + if cs == nil { + // TODO: return error if server tries to RST_STEAM an idle stream + return nil + } + select { + case <-cs.peerReset: + // Already reset. + // This is the only goroutine + // which closes this, so there + // isn't a race. + default: + err := streamError(cs.ID, f.ErrCode) + cs.resetErr = err + close(cs.peerReset) + cs.bufPipe.CloseWithError(err) + cs.cc.cond.Broadcast() // wake up checkResetOrDone via clientStream.awaitFlowControl + } + return nil +} + +// Ping sends a PING frame to the server and waits for the ack. +func (cc *ClientConn) Ping(ctx context.Context) error { + c := make(chan struct{}) + // Generate a random payload + var p [8]byte + for { + if _, err := rand.Read(p[:]); err != nil { + return err + } + cc.mu.Lock() + // check for dup before insert + if _, found := cc.pings[p]; !found { + cc.pings[p] = c + cc.mu.Unlock() + break + } + cc.mu.Unlock() + } + cc.wmu.Lock() + if err := cc.fr.WritePing(false, p); err != nil { + cc.wmu.Unlock() + return err + } + if err := cc.bw.Flush(); err != nil { + cc.wmu.Unlock() + return err + } + cc.wmu.Unlock() + select { + case <-c: + return nil + case <-ctx.Done(): + return ctx.Err() + case <-cc.readerDone: + // connection closed + return cc.readerErr + } +} + +func (rl *clientConnReadLoop) processPing(f *PingFrame) error { + if f.IsAck() { + cc := rl.cc + cc.mu.Lock() + defer cc.mu.Unlock() + // If ack, notify listener if any + if c, ok := cc.pings[f.Data]; ok { + close(c) + delete(cc.pings, f.Data) + } + return nil + } + cc := rl.cc + cc.wmu.Lock() + defer cc.wmu.Unlock() + if err := cc.fr.WritePing(true, f.Data); err != nil { + return err + } + return cc.bw.Flush() +} + +func (rl *clientConnReadLoop) processPushPromise(f *PushPromiseFrame) error { + // We told the peer we don't want them. + // Spec says: + // "PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH + // setting of the peer endpoint is set to 0. An endpoint that + // has set this setting and has received acknowledgement MUST + // treat the receipt of a PUSH_PROMISE frame as a connection + // error (Section 5.4.1) of type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) +} + +func (cc *ClientConn) writeStreamReset(streamID uint32, code ErrCode, err error) { + // TODO: map err to more interesting error codes, once the + // HTTP community comes up with some. But currently for + // RST_STREAM there's no equivalent to GOAWAY frame's debug + // data, and the error codes are all pretty vague ("cancel"). + cc.wmu.Lock() + cc.fr.WriteRSTStream(streamID, code) + cc.bw.Flush() + cc.wmu.Unlock() +} + +var ( + errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit") + errRequestHeaderListSize = errors.New("http2: request header list larger than peer's advertised limit") +) + +func (cc *ClientConn) logf(format string, args ...interface{}) { + cc.t.logf(format, args...) +} + +func (cc *ClientConn) vlogf(format string, args ...interface{}) { + cc.t.vlogf(format, args...) +} + +func (t *Transport) vlogf(format string, args ...interface{}) { + if VerboseLogs { + t.logf(format, args...) + } +} + +func (t *Transport) logf(format string, args ...interface{}) { + log.Printf(format, args...) +} + +var noBody io.ReadCloser = ioutil.NopCloser(bytes.NewReader(nil)) + +func strSliceContains(ss []string, s string) bool { + for _, v := range ss { + if v == s { + return true + } + } + return false +} + +type erringRoundTripper struct{ err error } + +func (rt erringRoundTripper) RoundTripErr() error { return rt.err } +func (rt erringRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { return nil, rt.err } + +// gzipReader wraps a response body so it can lazily +// call gzip.NewReader on the first call to Read +type gzipReader struct { + _ incomparable + body io.ReadCloser // underlying Response.Body + zr *gzip.Reader // lazily-initialized gzip reader + zerr error // sticky error +} + +func (gz *gzipReader) Read(p []byte) (n int, err error) { + if gz.zerr != nil { + return 0, gz.zerr + } + if gz.zr == nil { + gz.zr, err = gzip.NewReader(gz.body) + if err != nil { + gz.zerr = err + return 0, err + } + } + return gz.zr.Read(p) +} + +func (gz *gzipReader) Close() error { + return gz.body.Close() +} + +type errorReader struct{ err error } + +func (r errorReader) Read(p []byte) (int, error) { return 0, r.err } + +// bodyWriterState encapsulates various state around the Transport's writing +// of the request body, particularly regarding doing delayed writes of the body +// when the request contains "Expect: 100-continue". +type bodyWriterState struct { + cs *clientStream + timer *time.Timer // if non-nil, we're doing a delayed write + fnonce *sync.Once // to call fn with + fn func() // the code to run in the goroutine, writing the body + resc chan error // result of fn's execution + delay time.Duration // how long we should delay a delayed write for +} + +func (t *Transport) getBodyWriterState(cs *clientStream, body io.Reader) (s bodyWriterState) { + s.cs = cs + if body == nil { + return + } + resc := make(chan error, 1) + s.resc = resc + s.fn = func() { + cs.cc.mu.Lock() + cs.startedWrite = true + cs.cc.mu.Unlock() + resc <- cs.writeRequestBody(body, cs.req.Body) + } + s.delay = t.expectContinueTimeout() + if s.delay == 0 || + !httpguts.HeaderValuesContainsToken( + cs.req.Header["Expect"], + "100-continue") { + return + } + s.fnonce = new(sync.Once) + + // Arm the timer with a very large duration, which we'll + // intentionally lower later. It has to be large now because + // we need a handle to it before writing the headers, but the + // s.delay value is defined to not start until after the + // request headers were written. + const hugeDuration = 365 * 24 * time.Hour + s.timer = time.AfterFunc(hugeDuration, func() { + s.fnonce.Do(s.fn) + }) + return +} + +func (s bodyWriterState) cancel() { + if s.timer != nil { + s.timer.Stop() + } +} + +func (s bodyWriterState) on100() { + if s.timer == nil { + // If we didn't do a delayed write, ignore the server's + // bogus 100 continue response. + return + } + s.timer.Stop() + go func() { s.fnonce.Do(s.fn) }() +} + +// scheduleBodyWrite starts writing the body, either immediately (in +// the common case) or after the delay timeout. It should not be +// called until after the headers have been written. +func (s bodyWriterState) scheduleBodyWrite() { + if s.timer == nil { + // We're not doing a delayed write (see + // getBodyWriterState), so just start the writing + // goroutine immediately. + go s.fn() + return + } + traceWait100Continue(s.cs.trace) + if s.timer.Stop() { + s.timer.Reset(s.delay) + } +} + +// isConnectionCloseRequest reports whether req should use its own +// connection for a single request and then close the connection. +func isConnectionCloseRequest(req *http.Request) bool { + return req.Close || httpguts.HeaderValuesContainsToken(req.Header["Connection"], "close") +} + +// registerHTTPSProtocol calls Transport.RegisterProtocol but +// converting panics into errors. +func registerHTTPSProtocol(t *http.Transport, rt noDialH2RoundTripper) (err error) { + defer func() { + if e := recover(); e != nil { + err = fmt.Errorf("%v", e) + } + }() + t.RegisterProtocol("https", rt) + return nil +} + +// noDialH2RoundTripper is a RoundTripper which only tries to complete the request +// if there's already has a cached connection to the host. +// (The field is exported so it can be accessed via reflect from net/http; tested +// by TestNoDialH2RoundTripperType) +type noDialH2RoundTripper struct{ *Transport } + +func (rt noDialH2RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + res, err := rt.Transport.RoundTrip(req) + if isNoCachedConnError(err) { + return nil, http.ErrSkipAltProtocol + } + return res, err +} + +func (t *Transport) idleConnTimeout() time.Duration { + if t.t1 != nil { + return t.t1.IdleConnTimeout + } + return 0 +} + +func traceGetConn(req *http.Request, hostPort string) { + trace := httptrace.ContextClientTrace(req.Context()) + if trace == nil || trace.GetConn == nil { + return + } + trace.GetConn(hostPort) +} + +func traceGotConn(req *http.Request, cc *ClientConn, reused bool) { + trace := httptrace.ContextClientTrace(req.Context()) + if trace == nil || trace.GotConn == nil { + return + } + ci := httptrace.GotConnInfo{Conn: cc.tconn} + ci.Reused = reused + cc.mu.Lock() + ci.WasIdle = len(cc.streams) == 0 && reused + if ci.WasIdle && !cc.lastActive.IsZero() { + ci.IdleTime = time.Now().Sub(cc.lastActive) + } + cc.mu.Unlock() + + trace.GotConn(ci) +} + +func traceWroteHeaders(trace *httptrace.ClientTrace) { + if trace != nil && trace.WroteHeaders != nil { + trace.WroteHeaders() + } +} + +func traceGot100Continue(trace *httptrace.ClientTrace) { + if trace != nil && trace.Got100Continue != nil { + trace.Got100Continue() + } +} + +func traceWait100Continue(trace *httptrace.ClientTrace) { + if trace != nil && trace.Wait100Continue != nil { + trace.Wait100Continue() + } +} + +func traceWroteRequest(trace *httptrace.ClientTrace, err error) { + if trace != nil && trace.WroteRequest != nil { + trace.WroteRequest(httptrace.WroteRequestInfo{Err: err}) + } +} + +func traceFirstResponseByte(trace *httptrace.ClientTrace) { + if trace != nil && trace.GotFirstResponseByte != nil { + trace.GotFirstResponseByte() + } +} diff --git a/vendor/golang.org/x/net/http2/write.go b/vendor/golang.org/x/net/http2/write.go new file mode 100644 index 00000000..3849bc26 --- /dev/null +++ b/vendor/golang.org/x/net/http2/write.go @@ -0,0 +1,365 @@ +// 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 http2 + +import ( + "bytes" + "fmt" + "log" + "net/http" + "net/url" + + "golang.org/x/net/http/httpguts" + "golang.org/x/net/http2/hpack" +) + +// writeFramer is implemented by any type that is used to write frames. +type writeFramer interface { + writeFrame(writeContext) error + + // staysWithinBuffer reports whether this writer promises that + // it will only write less than or equal to size bytes, and it + // won't Flush the write context. + staysWithinBuffer(size int) bool +} + +// writeContext is the interface needed by the various frame writer +// types below. All the writeFrame methods below are scheduled via the +// frame writing scheduler (see writeScheduler in writesched.go). +// +// This interface is implemented by *serverConn. +// +// TODO: decide whether to a) use this in the client code (which didn't +// end up using this yet, because it has a simpler design, not +// currently implementing priorities), or b) delete this and +// make the server code a bit more concrete. +type writeContext interface { + Framer() *Framer + Flush() error + CloseConn() error + // HeaderEncoder returns an HPACK encoder that writes to the + // returned buffer. + HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) +} + +// writeEndsStream reports whether w writes a frame that will transition +// the stream to a half-closed local state. This returns false for RST_STREAM, +// which closes the entire stream (not just the local half). +func writeEndsStream(w writeFramer) bool { + switch v := w.(type) { + case *writeData: + return v.endStream + case *writeResHeaders: + return v.endStream + case nil: + // This can only happen if the caller reuses w after it's + // been intentionally nil'ed out to prevent use. Keep this + // here to catch future refactoring breaking it. + panic("writeEndsStream called on nil writeFramer") + } + return false +} + +type flushFrameWriter struct{} + +func (flushFrameWriter) writeFrame(ctx writeContext) error { + return ctx.Flush() +} + +func (flushFrameWriter) staysWithinBuffer(max int) bool { return false } + +type writeSettings []Setting + +func (s writeSettings) staysWithinBuffer(max int) bool { + const settingSize = 6 // uint16 + uint32 + return frameHeaderLen+settingSize*len(s) <= max + +} + +func (s writeSettings) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteSettings([]Setting(s)...) +} + +type writeGoAway struct { + maxStreamID uint32 + code ErrCode +} + +func (p *writeGoAway) writeFrame(ctx writeContext) error { + err := ctx.Framer().WriteGoAway(p.maxStreamID, p.code, nil) + ctx.Flush() // ignore error: we're hanging up on them anyway + return err +} + +func (*writeGoAway) staysWithinBuffer(max int) bool { return false } // flushes + +type writeData struct { + streamID uint32 + p []byte + endStream bool +} + +func (w *writeData) String() string { + return fmt.Sprintf("writeData(stream=%d, p=%d, endStream=%v)", w.streamID, len(w.p), w.endStream) +} + +func (w *writeData) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteData(w.streamID, w.endStream, w.p) +} + +func (w *writeData) staysWithinBuffer(max int) bool { + return frameHeaderLen+len(w.p) <= max +} + +// handlerPanicRST is the message sent from handler goroutines when +// the handler panics. +type handlerPanicRST struct { + StreamID uint32 +} + +func (hp handlerPanicRST) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteRSTStream(hp.StreamID, ErrCodeInternal) +} + +func (hp handlerPanicRST) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + +func (se StreamError) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteRSTStream(se.StreamID, se.Code) +} + +func (se StreamError) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + +type writePingAck struct{ pf *PingFrame } + +func (w writePingAck) writeFrame(ctx writeContext) error { + return ctx.Framer().WritePing(true, w.pf.Data) +} + +func (w writePingAck) staysWithinBuffer(max int) bool { return frameHeaderLen+len(w.pf.Data) <= max } + +type writeSettingsAck struct{} + +func (writeSettingsAck) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteSettingsAck() +} + +func (writeSettingsAck) staysWithinBuffer(max int) bool { return frameHeaderLen <= max } + +// splitHeaderBlock splits headerBlock into fragments so that each fragment fits +// in a single frame, then calls fn for each fragment. firstFrag/lastFrag are true +// for the first/last fragment, respectively. +func splitHeaderBlock(ctx writeContext, headerBlock []byte, fn func(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error) error { + // For now we're lazy and just pick the minimum MAX_FRAME_SIZE + // that all peers must support (16KB). Later we could care + // more and send larger frames if the peer advertised it, but + // there's little point. Most headers are small anyway (so we + // generally won't have CONTINUATION frames), and extra frames + // only waste 9 bytes anyway. + const maxFrameSize = 16384 + + first := true + for len(headerBlock) > 0 { + frag := headerBlock + if len(frag) > maxFrameSize { + frag = frag[:maxFrameSize] + } + headerBlock = headerBlock[len(frag):] + if err := fn(ctx, frag, first, len(headerBlock) == 0); err != nil { + return err + } + first = false + } + return nil +} + +// writeResHeaders is a request to write a HEADERS and 0+ CONTINUATION frames +// for HTTP response headers or trailers from a server handler. +type writeResHeaders struct { + streamID uint32 + httpResCode int // 0 means no ":status" line + h http.Header // may be nil + trailers []string // if non-nil, which keys of h to write. nil means all. + endStream bool + + date string + contentType string + contentLength string +} + +func encKV(enc *hpack.Encoder, k, v string) { + if VerboseLogs { + log.Printf("http2: server encoding header %q = %q", k, v) + } + enc.WriteField(hpack.HeaderField{Name: k, Value: v}) +} + +func (w *writeResHeaders) staysWithinBuffer(max int) bool { + // TODO: this is a common one. It'd be nice to return true + // here and get into the fast path if we could be clever and + // calculate the size fast enough, or at least a conservative + // upper bound that usually fires. (Maybe if w.h and + // w.trailers are nil, so we don't need to enumerate it.) + // Otherwise I'm afraid that just calculating the length to + // answer this question would be slower than the ~2µs benefit. + return false +} + +func (w *writeResHeaders) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + + if w.httpResCode != 0 { + encKV(enc, ":status", httpCodeString(w.httpResCode)) + } + + encodeHeaders(enc, w.h, w.trailers) + + if w.contentType != "" { + encKV(enc, "content-type", w.contentType) + } + if w.contentLength != "" { + encKV(enc, "content-length", w.contentLength) + } + if w.date != "" { + encKV(enc, "date", w.date) + } + + headerBlock := buf.Bytes() + if len(headerBlock) == 0 && w.trailers == nil { + panic("unexpected empty hpack") + } + + return splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock) +} + +func (w *writeResHeaders) writeHeaderBlock(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error { + if firstFrag { + return ctx.Framer().WriteHeaders(HeadersFrameParam{ + StreamID: w.streamID, + BlockFragment: frag, + EndStream: w.endStream, + EndHeaders: lastFrag, + }) + } else { + return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag) + } +} + +// writePushPromise is a request to write a PUSH_PROMISE and 0+ CONTINUATION frames. +type writePushPromise struct { + streamID uint32 // pusher stream + method string // for :method + url *url.URL // for :scheme, :authority, :path + h http.Header + + // Creates an ID for a pushed stream. This runs on serveG just before + // the frame is written. The returned ID is copied to promisedID. + allocatePromisedID func() (uint32, error) + promisedID uint32 +} + +func (w *writePushPromise) staysWithinBuffer(max int) bool { + // TODO: see writeResHeaders.staysWithinBuffer + return false +} + +func (w *writePushPromise) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + + encKV(enc, ":method", w.method) + encKV(enc, ":scheme", w.url.Scheme) + encKV(enc, ":authority", w.url.Host) + encKV(enc, ":path", w.url.RequestURI()) + encodeHeaders(enc, w.h, nil) + + headerBlock := buf.Bytes() + if len(headerBlock) == 0 { + panic("unexpected empty hpack") + } + + return splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock) +} + +func (w *writePushPromise) writeHeaderBlock(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error { + if firstFrag { + return ctx.Framer().WritePushPromise(PushPromiseParam{ + StreamID: w.streamID, + PromiseID: w.promisedID, + BlockFragment: frag, + EndHeaders: lastFrag, + }) + } else { + return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag) + } +} + +type write100ContinueHeadersFrame struct { + streamID uint32 +} + +func (w write100ContinueHeadersFrame) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + encKV(enc, ":status", "100") + return ctx.Framer().WriteHeaders(HeadersFrameParam{ + StreamID: w.streamID, + BlockFragment: buf.Bytes(), + EndStream: false, + EndHeaders: true, + }) +} + +func (w write100ContinueHeadersFrame) staysWithinBuffer(max int) bool { + // Sloppy but conservative: + return 9+2*(len(":status")+len("100")) <= max +} + +type writeWindowUpdate struct { + streamID uint32 // or 0 for conn-level + n uint32 +} + +func (wu writeWindowUpdate) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + +func (wu writeWindowUpdate) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteWindowUpdate(wu.streamID, wu.n) +} + +// encodeHeaders encodes an http.Header. If keys is not nil, then (k, h[k]) +// is encoded only if k is in keys. +func encodeHeaders(enc *hpack.Encoder, h http.Header, keys []string) { + if keys == nil { + sorter := sorterPool.Get().(*sorter) + // Using defer here, since the returned keys from the + // sorter.Keys method is only valid until the sorter + // is returned: + defer sorterPool.Put(sorter) + keys = sorter.Keys(h) + } + for _, k := range keys { + vv := h[k] + k = lowerHeader(k) + if !validWireHeaderFieldName(k) { + // Skip it as backup paranoia. Per + // golang.org/issue/14048, these should + // already be rejected at a higher level. + continue + } + isTE := k == "transfer-encoding" + for _, v := range vv { + if !httpguts.ValidHeaderFieldValue(v) { + // TODO: return an error? golang.org/issue/14048 + // For now just omit it. + continue + } + // TODO: more of "8.1.2.2 Connection-Specific Header Fields" + if isTE && v != "trailers" { + continue + } + encKV(enc, k, v) + } + } +} diff --git a/vendor/golang.org/x/net/http2/writesched.go b/vendor/golang.org/x/net/http2/writesched.go new file mode 100644 index 00000000..f24d2b1e --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched.go @@ -0,0 +1,248 @@ +// 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 http2 + +import "fmt" + +// WriteScheduler is the interface implemented by HTTP/2 write schedulers. +// Methods are never called concurrently. +type WriteScheduler interface { + // OpenStream opens a new stream in the write scheduler. + // It is illegal to call this with streamID=0 or with a streamID that is + // already open -- the call may panic. + OpenStream(streamID uint32, options OpenStreamOptions) + + // CloseStream closes a stream in the write scheduler. Any frames queued on + // this stream should be discarded. It is illegal to call this on a stream + // that is not open -- the call may panic. + CloseStream(streamID uint32) + + // AdjustStream adjusts the priority of the given stream. This may be called + // on a stream that has not yet been opened or has been closed. Note that + // RFC 7540 allows PRIORITY frames to be sent on streams in any state. See: + // https://tools.ietf.org/html/rfc7540#section-5.1 + AdjustStream(streamID uint32, priority PriorityParam) + + // Push queues a frame in the scheduler. In most cases, this will not be + // called with wr.StreamID()!=0 unless that stream is currently open. The one + // exception is RST_STREAM frames, which may be sent on idle or closed streams. + Push(wr FrameWriteRequest) + + // Pop dequeues the next frame to write. Returns false if no frames can + // be written. Frames with a given wr.StreamID() are Pop'd in the same + // order they are Push'd. No frames should be discarded except by CloseStream. + Pop() (wr FrameWriteRequest, ok bool) +} + +// OpenStreamOptions specifies extra options for WriteScheduler.OpenStream. +type OpenStreamOptions struct { + // PusherID is zero if the stream was initiated by the client. Otherwise, + // PusherID names the stream that pushed the newly opened stream. + PusherID uint32 +} + +// FrameWriteRequest is a request to write a frame. +type FrameWriteRequest struct { + // write is the interface value that does the writing, once the + // WriteScheduler has selected this frame to write. The write + // functions are all defined in write.go. + write writeFramer + + // stream is the stream on which this frame will be written. + // nil for non-stream frames like PING and SETTINGS. + stream *stream + + // done, if non-nil, must be a buffered channel with space for + // 1 message and is sent the return value from write (or an + // earlier error) when the frame has been written. + done chan error +} + +// StreamID returns the id of the stream this frame will be written to. +// 0 is used for non-stream frames such as PING and SETTINGS. +func (wr FrameWriteRequest) StreamID() uint32 { + if wr.stream == nil { + if se, ok := wr.write.(StreamError); ok { + // (*serverConn).resetStream doesn't set + // stream because it doesn't necessarily have + // one. So special case this type of write + // message. + return se.StreamID + } + return 0 + } + return wr.stream.id +} + +// isControl reports whether wr is a control frame for MaxQueuedControlFrames +// purposes. That includes non-stream frames and RST_STREAM frames. +func (wr FrameWriteRequest) isControl() bool { + return wr.stream == nil +} + +// DataSize returns the number of flow control bytes that must be consumed +// to write this entire frame. This is 0 for non-DATA frames. +func (wr FrameWriteRequest) DataSize() int { + if wd, ok := wr.write.(*writeData); ok { + return len(wd.p) + } + return 0 +} + +// Consume consumes min(n, available) bytes from this frame, where available +// is the number of flow control bytes available on the stream. Consume returns +// 0, 1, or 2 frames, where the integer return value gives the number of frames +// returned. +// +// If flow control prevents consuming any bytes, this returns (_, _, 0). If +// the entire frame was consumed, this returns (wr, _, 1). Otherwise, this +// returns (consumed, rest, 2), where 'consumed' contains the consumed bytes and +// 'rest' contains the remaining bytes. The consumed bytes are deducted from the +// underlying stream's flow control budget. +func (wr FrameWriteRequest) Consume(n int32) (FrameWriteRequest, FrameWriteRequest, int) { + var empty FrameWriteRequest + + // Non-DATA frames are always consumed whole. + wd, ok := wr.write.(*writeData) + if !ok || len(wd.p) == 0 { + return wr, empty, 1 + } + + // Might need to split after applying limits. + allowed := wr.stream.flow.available() + if n < allowed { + allowed = n + } + if wr.stream.sc.maxFrameSize < allowed { + allowed = wr.stream.sc.maxFrameSize + } + if allowed <= 0 { + return empty, empty, 0 + } + if len(wd.p) > int(allowed) { + wr.stream.flow.take(allowed) + consumed := FrameWriteRequest{ + stream: wr.stream, + write: &writeData{ + streamID: wd.streamID, + p: wd.p[:allowed], + // Even if the original had endStream set, there + // are bytes remaining because len(wd.p) > allowed, + // so we know endStream is false. + endStream: false, + }, + // Our caller is blocking on the final DATA frame, not + // this intermediate frame, so no need to wait. + done: nil, + } + rest := FrameWriteRequest{ + stream: wr.stream, + write: &writeData{ + streamID: wd.streamID, + p: wd.p[allowed:], + endStream: wd.endStream, + }, + done: wr.done, + } + return consumed, rest, 2 + } + + // The frame is consumed whole. + // NB: This cast cannot overflow because allowed is <= math.MaxInt32. + wr.stream.flow.take(int32(len(wd.p))) + return wr, empty, 1 +} + +// String is for debugging only. +func (wr FrameWriteRequest) String() string { + var des string + if s, ok := wr.write.(fmt.Stringer); ok { + des = s.String() + } else { + des = fmt.Sprintf("%T", wr.write) + } + return fmt.Sprintf("[FrameWriteRequest stream=%d, ch=%v, writer=%v]", wr.StreamID(), wr.done != nil, des) +} + +// replyToWriter sends err to wr.done and panics if the send must block +// This does nothing if wr.done is nil. +func (wr *FrameWriteRequest) replyToWriter(err error) { + if wr.done == nil { + return + } + select { + case wr.done <- err: + default: + panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wr.write)) + } + wr.write = nil // prevent use (assume it's tainted after wr.done send) +} + +// writeQueue is used by implementations of WriteScheduler. +type writeQueue struct { + s []FrameWriteRequest +} + +func (q *writeQueue) empty() bool { return len(q.s) == 0 } + +func (q *writeQueue) push(wr FrameWriteRequest) { + q.s = append(q.s, wr) +} + +func (q *writeQueue) shift() FrameWriteRequest { + if len(q.s) == 0 { + panic("invalid use of queue") + } + wr := q.s[0] + // TODO: less copy-happy queue. + copy(q.s, q.s[1:]) + q.s[len(q.s)-1] = FrameWriteRequest{} + q.s = q.s[:len(q.s)-1] + return wr +} + +// consume consumes up to n bytes from q.s[0]. If the frame is +// entirely consumed, it is removed from the queue. If the frame +// is partially consumed, the frame is kept with the consumed +// bytes removed. Returns true iff any bytes were consumed. +func (q *writeQueue) consume(n int32) (FrameWriteRequest, bool) { + if len(q.s) == 0 { + return FrameWriteRequest{}, false + } + consumed, rest, numresult := q.s[0].Consume(n) + switch numresult { + case 0: + return FrameWriteRequest{}, false + case 1: + q.shift() + case 2: + q.s[0] = rest + } + return consumed, true +} + +type writeQueuePool []*writeQueue + +// put inserts an unused writeQueue into the pool. +func (p *writeQueuePool) put(q *writeQueue) { + for i := range q.s { + q.s[i] = FrameWriteRequest{} + } + q.s = q.s[:0] + *p = append(*p, q) +} + +// get returns an empty writeQueue. +func (p *writeQueuePool) get() *writeQueue { + ln := len(*p) + if ln == 0 { + return new(writeQueue) + } + x := ln - 1 + q := (*p)[x] + (*p)[x] = nil + *p = (*p)[:x] + return q +} diff --git a/vendor/golang.org/x/net/http2/writesched_priority.go b/vendor/golang.org/x/net/http2/writesched_priority.go new file mode 100644 index 00000000..2618b2c1 --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched_priority.go @@ -0,0 +1,452 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package http2 + +import ( + "fmt" + "math" + "sort" +) + +// RFC 7540, Section 5.3.5: the default weight is 16. +const priorityDefaultWeight = 15 // 16 = 15 + 1 + +// PriorityWriteSchedulerConfig configures a priorityWriteScheduler. +type PriorityWriteSchedulerConfig struct { + // MaxClosedNodesInTree controls the maximum number of closed streams to + // retain in the priority tree. Setting this to zero saves a small amount + // of memory at the cost of performance. + // + // See RFC 7540, Section 5.3.4: + // "It is possible for a stream to become closed while prioritization + // information ... is in transit. ... This potentially creates suboptimal + // prioritization, since the stream could be given a priority that is + // different from what is intended. To avoid these problems, an endpoint + // SHOULD retain stream prioritization state for a period after streams + // become closed. The longer state is retained, the lower the chance that + // streams are assigned incorrect or default priority values." + MaxClosedNodesInTree int + + // MaxIdleNodesInTree controls the maximum number of idle streams to + // retain in the priority tree. Setting this to zero saves a small amount + // of memory at the cost of performance. + // + // See RFC 7540, Section 5.3.4: + // Similarly, streams that are in the "idle" state can be assigned + // priority or become a parent of other streams. This allows for the + // creation of a grouping node in the dependency tree, which enables + // more flexible expressions of priority. Idle streams begin with a + // default priority (Section 5.3.5). + MaxIdleNodesInTree int + + // ThrottleOutOfOrderWrites enables write throttling to help ensure that + // data is delivered in priority order. This works around a race where + // stream B depends on stream A and both streams are about to call Write + // to queue DATA frames. If B wins the race, a naive scheduler would eagerly + // write as much data from B as possible, but this is suboptimal because A + // is a higher-priority stream. With throttling enabled, we write a small + // amount of data from B to minimize the amount of bandwidth that B can + // steal from A. + ThrottleOutOfOrderWrites bool +} + +// NewPriorityWriteScheduler constructs a WriteScheduler that schedules +// frames by following HTTP/2 priorities as described in RFC 7540 Section 5.3. +// If cfg is nil, default options are used. +func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler { + if cfg == nil { + // For justification of these defaults, see: + // https://docs.google.com/document/d/1oLhNg1skaWD4_DtaoCxdSRN5erEXrH-KnLrMwEpOtFY + cfg = &PriorityWriteSchedulerConfig{ + MaxClosedNodesInTree: 10, + MaxIdleNodesInTree: 10, + ThrottleOutOfOrderWrites: false, + } + } + + ws := &priorityWriteScheduler{ + nodes: make(map[uint32]*priorityNode), + maxClosedNodesInTree: cfg.MaxClosedNodesInTree, + maxIdleNodesInTree: cfg.MaxIdleNodesInTree, + enableWriteThrottle: cfg.ThrottleOutOfOrderWrites, + } + ws.nodes[0] = &ws.root + if cfg.ThrottleOutOfOrderWrites { + ws.writeThrottleLimit = 1024 + } else { + ws.writeThrottleLimit = math.MaxInt32 + } + return ws +} + +type priorityNodeState int + +const ( + priorityNodeOpen priorityNodeState = iota + priorityNodeClosed + priorityNodeIdle +) + +// priorityNode is a node in an HTTP/2 priority tree. +// Each node is associated with a single stream ID. +// See RFC 7540, Section 5.3. +type priorityNode struct { + q writeQueue // queue of pending frames to write + id uint32 // id of the stream, or 0 for the root of the tree + weight uint8 // the actual weight is weight+1, so the value is in [1,256] + state priorityNodeState // open | closed | idle + bytes int64 // number of bytes written by this node, or 0 if closed + subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree + + // These links form the priority tree. + parent *priorityNode + kids *priorityNode // start of the kids list + prev, next *priorityNode // doubly-linked list of siblings +} + +func (n *priorityNode) setParent(parent *priorityNode) { + if n == parent { + panic("setParent to self") + } + if n.parent == parent { + return + } + // Unlink from current parent. + if parent := n.parent; parent != nil { + if n.prev == nil { + parent.kids = n.next + } else { + n.prev.next = n.next + } + if n.next != nil { + n.next.prev = n.prev + } + } + // Link to new parent. + // If parent=nil, remove n from the tree. + // Always insert at the head of parent.kids (this is assumed by walkReadyInOrder). + n.parent = parent + if parent == nil { + n.next = nil + n.prev = nil + } else { + n.next = parent.kids + n.prev = nil + if n.next != nil { + n.next.prev = n + } + parent.kids = n + } +} + +func (n *priorityNode) addBytes(b int64) { + n.bytes += b + for ; n != nil; n = n.parent { + n.subtreeBytes += b + } +} + +// walkReadyInOrder iterates over the tree in priority order, calling f for each node +// with a non-empty write queue. When f returns true, this function returns true and the +// walk halts. tmp is used as scratch space for sorting. +// +// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true +// if any ancestor p of n is still open (ignoring the root node). +func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f func(*priorityNode, bool) bool) bool { + if !n.q.empty() && f(n, openParent) { + return true + } + if n.kids == nil { + return false + } + + // Don't consider the root "open" when updating openParent since + // we can't send data frames on the root stream (only control frames). + if n.id != 0 { + openParent = openParent || (n.state == priorityNodeOpen) + } + + // Common case: only one kid or all kids have the same weight. + // Some clients don't use weights; other clients (like web browsers) + // use mostly-linear priority trees. + w := n.kids.weight + needSort := false + for k := n.kids.next; k != nil; k = k.next { + if k.weight != w { + needSort = true + break + } + } + if !needSort { + for k := n.kids; k != nil; k = k.next { + if k.walkReadyInOrder(openParent, tmp, f) { + return true + } + } + return false + } + + // Uncommon case: sort the child nodes. We remove the kids from the parent, + // then re-insert after sorting so we can reuse tmp for future sort calls. + *tmp = (*tmp)[:0] + for n.kids != nil { + *tmp = append(*tmp, n.kids) + n.kids.setParent(nil) + } + sort.Sort(sortPriorityNodeSiblings(*tmp)) + for i := len(*tmp) - 1; i >= 0; i-- { + (*tmp)[i].setParent(n) // setParent inserts at the head of n.kids + } + for k := n.kids; k != nil; k = k.next { + if k.walkReadyInOrder(openParent, tmp, f) { + return true + } + } + return false +} + +type sortPriorityNodeSiblings []*priorityNode + +func (z sortPriorityNodeSiblings) Len() int { return len(z) } +func (z sortPriorityNodeSiblings) Swap(i, k int) { z[i], z[k] = z[k], z[i] } +func (z sortPriorityNodeSiblings) Less(i, k int) bool { + // Prefer the subtree that has sent fewer bytes relative to its weight. + // See sections 5.3.2 and 5.3.4. + wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes) + wk, bk := float64(z[k].weight+1), float64(z[k].subtreeBytes) + if bi == 0 && bk == 0 { + return wi >= wk + } + if bk == 0 { + return false + } + return bi/bk <= wi/wk +} + +type priorityWriteScheduler struct { + // root is the root of the priority tree, where root.id = 0. + // The root queues control frames that are not associated with any stream. + root priorityNode + + // nodes maps stream ids to priority tree nodes. + nodes map[uint32]*priorityNode + + // maxID is the maximum stream id in nodes. + maxID uint32 + + // lists of nodes that have been closed or are idle, but are kept in + // the tree for improved prioritization. When the lengths exceed either + // maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded. + closedNodes, idleNodes []*priorityNode + + // From the config. + maxClosedNodesInTree int + maxIdleNodesInTree int + writeThrottleLimit int32 + enableWriteThrottle bool + + // tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations. + tmp []*priorityNode + + // pool of empty queues for reuse. + queuePool writeQueuePool +} + +func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { + // The stream may be currently idle but cannot be opened or closed. + if curr := ws.nodes[streamID]; curr != nil { + if curr.state != priorityNodeIdle { + panic(fmt.Sprintf("stream %d already opened", streamID)) + } + curr.state = priorityNodeOpen + return + } + + // RFC 7540, Section 5.3.5: + // "All streams are initially assigned a non-exclusive dependency on stream 0x0. + // Pushed streams initially depend on their associated stream. In both cases, + // streams are assigned a default weight of 16." + parent := ws.nodes[options.PusherID] + if parent == nil { + parent = &ws.root + } + n := &priorityNode{ + q: *ws.queuePool.get(), + id: streamID, + weight: priorityDefaultWeight, + state: priorityNodeOpen, + } + n.setParent(parent) + ws.nodes[streamID] = n + if streamID > ws.maxID { + ws.maxID = streamID + } +} + +func (ws *priorityWriteScheduler) CloseStream(streamID uint32) { + if streamID == 0 { + panic("violation of WriteScheduler interface: cannot close stream 0") + } + if ws.nodes[streamID] == nil { + panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID)) + } + if ws.nodes[streamID].state != priorityNodeOpen { + panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID)) + } + + n := ws.nodes[streamID] + n.state = priorityNodeClosed + n.addBytes(-n.bytes) + + q := n.q + ws.queuePool.put(&q) + n.q.s = nil + if ws.maxClosedNodesInTree > 0 { + ws.addClosedOrIdleNode(&ws.closedNodes, ws.maxClosedNodesInTree, n) + } else { + ws.removeNode(n) + } +} + +func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { + if streamID == 0 { + panic("adjustPriority on root") + } + + // If streamID does not exist, there are two cases: + // - A closed stream that has been removed (this will have ID <= maxID) + // - An idle stream that is being used for "grouping" (this will have ID > maxID) + n := ws.nodes[streamID] + if n == nil { + if streamID <= ws.maxID || ws.maxIdleNodesInTree == 0 { + return + } + ws.maxID = streamID + n = &priorityNode{ + q: *ws.queuePool.get(), + id: streamID, + weight: priorityDefaultWeight, + state: priorityNodeIdle, + } + n.setParent(&ws.root) + ws.nodes[streamID] = n + ws.addClosedOrIdleNode(&ws.idleNodes, ws.maxIdleNodesInTree, n) + } + + // Section 5.3.1: A dependency on a stream that is not currently in the tree + // results in that stream being given a default priority (Section 5.3.5). + parent := ws.nodes[priority.StreamDep] + if parent == nil { + n.setParent(&ws.root) + n.weight = priorityDefaultWeight + return + } + + // Ignore if the client tries to make a node its own parent. + if n == parent { + return + } + + // Section 5.3.3: + // "If a stream is made dependent on one of its own dependencies, the + // formerly dependent stream is first moved to be dependent on the + // reprioritized stream's previous parent. The moved dependency retains + // its weight." + // + // That is: if parent depends on n, move parent to depend on n.parent. + for x := parent.parent; x != nil; x = x.parent { + if x == n { + parent.setParent(n.parent) + break + } + } + + // Section 5.3.3: The exclusive flag causes the stream to become the sole + // dependency of its parent stream, causing other dependencies to become + // dependent on the exclusive stream. + if priority.Exclusive { + k := parent.kids + for k != nil { + next := k.next + if k != n { + k.setParent(n) + } + k = next + } + } + + n.setParent(parent) + n.weight = priority.Weight +} + +func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) { + var n *priorityNode + if id := wr.StreamID(); id == 0 { + n = &ws.root + } else { + n = ws.nodes[id] + if n == nil { + // id is an idle or closed stream. wr should not be a HEADERS or + // DATA frame. However, wr can be a RST_STREAM. In this case, we + // push wr onto the root, rather than creating a new priorityNode, + // since RST_STREAM is tiny and the stream's priority is unknown + // anyway. See issue #17919. + if wr.DataSize() > 0 { + panic("add DATA on non-open stream") + } + n = &ws.root + } + } + n.q.push(wr) +} + +func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) { + ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNode, openParent bool) bool { + limit := int32(math.MaxInt32) + if openParent { + limit = ws.writeThrottleLimit + } + wr, ok = n.q.consume(limit) + if !ok { + return false + } + n.addBytes(int64(wr.DataSize())) + // If B depends on A and B continuously has data available but A + // does not, gradually increase the throttling limit to allow B to + // steal more and more bandwidth from A. + if openParent { + ws.writeThrottleLimit += 1024 + if ws.writeThrottleLimit < 0 { + ws.writeThrottleLimit = math.MaxInt32 + } + } else if ws.enableWriteThrottle { + ws.writeThrottleLimit = 1024 + } + return true + }) + return wr, ok +} + +func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, maxSize int, n *priorityNode) { + if maxSize == 0 { + return + } + if len(*list) == maxSize { + // Remove the oldest node, then shift left. + ws.removeNode((*list)[0]) + x := (*list)[1:] + copy(*list, x) + *list = (*list)[:len(x)] + } + *list = append(*list, n) +} + +func (ws *priorityWriteScheduler) removeNode(n *priorityNode) { + for k := n.kids; k != nil; k = k.next { + k.setParent(n.parent) + } + n.setParent(nil) + delete(ws.nodes, n.id) +} diff --git a/vendor/golang.org/x/net/http2/writesched_random.go b/vendor/golang.org/x/net/http2/writesched_random.go new file mode 100644 index 00000000..9a7b9e58 --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched_random.go @@ -0,0 +1,77 @@ +// 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 http2 + +import "math" + +// NewRandomWriteScheduler constructs a WriteScheduler that ignores HTTP/2 +// priorities. Control frames like SETTINGS and PING are written before DATA +// frames, but if no control frames are queued and multiple streams have queued +// HEADERS or DATA frames, Pop selects a ready stream arbitrarily. +func NewRandomWriteScheduler() WriteScheduler { + return &randomWriteScheduler{sq: make(map[uint32]*writeQueue)} +} + +type randomWriteScheduler struct { + // zero are frames not associated with a specific stream. + zero writeQueue + + // sq contains the stream-specific queues, keyed by stream ID. + // When a stream is idle, closed, or emptied, it's deleted + // from the map. + sq map[uint32]*writeQueue + + // pool of empty queues for reuse. + queuePool writeQueuePool +} + +func (ws *randomWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { + // no-op: idle streams are not tracked +} + +func (ws *randomWriteScheduler) CloseStream(streamID uint32) { + q, ok := ws.sq[streamID] + if !ok { + return + } + delete(ws.sq, streamID) + ws.queuePool.put(q) +} + +func (ws *randomWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { + // no-op: priorities are ignored +} + +func (ws *randomWriteScheduler) Push(wr FrameWriteRequest) { + id := wr.StreamID() + if id == 0 { + ws.zero.push(wr) + return + } + q, ok := ws.sq[id] + if !ok { + q = ws.queuePool.get() + ws.sq[id] = q + } + q.push(wr) +} + +func (ws *randomWriteScheduler) Pop() (FrameWriteRequest, bool) { + // Control frames first. + if !ws.zero.empty() { + return ws.zero.shift(), true + } + // Iterate over all non-idle streams until finding one that can be consumed. + for streamID, q := range ws.sq { + if wr, ok := q.consume(math.MaxInt32); ok { + if q.empty() { + delete(ws.sq, streamID) + ws.queuePool.put(q) + } + return wr, true + } + } + return FrameWriteRequest{}, false +} diff --git a/vendor/golang.org/x/net/idna/idna10.0.0.go b/vendor/golang.org/x/net/idna/idna10.0.0.go new file mode 100644 index 00000000..a98a31f4 --- /dev/null +++ b/vendor/golang.org/x/net/idna/idna10.0.0.go @@ -0,0 +1,734 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.10 + +// Package idna implements IDNA2008 using the compatibility processing +// defined by UTS (Unicode Technical Standard) #46, which defines a standard to +// deal with the transition from IDNA2003. +// +// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC +// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894. +// UTS #46 is defined in https://www.unicode.org/reports/tr46. +// See https://unicode.org/cldr/utility/idna.jsp for a visualization of the +// differences between these two standards. +package idna // import "golang.org/x/net/idna" + +import ( + "fmt" + "strings" + "unicode/utf8" + + "golang.org/x/text/secure/bidirule" + "golang.org/x/text/unicode/bidi" + "golang.org/x/text/unicode/norm" +) + +// NOTE: Unlike common practice in Go APIs, the functions will return a +// sanitized domain name in case of errors. Browsers sometimes use a partially +// evaluated string as lookup. +// TODO: the current error handling is, in my opinion, the least opinionated. +// Other strategies are also viable, though: +// Option 1) Return an empty string in case of error, but allow the user to +// specify explicitly which errors to ignore. +// Option 2) Return the partially evaluated string if it is itself a valid +// string, otherwise return the empty string in case of error. +// Option 3) Option 1 and 2. +// Option 4) Always return an empty string for now and implement Option 1 as +// needed, and document that the return string may not be empty in case of +// error in the future. +// I think Option 1 is best, but it is quite opinionated. + +// ToASCII is a wrapper for Punycode.ToASCII. +func ToASCII(s string) (string, error) { + return Punycode.process(s, true) +} + +// ToUnicode is a wrapper for Punycode.ToUnicode. +func ToUnicode(s string) (string, error) { + return Punycode.process(s, false) +} + +// An Option configures a Profile at creation time. +type Option func(*options) + +// Transitional sets a Profile to use the Transitional mapping as defined in UTS +// #46. This will cause, for example, "ß" to be mapped to "ss". Using the +// transitional mapping provides a compromise between IDNA2003 and IDNA2008 +// compatibility. It is used by most browsers when resolving domain names. This +// option is only meaningful if combined with MapForLookup. +func Transitional(transitional bool) Option { + return func(o *options) { o.transitional = true } +} + +// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts +// are longer than allowed by the RFC. +func VerifyDNSLength(verify bool) Option { + return func(o *options) { o.verifyDNSLength = verify } +} + +// RemoveLeadingDots removes leading label separators. Leading runes that map to +// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well. +// +// This is the behavior suggested by the UTS #46 and is adopted by some +// browsers. +func RemoveLeadingDots(remove bool) Option { + return func(o *options) { o.removeLeadingDots = remove } +} + +// ValidateLabels sets whether to check the mandatory label validation criteria +// as defined in Section 5.4 of RFC 5891. This includes testing for correct use +// of hyphens ('-'), normalization, validity of runes, and the context rules. +func ValidateLabels(enable bool) Option { + return func(o *options) { + // Don't override existing mappings, but set one that at least checks + // normalization if it is not set. + if o.mapping == nil && enable { + o.mapping = normalize + } + o.trie = trie + o.validateLabels = enable + o.fromPuny = validateFromPunycode + } +} + +// StrictDomainName limits the set of permissible ASCII characters to those +// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the +// hyphen). This is set by default for MapForLookup and ValidateForRegistration. +// +// This option is useful, for instance, for browsers that allow characters +// outside this range, for example a '_' (U+005F LOW LINE). See +// http://www.rfc-editor.org/std/std3.txt for more details This option +// corresponds to the UseSTD3ASCIIRules option in UTS #46. +func StrictDomainName(use bool) Option { + return func(o *options) { + o.trie = trie + o.useSTD3Rules = use + o.fromPuny = validateFromPunycode + } +} + +// NOTE: the following options pull in tables. The tables should not be linked +// in as long as the options are not used. + +// BidiRule enables the Bidi rule as defined in RFC 5893. Any application +// that relies on proper validation of labels should include this rule. +func BidiRule() Option { + return func(o *options) { o.bidirule = bidirule.ValidString } +} + +// ValidateForRegistration sets validation options to verify that a given IDN is +// properly formatted for registration as defined by Section 4 of RFC 5891. +func ValidateForRegistration() Option { + return func(o *options) { + o.mapping = validateRegistration + StrictDomainName(true)(o) + ValidateLabels(true)(o) + VerifyDNSLength(true)(o) + BidiRule()(o) + } +} + +// MapForLookup sets validation and mapping options such that a given IDN is +// transformed for domain name lookup according to the requirements set out in +// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894, +// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option +// to add this check. +// +// The mappings include normalization and mapping case, width and other +// compatibility mappings. +func MapForLookup() Option { + return func(o *options) { + o.mapping = validateAndMap + StrictDomainName(true)(o) + ValidateLabels(true)(o) + } +} + +type options struct { + transitional bool + useSTD3Rules bool + validateLabels bool + verifyDNSLength bool + removeLeadingDots bool + + trie *idnaTrie + + // fromPuny calls validation rules when converting A-labels to U-labels. + fromPuny func(p *Profile, s string) error + + // mapping implements a validation and mapping step as defined in RFC 5895 + // or UTS 46, tailored to, for example, domain registration or lookup. + mapping func(p *Profile, s string) (mapped string, isBidi bool, err error) + + // bidirule, if specified, checks whether s conforms to the Bidi Rule + // defined in RFC 5893. + bidirule func(s string) bool +} + +// A Profile defines the configuration of an IDNA mapper. +type Profile struct { + options +} + +func apply(o *options, opts []Option) { + for _, f := range opts { + f(o) + } +} + +// New creates a new Profile. +// +// With no options, the returned Profile is the most permissive and equals the +// Punycode Profile. Options can be passed to further restrict the Profile. The +// MapForLookup and ValidateForRegistration options set a collection of options, +// for lookup and registration purposes respectively, which can be tailored by +// adding more fine-grained options, where later options override earlier +// options. +func New(o ...Option) *Profile { + p := &Profile{} + apply(&p.options, o) + return p +} + +// ToASCII converts a domain or domain label to its ASCII form. For example, +// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and +// ToASCII("golang") is "golang". If an error is encountered it will return +// an error and a (partially) processed result. +func (p *Profile) ToASCII(s string) (string, error) { + return p.process(s, true) +} + +// ToUnicode converts a domain or domain label to its Unicode form. For example, +// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and +// ToUnicode("golang") is "golang". If an error is encountered it will return +// an error and a (partially) processed result. +func (p *Profile) ToUnicode(s string) (string, error) { + pp := *p + pp.transitional = false + return pp.process(s, false) +} + +// String reports a string with a description of the profile for debugging +// purposes. The string format may change with different versions. +func (p *Profile) String() string { + s := "" + if p.transitional { + s = "Transitional" + } else { + s = "NonTransitional" + } + if p.useSTD3Rules { + s += ":UseSTD3Rules" + } + if p.validateLabels { + s += ":ValidateLabels" + } + if p.verifyDNSLength { + s += ":VerifyDNSLength" + } + return s +} + +var ( + // Punycode is a Profile that does raw punycode processing with a minimum + // of validation. + Punycode *Profile = punycode + + // Lookup is the recommended profile for looking up domain names, according + // to Section 5 of RFC 5891. The exact configuration of this profile may + // change over time. + Lookup *Profile = lookup + + // Display is the recommended profile for displaying domain names. + // The configuration of this profile may change over time. + Display *Profile = display + + // Registration is the recommended profile for checking whether a given + // IDN is valid for registration, according to Section 4 of RFC 5891. + Registration *Profile = registration + + punycode = &Profile{} + lookup = &Profile{options{ + transitional: true, + useSTD3Rules: true, + validateLabels: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, + }} + display = &Profile{options{ + useSTD3Rules: true, + validateLabels: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, + }} + registration = &Profile{options{ + useSTD3Rules: true, + validateLabels: true, + verifyDNSLength: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateRegistration, + bidirule: bidirule.ValidString, + }} + + // TODO: profiles + // Register: recommended for approving domain names: don't do any mappings + // but rather reject on invalid input. Bundle or block deviation characters. +) + +type labelError struct{ label, code_ string } + +func (e labelError) code() string { return e.code_ } +func (e labelError) Error() string { + return fmt.Sprintf("idna: invalid label %q", e.label) +} + +type runeError rune + +func (e runeError) code() string { return "P1" } +func (e runeError) Error() string { + return fmt.Sprintf("idna: disallowed rune %U", e) +} + +// process implements the algorithm described in section 4 of UTS #46, +// see https://www.unicode.org/reports/tr46. +func (p *Profile) process(s string, toASCII bool) (string, error) { + var err error + var isBidi bool + if p.mapping != nil { + s, isBidi, err = p.mapping(p, s) + } + // Remove leading empty labels. + if p.removeLeadingDots { + for ; len(s) > 0 && s[0] == '.'; s = s[1:] { + } + } + // TODO: allow for a quick check of the tables data. + // It seems like we should only create this error on ToASCII, but the + // UTS 46 conformance tests suggests we should always check this. + if err == nil && p.verifyDNSLength && s == "" { + err = &labelError{s, "A4"} + } + labels := labelIter{orig: s} + for ; !labels.done(); labels.next() { + label := labels.label() + if label == "" { + // Empty labels are not okay. The label iterator skips the last + // label if it is empty. + if err == nil && p.verifyDNSLength { + err = &labelError{s, "A4"} + } + continue + } + if strings.HasPrefix(label, acePrefix) { + u, err2 := decode(label[len(acePrefix):]) + if err2 != nil { + if err == nil { + err = err2 + } + // Spec says keep the old label. + continue + } + isBidi = isBidi || bidirule.DirectionString(u) != bidi.LeftToRight + labels.set(u) + if err == nil && p.validateLabels { + err = p.fromPuny(p, u) + } + if err == nil { + // This should be called on NonTransitional, according to the + // spec, but that currently does not have any effect. Use the + // original profile to preserve options. + err = p.validateLabel(u) + } + } else if err == nil { + err = p.validateLabel(label) + } + } + if isBidi && p.bidirule != nil && err == nil { + for labels.reset(); !labels.done(); labels.next() { + if !p.bidirule(labels.label()) { + err = &labelError{s, "B"} + break + } + } + } + if toASCII { + for labels.reset(); !labels.done(); labels.next() { + label := labels.label() + if !ascii(label) { + a, err2 := encode(acePrefix, label) + if err == nil { + err = err2 + } + label = a + labels.set(a) + } + n := len(label) + if p.verifyDNSLength && err == nil && (n == 0 || n > 63) { + err = &labelError{label, "A4"} + } + } + } + s = labels.result() + if toASCII && p.verifyDNSLength && err == nil { + // Compute the length of the domain name minus the root label and its dot. + n := len(s) + if n > 0 && s[n-1] == '.' { + n-- + } + if len(s) < 1 || n > 253 { + err = &labelError{s, "A4"} + } + } + return s, err +} + +func normalize(p *Profile, s string) (mapped string, isBidi bool, err error) { + // TODO: consider first doing a quick check to see if any of these checks + // need to be done. This will make it slower in the general case, but + // faster in the common case. + mapped = norm.NFC.String(s) + isBidi = bidirule.DirectionString(mapped) == bidi.RightToLeft + return mapped, isBidi, nil +} + +func validateRegistration(p *Profile, s string) (idem string, bidi bool, err error) { + // TODO: filter need for normalization in loop below. + if !norm.NFC.IsNormalString(s) { + return s, false, &labelError{s, "V1"} + } + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + if sz == 0 { + return s, bidi, runeError(utf8.RuneError) + } + bidi = bidi || info(v).isBidi(s[i:]) + // Copy bytes not copied so far. + switch p.simplify(info(v).category()) { + // TODO: handle the NV8 defined in the Unicode idna data set to allow + // for strict conformance to IDNA2008. + case valid, deviation: + case disallowed, mapped, unknown, ignored: + r, _ := utf8.DecodeRuneInString(s[i:]) + return s, bidi, runeError(r) + } + i += sz + } + return s, bidi, nil +} + +func (c info) isBidi(s string) bool { + if !c.isMapped() { + return c&attributesMask == rtl + } + // TODO: also store bidi info for mapped data. This is possible, but a bit + // cumbersome and not for the common case. + p, _ := bidi.LookupString(s) + switch p.Class() { + case bidi.R, bidi.AL, bidi.AN: + return true + } + return false +} + +func validateAndMap(p *Profile, s string) (vm string, bidi bool, err error) { + var ( + b []byte + k int + ) + // combinedInfoBits contains the or-ed bits of all runes. We use this + // to derive the mayNeedNorm bit later. This may trigger normalization + // overeagerly, but it will not do so in the common case. The end result + // is another 10% saving on BenchmarkProfile for the common case. + var combinedInfoBits info + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + if sz == 0 { + b = append(b, s[k:i]...) + b = append(b, "\ufffd"...) + k = len(s) + if err == nil { + err = runeError(utf8.RuneError) + } + break + } + combinedInfoBits |= info(v) + bidi = bidi || info(v).isBidi(s[i:]) + start := i + i += sz + // Copy bytes not copied so far. + switch p.simplify(info(v).category()) { + case valid: + continue + case disallowed: + if err == nil { + r, _ := utf8.DecodeRuneInString(s[start:]) + err = runeError(r) + } + continue + case mapped, deviation: + b = append(b, s[k:start]...) + b = info(v).appendMapping(b, s[start:i]) + case ignored: + b = append(b, s[k:start]...) + // drop the rune + case unknown: + b = append(b, s[k:start]...) + b = append(b, "\ufffd"...) + } + k = i + } + if k == 0 { + // No changes so far. + if combinedInfoBits&mayNeedNorm != 0 { + s = norm.NFC.String(s) + } + } else { + b = append(b, s[k:]...) + if norm.NFC.QuickSpan(b) != len(b) { + b = norm.NFC.Bytes(b) + } + // TODO: the punycode converters require strings as input. + s = string(b) + } + return s, bidi, err +} + +// A labelIter allows iterating over domain name labels. +type labelIter struct { + orig string + slice []string + curStart int + curEnd int + i int +} + +func (l *labelIter) reset() { + l.curStart = 0 + l.curEnd = 0 + l.i = 0 +} + +func (l *labelIter) done() bool { + return l.curStart >= len(l.orig) +} + +func (l *labelIter) result() string { + if l.slice != nil { + return strings.Join(l.slice, ".") + } + return l.orig +} + +func (l *labelIter) label() string { + if l.slice != nil { + return l.slice[l.i] + } + p := strings.IndexByte(l.orig[l.curStart:], '.') + l.curEnd = l.curStart + p + if p == -1 { + l.curEnd = len(l.orig) + } + return l.orig[l.curStart:l.curEnd] +} + +// next sets the value to the next label. It skips the last label if it is empty. +func (l *labelIter) next() { + l.i++ + if l.slice != nil { + if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" { + l.curStart = len(l.orig) + } + } else { + l.curStart = l.curEnd + 1 + if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' { + l.curStart = len(l.orig) + } + } +} + +func (l *labelIter) set(s string) { + if l.slice == nil { + l.slice = strings.Split(l.orig, ".") + } + l.slice[l.i] = s +} + +// acePrefix is the ASCII Compatible Encoding prefix. +const acePrefix = "xn--" + +func (p *Profile) simplify(cat category) category { + switch cat { + case disallowedSTD3Mapped: + if p.useSTD3Rules { + cat = disallowed + } else { + cat = mapped + } + case disallowedSTD3Valid: + if p.useSTD3Rules { + cat = disallowed + } else { + cat = valid + } + case deviation: + if !p.transitional { + cat = valid + } + case validNV8, validXV8: + // TODO: handle V2008 + cat = valid + } + return cat +} + +func validateFromPunycode(p *Profile, s string) error { + if !norm.NFC.IsNormalString(s) { + return &labelError{s, "V1"} + } + // TODO: detect whether string may have to be normalized in the following + // loop. + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + if sz == 0 { + return runeError(utf8.RuneError) + } + if c := p.simplify(info(v).category()); c != valid && c != deviation { + return &labelError{s, "V6"} + } + i += sz + } + return nil +} + +const ( + zwnj = "\u200c" + zwj = "\u200d" +) + +type joinState int8 + +const ( + stateStart joinState = iota + stateVirama + stateBefore + stateBeforeVirama + stateAfter + stateFAIL +) + +var joinStates = [][numJoinTypes]joinState{ + stateStart: { + joiningL: stateBefore, + joiningD: stateBefore, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateVirama, + }, + stateVirama: { + joiningL: stateBefore, + joiningD: stateBefore, + }, + stateBefore: { + joiningL: stateBefore, + joiningD: stateBefore, + joiningT: stateBefore, + joinZWNJ: stateAfter, + joinZWJ: stateFAIL, + joinVirama: stateBeforeVirama, + }, + stateBeforeVirama: { + joiningL: stateBefore, + joiningD: stateBefore, + joiningT: stateBefore, + }, + stateAfter: { + joiningL: stateFAIL, + joiningD: stateBefore, + joiningT: stateAfter, + joiningR: stateStart, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateAfter, // no-op as we can't accept joiners here + }, + stateFAIL: { + 0: stateFAIL, + joiningL: stateFAIL, + joiningD: stateFAIL, + joiningT: stateFAIL, + joiningR: stateFAIL, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateFAIL, + }, +} + +// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are +// already implicitly satisfied by the overall implementation. +func (p *Profile) validateLabel(s string) (err error) { + if s == "" { + if p.verifyDNSLength { + return &labelError{s, "A4"} + } + return nil + } + if !p.validateLabels { + return nil + } + trie := p.trie // p.validateLabels is only set if trie is set. + if len(s) > 4 && s[2] == '-' && s[3] == '-' { + return &labelError{s, "V2"} + } + if s[0] == '-' || s[len(s)-1] == '-' { + return &labelError{s, "V3"} + } + // TODO: merge the use of this in the trie. + v, sz := trie.lookupString(s) + x := info(v) + if x.isModifier() { + return &labelError{s, "V5"} + } + // Quickly return in the absence of zero-width (non) joiners. + if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 { + return nil + } + st := stateStart + for i := 0; ; { + jt := x.joinType() + if s[i:i+sz] == zwj { + jt = joinZWJ + } else if s[i:i+sz] == zwnj { + jt = joinZWNJ + } + st = joinStates[st][jt] + if x.isViramaModifier() { + st = joinStates[st][joinVirama] + } + if i += sz; i == len(s) { + break + } + v, sz = trie.lookupString(s[i:]) + x = info(v) + } + if st == stateFAIL || st == stateAfter { + return &labelError{s, "C"} + } + return nil +} + +func ascii(s string) bool { + for i := 0; i < len(s); i++ { + if s[i] >= utf8.RuneSelf { + return false + } + } + return true +} diff --git a/vendor/golang.org/x/net/idna/idna9.0.0.go b/vendor/golang.org/x/net/idna/idna9.0.0.go new file mode 100644 index 00000000..8842146b --- /dev/null +++ b/vendor/golang.org/x/net/idna/idna9.0.0.go @@ -0,0 +1,682 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.10 + +// Package idna implements IDNA2008 using the compatibility processing +// defined by UTS (Unicode Technical Standard) #46, which defines a standard to +// deal with the transition from IDNA2003. +// +// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC +// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894. +// UTS #46 is defined in https://www.unicode.org/reports/tr46. +// See https://unicode.org/cldr/utility/idna.jsp for a visualization of the +// differences between these two standards. +package idna // import "golang.org/x/net/idna" + +import ( + "fmt" + "strings" + "unicode/utf8" + + "golang.org/x/text/secure/bidirule" + "golang.org/x/text/unicode/norm" +) + +// NOTE: Unlike common practice in Go APIs, the functions will return a +// sanitized domain name in case of errors. Browsers sometimes use a partially +// evaluated string as lookup. +// TODO: the current error handling is, in my opinion, the least opinionated. +// Other strategies are also viable, though: +// Option 1) Return an empty string in case of error, but allow the user to +// specify explicitly which errors to ignore. +// Option 2) Return the partially evaluated string if it is itself a valid +// string, otherwise return the empty string in case of error. +// Option 3) Option 1 and 2. +// Option 4) Always return an empty string for now and implement Option 1 as +// needed, and document that the return string may not be empty in case of +// error in the future. +// I think Option 1 is best, but it is quite opinionated. + +// ToASCII is a wrapper for Punycode.ToASCII. +func ToASCII(s string) (string, error) { + return Punycode.process(s, true) +} + +// ToUnicode is a wrapper for Punycode.ToUnicode. +func ToUnicode(s string) (string, error) { + return Punycode.process(s, false) +} + +// An Option configures a Profile at creation time. +type Option func(*options) + +// Transitional sets a Profile to use the Transitional mapping as defined in UTS +// #46. This will cause, for example, "ß" to be mapped to "ss". Using the +// transitional mapping provides a compromise between IDNA2003 and IDNA2008 +// compatibility. It is used by most browsers when resolving domain names. This +// option is only meaningful if combined with MapForLookup. +func Transitional(transitional bool) Option { + return func(o *options) { o.transitional = true } +} + +// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts +// are longer than allowed by the RFC. +func VerifyDNSLength(verify bool) Option { + return func(o *options) { o.verifyDNSLength = verify } +} + +// RemoveLeadingDots removes leading label separators. Leading runes that map to +// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well. +// +// This is the behavior suggested by the UTS #46 and is adopted by some +// browsers. +func RemoveLeadingDots(remove bool) Option { + return func(o *options) { o.removeLeadingDots = remove } +} + +// ValidateLabels sets whether to check the mandatory label validation criteria +// as defined in Section 5.4 of RFC 5891. This includes testing for correct use +// of hyphens ('-'), normalization, validity of runes, and the context rules. +func ValidateLabels(enable bool) Option { + return func(o *options) { + // Don't override existing mappings, but set one that at least checks + // normalization if it is not set. + if o.mapping == nil && enable { + o.mapping = normalize + } + o.trie = trie + o.validateLabels = enable + o.fromPuny = validateFromPunycode + } +} + +// StrictDomainName limits the set of permissable ASCII characters to those +// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the +// hyphen). This is set by default for MapForLookup and ValidateForRegistration. +// +// This option is useful, for instance, for browsers that allow characters +// outside this range, for example a '_' (U+005F LOW LINE). See +// http://www.rfc-editor.org/std/std3.txt for more details This option +// corresponds to the UseSTD3ASCIIRules option in UTS #46. +func StrictDomainName(use bool) Option { + return func(o *options) { + o.trie = trie + o.useSTD3Rules = use + o.fromPuny = validateFromPunycode + } +} + +// NOTE: the following options pull in tables. The tables should not be linked +// in as long as the options are not used. + +// BidiRule enables the Bidi rule as defined in RFC 5893. Any application +// that relies on proper validation of labels should include this rule. +func BidiRule() Option { + return func(o *options) { o.bidirule = bidirule.ValidString } +} + +// ValidateForRegistration sets validation options to verify that a given IDN is +// properly formatted for registration as defined by Section 4 of RFC 5891. +func ValidateForRegistration() Option { + return func(o *options) { + o.mapping = validateRegistration + StrictDomainName(true)(o) + ValidateLabels(true)(o) + VerifyDNSLength(true)(o) + BidiRule()(o) + } +} + +// MapForLookup sets validation and mapping options such that a given IDN is +// transformed for domain name lookup according to the requirements set out in +// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894, +// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option +// to add this check. +// +// The mappings include normalization and mapping case, width and other +// compatibility mappings. +func MapForLookup() Option { + return func(o *options) { + o.mapping = validateAndMap + StrictDomainName(true)(o) + ValidateLabels(true)(o) + RemoveLeadingDots(true)(o) + } +} + +type options struct { + transitional bool + useSTD3Rules bool + validateLabels bool + verifyDNSLength bool + removeLeadingDots bool + + trie *idnaTrie + + // fromPuny calls validation rules when converting A-labels to U-labels. + fromPuny func(p *Profile, s string) error + + // mapping implements a validation and mapping step as defined in RFC 5895 + // or UTS 46, tailored to, for example, domain registration or lookup. + mapping func(p *Profile, s string) (string, error) + + // bidirule, if specified, checks whether s conforms to the Bidi Rule + // defined in RFC 5893. + bidirule func(s string) bool +} + +// A Profile defines the configuration of a IDNA mapper. +type Profile struct { + options +} + +func apply(o *options, opts []Option) { + for _, f := range opts { + f(o) + } +} + +// New creates a new Profile. +// +// With no options, the returned Profile is the most permissive and equals the +// Punycode Profile. Options can be passed to further restrict the Profile. The +// MapForLookup and ValidateForRegistration options set a collection of options, +// for lookup and registration purposes respectively, which can be tailored by +// adding more fine-grained options, where later options override earlier +// options. +func New(o ...Option) *Profile { + p := &Profile{} + apply(&p.options, o) + return p +} + +// ToASCII converts a domain or domain label to its ASCII form. For example, +// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and +// ToASCII("golang") is "golang". If an error is encountered it will return +// an error and a (partially) processed result. +func (p *Profile) ToASCII(s string) (string, error) { + return p.process(s, true) +} + +// ToUnicode converts a domain or domain label to its Unicode form. For example, +// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and +// ToUnicode("golang") is "golang". If an error is encountered it will return +// an error and a (partially) processed result. +func (p *Profile) ToUnicode(s string) (string, error) { + pp := *p + pp.transitional = false + return pp.process(s, false) +} + +// String reports a string with a description of the profile for debugging +// purposes. The string format may change with different versions. +func (p *Profile) String() string { + s := "" + if p.transitional { + s = "Transitional" + } else { + s = "NonTransitional" + } + if p.useSTD3Rules { + s += ":UseSTD3Rules" + } + if p.validateLabels { + s += ":ValidateLabels" + } + if p.verifyDNSLength { + s += ":VerifyDNSLength" + } + return s +} + +var ( + // Punycode is a Profile that does raw punycode processing with a minimum + // of validation. + Punycode *Profile = punycode + + // Lookup is the recommended profile for looking up domain names, according + // to Section 5 of RFC 5891. The exact configuration of this profile may + // change over time. + Lookup *Profile = lookup + + // Display is the recommended profile for displaying domain names. + // The configuration of this profile may change over time. + Display *Profile = display + + // Registration is the recommended profile for checking whether a given + // IDN is valid for registration, according to Section 4 of RFC 5891. + Registration *Profile = registration + + punycode = &Profile{} + lookup = &Profile{options{ + transitional: true, + useSTD3Rules: true, + validateLabels: true, + removeLeadingDots: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, + }} + display = &Profile{options{ + useSTD3Rules: true, + validateLabels: true, + removeLeadingDots: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, + }} + registration = &Profile{options{ + useSTD3Rules: true, + validateLabels: true, + verifyDNSLength: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateRegistration, + bidirule: bidirule.ValidString, + }} + + // TODO: profiles + // Register: recommended for approving domain names: don't do any mappings + // but rather reject on invalid input. Bundle or block deviation characters. +) + +type labelError struct{ label, code_ string } + +func (e labelError) code() string { return e.code_ } +func (e labelError) Error() string { + return fmt.Sprintf("idna: invalid label %q", e.label) +} + +type runeError rune + +func (e runeError) code() string { return "P1" } +func (e runeError) Error() string { + return fmt.Sprintf("idna: disallowed rune %U", e) +} + +// process implements the algorithm described in section 4 of UTS #46, +// see https://www.unicode.org/reports/tr46. +func (p *Profile) process(s string, toASCII bool) (string, error) { + var err error + if p.mapping != nil { + s, err = p.mapping(p, s) + } + // Remove leading empty labels. + if p.removeLeadingDots { + for ; len(s) > 0 && s[0] == '.'; s = s[1:] { + } + } + // It seems like we should only create this error on ToASCII, but the + // UTS 46 conformance tests suggests we should always check this. + if err == nil && p.verifyDNSLength && s == "" { + err = &labelError{s, "A4"} + } + labels := labelIter{orig: s} + for ; !labels.done(); labels.next() { + label := labels.label() + if label == "" { + // Empty labels are not okay. The label iterator skips the last + // label if it is empty. + if err == nil && p.verifyDNSLength { + err = &labelError{s, "A4"} + } + continue + } + if strings.HasPrefix(label, acePrefix) { + u, err2 := decode(label[len(acePrefix):]) + if err2 != nil { + if err == nil { + err = err2 + } + // Spec says keep the old label. + continue + } + labels.set(u) + if err == nil && p.validateLabels { + err = p.fromPuny(p, u) + } + if err == nil { + // This should be called on NonTransitional, according to the + // spec, but that currently does not have any effect. Use the + // original profile to preserve options. + err = p.validateLabel(u) + } + } else if err == nil { + err = p.validateLabel(label) + } + } + if toASCII { + for labels.reset(); !labels.done(); labels.next() { + label := labels.label() + if !ascii(label) { + a, err2 := encode(acePrefix, label) + if err == nil { + err = err2 + } + label = a + labels.set(a) + } + n := len(label) + if p.verifyDNSLength && err == nil && (n == 0 || n > 63) { + err = &labelError{label, "A4"} + } + } + } + s = labels.result() + if toASCII && p.verifyDNSLength && err == nil { + // Compute the length of the domain name minus the root label and its dot. + n := len(s) + if n > 0 && s[n-1] == '.' { + n-- + } + if len(s) < 1 || n > 253 { + err = &labelError{s, "A4"} + } + } + return s, err +} + +func normalize(p *Profile, s string) (string, error) { + return norm.NFC.String(s), nil +} + +func validateRegistration(p *Profile, s string) (string, error) { + if !norm.NFC.IsNormalString(s) { + return s, &labelError{s, "V1"} + } + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + // Copy bytes not copied so far. + switch p.simplify(info(v).category()) { + // TODO: handle the NV8 defined in the Unicode idna data set to allow + // for strict conformance to IDNA2008. + case valid, deviation: + case disallowed, mapped, unknown, ignored: + r, _ := utf8.DecodeRuneInString(s[i:]) + return s, runeError(r) + } + i += sz + } + return s, nil +} + +func validateAndMap(p *Profile, s string) (string, error) { + var ( + err error + b []byte + k int + ) + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + start := i + i += sz + // Copy bytes not copied so far. + switch p.simplify(info(v).category()) { + case valid: + continue + case disallowed: + if err == nil { + r, _ := utf8.DecodeRuneInString(s[start:]) + err = runeError(r) + } + continue + case mapped, deviation: + b = append(b, s[k:start]...) + b = info(v).appendMapping(b, s[start:i]) + case ignored: + b = append(b, s[k:start]...) + // drop the rune + case unknown: + b = append(b, s[k:start]...) + b = append(b, "\ufffd"...) + } + k = i + } + if k == 0 { + // No changes so far. + s = norm.NFC.String(s) + } else { + b = append(b, s[k:]...) + if norm.NFC.QuickSpan(b) != len(b) { + b = norm.NFC.Bytes(b) + } + // TODO: the punycode converters require strings as input. + s = string(b) + } + return s, err +} + +// A labelIter allows iterating over domain name labels. +type labelIter struct { + orig string + slice []string + curStart int + curEnd int + i int +} + +func (l *labelIter) reset() { + l.curStart = 0 + l.curEnd = 0 + l.i = 0 +} + +func (l *labelIter) done() bool { + return l.curStart >= len(l.orig) +} + +func (l *labelIter) result() string { + if l.slice != nil { + return strings.Join(l.slice, ".") + } + return l.orig +} + +func (l *labelIter) label() string { + if l.slice != nil { + return l.slice[l.i] + } + p := strings.IndexByte(l.orig[l.curStart:], '.') + l.curEnd = l.curStart + p + if p == -1 { + l.curEnd = len(l.orig) + } + return l.orig[l.curStart:l.curEnd] +} + +// next sets the value to the next label. It skips the last label if it is empty. +func (l *labelIter) next() { + l.i++ + if l.slice != nil { + if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" { + l.curStart = len(l.orig) + } + } else { + l.curStart = l.curEnd + 1 + if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' { + l.curStart = len(l.orig) + } + } +} + +func (l *labelIter) set(s string) { + if l.slice == nil { + l.slice = strings.Split(l.orig, ".") + } + l.slice[l.i] = s +} + +// acePrefix is the ASCII Compatible Encoding prefix. +const acePrefix = "xn--" + +func (p *Profile) simplify(cat category) category { + switch cat { + case disallowedSTD3Mapped: + if p.useSTD3Rules { + cat = disallowed + } else { + cat = mapped + } + case disallowedSTD3Valid: + if p.useSTD3Rules { + cat = disallowed + } else { + cat = valid + } + case deviation: + if !p.transitional { + cat = valid + } + case validNV8, validXV8: + // TODO: handle V2008 + cat = valid + } + return cat +} + +func validateFromPunycode(p *Profile, s string) error { + if !norm.NFC.IsNormalString(s) { + return &labelError{s, "V1"} + } + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + if c := p.simplify(info(v).category()); c != valid && c != deviation { + return &labelError{s, "V6"} + } + i += sz + } + return nil +} + +const ( + zwnj = "\u200c" + zwj = "\u200d" +) + +type joinState int8 + +const ( + stateStart joinState = iota + stateVirama + stateBefore + stateBeforeVirama + stateAfter + stateFAIL +) + +var joinStates = [][numJoinTypes]joinState{ + stateStart: { + joiningL: stateBefore, + joiningD: stateBefore, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateVirama, + }, + stateVirama: { + joiningL: stateBefore, + joiningD: stateBefore, + }, + stateBefore: { + joiningL: stateBefore, + joiningD: stateBefore, + joiningT: stateBefore, + joinZWNJ: stateAfter, + joinZWJ: stateFAIL, + joinVirama: stateBeforeVirama, + }, + stateBeforeVirama: { + joiningL: stateBefore, + joiningD: stateBefore, + joiningT: stateBefore, + }, + stateAfter: { + joiningL: stateFAIL, + joiningD: stateBefore, + joiningT: stateAfter, + joiningR: stateStart, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateAfter, // no-op as we can't accept joiners here + }, + stateFAIL: { + 0: stateFAIL, + joiningL: stateFAIL, + joiningD: stateFAIL, + joiningT: stateFAIL, + joiningR: stateFAIL, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateFAIL, + }, +} + +// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are +// already implicitly satisfied by the overall implementation. +func (p *Profile) validateLabel(s string) error { + if s == "" { + if p.verifyDNSLength { + return &labelError{s, "A4"} + } + return nil + } + if p.bidirule != nil && !p.bidirule(s) { + return &labelError{s, "B"} + } + if !p.validateLabels { + return nil + } + trie := p.trie // p.validateLabels is only set if trie is set. + if len(s) > 4 && s[2] == '-' && s[3] == '-' { + return &labelError{s, "V2"} + } + if s[0] == '-' || s[len(s)-1] == '-' { + return &labelError{s, "V3"} + } + // TODO: merge the use of this in the trie. + v, sz := trie.lookupString(s) + x := info(v) + if x.isModifier() { + return &labelError{s, "V5"} + } + // Quickly return in the absence of zero-width (non) joiners. + if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 { + return nil + } + st := stateStart + for i := 0; ; { + jt := x.joinType() + if s[i:i+sz] == zwj { + jt = joinZWJ + } else if s[i:i+sz] == zwnj { + jt = joinZWNJ + } + st = joinStates[st][jt] + if x.isViramaModifier() { + st = joinStates[st][joinVirama] + } + if i += sz; i == len(s) { + break + } + v, sz = trie.lookupString(s[i:]) + x = info(v) + } + if st == stateFAIL || st == stateAfter { + return &labelError{s, "C"} + } + return nil +} + +func ascii(s string) bool { + for i := 0; i < len(s); i++ { + if s[i] >= utf8.RuneSelf { + return false + } + } + return true +} diff --git a/vendor/golang.org/x/net/idna/punycode.go b/vendor/golang.org/x/net/idna/punycode.go new file mode 100644 index 00000000..02c7d59a --- /dev/null +++ b/vendor/golang.org/x/net/idna/punycode.go @@ -0,0 +1,203 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package idna + +// This file implements the Punycode algorithm from RFC 3492. + +import ( + "math" + "strings" + "unicode/utf8" +) + +// These parameter values are specified in section 5. +// +// All computation is done with int32s, so that overflow behavior is identical +// regardless of whether int is 32-bit or 64-bit. +const ( + base int32 = 36 + damp int32 = 700 + initialBias int32 = 72 + initialN int32 = 128 + skew int32 = 38 + tmax int32 = 26 + tmin int32 = 1 +) + +func punyError(s string) error { return &labelError{s, "A3"} } + +// decode decodes a string as specified in section 6.2. +func decode(encoded string) (string, error) { + if encoded == "" { + return "", nil + } + pos := 1 + strings.LastIndex(encoded, "-") + if pos == 1 { + return "", punyError(encoded) + } + if pos == len(encoded) { + return encoded[:len(encoded)-1], nil + } + output := make([]rune, 0, len(encoded)) + if pos != 0 { + for _, r := range encoded[:pos-1] { + output = append(output, r) + } + } + i, n, bias := int32(0), initialN, initialBias + for pos < len(encoded) { + oldI, w := i, int32(1) + for k := base; ; k += base { + if pos == len(encoded) { + return "", punyError(encoded) + } + digit, ok := decodeDigit(encoded[pos]) + if !ok { + return "", punyError(encoded) + } + pos++ + i += digit * w + if i < 0 { + return "", punyError(encoded) + } + t := k - bias + if t < tmin { + t = tmin + } else if t > tmax { + t = tmax + } + if digit < t { + break + } + w *= base - t + if w >= math.MaxInt32/base { + return "", punyError(encoded) + } + } + x := int32(len(output) + 1) + bias = adapt(i-oldI, x, oldI == 0) + n += i / x + i %= x + if n > utf8.MaxRune || len(output) >= 1024 { + return "", punyError(encoded) + } + output = append(output, 0) + copy(output[i+1:], output[i:]) + output[i] = n + i++ + } + return string(output), nil +} + +// encode encodes a string as specified in section 6.3 and prepends prefix to +// the result. +// +// The "while h < length(input)" line in the specification becomes "for +// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes. +func encode(prefix, s string) (string, error) { + output := make([]byte, len(prefix), len(prefix)+1+2*len(s)) + copy(output, prefix) + delta, n, bias := int32(0), initialN, initialBias + b, remaining := int32(0), int32(0) + for _, r := range s { + if r < 0x80 { + b++ + output = append(output, byte(r)) + } else { + remaining++ + } + } + h := b + if b > 0 { + output = append(output, '-') + } + for remaining != 0 { + m := int32(0x7fffffff) + for _, r := range s { + if m > r && r >= n { + m = r + } + } + delta += (m - n) * (h + 1) + if delta < 0 { + return "", punyError(s) + } + n = m + for _, r := range s { + if r < n { + delta++ + if delta < 0 { + return "", punyError(s) + } + continue + } + if r > n { + continue + } + q := delta + for k := base; ; k += base { + t := k - bias + if t < tmin { + t = tmin + } else if t > tmax { + t = tmax + } + if q < t { + break + } + output = append(output, encodeDigit(t+(q-t)%(base-t))) + q = (q - t) / (base - t) + } + output = append(output, encodeDigit(q)) + bias = adapt(delta, h+1, h == b) + delta = 0 + h++ + remaining-- + } + delta++ + n++ + } + return string(output), nil +} + +func decodeDigit(x byte) (digit int32, ok bool) { + switch { + case '0' <= x && x <= '9': + return int32(x - ('0' - 26)), true + case 'A' <= x && x <= 'Z': + return int32(x - 'A'), true + case 'a' <= x && x <= 'z': + return int32(x - 'a'), true + } + return 0, false +} + +func encodeDigit(digit int32) byte { + switch { + case 0 <= digit && digit < 26: + return byte(digit + 'a') + case 26 <= digit && digit < 36: + return byte(digit + ('0' - 26)) + } + panic("idna: internal error in punycode encoding") +} + +// adapt is the bias adaptation function specified in section 6.1. +func adapt(delta, numPoints int32, firstTime bool) int32 { + if firstTime { + delta /= damp + } else { + delta /= 2 + } + delta += delta / numPoints + k := int32(0) + for delta > ((base-tmin)*tmax)/2 { + delta /= base - tmin + k += base + } + return k + (base-tmin+1)*delta/(delta+skew) +} diff --git a/vendor/golang.org/x/net/idna/tables10.0.0.go b/vendor/golang.org/x/net/idna/tables10.0.0.go new file mode 100644 index 00000000..54fddb4b --- /dev/null +++ b/vendor/golang.org/x/net/idna/tables10.0.0.go @@ -0,0 +1,4559 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// +build go1.10,!go1.13 + +package idna + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "10.0.0" + +var mappings string = "" + // Size: 8175 bytes + "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + + "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + + "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + + "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + + "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + + "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + + "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + + "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + + "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + + "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + + "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + + "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + + "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + + "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + + "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + + "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + + "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + + "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + + "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + + "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + + "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + + "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + + "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + + "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + + "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + + "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + + ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + + "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + + "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + + "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + + "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + + "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + + "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + + "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + + "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + + "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" + + "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" + + "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" + + "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" + + "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" + + "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" + + "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" + + "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" + + "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" + + "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" + + "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + + "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + + "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + + "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + + "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + + "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + + "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + + "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + + "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + + "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + + "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + + "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" + + "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" + + "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" + + "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" + + "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" + + "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" + + "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" + + "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" + + "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" + + "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" + + "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" + + "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" + + "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" + + "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" + + "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" + + "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" + + "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" + + " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" + + "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" + + "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" + + "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" + + "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" + + "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" + + "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" + + "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" + + "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" + + "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" + + "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" + + "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" + + "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" + + "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" + + "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" + + "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" + + "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" + + "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" + + "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" + + "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" + + "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" + + "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" + + "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" + + "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" + + "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" + + "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" + + "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" + + "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" + + "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" + + "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" + + "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" + + "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" + + "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" + + "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" + + "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" + + "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" + + "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" + + "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" + + "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" + + "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" + + "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" + + "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" + + "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" + + "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" + + "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" + + "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" + + "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" + + "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" + + "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" + + "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" + + "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" + + "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" + + "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" + + "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" + + "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" + + "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" + + "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" + + "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" + + "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" + + "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" + + "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" + + "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" + + "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" + + "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" + +var xorData string = "" + // Size: 4855 bytes + "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + + "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + + "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + + "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + + "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + + "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + + "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + + "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + + "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + + "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" + + "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" + + "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" + + "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" + + "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" + + "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" + + "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" + + "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" + + "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" + + "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" + + "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" + + "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" + + "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" + + "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" + + "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" + + "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" + + "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" + + "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" + + "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" + + "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" + + "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" + + "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" + + "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" + + "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" + + "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" + + "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" + + "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" + + "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " + + "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" + + "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" + + "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" + + "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" + + "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" + + ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" + + "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" + + "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" + + "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" + + "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" + + "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" + + "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" + + "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" + + "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" + + "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" + + "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" + + "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" + + "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" + + "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" + + "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" + + "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" + + "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" + + "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" + + "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" + + "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + + "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + + "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + + "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + + "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + + "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + + "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + + "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + + "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + + "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + + "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + + "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + + "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + + "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + + "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + + "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + + "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + + "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + + "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + + "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + + "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + + "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + + "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + + "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + + "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + + "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + + "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + + "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + + "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + + "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + + "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + + "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + + ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + + "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + + "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + + "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + + "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + + "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + + "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + + "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + + "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + + "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + + "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + + "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + + "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" + + "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" + + "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" + + "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" + + "\x08\x1a\x0a\x03\x07\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" + + "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" + + "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" + + "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" + + "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" + + "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" + + "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" + + "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" + + "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" + + "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" + + "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" + + "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" + + "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" + + "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" + + "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" + + "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" + + "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" + + "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." + + "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + + "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + + "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + + "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + + "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + + "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + + "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + + "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + + "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + + "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + + "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + + "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + + "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + + "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + + "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + + "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + + "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + + "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + + "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + + "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + + "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + + "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + + "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + + "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + + "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + + "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + + "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + + "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + + "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + + "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + + "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + + "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + + "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + + "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + + "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + + "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + + "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + + "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + + "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + + "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + + "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + + "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + + "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + + "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + + "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + + "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + + "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + + "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + + "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + + "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + + "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + + "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + + "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + + "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + + "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + + "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + + "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + + "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + + "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + + "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + + "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + + "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + + "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + + "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + + "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + + "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + + "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + + "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + + "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + + "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + + "\x04\x03\x0c?\x05\x03\x0c" + + "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + + "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + + "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + + "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + + "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + + "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" + + "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" + + "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" + + "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" + + "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" + + "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" + + "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" + + "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" + + "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" + + "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" + + "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" + + "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" + + "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" + + "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" + + "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" + + "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" + + "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" + + "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" + + "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" + + "\x05\x22\x05\x03\x050\x1d" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// idnaTrie. Total size: 29052 bytes (28.37 KiB). Checksum: ef06e7ecc26f36dd. +type idnaTrie struct{} + +func newIdnaTrie(i int) *idnaTrie { + return &idnaTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 125: + return uint16(idnaValues[n<<6+uint32(b)]) + default: + n -= 125 + return uint16(idnaSparse.lookup(n, b)) + } +} + +// idnaValues: 127 blocks, 8128 entries, 16256 bytes +// The third block is the zero block. +var idnaValues = [8128]uint16{ + // Block 0x0, offset 0x0 + 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, + 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, + 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, + 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, + 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, + 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, + 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, + 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, + 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, + 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, + 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, + // Block 0x1, offset 0x40 + 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, + 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, + 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, + 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, + 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, + 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, + 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, + 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, + 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, + 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, + 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, + 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, + 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, + 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, + 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, + 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, + 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, + 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, + 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, + // Block 0x4, offset 0x100 + 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, + 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, + 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, + 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, + 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, + 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, + 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, + 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, + 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, + 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, + 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, + // Block 0x5, offset 0x140 + 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, + 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, + 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, + 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, + 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, + 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, + 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, + 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, + 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, + 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, + // Block 0x6, offset 0x180 + 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, + 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, + 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, + 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, + 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, + 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, + 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, + 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, + 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, + 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, + 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, + 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, + 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, + 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, + 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, + 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, + 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, + 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, + 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, + 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, + 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, + // Block 0x8, offset 0x200 + 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, + 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, + 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, + 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, + 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, + 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, + 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, + 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, + 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, + 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, + // Block 0x9, offset 0x240 + 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, + 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, + 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, + 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, + 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, + 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, + 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, + 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, + 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, + 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, + // Block 0xa, offset 0x280 + 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, + 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308, + 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308, + 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308, + 0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308, + 0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308, + 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308, + 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308, + 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, + 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, + 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, + 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, + 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, + 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, + 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, + 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, + 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, + 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, + 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, + // Block 0xc, offset 0x300 + 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, + 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, + 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, + 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, + 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, + 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, + 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, + 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, + 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, + 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, + 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, + // Block 0xd, offset 0x340 + 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, + 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, + 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, + 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, + 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, + 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, + 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, + 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, + 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, + 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, + 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, + // Block 0xe, offset 0x380 + 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308, + 0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008, + 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, + 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, + 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, + 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, + 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, + 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, + 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, + 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, + 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, + 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, + 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, + 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, + 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, + 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, + 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, + 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, + 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, + 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, + 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, + // Block 0x10, offset 0x400 + 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, + 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, + 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, + 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, + 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, + 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, + 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, + 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, + 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, + 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, + 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, + // Block 0x11, offset 0x440 + 0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840, + 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818, + 0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308, + 0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308, + 0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040, + 0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08, + 0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08, + 0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08, + 0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08, + 0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08, + 0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08, + // Block 0x12, offset 0x480 + 0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08, + 0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308, + 0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308, + 0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308, + 0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308, + 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808, + 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808, + 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08, + 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429, + 0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, + 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08, + 0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08, + 0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08, + 0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308, + 0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840, + 0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308, + 0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018, + 0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08, + 0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008, + 0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08, + 0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08, + // Block 0x14, offset 0x500 + 0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818, + 0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818, + 0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308, + 0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08, + 0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08, + 0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08, + 0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08, + 0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08, + 0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308, + 0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308, + 0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308, + // Block 0x15, offset 0x540 + 0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08, + 0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08, + 0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08, + 0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0808, 0x557: 0x0808, + 0x558: 0x0808, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040, + 0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08, + 0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08, + 0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040, + 0x570: 0x0040, 0x571: 0x0040, 0x572: 0x0040, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040, + 0x576: 0x0040, 0x577: 0x0040, 0x578: 0x0040, 0x579: 0x0040, 0x57a: 0x0040, 0x57b: 0x0040, + 0x57c: 0x0040, 0x57d: 0x0040, 0x57e: 0x0040, 0x57f: 0x0040, + // Block 0x16, offset 0x580 + 0x580: 0x3008, 0x581: 0x3308, 0x582: 0x3308, 0x583: 0x3308, 0x584: 0x3308, 0x585: 0x3308, + 0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008, + 0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308, + 0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308, + 0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1, + 0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308, + 0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, + 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, + 0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008, + 0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008, + 0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0008, 0x5c1: 0x3308, 0x5c2: 0x3008, 0x5c3: 0x3008, 0x5c4: 0x0040, 0x5c5: 0x0008, + 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0008, + 0x5cc: 0x0008, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040, + 0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008, + 0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008, + 0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008, + 0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040, + 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, + 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0040, 0x5f4: 0x0040, 0x5f5: 0x0040, + 0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040, + 0x5fc: 0x3308, 0x5fd: 0x0008, 0x5fe: 0x3008, 0x5ff: 0x3008, + // Block 0x18, offset 0x600 + 0x600: 0x3008, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3308, 0x604: 0x3308, 0x605: 0x0040, + 0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008, + 0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040, + 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008, + 0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1, + 0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308, + 0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, + 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, + 0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018, + 0x636: 0x0018, 0x637: 0x0018, 0x638: 0x0018, 0x639: 0x0018, 0x63a: 0x0018, 0x63b: 0x0018, + 0x63c: 0x0008, 0x63d: 0x0018, 0x63e: 0x0040, 0x63f: 0x0040, + // Block 0x19, offset 0x640 + 0x640: 0x0040, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3008, 0x644: 0x0040, 0x645: 0x0008, + 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0040, + 0x64c: 0x0040, 0x64d: 0x0040, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0040, + 0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008, + 0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008, + 0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008, + 0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040, + 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, + 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008, + 0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, + 0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008, + // Block 0x1a, offset 0x680 + 0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040, + 0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308, + 0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308, + 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, + 0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040, + 0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040, + 0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008, + 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, + 0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308, + 0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0040, 0x6ba: 0x0040, 0x6bb: 0x0040, + 0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x0040, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3008, 0x6c4: 0x0040, 0x6c5: 0x0008, + 0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008, + 0x6cc: 0x0008, 0x6cd: 0x0008, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0008, + 0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008, + 0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008, + 0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008, + 0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040, + 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, + 0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008, + 0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040, + 0x6fc: 0x3308, 0x6fd: 0x0008, 0x6fe: 0x3008, 0x6ff: 0x3008, + // Block 0x1c, offset 0x700 + 0x700: 0x3008, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3308, 0x704: 0x3308, 0x705: 0x3308, + 0x706: 0x0040, 0x707: 0x3308, 0x708: 0x3308, 0x709: 0x3008, 0x70a: 0x0040, 0x70b: 0x3008, + 0x70c: 0x3008, 0x70d: 0x3b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0008, 0x711: 0x0040, + 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x0040, 0x717: 0x0040, + 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0040, 0x71d: 0x0040, + 0x71e: 0x0040, 0x71f: 0x0040, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x3308, 0x723: 0x3308, + 0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008, + 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, + 0x730: 0x0018, 0x731: 0x0018, 0x732: 0x0040, 0x733: 0x0040, 0x734: 0x0040, 0x735: 0x0040, + 0x736: 0x0040, 0x737: 0x0040, 0x738: 0x0040, 0x739: 0x0008, 0x73a: 0x3308, 0x73b: 0x3308, + 0x73c: 0x3308, 0x73d: 0x3308, 0x73e: 0x3308, 0x73f: 0x3308, + // Block 0x1d, offset 0x740 + 0x740: 0x0040, 0x741: 0x3308, 0x742: 0x3008, 0x743: 0x3008, 0x744: 0x0040, 0x745: 0x0008, + 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0008, + 0x74c: 0x0008, 0x74d: 0x0040, 0x74e: 0x0040, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040, + 0x752: 0x0040, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008, + 0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008, + 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008, + 0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0040, + 0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008, + 0x770: 0x0008, 0x771: 0x0040, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0040, 0x775: 0x0008, + 0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040, + 0x77c: 0x3308, 0x77d: 0x0008, 0x77e: 0x3008, 0x77f: 0x3308, + // Block 0x1e, offset 0x780 + 0x780: 0x3008, 0x781: 0x3308, 0x782: 0x3308, 0x783: 0x3308, 0x784: 0x3308, 0x785: 0x0040, + 0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008, + 0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, + 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x0040, 0x796: 0x3308, 0x797: 0x3008, + 0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9, + 0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308, + 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, + 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, + 0x7b0: 0x0018, 0x7b1: 0x0008, 0x7b2: 0x0018, 0x7b3: 0x0018, 0x7b4: 0x0018, 0x7b5: 0x0018, + 0x7b6: 0x0018, 0x7b7: 0x0018, 0x7b8: 0x0040, 0x7b9: 0x0040, 0x7ba: 0x0040, 0x7bb: 0x0040, + 0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x0040, 0x7bf: 0x0040, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0040, 0x7c1: 0x0040, 0x7c2: 0x3308, 0x7c3: 0x0008, 0x7c4: 0x0040, 0x7c5: 0x0008, + 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0040, + 0x7cc: 0x0040, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040, + 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0040, 0x7d7: 0x0040, + 0x7d8: 0x0040, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0008, 0x7dd: 0x0040, + 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0040, 0x7e1: 0x0040, 0x7e2: 0x0040, 0x7e3: 0x0008, + 0x7e4: 0x0008, 0x7e5: 0x0040, 0x7e6: 0x0040, 0x7e7: 0x0040, 0x7e8: 0x0008, 0x7e9: 0x0008, + 0x7ea: 0x0008, 0x7eb: 0x0040, 0x7ec: 0x0040, 0x7ed: 0x0040, 0x7ee: 0x0008, 0x7ef: 0x0008, + 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0008, 0x7f5: 0x0008, + 0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040, + 0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x3008, 0x7ff: 0x3008, + // Block 0x20, offset 0x800 + 0x800: 0x3308, 0x801: 0x3008, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x3008, 0x805: 0x0040, + 0x806: 0x3308, 0x807: 0x3308, 0x808: 0x3308, 0x809: 0x0040, 0x80a: 0x3308, 0x80b: 0x3308, + 0x80c: 0x3308, 0x80d: 0x3b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040, + 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x3308, 0x816: 0x3308, 0x817: 0x0040, + 0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040, + 0x81e: 0x0040, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x3308, 0x823: 0x3308, + 0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008, + 0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008, + 0x830: 0x0040, 0x831: 0x0040, 0x832: 0x0040, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040, + 0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0018, 0x839: 0x0018, 0x83a: 0x0018, 0x83b: 0x0018, + 0x83c: 0x0018, 0x83d: 0x0018, 0x83e: 0x0018, 0x83f: 0x0018, + // Block 0x21, offset 0x840 + 0x840: 0x0008, 0x841: 0x3308, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x0040, 0x845: 0x0008, + 0x846: 0x0008, 0x847: 0x0008, 0x848: 0x0008, 0x849: 0x0008, 0x84a: 0x0008, 0x84b: 0x0008, + 0x84c: 0x0008, 0x84d: 0x0040, 0x84e: 0x0008, 0x84f: 0x0008, 0x850: 0x0008, 0x851: 0x0040, + 0x852: 0x0008, 0x853: 0x0008, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x0008, + 0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0008, 0x85c: 0x0008, 0x85d: 0x0008, + 0x85e: 0x0008, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x0008, 0x863: 0x0008, + 0x864: 0x0008, 0x865: 0x0008, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0040, + 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, + 0x870: 0x0008, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0008, 0x874: 0x0040, 0x875: 0x0008, + 0x876: 0x0008, 0x877: 0x0008, 0x878: 0x0008, 0x879: 0x0008, 0x87a: 0x0040, 0x87b: 0x0040, + 0x87c: 0x3308, 0x87d: 0x0008, 0x87e: 0x3008, 0x87f: 0x3308, + // Block 0x22, offset 0x880 + 0x880: 0x3008, 0x881: 0x3008, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x3008, 0x885: 0x0040, + 0x886: 0x3308, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008, + 0x88c: 0x3308, 0x88d: 0x3b08, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040, + 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0040, 0x895: 0x3008, 0x896: 0x3008, 0x897: 0x0040, + 0x898: 0x0040, 0x899: 0x0040, 0x89a: 0x0040, 0x89b: 0x0040, 0x89c: 0x0040, 0x89d: 0x0040, + 0x89e: 0x0008, 0x89f: 0x0040, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308, + 0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008, + 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, + 0x8b0: 0x0040, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0040, 0x8b4: 0x0040, 0x8b5: 0x0040, + 0x8b6: 0x0040, 0x8b7: 0x0040, 0x8b8: 0x0040, 0x8b9: 0x0040, 0x8ba: 0x0040, 0x8bb: 0x0040, + 0x8bc: 0x0040, 0x8bd: 0x0040, 0x8be: 0x0040, 0x8bf: 0x0040, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x3008, 0x8c1: 0x3308, 0x8c2: 0x3308, 0x8c3: 0x3308, 0x8c4: 0x3308, 0x8c5: 0x0040, + 0x8c6: 0x3008, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008, + 0x8cc: 0x3008, 0x8cd: 0x3b08, 0x8ce: 0x0008, 0x8cf: 0x0018, 0x8d0: 0x0040, 0x8d1: 0x0040, + 0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x3008, + 0x8d8: 0x0018, 0x8d9: 0x0018, 0x8da: 0x0018, 0x8db: 0x0018, 0x8dc: 0x0018, 0x8dd: 0x0018, + 0x8de: 0x0018, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308, + 0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008, + 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008, + 0x8f0: 0x0018, 0x8f1: 0x0018, 0x8f2: 0x0018, 0x8f3: 0x0018, 0x8f4: 0x0018, 0x8f5: 0x0018, + 0x8f6: 0x0018, 0x8f7: 0x0018, 0x8f8: 0x0018, 0x8f9: 0x0018, 0x8fa: 0x0008, 0x8fb: 0x0008, + 0x8fc: 0x0008, 0x8fd: 0x0008, 0x8fe: 0x0008, 0x8ff: 0x0008, + // Block 0x24, offset 0x900 + 0x900: 0x0040, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0040, 0x904: 0x0008, 0x905: 0x0040, + 0x906: 0x0040, 0x907: 0x0008, 0x908: 0x0008, 0x909: 0x0040, 0x90a: 0x0008, 0x90b: 0x0040, + 0x90c: 0x0040, 0x90d: 0x0008, 0x90e: 0x0040, 0x90f: 0x0040, 0x910: 0x0040, 0x911: 0x0040, + 0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0008, + 0x918: 0x0040, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0008, 0x91d: 0x0008, + 0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0040, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008, + 0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0040, 0x929: 0x0040, + 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0040, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008, + 0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308, + 0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x0040, 0x93b: 0x3308, + 0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040, + // Block 0x25, offset 0x940 + 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008, + 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, + 0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, + 0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79, + 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008, + 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, + 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9, + 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040, + 0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59, + 0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308, + 0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008, + // Block 0x26, offset 0x980 + 0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018, + 0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008, + 0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308, + 0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308, + 0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11, + 0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308, + 0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308, + 0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308, + 0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308, + 0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308, + 0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, + 0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, + 0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008, + 0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008, + 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008, + 0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008, + 0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008, + 0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008, + 0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41, + 0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008, + 0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269, + // Block 0x28, offset 0xa00 + 0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1, + 0xa06: 0x059d, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011, + 0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041, + 0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05b5, 0xa15: 0x05b5, 0xa16: 0x0f99, 0xa17: 0x0fa9, + 0xa18: 0x0fb9, 0xa19: 0x059d, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05cd, 0xa1d: 0x1099, + 0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269, + 0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1, + 0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008, + 0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008, + 0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008, + 0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008, + // Block 0x29, offset 0xa40 + 0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008, + 0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008, + 0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008, + 0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, + 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169, + 0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9, + 0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05e5, 0xa68: 0x1239, 0xa69: 0x1251, + 0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9, + 0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359, + 0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x05fd, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1, + 0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429, + // Block 0x2a, offset 0xa80 + 0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008, + 0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008, + 0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008, + 0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0xe00d, 0xa97: 0x0008, + 0xa98: 0xe00d, 0xa99: 0x0008, 0xa9a: 0xe00d, 0xa9b: 0x0008, 0xa9c: 0xe00d, 0xa9d: 0x0008, + 0xa9e: 0xe00d, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008, + 0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008, + 0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008, + 0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008, + 0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008, + 0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008, + // Block 0x2b, offset 0xac0 + 0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008, + 0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008, + 0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008, + 0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008, + 0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x0615, 0xadb: 0x0635, 0xadc: 0x0008, 0xadd: 0x0008, + 0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, + 0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008, + 0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008, + 0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008, + 0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008, + 0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008, + // Block 0x2c, offset 0xb00 + 0xb00: 0x0008, 0xb01: 0x0008, 0xb02: 0x0008, 0xb03: 0x0008, 0xb04: 0x0008, 0xb05: 0x0008, + 0xb06: 0x0040, 0xb07: 0x0040, 0xb08: 0xe045, 0xb09: 0xe045, 0xb0a: 0xe045, 0xb0b: 0xe045, + 0xb0c: 0xe045, 0xb0d: 0xe045, 0xb0e: 0x0040, 0xb0f: 0x0040, 0xb10: 0x0008, 0xb11: 0x0008, + 0xb12: 0x0008, 0xb13: 0x0008, 0xb14: 0x0008, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008, + 0xb18: 0x0040, 0xb19: 0xe045, 0xb1a: 0x0040, 0xb1b: 0xe045, 0xb1c: 0x0040, 0xb1d: 0xe045, + 0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008, + 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, + 0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045, + 0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489, + 0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1, + 0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040, + // Block 0x2d, offset 0xb40 + 0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1, + 0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591, + 0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1, + 0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1, + 0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771, + 0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891, + 0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831, + 0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951, + 0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040, + 0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x064d, 0xb7b: 0x1459, + 0xb7c: 0x19b1, 0xb7d: 0x0666, 0xb7e: 0x1a31, 0xb7f: 0x0686, + // Block 0x2e, offset 0xb80 + 0xb80: 0x06a6, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040, + 0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06c5, 0xb89: 0x1471, 0xb8a: 0x06dd, 0xb8b: 0x1489, + 0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008, + 0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008, + 0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x06f5, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2, + 0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61, + 0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045, + 0xbaa: 0x070d, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa, + 0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040, + 0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x0725, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9, + 0xbbc: 0x1ce9, 0xbbd: 0x073e, 0xbbe: 0x075e, 0xbbf: 0x0040, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a, + 0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0, + 0xbcc: 0x0003, 0xbcd: 0x0003, 0xbce: 0x0340, 0xbcf: 0x0b40, 0xbd0: 0x0018, 0xbd1: 0xe00d, + 0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x077e, + 0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018, + 0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, + 0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040, + 0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a, + 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018, + 0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, + 0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x079e, 0xbff: 0x0018, + // Block 0x30, offset 0xc00 + 0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018, + 0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018, + 0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018, + 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9, + 0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018, + 0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340, + 0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040, + 0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340, + 0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61, + 0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07bd, + 0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71, + // Block 0x31, offset 0xc40 + 0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61, + 0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07d5, + 0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09, + 0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359, + 0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040, + 0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018, + 0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018, + 0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018, + 0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018, + 0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018, + 0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018, + // Block 0x32, offset 0xc80 + 0xc80: 0x07ee, 0xc81: 0x080e, 0xc82: 0x1159, 0xc83: 0x082d, 0xc84: 0x0018, 0xc85: 0x084e, + 0xc86: 0x086e, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x088d, 0xc8a: 0x0f31, 0xc8b: 0x0249, + 0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41, + 0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018, + 0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269, + 0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08ad, 0xca2: 0x2061, 0xca3: 0x0018, + 0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018, + 0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09, + 0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9, + 0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08cd, + 0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x08ed, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9, + 0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018, + 0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151, + 0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279, + 0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399, + 0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x0905, 0xce3: 0x2439, + 0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x0925, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369, + 0xcea: 0x24a9, 0xceb: 0x0945, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61, + 0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x0965, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451, + 0xcf6: 0x0985, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09a5, + 0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61, + // Block 0x34, offset 0xd00 + 0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018, + 0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040, + 0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040, + 0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040, + 0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040, + 0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51, + 0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601, + 0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691, + 0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a06, 0xd35: 0x0a26, + 0xd36: 0x0a46, 0xd37: 0x0a66, 0xd38: 0x0a86, 0xd39: 0x0aa6, 0xd3a: 0x0ac6, 0xd3b: 0x0ae6, + 0xd3c: 0x0b06, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a, + // Block 0x35, offset 0xd40 + 0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a, + 0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040, + 0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040, + 0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040, + 0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b26, 0xd5d: 0x0b46, + 0xd5e: 0x0b66, 0xd5f: 0x0b86, 0xd60: 0x0ba6, 0xd61: 0x0bc6, 0xd62: 0x0be6, 0xd63: 0x0c06, + 0xd64: 0x0c26, 0xd65: 0x0c46, 0xd66: 0x0c66, 0xd67: 0x0c86, 0xd68: 0x0ca6, 0xd69: 0x0cc6, + 0xd6a: 0x0ce6, 0xd6b: 0x0d06, 0xd6c: 0x0d26, 0xd6d: 0x0d46, 0xd6e: 0x0d66, 0xd6f: 0x0d86, + 0xd70: 0x0da6, 0xd71: 0x0dc6, 0xd72: 0x0de6, 0xd73: 0x0e06, 0xd74: 0x0e26, 0xd75: 0x0e46, + 0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199, + 0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259, + // Block 0x36, offset 0xd80 + 0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99, + 0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089, + 0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9, + 0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249, + 0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71, + 0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9, + 0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1, + 0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018, + 0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018, + 0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, + 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0008, 0xdc1: 0x0008, 0xdc2: 0x0008, 0xdc3: 0x0008, 0xdc4: 0x0008, 0xdc5: 0x0008, + 0xdc6: 0x0008, 0xdc7: 0x0008, 0xdc8: 0x0008, 0xdc9: 0x0008, 0xdca: 0x0008, 0xdcb: 0x0008, + 0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008, + 0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008, + 0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008, + 0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ebd, + 0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d, + 0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9, + 0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d, + 0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008, + 0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9, + // Block 0x38, offset 0xe00 + 0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008, + 0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008, + 0xe0c: 0xe00d, 0xe0d: 0x0008, 0xe0e: 0xe00d, 0xe0f: 0x0008, 0xe10: 0xe00d, 0xe11: 0x0008, + 0xe12: 0xe00d, 0xe13: 0x0008, 0xe14: 0xe00d, 0xe15: 0x0008, 0xe16: 0xe00d, 0xe17: 0x0008, + 0xe18: 0xe00d, 0xe19: 0x0008, 0xe1a: 0xe00d, 0xe1b: 0x0008, 0xe1c: 0xe00d, 0xe1d: 0x0008, + 0xe1e: 0xe00d, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0xe00d, 0xe23: 0x0008, + 0xe24: 0x0008, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018, + 0xe2a: 0x0018, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0xe01d, 0xe2e: 0x0008, 0xe2f: 0x3308, + 0xe30: 0x3308, 0xe31: 0x3308, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0040, 0xe35: 0x0040, + 0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0018, 0xe3a: 0x0018, 0xe3b: 0x0018, + 0xe3c: 0x0018, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018, + // Block 0x39, offset 0xe40 + 0xe40: 0x26fd, 0xe41: 0x271d, 0xe42: 0x273d, 0xe43: 0x275d, 0xe44: 0x277d, 0xe45: 0x279d, + 0xe46: 0x27bd, 0xe47: 0x27dd, 0xe48: 0x27fd, 0xe49: 0x281d, 0xe4a: 0x283d, 0xe4b: 0x285d, + 0xe4c: 0x287d, 0xe4d: 0x289d, 0xe4e: 0x28bd, 0xe4f: 0x28dd, 0xe50: 0x28fd, 0xe51: 0x291d, + 0xe52: 0x293d, 0xe53: 0x295d, 0xe54: 0x297d, 0xe55: 0x299d, 0xe56: 0x0040, 0xe57: 0x0040, + 0xe58: 0x0040, 0xe59: 0x0040, 0xe5a: 0x0040, 0xe5b: 0x0040, 0xe5c: 0x0040, 0xe5d: 0x0040, + 0xe5e: 0x0040, 0xe5f: 0x0040, 0xe60: 0x0040, 0xe61: 0x0040, 0xe62: 0x0040, 0xe63: 0x0040, + 0xe64: 0x0040, 0xe65: 0x0040, 0xe66: 0x0040, 0xe67: 0x0040, 0xe68: 0x0040, 0xe69: 0x0040, + 0xe6a: 0x0040, 0xe6b: 0x0040, 0xe6c: 0x0040, 0xe6d: 0x0040, 0xe6e: 0x0040, 0xe6f: 0x0040, + 0xe70: 0x0040, 0xe71: 0x0040, 0xe72: 0x0040, 0xe73: 0x0040, 0xe74: 0x0040, 0xe75: 0x0040, + 0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040, + 0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040, + // Block 0x3a, offset 0xe80 + 0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008, + 0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018, + 0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018, + 0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018, + 0xe98: 0x0018, 0xe99: 0x0018, 0xe9a: 0x0018, 0xe9b: 0x0018, 0xe9c: 0x0018, 0xe9d: 0x0018, + 0xe9e: 0x0018, 0xe9f: 0x0018, 0xea0: 0x0018, 0xea1: 0x0018, 0xea2: 0x0018, 0xea3: 0x0018, + 0xea4: 0x0018, 0xea5: 0x0018, 0xea6: 0x0018, 0xea7: 0x0018, 0xea8: 0x0018, 0xea9: 0x0018, + 0xeaa: 0x3308, 0xeab: 0x3308, 0xeac: 0x3308, 0xead: 0x3308, 0xeae: 0x3018, 0xeaf: 0x3018, + 0xeb0: 0x0018, 0xeb1: 0x0018, 0xeb2: 0x0018, 0xeb3: 0x0018, 0xeb4: 0x0018, 0xeb5: 0x0018, + 0xeb6: 0xe125, 0xeb7: 0x0018, 0xeb8: 0x29bd, 0xeb9: 0x29dd, 0xeba: 0x29fd, 0xebb: 0x0018, + 0xebc: 0x0008, 0xebd: 0x0018, 0xebe: 0x0018, 0xebf: 0x0018, + // Block 0x3b, offset 0xec0 + 0xec0: 0x2b3d, 0xec1: 0x2b5d, 0xec2: 0x2b7d, 0xec3: 0x2b9d, 0xec4: 0x2bbd, 0xec5: 0x2bdd, + 0xec6: 0x2bdd, 0xec7: 0x2bdd, 0xec8: 0x2bfd, 0xec9: 0x2bfd, 0xeca: 0x2bfd, 0xecb: 0x2bfd, + 0xecc: 0x2c1d, 0xecd: 0x2c1d, 0xece: 0x2c1d, 0xecf: 0x2c3d, 0xed0: 0x2c5d, 0xed1: 0x2c5d, + 0xed2: 0x2a7d, 0xed3: 0x2a7d, 0xed4: 0x2c5d, 0xed5: 0x2c5d, 0xed6: 0x2c7d, 0xed7: 0x2c7d, + 0xed8: 0x2c5d, 0xed9: 0x2c5d, 0xeda: 0x2a7d, 0xedb: 0x2a7d, 0xedc: 0x2c5d, 0xedd: 0x2c5d, + 0xede: 0x2c3d, 0xedf: 0x2c3d, 0xee0: 0x2c9d, 0xee1: 0x2c9d, 0xee2: 0x2cbd, 0xee3: 0x2cbd, + 0xee4: 0x0040, 0xee5: 0x2cdd, 0xee6: 0x2cfd, 0xee7: 0x2d1d, 0xee8: 0x2d1d, 0xee9: 0x2d3d, + 0xeea: 0x2d5d, 0xeeb: 0x2d7d, 0xeec: 0x2d9d, 0xeed: 0x2dbd, 0xeee: 0x2ddd, 0xeef: 0x2dfd, + 0xef0: 0x2e1d, 0xef1: 0x2e3d, 0xef2: 0x2e3d, 0xef3: 0x2e5d, 0xef4: 0x2e7d, 0xef5: 0x2e7d, + 0xef6: 0x2e9d, 0xef7: 0x2ebd, 0xef8: 0x2e5d, 0xef9: 0x2edd, 0xefa: 0x2efd, 0xefb: 0x2edd, + 0xefc: 0x2e5d, 0xefd: 0x2f1d, 0xefe: 0x2f3d, 0xeff: 0x2f5d, + // Block 0x3c, offset 0xf00 + 0xf00: 0x2f7d, 0xf01: 0x2f9d, 0xf02: 0x2cfd, 0xf03: 0x2cdd, 0xf04: 0x2fbd, 0xf05: 0x2fdd, + 0xf06: 0x2ffd, 0xf07: 0x301d, 0xf08: 0x303d, 0xf09: 0x305d, 0xf0a: 0x307d, 0xf0b: 0x309d, + 0xf0c: 0x30bd, 0xf0d: 0x30dd, 0xf0e: 0x30fd, 0xf0f: 0x0040, 0xf10: 0x0018, 0xf11: 0x0018, + 0xf12: 0x311d, 0xf13: 0x313d, 0xf14: 0x315d, 0xf15: 0x317d, 0xf16: 0x319d, 0xf17: 0x31bd, + 0xf18: 0x31dd, 0xf19: 0x31fd, 0xf1a: 0x321d, 0xf1b: 0x323d, 0xf1c: 0x315d, 0xf1d: 0x325d, + 0xf1e: 0x327d, 0xf1f: 0x329d, 0xf20: 0x0008, 0xf21: 0x0008, 0xf22: 0x0008, 0xf23: 0x0008, + 0xf24: 0x0008, 0xf25: 0x0008, 0xf26: 0x0008, 0xf27: 0x0008, 0xf28: 0x0008, 0xf29: 0x0008, + 0xf2a: 0x0008, 0xf2b: 0x0008, 0xf2c: 0x0008, 0xf2d: 0x0008, 0xf2e: 0x0008, 0xf2f: 0x0008, + 0xf30: 0x0008, 0xf31: 0x0008, 0xf32: 0x0008, 0xf33: 0x0008, 0xf34: 0x0008, 0xf35: 0x0008, + 0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0040, + 0xf3c: 0x0040, 0xf3d: 0x0040, 0xf3e: 0x0040, 0xf3f: 0x0040, + // Block 0x3d, offset 0xf40 + 0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32bd, 0xf45: 0x32dd, + 0xf46: 0x32fd, 0xf47: 0x331d, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018, + 0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x333d, 0xf51: 0x3761, + 0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1, + 0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881, + 0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x335d, 0xf61: 0x337d, 0xf62: 0x339d, 0xf63: 0x33bd, + 0xf64: 0x33dd, 0xf65: 0x33dd, 0xf66: 0x33fd, 0xf67: 0x341d, 0xf68: 0x343d, 0xf69: 0x345d, + 0xf6a: 0x347d, 0xf6b: 0x349d, 0xf6c: 0x34bd, 0xf6d: 0x34dd, 0xf6e: 0x34fd, 0xf6f: 0x351d, + 0xf70: 0x353d, 0xf71: 0x355d, 0xf72: 0x357d, 0xf73: 0x359d, 0xf74: 0x35bd, 0xf75: 0x35dd, + 0xf76: 0x35fd, 0xf77: 0x361d, 0xf78: 0x363d, 0xf79: 0x365d, 0xf7a: 0x367d, 0xf7b: 0x369d, + 0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36bd, 0xf7f: 0x0018, + // Block 0x3e, offset 0xf80 + 0xf80: 0x36dd, 0xf81: 0x36fd, 0xf82: 0x371d, 0xf83: 0x373d, 0xf84: 0x375d, 0xf85: 0x377d, + 0xf86: 0x379d, 0xf87: 0x37bd, 0xf88: 0x37dd, 0xf89: 0x37fd, 0xf8a: 0x381d, 0xf8b: 0x383d, + 0xf8c: 0x385d, 0xf8d: 0x387d, 0xf8e: 0x389d, 0xf8f: 0x38bd, 0xf90: 0x38dd, 0xf91: 0x38fd, + 0xf92: 0x391d, 0xf93: 0x393d, 0xf94: 0x395d, 0xf95: 0x397d, 0xf96: 0x399d, 0xf97: 0x39bd, + 0xf98: 0x39dd, 0xf99: 0x39fd, 0xf9a: 0x3a1d, 0xf9b: 0x3a3d, 0xf9c: 0x3a5d, 0xf9d: 0x3a7d, + 0xf9e: 0x3a9d, 0xf9f: 0x3abd, 0xfa0: 0x3add, 0xfa1: 0x3afd, 0xfa2: 0x3b1d, 0xfa3: 0x3b3d, + 0xfa4: 0x3b5d, 0xfa5: 0x3b7d, 0xfa6: 0x127d, 0xfa7: 0x3b9d, 0xfa8: 0x3bbd, 0xfa9: 0x3bdd, + 0xfaa: 0x3bfd, 0xfab: 0x3c1d, 0xfac: 0x3c3d, 0xfad: 0x3c5d, 0xfae: 0x239d, 0xfaf: 0x3c7d, + 0xfb0: 0x3c9d, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999, + 0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29, + 0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69, + 0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69, + 0xfcc: 0x3c99, 0xfcd: 0x3cbd, 0xfce: 0x3cb1, 0xfcf: 0x3cdd, 0xfd0: 0x3cfd, 0xfd1: 0x3d15, + 0xfd2: 0x3d2d, 0xfd3: 0x3d45, 0xfd4: 0x3d5d, 0xfd5: 0x3d5d, 0xfd6: 0x3d45, 0xfd7: 0x3d75, + 0xfd8: 0x07bd, 0xfd9: 0x3d8d, 0xfda: 0x3da5, 0xfdb: 0x3dbd, 0xfdc: 0x3dd5, 0xfdd: 0x3ded, + 0xfde: 0x3e05, 0xfdf: 0x3e1d, 0xfe0: 0x3e35, 0xfe1: 0x3e4d, 0xfe2: 0x3e65, 0xfe3: 0x3e7d, + 0xfe4: 0x3e95, 0xfe5: 0x3e95, 0xfe6: 0x3ead, 0xfe7: 0x3ead, 0xfe8: 0x3ec5, 0xfe9: 0x3ec5, + 0xfea: 0x3edd, 0xfeb: 0x3ef5, 0xfec: 0x3f0d, 0xfed: 0x3f25, 0xfee: 0x3f3d, 0xfef: 0x3f3d, + 0xff0: 0x3f55, 0xff1: 0x3f55, 0xff2: 0x3f55, 0xff3: 0x3f6d, 0xff4: 0x3f85, 0xff5: 0x3f9d, + 0xff6: 0x3fb5, 0xff7: 0x3f9d, 0xff8: 0x3fcd, 0xff9: 0x3fe5, 0xffa: 0x3f6d, 0xffb: 0x3ffd, + 0xffc: 0x4015, 0xffd: 0x4015, 0xffe: 0x4015, 0xfff: 0x0040, + // Block 0x40, offset 0x1000 + 0x1000: 0x3cc9, 0x1001: 0x3d31, 0x1002: 0x3d99, 0x1003: 0x3e01, 0x1004: 0x3e51, 0x1005: 0x3eb9, + 0x1006: 0x3f09, 0x1007: 0x3f59, 0x1008: 0x3fd9, 0x1009: 0x4041, 0x100a: 0x4091, 0x100b: 0x40e1, + 0x100c: 0x4131, 0x100d: 0x4199, 0x100e: 0x4201, 0x100f: 0x4251, 0x1010: 0x42a1, 0x1011: 0x42d9, + 0x1012: 0x4329, 0x1013: 0x4391, 0x1014: 0x43f9, 0x1015: 0x4431, 0x1016: 0x44b1, 0x1017: 0x4549, + 0x1018: 0x45c9, 0x1019: 0x4619, 0x101a: 0x4699, 0x101b: 0x4719, 0x101c: 0x4781, 0x101d: 0x47d1, + 0x101e: 0x4821, 0x101f: 0x4871, 0x1020: 0x48d9, 0x1021: 0x4959, 0x1022: 0x49c1, 0x1023: 0x4a11, + 0x1024: 0x4a61, 0x1025: 0x4ab1, 0x1026: 0x4ae9, 0x1027: 0x4b21, 0x1028: 0x4b59, 0x1029: 0x4b91, + 0x102a: 0x4be1, 0x102b: 0x4c31, 0x102c: 0x4cb1, 0x102d: 0x4d01, 0x102e: 0x4d69, 0x102f: 0x4de9, + 0x1030: 0x4e39, 0x1031: 0x4e71, 0x1032: 0x4ea9, 0x1033: 0x4f29, 0x1034: 0x4f91, 0x1035: 0x5011, + 0x1036: 0x5061, 0x1037: 0x50e1, 0x1038: 0x5119, 0x1039: 0x5169, 0x103a: 0x51b9, 0x103b: 0x5209, + 0x103c: 0x5259, 0x103d: 0x52a9, 0x103e: 0x5311, 0x103f: 0x5361, + // Block 0x41, offset 0x1040 + 0x1040: 0x5399, 0x1041: 0x53e9, 0x1042: 0x5439, 0x1043: 0x5489, 0x1044: 0x54f1, 0x1045: 0x5541, + 0x1046: 0x5591, 0x1047: 0x55e1, 0x1048: 0x5661, 0x1049: 0x56c9, 0x104a: 0x5701, 0x104b: 0x5781, + 0x104c: 0x57b9, 0x104d: 0x5821, 0x104e: 0x5889, 0x104f: 0x58d9, 0x1050: 0x5929, 0x1051: 0x5979, + 0x1052: 0x59e1, 0x1053: 0x5a19, 0x1054: 0x5a69, 0x1055: 0x5ad1, 0x1056: 0x5b09, 0x1057: 0x5b89, + 0x1058: 0x5bd9, 0x1059: 0x5c01, 0x105a: 0x5c29, 0x105b: 0x5c51, 0x105c: 0x5c79, 0x105d: 0x5ca1, + 0x105e: 0x5cc9, 0x105f: 0x5cf1, 0x1060: 0x5d19, 0x1061: 0x5d41, 0x1062: 0x5d69, 0x1063: 0x5d99, + 0x1064: 0x5dc9, 0x1065: 0x5df9, 0x1066: 0x5e29, 0x1067: 0x5e59, 0x1068: 0x5e89, 0x1069: 0x5eb9, + 0x106a: 0x5ee9, 0x106b: 0x5f19, 0x106c: 0x5f49, 0x106d: 0x5f79, 0x106e: 0x5fa9, 0x106f: 0x5fd9, + 0x1070: 0x6009, 0x1071: 0x402d, 0x1072: 0x6039, 0x1073: 0x6051, 0x1074: 0x404d, 0x1075: 0x6069, + 0x1076: 0x6081, 0x1077: 0x6099, 0x1078: 0x406d, 0x1079: 0x406d, 0x107a: 0x60b1, 0x107b: 0x60c9, + 0x107c: 0x6101, 0x107d: 0x6139, 0x107e: 0x6171, 0x107f: 0x61a9, + // Block 0x42, offset 0x1080 + 0x1080: 0x6211, 0x1081: 0x6229, 0x1082: 0x408d, 0x1083: 0x6241, 0x1084: 0x6259, 0x1085: 0x6271, + 0x1086: 0x6289, 0x1087: 0x62a1, 0x1088: 0x40ad, 0x1089: 0x62b9, 0x108a: 0x62e1, 0x108b: 0x62f9, + 0x108c: 0x40cd, 0x108d: 0x40cd, 0x108e: 0x6311, 0x108f: 0x6329, 0x1090: 0x6341, 0x1091: 0x40ed, + 0x1092: 0x410d, 0x1093: 0x412d, 0x1094: 0x414d, 0x1095: 0x416d, 0x1096: 0x6359, 0x1097: 0x6371, + 0x1098: 0x6389, 0x1099: 0x63a1, 0x109a: 0x63b9, 0x109b: 0x418d, 0x109c: 0x63d1, 0x109d: 0x63e9, + 0x109e: 0x6401, 0x109f: 0x41ad, 0x10a0: 0x41cd, 0x10a1: 0x6419, 0x10a2: 0x41ed, 0x10a3: 0x420d, + 0x10a4: 0x422d, 0x10a5: 0x6431, 0x10a6: 0x424d, 0x10a7: 0x6449, 0x10a8: 0x6479, 0x10a9: 0x6211, + 0x10aa: 0x426d, 0x10ab: 0x428d, 0x10ac: 0x42ad, 0x10ad: 0x42cd, 0x10ae: 0x64b1, 0x10af: 0x64f1, + 0x10b0: 0x6539, 0x10b1: 0x6551, 0x10b2: 0x42ed, 0x10b3: 0x6569, 0x10b4: 0x6581, 0x10b5: 0x6599, + 0x10b6: 0x430d, 0x10b7: 0x65b1, 0x10b8: 0x65c9, 0x10b9: 0x65b1, 0x10ba: 0x65e1, 0x10bb: 0x65f9, + 0x10bc: 0x432d, 0x10bd: 0x6611, 0x10be: 0x6629, 0x10bf: 0x6611, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x434d, 0x10c1: 0x436d, 0x10c2: 0x0040, 0x10c3: 0x6641, 0x10c4: 0x6659, 0x10c5: 0x6671, + 0x10c6: 0x6689, 0x10c7: 0x0040, 0x10c8: 0x66c1, 0x10c9: 0x66d9, 0x10ca: 0x66f1, 0x10cb: 0x6709, + 0x10cc: 0x6721, 0x10cd: 0x6739, 0x10ce: 0x6401, 0x10cf: 0x6751, 0x10d0: 0x6769, 0x10d1: 0x6781, + 0x10d2: 0x438d, 0x10d3: 0x6799, 0x10d4: 0x6289, 0x10d5: 0x43ad, 0x10d6: 0x43cd, 0x10d7: 0x67b1, + 0x10d8: 0x0040, 0x10d9: 0x43ed, 0x10da: 0x67c9, 0x10db: 0x67e1, 0x10dc: 0x67f9, 0x10dd: 0x6811, + 0x10de: 0x6829, 0x10df: 0x6859, 0x10e0: 0x6889, 0x10e1: 0x68b1, 0x10e2: 0x68d9, 0x10e3: 0x6901, + 0x10e4: 0x6929, 0x10e5: 0x6951, 0x10e6: 0x6979, 0x10e7: 0x69a1, 0x10e8: 0x69c9, 0x10e9: 0x69f1, + 0x10ea: 0x6a21, 0x10eb: 0x6a51, 0x10ec: 0x6a81, 0x10ed: 0x6ab1, 0x10ee: 0x6ae1, 0x10ef: 0x6b11, + 0x10f0: 0x6b41, 0x10f1: 0x6b71, 0x10f2: 0x6ba1, 0x10f3: 0x6bd1, 0x10f4: 0x6c01, 0x10f5: 0x6c31, + 0x10f6: 0x6c61, 0x10f7: 0x6c91, 0x10f8: 0x6cc1, 0x10f9: 0x6cf1, 0x10fa: 0x6d21, 0x10fb: 0x6d51, + 0x10fc: 0x6d81, 0x10fd: 0x6db1, 0x10fe: 0x6de1, 0x10ff: 0x440d, + // Block 0x44, offset 0x1100 + 0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008, + 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008, + 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008, + 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008, + 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008, + 0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008, + 0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008, + 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308, + 0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308, + 0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308, + 0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008, + // Block 0x45, offset 0x1140 + 0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008, + 0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008, + 0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008, + 0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008, + 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e11, + 0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008, + 0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008, + 0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008, + 0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, + 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008, + 0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008, + // Block 0x46, offset 0x1180 + 0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018, + 0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018, + 0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018, + 0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008, + 0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008, + 0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008, + 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, + 0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008, + 0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008, + 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008, + 0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008, + // Block 0x47, offset 0x11c0 + 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008, + 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008, + 0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008, + 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008, + 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008, + 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008, + 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008, + 0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008, + 0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008, + 0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d, + 0x11fc: 0x0008, 0x11fd: 0x442d, 0x11fe: 0xe00d, 0x11ff: 0x0008, + // Block 0x48, offset 0x1200 + 0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008, + 0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d, + 0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008, + 0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008, + 0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008, + 0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008, + 0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008, + 0x122a: 0x6e29, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e41, 0x122e: 0x1221, 0x122f: 0x0040, + 0x1230: 0x6e59, 0x1231: 0x6e71, 0x1232: 0x1239, 0x1233: 0x444d, 0x1234: 0xe00d, 0x1235: 0x0008, + 0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040, + 0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040, + // Block 0x49, offset 0x1240 + 0x1240: 0x64d5, 0x1241: 0x64f5, 0x1242: 0x6515, 0x1243: 0x6535, 0x1244: 0x6555, 0x1245: 0x6575, + 0x1246: 0x6595, 0x1247: 0x65b5, 0x1248: 0x65d5, 0x1249: 0x65f5, 0x124a: 0x6615, 0x124b: 0x6635, + 0x124c: 0x6655, 0x124d: 0x6675, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x6695, 0x1251: 0x0008, + 0x1252: 0x66b5, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x66d5, 0x1256: 0x66f5, 0x1257: 0x6715, + 0x1258: 0x6735, 0x1259: 0x6755, 0x125a: 0x6775, 0x125b: 0x6795, 0x125c: 0x67b5, 0x125d: 0x67d5, + 0x125e: 0x67f5, 0x125f: 0x0008, 0x1260: 0x6815, 0x1261: 0x0008, 0x1262: 0x6835, 0x1263: 0x0008, + 0x1264: 0x0008, 0x1265: 0x6855, 0x1266: 0x6875, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008, + 0x126a: 0x6895, 0x126b: 0x68b5, 0x126c: 0x68d5, 0x126d: 0x68f5, 0x126e: 0x6915, 0x126f: 0x6935, + 0x1270: 0x6955, 0x1271: 0x6975, 0x1272: 0x6995, 0x1273: 0x69b5, 0x1274: 0x69d5, 0x1275: 0x69f5, + 0x1276: 0x6a15, 0x1277: 0x6a35, 0x1278: 0x6a55, 0x1279: 0x6a75, 0x127a: 0x6a95, 0x127b: 0x6ab5, + 0x127c: 0x6ad5, 0x127d: 0x6af5, 0x127e: 0x6b15, 0x127f: 0x6b35, + // Block 0x4a, offset 0x1280 + 0x1280: 0x7a95, 0x1281: 0x7ab5, 0x1282: 0x7ad5, 0x1283: 0x7af5, 0x1284: 0x7b15, 0x1285: 0x7b35, + 0x1286: 0x7b55, 0x1287: 0x7b75, 0x1288: 0x7b95, 0x1289: 0x7bb5, 0x128a: 0x7bd5, 0x128b: 0x7bf5, + 0x128c: 0x7c15, 0x128d: 0x7c35, 0x128e: 0x7c55, 0x128f: 0x6ec9, 0x1290: 0x6ef1, 0x1291: 0x6f19, + 0x1292: 0x7c75, 0x1293: 0x7c95, 0x1294: 0x7cb5, 0x1295: 0x6f41, 0x1296: 0x6f69, 0x1297: 0x6f91, + 0x1298: 0x7cd5, 0x1299: 0x7cf5, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040, + 0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040, + 0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040, + 0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040, + 0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040, + 0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040, + 0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x6fb9, 0x12c1: 0x6fd1, 0x12c2: 0x6fe9, 0x12c3: 0x7d15, 0x12c4: 0x7d35, 0x12c5: 0x7001, + 0x12c6: 0x7001, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040, + 0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040, + 0x12d2: 0x0040, 0x12d3: 0x7019, 0x12d4: 0x7041, 0x12d5: 0x7069, 0x12d6: 0x7091, 0x12d7: 0x70b9, + 0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x70e1, + 0x12de: 0x3308, 0x12df: 0x7109, 0x12e0: 0x7131, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7149, + 0x12e4: 0x7161, 0x12e5: 0x7179, 0x12e6: 0x7191, 0x12e7: 0x71a9, 0x12e8: 0x71c1, 0x12e9: 0x1fb2, + 0x12ea: 0x71d9, 0x12eb: 0x7201, 0x12ec: 0x7229, 0x12ed: 0x7261, 0x12ee: 0x7299, 0x12ef: 0x72c1, + 0x12f0: 0x72e9, 0x12f1: 0x7311, 0x12f2: 0x7339, 0x12f3: 0x7361, 0x12f4: 0x7389, 0x12f5: 0x73b1, + 0x12f6: 0x73d9, 0x12f7: 0x0040, 0x12f8: 0x7401, 0x12f9: 0x7429, 0x12fa: 0x7451, 0x12fb: 0x7479, + 0x12fc: 0x74a1, 0x12fd: 0x0040, 0x12fe: 0x74c9, 0x12ff: 0x0040, + // Block 0x4c, offset 0x1300 + 0x1300: 0x74f1, 0x1301: 0x7519, 0x1302: 0x0040, 0x1303: 0x7541, 0x1304: 0x7569, 0x1305: 0x0040, + 0x1306: 0x7591, 0x1307: 0x75b9, 0x1308: 0x75e1, 0x1309: 0x7609, 0x130a: 0x7631, 0x130b: 0x7659, + 0x130c: 0x7681, 0x130d: 0x76a9, 0x130e: 0x76d1, 0x130f: 0x76f9, 0x1310: 0x7721, 0x1311: 0x7721, + 0x1312: 0x7739, 0x1313: 0x7739, 0x1314: 0x7739, 0x1315: 0x7739, 0x1316: 0x7751, 0x1317: 0x7751, + 0x1318: 0x7751, 0x1319: 0x7751, 0x131a: 0x7769, 0x131b: 0x7769, 0x131c: 0x7769, 0x131d: 0x7769, + 0x131e: 0x7781, 0x131f: 0x7781, 0x1320: 0x7781, 0x1321: 0x7781, 0x1322: 0x7799, 0x1323: 0x7799, + 0x1324: 0x7799, 0x1325: 0x7799, 0x1326: 0x77b1, 0x1327: 0x77b1, 0x1328: 0x77b1, 0x1329: 0x77b1, + 0x132a: 0x77c9, 0x132b: 0x77c9, 0x132c: 0x77c9, 0x132d: 0x77c9, 0x132e: 0x77e1, 0x132f: 0x77e1, + 0x1330: 0x77e1, 0x1331: 0x77e1, 0x1332: 0x77f9, 0x1333: 0x77f9, 0x1334: 0x77f9, 0x1335: 0x77f9, + 0x1336: 0x7811, 0x1337: 0x7811, 0x1338: 0x7811, 0x1339: 0x7811, 0x133a: 0x7829, 0x133b: 0x7829, + 0x133c: 0x7829, 0x133d: 0x7829, 0x133e: 0x7841, 0x133f: 0x7841, + // Block 0x4d, offset 0x1340 + 0x1340: 0x7841, 0x1341: 0x7841, 0x1342: 0x7859, 0x1343: 0x7859, 0x1344: 0x7871, 0x1345: 0x7871, + 0x1346: 0x7889, 0x1347: 0x7889, 0x1348: 0x78a1, 0x1349: 0x78a1, 0x134a: 0x78b9, 0x134b: 0x78b9, + 0x134c: 0x78d1, 0x134d: 0x78d1, 0x134e: 0x78e9, 0x134f: 0x78e9, 0x1350: 0x78e9, 0x1351: 0x78e9, + 0x1352: 0x7901, 0x1353: 0x7901, 0x1354: 0x7901, 0x1355: 0x7901, 0x1356: 0x7919, 0x1357: 0x7919, + 0x1358: 0x7919, 0x1359: 0x7919, 0x135a: 0x7931, 0x135b: 0x7931, 0x135c: 0x7931, 0x135d: 0x7931, + 0x135e: 0x7949, 0x135f: 0x7949, 0x1360: 0x7961, 0x1361: 0x7961, 0x1362: 0x7961, 0x1363: 0x7961, + 0x1364: 0x7979, 0x1365: 0x7979, 0x1366: 0x7991, 0x1367: 0x7991, 0x1368: 0x7991, 0x1369: 0x7991, + 0x136a: 0x79a9, 0x136b: 0x79a9, 0x136c: 0x79a9, 0x136d: 0x79a9, 0x136e: 0x79c1, 0x136f: 0x79c1, + 0x1370: 0x79d9, 0x1371: 0x79d9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818, + 0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818, + 0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818, + // Block 0x4e, offset 0x1380 + 0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040, + 0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040, + 0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040, + 0x1392: 0x0040, 0x1393: 0x79f1, 0x1394: 0x79f1, 0x1395: 0x79f1, 0x1396: 0x79f1, 0x1397: 0x7a09, + 0x1398: 0x7a09, 0x1399: 0x7a21, 0x139a: 0x7a21, 0x139b: 0x7a39, 0x139c: 0x7a39, 0x139d: 0x0479, + 0x139e: 0x7a51, 0x139f: 0x7a51, 0x13a0: 0x7a69, 0x13a1: 0x7a69, 0x13a2: 0x7a81, 0x13a3: 0x7a81, + 0x13a4: 0x7a99, 0x13a5: 0x7a99, 0x13a6: 0x7a99, 0x13a7: 0x7a99, 0x13a8: 0x7ab1, 0x13a9: 0x7ab1, + 0x13aa: 0x7ac9, 0x13ab: 0x7ac9, 0x13ac: 0x7af1, 0x13ad: 0x7af1, 0x13ae: 0x7b19, 0x13af: 0x7b19, + 0x13b0: 0x7b41, 0x13b1: 0x7b41, 0x13b2: 0x7b69, 0x13b3: 0x7b69, 0x13b4: 0x7b91, 0x13b5: 0x7b91, + 0x13b6: 0x7bb9, 0x13b7: 0x7bb9, 0x13b8: 0x7bb9, 0x13b9: 0x7be1, 0x13ba: 0x7be1, 0x13bb: 0x7be1, + 0x13bc: 0x7c09, 0x13bd: 0x7c09, 0x13be: 0x7c09, 0x13bf: 0x7c09, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x85f9, 0x13c1: 0x8621, 0x13c2: 0x8649, 0x13c3: 0x8671, 0x13c4: 0x8699, 0x13c5: 0x86c1, + 0x13c6: 0x86e9, 0x13c7: 0x8711, 0x13c8: 0x8739, 0x13c9: 0x8761, 0x13ca: 0x8789, 0x13cb: 0x87b1, + 0x13cc: 0x87d9, 0x13cd: 0x8801, 0x13ce: 0x8829, 0x13cf: 0x8851, 0x13d0: 0x8879, 0x13d1: 0x88a1, + 0x13d2: 0x88c9, 0x13d3: 0x88f1, 0x13d4: 0x8919, 0x13d5: 0x8941, 0x13d6: 0x8969, 0x13d7: 0x8991, + 0x13d8: 0x89b9, 0x13d9: 0x89e1, 0x13da: 0x8a09, 0x13db: 0x8a31, 0x13dc: 0x8a59, 0x13dd: 0x8a81, + 0x13de: 0x8aaa, 0x13df: 0x8ada, 0x13e0: 0x8b0a, 0x13e1: 0x8b3a, 0x13e2: 0x8b6a, 0x13e3: 0x8b9a, + 0x13e4: 0x8bc9, 0x13e5: 0x8bf1, 0x13e6: 0x7c71, 0x13e7: 0x8c19, 0x13e8: 0x7be1, 0x13e9: 0x7c99, + 0x13ea: 0x8c41, 0x13eb: 0x8c69, 0x13ec: 0x7d39, 0x13ed: 0x8c91, 0x13ee: 0x7d61, 0x13ef: 0x7d89, + 0x13f0: 0x8cb9, 0x13f1: 0x8ce1, 0x13f2: 0x7e29, 0x13f3: 0x8d09, 0x13f4: 0x7e51, 0x13f5: 0x7e79, + 0x13f6: 0x8d31, 0x13f7: 0x8d59, 0x13f8: 0x7ec9, 0x13f9: 0x8d81, 0x13fa: 0x7ef1, 0x13fb: 0x7f19, + 0x13fc: 0x83a1, 0x13fd: 0x83c9, 0x13fe: 0x8441, 0x13ff: 0x8469, + // Block 0x50, offset 0x1400 + 0x1400: 0x8491, 0x1401: 0x8531, 0x1402: 0x8559, 0x1403: 0x8581, 0x1404: 0x85a9, 0x1405: 0x8649, + 0x1406: 0x8671, 0x1407: 0x8699, 0x1408: 0x8da9, 0x1409: 0x8739, 0x140a: 0x8dd1, 0x140b: 0x8df9, + 0x140c: 0x8829, 0x140d: 0x8e21, 0x140e: 0x8851, 0x140f: 0x8879, 0x1410: 0x8a81, 0x1411: 0x8e49, + 0x1412: 0x8e71, 0x1413: 0x89b9, 0x1414: 0x8e99, 0x1415: 0x89e1, 0x1416: 0x8a09, 0x1417: 0x7c21, + 0x1418: 0x7c49, 0x1419: 0x8ec1, 0x141a: 0x7c71, 0x141b: 0x8ee9, 0x141c: 0x7cc1, 0x141d: 0x7ce9, + 0x141e: 0x7d11, 0x141f: 0x7d39, 0x1420: 0x8f11, 0x1421: 0x7db1, 0x1422: 0x7dd9, 0x1423: 0x7e01, + 0x1424: 0x7e29, 0x1425: 0x8f39, 0x1426: 0x7ec9, 0x1427: 0x7f41, 0x1428: 0x7f69, 0x1429: 0x7f91, + 0x142a: 0x7fb9, 0x142b: 0x7fe1, 0x142c: 0x8031, 0x142d: 0x8059, 0x142e: 0x8081, 0x142f: 0x80a9, + 0x1430: 0x80d1, 0x1431: 0x80f9, 0x1432: 0x8f61, 0x1433: 0x8121, 0x1434: 0x8149, 0x1435: 0x8171, + 0x1436: 0x8199, 0x1437: 0x81c1, 0x1438: 0x81e9, 0x1439: 0x8239, 0x143a: 0x8261, 0x143b: 0x8289, + 0x143c: 0x82b1, 0x143d: 0x82d9, 0x143e: 0x8301, 0x143f: 0x8329, + // Block 0x51, offset 0x1440 + 0x1440: 0x8351, 0x1441: 0x8379, 0x1442: 0x83f1, 0x1443: 0x8419, 0x1444: 0x84b9, 0x1445: 0x84e1, + 0x1446: 0x8509, 0x1447: 0x8531, 0x1448: 0x8559, 0x1449: 0x85d1, 0x144a: 0x85f9, 0x144b: 0x8621, + 0x144c: 0x8649, 0x144d: 0x8f89, 0x144e: 0x86c1, 0x144f: 0x86e9, 0x1450: 0x8711, 0x1451: 0x8739, + 0x1452: 0x87b1, 0x1453: 0x87d9, 0x1454: 0x8801, 0x1455: 0x8829, 0x1456: 0x8fb1, 0x1457: 0x88a1, + 0x1458: 0x88c9, 0x1459: 0x8fd9, 0x145a: 0x8941, 0x145b: 0x8969, 0x145c: 0x8991, 0x145d: 0x89b9, + 0x145e: 0x9001, 0x145f: 0x7c71, 0x1460: 0x8ee9, 0x1461: 0x7d39, 0x1462: 0x8f11, 0x1463: 0x7e29, + 0x1464: 0x8f39, 0x1465: 0x7ec9, 0x1466: 0x9029, 0x1467: 0x80d1, 0x1468: 0x9051, 0x1469: 0x9079, + 0x146a: 0x90a1, 0x146b: 0x8531, 0x146c: 0x8559, 0x146d: 0x8649, 0x146e: 0x8829, 0x146f: 0x8fb1, + 0x1470: 0x89b9, 0x1471: 0x9001, 0x1472: 0x90c9, 0x1473: 0x9101, 0x1474: 0x9139, 0x1475: 0x9171, + 0x1476: 0x9199, 0x1477: 0x91c1, 0x1478: 0x91e9, 0x1479: 0x9211, 0x147a: 0x9239, 0x147b: 0x9261, + 0x147c: 0x9289, 0x147d: 0x92b1, 0x147e: 0x92d9, 0x147f: 0x9301, + // Block 0x52, offset 0x1480 + 0x1480: 0x9329, 0x1481: 0x9351, 0x1482: 0x9379, 0x1483: 0x93a1, 0x1484: 0x93c9, 0x1485: 0x93f1, + 0x1486: 0x9419, 0x1487: 0x9441, 0x1488: 0x9469, 0x1489: 0x9491, 0x148a: 0x94b9, 0x148b: 0x94e1, + 0x148c: 0x9079, 0x148d: 0x9509, 0x148e: 0x9531, 0x148f: 0x9559, 0x1490: 0x9581, 0x1491: 0x9171, + 0x1492: 0x9199, 0x1493: 0x91c1, 0x1494: 0x91e9, 0x1495: 0x9211, 0x1496: 0x9239, 0x1497: 0x9261, + 0x1498: 0x9289, 0x1499: 0x92b1, 0x149a: 0x92d9, 0x149b: 0x9301, 0x149c: 0x9329, 0x149d: 0x9351, + 0x149e: 0x9379, 0x149f: 0x93a1, 0x14a0: 0x93c9, 0x14a1: 0x93f1, 0x14a2: 0x9419, 0x14a3: 0x9441, + 0x14a4: 0x9469, 0x14a5: 0x9491, 0x14a6: 0x94b9, 0x14a7: 0x94e1, 0x14a8: 0x9079, 0x14a9: 0x9509, + 0x14aa: 0x9531, 0x14ab: 0x9559, 0x14ac: 0x9581, 0x14ad: 0x9491, 0x14ae: 0x94b9, 0x14af: 0x94e1, + 0x14b0: 0x9079, 0x14b1: 0x9051, 0x14b2: 0x90a1, 0x14b3: 0x8211, 0x14b4: 0x8059, 0x14b5: 0x8081, + 0x14b6: 0x80a9, 0x14b7: 0x9491, 0x14b8: 0x94b9, 0x14b9: 0x94e1, 0x14ba: 0x8211, 0x14bb: 0x8239, + 0x14bc: 0x95a9, 0x14bd: 0x95a9, 0x14be: 0x0018, 0x14bf: 0x0018, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040, + 0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040, + 0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x95d1, 0x14d1: 0x9609, + 0x14d2: 0x9609, 0x14d3: 0x9641, 0x14d4: 0x9679, 0x14d5: 0x96b1, 0x14d6: 0x96e9, 0x14d7: 0x9721, + 0x14d8: 0x9759, 0x14d9: 0x9759, 0x14da: 0x9791, 0x14db: 0x97c9, 0x14dc: 0x9801, 0x14dd: 0x9839, + 0x14de: 0x9871, 0x14df: 0x98a9, 0x14e0: 0x98a9, 0x14e1: 0x98e1, 0x14e2: 0x9919, 0x14e3: 0x9919, + 0x14e4: 0x9951, 0x14e5: 0x9951, 0x14e6: 0x9989, 0x14e7: 0x99c1, 0x14e8: 0x99c1, 0x14e9: 0x99f9, + 0x14ea: 0x9a31, 0x14eb: 0x9a31, 0x14ec: 0x9a69, 0x14ed: 0x9a69, 0x14ee: 0x9aa1, 0x14ef: 0x9ad9, + 0x14f0: 0x9ad9, 0x14f1: 0x9b11, 0x14f2: 0x9b11, 0x14f3: 0x9b49, 0x14f4: 0x9b81, 0x14f5: 0x9bb9, + 0x14f6: 0x9bf1, 0x14f7: 0x9bf1, 0x14f8: 0x9c29, 0x14f9: 0x9c61, 0x14fa: 0x9c99, 0x14fb: 0x9cd1, + 0x14fc: 0x9d09, 0x14fd: 0x9d09, 0x14fe: 0x9d41, 0x14ff: 0x9d79, + // Block 0x54, offset 0x1500 + 0x1500: 0xa949, 0x1501: 0xa981, 0x1502: 0xa9b9, 0x1503: 0xa8a1, 0x1504: 0x9bb9, 0x1505: 0x9989, + 0x1506: 0xa9f1, 0x1507: 0xaa29, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040, + 0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040, + 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040, + 0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040, + 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040, + 0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040, + 0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, + 0x1530: 0xaa61, 0x1531: 0xaa99, 0x1532: 0xaad1, 0x1533: 0xab19, 0x1534: 0xab61, 0x1535: 0xaba9, + 0x1536: 0xabf1, 0x1537: 0xac39, 0x1538: 0xac81, 0x1539: 0xacc9, 0x153a: 0xad02, 0x153b: 0xae12, + 0x153c: 0xae91, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040, + // Block 0x55, offset 0x1540 + 0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0, + 0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0, + 0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaeda, 0x1551: 0x7d55, + 0x1552: 0x0040, 0x1553: 0xaeea, 0x1554: 0x03c2, 0x1555: 0xaefa, 0x1556: 0xaf0a, 0x1557: 0x7d75, + 0x1558: 0x7d95, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040, + 0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308, + 0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308, + 0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308, + 0x1570: 0x0040, 0x1571: 0x7db5, 0x1572: 0x7dd5, 0x1573: 0xaf1a, 0x1574: 0xaf1a, 0x1575: 0x1fd2, + 0x1576: 0x1fe2, 0x1577: 0xaf2a, 0x1578: 0xaf3a, 0x1579: 0x7df5, 0x157a: 0x7e15, 0x157b: 0x7e35, + 0x157c: 0x7df5, 0x157d: 0x7e55, 0x157e: 0x7e75, 0x157f: 0x7e55, + // Block 0x56, offset 0x1580 + 0x1580: 0x7e95, 0x1581: 0x7eb5, 0x1582: 0x7ed5, 0x1583: 0x7eb5, 0x1584: 0x7ef5, 0x1585: 0x0018, + 0x1586: 0x0018, 0x1587: 0xaf4a, 0x1588: 0xaf5a, 0x1589: 0x7f16, 0x158a: 0x7f36, 0x158b: 0x7f56, + 0x158c: 0x7f76, 0x158d: 0xaf1a, 0x158e: 0xaf1a, 0x158f: 0xaf1a, 0x1590: 0xaeda, 0x1591: 0x7f95, + 0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaeea, 0x1596: 0xaf0a, 0x1597: 0xaefa, + 0x1598: 0x7fb5, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf2a, 0x159c: 0xaf3a, 0x159d: 0x7e95, + 0x159e: 0x7ef5, 0x159f: 0xaf6a, 0x15a0: 0xaf7a, 0x15a1: 0xaf8a, 0x15a2: 0x1fb2, 0x15a3: 0xaf99, + 0x15a4: 0xafaa, 0x15a5: 0xafba, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xafca, 0x15a9: 0xafda, + 0x15aa: 0xafea, 0x15ab: 0xaffa, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040, + 0x15b0: 0x7fd6, 0x15b1: 0xb009, 0x15b2: 0x7ff6, 0x15b3: 0x0808, 0x15b4: 0x8016, 0x15b5: 0x0040, + 0x15b6: 0x8036, 0x15b7: 0xb031, 0x15b8: 0x8056, 0x15b9: 0xb059, 0x15ba: 0x8076, 0x15bb: 0xb081, + 0x15bc: 0x8096, 0x15bd: 0xb0a9, 0x15be: 0x80b6, 0x15bf: 0xb0d1, + // Block 0x57, offset 0x15c0 + 0x15c0: 0xb0f9, 0x15c1: 0xb111, 0x15c2: 0xb111, 0x15c3: 0xb129, 0x15c4: 0xb129, 0x15c5: 0xb141, + 0x15c6: 0xb141, 0x15c7: 0xb159, 0x15c8: 0xb159, 0x15c9: 0xb171, 0x15ca: 0xb171, 0x15cb: 0xb171, + 0x15cc: 0xb171, 0x15cd: 0xb189, 0x15ce: 0xb189, 0x15cf: 0xb1a1, 0x15d0: 0xb1a1, 0x15d1: 0xb1a1, + 0x15d2: 0xb1a1, 0x15d3: 0xb1b9, 0x15d4: 0xb1b9, 0x15d5: 0xb1d1, 0x15d6: 0xb1d1, 0x15d7: 0xb1d1, + 0x15d8: 0xb1d1, 0x15d9: 0xb1e9, 0x15da: 0xb1e9, 0x15db: 0xb1e9, 0x15dc: 0xb1e9, 0x15dd: 0xb201, + 0x15de: 0xb201, 0x15df: 0xb201, 0x15e0: 0xb201, 0x15e1: 0xb219, 0x15e2: 0xb219, 0x15e3: 0xb219, + 0x15e4: 0xb219, 0x15e5: 0xb231, 0x15e6: 0xb231, 0x15e7: 0xb231, 0x15e8: 0xb231, 0x15e9: 0xb249, + 0x15ea: 0xb249, 0x15eb: 0xb261, 0x15ec: 0xb261, 0x15ed: 0xb279, 0x15ee: 0xb279, 0x15ef: 0xb291, + 0x15f0: 0xb291, 0x15f1: 0xb2a9, 0x15f2: 0xb2a9, 0x15f3: 0xb2a9, 0x15f4: 0xb2a9, 0x15f5: 0xb2c1, + 0x15f6: 0xb2c1, 0x15f7: 0xb2c1, 0x15f8: 0xb2c1, 0x15f9: 0xb2d9, 0x15fa: 0xb2d9, 0x15fb: 0xb2d9, + 0x15fc: 0xb2d9, 0x15fd: 0xb2f1, 0x15fe: 0xb2f1, 0x15ff: 0xb2f1, + // Block 0x58, offset 0x1600 + 0x1600: 0xb2f1, 0x1601: 0xb309, 0x1602: 0xb309, 0x1603: 0xb309, 0x1604: 0xb309, 0x1605: 0xb321, + 0x1606: 0xb321, 0x1607: 0xb321, 0x1608: 0xb321, 0x1609: 0xb339, 0x160a: 0xb339, 0x160b: 0xb339, + 0x160c: 0xb339, 0x160d: 0xb351, 0x160e: 0xb351, 0x160f: 0xb351, 0x1610: 0xb351, 0x1611: 0xb369, + 0x1612: 0xb369, 0x1613: 0xb369, 0x1614: 0xb369, 0x1615: 0xb381, 0x1616: 0xb381, 0x1617: 0xb381, + 0x1618: 0xb381, 0x1619: 0xb399, 0x161a: 0xb399, 0x161b: 0xb399, 0x161c: 0xb399, 0x161d: 0xb3b1, + 0x161e: 0xb3b1, 0x161f: 0xb3b1, 0x1620: 0xb3b1, 0x1621: 0xb3c9, 0x1622: 0xb3c9, 0x1623: 0xb3c9, + 0x1624: 0xb3c9, 0x1625: 0xb3e1, 0x1626: 0xb3e1, 0x1627: 0xb3e1, 0x1628: 0xb3e1, 0x1629: 0xb3f9, + 0x162a: 0xb3f9, 0x162b: 0xb3f9, 0x162c: 0xb3f9, 0x162d: 0xb411, 0x162e: 0xb411, 0x162f: 0x7ab1, + 0x1630: 0x7ab1, 0x1631: 0xb429, 0x1632: 0xb429, 0x1633: 0xb429, 0x1634: 0xb429, 0x1635: 0xb441, + 0x1636: 0xb441, 0x1637: 0xb469, 0x1638: 0xb469, 0x1639: 0xb491, 0x163a: 0xb491, 0x163b: 0xb4b9, + 0x163c: 0xb4b9, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0, + // Block 0x59, offset 0x1640 + 0x1640: 0x0040, 0x1641: 0xaefa, 0x1642: 0xb4e2, 0x1643: 0xaf6a, 0x1644: 0xafda, 0x1645: 0xafea, + 0x1646: 0xaf7a, 0x1647: 0xb4f2, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xaf8a, 0x164b: 0x1fb2, + 0x164c: 0xaeda, 0x164d: 0xaf99, 0x164e: 0x29d1, 0x164f: 0xb502, 0x1650: 0x1f41, 0x1651: 0x00c9, + 0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81, + 0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaeea, 0x165b: 0x03c2, 0x165c: 0xafaa, 0x165d: 0x1fc2, + 0x165e: 0xafba, 0x165f: 0xaf0a, 0x1660: 0xaffa, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159, + 0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41, + 0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9, + 0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9, + 0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf4a, + 0x167c: 0xafca, 0x167d: 0xaf5a, 0x167e: 0xb512, 0x167f: 0xaf1a, + // Block 0x5a, offset 0x1680 + 0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09, + 0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51, + 0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039, + 0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279, + 0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf2a, 0x169c: 0xb522, 0x169d: 0xaf3a, + 0x169e: 0xb532, 0x169f: 0x80d5, 0x16a0: 0x80f5, 0x16a1: 0x29d1, 0x16a2: 0x8115, 0x16a3: 0x8115, + 0x16a4: 0x8135, 0x16a5: 0x8155, 0x16a6: 0x8175, 0x16a7: 0x8195, 0x16a8: 0x81b5, 0x16a9: 0x81d5, + 0x16aa: 0x81f5, 0x16ab: 0x8215, 0x16ac: 0x8235, 0x16ad: 0x8255, 0x16ae: 0x8275, 0x16af: 0x8295, + 0x16b0: 0x82b5, 0x16b1: 0x82d5, 0x16b2: 0x82f5, 0x16b3: 0x8315, 0x16b4: 0x8335, 0x16b5: 0x8355, + 0x16b6: 0x8375, 0x16b7: 0x8395, 0x16b8: 0x83b5, 0x16b9: 0x83d5, 0x16ba: 0x83f5, 0x16bb: 0x8415, + 0x16bc: 0x81b5, 0x16bd: 0x8435, 0x16be: 0x8455, 0x16bf: 0x8215, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x8475, 0x16c1: 0x8495, 0x16c2: 0x84b5, 0x16c3: 0x84d5, 0x16c4: 0x84f5, 0x16c5: 0x8515, + 0x16c6: 0x8535, 0x16c7: 0x8555, 0x16c8: 0x84d5, 0x16c9: 0x8575, 0x16ca: 0x84d5, 0x16cb: 0x8595, + 0x16cc: 0x8595, 0x16cd: 0x85b5, 0x16ce: 0x85b5, 0x16cf: 0x85d5, 0x16d0: 0x8515, 0x16d1: 0x85f5, + 0x16d2: 0x8615, 0x16d3: 0x85f5, 0x16d4: 0x8635, 0x16d5: 0x8615, 0x16d6: 0x8655, 0x16d7: 0x8655, + 0x16d8: 0x8675, 0x16d9: 0x8675, 0x16da: 0x8695, 0x16db: 0x8695, 0x16dc: 0x8615, 0x16dd: 0x8115, + 0x16de: 0x86b5, 0x16df: 0x86d5, 0x16e0: 0x0040, 0x16e1: 0x86f5, 0x16e2: 0x8715, 0x16e3: 0x8735, + 0x16e4: 0x8755, 0x16e5: 0x8735, 0x16e6: 0x8775, 0x16e7: 0x8795, 0x16e8: 0x87b5, 0x16e9: 0x87b5, + 0x16ea: 0x87d5, 0x16eb: 0x87d5, 0x16ec: 0x87f5, 0x16ed: 0x87f5, 0x16ee: 0x87d5, 0x16ef: 0x87d5, + 0x16f0: 0x8815, 0x16f1: 0x8835, 0x16f2: 0x8855, 0x16f3: 0x8875, 0x16f4: 0x8895, 0x16f5: 0x88b5, + 0x16f6: 0x88b5, 0x16f7: 0x88b5, 0x16f8: 0x88d5, 0x16f9: 0x88d5, 0x16fa: 0x88d5, 0x16fb: 0x88d5, + 0x16fc: 0x87b5, 0x16fd: 0x87b5, 0x16fe: 0x87b5, 0x16ff: 0x0040, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x8715, 0x1703: 0x86f5, 0x1704: 0x88f5, 0x1705: 0x86f5, + 0x1706: 0x8715, 0x1707: 0x86f5, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x8915, 0x170b: 0x8715, + 0x170c: 0x8935, 0x170d: 0x88f5, 0x170e: 0x8935, 0x170f: 0x8715, 0x1710: 0x0040, 0x1711: 0x0040, + 0x1712: 0x8955, 0x1713: 0x8975, 0x1714: 0x8875, 0x1715: 0x8935, 0x1716: 0x88f5, 0x1717: 0x8935, + 0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x8995, 0x171b: 0x89b5, 0x171c: 0x8995, 0x171d: 0x0040, + 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb541, 0x1721: 0xb559, 0x1722: 0xb571, 0x1723: 0x89d6, + 0x1724: 0xb589, 0x1725: 0xb5a1, 0x1726: 0x89f5, 0x1727: 0x0040, 0x1728: 0x8a15, 0x1729: 0x8a35, + 0x172a: 0x8a55, 0x172b: 0x8a35, 0x172c: 0x8a75, 0x172d: 0x8a95, 0x172e: 0x8ab5, 0x172f: 0x0040, + 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, + 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340, + 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, + // Block 0x5d, offset 0x1740 + 0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08, + 0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808, + 0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08, + 0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908, + 0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08, + 0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808, + 0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040, + 0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18, + 0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818, + 0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040, + 0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040, + // Block 0x5e, offset 0x1780 + 0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08, + 0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08, + 0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08, + 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040, + 0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040, + 0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040, + 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18, + 0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818, + 0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040, + 0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040, + 0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008, + 0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008, + 0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040, + 0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008, + 0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008, + 0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008, + 0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040, + 0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008, + 0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008, + 0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x0040, + 0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008, + // Block 0x60, offset 0x1800 + 0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040, + 0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008, + 0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040, + 0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008, + 0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008, + 0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008, + 0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308, + 0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040, + 0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040, + 0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040, + 0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040, + // Block 0x61, offset 0x1840 + 0x1840: 0x0039, 0x1841: 0x0ee9, 0x1842: 0x1159, 0x1843: 0x0ef9, 0x1844: 0x0f09, 0x1845: 0x1199, + 0x1846: 0x0f31, 0x1847: 0x0249, 0x1848: 0x0f41, 0x1849: 0x0259, 0x184a: 0x0f51, 0x184b: 0x0359, + 0x184c: 0x0f61, 0x184d: 0x0f71, 0x184e: 0x00d9, 0x184f: 0x0f99, 0x1850: 0x2039, 0x1851: 0x0269, + 0x1852: 0x01d9, 0x1853: 0x0fa9, 0x1854: 0x0fb9, 0x1855: 0x1089, 0x1856: 0x0279, 0x1857: 0x0369, + 0x1858: 0x0289, 0x1859: 0x13d1, 0x185a: 0x0039, 0x185b: 0x0ee9, 0x185c: 0x1159, 0x185d: 0x0ef9, + 0x185e: 0x0f09, 0x185f: 0x1199, 0x1860: 0x0f31, 0x1861: 0x0249, 0x1862: 0x0f41, 0x1863: 0x0259, + 0x1864: 0x0f51, 0x1865: 0x0359, 0x1866: 0x0f61, 0x1867: 0x0f71, 0x1868: 0x00d9, 0x1869: 0x0f99, + 0x186a: 0x2039, 0x186b: 0x0269, 0x186c: 0x01d9, 0x186d: 0x0fa9, 0x186e: 0x0fb9, 0x186f: 0x1089, + 0x1870: 0x0279, 0x1871: 0x0369, 0x1872: 0x0289, 0x1873: 0x13d1, 0x1874: 0x0039, 0x1875: 0x0ee9, + 0x1876: 0x1159, 0x1877: 0x0ef9, 0x1878: 0x0f09, 0x1879: 0x1199, 0x187a: 0x0f31, 0x187b: 0x0249, + 0x187c: 0x0f41, 0x187d: 0x0259, 0x187e: 0x0f51, 0x187f: 0x0359, + // Block 0x62, offset 0x1880 + 0x1880: 0x0f61, 0x1881: 0x0f71, 0x1882: 0x00d9, 0x1883: 0x0f99, 0x1884: 0x2039, 0x1885: 0x0269, + 0x1886: 0x01d9, 0x1887: 0x0fa9, 0x1888: 0x0fb9, 0x1889: 0x1089, 0x188a: 0x0279, 0x188b: 0x0369, + 0x188c: 0x0289, 0x188d: 0x13d1, 0x188e: 0x0039, 0x188f: 0x0ee9, 0x1890: 0x1159, 0x1891: 0x0ef9, + 0x1892: 0x0f09, 0x1893: 0x1199, 0x1894: 0x0f31, 0x1895: 0x0040, 0x1896: 0x0f41, 0x1897: 0x0259, + 0x1898: 0x0f51, 0x1899: 0x0359, 0x189a: 0x0f61, 0x189b: 0x0f71, 0x189c: 0x00d9, 0x189d: 0x0f99, + 0x189e: 0x2039, 0x189f: 0x0269, 0x18a0: 0x01d9, 0x18a1: 0x0fa9, 0x18a2: 0x0fb9, 0x18a3: 0x1089, + 0x18a4: 0x0279, 0x18a5: 0x0369, 0x18a6: 0x0289, 0x18a7: 0x13d1, 0x18a8: 0x0039, 0x18a9: 0x0ee9, + 0x18aa: 0x1159, 0x18ab: 0x0ef9, 0x18ac: 0x0f09, 0x18ad: 0x1199, 0x18ae: 0x0f31, 0x18af: 0x0249, + 0x18b0: 0x0f41, 0x18b1: 0x0259, 0x18b2: 0x0f51, 0x18b3: 0x0359, 0x18b4: 0x0f61, 0x18b5: 0x0f71, + 0x18b6: 0x00d9, 0x18b7: 0x0f99, 0x18b8: 0x2039, 0x18b9: 0x0269, 0x18ba: 0x01d9, 0x18bb: 0x0fa9, + 0x18bc: 0x0fb9, 0x18bd: 0x1089, 0x18be: 0x0279, 0x18bf: 0x0369, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0289, 0x18c1: 0x13d1, 0x18c2: 0x0039, 0x18c3: 0x0ee9, 0x18c4: 0x1159, 0x18c5: 0x0ef9, + 0x18c6: 0x0f09, 0x18c7: 0x1199, 0x18c8: 0x0f31, 0x18c9: 0x0249, 0x18ca: 0x0f41, 0x18cb: 0x0259, + 0x18cc: 0x0f51, 0x18cd: 0x0359, 0x18ce: 0x0f61, 0x18cf: 0x0f71, 0x18d0: 0x00d9, 0x18d1: 0x0f99, + 0x18d2: 0x2039, 0x18d3: 0x0269, 0x18d4: 0x01d9, 0x18d5: 0x0fa9, 0x18d6: 0x0fb9, 0x18d7: 0x1089, + 0x18d8: 0x0279, 0x18d9: 0x0369, 0x18da: 0x0289, 0x18db: 0x13d1, 0x18dc: 0x0039, 0x18dd: 0x0040, + 0x18de: 0x1159, 0x18df: 0x0ef9, 0x18e0: 0x0040, 0x18e1: 0x0040, 0x18e2: 0x0f31, 0x18e3: 0x0040, + 0x18e4: 0x0040, 0x18e5: 0x0259, 0x18e6: 0x0f51, 0x18e7: 0x0040, 0x18e8: 0x0040, 0x18e9: 0x0f71, + 0x18ea: 0x00d9, 0x18eb: 0x0f99, 0x18ec: 0x2039, 0x18ed: 0x0040, 0x18ee: 0x01d9, 0x18ef: 0x0fa9, + 0x18f0: 0x0fb9, 0x18f1: 0x1089, 0x18f2: 0x0279, 0x18f3: 0x0369, 0x18f4: 0x0289, 0x18f5: 0x13d1, + 0x18f6: 0x0039, 0x18f7: 0x0ee9, 0x18f8: 0x1159, 0x18f9: 0x0ef9, 0x18fa: 0x0040, 0x18fb: 0x1199, + 0x18fc: 0x0040, 0x18fd: 0x0249, 0x18fe: 0x0f41, 0x18ff: 0x0259, + // Block 0x64, offset 0x1900 + 0x1900: 0x0f51, 0x1901: 0x0359, 0x1902: 0x0f61, 0x1903: 0x0f71, 0x1904: 0x0040, 0x1905: 0x0f99, + 0x1906: 0x2039, 0x1907: 0x0269, 0x1908: 0x01d9, 0x1909: 0x0fa9, 0x190a: 0x0fb9, 0x190b: 0x1089, + 0x190c: 0x0279, 0x190d: 0x0369, 0x190e: 0x0289, 0x190f: 0x13d1, 0x1910: 0x0039, 0x1911: 0x0ee9, + 0x1912: 0x1159, 0x1913: 0x0ef9, 0x1914: 0x0f09, 0x1915: 0x1199, 0x1916: 0x0f31, 0x1917: 0x0249, + 0x1918: 0x0f41, 0x1919: 0x0259, 0x191a: 0x0f51, 0x191b: 0x0359, 0x191c: 0x0f61, 0x191d: 0x0f71, + 0x191e: 0x00d9, 0x191f: 0x0f99, 0x1920: 0x2039, 0x1921: 0x0269, 0x1922: 0x01d9, 0x1923: 0x0fa9, + 0x1924: 0x0fb9, 0x1925: 0x1089, 0x1926: 0x0279, 0x1927: 0x0369, 0x1928: 0x0289, 0x1929: 0x13d1, + 0x192a: 0x0039, 0x192b: 0x0ee9, 0x192c: 0x1159, 0x192d: 0x0ef9, 0x192e: 0x0f09, 0x192f: 0x1199, + 0x1930: 0x0f31, 0x1931: 0x0249, 0x1932: 0x0f41, 0x1933: 0x0259, 0x1934: 0x0f51, 0x1935: 0x0359, + 0x1936: 0x0f61, 0x1937: 0x0f71, 0x1938: 0x00d9, 0x1939: 0x0f99, 0x193a: 0x2039, 0x193b: 0x0269, + 0x193c: 0x01d9, 0x193d: 0x0fa9, 0x193e: 0x0fb9, 0x193f: 0x1089, + // Block 0x65, offset 0x1940 + 0x1940: 0x0279, 0x1941: 0x0369, 0x1942: 0x0289, 0x1943: 0x13d1, 0x1944: 0x0039, 0x1945: 0x0ee9, + 0x1946: 0x0040, 0x1947: 0x0ef9, 0x1948: 0x0f09, 0x1949: 0x1199, 0x194a: 0x0f31, 0x194b: 0x0040, + 0x194c: 0x0040, 0x194d: 0x0259, 0x194e: 0x0f51, 0x194f: 0x0359, 0x1950: 0x0f61, 0x1951: 0x0f71, + 0x1952: 0x00d9, 0x1953: 0x0f99, 0x1954: 0x2039, 0x1955: 0x0040, 0x1956: 0x01d9, 0x1957: 0x0fa9, + 0x1958: 0x0fb9, 0x1959: 0x1089, 0x195a: 0x0279, 0x195b: 0x0369, 0x195c: 0x0289, 0x195d: 0x0040, + 0x195e: 0x0039, 0x195f: 0x0ee9, 0x1960: 0x1159, 0x1961: 0x0ef9, 0x1962: 0x0f09, 0x1963: 0x1199, + 0x1964: 0x0f31, 0x1965: 0x0249, 0x1966: 0x0f41, 0x1967: 0x0259, 0x1968: 0x0f51, 0x1969: 0x0359, + 0x196a: 0x0f61, 0x196b: 0x0f71, 0x196c: 0x00d9, 0x196d: 0x0f99, 0x196e: 0x2039, 0x196f: 0x0269, + 0x1970: 0x01d9, 0x1971: 0x0fa9, 0x1972: 0x0fb9, 0x1973: 0x1089, 0x1974: 0x0279, 0x1975: 0x0369, + 0x1976: 0x0289, 0x1977: 0x13d1, 0x1978: 0x0039, 0x1979: 0x0ee9, 0x197a: 0x0040, 0x197b: 0x0ef9, + 0x197c: 0x0f09, 0x197d: 0x1199, 0x197e: 0x0f31, 0x197f: 0x0040, + // Block 0x66, offset 0x1980 + 0x1980: 0x0f41, 0x1981: 0x0259, 0x1982: 0x0f51, 0x1983: 0x0359, 0x1984: 0x0f61, 0x1985: 0x0040, + 0x1986: 0x00d9, 0x1987: 0x0040, 0x1988: 0x0040, 0x1989: 0x0040, 0x198a: 0x01d9, 0x198b: 0x0fa9, + 0x198c: 0x0fb9, 0x198d: 0x1089, 0x198e: 0x0279, 0x198f: 0x0369, 0x1990: 0x0289, 0x1991: 0x0040, + 0x1992: 0x0039, 0x1993: 0x0ee9, 0x1994: 0x1159, 0x1995: 0x0ef9, 0x1996: 0x0f09, 0x1997: 0x1199, + 0x1998: 0x0f31, 0x1999: 0x0249, 0x199a: 0x0f41, 0x199b: 0x0259, 0x199c: 0x0f51, 0x199d: 0x0359, + 0x199e: 0x0f61, 0x199f: 0x0f71, 0x19a0: 0x00d9, 0x19a1: 0x0f99, 0x19a2: 0x2039, 0x19a3: 0x0269, + 0x19a4: 0x01d9, 0x19a5: 0x0fa9, 0x19a6: 0x0fb9, 0x19a7: 0x1089, 0x19a8: 0x0279, 0x19a9: 0x0369, + 0x19aa: 0x0289, 0x19ab: 0x13d1, 0x19ac: 0x0039, 0x19ad: 0x0ee9, 0x19ae: 0x1159, 0x19af: 0x0ef9, + 0x19b0: 0x0f09, 0x19b1: 0x1199, 0x19b2: 0x0f31, 0x19b3: 0x0249, 0x19b4: 0x0f41, 0x19b5: 0x0259, + 0x19b6: 0x0f51, 0x19b7: 0x0359, 0x19b8: 0x0f61, 0x19b9: 0x0f71, 0x19ba: 0x00d9, 0x19bb: 0x0f99, + 0x19bc: 0x2039, 0x19bd: 0x0269, 0x19be: 0x01d9, 0x19bf: 0x0fa9, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x0fb9, 0x19c1: 0x1089, 0x19c2: 0x0279, 0x19c3: 0x0369, 0x19c4: 0x0289, 0x19c5: 0x13d1, + 0x19c6: 0x0039, 0x19c7: 0x0ee9, 0x19c8: 0x1159, 0x19c9: 0x0ef9, 0x19ca: 0x0f09, 0x19cb: 0x1199, + 0x19cc: 0x0f31, 0x19cd: 0x0249, 0x19ce: 0x0f41, 0x19cf: 0x0259, 0x19d0: 0x0f51, 0x19d1: 0x0359, + 0x19d2: 0x0f61, 0x19d3: 0x0f71, 0x19d4: 0x00d9, 0x19d5: 0x0f99, 0x19d6: 0x2039, 0x19d7: 0x0269, + 0x19d8: 0x01d9, 0x19d9: 0x0fa9, 0x19da: 0x0fb9, 0x19db: 0x1089, 0x19dc: 0x0279, 0x19dd: 0x0369, + 0x19de: 0x0289, 0x19df: 0x13d1, 0x19e0: 0x0039, 0x19e1: 0x0ee9, 0x19e2: 0x1159, 0x19e3: 0x0ef9, + 0x19e4: 0x0f09, 0x19e5: 0x1199, 0x19e6: 0x0f31, 0x19e7: 0x0249, 0x19e8: 0x0f41, 0x19e9: 0x0259, + 0x19ea: 0x0f51, 0x19eb: 0x0359, 0x19ec: 0x0f61, 0x19ed: 0x0f71, 0x19ee: 0x00d9, 0x19ef: 0x0f99, + 0x19f0: 0x2039, 0x19f1: 0x0269, 0x19f2: 0x01d9, 0x19f3: 0x0fa9, 0x19f4: 0x0fb9, 0x19f5: 0x1089, + 0x19f6: 0x0279, 0x19f7: 0x0369, 0x19f8: 0x0289, 0x19f9: 0x13d1, 0x19fa: 0x0039, 0x19fb: 0x0ee9, + 0x19fc: 0x1159, 0x19fd: 0x0ef9, 0x19fe: 0x0f09, 0x19ff: 0x1199, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x0f31, 0x1a01: 0x0249, 0x1a02: 0x0f41, 0x1a03: 0x0259, 0x1a04: 0x0f51, 0x1a05: 0x0359, + 0x1a06: 0x0f61, 0x1a07: 0x0f71, 0x1a08: 0x00d9, 0x1a09: 0x0f99, 0x1a0a: 0x2039, 0x1a0b: 0x0269, + 0x1a0c: 0x01d9, 0x1a0d: 0x0fa9, 0x1a0e: 0x0fb9, 0x1a0f: 0x1089, 0x1a10: 0x0279, 0x1a11: 0x0369, + 0x1a12: 0x0289, 0x1a13: 0x13d1, 0x1a14: 0x0039, 0x1a15: 0x0ee9, 0x1a16: 0x1159, 0x1a17: 0x0ef9, + 0x1a18: 0x0f09, 0x1a19: 0x1199, 0x1a1a: 0x0f31, 0x1a1b: 0x0249, 0x1a1c: 0x0f41, 0x1a1d: 0x0259, + 0x1a1e: 0x0f51, 0x1a1f: 0x0359, 0x1a20: 0x0f61, 0x1a21: 0x0f71, 0x1a22: 0x00d9, 0x1a23: 0x0f99, + 0x1a24: 0x2039, 0x1a25: 0x0269, 0x1a26: 0x01d9, 0x1a27: 0x0fa9, 0x1a28: 0x0fb9, 0x1a29: 0x1089, + 0x1a2a: 0x0279, 0x1a2b: 0x0369, 0x1a2c: 0x0289, 0x1a2d: 0x13d1, 0x1a2e: 0x0039, 0x1a2f: 0x0ee9, + 0x1a30: 0x1159, 0x1a31: 0x0ef9, 0x1a32: 0x0f09, 0x1a33: 0x1199, 0x1a34: 0x0f31, 0x1a35: 0x0249, + 0x1a36: 0x0f41, 0x1a37: 0x0259, 0x1a38: 0x0f51, 0x1a39: 0x0359, 0x1a3a: 0x0f61, 0x1a3b: 0x0f71, + 0x1a3c: 0x00d9, 0x1a3d: 0x0f99, 0x1a3e: 0x2039, 0x1a3f: 0x0269, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x01d9, 0x1a41: 0x0fa9, 0x1a42: 0x0fb9, 0x1a43: 0x1089, 0x1a44: 0x0279, 0x1a45: 0x0369, + 0x1a46: 0x0289, 0x1a47: 0x13d1, 0x1a48: 0x0039, 0x1a49: 0x0ee9, 0x1a4a: 0x1159, 0x1a4b: 0x0ef9, + 0x1a4c: 0x0f09, 0x1a4d: 0x1199, 0x1a4e: 0x0f31, 0x1a4f: 0x0249, 0x1a50: 0x0f41, 0x1a51: 0x0259, + 0x1a52: 0x0f51, 0x1a53: 0x0359, 0x1a54: 0x0f61, 0x1a55: 0x0f71, 0x1a56: 0x00d9, 0x1a57: 0x0f99, + 0x1a58: 0x2039, 0x1a59: 0x0269, 0x1a5a: 0x01d9, 0x1a5b: 0x0fa9, 0x1a5c: 0x0fb9, 0x1a5d: 0x1089, + 0x1a5e: 0x0279, 0x1a5f: 0x0369, 0x1a60: 0x0289, 0x1a61: 0x13d1, 0x1a62: 0x0039, 0x1a63: 0x0ee9, + 0x1a64: 0x1159, 0x1a65: 0x0ef9, 0x1a66: 0x0f09, 0x1a67: 0x1199, 0x1a68: 0x0f31, 0x1a69: 0x0249, + 0x1a6a: 0x0f41, 0x1a6b: 0x0259, 0x1a6c: 0x0f51, 0x1a6d: 0x0359, 0x1a6e: 0x0f61, 0x1a6f: 0x0f71, + 0x1a70: 0x00d9, 0x1a71: 0x0f99, 0x1a72: 0x2039, 0x1a73: 0x0269, 0x1a74: 0x01d9, 0x1a75: 0x0fa9, + 0x1a76: 0x0fb9, 0x1a77: 0x1089, 0x1a78: 0x0279, 0x1a79: 0x0369, 0x1a7a: 0x0289, 0x1a7b: 0x13d1, + 0x1a7c: 0x0039, 0x1a7d: 0x0ee9, 0x1a7e: 0x1159, 0x1a7f: 0x0ef9, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x0f09, 0x1a81: 0x1199, 0x1a82: 0x0f31, 0x1a83: 0x0249, 0x1a84: 0x0f41, 0x1a85: 0x0259, + 0x1a86: 0x0f51, 0x1a87: 0x0359, 0x1a88: 0x0f61, 0x1a89: 0x0f71, 0x1a8a: 0x00d9, 0x1a8b: 0x0f99, + 0x1a8c: 0x2039, 0x1a8d: 0x0269, 0x1a8e: 0x01d9, 0x1a8f: 0x0fa9, 0x1a90: 0x0fb9, 0x1a91: 0x1089, + 0x1a92: 0x0279, 0x1a93: 0x0369, 0x1a94: 0x0289, 0x1a95: 0x13d1, 0x1a96: 0x0039, 0x1a97: 0x0ee9, + 0x1a98: 0x1159, 0x1a99: 0x0ef9, 0x1a9a: 0x0f09, 0x1a9b: 0x1199, 0x1a9c: 0x0f31, 0x1a9d: 0x0249, + 0x1a9e: 0x0f41, 0x1a9f: 0x0259, 0x1aa0: 0x0f51, 0x1aa1: 0x0359, 0x1aa2: 0x0f61, 0x1aa3: 0x0f71, + 0x1aa4: 0x00d9, 0x1aa5: 0x0f99, 0x1aa6: 0x2039, 0x1aa7: 0x0269, 0x1aa8: 0x01d9, 0x1aa9: 0x0fa9, + 0x1aaa: 0x0fb9, 0x1aab: 0x1089, 0x1aac: 0x0279, 0x1aad: 0x0369, 0x1aae: 0x0289, 0x1aaf: 0x13d1, + 0x1ab0: 0x0039, 0x1ab1: 0x0ee9, 0x1ab2: 0x1159, 0x1ab3: 0x0ef9, 0x1ab4: 0x0f09, 0x1ab5: 0x1199, + 0x1ab6: 0x0f31, 0x1ab7: 0x0249, 0x1ab8: 0x0f41, 0x1ab9: 0x0259, 0x1aba: 0x0f51, 0x1abb: 0x0359, + 0x1abc: 0x0f61, 0x1abd: 0x0f71, 0x1abe: 0x00d9, 0x1abf: 0x0f99, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x2039, 0x1ac1: 0x0269, 0x1ac2: 0x01d9, 0x1ac3: 0x0fa9, 0x1ac4: 0x0fb9, 0x1ac5: 0x1089, + 0x1ac6: 0x0279, 0x1ac7: 0x0369, 0x1ac8: 0x0289, 0x1ac9: 0x13d1, 0x1aca: 0x0039, 0x1acb: 0x0ee9, + 0x1acc: 0x1159, 0x1acd: 0x0ef9, 0x1ace: 0x0f09, 0x1acf: 0x1199, 0x1ad0: 0x0f31, 0x1ad1: 0x0249, + 0x1ad2: 0x0f41, 0x1ad3: 0x0259, 0x1ad4: 0x0f51, 0x1ad5: 0x0359, 0x1ad6: 0x0f61, 0x1ad7: 0x0f71, + 0x1ad8: 0x00d9, 0x1ad9: 0x0f99, 0x1ada: 0x2039, 0x1adb: 0x0269, 0x1adc: 0x01d9, 0x1add: 0x0fa9, + 0x1ade: 0x0fb9, 0x1adf: 0x1089, 0x1ae0: 0x0279, 0x1ae1: 0x0369, 0x1ae2: 0x0289, 0x1ae3: 0x13d1, + 0x1ae4: 0xba81, 0x1ae5: 0xba99, 0x1ae6: 0x0040, 0x1ae7: 0x0040, 0x1ae8: 0xbab1, 0x1ae9: 0x1099, + 0x1aea: 0x10b1, 0x1aeb: 0x10c9, 0x1aec: 0xbac9, 0x1aed: 0xbae1, 0x1aee: 0xbaf9, 0x1aef: 0x1429, + 0x1af0: 0x1a31, 0x1af1: 0xbb11, 0x1af2: 0xbb29, 0x1af3: 0xbb41, 0x1af4: 0xbb59, 0x1af5: 0xbb71, + 0x1af6: 0xbb89, 0x1af7: 0x2109, 0x1af8: 0x1111, 0x1af9: 0x1429, 0x1afa: 0xbba1, 0x1afb: 0xbbb9, + 0x1afc: 0xbbd1, 0x1afd: 0x10e1, 0x1afe: 0x10f9, 0x1aff: 0xbbe9, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x2079, 0x1b01: 0xbc01, 0x1b02: 0xbab1, 0x1b03: 0x1099, 0x1b04: 0x10b1, 0x1b05: 0x10c9, + 0x1b06: 0xbac9, 0x1b07: 0xbae1, 0x1b08: 0xbaf9, 0x1b09: 0x1429, 0x1b0a: 0x1a31, 0x1b0b: 0xbb11, + 0x1b0c: 0xbb29, 0x1b0d: 0xbb41, 0x1b0e: 0xbb59, 0x1b0f: 0xbb71, 0x1b10: 0xbb89, 0x1b11: 0x2109, + 0x1b12: 0x1111, 0x1b13: 0xbba1, 0x1b14: 0xbba1, 0x1b15: 0xbbb9, 0x1b16: 0xbbd1, 0x1b17: 0x10e1, + 0x1b18: 0x10f9, 0x1b19: 0xbbe9, 0x1b1a: 0x2079, 0x1b1b: 0xbc21, 0x1b1c: 0xbac9, 0x1b1d: 0x1429, + 0x1b1e: 0xbb11, 0x1b1f: 0x10e1, 0x1b20: 0x1111, 0x1b21: 0x2109, 0x1b22: 0xbab1, 0x1b23: 0x1099, + 0x1b24: 0x10b1, 0x1b25: 0x10c9, 0x1b26: 0xbac9, 0x1b27: 0xbae1, 0x1b28: 0xbaf9, 0x1b29: 0x1429, + 0x1b2a: 0x1a31, 0x1b2b: 0xbb11, 0x1b2c: 0xbb29, 0x1b2d: 0xbb41, 0x1b2e: 0xbb59, 0x1b2f: 0xbb71, + 0x1b30: 0xbb89, 0x1b31: 0x2109, 0x1b32: 0x1111, 0x1b33: 0x1429, 0x1b34: 0xbba1, 0x1b35: 0xbbb9, + 0x1b36: 0xbbd1, 0x1b37: 0x10e1, 0x1b38: 0x10f9, 0x1b39: 0xbbe9, 0x1b3a: 0x2079, 0x1b3b: 0xbc01, + 0x1b3c: 0xbab1, 0x1b3d: 0x1099, 0x1b3e: 0x10b1, 0x1b3f: 0x10c9, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0xbac9, 0x1b41: 0xbae1, 0x1b42: 0xbaf9, 0x1b43: 0x1429, 0x1b44: 0x1a31, 0x1b45: 0xbb11, + 0x1b46: 0xbb29, 0x1b47: 0xbb41, 0x1b48: 0xbb59, 0x1b49: 0xbb71, 0x1b4a: 0xbb89, 0x1b4b: 0x2109, + 0x1b4c: 0x1111, 0x1b4d: 0xbba1, 0x1b4e: 0xbba1, 0x1b4f: 0xbbb9, 0x1b50: 0xbbd1, 0x1b51: 0x10e1, + 0x1b52: 0x10f9, 0x1b53: 0xbbe9, 0x1b54: 0x2079, 0x1b55: 0xbc21, 0x1b56: 0xbac9, 0x1b57: 0x1429, + 0x1b58: 0xbb11, 0x1b59: 0x10e1, 0x1b5a: 0x1111, 0x1b5b: 0x2109, 0x1b5c: 0xbab1, 0x1b5d: 0x1099, + 0x1b5e: 0x10b1, 0x1b5f: 0x10c9, 0x1b60: 0xbac9, 0x1b61: 0xbae1, 0x1b62: 0xbaf9, 0x1b63: 0x1429, + 0x1b64: 0x1a31, 0x1b65: 0xbb11, 0x1b66: 0xbb29, 0x1b67: 0xbb41, 0x1b68: 0xbb59, 0x1b69: 0xbb71, + 0x1b6a: 0xbb89, 0x1b6b: 0x2109, 0x1b6c: 0x1111, 0x1b6d: 0x1429, 0x1b6e: 0xbba1, 0x1b6f: 0xbbb9, + 0x1b70: 0xbbd1, 0x1b71: 0x10e1, 0x1b72: 0x10f9, 0x1b73: 0xbbe9, 0x1b74: 0x2079, 0x1b75: 0xbc01, + 0x1b76: 0xbab1, 0x1b77: 0x1099, 0x1b78: 0x10b1, 0x1b79: 0x10c9, 0x1b7a: 0xbac9, 0x1b7b: 0xbae1, + 0x1b7c: 0xbaf9, 0x1b7d: 0x1429, 0x1b7e: 0x1a31, 0x1b7f: 0xbb11, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0xbb29, 0x1b81: 0xbb41, 0x1b82: 0xbb59, 0x1b83: 0xbb71, 0x1b84: 0xbb89, 0x1b85: 0x2109, + 0x1b86: 0x1111, 0x1b87: 0xbba1, 0x1b88: 0xbba1, 0x1b89: 0xbbb9, 0x1b8a: 0xbbd1, 0x1b8b: 0x10e1, + 0x1b8c: 0x10f9, 0x1b8d: 0xbbe9, 0x1b8e: 0x2079, 0x1b8f: 0xbc21, 0x1b90: 0xbac9, 0x1b91: 0x1429, + 0x1b92: 0xbb11, 0x1b93: 0x10e1, 0x1b94: 0x1111, 0x1b95: 0x2109, 0x1b96: 0xbab1, 0x1b97: 0x1099, + 0x1b98: 0x10b1, 0x1b99: 0x10c9, 0x1b9a: 0xbac9, 0x1b9b: 0xbae1, 0x1b9c: 0xbaf9, 0x1b9d: 0x1429, + 0x1b9e: 0x1a31, 0x1b9f: 0xbb11, 0x1ba0: 0xbb29, 0x1ba1: 0xbb41, 0x1ba2: 0xbb59, 0x1ba3: 0xbb71, + 0x1ba4: 0xbb89, 0x1ba5: 0x2109, 0x1ba6: 0x1111, 0x1ba7: 0x1429, 0x1ba8: 0xbba1, 0x1ba9: 0xbbb9, + 0x1baa: 0xbbd1, 0x1bab: 0x10e1, 0x1bac: 0x10f9, 0x1bad: 0xbbe9, 0x1bae: 0x2079, 0x1baf: 0xbc01, + 0x1bb0: 0xbab1, 0x1bb1: 0x1099, 0x1bb2: 0x10b1, 0x1bb3: 0x10c9, 0x1bb4: 0xbac9, 0x1bb5: 0xbae1, + 0x1bb6: 0xbaf9, 0x1bb7: 0x1429, 0x1bb8: 0x1a31, 0x1bb9: 0xbb11, 0x1bba: 0xbb29, 0x1bbb: 0xbb41, + 0x1bbc: 0xbb59, 0x1bbd: 0xbb71, 0x1bbe: 0xbb89, 0x1bbf: 0x2109, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x1111, 0x1bc1: 0xbba1, 0x1bc2: 0xbba1, 0x1bc3: 0xbbb9, 0x1bc4: 0xbbd1, 0x1bc5: 0x10e1, + 0x1bc6: 0x10f9, 0x1bc7: 0xbbe9, 0x1bc8: 0x2079, 0x1bc9: 0xbc21, 0x1bca: 0xbac9, 0x1bcb: 0x1429, + 0x1bcc: 0xbb11, 0x1bcd: 0x10e1, 0x1bce: 0x1111, 0x1bcf: 0x2109, 0x1bd0: 0xbab1, 0x1bd1: 0x1099, + 0x1bd2: 0x10b1, 0x1bd3: 0x10c9, 0x1bd4: 0xbac9, 0x1bd5: 0xbae1, 0x1bd6: 0xbaf9, 0x1bd7: 0x1429, + 0x1bd8: 0x1a31, 0x1bd9: 0xbb11, 0x1bda: 0xbb29, 0x1bdb: 0xbb41, 0x1bdc: 0xbb59, 0x1bdd: 0xbb71, + 0x1bde: 0xbb89, 0x1bdf: 0x2109, 0x1be0: 0x1111, 0x1be1: 0x1429, 0x1be2: 0xbba1, 0x1be3: 0xbbb9, + 0x1be4: 0xbbd1, 0x1be5: 0x10e1, 0x1be6: 0x10f9, 0x1be7: 0xbbe9, 0x1be8: 0x2079, 0x1be9: 0xbc01, + 0x1bea: 0xbab1, 0x1beb: 0x1099, 0x1bec: 0x10b1, 0x1bed: 0x10c9, 0x1bee: 0xbac9, 0x1bef: 0xbae1, + 0x1bf0: 0xbaf9, 0x1bf1: 0x1429, 0x1bf2: 0x1a31, 0x1bf3: 0xbb11, 0x1bf4: 0xbb29, 0x1bf5: 0xbb41, + 0x1bf6: 0xbb59, 0x1bf7: 0xbb71, 0x1bf8: 0xbb89, 0x1bf9: 0x2109, 0x1bfa: 0x1111, 0x1bfb: 0xbba1, + 0x1bfc: 0xbba1, 0x1bfd: 0xbbb9, 0x1bfe: 0xbbd1, 0x1bff: 0x10e1, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x10f9, 0x1c01: 0xbbe9, 0x1c02: 0x2079, 0x1c03: 0xbc21, 0x1c04: 0xbac9, 0x1c05: 0x1429, + 0x1c06: 0xbb11, 0x1c07: 0x10e1, 0x1c08: 0x1111, 0x1c09: 0x2109, 0x1c0a: 0xbc41, 0x1c0b: 0xbc41, + 0x1c0c: 0x0040, 0x1c0d: 0x0040, 0x1c0e: 0x1f41, 0x1c0f: 0x00c9, 0x1c10: 0x0069, 0x1c11: 0x0079, + 0x1c12: 0x1f51, 0x1c13: 0x1f61, 0x1c14: 0x1f71, 0x1c15: 0x1f81, 0x1c16: 0x1f91, 0x1c17: 0x1fa1, + 0x1c18: 0x1f41, 0x1c19: 0x00c9, 0x1c1a: 0x0069, 0x1c1b: 0x0079, 0x1c1c: 0x1f51, 0x1c1d: 0x1f61, + 0x1c1e: 0x1f71, 0x1c1f: 0x1f81, 0x1c20: 0x1f91, 0x1c21: 0x1fa1, 0x1c22: 0x1f41, 0x1c23: 0x00c9, + 0x1c24: 0x0069, 0x1c25: 0x0079, 0x1c26: 0x1f51, 0x1c27: 0x1f61, 0x1c28: 0x1f71, 0x1c29: 0x1f81, + 0x1c2a: 0x1f91, 0x1c2b: 0x1fa1, 0x1c2c: 0x1f41, 0x1c2d: 0x00c9, 0x1c2e: 0x0069, 0x1c2f: 0x0079, + 0x1c30: 0x1f51, 0x1c31: 0x1f61, 0x1c32: 0x1f71, 0x1c33: 0x1f81, 0x1c34: 0x1f91, 0x1c35: 0x1fa1, + 0x1c36: 0x1f41, 0x1c37: 0x00c9, 0x1c38: 0x0069, 0x1c39: 0x0079, 0x1c3a: 0x1f51, 0x1c3b: 0x1f61, + 0x1c3c: 0x1f71, 0x1c3d: 0x1f81, 0x1c3e: 0x1f91, 0x1c3f: 0x1fa1, + // Block 0x71, offset 0x1c40 + 0x1c40: 0xe115, 0x1c41: 0xe115, 0x1c42: 0xe135, 0x1c43: 0xe135, 0x1c44: 0xe115, 0x1c45: 0xe115, + 0x1c46: 0xe175, 0x1c47: 0xe175, 0x1c48: 0xe115, 0x1c49: 0xe115, 0x1c4a: 0xe135, 0x1c4b: 0xe135, + 0x1c4c: 0xe115, 0x1c4d: 0xe115, 0x1c4e: 0xe1f5, 0x1c4f: 0xe1f5, 0x1c50: 0xe115, 0x1c51: 0xe115, + 0x1c52: 0xe135, 0x1c53: 0xe135, 0x1c54: 0xe115, 0x1c55: 0xe115, 0x1c56: 0xe175, 0x1c57: 0xe175, + 0x1c58: 0xe115, 0x1c59: 0xe115, 0x1c5a: 0xe135, 0x1c5b: 0xe135, 0x1c5c: 0xe115, 0x1c5d: 0xe115, + 0x1c5e: 0x8b05, 0x1c5f: 0x8b05, 0x1c60: 0x04b5, 0x1c61: 0x04b5, 0x1c62: 0x0a08, 0x1c63: 0x0a08, + 0x1c64: 0x0a08, 0x1c65: 0x0a08, 0x1c66: 0x0a08, 0x1c67: 0x0a08, 0x1c68: 0x0a08, 0x1c69: 0x0a08, + 0x1c6a: 0x0a08, 0x1c6b: 0x0a08, 0x1c6c: 0x0a08, 0x1c6d: 0x0a08, 0x1c6e: 0x0a08, 0x1c6f: 0x0a08, + 0x1c70: 0x0a08, 0x1c71: 0x0a08, 0x1c72: 0x0a08, 0x1c73: 0x0a08, 0x1c74: 0x0a08, 0x1c75: 0x0a08, + 0x1c76: 0x0a08, 0x1c77: 0x0a08, 0x1c78: 0x0a08, 0x1c79: 0x0a08, 0x1c7a: 0x0a08, 0x1c7b: 0x0a08, + 0x1c7c: 0x0a08, 0x1c7d: 0x0a08, 0x1c7e: 0x0a08, 0x1c7f: 0x0a08, + // Block 0x72, offset 0x1c80 + 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0x0040, 0x1c85: 0xb411, + 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0xb399, 0x1c8b: 0xb3b1, + 0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9, + 0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231, + 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0xbc59, 0x1c9d: 0x7949, + 0x1c9e: 0xbc71, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040, + 0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0x0040, 0x1ca9: 0xb429, + 0x1caa: 0xb399, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339, + 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1, + 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0x0040, 0x1cbb: 0xb351, + 0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0040, 0x1cc1: 0x0040, 0x1cc2: 0xb201, 0x1cc3: 0x0040, 0x1cc4: 0x0040, 0x1cc5: 0x0040, + 0x1cc6: 0x0040, 0x1cc7: 0xb219, 0x1cc8: 0x0040, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1, + 0x1ccc: 0x0040, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0x0040, 0x1cd1: 0xb2d9, + 0x1cd2: 0xb381, 0x1cd3: 0x0040, 0x1cd4: 0xb2c1, 0x1cd5: 0x0040, 0x1cd6: 0x0040, 0x1cd7: 0xb231, + 0x1cd8: 0x0040, 0x1cd9: 0xb2f1, 0x1cda: 0x0040, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x7949, + 0x1cde: 0x0040, 0x1cdf: 0xbc89, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0x0040, + 0x1ce4: 0xb3f9, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429, + 0x1cea: 0xb399, 0x1ceb: 0x0040, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339, + 0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0x0040, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1, + 0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0x0040, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351, + 0x1cfc: 0xbc59, 0x1cfd: 0x0040, 0x1cfe: 0xbc71, 0x1cff: 0x0040, + // Block 0x74, offset 0x1d00 + 0x1d00: 0xb189, 0x1d01: 0xb1a1, 0x1d02: 0xb201, 0x1d03: 0xb249, 0x1d04: 0xb3f9, 0x1d05: 0xb411, + 0x1d06: 0xb291, 0x1d07: 0xb219, 0x1d08: 0xb309, 0x1d09: 0xb429, 0x1d0a: 0x0040, 0x1d0b: 0xb3b1, + 0x1d0c: 0xb3c9, 0x1d0d: 0xb3e1, 0x1d0e: 0xb2a9, 0x1d0f: 0xb339, 0x1d10: 0xb369, 0x1d11: 0xb2d9, + 0x1d12: 0xb381, 0x1d13: 0xb279, 0x1d14: 0xb2c1, 0x1d15: 0xb1d1, 0x1d16: 0xb1e9, 0x1d17: 0xb231, + 0x1d18: 0xb261, 0x1d19: 0xb2f1, 0x1d1a: 0xb321, 0x1d1b: 0xb351, 0x1d1c: 0x0040, 0x1d1d: 0x0040, + 0x1d1e: 0x0040, 0x1d1f: 0x0040, 0x1d20: 0x0040, 0x1d21: 0xb1a1, 0x1d22: 0xb201, 0x1d23: 0xb249, + 0x1d24: 0x0040, 0x1d25: 0xb411, 0x1d26: 0xb291, 0x1d27: 0xb219, 0x1d28: 0xb309, 0x1d29: 0xb429, + 0x1d2a: 0x0040, 0x1d2b: 0xb3b1, 0x1d2c: 0xb3c9, 0x1d2d: 0xb3e1, 0x1d2e: 0xb2a9, 0x1d2f: 0xb339, + 0x1d30: 0xb369, 0x1d31: 0xb2d9, 0x1d32: 0xb381, 0x1d33: 0xb279, 0x1d34: 0xb2c1, 0x1d35: 0xb1d1, + 0x1d36: 0xb1e9, 0x1d37: 0xb231, 0x1d38: 0xb261, 0x1d39: 0xb2f1, 0x1d3a: 0xb321, 0x1d3b: 0xb351, + 0x1d3c: 0x0040, 0x1d3d: 0x0040, 0x1d3e: 0x0040, 0x1d3f: 0x0040, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x0040, 0x1d41: 0xbca2, 0x1d42: 0xbcba, 0x1d43: 0xbcd2, 0x1d44: 0xbcea, 0x1d45: 0xbd02, + 0x1d46: 0xbd1a, 0x1d47: 0xbd32, 0x1d48: 0xbd4a, 0x1d49: 0xbd62, 0x1d4a: 0xbd7a, 0x1d4b: 0x0018, + 0x1d4c: 0x0018, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xbd92, 0x1d51: 0xbdb2, + 0x1d52: 0xbdd2, 0x1d53: 0xbdf2, 0x1d54: 0xbe12, 0x1d55: 0xbe32, 0x1d56: 0xbe52, 0x1d57: 0xbe72, + 0x1d58: 0xbe92, 0x1d59: 0xbeb2, 0x1d5a: 0xbed2, 0x1d5b: 0xbef2, 0x1d5c: 0xbf12, 0x1d5d: 0xbf32, + 0x1d5e: 0xbf52, 0x1d5f: 0xbf72, 0x1d60: 0xbf92, 0x1d61: 0xbfb2, 0x1d62: 0xbfd2, 0x1d63: 0xbff2, + 0x1d64: 0xc012, 0x1d65: 0xc032, 0x1d66: 0xc052, 0x1d67: 0xc072, 0x1d68: 0xc092, 0x1d69: 0xc0b2, + 0x1d6a: 0xc0d1, 0x1d6b: 0x1159, 0x1d6c: 0x0269, 0x1d6d: 0x6671, 0x1d6e: 0xc111, 0x1d6f: 0x0040, + 0x1d70: 0x0039, 0x1d71: 0x0ee9, 0x1d72: 0x1159, 0x1d73: 0x0ef9, 0x1d74: 0x0f09, 0x1d75: 0x1199, + 0x1d76: 0x0f31, 0x1d77: 0x0249, 0x1d78: 0x0f41, 0x1d79: 0x0259, 0x1d7a: 0x0f51, 0x1d7b: 0x0359, + 0x1d7c: 0x0f61, 0x1d7d: 0x0f71, 0x1d7e: 0x00d9, 0x1d7f: 0x0f99, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x2039, 0x1d81: 0x0269, 0x1d82: 0x01d9, 0x1d83: 0x0fa9, 0x1d84: 0x0fb9, 0x1d85: 0x1089, + 0x1d86: 0x0279, 0x1d87: 0x0369, 0x1d88: 0x0289, 0x1d89: 0x13d1, 0x1d8a: 0xc129, 0x1d8b: 0x65b1, + 0x1d8c: 0xc141, 0x1d8d: 0x1441, 0x1d8e: 0xc159, 0x1d8f: 0xc179, 0x1d90: 0x0018, 0x1d91: 0x0018, + 0x1d92: 0x0018, 0x1d93: 0x0018, 0x1d94: 0x0018, 0x1d95: 0x0018, 0x1d96: 0x0018, 0x1d97: 0x0018, + 0x1d98: 0x0018, 0x1d99: 0x0018, 0x1d9a: 0x0018, 0x1d9b: 0x0018, 0x1d9c: 0x0018, 0x1d9d: 0x0018, + 0x1d9e: 0x0018, 0x1d9f: 0x0018, 0x1da0: 0x0018, 0x1da1: 0x0018, 0x1da2: 0x0018, 0x1da3: 0x0018, + 0x1da4: 0x0018, 0x1da5: 0x0018, 0x1da6: 0x0018, 0x1da7: 0x0018, 0x1da8: 0x0018, 0x1da9: 0x0018, + 0x1daa: 0xc191, 0x1dab: 0xc1a9, 0x1dac: 0x0040, 0x1dad: 0x0040, 0x1dae: 0x0040, 0x1daf: 0x0040, + 0x1db0: 0x0018, 0x1db1: 0x0018, 0x1db2: 0x0018, 0x1db3: 0x0018, 0x1db4: 0x0018, 0x1db5: 0x0018, + 0x1db6: 0x0018, 0x1db7: 0x0018, 0x1db8: 0x0018, 0x1db9: 0x0018, 0x1dba: 0x0018, 0x1dbb: 0x0018, + 0x1dbc: 0x0018, 0x1dbd: 0x0018, 0x1dbe: 0x0018, 0x1dbf: 0x0018, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xc1d9, 0x1dc1: 0xc211, 0x1dc2: 0xc249, 0x1dc3: 0x0040, 0x1dc4: 0x0040, 0x1dc5: 0x0040, + 0x1dc6: 0x0040, 0x1dc7: 0x0040, 0x1dc8: 0x0040, 0x1dc9: 0x0040, 0x1dca: 0x0040, 0x1dcb: 0x0040, + 0x1dcc: 0x0040, 0x1dcd: 0x0040, 0x1dce: 0x0040, 0x1dcf: 0x0040, 0x1dd0: 0xc269, 0x1dd1: 0xc289, + 0x1dd2: 0xc2a9, 0x1dd3: 0xc2c9, 0x1dd4: 0xc2e9, 0x1dd5: 0xc309, 0x1dd6: 0xc329, 0x1dd7: 0xc349, + 0x1dd8: 0xc369, 0x1dd9: 0xc389, 0x1dda: 0xc3a9, 0x1ddb: 0xc3c9, 0x1ddc: 0xc3e9, 0x1ddd: 0xc409, + 0x1dde: 0xc429, 0x1ddf: 0xc449, 0x1de0: 0xc469, 0x1de1: 0xc489, 0x1de2: 0xc4a9, 0x1de3: 0xc4c9, + 0x1de4: 0xc4e9, 0x1de5: 0xc509, 0x1de6: 0xc529, 0x1de7: 0xc549, 0x1de8: 0xc569, 0x1de9: 0xc589, + 0x1dea: 0xc5a9, 0x1deb: 0xc5c9, 0x1dec: 0xc5e9, 0x1ded: 0xc609, 0x1dee: 0xc629, 0x1def: 0xc649, + 0x1df0: 0xc669, 0x1df1: 0xc689, 0x1df2: 0xc6a9, 0x1df3: 0xc6c9, 0x1df4: 0xc6e9, 0x1df5: 0xc709, + 0x1df6: 0xc729, 0x1df7: 0xc749, 0x1df8: 0xc769, 0x1df9: 0xc789, 0x1dfa: 0xc7a9, 0x1dfb: 0xc7c9, + 0x1dfc: 0x0040, 0x1dfd: 0x0040, 0x1dfe: 0x0040, 0x1dff: 0x0040, + // Block 0x78, offset 0x1e00 + 0x1e00: 0xcaf9, 0x1e01: 0xcb19, 0x1e02: 0xcb39, 0x1e03: 0x8b1d, 0x1e04: 0xcb59, 0x1e05: 0xcb79, + 0x1e06: 0xcb99, 0x1e07: 0xcbb9, 0x1e08: 0xcbd9, 0x1e09: 0xcbf9, 0x1e0a: 0xcc19, 0x1e0b: 0xcc39, + 0x1e0c: 0xcc59, 0x1e0d: 0x8b3d, 0x1e0e: 0xcc79, 0x1e0f: 0xcc99, 0x1e10: 0xccb9, 0x1e11: 0xccd9, + 0x1e12: 0x8b5d, 0x1e13: 0xccf9, 0x1e14: 0xcd19, 0x1e15: 0xc429, 0x1e16: 0x8b7d, 0x1e17: 0xcd39, + 0x1e18: 0xcd59, 0x1e19: 0xcd79, 0x1e1a: 0xcd99, 0x1e1b: 0xcdb9, 0x1e1c: 0x8b9d, 0x1e1d: 0xcdd9, + 0x1e1e: 0xcdf9, 0x1e1f: 0xce19, 0x1e20: 0xce39, 0x1e21: 0xce59, 0x1e22: 0xc789, 0x1e23: 0xce79, + 0x1e24: 0xce99, 0x1e25: 0xceb9, 0x1e26: 0xced9, 0x1e27: 0xcef9, 0x1e28: 0xcf19, 0x1e29: 0xcf39, + 0x1e2a: 0xcf59, 0x1e2b: 0xcf79, 0x1e2c: 0xcf99, 0x1e2d: 0xcfb9, 0x1e2e: 0xcfd9, 0x1e2f: 0xcff9, + 0x1e30: 0xd019, 0x1e31: 0xd039, 0x1e32: 0xd039, 0x1e33: 0xd039, 0x1e34: 0x8bbd, 0x1e35: 0xd059, + 0x1e36: 0xd079, 0x1e37: 0xd099, 0x1e38: 0x8bdd, 0x1e39: 0xd0b9, 0x1e3a: 0xd0d9, 0x1e3b: 0xd0f9, + 0x1e3c: 0xd119, 0x1e3d: 0xd139, 0x1e3e: 0xd159, 0x1e3f: 0xd179, + // Block 0x79, offset 0x1e40 + 0x1e40: 0xd199, 0x1e41: 0xd1b9, 0x1e42: 0xd1d9, 0x1e43: 0xd1f9, 0x1e44: 0xd219, 0x1e45: 0xd239, + 0x1e46: 0xd239, 0x1e47: 0xd259, 0x1e48: 0xd279, 0x1e49: 0xd299, 0x1e4a: 0xd2b9, 0x1e4b: 0xd2d9, + 0x1e4c: 0xd2f9, 0x1e4d: 0xd319, 0x1e4e: 0xd339, 0x1e4f: 0xd359, 0x1e50: 0xd379, 0x1e51: 0xd399, + 0x1e52: 0xd3b9, 0x1e53: 0xd3d9, 0x1e54: 0xd3f9, 0x1e55: 0xd419, 0x1e56: 0xd439, 0x1e57: 0xd459, + 0x1e58: 0xd479, 0x1e59: 0x8bfd, 0x1e5a: 0xd499, 0x1e5b: 0xd4b9, 0x1e5c: 0xd4d9, 0x1e5d: 0xc309, + 0x1e5e: 0xd4f9, 0x1e5f: 0xd519, 0x1e60: 0x8c1d, 0x1e61: 0x8c3d, 0x1e62: 0xd539, 0x1e63: 0xd559, + 0x1e64: 0xd579, 0x1e65: 0xd599, 0x1e66: 0xd5b9, 0x1e67: 0xd5d9, 0x1e68: 0x2040, 0x1e69: 0xd5f9, + 0x1e6a: 0xd619, 0x1e6b: 0xd619, 0x1e6c: 0x8c5d, 0x1e6d: 0xd639, 0x1e6e: 0xd659, 0x1e6f: 0xd679, + 0x1e70: 0xd699, 0x1e71: 0x8c7d, 0x1e72: 0xd6b9, 0x1e73: 0xd6d9, 0x1e74: 0x2040, 0x1e75: 0xd6f9, + 0x1e76: 0xd719, 0x1e77: 0xd739, 0x1e78: 0xd759, 0x1e79: 0xd779, 0x1e7a: 0xd799, 0x1e7b: 0x8c9d, + 0x1e7c: 0xd7b9, 0x1e7d: 0x8cbd, 0x1e7e: 0xd7d9, 0x1e7f: 0xd7f9, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0xd819, 0x1e81: 0xd839, 0x1e82: 0xd859, 0x1e83: 0xd879, 0x1e84: 0xd899, 0x1e85: 0xd8b9, + 0x1e86: 0xd8d9, 0x1e87: 0xd8f9, 0x1e88: 0xd919, 0x1e89: 0x8cdd, 0x1e8a: 0xd939, 0x1e8b: 0xd959, + 0x1e8c: 0xd979, 0x1e8d: 0xd999, 0x1e8e: 0xd9b9, 0x1e8f: 0x8cfd, 0x1e90: 0xd9d9, 0x1e91: 0x8d1d, + 0x1e92: 0x8d3d, 0x1e93: 0xd9f9, 0x1e94: 0xda19, 0x1e95: 0xda19, 0x1e96: 0xda39, 0x1e97: 0x8d5d, + 0x1e98: 0x8d7d, 0x1e99: 0xda59, 0x1e9a: 0xda79, 0x1e9b: 0xda99, 0x1e9c: 0xdab9, 0x1e9d: 0xdad9, + 0x1e9e: 0xdaf9, 0x1e9f: 0xdb19, 0x1ea0: 0xdb39, 0x1ea1: 0xdb59, 0x1ea2: 0xdb79, 0x1ea3: 0xdb99, + 0x1ea4: 0x8d9d, 0x1ea5: 0xdbb9, 0x1ea6: 0xdbd9, 0x1ea7: 0xdbf9, 0x1ea8: 0xdc19, 0x1ea9: 0xdbf9, + 0x1eaa: 0xdc39, 0x1eab: 0xdc59, 0x1eac: 0xdc79, 0x1ead: 0xdc99, 0x1eae: 0xdcb9, 0x1eaf: 0xdcd9, + 0x1eb0: 0xdcf9, 0x1eb1: 0xdd19, 0x1eb2: 0xdd39, 0x1eb3: 0xdd59, 0x1eb4: 0xdd79, 0x1eb5: 0xdd99, + 0x1eb6: 0xddb9, 0x1eb7: 0xddd9, 0x1eb8: 0x8dbd, 0x1eb9: 0xddf9, 0x1eba: 0xde19, 0x1ebb: 0xde39, + 0x1ebc: 0xde59, 0x1ebd: 0xde79, 0x1ebe: 0x8ddd, 0x1ebf: 0xde99, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0xe599, 0x1ec1: 0xe5b9, 0x1ec2: 0xe5d9, 0x1ec3: 0xe5f9, 0x1ec4: 0xe619, 0x1ec5: 0xe639, + 0x1ec6: 0x8efd, 0x1ec7: 0xe659, 0x1ec8: 0xe679, 0x1ec9: 0xe699, 0x1eca: 0xe6b9, 0x1ecb: 0xe6d9, + 0x1ecc: 0xe6f9, 0x1ecd: 0x8f1d, 0x1ece: 0xe719, 0x1ecf: 0xe739, 0x1ed0: 0x8f3d, 0x1ed1: 0x8f5d, + 0x1ed2: 0xe759, 0x1ed3: 0xe779, 0x1ed4: 0xe799, 0x1ed5: 0xe7b9, 0x1ed6: 0xe7d9, 0x1ed7: 0xe7f9, + 0x1ed8: 0xe819, 0x1ed9: 0xe839, 0x1eda: 0xe859, 0x1edb: 0x8f7d, 0x1edc: 0xe879, 0x1edd: 0x8f9d, + 0x1ede: 0xe899, 0x1edf: 0x2040, 0x1ee0: 0xe8b9, 0x1ee1: 0xe8d9, 0x1ee2: 0xe8f9, 0x1ee3: 0x8fbd, + 0x1ee4: 0xe919, 0x1ee5: 0xe939, 0x1ee6: 0x8fdd, 0x1ee7: 0x8ffd, 0x1ee8: 0xe959, 0x1ee9: 0xe979, + 0x1eea: 0xe999, 0x1eeb: 0xe9b9, 0x1eec: 0xe9d9, 0x1eed: 0xe9d9, 0x1eee: 0xe9f9, 0x1eef: 0xea19, + 0x1ef0: 0xea39, 0x1ef1: 0xea59, 0x1ef2: 0xea79, 0x1ef3: 0xea99, 0x1ef4: 0xeab9, 0x1ef5: 0x901d, + 0x1ef6: 0xead9, 0x1ef7: 0x903d, 0x1ef8: 0xeaf9, 0x1ef9: 0x905d, 0x1efa: 0xeb19, 0x1efb: 0x907d, + 0x1efc: 0x909d, 0x1efd: 0x90bd, 0x1efe: 0xeb39, 0x1eff: 0xeb59, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0xeb79, 0x1f01: 0x90dd, 0x1f02: 0x90fd, 0x1f03: 0x911d, 0x1f04: 0x913d, 0x1f05: 0xeb99, + 0x1f06: 0xebb9, 0x1f07: 0xebb9, 0x1f08: 0xebd9, 0x1f09: 0xebf9, 0x1f0a: 0xec19, 0x1f0b: 0xec39, + 0x1f0c: 0xec59, 0x1f0d: 0x915d, 0x1f0e: 0xec79, 0x1f0f: 0xec99, 0x1f10: 0xecb9, 0x1f11: 0xecd9, + 0x1f12: 0x917d, 0x1f13: 0xecf9, 0x1f14: 0x919d, 0x1f15: 0x91bd, 0x1f16: 0xed19, 0x1f17: 0xed39, + 0x1f18: 0xed59, 0x1f19: 0xed79, 0x1f1a: 0xed99, 0x1f1b: 0xedb9, 0x1f1c: 0x91dd, 0x1f1d: 0x91fd, + 0x1f1e: 0x921d, 0x1f1f: 0x2040, 0x1f20: 0xedd9, 0x1f21: 0x923d, 0x1f22: 0xedf9, 0x1f23: 0xee19, + 0x1f24: 0xee39, 0x1f25: 0x925d, 0x1f26: 0xee59, 0x1f27: 0xee79, 0x1f28: 0xee99, 0x1f29: 0xeeb9, + 0x1f2a: 0xeed9, 0x1f2b: 0x927d, 0x1f2c: 0xeef9, 0x1f2d: 0xef19, 0x1f2e: 0xef39, 0x1f2f: 0xef59, + 0x1f30: 0xef79, 0x1f31: 0xef99, 0x1f32: 0x929d, 0x1f33: 0x92bd, 0x1f34: 0xefb9, 0x1f35: 0x92dd, + 0x1f36: 0xefd9, 0x1f37: 0x92fd, 0x1f38: 0xeff9, 0x1f39: 0xf019, 0x1f3a: 0xf039, 0x1f3b: 0x931d, + 0x1f3c: 0x933d, 0x1f3d: 0xf059, 0x1f3e: 0x935d, 0x1f3f: 0xf079, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0xf6b9, 0x1f41: 0xf6d9, 0x1f42: 0xf6f9, 0x1f43: 0xf719, 0x1f44: 0xf739, 0x1f45: 0x951d, + 0x1f46: 0xf759, 0x1f47: 0xf779, 0x1f48: 0xf799, 0x1f49: 0xf7b9, 0x1f4a: 0xf7d9, 0x1f4b: 0x953d, + 0x1f4c: 0x955d, 0x1f4d: 0xf7f9, 0x1f4e: 0xf819, 0x1f4f: 0xf839, 0x1f50: 0xf859, 0x1f51: 0xf879, + 0x1f52: 0xf899, 0x1f53: 0x957d, 0x1f54: 0xf8b9, 0x1f55: 0xf8d9, 0x1f56: 0xf8f9, 0x1f57: 0xf919, + 0x1f58: 0x959d, 0x1f59: 0x95bd, 0x1f5a: 0xf939, 0x1f5b: 0xf959, 0x1f5c: 0xf979, 0x1f5d: 0x95dd, + 0x1f5e: 0xf999, 0x1f5f: 0xf9b9, 0x1f60: 0x6815, 0x1f61: 0x95fd, 0x1f62: 0xf9d9, 0x1f63: 0xf9f9, + 0x1f64: 0xfa19, 0x1f65: 0x961d, 0x1f66: 0xfa39, 0x1f67: 0xfa59, 0x1f68: 0xfa79, 0x1f69: 0xfa99, + 0x1f6a: 0xfab9, 0x1f6b: 0xfad9, 0x1f6c: 0xfaf9, 0x1f6d: 0x963d, 0x1f6e: 0xfb19, 0x1f6f: 0xfb39, + 0x1f70: 0xfb59, 0x1f71: 0x965d, 0x1f72: 0xfb79, 0x1f73: 0xfb99, 0x1f74: 0xfbb9, 0x1f75: 0xfbd9, + 0x1f76: 0x7b35, 0x1f77: 0x967d, 0x1f78: 0xfbf9, 0x1f79: 0xfc19, 0x1f7a: 0xfc39, 0x1f7b: 0x969d, + 0x1f7c: 0xfc59, 0x1f7d: 0x96bd, 0x1f7e: 0xfc79, 0x1f7f: 0xfc79, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0xfc99, 0x1f81: 0x96dd, 0x1f82: 0xfcb9, 0x1f83: 0xfcd9, 0x1f84: 0xfcf9, 0x1f85: 0xfd19, + 0x1f86: 0xfd39, 0x1f87: 0xfd59, 0x1f88: 0xfd79, 0x1f89: 0x96fd, 0x1f8a: 0xfd99, 0x1f8b: 0xfdb9, + 0x1f8c: 0xfdd9, 0x1f8d: 0xfdf9, 0x1f8e: 0xfe19, 0x1f8f: 0xfe39, 0x1f90: 0x971d, 0x1f91: 0xfe59, + 0x1f92: 0x973d, 0x1f93: 0x975d, 0x1f94: 0x977d, 0x1f95: 0xfe79, 0x1f96: 0xfe99, 0x1f97: 0xfeb9, + 0x1f98: 0xfed9, 0x1f99: 0xfef9, 0x1f9a: 0xff19, 0x1f9b: 0xff39, 0x1f9c: 0xff59, 0x1f9d: 0x979d, + 0x1f9e: 0x0040, 0x1f9f: 0x0040, 0x1fa0: 0x0040, 0x1fa1: 0x0040, 0x1fa2: 0x0040, 0x1fa3: 0x0040, + 0x1fa4: 0x0040, 0x1fa5: 0x0040, 0x1fa6: 0x0040, 0x1fa7: 0x0040, 0x1fa8: 0x0040, 0x1fa9: 0x0040, + 0x1faa: 0x0040, 0x1fab: 0x0040, 0x1fac: 0x0040, 0x1fad: 0x0040, 0x1fae: 0x0040, 0x1faf: 0x0040, + 0x1fb0: 0x0040, 0x1fb1: 0x0040, 0x1fb2: 0x0040, 0x1fb3: 0x0040, 0x1fb4: 0x0040, 0x1fb5: 0x0040, + 0x1fb6: 0x0040, 0x1fb7: 0x0040, 0x1fb8: 0x0040, 0x1fb9: 0x0040, 0x1fba: 0x0040, 0x1fbb: 0x0040, + 0x1fbc: 0x0040, 0x1fbd: 0x0040, 0x1fbe: 0x0040, 0x1fbf: 0x0040, +} + +// idnaIndex: 36 blocks, 2304 entries, 4608 bytes +// Block 0 is the zero block. +var idnaIndex = [2304]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x7d, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, + 0xc8: 0x06, 0xc9: 0x7e, 0xca: 0x7f, 0xcb: 0x07, 0xcc: 0x80, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, + 0xd0: 0x81, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x82, 0xd6: 0x83, 0xd7: 0x84, + 0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x85, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x86, 0xde: 0x87, 0xdf: 0x88, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, + 0xf0: 0x1d, 0xf1: 0x1e, 0xf2: 0x1e, 0xf3: 0x20, 0xf4: 0x21, + // Block 0x4, offset 0x100 + 0x120: 0x89, 0x121: 0x13, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x14, 0x126: 0x15, 0x127: 0x16, + 0x128: 0x17, 0x129: 0x18, 0x12a: 0x19, 0x12b: 0x1a, 0x12c: 0x1b, 0x12d: 0x1c, 0x12e: 0x1d, 0x12f: 0x8d, + 0x130: 0x8e, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x8f, 0x135: 0x21, 0x136: 0x90, 0x137: 0x91, + 0x138: 0x92, 0x139: 0x93, 0x13a: 0x22, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x23, 0x13e: 0x24, 0x13f: 0x96, + // Block 0x5, offset 0x140 + 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e, + 0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6, + 0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f, + 0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae, + 0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6, + 0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe, + 0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x25, 0x175: 0x26, 0x176: 0x27, 0x177: 0xc3, + 0x178: 0x28, 0x179: 0x28, 0x17a: 0x29, 0x17b: 0x28, 0x17c: 0xc4, 0x17d: 0x2a, 0x17e: 0x2b, 0x17f: 0x2c, + // Block 0x6, offset 0x180 + 0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0xc5, 0x184: 0x30, 0x185: 0x31, 0x186: 0xc6, 0x187: 0x9b, + 0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0x9b, + 0x190: 0xca, 0x191: 0x32, 0x192: 0x33, 0x193: 0x34, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b, + 0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b, + 0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b, + 0x1a8: 0xcb, 0x1a9: 0xcc, 0x1aa: 0x9b, 0x1ab: 0xcd, 0x1ac: 0x9b, 0x1ad: 0xce, 0x1ae: 0xcf, 0x1af: 0xd0, + 0x1b0: 0xd1, 0x1b1: 0x35, 0x1b2: 0x28, 0x1b3: 0x36, 0x1b4: 0xd2, 0x1b5: 0xd3, 0x1b6: 0xd4, 0x1b7: 0xd5, + 0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1, + 0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41, + 0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f, + 0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f, + 0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f, + 0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f, + 0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f, + 0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f, + // Block 0x8, offset 0x200 + 0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f, + 0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f, + 0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f, + 0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f, + 0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f, + 0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f, + 0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b, + 0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f, + // Block 0x9, offset 0x240 + 0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f, + 0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f, + 0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f, + 0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f, + 0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f, + 0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f, + 0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f, + 0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f, + // Block 0xa, offset 0x280 + 0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f, + 0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f, + 0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f, + 0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f, + 0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f, + 0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f, + 0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f, + 0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe3, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f, + 0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f, + 0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f, + 0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8, + 0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0, + 0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8, + 0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f, + 0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f, + // Block 0xc, offset 0x300 + 0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f, + 0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f, + 0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f, + 0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xf9, 0x31f: 0xfa, + // Block 0xd, offset 0x340 + 0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba, + 0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba, + 0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba, + 0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba, + 0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba, + 0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba, + 0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba, + 0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba, + // Block 0xe, offset 0x380 + 0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba, + 0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba, + 0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba, + 0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba, + 0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfb, 0x3a5: 0xfc, 0x3a6: 0xfd, 0x3a7: 0xfe, + 0x3a8: 0x47, 0x3a9: 0xff, 0x3aa: 0x100, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c, + 0x3b0: 0x101, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x102, 0x3b7: 0x52, + 0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x103, 0x3c1: 0x104, 0x3c2: 0x9f, 0x3c3: 0x105, 0x3c4: 0x106, 0x3c5: 0x9b, 0x3c6: 0x107, 0x3c7: 0x108, + 0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x109, 0x3cb: 0x10a, 0x3cc: 0x10b, 0x3cd: 0x10c, 0x3ce: 0x10d, 0x3cf: 0x10e, + 0x3d0: 0x10f, 0x3d1: 0x9f, 0x3d2: 0x110, 0x3d3: 0x111, 0x3d4: 0x112, 0x3d5: 0x113, 0x3d6: 0xba, 0x3d7: 0xba, + 0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x114, 0x3dd: 0x115, 0x3de: 0xba, 0x3df: 0xba, + 0x3e0: 0x116, 0x3e1: 0x117, 0x3e2: 0x118, 0x3e3: 0x119, 0x3e4: 0x11a, 0x3e5: 0xba, 0x3e6: 0x11b, 0x3e7: 0x11c, + 0x3e8: 0x11d, 0x3e9: 0x11e, 0x3ea: 0x11f, 0x3eb: 0x5b, 0x3ec: 0x120, 0x3ed: 0x121, 0x3ee: 0x5c, 0x3ef: 0xba, + 0x3f0: 0x122, 0x3f1: 0x123, 0x3f2: 0x124, 0x3f3: 0x125, 0x3f4: 0xba, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba, + 0x3f8: 0xba, 0x3f9: 0x126, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0xba, 0x3fd: 0xba, 0x3fe: 0xba, 0x3ff: 0xba, + // Block 0x10, offset 0x400 + 0x400: 0x127, 0x401: 0x128, 0x402: 0x129, 0x403: 0x12a, 0x404: 0x12b, 0x405: 0x12c, 0x406: 0x12d, 0x407: 0x12e, + 0x408: 0x12f, 0x409: 0xba, 0x40a: 0x130, 0x40b: 0x131, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xba, 0x40f: 0xba, + 0x410: 0x132, 0x411: 0x133, 0x412: 0x134, 0x413: 0x135, 0x414: 0xba, 0x415: 0xba, 0x416: 0x136, 0x417: 0x137, + 0x418: 0x138, 0x419: 0x139, 0x41a: 0x13a, 0x41b: 0x13b, 0x41c: 0x13c, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba, + 0x420: 0xba, 0x421: 0xba, 0x422: 0x13d, 0x423: 0x13e, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba, + 0x428: 0x13f, 0x429: 0x140, 0x42a: 0x141, 0x42b: 0x142, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba, + 0x430: 0x143, 0x431: 0x144, 0x432: 0x145, 0x433: 0xba, 0x434: 0x146, 0x435: 0x147, 0x436: 0xba, 0x437: 0xba, + 0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0xba, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba, + // Block 0x11, offset 0x440 + 0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f, + 0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x148, 0x44f: 0xba, + 0x450: 0x9b, 0x451: 0x149, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x14a, 0x456: 0xba, 0x457: 0xba, + 0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba, + 0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba, + 0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba, + 0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba, + 0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba, + // Block 0x12, offset 0x480 + 0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f, + 0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f, + 0x490: 0x14b, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba, + 0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba, + 0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba, + 0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba, + 0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba, + 0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba, + 0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba, + 0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f, + 0x4d8: 0x9f, 0x4d9: 0x14c, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba, + 0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba, + 0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba, + 0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba, + 0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba, + // Block 0x14, offset 0x500 + 0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba, + 0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba, + 0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba, + 0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba, + 0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f, + 0x528: 0x142, 0x529: 0x14d, 0x52a: 0xba, 0x52b: 0x14e, 0x52c: 0x14f, 0x52d: 0x150, 0x52e: 0x151, 0x52f: 0xba, + 0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba, + 0x538: 0xba, 0x539: 0xba, 0x53a: 0xba, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x152, 0x53e: 0x153, 0x53f: 0x154, + // Block 0x15, offset 0x540 + 0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f, + 0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f, + 0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f, + 0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x155, + 0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f, + 0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x156, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba, + 0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba, + 0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba, + // Block 0x16, offset 0x580 + 0x580: 0x9f, 0x581: 0x9f, 0x582: 0x9f, 0x583: 0x9f, 0x584: 0x157, 0x585: 0x158, 0x586: 0x9f, 0x587: 0x9f, + 0x588: 0x9f, 0x589: 0x9f, 0x58a: 0x9f, 0x58b: 0x159, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba, + 0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba, + 0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba, + 0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba, + 0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba, + 0x5b0: 0x9f, 0x5b1: 0x15a, 0x5b2: 0x15b, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba, + 0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x15c, 0x5c4: 0x15d, 0x5c5: 0x15e, 0x5c6: 0x15f, 0x5c7: 0x160, + 0x5c8: 0x9b, 0x5c9: 0x161, 0x5ca: 0xba, 0x5cb: 0xba, 0x5cc: 0x9b, 0x5cd: 0x162, 0x5ce: 0xba, 0x5cf: 0xba, + 0x5d0: 0x5f, 0x5d1: 0x60, 0x5d2: 0x61, 0x5d3: 0x62, 0x5d4: 0x63, 0x5d5: 0x64, 0x5d6: 0x65, 0x5d7: 0x66, + 0x5d8: 0x67, 0x5d9: 0x68, 0x5da: 0x69, 0x5db: 0x6a, 0x5dc: 0x6b, 0x5dd: 0x6c, 0x5de: 0x6d, 0x5df: 0x6e, + 0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b, + 0x5e8: 0x163, 0x5e9: 0x164, 0x5ea: 0x165, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba, + 0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba, + 0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba, + // Block 0x18, offset 0x600 + 0x600: 0x166, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba, + 0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba, + 0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba, + 0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba, + 0x620: 0x122, 0x621: 0x122, 0x622: 0x122, 0x623: 0x167, 0x624: 0x6f, 0x625: 0x168, 0x626: 0xba, 0x627: 0xba, + 0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba, + 0x630: 0xba, 0x631: 0xba, 0x632: 0xba, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba, + 0x638: 0x70, 0x639: 0x71, 0x63a: 0x72, 0x63b: 0x169, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba, + // Block 0x19, offset 0x640 + 0x640: 0x16a, 0x641: 0x9b, 0x642: 0x16b, 0x643: 0x16c, 0x644: 0x73, 0x645: 0x74, 0x646: 0x16d, 0x647: 0x16e, + 0x648: 0x75, 0x649: 0x16f, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b, + 0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b, + 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x170, 0x65c: 0x9b, 0x65d: 0x171, 0x65e: 0x9b, 0x65f: 0x172, + 0x660: 0x173, 0x661: 0x174, 0x662: 0x175, 0x663: 0xba, 0x664: 0x176, 0x665: 0x177, 0x666: 0x178, 0x667: 0x179, + 0x668: 0xba, 0x669: 0xba, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba, + 0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba, + 0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba, + // Block 0x1a, offset 0x680 + 0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f, + 0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f, + 0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f, + 0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x17a, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f, + 0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f, + 0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f, + 0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f, + 0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f, + 0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f, + 0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f, + 0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x17b, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f, + 0x6e0: 0x17c, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f, + 0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f, + 0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f, + 0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f, + // Block 0x1c, offset 0x700 + 0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f, + 0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f, + 0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f, + 0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f, + 0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f, + 0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f, + 0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f, + 0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x17d, 0x73b: 0x9f, 0x73c: 0x9f, 0x73d: 0x9f, 0x73e: 0x9f, 0x73f: 0x9f, + // Block 0x1d, offset 0x740 + 0x740: 0x9f, 0x741: 0x9f, 0x742: 0x9f, 0x743: 0x9f, 0x744: 0x9f, 0x745: 0x9f, 0x746: 0x9f, 0x747: 0x9f, + 0x748: 0x9f, 0x749: 0x9f, 0x74a: 0x9f, 0x74b: 0x9f, 0x74c: 0x9f, 0x74d: 0x9f, 0x74e: 0x9f, 0x74f: 0x9f, + 0x750: 0x9f, 0x751: 0x9f, 0x752: 0x9f, 0x753: 0x9f, 0x754: 0x9f, 0x755: 0x9f, 0x756: 0x9f, 0x757: 0x9f, + 0x758: 0x9f, 0x759: 0x9f, 0x75a: 0x9f, 0x75b: 0x9f, 0x75c: 0x9f, 0x75d: 0x9f, 0x75e: 0x9f, 0x75f: 0x9f, + 0x760: 0x9f, 0x761: 0x9f, 0x762: 0x9f, 0x763: 0x9f, 0x764: 0x9f, 0x765: 0x9f, 0x766: 0x9f, 0x767: 0x9f, + 0x768: 0x9f, 0x769: 0x9f, 0x76a: 0x9f, 0x76b: 0x9f, 0x76c: 0x9f, 0x76d: 0x9f, 0x76e: 0x9f, 0x76f: 0x17e, + 0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba, + 0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba, + // Block 0x1e, offset 0x780 + 0x780: 0xba, 0x781: 0xba, 0x782: 0xba, 0x783: 0xba, 0x784: 0xba, 0x785: 0xba, 0x786: 0xba, 0x787: 0xba, + 0x788: 0xba, 0x789: 0xba, 0x78a: 0xba, 0x78b: 0xba, 0x78c: 0xba, 0x78d: 0xba, 0x78e: 0xba, 0x78f: 0xba, + 0x790: 0xba, 0x791: 0xba, 0x792: 0xba, 0x793: 0xba, 0x794: 0xba, 0x795: 0xba, 0x796: 0xba, 0x797: 0xba, + 0x798: 0xba, 0x799: 0xba, 0x79a: 0xba, 0x79b: 0xba, 0x79c: 0xba, 0x79d: 0xba, 0x79e: 0xba, 0x79f: 0xba, + 0x7a0: 0x76, 0x7a1: 0x77, 0x7a2: 0x78, 0x7a3: 0x17f, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x180, 0x7a7: 0x7b, + 0x7a8: 0x7c, 0x7a9: 0xba, 0x7aa: 0xba, 0x7ab: 0xba, 0x7ac: 0xba, 0x7ad: 0xba, 0x7ae: 0xba, 0x7af: 0xba, + 0x7b0: 0xba, 0x7b1: 0xba, 0x7b2: 0xba, 0x7b3: 0xba, 0x7b4: 0xba, 0x7b5: 0xba, 0x7b6: 0xba, 0x7b7: 0xba, + 0x7b8: 0xba, 0x7b9: 0xba, 0x7ba: 0xba, 0x7bb: 0xba, 0x7bc: 0xba, 0x7bd: 0xba, 0x7be: 0xba, 0x7bf: 0xba, + // Block 0x1f, offset 0x7c0 + 0x7d0: 0x0d, 0x7d1: 0x0e, 0x7d2: 0x0f, 0x7d3: 0x10, 0x7d4: 0x11, 0x7d5: 0x0b, 0x7d6: 0x12, 0x7d7: 0x07, + 0x7d8: 0x13, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x14, 0x7dc: 0x0b, 0x7dd: 0x15, 0x7de: 0x16, 0x7df: 0x17, + 0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07, + 0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x18, 0x7eb: 0x19, 0x7ec: 0x1a, 0x7ed: 0x07, 0x7ee: 0x1b, 0x7ef: 0x1c, + 0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b, + 0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b, + // Block 0x20, offset 0x800 + 0x800: 0x0b, 0x801: 0x0b, 0x802: 0x0b, 0x803: 0x0b, 0x804: 0x0b, 0x805: 0x0b, 0x806: 0x0b, 0x807: 0x0b, + 0x808: 0x0b, 0x809: 0x0b, 0x80a: 0x0b, 0x80b: 0x0b, 0x80c: 0x0b, 0x80d: 0x0b, 0x80e: 0x0b, 0x80f: 0x0b, + 0x810: 0x0b, 0x811: 0x0b, 0x812: 0x0b, 0x813: 0x0b, 0x814: 0x0b, 0x815: 0x0b, 0x816: 0x0b, 0x817: 0x0b, + 0x818: 0x0b, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x0b, 0x81c: 0x0b, 0x81d: 0x0b, 0x81e: 0x0b, 0x81f: 0x0b, + 0x820: 0x0b, 0x821: 0x0b, 0x822: 0x0b, 0x823: 0x0b, 0x824: 0x0b, 0x825: 0x0b, 0x826: 0x0b, 0x827: 0x0b, + 0x828: 0x0b, 0x829: 0x0b, 0x82a: 0x0b, 0x82b: 0x0b, 0x82c: 0x0b, 0x82d: 0x0b, 0x82e: 0x0b, 0x82f: 0x0b, + 0x830: 0x0b, 0x831: 0x0b, 0x832: 0x0b, 0x833: 0x0b, 0x834: 0x0b, 0x835: 0x0b, 0x836: 0x0b, 0x837: 0x0b, + 0x838: 0x0b, 0x839: 0x0b, 0x83a: 0x0b, 0x83b: 0x0b, 0x83c: 0x0b, 0x83d: 0x0b, 0x83e: 0x0b, 0x83f: 0x0b, + // Block 0x21, offset 0x840 + 0x840: 0x181, 0x841: 0x182, 0x842: 0xba, 0x843: 0xba, 0x844: 0x183, 0x845: 0x183, 0x846: 0x183, 0x847: 0x184, + 0x848: 0xba, 0x849: 0xba, 0x84a: 0xba, 0x84b: 0xba, 0x84c: 0xba, 0x84d: 0xba, 0x84e: 0xba, 0x84f: 0xba, + 0x850: 0xba, 0x851: 0xba, 0x852: 0xba, 0x853: 0xba, 0x854: 0xba, 0x855: 0xba, 0x856: 0xba, 0x857: 0xba, + 0x858: 0xba, 0x859: 0xba, 0x85a: 0xba, 0x85b: 0xba, 0x85c: 0xba, 0x85d: 0xba, 0x85e: 0xba, 0x85f: 0xba, + 0x860: 0xba, 0x861: 0xba, 0x862: 0xba, 0x863: 0xba, 0x864: 0xba, 0x865: 0xba, 0x866: 0xba, 0x867: 0xba, + 0x868: 0xba, 0x869: 0xba, 0x86a: 0xba, 0x86b: 0xba, 0x86c: 0xba, 0x86d: 0xba, 0x86e: 0xba, 0x86f: 0xba, + 0x870: 0xba, 0x871: 0xba, 0x872: 0xba, 0x873: 0xba, 0x874: 0xba, 0x875: 0xba, 0x876: 0xba, 0x877: 0xba, + 0x878: 0xba, 0x879: 0xba, 0x87a: 0xba, 0x87b: 0xba, 0x87c: 0xba, 0x87d: 0xba, 0x87e: 0xba, 0x87f: 0xba, + // Block 0x22, offset 0x880 + 0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b, + 0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b, + 0x890: 0x0b, 0x891: 0x0b, 0x892: 0x0b, 0x893: 0x0b, 0x894: 0x0b, 0x895: 0x0b, 0x896: 0x0b, 0x897: 0x0b, + 0x898: 0x0b, 0x899: 0x0b, 0x89a: 0x0b, 0x89b: 0x0b, 0x89c: 0x0b, 0x89d: 0x0b, 0x89e: 0x0b, 0x89f: 0x0b, + 0x8a0: 0x1f, 0x8a1: 0x0b, 0x8a2: 0x0b, 0x8a3: 0x0b, 0x8a4: 0x0b, 0x8a5: 0x0b, 0x8a6: 0x0b, 0x8a7: 0x0b, + 0x8a8: 0x0b, 0x8a9: 0x0b, 0x8aa: 0x0b, 0x8ab: 0x0b, 0x8ac: 0x0b, 0x8ad: 0x0b, 0x8ae: 0x0b, 0x8af: 0x0b, + 0x8b0: 0x0b, 0x8b1: 0x0b, 0x8b2: 0x0b, 0x8b3: 0x0b, 0x8b4: 0x0b, 0x8b5: 0x0b, 0x8b6: 0x0b, 0x8b7: 0x0b, + 0x8b8: 0x0b, 0x8b9: 0x0b, 0x8ba: 0x0b, 0x8bb: 0x0b, 0x8bc: 0x0b, 0x8bd: 0x0b, 0x8be: 0x0b, 0x8bf: 0x0b, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b, + 0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b, +} + +// idnaSparseOffset: 264 entries, 528 bytes +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x4f, 0x5e, 0x63, 0x6b, 0x77, 0x85, 0x8a, 0x93, 0xa3, 0xb1, 0xbd, 0xc9, 0xda, 0xe4, 0xeb, 0xf8, 0x109, 0x110, 0x11b, 0x12a, 0x138, 0x142, 0x144, 0x149, 0x14c, 0x14f, 0x151, 0x15d, 0x168, 0x170, 0x176, 0x17c, 0x181, 0x186, 0x189, 0x18d, 0x193, 0x198, 0x1a4, 0x1ae, 0x1b4, 0x1c5, 0x1cf, 0x1d2, 0x1da, 0x1dd, 0x1ea, 0x1f2, 0x1f6, 0x1fd, 0x205, 0x215, 0x221, 0x223, 0x22d, 0x239, 0x245, 0x251, 0x259, 0x25e, 0x268, 0x279, 0x27d, 0x288, 0x28c, 0x295, 0x29d, 0x2a3, 0x2a8, 0x2ab, 0x2af, 0x2b5, 0x2b9, 0x2bd, 0x2c3, 0x2ca, 0x2d0, 0x2d8, 0x2df, 0x2ea, 0x2f4, 0x2f8, 0x2fb, 0x301, 0x305, 0x307, 0x30a, 0x30c, 0x30f, 0x319, 0x31c, 0x32b, 0x32f, 0x334, 0x337, 0x33b, 0x340, 0x345, 0x34b, 0x351, 0x360, 0x366, 0x36a, 0x379, 0x37e, 0x386, 0x390, 0x39b, 0x3a3, 0x3b4, 0x3bd, 0x3cd, 0x3da, 0x3e4, 0x3e9, 0x3f6, 0x3fa, 0x3ff, 0x401, 0x405, 0x407, 0x40b, 0x414, 0x41a, 0x41e, 0x42e, 0x438, 0x43d, 0x440, 0x446, 0x44d, 0x452, 0x456, 0x45c, 0x461, 0x46a, 0x46f, 0x475, 0x47c, 0x483, 0x48a, 0x48e, 0x493, 0x496, 0x49b, 0x4a7, 0x4ad, 0x4b2, 0x4b9, 0x4c1, 0x4c6, 0x4ca, 0x4da, 0x4e1, 0x4e5, 0x4e9, 0x4f0, 0x4f2, 0x4f5, 0x4f8, 0x4fc, 0x500, 0x506, 0x50f, 0x51b, 0x522, 0x52b, 0x533, 0x53a, 0x548, 0x555, 0x562, 0x56b, 0x56f, 0x57d, 0x585, 0x590, 0x599, 0x59f, 0x5a7, 0x5b0, 0x5ba, 0x5bd, 0x5c9, 0x5cc, 0x5d1, 0x5de, 0x5e7, 0x5f3, 0x5f6, 0x600, 0x609, 0x615, 0x622, 0x62a, 0x62d, 0x632, 0x635, 0x638, 0x63b, 0x642, 0x649, 0x64d, 0x658, 0x65b, 0x661, 0x666, 0x66a, 0x66d, 0x670, 0x673, 0x676, 0x679, 0x67e, 0x688, 0x68b, 0x68f, 0x69e, 0x6aa, 0x6ae, 0x6b3, 0x6b8, 0x6bc, 0x6c1, 0x6ca, 0x6d5, 0x6db, 0x6e3, 0x6e7, 0x6eb, 0x6f1, 0x6f7, 0x6fc, 0x6ff, 0x70f, 0x716, 0x719, 0x71c, 0x720, 0x726, 0x72b, 0x730, 0x735, 0x738, 0x73d, 0x740, 0x743, 0x747, 0x74b, 0x74e, 0x75e, 0x76f, 0x774, 0x776, 0x778} + +// idnaSparseValues: 1915 entries, 7660 bytes +var idnaSparseValues = [1915]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x07}, + {value: 0xe105, lo: 0x80, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0x97}, + {value: 0xe105, lo: 0x98, hi: 0x9e}, + {value: 0x001f, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbf}, + // Block 0x1, offset 0x8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0xe01d, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0335, lo: 0x83, hi: 0x83}, + {value: 0x034d, lo: 0x84, hi: 0x84}, + {value: 0x0365, lo: 0x85, hi: 0x85}, + {value: 0xe00d, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0xe00d, lo: 0x88, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x89}, + {value: 0xe00d, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe00d, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0x8d}, + {value: 0xe00d, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0xbf}, + // Block 0x2, offset 0x19 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0249, lo: 0xb0, hi: 0xb0}, + {value: 0x037d, lo: 0xb1, hi: 0xb1}, + {value: 0x0259, lo: 0xb2, hi: 0xb2}, + {value: 0x0269, lo: 0xb3, hi: 0xb3}, + {value: 0x034d, lo: 0xb4, hi: 0xb4}, + {value: 0x0395, lo: 0xb5, hi: 0xb5}, + {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, + {value: 0x0279, lo: 0xb7, hi: 0xb7}, + {value: 0x0289, lo: 0xb8, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbf}, + // Block 0x3, offset 0x25 + {value: 0x0000, lo: 0x01}, + {value: 0x3308, lo: 0x80, hi: 0xbf}, + // Block 0x4, offset 0x27 + {value: 0x0000, lo: 0x04}, + {value: 0x03f5, lo: 0x80, hi: 0x8f}, + {value: 0xe105, lo: 0x90, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x5, offset 0x2c + {value: 0x0000, lo: 0x07}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x0545, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x0008, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x6, offset 0x34 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0401, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x88}, + {value: 0x0018, lo: 0x89, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x7, offset 0x3f + {value: 0x0000, lo: 0x0b}, + {value: 0x0818, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x82}, + {value: 0x0818, lo: 0x83, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x85}, + {value: 0x0818, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0808, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x8, offset 0x4b + {value: 0x0000, lo: 0x03}, + {value: 0x0a08, lo: 0x80, hi: 0x87}, + {value: 0x0c08, lo: 0x88, hi: 0x99}, + {value: 0x0a08, lo: 0x9a, hi: 0xbf}, + // Block 0x9, offset 0x4f + {value: 0x0000, lo: 0x0e}, + {value: 0x3308, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0c08, lo: 0x8d, hi: 0x8d}, + {value: 0x0a08, lo: 0x8e, hi: 0x98}, + {value: 0x0c08, lo: 0x99, hi: 0x9b}, + {value: 0x0a08, lo: 0x9c, hi: 0xaa}, + {value: 0x0c08, lo: 0xab, hi: 0xac}, + {value: 0x0a08, lo: 0xad, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb1}, + {value: 0x0a08, lo: 0xb2, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb4}, + {value: 0x0a08, lo: 0xb5, hi: 0xb7}, + {value: 0x0c08, lo: 0xb8, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbf}, + // Block 0xa, offset 0x5e + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xb0}, + {value: 0x0808, lo: 0xb1, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xb, offset 0x63 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x89}, + {value: 0x0a08, lo: 0x8a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0xc, offset 0x6b + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x99}, + {value: 0x0808, lo: 0x9a, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa3}, + {value: 0x0808, lo: 0xa4, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa7}, + {value: 0x0808, lo: 0xa8, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0818, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd, offset 0x77 + {value: 0x0000, lo: 0x0d}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0a08, lo: 0xa0, hi: 0xa9}, + {value: 0x0c08, lo: 0xaa, hi: 0xac}, + {value: 0x0808, lo: 0xad, hi: 0xad}, + {value: 0x0c08, lo: 0xae, hi: 0xae}, + {value: 0x0a08, lo: 0xaf, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb2}, + {value: 0x0a08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0a08, lo: 0xb6, hi: 0xb8}, + {value: 0x0c08, lo: 0xb9, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0xe, offset 0x85 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0xa1}, + {value: 0x0840, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xbf}, + // Block 0xf, offset 0x8a + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x10, offset 0x93 + {value: 0x0000, lo: 0x0f}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x85}, + {value: 0x3008, lo: 0x86, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8c}, + {value: 0x3b08, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x11, offset 0xa3 + {value: 0x0000, lo: 0x0d}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x12, offset 0xb1 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xba}, + {value: 0x3b08, lo: 0xbb, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x13, offset 0xbd + {value: 0x0000, lo: 0x0b}, + {value: 0x0040, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x14, offset 0xc9 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x89}, + {value: 0x3b08, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x3008, lo: 0x98, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x15, offset 0xda + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x08f1, lo: 0xb3, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb9}, + {value: 0x3b08, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x16, offset 0xe4 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0xbf}, + // Block 0x17, offset 0xeb + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0961, lo: 0x9c, hi: 0x9c}, + {value: 0x0999, lo: 0x9d, hi: 0x9d}, + {value: 0x0008, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x18, offset 0xf8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe03d, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x19, offset 0x109 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0x1a, offset 0x110 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x1b, offset 0x11b + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x3008, lo: 0xa2, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbf}, + // Block 0x1c, offset 0x12a + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x8c}, + {value: 0x3308, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x3008, lo: 0x9a, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1d, offset 0x138 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x86}, + {value: 0x055d, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8c}, + {value: 0x055d, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0xe105, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0x1e, offset 0x142 + {value: 0x0000, lo: 0x01}, + {value: 0x0018, lo: 0x80, hi: 0xbf}, + // Block 0x1f, offset 0x144 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa0}, + {value: 0x2018, lo: 0xa1, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x20, offset 0x149 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa7}, + {value: 0x2018, lo: 0xa8, hi: 0xbf}, + // Block 0x21, offset 0x14c + {value: 0x0000, lo: 0x02}, + {value: 0x2018, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0xbf}, + // Block 0x22, offset 0x14f + {value: 0x0000, lo: 0x01}, + {value: 0x0008, lo: 0x80, hi: 0xbf}, + // Block 0x23, offset 0x151 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x24, offset 0x15d + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x25, offset 0x168 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x26, offset 0x170 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x27, offset 0x176 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x28, offset 0x17c + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x29, offset 0x181 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x2a, offset 0x186 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x2b, offset 0x189 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xbf}, + // Block 0x2c, offset 0x18d + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x2d, offset 0x193 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x2e, offset 0x198 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x3b08, lo: 0x94, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x2f, offset 0x1a4 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x30, offset 0x1ae + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xb3}, + {value: 0x3340, lo: 0xb4, hi: 0xb5}, + {value: 0x3008, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x31, offset 0x1b4 + {value: 0x0000, lo: 0x10}, + {value: 0x3008, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x91}, + {value: 0x3b08, lo: 0x92, hi: 0x92}, + {value: 0x3308, lo: 0x93, hi: 0x93}, + {value: 0x0018, lo: 0x94, hi: 0x96}, + {value: 0x0008, lo: 0x97, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x32, offset 0x1c5 + {value: 0x0000, lo: 0x09}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x86}, + {value: 0x0218, lo: 0x87, hi: 0x87}, + {value: 0x0018, lo: 0x88, hi: 0x8a}, + {value: 0x33c0, lo: 0x8b, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xbf}, + // Block 0x33, offset 0x1cf + {value: 0x0000, lo: 0x02}, + {value: 0x0208, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x34, offset 0x1d2 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0208, lo: 0x87, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xa9}, + {value: 0x0208, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x35, offset 0x1da + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x36, offset 0x1dd + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x37, offset 0x1ea + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x38, offset 0x1f2 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x39, offset 0x1f6 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0028, lo: 0x9a, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xbf}, + // Block 0x3a, offset 0x1fd + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x3308, lo: 0x97, hi: 0x98}, + {value: 0x3008, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x3b, offset 0x205 + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x94}, + {value: 0x3008, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3b08, lo: 0xa0, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xac}, + {value: 0x3008, lo: 0xad, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x3c, offset 0x215 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xbd}, + {value: 0x3318, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x3d, offset 0x221 + {value: 0x0000, lo: 0x01}, + {value: 0x0040, lo: 0x80, hi: 0xbf}, + // Block 0x3e, offset 0x223 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3008, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x3f, offset 0x22d + {value: 0x0000, lo: 0x0b}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x3808, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x40, offset 0x239 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3808, lo: 0xaa, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xbf}, + // Block 0x41, offset 0x245 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3008, lo: 0xaa, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3808, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbf}, + // Block 0x42, offset 0x251 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x3008, lo: 0xa4, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x43, offset 0x259 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x44, offset 0x25e + {value: 0x0000, lo: 0x09}, + {value: 0x0e29, lo: 0x80, hi: 0x80}, + {value: 0x0e41, lo: 0x81, hi: 0x81}, + {value: 0x0e59, lo: 0x82, hi: 0x82}, + {value: 0x0e71, lo: 0x83, hi: 0x83}, + {value: 0x0e89, lo: 0x84, hi: 0x85}, + {value: 0x0ea1, lo: 0x86, hi: 0x86}, + {value: 0x0eb9, lo: 0x87, hi: 0x87}, + {value: 0x057d, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0x45, offset 0x268 + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x92}, + {value: 0x0018, lo: 0x93, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa8}, + {value: 0x0008, lo: 0xa9, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x46, offset 0x279 + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0x47, offset 0x27d + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x87}, + {value: 0xe045, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0xe045, lo: 0x98, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0xe045, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbf}, + // Block 0x48, offset 0x288 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x3318, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x49, offset 0x28c + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x24c1, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x4a, offset 0x295 + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x24f1, lo: 0xac, hi: 0xac}, + {value: 0x2529, lo: 0xad, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xae}, + {value: 0x2579, lo: 0xaf, hi: 0xaf}, + {value: 0x25b1, lo: 0xb0, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x4b, offset 0x29d + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x9f}, + {value: 0x0080, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xad}, + {value: 0x0080, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x4c, offset 0x2a3 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xa8}, + {value: 0x09c5, lo: 0xa9, hi: 0xa9}, + {value: 0x09e5, lo: 0xaa, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xbf}, + // Block 0x4d, offset 0x2a8 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0x4e, offset 0x2ab + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x28c1, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x4f, offset 0x2af + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0e66, lo: 0xb4, hi: 0xb4}, + {value: 0x292a, lo: 0xb5, hi: 0xb5}, + {value: 0x0e86, lo: 0xb6, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x50, offset 0x2b5 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9b}, + {value: 0x2941, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0xbf}, + // Block 0x51, offset 0x2b9 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x52, offset 0x2bd + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0018, lo: 0xbd, hi: 0xbf}, + // Block 0x53, offset 0x2c3 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x92}, + {value: 0x0040, lo: 0x93, hi: 0xab}, + {value: 0x0018, lo: 0xac, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x54, offset 0x2ca + {value: 0x0000, lo: 0x05}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x03f5, lo: 0x90, hi: 0x9f}, + {value: 0x0ea5, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x55, offset 0x2d0 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x56, offset 0x2d8 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xae}, + {value: 0xe075, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0x57, offset 0x2df + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x58, offset 0x2ea + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xbf}, + // Block 0x59, offset 0x2f4 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x5a, offset 0x2f8 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0x5b, offset 0x2fb + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9e}, + {value: 0x0edd, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x5c, offset 0x301 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb2}, + {value: 0x0efd, lo: 0xb3, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x5d, offset 0x305 + {value: 0x0020, lo: 0x01}, + {value: 0x0f1d, lo: 0x80, hi: 0xbf}, + // Block 0x5e, offset 0x307 + {value: 0x0020, lo: 0x02}, + {value: 0x171d, lo: 0x80, hi: 0x8f}, + {value: 0x18fd, lo: 0x90, hi: 0xbf}, + // Block 0x5f, offset 0x30a + {value: 0x0020, lo: 0x01}, + {value: 0x1efd, lo: 0x80, hi: 0xbf}, + // Block 0x60, offset 0x30c + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x61, offset 0x30f + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9a}, + {value: 0x29e2, lo: 0x9b, hi: 0x9b}, + {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9e}, + {value: 0x2a31, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x62, offset 0x319 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x2a69, lo: 0xbf, hi: 0xbf}, + // Block 0x63, offset 0x31c + {value: 0x0000, lo: 0x0e}, + {value: 0x0040, lo: 0x80, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xb0}, + {value: 0x2a1d, lo: 0xb1, hi: 0xb1}, + {value: 0x2a3d, lo: 0xb2, hi: 0xb2}, + {value: 0x2a5d, lo: 0xb3, hi: 0xb3}, + {value: 0x2a7d, lo: 0xb4, hi: 0xb4}, + {value: 0x2a5d, lo: 0xb5, hi: 0xb5}, + {value: 0x2a9d, lo: 0xb6, hi: 0xb6}, + {value: 0x2abd, lo: 0xb7, hi: 0xb7}, + {value: 0x2add, lo: 0xb8, hi: 0xb9}, + {value: 0x2afd, lo: 0xba, hi: 0xbb}, + {value: 0x2b1d, lo: 0xbc, hi: 0xbd}, + {value: 0x2afd, lo: 0xbe, hi: 0xbf}, + // Block 0x64, offset 0x32b + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x65, offset 0x32f + {value: 0x0030, lo: 0x04}, + {value: 0x2aa2, lo: 0x80, hi: 0x9d}, + {value: 0x305a, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x30a2, lo: 0xa0, hi: 0xbf}, + // Block 0x66, offset 0x334 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0x67, offset 0x337 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x68, offset 0x33b + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x69, offset 0x340 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0x6a, offset 0x345 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb1}, + {value: 0x0018, lo: 0xb2, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6b, offset 0x34b + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xb7}, + {value: 0x2009, lo: 0xb8, hi: 0xb8}, + {value: 0x6e89, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xbf}, + // Block 0x6c, offset 0x351 + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x3308, lo: 0x8b, hi: 0x8b}, + {value: 0x0008, lo: 0x8c, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x6d, offset 0x360 + {value: 0x0000, lo: 0x05}, + {value: 0x0208, lo: 0x80, hi: 0xb1}, + {value: 0x0108, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6e, offset 0x366 + {value: 0x0000, lo: 0x03}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xbf}, + // Block 0x6f, offset 0x36a + {value: 0x0000, lo: 0x0e}, + {value: 0x3008, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xba}, + {value: 0x0008, lo: 0xbb, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x70, offset 0x379 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x71, offset 0x37e + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x91}, + {value: 0x3008, lo: 0x92, hi: 0x92}, + {value: 0x3808, lo: 0x93, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x72, offset 0x386 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb9}, + {value: 0x3008, lo: 0xba, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x73, offset 0x390 + {value: 0x0000, lo: 0x0a}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x74, offset 0x39b + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x75, offset 0x3a3 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8c}, + {value: 0x3008, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0x76, offset 0x3b4 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x77, offset 0x3bd + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x9a}, + {value: 0x0008, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3b08, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x78, offset 0x3cd + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x90}, + {value: 0x0008, lo: 0x91, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x79, offset 0x3da + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x4465, lo: 0x9c, hi: 0x9c}, + {value: 0x447d, lo: 0x9d, hi: 0x9d}, + {value: 0x2971, lo: 0x9e, hi: 0x9e}, + {value: 0xe06d, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xaf}, + {value: 0x4495, lo: 0xb0, hi: 0xbf}, + // Block 0x7a, offset 0x3e4 + {value: 0x0000, lo: 0x04}, + {value: 0x44b5, lo: 0x80, hi: 0x8f}, + {value: 0x44d5, lo: 0x90, hi: 0x9f}, + {value: 0x44f5, lo: 0xa0, hi: 0xaf}, + {value: 0x44d5, lo: 0xb0, hi: 0xbf}, + // Block 0x7b, offset 0x3e9 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3b08, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x7c, offset 0x3f6 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x7d, offset 0x3fa + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x7e, offset 0x3ff + {value: 0x0020, lo: 0x01}, + {value: 0x4515, lo: 0x80, hi: 0xbf}, + // Block 0x7f, offset 0x401 + {value: 0x0020, lo: 0x03}, + {value: 0x4d15, lo: 0x80, hi: 0x94}, + {value: 0x4ad5, lo: 0x95, hi: 0x95}, + {value: 0x4fb5, lo: 0x96, hi: 0xbf}, + // Block 0x80, offset 0x405 + {value: 0x0020, lo: 0x01}, + {value: 0x54f5, lo: 0x80, hi: 0xbf}, + // Block 0x81, offset 0x407 + {value: 0x0020, lo: 0x03}, + {value: 0x5cf5, lo: 0x80, hi: 0x84}, + {value: 0x5655, lo: 0x85, hi: 0x85}, + {value: 0x5d95, lo: 0x86, hi: 0xbf}, + // Block 0x82, offset 0x40b + {value: 0x0020, lo: 0x08}, + {value: 0x6b55, lo: 0x80, hi: 0x8f}, + {value: 0x6d15, lo: 0x90, hi: 0x90}, + {value: 0x6d55, lo: 0x91, hi: 0xab}, + {value: 0x6ea1, lo: 0xac, hi: 0xac}, + {value: 0x70b5, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x70d5, lo: 0xb0, hi: 0xbf}, + // Block 0x83, offset 0x414 + {value: 0x0020, lo: 0x05}, + {value: 0x72d5, lo: 0x80, hi: 0xad}, + {value: 0x6535, lo: 0xae, hi: 0xae}, + {value: 0x7895, lo: 0xaf, hi: 0xb5}, + {value: 0x6f55, lo: 0xb6, hi: 0xb6}, + {value: 0x7975, lo: 0xb7, hi: 0xbf}, + // Block 0x84, offset 0x41a + {value: 0x0028, lo: 0x03}, + {value: 0x7c21, lo: 0x80, hi: 0x82}, + {value: 0x7be1, lo: 0x83, hi: 0x83}, + {value: 0x7c99, lo: 0x84, hi: 0xbf}, + // Block 0x85, offset 0x41e + {value: 0x0038, lo: 0x0f}, + {value: 0x9db1, lo: 0x80, hi: 0x83}, + {value: 0x9e59, lo: 0x84, hi: 0x85}, + {value: 0x9e91, lo: 0x86, hi: 0x87}, + {value: 0x9ec9, lo: 0x88, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0xa089, lo: 0x92, hi: 0x97}, + {value: 0xa1a1, lo: 0x98, hi: 0x9c}, + {value: 0xa281, lo: 0x9d, hi: 0xb3}, + {value: 0x9d41, lo: 0xb4, hi: 0xb4}, + {value: 0x9db1, lo: 0xb5, hi: 0xb5}, + {value: 0xa789, lo: 0xb6, hi: 0xbb}, + {value: 0xa869, lo: 0xbc, hi: 0xbc}, + {value: 0xa7f9, lo: 0xbd, hi: 0xbd}, + {value: 0xa8d9, lo: 0xbe, hi: 0xbf}, + // Block 0x86, offset 0x42e + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x0008, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x87, offset 0x438 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0x88, offset 0x43d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x89, offset 0x440 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x8a, offset 0x446 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x8b, offset 0x44d + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x8c, offset 0x452 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x8d, offset 0x456 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x8e, offset 0x45c + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xbf}, + // Block 0x8f, offset 0x461 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x90, offset 0x46a + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x91, offset 0x46f + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x92, offset 0x475 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x97}, + {value: 0x8ad5, lo: 0x98, hi: 0x9f}, + {value: 0x8aed, lo: 0xa0, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xbf}, + // Block 0x93, offset 0x47c + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x8aed, lo: 0xb0, hi: 0xb7}, + {value: 0x8ad5, lo: 0xb8, hi: 0xbf}, + // Block 0x94, offset 0x483 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x95, offset 0x48a + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x96, offset 0x48e + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xae}, + {value: 0x0018, lo: 0xaf, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x97, offset 0x493 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x98, offset 0x496 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xbf}, + // Block 0x99, offset 0x49b + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0808, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0808, lo: 0x8a, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb6}, + {value: 0x0808, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbb}, + {value: 0x0808, lo: 0xbc, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x0808, lo: 0xbf, hi: 0xbf}, + // Block 0x9a, offset 0x4a7 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0818, lo: 0x97, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb6}, + {value: 0x0818, lo: 0xb7, hi: 0xbf}, + // Block 0x9b, offset 0x4ad + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa6}, + {value: 0x0818, lo: 0xa7, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x9c, offset 0x4b2 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x0818, lo: 0xbb, hi: 0xbf}, + // Block 0x9d, offset 0x4b9 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0818, lo: 0x96, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0818, lo: 0xbf, hi: 0xbf}, + // Block 0x9e, offset 0x4c1 + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbb}, + {value: 0x0818, lo: 0xbc, hi: 0xbd}, + {value: 0x0808, lo: 0xbe, hi: 0xbf}, + // Block 0x9f, offset 0x4c6 + {value: 0x0000, lo: 0x03}, + {value: 0x0818, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x0818, lo: 0x92, hi: 0xbf}, + // Block 0xa0, offset 0x4ca + {value: 0x0000, lo: 0x0f}, + {value: 0x0808, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x94}, + {value: 0x0808, lo: 0x95, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x98}, + {value: 0x0808, lo: 0x99, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xa1, offset 0x4da + {value: 0x0000, lo: 0x06}, + {value: 0x0818, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0818, lo: 0x90, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xbc}, + {value: 0x0818, lo: 0xbd, hi: 0xbf}, + // Block 0xa2, offset 0x4e1 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xa3, offset 0x4e5 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xbf}, + // Block 0xa4, offset 0x4e9 + {value: 0x0000, lo: 0x06}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0818, lo: 0x98, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb7}, + {value: 0x0818, lo: 0xb8, hi: 0xbf}, + // Block 0xa5, offset 0x4f0 + {value: 0x0000, lo: 0x01}, + {value: 0x0808, lo: 0x80, hi: 0xbf}, + // Block 0xa6, offset 0x4f2 + {value: 0x0000, lo: 0x02}, + {value: 0x0808, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xa7, offset 0x4f5 + {value: 0x0000, lo: 0x02}, + {value: 0x03dd, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xa8, offset 0x4f8 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xbf}, + // Block 0xa9, offset 0x4fc + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0818, lo: 0xa0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xaa, offset 0x500 + {value: 0x0000, lo: 0x05}, + {value: 0x3008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xab, offset 0x506 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x91}, + {value: 0x0018, lo: 0x92, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xac, offset 0x50f + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbc}, + {value: 0x0340, lo: 0xbd, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0xad, offset 0x51b + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xae, offset 0x522 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb2}, + {value: 0x3b08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xbf}, + // Block 0xaf, offset 0x52b + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xb0, offset 0x533 + {value: 0x0000, lo: 0x06}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xbe}, + {value: 0x3008, lo: 0xbf, hi: 0xbf}, + // Block 0xb1, offset 0x53a + {value: 0x0000, lo: 0x0d}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xb2, offset 0x548 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3808, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xb3, offset 0x555 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xb4, offset 0x562 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x3308, lo: 0x9f, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa9}, + {value: 0x3b08, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb5, offset 0x56b + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xb6, offset 0x56f + {value: 0x0000, lo: 0x0d}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xb7, offset 0x57d + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xb8, offset 0x585 + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x85}, + {value: 0x0018, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xb9, offset 0x590 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xba, offset 0x599 + {value: 0x0000, lo: 0x05}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9b}, + {value: 0x3308, lo: 0x9c, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xbb, offset 0x59f + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbc, offset 0x5a7 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xbd, offset 0x5b0 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb5}, + {value: 0x3808, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0xbe, offset 0x5ba + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xbf, offset 0x5bd + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xc0, offset 0x5c9 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xbf}, + // Block 0xc1, offset 0x5cc + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0xc2, offset 0x5d1 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0xc3, offset 0x5de + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x3b08, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0xbf}, + // Block 0xc4, offset 0x5e7 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x98}, + {value: 0x3b08, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xa2}, + {value: 0x0040, lo: 0xa3, hi: 0xbf}, + // Block 0xc5, offset 0x5f3 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xc6, offset 0x5f6 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xc7, offset 0x600 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xbf}, + // Block 0xc8, offset 0x609 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xa9}, + {value: 0x3308, lo: 0xaa, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xc9, offset 0x615 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xca, offset 0x622 + {value: 0x0000, lo: 0x07}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xcb, offset 0x62a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xcc, offset 0x62d + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xcd, offset 0x632 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xce, offset 0x635 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xbf}, + // Block 0xcf, offset 0x638 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0xbf}, + // Block 0xd0, offset 0x63b + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xd1, offset 0x642 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xd2, offset 0x649 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0xd3, offset 0x64d + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0xd4, offset 0x658 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0xd5, offset 0x65b + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3008, lo: 0x91, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd6, offset 0x661 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xd7, offset 0x666 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xbf}, + // Block 0xd8, offset 0x66a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xd9, offset 0x66d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xda, offset 0x670 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xdb, offset 0x673 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xdc, offset 0x676 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0xdd, offset 0x679 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0xde, offset 0x67e + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x03c0, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xbf}, + // Block 0xdf, offset 0x688 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xe0, offset 0x68b + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xbf}, + // Block 0xe1, offset 0x68f + {value: 0x0000, lo: 0x0e}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0xb5b9, lo: 0x9e, hi: 0x9e}, + {value: 0xb601, lo: 0x9f, hi: 0x9f}, + {value: 0xb649, lo: 0xa0, hi: 0xa0}, + {value: 0xb6b1, lo: 0xa1, hi: 0xa1}, + {value: 0xb719, lo: 0xa2, hi: 0xa2}, + {value: 0xb781, lo: 0xa3, hi: 0xa3}, + {value: 0xb7e9, lo: 0xa4, hi: 0xa4}, + {value: 0x3018, lo: 0xa5, hi: 0xa6}, + {value: 0x3318, lo: 0xa7, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xac}, + {value: 0x3018, lo: 0xad, hi: 0xb2}, + {value: 0x0340, lo: 0xb3, hi: 0xba}, + {value: 0x3318, lo: 0xbb, hi: 0xbf}, + // Block 0xe2, offset 0x69e + {value: 0x0000, lo: 0x0b}, + {value: 0x3318, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x84}, + {value: 0x3318, lo: 0x85, hi: 0x8b}, + {value: 0x0018, lo: 0x8c, hi: 0xa9}, + {value: 0x3318, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xba}, + {value: 0xb851, lo: 0xbb, hi: 0xbb}, + {value: 0xb899, lo: 0xbc, hi: 0xbc}, + {value: 0xb8e1, lo: 0xbd, hi: 0xbd}, + {value: 0xb949, lo: 0xbe, hi: 0xbe}, + {value: 0xb9b1, lo: 0xbf, hi: 0xbf}, + // Block 0xe3, offset 0x6aa + {value: 0x0000, lo: 0x03}, + {value: 0xba19, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xbf}, + // Block 0xe4, offset 0x6ae + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x3318, lo: 0x82, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0xbf}, + // Block 0xe5, offset 0x6b3 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xe6, offset 0x6b8 + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0xe7, offset 0x6bc + {value: 0x0000, lo: 0x04}, + {value: 0x3308, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0xe8, offset 0x6c1 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x3308, lo: 0xa1, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xe9, offset 0x6ca + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0xea, offset 0x6d5 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x86}, + {value: 0x0818, lo: 0x87, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xeb, offset 0x6db + {value: 0x0000, lo: 0x07}, + {value: 0x0a08, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0818, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xec, offset 0x6e3 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xed, offset 0x6e7 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0xee, offset 0x6eb + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0xef, offset 0x6f1 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xf0, offset 0x6f7 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0xc1c1, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xf1, offset 0x6fc + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xbf}, + // Block 0xf2, offset 0x6ff + {value: 0x0000, lo: 0x0f}, + {value: 0xc7e9, lo: 0x80, hi: 0x80}, + {value: 0xc839, lo: 0x81, hi: 0x81}, + {value: 0xc889, lo: 0x82, hi: 0x82}, + {value: 0xc8d9, lo: 0x83, hi: 0x83}, + {value: 0xc929, lo: 0x84, hi: 0x84}, + {value: 0xc979, lo: 0x85, hi: 0x85}, + {value: 0xc9c9, lo: 0x86, hi: 0x86}, + {value: 0xca19, lo: 0x87, hi: 0x87}, + {value: 0xca69, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0xcab9, lo: 0x90, hi: 0x90}, + {value: 0xcad9, lo: 0x91, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xbf}, + // Block 0xf3, offset 0x70f + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xf4, offset 0x716 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0xf5, offset 0x719 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0xbf}, + // Block 0xf6, offset 0x71c + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0xf7, offset 0x720 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0xf8, offset 0x726 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xbf}, + // Block 0xf9, offset 0x72b + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xfa, offset 0x730 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0xfb, offset 0x735 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0xbf}, + // Block 0xfc, offset 0x738 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0xfd, offset 0x73d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xfe, offset 0x740 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xff, offset 0x743 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x100, offset 0x747 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x101, offset 0x74b + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x102, offset 0x74e + {value: 0x0020, lo: 0x0f}, + {value: 0xdeb9, lo: 0x80, hi: 0x89}, + {value: 0x8dfd, lo: 0x8a, hi: 0x8a}, + {value: 0xdff9, lo: 0x8b, hi: 0x9c}, + {value: 0x8e1d, lo: 0x9d, hi: 0x9d}, + {value: 0xe239, lo: 0x9e, hi: 0xa2}, + {value: 0x8e3d, lo: 0xa3, hi: 0xa3}, + {value: 0xe2d9, lo: 0xa4, hi: 0xab}, + {value: 0x7ed5, lo: 0xac, hi: 0xac}, + {value: 0xe3d9, lo: 0xad, hi: 0xaf}, + {value: 0x8e5d, lo: 0xb0, hi: 0xb0}, + {value: 0xe439, lo: 0xb1, hi: 0xb6}, + {value: 0x8e7d, lo: 0xb7, hi: 0xb9}, + {value: 0xe4f9, lo: 0xba, hi: 0xba}, + {value: 0x8edd, lo: 0xbb, hi: 0xbb}, + {value: 0xe519, lo: 0xbc, hi: 0xbf}, + // Block 0x103, offset 0x75e + {value: 0x0020, lo: 0x10}, + {value: 0x937d, lo: 0x80, hi: 0x80}, + {value: 0xf099, lo: 0x81, hi: 0x86}, + {value: 0x939d, lo: 0x87, hi: 0x8a}, + {value: 0xd9f9, lo: 0x8b, hi: 0x8b}, + {value: 0xf159, lo: 0x8c, hi: 0x96}, + {value: 0x941d, lo: 0x97, hi: 0x97}, + {value: 0xf2b9, lo: 0x98, hi: 0xa3}, + {value: 0x943d, lo: 0xa4, hi: 0xa6}, + {value: 0xf439, lo: 0xa7, hi: 0xaa}, + {value: 0x949d, lo: 0xab, hi: 0xab}, + {value: 0xf4b9, lo: 0xac, hi: 0xac}, + {value: 0x94bd, lo: 0xad, hi: 0xad}, + {value: 0xf4d9, lo: 0xae, hi: 0xaf}, + {value: 0x94dd, lo: 0xb0, hi: 0xb1}, + {value: 0xf519, lo: 0xb2, hi: 0xbe}, + {value: 0x2040, lo: 0xbf, hi: 0xbf}, + // Block 0x104, offset 0x76f + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0340, lo: 0x81, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x9f}, + {value: 0x0340, lo: 0xa0, hi: 0xbf}, + // Block 0x105, offset 0x774 + {value: 0x0000, lo: 0x01}, + {value: 0x0340, lo: 0x80, hi: 0xbf}, + // Block 0x106, offset 0x776 + {value: 0x0000, lo: 0x01}, + {value: 0x33c0, lo: 0x80, hi: 0xbf}, + // Block 0x107, offset 0x778 + {value: 0x0000, lo: 0x02}, + {value: 0x33c0, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, +} + +// Total table size 42114 bytes (41KiB); checksum: 355A58A4 diff --git a/vendor/golang.org/x/net/idna/tables11.0.0.go b/vendor/golang.org/x/net/idna/tables11.0.0.go new file mode 100644 index 00000000..8ce0811f --- /dev/null +++ b/vendor/golang.org/x/net/idna/tables11.0.0.go @@ -0,0 +1,4653 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// +build go1.13,!go1.14 + +package idna + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "11.0.0" + +var mappings string = "" + // Size: 8175 bytes + "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + + "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + + "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + + "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + + "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + + "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + + "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + + "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + + "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + + "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + + "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + + "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + + "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + + "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + + "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + + "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + + "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + + "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + + "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + + "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + + "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + + "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + + "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + + "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + + "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + + "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + + ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + + "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + + "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + + "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + + "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + + "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + + "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + + "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + + "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + + "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" + + "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" + + "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" + + "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" + + "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" + + "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" + + "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" + + "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" + + "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" + + "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" + + "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + + "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + + "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + + "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + + "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + + "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + + "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + + "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + + "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + + "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + + "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + + "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" + + "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" + + "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" + + "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" + + "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" + + "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" + + "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" + + "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" + + "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" + + "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" + + "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" + + "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" + + "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" + + "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" + + "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" + + "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" + + "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" + + " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" + + "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" + + "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" + + "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" + + "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" + + "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" + + "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" + + "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" + + "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" + + "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" + + "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" + + "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" + + "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" + + "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" + + "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" + + "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" + + "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" + + "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" + + "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" + + "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" + + "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" + + "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" + + "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" + + "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" + + "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" + + "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" + + "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" + + "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" + + "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" + + "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" + + "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" + + "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" + + "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" + + "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" + + "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" + + "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" + + "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" + + "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" + + "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" + + "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" + + "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" + + "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" + + "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" + + "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" + + "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" + + "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" + + "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" + + "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" + + "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" + + "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" + + "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" + + "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" + + "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" + + "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" + + "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" + + "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" + + "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" + + "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" + + "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" + + "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" + + "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" + + "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" + + "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" + + "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" + +var xorData string = "" + // Size: 4855 bytes + "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + + "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + + "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + + "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + + "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + + "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + + "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + + "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + + "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + + "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" + + "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" + + "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" + + "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" + + "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" + + "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" + + "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" + + "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" + + "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" + + "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" + + "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" + + "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" + + "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" + + "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" + + "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" + + "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" + + "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" + + "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" + + "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" + + "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" + + "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" + + "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" + + "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" + + "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" + + "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" + + "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" + + "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" + + "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " + + "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" + + "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" + + "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" + + "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" + + "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" + + ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" + + "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" + + "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" + + "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" + + "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" + + "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" + + "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" + + "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" + + "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" + + "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" + + "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" + + "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" + + "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" + + "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" + + "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" + + "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" + + "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" + + "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" + + "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" + + "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + + "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + + "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + + "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + + "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + + "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + + "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + + "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + + "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + + "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + + "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + + "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + + "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + + "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + + "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + + "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + + "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + + "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + + "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + + "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + + "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + + "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + + "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + + "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + + "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + + "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + + "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + + "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + + "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + + "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + + "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + + "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + + ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + + "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + + "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + + "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + + "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + + "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + + "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + + "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + + "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + + "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + + "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + + "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + + "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" + + "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" + + "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" + + "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" + + "\x08\x1a\x0a\x03\x07\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" + + "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" + + "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" + + "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" + + "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" + + "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" + + "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" + + "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" + + "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" + + "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" + + "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" + + "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" + + "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" + + "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" + + "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" + + "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" + + "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" + + "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." + + "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + + "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + + "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + + "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + + "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + + "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + + "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + + "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + + "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + + "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + + "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + + "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + + "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + + "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + + "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + + "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + + "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + + "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + + "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + + "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + + "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + + "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + + "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + + "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + + "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + + "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + + "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + + "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + + "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + + "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + + "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + + "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + + "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + + "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + + "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + + "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + + "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + + "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + + "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + + "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + + "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + + "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + + "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + + "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + + "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + + "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + + "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + + "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + + "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + + "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + + "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + + "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + + "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + + "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + + "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + + "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + + "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + + "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + + "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + + "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + + "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + + "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + + "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + + "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + + "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + + "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + + "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + + "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + + "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + + "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + + "\x04\x03\x0c?\x05\x03\x0c" + + "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + + "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + + "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + + "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + + "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + + "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" + + "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" + + "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" + + "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" + + "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" + + "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" + + "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" + + "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" + + "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" + + "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" + + "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" + + "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" + + "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" + + "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" + + "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" + + "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" + + "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" + + "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" + + "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" + + "\x05\x22\x05\x03\x050\x1d" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// idnaTrie. Total size: 29404 bytes (28.71 KiB). Checksum: 848c45acb5f7991c. +type idnaTrie struct{} + +func newIdnaTrie(i int) *idnaTrie { + return &idnaTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 125: + return uint16(idnaValues[n<<6+uint32(b)]) + default: + n -= 125 + return uint16(idnaSparse.lookup(n, b)) + } +} + +// idnaValues: 127 blocks, 8128 entries, 16256 bytes +// The third block is the zero block. +var idnaValues = [8128]uint16{ + // Block 0x0, offset 0x0 + 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, + 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, + 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, + 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, + 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, + 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, + 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, + 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, + 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, + 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, + 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, + // Block 0x1, offset 0x40 + 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, + 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, + 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, + 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, + 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, + 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, + 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, + 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, + 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, + 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, + 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, + 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, + 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, + 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, + 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, + 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, + 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, + 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, + 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, + // Block 0x4, offset 0x100 + 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, + 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, + 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, + 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, + 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, + 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, + 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, + 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, + 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, + 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, + 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, + // Block 0x5, offset 0x140 + 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, + 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, + 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, + 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, + 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, + 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, + 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, + 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, + 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, + 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, + // Block 0x6, offset 0x180 + 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, + 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, + 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, + 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, + 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, + 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, + 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, + 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, + 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, + 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, + 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, + 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, + 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, + 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, + 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, + 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, + 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, + 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, + 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, + 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, + 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, + // Block 0x8, offset 0x200 + 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, + 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, + 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, + 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, + 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, + 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, + 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, + 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, + 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, + 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, + // Block 0x9, offset 0x240 + 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, + 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, + 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, + 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, + 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, + 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, + 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, + 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, + 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, + 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, + // Block 0xa, offset 0x280 + 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, + 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308, + 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308, + 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308, + 0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308, + 0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308, + 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308, + 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308, + 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, + 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, + 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, + 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, + 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, + 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, + 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, + 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, + 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, + 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, + 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, + // Block 0xc, offset 0x300 + 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, + 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, + 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, + 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, + 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, + 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, + 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, + 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, + 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, + 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, + 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, + // Block 0xd, offset 0x340 + 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, + 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, + 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, + 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, + 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, + 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, + 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, + 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, + 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, + 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, + 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, + // Block 0xe, offset 0x380 + 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308, + 0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008, + 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, + 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, + 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, + 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, + 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, + 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, + 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, + 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, + 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, + 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, + 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, + 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, + 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, + 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, + 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, + 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, + 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, + 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, + 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, + // Block 0x10, offset 0x400 + 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, + 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, + 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, + 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, + 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, + 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, + 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, + 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, + 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, + 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, + 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, + // Block 0x11, offset 0x440 + 0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840, + 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818, + 0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308, + 0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308, + 0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040, + 0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08, + 0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08, + 0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08, + 0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08, + 0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08, + 0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08, + // Block 0x12, offset 0x480 + 0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08, + 0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308, + 0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308, + 0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308, + 0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308, + 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808, + 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808, + 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08, + 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429, + 0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, + 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08, + 0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08, + 0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08, + 0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308, + 0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840, + 0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308, + 0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018, + 0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08, + 0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008, + 0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08, + 0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08, + // Block 0x14, offset 0x500 + 0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818, + 0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818, + 0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308, + 0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08, + 0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08, + 0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08, + 0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08, + 0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08, + 0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308, + 0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308, + 0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308, + // Block 0x15, offset 0x540 + 0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08, + 0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08, + 0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08, + 0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0808, 0x557: 0x0808, + 0x558: 0x0808, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040, + 0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08, + 0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08, + 0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040, + 0x570: 0x0040, 0x571: 0x0040, 0x572: 0x0040, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040, + 0x576: 0x0040, 0x577: 0x0040, 0x578: 0x0040, 0x579: 0x0040, 0x57a: 0x0040, 0x57b: 0x0040, + 0x57c: 0x0040, 0x57d: 0x0040, 0x57e: 0x0040, 0x57f: 0x0040, + // Block 0x16, offset 0x580 + 0x580: 0x3008, 0x581: 0x3308, 0x582: 0x3308, 0x583: 0x3308, 0x584: 0x3308, 0x585: 0x3308, + 0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008, + 0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308, + 0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308, + 0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1, + 0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308, + 0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, + 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, + 0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008, + 0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008, + 0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0008, 0x5c1: 0x3308, 0x5c2: 0x3008, 0x5c3: 0x3008, 0x5c4: 0x0040, 0x5c5: 0x0008, + 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0008, + 0x5cc: 0x0008, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040, + 0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008, + 0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008, + 0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008, + 0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040, + 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, + 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0040, 0x5f4: 0x0040, 0x5f5: 0x0040, + 0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040, + 0x5fc: 0x3308, 0x5fd: 0x0008, 0x5fe: 0x3008, 0x5ff: 0x3008, + // Block 0x18, offset 0x600 + 0x600: 0x3008, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3308, 0x604: 0x3308, 0x605: 0x0040, + 0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008, + 0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040, + 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008, + 0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1, + 0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308, + 0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, + 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, + 0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018, + 0x636: 0x0018, 0x637: 0x0018, 0x638: 0x0018, 0x639: 0x0018, 0x63a: 0x0018, 0x63b: 0x0018, + 0x63c: 0x0008, 0x63d: 0x0018, 0x63e: 0x3308, 0x63f: 0x0040, + // Block 0x19, offset 0x640 + 0x640: 0x0040, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3008, 0x644: 0x0040, 0x645: 0x0008, + 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0040, + 0x64c: 0x0040, 0x64d: 0x0040, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0040, + 0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008, + 0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008, + 0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008, + 0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040, + 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, + 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008, + 0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, + 0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008, + // Block 0x1a, offset 0x680 + 0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040, + 0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308, + 0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308, + 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, + 0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040, + 0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040, + 0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008, + 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, + 0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308, + 0x6b6: 0x0018, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0040, 0x6ba: 0x0040, 0x6bb: 0x0040, + 0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x0040, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3008, 0x6c4: 0x0040, 0x6c5: 0x0008, + 0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008, + 0x6cc: 0x0008, 0x6cd: 0x0008, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0008, + 0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008, + 0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008, + 0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008, + 0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040, + 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, + 0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008, + 0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040, + 0x6fc: 0x3308, 0x6fd: 0x0008, 0x6fe: 0x3008, 0x6ff: 0x3008, + // Block 0x1c, offset 0x700 + 0x700: 0x3008, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3308, 0x704: 0x3308, 0x705: 0x3308, + 0x706: 0x0040, 0x707: 0x3308, 0x708: 0x3308, 0x709: 0x3008, 0x70a: 0x0040, 0x70b: 0x3008, + 0x70c: 0x3008, 0x70d: 0x3b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0008, 0x711: 0x0040, + 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x0040, 0x717: 0x0040, + 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0040, 0x71d: 0x0040, + 0x71e: 0x0040, 0x71f: 0x0040, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x3308, 0x723: 0x3308, + 0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008, + 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, + 0x730: 0x0018, 0x731: 0x0018, 0x732: 0x0040, 0x733: 0x0040, 0x734: 0x0040, 0x735: 0x0040, + 0x736: 0x0040, 0x737: 0x0040, 0x738: 0x0040, 0x739: 0x0008, 0x73a: 0x3308, 0x73b: 0x3308, + 0x73c: 0x3308, 0x73d: 0x3308, 0x73e: 0x3308, 0x73f: 0x3308, + // Block 0x1d, offset 0x740 + 0x740: 0x0040, 0x741: 0x3308, 0x742: 0x3008, 0x743: 0x3008, 0x744: 0x0040, 0x745: 0x0008, + 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0008, + 0x74c: 0x0008, 0x74d: 0x0040, 0x74e: 0x0040, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040, + 0x752: 0x0040, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008, + 0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008, + 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008, + 0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0040, + 0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008, + 0x770: 0x0008, 0x771: 0x0040, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0040, 0x775: 0x0008, + 0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040, + 0x77c: 0x3308, 0x77d: 0x0008, 0x77e: 0x3008, 0x77f: 0x3308, + // Block 0x1e, offset 0x780 + 0x780: 0x3008, 0x781: 0x3308, 0x782: 0x3308, 0x783: 0x3308, 0x784: 0x3308, 0x785: 0x0040, + 0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008, + 0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, + 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x0040, 0x796: 0x3308, 0x797: 0x3008, + 0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9, + 0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308, + 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, + 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, + 0x7b0: 0x0018, 0x7b1: 0x0008, 0x7b2: 0x0018, 0x7b3: 0x0018, 0x7b4: 0x0018, 0x7b5: 0x0018, + 0x7b6: 0x0018, 0x7b7: 0x0018, 0x7b8: 0x0040, 0x7b9: 0x0040, 0x7ba: 0x0040, 0x7bb: 0x0040, + 0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x0040, 0x7bf: 0x0040, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0040, 0x7c1: 0x0040, 0x7c2: 0x3308, 0x7c3: 0x0008, 0x7c4: 0x0040, 0x7c5: 0x0008, + 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0040, + 0x7cc: 0x0040, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040, + 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0040, 0x7d7: 0x0040, + 0x7d8: 0x0040, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0008, 0x7dd: 0x0040, + 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0040, 0x7e1: 0x0040, 0x7e2: 0x0040, 0x7e3: 0x0008, + 0x7e4: 0x0008, 0x7e5: 0x0040, 0x7e6: 0x0040, 0x7e7: 0x0040, 0x7e8: 0x0008, 0x7e9: 0x0008, + 0x7ea: 0x0008, 0x7eb: 0x0040, 0x7ec: 0x0040, 0x7ed: 0x0040, 0x7ee: 0x0008, 0x7ef: 0x0008, + 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0008, 0x7f5: 0x0008, + 0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040, + 0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x3008, 0x7ff: 0x3008, + // Block 0x20, offset 0x800 + 0x800: 0x3308, 0x801: 0x3008, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x3008, 0x805: 0x0040, + 0x806: 0x3308, 0x807: 0x3308, 0x808: 0x3308, 0x809: 0x0040, 0x80a: 0x3308, 0x80b: 0x3308, + 0x80c: 0x3308, 0x80d: 0x3b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040, + 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x3308, 0x816: 0x3308, 0x817: 0x0040, + 0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040, + 0x81e: 0x0040, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x3308, 0x823: 0x3308, + 0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008, + 0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008, + 0x830: 0x0040, 0x831: 0x0040, 0x832: 0x0040, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040, + 0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0018, 0x839: 0x0018, 0x83a: 0x0018, 0x83b: 0x0018, + 0x83c: 0x0018, 0x83d: 0x0018, 0x83e: 0x0018, 0x83f: 0x0018, + // Block 0x21, offset 0x840 + 0x840: 0x0008, 0x841: 0x3308, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x0018, 0x845: 0x0008, + 0x846: 0x0008, 0x847: 0x0008, 0x848: 0x0008, 0x849: 0x0008, 0x84a: 0x0008, 0x84b: 0x0008, + 0x84c: 0x0008, 0x84d: 0x0040, 0x84e: 0x0008, 0x84f: 0x0008, 0x850: 0x0008, 0x851: 0x0040, + 0x852: 0x0008, 0x853: 0x0008, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x0008, + 0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0008, 0x85c: 0x0008, 0x85d: 0x0008, + 0x85e: 0x0008, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x0008, 0x863: 0x0008, + 0x864: 0x0008, 0x865: 0x0008, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0040, + 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, + 0x870: 0x0008, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0008, 0x874: 0x0040, 0x875: 0x0008, + 0x876: 0x0008, 0x877: 0x0008, 0x878: 0x0008, 0x879: 0x0008, 0x87a: 0x0040, 0x87b: 0x0040, + 0x87c: 0x3308, 0x87d: 0x0008, 0x87e: 0x3008, 0x87f: 0x3308, + // Block 0x22, offset 0x880 + 0x880: 0x3008, 0x881: 0x3008, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x3008, 0x885: 0x0040, + 0x886: 0x3308, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008, + 0x88c: 0x3308, 0x88d: 0x3b08, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040, + 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0040, 0x895: 0x3008, 0x896: 0x3008, 0x897: 0x0040, + 0x898: 0x0040, 0x899: 0x0040, 0x89a: 0x0040, 0x89b: 0x0040, 0x89c: 0x0040, 0x89d: 0x0040, + 0x89e: 0x0008, 0x89f: 0x0040, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308, + 0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008, + 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, + 0x8b0: 0x0040, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0040, 0x8b4: 0x0040, 0x8b5: 0x0040, + 0x8b6: 0x0040, 0x8b7: 0x0040, 0x8b8: 0x0040, 0x8b9: 0x0040, 0x8ba: 0x0040, 0x8bb: 0x0040, + 0x8bc: 0x0040, 0x8bd: 0x0040, 0x8be: 0x0040, 0x8bf: 0x0040, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x3008, 0x8c1: 0x3308, 0x8c2: 0x3308, 0x8c3: 0x3308, 0x8c4: 0x3308, 0x8c5: 0x0040, + 0x8c6: 0x3008, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008, + 0x8cc: 0x3008, 0x8cd: 0x3b08, 0x8ce: 0x0008, 0x8cf: 0x0018, 0x8d0: 0x0040, 0x8d1: 0x0040, + 0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x3008, + 0x8d8: 0x0018, 0x8d9: 0x0018, 0x8da: 0x0018, 0x8db: 0x0018, 0x8dc: 0x0018, 0x8dd: 0x0018, + 0x8de: 0x0018, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308, + 0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008, + 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008, + 0x8f0: 0x0018, 0x8f1: 0x0018, 0x8f2: 0x0018, 0x8f3: 0x0018, 0x8f4: 0x0018, 0x8f5: 0x0018, + 0x8f6: 0x0018, 0x8f7: 0x0018, 0x8f8: 0x0018, 0x8f9: 0x0018, 0x8fa: 0x0008, 0x8fb: 0x0008, + 0x8fc: 0x0008, 0x8fd: 0x0008, 0x8fe: 0x0008, 0x8ff: 0x0008, + // Block 0x24, offset 0x900 + 0x900: 0x0040, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0040, 0x904: 0x0008, 0x905: 0x0040, + 0x906: 0x0040, 0x907: 0x0008, 0x908: 0x0008, 0x909: 0x0040, 0x90a: 0x0008, 0x90b: 0x0040, + 0x90c: 0x0040, 0x90d: 0x0008, 0x90e: 0x0040, 0x90f: 0x0040, 0x910: 0x0040, 0x911: 0x0040, + 0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0008, + 0x918: 0x0040, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0008, 0x91d: 0x0008, + 0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0040, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008, + 0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0040, 0x929: 0x0040, + 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0040, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008, + 0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308, + 0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x0040, 0x93b: 0x3308, + 0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040, + // Block 0x25, offset 0x940 + 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008, + 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, + 0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, + 0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79, + 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008, + 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, + 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9, + 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040, + 0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59, + 0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308, + 0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008, + // Block 0x26, offset 0x980 + 0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018, + 0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008, + 0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308, + 0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308, + 0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11, + 0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308, + 0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308, + 0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308, + 0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308, + 0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308, + 0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, + 0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, + 0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008, + 0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008, + 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008, + 0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008, + 0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008, + 0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008, + 0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41, + 0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008, + 0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269, + // Block 0x28, offset 0xa00 + 0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1, + 0xa06: 0x059d, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011, + 0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041, + 0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05b5, 0xa15: 0x05b5, 0xa16: 0x0f99, 0xa17: 0x0fa9, + 0xa18: 0x0fb9, 0xa19: 0x059d, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05cd, 0xa1d: 0x1099, + 0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269, + 0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1, + 0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008, + 0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008, + 0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008, + 0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008, + // Block 0x29, offset 0xa40 + 0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008, + 0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008, + 0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008, + 0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, + 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169, + 0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9, + 0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05e5, 0xa68: 0x1239, 0xa69: 0x1251, + 0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9, + 0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359, + 0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x05fd, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1, + 0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429, + // Block 0x2a, offset 0xa80 + 0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008, + 0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008, + 0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008, + 0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0xe00d, 0xa97: 0x0008, + 0xa98: 0xe00d, 0xa99: 0x0008, 0xa9a: 0xe00d, 0xa9b: 0x0008, 0xa9c: 0xe00d, 0xa9d: 0x0008, + 0xa9e: 0xe00d, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008, + 0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008, + 0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008, + 0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008, + 0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008, + 0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008, + // Block 0x2b, offset 0xac0 + 0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008, + 0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008, + 0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008, + 0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008, + 0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x0615, 0xadb: 0x0635, 0xadc: 0x0008, 0xadd: 0x0008, + 0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, + 0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008, + 0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008, + 0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008, + 0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008, + 0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008, + // Block 0x2c, offset 0xb00 + 0xb00: 0x0008, 0xb01: 0x0008, 0xb02: 0x0008, 0xb03: 0x0008, 0xb04: 0x0008, 0xb05: 0x0008, + 0xb06: 0x0040, 0xb07: 0x0040, 0xb08: 0xe045, 0xb09: 0xe045, 0xb0a: 0xe045, 0xb0b: 0xe045, + 0xb0c: 0xe045, 0xb0d: 0xe045, 0xb0e: 0x0040, 0xb0f: 0x0040, 0xb10: 0x0008, 0xb11: 0x0008, + 0xb12: 0x0008, 0xb13: 0x0008, 0xb14: 0x0008, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008, + 0xb18: 0x0040, 0xb19: 0xe045, 0xb1a: 0x0040, 0xb1b: 0xe045, 0xb1c: 0x0040, 0xb1d: 0xe045, + 0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008, + 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, + 0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045, + 0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489, + 0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1, + 0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040, + // Block 0x2d, offset 0xb40 + 0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1, + 0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591, + 0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1, + 0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1, + 0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771, + 0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891, + 0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831, + 0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951, + 0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040, + 0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x064d, 0xb7b: 0x1459, + 0xb7c: 0x19b1, 0xb7d: 0x0666, 0xb7e: 0x1a31, 0xb7f: 0x0686, + // Block 0x2e, offset 0xb80 + 0xb80: 0x06a6, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040, + 0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06c5, 0xb89: 0x1471, 0xb8a: 0x06dd, 0xb8b: 0x1489, + 0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008, + 0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008, + 0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x06f5, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2, + 0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61, + 0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045, + 0xbaa: 0x070d, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa, + 0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040, + 0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x0725, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9, + 0xbbc: 0x1ce9, 0xbbd: 0x073e, 0xbbe: 0x075e, 0xbbf: 0x0040, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a, + 0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0, + 0xbcc: 0x0003, 0xbcd: 0x0003, 0xbce: 0x0340, 0xbcf: 0x0b40, 0xbd0: 0x0018, 0xbd1: 0xe00d, + 0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x077e, + 0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018, + 0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, + 0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040, + 0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a, + 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018, + 0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, + 0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x079e, 0xbff: 0x0018, + // Block 0x30, offset 0xc00 + 0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018, + 0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018, + 0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018, + 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9, + 0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018, + 0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340, + 0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040, + 0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340, + 0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61, + 0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07bd, + 0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71, + // Block 0x31, offset 0xc40 + 0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61, + 0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07d5, + 0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09, + 0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359, + 0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040, + 0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018, + 0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018, + 0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018, + 0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018, + 0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018, + 0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018, + // Block 0x32, offset 0xc80 + 0xc80: 0x07ee, 0xc81: 0x080e, 0xc82: 0x1159, 0xc83: 0x082d, 0xc84: 0x0018, 0xc85: 0x084e, + 0xc86: 0x086e, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x088d, 0xc8a: 0x0f31, 0xc8b: 0x0249, + 0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41, + 0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018, + 0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269, + 0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08ad, 0xca2: 0x2061, 0xca3: 0x0018, + 0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018, + 0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09, + 0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9, + 0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08cd, + 0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x08ed, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9, + 0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018, + 0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151, + 0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279, + 0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399, + 0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x0905, 0xce3: 0x2439, + 0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x0925, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369, + 0xcea: 0x24a9, 0xceb: 0x0945, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61, + 0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x0965, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451, + 0xcf6: 0x0985, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09a5, + 0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61, + // Block 0x34, offset 0xd00 + 0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018, + 0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040, + 0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040, + 0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040, + 0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040, + 0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51, + 0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601, + 0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691, + 0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a06, 0xd35: 0x0a26, + 0xd36: 0x0a46, 0xd37: 0x0a66, 0xd38: 0x0a86, 0xd39: 0x0aa6, 0xd3a: 0x0ac6, 0xd3b: 0x0ae6, + 0xd3c: 0x0b06, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a, + // Block 0x35, offset 0xd40 + 0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a, + 0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040, + 0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040, + 0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040, + 0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b26, 0xd5d: 0x0b46, + 0xd5e: 0x0b66, 0xd5f: 0x0b86, 0xd60: 0x0ba6, 0xd61: 0x0bc6, 0xd62: 0x0be6, 0xd63: 0x0c06, + 0xd64: 0x0c26, 0xd65: 0x0c46, 0xd66: 0x0c66, 0xd67: 0x0c86, 0xd68: 0x0ca6, 0xd69: 0x0cc6, + 0xd6a: 0x0ce6, 0xd6b: 0x0d06, 0xd6c: 0x0d26, 0xd6d: 0x0d46, 0xd6e: 0x0d66, 0xd6f: 0x0d86, + 0xd70: 0x0da6, 0xd71: 0x0dc6, 0xd72: 0x0de6, 0xd73: 0x0e06, 0xd74: 0x0e26, 0xd75: 0x0e46, + 0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199, + 0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259, + // Block 0x36, offset 0xd80 + 0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99, + 0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089, + 0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9, + 0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249, + 0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71, + 0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9, + 0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1, + 0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018, + 0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018, + 0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, + 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0008, 0xdc1: 0x0008, 0xdc2: 0x0008, 0xdc3: 0x0008, 0xdc4: 0x0008, 0xdc5: 0x0008, + 0xdc6: 0x0008, 0xdc7: 0x0008, 0xdc8: 0x0008, 0xdc9: 0x0008, 0xdca: 0x0008, 0xdcb: 0x0008, + 0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008, + 0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008, + 0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008, + 0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ebd, + 0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d, + 0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9, + 0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d, + 0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008, + 0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9, + // Block 0x38, offset 0xe00 + 0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008, + 0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008, + 0xe0c: 0xe00d, 0xe0d: 0x0008, 0xe0e: 0xe00d, 0xe0f: 0x0008, 0xe10: 0xe00d, 0xe11: 0x0008, + 0xe12: 0xe00d, 0xe13: 0x0008, 0xe14: 0xe00d, 0xe15: 0x0008, 0xe16: 0xe00d, 0xe17: 0x0008, + 0xe18: 0xe00d, 0xe19: 0x0008, 0xe1a: 0xe00d, 0xe1b: 0x0008, 0xe1c: 0xe00d, 0xe1d: 0x0008, + 0xe1e: 0xe00d, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0xe00d, 0xe23: 0x0008, + 0xe24: 0x0008, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018, + 0xe2a: 0x0018, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0xe01d, 0xe2e: 0x0008, 0xe2f: 0x3308, + 0xe30: 0x3308, 0xe31: 0x3308, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0040, 0xe35: 0x0040, + 0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0018, 0xe3a: 0x0018, 0xe3b: 0x0018, + 0xe3c: 0x0018, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018, + // Block 0x39, offset 0xe40 + 0xe40: 0x26fd, 0xe41: 0x271d, 0xe42: 0x273d, 0xe43: 0x275d, 0xe44: 0x277d, 0xe45: 0x279d, + 0xe46: 0x27bd, 0xe47: 0x27dd, 0xe48: 0x27fd, 0xe49: 0x281d, 0xe4a: 0x283d, 0xe4b: 0x285d, + 0xe4c: 0x287d, 0xe4d: 0x289d, 0xe4e: 0x28bd, 0xe4f: 0x28dd, 0xe50: 0x28fd, 0xe51: 0x291d, + 0xe52: 0x293d, 0xe53: 0x295d, 0xe54: 0x297d, 0xe55: 0x299d, 0xe56: 0x0040, 0xe57: 0x0040, + 0xe58: 0x0040, 0xe59: 0x0040, 0xe5a: 0x0040, 0xe5b: 0x0040, 0xe5c: 0x0040, 0xe5d: 0x0040, + 0xe5e: 0x0040, 0xe5f: 0x0040, 0xe60: 0x0040, 0xe61: 0x0040, 0xe62: 0x0040, 0xe63: 0x0040, + 0xe64: 0x0040, 0xe65: 0x0040, 0xe66: 0x0040, 0xe67: 0x0040, 0xe68: 0x0040, 0xe69: 0x0040, + 0xe6a: 0x0040, 0xe6b: 0x0040, 0xe6c: 0x0040, 0xe6d: 0x0040, 0xe6e: 0x0040, 0xe6f: 0x0040, + 0xe70: 0x0040, 0xe71: 0x0040, 0xe72: 0x0040, 0xe73: 0x0040, 0xe74: 0x0040, 0xe75: 0x0040, + 0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040, + 0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040, + // Block 0x3a, offset 0xe80 + 0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008, + 0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018, + 0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018, + 0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018, + 0xe98: 0x0018, 0xe99: 0x0018, 0xe9a: 0x0018, 0xe9b: 0x0018, 0xe9c: 0x0018, 0xe9d: 0x0018, + 0xe9e: 0x0018, 0xe9f: 0x0018, 0xea0: 0x0018, 0xea1: 0x0018, 0xea2: 0x0018, 0xea3: 0x0018, + 0xea4: 0x0018, 0xea5: 0x0018, 0xea6: 0x0018, 0xea7: 0x0018, 0xea8: 0x0018, 0xea9: 0x0018, + 0xeaa: 0x3308, 0xeab: 0x3308, 0xeac: 0x3308, 0xead: 0x3308, 0xeae: 0x3018, 0xeaf: 0x3018, + 0xeb0: 0x0018, 0xeb1: 0x0018, 0xeb2: 0x0018, 0xeb3: 0x0018, 0xeb4: 0x0018, 0xeb5: 0x0018, + 0xeb6: 0xe125, 0xeb7: 0x0018, 0xeb8: 0x29bd, 0xeb9: 0x29dd, 0xeba: 0x29fd, 0xebb: 0x0018, + 0xebc: 0x0008, 0xebd: 0x0018, 0xebe: 0x0018, 0xebf: 0x0018, + // Block 0x3b, offset 0xec0 + 0xec0: 0x2b3d, 0xec1: 0x2b5d, 0xec2: 0x2b7d, 0xec3: 0x2b9d, 0xec4: 0x2bbd, 0xec5: 0x2bdd, + 0xec6: 0x2bdd, 0xec7: 0x2bdd, 0xec8: 0x2bfd, 0xec9: 0x2bfd, 0xeca: 0x2bfd, 0xecb: 0x2bfd, + 0xecc: 0x2c1d, 0xecd: 0x2c1d, 0xece: 0x2c1d, 0xecf: 0x2c3d, 0xed0: 0x2c5d, 0xed1: 0x2c5d, + 0xed2: 0x2a7d, 0xed3: 0x2a7d, 0xed4: 0x2c5d, 0xed5: 0x2c5d, 0xed6: 0x2c7d, 0xed7: 0x2c7d, + 0xed8: 0x2c5d, 0xed9: 0x2c5d, 0xeda: 0x2a7d, 0xedb: 0x2a7d, 0xedc: 0x2c5d, 0xedd: 0x2c5d, + 0xede: 0x2c3d, 0xedf: 0x2c3d, 0xee0: 0x2c9d, 0xee1: 0x2c9d, 0xee2: 0x2cbd, 0xee3: 0x2cbd, + 0xee4: 0x0040, 0xee5: 0x2cdd, 0xee6: 0x2cfd, 0xee7: 0x2d1d, 0xee8: 0x2d1d, 0xee9: 0x2d3d, + 0xeea: 0x2d5d, 0xeeb: 0x2d7d, 0xeec: 0x2d9d, 0xeed: 0x2dbd, 0xeee: 0x2ddd, 0xeef: 0x2dfd, + 0xef0: 0x2e1d, 0xef1: 0x2e3d, 0xef2: 0x2e3d, 0xef3: 0x2e5d, 0xef4: 0x2e7d, 0xef5: 0x2e7d, + 0xef6: 0x2e9d, 0xef7: 0x2ebd, 0xef8: 0x2e5d, 0xef9: 0x2edd, 0xefa: 0x2efd, 0xefb: 0x2edd, + 0xefc: 0x2e5d, 0xefd: 0x2f1d, 0xefe: 0x2f3d, 0xeff: 0x2f5d, + // Block 0x3c, offset 0xf00 + 0xf00: 0x2f7d, 0xf01: 0x2f9d, 0xf02: 0x2cfd, 0xf03: 0x2cdd, 0xf04: 0x2fbd, 0xf05: 0x2fdd, + 0xf06: 0x2ffd, 0xf07: 0x301d, 0xf08: 0x303d, 0xf09: 0x305d, 0xf0a: 0x307d, 0xf0b: 0x309d, + 0xf0c: 0x30bd, 0xf0d: 0x30dd, 0xf0e: 0x30fd, 0xf0f: 0x0040, 0xf10: 0x0018, 0xf11: 0x0018, + 0xf12: 0x311d, 0xf13: 0x313d, 0xf14: 0x315d, 0xf15: 0x317d, 0xf16: 0x319d, 0xf17: 0x31bd, + 0xf18: 0x31dd, 0xf19: 0x31fd, 0xf1a: 0x321d, 0xf1b: 0x323d, 0xf1c: 0x315d, 0xf1d: 0x325d, + 0xf1e: 0x327d, 0xf1f: 0x329d, 0xf20: 0x0008, 0xf21: 0x0008, 0xf22: 0x0008, 0xf23: 0x0008, + 0xf24: 0x0008, 0xf25: 0x0008, 0xf26: 0x0008, 0xf27: 0x0008, 0xf28: 0x0008, 0xf29: 0x0008, + 0xf2a: 0x0008, 0xf2b: 0x0008, 0xf2c: 0x0008, 0xf2d: 0x0008, 0xf2e: 0x0008, 0xf2f: 0x0008, + 0xf30: 0x0008, 0xf31: 0x0008, 0xf32: 0x0008, 0xf33: 0x0008, 0xf34: 0x0008, 0xf35: 0x0008, + 0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0040, + 0xf3c: 0x0040, 0xf3d: 0x0040, 0xf3e: 0x0040, 0xf3f: 0x0040, + // Block 0x3d, offset 0xf40 + 0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32bd, 0xf45: 0x32dd, + 0xf46: 0x32fd, 0xf47: 0x331d, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018, + 0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x333d, 0xf51: 0x3761, + 0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1, + 0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881, + 0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x335d, 0xf61: 0x337d, 0xf62: 0x339d, 0xf63: 0x33bd, + 0xf64: 0x33dd, 0xf65: 0x33dd, 0xf66: 0x33fd, 0xf67: 0x341d, 0xf68: 0x343d, 0xf69: 0x345d, + 0xf6a: 0x347d, 0xf6b: 0x349d, 0xf6c: 0x34bd, 0xf6d: 0x34dd, 0xf6e: 0x34fd, 0xf6f: 0x351d, + 0xf70: 0x353d, 0xf71: 0x355d, 0xf72: 0x357d, 0xf73: 0x359d, 0xf74: 0x35bd, 0xf75: 0x35dd, + 0xf76: 0x35fd, 0xf77: 0x361d, 0xf78: 0x363d, 0xf79: 0x365d, 0xf7a: 0x367d, 0xf7b: 0x369d, + 0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36bd, 0xf7f: 0x0018, + // Block 0x3e, offset 0xf80 + 0xf80: 0x36dd, 0xf81: 0x36fd, 0xf82: 0x371d, 0xf83: 0x373d, 0xf84: 0x375d, 0xf85: 0x377d, + 0xf86: 0x379d, 0xf87: 0x37bd, 0xf88: 0x37dd, 0xf89: 0x37fd, 0xf8a: 0x381d, 0xf8b: 0x383d, + 0xf8c: 0x385d, 0xf8d: 0x387d, 0xf8e: 0x389d, 0xf8f: 0x38bd, 0xf90: 0x38dd, 0xf91: 0x38fd, + 0xf92: 0x391d, 0xf93: 0x393d, 0xf94: 0x395d, 0xf95: 0x397d, 0xf96: 0x399d, 0xf97: 0x39bd, + 0xf98: 0x39dd, 0xf99: 0x39fd, 0xf9a: 0x3a1d, 0xf9b: 0x3a3d, 0xf9c: 0x3a5d, 0xf9d: 0x3a7d, + 0xf9e: 0x3a9d, 0xf9f: 0x3abd, 0xfa0: 0x3add, 0xfa1: 0x3afd, 0xfa2: 0x3b1d, 0xfa3: 0x3b3d, + 0xfa4: 0x3b5d, 0xfa5: 0x3b7d, 0xfa6: 0x127d, 0xfa7: 0x3b9d, 0xfa8: 0x3bbd, 0xfa9: 0x3bdd, + 0xfaa: 0x3bfd, 0xfab: 0x3c1d, 0xfac: 0x3c3d, 0xfad: 0x3c5d, 0xfae: 0x239d, 0xfaf: 0x3c7d, + 0xfb0: 0x3c9d, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999, + 0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29, + 0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69, + 0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69, + 0xfcc: 0x3c99, 0xfcd: 0x3cbd, 0xfce: 0x3cb1, 0xfcf: 0x3cdd, 0xfd0: 0x3cfd, 0xfd1: 0x3d15, + 0xfd2: 0x3d2d, 0xfd3: 0x3d45, 0xfd4: 0x3d5d, 0xfd5: 0x3d5d, 0xfd6: 0x3d45, 0xfd7: 0x3d75, + 0xfd8: 0x07bd, 0xfd9: 0x3d8d, 0xfda: 0x3da5, 0xfdb: 0x3dbd, 0xfdc: 0x3dd5, 0xfdd: 0x3ded, + 0xfde: 0x3e05, 0xfdf: 0x3e1d, 0xfe0: 0x3e35, 0xfe1: 0x3e4d, 0xfe2: 0x3e65, 0xfe3: 0x3e7d, + 0xfe4: 0x3e95, 0xfe5: 0x3e95, 0xfe6: 0x3ead, 0xfe7: 0x3ead, 0xfe8: 0x3ec5, 0xfe9: 0x3ec5, + 0xfea: 0x3edd, 0xfeb: 0x3ef5, 0xfec: 0x3f0d, 0xfed: 0x3f25, 0xfee: 0x3f3d, 0xfef: 0x3f3d, + 0xff0: 0x3f55, 0xff1: 0x3f55, 0xff2: 0x3f55, 0xff3: 0x3f6d, 0xff4: 0x3f85, 0xff5: 0x3f9d, + 0xff6: 0x3fb5, 0xff7: 0x3f9d, 0xff8: 0x3fcd, 0xff9: 0x3fe5, 0xffa: 0x3f6d, 0xffb: 0x3ffd, + 0xffc: 0x4015, 0xffd: 0x4015, 0xffe: 0x4015, 0xfff: 0x0040, + // Block 0x40, offset 0x1000 + 0x1000: 0x3cc9, 0x1001: 0x3d31, 0x1002: 0x3d99, 0x1003: 0x3e01, 0x1004: 0x3e51, 0x1005: 0x3eb9, + 0x1006: 0x3f09, 0x1007: 0x3f59, 0x1008: 0x3fd9, 0x1009: 0x4041, 0x100a: 0x4091, 0x100b: 0x40e1, + 0x100c: 0x4131, 0x100d: 0x4199, 0x100e: 0x4201, 0x100f: 0x4251, 0x1010: 0x42a1, 0x1011: 0x42d9, + 0x1012: 0x4329, 0x1013: 0x4391, 0x1014: 0x43f9, 0x1015: 0x4431, 0x1016: 0x44b1, 0x1017: 0x4549, + 0x1018: 0x45c9, 0x1019: 0x4619, 0x101a: 0x4699, 0x101b: 0x4719, 0x101c: 0x4781, 0x101d: 0x47d1, + 0x101e: 0x4821, 0x101f: 0x4871, 0x1020: 0x48d9, 0x1021: 0x4959, 0x1022: 0x49c1, 0x1023: 0x4a11, + 0x1024: 0x4a61, 0x1025: 0x4ab1, 0x1026: 0x4ae9, 0x1027: 0x4b21, 0x1028: 0x4b59, 0x1029: 0x4b91, + 0x102a: 0x4be1, 0x102b: 0x4c31, 0x102c: 0x4cb1, 0x102d: 0x4d01, 0x102e: 0x4d69, 0x102f: 0x4de9, + 0x1030: 0x4e39, 0x1031: 0x4e71, 0x1032: 0x4ea9, 0x1033: 0x4f29, 0x1034: 0x4f91, 0x1035: 0x5011, + 0x1036: 0x5061, 0x1037: 0x50e1, 0x1038: 0x5119, 0x1039: 0x5169, 0x103a: 0x51b9, 0x103b: 0x5209, + 0x103c: 0x5259, 0x103d: 0x52a9, 0x103e: 0x5311, 0x103f: 0x5361, + // Block 0x41, offset 0x1040 + 0x1040: 0x5399, 0x1041: 0x53e9, 0x1042: 0x5439, 0x1043: 0x5489, 0x1044: 0x54f1, 0x1045: 0x5541, + 0x1046: 0x5591, 0x1047: 0x55e1, 0x1048: 0x5661, 0x1049: 0x56c9, 0x104a: 0x5701, 0x104b: 0x5781, + 0x104c: 0x57b9, 0x104d: 0x5821, 0x104e: 0x5889, 0x104f: 0x58d9, 0x1050: 0x5929, 0x1051: 0x5979, + 0x1052: 0x59e1, 0x1053: 0x5a19, 0x1054: 0x5a69, 0x1055: 0x5ad1, 0x1056: 0x5b09, 0x1057: 0x5b89, + 0x1058: 0x5bd9, 0x1059: 0x5c01, 0x105a: 0x5c29, 0x105b: 0x5c51, 0x105c: 0x5c79, 0x105d: 0x5ca1, + 0x105e: 0x5cc9, 0x105f: 0x5cf1, 0x1060: 0x5d19, 0x1061: 0x5d41, 0x1062: 0x5d69, 0x1063: 0x5d99, + 0x1064: 0x5dc9, 0x1065: 0x5df9, 0x1066: 0x5e29, 0x1067: 0x5e59, 0x1068: 0x5e89, 0x1069: 0x5eb9, + 0x106a: 0x5ee9, 0x106b: 0x5f19, 0x106c: 0x5f49, 0x106d: 0x5f79, 0x106e: 0x5fa9, 0x106f: 0x5fd9, + 0x1070: 0x6009, 0x1071: 0x402d, 0x1072: 0x6039, 0x1073: 0x6051, 0x1074: 0x404d, 0x1075: 0x6069, + 0x1076: 0x6081, 0x1077: 0x6099, 0x1078: 0x406d, 0x1079: 0x406d, 0x107a: 0x60b1, 0x107b: 0x60c9, + 0x107c: 0x6101, 0x107d: 0x6139, 0x107e: 0x6171, 0x107f: 0x61a9, + // Block 0x42, offset 0x1080 + 0x1080: 0x6211, 0x1081: 0x6229, 0x1082: 0x408d, 0x1083: 0x6241, 0x1084: 0x6259, 0x1085: 0x6271, + 0x1086: 0x6289, 0x1087: 0x62a1, 0x1088: 0x40ad, 0x1089: 0x62b9, 0x108a: 0x62e1, 0x108b: 0x62f9, + 0x108c: 0x40cd, 0x108d: 0x40cd, 0x108e: 0x6311, 0x108f: 0x6329, 0x1090: 0x6341, 0x1091: 0x40ed, + 0x1092: 0x410d, 0x1093: 0x412d, 0x1094: 0x414d, 0x1095: 0x416d, 0x1096: 0x6359, 0x1097: 0x6371, + 0x1098: 0x6389, 0x1099: 0x63a1, 0x109a: 0x63b9, 0x109b: 0x418d, 0x109c: 0x63d1, 0x109d: 0x63e9, + 0x109e: 0x6401, 0x109f: 0x41ad, 0x10a0: 0x41cd, 0x10a1: 0x6419, 0x10a2: 0x41ed, 0x10a3: 0x420d, + 0x10a4: 0x422d, 0x10a5: 0x6431, 0x10a6: 0x424d, 0x10a7: 0x6449, 0x10a8: 0x6479, 0x10a9: 0x6211, + 0x10aa: 0x426d, 0x10ab: 0x428d, 0x10ac: 0x42ad, 0x10ad: 0x42cd, 0x10ae: 0x64b1, 0x10af: 0x64f1, + 0x10b0: 0x6539, 0x10b1: 0x6551, 0x10b2: 0x42ed, 0x10b3: 0x6569, 0x10b4: 0x6581, 0x10b5: 0x6599, + 0x10b6: 0x430d, 0x10b7: 0x65b1, 0x10b8: 0x65c9, 0x10b9: 0x65b1, 0x10ba: 0x65e1, 0x10bb: 0x65f9, + 0x10bc: 0x432d, 0x10bd: 0x6611, 0x10be: 0x6629, 0x10bf: 0x6611, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x434d, 0x10c1: 0x436d, 0x10c2: 0x0040, 0x10c3: 0x6641, 0x10c4: 0x6659, 0x10c5: 0x6671, + 0x10c6: 0x6689, 0x10c7: 0x0040, 0x10c8: 0x66c1, 0x10c9: 0x66d9, 0x10ca: 0x66f1, 0x10cb: 0x6709, + 0x10cc: 0x6721, 0x10cd: 0x6739, 0x10ce: 0x6401, 0x10cf: 0x6751, 0x10d0: 0x6769, 0x10d1: 0x6781, + 0x10d2: 0x438d, 0x10d3: 0x6799, 0x10d4: 0x6289, 0x10d5: 0x43ad, 0x10d6: 0x43cd, 0x10d7: 0x67b1, + 0x10d8: 0x0040, 0x10d9: 0x43ed, 0x10da: 0x67c9, 0x10db: 0x67e1, 0x10dc: 0x67f9, 0x10dd: 0x6811, + 0x10de: 0x6829, 0x10df: 0x6859, 0x10e0: 0x6889, 0x10e1: 0x68b1, 0x10e2: 0x68d9, 0x10e3: 0x6901, + 0x10e4: 0x6929, 0x10e5: 0x6951, 0x10e6: 0x6979, 0x10e7: 0x69a1, 0x10e8: 0x69c9, 0x10e9: 0x69f1, + 0x10ea: 0x6a21, 0x10eb: 0x6a51, 0x10ec: 0x6a81, 0x10ed: 0x6ab1, 0x10ee: 0x6ae1, 0x10ef: 0x6b11, + 0x10f0: 0x6b41, 0x10f1: 0x6b71, 0x10f2: 0x6ba1, 0x10f3: 0x6bd1, 0x10f4: 0x6c01, 0x10f5: 0x6c31, + 0x10f6: 0x6c61, 0x10f7: 0x6c91, 0x10f8: 0x6cc1, 0x10f9: 0x6cf1, 0x10fa: 0x6d21, 0x10fb: 0x6d51, + 0x10fc: 0x6d81, 0x10fd: 0x6db1, 0x10fe: 0x6de1, 0x10ff: 0x440d, + // Block 0x44, offset 0x1100 + 0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008, + 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008, + 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008, + 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008, + 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008, + 0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008, + 0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008, + 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308, + 0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308, + 0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308, + 0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008, + // Block 0x45, offset 0x1140 + 0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008, + 0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008, + 0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008, + 0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008, + 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e11, + 0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008, + 0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008, + 0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008, + 0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, + 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008, + 0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008, + // Block 0x46, offset 0x1180 + 0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018, + 0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018, + 0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018, + 0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008, + 0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008, + 0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008, + 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, + 0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008, + 0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008, + 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008, + 0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008, + // Block 0x47, offset 0x11c0 + 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008, + 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008, + 0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008, + 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008, + 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008, + 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008, + 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008, + 0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008, + 0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008, + 0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d, + 0x11fc: 0x0008, 0x11fd: 0x442d, 0x11fe: 0xe00d, 0x11ff: 0x0008, + // Block 0x48, offset 0x1200 + 0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008, + 0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d, + 0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008, + 0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008, + 0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008, + 0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008, + 0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008, + 0x122a: 0x6e29, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e41, 0x122e: 0x1221, 0x122f: 0x0008, + 0x1230: 0x6e59, 0x1231: 0x6e71, 0x1232: 0x1239, 0x1233: 0x444d, 0x1234: 0xe00d, 0x1235: 0x0008, + 0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0x0040, 0x1239: 0x0008, 0x123a: 0x0040, 0x123b: 0x0040, + 0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040, + // Block 0x49, offset 0x1240 + 0x1240: 0x64d5, 0x1241: 0x64f5, 0x1242: 0x6515, 0x1243: 0x6535, 0x1244: 0x6555, 0x1245: 0x6575, + 0x1246: 0x6595, 0x1247: 0x65b5, 0x1248: 0x65d5, 0x1249: 0x65f5, 0x124a: 0x6615, 0x124b: 0x6635, + 0x124c: 0x6655, 0x124d: 0x6675, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x6695, 0x1251: 0x0008, + 0x1252: 0x66b5, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x66d5, 0x1256: 0x66f5, 0x1257: 0x6715, + 0x1258: 0x6735, 0x1259: 0x6755, 0x125a: 0x6775, 0x125b: 0x6795, 0x125c: 0x67b5, 0x125d: 0x67d5, + 0x125e: 0x67f5, 0x125f: 0x0008, 0x1260: 0x6815, 0x1261: 0x0008, 0x1262: 0x6835, 0x1263: 0x0008, + 0x1264: 0x0008, 0x1265: 0x6855, 0x1266: 0x6875, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008, + 0x126a: 0x6895, 0x126b: 0x68b5, 0x126c: 0x68d5, 0x126d: 0x68f5, 0x126e: 0x6915, 0x126f: 0x6935, + 0x1270: 0x6955, 0x1271: 0x6975, 0x1272: 0x6995, 0x1273: 0x69b5, 0x1274: 0x69d5, 0x1275: 0x69f5, + 0x1276: 0x6a15, 0x1277: 0x6a35, 0x1278: 0x6a55, 0x1279: 0x6a75, 0x127a: 0x6a95, 0x127b: 0x6ab5, + 0x127c: 0x6ad5, 0x127d: 0x6af5, 0x127e: 0x6b15, 0x127f: 0x6b35, + // Block 0x4a, offset 0x1280 + 0x1280: 0x7a95, 0x1281: 0x7ab5, 0x1282: 0x7ad5, 0x1283: 0x7af5, 0x1284: 0x7b15, 0x1285: 0x7b35, + 0x1286: 0x7b55, 0x1287: 0x7b75, 0x1288: 0x7b95, 0x1289: 0x7bb5, 0x128a: 0x7bd5, 0x128b: 0x7bf5, + 0x128c: 0x7c15, 0x128d: 0x7c35, 0x128e: 0x7c55, 0x128f: 0x6ec9, 0x1290: 0x6ef1, 0x1291: 0x6f19, + 0x1292: 0x7c75, 0x1293: 0x7c95, 0x1294: 0x7cb5, 0x1295: 0x6f41, 0x1296: 0x6f69, 0x1297: 0x6f91, + 0x1298: 0x7cd5, 0x1299: 0x7cf5, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040, + 0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040, + 0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040, + 0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040, + 0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040, + 0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040, + 0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x6fb9, 0x12c1: 0x6fd1, 0x12c2: 0x6fe9, 0x12c3: 0x7d15, 0x12c4: 0x7d35, 0x12c5: 0x7001, + 0x12c6: 0x7001, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040, + 0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040, + 0x12d2: 0x0040, 0x12d3: 0x7019, 0x12d4: 0x7041, 0x12d5: 0x7069, 0x12d6: 0x7091, 0x12d7: 0x70b9, + 0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x70e1, + 0x12de: 0x3308, 0x12df: 0x7109, 0x12e0: 0x7131, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7149, + 0x12e4: 0x7161, 0x12e5: 0x7179, 0x12e6: 0x7191, 0x12e7: 0x71a9, 0x12e8: 0x71c1, 0x12e9: 0x1fb2, + 0x12ea: 0x71d9, 0x12eb: 0x7201, 0x12ec: 0x7229, 0x12ed: 0x7261, 0x12ee: 0x7299, 0x12ef: 0x72c1, + 0x12f0: 0x72e9, 0x12f1: 0x7311, 0x12f2: 0x7339, 0x12f3: 0x7361, 0x12f4: 0x7389, 0x12f5: 0x73b1, + 0x12f6: 0x73d9, 0x12f7: 0x0040, 0x12f8: 0x7401, 0x12f9: 0x7429, 0x12fa: 0x7451, 0x12fb: 0x7479, + 0x12fc: 0x74a1, 0x12fd: 0x0040, 0x12fe: 0x74c9, 0x12ff: 0x0040, + // Block 0x4c, offset 0x1300 + 0x1300: 0x74f1, 0x1301: 0x7519, 0x1302: 0x0040, 0x1303: 0x7541, 0x1304: 0x7569, 0x1305: 0x0040, + 0x1306: 0x7591, 0x1307: 0x75b9, 0x1308: 0x75e1, 0x1309: 0x7609, 0x130a: 0x7631, 0x130b: 0x7659, + 0x130c: 0x7681, 0x130d: 0x76a9, 0x130e: 0x76d1, 0x130f: 0x76f9, 0x1310: 0x7721, 0x1311: 0x7721, + 0x1312: 0x7739, 0x1313: 0x7739, 0x1314: 0x7739, 0x1315: 0x7739, 0x1316: 0x7751, 0x1317: 0x7751, + 0x1318: 0x7751, 0x1319: 0x7751, 0x131a: 0x7769, 0x131b: 0x7769, 0x131c: 0x7769, 0x131d: 0x7769, + 0x131e: 0x7781, 0x131f: 0x7781, 0x1320: 0x7781, 0x1321: 0x7781, 0x1322: 0x7799, 0x1323: 0x7799, + 0x1324: 0x7799, 0x1325: 0x7799, 0x1326: 0x77b1, 0x1327: 0x77b1, 0x1328: 0x77b1, 0x1329: 0x77b1, + 0x132a: 0x77c9, 0x132b: 0x77c9, 0x132c: 0x77c9, 0x132d: 0x77c9, 0x132e: 0x77e1, 0x132f: 0x77e1, + 0x1330: 0x77e1, 0x1331: 0x77e1, 0x1332: 0x77f9, 0x1333: 0x77f9, 0x1334: 0x77f9, 0x1335: 0x77f9, + 0x1336: 0x7811, 0x1337: 0x7811, 0x1338: 0x7811, 0x1339: 0x7811, 0x133a: 0x7829, 0x133b: 0x7829, + 0x133c: 0x7829, 0x133d: 0x7829, 0x133e: 0x7841, 0x133f: 0x7841, + // Block 0x4d, offset 0x1340 + 0x1340: 0x7841, 0x1341: 0x7841, 0x1342: 0x7859, 0x1343: 0x7859, 0x1344: 0x7871, 0x1345: 0x7871, + 0x1346: 0x7889, 0x1347: 0x7889, 0x1348: 0x78a1, 0x1349: 0x78a1, 0x134a: 0x78b9, 0x134b: 0x78b9, + 0x134c: 0x78d1, 0x134d: 0x78d1, 0x134e: 0x78e9, 0x134f: 0x78e9, 0x1350: 0x78e9, 0x1351: 0x78e9, + 0x1352: 0x7901, 0x1353: 0x7901, 0x1354: 0x7901, 0x1355: 0x7901, 0x1356: 0x7919, 0x1357: 0x7919, + 0x1358: 0x7919, 0x1359: 0x7919, 0x135a: 0x7931, 0x135b: 0x7931, 0x135c: 0x7931, 0x135d: 0x7931, + 0x135e: 0x7949, 0x135f: 0x7949, 0x1360: 0x7961, 0x1361: 0x7961, 0x1362: 0x7961, 0x1363: 0x7961, + 0x1364: 0x7979, 0x1365: 0x7979, 0x1366: 0x7991, 0x1367: 0x7991, 0x1368: 0x7991, 0x1369: 0x7991, + 0x136a: 0x79a9, 0x136b: 0x79a9, 0x136c: 0x79a9, 0x136d: 0x79a9, 0x136e: 0x79c1, 0x136f: 0x79c1, + 0x1370: 0x79d9, 0x1371: 0x79d9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818, + 0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818, + 0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818, + // Block 0x4e, offset 0x1380 + 0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040, + 0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040, + 0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040, + 0x1392: 0x0040, 0x1393: 0x79f1, 0x1394: 0x79f1, 0x1395: 0x79f1, 0x1396: 0x79f1, 0x1397: 0x7a09, + 0x1398: 0x7a09, 0x1399: 0x7a21, 0x139a: 0x7a21, 0x139b: 0x7a39, 0x139c: 0x7a39, 0x139d: 0x0479, + 0x139e: 0x7a51, 0x139f: 0x7a51, 0x13a0: 0x7a69, 0x13a1: 0x7a69, 0x13a2: 0x7a81, 0x13a3: 0x7a81, + 0x13a4: 0x7a99, 0x13a5: 0x7a99, 0x13a6: 0x7a99, 0x13a7: 0x7a99, 0x13a8: 0x7ab1, 0x13a9: 0x7ab1, + 0x13aa: 0x7ac9, 0x13ab: 0x7ac9, 0x13ac: 0x7af1, 0x13ad: 0x7af1, 0x13ae: 0x7b19, 0x13af: 0x7b19, + 0x13b0: 0x7b41, 0x13b1: 0x7b41, 0x13b2: 0x7b69, 0x13b3: 0x7b69, 0x13b4: 0x7b91, 0x13b5: 0x7b91, + 0x13b6: 0x7bb9, 0x13b7: 0x7bb9, 0x13b8: 0x7bb9, 0x13b9: 0x7be1, 0x13ba: 0x7be1, 0x13bb: 0x7be1, + 0x13bc: 0x7c09, 0x13bd: 0x7c09, 0x13be: 0x7c09, 0x13bf: 0x7c09, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x85f9, 0x13c1: 0x8621, 0x13c2: 0x8649, 0x13c3: 0x8671, 0x13c4: 0x8699, 0x13c5: 0x86c1, + 0x13c6: 0x86e9, 0x13c7: 0x8711, 0x13c8: 0x8739, 0x13c9: 0x8761, 0x13ca: 0x8789, 0x13cb: 0x87b1, + 0x13cc: 0x87d9, 0x13cd: 0x8801, 0x13ce: 0x8829, 0x13cf: 0x8851, 0x13d0: 0x8879, 0x13d1: 0x88a1, + 0x13d2: 0x88c9, 0x13d3: 0x88f1, 0x13d4: 0x8919, 0x13d5: 0x8941, 0x13d6: 0x8969, 0x13d7: 0x8991, + 0x13d8: 0x89b9, 0x13d9: 0x89e1, 0x13da: 0x8a09, 0x13db: 0x8a31, 0x13dc: 0x8a59, 0x13dd: 0x8a81, + 0x13de: 0x8aaa, 0x13df: 0x8ada, 0x13e0: 0x8b0a, 0x13e1: 0x8b3a, 0x13e2: 0x8b6a, 0x13e3: 0x8b9a, + 0x13e4: 0x8bc9, 0x13e5: 0x8bf1, 0x13e6: 0x7c71, 0x13e7: 0x8c19, 0x13e8: 0x7be1, 0x13e9: 0x7c99, + 0x13ea: 0x8c41, 0x13eb: 0x8c69, 0x13ec: 0x7d39, 0x13ed: 0x8c91, 0x13ee: 0x7d61, 0x13ef: 0x7d89, + 0x13f0: 0x8cb9, 0x13f1: 0x8ce1, 0x13f2: 0x7e29, 0x13f3: 0x8d09, 0x13f4: 0x7e51, 0x13f5: 0x7e79, + 0x13f6: 0x8d31, 0x13f7: 0x8d59, 0x13f8: 0x7ec9, 0x13f9: 0x8d81, 0x13fa: 0x7ef1, 0x13fb: 0x7f19, + 0x13fc: 0x83a1, 0x13fd: 0x83c9, 0x13fe: 0x8441, 0x13ff: 0x8469, + // Block 0x50, offset 0x1400 + 0x1400: 0x8491, 0x1401: 0x8531, 0x1402: 0x8559, 0x1403: 0x8581, 0x1404: 0x85a9, 0x1405: 0x8649, + 0x1406: 0x8671, 0x1407: 0x8699, 0x1408: 0x8da9, 0x1409: 0x8739, 0x140a: 0x8dd1, 0x140b: 0x8df9, + 0x140c: 0x8829, 0x140d: 0x8e21, 0x140e: 0x8851, 0x140f: 0x8879, 0x1410: 0x8a81, 0x1411: 0x8e49, + 0x1412: 0x8e71, 0x1413: 0x89b9, 0x1414: 0x8e99, 0x1415: 0x89e1, 0x1416: 0x8a09, 0x1417: 0x7c21, + 0x1418: 0x7c49, 0x1419: 0x8ec1, 0x141a: 0x7c71, 0x141b: 0x8ee9, 0x141c: 0x7cc1, 0x141d: 0x7ce9, + 0x141e: 0x7d11, 0x141f: 0x7d39, 0x1420: 0x8f11, 0x1421: 0x7db1, 0x1422: 0x7dd9, 0x1423: 0x7e01, + 0x1424: 0x7e29, 0x1425: 0x8f39, 0x1426: 0x7ec9, 0x1427: 0x7f41, 0x1428: 0x7f69, 0x1429: 0x7f91, + 0x142a: 0x7fb9, 0x142b: 0x7fe1, 0x142c: 0x8031, 0x142d: 0x8059, 0x142e: 0x8081, 0x142f: 0x80a9, + 0x1430: 0x80d1, 0x1431: 0x80f9, 0x1432: 0x8f61, 0x1433: 0x8121, 0x1434: 0x8149, 0x1435: 0x8171, + 0x1436: 0x8199, 0x1437: 0x81c1, 0x1438: 0x81e9, 0x1439: 0x8239, 0x143a: 0x8261, 0x143b: 0x8289, + 0x143c: 0x82b1, 0x143d: 0x82d9, 0x143e: 0x8301, 0x143f: 0x8329, + // Block 0x51, offset 0x1440 + 0x1440: 0x8351, 0x1441: 0x8379, 0x1442: 0x83f1, 0x1443: 0x8419, 0x1444: 0x84b9, 0x1445: 0x84e1, + 0x1446: 0x8509, 0x1447: 0x8531, 0x1448: 0x8559, 0x1449: 0x85d1, 0x144a: 0x85f9, 0x144b: 0x8621, + 0x144c: 0x8649, 0x144d: 0x8f89, 0x144e: 0x86c1, 0x144f: 0x86e9, 0x1450: 0x8711, 0x1451: 0x8739, + 0x1452: 0x87b1, 0x1453: 0x87d9, 0x1454: 0x8801, 0x1455: 0x8829, 0x1456: 0x8fb1, 0x1457: 0x88a1, + 0x1458: 0x88c9, 0x1459: 0x8fd9, 0x145a: 0x8941, 0x145b: 0x8969, 0x145c: 0x8991, 0x145d: 0x89b9, + 0x145e: 0x9001, 0x145f: 0x7c71, 0x1460: 0x8ee9, 0x1461: 0x7d39, 0x1462: 0x8f11, 0x1463: 0x7e29, + 0x1464: 0x8f39, 0x1465: 0x7ec9, 0x1466: 0x9029, 0x1467: 0x80d1, 0x1468: 0x9051, 0x1469: 0x9079, + 0x146a: 0x90a1, 0x146b: 0x8531, 0x146c: 0x8559, 0x146d: 0x8649, 0x146e: 0x8829, 0x146f: 0x8fb1, + 0x1470: 0x89b9, 0x1471: 0x9001, 0x1472: 0x90c9, 0x1473: 0x9101, 0x1474: 0x9139, 0x1475: 0x9171, + 0x1476: 0x9199, 0x1477: 0x91c1, 0x1478: 0x91e9, 0x1479: 0x9211, 0x147a: 0x9239, 0x147b: 0x9261, + 0x147c: 0x9289, 0x147d: 0x92b1, 0x147e: 0x92d9, 0x147f: 0x9301, + // Block 0x52, offset 0x1480 + 0x1480: 0x9329, 0x1481: 0x9351, 0x1482: 0x9379, 0x1483: 0x93a1, 0x1484: 0x93c9, 0x1485: 0x93f1, + 0x1486: 0x9419, 0x1487: 0x9441, 0x1488: 0x9469, 0x1489: 0x9491, 0x148a: 0x94b9, 0x148b: 0x94e1, + 0x148c: 0x9079, 0x148d: 0x9509, 0x148e: 0x9531, 0x148f: 0x9559, 0x1490: 0x9581, 0x1491: 0x9171, + 0x1492: 0x9199, 0x1493: 0x91c1, 0x1494: 0x91e9, 0x1495: 0x9211, 0x1496: 0x9239, 0x1497: 0x9261, + 0x1498: 0x9289, 0x1499: 0x92b1, 0x149a: 0x92d9, 0x149b: 0x9301, 0x149c: 0x9329, 0x149d: 0x9351, + 0x149e: 0x9379, 0x149f: 0x93a1, 0x14a0: 0x93c9, 0x14a1: 0x93f1, 0x14a2: 0x9419, 0x14a3: 0x9441, + 0x14a4: 0x9469, 0x14a5: 0x9491, 0x14a6: 0x94b9, 0x14a7: 0x94e1, 0x14a8: 0x9079, 0x14a9: 0x9509, + 0x14aa: 0x9531, 0x14ab: 0x9559, 0x14ac: 0x9581, 0x14ad: 0x9491, 0x14ae: 0x94b9, 0x14af: 0x94e1, + 0x14b0: 0x9079, 0x14b1: 0x9051, 0x14b2: 0x90a1, 0x14b3: 0x8211, 0x14b4: 0x8059, 0x14b5: 0x8081, + 0x14b6: 0x80a9, 0x14b7: 0x9491, 0x14b8: 0x94b9, 0x14b9: 0x94e1, 0x14ba: 0x8211, 0x14bb: 0x8239, + 0x14bc: 0x95a9, 0x14bd: 0x95a9, 0x14be: 0x0018, 0x14bf: 0x0018, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040, + 0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040, + 0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x95d1, 0x14d1: 0x9609, + 0x14d2: 0x9609, 0x14d3: 0x9641, 0x14d4: 0x9679, 0x14d5: 0x96b1, 0x14d6: 0x96e9, 0x14d7: 0x9721, + 0x14d8: 0x9759, 0x14d9: 0x9759, 0x14da: 0x9791, 0x14db: 0x97c9, 0x14dc: 0x9801, 0x14dd: 0x9839, + 0x14de: 0x9871, 0x14df: 0x98a9, 0x14e0: 0x98a9, 0x14e1: 0x98e1, 0x14e2: 0x9919, 0x14e3: 0x9919, + 0x14e4: 0x9951, 0x14e5: 0x9951, 0x14e6: 0x9989, 0x14e7: 0x99c1, 0x14e8: 0x99c1, 0x14e9: 0x99f9, + 0x14ea: 0x9a31, 0x14eb: 0x9a31, 0x14ec: 0x9a69, 0x14ed: 0x9a69, 0x14ee: 0x9aa1, 0x14ef: 0x9ad9, + 0x14f0: 0x9ad9, 0x14f1: 0x9b11, 0x14f2: 0x9b11, 0x14f3: 0x9b49, 0x14f4: 0x9b81, 0x14f5: 0x9bb9, + 0x14f6: 0x9bf1, 0x14f7: 0x9bf1, 0x14f8: 0x9c29, 0x14f9: 0x9c61, 0x14fa: 0x9c99, 0x14fb: 0x9cd1, + 0x14fc: 0x9d09, 0x14fd: 0x9d09, 0x14fe: 0x9d41, 0x14ff: 0x9d79, + // Block 0x54, offset 0x1500 + 0x1500: 0xa949, 0x1501: 0xa981, 0x1502: 0xa9b9, 0x1503: 0xa8a1, 0x1504: 0x9bb9, 0x1505: 0x9989, + 0x1506: 0xa9f1, 0x1507: 0xaa29, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040, + 0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040, + 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040, + 0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040, + 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040, + 0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040, + 0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, + 0x1530: 0xaa61, 0x1531: 0xaa99, 0x1532: 0xaad1, 0x1533: 0xab19, 0x1534: 0xab61, 0x1535: 0xaba9, + 0x1536: 0xabf1, 0x1537: 0xac39, 0x1538: 0xac81, 0x1539: 0xacc9, 0x153a: 0xad02, 0x153b: 0xae12, + 0x153c: 0xae91, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040, + // Block 0x55, offset 0x1540 + 0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0, + 0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0, + 0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaeda, 0x1551: 0x7d55, + 0x1552: 0x0040, 0x1553: 0xaeea, 0x1554: 0x03c2, 0x1555: 0xaefa, 0x1556: 0xaf0a, 0x1557: 0x7d75, + 0x1558: 0x7d95, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040, + 0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308, + 0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308, + 0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308, + 0x1570: 0x0040, 0x1571: 0x7db5, 0x1572: 0x7dd5, 0x1573: 0xaf1a, 0x1574: 0xaf1a, 0x1575: 0x1fd2, + 0x1576: 0x1fe2, 0x1577: 0xaf2a, 0x1578: 0xaf3a, 0x1579: 0x7df5, 0x157a: 0x7e15, 0x157b: 0x7e35, + 0x157c: 0x7df5, 0x157d: 0x7e55, 0x157e: 0x7e75, 0x157f: 0x7e55, + // Block 0x56, offset 0x1580 + 0x1580: 0x7e95, 0x1581: 0x7eb5, 0x1582: 0x7ed5, 0x1583: 0x7eb5, 0x1584: 0x7ef5, 0x1585: 0x0018, + 0x1586: 0x0018, 0x1587: 0xaf4a, 0x1588: 0xaf5a, 0x1589: 0x7f16, 0x158a: 0x7f36, 0x158b: 0x7f56, + 0x158c: 0x7f76, 0x158d: 0xaf1a, 0x158e: 0xaf1a, 0x158f: 0xaf1a, 0x1590: 0xaeda, 0x1591: 0x7f95, + 0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaeea, 0x1596: 0xaf0a, 0x1597: 0xaefa, + 0x1598: 0x7fb5, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf2a, 0x159c: 0xaf3a, 0x159d: 0x7e95, + 0x159e: 0x7ef5, 0x159f: 0xaf6a, 0x15a0: 0xaf7a, 0x15a1: 0xaf8a, 0x15a2: 0x1fb2, 0x15a3: 0xaf99, + 0x15a4: 0xafaa, 0x15a5: 0xafba, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xafca, 0x15a9: 0xafda, + 0x15aa: 0xafea, 0x15ab: 0xaffa, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040, + 0x15b0: 0x7fd6, 0x15b1: 0xb009, 0x15b2: 0x7ff6, 0x15b3: 0x0808, 0x15b4: 0x8016, 0x15b5: 0x0040, + 0x15b6: 0x8036, 0x15b7: 0xb031, 0x15b8: 0x8056, 0x15b9: 0xb059, 0x15ba: 0x8076, 0x15bb: 0xb081, + 0x15bc: 0x8096, 0x15bd: 0xb0a9, 0x15be: 0x80b6, 0x15bf: 0xb0d1, + // Block 0x57, offset 0x15c0 + 0x15c0: 0xb0f9, 0x15c1: 0xb111, 0x15c2: 0xb111, 0x15c3: 0xb129, 0x15c4: 0xb129, 0x15c5: 0xb141, + 0x15c6: 0xb141, 0x15c7: 0xb159, 0x15c8: 0xb159, 0x15c9: 0xb171, 0x15ca: 0xb171, 0x15cb: 0xb171, + 0x15cc: 0xb171, 0x15cd: 0xb189, 0x15ce: 0xb189, 0x15cf: 0xb1a1, 0x15d0: 0xb1a1, 0x15d1: 0xb1a1, + 0x15d2: 0xb1a1, 0x15d3: 0xb1b9, 0x15d4: 0xb1b9, 0x15d5: 0xb1d1, 0x15d6: 0xb1d1, 0x15d7: 0xb1d1, + 0x15d8: 0xb1d1, 0x15d9: 0xb1e9, 0x15da: 0xb1e9, 0x15db: 0xb1e9, 0x15dc: 0xb1e9, 0x15dd: 0xb201, + 0x15de: 0xb201, 0x15df: 0xb201, 0x15e0: 0xb201, 0x15e1: 0xb219, 0x15e2: 0xb219, 0x15e3: 0xb219, + 0x15e4: 0xb219, 0x15e5: 0xb231, 0x15e6: 0xb231, 0x15e7: 0xb231, 0x15e8: 0xb231, 0x15e9: 0xb249, + 0x15ea: 0xb249, 0x15eb: 0xb261, 0x15ec: 0xb261, 0x15ed: 0xb279, 0x15ee: 0xb279, 0x15ef: 0xb291, + 0x15f0: 0xb291, 0x15f1: 0xb2a9, 0x15f2: 0xb2a9, 0x15f3: 0xb2a9, 0x15f4: 0xb2a9, 0x15f5: 0xb2c1, + 0x15f6: 0xb2c1, 0x15f7: 0xb2c1, 0x15f8: 0xb2c1, 0x15f9: 0xb2d9, 0x15fa: 0xb2d9, 0x15fb: 0xb2d9, + 0x15fc: 0xb2d9, 0x15fd: 0xb2f1, 0x15fe: 0xb2f1, 0x15ff: 0xb2f1, + // Block 0x58, offset 0x1600 + 0x1600: 0xb2f1, 0x1601: 0xb309, 0x1602: 0xb309, 0x1603: 0xb309, 0x1604: 0xb309, 0x1605: 0xb321, + 0x1606: 0xb321, 0x1607: 0xb321, 0x1608: 0xb321, 0x1609: 0xb339, 0x160a: 0xb339, 0x160b: 0xb339, + 0x160c: 0xb339, 0x160d: 0xb351, 0x160e: 0xb351, 0x160f: 0xb351, 0x1610: 0xb351, 0x1611: 0xb369, + 0x1612: 0xb369, 0x1613: 0xb369, 0x1614: 0xb369, 0x1615: 0xb381, 0x1616: 0xb381, 0x1617: 0xb381, + 0x1618: 0xb381, 0x1619: 0xb399, 0x161a: 0xb399, 0x161b: 0xb399, 0x161c: 0xb399, 0x161d: 0xb3b1, + 0x161e: 0xb3b1, 0x161f: 0xb3b1, 0x1620: 0xb3b1, 0x1621: 0xb3c9, 0x1622: 0xb3c9, 0x1623: 0xb3c9, + 0x1624: 0xb3c9, 0x1625: 0xb3e1, 0x1626: 0xb3e1, 0x1627: 0xb3e1, 0x1628: 0xb3e1, 0x1629: 0xb3f9, + 0x162a: 0xb3f9, 0x162b: 0xb3f9, 0x162c: 0xb3f9, 0x162d: 0xb411, 0x162e: 0xb411, 0x162f: 0x7ab1, + 0x1630: 0x7ab1, 0x1631: 0xb429, 0x1632: 0xb429, 0x1633: 0xb429, 0x1634: 0xb429, 0x1635: 0xb441, + 0x1636: 0xb441, 0x1637: 0xb469, 0x1638: 0xb469, 0x1639: 0xb491, 0x163a: 0xb491, 0x163b: 0xb4b9, + 0x163c: 0xb4b9, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0, + // Block 0x59, offset 0x1640 + 0x1640: 0x0040, 0x1641: 0xaefa, 0x1642: 0xb4e2, 0x1643: 0xaf6a, 0x1644: 0xafda, 0x1645: 0xafea, + 0x1646: 0xaf7a, 0x1647: 0xb4f2, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xaf8a, 0x164b: 0x1fb2, + 0x164c: 0xaeda, 0x164d: 0xaf99, 0x164e: 0x29d1, 0x164f: 0xb502, 0x1650: 0x1f41, 0x1651: 0x00c9, + 0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81, + 0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaeea, 0x165b: 0x03c2, 0x165c: 0xafaa, 0x165d: 0x1fc2, + 0x165e: 0xafba, 0x165f: 0xaf0a, 0x1660: 0xaffa, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159, + 0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41, + 0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9, + 0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9, + 0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf4a, + 0x167c: 0xafca, 0x167d: 0xaf5a, 0x167e: 0xb512, 0x167f: 0xaf1a, + // Block 0x5a, offset 0x1680 + 0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09, + 0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51, + 0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039, + 0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279, + 0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf2a, 0x169c: 0xb522, 0x169d: 0xaf3a, + 0x169e: 0xb532, 0x169f: 0x80d5, 0x16a0: 0x80f5, 0x16a1: 0x29d1, 0x16a2: 0x8115, 0x16a3: 0x8115, + 0x16a4: 0x8135, 0x16a5: 0x8155, 0x16a6: 0x8175, 0x16a7: 0x8195, 0x16a8: 0x81b5, 0x16a9: 0x81d5, + 0x16aa: 0x81f5, 0x16ab: 0x8215, 0x16ac: 0x8235, 0x16ad: 0x8255, 0x16ae: 0x8275, 0x16af: 0x8295, + 0x16b0: 0x82b5, 0x16b1: 0x82d5, 0x16b2: 0x82f5, 0x16b3: 0x8315, 0x16b4: 0x8335, 0x16b5: 0x8355, + 0x16b6: 0x8375, 0x16b7: 0x8395, 0x16b8: 0x83b5, 0x16b9: 0x83d5, 0x16ba: 0x83f5, 0x16bb: 0x8415, + 0x16bc: 0x81b5, 0x16bd: 0x8435, 0x16be: 0x8455, 0x16bf: 0x8215, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x8475, 0x16c1: 0x8495, 0x16c2: 0x84b5, 0x16c3: 0x84d5, 0x16c4: 0x84f5, 0x16c5: 0x8515, + 0x16c6: 0x8535, 0x16c7: 0x8555, 0x16c8: 0x84d5, 0x16c9: 0x8575, 0x16ca: 0x84d5, 0x16cb: 0x8595, + 0x16cc: 0x8595, 0x16cd: 0x85b5, 0x16ce: 0x85b5, 0x16cf: 0x85d5, 0x16d0: 0x8515, 0x16d1: 0x85f5, + 0x16d2: 0x8615, 0x16d3: 0x85f5, 0x16d4: 0x8635, 0x16d5: 0x8615, 0x16d6: 0x8655, 0x16d7: 0x8655, + 0x16d8: 0x8675, 0x16d9: 0x8675, 0x16da: 0x8695, 0x16db: 0x8695, 0x16dc: 0x8615, 0x16dd: 0x8115, + 0x16de: 0x86b5, 0x16df: 0x86d5, 0x16e0: 0x0040, 0x16e1: 0x86f5, 0x16e2: 0x8715, 0x16e3: 0x8735, + 0x16e4: 0x8755, 0x16e5: 0x8735, 0x16e6: 0x8775, 0x16e7: 0x8795, 0x16e8: 0x87b5, 0x16e9: 0x87b5, + 0x16ea: 0x87d5, 0x16eb: 0x87d5, 0x16ec: 0x87f5, 0x16ed: 0x87f5, 0x16ee: 0x87d5, 0x16ef: 0x87d5, + 0x16f0: 0x8815, 0x16f1: 0x8835, 0x16f2: 0x8855, 0x16f3: 0x8875, 0x16f4: 0x8895, 0x16f5: 0x88b5, + 0x16f6: 0x88b5, 0x16f7: 0x88b5, 0x16f8: 0x88d5, 0x16f9: 0x88d5, 0x16fa: 0x88d5, 0x16fb: 0x88d5, + 0x16fc: 0x87b5, 0x16fd: 0x87b5, 0x16fe: 0x87b5, 0x16ff: 0x0040, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x8715, 0x1703: 0x86f5, 0x1704: 0x88f5, 0x1705: 0x86f5, + 0x1706: 0x8715, 0x1707: 0x86f5, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x8915, 0x170b: 0x8715, + 0x170c: 0x8935, 0x170d: 0x88f5, 0x170e: 0x8935, 0x170f: 0x8715, 0x1710: 0x0040, 0x1711: 0x0040, + 0x1712: 0x8955, 0x1713: 0x8975, 0x1714: 0x8875, 0x1715: 0x8935, 0x1716: 0x88f5, 0x1717: 0x8935, + 0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x8995, 0x171b: 0x89b5, 0x171c: 0x8995, 0x171d: 0x0040, + 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb541, 0x1721: 0xb559, 0x1722: 0xb571, 0x1723: 0x89d6, + 0x1724: 0xb589, 0x1725: 0xb5a1, 0x1726: 0x89f5, 0x1727: 0x0040, 0x1728: 0x8a15, 0x1729: 0x8a35, + 0x172a: 0x8a55, 0x172b: 0x8a35, 0x172c: 0x8a75, 0x172d: 0x8a95, 0x172e: 0x8ab5, 0x172f: 0x0040, + 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, + 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340, + 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, + // Block 0x5d, offset 0x1740 + 0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08, + 0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808, + 0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08, + 0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908, + 0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08, + 0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808, + 0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040, + 0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18, + 0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818, + 0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040, + 0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040, + // Block 0x5e, offset 0x1780 + 0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08, + 0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08, + 0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08, + 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040, + 0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040, + 0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040, + 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18, + 0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818, + 0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040, + 0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040, + 0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008, + 0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008, + 0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040, + 0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008, + 0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008, + 0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008, + 0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040, + 0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008, + 0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008, + 0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x3308, + 0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008, + // Block 0x60, offset 0x1800 + 0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040, + 0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008, + 0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040, + 0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008, + 0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008, + 0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008, + 0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308, + 0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040, + 0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040, + 0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040, + 0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040, + // Block 0x61, offset 0x1840 + 0x1840: 0x0039, 0x1841: 0x0ee9, 0x1842: 0x1159, 0x1843: 0x0ef9, 0x1844: 0x0f09, 0x1845: 0x1199, + 0x1846: 0x0f31, 0x1847: 0x0249, 0x1848: 0x0f41, 0x1849: 0x0259, 0x184a: 0x0f51, 0x184b: 0x0359, + 0x184c: 0x0f61, 0x184d: 0x0f71, 0x184e: 0x00d9, 0x184f: 0x0f99, 0x1850: 0x2039, 0x1851: 0x0269, + 0x1852: 0x01d9, 0x1853: 0x0fa9, 0x1854: 0x0fb9, 0x1855: 0x1089, 0x1856: 0x0279, 0x1857: 0x0369, + 0x1858: 0x0289, 0x1859: 0x13d1, 0x185a: 0x0039, 0x185b: 0x0ee9, 0x185c: 0x1159, 0x185d: 0x0ef9, + 0x185e: 0x0f09, 0x185f: 0x1199, 0x1860: 0x0f31, 0x1861: 0x0249, 0x1862: 0x0f41, 0x1863: 0x0259, + 0x1864: 0x0f51, 0x1865: 0x0359, 0x1866: 0x0f61, 0x1867: 0x0f71, 0x1868: 0x00d9, 0x1869: 0x0f99, + 0x186a: 0x2039, 0x186b: 0x0269, 0x186c: 0x01d9, 0x186d: 0x0fa9, 0x186e: 0x0fb9, 0x186f: 0x1089, + 0x1870: 0x0279, 0x1871: 0x0369, 0x1872: 0x0289, 0x1873: 0x13d1, 0x1874: 0x0039, 0x1875: 0x0ee9, + 0x1876: 0x1159, 0x1877: 0x0ef9, 0x1878: 0x0f09, 0x1879: 0x1199, 0x187a: 0x0f31, 0x187b: 0x0249, + 0x187c: 0x0f41, 0x187d: 0x0259, 0x187e: 0x0f51, 0x187f: 0x0359, + // Block 0x62, offset 0x1880 + 0x1880: 0x0f61, 0x1881: 0x0f71, 0x1882: 0x00d9, 0x1883: 0x0f99, 0x1884: 0x2039, 0x1885: 0x0269, + 0x1886: 0x01d9, 0x1887: 0x0fa9, 0x1888: 0x0fb9, 0x1889: 0x1089, 0x188a: 0x0279, 0x188b: 0x0369, + 0x188c: 0x0289, 0x188d: 0x13d1, 0x188e: 0x0039, 0x188f: 0x0ee9, 0x1890: 0x1159, 0x1891: 0x0ef9, + 0x1892: 0x0f09, 0x1893: 0x1199, 0x1894: 0x0f31, 0x1895: 0x0040, 0x1896: 0x0f41, 0x1897: 0x0259, + 0x1898: 0x0f51, 0x1899: 0x0359, 0x189a: 0x0f61, 0x189b: 0x0f71, 0x189c: 0x00d9, 0x189d: 0x0f99, + 0x189e: 0x2039, 0x189f: 0x0269, 0x18a0: 0x01d9, 0x18a1: 0x0fa9, 0x18a2: 0x0fb9, 0x18a3: 0x1089, + 0x18a4: 0x0279, 0x18a5: 0x0369, 0x18a6: 0x0289, 0x18a7: 0x13d1, 0x18a8: 0x0039, 0x18a9: 0x0ee9, + 0x18aa: 0x1159, 0x18ab: 0x0ef9, 0x18ac: 0x0f09, 0x18ad: 0x1199, 0x18ae: 0x0f31, 0x18af: 0x0249, + 0x18b0: 0x0f41, 0x18b1: 0x0259, 0x18b2: 0x0f51, 0x18b3: 0x0359, 0x18b4: 0x0f61, 0x18b5: 0x0f71, + 0x18b6: 0x00d9, 0x18b7: 0x0f99, 0x18b8: 0x2039, 0x18b9: 0x0269, 0x18ba: 0x01d9, 0x18bb: 0x0fa9, + 0x18bc: 0x0fb9, 0x18bd: 0x1089, 0x18be: 0x0279, 0x18bf: 0x0369, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0289, 0x18c1: 0x13d1, 0x18c2: 0x0039, 0x18c3: 0x0ee9, 0x18c4: 0x1159, 0x18c5: 0x0ef9, + 0x18c6: 0x0f09, 0x18c7: 0x1199, 0x18c8: 0x0f31, 0x18c9: 0x0249, 0x18ca: 0x0f41, 0x18cb: 0x0259, + 0x18cc: 0x0f51, 0x18cd: 0x0359, 0x18ce: 0x0f61, 0x18cf: 0x0f71, 0x18d0: 0x00d9, 0x18d1: 0x0f99, + 0x18d2: 0x2039, 0x18d3: 0x0269, 0x18d4: 0x01d9, 0x18d5: 0x0fa9, 0x18d6: 0x0fb9, 0x18d7: 0x1089, + 0x18d8: 0x0279, 0x18d9: 0x0369, 0x18da: 0x0289, 0x18db: 0x13d1, 0x18dc: 0x0039, 0x18dd: 0x0040, + 0x18de: 0x1159, 0x18df: 0x0ef9, 0x18e0: 0x0040, 0x18e1: 0x0040, 0x18e2: 0x0f31, 0x18e3: 0x0040, + 0x18e4: 0x0040, 0x18e5: 0x0259, 0x18e6: 0x0f51, 0x18e7: 0x0040, 0x18e8: 0x0040, 0x18e9: 0x0f71, + 0x18ea: 0x00d9, 0x18eb: 0x0f99, 0x18ec: 0x2039, 0x18ed: 0x0040, 0x18ee: 0x01d9, 0x18ef: 0x0fa9, + 0x18f0: 0x0fb9, 0x18f1: 0x1089, 0x18f2: 0x0279, 0x18f3: 0x0369, 0x18f4: 0x0289, 0x18f5: 0x13d1, + 0x18f6: 0x0039, 0x18f7: 0x0ee9, 0x18f8: 0x1159, 0x18f9: 0x0ef9, 0x18fa: 0x0040, 0x18fb: 0x1199, + 0x18fc: 0x0040, 0x18fd: 0x0249, 0x18fe: 0x0f41, 0x18ff: 0x0259, + // Block 0x64, offset 0x1900 + 0x1900: 0x0f51, 0x1901: 0x0359, 0x1902: 0x0f61, 0x1903: 0x0f71, 0x1904: 0x0040, 0x1905: 0x0f99, + 0x1906: 0x2039, 0x1907: 0x0269, 0x1908: 0x01d9, 0x1909: 0x0fa9, 0x190a: 0x0fb9, 0x190b: 0x1089, + 0x190c: 0x0279, 0x190d: 0x0369, 0x190e: 0x0289, 0x190f: 0x13d1, 0x1910: 0x0039, 0x1911: 0x0ee9, + 0x1912: 0x1159, 0x1913: 0x0ef9, 0x1914: 0x0f09, 0x1915: 0x1199, 0x1916: 0x0f31, 0x1917: 0x0249, + 0x1918: 0x0f41, 0x1919: 0x0259, 0x191a: 0x0f51, 0x191b: 0x0359, 0x191c: 0x0f61, 0x191d: 0x0f71, + 0x191e: 0x00d9, 0x191f: 0x0f99, 0x1920: 0x2039, 0x1921: 0x0269, 0x1922: 0x01d9, 0x1923: 0x0fa9, + 0x1924: 0x0fb9, 0x1925: 0x1089, 0x1926: 0x0279, 0x1927: 0x0369, 0x1928: 0x0289, 0x1929: 0x13d1, + 0x192a: 0x0039, 0x192b: 0x0ee9, 0x192c: 0x1159, 0x192d: 0x0ef9, 0x192e: 0x0f09, 0x192f: 0x1199, + 0x1930: 0x0f31, 0x1931: 0x0249, 0x1932: 0x0f41, 0x1933: 0x0259, 0x1934: 0x0f51, 0x1935: 0x0359, + 0x1936: 0x0f61, 0x1937: 0x0f71, 0x1938: 0x00d9, 0x1939: 0x0f99, 0x193a: 0x2039, 0x193b: 0x0269, + 0x193c: 0x01d9, 0x193d: 0x0fa9, 0x193e: 0x0fb9, 0x193f: 0x1089, + // Block 0x65, offset 0x1940 + 0x1940: 0x0279, 0x1941: 0x0369, 0x1942: 0x0289, 0x1943: 0x13d1, 0x1944: 0x0039, 0x1945: 0x0ee9, + 0x1946: 0x0040, 0x1947: 0x0ef9, 0x1948: 0x0f09, 0x1949: 0x1199, 0x194a: 0x0f31, 0x194b: 0x0040, + 0x194c: 0x0040, 0x194d: 0x0259, 0x194e: 0x0f51, 0x194f: 0x0359, 0x1950: 0x0f61, 0x1951: 0x0f71, + 0x1952: 0x00d9, 0x1953: 0x0f99, 0x1954: 0x2039, 0x1955: 0x0040, 0x1956: 0x01d9, 0x1957: 0x0fa9, + 0x1958: 0x0fb9, 0x1959: 0x1089, 0x195a: 0x0279, 0x195b: 0x0369, 0x195c: 0x0289, 0x195d: 0x0040, + 0x195e: 0x0039, 0x195f: 0x0ee9, 0x1960: 0x1159, 0x1961: 0x0ef9, 0x1962: 0x0f09, 0x1963: 0x1199, + 0x1964: 0x0f31, 0x1965: 0x0249, 0x1966: 0x0f41, 0x1967: 0x0259, 0x1968: 0x0f51, 0x1969: 0x0359, + 0x196a: 0x0f61, 0x196b: 0x0f71, 0x196c: 0x00d9, 0x196d: 0x0f99, 0x196e: 0x2039, 0x196f: 0x0269, + 0x1970: 0x01d9, 0x1971: 0x0fa9, 0x1972: 0x0fb9, 0x1973: 0x1089, 0x1974: 0x0279, 0x1975: 0x0369, + 0x1976: 0x0289, 0x1977: 0x13d1, 0x1978: 0x0039, 0x1979: 0x0ee9, 0x197a: 0x0040, 0x197b: 0x0ef9, + 0x197c: 0x0f09, 0x197d: 0x1199, 0x197e: 0x0f31, 0x197f: 0x0040, + // Block 0x66, offset 0x1980 + 0x1980: 0x0f41, 0x1981: 0x0259, 0x1982: 0x0f51, 0x1983: 0x0359, 0x1984: 0x0f61, 0x1985: 0x0040, + 0x1986: 0x00d9, 0x1987: 0x0040, 0x1988: 0x0040, 0x1989: 0x0040, 0x198a: 0x01d9, 0x198b: 0x0fa9, + 0x198c: 0x0fb9, 0x198d: 0x1089, 0x198e: 0x0279, 0x198f: 0x0369, 0x1990: 0x0289, 0x1991: 0x0040, + 0x1992: 0x0039, 0x1993: 0x0ee9, 0x1994: 0x1159, 0x1995: 0x0ef9, 0x1996: 0x0f09, 0x1997: 0x1199, + 0x1998: 0x0f31, 0x1999: 0x0249, 0x199a: 0x0f41, 0x199b: 0x0259, 0x199c: 0x0f51, 0x199d: 0x0359, + 0x199e: 0x0f61, 0x199f: 0x0f71, 0x19a0: 0x00d9, 0x19a1: 0x0f99, 0x19a2: 0x2039, 0x19a3: 0x0269, + 0x19a4: 0x01d9, 0x19a5: 0x0fa9, 0x19a6: 0x0fb9, 0x19a7: 0x1089, 0x19a8: 0x0279, 0x19a9: 0x0369, + 0x19aa: 0x0289, 0x19ab: 0x13d1, 0x19ac: 0x0039, 0x19ad: 0x0ee9, 0x19ae: 0x1159, 0x19af: 0x0ef9, + 0x19b0: 0x0f09, 0x19b1: 0x1199, 0x19b2: 0x0f31, 0x19b3: 0x0249, 0x19b4: 0x0f41, 0x19b5: 0x0259, + 0x19b6: 0x0f51, 0x19b7: 0x0359, 0x19b8: 0x0f61, 0x19b9: 0x0f71, 0x19ba: 0x00d9, 0x19bb: 0x0f99, + 0x19bc: 0x2039, 0x19bd: 0x0269, 0x19be: 0x01d9, 0x19bf: 0x0fa9, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x0fb9, 0x19c1: 0x1089, 0x19c2: 0x0279, 0x19c3: 0x0369, 0x19c4: 0x0289, 0x19c5: 0x13d1, + 0x19c6: 0x0039, 0x19c7: 0x0ee9, 0x19c8: 0x1159, 0x19c9: 0x0ef9, 0x19ca: 0x0f09, 0x19cb: 0x1199, + 0x19cc: 0x0f31, 0x19cd: 0x0249, 0x19ce: 0x0f41, 0x19cf: 0x0259, 0x19d0: 0x0f51, 0x19d1: 0x0359, + 0x19d2: 0x0f61, 0x19d3: 0x0f71, 0x19d4: 0x00d9, 0x19d5: 0x0f99, 0x19d6: 0x2039, 0x19d7: 0x0269, + 0x19d8: 0x01d9, 0x19d9: 0x0fa9, 0x19da: 0x0fb9, 0x19db: 0x1089, 0x19dc: 0x0279, 0x19dd: 0x0369, + 0x19de: 0x0289, 0x19df: 0x13d1, 0x19e0: 0x0039, 0x19e1: 0x0ee9, 0x19e2: 0x1159, 0x19e3: 0x0ef9, + 0x19e4: 0x0f09, 0x19e5: 0x1199, 0x19e6: 0x0f31, 0x19e7: 0x0249, 0x19e8: 0x0f41, 0x19e9: 0x0259, + 0x19ea: 0x0f51, 0x19eb: 0x0359, 0x19ec: 0x0f61, 0x19ed: 0x0f71, 0x19ee: 0x00d9, 0x19ef: 0x0f99, + 0x19f0: 0x2039, 0x19f1: 0x0269, 0x19f2: 0x01d9, 0x19f3: 0x0fa9, 0x19f4: 0x0fb9, 0x19f5: 0x1089, + 0x19f6: 0x0279, 0x19f7: 0x0369, 0x19f8: 0x0289, 0x19f9: 0x13d1, 0x19fa: 0x0039, 0x19fb: 0x0ee9, + 0x19fc: 0x1159, 0x19fd: 0x0ef9, 0x19fe: 0x0f09, 0x19ff: 0x1199, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x0f31, 0x1a01: 0x0249, 0x1a02: 0x0f41, 0x1a03: 0x0259, 0x1a04: 0x0f51, 0x1a05: 0x0359, + 0x1a06: 0x0f61, 0x1a07: 0x0f71, 0x1a08: 0x00d9, 0x1a09: 0x0f99, 0x1a0a: 0x2039, 0x1a0b: 0x0269, + 0x1a0c: 0x01d9, 0x1a0d: 0x0fa9, 0x1a0e: 0x0fb9, 0x1a0f: 0x1089, 0x1a10: 0x0279, 0x1a11: 0x0369, + 0x1a12: 0x0289, 0x1a13: 0x13d1, 0x1a14: 0x0039, 0x1a15: 0x0ee9, 0x1a16: 0x1159, 0x1a17: 0x0ef9, + 0x1a18: 0x0f09, 0x1a19: 0x1199, 0x1a1a: 0x0f31, 0x1a1b: 0x0249, 0x1a1c: 0x0f41, 0x1a1d: 0x0259, + 0x1a1e: 0x0f51, 0x1a1f: 0x0359, 0x1a20: 0x0f61, 0x1a21: 0x0f71, 0x1a22: 0x00d9, 0x1a23: 0x0f99, + 0x1a24: 0x2039, 0x1a25: 0x0269, 0x1a26: 0x01d9, 0x1a27: 0x0fa9, 0x1a28: 0x0fb9, 0x1a29: 0x1089, + 0x1a2a: 0x0279, 0x1a2b: 0x0369, 0x1a2c: 0x0289, 0x1a2d: 0x13d1, 0x1a2e: 0x0039, 0x1a2f: 0x0ee9, + 0x1a30: 0x1159, 0x1a31: 0x0ef9, 0x1a32: 0x0f09, 0x1a33: 0x1199, 0x1a34: 0x0f31, 0x1a35: 0x0249, + 0x1a36: 0x0f41, 0x1a37: 0x0259, 0x1a38: 0x0f51, 0x1a39: 0x0359, 0x1a3a: 0x0f61, 0x1a3b: 0x0f71, + 0x1a3c: 0x00d9, 0x1a3d: 0x0f99, 0x1a3e: 0x2039, 0x1a3f: 0x0269, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x01d9, 0x1a41: 0x0fa9, 0x1a42: 0x0fb9, 0x1a43: 0x1089, 0x1a44: 0x0279, 0x1a45: 0x0369, + 0x1a46: 0x0289, 0x1a47: 0x13d1, 0x1a48: 0x0039, 0x1a49: 0x0ee9, 0x1a4a: 0x1159, 0x1a4b: 0x0ef9, + 0x1a4c: 0x0f09, 0x1a4d: 0x1199, 0x1a4e: 0x0f31, 0x1a4f: 0x0249, 0x1a50: 0x0f41, 0x1a51: 0x0259, + 0x1a52: 0x0f51, 0x1a53: 0x0359, 0x1a54: 0x0f61, 0x1a55: 0x0f71, 0x1a56: 0x00d9, 0x1a57: 0x0f99, + 0x1a58: 0x2039, 0x1a59: 0x0269, 0x1a5a: 0x01d9, 0x1a5b: 0x0fa9, 0x1a5c: 0x0fb9, 0x1a5d: 0x1089, + 0x1a5e: 0x0279, 0x1a5f: 0x0369, 0x1a60: 0x0289, 0x1a61: 0x13d1, 0x1a62: 0x0039, 0x1a63: 0x0ee9, + 0x1a64: 0x1159, 0x1a65: 0x0ef9, 0x1a66: 0x0f09, 0x1a67: 0x1199, 0x1a68: 0x0f31, 0x1a69: 0x0249, + 0x1a6a: 0x0f41, 0x1a6b: 0x0259, 0x1a6c: 0x0f51, 0x1a6d: 0x0359, 0x1a6e: 0x0f61, 0x1a6f: 0x0f71, + 0x1a70: 0x00d9, 0x1a71: 0x0f99, 0x1a72: 0x2039, 0x1a73: 0x0269, 0x1a74: 0x01d9, 0x1a75: 0x0fa9, + 0x1a76: 0x0fb9, 0x1a77: 0x1089, 0x1a78: 0x0279, 0x1a79: 0x0369, 0x1a7a: 0x0289, 0x1a7b: 0x13d1, + 0x1a7c: 0x0039, 0x1a7d: 0x0ee9, 0x1a7e: 0x1159, 0x1a7f: 0x0ef9, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x0f09, 0x1a81: 0x1199, 0x1a82: 0x0f31, 0x1a83: 0x0249, 0x1a84: 0x0f41, 0x1a85: 0x0259, + 0x1a86: 0x0f51, 0x1a87: 0x0359, 0x1a88: 0x0f61, 0x1a89: 0x0f71, 0x1a8a: 0x00d9, 0x1a8b: 0x0f99, + 0x1a8c: 0x2039, 0x1a8d: 0x0269, 0x1a8e: 0x01d9, 0x1a8f: 0x0fa9, 0x1a90: 0x0fb9, 0x1a91: 0x1089, + 0x1a92: 0x0279, 0x1a93: 0x0369, 0x1a94: 0x0289, 0x1a95: 0x13d1, 0x1a96: 0x0039, 0x1a97: 0x0ee9, + 0x1a98: 0x1159, 0x1a99: 0x0ef9, 0x1a9a: 0x0f09, 0x1a9b: 0x1199, 0x1a9c: 0x0f31, 0x1a9d: 0x0249, + 0x1a9e: 0x0f41, 0x1a9f: 0x0259, 0x1aa0: 0x0f51, 0x1aa1: 0x0359, 0x1aa2: 0x0f61, 0x1aa3: 0x0f71, + 0x1aa4: 0x00d9, 0x1aa5: 0x0f99, 0x1aa6: 0x2039, 0x1aa7: 0x0269, 0x1aa8: 0x01d9, 0x1aa9: 0x0fa9, + 0x1aaa: 0x0fb9, 0x1aab: 0x1089, 0x1aac: 0x0279, 0x1aad: 0x0369, 0x1aae: 0x0289, 0x1aaf: 0x13d1, + 0x1ab0: 0x0039, 0x1ab1: 0x0ee9, 0x1ab2: 0x1159, 0x1ab3: 0x0ef9, 0x1ab4: 0x0f09, 0x1ab5: 0x1199, + 0x1ab6: 0x0f31, 0x1ab7: 0x0249, 0x1ab8: 0x0f41, 0x1ab9: 0x0259, 0x1aba: 0x0f51, 0x1abb: 0x0359, + 0x1abc: 0x0f61, 0x1abd: 0x0f71, 0x1abe: 0x00d9, 0x1abf: 0x0f99, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x2039, 0x1ac1: 0x0269, 0x1ac2: 0x01d9, 0x1ac3: 0x0fa9, 0x1ac4: 0x0fb9, 0x1ac5: 0x1089, + 0x1ac6: 0x0279, 0x1ac7: 0x0369, 0x1ac8: 0x0289, 0x1ac9: 0x13d1, 0x1aca: 0x0039, 0x1acb: 0x0ee9, + 0x1acc: 0x1159, 0x1acd: 0x0ef9, 0x1ace: 0x0f09, 0x1acf: 0x1199, 0x1ad0: 0x0f31, 0x1ad1: 0x0249, + 0x1ad2: 0x0f41, 0x1ad3: 0x0259, 0x1ad4: 0x0f51, 0x1ad5: 0x0359, 0x1ad6: 0x0f61, 0x1ad7: 0x0f71, + 0x1ad8: 0x00d9, 0x1ad9: 0x0f99, 0x1ada: 0x2039, 0x1adb: 0x0269, 0x1adc: 0x01d9, 0x1add: 0x0fa9, + 0x1ade: 0x0fb9, 0x1adf: 0x1089, 0x1ae0: 0x0279, 0x1ae1: 0x0369, 0x1ae2: 0x0289, 0x1ae3: 0x13d1, + 0x1ae4: 0xba81, 0x1ae5: 0xba99, 0x1ae6: 0x0040, 0x1ae7: 0x0040, 0x1ae8: 0xbab1, 0x1ae9: 0x1099, + 0x1aea: 0x10b1, 0x1aeb: 0x10c9, 0x1aec: 0xbac9, 0x1aed: 0xbae1, 0x1aee: 0xbaf9, 0x1aef: 0x1429, + 0x1af0: 0x1a31, 0x1af1: 0xbb11, 0x1af2: 0xbb29, 0x1af3: 0xbb41, 0x1af4: 0xbb59, 0x1af5: 0xbb71, + 0x1af6: 0xbb89, 0x1af7: 0x2109, 0x1af8: 0x1111, 0x1af9: 0x1429, 0x1afa: 0xbba1, 0x1afb: 0xbbb9, + 0x1afc: 0xbbd1, 0x1afd: 0x10e1, 0x1afe: 0x10f9, 0x1aff: 0xbbe9, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x2079, 0x1b01: 0xbc01, 0x1b02: 0xbab1, 0x1b03: 0x1099, 0x1b04: 0x10b1, 0x1b05: 0x10c9, + 0x1b06: 0xbac9, 0x1b07: 0xbae1, 0x1b08: 0xbaf9, 0x1b09: 0x1429, 0x1b0a: 0x1a31, 0x1b0b: 0xbb11, + 0x1b0c: 0xbb29, 0x1b0d: 0xbb41, 0x1b0e: 0xbb59, 0x1b0f: 0xbb71, 0x1b10: 0xbb89, 0x1b11: 0x2109, + 0x1b12: 0x1111, 0x1b13: 0xbba1, 0x1b14: 0xbba1, 0x1b15: 0xbbb9, 0x1b16: 0xbbd1, 0x1b17: 0x10e1, + 0x1b18: 0x10f9, 0x1b19: 0xbbe9, 0x1b1a: 0x2079, 0x1b1b: 0xbc21, 0x1b1c: 0xbac9, 0x1b1d: 0x1429, + 0x1b1e: 0xbb11, 0x1b1f: 0x10e1, 0x1b20: 0x1111, 0x1b21: 0x2109, 0x1b22: 0xbab1, 0x1b23: 0x1099, + 0x1b24: 0x10b1, 0x1b25: 0x10c9, 0x1b26: 0xbac9, 0x1b27: 0xbae1, 0x1b28: 0xbaf9, 0x1b29: 0x1429, + 0x1b2a: 0x1a31, 0x1b2b: 0xbb11, 0x1b2c: 0xbb29, 0x1b2d: 0xbb41, 0x1b2e: 0xbb59, 0x1b2f: 0xbb71, + 0x1b30: 0xbb89, 0x1b31: 0x2109, 0x1b32: 0x1111, 0x1b33: 0x1429, 0x1b34: 0xbba1, 0x1b35: 0xbbb9, + 0x1b36: 0xbbd1, 0x1b37: 0x10e1, 0x1b38: 0x10f9, 0x1b39: 0xbbe9, 0x1b3a: 0x2079, 0x1b3b: 0xbc01, + 0x1b3c: 0xbab1, 0x1b3d: 0x1099, 0x1b3e: 0x10b1, 0x1b3f: 0x10c9, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0xbac9, 0x1b41: 0xbae1, 0x1b42: 0xbaf9, 0x1b43: 0x1429, 0x1b44: 0x1a31, 0x1b45: 0xbb11, + 0x1b46: 0xbb29, 0x1b47: 0xbb41, 0x1b48: 0xbb59, 0x1b49: 0xbb71, 0x1b4a: 0xbb89, 0x1b4b: 0x2109, + 0x1b4c: 0x1111, 0x1b4d: 0xbba1, 0x1b4e: 0xbba1, 0x1b4f: 0xbbb9, 0x1b50: 0xbbd1, 0x1b51: 0x10e1, + 0x1b52: 0x10f9, 0x1b53: 0xbbe9, 0x1b54: 0x2079, 0x1b55: 0xbc21, 0x1b56: 0xbac9, 0x1b57: 0x1429, + 0x1b58: 0xbb11, 0x1b59: 0x10e1, 0x1b5a: 0x1111, 0x1b5b: 0x2109, 0x1b5c: 0xbab1, 0x1b5d: 0x1099, + 0x1b5e: 0x10b1, 0x1b5f: 0x10c9, 0x1b60: 0xbac9, 0x1b61: 0xbae1, 0x1b62: 0xbaf9, 0x1b63: 0x1429, + 0x1b64: 0x1a31, 0x1b65: 0xbb11, 0x1b66: 0xbb29, 0x1b67: 0xbb41, 0x1b68: 0xbb59, 0x1b69: 0xbb71, + 0x1b6a: 0xbb89, 0x1b6b: 0x2109, 0x1b6c: 0x1111, 0x1b6d: 0x1429, 0x1b6e: 0xbba1, 0x1b6f: 0xbbb9, + 0x1b70: 0xbbd1, 0x1b71: 0x10e1, 0x1b72: 0x10f9, 0x1b73: 0xbbe9, 0x1b74: 0x2079, 0x1b75: 0xbc01, + 0x1b76: 0xbab1, 0x1b77: 0x1099, 0x1b78: 0x10b1, 0x1b79: 0x10c9, 0x1b7a: 0xbac9, 0x1b7b: 0xbae1, + 0x1b7c: 0xbaf9, 0x1b7d: 0x1429, 0x1b7e: 0x1a31, 0x1b7f: 0xbb11, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0xbb29, 0x1b81: 0xbb41, 0x1b82: 0xbb59, 0x1b83: 0xbb71, 0x1b84: 0xbb89, 0x1b85: 0x2109, + 0x1b86: 0x1111, 0x1b87: 0xbba1, 0x1b88: 0xbba1, 0x1b89: 0xbbb9, 0x1b8a: 0xbbd1, 0x1b8b: 0x10e1, + 0x1b8c: 0x10f9, 0x1b8d: 0xbbe9, 0x1b8e: 0x2079, 0x1b8f: 0xbc21, 0x1b90: 0xbac9, 0x1b91: 0x1429, + 0x1b92: 0xbb11, 0x1b93: 0x10e1, 0x1b94: 0x1111, 0x1b95: 0x2109, 0x1b96: 0xbab1, 0x1b97: 0x1099, + 0x1b98: 0x10b1, 0x1b99: 0x10c9, 0x1b9a: 0xbac9, 0x1b9b: 0xbae1, 0x1b9c: 0xbaf9, 0x1b9d: 0x1429, + 0x1b9e: 0x1a31, 0x1b9f: 0xbb11, 0x1ba0: 0xbb29, 0x1ba1: 0xbb41, 0x1ba2: 0xbb59, 0x1ba3: 0xbb71, + 0x1ba4: 0xbb89, 0x1ba5: 0x2109, 0x1ba6: 0x1111, 0x1ba7: 0x1429, 0x1ba8: 0xbba1, 0x1ba9: 0xbbb9, + 0x1baa: 0xbbd1, 0x1bab: 0x10e1, 0x1bac: 0x10f9, 0x1bad: 0xbbe9, 0x1bae: 0x2079, 0x1baf: 0xbc01, + 0x1bb0: 0xbab1, 0x1bb1: 0x1099, 0x1bb2: 0x10b1, 0x1bb3: 0x10c9, 0x1bb4: 0xbac9, 0x1bb5: 0xbae1, + 0x1bb6: 0xbaf9, 0x1bb7: 0x1429, 0x1bb8: 0x1a31, 0x1bb9: 0xbb11, 0x1bba: 0xbb29, 0x1bbb: 0xbb41, + 0x1bbc: 0xbb59, 0x1bbd: 0xbb71, 0x1bbe: 0xbb89, 0x1bbf: 0x2109, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x1111, 0x1bc1: 0xbba1, 0x1bc2: 0xbba1, 0x1bc3: 0xbbb9, 0x1bc4: 0xbbd1, 0x1bc5: 0x10e1, + 0x1bc6: 0x10f9, 0x1bc7: 0xbbe9, 0x1bc8: 0x2079, 0x1bc9: 0xbc21, 0x1bca: 0xbac9, 0x1bcb: 0x1429, + 0x1bcc: 0xbb11, 0x1bcd: 0x10e1, 0x1bce: 0x1111, 0x1bcf: 0x2109, 0x1bd0: 0xbab1, 0x1bd1: 0x1099, + 0x1bd2: 0x10b1, 0x1bd3: 0x10c9, 0x1bd4: 0xbac9, 0x1bd5: 0xbae1, 0x1bd6: 0xbaf9, 0x1bd7: 0x1429, + 0x1bd8: 0x1a31, 0x1bd9: 0xbb11, 0x1bda: 0xbb29, 0x1bdb: 0xbb41, 0x1bdc: 0xbb59, 0x1bdd: 0xbb71, + 0x1bde: 0xbb89, 0x1bdf: 0x2109, 0x1be0: 0x1111, 0x1be1: 0x1429, 0x1be2: 0xbba1, 0x1be3: 0xbbb9, + 0x1be4: 0xbbd1, 0x1be5: 0x10e1, 0x1be6: 0x10f9, 0x1be7: 0xbbe9, 0x1be8: 0x2079, 0x1be9: 0xbc01, + 0x1bea: 0xbab1, 0x1beb: 0x1099, 0x1bec: 0x10b1, 0x1bed: 0x10c9, 0x1bee: 0xbac9, 0x1bef: 0xbae1, + 0x1bf0: 0xbaf9, 0x1bf1: 0x1429, 0x1bf2: 0x1a31, 0x1bf3: 0xbb11, 0x1bf4: 0xbb29, 0x1bf5: 0xbb41, + 0x1bf6: 0xbb59, 0x1bf7: 0xbb71, 0x1bf8: 0xbb89, 0x1bf9: 0x2109, 0x1bfa: 0x1111, 0x1bfb: 0xbba1, + 0x1bfc: 0xbba1, 0x1bfd: 0xbbb9, 0x1bfe: 0xbbd1, 0x1bff: 0x10e1, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x10f9, 0x1c01: 0xbbe9, 0x1c02: 0x2079, 0x1c03: 0xbc21, 0x1c04: 0xbac9, 0x1c05: 0x1429, + 0x1c06: 0xbb11, 0x1c07: 0x10e1, 0x1c08: 0x1111, 0x1c09: 0x2109, 0x1c0a: 0xbc41, 0x1c0b: 0xbc41, + 0x1c0c: 0x0040, 0x1c0d: 0x0040, 0x1c0e: 0x1f41, 0x1c0f: 0x00c9, 0x1c10: 0x0069, 0x1c11: 0x0079, + 0x1c12: 0x1f51, 0x1c13: 0x1f61, 0x1c14: 0x1f71, 0x1c15: 0x1f81, 0x1c16: 0x1f91, 0x1c17: 0x1fa1, + 0x1c18: 0x1f41, 0x1c19: 0x00c9, 0x1c1a: 0x0069, 0x1c1b: 0x0079, 0x1c1c: 0x1f51, 0x1c1d: 0x1f61, + 0x1c1e: 0x1f71, 0x1c1f: 0x1f81, 0x1c20: 0x1f91, 0x1c21: 0x1fa1, 0x1c22: 0x1f41, 0x1c23: 0x00c9, + 0x1c24: 0x0069, 0x1c25: 0x0079, 0x1c26: 0x1f51, 0x1c27: 0x1f61, 0x1c28: 0x1f71, 0x1c29: 0x1f81, + 0x1c2a: 0x1f91, 0x1c2b: 0x1fa1, 0x1c2c: 0x1f41, 0x1c2d: 0x00c9, 0x1c2e: 0x0069, 0x1c2f: 0x0079, + 0x1c30: 0x1f51, 0x1c31: 0x1f61, 0x1c32: 0x1f71, 0x1c33: 0x1f81, 0x1c34: 0x1f91, 0x1c35: 0x1fa1, + 0x1c36: 0x1f41, 0x1c37: 0x00c9, 0x1c38: 0x0069, 0x1c39: 0x0079, 0x1c3a: 0x1f51, 0x1c3b: 0x1f61, + 0x1c3c: 0x1f71, 0x1c3d: 0x1f81, 0x1c3e: 0x1f91, 0x1c3f: 0x1fa1, + // Block 0x71, offset 0x1c40 + 0x1c40: 0xe115, 0x1c41: 0xe115, 0x1c42: 0xe135, 0x1c43: 0xe135, 0x1c44: 0xe115, 0x1c45: 0xe115, + 0x1c46: 0xe175, 0x1c47: 0xe175, 0x1c48: 0xe115, 0x1c49: 0xe115, 0x1c4a: 0xe135, 0x1c4b: 0xe135, + 0x1c4c: 0xe115, 0x1c4d: 0xe115, 0x1c4e: 0xe1f5, 0x1c4f: 0xe1f5, 0x1c50: 0xe115, 0x1c51: 0xe115, + 0x1c52: 0xe135, 0x1c53: 0xe135, 0x1c54: 0xe115, 0x1c55: 0xe115, 0x1c56: 0xe175, 0x1c57: 0xe175, + 0x1c58: 0xe115, 0x1c59: 0xe115, 0x1c5a: 0xe135, 0x1c5b: 0xe135, 0x1c5c: 0xe115, 0x1c5d: 0xe115, + 0x1c5e: 0x8b05, 0x1c5f: 0x8b05, 0x1c60: 0x04b5, 0x1c61: 0x04b5, 0x1c62: 0x0a08, 0x1c63: 0x0a08, + 0x1c64: 0x0a08, 0x1c65: 0x0a08, 0x1c66: 0x0a08, 0x1c67: 0x0a08, 0x1c68: 0x0a08, 0x1c69: 0x0a08, + 0x1c6a: 0x0a08, 0x1c6b: 0x0a08, 0x1c6c: 0x0a08, 0x1c6d: 0x0a08, 0x1c6e: 0x0a08, 0x1c6f: 0x0a08, + 0x1c70: 0x0a08, 0x1c71: 0x0a08, 0x1c72: 0x0a08, 0x1c73: 0x0a08, 0x1c74: 0x0a08, 0x1c75: 0x0a08, + 0x1c76: 0x0a08, 0x1c77: 0x0a08, 0x1c78: 0x0a08, 0x1c79: 0x0a08, 0x1c7a: 0x0a08, 0x1c7b: 0x0a08, + 0x1c7c: 0x0a08, 0x1c7d: 0x0a08, 0x1c7e: 0x0a08, 0x1c7f: 0x0a08, + // Block 0x72, offset 0x1c80 + 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0x0040, 0x1c85: 0xb411, + 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0xb399, 0x1c8b: 0xb3b1, + 0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9, + 0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231, + 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0xbc59, 0x1c9d: 0x7949, + 0x1c9e: 0xbc71, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040, + 0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0x0040, 0x1ca9: 0xb429, + 0x1caa: 0xb399, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339, + 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1, + 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0x0040, 0x1cbb: 0xb351, + 0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0040, 0x1cc1: 0x0040, 0x1cc2: 0xb201, 0x1cc3: 0x0040, 0x1cc4: 0x0040, 0x1cc5: 0x0040, + 0x1cc6: 0x0040, 0x1cc7: 0xb219, 0x1cc8: 0x0040, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1, + 0x1ccc: 0x0040, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0x0040, 0x1cd1: 0xb2d9, + 0x1cd2: 0xb381, 0x1cd3: 0x0040, 0x1cd4: 0xb2c1, 0x1cd5: 0x0040, 0x1cd6: 0x0040, 0x1cd7: 0xb231, + 0x1cd8: 0x0040, 0x1cd9: 0xb2f1, 0x1cda: 0x0040, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x7949, + 0x1cde: 0x0040, 0x1cdf: 0xbc89, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0x0040, + 0x1ce4: 0xb3f9, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429, + 0x1cea: 0xb399, 0x1ceb: 0x0040, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339, + 0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0x0040, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1, + 0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0x0040, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351, + 0x1cfc: 0xbc59, 0x1cfd: 0x0040, 0x1cfe: 0xbc71, 0x1cff: 0x0040, + // Block 0x74, offset 0x1d00 + 0x1d00: 0xb189, 0x1d01: 0xb1a1, 0x1d02: 0xb201, 0x1d03: 0xb249, 0x1d04: 0xb3f9, 0x1d05: 0xb411, + 0x1d06: 0xb291, 0x1d07: 0xb219, 0x1d08: 0xb309, 0x1d09: 0xb429, 0x1d0a: 0x0040, 0x1d0b: 0xb3b1, + 0x1d0c: 0xb3c9, 0x1d0d: 0xb3e1, 0x1d0e: 0xb2a9, 0x1d0f: 0xb339, 0x1d10: 0xb369, 0x1d11: 0xb2d9, + 0x1d12: 0xb381, 0x1d13: 0xb279, 0x1d14: 0xb2c1, 0x1d15: 0xb1d1, 0x1d16: 0xb1e9, 0x1d17: 0xb231, + 0x1d18: 0xb261, 0x1d19: 0xb2f1, 0x1d1a: 0xb321, 0x1d1b: 0xb351, 0x1d1c: 0x0040, 0x1d1d: 0x0040, + 0x1d1e: 0x0040, 0x1d1f: 0x0040, 0x1d20: 0x0040, 0x1d21: 0xb1a1, 0x1d22: 0xb201, 0x1d23: 0xb249, + 0x1d24: 0x0040, 0x1d25: 0xb411, 0x1d26: 0xb291, 0x1d27: 0xb219, 0x1d28: 0xb309, 0x1d29: 0xb429, + 0x1d2a: 0x0040, 0x1d2b: 0xb3b1, 0x1d2c: 0xb3c9, 0x1d2d: 0xb3e1, 0x1d2e: 0xb2a9, 0x1d2f: 0xb339, + 0x1d30: 0xb369, 0x1d31: 0xb2d9, 0x1d32: 0xb381, 0x1d33: 0xb279, 0x1d34: 0xb2c1, 0x1d35: 0xb1d1, + 0x1d36: 0xb1e9, 0x1d37: 0xb231, 0x1d38: 0xb261, 0x1d39: 0xb2f1, 0x1d3a: 0xb321, 0x1d3b: 0xb351, + 0x1d3c: 0x0040, 0x1d3d: 0x0040, 0x1d3e: 0x0040, 0x1d3f: 0x0040, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x0040, 0x1d41: 0xbca2, 0x1d42: 0xbcba, 0x1d43: 0xbcd2, 0x1d44: 0xbcea, 0x1d45: 0xbd02, + 0x1d46: 0xbd1a, 0x1d47: 0xbd32, 0x1d48: 0xbd4a, 0x1d49: 0xbd62, 0x1d4a: 0xbd7a, 0x1d4b: 0x0018, + 0x1d4c: 0x0018, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xbd92, 0x1d51: 0xbdb2, + 0x1d52: 0xbdd2, 0x1d53: 0xbdf2, 0x1d54: 0xbe12, 0x1d55: 0xbe32, 0x1d56: 0xbe52, 0x1d57: 0xbe72, + 0x1d58: 0xbe92, 0x1d59: 0xbeb2, 0x1d5a: 0xbed2, 0x1d5b: 0xbef2, 0x1d5c: 0xbf12, 0x1d5d: 0xbf32, + 0x1d5e: 0xbf52, 0x1d5f: 0xbf72, 0x1d60: 0xbf92, 0x1d61: 0xbfb2, 0x1d62: 0xbfd2, 0x1d63: 0xbff2, + 0x1d64: 0xc012, 0x1d65: 0xc032, 0x1d66: 0xc052, 0x1d67: 0xc072, 0x1d68: 0xc092, 0x1d69: 0xc0b2, + 0x1d6a: 0xc0d1, 0x1d6b: 0x1159, 0x1d6c: 0x0269, 0x1d6d: 0x6671, 0x1d6e: 0xc111, 0x1d6f: 0x0018, + 0x1d70: 0x0039, 0x1d71: 0x0ee9, 0x1d72: 0x1159, 0x1d73: 0x0ef9, 0x1d74: 0x0f09, 0x1d75: 0x1199, + 0x1d76: 0x0f31, 0x1d77: 0x0249, 0x1d78: 0x0f41, 0x1d79: 0x0259, 0x1d7a: 0x0f51, 0x1d7b: 0x0359, + 0x1d7c: 0x0f61, 0x1d7d: 0x0f71, 0x1d7e: 0x00d9, 0x1d7f: 0x0f99, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x2039, 0x1d81: 0x0269, 0x1d82: 0x01d9, 0x1d83: 0x0fa9, 0x1d84: 0x0fb9, 0x1d85: 0x1089, + 0x1d86: 0x0279, 0x1d87: 0x0369, 0x1d88: 0x0289, 0x1d89: 0x13d1, 0x1d8a: 0xc129, 0x1d8b: 0x65b1, + 0x1d8c: 0xc141, 0x1d8d: 0x1441, 0x1d8e: 0xc159, 0x1d8f: 0xc179, 0x1d90: 0x0018, 0x1d91: 0x0018, + 0x1d92: 0x0018, 0x1d93: 0x0018, 0x1d94: 0x0018, 0x1d95: 0x0018, 0x1d96: 0x0018, 0x1d97: 0x0018, + 0x1d98: 0x0018, 0x1d99: 0x0018, 0x1d9a: 0x0018, 0x1d9b: 0x0018, 0x1d9c: 0x0018, 0x1d9d: 0x0018, + 0x1d9e: 0x0018, 0x1d9f: 0x0018, 0x1da0: 0x0018, 0x1da1: 0x0018, 0x1da2: 0x0018, 0x1da3: 0x0018, + 0x1da4: 0x0018, 0x1da5: 0x0018, 0x1da6: 0x0018, 0x1da7: 0x0018, 0x1da8: 0x0018, 0x1da9: 0x0018, + 0x1daa: 0xc191, 0x1dab: 0xc1a9, 0x1dac: 0x0040, 0x1dad: 0x0040, 0x1dae: 0x0040, 0x1daf: 0x0040, + 0x1db0: 0x0018, 0x1db1: 0x0018, 0x1db2: 0x0018, 0x1db3: 0x0018, 0x1db4: 0x0018, 0x1db5: 0x0018, + 0x1db6: 0x0018, 0x1db7: 0x0018, 0x1db8: 0x0018, 0x1db9: 0x0018, 0x1dba: 0x0018, 0x1dbb: 0x0018, + 0x1dbc: 0x0018, 0x1dbd: 0x0018, 0x1dbe: 0x0018, 0x1dbf: 0x0018, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xc1d9, 0x1dc1: 0xc211, 0x1dc2: 0xc249, 0x1dc3: 0x0040, 0x1dc4: 0x0040, 0x1dc5: 0x0040, + 0x1dc6: 0x0040, 0x1dc7: 0x0040, 0x1dc8: 0x0040, 0x1dc9: 0x0040, 0x1dca: 0x0040, 0x1dcb: 0x0040, + 0x1dcc: 0x0040, 0x1dcd: 0x0040, 0x1dce: 0x0040, 0x1dcf: 0x0040, 0x1dd0: 0xc269, 0x1dd1: 0xc289, + 0x1dd2: 0xc2a9, 0x1dd3: 0xc2c9, 0x1dd4: 0xc2e9, 0x1dd5: 0xc309, 0x1dd6: 0xc329, 0x1dd7: 0xc349, + 0x1dd8: 0xc369, 0x1dd9: 0xc389, 0x1dda: 0xc3a9, 0x1ddb: 0xc3c9, 0x1ddc: 0xc3e9, 0x1ddd: 0xc409, + 0x1dde: 0xc429, 0x1ddf: 0xc449, 0x1de0: 0xc469, 0x1de1: 0xc489, 0x1de2: 0xc4a9, 0x1de3: 0xc4c9, + 0x1de4: 0xc4e9, 0x1de5: 0xc509, 0x1de6: 0xc529, 0x1de7: 0xc549, 0x1de8: 0xc569, 0x1de9: 0xc589, + 0x1dea: 0xc5a9, 0x1deb: 0xc5c9, 0x1dec: 0xc5e9, 0x1ded: 0xc609, 0x1dee: 0xc629, 0x1def: 0xc649, + 0x1df0: 0xc669, 0x1df1: 0xc689, 0x1df2: 0xc6a9, 0x1df3: 0xc6c9, 0x1df4: 0xc6e9, 0x1df5: 0xc709, + 0x1df6: 0xc729, 0x1df7: 0xc749, 0x1df8: 0xc769, 0x1df9: 0xc789, 0x1dfa: 0xc7a9, 0x1dfb: 0xc7c9, + 0x1dfc: 0x0040, 0x1dfd: 0x0040, 0x1dfe: 0x0040, 0x1dff: 0x0040, + // Block 0x78, offset 0x1e00 + 0x1e00: 0xcaf9, 0x1e01: 0xcb19, 0x1e02: 0xcb39, 0x1e03: 0x8b1d, 0x1e04: 0xcb59, 0x1e05: 0xcb79, + 0x1e06: 0xcb99, 0x1e07: 0xcbb9, 0x1e08: 0xcbd9, 0x1e09: 0xcbf9, 0x1e0a: 0xcc19, 0x1e0b: 0xcc39, + 0x1e0c: 0xcc59, 0x1e0d: 0x8b3d, 0x1e0e: 0xcc79, 0x1e0f: 0xcc99, 0x1e10: 0xccb9, 0x1e11: 0xccd9, + 0x1e12: 0x8b5d, 0x1e13: 0xccf9, 0x1e14: 0xcd19, 0x1e15: 0xc429, 0x1e16: 0x8b7d, 0x1e17: 0xcd39, + 0x1e18: 0xcd59, 0x1e19: 0xcd79, 0x1e1a: 0xcd99, 0x1e1b: 0xcdb9, 0x1e1c: 0x8b9d, 0x1e1d: 0xcdd9, + 0x1e1e: 0xcdf9, 0x1e1f: 0xce19, 0x1e20: 0xce39, 0x1e21: 0xce59, 0x1e22: 0xc789, 0x1e23: 0xce79, + 0x1e24: 0xce99, 0x1e25: 0xceb9, 0x1e26: 0xced9, 0x1e27: 0xcef9, 0x1e28: 0xcf19, 0x1e29: 0xcf39, + 0x1e2a: 0xcf59, 0x1e2b: 0xcf79, 0x1e2c: 0xcf99, 0x1e2d: 0xcfb9, 0x1e2e: 0xcfd9, 0x1e2f: 0xcff9, + 0x1e30: 0xd019, 0x1e31: 0xd039, 0x1e32: 0xd039, 0x1e33: 0xd039, 0x1e34: 0x8bbd, 0x1e35: 0xd059, + 0x1e36: 0xd079, 0x1e37: 0xd099, 0x1e38: 0x8bdd, 0x1e39: 0xd0b9, 0x1e3a: 0xd0d9, 0x1e3b: 0xd0f9, + 0x1e3c: 0xd119, 0x1e3d: 0xd139, 0x1e3e: 0xd159, 0x1e3f: 0xd179, + // Block 0x79, offset 0x1e40 + 0x1e40: 0xd199, 0x1e41: 0xd1b9, 0x1e42: 0xd1d9, 0x1e43: 0xd1f9, 0x1e44: 0xd219, 0x1e45: 0xd239, + 0x1e46: 0xd239, 0x1e47: 0xd259, 0x1e48: 0xd279, 0x1e49: 0xd299, 0x1e4a: 0xd2b9, 0x1e4b: 0xd2d9, + 0x1e4c: 0xd2f9, 0x1e4d: 0xd319, 0x1e4e: 0xd339, 0x1e4f: 0xd359, 0x1e50: 0xd379, 0x1e51: 0xd399, + 0x1e52: 0xd3b9, 0x1e53: 0xd3d9, 0x1e54: 0xd3f9, 0x1e55: 0xd419, 0x1e56: 0xd439, 0x1e57: 0xd459, + 0x1e58: 0xd479, 0x1e59: 0x8bfd, 0x1e5a: 0xd499, 0x1e5b: 0xd4b9, 0x1e5c: 0xd4d9, 0x1e5d: 0xc309, + 0x1e5e: 0xd4f9, 0x1e5f: 0xd519, 0x1e60: 0x8c1d, 0x1e61: 0x8c3d, 0x1e62: 0xd539, 0x1e63: 0xd559, + 0x1e64: 0xd579, 0x1e65: 0xd599, 0x1e66: 0xd5b9, 0x1e67: 0xd5d9, 0x1e68: 0x2040, 0x1e69: 0xd5f9, + 0x1e6a: 0xd619, 0x1e6b: 0xd619, 0x1e6c: 0x8c5d, 0x1e6d: 0xd639, 0x1e6e: 0xd659, 0x1e6f: 0xd679, + 0x1e70: 0xd699, 0x1e71: 0x8c7d, 0x1e72: 0xd6b9, 0x1e73: 0xd6d9, 0x1e74: 0x2040, 0x1e75: 0xd6f9, + 0x1e76: 0xd719, 0x1e77: 0xd739, 0x1e78: 0xd759, 0x1e79: 0xd779, 0x1e7a: 0xd799, 0x1e7b: 0x8c9d, + 0x1e7c: 0xd7b9, 0x1e7d: 0x8cbd, 0x1e7e: 0xd7d9, 0x1e7f: 0xd7f9, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0xd819, 0x1e81: 0xd839, 0x1e82: 0xd859, 0x1e83: 0xd879, 0x1e84: 0xd899, 0x1e85: 0xd8b9, + 0x1e86: 0xd8d9, 0x1e87: 0xd8f9, 0x1e88: 0xd919, 0x1e89: 0x8cdd, 0x1e8a: 0xd939, 0x1e8b: 0xd959, + 0x1e8c: 0xd979, 0x1e8d: 0xd999, 0x1e8e: 0xd9b9, 0x1e8f: 0x8cfd, 0x1e90: 0xd9d9, 0x1e91: 0x8d1d, + 0x1e92: 0x8d3d, 0x1e93: 0xd9f9, 0x1e94: 0xda19, 0x1e95: 0xda19, 0x1e96: 0xda39, 0x1e97: 0x8d5d, + 0x1e98: 0x8d7d, 0x1e99: 0xda59, 0x1e9a: 0xda79, 0x1e9b: 0xda99, 0x1e9c: 0xdab9, 0x1e9d: 0xdad9, + 0x1e9e: 0xdaf9, 0x1e9f: 0xdb19, 0x1ea0: 0xdb39, 0x1ea1: 0xdb59, 0x1ea2: 0xdb79, 0x1ea3: 0xdb99, + 0x1ea4: 0x8d9d, 0x1ea5: 0xdbb9, 0x1ea6: 0xdbd9, 0x1ea7: 0xdbf9, 0x1ea8: 0xdc19, 0x1ea9: 0xdbf9, + 0x1eaa: 0xdc39, 0x1eab: 0xdc59, 0x1eac: 0xdc79, 0x1ead: 0xdc99, 0x1eae: 0xdcb9, 0x1eaf: 0xdcd9, + 0x1eb0: 0xdcf9, 0x1eb1: 0xdd19, 0x1eb2: 0xdd39, 0x1eb3: 0xdd59, 0x1eb4: 0xdd79, 0x1eb5: 0xdd99, + 0x1eb6: 0xddb9, 0x1eb7: 0xddd9, 0x1eb8: 0x8dbd, 0x1eb9: 0xddf9, 0x1eba: 0xde19, 0x1ebb: 0xde39, + 0x1ebc: 0xde59, 0x1ebd: 0xde79, 0x1ebe: 0x8ddd, 0x1ebf: 0xde99, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0xe599, 0x1ec1: 0xe5b9, 0x1ec2: 0xe5d9, 0x1ec3: 0xe5f9, 0x1ec4: 0xe619, 0x1ec5: 0xe639, + 0x1ec6: 0x8efd, 0x1ec7: 0xe659, 0x1ec8: 0xe679, 0x1ec9: 0xe699, 0x1eca: 0xe6b9, 0x1ecb: 0xe6d9, + 0x1ecc: 0xe6f9, 0x1ecd: 0x8f1d, 0x1ece: 0xe719, 0x1ecf: 0xe739, 0x1ed0: 0x8f3d, 0x1ed1: 0x8f5d, + 0x1ed2: 0xe759, 0x1ed3: 0xe779, 0x1ed4: 0xe799, 0x1ed5: 0xe7b9, 0x1ed6: 0xe7d9, 0x1ed7: 0xe7f9, + 0x1ed8: 0xe819, 0x1ed9: 0xe839, 0x1eda: 0xe859, 0x1edb: 0x8f7d, 0x1edc: 0xe879, 0x1edd: 0x8f9d, + 0x1ede: 0xe899, 0x1edf: 0x2040, 0x1ee0: 0xe8b9, 0x1ee1: 0xe8d9, 0x1ee2: 0xe8f9, 0x1ee3: 0x8fbd, + 0x1ee4: 0xe919, 0x1ee5: 0xe939, 0x1ee6: 0x8fdd, 0x1ee7: 0x8ffd, 0x1ee8: 0xe959, 0x1ee9: 0xe979, + 0x1eea: 0xe999, 0x1eeb: 0xe9b9, 0x1eec: 0xe9d9, 0x1eed: 0xe9d9, 0x1eee: 0xe9f9, 0x1eef: 0xea19, + 0x1ef0: 0xea39, 0x1ef1: 0xea59, 0x1ef2: 0xea79, 0x1ef3: 0xea99, 0x1ef4: 0xeab9, 0x1ef5: 0x901d, + 0x1ef6: 0xead9, 0x1ef7: 0x903d, 0x1ef8: 0xeaf9, 0x1ef9: 0x905d, 0x1efa: 0xeb19, 0x1efb: 0x907d, + 0x1efc: 0x909d, 0x1efd: 0x90bd, 0x1efe: 0xeb39, 0x1eff: 0xeb59, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0xeb79, 0x1f01: 0x90dd, 0x1f02: 0x90fd, 0x1f03: 0x911d, 0x1f04: 0x913d, 0x1f05: 0xeb99, + 0x1f06: 0xebb9, 0x1f07: 0xebb9, 0x1f08: 0xebd9, 0x1f09: 0xebf9, 0x1f0a: 0xec19, 0x1f0b: 0xec39, + 0x1f0c: 0xec59, 0x1f0d: 0x915d, 0x1f0e: 0xec79, 0x1f0f: 0xec99, 0x1f10: 0xecb9, 0x1f11: 0xecd9, + 0x1f12: 0x917d, 0x1f13: 0xecf9, 0x1f14: 0x919d, 0x1f15: 0x91bd, 0x1f16: 0xed19, 0x1f17: 0xed39, + 0x1f18: 0xed59, 0x1f19: 0xed79, 0x1f1a: 0xed99, 0x1f1b: 0xedb9, 0x1f1c: 0x91dd, 0x1f1d: 0x91fd, + 0x1f1e: 0x921d, 0x1f1f: 0x2040, 0x1f20: 0xedd9, 0x1f21: 0x923d, 0x1f22: 0xedf9, 0x1f23: 0xee19, + 0x1f24: 0xee39, 0x1f25: 0x925d, 0x1f26: 0xee59, 0x1f27: 0xee79, 0x1f28: 0xee99, 0x1f29: 0xeeb9, + 0x1f2a: 0xeed9, 0x1f2b: 0x927d, 0x1f2c: 0xeef9, 0x1f2d: 0xef19, 0x1f2e: 0xef39, 0x1f2f: 0xef59, + 0x1f30: 0xef79, 0x1f31: 0xef99, 0x1f32: 0x929d, 0x1f33: 0x92bd, 0x1f34: 0xefb9, 0x1f35: 0x92dd, + 0x1f36: 0xefd9, 0x1f37: 0x92fd, 0x1f38: 0xeff9, 0x1f39: 0xf019, 0x1f3a: 0xf039, 0x1f3b: 0x931d, + 0x1f3c: 0x933d, 0x1f3d: 0xf059, 0x1f3e: 0x935d, 0x1f3f: 0xf079, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0xf6b9, 0x1f41: 0xf6d9, 0x1f42: 0xf6f9, 0x1f43: 0xf719, 0x1f44: 0xf739, 0x1f45: 0x951d, + 0x1f46: 0xf759, 0x1f47: 0xf779, 0x1f48: 0xf799, 0x1f49: 0xf7b9, 0x1f4a: 0xf7d9, 0x1f4b: 0x953d, + 0x1f4c: 0x955d, 0x1f4d: 0xf7f9, 0x1f4e: 0xf819, 0x1f4f: 0xf839, 0x1f50: 0xf859, 0x1f51: 0xf879, + 0x1f52: 0xf899, 0x1f53: 0x957d, 0x1f54: 0xf8b9, 0x1f55: 0xf8d9, 0x1f56: 0xf8f9, 0x1f57: 0xf919, + 0x1f58: 0x959d, 0x1f59: 0x95bd, 0x1f5a: 0xf939, 0x1f5b: 0xf959, 0x1f5c: 0xf979, 0x1f5d: 0x95dd, + 0x1f5e: 0xf999, 0x1f5f: 0xf9b9, 0x1f60: 0x6815, 0x1f61: 0x95fd, 0x1f62: 0xf9d9, 0x1f63: 0xf9f9, + 0x1f64: 0xfa19, 0x1f65: 0x961d, 0x1f66: 0xfa39, 0x1f67: 0xfa59, 0x1f68: 0xfa79, 0x1f69: 0xfa99, + 0x1f6a: 0xfab9, 0x1f6b: 0xfad9, 0x1f6c: 0xfaf9, 0x1f6d: 0x963d, 0x1f6e: 0xfb19, 0x1f6f: 0xfb39, + 0x1f70: 0xfb59, 0x1f71: 0x965d, 0x1f72: 0xfb79, 0x1f73: 0xfb99, 0x1f74: 0xfbb9, 0x1f75: 0xfbd9, + 0x1f76: 0x7b35, 0x1f77: 0x967d, 0x1f78: 0xfbf9, 0x1f79: 0xfc19, 0x1f7a: 0xfc39, 0x1f7b: 0x969d, + 0x1f7c: 0xfc59, 0x1f7d: 0x96bd, 0x1f7e: 0xfc79, 0x1f7f: 0xfc79, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0xfc99, 0x1f81: 0x96dd, 0x1f82: 0xfcb9, 0x1f83: 0xfcd9, 0x1f84: 0xfcf9, 0x1f85: 0xfd19, + 0x1f86: 0xfd39, 0x1f87: 0xfd59, 0x1f88: 0xfd79, 0x1f89: 0x96fd, 0x1f8a: 0xfd99, 0x1f8b: 0xfdb9, + 0x1f8c: 0xfdd9, 0x1f8d: 0xfdf9, 0x1f8e: 0xfe19, 0x1f8f: 0xfe39, 0x1f90: 0x971d, 0x1f91: 0xfe59, + 0x1f92: 0x973d, 0x1f93: 0x975d, 0x1f94: 0x977d, 0x1f95: 0xfe79, 0x1f96: 0xfe99, 0x1f97: 0xfeb9, + 0x1f98: 0xfed9, 0x1f99: 0xfef9, 0x1f9a: 0xff19, 0x1f9b: 0xff39, 0x1f9c: 0xff59, 0x1f9d: 0x979d, + 0x1f9e: 0x0040, 0x1f9f: 0x0040, 0x1fa0: 0x0040, 0x1fa1: 0x0040, 0x1fa2: 0x0040, 0x1fa3: 0x0040, + 0x1fa4: 0x0040, 0x1fa5: 0x0040, 0x1fa6: 0x0040, 0x1fa7: 0x0040, 0x1fa8: 0x0040, 0x1fa9: 0x0040, + 0x1faa: 0x0040, 0x1fab: 0x0040, 0x1fac: 0x0040, 0x1fad: 0x0040, 0x1fae: 0x0040, 0x1faf: 0x0040, + 0x1fb0: 0x0040, 0x1fb1: 0x0040, 0x1fb2: 0x0040, 0x1fb3: 0x0040, 0x1fb4: 0x0040, 0x1fb5: 0x0040, + 0x1fb6: 0x0040, 0x1fb7: 0x0040, 0x1fb8: 0x0040, 0x1fb9: 0x0040, 0x1fba: 0x0040, 0x1fbb: 0x0040, + 0x1fbc: 0x0040, 0x1fbd: 0x0040, 0x1fbe: 0x0040, 0x1fbf: 0x0040, +} + +// idnaIndex: 36 blocks, 2304 entries, 4608 bytes +// Block 0 is the zero block. +var idnaIndex = [2304]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x7d, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, + 0xc8: 0x06, 0xc9: 0x7e, 0xca: 0x7f, 0xcb: 0x07, 0xcc: 0x80, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, + 0xd0: 0x81, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x82, 0xd6: 0x83, 0xd7: 0x84, + 0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x85, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x86, 0xde: 0x87, 0xdf: 0x88, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, + 0xf0: 0x1d, 0xf1: 0x1e, 0xf2: 0x1e, 0xf3: 0x20, 0xf4: 0x21, + // Block 0x4, offset 0x100 + 0x120: 0x89, 0x121: 0x13, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x14, 0x126: 0x15, 0x127: 0x16, + 0x128: 0x17, 0x129: 0x18, 0x12a: 0x19, 0x12b: 0x1a, 0x12c: 0x1b, 0x12d: 0x1c, 0x12e: 0x1d, 0x12f: 0x8d, + 0x130: 0x8e, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x8f, 0x135: 0x21, 0x136: 0x90, 0x137: 0x91, + 0x138: 0x92, 0x139: 0x93, 0x13a: 0x22, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x23, 0x13e: 0x24, 0x13f: 0x96, + // Block 0x5, offset 0x140 + 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e, + 0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6, + 0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f, + 0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae, + 0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6, + 0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe, + 0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x25, 0x175: 0x26, 0x176: 0x27, 0x177: 0xc3, + 0x178: 0x28, 0x179: 0x28, 0x17a: 0x29, 0x17b: 0x28, 0x17c: 0xc4, 0x17d: 0x2a, 0x17e: 0x2b, 0x17f: 0x2c, + // Block 0x6, offset 0x180 + 0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0xc5, 0x184: 0x30, 0x185: 0x31, 0x186: 0xc6, 0x187: 0x9b, + 0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0x9b, + 0x190: 0xca, 0x191: 0x32, 0x192: 0x33, 0x193: 0x34, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b, + 0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b, + 0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b, + 0x1a8: 0xcb, 0x1a9: 0xcc, 0x1aa: 0x9b, 0x1ab: 0xcd, 0x1ac: 0x9b, 0x1ad: 0xce, 0x1ae: 0xcf, 0x1af: 0xd0, + 0x1b0: 0xd1, 0x1b1: 0x35, 0x1b2: 0x28, 0x1b3: 0x36, 0x1b4: 0xd2, 0x1b5: 0xd3, 0x1b6: 0xd4, 0x1b7: 0xd5, + 0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1, + 0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41, + 0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f, + 0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f, + 0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f, + 0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f, + 0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f, + 0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f, + // Block 0x8, offset 0x200 + 0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f, + 0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f, + 0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f, + 0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f, + 0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f, + 0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f, + 0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b, + 0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f, + // Block 0x9, offset 0x240 + 0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f, + 0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f, + 0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f, + 0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f, + 0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f, + 0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f, + 0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f, + 0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f, + // Block 0xa, offset 0x280 + 0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f, + 0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f, + 0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f, + 0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f, + 0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f, + 0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f, + 0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f, + 0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe3, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f, + 0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f, + 0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f, + 0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8, + 0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0, + 0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8, + 0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f, + 0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f, + // Block 0xc, offset 0x300 + 0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f, + 0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f, + 0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f, + 0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xf9, 0x31f: 0xfa, + // Block 0xd, offset 0x340 + 0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba, + 0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba, + 0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba, + 0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba, + 0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba, + 0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba, + 0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba, + 0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba, + // Block 0xe, offset 0x380 + 0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba, + 0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba, + 0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba, + 0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba, + 0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfb, 0x3a5: 0xfc, 0x3a6: 0xfd, 0x3a7: 0xfe, + 0x3a8: 0x47, 0x3a9: 0xff, 0x3aa: 0x100, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c, + 0x3b0: 0x101, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x102, 0x3b7: 0x52, + 0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x103, 0x3c1: 0x104, 0x3c2: 0x9f, 0x3c3: 0x105, 0x3c4: 0x106, 0x3c5: 0x9b, 0x3c6: 0x107, 0x3c7: 0x108, + 0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x109, 0x3cb: 0x10a, 0x3cc: 0x10b, 0x3cd: 0x10c, 0x3ce: 0x10d, 0x3cf: 0x10e, + 0x3d0: 0x10f, 0x3d1: 0x9f, 0x3d2: 0x110, 0x3d3: 0x111, 0x3d4: 0x112, 0x3d5: 0x113, 0x3d6: 0xba, 0x3d7: 0xba, + 0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x114, 0x3dd: 0x115, 0x3de: 0xba, 0x3df: 0xba, + 0x3e0: 0x116, 0x3e1: 0x117, 0x3e2: 0x118, 0x3e3: 0x119, 0x3e4: 0x11a, 0x3e5: 0xba, 0x3e6: 0x11b, 0x3e7: 0x11c, + 0x3e8: 0x11d, 0x3e9: 0x11e, 0x3ea: 0x11f, 0x3eb: 0x5b, 0x3ec: 0x120, 0x3ed: 0x121, 0x3ee: 0x5c, 0x3ef: 0xba, + 0x3f0: 0x122, 0x3f1: 0x123, 0x3f2: 0x124, 0x3f3: 0x125, 0x3f4: 0x126, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba, + 0x3f8: 0xba, 0x3f9: 0x127, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0x128, 0x3fd: 0x129, 0x3fe: 0xba, 0x3ff: 0xba, + // Block 0x10, offset 0x400 + 0x400: 0x12a, 0x401: 0x12b, 0x402: 0x12c, 0x403: 0x12d, 0x404: 0x12e, 0x405: 0x12f, 0x406: 0x130, 0x407: 0x131, + 0x408: 0x132, 0x409: 0xba, 0x40a: 0x133, 0x40b: 0x134, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xba, 0x40f: 0xba, + 0x410: 0x135, 0x411: 0x136, 0x412: 0x137, 0x413: 0x138, 0x414: 0xba, 0x415: 0xba, 0x416: 0x139, 0x417: 0x13a, + 0x418: 0x13b, 0x419: 0x13c, 0x41a: 0x13d, 0x41b: 0x13e, 0x41c: 0x13f, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba, + 0x420: 0x140, 0x421: 0xba, 0x422: 0x141, 0x423: 0x142, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba, + 0x428: 0x143, 0x429: 0x144, 0x42a: 0x145, 0x42b: 0x146, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba, + 0x430: 0x147, 0x431: 0x148, 0x432: 0x149, 0x433: 0xba, 0x434: 0x14a, 0x435: 0x14b, 0x436: 0x14c, 0x437: 0xba, + 0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0x14d, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba, + // Block 0x11, offset 0x440 + 0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f, + 0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x14e, 0x44f: 0xba, + 0x450: 0x9b, 0x451: 0x14f, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x150, 0x456: 0xba, 0x457: 0xba, + 0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba, + 0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba, + 0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba, + 0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba, + 0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba, + // Block 0x12, offset 0x480 + 0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f, + 0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f, + 0x490: 0x151, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba, + 0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba, + 0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba, + 0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba, + 0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba, + 0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba, + 0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba, + 0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f, + 0x4d8: 0x9f, 0x4d9: 0x152, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba, + 0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba, + 0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba, + 0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba, + 0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba, + // Block 0x14, offset 0x500 + 0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba, + 0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba, + 0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba, + 0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba, + 0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f, + 0x528: 0x146, 0x529: 0x153, 0x52a: 0xba, 0x52b: 0x154, 0x52c: 0x155, 0x52d: 0x156, 0x52e: 0x157, 0x52f: 0xba, + 0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba, + 0x538: 0xba, 0x539: 0x158, 0x53a: 0x159, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x15a, 0x53e: 0x15b, 0x53f: 0x15c, + // Block 0x15, offset 0x540 + 0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f, + 0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f, + 0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f, + 0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x15d, + 0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f, + 0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x15e, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba, + 0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba, + 0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba, + // Block 0x16, offset 0x580 + 0x580: 0x9f, 0x581: 0x9f, 0x582: 0x9f, 0x583: 0x9f, 0x584: 0x15f, 0x585: 0x160, 0x586: 0x9f, 0x587: 0x9f, + 0x588: 0x9f, 0x589: 0x9f, 0x58a: 0x9f, 0x58b: 0x161, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba, + 0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba, + 0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba, + 0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba, + 0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba, + 0x5b0: 0x9f, 0x5b1: 0x162, 0x5b2: 0x163, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba, + 0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x164, 0x5c4: 0x165, 0x5c5: 0x166, 0x5c6: 0x167, 0x5c7: 0x168, + 0x5c8: 0x9b, 0x5c9: 0x169, 0x5ca: 0xba, 0x5cb: 0x16a, 0x5cc: 0x9b, 0x5cd: 0x16b, 0x5ce: 0xba, 0x5cf: 0xba, + 0x5d0: 0x5f, 0x5d1: 0x60, 0x5d2: 0x61, 0x5d3: 0x62, 0x5d4: 0x63, 0x5d5: 0x64, 0x5d6: 0x65, 0x5d7: 0x66, + 0x5d8: 0x67, 0x5d9: 0x68, 0x5da: 0x69, 0x5db: 0x6a, 0x5dc: 0x6b, 0x5dd: 0x6c, 0x5de: 0x6d, 0x5df: 0x6e, + 0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b, + 0x5e8: 0x16c, 0x5e9: 0x16d, 0x5ea: 0x16e, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba, + 0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba, + 0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba, + // Block 0x18, offset 0x600 + 0x600: 0x16f, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba, + 0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba, + 0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba, + 0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba, + 0x620: 0x122, 0x621: 0x122, 0x622: 0x122, 0x623: 0x170, 0x624: 0x6f, 0x625: 0x171, 0x626: 0xba, 0x627: 0xba, + 0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba, + 0x630: 0xba, 0x631: 0x172, 0x632: 0x173, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba, + 0x638: 0x70, 0x639: 0x71, 0x63a: 0x72, 0x63b: 0x174, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba, + // Block 0x19, offset 0x640 + 0x640: 0x175, 0x641: 0x9b, 0x642: 0x176, 0x643: 0x177, 0x644: 0x73, 0x645: 0x74, 0x646: 0x178, 0x647: 0x179, + 0x648: 0x75, 0x649: 0x17a, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b, + 0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b, + 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x17b, 0x65c: 0x9b, 0x65d: 0x17c, 0x65e: 0x9b, 0x65f: 0x17d, + 0x660: 0x17e, 0x661: 0x17f, 0x662: 0x180, 0x663: 0xba, 0x664: 0x181, 0x665: 0x182, 0x666: 0x183, 0x667: 0x184, + 0x668: 0xba, 0x669: 0x185, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba, + 0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba, + 0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba, + // Block 0x1a, offset 0x680 + 0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f, + 0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f, + 0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f, + 0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x186, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f, + 0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f, + 0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f, + 0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f, + 0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f, + 0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f, + 0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f, + 0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x187, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f, + 0x6e0: 0x188, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f, + 0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f, + 0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f, + 0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f, + // Block 0x1c, offset 0x700 + 0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f, + 0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f, + 0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f, + 0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f, + 0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f, + 0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f, + 0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f, + 0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x189, 0x73b: 0x9f, 0x73c: 0x9f, 0x73d: 0x9f, 0x73e: 0x9f, 0x73f: 0x9f, + // Block 0x1d, offset 0x740 + 0x740: 0x9f, 0x741: 0x9f, 0x742: 0x9f, 0x743: 0x9f, 0x744: 0x9f, 0x745: 0x9f, 0x746: 0x9f, 0x747: 0x9f, + 0x748: 0x9f, 0x749: 0x9f, 0x74a: 0x9f, 0x74b: 0x9f, 0x74c: 0x9f, 0x74d: 0x9f, 0x74e: 0x9f, 0x74f: 0x9f, + 0x750: 0x9f, 0x751: 0x9f, 0x752: 0x9f, 0x753: 0x9f, 0x754: 0x9f, 0x755: 0x9f, 0x756: 0x9f, 0x757: 0x9f, + 0x758: 0x9f, 0x759: 0x9f, 0x75a: 0x9f, 0x75b: 0x9f, 0x75c: 0x9f, 0x75d: 0x9f, 0x75e: 0x9f, 0x75f: 0x9f, + 0x760: 0x9f, 0x761: 0x9f, 0x762: 0x9f, 0x763: 0x9f, 0x764: 0x9f, 0x765: 0x9f, 0x766: 0x9f, 0x767: 0x9f, + 0x768: 0x9f, 0x769: 0x9f, 0x76a: 0x9f, 0x76b: 0x9f, 0x76c: 0x9f, 0x76d: 0x9f, 0x76e: 0x9f, 0x76f: 0x18a, + 0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba, + 0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba, + // Block 0x1e, offset 0x780 + 0x780: 0xba, 0x781: 0xba, 0x782: 0xba, 0x783: 0xba, 0x784: 0xba, 0x785: 0xba, 0x786: 0xba, 0x787: 0xba, + 0x788: 0xba, 0x789: 0xba, 0x78a: 0xba, 0x78b: 0xba, 0x78c: 0xba, 0x78d: 0xba, 0x78e: 0xba, 0x78f: 0xba, + 0x790: 0xba, 0x791: 0xba, 0x792: 0xba, 0x793: 0xba, 0x794: 0xba, 0x795: 0xba, 0x796: 0xba, 0x797: 0xba, + 0x798: 0xba, 0x799: 0xba, 0x79a: 0xba, 0x79b: 0xba, 0x79c: 0xba, 0x79d: 0xba, 0x79e: 0xba, 0x79f: 0xba, + 0x7a0: 0x76, 0x7a1: 0x77, 0x7a2: 0x78, 0x7a3: 0x18b, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x18c, 0x7a7: 0x7b, + 0x7a8: 0x7c, 0x7a9: 0xba, 0x7aa: 0xba, 0x7ab: 0xba, 0x7ac: 0xba, 0x7ad: 0xba, 0x7ae: 0xba, 0x7af: 0xba, + 0x7b0: 0xba, 0x7b1: 0xba, 0x7b2: 0xba, 0x7b3: 0xba, 0x7b4: 0xba, 0x7b5: 0xba, 0x7b6: 0xba, 0x7b7: 0xba, + 0x7b8: 0xba, 0x7b9: 0xba, 0x7ba: 0xba, 0x7bb: 0xba, 0x7bc: 0xba, 0x7bd: 0xba, 0x7be: 0xba, 0x7bf: 0xba, + // Block 0x1f, offset 0x7c0 + 0x7d0: 0x0d, 0x7d1: 0x0e, 0x7d2: 0x0f, 0x7d3: 0x10, 0x7d4: 0x11, 0x7d5: 0x0b, 0x7d6: 0x12, 0x7d7: 0x07, + 0x7d8: 0x13, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x14, 0x7dc: 0x0b, 0x7dd: 0x15, 0x7de: 0x16, 0x7df: 0x17, + 0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07, + 0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x18, 0x7eb: 0x19, 0x7ec: 0x1a, 0x7ed: 0x07, 0x7ee: 0x1b, 0x7ef: 0x1c, + 0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b, + 0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b, + // Block 0x20, offset 0x800 + 0x800: 0x0b, 0x801: 0x0b, 0x802: 0x0b, 0x803: 0x0b, 0x804: 0x0b, 0x805: 0x0b, 0x806: 0x0b, 0x807: 0x0b, + 0x808: 0x0b, 0x809: 0x0b, 0x80a: 0x0b, 0x80b: 0x0b, 0x80c: 0x0b, 0x80d: 0x0b, 0x80e: 0x0b, 0x80f: 0x0b, + 0x810: 0x0b, 0x811: 0x0b, 0x812: 0x0b, 0x813: 0x0b, 0x814: 0x0b, 0x815: 0x0b, 0x816: 0x0b, 0x817: 0x0b, + 0x818: 0x0b, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x0b, 0x81c: 0x0b, 0x81d: 0x0b, 0x81e: 0x0b, 0x81f: 0x0b, + 0x820: 0x0b, 0x821: 0x0b, 0x822: 0x0b, 0x823: 0x0b, 0x824: 0x0b, 0x825: 0x0b, 0x826: 0x0b, 0x827: 0x0b, + 0x828: 0x0b, 0x829: 0x0b, 0x82a: 0x0b, 0x82b: 0x0b, 0x82c: 0x0b, 0x82d: 0x0b, 0x82e: 0x0b, 0x82f: 0x0b, + 0x830: 0x0b, 0x831: 0x0b, 0x832: 0x0b, 0x833: 0x0b, 0x834: 0x0b, 0x835: 0x0b, 0x836: 0x0b, 0x837: 0x0b, + 0x838: 0x0b, 0x839: 0x0b, 0x83a: 0x0b, 0x83b: 0x0b, 0x83c: 0x0b, 0x83d: 0x0b, 0x83e: 0x0b, 0x83f: 0x0b, + // Block 0x21, offset 0x840 + 0x840: 0x18d, 0x841: 0x18e, 0x842: 0xba, 0x843: 0xba, 0x844: 0x18f, 0x845: 0x18f, 0x846: 0x18f, 0x847: 0x190, + 0x848: 0xba, 0x849: 0xba, 0x84a: 0xba, 0x84b: 0xba, 0x84c: 0xba, 0x84d: 0xba, 0x84e: 0xba, 0x84f: 0xba, + 0x850: 0xba, 0x851: 0xba, 0x852: 0xba, 0x853: 0xba, 0x854: 0xba, 0x855: 0xba, 0x856: 0xba, 0x857: 0xba, + 0x858: 0xba, 0x859: 0xba, 0x85a: 0xba, 0x85b: 0xba, 0x85c: 0xba, 0x85d: 0xba, 0x85e: 0xba, 0x85f: 0xba, + 0x860: 0xba, 0x861: 0xba, 0x862: 0xba, 0x863: 0xba, 0x864: 0xba, 0x865: 0xba, 0x866: 0xba, 0x867: 0xba, + 0x868: 0xba, 0x869: 0xba, 0x86a: 0xba, 0x86b: 0xba, 0x86c: 0xba, 0x86d: 0xba, 0x86e: 0xba, 0x86f: 0xba, + 0x870: 0xba, 0x871: 0xba, 0x872: 0xba, 0x873: 0xba, 0x874: 0xba, 0x875: 0xba, 0x876: 0xba, 0x877: 0xba, + 0x878: 0xba, 0x879: 0xba, 0x87a: 0xba, 0x87b: 0xba, 0x87c: 0xba, 0x87d: 0xba, 0x87e: 0xba, 0x87f: 0xba, + // Block 0x22, offset 0x880 + 0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b, + 0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b, + 0x890: 0x0b, 0x891: 0x0b, 0x892: 0x0b, 0x893: 0x0b, 0x894: 0x0b, 0x895: 0x0b, 0x896: 0x0b, 0x897: 0x0b, + 0x898: 0x0b, 0x899: 0x0b, 0x89a: 0x0b, 0x89b: 0x0b, 0x89c: 0x0b, 0x89d: 0x0b, 0x89e: 0x0b, 0x89f: 0x0b, + 0x8a0: 0x1f, 0x8a1: 0x0b, 0x8a2: 0x0b, 0x8a3: 0x0b, 0x8a4: 0x0b, 0x8a5: 0x0b, 0x8a6: 0x0b, 0x8a7: 0x0b, + 0x8a8: 0x0b, 0x8a9: 0x0b, 0x8aa: 0x0b, 0x8ab: 0x0b, 0x8ac: 0x0b, 0x8ad: 0x0b, 0x8ae: 0x0b, 0x8af: 0x0b, + 0x8b0: 0x0b, 0x8b1: 0x0b, 0x8b2: 0x0b, 0x8b3: 0x0b, 0x8b4: 0x0b, 0x8b5: 0x0b, 0x8b6: 0x0b, 0x8b7: 0x0b, + 0x8b8: 0x0b, 0x8b9: 0x0b, 0x8ba: 0x0b, 0x8bb: 0x0b, 0x8bc: 0x0b, 0x8bd: 0x0b, 0x8be: 0x0b, 0x8bf: 0x0b, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b, + 0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b, +} + +// idnaSparseOffset: 276 entries, 552 bytes +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x86, 0x8b, 0x94, 0xa4, 0xb2, 0xbe, 0xca, 0xdb, 0xe5, 0xec, 0xf9, 0x10a, 0x111, 0x11c, 0x12b, 0x139, 0x143, 0x145, 0x14a, 0x14d, 0x150, 0x152, 0x15e, 0x169, 0x171, 0x177, 0x17d, 0x182, 0x187, 0x18a, 0x18e, 0x194, 0x199, 0x1a5, 0x1af, 0x1b5, 0x1c6, 0x1d0, 0x1d3, 0x1db, 0x1de, 0x1eb, 0x1f3, 0x1f7, 0x1fe, 0x206, 0x216, 0x222, 0x224, 0x22e, 0x23a, 0x246, 0x252, 0x25a, 0x25f, 0x269, 0x27a, 0x27e, 0x289, 0x28d, 0x296, 0x29e, 0x2a4, 0x2a9, 0x2ac, 0x2b0, 0x2b6, 0x2ba, 0x2be, 0x2c2, 0x2c7, 0x2cd, 0x2d5, 0x2dc, 0x2e7, 0x2f1, 0x2f5, 0x2f8, 0x2fe, 0x302, 0x304, 0x307, 0x309, 0x30c, 0x316, 0x319, 0x328, 0x32c, 0x331, 0x334, 0x338, 0x33d, 0x342, 0x348, 0x34e, 0x35d, 0x363, 0x367, 0x376, 0x37b, 0x383, 0x38d, 0x398, 0x3a0, 0x3b1, 0x3ba, 0x3ca, 0x3d7, 0x3e1, 0x3e6, 0x3f3, 0x3f7, 0x3fc, 0x3fe, 0x402, 0x404, 0x408, 0x411, 0x417, 0x41b, 0x42b, 0x435, 0x43a, 0x43d, 0x443, 0x44a, 0x44f, 0x453, 0x459, 0x45e, 0x467, 0x46c, 0x472, 0x479, 0x480, 0x487, 0x48b, 0x490, 0x493, 0x498, 0x4a4, 0x4aa, 0x4af, 0x4b6, 0x4be, 0x4c3, 0x4c7, 0x4d7, 0x4de, 0x4e2, 0x4e6, 0x4ed, 0x4ef, 0x4f2, 0x4f5, 0x4f9, 0x502, 0x506, 0x50e, 0x516, 0x51c, 0x525, 0x531, 0x538, 0x541, 0x54b, 0x552, 0x560, 0x56d, 0x57a, 0x583, 0x587, 0x596, 0x59e, 0x5a9, 0x5b2, 0x5b8, 0x5c0, 0x5c9, 0x5d3, 0x5d6, 0x5e2, 0x5eb, 0x5ee, 0x5f3, 0x5fe, 0x607, 0x613, 0x616, 0x620, 0x629, 0x635, 0x642, 0x64f, 0x65d, 0x664, 0x667, 0x66c, 0x66f, 0x672, 0x675, 0x67c, 0x683, 0x687, 0x692, 0x695, 0x698, 0x69b, 0x6a1, 0x6a6, 0x6aa, 0x6ad, 0x6b0, 0x6b3, 0x6b6, 0x6b9, 0x6be, 0x6c8, 0x6cb, 0x6cf, 0x6de, 0x6ea, 0x6ee, 0x6f3, 0x6f7, 0x6fc, 0x700, 0x705, 0x70e, 0x719, 0x71f, 0x727, 0x72a, 0x72d, 0x731, 0x735, 0x73b, 0x741, 0x746, 0x749, 0x759, 0x760, 0x763, 0x766, 0x76a, 0x770, 0x775, 0x77a, 0x782, 0x787, 0x78b, 0x78f, 0x792, 0x795, 0x799, 0x79d, 0x7a0, 0x7b0, 0x7c1, 0x7c6, 0x7c8, 0x7ca} + +// idnaSparseValues: 1997 entries, 7988 bytes +var idnaSparseValues = [1997]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x07}, + {value: 0xe105, lo: 0x80, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0x97}, + {value: 0xe105, lo: 0x98, hi: 0x9e}, + {value: 0x001f, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbf}, + // Block 0x1, offset 0x8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0xe01d, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0335, lo: 0x83, hi: 0x83}, + {value: 0x034d, lo: 0x84, hi: 0x84}, + {value: 0x0365, lo: 0x85, hi: 0x85}, + {value: 0xe00d, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0xe00d, lo: 0x88, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x89}, + {value: 0xe00d, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe00d, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0x8d}, + {value: 0xe00d, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0xbf}, + // Block 0x2, offset 0x19 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0249, lo: 0xb0, hi: 0xb0}, + {value: 0x037d, lo: 0xb1, hi: 0xb1}, + {value: 0x0259, lo: 0xb2, hi: 0xb2}, + {value: 0x0269, lo: 0xb3, hi: 0xb3}, + {value: 0x034d, lo: 0xb4, hi: 0xb4}, + {value: 0x0395, lo: 0xb5, hi: 0xb5}, + {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, + {value: 0x0279, lo: 0xb7, hi: 0xb7}, + {value: 0x0289, lo: 0xb8, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbf}, + // Block 0x3, offset 0x25 + {value: 0x0000, lo: 0x01}, + {value: 0x3308, lo: 0x80, hi: 0xbf}, + // Block 0x4, offset 0x27 + {value: 0x0000, lo: 0x04}, + {value: 0x03f5, lo: 0x80, hi: 0x8f}, + {value: 0xe105, lo: 0x90, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x5, offset 0x2c + {value: 0x0000, lo: 0x06}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x0545, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x0008, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x6, offset 0x33 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0401, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0018, lo: 0x89, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x7, offset 0x3e + {value: 0x0000, lo: 0x0b}, + {value: 0x0818, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x82}, + {value: 0x0818, lo: 0x83, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x85}, + {value: 0x0818, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xae}, + {value: 0x0808, lo: 0xaf, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x8, offset 0x4a + {value: 0x0000, lo: 0x03}, + {value: 0x0a08, lo: 0x80, hi: 0x87}, + {value: 0x0c08, lo: 0x88, hi: 0x99}, + {value: 0x0a08, lo: 0x9a, hi: 0xbf}, + // Block 0x9, offset 0x4e + {value: 0x0000, lo: 0x0e}, + {value: 0x3308, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0c08, lo: 0x8d, hi: 0x8d}, + {value: 0x0a08, lo: 0x8e, hi: 0x98}, + {value: 0x0c08, lo: 0x99, hi: 0x9b}, + {value: 0x0a08, lo: 0x9c, hi: 0xaa}, + {value: 0x0c08, lo: 0xab, hi: 0xac}, + {value: 0x0a08, lo: 0xad, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb1}, + {value: 0x0a08, lo: 0xb2, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb4}, + {value: 0x0a08, lo: 0xb5, hi: 0xb7}, + {value: 0x0c08, lo: 0xb8, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbf}, + // Block 0xa, offset 0x5d + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xb0}, + {value: 0x0808, lo: 0xb1, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xb, offset 0x62 + {value: 0x0000, lo: 0x09}, + {value: 0x0808, lo: 0x80, hi: 0x89}, + {value: 0x0a08, lo: 0x8a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbf}, + // Block 0xc, offset 0x6c + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x99}, + {value: 0x0808, lo: 0x9a, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa3}, + {value: 0x0808, lo: 0xa4, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa7}, + {value: 0x0808, lo: 0xa8, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0818, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd, offset 0x78 + {value: 0x0000, lo: 0x0d}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0a08, lo: 0xa0, hi: 0xa9}, + {value: 0x0c08, lo: 0xaa, hi: 0xac}, + {value: 0x0808, lo: 0xad, hi: 0xad}, + {value: 0x0c08, lo: 0xae, hi: 0xae}, + {value: 0x0a08, lo: 0xaf, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb2}, + {value: 0x0a08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0a08, lo: 0xb6, hi: 0xb8}, + {value: 0x0c08, lo: 0xb9, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0xe, offset 0x86 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x92}, + {value: 0x3308, lo: 0x93, hi: 0xa1}, + {value: 0x0840, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xbf}, + // Block 0xf, offset 0x8b + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x10, offset 0x94 + {value: 0x0000, lo: 0x0f}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x85}, + {value: 0x3008, lo: 0x86, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8c}, + {value: 0x3b08, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x11, offset 0xa4 + {value: 0x0000, lo: 0x0d}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x12, offset 0xb2 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xba}, + {value: 0x3b08, lo: 0xbb, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x13, offset 0xbe + {value: 0x0000, lo: 0x0b}, + {value: 0x0040, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x14, offset 0xca + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x89}, + {value: 0x3b08, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x3008, lo: 0x98, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x15, offset 0xdb + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x08f1, lo: 0xb3, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb9}, + {value: 0x3b08, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x16, offset 0xe5 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0xbf}, + // Block 0x17, offset 0xec + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0961, lo: 0x9c, hi: 0x9c}, + {value: 0x0999, lo: 0x9d, hi: 0x9d}, + {value: 0x0008, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x18, offset 0xf9 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe03d, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x19, offset 0x10a + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0x1a, offset 0x111 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x1b, offset 0x11c + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x3008, lo: 0xa2, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbf}, + // Block 0x1c, offset 0x12b + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x8c}, + {value: 0x3308, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x3008, lo: 0x9a, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1d, offset 0x139 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x86}, + {value: 0x055d, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8c}, + {value: 0x055d, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0xe105, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0x1e, offset 0x143 + {value: 0x0000, lo: 0x01}, + {value: 0x0018, lo: 0x80, hi: 0xbf}, + // Block 0x1f, offset 0x145 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa0}, + {value: 0x2018, lo: 0xa1, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x20, offset 0x14a + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa7}, + {value: 0x2018, lo: 0xa8, hi: 0xbf}, + // Block 0x21, offset 0x14d + {value: 0x0000, lo: 0x02}, + {value: 0x2018, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0xbf}, + // Block 0x22, offset 0x150 + {value: 0x0000, lo: 0x01}, + {value: 0x0008, lo: 0x80, hi: 0xbf}, + // Block 0x23, offset 0x152 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x24, offset 0x15e + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x25, offset 0x169 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x26, offset 0x171 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x27, offset 0x177 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x28, offset 0x17d + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x29, offset 0x182 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x2a, offset 0x187 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x2b, offset 0x18a + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xbf}, + // Block 0x2c, offset 0x18e + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x2d, offset 0x194 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x2e, offset 0x199 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x3b08, lo: 0x94, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x2f, offset 0x1a5 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x30, offset 0x1af + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xb3}, + {value: 0x3340, lo: 0xb4, hi: 0xb5}, + {value: 0x3008, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x31, offset 0x1b5 + {value: 0x0000, lo: 0x10}, + {value: 0x3008, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x91}, + {value: 0x3b08, lo: 0x92, hi: 0x92}, + {value: 0x3308, lo: 0x93, hi: 0x93}, + {value: 0x0018, lo: 0x94, hi: 0x96}, + {value: 0x0008, lo: 0x97, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x32, offset 0x1c6 + {value: 0x0000, lo: 0x09}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x86}, + {value: 0x0218, lo: 0x87, hi: 0x87}, + {value: 0x0018, lo: 0x88, hi: 0x8a}, + {value: 0x33c0, lo: 0x8b, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xbf}, + // Block 0x33, offset 0x1d0 + {value: 0x0000, lo: 0x02}, + {value: 0x0208, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x34, offset 0x1d3 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0208, lo: 0x87, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xa9}, + {value: 0x0208, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x35, offset 0x1db + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x36, offset 0x1de + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x37, offset 0x1eb + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x38, offset 0x1f3 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x39, offset 0x1f7 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0028, lo: 0x9a, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xbf}, + // Block 0x3a, offset 0x1fe + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x3308, lo: 0x97, hi: 0x98}, + {value: 0x3008, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x3b, offset 0x206 + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x94}, + {value: 0x3008, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3b08, lo: 0xa0, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xac}, + {value: 0x3008, lo: 0xad, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x3c, offset 0x216 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xbd}, + {value: 0x3318, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x3d, offset 0x222 + {value: 0x0000, lo: 0x01}, + {value: 0x0040, lo: 0x80, hi: 0xbf}, + // Block 0x3e, offset 0x224 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3008, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x3f, offset 0x22e + {value: 0x0000, lo: 0x0b}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x3808, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x40, offset 0x23a + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3808, lo: 0xaa, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xbf}, + // Block 0x41, offset 0x246 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3008, lo: 0xaa, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3808, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbf}, + // Block 0x42, offset 0x252 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x3008, lo: 0xa4, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x43, offset 0x25a + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x44, offset 0x25f + {value: 0x0000, lo: 0x09}, + {value: 0x0e29, lo: 0x80, hi: 0x80}, + {value: 0x0e41, lo: 0x81, hi: 0x81}, + {value: 0x0e59, lo: 0x82, hi: 0x82}, + {value: 0x0e71, lo: 0x83, hi: 0x83}, + {value: 0x0e89, lo: 0x84, hi: 0x85}, + {value: 0x0ea1, lo: 0x86, hi: 0x86}, + {value: 0x0eb9, lo: 0x87, hi: 0x87}, + {value: 0x057d, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0x45, offset 0x269 + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x92}, + {value: 0x0018, lo: 0x93, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa8}, + {value: 0x0008, lo: 0xa9, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x46, offset 0x27a + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0x47, offset 0x27e + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x87}, + {value: 0xe045, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0xe045, lo: 0x98, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0xe045, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbf}, + // Block 0x48, offset 0x289 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x3318, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x49, offset 0x28d + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x24c1, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x4a, offset 0x296 + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x24f1, lo: 0xac, hi: 0xac}, + {value: 0x2529, lo: 0xad, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xae}, + {value: 0x2579, lo: 0xaf, hi: 0xaf}, + {value: 0x25b1, lo: 0xb0, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x4b, offset 0x29e + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x9f}, + {value: 0x0080, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xad}, + {value: 0x0080, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x4c, offset 0x2a4 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xa8}, + {value: 0x09c5, lo: 0xa9, hi: 0xa9}, + {value: 0x09e5, lo: 0xaa, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xbf}, + // Block 0x4d, offset 0x2a9 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0x4e, offset 0x2ac + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x28c1, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x4f, offset 0x2b0 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0e66, lo: 0xb4, hi: 0xb4}, + {value: 0x292a, lo: 0xb5, hi: 0xb5}, + {value: 0x0e86, lo: 0xb6, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x50, offset 0x2b6 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9b}, + {value: 0x2941, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0xbf}, + // Block 0x51, offset 0x2ba + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x52, offset 0x2be + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0xbf}, + // Block 0x53, offset 0x2c2 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x54, offset 0x2c7 + {value: 0x0000, lo: 0x05}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x03f5, lo: 0x90, hi: 0x9f}, + {value: 0x0ea5, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x55, offset 0x2cd + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x56, offset 0x2d5 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xae}, + {value: 0xe075, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0x57, offset 0x2dc + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x58, offset 0x2e7 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xbf}, + // Block 0x59, offset 0x2f1 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x5a, offset 0x2f5 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0xbf}, + // Block 0x5b, offset 0x2f8 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9e}, + {value: 0x0edd, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x5c, offset 0x2fe + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb2}, + {value: 0x0efd, lo: 0xb3, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x5d, offset 0x302 + {value: 0x0020, lo: 0x01}, + {value: 0x0f1d, lo: 0x80, hi: 0xbf}, + // Block 0x5e, offset 0x304 + {value: 0x0020, lo: 0x02}, + {value: 0x171d, lo: 0x80, hi: 0x8f}, + {value: 0x18fd, lo: 0x90, hi: 0xbf}, + // Block 0x5f, offset 0x307 + {value: 0x0020, lo: 0x01}, + {value: 0x1efd, lo: 0x80, hi: 0xbf}, + // Block 0x60, offset 0x309 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x61, offset 0x30c + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9a}, + {value: 0x29e2, lo: 0x9b, hi: 0x9b}, + {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9e}, + {value: 0x2a31, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x62, offset 0x316 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x2a69, lo: 0xbf, hi: 0xbf}, + // Block 0x63, offset 0x319 + {value: 0x0000, lo: 0x0e}, + {value: 0x0040, lo: 0x80, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb0}, + {value: 0x2a1d, lo: 0xb1, hi: 0xb1}, + {value: 0x2a3d, lo: 0xb2, hi: 0xb2}, + {value: 0x2a5d, lo: 0xb3, hi: 0xb3}, + {value: 0x2a7d, lo: 0xb4, hi: 0xb4}, + {value: 0x2a5d, lo: 0xb5, hi: 0xb5}, + {value: 0x2a9d, lo: 0xb6, hi: 0xb6}, + {value: 0x2abd, lo: 0xb7, hi: 0xb7}, + {value: 0x2add, lo: 0xb8, hi: 0xb9}, + {value: 0x2afd, lo: 0xba, hi: 0xbb}, + {value: 0x2b1d, lo: 0xbc, hi: 0xbd}, + {value: 0x2afd, lo: 0xbe, hi: 0xbf}, + // Block 0x64, offset 0x328 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x65, offset 0x32c + {value: 0x0030, lo: 0x04}, + {value: 0x2aa2, lo: 0x80, hi: 0x9d}, + {value: 0x305a, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x30a2, lo: 0xa0, hi: 0xbf}, + // Block 0x66, offset 0x331 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x67, offset 0x334 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x68, offset 0x338 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x69, offset 0x33d + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0x6a, offset 0x342 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb1}, + {value: 0x0018, lo: 0xb2, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6b, offset 0x348 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xb7}, + {value: 0x2009, lo: 0xb8, hi: 0xb8}, + {value: 0x6e89, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xbf}, + // Block 0x6c, offset 0x34e + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x3308, lo: 0x8b, hi: 0x8b}, + {value: 0x0008, lo: 0x8c, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x6d, offset 0x35d + {value: 0x0000, lo: 0x05}, + {value: 0x0208, lo: 0x80, hi: 0xb1}, + {value: 0x0108, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6e, offset 0x363 + {value: 0x0000, lo: 0x03}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xbf}, + // Block 0x6f, offset 0x367 + {value: 0x0000, lo: 0x0e}, + {value: 0x3008, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xba}, + {value: 0x0008, lo: 0xbb, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x70, offset 0x376 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x71, offset 0x37b + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x91}, + {value: 0x3008, lo: 0x92, hi: 0x92}, + {value: 0x3808, lo: 0x93, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x72, offset 0x383 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb9}, + {value: 0x3008, lo: 0xba, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x73, offset 0x38d + {value: 0x0000, lo: 0x0a}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x74, offset 0x398 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x75, offset 0x3a0 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8c}, + {value: 0x3008, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0x76, offset 0x3b1 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x77, offset 0x3ba + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x9a}, + {value: 0x0008, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3b08, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x78, offset 0x3ca + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x90}, + {value: 0x0008, lo: 0x91, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x79, offset 0x3d7 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x4465, lo: 0x9c, hi: 0x9c}, + {value: 0x447d, lo: 0x9d, hi: 0x9d}, + {value: 0x2971, lo: 0x9e, hi: 0x9e}, + {value: 0xe06d, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xaf}, + {value: 0x4495, lo: 0xb0, hi: 0xbf}, + // Block 0x7a, offset 0x3e1 + {value: 0x0000, lo: 0x04}, + {value: 0x44b5, lo: 0x80, hi: 0x8f}, + {value: 0x44d5, lo: 0x90, hi: 0x9f}, + {value: 0x44f5, lo: 0xa0, hi: 0xaf}, + {value: 0x44d5, lo: 0xb0, hi: 0xbf}, + // Block 0x7b, offset 0x3e6 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3b08, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x7c, offset 0x3f3 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x7d, offset 0x3f7 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x7e, offset 0x3fc + {value: 0x0020, lo: 0x01}, + {value: 0x4515, lo: 0x80, hi: 0xbf}, + // Block 0x7f, offset 0x3fe + {value: 0x0020, lo: 0x03}, + {value: 0x4d15, lo: 0x80, hi: 0x94}, + {value: 0x4ad5, lo: 0x95, hi: 0x95}, + {value: 0x4fb5, lo: 0x96, hi: 0xbf}, + // Block 0x80, offset 0x402 + {value: 0x0020, lo: 0x01}, + {value: 0x54f5, lo: 0x80, hi: 0xbf}, + // Block 0x81, offset 0x404 + {value: 0x0020, lo: 0x03}, + {value: 0x5cf5, lo: 0x80, hi: 0x84}, + {value: 0x5655, lo: 0x85, hi: 0x85}, + {value: 0x5d95, lo: 0x86, hi: 0xbf}, + // Block 0x82, offset 0x408 + {value: 0x0020, lo: 0x08}, + {value: 0x6b55, lo: 0x80, hi: 0x8f}, + {value: 0x6d15, lo: 0x90, hi: 0x90}, + {value: 0x6d55, lo: 0x91, hi: 0xab}, + {value: 0x6ea1, lo: 0xac, hi: 0xac}, + {value: 0x70b5, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x70d5, lo: 0xb0, hi: 0xbf}, + // Block 0x83, offset 0x411 + {value: 0x0020, lo: 0x05}, + {value: 0x72d5, lo: 0x80, hi: 0xad}, + {value: 0x6535, lo: 0xae, hi: 0xae}, + {value: 0x7895, lo: 0xaf, hi: 0xb5}, + {value: 0x6f55, lo: 0xb6, hi: 0xb6}, + {value: 0x7975, lo: 0xb7, hi: 0xbf}, + // Block 0x84, offset 0x417 + {value: 0x0028, lo: 0x03}, + {value: 0x7c21, lo: 0x80, hi: 0x82}, + {value: 0x7be1, lo: 0x83, hi: 0x83}, + {value: 0x7c99, lo: 0x84, hi: 0xbf}, + // Block 0x85, offset 0x41b + {value: 0x0038, lo: 0x0f}, + {value: 0x9db1, lo: 0x80, hi: 0x83}, + {value: 0x9e59, lo: 0x84, hi: 0x85}, + {value: 0x9e91, lo: 0x86, hi: 0x87}, + {value: 0x9ec9, lo: 0x88, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0xa089, lo: 0x92, hi: 0x97}, + {value: 0xa1a1, lo: 0x98, hi: 0x9c}, + {value: 0xa281, lo: 0x9d, hi: 0xb3}, + {value: 0x9d41, lo: 0xb4, hi: 0xb4}, + {value: 0x9db1, lo: 0xb5, hi: 0xb5}, + {value: 0xa789, lo: 0xb6, hi: 0xbb}, + {value: 0xa869, lo: 0xbc, hi: 0xbc}, + {value: 0xa7f9, lo: 0xbd, hi: 0xbd}, + {value: 0xa8d9, lo: 0xbe, hi: 0xbf}, + // Block 0x86, offset 0x42b + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x0008, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x87, offset 0x435 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0x88, offset 0x43a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x89, offset 0x43d + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x8a, offset 0x443 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x8b, offset 0x44a + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x8c, offset 0x44f + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x8d, offset 0x453 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x8e, offset 0x459 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xbf}, + // Block 0x8f, offset 0x45e + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x90, offset 0x467 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x91, offset 0x46c + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x92, offset 0x472 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x97}, + {value: 0x8ad5, lo: 0x98, hi: 0x9f}, + {value: 0x8aed, lo: 0xa0, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xbf}, + // Block 0x93, offset 0x479 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x8aed, lo: 0xb0, hi: 0xb7}, + {value: 0x8ad5, lo: 0xb8, hi: 0xbf}, + // Block 0x94, offset 0x480 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x95, offset 0x487 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x96, offset 0x48b + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xae}, + {value: 0x0018, lo: 0xaf, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x97, offset 0x490 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x98, offset 0x493 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xbf}, + // Block 0x99, offset 0x498 + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0808, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0808, lo: 0x8a, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb6}, + {value: 0x0808, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbb}, + {value: 0x0808, lo: 0xbc, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x0808, lo: 0xbf, hi: 0xbf}, + // Block 0x9a, offset 0x4a4 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0818, lo: 0x97, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb6}, + {value: 0x0818, lo: 0xb7, hi: 0xbf}, + // Block 0x9b, offset 0x4aa + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa6}, + {value: 0x0818, lo: 0xa7, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x9c, offset 0x4af + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x0818, lo: 0xbb, hi: 0xbf}, + // Block 0x9d, offset 0x4b6 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0818, lo: 0x96, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0818, lo: 0xbf, hi: 0xbf}, + // Block 0x9e, offset 0x4be + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbb}, + {value: 0x0818, lo: 0xbc, hi: 0xbd}, + {value: 0x0808, lo: 0xbe, hi: 0xbf}, + // Block 0x9f, offset 0x4c3 + {value: 0x0000, lo: 0x03}, + {value: 0x0818, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x0818, lo: 0x92, hi: 0xbf}, + // Block 0xa0, offset 0x4c7 + {value: 0x0000, lo: 0x0f}, + {value: 0x0808, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x94}, + {value: 0x0808, lo: 0x95, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x98}, + {value: 0x0808, lo: 0x99, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xa1, offset 0x4d7 + {value: 0x0000, lo: 0x06}, + {value: 0x0818, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0818, lo: 0x90, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xbc}, + {value: 0x0818, lo: 0xbd, hi: 0xbf}, + // Block 0xa2, offset 0x4de + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xa3, offset 0x4e2 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xbf}, + // Block 0xa4, offset 0x4e6 + {value: 0x0000, lo: 0x06}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0818, lo: 0x98, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb7}, + {value: 0x0818, lo: 0xb8, hi: 0xbf}, + // Block 0xa5, offset 0x4ed + {value: 0x0000, lo: 0x01}, + {value: 0x0808, lo: 0x80, hi: 0xbf}, + // Block 0xa6, offset 0x4ef + {value: 0x0000, lo: 0x02}, + {value: 0x0808, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xa7, offset 0x4f2 + {value: 0x0000, lo: 0x02}, + {value: 0x03dd, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xa8, offset 0x4f5 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xbf}, + // Block 0xa9, offset 0x4f9 + {value: 0x0000, lo: 0x08}, + {value: 0x0908, lo: 0x80, hi: 0x80}, + {value: 0x0a08, lo: 0x81, hi: 0xa1}, + {value: 0x0c08, lo: 0xa2, hi: 0xa2}, + {value: 0x0a08, lo: 0xa3, hi: 0xa3}, + {value: 0x3308, lo: 0xa4, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0808, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xaa, offset 0x502 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0818, lo: 0xa0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xab, offset 0x506 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0xa6}, + {value: 0x0808, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0a08, lo: 0xb0, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb3}, + {value: 0x0a08, lo: 0xb4, hi: 0xbf}, + // Block 0xac, offset 0x50e + {value: 0x0000, lo: 0x07}, + {value: 0x0a08, lo: 0x80, hi: 0x84}, + {value: 0x0808, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x90}, + {value: 0x0a18, lo: 0x91, hi: 0x93}, + {value: 0x0c18, lo: 0x94, hi: 0x94}, + {value: 0x0818, lo: 0x95, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xad, offset 0x516 + {value: 0x0000, lo: 0x05}, + {value: 0x3008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xae, offset 0x51c + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x91}, + {value: 0x0018, lo: 0x92, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xaf, offset 0x525 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0xb0, offset 0x531 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb1, offset 0x538 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb2}, + {value: 0x3b08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xbf}, + // Block 0xb2, offset 0x541 + {value: 0x0000, lo: 0x09}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xb3, offset 0x54b + {value: 0x0000, lo: 0x06}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xbe}, + {value: 0x3008, lo: 0xbf, hi: 0xbf}, + // Block 0xb4, offset 0x552 + {value: 0x0000, lo: 0x0d}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xb5, offset 0x560 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3808, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xb6, offset 0x56d + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xb7, offset 0x57a + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x3308, lo: 0x9f, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa9}, + {value: 0x3b08, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb8, offset 0x583 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xb9, offset 0x587 + {value: 0x0000, lo: 0x0e}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xba, offset 0x596 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xbb, offset 0x59e + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x85}, + {value: 0x0018, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xbc, offset 0x5a9 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbd, offset 0x5b2 + {value: 0x0000, lo: 0x05}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9b}, + {value: 0x3308, lo: 0x9c, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xbe, offset 0x5b8 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbf, offset 0x5c0 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xc0, offset 0x5c9 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb5}, + {value: 0x3808, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0xc1, offset 0x5d3 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xc2, offset 0x5d6 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xc3, offset 0x5e2 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0xc4, offset 0x5eb + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xbf}, + // Block 0xc5, offset 0x5ee + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0xc6, offset 0x5f3 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0xc7, offset 0x5fe + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x3b08, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0xbf}, + // Block 0xc8, offset 0x607 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x98}, + {value: 0x3b08, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xa2}, + {value: 0x0040, lo: 0xa3, hi: 0xbf}, + // Block 0xc9, offset 0x613 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xca, offset 0x616 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xcb, offset 0x620 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xbf}, + // Block 0xcc, offset 0x629 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xa9}, + {value: 0x3308, lo: 0xaa, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xcd, offset 0x635 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xce, offset 0x642 + {value: 0x0000, lo: 0x0c}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xbf}, + // Block 0xcf, offset 0x64f + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x3008, lo: 0x93, hi: 0x94}, + {value: 0x3308, lo: 0x95, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x96}, + {value: 0x3b08, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xbf}, + // Block 0xd0, offset 0x65d + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xd1, offset 0x664 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xd2, offset 0x667 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xd3, offset 0x66c + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xd4, offset 0x66f + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xbf}, + // Block 0xd5, offset 0x672 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0xbf}, + // Block 0xd6, offset 0x675 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xd7, offset 0x67c + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xd8, offset 0x683 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0xd9, offset 0x687 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0xda, offset 0x692 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0xdb, offset 0x695 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0xdc, offset 0x698 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0xdd, offset 0x69b + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3008, lo: 0x91, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xde, offset 0x6a1 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xdf, offset 0x6a6 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xbf}, + // Block 0xe0, offset 0x6aa + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xe1, offset 0x6ad + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xe2, offset 0x6b0 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xe3, offset 0x6b3 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xe4, offset 0x6b6 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0xe5, offset 0x6b9 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0xe6, offset 0x6be + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x03c0, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xbf}, + // Block 0xe7, offset 0x6c8 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xe8, offset 0x6cb + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xbf}, + // Block 0xe9, offset 0x6cf + {value: 0x0000, lo: 0x0e}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0xb5b9, lo: 0x9e, hi: 0x9e}, + {value: 0xb601, lo: 0x9f, hi: 0x9f}, + {value: 0xb649, lo: 0xa0, hi: 0xa0}, + {value: 0xb6b1, lo: 0xa1, hi: 0xa1}, + {value: 0xb719, lo: 0xa2, hi: 0xa2}, + {value: 0xb781, lo: 0xa3, hi: 0xa3}, + {value: 0xb7e9, lo: 0xa4, hi: 0xa4}, + {value: 0x3018, lo: 0xa5, hi: 0xa6}, + {value: 0x3318, lo: 0xa7, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xac}, + {value: 0x3018, lo: 0xad, hi: 0xb2}, + {value: 0x0340, lo: 0xb3, hi: 0xba}, + {value: 0x3318, lo: 0xbb, hi: 0xbf}, + // Block 0xea, offset 0x6de + {value: 0x0000, lo: 0x0b}, + {value: 0x3318, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x84}, + {value: 0x3318, lo: 0x85, hi: 0x8b}, + {value: 0x0018, lo: 0x8c, hi: 0xa9}, + {value: 0x3318, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xba}, + {value: 0xb851, lo: 0xbb, hi: 0xbb}, + {value: 0xb899, lo: 0xbc, hi: 0xbc}, + {value: 0xb8e1, lo: 0xbd, hi: 0xbd}, + {value: 0xb949, lo: 0xbe, hi: 0xbe}, + {value: 0xb9b1, lo: 0xbf, hi: 0xbf}, + // Block 0xeb, offset 0x6ea + {value: 0x0000, lo: 0x03}, + {value: 0xba19, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xbf}, + // Block 0xec, offset 0x6ee + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x3318, lo: 0x82, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0xbf}, + // Block 0xed, offset 0x6f3 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0xee, offset 0x6f7 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xef, offset 0x6fc + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0xf0, offset 0x700 + {value: 0x0000, lo: 0x04}, + {value: 0x3308, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0xf1, offset 0x705 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x3308, lo: 0xa1, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xf2, offset 0x70e + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0xf3, offset 0x719 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x86}, + {value: 0x0818, lo: 0x87, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xf4, offset 0x71f + {value: 0x0000, lo: 0x07}, + {value: 0x0a08, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0818, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xf5, offset 0x727 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xb0}, + {value: 0x0818, lo: 0xb1, hi: 0xbf}, + // Block 0xf6, offset 0x72a + {value: 0x0000, lo: 0x02}, + {value: 0x0818, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xf7, offset 0x72d + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xf8, offset 0x731 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0xf9, offset 0x735 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0xfa, offset 0x73b + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xfb, offset 0x741 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0xc1c1, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xfc, offset 0x746 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xbf}, + // Block 0xfd, offset 0x749 + {value: 0x0000, lo: 0x0f}, + {value: 0xc7e9, lo: 0x80, hi: 0x80}, + {value: 0xc839, lo: 0x81, hi: 0x81}, + {value: 0xc889, lo: 0x82, hi: 0x82}, + {value: 0xc8d9, lo: 0x83, hi: 0x83}, + {value: 0xc929, lo: 0x84, hi: 0x84}, + {value: 0xc979, lo: 0x85, hi: 0x85}, + {value: 0xc9c9, lo: 0x86, hi: 0x86}, + {value: 0xca19, lo: 0x87, hi: 0x87}, + {value: 0xca69, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0xcab9, lo: 0x90, hi: 0x90}, + {value: 0xcad9, lo: 0x91, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xbf}, + // Block 0xfe, offset 0x759 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xff, offset 0x760 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x100, offset 0x763 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0xbf}, + // Block 0x101, offset 0x766 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x102, offset 0x76a + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x103, offset 0x770 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xbf}, + // Block 0x104, offset 0x775 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x105, offset 0x77a + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb2}, + {value: 0x0018, lo: 0xb3, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbf}, + // Block 0x106, offset 0x782 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xa2}, + {value: 0x0040, lo: 0xa3, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x107, offset 0x787 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x108, offset 0x78b + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xbf}, + // Block 0x109, offset 0x78f + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0x10a, offset 0x792 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x10b, offset 0x795 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x10c, offset 0x799 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x10d, offset 0x79d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x10e, offset 0x7a0 + {value: 0x0020, lo: 0x0f}, + {value: 0xdeb9, lo: 0x80, hi: 0x89}, + {value: 0x8dfd, lo: 0x8a, hi: 0x8a}, + {value: 0xdff9, lo: 0x8b, hi: 0x9c}, + {value: 0x8e1d, lo: 0x9d, hi: 0x9d}, + {value: 0xe239, lo: 0x9e, hi: 0xa2}, + {value: 0x8e3d, lo: 0xa3, hi: 0xa3}, + {value: 0xe2d9, lo: 0xa4, hi: 0xab}, + {value: 0x7ed5, lo: 0xac, hi: 0xac}, + {value: 0xe3d9, lo: 0xad, hi: 0xaf}, + {value: 0x8e5d, lo: 0xb0, hi: 0xb0}, + {value: 0xe439, lo: 0xb1, hi: 0xb6}, + {value: 0x8e7d, lo: 0xb7, hi: 0xb9}, + {value: 0xe4f9, lo: 0xba, hi: 0xba}, + {value: 0x8edd, lo: 0xbb, hi: 0xbb}, + {value: 0xe519, lo: 0xbc, hi: 0xbf}, + // Block 0x10f, offset 0x7b0 + {value: 0x0020, lo: 0x10}, + {value: 0x937d, lo: 0x80, hi: 0x80}, + {value: 0xf099, lo: 0x81, hi: 0x86}, + {value: 0x939d, lo: 0x87, hi: 0x8a}, + {value: 0xd9f9, lo: 0x8b, hi: 0x8b}, + {value: 0xf159, lo: 0x8c, hi: 0x96}, + {value: 0x941d, lo: 0x97, hi: 0x97}, + {value: 0xf2b9, lo: 0x98, hi: 0xa3}, + {value: 0x943d, lo: 0xa4, hi: 0xa6}, + {value: 0xf439, lo: 0xa7, hi: 0xaa}, + {value: 0x949d, lo: 0xab, hi: 0xab}, + {value: 0xf4b9, lo: 0xac, hi: 0xac}, + {value: 0x94bd, lo: 0xad, hi: 0xad}, + {value: 0xf4d9, lo: 0xae, hi: 0xaf}, + {value: 0x94dd, lo: 0xb0, hi: 0xb1}, + {value: 0xf519, lo: 0xb2, hi: 0xbe}, + {value: 0x2040, lo: 0xbf, hi: 0xbf}, + // Block 0x110, offset 0x7c1 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0340, lo: 0x81, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x9f}, + {value: 0x0340, lo: 0xa0, hi: 0xbf}, + // Block 0x111, offset 0x7c6 + {value: 0x0000, lo: 0x01}, + {value: 0x0340, lo: 0x80, hi: 0xbf}, + // Block 0x112, offset 0x7c8 + {value: 0x0000, lo: 0x01}, + {value: 0x33c0, lo: 0x80, hi: 0xbf}, + // Block 0x113, offset 0x7ca + {value: 0x0000, lo: 0x02}, + {value: 0x33c0, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, +} + +// Total table size 42466 bytes (41KiB); checksum: 355A58A4 diff --git a/vendor/golang.org/x/net/idna/tables12.00.go b/vendor/golang.org/x/net/idna/tables12.00.go new file mode 100644 index 00000000..f4b8ea36 --- /dev/null +++ b/vendor/golang.org/x/net/idna/tables12.00.go @@ -0,0 +1,4733 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// +build go1.14 + +package idna + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "12.0.0" + +var mappings string = "" + // Size: 8178 bytes + "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + + "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + + "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + + "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + + "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + + "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + + "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + + "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + + "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + + "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + + "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + + "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + + "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + + "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + + "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + + "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + + "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + + "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + + "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + + "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + + "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + + "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + + "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + + "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + + "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + + "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + + ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + + "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + + "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + + "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + + "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + + "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + + "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + + "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + + "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + + "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" + + "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" + + "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" + + "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" + + "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" + + "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" + + "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" + + "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" + + "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" + + "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" + + "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + + "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + + "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + + "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + + "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + + "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + + "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + + "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + + "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + + "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + + "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + + "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" + + "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" + + "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" + + "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" + + "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" + + "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" + + "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" + + "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" + + "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" + + "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" + + "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" + + "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" + + "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" + + "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" + + "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" + + "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" + + "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" + + " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" + + "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" + + "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" + + "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" + + "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" + + "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" + + "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" + + "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" + + "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" + + "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" + + "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" + + "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" + + "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" + + "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" + + "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" + + "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" + + "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" + + "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" + + "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" + + "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" + + "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" + + "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" + + "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" + + "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" + + "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" + + "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" + + "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" + + "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" + + "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" + + "c\x02mc\x02md\x02mr\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多" + + "\x03解\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販" + + "\x03声\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打" + + "\x03禁\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕" + + "\x09〔安〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你" + + "\x03侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內" + + "\x03冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉" + + "\x03勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟" + + "\x03叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙" + + "\x03喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型" + + "\x03堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮" + + "\x03嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍" + + "\x03嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰" + + "\x03庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹" + + "\x03悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞" + + "\x03懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢" + + "\x03揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙" + + "\x03暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓" + + "\x03㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛" + + "\x03㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派" + + "\x03海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆" + + "\x03瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀" + + "\x03犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾" + + "\x03異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌" + + "\x03磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒" + + "\x03䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺" + + "\x03者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋" + + "\x03芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著" + + "\x03荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜" + + "\x03虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠" + + "\x03衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁" + + "\x03贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘" + + "\x03鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲" + + "\x03頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭" + + "\x03鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" + +var xorData string = "" + // Size: 4862 bytes + "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + + "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + + "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + + "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + + "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + + "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + + "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + + "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + + "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + + "\x03\x037 \x03\x0b+\x03\x021\x00\x02\x01\x04\x02\x01\x02\x02\x019\x02" + + "\x03\x1c\x02\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03" + + "\xc1r\x02\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<" + + "\x03\xc1s*\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03" + + "\x83\xab\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96" + + "\xe1\xcd\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03" + + "\x9a\xec\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c" + + "!\x03\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03" + + "ʦ\x93\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7" + + "\x03\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca" + + "\xfa\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e" + + "\x03\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca" + + "\xe3\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99" + + "\x03\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca" + + "\xe8\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03" + + "\x0b\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06" + + "\x05\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03" + + "\x0786\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/" + + "\x03\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f" + + "\x03\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-" + + "\x03\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03" + + "\x07\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03" + + "\x07\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03" + + "\x07\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b" + + "\x0a\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03" + + "\x07\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+" + + "\x03\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03" + + "\x044\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03" + + "\x04+ \x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!" + + "\x22\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04" + + "\x03\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>" + + "\x03\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03" + + "\x054\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03" + + "\x05):\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$" + + "\x1e\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226" + + "\x03\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05" + + "\x1b\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05" + + "\x03\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03" + + "\x06\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08" + + "\x03\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03" + + "\x0a6\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a" + + "\x1f\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03" + + "\x0a\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f" + + "\x02\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/" + + "\x03\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a" + + "\x00\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+" + + "\x10\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#" + + "<\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!" + + "\x00\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18." + + "\x03\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15" + + "\x22\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b" + + "\x12\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05" + + "<\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + + "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + + "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + + "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + + "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + + "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + + "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + + "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + + "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + + "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + + "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + + "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + + "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + + "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + + "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + + "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + + "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + + "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + + "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + + "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + + "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + + "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + + "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + + "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + + "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + + "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + + "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + + "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + + "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + + "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + + "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + + "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + + ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + + "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + + "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + + "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + + "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + + "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + + "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + + "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + + "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + + "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + + "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + + "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + + "(\x04\x023 \x03\x0b)\x08\x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!" + + "\x10\x03\x0b!0\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b" + + "\x03\x09\x1f\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14" + + "\x03\x0a\x01\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03" + + "\x08='\x03\x08\x1a\x0a\x03\x07\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07" + + "\x01\x00\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03" + + "\x09\x11\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03" + + "\x0a/1\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03" + + "\x07<3\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06" + + "\x13\x00\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(" + + ";\x03\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08" + + "\x14$\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03" + + "\x0a\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19" + + "\x01\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18" + + "\x03\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03" + + "\x07\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03" + + "\x0a\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03" + + "\x0b\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03" + + "\x08\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05" + + "\x03\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11" + + "\x03\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03" + + "\x09\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a" + + ".\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + + "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + + "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + + "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + + "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + + "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + + "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + + "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + + "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + + "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + + "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + + "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + + "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + + "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + + "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + + "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + + "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + + "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + + "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + + "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + + "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + + "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + + "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + + "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + + "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + + "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + + "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + + "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + + "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + + "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + + "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + + "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + + "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + + "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + + "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + + "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + + "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + + "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + + "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + + "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + + "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + + "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + + "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + + "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + + "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + + "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + + "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + + "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + + "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + + "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + + "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + + "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + + "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + + "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + + "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + + "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + + "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + + "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + + "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + + "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + + "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + + "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + + "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + + "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + + "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + + "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + + "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + + "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + + "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + + "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + + "\x04\x03\x0c?\x05\x03\x0c" + + "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + + "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + + "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + + "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + + "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + + "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" + + "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" + + "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" + + "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" + + "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" + + "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" + + "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" + + "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" + + "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" + + "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" + + "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" + + "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" + + "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" + + "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" + + "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" + + "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" + + "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" + + "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" + + "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" + + "\x05\x22\x05\x03\x050\x1d" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// idnaTrie. Total size: 29708 bytes (29.01 KiB). Checksum: c3ecc76d8fffa6e6. +type idnaTrie struct{} + +func newIdnaTrie(i int) *idnaTrie { + return &idnaTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 125: + return uint16(idnaValues[n<<6+uint32(b)]) + default: + n -= 125 + return uint16(idnaSparse.lookup(n, b)) + } +} + +// idnaValues: 127 blocks, 8128 entries, 16256 bytes +// The third block is the zero block. +var idnaValues = [8128]uint16{ + // Block 0x0, offset 0x0 + 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, + 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, + 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, + 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, + 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, + 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, + 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, + 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, + 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, + 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, + 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, + // Block 0x1, offset 0x40 + 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, + 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, + 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, + 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, + 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, + 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, + 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, + 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, + 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, + 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, + 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, + 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, + 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, + 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, + 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, + 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, + 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, + 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, + 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, + // Block 0x4, offset 0x100 + 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, + 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, + 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, + 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, + 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, + 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, + 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, + 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, + 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, + 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, + 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, + // Block 0x5, offset 0x140 + 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, + 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, + 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, + 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, + 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, + 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, + 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, + 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, + 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, + 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, + // Block 0x6, offset 0x180 + 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, + 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, + 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, + 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, + 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, + 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, + 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, + 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, + 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, + 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, + 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, + 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, + 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, + 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, + 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, + 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, + 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, + 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, + 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, + 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, + 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, + // Block 0x8, offset 0x200 + 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, + 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, + 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, + 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, + 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, + 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, + 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, + 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, + 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, + 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, + // Block 0x9, offset 0x240 + 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, + 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, + 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, + 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, + 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, + 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, + 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, + 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, + 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, + 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, + // Block 0xa, offset 0x280 + 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, + 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308, + 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308, + 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308, + 0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308, + 0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308, + 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308, + 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308, + 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, + 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, + 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, + 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, + 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, + 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, + 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, + 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, + 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, + 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, + 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, + // Block 0xc, offset 0x300 + 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, + 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, + 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, + 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, + 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, + 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, + 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, + 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, + 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, + 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, + 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, + // Block 0xd, offset 0x340 + 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, + 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, + 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, + 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, + 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, + 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, + 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, + 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, + 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, + 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, + 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, + // Block 0xe, offset 0x380 + 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308, + 0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008, + 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, + 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, + 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, + 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, + 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, + 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, + 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, + 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, + 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, + 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, + 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, + 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, + 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, + 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, + 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, + 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, + 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, + 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, + 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, + // Block 0x10, offset 0x400 + 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, + 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, + 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, + 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, + 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, + 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, + 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, + 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, + 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, + 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, + 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, + // Block 0x11, offset 0x440 + 0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840, + 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818, + 0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308, + 0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308, + 0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040, + 0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08, + 0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08, + 0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08, + 0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08, + 0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08, + 0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08, + // Block 0x12, offset 0x480 + 0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08, + 0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308, + 0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308, + 0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308, + 0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308, + 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808, + 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808, + 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08, + 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429, + 0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, + 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08, + 0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08, + 0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08, + 0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308, + 0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840, + 0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308, + 0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018, + 0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08, + 0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008, + 0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08, + 0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08, + // Block 0x14, offset 0x500 + 0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818, + 0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818, + 0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308, + 0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08, + 0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08, + 0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08, + 0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08, + 0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08, + 0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308, + 0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308, + 0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308, + // Block 0x15, offset 0x540 + 0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08, + 0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08, + 0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08, + 0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0808, 0x557: 0x0808, + 0x558: 0x0808, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040, + 0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08, + 0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08, + 0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040, + 0x570: 0x0040, 0x571: 0x0040, 0x572: 0x0040, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040, + 0x576: 0x0040, 0x577: 0x0040, 0x578: 0x0040, 0x579: 0x0040, 0x57a: 0x0040, 0x57b: 0x0040, + 0x57c: 0x0040, 0x57d: 0x0040, 0x57e: 0x0040, 0x57f: 0x0040, + // Block 0x16, offset 0x580 + 0x580: 0x3008, 0x581: 0x3308, 0x582: 0x3308, 0x583: 0x3308, 0x584: 0x3308, 0x585: 0x3308, + 0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008, + 0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308, + 0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308, + 0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1, + 0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308, + 0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, + 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, + 0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008, + 0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008, + 0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0008, 0x5c1: 0x3308, 0x5c2: 0x3008, 0x5c3: 0x3008, 0x5c4: 0x0040, 0x5c5: 0x0008, + 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0008, + 0x5cc: 0x0008, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040, + 0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008, + 0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008, + 0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008, + 0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040, + 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, + 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0040, 0x5f4: 0x0040, 0x5f5: 0x0040, + 0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040, + 0x5fc: 0x3308, 0x5fd: 0x0008, 0x5fe: 0x3008, 0x5ff: 0x3008, + // Block 0x18, offset 0x600 + 0x600: 0x3008, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3308, 0x604: 0x3308, 0x605: 0x0040, + 0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008, + 0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040, + 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008, + 0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1, + 0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308, + 0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, + 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, + 0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018, + 0x636: 0x0018, 0x637: 0x0018, 0x638: 0x0018, 0x639: 0x0018, 0x63a: 0x0018, 0x63b: 0x0018, + 0x63c: 0x0008, 0x63d: 0x0018, 0x63e: 0x3308, 0x63f: 0x0040, + // Block 0x19, offset 0x640 + 0x640: 0x0040, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3008, 0x644: 0x0040, 0x645: 0x0008, + 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0040, + 0x64c: 0x0040, 0x64d: 0x0040, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0040, + 0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008, + 0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008, + 0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008, + 0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040, + 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, + 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008, + 0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, + 0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008, + // Block 0x1a, offset 0x680 + 0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040, + 0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308, + 0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308, + 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, + 0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040, + 0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040, + 0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008, + 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, + 0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308, + 0x6b6: 0x0018, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0040, 0x6ba: 0x0040, 0x6bb: 0x0040, + 0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x0040, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3008, 0x6c4: 0x0040, 0x6c5: 0x0008, + 0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008, + 0x6cc: 0x0008, 0x6cd: 0x0008, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0008, + 0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008, + 0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008, + 0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008, + 0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040, + 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, + 0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008, + 0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040, + 0x6fc: 0x3308, 0x6fd: 0x0008, 0x6fe: 0x3008, 0x6ff: 0x3008, + // Block 0x1c, offset 0x700 + 0x700: 0x3008, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3308, 0x704: 0x3308, 0x705: 0x3308, + 0x706: 0x0040, 0x707: 0x3308, 0x708: 0x3308, 0x709: 0x3008, 0x70a: 0x0040, 0x70b: 0x3008, + 0x70c: 0x3008, 0x70d: 0x3b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0008, 0x711: 0x0040, + 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x0040, 0x717: 0x0040, + 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0040, 0x71d: 0x0040, + 0x71e: 0x0040, 0x71f: 0x0040, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x3308, 0x723: 0x3308, + 0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008, + 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, + 0x730: 0x0018, 0x731: 0x0018, 0x732: 0x0040, 0x733: 0x0040, 0x734: 0x0040, 0x735: 0x0040, + 0x736: 0x0040, 0x737: 0x0040, 0x738: 0x0040, 0x739: 0x0008, 0x73a: 0x3308, 0x73b: 0x3308, + 0x73c: 0x3308, 0x73d: 0x3308, 0x73e: 0x3308, 0x73f: 0x3308, + // Block 0x1d, offset 0x740 + 0x740: 0x0040, 0x741: 0x3308, 0x742: 0x3008, 0x743: 0x3008, 0x744: 0x0040, 0x745: 0x0008, + 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0008, + 0x74c: 0x0008, 0x74d: 0x0040, 0x74e: 0x0040, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040, + 0x752: 0x0040, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008, + 0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008, + 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008, + 0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0040, + 0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008, + 0x770: 0x0008, 0x771: 0x0040, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0040, 0x775: 0x0008, + 0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040, + 0x77c: 0x3308, 0x77d: 0x0008, 0x77e: 0x3008, 0x77f: 0x3308, + // Block 0x1e, offset 0x780 + 0x780: 0x3008, 0x781: 0x3308, 0x782: 0x3308, 0x783: 0x3308, 0x784: 0x3308, 0x785: 0x0040, + 0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008, + 0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, + 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x0040, 0x796: 0x3308, 0x797: 0x3008, + 0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9, + 0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308, + 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, + 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, + 0x7b0: 0x0018, 0x7b1: 0x0008, 0x7b2: 0x0018, 0x7b3: 0x0018, 0x7b4: 0x0018, 0x7b5: 0x0018, + 0x7b6: 0x0018, 0x7b7: 0x0018, 0x7b8: 0x0040, 0x7b9: 0x0040, 0x7ba: 0x0040, 0x7bb: 0x0040, + 0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x0040, 0x7bf: 0x0040, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0040, 0x7c1: 0x0040, 0x7c2: 0x3308, 0x7c3: 0x0008, 0x7c4: 0x0040, 0x7c5: 0x0008, + 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0040, + 0x7cc: 0x0040, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040, + 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0040, 0x7d7: 0x0040, + 0x7d8: 0x0040, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0008, 0x7dd: 0x0040, + 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0040, 0x7e1: 0x0040, 0x7e2: 0x0040, 0x7e3: 0x0008, + 0x7e4: 0x0008, 0x7e5: 0x0040, 0x7e6: 0x0040, 0x7e7: 0x0040, 0x7e8: 0x0008, 0x7e9: 0x0008, + 0x7ea: 0x0008, 0x7eb: 0x0040, 0x7ec: 0x0040, 0x7ed: 0x0040, 0x7ee: 0x0008, 0x7ef: 0x0008, + 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0008, 0x7f5: 0x0008, + 0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040, + 0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x3008, 0x7ff: 0x3008, + // Block 0x20, offset 0x800 + 0x800: 0x3308, 0x801: 0x3008, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x3008, 0x805: 0x0040, + 0x806: 0x3308, 0x807: 0x3308, 0x808: 0x3308, 0x809: 0x0040, 0x80a: 0x3308, 0x80b: 0x3308, + 0x80c: 0x3308, 0x80d: 0x3b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040, + 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x3308, 0x816: 0x3308, 0x817: 0x0040, + 0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040, + 0x81e: 0x0040, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x3308, 0x823: 0x3308, + 0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008, + 0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008, + 0x830: 0x0040, 0x831: 0x0040, 0x832: 0x0040, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040, + 0x836: 0x0040, 0x837: 0x0018, 0x838: 0x0018, 0x839: 0x0018, 0x83a: 0x0018, 0x83b: 0x0018, + 0x83c: 0x0018, 0x83d: 0x0018, 0x83e: 0x0018, 0x83f: 0x0018, + // Block 0x21, offset 0x840 + 0x840: 0x0008, 0x841: 0x3308, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x0018, 0x845: 0x0008, + 0x846: 0x0008, 0x847: 0x0008, 0x848: 0x0008, 0x849: 0x0008, 0x84a: 0x0008, 0x84b: 0x0008, + 0x84c: 0x0008, 0x84d: 0x0040, 0x84e: 0x0008, 0x84f: 0x0008, 0x850: 0x0008, 0x851: 0x0040, + 0x852: 0x0008, 0x853: 0x0008, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x0008, + 0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0008, 0x85c: 0x0008, 0x85d: 0x0008, + 0x85e: 0x0008, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x0008, 0x863: 0x0008, + 0x864: 0x0008, 0x865: 0x0008, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0040, + 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, + 0x870: 0x0008, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0008, 0x874: 0x0040, 0x875: 0x0008, + 0x876: 0x0008, 0x877: 0x0008, 0x878: 0x0008, 0x879: 0x0008, 0x87a: 0x0040, 0x87b: 0x0040, + 0x87c: 0x3308, 0x87d: 0x0008, 0x87e: 0x3008, 0x87f: 0x3308, + // Block 0x22, offset 0x880 + 0x880: 0x3008, 0x881: 0x3008, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x3008, 0x885: 0x0040, + 0x886: 0x3308, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008, + 0x88c: 0x3308, 0x88d: 0x3b08, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040, + 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0040, 0x895: 0x3008, 0x896: 0x3008, 0x897: 0x0040, + 0x898: 0x0040, 0x899: 0x0040, 0x89a: 0x0040, 0x89b: 0x0040, 0x89c: 0x0040, 0x89d: 0x0040, + 0x89e: 0x0008, 0x89f: 0x0040, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308, + 0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008, + 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, + 0x8b0: 0x0040, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0040, 0x8b4: 0x0040, 0x8b5: 0x0040, + 0x8b6: 0x0040, 0x8b7: 0x0040, 0x8b8: 0x0040, 0x8b9: 0x0040, 0x8ba: 0x0040, 0x8bb: 0x0040, + 0x8bc: 0x0040, 0x8bd: 0x0040, 0x8be: 0x0040, 0x8bf: 0x0040, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x3008, 0x8c1: 0x3308, 0x8c2: 0x3308, 0x8c3: 0x3308, 0x8c4: 0x3308, 0x8c5: 0x0040, + 0x8c6: 0x3008, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008, + 0x8cc: 0x3008, 0x8cd: 0x3b08, 0x8ce: 0x0008, 0x8cf: 0x0018, 0x8d0: 0x0040, 0x8d1: 0x0040, + 0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x3008, + 0x8d8: 0x0018, 0x8d9: 0x0018, 0x8da: 0x0018, 0x8db: 0x0018, 0x8dc: 0x0018, 0x8dd: 0x0018, + 0x8de: 0x0018, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308, + 0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008, + 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008, + 0x8f0: 0x0018, 0x8f1: 0x0018, 0x8f2: 0x0018, 0x8f3: 0x0018, 0x8f4: 0x0018, 0x8f5: 0x0018, + 0x8f6: 0x0018, 0x8f7: 0x0018, 0x8f8: 0x0018, 0x8f9: 0x0018, 0x8fa: 0x0008, 0x8fb: 0x0008, + 0x8fc: 0x0008, 0x8fd: 0x0008, 0x8fe: 0x0008, 0x8ff: 0x0008, + // Block 0x24, offset 0x900 + 0x900: 0x0040, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0040, 0x904: 0x0008, 0x905: 0x0040, + 0x906: 0x0008, 0x907: 0x0008, 0x908: 0x0008, 0x909: 0x0008, 0x90a: 0x0008, 0x90b: 0x0040, + 0x90c: 0x0008, 0x90d: 0x0008, 0x90e: 0x0008, 0x90f: 0x0008, 0x910: 0x0008, 0x911: 0x0008, + 0x912: 0x0008, 0x913: 0x0008, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0008, + 0x918: 0x0008, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0008, 0x91d: 0x0008, + 0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0008, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008, + 0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0008, 0x929: 0x0008, + 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0008, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008, + 0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308, + 0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x3b08, 0x93b: 0x3308, + 0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040, + // Block 0x25, offset 0x940 + 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008, + 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, + 0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, + 0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79, + 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008, + 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, + 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9, + 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040, + 0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59, + 0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308, + 0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008, + // Block 0x26, offset 0x980 + 0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018, + 0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008, + 0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308, + 0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308, + 0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11, + 0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308, + 0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308, + 0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308, + 0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308, + 0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308, + 0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, + 0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, + 0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008, + 0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008, + 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008, + 0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008, + 0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008, + 0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008, + 0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41, + 0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008, + 0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269, + // Block 0x28, offset 0xa00 + 0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1, + 0xa06: 0x05b5, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011, + 0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041, + 0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05cd, 0xa15: 0x05cd, 0xa16: 0x0f99, 0xa17: 0x0fa9, + 0xa18: 0x0fb9, 0xa19: 0x05b5, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05e5, 0xa1d: 0x1099, + 0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269, + 0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1, + 0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008, + 0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008, + 0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008, + 0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008, + // Block 0x29, offset 0xa40 + 0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008, + 0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008, + 0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008, + 0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, + 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169, + 0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9, + 0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05fd, 0xa68: 0x1239, 0xa69: 0x1251, + 0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9, + 0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359, + 0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x0615, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1, + 0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429, + // Block 0x2a, offset 0xa80 + 0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008, + 0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008, + 0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008, + 0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0xe00d, 0xa97: 0x0008, + 0xa98: 0xe00d, 0xa99: 0x0008, 0xa9a: 0xe00d, 0xa9b: 0x0008, 0xa9c: 0xe00d, 0xa9d: 0x0008, + 0xa9e: 0xe00d, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008, + 0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008, + 0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008, + 0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008, + 0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008, + 0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008, + // Block 0x2b, offset 0xac0 + 0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008, + 0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008, + 0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008, + 0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008, + 0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x062d, 0xadb: 0x064d, 0xadc: 0x0008, 0xadd: 0x0008, + 0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, + 0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008, + 0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008, + 0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008, + 0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008, + 0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008, + // Block 0x2c, offset 0xb00 + 0xb00: 0x0008, 0xb01: 0x0008, 0xb02: 0x0008, 0xb03: 0x0008, 0xb04: 0x0008, 0xb05: 0x0008, + 0xb06: 0x0040, 0xb07: 0x0040, 0xb08: 0xe045, 0xb09: 0xe045, 0xb0a: 0xe045, 0xb0b: 0xe045, + 0xb0c: 0xe045, 0xb0d: 0xe045, 0xb0e: 0x0040, 0xb0f: 0x0040, 0xb10: 0x0008, 0xb11: 0x0008, + 0xb12: 0x0008, 0xb13: 0x0008, 0xb14: 0x0008, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008, + 0xb18: 0x0040, 0xb19: 0xe045, 0xb1a: 0x0040, 0xb1b: 0xe045, 0xb1c: 0x0040, 0xb1d: 0xe045, + 0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008, + 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, + 0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045, + 0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489, + 0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1, + 0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040, + // Block 0x2d, offset 0xb40 + 0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1, + 0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591, + 0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1, + 0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1, + 0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771, + 0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891, + 0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831, + 0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951, + 0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040, + 0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x0665, 0xb7b: 0x1459, + 0xb7c: 0x19b1, 0xb7d: 0x067e, 0xb7e: 0x1a31, 0xb7f: 0x069e, + // Block 0x2e, offset 0xb80 + 0xb80: 0x06be, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040, + 0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06dd, 0xb89: 0x1471, 0xb8a: 0x06f5, 0xb8b: 0x1489, + 0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008, + 0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008, + 0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x070d, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2, + 0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61, + 0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045, + 0xbaa: 0x0725, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa, + 0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040, + 0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x073d, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9, + 0xbbc: 0x1ce9, 0xbbd: 0x0756, 0xbbe: 0x0776, 0xbbf: 0x0040, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a, + 0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0, + 0xbcc: 0x0003, 0xbcd: 0x0003, 0xbce: 0x0340, 0xbcf: 0x0b40, 0xbd0: 0x0018, 0xbd1: 0xe00d, + 0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x0796, + 0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018, + 0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, + 0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040, + 0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a, + 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018, + 0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, + 0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x07b6, 0xbff: 0x0018, + // Block 0x30, offset 0xc00 + 0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018, + 0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018, + 0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018, + 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9, + 0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018, + 0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340, + 0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040, + 0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340, + 0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61, + 0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07d5, + 0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71, + // Block 0x31, offset 0xc40 + 0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61, + 0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07ed, + 0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09, + 0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359, + 0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040, + 0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018, + 0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018, + 0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018, + 0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018, + 0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018, + 0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018, + // Block 0x32, offset 0xc80 + 0xc80: 0x0806, 0xc81: 0x0826, 0xc82: 0x1159, 0xc83: 0x0845, 0xc84: 0x0018, 0xc85: 0x0866, + 0xc86: 0x0886, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x08a5, 0xc8a: 0x0f31, 0xc8b: 0x0249, + 0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41, + 0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018, + 0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269, + 0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08c5, 0xca2: 0x2061, 0xca3: 0x0018, + 0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018, + 0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09, + 0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9, + 0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08e5, + 0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x0905, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9, + 0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018, + 0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151, + 0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279, + 0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399, + 0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x091d, 0xce3: 0x2439, + 0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x093d, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369, + 0xcea: 0x24a9, 0xceb: 0x095d, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61, + 0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x097d, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451, + 0xcf6: 0x099d, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09bd, + 0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61, + // Block 0x34, offset 0xd00 + 0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018, + 0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040, + 0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040, + 0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040, + 0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040, + 0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51, + 0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601, + 0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691, + 0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a1e, 0xd35: 0x0a3e, + 0xd36: 0x0a5e, 0xd37: 0x0a7e, 0xd38: 0x0a9e, 0xd39: 0x0abe, 0xd3a: 0x0ade, 0xd3b: 0x0afe, + 0xd3c: 0x0b1e, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a, + // Block 0x35, offset 0xd40 + 0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a, + 0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040, + 0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040, + 0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040, + 0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b3e, 0xd5d: 0x0b5e, + 0xd5e: 0x0b7e, 0xd5f: 0x0b9e, 0xd60: 0x0bbe, 0xd61: 0x0bde, 0xd62: 0x0bfe, 0xd63: 0x0c1e, + 0xd64: 0x0c3e, 0xd65: 0x0c5e, 0xd66: 0x0c7e, 0xd67: 0x0c9e, 0xd68: 0x0cbe, 0xd69: 0x0cde, + 0xd6a: 0x0cfe, 0xd6b: 0x0d1e, 0xd6c: 0x0d3e, 0xd6d: 0x0d5e, 0xd6e: 0x0d7e, 0xd6f: 0x0d9e, + 0xd70: 0x0dbe, 0xd71: 0x0dde, 0xd72: 0x0dfe, 0xd73: 0x0e1e, 0xd74: 0x0e3e, 0xd75: 0x0e5e, + 0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199, + 0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259, + // Block 0x36, offset 0xd80 + 0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99, + 0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089, + 0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9, + 0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249, + 0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71, + 0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9, + 0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1, + 0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018, + 0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018, + 0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, + 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0008, 0xdc1: 0x0008, 0xdc2: 0x0008, 0xdc3: 0x0008, 0xdc4: 0x0008, 0xdc5: 0x0008, + 0xdc6: 0x0008, 0xdc7: 0x0008, 0xdc8: 0x0008, 0xdc9: 0x0008, 0xdca: 0x0008, 0xdcb: 0x0008, + 0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008, + 0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008, + 0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008, + 0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ed5, + 0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d, + 0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9, + 0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d, + 0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008, + 0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9, + // Block 0x38, offset 0xe00 + 0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008, + 0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008, + 0xe0c: 0xe00d, 0xe0d: 0x0008, 0xe0e: 0xe00d, 0xe0f: 0x0008, 0xe10: 0xe00d, 0xe11: 0x0008, + 0xe12: 0xe00d, 0xe13: 0x0008, 0xe14: 0xe00d, 0xe15: 0x0008, 0xe16: 0xe00d, 0xe17: 0x0008, + 0xe18: 0xe00d, 0xe19: 0x0008, 0xe1a: 0xe00d, 0xe1b: 0x0008, 0xe1c: 0xe00d, 0xe1d: 0x0008, + 0xe1e: 0xe00d, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0xe00d, 0xe23: 0x0008, + 0xe24: 0x0008, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018, + 0xe2a: 0x0018, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0xe01d, 0xe2e: 0x0008, 0xe2f: 0x3308, + 0xe30: 0x3308, 0xe31: 0x3308, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0040, 0xe35: 0x0040, + 0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0018, 0xe3a: 0x0018, 0xe3b: 0x0018, + 0xe3c: 0x0018, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018, + // Block 0x39, offset 0xe40 + 0xe40: 0x2715, 0xe41: 0x2735, 0xe42: 0x2755, 0xe43: 0x2775, 0xe44: 0x2795, 0xe45: 0x27b5, + 0xe46: 0x27d5, 0xe47: 0x27f5, 0xe48: 0x2815, 0xe49: 0x2835, 0xe4a: 0x2855, 0xe4b: 0x2875, + 0xe4c: 0x2895, 0xe4d: 0x28b5, 0xe4e: 0x28d5, 0xe4f: 0x28f5, 0xe50: 0x2915, 0xe51: 0x2935, + 0xe52: 0x2955, 0xe53: 0x2975, 0xe54: 0x2995, 0xe55: 0x29b5, 0xe56: 0x0040, 0xe57: 0x0040, + 0xe58: 0x0040, 0xe59: 0x0040, 0xe5a: 0x0040, 0xe5b: 0x0040, 0xe5c: 0x0040, 0xe5d: 0x0040, + 0xe5e: 0x0040, 0xe5f: 0x0040, 0xe60: 0x0040, 0xe61: 0x0040, 0xe62: 0x0040, 0xe63: 0x0040, + 0xe64: 0x0040, 0xe65: 0x0040, 0xe66: 0x0040, 0xe67: 0x0040, 0xe68: 0x0040, 0xe69: 0x0040, + 0xe6a: 0x0040, 0xe6b: 0x0040, 0xe6c: 0x0040, 0xe6d: 0x0040, 0xe6e: 0x0040, 0xe6f: 0x0040, + 0xe70: 0x0040, 0xe71: 0x0040, 0xe72: 0x0040, 0xe73: 0x0040, 0xe74: 0x0040, 0xe75: 0x0040, + 0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040, + 0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040, + // Block 0x3a, offset 0xe80 + 0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008, + 0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018, + 0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018, + 0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018, + 0xe98: 0x0018, 0xe99: 0x0018, 0xe9a: 0x0018, 0xe9b: 0x0018, 0xe9c: 0x0018, 0xe9d: 0x0018, + 0xe9e: 0x0018, 0xe9f: 0x0018, 0xea0: 0x0018, 0xea1: 0x0018, 0xea2: 0x0018, 0xea3: 0x0018, + 0xea4: 0x0018, 0xea5: 0x0018, 0xea6: 0x0018, 0xea7: 0x0018, 0xea8: 0x0018, 0xea9: 0x0018, + 0xeaa: 0x3308, 0xeab: 0x3308, 0xeac: 0x3308, 0xead: 0x3308, 0xeae: 0x3018, 0xeaf: 0x3018, + 0xeb0: 0x0018, 0xeb1: 0x0018, 0xeb2: 0x0018, 0xeb3: 0x0018, 0xeb4: 0x0018, 0xeb5: 0x0018, + 0xeb6: 0xe125, 0xeb7: 0x0018, 0xeb8: 0x29d5, 0xeb9: 0x29f5, 0xeba: 0x2a15, 0xebb: 0x0018, + 0xebc: 0x0008, 0xebd: 0x0018, 0xebe: 0x0018, 0xebf: 0x0018, + // Block 0x3b, offset 0xec0 + 0xec0: 0x2b55, 0xec1: 0x2b75, 0xec2: 0x2b95, 0xec3: 0x2bb5, 0xec4: 0x2bd5, 0xec5: 0x2bf5, + 0xec6: 0x2bf5, 0xec7: 0x2bf5, 0xec8: 0x2c15, 0xec9: 0x2c15, 0xeca: 0x2c15, 0xecb: 0x2c15, + 0xecc: 0x2c35, 0xecd: 0x2c35, 0xece: 0x2c35, 0xecf: 0x2c55, 0xed0: 0x2c75, 0xed1: 0x2c75, + 0xed2: 0x2a95, 0xed3: 0x2a95, 0xed4: 0x2c75, 0xed5: 0x2c75, 0xed6: 0x2c95, 0xed7: 0x2c95, + 0xed8: 0x2c75, 0xed9: 0x2c75, 0xeda: 0x2a95, 0xedb: 0x2a95, 0xedc: 0x2c75, 0xedd: 0x2c75, + 0xede: 0x2c55, 0xedf: 0x2c55, 0xee0: 0x2cb5, 0xee1: 0x2cb5, 0xee2: 0x2cd5, 0xee3: 0x2cd5, + 0xee4: 0x0040, 0xee5: 0x2cf5, 0xee6: 0x2d15, 0xee7: 0x2d35, 0xee8: 0x2d35, 0xee9: 0x2d55, + 0xeea: 0x2d75, 0xeeb: 0x2d95, 0xeec: 0x2db5, 0xeed: 0x2dd5, 0xeee: 0x2df5, 0xeef: 0x2e15, + 0xef0: 0x2e35, 0xef1: 0x2e55, 0xef2: 0x2e55, 0xef3: 0x2e75, 0xef4: 0x2e95, 0xef5: 0x2e95, + 0xef6: 0x2eb5, 0xef7: 0x2ed5, 0xef8: 0x2e75, 0xef9: 0x2ef5, 0xefa: 0x2f15, 0xefb: 0x2ef5, + 0xefc: 0x2e75, 0xefd: 0x2f35, 0xefe: 0x2f55, 0xeff: 0x2f75, + // Block 0x3c, offset 0xf00 + 0xf00: 0x2f95, 0xf01: 0x2fb5, 0xf02: 0x2d15, 0xf03: 0x2cf5, 0xf04: 0x2fd5, 0xf05: 0x2ff5, + 0xf06: 0x3015, 0xf07: 0x3035, 0xf08: 0x3055, 0xf09: 0x3075, 0xf0a: 0x3095, 0xf0b: 0x30b5, + 0xf0c: 0x30d5, 0xf0d: 0x30f5, 0xf0e: 0x3115, 0xf0f: 0x0040, 0xf10: 0x0018, 0xf11: 0x0018, + 0xf12: 0x3135, 0xf13: 0x3155, 0xf14: 0x3175, 0xf15: 0x3195, 0xf16: 0x31b5, 0xf17: 0x31d5, + 0xf18: 0x31f5, 0xf19: 0x3215, 0xf1a: 0x3235, 0xf1b: 0x3255, 0xf1c: 0x3175, 0xf1d: 0x3275, + 0xf1e: 0x3295, 0xf1f: 0x32b5, 0xf20: 0x0008, 0xf21: 0x0008, 0xf22: 0x0008, 0xf23: 0x0008, + 0xf24: 0x0008, 0xf25: 0x0008, 0xf26: 0x0008, 0xf27: 0x0008, 0xf28: 0x0008, 0xf29: 0x0008, + 0xf2a: 0x0008, 0xf2b: 0x0008, 0xf2c: 0x0008, 0xf2d: 0x0008, 0xf2e: 0x0008, 0xf2f: 0x0008, + 0xf30: 0x0008, 0xf31: 0x0008, 0xf32: 0x0008, 0xf33: 0x0008, 0xf34: 0x0008, 0xf35: 0x0008, + 0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0040, + 0xf3c: 0x0040, 0xf3d: 0x0040, 0xf3e: 0x0040, 0xf3f: 0x0040, + // Block 0x3d, offset 0xf40 + 0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32d5, 0xf45: 0x32f5, + 0xf46: 0x3315, 0xf47: 0x3335, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018, + 0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x3355, 0xf51: 0x3761, + 0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1, + 0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881, + 0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x3375, 0xf61: 0x3395, 0xf62: 0x33b5, 0xf63: 0x33d5, + 0xf64: 0x33f5, 0xf65: 0x33f5, 0xf66: 0x3415, 0xf67: 0x3435, 0xf68: 0x3455, 0xf69: 0x3475, + 0xf6a: 0x3495, 0xf6b: 0x34b5, 0xf6c: 0x34d5, 0xf6d: 0x34f5, 0xf6e: 0x3515, 0xf6f: 0x3535, + 0xf70: 0x3555, 0xf71: 0x3575, 0xf72: 0x3595, 0xf73: 0x35b5, 0xf74: 0x35d5, 0xf75: 0x35f5, + 0xf76: 0x3615, 0xf77: 0x3635, 0xf78: 0x3655, 0xf79: 0x3675, 0xf7a: 0x3695, 0xf7b: 0x36b5, + 0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36d5, 0xf7f: 0x0018, + // Block 0x3e, offset 0xf80 + 0xf80: 0x36f5, 0xf81: 0x3715, 0xf82: 0x3735, 0xf83: 0x3755, 0xf84: 0x3775, 0xf85: 0x3795, + 0xf86: 0x37b5, 0xf87: 0x37d5, 0xf88: 0x37f5, 0xf89: 0x3815, 0xf8a: 0x3835, 0xf8b: 0x3855, + 0xf8c: 0x3875, 0xf8d: 0x3895, 0xf8e: 0x38b5, 0xf8f: 0x38d5, 0xf90: 0x38f5, 0xf91: 0x3915, + 0xf92: 0x3935, 0xf93: 0x3955, 0xf94: 0x3975, 0xf95: 0x3995, 0xf96: 0x39b5, 0xf97: 0x39d5, + 0xf98: 0x39f5, 0xf99: 0x3a15, 0xf9a: 0x3a35, 0xf9b: 0x3a55, 0xf9c: 0x3a75, 0xf9d: 0x3a95, + 0xf9e: 0x3ab5, 0xf9f: 0x3ad5, 0xfa0: 0x3af5, 0xfa1: 0x3b15, 0xfa2: 0x3b35, 0xfa3: 0x3b55, + 0xfa4: 0x3b75, 0xfa5: 0x3b95, 0xfa6: 0x1295, 0xfa7: 0x3bb5, 0xfa8: 0x3bd5, 0xfa9: 0x3bf5, + 0xfaa: 0x3c15, 0xfab: 0x3c35, 0xfac: 0x3c55, 0xfad: 0x3c75, 0xfae: 0x23b5, 0xfaf: 0x3c95, + 0xfb0: 0x3cb5, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999, + 0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29, + 0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69, + 0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69, + 0xfcc: 0x3c99, 0xfcd: 0x3cd5, 0xfce: 0x3cb1, 0xfcf: 0x3cf5, 0xfd0: 0x3d15, 0xfd1: 0x3d2d, + 0xfd2: 0x3d45, 0xfd3: 0x3d5d, 0xfd4: 0x3d75, 0xfd5: 0x3d75, 0xfd6: 0x3d5d, 0xfd7: 0x3d8d, + 0xfd8: 0x07d5, 0xfd9: 0x3da5, 0xfda: 0x3dbd, 0xfdb: 0x3dd5, 0xfdc: 0x3ded, 0xfdd: 0x3e05, + 0xfde: 0x3e1d, 0xfdf: 0x3e35, 0xfe0: 0x3e4d, 0xfe1: 0x3e65, 0xfe2: 0x3e7d, 0xfe3: 0x3e95, + 0xfe4: 0x3ead, 0xfe5: 0x3ead, 0xfe6: 0x3ec5, 0xfe7: 0x3ec5, 0xfe8: 0x3edd, 0xfe9: 0x3edd, + 0xfea: 0x3ef5, 0xfeb: 0x3f0d, 0xfec: 0x3f25, 0xfed: 0x3f3d, 0xfee: 0x3f55, 0xfef: 0x3f55, + 0xff0: 0x3f6d, 0xff1: 0x3f6d, 0xff2: 0x3f6d, 0xff3: 0x3f85, 0xff4: 0x3f9d, 0xff5: 0x3fb5, + 0xff6: 0x3fcd, 0xff7: 0x3fb5, 0xff8: 0x3fe5, 0xff9: 0x3ffd, 0xffa: 0x3f85, 0xffb: 0x4015, + 0xffc: 0x402d, 0xffd: 0x402d, 0xffe: 0x402d, 0xfff: 0x0040, + // Block 0x40, offset 0x1000 + 0x1000: 0x3cc9, 0x1001: 0x3d31, 0x1002: 0x3d99, 0x1003: 0x3e01, 0x1004: 0x3e51, 0x1005: 0x3eb9, + 0x1006: 0x3f09, 0x1007: 0x3f59, 0x1008: 0x3fd9, 0x1009: 0x4041, 0x100a: 0x4091, 0x100b: 0x40e1, + 0x100c: 0x4131, 0x100d: 0x4199, 0x100e: 0x4201, 0x100f: 0x4251, 0x1010: 0x42a1, 0x1011: 0x42d9, + 0x1012: 0x4329, 0x1013: 0x4391, 0x1014: 0x43f9, 0x1015: 0x4431, 0x1016: 0x44b1, 0x1017: 0x4549, + 0x1018: 0x45c9, 0x1019: 0x4619, 0x101a: 0x4699, 0x101b: 0x4719, 0x101c: 0x4781, 0x101d: 0x47d1, + 0x101e: 0x4821, 0x101f: 0x4871, 0x1020: 0x48d9, 0x1021: 0x4959, 0x1022: 0x49c1, 0x1023: 0x4a11, + 0x1024: 0x4a61, 0x1025: 0x4ab1, 0x1026: 0x4ae9, 0x1027: 0x4b21, 0x1028: 0x4b59, 0x1029: 0x4b91, + 0x102a: 0x4be1, 0x102b: 0x4c31, 0x102c: 0x4cb1, 0x102d: 0x4d01, 0x102e: 0x4d69, 0x102f: 0x4de9, + 0x1030: 0x4e39, 0x1031: 0x4e71, 0x1032: 0x4ea9, 0x1033: 0x4f29, 0x1034: 0x4f91, 0x1035: 0x5011, + 0x1036: 0x5061, 0x1037: 0x50e1, 0x1038: 0x5119, 0x1039: 0x5169, 0x103a: 0x51b9, 0x103b: 0x5209, + 0x103c: 0x5259, 0x103d: 0x52a9, 0x103e: 0x5311, 0x103f: 0x5361, + // Block 0x41, offset 0x1040 + 0x1040: 0x5399, 0x1041: 0x53e9, 0x1042: 0x5439, 0x1043: 0x5489, 0x1044: 0x54f1, 0x1045: 0x5541, + 0x1046: 0x5591, 0x1047: 0x55e1, 0x1048: 0x5661, 0x1049: 0x56c9, 0x104a: 0x5701, 0x104b: 0x5781, + 0x104c: 0x57b9, 0x104d: 0x5821, 0x104e: 0x5889, 0x104f: 0x58d9, 0x1050: 0x5929, 0x1051: 0x5979, + 0x1052: 0x59e1, 0x1053: 0x5a19, 0x1054: 0x5a69, 0x1055: 0x5ad1, 0x1056: 0x5b09, 0x1057: 0x5b89, + 0x1058: 0x5bd9, 0x1059: 0x5c01, 0x105a: 0x5c29, 0x105b: 0x5c51, 0x105c: 0x5c79, 0x105d: 0x5ca1, + 0x105e: 0x5cc9, 0x105f: 0x5cf1, 0x1060: 0x5d19, 0x1061: 0x5d41, 0x1062: 0x5d69, 0x1063: 0x5d99, + 0x1064: 0x5dc9, 0x1065: 0x5df9, 0x1066: 0x5e29, 0x1067: 0x5e59, 0x1068: 0x5e89, 0x1069: 0x5eb9, + 0x106a: 0x5ee9, 0x106b: 0x5f19, 0x106c: 0x5f49, 0x106d: 0x5f79, 0x106e: 0x5fa9, 0x106f: 0x5fd9, + 0x1070: 0x6009, 0x1071: 0x4045, 0x1072: 0x6039, 0x1073: 0x6051, 0x1074: 0x4065, 0x1075: 0x6069, + 0x1076: 0x6081, 0x1077: 0x6099, 0x1078: 0x4085, 0x1079: 0x4085, 0x107a: 0x60b1, 0x107b: 0x60c9, + 0x107c: 0x6101, 0x107d: 0x6139, 0x107e: 0x6171, 0x107f: 0x61a9, + // Block 0x42, offset 0x1080 + 0x1080: 0x6211, 0x1081: 0x6229, 0x1082: 0x40a5, 0x1083: 0x6241, 0x1084: 0x6259, 0x1085: 0x6271, + 0x1086: 0x6289, 0x1087: 0x62a1, 0x1088: 0x40c5, 0x1089: 0x62b9, 0x108a: 0x62e1, 0x108b: 0x62f9, + 0x108c: 0x40e5, 0x108d: 0x40e5, 0x108e: 0x6311, 0x108f: 0x6329, 0x1090: 0x6341, 0x1091: 0x4105, + 0x1092: 0x4125, 0x1093: 0x4145, 0x1094: 0x4165, 0x1095: 0x4185, 0x1096: 0x6359, 0x1097: 0x6371, + 0x1098: 0x6389, 0x1099: 0x63a1, 0x109a: 0x63b9, 0x109b: 0x41a5, 0x109c: 0x63d1, 0x109d: 0x63e9, + 0x109e: 0x6401, 0x109f: 0x41c5, 0x10a0: 0x41e5, 0x10a1: 0x6419, 0x10a2: 0x4205, 0x10a3: 0x4225, + 0x10a4: 0x4245, 0x10a5: 0x6431, 0x10a6: 0x4265, 0x10a7: 0x6449, 0x10a8: 0x6479, 0x10a9: 0x6211, + 0x10aa: 0x4285, 0x10ab: 0x42a5, 0x10ac: 0x42c5, 0x10ad: 0x42e5, 0x10ae: 0x64b1, 0x10af: 0x64f1, + 0x10b0: 0x6539, 0x10b1: 0x6551, 0x10b2: 0x4305, 0x10b3: 0x6569, 0x10b4: 0x6581, 0x10b5: 0x6599, + 0x10b6: 0x4325, 0x10b7: 0x65b1, 0x10b8: 0x65c9, 0x10b9: 0x65b1, 0x10ba: 0x65e1, 0x10bb: 0x65f9, + 0x10bc: 0x4345, 0x10bd: 0x6611, 0x10be: 0x6629, 0x10bf: 0x6611, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x4365, 0x10c1: 0x4385, 0x10c2: 0x0040, 0x10c3: 0x6641, 0x10c4: 0x6659, 0x10c5: 0x6671, + 0x10c6: 0x6689, 0x10c7: 0x0040, 0x10c8: 0x66c1, 0x10c9: 0x66d9, 0x10ca: 0x66f1, 0x10cb: 0x6709, + 0x10cc: 0x6721, 0x10cd: 0x6739, 0x10ce: 0x6401, 0x10cf: 0x6751, 0x10d0: 0x6769, 0x10d1: 0x6781, + 0x10d2: 0x43a5, 0x10d3: 0x6799, 0x10d4: 0x6289, 0x10d5: 0x43c5, 0x10d6: 0x43e5, 0x10d7: 0x67b1, + 0x10d8: 0x0040, 0x10d9: 0x4405, 0x10da: 0x67c9, 0x10db: 0x67e1, 0x10dc: 0x67f9, 0x10dd: 0x6811, + 0x10de: 0x6829, 0x10df: 0x6859, 0x10e0: 0x6889, 0x10e1: 0x68b1, 0x10e2: 0x68d9, 0x10e3: 0x6901, + 0x10e4: 0x6929, 0x10e5: 0x6951, 0x10e6: 0x6979, 0x10e7: 0x69a1, 0x10e8: 0x69c9, 0x10e9: 0x69f1, + 0x10ea: 0x6a21, 0x10eb: 0x6a51, 0x10ec: 0x6a81, 0x10ed: 0x6ab1, 0x10ee: 0x6ae1, 0x10ef: 0x6b11, + 0x10f0: 0x6b41, 0x10f1: 0x6b71, 0x10f2: 0x6ba1, 0x10f3: 0x6bd1, 0x10f4: 0x6c01, 0x10f5: 0x6c31, + 0x10f6: 0x6c61, 0x10f7: 0x6c91, 0x10f8: 0x6cc1, 0x10f9: 0x6cf1, 0x10fa: 0x6d21, 0x10fb: 0x6d51, + 0x10fc: 0x6d81, 0x10fd: 0x6db1, 0x10fe: 0x6de1, 0x10ff: 0x4425, + // Block 0x44, offset 0x1100 + 0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008, + 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008, + 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008, + 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008, + 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008, + 0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008, + 0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008, + 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308, + 0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308, + 0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308, + 0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008, + // Block 0x45, offset 0x1140 + 0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008, + 0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008, + 0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008, + 0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008, + 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e11, + 0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008, + 0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008, + 0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008, + 0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, + 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008, + 0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008, + // Block 0x46, offset 0x1180 + 0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018, + 0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018, + 0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018, + 0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008, + 0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008, + 0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008, + 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, + 0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008, + 0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008, + 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008, + 0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008, + // Block 0x47, offset 0x11c0 + 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008, + 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008, + 0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008, + 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008, + 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008, + 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008, + 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008, + 0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008, + 0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008, + 0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d, + 0x11fc: 0x0008, 0x11fd: 0x4445, 0x11fe: 0xe00d, 0x11ff: 0x0008, + // Block 0x48, offset 0x1200 + 0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008, + 0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d, + 0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008, + 0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008, + 0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008, + 0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008, + 0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008, + 0x122a: 0x6e29, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e41, 0x122e: 0x1221, 0x122f: 0x0008, + 0x1230: 0x6e59, 0x1231: 0x6e71, 0x1232: 0x1239, 0x1233: 0x4465, 0x1234: 0xe00d, 0x1235: 0x0008, + 0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0xe00d, 0x1239: 0x0008, 0x123a: 0xe00d, 0x123b: 0x0008, + 0x123c: 0xe00d, 0x123d: 0x0008, 0x123e: 0xe00d, 0x123f: 0x0008, + // Block 0x49, offset 0x1240 + 0x1240: 0x650d, 0x1241: 0x652d, 0x1242: 0x654d, 0x1243: 0x656d, 0x1244: 0x658d, 0x1245: 0x65ad, + 0x1246: 0x65cd, 0x1247: 0x65ed, 0x1248: 0x660d, 0x1249: 0x662d, 0x124a: 0x664d, 0x124b: 0x666d, + 0x124c: 0x668d, 0x124d: 0x66ad, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x66cd, 0x1251: 0x0008, + 0x1252: 0x66ed, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x670d, 0x1256: 0x672d, 0x1257: 0x674d, + 0x1258: 0x676d, 0x1259: 0x678d, 0x125a: 0x67ad, 0x125b: 0x67cd, 0x125c: 0x67ed, 0x125d: 0x680d, + 0x125e: 0x682d, 0x125f: 0x0008, 0x1260: 0x684d, 0x1261: 0x0008, 0x1262: 0x686d, 0x1263: 0x0008, + 0x1264: 0x0008, 0x1265: 0x688d, 0x1266: 0x68ad, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008, + 0x126a: 0x68cd, 0x126b: 0x68ed, 0x126c: 0x690d, 0x126d: 0x692d, 0x126e: 0x694d, 0x126f: 0x696d, + 0x1270: 0x698d, 0x1271: 0x69ad, 0x1272: 0x69cd, 0x1273: 0x69ed, 0x1274: 0x6a0d, 0x1275: 0x6a2d, + 0x1276: 0x6a4d, 0x1277: 0x6a6d, 0x1278: 0x6a8d, 0x1279: 0x6aad, 0x127a: 0x6acd, 0x127b: 0x6aed, + 0x127c: 0x6b0d, 0x127d: 0x6b2d, 0x127e: 0x6b4d, 0x127f: 0x6b6d, + // Block 0x4a, offset 0x1280 + 0x1280: 0x7acd, 0x1281: 0x7aed, 0x1282: 0x7b0d, 0x1283: 0x7b2d, 0x1284: 0x7b4d, 0x1285: 0x7b6d, + 0x1286: 0x7b8d, 0x1287: 0x7bad, 0x1288: 0x7bcd, 0x1289: 0x7bed, 0x128a: 0x7c0d, 0x128b: 0x7c2d, + 0x128c: 0x7c4d, 0x128d: 0x7c6d, 0x128e: 0x7c8d, 0x128f: 0x6ec9, 0x1290: 0x6ef1, 0x1291: 0x6f19, + 0x1292: 0x7cad, 0x1293: 0x7ccd, 0x1294: 0x7ced, 0x1295: 0x6f41, 0x1296: 0x6f69, 0x1297: 0x6f91, + 0x1298: 0x7d0d, 0x1299: 0x7d2d, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040, + 0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040, + 0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040, + 0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040, + 0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040, + 0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040, + 0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x6fb9, 0x12c1: 0x6fd1, 0x12c2: 0x6fe9, 0x12c3: 0x7d4d, 0x12c4: 0x7d6d, 0x12c5: 0x7001, + 0x12c6: 0x7001, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040, + 0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040, + 0x12d2: 0x0040, 0x12d3: 0x7019, 0x12d4: 0x7041, 0x12d5: 0x7069, 0x12d6: 0x7091, 0x12d7: 0x70b9, + 0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x70e1, + 0x12de: 0x3308, 0x12df: 0x7109, 0x12e0: 0x7131, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7149, + 0x12e4: 0x7161, 0x12e5: 0x7179, 0x12e6: 0x7191, 0x12e7: 0x71a9, 0x12e8: 0x71c1, 0x12e9: 0x1fb2, + 0x12ea: 0x71d9, 0x12eb: 0x7201, 0x12ec: 0x7229, 0x12ed: 0x7261, 0x12ee: 0x7299, 0x12ef: 0x72c1, + 0x12f0: 0x72e9, 0x12f1: 0x7311, 0x12f2: 0x7339, 0x12f3: 0x7361, 0x12f4: 0x7389, 0x12f5: 0x73b1, + 0x12f6: 0x73d9, 0x12f7: 0x0040, 0x12f8: 0x7401, 0x12f9: 0x7429, 0x12fa: 0x7451, 0x12fb: 0x7479, + 0x12fc: 0x74a1, 0x12fd: 0x0040, 0x12fe: 0x74c9, 0x12ff: 0x0040, + // Block 0x4c, offset 0x1300 + 0x1300: 0x74f1, 0x1301: 0x7519, 0x1302: 0x0040, 0x1303: 0x7541, 0x1304: 0x7569, 0x1305: 0x0040, + 0x1306: 0x7591, 0x1307: 0x75b9, 0x1308: 0x75e1, 0x1309: 0x7609, 0x130a: 0x7631, 0x130b: 0x7659, + 0x130c: 0x7681, 0x130d: 0x76a9, 0x130e: 0x76d1, 0x130f: 0x76f9, 0x1310: 0x7721, 0x1311: 0x7721, + 0x1312: 0x7739, 0x1313: 0x7739, 0x1314: 0x7739, 0x1315: 0x7739, 0x1316: 0x7751, 0x1317: 0x7751, + 0x1318: 0x7751, 0x1319: 0x7751, 0x131a: 0x7769, 0x131b: 0x7769, 0x131c: 0x7769, 0x131d: 0x7769, + 0x131e: 0x7781, 0x131f: 0x7781, 0x1320: 0x7781, 0x1321: 0x7781, 0x1322: 0x7799, 0x1323: 0x7799, + 0x1324: 0x7799, 0x1325: 0x7799, 0x1326: 0x77b1, 0x1327: 0x77b1, 0x1328: 0x77b1, 0x1329: 0x77b1, + 0x132a: 0x77c9, 0x132b: 0x77c9, 0x132c: 0x77c9, 0x132d: 0x77c9, 0x132e: 0x77e1, 0x132f: 0x77e1, + 0x1330: 0x77e1, 0x1331: 0x77e1, 0x1332: 0x77f9, 0x1333: 0x77f9, 0x1334: 0x77f9, 0x1335: 0x77f9, + 0x1336: 0x7811, 0x1337: 0x7811, 0x1338: 0x7811, 0x1339: 0x7811, 0x133a: 0x7829, 0x133b: 0x7829, + 0x133c: 0x7829, 0x133d: 0x7829, 0x133e: 0x7841, 0x133f: 0x7841, + // Block 0x4d, offset 0x1340 + 0x1340: 0x7841, 0x1341: 0x7841, 0x1342: 0x7859, 0x1343: 0x7859, 0x1344: 0x7871, 0x1345: 0x7871, + 0x1346: 0x7889, 0x1347: 0x7889, 0x1348: 0x78a1, 0x1349: 0x78a1, 0x134a: 0x78b9, 0x134b: 0x78b9, + 0x134c: 0x78d1, 0x134d: 0x78d1, 0x134e: 0x78e9, 0x134f: 0x78e9, 0x1350: 0x78e9, 0x1351: 0x78e9, + 0x1352: 0x7901, 0x1353: 0x7901, 0x1354: 0x7901, 0x1355: 0x7901, 0x1356: 0x7919, 0x1357: 0x7919, + 0x1358: 0x7919, 0x1359: 0x7919, 0x135a: 0x7931, 0x135b: 0x7931, 0x135c: 0x7931, 0x135d: 0x7931, + 0x135e: 0x7949, 0x135f: 0x7949, 0x1360: 0x7961, 0x1361: 0x7961, 0x1362: 0x7961, 0x1363: 0x7961, + 0x1364: 0x7979, 0x1365: 0x7979, 0x1366: 0x7991, 0x1367: 0x7991, 0x1368: 0x7991, 0x1369: 0x7991, + 0x136a: 0x79a9, 0x136b: 0x79a9, 0x136c: 0x79a9, 0x136d: 0x79a9, 0x136e: 0x79c1, 0x136f: 0x79c1, + 0x1370: 0x79d9, 0x1371: 0x79d9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818, + 0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818, + 0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818, + // Block 0x4e, offset 0x1380 + 0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040, + 0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040, + 0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040, + 0x1392: 0x0040, 0x1393: 0x79f1, 0x1394: 0x79f1, 0x1395: 0x79f1, 0x1396: 0x79f1, 0x1397: 0x7a09, + 0x1398: 0x7a09, 0x1399: 0x7a21, 0x139a: 0x7a21, 0x139b: 0x7a39, 0x139c: 0x7a39, 0x139d: 0x0479, + 0x139e: 0x7a51, 0x139f: 0x7a51, 0x13a0: 0x7a69, 0x13a1: 0x7a69, 0x13a2: 0x7a81, 0x13a3: 0x7a81, + 0x13a4: 0x7a99, 0x13a5: 0x7a99, 0x13a6: 0x7a99, 0x13a7: 0x7a99, 0x13a8: 0x7ab1, 0x13a9: 0x7ab1, + 0x13aa: 0x7ac9, 0x13ab: 0x7ac9, 0x13ac: 0x7af1, 0x13ad: 0x7af1, 0x13ae: 0x7b19, 0x13af: 0x7b19, + 0x13b0: 0x7b41, 0x13b1: 0x7b41, 0x13b2: 0x7b69, 0x13b3: 0x7b69, 0x13b4: 0x7b91, 0x13b5: 0x7b91, + 0x13b6: 0x7bb9, 0x13b7: 0x7bb9, 0x13b8: 0x7bb9, 0x13b9: 0x7be1, 0x13ba: 0x7be1, 0x13bb: 0x7be1, + 0x13bc: 0x7c09, 0x13bd: 0x7c09, 0x13be: 0x7c09, 0x13bf: 0x7c09, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x85f9, 0x13c1: 0x8621, 0x13c2: 0x8649, 0x13c3: 0x8671, 0x13c4: 0x8699, 0x13c5: 0x86c1, + 0x13c6: 0x86e9, 0x13c7: 0x8711, 0x13c8: 0x8739, 0x13c9: 0x8761, 0x13ca: 0x8789, 0x13cb: 0x87b1, + 0x13cc: 0x87d9, 0x13cd: 0x8801, 0x13ce: 0x8829, 0x13cf: 0x8851, 0x13d0: 0x8879, 0x13d1: 0x88a1, + 0x13d2: 0x88c9, 0x13d3: 0x88f1, 0x13d4: 0x8919, 0x13d5: 0x8941, 0x13d6: 0x8969, 0x13d7: 0x8991, + 0x13d8: 0x89b9, 0x13d9: 0x89e1, 0x13da: 0x8a09, 0x13db: 0x8a31, 0x13dc: 0x8a59, 0x13dd: 0x8a81, + 0x13de: 0x8aaa, 0x13df: 0x8ada, 0x13e0: 0x8b0a, 0x13e1: 0x8b3a, 0x13e2: 0x8b6a, 0x13e3: 0x8b9a, + 0x13e4: 0x8bc9, 0x13e5: 0x8bf1, 0x13e6: 0x7c71, 0x13e7: 0x8c19, 0x13e8: 0x7be1, 0x13e9: 0x7c99, + 0x13ea: 0x8c41, 0x13eb: 0x8c69, 0x13ec: 0x7d39, 0x13ed: 0x8c91, 0x13ee: 0x7d61, 0x13ef: 0x7d89, + 0x13f0: 0x8cb9, 0x13f1: 0x8ce1, 0x13f2: 0x7e29, 0x13f3: 0x8d09, 0x13f4: 0x7e51, 0x13f5: 0x7e79, + 0x13f6: 0x8d31, 0x13f7: 0x8d59, 0x13f8: 0x7ec9, 0x13f9: 0x8d81, 0x13fa: 0x7ef1, 0x13fb: 0x7f19, + 0x13fc: 0x83a1, 0x13fd: 0x83c9, 0x13fe: 0x8441, 0x13ff: 0x8469, + // Block 0x50, offset 0x1400 + 0x1400: 0x8491, 0x1401: 0x8531, 0x1402: 0x8559, 0x1403: 0x8581, 0x1404: 0x85a9, 0x1405: 0x8649, + 0x1406: 0x8671, 0x1407: 0x8699, 0x1408: 0x8da9, 0x1409: 0x8739, 0x140a: 0x8dd1, 0x140b: 0x8df9, + 0x140c: 0x8829, 0x140d: 0x8e21, 0x140e: 0x8851, 0x140f: 0x8879, 0x1410: 0x8a81, 0x1411: 0x8e49, + 0x1412: 0x8e71, 0x1413: 0x89b9, 0x1414: 0x8e99, 0x1415: 0x89e1, 0x1416: 0x8a09, 0x1417: 0x7c21, + 0x1418: 0x7c49, 0x1419: 0x8ec1, 0x141a: 0x7c71, 0x141b: 0x8ee9, 0x141c: 0x7cc1, 0x141d: 0x7ce9, + 0x141e: 0x7d11, 0x141f: 0x7d39, 0x1420: 0x8f11, 0x1421: 0x7db1, 0x1422: 0x7dd9, 0x1423: 0x7e01, + 0x1424: 0x7e29, 0x1425: 0x8f39, 0x1426: 0x7ec9, 0x1427: 0x7f41, 0x1428: 0x7f69, 0x1429: 0x7f91, + 0x142a: 0x7fb9, 0x142b: 0x7fe1, 0x142c: 0x8031, 0x142d: 0x8059, 0x142e: 0x8081, 0x142f: 0x80a9, + 0x1430: 0x80d1, 0x1431: 0x80f9, 0x1432: 0x8f61, 0x1433: 0x8121, 0x1434: 0x8149, 0x1435: 0x8171, + 0x1436: 0x8199, 0x1437: 0x81c1, 0x1438: 0x81e9, 0x1439: 0x8239, 0x143a: 0x8261, 0x143b: 0x8289, + 0x143c: 0x82b1, 0x143d: 0x82d9, 0x143e: 0x8301, 0x143f: 0x8329, + // Block 0x51, offset 0x1440 + 0x1440: 0x8351, 0x1441: 0x8379, 0x1442: 0x83f1, 0x1443: 0x8419, 0x1444: 0x84b9, 0x1445: 0x84e1, + 0x1446: 0x8509, 0x1447: 0x8531, 0x1448: 0x8559, 0x1449: 0x85d1, 0x144a: 0x85f9, 0x144b: 0x8621, + 0x144c: 0x8649, 0x144d: 0x8f89, 0x144e: 0x86c1, 0x144f: 0x86e9, 0x1450: 0x8711, 0x1451: 0x8739, + 0x1452: 0x87b1, 0x1453: 0x87d9, 0x1454: 0x8801, 0x1455: 0x8829, 0x1456: 0x8fb1, 0x1457: 0x88a1, + 0x1458: 0x88c9, 0x1459: 0x8fd9, 0x145a: 0x8941, 0x145b: 0x8969, 0x145c: 0x8991, 0x145d: 0x89b9, + 0x145e: 0x9001, 0x145f: 0x7c71, 0x1460: 0x8ee9, 0x1461: 0x7d39, 0x1462: 0x8f11, 0x1463: 0x7e29, + 0x1464: 0x8f39, 0x1465: 0x7ec9, 0x1466: 0x9029, 0x1467: 0x80d1, 0x1468: 0x9051, 0x1469: 0x9079, + 0x146a: 0x90a1, 0x146b: 0x8531, 0x146c: 0x8559, 0x146d: 0x8649, 0x146e: 0x8829, 0x146f: 0x8fb1, + 0x1470: 0x89b9, 0x1471: 0x9001, 0x1472: 0x90c9, 0x1473: 0x9101, 0x1474: 0x9139, 0x1475: 0x9171, + 0x1476: 0x9199, 0x1477: 0x91c1, 0x1478: 0x91e9, 0x1479: 0x9211, 0x147a: 0x9239, 0x147b: 0x9261, + 0x147c: 0x9289, 0x147d: 0x92b1, 0x147e: 0x92d9, 0x147f: 0x9301, + // Block 0x52, offset 0x1480 + 0x1480: 0x9329, 0x1481: 0x9351, 0x1482: 0x9379, 0x1483: 0x93a1, 0x1484: 0x93c9, 0x1485: 0x93f1, + 0x1486: 0x9419, 0x1487: 0x9441, 0x1488: 0x9469, 0x1489: 0x9491, 0x148a: 0x94b9, 0x148b: 0x94e1, + 0x148c: 0x9079, 0x148d: 0x9509, 0x148e: 0x9531, 0x148f: 0x9559, 0x1490: 0x9581, 0x1491: 0x9171, + 0x1492: 0x9199, 0x1493: 0x91c1, 0x1494: 0x91e9, 0x1495: 0x9211, 0x1496: 0x9239, 0x1497: 0x9261, + 0x1498: 0x9289, 0x1499: 0x92b1, 0x149a: 0x92d9, 0x149b: 0x9301, 0x149c: 0x9329, 0x149d: 0x9351, + 0x149e: 0x9379, 0x149f: 0x93a1, 0x14a0: 0x93c9, 0x14a1: 0x93f1, 0x14a2: 0x9419, 0x14a3: 0x9441, + 0x14a4: 0x9469, 0x14a5: 0x9491, 0x14a6: 0x94b9, 0x14a7: 0x94e1, 0x14a8: 0x9079, 0x14a9: 0x9509, + 0x14aa: 0x9531, 0x14ab: 0x9559, 0x14ac: 0x9581, 0x14ad: 0x9491, 0x14ae: 0x94b9, 0x14af: 0x94e1, + 0x14b0: 0x9079, 0x14b1: 0x9051, 0x14b2: 0x90a1, 0x14b3: 0x8211, 0x14b4: 0x8059, 0x14b5: 0x8081, + 0x14b6: 0x80a9, 0x14b7: 0x9491, 0x14b8: 0x94b9, 0x14b9: 0x94e1, 0x14ba: 0x8211, 0x14bb: 0x8239, + 0x14bc: 0x95a9, 0x14bd: 0x95a9, 0x14be: 0x0018, 0x14bf: 0x0018, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040, + 0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040, + 0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x95d1, 0x14d1: 0x9609, + 0x14d2: 0x9609, 0x14d3: 0x9641, 0x14d4: 0x9679, 0x14d5: 0x96b1, 0x14d6: 0x96e9, 0x14d7: 0x9721, + 0x14d8: 0x9759, 0x14d9: 0x9759, 0x14da: 0x9791, 0x14db: 0x97c9, 0x14dc: 0x9801, 0x14dd: 0x9839, + 0x14de: 0x9871, 0x14df: 0x98a9, 0x14e0: 0x98a9, 0x14e1: 0x98e1, 0x14e2: 0x9919, 0x14e3: 0x9919, + 0x14e4: 0x9951, 0x14e5: 0x9951, 0x14e6: 0x9989, 0x14e7: 0x99c1, 0x14e8: 0x99c1, 0x14e9: 0x99f9, + 0x14ea: 0x9a31, 0x14eb: 0x9a31, 0x14ec: 0x9a69, 0x14ed: 0x9a69, 0x14ee: 0x9aa1, 0x14ef: 0x9ad9, + 0x14f0: 0x9ad9, 0x14f1: 0x9b11, 0x14f2: 0x9b11, 0x14f3: 0x9b49, 0x14f4: 0x9b81, 0x14f5: 0x9bb9, + 0x14f6: 0x9bf1, 0x14f7: 0x9bf1, 0x14f8: 0x9c29, 0x14f9: 0x9c61, 0x14fa: 0x9c99, 0x14fb: 0x9cd1, + 0x14fc: 0x9d09, 0x14fd: 0x9d09, 0x14fe: 0x9d41, 0x14ff: 0x9d79, + // Block 0x54, offset 0x1500 + 0x1500: 0xa949, 0x1501: 0xa981, 0x1502: 0xa9b9, 0x1503: 0xa8a1, 0x1504: 0x9bb9, 0x1505: 0x9989, + 0x1506: 0xa9f1, 0x1507: 0xaa29, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040, + 0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040, + 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040, + 0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040, + 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040, + 0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040, + 0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, + 0x1530: 0xaa61, 0x1531: 0xaa99, 0x1532: 0xaad1, 0x1533: 0xab19, 0x1534: 0xab61, 0x1535: 0xaba9, + 0x1536: 0xabf1, 0x1537: 0xac39, 0x1538: 0xac81, 0x1539: 0xacc9, 0x153a: 0xad02, 0x153b: 0xae12, + 0x153c: 0xae91, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040, + // Block 0x55, offset 0x1540 + 0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0, + 0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0, + 0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaeda, 0x1551: 0x7d8d, + 0x1552: 0x0040, 0x1553: 0xaeea, 0x1554: 0x03c2, 0x1555: 0xaefa, 0x1556: 0xaf0a, 0x1557: 0x7dad, + 0x1558: 0x7dcd, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040, + 0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308, + 0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308, + 0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308, + 0x1570: 0x0040, 0x1571: 0x7ded, 0x1572: 0x7e0d, 0x1573: 0xaf1a, 0x1574: 0xaf1a, 0x1575: 0x1fd2, + 0x1576: 0x1fe2, 0x1577: 0xaf2a, 0x1578: 0xaf3a, 0x1579: 0x7e2d, 0x157a: 0x7e4d, 0x157b: 0x7e6d, + 0x157c: 0x7e2d, 0x157d: 0x7e8d, 0x157e: 0x7ead, 0x157f: 0x7e8d, + // Block 0x56, offset 0x1580 + 0x1580: 0x7ecd, 0x1581: 0x7eed, 0x1582: 0x7f0d, 0x1583: 0x7eed, 0x1584: 0x7f2d, 0x1585: 0x0018, + 0x1586: 0x0018, 0x1587: 0xaf4a, 0x1588: 0xaf5a, 0x1589: 0x7f4e, 0x158a: 0x7f6e, 0x158b: 0x7f8e, + 0x158c: 0x7fae, 0x158d: 0xaf1a, 0x158e: 0xaf1a, 0x158f: 0xaf1a, 0x1590: 0xaeda, 0x1591: 0x7fcd, + 0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaeea, 0x1596: 0xaf0a, 0x1597: 0xaefa, + 0x1598: 0x7fed, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf2a, 0x159c: 0xaf3a, 0x159d: 0x7ecd, + 0x159e: 0x7f2d, 0x159f: 0xaf6a, 0x15a0: 0xaf7a, 0x15a1: 0xaf8a, 0x15a2: 0x1fb2, 0x15a3: 0xaf99, + 0x15a4: 0xafaa, 0x15a5: 0xafba, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xafca, 0x15a9: 0xafda, + 0x15aa: 0xafea, 0x15ab: 0xaffa, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040, + 0x15b0: 0x800e, 0x15b1: 0xb009, 0x15b2: 0x802e, 0x15b3: 0x0808, 0x15b4: 0x804e, 0x15b5: 0x0040, + 0x15b6: 0x806e, 0x15b7: 0xb031, 0x15b8: 0x808e, 0x15b9: 0xb059, 0x15ba: 0x80ae, 0x15bb: 0xb081, + 0x15bc: 0x80ce, 0x15bd: 0xb0a9, 0x15be: 0x80ee, 0x15bf: 0xb0d1, + // Block 0x57, offset 0x15c0 + 0x15c0: 0xb0f9, 0x15c1: 0xb111, 0x15c2: 0xb111, 0x15c3: 0xb129, 0x15c4: 0xb129, 0x15c5: 0xb141, + 0x15c6: 0xb141, 0x15c7: 0xb159, 0x15c8: 0xb159, 0x15c9: 0xb171, 0x15ca: 0xb171, 0x15cb: 0xb171, + 0x15cc: 0xb171, 0x15cd: 0xb189, 0x15ce: 0xb189, 0x15cf: 0xb1a1, 0x15d0: 0xb1a1, 0x15d1: 0xb1a1, + 0x15d2: 0xb1a1, 0x15d3: 0xb1b9, 0x15d4: 0xb1b9, 0x15d5: 0xb1d1, 0x15d6: 0xb1d1, 0x15d7: 0xb1d1, + 0x15d8: 0xb1d1, 0x15d9: 0xb1e9, 0x15da: 0xb1e9, 0x15db: 0xb1e9, 0x15dc: 0xb1e9, 0x15dd: 0xb201, + 0x15de: 0xb201, 0x15df: 0xb201, 0x15e0: 0xb201, 0x15e1: 0xb219, 0x15e2: 0xb219, 0x15e3: 0xb219, + 0x15e4: 0xb219, 0x15e5: 0xb231, 0x15e6: 0xb231, 0x15e7: 0xb231, 0x15e8: 0xb231, 0x15e9: 0xb249, + 0x15ea: 0xb249, 0x15eb: 0xb261, 0x15ec: 0xb261, 0x15ed: 0xb279, 0x15ee: 0xb279, 0x15ef: 0xb291, + 0x15f0: 0xb291, 0x15f1: 0xb2a9, 0x15f2: 0xb2a9, 0x15f3: 0xb2a9, 0x15f4: 0xb2a9, 0x15f5: 0xb2c1, + 0x15f6: 0xb2c1, 0x15f7: 0xb2c1, 0x15f8: 0xb2c1, 0x15f9: 0xb2d9, 0x15fa: 0xb2d9, 0x15fb: 0xb2d9, + 0x15fc: 0xb2d9, 0x15fd: 0xb2f1, 0x15fe: 0xb2f1, 0x15ff: 0xb2f1, + // Block 0x58, offset 0x1600 + 0x1600: 0xb2f1, 0x1601: 0xb309, 0x1602: 0xb309, 0x1603: 0xb309, 0x1604: 0xb309, 0x1605: 0xb321, + 0x1606: 0xb321, 0x1607: 0xb321, 0x1608: 0xb321, 0x1609: 0xb339, 0x160a: 0xb339, 0x160b: 0xb339, + 0x160c: 0xb339, 0x160d: 0xb351, 0x160e: 0xb351, 0x160f: 0xb351, 0x1610: 0xb351, 0x1611: 0xb369, + 0x1612: 0xb369, 0x1613: 0xb369, 0x1614: 0xb369, 0x1615: 0xb381, 0x1616: 0xb381, 0x1617: 0xb381, + 0x1618: 0xb381, 0x1619: 0xb399, 0x161a: 0xb399, 0x161b: 0xb399, 0x161c: 0xb399, 0x161d: 0xb3b1, + 0x161e: 0xb3b1, 0x161f: 0xb3b1, 0x1620: 0xb3b1, 0x1621: 0xb3c9, 0x1622: 0xb3c9, 0x1623: 0xb3c9, + 0x1624: 0xb3c9, 0x1625: 0xb3e1, 0x1626: 0xb3e1, 0x1627: 0xb3e1, 0x1628: 0xb3e1, 0x1629: 0xb3f9, + 0x162a: 0xb3f9, 0x162b: 0xb3f9, 0x162c: 0xb3f9, 0x162d: 0xb411, 0x162e: 0xb411, 0x162f: 0x7ab1, + 0x1630: 0x7ab1, 0x1631: 0xb429, 0x1632: 0xb429, 0x1633: 0xb429, 0x1634: 0xb429, 0x1635: 0xb441, + 0x1636: 0xb441, 0x1637: 0xb469, 0x1638: 0xb469, 0x1639: 0xb491, 0x163a: 0xb491, 0x163b: 0xb4b9, + 0x163c: 0xb4b9, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0, + // Block 0x59, offset 0x1640 + 0x1640: 0x0040, 0x1641: 0xaefa, 0x1642: 0xb4e2, 0x1643: 0xaf6a, 0x1644: 0xafda, 0x1645: 0xafea, + 0x1646: 0xaf7a, 0x1647: 0xb4f2, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xaf8a, 0x164b: 0x1fb2, + 0x164c: 0xaeda, 0x164d: 0xaf99, 0x164e: 0x29d1, 0x164f: 0xb502, 0x1650: 0x1f41, 0x1651: 0x00c9, + 0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81, + 0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaeea, 0x165b: 0x03c2, 0x165c: 0xafaa, 0x165d: 0x1fc2, + 0x165e: 0xafba, 0x165f: 0xaf0a, 0x1660: 0xaffa, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159, + 0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41, + 0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9, + 0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9, + 0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf4a, + 0x167c: 0xafca, 0x167d: 0xaf5a, 0x167e: 0xb512, 0x167f: 0xaf1a, + // Block 0x5a, offset 0x1680 + 0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09, + 0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51, + 0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039, + 0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279, + 0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf2a, 0x169c: 0xb522, 0x169d: 0xaf3a, + 0x169e: 0xb532, 0x169f: 0x810d, 0x16a0: 0x812d, 0x16a1: 0x29d1, 0x16a2: 0x814d, 0x16a3: 0x814d, + 0x16a4: 0x816d, 0x16a5: 0x818d, 0x16a6: 0x81ad, 0x16a7: 0x81cd, 0x16a8: 0x81ed, 0x16a9: 0x820d, + 0x16aa: 0x822d, 0x16ab: 0x824d, 0x16ac: 0x826d, 0x16ad: 0x828d, 0x16ae: 0x82ad, 0x16af: 0x82cd, + 0x16b0: 0x82ed, 0x16b1: 0x830d, 0x16b2: 0x832d, 0x16b3: 0x834d, 0x16b4: 0x836d, 0x16b5: 0x838d, + 0x16b6: 0x83ad, 0x16b7: 0x83cd, 0x16b8: 0x83ed, 0x16b9: 0x840d, 0x16ba: 0x842d, 0x16bb: 0x844d, + 0x16bc: 0x81ed, 0x16bd: 0x846d, 0x16be: 0x848d, 0x16bf: 0x824d, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x84ad, 0x16c1: 0x84cd, 0x16c2: 0x84ed, 0x16c3: 0x850d, 0x16c4: 0x852d, 0x16c5: 0x854d, + 0x16c6: 0x856d, 0x16c7: 0x858d, 0x16c8: 0x850d, 0x16c9: 0x85ad, 0x16ca: 0x850d, 0x16cb: 0x85cd, + 0x16cc: 0x85cd, 0x16cd: 0x85ed, 0x16ce: 0x85ed, 0x16cf: 0x860d, 0x16d0: 0x854d, 0x16d1: 0x862d, + 0x16d2: 0x864d, 0x16d3: 0x862d, 0x16d4: 0x866d, 0x16d5: 0x864d, 0x16d6: 0x868d, 0x16d7: 0x868d, + 0x16d8: 0x86ad, 0x16d9: 0x86ad, 0x16da: 0x86cd, 0x16db: 0x86cd, 0x16dc: 0x864d, 0x16dd: 0x814d, + 0x16de: 0x86ed, 0x16df: 0x870d, 0x16e0: 0x0040, 0x16e1: 0x872d, 0x16e2: 0x874d, 0x16e3: 0x876d, + 0x16e4: 0x878d, 0x16e5: 0x876d, 0x16e6: 0x87ad, 0x16e7: 0x87cd, 0x16e8: 0x87ed, 0x16e9: 0x87ed, + 0x16ea: 0x880d, 0x16eb: 0x880d, 0x16ec: 0x882d, 0x16ed: 0x882d, 0x16ee: 0x880d, 0x16ef: 0x880d, + 0x16f0: 0x884d, 0x16f1: 0x886d, 0x16f2: 0x888d, 0x16f3: 0x88ad, 0x16f4: 0x88cd, 0x16f5: 0x88ed, + 0x16f6: 0x88ed, 0x16f7: 0x88ed, 0x16f8: 0x890d, 0x16f9: 0x890d, 0x16fa: 0x890d, 0x16fb: 0x890d, + 0x16fc: 0x87ed, 0x16fd: 0x87ed, 0x16fe: 0x87ed, 0x16ff: 0x0040, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x874d, 0x1703: 0x872d, 0x1704: 0x892d, 0x1705: 0x872d, + 0x1706: 0x874d, 0x1707: 0x872d, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x894d, 0x170b: 0x874d, + 0x170c: 0x896d, 0x170d: 0x892d, 0x170e: 0x896d, 0x170f: 0x874d, 0x1710: 0x0040, 0x1711: 0x0040, + 0x1712: 0x898d, 0x1713: 0x89ad, 0x1714: 0x88ad, 0x1715: 0x896d, 0x1716: 0x892d, 0x1717: 0x896d, + 0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x89cd, 0x171b: 0x89ed, 0x171c: 0x89cd, 0x171d: 0x0040, + 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb541, 0x1721: 0xb559, 0x1722: 0xb571, 0x1723: 0x8a0e, + 0x1724: 0xb589, 0x1725: 0xb5a1, 0x1726: 0x8a2d, 0x1727: 0x0040, 0x1728: 0x8a4d, 0x1729: 0x8a6d, + 0x172a: 0x8a8d, 0x172b: 0x8a6d, 0x172c: 0x8aad, 0x172d: 0x8acd, 0x172e: 0x8aed, 0x172f: 0x0040, + 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, + 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340, + 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, + // Block 0x5d, offset 0x1740 + 0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08, + 0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808, + 0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08, + 0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908, + 0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08, + 0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808, + 0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040, + 0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18, + 0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818, + 0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040, + 0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040, + // Block 0x5e, offset 0x1780 + 0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08, + 0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08, + 0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08, + 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040, + 0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040, + 0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040, + 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18, + 0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818, + 0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040, + 0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040, + 0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008, + 0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008, + 0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040, + 0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008, + 0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008, + 0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008, + 0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040, + 0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008, + 0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008, + 0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x3308, + 0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008, + // Block 0x60, offset 0x1800 + 0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040, + 0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008, + 0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040, + 0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008, + 0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008, + 0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008, + 0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308, + 0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040, + 0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040, + 0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040, + 0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040, + // Block 0x61, offset 0x1840 + 0x1840: 0x0039, 0x1841: 0x0ee9, 0x1842: 0x1159, 0x1843: 0x0ef9, 0x1844: 0x0f09, 0x1845: 0x1199, + 0x1846: 0x0f31, 0x1847: 0x0249, 0x1848: 0x0f41, 0x1849: 0x0259, 0x184a: 0x0f51, 0x184b: 0x0359, + 0x184c: 0x0f61, 0x184d: 0x0f71, 0x184e: 0x00d9, 0x184f: 0x0f99, 0x1850: 0x2039, 0x1851: 0x0269, + 0x1852: 0x01d9, 0x1853: 0x0fa9, 0x1854: 0x0fb9, 0x1855: 0x1089, 0x1856: 0x0279, 0x1857: 0x0369, + 0x1858: 0x0289, 0x1859: 0x13d1, 0x185a: 0x0039, 0x185b: 0x0ee9, 0x185c: 0x1159, 0x185d: 0x0ef9, + 0x185e: 0x0f09, 0x185f: 0x1199, 0x1860: 0x0f31, 0x1861: 0x0249, 0x1862: 0x0f41, 0x1863: 0x0259, + 0x1864: 0x0f51, 0x1865: 0x0359, 0x1866: 0x0f61, 0x1867: 0x0f71, 0x1868: 0x00d9, 0x1869: 0x0f99, + 0x186a: 0x2039, 0x186b: 0x0269, 0x186c: 0x01d9, 0x186d: 0x0fa9, 0x186e: 0x0fb9, 0x186f: 0x1089, + 0x1870: 0x0279, 0x1871: 0x0369, 0x1872: 0x0289, 0x1873: 0x13d1, 0x1874: 0x0039, 0x1875: 0x0ee9, + 0x1876: 0x1159, 0x1877: 0x0ef9, 0x1878: 0x0f09, 0x1879: 0x1199, 0x187a: 0x0f31, 0x187b: 0x0249, + 0x187c: 0x0f41, 0x187d: 0x0259, 0x187e: 0x0f51, 0x187f: 0x0359, + // Block 0x62, offset 0x1880 + 0x1880: 0x0f61, 0x1881: 0x0f71, 0x1882: 0x00d9, 0x1883: 0x0f99, 0x1884: 0x2039, 0x1885: 0x0269, + 0x1886: 0x01d9, 0x1887: 0x0fa9, 0x1888: 0x0fb9, 0x1889: 0x1089, 0x188a: 0x0279, 0x188b: 0x0369, + 0x188c: 0x0289, 0x188d: 0x13d1, 0x188e: 0x0039, 0x188f: 0x0ee9, 0x1890: 0x1159, 0x1891: 0x0ef9, + 0x1892: 0x0f09, 0x1893: 0x1199, 0x1894: 0x0f31, 0x1895: 0x0040, 0x1896: 0x0f41, 0x1897: 0x0259, + 0x1898: 0x0f51, 0x1899: 0x0359, 0x189a: 0x0f61, 0x189b: 0x0f71, 0x189c: 0x00d9, 0x189d: 0x0f99, + 0x189e: 0x2039, 0x189f: 0x0269, 0x18a0: 0x01d9, 0x18a1: 0x0fa9, 0x18a2: 0x0fb9, 0x18a3: 0x1089, + 0x18a4: 0x0279, 0x18a5: 0x0369, 0x18a6: 0x0289, 0x18a7: 0x13d1, 0x18a8: 0x0039, 0x18a9: 0x0ee9, + 0x18aa: 0x1159, 0x18ab: 0x0ef9, 0x18ac: 0x0f09, 0x18ad: 0x1199, 0x18ae: 0x0f31, 0x18af: 0x0249, + 0x18b0: 0x0f41, 0x18b1: 0x0259, 0x18b2: 0x0f51, 0x18b3: 0x0359, 0x18b4: 0x0f61, 0x18b5: 0x0f71, + 0x18b6: 0x00d9, 0x18b7: 0x0f99, 0x18b8: 0x2039, 0x18b9: 0x0269, 0x18ba: 0x01d9, 0x18bb: 0x0fa9, + 0x18bc: 0x0fb9, 0x18bd: 0x1089, 0x18be: 0x0279, 0x18bf: 0x0369, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0289, 0x18c1: 0x13d1, 0x18c2: 0x0039, 0x18c3: 0x0ee9, 0x18c4: 0x1159, 0x18c5: 0x0ef9, + 0x18c6: 0x0f09, 0x18c7: 0x1199, 0x18c8: 0x0f31, 0x18c9: 0x0249, 0x18ca: 0x0f41, 0x18cb: 0x0259, + 0x18cc: 0x0f51, 0x18cd: 0x0359, 0x18ce: 0x0f61, 0x18cf: 0x0f71, 0x18d0: 0x00d9, 0x18d1: 0x0f99, + 0x18d2: 0x2039, 0x18d3: 0x0269, 0x18d4: 0x01d9, 0x18d5: 0x0fa9, 0x18d6: 0x0fb9, 0x18d7: 0x1089, + 0x18d8: 0x0279, 0x18d9: 0x0369, 0x18da: 0x0289, 0x18db: 0x13d1, 0x18dc: 0x0039, 0x18dd: 0x0040, + 0x18de: 0x1159, 0x18df: 0x0ef9, 0x18e0: 0x0040, 0x18e1: 0x0040, 0x18e2: 0x0f31, 0x18e3: 0x0040, + 0x18e4: 0x0040, 0x18e5: 0x0259, 0x18e6: 0x0f51, 0x18e7: 0x0040, 0x18e8: 0x0040, 0x18e9: 0x0f71, + 0x18ea: 0x00d9, 0x18eb: 0x0f99, 0x18ec: 0x2039, 0x18ed: 0x0040, 0x18ee: 0x01d9, 0x18ef: 0x0fa9, + 0x18f0: 0x0fb9, 0x18f1: 0x1089, 0x18f2: 0x0279, 0x18f3: 0x0369, 0x18f4: 0x0289, 0x18f5: 0x13d1, + 0x18f6: 0x0039, 0x18f7: 0x0ee9, 0x18f8: 0x1159, 0x18f9: 0x0ef9, 0x18fa: 0x0040, 0x18fb: 0x1199, + 0x18fc: 0x0040, 0x18fd: 0x0249, 0x18fe: 0x0f41, 0x18ff: 0x0259, + // Block 0x64, offset 0x1900 + 0x1900: 0x0f51, 0x1901: 0x0359, 0x1902: 0x0f61, 0x1903: 0x0f71, 0x1904: 0x0040, 0x1905: 0x0f99, + 0x1906: 0x2039, 0x1907: 0x0269, 0x1908: 0x01d9, 0x1909: 0x0fa9, 0x190a: 0x0fb9, 0x190b: 0x1089, + 0x190c: 0x0279, 0x190d: 0x0369, 0x190e: 0x0289, 0x190f: 0x13d1, 0x1910: 0x0039, 0x1911: 0x0ee9, + 0x1912: 0x1159, 0x1913: 0x0ef9, 0x1914: 0x0f09, 0x1915: 0x1199, 0x1916: 0x0f31, 0x1917: 0x0249, + 0x1918: 0x0f41, 0x1919: 0x0259, 0x191a: 0x0f51, 0x191b: 0x0359, 0x191c: 0x0f61, 0x191d: 0x0f71, + 0x191e: 0x00d9, 0x191f: 0x0f99, 0x1920: 0x2039, 0x1921: 0x0269, 0x1922: 0x01d9, 0x1923: 0x0fa9, + 0x1924: 0x0fb9, 0x1925: 0x1089, 0x1926: 0x0279, 0x1927: 0x0369, 0x1928: 0x0289, 0x1929: 0x13d1, + 0x192a: 0x0039, 0x192b: 0x0ee9, 0x192c: 0x1159, 0x192d: 0x0ef9, 0x192e: 0x0f09, 0x192f: 0x1199, + 0x1930: 0x0f31, 0x1931: 0x0249, 0x1932: 0x0f41, 0x1933: 0x0259, 0x1934: 0x0f51, 0x1935: 0x0359, + 0x1936: 0x0f61, 0x1937: 0x0f71, 0x1938: 0x00d9, 0x1939: 0x0f99, 0x193a: 0x2039, 0x193b: 0x0269, + 0x193c: 0x01d9, 0x193d: 0x0fa9, 0x193e: 0x0fb9, 0x193f: 0x1089, + // Block 0x65, offset 0x1940 + 0x1940: 0x0279, 0x1941: 0x0369, 0x1942: 0x0289, 0x1943: 0x13d1, 0x1944: 0x0039, 0x1945: 0x0ee9, + 0x1946: 0x0040, 0x1947: 0x0ef9, 0x1948: 0x0f09, 0x1949: 0x1199, 0x194a: 0x0f31, 0x194b: 0x0040, + 0x194c: 0x0040, 0x194d: 0x0259, 0x194e: 0x0f51, 0x194f: 0x0359, 0x1950: 0x0f61, 0x1951: 0x0f71, + 0x1952: 0x00d9, 0x1953: 0x0f99, 0x1954: 0x2039, 0x1955: 0x0040, 0x1956: 0x01d9, 0x1957: 0x0fa9, + 0x1958: 0x0fb9, 0x1959: 0x1089, 0x195a: 0x0279, 0x195b: 0x0369, 0x195c: 0x0289, 0x195d: 0x0040, + 0x195e: 0x0039, 0x195f: 0x0ee9, 0x1960: 0x1159, 0x1961: 0x0ef9, 0x1962: 0x0f09, 0x1963: 0x1199, + 0x1964: 0x0f31, 0x1965: 0x0249, 0x1966: 0x0f41, 0x1967: 0x0259, 0x1968: 0x0f51, 0x1969: 0x0359, + 0x196a: 0x0f61, 0x196b: 0x0f71, 0x196c: 0x00d9, 0x196d: 0x0f99, 0x196e: 0x2039, 0x196f: 0x0269, + 0x1970: 0x01d9, 0x1971: 0x0fa9, 0x1972: 0x0fb9, 0x1973: 0x1089, 0x1974: 0x0279, 0x1975: 0x0369, + 0x1976: 0x0289, 0x1977: 0x13d1, 0x1978: 0x0039, 0x1979: 0x0ee9, 0x197a: 0x0040, 0x197b: 0x0ef9, + 0x197c: 0x0f09, 0x197d: 0x1199, 0x197e: 0x0f31, 0x197f: 0x0040, + // Block 0x66, offset 0x1980 + 0x1980: 0x0f41, 0x1981: 0x0259, 0x1982: 0x0f51, 0x1983: 0x0359, 0x1984: 0x0f61, 0x1985: 0x0040, + 0x1986: 0x00d9, 0x1987: 0x0040, 0x1988: 0x0040, 0x1989: 0x0040, 0x198a: 0x01d9, 0x198b: 0x0fa9, + 0x198c: 0x0fb9, 0x198d: 0x1089, 0x198e: 0x0279, 0x198f: 0x0369, 0x1990: 0x0289, 0x1991: 0x0040, + 0x1992: 0x0039, 0x1993: 0x0ee9, 0x1994: 0x1159, 0x1995: 0x0ef9, 0x1996: 0x0f09, 0x1997: 0x1199, + 0x1998: 0x0f31, 0x1999: 0x0249, 0x199a: 0x0f41, 0x199b: 0x0259, 0x199c: 0x0f51, 0x199d: 0x0359, + 0x199e: 0x0f61, 0x199f: 0x0f71, 0x19a0: 0x00d9, 0x19a1: 0x0f99, 0x19a2: 0x2039, 0x19a3: 0x0269, + 0x19a4: 0x01d9, 0x19a5: 0x0fa9, 0x19a6: 0x0fb9, 0x19a7: 0x1089, 0x19a8: 0x0279, 0x19a9: 0x0369, + 0x19aa: 0x0289, 0x19ab: 0x13d1, 0x19ac: 0x0039, 0x19ad: 0x0ee9, 0x19ae: 0x1159, 0x19af: 0x0ef9, + 0x19b0: 0x0f09, 0x19b1: 0x1199, 0x19b2: 0x0f31, 0x19b3: 0x0249, 0x19b4: 0x0f41, 0x19b5: 0x0259, + 0x19b6: 0x0f51, 0x19b7: 0x0359, 0x19b8: 0x0f61, 0x19b9: 0x0f71, 0x19ba: 0x00d9, 0x19bb: 0x0f99, + 0x19bc: 0x2039, 0x19bd: 0x0269, 0x19be: 0x01d9, 0x19bf: 0x0fa9, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x0fb9, 0x19c1: 0x1089, 0x19c2: 0x0279, 0x19c3: 0x0369, 0x19c4: 0x0289, 0x19c5: 0x13d1, + 0x19c6: 0x0039, 0x19c7: 0x0ee9, 0x19c8: 0x1159, 0x19c9: 0x0ef9, 0x19ca: 0x0f09, 0x19cb: 0x1199, + 0x19cc: 0x0f31, 0x19cd: 0x0249, 0x19ce: 0x0f41, 0x19cf: 0x0259, 0x19d0: 0x0f51, 0x19d1: 0x0359, + 0x19d2: 0x0f61, 0x19d3: 0x0f71, 0x19d4: 0x00d9, 0x19d5: 0x0f99, 0x19d6: 0x2039, 0x19d7: 0x0269, + 0x19d8: 0x01d9, 0x19d9: 0x0fa9, 0x19da: 0x0fb9, 0x19db: 0x1089, 0x19dc: 0x0279, 0x19dd: 0x0369, + 0x19de: 0x0289, 0x19df: 0x13d1, 0x19e0: 0x0039, 0x19e1: 0x0ee9, 0x19e2: 0x1159, 0x19e3: 0x0ef9, + 0x19e4: 0x0f09, 0x19e5: 0x1199, 0x19e6: 0x0f31, 0x19e7: 0x0249, 0x19e8: 0x0f41, 0x19e9: 0x0259, + 0x19ea: 0x0f51, 0x19eb: 0x0359, 0x19ec: 0x0f61, 0x19ed: 0x0f71, 0x19ee: 0x00d9, 0x19ef: 0x0f99, + 0x19f0: 0x2039, 0x19f1: 0x0269, 0x19f2: 0x01d9, 0x19f3: 0x0fa9, 0x19f4: 0x0fb9, 0x19f5: 0x1089, + 0x19f6: 0x0279, 0x19f7: 0x0369, 0x19f8: 0x0289, 0x19f9: 0x13d1, 0x19fa: 0x0039, 0x19fb: 0x0ee9, + 0x19fc: 0x1159, 0x19fd: 0x0ef9, 0x19fe: 0x0f09, 0x19ff: 0x1199, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x0f31, 0x1a01: 0x0249, 0x1a02: 0x0f41, 0x1a03: 0x0259, 0x1a04: 0x0f51, 0x1a05: 0x0359, + 0x1a06: 0x0f61, 0x1a07: 0x0f71, 0x1a08: 0x00d9, 0x1a09: 0x0f99, 0x1a0a: 0x2039, 0x1a0b: 0x0269, + 0x1a0c: 0x01d9, 0x1a0d: 0x0fa9, 0x1a0e: 0x0fb9, 0x1a0f: 0x1089, 0x1a10: 0x0279, 0x1a11: 0x0369, + 0x1a12: 0x0289, 0x1a13: 0x13d1, 0x1a14: 0x0039, 0x1a15: 0x0ee9, 0x1a16: 0x1159, 0x1a17: 0x0ef9, + 0x1a18: 0x0f09, 0x1a19: 0x1199, 0x1a1a: 0x0f31, 0x1a1b: 0x0249, 0x1a1c: 0x0f41, 0x1a1d: 0x0259, + 0x1a1e: 0x0f51, 0x1a1f: 0x0359, 0x1a20: 0x0f61, 0x1a21: 0x0f71, 0x1a22: 0x00d9, 0x1a23: 0x0f99, + 0x1a24: 0x2039, 0x1a25: 0x0269, 0x1a26: 0x01d9, 0x1a27: 0x0fa9, 0x1a28: 0x0fb9, 0x1a29: 0x1089, + 0x1a2a: 0x0279, 0x1a2b: 0x0369, 0x1a2c: 0x0289, 0x1a2d: 0x13d1, 0x1a2e: 0x0039, 0x1a2f: 0x0ee9, + 0x1a30: 0x1159, 0x1a31: 0x0ef9, 0x1a32: 0x0f09, 0x1a33: 0x1199, 0x1a34: 0x0f31, 0x1a35: 0x0249, + 0x1a36: 0x0f41, 0x1a37: 0x0259, 0x1a38: 0x0f51, 0x1a39: 0x0359, 0x1a3a: 0x0f61, 0x1a3b: 0x0f71, + 0x1a3c: 0x00d9, 0x1a3d: 0x0f99, 0x1a3e: 0x2039, 0x1a3f: 0x0269, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x01d9, 0x1a41: 0x0fa9, 0x1a42: 0x0fb9, 0x1a43: 0x1089, 0x1a44: 0x0279, 0x1a45: 0x0369, + 0x1a46: 0x0289, 0x1a47: 0x13d1, 0x1a48: 0x0039, 0x1a49: 0x0ee9, 0x1a4a: 0x1159, 0x1a4b: 0x0ef9, + 0x1a4c: 0x0f09, 0x1a4d: 0x1199, 0x1a4e: 0x0f31, 0x1a4f: 0x0249, 0x1a50: 0x0f41, 0x1a51: 0x0259, + 0x1a52: 0x0f51, 0x1a53: 0x0359, 0x1a54: 0x0f61, 0x1a55: 0x0f71, 0x1a56: 0x00d9, 0x1a57: 0x0f99, + 0x1a58: 0x2039, 0x1a59: 0x0269, 0x1a5a: 0x01d9, 0x1a5b: 0x0fa9, 0x1a5c: 0x0fb9, 0x1a5d: 0x1089, + 0x1a5e: 0x0279, 0x1a5f: 0x0369, 0x1a60: 0x0289, 0x1a61: 0x13d1, 0x1a62: 0x0039, 0x1a63: 0x0ee9, + 0x1a64: 0x1159, 0x1a65: 0x0ef9, 0x1a66: 0x0f09, 0x1a67: 0x1199, 0x1a68: 0x0f31, 0x1a69: 0x0249, + 0x1a6a: 0x0f41, 0x1a6b: 0x0259, 0x1a6c: 0x0f51, 0x1a6d: 0x0359, 0x1a6e: 0x0f61, 0x1a6f: 0x0f71, + 0x1a70: 0x00d9, 0x1a71: 0x0f99, 0x1a72: 0x2039, 0x1a73: 0x0269, 0x1a74: 0x01d9, 0x1a75: 0x0fa9, + 0x1a76: 0x0fb9, 0x1a77: 0x1089, 0x1a78: 0x0279, 0x1a79: 0x0369, 0x1a7a: 0x0289, 0x1a7b: 0x13d1, + 0x1a7c: 0x0039, 0x1a7d: 0x0ee9, 0x1a7e: 0x1159, 0x1a7f: 0x0ef9, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x0f09, 0x1a81: 0x1199, 0x1a82: 0x0f31, 0x1a83: 0x0249, 0x1a84: 0x0f41, 0x1a85: 0x0259, + 0x1a86: 0x0f51, 0x1a87: 0x0359, 0x1a88: 0x0f61, 0x1a89: 0x0f71, 0x1a8a: 0x00d9, 0x1a8b: 0x0f99, + 0x1a8c: 0x2039, 0x1a8d: 0x0269, 0x1a8e: 0x01d9, 0x1a8f: 0x0fa9, 0x1a90: 0x0fb9, 0x1a91: 0x1089, + 0x1a92: 0x0279, 0x1a93: 0x0369, 0x1a94: 0x0289, 0x1a95: 0x13d1, 0x1a96: 0x0039, 0x1a97: 0x0ee9, + 0x1a98: 0x1159, 0x1a99: 0x0ef9, 0x1a9a: 0x0f09, 0x1a9b: 0x1199, 0x1a9c: 0x0f31, 0x1a9d: 0x0249, + 0x1a9e: 0x0f41, 0x1a9f: 0x0259, 0x1aa0: 0x0f51, 0x1aa1: 0x0359, 0x1aa2: 0x0f61, 0x1aa3: 0x0f71, + 0x1aa4: 0x00d9, 0x1aa5: 0x0f99, 0x1aa6: 0x2039, 0x1aa7: 0x0269, 0x1aa8: 0x01d9, 0x1aa9: 0x0fa9, + 0x1aaa: 0x0fb9, 0x1aab: 0x1089, 0x1aac: 0x0279, 0x1aad: 0x0369, 0x1aae: 0x0289, 0x1aaf: 0x13d1, + 0x1ab0: 0x0039, 0x1ab1: 0x0ee9, 0x1ab2: 0x1159, 0x1ab3: 0x0ef9, 0x1ab4: 0x0f09, 0x1ab5: 0x1199, + 0x1ab6: 0x0f31, 0x1ab7: 0x0249, 0x1ab8: 0x0f41, 0x1ab9: 0x0259, 0x1aba: 0x0f51, 0x1abb: 0x0359, + 0x1abc: 0x0f61, 0x1abd: 0x0f71, 0x1abe: 0x00d9, 0x1abf: 0x0f99, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x2039, 0x1ac1: 0x0269, 0x1ac2: 0x01d9, 0x1ac3: 0x0fa9, 0x1ac4: 0x0fb9, 0x1ac5: 0x1089, + 0x1ac6: 0x0279, 0x1ac7: 0x0369, 0x1ac8: 0x0289, 0x1ac9: 0x13d1, 0x1aca: 0x0039, 0x1acb: 0x0ee9, + 0x1acc: 0x1159, 0x1acd: 0x0ef9, 0x1ace: 0x0f09, 0x1acf: 0x1199, 0x1ad0: 0x0f31, 0x1ad1: 0x0249, + 0x1ad2: 0x0f41, 0x1ad3: 0x0259, 0x1ad4: 0x0f51, 0x1ad5: 0x0359, 0x1ad6: 0x0f61, 0x1ad7: 0x0f71, + 0x1ad8: 0x00d9, 0x1ad9: 0x0f99, 0x1ada: 0x2039, 0x1adb: 0x0269, 0x1adc: 0x01d9, 0x1add: 0x0fa9, + 0x1ade: 0x0fb9, 0x1adf: 0x1089, 0x1ae0: 0x0279, 0x1ae1: 0x0369, 0x1ae2: 0x0289, 0x1ae3: 0x13d1, + 0x1ae4: 0xba81, 0x1ae5: 0xba99, 0x1ae6: 0x0040, 0x1ae7: 0x0040, 0x1ae8: 0xbab1, 0x1ae9: 0x1099, + 0x1aea: 0x10b1, 0x1aeb: 0x10c9, 0x1aec: 0xbac9, 0x1aed: 0xbae1, 0x1aee: 0xbaf9, 0x1aef: 0x1429, + 0x1af0: 0x1a31, 0x1af1: 0xbb11, 0x1af2: 0xbb29, 0x1af3: 0xbb41, 0x1af4: 0xbb59, 0x1af5: 0xbb71, + 0x1af6: 0xbb89, 0x1af7: 0x2109, 0x1af8: 0x1111, 0x1af9: 0x1429, 0x1afa: 0xbba1, 0x1afb: 0xbbb9, + 0x1afc: 0xbbd1, 0x1afd: 0x10e1, 0x1afe: 0x10f9, 0x1aff: 0xbbe9, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x2079, 0x1b01: 0xbc01, 0x1b02: 0xbab1, 0x1b03: 0x1099, 0x1b04: 0x10b1, 0x1b05: 0x10c9, + 0x1b06: 0xbac9, 0x1b07: 0xbae1, 0x1b08: 0xbaf9, 0x1b09: 0x1429, 0x1b0a: 0x1a31, 0x1b0b: 0xbb11, + 0x1b0c: 0xbb29, 0x1b0d: 0xbb41, 0x1b0e: 0xbb59, 0x1b0f: 0xbb71, 0x1b10: 0xbb89, 0x1b11: 0x2109, + 0x1b12: 0x1111, 0x1b13: 0xbba1, 0x1b14: 0xbba1, 0x1b15: 0xbbb9, 0x1b16: 0xbbd1, 0x1b17: 0x10e1, + 0x1b18: 0x10f9, 0x1b19: 0xbbe9, 0x1b1a: 0x2079, 0x1b1b: 0xbc21, 0x1b1c: 0xbac9, 0x1b1d: 0x1429, + 0x1b1e: 0xbb11, 0x1b1f: 0x10e1, 0x1b20: 0x1111, 0x1b21: 0x2109, 0x1b22: 0xbab1, 0x1b23: 0x1099, + 0x1b24: 0x10b1, 0x1b25: 0x10c9, 0x1b26: 0xbac9, 0x1b27: 0xbae1, 0x1b28: 0xbaf9, 0x1b29: 0x1429, + 0x1b2a: 0x1a31, 0x1b2b: 0xbb11, 0x1b2c: 0xbb29, 0x1b2d: 0xbb41, 0x1b2e: 0xbb59, 0x1b2f: 0xbb71, + 0x1b30: 0xbb89, 0x1b31: 0x2109, 0x1b32: 0x1111, 0x1b33: 0x1429, 0x1b34: 0xbba1, 0x1b35: 0xbbb9, + 0x1b36: 0xbbd1, 0x1b37: 0x10e1, 0x1b38: 0x10f9, 0x1b39: 0xbbe9, 0x1b3a: 0x2079, 0x1b3b: 0xbc01, + 0x1b3c: 0xbab1, 0x1b3d: 0x1099, 0x1b3e: 0x10b1, 0x1b3f: 0x10c9, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0xbac9, 0x1b41: 0xbae1, 0x1b42: 0xbaf9, 0x1b43: 0x1429, 0x1b44: 0x1a31, 0x1b45: 0xbb11, + 0x1b46: 0xbb29, 0x1b47: 0xbb41, 0x1b48: 0xbb59, 0x1b49: 0xbb71, 0x1b4a: 0xbb89, 0x1b4b: 0x2109, + 0x1b4c: 0x1111, 0x1b4d: 0xbba1, 0x1b4e: 0xbba1, 0x1b4f: 0xbbb9, 0x1b50: 0xbbd1, 0x1b51: 0x10e1, + 0x1b52: 0x10f9, 0x1b53: 0xbbe9, 0x1b54: 0x2079, 0x1b55: 0xbc21, 0x1b56: 0xbac9, 0x1b57: 0x1429, + 0x1b58: 0xbb11, 0x1b59: 0x10e1, 0x1b5a: 0x1111, 0x1b5b: 0x2109, 0x1b5c: 0xbab1, 0x1b5d: 0x1099, + 0x1b5e: 0x10b1, 0x1b5f: 0x10c9, 0x1b60: 0xbac9, 0x1b61: 0xbae1, 0x1b62: 0xbaf9, 0x1b63: 0x1429, + 0x1b64: 0x1a31, 0x1b65: 0xbb11, 0x1b66: 0xbb29, 0x1b67: 0xbb41, 0x1b68: 0xbb59, 0x1b69: 0xbb71, + 0x1b6a: 0xbb89, 0x1b6b: 0x2109, 0x1b6c: 0x1111, 0x1b6d: 0x1429, 0x1b6e: 0xbba1, 0x1b6f: 0xbbb9, + 0x1b70: 0xbbd1, 0x1b71: 0x10e1, 0x1b72: 0x10f9, 0x1b73: 0xbbe9, 0x1b74: 0x2079, 0x1b75: 0xbc01, + 0x1b76: 0xbab1, 0x1b77: 0x1099, 0x1b78: 0x10b1, 0x1b79: 0x10c9, 0x1b7a: 0xbac9, 0x1b7b: 0xbae1, + 0x1b7c: 0xbaf9, 0x1b7d: 0x1429, 0x1b7e: 0x1a31, 0x1b7f: 0xbb11, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0xbb29, 0x1b81: 0xbb41, 0x1b82: 0xbb59, 0x1b83: 0xbb71, 0x1b84: 0xbb89, 0x1b85: 0x2109, + 0x1b86: 0x1111, 0x1b87: 0xbba1, 0x1b88: 0xbba1, 0x1b89: 0xbbb9, 0x1b8a: 0xbbd1, 0x1b8b: 0x10e1, + 0x1b8c: 0x10f9, 0x1b8d: 0xbbe9, 0x1b8e: 0x2079, 0x1b8f: 0xbc21, 0x1b90: 0xbac9, 0x1b91: 0x1429, + 0x1b92: 0xbb11, 0x1b93: 0x10e1, 0x1b94: 0x1111, 0x1b95: 0x2109, 0x1b96: 0xbab1, 0x1b97: 0x1099, + 0x1b98: 0x10b1, 0x1b99: 0x10c9, 0x1b9a: 0xbac9, 0x1b9b: 0xbae1, 0x1b9c: 0xbaf9, 0x1b9d: 0x1429, + 0x1b9e: 0x1a31, 0x1b9f: 0xbb11, 0x1ba0: 0xbb29, 0x1ba1: 0xbb41, 0x1ba2: 0xbb59, 0x1ba3: 0xbb71, + 0x1ba4: 0xbb89, 0x1ba5: 0x2109, 0x1ba6: 0x1111, 0x1ba7: 0x1429, 0x1ba8: 0xbba1, 0x1ba9: 0xbbb9, + 0x1baa: 0xbbd1, 0x1bab: 0x10e1, 0x1bac: 0x10f9, 0x1bad: 0xbbe9, 0x1bae: 0x2079, 0x1baf: 0xbc01, + 0x1bb0: 0xbab1, 0x1bb1: 0x1099, 0x1bb2: 0x10b1, 0x1bb3: 0x10c9, 0x1bb4: 0xbac9, 0x1bb5: 0xbae1, + 0x1bb6: 0xbaf9, 0x1bb7: 0x1429, 0x1bb8: 0x1a31, 0x1bb9: 0xbb11, 0x1bba: 0xbb29, 0x1bbb: 0xbb41, + 0x1bbc: 0xbb59, 0x1bbd: 0xbb71, 0x1bbe: 0xbb89, 0x1bbf: 0x2109, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x1111, 0x1bc1: 0xbba1, 0x1bc2: 0xbba1, 0x1bc3: 0xbbb9, 0x1bc4: 0xbbd1, 0x1bc5: 0x10e1, + 0x1bc6: 0x10f9, 0x1bc7: 0xbbe9, 0x1bc8: 0x2079, 0x1bc9: 0xbc21, 0x1bca: 0xbac9, 0x1bcb: 0x1429, + 0x1bcc: 0xbb11, 0x1bcd: 0x10e1, 0x1bce: 0x1111, 0x1bcf: 0x2109, 0x1bd0: 0xbab1, 0x1bd1: 0x1099, + 0x1bd2: 0x10b1, 0x1bd3: 0x10c9, 0x1bd4: 0xbac9, 0x1bd5: 0xbae1, 0x1bd6: 0xbaf9, 0x1bd7: 0x1429, + 0x1bd8: 0x1a31, 0x1bd9: 0xbb11, 0x1bda: 0xbb29, 0x1bdb: 0xbb41, 0x1bdc: 0xbb59, 0x1bdd: 0xbb71, + 0x1bde: 0xbb89, 0x1bdf: 0x2109, 0x1be0: 0x1111, 0x1be1: 0x1429, 0x1be2: 0xbba1, 0x1be3: 0xbbb9, + 0x1be4: 0xbbd1, 0x1be5: 0x10e1, 0x1be6: 0x10f9, 0x1be7: 0xbbe9, 0x1be8: 0x2079, 0x1be9: 0xbc01, + 0x1bea: 0xbab1, 0x1beb: 0x1099, 0x1bec: 0x10b1, 0x1bed: 0x10c9, 0x1bee: 0xbac9, 0x1bef: 0xbae1, + 0x1bf0: 0xbaf9, 0x1bf1: 0x1429, 0x1bf2: 0x1a31, 0x1bf3: 0xbb11, 0x1bf4: 0xbb29, 0x1bf5: 0xbb41, + 0x1bf6: 0xbb59, 0x1bf7: 0xbb71, 0x1bf8: 0xbb89, 0x1bf9: 0x2109, 0x1bfa: 0x1111, 0x1bfb: 0xbba1, + 0x1bfc: 0xbba1, 0x1bfd: 0xbbb9, 0x1bfe: 0xbbd1, 0x1bff: 0x10e1, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x10f9, 0x1c01: 0xbbe9, 0x1c02: 0x2079, 0x1c03: 0xbc21, 0x1c04: 0xbac9, 0x1c05: 0x1429, + 0x1c06: 0xbb11, 0x1c07: 0x10e1, 0x1c08: 0x1111, 0x1c09: 0x2109, 0x1c0a: 0xbc41, 0x1c0b: 0xbc41, + 0x1c0c: 0x0040, 0x1c0d: 0x0040, 0x1c0e: 0x1f41, 0x1c0f: 0x00c9, 0x1c10: 0x0069, 0x1c11: 0x0079, + 0x1c12: 0x1f51, 0x1c13: 0x1f61, 0x1c14: 0x1f71, 0x1c15: 0x1f81, 0x1c16: 0x1f91, 0x1c17: 0x1fa1, + 0x1c18: 0x1f41, 0x1c19: 0x00c9, 0x1c1a: 0x0069, 0x1c1b: 0x0079, 0x1c1c: 0x1f51, 0x1c1d: 0x1f61, + 0x1c1e: 0x1f71, 0x1c1f: 0x1f81, 0x1c20: 0x1f91, 0x1c21: 0x1fa1, 0x1c22: 0x1f41, 0x1c23: 0x00c9, + 0x1c24: 0x0069, 0x1c25: 0x0079, 0x1c26: 0x1f51, 0x1c27: 0x1f61, 0x1c28: 0x1f71, 0x1c29: 0x1f81, + 0x1c2a: 0x1f91, 0x1c2b: 0x1fa1, 0x1c2c: 0x1f41, 0x1c2d: 0x00c9, 0x1c2e: 0x0069, 0x1c2f: 0x0079, + 0x1c30: 0x1f51, 0x1c31: 0x1f61, 0x1c32: 0x1f71, 0x1c33: 0x1f81, 0x1c34: 0x1f91, 0x1c35: 0x1fa1, + 0x1c36: 0x1f41, 0x1c37: 0x00c9, 0x1c38: 0x0069, 0x1c39: 0x0079, 0x1c3a: 0x1f51, 0x1c3b: 0x1f61, + 0x1c3c: 0x1f71, 0x1c3d: 0x1f81, 0x1c3e: 0x1f91, 0x1c3f: 0x1fa1, + // Block 0x71, offset 0x1c40 + 0x1c40: 0xe115, 0x1c41: 0xe115, 0x1c42: 0xe135, 0x1c43: 0xe135, 0x1c44: 0xe115, 0x1c45: 0xe115, + 0x1c46: 0xe175, 0x1c47: 0xe175, 0x1c48: 0xe115, 0x1c49: 0xe115, 0x1c4a: 0xe135, 0x1c4b: 0xe135, + 0x1c4c: 0xe115, 0x1c4d: 0xe115, 0x1c4e: 0xe1f5, 0x1c4f: 0xe1f5, 0x1c50: 0xe115, 0x1c51: 0xe115, + 0x1c52: 0xe135, 0x1c53: 0xe135, 0x1c54: 0xe115, 0x1c55: 0xe115, 0x1c56: 0xe175, 0x1c57: 0xe175, + 0x1c58: 0xe115, 0x1c59: 0xe115, 0x1c5a: 0xe135, 0x1c5b: 0xe135, 0x1c5c: 0xe115, 0x1c5d: 0xe115, + 0x1c5e: 0x8b3d, 0x1c5f: 0x8b3d, 0x1c60: 0x04b5, 0x1c61: 0x04b5, 0x1c62: 0x0a08, 0x1c63: 0x0a08, + 0x1c64: 0x0a08, 0x1c65: 0x0a08, 0x1c66: 0x0a08, 0x1c67: 0x0a08, 0x1c68: 0x0a08, 0x1c69: 0x0a08, + 0x1c6a: 0x0a08, 0x1c6b: 0x0a08, 0x1c6c: 0x0a08, 0x1c6d: 0x0a08, 0x1c6e: 0x0a08, 0x1c6f: 0x0a08, + 0x1c70: 0x0a08, 0x1c71: 0x0a08, 0x1c72: 0x0a08, 0x1c73: 0x0a08, 0x1c74: 0x0a08, 0x1c75: 0x0a08, + 0x1c76: 0x0a08, 0x1c77: 0x0a08, 0x1c78: 0x0a08, 0x1c79: 0x0a08, 0x1c7a: 0x0a08, 0x1c7b: 0x0a08, + 0x1c7c: 0x0a08, 0x1c7d: 0x0a08, 0x1c7e: 0x0a08, 0x1c7f: 0x0a08, + // Block 0x72, offset 0x1c80 + 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0x0040, 0x1c85: 0xb411, + 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0xb399, 0x1c8b: 0xb3b1, + 0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9, + 0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231, + 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0xbc59, 0x1c9d: 0x7949, + 0x1c9e: 0xbc71, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040, + 0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0x0040, 0x1ca9: 0xb429, + 0x1caa: 0xb399, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339, + 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1, + 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0x0040, 0x1cbb: 0xb351, + 0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0040, 0x1cc1: 0x0040, 0x1cc2: 0xb201, 0x1cc3: 0x0040, 0x1cc4: 0x0040, 0x1cc5: 0x0040, + 0x1cc6: 0x0040, 0x1cc7: 0xb219, 0x1cc8: 0x0040, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1, + 0x1ccc: 0x0040, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0x0040, 0x1cd1: 0xb2d9, + 0x1cd2: 0xb381, 0x1cd3: 0x0040, 0x1cd4: 0xb2c1, 0x1cd5: 0x0040, 0x1cd6: 0x0040, 0x1cd7: 0xb231, + 0x1cd8: 0x0040, 0x1cd9: 0xb2f1, 0x1cda: 0x0040, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x7949, + 0x1cde: 0x0040, 0x1cdf: 0xbc89, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0x0040, + 0x1ce4: 0xb3f9, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429, + 0x1cea: 0xb399, 0x1ceb: 0x0040, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339, + 0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0x0040, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1, + 0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0x0040, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351, + 0x1cfc: 0xbc59, 0x1cfd: 0x0040, 0x1cfe: 0xbc71, 0x1cff: 0x0040, + // Block 0x74, offset 0x1d00 + 0x1d00: 0xb189, 0x1d01: 0xb1a1, 0x1d02: 0xb201, 0x1d03: 0xb249, 0x1d04: 0xb3f9, 0x1d05: 0xb411, + 0x1d06: 0xb291, 0x1d07: 0xb219, 0x1d08: 0xb309, 0x1d09: 0xb429, 0x1d0a: 0x0040, 0x1d0b: 0xb3b1, + 0x1d0c: 0xb3c9, 0x1d0d: 0xb3e1, 0x1d0e: 0xb2a9, 0x1d0f: 0xb339, 0x1d10: 0xb369, 0x1d11: 0xb2d9, + 0x1d12: 0xb381, 0x1d13: 0xb279, 0x1d14: 0xb2c1, 0x1d15: 0xb1d1, 0x1d16: 0xb1e9, 0x1d17: 0xb231, + 0x1d18: 0xb261, 0x1d19: 0xb2f1, 0x1d1a: 0xb321, 0x1d1b: 0xb351, 0x1d1c: 0x0040, 0x1d1d: 0x0040, + 0x1d1e: 0x0040, 0x1d1f: 0x0040, 0x1d20: 0x0040, 0x1d21: 0xb1a1, 0x1d22: 0xb201, 0x1d23: 0xb249, + 0x1d24: 0x0040, 0x1d25: 0xb411, 0x1d26: 0xb291, 0x1d27: 0xb219, 0x1d28: 0xb309, 0x1d29: 0xb429, + 0x1d2a: 0x0040, 0x1d2b: 0xb3b1, 0x1d2c: 0xb3c9, 0x1d2d: 0xb3e1, 0x1d2e: 0xb2a9, 0x1d2f: 0xb339, + 0x1d30: 0xb369, 0x1d31: 0xb2d9, 0x1d32: 0xb381, 0x1d33: 0xb279, 0x1d34: 0xb2c1, 0x1d35: 0xb1d1, + 0x1d36: 0xb1e9, 0x1d37: 0xb231, 0x1d38: 0xb261, 0x1d39: 0xb2f1, 0x1d3a: 0xb321, 0x1d3b: 0xb351, + 0x1d3c: 0x0040, 0x1d3d: 0x0040, 0x1d3e: 0x0040, 0x1d3f: 0x0040, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x0040, 0x1d41: 0xbca2, 0x1d42: 0xbcba, 0x1d43: 0xbcd2, 0x1d44: 0xbcea, 0x1d45: 0xbd02, + 0x1d46: 0xbd1a, 0x1d47: 0xbd32, 0x1d48: 0xbd4a, 0x1d49: 0xbd62, 0x1d4a: 0xbd7a, 0x1d4b: 0x0018, + 0x1d4c: 0x0018, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xbd92, 0x1d51: 0xbdb2, + 0x1d52: 0xbdd2, 0x1d53: 0xbdf2, 0x1d54: 0xbe12, 0x1d55: 0xbe32, 0x1d56: 0xbe52, 0x1d57: 0xbe72, + 0x1d58: 0xbe92, 0x1d59: 0xbeb2, 0x1d5a: 0xbed2, 0x1d5b: 0xbef2, 0x1d5c: 0xbf12, 0x1d5d: 0xbf32, + 0x1d5e: 0xbf52, 0x1d5f: 0xbf72, 0x1d60: 0xbf92, 0x1d61: 0xbfb2, 0x1d62: 0xbfd2, 0x1d63: 0xbff2, + 0x1d64: 0xc012, 0x1d65: 0xc032, 0x1d66: 0xc052, 0x1d67: 0xc072, 0x1d68: 0xc092, 0x1d69: 0xc0b2, + 0x1d6a: 0xc0d1, 0x1d6b: 0x1159, 0x1d6c: 0x0269, 0x1d6d: 0x6671, 0x1d6e: 0xc111, 0x1d6f: 0x0018, + 0x1d70: 0x0039, 0x1d71: 0x0ee9, 0x1d72: 0x1159, 0x1d73: 0x0ef9, 0x1d74: 0x0f09, 0x1d75: 0x1199, + 0x1d76: 0x0f31, 0x1d77: 0x0249, 0x1d78: 0x0f41, 0x1d79: 0x0259, 0x1d7a: 0x0f51, 0x1d7b: 0x0359, + 0x1d7c: 0x0f61, 0x1d7d: 0x0f71, 0x1d7e: 0x00d9, 0x1d7f: 0x0f99, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x2039, 0x1d81: 0x0269, 0x1d82: 0x01d9, 0x1d83: 0x0fa9, 0x1d84: 0x0fb9, 0x1d85: 0x1089, + 0x1d86: 0x0279, 0x1d87: 0x0369, 0x1d88: 0x0289, 0x1d89: 0x13d1, 0x1d8a: 0xc129, 0x1d8b: 0x65b1, + 0x1d8c: 0xc141, 0x1d8d: 0x1441, 0x1d8e: 0xc159, 0x1d8f: 0xc179, 0x1d90: 0x0018, 0x1d91: 0x0018, + 0x1d92: 0x0018, 0x1d93: 0x0018, 0x1d94: 0x0018, 0x1d95: 0x0018, 0x1d96: 0x0018, 0x1d97: 0x0018, + 0x1d98: 0x0018, 0x1d99: 0x0018, 0x1d9a: 0x0018, 0x1d9b: 0x0018, 0x1d9c: 0x0018, 0x1d9d: 0x0018, + 0x1d9e: 0x0018, 0x1d9f: 0x0018, 0x1da0: 0x0018, 0x1da1: 0x0018, 0x1da2: 0x0018, 0x1da3: 0x0018, + 0x1da4: 0x0018, 0x1da5: 0x0018, 0x1da6: 0x0018, 0x1da7: 0x0018, 0x1da8: 0x0018, 0x1da9: 0x0018, + 0x1daa: 0xc191, 0x1dab: 0xc1a9, 0x1dac: 0xc1c1, 0x1dad: 0x0040, 0x1dae: 0x0040, 0x1daf: 0x0040, + 0x1db0: 0x0018, 0x1db1: 0x0018, 0x1db2: 0x0018, 0x1db3: 0x0018, 0x1db4: 0x0018, 0x1db5: 0x0018, + 0x1db6: 0x0018, 0x1db7: 0x0018, 0x1db8: 0x0018, 0x1db9: 0x0018, 0x1dba: 0x0018, 0x1dbb: 0x0018, + 0x1dbc: 0x0018, 0x1dbd: 0x0018, 0x1dbe: 0x0018, 0x1dbf: 0x0018, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xc1f1, 0x1dc1: 0xc229, 0x1dc2: 0xc261, 0x1dc3: 0x0040, 0x1dc4: 0x0040, 0x1dc5: 0x0040, + 0x1dc6: 0x0040, 0x1dc7: 0x0040, 0x1dc8: 0x0040, 0x1dc9: 0x0040, 0x1dca: 0x0040, 0x1dcb: 0x0040, + 0x1dcc: 0x0040, 0x1dcd: 0x0040, 0x1dce: 0x0040, 0x1dcf: 0x0040, 0x1dd0: 0xc281, 0x1dd1: 0xc2a1, + 0x1dd2: 0xc2c1, 0x1dd3: 0xc2e1, 0x1dd4: 0xc301, 0x1dd5: 0xc321, 0x1dd6: 0xc341, 0x1dd7: 0xc361, + 0x1dd8: 0xc381, 0x1dd9: 0xc3a1, 0x1dda: 0xc3c1, 0x1ddb: 0xc3e1, 0x1ddc: 0xc401, 0x1ddd: 0xc421, + 0x1dde: 0xc441, 0x1ddf: 0xc461, 0x1de0: 0xc481, 0x1de1: 0xc4a1, 0x1de2: 0xc4c1, 0x1de3: 0xc4e1, + 0x1de4: 0xc501, 0x1de5: 0xc521, 0x1de6: 0xc541, 0x1de7: 0xc561, 0x1de8: 0xc581, 0x1de9: 0xc5a1, + 0x1dea: 0xc5c1, 0x1deb: 0xc5e1, 0x1dec: 0xc601, 0x1ded: 0xc621, 0x1dee: 0xc641, 0x1def: 0xc661, + 0x1df0: 0xc681, 0x1df1: 0xc6a1, 0x1df2: 0xc6c1, 0x1df3: 0xc6e1, 0x1df4: 0xc701, 0x1df5: 0xc721, + 0x1df6: 0xc741, 0x1df7: 0xc761, 0x1df8: 0xc781, 0x1df9: 0xc7a1, 0x1dfa: 0xc7c1, 0x1dfb: 0xc7e1, + 0x1dfc: 0x0040, 0x1dfd: 0x0040, 0x1dfe: 0x0040, 0x1dff: 0x0040, + // Block 0x78, offset 0x1e00 + 0x1e00: 0xcb11, 0x1e01: 0xcb31, 0x1e02: 0xcb51, 0x1e03: 0x8b55, 0x1e04: 0xcb71, 0x1e05: 0xcb91, + 0x1e06: 0xcbb1, 0x1e07: 0xcbd1, 0x1e08: 0xcbf1, 0x1e09: 0xcc11, 0x1e0a: 0xcc31, 0x1e0b: 0xcc51, + 0x1e0c: 0xcc71, 0x1e0d: 0x8b75, 0x1e0e: 0xcc91, 0x1e0f: 0xccb1, 0x1e10: 0xccd1, 0x1e11: 0xccf1, + 0x1e12: 0x8b95, 0x1e13: 0xcd11, 0x1e14: 0xcd31, 0x1e15: 0xc441, 0x1e16: 0x8bb5, 0x1e17: 0xcd51, + 0x1e18: 0xcd71, 0x1e19: 0xcd91, 0x1e1a: 0xcdb1, 0x1e1b: 0xcdd1, 0x1e1c: 0x8bd5, 0x1e1d: 0xcdf1, + 0x1e1e: 0xce11, 0x1e1f: 0xce31, 0x1e20: 0xce51, 0x1e21: 0xce71, 0x1e22: 0xc7a1, 0x1e23: 0xce91, + 0x1e24: 0xceb1, 0x1e25: 0xced1, 0x1e26: 0xcef1, 0x1e27: 0xcf11, 0x1e28: 0xcf31, 0x1e29: 0xcf51, + 0x1e2a: 0xcf71, 0x1e2b: 0xcf91, 0x1e2c: 0xcfb1, 0x1e2d: 0xcfd1, 0x1e2e: 0xcff1, 0x1e2f: 0xd011, + 0x1e30: 0xd031, 0x1e31: 0xd051, 0x1e32: 0xd051, 0x1e33: 0xd051, 0x1e34: 0x8bf5, 0x1e35: 0xd071, + 0x1e36: 0xd091, 0x1e37: 0xd0b1, 0x1e38: 0x8c15, 0x1e39: 0xd0d1, 0x1e3a: 0xd0f1, 0x1e3b: 0xd111, + 0x1e3c: 0xd131, 0x1e3d: 0xd151, 0x1e3e: 0xd171, 0x1e3f: 0xd191, + // Block 0x79, offset 0x1e40 + 0x1e40: 0xd1b1, 0x1e41: 0xd1d1, 0x1e42: 0xd1f1, 0x1e43: 0xd211, 0x1e44: 0xd231, 0x1e45: 0xd251, + 0x1e46: 0xd251, 0x1e47: 0xd271, 0x1e48: 0xd291, 0x1e49: 0xd2b1, 0x1e4a: 0xd2d1, 0x1e4b: 0xd2f1, + 0x1e4c: 0xd311, 0x1e4d: 0xd331, 0x1e4e: 0xd351, 0x1e4f: 0xd371, 0x1e50: 0xd391, 0x1e51: 0xd3b1, + 0x1e52: 0xd3d1, 0x1e53: 0xd3f1, 0x1e54: 0xd411, 0x1e55: 0xd431, 0x1e56: 0xd451, 0x1e57: 0xd471, + 0x1e58: 0xd491, 0x1e59: 0x8c35, 0x1e5a: 0xd4b1, 0x1e5b: 0xd4d1, 0x1e5c: 0xd4f1, 0x1e5d: 0xc321, + 0x1e5e: 0xd511, 0x1e5f: 0xd531, 0x1e60: 0x8c55, 0x1e61: 0x8c75, 0x1e62: 0xd551, 0x1e63: 0xd571, + 0x1e64: 0xd591, 0x1e65: 0xd5b1, 0x1e66: 0xd5d1, 0x1e67: 0xd5f1, 0x1e68: 0x2040, 0x1e69: 0xd611, + 0x1e6a: 0xd631, 0x1e6b: 0xd631, 0x1e6c: 0x8c95, 0x1e6d: 0xd651, 0x1e6e: 0xd671, 0x1e6f: 0xd691, + 0x1e70: 0xd6b1, 0x1e71: 0x8cb5, 0x1e72: 0xd6d1, 0x1e73: 0xd6f1, 0x1e74: 0x2040, 0x1e75: 0xd711, + 0x1e76: 0xd731, 0x1e77: 0xd751, 0x1e78: 0xd771, 0x1e79: 0xd791, 0x1e7a: 0xd7b1, 0x1e7b: 0x8cd5, + 0x1e7c: 0xd7d1, 0x1e7d: 0x8cf5, 0x1e7e: 0xd7f1, 0x1e7f: 0xd811, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0xd831, 0x1e81: 0xd851, 0x1e82: 0xd871, 0x1e83: 0xd891, 0x1e84: 0xd8b1, 0x1e85: 0xd8d1, + 0x1e86: 0xd8f1, 0x1e87: 0xd911, 0x1e88: 0xd931, 0x1e89: 0x8d15, 0x1e8a: 0xd951, 0x1e8b: 0xd971, + 0x1e8c: 0xd991, 0x1e8d: 0xd9b1, 0x1e8e: 0xd9d1, 0x1e8f: 0x8d35, 0x1e90: 0xd9f1, 0x1e91: 0x8d55, + 0x1e92: 0x8d75, 0x1e93: 0xda11, 0x1e94: 0xda31, 0x1e95: 0xda31, 0x1e96: 0xda51, 0x1e97: 0x8d95, + 0x1e98: 0x8db5, 0x1e99: 0xda71, 0x1e9a: 0xda91, 0x1e9b: 0xdab1, 0x1e9c: 0xdad1, 0x1e9d: 0xdaf1, + 0x1e9e: 0xdb11, 0x1e9f: 0xdb31, 0x1ea0: 0xdb51, 0x1ea1: 0xdb71, 0x1ea2: 0xdb91, 0x1ea3: 0xdbb1, + 0x1ea4: 0x8dd5, 0x1ea5: 0xdbd1, 0x1ea6: 0xdbf1, 0x1ea7: 0xdc11, 0x1ea8: 0xdc31, 0x1ea9: 0xdc11, + 0x1eaa: 0xdc51, 0x1eab: 0xdc71, 0x1eac: 0xdc91, 0x1ead: 0xdcb1, 0x1eae: 0xdcd1, 0x1eaf: 0xdcf1, + 0x1eb0: 0xdd11, 0x1eb1: 0xdd31, 0x1eb2: 0xdd51, 0x1eb3: 0xdd71, 0x1eb4: 0xdd91, 0x1eb5: 0xddb1, + 0x1eb6: 0xddd1, 0x1eb7: 0xddf1, 0x1eb8: 0x8df5, 0x1eb9: 0xde11, 0x1eba: 0xde31, 0x1ebb: 0xde51, + 0x1ebc: 0xde71, 0x1ebd: 0xde91, 0x1ebe: 0x8e15, 0x1ebf: 0xdeb1, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0xe5b1, 0x1ec1: 0xe5d1, 0x1ec2: 0xe5f1, 0x1ec3: 0xe611, 0x1ec4: 0xe631, 0x1ec5: 0xe651, + 0x1ec6: 0x8f35, 0x1ec7: 0xe671, 0x1ec8: 0xe691, 0x1ec9: 0xe6b1, 0x1eca: 0xe6d1, 0x1ecb: 0xe6f1, + 0x1ecc: 0xe711, 0x1ecd: 0x8f55, 0x1ece: 0xe731, 0x1ecf: 0xe751, 0x1ed0: 0x8f75, 0x1ed1: 0x8f95, + 0x1ed2: 0xe771, 0x1ed3: 0xe791, 0x1ed4: 0xe7b1, 0x1ed5: 0xe7d1, 0x1ed6: 0xe7f1, 0x1ed7: 0xe811, + 0x1ed8: 0xe831, 0x1ed9: 0xe851, 0x1eda: 0xe871, 0x1edb: 0x8fb5, 0x1edc: 0xe891, 0x1edd: 0x8fd5, + 0x1ede: 0xe8b1, 0x1edf: 0x2040, 0x1ee0: 0xe8d1, 0x1ee1: 0xe8f1, 0x1ee2: 0xe911, 0x1ee3: 0x8ff5, + 0x1ee4: 0xe931, 0x1ee5: 0xe951, 0x1ee6: 0x9015, 0x1ee7: 0x9035, 0x1ee8: 0xe971, 0x1ee9: 0xe991, + 0x1eea: 0xe9b1, 0x1eeb: 0xe9d1, 0x1eec: 0xe9f1, 0x1eed: 0xe9f1, 0x1eee: 0xea11, 0x1eef: 0xea31, + 0x1ef0: 0xea51, 0x1ef1: 0xea71, 0x1ef2: 0xea91, 0x1ef3: 0xeab1, 0x1ef4: 0xead1, 0x1ef5: 0x9055, + 0x1ef6: 0xeaf1, 0x1ef7: 0x9075, 0x1ef8: 0xeb11, 0x1ef9: 0x9095, 0x1efa: 0xeb31, 0x1efb: 0x90b5, + 0x1efc: 0x90d5, 0x1efd: 0x90f5, 0x1efe: 0xeb51, 0x1eff: 0xeb71, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0xeb91, 0x1f01: 0x9115, 0x1f02: 0x9135, 0x1f03: 0x9155, 0x1f04: 0x9175, 0x1f05: 0xebb1, + 0x1f06: 0xebd1, 0x1f07: 0xebd1, 0x1f08: 0xebf1, 0x1f09: 0xec11, 0x1f0a: 0xec31, 0x1f0b: 0xec51, + 0x1f0c: 0xec71, 0x1f0d: 0x9195, 0x1f0e: 0xec91, 0x1f0f: 0xecb1, 0x1f10: 0xecd1, 0x1f11: 0xecf1, + 0x1f12: 0x91b5, 0x1f13: 0xed11, 0x1f14: 0x91d5, 0x1f15: 0x91f5, 0x1f16: 0xed31, 0x1f17: 0xed51, + 0x1f18: 0xed71, 0x1f19: 0xed91, 0x1f1a: 0xedb1, 0x1f1b: 0xedd1, 0x1f1c: 0x9215, 0x1f1d: 0x9235, + 0x1f1e: 0x9255, 0x1f1f: 0x2040, 0x1f20: 0xedf1, 0x1f21: 0x9275, 0x1f22: 0xee11, 0x1f23: 0xee31, + 0x1f24: 0xee51, 0x1f25: 0x9295, 0x1f26: 0xee71, 0x1f27: 0xee91, 0x1f28: 0xeeb1, 0x1f29: 0xeed1, + 0x1f2a: 0xeef1, 0x1f2b: 0x92b5, 0x1f2c: 0xef11, 0x1f2d: 0xef31, 0x1f2e: 0xef51, 0x1f2f: 0xef71, + 0x1f30: 0xef91, 0x1f31: 0xefb1, 0x1f32: 0x92d5, 0x1f33: 0x92f5, 0x1f34: 0xefd1, 0x1f35: 0x9315, + 0x1f36: 0xeff1, 0x1f37: 0x9335, 0x1f38: 0xf011, 0x1f39: 0xf031, 0x1f3a: 0xf051, 0x1f3b: 0x9355, + 0x1f3c: 0x9375, 0x1f3d: 0xf071, 0x1f3e: 0x9395, 0x1f3f: 0xf091, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0xf6d1, 0x1f41: 0xf6f1, 0x1f42: 0xf711, 0x1f43: 0xf731, 0x1f44: 0xf751, 0x1f45: 0x9555, + 0x1f46: 0xf771, 0x1f47: 0xf791, 0x1f48: 0xf7b1, 0x1f49: 0xf7d1, 0x1f4a: 0xf7f1, 0x1f4b: 0x9575, + 0x1f4c: 0x9595, 0x1f4d: 0xf811, 0x1f4e: 0xf831, 0x1f4f: 0xf851, 0x1f50: 0xf871, 0x1f51: 0xf891, + 0x1f52: 0xf8b1, 0x1f53: 0x95b5, 0x1f54: 0xf8d1, 0x1f55: 0xf8f1, 0x1f56: 0xf911, 0x1f57: 0xf931, + 0x1f58: 0x95d5, 0x1f59: 0x95f5, 0x1f5a: 0xf951, 0x1f5b: 0xf971, 0x1f5c: 0xf991, 0x1f5d: 0x9615, + 0x1f5e: 0xf9b1, 0x1f5f: 0xf9d1, 0x1f60: 0x684d, 0x1f61: 0x9635, 0x1f62: 0xf9f1, 0x1f63: 0xfa11, + 0x1f64: 0xfa31, 0x1f65: 0x9655, 0x1f66: 0xfa51, 0x1f67: 0xfa71, 0x1f68: 0xfa91, 0x1f69: 0xfab1, + 0x1f6a: 0xfad1, 0x1f6b: 0xfaf1, 0x1f6c: 0xfb11, 0x1f6d: 0x9675, 0x1f6e: 0xfb31, 0x1f6f: 0xfb51, + 0x1f70: 0xfb71, 0x1f71: 0x9695, 0x1f72: 0xfb91, 0x1f73: 0xfbb1, 0x1f74: 0xfbd1, 0x1f75: 0xfbf1, + 0x1f76: 0x7b6d, 0x1f77: 0x96b5, 0x1f78: 0xfc11, 0x1f79: 0xfc31, 0x1f7a: 0xfc51, 0x1f7b: 0x96d5, + 0x1f7c: 0xfc71, 0x1f7d: 0x96f5, 0x1f7e: 0xfc91, 0x1f7f: 0xfc91, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0xfcb1, 0x1f81: 0x9715, 0x1f82: 0xfcd1, 0x1f83: 0xfcf1, 0x1f84: 0xfd11, 0x1f85: 0xfd31, + 0x1f86: 0xfd51, 0x1f87: 0xfd71, 0x1f88: 0xfd91, 0x1f89: 0x9735, 0x1f8a: 0xfdb1, 0x1f8b: 0xfdd1, + 0x1f8c: 0xfdf1, 0x1f8d: 0xfe11, 0x1f8e: 0xfe31, 0x1f8f: 0xfe51, 0x1f90: 0x9755, 0x1f91: 0xfe71, + 0x1f92: 0x9775, 0x1f93: 0x9795, 0x1f94: 0x97b5, 0x1f95: 0xfe91, 0x1f96: 0xfeb1, 0x1f97: 0xfed1, + 0x1f98: 0xfef1, 0x1f99: 0xff11, 0x1f9a: 0xff31, 0x1f9b: 0xff51, 0x1f9c: 0xff71, 0x1f9d: 0x97d5, + 0x1f9e: 0x0040, 0x1f9f: 0x0040, 0x1fa0: 0x0040, 0x1fa1: 0x0040, 0x1fa2: 0x0040, 0x1fa3: 0x0040, + 0x1fa4: 0x0040, 0x1fa5: 0x0040, 0x1fa6: 0x0040, 0x1fa7: 0x0040, 0x1fa8: 0x0040, 0x1fa9: 0x0040, + 0x1faa: 0x0040, 0x1fab: 0x0040, 0x1fac: 0x0040, 0x1fad: 0x0040, 0x1fae: 0x0040, 0x1faf: 0x0040, + 0x1fb0: 0x0040, 0x1fb1: 0x0040, 0x1fb2: 0x0040, 0x1fb3: 0x0040, 0x1fb4: 0x0040, 0x1fb5: 0x0040, + 0x1fb6: 0x0040, 0x1fb7: 0x0040, 0x1fb8: 0x0040, 0x1fb9: 0x0040, 0x1fba: 0x0040, 0x1fbb: 0x0040, + 0x1fbc: 0x0040, 0x1fbd: 0x0040, 0x1fbe: 0x0040, 0x1fbf: 0x0040, +} + +// idnaIndex: 36 blocks, 2304 entries, 4608 bytes +// Block 0 is the zero block. +var idnaIndex = [2304]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x7d, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, + 0xc8: 0x06, 0xc9: 0x7e, 0xca: 0x7f, 0xcb: 0x07, 0xcc: 0x80, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, + 0xd0: 0x81, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x82, 0xd6: 0x83, 0xd7: 0x84, + 0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x85, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x86, 0xde: 0x87, 0xdf: 0x88, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, + 0xf0: 0x1d, 0xf1: 0x1e, 0xf2: 0x1e, 0xf3: 0x20, 0xf4: 0x21, + // Block 0x4, offset 0x100 + 0x120: 0x89, 0x121: 0x13, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x14, 0x126: 0x15, 0x127: 0x16, + 0x128: 0x17, 0x129: 0x18, 0x12a: 0x19, 0x12b: 0x1a, 0x12c: 0x1b, 0x12d: 0x1c, 0x12e: 0x1d, 0x12f: 0x8d, + 0x130: 0x8e, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x8f, 0x135: 0x21, 0x136: 0x90, 0x137: 0x91, + 0x138: 0x92, 0x139: 0x93, 0x13a: 0x22, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x23, 0x13e: 0x24, 0x13f: 0x96, + // Block 0x5, offset 0x140 + 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e, + 0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6, + 0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f, + 0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae, + 0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6, + 0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe, + 0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x25, 0x175: 0x26, 0x176: 0x27, 0x177: 0xc3, + 0x178: 0x28, 0x179: 0x28, 0x17a: 0x29, 0x17b: 0x28, 0x17c: 0xc4, 0x17d: 0x2a, 0x17e: 0x2b, 0x17f: 0x2c, + // Block 0x6, offset 0x180 + 0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0xc5, 0x184: 0x30, 0x185: 0x31, 0x186: 0xc6, 0x187: 0x9b, + 0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0x9b, + 0x190: 0xca, 0x191: 0x32, 0x192: 0x33, 0x193: 0x34, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b, + 0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b, + 0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b, + 0x1a8: 0xcb, 0x1a9: 0xcc, 0x1aa: 0x9b, 0x1ab: 0xcd, 0x1ac: 0x9b, 0x1ad: 0xce, 0x1ae: 0xcf, 0x1af: 0x9b, + 0x1b0: 0xd0, 0x1b1: 0x35, 0x1b2: 0x28, 0x1b3: 0x36, 0x1b4: 0xd1, 0x1b5: 0xd2, 0x1b6: 0xd3, 0x1b7: 0xd4, + 0x1b8: 0xd5, 0x1b9: 0xd6, 0x1ba: 0xd7, 0x1bb: 0xd8, 0x1bc: 0xd9, 0x1bd: 0xda, 0x1be: 0xdb, 0x1bf: 0x37, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x38, 0x1c1: 0xdc, 0x1c2: 0xdd, 0x1c3: 0xde, 0x1c4: 0xdf, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe0, + 0x1c8: 0xe1, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41, + 0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f, + 0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f, + 0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f, + 0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f, + 0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f, + 0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f, + // Block 0x8, offset 0x200 + 0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f, + 0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f, + 0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f, + 0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f, + 0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f, + 0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f, + 0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b, + 0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f, + // Block 0x9, offset 0x240 + 0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f, + 0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f, + 0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f, + 0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f, + 0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f, + 0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f, + 0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f, + 0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f, + // Block 0xa, offset 0x280 + 0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f, + 0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f, + 0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f, + 0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f, + 0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f, + 0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f, + 0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f, + 0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe2, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f, + 0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f, + 0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe3, 0x2d3: 0xe4, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f, + 0x2d8: 0xe5, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe6, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe7, + 0x2e0: 0xe8, 0x2e1: 0xe9, 0x2e2: 0xea, 0x2e3: 0xeb, 0x2e4: 0xec, 0x2e5: 0xed, 0x2e6: 0xee, 0x2e7: 0xef, + 0x2e8: 0xf0, 0x2e9: 0xf1, 0x2ea: 0xf2, 0x2eb: 0xf3, 0x2ec: 0xf4, 0x2ed: 0xf5, 0x2ee: 0xf6, 0x2ef: 0xf7, + 0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f, + 0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f, + // Block 0xc, offset 0x300 + 0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f, + 0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f, + 0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f, + 0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xf8, 0x31f: 0xf9, + // Block 0xd, offset 0x340 + 0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba, + 0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba, + 0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba, + 0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba, + 0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba, + 0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba, + 0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba, + 0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba, + // Block 0xe, offset 0x380 + 0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba, + 0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba, + 0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba, + 0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba, + 0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfa, 0x3a5: 0xfb, 0x3a6: 0xfc, 0x3a7: 0xfd, + 0x3a8: 0x47, 0x3a9: 0xfe, 0x3aa: 0xff, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c, + 0x3b0: 0x100, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x101, 0x3b7: 0x52, + 0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x102, 0x3c1: 0x103, 0x3c2: 0x9f, 0x3c3: 0x104, 0x3c4: 0x105, 0x3c5: 0x9b, 0x3c6: 0x106, 0x3c7: 0x107, + 0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x108, 0x3cb: 0x109, 0x3cc: 0x10a, 0x3cd: 0x10b, 0x3ce: 0x10c, 0x3cf: 0x10d, + 0x3d0: 0x10e, 0x3d1: 0x9f, 0x3d2: 0x10f, 0x3d3: 0x110, 0x3d4: 0x111, 0x3d5: 0x112, 0x3d6: 0xba, 0x3d7: 0xba, + 0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x113, 0x3dd: 0x114, 0x3de: 0xba, 0x3df: 0xba, + 0x3e0: 0x115, 0x3e1: 0x116, 0x3e2: 0x117, 0x3e3: 0x118, 0x3e4: 0x119, 0x3e5: 0xba, 0x3e6: 0x11a, 0x3e7: 0x11b, + 0x3e8: 0x11c, 0x3e9: 0x11d, 0x3ea: 0x11e, 0x3eb: 0x5b, 0x3ec: 0x11f, 0x3ed: 0x120, 0x3ee: 0x5c, 0x3ef: 0xba, + 0x3f0: 0x121, 0x3f1: 0x122, 0x3f2: 0x123, 0x3f3: 0x124, 0x3f4: 0x125, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba, + 0x3f8: 0xba, 0x3f9: 0x126, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0x127, 0x3fd: 0x128, 0x3fe: 0xba, 0x3ff: 0x129, + // Block 0x10, offset 0x400 + 0x400: 0x12a, 0x401: 0x12b, 0x402: 0x12c, 0x403: 0x12d, 0x404: 0x12e, 0x405: 0x12f, 0x406: 0x130, 0x407: 0x131, + 0x408: 0x132, 0x409: 0xba, 0x40a: 0x133, 0x40b: 0x134, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xba, 0x40f: 0xba, + 0x410: 0x135, 0x411: 0x136, 0x412: 0x137, 0x413: 0x138, 0x414: 0xba, 0x415: 0xba, 0x416: 0x139, 0x417: 0x13a, + 0x418: 0x13b, 0x419: 0x13c, 0x41a: 0x13d, 0x41b: 0x13e, 0x41c: 0x13f, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba, + 0x420: 0x140, 0x421: 0xba, 0x422: 0x141, 0x423: 0x142, 0x424: 0xba, 0x425: 0xba, 0x426: 0x143, 0x427: 0x144, + 0x428: 0x145, 0x429: 0x146, 0x42a: 0x147, 0x42b: 0x148, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba, + 0x430: 0x149, 0x431: 0x14a, 0x432: 0x14b, 0x433: 0xba, 0x434: 0x14c, 0x435: 0x14d, 0x436: 0x14e, 0x437: 0xba, + 0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0x14f, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0x150, + // Block 0x11, offset 0x440 + 0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f, + 0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x151, 0x44f: 0xba, + 0x450: 0x9b, 0x451: 0x152, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x153, 0x456: 0xba, 0x457: 0xba, + 0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba, + 0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba, + 0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba, + 0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba, + 0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba, + // Block 0x12, offset 0x480 + 0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f, + 0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f, + 0x490: 0x154, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba, + 0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba, + 0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba, + 0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba, + 0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba, + 0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba, + 0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba, + 0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f, + 0x4d8: 0x9f, 0x4d9: 0x155, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba, + 0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba, + 0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba, + 0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba, + 0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba, + // Block 0x14, offset 0x500 + 0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba, + 0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba, + 0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba, + 0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba, + 0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f, + 0x528: 0x148, 0x529: 0x156, 0x52a: 0xba, 0x52b: 0x157, 0x52c: 0x158, 0x52d: 0x159, 0x52e: 0x15a, 0x52f: 0xba, + 0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba, + 0x538: 0xba, 0x539: 0x15b, 0x53a: 0x15c, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x15d, 0x53e: 0x15e, 0x53f: 0x15f, + // Block 0x15, offset 0x540 + 0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f, + 0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f, + 0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f, + 0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x160, + 0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f, + 0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x161, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba, + 0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba, + 0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba, + // Block 0x16, offset 0x580 + 0x580: 0x9f, 0x581: 0x9f, 0x582: 0x9f, 0x583: 0x9f, 0x584: 0x162, 0x585: 0x163, 0x586: 0x9f, 0x587: 0x9f, + 0x588: 0x9f, 0x589: 0x9f, 0x58a: 0x9f, 0x58b: 0x164, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba, + 0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba, + 0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba, + 0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba, + 0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba, + 0x5b0: 0x9f, 0x5b1: 0x165, 0x5b2: 0x166, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba, + 0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x167, 0x5c4: 0x168, 0x5c5: 0x169, 0x5c6: 0x16a, 0x5c7: 0x16b, + 0x5c8: 0x9b, 0x5c9: 0x16c, 0x5ca: 0xba, 0x5cb: 0x16d, 0x5cc: 0x9b, 0x5cd: 0x16e, 0x5ce: 0xba, 0x5cf: 0xba, + 0x5d0: 0x5f, 0x5d1: 0x60, 0x5d2: 0x61, 0x5d3: 0x62, 0x5d4: 0x63, 0x5d5: 0x64, 0x5d6: 0x65, 0x5d7: 0x66, + 0x5d8: 0x67, 0x5d9: 0x68, 0x5da: 0x69, 0x5db: 0x6a, 0x5dc: 0x6b, 0x5dd: 0x6c, 0x5de: 0x6d, 0x5df: 0x6e, + 0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b, + 0x5e8: 0x16f, 0x5e9: 0x170, 0x5ea: 0x171, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba, + 0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba, + 0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba, + // Block 0x18, offset 0x600 + 0x600: 0x172, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0x173, 0x605: 0x174, 0x606: 0xba, 0x607: 0xba, + 0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0x175, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba, + 0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba, + 0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba, + 0x620: 0x121, 0x621: 0x121, 0x622: 0x121, 0x623: 0x176, 0x624: 0x6f, 0x625: 0x177, 0x626: 0xba, 0x627: 0xba, + 0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba, + 0x630: 0xba, 0x631: 0x178, 0x632: 0x179, 0x633: 0xba, 0x634: 0x17a, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba, + 0x638: 0x70, 0x639: 0x71, 0x63a: 0x72, 0x63b: 0x17b, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba, + // Block 0x19, offset 0x640 + 0x640: 0x17c, 0x641: 0x9b, 0x642: 0x17d, 0x643: 0x17e, 0x644: 0x73, 0x645: 0x74, 0x646: 0x17f, 0x647: 0x180, + 0x648: 0x75, 0x649: 0x181, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b, + 0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b, + 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x182, 0x65c: 0x9b, 0x65d: 0x183, 0x65e: 0x9b, 0x65f: 0x184, + 0x660: 0x185, 0x661: 0x186, 0x662: 0x187, 0x663: 0xba, 0x664: 0x188, 0x665: 0x189, 0x666: 0x18a, 0x667: 0x18b, + 0x668: 0x9b, 0x669: 0x18c, 0x66a: 0x18d, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba, + 0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba, + 0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba, + // Block 0x1a, offset 0x680 + 0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f, + 0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f, + 0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f, + 0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x18e, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f, + 0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f, + 0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f, + 0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f, + 0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f, + 0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f, + 0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f, + 0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x18f, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f, + 0x6e0: 0x190, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f, + 0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f, + 0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f, + 0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f, + // Block 0x1c, offset 0x700 + 0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f, + 0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f, + 0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f, + 0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f, + 0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f, + 0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f, + 0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f, + 0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x191, 0x73b: 0x9f, 0x73c: 0x9f, 0x73d: 0x9f, 0x73e: 0x9f, 0x73f: 0x9f, + // Block 0x1d, offset 0x740 + 0x740: 0x9f, 0x741: 0x9f, 0x742: 0x9f, 0x743: 0x9f, 0x744: 0x9f, 0x745: 0x9f, 0x746: 0x9f, 0x747: 0x9f, + 0x748: 0x9f, 0x749: 0x9f, 0x74a: 0x9f, 0x74b: 0x9f, 0x74c: 0x9f, 0x74d: 0x9f, 0x74e: 0x9f, 0x74f: 0x9f, + 0x750: 0x9f, 0x751: 0x9f, 0x752: 0x9f, 0x753: 0x9f, 0x754: 0x9f, 0x755: 0x9f, 0x756: 0x9f, 0x757: 0x9f, + 0x758: 0x9f, 0x759: 0x9f, 0x75a: 0x9f, 0x75b: 0x9f, 0x75c: 0x9f, 0x75d: 0x9f, 0x75e: 0x9f, 0x75f: 0x9f, + 0x760: 0x9f, 0x761: 0x9f, 0x762: 0x9f, 0x763: 0x9f, 0x764: 0x9f, 0x765: 0x9f, 0x766: 0x9f, 0x767: 0x9f, + 0x768: 0x9f, 0x769: 0x9f, 0x76a: 0x9f, 0x76b: 0x9f, 0x76c: 0x9f, 0x76d: 0x9f, 0x76e: 0x9f, 0x76f: 0x192, + 0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba, + 0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba, + // Block 0x1e, offset 0x780 + 0x780: 0xba, 0x781: 0xba, 0x782: 0xba, 0x783: 0xba, 0x784: 0xba, 0x785: 0xba, 0x786: 0xba, 0x787: 0xba, + 0x788: 0xba, 0x789: 0xba, 0x78a: 0xba, 0x78b: 0xba, 0x78c: 0xba, 0x78d: 0xba, 0x78e: 0xba, 0x78f: 0xba, + 0x790: 0xba, 0x791: 0xba, 0x792: 0xba, 0x793: 0xba, 0x794: 0xba, 0x795: 0xba, 0x796: 0xba, 0x797: 0xba, + 0x798: 0xba, 0x799: 0xba, 0x79a: 0xba, 0x79b: 0xba, 0x79c: 0xba, 0x79d: 0xba, 0x79e: 0xba, 0x79f: 0xba, + 0x7a0: 0x76, 0x7a1: 0x77, 0x7a2: 0x78, 0x7a3: 0x193, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x194, 0x7a7: 0x7b, + 0x7a8: 0x7c, 0x7a9: 0xba, 0x7aa: 0xba, 0x7ab: 0xba, 0x7ac: 0xba, 0x7ad: 0xba, 0x7ae: 0xba, 0x7af: 0xba, + 0x7b0: 0xba, 0x7b1: 0xba, 0x7b2: 0xba, 0x7b3: 0xba, 0x7b4: 0xba, 0x7b5: 0xba, 0x7b6: 0xba, 0x7b7: 0xba, + 0x7b8: 0xba, 0x7b9: 0xba, 0x7ba: 0xba, 0x7bb: 0xba, 0x7bc: 0xba, 0x7bd: 0xba, 0x7be: 0xba, 0x7bf: 0xba, + // Block 0x1f, offset 0x7c0 + 0x7d0: 0x0d, 0x7d1: 0x0e, 0x7d2: 0x0f, 0x7d3: 0x10, 0x7d4: 0x11, 0x7d5: 0x0b, 0x7d6: 0x12, 0x7d7: 0x07, + 0x7d8: 0x13, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x14, 0x7dc: 0x0b, 0x7dd: 0x15, 0x7de: 0x16, 0x7df: 0x17, + 0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07, + 0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x18, 0x7eb: 0x19, 0x7ec: 0x1a, 0x7ed: 0x07, 0x7ee: 0x1b, 0x7ef: 0x1c, + 0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b, + 0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b, + // Block 0x20, offset 0x800 + 0x800: 0x0b, 0x801: 0x0b, 0x802: 0x0b, 0x803: 0x0b, 0x804: 0x0b, 0x805: 0x0b, 0x806: 0x0b, 0x807: 0x0b, + 0x808: 0x0b, 0x809: 0x0b, 0x80a: 0x0b, 0x80b: 0x0b, 0x80c: 0x0b, 0x80d: 0x0b, 0x80e: 0x0b, 0x80f: 0x0b, + 0x810: 0x0b, 0x811: 0x0b, 0x812: 0x0b, 0x813: 0x0b, 0x814: 0x0b, 0x815: 0x0b, 0x816: 0x0b, 0x817: 0x0b, + 0x818: 0x0b, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x0b, 0x81c: 0x0b, 0x81d: 0x0b, 0x81e: 0x0b, 0x81f: 0x0b, + 0x820: 0x0b, 0x821: 0x0b, 0x822: 0x0b, 0x823: 0x0b, 0x824: 0x0b, 0x825: 0x0b, 0x826: 0x0b, 0x827: 0x0b, + 0x828: 0x0b, 0x829: 0x0b, 0x82a: 0x0b, 0x82b: 0x0b, 0x82c: 0x0b, 0x82d: 0x0b, 0x82e: 0x0b, 0x82f: 0x0b, + 0x830: 0x0b, 0x831: 0x0b, 0x832: 0x0b, 0x833: 0x0b, 0x834: 0x0b, 0x835: 0x0b, 0x836: 0x0b, 0x837: 0x0b, + 0x838: 0x0b, 0x839: 0x0b, 0x83a: 0x0b, 0x83b: 0x0b, 0x83c: 0x0b, 0x83d: 0x0b, 0x83e: 0x0b, 0x83f: 0x0b, + // Block 0x21, offset 0x840 + 0x840: 0x195, 0x841: 0x196, 0x842: 0xba, 0x843: 0xba, 0x844: 0x197, 0x845: 0x197, 0x846: 0x197, 0x847: 0x198, + 0x848: 0xba, 0x849: 0xba, 0x84a: 0xba, 0x84b: 0xba, 0x84c: 0xba, 0x84d: 0xba, 0x84e: 0xba, 0x84f: 0xba, + 0x850: 0xba, 0x851: 0xba, 0x852: 0xba, 0x853: 0xba, 0x854: 0xba, 0x855: 0xba, 0x856: 0xba, 0x857: 0xba, + 0x858: 0xba, 0x859: 0xba, 0x85a: 0xba, 0x85b: 0xba, 0x85c: 0xba, 0x85d: 0xba, 0x85e: 0xba, 0x85f: 0xba, + 0x860: 0xba, 0x861: 0xba, 0x862: 0xba, 0x863: 0xba, 0x864: 0xba, 0x865: 0xba, 0x866: 0xba, 0x867: 0xba, + 0x868: 0xba, 0x869: 0xba, 0x86a: 0xba, 0x86b: 0xba, 0x86c: 0xba, 0x86d: 0xba, 0x86e: 0xba, 0x86f: 0xba, + 0x870: 0xba, 0x871: 0xba, 0x872: 0xba, 0x873: 0xba, 0x874: 0xba, 0x875: 0xba, 0x876: 0xba, 0x877: 0xba, + 0x878: 0xba, 0x879: 0xba, 0x87a: 0xba, 0x87b: 0xba, 0x87c: 0xba, 0x87d: 0xba, 0x87e: 0xba, 0x87f: 0xba, + // Block 0x22, offset 0x880 + 0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b, + 0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b, + 0x890: 0x0b, 0x891: 0x0b, 0x892: 0x0b, 0x893: 0x0b, 0x894: 0x0b, 0x895: 0x0b, 0x896: 0x0b, 0x897: 0x0b, + 0x898: 0x0b, 0x899: 0x0b, 0x89a: 0x0b, 0x89b: 0x0b, 0x89c: 0x0b, 0x89d: 0x0b, 0x89e: 0x0b, 0x89f: 0x0b, + 0x8a0: 0x1f, 0x8a1: 0x0b, 0x8a2: 0x0b, 0x8a3: 0x0b, 0x8a4: 0x0b, 0x8a5: 0x0b, 0x8a6: 0x0b, 0x8a7: 0x0b, + 0x8a8: 0x0b, 0x8a9: 0x0b, 0x8aa: 0x0b, 0x8ab: 0x0b, 0x8ac: 0x0b, 0x8ad: 0x0b, 0x8ae: 0x0b, 0x8af: 0x0b, + 0x8b0: 0x0b, 0x8b1: 0x0b, 0x8b2: 0x0b, 0x8b3: 0x0b, 0x8b4: 0x0b, 0x8b5: 0x0b, 0x8b6: 0x0b, 0x8b7: 0x0b, + 0x8b8: 0x0b, 0x8b9: 0x0b, 0x8ba: 0x0b, 0x8bb: 0x0b, 0x8bc: 0x0b, 0x8bd: 0x0b, 0x8be: 0x0b, 0x8bf: 0x0b, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b, + 0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b, +} + +// idnaSparseOffset: 284 entries, 568 bytes +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x86, 0x8b, 0x94, 0xa4, 0xb2, 0xbe, 0xca, 0xdb, 0xe5, 0xec, 0xf9, 0x10a, 0x111, 0x11c, 0x12b, 0x139, 0x143, 0x145, 0x14a, 0x14d, 0x150, 0x152, 0x15e, 0x169, 0x171, 0x177, 0x17d, 0x182, 0x187, 0x18a, 0x18e, 0x194, 0x199, 0x1a5, 0x1af, 0x1b5, 0x1c6, 0x1d0, 0x1d3, 0x1db, 0x1de, 0x1eb, 0x1f3, 0x1f7, 0x1fe, 0x206, 0x216, 0x222, 0x224, 0x22e, 0x23a, 0x246, 0x252, 0x25a, 0x25f, 0x26c, 0x27d, 0x281, 0x28c, 0x290, 0x299, 0x2a1, 0x2a7, 0x2ac, 0x2af, 0x2b3, 0x2b9, 0x2bd, 0x2c1, 0x2c5, 0x2cb, 0x2d3, 0x2da, 0x2e5, 0x2ef, 0x2f3, 0x2f6, 0x2fc, 0x300, 0x302, 0x305, 0x307, 0x30a, 0x314, 0x317, 0x326, 0x32a, 0x32f, 0x332, 0x336, 0x33b, 0x340, 0x346, 0x352, 0x361, 0x367, 0x36b, 0x37a, 0x37f, 0x387, 0x391, 0x39c, 0x3a4, 0x3b5, 0x3be, 0x3ce, 0x3db, 0x3e5, 0x3ea, 0x3f7, 0x3fb, 0x400, 0x402, 0x406, 0x408, 0x40c, 0x415, 0x41b, 0x41f, 0x42f, 0x439, 0x43e, 0x441, 0x447, 0x44e, 0x453, 0x457, 0x45d, 0x462, 0x46b, 0x470, 0x476, 0x47d, 0x484, 0x48b, 0x48f, 0x494, 0x497, 0x49c, 0x4a8, 0x4ae, 0x4b3, 0x4ba, 0x4c2, 0x4c7, 0x4cb, 0x4db, 0x4e2, 0x4e6, 0x4ea, 0x4f1, 0x4f3, 0x4f6, 0x4f9, 0x4fd, 0x506, 0x50a, 0x512, 0x51a, 0x51e, 0x524, 0x52d, 0x539, 0x540, 0x549, 0x553, 0x55a, 0x568, 0x575, 0x582, 0x58b, 0x58f, 0x59f, 0x5a7, 0x5b2, 0x5bb, 0x5c1, 0x5c9, 0x5d2, 0x5dd, 0x5e0, 0x5ec, 0x5f5, 0x5f8, 0x5fd, 0x602, 0x60f, 0x61a, 0x623, 0x62d, 0x630, 0x63a, 0x643, 0x64f, 0x65c, 0x669, 0x677, 0x67e, 0x682, 0x685, 0x68a, 0x68d, 0x692, 0x695, 0x69c, 0x6a3, 0x6a7, 0x6b2, 0x6b5, 0x6b8, 0x6bb, 0x6c1, 0x6c7, 0x6cd, 0x6d0, 0x6d3, 0x6d6, 0x6dd, 0x6e0, 0x6e5, 0x6ef, 0x6f2, 0x6f6, 0x705, 0x711, 0x715, 0x71a, 0x71e, 0x723, 0x727, 0x72c, 0x735, 0x740, 0x746, 0x74c, 0x752, 0x758, 0x761, 0x764, 0x767, 0x76b, 0x76f, 0x773, 0x779, 0x77f, 0x784, 0x787, 0x797, 0x79e, 0x7a1, 0x7a6, 0x7aa, 0x7b0, 0x7b5, 0x7b9, 0x7bf, 0x7c5, 0x7c9, 0x7d2, 0x7d7, 0x7da, 0x7dd, 0x7e1, 0x7e5, 0x7e8, 0x7f8, 0x809, 0x80e, 0x810, 0x812} + +// idnaSparseValues: 2069 entries, 8276 bytes +var idnaSparseValues = [2069]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x07}, + {value: 0xe105, lo: 0x80, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0x97}, + {value: 0xe105, lo: 0x98, hi: 0x9e}, + {value: 0x001f, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbf}, + // Block 0x1, offset 0x8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0xe01d, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0335, lo: 0x83, hi: 0x83}, + {value: 0x034d, lo: 0x84, hi: 0x84}, + {value: 0x0365, lo: 0x85, hi: 0x85}, + {value: 0xe00d, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0xe00d, lo: 0x88, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x89}, + {value: 0xe00d, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe00d, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0x8d}, + {value: 0xe00d, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0xbf}, + // Block 0x2, offset 0x19 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0249, lo: 0xb0, hi: 0xb0}, + {value: 0x037d, lo: 0xb1, hi: 0xb1}, + {value: 0x0259, lo: 0xb2, hi: 0xb2}, + {value: 0x0269, lo: 0xb3, hi: 0xb3}, + {value: 0x034d, lo: 0xb4, hi: 0xb4}, + {value: 0x0395, lo: 0xb5, hi: 0xb5}, + {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, + {value: 0x0279, lo: 0xb7, hi: 0xb7}, + {value: 0x0289, lo: 0xb8, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbf}, + // Block 0x3, offset 0x25 + {value: 0x0000, lo: 0x01}, + {value: 0x3308, lo: 0x80, hi: 0xbf}, + // Block 0x4, offset 0x27 + {value: 0x0000, lo: 0x04}, + {value: 0x03f5, lo: 0x80, hi: 0x8f}, + {value: 0xe105, lo: 0x90, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x5, offset 0x2c + {value: 0x0000, lo: 0x06}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x0545, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x0008, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x6, offset 0x33 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0401, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0018, lo: 0x89, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x7, offset 0x3e + {value: 0x0000, lo: 0x0b}, + {value: 0x0818, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x82}, + {value: 0x0818, lo: 0x83, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x85}, + {value: 0x0818, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xae}, + {value: 0x0808, lo: 0xaf, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x8, offset 0x4a + {value: 0x0000, lo: 0x03}, + {value: 0x0a08, lo: 0x80, hi: 0x87}, + {value: 0x0c08, lo: 0x88, hi: 0x99}, + {value: 0x0a08, lo: 0x9a, hi: 0xbf}, + // Block 0x9, offset 0x4e + {value: 0x0000, lo: 0x0e}, + {value: 0x3308, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0c08, lo: 0x8d, hi: 0x8d}, + {value: 0x0a08, lo: 0x8e, hi: 0x98}, + {value: 0x0c08, lo: 0x99, hi: 0x9b}, + {value: 0x0a08, lo: 0x9c, hi: 0xaa}, + {value: 0x0c08, lo: 0xab, hi: 0xac}, + {value: 0x0a08, lo: 0xad, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb1}, + {value: 0x0a08, lo: 0xb2, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb4}, + {value: 0x0a08, lo: 0xb5, hi: 0xb7}, + {value: 0x0c08, lo: 0xb8, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbf}, + // Block 0xa, offset 0x5d + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xb0}, + {value: 0x0808, lo: 0xb1, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xb, offset 0x62 + {value: 0x0000, lo: 0x09}, + {value: 0x0808, lo: 0x80, hi: 0x89}, + {value: 0x0a08, lo: 0x8a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbf}, + // Block 0xc, offset 0x6c + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x99}, + {value: 0x0808, lo: 0x9a, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa3}, + {value: 0x0808, lo: 0xa4, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa7}, + {value: 0x0808, lo: 0xa8, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0818, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd, offset 0x78 + {value: 0x0000, lo: 0x0d}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0a08, lo: 0xa0, hi: 0xa9}, + {value: 0x0c08, lo: 0xaa, hi: 0xac}, + {value: 0x0808, lo: 0xad, hi: 0xad}, + {value: 0x0c08, lo: 0xae, hi: 0xae}, + {value: 0x0a08, lo: 0xaf, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb2}, + {value: 0x0a08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0a08, lo: 0xb6, hi: 0xb8}, + {value: 0x0c08, lo: 0xb9, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0xe, offset 0x86 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x92}, + {value: 0x3308, lo: 0x93, hi: 0xa1}, + {value: 0x0840, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xbf}, + // Block 0xf, offset 0x8b + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x10, offset 0x94 + {value: 0x0000, lo: 0x0f}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x85}, + {value: 0x3008, lo: 0x86, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8c}, + {value: 0x3b08, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x11, offset 0xa4 + {value: 0x0000, lo: 0x0d}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x12, offset 0xb2 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xba}, + {value: 0x3b08, lo: 0xbb, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x13, offset 0xbe + {value: 0x0000, lo: 0x0b}, + {value: 0x0040, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x14, offset 0xca + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x89}, + {value: 0x3b08, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x3008, lo: 0x98, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x15, offset 0xdb + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x08f1, lo: 0xb3, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb9}, + {value: 0x3b08, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x16, offset 0xe5 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0xbf}, + // Block 0x17, offset 0xec + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0961, lo: 0x9c, hi: 0x9c}, + {value: 0x0999, lo: 0x9d, hi: 0x9d}, + {value: 0x0008, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x18, offset 0xf9 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe03d, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x19, offset 0x10a + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0x1a, offset 0x111 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x1b, offset 0x11c + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x3008, lo: 0xa2, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbf}, + // Block 0x1c, offset 0x12b + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x8c}, + {value: 0x3308, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x3008, lo: 0x9a, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1d, offset 0x139 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x86}, + {value: 0x055d, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8c}, + {value: 0x055d, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0xe105, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0x1e, offset 0x143 + {value: 0x0000, lo: 0x01}, + {value: 0x0018, lo: 0x80, hi: 0xbf}, + // Block 0x1f, offset 0x145 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa0}, + {value: 0x2018, lo: 0xa1, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x20, offset 0x14a + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa7}, + {value: 0x2018, lo: 0xa8, hi: 0xbf}, + // Block 0x21, offset 0x14d + {value: 0x0000, lo: 0x02}, + {value: 0x2018, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0xbf}, + // Block 0x22, offset 0x150 + {value: 0x0000, lo: 0x01}, + {value: 0x0008, lo: 0x80, hi: 0xbf}, + // Block 0x23, offset 0x152 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x24, offset 0x15e + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x25, offset 0x169 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x26, offset 0x171 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x27, offset 0x177 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x28, offset 0x17d + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x29, offset 0x182 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x2a, offset 0x187 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x2b, offset 0x18a + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xbf}, + // Block 0x2c, offset 0x18e + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x2d, offset 0x194 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x2e, offset 0x199 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x3b08, lo: 0x94, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x2f, offset 0x1a5 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x30, offset 0x1af + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xb3}, + {value: 0x3340, lo: 0xb4, hi: 0xb5}, + {value: 0x3008, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x31, offset 0x1b5 + {value: 0x0000, lo: 0x10}, + {value: 0x3008, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x91}, + {value: 0x3b08, lo: 0x92, hi: 0x92}, + {value: 0x3308, lo: 0x93, hi: 0x93}, + {value: 0x0018, lo: 0x94, hi: 0x96}, + {value: 0x0008, lo: 0x97, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x32, offset 0x1c6 + {value: 0x0000, lo: 0x09}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x86}, + {value: 0x0218, lo: 0x87, hi: 0x87}, + {value: 0x0018, lo: 0x88, hi: 0x8a}, + {value: 0x33c0, lo: 0x8b, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xbf}, + // Block 0x33, offset 0x1d0 + {value: 0x0000, lo: 0x02}, + {value: 0x0208, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x34, offset 0x1d3 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0208, lo: 0x87, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xa9}, + {value: 0x0208, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x35, offset 0x1db + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x36, offset 0x1de + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x37, offset 0x1eb + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x38, offset 0x1f3 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x39, offset 0x1f7 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0028, lo: 0x9a, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xbf}, + // Block 0x3a, offset 0x1fe + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x3308, lo: 0x97, hi: 0x98}, + {value: 0x3008, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x3b, offset 0x206 + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x94}, + {value: 0x3008, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3b08, lo: 0xa0, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xac}, + {value: 0x3008, lo: 0xad, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x3c, offset 0x216 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xbd}, + {value: 0x3318, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x3d, offset 0x222 + {value: 0x0000, lo: 0x01}, + {value: 0x0040, lo: 0x80, hi: 0xbf}, + // Block 0x3e, offset 0x224 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3008, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x3f, offset 0x22e + {value: 0x0000, lo: 0x0b}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x3808, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x40, offset 0x23a + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3808, lo: 0xaa, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xbf}, + // Block 0x41, offset 0x246 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3008, lo: 0xaa, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3808, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbf}, + // Block 0x42, offset 0x252 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x3008, lo: 0xa4, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x43, offset 0x25a + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x44, offset 0x25f + {value: 0x0000, lo: 0x0c}, + {value: 0x0e29, lo: 0x80, hi: 0x80}, + {value: 0x0e41, lo: 0x81, hi: 0x81}, + {value: 0x0e59, lo: 0x82, hi: 0x82}, + {value: 0x0e71, lo: 0x83, hi: 0x83}, + {value: 0x0e89, lo: 0x84, hi: 0x85}, + {value: 0x0ea1, lo: 0x86, hi: 0x86}, + {value: 0x0eb9, lo: 0x87, hi: 0x87}, + {value: 0x057d, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x059d, lo: 0x90, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbc}, + {value: 0x059d, lo: 0xbd, hi: 0xbf}, + // Block 0x45, offset 0x26c + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x92}, + {value: 0x0018, lo: 0x93, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa8}, + {value: 0x0008, lo: 0xa9, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x46, offset 0x27d + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0x47, offset 0x281 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x87}, + {value: 0xe045, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0xe045, lo: 0x98, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0xe045, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbf}, + // Block 0x48, offset 0x28c + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x3318, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x49, offset 0x290 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x24c1, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x4a, offset 0x299 + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x24f1, lo: 0xac, hi: 0xac}, + {value: 0x2529, lo: 0xad, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xae}, + {value: 0x2579, lo: 0xaf, hi: 0xaf}, + {value: 0x25b1, lo: 0xb0, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x4b, offset 0x2a1 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x9f}, + {value: 0x0080, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xad}, + {value: 0x0080, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x4c, offset 0x2a7 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xa8}, + {value: 0x09dd, lo: 0xa9, hi: 0xa9}, + {value: 0x09fd, lo: 0xaa, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xbf}, + // Block 0x4d, offset 0x2ac + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0x4e, offset 0x2af + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x28c1, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x4f, offset 0x2b3 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0e7e, lo: 0xb4, hi: 0xb4}, + {value: 0x292a, lo: 0xb5, hi: 0xb5}, + {value: 0x0e9e, lo: 0xb6, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x50, offset 0x2b9 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9b}, + {value: 0x2941, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0xbf}, + // Block 0x51, offset 0x2bd + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x52, offset 0x2c1 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0xbf}, + // Block 0x53, offset 0x2c5 + {value: 0x0000, lo: 0x05}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x03f5, lo: 0x90, hi: 0x9f}, + {value: 0x0ebd, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x54, offset 0x2cb + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x55, offset 0x2d3 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xae}, + {value: 0xe075, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0x56, offset 0x2da + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x57, offset 0x2e5 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xbf}, + // Block 0x58, offset 0x2ef + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x59, offset 0x2f3 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0x5a, offset 0x2f6 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9e}, + {value: 0x0ef5, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x5b, offset 0x2fc + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb2}, + {value: 0x0f15, lo: 0xb3, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x5c, offset 0x300 + {value: 0x0020, lo: 0x01}, + {value: 0x0f35, lo: 0x80, hi: 0xbf}, + // Block 0x5d, offset 0x302 + {value: 0x0020, lo: 0x02}, + {value: 0x1735, lo: 0x80, hi: 0x8f}, + {value: 0x1915, lo: 0x90, hi: 0xbf}, + // Block 0x5e, offset 0x305 + {value: 0x0020, lo: 0x01}, + {value: 0x1f15, lo: 0x80, hi: 0xbf}, + // Block 0x5f, offset 0x307 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x60, offset 0x30a + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9a}, + {value: 0x29e2, lo: 0x9b, hi: 0x9b}, + {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9e}, + {value: 0x2a31, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x61, offset 0x314 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x2a69, lo: 0xbf, hi: 0xbf}, + // Block 0x62, offset 0x317 + {value: 0x0000, lo: 0x0e}, + {value: 0x0040, lo: 0x80, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb0}, + {value: 0x2a35, lo: 0xb1, hi: 0xb1}, + {value: 0x2a55, lo: 0xb2, hi: 0xb2}, + {value: 0x2a75, lo: 0xb3, hi: 0xb3}, + {value: 0x2a95, lo: 0xb4, hi: 0xb4}, + {value: 0x2a75, lo: 0xb5, hi: 0xb5}, + {value: 0x2ab5, lo: 0xb6, hi: 0xb6}, + {value: 0x2ad5, lo: 0xb7, hi: 0xb7}, + {value: 0x2af5, lo: 0xb8, hi: 0xb9}, + {value: 0x2b15, lo: 0xba, hi: 0xbb}, + {value: 0x2b35, lo: 0xbc, hi: 0xbd}, + {value: 0x2b15, lo: 0xbe, hi: 0xbf}, + // Block 0x63, offset 0x326 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x64, offset 0x32a + {value: 0x0030, lo: 0x04}, + {value: 0x2aa2, lo: 0x80, hi: 0x9d}, + {value: 0x305a, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x30a2, lo: 0xa0, hi: 0xbf}, + // Block 0x65, offset 0x32f + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x66, offset 0x332 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x67, offset 0x336 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x68, offset 0x33b + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0x69, offset 0x340 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb1}, + {value: 0x0018, lo: 0xb2, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6a, offset 0x346 + {value: 0x0000, lo: 0x0b}, + {value: 0x0040, lo: 0x80, hi: 0x81}, + {value: 0xe00d, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0x83}, + {value: 0x03f5, lo: 0x84, hi: 0x84}, + {value: 0x1329, lo: 0x85, hi: 0x85}, + {value: 0x447d, lo: 0x86, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xb7}, + {value: 0x2009, lo: 0xb8, hi: 0xb8}, + {value: 0x6e89, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xbf}, + // Block 0x6b, offset 0x352 + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x3308, lo: 0x8b, hi: 0x8b}, + {value: 0x0008, lo: 0x8c, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x6c, offset 0x361 + {value: 0x0000, lo: 0x05}, + {value: 0x0208, lo: 0x80, hi: 0xb1}, + {value: 0x0108, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6d, offset 0x367 + {value: 0x0000, lo: 0x03}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xbf}, + // Block 0x6e, offset 0x36b + {value: 0x0000, lo: 0x0e}, + {value: 0x3008, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xba}, + {value: 0x0008, lo: 0xbb, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x6f, offset 0x37a + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x70, offset 0x37f + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x91}, + {value: 0x3008, lo: 0x92, hi: 0x92}, + {value: 0x3808, lo: 0x93, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x71, offset 0x387 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb9}, + {value: 0x3008, lo: 0xba, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x72, offset 0x391 + {value: 0x0000, lo: 0x0a}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x73, offset 0x39c + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x74, offset 0x3a4 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8c}, + {value: 0x3008, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0x75, offset 0x3b5 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x76, offset 0x3be + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x9a}, + {value: 0x0008, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3b08, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x77, offset 0x3ce + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x90}, + {value: 0x0008, lo: 0x91, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x78, offset 0x3db + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x449d, lo: 0x9c, hi: 0x9c}, + {value: 0x44b5, lo: 0x9d, hi: 0x9d}, + {value: 0x2971, lo: 0x9e, hi: 0x9e}, + {value: 0xe06d, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x44cd, lo: 0xb0, hi: 0xbf}, + // Block 0x79, offset 0x3e5 + {value: 0x0000, lo: 0x04}, + {value: 0x44ed, lo: 0x80, hi: 0x8f}, + {value: 0x450d, lo: 0x90, hi: 0x9f}, + {value: 0x452d, lo: 0xa0, hi: 0xaf}, + {value: 0x450d, lo: 0xb0, hi: 0xbf}, + // Block 0x7a, offset 0x3ea + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3b08, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x7b, offset 0x3f7 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x7c, offset 0x3fb + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x7d, offset 0x400 + {value: 0x0020, lo: 0x01}, + {value: 0x454d, lo: 0x80, hi: 0xbf}, + // Block 0x7e, offset 0x402 + {value: 0x0020, lo: 0x03}, + {value: 0x4d4d, lo: 0x80, hi: 0x94}, + {value: 0x4b0d, lo: 0x95, hi: 0x95}, + {value: 0x4fed, lo: 0x96, hi: 0xbf}, + // Block 0x7f, offset 0x406 + {value: 0x0020, lo: 0x01}, + {value: 0x552d, lo: 0x80, hi: 0xbf}, + // Block 0x80, offset 0x408 + {value: 0x0020, lo: 0x03}, + {value: 0x5d2d, lo: 0x80, hi: 0x84}, + {value: 0x568d, lo: 0x85, hi: 0x85}, + {value: 0x5dcd, lo: 0x86, hi: 0xbf}, + // Block 0x81, offset 0x40c + {value: 0x0020, lo: 0x08}, + {value: 0x6b8d, lo: 0x80, hi: 0x8f}, + {value: 0x6d4d, lo: 0x90, hi: 0x90}, + {value: 0x6d8d, lo: 0x91, hi: 0xab}, + {value: 0x6ea1, lo: 0xac, hi: 0xac}, + {value: 0x70ed, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x710d, lo: 0xb0, hi: 0xbf}, + // Block 0x82, offset 0x415 + {value: 0x0020, lo: 0x05}, + {value: 0x730d, lo: 0x80, hi: 0xad}, + {value: 0x656d, lo: 0xae, hi: 0xae}, + {value: 0x78cd, lo: 0xaf, hi: 0xb5}, + {value: 0x6f8d, lo: 0xb6, hi: 0xb6}, + {value: 0x79ad, lo: 0xb7, hi: 0xbf}, + // Block 0x83, offset 0x41b + {value: 0x0028, lo: 0x03}, + {value: 0x7c21, lo: 0x80, hi: 0x82}, + {value: 0x7be1, lo: 0x83, hi: 0x83}, + {value: 0x7c99, lo: 0x84, hi: 0xbf}, + // Block 0x84, offset 0x41f + {value: 0x0038, lo: 0x0f}, + {value: 0x9db1, lo: 0x80, hi: 0x83}, + {value: 0x9e59, lo: 0x84, hi: 0x85}, + {value: 0x9e91, lo: 0x86, hi: 0x87}, + {value: 0x9ec9, lo: 0x88, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0xa089, lo: 0x92, hi: 0x97}, + {value: 0xa1a1, lo: 0x98, hi: 0x9c}, + {value: 0xa281, lo: 0x9d, hi: 0xb3}, + {value: 0x9d41, lo: 0xb4, hi: 0xb4}, + {value: 0x9db1, lo: 0xb5, hi: 0xb5}, + {value: 0xa789, lo: 0xb6, hi: 0xbb}, + {value: 0xa869, lo: 0xbc, hi: 0xbc}, + {value: 0xa7f9, lo: 0xbd, hi: 0xbd}, + {value: 0xa8d9, lo: 0xbe, hi: 0xbf}, + // Block 0x85, offset 0x42f + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x0008, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x86, offset 0x439 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0x87, offset 0x43e + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x88, offset 0x441 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x89, offset 0x447 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x8a, offset 0x44e + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x8b, offset 0x453 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x8c, offset 0x457 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x8d, offset 0x45d + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xbf}, + // Block 0x8e, offset 0x462 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x8f, offset 0x46b + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x90, offset 0x470 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x91, offset 0x476 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x97}, + {value: 0x8b0d, lo: 0x98, hi: 0x9f}, + {value: 0x8b25, lo: 0xa0, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xbf}, + // Block 0x92, offset 0x47d + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x8b25, lo: 0xb0, hi: 0xb7}, + {value: 0x8b0d, lo: 0xb8, hi: 0xbf}, + // Block 0x93, offset 0x484 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x94, offset 0x48b + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x95, offset 0x48f + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xae}, + {value: 0x0018, lo: 0xaf, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x96, offset 0x494 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x97, offset 0x497 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xbf}, + // Block 0x98, offset 0x49c + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0808, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0808, lo: 0x8a, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb6}, + {value: 0x0808, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbb}, + {value: 0x0808, lo: 0xbc, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x0808, lo: 0xbf, hi: 0xbf}, + // Block 0x99, offset 0x4a8 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0818, lo: 0x97, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb6}, + {value: 0x0818, lo: 0xb7, hi: 0xbf}, + // Block 0x9a, offset 0x4ae + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa6}, + {value: 0x0818, lo: 0xa7, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x9b, offset 0x4b3 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x0818, lo: 0xbb, hi: 0xbf}, + // Block 0x9c, offset 0x4ba + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0818, lo: 0x96, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0818, lo: 0xbf, hi: 0xbf}, + // Block 0x9d, offset 0x4c2 + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbb}, + {value: 0x0818, lo: 0xbc, hi: 0xbd}, + {value: 0x0808, lo: 0xbe, hi: 0xbf}, + // Block 0x9e, offset 0x4c7 + {value: 0x0000, lo: 0x03}, + {value: 0x0818, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x0818, lo: 0x92, hi: 0xbf}, + // Block 0x9f, offset 0x4cb + {value: 0x0000, lo: 0x0f}, + {value: 0x0808, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x94}, + {value: 0x0808, lo: 0x95, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x98}, + {value: 0x0808, lo: 0x99, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xa0, offset 0x4db + {value: 0x0000, lo: 0x06}, + {value: 0x0818, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0818, lo: 0x90, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xbc}, + {value: 0x0818, lo: 0xbd, hi: 0xbf}, + // Block 0xa1, offset 0x4e2 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xa2, offset 0x4e6 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xbf}, + // Block 0xa3, offset 0x4ea + {value: 0x0000, lo: 0x06}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0818, lo: 0x98, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb7}, + {value: 0x0818, lo: 0xb8, hi: 0xbf}, + // Block 0xa4, offset 0x4f1 + {value: 0x0000, lo: 0x01}, + {value: 0x0808, lo: 0x80, hi: 0xbf}, + // Block 0xa5, offset 0x4f3 + {value: 0x0000, lo: 0x02}, + {value: 0x0808, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xa6, offset 0x4f6 + {value: 0x0000, lo: 0x02}, + {value: 0x03dd, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xa7, offset 0x4f9 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xbf}, + // Block 0xa8, offset 0x4fd + {value: 0x0000, lo: 0x08}, + {value: 0x0908, lo: 0x80, hi: 0x80}, + {value: 0x0a08, lo: 0x81, hi: 0xa1}, + {value: 0x0c08, lo: 0xa2, hi: 0xa2}, + {value: 0x0a08, lo: 0xa3, hi: 0xa3}, + {value: 0x3308, lo: 0xa4, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0808, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xa9, offset 0x506 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0818, lo: 0xa0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xaa, offset 0x50a + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0xa6}, + {value: 0x0808, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0a08, lo: 0xb0, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb3}, + {value: 0x0a08, lo: 0xb4, hi: 0xbf}, + // Block 0xab, offset 0x512 + {value: 0x0000, lo: 0x07}, + {value: 0x0a08, lo: 0x80, hi: 0x84}, + {value: 0x0808, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x90}, + {value: 0x0a18, lo: 0x91, hi: 0x93}, + {value: 0x0c18, lo: 0x94, hi: 0x94}, + {value: 0x0818, lo: 0x95, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xac, offset 0x51a + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xad, offset 0x51e + {value: 0x0000, lo: 0x05}, + {value: 0x3008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xae, offset 0x524 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x91}, + {value: 0x0018, lo: 0x92, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xaf, offset 0x52d + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0xb0, offset 0x539 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb1, offset 0x540 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb2}, + {value: 0x3b08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xbf}, + // Block 0xb2, offset 0x549 + {value: 0x0000, lo: 0x09}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xb3, offset 0x553 + {value: 0x0000, lo: 0x06}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xbe}, + {value: 0x3008, lo: 0xbf, hi: 0xbf}, + // Block 0xb4, offset 0x55a + {value: 0x0000, lo: 0x0d}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xb5, offset 0x568 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3808, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xb6, offset 0x575 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xb7, offset 0x582 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x3308, lo: 0x9f, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa9}, + {value: 0x3b08, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb8, offset 0x58b + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xb9, offset 0x58f + {value: 0x0000, lo: 0x0f}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xba, offset 0x59f + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xbb, offset 0x5a7 + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x85}, + {value: 0x0018, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xbc, offset 0x5b2 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbd, offset 0x5bb + {value: 0x0000, lo: 0x05}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9b}, + {value: 0x3308, lo: 0x9c, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xbe, offset 0x5c1 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbf, offset 0x5c9 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xc0, offset 0x5d2 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb5}, + {value: 0x3808, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xc1, offset 0x5dd + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xc2, offset 0x5e0 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xc3, offset 0x5ec + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0xc4, offset 0x5f5 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xbf}, + // Block 0xc5, offset 0x5f8 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0xc6, offset 0x5fd + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xbf}, + // Block 0xc7, offset 0x602 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x3008, lo: 0x91, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x99}, + {value: 0x3308, lo: 0x9a, hi: 0x9b}, + {value: 0x3008, lo: 0x9c, hi: 0x9f}, + {value: 0x3b08, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x0018, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xa3}, + {value: 0x3008, lo: 0xa4, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xbf}, + // Block 0xc8, offset 0x60f + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0xc9, offset 0x61a + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x3b08, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0xbf}, + // Block 0xca, offset 0x623 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x98}, + {value: 0x3b08, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xa2}, + {value: 0x0040, lo: 0xa3, hi: 0xbf}, + // Block 0xcb, offset 0x62d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xcc, offset 0x630 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xcd, offset 0x63a + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xbf}, + // Block 0xce, offset 0x643 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xa9}, + {value: 0x3308, lo: 0xaa, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xcf, offset 0x64f + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xd0, offset 0x65c + {value: 0x0000, lo: 0x0c}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xbf}, + // Block 0xd1, offset 0x669 + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x3008, lo: 0x93, hi: 0x94}, + {value: 0x3308, lo: 0x95, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x96}, + {value: 0x3b08, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xbf}, + // Block 0xd2, offset 0x677 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xd3, offset 0x67e + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0xd4, offset 0x682 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xd5, offset 0x685 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xd6, offset 0x68a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xd7, offset 0x68d + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0340, lo: 0xb0, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xd8, offset 0x692 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0xbf}, + // Block 0xd9, offset 0x695 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xda, offset 0x69c + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xdb, offset 0x6a3 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0xdc, offset 0x6a7 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0xdd, offset 0x6b2 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0xde, offset 0x6b5 + {value: 0x0000, lo: 0x02}, + {value: 0xe105, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0xdf, offset 0x6b8 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0xe0, offset 0x6bb + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3008, lo: 0x91, hi: 0xbf}, + // Block 0xe1, offset 0x6c1 + {value: 0x0000, lo: 0x05}, + {value: 0x3008, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xe2, offset 0x6c7 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa1}, + {value: 0x0018, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xbf}, + // Block 0xe3, offset 0x6cd + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0xe4, offset 0x6d0 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xe5, offset 0x6d3 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xe6, offset 0x6d6 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x92}, + {value: 0x0040, lo: 0x93, hi: 0xa3}, + {value: 0x0008, lo: 0xa4, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xe7, offset 0x6dd + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0xe8, offset 0x6e0 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0xe9, offset 0x6e5 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x03c0, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xbf}, + // Block 0xea, offset 0x6ef + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xeb, offset 0x6f2 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xbf}, + // Block 0xec, offset 0x6f6 + {value: 0x0000, lo: 0x0e}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0xb5b9, lo: 0x9e, hi: 0x9e}, + {value: 0xb601, lo: 0x9f, hi: 0x9f}, + {value: 0xb649, lo: 0xa0, hi: 0xa0}, + {value: 0xb6b1, lo: 0xa1, hi: 0xa1}, + {value: 0xb719, lo: 0xa2, hi: 0xa2}, + {value: 0xb781, lo: 0xa3, hi: 0xa3}, + {value: 0xb7e9, lo: 0xa4, hi: 0xa4}, + {value: 0x3018, lo: 0xa5, hi: 0xa6}, + {value: 0x3318, lo: 0xa7, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xac}, + {value: 0x3018, lo: 0xad, hi: 0xb2}, + {value: 0x0340, lo: 0xb3, hi: 0xba}, + {value: 0x3318, lo: 0xbb, hi: 0xbf}, + // Block 0xed, offset 0x705 + {value: 0x0000, lo: 0x0b}, + {value: 0x3318, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x84}, + {value: 0x3318, lo: 0x85, hi: 0x8b}, + {value: 0x0018, lo: 0x8c, hi: 0xa9}, + {value: 0x3318, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xba}, + {value: 0xb851, lo: 0xbb, hi: 0xbb}, + {value: 0xb899, lo: 0xbc, hi: 0xbc}, + {value: 0xb8e1, lo: 0xbd, hi: 0xbd}, + {value: 0xb949, lo: 0xbe, hi: 0xbe}, + {value: 0xb9b1, lo: 0xbf, hi: 0xbf}, + // Block 0xee, offset 0x711 + {value: 0x0000, lo: 0x03}, + {value: 0xba19, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xbf}, + // Block 0xef, offset 0x715 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x3318, lo: 0x82, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0xbf}, + // Block 0xf0, offset 0x71a + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0xf1, offset 0x71e + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xf2, offset 0x723 + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0xf3, offset 0x727 + {value: 0x0000, lo: 0x04}, + {value: 0x3308, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0xf4, offset 0x72c + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x3308, lo: 0xa1, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xf5, offset 0x735 + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0xf6, offset 0x740 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0xf7, offset 0x746 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0xf8, offset 0x74c + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0xf9, offset 0x752 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x86}, + {value: 0x0818, lo: 0x87, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xfa, offset 0x758 + {value: 0x0000, lo: 0x08}, + {value: 0x0a08, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x8a}, + {value: 0x0b08, lo: 0x8b, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0818, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xfb, offset 0x761 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xb0}, + {value: 0x0818, lo: 0xb1, hi: 0xbf}, + // Block 0xfc, offset 0x764 + {value: 0x0000, lo: 0x02}, + {value: 0x0818, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xfd, offset 0x767 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0818, lo: 0x81, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0xfe, offset 0x76b + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xff, offset 0x76f + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x100, offset 0x773 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x101, offset 0x779 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x102, offset 0x77f + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0xc1d9, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0x103, offset 0x784 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xbf}, + // Block 0x104, offset 0x787 + {value: 0x0000, lo: 0x0f}, + {value: 0xc801, lo: 0x80, hi: 0x80}, + {value: 0xc851, lo: 0x81, hi: 0x81}, + {value: 0xc8a1, lo: 0x82, hi: 0x82}, + {value: 0xc8f1, lo: 0x83, hi: 0x83}, + {value: 0xc941, lo: 0x84, hi: 0x84}, + {value: 0xc991, lo: 0x85, hi: 0x85}, + {value: 0xc9e1, lo: 0x86, hi: 0x86}, + {value: 0xca31, lo: 0x87, hi: 0x87}, + {value: 0xca81, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0xcad1, lo: 0x90, hi: 0x90}, + {value: 0xcaf1, lo: 0x91, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xbf}, + // Block 0x105, offset 0x797 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x106, offset 0x79e + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x107, offset 0x7a1 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0x108, offset 0x7a6 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x109, offset 0x7aa + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x10a, offset 0x7b0 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xbf}, + // Block 0x10b, offset 0x7b5 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x10c, offset 0x7b9 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xb2}, + {value: 0x0018, lo: 0xb3, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0x10d, offset 0x7bf + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xa2}, + {value: 0x0040, lo: 0xa3, hi: 0xa4}, + {value: 0x0018, lo: 0xa5, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xbf}, + // Block 0x10e, offset 0x7c5 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x10f, offset 0x7c9 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x110, offset 0x7d2 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x111, offset 0x7d7 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0x112, offset 0x7da + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x113, offset 0x7dd + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x114, offset 0x7e1 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x115, offset 0x7e5 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x116, offset 0x7e8 + {value: 0x0020, lo: 0x0f}, + {value: 0xded1, lo: 0x80, hi: 0x89}, + {value: 0x8e35, lo: 0x8a, hi: 0x8a}, + {value: 0xe011, lo: 0x8b, hi: 0x9c}, + {value: 0x8e55, lo: 0x9d, hi: 0x9d}, + {value: 0xe251, lo: 0x9e, hi: 0xa2}, + {value: 0x8e75, lo: 0xa3, hi: 0xa3}, + {value: 0xe2f1, lo: 0xa4, hi: 0xab}, + {value: 0x7f0d, lo: 0xac, hi: 0xac}, + {value: 0xe3f1, lo: 0xad, hi: 0xaf}, + {value: 0x8e95, lo: 0xb0, hi: 0xb0}, + {value: 0xe451, lo: 0xb1, hi: 0xb6}, + {value: 0x8eb5, lo: 0xb7, hi: 0xb9}, + {value: 0xe511, lo: 0xba, hi: 0xba}, + {value: 0x8f15, lo: 0xbb, hi: 0xbb}, + {value: 0xe531, lo: 0xbc, hi: 0xbf}, + // Block 0x117, offset 0x7f8 + {value: 0x0020, lo: 0x10}, + {value: 0x93b5, lo: 0x80, hi: 0x80}, + {value: 0xf0b1, lo: 0x81, hi: 0x86}, + {value: 0x93d5, lo: 0x87, hi: 0x8a}, + {value: 0xda11, lo: 0x8b, hi: 0x8b}, + {value: 0xf171, lo: 0x8c, hi: 0x96}, + {value: 0x9455, lo: 0x97, hi: 0x97}, + {value: 0xf2d1, lo: 0x98, hi: 0xa3}, + {value: 0x9475, lo: 0xa4, hi: 0xa6}, + {value: 0xf451, lo: 0xa7, hi: 0xaa}, + {value: 0x94d5, lo: 0xab, hi: 0xab}, + {value: 0xf4d1, lo: 0xac, hi: 0xac}, + {value: 0x94f5, lo: 0xad, hi: 0xad}, + {value: 0xf4f1, lo: 0xae, hi: 0xaf}, + {value: 0x9515, lo: 0xb0, hi: 0xb1}, + {value: 0xf531, lo: 0xb2, hi: 0xbe}, + {value: 0x2040, lo: 0xbf, hi: 0xbf}, + // Block 0x118, offset 0x809 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0340, lo: 0x81, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x9f}, + {value: 0x0340, lo: 0xa0, hi: 0xbf}, + // Block 0x119, offset 0x80e + {value: 0x0000, lo: 0x01}, + {value: 0x0340, lo: 0x80, hi: 0xbf}, + // Block 0x11a, offset 0x810 + {value: 0x0000, lo: 0x01}, + {value: 0x33c0, lo: 0x80, hi: 0xbf}, + // Block 0x11b, offset 0x812 + {value: 0x0000, lo: 0x02}, + {value: 0x33c0, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, +} + +// Total table size 42780 bytes (41KiB); checksum: 29936AB9 diff --git a/vendor/golang.org/x/net/idna/tables9.0.0.go b/vendor/golang.org/x/net/idna/tables9.0.0.go new file mode 100644 index 00000000..8b65fa16 --- /dev/null +++ b/vendor/golang.org/x/net/idna/tables9.0.0.go @@ -0,0 +1,4486 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// +build !go1.10 + +package idna + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "9.0.0" + +var mappings string = "" + // Size: 8175 bytes + "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + + "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + + "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + + "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + + "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + + "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + + "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + + "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + + "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + + "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + + "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + + "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + + "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + + "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + + "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + + "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + + "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + + "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + + "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + + "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + + "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + + "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + + "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + + "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + + "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + + "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + + ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + + "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + + "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + + "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + + "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + + "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + + "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + + "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + + "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + + "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" + + "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" + + "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" + + "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" + + "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" + + "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" + + "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" + + "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" + + "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" + + "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" + + "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + + "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + + "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + + "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + + "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + + "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + + "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + + "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + + "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + + "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + + "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + + "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" + + "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" + + "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" + + "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" + + "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" + + "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" + + "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" + + "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" + + "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" + + "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" + + "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" + + "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" + + "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" + + "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" + + "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" + + "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" + + "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" + + " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" + + "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" + + "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" + + "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" + + "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" + + "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" + + "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" + + "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" + + "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" + + "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" + + "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" + + "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" + + "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" + + "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" + + "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" + + "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" + + "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" + + "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" + + "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" + + "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" + + "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" + + "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" + + "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" + + "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" + + "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" + + "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" + + "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" + + "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" + + "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" + + "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" + + "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" + + "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" + + "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" + + "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" + + "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" + + "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" + + "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" + + "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" + + "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" + + "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" + + "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" + + "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" + + "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" + + "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" + + "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" + + "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" + + "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" + + "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" + + "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" + + "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" + + "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" + + "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" + + "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" + + "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" + + "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" + + "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" + + "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" + + "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" + + "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" + + "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" + + "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" + + "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" + + "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" + + "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" + +var xorData string = "" + // Size: 4855 bytes + "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + + "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + + "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + + "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + + "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + + "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + + "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + + "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + + "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + + "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" + + "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" + + "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" + + "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" + + "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" + + "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" + + "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" + + "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" + + "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" + + "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" + + "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" + + "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" + + "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" + + "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" + + "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" + + "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" + + "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" + + "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" + + "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" + + "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" + + "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" + + "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" + + "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" + + "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" + + "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" + + "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" + + "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" + + "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " + + "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" + + "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" + + "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" + + "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" + + "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" + + ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" + + "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" + + "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" + + "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" + + "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" + + "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" + + "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" + + "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" + + "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" + + "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" + + "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" + + "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" + + "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" + + "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" + + "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" + + "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" + + "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" + + "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" + + "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" + + "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + + "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + + "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + + "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + + "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + + "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + + "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + + "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + + "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + + "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + + "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + + "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + + "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + + "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + + "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + + "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + + "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + + "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + + "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + + "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + + "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + + "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + + "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + + "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + + "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + + "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + + "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + + "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + + "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + + "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + + "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + + "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + + ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + + "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + + "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + + "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + + "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + + "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + + "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + + "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + + "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + + "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + + "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + + "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + + "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" + + "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" + + "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" + + "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" + + "\x08\x1a\x0a\x03\x07\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" + + "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" + + "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" + + "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" + + "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" + + "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" + + "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" + + "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" + + "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" + + "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" + + "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" + + "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" + + "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" + + "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" + + "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" + + "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" + + "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" + + "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." + + "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + + "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + + "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + + "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + + "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + + "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + + "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + + "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + + "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + + "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + + "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + + "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + + "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + + "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + + "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + + "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + + "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + + "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + + "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + + "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + + "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + + "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + + "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + + "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + + "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + + "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + + "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + + "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + + "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + + "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + + "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + + "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + + "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + + "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + + "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + + "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + + "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + + "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + + "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + + "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + + "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + + "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + + "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + + "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + + "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + + "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + + "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + + "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + + "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + + "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + + "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + + "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + + "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + + "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + + "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + + "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + + "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + + "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + + "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + + "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + + "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + + "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + + "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + + "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + + "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + + "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + + "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + + "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + + "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + + "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + + "\x04\x03\x0c?\x05\x03\x0c" + + "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + + "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + + "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + + "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + + "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + + "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" + + "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" + + "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" + + "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" + + "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" + + "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" + + "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" + + "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" + + "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" + + "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" + + "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" + + "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" + + "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" + + "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" + + "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" + + "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" + + "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" + + "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" + + "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" + + "\x05\x22\x05\x03\x050\x1d" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// idnaTrie. Total size: 28600 bytes (27.93 KiB). Checksum: 95575047b5d8fff. +type idnaTrie struct{} + +func newIdnaTrie(i int) *idnaTrie { + return &idnaTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 124: + return uint16(idnaValues[n<<6+uint32(b)]) + default: + n -= 124 + return uint16(idnaSparse.lookup(n, b)) + } +} + +// idnaValues: 126 blocks, 8064 entries, 16128 bytes +// The third block is the zero block. +var idnaValues = [8064]uint16{ + // Block 0x0, offset 0x0 + 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, + 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, + 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, + 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, + 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, + 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, + 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, + 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, + 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, + 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, + 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, + // Block 0x1, offset 0x40 + 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, + 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, + 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, + 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, + 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, + 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, + 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, + 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, + 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, + 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, + 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, + 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, + 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, + 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, + 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, + 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, + 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, + 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, + 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, + // Block 0x4, offset 0x100 + 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, + 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, + 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, + 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, + 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, + 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, + 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, + 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, + 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, + 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, + 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, + // Block 0x5, offset 0x140 + 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, + 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, + 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, + 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, + 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, + 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, + 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, + 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, + 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, + 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, + // Block 0x6, offset 0x180 + 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, + 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, + 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, + 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, + 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, + 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, + 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, + 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, + 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, + 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, + 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, + 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, + 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, + 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, + 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, + 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, + 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, + 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, + 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, + 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, + 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, + // Block 0x8, offset 0x200 + 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, + 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, + 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, + 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, + 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, + 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, + 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, + 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, + 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, + 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, + // Block 0x9, offset 0x240 + 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, + 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, + 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, + 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, + 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, + 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, + 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, + 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, + 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, + 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, + // Block 0xa, offset 0x280 + 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, + 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308, + 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308, + 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308, + 0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308, + 0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308, + 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308, + 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308, + 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, + 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, + 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, + 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, + 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, + 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, + 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, + 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, + 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, + 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, + 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, + // Block 0xc, offset 0x300 + 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, + 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, + 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, + 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, + 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, + 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, + 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, + 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, + 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, + 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, + 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, + // Block 0xd, offset 0x340 + 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, + 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, + 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, + 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, + 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, + 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, + 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, + 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, + 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, + 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, + 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, + // Block 0xe, offset 0x380 + 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308, + 0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008, + 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, + 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, + 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, + 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, + 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, + 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, + 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, + 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, + 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, + 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, + 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, + 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, + 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, + 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, + 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, + 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, + 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, + 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, + 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, + // Block 0x10, offset 0x400 + 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, + 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, + 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, + 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, + 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, + 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, + 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, + 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, + 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, + 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, + 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, + // Block 0x11, offset 0x440 + 0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840, + 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818, + 0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308, + 0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308, + 0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040, + 0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08, + 0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08, + 0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08, + 0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08, + 0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08, + 0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08, + // Block 0x12, offset 0x480 + 0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08, + 0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308, + 0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308, + 0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308, + 0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308, + 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808, + 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808, + 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08, + 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429, + 0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, + 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08, + 0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08, + 0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08, + 0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308, + 0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840, + 0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308, + 0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018, + 0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08, + 0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008, + 0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08, + 0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08, + // Block 0x14, offset 0x500 + 0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818, + 0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818, + 0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308, + 0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08, + 0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08, + 0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08, + 0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08, + 0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08, + 0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308, + 0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308, + 0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308, + // Block 0x15, offset 0x540 + 0x540: 0x3008, 0x541: 0x3308, 0x542: 0x3308, 0x543: 0x3308, 0x544: 0x3308, 0x545: 0x3308, + 0x546: 0x3308, 0x547: 0x3308, 0x548: 0x3308, 0x549: 0x3008, 0x54a: 0x3008, 0x54b: 0x3008, + 0x54c: 0x3008, 0x54d: 0x3b08, 0x54e: 0x3008, 0x54f: 0x3008, 0x550: 0x0008, 0x551: 0x3308, + 0x552: 0x3308, 0x553: 0x3308, 0x554: 0x3308, 0x555: 0x3308, 0x556: 0x3308, 0x557: 0x3308, + 0x558: 0x04c9, 0x559: 0x0501, 0x55a: 0x0539, 0x55b: 0x0571, 0x55c: 0x05a9, 0x55d: 0x05e1, + 0x55e: 0x0619, 0x55f: 0x0651, 0x560: 0x0008, 0x561: 0x0008, 0x562: 0x3308, 0x563: 0x3308, + 0x564: 0x0018, 0x565: 0x0018, 0x566: 0x0008, 0x567: 0x0008, 0x568: 0x0008, 0x569: 0x0008, + 0x56a: 0x0008, 0x56b: 0x0008, 0x56c: 0x0008, 0x56d: 0x0008, 0x56e: 0x0008, 0x56f: 0x0008, + 0x570: 0x0018, 0x571: 0x0008, 0x572: 0x0008, 0x573: 0x0008, 0x574: 0x0008, 0x575: 0x0008, + 0x576: 0x0008, 0x577: 0x0008, 0x578: 0x0008, 0x579: 0x0008, 0x57a: 0x0008, 0x57b: 0x0008, + 0x57c: 0x0008, 0x57d: 0x0008, 0x57e: 0x0008, 0x57f: 0x0008, + // Block 0x16, offset 0x580 + 0x580: 0x0008, 0x581: 0x3308, 0x582: 0x3008, 0x583: 0x3008, 0x584: 0x0040, 0x585: 0x0008, + 0x586: 0x0008, 0x587: 0x0008, 0x588: 0x0008, 0x589: 0x0008, 0x58a: 0x0008, 0x58b: 0x0008, + 0x58c: 0x0008, 0x58d: 0x0040, 0x58e: 0x0040, 0x58f: 0x0008, 0x590: 0x0008, 0x591: 0x0040, + 0x592: 0x0040, 0x593: 0x0008, 0x594: 0x0008, 0x595: 0x0008, 0x596: 0x0008, 0x597: 0x0008, + 0x598: 0x0008, 0x599: 0x0008, 0x59a: 0x0008, 0x59b: 0x0008, 0x59c: 0x0008, 0x59d: 0x0008, + 0x59e: 0x0008, 0x59f: 0x0008, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x0008, 0x5a3: 0x0008, + 0x5a4: 0x0008, 0x5a5: 0x0008, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0040, + 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, + 0x5b0: 0x0008, 0x5b1: 0x0040, 0x5b2: 0x0008, 0x5b3: 0x0040, 0x5b4: 0x0040, 0x5b5: 0x0040, + 0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0040, 0x5bb: 0x0040, + 0x5bc: 0x3308, 0x5bd: 0x0008, 0x5be: 0x3008, 0x5bf: 0x3008, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x3008, 0x5c1: 0x3308, 0x5c2: 0x3308, 0x5c3: 0x3308, 0x5c4: 0x3308, 0x5c5: 0x0040, + 0x5c6: 0x0040, 0x5c7: 0x3008, 0x5c8: 0x3008, 0x5c9: 0x0040, 0x5ca: 0x0040, 0x5cb: 0x3008, + 0x5cc: 0x3008, 0x5cd: 0x3b08, 0x5ce: 0x0008, 0x5cf: 0x0040, 0x5d0: 0x0040, 0x5d1: 0x0040, + 0x5d2: 0x0040, 0x5d3: 0x0040, 0x5d4: 0x0040, 0x5d5: 0x0040, 0x5d6: 0x0040, 0x5d7: 0x3008, + 0x5d8: 0x0040, 0x5d9: 0x0040, 0x5da: 0x0040, 0x5db: 0x0040, 0x5dc: 0x0689, 0x5dd: 0x06c1, + 0x5de: 0x0040, 0x5df: 0x06f9, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x3308, 0x5e3: 0x3308, + 0x5e4: 0x0040, 0x5e5: 0x0040, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0008, + 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, + 0x5f0: 0x0008, 0x5f1: 0x0008, 0x5f2: 0x0018, 0x5f3: 0x0018, 0x5f4: 0x0018, 0x5f5: 0x0018, + 0x5f6: 0x0018, 0x5f7: 0x0018, 0x5f8: 0x0018, 0x5f9: 0x0018, 0x5fa: 0x0018, 0x5fb: 0x0018, + 0x5fc: 0x0040, 0x5fd: 0x0040, 0x5fe: 0x0040, 0x5ff: 0x0040, + // Block 0x18, offset 0x600 + 0x600: 0x0040, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3008, 0x604: 0x0040, 0x605: 0x0008, + 0x606: 0x0008, 0x607: 0x0008, 0x608: 0x0008, 0x609: 0x0008, 0x60a: 0x0008, 0x60b: 0x0040, + 0x60c: 0x0040, 0x60d: 0x0040, 0x60e: 0x0040, 0x60f: 0x0008, 0x610: 0x0008, 0x611: 0x0040, + 0x612: 0x0040, 0x613: 0x0008, 0x614: 0x0008, 0x615: 0x0008, 0x616: 0x0008, 0x617: 0x0008, + 0x618: 0x0008, 0x619: 0x0008, 0x61a: 0x0008, 0x61b: 0x0008, 0x61c: 0x0008, 0x61d: 0x0008, + 0x61e: 0x0008, 0x61f: 0x0008, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x0008, 0x623: 0x0008, + 0x624: 0x0008, 0x625: 0x0008, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0040, + 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, + 0x630: 0x0008, 0x631: 0x0040, 0x632: 0x0008, 0x633: 0x0731, 0x634: 0x0040, 0x635: 0x0008, + 0x636: 0x0769, 0x637: 0x0040, 0x638: 0x0008, 0x639: 0x0008, 0x63a: 0x0040, 0x63b: 0x0040, + 0x63c: 0x3308, 0x63d: 0x0040, 0x63e: 0x3008, 0x63f: 0x3008, + // Block 0x19, offset 0x640 + 0x640: 0x3008, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x0040, 0x644: 0x0040, 0x645: 0x0040, + 0x646: 0x0040, 0x647: 0x3308, 0x648: 0x3308, 0x649: 0x0040, 0x64a: 0x0040, 0x64b: 0x3308, + 0x64c: 0x3308, 0x64d: 0x3b08, 0x64e: 0x0040, 0x64f: 0x0040, 0x650: 0x0040, 0x651: 0x3308, + 0x652: 0x0040, 0x653: 0x0040, 0x654: 0x0040, 0x655: 0x0040, 0x656: 0x0040, 0x657: 0x0040, + 0x658: 0x0040, 0x659: 0x07a1, 0x65a: 0x07d9, 0x65b: 0x0811, 0x65c: 0x0008, 0x65d: 0x0040, + 0x65e: 0x0849, 0x65f: 0x0040, 0x660: 0x0040, 0x661: 0x0040, 0x662: 0x0040, 0x663: 0x0040, + 0x664: 0x0040, 0x665: 0x0040, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0008, + 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, + 0x670: 0x3308, 0x671: 0x3308, 0x672: 0x0008, 0x673: 0x0008, 0x674: 0x0008, 0x675: 0x3308, + 0x676: 0x0040, 0x677: 0x0040, 0x678: 0x0040, 0x679: 0x0040, 0x67a: 0x0040, 0x67b: 0x0040, + 0x67c: 0x0040, 0x67d: 0x0040, 0x67e: 0x0040, 0x67f: 0x0040, + // Block 0x1a, offset 0x680 + 0x680: 0x0040, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x3008, 0x684: 0x0040, 0x685: 0x0008, + 0x686: 0x0008, 0x687: 0x0008, 0x688: 0x0008, 0x689: 0x0008, 0x68a: 0x0008, 0x68b: 0x0008, + 0x68c: 0x0008, 0x68d: 0x0008, 0x68e: 0x0040, 0x68f: 0x0008, 0x690: 0x0008, 0x691: 0x0008, + 0x692: 0x0040, 0x693: 0x0008, 0x694: 0x0008, 0x695: 0x0008, 0x696: 0x0008, 0x697: 0x0008, + 0x698: 0x0008, 0x699: 0x0008, 0x69a: 0x0008, 0x69b: 0x0008, 0x69c: 0x0008, 0x69d: 0x0008, + 0x69e: 0x0008, 0x69f: 0x0008, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x0008, 0x6a3: 0x0008, + 0x6a4: 0x0008, 0x6a5: 0x0008, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0040, + 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, + 0x6b0: 0x0008, 0x6b1: 0x0040, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0040, 0x6b5: 0x0008, + 0x6b6: 0x0008, 0x6b7: 0x0008, 0x6b8: 0x0008, 0x6b9: 0x0008, 0x6ba: 0x0040, 0x6bb: 0x0040, + 0x6bc: 0x3308, 0x6bd: 0x0008, 0x6be: 0x3008, 0x6bf: 0x3008, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3008, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3308, 0x6c4: 0x3308, 0x6c5: 0x3308, + 0x6c6: 0x0040, 0x6c7: 0x3308, 0x6c8: 0x3308, 0x6c9: 0x3008, 0x6ca: 0x0040, 0x6cb: 0x3008, + 0x6cc: 0x3008, 0x6cd: 0x3b08, 0x6ce: 0x0040, 0x6cf: 0x0040, 0x6d0: 0x0008, 0x6d1: 0x0040, + 0x6d2: 0x0040, 0x6d3: 0x0040, 0x6d4: 0x0040, 0x6d5: 0x0040, 0x6d6: 0x0040, 0x6d7: 0x0040, + 0x6d8: 0x0040, 0x6d9: 0x0040, 0x6da: 0x0040, 0x6db: 0x0040, 0x6dc: 0x0040, 0x6dd: 0x0040, + 0x6de: 0x0040, 0x6df: 0x0040, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x3308, 0x6e3: 0x3308, + 0x6e4: 0x0040, 0x6e5: 0x0040, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0008, + 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, + 0x6f0: 0x0018, 0x6f1: 0x0018, 0x6f2: 0x0040, 0x6f3: 0x0040, 0x6f4: 0x0040, 0x6f5: 0x0040, + 0x6f6: 0x0040, 0x6f7: 0x0040, 0x6f8: 0x0040, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040, + 0x6fc: 0x0040, 0x6fd: 0x0040, 0x6fe: 0x0040, 0x6ff: 0x0040, + // Block 0x1c, offset 0x700 + 0x700: 0x0040, 0x701: 0x3308, 0x702: 0x3008, 0x703: 0x3008, 0x704: 0x0040, 0x705: 0x0008, + 0x706: 0x0008, 0x707: 0x0008, 0x708: 0x0008, 0x709: 0x0008, 0x70a: 0x0008, 0x70b: 0x0008, + 0x70c: 0x0008, 0x70d: 0x0040, 0x70e: 0x0040, 0x70f: 0x0008, 0x710: 0x0008, 0x711: 0x0040, + 0x712: 0x0040, 0x713: 0x0008, 0x714: 0x0008, 0x715: 0x0008, 0x716: 0x0008, 0x717: 0x0008, + 0x718: 0x0008, 0x719: 0x0008, 0x71a: 0x0008, 0x71b: 0x0008, 0x71c: 0x0008, 0x71d: 0x0008, + 0x71e: 0x0008, 0x71f: 0x0008, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x0008, 0x723: 0x0008, + 0x724: 0x0008, 0x725: 0x0008, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0040, + 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, + 0x730: 0x0008, 0x731: 0x0040, 0x732: 0x0008, 0x733: 0x0008, 0x734: 0x0040, 0x735: 0x0008, + 0x736: 0x0008, 0x737: 0x0008, 0x738: 0x0008, 0x739: 0x0008, 0x73a: 0x0040, 0x73b: 0x0040, + 0x73c: 0x3308, 0x73d: 0x0008, 0x73e: 0x3008, 0x73f: 0x3308, + // Block 0x1d, offset 0x740 + 0x740: 0x3008, 0x741: 0x3308, 0x742: 0x3308, 0x743: 0x3308, 0x744: 0x3308, 0x745: 0x0040, + 0x746: 0x0040, 0x747: 0x3008, 0x748: 0x3008, 0x749: 0x0040, 0x74a: 0x0040, 0x74b: 0x3008, + 0x74c: 0x3008, 0x74d: 0x3b08, 0x74e: 0x0040, 0x74f: 0x0040, 0x750: 0x0040, 0x751: 0x0040, + 0x752: 0x0040, 0x753: 0x0040, 0x754: 0x0040, 0x755: 0x0040, 0x756: 0x3308, 0x757: 0x3008, + 0x758: 0x0040, 0x759: 0x0040, 0x75a: 0x0040, 0x75b: 0x0040, 0x75c: 0x0881, 0x75d: 0x08b9, + 0x75e: 0x0040, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x3308, 0x763: 0x3308, + 0x764: 0x0040, 0x765: 0x0040, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0008, + 0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008, + 0x770: 0x0018, 0x771: 0x0008, 0x772: 0x0018, 0x773: 0x0018, 0x774: 0x0018, 0x775: 0x0018, + 0x776: 0x0018, 0x777: 0x0018, 0x778: 0x0040, 0x779: 0x0040, 0x77a: 0x0040, 0x77b: 0x0040, + 0x77c: 0x0040, 0x77d: 0x0040, 0x77e: 0x0040, 0x77f: 0x0040, + // Block 0x1e, offset 0x780 + 0x780: 0x0040, 0x781: 0x0040, 0x782: 0x3308, 0x783: 0x0008, 0x784: 0x0040, 0x785: 0x0008, + 0x786: 0x0008, 0x787: 0x0008, 0x788: 0x0008, 0x789: 0x0008, 0x78a: 0x0008, 0x78b: 0x0040, + 0x78c: 0x0040, 0x78d: 0x0040, 0x78e: 0x0008, 0x78f: 0x0008, 0x790: 0x0008, 0x791: 0x0040, + 0x792: 0x0008, 0x793: 0x0008, 0x794: 0x0008, 0x795: 0x0008, 0x796: 0x0040, 0x797: 0x0040, + 0x798: 0x0040, 0x799: 0x0008, 0x79a: 0x0008, 0x79b: 0x0040, 0x79c: 0x0008, 0x79d: 0x0040, + 0x79e: 0x0008, 0x79f: 0x0008, 0x7a0: 0x0040, 0x7a1: 0x0040, 0x7a2: 0x0040, 0x7a3: 0x0008, + 0x7a4: 0x0008, 0x7a5: 0x0040, 0x7a6: 0x0040, 0x7a7: 0x0040, 0x7a8: 0x0008, 0x7a9: 0x0008, + 0x7aa: 0x0008, 0x7ab: 0x0040, 0x7ac: 0x0040, 0x7ad: 0x0040, 0x7ae: 0x0008, 0x7af: 0x0008, + 0x7b0: 0x0008, 0x7b1: 0x0008, 0x7b2: 0x0008, 0x7b3: 0x0008, 0x7b4: 0x0008, 0x7b5: 0x0008, + 0x7b6: 0x0008, 0x7b7: 0x0008, 0x7b8: 0x0008, 0x7b9: 0x0008, 0x7ba: 0x0040, 0x7bb: 0x0040, + 0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x3008, 0x7bf: 0x3008, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x3308, 0x7c1: 0x3008, 0x7c2: 0x3008, 0x7c3: 0x3008, 0x7c4: 0x3008, 0x7c5: 0x0040, + 0x7c6: 0x3308, 0x7c7: 0x3308, 0x7c8: 0x3308, 0x7c9: 0x0040, 0x7ca: 0x3308, 0x7cb: 0x3308, + 0x7cc: 0x3308, 0x7cd: 0x3b08, 0x7ce: 0x0040, 0x7cf: 0x0040, 0x7d0: 0x0040, 0x7d1: 0x0040, + 0x7d2: 0x0040, 0x7d3: 0x0040, 0x7d4: 0x0040, 0x7d5: 0x3308, 0x7d6: 0x3308, 0x7d7: 0x0040, + 0x7d8: 0x0008, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0040, 0x7dd: 0x0040, + 0x7de: 0x0040, 0x7df: 0x0040, 0x7e0: 0x0008, 0x7e1: 0x0008, 0x7e2: 0x3308, 0x7e3: 0x3308, + 0x7e4: 0x0040, 0x7e5: 0x0040, 0x7e6: 0x0008, 0x7e7: 0x0008, 0x7e8: 0x0008, 0x7e9: 0x0008, + 0x7ea: 0x0008, 0x7eb: 0x0008, 0x7ec: 0x0008, 0x7ed: 0x0008, 0x7ee: 0x0008, 0x7ef: 0x0008, + 0x7f0: 0x0040, 0x7f1: 0x0040, 0x7f2: 0x0040, 0x7f3: 0x0040, 0x7f4: 0x0040, 0x7f5: 0x0040, + 0x7f6: 0x0040, 0x7f7: 0x0040, 0x7f8: 0x0018, 0x7f9: 0x0018, 0x7fa: 0x0018, 0x7fb: 0x0018, + 0x7fc: 0x0018, 0x7fd: 0x0018, 0x7fe: 0x0018, 0x7ff: 0x0018, + // Block 0x20, offset 0x800 + 0x800: 0x0008, 0x801: 0x3308, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x0040, 0x805: 0x0008, + 0x806: 0x0008, 0x807: 0x0008, 0x808: 0x0008, 0x809: 0x0008, 0x80a: 0x0008, 0x80b: 0x0008, + 0x80c: 0x0008, 0x80d: 0x0040, 0x80e: 0x0008, 0x80f: 0x0008, 0x810: 0x0008, 0x811: 0x0040, + 0x812: 0x0008, 0x813: 0x0008, 0x814: 0x0008, 0x815: 0x0008, 0x816: 0x0008, 0x817: 0x0008, + 0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0008, 0x81c: 0x0008, 0x81d: 0x0008, + 0x81e: 0x0008, 0x81f: 0x0008, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x0008, 0x823: 0x0008, + 0x824: 0x0008, 0x825: 0x0008, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0040, + 0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008, + 0x830: 0x0008, 0x831: 0x0008, 0x832: 0x0008, 0x833: 0x0008, 0x834: 0x0040, 0x835: 0x0008, + 0x836: 0x0008, 0x837: 0x0008, 0x838: 0x0008, 0x839: 0x0008, 0x83a: 0x0040, 0x83b: 0x0040, + 0x83c: 0x3308, 0x83d: 0x0008, 0x83e: 0x3008, 0x83f: 0x3308, + // Block 0x21, offset 0x840 + 0x840: 0x3008, 0x841: 0x3008, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x3008, 0x845: 0x0040, + 0x846: 0x3308, 0x847: 0x3008, 0x848: 0x3008, 0x849: 0x0040, 0x84a: 0x3008, 0x84b: 0x3008, + 0x84c: 0x3308, 0x84d: 0x3b08, 0x84e: 0x0040, 0x84f: 0x0040, 0x850: 0x0040, 0x851: 0x0040, + 0x852: 0x0040, 0x853: 0x0040, 0x854: 0x0040, 0x855: 0x3008, 0x856: 0x3008, 0x857: 0x0040, + 0x858: 0x0040, 0x859: 0x0040, 0x85a: 0x0040, 0x85b: 0x0040, 0x85c: 0x0040, 0x85d: 0x0040, + 0x85e: 0x0008, 0x85f: 0x0040, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x3308, 0x863: 0x3308, + 0x864: 0x0040, 0x865: 0x0040, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0008, + 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, + 0x870: 0x0040, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0040, 0x874: 0x0040, 0x875: 0x0040, + 0x876: 0x0040, 0x877: 0x0040, 0x878: 0x0040, 0x879: 0x0040, 0x87a: 0x0040, 0x87b: 0x0040, + 0x87c: 0x0040, 0x87d: 0x0040, 0x87e: 0x0040, 0x87f: 0x0040, + // Block 0x22, offset 0x880 + 0x880: 0x3008, 0x881: 0x3308, 0x882: 0x3308, 0x883: 0x3308, 0x884: 0x3308, 0x885: 0x0040, + 0x886: 0x3008, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008, + 0x88c: 0x3008, 0x88d: 0x3b08, 0x88e: 0x0008, 0x88f: 0x0018, 0x890: 0x0040, 0x891: 0x0040, + 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0008, 0x895: 0x0008, 0x896: 0x0008, 0x897: 0x3008, + 0x898: 0x0018, 0x899: 0x0018, 0x89a: 0x0018, 0x89b: 0x0018, 0x89c: 0x0018, 0x89d: 0x0018, + 0x89e: 0x0018, 0x89f: 0x0008, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308, + 0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008, + 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, + 0x8b0: 0x0018, 0x8b1: 0x0018, 0x8b2: 0x0018, 0x8b3: 0x0018, 0x8b4: 0x0018, 0x8b5: 0x0018, + 0x8b6: 0x0018, 0x8b7: 0x0018, 0x8b8: 0x0018, 0x8b9: 0x0018, 0x8ba: 0x0008, 0x8bb: 0x0008, + 0x8bc: 0x0008, 0x8bd: 0x0008, 0x8be: 0x0008, 0x8bf: 0x0008, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0040, 0x8c1: 0x0008, 0x8c2: 0x0008, 0x8c3: 0x0040, 0x8c4: 0x0008, 0x8c5: 0x0040, + 0x8c6: 0x0040, 0x8c7: 0x0008, 0x8c8: 0x0008, 0x8c9: 0x0040, 0x8ca: 0x0008, 0x8cb: 0x0040, + 0x8cc: 0x0040, 0x8cd: 0x0008, 0x8ce: 0x0040, 0x8cf: 0x0040, 0x8d0: 0x0040, 0x8d1: 0x0040, + 0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x0008, + 0x8d8: 0x0040, 0x8d9: 0x0008, 0x8da: 0x0008, 0x8db: 0x0008, 0x8dc: 0x0008, 0x8dd: 0x0008, + 0x8de: 0x0008, 0x8df: 0x0008, 0x8e0: 0x0040, 0x8e1: 0x0008, 0x8e2: 0x0008, 0x8e3: 0x0008, + 0x8e4: 0x0040, 0x8e5: 0x0008, 0x8e6: 0x0040, 0x8e7: 0x0008, 0x8e8: 0x0040, 0x8e9: 0x0040, + 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0040, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008, + 0x8f0: 0x0008, 0x8f1: 0x3308, 0x8f2: 0x0008, 0x8f3: 0x0929, 0x8f4: 0x3308, 0x8f5: 0x3308, + 0x8f6: 0x3308, 0x8f7: 0x3308, 0x8f8: 0x3308, 0x8f9: 0x3308, 0x8fa: 0x0040, 0x8fb: 0x3308, + 0x8fc: 0x3308, 0x8fd: 0x0008, 0x8fe: 0x0040, 0x8ff: 0x0040, + // Block 0x24, offset 0x900 + 0x900: 0x0008, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x09d1, 0x904: 0x0008, 0x905: 0x0008, + 0x906: 0x0008, 0x907: 0x0008, 0x908: 0x0040, 0x909: 0x0008, 0x90a: 0x0008, 0x90b: 0x0008, + 0x90c: 0x0008, 0x90d: 0x0a09, 0x90e: 0x0008, 0x90f: 0x0008, 0x910: 0x0008, 0x911: 0x0008, + 0x912: 0x0a41, 0x913: 0x0008, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0a79, + 0x918: 0x0008, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0ab1, 0x91d: 0x0008, + 0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0008, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008, + 0x924: 0x0008, 0x925: 0x0008, 0x926: 0x0008, 0x927: 0x0008, 0x928: 0x0008, 0x929: 0x0ae9, + 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0008, 0x92d: 0x0040, 0x92e: 0x0040, 0x92f: 0x0040, + 0x930: 0x0040, 0x931: 0x3308, 0x932: 0x3308, 0x933: 0x0b21, 0x934: 0x3308, 0x935: 0x0b59, + 0x936: 0x0b91, 0x937: 0x0bc9, 0x938: 0x0c19, 0x939: 0x0c51, 0x93a: 0x3308, 0x93b: 0x3308, + 0x93c: 0x3308, 0x93d: 0x3308, 0x93e: 0x3308, 0x93f: 0x3008, + // Block 0x25, offset 0x940 + 0x940: 0x3308, 0x941: 0x0ca1, 0x942: 0x3308, 0x943: 0x3308, 0x944: 0x3b08, 0x945: 0x0018, + 0x946: 0x3308, 0x947: 0x3308, 0x948: 0x0008, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, + 0x94c: 0x0008, 0x94d: 0x3308, 0x94e: 0x3308, 0x94f: 0x3308, 0x950: 0x3308, 0x951: 0x3308, + 0x952: 0x3308, 0x953: 0x0cd9, 0x954: 0x3308, 0x955: 0x3308, 0x956: 0x3308, 0x957: 0x3308, + 0x958: 0x0040, 0x959: 0x3308, 0x95a: 0x3308, 0x95b: 0x3308, 0x95c: 0x3308, 0x95d: 0x0d11, + 0x95e: 0x3308, 0x95f: 0x3308, 0x960: 0x3308, 0x961: 0x3308, 0x962: 0x0d49, 0x963: 0x3308, + 0x964: 0x3308, 0x965: 0x3308, 0x966: 0x3308, 0x967: 0x0d81, 0x968: 0x3308, 0x969: 0x3308, + 0x96a: 0x3308, 0x96b: 0x3308, 0x96c: 0x0db9, 0x96d: 0x3308, 0x96e: 0x3308, 0x96f: 0x3308, + 0x970: 0x3308, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x3308, 0x974: 0x3308, 0x975: 0x3308, + 0x976: 0x3308, 0x977: 0x3308, 0x978: 0x3308, 0x979: 0x0df1, 0x97a: 0x3308, 0x97b: 0x3308, + 0x97c: 0x3308, 0x97d: 0x0040, 0x97e: 0x0018, 0x97f: 0x0018, + // Block 0x26, offset 0x980 + 0x980: 0x0008, 0x981: 0x0008, 0x982: 0x0008, 0x983: 0x0008, 0x984: 0x0008, 0x985: 0x0008, + 0x986: 0x0008, 0x987: 0x0008, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008, + 0x98c: 0x0008, 0x98d: 0x0008, 0x98e: 0x0008, 0x98f: 0x0008, 0x990: 0x0008, 0x991: 0x0008, + 0x992: 0x0008, 0x993: 0x0008, 0x994: 0x0008, 0x995: 0x0008, 0x996: 0x0008, 0x997: 0x0008, + 0x998: 0x0008, 0x999: 0x0008, 0x99a: 0x0008, 0x99b: 0x0008, 0x99c: 0x0008, 0x99d: 0x0008, + 0x99e: 0x0008, 0x99f: 0x0008, 0x9a0: 0x0008, 0x9a1: 0x0008, 0x9a2: 0x0008, 0x9a3: 0x0008, + 0x9a4: 0x0008, 0x9a5: 0x0008, 0x9a6: 0x0008, 0x9a7: 0x0008, 0x9a8: 0x0008, 0x9a9: 0x0008, + 0x9aa: 0x0008, 0x9ab: 0x0008, 0x9ac: 0x0039, 0x9ad: 0x0ed1, 0x9ae: 0x0ee9, 0x9af: 0x0008, + 0x9b0: 0x0ef9, 0x9b1: 0x0f09, 0x9b2: 0x0f19, 0x9b3: 0x0f31, 0x9b4: 0x0249, 0x9b5: 0x0f41, + 0x9b6: 0x0259, 0x9b7: 0x0f51, 0x9b8: 0x0359, 0x9b9: 0x0f61, 0x9ba: 0x0f71, 0x9bb: 0x0008, + 0x9bc: 0x00d9, 0x9bd: 0x0f81, 0x9be: 0x0f99, 0x9bf: 0x0269, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0fa9, 0x9c1: 0x0fb9, 0x9c2: 0x0279, 0x9c3: 0x0039, 0x9c4: 0x0fc9, 0x9c5: 0x0fe1, + 0x9c6: 0x059d, 0x9c7: 0x0ee9, 0x9c8: 0x0ef9, 0x9c9: 0x0f09, 0x9ca: 0x0ff9, 0x9cb: 0x1011, + 0x9cc: 0x1029, 0x9cd: 0x0f31, 0x9ce: 0x0008, 0x9cf: 0x0f51, 0x9d0: 0x0f61, 0x9d1: 0x1041, + 0x9d2: 0x00d9, 0x9d3: 0x1059, 0x9d4: 0x05b5, 0x9d5: 0x05b5, 0x9d6: 0x0f99, 0x9d7: 0x0fa9, + 0x9d8: 0x0fb9, 0x9d9: 0x059d, 0x9da: 0x1071, 0x9db: 0x1089, 0x9dc: 0x05cd, 0x9dd: 0x1099, + 0x9de: 0x10b1, 0x9df: 0x10c9, 0x9e0: 0x10e1, 0x9e1: 0x10f9, 0x9e2: 0x0f41, 0x9e3: 0x0269, + 0x9e4: 0x0fb9, 0x9e5: 0x1089, 0x9e6: 0x1099, 0x9e7: 0x10b1, 0x9e8: 0x1111, 0x9e9: 0x10e1, + 0x9ea: 0x10f9, 0x9eb: 0x0008, 0x9ec: 0x0008, 0x9ed: 0x0008, 0x9ee: 0x0008, 0x9ef: 0x0008, + 0x9f0: 0x0008, 0x9f1: 0x0008, 0x9f2: 0x0008, 0x9f3: 0x0008, 0x9f4: 0x0008, 0x9f5: 0x0008, + 0x9f6: 0x0008, 0x9f7: 0x0008, 0x9f8: 0x1129, 0x9f9: 0x0008, 0x9fa: 0x0008, 0x9fb: 0x0008, + 0x9fc: 0x0008, 0x9fd: 0x0008, 0x9fe: 0x0008, 0x9ff: 0x0008, + // Block 0x28, offset 0xa00 + 0xa00: 0x0008, 0xa01: 0x0008, 0xa02: 0x0008, 0xa03: 0x0008, 0xa04: 0x0008, 0xa05: 0x0008, + 0xa06: 0x0008, 0xa07: 0x0008, 0xa08: 0x0008, 0xa09: 0x0008, 0xa0a: 0x0008, 0xa0b: 0x0008, + 0xa0c: 0x0008, 0xa0d: 0x0008, 0xa0e: 0x0008, 0xa0f: 0x0008, 0xa10: 0x0008, 0xa11: 0x0008, + 0xa12: 0x0008, 0xa13: 0x0008, 0xa14: 0x0008, 0xa15: 0x0008, 0xa16: 0x0008, 0xa17: 0x0008, + 0xa18: 0x0008, 0xa19: 0x0008, 0xa1a: 0x0008, 0xa1b: 0x1141, 0xa1c: 0x1159, 0xa1d: 0x1169, + 0xa1e: 0x1181, 0xa1f: 0x1029, 0xa20: 0x1199, 0xa21: 0x11a9, 0xa22: 0x11c1, 0xa23: 0x11d9, + 0xa24: 0x11f1, 0xa25: 0x1209, 0xa26: 0x1221, 0xa27: 0x05e5, 0xa28: 0x1239, 0xa29: 0x1251, + 0xa2a: 0xe17d, 0xa2b: 0x1269, 0xa2c: 0x1281, 0xa2d: 0x1299, 0xa2e: 0x12b1, 0xa2f: 0x12c9, + 0xa30: 0x12e1, 0xa31: 0x12f9, 0xa32: 0x1311, 0xa33: 0x1329, 0xa34: 0x1341, 0xa35: 0x1359, + 0xa36: 0x1371, 0xa37: 0x1389, 0xa38: 0x05fd, 0xa39: 0x13a1, 0xa3a: 0x13b9, 0xa3b: 0x13d1, + 0xa3c: 0x13e1, 0xa3d: 0x13f9, 0xa3e: 0x1411, 0xa3f: 0x1429, + // Block 0x29, offset 0xa40 + 0xa40: 0xe00d, 0xa41: 0x0008, 0xa42: 0xe00d, 0xa43: 0x0008, 0xa44: 0xe00d, 0xa45: 0x0008, + 0xa46: 0xe00d, 0xa47: 0x0008, 0xa48: 0xe00d, 0xa49: 0x0008, 0xa4a: 0xe00d, 0xa4b: 0x0008, + 0xa4c: 0xe00d, 0xa4d: 0x0008, 0xa4e: 0xe00d, 0xa4f: 0x0008, 0xa50: 0xe00d, 0xa51: 0x0008, + 0xa52: 0xe00d, 0xa53: 0x0008, 0xa54: 0xe00d, 0xa55: 0x0008, 0xa56: 0xe00d, 0xa57: 0x0008, + 0xa58: 0xe00d, 0xa59: 0x0008, 0xa5a: 0xe00d, 0xa5b: 0x0008, 0xa5c: 0xe00d, 0xa5d: 0x0008, + 0xa5e: 0xe00d, 0xa5f: 0x0008, 0xa60: 0xe00d, 0xa61: 0x0008, 0xa62: 0xe00d, 0xa63: 0x0008, + 0xa64: 0xe00d, 0xa65: 0x0008, 0xa66: 0xe00d, 0xa67: 0x0008, 0xa68: 0xe00d, 0xa69: 0x0008, + 0xa6a: 0xe00d, 0xa6b: 0x0008, 0xa6c: 0xe00d, 0xa6d: 0x0008, 0xa6e: 0xe00d, 0xa6f: 0x0008, + 0xa70: 0xe00d, 0xa71: 0x0008, 0xa72: 0xe00d, 0xa73: 0x0008, 0xa74: 0xe00d, 0xa75: 0x0008, + 0xa76: 0xe00d, 0xa77: 0x0008, 0xa78: 0xe00d, 0xa79: 0x0008, 0xa7a: 0xe00d, 0xa7b: 0x0008, + 0xa7c: 0xe00d, 0xa7d: 0x0008, 0xa7e: 0xe00d, 0xa7f: 0x0008, + // Block 0x2a, offset 0xa80 + 0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008, + 0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008, + 0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008, + 0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0x0008, 0xa97: 0x0008, + 0xa98: 0x0008, 0xa99: 0x0008, 0xa9a: 0x0615, 0xa9b: 0x0635, 0xa9c: 0x0008, 0xa9d: 0x0008, + 0xa9e: 0x1441, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008, + 0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008, + 0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008, + 0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008, + 0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008, + 0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008, + // Block 0x2b, offset 0xac0 + 0xac0: 0x0008, 0xac1: 0x0008, 0xac2: 0x0008, 0xac3: 0x0008, 0xac4: 0x0008, 0xac5: 0x0008, + 0xac6: 0x0040, 0xac7: 0x0040, 0xac8: 0xe045, 0xac9: 0xe045, 0xaca: 0xe045, 0xacb: 0xe045, + 0xacc: 0xe045, 0xacd: 0xe045, 0xace: 0x0040, 0xacf: 0x0040, 0xad0: 0x0008, 0xad1: 0x0008, + 0xad2: 0x0008, 0xad3: 0x0008, 0xad4: 0x0008, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008, + 0xad8: 0x0040, 0xad9: 0xe045, 0xada: 0x0040, 0xadb: 0xe045, 0xadc: 0x0040, 0xadd: 0xe045, + 0xade: 0x0040, 0xadf: 0xe045, 0xae0: 0x0008, 0xae1: 0x0008, 0xae2: 0x0008, 0xae3: 0x0008, + 0xae4: 0x0008, 0xae5: 0x0008, 0xae6: 0x0008, 0xae7: 0x0008, 0xae8: 0xe045, 0xae9: 0xe045, + 0xaea: 0xe045, 0xaeb: 0xe045, 0xaec: 0xe045, 0xaed: 0xe045, 0xaee: 0xe045, 0xaef: 0xe045, + 0xaf0: 0x0008, 0xaf1: 0x1459, 0xaf2: 0x0008, 0xaf3: 0x1471, 0xaf4: 0x0008, 0xaf5: 0x1489, + 0xaf6: 0x0008, 0xaf7: 0x14a1, 0xaf8: 0x0008, 0xaf9: 0x14b9, 0xafa: 0x0008, 0xafb: 0x14d1, + 0xafc: 0x0008, 0xafd: 0x14e9, 0xafe: 0x0040, 0xaff: 0x0040, + // Block 0x2c, offset 0xb00 + 0xb00: 0x1501, 0xb01: 0x1531, 0xb02: 0x1561, 0xb03: 0x1591, 0xb04: 0x15c1, 0xb05: 0x15f1, + 0xb06: 0x1621, 0xb07: 0x1651, 0xb08: 0x1501, 0xb09: 0x1531, 0xb0a: 0x1561, 0xb0b: 0x1591, + 0xb0c: 0x15c1, 0xb0d: 0x15f1, 0xb0e: 0x1621, 0xb0f: 0x1651, 0xb10: 0x1681, 0xb11: 0x16b1, + 0xb12: 0x16e1, 0xb13: 0x1711, 0xb14: 0x1741, 0xb15: 0x1771, 0xb16: 0x17a1, 0xb17: 0x17d1, + 0xb18: 0x1681, 0xb19: 0x16b1, 0xb1a: 0x16e1, 0xb1b: 0x1711, 0xb1c: 0x1741, 0xb1d: 0x1771, + 0xb1e: 0x17a1, 0xb1f: 0x17d1, 0xb20: 0x1801, 0xb21: 0x1831, 0xb22: 0x1861, 0xb23: 0x1891, + 0xb24: 0x18c1, 0xb25: 0x18f1, 0xb26: 0x1921, 0xb27: 0x1951, 0xb28: 0x1801, 0xb29: 0x1831, + 0xb2a: 0x1861, 0xb2b: 0x1891, 0xb2c: 0x18c1, 0xb2d: 0x18f1, 0xb2e: 0x1921, 0xb2f: 0x1951, + 0xb30: 0x0008, 0xb31: 0x0008, 0xb32: 0x1981, 0xb33: 0x19b1, 0xb34: 0x19d9, 0xb35: 0x0040, + 0xb36: 0x0008, 0xb37: 0x1a01, 0xb38: 0xe045, 0xb39: 0xe045, 0xb3a: 0x064d, 0xb3b: 0x1459, + 0xb3c: 0x19b1, 0xb3d: 0x0666, 0xb3e: 0x1a31, 0xb3f: 0x0686, + // Block 0x2d, offset 0xb40 + 0xb40: 0x06a6, 0xb41: 0x1a4a, 0xb42: 0x1a79, 0xb43: 0x1aa9, 0xb44: 0x1ad1, 0xb45: 0x0040, + 0xb46: 0x0008, 0xb47: 0x1af9, 0xb48: 0x06c5, 0xb49: 0x1471, 0xb4a: 0x06dd, 0xb4b: 0x1489, + 0xb4c: 0x1aa9, 0xb4d: 0x1b2a, 0xb4e: 0x1b5a, 0xb4f: 0x1b8a, 0xb50: 0x0008, 0xb51: 0x0008, + 0xb52: 0x0008, 0xb53: 0x1bb9, 0xb54: 0x0040, 0xb55: 0x0040, 0xb56: 0x0008, 0xb57: 0x0008, + 0xb58: 0xe045, 0xb59: 0xe045, 0xb5a: 0x06f5, 0xb5b: 0x14a1, 0xb5c: 0x0040, 0xb5d: 0x1bd2, + 0xb5e: 0x1c02, 0xb5f: 0x1c32, 0xb60: 0x0008, 0xb61: 0x0008, 0xb62: 0x0008, 0xb63: 0x1c61, + 0xb64: 0x0008, 0xb65: 0x0008, 0xb66: 0x0008, 0xb67: 0x0008, 0xb68: 0xe045, 0xb69: 0xe045, + 0xb6a: 0x070d, 0xb6b: 0x14d1, 0xb6c: 0xe04d, 0xb6d: 0x1c7a, 0xb6e: 0x03d2, 0xb6f: 0x1caa, + 0xb70: 0x0040, 0xb71: 0x0040, 0xb72: 0x1cb9, 0xb73: 0x1ce9, 0xb74: 0x1d11, 0xb75: 0x0040, + 0xb76: 0x0008, 0xb77: 0x1d39, 0xb78: 0x0725, 0xb79: 0x14b9, 0xb7a: 0x0515, 0xb7b: 0x14e9, + 0xb7c: 0x1ce9, 0xb7d: 0x073e, 0xb7e: 0x075e, 0xb7f: 0x0040, + // Block 0x2e, offset 0xb80 + 0xb80: 0x000a, 0xb81: 0x000a, 0xb82: 0x000a, 0xb83: 0x000a, 0xb84: 0x000a, 0xb85: 0x000a, + 0xb86: 0x000a, 0xb87: 0x000a, 0xb88: 0x000a, 0xb89: 0x000a, 0xb8a: 0x000a, 0xb8b: 0x03c0, + 0xb8c: 0x0003, 0xb8d: 0x0003, 0xb8e: 0x0340, 0xb8f: 0x0b40, 0xb90: 0x0018, 0xb91: 0xe00d, + 0xb92: 0x0018, 0xb93: 0x0018, 0xb94: 0x0018, 0xb95: 0x0018, 0xb96: 0x0018, 0xb97: 0x077e, + 0xb98: 0x0018, 0xb99: 0x0018, 0xb9a: 0x0018, 0xb9b: 0x0018, 0xb9c: 0x0018, 0xb9d: 0x0018, + 0xb9e: 0x0018, 0xb9f: 0x0018, 0xba0: 0x0018, 0xba1: 0x0018, 0xba2: 0x0018, 0xba3: 0x0018, + 0xba4: 0x0040, 0xba5: 0x0040, 0xba6: 0x0040, 0xba7: 0x0018, 0xba8: 0x0040, 0xba9: 0x0040, + 0xbaa: 0x0340, 0xbab: 0x0340, 0xbac: 0x0340, 0xbad: 0x0340, 0xbae: 0x0340, 0xbaf: 0x000a, + 0xbb0: 0x0018, 0xbb1: 0x0018, 0xbb2: 0x0018, 0xbb3: 0x1d69, 0xbb4: 0x1da1, 0xbb5: 0x0018, + 0xbb6: 0x1df1, 0xbb7: 0x1e29, 0xbb8: 0x0018, 0xbb9: 0x0018, 0xbba: 0x0018, 0xbbb: 0x0018, + 0xbbc: 0x1e7a, 0xbbd: 0x0018, 0xbbe: 0x079e, 0xbbf: 0x0018, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x0018, 0xbc1: 0x0018, 0xbc2: 0x0018, 0xbc3: 0x0018, 0xbc4: 0x0018, 0xbc5: 0x0018, + 0xbc6: 0x0018, 0xbc7: 0x1e92, 0xbc8: 0x1eaa, 0xbc9: 0x1ec2, 0xbca: 0x0018, 0xbcb: 0x0018, + 0xbcc: 0x0018, 0xbcd: 0x0018, 0xbce: 0x0018, 0xbcf: 0x0018, 0xbd0: 0x0018, 0xbd1: 0x0018, + 0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x1ed9, + 0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018, + 0xbde: 0x0018, 0xbdf: 0x000a, 0xbe0: 0x03c0, 0xbe1: 0x0340, 0xbe2: 0x0340, 0xbe3: 0x0340, + 0xbe4: 0x03c0, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0040, 0xbe8: 0x0040, 0xbe9: 0x0040, + 0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x0340, + 0xbf0: 0x1f41, 0xbf1: 0x0f41, 0xbf2: 0x0040, 0xbf3: 0x0040, 0xbf4: 0x1f51, 0xbf5: 0x1f61, + 0xbf6: 0x1f71, 0xbf7: 0x1f81, 0xbf8: 0x1f91, 0xbf9: 0x1fa1, 0xbfa: 0x1fb2, 0xbfb: 0x07bd, + 0xbfc: 0x1fc2, 0xbfd: 0x1fd2, 0xbfe: 0x1fe2, 0xbff: 0x0f71, + // Block 0x30, offset 0xc00 + 0xc00: 0x1f41, 0xc01: 0x00c9, 0xc02: 0x0069, 0xc03: 0x0079, 0xc04: 0x1f51, 0xc05: 0x1f61, + 0xc06: 0x1f71, 0xc07: 0x1f81, 0xc08: 0x1f91, 0xc09: 0x1fa1, 0xc0a: 0x1fb2, 0xc0b: 0x07d5, + 0xc0c: 0x1fc2, 0xc0d: 0x1fd2, 0xc0e: 0x1fe2, 0xc0f: 0x0040, 0xc10: 0x0039, 0xc11: 0x0f09, + 0xc12: 0x00d9, 0xc13: 0x0369, 0xc14: 0x0ff9, 0xc15: 0x0249, 0xc16: 0x0f51, 0xc17: 0x0359, + 0xc18: 0x0f61, 0xc19: 0x0f71, 0xc1a: 0x0f99, 0xc1b: 0x01d9, 0xc1c: 0x0fa9, 0xc1d: 0x0040, + 0xc1e: 0x0040, 0xc1f: 0x0040, 0xc20: 0x0018, 0xc21: 0x0018, 0xc22: 0x0018, 0xc23: 0x0018, + 0xc24: 0x0018, 0xc25: 0x0018, 0xc26: 0x0018, 0xc27: 0x0018, 0xc28: 0x1ff1, 0xc29: 0x0018, + 0xc2a: 0x0018, 0xc2b: 0x0018, 0xc2c: 0x0018, 0xc2d: 0x0018, 0xc2e: 0x0018, 0xc2f: 0x0018, + 0xc30: 0x0018, 0xc31: 0x0018, 0xc32: 0x0018, 0xc33: 0x0018, 0xc34: 0x0018, 0xc35: 0x0018, + 0xc36: 0x0018, 0xc37: 0x0018, 0xc38: 0x0018, 0xc39: 0x0018, 0xc3a: 0x0018, 0xc3b: 0x0018, + 0xc3c: 0x0018, 0xc3d: 0x0018, 0xc3e: 0x0018, 0xc3f: 0x0040, + // Block 0x31, offset 0xc40 + 0xc40: 0x07ee, 0xc41: 0x080e, 0xc42: 0x1159, 0xc43: 0x082d, 0xc44: 0x0018, 0xc45: 0x084e, + 0xc46: 0x086e, 0xc47: 0x1011, 0xc48: 0x0018, 0xc49: 0x088d, 0xc4a: 0x0f31, 0xc4b: 0x0249, + 0xc4c: 0x0249, 0xc4d: 0x0249, 0xc4e: 0x0249, 0xc4f: 0x2009, 0xc50: 0x0f41, 0xc51: 0x0f41, + 0xc52: 0x0359, 0xc53: 0x0359, 0xc54: 0x0018, 0xc55: 0x0f71, 0xc56: 0x2021, 0xc57: 0x0018, + 0xc58: 0x0018, 0xc59: 0x0f99, 0xc5a: 0x2039, 0xc5b: 0x0269, 0xc5c: 0x0269, 0xc5d: 0x0269, + 0xc5e: 0x0018, 0xc5f: 0x0018, 0xc60: 0x2049, 0xc61: 0x08ad, 0xc62: 0x2061, 0xc63: 0x0018, + 0xc64: 0x13d1, 0xc65: 0x0018, 0xc66: 0x2079, 0xc67: 0x0018, 0xc68: 0x13d1, 0xc69: 0x0018, + 0xc6a: 0x0f51, 0xc6b: 0x2091, 0xc6c: 0x0ee9, 0xc6d: 0x1159, 0xc6e: 0x0018, 0xc6f: 0x0f09, + 0xc70: 0x0f09, 0xc71: 0x1199, 0xc72: 0x0040, 0xc73: 0x0f61, 0xc74: 0x00d9, 0xc75: 0x20a9, + 0xc76: 0x20c1, 0xc77: 0x20d9, 0xc78: 0x20f1, 0xc79: 0x0f41, 0xc7a: 0x0018, 0xc7b: 0x08cd, + 0xc7c: 0x2109, 0xc7d: 0x10b1, 0xc7e: 0x10b1, 0xc7f: 0x2109, + // Block 0x32, offset 0xc80 + 0xc80: 0x08ed, 0xc81: 0x0018, 0xc82: 0x0018, 0xc83: 0x0018, 0xc84: 0x0018, 0xc85: 0x0ef9, + 0xc86: 0x0ef9, 0xc87: 0x0f09, 0xc88: 0x0f41, 0xc89: 0x0259, 0xc8a: 0x0018, 0xc8b: 0x0018, + 0xc8c: 0x0018, 0xc8d: 0x0018, 0xc8e: 0x0008, 0xc8f: 0x0018, 0xc90: 0x2121, 0xc91: 0x2151, + 0xc92: 0x2181, 0xc93: 0x21b9, 0xc94: 0x21e9, 0xc95: 0x2219, 0xc96: 0x2249, 0xc97: 0x2279, + 0xc98: 0x22a9, 0xc99: 0x22d9, 0xc9a: 0x2309, 0xc9b: 0x2339, 0xc9c: 0x2369, 0xc9d: 0x2399, + 0xc9e: 0x23c9, 0xc9f: 0x23f9, 0xca0: 0x0f41, 0xca1: 0x2421, 0xca2: 0x0905, 0xca3: 0x2439, + 0xca4: 0x1089, 0xca5: 0x2451, 0xca6: 0x0925, 0xca7: 0x2469, 0xca8: 0x2491, 0xca9: 0x0369, + 0xcaa: 0x24a9, 0xcab: 0x0945, 0xcac: 0x0359, 0xcad: 0x1159, 0xcae: 0x0ef9, 0xcaf: 0x0f61, + 0xcb0: 0x0f41, 0xcb1: 0x2421, 0xcb2: 0x0965, 0xcb3: 0x2439, 0xcb4: 0x1089, 0xcb5: 0x2451, + 0xcb6: 0x0985, 0xcb7: 0x2469, 0xcb8: 0x2491, 0xcb9: 0x0369, 0xcba: 0x24a9, 0xcbb: 0x09a5, + 0xcbc: 0x0359, 0xcbd: 0x1159, 0xcbe: 0x0ef9, 0xcbf: 0x0f61, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x0018, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0018, + 0xcc6: 0x0018, 0xcc7: 0x0018, 0xcc8: 0x0018, 0xcc9: 0x0018, 0xcca: 0x0018, 0xccb: 0x0040, + 0xccc: 0x0040, 0xccd: 0x0040, 0xcce: 0x0040, 0xccf: 0x0040, 0xcd0: 0x0040, 0xcd1: 0x0040, + 0xcd2: 0x0040, 0xcd3: 0x0040, 0xcd4: 0x0040, 0xcd5: 0x0040, 0xcd6: 0x0040, 0xcd7: 0x0040, + 0xcd8: 0x0040, 0xcd9: 0x0040, 0xcda: 0x0040, 0xcdb: 0x0040, 0xcdc: 0x0040, 0xcdd: 0x0040, + 0xcde: 0x0040, 0xcdf: 0x0040, 0xce0: 0x00c9, 0xce1: 0x0069, 0xce2: 0x0079, 0xce3: 0x1f51, + 0xce4: 0x1f61, 0xce5: 0x1f71, 0xce6: 0x1f81, 0xce7: 0x1f91, 0xce8: 0x1fa1, 0xce9: 0x2601, + 0xcea: 0x2619, 0xceb: 0x2631, 0xcec: 0x2649, 0xced: 0x2661, 0xcee: 0x2679, 0xcef: 0x2691, + 0xcf0: 0x26a9, 0xcf1: 0x26c1, 0xcf2: 0x26d9, 0xcf3: 0x26f1, 0xcf4: 0x0a06, 0xcf5: 0x0a26, + 0xcf6: 0x0a46, 0xcf7: 0x0a66, 0xcf8: 0x0a86, 0xcf9: 0x0aa6, 0xcfa: 0x0ac6, 0xcfb: 0x0ae6, + 0xcfc: 0x0b06, 0xcfd: 0x270a, 0xcfe: 0x2732, 0xcff: 0x275a, + // Block 0x34, offset 0xd00 + 0xd00: 0x2782, 0xd01: 0x27aa, 0xd02: 0x27d2, 0xd03: 0x27fa, 0xd04: 0x2822, 0xd05: 0x284a, + 0xd06: 0x2872, 0xd07: 0x289a, 0xd08: 0x0040, 0xd09: 0x0040, 0xd0a: 0x0040, 0xd0b: 0x0040, + 0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040, + 0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040, + 0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0b26, 0xd1d: 0x0b46, + 0xd1e: 0x0b66, 0xd1f: 0x0b86, 0xd20: 0x0ba6, 0xd21: 0x0bc6, 0xd22: 0x0be6, 0xd23: 0x0c06, + 0xd24: 0x0c26, 0xd25: 0x0c46, 0xd26: 0x0c66, 0xd27: 0x0c86, 0xd28: 0x0ca6, 0xd29: 0x0cc6, + 0xd2a: 0x0ce6, 0xd2b: 0x0d06, 0xd2c: 0x0d26, 0xd2d: 0x0d46, 0xd2e: 0x0d66, 0xd2f: 0x0d86, + 0xd30: 0x0da6, 0xd31: 0x0dc6, 0xd32: 0x0de6, 0xd33: 0x0e06, 0xd34: 0x0e26, 0xd35: 0x0e46, + 0xd36: 0x0039, 0xd37: 0x0ee9, 0xd38: 0x1159, 0xd39: 0x0ef9, 0xd3a: 0x0f09, 0xd3b: 0x1199, + 0xd3c: 0x0f31, 0xd3d: 0x0249, 0xd3e: 0x0f41, 0xd3f: 0x0259, + // Block 0x35, offset 0xd40 + 0xd40: 0x0f51, 0xd41: 0x0359, 0xd42: 0x0f61, 0xd43: 0x0f71, 0xd44: 0x00d9, 0xd45: 0x0f99, + 0xd46: 0x2039, 0xd47: 0x0269, 0xd48: 0x01d9, 0xd49: 0x0fa9, 0xd4a: 0x0fb9, 0xd4b: 0x1089, + 0xd4c: 0x0279, 0xd4d: 0x0369, 0xd4e: 0x0289, 0xd4f: 0x13d1, 0xd50: 0x0039, 0xd51: 0x0ee9, + 0xd52: 0x1159, 0xd53: 0x0ef9, 0xd54: 0x0f09, 0xd55: 0x1199, 0xd56: 0x0f31, 0xd57: 0x0249, + 0xd58: 0x0f41, 0xd59: 0x0259, 0xd5a: 0x0f51, 0xd5b: 0x0359, 0xd5c: 0x0f61, 0xd5d: 0x0f71, + 0xd5e: 0x00d9, 0xd5f: 0x0f99, 0xd60: 0x2039, 0xd61: 0x0269, 0xd62: 0x01d9, 0xd63: 0x0fa9, + 0xd64: 0x0fb9, 0xd65: 0x1089, 0xd66: 0x0279, 0xd67: 0x0369, 0xd68: 0x0289, 0xd69: 0x13d1, + 0xd6a: 0x1f41, 0xd6b: 0x0018, 0xd6c: 0x0018, 0xd6d: 0x0018, 0xd6e: 0x0018, 0xd6f: 0x0018, + 0xd70: 0x0018, 0xd71: 0x0018, 0xd72: 0x0018, 0xd73: 0x0018, 0xd74: 0x0018, 0xd75: 0x0018, + 0xd76: 0x0018, 0xd77: 0x0018, 0xd78: 0x0018, 0xd79: 0x0018, 0xd7a: 0x0018, 0xd7b: 0x0018, + 0xd7c: 0x0018, 0xd7d: 0x0018, 0xd7e: 0x0018, 0xd7f: 0x0018, + // Block 0x36, offset 0xd80 + 0xd80: 0x0008, 0xd81: 0x0008, 0xd82: 0x0008, 0xd83: 0x0008, 0xd84: 0x0008, 0xd85: 0x0008, + 0xd86: 0x0008, 0xd87: 0x0008, 0xd88: 0x0008, 0xd89: 0x0008, 0xd8a: 0x0008, 0xd8b: 0x0008, + 0xd8c: 0x0008, 0xd8d: 0x0008, 0xd8e: 0x0008, 0xd8f: 0x0008, 0xd90: 0x0008, 0xd91: 0x0008, + 0xd92: 0x0008, 0xd93: 0x0008, 0xd94: 0x0008, 0xd95: 0x0008, 0xd96: 0x0008, 0xd97: 0x0008, + 0xd98: 0x0008, 0xd99: 0x0008, 0xd9a: 0x0008, 0xd9b: 0x0008, 0xd9c: 0x0008, 0xd9d: 0x0008, + 0xd9e: 0x0008, 0xd9f: 0x0040, 0xda0: 0xe00d, 0xda1: 0x0008, 0xda2: 0x2971, 0xda3: 0x0ebd, + 0xda4: 0x2989, 0xda5: 0x0008, 0xda6: 0x0008, 0xda7: 0xe07d, 0xda8: 0x0008, 0xda9: 0xe01d, + 0xdaa: 0x0008, 0xdab: 0xe03d, 0xdac: 0x0008, 0xdad: 0x0fe1, 0xdae: 0x1281, 0xdaf: 0x0fc9, + 0xdb0: 0x1141, 0xdb1: 0x0008, 0xdb2: 0xe00d, 0xdb3: 0x0008, 0xdb4: 0x0008, 0xdb5: 0xe01d, + 0xdb6: 0x0008, 0xdb7: 0x0008, 0xdb8: 0x0008, 0xdb9: 0x0008, 0xdba: 0x0008, 0xdbb: 0x0008, + 0xdbc: 0x0259, 0xdbd: 0x1089, 0xdbe: 0x29a1, 0xdbf: 0x29b9, + // Block 0x37, offset 0xdc0 + 0xdc0: 0xe00d, 0xdc1: 0x0008, 0xdc2: 0xe00d, 0xdc3: 0x0008, 0xdc4: 0xe00d, 0xdc5: 0x0008, + 0xdc6: 0xe00d, 0xdc7: 0x0008, 0xdc8: 0xe00d, 0xdc9: 0x0008, 0xdca: 0xe00d, 0xdcb: 0x0008, + 0xdcc: 0xe00d, 0xdcd: 0x0008, 0xdce: 0xe00d, 0xdcf: 0x0008, 0xdd0: 0xe00d, 0xdd1: 0x0008, + 0xdd2: 0xe00d, 0xdd3: 0x0008, 0xdd4: 0xe00d, 0xdd5: 0x0008, 0xdd6: 0xe00d, 0xdd7: 0x0008, + 0xdd8: 0xe00d, 0xdd9: 0x0008, 0xdda: 0xe00d, 0xddb: 0x0008, 0xddc: 0xe00d, 0xddd: 0x0008, + 0xdde: 0xe00d, 0xddf: 0x0008, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0xe00d, 0xde3: 0x0008, + 0xde4: 0x0008, 0xde5: 0x0018, 0xde6: 0x0018, 0xde7: 0x0018, 0xde8: 0x0018, 0xde9: 0x0018, + 0xdea: 0x0018, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0xe01d, 0xdee: 0x0008, 0xdef: 0x3308, + 0xdf0: 0x3308, 0xdf1: 0x3308, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0040, 0xdf5: 0x0040, + 0xdf6: 0x0040, 0xdf7: 0x0040, 0xdf8: 0x0040, 0xdf9: 0x0018, 0xdfa: 0x0018, 0xdfb: 0x0018, + 0xdfc: 0x0018, 0xdfd: 0x0018, 0xdfe: 0x0018, 0xdff: 0x0018, + // Block 0x38, offset 0xe00 + 0xe00: 0x26fd, 0xe01: 0x271d, 0xe02: 0x273d, 0xe03: 0x275d, 0xe04: 0x277d, 0xe05: 0x279d, + 0xe06: 0x27bd, 0xe07: 0x27dd, 0xe08: 0x27fd, 0xe09: 0x281d, 0xe0a: 0x283d, 0xe0b: 0x285d, + 0xe0c: 0x287d, 0xe0d: 0x289d, 0xe0e: 0x28bd, 0xe0f: 0x28dd, 0xe10: 0x28fd, 0xe11: 0x291d, + 0xe12: 0x293d, 0xe13: 0x295d, 0xe14: 0x297d, 0xe15: 0x299d, 0xe16: 0x0040, 0xe17: 0x0040, + 0xe18: 0x0040, 0xe19: 0x0040, 0xe1a: 0x0040, 0xe1b: 0x0040, 0xe1c: 0x0040, 0xe1d: 0x0040, + 0xe1e: 0x0040, 0xe1f: 0x0040, 0xe20: 0x0040, 0xe21: 0x0040, 0xe22: 0x0040, 0xe23: 0x0040, + 0xe24: 0x0040, 0xe25: 0x0040, 0xe26: 0x0040, 0xe27: 0x0040, 0xe28: 0x0040, 0xe29: 0x0040, + 0xe2a: 0x0040, 0xe2b: 0x0040, 0xe2c: 0x0040, 0xe2d: 0x0040, 0xe2e: 0x0040, 0xe2f: 0x0040, + 0xe30: 0x0040, 0xe31: 0x0040, 0xe32: 0x0040, 0xe33: 0x0040, 0xe34: 0x0040, 0xe35: 0x0040, + 0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0040, 0xe3a: 0x0040, 0xe3b: 0x0040, + 0xe3c: 0x0040, 0xe3d: 0x0040, 0xe3e: 0x0040, 0xe3f: 0x0040, + // Block 0x39, offset 0xe40 + 0xe40: 0x000a, 0xe41: 0x0018, 0xe42: 0x29d1, 0xe43: 0x0018, 0xe44: 0x0018, 0xe45: 0x0008, + 0xe46: 0x0008, 0xe47: 0x0008, 0xe48: 0x0018, 0xe49: 0x0018, 0xe4a: 0x0018, 0xe4b: 0x0018, + 0xe4c: 0x0018, 0xe4d: 0x0018, 0xe4e: 0x0018, 0xe4f: 0x0018, 0xe50: 0x0018, 0xe51: 0x0018, + 0xe52: 0x0018, 0xe53: 0x0018, 0xe54: 0x0018, 0xe55: 0x0018, 0xe56: 0x0018, 0xe57: 0x0018, + 0xe58: 0x0018, 0xe59: 0x0018, 0xe5a: 0x0018, 0xe5b: 0x0018, 0xe5c: 0x0018, 0xe5d: 0x0018, + 0xe5e: 0x0018, 0xe5f: 0x0018, 0xe60: 0x0018, 0xe61: 0x0018, 0xe62: 0x0018, 0xe63: 0x0018, + 0xe64: 0x0018, 0xe65: 0x0018, 0xe66: 0x0018, 0xe67: 0x0018, 0xe68: 0x0018, 0xe69: 0x0018, + 0xe6a: 0x3308, 0xe6b: 0x3308, 0xe6c: 0x3308, 0xe6d: 0x3308, 0xe6e: 0x3018, 0xe6f: 0x3018, + 0xe70: 0x0018, 0xe71: 0x0018, 0xe72: 0x0018, 0xe73: 0x0018, 0xe74: 0x0018, 0xe75: 0x0018, + 0xe76: 0xe125, 0xe77: 0x0018, 0xe78: 0x29bd, 0xe79: 0x29dd, 0xe7a: 0x29fd, 0xe7b: 0x0018, + 0xe7c: 0x0008, 0xe7d: 0x0018, 0xe7e: 0x0018, 0xe7f: 0x0018, + // Block 0x3a, offset 0xe80 + 0xe80: 0x2b3d, 0xe81: 0x2b5d, 0xe82: 0x2b7d, 0xe83: 0x2b9d, 0xe84: 0x2bbd, 0xe85: 0x2bdd, + 0xe86: 0x2bdd, 0xe87: 0x2bdd, 0xe88: 0x2bfd, 0xe89: 0x2bfd, 0xe8a: 0x2bfd, 0xe8b: 0x2bfd, + 0xe8c: 0x2c1d, 0xe8d: 0x2c1d, 0xe8e: 0x2c1d, 0xe8f: 0x2c3d, 0xe90: 0x2c5d, 0xe91: 0x2c5d, + 0xe92: 0x2a7d, 0xe93: 0x2a7d, 0xe94: 0x2c5d, 0xe95: 0x2c5d, 0xe96: 0x2c7d, 0xe97: 0x2c7d, + 0xe98: 0x2c5d, 0xe99: 0x2c5d, 0xe9a: 0x2a7d, 0xe9b: 0x2a7d, 0xe9c: 0x2c5d, 0xe9d: 0x2c5d, + 0xe9e: 0x2c3d, 0xe9f: 0x2c3d, 0xea0: 0x2c9d, 0xea1: 0x2c9d, 0xea2: 0x2cbd, 0xea3: 0x2cbd, + 0xea4: 0x0040, 0xea5: 0x2cdd, 0xea6: 0x2cfd, 0xea7: 0x2d1d, 0xea8: 0x2d1d, 0xea9: 0x2d3d, + 0xeaa: 0x2d5d, 0xeab: 0x2d7d, 0xeac: 0x2d9d, 0xead: 0x2dbd, 0xeae: 0x2ddd, 0xeaf: 0x2dfd, + 0xeb0: 0x2e1d, 0xeb1: 0x2e3d, 0xeb2: 0x2e3d, 0xeb3: 0x2e5d, 0xeb4: 0x2e7d, 0xeb5: 0x2e7d, + 0xeb6: 0x2e9d, 0xeb7: 0x2ebd, 0xeb8: 0x2e5d, 0xeb9: 0x2edd, 0xeba: 0x2efd, 0xebb: 0x2edd, + 0xebc: 0x2e5d, 0xebd: 0x2f1d, 0xebe: 0x2f3d, 0xebf: 0x2f5d, + // Block 0x3b, offset 0xec0 + 0xec0: 0x2f7d, 0xec1: 0x2f9d, 0xec2: 0x2cfd, 0xec3: 0x2cdd, 0xec4: 0x2fbd, 0xec5: 0x2fdd, + 0xec6: 0x2ffd, 0xec7: 0x301d, 0xec8: 0x303d, 0xec9: 0x305d, 0xeca: 0x307d, 0xecb: 0x309d, + 0xecc: 0x30bd, 0xecd: 0x30dd, 0xece: 0x30fd, 0xecf: 0x0040, 0xed0: 0x0018, 0xed1: 0x0018, + 0xed2: 0x311d, 0xed3: 0x313d, 0xed4: 0x315d, 0xed5: 0x317d, 0xed6: 0x319d, 0xed7: 0x31bd, + 0xed8: 0x31dd, 0xed9: 0x31fd, 0xeda: 0x321d, 0xedb: 0x323d, 0xedc: 0x315d, 0xedd: 0x325d, + 0xede: 0x327d, 0xedf: 0x329d, 0xee0: 0x0008, 0xee1: 0x0008, 0xee2: 0x0008, 0xee3: 0x0008, + 0xee4: 0x0008, 0xee5: 0x0008, 0xee6: 0x0008, 0xee7: 0x0008, 0xee8: 0x0008, 0xee9: 0x0008, + 0xeea: 0x0008, 0xeeb: 0x0008, 0xeec: 0x0008, 0xeed: 0x0008, 0xeee: 0x0008, 0xeef: 0x0008, + 0xef0: 0x0008, 0xef1: 0x0008, 0xef2: 0x0008, 0xef3: 0x0008, 0xef4: 0x0008, 0xef5: 0x0008, + 0xef6: 0x0008, 0xef7: 0x0008, 0xef8: 0x0008, 0xef9: 0x0008, 0xefa: 0x0008, 0xefb: 0x0040, + 0xefc: 0x0040, 0xefd: 0x0040, 0xefe: 0x0040, 0xeff: 0x0040, + // Block 0x3c, offset 0xf00 + 0xf00: 0x36a2, 0xf01: 0x36d2, 0xf02: 0x3702, 0xf03: 0x3732, 0xf04: 0x32bd, 0xf05: 0x32dd, + 0xf06: 0x32fd, 0xf07: 0x331d, 0xf08: 0x0018, 0xf09: 0x0018, 0xf0a: 0x0018, 0xf0b: 0x0018, + 0xf0c: 0x0018, 0xf0d: 0x0018, 0xf0e: 0x0018, 0xf0f: 0x0018, 0xf10: 0x333d, 0xf11: 0x3761, + 0xf12: 0x3779, 0xf13: 0x3791, 0xf14: 0x37a9, 0xf15: 0x37c1, 0xf16: 0x37d9, 0xf17: 0x37f1, + 0xf18: 0x3809, 0xf19: 0x3821, 0xf1a: 0x3839, 0xf1b: 0x3851, 0xf1c: 0x3869, 0xf1d: 0x3881, + 0xf1e: 0x3899, 0xf1f: 0x38b1, 0xf20: 0x335d, 0xf21: 0x337d, 0xf22: 0x339d, 0xf23: 0x33bd, + 0xf24: 0x33dd, 0xf25: 0x33dd, 0xf26: 0x33fd, 0xf27: 0x341d, 0xf28: 0x343d, 0xf29: 0x345d, + 0xf2a: 0x347d, 0xf2b: 0x349d, 0xf2c: 0x34bd, 0xf2d: 0x34dd, 0xf2e: 0x34fd, 0xf2f: 0x351d, + 0xf30: 0x353d, 0xf31: 0x355d, 0xf32: 0x357d, 0xf33: 0x359d, 0xf34: 0x35bd, 0xf35: 0x35dd, + 0xf36: 0x35fd, 0xf37: 0x361d, 0xf38: 0x363d, 0xf39: 0x365d, 0xf3a: 0x367d, 0xf3b: 0x369d, + 0xf3c: 0x38c9, 0xf3d: 0x3901, 0xf3e: 0x36bd, 0xf3f: 0x0018, + // Block 0x3d, offset 0xf40 + 0xf40: 0x36dd, 0xf41: 0x36fd, 0xf42: 0x371d, 0xf43: 0x373d, 0xf44: 0x375d, 0xf45: 0x377d, + 0xf46: 0x379d, 0xf47: 0x37bd, 0xf48: 0x37dd, 0xf49: 0x37fd, 0xf4a: 0x381d, 0xf4b: 0x383d, + 0xf4c: 0x385d, 0xf4d: 0x387d, 0xf4e: 0x389d, 0xf4f: 0x38bd, 0xf50: 0x38dd, 0xf51: 0x38fd, + 0xf52: 0x391d, 0xf53: 0x393d, 0xf54: 0x395d, 0xf55: 0x397d, 0xf56: 0x399d, 0xf57: 0x39bd, + 0xf58: 0x39dd, 0xf59: 0x39fd, 0xf5a: 0x3a1d, 0xf5b: 0x3a3d, 0xf5c: 0x3a5d, 0xf5d: 0x3a7d, + 0xf5e: 0x3a9d, 0xf5f: 0x3abd, 0xf60: 0x3add, 0xf61: 0x3afd, 0xf62: 0x3b1d, 0xf63: 0x3b3d, + 0xf64: 0x3b5d, 0xf65: 0x3b7d, 0xf66: 0x127d, 0xf67: 0x3b9d, 0xf68: 0x3bbd, 0xf69: 0x3bdd, + 0xf6a: 0x3bfd, 0xf6b: 0x3c1d, 0xf6c: 0x3c3d, 0xf6d: 0x3c5d, 0xf6e: 0x239d, 0xf6f: 0x3c7d, + 0xf70: 0x3c9d, 0xf71: 0x3939, 0xf72: 0x3951, 0xf73: 0x3969, 0xf74: 0x3981, 0xf75: 0x3999, + 0xf76: 0x39b1, 0xf77: 0x39c9, 0xf78: 0x39e1, 0xf79: 0x39f9, 0xf7a: 0x3a11, 0xf7b: 0x3a29, + 0xf7c: 0x3a41, 0xf7d: 0x3a59, 0xf7e: 0x3a71, 0xf7f: 0x3a89, + // Block 0x3e, offset 0xf80 + 0xf80: 0x3aa1, 0xf81: 0x3ac9, 0xf82: 0x3af1, 0xf83: 0x3b19, 0xf84: 0x3b41, 0xf85: 0x3b69, + 0xf86: 0x3b91, 0xf87: 0x3bb9, 0xf88: 0x3be1, 0xf89: 0x3c09, 0xf8a: 0x3c39, 0xf8b: 0x3c69, + 0xf8c: 0x3c99, 0xf8d: 0x3cbd, 0xf8e: 0x3cb1, 0xf8f: 0x3cdd, 0xf90: 0x3cfd, 0xf91: 0x3d15, + 0xf92: 0x3d2d, 0xf93: 0x3d45, 0xf94: 0x3d5d, 0xf95: 0x3d5d, 0xf96: 0x3d45, 0xf97: 0x3d75, + 0xf98: 0x07bd, 0xf99: 0x3d8d, 0xf9a: 0x3da5, 0xf9b: 0x3dbd, 0xf9c: 0x3dd5, 0xf9d: 0x3ded, + 0xf9e: 0x3e05, 0xf9f: 0x3e1d, 0xfa0: 0x3e35, 0xfa1: 0x3e4d, 0xfa2: 0x3e65, 0xfa3: 0x3e7d, + 0xfa4: 0x3e95, 0xfa5: 0x3e95, 0xfa6: 0x3ead, 0xfa7: 0x3ead, 0xfa8: 0x3ec5, 0xfa9: 0x3ec5, + 0xfaa: 0x3edd, 0xfab: 0x3ef5, 0xfac: 0x3f0d, 0xfad: 0x3f25, 0xfae: 0x3f3d, 0xfaf: 0x3f3d, + 0xfb0: 0x3f55, 0xfb1: 0x3f55, 0xfb2: 0x3f55, 0xfb3: 0x3f6d, 0xfb4: 0x3f85, 0xfb5: 0x3f9d, + 0xfb6: 0x3fb5, 0xfb7: 0x3f9d, 0xfb8: 0x3fcd, 0xfb9: 0x3fe5, 0xfba: 0x3f6d, 0xfbb: 0x3ffd, + 0xfbc: 0x4015, 0xfbd: 0x4015, 0xfbe: 0x4015, 0xfbf: 0x0040, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x3cc9, 0xfc1: 0x3d31, 0xfc2: 0x3d99, 0xfc3: 0x3e01, 0xfc4: 0x3e51, 0xfc5: 0x3eb9, + 0xfc6: 0x3f09, 0xfc7: 0x3f59, 0xfc8: 0x3fd9, 0xfc9: 0x4041, 0xfca: 0x4091, 0xfcb: 0x40e1, + 0xfcc: 0x4131, 0xfcd: 0x4199, 0xfce: 0x4201, 0xfcf: 0x4251, 0xfd0: 0x42a1, 0xfd1: 0x42d9, + 0xfd2: 0x4329, 0xfd3: 0x4391, 0xfd4: 0x43f9, 0xfd5: 0x4431, 0xfd6: 0x44b1, 0xfd7: 0x4549, + 0xfd8: 0x45c9, 0xfd9: 0x4619, 0xfda: 0x4699, 0xfdb: 0x4719, 0xfdc: 0x4781, 0xfdd: 0x47d1, + 0xfde: 0x4821, 0xfdf: 0x4871, 0xfe0: 0x48d9, 0xfe1: 0x4959, 0xfe2: 0x49c1, 0xfe3: 0x4a11, + 0xfe4: 0x4a61, 0xfe5: 0x4ab1, 0xfe6: 0x4ae9, 0xfe7: 0x4b21, 0xfe8: 0x4b59, 0xfe9: 0x4b91, + 0xfea: 0x4be1, 0xfeb: 0x4c31, 0xfec: 0x4cb1, 0xfed: 0x4d01, 0xfee: 0x4d69, 0xfef: 0x4de9, + 0xff0: 0x4e39, 0xff1: 0x4e71, 0xff2: 0x4ea9, 0xff3: 0x4f29, 0xff4: 0x4f91, 0xff5: 0x5011, + 0xff6: 0x5061, 0xff7: 0x50e1, 0xff8: 0x5119, 0xff9: 0x5169, 0xffa: 0x51b9, 0xffb: 0x5209, + 0xffc: 0x5259, 0xffd: 0x52a9, 0xffe: 0x5311, 0xfff: 0x5361, + // Block 0x40, offset 0x1000 + 0x1000: 0x5399, 0x1001: 0x53e9, 0x1002: 0x5439, 0x1003: 0x5489, 0x1004: 0x54f1, 0x1005: 0x5541, + 0x1006: 0x5591, 0x1007: 0x55e1, 0x1008: 0x5661, 0x1009: 0x56c9, 0x100a: 0x5701, 0x100b: 0x5781, + 0x100c: 0x57b9, 0x100d: 0x5821, 0x100e: 0x5889, 0x100f: 0x58d9, 0x1010: 0x5929, 0x1011: 0x5979, + 0x1012: 0x59e1, 0x1013: 0x5a19, 0x1014: 0x5a69, 0x1015: 0x5ad1, 0x1016: 0x5b09, 0x1017: 0x5b89, + 0x1018: 0x5bd9, 0x1019: 0x5c01, 0x101a: 0x5c29, 0x101b: 0x5c51, 0x101c: 0x5c79, 0x101d: 0x5ca1, + 0x101e: 0x5cc9, 0x101f: 0x5cf1, 0x1020: 0x5d19, 0x1021: 0x5d41, 0x1022: 0x5d69, 0x1023: 0x5d99, + 0x1024: 0x5dc9, 0x1025: 0x5df9, 0x1026: 0x5e29, 0x1027: 0x5e59, 0x1028: 0x5e89, 0x1029: 0x5eb9, + 0x102a: 0x5ee9, 0x102b: 0x5f19, 0x102c: 0x5f49, 0x102d: 0x5f79, 0x102e: 0x5fa9, 0x102f: 0x5fd9, + 0x1030: 0x6009, 0x1031: 0x402d, 0x1032: 0x6039, 0x1033: 0x6051, 0x1034: 0x404d, 0x1035: 0x6069, + 0x1036: 0x6081, 0x1037: 0x6099, 0x1038: 0x406d, 0x1039: 0x406d, 0x103a: 0x60b1, 0x103b: 0x60c9, + 0x103c: 0x6101, 0x103d: 0x6139, 0x103e: 0x6171, 0x103f: 0x61a9, + // Block 0x41, offset 0x1040 + 0x1040: 0x6211, 0x1041: 0x6229, 0x1042: 0x408d, 0x1043: 0x6241, 0x1044: 0x6259, 0x1045: 0x6271, + 0x1046: 0x6289, 0x1047: 0x62a1, 0x1048: 0x40ad, 0x1049: 0x62b9, 0x104a: 0x62e1, 0x104b: 0x62f9, + 0x104c: 0x40cd, 0x104d: 0x40cd, 0x104e: 0x6311, 0x104f: 0x6329, 0x1050: 0x6341, 0x1051: 0x40ed, + 0x1052: 0x410d, 0x1053: 0x412d, 0x1054: 0x414d, 0x1055: 0x416d, 0x1056: 0x6359, 0x1057: 0x6371, + 0x1058: 0x6389, 0x1059: 0x63a1, 0x105a: 0x63b9, 0x105b: 0x418d, 0x105c: 0x63d1, 0x105d: 0x63e9, + 0x105e: 0x6401, 0x105f: 0x41ad, 0x1060: 0x41cd, 0x1061: 0x6419, 0x1062: 0x41ed, 0x1063: 0x420d, + 0x1064: 0x422d, 0x1065: 0x6431, 0x1066: 0x424d, 0x1067: 0x6449, 0x1068: 0x6479, 0x1069: 0x6211, + 0x106a: 0x426d, 0x106b: 0x428d, 0x106c: 0x42ad, 0x106d: 0x42cd, 0x106e: 0x64b1, 0x106f: 0x64f1, + 0x1070: 0x6539, 0x1071: 0x6551, 0x1072: 0x42ed, 0x1073: 0x6569, 0x1074: 0x6581, 0x1075: 0x6599, + 0x1076: 0x430d, 0x1077: 0x65b1, 0x1078: 0x65c9, 0x1079: 0x65b1, 0x107a: 0x65e1, 0x107b: 0x65f9, + 0x107c: 0x432d, 0x107d: 0x6611, 0x107e: 0x6629, 0x107f: 0x6611, + // Block 0x42, offset 0x1080 + 0x1080: 0x434d, 0x1081: 0x436d, 0x1082: 0x0040, 0x1083: 0x6641, 0x1084: 0x6659, 0x1085: 0x6671, + 0x1086: 0x6689, 0x1087: 0x0040, 0x1088: 0x66c1, 0x1089: 0x66d9, 0x108a: 0x66f1, 0x108b: 0x6709, + 0x108c: 0x6721, 0x108d: 0x6739, 0x108e: 0x6401, 0x108f: 0x6751, 0x1090: 0x6769, 0x1091: 0x6781, + 0x1092: 0x438d, 0x1093: 0x6799, 0x1094: 0x6289, 0x1095: 0x43ad, 0x1096: 0x43cd, 0x1097: 0x67b1, + 0x1098: 0x0040, 0x1099: 0x43ed, 0x109a: 0x67c9, 0x109b: 0x67e1, 0x109c: 0x67f9, 0x109d: 0x6811, + 0x109e: 0x6829, 0x109f: 0x6859, 0x10a0: 0x6889, 0x10a1: 0x68b1, 0x10a2: 0x68d9, 0x10a3: 0x6901, + 0x10a4: 0x6929, 0x10a5: 0x6951, 0x10a6: 0x6979, 0x10a7: 0x69a1, 0x10a8: 0x69c9, 0x10a9: 0x69f1, + 0x10aa: 0x6a21, 0x10ab: 0x6a51, 0x10ac: 0x6a81, 0x10ad: 0x6ab1, 0x10ae: 0x6ae1, 0x10af: 0x6b11, + 0x10b0: 0x6b41, 0x10b1: 0x6b71, 0x10b2: 0x6ba1, 0x10b3: 0x6bd1, 0x10b4: 0x6c01, 0x10b5: 0x6c31, + 0x10b6: 0x6c61, 0x10b7: 0x6c91, 0x10b8: 0x6cc1, 0x10b9: 0x6cf1, 0x10ba: 0x6d21, 0x10bb: 0x6d51, + 0x10bc: 0x6d81, 0x10bd: 0x6db1, 0x10be: 0x6de1, 0x10bf: 0x440d, + // Block 0x43, offset 0x10c0 + 0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008, + 0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008, + 0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008, + 0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008, + 0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0xe00d, 0x10dd: 0x0008, + 0x10de: 0xe00d, 0x10df: 0x0008, 0x10e0: 0xe00d, 0x10e1: 0x0008, 0x10e2: 0xe00d, 0x10e3: 0x0008, + 0x10e4: 0xe00d, 0x10e5: 0x0008, 0x10e6: 0xe00d, 0x10e7: 0x0008, 0x10e8: 0xe00d, 0x10e9: 0x0008, + 0x10ea: 0xe00d, 0x10eb: 0x0008, 0x10ec: 0xe00d, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x3308, + 0x10f0: 0x3318, 0x10f1: 0x3318, 0x10f2: 0x3318, 0x10f3: 0x0018, 0x10f4: 0x3308, 0x10f5: 0x3308, + 0x10f6: 0x3308, 0x10f7: 0x3308, 0x10f8: 0x3308, 0x10f9: 0x3308, 0x10fa: 0x3308, 0x10fb: 0x3308, + 0x10fc: 0x3308, 0x10fd: 0x3308, 0x10fe: 0x0018, 0x10ff: 0x0008, + // Block 0x44, offset 0x1100 + 0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008, + 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008, + 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008, + 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008, + 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0x0ea1, 0x111d: 0x6e11, + 0x111e: 0x3308, 0x111f: 0x3308, 0x1120: 0x0008, 0x1121: 0x0008, 0x1122: 0x0008, 0x1123: 0x0008, + 0x1124: 0x0008, 0x1125: 0x0008, 0x1126: 0x0008, 0x1127: 0x0008, 0x1128: 0x0008, 0x1129: 0x0008, + 0x112a: 0x0008, 0x112b: 0x0008, 0x112c: 0x0008, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x0008, + 0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0x0008, 0x1133: 0x0008, 0x1134: 0x0008, 0x1135: 0x0008, + 0x1136: 0x0008, 0x1137: 0x0008, 0x1138: 0x0008, 0x1139: 0x0008, 0x113a: 0x0008, 0x113b: 0x0008, + 0x113c: 0x0008, 0x113d: 0x0008, 0x113e: 0x0008, 0x113f: 0x0008, + // Block 0x45, offset 0x1140 + 0x1140: 0x0018, 0x1141: 0x0018, 0x1142: 0x0018, 0x1143: 0x0018, 0x1144: 0x0018, 0x1145: 0x0018, + 0x1146: 0x0018, 0x1147: 0x0018, 0x1148: 0x0018, 0x1149: 0x0018, 0x114a: 0x0018, 0x114b: 0x0018, + 0x114c: 0x0018, 0x114d: 0x0018, 0x114e: 0x0018, 0x114f: 0x0018, 0x1150: 0x0018, 0x1151: 0x0018, + 0x1152: 0x0018, 0x1153: 0x0018, 0x1154: 0x0018, 0x1155: 0x0018, 0x1156: 0x0018, 0x1157: 0x0008, + 0x1158: 0x0008, 0x1159: 0x0008, 0x115a: 0x0008, 0x115b: 0x0008, 0x115c: 0x0008, 0x115d: 0x0008, + 0x115e: 0x0008, 0x115f: 0x0008, 0x1160: 0x0018, 0x1161: 0x0018, 0x1162: 0xe00d, 0x1163: 0x0008, + 0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008, + 0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008, + 0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0xe00d, 0x1173: 0x0008, 0x1174: 0xe00d, 0x1175: 0x0008, + 0x1176: 0xe00d, 0x1177: 0x0008, 0x1178: 0xe00d, 0x1179: 0x0008, 0x117a: 0xe00d, 0x117b: 0x0008, + 0x117c: 0xe00d, 0x117d: 0x0008, 0x117e: 0xe00d, 0x117f: 0x0008, + // Block 0x46, offset 0x1180 + 0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008, + 0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0xe00d, 0x1189: 0x0008, 0x118a: 0xe00d, 0x118b: 0x0008, + 0x118c: 0xe00d, 0x118d: 0x0008, 0x118e: 0xe00d, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008, + 0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0xe00d, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008, + 0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008, + 0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008, + 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, + 0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008, + 0x11b0: 0xe0fd, 0x11b1: 0x0008, 0x11b2: 0x0008, 0x11b3: 0x0008, 0x11b4: 0x0008, 0x11b5: 0x0008, + 0x11b6: 0x0008, 0x11b7: 0x0008, 0x11b8: 0x0008, 0x11b9: 0xe01d, 0x11ba: 0x0008, 0x11bb: 0xe03d, + 0x11bc: 0x0008, 0x11bd: 0x442d, 0x11be: 0xe00d, 0x11bf: 0x0008, + // Block 0x47, offset 0x11c0 + 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008, + 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0x0008, 0x11c9: 0x0018, 0x11ca: 0x0018, 0x11cb: 0xe03d, + 0x11cc: 0x0008, 0x11cd: 0x11d9, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008, + 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008, + 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008, + 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008, + 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008, + 0x11ea: 0x6e29, 0x11eb: 0x1029, 0x11ec: 0x11c1, 0x11ed: 0x6e41, 0x11ee: 0x1221, 0x11ef: 0x0040, + 0x11f0: 0x6e59, 0x11f1: 0x6e71, 0x11f2: 0x1239, 0x11f3: 0x444d, 0x11f4: 0xe00d, 0x11f5: 0x0008, + 0x11f6: 0xe00d, 0x11f7: 0x0008, 0x11f8: 0x0040, 0x11f9: 0x0040, 0x11fa: 0x0040, 0x11fb: 0x0040, + 0x11fc: 0x0040, 0x11fd: 0x0040, 0x11fe: 0x0040, 0x11ff: 0x0040, + // Block 0x48, offset 0x1200 + 0x1200: 0x64d5, 0x1201: 0x64f5, 0x1202: 0x6515, 0x1203: 0x6535, 0x1204: 0x6555, 0x1205: 0x6575, + 0x1206: 0x6595, 0x1207: 0x65b5, 0x1208: 0x65d5, 0x1209: 0x65f5, 0x120a: 0x6615, 0x120b: 0x6635, + 0x120c: 0x6655, 0x120d: 0x6675, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0x6695, 0x1211: 0x0008, + 0x1212: 0x66b5, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x66d5, 0x1216: 0x66f5, 0x1217: 0x6715, + 0x1218: 0x6735, 0x1219: 0x6755, 0x121a: 0x6775, 0x121b: 0x6795, 0x121c: 0x67b5, 0x121d: 0x67d5, + 0x121e: 0x67f5, 0x121f: 0x0008, 0x1220: 0x6815, 0x1221: 0x0008, 0x1222: 0x6835, 0x1223: 0x0008, + 0x1224: 0x0008, 0x1225: 0x6855, 0x1226: 0x6875, 0x1227: 0x0008, 0x1228: 0x0008, 0x1229: 0x0008, + 0x122a: 0x6895, 0x122b: 0x68b5, 0x122c: 0x68d5, 0x122d: 0x68f5, 0x122e: 0x6915, 0x122f: 0x6935, + 0x1230: 0x6955, 0x1231: 0x6975, 0x1232: 0x6995, 0x1233: 0x69b5, 0x1234: 0x69d5, 0x1235: 0x69f5, + 0x1236: 0x6a15, 0x1237: 0x6a35, 0x1238: 0x6a55, 0x1239: 0x6a75, 0x123a: 0x6a95, 0x123b: 0x6ab5, + 0x123c: 0x6ad5, 0x123d: 0x6af5, 0x123e: 0x6b15, 0x123f: 0x6b35, + // Block 0x49, offset 0x1240 + 0x1240: 0x7a95, 0x1241: 0x7ab5, 0x1242: 0x7ad5, 0x1243: 0x7af5, 0x1244: 0x7b15, 0x1245: 0x7b35, + 0x1246: 0x7b55, 0x1247: 0x7b75, 0x1248: 0x7b95, 0x1249: 0x7bb5, 0x124a: 0x7bd5, 0x124b: 0x7bf5, + 0x124c: 0x7c15, 0x124d: 0x7c35, 0x124e: 0x7c55, 0x124f: 0x6ec9, 0x1250: 0x6ef1, 0x1251: 0x6f19, + 0x1252: 0x7c75, 0x1253: 0x7c95, 0x1254: 0x7cb5, 0x1255: 0x6f41, 0x1256: 0x6f69, 0x1257: 0x6f91, + 0x1258: 0x7cd5, 0x1259: 0x7cf5, 0x125a: 0x0040, 0x125b: 0x0040, 0x125c: 0x0040, 0x125d: 0x0040, + 0x125e: 0x0040, 0x125f: 0x0040, 0x1260: 0x0040, 0x1261: 0x0040, 0x1262: 0x0040, 0x1263: 0x0040, + 0x1264: 0x0040, 0x1265: 0x0040, 0x1266: 0x0040, 0x1267: 0x0040, 0x1268: 0x0040, 0x1269: 0x0040, + 0x126a: 0x0040, 0x126b: 0x0040, 0x126c: 0x0040, 0x126d: 0x0040, 0x126e: 0x0040, 0x126f: 0x0040, + 0x1270: 0x0040, 0x1271: 0x0040, 0x1272: 0x0040, 0x1273: 0x0040, 0x1274: 0x0040, 0x1275: 0x0040, + 0x1276: 0x0040, 0x1277: 0x0040, 0x1278: 0x0040, 0x1279: 0x0040, 0x127a: 0x0040, 0x127b: 0x0040, + 0x127c: 0x0040, 0x127d: 0x0040, 0x127e: 0x0040, 0x127f: 0x0040, + // Block 0x4a, offset 0x1280 + 0x1280: 0x6fb9, 0x1281: 0x6fd1, 0x1282: 0x6fe9, 0x1283: 0x7d15, 0x1284: 0x7d35, 0x1285: 0x7001, + 0x1286: 0x7001, 0x1287: 0x0040, 0x1288: 0x0040, 0x1289: 0x0040, 0x128a: 0x0040, 0x128b: 0x0040, + 0x128c: 0x0040, 0x128d: 0x0040, 0x128e: 0x0040, 0x128f: 0x0040, 0x1290: 0x0040, 0x1291: 0x0040, + 0x1292: 0x0040, 0x1293: 0x7019, 0x1294: 0x7041, 0x1295: 0x7069, 0x1296: 0x7091, 0x1297: 0x70b9, + 0x1298: 0x0040, 0x1299: 0x0040, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x70e1, + 0x129e: 0x3308, 0x129f: 0x7109, 0x12a0: 0x7131, 0x12a1: 0x20a9, 0x12a2: 0x20f1, 0x12a3: 0x7149, + 0x12a4: 0x7161, 0x12a5: 0x7179, 0x12a6: 0x7191, 0x12a7: 0x71a9, 0x12a8: 0x71c1, 0x12a9: 0x1fb2, + 0x12aa: 0x71d9, 0x12ab: 0x7201, 0x12ac: 0x7229, 0x12ad: 0x7261, 0x12ae: 0x7299, 0x12af: 0x72c1, + 0x12b0: 0x72e9, 0x12b1: 0x7311, 0x12b2: 0x7339, 0x12b3: 0x7361, 0x12b4: 0x7389, 0x12b5: 0x73b1, + 0x12b6: 0x73d9, 0x12b7: 0x0040, 0x12b8: 0x7401, 0x12b9: 0x7429, 0x12ba: 0x7451, 0x12bb: 0x7479, + 0x12bc: 0x74a1, 0x12bd: 0x0040, 0x12be: 0x74c9, 0x12bf: 0x0040, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x74f1, 0x12c1: 0x7519, 0x12c2: 0x0040, 0x12c3: 0x7541, 0x12c4: 0x7569, 0x12c5: 0x0040, + 0x12c6: 0x7591, 0x12c7: 0x75b9, 0x12c8: 0x75e1, 0x12c9: 0x7609, 0x12ca: 0x7631, 0x12cb: 0x7659, + 0x12cc: 0x7681, 0x12cd: 0x76a9, 0x12ce: 0x76d1, 0x12cf: 0x76f9, 0x12d0: 0x7721, 0x12d1: 0x7721, + 0x12d2: 0x7739, 0x12d3: 0x7739, 0x12d4: 0x7739, 0x12d5: 0x7739, 0x12d6: 0x7751, 0x12d7: 0x7751, + 0x12d8: 0x7751, 0x12d9: 0x7751, 0x12da: 0x7769, 0x12db: 0x7769, 0x12dc: 0x7769, 0x12dd: 0x7769, + 0x12de: 0x7781, 0x12df: 0x7781, 0x12e0: 0x7781, 0x12e1: 0x7781, 0x12e2: 0x7799, 0x12e3: 0x7799, + 0x12e4: 0x7799, 0x12e5: 0x7799, 0x12e6: 0x77b1, 0x12e7: 0x77b1, 0x12e8: 0x77b1, 0x12e9: 0x77b1, + 0x12ea: 0x77c9, 0x12eb: 0x77c9, 0x12ec: 0x77c9, 0x12ed: 0x77c9, 0x12ee: 0x77e1, 0x12ef: 0x77e1, + 0x12f0: 0x77e1, 0x12f1: 0x77e1, 0x12f2: 0x77f9, 0x12f3: 0x77f9, 0x12f4: 0x77f9, 0x12f5: 0x77f9, + 0x12f6: 0x7811, 0x12f7: 0x7811, 0x12f8: 0x7811, 0x12f9: 0x7811, 0x12fa: 0x7829, 0x12fb: 0x7829, + 0x12fc: 0x7829, 0x12fd: 0x7829, 0x12fe: 0x7841, 0x12ff: 0x7841, + // Block 0x4c, offset 0x1300 + 0x1300: 0x7841, 0x1301: 0x7841, 0x1302: 0x7859, 0x1303: 0x7859, 0x1304: 0x7871, 0x1305: 0x7871, + 0x1306: 0x7889, 0x1307: 0x7889, 0x1308: 0x78a1, 0x1309: 0x78a1, 0x130a: 0x78b9, 0x130b: 0x78b9, + 0x130c: 0x78d1, 0x130d: 0x78d1, 0x130e: 0x78e9, 0x130f: 0x78e9, 0x1310: 0x78e9, 0x1311: 0x78e9, + 0x1312: 0x7901, 0x1313: 0x7901, 0x1314: 0x7901, 0x1315: 0x7901, 0x1316: 0x7919, 0x1317: 0x7919, + 0x1318: 0x7919, 0x1319: 0x7919, 0x131a: 0x7931, 0x131b: 0x7931, 0x131c: 0x7931, 0x131d: 0x7931, + 0x131e: 0x7949, 0x131f: 0x7949, 0x1320: 0x7961, 0x1321: 0x7961, 0x1322: 0x7961, 0x1323: 0x7961, + 0x1324: 0x7979, 0x1325: 0x7979, 0x1326: 0x7991, 0x1327: 0x7991, 0x1328: 0x7991, 0x1329: 0x7991, + 0x132a: 0x79a9, 0x132b: 0x79a9, 0x132c: 0x79a9, 0x132d: 0x79a9, 0x132e: 0x79c1, 0x132f: 0x79c1, + 0x1330: 0x79d9, 0x1331: 0x79d9, 0x1332: 0x0818, 0x1333: 0x0818, 0x1334: 0x0818, 0x1335: 0x0818, + 0x1336: 0x0818, 0x1337: 0x0818, 0x1338: 0x0818, 0x1339: 0x0818, 0x133a: 0x0818, 0x133b: 0x0818, + 0x133c: 0x0818, 0x133d: 0x0818, 0x133e: 0x0818, 0x133f: 0x0818, + // Block 0x4d, offset 0x1340 + 0x1340: 0x0818, 0x1341: 0x0818, 0x1342: 0x0040, 0x1343: 0x0040, 0x1344: 0x0040, 0x1345: 0x0040, + 0x1346: 0x0040, 0x1347: 0x0040, 0x1348: 0x0040, 0x1349: 0x0040, 0x134a: 0x0040, 0x134b: 0x0040, + 0x134c: 0x0040, 0x134d: 0x0040, 0x134e: 0x0040, 0x134f: 0x0040, 0x1350: 0x0040, 0x1351: 0x0040, + 0x1352: 0x0040, 0x1353: 0x79f1, 0x1354: 0x79f1, 0x1355: 0x79f1, 0x1356: 0x79f1, 0x1357: 0x7a09, + 0x1358: 0x7a09, 0x1359: 0x7a21, 0x135a: 0x7a21, 0x135b: 0x7a39, 0x135c: 0x7a39, 0x135d: 0x0479, + 0x135e: 0x7a51, 0x135f: 0x7a51, 0x1360: 0x7a69, 0x1361: 0x7a69, 0x1362: 0x7a81, 0x1363: 0x7a81, + 0x1364: 0x7a99, 0x1365: 0x7a99, 0x1366: 0x7a99, 0x1367: 0x7a99, 0x1368: 0x7ab1, 0x1369: 0x7ab1, + 0x136a: 0x7ac9, 0x136b: 0x7ac9, 0x136c: 0x7af1, 0x136d: 0x7af1, 0x136e: 0x7b19, 0x136f: 0x7b19, + 0x1370: 0x7b41, 0x1371: 0x7b41, 0x1372: 0x7b69, 0x1373: 0x7b69, 0x1374: 0x7b91, 0x1375: 0x7b91, + 0x1376: 0x7bb9, 0x1377: 0x7bb9, 0x1378: 0x7bb9, 0x1379: 0x7be1, 0x137a: 0x7be1, 0x137b: 0x7be1, + 0x137c: 0x7c09, 0x137d: 0x7c09, 0x137e: 0x7c09, 0x137f: 0x7c09, + // Block 0x4e, offset 0x1380 + 0x1380: 0x85f9, 0x1381: 0x8621, 0x1382: 0x8649, 0x1383: 0x8671, 0x1384: 0x8699, 0x1385: 0x86c1, + 0x1386: 0x86e9, 0x1387: 0x8711, 0x1388: 0x8739, 0x1389: 0x8761, 0x138a: 0x8789, 0x138b: 0x87b1, + 0x138c: 0x87d9, 0x138d: 0x8801, 0x138e: 0x8829, 0x138f: 0x8851, 0x1390: 0x8879, 0x1391: 0x88a1, + 0x1392: 0x88c9, 0x1393: 0x88f1, 0x1394: 0x8919, 0x1395: 0x8941, 0x1396: 0x8969, 0x1397: 0x8991, + 0x1398: 0x89b9, 0x1399: 0x89e1, 0x139a: 0x8a09, 0x139b: 0x8a31, 0x139c: 0x8a59, 0x139d: 0x8a81, + 0x139e: 0x8aaa, 0x139f: 0x8ada, 0x13a0: 0x8b0a, 0x13a1: 0x8b3a, 0x13a2: 0x8b6a, 0x13a3: 0x8b9a, + 0x13a4: 0x8bc9, 0x13a5: 0x8bf1, 0x13a6: 0x7c71, 0x13a7: 0x8c19, 0x13a8: 0x7be1, 0x13a9: 0x7c99, + 0x13aa: 0x8c41, 0x13ab: 0x8c69, 0x13ac: 0x7d39, 0x13ad: 0x8c91, 0x13ae: 0x7d61, 0x13af: 0x7d89, + 0x13b0: 0x8cb9, 0x13b1: 0x8ce1, 0x13b2: 0x7e29, 0x13b3: 0x8d09, 0x13b4: 0x7e51, 0x13b5: 0x7e79, + 0x13b6: 0x8d31, 0x13b7: 0x8d59, 0x13b8: 0x7ec9, 0x13b9: 0x8d81, 0x13ba: 0x7ef1, 0x13bb: 0x7f19, + 0x13bc: 0x83a1, 0x13bd: 0x83c9, 0x13be: 0x8441, 0x13bf: 0x8469, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x8491, 0x13c1: 0x8531, 0x13c2: 0x8559, 0x13c3: 0x8581, 0x13c4: 0x85a9, 0x13c5: 0x8649, + 0x13c6: 0x8671, 0x13c7: 0x8699, 0x13c8: 0x8da9, 0x13c9: 0x8739, 0x13ca: 0x8dd1, 0x13cb: 0x8df9, + 0x13cc: 0x8829, 0x13cd: 0x8e21, 0x13ce: 0x8851, 0x13cf: 0x8879, 0x13d0: 0x8a81, 0x13d1: 0x8e49, + 0x13d2: 0x8e71, 0x13d3: 0x89b9, 0x13d4: 0x8e99, 0x13d5: 0x89e1, 0x13d6: 0x8a09, 0x13d7: 0x7c21, + 0x13d8: 0x7c49, 0x13d9: 0x8ec1, 0x13da: 0x7c71, 0x13db: 0x8ee9, 0x13dc: 0x7cc1, 0x13dd: 0x7ce9, + 0x13de: 0x7d11, 0x13df: 0x7d39, 0x13e0: 0x8f11, 0x13e1: 0x7db1, 0x13e2: 0x7dd9, 0x13e3: 0x7e01, + 0x13e4: 0x7e29, 0x13e5: 0x8f39, 0x13e6: 0x7ec9, 0x13e7: 0x7f41, 0x13e8: 0x7f69, 0x13e9: 0x7f91, + 0x13ea: 0x7fb9, 0x13eb: 0x7fe1, 0x13ec: 0x8031, 0x13ed: 0x8059, 0x13ee: 0x8081, 0x13ef: 0x80a9, + 0x13f0: 0x80d1, 0x13f1: 0x80f9, 0x13f2: 0x8f61, 0x13f3: 0x8121, 0x13f4: 0x8149, 0x13f5: 0x8171, + 0x13f6: 0x8199, 0x13f7: 0x81c1, 0x13f8: 0x81e9, 0x13f9: 0x8239, 0x13fa: 0x8261, 0x13fb: 0x8289, + 0x13fc: 0x82b1, 0x13fd: 0x82d9, 0x13fe: 0x8301, 0x13ff: 0x8329, + // Block 0x50, offset 0x1400 + 0x1400: 0x8351, 0x1401: 0x8379, 0x1402: 0x83f1, 0x1403: 0x8419, 0x1404: 0x84b9, 0x1405: 0x84e1, + 0x1406: 0x8509, 0x1407: 0x8531, 0x1408: 0x8559, 0x1409: 0x85d1, 0x140a: 0x85f9, 0x140b: 0x8621, + 0x140c: 0x8649, 0x140d: 0x8f89, 0x140e: 0x86c1, 0x140f: 0x86e9, 0x1410: 0x8711, 0x1411: 0x8739, + 0x1412: 0x87b1, 0x1413: 0x87d9, 0x1414: 0x8801, 0x1415: 0x8829, 0x1416: 0x8fb1, 0x1417: 0x88a1, + 0x1418: 0x88c9, 0x1419: 0x8fd9, 0x141a: 0x8941, 0x141b: 0x8969, 0x141c: 0x8991, 0x141d: 0x89b9, + 0x141e: 0x9001, 0x141f: 0x7c71, 0x1420: 0x8ee9, 0x1421: 0x7d39, 0x1422: 0x8f11, 0x1423: 0x7e29, + 0x1424: 0x8f39, 0x1425: 0x7ec9, 0x1426: 0x9029, 0x1427: 0x80d1, 0x1428: 0x9051, 0x1429: 0x9079, + 0x142a: 0x90a1, 0x142b: 0x8531, 0x142c: 0x8559, 0x142d: 0x8649, 0x142e: 0x8829, 0x142f: 0x8fb1, + 0x1430: 0x89b9, 0x1431: 0x9001, 0x1432: 0x90c9, 0x1433: 0x9101, 0x1434: 0x9139, 0x1435: 0x9171, + 0x1436: 0x9199, 0x1437: 0x91c1, 0x1438: 0x91e9, 0x1439: 0x9211, 0x143a: 0x9239, 0x143b: 0x9261, + 0x143c: 0x9289, 0x143d: 0x92b1, 0x143e: 0x92d9, 0x143f: 0x9301, + // Block 0x51, offset 0x1440 + 0x1440: 0x9329, 0x1441: 0x9351, 0x1442: 0x9379, 0x1443: 0x93a1, 0x1444: 0x93c9, 0x1445: 0x93f1, + 0x1446: 0x9419, 0x1447: 0x9441, 0x1448: 0x9469, 0x1449: 0x9491, 0x144a: 0x94b9, 0x144b: 0x94e1, + 0x144c: 0x9079, 0x144d: 0x9509, 0x144e: 0x9531, 0x144f: 0x9559, 0x1450: 0x9581, 0x1451: 0x9171, + 0x1452: 0x9199, 0x1453: 0x91c1, 0x1454: 0x91e9, 0x1455: 0x9211, 0x1456: 0x9239, 0x1457: 0x9261, + 0x1458: 0x9289, 0x1459: 0x92b1, 0x145a: 0x92d9, 0x145b: 0x9301, 0x145c: 0x9329, 0x145d: 0x9351, + 0x145e: 0x9379, 0x145f: 0x93a1, 0x1460: 0x93c9, 0x1461: 0x93f1, 0x1462: 0x9419, 0x1463: 0x9441, + 0x1464: 0x9469, 0x1465: 0x9491, 0x1466: 0x94b9, 0x1467: 0x94e1, 0x1468: 0x9079, 0x1469: 0x9509, + 0x146a: 0x9531, 0x146b: 0x9559, 0x146c: 0x9581, 0x146d: 0x9491, 0x146e: 0x94b9, 0x146f: 0x94e1, + 0x1470: 0x9079, 0x1471: 0x9051, 0x1472: 0x90a1, 0x1473: 0x8211, 0x1474: 0x8059, 0x1475: 0x8081, + 0x1476: 0x80a9, 0x1477: 0x9491, 0x1478: 0x94b9, 0x1479: 0x94e1, 0x147a: 0x8211, 0x147b: 0x8239, + 0x147c: 0x95a9, 0x147d: 0x95a9, 0x147e: 0x0018, 0x147f: 0x0018, + // Block 0x52, offset 0x1480 + 0x1480: 0x0040, 0x1481: 0x0040, 0x1482: 0x0040, 0x1483: 0x0040, 0x1484: 0x0040, 0x1485: 0x0040, + 0x1486: 0x0040, 0x1487: 0x0040, 0x1488: 0x0040, 0x1489: 0x0040, 0x148a: 0x0040, 0x148b: 0x0040, + 0x148c: 0x0040, 0x148d: 0x0040, 0x148e: 0x0040, 0x148f: 0x0040, 0x1490: 0x95d1, 0x1491: 0x9609, + 0x1492: 0x9609, 0x1493: 0x9641, 0x1494: 0x9679, 0x1495: 0x96b1, 0x1496: 0x96e9, 0x1497: 0x9721, + 0x1498: 0x9759, 0x1499: 0x9759, 0x149a: 0x9791, 0x149b: 0x97c9, 0x149c: 0x9801, 0x149d: 0x9839, + 0x149e: 0x9871, 0x149f: 0x98a9, 0x14a0: 0x98a9, 0x14a1: 0x98e1, 0x14a2: 0x9919, 0x14a3: 0x9919, + 0x14a4: 0x9951, 0x14a5: 0x9951, 0x14a6: 0x9989, 0x14a7: 0x99c1, 0x14a8: 0x99c1, 0x14a9: 0x99f9, + 0x14aa: 0x9a31, 0x14ab: 0x9a31, 0x14ac: 0x9a69, 0x14ad: 0x9a69, 0x14ae: 0x9aa1, 0x14af: 0x9ad9, + 0x14b0: 0x9ad9, 0x14b1: 0x9b11, 0x14b2: 0x9b11, 0x14b3: 0x9b49, 0x14b4: 0x9b81, 0x14b5: 0x9bb9, + 0x14b6: 0x9bf1, 0x14b7: 0x9bf1, 0x14b8: 0x9c29, 0x14b9: 0x9c61, 0x14ba: 0x9c99, 0x14bb: 0x9cd1, + 0x14bc: 0x9d09, 0x14bd: 0x9d09, 0x14be: 0x9d41, 0x14bf: 0x9d79, + // Block 0x53, offset 0x14c0 + 0x14c0: 0xa949, 0x14c1: 0xa981, 0x14c2: 0xa9b9, 0x14c3: 0xa8a1, 0x14c4: 0x9bb9, 0x14c5: 0x9989, + 0x14c6: 0xa9f1, 0x14c7: 0xaa29, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040, + 0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x0040, 0x14d1: 0x0040, + 0x14d2: 0x0040, 0x14d3: 0x0040, 0x14d4: 0x0040, 0x14d5: 0x0040, 0x14d6: 0x0040, 0x14d7: 0x0040, + 0x14d8: 0x0040, 0x14d9: 0x0040, 0x14da: 0x0040, 0x14db: 0x0040, 0x14dc: 0x0040, 0x14dd: 0x0040, + 0x14de: 0x0040, 0x14df: 0x0040, 0x14e0: 0x0040, 0x14e1: 0x0040, 0x14e2: 0x0040, 0x14e3: 0x0040, + 0x14e4: 0x0040, 0x14e5: 0x0040, 0x14e6: 0x0040, 0x14e7: 0x0040, 0x14e8: 0x0040, 0x14e9: 0x0040, + 0x14ea: 0x0040, 0x14eb: 0x0040, 0x14ec: 0x0040, 0x14ed: 0x0040, 0x14ee: 0x0040, 0x14ef: 0x0040, + 0x14f0: 0xaa61, 0x14f1: 0xaa99, 0x14f2: 0xaad1, 0x14f3: 0xab19, 0x14f4: 0xab61, 0x14f5: 0xaba9, + 0x14f6: 0xabf1, 0x14f7: 0xac39, 0x14f8: 0xac81, 0x14f9: 0xacc9, 0x14fa: 0xad02, 0x14fb: 0xae12, + 0x14fc: 0xae91, 0x14fd: 0x0018, 0x14fe: 0x0040, 0x14ff: 0x0040, + // Block 0x54, offset 0x1500 + 0x1500: 0x33c0, 0x1501: 0x33c0, 0x1502: 0x33c0, 0x1503: 0x33c0, 0x1504: 0x33c0, 0x1505: 0x33c0, + 0x1506: 0x33c0, 0x1507: 0x33c0, 0x1508: 0x33c0, 0x1509: 0x33c0, 0x150a: 0x33c0, 0x150b: 0x33c0, + 0x150c: 0x33c0, 0x150d: 0x33c0, 0x150e: 0x33c0, 0x150f: 0x33c0, 0x1510: 0xaeda, 0x1511: 0x7d55, + 0x1512: 0x0040, 0x1513: 0xaeea, 0x1514: 0x03c2, 0x1515: 0xaefa, 0x1516: 0xaf0a, 0x1517: 0x7d75, + 0x1518: 0x7d95, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040, + 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x3308, 0x1521: 0x3308, 0x1522: 0x3308, 0x1523: 0x3308, + 0x1524: 0x3308, 0x1525: 0x3308, 0x1526: 0x3308, 0x1527: 0x3308, 0x1528: 0x3308, 0x1529: 0x3308, + 0x152a: 0x3308, 0x152b: 0x3308, 0x152c: 0x3308, 0x152d: 0x3308, 0x152e: 0x3308, 0x152f: 0x3308, + 0x1530: 0x0040, 0x1531: 0x7db5, 0x1532: 0x7dd5, 0x1533: 0xaf1a, 0x1534: 0xaf1a, 0x1535: 0x1fd2, + 0x1536: 0x1fe2, 0x1537: 0xaf2a, 0x1538: 0xaf3a, 0x1539: 0x7df5, 0x153a: 0x7e15, 0x153b: 0x7e35, + 0x153c: 0x7df5, 0x153d: 0x7e55, 0x153e: 0x7e75, 0x153f: 0x7e55, + // Block 0x55, offset 0x1540 + 0x1540: 0x7e95, 0x1541: 0x7eb5, 0x1542: 0x7ed5, 0x1543: 0x7eb5, 0x1544: 0x7ef5, 0x1545: 0x0018, + 0x1546: 0x0018, 0x1547: 0xaf4a, 0x1548: 0xaf5a, 0x1549: 0x7f16, 0x154a: 0x7f36, 0x154b: 0x7f56, + 0x154c: 0x7f76, 0x154d: 0xaf1a, 0x154e: 0xaf1a, 0x154f: 0xaf1a, 0x1550: 0xaeda, 0x1551: 0x7f95, + 0x1552: 0x0040, 0x1553: 0x0040, 0x1554: 0x03c2, 0x1555: 0xaeea, 0x1556: 0xaf0a, 0x1557: 0xaefa, + 0x1558: 0x7fb5, 0x1559: 0x1fd2, 0x155a: 0x1fe2, 0x155b: 0xaf2a, 0x155c: 0xaf3a, 0x155d: 0x7e95, + 0x155e: 0x7ef5, 0x155f: 0xaf6a, 0x1560: 0xaf7a, 0x1561: 0xaf8a, 0x1562: 0x1fb2, 0x1563: 0xaf99, + 0x1564: 0xafaa, 0x1565: 0xafba, 0x1566: 0x1fc2, 0x1567: 0x0040, 0x1568: 0xafca, 0x1569: 0xafda, + 0x156a: 0xafea, 0x156b: 0xaffa, 0x156c: 0x0040, 0x156d: 0x0040, 0x156e: 0x0040, 0x156f: 0x0040, + 0x1570: 0x7fd6, 0x1571: 0xb009, 0x1572: 0x7ff6, 0x1573: 0x0808, 0x1574: 0x8016, 0x1575: 0x0040, + 0x1576: 0x8036, 0x1577: 0xb031, 0x1578: 0x8056, 0x1579: 0xb059, 0x157a: 0x8076, 0x157b: 0xb081, + 0x157c: 0x8096, 0x157d: 0xb0a9, 0x157e: 0x80b6, 0x157f: 0xb0d1, + // Block 0x56, offset 0x1580 + 0x1580: 0xb0f9, 0x1581: 0xb111, 0x1582: 0xb111, 0x1583: 0xb129, 0x1584: 0xb129, 0x1585: 0xb141, + 0x1586: 0xb141, 0x1587: 0xb159, 0x1588: 0xb159, 0x1589: 0xb171, 0x158a: 0xb171, 0x158b: 0xb171, + 0x158c: 0xb171, 0x158d: 0xb189, 0x158e: 0xb189, 0x158f: 0xb1a1, 0x1590: 0xb1a1, 0x1591: 0xb1a1, + 0x1592: 0xb1a1, 0x1593: 0xb1b9, 0x1594: 0xb1b9, 0x1595: 0xb1d1, 0x1596: 0xb1d1, 0x1597: 0xb1d1, + 0x1598: 0xb1d1, 0x1599: 0xb1e9, 0x159a: 0xb1e9, 0x159b: 0xb1e9, 0x159c: 0xb1e9, 0x159d: 0xb201, + 0x159e: 0xb201, 0x159f: 0xb201, 0x15a0: 0xb201, 0x15a1: 0xb219, 0x15a2: 0xb219, 0x15a3: 0xb219, + 0x15a4: 0xb219, 0x15a5: 0xb231, 0x15a6: 0xb231, 0x15a7: 0xb231, 0x15a8: 0xb231, 0x15a9: 0xb249, + 0x15aa: 0xb249, 0x15ab: 0xb261, 0x15ac: 0xb261, 0x15ad: 0xb279, 0x15ae: 0xb279, 0x15af: 0xb291, + 0x15b0: 0xb291, 0x15b1: 0xb2a9, 0x15b2: 0xb2a9, 0x15b3: 0xb2a9, 0x15b4: 0xb2a9, 0x15b5: 0xb2c1, + 0x15b6: 0xb2c1, 0x15b7: 0xb2c1, 0x15b8: 0xb2c1, 0x15b9: 0xb2d9, 0x15ba: 0xb2d9, 0x15bb: 0xb2d9, + 0x15bc: 0xb2d9, 0x15bd: 0xb2f1, 0x15be: 0xb2f1, 0x15bf: 0xb2f1, + // Block 0x57, offset 0x15c0 + 0x15c0: 0xb2f1, 0x15c1: 0xb309, 0x15c2: 0xb309, 0x15c3: 0xb309, 0x15c4: 0xb309, 0x15c5: 0xb321, + 0x15c6: 0xb321, 0x15c7: 0xb321, 0x15c8: 0xb321, 0x15c9: 0xb339, 0x15ca: 0xb339, 0x15cb: 0xb339, + 0x15cc: 0xb339, 0x15cd: 0xb351, 0x15ce: 0xb351, 0x15cf: 0xb351, 0x15d0: 0xb351, 0x15d1: 0xb369, + 0x15d2: 0xb369, 0x15d3: 0xb369, 0x15d4: 0xb369, 0x15d5: 0xb381, 0x15d6: 0xb381, 0x15d7: 0xb381, + 0x15d8: 0xb381, 0x15d9: 0xb399, 0x15da: 0xb399, 0x15db: 0xb399, 0x15dc: 0xb399, 0x15dd: 0xb3b1, + 0x15de: 0xb3b1, 0x15df: 0xb3b1, 0x15e0: 0xb3b1, 0x15e1: 0xb3c9, 0x15e2: 0xb3c9, 0x15e3: 0xb3c9, + 0x15e4: 0xb3c9, 0x15e5: 0xb3e1, 0x15e6: 0xb3e1, 0x15e7: 0xb3e1, 0x15e8: 0xb3e1, 0x15e9: 0xb3f9, + 0x15ea: 0xb3f9, 0x15eb: 0xb3f9, 0x15ec: 0xb3f9, 0x15ed: 0xb411, 0x15ee: 0xb411, 0x15ef: 0x7ab1, + 0x15f0: 0x7ab1, 0x15f1: 0xb429, 0x15f2: 0xb429, 0x15f3: 0xb429, 0x15f4: 0xb429, 0x15f5: 0xb441, + 0x15f6: 0xb441, 0x15f7: 0xb469, 0x15f8: 0xb469, 0x15f9: 0xb491, 0x15fa: 0xb491, 0x15fb: 0xb4b9, + 0x15fc: 0xb4b9, 0x15fd: 0x0040, 0x15fe: 0x0040, 0x15ff: 0x03c0, + // Block 0x58, offset 0x1600 + 0x1600: 0x0040, 0x1601: 0xaefa, 0x1602: 0xb4e2, 0x1603: 0xaf6a, 0x1604: 0xafda, 0x1605: 0xafea, + 0x1606: 0xaf7a, 0x1607: 0xb4f2, 0x1608: 0x1fd2, 0x1609: 0x1fe2, 0x160a: 0xaf8a, 0x160b: 0x1fb2, + 0x160c: 0xaeda, 0x160d: 0xaf99, 0x160e: 0x29d1, 0x160f: 0xb502, 0x1610: 0x1f41, 0x1611: 0x00c9, + 0x1612: 0x0069, 0x1613: 0x0079, 0x1614: 0x1f51, 0x1615: 0x1f61, 0x1616: 0x1f71, 0x1617: 0x1f81, + 0x1618: 0x1f91, 0x1619: 0x1fa1, 0x161a: 0xaeea, 0x161b: 0x03c2, 0x161c: 0xafaa, 0x161d: 0x1fc2, + 0x161e: 0xafba, 0x161f: 0xaf0a, 0x1620: 0xaffa, 0x1621: 0x0039, 0x1622: 0x0ee9, 0x1623: 0x1159, + 0x1624: 0x0ef9, 0x1625: 0x0f09, 0x1626: 0x1199, 0x1627: 0x0f31, 0x1628: 0x0249, 0x1629: 0x0f41, + 0x162a: 0x0259, 0x162b: 0x0f51, 0x162c: 0x0359, 0x162d: 0x0f61, 0x162e: 0x0f71, 0x162f: 0x00d9, + 0x1630: 0x0f99, 0x1631: 0x2039, 0x1632: 0x0269, 0x1633: 0x01d9, 0x1634: 0x0fa9, 0x1635: 0x0fb9, + 0x1636: 0x1089, 0x1637: 0x0279, 0x1638: 0x0369, 0x1639: 0x0289, 0x163a: 0x13d1, 0x163b: 0xaf4a, + 0x163c: 0xafca, 0x163d: 0xaf5a, 0x163e: 0xb512, 0x163f: 0xaf1a, + // Block 0x59, offset 0x1640 + 0x1640: 0x1caa, 0x1641: 0x0039, 0x1642: 0x0ee9, 0x1643: 0x1159, 0x1644: 0x0ef9, 0x1645: 0x0f09, + 0x1646: 0x1199, 0x1647: 0x0f31, 0x1648: 0x0249, 0x1649: 0x0f41, 0x164a: 0x0259, 0x164b: 0x0f51, + 0x164c: 0x0359, 0x164d: 0x0f61, 0x164e: 0x0f71, 0x164f: 0x00d9, 0x1650: 0x0f99, 0x1651: 0x2039, + 0x1652: 0x0269, 0x1653: 0x01d9, 0x1654: 0x0fa9, 0x1655: 0x0fb9, 0x1656: 0x1089, 0x1657: 0x0279, + 0x1658: 0x0369, 0x1659: 0x0289, 0x165a: 0x13d1, 0x165b: 0xaf2a, 0x165c: 0xb522, 0x165d: 0xaf3a, + 0x165e: 0xb532, 0x165f: 0x80d5, 0x1660: 0x80f5, 0x1661: 0x29d1, 0x1662: 0x8115, 0x1663: 0x8115, + 0x1664: 0x8135, 0x1665: 0x8155, 0x1666: 0x8175, 0x1667: 0x8195, 0x1668: 0x81b5, 0x1669: 0x81d5, + 0x166a: 0x81f5, 0x166b: 0x8215, 0x166c: 0x8235, 0x166d: 0x8255, 0x166e: 0x8275, 0x166f: 0x8295, + 0x1670: 0x82b5, 0x1671: 0x82d5, 0x1672: 0x82f5, 0x1673: 0x8315, 0x1674: 0x8335, 0x1675: 0x8355, + 0x1676: 0x8375, 0x1677: 0x8395, 0x1678: 0x83b5, 0x1679: 0x83d5, 0x167a: 0x83f5, 0x167b: 0x8415, + 0x167c: 0x81b5, 0x167d: 0x8435, 0x167e: 0x8455, 0x167f: 0x8215, + // Block 0x5a, offset 0x1680 + 0x1680: 0x8475, 0x1681: 0x8495, 0x1682: 0x84b5, 0x1683: 0x84d5, 0x1684: 0x84f5, 0x1685: 0x8515, + 0x1686: 0x8535, 0x1687: 0x8555, 0x1688: 0x84d5, 0x1689: 0x8575, 0x168a: 0x84d5, 0x168b: 0x8595, + 0x168c: 0x8595, 0x168d: 0x85b5, 0x168e: 0x85b5, 0x168f: 0x85d5, 0x1690: 0x8515, 0x1691: 0x85f5, + 0x1692: 0x8615, 0x1693: 0x85f5, 0x1694: 0x8635, 0x1695: 0x8615, 0x1696: 0x8655, 0x1697: 0x8655, + 0x1698: 0x8675, 0x1699: 0x8675, 0x169a: 0x8695, 0x169b: 0x8695, 0x169c: 0x8615, 0x169d: 0x8115, + 0x169e: 0x86b5, 0x169f: 0x86d5, 0x16a0: 0x0040, 0x16a1: 0x86f5, 0x16a2: 0x8715, 0x16a3: 0x8735, + 0x16a4: 0x8755, 0x16a5: 0x8735, 0x16a6: 0x8775, 0x16a7: 0x8795, 0x16a8: 0x87b5, 0x16a9: 0x87b5, + 0x16aa: 0x87d5, 0x16ab: 0x87d5, 0x16ac: 0x87f5, 0x16ad: 0x87f5, 0x16ae: 0x87d5, 0x16af: 0x87d5, + 0x16b0: 0x8815, 0x16b1: 0x8835, 0x16b2: 0x8855, 0x16b3: 0x8875, 0x16b4: 0x8895, 0x16b5: 0x88b5, + 0x16b6: 0x88b5, 0x16b7: 0x88b5, 0x16b8: 0x88d5, 0x16b9: 0x88d5, 0x16ba: 0x88d5, 0x16bb: 0x88d5, + 0x16bc: 0x87b5, 0x16bd: 0x87b5, 0x16be: 0x87b5, 0x16bf: 0x0040, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x0040, 0x16c1: 0x0040, 0x16c2: 0x8715, 0x16c3: 0x86f5, 0x16c4: 0x88f5, 0x16c5: 0x86f5, + 0x16c6: 0x8715, 0x16c7: 0x86f5, 0x16c8: 0x0040, 0x16c9: 0x0040, 0x16ca: 0x8915, 0x16cb: 0x8715, + 0x16cc: 0x8935, 0x16cd: 0x88f5, 0x16ce: 0x8935, 0x16cf: 0x8715, 0x16d0: 0x0040, 0x16d1: 0x0040, + 0x16d2: 0x8955, 0x16d3: 0x8975, 0x16d4: 0x8875, 0x16d5: 0x8935, 0x16d6: 0x88f5, 0x16d7: 0x8935, + 0x16d8: 0x0040, 0x16d9: 0x0040, 0x16da: 0x8995, 0x16db: 0x89b5, 0x16dc: 0x8995, 0x16dd: 0x0040, + 0x16de: 0x0040, 0x16df: 0x0040, 0x16e0: 0xb541, 0x16e1: 0xb559, 0x16e2: 0xb571, 0x16e3: 0x89d6, + 0x16e4: 0xb589, 0x16e5: 0xb5a1, 0x16e6: 0x89f5, 0x16e7: 0x0040, 0x16e8: 0x8a15, 0x16e9: 0x8a35, + 0x16ea: 0x8a55, 0x16eb: 0x8a35, 0x16ec: 0x8a75, 0x16ed: 0x8a95, 0x16ee: 0x8ab5, 0x16ef: 0x0040, + 0x16f0: 0x0040, 0x16f1: 0x0040, 0x16f2: 0x0040, 0x16f3: 0x0040, 0x16f4: 0x0040, 0x16f5: 0x0040, + 0x16f6: 0x0040, 0x16f7: 0x0040, 0x16f8: 0x0040, 0x16f9: 0x0340, 0x16fa: 0x0340, 0x16fb: 0x0340, + 0x16fc: 0x0040, 0x16fd: 0x0040, 0x16fe: 0x0040, 0x16ff: 0x0040, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0a08, 0x1701: 0x0a08, 0x1702: 0x0a08, 0x1703: 0x0a08, 0x1704: 0x0a08, 0x1705: 0x0c08, + 0x1706: 0x0808, 0x1707: 0x0c08, 0x1708: 0x0818, 0x1709: 0x0c08, 0x170a: 0x0c08, 0x170b: 0x0808, + 0x170c: 0x0808, 0x170d: 0x0908, 0x170e: 0x0c08, 0x170f: 0x0c08, 0x1710: 0x0c08, 0x1711: 0x0c08, + 0x1712: 0x0c08, 0x1713: 0x0a08, 0x1714: 0x0a08, 0x1715: 0x0a08, 0x1716: 0x0a08, 0x1717: 0x0908, + 0x1718: 0x0a08, 0x1719: 0x0a08, 0x171a: 0x0a08, 0x171b: 0x0a08, 0x171c: 0x0a08, 0x171d: 0x0c08, + 0x171e: 0x0a08, 0x171f: 0x0a08, 0x1720: 0x0a08, 0x1721: 0x0c08, 0x1722: 0x0808, 0x1723: 0x0808, + 0x1724: 0x0c08, 0x1725: 0x3308, 0x1726: 0x3308, 0x1727: 0x0040, 0x1728: 0x0040, 0x1729: 0x0040, + 0x172a: 0x0040, 0x172b: 0x0a18, 0x172c: 0x0a18, 0x172d: 0x0a18, 0x172e: 0x0a18, 0x172f: 0x0c18, + 0x1730: 0x0818, 0x1731: 0x0818, 0x1732: 0x0818, 0x1733: 0x0818, 0x1734: 0x0818, 0x1735: 0x0818, + 0x1736: 0x0818, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0040, 0x173a: 0x0040, 0x173b: 0x0040, + 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, + // Block 0x5d, offset 0x1740 + 0x1740: 0x0a08, 0x1741: 0x0c08, 0x1742: 0x0a08, 0x1743: 0x0c08, 0x1744: 0x0c08, 0x1745: 0x0c08, + 0x1746: 0x0a08, 0x1747: 0x0a08, 0x1748: 0x0a08, 0x1749: 0x0c08, 0x174a: 0x0a08, 0x174b: 0x0a08, + 0x174c: 0x0c08, 0x174d: 0x0a08, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0a08, 0x1751: 0x0c08, + 0x1752: 0x0040, 0x1753: 0x0040, 0x1754: 0x0040, 0x1755: 0x0040, 0x1756: 0x0040, 0x1757: 0x0040, + 0x1758: 0x0040, 0x1759: 0x0818, 0x175a: 0x0818, 0x175b: 0x0818, 0x175c: 0x0818, 0x175d: 0x0040, + 0x175e: 0x0040, 0x175f: 0x0040, 0x1760: 0x0040, 0x1761: 0x0040, 0x1762: 0x0040, 0x1763: 0x0040, + 0x1764: 0x0040, 0x1765: 0x0040, 0x1766: 0x0040, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0c18, + 0x176a: 0x0c18, 0x176b: 0x0c18, 0x176c: 0x0c18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0818, + 0x1770: 0x0040, 0x1771: 0x0040, 0x1772: 0x0040, 0x1773: 0x0040, 0x1774: 0x0040, 0x1775: 0x0040, + 0x1776: 0x0040, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040, + 0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040, + // Block 0x5e, offset 0x1780 + 0x1780: 0x3308, 0x1781: 0x3308, 0x1782: 0x3008, 0x1783: 0x3008, 0x1784: 0x0040, 0x1785: 0x0008, + 0x1786: 0x0008, 0x1787: 0x0008, 0x1788: 0x0008, 0x1789: 0x0008, 0x178a: 0x0008, 0x178b: 0x0008, + 0x178c: 0x0008, 0x178d: 0x0040, 0x178e: 0x0040, 0x178f: 0x0008, 0x1790: 0x0008, 0x1791: 0x0040, + 0x1792: 0x0040, 0x1793: 0x0008, 0x1794: 0x0008, 0x1795: 0x0008, 0x1796: 0x0008, 0x1797: 0x0008, + 0x1798: 0x0008, 0x1799: 0x0008, 0x179a: 0x0008, 0x179b: 0x0008, 0x179c: 0x0008, 0x179d: 0x0008, + 0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x0008, 0x17a3: 0x0008, + 0x17a4: 0x0008, 0x17a5: 0x0008, 0x17a6: 0x0008, 0x17a7: 0x0008, 0x17a8: 0x0008, 0x17a9: 0x0040, + 0x17aa: 0x0008, 0x17ab: 0x0008, 0x17ac: 0x0008, 0x17ad: 0x0008, 0x17ae: 0x0008, 0x17af: 0x0008, + 0x17b0: 0x0008, 0x17b1: 0x0040, 0x17b2: 0x0008, 0x17b3: 0x0008, 0x17b4: 0x0040, 0x17b5: 0x0008, + 0x17b6: 0x0008, 0x17b7: 0x0008, 0x17b8: 0x0008, 0x17b9: 0x0008, 0x17ba: 0x0040, 0x17bb: 0x0040, + 0x17bc: 0x3308, 0x17bd: 0x0008, 0x17be: 0x3008, 0x17bf: 0x3008, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x3308, 0x17c1: 0x3008, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x3008, 0x17c5: 0x0040, + 0x17c6: 0x0040, 0x17c7: 0x3008, 0x17c8: 0x3008, 0x17c9: 0x0040, 0x17ca: 0x0040, 0x17cb: 0x3008, + 0x17cc: 0x3008, 0x17cd: 0x3808, 0x17ce: 0x0040, 0x17cf: 0x0040, 0x17d0: 0x0008, 0x17d1: 0x0040, + 0x17d2: 0x0040, 0x17d3: 0x0040, 0x17d4: 0x0040, 0x17d5: 0x0040, 0x17d6: 0x0040, 0x17d7: 0x3008, + 0x17d8: 0x0040, 0x17d9: 0x0040, 0x17da: 0x0040, 0x17db: 0x0040, 0x17dc: 0x0040, 0x17dd: 0x0008, + 0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x3008, 0x17e3: 0x3008, + 0x17e4: 0x0040, 0x17e5: 0x0040, 0x17e6: 0x3308, 0x17e7: 0x3308, 0x17e8: 0x3308, 0x17e9: 0x3308, + 0x17ea: 0x3308, 0x17eb: 0x3308, 0x17ec: 0x3308, 0x17ed: 0x0040, 0x17ee: 0x0040, 0x17ef: 0x0040, + 0x17f0: 0x3308, 0x17f1: 0x3308, 0x17f2: 0x3308, 0x17f3: 0x3308, 0x17f4: 0x3308, 0x17f5: 0x0040, + 0x17f6: 0x0040, 0x17f7: 0x0040, 0x17f8: 0x0040, 0x17f9: 0x0040, 0x17fa: 0x0040, 0x17fb: 0x0040, + 0x17fc: 0x0040, 0x17fd: 0x0040, 0x17fe: 0x0040, 0x17ff: 0x0040, + // Block 0x60, offset 0x1800 + 0x1800: 0x0039, 0x1801: 0x0ee9, 0x1802: 0x1159, 0x1803: 0x0ef9, 0x1804: 0x0f09, 0x1805: 0x1199, + 0x1806: 0x0f31, 0x1807: 0x0249, 0x1808: 0x0f41, 0x1809: 0x0259, 0x180a: 0x0f51, 0x180b: 0x0359, + 0x180c: 0x0f61, 0x180d: 0x0f71, 0x180e: 0x00d9, 0x180f: 0x0f99, 0x1810: 0x2039, 0x1811: 0x0269, + 0x1812: 0x01d9, 0x1813: 0x0fa9, 0x1814: 0x0fb9, 0x1815: 0x1089, 0x1816: 0x0279, 0x1817: 0x0369, + 0x1818: 0x0289, 0x1819: 0x13d1, 0x181a: 0x0039, 0x181b: 0x0ee9, 0x181c: 0x1159, 0x181d: 0x0ef9, + 0x181e: 0x0f09, 0x181f: 0x1199, 0x1820: 0x0f31, 0x1821: 0x0249, 0x1822: 0x0f41, 0x1823: 0x0259, + 0x1824: 0x0f51, 0x1825: 0x0359, 0x1826: 0x0f61, 0x1827: 0x0f71, 0x1828: 0x00d9, 0x1829: 0x0f99, + 0x182a: 0x2039, 0x182b: 0x0269, 0x182c: 0x01d9, 0x182d: 0x0fa9, 0x182e: 0x0fb9, 0x182f: 0x1089, + 0x1830: 0x0279, 0x1831: 0x0369, 0x1832: 0x0289, 0x1833: 0x13d1, 0x1834: 0x0039, 0x1835: 0x0ee9, + 0x1836: 0x1159, 0x1837: 0x0ef9, 0x1838: 0x0f09, 0x1839: 0x1199, 0x183a: 0x0f31, 0x183b: 0x0249, + 0x183c: 0x0f41, 0x183d: 0x0259, 0x183e: 0x0f51, 0x183f: 0x0359, + // Block 0x61, offset 0x1840 + 0x1840: 0x0f61, 0x1841: 0x0f71, 0x1842: 0x00d9, 0x1843: 0x0f99, 0x1844: 0x2039, 0x1845: 0x0269, + 0x1846: 0x01d9, 0x1847: 0x0fa9, 0x1848: 0x0fb9, 0x1849: 0x1089, 0x184a: 0x0279, 0x184b: 0x0369, + 0x184c: 0x0289, 0x184d: 0x13d1, 0x184e: 0x0039, 0x184f: 0x0ee9, 0x1850: 0x1159, 0x1851: 0x0ef9, + 0x1852: 0x0f09, 0x1853: 0x1199, 0x1854: 0x0f31, 0x1855: 0x0040, 0x1856: 0x0f41, 0x1857: 0x0259, + 0x1858: 0x0f51, 0x1859: 0x0359, 0x185a: 0x0f61, 0x185b: 0x0f71, 0x185c: 0x00d9, 0x185d: 0x0f99, + 0x185e: 0x2039, 0x185f: 0x0269, 0x1860: 0x01d9, 0x1861: 0x0fa9, 0x1862: 0x0fb9, 0x1863: 0x1089, + 0x1864: 0x0279, 0x1865: 0x0369, 0x1866: 0x0289, 0x1867: 0x13d1, 0x1868: 0x0039, 0x1869: 0x0ee9, + 0x186a: 0x1159, 0x186b: 0x0ef9, 0x186c: 0x0f09, 0x186d: 0x1199, 0x186e: 0x0f31, 0x186f: 0x0249, + 0x1870: 0x0f41, 0x1871: 0x0259, 0x1872: 0x0f51, 0x1873: 0x0359, 0x1874: 0x0f61, 0x1875: 0x0f71, + 0x1876: 0x00d9, 0x1877: 0x0f99, 0x1878: 0x2039, 0x1879: 0x0269, 0x187a: 0x01d9, 0x187b: 0x0fa9, + 0x187c: 0x0fb9, 0x187d: 0x1089, 0x187e: 0x0279, 0x187f: 0x0369, + // Block 0x62, offset 0x1880 + 0x1880: 0x0289, 0x1881: 0x13d1, 0x1882: 0x0039, 0x1883: 0x0ee9, 0x1884: 0x1159, 0x1885: 0x0ef9, + 0x1886: 0x0f09, 0x1887: 0x1199, 0x1888: 0x0f31, 0x1889: 0x0249, 0x188a: 0x0f41, 0x188b: 0x0259, + 0x188c: 0x0f51, 0x188d: 0x0359, 0x188e: 0x0f61, 0x188f: 0x0f71, 0x1890: 0x00d9, 0x1891: 0x0f99, + 0x1892: 0x2039, 0x1893: 0x0269, 0x1894: 0x01d9, 0x1895: 0x0fa9, 0x1896: 0x0fb9, 0x1897: 0x1089, + 0x1898: 0x0279, 0x1899: 0x0369, 0x189a: 0x0289, 0x189b: 0x13d1, 0x189c: 0x0039, 0x189d: 0x0040, + 0x189e: 0x1159, 0x189f: 0x0ef9, 0x18a0: 0x0040, 0x18a1: 0x0040, 0x18a2: 0x0f31, 0x18a3: 0x0040, + 0x18a4: 0x0040, 0x18a5: 0x0259, 0x18a6: 0x0f51, 0x18a7: 0x0040, 0x18a8: 0x0040, 0x18a9: 0x0f71, + 0x18aa: 0x00d9, 0x18ab: 0x0f99, 0x18ac: 0x2039, 0x18ad: 0x0040, 0x18ae: 0x01d9, 0x18af: 0x0fa9, + 0x18b0: 0x0fb9, 0x18b1: 0x1089, 0x18b2: 0x0279, 0x18b3: 0x0369, 0x18b4: 0x0289, 0x18b5: 0x13d1, + 0x18b6: 0x0039, 0x18b7: 0x0ee9, 0x18b8: 0x1159, 0x18b9: 0x0ef9, 0x18ba: 0x0040, 0x18bb: 0x1199, + 0x18bc: 0x0040, 0x18bd: 0x0249, 0x18be: 0x0f41, 0x18bf: 0x0259, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0f51, 0x18c1: 0x0359, 0x18c2: 0x0f61, 0x18c3: 0x0f71, 0x18c4: 0x0040, 0x18c5: 0x0f99, + 0x18c6: 0x2039, 0x18c7: 0x0269, 0x18c8: 0x01d9, 0x18c9: 0x0fa9, 0x18ca: 0x0fb9, 0x18cb: 0x1089, + 0x18cc: 0x0279, 0x18cd: 0x0369, 0x18ce: 0x0289, 0x18cf: 0x13d1, 0x18d0: 0x0039, 0x18d1: 0x0ee9, + 0x18d2: 0x1159, 0x18d3: 0x0ef9, 0x18d4: 0x0f09, 0x18d5: 0x1199, 0x18d6: 0x0f31, 0x18d7: 0x0249, + 0x18d8: 0x0f41, 0x18d9: 0x0259, 0x18da: 0x0f51, 0x18db: 0x0359, 0x18dc: 0x0f61, 0x18dd: 0x0f71, + 0x18de: 0x00d9, 0x18df: 0x0f99, 0x18e0: 0x2039, 0x18e1: 0x0269, 0x18e2: 0x01d9, 0x18e3: 0x0fa9, + 0x18e4: 0x0fb9, 0x18e5: 0x1089, 0x18e6: 0x0279, 0x18e7: 0x0369, 0x18e8: 0x0289, 0x18e9: 0x13d1, + 0x18ea: 0x0039, 0x18eb: 0x0ee9, 0x18ec: 0x1159, 0x18ed: 0x0ef9, 0x18ee: 0x0f09, 0x18ef: 0x1199, + 0x18f0: 0x0f31, 0x18f1: 0x0249, 0x18f2: 0x0f41, 0x18f3: 0x0259, 0x18f4: 0x0f51, 0x18f5: 0x0359, + 0x18f6: 0x0f61, 0x18f7: 0x0f71, 0x18f8: 0x00d9, 0x18f9: 0x0f99, 0x18fa: 0x2039, 0x18fb: 0x0269, + 0x18fc: 0x01d9, 0x18fd: 0x0fa9, 0x18fe: 0x0fb9, 0x18ff: 0x1089, + // Block 0x64, offset 0x1900 + 0x1900: 0x0279, 0x1901: 0x0369, 0x1902: 0x0289, 0x1903: 0x13d1, 0x1904: 0x0039, 0x1905: 0x0ee9, + 0x1906: 0x0040, 0x1907: 0x0ef9, 0x1908: 0x0f09, 0x1909: 0x1199, 0x190a: 0x0f31, 0x190b: 0x0040, + 0x190c: 0x0040, 0x190d: 0x0259, 0x190e: 0x0f51, 0x190f: 0x0359, 0x1910: 0x0f61, 0x1911: 0x0f71, + 0x1912: 0x00d9, 0x1913: 0x0f99, 0x1914: 0x2039, 0x1915: 0x0040, 0x1916: 0x01d9, 0x1917: 0x0fa9, + 0x1918: 0x0fb9, 0x1919: 0x1089, 0x191a: 0x0279, 0x191b: 0x0369, 0x191c: 0x0289, 0x191d: 0x0040, + 0x191e: 0x0039, 0x191f: 0x0ee9, 0x1920: 0x1159, 0x1921: 0x0ef9, 0x1922: 0x0f09, 0x1923: 0x1199, + 0x1924: 0x0f31, 0x1925: 0x0249, 0x1926: 0x0f41, 0x1927: 0x0259, 0x1928: 0x0f51, 0x1929: 0x0359, + 0x192a: 0x0f61, 0x192b: 0x0f71, 0x192c: 0x00d9, 0x192d: 0x0f99, 0x192e: 0x2039, 0x192f: 0x0269, + 0x1930: 0x01d9, 0x1931: 0x0fa9, 0x1932: 0x0fb9, 0x1933: 0x1089, 0x1934: 0x0279, 0x1935: 0x0369, + 0x1936: 0x0289, 0x1937: 0x13d1, 0x1938: 0x0039, 0x1939: 0x0ee9, 0x193a: 0x0040, 0x193b: 0x0ef9, + 0x193c: 0x0f09, 0x193d: 0x1199, 0x193e: 0x0f31, 0x193f: 0x0040, + // Block 0x65, offset 0x1940 + 0x1940: 0x0f41, 0x1941: 0x0259, 0x1942: 0x0f51, 0x1943: 0x0359, 0x1944: 0x0f61, 0x1945: 0x0040, + 0x1946: 0x00d9, 0x1947: 0x0040, 0x1948: 0x0040, 0x1949: 0x0040, 0x194a: 0x01d9, 0x194b: 0x0fa9, + 0x194c: 0x0fb9, 0x194d: 0x1089, 0x194e: 0x0279, 0x194f: 0x0369, 0x1950: 0x0289, 0x1951: 0x0040, + 0x1952: 0x0039, 0x1953: 0x0ee9, 0x1954: 0x1159, 0x1955: 0x0ef9, 0x1956: 0x0f09, 0x1957: 0x1199, + 0x1958: 0x0f31, 0x1959: 0x0249, 0x195a: 0x0f41, 0x195b: 0x0259, 0x195c: 0x0f51, 0x195d: 0x0359, + 0x195e: 0x0f61, 0x195f: 0x0f71, 0x1960: 0x00d9, 0x1961: 0x0f99, 0x1962: 0x2039, 0x1963: 0x0269, + 0x1964: 0x01d9, 0x1965: 0x0fa9, 0x1966: 0x0fb9, 0x1967: 0x1089, 0x1968: 0x0279, 0x1969: 0x0369, + 0x196a: 0x0289, 0x196b: 0x13d1, 0x196c: 0x0039, 0x196d: 0x0ee9, 0x196e: 0x1159, 0x196f: 0x0ef9, + 0x1970: 0x0f09, 0x1971: 0x1199, 0x1972: 0x0f31, 0x1973: 0x0249, 0x1974: 0x0f41, 0x1975: 0x0259, + 0x1976: 0x0f51, 0x1977: 0x0359, 0x1978: 0x0f61, 0x1979: 0x0f71, 0x197a: 0x00d9, 0x197b: 0x0f99, + 0x197c: 0x2039, 0x197d: 0x0269, 0x197e: 0x01d9, 0x197f: 0x0fa9, + // Block 0x66, offset 0x1980 + 0x1980: 0x0fb9, 0x1981: 0x1089, 0x1982: 0x0279, 0x1983: 0x0369, 0x1984: 0x0289, 0x1985: 0x13d1, + 0x1986: 0x0039, 0x1987: 0x0ee9, 0x1988: 0x1159, 0x1989: 0x0ef9, 0x198a: 0x0f09, 0x198b: 0x1199, + 0x198c: 0x0f31, 0x198d: 0x0249, 0x198e: 0x0f41, 0x198f: 0x0259, 0x1990: 0x0f51, 0x1991: 0x0359, + 0x1992: 0x0f61, 0x1993: 0x0f71, 0x1994: 0x00d9, 0x1995: 0x0f99, 0x1996: 0x2039, 0x1997: 0x0269, + 0x1998: 0x01d9, 0x1999: 0x0fa9, 0x199a: 0x0fb9, 0x199b: 0x1089, 0x199c: 0x0279, 0x199d: 0x0369, + 0x199e: 0x0289, 0x199f: 0x13d1, 0x19a0: 0x0039, 0x19a1: 0x0ee9, 0x19a2: 0x1159, 0x19a3: 0x0ef9, + 0x19a4: 0x0f09, 0x19a5: 0x1199, 0x19a6: 0x0f31, 0x19a7: 0x0249, 0x19a8: 0x0f41, 0x19a9: 0x0259, + 0x19aa: 0x0f51, 0x19ab: 0x0359, 0x19ac: 0x0f61, 0x19ad: 0x0f71, 0x19ae: 0x00d9, 0x19af: 0x0f99, + 0x19b0: 0x2039, 0x19b1: 0x0269, 0x19b2: 0x01d9, 0x19b3: 0x0fa9, 0x19b4: 0x0fb9, 0x19b5: 0x1089, + 0x19b6: 0x0279, 0x19b7: 0x0369, 0x19b8: 0x0289, 0x19b9: 0x13d1, 0x19ba: 0x0039, 0x19bb: 0x0ee9, + 0x19bc: 0x1159, 0x19bd: 0x0ef9, 0x19be: 0x0f09, 0x19bf: 0x1199, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x0f31, 0x19c1: 0x0249, 0x19c2: 0x0f41, 0x19c3: 0x0259, 0x19c4: 0x0f51, 0x19c5: 0x0359, + 0x19c6: 0x0f61, 0x19c7: 0x0f71, 0x19c8: 0x00d9, 0x19c9: 0x0f99, 0x19ca: 0x2039, 0x19cb: 0x0269, + 0x19cc: 0x01d9, 0x19cd: 0x0fa9, 0x19ce: 0x0fb9, 0x19cf: 0x1089, 0x19d0: 0x0279, 0x19d1: 0x0369, + 0x19d2: 0x0289, 0x19d3: 0x13d1, 0x19d4: 0x0039, 0x19d5: 0x0ee9, 0x19d6: 0x1159, 0x19d7: 0x0ef9, + 0x19d8: 0x0f09, 0x19d9: 0x1199, 0x19da: 0x0f31, 0x19db: 0x0249, 0x19dc: 0x0f41, 0x19dd: 0x0259, + 0x19de: 0x0f51, 0x19df: 0x0359, 0x19e0: 0x0f61, 0x19e1: 0x0f71, 0x19e2: 0x00d9, 0x19e3: 0x0f99, + 0x19e4: 0x2039, 0x19e5: 0x0269, 0x19e6: 0x01d9, 0x19e7: 0x0fa9, 0x19e8: 0x0fb9, 0x19e9: 0x1089, + 0x19ea: 0x0279, 0x19eb: 0x0369, 0x19ec: 0x0289, 0x19ed: 0x13d1, 0x19ee: 0x0039, 0x19ef: 0x0ee9, + 0x19f0: 0x1159, 0x19f1: 0x0ef9, 0x19f2: 0x0f09, 0x19f3: 0x1199, 0x19f4: 0x0f31, 0x19f5: 0x0249, + 0x19f6: 0x0f41, 0x19f7: 0x0259, 0x19f8: 0x0f51, 0x19f9: 0x0359, 0x19fa: 0x0f61, 0x19fb: 0x0f71, + 0x19fc: 0x00d9, 0x19fd: 0x0f99, 0x19fe: 0x2039, 0x19ff: 0x0269, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x01d9, 0x1a01: 0x0fa9, 0x1a02: 0x0fb9, 0x1a03: 0x1089, 0x1a04: 0x0279, 0x1a05: 0x0369, + 0x1a06: 0x0289, 0x1a07: 0x13d1, 0x1a08: 0x0039, 0x1a09: 0x0ee9, 0x1a0a: 0x1159, 0x1a0b: 0x0ef9, + 0x1a0c: 0x0f09, 0x1a0d: 0x1199, 0x1a0e: 0x0f31, 0x1a0f: 0x0249, 0x1a10: 0x0f41, 0x1a11: 0x0259, + 0x1a12: 0x0f51, 0x1a13: 0x0359, 0x1a14: 0x0f61, 0x1a15: 0x0f71, 0x1a16: 0x00d9, 0x1a17: 0x0f99, + 0x1a18: 0x2039, 0x1a19: 0x0269, 0x1a1a: 0x01d9, 0x1a1b: 0x0fa9, 0x1a1c: 0x0fb9, 0x1a1d: 0x1089, + 0x1a1e: 0x0279, 0x1a1f: 0x0369, 0x1a20: 0x0289, 0x1a21: 0x13d1, 0x1a22: 0x0039, 0x1a23: 0x0ee9, + 0x1a24: 0x1159, 0x1a25: 0x0ef9, 0x1a26: 0x0f09, 0x1a27: 0x1199, 0x1a28: 0x0f31, 0x1a29: 0x0249, + 0x1a2a: 0x0f41, 0x1a2b: 0x0259, 0x1a2c: 0x0f51, 0x1a2d: 0x0359, 0x1a2e: 0x0f61, 0x1a2f: 0x0f71, + 0x1a30: 0x00d9, 0x1a31: 0x0f99, 0x1a32: 0x2039, 0x1a33: 0x0269, 0x1a34: 0x01d9, 0x1a35: 0x0fa9, + 0x1a36: 0x0fb9, 0x1a37: 0x1089, 0x1a38: 0x0279, 0x1a39: 0x0369, 0x1a3a: 0x0289, 0x1a3b: 0x13d1, + 0x1a3c: 0x0039, 0x1a3d: 0x0ee9, 0x1a3e: 0x1159, 0x1a3f: 0x0ef9, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x0f09, 0x1a41: 0x1199, 0x1a42: 0x0f31, 0x1a43: 0x0249, 0x1a44: 0x0f41, 0x1a45: 0x0259, + 0x1a46: 0x0f51, 0x1a47: 0x0359, 0x1a48: 0x0f61, 0x1a49: 0x0f71, 0x1a4a: 0x00d9, 0x1a4b: 0x0f99, + 0x1a4c: 0x2039, 0x1a4d: 0x0269, 0x1a4e: 0x01d9, 0x1a4f: 0x0fa9, 0x1a50: 0x0fb9, 0x1a51: 0x1089, + 0x1a52: 0x0279, 0x1a53: 0x0369, 0x1a54: 0x0289, 0x1a55: 0x13d1, 0x1a56: 0x0039, 0x1a57: 0x0ee9, + 0x1a58: 0x1159, 0x1a59: 0x0ef9, 0x1a5a: 0x0f09, 0x1a5b: 0x1199, 0x1a5c: 0x0f31, 0x1a5d: 0x0249, + 0x1a5e: 0x0f41, 0x1a5f: 0x0259, 0x1a60: 0x0f51, 0x1a61: 0x0359, 0x1a62: 0x0f61, 0x1a63: 0x0f71, + 0x1a64: 0x00d9, 0x1a65: 0x0f99, 0x1a66: 0x2039, 0x1a67: 0x0269, 0x1a68: 0x01d9, 0x1a69: 0x0fa9, + 0x1a6a: 0x0fb9, 0x1a6b: 0x1089, 0x1a6c: 0x0279, 0x1a6d: 0x0369, 0x1a6e: 0x0289, 0x1a6f: 0x13d1, + 0x1a70: 0x0039, 0x1a71: 0x0ee9, 0x1a72: 0x1159, 0x1a73: 0x0ef9, 0x1a74: 0x0f09, 0x1a75: 0x1199, + 0x1a76: 0x0f31, 0x1a77: 0x0249, 0x1a78: 0x0f41, 0x1a79: 0x0259, 0x1a7a: 0x0f51, 0x1a7b: 0x0359, + 0x1a7c: 0x0f61, 0x1a7d: 0x0f71, 0x1a7e: 0x00d9, 0x1a7f: 0x0f99, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x2039, 0x1a81: 0x0269, 0x1a82: 0x01d9, 0x1a83: 0x0fa9, 0x1a84: 0x0fb9, 0x1a85: 0x1089, + 0x1a86: 0x0279, 0x1a87: 0x0369, 0x1a88: 0x0289, 0x1a89: 0x13d1, 0x1a8a: 0x0039, 0x1a8b: 0x0ee9, + 0x1a8c: 0x1159, 0x1a8d: 0x0ef9, 0x1a8e: 0x0f09, 0x1a8f: 0x1199, 0x1a90: 0x0f31, 0x1a91: 0x0249, + 0x1a92: 0x0f41, 0x1a93: 0x0259, 0x1a94: 0x0f51, 0x1a95: 0x0359, 0x1a96: 0x0f61, 0x1a97: 0x0f71, + 0x1a98: 0x00d9, 0x1a99: 0x0f99, 0x1a9a: 0x2039, 0x1a9b: 0x0269, 0x1a9c: 0x01d9, 0x1a9d: 0x0fa9, + 0x1a9e: 0x0fb9, 0x1a9f: 0x1089, 0x1aa0: 0x0279, 0x1aa1: 0x0369, 0x1aa2: 0x0289, 0x1aa3: 0x13d1, + 0x1aa4: 0xba81, 0x1aa5: 0xba99, 0x1aa6: 0x0040, 0x1aa7: 0x0040, 0x1aa8: 0xbab1, 0x1aa9: 0x1099, + 0x1aaa: 0x10b1, 0x1aab: 0x10c9, 0x1aac: 0xbac9, 0x1aad: 0xbae1, 0x1aae: 0xbaf9, 0x1aaf: 0x1429, + 0x1ab0: 0x1a31, 0x1ab1: 0xbb11, 0x1ab2: 0xbb29, 0x1ab3: 0xbb41, 0x1ab4: 0xbb59, 0x1ab5: 0xbb71, + 0x1ab6: 0xbb89, 0x1ab7: 0x2109, 0x1ab8: 0x1111, 0x1ab9: 0x1429, 0x1aba: 0xbba1, 0x1abb: 0xbbb9, + 0x1abc: 0xbbd1, 0x1abd: 0x10e1, 0x1abe: 0x10f9, 0x1abf: 0xbbe9, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x2079, 0x1ac1: 0xbc01, 0x1ac2: 0xbab1, 0x1ac3: 0x1099, 0x1ac4: 0x10b1, 0x1ac5: 0x10c9, + 0x1ac6: 0xbac9, 0x1ac7: 0xbae1, 0x1ac8: 0xbaf9, 0x1ac9: 0x1429, 0x1aca: 0x1a31, 0x1acb: 0xbb11, + 0x1acc: 0xbb29, 0x1acd: 0xbb41, 0x1ace: 0xbb59, 0x1acf: 0xbb71, 0x1ad0: 0xbb89, 0x1ad1: 0x2109, + 0x1ad2: 0x1111, 0x1ad3: 0xbba1, 0x1ad4: 0xbba1, 0x1ad5: 0xbbb9, 0x1ad6: 0xbbd1, 0x1ad7: 0x10e1, + 0x1ad8: 0x10f9, 0x1ad9: 0xbbe9, 0x1ada: 0x2079, 0x1adb: 0xbc21, 0x1adc: 0xbac9, 0x1add: 0x1429, + 0x1ade: 0xbb11, 0x1adf: 0x10e1, 0x1ae0: 0x1111, 0x1ae1: 0x2109, 0x1ae2: 0xbab1, 0x1ae3: 0x1099, + 0x1ae4: 0x10b1, 0x1ae5: 0x10c9, 0x1ae6: 0xbac9, 0x1ae7: 0xbae1, 0x1ae8: 0xbaf9, 0x1ae9: 0x1429, + 0x1aea: 0x1a31, 0x1aeb: 0xbb11, 0x1aec: 0xbb29, 0x1aed: 0xbb41, 0x1aee: 0xbb59, 0x1aef: 0xbb71, + 0x1af0: 0xbb89, 0x1af1: 0x2109, 0x1af2: 0x1111, 0x1af3: 0x1429, 0x1af4: 0xbba1, 0x1af5: 0xbbb9, + 0x1af6: 0xbbd1, 0x1af7: 0x10e1, 0x1af8: 0x10f9, 0x1af9: 0xbbe9, 0x1afa: 0x2079, 0x1afb: 0xbc01, + 0x1afc: 0xbab1, 0x1afd: 0x1099, 0x1afe: 0x10b1, 0x1aff: 0x10c9, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0xbac9, 0x1b01: 0xbae1, 0x1b02: 0xbaf9, 0x1b03: 0x1429, 0x1b04: 0x1a31, 0x1b05: 0xbb11, + 0x1b06: 0xbb29, 0x1b07: 0xbb41, 0x1b08: 0xbb59, 0x1b09: 0xbb71, 0x1b0a: 0xbb89, 0x1b0b: 0x2109, + 0x1b0c: 0x1111, 0x1b0d: 0xbba1, 0x1b0e: 0xbba1, 0x1b0f: 0xbbb9, 0x1b10: 0xbbd1, 0x1b11: 0x10e1, + 0x1b12: 0x10f9, 0x1b13: 0xbbe9, 0x1b14: 0x2079, 0x1b15: 0xbc21, 0x1b16: 0xbac9, 0x1b17: 0x1429, + 0x1b18: 0xbb11, 0x1b19: 0x10e1, 0x1b1a: 0x1111, 0x1b1b: 0x2109, 0x1b1c: 0xbab1, 0x1b1d: 0x1099, + 0x1b1e: 0x10b1, 0x1b1f: 0x10c9, 0x1b20: 0xbac9, 0x1b21: 0xbae1, 0x1b22: 0xbaf9, 0x1b23: 0x1429, + 0x1b24: 0x1a31, 0x1b25: 0xbb11, 0x1b26: 0xbb29, 0x1b27: 0xbb41, 0x1b28: 0xbb59, 0x1b29: 0xbb71, + 0x1b2a: 0xbb89, 0x1b2b: 0x2109, 0x1b2c: 0x1111, 0x1b2d: 0x1429, 0x1b2e: 0xbba1, 0x1b2f: 0xbbb9, + 0x1b30: 0xbbd1, 0x1b31: 0x10e1, 0x1b32: 0x10f9, 0x1b33: 0xbbe9, 0x1b34: 0x2079, 0x1b35: 0xbc01, + 0x1b36: 0xbab1, 0x1b37: 0x1099, 0x1b38: 0x10b1, 0x1b39: 0x10c9, 0x1b3a: 0xbac9, 0x1b3b: 0xbae1, + 0x1b3c: 0xbaf9, 0x1b3d: 0x1429, 0x1b3e: 0x1a31, 0x1b3f: 0xbb11, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0xbb29, 0x1b41: 0xbb41, 0x1b42: 0xbb59, 0x1b43: 0xbb71, 0x1b44: 0xbb89, 0x1b45: 0x2109, + 0x1b46: 0x1111, 0x1b47: 0xbba1, 0x1b48: 0xbba1, 0x1b49: 0xbbb9, 0x1b4a: 0xbbd1, 0x1b4b: 0x10e1, + 0x1b4c: 0x10f9, 0x1b4d: 0xbbe9, 0x1b4e: 0x2079, 0x1b4f: 0xbc21, 0x1b50: 0xbac9, 0x1b51: 0x1429, + 0x1b52: 0xbb11, 0x1b53: 0x10e1, 0x1b54: 0x1111, 0x1b55: 0x2109, 0x1b56: 0xbab1, 0x1b57: 0x1099, + 0x1b58: 0x10b1, 0x1b59: 0x10c9, 0x1b5a: 0xbac9, 0x1b5b: 0xbae1, 0x1b5c: 0xbaf9, 0x1b5d: 0x1429, + 0x1b5e: 0x1a31, 0x1b5f: 0xbb11, 0x1b60: 0xbb29, 0x1b61: 0xbb41, 0x1b62: 0xbb59, 0x1b63: 0xbb71, + 0x1b64: 0xbb89, 0x1b65: 0x2109, 0x1b66: 0x1111, 0x1b67: 0x1429, 0x1b68: 0xbba1, 0x1b69: 0xbbb9, + 0x1b6a: 0xbbd1, 0x1b6b: 0x10e1, 0x1b6c: 0x10f9, 0x1b6d: 0xbbe9, 0x1b6e: 0x2079, 0x1b6f: 0xbc01, + 0x1b70: 0xbab1, 0x1b71: 0x1099, 0x1b72: 0x10b1, 0x1b73: 0x10c9, 0x1b74: 0xbac9, 0x1b75: 0xbae1, + 0x1b76: 0xbaf9, 0x1b77: 0x1429, 0x1b78: 0x1a31, 0x1b79: 0xbb11, 0x1b7a: 0xbb29, 0x1b7b: 0xbb41, + 0x1b7c: 0xbb59, 0x1b7d: 0xbb71, 0x1b7e: 0xbb89, 0x1b7f: 0x2109, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x1111, 0x1b81: 0xbba1, 0x1b82: 0xbba1, 0x1b83: 0xbbb9, 0x1b84: 0xbbd1, 0x1b85: 0x10e1, + 0x1b86: 0x10f9, 0x1b87: 0xbbe9, 0x1b88: 0x2079, 0x1b89: 0xbc21, 0x1b8a: 0xbac9, 0x1b8b: 0x1429, + 0x1b8c: 0xbb11, 0x1b8d: 0x10e1, 0x1b8e: 0x1111, 0x1b8f: 0x2109, 0x1b90: 0xbab1, 0x1b91: 0x1099, + 0x1b92: 0x10b1, 0x1b93: 0x10c9, 0x1b94: 0xbac9, 0x1b95: 0xbae1, 0x1b96: 0xbaf9, 0x1b97: 0x1429, + 0x1b98: 0x1a31, 0x1b99: 0xbb11, 0x1b9a: 0xbb29, 0x1b9b: 0xbb41, 0x1b9c: 0xbb59, 0x1b9d: 0xbb71, + 0x1b9e: 0xbb89, 0x1b9f: 0x2109, 0x1ba0: 0x1111, 0x1ba1: 0x1429, 0x1ba2: 0xbba1, 0x1ba3: 0xbbb9, + 0x1ba4: 0xbbd1, 0x1ba5: 0x10e1, 0x1ba6: 0x10f9, 0x1ba7: 0xbbe9, 0x1ba8: 0x2079, 0x1ba9: 0xbc01, + 0x1baa: 0xbab1, 0x1bab: 0x1099, 0x1bac: 0x10b1, 0x1bad: 0x10c9, 0x1bae: 0xbac9, 0x1baf: 0xbae1, + 0x1bb0: 0xbaf9, 0x1bb1: 0x1429, 0x1bb2: 0x1a31, 0x1bb3: 0xbb11, 0x1bb4: 0xbb29, 0x1bb5: 0xbb41, + 0x1bb6: 0xbb59, 0x1bb7: 0xbb71, 0x1bb8: 0xbb89, 0x1bb9: 0x2109, 0x1bba: 0x1111, 0x1bbb: 0xbba1, + 0x1bbc: 0xbba1, 0x1bbd: 0xbbb9, 0x1bbe: 0xbbd1, 0x1bbf: 0x10e1, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x10f9, 0x1bc1: 0xbbe9, 0x1bc2: 0x2079, 0x1bc3: 0xbc21, 0x1bc4: 0xbac9, 0x1bc5: 0x1429, + 0x1bc6: 0xbb11, 0x1bc7: 0x10e1, 0x1bc8: 0x1111, 0x1bc9: 0x2109, 0x1bca: 0xbc41, 0x1bcb: 0xbc41, + 0x1bcc: 0x0040, 0x1bcd: 0x0040, 0x1bce: 0x1f41, 0x1bcf: 0x00c9, 0x1bd0: 0x0069, 0x1bd1: 0x0079, + 0x1bd2: 0x1f51, 0x1bd3: 0x1f61, 0x1bd4: 0x1f71, 0x1bd5: 0x1f81, 0x1bd6: 0x1f91, 0x1bd7: 0x1fa1, + 0x1bd8: 0x1f41, 0x1bd9: 0x00c9, 0x1bda: 0x0069, 0x1bdb: 0x0079, 0x1bdc: 0x1f51, 0x1bdd: 0x1f61, + 0x1bde: 0x1f71, 0x1bdf: 0x1f81, 0x1be0: 0x1f91, 0x1be1: 0x1fa1, 0x1be2: 0x1f41, 0x1be3: 0x00c9, + 0x1be4: 0x0069, 0x1be5: 0x0079, 0x1be6: 0x1f51, 0x1be7: 0x1f61, 0x1be8: 0x1f71, 0x1be9: 0x1f81, + 0x1bea: 0x1f91, 0x1beb: 0x1fa1, 0x1bec: 0x1f41, 0x1bed: 0x00c9, 0x1bee: 0x0069, 0x1bef: 0x0079, + 0x1bf0: 0x1f51, 0x1bf1: 0x1f61, 0x1bf2: 0x1f71, 0x1bf3: 0x1f81, 0x1bf4: 0x1f91, 0x1bf5: 0x1fa1, + 0x1bf6: 0x1f41, 0x1bf7: 0x00c9, 0x1bf8: 0x0069, 0x1bf9: 0x0079, 0x1bfa: 0x1f51, 0x1bfb: 0x1f61, + 0x1bfc: 0x1f71, 0x1bfd: 0x1f81, 0x1bfe: 0x1f91, 0x1bff: 0x1fa1, + // Block 0x70, offset 0x1c00 + 0x1c00: 0xe115, 0x1c01: 0xe115, 0x1c02: 0xe135, 0x1c03: 0xe135, 0x1c04: 0xe115, 0x1c05: 0xe115, + 0x1c06: 0xe175, 0x1c07: 0xe175, 0x1c08: 0xe115, 0x1c09: 0xe115, 0x1c0a: 0xe135, 0x1c0b: 0xe135, + 0x1c0c: 0xe115, 0x1c0d: 0xe115, 0x1c0e: 0xe1f5, 0x1c0f: 0xe1f5, 0x1c10: 0xe115, 0x1c11: 0xe115, + 0x1c12: 0xe135, 0x1c13: 0xe135, 0x1c14: 0xe115, 0x1c15: 0xe115, 0x1c16: 0xe175, 0x1c17: 0xe175, + 0x1c18: 0xe115, 0x1c19: 0xe115, 0x1c1a: 0xe135, 0x1c1b: 0xe135, 0x1c1c: 0xe115, 0x1c1d: 0xe115, + 0x1c1e: 0x8b05, 0x1c1f: 0x8b05, 0x1c20: 0x04b5, 0x1c21: 0x04b5, 0x1c22: 0x0a08, 0x1c23: 0x0a08, + 0x1c24: 0x0a08, 0x1c25: 0x0a08, 0x1c26: 0x0a08, 0x1c27: 0x0a08, 0x1c28: 0x0a08, 0x1c29: 0x0a08, + 0x1c2a: 0x0a08, 0x1c2b: 0x0a08, 0x1c2c: 0x0a08, 0x1c2d: 0x0a08, 0x1c2e: 0x0a08, 0x1c2f: 0x0a08, + 0x1c30: 0x0a08, 0x1c31: 0x0a08, 0x1c32: 0x0a08, 0x1c33: 0x0a08, 0x1c34: 0x0a08, 0x1c35: 0x0a08, + 0x1c36: 0x0a08, 0x1c37: 0x0a08, 0x1c38: 0x0a08, 0x1c39: 0x0a08, 0x1c3a: 0x0a08, 0x1c3b: 0x0a08, + 0x1c3c: 0x0a08, 0x1c3d: 0x0a08, 0x1c3e: 0x0a08, 0x1c3f: 0x0a08, + // Block 0x71, offset 0x1c40 + 0x1c40: 0xb189, 0x1c41: 0xb1a1, 0x1c42: 0xb201, 0x1c43: 0xb249, 0x1c44: 0x0040, 0x1c45: 0xb411, + 0x1c46: 0xb291, 0x1c47: 0xb219, 0x1c48: 0xb309, 0x1c49: 0xb429, 0x1c4a: 0xb399, 0x1c4b: 0xb3b1, + 0x1c4c: 0xb3c9, 0x1c4d: 0xb3e1, 0x1c4e: 0xb2a9, 0x1c4f: 0xb339, 0x1c50: 0xb369, 0x1c51: 0xb2d9, + 0x1c52: 0xb381, 0x1c53: 0xb279, 0x1c54: 0xb2c1, 0x1c55: 0xb1d1, 0x1c56: 0xb1e9, 0x1c57: 0xb231, + 0x1c58: 0xb261, 0x1c59: 0xb2f1, 0x1c5a: 0xb321, 0x1c5b: 0xb351, 0x1c5c: 0xbc59, 0x1c5d: 0x7949, + 0x1c5e: 0xbc71, 0x1c5f: 0xbc89, 0x1c60: 0x0040, 0x1c61: 0xb1a1, 0x1c62: 0xb201, 0x1c63: 0x0040, + 0x1c64: 0xb3f9, 0x1c65: 0x0040, 0x1c66: 0x0040, 0x1c67: 0xb219, 0x1c68: 0x0040, 0x1c69: 0xb429, + 0x1c6a: 0xb399, 0x1c6b: 0xb3b1, 0x1c6c: 0xb3c9, 0x1c6d: 0xb3e1, 0x1c6e: 0xb2a9, 0x1c6f: 0xb339, + 0x1c70: 0xb369, 0x1c71: 0xb2d9, 0x1c72: 0xb381, 0x1c73: 0x0040, 0x1c74: 0xb2c1, 0x1c75: 0xb1d1, + 0x1c76: 0xb1e9, 0x1c77: 0xb231, 0x1c78: 0x0040, 0x1c79: 0xb2f1, 0x1c7a: 0x0040, 0x1c7b: 0xb351, + 0x1c7c: 0x0040, 0x1c7d: 0x0040, 0x1c7e: 0x0040, 0x1c7f: 0x0040, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x0040, 0x1c81: 0x0040, 0x1c82: 0xb201, 0x1c83: 0x0040, 0x1c84: 0x0040, 0x1c85: 0x0040, + 0x1c86: 0x0040, 0x1c87: 0xb219, 0x1c88: 0x0040, 0x1c89: 0xb429, 0x1c8a: 0x0040, 0x1c8b: 0xb3b1, + 0x1c8c: 0x0040, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0x0040, 0x1c91: 0xb2d9, + 0x1c92: 0xb381, 0x1c93: 0x0040, 0x1c94: 0xb2c1, 0x1c95: 0x0040, 0x1c96: 0x0040, 0x1c97: 0xb231, + 0x1c98: 0x0040, 0x1c99: 0xb2f1, 0x1c9a: 0x0040, 0x1c9b: 0xb351, 0x1c9c: 0x0040, 0x1c9d: 0x7949, + 0x1c9e: 0x0040, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040, + 0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0xb309, 0x1ca9: 0xb429, + 0x1caa: 0xb399, 0x1cab: 0x0040, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339, + 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1, + 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0xb321, 0x1cbb: 0xb351, + 0x1cbc: 0xbc59, 0x1cbd: 0x0040, 0x1cbe: 0xbc71, 0x1cbf: 0x0040, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0xb189, 0x1cc1: 0xb1a1, 0x1cc2: 0xb201, 0x1cc3: 0xb249, 0x1cc4: 0xb3f9, 0x1cc5: 0xb411, + 0x1cc6: 0xb291, 0x1cc7: 0xb219, 0x1cc8: 0xb309, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1, + 0x1ccc: 0xb3c9, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0xb369, 0x1cd1: 0xb2d9, + 0x1cd2: 0xb381, 0x1cd3: 0xb279, 0x1cd4: 0xb2c1, 0x1cd5: 0xb1d1, 0x1cd6: 0xb1e9, 0x1cd7: 0xb231, + 0x1cd8: 0xb261, 0x1cd9: 0xb2f1, 0x1cda: 0xb321, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x0040, + 0x1cde: 0x0040, 0x1cdf: 0x0040, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0xb249, + 0x1ce4: 0x0040, 0x1ce5: 0xb411, 0x1ce6: 0xb291, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429, + 0x1cea: 0x0040, 0x1ceb: 0xb3b1, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339, + 0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0xb279, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1, + 0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0xb261, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351, + 0x1cfc: 0x0040, 0x1cfd: 0x0040, 0x1cfe: 0x0040, 0x1cff: 0x0040, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x0040, 0x1d01: 0xbca2, 0x1d02: 0xbcba, 0x1d03: 0xbcd2, 0x1d04: 0xbcea, 0x1d05: 0xbd02, + 0x1d06: 0xbd1a, 0x1d07: 0xbd32, 0x1d08: 0xbd4a, 0x1d09: 0xbd62, 0x1d0a: 0xbd7a, 0x1d0b: 0x0018, + 0x1d0c: 0x0018, 0x1d0d: 0x0040, 0x1d0e: 0x0040, 0x1d0f: 0x0040, 0x1d10: 0xbd92, 0x1d11: 0xbdb2, + 0x1d12: 0xbdd2, 0x1d13: 0xbdf2, 0x1d14: 0xbe12, 0x1d15: 0xbe32, 0x1d16: 0xbe52, 0x1d17: 0xbe72, + 0x1d18: 0xbe92, 0x1d19: 0xbeb2, 0x1d1a: 0xbed2, 0x1d1b: 0xbef2, 0x1d1c: 0xbf12, 0x1d1d: 0xbf32, + 0x1d1e: 0xbf52, 0x1d1f: 0xbf72, 0x1d20: 0xbf92, 0x1d21: 0xbfb2, 0x1d22: 0xbfd2, 0x1d23: 0xbff2, + 0x1d24: 0xc012, 0x1d25: 0xc032, 0x1d26: 0xc052, 0x1d27: 0xc072, 0x1d28: 0xc092, 0x1d29: 0xc0b2, + 0x1d2a: 0xc0d1, 0x1d2b: 0x1159, 0x1d2c: 0x0269, 0x1d2d: 0x6671, 0x1d2e: 0xc111, 0x1d2f: 0x0040, + 0x1d30: 0x0039, 0x1d31: 0x0ee9, 0x1d32: 0x1159, 0x1d33: 0x0ef9, 0x1d34: 0x0f09, 0x1d35: 0x1199, + 0x1d36: 0x0f31, 0x1d37: 0x0249, 0x1d38: 0x0f41, 0x1d39: 0x0259, 0x1d3a: 0x0f51, 0x1d3b: 0x0359, + 0x1d3c: 0x0f61, 0x1d3d: 0x0f71, 0x1d3e: 0x00d9, 0x1d3f: 0x0f99, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x2039, 0x1d41: 0x0269, 0x1d42: 0x01d9, 0x1d43: 0x0fa9, 0x1d44: 0x0fb9, 0x1d45: 0x1089, + 0x1d46: 0x0279, 0x1d47: 0x0369, 0x1d48: 0x0289, 0x1d49: 0x13d1, 0x1d4a: 0xc129, 0x1d4b: 0x65b1, + 0x1d4c: 0xc141, 0x1d4d: 0x1441, 0x1d4e: 0xc159, 0x1d4f: 0xc179, 0x1d50: 0x0018, 0x1d51: 0x0018, + 0x1d52: 0x0018, 0x1d53: 0x0018, 0x1d54: 0x0018, 0x1d55: 0x0018, 0x1d56: 0x0018, 0x1d57: 0x0018, + 0x1d58: 0x0018, 0x1d59: 0x0018, 0x1d5a: 0x0018, 0x1d5b: 0x0018, 0x1d5c: 0x0018, 0x1d5d: 0x0018, + 0x1d5e: 0x0018, 0x1d5f: 0x0018, 0x1d60: 0x0018, 0x1d61: 0x0018, 0x1d62: 0x0018, 0x1d63: 0x0018, + 0x1d64: 0x0018, 0x1d65: 0x0018, 0x1d66: 0x0018, 0x1d67: 0x0018, 0x1d68: 0x0018, 0x1d69: 0x0018, + 0x1d6a: 0xc191, 0x1d6b: 0xc1a9, 0x1d6c: 0x0040, 0x1d6d: 0x0040, 0x1d6e: 0x0040, 0x1d6f: 0x0040, + 0x1d70: 0x0018, 0x1d71: 0x0018, 0x1d72: 0x0018, 0x1d73: 0x0018, 0x1d74: 0x0018, 0x1d75: 0x0018, + 0x1d76: 0x0018, 0x1d77: 0x0018, 0x1d78: 0x0018, 0x1d79: 0x0018, 0x1d7a: 0x0018, 0x1d7b: 0x0018, + 0x1d7c: 0x0018, 0x1d7d: 0x0018, 0x1d7e: 0x0018, 0x1d7f: 0x0018, + // Block 0x76, offset 0x1d80 + 0x1d80: 0xc1d9, 0x1d81: 0xc211, 0x1d82: 0xc249, 0x1d83: 0x0040, 0x1d84: 0x0040, 0x1d85: 0x0040, + 0x1d86: 0x0040, 0x1d87: 0x0040, 0x1d88: 0x0040, 0x1d89: 0x0040, 0x1d8a: 0x0040, 0x1d8b: 0x0040, + 0x1d8c: 0x0040, 0x1d8d: 0x0040, 0x1d8e: 0x0040, 0x1d8f: 0x0040, 0x1d90: 0xc269, 0x1d91: 0xc289, + 0x1d92: 0xc2a9, 0x1d93: 0xc2c9, 0x1d94: 0xc2e9, 0x1d95: 0xc309, 0x1d96: 0xc329, 0x1d97: 0xc349, + 0x1d98: 0xc369, 0x1d99: 0xc389, 0x1d9a: 0xc3a9, 0x1d9b: 0xc3c9, 0x1d9c: 0xc3e9, 0x1d9d: 0xc409, + 0x1d9e: 0xc429, 0x1d9f: 0xc449, 0x1da0: 0xc469, 0x1da1: 0xc489, 0x1da2: 0xc4a9, 0x1da3: 0xc4c9, + 0x1da4: 0xc4e9, 0x1da5: 0xc509, 0x1da6: 0xc529, 0x1da7: 0xc549, 0x1da8: 0xc569, 0x1da9: 0xc589, + 0x1daa: 0xc5a9, 0x1dab: 0xc5c9, 0x1dac: 0xc5e9, 0x1dad: 0xc609, 0x1dae: 0xc629, 0x1daf: 0xc649, + 0x1db0: 0xc669, 0x1db1: 0xc689, 0x1db2: 0xc6a9, 0x1db3: 0xc6c9, 0x1db4: 0xc6e9, 0x1db5: 0xc709, + 0x1db6: 0xc729, 0x1db7: 0xc749, 0x1db8: 0xc769, 0x1db9: 0xc789, 0x1dba: 0xc7a9, 0x1dbb: 0xc7c9, + 0x1dbc: 0x0040, 0x1dbd: 0x0040, 0x1dbe: 0x0040, 0x1dbf: 0x0040, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xcaf9, 0x1dc1: 0xcb19, 0x1dc2: 0xcb39, 0x1dc3: 0x8b1d, 0x1dc4: 0xcb59, 0x1dc5: 0xcb79, + 0x1dc6: 0xcb99, 0x1dc7: 0xcbb9, 0x1dc8: 0xcbd9, 0x1dc9: 0xcbf9, 0x1dca: 0xcc19, 0x1dcb: 0xcc39, + 0x1dcc: 0xcc59, 0x1dcd: 0x8b3d, 0x1dce: 0xcc79, 0x1dcf: 0xcc99, 0x1dd0: 0xccb9, 0x1dd1: 0xccd9, + 0x1dd2: 0x8b5d, 0x1dd3: 0xccf9, 0x1dd4: 0xcd19, 0x1dd5: 0xc429, 0x1dd6: 0x8b7d, 0x1dd7: 0xcd39, + 0x1dd8: 0xcd59, 0x1dd9: 0xcd79, 0x1dda: 0xcd99, 0x1ddb: 0xcdb9, 0x1ddc: 0x8b9d, 0x1ddd: 0xcdd9, + 0x1dde: 0xcdf9, 0x1ddf: 0xce19, 0x1de0: 0xce39, 0x1de1: 0xce59, 0x1de2: 0xc789, 0x1de3: 0xce79, + 0x1de4: 0xce99, 0x1de5: 0xceb9, 0x1de6: 0xced9, 0x1de7: 0xcef9, 0x1de8: 0xcf19, 0x1de9: 0xcf39, + 0x1dea: 0xcf59, 0x1deb: 0xcf79, 0x1dec: 0xcf99, 0x1ded: 0xcfb9, 0x1dee: 0xcfd9, 0x1def: 0xcff9, + 0x1df0: 0xd019, 0x1df1: 0xd039, 0x1df2: 0xd039, 0x1df3: 0xd039, 0x1df4: 0x8bbd, 0x1df5: 0xd059, + 0x1df6: 0xd079, 0x1df7: 0xd099, 0x1df8: 0x8bdd, 0x1df9: 0xd0b9, 0x1dfa: 0xd0d9, 0x1dfb: 0xd0f9, + 0x1dfc: 0xd119, 0x1dfd: 0xd139, 0x1dfe: 0xd159, 0x1dff: 0xd179, + // Block 0x78, offset 0x1e00 + 0x1e00: 0xd199, 0x1e01: 0xd1b9, 0x1e02: 0xd1d9, 0x1e03: 0xd1f9, 0x1e04: 0xd219, 0x1e05: 0xd239, + 0x1e06: 0xd239, 0x1e07: 0xd259, 0x1e08: 0xd279, 0x1e09: 0xd299, 0x1e0a: 0xd2b9, 0x1e0b: 0xd2d9, + 0x1e0c: 0xd2f9, 0x1e0d: 0xd319, 0x1e0e: 0xd339, 0x1e0f: 0xd359, 0x1e10: 0xd379, 0x1e11: 0xd399, + 0x1e12: 0xd3b9, 0x1e13: 0xd3d9, 0x1e14: 0xd3f9, 0x1e15: 0xd419, 0x1e16: 0xd439, 0x1e17: 0xd459, + 0x1e18: 0xd479, 0x1e19: 0x8bfd, 0x1e1a: 0xd499, 0x1e1b: 0xd4b9, 0x1e1c: 0xd4d9, 0x1e1d: 0xc309, + 0x1e1e: 0xd4f9, 0x1e1f: 0xd519, 0x1e20: 0x8c1d, 0x1e21: 0x8c3d, 0x1e22: 0xd539, 0x1e23: 0xd559, + 0x1e24: 0xd579, 0x1e25: 0xd599, 0x1e26: 0xd5b9, 0x1e27: 0xd5d9, 0x1e28: 0x2040, 0x1e29: 0xd5f9, + 0x1e2a: 0xd619, 0x1e2b: 0xd619, 0x1e2c: 0x8c5d, 0x1e2d: 0xd639, 0x1e2e: 0xd659, 0x1e2f: 0xd679, + 0x1e30: 0xd699, 0x1e31: 0x8c7d, 0x1e32: 0xd6b9, 0x1e33: 0xd6d9, 0x1e34: 0x2040, 0x1e35: 0xd6f9, + 0x1e36: 0xd719, 0x1e37: 0xd739, 0x1e38: 0xd759, 0x1e39: 0xd779, 0x1e3a: 0xd799, 0x1e3b: 0x8c9d, + 0x1e3c: 0xd7b9, 0x1e3d: 0x8cbd, 0x1e3e: 0xd7d9, 0x1e3f: 0xd7f9, + // Block 0x79, offset 0x1e40 + 0x1e40: 0xd819, 0x1e41: 0xd839, 0x1e42: 0xd859, 0x1e43: 0xd879, 0x1e44: 0xd899, 0x1e45: 0xd8b9, + 0x1e46: 0xd8d9, 0x1e47: 0xd8f9, 0x1e48: 0xd919, 0x1e49: 0x8cdd, 0x1e4a: 0xd939, 0x1e4b: 0xd959, + 0x1e4c: 0xd979, 0x1e4d: 0xd999, 0x1e4e: 0xd9b9, 0x1e4f: 0x8cfd, 0x1e50: 0xd9d9, 0x1e51: 0x8d1d, + 0x1e52: 0x8d3d, 0x1e53: 0xd9f9, 0x1e54: 0xda19, 0x1e55: 0xda19, 0x1e56: 0xda39, 0x1e57: 0x8d5d, + 0x1e58: 0x8d7d, 0x1e59: 0xda59, 0x1e5a: 0xda79, 0x1e5b: 0xda99, 0x1e5c: 0xdab9, 0x1e5d: 0xdad9, + 0x1e5e: 0xdaf9, 0x1e5f: 0xdb19, 0x1e60: 0xdb39, 0x1e61: 0xdb59, 0x1e62: 0xdb79, 0x1e63: 0xdb99, + 0x1e64: 0x8d9d, 0x1e65: 0xdbb9, 0x1e66: 0xdbd9, 0x1e67: 0xdbf9, 0x1e68: 0xdc19, 0x1e69: 0xdbf9, + 0x1e6a: 0xdc39, 0x1e6b: 0xdc59, 0x1e6c: 0xdc79, 0x1e6d: 0xdc99, 0x1e6e: 0xdcb9, 0x1e6f: 0xdcd9, + 0x1e70: 0xdcf9, 0x1e71: 0xdd19, 0x1e72: 0xdd39, 0x1e73: 0xdd59, 0x1e74: 0xdd79, 0x1e75: 0xdd99, + 0x1e76: 0xddb9, 0x1e77: 0xddd9, 0x1e78: 0x8dbd, 0x1e79: 0xddf9, 0x1e7a: 0xde19, 0x1e7b: 0xde39, + 0x1e7c: 0xde59, 0x1e7d: 0xde79, 0x1e7e: 0x8ddd, 0x1e7f: 0xde99, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0xe599, 0x1e81: 0xe5b9, 0x1e82: 0xe5d9, 0x1e83: 0xe5f9, 0x1e84: 0xe619, 0x1e85: 0xe639, + 0x1e86: 0x8efd, 0x1e87: 0xe659, 0x1e88: 0xe679, 0x1e89: 0xe699, 0x1e8a: 0xe6b9, 0x1e8b: 0xe6d9, + 0x1e8c: 0xe6f9, 0x1e8d: 0x8f1d, 0x1e8e: 0xe719, 0x1e8f: 0xe739, 0x1e90: 0x8f3d, 0x1e91: 0x8f5d, + 0x1e92: 0xe759, 0x1e93: 0xe779, 0x1e94: 0xe799, 0x1e95: 0xe7b9, 0x1e96: 0xe7d9, 0x1e97: 0xe7f9, + 0x1e98: 0xe819, 0x1e99: 0xe839, 0x1e9a: 0xe859, 0x1e9b: 0x8f7d, 0x1e9c: 0xe879, 0x1e9d: 0x8f9d, + 0x1e9e: 0xe899, 0x1e9f: 0x2040, 0x1ea0: 0xe8b9, 0x1ea1: 0xe8d9, 0x1ea2: 0xe8f9, 0x1ea3: 0x8fbd, + 0x1ea4: 0xe919, 0x1ea5: 0xe939, 0x1ea6: 0x8fdd, 0x1ea7: 0x8ffd, 0x1ea8: 0xe959, 0x1ea9: 0xe979, + 0x1eaa: 0xe999, 0x1eab: 0xe9b9, 0x1eac: 0xe9d9, 0x1ead: 0xe9d9, 0x1eae: 0xe9f9, 0x1eaf: 0xea19, + 0x1eb0: 0xea39, 0x1eb1: 0xea59, 0x1eb2: 0xea79, 0x1eb3: 0xea99, 0x1eb4: 0xeab9, 0x1eb5: 0x901d, + 0x1eb6: 0xead9, 0x1eb7: 0x903d, 0x1eb8: 0xeaf9, 0x1eb9: 0x905d, 0x1eba: 0xeb19, 0x1ebb: 0x907d, + 0x1ebc: 0x909d, 0x1ebd: 0x90bd, 0x1ebe: 0xeb39, 0x1ebf: 0xeb59, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0xeb79, 0x1ec1: 0x90dd, 0x1ec2: 0x90fd, 0x1ec3: 0x911d, 0x1ec4: 0x913d, 0x1ec5: 0xeb99, + 0x1ec6: 0xebb9, 0x1ec7: 0xebb9, 0x1ec8: 0xebd9, 0x1ec9: 0xebf9, 0x1eca: 0xec19, 0x1ecb: 0xec39, + 0x1ecc: 0xec59, 0x1ecd: 0x915d, 0x1ece: 0xec79, 0x1ecf: 0xec99, 0x1ed0: 0xecb9, 0x1ed1: 0xecd9, + 0x1ed2: 0x917d, 0x1ed3: 0xecf9, 0x1ed4: 0x919d, 0x1ed5: 0x91bd, 0x1ed6: 0xed19, 0x1ed7: 0xed39, + 0x1ed8: 0xed59, 0x1ed9: 0xed79, 0x1eda: 0xed99, 0x1edb: 0xedb9, 0x1edc: 0x91dd, 0x1edd: 0x91fd, + 0x1ede: 0x921d, 0x1edf: 0x2040, 0x1ee0: 0xedd9, 0x1ee1: 0x923d, 0x1ee2: 0xedf9, 0x1ee3: 0xee19, + 0x1ee4: 0xee39, 0x1ee5: 0x925d, 0x1ee6: 0xee59, 0x1ee7: 0xee79, 0x1ee8: 0xee99, 0x1ee9: 0xeeb9, + 0x1eea: 0xeed9, 0x1eeb: 0x927d, 0x1eec: 0xeef9, 0x1eed: 0xef19, 0x1eee: 0xef39, 0x1eef: 0xef59, + 0x1ef0: 0xef79, 0x1ef1: 0xef99, 0x1ef2: 0x929d, 0x1ef3: 0x92bd, 0x1ef4: 0xefb9, 0x1ef5: 0x92dd, + 0x1ef6: 0xefd9, 0x1ef7: 0x92fd, 0x1ef8: 0xeff9, 0x1ef9: 0xf019, 0x1efa: 0xf039, 0x1efb: 0x931d, + 0x1efc: 0x933d, 0x1efd: 0xf059, 0x1efe: 0x935d, 0x1eff: 0xf079, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0xf6b9, 0x1f01: 0xf6d9, 0x1f02: 0xf6f9, 0x1f03: 0xf719, 0x1f04: 0xf739, 0x1f05: 0x951d, + 0x1f06: 0xf759, 0x1f07: 0xf779, 0x1f08: 0xf799, 0x1f09: 0xf7b9, 0x1f0a: 0xf7d9, 0x1f0b: 0x953d, + 0x1f0c: 0x955d, 0x1f0d: 0xf7f9, 0x1f0e: 0xf819, 0x1f0f: 0xf839, 0x1f10: 0xf859, 0x1f11: 0xf879, + 0x1f12: 0xf899, 0x1f13: 0x957d, 0x1f14: 0xf8b9, 0x1f15: 0xf8d9, 0x1f16: 0xf8f9, 0x1f17: 0xf919, + 0x1f18: 0x959d, 0x1f19: 0x95bd, 0x1f1a: 0xf939, 0x1f1b: 0xf959, 0x1f1c: 0xf979, 0x1f1d: 0x95dd, + 0x1f1e: 0xf999, 0x1f1f: 0xf9b9, 0x1f20: 0x6815, 0x1f21: 0x95fd, 0x1f22: 0xf9d9, 0x1f23: 0xf9f9, + 0x1f24: 0xfa19, 0x1f25: 0x961d, 0x1f26: 0xfa39, 0x1f27: 0xfa59, 0x1f28: 0xfa79, 0x1f29: 0xfa99, + 0x1f2a: 0xfab9, 0x1f2b: 0xfad9, 0x1f2c: 0xfaf9, 0x1f2d: 0x963d, 0x1f2e: 0xfb19, 0x1f2f: 0xfb39, + 0x1f30: 0xfb59, 0x1f31: 0x965d, 0x1f32: 0xfb79, 0x1f33: 0xfb99, 0x1f34: 0xfbb9, 0x1f35: 0xfbd9, + 0x1f36: 0x7b35, 0x1f37: 0x967d, 0x1f38: 0xfbf9, 0x1f39: 0xfc19, 0x1f3a: 0xfc39, 0x1f3b: 0x969d, + 0x1f3c: 0xfc59, 0x1f3d: 0x96bd, 0x1f3e: 0xfc79, 0x1f3f: 0xfc79, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0xfc99, 0x1f41: 0x96dd, 0x1f42: 0xfcb9, 0x1f43: 0xfcd9, 0x1f44: 0xfcf9, 0x1f45: 0xfd19, + 0x1f46: 0xfd39, 0x1f47: 0xfd59, 0x1f48: 0xfd79, 0x1f49: 0x96fd, 0x1f4a: 0xfd99, 0x1f4b: 0xfdb9, + 0x1f4c: 0xfdd9, 0x1f4d: 0xfdf9, 0x1f4e: 0xfe19, 0x1f4f: 0xfe39, 0x1f50: 0x971d, 0x1f51: 0xfe59, + 0x1f52: 0x973d, 0x1f53: 0x975d, 0x1f54: 0x977d, 0x1f55: 0xfe79, 0x1f56: 0xfe99, 0x1f57: 0xfeb9, + 0x1f58: 0xfed9, 0x1f59: 0xfef9, 0x1f5a: 0xff19, 0x1f5b: 0xff39, 0x1f5c: 0xff59, 0x1f5d: 0x979d, + 0x1f5e: 0x0040, 0x1f5f: 0x0040, 0x1f60: 0x0040, 0x1f61: 0x0040, 0x1f62: 0x0040, 0x1f63: 0x0040, + 0x1f64: 0x0040, 0x1f65: 0x0040, 0x1f66: 0x0040, 0x1f67: 0x0040, 0x1f68: 0x0040, 0x1f69: 0x0040, + 0x1f6a: 0x0040, 0x1f6b: 0x0040, 0x1f6c: 0x0040, 0x1f6d: 0x0040, 0x1f6e: 0x0040, 0x1f6f: 0x0040, + 0x1f70: 0x0040, 0x1f71: 0x0040, 0x1f72: 0x0040, 0x1f73: 0x0040, 0x1f74: 0x0040, 0x1f75: 0x0040, + 0x1f76: 0x0040, 0x1f77: 0x0040, 0x1f78: 0x0040, 0x1f79: 0x0040, 0x1f7a: 0x0040, 0x1f7b: 0x0040, + 0x1f7c: 0x0040, 0x1f7d: 0x0040, 0x1f7e: 0x0040, 0x1f7f: 0x0040, +} + +// idnaIndex: 35 blocks, 2240 entries, 4480 bytes +// Block 0 is the zero block. +var idnaIndex = [2240]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x7c, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, + 0xc8: 0x06, 0xc9: 0x7d, 0xca: 0x7e, 0xcb: 0x07, 0xcc: 0x7f, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, + 0xd0: 0x80, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x81, 0xd6: 0x82, 0xd7: 0x83, + 0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x84, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x85, 0xde: 0x86, 0xdf: 0x87, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, + 0xf0: 0x1c, 0xf1: 0x1d, 0xf2: 0x1d, 0xf3: 0x1f, 0xf4: 0x20, + // Block 0x4, offset 0x100 + 0x120: 0x88, 0x121: 0x89, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x13, 0x126: 0x14, 0x127: 0x15, + 0x128: 0x16, 0x129: 0x17, 0x12a: 0x18, 0x12b: 0x19, 0x12c: 0x1a, 0x12d: 0x1b, 0x12e: 0x1c, 0x12f: 0x8d, + 0x130: 0x8e, 0x131: 0x1d, 0x132: 0x1e, 0x133: 0x1f, 0x134: 0x8f, 0x135: 0x20, 0x136: 0x90, 0x137: 0x91, + 0x138: 0x92, 0x139: 0x93, 0x13a: 0x21, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x22, 0x13e: 0x23, 0x13f: 0x96, + // Block 0x5, offset 0x140 + 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e, + 0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6, + 0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f, + 0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae, + 0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6, + 0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe, + 0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x24, 0x175: 0x25, 0x176: 0x26, 0x177: 0xc3, + 0x178: 0x27, 0x179: 0x27, 0x17a: 0x28, 0x17b: 0x27, 0x17c: 0xc4, 0x17d: 0x29, 0x17e: 0x2a, 0x17f: 0x2b, + // Block 0x6, offset 0x180 + 0x180: 0x2c, 0x181: 0x2d, 0x182: 0x2e, 0x183: 0xc5, 0x184: 0x2f, 0x185: 0x30, 0x186: 0xc6, 0x187: 0x9b, + 0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0xca, + 0x190: 0xcb, 0x191: 0x31, 0x192: 0x32, 0x193: 0x33, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b, + 0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b, + 0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b, + 0x1a8: 0xcc, 0x1a9: 0xcd, 0x1aa: 0x9b, 0x1ab: 0xce, 0x1ac: 0x9b, 0x1ad: 0xcf, 0x1ae: 0xd0, 0x1af: 0xd1, + 0x1b0: 0xd2, 0x1b1: 0x34, 0x1b2: 0x27, 0x1b3: 0x35, 0x1b4: 0xd3, 0x1b5: 0xd4, 0x1b6: 0xd5, 0x1b7: 0xd6, + 0x1b8: 0xd7, 0x1b9: 0xd8, 0x1ba: 0xd9, 0x1bb: 0xda, 0x1bc: 0xdb, 0x1bd: 0xdc, 0x1be: 0xdd, 0x1bf: 0x36, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x37, 0x1c1: 0xde, 0x1c2: 0xdf, 0x1c3: 0xe0, 0x1c4: 0xe1, 0x1c5: 0x38, 0x1c6: 0x39, 0x1c7: 0xe2, + 0x1c8: 0xe3, 0x1c9: 0x3a, 0x1ca: 0x3b, 0x1cb: 0x3c, 0x1cc: 0x3d, 0x1cd: 0x3e, 0x1ce: 0x3f, 0x1cf: 0x40, + 0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f, + 0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f, + 0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f, + 0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f, + 0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f, + 0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f, + // Block 0x8, offset 0x200 + 0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f, + 0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f, + 0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f, + 0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f, + 0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f, + 0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f, + 0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b, + 0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f, + // Block 0x9, offset 0x240 + 0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f, + 0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f, + 0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f, + 0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f, + 0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f, + 0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f, + 0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f, + 0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f, + // Block 0xa, offset 0x280 + 0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f, + 0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f, + 0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f, + 0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f, + 0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f, + 0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f, + 0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f, + 0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe4, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f, + 0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f, + 0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe5, 0x2d3: 0xe6, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f, + 0x2d8: 0xe7, 0x2d9: 0x41, 0x2da: 0x42, 0x2db: 0xe8, 0x2dc: 0x43, 0x2dd: 0x44, 0x2de: 0x45, 0x2df: 0xe9, + 0x2e0: 0xea, 0x2e1: 0xeb, 0x2e2: 0xec, 0x2e3: 0xed, 0x2e4: 0xee, 0x2e5: 0xef, 0x2e6: 0xf0, 0x2e7: 0xf1, + 0x2e8: 0xf2, 0x2e9: 0xf3, 0x2ea: 0xf4, 0x2eb: 0xf5, 0x2ec: 0xf6, 0x2ed: 0xf7, 0x2ee: 0xf8, 0x2ef: 0xf9, + 0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f, + 0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f, + // Block 0xc, offset 0x300 + 0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f, + 0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f, + 0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f, + 0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xfa, 0x31f: 0xfb, + // Block 0xd, offset 0x340 + 0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba, + 0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba, + 0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba, + 0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba, + 0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba, + 0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba, + 0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba, + 0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba, + // Block 0xe, offset 0x380 + 0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba, + 0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba, + 0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba, + 0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba, + 0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfc, 0x3a5: 0xfd, 0x3a6: 0xfe, 0x3a7: 0xff, + 0x3a8: 0x46, 0x3a9: 0x100, 0x3aa: 0x101, 0x3ab: 0x47, 0x3ac: 0x48, 0x3ad: 0x49, 0x3ae: 0x4a, 0x3af: 0x4b, + 0x3b0: 0x102, 0x3b1: 0x4c, 0x3b2: 0x4d, 0x3b3: 0x4e, 0x3b4: 0x4f, 0x3b5: 0x50, 0x3b6: 0x103, 0x3b7: 0x51, + 0x3b8: 0x52, 0x3b9: 0x53, 0x3ba: 0x54, 0x3bb: 0x55, 0x3bc: 0x56, 0x3bd: 0x57, 0x3be: 0x58, 0x3bf: 0x59, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x104, 0x3c1: 0x105, 0x3c2: 0x9f, 0x3c3: 0x106, 0x3c4: 0x107, 0x3c5: 0x9b, 0x3c6: 0x108, 0x3c7: 0x109, + 0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x10a, 0x3cb: 0x10b, 0x3cc: 0x10c, 0x3cd: 0x10d, 0x3ce: 0x10e, 0x3cf: 0x10f, + 0x3d0: 0x110, 0x3d1: 0x9f, 0x3d2: 0x111, 0x3d3: 0x112, 0x3d4: 0x113, 0x3d5: 0x114, 0x3d6: 0xba, 0x3d7: 0xba, + 0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x115, 0x3dd: 0x116, 0x3de: 0xba, 0x3df: 0xba, + 0x3e0: 0x117, 0x3e1: 0x118, 0x3e2: 0x119, 0x3e3: 0x11a, 0x3e4: 0x11b, 0x3e5: 0xba, 0x3e6: 0x11c, 0x3e7: 0x11d, + 0x3e8: 0x11e, 0x3e9: 0x11f, 0x3ea: 0x120, 0x3eb: 0x5a, 0x3ec: 0x121, 0x3ed: 0x122, 0x3ee: 0x5b, 0x3ef: 0xba, + 0x3f0: 0x123, 0x3f1: 0x124, 0x3f2: 0x125, 0x3f3: 0x126, 0x3f4: 0xba, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba, + 0x3f8: 0xba, 0x3f9: 0x127, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0xba, 0x3fd: 0xba, 0x3fe: 0xba, 0x3ff: 0xba, + // Block 0x10, offset 0x400 + 0x400: 0x128, 0x401: 0x129, 0x402: 0x12a, 0x403: 0x12b, 0x404: 0x12c, 0x405: 0x12d, 0x406: 0x12e, 0x407: 0x12f, + 0x408: 0x130, 0x409: 0xba, 0x40a: 0x131, 0x40b: 0x132, 0x40c: 0x5c, 0x40d: 0x5d, 0x40e: 0xba, 0x40f: 0xba, + 0x410: 0x133, 0x411: 0x134, 0x412: 0x135, 0x413: 0x136, 0x414: 0xba, 0x415: 0xba, 0x416: 0x137, 0x417: 0x138, + 0x418: 0x139, 0x419: 0x13a, 0x41a: 0x13b, 0x41b: 0x13c, 0x41c: 0x13d, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba, + 0x420: 0xba, 0x421: 0xba, 0x422: 0x13e, 0x423: 0x13f, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba, + 0x428: 0xba, 0x429: 0xba, 0x42a: 0xba, 0x42b: 0x140, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba, + 0x430: 0x141, 0x431: 0x142, 0x432: 0x143, 0x433: 0xba, 0x434: 0xba, 0x435: 0xba, 0x436: 0xba, 0x437: 0xba, + 0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0xba, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba, + // Block 0x11, offset 0x440 + 0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f, + 0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x144, 0x44f: 0xba, + 0x450: 0x9b, 0x451: 0x145, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x146, 0x456: 0xba, 0x457: 0xba, + 0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba, + 0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba, + 0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba, + 0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba, + 0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba, + // Block 0x12, offset 0x480 + 0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f, + 0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f, + 0x490: 0x147, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba, + 0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba, + 0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba, + 0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba, + 0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba, + 0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba, + 0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba, + 0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f, + 0x4d8: 0x9f, 0x4d9: 0x148, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba, + 0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba, + 0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba, + 0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba, + 0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba, + // Block 0x14, offset 0x500 + 0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba, + 0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba, + 0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba, + 0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba, + 0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f, + 0x528: 0x140, 0x529: 0x149, 0x52a: 0xba, 0x52b: 0x14a, 0x52c: 0x14b, 0x52d: 0x14c, 0x52e: 0x14d, 0x52f: 0xba, + 0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba, + 0x538: 0xba, 0x539: 0xba, 0x53a: 0xba, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x14e, 0x53e: 0x14f, 0x53f: 0x150, + // Block 0x15, offset 0x540 + 0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f, + 0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f, + 0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f, + 0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x151, + 0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f, + 0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x152, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba, + 0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba, + 0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba, + // Block 0x16, offset 0x580 + 0x580: 0x153, 0x581: 0xba, 0x582: 0xba, 0x583: 0xba, 0x584: 0xba, 0x585: 0xba, 0x586: 0xba, 0x587: 0xba, + 0x588: 0xba, 0x589: 0xba, 0x58a: 0xba, 0x58b: 0xba, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba, + 0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba, + 0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba, + 0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba, + 0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba, + 0x5b0: 0x9f, 0x5b1: 0x154, 0x5b2: 0x155, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba, + 0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x156, 0x5c4: 0x157, 0x5c5: 0x158, 0x5c6: 0x159, 0x5c7: 0x15a, + 0x5c8: 0x9b, 0x5c9: 0x15b, 0x5ca: 0xba, 0x5cb: 0xba, 0x5cc: 0x9b, 0x5cd: 0x15c, 0x5ce: 0xba, 0x5cf: 0xba, + 0x5d0: 0x5e, 0x5d1: 0x5f, 0x5d2: 0x60, 0x5d3: 0x61, 0x5d4: 0x62, 0x5d5: 0x63, 0x5d6: 0x64, 0x5d7: 0x65, + 0x5d8: 0x66, 0x5d9: 0x67, 0x5da: 0x68, 0x5db: 0x69, 0x5dc: 0x6a, 0x5dd: 0x6b, 0x5de: 0x6c, 0x5df: 0x6d, + 0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b, + 0x5e8: 0x15d, 0x5e9: 0x15e, 0x5ea: 0x15f, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba, + 0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba, + 0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba, + // Block 0x18, offset 0x600 + 0x600: 0x160, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba, + 0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba, + 0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba, + 0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba, + 0x620: 0x123, 0x621: 0x123, 0x622: 0x123, 0x623: 0x161, 0x624: 0x6e, 0x625: 0x162, 0x626: 0xba, 0x627: 0xba, + 0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba, + 0x630: 0xba, 0x631: 0xba, 0x632: 0xba, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba, + 0x638: 0x6f, 0x639: 0x70, 0x63a: 0x71, 0x63b: 0x163, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba, + // Block 0x19, offset 0x640 + 0x640: 0x164, 0x641: 0x9b, 0x642: 0x165, 0x643: 0x166, 0x644: 0x72, 0x645: 0x73, 0x646: 0x167, 0x647: 0x168, + 0x648: 0x74, 0x649: 0x169, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b, + 0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b, + 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x16a, 0x65c: 0x9b, 0x65d: 0x16b, 0x65e: 0x9b, 0x65f: 0x16c, + 0x660: 0x16d, 0x661: 0x16e, 0x662: 0x16f, 0x663: 0xba, 0x664: 0x170, 0x665: 0x171, 0x666: 0x172, 0x667: 0x173, + 0x668: 0xba, 0x669: 0xba, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba, + 0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba, + 0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba, + // Block 0x1a, offset 0x680 + 0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f, + 0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f, + 0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f, + 0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x174, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f, + 0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f, + 0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f, + 0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f, + 0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f, + 0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f, + 0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f, + 0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x175, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f, + 0x6e0: 0x176, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f, + 0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f, + 0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f, + 0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f, + // Block 0x1c, offset 0x700 + 0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f, + 0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f, + 0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f, + 0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f, + 0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f, + 0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f, + 0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f, + 0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x177, 0x73b: 0xba, 0x73c: 0xba, 0x73d: 0xba, 0x73e: 0xba, 0x73f: 0xba, + // Block 0x1d, offset 0x740 + 0x740: 0xba, 0x741: 0xba, 0x742: 0xba, 0x743: 0xba, 0x744: 0xba, 0x745: 0xba, 0x746: 0xba, 0x747: 0xba, + 0x748: 0xba, 0x749: 0xba, 0x74a: 0xba, 0x74b: 0xba, 0x74c: 0xba, 0x74d: 0xba, 0x74e: 0xba, 0x74f: 0xba, + 0x750: 0xba, 0x751: 0xba, 0x752: 0xba, 0x753: 0xba, 0x754: 0xba, 0x755: 0xba, 0x756: 0xba, 0x757: 0xba, + 0x758: 0xba, 0x759: 0xba, 0x75a: 0xba, 0x75b: 0xba, 0x75c: 0xba, 0x75d: 0xba, 0x75e: 0xba, 0x75f: 0xba, + 0x760: 0x75, 0x761: 0x76, 0x762: 0x77, 0x763: 0x178, 0x764: 0x78, 0x765: 0x79, 0x766: 0x179, 0x767: 0x7a, + 0x768: 0x7b, 0x769: 0xba, 0x76a: 0xba, 0x76b: 0xba, 0x76c: 0xba, 0x76d: 0xba, 0x76e: 0xba, 0x76f: 0xba, + 0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba, + 0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba, + // Block 0x1e, offset 0x780 + 0x790: 0x0d, 0x791: 0x0e, 0x792: 0x0f, 0x793: 0x10, 0x794: 0x11, 0x795: 0x0b, 0x796: 0x12, 0x797: 0x07, + 0x798: 0x13, 0x799: 0x0b, 0x79a: 0x0b, 0x79b: 0x14, 0x79c: 0x0b, 0x79d: 0x15, 0x79e: 0x16, 0x79f: 0x17, + 0x7a0: 0x07, 0x7a1: 0x07, 0x7a2: 0x07, 0x7a3: 0x07, 0x7a4: 0x07, 0x7a5: 0x07, 0x7a6: 0x07, 0x7a7: 0x07, + 0x7a8: 0x07, 0x7a9: 0x07, 0x7aa: 0x18, 0x7ab: 0x19, 0x7ac: 0x1a, 0x7ad: 0x0b, 0x7ae: 0x0b, 0x7af: 0x1b, + 0x7b0: 0x0b, 0x7b1: 0x0b, 0x7b2: 0x0b, 0x7b3: 0x0b, 0x7b4: 0x0b, 0x7b5: 0x0b, 0x7b6: 0x0b, 0x7b7: 0x0b, + 0x7b8: 0x0b, 0x7b9: 0x0b, 0x7ba: 0x0b, 0x7bb: 0x0b, 0x7bc: 0x0b, 0x7bd: 0x0b, 0x7be: 0x0b, 0x7bf: 0x0b, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0b, 0x7c1: 0x0b, 0x7c2: 0x0b, 0x7c3: 0x0b, 0x7c4: 0x0b, 0x7c5: 0x0b, 0x7c6: 0x0b, 0x7c7: 0x0b, + 0x7c8: 0x0b, 0x7c9: 0x0b, 0x7ca: 0x0b, 0x7cb: 0x0b, 0x7cc: 0x0b, 0x7cd: 0x0b, 0x7ce: 0x0b, 0x7cf: 0x0b, + 0x7d0: 0x0b, 0x7d1: 0x0b, 0x7d2: 0x0b, 0x7d3: 0x0b, 0x7d4: 0x0b, 0x7d5: 0x0b, 0x7d6: 0x0b, 0x7d7: 0x0b, + 0x7d8: 0x0b, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x0b, 0x7dc: 0x0b, 0x7dd: 0x0b, 0x7de: 0x0b, 0x7df: 0x0b, + 0x7e0: 0x0b, 0x7e1: 0x0b, 0x7e2: 0x0b, 0x7e3: 0x0b, 0x7e4: 0x0b, 0x7e5: 0x0b, 0x7e6: 0x0b, 0x7e7: 0x0b, + 0x7e8: 0x0b, 0x7e9: 0x0b, 0x7ea: 0x0b, 0x7eb: 0x0b, 0x7ec: 0x0b, 0x7ed: 0x0b, 0x7ee: 0x0b, 0x7ef: 0x0b, + 0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b, + 0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b, + // Block 0x20, offset 0x800 + 0x800: 0x17a, 0x801: 0x17b, 0x802: 0xba, 0x803: 0xba, 0x804: 0x17c, 0x805: 0x17c, 0x806: 0x17c, 0x807: 0x17d, + 0x808: 0xba, 0x809: 0xba, 0x80a: 0xba, 0x80b: 0xba, 0x80c: 0xba, 0x80d: 0xba, 0x80e: 0xba, 0x80f: 0xba, + 0x810: 0xba, 0x811: 0xba, 0x812: 0xba, 0x813: 0xba, 0x814: 0xba, 0x815: 0xba, 0x816: 0xba, 0x817: 0xba, + 0x818: 0xba, 0x819: 0xba, 0x81a: 0xba, 0x81b: 0xba, 0x81c: 0xba, 0x81d: 0xba, 0x81e: 0xba, 0x81f: 0xba, + 0x820: 0xba, 0x821: 0xba, 0x822: 0xba, 0x823: 0xba, 0x824: 0xba, 0x825: 0xba, 0x826: 0xba, 0x827: 0xba, + 0x828: 0xba, 0x829: 0xba, 0x82a: 0xba, 0x82b: 0xba, 0x82c: 0xba, 0x82d: 0xba, 0x82e: 0xba, 0x82f: 0xba, + 0x830: 0xba, 0x831: 0xba, 0x832: 0xba, 0x833: 0xba, 0x834: 0xba, 0x835: 0xba, 0x836: 0xba, 0x837: 0xba, + 0x838: 0xba, 0x839: 0xba, 0x83a: 0xba, 0x83b: 0xba, 0x83c: 0xba, 0x83d: 0xba, 0x83e: 0xba, 0x83f: 0xba, + // Block 0x21, offset 0x840 + 0x840: 0x0b, 0x841: 0x0b, 0x842: 0x0b, 0x843: 0x0b, 0x844: 0x0b, 0x845: 0x0b, 0x846: 0x0b, 0x847: 0x0b, + 0x848: 0x0b, 0x849: 0x0b, 0x84a: 0x0b, 0x84b: 0x0b, 0x84c: 0x0b, 0x84d: 0x0b, 0x84e: 0x0b, 0x84f: 0x0b, + 0x850: 0x0b, 0x851: 0x0b, 0x852: 0x0b, 0x853: 0x0b, 0x854: 0x0b, 0x855: 0x0b, 0x856: 0x0b, 0x857: 0x0b, + 0x858: 0x0b, 0x859: 0x0b, 0x85a: 0x0b, 0x85b: 0x0b, 0x85c: 0x0b, 0x85d: 0x0b, 0x85e: 0x0b, 0x85f: 0x0b, + 0x860: 0x1e, 0x861: 0x0b, 0x862: 0x0b, 0x863: 0x0b, 0x864: 0x0b, 0x865: 0x0b, 0x866: 0x0b, 0x867: 0x0b, + 0x868: 0x0b, 0x869: 0x0b, 0x86a: 0x0b, 0x86b: 0x0b, 0x86c: 0x0b, 0x86d: 0x0b, 0x86e: 0x0b, 0x86f: 0x0b, + 0x870: 0x0b, 0x871: 0x0b, 0x872: 0x0b, 0x873: 0x0b, 0x874: 0x0b, 0x875: 0x0b, 0x876: 0x0b, 0x877: 0x0b, + 0x878: 0x0b, 0x879: 0x0b, 0x87a: 0x0b, 0x87b: 0x0b, 0x87c: 0x0b, 0x87d: 0x0b, 0x87e: 0x0b, 0x87f: 0x0b, + // Block 0x22, offset 0x880 + 0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b, + 0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b, +} + +// idnaSparseOffset: 258 entries, 516 bytes +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x4f, 0x5e, 0x63, 0x6b, 0x77, 0x85, 0x93, 0x98, 0xa1, 0xb1, 0xbf, 0xcc, 0xd8, 0xe9, 0xf3, 0xfa, 0x107, 0x118, 0x11f, 0x12a, 0x139, 0x147, 0x151, 0x153, 0x158, 0x15b, 0x15e, 0x160, 0x16c, 0x177, 0x17f, 0x185, 0x18b, 0x190, 0x195, 0x198, 0x19c, 0x1a2, 0x1a7, 0x1b3, 0x1bd, 0x1c3, 0x1d4, 0x1de, 0x1e1, 0x1e9, 0x1ec, 0x1f9, 0x201, 0x205, 0x20c, 0x214, 0x224, 0x230, 0x232, 0x23c, 0x248, 0x254, 0x260, 0x268, 0x26d, 0x277, 0x288, 0x28c, 0x297, 0x29b, 0x2a4, 0x2ac, 0x2b2, 0x2b7, 0x2ba, 0x2bd, 0x2c1, 0x2c7, 0x2cb, 0x2cf, 0x2d5, 0x2dc, 0x2e2, 0x2ea, 0x2f1, 0x2fc, 0x306, 0x30a, 0x30d, 0x313, 0x317, 0x319, 0x31c, 0x31e, 0x321, 0x32b, 0x32e, 0x33d, 0x341, 0x346, 0x349, 0x34d, 0x352, 0x357, 0x35d, 0x363, 0x372, 0x378, 0x37c, 0x38b, 0x390, 0x398, 0x3a2, 0x3ad, 0x3b5, 0x3c6, 0x3cf, 0x3df, 0x3ec, 0x3f6, 0x3fb, 0x408, 0x40c, 0x411, 0x413, 0x417, 0x419, 0x41d, 0x426, 0x42c, 0x430, 0x440, 0x44a, 0x44f, 0x452, 0x458, 0x45f, 0x464, 0x468, 0x46e, 0x473, 0x47c, 0x481, 0x487, 0x48e, 0x495, 0x49c, 0x4a0, 0x4a5, 0x4a8, 0x4ad, 0x4b9, 0x4bf, 0x4c4, 0x4cb, 0x4d3, 0x4d8, 0x4dc, 0x4ec, 0x4f3, 0x4f7, 0x4fb, 0x502, 0x504, 0x507, 0x50a, 0x50e, 0x512, 0x518, 0x521, 0x52d, 0x534, 0x53d, 0x545, 0x54c, 0x55a, 0x567, 0x574, 0x57d, 0x581, 0x58f, 0x597, 0x5a2, 0x5ab, 0x5b1, 0x5b9, 0x5c2, 0x5cc, 0x5cf, 0x5db, 0x5de, 0x5e3, 0x5e6, 0x5f0, 0x5f9, 0x605, 0x608, 0x60d, 0x610, 0x613, 0x616, 0x61d, 0x624, 0x628, 0x633, 0x636, 0x63c, 0x641, 0x645, 0x648, 0x64b, 0x64e, 0x653, 0x65d, 0x660, 0x664, 0x673, 0x67f, 0x683, 0x688, 0x68d, 0x691, 0x696, 0x69f, 0x6aa, 0x6b0, 0x6b8, 0x6bc, 0x6c0, 0x6c6, 0x6cc, 0x6d1, 0x6d4, 0x6e2, 0x6e9, 0x6ec, 0x6ef, 0x6f3, 0x6f9, 0x6fe, 0x708, 0x70d, 0x710, 0x713, 0x716, 0x719, 0x71d, 0x720, 0x730, 0x741, 0x746, 0x748, 0x74a} + +// idnaSparseValues: 1869 entries, 7476 bytes +var idnaSparseValues = [1869]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x07}, + {value: 0xe105, lo: 0x80, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0x97}, + {value: 0xe105, lo: 0x98, hi: 0x9e}, + {value: 0x001f, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbf}, + // Block 0x1, offset 0x8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0xe01d, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0335, lo: 0x83, hi: 0x83}, + {value: 0x034d, lo: 0x84, hi: 0x84}, + {value: 0x0365, lo: 0x85, hi: 0x85}, + {value: 0xe00d, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0xe00d, lo: 0x88, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x89}, + {value: 0xe00d, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe00d, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0x8d}, + {value: 0xe00d, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0xbf}, + // Block 0x2, offset 0x19 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0249, lo: 0xb0, hi: 0xb0}, + {value: 0x037d, lo: 0xb1, hi: 0xb1}, + {value: 0x0259, lo: 0xb2, hi: 0xb2}, + {value: 0x0269, lo: 0xb3, hi: 0xb3}, + {value: 0x034d, lo: 0xb4, hi: 0xb4}, + {value: 0x0395, lo: 0xb5, hi: 0xb5}, + {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, + {value: 0x0279, lo: 0xb7, hi: 0xb7}, + {value: 0x0289, lo: 0xb8, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbf}, + // Block 0x3, offset 0x25 + {value: 0x0000, lo: 0x01}, + {value: 0x3308, lo: 0x80, hi: 0xbf}, + // Block 0x4, offset 0x27 + {value: 0x0000, lo: 0x04}, + {value: 0x03f5, lo: 0x80, hi: 0x8f}, + {value: 0xe105, lo: 0x90, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x5, offset 0x2c + {value: 0x0000, lo: 0x07}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x0545, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x0008, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x6, offset 0x34 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0401, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x88}, + {value: 0x0018, lo: 0x89, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x7, offset 0x3f + {value: 0x0000, lo: 0x0b}, + {value: 0x0818, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x82}, + {value: 0x0818, lo: 0x83, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x85}, + {value: 0x0818, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0808, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x8, offset 0x4b + {value: 0x0000, lo: 0x03}, + {value: 0x0a08, lo: 0x80, hi: 0x87}, + {value: 0x0c08, lo: 0x88, hi: 0x99}, + {value: 0x0a08, lo: 0x9a, hi: 0xbf}, + // Block 0x9, offset 0x4f + {value: 0x0000, lo: 0x0e}, + {value: 0x3308, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0c08, lo: 0x8d, hi: 0x8d}, + {value: 0x0a08, lo: 0x8e, hi: 0x98}, + {value: 0x0c08, lo: 0x99, hi: 0x9b}, + {value: 0x0a08, lo: 0x9c, hi: 0xaa}, + {value: 0x0c08, lo: 0xab, hi: 0xac}, + {value: 0x0a08, lo: 0xad, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb1}, + {value: 0x0a08, lo: 0xb2, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb4}, + {value: 0x0a08, lo: 0xb5, hi: 0xb7}, + {value: 0x0c08, lo: 0xb8, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbf}, + // Block 0xa, offset 0x5e + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xb0}, + {value: 0x0808, lo: 0xb1, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xb, offset 0x63 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x89}, + {value: 0x0a08, lo: 0x8a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0xc, offset 0x6b + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x99}, + {value: 0x0808, lo: 0x9a, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa3}, + {value: 0x0808, lo: 0xa4, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa7}, + {value: 0x0808, lo: 0xa8, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0818, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd, offset 0x77 + {value: 0x0000, lo: 0x0d}, + {value: 0x0c08, lo: 0x80, hi: 0x80}, + {value: 0x0a08, lo: 0x81, hi: 0x85}, + {value: 0x0c08, lo: 0x86, hi: 0x87}, + {value: 0x0a08, lo: 0x88, hi: 0x88}, + {value: 0x0c08, lo: 0x89, hi: 0x89}, + {value: 0x0a08, lo: 0x8a, hi: 0x93}, + {value: 0x0c08, lo: 0x94, hi: 0x94}, + {value: 0x0a08, lo: 0x95, hi: 0x95}, + {value: 0x0808, lo: 0x96, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0818, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xe, offset 0x85 + {value: 0x0000, lo: 0x0d}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0a08, lo: 0xa0, hi: 0xa9}, + {value: 0x0c08, lo: 0xaa, hi: 0xac}, + {value: 0x0808, lo: 0xad, hi: 0xad}, + {value: 0x0c08, lo: 0xae, hi: 0xae}, + {value: 0x0a08, lo: 0xaf, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb2}, + {value: 0x0a08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0a08, lo: 0xb6, hi: 0xb8}, + {value: 0x0c08, lo: 0xb9, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0xf, offset 0x93 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0xa1}, + {value: 0x0840, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xbf}, + // Block 0x10, offset 0x98 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x11, offset 0xa1 + {value: 0x0000, lo: 0x0f}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x85}, + {value: 0x3008, lo: 0x86, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8c}, + {value: 0x3b08, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x12, offset 0xb1 + {value: 0x0000, lo: 0x0d}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x13, offset 0xbf + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x14, offset 0xcc + {value: 0x0000, lo: 0x0b}, + {value: 0x0040, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x15, offset 0xd8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x89}, + {value: 0x3b08, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x3008, lo: 0x98, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x16, offset 0xe9 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x08f1, lo: 0xb3, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb9}, + {value: 0x3b08, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x17, offset 0xf3 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0xbf}, + // Block 0x18, offset 0xfa + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0961, lo: 0x9c, hi: 0x9c}, + {value: 0x0999, lo: 0x9d, hi: 0x9d}, + {value: 0x0008, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x19, offset 0x107 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe03d, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x1a, offset 0x118 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0x1b, offset 0x11f + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x1c, offset 0x12a + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x3008, lo: 0xa2, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbf}, + // Block 0x1d, offset 0x139 + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x8c}, + {value: 0x3308, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x3008, lo: 0x9a, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1e, offset 0x147 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x86}, + {value: 0x055d, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8c}, + {value: 0x055d, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0xe105, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0x1f, offset 0x151 + {value: 0x0000, lo: 0x01}, + {value: 0x0018, lo: 0x80, hi: 0xbf}, + // Block 0x20, offset 0x153 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa0}, + {value: 0x2018, lo: 0xa1, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x21, offset 0x158 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa7}, + {value: 0x2018, lo: 0xa8, hi: 0xbf}, + // Block 0x22, offset 0x15b + {value: 0x0000, lo: 0x02}, + {value: 0x2018, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0xbf}, + // Block 0x23, offset 0x15e + {value: 0x0000, lo: 0x01}, + {value: 0x0008, lo: 0x80, hi: 0xbf}, + // Block 0x24, offset 0x160 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x25, offset 0x16c + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x26, offset 0x177 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x27, offset 0x17f + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x28, offset 0x185 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x29, offset 0x18b + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x2a, offset 0x190 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x2b, offset 0x195 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x2c, offset 0x198 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xbf}, + // Block 0x2d, offset 0x19c + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x2e, offset 0x1a2 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x2f, offset 0x1a7 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x3b08, lo: 0x94, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x30, offset 0x1b3 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x31, offset 0x1bd + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xb3}, + {value: 0x3340, lo: 0xb4, hi: 0xb5}, + {value: 0x3008, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x32, offset 0x1c3 + {value: 0x0000, lo: 0x10}, + {value: 0x3008, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x91}, + {value: 0x3b08, lo: 0x92, hi: 0x92}, + {value: 0x3308, lo: 0x93, hi: 0x93}, + {value: 0x0018, lo: 0x94, hi: 0x96}, + {value: 0x0008, lo: 0x97, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x33, offset 0x1d4 + {value: 0x0000, lo: 0x09}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x86}, + {value: 0x0218, lo: 0x87, hi: 0x87}, + {value: 0x0018, lo: 0x88, hi: 0x8a}, + {value: 0x33c0, lo: 0x8b, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xbf}, + // Block 0x34, offset 0x1de + {value: 0x0000, lo: 0x02}, + {value: 0x0208, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x35, offset 0x1e1 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0208, lo: 0x87, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xa9}, + {value: 0x0208, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x36, offset 0x1e9 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x37, offset 0x1ec + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x38, offset 0x1f9 + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x39, offset 0x201 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x3a, offset 0x205 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0028, lo: 0x9a, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xbf}, + // Block 0x3b, offset 0x20c + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x3308, lo: 0x97, hi: 0x98}, + {value: 0x3008, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x3c, offset 0x214 + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x94}, + {value: 0x3008, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3b08, lo: 0xa0, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xac}, + {value: 0x3008, lo: 0xad, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x3d, offset 0x224 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xbd}, + {value: 0x3318, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x3e, offset 0x230 + {value: 0x0000, lo: 0x01}, + {value: 0x0040, lo: 0x80, hi: 0xbf}, + // Block 0x3f, offset 0x232 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3008, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x40, offset 0x23c + {value: 0x0000, lo: 0x0b}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x3808, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x41, offset 0x248 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3808, lo: 0xaa, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xbf}, + // Block 0x42, offset 0x254 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3008, lo: 0xaa, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3808, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbf}, + // Block 0x43, offset 0x260 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x3008, lo: 0xa4, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x44, offset 0x268 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x45, offset 0x26d + {value: 0x0000, lo: 0x09}, + {value: 0x0e29, lo: 0x80, hi: 0x80}, + {value: 0x0e41, lo: 0x81, hi: 0x81}, + {value: 0x0e59, lo: 0x82, hi: 0x82}, + {value: 0x0e71, lo: 0x83, hi: 0x83}, + {value: 0x0e89, lo: 0x84, hi: 0x85}, + {value: 0x0ea1, lo: 0x86, hi: 0x86}, + {value: 0x0eb9, lo: 0x87, hi: 0x87}, + {value: 0x057d, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0x46, offset 0x277 + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x92}, + {value: 0x0018, lo: 0x93, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa8}, + {value: 0x0008, lo: 0xa9, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x47, offset 0x288 + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0x48, offset 0x28c + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x87}, + {value: 0xe045, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0xe045, lo: 0x98, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0xe045, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbf}, + // Block 0x49, offset 0x297 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x3318, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x4a, offset 0x29b + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x24c1, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x4b, offset 0x2a4 + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x24f1, lo: 0xac, hi: 0xac}, + {value: 0x2529, lo: 0xad, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xae}, + {value: 0x2579, lo: 0xaf, hi: 0xaf}, + {value: 0x25b1, lo: 0xb0, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x4c, offset 0x2ac + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x9f}, + {value: 0x0080, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xad}, + {value: 0x0080, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x4d, offset 0x2b2 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xa8}, + {value: 0x09c5, lo: 0xa9, hi: 0xa9}, + {value: 0x09e5, lo: 0xaa, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xbf}, + // Block 0x4e, offset 0x2b7 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x4f, offset 0x2ba + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0x50, offset 0x2bd + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x28c1, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x51, offset 0x2c1 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0e66, lo: 0xb4, hi: 0xb4}, + {value: 0x292a, lo: 0xb5, hi: 0xb5}, + {value: 0x0e86, lo: 0xb6, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x52, offset 0x2c7 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9b}, + {value: 0x2941, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0xbf}, + // Block 0x53, offset 0x2cb + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x54, offset 0x2cf + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0018, lo: 0xbd, hi: 0xbf}, + // Block 0x55, offset 0x2d5 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0xab}, + {value: 0x0018, lo: 0xac, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x56, offset 0x2dc + {value: 0x0000, lo: 0x05}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x03f5, lo: 0x90, hi: 0x9f}, + {value: 0x0ea5, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x57, offset 0x2e2 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x58, offset 0x2ea + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xae}, + {value: 0xe075, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0x59, offset 0x2f1 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x5a, offset 0x2fc + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xbf}, + // Block 0x5b, offset 0x306 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x5c, offset 0x30a + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0xbf}, + // Block 0x5d, offset 0x30d + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9e}, + {value: 0x0edd, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x5e, offset 0x313 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb2}, + {value: 0x0efd, lo: 0xb3, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x5f, offset 0x317 + {value: 0x0020, lo: 0x01}, + {value: 0x0f1d, lo: 0x80, hi: 0xbf}, + // Block 0x60, offset 0x319 + {value: 0x0020, lo: 0x02}, + {value: 0x171d, lo: 0x80, hi: 0x8f}, + {value: 0x18fd, lo: 0x90, hi: 0xbf}, + // Block 0x61, offset 0x31c + {value: 0x0020, lo: 0x01}, + {value: 0x1efd, lo: 0x80, hi: 0xbf}, + // Block 0x62, offset 0x31e + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x63, offset 0x321 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9a}, + {value: 0x29e2, lo: 0x9b, hi: 0x9b}, + {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9e}, + {value: 0x2a31, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x64, offset 0x32b + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x2a69, lo: 0xbf, hi: 0xbf}, + // Block 0x65, offset 0x32e + {value: 0x0000, lo: 0x0e}, + {value: 0x0040, lo: 0x80, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xb0}, + {value: 0x2a1d, lo: 0xb1, hi: 0xb1}, + {value: 0x2a3d, lo: 0xb2, hi: 0xb2}, + {value: 0x2a5d, lo: 0xb3, hi: 0xb3}, + {value: 0x2a7d, lo: 0xb4, hi: 0xb4}, + {value: 0x2a5d, lo: 0xb5, hi: 0xb5}, + {value: 0x2a9d, lo: 0xb6, hi: 0xb6}, + {value: 0x2abd, lo: 0xb7, hi: 0xb7}, + {value: 0x2add, lo: 0xb8, hi: 0xb9}, + {value: 0x2afd, lo: 0xba, hi: 0xbb}, + {value: 0x2b1d, lo: 0xbc, hi: 0xbd}, + {value: 0x2afd, lo: 0xbe, hi: 0xbf}, + // Block 0x66, offset 0x33d + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x67, offset 0x341 + {value: 0x0030, lo: 0x04}, + {value: 0x2aa2, lo: 0x80, hi: 0x9d}, + {value: 0x305a, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x30a2, lo: 0xa0, hi: 0xbf}, + // Block 0x68, offset 0x346 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x69, offset 0x349 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x6a, offset 0x34d + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x6b, offset 0x352 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0x6c, offset 0x357 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb1}, + {value: 0x0018, lo: 0xb2, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6d, offset 0x35d + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xb7}, + {value: 0x2009, lo: 0xb8, hi: 0xb8}, + {value: 0x6e89, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xbf}, + // Block 0x6e, offset 0x363 + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x3308, lo: 0x8b, hi: 0x8b}, + {value: 0x0008, lo: 0x8c, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x6f, offset 0x372 + {value: 0x0000, lo: 0x05}, + {value: 0x0208, lo: 0x80, hi: 0xb1}, + {value: 0x0108, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x70, offset 0x378 + {value: 0x0000, lo: 0x03}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xbf}, + // Block 0x71, offset 0x37c + {value: 0x0000, lo: 0x0e}, + {value: 0x3008, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xba}, + {value: 0x0008, lo: 0xbb, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x72, offset 0x38b + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x73, offset 0x390 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x91}, + {value: 0x3008, lo: 0x92, hi: 0x92}, + {value: 0x3808, lo: 0x93, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x74, offset 0x398 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb9}, + {value: 0x3008, lo: 0xba, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x75, offset 0x3a2 + {value: 0x0000, lo: 0x0a}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x76, offset 0x3ad + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x77, offset 0x3b5 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8c}, + {value: 0x3008, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0x78, offset 0x3c6 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x79, offset 0x3cf + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x9a}, + {value: 0x0008, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3b08, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x7a, offset 0x3df + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x90}, + {value: 0x0008, lo: 0x91, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x7b, offset 0x3ec + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x4465, lo: 0x9c, hi: 0x9c}, + {value: 0x447d, lo: 0x9d, hi: 0x9d}, + {value: 0x2971, lo: 0x9e, hi: 0x9e}, + {value: 0xe06d, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xaf}, + {value: 0x4495, lo: 0xb0, hi: 0xbf}, + // Block 0x7c, offset 0x3f6 + {value: 0x0000, lo: 0x04}, + {value: 0x44b5, lo: 0x80, hi: 0x8f}, + {value: 0x44d5, lo: 0x90, hi: 0x9f}, + {value: 0x44f5, lo: 0xa0, hi: 0xaf}, + {value: 0x44d5, lo: 0xb0, hi: 0xbf}, + // Block 0x7d, offset 0x3fb + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3b08, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x7e, offset 0x408 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x7f, offset 0x40c + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x80, offset 0x411 + {value: 0x0020, lo: 0x01}, + {value: 0x4515, lo: 0x80, hi: 0xbf}, + // Block 0x81, offset 0x413 + {value: 0x0020, lo: 0x03}, + {value: 0x4d15, lo: 0x80, hi: 0x94}, + {value: 0x4ad5, lo: 0x95, hi: 0x95}, + {value: 0x4fb5, lo: 0x96, hi: 0xbf}, + // Block 0x82, offset 0x417 + {value: 0x0020, lo: 0x01}, + {value: 0x54f5, lo: 0x80, hi: 0xbf}, + // Block 0x83, offset 0x419 + {value: 0x0020, lo: 0x03}, + {value: 0x5cf5, lo: 0x80, hi: 0x84}, + {value: 0x5655, lo: 0x85, hi: 0x85}, + {value: 0x5d95, lo: 0x86, hi: 0xbf}, + // Block 0x84, offset 0x41d + {value: 0x0020, lo: 0x08}, + {value: 0x6b55, lo: 0x80, hi: 0x8f}, + {value: 0x6d15, lo: 0x90, hi: 0x90}, + {value: 0x6d55, lo: 0x91, hi: 0xab}, + {value: 0x6ea1, lo: 0xac, hi: 0xac}, + {value: 0x70b5, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x70d5, lo: 0xb0, hi: 0xbf}, + // Block 0x85, offset 0x426 + {value: 0x0020, lo: 0x05}, + {value: 0x72d5, lo: 0x80, hi: 0xad}, + {value: 0x6535, lo: 0xae, hi: 0xae}, + {value: 0x7895, lo: 0xaf, hi: 0xb5}, + {value: 0x6f55, lo: 0xb6, hi: 0xb6}, + {value: 0x7975, lo: 0xb7, hi: 0xbf}, + // Block 0x86, offset 0x42c + {value: 0x0028, lo: 0x03}, + {value: 0x7c21, lo: 0x80, hi: 0x82}, + {value: 0x7be1, lo: 0x83, hi: 0x83}, + {value: 0x7c99, lo: 0x84, hi: 0xbf}, + // Block 0x87, offset 0x430 + {value: 0x0038, lo: 0x0f}, + {value: 0x9db1, lo: 0x80, hi: 0x83}, + {value: 0x9e59, lo: 0x84, hi: 0x85}, + {value: 0x9e91, lo: 0x86, hi: 0x87}, + {value: 0x9ec9, lo: 0x88, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0xa089, lo: 0x92, hi: 0x97}, + {value: 0xa1a1, lo: 0x98, hi: 0x9c}, + {value: 0xa281, lo: 0x9d, hi: 0xb3}, + {value: 0x9d41, lo: 0xb4, hi: 0xb4}, + {value: 0x9db1, lo: 0xb5, hi: 0xb5}, + {value: 0xa789, lo: 0xb6, hi: 0xbb}, + {value: 0xa869, lo: 0xbc, hi: 0xbc}, + {value: 0xa7f9, lo: 0xbd, hi: 0xbd}, + {value: 0xa8d9, lo: 0xbe, hi: 0xbf}, + // Block 0x88, offset 0x440 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x0008, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x89, offset 0x44a + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0x8a, offset 0x44f + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x8b, offset 0x452 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x8c, offset 0x458 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x8d, offset 0x45f + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x8e, offset 0x464 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x8f, offset 0x468 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x90, offset 0x46e + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x91, offset 0x473 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x92, offset 0x47c + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x93, offset 0x481 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x94, offset 0x487 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x97}, + {value: 0x8ad5, lo: 0x98, hi: 0x9f}, + {value: 0x8aed, lo: 0xa0, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xbf}, + // Block 0x95, offset 0x48e + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x8aed, lo: 0xb0, hi: 0xb7}, + {value: 0x8ad5, lo: 0xb8, hi: 0xbf}, + // Block 0x96, offset 0x495 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x97, offset 0x49c + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x98, offset 0x4a0 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xae}, + {value: 0x0018, lo: 0xaf, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x99, offset 0x4a5 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x9a, offset 0x4a8 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xbf}, + // Block 0x9b, offset 0x4ad + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0808, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0808, lo: 0x8a, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb6}, + {value: 0x0808, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbb}, + {value: 0x0808, lo: 0xbc, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x0808, lo: 0xbf, hi: 0xbf}, + // Block 0x9c, offset 0x4b9 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0818, lo: 0x97, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb6}, + {value: 0x0818, lo: 0xb7, hi: 0xbf}, + // Block 0x9d, offset 0x4bf + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa6}, + {value: 0x0818, lo: 0xa7, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x9e, offset 0x4c4 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x0818, lo: 0xbb, hi: 0xbf}, + // Block 0x9f, offset 0x4cb + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0818, lo: 0x96, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0818, lo: 0xbf, hi: 0xbf}, + // Block 0xa0, offset 0x4d3 + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbb}, + {value: 0x0818, lo: 0xbc, hi: 0xbd}, + {value: 0x0808, lo: 0xbe, hi: 0xbf}, + // Block 0xa1, offset 0x4d8 + {value: 0x0000, lo: 0x03}, + {value: 0x0818, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x0818, lo: 0x92, hi: 0xbf}, + // Block 0xa2, offset 0x4dc + {value: 0x0000, lo: 0x0f}, + {value: 0x0808, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x94}, + {value: 0x0808, lo: 0x95, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x98}, + {value: 0x0808, lo: 0x99, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xa3, offset 0x4ec + {value: 0x0000, lo: 0x06}, + {value: 0x0818, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0818, lo: 0x90, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xbc}, + {value: 0x0818, lo: 0xbd, hi: 0xbf}, + // Block 0xa4, offset 0x4f3 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xa5, offset 0x4f7 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xbf}, + // Block 0xa6, offset 0x4fb + {value: 0x0000, lo: 0x06}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0818, lo: 0x98, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb7}, + {value: 0x0818, lo: 0xb8, hi: 0xbf}, + // Block 0xa7, offset 0x502 + {value: 0x0000, lo: 0x01}, + {value: 0x0808, lo: 0x80, hi: 0xbf}, + // Block 0xa8, offset 0x504 + {value: 0x0000, lo: 0x02}, + {value: 0x0808, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xa9, offset 0x507 + {value: 0x0000, lo: 0x02}, + {value: 0x03dd, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xaa, offset 0x50a + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xbf}, + // Block 0xab, offset 0x50e + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0818, lo: 0xa0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xac, offset 0x512 + {value: 0x0000, lo: 0x05}, + {value: 0x3008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xad, offset 0x518 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x91}, + {value: 0x0018, lo: 0x92, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xae, offset 0x521 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbc}, + {value: 0x0340, lo: 0xbd, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0xaf, offset 0x52d + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb0, offset 0x534 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb2}, + {value: 0x3b08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xbf}, + // Block 0xb1, offset 0x53d + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xb2, offset 0x545 + {value: 0x0000, lo: 0x06}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xbe}, + {value: 0x3008, lo: 0xbf, hi: 0xbf}, + // Block 0xb3, offset 0x54c + {value: 0x0000, lo: 0x0d}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xb4, offset 0x55a + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3808, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xb5, offset 0x567 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xb6, offset 0x574 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x3308, lo: 0x9f, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa9}, + {value: 0x3b08, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb7, offset 0x57d + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xb8, offset 0x581 + {value: 0x0000, lo: 0x0d}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xb9, offset 0x58f + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xba, offset 0x597 + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x85}, + {value: 0x0018, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xbb, offset 0x5a2 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbc, offset 0x5ab + {value: 0x0000, lo: 0x05}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9b}, + {value: 0x3308, lo: 0x9c, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xbd, offset 0x5b1 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbe, offset 0x5b9 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xbf, offset 0x5c2 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb5}, + {value: 0x3808, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0xc0, offset 0x5cc + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xc1, offset 0x5cf + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xc2, offset 0x5db + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xbf}, + // Block 0xc3, offset 0x5de + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0xc4, offset 0x5e3 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xc5, offset 0x5e6 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xc6, offset 0x5f0 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xbf}, + // Block 0xc7, offset 0x5f9 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xa9}, + {value: 0x3308, lo: 0xaa, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xc8, offset 0x605 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xc9, offset 0x608 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xca, offset 0x60d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xcb, offset 0x610 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xbf}, + // Block 0xcc, offset 0x613 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0xbf}, + // Block 0xcd, offset 0x616 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xce, offset 0x61d + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xcf, offset 0x624 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0xd0, offset 0x628 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0xd1, offset 0x633 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0xd2, offset 0x636 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3008, lo: 0x91, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd3, offset 0x63c + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xd4, offset 0x641 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0xd5, offset 0x645 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xd6, offset 0x648 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xd7, offset 0x64b + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0xbf}, + // Block 0xd8, offset 0x64e + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0xd9, offset 0x653 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x03c0, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xbf}, + // Block 0xda, offset 0x65d + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xdb, offset 0x660 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xbf}, + // Block 0xdc, offset 0x664 + {value: 0x0000, lo: 0x0e}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0xb5b9, lo: 0x9e, hi: 0x9e}, + {value: 0xb601, lo: 0x9f, hi: 0x9f}, + {value: 0xb649, lo: 0xa0, hi: 0xa0}, + {value: 0xb6b1, lo: 0xa1, hi: 0xa1}, + {value: 0xb719, lo: 0xa2, hi: 0xa2}, + {value: 0xb781, lo: 0xa3, hi: 0xa3}, + {value: 0xb7e9, lo: 0xa4, hi: 0xa4}, + {value: 0x3018, lo: 0xa5, hi: 0xa6}, + {value: 0x3318, lo: 0xa7, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xac}, + {value: 0x3018, lo: 0xad, hi: 0xb2}, + {value: 0x0340, lo: 0xb3, hi: 0xba}, + {value: 0x3318, lo: 0xbb, hi: 0xbf}, + // Block 0xdd, offset 0x673 + {value: 0x0000, lo: 0x0b}, + {value: 0x3318, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x84}, + {value: 0x3318, lo: 0x85, hi: 0x8b}, + {value: 0x0018, lo: 0x8c, hi: 0xa9}, + {value: 0x3318, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xba}, + {value: 0xb851, lo: 0xbb, hi: 0xbb}, + {value: 0xb899, lo: 0xbc, hi: 0xbc}, + {value: 0xb8e1, lo: 0xbd, hi: 0xbd}, + {value: 0xb949, lo: 0xbe, hi: 0xbe}, + {value: 0xb9b1, lo: 0xbf, hi: 0xbf}, + // Block 0xde, offset 0x67f + {value: 0x0000, lo: 0x03}, + {value: 0xba19, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xbf}, + // Block 0xdf, offset 0x683 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x3318, lo: 0x82, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0xbf}, + // Block 0xe0, offset 0x688 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xe1, offset 0x68d + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0xe2, offset 0x691 + {value: 0x0000, lo: 0x04}, + {value: 0x3308, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0xe3, offset 0x696 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x3308, lo: 0xa1, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xe4, offset 0x69f + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0xe5, offset 0x6aa + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x86}, + {value: 0x0818, lo: 0x87, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xe6, offset 0x6b0 + {value: 0x0000, lo: 0x07}, + {value: 0x0a08, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0818, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xe7, offset 0x6b8 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xe8, offset 0x6bc + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0xe9, offset 0x6c0 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0xea, offset 0x6c6 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xeb, offset 0x6cc + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0xc1c1, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xec, offset 0x6d1 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xbf}, + // Block 0xed, offset 0x6d4 + {value: 0x0000, lo: 0x0d}, + {value: 0xc7e9, lo: 0x80, hi: 0x80}, + {value: 0xc839, lo: 0x81, hi: 0x81}, + {value: 0xc889, lo: 0x82, hi: 0x82}, + {value: 0xc8d9, lo: 0x83, hi: 0x83}, + {value: 0xc929, lo: 0x84, hi: 0x84}, + {value: 0xc979, lo: 0x85, hi: 0x85}, + {value: 0xc9c9, lo: 0x86, hi: 0x86}, + {value: 0xca19, lo: 0x87, hi: 0x87}, + {value: 0xca69, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0xcab9, lo: 0x90, hi: 0x90}, + {value: 0xcad9, lo: 0x91, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0xbf}, + // Block 0xee, offset 0x6e2 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x92}, + {value: 0x0040, lo: 0x93, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xef, offset 0x6e9 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0xf0, offset 0x6ec + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0xbf}, + // Block 0xf1, offset 0x6ef + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0xf2, offset 0x6f3 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0xf3, offset 0x6f9 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xbf}, + // Block 0xf4, offset 0x6fe + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb2}, + {value: 0x0018, lo: 0xb3, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xf5, offset 0x708 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xf6, offset 0x70d + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0xbf}, + // Block 0xf7, offset 0x710 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0xbf}, + // Block 0xf8, offset 0x713 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xf9, offset 0x716 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xfa, offset 0x719 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0xfb, offset 0x71d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xbf}, + // Block 0xfc, offset 0x720 + {value: 0x0020, lo: 0x0f}, + {value: 0xdeb9, lo: 0x80, hi: 0x89}, + {value: 0x8dfd, lo: 0x8a, hi: 0x8a}, + {value: 0xdff9, lo: 0x8b, hi: 0x9c}, + {value: 0x8e1d, lo: 0x9d, hi: 0x9d}, + {value: 0xe239, lo: 0x9e, hi: 0xa2}, + {value: 0x8e3d, lo: 0xa3, hi: 0xa3}, + {value: 0xe2d9, lo: 0xa4, hi: 0xab}, + {value: 0x7ed5, lo: 0xac, hi: 0xac}, + {value: 0xe3d9, lo: 0xad, hi: 0xaf}, + {value: 0x8e5d, lo: 0xb0, hi: 0xb0}, + {value: 0xe439, lo: 0xb1, hi: 0xb6}, + {value: 0x8e7d, lo: 0xb7, hi: 0xb9}, + {value: 0xe4f9, lo: 0xba, hi: 0xba}, + {value: 0x8edd, lo: 0xbb, hi: 0xbb}, + {value: 0xe519, lo: 0xbc, hi: 0xbf}, + // Block 0xfd, offset 0x730 + {value: 0x0020, lo: 0x10}, + {value: 0x937d, lo: 0x80, hi: 0x80}, + {value: 0xf099, lo: 0x81, hi: 0x86}, + {value: 0x939d, lo: 0x87, hi: 0x8a}, + {value: 0xd9f9, lo: 0x8b, hi: 0x8b}, + {value: 0xf159, lo: 0x8c, hi: 0x96}, + {value: 0x941d, lo: 0x97, hi: 0x97}, + {value: 0xf2b9, lo: 0x98, hi: 0xa3}, + {value: 0x943d, lo: 0xa4, hi: 0xa6}, + {value: 0xf439, lo: 0xa7, hi: 0xaa}, + {value: 0x949d, lo: 0xab, hi: 0xab}, + {value: 0xf4b9, lo: 0xac, hi: 0xac}, + {value: 0x94bd, lo: 0xad, hi: 0xad}, + {value: 0xf4d9, lo: 0xae, hi: 0xaf}, + {value: 0x94dd, lo: 0xb0, hi: 0xb1}, + {value: 0xf519, lo: 0xb2, hi: 0xbe}, + {value: 0x2040, lo: 0xbf, hi: 0xbf}, + // Block 0xfe, offset 0x741 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0340, lo: 0x81, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x9f}, + {value: 0x0340, lo: 0xa0, hi: 0xbf}, + // Block 0xff, offset 0x746 + {value: 0x0000, lo: 0x01}, + {value: 0x0340, lo: 0x80, hi: 0xbf}, + // Block 0x100, offset 0x748 + {value: 0x0000, lo: 0x01}, + {value: 0x33c0, lo: 0x80, hi: 0xbf}, + // Block 0x101, offset 0x74a + {value: 0x0000, lo: 0x02}, + {value: 0x33c0, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, +} + +// Total table size 41662 bytes (40KiB); checksum: 355A58A4 diff --git a/vendor/golang.org/x/net/idna/trie.go b/vendor/golang.org/x/net/idna/trie.go new file mode 100644 index 00000000..c4ef847e --- /dev/null +++ b/vendor/golang.org/x/net/idna/trie.go @@ -0,0 +1,72 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package idna + +// appendMapping appends the mapping for the respective rune. isMapped must be +// true. A mapping is a categorization of a rune as defined in UTS #46. +func (c info) appendMapping(b []byte, s string) []byte { + index := int(c >> indexShift) + if c&xorBit == 0 { + s := mappings[index:] + return append(b, s[1:s[0]+1]...) + } + b = append(b, s...) + if c&inlineXOR == inlineXOR { + // TODO: support and handle two-byte inline masks + b[len(b)-1] ^= byte(index) + } else { + for p := len(b) - int(xorData[index]); p < len(b); p++ { + index++ + b[p] ^= xorData[index] + } + } + return b +} + +// Sparse block handling code. + +type valueRange struct { + value uint16 // header: value:stride + lo, hi byte // header: lo:n +} + +type sparseBlocks struct { + values []valueRange + offset []uint16 +} + +var idnaSparse = sparseBlocks{ + values: idnaSparseValues[:], + offset: idnaSparseOffset[:], +} + +// Don't use newIdnaTrie to avoid unconditional linking in of the table. +var trie = &idnaTrie{} + +// lookup determines the type of block n and looks up the value for b. +// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block +// is a list of ranges with an accompanying value. Given a matching range r, +// the value for b is by r.value + (b - r.lo) * stride. +func (t *sparseBlocks) lookup(n uint32, b byte) uint16 { + offset := t.offset[n] + header := t.values[offset] + lo := offset + 1 + hi := lo + uint16(header.lo) + for lo < hi { + m := lo + (hi-lo)/2 + r := t.values[m] + if r.lo <= b && b <= r.hi { + return r.value + uint16(b-r.lo)*header.value + } + if b < r.lo { + hi = m + } else { + lo = m + 1 + } + } + return 0 +} diff --git a/vendor/golang.org/x/net/idna/trieval.go b/vendor/golang.org/x/net/idna/trieval.go new file mode 100644 index 00000000..7a8cf889 --- /dev/null +++ b/vendor/golang.org/x/net/idna/trieval.go @@ -0,0 +1,119 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package idna + +// This file contains definitions for interpreting the trie value of the idna +// trie generated by "go run gen*.go". It is shared by both the generator +// program and the resultant package. Sharing is achieved by the generator +// copying gen_trieval.go to trieval.go and changing what's above this comment. + +// info holds information from the IDNA mapping table for a single rune. It is +// the value returned by a trie lookup. In most cases, all information fits in +// a 16-bit value. For mappings, this value may contain an index into a slice +// with the mapped string. Such mappings can consist of the actual mapped value +// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the +// input rune. This technique is used by the cases packages and reduces the +// table size significantly. +// +// The per-rune values have the following format: +// +// if mapped { +// if inlinedXOR { +// 15..13 inline XOR marker +// 12..11 unused +// 10..3 inline XOR mask +// } else { +// 15..3 index into xor or mapping table +// } +// } else { +// 15..14 unused +// 13 mayNeedNorm +// 12..11 attributes +// 10..8 joining type +// 7..3 category type +// } +// 2 use xor pattern +// 1..0 mapped category +// +// See the definitions below for a more detailed description of the various +// bits. +type info uint16 + +const ( + catSmallMask = 0x3 + catBigMask = 0xF8 + indexShift = 3 + xorBit = 0x4 // interpret the index as an xor pattern + inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined. + + joinShift = 8 + joinMask = 0x07 + + // Attributes + attributesMask = 0x1800 + viramaModifier = 0x1800 + modifier = 0x1000 + rtl = 0x0800 + + mayNeedNorm = 0x2000 +) + +// A category corresponds to a category defined in the IDNA mapping table. +type category uint16 + +const ( + unknown category = 0 // not currently defined in unicode. + mapped category = 1 + disallowedSTD3Mapped category = 2 + deviation category = 3 +) + +const ( + valid category = 0x08 + validNV8 category = 0x18 + validXV8 category = 0x28 + disallowed category = 0x40 + disallowedSTD3Valid category = 0x80 + ignored category = 0xC0 +) + +// join types and additional rune information +const ( + joiningL = (iota + 1) + joiningD + joiningT + joiningR + + //the following types are derived during processing + joinZWJ + joinZWNJ + joinVirama + numJoinTypes +) + +func (c info) isMapped() bool { + return c&0x3 != 0 +} + +func (c info) category() category { + small := c & catSmallMask + if small != 0 { + return category(small) + } + return category(c & catBigMask) +} + +func (c info) joinType() info { + if c.isMapped() { + return 0 + } + return (c >> joinShift) & joinMask +} + +func (c info) isModifier() bool { + return c&(modifier|catSmallMask) == modifier +} + +func (c info) isViramaModifier() bool { + return c&(attributesMask|catSmallMask) == viramaModifier +} diff --git a/vendor/golang.org/x/net/internal/iana/const.go b/vendor/golang.org/x/net/internal/iana/const.go new file mode 100644 index 00000000..cea712fa --- /dev/null +++ b/vendor/golang.org/x/net/internal/iana/const.go @@ -0,0 +1,223 @@ +// go generate gen.go +// Code generated by the command above; DO NOT EDIT. + +// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA). +package iana // import "golang.org/x/net/internal/iana" + +// Differentiated Services Field Codepoints (DSCP), Updated: 2018-05-04 +const ( + DiffServCS0 = 0x00 // CS0 + DiffServCS1 = 0x20 // CS1 + DiffServCS2 = 0x40 // CS2 + DiffServCS3 = 0x60 // CS3 + DiffServCS4 = 0x80 // CS4 + DiffServCS5 = 0xa0 // CS5 + DiffServCS6 = 0xc0 // CS6 + DiffServCS7 = 0xe0 // CS7 + DiffServAF11 = 0x28 // AF11 + DiffServAF12 = 0x30 // AF12 + DiffServAF13 = 0x38 // AF13 + DiffServAF21 = 0x48 // AF21 + DiffServAF22 = 0x50 // AF22 + DiffServAF23 = 0x58 // AF23 + DiffServAF31 = 0x68 // AF31 + DiffServAF32 = 0x70 // AF32 + DiffServAF33 = 0x78 // AF33 + DiffServAF41 = 0x88 // AF41 + DiffServAF42 = 0x90 // AF42 + DiffServAF43 = 0x98 // AF43 + DiffServEF = 0xb8 // EF + DiffServVOICEADMIT = 0xb0 // VOICE-ADMIT + NotECNTransport = 0x00 // Not-ECT (Not ECN-Capable Transport) + ECNTransport1 = 0x01 // ECT(1) (ECN-Capable Transport(1)) + ECNTransport0 = 0x02 // ECT(0) (ECN-Capable Transport(0)) + CongestionExperienced = 0x03 // CE (Congestion Experienced) +) + +// Protocol Numbers, Updated: 2017-10-13 +const ( + ProtocolIP = 0 // IPv4 encapsulation, pseudo protocol number + ProtocolHOPOPT = 0 // IPv6 Hop-by-Hop Option + ProtocolICMP = 1 // Internet Control Message + ProtocolIGMP = 2 // Internet Group Management + ProtocolGGP = 3 // Gateway-to-Gateway + ProtocolIPv4 = 4 // IPv4 encapsulation + ProtocolST = 5 // Stream + ProtocolTCP = 6 // Transmission Control + ProtocolCBT = 7 // CBT + ProtocolEGP = 8 // Exterior Gateway Protocol + ProtocolIGP = 9 // any private interior gateway (used by Cisco for their IGRP) + ProtocolBBNRCCMON = 10 // BBN RCC Monitoring + ProtocolNVPII = 11 // Network Voice Protocol + ProtocolPUP = 12 // PUP + ProtocolEMCON = 14 // EMCON + ProtocolXNET = 15 // Cross Net Debugger + ProtocolCHAOS = 16 // Chaos + ProtocolUDP = 17 // User Datagram + ProtocolMUX = 18 // Multiplexing + ProtocolDCNMEAS = 19 // DCN Measurement Subsystems + ProtocolHMP = 20 // Host Monitoring + ProtocolPRM = 21 // Packet Radio Measurement + ProtocolXNSIDP = 22 // XEROX NS IDP + ProtocolTRUNK1 = 23 // Trunk-1 + ProtocolTRUNK2 = 24 // Trunk-2 + ProtocolLEAF1 = 25 // Leaf-1 + ProtocolLEAF2 = 26 // Leaf-2 + ProtocolRDP = 27 // Reliable Data Protocol + ProtocolIRTP = 28 // Internet Reliable Transaction + ProtocolISOTP4 = 29 // ISO Transport Protocol Class 4 + ProtocolNETBLT = 30 // Bulk Data Transfer Protocol + ProtocolMFENSP = 31 // MFE Network Services Protocol + ProtocolMERITINP = 32 // MERIT Internodal Protocol + ProtocolDCCP = 33 // Datagram Congestion Control Protocol + Protocol3PC = 34 // Third Party Connect Protocol + ProtocolIDPR = 35 // Inter-Domain Policy Routing Protocol + ProtocolXTP = 36 // XTP + ProtocolDDP = 37 // Datagram Delivery Protocol + ProtocolIDPRCMTP = 38 // IDPR Control Message Transport Proto + ProtocolTPPP = 39 // TP++ Transport Protocol + ProtocolIL = 40 // IL Transport Protocol + ProtocolIPv6 = 41 // IPv6 encapsulation + ProtocolSDRP = 42 // Source Demand Routing Protocol + ProtocolIPv6Route = 43 // Routing Header for IPv6 + ProtocolIPv6Frag = 44 // Fragment Header for IPv6 + ProtocolIDRP = 45 // Inter-Domain Routing Protocol + ProtocolRSVP = 46 // Reservation Protocol + ProtocolGRE = 47 // Generic Routing Encapsulation + ProtocolDSR = 48 // Dynamic Source Routing Protocol + ProtocolBNA = 49 // BNA + ProtocolESP = 50 // Encap Security Payload + ProtocolAH = 51 // Authentication Header + ProtocolINLSP = 52 // Integrated Net Layer Security TUBA + ProtocolNARP = 54 // NBMA Address Resolution Protocol + ProtocolMOBILE = 55 // IP Mobility + ProtocolTLSP = 56 // Transport Layer Security Protocol using Kryptonet key management + ProtocolSKIP = 57 // SKIP + ProtocolIPv6ICMP = 58 // ICMP for IPv6 + ProtocolIPv6NoNxt = 59 // No Next Header for IPv6 + ProtocolIPv6Opts = 60 // Destination Options for IPv6 + ProtocolCFTP = 62 // CFTP + ProtocolSATEXPAK = 64 // SATNET and Backroom EXPAK + ProtocolKRYPTOLAN = 65 // Kryptolan + ProtocolRVD = 66 // MIT Remote Virtual Disk Protocol + ProtocolIPPC = 67 // Internet Pluribus Packet Core + ProtocolSATMON = 69 // SATNET Monitoring + ProtocolVISA = 70 // VISA Protocol + ProtocolIPCV = 71 // Internet Packet Core Utility + ProtocolCPNX = 72 // Computer Protocol Network Executive + ProtocolCPHB = 73 // Computer Protocol Heart Beat + ProtocolWSN = 74 // Wang Span Network + ProtocolPVP = 75 // Packet Video Protocol + ProtocolBRSATMON = 76 // Backroom SATNET Monitoring + ProtocolSUNND = 77 // SUN ND PROTOCOL-Temporary + ProtocolWBMON = 78 // WIDEBAND Monitoring + ProtocolWBEXPAK = 79 // WIDEBAND EXPAK + ProtocolISOIP = 80 // ISO Internet Protocol + ProtocolVMTP = 81 // VMTP + ProtocolSECUREVMTP = 82 // SECURE-VMTP + ProtocolVINES = 83 // VINES + ProtocolTTP = 84 // Transaction Transport Protocol + ProtocolIPTM = 84 // Internet Protocol Traffic Manager + ProtocolNSFNETIGP = 85 // NSFNET-IGP + ProtocolDGP = 86 // Dissimilar Gateway Protocol + ProtocolTCF = 87 // TCF + ProtocolEIGRP = 88 // EIGRP + ProtocolOSPFIGP = 89 // OSPFIGP + ProtocolSpriteRPC = 90 // Sprite RPC Protocol + ProtocolLARP = 91 // Locus Address Resolution Protocol + ProtocolMTP = 92 // Multicast Transport Protocol + ProtocolAX25 = 93 // AX.25 Frames + ProtocolIPIP = 94 // IP-within-IP Encapsulation Protocol + ProtocolSCCSP = 96 // Semaphore Communications Sec. Pro. + ProtocolETHERIP = 97 // Ethernet-within-IP Encapsulation + ProtocolENCAP = 98 // Encapsulation Header + ProtocolGMTP = 100 // GMTP + ProtocolIFMP = 101 // Ipsilon Flow Management Protocol + ProtocolPNNI = 102 // PNNI over IP + ProtocolPIM = 103 // Protocol Independent Multicast + ProtocolARIS = 104 // ARIS + ProtocolSCPS = 105 // SCPS + ProtocolQNX = 106 // QNX + ProtocolAN = 107 // Active Networks + ProtocolIPComp = 108 // IP Payload Compression Protocol + ProtocolSNP = 109 // Sitara Networks Protocol + ProtocolCompaqPeer = 110 // Compaq Peer Protocol + ProtocolIPXinIP = 111 // IPX in IP + ProtocolVRRP = 112 // Virtual Router Redundancy Protocol + ProtocolPGM = 113 // PGM Reliable Transport Protocol + ProtocolL2TP = 115 // Layer Two Tunneling Protocol + ProtocolDDX = 116 // D-II Data Exchange (DDX) + ProtocolIATP = 117 // Interactive Agent Transfer Protocol + ProtocolSTP = 118 // Schedule Transfer Protocol + ProtocolSRP = 119 // SpectraLink Radio Protocol + ProtocolUTI = 120 // UTI + ProtocolSMP = 121 // Simple Message Protocol + ProtocolPTP = 123 // Performance Transparency Protocol + ProtocolISIS = 124 // ISIS over IPv4 + ProtocolFIRE = 125 // FIRE + ProtocolCRTP = 126 // Combat Radio Transport Protocol + ProtocolCRUDP = 127 // Combat Radio User Datagram + ProtocolSSCOPMCE = 128 // SSCOPMCE + ProtocolIPLT = 129 // IPLT + ProtocolSPS = 130 // Secure Packet Shield + ProtocolPIPE = 131 // Private IP Encapsulation within IP + ProtocolSCTP = 132 // Stream Control Transmission Protocol + ProtocolFC = 133 // Fibre Channel + ProtocolRSVPE2EIGNORE = 134 // RSVP-E2E-IGNORE + ProtocolMobilityHeader = 135 // Mobility Header + ProtocolUDPLite = 136 // UDPLite + ProtocolMPLSinIP = 137 // MPLS-in-IP + ProtocolMANET = 138 // MANET Protocols + ProtocolHIP = 139 // Host Identity Protocol + ProtocolShim6 = 140 // Shim6 Protocol + ProtocolWESP = 141 // Wrapped Encapsulating Security Payload + ProtocolROHC = 142 // Robust Header Compression + ProtocolReserved = 255 // Reserved +) + +// Address Family Numbers, Updated: 2018-04-02 +const ( + AddrFamilyIPv4 = 1 // IP (IP version 4) + AddrFamilyIPv6 = 2 // IP6 (IP version 6) + AddrFamilyNSAP = 3 // NSAP + AddrFamilyHDLC = 4 // HDLC (8-bit multidrop) + AddrFamilyBBN1822 = 5 // BBN 1822 + AddrFamily802 = 6 // 802 (includes all 802 media plus Ethernet "canonical format") + AddrFamilyE163 = 7 // E.163 + AddrFamilyE164 = 8 // E.164 (SMDS, Frame Relay, ATM) + AddrFamilyF69 = 9 // F.69 (Telex) + AddrFamilyX121 = 10 // X.121 (X.25, Frame Relay) + AddrFamilyIPX = 11 // IPX + AddrFamilyAppletalk = 12 // Appletalk + AddrFamilyDecnetIV = 13 // Decnet IV + AddrFamilyBanyanVines = 14 // Banyan Vines + AddrFamilyE164withSubaddress = 15 // E.164 with NSAP format subaddress + AddrFamilyDNS = 16 // DNS (Domain Name System) + AddrFamilyDistinguishedName = 17 // Distinguished Name + AddrFamilyASNumber = 18 // AS Number + AddrFamilyXTPoverIPv4 = 19 // XTP over IP version 4 + AddrFamilyXTPoverIPv6 = 20 // XTP over IP version 6 + AddrFamilyXTPnativemodeXTP = 21 // XTP native mode XTP + AddrFamilyFibreChannelWorldWidePortName = 22 // Fibre Channel World-Wide Port Name + AddrFamilyFibreChannelWorldWideNodeName = 23 // Fibre Channel World-Wide Node Name + AddrFamilyGWID = 24 // GWID + AddrFamilyL2VPN = 25 // AFI for L2VPN information + AddrFamilyMPLSTPSectionEndpointID = 26 // MPLS-TP Section Endpoint Identifier + AddrFamilyMPLSTPLSPEndpointID = 27 // MPLS-TP LSP Endpoint Identifier + AddrFamilyMPLSTPPseudowireEndpointID = 28 // MPLS-TP Pseudowire Endpoint Identifier + AddrFamilyMTIPv4 = 29 // MT IP: Multi-Topology IP version 4 + AddrFamilyMTIPv6 = 30 // MT IPv6: Multi-Topology IP version 6 + AddrFamilyEIGRPCommonServiceFamily = 16384 // EIGRP Common Service Family + AddrFamilyEIGRPIPv4ServiceFamily = 16385 // EIGRP IPv4 Service Family + AddrFamilyEIGRPIPv6ServiceFamily = 16386 // EIGRP IPv6 Service Family + AddrFamilyLISPCanonicalAddressFormat = 16387 // LISP Canonical Address Format (LCAF) + AddrFamilyBGPLS = 16388 // BGP-LS + AddrFamily48bitMAC = 16389 // 48-bit MAC + AddrFamily64bitMAC = 16390 // 64-bit MAC + AddrFamilyOUI = 16391 // OUI + AddrFamilyMACFinal24bits = 16392 // MAC/24 + AddrFamilyMACFinal40bits = 16393 // MAC/40 + AddrFamilyIPv6Initial64bits = 16394 // IPv6/64 + AddrFamilyRBridgePortID = 16395 // RBridge Port ID + AddrFamilyTRILLNickname = 16396 // TRILL Nickname +) diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr.go b/vendor/golang.org/x/net/internal/socket/cmsghdr.go new file mode 100644 index 00000000..0a73e277 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr.go @@ -0,0 +1,11 @@ +// 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package socket + +func (h *cmsghdr) len() int { return int(h.Len) } +func (h *cmsghdr) lvl() int { return int(h.Level) } +func (h *cmsghdr) typ() int { return int(h.Type) } diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go new file mode 100644 index 00000000..14dbb3ad --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go @@ -0,0 +1,13 @@ +// 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. + +// +build aix darwin dragonfly freebsd netbsd openbsd + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint32(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go new file mode 100644 index 00000000..bac66811 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go @@ -0,0 +1,14 @@ +// 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. + +// +build arm mips mipsle 386 +// +build linux + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint32(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go new file mode 100644 index 00000000..27be0efa --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go @@ -0,0 +1,14 @@ +// 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. + +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x +// +build linux + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint64(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go new file mode 100644 index 00000000..7dedd430 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go @@ -0,0 +1,14 @@ +// 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. + +// +build amd64 +// +build solaris + +package socket + +func (h *cmsghdr) set(l, lvl, typ int) { + h.Len = uint32(l) + h.Level = int32(lvl) + h.Type = int32(typ) +} diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go new file mode 100644 index 00000000..e581011b --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go @@ -0,0 +1,17 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package socket + +type cmsghdr struct{} + +const sizeofCmsghdr = 0 + +func (h *cmsghdr) len() int { return 0 } +func (h *cmsghdr) lvl() int { return 0 } +func (h *cmsghdr) typ() int { return 0 } + +func (h *cmsghdr) set(l, lvl, typ int) {} diff --git a/vendor/golang.org/x/net/internal/socket/empty.s b/vendor/golang.org/x/net/internal/socket/empty.s new file mode 100644 index 00000000..bff0231c --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/empty.s @@ -0,0 +1,7 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin,go1.12 + +// This exists solely so we can linkname in symbols from syscall. diff --git a/vendor/golang.org/x/net/internal/socket/error_unix.go b/vendor/golang.org/x/net/internal/socket/error_unix.go new file mode 100644 index 00000000..f14872d3 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/error_unix.go @@ -0,0 +1,31 @@ +// 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package socket + +import "syscall" + +var ( + errEAGAIN error = syscall.EAGAIN + errEINVAL error = syscall.EINVAL + errENOENT error = syscall.ENOENT +) + +// errnoErr returns common boxed Errno values, to prevent allocations +// at runtime. +func errnoErr(errno syscall.Errno) error { + switch errno { + case 0: + return nil + case syscall.EAGAIN: + return errEAGAIN + case syscall.EINVAL: + return errEINVAL + case syscall.ENOENT: + return errENOENT + } + return errno +} diff --git a/vendor/golang.org/x/net/internal/socket/error_windows.go b/vendor/golang.org/x/net/internal/socket/error_windows.go new file mode 100644 index 00000000..6a6379a8 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/error_windows.go @@ -0,0 +1,26 @@ +// 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. + +package socket + +import "syscall" + +var ( + errERROR_IO_PENDING error = syscall.ERROR_IO_PENDING + errEINVAL error = syscall.EINVAL +) + +// errnoErr returns common boxed Errno values, to prevent allocations +// at runtime. +func errnoErr(errno syscall.Errno) error { + switch errno { + case 0: + return nil + case syscall.ERROR_IO_PENDING: + return errERROR_IO_PENDING + case syscall.EINVAL: + return errEINVAL + } + return errno +} diff --git a/vendor/golang.org/x/net/internal/socket/iovec_32bit.go b/vendor/golang.org/x/net/internal/socket/iovec_32bit.go new file mode 100644 index 00000000..05d6082d --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/iovec_32bit.go @@ -0,0 +1,19 @@ +// 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. + +// +build arm mips mipsle 386 +// +build darwin dragonfly freebsd linux netbsd openbsd + +package socket + +import "unsafe" + +func (v *iovec) set(b []byte) { + l := len(b) + if l == 0 { + return + } + v.Base = (*byte)(unsafe.Pointer(&b[0])) + v.Len = uint32(l) +} diff --git a/vendor/golang.org/x/net/internal/socket/iovec_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go new file mode 100644 index 00000000..dfeda752 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go @@ -0,0 +1,19 @@ +// 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. + +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x +// +build aix darwin dragonfly freebsd linux netbsd openbsd + +package socket + +import "unsafe" + +func (v *iovec) set(b []byte) { + l := len(b) + if l == 0 { + return + } + v.Base = (*byte)(unsafe.Pointer(&b[0])) + v.Len = uint64(l) +} diff --git a/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go new file mode 100644 index 00000000..8d17a40c --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go @@ -0,0 +1,19 @@ +// 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. + +// +build amd64 +// +build solaris + +package socket + +import "unsafe" + +func (v *iovec) set(b []byte) { + l := len(b) + if l == 0 { + return + } + v.Base = (*int8)(unsafe.Pointer(&b[0])) + v.Len = uint64(l) +} diff --git a/vendor/golang.org/x/net/internal/socket/iovec_stub.go b/vendor/golang.org/x/net/internal/socket/iovec_stub.go new file mode 100644 index 00000000..a746e90e --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/iovec_stub.go @@ -0,0 +1,11 @@ +// 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package socket + +type iovec struct{} + +func (v *iovec) set(b []byte) {} diff --git a/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go b/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go new file mode 100644 index 00000000..1a7f2792 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !aix,!linux,!netbsd + +package socket + +import "net" + +type mmsghdr struct{} + +type mmsghdrs []mmsghdr + +func (hs mmsghdrs) pack(ms []Message, parseFn func([]byte, string) (net.Addr, error), marshalFn func(net.Addr) []byte) error { + return nil +} + +func (hs mmsghdrs) unpack(ms []Message, parseFn func([]byte, string) (net.Addr, error), hint string) error { + return nil +} diff --git a/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go b/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go new file mode 100644 index 00000000..f1100683 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go @@ -0,0 +1,42 @@ +// 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. + +// +build aix linux netbsd + +package socket + +import "net" + +type mmsghdrs []mmsghdr + +func (hs mmsghdrs) pack(ms []Message, parseFn func([]byte, string) (net.Addr, error), marshalFn func(net.Addr) []byte) error { + for i := range hs { + vs := make([]iovec, len(ms[i].Buffers)) + var sa []byte + if parseFn != nil { + sa = make([]byte, sizeofSockaddrInet6) + } + if marshalFn != nil { + sa = marshalFn(ms[i].Addr) + } + hs[i].Hdr.pack(vs, ms[i].Buffers, ms[i].OOB, sa) + } + return nil +} + +func (hs mmsghdrs) unpack(ms []Message, parseFn func([]byte, string) (net.Addr, error), hint string) error { + for i := range hs { + ms[i].N = int(hs[i].Len) + ms[i].NN = hs[i].Hdr.controllen() + ms[i].Flags = hs[i].Hdr.flags() + if parseFn != nil { + var err error + ms[i].Addr, err = parseFn(hs[i].Hdr.name(), hint) + if err != nil { + return err + } + } + } + return nil +} diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go b/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go new file mode 100644 index 00000000..77f44c1f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go @@ -0,0 +1,39 @@ +// 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. + +// +build aix darwin dragonfly freebsd netbsd openbsd + +package socket + +import "unsafe" + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) { + for i := range vs { + vs[i].set(bs[i]) + } + h.setIov(vs) + if len(oob) > 0 { + h.Control = (*byte)(unsafe.Pointer(&oob[0])) + h.Controllen = uint32(len(oob)) + } + if sa != nil { + h.Name = (*byte)(unsafe.Pointer(&sa[0])) + h.Namelen = uint32(len(sa)) + } +} + +func (h *msghdr) name() []byte { + if h.Name != nil && h.Namelen > 0 { + return (*[sizeofSockaddrInet6]byte)(unsafe.Pointer(h.Name))[:h.Namelen] + } + return nil +} + +func (h *msghdr) controllen() int { + return int(h.Controllen) +} + +func (h *msghdr) flags() int { + return int(h.Flags) +} diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go b/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go new file mode 100644 index 00000000..c5562dd6 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go @@ -0,0 +1,16 @@ +// 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. + +// +build aix darwin dragonfly freebsd netbsd + +package socket + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = int32(l) +} diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux.go new file mode 100644 index 00000000..5a38798c --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/msghdr_linux.go @@ -0,0 +1,36 @@ +// 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. + +package socket + +import "unsafe" + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) { + for i := range vs { + vs[i].set(bs[i]) + } + h.setIov(vs) + if len(oob) > 0 { + h.setControl(oob) + } + if sa != nil { + h.Name = (*byte)(unsafe.Pointer(&sa[0])) + h.Namelen = uint32(len(sa)) + } +} + +func (h *msghdr) name() []byte { + if h.Name != nil && h.Namelen > 0 { + return (*[sizeofSockaddrInet6]byte)(unsafe.Pointer(h.Name))[:h.Namelen] + } + return nil +} + +func (h *msghdr) controllen() int { + return int(h.Controllen) +} + +func (h *msghdr) flags() int { + return int(h.Flags) +} diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go new file mode 100644 index 00000000..a7a5987c --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go @@ -0,0 +1,24 @@ +// 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. + +// +build arm mips mipsle 386 +// +build linux + +package socket + +import "unsafe" + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = uint32(l) +} + +func (h *msghdr) setControl(b []byte) { + h.Control = (*byte)(unsafe.Pointer(&b[0])) + h.Controllen = uint32(len(b)) +} diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go new file mode 100644 index 00000000..e731833a --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go @@ -0,0 +1,24 @@ +// 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. + +// +build arm64 amd64 ppc64 ppc64le mips64 mips64le riscv64 s390x +// +build linux + +package socket + +import "unsafe" + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = uint64(l) +} + +func (h *msghdr) setControl(b []byte) { + h.Control = (*byte)(unsafe.Pointer(&b[0])) + h.Controllen = uint64(len(b)) +} diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go b/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go new file mode 100644 index 00000000..71a69e25 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go @@ -0,0 +1,14 @@ +// 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. + +package socket + +func (h *msghdr) setIov(vs []iovec) { + l := len(vs) + if l == 0 { + return + } + h.Iov = &vs[0] + h.Iovlen = uint32(l) +} diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go new file mode 100644 index 00000000..6465b207 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go @@ -0,0 +1,36 @@ +// 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. + +// +build amd64 +// +build solaris + +package socket + +import "unsafe" + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) { + for i := range vs { + vs[i].set(bs[i]) + } + if len(vs) > 0 { + h.Iov = &vs[0] + h.Iovlen = int32(len(vs)) + } + if len(oob) > 0 { + h.Accrights = (*int8)(unsafe.Pointer(&oob[0])) + h.Accrightslen = int32(len(oob)) + } + if sa != nil { + h.Name = (*byte)(unsafe.Pointer(&sa[0])) + h.Namelen = uint32(len(sa)) + } +} + +func (h *msghdr) controllen() int { + return int(h.Accrightslen) +} + +func (h *msghdr) flags() int { + return int(NativeEndian.Uint32(h.Pad_cgo_2[:])) +} diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_stub.go b/vendor/golang.org/x/net/internal/socket/msghdr_stub.go new file mode 100644 index 00000000..873490a7 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/msghdr_stub.go @@ -0,0 +1,14 @@ +// 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package socket + +type msghdr struct{} + +func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) {} +func (h *msghdr) name() []byte { return nil } +func (h *msghdr) controllen() int { return 0 } +func (h *msghdr) flags() int { return 0 } diff --git a/vendor/golang.org/x/net/internal/socket/norace.go b/vendor/golang.org/x/net/internal/socket/norace.go new file mode 100644 index 00000000..9519ffbb --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/norace.go @@ -0,0 +1,12 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !race + +package socket + +func (m *Message) raceRead() { +} +func (m *Message) raceWrite() { +} diff --git a/vendor/golang.org/x/net/internal/socket/race.go b/vendor/golang.org/x/net/internal/socket/race.go new file mode 100644 index 00000000..df60c62f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/race.go @@ -0,0 +1,37 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build race + +package socket + +import ( + "runtime" + "unsafe" +) + +// This package reads and writes the Message buffers using a +// direct system call, which the race detector can't see. +// These functions tell the race detector what is going on during the syscall. + +func (m *Message) raceRead() { + for _, b := range m.Buffers { + if len(b) > 0 { + runtime.RaceReadRange(unsafe.Pointer(&b[0]), len(b)) + } + } + if b := m.OOB; len(b) > 0 { + runtime.RaceReadRange(unsafe.Pointer(&b[0]), len(b)) + } +} +func (m *Message) raceWrite() { + for _, b := range m.Buffers { + if len(b) > 0 { + runtime.RaceWriteRange(unsafe.Pointer(&b[0]), len(b)) + } + } + if b := m.OOB; len(b) > 0 { + runtime.RaceWriteRange(unsafe.Pointer(&b[0]), len(b)) + } +} diff --git a/vendor/golang.org/x/net/internal/socket/rawconn.go b/vendor/golang.org/x/net/internal/socket/rawconn.go new file mode 100644 index 00000000..b07b8900 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/rawconn.go @@ -0,0 +1,64 @@ +// 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. + +package socket + +import ( + "errors" + "net" + "os" + "syscall" +) + +// A Conn represents a raw connection. +type Conn struct { + network string + c syscall.RawConn +} + +// NewConn returns a new raw connection. +func NewConn(c net.Conn) (*Conn, error) { + var err error + var cc Conn + switch c := c.(type) { + case *net.TCPConn: + cc.network = "tcp" + cc.c, err = c.SyscallConn() + case *net.UDPConn: + cc.network = "udp" + cc.c, err = c.SyscallConn() + case *net.IPConn: + cc.network = "ip" + cc.c, err = c.SyscallConn() + default: + return nil, errors.New("unknown connection type") + } + if err != nil { + return nil, err + } + return &cc, nil +} + +func (o *Option) get(c *Conn, b []byte) (int, error) { + var operr error + var n int + fn := func(s uintptr) { + n, operr = getsockopt(s, o.Level, o.Name, b) + } + if err := c.c.Control(fn); err != nil { + return 0, err + } + return n, os.NewSyscallError("getsockopt", operr) +} + +func (o *Option) set(c *Conn, b []byte) error { + var operr error + fn := func(s uintptr) { + operr = setsockopt(s, o.Level, o.Name, b) + } + if err := c.c.Control(fn); err != nil { + return err + } + return os.NewSyscallError("setsockopt", operr) +} diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go new file mode 100644 index 00000000..d01fc4c7 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go @@ -0,0 +1,79 @@ +// 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. + +// +build linux + +package socket + +import ( + "net" + "os" + "syscall" +) + +func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) { + for i := range ms { + ms[i].raceWrite() + } + hs := make(mmsghdrs, len(ms)) + var parseFn func([]byte, string) (net.Addr, error) + if c.network != "tcp" { + parseFn = parseInetAddr + } + if err := hs.pack(ms, parseFn, nil); err != nil { + return 0, err + } + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = recvmmsg(s, hs, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Read(fn); err != nil { + return n, err + } + if operr != nil { + return n, os.NewSyscallError("recvmmsg", operr) + } + if err := hs[:n].unpack(ms[:n], parseFn, c.network); err != nil { + return n, err + } + return n, nil +} + +func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) { + for i := range ms { + ms[i].raceRead() + } + hs := make(mmsghdrs, len(ms)) + var marshalFn func(net.Addr) []byte + if c.network != "tcp" { + marshalFn = marshalInetAddr + } + if err := hs.pack(ms, nil, marshalFn); err != nil { + return 0, err + } + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = sendmmsg(s, hs, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Write(fn); err != nil { + return n, err + } + if operr != nil { + return n, os.NewSyscallError("sendmmsg", operr) + } + if err := hs[:n].unpack(ms[:n], nil, ""); err != nil { + return n, err + } + return n, nil +} diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_msg.go b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go new file mode 100644 index 00000000..d5ae3f8e --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go @@ -0,0 +1,78 @@ +// 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package socket + +import ( + "os" + "syscall" +) + +func (c *Conn) recvMsg(m *Message, flags int) error { + m.raceWrite() + var h msghdr + vs := make([]iovec, len(m.Buffers)) + var sa []byte + if c.network != "tcp" { + sa = make([]byte, sizeofSockaddrInet6) + } + h.pack(vs, m.Buffers, m.OOB, sa) + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = recvmsg(s, &h, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Read(fn); err != nil { + return err + } + if operr != nil { + return os.NewSyscallError("recvmsg", operr) + } + if c.network != "tcp" { + var err error + m.Addr, err = parseInetAddr(sa[:], c.network) + if err != nil { + return err + } + } + m.N = n + m.NN = h.controllen() + m.Flags = h.flags() + return nil +} + +func (c *Conn) sendMsg(m *Message, flags int) error { + m.raceRead() + var h msghdr + vs := make([]iovec, len(m.Buffers)) + var sa []byte + if m.Addr != nil { + sa = marshalInetAddr(m.Addr) + } + h.pack(vs, m.Buffers, m.OOB, sa) + var operr error + var n int + fn := func(s uintptr) bool { + n, operr = sendmsg(s, &h, flags) + if operr == syscall.EAGAIN { + return false + } + return true + } + if err := c.c.Write(fn); err != nil { + return err + } + if operr != nil { + return os.NewSyscallError("sendmsg", operr) + } + m.N = n + m.NN = len(m.OOB) + return nil +} diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go new file mode 100644 index 00000000..fe5bb942 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go @@ -0,0 +1,15 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !linux + +package socket + +func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) { + return 0, errNotImplemented +} + +func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) { + return 0, errNotImplemented +} diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go new file mode 100644 index 00000000..b8cea6fe --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go @@ -0,0 +1,15 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package socket + +func (c *Conn) recvMsg(m *Message, flags int) error { + return errNotImplemented +} + +func (c *Conn) sendMsg(m *Message, flags int) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/internal/socket/socket.go b/vendor/golang.org/x/net/internal/socket/socket.go new file mode 100644 index 00000000..23571b8d --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/socket.go @@ -0,0 +1,288 @@ +// 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. + +// Package socket provides a portable interface for socket system +// calls. +package socket // import "golang.org/x/net/internal/socket" + +import ( + "errors" + "net" + "runtime" + "unsafe" +) + +var errNotImplemented = errors.New("not implemented on " + runtime.GOOS + "/" + runtime.GOARCH) + +// An Option represents a sticky socket option. +type Option struct { + Level int // level + Name int // name; must be equal or greater than 1 + Len int // length of value in bytes; must be equal or greater than 1 +} + +// Get reads a value for the option from the kernel. +// It returns the number of bytes written into b. +func (o *Option) Get(c *Conn, b []byte) (int, error) { + if o.Name < 1 || o.Len < 1 { + return 0, errors.New("invalid option") + } + if len(b) < o.Len { + return 0, errors.New("short buffer") + } + return o.get(c, b) +} + +// GetInt returns an integer value for the option. +// +// The Len field of Option must be either 1 or 4. +func (o *Option) GetInt(c *Conn) (int, error) { + if o.Len != 1 && o.Len != 4 { + return 0, errors.New("invalid option") + } + var b []byte + var bb [4]byte + if o.Len == 1 { + b = bb[:1] + } else { + b = bb[:4] + } + n, err := o.get(c, b) + if err != nil { + return 0, err + } + if n != o.Len { + return 0, errors.New("invalid option length") + } + if o.Len == 1 { + return int(b[0]), nil + } + return int(NativeEndian.Uint32(b[:4])), nil +} + +// Set writes the option and value to the kernel. +func (o *Option) Set(c *Conn, b []byte) error { + if o.Name < 1 || o.Len < 1 { + return errors.New("invalid option") + } + if len(b) < o.Len { + return errors.New("short buffer") + } + return o.set(c, b) +} + +// SetInt writes the option and value to the kernel. +// +// The Len field of Option must be either 1 or 4. +func (o *Option) SetInt(c *Conn, v int) error { + if o.Len != 1 && o.Len != 4 { + return errors.New("invalid option") + } + var b []byte + if o.Len == 1 { + b = []byte{byte(v)} + } else { + var bb [4]byte + NativeEndian.PutUint32(bb[:o.Len], uint32(v)) + b = bb[:4] + } + return o.set(c, b) +} + +func controlHeaderLen() int { + return roundup(sizeofCmsghdr) +} + +func controlMessageLen(dataLen int) int { + return roundup(sizeofCmsghdr) + dataLen +} + +// ControlMessageSpace returns the whole length of control message. +func ControlMessageSpace(dataLen int) int { + return roundup(sizeofCmsghdr) + roundup(dataLen) +} + +// A ControlMessage represents the head message in a stream of control +// messages. +// +// A control message comprises of a header, data and a few padding +// fields to conform to the interface to the kernel. +// +// See RFC 3542 for further information. +type ControlMessage []byte + +// Data returns the data field of the control message at the head on +// m. +func (m ControlMessage) Data(dataLen int) []byte { + l := controlHeaderLen() + if len(m) < l || len(m) < l+dataLen { + return nil + } + return m[l : l+dataLen] +} + +// Next returns the control message at the next on m. +// +// Next works only for standard control messages. +func (m ControlMessage) Next(dataLen int) ControlMessage { + l := ControlMessageSpace(dataLen) + if len(m) < l { + return nil + } + return m[l:] +} + +// MarshalHeader marshals the header fields of the control message at +// the head on m. +func (m ControlMessage) MarshalHeader(lvl, typ, dataLen int) error { + if len(m) < controlHeaderLen() { + return errors.New("short message") + } + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + h.set(controlMessageLen(dataLen), lvl, typ) + return nil +} + +// ParseHeader parses and returns the header fields of the control +// message at the head on m. +func (m ControlMessage) ParseHeader() (lvl, typ, dataLen int, err error) { + l := controlHeaderLen() + if len(m) < l { + return 0, 0, 0, errors.New("short message") + } + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + return h.lvl(), h.typ(), int(uint64(h.len()) - uint64(l)), nil +} + +// Marshal marshals the control message at the head on m, and returns +// the next control message. +func (m ControlMessage) Marshal(lvl, typ int, data []byte) (ControlMessage, error) { + l := len(data) + if len(m) < ControlMessageSpace(l) { + return nil, errors.New("short message") + } + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + h.set(controlMessageLen(l), lvl, typ) + if l > 0 { + copy(m.Data(l), data) + } + return m.Next(l), nil +} + +// Parse parses m as a single or multiple control messages. +// +// Parse works for both standard and compatible messages. +func (m ControlMessage) Parse() ([]ControlMessage, error) { + var ms []ControlMessage + for len(m) >= controlHeaderLen() { + h := (*cmsghdr)(unsafe.Pointer(&m[0])) + l := h.len() + if l <= 0 { + return nil, errors.New("invalid header length") + } + if uint64(l) < uint64(controlHeaderLen()) { + return nil, errors.New("invalid message length") + } + if uint64(l) > uint64(len(m)) { + return nil, errors.New("short buffer") + } + // On message reception: + // + // |<- ControlMessageSpace --------------->| + // |<- controlMessageLen ---------->| | + // |<- controlHeaderLen ->| | | + // +---------------+------+---------+------+ + // | Header | PadH | Data | PadD | + // +---------------+------+---------+------+ + // + // On compatible message reception: + // + // | ... |<- controlMessageLen ----------->| + // | ... |<- controlHeaderLen ->| | + // +-----+---------------+------+----------+ + // | ... | Header | PadH | Data | + // +-----+---------------+------+----------+ + ms = append(ms, ControlMessage(m[:l])) + ll := l - controlHeaderLen() + if len(m) >= ControlMessageSpace(ll) { + m = m[ControlMessageSpace(ll):] + } else { + m = m[controlMessageLen(ll):] + } + } + return ms, nil +} + +// NewControlMessage returns a new stream of control messages. +func NewControlMessage(dataLen []int) ControlMessage { + var l int + for i := range dataLen { + l += ControlMessageSpace(dataLen[i]) + } + return make([]byte, l) +} + +// A Message represents an IO message. +type Message struct { + // When writing, the Buffers field must contain at least one + // byte to write. + // When reading, the Buffers field will always contain a byte + // to read. + Buffers [][]byte + + // OOB contains protocol-specific control or miscellaneous + // ancillary data known as out-of-band data. + OOB []byte + + // Addr specifies a destination address when writing. + // It can be nil when the underlying protocol of the raw + // connection uses connection-oriented communication. + // After a successful read, it may contain the source address + // on the received packet. + Addr net.Addr + + N int // # of bytes read or written from/to Buffers + NN int // # of bytes read or written from/to OOB + Flags int // protocol-specific information on the received message +} + +// RecvMsg wraps recvmsg system call. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +func (c *Conn) RecvMsg(m *Message, flags int) error { + return c.recvMsg(m, flags) +} + +// SendMsg wraps sendmsg system call. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +func (c *Conn) SendMsg(m *Message, flags int) error { + return c.sendMsg(m, flags) +} + +// RecvMsgs wraps recvmmsg system call. +// +// It returns the number of processed messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// Only Linux supports this. +func (c *Conn) RecvMsgs(ms []Message, flags int) (int, error) { + return c.recvMsgs(ms, flags) +} + +// SendMsgs wraps sendmmsg system call. +// +// It returns the number of processed messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// Only Linux supports this. +func (c *Conn) SendMsgs(ms []Message, flags int) (int, error) { + return c.sendMsgs(ms, flags) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys.go b/vendor/golang.org/x/net/internal/socket/sys.go new file mode 100644 index 00000000..ee492ba8 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys.go @@ -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. + +package socket + +import ( + "encoding/binary" + "unsafe" +) + +var ( + // NativeEndian is the machine native endian implementation of + // ByteOrder. + NativeEndian binary.ByteOrder + + kernelAlign int +) + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + NativeEndian = binary.LittleEndian + } else { + NativeEndian = binary.BigEndian + } + kernelAlign = probeProtocolStack() +} + +func roundup(l int) int { + return (l + kernelAlign - 1) &^ (kernelAlign - 1) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_bsd.go b/vendor/golang.org/x/net/internal/socket/sys_bsd.go new file mode 100644 index 00000000..d432835b --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_bsd.go @@ -0,0 +1,15 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd openbsd + +package socket + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errNotImplemented +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errNotImplemented +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go b/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go new file mode 100644 index 00000000..b4f41b55 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_bsdvar.go @@ -0,0 +1,23 @@ +// 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. + +// +build aix freebsd netbsd openbsd + +package socket + +import ( + "runtime" + "unsafe" +) + +func probeProtocolStack() int { + if (runtime.GOOS == "netbsd" || runtime.GOOS == "openbsd") && runtime.GOARCH == "arm" { + return 8 + } + if runtime.GOOS == "aix" { + return 1 + } + var p uintptr + return int(unsafe.Sizeof(p)) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_const_unix.go b/vendor/golang.org/x/net/internal/socket/sys_const_unix.go new file mode 100644 index 00000000..43797d6e --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_const_unix.go @@ -0,0 +1,17 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package socket + +import "golang.org/x/sys/unix" + +const ( + sysAF_UNSPEC = unix.AF_UNSPEC + sysAF_INET = unix.AF_INET + sysAF_INET6 = unix.AF_INET6 + + sysSOCK_RAW = unix.SOCK_RAW +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_darwin.go b/vendor/golang.org/x/net/internal/socket/sys_darwin.go new file mode 100644 index 00000000..b17d223b --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_darwin.go @@ -0,0 +1,7 @@ +// 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. + +package socket + +func probeProtocolStack() int { return 4 } diff --git a/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go b/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go new file mode 100644 index 00000000..ed0448fe --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_dragonfly.go @@ -0,0 +1,32 @@ +// 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. + +package socket + +import ( + "sync" + "syscall" + "unsafe" +) + +// See version list in https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/sys/sys/param.h +var ( + osreldateOnce sync.Once + osreldate uint32 +) + +// First __DragonFly_version after September 2019 ABI changes +// http://lists.dragonflybsd.org/pipermail/users/2019-September/358280.html +const _dragonflyABIChangeVersion = 500705 + +func probeProtocolStack() int { + osreldateOnce.Do(func() { osreldate, _ = syscall.SysctlUint32("kern.osreldate") }) + var p uintptr + if int(unsafe.Sizeof(p)) == 8 && osreldate >= _dragonflyABIChangeVersion { + return int(unsafe.Sizeof(p)) + } + // 64-bit Dragonfly before the September 2019 ABI changes still requires + // 32-bit aligned access to network subsystem. + return 4 +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go b/vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go new file mode 100644 index 00000000..02d2b3cc --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go @@ -0,0 +1,33 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.12 + +package socket + +import ( + "syscall" + "unsafe" +) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall(syscall.SYS_RECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall(syscall.SYS_SENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) + return int(n), errnoErr(errno) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_linkname.go b/vendor/golang.org/x/net/internal/socket/sys_linkname.go new file mode 100644 index 00000000..61c3f38a --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linkname.go @@ -0,0 +1,42 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix go1.12,darwin + +package socket + +import ( + "syscall" + "unsafe" +) + +//go:linkname syscall_getsockopt syscall.getsockopt +func syscall_getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *uint32) error + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + err := syscall_getsockopt(int(s), level, name, unsafe.Pointer(&b[0]), &l) + return int(l), err +} + +//go:linkname syscall_setsockopt syscall.setsockopt +func syscall_setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error + +func setsockopt(s uintptr, level, name int, b []byte) error { + return syscall_setsockopt(int(s), level, name, unsafe.Pointer(&b[0]), uintptr(len(b))) +} + +//go:linkname syscall_recvmsg syscall.recvmsg +func syscall_recvmsg(s int, msg *syscall.Msghdr, flags int) (n int, err error) + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + return syscall_recvmsg(int(s), (*syscall.Msghdr)(unsafe.Pointer(h)), flags) +} + +//go:linkname syscall_sendmsg syscall.sendmsg +func syscall_sendmsg(s int, msg *syscall.Msghdr, flags int) (n int, err error) + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + return syscall_sendmsg(int(s), (*syscall.Msghdr)(unsafe.Pointer(h)), flags) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux.go b/vendor/golang.org/x/net/internal/socket/sys_linux.go new file mode 100644 index 00000000..1559521e --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux.go @@ -0,0 +1,27 @@ +// 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. + +// +build linux,!s390x,!386 + +package socket + +import ( + "syscall" + "unsafe" +) + +func probeProtocolStack() int { + var p uintptr + return int(unsafe.Sizeof(p)) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_386.go b/vendor/golang.org/x/net/internal/socket/sys_linux_386.go new file mode 100644 index 00000000..235b2cc0 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_386.go @@ -0,0 +1,55 @@ +// 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. + +package socket + +import ( + "syscall" + "unsafe" +) + +func probeProtocolStack() int { return 4 } + +const ( + sysSETSOCKOPT = 0xe + sysGETSOCKOPT = 0xf + sysSENDMSG = 0x10 + sysRECVMSG = 0x11 + sysRECVMMSG = 0x13 + sysSENDMMSG = 0x14 +) + +func socketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) +func rawsocketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, errno := socketcall(sysGETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, errno := socketcall(sysSETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_386.s b/vendor/golang.org/x/net/internal/socket/sys_linux_386.s new file mode 100644 index 00000000..93e7d75e --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_386.s @@ -0,0 +1,11 @@ +// 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. + +#include "textflag.h" + +TEXT ·socketcall(SB),NOSPLIT,$0-36 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 + JMP syscall·rawsocketcall(SB) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go new file mode 100644 index 00000000..9decee2e --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go @@ -0,0 +1,10 @@ +// 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. + +package socket + +const ( + sysRECVMMSG = 0x12b + sysSENDMMSG = 0x133 +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go b/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go new file mode 100644 index 00000000..d753b436 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go @@ -0,0 +1,10 @@ +// 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. + +package socket + +const ( + sysRECVMMSG = 0x16d + sysSENDMMSG = 0x176 +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go new file mode 100644 index 00000000..b6708943 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go @@ -0,0 +1,10 @@ +// 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. + +package socket + +const ( + sysRECVMMSG = 0xf3 + sysSENDMMSG = 0x10d +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go b/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go new file mode 100644 index 00000000..9c0d7401 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_mips.go @@ -0,0 +1,10 @@ +// 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. + +package socket + +const ( + sysRECVMMSG = 0x10ef + sysSENDMMSG = 0x10f7 +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go new file mode 100644 index 00000000..071a4aba --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go @@ -0,0 +1,10 @@ +// 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. + +package socket + +const ( + sysRECVMMSG = 0x14ae + sysSENDMMSG = 0x14b6 +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go b/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go new file mode 100644 index 00000000..071a4aba --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go @@ -0,0 +1,10 @@ +// 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. + +package socket + +const ( + sysRECVMMSG = 0x14ae + sysSENDMMSG = 0x14b6 +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go b/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go new file mode 100644 index 00000000..9c0d7401 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go @@ -0,0 +1,10 @@ +// 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. + +package socket + +const ( + sysRECVMMSG = 0x10ef + sysSENDMMSG = 0x10f7 +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go new file mode 100644 index 00000000..21c1e3f0 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go @@ -0,0 +1,10 @@ +// 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. + +package socket + +const ( + sysRECVMMSG = 0x157 + sysSENDMMSG = 0x15d +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go b/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go new file mode 100644 index 00000000..21c1e3f0 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go @@ -0,0 +1,10 @@ +// 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. + +package socket + +const ( + sysRECVMMSG = 0x157 + sysSENDMMSG = 0x15d +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go new file mode 100644 index 00000000..64f69f1d --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go @@ -0,0 +1,12 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build riscv64 + +package socket + +const ( + sysRECVMMSG = 0xf3 + sysSENDMMSG = 0x10d +) diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go b/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go new file mode 100644 index 00000000..327979ef --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go @@ -0,0 +1,55 @@ +// 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. + +package socket + +import ( + "syscall" + "unsafe" +) + +func probeProtocolStack() int { return 8 } + +const ( + sysSETSOCKOPT = 0xe + sysGETSOCKOPT = 0xf + sysSENDMSG = 0x10 + sysRECVMSG = 0x11 + sysRECVMMSG = 0x13 + sysSENDMMSG = 0x14 +) + +func socketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) +func rawsocketcall(call, a0, a1, a2, a3, a4, a5 uintptr) (uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, errno := socketcall(sysGETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, errno := socketcall(sysSETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, errno := socketcall(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s b/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s new file mode 100644 index 00000000..06d75628 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s @@ -0,0 +1,11 @@ +// 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. + +#include "textflag.h" + +TEXT ·socketcall(SB),NOSPLIT,$0-72 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-72 + JMP syscall·rawsocketcall(SB) diff --git a/vendor/golang.org/x/net/internal/socket/sys_netbsd.go b/vendor/golang.org/x/net/internal/socket/sys_netbsd.go new file mode 100644 index 00000000..431851c1 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_netbsd.go @@ -0,0 +1,25 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package socket + +import ( + "syscall" + "unsafe" +) + +const ( + sysRECVMMSG = 0x1db + sysSENDMMSG = 0x1dc +) + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysRECVMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall6(sysSENDMMSG, s, uintptr(unsafe.Pointer(&hs[0])), uintptr(len(hs)), uintptr(flags), 0, 0) + return int(n), errnoErr(errno) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_posix.go b/vendor/golang.org/x/net/internal/socket/sys_posix.go new file mode 100644 index 00000000..22eae809 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_posix.go @@ -0,0 +1,183 @@ +// 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package socket + +import ( + "encoding/binary" + "errors" + "net" + "runtime" + "strconv" + "sync" + "time" +) + +func marshalInetAddr(a net.Addr) []byte { + switch a := a.(type) { + case *net.TCPAddr: + return marshalSockaddr(a.IP, a.Port, a.Zone) + case *net.UDPAddr: + return marshalSockaddr(a.IP, a.Port, a.Zone) + case *net.IPAddr: + return marshalSockaddr(a.IP, 0, a.Zone) + default: + return nil + } +} + +func marshalSockaddr(ip net.IP, port int, zone string) []byte { + if ip4 := ip.To4(); ip4 != nil { + b := make([]byte, sizeofSockaddrInet) + switch runtime.GOOS { + case "android", "illumos", "linux", "solaris", "windows": + NativeEndian.PutUint16(b[:2], uint16(sysAF_INET)) + default: + b[0] = sizeofSockaddrInet + b[1] = sysAF_INET + } + binary.BigEndian.PutUint16(b[2:4], uint16(port)) + copy(b[4:8], ip4) + return b + } + if ip6 := ip.To16(); ip6 != nil && ip.To4() == nil { + b := make([]byte, sizeofSockaddrInet6) + switch runtime.GOOS { + case "android", "illumos", "linux", "solaris", "windows": + NativeEndian.PutUint16(b[:2], uint16(sysAF_INET6)) + default: + b[0] = sizeofSockaddrInet6 + b[1] = sysAF_INET6 + } + binary.BigEndian.PutUint16(b[2:4], uint16(port)) + copy(b[8:24], ip6) + if zone != "" { + NativeEndian.PutUint32(b[24:28], uint32(zoneCache.index(zone))) + } + return b + } + return nil +} + +func parseInetAddr(b []byte, network string) (net.Addr, error) { + if len(b) < 2 { + return nil, errors.New("invalid address") + } + var af int + switch runtime.GOOS { + case "android", "illumos", "linux", "solaris", "windows": + af = int(NativeEndian.Uint16(b[:2])) + default: + af = int(b[1]) + } + var ip net.IP + var zone string + if af == sysAF_INET { + if len(b) < sizeofSockaddrInet { + return nil, errors.New("short address") + } + ip = make(net.IP, net.IPv4len) + copy(ip, b[4:8]) + } + if af == sysAF_INET6 { + if len(b) < sizeofSockaddrInet6 { + return nil, errors.New("short address") + } + ip = make(net.IP, net.IPv6len) + copy(ip, b[8:24]) + if id := int(NativeEndian.Uint32(b[24:28])); id > 0 { + zone = zoneCache.name(id) + } + } + switch network { + case "tcp", "tcp4", "tcp6": + return &net.TCPAddr{IP: ip, Port: int(binary.BigEndian.Uint16(b[2:4])), Zone: zone}, nil + case "udp", "udp4", "udp6": + return &net.UDPAddr{IP: ip, Port: int(binary.BigEndian.Uint16(b[2:4])), Zone: zone}, nil + default: + return &net.IPAddr{IP: ip, Zone: zone}, nil + } +} + +// An ipv6ZoneCache represents a cache holding partial network +// interface information. It is used for reducing the cost of IPv6 +// addressing scope zone resolution. +// +// Multiple names sharing the index are managed by first-come +// first-served basis for consistency. +type ipv6ZoneCache struct { + sync.RWMutex // guard the following + lastFetched time.Time // last time routing information was fetched + toIndex map[string]int // interface name to its index + toName map[int]string // interface index to its name +} + +var zoneCache = ipv6ZoneCache{ + toIndex: make(map[string]int), + toName: make(map[int]string), +} + +// update refreshes the network interface information if the cache was last +// updated more than 1 minute ago, or if force is set. It returns whether the +// cache was updated. +func (zc *ipv6ZoneCache) update(ift []net.Interface, force bool) (updated bool) { + zc.Lock() + defer zc.Unlock() + now := time.Now() + if !force && zc.lastFetched.After(now.Add(-60*time.Second)) { + return false + } + zc.lastFetched = now + if len(ift) == 0 { + var err error + if ift, err = net.Interfaces(); err != nil { + return false + } + } + zc.toIndex = make(map[string]int, len(ift)) + zc.toName = make(map[int]string, len(ift)) + for _, ifi := range ift { + zc.toIndex[ifi.Name] = ifi.Index + if _, ok := zc.toName[ifi.Index]; !ok { + zc.toName[ifi.Index] = ifi.Name + } + } + return true +} + +func (zc *ipv6ZoneCache) name(zone int) string { + updated := zoneCache.update(nil, false) + zoneCache.RLock() + name, ok := zoneCache.toName[zone] + zoneCache.RUnlock() + if !ok && !updated { + zoneCache.update(nil, true) + zoneCache.RLock() + name, ok = zoneCache.toName[zone] + zoneCache.RUnlock() + } + if !ok { // last resort + name = strconv.Itoa(zone) + } + return name +} + +func (zc *ipv6ZoneCache) index(zone string) int { + updated := zoneCache.update(nil, false) + zoneCache.RLock() + index, ok := zoneCache.toIndex[zone] + zoneCache.RUnlock() + if !ok && !updated { + zoneCache.update(nil, true) + zoneCache.RLock() + index, ok = zoneCache.toIndex[zone] + zoneCache.RUnlock() + } + if !ok { // last resort + index, _ = strconv.Atoi(zone) + } + return index +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_solaris.go b/vendor/golang.org/x/net/internal/socket/sys_solaris.go new file mode 100644 index 00000000..66b55478 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_solaris.go @@ -0,0 +1,70 @@ +// 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. + +package socket + +import ( + "runtime" + "syscall" + "unsafe" +) + +func probeProtocolStack() int { + switch runtime.GOARCH { + case "amd64": + return 4 + default: + var p uintptr + return int(unsafe.Sizeof(p)) + } +} + +//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" +//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so" +//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so" + +//go:linkname procGetsockopt libc___xnet_getsockopt +//go:linkname procSetsockopt libc_setsockopt +//go:linkname procRecvmsg libc___xnet_recvmsg +//go:linkname procSendmsg libc___xnet_sendmsg + +var ( + procGetsockopt uintptr + procSetsockopt uintptr + procRecvmsg uintptr + procSendmsg uintptr +) + +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) +func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procGetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procRecvmsg)), 3, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSendmsg)), 3, s, uintptr(unsafe.Pointer(h)), uintptr(flags), 0, 0, 0) + return int(n), errnoErr(errno) +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errNotImplemented +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errNotImplemented +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s b/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s new file mode 100644 index 00000000..a18ac5ed --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s @@ -0,0 +1,11 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) + +TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSysvicall6(SB) diff --git a/vendor/golang.org/x/net/internal/socket/sys_stub.go b/vendor/golang.org/x/net/internal/socket/sys_stub.go new file mode 100644 index 00000000..0f617426 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_stub.go @@ -0,0 +1,63 @@ +// 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package socket + +import ( + "net" + "runtime" + "unsafe" +) + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0xa + + sysSOCK_RAW = 0x3 +) + +func probeProtocolStack() int { + switch runtime.GOARCH { + case "amd64p32", "mips64p32": + return 4 + default: + var p uintptr + return int(unsafe.Sizeof(p)) + } +} + +func marshalInetAddr(ip net.IP, port int, zone string) []byte { + return nil +} + +func parseInetAddr(b []byte, network string) (net.Addr, error) { + return nil, errNotImplemented +} + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + return 0, errNotImplemented +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + return errNotImplemented +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errNotImplemented +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errNotImplemented +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errNotImplemented +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errNotImplemented +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_unix.go b/vendor/golang.org/x/net/internal/socket/sys_unix.go new file mode 100644 index 00000000..0eb71283 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_unix.go @@ -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. + +// +build dragonfly freebsd linux,!s390x,!386 netbsd openbsd + +package socket + +import ( + "syscall" + "unsafe" +) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall(syscall.SYS_RECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall(syscall.SYS_SENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) + return int(n), errnoErr(errno) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_windows.go b/vendor/golang.org/x/net/internal/socket/sys_windows.go new file mode 100644 index 00000000..d556a446 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_windows.go @@ -0,0 +1,71 @@ +// 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. + +package socket + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +func probeProtocolStack() int { + var p uintptr + return int(unsafe.Sizeof(p)) +} + +const ( + sysAF_UNSPEC = windows.AF_UNSPEC + sysAF_INET = windows.AF_INET + sysAF_INET6 = windows.AF_INET6 + + sysSOCK_RAW = windows.SOCK_RAW +) + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + err := syscall.Getsockopt(syscall.Handle(s), int32(level), int32(name), (*byte)(unsafe.Pointer(&b[0])), (*int32)(unsafe.Pointer(&l))) + return int(l), err +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + return syscall.Setsockopt(syscall.Handle(s), int32(level), int32(name), (*byte)(unsafe.Pointer(&b[0])), int32(len(b))) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errNotImplemented +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + return 0, errNotImplemented +} + +func recvmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errNotImplemented +} + +func sendmmsg(s uintptr, hs []mmsghdr, flags int) (int, error) { + return 0, errNotImplemented +} diff --git a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go new file mode 100644 index 00000000..e740c8f0 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go @@ -0,0 +1,60 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_aix.go + +// Added for go1.11 compatibility +// +build aix + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go new file mode 100644 index 00000000..083bda51 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go @@ -0,0 +1,51 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_darwin.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go new file mode 100644 index 00000000..55c6c9f5 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go @@ -0,0 +1,53 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_darwin.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go new file mode 100644 index 00000000..083bda51 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go @@ -0,0 +1,51 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_darwin.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go new file mode 100644 index 00000000..55c6c9f5 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go @@ -0,0 +1,53 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_darwin.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go new file mode 100644 index 00000000..8b7d161d --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go @@ -0,0 +1,53 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_dragonfly.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go new file mode 100644 index 00000000..3e71ff57 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go @@ -0,0 +1,51 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go new file mode 100644 index 00000000..238d90de --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go @@ -0,0 +1,53 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go new file mode 100644 index 00000000..3e71ff57 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go @@ -0,0 +1,51 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go new file mode 100644 index 00000000..238d90de --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go @@ -0,0 +1,53 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go new file mode 100644 index 00000000..d33025b7 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go @@ -0,0 +1,54 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go new file mode 100644 index 00000000..b20d2167 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go @@ -0,0 +1,57 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go new file mode 100644 index 00000000..1bb10a42 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go @@ -0,0 +1,55 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go new file mode 100644 index 00000000..7f6e8a7f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go @@ -0,0 +1,58 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go new file mode 100644 index 00000000..1bb10a42 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go @@ -0,0 +1,55 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go new file mode 100644 index 00000000..7f6e8a7f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go @@ -0,0 +1,58 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go new file mode 100644 index 00000000..7f6e8a7f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go @@ -0,0 +1,58 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go new file mode 100644 index 00000000..1bb10a42 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go @@ -0,0 +1,55 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go new file mode 100644 index 00000000..7f6e8a7f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go @@ -0,0 +1,58 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go new file mode 100644 index 00000000..7f6e8a7f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go @@ -0,0 +1,58 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go new file mode 100644 index 00000000..f12a1d76 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go @@ -0,0 +1,59 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +// +build riscv64 + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_0 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go new file mode 100644 index 00000000..7f6e8a7f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go @@ -0,0 +1,58 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x38 + + sizeofCmsghdr = 0x10 + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go new file mode 100644 index 00000000..7e258cec --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go @@ -0,0 +1,57 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_netbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go new file mode 100644 index 00000000..b3f9c0d7 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go @@ -0,0 +1,60 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_netbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go new file mode 100644 index 00000000..7e258cec --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go @@ -0,0 +1,57 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_netbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go new file mode 100644 index 00000000..da26ef01 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go @@ -0,0 +1,59 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_netbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type mmsghdr struct { + Hdr msghdr + Len uint32 + Pad_cgo_0 [4]byte +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go new file mode 100644 index 00000000..73655a14 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go @@ -0,0 +1,51 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_openbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go new file mode 100644 index 00000000..0a4de80f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go @@ -0,0 +1,53 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_openbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go new file mode 100644 index 00000000..73655a14 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go @@ -0,0 +1,51 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_openbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint32 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Iov *iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x8 + sizeofMsghdr = 0x1c + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go new file mode 100644 index 00000000..0a4de80f --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go @@ -0,0 +1,53 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_openbsd.go + +package socket + +type iovec struct { + Base *byte + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen uint32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go new file mode 100644 index 00000000..353cd5fb --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go @@ -0,0 +1,52 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_solaris.go + +package socket + +type iovec struct { + Base *int8 + Len uint64 +} + +type msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Accrights *int8 + Accrightslen int32 + Pad_cgo_2 [4]byte +} + +type cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +const ( + sizeofIovec = 0x10 + sizeofMsghdr = 0x30 + sizeofCmsghdr = 0xc + + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x20 +) diff --git a/vendor/golang.org/x/net/internal/timeseries/timeseries.go b/vendor/golang.org/x/net/internal/timeseries/timeseries.go new file mode 100644 index 00000000..dc5225b6 --- /dev/null +++ b/vendor/golang.org/x/net/internal/timeseries/timeseries.go @@ -0,0 +1,525 @@ +// 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. + +// Package timeseries implements a time series structure for stats collection. +package timeseries // import "golang.org/x/net/internal/timeseries" + +import ( + "fmt" + "log" + "time" +) + +const ( + timeSeriesNumBuckets = 64 + minuteHourSeriesNumBuckets = 60 +) + +var timeSeriesResolutions = []time.Duration{ + 1 * time.Second, + 10 * time.Second, + 1 * time.Minute, + 10 * time.Minute, + 1 * time.Hour, + 6 * time.Hour, + 24 * time.Hour, // 1 day + 7 * 24 * time.Hour, // 1 week + 4 * 7 * 24 * time.Hour, // 4 weeks + 16 * 7 * 24 * time.Hour, // 16 weeks +} + +var minuteHourSeriesResolutions = []time.Duration{ + 1 * time.Second, + 1 * time.Minute, +} + +// An Observable is a kind of data that can be aggregated in a time series. +type Observable interface { + Multiply(ratio float64) // Multiplies the data in self by a given ratio + Add(other Observable) // Adds the data from a different observation to self + Clear() // Clears the observation so it can be reused. + CopyFrom(other Observable) // Copies the contents of a given observation to self +} + +// Float attaches the methods of Observable to a float64. +type Float float64 + +// NewFloat returns a Float. +func NewFloat() Observable { + f := Float(0) + return &f +} + +// String returns the float as a string. +func (f *Float) String() string { return fmt.Sprintf("%g", f.Value()) } + +// Value returns the float's value. +func (f *Float) Value() float64 { return float64(*f) } + +func (f *Float) Multiply(ratio float64) { *f *= Float(ratio) } + +func (f *Float) Add(other Observable) { + o := other.(*Float) + *f += *o +} + +func (f *Float) Clear() { *f = 0 } + +func (f *Float) CopyFrom(other Observable) { + o := other.(*Float) + *f = *o +} + +// A Clock tells the current time. +type Clock interface { + Time() time.Time +} + +type defaultClock int + +var defaultClockInstance defaultClock + +func (defaultClock) Time() time.Time { return time.Now() } + +// Information kept per level. Each level consists of a circular list of +// observations. The start of the level may be derived from end and the +// len(buckets) * sizeInMillis. +type tsLevel struct { + oldest int // index to oldest bucketed Observable + newest int // index to newest bucketed Observable + end time.Time // end timestamp for this level + size time.Duration // duration of the bucketed Observable + buckets []Observable // collections of observations + provider func() Observable // used for creating new Observable +} + +func (l *tsLevel) Clear() { + l.oldest = 0 + l.newest = len(l.buckets) - 1 + l.end = time.Time{} + for i := range l.buckets { + if l.buckets[i] != nil { + l.buckets[i].Clear() + l.buckets[i] = nil + } + } +} + +func (l *tsLevel) InitLevel(size time.Duration, numBuckets int, f func() Observable) { + l.size = size + l.provider = f + l.buckets = make([]Observable, numBuckets) +} + +// Keeps a sequence of levels. Each level is responsible for storing data at +// a given resolution. For example, the first level stores data at a one +// minute resolution while the second level stores data at a one hour +// resolution. + +// Each level is represented by a sequence of buckets. Each bucket spans an +// interval equal to the resolution of the level. New observations are added +// to the last bucket. +type timeSeries struct { + provider func() Observable // make more Observable + numBuckets int // number of buckets in each level + levels []*tsLevel // levels of bucketed Observable + lastAdd time.Time // time of last Observable tracked + total Observable // convenient aggregation of all Observable + clock Clock // Clock for getting current time + pending Observable // observations not yet bucketed + pendingTime time.Time // what time are we keeping in pending + dirty bool // if there are pending observations +} + +// init initializes a level according to the supplied criteria. +func (ts *timeSeries) init(resolutions []time.Duration, f func() Observable, numBuckets int, clock Clock) { + ts.provider = f + ts.numBuckets = numBuckets + ts.clock = clock + ts.levels = make([]*tsLevel, len(resolutions)) + + for i := range resolutions { + if i > 0 && resolutions[i-1] >= resolutions[i] { + log.Print("timeseries: resolutions must be monotonically increasing") + break + } + newLevel := new(tsLevel) + newLevel.InitLevel(resolutions[i], ts.numBuckets, ts.provider) + ts.levels[i] = newLevel + } + + ts.Clear() +} + +// Clear removes all observations from the time series. +func (ts *timeSeries) Clear() { + ts.lastAdd = time.Time{} + ts.total = ts.resetObservation(ts.total) + ts.pending = ts.resetObservation(ts.pending) + ts.pendingTime = time.Time{} + ts.dirty = false + + for i := range ts.levels { + ts.levels[i].Clear() + } +} + +// Add records an observation at the current time. +func (ts *timeSeries) Add(observation Observable) { + ts.AddWithTime(observation, ts.clock.Time()) +} + +// AddWithTime records an observation at the specified time. +func (ts *timeSeries) AddWithTime(observation Observable, t time.Time) { + + smallBucketDuration := ts.levels[0].size + + if t.After(ts.lastAdd) { + ts.lastAdd = t + } + + if t.After(ts.pendingTime) { + ts.advance(t) + ts.mergePendingUpdates() + ts.pendingTime = ts.levels[0].end + ts.pending.CopyFrom(observation) + ts.dirty = true + } else if t.After(ts.pendingTime.Add(-1 * smallBucketDuration)) { + // The observation is close enough to go into the pending bucket. + // This compensates for clock skewing and small scheduling delays + // by letting the update stay in the fast path. + ts.pending.Add(observation) + ts.dirty = true + } else { + ts.mergeValue(observation, t) + } +} + +// mergeValue inserts the observation at the specified time in the past into all levels. +func (ts *timeSeries) mergeValue(observation Observable, t time.Time) { + for _, level := range ts.levels { + index := (ts.numBuckets - 1) - int(level.end.Sub(t)/level.size) + if 0 <= index && index < ts.numBuckets { + bucketNumber := (level.oldest + index) % ts.numBuckets + if level.buckets[bucketNumber] == nil { + level.buckets[bucketNumber] = level.provider() + } + level.buckets[bucketNumber].Add(observation) + } + } + ts.total.Add(observation) +} + +// mergePendingUpdates applies the pending updates into all levels. +func (ts *timeSeries) mergePendingUpdates() { + if ts.dirty { + ts.mergeValue(ts.pending, ts.pendingTime) + ts.pending = ts.resetObservation(ts.pending) + ts.dirty = false + } +} + +// advance cycles the buckets at each level until the latest bucket in +// each level can hold the time specified. +func (ts *timeSeries) advance(t time.Time) { + if !t.After(ts.levels[0].end) { + return + } + for i := 0; i < len(ts.levels); i++ { + level := ts.levels[i] + if !level.end.Before(t) { + break + } + + // If the time is sufficiently far, just clear the level and advance + // directly. + if !t.Before(level.end.Add(level.size * time.Duration(ts.numBuckets))) { + for _, b := range level.buckets { + ts.resetObservation(b) + } + level.end = time.Unix(0, (t.UnixNano()/level.size.Nanoseconds())*level.size.Nanoseconds()) + } + + for t.After(level.end) { + level.end = level.end.Add(level.size) + level.newest = level.oldest + level.oldest = (level.oldest + 1) % ts.numBuckets + ts.resetObservation(level.buckets[level.newest]) + } + + t = level.end + } +} + +// Latest returns the sum of the num latest buckets from the level. +func (ts *timeSeries) Latest(level, num int) Observable { + now := ts.clock.Time() + if ts.levels[0].end.Before(now) { + ts.advance(now) + } + + ts.mergePendingUpdates() + + result := ts.provider() + l := ts.levels[level] + index := l.newest + + for i := 0; i < num; i++ { + if l.buckets[index] != nil { + result.Add(l.buckets[index]) + } + if index == 0 { + index = ts.numBuckets + } + index-- + } + + return result +} + +// LatestBuckets returns a copy of the num latest buckets from level. +func (ts *timeSeries) LatestBuckets(level, num int) []Observable { + if level < 0 || level > len(ts.levels) { + log.Print("timeseries: bad level argument: ", level) + return nil + } + if num < 0 || num >= ts.numBuckets { + log.Print("timeseries: bad num argument: ", num) + return nil + } + + results := make([]Observable, num) + now := ts.clock.Time() + if ts.levels[0].end.Before(now) { + ts.advance(now) + } + + ts.mergePendingUpdates() + + l := ts.levels[level] + index := l.newest + + for i := 0; i < num; i++ { + result := ts.provider() + results[i] = result + if l.buckets[index] != nil { + result.CopyFrom(l.buckets[index]) + } + + if index == 0 { + index = ts.numBuckets + } + index -= 1 + } + return results +} + +// ScaleBy updates observations by scaling by factor. +func (ts *timeSeries) ScaleBy(factor float64) { + for _, l := range ts.levels { + for i := 0; i < ts.numBuckets; i++ { + l.buckets[i].Multiply(factor) + } + } + + ts.total.Multiply(factor) + ts.pending.Multiply(factor) +} + +// Range returns the sum of observations added over the specified time range. +// If start or finish times don't fall on bucket boundaries of the same +// level, then return values are approximate answers. +func (ts *timeSeries) Range(start, finish time.Time) Observable { + return ts.ComputeRange(start, finish, 1)[0] +} + +// Recent returns the sum of observations from the last delta. +func (ts *timeSeries) Recent(delta time.Duration) Observable { + now := ts.clock.Time() + return ts.Range(now.Add(-delta), now) +} + +// Total returns the total of all observations. +func (ts *timeSeries) Total() Observable { + ts.mergePendingUpdates() + return ts.total +} + +// ComputeRange computes a specified number of values into a slice using +// the observations recorded over the specified time period. The return +// values are approximate if the start or finish times don't fall on the +// bucket boundaries at the same level or if the number of buckets spanning +// the range is not an integral multiple of num. +func (ts *timeSeries) ComputeRange(start, finish time.Time, num int) []Observable { + if start.After(finish) { + log.Printf("timeseries: start > finish, %v>%v", start, finish) + return nil + } + + if num < 0 { + log.Printf("timeseries: num < 0, %v", num) + return nil + } + + results := make([]Observable, num) + + for _, l := range ts.levels { + if !start.Before(l.end.Add(-l.size * time.Duration(ts.numBuckets))) { + ts.extract(l, start, finish, num, results) + return results + } + } + + // Failed to find a level that covers the desired range. So just + // extract from the last level, even if it doesn't cover the entire + // desired range. + ts.extract(ts.levels[len(ts.levels)-1], start, finish, num, results) + + return results +} + +// RecentList returns the specified number of values in slice over the most +// recent time period of the specified range. +func (ts *timeSeries) RecentList(delta time.Duration, num int) []Observable { + if delta < 0 { + return nil + } + now := ts.clock.Time() + return ts.ComputeRange(now.Add(-delta), now, num) +} + +// extract returns a slice of specified number of observations from a given +// level over a given range. +func (ts *timeSeries) extract(l *tsLevel, start, finish time.Time, num int, results []Observable) { + ts.mergePendingUpdates() + + srcInterval := l.size + dstInterval := finish.Sub(start) / time.Duration(num) + dstStart := start + srcStart := l.end.Add(-srcInterval * time.Duration(ts.numBuckets)) + + srcIndex := 0 + + // Where should scanning start? + if dstStart.After(srcStart) { + advance := int(dstStart.Sub(srcStart) / srcInterval) + srcIndex += advance + srcStart = srcStart.Add(time.Duration(advance) * srcInterval) + } + + // The i'th value is computed as show below. + // interval = (finish/start)/num + // i'th value = sum of observation in range + // [ start + i * interval, + // start + (i + 1) * interval ) + for i := 0; i < num; i++ { + results[i] = ts.resetObservation(results[i]) + dstEnd := dstStart.Add(dstInterval) + for srcIndex < ts.numBuckets && srcStart.Before(dstEnd) { + srcEnd := srcStart.Add(srcInterval) + if srcEnd.After(ts.lastAdd) { + srcEnd = ts.lastAdd + } + + if !srcEnd.Before(dstStart) { + srcValue := l.buckets[(srcIndex+l.oldest)%ts.numBuckets] + if !srcStart.Before(dstStart) && !srcEnd.After(dstEnd) { + // dst completely contains src. + if srcValue != nil { + results[i].Add(srcValue) + } + } else { + // dst partially overlaps src. + overlapStart := maxTime(srcStart, dstStart) + overlapEnd := minTime(srcEnd, dstEnd) + base := srcEnd.Sub(srcStart) + fraction := overlapEnd.Sub(overlapStart).Seconds() / base.Seconds() + + used := ts.provider() + if srcValue != nil { + used.CopyFrom(srcValue) + } + used.Multiply(fraction) + results[i].Add(used) + } + + if srcEnd.After(dstEnd) { + break + } + } + srcIndex++ + srcStart = srcStart.Add(srcInterval) + } + dstStart = dstStart.Add(dstInterval) + } +} + +// resetObservation clears the content so the struct may be reused. +func (ts *timeSeries) resetObservation(observation Observable) Observable { + if observation == nil { + observation = ts.provider() + } else { + observation.Clear() + } + return observation +} + +// TimeSeries tracks data at granularities from 1 second to 16 weeks. +type TimeSeries struct { + timeSeries +} + +// NewTimeSeries creates a new TimeSeries using the function provided for creating new Observable. +func NewTimeSeries(f func() Observable) *TimeSeries { + return NewTimeSeriesWithClock(f, defaultClockInstance) +} + +// NewTimeSeriesWithClock creates a new TimeSeries using the function provided for creating new Observable and the clock for +// assigning timestamps. +func NewTimeSeriesWithClock(f func() Observable, clock Clock) *TimeSeries { + ts := new(TimeSeries) + ts.timeSeries.init(timeSeriesResolutions, f, timeSeriesNumBuckets, clock) + return ts +} + +// MinuteHourSeries tracks data at granularities of 1 minute and 1 hour. +type MinuteHourSeries struct { + timeSeries +} + +// NewMinuteHourSeries creates a new MinuteHourSeries using the function provided for creating new Observable. +func NewMinuteHourSeries(f func() Observable) *MinuteHourSeries { + return NewMinuteHourSeriesWithClock(f, defaultClockInstance) +} + +// NewMinuteHourSeriesWithClock creates a new MinuteHourSeries using the function provided for creating new Observable and the clock for +// assigning timestamps. +func NewMinuteHourSeriesWithClock(f func() Observable, clock Clock) *MinuteHourSeries { + ts := new(MinuteHourSeries) + ts.timeSeries.init(minuteHourSeriesResolutions, f, + minuteHourSeriesNumBuckets, clock) + return ts +} + +func (ts *MinuteHourSeries) Minute() Observable { + return ts.timeSeries.Latest(0, 60) +} + +func (ts *MinuteHourSeries) Hour() Observable { + return ts.timeSeries.Latest(1, 60) +} + +func minTime(a, b time.Time) time.Time { + if a.Before(b) { + return a + } + return b +} + +func maxTime(a, b time.Time) time.Time { + if a.After(b) { + return a + } + return b +} diff --git a/vendor/golang.org/x/net/ipv4/batch.go b/vendor/golang.org/x/net/ipv4/batch.go new file mode 100644 index 00000000..1a3a4fc0 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/batch.go @@ -0,0 +1,194 @@ +// 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. + +package ipv4 + +import ( + "net" + "runtime" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of +// PacketConn are not implemented. + +// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of +// RawConn are not implemented. + +// A Message represents an IO message. +// +// type Message struct { +// Buffers [][]byte +// OOB []byte +// Addr net.Addr +// N int +// NN int +// Flags int +// } +// +// The Buffers fields represents a list of contiguous buffers, which +// can be used for vectored IO, for example, putting a header and a +// payload in each slice. +// When writing, the Buffers field must contain at least one byte to +// write. +// When reading, the Buffers field will always contain a byte to read. +// +// The OOB field contains protocol-specific control or miscellaneous +// ancillary data known as out-of-band data. +// It can be nil when not required. +// +// The Addr field specifies a destination address when writing. +// It can be nil when the underlying protocol of the endpoint uses +// connection-oriented communication. +// After a successful read, it may contain the source address on the +// received packet. +// +// The N field indicates the number of bytes read or written from/to +// Buffers. +// +// The NN field indicates the number of bytes read or written from/to +// OOB. +// +// The Flags field contains protocol-specific information on the +// received message. +type Message = socket.Message + +// ReadBatch reads a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// On a successful read it returns the number of messages received, up +// to len(ms). +// +// On Linux, a batch read will be optimized. +// On other platforms, this method will read only a single message. +// +// Unlike the ReadFrom method, it doesn't strip the IPv4 header +// followed by option headers from the received IPv4 datagram when the +// underlying transport is net.IPConn. Each Buffers field of Message +// must be large enough to accommodate an IPv4 header and option +// headers. +func (c *payloadHandler) ReadBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + switch runtime.GOOS { + case "linux": + n, err := c.RecvMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.RecvMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + if compatFreeBSD32 && ms[0].NN > 0 { + adjustFreeBSD32(&ms[0]) + } + return n, err + } +} + +// WriteBatch writes a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// It returns the number of messages written on a successful write. +// +// On Linux, a batch write will be optimized. +// On other platforms, this method will write only a single message. +func (c *payloadHandler) WriteBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + switch runtime.GOOS { + case "linux": + n, err := c.SendMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.SendMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} + +// ReadBatch reads a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// On a successful read it returns the number of messages received, up +// to len(ms). +// +// On Linux, a batch read will be optimized. +// On other platforms, this method will read only a single message. +func (c *packetHandler) ReadBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + switch runtime.GOOS { + case "linux": + n, err := c.RecvMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.RecvMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + if compatFreeBSD32 && ms[0].NN > 0 { + adjustFreeBSD32(&ms[0]) + } + return n, err + } +} + +// WriteBatch writes a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// It returns the number of messages written on a successful write. +// +// On Linux, a batch write will be optimized. +// On other platforms, this method will write only a single message. +func (c *packetHandler) WriteBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + switch runtime.GOOS { + case "linux": + n, err := c.SendMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.SendMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + return n, err + } +} diff --git a/vendor/golang.org/x/net/ipv4/control.go b/vendor/golang.org/x/net/ipv4/control.go new file mode 100644 index 00000000..a2b02ca9 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control.go @@ -0,0 +1,144 @@ +// 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 ipv4 + +import ( + "fmt" + "net" + "sync" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +type rawOpt struct { + sync.RWMutex + cflags ControlFlags +} + +func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } +func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } +func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } + +type ControlFlags uint + +const ( + FlagTTL ControlFlags = 1 << iota // pass the TTL on the received packet + FlagSrc // pass the source address on the received packet + FlagDst // pass the destination address on the received packet + FlagInterface // pass the interface index on the received packet +) + +// A ControlMessage represents per packet basis IP-level socket options. +type ControlMessage struct { + // Receiving socket options: SetControlMessage allows to + // receive the options from the protocol stack using ReadFrom + // method of PacketConn or RawConn. + // + // Specifying socket options: ControlMessage for WriteTo + // method of PacketConn or RawConn allows to send the options + // to the protocol stack. + // + TTL int // time-to-live, receiving only + Src net.IP // source address, specifying only + Dst net.IP // destination address, receiving only + IfIndex int // interface index, must be 1 <= value when specifying +} + +func (cm *ControlMessage) String() string { + if cm == nil { + return "" + } + return fmt.Sprintf("ttl=%d src=%v dst=%v ifindex=%d", cm.TTL, cm.Src, cm.Dst, cm.IfIndex) +} + +// Marshal returns the binary encoding of cm. +func (cm *ControlMessage) Marshal() []byte { + if cm == nil { + return nil + } + var m socket.ControlMessage + if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To4() != nil || cm.IfIndex > 0) { + m = socket.NewControlMessage([]int{ctlOpts[ctlPacketInfo].length}) + } + if len(m) > 0 { + ctlOpts[ctlPacketInfo].marshal(m, cm) + } + return m +} + +// Parse parses b as a control message and stores the result in cm. +func (cm *ControlMessage) Parse(b []byte) error { + ms, err := socket.ControlMessage(b).Parse() + if err != nil { + return err + } + for _, m := range ms { + lvl, typ, l, err := m.ParseHeader() + if err != nil { + return err + } + if lvl != iana.ProtocolIP { + continue + } + switch { + case typ == ctlOpts[ctlTTL].name && l >= ctlOpts[ctlTTL].length: + ctlOpts[ctlTTL].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlDst].name && l >= ctlOpts[ctlDst].length: + ctlOpts[ctlDst].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlInterface].name && l >= ctlOpts[ctlInterface].length: + ctlOpts[ctlInterface].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlPacketInfo].name && l >= ctlOpts[ctlPacketInfo].length: + ctlOpts[ctlPacketInfo].parse(cm, m.Data(l)) + } + } + return nil +} + +// NewControlMessage returns a new control message. +// +// The returned message is large enough for options specified by cf. +func NewControlMessage(cf ControlFlags) []byte { + opt := rawOpt{cflags: cf} + var l int + if opt.isset(FlagTTL) && ctlOpts[ctlTTL].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlTTL].length) + } + if ctlOpts[ctlPacketInfo].name > 0 { + if opt.isset(FlagSrc | FlagDst | FlagInterface) { + l += socket.ControlMessageSpace(ctlOpts[ctlPacketInfo].length) + } + } else { + if opt.isset(FlagDst) && ctlOpts[ctlDst].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlDst].length) + } + if opt.isset(FlagInterface) && ctlOpts[ctlInterface].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlInterface].length) + } + } + var b []byte + if l > 0 { + b = make([]byte, l) + } + return b +} + +// Ancillary data socket options +const ( + ctlTTL = iota // header field + ctlSrc // header field + ctlDst // header field + ctlInterface // inbound or outbound interface + ctlPacketInfo // inbound or outbound packet path + ctlMax +) + +// A ctlOpt represents a binding for ancillary data socket option. +type ctlOpt struct { + name int // option name, must be equal or greater than 1 + length int // option length + marshal func([]byte, *ControlMessage) []byte + parse func(*ControlMessage, []byte) +} diff --git a/vendor/golang.org/x/net/ipv4/control_bsd.go b/vendor/golang.org/x/net/ipv4/control_bsd.go new file mode 100644 index 00000000..69c4f553 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control_bsd.go @@ -0,0 +1,41 @@ +// 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. + +// +build aix darwin dragonfly freebsd netbsd openbsd + +package ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshalDst(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_RECVDSTADDR, net.IPv4len) + return m.Next(net.IPv4len) +} + +func parseDst(cm *ControlMessage, b []byte) { + if len(cm.Dst) < net.IPv4len { + cm.Dst = make(net.IP, net.IPv4len) + } + copy(cm.Dst, b[:net.IPv4len]) +} + +func marshalInterface(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_RECVIF, syscall.SizeofSockaddrDatalink) + return m.Next(syscall.SizeofSockaddrDatalink) +} + +func parseInterface(cm *ControlMessage, b []byte) { + var sadl syscall.SockaddrDatalink + copy((*[unsafe.Sizeof(sadl)]byte)(unsafe.Pointer(&sadl))[:], b) + cm.IfIndex = int(sadl.Index) +} diff --git a/vendor/golang.org/x/net/ipv4/control_pktinfo.go b/vendor/golang.org/x/net/ipv4/control_pktinfo.go new file mode 100644 index 00000000..425338f3 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control_pktinfo.go @@ -0,0 +1,39 @@ +// 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. + +// +build darwin linux solaris + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_PKTINFO, sizeofInetPktinfo) + if cm != nil { + pi := (*inetPktinfo)(unsafe.Pointer(&m.Data(sizeofInetPktinfo)[0])) + if ip := cm.Src.To4(); ip != nil { + copy(pi.Spec_dst[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return m.Next(sizeofInetPktinfo) +} + +func parsePacketInfo(cm *ControlMessage, b []byte) { + pi := (*inetPktinfo)(unsafe.Pointer(&b[0])) + cm.IfIndex = int(pi.Ifindex) + if len(cm.Dst) < net.IPv4len { + cm.Dst = make(net.IP, net.IPv4len) + } + copy(cm.Dst, pi.Addr[:]) +} diff --git a/vendor/golang.org/x/net/ipv4/control_stub.go b/vendor/golang.org/x/net/ipv4/control_stub.go new file mode 100644 index 00000000..a0c049d6 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv4/control_unix.go b/vendor/golang.org/x/net/ipv4/control_unix.go new file mode 100644 index 00000000..b27fa490 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control_unix.go @@ -0,0 +1,73 @@ +// 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv4 + +import ( + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + opt.Lock() + defer opt.Unlock() + if so, ok := sockOpts[ssoReceiveTTL]; ok && cf&FlagTTL != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagTTL) + } else { + opt.clear(FlagTTL) + } + } + if so, ok := sockOpts[ssoPacketInfo]; ok { + if cf&(FlagSrc|FlagDst|FlagInterface) != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(cf & (FlagSrc | FlagDst | FlagInterface)) + } else { + opt.clear(cf & (FlagSrc | FlagDst | FlagInterface)) + } + } + } else { + if so, ok := sockOpts[ssoReceiveDst]; ok && cf&FlagDst != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagDst) + } else { + opt.clear(FlagDst) + } + } + if so, ok := sockOpts[ssoReceiveInterface]; ok && cf&FlagInterface != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagInterface) + } else { + opt.clear(FlagInterface) + } + } + } + return nil +} + +func marshalTTL(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIP, sysIP_RECVTTL, 1) + return m.Next(1) +} + +func parseTTL(cm *ControlMessage, b []byte) { + cm.TTL = int(*(*byte)(unsafe.Pointer(&b[:1][0]))) +} diff --git a/vendor/golang.org/x/net/ipv4/control_windows.go b/vendor/golang.org/x/net/ipv4/control_windows.go new file mode 100644 index 00000000..82c63064 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control_windows.go @@ -0,0 +1,12 @@ +// 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 ipv4 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + // TODO(mikio): implement this + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv4/dgramopt.go b/vendor/golang.org/x/net/ipv4/dgramopt.go new file mode 100644 index 00000000..c191c22a --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/dgramopt.go @@ -0,0 +1,264 @@ +// 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 ipv4 + +import ( + "net" + + "golang.org/x/net/bpf" +) + +// MulticastTTL returns the time-to-live field value for outgoing +// multicast packets. +func (c *dgramOpt) MulticastTTL() (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + so, ok := sockOpts[ssoMulticastTTL] + if !ok { + return 0, errNotImplemented + } + return so.GetInt(c.Conn) +} + +// SetMulticastTTL sets the time-to-live field value for future +// outgoing multicast packets. +func (c *dgramOpt) SetMulticastTTL(ttl int) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoMulticastTTL] + if !ok { + return errNotImplemented + } + return so.SetInt(c.Conn, ttl) +} + +// MulticastInterface returns the default interface for multicast +// packet transmissions. +func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { + if !c.ok() { + return nil, errInvalidConn + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return nil, errNotImplemented + } + return so.getMulticastInterface(c.Conn) +} + +// SetMulticastInterface sets the default interface for future +// multicast packet transmissions. +func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return errNotImplemented + } + return so.setMulticastInterface(c.Conn, ifi) +} + +// MulticastLoopback reports whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) MulticastLoopback() (bool, error) { + if !c.ok() { + return false, errInvalidConn + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return false, errNotImplemented + } + on, err := so.GetInt(c.Conn) + if err != nil { + return false, err + } + return on == 1, nil +} + +// SetMulticastLoopback sets whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) SetMulticastLoopback(on bool) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return errNotImplemented + } + return so.SetInt(c.Conn, boolint(on)) +} + +// JoinGroup joins the group address group on the interface ifi. +// By default all sources that can cast data to group are accepted. +// It's possible to mute and unmute data transmission from a specific +// source by using ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup. +// JoinGroup uses the system assigned multicast interface when ifi is +// nil, although this is not recommended because the assignment +// depends on platforms and sometimes it might require routing +// configuration. +func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoJoinGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// LeaveGroup leaves the group address group on the interface ifi +// regardless of whether the group is any-source group or +// source-specific group. +func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoLeaveGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// JoinSourceSpecificGroup joins the source-specific group comprising +// group and source on the interface ifi. +// JoinSourceSpecificGroup uses the system assigned multicast +// interface when ifi is nil, although this is not recommended because +// the assignment depends on platforms and sometimes it might require +// routing configuration. +func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoJoinSourceGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// LeaveSourceSpecificGroup leaves the source-specific group on the +// interface ifi. +func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoLeaveSourceGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// ExcludeSourceSpecificGroup excludes the source-specific group from +// the already joined any-source groups by JoinGroup on the interface +// ifi. +func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoBlockSourceGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// IncludeSourceSpecificGroup includes the excluded source-specific +// group by ExcludeSourceSpecificGroup again on the interface ifi. +func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoUnblockSourceGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// ICMPFilter returns an ICMP filter. +// Currently only Linux supports this. +func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { + if !c.ok() { + return nil, errInvalidConn + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return nil, errNotImplemented + } + return so.getICMPFilter(c.Conn) +} + +// SetICMPFilter deploys the ICMP filter. +// Currently only Linux supports this. +func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return errNotImplemented + } + return so.setICMPFilter(c.Conn, f) +} + +// SetBPF attaches a BPF program to the connection. +// +// Only supported on Linux. +func (c *dgramOpt) SetBPF(filter []bpf.RawInstruction) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoAttachFilter] + if !ok { + return errNotImplemented + } + return so.setBPF(c.Conn, filter) +} diff --git a/vendor/golang.org/x/net/ipv4/doc.go b/vendor/golang.org/x/net/ipv4/doc.go new file mode 100644 index 00000000..24583497 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/doc.go @@ -0,0 +1,244 @@ +// 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 ipv4 implements IP-level socket options for the Internet +// Protocol version 4. +// +// The package provides IP-level socket options that allow +// manipulation of IPv4 facilities. +// +// The IPv4 protocol and basic host requirements for IPv4 are defined +// in RFC 791 and RFC 1122. +// Host extensions for multicasting and socket interface extensions +// for multicast source filters are defined in RFC 1112 and RFC 3678. +// IGMPv1, IGMPv2 and IGMPv3 are defined in RFC 1112, RFC 2236 and RFC +// 3376. +// Source-specific multicast is defined in RFC 4607. +// +// +// Unicasting +// +// The options for unicasting are available for net.TCPConn, +// net.UDPConn and net.IPConn which are created as network connections +// that use the IPv4 transport. When a single TCP connection carrying +// a data flow of multiple packets needs to indicate the flow is +// important, Conn is used to set the type-of-service field on the +// IPv4 header for each packet. +// +// ln, err := net.Listen("tcp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer ln.Close() +// for { +// c, err := ln.Accept() +// if err != nil { +// // error handling +// } +// go func(c net.Conn) { +// defer c.Close() +// +// The outgoing packets will be labeled DiffServ assured forwarding +// class 1 low drop precedence, known as AF11 packets. +// +// if err := ipv4.NewConn(c).SetTOS(0x28); err != nil { +// // error handling +// } +// if _, err := c.Write(data); err != nil { +// // error handling +// } +// }(c) +// } +// +// +// Multicasting +// +// The options for multicasting are available for net.UDPConn and +// net.IPConn which are created as network connections that use the +// IPv4 transport. A few network facilities must be prepared before +// you begin multicasting, at a minimum joining network interfaces and +// multicast groups. +// +// en0, err := net.InterfaceByName("en0") +// if err != nil { +// // error handling +// } +// en1, err := net.InterfaceByIndex(911) +// if err != nil { +// // error handling +// } +// group := net.IPv4(224, 0, 0, 250) +// +// First, an application listens to an appropriate address with an +// appropriate service port. +// +// c, err := net.ListenPacket("udp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// +// Second, the application joins multicast groups, starts listening to +// the groups on the specified network interfaces. Note that the +// service port for transport layer protocol does not matter with this +// operation as joining groups affects only network and link layer +// protocols, such as IPv4 and Ethernet. +// +// p := ipv4.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// +// The application might set per packet control message transmissions +// between the protocol stack within the kernel. When the application +// needs a destination address on an incoming packet, +// SetControlMessage of PacketConn is used to enable control message +// transmissions. +// +// if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { +// // error handling +// } +// +// The application could identify whether the received packets are +// of interest by using the control message that contains the +// destination address of the received packet. +// +// b := make([]byte, 1500) +// for { +// n, cm, src, err := p.ReadFrom(b) +// if err != nil { +// // error handling +// } +// if cm.Dst.IsMulticast() { +// if cm.Dst.Equal(group) { +// // joined group, do something +// } else { +// // unknown group, discard +// continue +// } +// } +// +// The application can also send both unicast and multicast packets. +// +// p.SetTOS(0x0) +// p.SetTTL(16) +// if _, err := p.WriteTo(data, nil, src); err != nil { +// // error handling +// } +// dst := &net.UDPAddr{IP: group, Port: 1024} +// for _, ifi := range []*net.Interface{en0, en1} { +// if err := p.SetMulticastInterface(ifi); err != nil { +// // error handling +// } +// p.SetMulticastTTL(2) +// if _, err := p.WriteTo(data, nil, dst); err != nil { +// // error handling +// } +// } +// } +// +// +// More multicasting +// +// An application that uses PacketConn or RawConn may join multiple +// multicast groups. For example, a UDP listener with port 1024 might +// join two different groups across over two different network +// interfaces by using: +// +// c, err := net.ListenPacket("udp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// p := ipv4.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { +// // error handling +// } +// +// It is possible for multiple UDP listeners that listen on the same +// UDP port to join the same multicast group. The net package will +// provide a socket that listens to a wildcard address with reusable +// UDP port when an appropriate multicast address prefix is passed to +// the net.ListenPacket or net.ListenUDP. +// +// c1, err := net.ListenPacket("udp4", "224.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c1.Close() +// c2, err := net.ListenPacket("udp4", "224.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c2.Close() +// p1 := ipv4.NewPacketConn(c1) +// if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// p2 := ipv4.NewPacketConn(c2) +// if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// +// Also it is possible for the application to leave or rejoin a +// multicast group on the network interface. +// +// if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}); err != nil { +// // error handling +// } +// +// +// Source-specific multicasting +// +// An application that uses PacketConn or RawConn on IGMPv3 supported +// platform is able to join source-specific multicast groups. +// The application may use JoinSourceSpecificGroup and +// LeaveSourceSpecificGroup for the operation known as "include" mode, +// +// ssmgroup := net.UDPAddr{IP: net.IPv4(232, 7, 8, 9)} +// ssmsource := net.UDPAddr{IP: net.IPv4(192, 168, 0, 1)} +// if err := p.JoinSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// if err := p.LeaveSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// +// or JoinGroup, ExcludeSourceSpecificGroup, +// IncludeSourceSpecificGroup and LeaveGroup for the operation known +// as "exclude" mode. +// +// exclsource := net.UDPAddr{IP: net.IPv4(192, 168, 0, 254)} +// if err := p.JoinGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// if err := p.ExcludeSourceSpecificGroup(en0, &ssmgroup, &exclsource); err != nil { +// // error handling +// } +// if err := p.LeaveGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// +// Note that it depends on each platform implementation what happens +// when an application which runs on IGMPv3 unsupported platform uses +// JoinSourceSpecificGroup and LeaveSourceSpecificGroup. +// In general the platform tries to fall back to conversations using +// IGMPv1 or IGMPv2 and starts to listen to multicast traffic. +// In the fallback case, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup may return an error. +package ipv4 // import "golang.org/x/net/ipv4" + +// BUG(mikio): This package is not implemented on JS, NaCl and Plan 9. diff --git a/vendor/golang.org/x/net/ipv4/endpoint.go b/vendor/golang.org/x/net/ipv4/endpoint.go new file mode 100644 index 00000000..4a6d7a85 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/endpoint.go @@ -0,0 +1,186 @@ +// 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 ipv4 + +import ( + "net" + "time" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the JoinSourceSpecificGroup, +// LeaveSourceSpecificGroup, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup methods of PacketConn and RawConn are +// not implemented. + +// A Conn represents a network endpoint that uses the IPv4 transport. +// It is used to control basic IP-level socket options such as TOS and +// TTL. +type Conn struct { + genericOpt +} + +type genericOpt struct { + *socket.Conn +} + +func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } + +// NewConn returns a new Conn. +func NewConn(c net.Conn) *Conn { + cc, _ := socket.NewConn(c) + return &Conn{ + genericOpt: genericOpt{Conn: cc}, + } +} + +// A PacketConn represents a packet network endpoint that uses the +// IPv4 transport. It is used to control several IP-level socket +// options including multicasting. It also provides datagram based +// network I/O methods specific to the IPv4 and higher layer protocols +// such as UDP. +type PacketConn struct { + genericOpt + dgramOpt + payloadHandler +} + +type dgramOpt struct { + *socket.Conn +} + +func (c *dgramOpt) ok() bool { return c != nil && c.Conn != nil } + +// SetControlMessage sets the per packet IP-level socket options. +func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.payloadHandler.ok() { + return errInvalidConn + } + return setControlMessage(c.dgramOpt.Conn, &c.payloadHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return errInvalidConn + } + return c.payloadHandler.PacketConn.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return errInvalidConn + } + return c.payloadHandler.PacketConn.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return errInvalidConn + } + return c.payloadHandler.PacketConn.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.payloadHandler.ok() { + return errInvalidConn + } + return c.payloadHandler.PacketConn.Close() +} + +// NewPacketConn returns a new PacketConn using c as its underlying +// transport. +func NewPacketConn(c net.PacketConn) *PacketConn { + cc, _ := socket.NewConn(c.(net.Conn)) + p := &PacketConn{ + genericOpt: genericOpt{Conn: cc}, + dgramOpt: dgramOpt{Conn: cc}, + payloadHandler: payloadHandler{PacketConn: c, Conn: cc}, + } + return p +} + +// A RawConn represents a packet network endpoint that uses the IPv4 +// transport. It is used to control several IP-level socket options +// including IPv4 header manipulation. It also provides datagram +// based network I/O methods specific to the IPv4 and higher layer +// protocols that handle IPv4 datagram directly such as OSPF, GRE. +type RawConn struct { + genericOpt + dgramOpt + packetHandler +} + +// SetControlMessage sets the per packet IP-level socket options. +func (c *RawConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.packetHandler.ok() { + return errInvalidConn + } + return setControlMessage(c.dgramOpt.Conn, &c.packetHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *RawConn) SetDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return errInvalidConn + } + return c.packetHandler.IPConn.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *RawConn) SetReadDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return errInvalidConn + } + return c.packetHandler.IPConn.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *RawConn) SetWriteDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return errInvalidConn + } + return c.packetHandler.IPConn.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *RawConn) Close() error { + if !c.packetHandler.ok() { + return errInvalidConn + } + return c.packetHandler.IPConn.Close() +} + +// NewRawConn returns a new RawConn using c as its underlying +// transport. +func NewRawConn(c net.PacketConn) (*RawConn, error) { + cc, err := socket.NewConn(c.(net.Conn)) + if err != nil { + return nil, err + } + r := &RawConn{ + genericOpt: genericOpt{Conn: cc}, + dgramOpt: dgramOpt{Conn: cc}, + packetHandler: packetHandler{IPConn: c.(*net.IPConn), Conn: cc}, + } + so, ok := sockOpts[ssoHeaderPrepend] + if !ok { + return nil, errNotImplemented + } + if err := so.SetInt(r.dgramOpt.Conn, boolint(true)); err != nil { + return nil, err + } + return r, nil +} diff --git a/vendor/golang.org/x/net/ipv4/genericopt.go b/vendor/golang.org/x/net/ipv4/genericopt.go new file mode 100644 index 00000000..51c12371 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/genericopt.go @@ -0,0 +1,55 @@ +// 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 ipv4 + +// TOS returns the type-of-service field value for outgoing packets. +func (c *genericOpt) TOS() (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + so, ok := sockOpts[ssoTOS] + if !ok { + return 0, errNotImplemented + } + return so.GetInt(c.Conn) +} + +// SetTOS sets the type-of-service field value for future outgoing +// packets. +func (c *genericOpt) SetTOS(tos int) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoTOS] + if !ok { + return errNotImplemented + } + return so.SetInt(c.Conn, tos) +} + +// TTL returns the time-to-live field value for outgoing packets. +func (c *genericOpt) TTL() (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + so, ok := sockOpts[ssoTTL] + if !ok { + return 0, errNotImplemented + } + return so.GetInt(c.Conn) +} + +// SetTTL sets the time-to-live field value for future outgoing +// packets. +func (c *genericOpt) SetTTL(ttl int) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoTTL] + if !ok { + return errNotImplemented + } + return so.SetInt(c.Conn, ttl) +} diff --git a/vendor/golang.org/x/net/ipv4/header.go b/vendor/golang.org/x/net/ipv4/header.go new file mode 100644 index 00000000..c271ca46 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/header.go @@ -0,0 +1,172 @@ +// 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 ipv4 + +import ( + "encoding/binary" + "fmt" + "net" + "runtime" + + "golang.org/x/net/internal/socket" +) + +const ( + Version = 4 // protocol version + HeaderLen = 20 // header length without extension headers +) + +type HeaderFlags int + +const ( + MoreFragments HeaderFlags = 1 << iota // more fragments flag + DontFragment // don't fragment flag +) + +// A Header represents an IPv4 header. +type Header struct { + Version int // protocol version + Len int // header length + TOS int // type-of-service + TotalLen int // packet total length + ID int // identification + Flags HeaderFlags // flags + FragOff int // fragment offset + TTL int // time-to-live + Protocol int // next protocol + Checksum int // checksum + Src net.IP // source address + Dst net.IP // destination address + Options []byte // options, extension headers +} + +func (h *Header) String() string { + if h == nil { + return "" + } + return fmt.Sprintf("ver=%d hdrlen=%d tos=%#x totallen=%d id=%#x flags=%#x fragoff=%#x ttl=%d proto=%d cksum=%#x src=%v dst=%v", h.Version, h.Len, h.TOS, h.TotalLen, h.ID, h.Flags, h.FragOff, h.TTL, h.Protocol, h.Checksum, h.Src, h.Dst) +} + +// Marshal returns the binary encoding of h. +// +// The returned slice is in the format used by a raw IP socket on the +// local system. +// This may differ from the wire format, depending on the system. +func (h *Header) Marshal() ([]byte, error) { + if h == nil { + return nil, errNilHeader + } + if h.Len < HeaderLen { + return nil, errHeaderTooShort + } + hdrlen := HeaderLen + len(h.Options) + b := make([]byte, hdrlen) + b[0] = byte(Version<<4 | (hdrlen >> 2 & 0x0f)) + b[1] = byte(h.TOS) + flagsAndFragOff := (h.FragOff & 0x1fff) | int(h.Flags<<13) + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + socket.NativeEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + socket.NativeEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + case "freebsd": + if freebsdVersion < 1100000 { + socket.NativeEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + socket.NativeEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } else { + binary.BigEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + binary.BigEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } + default: + binary.BigEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + binary.BigEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } + binary.BigEndian.PutUint16(b[4:6], uint16(h.ID)) + b[8] = byte(h.TTL) + b[9] = byte(h.Protocol) + binary.BigEndian.PutUint16(b[10:12], uint16(h.Checksum)) + if ip := h.Src.To4(); ip != nil { + copy(b[12:16], ip[:net.IPv4len]) + } + if ip := h.Dst.To4(); ip != nil { + copy(b[16:20], ip[:net.IPv4len]) + } else { + return nil, errMissingAddress + } + if len(h.Options) > 0 { + copy(b[HeaderLen:], h.Options) + } + return b, nil +} + +// Parse parses b as an IPv4 header and stores the result in h. +// +// The provided b must be in the format used by a raw IP socket on the +// local system. +// This may differ from the wire format, depending on the system. +func (h *Header) Parse(b []byte) error { + if h == nil || b == nil { + return errNilHeader + } + if len(b) < HeaderLen { + return errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + if len(b) < hdrlen { + return errExtHeaderTooShort + } + h.Version = int(b[0] >> 4) + h.Len = hdrlen + h.TOS = int(b[1]) + h.ID = int(binary.BigEndian.Uint16(b[4:6])) + h.TTL = int(b[8]) + h.Protocol = int(b[9]) + h.Checksum = int(binary.BigEndian.Uint16(b[10:12])) + h.Src = net.IPv4(b[12], b[13], b[14], b[15]) + h.Dst = net.IPv4(b[16], b[17], b[18], b[19]) + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) + hdrlen + h.FragOff = int(socket.NativeEndian.Uint16(b[6:8])) + case "freebsd": + if freebsdVersion < 1100000 { + h.TotalLen = int(socket.NativeEndian.Uint16(b[2:4])) + if freebsdVersion < 1000000 { + h.TotalLen += hdrlen + } + h.FragOff = int(socket.NativeEndian.Uint16(b[6:8])) + } else { + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + h.FragOff = int(binary.BigEndian.Uint16(b[6:8])) + } + default: + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + h.FragOff = int(binary.BigEndian.Uint16(b[6:8])) + } + h.Flags = HeaderFlags(h.FragOff&0xe000) >> 13 + h.FragOff = h.FragOff & 0x1fff + optlen := hdrlen - HeaderLen + if optlen > 0 && len(b) >= hdrlen { + if cap(h.Options) < optlen { + h.Options = make([]byte, optlen) + } else { + h.Options = h.Options[:optlen] + } + copy(h.Options, b[HeaderLen:hdrlen]) + } + return nil +} + +// ParseHeader parses b as an IPv4 header. +// +// The provided b must be in the format used by a raw IP socket on the +// local system. +// This may differ from the wire format, depending on the system. +func ParseHeader(b []byte) (*Header, error) { + h := new(Header) + if err := h.Parse(b); err != nil { + return nil, err + } + return h, nil +} diff --git a/vendor/golang.org/x/net/ipv4/helper.go b/vendor/golang.org/x/net/ipv4/helper.go new file mode 100644 index 00000000..e845a737 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/helper.go @@ -0,0 +1,77 @@ +// 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 ipv4 + +import ( + "errors" + "net" + "runtime" + + "golang.org/x/net/internal/socket" +) + +var ( + errInvalidConn = errors.New("invalid connection") + errMissingAddress = errors.New("missing address") + errNilHeader = errors.New("nil header") + errHeaderTooShort = errors.New("header too short") + errExtHeaderTooShort = errors.New("extension header too short") + errInvalidConnType = errors.New("invalid conn type") + errNotImplemented = errors.New("not implemented on " + runtime.GOOS + "/" + runtime.GOARCH) + + // See https://www.freebsd.org/doc/en/books/porters-handbook/versions.html. + freebsdVersion uint32 + compatFreeBSD32 bool // 386 emulation on amd64 +) + +// See golang.org/issue/30899. +func adjustFreeBSD32(m *socket.Message) { + // FreeBSD 12.0-RELEASE is affected by https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236737 + if 1200086 <= freebsdVersion && freebsdVersion < 1201000 { + l := (m.NN + 4 - 1) &^ (4 - 1) + if m.NN < l && l <= len(m.OOB) { + m.NN = l + } + } +} + +func boolint(b bool) int { + if b { + return 1 + } + return 0 +} + +func netAddrToIP4(a net.Addr) net.IP { + switch v := a.(type) { + case *net.UDPAddr: + if ip := v.IP.To4(); ip != nil { + return ip + } + case *net.IPAddr: + if ip := v.IP.To4(); ip != nil { + return ip + } + } + return nil +} + +func opAddr(a net.Addr) net.Addr { + switch a.(type) { + case *net.TCPAddr: + if a == nil { + return nil + } + case *net.UDPAddr: + if a == nil { + return nil + } + case *net.IPAddr: + if a == nil { + return nil + } + } + return a +} diff --git a/vendor/golang.org/x/net/ipv4/iana.go b/vendor/golang.org/x/net/ipv4/iana.go new file mode 100644 index 00000000..4375b409 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/iana.go @@ -0,0 +1,38 @@ +// go generate gen.go +// Code generated by the command above; DO NOT EDIT. + +package ipv4 + +// Internet Control Message Protocol (ICMP) Parameters, Updated: 2018-02-26 +const ( + ICMPTypeEchoReply ICMPType = 0 // Echo Reply + ICMPTypeDestinationUnreachable ICMPType = 3 // Destination Unreachable + ICMPTypeRedirect ICMPType = 5 // Redirect + ICMPTypeEcho ICMPType = 8 // Echo + ICMPTypeRouterAdvertisement ICMPType = 9 // Router Advertisement + ICMPTypeRouterSolicitation ICMPType = 10 // Router Solicitation + ICMPTypeTimeExceeded ICMPType = 11 // Time Exceeded + ICMPTypeParameterProblem ICMPType = 12 // Parameter Problem + ICMPTypeTimestamp ICMPType = 13 // Timestamp + ICMPTypeTimestampReply ICMPType = 14 // Timestamp Reply + ICMPTypePhoturis ICMPType = 40 // Photuris + ICMPTypeExtendedEchoRequest ICMPType = 42 // Extended Echo Request + ICMPTypeExtendedEchoReply ICMPType = 43 // Extended Echo Reply +) + +// Internet Control Message Protocol (ICMP) Parameters, Updated: 2018-02-26 +var icmpTypes = map[ICMPType]string{ + 0: "echo reply", + 3: "destination unreachable", + 5: "redirect", + 8: "echo", + 9: "router advertisement", + 10: "router solicitation", + 11: "time exceeded", + 12: "parameter problem", + 13: "timestamp", + 14: "timestamp reply", + 40: "photuris", + 42: "extended echo request", + 43: "extended echo reply", +} diff --git a/vendor/golang.org/x/net/ipv4/icmp.go b/vendor/golang.org/x/net/ipv4/icmp.go new file mode 100644 index 00000000..9902bb3d --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/icmp.go @@ -0,0 +1,57 @@ +// Copyright 2013 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 ipv4 + +import "golang.org/x/net/internal/iana" + +// An ICMPType represents a type of ICMP message. +type ICMPType int + +func (typ ICMPType) String() string { + s, ok := icmpTypes[typ] + if !ok { + return "" + } + return s +} + +// Protocol returns the ICMPv4 protocol number. +func (typ ICMPType) Protocol() int { + return iana.ProtocolICMP +} + +// An ICMPFilter represents an ICMP message filter for incoming +// packets. The filter belongs to a packet delivery path on a host and +// it cannot interact with forwarding packets or tunnel-outer packets. +// +// Note: RFC 8200 defines a reasonable role model and it works not +// only for IPv6 but IPv4. A node means a device that implements IP. +// A router means a node that forwards IP packets not explicitly +// addressed to itself, and a host means a node that is not a router. +type ICMPFilter struct { + icmpFilter +} + +// Accept accepts incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Accept(typ ICMPType) { + f.accept(typ) +} + +// Block blocks incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Block(typ ICMPType) { + f.block(typ) +} + +// SetAll sets the filter action to the filter. +func (f *ICMPFilter) SetAll(block bool) { + f.setAll(block) +} + +// WillBlock reports whether the ICMP type will be blocked. +func (f *ICMPFilter) WillBlock(typ ICMPType) bool { + return f.willBlock(typ) +} diff --git a/vendor/golang.org/x/net/ipv4/icmp_linux.go b/vendor/golang.org/x/net/ipv4/icmp_linux.go new file mode 100644 index 00000000..6e1c5c80 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/icmp_linux.go @@ -0,0 +1,25 @@ +// 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 ipv4 + +func (f *icmpFilter) accept(typ ICMPType) { + f.Data &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpFilter) block(typ ICMPType) { + f.Data |= 1 << (uint32(typ) & 31) +} + +func (f *icmpFilter) setAll(block bool) { + if block { + f.Data = 1<<32 - 1 + } else { + f.Data = 0 + } +} + +func (f *icmpFilter) willBlock(typ ICMPType) bool { + return f.Data&(1<<(uint32(typ)&31)) != 0 +} diff --git a/vendor/golang.org/x/net/ipv4/icmp_stub.go b/vendor/golang.org/x/net/ipv4/icmp_stub.go new file mode 100644 index 00000000..21bb29ab --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/icmp_stub.go @@ -0,0 +1,25 @@ +// 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. + +// +build !linux + +package ipv4 + +const sizeofICMPFilter = 0x0 + +type icmpFilter struct { +} + +func (f *icmpFilter) accept(typ ICMPType) { +} + +func (f *icmpFilter) block(typ ICMPType) { +} + +func (f *icmpFilter) setAll(block bool) { +} + +func (f *icmpFilter) willBlock(typ ICMPType) bool { + return false +} diff --git a/vendor/golang.org/x/net/ipv4/packet.go b/vendor/golang.org/x/net/ipv4/packet.go new file mode 100644 index 00000000..7d784e06 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/packet.go @@ -0,0 +1,117 @@ +// 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 ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ReadFrom and WriteTo methods of RawConn +// are not implemented. + +// A packetHandler represents the IPv4 datagram handler. +type packetHandler struct { + *net.IPConn + *socket.Conn + rawOpt +} + +func (c *packetHandler) ok() bool { return c != nil && c.IPConn != nil && c.Conn != nil } + +// ReadFrom reads an IPv4 datagram from the endpoint c, copying the +// datagram into b. It returns the received datagram as the IPv4 +// header h, the payload p and the control message cm. +func (c *packetHandler) ReadFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) { + if !c.ok() { + return nil, nil, nil, errInvalidConn + } + c.rawOpt.RLock() + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: NewControlMessage(c.rawOpt.cflags), + } + c.rawOpt.RUnlock() + if err := c.RecvMsg(&m, 0); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + var hs []byte + if hs, p, err = slicePacket(b[:m.N]); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + if h, err = ParseHeader(hs); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + if m.NN > 0 { + if compatFreeBSD32 { + adjustFreeBSD32(&m) + } + cm = new(ControlMessage) + if err := cm.Parse(m.OOB[:m.NN]); err != nil { + return nil, nil, nil, &net.OpError{Op: "read", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Err: err} + } + } + if src, ok := m.Addr.(*net.IPAddr); ok && cm != nil { + cm.Src = src.IP + } + return +} + +func slicePacket(b []byte) (h, p []byte, err error) { + if len(b) < HeaderLen { + return nil, nil, errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + return b[:hdrlen], b[hdrlen:], nil +} + +// WriteTo writes an IPv4 datagram through the endpoint c, copying the +// datagram from the IPv4 header h and the payload p. The control +// message cm allows the datagram path and the outgoing interface to be +// specified. Currently only Darwin and Linux support this. The cm +// may be nil if control of the outgoing datagram is not required. +// +// The IPv4 header h must contain appropriate fields that include: +// +// Version = +// Len = +// TOS = +// TotalLen = +// ID = platform sets an appropriate value if ID is zero +// FragOff = +// TTL = +// Protocol = +// Checksum = platform sets an appropriate value if Checksum is zero +// Src = platform sets an appropriate value if Src is nil +// Dst = +// Options = optional +func (c *packetHandler) WriteTo(h *Header, p []byte, cm *ControlMessage) error { + if !c.ok() { + return errInvalidConn + } + m := socket.Message{ + OOB: cm.Marshal(), + } + wh, err := h.Marshal() + if err != nil { + return err + } + m.Buffers = [][]byte{wh, p} + dst := new(net.IPAddr) + if cm != nil { + if ip := cm.Dst.To4(); ip != nil { + dst.IP = ip + } + } + if dst.IP == nil { + dst.IP = h.Dst + } + m.Addr = dst + if err := c.SendMsg(&m, 0); err != nil { + return &net.OpError{Op: "write", Net: c.IPConn.LocalAddr().Network(), Source: c.IPConn.LocalAddr(), Addr: opAddr(dst), Err: err} + } + return nil +} diff --git a/vendor/golang.org/x/net/ipv4/payload.go b/vendor/golang.org/x/net/ipv4/payload.go new file mode 100644 index 00000000..f95f811a --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/payload.go @@ -0,0 +1,23 @@ +// 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 ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ControlMessage for ReadFrom and WriteTo +// methods of PacketConn is not implemented. + +// A payloadHandler represents the IPv4 datagram payload handler. +type payloadHandler struct { + net.PacketConn + *socket.Conn + rawOpt +} + +func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil && c.Conn != nil } diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/vendor/golang.org/x/net/ipv4/payload_cmsg.go new file mode 100644 index 00000000..e7614661 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/payload_cmsg.go @@ -0,0 +1,84 @@ +// 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +// ReadFrom reads a payload of the received IPv4 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, errInvalidConn + } + c.rawOpt.RLock() + m := socket.Message{ + OOB: NewControlMessage(c.rawOpt.cflags), + } + c.rawOpt.RUnlock() + switch c.PacketConn.(type) { + case *net.UDPConn: + m.Buffers = [][]byte{b} + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + case *net.IPConn: + h := make([]byte, HeaderLen) + m.Buffers = [][]byte{h, b} + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + hdrlen := int(h[0]&0x0f) << 2 + if hdrlen > len(h) { + d := hdrlen - len(h) + copy(b, b[d:]) + m.N -= d + } else { + m.N -= hdrlen + } + default: + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errInvalidConnType} + } + if m.NN > 0 { + if compatFreeBSD32 { + adjustFreeBSD32(&m) + } + cm = new(ControlMessage) + if err := cm.Parse(m.OOB[:m.NN]); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + cm.Src = netAddrToIP4(m.Addr) + } + return m.N, cm, m.Addr, nil +} + +// WriteTo writes a payload of the IPv4 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the datagram path and the outgoing interface to be specified. +// Currently only Darwin and Linux support this. The cm may be nil if +// control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, errInvalidConn + } + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: cm.Marshal(), + Addr: dst, + } + err = c.SendMsg(&m, 0) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err} + } + return m.N, err +} diff --git a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go new file mode 100644 index 00000000..1116256f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go @@ -0,0 +1,39 @@ +// 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package ipv4 + +import "net" + +// ReadFrom reads a payload of the received IPv4 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, errInvalidConn + } + if n, src, err = c.PacketConn.ReadFrom(b); err != nil { + return 0, nil, nil, err + } + return +} + +// WriteTo writes a payload of the IPv4 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the datagram path and the outgoing interface to be specified. +// Currently only Darwin and Linux support this. The cm may be nil if +// control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, errInvalidConn + } + if dst == nil { + return 0, errMissingAddress + } + return c.PacketConn.WriteTo(b, dst) +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt.go b/vendor/golang.org/x/net/ipv4/sockopt.go new file mode 100644 index 00000000..22e90c03 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt.go @@ -0,0 +1,44 @@ +// 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 ipv4 + +import "golang.org/x/net/internal/socket" + +// Sticky socket options +const ( + ssoTOS = iota // header field for unicast packet + ssoTTL // header field for unicast packet + ssoMulticastTTL // header field for multicast packet + ssoMulticastInterface // outbound interface for multicast packet + ssoMulticastLoopback // loopback for multicast packet + ssoReceiveTTL // header field on received packet + ssoReceiveDst // header field on received packet + ssoReceiveInterface // inbound interface on received packet + ssoPacketInfo // incbound or outbound packet path + ssoHeaderPrepend // ipv4 header prepend + ssoStripHeader // strip ipv4 header + ssoICMPFilter // icmp filter + ssoJoinGroup // any-source multicast + ssoLeaveGroup // any-source multicast + ssoJoinSourceGroup // source-specific multicast + ssoLeaveSourceGroup // source-specific multicast + ssoBlockSourceGroup // any-source or source-specific multicast + ssoUnblockSourceGroup // any-source or source-specific multicast + ssoAttachFilter // attach BPF for filtering inbound traffic +) + +// Sticky socket option value types +const ( + ssoTypeIPMreq = iota + 1 + ssoTypeIPMreqn + ssoTypeGroupReq + ssoTypeGroupSourceReq +) + +// A sockOpt represents a binding for sticky socket option. +type sockOpt struct { + socket.Option + typ int // hint for option value type; optional +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_posix.go b/vendor/golang.org/x/net/ipv4/sockopt_posix.go new file mode 100644 index 00000000..dea64519 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_posix.go @@ -0,0 +1,71 @@ +// 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + switch so.typ { + case ssoTypeIPMreqn: + return so.getIPMreqn(c) + default: + return so.getMulticastIf(c) + } +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + switch so.typ { + case ssoTypeIPMreqn: + return so.setIPMreqn(c, ifi, nil) + default: + return so.setMulticastIf(c, ifi) + } +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + b := make([]byte, so.Len) + n, err := so.Get(c, b) + if err != nil { + return nil, err + } + if n != sizeofICMPFilter { + return nil, errNotImplemented + } + return (*ICMPFilter)(unsafe.Pointer(&b[0])), nil +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + b := (*[sizeofICMPFilter]byte)(unsafe.Pointer(f))[:sizeofICMPFilter] + return so.Set(c, b) +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + switch so.typ { + case ssoTypeIPMreq: + return so.setIPMreq(c, ifi, grp) + case ssoTypeIPMreqn: + return so.setIPMreqn(c, ifi, grp) + case ssoTypeGroupReq: + return so.setGroupReq(c, ifi, grp) + default: + return errNotImplemented + } +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return so.setGroupSourceReq(c, ifi, grp, src) +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return so.setAttachFilter(c, f) +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_stub.go new file mode 100644 index 00000000..37d4806b --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_stub.go @@ -0,0 +1,42 @@ +// 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +import ( + "net" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + return nil, errNotImplemented +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + return errNotImplemented +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + return nil, errNotImplemented +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + return errNotImplemented +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errNotImplemented +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errNotImplemented +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv4/sys_aix.go b/vendor/golang.org/x/net/ipv4/sys_aix.go new file mode 100644 index 00000000..3d1201e6 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_aix.go @@ -0,0 +1,38 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Added for go1.11 compatibility +// +build aix + +package ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 1}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq.go b/vendor/golang.org/x/net/ipv4/sys_asmreq.go new file mode 100644 index 00000000..76d670ac --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_asmreq.go @@ -0,0 +1,122 @@ +// 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. + +// +build aix darwin dragonfly freebsd netbsd openbsd solaris windows + +package ipv4 + +import ( + "errors" + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +var errNoSuchInterface = errors.New("no such interface") + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + mreq := ipMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} + if err := setIPMreqInterface(&mreq, ifi); err != nil { + return err + } + b := (*[sizeofIPMreq]byte)(unsafe.Pointer(&mreq))[:sizeofIPMreq] + return so.Set(c, b) +} + +func (so *sockOpt) getMulticastIf(c *socket.Conn) (*net.Interface, error) { + var b [4]byte + if _, err := so.Get(c, b[:]); err != nil { + return nil, err + } + ifi, err := netIP4ToInterface(net.IPv4(b[0], b[1], b[2], b[3])) + if err != nil { + return nil, err + } + return ifi, nil +} + +func (so *sockOpt) setMulticastIf(c *socket.Conn, ifi *net.Interface) error { + ip, err := netInterfaceToIP4(ifi) + if err != nil { + return err + } + var b [4]byte + copy(b[:], ip) + return so.Set(c, b[:]) +} + +func setIPMreqInterface(mreq *ipMreq, ifi *net.Interface) error { + if ifi == nil { + return nil + } + ifat, err := ifi.Addrs() + if err != nil { + return err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := ifa.IP.To4(); ip != nil { + copy(mreq.Interface[:], ip) + return nil + } + case *net.IPNet: + if ip := ifa.IP.To4(); ip != nil { + copy(mreq.Interface[:], ip) + return nil + } + } + } + return errNoSuchInterface +} + +func netIP4ToInterface(ip net.IP) (*net.Interface, error) { + ift, err := net.Interfaces() + if err != nil { + return nil, err + } + for _, ifi := range ift { + ifat, err := ifi.Addrs() + if err != nil { + return nil, err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip.Equal(ifa.IP) { + return &ifi, nil + } + case *net.IPNet: + if ip.Equal(ifa.IP) { + return &ifi, nil + } + } + } + } + return nil, errNoSuchInterface +} + +func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) { + if ifi == nil { + return net.IPv4zero.To4(), nil + } + ifat, err := ifi.Addrs() + if err != nil { + return nil, err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := ifa.IP.To4(); ip != nil { + return ip, nil + } + case *net.IPNet: + if ip := ifa.IP.To4(); ip != nil { + return ip, nil + } + } + } + return nil, errNoSuchInterface +} diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go b/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go new file mode 100644 index 00000000..6dc339ce --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go @@ -0,0 +1,25 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !aix,!darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errNotImplemented +} + +func (so *sockOpt) getMulticastIf(c *socket.Conn) (*net.Interface, error) { + return nil, errNotImplemented +} + +func (so *sockOpt) setMulticastIf(c *socket.Conn, ifi *net.Interface) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreqn.go b/vendor/golang.org/x/net/ipv4/sys_asmreqn.go new file mode 100644 index 00000000..1f24f69f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_asmreqn.go @@ -0,0 +1,42 @@ +// 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. + +// +build darwin freebsd linux + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getIPMreqn(c *socket.Conn) (*net.Interface, error) { + b := make([]byte, so.Len) + if _, err := so.Get(c, b); err != nil { + return nil, err + } + mreqn := (*ipMreqn)(unsafe.Pointer(&b[0])) + if mreqn.Ifindex == 0 { + return nil, nil + } + ifi, err := net.InterfaceByIndex(int(mreqn.Ifindex)) + if err != nil { + return nil, err + } + return ifi, nil +} + +func (so *sockOpt) setIPMreqn(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var mreqn ipMreqn + if ifi != nil { + mreqn.Ifindex = int32(ifi.Index) + } + if grp != nil { + mreqn.Multiaddr = [4]byte{grp[0], grp[1], grp[2], grp[3]} + } + b := (*[sizeofIPMreqn]byte)(unsafe.Pointer(&mreqn))[:sizeofIPMreqn] + return so.Set(c, b) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go b/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go new file mode 100644 index 00000000..48ef5562 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !darwin,!freebsd,!linux + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getIPMreqn(c *socket.Conn) (*net.Interface, error) { + return nil, errNotImplemented +} + +func (so *sockOpt) setIPMreqn(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf.go b/vendor/golang.org/x/net/ipv4/sys_bpf.go new file mode 100644 index 00000000..5c03dce3 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_bpf.go @@ -0,0 +1,24 @@ +// 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. + +// +build linux + +package ipv4 + +import ( + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" + "golang.org/x/sys/unix" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + prog := unix.SockFprog{ + Len: uint16(len(f)), + Filter: (*unix.SockFilter)(unsafe.Pointer(&f[0])), + } + b := (*[unix.SizeofSockFprog]byte)(unsafe.Pointer(&prog))[:unix.SizeofSockFprog] + return so.Set(c, b) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go b/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go new file mode 100644 index 00000000..5c986427 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go @@ -0,0 +1,16 @@ +// 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. + +// +build !linux + +package ipv4 + +import ( + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv4/sys_bsd.go b/vendor/golang.org/x/net/ipv4/sys_bsd.go new file mode 100644 index 00000000..58256dd9 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_bsd.go @@ -0,0 +1,37 @@ +// 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. + +// +build netbsd openbsd + +package ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 1}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) diff --git a/vendor/golang.org/x/net/ipv4/sys_darwin.go b/vendor/golang.org/x/net/ipv4/sys_darwin.go new file mode 100644 index 00000000..ac213c73 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_darwin.go @@ -0,0 +1,65 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + ctlPacketInfo: {sysIP_PKTINFO, sizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: sizeofIPMreqn}, typ: ssoTypeIPMreqn}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoStripHeader: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_STRIPHDR, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoPacketInfo: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVPKTINFO, Len: 4}}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 132)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_dragonfly.go b/vendor/golang.org/x/net/ipv4/sys_dragonfly.go new file mode 100644 index 00000000..859764f3 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_dragonfly.go @@ -0,0 +1,35 @@ +// 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. + +package ipv4 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) diff --git a/vendor/golang.org/x/net/ipv4/sys_freebsd.go b/vendor/golang.org/x/net/ipv4/sys_freebsd.go new file mode 100644 index 00000000..482873d9 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_freebsd.go @@ -0,0 +1,76 @@ +// 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 ipv4 + +import ( + "net" + "runtime" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoReceiveDst: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVDSTADDR, Len: 4}}, + ssoReceiveInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVIF, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func init() { + freebsdVersion, _ = syscall.SysctlUint32("kern.osreldate") + if freebsdVersion >= 1000000 { + sockOpts[ssoMulticastInterface] = &sockOpt{Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: sizeofIPMreqn}, typ: ssoTypeIPMreqn} + } + if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { + archs, _ := syscall.Sysctl("kern.supported_archs") + for _, s := range strings.Fields(archs) { + if s == "amd64" { + compatFreeBSD32 = true + break + } + } + } +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gr.Group)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gsr.Group)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(&gsr.Source)) + sa.Len = sizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_linux.go b/vendor/golang.org/x/net/ipv4/sys_linux.go new file mode 100644 index 00000000..cf755c7f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_linux.go @@ -0,0 +1,60 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" + "golang.org/x/sys/unix" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_TTL, 1, marshalTTL, parseTTL}, + ctlPacketInfo: {sysIP_PKTINFO, sizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, + } + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: sizeofIPMreqn}, typ: ssoTypeIPMreqn}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoPacketInfo: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_PKTINFO, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolReserved, Name: sysICMP_FILTER, Len: sizeofICMPFilter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoAttachFilter: {Option: socket.Option{Level: unix.SOL_SOCKET, Name: unix.SO_ATTACH_FILTER, Len: unix.SizeofSockFprog}}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gr.Group)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gsr.Group)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(&gsr.Source)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_solaris.go b/vendor/golang.org/x/net/ipv4/sys_solaris.go new file mode 100644 index 00000000..832fef1e --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_solaris.go @@ -0,0 +1,57 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 4, marshalTTL, parseTTL}, + ctlPacketInfo: {sysIP_PKTINFO, sizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, + } + + sockOpts = map[int]sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 1}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 1}}, + ssoReceiveTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVTTL, Len: 4}}, + ssoPacketInfo: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_RECVPKTINFO, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 260)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_ssmreq.go b/vendor/golang.org/x/net/ipv4/sys_ssmreq.go new file mode 100644 index 00000000..eeced7f3 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_ssmreq.go @@ -0,0 +1,52 @@ +// 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. + +// +build darwin freebsd linux solaris + +package ipv4 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var gr groupReq + if ifi != nil { + gr.Interface = uint32(ifi.Index) + } + gr.setGroup(grp) + var b []byte + if compatFreeBSD32 { + var d [sizeofGroupReq + 4]byte + s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))[:sizeofGroupReq] + } + return so.Set(c, b) +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + var gsr groupSourceReq + if ifi != nil { + gsr.Interface = uint32(ifi.Index) + } + gsr.setSourceGroup(grp, src) + var b []byte + if compatFreeBSD32 { + var d [sizeofGroupSourceReq + 4]byte + s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))[:sizeofGroupSourceReq] + } + return so.Set(c, b) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go b/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go new file mode 100644 index 00000000..c0921674 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !darwin,!freebsd,!linux,!solaris + +package ipv4 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errNotImplemented +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv4/sys_stub.go b/vendor/golang.org/x/net/ipv4/sys_stub.go new file mode 100644 index 00000000..b9c85b33 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv4 + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{} +) diff --git a/vendor/golang.org/x/net/ipv4/sys_windows.go b/vendor/golang.org/x/net/ipv4/sys_windows.go new file mode 100644 index 00000000..b0913d53 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_windows.go @@ -0,0 +1,67 @@ +// 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 ipv4 + +import ( + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +const ( + // See ws2tcpip.h. + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_DONTFRAGMENT = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0xf + sysIP_DROP_SOURCE_MEMBERSHIP = 0x10 + sysIP_PKTINFO = 0x13 + + sizeofInetPktinfo = 0x8 + sizeofIPMreq = 0x8 + sizeofIPMreqSource = 0xc +) + +type inetPktinfo struct { + Addr [4]byte + Ifindex int32 +} + +type ipMreq struct { + Multiaddr [4]byte + Interface [4]byte +} + +type ipMreqSource struct { + Multiaddr [4]byte + Sourceaddr [4]byte + Interface [4]byte +} + +// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms738586(v=vs.85).aspx +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{ + ssoTOS: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TOS, Len: 4}}, + ssoTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_TTL, Len: 4}}, + ssoMulticastTTL: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_TTL, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_IF, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_MULTICAST_LOOP, Len: 4}}, + ssoHeaderPrepend: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_HDRINCL, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_ADD_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysIP_DROP_MEMBERSHIP, Len: sizeofIPMreq}, typ: ssoTypeIPMreq}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go new file mode 100644 index 00000000..c741d5c8 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go @@ -0,0 +1,33 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_aix.go + +// Added for go1.11 compatibility +// +build aix + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x20 + sysIP_RECVTTL = 0x22 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sizeofIPMreq = 0x8 +) + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_darwin.go b/vendor/golang.org/x/net/ipv4/zsys_darwin.go new file mode 100644 index 00000000..e05a251b --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_darwin.go @@ -0,0 +1,99 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_darwin.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_STRIPHDR = 0x17 + sysIP_RECVTTL = 0x18 + sysIP_BOUND_IF = 0x19 + sysIP_PKTINFO = 0x1a + sysIP_RECVPKTINFO = 0x1a + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_MULTICAST_IFINDEX = 0x42 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type inetPktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [128]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [128]byte + Pad_cgo_1 [128]byte +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go new file mode 100644 index 00000000..6d65e9fc --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go @@ -0,0 +1,31 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_dragonfly.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_RECVTTL = 0x41 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sizeofIPMreq = 0x8 +) + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go new file mode 100644 index 00000000..136e2b8f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go @@ -0,0 +1,93 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go new file mode 100644 index 00000000..4f730f19 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go @@ -0,0 +1,95 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go new file mode 100644 index 00000000..4f730f19 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go @@ -0,0 +1,95 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm64.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm64.go new file mode 100644 index 00000000..ecebf327 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm64.go @@ -0,0 +1,93 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]uint8 + X__ss_align int64 + X__ss_pad2 [112]uint8 +} + +type sockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go new file mode 100644 index 00000000..1c7fdfa1 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go @@ -0,0 +1,130 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go new file mode 100644 index 00000000..a04e7851 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go @@ -0,0 +1,132 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go new file mode 100644 index 00000000..1c7fdfa1 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go @@ -0,0 +1,130 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go new file mode 100644 index 00000000..a04e7851 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go @@ -0,0 +1,132 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go new file mode 100644 index 00000000..1c7fdfa1 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go @@ -0,0 +1,130 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go new file mode 100644 index 00000000..a04e7851 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go @@ -0,0 +1,132 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go new file mode 100644 index 00000000..a04e7851 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go @@ -0,0 +1,132 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go new file mode 100644 index 00000000..1c7fdfa1 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go @@ -0,0 +1,130 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go new file mode 100644 index 00000000..3c5ea547 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go @@ -0,0 +1,130 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]uint8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go new file mode 100644 index 00000000..a04e7851 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go @@ -0,0 +1,132 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go new file mode 100644 index 00000000..a04e7851 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go @@ -0,0 +1,132 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go new file mode 100644 index 00000000..e626134a --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go @@ -0,0 +1,134 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +// +build riscv64 + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go new file mode 100644 index 00000000..a04e7851 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go @@ -0,0 +1,132 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type inetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type ipMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_netbsd.go b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go new file mode 100644 index 00000000..8cfc648a --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go @@ -0,0 +1,30 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_netbsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_RECVTTL = 0x17 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sizeofIPMreq = 0x8 +) + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_openbsd.go b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go new file mode 100644 index 00000000..37629cb0 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go @@ -0,0 +1,30 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_openbsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x1e + sysIP_RECVTTL = 0x1f + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sizeofIPMreq = 0x8 +) + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_solaris.go b/vendor/golang.org/x/net/ipv4/zsys_solaris.go new file mode 100644 index 00000000..cb80a308 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_solaris.go @@ -0,0 +1,100 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_solaris.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x9 + sysIP_RECVSLLA = 0xa + sysIP_RECVTTL = 0xb + + sysIP_MULTICAST_IF = 0x10 + sysIP_MULTICAST_TTL = 0x11 + sysIP_MULTICAST_LOOP = 0x12 + sysIP_ADD_MEMBERSHIP = 0x13 + sysIP_DROP_MEMBERSHIP = 0x14 + sysIP_BLOCK_SOURCE = 0x15 + sysIP_UNBLOCK_SOURCE = 0x16 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x17 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x18 + sysIP_NEXTHOP = 0x19 + + sysIP_PKTINFO = 0x1a + sysIP_RECVPKTINFO = 0x1a + sysIP_DONTFRAG = 0x1b + + sysIP_BOUND_IF = 0x41 + sysIP_UNSPEC_SRC = 0x42 + sysIP_BROADCAST_TTL = 0x43 + sysIP_DHCPINIT_IF = 0x45 + + sysIP_REUSEADDR = 0x104 + sysIP_DONTROUTE = 0x105 + sysIP_BROADCAST = 0x106 + + sysMCAST_JOIN_GROUP = 0x29 + sysMCAST_LEAVE_GROUP = 0x2a + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_JOIN_SOURCE_GROUP = 0x2d + sysMCAST_LEAVE_SOURCE_GROUP = 0x2e + + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + + sizeofIPMreq = 0x8 + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x104 + sizeofGroupSourceReq = 0x204 +) + +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type inetPktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type ipMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type ipMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [256]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [256]byte + Pad_cgo_1 [256]byte +} diff --git a/vendor/golang.org/x/net/ipv6/batch.go b/vendor/golang.org/x/net/ipv6/batch.go new file mode 100644 index 00000000..2ccb9849 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/batch.go @@ -0,0 +1,116 @@ +// 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. + +package ipv6 + +import ( + "net" + "runtime" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ReadBatch and WriteBatch methods of +// PacketConn are not implemented. + +// A Message represents an IO message. +// +// type Message struct { +// Buffers [][]byte +// OOB []byte +// Addr net.Addr +// N int +// NN int +// Flags int +// } +// +// The Buffers fields represents a list of contiguous buffers, which +// can be used for vectored IO, for example, putting a header and a +// payload in each slice. +// When writing, the Buffers field must contain at least one byte to +// write. +// When reading, the Buffers field will always contain a byte to read. +// +// The OOB field contains protocol-specific control or miscellaneous +// ancillary data known as out-of-band data. +// It can be nil when not required. +// +// The Addr field specifies a destination address when writing. +// It can be nil when the underlying protocol of the endpoint uses +// connection-oriented communication. +// After a successful read, it may contain the source address on the +// received packet. +// +// The N field indicates the number of bytes read or written from/to +// Buffers. +// +// The NN field indicates the number of bytes read or written from/to +// OOB. +// +// The Flags field contains protocol-specific information on the +// received message. +type Message = socket.Message + +// ReadBatch reads a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_PEEK. +// +// On a successful read it returns the number of messages received, up +// to len(ms). +// +// On Linux, a batch read will be optimized. +// On other platforms, this method will read only a single message. +func (c *payloadHandler) ReadBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + switch runtime.GOOS { + case "linux": + n, err := c.RecvMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.RecvMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} + +// WriteBatch writes a batch of messages. +// +// The provided flags is a set of platform-dependent flags, such as +// syscall.MSG_DONTROUTE. +// +// It returns the number of messages written on a successful write. +// +// On Linux, a batch write will be optimized. +// On other platforms, this method will write only a single message. +func (c *payloadHandler) WriteBatch(ms []Message, flags int) (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + switch runtime.GOOS { + case "linux": + n, err := c.SendMsgs([]socket.Message(ms), flags) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + default: + n := 1 + err := c.SendMsg(&ms[0], flags) + if err != nil { + n = 0 + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + return n, err + } +} diff --git a/vendor/golang.org/x/net/ipv6/control.go b/vendor/golang.org/x/net/ipv6/control.go new file mode 100644 index 00000000..2da64441 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control.go @@ -0,0 +1,187 @@ +// Copyright 2013 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 ipv6 + +import ( + "fmt" + "net" + "sync" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +// Note that RFC 3542 obsoletes RFC 2292 but OS X Snow Leopard and the +// former still support RFC 2292 only. Please be aware that almost +// all protocol implementations prohibit using a combination of RFC +// 2292 and RFC 3542 for some practical reasons. + +type rawOpt struct { + sync.RWMutex + cflags ControlFlags +} + +func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } +func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } +func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } + +// A ControlFlags represents per packet basis IP-level socket option +// control flags. +type ControlFlags uint + +const ( + FlagTrafficClass ControlFlags = 1 << iota // pass the traffic class on the received packet + FlagHopLimit // pass the hop limit on the received packet + FlagSrc // pass the source address on the received packet + FlagDst // pass the destination address on the received packet + FlagInterface // pass the interface index on the received packet + FlagPathMTU // pass the path MTU on the received packet path +) + +const flagPacketInfo = FlagDst | FlagInterface + +// A ControlMessage represents per packet basis IP-level socket +// options. +type ControlMessage struct { + // Receiving socket options: SetControlMessage allows to + // receive the options from the protocol stack using ReadFrom + // method of PacketConn. + // + // Specifying socket options: ControlMessage for WriteTo + // method of PacketConn allows to send the options to the + // protocol stack. + // + TrafficClass int // traffic class, must be 1 <= value <= 255 when specifying + HopLimit int // hop limit, must be 1 <= value <= 255 when specifying + Src net.IP // source address, specifying only + Dst net.IP // destination address, receiving only + IfIndex int // interface index, must be 1 <= value when specifying + NextHop net.IP // next hop address, specifying only + MTU int // path MTU, receiving only +} + +func (cm *ControlMessage) String() string { + if cm == nil { + return "" + } + return fmt.Sprintf("tclass=%#x hoplim=%d src=%v dst=%v ifindex=%d nexthop=%v mtu=%d", cm.TrafficClass, cm.HopLimit, cm.Src, cm.Dst, cm.IfIndex, cm.NextHop, cm.MTU) +} + +// Marshal returns the binary encoding of cm. +func (cm *ControlMessage) Marshal() []byte { + if cm == nil { + return nil + } + var l int + tclass := false + if ctlOpts[ctlTrafficClass].name > 0 && cm.TrafficClass > 0 { + tclass = true + l += socket.ControlMessageSpace(ctlOpts[ctlTrafficClass].length) + } + hoplimit := false + if ctlOpts[ctlHopLimit].name > 0 && cm.HopLimit > 0 { + hoplimit = true + l += socket.ControlMessageSpace(ctlOpts[ctlHopLimit].length) + } + pktinfo := false + if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To16() != nil && cm.Src.To4() == nil || cm.IfIndex > 0) { + pktinfo = true + l += socket.ControlMessageSpace(ctlOpts[ctlPacketInfo].length) + } + nexthop := false + if ctlOpts[ctlNextHop].name > 0 && cm.NextHop.To16() != nil && cm.NextHop.To4() == nil { + nexthop = true + l += socket.ControlMessageSpace(ctlOpts[ctlNextHop].length) + } + var b []byte + if l > 0 { + b = make([]byte, l) + bb := b + if tclass { + bb = ctlOpts[ctlTrafficClass].marshal(bb, cm) + } + if hoplimit { + bb = ctlOpts[ctlHopLimit].marshal(bb, cm) + } + if pktinfo { + bb = ctlOpts[ctlPacketInfo].marshal(bb, cm) + } + if nexthop { + bb = ctlOpts[ctlNextHop].marshal(bb, cm) + } + } + return b +} + +// Parse parses b as a control message and stores the result in cm. +func (cm *ControlMessage) Parse(b []byte) error { + ms, err := socket.ControlMessage(b).Parse() + if err != nil { + return err + } + for _, m := range ms { + lvl, typ, l, err := m.ParseHeader() + if err != nil { + return err + } + if lvl != iana.ProtocolIPv6 { + continue + } + switch { + case typ == ctlOpts[ctlTrafficClass].name && l >= ctlOpts[ctlTrafficClass].length: + ctlOpts[ctlTrafficClass].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlHopLimit].name && l >= ctlOpts[ctlHopLimit].length: + ctlOpts[ctlHopLimit].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlPacketInfo].name && l >= ctlOpts[ctlPacketInfo].length: + ctlOpts[ctlPacketInfo].parse(cm, m.Data(l)) + case typ == ctlOpts[ctlPathMTU].name && l >= ctlOpts[ctlPathMTU].length: + ctlOpts[ctlPathMTU].parse(cm, m.Data(l)) + } + } + return nil +} + +// NewControlMessage returns a new control message. +// +// The returned message is large enough for options specified by cf. +func NewControlMessage(cf ControlFlags) []byte { + opt := rawOpt{cflags: cf} + var l int + if opt.isset(FlagTrafficClass) && ctlOpts[ctlTrafficClass].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlTrafficClass].length) + } + if opt.isset(FlagHopLimit) && ctlOpts[ctlHopLimit].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlHopLimit].length) + } + if opt.isset(flagPacketInfo) && ctlOpts[ctlPacketInfo].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlPacketInfo].length) + } + if opt.isset(FlagPathMTU) && ctlOpts[ctlPathMTU].name > 0 { + l += socket.ControlMessageSpace(ctlOpts[ctlPathMTU].length) + } + var b []byte + if l > 0 { + b = make([]byte, l) + } + return b +} + +// Ancillary data socket options +const ( + ctlTrafficClass = iota // header field + ctlHopLimit // header field + ctlPacketInfo // inbound or outbound packet path + ctlNextHop // nexthop + ctlPathMTU // path mtu + ctlMax +) + +// A ctlOpt represents a binding for ancillary data socket option. +type ctlOpt struct { + name int // option name, must be equal or greater than 1 + length int // option length + marshal func([]byte, *ControlMessage) []byte + parse func(*ControlMessage, []byte) +} diff --git a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go new file mode 100644 index 00000000..9fd9eb15 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go @@ -0,0 +1,48 @@ +// Copyright 2013 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. + +// +build darwin + +package ipv6 + +import ( + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshal2292HopLimit(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292HOPLIMIT, 4) + if cm != nil { + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) + } + return m.Next(4) +} + +func marshal2292PacketInfo(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292PKTINFO, sizeofInet6Pktinfo) + if cm != nil { + pi := (*inet6Pktinfo)(unsafe.Pointer(&m.Data(sizeofInet6Pktinfo)[0])) + if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { + copy(pi.Addr[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return m.Next(sizeofInet6Pktinfo) +} + +func marshal2292NextHop(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292NEXTHOP, sizeofSockaddrInet6) + if cm != nil { + sa := (*sockaddrInet6)(unsafe.Pointer(&m.Data(sizeofSockaddrInet6)[0])) + sa.setSockaddr(cm.NextHop, cm.IfIndex) + } + return m.Next(sizeofSockaddrInet6) +} diff --git a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go new file mode 100644 index 00000000..8c221b59 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go @@ -0,0 +1,94 @@ +// Copyright 2013 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +func marshalTrafficClass(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_TCLASS, 4) + if cm != nil { + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.TrafficClass)) + } + return m.Next(4) +} + +func parseTrafficClass(cm *ControlMessage, b []byte) { + cm.TrafficClass = int(socket.NativeEndian.Uint32(b[:4])) +} + +func marshalHopLimit(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_HOPLIMIT, 4) + if cm != nil { + socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) + } + return m.Next(4) +} + +func parseHopLimit(cm *ControlMessage, b []byte) { + cm.HopLimit = int(socket.NativeEndian.Uint32(b[:4])) +} + +func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_PKTINFO, sizeofInet6Pktinfo) + if cm != nil { + pi := (*inet6Pktinfo)(unsafe.Pointer(&m.Data(sizeofInet6Pktinfo)[0])) + if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { + copy(pi.Addr[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return m.Next(sizeofInet6Pktinfo) +} + +func parsePacketInfo(cm *ControlMessage, b []byte) { + pi := (*inet6Pktinfo)(unsafe.Pointer(&b[0])) + if len(cm.Dst) < net.IPv6len { + cm.Dst = make(net.IP, net.IPv6len) + } + copy(cm.Dst, pi.Addr[:]) + cm.IfIndex = int(pi.Ifindex) +} + +func marshalNextHop(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_NEXTHOP, sizeofSockaddrInet6) + if cm != nil { + sa := (*sockaddrInet6)(unsafe.Pointer(&m.Data(sizeofSockaddrInet6)[0])) + sa.setSockaddr(cm.NextHop, cm.IfIndex) + } + return m.Next(sizeofSockaddrInet6) +} + +func parseNextHop(cm *ControlMessage, b []byte) { +} + +func marshalPathMTU(b []byte, cm *ControlMessage) []byte { + m := socket.ControlMessage(b) + m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_PATHMTU, sizeofIPv6Mtuinfo) + return m.Next(sizeofIPv6Mtuinfo) +} + +func parsePathMTU(cm *ControlMessage, b []byte) { + mi := (*ipv6Mtuinfo)(unsafe.Pointer(&b[0])) + if len(cm.Dst) < net.IPv6len { + cm.Dst = make(net.IP, net.IPv6len) + } + copy(cm.Dst, mi.Addr.Addr[:]) + cm.IfIndex = int(mi.Addr.Scope_id) + cm.MTU = int(mi.Mtu) +} diff --git a/vendor/golang.org/x/net/ipv6/control_stub.go b/vendor/golang.org/x/net/ipv6/control_stub.go new file mode 100644 index 00000000..1d773cbc --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control_stub.go @@ -0,0 +1,13 @@ +// Copyright 2013 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv6/control_unix.go b/vendor/golang.org/x/net/ipv6/control_unix.go new file mode 100644 index 00000000..0971a008 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control_unix.go @@ -0,0 +1,55 @@ +// Copyright 2013 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv6 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + opt.Lock() + defer opt.Unlock() + if so, ok := sockOpts[ssoReceiveTrafficClass]; ok && cf&FlagTrafficClass != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagTrafficClass) + } else { + opt.clear(FlagTrafficClass) + } + } + if so, ok := sockOpts[ssoReceiveHopLimit]; ok && cf&FlagHopLimit != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagHopLimit) + } else { + opt.clear(FlagHopLimit) + } + } + if so, ok := sockOpts[ssoReceivePacketInfo]; ok && cf&flagPacketInfo != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(cf & flagPacketInfo) + } else { + opt.clear(cf & flagPacketInfo) + } + } + if so, ok := sockOpts[ssoReceivePathMTU]; ok && cf&FlagPathMTU != 0 { + if err := so.SetInt(c, boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagPathMTU) + } else { + opt.clear(FlagPathMTU) + } + } + return nil +} diff --git a/vendor/golang.org/x/net/ipv6/control_windows.go b/vendor/golang.org/x/net/ipv6/control_windows.go new file mode 100644 index 00000000..8882d819 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control_windows.go @@ -0,0 +1,12 @@ +// Copyright 2013 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 ipv6 + +import "golang.org/x/net/internal/socket" + +func setControlMessage(c *socket.Conn, opt *rawOpt, cf ControlFlags, on bool) error { + // TODO(mikio): implement this + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv6/dgramopt.go b/vendor/golang.org/x/net/ipv6/dgramopt.go new file mode 100644 index 00000000..1f422e71 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/dgramopt.go @@ -0,0 +1,301 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + + "golang.org/x/net/bpf" +) + +// MulticastHopLimit returns the hop limit field value for outgoing +// multicast packets. +func (c *dgramOpt) MulticastHopLimit() (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + so, ok := sockOpts[ssoMulticastHopLimit] + if !ok { + return 0, errNotImplemented + } + return so.GetInt(c.Conn) +} + +// SetMulticastHopLimit sets the hop limit field value for future +// outgoing multicast packets. +func (c *dgramOpt) SetMulticastHopLimit(hoplim int) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoMulticastHopLimit] + if !ok { + return errNotImplemented + } + return so.SetInt(c.Conn, hoplim) +} + +// MulticastInterface returns the default interface for multicast +// packet transmissions. +func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { + if !c.ok() { + return nil, errInvalidConn + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return nil, errNotImplemented + } + return so.getMulticastInterface(c.Conn) +} + +// SetMulticastInterface sets the default interface for future +// multicast packet transmissions. +func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoMulticastInterface] + if !ok { + return errNotImplemented + } + return so.setMulticastInterface(c.Conn, ifi) +} + +// MulticastLoopback reports whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) MulticastLoopback() (bool, error) { + if !c.ok() { + return false, errInvalidConn + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return false, errNotImplemented + } + on, err := so.GetInt(c.Conn) + if err != nil { + return false, err + } + return on == 1, nil +} + +// SetMulticastLoopback sets whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) SetMulticastLoopback(on bool) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoMulticastLoopback] + if !ok { + return errNotImplemented + } + return so.SetInt(c.Conn, boolint(on)) +} + +// JoinGroup joins the group address group on the interface ifi. +// By default all sources that can cast data to group are accepted. +// It's possible to mute and unmute data transmission from a specific +// source by using ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup. +// JoinGroup uses the system assigned multicast interface when ifi is +// nil, although this is not recommended because the assignment +// depends on platforms and sometimes it might require routing +// configuration. +func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoJoinGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// LeaveGroup leaves the group address group on the interface ifi +// regardless of whether the group is any-source group or +// source-specific group. +func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoLeaveGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + return so.setGroup(c.Conn, ifi, grp) +} + +// JoinSourceSpecificGroup joins the source-specific group comprising +// group and source on the interface ifi. +// JoinSourceSpecificGroup uses the system assigned multicast +// interface when ifi is nil, although this is not recommended because +// the assignment depends on platforms and sometimes it might require +// routing configuration. +func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoJoinSourceGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// LeaveSourceSpecificGroup leaves the source-specific group on the +// interface ifi. +func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoLeaveSourceGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// ExcludeSourceSpecificGroup excludes the source-specific group from +// the already joined any-source groups by JoinGroup on the interface +// ifi. +func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoBlockSourceGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// IncludeSourceSpecificGroup includes the excluded source-specific +// group by ExcludeSourceSpecificGroup again on the interface ifi. +func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoUnblockSourceGroup] + if !ok { + return errNotImplemented + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return so.setSourceGroup(c.Conn, ifi, grp, src) +} + +// Checksum reports whether the kernel will compute, store or verify a +// checksum for both incoming and outgoing packets. If on is true, it +// returns an offset in bytes into the data of where the checksum +// field is located. +func (c *dgramOpt) Checksum() (on bool, offset int, err error) { + if !c.ok() { + return false, 0, errInvalidConn + } + so, ok := sockOpts[ssoChecksum] + if !ok { + return false, 0, errNotImplemented + } + offset, err = so.GetInt(c.Conn) + if err != nil { + return false, 0, err + } + if offset < 0 { + return false, 0, nil + } + return true, offset, nil +} + +// SetChecksum enables the kernel checksum processing. If on is ture, +// the offset should be an offset in bytes into the data of where the +// checksum field is located. +func (c *dgramOpt) SetChecksum(on bool, offset int) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoChecksum] + if !ok { + return errNotImplemented + } + if !on { + offset = -1 + } + return so.SetInt(c.Conn, offset) +} + +// ICMPFilter returns an ICMP filter. +func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { + if !c.ok() { + return nil, errInvalidConn + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return nil, errNotImplemented + } + return so.getICMPFilter(c.Conn) +} + +// SetICMPFilter deploys the ICMP filter. +func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoICMPFilter] + if !ok { + return errNotImplemented + } + return so.setICMPFilter(c.Conn, f) +} + +// SetBPF attaches a BPF program to the connection. +// +// Only supported on Linux. +func (c *dgramOpt) SetBPF(filter []bpf.RawInstruction) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoAttachFilter] + if !ok { + return errNotImplemented + } + return so.setBPF(c.Conn, filter) +} diff --git a/vendor/golang.org/x/net/ipv6/doc.go b/vendor/golang.org/x/net/ipv6/doc.go new file mode 100644 index 00000000..e0be9d50 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/doc.go @@ -0,0 +1,243 @@ +// Copyright 2013 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 ipv6 implements IP-level socket options for the Internet +// Protocol version 6. +// +// The package provides IP-level socket options that allow +// manipulation of IPv6 facilities. +// +// The IPv6 protocol is defined in RFC 8200. +// Socket interface extensions are defined in RFC 3493, RFC 3542 and +// RFC 3678. +// MLDv1 and MLDv2 are defined in RFC 2710 and RFC 3810. +// Source-specific multicast is defined in RFC 4607. +// +// On Darwin, this package requires OS X Mavericks version 10.9 or +// above, or equivalent. +// +// +// Unicasting +// +// The options for unicasting are available for net.TCPConn, +// net.UDPConn and net.IPConn which are created as network connections +// that use the IPv6 transport. When a single TCP connection carrying +// a data flow of multiple packets needs to indicate the flow is +// important, Conn is used to set the traffic class field on the IPv6 +// header for each packet. +// +// ln, err := net.Listen("tcp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer ln.Close() +// for { +// c, err := ln.Accept() +// if err != nil { +// // error handling +// } +// go func(c net.Conn) { +// defer c.Close() +// +// The outgoing packets will be labeled DiffServ assured forwarding +// class 1 low drop precedence, known as AF11 packets. +// +// if err := ipv6.NewConn(c).SetTrafficClass(0x28); err != nil { +// // error handling +// } +// if _, err := c.Write(data); err != nil { +// // error handling +// } +// }(c) +// } +// +// +// Multicasting +// +// The options for multicasting are available for net.UDPConn and +// net.IPConn which are created as network connections that use the +// IPv6 transport. A few network facilities must be prepared before +// you begin multicasting, at a minimum joining network interfaces and +// multicast groups. +// +// en0, err := net.InterfaceByName("en0") +// if err != nil { +// // error handling +// } +// en1, err := net.InterfaceByIndex(911) +// if err != nil { +// // error handling +// } +// group := net.ParseIP("ff02::114") +// +// First, an application listens to an appropriate address with an +// appropriate service port. +// +// c, err := net.ListenPacket("udp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// +// Second, the application joins multicast groups, starts listening to +// the groups on the specified network interfaces. Note that the +// service port for transport layer protocol does not matter with this +// operation as joining groups affects only network and link layer +// protocols, such as IPv6 and Ethernet. +// +// p := ipv6.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// +// The application might set per packet control message transmissions +// between the protocol stack within the kernel. When the application +// needs a destination address on an incoming packet, +// SetControlMessage of PacketConn is used to enable control message +// transmissions. +// +// if err := p.SetControlMessage(ipv6.FlagDst, true); err != nil { +// // error handling +// } +// +// The application could identify whether the received packets are +// of interest by using the control message that contains the +// destination address of the received packet. +// +// b := make([]byte, 1500) +// for { +// n, rcm, src, err := p.ReadFrom(b) +// if err != nil { +// // error handling +// } +// if rcm.Dst.IsMulticast() { +// if rcm.Dst.Equal(group) { +// // joined group, do something +// } else { +// // unknown group, discard +// continue +// } +// } +// +// The application can also send both unicast and multicast packets. +// +// p.SetTrafficClass(0x0) +// p.SetHopLimit(16) +// if _, err := p.WriteTo(data[:n], nil, src); err != nil { +// // error handling +// } +// dst := &net.UDPAddr{IP: group, Port: 1024} +// wcm := ipv6.ControlMessage{TrafficClass: 0xe0, HopLimit: 1} +// for _, ifi := range []*net.Interface{en0, en1} { +// wcm.IfIndex = ifi.Index +// if _, err := p.WriteTo(data[:n], &wcm, dst); err != nil { +// // error handling +// } +// } +// } +// +// +// More multicasting +// +// An application that uses PacketConn may join multiple multicast +// groups. For example, a UDP listener with port 1024 might join two +// different groups across over two different network interfaces by +// using: +// +// c, err := net.ListenPacket("udp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// p := ipv6.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { +// // error handling +// } +// +// It is possible for multiple UDP listeners that listen on the same +// UDP port to join the same multicast group. The net package will +// provide a socket that listens to a wildcard address with reusable +// UDP port when an appropriate multicast address prefix is passed to +// the net.ListenPacket or net.ListenUDP. +// +// c1, err := net.ListenPacket("udp6", "[ff02::]:1024") +// if err != nil { +// // error handling +// } +// defer c1.Close() +// c2, err := net.ListenPacket("udp6", "[ff02::]:1024") +// if err != nil { +// // error handling +// } +// defer c2.Close() +// p1 := ipv6.NewPacketConn(c1) +// if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// p2 := ipv6.NewPacketConn(c2) +// if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// +// Also it is possible for the application to leave or rejoin a +// multicast group on the network interface. +// +// if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff01::114")}); err != nil { +// // error handling +// } +// +// +// Source-specific multicasting +// +// An application that uses PacketConn on MLDv2 supported platform is +// able to join source-specific multicast groups. +// The application may use JoinSourceSpecificGroup and +// LeaveSourceSpecificGroup for the operation known as "include" mode, +// +// ssmgroup := net.UDPAddr{IP: net.ParseIP("ff32::8000:9")} +// ssmsource := net.UDPAddr{IP: net.ParseIP("fe80::cafe")} +// if err := p.JoinSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// if err := p.LeaveSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// +// or JoinGroup, ExcludeSourceSpecificGroup, +// IncludeSourceSpecificGroup and LeaveGroup for the operation known +// as "exclude" mode. +// +// exclsource := net.UDPAddr{IP: net.ParseIP("fe80::dead")} +// if err := p.JoinGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// if err := p.ExcludeSourceSpecificGroup(en0, &ssmgroup, &exclsource); err != nil { +// // error handling +// } +// if err := p.LeaveGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// +// Note that it depends on each platform implementation what happens +// when an application which runs on MLDv2 unsupported platform uses +// JoinSourceSpecificGroup and LeaveSourceSpecificGroup. +// In general the platform tries to fall back to conversations using +// MLDv1 and starts to listen to multicast traffic. +// In the fallback case, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup may return an error. +package ipv6 // import "golang.org/x/net/ipv6" + +// BUG(mikio): This package is not implemented on JS, NaCl and Plan 9. diff --git a/vendor/golang.org/x/net/ipv6/endpoint.go b/vendor/golang.org/x/net/ipv6/endpoint.go new file mode 100644 index 00000000..f534a0bf --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/endpoint.go @@ -0,0 +1,127 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "time" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the JoinSourceSpecificGroup, +// LeaveSourceSpecificGroup, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup methods of PacketConn are not +// implemented. + +// A Conn represents a network endpoint that uses IPv6 transport. +// It allows to set basic IP-level socket options such as traffic +// class and hop limit. +type Conn struct { + genericOpt +} + +type genericOpt struct { + *socket.Conn +} + +func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } + +// PathMTU returns a path MTU value for the destination associated +// with the endpoint. +func (c *Conn) PathMTU() (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + so, ok := sockOpts[ssoPathMTU] + if !ok { + return 0, errNotImplemented + } + _, mtu, err := so.getMTUInfo(c.Conn) + if err != nil { + return 0, err + } + return mtu, nil +} + +// NewConn returns a new Conn. +func NewConn(c net.Conn) *Conn { + cc, _ := socket.NewConn(c) + return &Conn{ + genericOpt: genericOpt{Conn: cc}, + } +} + +// A PacketConn represents a packet network endpoint that uses IPv6 +// transport. It is used to control several IP-level socket options +// including IPv6 header manipulation. It also provides datagram +// based network I/O methods specific to the IPv6 and higher layer +// protocols such as OSPF, GRE, and UDP. +type PacketConn struct { + genericOpt + dgramOpt + payloadHandler +} + +type dgramOpt struct { + *socket.Conn +} + +func (c *dgramOpt) ok() bool { return c != nil && c.Conn != nil } + +// SetControlMessage allows to receive the per packet basis IP-level +// socket options. +func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.payloadHandler.ok() { + return errInvalidConn + } + return setControlMessage(c.dgramOpt.Conn, &c.payloadHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return errInvalidConn + } + return c.payloadHandler.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return errInvalidConn + } + return c.payloadHandler.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return errInvalidConn + } + return c.payloadHandler.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.payloadHandler.ok() { + return errInvalidConn + } + return c.payloadHandler.Close() +} + +// NewPacketConn returns a new PacketConn using c as its underlying +// transport. +func NewPacketConn(c net.PacketConn) *PacketConn { + cc, _ := socket.NewConn(c.(net.Conn)) + return &PacketConn{ + genericOpt: genericOpt{Conn: cc}, + dgramOpt: dgramOpt{Conn: cc}, + payloadHandler: payloadHandler{PacketConn: c, Conn: cc}, + } +} diff --git a/vendor/golang.org/x/net/ipv6/genericopt.go b/vendor/golang.org/x/net/ipv6/genericopt.go new file mode 100644 index 00000000..0326aed6 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/genericopt.go @@ -0,0 +1,56 @@ +// Copyright 2013 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 ipv6 + +// TrafficClass returns the traffic class field value for outgoing +// packets. +func (c *genericOpt) TrafficClass() (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + so, ok := sockOpts[ssoTrafficClass] + if !ok { + return 0, errNotImplemented + } + return so.GetInt(c.Conn) +} + +// SetTrafficClass sets the traffic class field value for future +// outgoing packets. +func (c *genericOpt) SetTrafficClass(tclass int) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoTrafficClass] + if !ok { + return errNotImplemented + } + return so.SetInt(c.Conn, tclass) +} + +// HopLimit returns the hop limit field value for outgoing packets. +func (c *genericOpt) HopLimit() (int, error) { + if !c.ok() { + return 0, errInvalidConn + } + so, ok := sockOpts[ssoHopLimit] + if !ok { + return 0, errNotImplemented + } + return so.GetInt(c.Conn) +} + +// SetHopLimit sets the hop limit field value for future outgoing +// packets. +func (c *genericOpt) SetHopLimit(hoplim int) error { + if !c.ok() { + return errInvalidConn + } + so, ok := sockOpts[ssoHopLimit] + if !ok { + return errNotImplemented + } + return so.SetInt(c.Conn, hoplim) +} diff --git a/vendor/golang.org/x/net/ipv6/header.go b/vendor/golang.org/x/net/ipv6/header.go new file mode 100644 index 00000000..e05cb08b --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/header.go @@ -0,0 +1,55 @@ +// 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 ipv6 + +import ( + "encoding/binary" + "fmt" + "net" +) + +const ( + Version = 6 // protocol version + HeaderLen = 40 // header length +) + +// A Header represents an IPv6 base header. +type Header struct { + Version int // protocol version + TrafficClass int // traffic class + FlowLabel int // flow label + PayloadLen int // payload length + NextHeader int // next header + HopLimit int // hop limit + Src net.IP // source address + Dst net.IP // destination address +} + +func (h *Header) String() string { + if h == nil { + return "" + } + return fmt.Sprintf("ver=%d tclass=%#x flowlbl=%#x payloadlen=%d nxthdr=%d hoplim=%d src=%v dst=%v", h.Version, h.TrafficClass, h.FlowLabel, h.PayloadLen, h.NextHeader, h.HopLimit, h.Src, h.Dst) +} + +// ParseHeader parses b as an IPv6 base header. +func ParseHeader(b []byte) (*Header, error) { + if len(b) < HeaderLen { + return nil, errHeaderTooShort + } + h := &Header{ + Version: int(b[0]) >> 4, + TrafficClass: int(b[0]&0x0f)<<4 | int(b[1])>>4, + FlowLabel: int(b[1]&0x0f)<<16 | int(b[2])<<8 | int(b[3]), + PayloadLen: int(binary.BigEndian.Uint16(b[4:6])), + NextHeader: int(b[6]), + HopLimit: int(b[7]), + } + h.Src = make(net.IP, net.IPv6len) + copy(h.Src, b[8:24]) + h.Dst = make(net.IP, net.IPv6len) + copy(h.Dst, b[24:40]) + return h, nil +} diff --git a/vendor/golang.org/x/net/ipv6/helper.go b/vendor/golang.org/x/net/ipv6/helper.go new file mode 100644 index 00000000..c2d508f9 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/helper.go @@ -0,0 +1,58 @@ +// Copyright 2013 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 ipv6 + +import ( + "errors" + "net" + "runtime" +) + +var ( + errInvalidConn = errors.New("invalid connection") + errMissingAddress = errors.New("missing address") + errHeaderTooShort = errors.New("header too short") + errInvalidConnType = errors.New("invalid conn type") + errNotImplemented = errors.New("not implemented on " + runtime.GOOS + "/" + runtime.GOARCH) +) + +func boolint(b bool) int { + if b { + return 1 + } + return 0 +} + +func netAddrToIP16(a net.Addr) net.IP { + switch v := a.(type) { + case *net.UDPAddr: + if ip := v.IP.To16(); ip != nil && ip.To4() == nil { + return ip + } + case *net.IPAddr: + if ip := v.IP.To16(); ip != nil && ip.To4() == nil { + return ip + } + } + return nil +} + +func opAddr(a net.Addr) net.Addr { + switch a.(type) { + case *net.TCPAddr: + if a == nil { + return nil + } + case *net.UDPAddr: + if a == nil { + return nil + } + case *net.IPAddr: + if a == nil { + return nil + } + } + return a +} diff --git a/vendor/golang.org/x/net/ipv6/iana.go b/vendor/golang.org/x/net/ipv6/iana.go new file mode 100644 index 00000000..32db1aa9 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/iana.go @@ -0,0 +1,86 @@ +// go generate gen.go +// Code generated by the command above; DO NOT EDIT. + +package ipv6 + +// Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2018-03-09 +const ( + ICMPTypeDestinationUnreachable ICMPType = 1 // Destination Unreachable + ICMPTypePacketTooBig ICMPType = 2 // Packet Too Big + ICMPTypeTimeExceeded ICMPType = 3 // Time Exceeded + ICMPTypeParameterProblem ICMPType = 4 // Parameter Problem + ICMPTypeEchoRequest ICMPType = 128 // Echo Request + ICMPTypeEchoReply ICMPType = 129 // Echo Reply + ICMPTypeMulticastListenerQuery ICMPType = 130 // Multicast Listener Query + ICMPTypeMulticastListenerReport ICMPType = 131 // Multicast Listener Report + ICMPTypeMulticastListenerDone ICMPType = 132 // Multicast Listener Done + ICMPTypeRouterSolicitation ICMPType = 133 // Router Solicitation + ICMPTypeRouterAdvertisement ICMPType = 134 // Router Advertisement + ICMPTypeNeighborSolicitation ICMPType = 135 // Neighbor Solicitation + ICMPTypeNeighborAdvertisement ICMPType = 136 // Neighbor Advertisement + ICMPTypeRedirect ICMPType = 137 // Redirect Message + ICMPTypeRouterRenumbering ICMPType = 138 // Router Renumbering + ICMPTypeNodeInformationQuery ICMPType = 139 // ICMP Node Information Query + ICMPTypeNodeInformationResponse ICMPType = 140 // ICMP Node Information Response + ICMPTypeInverseNeighborDiscoverySolicitation ICMPType = 141 // Inverse Neighbor Discovery Solicitation Message + ICMPTypeInverseNeighborDiscoveryAdvertisement ICMPType = 142 // Inverse Neighbor Discovery Advertisement Message + ICMPTypeVersion2MulticastListenerReport ICMPType = 143 // Version 2 Multicast Listener Report + ICMPTypeHomeAgentAddressDiscoveryRequest ICMPType = 144 // Home Agent Address Discovery Request Message + ICMPTypeHomeAgentAddressDiscoveryReply ICMPType = 145 // Home Agent Address Discovery Reply Message + ICMPTypeMobilePrefixSolicitation ICMPType = 146 // Mobile Prefix Solicitation + ICMPTypeMobilePrefixAdvertisement ICMPType = 147 // Mobile Prefix Advertisement + ICMPTypeCertificationPathSolicitation ICMPType = 148 // Certification Path Solicitation Message + ICMPTypeCertificationPathAdvertisement ICMPType = 149 // Certification Path Advertisement Message + ICMPTypeMulticastRouterAdvertisement ICMPType = 151 // Multicast Router Advertisement + ICMPTypeMulticastRouterSolicitation ICMPType = 152 // Multicast Router Solicitation + ICMPTypeMulticastRouterTermination ICMPType = 153 // Multicast Router Termination + ICMPTypeFMIPv6 ICMPType = 154 // FMIPv6 Messages + ICMPTypeRPLControl ICMPType = 155 // RPL Control Message + ICMPTypeILNPv6LocatorUpdate ICMPType = 156 // ILNPv6 Locator Update Message + ICMPTypeDuplicateAddressRequest ICMPType = 157 // Duplicate Address Request + ICMPTypeDuplicateAddressConfirmation ICMPType = 158 // Duplicate Address Confirmation + ICMPTypeMPLControl ICMPType = 159 // MPL Control Message + ICMPTypeExtendedEchoRequest ICMPType = 160 // Extended Echo Request + ICMPTypeExtendedEchoReply ICMPType = 161 // Extended Echo Reply +) + +// Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2018-03-09 +var icmpTypes = map[ICMPType]string{ + 1: "destination unreachable", + 2: "packet too big", + 3: "time exceeded", + 4: "parameter problem", + 128: "echo request", + 129: "echo reply", + 130: "multicast listener query", + 131: "multicast listener report", + 132: "multicast listener done", + 133: "router solicitation", + 134: "router advertisement", + 135: "neighbor solicitation", + 136: "neighbor advertisement", + 137: "redirect message", + 138: "router renumbering", + 139: "icmp node information query", + 140: "icmp node information response", + 141: "inverse neighbor discovery solicitation message", + 142: "inverse neighbor discovery advertisement message", + 143: "version 2 multicast listener report", + 144: "home agent address discovery request message", + 145: "home agent address discovery reply message", + 146: "mobile prefix solicitation", + 147: "mobile prefix advertisement", + 148: "certification path solicitation message", + 149: "certification path advertisement message", + 151: "multicast router advertisement", + 152: "multicast router solicitation", + 153: "multicast router termination", + 154: "fmipv6 messages", + 155: "rpl control message", + 156: "ilnpv6 locator update message", + 157: "duplicate address request", + 158: "duplicate address confirmation", + 159: "mpl control message", + 160: "extended echo request", + 161: "extended echo reply", +} diff --git a/vendor/golang.org/x/net/ipv6/icmp.go b/vendor/golang.org/x/net/ipv6/icmp.go new file mode 100644 index 00000000..b7f48e27 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp.go @@ -0,0 +1,60 @@ +// Copyright 2013 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 ipv6 + +import "golang.org/x/net/internal/iana" + +// BUG(mikio): On Windows, methods related to ICMPFilter are not +// implemented. + +// An ICMPType represents a type of ICMP message. +type ICMPType int + +func (typ ICMPType) String() string { + s, ok := icmpTypes[typ] + if !ok { + return "" + } + return s +} + +// Protocol returns the ICMPv6 protocol number. +func (typ ICMPType) Protocol() int { + return iana.ProtocolIPv6ICMP +} + +// An ICMPFilter represents an ICMP message filter for incoming +// packets. The filter belongs to a packet delivery path on a host and +// it cannot interact with forwarding packets or tunnel-outer packets. +// +// Note: RFC 8200 defines a reasonable role model. A node means a +// device that implements IP. A router means a node that forwards IP +// packets not explicitly addressed to itself, and a host means a node +// that is not a router. +type ICMPFilter struct { + icmpv6Filter +} + +// Accept accepts incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Accept(typ ICMPType) { + f.accept(typ) +} + +// Block blocks incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Block(typ ICMPType) { + f.block(typ) +} + +// SetAll sets the filter action to the filter. +func (f *ICMPFilter) SetAll(block bool) { + f.setAll(block) +} + +// WillBlock reports whether the ICMP type will be blocked. +func (f *ICMPFilter) WillBlock(typ ICMPType) bool { + return f.willBlock(typ) +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_bsd.go b/vendor/golang.org/x/net/ipv6/icmp_bsd.go new file mode 100644 index 00000000..b03025cd --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_bsd.go @@ -0,0 +1,29 @@ +// Copyright 2013 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. + +// +build aix darwin dragonfly freebsd netbsd openbsd + +package ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + f.Filt[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) block(typ ICMPType) { + f.Filt[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) setAll(block bool) { + for i := range f.Filt { + if block { + f.Filt[i] = 0 + } else { + f.Filt[i] = 1<<32 - 1 + } + } +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return f.Filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_linux.go b/vendor/golang.org/x/net/ipv6/icmp_linux.go new file mode 100644 index 00000000..647f6b44 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_linux.go @@ -0,0 +1,27 @@ +// Copyright 2013 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 ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + f.Data[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) block(typ ICMPType) { + f.Data[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) setAll(block bool) { + for i := range f.Data { + if block { + f.Data[i] = 1<<32 - 1 + } else { + f.Data[i] = 0 + } + } +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return f.Data[typ>>5]&(1<<(uint32(typ)&31)) != 0 +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_solaris.go b/vendor/golang.org/x/net/ipv6/icmp_solaris.go new file mode 100644 index 00000000..7c23bb1c --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_solaris.go @@ -0,0 +1,27 @@ +// Copyright 2013 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 ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + f.X__icmp6_filt[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) block(typ ICMPType) { + f.X__icmp6_filt[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *icmpv6Filter) setAll(block bool) { + for i := range f.X__icmp6_filt { + if block { + f.X__icmp6_filt[i] = 0 + } else { + f.X__icmp6_filt[i] = 1<<32 - 1 + } + } +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return f.X__icmp6_filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_stub.go b/vendor/golang.org/x/net/ipv6/icmp_stub.go new file mode 100644 index 00000000..370e51ac --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_stub.go @@ -0,0 +1,23 @@ +// Copyright 2013 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +type icmpv6Filter struct { +} + +func (f *icmpv6Filter) accept(typ ICMPType) { +} + +func (f *icmpv6Filter) block(typ ICMPType) { +} + +func (f *icmpv6Filter) setAll(block bool) { +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return false +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_windows.go b/vendor/golang.org/x/net/ipv6/icmp_windows.go new file mode 100644 index 00000000..443cd073 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_windows.go @@ -0,0 +1,22 @@ +// Copyright 2013 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 ipv6 + +func (f *icmpv6Filter) accept(typ ICMPType) { + // TODO(mikio): implement this +} + +func (f *icmpv6Filter) block(typ ICMPType) { + // TODO(mikio): implement this +} + +func (f *icmpv6Filter) setAll(block bool) { + // TODO(mikio): implement this +} + +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + // TODO(mikio): implement this + return false +} diff --git a/vendor/golang.org/x/net/ipv6/payload.go b/vendor/golang.org/x/net/ipv6/payload.go new file mode 100644 index 00000000..a8197f16 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/payload.go @@ -0,0 +1,23 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +// BUG(mikio): On Windows, the ControlMessage for ReadFrom and WriteTo +// methods of PacketConn is not implemented. + +// A payloadHandler represents the IPv6 datagram payload handler. +type payloadHandler struct { + net.PacketConn + *socket.Conn + rawOpt +} + +func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil && c.Conn != nil } diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/vendor/golang.org/x/net/ipv6/payload_cmsg.go new file mode 100644 index 00000000..284a0427 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/payload_cmsg.go @@ -0,0 +1,70 @@ +// Copyright 2013 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +// ReadFrom reads a payload of the received IPv6 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, errInvalidConn + } + c.rawOpt.RLock() + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: NewControlMessage(c.rawOpt.cflags), + } + c.rawOpt.RUnlock() + switch c.PacketConn.(type) { + case *net.UDPConn: + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + case *net.IPConn: + if err := c.RecvMsg(&m, 0); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + default: + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: errInvalidConnType} + } + if m.NN > 0 { + cm = new(ControlMessage) + if err := cm.Parse(m.OOB[:m.NN]); err != nil { + return 0, nil, nil, &net.OpError{Op: "read", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Err: err} + } + cm.Src = netAddrToIP16(m.Addr) + } + return m.N, cm, m.Addr, nil +} + +// WriteTo writes a payload of the IPv6 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the IPv6 header fields and the datagram path to be specified. The +// cm may be nil if control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, errInvalidConn + } + m := socket.Message{ + Buffers: [][]byte{b}, + OOB: cm.Marshal(), + Addr: dst, + } + err = c.SendMsg(&m, 0) + if err != nil { + err = &net.OpError{Op: "write", Net: c.PacketConn.LocalAddr().Network(), Source: c.PacketConn.LocalAddr(), Addr: opAddr(dst), Err: err} + } + return m.N, err +} diff --git a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go new file mode 100644 index 00000000..c5a4c967 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go @@ -0,0 +1,38 @@ +// Copyright 2013 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package ipv6 + +import "net" + +// ReadFrom reads a payload of the received IPv6 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, errInvalidConn + } + if n, src, err = c.PacketConn.ReadFrom(b); err != nil { + return 0, nil, nil, err + } + return +} + +// WriteTo writes a payload of the IPv6 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the IPv6 header fields and the datagram path to be specified. The +// cm may be nil if control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, errInvalidConn + } + if dst == nil { + return 0, errMissingAddress + } + return c.PacketConn.WriteTo(b, dst) +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt.go b/vendor/golang.org/x/net/ipv6/sockopt.go new file mode 100644 index 00000000..cc3907df --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt.go @@ -0,0 +1,43 @@ +// 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 ipv6 + +import "golang.org/x/net/internal/socket" + +// Sticky socket options +const ( + ssoTrafficClass = iota // header field for unicast packet, RFC 3542 + ssoHopLimit // header field for unicast packet, RFC 3493 + ssoMulticastInterface // outbound interface for multicast packet, RFC 3493 + ssoMulticastHopLimit // header field for multicast packet, RFC 3493 + ssoMulticastLoopback // loopback for multicast packet, RFC 3493 + ssoReceiveTrafficClass // header field on received packet, RFC 3542 + ssoReceiveHopLimit // header field on received packet, RFC 2292 or 3542 + ssoReceivePacketInfo // incbound or outbound packet path, RFC 2292 or 3542 + ssoReceivePathMTU // path mtu, RFC 3542 + ssoPathMTU // path mtu, RFC 3542 + ssoChecksum // packet checksum, RFC 2292 or 3542 + ssoICMPFilter // icmp filter, RFC 2292 or 3542 + ssoJoinGroup // any-source multicast, RFC 3493 + ssoLeaveGroup // any-source multicast, RFC 3493 + ssoJoinSourceGroup // source-specific multicast + ssoLeaveSourceGroup // source-specific multicast + ssoBlockSourceGroup // any-source or source-specific multicast + ssoUnblockSourceGroup // any-source or source-specific multicast + ssoAttachFilter // attach BPF for filtering inbound traffic +) + +// Sticky socket option value types +const ( + ssoTypeIPMreq = iota + 1 + ssoTypeGroupReq + ssoTypeGroupSourceReq +) + +// A sockOpt represents a binding for sticky socket option. +type sockOpt struct { + socket.Option + typ int // hint for option value type; optional +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_posix.go b/vendor/golang.org/x/net/ipv6/sockopt_posix.go new file mode 100644 index 00000000..824c623c --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt_posix.go @@ -0,0 +1,89 @@ +// Copyright 2013 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package ipv6 + +import ( + "net" + "runtime" + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + n, err := so.GetInt(c) + if err != nil { + return nil, err + } + return net.InterfaceByIndex(n) +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + var n int + if ifi != nil { + n = ifi.Index + } + return so.SetInt(c, n) +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + b := make([]byte, so.Len) + n, err := so.Get(c, b) + if err != nil { + return nil, err + } + if n != sizeofICMPv6Filter { + return nil, errNotImplemented + } + return (*ICMPFilter)(unsafe.Pointer(&b[0])), nil +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + b := (*[sizeofICMPv6Filter]byte)(unsafe.Pointer(f))[:sizeofICMPv6Filter] + return so.Set(c, b) +} + +func (so *sockOpt) getMTUInfo(c *socket.Conn) (*net.Interface, int, error) { + b := make([]byte, so.Len) + n, err := so.Get(c, b) + if err != nil { + return nil, 0, err + } + if n != sizeofIPv6Mtuinfo { + return nil, 0, errNotImplemented + } + mi := (*ipv6Mtuinfo)(unsafe.Pointer(&b[0])) + if mi.Addr.Scope_id == 0 || runtime.GOOS == "aix" { + // AIX kernel might return a wrong address. + return nil, int(mi.Mtu), nil + } + ifi, err := net.InterfaceByIndex(int(mi.Addr.Scope_id)) + if err != nil { + return nil, 0, err + } + return ifi, int(mi.Mtu), nil +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + switch so.typ { + case ssoTypeIPMreq: + return so.setIPMreq(c, ifi, grp) + case ssoTypeGroupReq: + return so.setGroupReq(c, ifi, grp) + default: + return errNotImplemented + } +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return so.setGroupSourceReq(c, ifi, grp, src) +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return so.setAttachFilter(c, f) +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_stub.go b/vendor/golang.org/x/net/ipv6/sockopt_stub.go new file mode 100644 index 00000000..0a87a93b --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt_stub.go @@ -0,0 +1,46 @@ +// Copyright 2013 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +import ( + "net" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) getMulticastInterface(c *socket.Conn) (*net.Interface, error) { + return nil, errNotImplemented +} + +func (so *sockOpt) setMulticastInterface(c *socket.Conn, ifi *net.Interface) error { + return errNotImplemented +} + +func (so *sockOpt) getICMPFilter(c *socket.Conn) (*ICMPFilter, error) { + return nil, errNotImplemented +} + +func (so *sockOpt) setICMPFilter(c *socket.Conn, f *ICMPFilter) error { + return errNotImplemented +} + +func (so *sockOpt) getMTUInfo(c *socket.Conn) (*net.Interface, int, error) { + return nil, 0, errNotImplemented +} + +func (so *sockOpt) setGroup(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errNotImplemented +} + +func (so *sockOpt) setSourceGroup(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errNotImplemented +} + +func (so *sockOpt) setBPF(c *socket.Conn, f []bpf.RawInstruction) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv6/sys_aix.go b/vendor/golang.org/x/net/ipv6/sys_aix.go new file mode 100644 index 00000000..bce7091f --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_aix.go @@ -0,0 +1,77 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Added for go1.11 compatibility +// +build aix + +package ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_JOIN_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_LEAVE_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 132)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_asmreq.go b/vendor/golang.org/x/net/ipv6/sys_asmreq.go new file mode 100644 index 00000000..8c3934c3 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_asmreq.go @@ -0,0 +1,24 @@ +// Copyright 2013 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var mreq ipv6Mreq + copy(mreq.Multiaddr[:], grp) + if ifi != nil { + mreq.setIfindex(ifi.Index) + } + b := (*[sizeofIPv6Mreq]byte)(unsafe.Pointer(&mreq))[:sizeofIPv6Mreq] + return so.Set(c, b) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go b/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go new file mode 100644 index 00000000..87ae4818 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go @@ -0,0 +1,17 @@ +// Copyright 2013 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf.go b/vendor/golang.org/x/net/ipv6/sys_bpf.go new file mode 100644 index 00000000..90ef4dfa --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_bpf.go @@ -0,0 +1,24 @@ +// 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. + +// +build linux + +package ipv6 + +import ( + "unsafe" + + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" + "golang.org/x/sys/unix" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + prog := unix.SockFprog{ + Len: uint16(len(f)), + Filter: (*unix.SockFilter)(unsafe.Pointer(&f[0])), + } + b := (*[unix.SizeofSockFprog]byte)(unsafe.Pointer(&prog))[:unix.SizeofSockFprog] + return so.Set(c, b) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go b/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go new file mode 100644 index 00000000..eb9f8316 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go @@ -0,0 +1,16 @@ +// 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. + +// +build !linux + +package ipv6 + +import ( + "golang.org/x/net/bpf" + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv6/sys_bsd.go b/vendor/golang.org/x/net/ipv6/sys_bsd.go new file mode 100644 index 00000000..e416eaa1 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_bsd.go @@ -0,0 +1,57 @@ +// Copyright 2013 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. + +// +build dragonfly netbsd openbsd + +package ipv6 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_JOIN_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_LEAVE_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_darwin.go b/vendor/golang.org/x/net/ipv6/sys_darwin.go new file mode 100644 index 00000000..12cc5cb2 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_darwin.go @@ -0,0 +1,78 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 132)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_freebsd.go b/vendor/golang.org/x/net/ipv6/sys_freebsd.go new file mode 100644 index 00000000..85a9f5d0 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_freebsd.go @@ -0,0 +1,92 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "runtime" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func init() { + if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { + archs, _ := syscall.Sysctl("kern.supported_archs") + for _, s := range strings.Fields(archs) { + if s == "amd64" { + compatFreeBSD32 = true + break + } + } + } +} + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gr.Group)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gsr.Group)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(&gsr.Source)) + sa.Len = sizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_linux.go b/vendor/golang.org/x/net/ipv6/sys_linux.go new file mode 100644 index 00000000..96e8093a --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_linux.go @@ -0,0 +1,75 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" + "golang.org/x/sys/unix" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolReserved, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMPV6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoAttachFilter: {Option: socket.Option{Level: unix.SOL_SOCKET, Name: unix.SO_ATTACH_FILTER, Len: unix.SizeofSockFprog}}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Ifindex = int32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gr.Group)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gsr.Group)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(&gsr.Source)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_solaris.go b/vendor/golang.org/x/net/ipv6/sys_solaris.go new file mode 100644 index 00000000..d348b5f6 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_solaris.go @@ -0,0 +1,74 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = map[int]*sockOpt{ + ssoTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_TCLASS, Len: 4}}, + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoReceiveTrafficClass: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVTCLASS, Len: 4}}, + ssoReceiveHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVHOPLIMIT, Len: 4}}, + ssoReceivePacketInfo: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPKTINFO, Len: 4}}, + ssoReceivePathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_RECVPATHMTU, Len: 4}}, + ssoPathMTU: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_PATHMTU, Len: sizeofIPv6Mtuinfo}}, + ssoChecksum: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_CHECKSUM, Len: 4}}, + ssoICMPFilter: {Option: socket.Option{Level: iana.ProtocolIPv6ICMP, Name: sysICMP6_FILTER, Len: sizeofICMPv6Filter}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_GROUP, Len: sizeofGroupReq}, typ: ssoTypeGroupReq}, + ssoJoinSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_JOIN_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 260)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_ssmreq.go b/vendor/golang.org/x/net/ipv6/sys_ssmreq.go new file mode 100644 index 00000000..9b52e978 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_ssmreq.go @@ -0,0 +1,54 @@ +// 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. + +// +build aix darwin freebsd linux solaris + +package ipv6 + +import ( + "net" + "unsafe" + + "golang.org/x/net/internal/socket" +) + +var compatFreeBSD32 bool // 386 emulation on amd64 + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + var gr groupReq + if ifi != nil { + gr.Interface = uint32(ifi.Index) + } + gr.setGroup(grp) + var b []byte + if compatFreeBSD32 { + var d [sizeofGroupReq + 4]byte + s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr))[:sizeofGroupReq] + } + return so.Set(c, b) +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + var gsr groupSourceReq + if ifi != nil { + gsr.Interface = uint32(ifi.Index) + } + gsr.setSourceGroup(grp, src) + var b []byte + if compatFreeBSD32 { + var d [sizeofGroupSourceReq + 4]byte + s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + b = d[:] + } else { + b = (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr))[:sizeofGroupSourceReq] + } + return so.Set(c, b) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go b/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go new file mode 100644 index 00000000..d5bc1108 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go @@ -0,0 +1,21 @@ +// 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. + +// +build !aix,!darwin,!freebsd,!linux,!solaris + +package ipv6 + +import ( + "net" + + "golang.org/x/net/internal/socket" +) + +func (so *sockOpt) setGroupReq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { + return errNotImplemented +} + +func (so *sockOpt) setGroupSourceReq(c *socket.Conn, ifi *net.Interface, grp, src net.IP) error { + return errNotImplemented +} diff --git a/vendor/golang.org/x/net/ipv6/sys_stub.go b/vendor/golang.org/x/net/ipv6/sys_stub.go new file mode 100644 index 00000000..4f252d09 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_stub.go @@ -0,0 +1,13 @@ +// 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. + +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package ipv6 + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{} +) diff --git a/vendor/golang.org/x/net/ipv6/sys_windows.go b/vendor/golang.org/x/net/ipv6/sys_windows.go new file mode 100644 index 00000000..fc36b018 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_windows.go @@ -0,0 +1,75 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/socket" +) + +const ( + // See ws2tcpip.h. + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PKTINFO = 0x13 + + sizeofSockaddrInet6 = 0x1c + + sizeofIPv6Mreq = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofICMPv6Filter = 0 +) + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type icmpv6Filter struct { + // TODO(mikio): implement this +} + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = map[int]*sockOpt{ + ssoHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_UNICAST_HOPS, Len: 4}}, + ssoMulticastInterface: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_IF, Len: 4}}, + ssoMulticastHopLimit: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_HOPS, Len: 4}}, + ssoMulticastLoopback: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_MULTICAST_LOOP, Len: 4}}, + ssoJoinGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_JOIN_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + ssoLeaveGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysIPV6_LEAVE_GROUP, Len: sizeofIPv6Mreq}, typ: ssoTypeIPMreq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go new file mode 100644 index 00000000..bf44e338 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go @@ -0,0 +1,103 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_aix.go + +// Added for go1.11 compatibility +// +build aix + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysICMP6_FILTER = 0x26 + + sysIPV6_CHECKSUM = 0x27 + sysIPV6_V6ONLY = 0x25 + + sysIPV6_RTHDRDSTOPTS = 0x37 + + sysIPV6_RECVPKTINFO = 0x23 + sysIPV6_RECVHOPLIMIT = 0x29 + sysIPV6_RECVRTHDR = 0x33 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_RECVDSTOPTS = 0x38 + + sysIPV6_USE_MIN_MTU = 0x2c + sysIPV6_RECVPATHMTU = 0x2f + sysIPV6_PATHMTU = 0x2e + + sysIPV6_PKTINFO = 0x21 + sysIPV6_HOPLIMIT = 0x28 + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x34 + sysIPV6_DSTOPTS = 0x36 + sysIPV6_RTHDR = 0x32 + + sysIPV6_RECVTCLASS = 0x2a + + sysIPV6_TCLASS = 0x2b + sysIPV6_DONTFRAG = 0x2d + + sizeofSockaddrStorage = 0x508 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x510 + sizeofGroupSourceReq = 0xa18 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + X__ss_len uint8 + Family uint8 + X__ss_pad1 [6]uint8 + X__ss_align int64 + X__ss_pad2 [1265]uint8 + Pad_cgo_0 [7]byte +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} + +type groupReq struct { + Interface uint32 + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group sockaddrStorage + Source sockaddrStorage +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_darwin.go b/vendor/golang.org/x/net/ipv6/zsys_darwin.go new file mode 100644 index 00000000..555744af --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_darwin.go @@ -0,0 +1,131 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_darwin.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + sysIPV6_2292PKTINFO = 0x13 + sysIPV6_2292HOPLIMIT = 0x14 + sysIPV6_2292NEXTHOP = 0x15 + sysIPV6_2292HOPOPTS = 0x16 + sysIPV6_2292DSTOPTS = 0x17 + sysIPV6_2292RTHDR = 0x18 + + sysIPV6_2292PKTOPTIONS = 0x19 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RECVTCLASS = 0x23 + sysIPV6_TCLASS = 0x24 + + sysIPV6_RTHDRDSTOPTS = 0x39 + + sysIPV6_RECVPKTINFO = 0x3d + + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_MSFILTER = 0x4a + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_BOUND_IF = 0x7d + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [128]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [128]byte + Pad_cgo_1 [128]byte +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go new file mode 100644 index 00000000..cf3cc102 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go @@ -0,0 +1,88 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_dragonfly.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go new file mode 100644 index 00000000..73f31b26 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go @@ -0,0 +1,122 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group sockaddrStorage + Source sockaddrStorage +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go new file mode 100644 index 00000000..490ce7cf --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go @@ -0,0 +1,124 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go new file mode 100644 index 00000000..490ce7cf --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go @@ -0,0 +1,124 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sockaddrStorage + Source sockaddrStorage +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm64.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm64.go new file mode 100644 index 00000000..47e99ac9 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm64.go @@ -0,0 +1,122 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]uint8 + X__ss_align int64 + X__ss_pad2 [112]uint8 +} + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Group sockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group sockaddrStorage + Source sockaddrStorage +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go new file mode 100644 index 00000000..bde4a8f8 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go @@ -0,0 +1,152 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go new file mode 100644 index 00000000..992ac9ec --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go @@ -0,0 +1,154 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go new file mode 100644 index 00000000..bde4a8f8 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go @@ -0,0 +1,152 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go new file mode 100644 index 00000000..992ac9ec --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go @@ -0,0 +1,154 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go new file mode 100644 index 00000000..bde4a8f8 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go @@ -0,0 +1,152 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go new file mode 100644 index 00000000..992ac9ec --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go @@ -0,0 +1,154 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go new file mode 100644 index 00000000..992ac9ec --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go @@ -0,0 +1,154 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go new file mode 100644 index 00000000..bde4a8f8 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go @@ -0,0 +1,152 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go new file mode 100644 index 00000000..66fd2361 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go @@ -0,0 +1,152 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]uint8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go new file mode 100644 index 00000000..992ac9ec --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go @@ -0,0 +1,154 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go new file mode 100644 index 00000000..992ac9ec --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go @@ -0,0 +1,154 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go new file mode 100644 index 00000000..6083ddce --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go @@ -0,0 +1,156 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +// +build riscv64 + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go new file mode 100644 index 00000000..992ac9ec --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go @@ -0,0 +1,154 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPv6Filter = 0x20 +) + +type kernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group kernelSockaddrStorage + Source kernelSockaddrStorage +} + +type icmpv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_netbsd.go b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go new file mode 100644 index 00000000..e39571e0 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go @@ -0,0 +1,84 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_netbsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_openbsd.go b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go new file mode 100644 index 00000000..cc1899a6 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go @@ -0,0 +1,93 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_openbsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_AUTH_LEVEL = 0x35 + sysIPV6_ESP_TRANS_LEVEL = 0x36 + sysIPV6_ESP_NETWORK_LEVEL = 0x37 + sysIPSEC6_OUTSA = 0x38 + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + sysIPV6_IPCOMP_LEVEL = 0x3c + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + sysIPV6_PIPEX = 0x3f + + sysIPV6_RTABLE = 0x1021 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + + sizeofIPv6Mreq = 0x14 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type icmpv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_solaris.go b/vendor/golang.org/x/net/ipv6/zsys_solaris.go new file mode 100644 index 00000000..690eef93 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_solaris.go @@ -0,0 +1,131 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs defs_solaris.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x5 + sysIPV6_MULTICAST_IF = 0x6 + sysIPV6_MULTICAST_HOPS = 0x7 + sysIPV6_MULTICAST_LOOP = 0x8 + sysIPV6_JOIN_GROUP = 0x9 + sysIPV6_LEAVE_GROUP = 0xa + + sysIPV6_PKTINFO = 0xb + + sysIPV6_HOPLIMIT = 0xc + sysIPV6_NEXTHOP = 0xd + sysIPV6_HOPOPTS = 0xe + sysIPV6_DSTOPTS = 0xf + + sysIPV6_RTHDR = 0x10 + sysIPV6_RTHDRDSTOPTS = 0x11 + + sysIPV6_RECVPKTINFO = 0x12 + sysIPV6_RECVHOPLIMIT = 0x13 + sysIPV6_RECVHOPOPTS = 0x14 + + sysIPV6_RECVRTHDR = 0x16 + + sysIPV6_RECVRTHDRDSTOPTS = 0x17 + + sysIPV6_CHECKSUM = 0x18 + sysIPV6_RECVTCLASS = 0x19 + sysIPV6_USE_MIN_MTU = 0x20 + sysIPV6_DONTFRAG = 0x21 + sysIPV6_SEC_OPT = 0x22 + sysIPV6_SRC_PREFERENCES = 0x23 + sysIPV6_RECVPATHMTU = 0x24 + sysIPV6_PATHMTU = 0x25 + sysIPV6_TCLASS = 0x26 + sysIPV6_V6ONLY = 0x27 + + sysIPV6_RECVDSTOPTS = 0x28 + + sysMCAST_JOIN_GROUP = 0x29 + sysMCAST_LEAVE_GROUP = 0x2a + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_JOIN_SOURCE_GROUP = 0x2d + sysMCAST_LEAVE_SOURCE_GROUP = 0x2e + + sysIPV6_PREFER_SRC_HOME = 0x1 + sysIPV6_PREFER_SRC_COA = 0x2 + sysIPV6_PREFER_SRC_PUBLIC = 0x4 + sysIPV6_PREFER_SRC_TMP = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x10 + sysIPV6_PREFER_SRC_CGA = 0x20 + + sysIPV6_PREFER_SRC_MIPMASK = 0x3 + sysIPV6_PREFER_SRC_MIPDEFAULT = 0x1 + sysIPV6_PREFER_SRC_TMPMASK = 0xc + sysIPV6_PREFER_SRC_TMPDEFAULT = 0x4 + sysIPV6_PREFER_SRC_CGAMASK = 0x30 + sysIPV6_PREFER_SRC_CGADEFAULT = 0x10 + + sysIPV6_PREFER_SRC_MASK = 0x3f + + sysIPV6_PREFER_SRC_DEFAULT = 0x15 + + sysIPV6_BOUND_IF = 0x41 + sysIPV6_UNSPEC_SRC = 0x42 + + sysICMP6_FILTER = 0x1 + + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet6 = 0x20 + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x24 + + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x104 + sizeofGroupSourceReq = 0x204 + + sizeofICMPv6Filter = 0x20 +) + +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +type sockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +type inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type ipv6Mtuinfo struct { + Addr sockaddrInet6 + Mtu uint32 +} + +type ipv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [256]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [256]byte + Pad_cgo_1 [256]byte +} + +type icmpv6Filter struct { + X__icmp6_filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/trace/events.go b/vendor/golang.org/x/net/trace/events.go new file mode 100644 index 00000000..c646a695 --- /dev/null +++ b/vendor/golang.org/x/net/trace/events.go @@ -0,0 +1,532 @@ +// 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. + +package trace + +import ( + "bytes" + "fmt" + "html/template" + "io" + "log" + "net/http" + "runtime" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "text/tabwriter" + "time" +) + +const maxEventsPerLog = 100 + +type bucket struct { + MaxErrAge time.Duration + String string +} + +var buckets = []bucket{ + {0, "total"}, + {10 * time.Second, "errs<10s"}, + {1 * time.Minute, "errs<1m"}, + {10 * time.Minute, "errs<10m"}, + {1 * time.Hour, "errs<1h"}, + {10 * time.Hour, "errs<10h"}, + {24000 * time.Hour, "errors"}, +} + +// RenderEvents renders the HTML page typically served at /debug/events. +// It does not do any auth checking. The request may be nil. +// +// Most users will use the Events handler. +func RenderEvents(w http.ResponseWriter, req *http.Request, sensitive bool) { + now := time.Now() + data := &struct { + Families []string // family names + Buckets []bucket + Counts [][]int // eventLog count per family/bucket + + // Set when a bucket has been selected. + Family string + Bucket int + EventLogs eventLogs + Expanded bool + }{ + Buckets: buckets, + } + + data.Families = make([]string, 0, len(families)) + famMu.RLock() + for name := range families { + data.Families = append(data.Families, name) + } + famMu.RUnlock() + sort.Strings(data.Families) + + // Count the number of eventLogs in each family for each error age. + data.Counts = make([][]int, len(data.Families)) + for i, name := range data.Families { + // TODO(sameer): move this loop under the family lock. + f := getEventFamily(name) + data.Counts[i] = make([]int, len(data.Buckets)) + for j, b := range data.Buckets { + data.Counts[i][j] = f.Count(now, b.MaxErrAge) + } + } + + if req != nil { + var ok bool + data.Family, data.Bucket, ok = parseEventsArgs(req) + if !ok { + // No-op + } else { + data.EventLogs = getEventFamily(data.Family).Copy(now, buckets[data.Bucket].MaxErrAge) + } + if data.EventLogs != nil { + defer data.EventLogs.Free() + sort.Sort(data.EventLogs) + } + if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { + data.Expanded = exp + } + } + + famMu.RLock() + defer famMu.RUnlock() + if err := eventsTmpl().Execute(w, data); err != nil { + log.Printf("net/trace: Failed executing template: %v", err) + } +} + +func parseEventsArgs(req *http.Request) (fam string, b int, ok bool) { + fam, bStr := req.FormValue("fam"), req.FormValue("b") + if fam == "" || bStr == "" { + return "", 0, false + } + b, err := strconv.Atoi(bStr) + if err != nil || b < 0 || b >= len(buckets) { + return "", 0, false + } + return fam, b, true +} + +// An EventLog provides a log of events associated with a specific object. +type EventLog interface { + // Printf formats its arguments with fmt.Sprintf and adds the + // result to the event log. + Printf(format string, a ...interface{}) + + // Errorf is like Printf, but it marks this event as an error. + Errorf(format string, a ...interface{}) + + // Finish declares that this event log is complete. + // The event log should not be used after calling this method. + Finish() +} + +// NewEventLog returns a new EventLog with the specified family name +// and title. +func NewEventLog(family, title string) EventLog { + el := newEventLog() + el.ref() + el.Family, el.Title = family, title + el.Start = time.Now() + el.events = make([]logEntry, 0, maxEventsPerLog) + el.stack = make([]uintptr, 32) + n := runtime.Callers(2, el.stack) + el.stack = el.stack[:n] + + getEventFamily(family).add(el) + return el +} + +func (el *eventLog) Finish() { + getEventFamily(el.Family).remove(el) + el.unref() // matches ref in New +} + +var ( + famMu sync.RWMutex + families = make(map[string]*eventFamily) // family name => family +) + +func getEventFamily(fam string) *eventFamily { + famMu.Lock() + defer famMu.Unlock() + f := families[fam] + if f == nil { + f = &eventFamily{} + families[fam] = f + } + return f +} + +type eventFamily struct { + mu sync.RWMutex + eventLogs eventLogs +} + +func (f *eventFamily) add(el *eventLog) { + f.mu.Lock() + f.eventLogs = append(f.eventLogs, el) + f.mu.Unlock() +} + +func (f *eventFamily) remove(el *eventLog) { + f.mu.Lock() + defer f.mu.Unlock() + for i, el0 := range f.eventLogs { + if el == el0 { + copy(f.eventLogs[i:], f.eventLogs[i+1:]) + f.eventLogs = f.eventLogs[:len(f.eventLogs)-1] + return + } + } +} + +func (f *eventFamily) Count(now time.Time, maxErrAge time.Duration) (n int) { + f.mu.RLock() + defer f.mu.RUnlock() + for _, el := range f.eventLogs { + if el.hasRecentError(now, maxErrAge) { + n++ + } + } + return +} + +func (f *eventFamily) Copy(now time.Time, maxErrAge time.Duration) (els eventLogs) { + f.mu.RLock() + defer f.mu.RUnlock() + els = make(eventLogs, 0, len(f.eventLogs)) + for _, el := range f.eventLogs { + if el.hasRecentError(now, maxErrAge) { + el.ref() + els = append(els, el) + } + } + return +} + +type eventLogs []*eventLog + +// Free calls unref on each element of the list. +func (els eventLogs) Free() { + for _, el := range els { + el.unref() + } +} + +// eventLogs may be sorted in reverse chronological order. +func (els eventLogs) Len() int { return len(els) } +func (els eventLogs) Less(i, j int) bool { return els[i].Start.After(els[j].Start) } +func (els eventLogs) Swap(i, j int) { els[i], els[j] = els[j], els[i] } + +// A logEntry is a timestamped log entry in an event log. +type logEntry struct { + When time.Time + Elapsed time.Duration // since previous event in log + NewDay bool // whether this event is on a different day to the previous event + What string + IsErr bool +} + +// WhenString returns a string representation of the elapsed time of the event. +// It will include the date if midnight was crossed. +func (e logEntry) WhenString() string { + if e.NewDay { + return e.When.Format("2006/01/02 15:04:05.000000") + } + return e.When.Format("15:04:05.000000") +} + +// An eventLog represents an active event log. +type eventLog struct { + // Family is the top-level grouping of event logs to which this belongs. + Family string + + // Title is the title of this event log. + Title string + + // Timing information. + Start time.Time + + // Call stack where this event log was created. + stack []uintptr + + // Append-only sequence of events. + // + // TODO(sameer): change this to a ring buffer to avoid the array copy + // when we hit maxEventsPerLog. + mu sync.RWMutex + events []logEntry + LastErrorTime time.Time + discarded int + + refs int32 // how many buckets this is in +} + +func (el *eventLog) reset() { + // Clear all but the mutex. Mutexes may not be copied, even when unlocked. + el.Family = "" + el.Title = "" + el.Start = time.Time{} + el.stack = nil + el.events = nil + el.LastErrorTime = time.Time{} + el.discarded = 0 + el.refs = 0 +} + +func (el *eventLog) hasRecentError(now time.Time, maxErrAge time.Duration) bool { + if maxErrAge == 0 { + return true + } + el.mu.RLock() + defer el.mu.RUnlock() + return now.Sub(el.LastErrorTime) < maxErrAge +} + +// delta returns the elapsed time since the last event or the log start, +// and whether it spans midnight. +// L >= el.mu +func (el *eventLog) delta(t time.Time) (time.Duration, bool) { + if len(el.events) == 0 { + return t.Sub(el.Start), false + } + prev := el.events[len(el.events)-1].When + return t.Sub(prev), prev.Day() != t.Day() + +} + +func (el *eventLog) Printf(format string, a ...interface{}) { + el.printf(false, format, a...) +} + +func (el *eventLog) Errorf(format string, a ...interface{}) { + el.printf(true, format, a...) +} + +func (el *eventLog) printf(isErr bool, format string, a ...interface{}) { + e := logEntry{When: time.Now(), IsErr: isErr, What: fmt.Sprintf(format, a...)} + el.mu.Lock() + e.Elapsed, e.NewDay = el.delta(e.When) + if len(el.events) < maxEventsPerLog { + el.events = append(el.events, e) + } else { + // Discard the oldest event. + if el.discarded == 0 { + // el.discarded starts at two to count for the event it + // is replacing, plus the next one that we are about to + // drop. + el.discarded = 2 + } else { + el.discarded++ + } + // TODO(sameer): if this causes allocations on a critical path, + // change eventLog.What to be a fmt.Stringer, as in trace.go. + el.events[0].What = fmt.Sprintf("(%d events discarded)", el.discarded) + // The timestamp of the discarded meta-event should be + // the time of the last event it is representing. + el.events[0].When = el.events[1].When + copy(el.events[1:], el.events[2:]) + el.events[maxEventsPerLog-1] = e + } + if e.IsErr { + el.LastErrorTime = e.When + } + el.mu.Unlock() +} + +func (el *eventLog) ref() { + atomic.AddInt32(&el.refs, 1) +} + +func (el *eventLog) unref() { + if atomic.AddInt32(&el.refs, -1) == 0 { + freeEventLog(el) + } +} + +func (el *eventLog) When() string { + return el.Start.Format("2006/01/02 15:04:05.000000") +} + +func (el *eventLog) ElapsedTime() string { + elapsed := time.Since(el.Start) + return fmt.Sprintf("%.6f", elapsed.Seconds()) +} + +func (el *eventLog) Stack() string { + buf := new(bytes.Buffer) + tw := tabwriter.NewWriter(buf, 1, 8, 1, '\t', 0) + printStackRecord(tw, el.stack) + tw.Flush() + return buf.String() +} + +// printStackRecord prints the function + source line information +// for a single stack trace. +// Adapted from runtime/pprof/pprof.go. +func printStackRecord(w io.Writer, stk []uintptr) { + for _, pc := range stk { + f := runtime.FuncForPC(pc) + if f == nil { + continue + } + file, line := f.FileLine(pc) + name := f.Name() + // Hide runtime.goexit and any runtime functions at the beginning. + if strings.HasPrefix(name, "runtime.") { + continue + } + fmt.Fprintf(w, "# %s\t%s:%d\n", name, file, line) + } +} + +func (el *eventLog) Events() []logEntry { + el.mu.RLock() + defer el.mu.RUnlock() + return el.events +} + +// freeEventLogs is a freelist of *eventLog +var freeEventLogs = make(chan *eventLog, 1000) + +// newEventLog returns a event log ready to use. +func newEventLog() *eventLog { + select { + case el := <-freeEventLogs: + return el + default: + return new(eventLog) + } +} + +// freeEventLog adds el to freeEventLogs if there's room. +// This is non-blocking. +func freeEventLog(el *eventLog) { + el.reset() + select { + case freeEventLogs <- el: + default: + } +} + +var eventsTmplCache *template.Template +var eventsTmplOnce sync.Once + +func eventsTmpl() *template.Template { + eventsTmplOnce.Do(func() { + eventsTmplCache = template.Must(template.New("events").Funcs(template.FuncMap{ + "elapsed": elapsed, + "trimSpace": strings.TrimSpace, + }).Parse(eventsHTML)) + }) + return eventsTmplCache +} + +const eventsHTML = ` + + + events + + + + +

/debug/events

+ + + {{range $i, $fam := .Families}} + + + + {{range $j, $bucket := $.Buckets}} + {{$n := index $.Counts $i $j}} + + {{end}} + + {{end}} +
{{$fam}} + {{if $n}}{{end}} + [{{$n}} {{$bucket.String}}] + {{if $n}}{{end}} +
+ +{{if $.EventLogs}} +
+

Family: {{$.Family}}

+ +{{if $.Expanded}}{{end}} +[Summary]{{if $.Expanded}}{{end}} + +{{if not $.Expanded}}{{end}} +[Expanded]{{if not $.Expanded}}{{end}} + + + + {{range $el := $.EventLogs}} + + + + + {{if $.Expanded}} + + + + + + {{range $el.Events}} + + + + + + {{end}} + {{end}} + {{end}} +
WhenElapsed
{{$el.When}}{{$el.ElapsedTime}}{{$el.Title}} +
{{$el.Stack|trimSpace}}
{{.WhenString}}{{elapsed .Elapsed}}.{{if .IsErr}}E{{else}}.{{end}}. {{.What}}
+{{end}} + + +` diff --git a/vendor/golang.org/x/net/trace/histogram.go b/vendor/golang.org/x/net/trace/histogram.go new file mode 100644 index 00000000..9bf4286c --- /dev/null +++ b/vendor/golang.org/x/net/trace/histogram.go @@ -0,0 +1,365 @@ +// 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. + +package trace + +// This file implements histogramming for RPC statistics collection. + +import ( + "bytes" + "fmt" + "html/template" + "log" + "math" + "sync" + + "golang.org/x/net/internal/timeseries" +) + +const ( + bucketCount = 38 +) + +// histogram keeps counts of values in buckets that are spaced +// out in powers of 2: 0-1, 2-3, 4-7... +// histogram implements timeseries.Observable +type histogram struct { + sum int64 // running total of measurements + sumOfSquares float64 // square of running total + buckets []int64 // bucketed values for histogram + value int // holds a single value as an optimization + valueCount int64 // number of values recorded for single value +} + +// AddMeasurement records a value measurement observation to the histogram. +func (h *histogram) addMeasurement(value int64) { + // TODO: assert invariant + h.sum += value + h.sumOfSquares += float64(value) * float64(value) + + bucketIndex := getBucket(value) + + if h.valueCount == 0 || (h.valueCount > 0 && h.value == bucketIndex) { + h.value = bucketIndex + h.valueCount++ + } else { + h.allocateBuckets() + h.buckets[bucketIndex]++ + } +} + +func (h *histogram) allocateBuckets() { + if h.buckets == nil { + h.buckets = make([]int64, bucketCount) + h.buckets[h.value] = h.valueCount + h.value = 0 + h.valueCount = -1 + } +} + +func log2(i int64) int { + n := 0 + for ; i >= 0x100; i >>= 8 { + n += 8 + } + for ; i > 0; i >>= 1 { + n += 1 + } + return n +} + +func getBucket(i int64) (index int) { + index = log2(i) - 1 + if index < 0 { + index = 0 + } + if index >= bucketCount { + index = bucketCount - 1 + } + return +} + +// Total returns the number of recorded observations. +func (h *histogram) total() (total int64) { + if h.valueCount >= 0 { + total = h.valueCount + } + for _, val := range h.buckets { + total += int64(val) + } + return +} + +// Average returns the average value of recorded observations. +func (h *histogram) average() float64 { + t := h.total() + if t == 0 { + return 0 + } + return float64(h.sum) / float64(t) +} + +// Variance returns the variance of recorded observations. +func (h *histogram) variance() float64 { + t := float64(h.total()) + if t == 0 { + return 0 + } + s := float64(h.sum) / t + return h.sumOfSquares/t - s*s +} + +// StandardDeviation returns the standard deviation of recorded observations. +func (h *histogram) standardDeviation() float64 { + return math.Sqrt(h.variance()) +} + +// PercentileBoundary estimates the value that the given fraction of recorded +// observations are less than. +func (h *histogram) percentileBoundary(percentile float64) int64 { + total := h.total() + + // Corner cases (make sure result is strictly less than Total()) + if total == 0 { + return 0 + } else if total == 1 { + return int64(h.average()) + } + + percentOfTotal := round(float64(total) * percentile) + var runningTotal int64 + + for i := range h.buckets { + value := h.buckets[i] + runningTotal += value + if runningTotal == percentOfTotal { + // We hit an exact bucket boundary. If the next bucket has data, it is a + // good estimate of the value. If the bucket is empty, we interpolate the + // midpoint between the next bucket's boundary and the next non-zero + // bucket. If the remaining buckets are all empty, then we use the + // boundary for the next bucket as the estimate. + j := uint8(i + 1) + min := bucketBoundary(j) + if runningTotal < total { + for h.buckets[j] == 0 { + j++ + } + } + max := bucketBoundary(j) + return min + round(float64(max-min)/2) + } else if runningTotal > percentOfTotal { + // The value is in this bucket. Interpolate the value. + delta := runningTotal - percentOfTotal + percentBucket := float64(value-delta) / float64(value) + bucketMin := bucketBoundary(uint8(i)) + nextBucketMin := bucketBoundary(uint8(i + 1)) + bucketSize := nextBucketMin - bucketMin + return bucketMin + round(percentBucket*float64(bucketSize)) + } + } + return bucketBoundary(bucketCount - 1) +} + +// Median returns the estimated median of the observed values. +func (h *histogram) median() int64 { + return h.percentileBoundary(0.5) +} + +// Add adds other to h. +func (h *histogram) Add(other timeseries.Observable) { + o := other.(*histogram) + if o.valueCount == 0 { + // Other histogram is empty + } else if h.valueCount >= 0 && o.valueCount > 0 && h.value == o.value { + // Both have a single bucketed value, aggregate them + h.valueCount += o.valueCount + } else { + // Two different values necessitate buckets in this histogram + h.allocateBuckets() + if o.valueCount >= 0 { + h.buckets[o.value] += o.valueCount + } else { + for i := range h.buckets { + h.buckets[i] += o.buckets[i] + } + } + } + h.sumOfSquares += o.sumOfSquares + h.sum += o.sum +} + +// Clear resets the histogram to an empty state, removing all observed values. +func (h *histogram) Clear() { + h.buckets = nil + h.value = 0 + h.valueCount = 0 + h.sum = 0 + h.sumOfSquares = 0 +} + +// CopyFrom copies from other, which must be a *histogram, into h. +func (h *histogram) CopyFrom(other timeseries.Observable) { + o := other.(*histogram) + if o.valueCount == -1 { + h.allocateBuckets() + copy(h.buckets, o.buckets) + } + h.sum = o.sum + h.sumOfSquares = o.sumOfSquares + h.value = o.value + h.valueCount = o.valueCount +} + +// Multiply scales the histogram by the specified ratio. +func (h *histogram) Multiply(ratio float64) { + if h.valueCount == -1 { + for i := range h.buckets { + h.buckets[i] = int64(float64(h.buckets[i]) * ratio) + } + } else { + h.valueCount = int64(float64(h.valueCount) * ratio) + } + h.sum = int64(float64(h.sum) * ratio) + h.sumOfSquares = h.sumOfSquares * ratio +} + +// New creates a new histogram. +func (h *histogram) New() timeseries.Observable { + r := new(histogram) + r.Clear() + return r +} + +func (h *histogram) String() string { + return fmt.Sprintf("%d, %f, %d, %d, %v", + h.sum, h.sumOfSquares, h.value, h.valueCount, h.buckets) +} + +// round returns the closest int64 to the argument +func round(in float64) int64 { + return int64(math.Floor(in + 0.5)) +} + +// bucketBoundary returns the first value in the bucket. +func bucketBoundary(bucket uint8) int64 { + if bucket == 0 { + return 0 + } + return 1 << bucket +} + +// bucketData holds data about a specific bucket for use in distTmpl. +type bucketData struct { + Lower, Upper int64 + N int64 + Pct, CumulativePct float64 + GraphWidth int +} + +// data holds data about a Distribution for use in distTmpl. +type data struct { + Buckets []*bucketData + Count, Median int64 + Mean, StandardDeviation float64 +} + +// maxHTMLBarWidth is the maximum width of the HTML bar for visualizing buckets. +const maxHTMLBarWidth = 350.0 + +// newData returns data representing h for use in distTmpl. +func (h *histogram) newData() *data { + // Force the allocation of buckets to simplify the rendering implementation + h.allocateBuckets() + // We scale the bars on the right so that the largest bar is + // maxHTMLBarWidth pixels in width. + maxBucket := int64(0) + for _, n := range h.buckets { + if n > maxBucket { + maxBucket = n + } + } + total := h.total() + barsizeMult := maxHTMLBarWidth / float64(maxBucket) + var pctMult float64 + if total == 0 { + pctMult = 1.0 + } else { + pctMult = 100.0 / float64(total) + } + + buckets := make([]*bucketData, len(h.buckets)) + runningTotal := int64(0) + for i, n := range h.buckets { + if n == 0 { + continue + } + runningTotal += n + var upperBound int64 + if i < bucketCount-1 { + upperBound = bucketBoundary(uint8(i + 1)) + } else { + upperBound = math.MaxInt64 + } + buckets[i] = &bucketData{ + Lower: bucketBoundary(uint8(i)), + Upper: upperBound, + N: n, + Pct: float64(n) * pctMult, + CumulativePct: float64(runningTotal) * pctMult, + GraphWidth: int(float64(n) * barsizeMult), + } + } + return &data{ + Buckets: buckets, + Count: total, + Median: h.median(), + Mean: h.average(), + StandardDeviation: h.standardDeviation(), + } +} + +func (h *histogram) html() template.HTML { + buf := new(bytes.Buffer) + if err := distTmpl().Execute(buf, h.newData()); err != nil { + buf.Reset() + log.Printf("net/trace: couldn't execute template: %v", err) + } + return template.HTML(buf.String()) +} + +var distTmplCache *template.Template +var distTmplOnce sync.Once + +func distTmpl() *template.Template { + distTmplOnce.Do(func() { + // Input: data + distTmplCache = template.Must(template.New("distTmpl").Parse(` + + + + + + + +
Count: {{.Count}}Mean: {{printf "%.0f" .Mean}}StdDev: {{printf "%.0f" .StandardDeviation}}Median: {{.Median}}
+
+ +{{range $b := .Buckets}} +{{if $b}} + + + + + + + + + +{{end}} +{{end}} +
[{{.Lower}},{{.Upper}}){{.N}}{{printf "%#.3f" .Pct}}%{{printf "%#.3f" .CumulativePct}}%
+`)) + }) + return distTmplCache +} diff --git a/vendor/golang.org/x/net/trace/trace.go b/vendor/golang.org/x/net/trace/trace.go new file mode 100644 index 00000000..3ebf6f2d --- /dev/null +++ b/vendor/golang.org/x/net/trace/trace.go @@ -0,0 +1,1130 @@ +// 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. + +/* +Package trace implements tracing of requests and long-lived objects. +It exports HTTP interfaces on /debug/requests and /debug/events. + +A trace.Trace provides tracing for short-lived objects, usually requests. +A request handler might be implemented like this: + + func fooHandler(w http.ResponseWriter, req *http.Request) { + tr := trace.New("mypkg.Foo", req.URL.Path) + defer tr.Finish() + ... + tr.LazyPrintf("some event %q happened", str) + ... + if err := somethingImportant(); err != nil { + tr.LazyPrintf("somethingImportant failed: %v", err) + tr.SetError() + } + } + +The /debug/requests HTTP endpoint organizes the traces by family, +errors, and duration. It also provides histogram of request duration +for each family. + +A trace.EventLog provides tracing for long-lived objects, such as RPC +connections. + + // A Fetcher fetches URL paths for a single domain. + type Fetcher struct { + domain string + events trace.EventLog + } + + func NewFetcher(domain string) *Fetcher { + return &Fetcher{ + domain, + trace.NewEventLog("mypkg.Fetcher", domain), + } + } + + func (f *Fetcher) Fetch(path string) (string, error) { + resp, err := http.Get("http://" + f.domain + "/" + path) + if err != nil { + f.events.Errorf("Get(%q) = %v", path, err) + return "", err + } + f.events.Printf("Get(%q) = %s", path, resp.Status) + ... + } + + func (f *Fetcher) Close() error { + f.events.Finish() + return nil + } + +The /debug/events HTTP endpoint organizes the event logs by family and +by time since the last error. The expanded view displays recent log +entries and the log's call stack. +*/ +package trace // import "golang.org/x/net/trace" + +import ( + "bytes" + "context" + "fmt" + "html/template" + "io" + "log" + "net" + "net/http" + "net/url" + "runtime" + "sort" + "strconv" + "sync" + "sync/atomic" + "time" + + "golang.org/x/net/internal/timeseries" +) + +// DebugUseAfterFinish controls whether to debug uses of Trace values after finishing. +// FOR DEBUGGING ONLY. This will slow down the program. +var DebugUseAfterFinish = false + +// HTTP ServeMux paths. +const ( + debugRequestsPath = "/debug/requests" + debugEventsPath = "/debug/events" +) + +// AuthRequest determines whether a specific request is permitted to load the +// /debug/requests or /debug/events pages. +// +// It returns two bools; the first indicates whether the page may be viewed at all, +// and the second indicates whether sensitive events will be shown. +// +// AuthRequest may be replaced by a program to customize its authorization requirements. +// +// The default AuthRequest function returns (true, true) if and only if the request +// comes from localhost/127.0.0.1/[::1]. +var AuthRequest = func(req *http.Request) (any, sensitive bool) { + // RemoteAddr is commonly in the form "IP" or "IP:port". + // If it is in the form "IP:port", split off the port. + host, _, err := net.SplitHostPort(req.RemoteAddr) + if err != nil { + host = req.RemoteAddr + } + switch host { + case "localhost", "127.0.0.1", "::1": + return true, true + default: + return false, false + } +} + +func init() { + _, pat := http.DefaultServeMux.Handler(&http.Request{URL: &url.URL{Path: debugRequestsPath}}) + if pat == debugRequestsPath { + panic("/debug/requests is already registered. You may have two independent copies of " + + "golang.org/x/net/trace in your binary, trying to maintain separate state. This may " + + "involve a vendored copy of golang.org/x/net/trace.") + } + + // TODO(jbd): Serve Traces from /debug/traces in the future? + // There is no requirement for a request to be present to have traces. + http.HandleFunc(debugRequestsPath, Traces) + http.HandleFunc(debugEventsPath, Events) +} + +// NewContext returns a copy of the parent context +// and associates it with a Trace. +func NewContext(ctx context.Context, tr Trace) context.Context { + return context.WithValue(ctx, contextKey, tr) +} + +// FromContext returns the Trace bound to the context, if any. +func FromContext(ctx context.Context) (tr Trace, ok bool) { + tr, ok = ctx.Value(contextKey).(Trace) + return +} + +// Traces responds with traces from the program. +// The package initialization registers it in http.DefaultServeMux +// at /debug/requests. +// +// It performs authorization by running AuthRequest. +func Traces(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + Render(w, req, sensitive) +} + +// Events responds with a page of events collected by EventLogs. +// The package initialization registers it in http.DefaultServeMux +// at /debug/events. +// +// It performs authorization by running AuthRequest. +func Events(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + RenderEvents(w, req, sensitive) +} + +// Render renders the HTML page typically served at /debug/requests. +// It does not do any auth checking. The request may be nil. +// +// Most users will use the Traces handler. +func Render(w io.Writer, req *http.Request, sensitive bool) { + data := &struct { + Families []string + ActiveTraceCount map[string]int + CompletedTraces map[string]*family + + // Set when a bucket has been selected. + Traces traceList + Family string + Bucket int + Expanded bool + Traced bool + Active bool + ShowSensitive bool // whether to show sensitive events + + Histogram template.HTML + HistogramWindow string // e.g. "last minute", "last hour", "all time" + + // If non-zero, the set of traces is a partial set, + // and this is the total number. + Total int + }{ + CompletedTraces: completedTraces, + } + + data.ShowSensitive = sensitive + if req != nil { + // Allow show_sensitive=0 to force hiding of sensitive data for testing. + // This only goes one way; you can't use show_sensitive=1 to see things. + if req.FormValue("show_sensitive") == "0" { + data.ShowSensitive = false + } + + if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { + data.Expanded = exp + } + if exp, err := strconv.ParseBool(req.FormValue("rtraced")); err == nil { + data.Traced = exp + } + } + + completedMu.RLock() + data.Families = make([]string, 0, len(completedTraces)) + for fam := range completedTraces { + data.Families = append(data.Families, fam) + } + completedMu.RUnlock() + sort.Strings(data.Families) + + // We are careful here to minimize the time spent locking activeMu, + // since that lock is required every time an RPC starts and finishes. + data.ActiveTraceCount = make(map[string]int, len(data.Families)) + activeMu.RLock() + for fam, s := range activeTraces { + data.ActiveTraceCount[fam] = s.Len() + } + activeMu.RUnlock() + + var ok bool + data.Family, data.Bucket, ok = parseArgs(req) + switch { + case !ok: + // No-op + case data.Bucket == -1: + data.Active = true + n := data.ActiveTraceCount[data.Family] + data.Traces = getActiveTraces(data.Family) + if len(data.Traces) < n { + data.Total = n + } + case data.Bucket < bucketsPerFamily: + if b := lookupBucket(data.Family, data.Bucket); b != nil { + data.Traces = b.Copy(data.Traced) + } + default: + if f := getFamily(data.Family, false); f != nil { + var obs timeseries.Observable + f.LatencyMu.RLock() + switch o := data.Bucket - bucketsPerFamily; o { + case 0: + obs = f.Latency.Minute() + data.HistogramWindow = "last minute" + case 1: + obs = f.Latency.Hour() + data.HistogramWindow = "last hour" + case 2: + obs = f.Latency.Total() + data.HistogramWindow = "all time" + } + f.LatencyMu.RUnlock() + if obs != nil { + data.Histogram = obs.(*histogram).html() + } + } + } + + if data.Traces != nil { + defer data.Traces.Free() + sort.Sort(data.Traces) + } + + completedMu.RLock() + defer completedMu.RUnlock() + if err := pageTmpl().ExecuteTemplate(w, "Page", data); err != nil { + log.Printf("net/trace: Failed executing template: %v", err) + } +} + +func parseArgs(req *http.Request) (fam string, b int, ok bool) { + if req == nil { + return "", 0, false + } + fam, bStr := req.FormValue("fam"), req.FormValue("b") + if fam == "" || bStr == "" { + return "", 0, false + } + b, err := strconv.Atoi(bStr) + if err != nil || b < -1 { + return "", 0, false + } + + return fam, b, true +} + +func lookupBucket(fam string, b int) *traceBucket { + f := getFamily(fam, false) + if f == nil || b < 0 || b >= len(f.Buckets) { + return nil + } + return f.Buckets[b] +} + +type contextKeyT string + +var contextKey = contextKeyT("golang.org/x/net/trace.Trace") + +// Trace represents an active request. +type Trace interface { + // LazyLog adds x to the event log. It will be evaluated each time the + // /debug/requests page is rendered. Any memory referenced by x will be + // pinned until the trace is finished and later discarded. + LazyLog(x fmt.Stringer, sensitive bool) + + // LazyPrintf evaluates its arguments with fmt.Sprintf each time the + // /debug/requests page is rendered. Any memory referenced by a will be + // pinned until the trace is finished and later discarded. + LazyPrintf(format string, a ...interface{}) + + // SetError declares that this trace resulted in an error. + SetError() + + // SetRecycler sets a recycler for the trace. + // f will be called for each event passed to LazyLog at a time when + // it is no longer required, whether while the trace is still active + // and the event is discarded, or when a completed trace is discarded. + SetRecycler(f func(interface{})) + + // SetTraceInfo sets the trace info for the trace. + // This is currently unused. + SetTraceInfo(traceID, spanID uint64) + + // SetMaxEvents sets the maximum number of events that will be stored + // in the trace. This has no effect if any events have already been + // added to the trace. + SetMaxEvents(m int) + + // Finish declares that this trace is complete. + // The trace should not be used after calling this method. + Finish() +} + +type lazySprintf struct { + format string + a []interface{} +} + +func (l *lazySprintf) String() string { + return fmt.Sprintf(l.format, l.a...) +} + +// New returns a new Trace with the specified family and title. +func New(family, title string) Trace { + tr := newTrace() + tr.ref() + tr.Family, tr.Title = family, title + tr.Start = time.Now() + tr.maxEvents = maxEventsPerTrace + tr.events = tr.eventsBuf[:0] + + activeMu.RLock() + s := activeTraces[tr.Family] + activeMu.RUnlock() + if s == nil { + activeMu.Lock() + s = activeTraces[tr.Family] // check again + if s == nil { + s = new(traceSet) + activeTraces[tr.Family] = s + } + activeMu.Unlock() + } + s.Add(tr) + + // Trigger allocation of the completed trace structure for this family. + // This will cause the family to be present in the request page during + // the first trace of this family. We don't care about the return value, + // nor is there any need for this to run inline, so we execute it in its + // own goroutine, but only if the family isn't allocated yet. + completedMu.RLock() + if _, ok := completedTraces[tr.Family]; !ok { + go allocFamily(tr.Family) + } + completedMu.RUnlock() + + return tr +} + +func (tr *trace) Finish() { + elapsed := time.Now().Sub(tr.Start) + tr.mu.Lock() + tr.Elapsed = elapsed + tr.mu.Unlock() + + if DebugUseAfterFinish { + buf := make([]byte, 4<<10) // 4 KB should be enough + n := runtime.Stack(buf, false) + tr.finishStack = buf[:n] + } + + activeMu.RLock() + m := activeTraces[tr.Family] + activeMu.RUnlock() + m.Remove(tr) + + f := getFamily(tr.Family, true) + tr.mu.RLock() // protects tr fields in Cond.match calls + for _, b := range f.Buckets { + if b.Cond.match(tr) { + b.Add(tr) + } + } + tr.mu.RUnlock() + + // Add a sample of elapsed time as microseconds to the family's timeseries + h := new(histogram) + h.addMeasurement(elapsed.Nanoseconds() / 1e3) + f.LatencyMu.Lock() + f.Latency.Add(h) + f.LatencyMu.Unlock() + + tr.unref() // matches ref in New +} + +const ( + bucketsPerFamily = 9 + tracesPerBucket = 10 + maxActiveTraces = 20 // Maximum number of active traces to show. + maxEventsPerTrace = 10 + numHistogramBuckets = 38 +) + +var ( + // The active traces. + activeMu sync.RWMutex + activeTraces = make(map[string]*traceSet) // family -> traces + + // Families of completed traces. + completedMu sync.RWMutex + completedTraces = make(map[string]*family) // family -> traces +) + +type traceSet struct { + mu sync.RWMutex + m map[*trace]bool + + // We could avoid the entire map scan in FirstN by having a slice of all the traces + // ordered by start time, and an index into that from the trace struct, with a periodic + // repack of the slice after enough traces finish; we could also use a skip list or similar. + // However, that would shift some of the expense from /debug/requests time to RPC time, + // which is probably the wrong trade-off. +} + +func (ts *traceSet) Len() int { + ts.mu.RLock() + defer ts.mu.RUnlock() + return len(ts.m) +} + +func (ts *traceSet) Add(tr *trace) { + ts.mu.Lock() + if ts.m == nil { + ts.m = make(map[*trace]bool) + } + ts.m[tr] = true + ts.mu.Unlock() +} + +func (ts *traceSet) Remove(tr *trace) { + ts.mu.Lock() + delete(ts.m, tr) + ts.mu.Unlock() +} + +// FirstN returns the first n traces ordered by time. +func (ts *traceSet) FirstN(n int) traceList { + ts.mu.RLock() + defer ts.mu.RUnlock() + + if n > len(ts.m) { + n = len(ts.m) + } + trl := make(traceList, 0, n) + + // Fast path for when no selectivity is needed. + if n == len(ts.m) { + for tr := range ts.m { + tr.ref() + trl = append(trl, tr) + } + sort.Sort(trl) + return trl + } + + // Pick the oldest n traces. + // This is inefficient. See the comment in the traceSet struct. + for tr := range ts.m { + // Put the first n traces into trl in the order they occur. + // When we have n, sort trl, and thereafter maintain its order. + if len(trl) < n { + tr.ref() + trl = append(trl, tr) + if len(trl) == n { + // This is guaranteed to happen exactly once during this loop. + sort.Sort(trl) + } + continue + } + if tr.Start.After(trl[n-1].Start) { + continue + } + + // Find where to insert this one. + tr.ref() + i := sort.Search(n, func(i int) bool { return trl[i].Start.After(tr.Start) }) + trl[n-1].unref() + copy(trl[i+1:], trl[i:]) + trl[i] = tr + } + + return trl +} + +func getActiveTraces(fam string) traceList { + activeMu.RLock() + s := activeTraces[fam] + activeMu.RUnlock() + if s == nil { + return nil + } + return s.FirstN(maxActiveTraces) +} + +func getFamily(fam string, allocNew bool) *family { + completedMu.RLock() + f := completedTraces[fam] + completedMu.RUnlock() + if f == nil && allocNew { + f = allocFamily(fam) + } + return f +} + +func allocFamily(fam string) *family { + completedMu.Lock() + defer completedMu.Unlock() + f := completedTraces[fam] + if f == nil { + f = newFamily() + completedTraces[fam] = f + } + return f +} + +// family represents a set of trace buckets and associated latency information. +type family struct { + // traces may occur in multiple buckets. + Buckets [bucketsPerFamily]*traceBucket + + // latency time series + LatencyMu sync.RWMutex + Latency *timeseries.MinuteHourSeries +} + +func newFamily() *family { + return &family{ + Buckets: [bucketsPerFamily]*traceBucket{ + {Cond: minCond(0)}, + {Cond: minCond(50 * time.Millisecond)}, + {Cond: minCond(100 * time.Millisecond)}, + {Cond: minCond(200 * time.Millisecond)}, + {Cond: minCond(500 * time.Millisecond)}, + {Cond: minCond(1 * time.Second)}, + {Cond: minCond(10 * time.Second)}, + {Cond: minCond(100 * time.Second)}, + {Cond: errorCond{}}, + }, + Latency: timeseries.NewMinuteHourSeries(func() timeseries.Observable { return new(histogram) }), + } +} + +// traceBucket represents a size-capped bucket of historic traces, +// along with a condition for a trace to belong to the bucket. +type traceBucket struct { + Cond cond + + // Ring buffer implementation of a fixed-size FIFO queue. + mu sync.RWMutex + buf [tracesPerBucket]*trace + start int // < tracesPerBucket + length int // <= tracesPerBucket +} + +func (b *traceBucket) Add(tr *trace) { + b.mu.Lock() + defer b.mu.Unlock() + + i := b.start + b.length + if i >= tracesPerBucket { + i -= tracesPerBucket + } + if b.length == tracesPerBucket { + // "Remove" an element from the bucket. + b.buf[i].unref() + b.start++ + if b.start == tracesPerBucket { + b.start = 0 + } + } + b.buf[i] = tr + if b.length < tracesPerBucket { + b.length++ + } + tr.ref() +} + +// Copy returns a copy of the traces in the bucket. +// If tracedOnly is true, only the traces with trace information will be returned. +// The logs will be ref'd before returning; the caller should call +// the Free method when it is done with them. +// TODO(dsymonds): keep track of traced requests in separate buckets. +func (b *traceBucket) Copy(tracedOnly bool) traceList { + b.mu.RLock() + defer b.mu.RUnlock() + + trl := make(traceList, 0, b.length) + for i, x := 0, b.start; i < b.length; i++ { + tr := b.buf[x] + if !tracedOnly || tr.spanID != 0 { + tr.ref() + trl = append(trl, tr) + } + x++ + if x == b.length { + x = 0 + } + } + return trl +} + +func (b *traceBucket) Empty() bool { + b.mu.RLock() + defer b.mu.RUnlock() + return b.length == 0 +} + +// cond represents a condition on a trace. +type cond interface { + match(t *trace) bool + String() string +} + +type minCond time.Duration + +func (m minCond) match(t *trace) bool { return t.Elapsed >= time.Duration(m) } +func (m minCond) String() string { return fmt.Sprintf("≥%gs", time.Duration(m).Seconds()) } + +type errorCond struct{} + +func (e errorCond) match(t *trace) bool { return t.IsError } +func (e errorCond) String() string { return "errors" } + +type traceList []*trace + +// Free calls unref on each element of the list. +func (trl traceList) Free() { + for _, t := range trl { + t.unref() + } +} + +// traceList may be sorted in reverse chronological order. +func (trl traceList) Len() int { return len(trl) } +func (trl traceList) Less(i, j int) bool { return trl[i].Start.After(trl[j].Start) } +func (trl traceList) Swap(i, j int) { trl[i], trl[j] = trl[j], trl[i] } + +// An event is a timestamped log entry in a trace. +type event struct { + When time.Time + Elapsed time.Duration // since previous event in trace + NewDay bool // whether this event is on a different day to the previous event + Recyclable bool // whether this event was passed via LazyLog + Sensitive bool // whether this event contains sensitive information + What interface{} // string or fmt.Stringer +} + +// WhenString returns a string representation of the elapsed time of the event. +// It will include the date if midnight was crossed. +func (e event) WhenString() string { + if e.NewDay { + return e.When.Format("2006/01/02 15:04:05.000000") + } + return e.When.Format("15:04:05.000000") +} + +// discarded represents a number of discarded events. +// It is stored as *discarded to make it easier to update in-place. +type discarded int + +func (d *discarded) String() string { + return fmt.Sprintf("(%d events discarded)", int(*d)) +} + +// trace represents an active or complete request, +// either sent or received by this program. +type trace struct { + // Family is the top-level grouping of traces to which this belongs. + Family string + + // Title is the title of this trace. + Title string + + // Start time of the this trace. + Start time.Time + + mu sync.RWMutex + events []event // Append-only sequence of events (modulo discards). + maxEvents int + recycler func(interface{}) + IsError bool // Whether this trace resulted in an error. + Elapsed time.Duration // Elapsed time for this trace, zero while active. + traceID uint64 // Trace information if non-zero. + spanID uint64 + + refs int32 // how many buckets this is in + disc discarded // scratch space to avoid allocation + + finishStack []byte // where finish was called, if DebugUseAfterFinish is set + + eventsBuf [4]event // preallocated buffer in case we only log a few events +} + +func (tr *trace) reset() { + // Clear all but the mutex. Mutexes may not be copied, even when unlocked. + tr.Family = "" + tr.Title = "" + tr.Start = time.Time{} + + tr.mu.Lock() + tr.Elapsed = 0 + tr.traceID = 0 + tr.spanID = 0 + tr.IsError = false + tr.maxEvents = 0 + tr.events = nil + tr.recycler = nil + tr.mu.Unlock() + + tr.refs = 0 + tr.disc = 0 + tr.finishStack = nil + for i := range tr.eventsBuf { + tr.eventsBuf[i] = event{} + } +} + +// delta returns the elapsed time since the last event or the trace start, +// and whether it spans midnight. +// L >= tr.mu +func (tr *trace) delta(t time.Time) (time.Duration, bool) { + if len(tr.events) == 0 { + return t.Sub(tr.Start), false + } + prev := tr.events[len(tr.events)-1].When + return t.Sub(prev), prev.Day() != t.Day() +} + +func (tr *trace) addEvent(x interface{}, recyclable, sensitive bool) { + if DebugUseAfterFinish && tr.finishStack != nil { + buf := make([]byte, 4<<10) // 4 KB should be enough + n := runtime.Stack(buf, false) + log.Printf("net/trace: trace used after finish:\nFinished at:\n%s\nUsed at:\n%s", tr.finishStack, buf[:n]) + } + + /* + NOTE TO DEBUGGERS + + If you are here because your program panicked in this code, + it is almost definitely the fault of code using this package, + and very unlikely to be the fault of this code. + + The most likely scenario is that some code elsewhere is using + a trace.Trace after its Finish method is called. + You can temporarily set the DebugUseAfterFinish var + to help discover where that is; do not leave that var set, + since it makes this package much less efficient. + */ + + e := event{When: time.Now(), What: x, Recyclable: recyclable, Sensitive: sensitive} + tr.mu.Lock() + e.Elapsed, e.NewDay = tr.delta(e.When) + if len(tr.events) < tr.maxEvents { + tr.events = append(tr.events, e) + } else { + // Discard the middle events. + di := int((tr.maxEvents - 1) / 2) + if d, ok := tr.events[di].What.(*discarded); ok { + (*d)++ + } else { + // disc starts at two to count for the event it is replacing, + // plus the next one that we are about to drop. + tr.disc = 2 + if tr.recycler != nil && tr.events[di].Recyclable { + go tr.recycler(tr.events[di].What) + } + tr.events[di].What = &tr.disc + } + // The timestamp of the discarded meta-event should be + // the time of the last event it is representing. + tr.events[di].When = tr.events[di+1].When + + if tr.recycler != nil && tr.events[di+1].Recyclable { + go tr.recycler(tr.events[di+1].What) + } + copy(tr.events[di+1:], tr.events[di+2:]) + tr.events[tr.maxEvents-1] = e + } + tr.mu.Unlock() +} + +func (tr *trace) LazyLog(x fmt.Stringer, sensitive bool) { + tr.addEvent(x, true, sensitive) +} + +func (tr *trace) LazyPrintf(format string, a ...interface{}) { + tr.addEvent(&lazySprintf{format, a}, false, false) +} + +func (tr *trace) SetError() { + tr.mu.Lock() + tr.IsError = true + tr.mu.Unlock() +} + +func (tr *trace) SetRecycler(f func(interface{})) { + tr.mu.Lock() + tr.recycler = f + tr.mu.Unlock() +} + +func (tr *trace) SetTraceInfo(traceID, spanID uint64) { + tr.mu.Lock() + tr.traceID, tr.spanID = traceID, spanID + tr.mu.Unlock() +} + +func (tr *trace) SetMaxEvents(m int) { + tr.mu.Lock() + // Always keep at least three events: first, discarded count, last. + if len(tr.events) == 0 && m > 3 { + tr.maxEvents = m + } + tr.mu.Unlock() +} + +func (tr *trace) ref() { + atomic.AddInt32(&tr.refs, 1) +} + +func (tr *trace) unref() { + if atomic.AddInt32(&tr.refs, -1) == 0 { + tr.mu.RLock() + if tr.recycler != nil { + // freeTrace clears tr, so we hold tr.recycler and tr.events here. + go func(f func(interface{}), es []event) { + for _, e := range es { + if e.Recyclable { + f(e.What) + } + } + }(tr.recycler, tr.events) + } + tr.mu.RUnlock() + + freeTrace(tr) + } +} + +func (tr *trace) When() string { + return tr.Start.Format("2006/01/02 15:04:05.000000") +} + +func (tr *trace) ElapsedTime() string { + tr.mu.RLock() + t := tr.Elapsed + tr.mu.RUnlock() + + if t == 0 { + // Active trace. + t = time.Since(tr.Start) + } + return fmt.Sprintf("%.6f", t.Seconds()) +} + +func (tr *trace) Events() []event { + tr.mu.RLock() + defer tr.mu.RUnlock() + return tr.events +} + +var traceFreeList = make(chan *trace, 1000) // TODO(dsymonds): Use sync.Pool? + +// newTrace returns a trace ready to use. +func newTrace() *trace { + select { + case tr := <-traceFreeList: + return tr + default: + return new(trace) + } +} + +// freeTrace adds tr to traceFreeList if there's room. +// This is non-blocking. +func freeTrace(tr *trace) { + if DebugUseAfterFinish { + return // never reuse + } + tr.reset() + select { + case traceFreeList <- tr: + default: + } +} + +func elapsed(d time.Duration) string { + b := []byte(fmt.Sprintf("%.6f", d.Seconds())) + + // For subsecond durations, blank all zeros before decimal point, + // and all zeros between the decimal point and the first non-zero digit. + if d < time.Second { + dot := bytes.IndexByte(b, '.') + for i := 0; i < dot; i++ { + b[i] = ' ' + } + for i := dot + 1; i < len(b); i++ { + if b[i] == '0' { + b[i] = ' ' + } else { + break + } + } + } + + return string(b) +} + +var pageTmplCache *template.Template +var pageTmplOnce sync.Once + +func pageTmpl() *template.Template { + pageTmplOnce.Do(func() { + pageTmplCache = template.Must(template.New("Page").Funcs(template.FuncMap{ + "elapsed": elapsed, + "add": func(a, b int) int { return a + b }, + }).Parse(pageHTML)) + }) + return pageTmplCache +} + +const pageHTML = ` +{{template "Prolog" .}} +{{template "StatusTable" .}} +{{template "Epilog" .}} + +{{define "Prolog"}} + + + /debug/requests + + + + +

/debug/requests

+{{end}} {{/* end of Prolog */}} + +{{define "StatusTable"}} + + {{range $fam := .Families}} + + + + {{$n := index $.ActiveTraceCount $fam}} + + + {{$f := index $.CompletedTraces $fam}} + {{range $i, $b := $f.Buckets}} + {{$empty := $b.Empty}} + + {{end}} + + {{$nb := len $f.Buckets}} + + + + + + {{end}} +
{{$fam}} + {{if $n}}{{end}} + [{{$n}} active] + {{if $n}}{{end}} + + {{if not $empty}}{{end}} + [{{.Cond}}] + {{if not $empty}}{{end}} + + [minute] + + [hour] + + [total] +
+{{end}} {{/* end of StatusTable */}} + +{{define "Epilog"}} +{{if $.Traces}} +
+

Family: {{$.Family}}

+ +{{if or $.Expanded $.Traced}} + [Normal/Summary] +{{else}} + [Normal/Summary] +{{end}} + +{{if or (not $.Expanded) $.Traced}} + [Normal/Expanded] +{{else}} + [Normal/Expanded] +{{end}} + +{{if not $.Active}} + {{if or $.Expanded (not $.Traced)}} + [Traced/Summary] + {{else}} + [Traced/Summary] + {{end}} + {{if or (not $.Expanded) (not $.Traced)}} + [Traced/Expanded] + {{else}} + [Traced/Expanded] + {{end}} +{{end}} + +{{if $.Total}} +

Showing {{len $.Traces}} of {{$.Total}} traces.

+{{end}} + + + + + {{range $tr := $.Traces}} + + + + + {{/* TODO: include traceID/spanID */}} + + {{if $.Expanded}} + {{range $tr.Events}} + + + + + + {{end}} + {{end}} + {{end}} +
+ {{if $.Active}}Active{{else}}Completed{{end}} Requests +
WhenElapsed (s)
{{$tr.When}}{{$tr.ElapsedTime}}{{$tr.Title}}
{{.WhenString}}{{elapsed .Elapsed}}{{if or $.ShowSensitive (not .Sensitive)}}... {{.What}}{{else}}[redacted]{{end}}
+{{end}} {{/* if $.Traces */}} + +{{if $.Histogram}} +

Latency (µs) of {{$.Family}} over {{$.HistogramWindow}}

+{{$.Histogram}} +{{end}} {{/* if $.Histogram */}} + + + +{{end}} {{/* end of Epilog */}} +` diff --git a/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s b/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s new file mode 100644 index 00000000..06f84b85 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s @@ -0,0 +1,17 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for ppc64, AIX are implemented in runtime/syscall_aix.go +// + +TEXT ·syscall6(SB),NOSPLIT,$0-88 + JMP syscall·syscall6(SB) + +TEXT ·rawSyscall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSyscall6(SB) diff --git a/vendor/golang.org/x/sys/cpu/byteorder.go b/vendor/golang.org/x/sys/cpu/byteorder.go new file mode 100644 index 00000000..dcbb14ef --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/byteorder.go @@ -0,0 +1,65 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +import ( + "runtime" +) + +// byteOrder is a subset of encoding/binary.ByteOrder. +type byteOrder interface { + Uint32([]byte) uint32 + Uint64([]byte) uint64 +} + +type littleEndian struct{} +type bigEndian struct{} + +func (littleEndian) Uint32(b []byte) uint32 { + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func (littleEndian) Uint64(b []byte) uint64 { + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 +} + +func (bigEndian) Uint32(b []byte) uint32 { + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 +} + +func (bigEndian) Uint64(b []byte) uint64 { + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | + uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 +} + +// hostByteOrder returns littleEndian on little-endian machines and +// bigEndian on big-endian machines. +func hostByteOrder() byteOrder { + switch runtime.GOARCH { + case "386", "amd64", "amd64p32", + "alpha", + "arm", "arm64", + "mipsle", "mips64le", "mips64p32le", + "nios2", + "ppc64le", + "riscv", "riscv64", + "sh": + return littleEndian{} + case "armbe", "arm64be", + "m68k", + "mips", "mips64", "mips64p32", + "ppc", "ppc64", + "s390", "s390x", + "shbe", + "sparc", "sparc64": + return bigEndian{} + } + panic("unknown architecture") +} diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go new file mode 100644 index 00000000..5cce25ed --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu.go @@ -0,0 +1,267 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package cpu implements processor feature detection for +// various CPU architectures. +package cpu + +import ( + "os" + "strings" +) + +// Initialized reports whether the CPU features were initialized. +// +// For some GOOS/GOARCH combinations initialization of the CPU features depends +// on reading an operating specific file, e.g. /proc/self/auxv on linux/arm +// Initialized will report false if reading the file fails. +var Initialized bool + +// CacheLinePad is used to pad structs to avoid false sharing. +type CacheLinePad struct{ _ [cacheLineSize]byte } + +// X86 contains the supported CPU features of the +// current X86/AMD64 platform. If the current platform +// is not X86/AMD64 then all feature flags are false. +// +// X86 is padded to avoid false sharing. Further the HasAVX +// and HasAVX2 are only set if the OS supports XMM and YMM +// registers in addition to the CPUID feature bit being set. +var X86 struct { + _ CacheLinePad + HasAES bool // AES hardware implementation (AES NI) + HasADX bool // Multi-precision add-carry instruction extensions + HasAVX bool // Advanced vector extension + HasAVX2 bool // Advanced vector extension 2 + HasBMI1 bool // Bit manipulation instruction set 1 + HasBMI2 bool // Bit manipulation instruction set 2 + HasERMS bool // Enhanced REP for MOVSB and STOSB + HasFMA bool // Fused-multiply-add instructions + HasOSXSAVE bool // OS supports XSAVE/XRESTOR for saving/restoring XMM registers. + HasPCLMULQDQ bool // PCLMULQDQ instruction - most often used for AES-GCM + HasPOPCNT bool // Hamming weight instruction POPCNT. + HasRDRAND bool // RDRAND instruction (on-chip random number generator) + HasRDSEED bool // RDSEED instruction (on-chip random number generator) + HasSSE2 bool // Streaming SIMD extension 2 (always available on amd64) + HasSSE3 bool // Streaming SIMD extension 3 + HasSSSE3 bool // Supplemental streaming SIMD extension 3 + HasSSE41 bool // Streaming SIMD extension 4 and 4.1 + HasSSE42 bool // Streaming SIMD extension 4 and 4.2 + _ CacheLinePad +} + +// ARM64 contains the supported CPU features of the +// current ARMv8(aarch64) platform. If the current platform +// is not arm64 then all feature flags are false. +var ARM64 struct { + _ CacheLinePad + HasFP bool // Floating-point instruction set (always available) + HasASIMD bool // Advanced SIMD (always available) + HasEVTSTRM bool // Event stream support + HasAES bool // AES hardware implementation + HasPMULL bool // Polynomial multiplication instruction set + HasSHA1 bool // SHA1 hardware implementation + HasSHA2 bool // SHA2 hardware implementation + HasCRC32 bool // CRC32 hardware implementation + HasATOMICS bool // Atomic memory operation instruction set + HasFPHP bool // Half precision floating-point instruction set + HasASIMDHP bool // Advanced SIMD half precision instruction set + HasCPUID bool // CPUID identification scheme registers + HasASIMDRDM bool // Rounding double multiply add/subtract instruction set + HasJSCVT bool // Javascript conversion from floating-point to integer + HasFCMA bool // Floating-point multiplication and addition of complex numbers + HasLRCPC bool // Release Consistent processor consistent support + HasDCPOP bool // Persistent memory support + HasSHA3 bool // SHA3 hardware implementation + HasSM3 bool // SM3 hardware implementation + HasSM4 bool // SM4 hardware implementation + HasASIMDDP bool // Advanced SIMD double precision instruction set + HasSHA512 bool // SHA512 hardware implementation + HasSVE bool // Scalable Vector Extensions + HasASIMDFHM bool // Advanced SIMD multiplication FP16 to FP32 + _ CacheLinePad +} + +// ARM contains the supported CPU features of the current ARM (32-bit) platform. +// All feature flags are false if: +// 1. the current platform is not arm, or +// 2. the current operating system is not Linux. +var ARM struct { + _ CacheLinePad + HasSWP bool // SWP instruction support + HasHALF bool // Half-word load and store support + HasTHUMB bool // ARM Thumb instruction set + Has26BIT bool // Address space limited to 26-bits + HasFASTMUL bool // 32-bit operand, 64-bit result multiplication support + HasFPA bool // Floating point arithmetic support + HasVFP bool // Vector floating point support + HasEDSP bool // DSP Extensions support + HasJAVA bool // Java instruction set + HasIWMMXT bool // Intel Wireless MMX technology support + HasCRUNCH bool // MaverickCrunch context switching and handling + HasTHUMBEE bool // Thumb EE instruction set + HasNEON bool // NEON instruction set + HasVFPv3 bool // Vector floating point version 3 support + HasVFPv3D16 bool // Vector floating point version 3 D8-D15 + HasTLS bool // Thread local storage support + HasVFPv4 bool // Vector floating point version 4 support + HasIDIVA bool // Integer divide instruction support in ARM mode + HasIDIVT bool // Integer divide instruction support in Thumb mode + HasVFPD32 bool // Vector floating point version 3 D15-D31 + HasLPAE bool // Large Physical Address Extensions + HasEVTSTRM bool // Event stream support + HasAES bool // AES hardware implementation + HasPMULL bool // Polynomial multiplication instruction set + HasSHA1 bool // SHA1 hardware implementation + HasSHA2 bool // SHA2 hardware implementation + HasCRC32 bool // CRC32 hardware implementation + _ CacheLinePad +} + +// MIPS64X contains the supported CPU features of the current mips64/mips64le +// platforms. If the current platform is not mips64/mips64le or the current +// operating system is not Linux then all feature flags are false. +var MIPS64X struct { + _ CacheLinePad + HasMSA bool // MIPS SIMD architecture + _ CacheLinePad +} + +// PPC64 contains the supported CPU features of the current ppc64/ppc64le platforms. +// If the current platform is not ppc64/ppc64le then all feature flags are false. +// +// For ppc64/ppc64le, it is safe to check only for ISA level starting on ISA v3.00, +// since there are no optional categories. There are some exceptions that also +// require kernel support to work (DARN, SCV), so there are feature bits for +// those as well. The minimum processor requirement is POWER8 (ISA 2.07). +// The struct is padded to avoid false sharing. +var PPC64 struct { + _ CacheLinePad + HasDARN bool // Hardware random number generator (requires kernel enablement) + HasSCV bool // Syscall vectored (requires kernel enablement) + IsPOWER8 bool // ISA v2.07 (POWER8) + IsPOWER9 bool // ISA v3.00 (POWER9) + _ CacheLinePad +} + +// S390X contains the supported CPU features of the current IBM Z +// (s390x) platform. If the current platform is not IBM Z then all +// feature flags are false. +// +// S390X is padded to avoid false sharing. Further HasVX is only set +// if the OS supports vector registers in addition to the STFLE +// feature bit being set. +var S390X struct { + _ CacheLinePad + HasZARCH bool // z/Architecture mode is active [mandatory] + HasSTFLE bool // store facility list extended + HasLDISP bool // long (20-bit) displacements + HasEIMM bool // 32-bit immediates + HasDFP bool // decimal floating point + HasETF3EH bool // ETF-3 enhanced + HasMSA bool // message security assist (CPACF) + HasAES bool // KM-AES{128,192,256} functions + HasAESCBC bool // KMC-AES{128,192,256} functions + HasAESCTR bool // KMCTR-AES{128,192,256} functions + HasAESGCM bool // KMA-GCM-AES{128,192,256} functions + HasGHASH bool // KIMD-GHASH function + HasSHA1 bool // K{I,L}MD-SHA-1 functions + HasSHA256 bool // K{I,L}MD-SHA-256 functions + HasSHA512 bool // K{I,L}MD-SHA-512 functions + HasSHA3 bool // K{I,L}MD-SHA3-{224,256,384,512} and K{I,L}MD-SHAKE-{128,256} functions + HasVX bool // vector facility + HasVXE bool // vector-enhancements facility 1 + _ CacheLinePad +} + +func init() { + archInit() + initOptions() + processOptions() +} + +// options contains the cpu debug options that can be used in GODEBUG. +// Options are arch dependent and are added by the arch specific initOptions functions. +// Features that are mandatory for the specific GOARCH should have the Required field set +// (e.g. SSE2 on amd64). +var options []option + +// Option names should be lower case. e.g. avx instead of AVX. +type option struct { + Name string + Feature *bool + Specified bool // whether feature value was specified in GODEBUG + Enable bool // whether feature should be enabled + Required bool // whether feature is mandatory and can not be disabled +} + +func processOptions() { + env := os.Getenv("GODEBUG") +field: + for env != "" { + field := "" + i := strings.IndexByte(env, ',') + if i < 0 { + field, env = env, "" + } else { + field, env = env[:i], env[i+1:] + } + if len(field) < 4 || field[:4] != "cpu." { + continue + } + i = strings.IndexByte(field, '=') + if i < 0 { + print("GODEBUG sys/cpu: no value specified for \"", field, "\"\n") + continue + } + key, value := field[4:i], field[i+1:] // e.g. "SSE2", "on" + + var enable bool + switch value { + case "on": + enable = true + case "off": + enable = false + default: + print("GODEBUG sys/cpu: value \"", value, "\" not supported for cpu option \"", key, "\"\n") + continue field + } + + if key == "all" { + for i := range options { + options[i].Specified = true + options[i].Enable = enable || options[i].Required + } + continue field + } + + for i := range options { + if options[i].Name == key { + options[i].Specified = true + options[i].Enable = enable + continue field + } + } + + print("GODEBUG sys/cpu: unknown cpu feature \"", key, "\"\n") + } + + for _, o := range options { + if !o.Specified { + continue + } + + if o.Enable && !*o.Feature { + print("GODEBUG sys/cpu: can not enable \"", o.Name, "\", missing CPU support\n") + continue + } + + if !o.Enable && o.Required { + print("GODEBUG sys/cpu: can not disable \"", o.Name, "\", required CPU feature\n") + continue + } + + *o.Feature = o.Enable + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_aix.go b/vendor/golang.org/x/sys/cpu/cpu_aix.go new file mode 100644 index 00000000..464a209c --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_aix.go @@ -0,0 +1,32 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix + +package cpu + +const ( + // getsystemcfg constants + _SC_IMPL = 2 + _IMPL_POWER8 = 0x10000 + _IMPL_POWER9 = 0x20000 +) + +func archInit() { + impl := getsystemcfg(_SC_IMPL) + if impl&_IMPL_POWER8 != 0 { + PPC64.IsPOWER8 = true + } + if impl&_IMPL_POWER9 != 0 { + PPC64.IsPOWER9 = true + } + + Initialized = true +} + +func getsystemcfg(label int) (n uint64) { + r0, _ := callgetsystemcfg(label) + n = uint64(r0) + return +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm.go b/vendor/golang.org/x/sys/cpu/cpu_arm.go new file mode 100644 index 00000000..301b752e --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm.go @@ -0,0 +1,73 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +const cacheLineSize = 32 + +// HWCAP/HWCAP2 bits. +// These are specific to Linux. +const ( + hwcap_SWP = 1 << 0 + hwcap_HALF = 1 << 1 + hwcap_THUMB = 1 << 2 + hwcap_26BIT = 1 << 3 + hwcap_FAST_MULT = 1 << 4 + hwcap_FPA = 1 << 5 + hwcap_VFP = 1 << 6 + hwcap_EDSP = 1 << 7 + hwcap_JAVA = 1 << 8 + hwcap_IWMMXT = 1 << 9 + hwcap_CRUNCH = 1 << 10 + hwcap_THUMBEE = 1 << 11 + hwcap_NEON = 1 << 12 + hwcap_VFPv3 = 1 << 13 + hwcap_VFPv3D16 = 1 << 14 + hwcap_TLS = 1 << 15 + hwcap_VFPv4 = 1 << 16 + hwcap_IDIVA = 1 << 17 + hwcap_IDIVT = 1 << 18 + hwcap_VFPD32 = 1 << 19 + hwcap_LPAE = 1 << 20 + hwcap_EVTSTRM = 1 << 21 + + hwcap2_AES = 1 << 0 + hwcap2_PMULL = 1 << 1 + hwcap2_SHA1 = 1 << 2 + hwcap2_SHA2 = 1 << 3 + hwcap2_CRC32 = 1 << 4 +) + +func initOptions() { + options = []option{ + {Name: "pmull", Feature: &ARM.HasPMULL}, + {Name: "sha1", Feature: &ARM.HasSHA1}, + {Name: "sha2", Feature: &ARM.HasSHA2}, + {Name: "swp", Feature: &ARM.HasSWP}, + {Name: "thumb", Feature: &ARM.HasTHUMB}, + {Name: "thumbee", Feature: &ARM.HasTHUMBEE}, + {Name: "tls", Feature: &ARM.HasTLS}, + {Name: "vfp", Feature: &ARM.HasVFP}, + {Name: "vfpd32", Feature: &ARM.HasVFPD32}, + {Name: "vfpv3", Feature: &ARM.HasVFPv3}, + {Name: "vfpv3d16", Feature: &ARM.HasVFPv3D16}, + {Name: "vfpv4", Feature: &ARM.HasVFPv4}, + {Name: "half", Feature: &ARM.HasHALF}, + {Name: "26bit", Feature: &ARM.Has26BIT}, + {Name: "fastmul", Feature: &ARM.HasFASTMUL}, + {Name: "fpa", Feature: &ARM.HasFPA}, + {Name: "edsp", Feature: &ARM.HasEDSP}, + {Name: "java", Feature: &ARM.HasJAVA}, + {Name: "iwmmxt", Feature: &ARM.HasIWMMXT}, + {Name: "crunch", Feature: &ARM.HasCRUNCH}, + {Name: "neon", Feature: &ARM.HasNEON}, + {Name: "idivt", Feature: &ARM.HasIDIVT}, + {Name: "idiva", Feature: &ARM.HasIDIVA}, + {Name: "lpae", Feature: &ARM.HasLPAE}, + {Name: "evtstrm", Feature: &ARM.HasEVTSTRM}, + {Name: "aes", Feature: &ARM.HasAES}, + {Name: "crc32", Feature: &ARM.HasCRC32}, + } + +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_arm64.go new file mode 100644 index 00000000..2d900243 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.go @@ -0,0 +1,173 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +import "runtime" + +const cacheLineSize = 64 + +func initOptions() { + options = []option{ + {Name: "fp", Feature: &ARM64.HasFP}, + {Name: "asimd", Feature: &ARM64.HasASIMD}, + {Name: "evstrm", Feature: &ARM64.HasEVTSTRM}, + {Name: "aes", Feature: &ARM64.HasAES}, + {Name: "fphp", Feature: &ARM64.HasFPHP}, + {Name: "jscvt", Feature: &ARM64.HasJSCVT}, + {Name: "lrcpc", Feature: &ARM64.HasLRCPC}, + {Name: "pmull", Feature: &ARM64.HasPMULL}, + {Name: "sha1", Feature: &ARM64.HasSHA1}, + {Name: "sha2", Feature: &ARM64.HasSHA2}, + {Name: "sha3", Feature: &ARM64.HasSHA3}, + {Name: "sha512", Feature: &ARM64.HasSHA512}, + {Name: "sm3", Feature: &ARM64.HasSM3}, + {Name: "sm4", Feature: &ARM64.HasSM4}, + {Name: "sve", Feature: &ARM64.HasSVE}, + {Name: "crc32", Feature: &ARM64.HasCRC32}, + {Name: "atomics", Feature: &ARM64.HasATOMICS}, + {Name: "asimdhp", Feature: &ARM64.HasASIMDHP}, + {Name: "cpuid", Feature: &ARM64.HasCPUID}, + {Name: "asimrdm", Feature: &ARM64.HasASIMDRDM}, + {Name: "fcma", Feature: &ARM64.HasFCMA}, + {Name: "dcpop", Feature: &ARM64.HasDCPOP}, + {Name: "asimddp", Feature: &ARM64.HasASIMDDP}, + {Name: "asimdfhm", Feature: &ARM64.HasASIMDFHM}, + } +} + +func archInit() { + switch runtime.GOOS { + case "android", "darwin", "netbsd": + // Android and iOS don't seem to allow reading these registers. + // + // NetBSD: + // ID_AA64ISAR0_EL1 is a privileged register and cannot be read from EL0. + // It can be read via sysctl(3). Example for future implementers: + // https://nxr.netbsd.org/xref/src/usr.sbin/cpuctl/arch/aarch64.c + // + // Fake the minimal features expected by + // TestARM64minimalFeatures. + ARM64.HasASIMD = true + ARM64.HasFP = true + case "linux": + doinit() + default: + readARM64Registers() + } +} + +func readARM64Registers() { + Initialized = true + + // ID_AA64ISAR0_EL1 + isar0 := getisar0() + + switch extractBits(isar0, 4, 7) { + case 1: + ARM64.HasAES = true + case 2: + ARM64.HasAES = true + ARM64.HasPMULL = true + } + + switch extractBits(isar0, 8, 11) { + case 1: + ARM64.HasSHA1 = true + } + + switch extractBits(isar0, 12, 15) { + case 1: + ARM64.HasSHA2 = true + case 2: + ARM64.HasSHA2 = true + ARM64.HasSHA512 = true + } + + switch extractBits(isar0, 16, 19) { + case 1: + ARM64.HasCRC32 = true + } + + switch extractBits(isar0, 20, 23) { + case 2: + ARM64.HasATOMICS = true + } + + switch extractBits(isar0, 28, 31) { + case 1: + ARM64.HasASIMDRDM = true + } + + switch extractBits(isar0, 32, 35) { + case 1: + ARM64.HasSHA3 = true + } + + switch extractBits(isar0, 36, 39) { + case 1: + ARM64.HasSM3 = true + } + + switch extractBits(isar0, 40, 43) { + case 1: + ARM64.HasSM4 = true + } + + switch extractBits(isar0, 44, 47) { + case 1: + ARM64.HasASIMDDP = true + } + + // ID_AA64ISAR1_EL1 + isar1 := getisar1() + + switch extractBits(isar1, 0, 3) { + case 1: + ARM64.HasDCPOP = true + } + + switch extractBits(isar1, 12, 15) { + case 1: + ARM64.HasJSCVT = true + } + + switch extractBits(isar1, 16, 19) { + case 1: + ARM64.HasFCMA = true + } + + switch extractBits(isar1, 20, 23) { + case 1: + ARM64.HasLRCPC = true + } + + // ID_AA64PFR0_EL1 + pfr0 := getpfr0() + + switch extractBits(pfr0, 16, 19) { + case 0: + ARM64.HasFP = true + case 1: + ARM64.HasFP = true + ARM64.HasFPHP = true + } + + switch extractBits(pfr0, 20, 23) { + case 0: + ARM64.HasASIMD = true + case 1: + ARM64.HasASIMD = true + ARM64.HasASIMDHP = true + } + + switch extractBits(pfr0, 32, 35) { + case 1: + ARM64.HasSVE = true + } +} + +func extractBits(data uint64, start, end uint) uint { + return (uint)(data>>start) & ((1 << (end - start + 1)) - 1) +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.s b/vendor/golang.org/x/sys/cpu/cpu_arm64.s new file mode 100644 index 00000000..a54436e3 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.s @@ -0,0 +1,31 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// func getisar0() uint64 +TEXT ·getisar0(SB),NOSPLIT,$0-8 + // get Instruction Set Attributes 0 into x0 + // mrs x0, ID_AA64ISAR0_EL1 = d5380600 + WORD $0xd5380600 + MOVD R0, ret+0(FP) + RET + +// func getisar1() uint64 +TEXT ·getisar1(SB),NOSPLIT,$0-8 + // get Instruction Set Attributes 1 into x0 + // mrs x0, ID_AA64ISAR1_EL1 = d5380620 + WORD $0xd5380620 + MOVD R0, ret+0(FP) + RET + +// func getpfr0() uint64 +TEXT ·getpfr0(SB),NOSPLIT,$0-8 + // get Processor Feature Register 0 into x0 + // mrs x0, ID_AA64PFR0_EL1 = d5380400 + WORD $0xd5380400 + MOVD R0, ret+0(FP) + RET diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go new file mode 100644 index 00000000..7b88e865 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go @@ -0,0 +1,11 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +package cpu + +func getisar0() uint64 +func getisar1() uint64 +func getpfr0() uint64 diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go new file mode 100644 index 00000000..568bcd03 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go @@ -0,0 +1,21 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +package cpu + +// haveAsmFunctions reports whether the other functions in this file can +// be safely called. +func haveAsmFunctions() bool { return true } + +// The following feature detection functions are defined in cpu_s390x.s. +// They are likely to be expensive to call so the results should be cached. +func stfle() facilityList +func kmQuery() queryResult +func kmcQuery() queryResult +func kmctrQuery() queryResult +func kmaQuery() queryResult +func kimdQuery() queryResult +func klmdQuery() queryResult diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go new file mode 100644 index 00000000..f7cb4697 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go @@ -0,0 +1,16 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386 amd64 amd64p32 +// +build !gccgo + +package cpu + +// cpuid is implemented in cpu_x86.s for gc compiler +// and in cpu_gccgo.c for gccgo. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in cpu_x86.s for gc compiler +// and in cpu_gccgo.c for gccgo. +func xgetbv() (eax, edx uint32) diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go new file mode 100644 index 00000000..53ca8d65 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go @@ -0,0 +1,11 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo + +package cpu + +func getisar0() uint64 { return 0 } +func getisar1() uint64 { return 0 } +func getpfr0() uint64 { return 0 } diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go new file mode 100644 index 00000000..aa986f77 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go @@ -0,0 +1,22 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo + +package cpu + +// haveAsmFunctions reports whether the other functions in this file can +// be safely called. +func haveAsmFunctions() bool { return false } + +// TODO(mundaym): the following feature detection functions are currently +// stubs. See https://golang.org/cl/162887 for how to fix this. +// They are likely to be expensive to call so the results should be cached. +func stfle() facilityList { panic("not implemented for gccgo") } +func kmQuery() queryResult { panic("not implemented for gccgo") } +func kmcQuery() queryResult { panic("not implemented for gccgo") } +func kmctrQuery() queryResult { panic("not implemented for gccgo") } +func kmaQuery() queryResult { panic("not implemented for gccgo") } +func kimdQuery() queryResult { panic("not implemented for gccgo") } +func klmdQuery() queryResult { panic("not implemented for gccgo") } diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c new file mode 100644 index 00000000..e363c7d1 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c @@ -0,0 +1,43 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386 amd64 amd64p32 +// +build gccgo + +#include +#include + +// Need to wrap __get_cpuid_count because it's declared as static. +int +gccgoGetCpuidCount(uint32_t leaf, uint32_t subleaf, + uint32_t *eax, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx) +{ + return __get_cpuid_count(leaf, subleaf, eax, ebx, ecx, edx); +} + +// xgetbv reads the contents of an XCR (Extended Control Register) +// specified in the ECX register into registers EDX:EAX. +// Currently, the only supported value for XCR is 0. +// +// TODO: Replace with a better alternative: +// +// #include +// +// #pragma GCC target("xsave") +// +// void gccgoXgetbv(uint32_t *eax, uint32_t *edx) { +// unsigned long long x = _xgetbv(0); +// *eax = x & 0xffffffff; +// *edx = (x >> 32) & 0xffffffff; +// } +// +// Note that _xgetbv is defined starting with GCC 8. +void +gccgoXgetbv(uint32_t *eax, uint32_t *edx) +{ + __asm(" xorl %%ecx, %%ecx\n" + " xgetbv" + : "=a"(*eax), "=d"(*edx)); +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go new file mode 100644 index 00000000..ba49b91b --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go @@ -0,0 +1,26 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386 amd64 amd64p32 +// +build gccgo + +package cpu + +//extern gccgoGetCpuidCount +func gccgoGetCpuidCount(eaxArg, ecxArg uint32, eax, ebx, ecx, edx *uint32) + +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) { + var a, b, c, d uint32 + gccgoGetCpuidCount(eaxArg, ecxArg, &a, &b, &c, &d) + return a, b, c, d +} + +//extern gccgoXgetbv +func gccgoXgetbv(eax, edx *uint32) + +func xgetbv() (eax, edx uint32) { + var a, d uint32 + gccgoXgetbv(&a, &d) + return a, d +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux.go b/vendor/golang.org/x/sys/cpu/cpu_linux.go new file mode 100644 index 00000000..6fc874f7 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux.go @@ -0,0 +1,15 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !386,!amd64,!amd64p32,!arm64 + +package cpu + +func archInit() { + if err := readHWCAP(); err != nil { + return + } + doinit() + Initialized = true +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go b/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go new file mode 100644 index 00000000..2057006d --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go @@ -0,0 +1,39 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +func doinit() { + ARM.HasSWP = isSet(hwCap, hwcap_SWP) + ARM.HasHALF = isSet(hwCap, hwcap_HALF) + ARM.HasTHUMB = isSet(hwCap, hwcap_THUMB) + ARM.Has26BIT = isSet(hwCap, hwcap_26BIT) + ARM.HasFASTMUL = isSet(hwCap, hwcap_FAST_MULT) + ARM.HasFPA = isSet(hwCap, hwcap_FPA) + ARM.HasVFP = isSet(hwCap, hwcap_VFP) + ARM.HasEDSP = isSet(hwCap, hwcap_EDSP) + ARM.HasJAVA = isSet(hwCap, hwcap_JAVA) + ARM.HasIWMMXT = isSet(hwCap, hwcap_IWMMXT) + ARM.HasCRUNCH = isSet(hwCap, hwcap_CRUNCH) + ARM.HasTHUMBEE = isSet(hwCap, hwcap_THUMBEE) + ARM.HasNEON = isSet(hwCap, hwcap_NEON) + ARM.HasVFPv3 = isSet(hwCap, hwcap_VFPv3) + ARM.HasVFPv3D16 = isSet(hwCap, hwcap_VFPv3D16) + ARM.HasTLS = isSet(hwCap, hwcap_TLS) + ARM.HasVFPv4 = isSet(hwCap, hwcap_VFPv4) + ARM.HasIDIVA = isSet(hwCap, hwcap_IDIVA) + ARM.HasIDIVT = isSet(hwCap, hwcap_IDIVT) + ARM.HasVFPD32 = isSet(hwCap, hwcap_VFPD32) + ARM.HasLPAE = isSet(hwCap, hwcap_LPAE) + ARM.HasEVTSTRM = isSet(hwCap, hwcap_EVTSTRM) + ARM.HasAES = isSet(hwCap2, hwcap2_AES) + ARM.HasPMULL = isSet(hwCap2, hwcap2_PMULL) + ARM.HasSHA1 = isSet(hwCap2, hwcap2_SHA1) + ARM.HasSHA2 = isSet(hwCap2, hwcap2_SHA2) + ARM.HasCRC32 = isSet(hwCap2, hwcap2_CRC32) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go new file mode 100644 index 00000000..79a38a0b --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go @@ -0,0 +1,71 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +// HWCAP/HWCAP2 bits. These are exposed by Linux. +const ( + hwcap_FP = 1 << 0 + hwcap_ASIMD = 1 << 1 + hwcap_EVTSTRM = 1 << 2 + hwcap_AES = 1 << 3 + hwcap_PMULL = 1 << 4 + hwcap_SHA1 = 1 << 5 + hwcap_SHA2 = 1 << 6 + hwcap_CRC32 = 1 << 7 + hwcap_ATOMICS = 1 << 8 + hwcap_FPHP = 1 << 9 + hwcap_ASIMDHP = 1 << 10 + hwcap_CPUID = 1 << 11 + hwcap_ASIMDRDM = 1 << 12 + hwcap_JSCVT = 1 << 13 + hwcap_FCMA = 1 << 14 + hwcap_LRCPC = 1 << 15 + hwcap_DCPOP = 1 << 16 + hwcap_SHA3 = 1 << 17 + hwcap_SM3 = 1 << 18 + hwcap_SM4 = 1 << 19 + hwcap_ASIMDDP = 1 << 20 + hwcap_SHA512 = 1 << 21 + hwcap_SVE = 1 << 22 + hwcap_ASIMDFHM = 1 << 23 +) + +func doinit() { + if err := readHWCAP(); err != nil { + // failed to read /proc/self/auxv, try reading registers directly + readARM64Registers() + return + } + + // HWCAP feature bits + ARM64.HasFP = isSet(hwCap, hwcap_FP) + ARM64.HasASIMD = isSet(hwCap, hwcap_ASIMD) + ARM64.HasEVTSTRM = isSet(hwCap, hwcap_EVTSTRM) + ARM64.HasAES = isSet(hwCap, hwcap_AES) + ARM64.HasPMULL = isSet(hwCap, hwcap_PMULL) + ARM64.HasSHA1 = isSet(hwCap, hwcap_SHA1) + ARM64.HasSHA2 = isSet(hwCap, hwcap_SHA2) + ARM64.HasCRC32 = isSet(hwCap, hwcap_CRC32) + ARM64.HasATOMICS = isSet(hwCap, hwcap_ATOMICS) + ARM64.HasFPHP = isSet(hwCap, hwcap_FPHP) + ARM64.HasASIMDHP = isSet(hwCap, hwcap_ASIMDHP) + ARM64.HasCPUID = isSet(hwCap, hwcap_CPUID) + ARM64.HasASIMDRDM = isSet(hwCap, hwcap_ASIMDRDM) + ARM64.HasJSCVT = isSet(hwCap, hwcap_JSCVT) + ARM64.HasFCMA = isSet(hwCap, hwcap_FCMA) + ARM64.HasLRCPC = isSet(hwCap, hwcap_LRCPC) + ARM64.HasDCPOP = isSet(hwCap, hwcap_DCPOP) + ARM64.HasSHA3 = isSet(hwCap, hwcap_SHA3) + ARM64.HasSM3 = isSet(hwCap, hwcap_SM3) + ARM64.HasSM4 = isSet(hwCap, hwcap_SM4) + ARM64.HasASIMDDP = isSet(hwCap, hwcap_ASIMDDP) + ARM64.HasSHA512 = isSet(hwCap, hwcap_SHA512) + ARM64.HasSVE = isSet(hwCap, hwcap_SVE) + ARM64.HasASIMDFHM = isSet(hwCap, hwcap_ASIMDFHM) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go new file mode 100644 index 00000000..5a418900 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go @@ -0,0 +1,23 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips64 mips64le + +package cpu + +// HWCAP bits. These are exposed by the Linux kernel 5.4. +const ( + // CPU features + hwcap_MIPS_MSA = 1 << 1 +) + +func doinit() { + // HWCAP feature bits + MIPS64X.HasMSA = isSet(hwCap, hwcap_MIPS_MSA) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go new file mode 100644 index 00000000..42b5d33c --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go @@ -0,0 +1,9 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux,!arm,!arm64,!mips64,!mips64le,!ppc64,!ppc64le,!s390x + +package cpu + +func doinit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go new file mode 100644 index 00000000..99f8a639 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go @@ -0,0 +1,31 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build ppc64 ppc64le + +package cpu + +// HWCAP/HWCAP2 bits. These are exposed by the kernel. +const ( + // ISA Level + _PPC_FEATURE2_ARCH_2_07 = 0x80000000 + _PPC_FEATURE2_ARCH_3_00 = 0x00800000 + + // CPU features + _PPC_FEATURE2_DARN = 0x00200000 + _PPC_FEATURE2_SCV = 0x00100000 +) + +func doinit() { + // HWCAP2 feature bits + PPC64.IsPOWER8 = isSet(hwCap2, _PPC_FEATURE2_ARCH_2_07) + PPC64.IsPOWER9 = isSet(hwCap2, _PPC_FEATURE2_ARCH_3_00) + PPC64.HasDARN = isSet(hwCap2, _PPC_FEATURE2_DARN) + PPC64.HasSCV = isSet(hwCap2, _PPC_FEATURE2_SCV) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go new file mode 100644 index 00000000..b88d6b8f --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go @@ -0,0 +1,159 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +const ( + // bit mask values from /usr/include/bits/hwcap.h + hwcap_ZARCH = 2 + hwcap_STFLE = 4 + hwcap_MSA = 8 + hwcap_LDISP = 16 + hwcap_EIMM = 32 + hwcap_DFP = 64 + hwcap_ETF3EH = 256 + hwcap_VX = 2048 + hwcap_VXE = 8192 +) + +// bitIsSet reports whether the bit at index is set. The bit index +// is in big endian order, so bit index 0 is the leftmost bit. +func bitIsSet(bits []uint64, index uint) bool { + return bits[index/64]&((1<<63)>>(index%64)) != 0 +} + +// function is the code for the named cryptographic function. +type function uint8 + +const ( + // KM{,A,C,CTR} function codes + aes128 function = 18 // AES-128 + aes192 function = 19 // AES-192 + aes256 function = 20 // AES-256 + + // K{I,L}MD function codes + sha1 function = 1 // SHA-1 + sha256 function = 2 // SHA-256 + sha512 function = 3 // SHA-512 + sha3_224 function = 32 // SHA3-224 + sha3_256 function = 33 // SHA3-256 + sha3_384 function = 34 // SHA3-384 + sha3_512 function = 35 // SHA3-512 + shake128 function = 36 // SHAKE-128 + shake256 function = 37 // SHAKE-256 + + // KLMD function codes + ghash function = 65 // GHASH +) + +// queryResult contains the result of a Query function +// call. Bits are numbered in big endian order so the +// leftmost bit (the MSB) is at index 0. +type queryResult struct { + bits [2]uint64 +} + +// Has reports whether the given functions are present. +func (q *queryResult) Has(fns ...function) bool { + if len(fns) == 0 { + panic("no function codes provided") + } + for _, f := range fns { + if !bitIsSet(q.bits[:], uint(f)) { + return false + } + } + return true +} + +// facility is a bit index for the named facility. +type facility uint8 + +const ( + // cryptography facilities + msa4 facility = 77 // message-security-assist extension 4 + msa8 facility = 146 // message-security-assist extension 8 +) + +// facilityList contains the result of an STFLE call. +// Bits are numbered in big endian order so the +// leftmost bit (the MSB) is at index 0. +type facilityList struct { + bits [4]uint64 +} + +// Has reports whether the given facilities are present. +func (s *facilityList) Has(fs ...facility) bool { + if len(fs) == 0 { + panic("no facility bits provided") + } + for _, f := range fs { + if !bitIsSet(s.bits[:], uint(f)) { + return false + } + } + return true +} + +func doinit() { + // test HWCAP bit vector + has := func(featureMask uint) bool { + return hwCap&featureMask == featureMask + } + + // mandatory + S390X.HasZARCH = has(hwcap_ZARCH) + + // optional + S390X.HasSTFLE = has(hwcap_STFLE) + S390X.HasLDISP = has(hwcap_LDISP) + S390X.HasEIMM = has(hwcap_EIMM) + S390X.HasETF3EH = has(hwcap_ETF3EH) + S390X.HasDFP = has(hwcap_DFP) + S390X.HasMSA = has(hwcap_MSA) + S390X.HasVX = has(hwcap_VX) + if S390X.HasVX { + S390X.HasVXE = has(hwcap_VXE) + } + + // We need implementations of stfle, km and so on + // to detect cryptographic features. + if !haveAsmFunctions() { + return + } + + // optional cryptographic functions + if S390X.HasMSA { + aes := []function{aes128, aes192, aes256} + + // cipher message + km, kmc := kmQuery(), kmcQuery() + S390X.HasAES = km.Has(aes...) + S390X.HasAESCBC = kmc.Has(aes...) + if S390X.HasSTFLE { + facilities := stfle() + if facilities.Has(msa4) { + kmctr := kmctrQuery() + S390X.HasAESCTR = kmctr.Has(aes...) + } + if facilities.Has(msa8) { + kma := kmaQuery() + S390X.HasAESGCM = kma.Has(aes...) + } + } + + // compute message digest + kimd := kimdQuery() // intermediate (no padding) + klmd := klmdQuery() // last (padding) + S390X.HasSHA1 = kimd.Has(sha1) && klmd.Has(sha1) + S390X.HasSHA256 = kimd.Has(sha256) && klmd.Has(sha256) + S390X.HasSHA512 = kimd.Has(sha512) && klmd.Has(sha512) + S390X.HasGHASH = kimd.Has(ghash) // KLMD-GHASH does not exist + sha3 := []function{ + sha3_224, sha3_256, sha3_384, sha3_512, + shake128, shake256, + } + S390X.HasSHA3 = kimd.Has(sha3...) && klmd.Has(sha3...) + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go new file mode 100644 index 00000000..57b5b677 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go @@ -0,0 +1,15 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build mips64 mips64le + +package cpu + +const cacheLineSize = 32 + +func initOptions() { + options = []option{ + {Name: "msa", Feature: &MIPS64X.HasMSA}, + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_mipsx.go b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go new file mode 100644 index 00000000..cfc1946b --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go @@ -0,0 +1,11 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build mips mipsle + +package cpu + +const cacheLineSize = 32 + +func initOptions() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm.go new file mode 100644 index 00000000..b412efc1 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm.go @@ -0,0 +1,9 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !linux,arm + +package cpu + +func archInit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go new file mode 100644 index 00000000..3ffc4afa --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go @@ -0,0 +1,9 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !linux,arm64 + +package cpu + +func doinit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go new file mode 100644 index 00000000..d28d675b --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go @@ -0,0 +1,16 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ppc64 ppc64le + +package cpu + +const cacheLineSize = 128 + +func initOptions() { + options = []option{ + {Name: "darn", Feature: &PPC64.HasDARN}, + {Name: "scv", Feature: &PPC64.HasSCV}, + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go new file mode 100644 index 00000000..8b08de34 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go @@ -0,0 +1,11 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build riscv64 + +package cpu + +const cacheLineSize = 32 + +func initOptions() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_s390x.go new file mode 100644 index 00000000..544cd621 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_s390x.go @@ -0,0 +1,30 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +const cacheLineSize = 256 + +func initOptions() { + options = []option{ + {Name: "zarch", Feature: &S390X.HasZARCH}, + {Name: "stfle", Feature: &S390X.HasSTFLE}, + {Name: "ldisp", Feature: &S390X.HasLDISP}, + {Name: "eimm", Feature: &S390X.HasEIMM}, + {Name: "dfp", Feature: &S390X.HasDFP}, + {Name: "etf3eh", Feature: &S390X.HasETF3EH}, + {Name: "msa", Feature: &S390X.HasMSA}, + {Name: "aes", Feature: &S390X.HasAES}, + {Name: "aescbc", Feature: &S390X.HasAESCBC}, + {Name: "aesctr", Feature: &S390X.HasAESCTR}, + {Name: "aesgcm", Feature: &S390X.HasAESGCM}, + {Name: "ghash", Feature: &S390X.HasGHASH}, + {Name: "sha1", Feature: &S390X.HasSHA1}, + {Name: "sha256", Feature: &S390X.HasSHA256}, + {Name: "sha3", Feature: &S390X.HasSHA3}, + {Name: "sha512", Feature: &S390X.HasSHA512}, + {Name: "vx", Feature: &S390X.HasVX}, + {Name: "vxe", Feature: &S390X.HasVXE}, + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_s390x.s b/vendor/golang.org/x/sys/cpu/cpu_s390x.s new file mode 100644 index 00000000..e5037d92 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_s390x.s @@ -0,0 +1,57 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// func stfle() facilityList +TEXT ·stfle(SB), NOSPLIT|NOFRAME, $0-32 + MOVD $ret+0(FP), R1 + MOVD $3, R0 // last doubleword index to store + XC $32, (R1), (R1) // clear 4 doublewords (32 bytes) + WORD $0xb2b01000 // store facility list extended (STFLE) + RET + +// func kmQuery() queryResult +TEXT ·kmQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KM-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92E0024 // cipher message (KM) + RET + +// func kmcQuery() queryResult +TEXT ·kmcQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMC-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92F0024 // cipher message with chaining (KMC) + RET + +// func kmctrQuery() queryResult +TEXT ·kmctrQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMCTR-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92D4024 // cipher message with counter (KMCTR) + RET + +// func kmaQuery() queryResult +TEXT ·kmaQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMA-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xb9296024 // cipher message with authentication (KMA) + RET + +// func kimdQuery() queryResult +TEXT ·kimdQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KIMD-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB93E0024 // compute intermediate message digest (KIMD) + RET + +// func klmdQuery() queryResult +TEXT ·klmdQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KLMD-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB93F0024 // compute last message digest (KLMD) + RET diff --git a/vendor/golang.org/x/sys/cpu/cpu_wasm.go b/vendor/golang.org/x/sys/cpu/cpu_wasm.go new file mode 100644 index 00000000..5382f2a2 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_wasm.go @@ -0,0 +1,17 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build wasm + +package cpu + +// We're compiling the cpu package for an unknown (software-abstracted) CPU. +// Make CacheLinePad an empty struct and hope that the usual struct alignment +// rules are good enough. + +const cacheLineSize = 0 + +func initOptions() {} + +func archInit() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go new file mode 100644 index 00000000..2ad039d4 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -0,0 +1,88 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386 amd64 amd64p32 + +package cpu + +import "runtime" + +const cacheLineSize = 64 + +func initOptions() { + options = []option{ + {Name: "adx", Feature: &X86.HasADX}, + {Name: "aes", Feature: &X86.HasAES}, + {Name: "avx", Feature: &X86.HasAVX}, + {Name: "avx2", Feature: &X86.HasAVX2}, + {Name: "bmi1", Feature: &X86.HasBMI1}, + {Name: "bmi2", Feature: &X86.HasBMI2}, + {Name: "erms", Feature: &X86.HasERMS}, + {Name: "fma", Feature: &X86.HasFMA}, + {Name: "osxsave", Feature: &X86.HasOSXSAVE}, + {Name: "pclmulqdq", Feature: &X86.HasPCLMULQDQ}, + {Name: "popcnt", Feature: &X86.HasPOPCNT}, + {Name: "rdrand", Feature: &X86.HasRDRAND}, + {Name: "rdseed", Feature: &X86.HasRDSEED}, + {Name: "sse3", Feature: &X86.HasSSE3}, + {Name: "sse41", Feature: &X86.HasSSE41}, + {Name: "sse42", Feature: &X86.HasSSE42}, + {Name: "ssse3", Feature: &X86.HasSSSE3}, + + // These capabilities should always be enabled on amd64: + {Name: "sse2", Feature: &X86.HasSSE2, Required: runtime.GOARCH == "amd64"}, + } +} + +func archInit() { + + Initialized = true + + maxID, _, _, _ := cpuid(0, 0) + + if maxID < 1 { + return + } + + _, _, ecx1, edx1 := cpuid(1, 0) + X86.HasSSE2 = isSet(26, edx1) + + X86.HasSSE3 = isSet(0, ecx1) + X86.HasPCLMULQDQ = isSet(1, ecx1) + X86.HasSSSE3 = isSet(9, ecx1) + X86.HasFMA = isSet(12, ecx1) + X86.HasSSE41 = isSet(19, ecx1) + X86.HasSSE42 = isSet(20, ecx1) + X86.HasPOPCNT = isSet(23, ecx1) + X86.HasAES = isSet(25, ecx1) + X86.HasOSXSAVE = isSet(27, ecx1) + X86.HasRDRAND = isSet(30, ecx1) + + osSupportsAVX := false + // For XGETBV, OSXSAVE bit is required and sufficient. + if X86.HasOSXSAVE { + eax, _ := xgetbv() + // Check if XMM and YMM registers have OS support. + osSupportsAVX = isSet(1, eax) && isSet(2, eax) + } + + X86.HasAVX = isSet(28, ecx1) && osSupportsAVX + + if maxID < 7 { + return + } + + _, ebx7, _, _ := cpuid(7, 0) + X86.HasBMI1 = isSet(3, ebx7) + X86.HasAVX2 = isSet(5, ebx7) && osSupportsAVX + X86.HasBMI2 = isSet(8, ebx7) + X86.HasERMS = isSet(9, ebx7) + X86.HasRDSEED = isSet(18, ebx7) + X86.HasADX = isSet(19, ebx7) + +} + +func isSet(bitpos uint, value uint32) bool { + return value&(1<> 63)) +) + +// For those platforms don't have a 'cpuid' equivalent we use HWCAP/HWCAP2 +// These are initialized in cpu_$GOARCH.go +// and should not be changed after they are initialized. +var hwCap uint +var hwCap2 uint + +func readHWCAP() error { + buf, err := ioutil.ReadFile(procAuxv) + if err != nil { + // e.g. on android /proc/self/auxv is not accessible, so silently + // ignore the error and leave Initialized = false. On some + // architectures (e.g. arm64) doinit() implements a fallback + // readout and will set Initialized = true again. + return err + } + bo := hostByteOrder() + for len(buf) >= 2*(uintSize/8) { + var tag, val uint + switch uintSize { + case 32: + tag = uint(bo.Uint32(buf[0:])) + val = uint(bo.Uint32(buf[4:])) + buf = buf[8:] + case 64: + tag = uint(bo.Uint64(buf[0:])) + val = uint(bo.Uint64(buf[8:])) + buf = buf[16:] + } + switch tag { + case _AT_HWCAP: + hwCap = val + case _AT_HWCAP2: + hwCap2 = val + } + } + return nil +} diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go new file mode 100644 index 00000000..76fbe40b --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go @@ -0,0 +1,27 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Recreate a getsystemcfg syscall handler instead of +// using the one provided by x/sys/unix to avoid having +// the dependency between them. (See golang.org/issue/32102) +// Morever, this file will be used during the building of +// gccgo's libgo and thus must not used a CGo method. + +// +build aix +// +build gccgo + +package cpu + +import ( + "syscall" +) + +//extern getsystemcfg +func gccgoGetsystemcfg(label uint32) (r uint64) + +func callgetsystemcfg(label int) (r1 uintptr, e1 syscall.Errno) { + r1 = uintptr(gccgoGetsystemcfg(uint32(label))) + e1 = syscall.GetErrno() + return +} diff --git a/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go new file mode 100644 index 00000000..78fe25e8 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go @@ -0,0 +1,36 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Minimal copy of x/sys/unix so the cpu package can make a +// system call on AIX without depending on x/sys/unix. +// (See golang.org/issue/32102) + +// +build aix,ppc64 +// +build !gccgo + +package cpu + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o" + +//go:linkname libc_getsystemcfg libc_getsystemcfg + +type syscallFunc uintptr + +var libc_getsystemcfg syscallFunc + +type errno = syscall.Errno + +// Implemented in runtime/syscall_aix.go. +func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno) +func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err errno) + +func callgetsystemcfg(label int) (r1 uintptr, e1 errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getsystemcfg)), 1, uintptr(label), 0, 0, 0, 0, 0) + return +} diff --git a/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s b/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s new file mode 100644 index 00000000..567a4763 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s @@ -0,0 +1,29 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for mips64, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/golang.org/x/sys/unix/ioctl.go b/vendor/golang.org/x/sys/unix/ioctl.go index 3559e5dc..56416786 100644 --- a/vendor/golang.org/x/sys/unix/ioctl.go +++ b/vendor/golang.org/x/sys/unix/ioctl.go @@ -20,6 +20,15 @@ func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } +// IoctlSetPointerInt performs an ioctl operation which sets an +// integer value on fd, using the specified request number. The ioctl +// argument is called with a pointer to the integer value, rather than +// passing the integer value directly. +func IoctlSetPointerInt(fd int, req uint, value int) error { + v := int32(value) + return ioctl(fd, req, uintptr(unsafe.Pointer(&v))) +} + // IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. // // To change fd's window size, the req argument should be TIOCSWINSZ. diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index ece31e9d..83f2d429 100644 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -184,6 +184,15 @@ openbsd_arm64) # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; +openbsd_mips64) + mkerrors="$mkerrors -m64" + mksyscall="go run mksyscall.go -openbsd" + mksysctl="go run mksysctl_openbsd.go" + mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; solaris_amd64) mksyscall="go run mksyscall_solaris.go" mkerrors="$mkerrors -m64" diff --git a/vendor/golang.org/x/sys/unix/mkasm_darwin.go b/vendor/golang.org/x/sys/unix/mkasm_darwin.go deleted file mode 100644 index 6f7bb6ed..00000000 --- a/vendor/golang.org/x/sys/unix/mkasm_darwin.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// mkasm_darwin.go generates assembly trampolines to call libSystem routines from Go. -//This program must be run after mksyscall.go. -package main - -import ( - "bytes" - "fmt" - "io/ioutil" - "log" - "os" - "strings" -) - -func writeASMFile(in string, fileName string, buildTags string) { - trampolines := map[string]bool{} - - var out bytes.Buffer - - fmt.Fprintf(&out, "// go run mkasm_darwin.go %s\n", strings.Join(os.Args[1:], " ")) - fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n") - fmt.Fprintf(&out, "\n") - fmt.Fprintf(&out, "// +build %s\n", buildTags) - fmt.Fprintf(&out, "\n") - fmt.Fprintf(&out, "#include \"textflag.h\"\n") - for _, line := range strings.Split(in, "\n") { - if !strings.HasPrefix(line, "func ") || !strings.HasSuffix(line, "_trampoline()") { - continue - } - fn := line[5 : len(line)-13] - if !trampolines[fn] { - trampolines[fn] = true - fmt.Fprintf(&out, "TEXT ·%s_trampoline(SB),NOSPLIT,$0-0\n", fn) - fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn) - } - } - err := ioutil.WriteFile(fileName, out.Bytes(), 0644) - if err != nil { - log.Fatalf("can't write %s: %s", fileName, err) - } -} - -func main() { - in1, err := ioutil.ReadFile("syscall_darwin.go") - if err != nil { - log.Fatalf("can't open syscall_darwin.go: %s", err) - } - arch := os.Args[1] - in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_darwin_%s.go", arch)) - if err != nil { - log.Fatalf("can't open syscall_darwin_%s.go: %s", arch, err) - } - in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.go", arch)) - if err != nil { - log.Fatalf("can't open zsyscall_darwin_%s.go: %s", arch, err) - } - in := string(in1) + string(in2) + string(in3) - - writeASMFile(in, fmt.Sprintf("zsyscall_darwin_%s.s", arch), "go1.12") - - in1, err = ioutil.ReadFile("syscall_darwin.1_13.go") - if err != nil { - log.Fatalf("can't open syscall_darwin.1_13.go: %s", err) - } - in2, err = ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.1_13.go", arch)) - if err != nil { - log.Fatalf("can't open zsyscall_darwin_%s.1_13.go: %s", arch, err) - } - - in = string(in1) + string(in2) - - writeASMFile(in, fmt.Sprintf("zsyscall_darwin_%s.1_13.s", arch), "go1.13") -} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 53a24931..40534f03 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -196,6 +196,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -517,6 +518,7 @@ ccflags="$@" $2 ~ /^FS_IOC_.*(ENCRYPTION|VERITY|[GS]ETFLAGS)/ || $2 ~ /^FS_VERITY_/ || $2 ~ /^FSCRYPT_/ || + $2 ~ /^DM_/ || $2 ~ /^GRND_/ || $2 ~ /^RND/ || $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || diff --git a/vendor/golang.org/x/sys/unix/mkmerge.go b/vendor/golang.org/x/sys/unix/mkmerge.go deleted file mode 100644 index 8bde4501..00000000 --- a/vendor/golang.org/x/sys/unix/mkmerge.go +++ /dev/null @@ -1,521 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// mkmerge.go parses generated source files and merges common -// consts, funcs, and types into a common source file, per GOOS. -// -// Usage: -// $ go run mkmerge.go -out MERGED FILE [FILE ...] -// -// Example: -// # Remove all common consts, funcs, and types from zerrors_linux_*.go -// # and write the common code into zerrors_linux.go -// $ go run mkmerge.go -out zerrors_linux.go zerrors_linux_*.go -// -// mkmerge.go performs the merge in the following steps: -// 1. Construct the set of common code that is idential in all -// architecture-specific files. -// 2. Write this common code to the merged file. -// 3. Remove the common code from all architecture-specific files. -package main - -import ( - "bufio" - "bytes" - "flag" - "fmt" - "go/ast" - "go/format" - "go/parser" - "go/token" - "io" - "io/ioutil" - "log" - "os" - "path" - "path/filepath" - "regexp" - "strconv" - "strings" -) - -const validGOOS = "aix|darwin|dragonfly|freebsd|linux|netbsd|openbsd|solaris" - -// getValidGOOS returns GOOS, true if filename ends with a valid "_GOOS.go" -func getValidGOOS(filename string) (string, bool) { - matches := regexp.MustCompile(`_(` + validGOOS + `)\.go$`).FindStringSubmatch(filename) - if len(matches) != 2 { - return "", false - } - return matches[1], true -} - -// codeElem represents an ast.Decl in a comparable way. -type codeElem struct { - tok token.Token // e.g. token.CONST, token.TYPE, or token.FUNC - src string // the declaration formatted as source code -} - -// newCodeElem returns a codeElem based on tok and node, or an error is returned. -func newCodeElem(tok token.Token, node ast.Node) (codeElem, error) { - var b strings.Builder - err := format.Node(&b, token.NewFileSet(), node) - if err != nil { - return codeElem{}, err - } - return codeElem{tok, b.String()}, nil -} - -// codeSet is a set of codeElems -type codeSet struct { - set map[codeElem]bool // true for all codeElems in the set -} - -// newCodeSet returns a new codeSet -func newCodeSet() *codeSet { return &codeSet{make(map[codeElem]bool)} } - -// add adds elem to c -func (c *codeSet) add(elem codeElem) { c.set[elem] = true } - -// has returns true if elem is in c -func (c *codeSet) has(elem codeElem) bool { return c.set[elem] } - -// isEmpty returns true if the set is empty -func (c *codeSet) isEmpty() bool { return len(c.set) == 0 } - -// intersection returns a new set which is the intersection of c and a -func (c *codeSet) intersection(a *codeSet) *codeSet { - res := newCodeSet() - - for elem := range c.set { - if a.has(elem) { - res.add(elem) - } - } - return res -} - -// keepCommon is a filterFn for filtering the merged file with common declarations. -func (c *codeSet) keepCommon(elem codeElem) bool { - switch elem.tok { - case token.VAR: - // Remove all vars from the merged file - return false - case token.CONST, token.TYPE, token.FUNC, token.COMMENT: - // Remove arch-specific consts, types, functions, and file-level comments from the merged file - return c.has(elem) - case token.IMPORT: - // Keep imports, they are handled by filterImports - return true - } - - log.Fatalf("keepCommon: invalid elem %v", elem) - return true -} - -// keepArchSpecific is a filterFn for filtering the GOARC-specific files. -func (c *codeSet) keepArchSpecific(elem codeElem) bool { - switch elem.tok { - case token.CONST, token.TYPE, token.FUNC: - // Remove common consts, types, or functions from the arch-specific file - return !c.has(elem) - } - return true -} - -// srcFile represents a source file -type srcFile struct { - name string - src []byte -} - -// filterFn is a helper for filter -type filterFn func(codeElem) bool - -// filter parses and filters Go source code from src, removing top -// level declarations using keep as predicate. -// For src parameter, please see docs for parser.ParseFile. -func filter(src interface{}, keep filterFn) ([]byte, error) { - // Parse the src into an ast - fset := token.NewFileSet() - f, err := parser.ParseFile(fset, "", src, parser.ParseComments) - if err != nil { - return nil, err - } - cmap := ast.NewCommentMap(fset, f, f.Comments) - - // Group const/type specs on adjacent lines - var groups specGroups = make(map[string]int) - var groupID int - - decls := f.Decls - f.Decls = f.Decls[:0] - for _, decl := range decls { - switch decl := decl.(type) { - case *ast.GenDecl: - // Filter imports, consts, types, vars - specs := decl.Specs - decl.Specs = decl.Specs[:0] - for i, spec := range specs { - elem, err := newCodeElem(decl.Tok, spec) - if err != nil { - return nil, err - } - - // Create new group if there are empty lines between this and the previous spec - if i > 0 && fset.Position(specs[i-1].End()).Line < fset.Position(spec.Pos()).Line-1 { - groupID++ - } - - // Check if we should keep this spec - if keep(elem) { - decl.Specs = append(decl.Specs, spec) - groups.add(elem.src, groupID) - } - } - // Check if we should keep this decl - if len(decl.Specs) > 0 { - f.Decls = append(f.Decls, decl) - } - case *ast.FuncDecl: - // Filter funcs - elem, err := newCodeElem(token.FUNC, decl) - if err != nil { - return nil, err - } - if keep(elem) { - f.Decls = append(f.Decls, decl) - } - } - } - - // Filter file level comments - if cmap[f] != nil { - commentGroups := cmap[f] - cmap[f] = cmap[f][:0] - for _, cGrp := range commentGroups { - if keep(codeElem{token.COMMENT, cGrp.Text()}) { - cmap[f] = append(cmap[f], cGrp) - } - } - } - f.Comments = cmap.Filter(f).Comments() - - // Generate code for the filtered ast - var buf bytes.Buffer - if err = format.Node(&buf, fset, f); err != nil { - return nil, err - } - - groupedSrc, err := groups.filterEmptyLines(&buf) - if err != nil { - return nil, err - } - - return filterImports(groupedSrc) -} - -// getCommonSet returns the set of consts, types, and funcs that are present in every file. -func getCommonSet(files []srcFile) (*codeSet, error) { - if len(files) == 0 { - return nil, fmt.Errorf("no files provided") - } - // Use the first architecture file as the baseline - baseSet, err := getCodeSet(files[0].src) - if err != nil { - return nil, err - } - - // Compare baseline set with other architecture files: discard any element, - // that doesn't exist in other architecture files. - for _, f := range files[1:] { - set, err := getCodeSet(f.src) - if err != nil { - return nil, err - } - - baseSet = baseSet.intersection(set) - } - return baseSet, nil -} - -// getCodeSet returns the set of all top-level consts, types, and funcs from src. -// src must be string, []byte, or io.Reader (see go/parser.ParseFile docs) -func getCodeSet(src interface{}) (*codeSet, error) { - set := newCodeSet() - - fset := token.NewFileSet() - f, err := parser.ParseFile(fset, "", src, parser.ParseComments) - if err != nil { - return nil, err - } - - for _, decl := range f.Decls { - switch decl := decl.(type) { - case *ast.GenDecl: - // Add const, and type declarations - if !(decl.Tok == token.CONST || decl.Tok == token.TYPE) { - break - } - - for _, spec := range decl.Specs { - elem, err := newCodeElem(decl.Tok, spec) - if err != nil { - return nil, err - } - - set.add(elem) - } - case *ast.FuncDecl: - // Add func declarations - elem, err := newCodeElem(token.FUNC, decl) - if err != nil { - return nil, err - } - - set.add(elem) - } - } - - // Add file level comments - cmap := ast.NewCommentMap(fset, f, f.Comments) - for _, cGrp := range cmap[f] { - set.add(codeElem{token.COMMENT, cGrp.Text()}) - } - - return set, nil -} - -// importName returns the identifier (PackageName) for an imported package -func importName(iSpec *ast.ImportSpec) (string, error) { - if iSpec.Name == nil { - name, err := strconv.Unquote(iSpec.Path.Value) - if err != nil { - return "", err - } - return path.Base(name), nil - } - return iSpec.Name.Name, nil -} - -// specGroups tracks grouped const/type specs with a map of line: groupID pairs -type specGroups map[string]int - -// add spec source to group -func (s specGroups) add(src string, groupID int) error { - srcBytes, err := format.Source(bytes.TrimSpace([]byte(src))) - if err != nil { - return err - } - s[string(srcBytes)] = groupID - return nil -} - -// filterEmptyLines removes empty lines within groups of const/type specs. -// Returns the filtered source. -func (s specGroups) filterEmptyLines(src io.Reader) ([]byte, error) { - scanner := bufio.NewScanner(src) - var out bytes.Buffer - - var emptyLines bytes.Buffer - prevGroupID := -1 // Initialize to invalid group - for scanner.Scan() { - line := bytes.TrimSpace(scanner.Bytes()) - - if len(line) == 0 { - fmt.Fprintf(&emptyLines, "%s\n", scanner.Bytes()) - continue - } - - // Discard emptyLines if previous non-empty line belonged to the same - // group as this line - if src, err := format.Source(line); err == nil { - groupID, ok := s[string(src)] - if ok && groupID == prevGroupID { - emptyLines.Reset() - } - prevGroupID = groupID - } - - emptyLines.WriteTo(&out) - fmt.Fprintf(&out, "%s\n", scanner.Bytes()) - } - if err := scanner.Err(); err != nil { - return nil, err - } - return out.Bytes(), nil -} - -// filterImports removes unused imports from fileSrc, and returns a formatted src. -func filterImports(fileSrc []byte) ([]byte, error) { - fset := token.NewFileSet() - file, err := parser.ParseFile(fset, "", fileSrc, parser.ParseComments) - if err != nil { - return nil, err - } - cmap := ast.NewCommentMap(fset, file, file.Comments) - - // create set of references to imported identifiers - keepImport := make(map[string]bool) - for _, u := range file.Unresolved { - keepImport[u.Name] = true - } - - // filter import declarations - decls := file.Decls - file.Decls = file.Decls[:0] - for _, decl := range decls { - importDecl, ok := decl.(*ast.GenDecl) - - // Keep non-import declarations - if !ok || importDecl.Tok != token.IMPORT { - file.Decls = append(file.Decls, decl) - continue - } - - // Filter the import specs - specs := importDecl.Specs - importDecl.Specs = importDecl.Specs[:0] - for _, spec := range specs { - iSpec := spec.(*ast.ImportSpec) - name, err := importName(iSpec) - if err != nil { - return nil, err - } - - if keepImport[name] { - importDecl.Specs = append(importDecl.Specs, iSpec) - } - } - if len(importDecl.Specs) > 0 { - file.Decls = append(file.Decls, importDecl) - } - } - - // filter file.Imports - imports := file.Imports - file.Imports = file.Imports[:0] - for _, spec := range imports { - name, err := importName(spec) - if err != nil { - return nil, err - } - - if keepImport[name] { - file.Imports = append(file.Imports, spec) - } - } - file.Comments = cmap.Filter(file).Comments() - - var buf bytes.Buffer - err = format.Node(&buf, fset, file) - if err != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -// merge extracts duplicate code from archFiles and merges it to mergeFile. -// 1. Construct commonSet: the set of code that is idential in all archFiles. -// 2. Write the code in commonSet to mergedFile. -// 3. Remove the commonSet code from all archFiles. -func merge(mergedFile string, archFiles ...string) error { - // extract and validate the GOOS part of the merged filename - goos, ok := getValidGOOS(mergedFile) - if !ok { - return fmt.Errorf("invalid GOOS in merged file name %s", mergedFile) - } - - // Read architecture files - var inSrc []srcFile - for _, file := range archFiles { - src, err := ioutil.ReadFile(file) - if err != nil { - return fmt.Errorf("cannot read archfile %s: %w", file, err) - } - - inSrc = append(inSrc, srcFile{file, src}) - } - - // 1. Construct the set of top-level declarations common for all files - commonSet, err := getCommonSet(inSrc) - if err != nil { - return err - } - if commonSet.isEmpty() { - // No common code => do not modify any files - return nil - } - - // 2. Write the merged file - mergedSrc, err := filter(inSrc[0].src, commonSet.keepCommon) - if err != nil { - return err - } - - f, err := os.Create(mergedFile) - if err != nil { - return err - } - - buf := bufio.NewWriter(f) - fmt.Fprintln(buf, "// Code generated by mkmerge.go; DO NOT EDIT.") - fmt.Fprintln(buf) - fmt.Fprintf(buf, "// +build %s\n", goos) - fmt.Fprintln(buf) - buf.Write(mergedSrc) - - err = buf.Flush() - if err != nil { - return err - } - err = f.Close() - if err != nil { - return err - } - - // 3. Remove duplicate declarations from the architecture files - for _, inFile := range inSrc { - src, err := filter(inFile.src, commonSet.keepArchSpecific) - if err != nil { - return err - } - err = ioutil.WriteFile(inFile.name, src, 0644) - if err != nil { - return err - } - } - return nil -} - -func main() { - var mergedFile string - flag.StringVar(&mergedFile, "out", "", "Write merged code to `FILE`") - flag.Parse() - - // Expand wildcards - var filenames []string - for _, arg := range flag.Args() { - matches, err := filepath.Glob(arg) - if err != nil { - fmt.Fprintf(os.Stderr, "Invalid command line argument %q: %v\n", arg, err) - os.Exit(1) - } - filenames = append(filenames, matches...) - } - - if len(filenames) < 2 { - // No need to merge - return - } - - err := merge(mergedFile, filenames...) - if err != nil { - fmt.Fprintf(os.Stderr, "Merge failed with error: %v\n", err) - os.Exit(1) - } -} diff --git a/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/golang.org/x/sys/unix/mkpost.go deleted file mode 100644 index 5ee1a16b..00000000 --- a/vendor/golang.org/x/sys/unix/mkpost.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// mkpost processes the output of cgo -godefs to -// modify the generated types. It is used to clean up -// the sys API in an architecture specific manner. -// -// mkpost is run after cgo -godefs; see README.md. -package main - -import ( - "bytes" - "fmt" - "go/format" - "io/ioutil" - "log" - "os" - "regexp" -) - -func main() { - // Get the OS and architecture (using GOARCH_TARGET if it exists) - goos := os.Getenv("GOOS") - goarch := os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - // Check that we are using the Docker-based build system if we should be. - if goos == "linux" { - if os.Getenv("GOLANG_SYS_BUILD") != "docker" { - os.Stderr.WriteString("In the Docker-based build system, mkpost should not be called directly.\n") - os.Stderr.WriteString("See README.md\n") - os.Exit(1) - } - } - - b, err := ioutil.ReadAll(os.Stdin) - if err != nil { - log.Fatal(err) - } - - if goos == "aix" { - // Replace type of Atim, Mtim and Ctim by Timespec in Stat_t - // to avoid having both StTimespec and Timespec. - sttimespec := regexp.MustCompile(`_Ctype_struct_st_timespec`) - b = sttimespec.ReplaceAll(b, []byte("Timespec")) - } - - // Intentionally export __val fields in Fsid and Sigset_t - valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__(bits|val)(\s+\S+\s+)}`) - b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$4}")) - - // Intentionally export __fds_bits field in FdSet - fdSetRegex := regexp.MustCompile(`type (FdSet) struct {(\s+)X__fds_bits(\s+\S+\s+)}`) - b = fdSetRegex.ReplaceAll(b, []byte("type $1 struct {${2}Bits$3}")) - - // If we have empty Ptrace structs, we should delete them. Only s390x emits - // nonempty Ptrace structs. - ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) - b = ptraceRexexp.ReplaceAll(b, nil) - - // Replace the control_regs union with a blank identifier for now. - controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`) - b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64")) - - // Remove fields that are added by glibc - // Note that this is unstable as the identifers are private. - removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`) - b = removeFieldsRegex.ReplaceAll(b, []byte("_")) - - // Convert [65]int8 to [65]byte in Utsname members to simplify - // conversion to string; see golang.org/issue/20753 - convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) - b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) - - // Convert [n]int8 to [n]byte in Statvfs_t members to simplify - // conversion to string. - convertStatvfsRegex := regexp.MustCompile(`((Fstype|Mnton|Mntfrom)name)(\s+)\[(\d+)\]int8`) - b = convertStatvfsRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) - - // Convert [1024]int8 to [1024]byte in Ptmget members - convertPtmget := regexp.MustCompile(`([SC]n)(\s+)\[(\d+)\]u?int8`) - b = convertPtmget.ReplaceAll(b, []byte("$1[$3]byte")) - - // Remove spare fields (e.g. in Statx_t) - spareFieldsRegex := regexp.MustCompile(`X__spare\S*`) - b = spareFieldsRegex.ReplaceAll(b, []byte("_")) - - // Remove cgo padding fields - removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`) - b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_")) - - // Remove padding, hidden, or unused fields - removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`) - b = removeFieldsRegex.ReplaceAll(b, []byte("_")) - - // Remove the first line of warning from cgo - b = b[bytes.IndexByte(b, '\n')+1:] - // Modify the command in the header to include: - // mkpost, our own warning, and a build tag. - replacement := fmt.Sprintf(`$1 | go run mkpost.go -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s,%s`, goarch, goos) - cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) - b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) - - // Rename Stat_t time fields - if goos == "freebsd" && goarch == "386" { - // Hide Stat_t.[AMCB]tim_ext fields - renameStatTimeExtFieldsRegex := regexp.MustCompile(`[AMCB]tim_ext`) - b = renameStatTimeExtFieldsRegex.ReplaceAll(b, []byte("_")) - } - renameStatTimeFieldsRegex := regexp.MustCompile(`([AMCB])(?:irth)?time?(?:spec)?\s+(Timespec|StTimespec)`) - b = renameStatTimeFieldsRegex.ReplaceAll(b, []byte("${1}tim ${2}")) - - // gofmt - b, err = format.Source(b) - if err != nil { - log.Fatal(err) - } - - os.Stdout.Write(b) -} diff --git a/vendor/golang.org/x/sys/unix/mksyscall.go b/vendor/golang.org/x/sys/unix/mksyscall.go deleted file mode 100644 index 9e540cc8..00000000 --- a/vendor/golang.org/x/sys/unix/mksyscall.go +++ /dev/null @@ -1,402 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -This program reads a file containing function prototypes -(like syscall_darwin.go) and generates system call bodies. -The prototypes are marked by lines beginning with "//sys" -and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named errno. - -A line beginning with //sysnb is like //sys, except that the -goroutine will not be suspended during the execution of the system -call. This must only be used for system calls which can never -block, as otherwise the system call could cause all goroutines to -hang. -*/ -package main - -import ( - "bufio" - "flag" - "fmt" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - plan9 = flag.Bool("plan9", false, "plan9") - openbsd = flag.Bool("openbsd", false, "openbsd") - netbsd = flag.Bool("netbsd", false, "netbsd") - dragonfly = flag.Bool("dragonfly", false, "dragonfly") - arm = flag.Bool("arm", false, "arm") // 64-bit value should use (even, odd)-pair - tags = flag.String("tags", "", "build tags") - filename = flag.String("output", "", "output file name (standard output if omitted)") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - // Get the OS and architecture (using GOARCH_TARGET if it exists) - goos := os.Getenv("GOOS") - if goos == "" { - fmt.Fprintln(os.Stderr, "GOOS not defined in environment") - os.Exit(1) - } - goarch := os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - - // Check that we are using the Docker-based build system if we should - if goos == "linux" { - if os.Getenv("GOLANG_SYS_BUILD") != "docker" { - fmt.Fprintf(os.Stderr, "In the Docker-based build system, mksyscall should not be called directly.\n") - fmt.Fprintf(os.Stderr, "See README.md\n") - os.Exit(1) - } - } - - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - libc := false - if goos == "darwin" && (strings.Contains(buildTags(), ",go1.12") || strings.Contains(buildTags(), ",go1.13")) { - libc = true - } - trampolines := map[string]bool{} - - text := "" - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, errno error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, sysname := f[2], f[3], f[4], f[5] - - // ClockGettime doesn't have a syscall number on Darwin, only generate libc wrappers. - if goos == "darwin" && !libc && funct == "ClockGettime" { - continue - } - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - - // Go function header. - outDecl := "" - if len(out) > 0 { - outDecl = fmt.Sprintf(" (%s)", strings.Join(out, ", ")) - } - text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outDecl) - - // Check if err return available - errvar := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - break - } - } - - // Prepare arguments to Syscall. - var args []string - n := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") - } else if p.Type == "string" && errvar != "" { - text += fmt.Sprintf("\tvar _p%d *byte\n", n) - text += fmt.Sprintf("\t_p%d, %s = BytePtrFromString(%s)\n", n, errvar, p.Name) - text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - text += fmt.Sprintf("\tvar _p%d *byte\n", n) - text += fmt.Sprintf("\t_p%d, _ = BytePtrFromString(%s)\n", n, p.Name) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass dummy pointer in that case. - // Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). - text += fmt.Sprintf("\tvar _p%d unsafe.Pointer\n", n) - text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = unsafe.Pointer(&%s[0])\n\t}", p.Name, n, p.Name) - text += fmt.Sprintf(" else {\n\t\t_p%d = unsafe.Pointer(&_zero)\n\t}\n", n) - args = append(args, fmt.Sprintf("uintptr(_p%d)", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) - n++ - } else if p.Type == "int64" && (*openbsd || *netbsd) { - args = append(args, "0") - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else if endianness == "little-endian" { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } else if p.Type == "int64" && *dragonfly { - if regexp.MustCompile(`^(?i)extp(read|write)`).FindStringSubmatch(funct) == nil { - args = append(args, "0") - } - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else if endianness == "little-endian" { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } else if (p.Type == "int64" || p.Type == "uint64") && endianness != "" { - if len(args)%2 == 1 && *arm { - // arm abi specifies 64-bit argument uses - // (even, odd) pair - args = append(args, "0") - } - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } - - // Determine which form to use; pad args with zeros. - asm := "Syscall" - if nonblock != nil { - if errvar == "" && goos == "linux" { - asm = "RawSyscallNoError" - } else { - asm = "RawSyscall" - } - } else { - if errvar == "" && goos == "linux" { - asm = "SyscallNoError" - } - } - if len(args) <= 3 { - for len(args) < 3 { - args = append(args, "0") - } - } else if len(args) <= 6 { - asm += "6" - for len(args) < 6 { - args = append(args, "0") - } - } else if len(args) <= 9 { - asm += "9" - for len(args) < 9 { - args = append(args, "0") - } - } else { - fmt.Fprintf(os.Stderr, "%s:%s too many arguments to system call\n", path, funct) - } - - // System call number. - if sysname == "" { - sysname = "SYS_" + funct - sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) - sysname = strings.ToUpper(sysname) - } - - var libcFn string - if libc { - asm = "syscall_" + strings.ToLower(asm[:1]) + asm[1:] // internal syscall call - sysname = strings.TrimPrefix(sysname, "SYS_") // remove SYS_ - sysname = strings.ToLower(sysname) // lowercase - libcFn = sysname - sysname = "funcPC(libc_" + sysname + "_trampoline)" - } - - // Actual call. - arglist := strings.Join(args, ", ") - call := fmt.Sprintf("%s(%s, %s)", asm, sysname, arglist) - - // Assign return values. - body := "" - ret := []string{"_", "_", "_"} - doErrno := false - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" && !*plan9 { - reg = "e1" - ret[2] = reg - doErrno = true - } else if p.Name == "err" && *plan9 { - ret[0] = "r0" - ret[2] = "e1" - break - } else { - reg = fmt.Sprintf("r%d", i) - ret[i] = reg - } - if p.Type == "bool" { - reg = fmt.Sprintf("%s != 0", reg) - } - if p.Type == "int64" && endianness != "" { - // 64-bit number in r1:r0 or r0:r1. - if i+2 > len(out) { - fmt.Fprintf(os.Stderr, "%s:%s not enough registers for int64 return\n", path, funct) - } - if endianness == "big-endian" { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) - } else { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) - } - ret[i] = fmt.Sprintf("r%d", i) - ret[i+1] = fmt.Sprintf("r%d", i+1) - } - if reg != "e1" || *plan9 { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { - text += fmt.Sprintf("\t%s\n", call) - } else { - if errvar == "" && goos == "linux" { - // raw syscall without error on Linux, see golang.org/issue/22924 - text += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], call) - } else { - text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) - } - } - text += body - - if *plan9 && ret[2] == "e1" { - text += "\tif int32(r0) == -1 {\n" - text += "\t\terr = e1\n" - text += "\t}\n" - } else if doErrno { - text += "\tif e1 != 0 {\n" - text += "\t\terr = errnoErr(e1)\n" - text += "\t}\n" - } - text += "\treturn\n" - text += "}\n\n" - - if libc && !trampolines[libcFn] { - // some system calls share a trampoline, like read and readlen. - trampolines[libcFn] = true - // Declare assembly trampoline. - text += fmt.Sprintf("func libc_%s_trampoline()\n", libcFn) - // Assembly trampoline calls the libc_* function, which this magic - // redirects to use the function from libSystem. - text += fmt.Sprintf("//go:linkname libc_%s libc_%s\n", libcFn, libcFn) - text += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"/usr/lib/libSystem.B.dylib\"\n", libcFn, libcFn) - text += "\n" - } - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - fmt.Printf(srcTemplate, cmdLine(), buildTags(), text) -} - -const srcTemplate = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package unix - -import ( - "syscall" - "unsafe" -) - -var _ syscall.Errno - -%s -` diff --git a/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go deleted file mode 100644 index 3be3cdfc..00000000 --- a/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -This program reads a file containing function prototypes -(like syscall_aix.go) and generates system call bodies. -The prototypes are marked by lines beginning with "//sys" -and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named err. - * If go func name needs to be different than its libc name, - * or the function is not in libc, name could be specified - * at the end, after "=" sign, like - //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt -*/ -package main - -import ( - "bufio" - "flag" - "fmt" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - aix = flag.Bool("aix", false, "aix") - tags = flag.String("tags", "", "build tags") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall_aix_ppc.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - pack := "" - text := "" - cExtern := "/*\n#include \n#include \n" - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { - pack = p[1] - } - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, err error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - inps = strings.Join(in, ", ") - outps = strings.Join(out, ", ") - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - - // Check if value return, err return available - errvar := "" - retvar := "" - rettype := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - } else { - retvar = p.Name - rettype = p.Type - } - } - - // System call name. - if sysname == "" { - sysname = funct - } - sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) - sysname = strings.ToLower(sysname) // All libc functions are lowercase. - - cRettype := "" - if rettype == "unsafe.Pointer" { - cRettype = "uintptr_t" - } else if rettype == "uintptr" { - cRettype = "uintptr_t" - } else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { - cRettype = "uintptr_t" - } else if rettype == "int" { - cRettype = "int" - } else if rettype == "int32" { - cRettype = "int" - } else if rettype == "int64" { - cRettype = "long long" - } else if rettype == "uint32" { - cRettype = "unsigned int" - } else if rettype == "uint64" { - cRettype = "unsigned long long" - } else { - cRettype = "int" - } - if sysname == "exit" { - cRettype = "void" - } - - // Change p.Types to c - var cIn []string - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "string" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t", "size_t") - } else if p.Type == "unsafe.Pointer" { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "uintptr" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "int" { - cIn = append(cIn, "int") - } else if p.Type == "int32" { - cIn = append(cIn, "int") - } else if p.Type == "int64" { - cIn = append(cIn, "long long") - } else if p.Type == "uint32" { - cIn = append(cIn, "unsigned int") - } else if p.Type == "uint64" { - cIn = append(cIn, "unsigned long long") - } else { - cIn = append(cIn, "int") - } - } - - if funct != "fcntl" && funct != "FcntlInt" && funct != "readlen" && funct != "writelen" { - if sysname == "select" { - // select is a keyword of Go. Its name is - // changed to c_select. - cExtern += "#define c_select select\n" - } - // Imports of system calls from libc - cExtern += fmt.Sprintf("%s %s", cRettype, sysname) - cIn := strings.Join(cIn, ", ") - cExtern += fmt.Sprintf("(%s);\n", cIn) - } - - // So file name. - if *aix { - if modname == "" { - modname = "libc.a/shr_64.o" - } else { - fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) - os.Exit(1) - } - } - - strconvfunc := "C.CString" - - // Go function header. - if outps != "" { - outps = fmt.Sprintf(" (%s)", outps) - } - if text != "" { - text += "\n" - } - - text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) - - // Prepare arguments to Syscall. - var args []string - n := 0 - argN := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - args = append(args, "C.uintptr_t(uintptr(unsafe.Pointer("+p.Name+")))") - } else if p.Type == "string" && errvar != "" { - text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) - args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) - args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass nil in that case. - text += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) - text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) - args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(unsafe.Pointer(_p%d)))", n)) - n++ - text += fmt.Sprintf("\tvar _p%d int\n", n) - text += fmt.Sprintf("\t_p%d = len(%s)\n", n, p.Name) - args = append(args, fmt.Sprintf("C.size_t(_p%d)", n)) - n++ - } else if p.Type == "int64" && endianness != "" { - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } - n++ - } else if p.Type == "bool" { - text += fmt.Sprintf("\tvar _p%d uint32\n", n) - text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) - args = append(args, fmt.Sprintf("_p%d", n)) - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { - args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) - } else if p.Type == "unsafe.Pointer" { - args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) - } else if p.Type == "int" { - if (argN == 2) && ((funct == "readlen") || (funct == "writelen")) { - args = append(args, fmt.Sprintf("C.size_t(%s)", p.Name)) - } else if argN == 0 && funct == "fcntl" { - args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else if (argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt")) { - args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) - } - } else if p.Type == "int32" { - args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) - } else if p.Type == "int64" { - args = append(args, fmt.Sprintf("C.longlong(%s)", p.Name)) - } else if p.Type == "uint32" { - args = append(args, fmt.Sprintf("C.uint(%s)", p.Name)) - } else if p.Type == "uint64" { - args = append(args, fmt.Sprintf("C.ulonglong(%s)", p.Name)) - } else if p.Type == "uintptr" { - args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) - } - argN++ - } - - // Actual call. - arglist := strings.Join(args, ", ") - call := "" - if sysname == "exit" { - if errvar != "" { - call += "er :=" - } else { - call += "" - } - } else if errvar != "" { - call += "r0,er :=" - } else if retvar != "" { - call += "r0,_ :=" - } else { - call += "" - } - if sysname == "select" { - // select is a keyword of Go. Its name is - // changed to c_select. - call += fmt.Sprintf("C.c_%s(%s)", sysname, arglist) - } else { - call += fmt.Sprintf("C.%s(%s)", sysname, arglist) - } - - // Assign return values. - body := "" - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" { - reg = "e1" - } else { - reg = "r0" - } - if reg != "e1" { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - - // verify return - if sysname != "exit" && errvar != "" { - if regexp.MustCompile(`^uintptr`).FindStringSubmatch(cRettype) != nil { - body += "\tif (uintptr(r0) ==^uintptr(0) && er != nil) {\n" - body += fmt.Sprintf("\t\t%s = er\n", errvar) - body += "\t}\n" - } else { - body += "\tif (r0 ==-1 && er != nil) {\n" - body += fmt.Sprintf("\t\t%s = er\n", errvar) - body += "\t}\n" - } - } else if errvar != "" { - body += "\tif (er != nil) {\n" - body += fmt.Sprintf("\t\t%s = er\n", errvar) - body += "\t}\n" - } - - text += fmt.Sprintf("\t%s\n", call) - text += body - - text += "\treturn\n" - text += "}\n" - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - imp := "" - if pack != "unix" { - imp = "import \"golang.org/x/sys/unix\"\n" - - } - fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, cExtern, imp, text) -} - -const srcTemplate = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package %s - - -%s -*/ -import "C" -import ( - "unsafe" -) - - -%s - -%s -` diff --git a/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go deleted file mode 100644 index c9600995..00000000 --- a/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go +++ /dev/null @@ -1,614 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -This program reads a file containing function prototypes -(like syscall_aix.go) and generates system call bodies. -The prototypes are marked by lines beginning with "//sys" -and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named err. - * If go func name needs to be different than its libc name, - * or the function is not in libc, name could be specified - * at the end, after "=" sign, like - //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt - - -This program will generate three files and handle both gc and gccgo implementation: - - zsyscall_aix_ppc64.go: the common part of each implementation (error handler, pointer creation) - - zsyscall_aix_ppc64_gc.go: gc part with //go_cgo_import_dynamic and a call to syscall6 - - zsyscall_aix_ppc64_gccgo.go: gccgo part with C function and conversion to C type. - - The generated code looks like this - -zsyscall_aix_ppc64.go -func asyscall(...) (n int, err error) { - // Pointer Creation - r1, e1 := callasyscall(...) - // Type Conversion - // Error Handler - return -} - -zsyscall_aix_ppc64_gc.go -//go:cgo_import_dynamic libc_asyscall asyscall "libc.a/shr_64.o" -//go:linkname libc_asyscall libc_asyscall -var asyscall syscallFunc - -func callasyscall(...) (r1 uintptr, e1 Errno) { - r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_asyscall)), "nb_args", ... ) - return -} - -zsyscall_aix_ppc64_ggcgo.go - -// int asyscall(...) - -import "C" - -func callasyscall(...) (r1 uintptr, e1 Errno) { - r1 = uintptr(C.asyscall(...)) - e1 = syscall.GetErrno() - return -} -*/ - -package main - -import ( - "bufio" - "flag" - "fmt" - "io/ioutil" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - aix = flag.Bool("aix", false, "aix") - tags = flag.String("tags", "", "build tags") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall_aix_ppc64.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc64.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - pack := "" - // GCCGO - textgccgo := "" - cExtern := "/*\n#include \n" - // GC - textgc := "" - dynimports := "" - linknames := "" - var vars []string - // COMMON - textcommon := "" - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { - pack = p[1] - } - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, err error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - inps = strings.Join(in, ", ") - outps = strings.Join(out, ", ") - - if sysname == "" { - sysname = funct - } - - onlyCommon := false - if funct == "readlen" || funct == "writelen" || funct == "FcntlInt" || funct == "FcntlFlock" { - // This function call another syscall which is already implemented. - // Therefore, the gc and gccgo part must not be generated. - onlyCommon = true - } - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - - textcommon += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - if !onlyCommon { - textgccgo += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - textgc += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - } - - // Check if value return, err return available - errvar := "" - rettype := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - } else { - rettype = p.Type - } - } - - sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) - sysname = strings.ToLower(sysname) // All libc functions are lowercase. - - // GCCGO Prototype return type - cRettype := "" - if rettype == "unsafe.Pointer" { - cRettype = "uintptr_t" - } else if rettype == "uintptr" { - cRettype = "uintptr_t" - } else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { - cRettype = "uintptr_t" - } else if rettype == "int" { - cRettype = "int" - } else if rettype == "int32" { - cRettype = "int" - } else if rettype == "int64" { - cRettype = "long long" - } else if rettype == "uint32" { - cRettype = "unsigned int" - } else if rettype == "uint64" { - cRettype = "unsigned long long" - } else { - cRettype = "int" - } - if sysname == "exit" { - cRettype = "void" - } - - // GCCGO Prototype arguments type - var cIn []string - for i, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "string" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t", "size_t") - } else if p.Type == "unsafe.Pointer" { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "uintptr" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "int" { - if (i == 0 || i == 2) && funct == "fcntl" { - // These fcntl arguments needs to be uintptr to be able to call FcntlInt and FcntlFlock - cIn = append(cIn, "uintptr_t") - } else { - cIn = append(cIn, "int") - } - - } else if p.Type == "int32" { - cIn = append(cIn, "int") - } else if p.Type == "int64" { - cIn = append(cIn, "long long") - } else if p.Type == "uint32" { - cIn = append(cIn, "unsigned int") - } else if p.Type == "uint64" { - cIn = append(cIn, "unsigned long long") - } else { - cIn = append(cIn, "int") - } - } - - if !onlyCommon { - // GCCGO Prototype Generation - // Imports of system calls from libc - if sysname == "select" { - // select is a keyword of Go. Its name is - // changed to c_select. - cExtern += "#define c_select select\n" - } - cExtern += fmt.Sprintf("%s %s", cRettype, sysname) - cIn := strings.Join(cIn, ", ") - cExtern += fmt.Sprintf("(%s);\n", cIn) - } - // GC Library name - if modname == "" { - modname = "libc.a/shr_64.o" - } else { - fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) - os.Exit(1) - } - sysvarname := fmt.Sprintf("libc_%s", sysname) - - if !onlyCommon { - // GC Runtime import of function to allow cross-platform builds. - dynimports += fmt.Sprintf("//go:cgo_import_dynamic %s %s \"%s\"\n", sysvarname, sysname, modname) - // GC Link symbol to proc address variable. - linknames += fmt.Sprintf("//go:linkname %s %s\n", sysvarname, sysvarname) - // GC Library proc address variable. - vars = append(vars, sysvarname) - } - - strconvfunc := "BytePtrFromString" - strconvtype := "*byte" - - // Go function header. - if outps != "" { - outps = fmt.Sprintf(" (%s)", outps) - } - if textcommon != "" { - textcommon += "\n" - } - - textcommon += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) - - // Prepare arguments tocall. - var argscommon []string // Arguments in the common part - var argscall []string // Arguments for call prototype - var argsgc []string // Arguments for gc call (with syscall6) - var argsgccgo []string // Arguments for gccgo call (with C.name_of_syscall) - n := 0 - argN := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(%s))", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else if p.Type == "string" && errvar != "" { - textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) - textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - argscall = append(argscall, fmt.Sprintf("_p%d uintptr ", n)) - argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) - textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n)) - argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass nil in that case. - textcommon += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) - textcommon += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("len(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n), fmt.Sprintf("_lenp%d int", n)) - argsgc = append(argsgc, fmt.Sprintf("_p%d", n), fmt.Sprintf("uintptr(_lenp%d)", n)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n), fmt.Sprintf("C.size_t(_lenp%d)", n)) - n++ - } else if p.Type == "int64" && endianness != "" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses int64 with 32 bits mode. Case not yet implemented\n") - } else if p.Type == "bool" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses bool. Case not yet implemented\n") - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil || p.Type == "unsafe.Pointer" { - argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else if p.Type == "int" { - if (argN == 0 || argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt") || (funct == "FcntlFlock")) { - // These fcntl arguments need to be uintptr to be able to call FcntlInt and FcntlFlock - argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - - } else { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) - } - } else if p.Type == "int32" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s int32", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) - } else if p.Type == "int64" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s int64", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.longlong(%s)", p.Name)) - } else if p.Type == "uint32" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s uint32", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uint(%s)", p.Name)) - } else if p.Type == "uint64" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s uint64", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.ulonglong(%s)", p.Name)) - } else if p.Type == "uintptr" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else { - argscommon = append(argscommon, fmt.Sprintf("int(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) - } - argN++ - } - nargs := len(argsgc) - - // COMMON function generation - argscommonlist := strings.Join(argscommon, ", ") - callcommon := fmt.Sprintf("call%s(%s)", sysname, argscommonlist) - ret := []string{"_", "_"} - body := "" - doErrno := false - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" { - reg = "e1" - ret[1] = reg - doErrno = true - } else { - reg = "r0" - ret[0] = reg - } - if p.Type == "bool" { - reg = fmt.Sprintf("%s != 0", reg) - } - if reg != "e1" { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - if ret[0] == "_" && ret[1] == "_" { - textcommon += fmt.Sprintf("\t%s\n", callcommon) - } else { - textcommon += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], callcommon) - } - textcommon += body - - if doErrno { - textcommon += "\tif e1 != 0 {\n" - textcommon += "\t\terr = errnoErr(e1)\n" - textcommon += "\t}\n" - } - textcommon += "\treturn\n" - textcommon += "}\n" - - if onlyCommon { - continue - } - - // CALL Prototype - callProto := fmt.Sprintf("func call%s(%s) (r1 uintptr, e1 Errno) {\n", sysname, strings.Join(argscall, ", ")) - - // GC function generation - asm := "syscall6" - if nonblock != nil { - asm = "rawSyscall6" - } - - if len(argsgc) <= 6 { - for len(argsgc) < 6 { - argsgc = append(argsgc, "0") - } - } else { - fmt.Fprintf(os.Stderr, "%s: too many arguments to system call", funct) - os.Exit(1) - } - argsgclist := strings.Join(argsgc, ", ") - callgc := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, argsgclist) - - textgc += callProto - textgc += fmt.Sprintf("\tr1, _, e1 = %s\n", callgc) - textgc += "\treturn\n}\n" - - // GCCGO function generation - argsgccgolist := strings.Join(argsgccgo, ", ") - var callgccgo string - if sysname == "select" { - // select is a keyword of Go. Its name is - // changed to c_select. - callgccgo = fmt.Sprintf("C.c_%s(%s)", sysname, argsgccgolist) - } else { - callgccgo = fmt.Sprintf("C.%s(%s)", sysname, argsgccgolist) - } - textgccgo += callProto - textgccgo += fmt.Sprintf("\tr1 = uintptr(%s)\n", callgccgo) - textgccgo += "\te1 = syscall.GetErrno()\n" - textgccgo += "\treturn\n}\n" - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - imp := "" - if pack != "unix" { - imp = "import \"golang.org/x/sys/unix\"\n" - - } - - // Print zsyscall_aix_ppc64.go - err := ioutil.WriteFile("zsyscall_aix_ppc64.go", - []byte(fmt.Sprintf(srcTemplate1, cmdLine(), buildTags(), pack, imp, textcommon)), - 0644) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - - // Print zsyscall_aix_ppc64_gc.go - vardecls := "\t" + strings.Join(vars, ",\n\t") - vardecls += " syscallFunc" - err = ioutil.WriteFile("zsyscall_aix_ppc64_gc.go", - []byte(fmt.Sprintf(srcTemplate2, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, textgc)), - 0644) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - - // Print zsyscall_aix_ppc64_gccgo.go - err = ioutil.WriteFile("zsyscall_aix_ppc64_gccgo.go", - []byte(fmt.Sprintf(srcTemplate3, cmdLine(), buildTags(), pack, cExtern, imp, textgccgo)), - 0644) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } -} - -const srcTemplate1 = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package %s - -import ( - "unsafe" -) - - -%s - -%s -` -const srcTemplate2 = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s -// +build !gccgo - -package %s - -import ( - "unsafe" -) -%s -%s -%s -type syscallFunc uintptr - -var ( -%s -) - -// Implemented in runtime/syscall_aix.go. -func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) -func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) - -%s -` -const srcTemplate3 = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s -// +build gccgo - -package %s - -%s -*/ -import "C" -import ( - "syscall" -) - - -%s - -%s -` diff --git a/vendor/golang.org/x/sys/unix/mksyscall_solaris.go b/vendor/golang.org/x/sys/unix/mksyscall_solaris.go deleted file mode 100644 index 675597e4..00000000 --- a/vendor/golang.org/x/sys/unix/mksyscall_solaris.go +++ /dev/null @@ -1,341 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* - This program reads a file containing function prototypes - (like syscall_solaris.go) and generates system call bodies. - The prototypes are marked by lines beginning with "//sys" - and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named err. - * If go func name needs to be different than its libc name, - * or the function is not in libc, name could be specified - * at the end, after "=" sign, like - //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt -*/ - -package main - -import ( - "bufio" - "flag" - "fmt" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - tags = flag.String("tags", "", "build tags") - illumos = flag.Bool("illumos", false, "illumos specific code generation") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall_solaris.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall_solaris.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - pack := "" - text := "" - dynimports := "" - linknames := "" - var vars []string - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { - pack = p[1] - } - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, err error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - inps = strings.Join(in, ", ") - outps = strings.Join(out, ", ") - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - - // So file name. - if modname == "" { - modname = "libc" - } - - // System call name. - if sysname == "" { - sysname = funct - } - - // System call pointer variable name. - sysvarname := fmt.Sprintf("proc%s", sysname) - - strconvfunc := "BytePtrFromString" - strconvtype := "*byte" - - sysname = strings.ToLower(sysname) // All libc functions are lowercase. - - // Runtime import of function to allow cross-platform builds. - dynimports += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"%s.so\"\n", sysname, sysname, modname) - // Link symbol to proc address variable. - linknames += fmt.Sprintf("//go:linkname %s libc_%s\n", sysvarname, sysname) - // Library proc address variable. - vars = append(vars, sysvarname) - - // Go function header. - outlist := strings.Join(out, ", ") - if outlist != "" { - outlist = fmt.Sprintf(" (%s)", outlist) - } - if text != "" { - text += "\n" - } - text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outlist) - - // Check if err return available - errvar := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - continue - } - } - - // Prepare arguments to Syscall. - var args []string - n := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") - } else if p.Type == "string" && errvar != "" { - text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - text += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) - text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - text += fmt.Sprintf("\t_p%d, _ = %s(%s)\n", n, strconvfunc, p.Name) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if s := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); s != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass nil in that case. - text += fmt.Sprintf("\tvar _p%d *%s\n", n, s[1]) - text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) - n++ - } else if p.Type == "int64" && endianness != "" { - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } - } else if p.Type == "bool" { - text += fmt.Sprintf("\tvar _p%d uint32\n", n) - text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) - args = append(args, fmt.Sprintf("uintptr(_p%d)", n)) - n++ - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } - nargs := len(args) - - // Determine which form to use; pad args with zeros. - asm := "sysvicall6" - if nonblock != nil { - asm = "rawSysvicall6" - } - if len(args) <= 6 { - for len(args) < 6 { - args = append(args, "0") - } - } else { - fmt.Fprintf(os.Stderr, "%s: too many arguments to system call\n", path) - os.Exit(1) - } - - // Actual call. - arglist := strings.Join(args, ", ") - call := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, arglist) - - // Assign return values. - body := "" - ret := []string{"_", "_", "_"} - doErrno := false - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" { - reg = "e1" - ret[2] = reg - doErrno = true - } else { - reg = fmt.Sprintf("r%d", i) - ret[i] = reg - } - if p.Type == "bool" { - reg = fmt.Sprintf("%d != 0", reg) - } - if p.Type == "int64" && endianness != "" { - // 64-bit number in r1:r0 or r0:r1. - if i+2 > len(out) { - fmt.Fprintf(os.Stderr, "%s: not enough registers for int64 return\n", path) - os.Exit(1) - } - if endianness == "big-endian" { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) - } else { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) - } - ret[i] = fmt.Sprintf("r%d", i) - ret[i+1] = fmt.Sprintf("r%d", i+1) - } - if reg != "e1" { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { - text += fmt.Sprintf("\t%s\n", call) - } else { - text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) - } - text += body - - if doErrno { - text += "\tif e1 != 0 {\n" - text += "\t\terr = e1\n" - text += "\t}\n" - } - text += "\treturn\n" - text += "}\n" - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - imp := "" - if pack != "unix" { - imp = "import \"golang.org/x/sys/unix\"\n" - } - - syscallimp := "" - if !*illumos { - syscallimp = "\"syscall\"" - } - - vardecls := "\t" + strings.Join(vars, ",\n\t") - vardecls += " syscallFunc" - fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, syscallimp, imp, dynimports, linknames, vardecls, text) -} - -const srcTemplate = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package %s - -import ( - "unsafe" - %s -) -%s -%s -%s -var ( -%s -) - -%s -` diff --git a/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go b/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go deleted file mode 100644 index b6b40990..00000000 --- a/vendor/golang.org/x/sys/unix/mksysctl_openbsd.go +++ /dev/null @@ -1,355 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Parse the header files for OpenBSD and generate a Go usable sysctl MIB. -// -// Build a MIB with each entry being an array containing the level, type and -// a hash that will contain additional entries if the current entry is a node. -// We then walk this MIB and create a flattened sysctl name to OID hash. - -package main - -import ( - "bufio" - "fmt" - "os" - "path/filepath" - "regexp" - "sort" - "strings" -) - -var ( - goos, goarch string -) - -// cmdLine returns this programs's commandline arguments. -func cmdLine() string { - return "go run mksysctl_openbsd.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags. -func buildTags() string { - return fmt.Sprintf("%s,%s", goarch, goos) -} - -// reMatch performs regular expression match and stores the substring slice to value pointed by m. -func reMatch(re *regexp.Regexp, str string, m *[]string) bool { - *m = re.FindStringSubmatch(str) - if *m != nil { - return true - } - return false -} - -type nodeElement struct { - n int - t string - pE *map[string]nodeElement -} - -var ( - debugEnabled bool - mib map[string]nodeElement - node *map[string]nodeElement - nodeMap map[string]string - sysCtl []string -) - -var ( - ctlNames1RE = regexp.MustCompile(`^#define\s+(CTL_NAMES)\s+{`) - ctlNames2RE = regexp.MustCompile(`^#define\s+(CTL_(.*)_NAMES)\s+{`) - ctlNames3RE = regexp.MustCompile(`^#define\s+((.*)CTL_NAMES)\s+{`) - netInetRE = regexp.MustCompile(`^netinet/`) - netInet6RE = regexp.MustCompile(`^netinet6/`) - netRE = regexp.MustCompile(`^net/`) - bracesRE = regexp.MustCompile(`{.*}`) - ctlTypeRE = regexp.MustCompile(`{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}`) - fsNetKernRE = regexp.MustCompile(`^(fs|net|kern)_`) -) - -func debug(s string) { - if debugEnabled { - fmt.Fprintln(os.Stderr, s) - } -} - -// Walk the MIB and build a sysctl name to OID mapping. -func buildSysctl(pNode *map[string]nodeElement, name string, oid []int) { - lNode := pNode // local copy of pointer to node - var keys []string - for k := range *lNode { - keys = append(keys, k) - } - sort.Strings(keys) - - for _, key := range keys { - nodename := name - if name != "" { - nodename += "." - } - nodename += key - - nodeoid := append(oid, (*pNode)[key].n) - - if (*pNode)[key].t == `CTLTYPE_NODE` { - if _, ok := nodeMap[nodename]; ok { - lNode = &mib - ctlName := nodeMap[nodename] - for _, part := range strings.Split(ctlName, ".") { - lNode = ((*lNode)[part]).pE - } - } else { - lNode = (*pNode)[key].pE - } - buildSysctl(lNode, nodename, nodeoid) - } else if (*pNode)[key].t != "" { - oidStr := []string{} - for j := range nodeoid { - oidStr = append(oidStr, fmt.Sprintf("%d", nodeoid[j])) - } - text := "\t{ \"" + nodename + "\", []_C_int{ " + strings.Join(oidStr, ", ") + " } }, \n" - sysCtl = append(sysCtl, text) - } - } -} - -func main() { - // Get the OS (using GOOS_TARGET if it exist) - goos = os.Getenv("GOOS_TARGET") - if goos == "" { - goos = os.Getenv("GOOS") - } - // Get the architecture (using GOARCH_TARGET if it exists) - goarch = os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - // Check if GOOS and GOARCH environment variables are defined - if goarch == "" || goos == "" { - fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n") - os.Exit(1) - } - - mib = make(map[string]nodeElement) - headers := [...]string{ - `sys/sysctl.h`, - `sys/socket.h`, - `sys/tty.h`, - `sys/malloc.h`, - `sys/mount.h`, - `sys/namei.h`, - `sys/sem.h`, - `sys/shm.h`, - `sys/vmmeter.h`, - `uvm/uvmexp.h`, - `uvm/uvm_param.h`, - `uvm/uvm_swap_encrypt.h`, - `ddb/db_var.h`, - `net/if.h`, - `net/if_pfsync.h`, - `net/pipex.h`, - `netinet/in.h`, - `netinet/icmp_var.h`, - `netinet/igmp_var.h`, - `netinet/ip_ah.h`, - `netinet/ip_carp.h`, - `netinet/ip_divert.h`, - `netinet/ip_esp.h`, - `netinet/ip_ether.h`, - `netinet/ip_gre.h`, - `netinet/ip_ipcomp.h`, - `netinet/ip_ipip.h`, - `netinet/pim_var.h`, - `netinet/tcp_var.h`, - `netinet/udp_var.h`, - `netinet6/in6.h`, - `netinet6/ip6_divert.h`, - `netinet6/pim6_var.h`, - `netinet/icmp6.h`, - `netmpls/mpls.h`, - } - - ctls := [...]string{ - `kern`, - `vm`, - `fs`, - `net`, - //debug /* Special handling required */ - `hw`, - //machdep /* Arch specific */ - `user`, - `ddb`, - //vfs /* Special handling required */ - `fs.posix`, - `kern.forkstat`, - `kern.intrcnt`, - `kern.malloc`, - `kern.nchstats`, - `kern.seminfo`, - `kern.shminfo`, - `kern.timecounter`, - `kern.tty`, - `kern.watchdog`, - `net.bpf`, - `net.ifq`, - `net.inet`, - `net.inet.ah`, - `net.inet.carp`, - `net.inet.divert`, - `net.inet.esp`, - `net.inet.etherip`, - `net.inet.gre`, - `net.inet.icmp`, - `net.inet.igmp`, - `net.inet.ip`, - `net.inet.ip.ifq`, - `net.inet.ipcomp`, - `net.inet.ipip`, - `net.inet.mobileip`, - `net.inet.pfsync`, - `net.inet.pim`, - `net.inet.tcp`, - `net.inet.udp`, - `net.inet6`, - `net.inet6.divert`, - `net.inet6.ip6`, - `net.inet6.icmp6`, - `net.inet6.pim6`, - `net.inet6.tcp6`, - `net.inet6.udp6`, - `net.mpls`, - `net.mpls.ifq`, - `net.key`, - `net.pflow`, - `net.pfsync`, - `net.pipex`, - `net.rt`, - `vm.swapencrypt`, - //vfsgenctl /* Special handling required */ - } - - // Node name "fixups" - ctlMap := map[string]string{ - "ipproto": "net.inet", - "net.inet.ipproto": "net.inet", - "net.inet6.ipv6proto": "net.inet6", - "net.inet6.ipv6": "net.inet6.ip6", - "net.inet.icmpv6": "net.inet6.icmp6", - "net.inet6.divert6": "net.inet6.divert", - "net.inet6.tcp6": "net.inet.tcp", - "net.inet6.udp6": "net.inet.udp", - "mpls": "net.mpls", - "swpenc": "vm.swapencrypt", - } - - // Node mappings - nodeMap = map[string]string{ - "net.inet.ip.ifq": "net.ifq", - "net.inet.pfsync": "net.pfsync", - "net.mpls.ifq": "net.ifq", - } - - mCtls := make(map[string]bool) - for _, ctl := range ctls { - mCtls[ctl] = true - } - - for _, header := range headers { - debug("Processing " + header) - file, err := os.Open(filepath.Join("/usr/include", header)) - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - var sub []string - if reMatch(ctlNames1RE, s.Text(), &sub) || - reMatch(ctlNames2RE, s.Text(), &sub) || - reMatch(ctlNames3RE, s.Text(), &sub) { - if sub[1] == `CTL_NAMES` { - // Top level. - node = &mib - } else { - // Node. - nodename := strings.ToLower(sub[2]) - ctlName := "" - if reMatch(netInetRE, header, &sub) { - ctlName = "net.inet." + nodename - } else if reMatch(netInet6RE, header, &sub) { - ctlName = "net.inet6." + nodename - } else if reMatch(netRE, header, &sub) { - ctlName = "net." + nodename - } else { - ctlName = nodename - ctlName = fsNetKernRE.ReplaceAllString(ctlName, `$1.`) - } - - if val, ok := ctlMap[ctlName]; ok { - ctlName = val - } - if _, ok := mCtls[ctlName]; !ok { - debug("Ignoring " + ctlName + "...") - continue - } - - // Walk down from the top of the MIB. - node = &mib - for _, part := range strings.Split(ctlName, ".") { - if _, ok := (*node)[part]; !ok { - debug("Missing node " + part) - (*node)[part] = nodeElement{n: 0, t: "", pE: &map[string]nodeElement{}} - } - node = (*node)[part].pE - } - } - - // Populate current node with entries. - i := -1 - for !strings.HasPrefix(s.Text(), "}") { - s.Scan() - if reMatch(bracesRE, s.Text(), &sub) { - i++ - } - if !reMatch(ctlTypeRE, s.Text(), &sub) { - continue - } - (*node)[sub[1]] = nodeElement{n: i, t: sub[2], pE: &map[string]nodeElement{}} - } - } - } - err = s.Err() - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) - } - file.Close() - } - buildSysctl(&mib, "", []int{}) - - sort.Strings(sysCtl) - text := strings.Join(sysCtl, "") - - fmt.Printf(srcTemplate, cmdLine(), buildTags(), text) -} - -const srcTemplate = `// %s -// Code generated by the command above; DO NOT EDIT. - -// +build %s - -package unix - -type mibentry struct { - ctlname string - ctloid []_C_int -} - -var sysctlMib = []mibentry { -%s -} -` diff --git a/vendor/golang.org/x/sys/unix/mksysnum.go b/vendor/golang.org/x/sys/unix/mksysnum.go deleted file mode 100644 index baa6ecd8..00000000 --- a/vendor/golang.org/x/sys/unix/mksysnum.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Generate system call table for DragonFly, NetBSD, -// FreeBSD, OpenBSD or Darwin from master list -// (for example, /usr/src/sys/kern/syscalls.master or -// sys/syscall.h). -package main - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "regexp" - "strings" -) - -var ( - goos, goarch string -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksysnum.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return fmt.Sprintf("%s,%s", goarch, goos) -} - -func checkErr(err error) { - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) - } -} - -// source string and substring slice for regexp -type re struct { - str string // source string - sub []string // matched sub-string -} - -// Match performs regular expression match -func (r *re) Match(exp string) bool { - r.sub = regexp.MustCompile(exp).FindStringSubmatch(r.str) - if r.sub != nil { - return true - } - return false -} - -// fetchFile fetches a text file from URL -func fetchFile(URL string) io.Reader { - resp, err := http.Get(URL) - checkErr(err) - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - checkErr(err) - return strings.NewReader(string(body)) -} - -// readFile reads a text file from path -func readFile(path string) io.Reader { - file, err := os.Open(os.Args[1]) - checkErr(err) - return file -} - -func format(name, num, proto string) string { - name = strings.ToUpper(name) - // There are multiple entries for enosys and nosys, so comment them out. - nm := re{str: name} - if nm.Match(`^SYS_E?NOSYS$`) { - name = fmt.Sprintf("// %s", name) - } - if name == `SYS_SYS_EXIT` { - name = `SYS_EXIT` - } - return fmt.Sprintf(" %s = %s; // %s\n", name, num, proto) -} - -func main() { - // Get the OS (using GOOS_TARGET if it exist) - goos = os.Getenv("GOOS_TARGET") - if goos == "" { - goos = os.Getenv("GOOS") - } - // Get the architecture (using GOARCH_TARGET if it exists) - goarch = os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - // Check if GOOS and GOARCH environment variables are defined - if goarch == "" || goos == "" { - fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n") - os.Exit(1) - } - - file := strings.TrimSpace(os.Args[1]) - var syscalls io.Reader - if strings.HasPrefix(file, "https://") || strings.HasPrefix(file, "http://") { - // Download syscalls.master file - syscalls = fetchFile(file) - } else { - syscalls = readFile(file) - } - - var text, line string - s := bufio.NewScanner(syscalls) - for s.Scan() { - t := re{str: line} - if t.Match(`^(.*)\\$`) { - // Handle continuation - line = t.sub[1] - line += strings.TrimLeft(s.Text(), " \t") - } else { - // New line - line = s.Text() - } - t = re{str: line} - if t.Match(`\\$`) { - continue - } - t = re{str: line} - - switch goos { - case "dragonfly": - if t.Match(`^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$`) { - num, proto := t.sub[1], t.sub[2] - name := fmt.Sprintf("SYS_%s", t.sub[3]) - text += format(name, num, proto) - } - case "freebsd": - if t.Match(`^([0-9]+)\s+\S+\s+(?:(?:NO)?STD|COMPAT10)\s+({ \S+\s+(\w+).*)$`) { - num, proto := t.sub[1], t.sub[2] - name := fmt.Sprintf("SYS_%s", t.sub[3]) - text += format(name, num, proto) - } - case "openbsd": - if t.Match(`^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$`) { - num, proto, name := t.sub[1], t.sub[3], t.sub[4] - text += format(name, num, proto) - } - case "netbsd": - if t.Match(`^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$`) { - num, proto, compat := t.sub[1], t.sub[6], t.sub[8] - name := t.sub[7] + "_" + t.sub[9] - if t.sub[11] != "" { - name = t.sub[7] + "_" + t.sub[11] - } - name = strings.ToUpper(name) - if compat == "" || compat == "13" || compat == "30" || compat == "50" { - text += fmt.Sprintf(" %s = %s; // %s\n", name, num, proto) - } - } - case "darwin": - if t.Match(`^#define\s+SYS_(\w+)\s+([0-9]+)`) { - name, num := t.sub[1], t.sub[2] - name = strings.ToUpper(name) - text += fmt.Sprintf(" SYS_%s = %s;\n", name, num) - } - default: - fmt.Fprintf(os.Stderr, "unrecognized GOOS=%s\n", goos) - os.Exit(1) - - } - } - err := s.Err() - checkErr(err) - - fmt.Printf(template, cmdLine(), buildTags(), text) -} - -const template = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package unix - -const( -%s)` diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 027bcafd..5b3af2e6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -82,15 +82,6 @@ func IoctlRetInt(fd int, req uint) (int, error) { return int(ret), nil } -// IoctlSetPointerInt performs an ioctl operation which sets an -// integer value on fd, using the specified request number. The ioctl -// argument is called with a pointer to the integer value, rather than -// passing the integer value directly. -func IoctlSetPointerInt(fd int, req uint, value int) error { - v := int32(value) - return ioctl(fd, req, uintptr(unsafe.Pointer(&v))) -} - func IoctlSetRTCTime(fd int, value *RTCTime) error { err := ioctl(fd, RTC_SET_TIME, uintptr(unsafe.Pointer(value))) runtime.KeepAlive(value) @@ -885,6 +876,35 @@ func (sa *SockaddrL2TPIP6) sockaddr() (unsafe.Pointer, _Socklen, error) { return unsafe.Pointer(&sa.raw), SizeofSockaddrL2TPIP6, nil } +// SockaddrIUCV implements the Sockaddr interface for AF_IUCV sockets. +type SockaddrIUCV struct { + UserID string + Name string + raw RawSockaddrIUCV +} + +func (sa *SockaddrIUCV) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_IUCV + // These are EBCDIC encoded by the kernel, but we still need to pad them + // with blanks. Initializing with blanks allows the caller to feed in either + // a padded or an unpadded string. + for i := 0; i < 8; i++ { + sa.raw.Nodeid[i] = ' ' + sa.raw.User_id[i] = ' ' + sa.raw.Name[i] = ' ' + } + if len(sa.UserID) > 8 || len(sa.Name) > 8 { + return nil, 0, EINVAL + } + for i, b := range []byte(sa.UserID[:]) { + sa.raw.User_id[i] = int8(b) + } + for i, b := range []byte(sa.Name[:]) { + sa.raw.Name[i] = int8(b) + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrIUCV, nil +} + func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_NETLINK: @@ -1065,6 +1085,38 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { } return sa, nil + case AF_IUCV: + pp := (*RawSockaddrIUCV)(unsafe.Pointer(rsa)) + + var user [8]byte + var name [8]byte + + for i := 0; i < 8; i++ { + user[i] = byte(pp.User_id[i]) + name[i] = byte(pp.Name[i]) + } + + sa := &SockaddrIUCV{ + UserID: string(user[:]), + Name: string(name[:]), + } + return sa, nil + + case AF_CAN: + pp := (*RawSockaddrCAN)(unsafe.Pointer(rsa)) + sa := &SockaddrCAN{ + Ifindex: int(pp.Ifindex), + } + rx := (*[4]byte)(unsafe.Pointer(&sa.RxID)) + for i := 0; i < 4; i++ { + rx[i] = pp.Addr[i] + } + tx := (*[4]byte)(unsafe.Pointer(&sa.TxID)) + for i := 0; i < 4; i++ { + tx[i] = pp.Addr[i+4] + } + return sa, nil + } return nil, EAFNOSUPPORT } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index e1913e2c..496837b1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -7,7 +7,6 @@ package unix import ( - "syscall" "unsafe" ) @@ -49,10 +48,6 @@ func Pipe2(p []int, flags int) (err error) { return } -// Underlying system call writes to newoffset via pointer. -// Implemented in assembly to avoid allocation. -func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) - func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { newoffset, errno := seek(fd, offset, whence) if errno != 0 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go new file mode 100644 index 00000000..8c514c95 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go @@ -0,0 +1,13 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,!gccgo,linux + +package unix + +import "syscall" + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go new file mode 100644 index 00000000..30f28534 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go @@ -0,0 +1,35 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of OpenBSD the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/golang.org/x/sys/unix/types_aix.go b/vendor/golang.org/x/sys/unix/types_aix.go deleted file mode 100644 index 40d2beed..00000000 --- a/vendor/golang.org/x/sys/unix/types_aix.go +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore -// +build aix - -/* -Input to cgo -godefs. See also mkerrors.sh and mkall.sh -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - - -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong - PathMax = C.PATH_MAX -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -type off64 C.off64_t -type off C.off_t -type Mode_t C.mode_t - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -type Timex C.struct_timex - -type Time_t C.time_t - -type Tms C.struct_tms - -type Utimbuf C.struct_utimbuf - -type Timezone C.struct_timezone - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit64 - -type Pid_t C.pid_t - -type _Gid_t C.gid_t - -type dev_t C.dev_t - -// Files - -type Stat_t C.struct_stat - -type StatxTimestamp C.struct_statx_timestamp - -type Statx_t C.struct_statx - -type Dirent C.struct_dirent - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Cmsghdr C.struct_cmsghdr - -type ICMPv6Filter C.struct_icmp6_filter - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type Linger C.struct_linger - -type Msghdr C.struct_msghdr - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr -) - -type IfMsgHdr C.struct_if_msghdr - -// Misc - -type FdSet C.fd_set - -type Utsname C.struct_utsname - -type Ustat_t C.struct_ustat - -type Sigset_t C.sigset_t - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// Terminal handling - -type Termios C.struct_termios - -type Termio C.struct_termio - -type Winsize C.struct_winsize - -//poll - -type PollFd struct { - Fd int32 - Events uint16 - Revents uint16 -} - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -//flock_t - -type Flock_t C.struct_flock64 - -// Statfs - -type Fsid_t C.struct_fsid_t -type Fsid64_t C.struct_fsid64_t - -type Statfs_t C.struct_statfs - -const RNDGETENTCNT = 0x80045200 diff --git a/vendor/golang.org/x/sys/unix/types_darwin.go b/vendor/golang.org/x/sys/unix/types_darwin.go deleted file mode 100644 index 155c2e69..00000000 --- a/vendor/golang.org/x/sys/unix/types_darwin.go +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define __DARWIN_UNIX03 0 -#define KERNEL -#define _DARWIN_USE_64_BIT_INODE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat64 - -type Statfs_t C.struct_statfs64 - -type Flock_t C.struct_flock - -type Fstore_t C.struct_fstore - -type Radvisory_t C.struct_radvisory - -type Fbootstraptransfer_t C.struct_fbootstraptransfer - -type Log2phys_t C.struct_log2phys - -type Fsid C.struct_fsid - -type Dirent C.struct_dirent - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet4Pktinfo C.struct_in_pktinfo - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfmaMsghdr2 C.struct_ifma_msghdr2 - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// uname - -type Utsname C.struct_utsname - -// Clockinfo - -const SizeofClockinfo = C.sizeof_struct_clockinfo - -type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_dragonfly.go b/vendor/golang.org/x/sys/unix/types_dragonfly.go deleted file mode 100644 index 6574f6b6..00000000 --- a/vendor/golang.org/x/sys/unix/types_dragonfly.go +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.struct_fsid - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Uname - -type Utsname C.struct_utsname - -// Clockinfo - -const SizeofClockinfo = C.sizeof_struct_clockinfo - -type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_freebsd.go b/vendor/golang.org/x/sys/unix/types_freebsd.go deleted file mode 100644 index c6fde424..00000000 --- a/vendor/golang.org/x/sys/unix/types_freebsd.go +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define _WANT_FREEBSD11_STAT 1 -#define _WANT_FREEBSD11_STATFS 1 -#define _WANT_FREEBSD11_DIRENT 1 -#define _WANT_FREEBSD11_KEVENT 1 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -// This structure is a duplicate of if_data on FreeBSD 8-STABLE. -// See /usr/include/net/if.h. -struct if_data8 { - u_char ifi_type; - u_char ifi_physical; - u_char ifi_addrlen; - u_char ifi_hdrlen; - u_char ifi_link_state; - u_char ifi_spare_char1; - u_char ifi_spare_char2; - u_char ifi_datalen; - u_long ifi_mtu; - u_long ifi_metric; - u_long ifi_baudrate; - u_long ifi_ipackets; - u_long ifi_ierrors; - u_long ifi_opackets; - u_long ifi_oerrors; - u_long ifi_collisions; - u_long ifi_ibytes; - u_long ifi_obytes; - u_long ifi_imcasts; - u_long ifi_omcasts; - u_long ifi_iqdrops; - u_long ifi_noproto; - u_long ifi_hwassist; -// FIXME: these are now unions, so maybe need to change definitions? -#undef ifi_epoch - time_t ifi_epoch; -#undef ifi_lastchange - struct timeval ifi_lastchange; -}; - -// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. -// See /usr/include/net/if.h. -struct if_msghdr8 { - u_short ifm_msglen; - u_char ifm_version; - u_char ifm_type; - int ifm_addrs; - int ifm_flags; - u_short ifm_index; - struct if_data8 ifm_data; -}; -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -const ( - _statfsVersion = C.STATFS_VERSION - _dirblksiz = C.DIRBLKSIZ -) - -type Stat_t C.struct_stat - -type stat_freebsd11_t C.struct_freebsd11_stat - -type Statfs_t C.struct_statfs - -type statfs_freebsd11_t C.struct_freebsd11_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type dirent_freebsd11 C.struct_freebsd11_dirent - -type Fsid C.struct_fsid - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Advice to Fadvise - -const ( - FADV_NORMAL = C.POSIX_FADV_NORMAL - FADV_RANDOM = C.POSIX_FADV_RANDOM - FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL - FADV_WILLNEED = C.POSIX_FADV_WILLNEED - FADV_DONTNEED = C.POSIX_FADV_DONTNEED - FADV_NOREUSE = C.POSIX_FADV_NOREUSE -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPMreqn C.struct_ip_mreqn - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPMreqn = C.sizeof_struct_ip_mreqn - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_ATTACH = C.PT_ATTACH - PTRACE_CONT = C.PT_CONTINUE - PTRACE_DETACH = C.PT_DETACH - PTRACE_GETFPREGS = C.PT_GETFPREGS - PTRACE_GETFSBASE = C.PT_GETFSBASE - PTRACE_GETLWPLIST = C.PT_GETLWPLIST - PTRACE_GETNUMLWPS = C.PT_GETNUMLWPS - PTRACE_GETREGS = C.PT_GETREGS - PTRACE_GETXSTATE = C.PT_GETXSTATE - PTRACE_IO = C.PT_IO - PTRACE_KILL = C.PT_KILL - PTRACE_LWPEVENTS = C.PT_LWP_EVENTS - PTRACE_LWPINFO = C.PT_LWPINFO - PTRACE_SETFPREGS = C.PT_SETFPREGS - PTRACE_SETREGS = C.PT_SETREGS - PTRACE_SINGLESTEP = C.PT_STEP - PTRACE_TRACEME = C.PT_TRACE_ME -) - -const ( - PIOD_READ_D = C.PIOD_READ_D - PIOD_WRITE_D = C.PIOD_WRITE_D - PIOD_READ_I = C.PIOD_READ_I - PIOD_WRITE_I = C.PIOD_WRITE_I -) - -const ( - PL_FLAG_BORN = C.PL_FLAG_BORN - PL_FLAG_EXITED = C.PL_FLAG_EXITED - PL_FLAG_SI = C.PL_FLAG_SI -) - -const ( - TRAP_BRKPT = C.TRAP_BRKPT - TRAP_TRACE = C.TRAP_TRACE -) - -type PtraceLwpInfoStruct C.struct_ptrace_lwpinfo - -type __Siginfo C.struct___siginfo - -type Sigset_t C.sigset_t - -type Reg C.struct_reg - -type FpReg C.struct_fpreg - -type PtraceIoDesc C.struct_ptrace_io_desc - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent_freebsd11 - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - sizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 - sizeofIfData = C.sizeof_struct_if_data - SizeofIfData = C.sizeof_struct_if_data8 - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type ifMsghdr C.struct_if_msghdr - -type IfMsghdr C.struct_if_msghdr8 - -type ifData C.struct_if_data - -type IfData C.struct_if_data8 - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr - SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfZbuf C.struct_bpf_zbuf - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfZbufHeader C.struct_bpf_zbuf_header - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLINIGNEOF = C.POLLINIGNEOF - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Capabilities - -type CapRights C.struct_cap_rights - -// Uname - -type Utsname C.struct_utsname - -// Clockinfo - -const SizeofClockinfo = C.sizeof_struct_clockinfo - -type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_netbsd.go b/vendor/golang.org/x/sys/unix/types_netbsd.go deleted file mode 100644 index 0a81aadb..00000000 --- a/vendor/golang.org/x/sys/unix/types_netbsd.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Statvfs_t C.struct_statvfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.fsid_t - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Fstatvfs/Statvfs flags - -const ( - ST_WAIT = C.ST_WAIT - ST_NOWAIT = C.ST_NOWAIT -) - -// Advice to Fadvise - -const ( - FADV_NORMAL = C.POSIX_FADV_NORMAL - FADV_RANDOM = C.POSIX_FADV_RANDOM - FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL - FADV_WILLNEED = C.POSIX_FADV_WILLNEED - FADV_DONTNEED = C.POSIX_FADV_DONTNEED - FADV_NOREUSE = C.POSIX_FADV_NOREUSE -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -type Mclpool C.struct_mclpool - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfTimeval C.struct_bpf_timeval - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -type Ptmget C.struct_ptmget - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Sysctl - -type Sysctlnode C.struct_sysctlnode - -// Uname - -type Utsname C.struct_utsname - -// Clockinfo - -const SizeofClockinfo = C.sizeof_struct_clockinfo - -type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_openbsd.go b/vendor/golang.org/x/sys/unix/types_openbsd.go deleted file mode 100644 index 775cb57d..00000000 --- a/vendor/golang.org/x/sys/unix/types_openbsd.go +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.fsid_t - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -type Mclpool C.struct_mclpool - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfTimeval C.struct_bpf_timeval - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Signal Sets - -type Sigset_t C.sigset_t - -// Uname - -type Utsname C.struct_utsname - -// Uvmexp - -const SizeofUvmexp = C.sizeof_struct_uvmexp - -type Uvmexp C.struct_uvmexp - -// Clockinfo - -const SizeofClockinfo = C.sizeof_struct_clockinfo - -type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_solaris.go b/vendor/golang.org/x/sys/unix/types_solaris.go deleted file mode 100644 index d713f09e..00000000 --- a/vendor/golang.org/x/sys/unix/types_solaris.go +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -// These defines ensure that builds done on newer versions of Solaris are -// backwards-compatible with older versions of Solaris and -// OpenSolaris-based derivatives. -#define __USE_SUNOS_SOCKETS__ // msghdr -#define __USE_LEGACY_PROTOTYPES__ // iovec -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong - PathMax = C.PATH_MAX - MaxHostNameLen = C.MAXHOSTNAMELEN -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -type Tms C.struct_tms - -type Utimbuf C.struct_utimbuf - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -// Filesystems - -type _Fsblkcnt_t C.fsblkcnt_t - -type Statvfs_t C.struct_statvfs - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet4Pktinfo C.struct_in_pktinfo - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Select - -type FdSet C.fd_set - -// Misc - -type Utsname C.struct_utsname - -type Ustat_t C.struct_ustat - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_EACCESS = C.AT_EACCESS -) - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfTimeval C.struct_bpf_timeval - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios - -type Termio C.struct_termio - -type Winsize C.struct_winsize - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index e5c4b5d2..e80d4e96 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -377,6 +377,51 @@ const ( DEVMEM_MAGIC = 0x454d444d DEVPTS_SUPER_MAGIC = 0x1cd1 DMA_BUF_MAGIC = 0x444d4142 + DM_ACTIVE_PRESENT_FLAG = 0x20 + DM_BUFFER_FULL_FLAG = 0x100 + DM_CONTROL_NODE = "control" + DM_DATA_OUT_FLAG = 0x10000 + DM_DEFERRED_REMOVE = 0x20000 + DM_DEV_ARM_POLL = 0xc138fd10 + DM_DEV_CREATE = 0xc138fd03 + DM_DEV_REMOVE = 0xc138fd04 + DM_DEV_RENAME = 0xc138fd05 + DM_DEV_SET_GEOMETRY = 0xc138fd0f + DM_DEV_STATUS = 0xc138fd07 + DM_DEV_SUSPEND = 0xc138fd06 + DM_DEV_WAIT = 0xc138fd08 + DM_DIR = "mapper" + DM_GET_TARGET_VERSION = 0xc138fd11 + DM_INACTIVE_PRESENT_FLAG = 0x40 + DM_INTERNAL_SUSPEND_FLAG = 0x40000 + DM_IOCTL = 0xfd + DM_LIST_DEVICES = 0xc138fd02 + DM_LIST_VERSIONS = 0xc138fd0d + DM_MAX_TYPE_NAME = 0x10 + DM_NAME_LEN = 0x80 + DM_NOFLUSH_FLAG = 0x800 + DM_PERSISTENT_DEV_FLAG = 0x8 + DM_QUERY_INACTIVE_TABLE_FLAG = 0x1000 + DM_READONLY_FLAG = 0x1 + DM_REMOVE_ALL = 0xc138fd01 + DM_SECURE_DATA_FLAG = 0x8000 + DM_SKIP_BDGET_FLAG = 0x200 + DM_SKIP_LOCKFS_FLAG = 0x400 + DM_STATUS_TABLE_FLAG = 0x10 + DM_SUSPEND_FLAG = 0x2 + DM_TABLE_CLEAR = 0xc138fd0a + DM_TABLE_DEPS = 0xc138fd0b + DM_TABLE_LOAD = 0xc138fd09 + DM_TABLE_STATUS = 0xc138fd0c + DM_TARGET_MSG = 0xc138fd0e + DM_UEVENT_GENERATED_FLAG = 0x2000 + DM_UUID_FLAG = 0x4000 + DM_UUID_LEN = 0x81 + DM_VERSION = 0xc138fd00 + DM_VERSION_EXTRA = "-ioctl (2020-02-27)" + DM_VERSION_MAJOR = 0x4 + DM_VERSION_MINOR = 0x2a + DM_VERSION_PATCHLEVEL = 0x0 DT_BLK = 0x6 DT_CHR = 0x2 DT_DIR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go new file mode 100644 index 00000000..a74639a4 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go @@ -0,0 +1,1862 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,openbsd + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ALTWERASE = 0x200 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc010427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80104277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x8010426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_FILDROP_CAPTURE = 0x1 + BPF_FILDROP_DROP = 0x2 + BPF_FILDROP_PASS = 0x0 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x6 + CLOCK_MONOTONIC = 0x3 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x4 + CLOCK_UPTIME = 0x5 + CPUSTATES = 0x6 + CP_IDLE = 0x5 + CP_INTR = 0x4 + CP_NICE = 0x1 + CP_SPIN = 0x3 + CP_SYS = 0x2 + CP_USER = 0x0 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCADDQUEUE = 0xc110445d + DIOCADDRULE = 0xcd604404 + DIOCADDSTATE = 0xc1084425 + DIOCCHANGERULE = 0xcd60441a + DIOCCLRIFFLAG = 0xc028445a + DIOCCLRSRCNODES = 0x20004455 + DIOCCLRSTATES = 0xc0e04412 + DIOCCLRSTATUS = 0xc0284416 + DIOCGETLIMIT = 0xc0084427 + DIOCGETQSTATS = 0xc1204460 + DIOCGETQUEUE = 0xc110445f + DIOCGETQUEUES = 0xc110445e + DIOCGETRULE = 0xcd604407 + DIOCGETRULES = 0xcd604406 + DIOCGETRULESET = 0xc444443b + DIOCGETRULESETS = 0xc444443a + DIOCGETSRCNODES = 0xc0104454 + DIOCGETSTATE = 0xc1084413 + DIOCGETSTATES = 0xc0104419 + DIOCGETSTATUS = 0xc1e84415 + DIOCGETSYNFLWATS = 0xc0084463 + DIOCGETTIMEOUT = 0xc008441e + DIOCIGETIFACES = 0xc0284457 + DIOCKILLSRCNODES = 0xc080445b + DIOCKILLSTATES = 0xc0e04429 + DIOCNATLOOK = 0xc0504417 + DIOCOSFPADD = 0xc088444f + DIOCOSFPFLUSH = 0x2000444e + DIOCOSFPGET = 0xc0884450 + DIOCRADDADDRS = 0xc4504443 + DIOCRADDTABLES = 0xc450443d + DIOCRCLRADDRS = 0xc4504442 + DIOCRCLRASTATS = 0xc4504448 + DIOCRCLRTABLES = 0xc450443c + DIOCRCLRTSTATS = 0xc4504441 + DIOCRDELADDRS = 0xc4504444 + DIOCRDELTABLES = 0xc450443e + DIOCRGETADDRS = 0xc4504446 + DIOCRGETASTATS = 0xc4504447 + DIOCRGETTABLES = 0xc450443f + DIOCRGETTSTATS = 0xc4504440 + DIOCRINADEFINE = 0xc450444d + DIOCRSETADDRS = 0xc4504445 + DIOCRSETTFLAGS = 0xc450444a + DIOCRTSTADDRS = 0xc4504449 + DIOCSETDEBUG = 0xc0044418 + DIOCSETHOSTID = 0xc0044456 + DIOCSETIFFLAG = 0xc0284459 + DIOCSETLIMIT = 0xc0084428 + DIOCSETREASS = 0xc004445c + DIOCSETSTATUSIF = 0xc0284414 + DIOCSETSYNCOOKIES = 0xc0014462 + DIOCSETSYNFLWATS = 0xc0084461 + DIOCSETTIMEOUT = 0xc008441d + DIOCSTART = 0x20004401 + DIOCSTOP = 0x20004402 + DIOCXBEGIN = 0xc0104451 + DIOCXCOMMIT = 0xc0104452 + DIOCXROLLBACK = 0xc0104453 + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_OPENFLOW = 0x10b + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_USBPCAP = 0xf9 + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MACSEC = 0x88e5 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PBB = 0x88e7 + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_HARDMTU_LEN = 0xff9b + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_DEVICE = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x8 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EVL_ENCAPLEN = 0x4 + EVL_PRIO_BITS = 0xd + EVL_PRIO_MAX = 0x7 + EVL_VLID_MASK = 0xfff + EVL_VLID_MAX = 0xffe + EVL_VLID_MIN = 0x1 + EVL_VLID_NULL = 0x0 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_ISATTY = 0xb + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x20 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MBIM = 0xfa + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xfffffff + IPV6_FLOWLABEL_MASK = 0xfffff + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MINHOPCOUNT = 0x41 + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPDEFTTL = 0x25 + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_CONCEAL = 0x8000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0xfff7 + MAP_HASSEMAPHORE = 0x0 + MAP_INHERIT = 0x0 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_INHERIT_ZERO = 0x3 + MAP_NOEXTEND = 0x0 + MAP_NORESERVE = 0x0 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x0 + MAP_SHARED = 0x1 + MAP_STACK = 0x4000 + MAP_TRYFIXED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_DOOMED = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_NOATIME = 0x8000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOPERM = 0x20 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x4000000 + MNT_STALLED = 0x100000 + MNT_SWAPPABLE = 0x200000 + MNT_SYNCHRONOUS = 0x2 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x400ffff + MNT_WAIT = 0x1 + MNT_WANTRDWR = 0x2000000 + MNT_WXALLOWED = 0x800 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFNAMES = 0x6 + NET_RT_MAXID = 0x7 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NFDBITS = 0x20 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHANGE = 0x1 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OLCUC = 0x20 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BFD = 0xb + RTAX_BRD = 0x7 + RTAX_DNS = 0xc + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xf + RTAX_NETMASK = 0x2 + RTAX_SEARCH = 0xe + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTAX_STATIC = 0xd + RTA_AUTHOR = 0x40 + RTA_BFD = 0x800 + RTA_BRD = 0x80 + RTA_DNS = 0x1000 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SEARCH = 0x4000 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTA_STATIC = 0x2000 + RTF_ANNOUNCE = 0x4000 + RTF_BFD = 0x1000000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CACHED = 0x20000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_CONNECTED = 0x800000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x110fc08 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_MULTICAST = 0x200 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTM_80211INFO = 0x15 + RTM_ADD = 0x1 + RTM_BFD = 0x12 + RTM_CHANGE = 0x3 + RTM_CHGADDRATTR = 0x14 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_INVALIDATE = 0x11 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_PROPOSAL = 0x13 + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_BITS = 0x8 + RT_TABLEID_MASK = 0xff + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8060693c + SIOCBRDGADDL = 0x80606949 + SIOCBRDGADDS = 0x80606941 + SIOCBRDGARL = 0x808c694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8060693d + SIOCBRDGDELS = 0x80606942 + SIOCBRDGFLUSH = 0x80606948 + SIOCBRDGFRL = 0x808c694e + SIOCBRDGGCACHE = 0xc0186941 + SIOCBRDGGFD = 0xc0186952 + SIOCBRDGGHT = 0xc0186951 + SIOCBRDGGIFFLGS = 0xc060693e + SIOCBRDGGMA = 0xc0186953 + SIOCBRDGGPARAM = 0xc0406958 + SIOCBRDGGPRI = 0xc0186950 + SIOCBRDGGRL = 0xc030694f + SIOCBRDGGTO = 0xc0186946 + SIOCBRDGIFS = 0xc0606942 + SIOCBRDGRTS = 0xc0206943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80186940 + SIOCBRDGSFD = 0x80186952 + SIOCBRDGSHT = 0x80186951 + SIOCBRDGSIFCOST = 0x80606955 + SIOCBRDGSIFFLGS = 0x8060693f + SIOCBRDGSIFPRIO = 0x80606954 + SIOCBRDGSIFPROT = 0x8060694a + SIOCBRDGSMA = 0x80186953 + SIOCBRDGSPRI = 0x80186950 + SIOCBRDGSPROTO = 0x8018695a + SIOCBRDGSTO = 0x80186945 + SIOCBRDGSTXHC = 0x80186959 + SIOCDELLABEL = 0x80206997 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPARENT = 0x802069b4 + SIOCDIFPHYADDR = 0x80206949 + SIOCDPWE3NEIGHBOR = 0x802069de + SIOCDVNETID = 0x802069af + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETMPWCFG = 0xc02069ae + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGETVLAN = 0xc0206990 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc028698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGLIST = 0xc028698d + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFLLPRIO = 0xc02069b6 + SIOCGIFMEDIA = 0xc0406938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPAIR = 0xc02069b1 + SIOCGIFPARENT = 0xc02069b3 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFRXR = 0x802069aa + SIOCGIFSFFPAGE = 0xc1126939 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYDF = 0xc02069c2 + SIOCGLIFPHYECN = 0xc02069c8 + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGPGRP = 0x40047309 + SIOCGPWE3 = 0xc0206998 + SIOCGPWE3CTRLWORD = 0xc02069dc + SIOCGPWE3FAT = 0xc02069dd + SIOCGPWE3NEIGHBOR = 0xc21869de + SIOCGRXHPRIO = 0xc02069db + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGTXHPRIO = 0xc02069c6 + SIOCGUMBINFO = 0xc02069be + SIOCGUMBPARAM = 0xc02069c0 + SIOCGVH = 0xc02069f6 + SIOCGVNETFLOWID = 0xc02069c4 + SIOCGVNETID = 0xc02069a7 + SIOCIFAFATTACH = 0x801169ab + SIOCIFAFDETACH = 0x801169ac + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETMPWCFG = 0x802069ad + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8028698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFLLPRIO = 0x802069b5 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPAIR = 0x802069b0 + SIOCSIFPARENT = 0x802069b2 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYDF = 0x802069c1 + SIOCSLIFPHYECN = 0x802069c7 + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSPGRP = 0x80047308 + SIOCSPWE3CTRLWORD = 0x802069dc + SIOCSPWE3FAT = 0x802069dd + SIOCSPWE3NEIGHBOR = 0x821869de + SIOCSRXHPRIO = 0x802069db + SIOCSSPPPPARAMS = 0x80206993 + SIOCSTXHPRIO = 0x802069c5 + SIOCSUMBPARAM = 0x802069bf + SIOCSVH = 0xc02069f5 + SIOCSVNETFLOWID = 0x802069c3 + SIOCSVNETID = 0x802069a6 + SIOCSWGDPID = 0xc018695b + SIOCSWGMAXFLOW = 0xc0186960 + SIOCSWGMAXGROUP = 0xc018695d + SIOCSWSDPID = 0x8018695c + SIOCSWSPORTNO = 0xc060695f + SOCK_CLOEXEC = 0x8000 + SOCK_DGRAM = 0x2 + SOCK_DNS = 0x1000 + SOCK_NONBLOCK = 0x4000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DOMAIN = 0x1024 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_PROTOCOL = 0x1025 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_ZEROIZE = 0x2000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_SACKHOLE_LIMIT = 0x80 + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIMER_ABSTIME = 0x1 + TIMER_RELTIME = 0x0 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCHKVERAUTH = 0x2000741e + TIOCCLRVERAUTH = 0x2000741d + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x4010745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSETVERAUTH = 0x8004741c + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCUCNTL_CBRK = 0x7a + TIOCUCNTL_SBRK = 0x7b + TOSTOP = 0x400000 + UTIME_NOW = -0x2 + UTIME_OMIT = -0x1 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_ANONMIN = 0x7 + VM_LOADAVG = 0x2 + VM_MALLOC_CONF = 0xc + VM_MAXID = 0xd + VM_MAXSLP = 0xa + VM_METER = 0x1 + VM_NKMEMPAGES = 0x6 + VM_PSSTRINGS = 0x3 + VM_SWAPENCRYPT = 0x5 + VM_USPACE = 0xb + VM_UVMEXP = 0x4 + VM_VNODEMIN = 0x9 + VM_VTEXTMIN = 0x8 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WUNTRACED = 0x2 + XCASE = 0x1000000 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x5c) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5f) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5d) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EOWNERDEAD = syscall.Errno(0x5e) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5f) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disk quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC program not available"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIPSEC", "IPsec processing failure"}, + {83, "ENOATTR", "attribute not found"}, + {84, "EILSEQ", "illegal byte sequence"}, + {85, "ENOMEDIUM", "no medium found"}, + {86, "EMEDIUMTYPE", "wrong medium type"}, + {87, "EOVERFLOW", "value too large to be stored in data type"}, + {88, "ECANCELED", "operation canceled"}, + {89, "EIDRM", "identifier removed"}, + {90, "ENOMSG", "no message of desired type"}, + {91, "ENOTSUP", "not supported"}, + {92, "EBADMSG", "bad message"}, + {93, "ENOTRECOVERABLE", "state not recoverable"}, + {94, "EOWNERDEAD", "previous owner died"}, + {95, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "thread AST"}, +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go new file mode 100644 index 00000000..ec6bd5bb --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -0,0 +1,1692 @@ +// go run mksyscall.go -openbsd -tags openbsd,mips64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_mips64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,mips64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(from int, to int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrtable() (rtable int, err error) { + r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + rtable = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrtable(rtable int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go new file mode 100644 index 00000000..aca34b34 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go @@ -0,0 +1,279 @@ +// go run mksysctl_openbsd.go +// Code generated by the command above; DO NOT EDIT. + +// +build mips64,openbsd + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.profile", []_C_int{9, 9}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.ncpuonline", []_C_int{6, 25}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.perfpolicy", []_C_int{6, 23}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.smt", []_C_int{6, 24}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.allowdt", []_C_int{1, 65}}, + {"kern.allowkmem", []_C_int{1, 52}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.audio", []_C_int{1, 84}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consbuf", []_C_int{1, 83}}, + {"kern.consbufsize", []_C_int{1, 82}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cpustats", []_C_int{1, 85}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.global_ptrace", []_C_int{1, 81}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pfstatus", []_C_int{1, 86}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.timeout_stats", []_C_int{1, 87}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.utc_offset", []_C_int{1, 88}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"kern.witnesswatch", []_C_int{1, 53}}, + {"kern.wxabort", []_C_int{1, 74}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpdown", []_C_int{4, 2, 0, 40}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.arptimeout", []_C_int{4, 2, 0, 39}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtmfc", []_C_int{4, 2, 0, 37}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mrtvif", []_C_int{4, 2, 0, 38}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rootonly", []_C_int{4, 2, 6, 24}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.tcp.synhashsize", []_C_int{4, 2, 6, 25}}, + {"net.inet.tcp.synuselimit", []_C_int{4, 2, 6, 23}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.rootonly", []_C_int{4, 2, 17, 6}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtmfc", []_C_int{4, 24, 17, 53}}, + {"net.inet6.ip6.mrtmif", []_C_int{4, 24, 17, 52}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.soiikey", []_C_int{4, 24, 17, 54}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.malloc_conf", []_C_int{2, 12}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go new file mode 100644 index 00000000..5c08d573 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go @@ -0,0 +1,220 @@ +// go run mksysnum.go https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int sys_open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, size_t psize); } + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, dev_t dev); } + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, gid_t gid); } + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, struct rusage *rusage); } + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, int flags, void *data); } + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, int data); } + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_MSYSCALL = 37 // { int sys_msyscall(void *addr, size_t len); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, const struct sigaction *nsa, struct sigaction *osa); } + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, u_long com, ... void *data); } + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int sys_execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, int flags); } + SYS_STATFS = 63 // { int sys_statfs(const char *path, struct statfs *buf); } + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, struct statfs *buf); } + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, struct timezone *tzp); } + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, const struct timezone *tzp); } + SYS_SETITIMER = 69 // { int sys_setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 70 // { int sys_getitimer(int which, struct itimerval *itv); } + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_KEVENT = 72 // { int sys_kevent(int fd, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); } + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, int behav); } + SYS_UTIMES = 76 // { int sys_utimes(const char *path, const struct timeval *tptr); } + SYS_FUTIMES = 77 // { int sys_futimes(int fd, const struct timeval *tptr); } + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } + SYS_FUTEX = 83 // { int sys_futex(uint32_t *f, int op, int val, const struct timespec *timeout, uint32_t *g); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, const struct timespec *times, int flag); } + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, const struct timespec *times); } + SYS_KBIND = 86 // { int sys_kbind(const struct __kbind *param, size_t psize, int64_t proc_cookie); } + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, socklen_t *anamelen, int flags); } + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, clockid_t clock_id, const struct timespec *tp, void *lock, const int *abort); } + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } + SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, u_int flags, int atflags); } + SYS_PLEDGE = 108 // { int sys_pledge(const char *promises, const char *execpromises); } + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_SENDSYSLOG = 112 // { int sys_sendsyslog(const char *buf, size_t nbyte, int flags); } + SYS_UNVEIL = 114 // { int sys_unveil(const char *path, const char *permissions); } + SYS___REALPATH = 115 // { int sys___realpath(const char *pathname, char *resolved); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_THRKILL = 119 // { int sys_thrkill(pid_t tid, int signum, void *tcb); } + SYS_READV = 120 // { ssize_t sys_readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_KILL = 122 // { int sys_kill(int pid, int signum); } + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_GETLOGIN_R = 141 // { int sys_getlogin_r(char *namebuf, u_int namelen); } + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, int uid, char *arg); } + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS___TMPFD = 164 // { int sys___tmpfd(int flags); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, size_t nbyte, int pad, off_t offset); } + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, size_t nbyte, int pad, off_t offset); } + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, int flags, int fd, long pad, off_t pos); } + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, off_t length); } + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS_SYSCTL = 202 // { int sys_sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, void *new, size_t newlen); } + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, size_t len); } + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, int inherit); } + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, const struct iovec *iovp, int iovcnt, int pad, off_t offset); } + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, const struct iovec *iovp, int iovcnt, int pad, off_t offset); } + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, uid_t suid); } + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid); } + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, int flags, int fd, long pad, off_t pos); } + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, struct sigaltstack *oss); } + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, struct stat *sb); } + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, union semun *arg); } + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, int n); } + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, siginfo_t *info, const struct timespec *timeout); } + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, int64_t *oldfreq); } + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, uid_t uid, gid_t gid, int flag); } + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, const char *path2, int flag); } + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, mode_t mode); } + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, mode_t mode, dev_t dev); } + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, ... mode_t mode); } + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, char *buf, size_t count); } + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, const char *link); } + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, int flag); } + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index a8c47088..953166c7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -140,6 +140,48 @@ type FscryptGetKeyStatusArg struct { _ [13]uint32 } +type DmIoctl struct { + Version [3]uint32 + Data_size uint32 + Data_start uint32 + Target_count uint32 + Open_count int32 + Flags uint32 + Event_nr uint32 + _ uint32 + Dev uint64 + Name [128]byte + Uuid [129]byte + Data [7]byte +} + +type DmTargetSpec struct { + Sector_start uint64 + Length uint64 + Status int32 + Next uint32 + Target_type [16]byte +} + +type DmTargetDeps struct { + Count uint32 + _ uint32 +} + +type DmTargetVersions struct { + Next uint32 + Version [3]uint32 +} + +type DmTargetMsg struct { + Sector uint64 +} + +const ( + SizeofDmIoctl = 0x138 + SizeofDmTargetSpec = 0x28 +) + type KeyctlDHParams struct { Private int32 Prime int32 @@ -268,6 +310,15 @@ type RawSockaddrL2TPIP6 struct { Conn_id uint32 } +type RawSockaddrIUCV struct { + Family uint16 + Port uint16 + Addr uint32 + Nodeid [8]int8 + User_id [8]int8 + Name [8]int8 +} + type _Socklen uint32 type Linger struct { @@ -380,6 +431,7 @@ const ( SizeofSockaddrTIPC = 0x10 SizeofSockaddrL2TPIP = 0x10 SizeofSockaddrL2TPIP6 = 0x20 + SizeofSockaddrIUCV = 0x20 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc @@ -964,6 +1016,13 @@ const ( PERF_SAMPLE_STREAM_ID = 0x200 PERF_SAMPLE_RAW = 0x400 PERF_SAMPLE_BRANCH_STACK = 0x800 + PERF_SAMPLE_REGS_USER = 0x1000 + PERF_SAMPLE_STACK_USER = 0x2000 + PERF_SAMPLE_WEIGHT = 0x4000 + PERF_SAMPLE_DATA_SRC = 0x8000 + PERF_SAMPLE_IDENTIFIER = 0x10000 + PERF_SAMPLE_TRANSACTION = 0x20000 + PERF_SAMPLE_REGS_INTR = 0x40000 PERF_SAMPLE_BRANCH_USER = 0x1 PERF_SAMPLE_BRANCH_KERNEL = 0x2 @@ -1693,6 +1752,21 @@ const ( NFT_NG_RANDOM = 0x1 ) +const ( + NFTA_TARGET_UNSPEC = 0x0 + NFTA_TARGET_NAME = 0x1 + NFTA_TARGET_REV = 0x2 + NFTA_TARGET_INFO = 0x3 + NFTA_MATCH_UNSPEC = 0x0 + NFTA_MATCH_NAME = 0x1 + NFTA_MATCH_REV = 0x2 + NFTA_MATCH_INFO = 0x3 + NFTA_COMPAT_UNSPEC = 0x0 + NFTA_COMPAT_NAME = 0x1 + NFTA_COMPAT_REV = 0x2 + NFTA_COMPAT_TYPE = 0x3 +) + type RTCTime struct { Sec int32 Min int32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 761b67c8..73509d89 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -117,6 +117,11 @@ type Flock_t struct { Pid int32 } +type DmNameList struct { + Dev uint64 + Next uint32 +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 201fb348..45eb8738 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -117,6 +117,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 8051b561..8f6b453a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -121,6 +121,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index a936f216..b1e0c24f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -118,6 +118,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index aaca03dd..fb802c3e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -120,6 +120,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 2e7f3b8c..30abcf3b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -118,6 +118,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 16add5a2..99761aa9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -118,6 +118,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 4ed2c8e5..29369034 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -120,6 +120,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 74151909..0ca856e5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -119,6 +119,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 046c2deb..f50f6482 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -119,6 +119,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index 0f2f61a6..4d3ac8d7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -118,6 +118,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index cca1b6be..349f483a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -117,6 +117,13 @@ type Flock_t struct { _ [4]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x6 FADV_NOREUSE = 0x7 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 33a73bf1..80c73bea 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -121,6 +121,13 @@ type Flock_t struct { _ [2]byte } +type DmNameList struct { + Dev uint64 + Next uint32 + Name [0]byte + _ [4]byte +} + const ( FADV_DONTNEED = 0x4 FADV_NOREUSE = 0x5 diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go new file mode 100644 index 00000000..992a1f8c --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go @@ -0,0 +1,565 @@ +// cgo -godefs -- -fsigned-char types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,openbsd + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + _ Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + _ [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + _ [4]uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xa8 + SizeofIfData = 0x90 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Rdomain uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]int8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct{} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_FOLLOW = 0x4 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sigset_t uint32 + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofUvmexp = 0x158 + +type Uvmexp struct { + Pagesize int32 + Pagemask int32 + Pageshift int32 + Npages int32 + Free int32 + Active int32 + Inactive int32 + Paging int32 + Wired int32 + Zeropages int32 + Reserve_pagedaemon int32 + Reserve_kernel int32 + Unused01 int32 + Vnodepages int32 + Vtextpages int32 + Freemin int32 + Freetarg int32 + Inactarg int32 + Wiredmax int32 + Anonmin int32 + Vtextmin int32 + Vnodemin int32 + Anonminpct int32 + Vtextminpct int32 + Vnodeminpct int32 + Nswapdev int32 + Swpages int32 + Swpginuse int32 + Swpgonly int32 + Nswget int32 + Nanon int32 + Unused05 int32 + Unused06 int32 + Faults int32 + Traps int32 + Intrs int32 + Swtch int32 + Softs int32 + Syscalls int32 + Pageins int32 + Unused07 int32 + Unused08 int32 + Pgswapin int32 + Pgswapout int32 + Forks int32 + Forks_ppwait int32 + Forks_sharevm int32 + Pga_zerohit int32 + Pga_zeromiss int32 + Unused09 int32 + Fltnoram int32 + Fltnoanon int32 + Fltnoamap int32 + Fltpgwait int32 + Fltpgrele int32 + Fltrelck int32 + Fltrelckok int32 + Fltanget int32 + Fltanretry int32 + Fltamcopy int32 + Fltnamap int32 + Fltnomap int32 + Fltlget int32 + Fltget int32 + Flt_anon int32 + Flt_acow int32 + Flt_obj int32 + Flt_prcopy int32 + Flt_przero int32 + Pdwoke int32 + Pdrevs int32 + Pdswout int32 + Pdfreed int32 + Pdscans int32 + Pdanscan int32 + Pdobscan int32 + Pdreact int32 + Pdbusy int32 + Pdpageouts int32 + Pdpending int32 + Pddeact int32 + Unused11 int32 + Unused12 int32 + Unused13 int32 + Fpswtch int32 + Kmapent int32 +} + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule.go b/vendor/golang.org/x/text/secure/bidirule/bidirule.go new file mode 100644 index 00000000..e2b70f76 --- /dev/null +++ b/vendor/golang.org/x/text/secure/bidirule/bidirule.go @@ -0,0 +1,336 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package bidirule implements the Bidi Rule defined by RFC 5893. +// +// This package is under development. The API may change without notice and +// without preserving backward compatibility. +package bidirule + +import ( + "errors" + "unicode/utf8" + + "golang.org/x/text/transform" + "golang.org/x/text/unicode/bidi" +) + +// This file contains an implementation of RFC 5893: Right-to-Left Scripts for +// Internationalized Domain Names for Applications (IDNA) +// +// A label is an individual component of a domain name. Labels are usually +// shown separated by dots; for example, the domain name "www.example.com" is +// composed of three labels: "www", "example", and "com". +// +// An RTL label is a label that contains at least one character of class R, AL, +// or AN. An LTR label is any label that is not an RTL label. +// +// A "Bidi domain name" is a domain name that contains at least one RTL label. +// +// The following guarantees can be made based on the above: +// +// o In a domain name consisting of only labels that satisfy the rule, +// the requirements of Section 3 are satisfied. Note that even LTR +// labels and pure ASCII labels have to be tested. +// +// o In a domain name consisting of only LDH labels (as defined in the +// Definitions document [RFC5890]) and labels that satisfy the rule, +// the requirements of Section 3 are satisfied as long as a label +// that starts with an ASCII digit does not come after a +// right-to-left label. +// +// No guarantee is given for other combinations. + +// ErrInvalid indicates a label is invalid according to the Bidi Rule. +var ErrInvalid = errors.New("bidirule: failed Bidi Rule") + +type ruleState uint8 + +const ( + ruleInitial ruleState = iota + ruleLTR + ruleLTRFinal + ruleRTL + ruleRTLFinal + ruleInvalid +) + +type ruleTransition struct { + next ruleState + mask uint16 +} + +var transitions = [...][2]ruleTransition{ + // [2.1] The first character must be a character with Bidi property L, R, or + // AL. If it has the R or AL property, it is an RTL label; if it has the L + // property, it is an LTR label. + ruleInitial: { + {ruleLTRFinal, 1 << bidi.L}, + {ruleRTLFinal, 1< 0; count-- { + p.openers.Remove(p.openers.Front()) + } + break + } + } + sort.Sort(p.pairPositions) + // if we get here, the closing bracket matched no openers + // and gets ignored + } + } +} + +// Bracket pairs within an isolating run sequence are processed as units so +// that both the opening and the closing paired bracket in a pair resolve to +// the same direction. +// +// N0. Process bracket pairs in an isolating run sequence sequentially in +// the logical order of the text positions of the opening paired brackets +// using the logic given below. Within this scope, bidirectional types EN +// and AN are treated as R. +// +// Identify the bracket pairs in the current isolating run sequence +// according to BD16. For each bracket-pair element in the list of pairs of +// text positions: +// +// a Inspect the bidirectional types of the characters enclosed within the +// bracket pair. +// +// b If any strong type (either L or R) matching the embedding direction is +// found, set the type for both brackets in the pair to match the embedding +// direction. +// +// o [ e ] o -> o e e e o +// +// o [ o e ] -> o e o e e +// +// o [ NI e ] -> o e NI e e +// +// c Otherwise, if a strong type (opposite the embedding direction) is +// found, test for adjacent strong types as follows: 1 First, check +// backwards before the opening paired bracket until the first strong type +// (L, R, or sos) is found. If that first preceding strong type is opposite +// the embedding direction, then set the type for both brackets in the pair +// to that type. 2 Otherwise, set the type for both brackets in the pair to +// the embedding direction. +// +// o [ o ] e -> o o o o e +// +// o [ o NI ] o -> o o o NI o o +// +// e [ o ] o -> e e o e o +// +// e [ o ] e -> e e o e e +// +// e ( o [ o ] NI ) e -> e e o o o o NI e e +// +// d Otherwise, do not set the type for the current bracket pair. Note that +// if the enclosed text contains no strong types the paired brackets will +// both resolve to the same level when resolved individually using rules N1 +// and N2. +// +// e ( NI ) o -> e ( NI ) o + +// getStrongTypeN0 maps character's directional code to strong type as required +// by rule N0. +// +// TODO: have separate type for "strong" directionality. +func (p *bracketPairer) getStrongTypeN0(index int) Class { + switch p.codesIsolatedRun[index] { + // in the scope of N0, number types are treated as R + case EN, AN, AL, R: + return R + case L: + return L + default: + return ON + } +} + +// classifyPairContent reports the strong types contained inside a Bracket Pair, +// assuming the given embedding direction. +// +// It returns ON if no strong type is found. If a single strong type is found, +// it returns this type. Otherwise it returns the embedding direction. +// +// TODO: use separate type for "strong" directionality. +func (p *bracketPairer) classifyPairContent(loc bracketPair, dirEmbed Class) Class { + dirOpposite := ON + for i := loc.opener + 1; i < loc.closer; i++ { + dir := p.getStrongTypeN0(i) + if dir == ON { + continue + } + if dir == dirEmbed { + return dir // type matching embedding direction found + } + dirOpposite = dir + } + // return ON if no strong type found, or class opposite to dirEmbed + return dirOpposite +} + +// classBeforePair determines which strong types are present before a Bracket +// Pair. Return R or L if strong type found, otherwise ON. +func (p *bracketPairer) classBeforePair(loc bracketPair) Class { + for i := loc.opener - 1; i >= 0; i-- { + if dir := p.getStrongTypeN0(i); dir != ON { + return dir + } + } + // no strong types found, return sos + return p.sos +} + +// assignBracketType implements rule N0 for a single bracket pair. +func (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed Class, initialTypes []Class) { + // rule "N0, a", inspect contents of pair + dirPair := p.classifyPairContent(loc, dirEmbed) + + // dirPair is now L, R, or N (no strong type found) + + // the following logical tests are performed out of order compared to + // the statement of the rules but yield the same results + if dirPair == ON { + return // case "d" - nothing to do + } + + if dirPair != dirEmbed { + // case "c": strong type found, opposite - check before (c.1) + dirPair = p.classBeforePair(loc) + if dirPair == dirEmbed || dirPair == ON { + // no strong opposite type found before - use embedding (c.2) + dirPair = dirEmbed + } + } + // else: case "b", strong type found matching embedding, + // no explicit action needed, as dirPair is already set to embedding + // direction + + // set the bracket types to the type found + p.setBracketsToType(loc, dirPair, initialTypes) +} + +func (p *bracketPairer) setBracketsToType(loc bracketPair, dirPair Class, initialTypes []Class) { + p.codesIsolatedRun[loc.opener] = dirPair + p.codesIsolatedRun[loc.closer] = dirPair + + for i := loc.opener + 1; i < loc.closer; i++ { + index := p.indexes[i] + if initialTypes[index] != NSM { + break + } + p.codesIsolatedRun[i] = dirPair + } + + for i := loc.closer + 1; i < len(p.indexes); i++ { + index := p.indexes[i] + if initialTypes[index] != NSM { + break + } + p.codesIsolatedRun[i] = dirPair + } +} + +// resolveBrackets implements rule N0 for a list of pairs. +func (p *bracketPairer) resolveBrackets(dirEmbed Class, initialTypes []Class) { + for _, loc := range p.pairPositions { + p.assignBracketType(loc, dirEmbed, initialTypes) + } +} diff --git a/vendor/golang.org/x/text/unicode/bidi/core.go b/vendor/golang.org/x/text/unicode/bidi/core.go new file mode 100644 index 00000000..50deb660 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/core.go @@ -0,0 +1,1058 @@ +// 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. + +package bidi + +import "log" + +// This implementation is a port based on the reference implementation found at: +// https://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/ +// +// described in Unicode Bidirectional Algorithm (UAX #9). +// +// Input: +// There are two levels of input to the algorithm, since clients may prefer to +// supply some information from out-of-band sources rather than relying on the +// default behavior. +// +// - Bidi class array +// - Bidi class array, with externally supplied base line direction +// +// Output: +// Output is separated into several stages: +// +// - levels array over entire paragraph +// - reordering array over entire paragraph +// - levels array over line +// - reordering array over line +// +// Note that for conformance to the Unicode Bidirectional Algorithm, +// implementations are only required to generate correct reordering and +// character directionality (odd or even levels) over a line. Generating +// identical level arrays over a line is not required. Bidi explicit format +// codes (LRE, RLE, LRO, RLO, PDF) and BN can be assigned arbitrary levels and +// positions as long as the rest of the input is properly reordered. +// +// As the algorithm is defined to operate on a single paragraph at a time, this +// implementation is written to handle single paragraphs. Thus rule P1 is +// presumed by this implementation-- the data provided to the implementation is +// assumed to be a single paragraph, and either contains no 'B' codes, or a +// single 'B' code at the end of the input. 'B' is allowed as input to +// illustrate how the algorithm assigns it a level. +// +// Also note that rules L3 and L4 depend on the rendering engine that uses the +// result of the bidi algorithm. This implementation assumes that the rendering +// engine expects combining marks in visual order (e.g. to the left of their +// base character in RTL runs) and that it adjusts the glyphs used to render +// mirrored characters that are in RTL runs so that they render appropriately. + +// level is the embedding level of a character. Even embedding levels indicate +// left-to-right order and odd levels indicate right-to-left order. The special +// level of -1 is reserved for undefined order. +type level int8 + +const implicitLevel level = -1 + +// in returns if x is equal to any of the values in set. +func (c Class) in(set ...Class) bool { + for _, s := range set { + if c == s { + return true + } + } + return false +} + +// A paragraph contains the state of a paragraph. +type paragraph struct { + initialTypes []Class + + // Arrays of properties needed for paired bracket evaluation in N0 + pairTypes []bracketType // paired Bracket types for paragraph + pairValues []rune // rune for opening bracket or pbOpen and pbClose; 0 for pbNone + + embeddingLevel level // default: = implicitLevel; + + // at the paragraph levels + resultTypes []Class + resultLevels []level + + // Index of matching PDI for isolate initiator characters. For other + // characters, the value of matchingPDI will be set to -1. For isolate + // initiators with no matching PDI, matchingPDI will be set to the length of + // the input string. + matchingPDI []int + + // Index of matching isolate initiator for PDI characters. For other + // characters, and for PDIs with no matching isolate initiator, the value of + // matchingIsolateInitiator will be set to -1. + matchingIsolateInitiator []int +} + +// newParagraph initializes a paragraph. The user needs to supply a few arrays +// corresponding to the preprocessed text input. The types correspond to the +// Unicode BiDi classes for each rune. pairTypes indicates the bracket type for +// each rune. pairValues provides a unique bracket class identifier for each +// rune (suggested is the rune of the open bracket for opening and matching +// close brackets, after normalization). The embedding levels are optional, but +// may be supplied to encode embedding levels of styled text. +// +// TODO: return an error. +func newParagraph(types []Class, pairTypes []bracketType, pairValues []rune, levels level) *paragraph { + validateTypes(types) + validatePbTypes(pairTypes) + validatePbValues(pairValues, pairTypes) + validateParagraphEmbeddingLevel(levels) + + p := ¶graph{ + initialTypes: append([]Class(nil), types...), + embeddingLevel: levels, + + pairTypes: pairTypes, + pairValues: pairValues, + + resultTypes: append([]Class(nil), types...), + } + p.run() + return p +} + +func (p *paragraph) Len() int { return len(p.initialTypes) } + +// The algorithm. Does not include line-based processing (Rules L1, L2). +// These are applied later in the line-based phase of the algorithm. +func (p *paragraph) run() { + p.determineMatchingIsolates() + + // 1) determining the paragraph level + // Rule P1 is the requirement for entering this algorithm. + // Rules P2, P3. + // If no externally supplied paragraph embedding level, use default. + if p.embeddingLevel == implicitLevel { + p.embeddingLevel = p.determineParagraphEmbeddingLevel(0, p.Len()) + } + + // Initialize result levels to paragraph embedding level. + p.resultLevels = make([]level, p.Len()) + setLevels(p.resultLevels, p.embeddingLevel) + + // 2) Explicit levels and directions + // Rules X1-X8. + p.determineExplicitEmbeddingLevels() + + // Rule X9. + // We do not remove the embeddings, the overrides, the PDFs, and the BNs + // from the string explicitly. But they are not copied into isolating run + // sequences when they are created, so they are removed for all + // practical purposes. + + // Rule X10. + // Run remainder of algorithm one isolating run sequence at a time + for _, seq := range p.determineIsolatingRunSequences() { + // 3) resolving weak types + // Rules W1-W7. + seq.resolveWeakTypes() + + // 4a) resolving paired brackets + // Rule N0 + resolvePairedBrackets(seq) + + // 4b) resolving neutral types + // Rules N1-N3. + seq.resolveNeutralTypes() + + // 5) resolving implicit embedding levels + // Rules I1, I2. + seq.resolveImplicitLevels() + + // Apply the computed levels and types + seq.applyLevelsAndTypes() + } + + // Assign appropriate levels to 'hide' LREs, RLEs, LROs, RLOs, PDFs, and + // BNs. This is for convenience, so the resulting level array will have + // a value for every character. + p.assignLevelsToCharactersRemovedByX9() +} + +// determineMatchingIsolates determines the matching PDI for each isolate +// initiator and vice versa. +// +// Definition BD9. +// +// At the end of this function: +// +// - The member variable matchingPDI is set to point to the index of the +// matching PDI character for each isolate initiator character. If there is +// no matching PDI, it is set to the length of the input text. For other +// characters, it is set to -1. +// - The member variable matchingIsolateInitiator is set to point to the +// index of the matching isolate initiator character for each PDI character. +// If there is no matching isolate initiator, or the character is not a PDI, +// it is set to -1. +func (p *paragraph) determineMatchingIsolates() { + p.matchingPDI = make([]int, p.Len()) + p.matchingIsolateInitiator = make([]int, p.Len()) + + for i := range p.matchingIsolateInitiator { + p.matchingIsolateInitiator[i] = -1 + } + + for i := range p.matchingPDI { + p.matchingPDI[i] = -1 + + if t := p.resultTypes[i]; t.in(LRI, RLI, FSI) { + depthCounter := 1 + for j := i + 1; j < p.Len(); j++ { + if u := p.resultTypes[j]; u.in(LRI, RLI, FSI) { + depthCounter++ + } else if u == PDI { + if depthCounter--; depthCounter == 0 { + p.matchingPDI[i] = j + p.matchingIsolateInitiator[j] = i + break + } + } + } + if p.matchingPDI[i] == -1 { + p.matchingPDI[i] = p.Len() + } + } + } +} + +// determineParagraphEmbeddingLevel reports the resolved paragraph direction of +// the substring limited by the given range [start, end). +// +// Determines the paragraph level based on rules P2, P3. This is also used +// in rule X5c to find if an FSI should resolve to LRI or RLI. +func (p *paragraph) determineParagraphEmbeddingLevel(start, end int) level { + var strongType Class = unknownClass + + // Rule P2. + for i := start; i < end; i++ { + if t := p.resultTypes[i]; t.in(L, AL, R) { + strongType = t + break + } else if t.in(FSI, LRI, RLI) { + i = p.matchingPDI[i] // skip over to the matching PDI + if i > end { + log.Panic("assert (i <= end)") + } + } + } + // Rule P3. + switch strongType { + case unknownClass: // none found + // default embedding level when no strong types found is 0. + return 0 + case L: + return 0 + default: // AL, R + return 1 + } +} + +const maxDepth = 125 + +// This stack will store the embedding levels and override and isolated +// statuses +type directionalStatusStack struct { + stackCounter int + embeddingLevelStack [maxDepth + 1]level + overrideStatusStack [maxDepth + 1]Class + isolateStatusStack [maxDepth + 1]bool +} + +func (s *directionalStatusStack) empty() { s.stackCounter = 0 } +func (s *directionalStatusStack) pop() { s.stackCounter-- } +func (s *directionalStatusStack) depth() int { return s.stackCounter } + +func (s *directionalStatusStack) push(level level, overrideStatus Class, isolateStatus bool) { + s.embeddingLevelStack[s.stackCounter] = level + s.overrideStatusStack[s.stackCounter] = overrideStatus + s.isolateStatusStack[s.stackCounter] = isolateStatus + s.stackCounter++ +} + +func (s *directionalStatusStack) lastEmbeddingLevel() level { + return s.embeddingLevelStack[s.stackCounter-1] +} + +func (s *directionalStatusStack) lastDirectionalOverrideStatus() Class { + return s.overrideStatusStack[s.stackCounter-1] +} + +func (s *directionalStatusStack) lastDirectionalIsolateStatus() bool { + return s.isolateStatusStack[s.stackCounter-1] +} + +// Determine explicit levels using rules X1 - X8 +func (p *paragraph) determineExplicitEmbeddingLevels() { + var stack directionalStatusStack + var overflowIsolateCount, overflowEmbeddingCount, validIsolateCount int + + // Rule X1. + stack.push(p.embeddingLevel, ON, false) + + for i, t := range p.resultTypes { + // Rules X2, X3, X4, X5, X5a, X5b, X5c + switch t { + case RLE, LRE, RLO, LRO, RLI, LRI, FSI: + isIsolate := t.in(RLI, LRI, FSI) + isRTL := t.in(RLE, RLO, RLI) + + // override if this is an FSI that resolves to RLI + if t == FSI { + isRTL = (p.determineParagraphEmbeddingLevel(i+1, p.matchingPDI[i]) == 1) + } + if isIsolate { + p.resultLevels[i] = stack.lastEmbeddingLevel() + if stack.lastDirectionalOverrideStatus() != ON { + p.resultTypes[i] = stack.lastDirectionalOverrideStatus() + } + } + + var newLevel level + if isRTL { + // least greater odd + newLevel = (stack.lastEmbeddingLevel() + 1) | 1 + } else { + // least greater even + newLevel = (stack.lastEmbeddingLevel() + 2) &^ 1 + } + + if newLevel <= maxDepth && overflowIsolateCount == 0 && overflowEmbeddingCount == 0 { + if isIsolate { + validIsolateCount++ + } + // Push new embedding level, override status, and isolated + // status. + // No check for valid stack counter, since the level check + // suffices. + switch t { + case LRO: + stack.push(newLevel, L, isIsolate) + case RLO: + stack.push(newLevel, R, isIsolate) + default: + stack.push(newLevel, ON, isIsolate) + } + // Not really part of the spec + if !isIsolate { + p.resultLevels[i] = newLevel + } + } else { + // This is an invalid explicit formatting character, + // so apply the "Otherwise" part of rules X2-X5b. + if isIsolate { + overflowIsolateCount++ + } else { // !isIsolate + if overflowIsolateCount == 0 { + overflowEmbeddingCount++ + } + } + } + + // Rule X6a + case PDI: + if overflowIsolateCount > 0 { + overflowIsolateCount-- + } else if validIsolateCount == 0 { + // do nothing + } else { + overflowEmbeddingCount = 0 + for !stack.lastDirectionalIsolateStatus() { + stack.pop() + } + stack.pop() + validIsolateCount-- + } + p.resultLevels[i] = stack.lastEmbeddingLevel() + + // Rule X7 + case PDF: + // Not really part of the spec + p.resultLevels[i] = stack.lastEmbeddingLevel() + + if overflowIsolateCount > 0 { + // do nothing + } else if overflowEmbeddingCount > 0 { + overflowEmbeddingCount-- + } else if !stack.lastDirectionalIsolateStatus() && stack.depth() >= 2 { + stack.pop() + } + + case B: // paragraph separator. + // Rule X8. + + // These values are reset for clarity, in this implementation B + // can only occur as the last code in the array. + stack.empty() + overflowIsolateCount = 0 + overflowEmbeddingCount = 0 + validIsolateCount = 0 + p.resultLevels[i] = p.embeddingLevel + + default: + p.resultLevels[i] = stack.lastEmbeddingLevel() + if stack.lastDirectionalOverrideStatus() != ON { + p.resultTypes[i] = stack.lastDirectionalOverrideStatus() + } + } + } +} + +type isolatingRunSequence struct { + p *paragraph + + indexes []int // indexes to the original string + + types []Class // type of each character using the index + resolvedLevels []level // resolved levels after application of rules + level level + sos, eos Class +} + +func (i *isolatingRunSequence) Len() int { return len(i.indexes) } + +func maxLevel(a, b level) level { + if a > b { + return a + } + return b +} + +// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types, +// either L or R, for each isolating run sequence. +func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence { + length := len(indexes) + types := make([]Class, length) + for i, x := range indexes { + types[i] = p.resultTypes[x] + } + + // assign level, sos and eos + prevChar := indexes[0] - 1 + for prevChar >= 0 && isRemovedByX9(p.initialTypes[prevChar]) { + prevChar-- + } + prevLevel := p.embeddingLevel + if prevChar >= 0 { + prevLevel = p.resultLevels[prevChar] + } + + var succLevel level + lastType := types[length-1] + if lastType.in(LRI, RLI, FSI) { + succLevel = p.embeddingLevel + } else { + // the first character after the end of run sequence + limit := indexes[length-1] + 1 + for ; limit < p.Len() && isRemovedByX9(p.initialTypes[limit]); limit++ { + + } + succLevel = p.embeddingLevel + if limit < p.Len() { + succLevel = p.resultLevels[limit] + } + } + level := p.resultLevels[indexes[0]] + return &isolatingRunSequence{ + p: p, + indexes: indexes, + types: types, + level: level, + sos: typeForLevel(maxLevel(prevLevel, level)), + eos: typeForLevel(maxLevel(succLevel, level)), + } +} + +// Resolving weak types Rules W1-W7. +// +// Note that some weak types (EN, AN) remain after this processing is +// complete. +func (s *isolatingRunSequence) resolveWeakTypes() { + + // on entry, only these types remain + s.assertOnly(L, R, AL, EN, ES, ET, AN, CS, B, S, WS, ON, NSM, LRI, RLI, FSI, PDI) + + // Rule W1. + // Changes all NSMs. + precedingCharacterType := s.sos + for i, t := range s.types { + if t == NSM { + s.types[i] = precedingCharacterType + } else { + if t.in(LRI, RLI, FSI, PDI) { + precedingCharacterType = ON + } + precedingCharacterType = t + } + } + + // Rule W2. + // EN does not change at the start of the run, because sos != AL. + for i, t := range s.types { + if t == EN { + for j := i - 1; j >= 0; j-- { + if t := s.types[j]; t.in(L, R, AL) { + if t == AL { + s.types[i] = AN + } + break + } + } + } + } + + // Rule W3. + for i, t := range s.types { + if t == AL { + s.types[i] = R + } + } + + // Rule W4. + // Since there must be values on both sides for this rule to have an + // effect, the scan skips the first and last value. + // + // Although the scan proceeds left to right, and changes the type + // values in a way that would appear to affect the computations + // later in the scan, there is actually no problem. A change in the + // current value can only affect the value to its immediate right, + // and only affect it if it is ES or CS. But the current value can + // only change if the value to its right is not ES or CS. Thus + // either the current value will not change, or its change will have + // no effect on the remainder of the analysis. + + for i := 1; i < s.Len()-1; i++ { + t := s.types[i] + if t == ES || t == CS { + prevSepType := s.types[i-1] + succSepType := s.types[i+1] + if prevSepType == EN && succSepType == EN { + s.types[i] = EN + } else if s.types[i] == CS && prevSepType == AN && succSepType == AN { + s.types[i] = AN + } + } + } + + // Rule W5. + for i, t := range s.types { + if t == ET { + // locate end of sequence + runStart := i + runEnd := s.findRunLimit(runStart, ET) + + // check values at ends of sequence + t := s.sos + if runStart > 0 { + t = s.types[runStart-1] + } + if t != EN { + t = s.eos + if runEnd < len(s.types) { + t = s.types[runEnd] + } + } + if t == EN { + setTypes(s.types[runStart:runEnd], EN) + } + // continue at end of sequence + i = runEnd + } + } + + // Rule W6. + for i, t := range s.types { + if t.in(ES, ET, CS) { + s.types[i] = ON + } + } + + // Rule W7. + for i, t := range s.types { + if t == EN { + // set default if we reach start of run + prevStrongType := s.sos + for j := i - 1; j >= 0; j-- { + t = s.types[j] + if t == L || t == R { // AL's have been changed to R + prevStrongType = t + break + } + } + if prevStrongType == L { + s.types[i] = L + } + } + } +} + +// 6) resolving neutral types Rules N1-N2. +func (s *isolatingRunSequence) resolveNeutralTypes() { + + // on entry, only these types can be in resultTypes + s.assertOnly(L, R, EN, AN, B, S, WS, ON, RLI, LRI, FSI, PDI) + + for i, t := range s.types { + switch t { + case WS, ON, B, S, RLI, LRI, FSI, PDI: + // find bounds of run of neutrals + runStart := i + runEnd := s.findRunLimit(runStart, B, S, WS, ON, RLI, LRI, FSI, PDI) + + // determine effective types at ends of run + var leadType, trailType Class + + // Note that the character found can only be L, R, AN, or + // EN. + if runStart == 0 { + leadType = s.sos + } else { + leadType = s.types[runStart-1] + if leadType.in(AN, EN) { + leadType = R + } + } + if runEnd == len(s.types) { + trailType = s.eos + } else { + trailType = s.types[runEnd] + if trailType.in(AN, EN) { + trailType = R + } + } + + var resolvedType Class + if leadType == trailType { + // Rule N1. + resolvedType = leadType + } else { + // Rule N2. + // Notice the embedding level of the run is used, not + // the paragraph embedding level. + resolvedType = typeForLevel(s.level) + } + + setTypes(s.types[runStart:runEnd], resolvedType) + + // skip over run of (former) neutrals + i = runEnd + } + } +} + +func setLevels(levels []level, newLevel level) { + for i := range levels { + levels[i] = newLevel + } +} + +func setTypes(types []Class, newType Class) { + for i := range types { + types[i] = newType + } +} + +// 7) resolving implicit embedding levels Rules I1, I2. +func (s *isolatingRunSequence) resolveImplicitLevels() { + + // on entry, only these types can be in resultTypes + s.assertOnly(L, R, EN, AN) + + s.resolvedLevels = make([]level, len(s.types)) + setLevels(s.resolvedLevels, s.level) + + if (s.level & 1) == 0 { // even level + for i, t := range s.types { + // Rule I1. + if t == L { + // no change + } else if t == R { + s.resolvedLevels[i] += 1 + } else { // t == AN || t == EN + s.resolvedLevels[i] += 2 + } + } + } else { // odd level + for i, t := range s.types { + // Rule I2. + if t == R { + // no change + } else { // t == L || t == AN || t == EN + s.resolvedLevels[i] += 1 + } + } + } +} + +// Applies the levels and types resolved in rules W1-I2 to the +// resultLevels array. +func (s *isolatingRunSequence) applyLevelsAndTypes() { + for i, x := range s.indexes { + s.p.resultTypes[x] = s.types[i] + s.p.resultLevels[x] = s.resolvedLevels[i] + } +} + +// Return the limit of the run consisting only of the types in validSet +// starting at index. This checks the value at index, and will return +// index if that value is not in validSet. +func (s *isolatingRunSequence) findRunLimit(index int, validSet ...Class) int { +loop: + for ; index < len(s.types); index++ { + t := s.types[index] + for _, valid := range validSet { + if t == valid { + continue loop + } + } + return index // didn't find a match in validSet + } + return len(s.types) +} + +// Algorithm validation. Assert that all values in types are in the +// provided set. +func (s *isolatingRunSequence) assertOnly(codes ...Class) { +loop: + for i, t := range s.types { + for _, c := range codes { + if t == c { + continue loop + } + } + log.Panicf("invalid bidi code %v present in assertOnly at position %d", t, s.indexes[i]) + } +} + +// determineLevelRuns returns an array of level runs. Each level run is +// described as an array of indexes into the input string. +// +// Determines the level runs. Rule X9 will be applied in determining the +// runs, in the way that makes sure the characters that are supposed to be +// removed are not included in the runs. +func (p *paragraph) determineLevelRuns() [][]int { + run := []int{} + allRuns := [][]int{} + currentLevel := implicitLevel + + for i := range p.initialTypes { + if !isRemovedByX9(p.initialTypes[i]) { + if p.resultLevels[i] != currentLevel { + // we just encountered a new run; wrap up last run + if currentLevel >= 0 { // only wrap it up if there was a run + allRuns = append(allRuns, run) + run = nil + } + // Start new run + currentLevel = p.resultLevels[i] + } + run = append(run, i) + } + } + // Wrap up the final run, if any + if len(run) > 0 { + allRuns = append(allRuns, run) + } + return allRuns +} + +// Definition BD13. Determine isolating run sequences. +func (p *paragraph) determineIsolatingRunSequences() []*isolatingRunSequence { + levelRuns := p.determineLevelRuns() + + // Compute the run that each character belongs to + runForCharacter := make([]int, p.Len()) + for i, run := range levelRuns { + for _, index := range run { + runForCharacter[index] = i + } + } + + sequences := []*isolatingRunSequence{} + + var currentRunSequence []int + + for _, run := range levelRuns { + first := run[0] + if p.initialTypes[first] != PDI || p.matchingIsolateInitiator[first] == -1 { + currentRunSequence = nil + // int run = i; + for { + // Copy this level run into currentRunSequence + currentRunSequence = append(currentRunSequence, run...) + + last := currentRunSequence[len(currentRunSequence)-1] + lastT := p.initialTypes[last] + if lastT.in(LRI, RLI, FSI) && p.matchingPDI[last] != p.Len() { + run = levelRuns[runForCharacter[p.matchingPDI[last]]] + } else { + break + } + } + sequences = append(sequences, p.isolatingRunSequence(currentRunSequence)) + } + } + return sequences +} + +// Assign level information to characters removed by rule X9. This is for +// ease of relating the level information to the original input data. Note +// that the levels assigned to these codes are arbitrary, they're chosen so +// as to avoid breaking level runs. +func (p *paragraph) assignLevelsToCharactersRemovedByX9() { + for i, t := range p.initialTypes { + if t.in(LRE, RLE, LRO, RLO, PDF, BN) { + p.resultTypes[i] = t + p.resultLevels[i] = -1 + } + } + // now propagate forward the levels information (could have + // propagated backward, the main thing is not to introduce a level + // break where one doesn't already exist). + + if p.resultLevels[0] == -1 { + p.resultLevels[0] = p.embeddingLevel + } + for i := 1; i < len(p.initialTypes); i++ { + if p.resultLevels[i] == -1 { + p.resultLevels[i] = p.resultLevels[i-1] + } + } + // Embedding information is for informational purposes only so need not be + // adjusted. +} + +// +// Output +// + +// getLevels computes levels array breaking lines at offsets in linebreaks. +// Rule L1. +// +// The linebreaks array must include at least one value. The values must be +// in strictly increasing order (no duplicates) between 1 and the length of +// the text, inclusive. The last value must be the length of the text. +func (p *paragraph) getLevels(linebreaks []int) []level { + // Note that since the previous processing has removed all + // P, S, and WS values from resultTypes, the values referred to + // in these rules are the initial types, before any processing + // has been applied (including processing of overrides). + // + // This example implementation has reinserted explicit format codes + // and BN, in order that the levels array correspond to the + // initial text. Their final placement is not normative. + // These codes are treated like WS in this implementation, + // so they don't interrupt sequences of WS. + + validateLineBreaks(linebreaks, p.Len()) + + result := append([]level(nil), p.resultLevels...) + + // don't worry about linebreaks since if there is a break within + // a series of WS values preceding S, the linebreak itself + // causes the reset. + for i, t := range p.initialTypes { + if t.in(B, S) { + // Rule L1, clauses one and two. + result[i] = p.embeddingLevel + + // Rule L1, clause three. + for j := i - 1; j >= 0; j-- { + if isWhitespace(p.initialTypes[j]) { // including format codes + result[j] = p.embeddingLevel + } else { + break + } + } + } + } + + // Rule L1, clause four. + start := 0 + for _, limit := range linebreaks { + for j := limit - 1; j >= start; j-- { + if isWhitespace(p.initialTypes[j]) { // including format codes + result[j] = p.embeddingLevel + } else { + break + } + } + start = limit + } + + return result +} + +// getReordering returns the reordering of lines from a visual index to a +// logical index for line breaks at the given offsets. +// +// Lines are concatenated from left to right. So for example, the fifth +// character from the left on the third line is +// +// getReordering(linebreaks)[linebreaks[1] + 4] +// +// (linebreaks[1] is the position after the last character of the second +// line, which is also the index of the first character on the third line, +// and adding four gets the fifth character from the left). +// +// The linebreaks array must include at least one value. The values must be +// in strictly increasing order (no duplicates) between 1 and the length of +// the text, inclusive. The last value must be the length of the text. +func (p *paragraph) getReordering(linebreaks []int) []int { + validateLineBreaks(linebreaks, p.Len()) + + return computeMultilineReordering(p.getLevels(linebreaks), linebreaks) +} + +// Return multiline reordering array for a given level array. Reordering +// does not occur across a line break. +func computeMultilineReordering(levels []level, linebreaks []int) []int { + result := make([]int, len(levels)) + + start := 0 + for _, limit := range linebreaks { + tempLevels := make([]level, limit-start) + copy(tempLevels, levels[start:]) + + for j, order := range computeReordering(tempLevels) { + result[start+j] = order + start + } + start = limit + } + return result +} + +// Return reordering array for a given level array. This reorders a single +// line. The reordering is a visual to logical map. For example, the +// leftmost char is string.charAt(order[0]). Rule L2. +func computeReordering(levels []level) []int { + result := make([]int, len(levels)) + // initialize order + for i := range result { + result[i] = i + } + + // locate highest level found on line. + // Note the rules say text, but no reordering across line bounds is + // performed, so this is sufficient. + highestLevel := level(0) + lowestOddLevel := level(maxDepth + 2) + for _, level := range levels { + if level > highestLevel { + highestLevel = level + } + if level&1 != 0 && level < lowestOddLevel { + lowestOddLevel = level + } + } + + for level := highestLevel; level >= lowestOddLevel; level-- { + for i := 0; i < len(levels); i++ { + if levels[i] >= level { + // find range of text at or above this level + start := i + limit := i + 1 + for limit < len(levels) && levels[limit] >= level { + limit++ + } + + for j, k := start, limit-1; j < k; j, k = j+1, k-1 { + result[j], result[k] = result[k], result[j] + } + // skip to end of level run + i = limit + } + } + } + + return result +} + +// isWhitespace reports whether the type is considered a whitespace type for the +// line break rules. +func isWhitespace(c Class) bool { + switch c { + case LRE, RLE, LRO, RLO, PDF, LRI, RLI, FSI, PDI, BN, WS: + return true + } + return false +} + +// isRemovedByX9 reports whether the type is one of the types removed in X9. +func isRemovedByX9(c Class) bool { + switch c { + case LRE, RLE, LRO, RLO, PDF, BN: + return true + } + return false +} + +// typeForLevel reports the strong type (L or R) corresponding to the level. +func typeForLevel(level level) Class { + if (level & 0x1) == 0 { + return L + } + return R +} + +// TODO: change validation to not panic + +func validateTypes(types []Class) { + if len(types) == 0 { + log.Panic("types is null") + } + for i, t := range types[:len(types)-1] { + if t == B { + log.Panicf("B type before end of paragraph at index: %d", i) + } + } +} + +func validateParagraphEmbeddingLevel(embeddingLevel level) { + if embeddingLevel != implicitLevel && + embeddingLevel != 0 && + embeddingLevel != 1 { + log.Panicf("illegal paragraph embedding level: %d", embeddingLevel) + } +} + +func validateLineBreaks(linebreaks []int, textLength int) { + prev := 0 + for i, next := range linebreaks { + if next <= prev { + log.Panicf("bad linebreak: %d at index: %d", next, i) + } + prev = next + } + if prev != textLength { + log.Panicf("last linebreak was %d, want %d", prev, textLength) + } +} + +func validatePbTypes(pairTypes []bracketType) { + if len(pairTypes) == 0 { + log.Panic("pairTypes is null") + } + for i, pt := range pairTypes { + switch pt { + case bpNone, bpOpen, bpClose: + default: + log.Panicf("illegal pairType value at %d: %v", i, pairTypes[i]) + } + } +} + +func validatePbValues(pairValues []rune, pairTypes []bracketType) { + if pairValues == nil { + log.Panic("pairValues is null") + } + if len(pairTypes) != len(pairValues) { + log.Panic("pairTypes is different length from pairValues") + } +} diff --git a/vendor/golang.org/x/text/unicode/bidi/prop.go b/vendor/golang.org/x/text/unicode/bidi/prop.go new file mode 100644 index 00000000..7c9484e1 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/prop.go @@ -0,0 +1,206 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bidi + +import "unicode/utf8" + +// Properties provides access to BiDi properties of runes. +type Properties struct { + entry uint8 + last uint8 +} + +var trie = newBidiTrie(0) + +// TODO: using this for bidirule reduces the running time by about 5%. Consider +// if this is worth exposing or if we can find a way to speed up the Class +// method. +// +// // CompactClass is like Class, but maps all of the BiDi control classes +// // (LRO, RLO, LRE, RLE, PDF, LRI, RLI, FSI, PDI) to the class Control. +// func (p Properties) CompactClass() Class { +// return Class(p.entry & 0x0F) +// } + +// Class returns the Bidi class for p. +func (p Properties) Class() Class { + c := Class(p.entry & 0x0F) + if c == Control { + c = controlByteToClass[p.last&0xF] + } + return c +} + +// IsBracket reports whether the rune is a bracket. +func (p Properties) IsBracket() bool { return p.entry&0xF0 != 0 } + +// IsOpeningBracket reports whether the rune is an opening bracket. +// IsBracket must return true. +func (p Properties) IsOpeningBracket() bool { return p.entry&openMask != 0 } + +// TODO: find a better API and expose. +func (p Properties) reverseBracket(r rune) rune { + return xorMasks[p.entry>>xorMaskShift] ^ r +} + +var controlByteToClass = [16]Class{ + 0xD: LRO, // U+202D LeftToRightOverride, + 0xE: RLO, // U+202E RightToLeftOverride, + 0xA: LRE, // U+202A LeftToRightEmbedding, + 0xB: RLE, // U+202B RightToLeftEmbedding, + 0xC: PDF, // U+202C PopDirectionalFormat, + 0x6: LRI, // U+2066 LeftToRightIsolate, + 0x7: RLI, // U+2067 RightToLeftIsolate, + 0x8: FSI, // U+2068 FirstStrongIsolate, + 0x9: PDI, // U+2069 PopDirectionalIsolate, +} + +// LookupRune returns properties for r. +func LookupRune(r rune) (p Properties, size int) { + var buf [4]byte + n := utf8.EncodeRune(buf[:], r) + return Lookup(buf[:n]) +} + +// TODO: these lookup methods are based on the generated trie code. The returned +// sizes have slightly different semantics from the generated code, in that it +// always returns size==1 for an illegal UTF-8 byte (instead of the length +// of the maximum invalid subsequence). Most Transformers, like unicode/norm, +// leave invalid UTF-8 untouched, in which case it has performance benefits to +// do so (without changing the semantics). Bidi requires the semantics used here +// for the bidirule implementation to be compatible with the Go semantics. +// They ultimately should perhaps be adopted by all trie implementations, for +// convenience sake. +// This unrolled code also boosts performance of the secure/bidirule package by +// about 30%. +// So, to remove this code: +// - add option to trie generator to define return type. +// - always return 1 byte size for ill-formed UTF-8 runes. + +// Lookup returns properties for the first rune in s and the width in bytes of +// its encoding. The size will be 0 if s does not hold enough bytes to complete +// the encoding. +func Lookup(s []byte) (p Properties, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return Properties{entry: bidiValues[c0]}, 1 + case c0 < 0xC2: + return Properties{}, 1 + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return Properties{}, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return Properties{}, 1 + } + return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return Properties{}, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return Properties{}, 1 + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return Properties{}, 1 + } + return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return Properties{}, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return Properties{}, 1 + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return Properties{}, 1 + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return Properties{}, 1 + } + return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4 + } + // Illegal rune + return Properties{}, 1 +} + +// LookupString returns properties for the first rune in s and the width in +// bytes of its encoding. The size will be 0 if s does not hold enough bytes to +// complete the encoding. +func LookupString(s string) (p Properties, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return Properties{entry: bidiValues[c0]}, 1 + case c0 < 0xC2: + return Properties{}, 1 + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return Properties{}, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return Properties{}, 1 + } + return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return Properties{}, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return Properties{}, 1 + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return Properties{}, 1 + } + return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return Properties{}, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return Properties{}, 1 + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return Properties{}, 1 + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return Properties{}, 1 + } + return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4 + } + // Illegal rune + return Properties{}, 1 +} diff --git a/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go new file mode 100644 index 00000000..d8c94e1b --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go @@ -0,0 +1,1815 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// +build go1.10,!go1.13 + +package bidi + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "10.0.0" + +// xorMasks contains masks to be xor-ed with brackets to get the reverse +// version. +var xorMasks = []int32{ // 8 elements + 0, 1, 6, 7, 3, 15, 29, 63, +} // Size: 56 bytes + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// bidiTrie. Total size: 16128 bytes (15.75 KiB). Checksum: 8122d83e461996f. +type bidiTrie struct{} + +func newBidiTrie(i int) *bidiTrie { + return &bidiTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(bidiValues[n<<6+uint32(b)]) + } +} + +// bidiValues: 228 blocks, 14592 entries, 14592 bytes +// The third block is the zero block. +var bidiValues = [14592]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, + 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, + 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, + 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, + 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, + 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, + 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, + 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, + 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, + 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, + 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, + // Block 0x1, offset 0x40 + 0x40: 0x000a, + 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, + 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, + 0x7b: 0x005a, + 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, + 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, + 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, + 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, + 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, + 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, + 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, + 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, + 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, + 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, + 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, + // Block 0x4, offset 0x100 + 0x117: 0x000a, + 0x137: 0x000a, + // Block 0x5, offset 0x140 + 0x179: 0x000a, 0x17a: 0x000a, + // Block 0x6, offset 0x180 + 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, + 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, + 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, + 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, + 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, + 0x19e: 0x000a, 0x19f: 0x000a, + 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, + 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, + 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, + 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, + 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, + 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, + 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, + 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, + 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, + 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, + 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, + 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, + 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, + 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, + 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, + // Block 0x8, offset 0x200 + 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, + 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, + 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, + 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, + 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, + 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, + 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, + 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, + 0x234: 0x000a, 0x235: 0x000a, + 0x23e: 0x000a, + // Block 0x9, offset 0x240 + 0x244: 0x000a, 0x245: 0x000a, + 0x247: 0x000a, + // Block 0xa, offset 0x280 + 0x2b6: 0x000a, + // Block 0xb, offset 0x2c0 + 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, + 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, + // Block 0xc, offset 0x300 + 0x30a: 0x000a, + 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, + 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, + 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, + 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, + 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, + 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, + 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, + 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, + 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, + // Block 0xd, offset 0x340 + 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, + 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, + 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, + 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, + 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, + 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, + 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, + 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, + 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, + 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, + 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, + // Block 0xe, offset 0x380 + 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, + 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, + 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, + 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, + 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, + 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, + 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, + 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, + 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, + 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, + 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, + 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, + 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, + 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, + 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, + 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, + 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, + 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, + 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, + 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, + 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, + // Block 0x10, offset 0x400 + 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, + 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, + 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, + 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, + 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, + 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, + 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, + 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, + 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, + 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, + 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, + // Block 0x11, offset 0x440 + 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, + 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, + 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, + 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, + 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, + 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, + 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, + 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, + 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, + 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, + 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, + // Block 0x12, offset 0x480 + 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, + 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, + 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, + 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, + 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, + 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, + 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, + 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, + 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, + 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, + 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, + 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, + 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, + 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, + 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, + 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, + 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, + 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, + 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, + 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, + 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, + // Block 0x14, offset 0x500 + 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, + 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, + 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, + 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, + 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, + 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, + 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, + 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, + 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, + 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, + 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, + // Block 0x15, offset 0x540 + 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, + 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, + 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, + 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, + 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, + 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, + 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, + 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, + 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, + 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, + 0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001, + // Block 0x16, offset 0x580 + 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, + 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, + 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, + 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, + 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, + 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, + 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, + 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, + 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, + 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, + 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, + 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, + 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, + 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, + 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, + 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d, + 0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d, + 0x5ea: 0x000d, 0x5eb: 0x000d, 0x5ec: 0x000d, 0x5ed: 0x000d, 0x5ee: 0x000d, 0x5ef: 0x000d, + 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001, + 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001, + 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001, + // Block 0x18, offset 0x600 + 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001, + 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001, + 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001, + 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, + 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001, + 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, + 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, + 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, + 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, + 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, + 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, + // Block 0x19, offset 0x640 + 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, + 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d, + 0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d, + 0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, + 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, + 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, + 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, + 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, + 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, + 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, + 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, + // Block 0x1a, offset 0x680 + 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, + 0x6ba: 0x000c, + 0x6bc: 0x000c, + // Block 0x1b, offset 0x6c0 + 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, + 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, + 0x6cd: 0x000c, 0x6d1: 0x000c, + 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, + 0x6e2: 0x000c, 0x6e3: 0x000c, + // Block 0x1c, offset 0x700 + 0x701: 0x000c, + 0x73c: 0x000c, + // Block 0x1d, offset 0x740 + 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, + 0x74d: 0x000c, + 0x762: 0x000c, 0x763: 0x000c, + 0x772: 0x0004, 0x773: 0x0004, + 0x77b: 0x0004, + // Block 0x1e, offset 0x780 + 0x781: 0x000c, 0x782: 0x000c, + 0x7bc: 0x000c, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x000c, 0x7c2: 0x000c, + 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, + 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, + 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, + // Block 0x20, offset 0x800 + 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, + 0x807: 0x000c, 0x808: 0x000c, + 0x80d: 0x000c, + 0x822: 0x000c, 0x823: 0x000c, + 0x831: 0x0004, + 0x83a: 0x000c, 0x83b: 0x000c, + 0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c, + // Block 0x21, offset 0x840 + 0x841: 0x000c, + 0x87c: 0x000c, 0x87f: 0x000c, + // Block 0x22, offset 0x880 + 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, + 0x88d: 0x000c, + 0x896: 0x000c, + 0x8a2: 0x000c, 0x8a3: 0x000c, + // Block 0x23, offset 0x8c0 + 0x8c2: 0x000c, + // Block 0x24, offset 0x900 + 0x900: 0x000c, + 0x90d: 0x000c, + 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, + 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, + // Block 0x25, offset 0x940 + 0x940: 0x000c, + 0x97e: 0x000c, 0x97f: 0x000c, + // Block 0x26, offset 0x980 + 0x980: 0x000c, + 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, + 0x98c: 0x000c, 0x98d: 0x000c, + 0x995: 0x000c, 0x996: 0x000c, + 0x9a2: 0x000c, 0x9a3: 0x000c, + 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, + 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, + // Block 0x27, offset 0x9c0 + 0x9cc: 0x000c, 0x9cd: 0x000c, + 0x9e2: 0x000c, 0x9e3: 0x000c, + // Block 0x28, offset 0xa00 + 0xa00: 0x000c, 0xa01: 0x000c, + 0xa3b: 0x000c, + 0xa3c: 0x000c, + // Block 0x29, offset 0xa40 + 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, + 0xa4d: 0x000c, + 0xa62: 0x000c, 0xa63: 0x000c, + // Block 0x2a, offset 0xa80 + 0xa8a: 0x000c, + 0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c, + // Block 0x2b, offset 0xac0 + 0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c, + 0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c, + 0xaff: 0x0004, + // Block 0x2c, offset 0xb00 + 0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c, + 0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c, + // Block 0x2d, offset 0xb40 + 0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c, + 0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c, + 0xb7c: 0x000c, + // Block 0x2e, offset 0xb80 + 0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c, + 0xb8c: 0x000c, 0xb8d: 0x000c, + // Block 0x2f, offset 0xbc0 + 0xbd8: 0x000c, 0xbd9: 0x000c, + 0xbf5: 0x000c, + 0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a, + 0xbfc: 0x003a, 0xbfd: 0x002a, + // Block 0x30, offset 0xc00 + 0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c, + 0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c, + 0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c, + // Block 0x31, offset 0xc40 + 0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c, + 0xc46: 0x000c, 0xc47: 0x000c, + 0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c, + 0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c, + 0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c, + 0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c, + 0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c, + 0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c, + 0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, + 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, + 0xc7c: 0x000c, + // Block 0x32, offset 0xc80 + 0xc86: 0x000c, + // Block 0x33, offset 0xcc0 + 0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c, + 0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c, + 0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c, + 0xcfd: 0x000c, 0xcfe: 0x000c, + // Block 0x34, offset 0xd00 + 0xd18: 0x000c, 0xd19: 0x000c, + 0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c, + 0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, + // Block 0x35, offset 0xd40 + 0xd42: 0x000c, 0xd45: 0x000c, + 0xd46: 0x000c, + 0xd4d: 0x000c, + 0xd5d: 0x000c, + // Block 0x36, offset 0xd80 + 0xd9d: 0x000c, + 0xd9e: 0x000c, 0xd9f: 0x000c, + // Block 0x37, offset 0xdc0 + 0xdd0: 0x000a, 0xdd1: 0x000a, + 0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a, + 0xdd8: 0x000a, 0xdd9: 0x000a, + // Block 0x38, offset 0xe00 + 0xe00: 0x000a, + // Block 0x39, offset 0xe40 + 0xe40: 0x0009, + 0xe5b: 0x007a, 0xe5c: 0x006a, + // Block 0x3a, offset 0xe80 + 0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c, + 0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c, + // Block 0x3b, offset 0xec0 + 0xed2: 0x000c, 0xed3: 0x000c, + 0xef2: 0x000c, 0xef3: 0x000c, + // Block 0x3c, offset 0xf00 + 0xf34: 0x000c, 0xf35: 0x000c, + 0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c, + 0xf3c: 0x000c, 0xf3d: 0x000c, + // Block 0x3d, offset 0xf40 + 0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c, + 0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c, + 0xf52: 0x000c, 0xf53: 0x000c, + 0xf5b: 0x0004, 0xf5d: 0x000c, + 0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a, + 0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a, + // Block 0x3e, offset 0xf80 + 0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a, + 0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c, + 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b, + // Block 0x3f, offset 0xfc0 + 0xfc5: 0x000c, + 0xfc6: 0x000c, + 0xfe9: 0x000c, + // Block 0x40, offset 0x1000 + 0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c, + 0x1027: 0x000c, 0x1028: 0x000c, + 0x1032: 0x000c, + 0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c, + // Block 0x41, offset 0x1040 + 0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a, + // Block 0x42, offset 0x1080 + 0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a, + 0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a, + 0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a, + 0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a, + 0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a, + 0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a, + // Block 0x43, offset 0x10c0 + 0x10d7: 0x000c, + 0x10d8: 0x000c, 0x10db: 0x000c, + // Block 0x44, offset 0x1100 + 0x1116: 0x000c, + 0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c, + 0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c, + 0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c, + 0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c, + 0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c, + 0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c, + 0x113c: 0x000c, 0x113f: 0x000c, + // Block 0x45, offset 0x1140 + 0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, + 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, + 0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c, + // Block 0x46, offset 0x1180 + 0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c, + 0x11b4: 0x000c, + 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, + 0x11bc: 0x000c, + // Block 0x47, offset 0x11c0 + 0x11c2: 0x000c, + 0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c, + 0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c, + // Block 0x48, offset 0x1200 + 0x1200: 0x000c, 0x1201: 0x000c, + 0x1222: 0x000c, 0x1223: 0x000c, + 0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c, + 0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c, + // Block 0x49, offset 0x1240 + 0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c, + 0x126d: 0x000c, 0x126f: 0x000c, + 0x1270: 0x000c, 0x1271: 0x000c, + // Block 0x4a, offset 0x1280 + 0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c, + 0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c, + 0x12b6: 0x000c, 0x12b7: 0x000c, + // Block 0x4b, offset 0x12c0 + 0x12d0: 0x000c, 0x12d1: 0x000c, + 0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c, + 0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c, + 0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c, + 0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c, + 0x12ed: 0x000c, + 0x12f4: 0x000c, + 0x12f8: 0x000c, 0x12f9: 0x000c, + // Block 0x4c, offset 0x1300 + 0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c, + 0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c, + 0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c, + 0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c, + 0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c, + 0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c, + 0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c, + 0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, + 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c, + 0x1336: 0x000c, 0x1337: 0x000c, 0x1338: 0x000c, 0x1339: 0x000c, 0x133b: 0x000c, + 0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c, + // Block 0x4d, offset 0x1340 + 0x137d: 0x000a, 0x137f: 0x000a, + // Block 0x4e, offset 0x1380 + 0x1380: 0x000a, 0x1381: 0x000a, + 0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a, + 0x139d: 0x000a, + 0x139e: 0x000a, 0x139f: 0x000a, + 0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a, + 0x13bd: 0x000a, 0x13be: 0x000a, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009, + 0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b, + 0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a, + 0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a, + 0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a, + 0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a, + 0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007, + 0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006, + 0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a, + 0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a, + 0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a, + // Block 0x50, offset 0x1400 + 0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a, + 0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a, + 0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a, + 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, + 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, + 0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b, + 0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e, + 0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b, + 0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002, + 0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003, + 0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a, + // Block 0x51, offset 0x1440 + 0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002, + 0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003, + 0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a, + 0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004, + 0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004, + 0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004, + 0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004, + 0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004, + 0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004, + // Block 0x52, offset 0x1480 + 0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004, + 0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004, + 0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c, + 0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c, + 0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c, + 0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c, + 0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c, + 0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c, + 0x14b0: 0x000c, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a, + 0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a, + 0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a, + 0x14d8: 0x000a, + 0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a, + 0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a, + 0x14ee: 0x0004, + 0x14fa: 0x000a, 0x14fb: 0x000a, + // Block 0x54, offset 0x1500 + 0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, + 0x150a: 0x000a, 0x150b: 0x000a, + 0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a, + 0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, + 0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a, + 0x151e: 0x000a, 0x151f: 0x000a, + // Block 0x55, offset 0x1540 + 0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a, + 0x1550: 0x000a, 0x1551: 0x000a, + 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, + 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, + 0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a, + 0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a, + 0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a, + 0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a, + 0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a, + 0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a, + // Block 0x56, offset 0x1580 + 0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a, + 0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, + 0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a, + 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, + 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, + 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, + 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, + 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, + 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, + 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, + 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, + 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, + 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, + 0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, + 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, + 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, + 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, + 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, + 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, + 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, + 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, + // Block 0x58, offset 0x1600 + 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, + 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a, + 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, + 0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, + 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, + 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, + 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a, + 0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, + 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, + // Block 0x59, offset 0x1640 + 0x167b: 0x000a, + 0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a, + // Block 0x5a, offset 0x1680 + 0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a, + 0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a, + 0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a, + 0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a, + 0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a, + 0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a, + 0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a, + 0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a, + 0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a, + 0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a, + 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, + 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, + 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, + 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, + 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, + 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, + 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, + // Block 0x5c, offset 0x1700 + 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, + 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, + 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, + 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, 0x1727: 0x000a, 0x1728: 0x000a, 0x1729: 0x000a, + 0x172a: 0x000a, 0x172b: 0x000a, 0x172c: 0x000a, 0x172d: 0x000a, 0x172e: 0x000a, 0x172f: 0x000a, + 0x1730: 0x000a, 0x1731: 0x000a, 0x1732: 0x000a, 0x1733: 0x000a, 0x1734: 0x000a, 0x1735: 0x000a, + 0x1736: 0x000a, 0x1737: 0x000a, 0x1738: 0x000a, 0x1739: 0x000a, 0x173a: 0x000a, 0x173b: 0x000a, + 0x173c: 0x000a, 0x173d: 0x000a, 0x173e: 0x000a, 0x173f: 0x000a, + // Block 0x5d, offset 0x1740 + 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, + 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x0002, 0x1749: 0x0002, 0x174a: 0x0002, 0x174b: 0x0002, + 0x174c: 0x0002, 0x174d: 0x0002, 0x174e: 0x0002, 0x174f: 0x0002, 0x1750: 0x0002, 0x1751: 0x0002, + 0x1752: 0x0002, 0x1753: 0x0002, 0x1754: 0x0002, 0x1755: 0x0002, 0x1756: 0x0002, 0x1757: 0x0002, + 0x1758: 0x0002, 0x1759: 0x0002, 0x175a: 0x0002, 0x175b: 0x0002, + // Block 0x5e, offset 0x1780 + 0x17aa: 0x000a, 0x17ab: 0x000a, 0x17ac: 0x000a, 0x17ad: 0x000a, 0x17ae: 0x000a, 0x17af: 0x000a, + 0x17b0: 0x000a, 0x17b1: 0x000a, 0x17b2: 0x000a, 0x17b3: 0x000a, 0x17b4: 0x000a, 0x17b5: 0x000a, + 0x17b6: 0x000a, 0x17b7: 0x000a, 0x17b8: 0x000a, 0x17b9: 0x000a, 0x17ba: 0x000a, 0x17bb: 0x000a, + 0x17bc: 0x000a, 0x17bd: 0x000a, 0x17be: 0x000a, 0x17bf: 0x000a, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x000a, 0x17c1: 0x000a, 0x17c2: 0x000a, 0x17c3: 0x000a, 0x17c4: 0x000a, 0x17c5: 0x000a, + 0x17c6: 0x000a, 0x17c7: 0x000a, 0x17c8: 0x000a, 0x17c9: 0x000a, 0x17ca: 0x000a, 0x17cb: 0x000a, + 0x17cc: 0x000a, 0x17cd: 0x000a, 0x17ce: 0x000a, 0x17cf: 0x000a, 0x17d0: 0x000a, 0x17d1: 0x000a, + 0x17d2: 0x000a, 0x17d3: 0x000a, 0x17d4: 0x000a, 0x17d5: 0x000a, 0x17d6: 0x000a, 0x17d7: 0x000a, + 0x17d8: 0x000a, 0x17d9: 0x000a, 0x17da: 0x000a, 0x17db: 0x000a, 0x17dc: 0x000a, 0x17dd: 0x000a, + 0x17de: 0x000a, 0x17df: 0x000a, 0x17e0: 0x000a, 0x17e1: 0x000a, 0x17e2: 0x000a, 0x17e3: 0x000a, + 0x17e4: 0x000a, 0x17e5: 0x000a, 0x17e6: 0x000a, 0x17e7: 0x000a, 0x17e8: 0x000a, 0x17e9: 0x000a, + 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, + 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, + 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, + 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, + // Block 0x60, offset 0x1800 + 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, + 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, + 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, + 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, + 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, + 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, + 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x003a, 0x1829: 0x002a, + 0x182a: 0x003a, 0x182b: 0x002a, 0x182c: 0x003a, 0x182d: 0x002a, 0x182e: 0x003a, 0x182f: 0x002a, + 0x1830: 0x003a, 0x1831: 0x002a, 0x1832: 0x003a, 0x1833: 0x002a, 0x1834: 0x003a, 0x1835: 0x002a, + 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, + 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, + // Block 0x61, offset 0x1840 + 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x009a, + 0x1846: 0x008a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, + 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, + 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, + 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, + 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, + 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x003a, 0x1867: 0x002a, 0x1868: 0x003a, 0x1869: 0x002a, + 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, + 0x1870: 0x000a, 0x1871: 0x000a, 0x1872: 0x000a, 0x1873: 0x000a, 0x1874: 0x000a, 0x1875: 0x000a, + 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, + 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, + // Block 0x62, offset 0x1880 + 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x007a, 0x1884: 0x006a, 0x1885: 0x009a, + 0x1886: 0x008a, 0x1887: 0x00ba, 0x1888: 0x00aa, 0x1889: 0x009a, 0x188a: 0x008a, 0x188b: 0x007a, + 0x188c: 0x006a, 0x188d: 0x00da, 0x188e: 0x002a, 0x188f: 0x003a, 0x1890: 0x00ca, 0x1891: 0x009a, + 0x1892: 0x008a, 0x1893: 0x007a, 0x1894: 0x006a, 0x1895: 0x009a, 0x1896: 0x008a, 0x1897: 0x00ba, + 0x1898: 0x00aa, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, + 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, + 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x000a, 0x18a7: 0x000a, 0x18a8: 0x000a, 0x18a9: 0x000a, + 0x18aa: 0x000a, 0x18ab: 0x000a, 0x18ac: 0x000a, 0x18ad: 0x000a, 0x18ae: 0x000a, 0x18af: 0x000a, + 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, + 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, + 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x000a, 0x18c4: 0x000a, 0x18c5: 0x000a, + 0x18c6: 0x000a, 0x18c7: 0x000a, 0x18c8: 0x000a, 0x18c9: 0x000a, 0x18ca: 0x000a, 0x18cb: 0x000a, + 0x18cc: 0x000a, 0x18cd: 0x000a, 0x18ce: 0x000a, 0x18cf: 0x000a, 0x18d0: 0x000a, 0x18d1: 0x000a, + 0x18d2: 0x000a, 0x18d3: 0x000a, 0x18d4: 0x000a, 0x18d5: 0x000a, 0x18d6: 0x000a, 0x18d7: 0x000a, + 0x18d8: 0x003a, 0x18d9: 0x002a, 0x18da: 0x003a, 0x18db: 0x002a, 0x18dc: 0x000a, 0x18dd: 0x000a, + 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, + 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, + 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, + 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, + 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, + 0x18fc: 0x003a, 0x18fd: 0x002a, 0x18fe: 0x000a, 0x18ff: 0x000a, + // Block 0x64, offset 0x1900 + 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, + 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, + 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, + 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, + 0x1918: 0x000a, 0x1919: 0x000a, 0x191a: 0x000a, 0x191b: 0x000a, 0x191c: 0x000a, 0x191d: 0x000a, + 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, + 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, + 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, + 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, + 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, + 0x193c: 0x000a, 0x193d: 0x000a, 0x193e: 0x000a, 0x193f: 0x000a, + // Block 0x65, offset 0x1940 + 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, + 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, + 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, + 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, + 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, + 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, + 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, + 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, + 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, 0x1974: 0x000a, 0x1975: 0x000a, + 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, + 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, + // Block 0x66, offset 0x1980 + 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, + 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, + 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, + 0x1992: 0x000a, + 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, + // Block 0x67, offset 0x19c0 + 0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a, + 0x19ea: 0x000a, 0x19ef: 0x000c, + 0x19f0: 0x000c, 0x19f1: 0x000c, + 0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a, + 0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a, + // Block 0x68, offset 0x1a00 + 0x1a3f: 0x000c, + // Block 0x69, offset 0x1a40 + 0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c, + 0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c, + 0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c, + 0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c, + 0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c, + 0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a, + 0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a, + 0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a, + 0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a, + 0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a, + 0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a, + 0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a, + 0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a, + 0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a, + 0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a, + 0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, + 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a, + 0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a, + 0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a, + 0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a, + 0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a, + 0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a, + 0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a, + 0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a, + 0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a, + 0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a, + 0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, + 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, + 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, + 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, + 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, + 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, + 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, + 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, + 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, + 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, + 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, + 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, + 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a, + 0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, + 0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a, + 0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a, + 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a, + 0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a, + 0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a, + 0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c, + 0x1bf0: 0x000a, + 0x1bf6: 0x000a, 0x1bf7: 0x000a, + 0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a, + // Block 0x70, offset 0x1c00 + 0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a, + 0x1c20: 0x000a, + // Block 0x71, offset 0x1c40 + 0x1c7b: 0x000a, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a, + 0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a, + 0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a, + 0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a, + 0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a, + 0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a, + // Block 0x73, offset 0x1cc0 + 0x1cdd: 0x000a, + 0x1cde: 0x000a, + // Block 0x74, offset 0x1d00 + 0x1d10: 0x000a, 0x1d11: 0x000a, + 0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a, + 0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a, + 0x1d1e: 0x000a, 0x1d1f: 0x000a, + 0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a, + // Block 0x75, offset 0x1d40 + 0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a, + 0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a, + 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a, + // Block 0x76, offset 0x1d80 + 0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a, + // Block 0x77, offset 0x1dc0 + 0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a, + // Block 0x78, offset 0x1e00 + 0x1e1e: 0x000a, 0x1e1f: 0x000a, + 0x1e3f: 0x000a, + // Block 0x79, offset 0x1e40 + 0x1e50: 0x000a, 0x1e51: 0x000a, + 0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a, + 0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a, + 0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a, + 0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a, + 0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a, + 0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a, + 0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a, + 0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a, + 0x1e86: 0x000a, + // Block 0x7b, offset 0x1ec0 + 0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a, + // Block 0x7c, offset 0x1f00 + 0x1f2f: 0x000c, + 0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c, + 0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c, + 0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a, + // Block 0x7d, offset 0x1f40 + 0x1f5e: 0x000c, 0x1f5f: 0x000c, + // Block 0x7e, offset 0x1f80 + 0x1fb0: 0x000c, 0x1fb1: 0x000c, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a, + 0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a, + 0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a, + 0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a, + 0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a, + 0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a, + // Block 0x80, offset 0x2000 + 0x2008: 0x000a, + // Block 0x81, offset 0x2040 + 0x2042: 0x000c, + 0x2046: 0x000c, 0x204b: 0x000c, + 0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a, + 0x206a: 0x000a, 0x206b: 0x000a, + 0x2078: 0x0004, 0x2079: 0x0004, + // Block 0x82, offset 0x2080 + 0x20b4: 0x000a, 0x20b5: 0x000a, + 0x20b6: 0x000a, 0x20b7: 0x000a, + // Block 0x83, offset 0x20c0 + 0x20c4: 0x000c, 0x20c5: 0x000c, + 0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c, + 0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c, + 0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c, + 0x20f0: 0x000c, 0x20f1: 0x000c, + // Block 0x84, offset 0x2100 + 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, + 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, + // Block 0x85, offset 0x2140 + 0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c, + 0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c, + // Block 0x86, offset 0x2180 + 0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c, + 0x21b3: 0x000c, + 0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c, + 0x21bc: 0x000c, + // Block 0x87, offset 0x21c0 + 0x21e5: 0x000c, + // Block 0x88, offset 0x2200 + 0x2229: 0x000c, + 0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c, + 0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c, + 0x2236: 0x000c, + // Block 0x89, offset 0x2240 + 0x2243: 0x000c, + 0x224c: 0x000c, + 0x227c: 0x000c, + // Block 0x8a, offset 0x2280 + 0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c, + 0x22b7: 0x000c, 0x22b8: 0x000c, + 0x22be: 0x000c, 0x22bf: 0x000c, + // Block 0x8b, offset 0x22c0 + 0x22c1: 0x000c, + 0x22ec: 0x000c, 0x22ed: 0x000c, + 0x22f6: 0x000c, + // Block 0x8c, offset 0x2300 + 0x2325: 0x000c, 0x2328: 0x000c, + 0x232d: 0x000c, + // Block 0x8d, offset 0x2340 + 0x235d: 0x0001, + 0x235e: 0x000c, 0x235f: 0x0001, 0x2360: 0x0001, 0x2361: 0x0001, 0x2362: 0x0001, 0x2363: 0x0001, + 0x2364: 0x0001, 0x2365: 0x0001, 0x2366: 0x0001, 0x2367: 0x0001, 0x2368: 0x0001, 0x2369: 0x0003, + 0x236a: 0x0001, 0x236b: 0x0001, 0x236c: 0x0001, 0x236d: 0x0001, 0x236e: 0x0001, 0x236f: 0x0001, + 0x2370: 0x0001, 0x2371: 0x0001, 0x2372: 0x0001, 0x2373: 0x0001, 0x2374: 0x0001, 0x2375: 0x0001, + 0x2376: 0x0001, 0x2377: 0x0001, 0x2378: 0x0001, 0x2379: 0x0001, 0x237a: 0x0001, 0x237b: 0x0001, + 0x237c: 0x0001, 0x237d: 0x0001, 0x237e: 0x0001, 0x237f: 0x0001, + // Block 0x8e, offset 0x2380 + 0x2380: 0x0001, 0x2381: 0x0001, 0x2382: 0x0001, 0x2383: 0x0001, 0x2384: 0x0001, 0x2385: 0x0001, + 0x2386: 0x0001, 0x2387: 0x0001, 0x2388: 0x0001, 0x2389: 0x0001, 0x238a: 0x0001, 0x238b: 0x0001, + 0x238c: 0x0001, 0x238d: 0x0001, 0x238e: 0x0001, 0x238f: 0x0001, 0x2390: 0x000d, 0x2391: 0x000d, + 0x2392: 0x000d, 0x2393: 0x000d, 0x2394: 0x000d, 0x2395: 0x000d, 0x2396: 0x000d, 0x2397: 0x000d, + 0x2398: 0x000d, 0x2399: 0x000d, 0x239a: 0x000d, 0x239b: 0x000d, 0x239c: 0x000d, 0x239d: 0x000d, + 0x239e: 0x000d, 0x239f: 0x000d, 0x23a0: 0x000d, 0x23a1: 0x000d, 0x23a2: 0x000d, 0x23a3: 0x000d, + 0x23a4: 0x000d, 0x23a5: 0x000d, 0x23a6: 0x000d, 0x23a7: 0x000d, 0x23a8: 0x000d, 0x23a9: 0x000d, + 0x23aa: 0x000d, 0x23ab: 0x000d, 0x23ac: 0x000d, 0x23ad: 0x000d, 0x23ae: 0x000d, 0x23af: 0x000d, + 0x23b0: 0x000d, 0x23b1: 0x000d, 0x23b2: 0x000d, 0x23b3: 0x000d, 0x23b4: 0x000d, 0x23b5: 0x000d, + 0x23b6: 0x000d, 0x23b7: 0x000d, 0x23b8: 0x000d, 0x23b9: 0x000d, 0x23ba: 0x000d, 0x23bb: 0x000d, + 0x23bc: 0x000d, 0x23bd: 0x000d, 0x23be: 0x000d, 0x23bf: 0x000d, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x000d, 0x23c1: 0x000d, 0x23c2: 0x000d, 0x23c3: 0x000d, 0x23c4: 0x000d, 0x23c5: 0x000d, + 0x23c6: 0x000d, 0x23c7: 0x000d, 0x23c8: 0x000d, 0x23c9: 0x000d, 0x23ca: 0x000d, 0x23cb: 0x000d, + 0x23cc: 0x000d, 0x23cd: 0x000d, 0x23ce: 0x000d, 0x23cf: 0x000d, 0x23d0: 0x000d, 0x23d1: 0x000d, + 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, + 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, + 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, + 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, + 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, + 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, + 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, + 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000a, 0x23ff: 0x000a, + // Block 0x90, offset 0x2400 + 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, + 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, + 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000b, 0x2411: 0x000b, + 0x2412: 0x000b, 0x2413: 0x000b, 0x2414: 0x000b, 0x2415: 0x000b, 0x2416: 0x000b, 0x2417: 0x000b, + 0x2418: 0x000b, 0x2419: 0x000b, 0x241a: 0x000b, 0x241b: 0x000b, 0x241c: 0x000b, 0x241d: 0x000b, + 0x241e: 0x000b, 0x241f: 0x000b, 0x2420: 0x000b, 0x2421: 0x000b, 0x2422: 0x000b, 0x2423: 0x000b, + 0x2424: 0x000b, 0x2425: 0x000b, 0x2426: 0x000b, 0x2427: 0x000b, 0x2428: 0x000b, 0x2429: 0x000b, + 0x242a: 0x000b, 0x242b: 0x000b, 0x242c: 0x000b, 0x242d: 0x000b, 0x242e: 0x000b, 0x242f: 0x000b, + 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, + 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, + 0x243c: 0x000d, 0x243d: 0x000a, 0x243e: 0x000d, 0x243f: 0x000d, + // Block 0x91, offset 0x2440 + 0x2440: 0x000c, 0x2441: 0x000c, 0x2442: 0x000c, 0x2443: 0x000c, 0x2444: 0x000c, 0x2445: 0x000c, + 0x2446: 0x000c, 0x2447: 0x000c, 0x2448: 0x000c, 0x2449: 0x000c, 0x244a: 0x000c, 0x244b: 0x000c, + 0x244c: 0x000c, 0x244d: 0x000c, 0x244e: 0x000c, 0x244f: 0x000c, 0x2450: 0x000a, 0x2451: 0x000a, + 0x2452: 0x000a, 0x2453: 0x000a, 0x2454: 0x000a, 0x2455: 0x000a, 0x2456: 0x000a, 0x2457: 0x000a, + 0x2458: 0x000a, 0x2459: 0x000a, + 0x2460: 0x000c, 0x2461: 0x000c, 0x2462: 0x000c, 0x2463: 0x000c, + 0x2464: 0x000c, 0x2465: 0x000c, 0x2466: 0x000c, 0x2467: 0x000c, 0x2468: 0x000c, 0x2469: 0x000c, + 0x246a: 0x000c, 0x246b: 0x000c, 0x246c: 0x000c, 0x246d: 0x000c, 0x246e: 0x000c, 0x246f: 0x000c, + 0x2470: 0x000a, 0x2471: 0x000a, 0x2472: 0x000a, 0x2473: 0x000a, 0x2474: 0x000a, 0x2475: 0x000a, + 0x2476: 0x000a, 0x2477: 0x000a, 0x2478: 0x000a, 0x2479: 0x000a, 0x247a: 0x000a, 0x247b: 0x000a, + 0x247c: 0x000a, 0x247d: 0x000a, 0x247e: 0x000a, 0x247f: 0x000a, + // Block 0x92, offset 0x2480 + 0x2480: 0x000a, 0x2481: 0x000a, 0x2482: 0x000a, 0x2483: 0x000a, 0x2484: 0x000a, 0x2485: 0x000a, + 0x2486: 0x000a, 0x2487: 0x000a, 0x2488: 0x000a, 0x2489: 0x000a, 0x248a: 0x000a, 0x248b: 0x000a, + 0x248c: 0x000a, 0x248d: 0x000a, 0x248e: 0x000a, 0x248f: 0x000a, 0x2490: 0x0006, 0x2491: 0x000a, + 0x2492: 0x0006, 0x2494: 0x000a, 0x2495: 0x0006, 0x2496: 0x000a, 0x2497: 0x000a, + 0x2498: 0x000a, 0x2499: 0x009a, 0x249a: 0x008a, 0x249b: 0x007a, 0x249c: 0x006a, 0x249d: 0x009a, + 0x249e: 0x008a, 0x249f: 0x0004, 0x24a0: 0x000a, 0x24a1: 0x000a, 0x24a2: 0x0003, 0x24a3: 0x0003, + 0x24a4: 0x000a, 0x24a5: 0x000a, 0x24a6: 0x000a, 0x24a8: 0x000a, 0x24a9: 0x0004, + 0x24aa: 0x0004, 0x24ab: 0x000a, + 0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d, + 0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d, + 0x24bc: 0x000d, 0x24bd: 0x000d, 0x24be: 0x000d, 0x24bf: 0x000d, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x000d, 0x24c1: 0x000d, 0x24c2: 0x000d, 0x24c3: 0x000d, 0x24c4: 0x000d, 0x24c5: 0x000d, + 0x24c6: 0x000d, 0x24c7: 0x000d, 0x24c8: 0x000d, 0x24c9: 0x000d, 0x24ca: 0x000d, 0x24cb: 0x000d, + 0x24cc: 0x000d, 0x24cd: 0x000d, 0x24ce: 0x000d, 0x24cf: 0x000d, 0x24d0: 0x000d, 0x24d1: 0x000d, + 0x24d2: 0x000d, 0x24d3: 0x000d, 0x24d4: 0x000d, 0x24d5: 0x000d, 0x24d6: 0x000d, 0x24d7: 0x000d, + 0x24d8: 0x000d, 0x24d9: 0x000d, 0x24da: 0x000d, 0x24db: 0x000d, 0x24dc: 0x000d, 0x24dd: 0x000d, + 0x24de: 0x000d, 0x24df: 0x000d, 0x24e0: 0x000d, 0x24e1: 0x000d, 0x24e2: 0x000d, 0x24e3: 0x000d, + 0x24e4: 0x000d, 0x24e5: 0x000d, 0x24e6: 0x000d, 0x24e7: 0x000d, 0x24e8: 0x000d, 0x24e9: 0x000d, + 0x24ea: 0x000d, 0x24eb: 0x000d, 0x24ec: 0x000d, 0x24ed: 0x000d, 0x24ee: 0x000d, 0x24ef: 0x000d, + 0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d, + 0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d, + 0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000b, + // Block 0x94, offset 0x2500 + 0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x0004, 0x2504: 0x0004, 0x2505: 0x0004, + 0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x003a, 0x2509: 0x002a, 0x250a: 0x000a, 0x250b: 0x0003, + 0x250c: 0x0006, 0x250d: 0x0003, 0x250e: 0x0006, 0x250f: 0x0006, 0x2510: 0x0002, 0x2511: 0x0002, + 0x2512: 0x0002, 0x2513: 0x0002, 0x2514: 0x0002, 0x2515: 0x0002, 0x2516: 0x0002, 0x2517: 0x0002, + 0x2518: 0x0002, 0x2519: 0x0002, 0x251a: 0x0006, 0x251b: 0x000a, 0x251c: 0x000a, 0x251d: 0x000a, + 0x251e: 0x000a, 0x251f: 0x000a, 0x2520: 0x000a, + 0x253b: 0x005a, + 0x253c: 0x000a, 0x253d: 0x004a, 0x253e: 0x000a, 0x253f: 0x000a, + // Block 0x95, offset 0x2540 + 0x2540: 0x000a, + 0x255b: 0x005a, 0x255c: 0x000a, 0x255d: 0x004a, + 0x255e: 0x000a, 0x255f: 0x00fa, 0x2560: 0x00ea, 0x2561: 0x000a, 0x2562: 0x003a, 0x2563: 0x002a, + 0x2564: 0x000a, 0x2565: 0x000a, + // Block 0x96, offset 0x2580 + 0x25a0: 0x0004, 0x25a1: 0x0004, 0x25a2: 0x000a, 0x25a3: 0x000a, + 0x25a4: 0x000a, 0x25a5: 0x0004, 0x25a6: 0x0004, 0x25a8: 0x000a, 0x25a9: 0x000a, + 0x25aa: 0x000a, 0x25ab: 0x000a, 0x25ac: 0x000a, 0x25ad: 0x000a, 0x25ae: 0x000a, + 0x25b0: 0x000b, 0x25b1: 0x000b, 0x25b2: 0x000b, 0x25b3: 0x000b, 0x25b4: 0x000b, 0x25b5: 0x000b, + 0x25b6: 0x000b, 0x25b7: 0x000b, 0x25b8: 0x000b, 0x25b9: 0x000a, 0x25ba: 0x000a, 0x25bb: 0x000a, + 0x25bc: 0x000a, 0x25bd: 0x000a, 0x25be: 0x000b, 0x25bf: 0x000b, + // Block 0x97, offset 0x25c0 + 0x25c1: 0x000a, + // Block 0x98, offset 0x2600 + 0x2600: 0x000a, 0x2601: 0x000a, 0x2602: 0x000a, 0x2603: 0x000a, 0x2604: 0x000a, 0x2605: 0x000a, + 0x2606: 0x000a, 0x2607: 0x000a, 0x2608: 0x000a, 0x2609: 0x000a, 0x260a: 0x000a, 0x260b: 0x000a, + 0x260c: 0x000a, 0x2610: 0x000a, 0x2611: 0x000a, + 0x2612: 0x000a, 0x2613: 0x000a, 0x2614: 0x000a, 0x2615: 0x000a, 0x2616: 0x000a, 0x2617: 0x000a, + 0x2618: 0x000a, 0x2619: 0x000a, 0x261a: 0x000a, 0x261b: 0x000a, + 0x2620: 0x000a, + // Block 0x99, offset 0x2640 + 0x267d: 0x000c, + // Block 0x9a, offset 0x2680 + 0x26a0: 0x000c, 0x26a1: 0x0002, 0x26a2: 0x0002, 0x26a3: 0x0002, + 0x26a4: 0x0002, 0x26a5: 0x0002, 0x26a6: 0x0002, 0x26a7: 0x0002, 0x26a8: 0x0002, 0x26a9: 0x0002, + 0x26aa: 0x0002, 0x26ab: 0x0002, 0x26ac: 0x0002, 0x26ad: 0x0002, 0x26ae: 0x0002, 0x26af: 0x0002, + 0x26b0: 0x0002, 0x26b1: 0x0002, 0x26b2: 0x0002, 0x26b3: 0x0002, 0x26b4: 0x0002, 0x26b5: 0x0002, + 0x26b6: 0x0002, 0x26b7: 0x0002, 0x26b8: 0x0002, 0x26b9: 0x0002, 0x26ba: 0x0002, 0x26bb: 0x0002, + // Block 0x9b, offset 0x26c0 + 0x26f6: 0x000c, 0x26f7: 0x000c, 0x26f8: 0x000c, 0x26f9: 0x000c, 0x26fa: 0x000c, + // Block 0x9c, offset 0x2700 + 0x2700: 0x0001, 0x2701: 0x0001, 0x2702: 0x0001, 0x2703: 0x0001, 0x2704: 0x0001, 0x2705: 0x0001, + 0x2706: 0x0001, 0x2707: 0x0001, 0x2708: 0x0001, 0x2709: 0x0001, 0x270a: 0x0001, 0x270b: 0x0001, + 0x270c: 0x0001, 0x270d: 0x0001, 0x270e: 0x0001, 0x270f: 0x0001, 0x2710: 0x0001, 0x2711: 0x0001, + 0x2712: 0x0001, 0x2713: 0x0001, 0x2714: 0x0001, 0x2715: 0x0001, 0x2716: 0x0001, 0x2717: 0x0001, + 0x2718: 0x0001, 0x2719: 0x0001, 0x271a: 0x0001, 0x271b: 0x0001, 0x271c: 0x0001, 0x271d: 0x0001, + 0x271e: 0x0001, 0x271f: 0x0001, 0x2720: 0x0001, 0x2721: 0x0001, 0x2722: 0x0001, 0x2723: 0x0001, + 0x2724: 0x0001, 0x2725: 0x0001, 0x2726: 0x0001, 0x2727: 0x0001, 0x2728: 0x0001, 0x2729: 0x0001, + 0x272a: 0x0001, 0x272b: 0x0001, 0x272c: 0x0001, 0x272d: 0x0001, 0x272e: 0x0001, 0x272f: 0x0001, + 0x2730: 0x0001, 0x2731: 0x0001, 0x2732: 0x0001, 0x2733: 0x0001, 0x2734: 0x0001, 0x2735: 0x0001, + 0x2736: 0x0001, 0x2737: 0x0001, 0x2738: 0x0001, 0x2739: 0x0001, 0x273a: 0x0001, 0x273b: 0x0001, + 0x273c: 0x0001, 0x273d: 0x0001, 0x273e: 0x0001, 0x273f: 0x0001, + // Block 0x9d, offset 0x2740 + 0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001, + 0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001, + 0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001, + 0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001, + 0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001, + 0x275e: 0x0001, 0x275f: 0x000a, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001, + 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001, + 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001, + 0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001, + 0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001, + 0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0001, 0x2781: 0x000c, 0x2782: 0x000c, 0x2783: 0x000c, 0x2784: 0x0001, 0x2785: 0x000c, + 0x2786: 0x000c, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, + 0x278c: 0x000c, 0x278d: 0x000c, 0x278e: 0x000c, 0x278f: 0x000c, 0x2790: 0x0001, 0x2791: 0x0001, + 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, + 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, + 0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, + 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, + 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, + 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, + 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x000c, 0x27b9: 0x000c, 0x27ba: 0x000c, 0x27bb: 0x0001, + 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x000c, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001, + 0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, + 0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001, + 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, + 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, + 0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, + 0x27e4: 0x0001, 0x27e5: 0x000c, 0x27e6: 0x000c, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, + 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, + 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, + 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001, + 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001, + // Block 0xa0, offset 0x2800 + 0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001, + 0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, + 0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001, + 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, + 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, + 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, + 0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, + 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, + 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, + 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x000a, 0x283a: 0x000a, 0x283b: 0x000a, + 0x283c: 0x000a, 0x283d: 0x000a, 0x283e: 0x000a, 0x283f: 0x000a, + // Block 0xa1, offset 0x2840 + 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, + 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, + 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, + 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, + 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, + 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0005, 0x2861: 0x0005, 0x2862: 0x0005, 0x2863: 0x0005, + 0x2864: 0x0005, 0x2865: 0x0005, 0x2866: 0x0005, 0x2867: 0x0005, 0x2868: 0x0005, 0x2869: 0x0005, + 0x286a: 0x0005, 0x286b: 0x0005, 0x286c: 0x0005, 0x286d: 0x0005, 0x286e: 0x0005, 0x286f: 0x0005, + 0x2870: 0x0005, 0x2871: 0x0005, 0x2872: 0x0005, 0x2873: 0x0005, 0x2874: 0x0005, 0x2875: 0x0005, + 0x2876: 0x0005, 0x2877: 0x0005, 0x2878: 0x0005, 0x2879: 0x0005, 0x287a: 0x0005, 0x287b: 0x0005, + 0x287c: 0x0005, 0x287d: 0x0005, 0x287e: 0x0005, 0x287f: 0x0001, + // Block 0xa2, offset 0x2880 + 0x2881: 0x000c, + 0x28b8: 0x000c, 0x28b9: 0x000c, 0x28ba: 0x000c, 0x28bb: 0x000c, + 0x28bc: 0x000c, 0x28bd: 0x000c, 0x28be: 0x000c, 0x28bf: 0x000c, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x000c, 0x28c1: 0x000c, 0x28c2: 0x000c, 0x28c3: 0x000c, 0x28c4: 0x000c, 0x28c5: 0x000c, + 0x28c6: 0x000c, + 0x28d2: 0x000a, 0x28d3: 0x000a, 0x28d4: 0x000a, 0x28d5: 0x000a, 0x28d6: 0x000a, 0x28d7: 0x000a, + 0x28d8: 0x000a, 0x28d9: 0x000a, 0x28da: 0x000a, 0x28db: 0x000a, 0x28dc: 0x000a, 0x28dd: 0x000a, + 0x28de: 0x000a, 0x28df: 0x000a, 0x28e0: 0x000a, 0x28e1: 0x000a, 0x28e2: 0x000a, 0x28e3: 0x000a, + 0x28e4: 0x000a, 0x28e5: 0x000a, + 0x28ff: 0x000c, + // Block 0xa4, offset 0x2900 + 0x2900: 0x000c, 0x2901: 0x000c, + 0x2933: 0x000c, 0x2934: 0x000c, 0x2935: 0x000c, + 0x2936: 0x000c, 0x2939: 0x000c, 0x293a: 0x000c, + // Block 0xa5, offset 0x2940 + 0x2940: 0x000c, 0x2941: 0x000c, 0x2942: 0x000c, + 0x2967: 0x000c, 0x2968: 0x000c, 0x2969: 0x000c, + 0x296a: 0x000c, 0x296b: 0x000c, 0x296d: 0x000c, 0x296e: 0x000c, 0x296f: 0x000c, + 0x2970: 0x000c, 0x2971: 0x000c, 0x2972: 0x000c, 0x2973: 0x000c, 0x2974: 0x000c, + // Block 0xa6, offset 0x2980 + 0x29b3: 0x000c, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x000c, 0x29c1: 0x000c, + 0x29f6: 0x000c, 0x29f7: 0x000c, 0x29f8: 0x000c, 0x29f9: 0x000c, 0x29fa: 0x000c, 0x29fb: 0x000c, + 0x29fc: 0x000c, 0x29fd: 0x000c, 0x29fe: 0x000c, + // Block 0xa8, offset 0x2a00 + 0x2a0a: 0x000c, 0x2a0b: 0x000c, + 0x2a0c: 0x000c, + // Block 0xa9, offset 0x2a40 + 0x2a6f: 0x000c, + 0x2a70: 0x000c, 0x2a71: 0x000c, 0x2a74: 0x000c, + 0x2a76: 0x000c, 0x2a77: 0x000c, + 0x2a7e: 0x000c, + // Block 0xaa, offset 0x2a80 + 0x2a9f: 0x000c, 0x2aa3: 0x000c, + 0x2aa4: 0x000c, 0x2aa5: 0x000c, 0x2aa6: 0x000c, 0x2aa7: 0x000c, 0x2aa8: 0x000c, 0x2aa9: 0x000c, + 0x2aaa: 0x000c, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x000c, 0x2ac1: 0x000c, + 0x2afc: 0x000c, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x000c, + 0x2b26: 0x000c, 0x2b27: 0x000c, 0x2b28: 0x000c, 0x2b29: 0x000c, + 0x2b2a: 0x000c, 0x2b2b: 0x000c, 0x2b2c: 0x000c, + 0x2b30: 0x000c, 0x2b31: 0x000c, 0x2b32: 0x000c, 0x2b33: 0x000c, 0x2b34: 0x000c, + // Block 0xad, offset 0x2b40 + 0x2b78: 0x000c, 0x2b79: 0x000c, 0x2b7a: 0x000c, 0x2b7b: 0x000c, + 0x2b7c: 0x000c, 0x2b7d: 0x000c, 0x2b7e: 0x000c, 0x2b7f: 0x000c, + // Block 0xae, offset 0x2b80 + 0x2b82: 0x000c, 0x2b83: 0x000c, 0x2b84: 0x000c, + 0x2b86: 0x000c, + // Block 0xaf, offset 0x2bc0 + 0x2bf3: 0x000c, 0x2bf4: 0x000c, 0x2bf5: 0x000c, + 0x2bf6: 0x000c, 0x2bf7: 0x000c, 0x2bf8: 0x000c, 0x2bfa: 0x000c, + 0x2bff: 0x000c, + // Block 0xb0, offset 0x2c00 + 0x2c00: 0x000c, 0x2c02: 0x000c, 0x2c03: 0x000c, + // Block 0xb1, offset 0x2c40 + 0x2c72: 0x000c, 0x2c73: 0x000c, 0x2c74: 0x000c, 0x2c75: 0x000c, + 0x2c7c: 0x000c, 0x2c7d: 0x000c, 0x2c7f: 0x000c, + // Block 0xb2, offset 0x2c80 + 0x2c80: 0x000c, + 0x2c9c: 0x000c, 0x2c9d: 0x000c, + // Block 0xb3, offset 0x2cc0 + 0x2cf3: 0x000c, 0x2cf4: 0x000c, 0x2cf5: 0x000c, + 0x2cf6: 0x000c, 0x2cf7: 0x000c, 0x2cf8: 0x000c, 0x2cf9: 0x000c, 0x2cfa: 0x000c, + 0x2cfd: 0x000c, 0x2cff: 0x000c, + // Block 0xb4, offset 0x2d00 + 0x2d00: 0x000c, + 0x2d20: 0x000a, 0x2d21: 0x000a, 0x2d22: 0x000a, 0x2d23: 0x000a, + 0x2d24: 0x000a, 0x2d25: 0x000a, 0x2d26: 0x000a, 0x2d27: 0x000a, 0x2d28: 0x000a, 0x2d29: 0x000a, + 0x2d2a: 0x000a, 0x2d2b: 0x000a, 0x2d2c: 0x000a, + // Block 0xb5, offset 0x2d40 + 0x2d6b: 0x000c, 0x2d6d: 0x000c, + 0x2d70: 0x000c, 0x2d71: 0x000c, 0x2d72: 0x000c, 0x2d73: 0x000c, 0x2d74: 0x000c, 0x2d75: 0x000c, + 0x2d77: 0x000c, + // Block 0xb6, offset 0x2d80 + 0x2d9d: 0x000c, + 0x2d9e: 0x000c, 0x2d9f: 0x000c, 0x2da2: 0x000c, 0x2da3: 0x000c, + 0x2da4: 0x000c, 0x2da5: 0x000c, 0x2da7: 0x000c, 0x2da8: 0x000c, 0x2da9: 0x000c, + 0x2daa: 0x000c, 0x2dab: 0x000c, + // Block 0xb7, offset 0x2dc0 + 0x2dc1: 0x000c, 0x2dc2: 0x000c, 0x2dc3: 0x000c, 0x2dc4: 0x000c, 0x2dc5: 0x000c, + 0x2dc6: 0x000c, 0x2dc9: 0x000c, 0x2dca: 0x000c, + 0x2df3: 0x000c, 0x2df4: 0x000c, 0x2df5: 0x000c, + 0x2df6: 0x000c, 0x2df7: 0x000c, 0x2df8: 0x000c, 0x2dfb: 0x000c, + 0x2dfc: 0x000c, 0x2dfd: 0x000c, 0x2dfe: 0x000c, + // Block 0xb8, offset 0x2e00 + 0x2e07: 0x000c, + 0x2e11: 0x000c, + 0x2e12: 0x000c, 0x2e13: 0x000c, 0x2e14: 0x000c, 0x2e15: 0x000c, 0x2e16: 0x000c, + 0x2e19: 0x000c, 0x2e1a: 0x000c, 0x2e1b: 0x000c, + // Block 0xb9, offset 0x2e40 + 0x2e4a: 0x000c, 0x2e4b: 0x000c, + 0x2e4c: 0x000c, 0x2e4d: 0x000c, 0x2e4e: 0x000c, 0x2e4f: 0x000c, 0x2e50: 0x000c, 0x2e51: 0x000c, + 0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c, + 0x2e58: 0x000c, 0x2e59: 0x000c, + // Block 0xba, offset 0x2e80 + 0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c, + 0x2eb6: 0x000c, 0x2eb8: 0x000c, 0x2eb9: 0x000c, 0x2eba: 0x000c, 0x2ebb: 0x000c, + 0x2ebc: 0x000c, 0x2ebd: 0x000c, + // Block 0xbb, offset 0x2ec0 + 0x2ed2: 0x000c, 0x2ed3: 0x000c, 0x2ed4: 0x000c, 0x2ed5: 0x000c, 0x2ed6: 0x000c, 0x2ed7: 0x000c, + 0x2ed8: 0x000c, 0x2ed9: 0x000c, 0x2eda: 0x000c, 0x2edb: 0x000c, 0x2edc: 0x000c, 0x2edd: 0x000c, + 0x2ede: 0x000c, 0x2edf: 0x000c, 0x2ee0: 0x000c, 0x2ee1: 0x000c, 0x2ee2: 0x000c, 0x2ee3: 0x000c, + 0x2ee4: 0x000c, 0x2ee5: 0x000c, 0x2ee6: 0x000c, 0x2ee7: 0x000c, + 0x2eea: 0x000c, 0x2eeb: 0x000c, 0x2eec: 0x000c, 0x2eed: 0x000c, 0x2eee: 0x000c, 0x2eef: 0x000c, + 0x2ef0: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef5: 0x000c, + 0x2ef6: 0x000c, + // Block 0xbc, offset 0x2f00 + 0x2f31: 0x000c, 0x2f32: 0x000c, 0x2f33: 0x000c, 0x2f34: 0x000c, 0x2f35: 0x000c, + 0x2f36: 0x000c, 0x2f3a: 0x000c, + 0x2f3c: 0x000c, 0x2f3d: 0x000c, 0x2f3f: 0x000c, + // Block 0xbd, offset 0x2f40 + 0x2f40: 0x000c, 0x2f41: 0x000c, 0x2f42: 0x000c, 0x2f43: 0x000c, 0x2f44: 0x000c, 0x2f45: 0x000c, + 0x2f47: 0x000c, + // Block 0xbe, offset 0x2f80 + 0x2fb0: 0x000c, 0x2fb1: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb4: 0x000c, + // Block 0xbf, offset 0x2fc0 + 0x2ff0: 0x000c, 0x2ff1: 0x000c, 0x2ff2: 0x000c, 0x2ff3: 0x000c, 0x2ff4: 0x000c, 0x2ff5: 0x000c, + 0x2ff6: 0x000c, + // Block 0xc0, offset 0x3000 + 0x300f: 0x000c, 0x3010: 0x000c, 0x3011: 0x000c, + 0x3012: 0x000c, + // Block 0xc1, offset 0x3040 + 0x305d: 0x000c, + 0x305e: 0x000c, 0x3060: 0x000b, 0x3061: 0x000b, 0x3062: 0x000b, 0x3063: 0x000b, + // Block 0xc2, offset 0x3080 + 0x30a7: 0x000c, 0x30a8: 0x000c, 0x30a9: 0x000c, + 0x30b3: 0x000b, 0x30b4: 0x000b, 0x30b5: 0x000b, + 0x30b6: 0x000b, 0x30b7: 0x000b, 0x30b8: 0x000b, 0x30b9: 0x000b, 0x30ba: 0x000b, 0x30bb: 0x000c, + 0x30bc: 0x000c, 0x30bd: 0x000c, 0x30be: 0x000c, 0x30bf: 0x000c, + // Block 0xc3, offset 0x30c0 + 0x30c0: 0x000c, 0x30c1: 0x000c, 0x30c2: 0x000c, 0x30c5: 0x000c, + 0x30c6: 0x000c, 0x30c7: 0x000c, 0x30c8: 0x000c, 0x30c9: 0x000c, 0x30ca: 0x000c, 0x30cb: 0x000c, + 0x30ea: 0x000c, 0x30eb: 0x000c, 0x30ec: 0x000c, 0x30ed: 0x000c, + // Block 0xc4, offset 0x3100 + 0x3100: 0x000a, 0x3101: 0x000a, 0x3102: 0x000c, 0x3103: 0x000c, 0x3104: 0x000c, 0x3105: 0x000a, + // Block 0xc5, offset 0x3140 + 0x3140: 0x000a, 0x3141: 0x000a, 0x3142: 0x000a, 0x3143: 0x000a, 0x3144: 0x000a, 0x3145: 0x000a, + 0x3146: 0x000a, 0x3147: 0x000a, 0x3148: 0x000a, 0x3149: 0x000a, 0x314a: 0x000a, 0x314b: 0x000a, + 0x314c: 0x000a, 0x314d: 0x000a, 0x314e: 0x000a, 0x314f: 0x000a, 0x3150: 0x000a, 0x3151: 0x000a, + 0x3152: 0x000a, 0x3153: 0x000a, 0x3154: 0x000a, 0x3155: 0x000a, 0x3156: 0x000a, + // Block 0xc6, offset 0x3180 + 0x319b: 0x000a, + // Block 0xc7, offset 0x31c0 + 0x31d5: 0x000a, + // Block 0xc8, offset 0x3200 + 0x320f: 0x000a, + // Block 0xc9, offset 0x3240 + 0x3249: 0x000a, + // Block 0xca, offset 0x3280 + 0x3283: 0x000a, + 0x328e: 0x0002, 0x328f: 0x0002, 0x3290: 0x0002, 0x3291: 0x0002, + 0x3292: 0x0002, 0x3293: 0x0002, 0x3294: 0x0002, 0x3295: 0x0002, 0x3296: 0x0002, 0x3297: 0x0002, + 0x3298: 0x0002, 0x3299: 0x0002, 0x329a: 0x0002, 0x329b: 0x0002, 0x329c: 0x0002, 0x329d: 0x0002, + 0x329e: 0x0002, 0x329f: 0x0002, 0x32a0: 0x0002, 0x32a1: 0x0002, 0x32a2: 0x0002, 0x32a3: 0x0002, + 0x32a4: 0x0002, 0x32a5: 0x0002, 0x32a6: 0x0002, 0x32a7: 0x0002, 0x32a8: 0x0002, 0x32a9: 0x0002, + 0x32aa: 0x0002, 0x32ab: 0x0002, 0x32ac: 0x0002, 0x32ad: 0x0002, 0x32ae: 0x0002, 0x32af: 0x0002, + 0x32b0: 0x0002, 0x32b1: 0x0002, 0x32b2: 0x0002, 0x32b3: 0x0002, 0x32b4: 0x0002, 0x32b5: 0x0002, + 0x32b6: 0x0002, 0x32b7: 0x0002, 0x32b8: 0x0002, 0x32b9: 0x0002, 0x32ba: 0x0002, 0x32bb: 0x0002, + 0x32bc: 0x0002, 0x32bd: 0x0002, 0x32be: 0x0002, 0x32bf: 0x0002, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x000c, 0x32c1: 0x000c, 0x32c2: 0x000c, 0x32c3: 0x000c, 0x32c4: 0x000c, 0x32c5: 0x000c, + 0x32c6: 0x000c, 0x32c7: 0x000c, 0x32c8: 0x000c, 0x32c9: 0x000c, 0x32ca: 0x000c, 0x32cb: 0x000c, + 0x32cc: 0x000c, 0x32cd: 0x000c, 0x32ce: 0x000c, 0x32cf: 0x000c, 0x32d0: 0x000c, 0x32d1: 0x000c, + 0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x000c, + 0x32d8: 0x000c, 0x32d9: 0x000c, 0x32da: 0x000c, 0x32db: 0x000c, 0x32dc: 0x000c, 0x32dd: 0x000c, + 0x32de: 0x000c, 0x32df: 0x000c, 0x32e0: 0x000c, 0x32e1: 0x000c, 0x32e2: 0x000c, 0x32e3: 0x000c, + 0x32e4: 0x000c, 0x32e5: 0x000c, 0x32e6: 0x000c, 0x32e7: 0x000c, 0x32e8: 0x000c, 0x32e9: 0x000c, + 0x32ea: 0x000c, 0x32eb: 0x000c, 0x32ec: 0x000c, 0x32ed: 0x000c, 0x32ee: 0x000c, 0x32ef: 0x000c, + 0x32f0: 0x000c, 0x32f1: 0x000c, 0x32f2: 0x000c, 0x32f3: 0x000c, 0x32f4: 0x000c, 0x32f5: 0x000c, + 0x32f6: 0x000c, 0x32fb: 0x000c, + 0x32fc: 0x000c, 0x32fd: 0x000c, 0x32fe: 0x000c, 0x32ff: 0x000c, + // Block 0xcc, offset 0x3300 + 0x3300: 0x000c, 0x3301: 0x000c, 0x3302: 0x000c, 0x3303: 0x000c, 0x3304: 0x000c, 0x3305: 0x000c, + 0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x000c, + 0x330c: 0x000c, 0x330d: 0x000c, 0x330e: 0x000c, 0x330f: 0x000c, 0x3310: 0x000c, 0x3311: 0x000c, + 0x3312: 0x000c, 0x3313: 0x000c, 0x3314: 0x000c, 0x3315: 0x000c, 0x3316: 0x000c, 0x3317: 0x000c, + 0x3318: 0x000c, 0x3319: 0x000c, 0x331a: 0x000c, 0x331b: 0x000c, 0x331c: 0x000c, 0x331d: 0x000c, + 0x331e: 0x000c, 0x331f: 0x000c, 0x3320: 0x000c, 0x3321: 0x000c, 0x3322: 0x000c, 0x3323: 0x000c, + 0x3324: 0x000c, 0x3325: 0x000c, 0x3326: 0x000c, 0x3327: 0x000c, 0x3328: 0x000c, 0x3329: 0x000c, + 0x332a: 0x000c, 0x332b: 0x000c, 0x332c: 0x000c, + 0x3335: 0x000c, + // Block 0xcd, offset 0x3340 + 0x3344: 0x000c, + 0x335b: 0x000c, 0x335c: 0x000c, 0x335d: 0x000c, + 0x335e: 0x000c, 0x335f: 0x000c, 0x3361: 0x000c, 0x3362: 0x000c, 0x3363: 0x000c, + 0x3364: 0x000c, 0x3365: 0x000c, 0x3366: 0x000c, 0x3367: 0x000c, 0x3368: 0x000c, 0x3369: 0x000c, + 0x336a: 0x000c, 0x336b: 0x000c, 0x336c: 0x000c, 0x336d: 0x000c, 0x336e: 0x000c, 0x336f: 0x000c, + // Block 0xce, offset 0x3380 + 0x3380: 0x000c, 0x3381: 0x000c, 0x3382: 0x000c, 0x3383: 0x000c, 0x3384: 0x000c, 0x3385: 0x000c, + 0x3386: 0x000c, 0x3388: 0x000c, 0x3389: 0x000c, 0x338a: 0x000c, 0x338b: 0x000c, + 0x338c: 0x000c, 0x338d: 0x000c, 0x338e: 0x000c, 0x338f: 0x000c, 0x3390: 0x000c, 0x3391: 0x000c, + 0x3392: 0x000c, 0x3393: 0x000c, 0x3394: 0x000c, 0x3395: 0x000c, 0x3396: 0x000c, 0x3397: 0x000c, + 0x3398: 0x000c, 0x339b: 0x000c, 0x339c: 0x000c, 0x339d: 0x000c, + 0x339e: 0x000c, 0x339f: 0x000c, 0x33a0: 0x000c, 0x33a1: 0x000c, 0x33a3: 0x000c, + 0x33a4: 0x000c, 0x33a6: 0x000c, 0x33a7: 0x000c, 0x33a8: 0x000c, 0x33a9: 0x000c, + 0x33aa: 0x000c, + // Block 0xcf, offset 0x33c0 + 0x33c0: 0x0001, 0x33c1: 0x0001, 0x33c2: 0x0001, 0x33c3: 0x0001, 0x33c4: 0x0001, 0x33c5: 0x0001, + 0x33c6: 0x0001, 0x33c7: 0x0001, 0x33c8: 0x0001, 0x33c9: 0x0001, 0x33ca: 0x0001, 0x33cb: 0x0001, + 0x33cc: 0x0001, 0x33cd: 0x0001, 0x33ce: 0x0001, 0x33cf: 0x0001, 0x33d0: 0x000c, 0x33d1: 0x000c, + 0x33d2: 0x000c, 0x33d3: 0x000c, 0x33d4: 0x000c, 0x33d5: 0x000c, 0x33d6: 0x000c, 0x33d7: 0x0001, + 0x33d8: 0x0001, 0x33d9: 0x0001, 0x33da: 0x0001, 0x33db: 0x0001, 0x33dc: 0x0001, 0x33dd: 0x0001, + 0x33de: 0x0001, 0x33df: 0x0001, 0x33e0: 0x0001, 0x33e1: 0x0001, 0x33e2: 0x0001, 0x33e3: 0x0001, + 0x33e4: 0x0001, 0x33e5: 0x0001, 0x33e6: 0x0001, 0x33e7: 0x0001, 0x33e8: 0x0001, 0x33e9: 0x0001, + 0x33ea: 0x0001, 0x33eb: 0x0001, 0x33ec: 0x0001, 0x33ed: 0x0001, 0x33ee: 0x0001, 0x33ef: 0x0001, + 0x33f0: 0x0001, 0x33f1: 0x0001, 0x33f2: 0x0001, 0x33f3: 0x0001, 0x33f4: 0x0001, 0x33f5: 0x0001, + 0x33f6: 0x0001, 0x33f7: 0x0001, 0x33f8: 0x0001, 0x33f9: 0x0001, 0x33fa: 0x0001, 0x33fb: 0x0001, + 0x33fc: 0x0001, 0x33fd: 0x0001, 0x33fe: 0x0001, 0x33ff: 0x0001, + // Block 0xd0, offset 0x3400 + 0x3400: 0x0001, 0x3401: 0x0001, 0x3402: 0x0001, 0x3403: 0x0001, 0x3404: 0x000c, 0x3405: 0x000c, + 0x3406: 0x000c, 0x3407: 0x000c, 0x3408: 0x000c, 0x3409: 0x000c, 0x340a: 0x000c, 0x340b: 0x0001, + 0x340c: 0x0001, 0x340d: 0x0001, 0x340e: 0x0001, 0x340f: 0x0001, 0x3410: 0x0001, 0x3411: 0x0001, + 0x3412: 0x0001, 0x3413: 0x0001, 0x3414: 0x0001, 0x3415: 0x0001, 0x3416: 0x0001, 0x3417: 0x0001, + 0x3418: 0x0001, 0x3419: 0x0001, 0x341a: 0x0001, 0x341b: 0x0001, 0x341c: 0x0001, 0x341d: 0x0001, + 0x341e: 0x0001, 0x341f: 0x0001, 0x3420: 0x0001, 0x3421: 0x0001, 0x3422: 0x0001, 0x3423: 0x0001, + 0x3424: 0x0001, 0x3425: 0x0001, 0x3426: 0x0001, 0x3427: 0x0001, 0x3428: 0x0001, 0x3429: 0x0001, + 0x342a: 0x0001, 0x342b: 0x0001, 0x342c: 0x0001, 0x342d: 0x0001, 0x342e: 0x0001, 0x342f: 0x0001, + 0x3430: 0x0001, 0x3431: 0x0001, 0x3432: 0x0001, 0x3433: 0x0001, 0x3434: 0x0001, 0x3435: 0x0001, + 0x3436: 0x0001, 0x3437: 0x0001, 0x3438: 0x0001, 0x3439: 0x0001, 0x343a: 0x0001, 0x343b: 0x0001, + 0x343c: 0x0001, 0x343d: 0x0001, 0x343e: 0x0001, 0x343f: 0x0001, + // Block 0xd1, offset 0x3440 + 0x3440: 0x000d, 0x3441: 0x000d, 0x3442: 0x000d, 0x3443: 0x000d, 0x3444: 0x000d, 0x3445: 0x000d, + 0x3446: 0x000d, 0x3447: 0x000d, 0x3448: 0x000d, 0x3449: 0x000d, 0x344a: 0x000d, 0x344b: 0x000d, + 0x344c: 0x000d, 0x344d: 0x000d, 0x344e: 0x000d, 0x344f: 0x000d, 0x3450: 0x000d, 0x3451: 0x000d, + 0x3452: 0x000d, 0x3453: 0x000d, 0x3454: 0x000d, 0x3455: 0x000d, 0x3456: 0x000d, 0x3457: 0x000d, + 0x3458: 0x000d, 0x3459: 0x000d, 0x345a: 0x000d, 0x345b: 0x000d, 0x345c: 0x000d, 0x345d: 0x000d, + 0x345e: 0x000d, 0x345f: 0x000d, 0x3460: 0x000d, 0x3461: 0x000d, 0x3462: 0x000d, 0x3463: 0x000d, + 0x3464: 0x000d, 0x3465: 0x000d, 0x3466: 0x000d, 0x3467: 0x000d, 0x3468: 0x000d, 0x3469: 0x000d, + 0x346a: 0x000d, 0x346b: 0x000d, 0x346c: 0x000d, 0x346d: 0x000d, 0x346e: 0x000d, 0x346f: 0x000d, + 0x3470: 0x000a, 0x3471: 0x000a, 0x3472: 0x000d, 0x3473: 0x000d, 0x3474: 0x000d, 0x3475: 0x000d, + 0x3476: 0x000d, 0x3477: 0x000d, 0x3478: 0x000d, 0x3479: 0x000d, 0x347a: 0x000d, 0x347b: 0x000d, + 0x347c: 0x000d, 0x347d: 0x000d, 0x347e: 0x000d, 0x347f: 0x000d, + // Block 0xd2, offset 0x3480 + 0x3480: 0x000a, 0x3481: 0x000a, 0x3482: 0x000a, 0x3483: 0x000a, 0x3484: 0x000a, 0x3485: 0x000a, + 0x3486: 0x000a, 0x3487: 0x000a, 0x3488: 0x000a, 0x3489: 0x000a, 0x348a: 0x000a, 0x348b: 0x000a, + 0x348c: 0x000a, 0x348d: 0x000a, 0x348e: 0x000a, 0x348f: 0x000a, 0x3490: 0x000a, 0x3491: 0x000a, + 0x3492: 0x000a, 0x3493: 0x000a, 0x3494: 0x000a, 0x3495: 0x000a, 0x3496: 0x000a, 0x3497: 0x000a, + 0x3498: 0x000a, 0x3499: 0x000a, 0x349a: 0x000a, 0x349b: 0x000a, 0x349c: 0x000a, 0x349d: 0x000a, + 0x349e: 0x000a, 0x349f: 0x000a, 0x34a0: 0x000a, 0x34a1: 0x000a, 0x34a2: 0x000a, 0x34a3: 0x000a, + 0x34a4: 0x000a, 0x34a5: 0x000a, 0x34a6: 0x000a, 0x34a7: 0x000a, 0x34a8: 0x000a, 0x34a9: 0x000a, + 0x34aa: 0x000a, 0x34ab: 0x000a, + 0x34b0: 0x000a, 0x34b1: 0x000a, 0x34b2: 0x000a, 0x34b3: 0x000a, 0x34b4: 0x000a, 0x34b5: 0x000a, + 0x34b6: 0x000a, 0x34b7: 0x000a, 0x34b8: 0x000a, 0x34b9: 0x000a, 0x34ba: 0x000a, 0x34bb: 0x000a, + 0x34bc: 0x000a, 0x34bd: 0x000a, 0x34be: 0x000a, 0x34bf: 0x000a, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a, + 0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a, + 0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a, + 0x34d2: 0x000a, 0x34d3: 0x000a, + 0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a, + 0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a, + 0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a, 0x34ed: 0x000a, 0x34ee: 0x000a, + 0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a, + 0x34f6: 0x000a, 0x34f7: 0x000a, 0x34f8: 0x000a, 0x34f9: 0x000a, 0x34fa: 0x000a, 0x34fb: 0x000a, + 0x34fc: 0x000a, 0x34fd: 0x000a, 0x34fe: 0x000a, 0x34ff: 0x000a, + // Block 0xd4, offset 0x3500 + 0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a, + 0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a, + 0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3511: 0x000a, + 0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a, 0x3515: 0x000a, 0x3516: 0x000a, 0x3517: 0x000a, + 0x3518: 0x000a, 0x3519: 0x000a, 0x351a: 0x000a, 0x351b: 0x000a, 0x351c: 0x000a, 0x351d: 0x000a, + 0x351e: 0x000a, 0x351f: 0x000a, 0x3520: 0x000a, 0x3521: 0x000a, 0x3522: 0x000a, 0x3523: 0x000a, + 0x3524: 0x000a, 0x3525: 0x000a, 0x3526: 0x000a, 0x3527: 0x000a, 0x3528: 0x000a, 0x3529: 0x000a, + 0x352a: 0x000a, 0x352b: 0x000a, 0x352c: 0x000a, 0x352d: 0x000a, 0x352e: 0x000a, 0x352f: 0x000a, + 0x3530: 0x000a, 0x3531: 0x000a, 0x3532: 0x000a, 0x3533: 0x000a, 0x3534: 0x000a, 0x3535: 0x000a, + // Block 0xd5, offset 0x3540 + 0x3540: 0x0002, 0x3541: 0x0002, 0x3542: 0x0002, 0x3543: 0x0002, 0x3544: 0x0002, 0x3545: 0x0002, + 0x3546: 0x0002, 0x3547: 0x0002, 0x3548: 0x0002, 0x3549: 0x0002, 0x354a: 0x0002, 0x354b: 0x000a, + 0x354c: 0x000a, + // Block 0xd6, offset 0x3580 + 0x35aa: 0x000a, 0x35ab: 0x000a, + // Block 0xd7, offset 0x35c0 + 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a, + 0x35e4: 0x000a, 0x35e5: 0x000a, + // Block 0xd8, offset 0x3600 + 0x3600: 0x000a, 0x3601: 0x000a, 0x3602: 0x000a, 0x3603: 0x000a, 0x3604: 0x000a, 0x3605: 0x000a, + 0x3606: 0x000a, 0x3607: 0x000a, 0x3608: 0x000a, 0x3609: 0x000a, 0x360a: 0x000a, 0x360b: 0x000a, + 0x360c: 0x000a, 0x360d: 0x000a, 0x360e: 0x000a, 0x360f: 0x000a, 0x3610: 0x000a, 0x3611: 0x000a, + 0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a, + 0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a, + 0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, 0x3628: 0x000a, 0x3629: 0x000a, + 0x362a: 0x000a, 0x362b: 0x000a, 0x362c: 0x000a, + 0x3630: 0x000a, 0x3631: 0x000a, 0x3632: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a, + 0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, + // Block 0xd9, offset 0x3640 + 0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a, + 0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a, + 0x364c: 0x000a, 0x364d: 0x000a, 0x364e: 0x000a, 0x364f: 0x000a, 0x3650: 0x000a, 0x3651: 0x000a, + 0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, + // Block 0xda, offset 0x3680 + 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a, + 0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a, + 0x3690: 0x000a, 0x3691: 0x000a, + 0x3692: 0x000a, 0x3693: 0x000a, 0x3694: 0x000a, 0x3695: 0x000a, 0x3696: 0x000a, 0x3697: 0x000a, + 0x3698: 0x000a, 0x3699: 0x000a, 0x369a: 0x000a, 0x369b: 0x000a, 0x369c: 0x000a, 0x369d: 0x000a, + 0x369e: 0x000a, 0x369f: 0x000a, 0x36a0: 0x000a, 0x36a1: 0x000a, 0x36a2: 0x000a, 0x36a3: 0x000a, + 0x36a4: 0x000a, 0x36a5: 0x000a, 0x36a6: 0x000a, 0x36a7: 0x000a, 0x36a8: 0x000a, 0x36a9: 0x000a, + 0x36aa: 0x000a, 0x36ab: 0x000a, 0x36ac: 0x000a, 0x36ad: 0x000a, 0x36ae: 0x000a, 0x36af: 0x000a, + 0x36b0: 0x000a, 0x36b1: 0x000a, 0x36b2: 0x000a, 0x36b3: 0x000a, 0x36b4: 0x000a, 0x36b5: 0x000a, + 0x36b6: 0x000a, 0x36b7: 0x000a, 0x36b8: 0x000a, 0x36b9: 0x000a, 0x36ba: 0x000a, 0x36bb: 0x000a, + 0x36bc: 0x000a, 0x36bd: 0x000a, 0x36be: 0x000a, 0x36bf: 0x000a, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x000a, 0x36c1: 0x000a, 0x36c2: 0x000a, 0x36c3: 0x000a, 0x36c4: 0x000a, 0x36c5: 0x000a, + 0x36c6: 0x000a, 0x36c7: 0x000a, + 0x36d0: 0x000a, 0x36d1: 0x000a, + 0x36d2: 0x000a, 0x36d3: 0x000a, 0x36d4: 0x000a, 0x36d5: 0x000a, 0x36d6: 0x000a, 0x36d7: 0x000a, + 0x36d8: 0x000a, 0x36d9: 0x000a, + 0x36e0: 0x000a, 0x36e1: 0x000a, 0x36e2: 0x000a, 0x36e3: 0x000a, + 0x36e4: 0x000a, 0x36e5: 0x000a, 0x36e6: 0x000a, 0x36e7: 0x000a, 0x36e8: 0x000a, 0x36e9: 0x000a, + 0x36ea: 0x000a, 0x36eb: 0x000a, 0x36ec: 0x000a, 0x36ed: 0x000a, 0x36ee: 0x000a, 0x36ef: 0x000a, + 0x36f0: 0x000a, 0x36f1: 0x000a, 0x36f2: 0x000a, 0x36f3: 0x000a, 0x36f4: 0x000a, 0x36f5: 0x000a, + 0x36f6: 0x000a, 0x36f7: 0x000a, 0x36f8: 0x000a, 0x36f9: 0x000a, 0x36fa: 0x000a, 0x36fb: 0x000a, + 0x36fc: 0x000a, 0x36fd: 0x000a, 0x36fe: 0x000a, 0x36ff: 0x000a, + // Block 0xdc, offset 0x3700 + 0x3700: 0x000a, 0x3701: 0x000a, 0x3702: 0x000a, 0x3703: 0x000a, 0x3704: 0x000a, 0x3705: 0x000a, + 0x3706: 0x000a, 0x3707: 0x000a, + 0x3710: 0x000a, 0x3711: 0x000a, + 0x3712: 0x000a, 0x3713: 0x000a, 0x3714: 0x000a, 0x3715: 0x000a, 0x3716: 0x000a, 0x3717: 0x000a, + 0x3718: 0x000a, 0x3719: 0x000a, 0x371a: 0x000a, 0x371b: 0x000a, 0x371c: 0x000a, 0x371d: 0x000a, + 0x371e: 0x000a, 0x371f: 0x000a, 0x3720: 0x000a, 0x3721: 0x000a, 0x3722: 0x000a, 0x3723: 0x000a, + 0x3724: 0x000a, 0x3725: 0x000a, 0x3726: 0x000a, 0x3727: 0x000a, 0x3728: 0x000a, 0x3729: 0x000a, + 0x372a: 0x000a, 0x372b: 0x000a, 0x372c: 0x000a, 0x372d: 0x000a, + // Block 0xdd, offset 0x3740 + 0x3740: 0x000a, 0x3741: 0x000a, 0x3742: 0x000a, 0x3743: 0x000a, 0x3744: 0x000a, 0x3745: 0x000a, + 0x3746: 0x000a, 0x3747: 0x000a, 0x3748: 0x000a, 0x3749: 0x000a, 0x374a: 0x000a, 0x374b: 0x000a, + 0x3750: 0x000a, 0x3751: 0x000a, + 0x3752: 0x000a, 0x3753: 0x000a, 0x3754: 0x000a, 0x3755: 0x000a, 0x3756: 0x000a, 0x3757: 0x000a, + 0x3758: 0x000a, 0x3759: 0x000a, 0x375a: 0x000a, 0x375b: 0x000a, 0x375c: 0x000a, 0x375d: 0x000a, + 0x375e: 0x000a, 0x375f: 0x000a, 0x3760: 0x000a, 0x3761: 0x000a, 0x3762: 0x000a, 0x3763: 0x000a, + 0x3764: 0x000a, 0x3765: 0x000a, 0x3766: 0x000a, 0x3767: 0x000a, 0x3768: 0x000a, 0x3769: 0x000a, + 0x376a: 0x000a, 0x376b: 0x000a, 0x376c: 0x000a, 0x376d: 0x000a, 0x376e: 0x000a, 0x376f: 0x000a, + 0x3770: 0x000a, 0x3771: 0x000a, 0x3772: 0x000a, 0x3773: 0x000a, 0x3774: 0x000a, 0x3775: 0x000a, + 0x3776: 0x000a, 0x3777: 0x000a, 0x3778: 0x000a, 0x3779: 0x000a, 0x377a: 0x000a, 0x377b: 0x000a, + 0x377c: 0x000a, 0x377d: 0x000a, 0x377e: 0x000a, + // Block 0xde, offset 0x3780 + 0x3780: 0x000a, 0x3781: 0x000a, 0x3782: 0x000a, 0x3783: 0x000a, 0x3784: 0x000a, 0x3785: 0x000a, + 0x3786: 0x000a, 0x3787: 0x000a, 0x3788: 0x000a, 0x3789: 0x000a, 0x378a: 0x000a, 0x378b: 0x000a, + 0x378c: 0x000a, 0x3790: 0x000a, 0x3791: 0x000a, + 0x3792: 0x000a, 0x3793: 0x000a, 0x3794: 0x000a, 0x3795: 0x000a, 0x3796: 0x000a, 0x3797: 0x000a, + 0x3798: 0x000a, 0x3799: 0x000a, 0x379a: 0x000a, 0x379b: 0x000a, 0x379c: 0x000a, 0x379d: 0x000a, + 0x379e: 0x000a, 0x379f: 0x000a, 0x37a0: 0x000a, 0x37a1: 0x000a, 0x37a2: 0x000a, 0x37a3: 0x000a, + 0x37a4: 0x000a, 0x37a5: 0x000a, 0x37a6: 0x000a, 0x37a7: 0x000a, 0x37a8: 0x000a, 0x37a9: 0x000a, + 0x37aa: 0x000a, 0x37ab: 0x000a, + // Block 0xdf, offset 0x37c0 + 0x37c0: 0x000a, 0x37c1: 0x000a, 0x37c2: 0x000a, 0x37c3: 0x000a, 0x37c4: 0x000a, 0x37c5: 0x000a, + 0x37c6: 0x000a, 0x37c7: 0x000a, 0x37c8: 0x000a, 0x37c9: 0x000a, 0x37ca: 0x000a, 0x37cb: 0x000a, + 0x37cc: 0x000a, 0x37cd: 0x000a, 0x37ce: 0x000a, 0x37cf: 0x000a, 0x37d0: 0x000a, 0x37d1: 0x000a, + 0x37d2: 0x000a, 0x37d3: 0x000a, 0x37d4: 0x000a, 0x37d5: 0x000a, 0x37d6: 0x000a, 0x37d7: 0x000a, + // Block 0xe0, offset 0x3800 + 0x3800: 0x000a, + 0x3810: 0x000a, 0x3811: 0x000a, + 0x3812: 0x000a, 0x3813: 0x000a, 0x3814: 0x000a, 0x3815: 0x000a, 0x3816: 0x000a, 0x3817: 0x000a, + 0x3818: 0x000a, 0x3819: 0x000a, 0x381a: 0x000a, 0x381b: 0x000a, 0x381c: 0x000a, 0x381d: 0x000a, + 0x381e: 0x000a, 0x381f: 0x000a, 0x3820: 0x000a, 0x3821: 0x000a, 0x3822: 0x000a, 0x3823: 0x000a, + 0x3824: 0x000a, 0x3825: 0x000a, 0x3826: 0x000a, + // Block 0xe1, offset 0x3840 + 0x387e: 0x000b, 0x387f: 0x000b, + // Block 0xe2, offset 0x3880 + 0x3880: 0x000b, 0x3881: 0x000b, 0x3882: 0x000b, 0x3883: 0x000b, 0x3884: 0x000b, 0x3885: 0x000b, + 0x3886: 0x000b, 0x3887: 0x000b, 0x3888: 0x000b, 0x3889: 0x000b, 0x388a: 0x000b, 0x388b: 0x000b, + 0x388c: 0x000b, 0x388d: 0x000b, 0x388e: 0x000b, 0x388f: 0x000b, 0x3890: 0x000b, 0x3891: 0x000b, + 0x3892: 0x000b, 0x3893: 0x000b, 0x3894: 0x000b, 0x3895: 0x000b, 0x3896: 0x000b, 0x3897: 0x000b, + 0x3898: 0x000b, 0x3899: 0x000b, 0x389a: 0x000b, 0x389b: 0x000b, 0x389c: 0x000b, 0x389d: 0x000b, + 0x389e: 0x000b, 0x389f: 0x000b, 0x38a0: 0x000b, 0x38a1: 0x000b, 0x38a2: 0x000b, 0x38a3: 0x000b, + 0x38a4: 0x000b, 0x38a5: 0x000b, 0x38a6: 0x000b, 0x38a7: 0x000b, 0x38a8: 0x000b, 0x38a9: 0x000b, + 0x38aa: 0x000b, 0x38ab: 0x000b, 0x38ac: 0x000b, 0x38ad: 0x000b, 0x38ae: 0x000b, 0x38af: 0x000b, + 0x38b0: 0x000b, 0x38b1: 0x000b, 0x38b2: 0x000b, 0x38b3: 0x000b, 0x38b4: 0x000b, 0x38b5: 0x000b, + 0x38b6: 0x000b, 0x38b7: 0x000b, 0x38b8: 0x000b, 0x38b9: 0x000b, 0x38ba: 0x000b, 0x38bb: 0x000b, + 0x38bc: 0x000b, 0x38bd: 0x000b, 0x38be: 0x000b, 0x38bf: 0x000b, + // Block 0xe3, offset 0x38c0 + 0x38c0: 0x000c, 0x38c1: 0x000c, 0x38c2: 0x000c, 0x38c3: 0x000c, 0x38c4: 0x000c, 0x38c5: 0x000c, + 0x38c6: 0x000c, 0x38c7: 0x000c, 0x38c8: 0x000c, 0x38c9: 0x000c, 0x38ca: 0x000c, 0x38cb: 0x000c, + 0x38cc: 0x000c, 0x38cd: 0x000c, 0x38ce: 0x000c, 0x38cf: 0x000c, 0x38d0: 0x000c, 0x38d1: 0x000c, + 0x38d2: 0x000c, 0x38d3: 0x000c, 0x38d4: 0x000c, 0x38d5: 0x000c, 0x38d6: 0x000c, 0x38d7: 0x000c, + 0x38d8: 0x000c, 0x38d9: 0x000c, 0x38da: 0x000c, 0x38db: 0x000c, 0x38dc: 0x000c, 0x38dd: 0x000c, + 0x38de: 0x000c, 0x38df: 0x000c, 0x38e0: 0x000c, 0x38e1: 0x000c, 0x38e2: 0x000c, 0x38e3: 0x000c, + 0x38e4: 0x000c, 0x38e5: 0x000c, 0x38e6: 0x000c, 0x38e7: 0x000c, 0x38e8: 0x000c, 0x38e9: 0x000c, + 0x38ea: 0x000c, 0x38eb: 0x000c, 0x38ec: 0x000c, 0x38ed: 0x000c, 0x38ee: 0x000c, 0x38ef: 0x000c, + 0x38f0: 0x000b, 0x38f1: 0x000b, 0x38f2: 0x000b, 0x38f3: 0x000b, 0x38f4: 0x000b, 0x38f5: 0x000b, + 0x38f6: 0x000b, 0x38f7: 0x000b, 0x38f8: 0x000b, 0x38f9: 0x000b, 0x38fa: 0x000b, 0x38fb: 0x000b, + 0x38fc: 0x000b, 0x38fd: 0x000b, 0x38fe: 0x000b, 0x38ff: 0x000b, +} + +// bidiIndex: 24 blocks, 1536 entries, 1536 bytes +// Block 0 is the zero block. +var bidiIndex = [1536]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, + 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, + 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, + 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, + 0xea: 0x07, 0xef: 0x08, + 0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15, + // Block 0x4, offset 0x100 + 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, + 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, + 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28, + 0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30, + // Block 0x5, offset 0x140 + 0x140: 0x31, 0x141: 0x32, 0x142: 0x33, + 0x14d: 0x34, 0x14e: 0x35, + 0x150: 0x36, + 0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b, + 0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40, + 0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47, + 0x170: 0x48, 0x173: 0x49, 0x177: 0x4a, + 0x17e: 0x4b, 0x17f: 0x4c, + // Block 0x6, offset 0x180 + 0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54, + 0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x54, + 0x190: 0x59, 0x191: 0x5a, 0x192: 0x5b, 0x193: 0x5c, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54, + 0x198: 0x54, 0x199: 0x54, 0x19a: 0x5d, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5e, 0x19e: 0x54, 0x19f: 0x5f, + 0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x60, 0x1a7: 0x61, + 0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x62, 0x1ae: 0x63, 0x1af: 0x64, + 0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67, + 0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70, + 0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76, + // Block 0x8, offset 0x200 + 0x237: 0x54, + // Block 0x9, offset 0x240 + 0x252: 0x77, 0x253: 0x78, + 0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e, + 0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85, + 0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26f: 0x8a, + // Block 0xa, offset 0x280 + 0x2ac: 0x8b, 0x2ad: 0x8c, 0x2ae: 0x0e, 0x2af: 0x0e, + 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8d, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8e, + 0x2b8: 0x8f, 0x2b9: 0x90, 0x2ba: 0x0e, 0x2bb: 0x91, 0x2bc: 0x92, 0x2bd: 0x93, 0x2bf: 0x94, + // Block 0xb, offset 0x2c0 + 0x2c4: 0x95, 0x2c5: 0x54, 0x2c6: 0x96, 0x2c7: 0x97, + 0x2cb: 0x98, 0x2cd: 0x99, + 0x2e0: 0x9a, 0x2e1: 0x9a, 0x2e2: 0x9a, 0x2e3: 0x9a, 0x2e4: 0x9b, 0x2e5: 0x9a, 0x2e6: 0x9a, 0x2e7: 0x9a, + 0x2e8: 0x9c, 0x2e9: 0x9a, 0x2ea: 0x9a, 0x2eb: 0x9d, 0x2ec: 0x9e, 0x2ed: 0x9a, 0x2ee: 0x9a, 0x2ef: 0x9a, + 0x2f0: 0x9a, 0x2f1: 0x9a, 0x2f2: 0x9a, 0x2f3: 0x9a, 0x2f4: 0x9a, 0x2f5: 0x9a, 0x2f6: 0x9a, 0x2f7: 0x9a, + 0x2f8: 0x9a, 0x2f9: 0x9f, 0x2fa: 0x9a, 0x2fb: 0x9a, 0x2fc: 0x9a, 0x2fd: 0x9a, 0x2fe: 0x9a, 0x2ff: 0x9a, + // Block 0xc, offset 0x300 + 0x300: 0xa0, 0x301: 0xa1, 0x302: 0xa2, 0x304: 0xa3, 0x305: 0xa4, 0x306: 0xa5, 0x307: 0xa6, + 0x308: 0xa7, 0x30b: 0xa8, 0x30c: 0xa9, 0x30d: 0xaa, + 0x310: 0xab, 0x311: 0xac, 0x312: 0xad, 0x313: 0xae, 0x316: 0xaf, 0x317: 0xb0, + 0x318: 0xb1, 0x319: 0xb2, 0x31a: 0xb3, 0x31c: 0xb4, + 0x328: 0xb5, 0x329: 0xb6, 0x32a: 0xb7, + 0x330: 0xb8, 0x332: 0xb9, 0x334: 0xba, 0x335: 0xbb, + // Block 0xd, offset 0x340 + 0x36b: 0xbc, 0x36c: 0xbd, + 0x37e: 0xbe, + // Block 0xe, offset 0x380 + 0x3b2: 0xbf, + // Block 0xf, offset 0x3c0 + 0x3c5: 0xc0, 0x3c6: 0xc1, + 0x3c8: 0x54, 0x3c9: 0xc2, 0x3cc: 0x54, 0x3cd: 0xc3, + 0x3db: 0xc4, 0x3dc: 0xc5, 0x3dd: 0xc6, 0x3de: 0xc7, 0x3df: 0xc8, + 0x3e8: 0xc9, 0x3e9: 0xca, 0x3ea: 0xcb, + // Block 0x10, offset 0x400 + 0x400: 0xcc, + 0x420: 0x9a, 0x421: 0x9a, 0x422: 0x9a, 0x423: 0xcd, 0x424: 0x9a, 0x425: 0xce, 0x426: 0x9a, 0x427: 0x9a, + 0x428: 0x9a, 0x429: 0x9a, 0x42a: 0x9a, 0x42b: 0x9a, 0x42c: 0x9a, 0x42d: 0x9a, 0x42e: 0x9a, 0x42f: 0x9a, + 0x430: 0x9a, 0x431: 0x9a, 0x432: 0x9a, 0x433: 0x9a, 0x434: 0x9a, 0x435: 0x9a, 0x436: 0x9a, 0x437: 0x9a, + 0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcf, 0x43c: 0x9a, 0x43d: 0x9a, 0x43e: 0x9a, 0x43f: 0x9a, + // Block 0x11, offset 0x440 + 0x440: 0xd0, 0x441: 0x54, 0x442: 0xd1, 0x443: 0xd2, 0x444: 0xd3, 0x445: 0xd4, + 0x449: 0xd5, 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54, + 0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54, + 0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd6, 0x45c: 0x54, 0x45d: 0x6b, 0x45e: 0x54, 0x45f: 0xd7, + 0x460: 0xd8, 0x461: 0xd9, 0x462: 0xda, 0x464: 0xdb, 0x465: 0xdc, 0x466: 0xdd, 0x467: 0xde, + 0x47f: 0xdf, + // Block 0x12, offset 0x480 + 0x4bf: 0xdf, + // Block 0x13, offset 0x4c0 + 0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b, + 0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f, + 0x4ef: 0x10, + 0x4ff: 0x10, + // Block 0x14, offset 0x500 + 0x50f: 0x10, + 0x51f: 0x10, + 0x52f: 0x10, + 0x53f: 0x10, + // Block 0x15, offset 0x540 + 0x540: 0xe0, 0x541: 0xe0, 0x542: 0xe0, 0x543: 0xe0, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xe1, + 0x548: 0xe0, 0x549: 0xe0, 0x54a: 0xe0, 0x54b: 0xe0, 0x54c: 0xe0, 0x54d: 0xe0, 0x54e: 0xe0, 0x54f: 0xe0, + 0x550: 0xe0, 0x551: 0xe0, 0x552: 0xe0, 0x553: 0xe0, 0x554: 0xe0, 0x555: 0xe0, 0x556: 0xe0, 0x557: 0xe0, + 0x558: 0xe0, 0x559: 0xe0, 0x55a: 0xe0, 0x55b: 0xe0, 0x55c: 0xe0, 0x55d: 0xe0, 0x55e: 0xe0, 0x55f: 0xe0, + 0x560: 0xe0, 0x561: 0xe0, 0x562: 0xe0, 0x563: 0xe0, 0x564: 0xe0, 0x565: 0xe0, 0x566: 0xe0, 0x567: 0xe0, + 0x568: 0xe0, 0x569: 0xe0, 0x56a: 0xe0, 0x56b: 0xe0, 0x56c: 0xe0, 0x56d: 0xe0, 0x56e: 0xe0, 0x56f: 0xe0, + 0x570: 0xe0, 0x571: 0xe0, 0x572: 0xe0, 0x573: 0xe0, 0x574: 0xe0, 0x575: 0xe0, 0x576: 0xe0, 0x577: 0xe0, + 0x578: 0xe0, 0x579: 0xe0, 0x57a: 0xe0, 0x57b: 0xe0, 0x57c: 0xe0, 0x57d: 0xe0, 0x57e: 0xe0, 0x57f: 0xe0, + // Block 0x16, offset 0x580 + 0x58f: 0x10, + 0x59f: 0x10, + 0x5a0: 0x13, + 0x5af: 0x10, + 0x5bf: 0x10, + // Block 0x17, offset 0x5c0 + 0x5cf: 0x10, +} + +// Total table size 16184 bytes (15KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go new file mode 100644 index 00000000..16b11db5 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go @@ -0,0 +1,1887 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// +build go1.13,!go1.14 + +package bidi + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "11.0.0" + +// xorMasks contains masks to be xor-ed with brackets to get the reverse +// version. +var xorMasks = []int32{ // 8 elements + 0, 1, 6, 7, 3, 15, 29, 63, +} // Size: 56 bytes + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// bidiTrie. Total size: 16512 bytes (16.12 KiB). Checksum: 2a9cf1317f2ffaa. +type bidiTrie struct{} + +func newBidiTrie(i int) *bidiTrie { + return &bidiTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(bidiValues[n<<6+uint32(b)]) + } +} + +// bidiValues: 234 blocks, 14976 entries, 14976 bytes +// The third block is the zero block. +var bidiValues = [14976]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, + 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, + 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, + 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, + 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, + 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, + 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, + 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, + 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, + 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, + 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, + // Block 0x1, offset 0x40 + 0x40: 0x000a, + 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, + 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, + 0x7b: 0x005a, + 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, + 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, + 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, + 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, + 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, + 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, + 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, + 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, + 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, + 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, + 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, + // Block 0x4, offset 0x100 + 0x117: 0x000a, + 0x137: 0x000a, + // Block 0x5, offset 0x140 + 0x179: 0x000a, 0x17a: 0x000a, + // Block 0x6, offset 0x180 + 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, + 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, + 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, + 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, + 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, + 0x19e: 0x000a, 0x19f: 0x000a, + 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, + 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, + 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, + 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, + 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, + 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, + 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, + 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, + 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, + 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, + 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, + 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, + 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, + 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, + 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, + // Block 0x8, offset 0x200 + 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, + 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, + 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, + 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, + 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, + 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, + 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, + 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, + 0x234: 0x000a, 0x235: 0x000a, + 0x23e: 0x000a, + // Block 0x9, offset 0x240 + 0x244: 0x000a, 0x245: 0x000a, + 0x247: 0x000a, + // Block 0xa, offset 0x280 + 0x2b6: 0x000a, + // Block 0xb, offset 0x2c0 + 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, + 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, + // Block 0xc, offset 0x300 + 0x30a: 0x000a, + 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, + 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, + 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, + 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, + 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, + 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, + 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, + 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, + 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, + // Block 0xd, offset 0x340 + 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, + 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, + 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, + 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, + 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, + 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, + 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, + 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, + 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, + 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, + 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, + // Block 0xe, offset 0x380 + 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, + 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, + 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, + 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, + 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, + 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, + 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, + 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, + 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, + 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, + 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, + 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, + 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, + 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, + 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, + 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, + 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, + 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, + 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, + 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, + 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, + // Block 0x10, offset 0x400 + 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, + 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, + 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, + 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, + 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, + 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, + 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, + 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, + 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, + 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, + 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, + // Block 0x11, offset 0x440 + 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, + 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, + 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, + 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, + 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, + 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, + 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, + 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, + 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, + 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, + 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, + // Block 0x12, offset 0x480 + 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, + 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, + 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, + 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, + 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, + 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, + 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, + 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, + 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, + 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, + 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, + 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, + 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, + 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, + 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, + 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, + 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, + 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, + 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, + 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, + 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, + // Block 0x14, offset 0x500 + 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, + 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, + 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, + 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, + 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, + 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, + 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, + 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, + 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, + 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, + 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, + // Block 0x15, offset 0x540 + 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, + 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, + 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, + 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, + 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, + 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, + 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, + 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, + 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, + 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, + 0x57c: 0x0001, 0x57d: 0x000c, 0x57e: 0x0001, 0x57f: 0x0001, + // Block 0x16, offset 0x580 + 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, + 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, + 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, + 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, + 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, + 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, + 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, + 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, + 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, + 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, + 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, + 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, + 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, + 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, + 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, + 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d, + 0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d, + 0x5ea: 0x000d, 0x5eb: 0x000d, 0x5ec: 0x000d, 0x5ed: 0x000d, 0x5ee: 0x000d, 0x5ef: 0x000d, + 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001, + 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001, + 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001, + // Block 0x18, offset 0x600 + 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001, + 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001, + 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001, + 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, + 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001, + 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, + 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, + 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, + 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, + 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, + 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, + // Block 0x19, offset 0x640 + 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, + 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d, + 0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d, + 0x652: 0x000d, 0x653: 0x000c, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, + 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, + 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, + 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, + 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, + 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, + 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, + 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, + // Block 0x1a, offset 0x680 + 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, + 0x6ba: 0x000c, + 0x6bc: 0x000c, + // Block 0x1b, offset 0x6c0 + 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, + 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, + 0x6cd: 0x000c, 0x6d1: 0x000c, + 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, + 0x6e2: 0x000c, 0x6e3: 0x000c, + // Block 0x1c, offset 0x700 + 0x701: 0x000c, + 0x73c: 0x000c, + // Block 0x1d, offset 0x740 + 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, + 0x74d: 0x000c, + 0x762: 0x000c, 0x763: 0x000c, + 0x772: 0x0004, 0x773: 0x0004, + 0x77b: 0x0004, + 0x77e: 0x000c, + // Block 0x1e, offset 0x780 + 0x781: 0x000c, 0x782: 0x000c, + 0x7bc: 0x000c, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x000c, 0x7c2: 0x000c, + 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, + 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, + 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, + // Block 0x20, offset 0x800 + 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, + 0x807: 0x000c, 0x808: 0x000c, + 0x80d: 0x000c, + 0x822: 0x000c, 0x823: 0x000c, + 0x831: 0x0004, + 0x83a: 0x000c, 0x83b: 0x000c, + 0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c, + // Block 0x21, offset 0x840 + 0x841: 0x000c, + 0x87c: 0x000c, 0x87f: 0x000c, + // Block 0x22, offset 0x880 + 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, + 0x88d: 0x000c, + 0x896: 0x000c, + 0x8a2: 0x000c, 0x8a3: 0x000c, + // Block 0x23, offset 0x8c0 + 0x8c2: 0x000c, + // Block 0x24, offset 0x900 + 0x900: 0x000c, + 0x90d: 0x000c, + 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, + 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, + // Block 0x25, offset 0x940 + 0x940: 0x000c, 0x944: 0x000c, + 0x97e: 0x000c, 0x97f: 0x000c, + // Block 0x26, offset 0x980 + 0x980: 0x000c, + 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, + 0x98c: 0x000c, 0x98d: 0x000c, + 0x995: 0x000c, 0x996: 0x000c, + 0x9a2: 0x000c, 0x9a3: 0x000c, + 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, + 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, + // Block 0x27, offset 0x9c0 + 0x9cc: 0x000c, 0x9cd: 0x000c, + 0x9e2: 0x000c, 0x9e3: 0x000c, + // Block 0x28, offset 0xa00 + 0xa00: 0x000c, 0xa01: 0x000c, + 0xa3b: 0x000c, + 0xa3c: 0x000c, + // Block 0x29, offset 0xa40 + 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, + 0xa4d: 0x000c, + 0xa62: 0x000c, 0xa63: 0x000c, + // Block 0x2a, offset 0xa80 + 0xa8a: 0x000c, + 0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c, + // Block 0x2b, offset 0xac0 + 0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c, + 0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c, + 0xaff: 0x0004, + // Block 0x2c, offset 0xb00 + 0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c, + 0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c, + // Block 0x2d, offset 0xb40 + 0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c, + 0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c, + 0xb7c: 0x000c, + // Block 0x2e, offset 0xb80 + 0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c, + 0xb8c: 0x000c, 0xb8d: 0x000c, + // Block 0x2f, offset 0xbc0 + 0xbd8: 0x000c, 0xbd9: 0x000c, + 0xbf5: 0x000c, + 0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a, + 0xbfc: 0x003a, 0xbfd: 0x002a, + // Block 0x30, offset 0xc00 + 0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c, + 0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c, + 0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c, + // Block 0x31, offset 0xc40 + 0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c, + 0xc46: 0x000c, 0xc47: 0x000c, + 0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c, + 0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c, + 0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c, + 0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c, + 0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c, + 0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c, + 0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, + 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, + 0xc7c: 0x000c, + // Block 0x32, offset 0xc80 + 0xc86: 0x000c, + // Block 0x33, offset 0xcc0 + 0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c, + 0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c, + 0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c, + 0xcfd: 0x000c, 0xcfe: 0x000c, + // Block 0x34, offset 0xd00 + 0xd18: 0x000c, 0xd19: 0x000c, + 0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c, + 0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, + // Block 0x35, offset 0xd40 + 0xd42: 0x000c, 0xd45: 0x000c, + 0xd46: 0x000c, + 0xd4d: 0x000c, + 0xd5d: 0x000c, + // Block 0x36, offset 0xd80 + 0xd9d: 0x000c, + 0xd9e: 0x000c, 0xd9f: 0x000c, + // Block 0x37, offset 0xdc0 + 0xdd0: 0x000a, 0xdd1: 0x000a, + 0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a, + 0xdd8: 0x000a, 0xdd9: 0x000a, + // Block 0x38, offset 0xe00 + 0xe00: 0x000a, + // Block 0x39, offset 0xe40 + 0xe40: 0x0009, + 0xe5b: 0x007a, 0xe5c: 0x006a, + // Block 0x3a, offset 0xe80 + 0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c, + 0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c, + // Block 0x3b, offset 0xec0 + 0xed2: 0x000c, 0xed3: 0x000c, + 0xef2: 0x000c, 0xef3: 0x000c, + // Block 0x3c, offset 0xf00 + 0xf34: 0x000c, 0xf35: 0x000c, + 0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c, + 0xf3c: 0x000c, 0xf3d: 0x000c, + // Block 0x3d, offset 0xf40 + 0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c, + 0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c, + 0xf52: 0x000c, 0xf53: 0x000c, + 0xf5b: 0x0004, 0xf5d: 0x000c, + 0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a, + 0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a, + // Block 0x3e, offset 0xf80 + 0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a, + 0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c, + 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b, + // Block 0x3f, offset 0xfc0 + 0xfc5: 0x000c, + 0xfc6: 0x000c, + 0xfe9: 0x000c, + // Block 0x40, offset 0x1000 + 0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c, + 0x1027: 0x000c, 0x1028: 0x000c, + 0x1032: 0x000c, + 0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c, + // Block 0x41, offset 0x1040 + 0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a, + // Block 0x42, offset 0x1080 + 0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a, + 0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a, + 0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a, + 0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a, + 0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a, + 0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a, + // Block 0x43, offset 0x10c0 + 0x10d7: 0x000c, + 0x10d8: 0x000c, 0x10db: 0x000c, + // Block 0x44, offset 0x1100 + 0x1116: 0x000c, + 0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c, + 0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c, + 0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c, + 0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c, + 0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c, + 0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c, + 0x113c: 0x000c, 0x113f: 0x000c, + // Block 0x45, offset 0x1140 + 0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, + 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, + 0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c, + // Block 0x46, offset 0x1180 + 0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c, + 0x11b4: 0x000c, + 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, + 0x11bc: 0x000c, + // Block 0x47, offset 0x11c0 + 0x11c2: 0x000c, + 0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c, + 0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c, + // Block 0x48, offset 0x1200 + 0x1200: 0x000c, 0x1201: 0x000c, + 0x1222: 0x000c, 0x1223: 0x000c, + 0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c, + 0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c, + // Block 0x49, offset 0x1240 + 0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c, + 0x126d: 0x000c, 0x126f: 0x000c, + 0x1270: 0x000c, 0x1271: 0x000c, + // Block 0x4a, offset 0x1280 + 0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c, + 0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c, + 0x12b6: 0x000c, 0x12b7: 0x000c, + // Block 0x4b, offset 0x12c0 + 0x12d0: 0x000c, 0x12d1: 0x000c, + 0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c, + 0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c, + 0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c, + 0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c, + 0x12ed: 0x000c, + 0x12f4: 0x000c, + 0x12f8: 0x000c, 0x12f9: 0x000c, + // Block 0x4c, offset 0x1300 + 0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c, + 0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c, + 0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c, + 0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c, + 0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c, + 0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c, + 0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c, + 0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, + 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c, + 0x1336: 0x000c, 0x1337: 0x000c, 0x1338: 0x000c, 0x1339: 0x000c, 0x133b: 0x000c, + 0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c, + // Block 0x4d, offset 0x1340 + 0x137d: 0x000a, 0x137f: 0x000a, + // Block 0x4e, offset 0x1380 + 0x1380: 0x000a, 0x1381: 0x000a, + 0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a, + 0x139d: 0x000a, + 0x139e: 0x000a, 0x139f: 0x000a, + 0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a, + 0x13bd: 0x000a, 0x13be: 0x000a, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009, + 0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b, + 0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a, + 0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a, + 0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a, + 0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a, + 0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007, + 0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006, + 0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a, + 0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a, + 0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a, + // Block 0x50, offset 0x1400 + 0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a, + 0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a, + 0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a, + 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, + 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, + 0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b, + 0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e, + 0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b, + 0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002, + 0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003, + 0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a, + // Block 0x51, offset 0x1440 + 0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002, + 0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003, + 0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a, + 0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004, + 0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004, + 0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004, + 0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004, + 0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004, + 0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004, + // Block 0x52, offset 0x1480 + 0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004, + 0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004, + 0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c, + 0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c, + 0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c, + 0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c, + 0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c, + 0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c, + 0x14b0: 0x000c, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a, + 0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a, + 0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a, + 0x14d8: 0x000a, + 0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a, + 0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a, + 0x14ee: 0x0004, + 0x14fa: 0x000a, 0x14fb: 0x000a, + // Block 0x54, offset 0x1500 + 0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, + 0x150a: 0x000a, 0x150b: 0x000a, + 0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a, + 0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, + 0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a, + 0x151e: 0x000a, 0x151f: 0x000a, + // Block 0x55, offset 0x1540 + 0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a, + 0x1550: 0x000a, 0x1551: 0x000a, + 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, + 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, + 0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a, + 0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a, + 0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a, + 0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a, + 0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a, + 0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a, + // Block 0x56, offset 0x1580 + 0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a, + 0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, + 0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a, + 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, + 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, + 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, + 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, + 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, + 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, + 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, + 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, + 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, + 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, + 0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, + 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, + 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, + 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, + 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, + 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, + 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, + 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, + // Block 0x58, offset 0x1600 + 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, + 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a, + 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, + 0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, + 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, + 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, + 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a, + 0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, + 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, + // Block 0x59, offset 0x1640 + 0x167b: 0x000a, + 0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a, + // Block 0x5a, offset 0x1680 + 0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a, + 0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a, + 0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a, + 0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a, + 0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a, + 0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a, + 0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a, + 0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a, + 0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a, + 0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a, + 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, + 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, + 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, + 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, + 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, + 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, + 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, + // Block 0x5c, offset 0x1700 + 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, + 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, + 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, + 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, 0x1727: 0x000a, 0x1728: 0x000a, 0x1729: 0x000a, + 0x172a: 0x000a, 0x172b: 0x000a, 0x172c: 0x000a, 0x172d: 0x000a, 0x172e: 0x000a, 0x172f: 0x000a, + 0x1730: 0x000a, 0x1731: 0x000a, 0x1732: 0x000a, 0x1733: 0x000a, 0x1734: 0x000a, 0x1735: 0x000a, + 0x1736: 0x000a, 0x1737: 0x000a, 0x1738: 0x000a, 0x1739: 0x000a, 0x173a: 0x000a, 0x173b: 0x000a, + 0x173c: 0x000a, 0x173d: 0x000a, 0x173e: 0x000a, 0x173f: 0x000a, + // Block 0x5d, offset 0x1740 + 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, + 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x0002, 0x1749: 0x0002, 0x174a: 0x0002, 0x174b: 0x0002, + 0x174c: 0x0002, 0x174d: 0x0002, 0x174e: 0x0002, 0x174f: 0x0002, 0x1750: 0x0002, 0x1751: 0x0002, + 0x1752: 0x0002, 0x1753: 0x0002, 0x1754: 0x0002, 0x1755: 0x0002, 0x1756: 0x0002, 0x1757: 0x0002, + 0x1758: 0x0002, 0x1759: 0x0002, 0x175a: 0x0002, 0x175b: 0x0002, + // Block 0x5e, offset 0x1780 + 0x17aa: 0x000a, 0x17ab: 0x000a, 0x17ac: 0x000a, 0x17ad: 0x000a, 0x17ae: 0x000a, 0x17af: 0x000a, + 0x17b0: 0x000a, 0x17b1: 0x000a, 0x17b2: 0x000a, 0x17b3: 0x000a, 0x17b4: 0x000a, 0x17b5: 0x000a, + 0x17b6: 0x000a, 0x17b7: 0x000a, 0x17b8: 0x000a, 0x17b9: 0x000a, 0x17ba: 0x000a, 0x17bb: 0x000a, + 0x17bc: 0x000a, 0x17bd: 0x000a, 0x17be: 0x000a, 0x17bf: 0x000a, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x000a, 0x17c1: 0x000a, 0x17c2: 0x000a, 0x17c3: 0x000a, 0x17c4: 0x000a, 0x17c5: 0x000a, + 0x17c6: 0x000a, 0x17c7: 0x000a, 0x17c8: 0x000a, 0x17c9: 0x000a, 0x17ca: 0x000a, 0x17cb: 0x000a, + 0x17cc: 0x000a, 0x17cd: 0x000a, 0x17ce: 0x000a, 0x17cf: 0x000a, 0x17d0: 0x000a, 0x17d1: 0x000a, + 0x17d2: 0x000a, 0x17d3: 0x000a, 0x17d4: 0x000a, 0x17d5: 0x000a, 0x17d6: 0x000a, 0x17d7: 0x000a, + 0x17d8: 0x000a, 0x17d9: 0x000a, 0x17da: 0x000a, 0x17db: 0x000a, 0x17dc: 0x000a, 0x17dd: 0x000a, + 0x17de: 0x000a, 0x17df: 0x000a, 0x17e0: 0x000a, 0x17e1: 0x000a, 0x17e2: 0x000a, 0x17e3: 0x000a, + 0x17e4: 0x000a, 0x17e5: 0x000a, 0x17e6: 0x000a, 0x17e7: 0x000a, 0x17e8: 0x000a, 0x17e9: 0x000a, + 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, + 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, + 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, + 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, + // Block 0x60, offset 0x1800 + 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, + 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, + 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, + 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, + 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, + 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, + 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x003a, 0x1829: 0x002a, + 0x182a: 0x003a, 0x182b: 0x002a, 0x182c: 0x003a, 0x182d: 0x002a, 0x182e: 0x003a, 0x182f: 0x002a, + 0x1830: 0x003a, 0x1831: 0x002a, 0x1832: 0x003a, 0x1833: 0x002a, 0x1834: 0x003a, 0x1835: 0x002a, + 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, + 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, + // Block 0x61, offset 0x1840 + 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x009a, + 0x1846: 0x008a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, + 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, + 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, + 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, + 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, + 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x003a, 0x1867: 0x002a, 0x1868: 0x003a, 0x1869: 0x002a, + 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, + 0x1870: 0x000a, 0x1871: 0x000a, 0x1872: 0x000a, 0x1873: 0x000a, 0x1874: 0x000a, 0x1875: 0x000a, + 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, + 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, + // Block 0x62, offset 0x1880 + 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x007a, 0x1884: 0x006a, 0x1885: 0x009a, + 0x1886: 0x008a, 0x1887: 0x00ba, 0x1888: 0x00aa, 0x1889: 0x009a, 0x188a: 0x008a, 0x188b: 0x007a, + 0x188c: 0x006a, 0x188d: 0x00da, 0x188e: 0x002a, 0x188f: 0x003a, 0x1890: 0x00ca, 0x1891: 0x009a, + 0x1892: 0x008a, 0x1893: 0x007a, 0x1894: 0x006a, 0x1895: 0x009a, 0x1896: 0x008a, 0x1897: 0x00ba, + 0x1898: 0x00aa, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, + 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, + 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x000a, 0x18a7: 0x000a, 0x18a8: 0x000a, 0x18a9: 0x000a, + 0x18aa: 0x000a, 0x18ab: 0x000a, 0x18ac: 0x000a, 0x18ad: 0x000a, 0x18ae: 0x000a, 0x18af: 0x000a, + 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, + 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, + 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x000a, 0x18c4: 0x000a, 0x18c5: 0x000a, + 0x18c6: 0x000a, 0x18c7: 0x000a, 0x18c8: 0x000a, 0x18c9: 0x000a, 0x18ca: 0x000a, 0x18cb: 0x000a, + 0x18cc: 0x000a, 0x18cd: 0x000a, 0x18ce: 0x000a, 0x18cf: 0x000a, 0x18d0: 0x000a, 0x18d1: 0x000a, + 0x18d2: 0x000a, 0x18d3: 0x000a, 0x18d4: 0x000a, 0x18d5: 0x000a, 0x18d6: 0x000a, 0x18d7: 0x000a, + 0x18d8: 0x003a, 0x18d9: 0x002a, 0x18da: 0x003a, 0x18db: 0x002a, 0x18dc: 0x000a, 0x18dd: 0x000a, + 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, + 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, + 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, + 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, + 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, + 0x18fc: 0x003a, 0x18fd: 0x002a, 0x18fe: 0x000a, 0x18ff: 0x000a, + // Block 0x64, offset 0x1900 + 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, + 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, + 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, + 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, + 0x1918: 0x000a, 0x1919: 0x000a, 0x191a: 0x000a, 0x191b: 0x000a, 0x191c: 0x000a, 0x191d: 0x000a, + 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, + 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, + 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, + 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, + 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, + 0x193c: 0x000a, 0x193d: 0x000a, 0x193e: 0x000a, 0x193f: 0x000a, + // Block 0x65, offset 0x1940 + 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, + 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, + 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, + 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, + 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, + 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, + 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, + 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, + 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, 0x1974: 0x000a, 0x1975: 0x000a, + 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, + 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, + // Block 0x66, offset 0x1980 + 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, + 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, + 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, + 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, 0x1996: 0x000a, 0x1997: 0x000a, + 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a, + 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a, + 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, + 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, + 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a, + 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, 0x19ba: 0x000a, 0x19bb: 0x000a, + 0x19bc: 0x000a, 0x19bd: 0x000a, 0x19be: 0x000a, + // Block 0x67, offset 0x19c0 + 0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a, + 0x19ea: 0x000a, 0x19ef: 0x000c, + 0x19f0: 0x000c, 0x19f1: 0x000c, + 0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a, + 0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a, + // Block 0x68, offset 0x1a00 + 0x1a3f: 0x000c, + // Block 0x69, offset 0x1a40 + 0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c, + 0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c, + 0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c, + 0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c, + 0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c, + 0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a, + 0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a, + 0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a, + 0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a, + 0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a, + 0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a, + 0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a, + 0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a, + 0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a, + 0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a, + 0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, + 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, + 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a, + 0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a, + 0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a, + 0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a, + 0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a, + 0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a, + 0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a, + 0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a, + 0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a, + 0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a, + 0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, + 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, + 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, + 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, + 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, + 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, + 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, + 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, + 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, + 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, + 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, + 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, + 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a, + 0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, + 0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a, + 0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a, + 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a, + 0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a, + 0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a, + 0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c, + 0x1bf0: 0x000a, + 0x1bf6: 0x000a, 0x1bf7: 0x000a, + 0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a, + // Block 0x70, offset 0x1c00 + 0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a, + 0x1c20: 0x000a, + // Block 0x71, offset 0x1c40 + 0x1c7b: 0x000a, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a, + 0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a, + 0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a, + 0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a, + 0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a, + 0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a, + // Block 0x73, offset 0x1cc0 + 0x1cdd: 0x000a, + 0x1cde: 0x000a, + // Block 0x74, offset 0x1d00 + 0x1d10: 0x000a, 0x1d11: 0x000a, + 0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a, + 0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a, + 0x1d1e: 0x000a, 0x1d1f: 0x000a, + 0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a, + // Block 0x75, offset 0x1d40 + 0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a, + 0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a, + 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a, + // Block 0x76, offset 0x1d80 + 0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a, + // Block 0x77, offset 0x1dc0 + 0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a, + // Block 0x78, offset 0x1e00 + 0x1e1e: 0x000a, 0x1e1f: 0x000a, + 0x1e3f: 0x000a, + // Block 0x79, offset 0x1e40 + 0x1e50: 0x000a, 0x1e51: 0x000a, + 0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a, + 0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a, + 0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a, + 0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a, + 0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a, + 0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a, + 0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a, + 0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a, + 0x1e86: 0x000a, + // Block 0x7b, offset 0x1ec0 + 0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a, + // Block 0x7c, offset 0x1f00 + 0x1f2f: 0x000c, + 0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c, + 0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c, + 0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a, + // Block 0x7d, offset 0x1f40 + 0x1f5e: 0x000c, 0x1f5f: 0x000c, + // Block 0x7e, offset 0x1f80 + 0x1fb0: 0x000c, 0x1fb1: 0x000c, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a, + 0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a, + 0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a, + 0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a, + 0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a, + 0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a, + // Block 0x80, offset 0x2000 + 0x2008: 0x000a, + // Block 0x81, offset 0x2040 + 0x2042: 0x000c, + 0x2046: 0x000c, 0x204b: 0x000c, + 0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a, + 0x206a: 0x000a, 0x206b: 0x000a, + 0x2078: 0x0004, 0x2079: 0x0004, + // Block 0x82, offset 0x2080 + 0x20b4: 0x000a, 0x20b5: 0x000a, + 0x20b6: 0x000a, 0x20b7: 0x000a, + // Block 0x83, offset 0x20c0 + 0x20c4: 0x000c, 0x20c5: 0x000c, + 0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c, + 0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c, + 0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c, + 0x20f0: 0x000c, 0x20f1: 0x000c, + 0x20ff: 0x000c, + // Block 0x84, offset 0x2100 + 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, + 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, + // Block 0x85, offset 0x2140 + 0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c, + 0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c, + // Block 0x86, offset 0x2180 + 0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c, + 0x21b3: 0x000c, + 0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c, + 0x21bc: 0x000c, + // Block 0x87, offset 0x21c0 + 0x21e5: 0x000c, + // Block 0x88, offset 0x2200 + 0x2229: 0x000c, + 0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c, + 0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c, + 0x2236: 0x000c, + // Block 0x89, offset 0x2240 + 0x2243: 0x000c, + 0x224c: 0x000c, + 0x227c: 0x000c, + // Block 0x8a, offset 0x2280 + 0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c, + 0x22b7: 0x000c, 0x22b8: 0x000c, + 0x22be: 0x000c, 0x22bf: 0x000c, + // Block 0x8b, offset 0x22c0 + 0x22c1: 0x000c, + 0x22ec: 0x000c, 0x22ed: 0x000c, + 0x22f6: 0x000c, + // Block 0x8c, offset 0x2300 + 0x2325: 0x000c, 0x2328: 0x000c, + 0x232d: 0x000c, + // Block 0x8d, offset 0x2340 + 0x235d: 0x0001, + 0x235e: 0x000c, 0x235f: 0x0001, 0x2360: 0x0001, 0x2361: 0x0001, 0x2362: 0x0001, 0x2363: 0x0001, + 0x2364: 0x0001, 0x2365: 0x0001, 0x2366: 0x0001, 0x2367: 0x0001, 0x2368: 0x0001, 0x2369: 0x0003, + 0x236a: 0x0001, 0x236b: 0x0001, 0x236c: 0x0001, 0x236d: 0x0001, 0x236e: 0x0001, 0x236f: 0x0001, + 0x2370: 0x0001, 0x2371: 0x0001, 0x2372: 0x0001, 0x2373: 0x0001, 0x2374: 0x0001, 0x2375: 0x0001, + 0x2376: 0x0001, 0x2377: 0x0001, 0x2378: 0x0001, 0x2379: 0x0001, 0x237a: 0x0001, 0x237b: 0x0001, + 0x237c: 0x0001, 0x237d: 0x0001, 0x237e: 0x0001, 0x237f: 0x0001, + // Block 0x8e, offset 0x2380 + 0x2380: 0x0001, 0x2381: 0x0001, 0x2382: 0x0001, 0x2383: 0x0001, 0x2384: 0x0001, 0x2385: 0x0001, + 0x2386: 0x0001, 0x2387: 0x0001, 0x2388: 0x0001, 0x2389: 0x0001, 0x238a: 0x0001, 0x238b: 0x0001, + 0x238c: 0x0001, 0x238d: 0x0001, 0x238e: 0x0001, 0x238f: 0x0001, 0x2390: 0x000d, 0x2391: 0x000d, + 0x2392: 0x000d, 0x2393: 0x000d, 0x2394: 0x000d, 0x2395: 0x000d, 0x2396: 0x000d, 0x2397: 0x000d, + 0x2398: 0x000d, 0x2399: 0x000d, 0x239a: 0x000d, 0x239b: 0x000d, 0x239c: 0x000d, 0x239d: 0x000d, + 0x239e: 0x000d, 0x239f: 0x000d, 0x23a0: 0x000d, 0x23a1: 0x000d, 0x23a2: 0x000d, 0x23a3: 0x000d, + 0x23a4: 0x000d, 0x23a5: 0x000d, 0x23a6: 0x000d, 0x23a7: 0x000d, 0x23a8: 0x000d, 0x23a9: 0x000d, + 0x23aa: 0x000d, 0x23ab: 0x000d, 0x23ac: 0x000d, 0x23ad: 0x000d, 0x23ae: 0x000d, 0x23af: 0x000d, + 0x23b0: 0x000d, 0x23b1: 0x000d, 0x23b2: 0x000d, 0x23b3: 0x000d, 0x23b4: 0x000d, 0x23b5: 0x000d, + 0x23b6: 0x000d, 0x23b7: 0x000d, 0x23b8: 0x000d, 0x23b9: 0x000d, 0x23ba: 0x000d, 0x23bb: 0x000d, + 0x23bc: 0x000d, 0x23bd: 0x000d, 0x23be: 0x000d, 0x23bf: 0x000d, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x000d, 0x23c1: 0x000d, 0x23c2: 0x000d, 0x23c3: 0x000d, 0x23c4: 0x000d, 0x23c5: 0x000d, + 0x23c6: 0x000d, 0x23c7: 0x000d, 0x23c8: 0x000d, 0x23c9: 0x000d, 0x23ca: 0x000d, 0x23cb: 0x000d, + 0x23cc: 0x000d, 0x23cd: 0x000d, 0x23ce: 0x000d, 0x23cf: 0x000d, 0x23d0: 0x000d, 0x23d1: 0x000d, + 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, + 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, + 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, + 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, + 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, + 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, + 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, + 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000a, 0x23ff: 0x000a, + // Block 0x90, offset 0x2400 + 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, + 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, + 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000b, 0x2411: 0x000b, + 0x2412: 0x000b, 0x2413: 0x000b, 0x2414: 0x000b, 0x2415: 0x000b, 0x2416: 0x000b, 0x2417: 0x000b, + 0x2418: 0x000b, 0x2419: 0x000b, 0x241a: 0x000b, 0x241b: 0x000b, 0x241c: 0x000b, 0x241d: 0x000b, + 0x241e: 0x000b, 0x241f: 0x000b, 0x2420: 0x000b, 0x2421: 0x000b, 0x2422: 0x000b, 0x2423: 0x000b, + 0x2424: 0x000b, 0x2425: 0x000b, 0x2426: 0x000b, 0x2427: 0x000b, 0x2428: 0x000b, 0x2429: 0x000b, + 0x242a: 0x000b, 0x242b: 0x000b, 0x242c: 0x000b, 0x242d: 0x000b, 0x242e: 0x000b, 0x242f: 0x000b, + 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, + 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, + 0x243c: 0x000d, 0x243d: 0x000a, 0x243e: 0x000d, 0x243f: 0x000d, + // Block 0x91, offset 0x2440 + 0x2440: 0x000c, 0x2441: 0x000c, 0x2442: 0x000c, 0x2443: 0x000c, 0x2444: 0x000c, 0x2445: 0x000c, + 0x2446: 0x000c, 0x2447: 0x000c, 0x2448: 0x000c, 0x2449: 0x000c, 0x244a: 0x000c, 0x244b: 0x000c, + 0x244c: 0x000c, 0x244d: 0x000c, 0x244e: 0x000c, 0x244f: 0x000c, 0x2450: 0x000a, 0x2451: 0x000a, + 0x2452: 0x000a, 0x2453: 0x000a, 0x2454: 0x000a, 0x2455: 0x000a, 0x2456: 0x000a, 0x2457: 0x000a, + 0x2458: 0x000a, 0x2459: 0x000a, + 0x2460: 0x000c, 0x2461: 0x000c, 0x2462: 0x000c, 0x2463: 0x000c, + 0x2464: 0x000c, 0x2465: 0x000c, 0x2466: 0x000c, 0x2467: 0x000c, 0x2468: 0x000c, 0x2469: 0x000c, + 0x246a: 0x000c, 0x246b: 0x000c, 0x246c: 0x000c, 0x246d: 0x000c, 0x246e: 0x000c, 0x246f: 0x000c, + 0x2470: 0x000a, 0x2471: 0x000a, 0x2472: 0x000a, 0x2473: 0x000a, 0x2474: 0x000a, 0x2475: 0x000a, + 0x2476: 0x000a, 0x2477: 0x000a, 0x2478: 0x000a, 0x2479: 0x000a, 0x247a: 0x000a, 0x247b: 0x000a, + 0x247c: 0x000a, 0x247d: 0x000a, 0x247e: 0x000a, 0x247f: 0x000a, + // Block 0x92, offset 0x2480 + 0x2480: 0x000a, 0x2481: 0x000a, 0x2482: 0x000a, 0x2483: 0x000a, 0x2484: 0x000a, 0x2485: 0x000a, + 0x2486: 0x000a, 0x2487: 0x000a, 0x2488: 0x000a, 0x2489: 0x000a, 0x248a: 0x000a, 0x248b: 0x000a, + 0x248c: 0x000a, 0x248d: 0x000a, 0x248e: 0x000a, 0x248f: 0x000a, 0x2490: 0x0006, 0x2491: 0x000a, + 0x2492: 0x0006, 0x2494: 0x000a, 0x2495: 0x0006, 0x2496: 0x000a, 0x2497: 0x000a, + 0x2498: 0x000a, 0x2499: 0x009a, 0x249a: 0x008a, 0x249b: 0x007a, 0x249c: 0x006a, 0x249d: 0x009a, + 0x249e: 0x008a, 0x249f: 0x0004, 0x24a0: 0x000a, 0x24a1: 0x000a, 0x24a2: 0x0003, 0x24a3: 0x0003, + 0x24a4: 0x000a, 0x24a5: 0x000a, 0x24a6: 0x000a, 0x24a8: 0x000a, 0x24a9: 0x0004, + 0x24aa: 0x0004, 0x24ab: 0x000a, + 0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d, + 0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d, + 0x24bc: 0x000d, 0x24bd: 0x000d, 0x24be: 0x000d, 0x24bf: 0x000d, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x000d, 0x24c1: 0x000d, 0x24c2: 0x000d, 0x24c3: 0x000d, 0x24c4: 0x000d, 0x24c5: 0x000d, + 0x24c6: 0x000d, 0x24c7: 0x000d, 0x24c8: 0x000d, 0x24c9: 0x000d, 0x24ca: 0x000d, 0x24cb: 0x000d, + 0x24cc: 0x000d, 0x24cd: 0x000d, 0x24ce: 0x000d, 0x24cf: 0x000d, 0x24d0: 0x000d, 0x24d1: 0x000d, + 0x24d2: 0x000d, 0x24d3: 0x000d, 0x24d4: 0x000d, 0x24d5: 0x000d, 0x24d6: 0x000d, 0x24d7: 0x000d, + 0x24d8: 0x000d, 0x24d9: 0x000d, 0x24da: 0x000d, 0x24db: 0x000d, 0x24dc: 0x000d, 0x24dd: 0x000d, + 0x24de: 0x000d, 0x24df: 0x000d, 0x24e0: 0x000d, 0x24e1: 0x000d, 0x24e2: 0x000d, 0x24e3: 0x000d, + 0x24e4: 0x000d, 0x24e5: 0x000d, 0x24e6: 0x000d, 0x24e7: 0x000d, 0x24e8: 0x000d, 0x24e9: 0x000d, + 0x24ea: 0x000d, 0x24eb: 0x000d, 0x24ec: 0x000d, 0x24ed: 0x000d, 0x24ee: 0x000d, 0x24ef: 0x000d, + 0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d, + 0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d, + 0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000b, + // Block 0x94, offset 0x2500 + 0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x0004, 0x2504: 0x0004, 0x2505: 0x0004, + 0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x003a, 0x2509: 0x002a, 0x250a: 0x000a, 0x250b: 0x0003, + 0x250c: 0x0006, 0x250d: 0x0003, 0x250e: 0x0006, 0x250f: 0x0006, 0x2510: 0x0002, 0x2511: 0x0002, + 0x2512: 0x0002, 0x2513: 0x0002, 0x2514: 0x0002, 0x2515: 0x0002, 0x2516: 0x0002, 0x2517: 0x0002, + 0x2518: 0x0002, 0x2519: 0x0002, 0x251a: 0x0006, 0x251b: 0x000a, 0x251c: 0x000a, 0x251d: 0x000a, + 0x251e: 0x000a, 0x251f: 0x000a, 0x2520: 0x000a, + 0x253b: 0x005a, + 0x253c: 0x000a, 0x253d: 0x004a, 0x253e: 0x000a, 0x253f: 0x000a, + // Block 0x95, offset 0x2540 + 0x2540: 0x000a, + 0x255b: 0x005a, 0x255c: 0x000a, 0x255d: 0x004a, + 0x255e: 0x000a, 0x255f: 0x00fa, 0x2560: 0x00ea, 0x2561: 0x000a, 0x2562: 0x003a, 0x2563: 0x002a, + 0x2564: 0x000a, 0x2565: 0x000a, + // Block 0x96, offset 0x2580 + 0x25a0: 0x0004, 0x25a1: 0x0004, 0x25a2: 0x000a, 0x25a3: 0x000a, + 0x25a4: 0x000a, 0x25a5: 0x0004, 0x25a6: 0x0004, 0x25a8: 0x000a, 0x25a9: 0x000a, + 0x25aa: 0x000a, 0x25ab: 0x000a, 0x25ac: 0x000a, 0x25ad: 0x000a, 0x25ae: 0x000a, + 0x25b0: 0x000b, 0x25b1: 0x000b, 0x25b2: 0x000b, 0x25b3: 0x000b, 0x25b4: 0x000b, 0x25b5: 0x000b, + 0x25b6: 0x000b, 0x25b7: 0x000b, 0x25b8: 0x000b, 0x25b9: 0x000a, 0x25ba: 0x000a, 0x25bb: 0x000a, + 0x25bc: 0x000a, 0x25bd: 0x000a, 0x25be: 0x000b, 0x25bf: 0x000b, + // Block 0x97, offset 0x25c0 + 0x25c1: 0x000a, + // Block 0x98, offset 0x2600 + 0x2600: 0x000a, 0x2601: 0x000a, 0x2602: 0x000a, 0x2603: 0x000a, 0x2604: 0x000a, 0x2605: 0x000a, + 0x2606: 0x000a, 0x2607: 0x000a, 0x2608: 0x000a, 0x2609: 0x000a, 0x260a: 0x000a, 0x260b: 0x000a, + 0x260c: 0x000a, 0x2610: 0x000a, 0x2611: 0x000a, + 0x2612: 0x000a, 0x2613: 0x000a, 0x2614: 0x000a, 0x2615: 0x000a, 0x2616: 0x000a, 0x2617: 0x000a, + 0x2618: 0x000a, 0x2619: 0x000a, 0x261a: 0x000a, 0x261b: 0x000a, + 0x2620: 0x000a, + // Block 0x99, offset 0x2640 + 0x267d: 0x000c, + // Block 0x9a, offset 0x2680 + 0x26a0: 0x000c, 0x26a1: 0x0002, 0x26a2: 0x0002, 0x26a3: 0x0002, + 0x26a4: 0x0002, 0x26a5: 0x0002, 0x26a6: 0x0002, 0x26a7: 0x0002, 0x26a8: 0x0002, 0x26a9: 0x0002, + 0x26aa: 0x0002, 0x26ab: 0x0002, 0x26ac: 0x0002, 0x26ad: 0x0002, 0x26ae: 0x0002, 0x26af: 0x0002, + 0x26b0: 0x0002, 0x26b1: 0x0002, 0x26b2: 0x0002, 0x26b3: 0x0002, 0x26b4: 0x0002, 0x26b5: 0x0002, + 0x26b6: 0x0002, 0x26b7: 0x0002, 0x26b8: 0x0002, 0x26b9: 0x0002, 0x26ba: 0x0002, 0x26bb: 0x0002, + // Block 0x9b, offset 0x26c0 + 0x26f6: 0x000c, 0x26f7: 0x000c, 0x26f8: 0x000c, 0x26f9: 0x000c, 0x26fa: 0x000c, + // Block 0x9c, offset 0x2700 + 0x2700: 0x0001, 0x2701: 0x0001, 0x2702: 0x0001, 0x2703: 0x0001, 0x2704: 0x0001, 0x2705: 0x0001, + 0x2706: 0x0001, 0x2707: 0x0001, 0x2708: 0x0001, 0x2709: 0x0001, 0x270a: 0x0001, 0x270b: 0x0001, + 0x270c: 0x0001, 0x270d: 0x0001, 0x270e: 0x0001, 0x270f: 0x0001, 0x2710: 0x0001, 0x2711: 0x0001, + 0x2712: 0x0001, 0x2713: 0x0001, 0x2714: 0x0001, 0x2715: 0x0001, 0x2716: 0x0001, 0x2717: 0x0001, + 0x2718: 0x0001, 0x2719: 0x0001, 0x271a: 0x0001, 0x271b: 0x0001, 0x271c: 0x0001, 0x271d: 0x0001, + 0x271e: 0x0001, 0x271f: 0x0001, 0x2720: 0x0001, 0x2721: 0x0001, 0x2722: 0x0001, 0x2723: 0x0001, + 0x2724: 0x0001, 0x2725: 0x0001, 0x2726: 0x0001, 0x2727: 0x0001, 0x2728: 0x0001, 0x2729: 0x0001, + 0x272a: 0x0001, 0x272b: 0x0001, 0x272c: 0x0001, 0x272d: 0x0001, 0x272e: 0x0001, 0x272f: 0x0001, + 0x2730: 0x0001, 0x2731: 0x0001, 0x2732: 0x0001, 0x2733: 0x0001, 0x2734: 0x0001, 0x2735: 0x0001, + 0x2736: 0x0001, 0x2737: 0x0001, 0x2738: 0x0001, 0x2739: 0x0001, 0x273a: 0x0001, 0x273b: 0x0001, + 0x273c: 0x0001, 0x273d: 0x0001, 0x273e: 0x0001, 0x273f: 0x0001, + // Block 0x9d, offset 0x2740 + 0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001, + 0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001, + 0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001, + 0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001, + 0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001, + 0x275e: 0x0001, 0x275f: 0x000a, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001, + 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001, + 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001, + 0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001, + 0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001, + 0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0001, 0x2781: 0x000c, 0x2782: 0x000c, 0x2783: 0x000c, 0x2784: 0x0001, 0x2785: 0x000c, + 0x2786: 0x000c, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, + 0x278c: 0x000c, 0x278d: 0x000c, 0x278e: 0x000c, 0x278f: 0x000c, 0x2790: 0x0001, 0x2791: 0x0001, + 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, + 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, + 0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, + 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, + 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, + 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, + 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x000c, 0x27b9: 0x000c, 0x27ba: 0x000c, 0x27bb: 0x0001, + 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x000c, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001, + 0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, + 0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001, + 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, + 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, + 0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, + 0x27e4: 0x0001, 0x27e5: 0x000c, 0x27e6: 0x000c, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, + 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, + 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, + 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001, + 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001, + // Block 0xa0, offset 0x2800 + 0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001, + 0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, + 0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001, + 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, + 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, + 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, + 0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, + 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, + 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, + 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x000a, 0x283a: 0x000a, 0x283b: 0x000a, + 0x283c: 0x000a, 0x283d: 0x000a, 0x283e: 0x000a, 0x283f: 0x000a, + // Block 0xa1, offset 0x2840 + 0x2840: 0x000d, 0x2841: 0x000d, 0x2842: 0x000d, 0x2843: 0x000d, 0x2844: 0x000d, 0x2845: 0x000d, + 0x2846: 0x000d, 0x2847: 0x000d, 0x2848: 0x000d, 0x2849: 0x000d, 0x284a: 0x000d, 0x284b: 0x000d, + 0x284c: 0x000d, 0x284d: 0x000d, 0x284e: 0x000d, 0x284f: 0x000d, 0x2850: 0x000d, 0x2851: 0x000d, + 0x2852: 0x000d, 0x2853: 0x000d, 0x2854: 0x000d, 0x2855: 0x000d, 0x2856: 0x000d, 0x2857: 0x000d, + 0x2858: 0x000d, 0x2859: 0x000d, 0x285a: 0x000d, 0x285b: 0x000d, 0x285c: 0x000d, 0x285d: 0x000d, + 0x285e: 0x000d, 0x285f: 0x000d, 0x2860: 0x000d, 0x2861: 0x000d, 0x2862: 0x000d, 0x2863: 0x000d, + 0x2864: 0x000c, 0x2865: 0x000c, 0x2866: 0x000c, 0x2867: 0x000c, 0x2868: 0x000d, 0x2869: 0x000d, + 0x286a: 0x000d, 0x286b: 0x000d, 0x286c: 0x000d, 0x286d: 0x000d, 0x286e: 0x000d, 0x286f: 0x000d, + 0x2870: 0x0005, 0x2871: 0x0005, 0x2872: 0x0005, 0x2873: 0x0005, 0x2874: 0x0005, 0x2875: 0x0005, + 0x2876: 0x0005, 0x2877: 0x0005, 0x2878: 0x0005, 0x2879: 0x0005, 0x287a: 0x000d, 0x287b: 0x000d, + 0x287c: 0x000d, 0x287d: 0x000d, 0x287e: 0x000d, 0x287f: 0x000d, + // Block 0xa2, offset 0x2880 + 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, + 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, + 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, + 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, + 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, + 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0005, 0x28a1: 0x0005, 0x28a2: 0x0005, 0x28a3: 0x0005, + 0x28a4: 0x0005, 0x28a5: 0x0005, 0x28a6: 0x0005, 0x28a7: 0x0005, 0x28a8: 0x0005, 0x28a9: 0x0005, + 0x28aa: 0x0005, 0x28ab: 0x0005, 0x28ac: 0x0005, 0x28ad: 0x0005, 0x28ae: 0x0005, 0x28af: 0x0005, + 0x28b0: 0x0005, 0x28b1: 0x0005, 0x28b2: 0x0005, 0x28b3: 0x0005, 0x28b4: 0x0005, 0x28b5: 0x0005, + 0x28b6: 0x0005, 0x28b7: 0x0005, 0x28b8: 0x0005, 0x28b9: 0x0005, 0x28ba: 0x0005, 0x28bb: 0x0005, + 0x28bc: 0x0005, 0x28bd: 0x0005, 0x28be: 0x0005, 0x28bf: 0x0001, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x0001, 0x28c1: 0x0001, 0x28c2: 0x0001, 0x28c3: 0x0001, 0x28c4: 0x0001, 0x28c5: 0x0001, + 0x28c6: 0x0001, 0x28c7: 0x0001, 0x28c8: 0x0001, 0x28c9: 0x0001, 0x28ca: 0x0001, 0x28cb: 0x0001, + 0x28cc: 0x0001, 0x28cd: 0x0001, 0x28ce: 0x0001, 0x28cf: 0x0001, 0x28d0: 0x0001, 0x28d1: 0x0001, + 0x28d2: 0x0001, 0x28d3: 0x0001, 0x28d4: 0x0001, 0x28d5: 0x0001, 0x28d6: 0x0001, 0x28d7: 0x0001, + 0x28d8: 0x0001, 0x28d9: 0x0001, 0x28da: 0x0001, 0x28db: 0x0001, 0x28dc: 0x0001, 0x28dd: 0x0001, + 0x28de: 0x0001, 0x28df: 0x0001, 0x28e0: 0x0001, 0x28e1: 0x0001, 0x28e2: 0x0001, 0x28e3: 0x0001, + 0x28e4: 0x0001, 0x28e5: 0x0001, 0x28e6: 0x0001, 0x28e7: 0x0001, 0x28e8: 0x0001, 0x28e9: 0x0001, + 0x28ea: 0x0001, 0x28eb: 0x0001, 0x28ec: 0x0001, 0x28ed: 0x0001, 0x28ee: 0x0001, 0x28ef: 0x0001, + 0x28f0: 0x000d, 0x28f1: 0x000d, 0x28f2: 0x000d, 0x28f3: 0x000d, 0x28f4: 0x000d, 0x28f5: 0x000d, + 0x28f6: 0x000d, 0x28f7: 0x000d, 0x28f8: 0x000d, 0x28f9: 0x000d, 0x28fa: 0x000d, 0x28fb: 0x000d, + 0x28fc: 0x000d, 0x28fd: 0x000d, 0x28fe: 0x000d, 0x28ff: 0x000d, + // Block 0xa4, offset 0x2900 + 0x2900: 0x000d, 0x2901: 0x000d, 0x2902: 0x000d, 0x2903: 0x000d, 0x2904: 0x000d, 0x2905: 0x000d, + 0x2906: 0x000c, 0x2907: 0x000c, 0x2908: 0x000c, 0x2909: 0x000c, 0x290a: 0x000c, 0x290b: 0x000c, + 0x290c: 0x000c, 0x290d: 0x000c, 0x290e: 0x000c, 0x290f: 0x000c, 0x2910: 0x000c, 0x2911: 0x000d, + 0x2912: 0x000d, 0x2913: 0x000d, 0x2914: 0x000d, 0x2915: 0x000d, 0x2916: 0x000d, 0x2917: 0x000d, + 0x2918: 0x000d, 0x2919: 0x000d, 0x291a: 0x000d, 0x291b: 0x000d, 0x291c: 0x000d, 0x291d: 0x000d, + 0x291e: 0x000d, 0x291f: 0x000d, 0x2920: 0x000d, 0x2921: 0x000d, 0x2922: 0x000d, 0x2923: 0x000d, + 0x2924: 0x000d, 0x2925: 0x000d, 0x2926: 0x000d, 0x2927: 0x000d, 0x2928: 0x000d, 0x2929: 0x000d, + 0x292a: 0x000d, 0x292b: 0x000d, 0x292c: 0x000d, 0x292d: 0x000d, 0x292e: 0x000d, 0x292f: 0x000d, + 0x2930: 0x0001, 0x2931: 0x0001, 0x2932: 0x0001, 0x2933: 0x0001, 0x2934: 0x0001, 0x2935: 0x0001, + 0x2936: 0x0001, 0x2937: 0x0001, 0x2938: 0x0001, 0x2939: 0x0001, 0x293a: 0x0001, 0x293b: 0x0001, + 0x293c: 0x0001, 0x293d: 0x0001, 0x293e: 0x0001, 0x293f: 0x0001, + // Block 0xa5, offset 0x2940 + 0x2941: 0x000c, + 0x2978: 0x000c, 0x2979: 0x000c, 0x297a: 0x000c, 0x297b: 0x000c, + 0x297c: 0x000c, 0x297d: 0x000c, 0x297e: 0x000c, 0x297f: 0x000c, + // Block 0xa6, offset 0x2980 + 0x2980: 0x000c, 0x2981: 0x000c, 0x2982: 0x000c, 0x2983: 0x000c, 0x2984: 0x000c, 0x2985: 0x000c, + 0x2986: 0x000c, + 0x2992: 0x000a, 0x2993: 0x000a, 0x2994: 0x000a, 0x2995: 0x000a, 0x2996: 0x000a, 0x2997: 0x000a, + 0x2998: 0x000a, 0x2999: 0x000a, 0x299a: 0x000a, 0x299b: 0x000a, 0x299c: 0x000a, 0x299d: 0x000a, + 0x299e: 0x000a, 0x299f: 0x000a, 0x29a0: 0x000a, 0x29a1: 0x000a, 0x29a2: 0x000a, 0x29a3: 0x000a, + 0x29a4: 0x000a, 0x29a5: 0x000a, + 0x29bf: 0x000c, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x000c, 0x29c1: 0x000c, + 0x29f3: 0x000c, 0x29f4: 0x000c, 0x29f5: 0x000c, + 0x29f6: 0x000c, 0x29f9: 0x000c, 0x29fa: 0x000c, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x000c, 0x2a01: 0x000c, 0x2a02: 0x000c, + 0x2a27: 0x000c, 0x2a28: 0x000c, 0x2a29: 0x000c, + 0x2a2a: 0x000c, 0x2a2b: 0x000c, 0x2a2d: 0x000c, 0x2a2e: 0x000c, 0x2a2f: 0x000c, + 0x2a30: 0x000c, 0x2a31: 0x000c, 0x2a32: 0x000c, 0x2a33: 0x000c, 0x2a34: 0x000c, + // Block 0xa9, offset 0x2a40 + 0x2a73: 0x000c, + // Block 0xaa, offset 0x2a80 + 0x2a80: 0x000c, 0x2a81: 0x000c, + 0x2ab6: 0x000c, 0x2ab7: 0x000c, 0x2ab8: 0x000c, 0x2ab9: 0x000c, 0x2aba: 0x000c, 0x2abb: 0x000c, + 0x2abc: 0x000c, 0x2abd: 0x000c, 0x2abe: 0x000c, + // Block 0xab, offset 0x2ac0 + 0x2ac9: 0x000c, 0x2aca: 0x000c, 0x2acb: 0x000c, + 0x2acc: 0x000c, + // Block 0xac, offset 0x2b00 + 0x2b2f: 0x000c, + 0x2b30: 0x000c, 0x2b31: 0x000c, 0x2b34: 0x000c, + 0x2b36: 0x000c, 0x2b37: 0x000c, + 0x2b3e: 0x000c, + // Block 0xad, offset 0x2b40 + 0x2b5f: 0x000c, 0x2b63: 0x000c, + 0x2b64: 0x000c, 0x2b65: 0x000c, 0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, + 0x2b6a: 0x000c, + // Block 0xae, offset 0x2b80 + 0x2b80: 0x000c, + 0x2ba6: 0x000c, 0x2ba7: 0x000c, 0x2ba8: 0x000c, 0x2ba9: 0x000c, + 0x2baa: 0x000c, 0x2bab: 0x000c, 0x2bac: 0x000c, + 0x2bb0: 0x000c, 0x2bb1: 0x000c, 0x2bb2: 0x000c, 0x2bb3: 0x000c, 0x2bb4: 0x000c, + // Block 0xaf, offset 0x2bc0 + 0x2bf8: 0x000c, 0x2bf9: 0x000c, 0x2bfa: 0x000c, 0x2bfb: 0x000c, + 0x2bfc: 0x000c, 0x2bfd: 0x000c, 0x2bfe: 0x000c, 0x2bff: 0x000c, + // Block 0xb0, offset 0x2c00 + 0x2c02: 0x000c, 0x2c03: 0x000c, 0x2c04: 0x000c, + 0x2c06: 0x000c, + 0x2c1e: 0x000c, + // Block 0xb1, offset 0x2c40 + 0x2c73: 0x000c, 0x2c74: 0x000c, 0x2c75: 0x000c, + 0x2c76: 0x000c, 0x2c77: 0x000c, 0x2c78: 0x000c, 0x2c7a: 0x000c, + 0x2c7f: 0x000c, + // Block 0xb2, offset 0x2c80 + 0x2c80: 0x000c, 0x2c82: 0x000c, 0x2c83: 0x000c, + // Block 0xb3, offset 0x2cc0 + 0x2cf2: 0x000c, 0x2cf3: 0x000c, 0x2cf4: 0x000c, 0x2cf5: 0x000c, + 0x2cfc: 0x000c, 0x2cfd: 0x000c, 0x2cff: 0x000c, + // Block 0xb4, offset 0x2d00 + 0x2d00: 0x000c, + 0x2d1c: 0x000c, 0x2d1d: 0x000c, + // Block 0xb5, offset 0x2d40 + 0x2d73: 0x000c, 0x2d74: 0x000c, 0x2d75: 0x000c, + 0x2d76: 0x000c, 0x2d77: 0x000c, 0x2d78: 0x000c, 0x2d79: 0x000c, 0x2d7a: 0x000c, + 0x2d7d: 0x000c, 0x2d7f: 0x000c, + // Block 0xb6, offset 0x2d80 + 0x2d80: 0x000c, + 0x2da0: 0x000a, 0x2da1: 0x000a, 0x2da2: 0x000a, 0x2da3: 0x000a, + 0x2da4: 0x000a, 0x2da5: 0x000a, 0x2da6: 0x000a, 0x2da7: 0x000a, 0x2da8: 0x000a, 0x2da9: 0x000a, + 0x2daa: 0x000a, 0x2dab: 0x000a, 0x2dac: 0x000a, + // Block 0xb7, offset 0x2dc0 + 0x2deb: 0x000c, 0x2ded: 0x000c, + 0x2df0: 0x000c, 0x2df1: 0x000c, 0x2df2: 0x000c, 0x2df3: 0x000c, 0x2df4: 0x000c, 0x2df5: 0x000c, + 0x2df7: 0x000c, + // Block 0xb8, offset 0x2e00 + 0x2e1d: 0x000c, + 0x2e1e: 0x000c, 0x2e1f: 0x000c, 0x2e22: 0x000c, 0x2e23: 0x000c, + 0x2e24: 0x000c, 0x2e25: 0x000c, 0x2e27: 0x000c, 0x2e28: 0x000c, 0x2e29: 0x000c, + 0x2e2a: 0x000c, 0x2e2b: 0x000c, + // Block 0xb9, offset 0x2e40 + 0x2e6f: 0x000c, + 0x2e70: 0x000c, 0x2e71: 0x000c, 0x2e72: 0x000c, 0x2e73: 0x000c, 0x2e74: 0x000c, 0x2e75: 0x000c, + 0x2e76: 0x000c, 0x2e77: 0x000c, 0x2e79: 0x000c, 0x2e7a: 0x000c, + // Block 0xba, offset 0x2e80 + 0x2e81: 0x000c, 0x2e82: 0x000c, 0x2e83: 0x000c, 0x2e84: 0x000c, 0x2e85: 0x000c, + 0x2e86: 0x000c, 0x2e89: 0x000c, 0x2e8a: 0x000c, + 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c, + 0x2eb6: 0x000c, 0x2eb7: 0x000c, 0x2eb8: 0x000c, 0x2ebb: 0x000c, + 0x2ebc: 0x000c, 0x2ebd: 0x000c, 0x2ebe: 0x000c, + // Block 0xbb, offset 0x2ec0 + 0x2ec7: 0x000c, + 0x2ed1: 0x000c, + 0x2ed2: 0x000c, 0x2ed3: 0x000c, 0x2ed4: 0x000c, 0x2ed5: 0x000c, 0x2ed6: 0x000c, + 0x2ed9: 0x000c, 0x2eda: 0x000c, 0x2edb: 0x000c, + // Block 0xbc, offset 0x2f00 + 0x2f0a: 0x000c, 0x2f0b: 0x000c, + 0x2f0c: 0x000c, 0x2f0d: 0x000c, 0x2f0e: 0x000c, 0x2f0f: 0x000c, 0x2f10: 0x000c, 0x2f11: 0x000c, + 0x2f12: 0x000c, 0x2f13: 0x000c, 0x2f14: 0x000c, 0x2f15: 0x000c, 0x2f16: 0x000c, + 0x2f18: 0x000c, 0x2f19: 0x000c, + // Block 0xbd, offset 0x2f40 + 0x2f70: 0x000c, 0x2f71: 0x000c, 0x2f72: 0x000c, 0x2f73: 0x000c, 0x2f74: 0x000c, 0x2f75: 0x000c, + 0x2f76: 0x000c, 0x2f78: 0x000c, 0x2f79: 0x000c, 0x2f7a: 0x000c, 0x2f7b: 0x000c, + 0x2f7c: 0x000c, 0x2f7d: 0x000c, + // Block 0xbe, offset 0x2f80 + 0x2f92: 0x000c, 0x2f93: 0x000c, 0x2f94: 0x000c, 0x2f95: 0x000c, 0x2f96: 0x000c, 0x2f97: 0x000c, + 0x2f98: 0x000c, 0x2f99: 0x000c, 0x2f9a: 0x000c, 0x2f9b: 0x000c, 0x2f9c: 0x000c, 0x2f9d: 0x000c, + 0x2f9e: 0x000c, 0x2f9f: 0x000c, 0x2fa0: 0x000c, 0x2fa1: 0x000c, 0x2fa2: 0x000c, 0x2fa3: 0x000c, + 0x2fa4: 0x000c, 0x2fa5: 0x000c, 0x2fa6: 0x000c, 0x2fa7: 0x000c, + 0x2faa: 0x000c, 0x2fab: 0x000c, 0x2fac: 0x000c, 0x2fad: 0x000c, 0x2fae: 0x000c, 0x2faf: 0x000c, + 0x2fb0: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb5: 0x000c, + 0x2fb6: 0x000c, + // Block 0xbf, offset 0x2fc0 + 0x2ff1: 0x000c, 0x2ff2: 0x000c, 0x2ff3: 0x000c, 0x2ff4: 0x000c, 0x2ff5: 0x000c, + 0x2ff6: 0x000c, 0x2ffa: 0x000c, + 0x2ffc: 0x000c, 0x2ffd: 0x000c, 0x2fff: 0x000c, + // Block 0xc0, offset 0x3000 + 0x3000: 0x000c, 0x3001: 0x000c, 0x3002: 0x000c, 0x3003: 0x000c, 0x3004: 0x000c, 0x3005: 0x000c, + 0x3007: 0x000c, + // Block 0xc1, offset 0x3040 + 0x3050: 0x000c, 0x3051: 0x000c, + 0x3055: 0x000c, 0x3057: 0x000c, + // Block 0xc2, offset 0x3080 + 0x30b3: 0x000c, 0x30b4: 0x000c, + // Block 0xc3, offset 0x30c0 + 0x30f0: 0x000c, 0x30f1: 0x000c, 0x30f2: 0x000c, 0x30f3: 0x000c, 0x30f4: 0x000c, + // Block 0xc4, offset 0x3100 + 0x3130: 0x000c, 0x3131: 0x000c, 0x3132: 0x000c, 0x3133: 0x000c, 0x3134: 0x000c, 0x3135: 0x000c, + 0x3136: 0x000c, + // Block 0xc5, offset 0x3140 + 0x314f: 0x000c, 0x3150: 0x000c, 0x3151: 0x000c, + 0x3152: 0x000c, + // Block 0xc6, offset 0x3180 + 0x319d: 0x000c, + 0x319e: 0x000c, 0x31a0: 0x000b, 0x31a1: 0x000b, 0x31a2: 0x000b, 0x31a3: 0x000b, + // Block 0xc7, offset 0x31c0 + 0x31e7: 0x000c, 0x31e8: 0x000c, 0x31e9: 0x000c, + 0x31f3: 0x000b, 0x31f4: 0x000b, 0x31f5: 0x000b, + 0x31f6: 0x000b, 0x31f7: 0x000b, 0x31f8: 0x000b, 0x31f9: 0x000b, 0x31fa: 0x000b, 0x31fb: 0x000c, + 0x31fc: 0x000c, 0x31fd: 0x000c, 0x31fe: 0x000c, 0x31ff: 0x000c, + // Block 0xc8, offset 0x3200 + 0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3205: 0x000c, + 0x3206: 0x000c, 0x3207: 0x000c, 0x3208: 0x000c, 0x3209: 0x000c, 0x320a: 0x000c, 0x320b: 0x000c, + 0x322a: 0x000c, 0x322b: 0x000c, 0x322c: 0x000c, 0x322d: 0x000c, + // Block 0xc9, offset 0x3240 + 0x3240: 0x000a, 0x3241: 0x000a, 0x3242: 0x000c, 0x3243: 0x000c, 0x3244: 0x000c, 0x3245: 0x000a, + // Block 0xca, offset 0x3280 + 0x3280: 0x000a, 0x3281: 0x000a, 0x3282: 0x000a, 0x3283: 0x000a, 0x3284: 0x000a, 0x3285: 0x000a, + 0x3286: 0x000a, 0x3287: 0x000a, 0x3288: 0x000a, 0x3289: 0x000a, 0x328a: 0x000a, 0x328b: 0x000a, + 0x328c: 0x000a, 0x328d: 0x000a, 0x328e: 0x000a, 0x328f: 0x000a, 0x3290: 0x000a, 0x3291: 0x000a, + 0x3292: 0x000a, 0x3293: 0x000a, 0x3294: 0x000a, 0x3295: 0x000a, 0x3296: 0x000a, + // Block 0xcb, offset 0x32c0 + 0x32db: 0x000a, + // Block 0xcc, offset 0x3300 + 0x3315: 0x000a, + // Block 0xcd, offset 0x3340 + 0x334f: 0x000a, + // Block 0xce, offset 0x3380 + 0x3389: 0x000a, + // Block 0xcf, offset 0x33c0 + 0x33c3: 0x000a, + 0x33ce: 0x0002, 0x33cf: 0x0002, 0x33d0: 0x0002, 0x33d1: 0x0002, + 0x33d2: 0x0002, 0x33d3: 0x0002, 0x33d4: 0x0002, 0x33d5: 0x0002, 0x33d6: 0x0002, 0x33d7: 0x0002, + 0x33d8: 0x0002, 0x33d9: 0x0002, 0x33da: 0x0002, 0x33db: 0x0002, 0x33dc: 0x0002, 0x33dd: 0x0002, + 0x33de: 0x0002, 0x33df: 0x0002, 0x33e0: 0x0002, 0x33e1: 0x0002, 0x33e2: 0x0002, 0x33e3: 0x0002, + 0x33e4: 0x0002, 0x33e5: 0x0002, 0x33e6: 0x0002, 0x33e7: 0x0002, 0x33e8: 0x0002, 0x33e9: 0x0002, + 0x33ea: 0x0002, 0x33eb: 0x0002, 0x33ec: 0x0002, 0x33ed: 0x0002, 0x33ee: 0x0002, 0x33ef: 0x0002, + 0x33f0: 0x0002, 0x33f1: 0x0002, 0x33f2: 0x0002, 0x33f3: 0x0002, 0x33f4: 0x0002, 0x33f5: 0x0002, + 0x33f6: 0x0002, 0x33f7: 0x0002, 0x33f8: 0x0002, 0x33f9: 0x0002, 0x33fa: 0x0002, 0x33fb: 0x0002, + 0x33fc: 0x0002, 0x33fd: 0x0002, 0x33fe: 0x0002, 0x33ff: 0x0002, + // Block 0xd0, offset 0x3400 + 0x3400: 0x000c, 0x3401: 0x000c, 0x3402: 0x000c, 0x3403: 0x000c, 0x3404: 0x000c, 0x3405: 0x000c, + 0x3406: 0x000c, 0x3407: 0x000c, 0x3408: 0x000c, 0x3409: 0x000c, 0x340a: 0x000c, 0x340b: 0x000c, + 0x340c: 0x000c, 0x340d: 0x000c, 0x340e: 0x000c, 0x340f: 0x000c, 0x3410: 0x000c, 0x3411: 0x000c, + 0x3412: 0x000c, 0x3413: 0x000c, 0x3414: 0x000c, 0x3415: 0x000c, 0x3416: 0x000c, 0x3417: 0x000c, + 0x3418: 0x000c, 0x3419: 0x000c, 0x341a: 0x000c, 0x341b: 0x000c, 0x341c: 0x000c, 0x341d: 0x000c, + 0x341e: 0x000c, 0x341f: 0x000c, 0x3420: 0x000c, 0x3421: 0x000c, 0x3422: 0x000c, 0x3423: 0x000c, + 0x3424: 0x000c, 0x3425: 0x000c, 0x3426: 0x000c, 0x3427: 0x000c, 0x3428: 0x000c, 0x3429: 0x000c, + 0x342a: 0x000c, 0x342b: 0x000c, 0x342c: 0x000c, 0x342d: 0x000c, 0x342e: 0x000c, 0x342f: 0x000c, + 0x3430: 0x000c, 0x3431: 0x000c, 0x3432: 0x000c, 0x3433: 0x000c, 0x3434: 0x000c, 0x3435: 0x000c, + 0x3436: 0x000c, 0x343b: 0x000c, + 0x343c: 0x000c, 0x343d: 0x000c, 0x343e: 0x000c, 0x343f: 0x000c, + // Block 0xd1, offset 0x3440 + 0x3440: 0x000c, 0x3441: 0x000c, 0x3442: 0x000c, 0x3443: 0x000c, 0x3444: 0x000c, 0x3445: 0x000c, + 0x3446: 0x000c, 0x3447: 0x000c, 0x3448: 0x000c, 0x3449: 0x000c, 0x344a: 0x000c, 0x344b: 0x000c, + 0x344c: 0x000c, 0x344d: 0x000c, 0x344e: 0x000c, 0x344f: 0x000c, 0x3450: 0x000c, 0x3451: 0x000c, + 0x3452: 0x000c, 0x3453: 0x000c, 0x3454: 0x000c, 0x3455: 0x000c, 0x3456: 0x000c, 0x3457: 0x000c, + 0x3458: 0x000c, 0x3459: 0x000c, 0x345a: 0x000c, 0x345b: 0x000c, 0x345c: 0x000c, 0x345d: 0x000c, + 0x345e: 0x000c, 0x345f: 0x000c, 0x3460: 0x000c, 0x3461: 0x000c, 0x3462: 0x000c, 0x3463: 0x000c, + 0x3464: 0x000c, 0x3465: 0x000c, 0x3466: 0x000c, 0x3467: 0x000c, 0x3468: 0x000c, 0x3469: 0x000c, + 0x346a: 0x000c, 0x346b: 0x000c, 0x346c: 0x000c, + 0x3475: 0x000c, + // Block 0xd2, offset 0x3480 + 0x3484: 0x000c, + 0x349b: 0x000c, 0x349c: 0x000c, 0x349d: 0x000c, + 0x349e: 0x000c, 0x349f: 0x000c, 0x34a1: 0x000c, 0x34a2: 0x000c, 0x34a3: 0x000c, + 0x34a4: 0x000c, 0x34a5: 0x000c, 0x34a6: 0x000c, 0x34a7: 0x000c, 0x34a8: 0x000c, 0x34a9: 0x000c, + 0x34aa: 0x000c, 0x34ab: 0x000c, 0x34ac: 0x000c, 0x34ad: 0x000c, 0x34ae: 0x000c, 0x34af: 0x000c, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x000c, 0x34c1: 0x000c, 0x34c2: 0x000c, 0x34c3: 0x000c, 0x34c4: 0x000c, 0x34c5: 0x000c, + 0x34c6: 0x000c, 0x34c8: 0x000c, 0x34c9: 0x000c, 0x34ca: 0x000c, 0x34cb: 0x000c, + 0x34cc: 0x000c, 0x34cd: 0x000c, 0x34ce: 0x000c, 0x34cf: 0x000c, 0x34d0: 0x000c, 0x34d1: 0x000c, + 0x34d2: 0x000c, 0x34d3: 0x000c, 0x34d4: 0x000c, 0x34d5: 0x000c, 0x34d6: 0x000c, 0x34d7: 0x000c, + 0x34d8: 0x000c, 0x34db: 0x000c, 0x34dc: 0x000c, 0x34dd: 0x000c, + 0x34de: 0x000c, 0x34df: 0x000c, 0x34e0: 0x000c, 0x34e1: 0x000c, 0x34e3: 0x000c, + 0x34e4: 0x000c, 0x34e6: 0x000c, 0x34e7: 0x000c, 0x34e8: 0x000c, 0x34e9: 0x000c, + 0x34ea: 0x000c, + // Block 0xd4, offset 0x3500 + 0x3500: 0x0001, 0x3501: 0x0001, 0x3502: 0x0001, 0x3503: 0x0001, 0x3504: 0x0001, 0x3505: 0x0001, + 0x3506: 0x0001, 0x3507: 0x0001, 0x3508: 0x0001, 0x3509: 0x0001, 0x350a: 0x0001, 0x350b: 0x0001, + 0x350c: 0x0001, 0x350d: 0x0001, 0x350e: 0x0001, 0x350f: 0x0001, 0x3510: 0x000c, 0x3511: 0x000c, + 0x3512: 0x000c, 0x3513: 0x000c, 0x3514: 0x000c, 0x3515: 0x000c, 0x3516: 0x000c, 0x3517: 0x0001, + 0x3518: 0x0001, 0x3519: 0x0001, 0x351a: 0x0001, 0x351b: 0x0001, 0x351c: 0x0001, 0x351d: 0x0001, + 0x351e: 0x0001, 0x351f: 0x0001, 0x3520: 0x0001, 0x3521: 0x0001, 0x3522: 0x0001, 0x3523: 0x0001, + 0x3524: 0x0001, 0x3525: 0x0001, 0x3526: 0x0001, 0x3527: 0x0001, 0x3528: 0x0001, 0x3529: 0x0001, + 0x352a: 0x0001, 0x352b: 0x0001, 0x352c: 0x0001, 0x352d: 0x0001, 0x352e: 0x0001, 0x352f: 0x0001, + 0x3530: 0x0001, 0x3531: 0x0001, 0x3532: 0x0001, 0x3533: 0x0001, 0x3534: 0x0001, 0x3535: 0x0001, + 0x3536: 0x0001, 0x3537: 0x0001, 0x3538: 0x0001, 0x3539: 0x0001, 0x353a: 0x0001, 0x353b: 0x0001, + 0x353c: 0x0001, 0x353d: 0x0001, 0x353e: 0x0001, 0x353f: 0x0001, + // Block 0xd5, offset 0x3540 + 0x3540: 0x0001, 0x3541: 0x0001, 0x3542: 0x0001, 0x3543: 0x0001, 0x3544: 0x000c, 0x3545: 0x000c, + 0x3546: 0x000c, 0x3547: 0x000c, 0x3548: 0x000c, 0x3549: 0x000c, 0x354a: 0x000c, 0x354b: 0x0001, + 0x354c: 0x0001, 0x354d: 0x0001, 0x354e: 0x0001, 0x354f: 0x0001, 0x3550: 0x0001, 0x3551: 0x0001, + 0x3552: 0x0001, 0x3553: 0x0001, 0x3554: 0x0001, 0x3555: 0x0001, 0x3556: 0x0001, 0x3557: 0x0001, + 0x3558: 0x0001, 0x3559: 0x0001, 0x355a: 0x0001, 0x355b: 0x0001, 0x355c: 0x0001, 0x355d: 0x0001, + 0x355e: 0x0001, 0x355f: 0x0001, 0x3560: 0x0001, 0x3561: 0x0001, 0x3562: 0x0001, 0x3563: 0x0001, + 0x3564: 0x0001, 0x3565: 0x0001, 0x3566: 0x0001, 0x3567: 0x0001, 0x3568: 0x0001, 0x3569: 0x0001, + 0x356a: 0x0001, 0x356b: 0x0001, 0x356c: 0x0001, 0x356d: 0x0001, 0x356e: 0x0001, 0x356f: 0x0001, + 0x3570: 0x0001, 0x3571: 0x0001, 0x3572: 0x0001, 0x3573: 0x0001, 0x3574: 0x0001, 0x3575: 0x0001, + 0x3576: 0x0001, 0x3577: 0x0001, 0x3578: 0x0001, 0x3579: 0x0001, 0x357a: 0x0001, 0x357b: 0x0001, + 0x357c: 0x0001, 0x357d: 0x0001, 0x357e: 0x0001, 0x357f: 0x0001, + // Block 0xd6, offset 0x3580 + 0x3580: 0x000d, 0x3581: 0x000d, 0x3582: 0x000d, 0x3583: 0x000d, 0x3584: 0x000d, 0x3585: 0x000d, + 0x3586: 0x000d, 0x3587: 0x000d, 0x3588: 0x000d, 0x3589: 0x000d, 0x358a: 0x000d, 0x358b: 0x000d, + 0x358c: 0x000d, 0x358d: 0x000d, 0x358e: 0x000d, 0x358f: 0x000d, 0x3590: 0x000d, 0x3591: 0x000d, + 0x3592: 0x000d, 0x3593: 0x000d, 0x3594: 0x000d, 0x3595: 0x000d, 0x3596: 0x000d, 0x3597: 0x000d, + 0x3598: 0x000d, 0x3599: 0x000d, 0x359a: 0x000d, 0x359b: 0x000d, 0x359c: 0x000d, 0x359d: 0x000d, + 0x359e: 0x000d, 0x359f: 0x000d, 0x35a0: 0x000d, 0x35a1: 0x000d, 0x35a2: 0x000d, 0x35a3: 0x000d, + 0x35a4: 0x000d, 0x35a5: 0x000d, 0x35a6: 0x000d, 0x35a7: 0x000d, 0x35a8: 0x000d, 0x35a9: 0x000d, + 0x35aa: 0x000d, 0x35ab: 0x000d, 0x35ac: 0x000d, 0x35ad: 0x000d, 0x35ae: 0x000d, 0x35af: 0x000d, + 0x35b0: 0x000a, 0x35b1: 0x000a, 0x35b2: 0x000d, 0x35b3: 0x000d, 0x35b4: 0x000d, 0x35b5: 0x000d, + 0x35b6: 0x000d, 0x35b7: 0x000d, 0x35b8: 0x000d, 0x35b9: 0x000d, 0x35ba: 0x000d, 0x35bb: 0x000d, + 0x35bc: 0x000d, 0x35bd: 0x000d, 0x35be: 0x000d, 0x35bf: 0x000d, + // Block 0xd7, offset 0x35c0 + 0x35c0: 0x000a, 0x35c1: 0x000a, 0x35c2: 0x000a, 0x35c3: 0x000a, 0x35c4: 0x000a, 0x35c5: 0x000a, + 0x35c6: 0x000a, 0x35c7: 0x000a, 0x35c8: 0x000a, 0x35c9: 0x000a, 0x35ca: 0x000a, 0x35cb: 0x000a, + 0x35cc: 0x000a, 0x35cd: 0x000a, 0x35ce: 0x000a, 0x35cf: 0x000a, 0x35d0: 0x000a, 0x35d1: 0x000a, + 0x35d2: 0x000a, 0x35d3: 0x000a, 0x35d4: 0x000a, 0x35d5: 0x000a, 0x35d6: 0x000a, 0x35d7: 0x000a, + 0x35d8: 0x000a, 0x35d9: 0x000a, 0x35da: 0x000a, 0x35db: 0x000a, 0x35dc: 0x000a, 0x35dd: 0x000a, + 0x35de: 0x000a, 0x35df: 0x000a, 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a, + 0x35e4: 0x000a, 0x35e5: 0x000a, 0x35e6: 0x000a, 0x35e7: 0x000a, 0x35e8: 0x000a, 0x35e9: 0x000a, + 0x35ea: 0x000a, 0x35eb: 0x000a, + 0x35f0: 0x000a, 0x35f1: 0x000a, 0x35f2: 0x000a, 0x35f3: 0x000a, 0x35f4: 0x000a, 0x35f5: 0x000a, + 0x35f6: 0x000a, 0x35f7: 0x000a, 0x35f8: 0x000a, 0x35f9: 0x000a, 0x35fa: 0x000a, 0x35fb: 0x000a, + 0x35fc: 0x000a, 0x35fd: 0x000a, 0x35fe: 0x000a, 0x35ff: 0x000a, + // Block 0xd8, offset 0x3600 + 0x3600: 0x000a, 0x3601: 0x000a, 0x3602: 0x000a, 0x3603: 0x000a, 0x3604: 0x000a, 0x3605: 0x000a, + 0x3606: 0x000a, 0x3607: 0x000a, 0x3608: 0x000a, 0x3609: 0x000a, 0x360a: 0x000a, 0x360b: 0x000a, + 0x360c: 0x000a, 0x360d: 0x000a, 0x360e: 0x000a, 0x360f: 0x000a, 0x3610: 0x000a, 0x3611: 0x000a, + 0x3612: 0x000a, 0x3613: 0x000a, + 0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a, + 0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, 0x3628: 0x000a, 0x3629: 0x000a, + 0x362a: 0x000a, 0x362b: 0x000a, 0x362c: 0x000a, 0x362d: 0x000a, 0x362e: 0x000a, + 0x3631: 0x000a, 0x3632: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a, + 0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, 0x3639: 0x000a, 0x363a: 0x000a, 0x363b: 0x000a, + 0x363c: 0x000a, 0x363d: 0x000a, 0x363e: 0x000a, 0x363f: 0x000a, + // Block 0xd9, offset 0x3640 + 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a, + 0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a, + 0x364c: 0x000a, 0x364d: 0x000a, 0x364e: 0x000a, 0x364f: 0x000a, 0x3651: 0x000a, + 0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, 0x3655: 0x000a, 0x3656: 0x000a, 0x3657: 0x000a, + 0x3658: 0x000a, 0x3659: 0x000a, 0x365a: 0x000a, 0x365b: 0x000a, 0x365c: 0x000a, 0x365d: 0x000a, + 0x365e: 0x000a, 0x365f: 0x000a, 0x3660: 0x000a, 0x3661: 0x000a, 0x3662: 0x000a, 0x3663: 0x000a, + 0x3664: 0x000a, 0x3665: 0x000a, 0x3666: 0x000a, 0x3667: 0x000a, 0x3668: 0x000a, 0x3669: 0x000a, + 0x366a: 0x000a, 0x366b: 0x000a, 0x366c: 0x000a, 0x366d: 0x000a, 0x366e: 0x000a, 0x366f: 0x000a, + 0x3670: 0x000a, 0x3671: 0x000a, 0x3672: 0x000a, 0x3673: 0x000a, 0x3674: 0x000a, 0x3675: 0x000a, + // Block 0xda, offset 0x3680 + 0x3680: 0x0002, 0x3681: 0x0002, 0x3682: 0x0002, 0x3683: 0x0002, 0x3684: 0x0002, 0x3685: 0x0002, + 0x3686: 0x0002, 0x3687: 0x0002, 0x3688: 0x0002, 0x3689: 0x0002, 0x368a: 0x0002, 0x368b: 0x000a, + 0x368c: 0x000a, + 0x36af: 0x000a, + // Block 0xdb, offset 0x36c0 + 0x36ea: 0x000a, 0x36eb: 0x000a, + // Block 0xdc, offset 0x3700 + 0x3720: 0x000a, 0x3721: 0x000a, 0x3722: 0x000a, 0x3723: 0x000a, + 0x3724: 0x000a, 0x3725: 0x000a, + // Block 0xdd, offset 0x3740 + 0x3740: 0x000a, 0x3741: 0x000a, 0x3742: 0x000a, 0x3743: 0x000a, 0x3744: 0x000a, 0x3745: 0x000a, + 0x3746: 0x000a, 0x3747: 0x000a, 0x3748: 0x000a, 0x3749: 0x000a, 0x374a: 0x000a, 0x374b: 0x000a, + 0x374c: 0x000a, 0x374d: 0x000a, 0x374e: 0x000a, 0x374f: 0x000a, 0x3750: 0x000a, 0x3751: 0x000a, + 0x3752: 0x000a, 0x3753: 0x000a, 0x3754: 0x000a, + 0x3760: 0x000a, 0x3761: 0x000a, 0x3762: 0x000a, 0x3763: 0x000a, + 0x3764: 0x000a, 0x3765: 0x000a, 0x3766: 0x000a, 0x3767: 0x000a, 0x3768: 0x000a, 0x3769: 0x000a, + 0x376a: 0x000a, 0x376b: 0x000a, 0x376c: 0x000a, + 0x3770: 0x000a, 0x3771: 0x000a, 0x3772: 0x000a, 0x3773: 0x000a, 0x3774: 0x000a, 0x3775: 0x000a, + 0x3776: 0x000a, 0x3777: 0x000a, 0x3778: 0x000a, 0x3779: 0x000a, + // Block 0xde, offset 0x3780 + 0x3780: 0x000a, 0x3781: 0x000a, 0x3782: 0x000a, 0x3783: 0x000a, 0x3784: 0x000a, 0x3785: 0x000a, + 0x3786: 0x000a, 0x3787: 0x000a, 0x3788: 0x000a, 0x3789: 0x000a, 0x378a: 0x000a, 0x378b: 0x000a, + 0x378c: 0x000a, 0x378d: 0x000a, 0x378e: 0x000a, 0x378f: 0x000a, 0x3790: 0x000a, 0x3791: 0x000a, + 0x3792: 0x000a, 0x3793: 0x000a, 0x3794: 0x000a, 0x3795: 0x000a, 0x3796: 0x000a, 0x3797: 0x000a, + 0x3798: 0x000a, + // Block 0xdf, offset 0x37c0 + 0x37c0: 0x000a, 0x37c1: 0x000a, 0x37c2: 0x000a, 0x37c3: 0x000a, 0x37c4: 0x000a, 0x37c5: 0x000a, + 0x37c6: 0x000a, 0x37c7: 0x000a, 0x37c8: 0x000a, 0x37c9: 0x000a, 0x37ca: 0x000a, 0x37cb: 0x000a, + 0x37d0: 0x000a, 0x37d1: 0x000a, + 0x37d2: 0x000a, 0x37d3: 0x000a, 0x37d4: 0x000a, 0x37d5: 0x000a, 0x37d6: 0x000a, 0x37d7: 0x000a, + 0x37d8: 0x000a, 0x37d9: 0x000a, 0x37da: 0x000a, 0x37db: 0x000a, 0x37dc: 0x000a, 0x37dd: 0x000a, + 0x37de: 0x000a, 0x37df: 0x000a, 0x37e0: 0x000a, 0x37e1: 0x000a, 0x37e2: 0x000a, 0x37e3: 0x000a, + 0x37e4: 0x000a, 0x37e5: 0x000a, 0x37e6: 0x000a, 0x37e7: 0x000a, 0x37e8: 0x000a, 0x37e9: 0x000a, + 0x37ea: 0x000a, 0x37eb: 0x000a, 0x37ec: 0x000a, 0x37ed: 0x000a, 0x37ee: 0x000a, 0x37ef: 0x000a, + 0x37f0: 0x000a, 0x37f1: 0x000a, 0x37f2: 0x000a, 0x37f3: 0x000a, 0x37f4: 0x000a, 0x37f5: 0x000a, + 0x37f6: 0x000a, 0x37f7: 0x000a, 0x37f8: 0x000a, 0x37f9: 0x000a, 0x37fa: 0x000a, 0x37fb: 0x000a, + 0x37fc: 0x000a, 0x37fd: 0x000a, 0x37fe: 0x000a, 0x37ff: 0x000a, + // Block 0xe0, offset 0x3800 + 0x3800: 0x000a, 0x3801: 0x000a, 0x3802: 0x000a, 0x3803: 0x000a, 0x3804: 0x000a, 0x3805: 0x000a, + 0x3806: 0x000a, 0x3807: 0x000a, + 0x3810: 0x000a, 0x3811: 0x000a, + 0x3812: 0x000a, 0x3813: 0x000a, 0x3814: 0x000a, 0x3815: 0x000a, 0x3816: 0x000a, 0x3817: 0x000a, + 0x3818: 0x000a, 0x3819: 0x000a, + 0x3820: 0x000a, 0x3821: 0x000a, 0x3822: 0x000a, 0x3823: 0x000a, + 0x3824: 0x000a, 0x3825: 0x000a, 0x3826: 0x000a, 0x3827: 0x000a, 0x3828: 0x000a, 0x3829: 0x000a, + 0x382a: 0x000a, 0x382b: 0x000a, 0x382c: 0x000a, 0x382d: 0x000a, 0x382e: 0x000a, 0x382f: 0x000a, + 0x3830: 0x000a, 0x3831: 0x000a, 0x3832: 0x000a, 0x3833: 0x000a, 0x3834: 0x000a, 0x3835: 0x000a, + 0x3836: 0x000a, 0x3837: 0x000a, 0x3838: 0x000a, 0x3839: 0x000a, 0x383a: 0x000a, 0x383b: 0x000a, + 0x383c: 0x000a, 0x383d: 0x000a, 0x383e: 0x000a, 0x383f: 0x000a, + // Block 0xe1, offset 0x3840 + 0x3840: 0x000a, 0x3841: 0x000a, 0x3842: 0x000a, 0x3843: 0x000a, 0x3844: 0x000a, 0x3845: 0x000a, + 0x3846: 0x000a, 0x3847: 0x000a, + 0x3850: 0x000a, 0x3851: 0x000a, + 0x3852: 0x000a, 0x3853: 0x000a, 0x3854: 0x000a, 0x3855: 0x000a, 0x3856: 0x000a, 0x3857: 0x000a, + 0x3858: 0x000a, 0x3859: 0x000a, 0x385a: 0x000a, 0x385b: 0x000a, 0x385c: 0x000a, 0x385d: 0x000a, + 0x385e: 0x000a, 0x385f: 0x000a, 0x3860: 0x000a, 0x3861: 0x000a, 0x3862: 0x000a, 0x3863: 0x000a, + 0x3864: 0x000a, 0x3865: 0x000a, 0x3866: 0x000a, 0x3867: 0x000a, 0x3868: 0x000a, 0x3869: 0x000a, + 0x386a: 0x000a, 0x386b: 0x000a, 0x386c: 0x000a, 0x386d: 0x000a, + // Block 0xe2, offset 0x3880 + 0x3880: 0x000a, 0x3881: 0x000a, 0x3882: 0x000a, 0x3883: 0x000a, 0x3884: 0x000a, 0x3885: 0x000a, + 0x3886: 0x000a, 0x3887: 0x000a, 0x3888: 0x000a, 0x3889: 0x000a, 0x388a: 0x000a, 0x388b: 0x000a, + 0x3890: 0x000a, 0x3891: 0x000a, + 0x3892: 0x000a, 0x3893: 0x000a, 0x3894: 0x000a, 0x3895: 0x000a, 0x3896: 0x000a, 0x3897: 0x000a, + 0x3898: 0x000a, 0x3899: 0x000a, 0x389a: 0x000a, 0x389b: 0x000a, 0x389c: 0x000a, 0x389d: 0x000a, + 0x389e: 0x000a, 0x389f: 0x000a, 0x38a0: 0x000a, 0x38a1: 0x000a, 0x38a2: 0x000a, 0x38a3: 0x000a, + 0x38a4: 0x000a, 0x38a5: 0x000a, 0x38a6: 0x000a, 0x38a7: 0x000a, 0x38a8: 0x000a, 0x38a9: 0x000a, + 0x38aa: 0x000a, 0x38ab: 0x000a, 0x38ac: 0x000a, 0x38ad: 0x000a, 0x38ae: 0x000a, 0x38af: 0x000a, + 0x38b0: 0x000a, 0x38b1: 0x000a, 0x38b2: 0x000a, 0x38b3: 0x000a, 0x38b4: 0x000a, 0x38b5: 0x000a, + 0x38b6: 0x000a, 0x38b7: 0x000a, 0x38b8: 0x000a, 0x38b9: 0x000a, 0x38ba: 0x000a, 0x38bb: 0x000a, + 0x38bc: 0x000a, 0x38bd: 0x000a, 0x38be: 0x000a, + // Block 0xe3, offset 0x38c0 + 0x38c0: 0x000a, 0x38c1: 0x000a, 0x38c2: 0x000a, 0x38c3: 0x000a, 0x38c4: 0x000a, 0x38c5: 0x000a, + 0x38c6: 0x000a, 0x38c7: 0x000a, 0x38c8: 0x000a, 0x38c9: 0x000a, 0x38ca: 0x000a, 0x38cb: 0x000a, + 0x38cc: 0x000a, 0x38cd: 0x000a, 0x38ce: 0x000a, 0x38cf: 0x000a, 0x38d0: 0x000a, 0x38d1: 0x000a, + 0x38d2: 0x000a, 0x38d3: 0x000a, 0x38d4: 0x000a, 0x38d5: 0x000a, 0x38d6: 0x000a, 0x38d7: 0x000a, + 0x38d8: 0x000a, 0x38d9: 0x000a, 0x38da: 0x000a, 0x38db: 0x000a, 0x38dc: 0x000a, 0x38dd: 0x000a, + 0x38de: 0x000a, 0x38df: 0x000a, 0x38e0: 0x000a, 0x38e1: 0x000a, 0x38e2: 0x000a, 0x38e3: 0x000a, + 0x38e4: 0x000a, 0x38e5: 0x000a, 0x38e6: 0x000a, 0x38e7: 0x000a, 0x38e8: 0x000a, 0x38e9: 0x000a, + 0x38ea: 0x000a, 0x38eb: 0x000a, 0x38ec: 0x000a, 0x38ed: 0x000a, 0x38ee: 0x000a, 0x38ef: 0x000a, + 0x38f0: 0x000a, 0x38f3: 0x000a, 0x38f4: 0x000a, 0x38f5: 0x000a, + 0x38f6: 0x000a, 0x38fa: 0x000a, + 0x38fc: 0x000a, 0x38fd: 0x000a, 0x38fe: 0x000a, 0x38ff: 0x000a, + // Block 0xe4, offset 0x3900 + 0x3900: 0x000a, 0x3901: 0x000a, 0x3902: 0x000a, 0x3903: 0x000a, 0x3904: 0x000a, 0x3905: 0x000a, + 0x3906: 0x000a, 0x3907: 0x000a, 0x3908: 0x000a, 0x3909: 0x000a, 0x390a: 0x000a, 0x390b: 0x000a, + 0x390c: 0x000a, 0x390d: 0x000a, 0x390e: 0x000a, 0x390f: 0x000a, 0x3910: 0x000a, 0x3911: 0x000a, + 0x3912: 0x000a, 0x3913: 0x000a, 0x3914: 0x000a, 0x3915: 0x000a, 0x3916: 0x000a, 0x3917: 0x000a, + 0x3918: 0x000a, 0x3919: 0x000a, 0x391a: 0x000a, 0x391b: 0x000a, 0x391c: 0x000a, 0x391d: 0x000a, + 0x391e: 0x000a, 0x391f: 0x000a, 0x3920: 0x000a, 0x3921: 0x000a, 0x3922: 0x000a, + 0x3930: 0x000a, 0x3931: 0x000a, 0x3932: 0x000a, 0x3933: 0x000a, 0x3934: 0x000a, 0x3935: 0x000a, + 0x3936: 0x000a, 0x3937: 0x000a, 0x3938: 0x000a, 0x3939: 0x000a, + // Block 0xe5, offset 0x3940 + 0x3940: 0x000a, 0x3941: 0x000a, 0x3942: 0x000a, + 0x3950: 0x000a, 0x3951: 0x000a, + 0x3952: 0x000a, 0x3953: 0x000a, 0x3954: 0x000a, 0x3955: 0x000a, 0x3956: 0x000a, 0x3957: 0x000a, + 0x3958: 0x000a, 0x3959: 0x000a, 0x395a: 0x000a, 0x395b: 0x000a, 0x395c: 0x000a, 0x395d: 0x000a, + 0x395e: 0x000a, 0x395f: 0x000a, 0x3960: 0x000a, 0x3961: 0x000a, 0x3962: 0x000a, 0x3963: 0x000a, + 0x3964: 0x000a, 0x3965: 0x000a, 0x3966: 0x000a, 0x3967: 0x000a, 0x3968: 0x000a, 0x3969: 0x000a, + 0x396a: 0x000a, 0x396b: 0x000a, 0x396c: 0x000a, 0x396d: 0x000a, 0x396e: 0x000a, 0x396f: 0x000a, + 0x3970: 0x000a, 0x3971: 0x000a, 0x3972: 0x000a, 0x3973: 0x000a, 0x3974: 0x000a, 0x3975: 0x000a, + 0x3976: 0x000a, 0x3977: 0x000a, 0x3978: 0x000a, 0x3979: 0x000a, 0x397a: 0x000a, 0x397b: 0x000a, + 0x397c: 0x000a, 0x397d: 0x000a, 0x397e: 0x000a, 0x397f: 0x000a, + // Block 0xe6, offset 0x3980 + 0x39a0: 0x000a, 0x39a1: 0x000a, 0x39a2: 0x000a, 0x39a3: 0x000a, + 0x39a4: 0x000a, 0x39a5: 0x000a, 0x39a6: 0x000a, 0x39a7: 0x000a, 0x39a8: 0x000a, 0x39a9: 0x000a, + 0x39aa: 0x000a, 0x39ab: 0x000a, 0x39ac: 0x000a, 0x39ad: 0x000a, + // Block 0xe7, offset 0x39c0 + 0x39fe: 0x000b, 0x39ff: 0x000b, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x000b, 0x3a01: 0x000b, 0x3a02: 0x000b, 0x3a03: 0x000b, 0x3a04: 0x000b, 0x3a05: 0x000b, + 0x3a06: 0x000b, 0x3a07: 0x000b, 0x3a08: 0x000b, 0x3a09: 0x000b, 0x3a0a: 0x000b, 0x3a0b: 0x000b, + 0x3a0c: 0x000b, 0x3a0d: 0x000b, 0x3a0e: 0x000b, 0x3a0f: 0x000b, 0x3a10: 0x000b, 0x3a11: 0x000b, + 0x3a12: 0x000b, 0x3a13: 0x000b, 0x3a14: 0x000b, 0x3a15: 0x000b, 0x3a16: 0x000b, 0x3a17: 0x000b, + 0x3a18: 0x000b, 0x3a19: 0x000b, 0x3a1a: 0x000b, 0x3a1b: 0x000b, 0x3a1c: 0x000b, 0x3a1d: 0x000b, + 0x3a1e: 0x000b, 0x3a1f: 0x000b, 0x3a20: 0x000b, 0x3a21: 0x000b, 0x3a22: 0x000b, 0x3a23: 0x000b, + 0x3a24: 0x000b, 0x3a25: 0x000b, 0x3a26: 0x000b, 0x3a27: 0x000b, 0x3a28: 0x000b, 0x3a29: 0x000b, + 0x3a2a: 0x000b, 0x3a2b: 0x000b, 0x3a2c: 0x000b, 0x3a2d: 0x000b, 0x3a2e: 0x000b, 0x3a2f: 0x000b, + 0x3a30: 0x000b, 0x3a31: 0x000b, 0x3a32: 0x000b, 0x3a33: 0x000b, 0x3a34: 0x000b, 0x3a35: 0x000b, + 0x3a36: 0x000b, 0x3a37: 0x000b, 0x3a38: 0x000b, 0x3a39: 0x000b, 0x3a3a: 0x000b, 0x3a3b: 0x000b, + 0x3a3c: 0x000b, 0x3a3d: 0x000b, 0x3a3e: 0x000b, 0x3a3f: 0x000b, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x000c, 0x3a41: 0x000c, 0x3a42: 0x000c, 0x3a43: 0x000c, 0x3a44: 0x000c, 0x3a45: 0x000c, + 0x3a46: 0x000c, 0x3a47: 0x000c, 0x3a48: 0x000c, 0x3a49: 0x000c, 0x3a4a: 0x000c, 0x3a4b: 0x000c, + 0x3a4c: 0x000c, 0x3a4d: 0x000c, 0x3a4e: 0x000c, 0x3a4f: 0x000c, 0x3a50: 0x000c, 0x3a51: 0x000c, + 0x3a52: 0x000c, 0x3a53: 0x000c, 0x3a54: 0x000c, 0x3a55: 0x000c, 0x3a56: 0x000c, 0x3a57: 0x000c, + 0x3a58: 0x000c, 0x3a59: 0x000c, 0x3a5a: 0x000c, 0x3a5b: 0x000c, 0x3a5c: 0x000c, 0x3a5d: 0x000c, + 0x3a5e: 0x000c, 0x3a5f: 0x000c, 0x3a60: 0x000c, 0x3a61: 0x000c, 0x3a62: 0x000c, 0x3a63: 0x000c, + 0x3a64: 0x000c, 0x3a65: 0x000c, 0x3a66: 0x000c, 0x3a67: 0x000c, 0x3a68: 0x000c, 0x3a69: 0x000c, + 0x3a6a: 0x000c, 0x3a6b: 0x000c, 0x3a6c: 0x000c, 0x3a6d: 0x000c, 0x3a6e: 0x000c, 0x3a6f: 0x000c, + 0x3a70: 0x000b, 0x3a71: 0x000b, 0x3a72: 0x000b, 0x3a73: 0x000b, 0x3a74: 0x000b, 0x3a75: 0x000b, + 0x3a76: 0x000b, 0x3a77: 0x000b, 0x3a78: 0x000b, 0x3a79: 0x000b, 0x3a7a: 0x000b, 0x3a7b: 0x000b, + 0x3a7c: 0x000b, 0x3a7d: 0x000b, 0x3a7e: 0x000b, 0x3a7f: 0x000b, +} + +// bidiIndex: 24 blocks, 1536 entries, 1536 bytes +// Block 0 is the zero block. +var bidiIndex = [1536]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, + 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, + 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, + 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, + 0xea: 0x07, 0xef: 0x08, + 0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15, + // Block 0x4, offset 0x100 + 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, + 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, + 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28, + 0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30, + // Block 0x5, offset 0x140 + 0x140: 0x31, 0x141: 0x32, 0x142: 0x33, + 0x14d: 0x34, 0x14e: 0x35, + 0x150: 0x36, + 0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b, + 0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40, + 0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47, + 0x170: 0x48, 0x173: 0x49, 0x177: 0x4a, + 0x17e: 0x4b, 0x17f: 0x4c, + // Block 0x6, offset 0x180 + 0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54, + 0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x54, + 0x190: 0x59, 0x191: 0x5a, 0x192: 0x5b, 0x193: 0x5c, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54, + 0x198: 0x54, 0x199: 0x54, 0x19a: 0x5d, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5e, 0x19e: 0x54, 0x19f: 0x5f, + 0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x60, 0x1a7: 0x61, + 0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x62, 0x1ae: 0x63, 0x1af: 0x64, + 0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67, + 0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70, + 0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76, + // Block 0x8, offset 0x200 + 0x237: 0x54, + // Block 0x9, offset 0x240 + 0x252: 0x77, 0x253: 0x78, + 0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e, + 0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85, + 0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26f: 0x8a, + // Block 0xa, offset 0x280 + 0x2ac: 0x8b, 0x2ad: 0x8c, 0x2ae: 0x0e, 0x2af: 0x0e, + 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8d, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8e, + 0x2b8: 0x8f, 0x2b9: 0x90, 0x2ba: 0x0e, 0x2bb: 0x91, 0x2bc: 0x92, 0x2bd: 0x93, 0x2bf: 0x94, + // Block 0xb, offset 0x2c0 + 0x2c4: 0x95, 0x2c5: 0x54, 0x2c6: 0x96, 0x2c7: 0x97, + 0x2cb: 0x98, 0x2cd: 0x99, + 0x2e0: 0x9a, 0x2e1: 0x9a, 0x2e2: 0x9a, 0x2e3: 0x9a, 0x2e4: 0x9b, 0x2e5: 0x9a, 0x2e6: 0x9a, 0x2e7: 0x9a, + 0x2e8: 0x9c, 0x2e9: 0x9a, 0x2ea: 0x9a, 0x2eb: 0x9d, 0x2ec: 0x9e, 0x2ed: 0x9a, 0x2ee: 0x9a, 0x2ef: 0x9a, + 0x2f0: 0x9a, 0x2f1: 0x9a, 0x2f2: 0x9a, 0x2f3: 0x9a, 0x2f4: 0x9f, 0x2f5: 0x9a, 0x2f6: 0x9a, 0x2f7: 0x9a, + 0x2f8: 0x9a, 0x2f9: 0xa0, 0x2fa: 0x9a, 0x2fb: 0x9a, 0x2fc: 0xa1, 0x2fd: 0xa2, 0x2fe: 0x9a, 0x2ff: 0x9a, + // Block 0xc, offset 0x300 + 0x300: 0xa3, 0x301: 0xa4, 0x302: 0xa5, 0x304: 0xa6, 0x305: 0xa7, 0x306: 0xa8, 0x307: 0xa9, + 0x308: 0xaa, 0x30b: 0xab, 0x30c: 0x26, 0x30d: 0xac, + 0x310: 0xad, 0x311: 0xae, 0x312: 0xaf, 0x313: 0xb0, 0x316: 0xb1, 0x317: 0xb2, + 0x318: 0xb3, 0x319: 0xb4, 0x31a: 0xb5, 0x31c: 0xb6, + 0x320: 0xb7, + 0x328: 0xb8, 0x329: 0xb9, 0x32a: 0xba, + 0x330: 0xbb, 0x332: 0xbc, 0x334: 0xbd, 0x335: 0xbe, 0x336: 0xbf, + 0x33b: 0xc0, + // Block 0xd, offset 0x340 + 0x36b: 0xc1, 0x36c: 0xc2, + 0x37e: 0xc3, + // Block 0xe, offset 0x380 + 0x3b2: 0xc4, + // Block 0xf, offset 0x3c0 + 0x3c5: 0xc5, 0x3c6: 0xc6, + 0x3c8: 0x54, 0x3c9: 0xc7, 0x3cc: 0x54, 0x3cd: 0xc8, + 0x3db: 0xc9, 0x3dc: 0xca, 0x3dd: 0xcb, 0x3de: 0xcc, 0x3df: 0xcd, + 0x3e8: 0xce, 0x3e9: 0xcf, 0x3ea: 0xd0, + // Block 0x10, offset 0x400 + 0x400: 0xd1, + 0x420: 0x9a, 0x421: 0x9a, 0x422: 0x9a, 0x423: 0xd2, 0x424: 0x9a, 0x425: 0xd3, 0x426: 0x9a, 0x427: 0x9a, + 0x428: 0x9a, 0x429: 0x9a, 0x42a: 0x9a, 0x42b: 0x9a, 0x42c: 0x9a, 0x42d: 0x9a, 0x42e: 0x9a, 0x42f: 0x9a, + 0x430: 0x9a, 0x431: 0xa1, 0x432: 0x0e, 0x433: 0x9a, 0x434: 0x9a, 0x435: 0x9a, 0x436: 0x9a, 0x437: 0x9a, + 0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xd4, 0x43c: 0x9a, 0x43d: 0x9a, 0x43e: 0x9a, 0x43f: 0x9a, + // Block 0x11, offset 0x440 + 0x440: 0xd5, 0x441: 0x54, 0x442: 0xd6, 0x443: 0xd7, 0x444: 0xd8, 0x445: 0xd9, + 0x449: 0xda, 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54, + 0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54, + 0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xdb, 0x45c: 0x54, 0x45d: 0x6b, 0x45e: 0x54, 0x45f: 0xdc, + 0x460: 0xdd, 0x461: 0xde, 0x462: 0xdf, 0x464: 0xe0, 0x465: 0xe1, 0x466: 0xe2, 0x467: 0xe3, + 0x469: 0xe4, + 0x47f: 0xe5, + // Block 0x12, offset 0x480 + 0x4bf: 0xe5, + // Block 0x13, offset 0x4c0 + 0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b, + 0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f, + 0x4ef: 0x10, + 0x4ff: 0x10, + // Block 0x14, offset 0x500 + 0x50f: 0x10, + 0x51f: 0x10, + 0x52f: 0x10, + 0x53f: 0x10, + // Block 0x15, offset 0x540 + 0x540: 0xe6, 0x541: 0xe6, 0x542: 0xe6, 0x543: 0xe6, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xe7, + 0x548: 0xe6, 0x549: 0xe6, 0x54a: 0xe6, 0x54b: 0xe6, 0x54c: 0xe6, 0x54d: 0xe6, 0x54e: 0xe6, 0x54f: 0xe6, + 0x550: 0xe6, 0x551: 0xe6, 0x552: 0xe6, 0x553: 0xe6, 0x554: 0xe6, 0x555: 0xe6, 0x556: 0xe6, 0x557: 0xe6, + 0x558: 0xe6, 0x559: 0xe6, 0x55a: 0xe6, 0x55b: 0xe6, 0x55c: 0xe6, 0x55d: 0xe6, 0x55e: 0xe6, 0x55f: 0xe6, + 0x560: 0xe6, 0x561: 0xe6, 0x562: 0xe6, 0x563: 0xe6, 0x564: 0xe6, 0x565: 0xe6, 0x566: 0xe6, 0x567: 0xe6, + 0x568: 0xe6, 0x569: 0xe6, 0x56a: 0xe6, 0x56b: 0xe6, 0x56c: 0xe6, 0x56d: 0xe6, 0x56e: 0xe6, 0x56f: 0xe6, + 0x570: 0xe6, 0x571: 0xe6, 0x572: 0xe6, 0x573: 0xe6, 0x574: 0xe6, 0x575: 0xe6, 0x576: 0xe6, 0x577: 0xe6, + 0x578: 0xe6, 0x579: 0xe6, 0x57a: 0xe6, 0x57b: 0xe6, 0x57c: 0xe6, 0x57d: 0xe6, 0x57e: 0xe6, 0x57f: 0xe6, + // Block 0x16, offset 0x580 + 0x58f: 0x10, + 0x59f: 0x10, + 0x5a0: 0x13, + 0x5af: 0x10, + 0x5bf: 0x10, + // Block 0x17, offset 0x5c0 + 0x5cf: 0x10, +} + +// Total table size 16568 bytes (16KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go new file mode 100644 index 00000000..7ffa3651 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go @@ -0,0 +1,1923 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// +build go1.14 + +package bidi + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "12.0.0" + +// xorMasks contains masks to be xor-ed with brackets to get the reverse +// version. +var xorMasks = []int32{ // 8 elements + 0, 1, 6, 7, 3, 15, 29, 63, +} // Size: 56 bytes + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// bidiTrie. Total size: 16896 bytes (16.50 KiB). Checksum: 6f0927067913dc6d. +type bidiTrie struct{} + +func newBidiTrie(i int) *bidiTrie { + return &bidiTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(bidiValues[n<<6+uint32(b)]) + } +} + +// bidiValues: 240 blocks, 15360 entries, 15360 bytes +// The third block is the zero block. +var bidiValues = [15360]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, + 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, + 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, + 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, + 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, + 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, + 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, + 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, + 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, + 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, + 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, + // Block 0x1, offset 0x40 + 0x40: 0x000a, + 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, + 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, + 0x7b: 0x005a, + 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, + 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, + 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, + 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, + 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, + 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, + 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, + 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, + 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, + 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, + 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, + // Block 0x4, offset 0x100 + 0x117: 0x000a, + 0x137: 0x000a, + // Block 0x5, offset 0x140 + 0x179: 0x000a, 0x17a: 0x000a, + // Block 0x6, offset 0x180 + 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, + 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, + 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, + 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, + 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, + 0x19e: 0x000a, 0x19f: 0x000a, + 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, + 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, + 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, + 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, + 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, + 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, + 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, + 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, + 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, + 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, + 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, + 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, + 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, + 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, + 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, + // Block 0x8, offset 0x200 + 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, + 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, + 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, + 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, + 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, + 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, + 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, + 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, + 0x234: 0x000a, 0x235: 0x000a, + 0x23e: 0x000a, + // Block 0x9, offset 0x240 + 0x244: 0x000a, 0x245: 0x000a, + 0x247: 0x000a, + // Block 0xa, offset 0x280 + 0x2b6: 0x000a, + // Block 0xb, offset 0x2c0 + 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, + 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, + // Block 0xc, offset 0x300 + 0x30a: 0x000a, + 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, + 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, + 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, + 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, + 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, + 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, + 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, + 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, + 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, + // Block 0xd, offset 0x340 + 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, + 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, + 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, + 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, + 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, + 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, + 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, + 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, + 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, + 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, + 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, + // Block 0xe, offset 0x380 + 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, + 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, + 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, + 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, + 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, + 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, + 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, + 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, + 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, + 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, + 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, + 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, + 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, + 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, + 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, + 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, + 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, + 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, + 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, + 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, + 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, + // Block 0x10, offset 0x400 + 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, + 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, + 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, + 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, + 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, + 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, + 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, + 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, + 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, + 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, + 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, + // Block 0x11, offset 0x440 + 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, + 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, + 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, + 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, + 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, + 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, + 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, + 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, + 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, + 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, + 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, + // Block 0x12, offset 0x480 + 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, + 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, + 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, + 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, + 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, + 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, + 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, + 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, + 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, + 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, + 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, + 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, + 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, + 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, + 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, + 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, + 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, + 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, + 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, + 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, + 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, + // Block 0x14, offset 0x500 + 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, + 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, + 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, + 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, + 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, + 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, + 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, + 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, + 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, + 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, + 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, + // Block 0x15, offset 0x540 + 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, + 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, + 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, + 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, + 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, + 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, + 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, + 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, + 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, + 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, + 0x57c: 0x0001, 0x57d: 0x000c, 0x57e: 0x0001, 0x57f: 0x0001, + // Block 0x16, offset 0x580 + 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, + 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, + 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, + 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, + 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, + 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, + 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, + 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, + 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, + 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, + 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, + 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, + 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, + 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, + 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, + 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d, + 0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d, + 0x5ea: 0x000d, 0x5eb: 0x000d, 0x5ec: 0x000d, 0x5ed: 0x000d, 0x5ee: 0x000d, 0x5ef: 0x000d, + 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001, + 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001, + 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001, + // Block 0x18, offset 0x600 + 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001, + 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001, + 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001, + 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, + 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001, + 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, + 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, + 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, + 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, + 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, + 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, + // Block 0x19, offset 0x640 + 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, + 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d, + 0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d, + 0x652: 0x000d, 0x653: 0x000c, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, + 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, + 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, + 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, + 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, + 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, + 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, + 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, + // Block 0x1a, offset 0x680 + 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, + 0x6ba: 0x000c, + 0x6bc: 0x000c, + // Block 0x1b, offset 0x6c0 + 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, + 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, + 0x6cd: 0x000c, 0x6d1: 0x000c, + 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, + 0x6e2: 0x000c, 0x6e3: 0x000c, + // Block 0x1c, offset 0x700 + 0x701: 0x000c, + 0x73c: 0x000c, + // Block 0x1d, offset 0x740 + 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, + 0x74d: 0x000c, + 0x762: 0x000c, 0x763: 0x000c, + 0x772: 0x0004, 0x773: 0x0004, + 0x77b: 0x0004, + 0x77e: 0x000c, + // Block 0x1e, offset 0x780 + 0x781: 0x000c, 0x782: 0x000c, + 0x7bc: 0x000c, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x000c, 0x7c2: 0x000c, + 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, + 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, + 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, + // Block 0x20, offset 0x800 + 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, + 0x807: 0x000c, 0x808: 0x000c, + 0x80d: 0x000c, + 0x822: 0x000c, 0x823: 0x000c, + 0x831: 0x0004, + 0x83a: 0x000c, 0x83b: 0x000c, + 0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c, + // Block 0x21, offset 0x840 + 0x841: 0x000c, + 0x87c: 0x000c, 0x87f: 0x000c, + // Block 0x22, offset 0x880 + 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, + 0x88d: 0x000c, + 0x896: 0x000c, + 0x8a2: 0x000c, 0x8a3: 0x000c, + // Block 0x23, offset 0x8c0 + 0x8c2: 0x000c, + // Block 0x24, offset 0x900 + 0x900: 0x000c, + 0x90d: 0x000c, + 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, + 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, + // Block 0x25, offset 0x940 + 0x940: 0x000c, 0x944: 0x000c, + 0x97e: 0x000c, 0x97f: 0x000c, + // Block 0x26, offset 0x980 + 0x980: 0x000c, + 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, + 0x98c: 0x000c, 0x98d: 0x000c, + 0x995: 0x000c, 0x996: 0x000c, + 0x9a2: 0x000c, 0x9a3: 0x000c, + 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, + 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, + // Block 0x27, offset 0x9c0 + 0x9cc: 0x000c, 0x9cd: 0x000c, + 0x9e2: 0x000c, 0x9e3: 0x000c, + // Block 0x28, offset 0xa00 + 0xa00: 0x000c, 0xa01: 0x000c, + 0xa3b: 0x000c, + 0xa3c: 0x000c, + // Block 0x29, offset 0xa40 + 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, + 0xa4d: 0x000c, + 0xa62: 0x000c, 0xa63: 0x000c, + // Block 0x2a, offset 0xa80 + 0xa8a: 0x000c, + 0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c, + // Block 0x2b, offset 0xac0 + 0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c, + 0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c, + 0xaff: 0x0004, + // Block 0x2c, offset 0xb00 + 0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c, + 0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c, + // Block 0x2d, offset 0xb40 + 0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c, + 0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7a: 0x000c, 0xb7b: 0x000c, + 0xb7c: 0x000c, + // Block 0x2e, offset 0xb80 + 0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c, + 0xb8c: 0x000c, 0xb8d: 0x000c, + // Block 0x2f, offset 0xbc0 + 0xbd8: 0x000c, 0xbd9: 0x000c, + 0xbf5: 0x000c, + 0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a, + 0xbfc: 0x003a, 0xbfd: 0x002a, + // Block 0x30, offset 0xc00 + 0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c, + 0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c, + 0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c, + // Block 0x31, offset 0xc40 + 0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c, + 0xc46: 0x000c, 0xc47: 0x000c, + 0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c, + 0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c, + 0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c, + 0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c, + 0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c, + 0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c, + 0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, + 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, + 0xc7c: 0x000c, + // Block 0x32, offset 0xc80 + 0xc86: 0x000c, + // Block 0x33, offset 0xcc0 + 0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c, + 0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c, + 0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c, + 0xcfd: 0x000c, 0xcfe: 0x000c, + // Block 0x34, offset 0xd00 + 0xd18: 0x000c, 0xd19: 0x000c, + 0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c, + 0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, + // Block 0x35, offset 0xd40 + 0xd42: 0x000c, 0xd45: 0x000c, + 0xd46: 0x000c, + 0xd4d: 0x000c, + 0xd5d: 0x000c, + // Block 0x36, offset 0xd80 + 0xd9d: 0x000c, + 0xd9e: 0x000c, 0xd9f: 0x000c, + // Block 0x37, offset 0xdc0 + 0xdd0: 0x000a, 0xdd1: 0x000a, + 0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a, + 0xdd8: 0x000a, 0xdd9: 0x000a, + // Block 0x38, offset 0xe00 + 0xe00: 0x000a, + // Block 0x39, offset 0xe40 + 0xe40: 0x0009, + 0xe5b: 0x007a, 0xe5c: 0x006a, + // Block 0x3a, offset 0xe80 + 0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c, + 0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c, + // Block 0x3b, offset 0xec0 + 0xed2: 0x000c, 0xed3: 0x000c, + 0xef2: 0x000c, 0xef3: 0x000c, + // Block 0x3c, offset 0xf00 + 0xf34: 0x000c, 0xf35: 0x000c, + 0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c, + 0xf3c: 0x000c, 0xf3d: 0x000c, + // Block 0x3d, offset 0xf40 + 0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c, + 0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c, + 0xf52: 0x000c, 0xf53: 0x000c, + 0xf5b: 0x0004, 0xf5d: 0x000c, + 0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a, + 0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a, + // Block 0x3e, offset 0xf80 + 0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a, + 0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c, + 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b, + // Block 0x3f, offset 0xfc0 + 0xfc5: 0x000c, + 0xfc6: 0x000c, + 0xfe9: 0x000c, + // Block 0x40, offset 0x1000 + 0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c, + 0x1027: 0x000c, 0x1028: 0x000c, + 0x1032: 0x000c, + 0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c, + // Block 0x41, offset 0x1040 + 0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a, + // Block 0x42, offset 0x1080 + 0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a, + 0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a, + 0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a, + 0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a, + 0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a, + 0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a, + // Block 0x43, offset 0x10c0 + 0x10d7: 0x000c, + 0x10d8: 0x000c, 0x10db: 0x000c, + // Block 0x44, offset 0x1100 + 0x1116: 0x000c, + 0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c, + 0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c, + 0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c, + 0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c, + 0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c, + 0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c, + 0x113c: 0x000c, 0x113f: 0x000c, + // Block 0x45, offset 0x1140 + 0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, + 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, + 0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c, + // Block 0x46, offset 0x1180 + 0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c, + 0x11b4: 0x000c, + 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, + 0x11bc: 0x000c, + // Block 0x47, offset 0x11c0 + 0x11c2: 0x000c, + 0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c, + 0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c, + // Block 0x48, offset 0x1200 + 0x1200: 0x000c, 0x1201: 0x000c, + 0x1222: 0x000c, 0x1223: 0x000c, + 0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c, + 0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c, + // Block 0x49, offset 0x1240 + 0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c, + 0x126d: 0x000c, 0x126f: 0x000c, + 0x1270: 0x000c, 0x1271: 0x000c, + // Block 0x4a, offset 0x1280 + 0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c, + 0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c, + 0x12b6: 0x000c, 0x12b7: 0x000c, + // Block 0x4b, offset 0x12c0 + 0x12d0: 0x000c, 0x12d1: 0x000c, + 0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c, + 0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c, + 0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c, + 0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c, + 0x12ed: 0x000c, + 0x12f4: 0x000c, + 0x12f8: 0x000c, 0x12f9: 0x000c, + // Block 0x4c, offset 0x1300 + 0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c, + 0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c, + 0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c, + 0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c, + 0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c, + 0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c, + 0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c, + 0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, + 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c, + 0x1336: 0x000c, 0x1337: 0x000c, 0x1338: 0x000c, 0x1339: 0x000c, 0x133b: 0x000c, + 0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c, + // Block 0x4d, offset 0x1340 + 0x137d: 0x000a, 0x137f: 0x000a, + // Block 0x4e, offset 0x1380 + 0x1380: 0x000a, 0x1381: 0x000a, + 0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a, + 0x139d: 0x000a, + 0x139e: 0x000a, 0x139f: 0x000a, + 0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a, + 0x13bd: 0x000a, 0x13be: 0x000a, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009, + 0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b, + 0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a, + 0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a, + 0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a, + 0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a, + 0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007, + 0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006, + 0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a, + 0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a, + 0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a, + // Block 0x50, offset 0x1400 + 0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a, + 0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a, + 0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a, + 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, + 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, + 0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b, + 0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e, + 0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b, + 0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002, + 0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003, + 0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a, + // Block 0x51, offset 0x1440 + 0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002, + 0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003, + 0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a, + 0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004, + 0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004, + 0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004, + 0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004, + 0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004, + 0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004, + // Block 0x52, offset 0x1480 + 0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004, + 0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004, + 0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c, + 0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c, + 0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c, + 0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c, + 0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c, + 0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c, + 0x14b0: 0x000c, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a, + 0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a, + 0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a, + 0x14d8: 0x000a, + 0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a, + 0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a, + 0x14ee: 0x0004, + 0x14fa: 0x000a, 0x14fb: 0x000a, + // Block 0x54, offset 0x1500 + 0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, + 0x150a: 0x000a, 0x150b: 0x000a, + 0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a, + 0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, + 0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a, + 0x151e: 0x000a, 0x151f: 0x000a, + // Block 0x55, offset 0x1540 + 0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a, + 0x1550: 0x000a, 0x1551: 0x000a, + 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, + 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, + 0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a, + 0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a, + 0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a, + 0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a, + 0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a, + 0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a, + // Block 0x56, offset 0x1580 + 0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a, + 0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, + 0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a, + 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, + 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, + 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, + 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, + 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, + 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, + 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, + 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, + 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, + 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, + 0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, + 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, + 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, + 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, + 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, + 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, + 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, + 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, + // Block 0x58, offset 0x1600 + 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, + 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a, + 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, + 0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, + 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, + 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, + 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a, + 0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, + 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, + // Block 0x59, offset 0x1640 + 0x167b: 0x000a, + 0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a, + // Block 0x5a, offset 0x1680 + 0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a, + 0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a, + 0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a, + 0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a, + 0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a, + 0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a, + 0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a, + 0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a, + 0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a, + 0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a, + 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, + 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, + 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, + 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, + 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, + 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, + 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, + // Block 0x5c, offset 0x1700 + 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, + 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, + 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, + 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, 0x1727: 0x000a, 0x1728: 0x000a, 0x1729: 0x000a, + 0x172a: 0x000a, 0x172b: 0x000a, 0x172c: 0x000a, 0x172d: 0x000a, 0x172e: 0x000a, 0x172f: 0x000a, + 0x1730: 0x000a, 0x1731: 0x000a, 0x1732: 0x000a, 0x1733: 0x000a, 0x1734: 0x000a, 0x1735: 0x000a, + 0x1736: 0x000a, 0x1737: 0x000a, 0x1738: 0x000a, 0x1739: 0x000a, 0x173a: 0x000a, 0x173b: 0x000a, + 0x173c: 0x000a, 0x173d: 0x000a, 0x173e: 0x000a, 0x173f: 0x000a, + // Block 0x5d, offset 0x1740 + 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, + 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x0002, 0x1749: 0x0002, 0x174a: 0x0002, 0x174b: 0x0002, + 0x174c: 0x0002, 0x174d: 0x0002, 0x174e: 0x0002, 0x174f: 0x0002, 0x1750: 0x0002, 0x1751: 0x0002, + 0x1752: 0x0002, 0x1753: 0x0002, 0x1754: 0x0002, 0x1755: 0x0002, 0x1756: 0x0002, 0x1757: 0x0002, + 0x1758: 0x0002, 0x1759: 0x0002, 0x175a: 0x0002, 0x175b: 0x0002, + // Block 0x5e, offset 0x1780 + 0x17aa: 0x000a, 0x17ab: 0x000a, 0x17ac: 0x000a, 0x17ad: 0x000a, 0x17ae: 0x000a, 0x17af: 0x000a, + 0x17b0: 0x000a, 0x17b1: 0x000a, 0x17b2: 0x000a, 0x17b3: 0x000a, 0x17b4: 0x000a, 0x17b5: 0x000a, + 0x17b6: 0x000a, 0x17b7: 0x000a, 0x17b8: 0x000a, 0x17b9: 0x000a, 0x17ba: 0x000a, 0x17bb: 0x000a, + 0x17bc: 0x000a, 0x17bd: 0x000a, 0x17be: 0x000a, 0x17bf: 0x000a, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x000a, 0x17c1: 0x000a, 0x17c2: 0x000a, 0x17c3: 0x000a, 0x17c4: 0x000a, 0x17c5: 0x000a, + 0x17c6: 0x000a, 0x17c7: 0x000a, 0x17c8: 0x000a, 0x17c9: 0x000a, 0x17ca: 0x000a, 0x17cb: 0x000a, + 0x17cc: 0x000a, 0x17cd: 0x000a, 0x17ce: 0x000a, 0x17cf: 0x000a, 0x17d0: 0x000a, 0x17d1: 0x000a, + 0x17d2: 0x000a, 0x17d3: 0x000a, 0x17d4: 0x000a, 0x17d5: 0x000a, 0x17d6: 0x000a, 0x17d7: 0x000a, + 0x17d8: 0x000a, 0x17d9: 0x000a, 0x17da: 0x000a, 0x17db: 0x000a, 0x17dc: 0x000a, 0x17dd: 0x000a, + 0x17de: 0x000a, 0x17df: 0x000a, 0x17e0: 0x000a, 0x17e1: 0x000a, 0x17e2: 0x000a, 0x17e3: 0x000a, + 0x17e4: 0x000a, 0x17e5: 0x000a, 0x17e6: 0x000a, 0x17e7: 0x000a, 0x17e8: 0x000a, 0x17e9: 0x000a, + 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, + 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, + 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, + 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, + // Block 0x60, offset 0x1800 + 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, + 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, + 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, + 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, + 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, + 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, + 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x003a, 0x1829: 0x002a, + 0x182a: 0x003a, 0x182b: 0x002a, 0x182c: 0x003a, 0x182d: 0x002a, 0x182e: 0x003a, 0x182f: 0x002a, + 0x1830: 0x003a, 0x1831: 0x002a, 0x1832: 0x003a, 0x1833: 0x002a, 0x1834: 0x003a, 0x1835: 0x002a, + 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, + 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, + // Block 0x61, offset 0x1840 + 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x009a, + 0x1846: 0x008a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, + 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, + 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, + 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, + 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, + 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x003a, 0x1867: 0x002a, 0x1868: 0x003a, 0x1869: 0x002a, + 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, + 0x1870: 0x000a, 0x1871: 0x000a, 0x1872: 0x000a, 0x1873: 0x000a, 0x1874: 0x000a, 0x1875: 0x000a, + 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, + 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, + // Block 0x62, offset 0x1880 + 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x007a, 0x1884: 0x006a, 0x1885: 0x009a, + 0x1886: 0x008a, 0x1887: 0x00ba, 0x1888: 0x00aa, 0x1889: 0x009a, 0x188a: 0x008a, 0x188b: 0x007a, + 0x188c: 0x006a, 0x188d: 0x00da, 0x188e: 0x002a, 0x188f: 0x003a, 0x1890: 0x00ca, 0x1891: 0x009a, + 0x1892: 0x008a, 0x1893: 0x007a, 0x1894: 0x006a, 0x1895: 0x009a, 0x1896: 0x008a, 0x1897: 0x00ba, + 0x1898: 0x00aa, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, + 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, + 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x000a, 0x18a7: 0x000a, 0x18a8: 0x000a, 0x18a9: 0x000a, + 0x18aa: 0x000a, 0x18ab: 0x000a, 0x18ac: 0x000a, 0x18ad: 0x000a, 0x18ae: 0x000a, 0x18af: 0x000a, + 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, + 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, + 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x000a, 0x18c4: 0x000a, 0x18c5: 0x000a, + 0x18c6: 0x000a, 0x18c7: 0x000a, 0x18c8: 0x000a, 0x18c9: 0x000a, 0x18ca: 0x000a, 0x18cb: 0x000a, + 0x18cc: 0x000a, 0x18cd: 0x000a, 0x18ce: 0x000a, 0x18cf: 0x000a, 0x18d0: 0x000a, 0x18d1: 0x000a, + 0x18d2: 0x000a, 0x18d3: 0x000a, 0x18d4: 0x000a, 0x18d5: 0x000a, 0x18d6: 0x000a, 0x18d7: 0x000a, + 0x18d8: 0x003a, 0x18d9: 0x002a, 0x18da: 0x003a, 0x18db: 0x002a, 0x18dc: 0x000a, 0x18dd: 0x000a, + 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, + 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, + 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, + 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, + 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, + 0x18fc: 0x003a, 0x18fd: 0x002a, 0x18fe: 0x000a, 0x18ff: 0x000a, + // Block 0x64, offset 0x1900 + 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, + 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, + 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, + 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, + 0x1918: 0x000a, 0x1919: 0x000a, 0x191a: 0x000a, 0x191b: 0x000a, 0x191c: 0x000a, 0x191d: 0x000a, + 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, + 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, + 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, + 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, + 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, + 0x193c: 0x000a, 0x193d: 0x000a, 0x193e: 0x000a, 0x193f: 0x000a, + // Block 0x65, offset 0x1940 + 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, + 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, + 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, + 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, + 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, + 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, + 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, + 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, + 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, 0x1974: 0x000a, 0x1975: 0x000a, + 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, + 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, + // Block 0x66, offset 0x1980 + 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, + 0x19aa: 0x000a, 0x19af: 0x000c, + 0x19b0: 0x000c, 0x19b1: 0x000c, + 0x19b9: 0x000a, 0x19ba: 0x000a, 0x19bb: 0x000a, + 0x19bc: 0x000a, 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a, + // Block 0x67, offset 0x19c0 + 0x19ff: 0x000c, + // Block 0x68, offset 0x1a00 + 0x1a20: 0x000c, 0x1a21: 0x000c, 0x1a22: 0x000c, 0x1a23: 0x000c, + 0x1a24: 0x000c, 0x1a25: 0x000c, 0x1a26: 0x000c, 0x1a27: 0x000c, 0x1a28: 0x000c, 0x1a29: 0x000c, + 0x1a2a: 0x000c, 0x1a2b: 0x000c, 0x1a2c: 0x000c, 0x1a2d: 0x000c, 0x1a2e: 0x000c, 0x1a2f: 0x000c, + 0x1a30: 0x000c, 0x1a31: 0x000c, 0x1a32: 0x000c, 0x1a33: 0x000c, 0x1a34: 0x000c, 0x1a35: 0x000c, + 0x1a36: 0x000c, 0x1a37: 0x000c, 0x1a38: 0x000c, 0x1a39: 0x000c, 0x1a3a: 0x000c, 0x1a3b: 0x000c, + 0x1a3c: 0x000c, 0x1a3d: 0x000c, 0x1a3e: 0x000c, 0x1a3f: 0x000c, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x000a, 0x1a41: 0x000a, 0x1a42: 0x000a, 0x1a43: 0x000a, 0x1a44: 0x000a, 0x1a45: 0x000a, + 0x1a46: 0x000a, 0x1a47: 0x000a, 0x1a48: 0x000a, 0x1a49: 0x000a, 0x1a4a: 0x000a, 0x1a4b: 0x000a, + 0x1a4c: 0x000a, 0x1a4d: 0x000a, 0x1a4e: 0x000a, 0x1a4f: 0x000a, 0x1a50: 0x000a, 0x1a51: 0x000a, + 0x1a52: 0x000a, 0x1a53: 0x000a, 0x1a54: 0x000a, 0x1a55: 0x000a, 0x1a56: 0x000a, 0x1a57: 0x000a, + 0x1a58: 0x000a, 0x1a59: 0x000a, 0x1a5a: 0x000a, 0x1a5b: 0x000a, 0x1a5c: 0x000a, 0x1a5d: 0x000a, + 0x1a5e: 0x000a, 0x1a5f: 0x000a, 0x1a60: 0x000a, 0x1a61: 0x000a, 0x1a62: 0x003a, 0x1a63: 0x002a, + 0x1a64: 0x003a, 0x1a65: 0x002a, 0x1a66: 0x003a, 0x1a67: 0x002a, 0x1a68: 0x003a, 0x1a69: 0x002a, + 0x1a6a: 0x000a, 0x1a6b: 0x000a, 0x1a6c: 0x000a, 0x1a6d: 0x000a, 0x1a6e: 0x000a, 0x1a6f: 0x000a, + 0x1a70: 0x000a, 0x1a71: 0x000a, 0x1a72: 0x000a, 0x1a73: 0x000a, 0x1a74: 0x000a, 0x1a75: 0x000a, + 0x1a76: 0x000a, 0x1a77: 0x000a, 0x1a78: 0x000a, 0x1a79: 0x000a, 0x1a7a: 0x000a, 0x1a7b: 0x000a, + 0x1a7c: 0x000a, 0x1a7d: 0x000a, 0x1a7e: 0x000a, 0x1a7f: 0x000a, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a, + 0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a, + 0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, + 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, + 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a, + 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x000a, 0x1ad6: 0x000a, 0x1ad7: 0x000a, + 0x1ad8: 0x000a, 0x1ad9: 0x000a, 0x1adb: 0x000a, 0x1adc: 0x000a, 0x1add: 0x000a, + 0x1ade: 0x000a, 0x1adf: 0x000a, 0x1ae0: 0x000a, 0x1ae1: 0x000a, 0x1ae2: 0x000a, 0x1ae3: 0x000a, + 0x1ae4: 0x000a, 0x1ae5: 0x000a, 0x1ae6: 0x000a, 0x1ae7: 0x000a, 0x1ae8: 0x000a, 0x1ae9: 0x000a, + 0x1aea: 0x000a, 0x1aeb: 0x000a, 0x1aec: 0x000a, 0x1aed: 0x000a, 0x1aee: 0x000a, 0x1aef: 0x000a, + 0x1af0: 0x000a, 0x1af1: 0x000a, 0x1af2: 0x000a, 0x1af3: 0x000a, 0x1af4: 0x000a, 0x1af5: 0x000a, + 0x1af6: 0x000a, 0x1af7: 0x000a, 0x1af8: 0x000a, 0x1af9: 0x000a, 0x1afa: 0x000a, 0x1afb: 0x000a, + 0x1afc: 0x000a, 0x1afd: 0x000a, 0x1afe: 0x000a, 0x1aff: 0x000a, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a, + 0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a, + 0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a, + 0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a, + 0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1a: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a, + 0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a, + 0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a, + 0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a, + 0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, + 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, + 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, + 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, + 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, 0x1b74: 0x000a, 0x1b75: 0x000a, + 0x1b76: 0x000a, 0x1b77: 0x000a, 0x1b78: 0x000a, 0x1b79: 0x000a, 0x1b7a: 0x000a, 0x1b7b: 0x000a, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x0009, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, + 0x1b88: 0x003a, 0x1b89: 0x002a, 0x1b8a: 0x003a, 0x1b8b: 0x002a, + 0x1b8c: 0x003a, 0x1b8d: 0x002a, 0x1b8e: 0x003a, 0x1b8f: 0x002a, 0x1b90: 0x003a, 0x1b91: 0x002a, + 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x003a, 0x1b95: 0x002a, 0x1b96: 0x003a, 0x1b97: 0x002a, + 0x1b98: 0x003a, 0x1b99: 0x002a, 0x1b9a: 0x003a, 0x1b9b: 0x002a, 0x1b9c: 0x000a, 0x1b9d: 0x000a, + 0x1b9e: 0x000a, 0x1b9f: 0x000a, 0x1ba0: 0x000a, + 0x1baa: 0x000c, 0x1bab: 0x000c, 0x1bac: 0x000c, 0x1bad: 0x000c, + 0x1bb0: 0x000a, + 0x1bb6: 0x000a, 0x1bb7: 0x000a, + 0x1bbd: 0x000a, 0x1bbe: 0x000a, 0x1bbf: 0x000a, + // Block 0x6f, offset 0x1bc0 + 0x1bd9: 0x000c, 0x1bda: 0x000c, 0x1bdb: 0x000a, 0x1bdc: 0x000a, + 0x1be0: 0x000a, + // Block 0x70, offset 0x1c00 + 0x1c3b: 0x000a, + // Block 0x71, offset 0x1c40 + 0x1c40: 0x000a, 0x1c41: 0x000a, 0x1c42: 0x000a, 0x1c43: 0x000a, 0x1c44: 0x000a, 0x1c45: 0x000a, + 0x1c46: 0x000a, 0x1c47: 0x000a, 0x1c48: 0x000a, 0x1c49: 0x000a, 0x1c4a: 0x000a, 0x1c4b: 0x000a, + 0x1c4c: 0x000a, 0x1c4d: 0x000a, 0x1c4e: 0x000a, 0x1c4f: 0x000a, 0x1c50: 0x000a, 0x1c51: 0x000a, + 0x1c52: 0x000a, 0x1c53: 0x000a, 0x1c54: 0x000a, 0x1c55: 0x000a, 0x1c56: 0x000a, 0x1c57: 0x000a, + 0x1c58: 0x000a, 0x1c59: 0x000a, 0x1c5a: 0x000a, 0x1c5b: 0x000a, 0x1c5c: 0x000a, 0x1c5d: 0x000a, + 0x1c5e: 0x000a, 0x1c5f: 0x000a, 0x1c60: 0x000a, 0x1c61: 0x000a, 0x1c62: 0x000a, 0x1c63: 0x000a, + // Block 0x72, offset 0x1c80 + 0x1c9d: 0x000a, + 0x1c9e: 0x000a, + // Block 0x73, offset 0x1cc0 + 0x1cd0: 0x000a, 0x1cd1: 0x000a, + 0x1cd2: 0x000a, 0x1cd3: 0x000a, 0x1cd4: 0x000a, 0x1cd5: 0x000a, 0x1cd6: 0x000a, 0x1cd7: 0x000a, + 0x1cd8: 0x000a, 0x1cd9: 0x000a, 0x1cda: 0x000a, 0x1cdb: 0x000a, 0x1cdc: 0x000a, 0x1cdd: 0x000a, + 0x1cde: 0x000a, 0x1cdf: 0x000a, + 0x1cfc: 0x000a, 0x1cfd: 0x000a, 0x1cfe: 0x000a, + // Block 0x74, offset 0x1d00 + 0x1d31: 0x000a, 0x1d32: 0x000a, 0x1d33: 0x000a, 0x1d34: 0x000a, 0x1d35: 0x000a, + 0x1d36: 0x000a, 0x1d37: 0x000a, 0x1d38: 0x000a, 0x1d39: 0x000a, 0x1d3a: 0x000a, 0x1d3b: 0x000a, + 0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a, 0x1d3f: 0x000a, + // Block 0x75, offset 0x1d40 + 0x1d4c: 0x000a, 0x1d4d: 0x000a, 0x1d4e: 0x000a, 0x1d4f: 0x000a, + // Block 0x76, offset 0x1d80 + 0x1db7: 0x000a, 0x1db8: 0x000a, 0x1db9: 0x000a, 0x1dba: 0x000a, + // Block 0x77, offset 0x1dc0 + 0x1dde: 0x000a, 0x1ddf: 0x000a, + 0x1dff: 0x000a, + // Block 0x78, offset 0x1e00 + 0x1e10: 0x000a, 0x1e11: 0x000a, + 0x1e12: 0x000a, 0x1e13: 0x000a, 0x1e14: 0x000a, 0x1e15: 0x000a, 0x1e16: 0x000a, 0x1e17: 0x000a, + 0x1e18: 0x000a, 0x1e19: 0x000a, 0x1e1a: 0x000a, 0x1e1b: 0x000a, 0x1e1c: 0x000a, 0x1e1d: 0x000a, + 0x1e1e: 0x000a, 0x1e1f: 0x000a, 0x1e20: 0x000a, 0x1e21: 0x000a, 0x1e22: 0x000a, 0x1e23: 0x000a, + 0x1e24: 0x000a, 0x1e25: 0x000a, 0x1e26: 0x000a, 0x1e27: 0x000a, 0x1e28: 0x000a, 0x1e29: 0x000a, + 0x1e2a: 0x000a, 0x1e2b: 0x000a, 0x1e2c: 0x000a, 0x1e2d: 0x000a, 0x1e2e: 0x000a, 0x1e2f: 0x000a, + 0x1e30: 0x000a, 0x1e31: 0x000a, 0x1e32: 0x000a, 0x1e33: 0x000a, 0x1e34: 0x000a, 0x1e35: 0x000a, + 0x1e36: 0x000a, 0x1e37: 0x000a, 0x1e38: 0x000a, 0x1e39: 0x000a, 0x1e3a: 0x000a, 0x1e3b: 0x000a, + 0x1e3c: 0x000a, 0x1e3d: 0x000a, 0x1e3e: 0x000a, 0x1e3f: 0x000a, + // Block 0x79, offset 0x1e40 + 0x1e40: 0x000a, 0x1e41: 0x000a, 0x1e42: 0x000a, 0x1e43: 0x000a, 0x1e44: 0x000a, 0x1e45: 0x000a, + 0x1e46: 0x000a, + // Block 0x7a, offset 0x1e80 + 0x1e8d: 0x000a, 0x1e8e: 0x000a, 0x1e8f: 0x000a, + // Block 0x7b, offset 0x1ec0 + 0x1eef: 0x000c, + 0x1ef0: 0x000c, 0x1ef1: 0x000c, 0x1ef2: 0x000c, 0x1ef3: 0x000a, 0x1ef4: 0x000c, 0x1ef5: 0x000c, + 0x1ef6: 0x000c, 0x1ef7: 0x000c, 0x1ef8: 0x000c, 0x1ef9: 0x000c, 0x1efa: 0x000c, 0x1efb: 0x000c, + 0x1efc: 0x000c, 0x1efd: 0x000c, 0x1efe: 0x000a, 0x1eff: 0x000a, + // Block 0x7c, offset 0x1f00 + 0x1f1e: 0x000c, 0x1f1f: 0x000c, + // Block 0x7d, offset 0x1f40 + 0x1f70: 0x000c, 0x1f71: 0x000c, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0x000a, 0x1f81: 0x000a, 0x1f82: 0x000a, 0x1f83: 0x000a, 0x1f84: 0x000a, 0x1f85: 0x000a, + 0x1f86: 0x000a, 0x1f87: 0x000a, 0x1f88: 0x000a, 0x1f89: 0x000a, 0x1f8a: 0x000a, 0x1f8b: 0x000a, + 0x1f8c: 0x000a, 0x1f8d: 0x000a, 0x1f8e: 0x000a, 0x1f8f: 0x000a, 0x1f90: 0x000a, 0x1f91: 0x000a, + 0x1f92: 0x000a, 0x1f93: 0x000a, 0x1f94: 0x000a, 0x1f95: 0x000a, 0x1f96: 0x000a, 0x1f97: 0x000a, + 0x1f98: 0x000a, 0x1f99: 0x000a, 0x1f9a: 0x000a, 0x1f9b: 0x000a, 0x1f9c: 0x000a, 0x1f9d: 0x000a, + 0x1f9e: 0x000a, 0x1f9f: 0x000a, 0x1fa0: 0x000a, 0x1fa1: 0x000a, + // Block 0x7f, offset 0x1fc0 + 0x1fc8: 0x000a, + // Block 0x80, offset 0x2000 + 0x2002: 0x000c, + 0x2006: 0x000c, 0x200b: 0x000c, + 0x2025: 0x000c, 0x2026: 0x000c, 0x2028: 0x000a, 0x2029: 0x000a, + 0x202a: 0x000a, 0x202b: 0x000a, + 0x2038: 0x0004, 0x2039: 0x0004, + // Block 0x81, offset 0x2040 + 0x2074: 0x000a, 0x2075: 0x000a, + 0x2076: 0x000a, 0x2077: 0x000a, + // Block 0x82, offset 0x2080 + 0x2084: 0x000c, 0x2085: 0x000c, + 0x20a0: 0x000c, 0x20a1: 0x000c, 0x20a2: 0x000c, 0x20a3: 0x000c, + 0x20a4: 0x000c, 0x20a5: 0x000c, 0x20a6: 0x000c, 0x20a7: 0x000c, 0x20a8: 0x000c, 0x20a9: 0x000c, + 0x20aa: 0x000c, 0x20ab: 0x000c, 0x20ac: 0x000c, 0x20ad: 0x000c, 0x20ae: 0x000c, 0x20af: 0x000c, + 0x20b0: 0x000c, 0x20b1: 0x000c, + 0x20bf: 0x000c, + // Block 0x83, offset 0x20c0 + 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c, + 0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, + // Block 0x84, offset 0x2100 + 0x2107: 0x000c, 0x2108: 0x000c, 0x2109: 0x000c, 0x210a: 0x000c, 0x210b: 0x000c, + 0x210c: 0x000c, 0x210d: 0x000c, 0x210e: 0x000c, 0x210f: 0x000c, 0x2110: 0x000c, 0x2111: 0x000c, + // Block 0x85, offset 0x2140 + 0x2140: 0x000c, 0x2141: 0x000c, 0x2142: 0x000c, + 0x2173: 0x000c, + 0x2176: 0x000c, 0x2177: 0x000c, 0x2178: 0x000c, 0x2179: 0x000c, + 0x217c: 0x000c, 0x217d: 0x000c, + // Block 0x86, offset 0x2180 + 0x21a5: 0x000c, + // Block 0x87, offset 0x21c0 + 0x21e9: 0x000c, + 0x21ea: 0x000c, 0x21eb: 0x000c, 0x21ec: 0x000c, 0x21ed: 0x000c, 0x21ee: 0x000c, + 0x21f1: 0x000c, 0x21f2: 0x000c, 0x21f5: 0x000c, + 0x21f6: 0x000c, + // Block 0x88, offset 0x2200 + 0x2203: 0x000c, + 0x220c: 0x000c, + 0x223c: 0x000c, + // Block 0x89, offset 0x2240 + 0x2270: 0x000c, 0x2272: 0x000c, 0x2273: 0x000c, 0x2274: 0x000c, + 0x2277: 0x000c, 0x2278: 0x000c, + 0x227e: 0x000c, 0x227f: 0x000c, + // Block 0x8a, offset 0x2280 + 0x2281: 0x000c, + 0x22ac: 0x000c, 0x22ad: 0x000c, + 0x22b6: 0x000c, + // Block 0x8b, offset 0x22c0 + 0x22e5: 0x000c, 0x22e8: 0x000c, + 0x22ed: 0x000c, + // Block 0x8c, offset 0x2300 + 0x231d: 0x0001, + 0x231e: 0x000c, 0x231f: 0x0001, 0x2320: 0x0001, 0x2321: 0x0001, 0x2322: 0x0001, 0x2323: 0x0001, + 0x2324: 0x0001, 0x2325: 0x0001, 0x2326: 0x0001, 0x2327: 0x0001, 0x2328: 0x0001, 0x2329: 0x0003, + 0x232a: 0x0001, 0x232b: 0x0001, 0x232c: 0x0001, 0x232d: 0x0001, 0x232e: 0x0001, 0x232f: 0x0001, + 0x2330: 0x0001, 0x2331: 0x0001, 0x2332: 0x0001, 0x2333: 0x0001, 0x2334: 0x0001, 0x2335: 0x0001, + 0x2336: 0x0001, 0x2337: 0x0001, 0x2338: 0x0001, 0x2339: 0x0001, 0x233a: 0x0001, 0x233b: 0x0001, + 0x233c: 0x0001, 0x233d: 0x0001, 0x233e: 0x0001, 0x233f: 0x0001, + // Block 0x8d, offset 0x2340 + 0x2340: 0x0001, 0x2341: 0x0001, 0x2342: 0x0001, 0x2343: 0x0001, 0x2344: 0x0001, 0x2345: 0x0001, + 0x2346: 0x0001, 0x2347: 0x0001, 0x2348: 0x0001, 0x2349: 0x0001, 0x234a: 0x0001, 0x234b: 0x0001, + 0x234c: 0x0001, 0x234d: 0x0001, 0x234e: 0x0001, 0x234f: 0x0001, 0x2350: 0x000d, 0x2351: 0x000d, + 0x2352: 0x000d, 0x2353: 0x000d, 0x2354: 0x000d, 0x2355: 0x000d, 0x2356: 0x000d, 0x2357: 0x000d, + 0x2358: 0x000d, 0x2359: 0x000d, 0x235a: 0x000d, 0x235b: 0x000d, 0x235c: 0x000d, 0x235d: 0x000d, + 0x235e: 0x000d, 0x235f: 0x000d, 0x2360: 0x000d, 0x2361: 0x000d, 0x2362: 0x000d, 0x2363: 0x000d, + 0x2364: 0x000d, 0x2365: 0x000d, 0x2366: 0x000d, 0x2367: 0x000d, 0x2368: 0x000d, 0x2369: 0x000d, + 0x236a: 0x000d, 0x236b: 0x000d, 0x236c: 0x000d, 0x236d: 0x000d, 0x236e: 0x000d, 0x236f: 0x000d, + 0x2370: 0x000d, 0x2371: 0x000d, 0x2372: 0x000d, 0x2373: 0x000d, 0x2374: 0x000d, 0x2375: 0x000d, + 0x2376: 0x000d, 0x2377: 0x000d, 0x2378: 0x000d, 0x2379: 0x000d, 0x237a: 0x000d, 0x237b: 0x000d, + 0x237c: 0x000d, 0x237d: 0x000d, 0x237e: 0x000d, 0x237f: 0x000d, + // Block 0x8e, offset 0x2380 + 0x2380: 0x000d, 0x2381: 0x000d, 0x2382: 0x000d, 0x2383: 0x000d, 0x2384: 0x000d, 0x2385: 0x000d, + 0x2386: 0x000d, 0x2387: 0x000d, 0x2388: 0x000d, 0x2389: 0x000d, 0x238a: 0x000d, 0x238b: 0x000d, + 0x238c: 0x000d, 0x238d: 0x000d, 0x238e: 0x000d, 0x238f: 0x000d, 0x2390: 0x000d, 0x2391: 0x000d, + 0x2392: 0x000d, 0x2393: 0x000d, 0x2394: 0x000d, 0x2395: 0x000d, 0x2396: 0x000d, 0x2397: 0x000d, + 0x2398: 0x000d, 0x2399: 0x000d, 0x239a: 0x000d, 0x239b: 0x000d, 0x239c: 0x000d, 0x239d: 0x000d, + 0x239e: 0x000d, 0x239f: 0x000d, 0x23a0: 0x000d, 0x23a1: 0x000d, 0x23a2: 0x000d, 0x23a3: 0x000d, + 0x23a4: 0x000d, 0x23a5: 0x000d, 0x23a6: 0x000d, 0x23a7: 0x000d, 0x23a8: 0x000d, 0x23a9: 0x000d, + 0x23aa: 0x000d, 0x23ab: 0x000d, 0x23ac: 0x000d, 0x23ad: 0x000d, 0x23ae: 0x000d, 0x23af: 0x000d, + 0x23b0: 0x000d, 0x23b1: 0x000d, 0x23b2: 0x000d, 0x23b3: 0x000d, 0x23b4: 0x000d, 0x23b5: 0x000d, + 0x23b6: 0x000d, 0x23b7: 0x000d, 0x23b8: 0x000d, 0x23b9: 0x000d, 0x23ba: 0x000d, 0x23bb: 0x000d, + 0x23bc: 0x000d, 0x23bd: 0x000d, 0x23be: 0x000a, 0x23bf: 0x000a, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x000d, 0x23c1: 0x000d, 0x23c2: 0x000d, 0x23c3: 0x000d, 0x23c4: 0x000d, 0x23c5: 0x000d, + 0x23c6: 0x000d, 0x23c7: 0x000d, 0x23c8: 0x000d, 0x23c9: 0x000d, 0x23ca: 0x000d, 0x23cb: 0x000d, + 0x23cc: 0x000d, 0x23cd: 0x000d, 0x23ce: 0x000d, 0x23cf: 0x000d, 0x23d0: 0x000b, 0x23d1: 0x000b, + 0x23d2: 0x000b, 0x23d3: 0x000b, 0x23d4: 0x000b, 0x23d5: 0x000b, 0x23d6: 0x000b, 0x23d7: 0x000b, + 0x23d8: 0x000b, 0x23d9: 0x000b, 0x23da: 0x000b, 0x23db: 0x000b, 0x23dc: 0x000b, 0x23dd: 0x000b, + 0x23de: 0x000b, 0x23df: 0x000b, 0x23e0: 0x000b, 0x23e1: 0x000b, 0x23e2: 0x000b, 0x23e3: 0x000b, + 0x23e4: 0x000b, 0x23e5: 0x000b, 0x23e6: 0x000b, 0x23e7: 0x000b, 0x23e8: 0x000b, 0x23e9: 0x000b, + 0x23ea: 0x000b, 0x23eb: 0x000b, 0x23ec: 0x000b, 0x23ed: 0x000b, 0x23ee: 0x000b, 0x23ef: 0x000b, + 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, + 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, + 0x23fc: 0x000d, 0x23fd: 0x000a, 0x23fe: 0x000d, 0x23ff: 0x000d, + // Block 0x90, offset 0x2400 + 0x2400: 0x000c, 0x2401: 0x000c, 0x2402: 0x000c, 0x2403: 0x000c, 0x2404: 0x000c, 0x2405: 0x000c, + 0x2406: 0x000c, 0x2407: 0x000c, 0x2408: 0x000c, 0x2409: 0x000c, 0x240a: 0x000c, 0x240b: 0x000c, + 0x240c: 0x000c, 0x240d: 0x000c, 0x240e: 0x000c, 0x240f: 0x000c, 0x2410: 0x000a, 0x2411: 0x000a, + 0x2412: 0x000a, 0x2413: 0x000a, 0x2414: 0x000a, 0x2415: 0x000a, 0x2416: 0x000a, 0x2417: 0x000a, + 0x2418: 0x000a, 0x2419: 0x000a, + 0x2420: 0x000c, 0x2421: 0x000c, 0x2422: 0x000c, 0x2423: 0x000c, + 0x2424: 0x000c, 0x2425: 0x000c, 0x2426: 0x000c, 0x2427: 0x000c, 0x2428: 0x000c, 0x2429: 0x000c, + 0x242a: 0x000c, 0x242b: 0x000c, 0x242c: 0x000c, 0x242d: 0x000c, 0x242e: 0x000c, 0x242f: 0x000c, + 0x2430: 0x000a, 0x2431: 0x000a, 0x2432: 0x000a, 0x2433: 0x000a, 0x2434: 0x000a, 0x2435: 0x000a, + 0x2436: 0x000a, 0x2437: 0x000a, 0x2438: 0x000a, 0x2439: 0x000a, 0x243a: 0x000a, 0x243b: 0x000a, + 0x243c: 0x000a, 0x243d: 0x000a, 0x243e: 0x000a, 0x243f: 0x000a, + // Block 0x91, offset 0x2440 + 0x2440: 0x000a, 0x2441: 0x000a, 0x2442: 0x000a, 0x2443: 0x000a, 0x2444: 0x000a, 0x2445: 0x000a, + 0x2446: 0x000a, 0x2447: 0x000a, 0x2448: 0x000a, 0x2449: 0x000a, 0x244a: 0x000a, 0x244b: 0x000a, + 0x244c: 0x000a, 0x244d: 0x000a, 0x244e: 0x000a, 0x244f: 0x000a, 0x2450: 0x0006, 0x2451: 0x000a, + 0x2452: 0x0006, 0x2454: 0x000a, 0x2455: 0x0006, 0x2456: 0x000a, 0x2457: 0x000a, + 0x2458: 0x000a, 0x2459: 0x009a, 0x245a: 0x008a, 0x245b: 0x007a, 0x245c: 0x006a, 0x245d: 0x009a, + 0x245e: 0x008a, 0x245f: 0x0004, 0x2460: 0x000a, 0x2461: 0x000a, 0x2462: 0x0003, 0x2463: 0x0003, + 0x2464: 0x000a, 0x2465: 0x000a, 0x2466: 0x000a, 0x2468: 0x000a, 0x2469: 0x0004, + 0x246a: 0x0004, 0x246b: 0x000a, + 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d, + 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d, + 0x247c: 0x000d, 0x247d: 0x000d, 0x247e: 0x000d, 0x247f: 0x000d, + // Block 0x92, offset 0x2480 + 0x2480: 0x000d, 0x2481: 0x000d, 0x2482: 0x000d, 0x2483: 0x000d, 0x2484: 0x000d, 0x2485: 0x000d, + 0x2486: 0x000d, 0x2487: 0x000d, 0x2488: 0x000d, 0x2489: 0x000d, 0x248a: 0x000d, 0x248b: 0x000d, + 0x248c: 0x000d, 0x248d: 0x000d, 0x248e: 0x000d, 0x248f: 0x000d, 0x2490: 0x000d, 0x2491: 0x000d, + 0x2492: 0x000d, 0x2493: 0x000d, 0x2494: 0x000d, 0x2495: 0x000d, 0x2496: 0x000d, 0x2497: 0x000d, + 0x2498: 0x000d, 0x2499: 0x000d, 0x249a: 0x000d, 0x249b: 0x000d, 0x249c: 0x000d, 0x249d: 0x000d, + 0x249e: 0x000d, 0x249f: 0x000d, 0x24a0: 0x000d, 0x24a1: 0x000d, 0x24a2: 0x000d, 0x24a3: 0x000d, + 0x24a4: 0x000d, 0x24a5: 0x000d, 0x24a6: 0x000d, 0x24a7: 0x000d, 0x24a8: 0x000d, 0x24a9: 0x000d, + 0x24aa: 0x000d, 0x24ab: 0x000d, 0x24ac: 0x000d, 0x24ad: 0x000d, 0x24ae: 0x000d, 0x24af: 0x000d, + 0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d, + 0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d, + 0x24bc: 0x000d, 0x24bd: 0x000d, 0x24be: 0x000d, 0x24bf: 0x000b, + // Block 0x93, offset 0x24c0 + 0x24c1: 0x000a, 0x24c2: 0x000a, 0x24c3: 0x0004, 0x24c4: 0x0004, 0x24c5: 0x0004, + 0x24c6: 0x000a, 0x24c7: 0x000a, 0x24c8: 0x003a, 0x24c9: 0x002a, 0x24ca: 0x000a, 0x24cb: 0x0003, + 0x24cc: 0x0006, 0x24cd: 0x0003, 0x24ce: 0x0006, 0x24cf: 0x0006, 0x24d0: 0x0002, 0x24d1: 0x0002, + 0x24d2: 0x0002, 0x24d3: 0x0002, 0x24d4: 0x0002, 0x24d5: 0x0002, 0x24d6: 0x0002, 0x24d7: 0x0002, + 0x24d8: 0x0002, 0x24d9: 0x0002, 0x24da: 0x0006, 0x24db: 0x000a, 0x24dc: 0x000a, 0x24dd: 0x000a, + 0x24de: 0x000a, 0x24df: 0x000a, 0x24e0: 0x000a, + 0x24fb: 0x005a, + 0x24fc: 0x000a, 0x24fd: 0x004a, 0x24fe: 0x000a, 0x24ff: 0x000a, + // Block 0x94, offset 0x2500 + 0x2500: 0x000a, + 0x251b: 0x005a, 0x251c: 0x000a, 0x251d: 0x004a, + 0x251e: 0x000a, 0x251f: 0x00fa, 0x2520: 0x00ea, 0x2521: 0x000a, 0x2522: 0x003a, 0x2523: 0x002a, + 0x2524: 0x000a, 0x2525: 0x000a, + // Block 0x95, offset 0x2540 + 0x2560: 0x0004, 0x2561: 0x0004, 0x2562: 0x000a, 0x2563: 0x000a, + 0x2564: 0x000a, 0x2565: 0x0004, 0x2566: 0x0004, 0x2568: 0x000a, 0x2569: 0x000a, + 0x256a: 0x000a, 0x256b: 0x000a, 0x256c: 0x000a, 0x256d: 0x000a, 0x256e: 0x000a, + 0x2570: 0x000b, 0x2571: 0x000b, 0x2572: 0x000b, 0x2573: 0x000b, 0x2574: 0x000b, 0x2575: 0x000b, + 0x2576: 0x000b, 0x2577: 0x000b, 0x2578: 0x000b, 0x2579: 0x000a, 0x257a: 0x000a, 0x257b: 0x000a, + 0x257c: 0x000a, 0x257d: 0x000a, 0x257e: 0x000b, 0x257f: 0x000b, + // Block 0x96, offset 0x2580 + 0x2581: 0x000a, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x000a, 0x25c1: 0x000a, 0x25c2: 0x000a, 0x25c3: 0x000a, 0x25c4: 0x000a, 0x25c5: 0x000a, + 0x25c6: 0x000a, 0x25c7: 0x000a, 0x25c8: 0x000a, 0x25c9: 0x000a, 0x25ca: 0x000a, 0x25cb: 0x000a, + 0x25cc: 0x000a, 0x25d0: 0x000a, 0x25d1: 0x000a, + 0x25d2: 0x000a, 0x25d3: 0x000a, 0x25d4: 0x000a, 0x25d5: 0x000a, 0x25d6: 0x000a, 0x25d7: 0x000a, + 0x25d8: 0x000a, 0x25d9: 0x000a, 0x25da: 0x000a, 0x25db: 0x000a, + 0x25e0: 0x000a, + // Block 0x98, offset 0x2600 + 0x263d: 0x000c, + // Block 0x99, offset 0x2640 + 0x2660: 0x000c, 0x2661: 0x0002, 0x2662: 0x0002, 0x2663: 0x0002, + 0x2664: 0x0002, 0x2665: 0x0002, 0x2666: 0x0002, 0x2667: 0x0002, 0x2668: 0x0002, 0x2669: 0x0002, + 0x266a: 0x0002, 0x266b: 0x0002, 0x266c: 0x0002, 0x266d: 0x0002, 0x266e: 0x0002, 0x266f: 0x0002, + 0x2670: 0x0002, 0x2671: 0x0002, 0x2672: 0x0002, 0x2673: 0x0002, 0x2674: 0x0002, 0x2675: 0x0002, + 0x2676: 0x0002, 0x2677: 0x0002, 0x2678: 0x0002, 0x2679: 0x0002, 0x267a: 0x0002, 0x267b: 0x0002, + // Block 0x9a, offset 0x2680 + 0x26b6: 0x000c, 0x26b7: 0x000c, 0x26b8: 0x000c, 0x26b9: 0x000c, 0x26ba: 0x000c, + // Block 0x9b, offset 0x26c0 + 0x26c0: 0x0001, 0x26c1: 0x0001, 0x26c2: 0x0001, 0x26c3: 0x0001, 0x26c4: 0x0001, 0x26c5: 0x0001, + 0x26c6: 0x0001, 0x26c7: 0x0001, 0x26c8: 0x0001, 0x26c9: 0x0001, 0x26ca: 0x0001, 0x26cb: 0x0001, + 0x26cc: 0x0001, 0x26cd: 0x0001, 0x26ce: 0x0001, 0x26cf: 0x0001, 0x26d0: 0x0001, 0x26d1: 0x0001, + 0x26d2: 0x0001, 0x26d3: 0x0001, 0x26d4: 0x0001, 0x26d5: 0x0001, 0x26d6: 0x0001, 0x26d7: 0x0001, + 0x26d8: 0x0001, 0x26d9: 0x0001, 0x26da: 0x0001, 0x26db: 0x0001, 0x26dc: 0x0001, 0x26dd: 0x0001, + 0x26de: 0x0001, 0x26df: 0x0001, 0x26e0: 0x0001, 0x26e1: 0x0001, 0x26e2: 0x0001, 0x26e3: 0x0001, + 0x26e4: 0x0001, 0x26e5: 0x0001, 0x26e6: 0x0001, 0x26e7: 0x0001, 0x26e8: 0x0001, 0x26e9: 0x0001, + 0x26ea: 0x0001, 0x26eb: 0x0001, 0x26ec: 0x0001, 0x26ed: 0x0001, 0x26ee: 0x0001, 0x26ef: 0x0001, + 0x26f0: 0x0001, 0x26f1: 0x0001, 0x26f2: 0x0001, 0x26f3: 0x0001, 0x26f4: 0x0001, 0x26f5: 0x0001, + 0x26f6: 0x0001, 0x26f7: 0x0001, 0x26f8: 0x0001, 0x26f9: 0x0001, 0x26fa: 0x0001, 0x26fb: 0x0001, + 0x26fc: 0x0001, 0x26fd: 0x0001, 0x26fe: 0x0001, 0x26ff: 0x0001, + // Block 0x9c, offset 0x2700 + 0x2700: 0x0001, 0x2701: 0x0001, 0x2702: 0x0001, 0x2703: 0x0001, 0x2704: 0x0001, 0x2705: 0x0001, + 0x2706: 0x0001, 0x2707: 0x0001, 0x2708: 0x0001, 0x2709: 0x0001, 0x270a: 0x0001, 0x270b: 0x0001, + 0x270c: 0x0001, 0x270d: 0x0001, 0x270e: 0x0001, 0x270f: 0x0001, 0x2710: 0x0001, 0x2711: 0x0001, + 0x2712: 0x0001, 0x2713: 0x0001, 0x2714: 0x0001, 0x2715: 0x0001, 0x2716: 0x0001, 0x2717: 0x0001, + 0x2718: 0x0001, 0x2719: 0x0001, 0x271a: 0x0001, 0x271b: 0x0001, 0x271c: 0x0001, 0x271d: 0x0001, + 0x271e: 0x0001, 0x271f: 0x000a, 0x2720: 0x0001, 0x2721: 0x0001, 0x2722: 0x0001, 0x2723: 0x0001, + 0x2724: 0x0001, 0x2725: 0x0001, 0x2726: 0x0001, 0x2727: 0x0001, 0x2728: 0x0001, 0x2729: 0x0001, + 0x272a: 0x0001, 0x272b: 0x0001, 0x272c: 0x0001, 0x272d: 0x0001, 0x272e: 0x0001, 0x272f: 0x0001, + 0x2730: 0x0001, 0x2731: 0x0001, 0x2732: 0x0001, 0x2733: 0x0001, 0x2734: 0x0001, 0x2735: 0x0001, + 0x2736: 0x0001, 0x2737: 0x0001, 0x2738: 0x0001, 0x2739: 0x0001, 0x273a: 0x0001, 0x273b: 0x0001, + 0x273c: 0x0001, 0x273d: 0x0001, 0x273e: 0x0001, 0x273f: 0x0001, + // Block 0x9d, offset 0x2740 + 0x2740: 0x0001, 0x2741: 0x000c, 0x2742: 0x000c, 0x2743: 0x000c, 0x2744: 0x0001, 0x2745: 0x000c, + 0x2746: 0x000c, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001, + 0x274c: 0x000c, 0x274d: 0x000c, 0x274e: 0x000c, 0x274f: 0x000c, 0x2750: 0x0001, 0x2751: 0x0001, + 0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001, + 0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001, + 0x275e: 0x0001, 0x275f: 0x0001, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001, + 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001, + 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001, + 0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001, + 0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x000c, 0x2779: 0x000c, 0x277a: 0x000c, 0x277b: 0x0001, + 0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x000c, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, + 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, + 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001, + 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, + 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, + 0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, + 0x27a4: 0x0001, 0x27a5: 0x000c, 0x27a6: 0x000c, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, + 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, + 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, + 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, + 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001, + 0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, + 0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001, + 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, + 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, + 0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, + 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, + 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, + 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, + 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x000a, 0x27fa: 0x000a, 0x27fb: 0x000a, + 0x27fc: 0x000a, 0x27fd: 0x000a, 0x27fe: 0x000a, 0x27ff: 0x000a, + // Block 0xa0, offset 0x2800 + 0x2800: 0x000d, 0x2801: 0x000d, 0x2802: 0x000d, 0x2803: 0x000d, 0x2804: 0x000d, 0x2805: 0x000d, + 0x2806: 0x000d, 0x2807: 0x000d, 0x2808: 0x000d, 0x2809: 0x000d, 0x280a: 0x000d, 0x280b: 0x000d, + 0x280c: 0x000d, 0x280d: 0x000d, 0x280e: 0x000d, 0x280f: 0x000d, 0x2810: 0x000d, 0x2811: 0x000d, + 0x2812: 0x000d, 0x2813: 0x000d, 0x2814: 0x000d, 0x2815: 0x000d, 0x2816: 0x000d, 0x2817: 0x000d, + 0x2818: 0x000d, 0x2819: 0x000d, 0x281a: 0x000d, 0x281b: 0x000d, 0x281c: 0x000d, 0x281d: 0x000d, + 0x281e: 0x000d, 0x281f: 0x000d, 0x2820: 0x000d, 0x2821: 0x000d, 0x2822: 0x000d, 0x2823: 0x000d, + 0x2824: 0x000c, 0x2825: 0x000c, 0x2826: 0x000c, 0x2827: 0x000c, 0x2828: 0x000d, 0x2829: 0x000d, + 0x282a: 0x000d, 0x282b: 0x000d, 0x282c: 0x000d, 0x282d: 0x000d, 0x282e: 0x000d, 0x282f: 0x000d, + 0x2830: 0x0005, 0x2831: 0x0005, 0x2832: 0x0005, 0x2833: 0x0005, 0x2834: 0x0005, 0x2835: 0x0005, + 0x2836: 0x0005, 0x2837: 0x0005, 0x2838: 0x0005, 0x2839: 0x0005, 0x283a: 0x000d, 0x283b: 0x000d, + 0x283c: 0x000d, 0x283d: 0x000d, 0x283e: 0x000d, 0x283f: 0x000d, + // Block 0xa1, offset 0x2840 + 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, + 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, + 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, + 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, + 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, + 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0005, 0x2861: 0x0005, 0x2862: 0x0005, 0x2863: 0x0005, + 0x2864: 0x0005, 0x2865: 0x0005, 0x2866: 0x0005, 0x2867: 0x0005, 0x2868: 0x0005, 0x2869: 0x0005, + 0x286a: 0x0005, 0x286b: 0x0005, 0x286c: 0x0005, 0x286d: 0x0005, 0x286e: 0x0005, 0x286f: 0x0005, + 0x2870: 0x0005, 0x2871: 0x0005, 0x2872: 0x0005, 0x2873: 0x0005, 0x2874: 0x0005, 0x2875: 0x0005, + 0x2876: 0x0005, 0x2877: 0x0005, 0x2878: 0x0005, 0x2879: 0x0005, 0x287a: 0x0005, 0x287b: 0x0005, + 0x287c: 0x0005, 0x287d: 0x0005, 0x287e: 0x0005, 0x287f: 0x0001, + // Block 0xa2, offset 0x2880 + 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, + 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, + 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, + 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, + 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, + 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0001, 0x28a1: 0x0001, 0x28a2: 0x0001, 0x28a3: 0x0001, + 0x28a4: 0x0001, 0x28a5: 0x0001, 0x28a6: 0x0001, 0x28a7: 0x0001, 0x28a8: 0x0001, 0x28a9: 0x0001, + 0x28aa: 0x0001, 0x28ab: 0x0001, 0x28ac: 0x0001, 0x28ad: 0x0001, 0x28ae: 0x0001, 0x28af: 0x0001, + 0x28b0: 0x000d, 0x28b1: 0x000d, 0x28b2: 0x000d, 0x28b3: 0x000d, 0x28b4: 0x000d, 0x28b5: 0x000d, + 0x28b6: 0x000d, 0x28b7: 0x000d, 0x28b8: 0x000d, 0x28b9: 0x000d, 0x28ba: 0x000d, 0x28bb: 0x000d, + 0x28bc: 0x000d, 0x28bd: 0x000d, 0x28be: 0x000d, 0x28bf: 0x000d, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x000d, 0x28c1: 0x000d, 0x28c2: 0x000d, 0x28c3: 0x000d, 0x28c4: 0x000d, 0x28c5: 0x000d, + 0x28c6: 0x000c, 0x28c7: 0x000c, 0x28c8: 0x000c, 0x28c9: 0x000c, 0x28ca: 0x000c, 0x28cb: 0x000c, + 0x28cc: 0x000c, 0x28cd: 0x000c, 0x28ce: 0x000c, 0x28cf: 0x000c, 0x28d0: 0x000c, 0x28d1: 0x000d, + 0x28d2: 0x000d, 0x28d3: 0x000d, 0x28d4: 0x000d, 0x28d5: 0x000d, 0x28d6: 0x000d, 0x28d7: 0x000d, + 0x28d8: 0x000d, 0x28d9: 0x000d, 0x28da: 0x000d, 0x28db: 0x000d, 0x28dc: 0x000d, 0x28dd: 0x000d, + 0x28de: 0x000d, 0x28df: 0x000d, 0x28e0: 0x000d, 0x28e1: 0x000d, 0x28e2: 0x000d, 0x28e3: 0x000d, + 0x28e4: 0x000d, 0x28e5: 0x000d, 0x28e6: 0x000d, 0x28e7: 0x000d, 0x28e8: 0x000d, 0x28e9: 0x000d, + 0x28ea: 0x000d, 0x28eb: 0x000d, 0x28ec: 0x000d, 0x28ed: 0x000d, 0x28ee: 0x000d, 0x28ef: 0x000d, + 0x28f0: 0x0001, 0x28f1: 0x0001, 0x28f2: 0x0001, 0x28f3: 0x0001, 0x28f4: 0x0001, 0x28f5: 0x0001, + 0x28f6: 0x0001, 0x28f7: 0x0001, 0x28f8: 0x0001, 0x28f9: 0x0001, 0x28fa: 0x0001, 0x28fb: 0x0001, + 0x28fc: 0x0001, 0x28fd: 0x0001, 0x28fe: 0x0001, 0x28ff: 0x0001, + // Block 0xa4, offset 0x2900 + 0x2901: 0x000c, + 0x2938: 0x000c, 0x2939: 0x000c, 0x293a: 0x000c, 0x293b: 0x000c, + 0x293c: 0x000c, 0x293d: 0x000c, 0x293e: 0x000c, 0x293f: 0x000c, + // Block 0xa5, offset 0x2940 + 0x2940: 0x000c, 0x2941: 0x000c, 0x2942: 0x000c, 0x2943: 0x000c, 0x2944: 0x000c, 0x2945: 0x000c, + 0x2946: 0x000c, + 0x2952: 0x000a, 0x2953: 0x000a, 0x2954: 0x000a, 0x2955: 0x000a, 0x2956: 0x000a, 0x2957: 0x000a, + 0x2958: 0x000a, 0x2959: 0x000a, 0x295a: 0x000a, 0x295b: 0x000a, 0x295c: 0x000a, 0x295d: 0x000a, + 0x295e: 0x000a, 0x295f: 0x000a, 0x2960: 0x000a, 0x2961: 0x000a, 0x2962: 0x000a, 0x2963: 0x000a, + 0x2964: 0x000a, 0x2965: 0x000a, + 0x297f: 0x000c, + // Block 0xa6, offset 0x2980 + 0x2980: 0x000c, 0x2981: 0x000c, + 0x29b3: 0x000c, 0x29b4: 0x000c, 0x29b5: 0x000c, + 0x29b6: 0x000c, 0x29b9: 0x000c, 0x29ba: 0x000c, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x000c, 0x29c1: 0x000c, 0x29c2: 0x000c, + 0x29e7: 0x000c, 0x29e8: 0x000c, 0x29e9: 0x000c, + 0x29ea: 0x000c, 0x29eb: 0x000c, 0x29ed: 0x000c, 0x29ee: 0x000c, 0x29ef: 0x000c, + 0x29f0: 0x000c, 0x29f1: 0x000c, 0x29f2: 0x000c, 0x29f3: 0x000c, 0x29f4: 0x000c, + // Block 0xa8, offset 0x2a00 + 0x2a33: 0x000c, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x000c, 0x2a41: 0x000c, + 0x2a76: 0x000c, 0x2a77: 0x000c, 0x2a78: 0x000c, 0x2a79: 0x000c, 0x2a7a: 0x000c, 0x2a7b: 0x000c, + 0x2a7c: 0x000c, 0x2a7d: 0x000c, 0x2a7e: 0x000c, + // Block 0xaa, offset 0x2a80 + 0x2a89: 0x000c, 0x2a8a: 0x000c, 0x2a8b: 0x000c, + 0x2a8c: 0x000c, + // Block 0xab, offset 0x2ac0 + 0x2aef: 0x000c, + 0x2af0: 0x000c, 0x2af1: 0x000c, 0x2af4: 0x000c, + 0x2af6: 0x000c, 0x2af7: 0x000c, + 0x2afe: 0x000c, + // Block 0xac, offset 0x2b00 + 0x2b1f: 0x000c, 0x2b23: 0x000c, + 0x2b24: 0x000c, 0x2b25: 0x000c, 0x2b26: 0x000c, 0x2b27: 0x000c, 0x2b28: 0x000c, 0x2b29: 0x000c, + 0x2b2a: 0x000c, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x000c, + 0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, + 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6c: 0x000c, + 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c, + // Block 0xae, offset 0x2b80 + 0x2bb8: 0x000c, 0x2bb9: 0x000c, 0x2bba: 0x000c, 0x2bbb: 0x000c, + 0x2bbc: 0x000c, 0x2bbd: 0x000c, 0x2bbe: 0x000c, 0x2bbf: 0x000c, + // Block 0xaf, offset 0x2bc0 + 0x2bc2: 0x000c, 0x2bc3: 0x000c, 0x2bc4: 0x000c, + 0x2bc6: 0x000c, + 0x2bde: 0x000c, + // Block 0xb0, offset 0x2c00 + 0x2c33: 0x000c, 0x2c34: 0x000c, 0x2c35: 0x000c, + 0x2c36: 0x000c, 0x2c37: 0x000c, 0x2c38: 0x000c, 0x2c3a: 0x000c, + 0x2c3f: 0x000c, + // Block 0xb1, offset 0x2c40 + 0x2c40: 0x000c, 0x2c42: 0x000c, 0x2c43: 0x000c, + // Block 0xb2, offset 0x2c80 + 0x2cb2: 0x000c, 0x2cb3: 0x000c, 0x2cb4: 0x000c, 0x2cb5: 0x000c, + 0x2cbc: 0x000c, 0x2cbd: 0x000c, 0x2cbf: 0x000c, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x000c, + 0x2cdc: 0x000c, 0x2cdd: 0x000c, + // Block 0xb4, offset 0x2d00 + 0x2d33: 0x000c, 0x2d34: 0x000c, 0x2d35: 0x000c, + 0x2d36: 0x000c, 0x2d37: 0x000c, 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c, + 0x2d3d: 0x000c, 0x2d3f: 0x000c, + // Block 0xb5, offset 0x2d40 + 0x2d40: 0x000c, + 0x2d60: 0x000a, 0x2d61: 0x000a, 0x2d62: 0x000a, 0x2d63: 0x000a, + 0x2d64: 0x000a, 0x2d65: 0x000a, 0x2d66: 0x000a, 0x2d67: 0x000a, 0x2d68: 0x000a, 0x2d69: 0x000a, + 0x2d6a: 0x000a, 0x2d6b: 0x000a, 0x2d6c: 0x000a, + // Block 0xb6, offset 0x2d80 + 0x2dab: 0x000c, 0x2dad: 0x000c, + 0x2db0: 0x000c, 0x2db1: 0x000c, 0x2db2: 0x000c, 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c, + 0x2db7: 0x000c, + // Block 0xb7, offset 0x2dc0 + 0x2ddd: 0x000c, + 0x2dde: 0x000c, 0x2ddf: 0x000c, 0x2de2: 0x000c, 0x2de3: 0x000c, + 0x2de4: 0x000c, 0x2de5: 0x000c, 0x2de7: 0x000c, 0x2de8: 0x000c, 0x2de9: 0x000c, + 0x2dea: 0x000c, 0x2deb: 0x000c, + // Block 0xb8, offset 0x2e00 + 0x2e2f: 0x000c, + 0x2e30: 0x000c, 0x2e31: 0x000c, 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c, + 0x2e36: 0x000c, 0x2e37: 0x000c, 0x2e39: 0x000c, 0x2e3a: 0x000c, + // Block 0xb9, offset 0x2e40 + 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c, 0x2e57: 0x000c, + 0x2e5a: 0x000c, 0x2e5b: 0x000c, + 0x2e60: 0x000c, + // Block 0xba, offset 0x2e80 + 0x2e81: 0x000c, 0x2e82: 0x000c, 0x2e83: 0x000c, 0x2e84: 0x000c, 0x2e85: 0x000c, + 0x2e86: 0x000c, 0x2e89: 0x000c, 0x2e8a: 0x000c, + 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c, + 0x2eb6: 0x000c, 0x2eb7: 0x000c, 0x2eb8: 0x000c, 0x2ebb: 0x000c, + 0x2ebc: 0x000c, 0x2ebd: 0x000c, 0x2ebe: 0x000c, + // Block 0xbb, offset 0x2ec0 + 0x2ec7: 0x000c, + 0x2ed1: 0x000c, + 0x2ed2: 0x000c, 0x2ed3: 0x000c, 0x2ed4: 0x000c, 0x2ed5: 0x000c, 0x2ed6: 0x000c, + 0x2ed9: 0x000c, 0x2eda: 0x000c, 0x2edb: 0x000c, + // Block 0xbc, offset 0x2f00 + 0x2f0a: 0x000c, 0x2f0b: 0x000c, + 0x2f0c: 0x000c, 0x2f0d: 0x000c, 0x2f0e: 0x000c, 0x2f0f: 0x000c, 0x2f10: 0x000c, 0x2f11: 0x000c, + 0x2f12: 0x000c, 0x2f13: 0x000c, 0x2f14: 0x000c, 0x2f15: 0x000c, 0x2f16: 0x000c, + 0x2f18: 0x000c, 0x2f19: 0x000c, + // Block 0xbd, offset 0x2f40 + 0x2f70: 0x000c, 0x2f71: 0x000c, 0x2f72: 0x000c, 0x2f73: 0x000c, 0x2f74: 0x000c, 0x2f75: 0x000c, + 0x2f76: 0x000c, 0x2f78: 0x000c, 0x2f79: 0x000c, 0x2f7a: 0x000c, 0x2f7b: 0x000c, + 0x2f7c: 0x000c, 0x2f7d: 0x000c, + // Block 0xbe, offset 0x2f80 + 0x2f92: 0x000c, 0x2f93: 0x000c, 0x2f94: 0x000c, 0x2f95: 0x000c, 0x2f96: 0x000c, 0x2f97: 0x000c, + 0x2f98: 0x000c, 0x2f99: 0x000c, 0x2f9a: 0x000c, 0x2f9b: 0x000c, 0x2f9c: 0x000c, 0x2f9d: 0x000c, + 0x2f9e: 0x000c, 0x2f9f: 0x000c, 0x2fa0: 0x000c, 0x2fa1: 0x000c, 0x2fa2: 0x000c, 0x2fa3: 0x000c, + 0x2fa4: 0x000c, 0x2fa5: 0x000c, 0x2fa6: 0x000c, 0x2fa7: 0x000c, + 0x2faa: 0x000c, 0x2fab: 0x000c, 0x2fac: 0x000c, 0x2fad: 0x000c, 0x2fae: 0x000c, 0x2faf: 0x000c, + 0x2fb0: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb5: 0x000c, + 0x2fb6: 0x000c, + // Block 0xbf, offset 0x2fc0 + 0x2ff1: 0x000c, 0x2ff2: 0x000c, 0x2ff3: 0x000c, 0x2ff4: 0x000c, 0x2ff5: 0x000c, + 0x2ff6: 0x000c, 0x2ffa: 0x000c, + 0x2ffc: 0x000c, 0x2ffd: 0x000c, 0x2fff: 0x000c, + // Block 0xc0, offset 0x3000 + 0x3000: 0x000c, 0x3001: 0x000c, 0x3002: 0x000c, 0x3003: 0x000c, 0x3004: 0x000c, 0x3005: 0x000c, + 0x3007: 0x000c, + // Block 0xc1, offset 0x3040 + 0x3050: 0x000c, 0x3051: 0x000c, + 0x3055: 0x000c, 0x3057: 0x000c, + // Block 0xc2, offset 0x3080 + 0x30b3: 0x000c, 0x30b4: 0x000c, + // Block 0xc3, offset 0x30c0 + 0x30d5: 0x000a, 0x30d6: 0x000a, 0x30d7: 0x000a, + 0x30d8: 0x000a, 0x30d9: 0x000a, 0x30da: 0x000a, 0x30db: 0x000a, 0x30dc: 0x000a, 0x30dd: 0x0004, + 0x30de: 0x0004, 0x30df: 0x0004, 0x30e0: 0x0004, 0x30e1: 0x000a, 0x30e2: 0x000a, 0x30e3: 0x000a, + 0x30e4: 0x000a, 0x30e5: 0x000a, 0x30e6: 0x000a, 0x30e7: 0x000a, 0x30e8: 0x000a, 0x30e9: 0x000a, + 0x30ea: 0x000a, 0x30eb: 0x000a, 0x30ec: 0x000a, 0x30ed: 0x000a, 0x30ee: 0x000a, 0x30ef: 0x000a, + 0x30f0: 0x000a, 0x30f1: 0x000a, + // Block 0xc4, offset 0x3100 + 0x3130: 0x000c, 0x3131: 0x000c, 0x3132: 0x000c, 0x3133: 0x000c, 0x3134: 0x000c, + // Block 0xc5, offset 0x3140 + 0x3170: 0x000c, 0x3171: 0x000c, 0x3172: 0x000c, 0x3173: 0x000c, 0x3174: 0x000c, 0x3175: 0x000c, + 0x3176: 0x000c, + // Block 0xc6, offset 0x3180 + 0x318f: 0x000c, + // Block 0xc7, offset 0x31c0 + 0x31cf: 0x000c, 0x31d0: 0x000c, 0x31d1: 0x000c, + 0x31d2: 0x000c, + // Block 0xc8, offset 0x3200 + 0x3222: 0x000a, + // Block 0xc9, offset 0x3240 + 0x325d: 0x000c, + 0x325e: 0x000c, 0x3260: 0x000b, 0x3261: 0x000b, 0x3262: 0x000b, 0x3263: 0x000b, + // Block 0xca, offset 0x3280 + 0x32a7: 0x000c, 0x32a8: 0x000c, 0x32a9: 0x000c, + 0x32b3: 0x000b, 0x32b4: 0x000b, 0x32b5: 0x000b, + 0x32b6: 0x000b, 0x32b7: 0x000b, 0x32b8: 0x000b, 0x32b9: 0x000b, 0x32ba: 0x000b, 0x32bb: 0x000c, + 0x32bc: 0x000c, 0x32bd: 0x000c, 0x32be: 0x000c, 0x32bf: 0x000c, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x000c, 0x32c1: 0x000c, 0x32c2: 0x000c, 0x32c5: 0x000c, + 0x32c6: 0x000c, 0x32c7: 0x000c, 0x32c8: 0x000c, 0x32c9: 0x000c, 0x32ca: 0x000c, 0x32cb: 0x000c, + 0x32ea: 0x000c, 0x32eb: 0x000c, 0x32ec: 0x000c, 0x32ed: 0x000c, + // Block 0xcc, offset 0x3300 + 0x3300: 0x000a, 0x3301: 0x000a, 0x3302: 0x000c, 0x3303: 0x000c, 0x3304: 0x000c, 0x3305: 0x000a, + // Block 0xcd, offset 0x3340 + 0x3340: 0x000a, 0x3341: 0x000a, 0x3342: 0x000a, 0x3343: 0x000a, 0x3344: 0x000a, 0x3345: 0x000a, + 0x3346: 0x000a, 0x3347: 0x000a, 0x3348: 0x000a, 0x3349: 0x000a, 0x334a: 0x000a, 0x334b: 0x000a, + 0x334c: 0x000a, 0x334d: 0x000a, 0x334e: 0x000a, 0x334f: 0x000a, 0x3350: 0x000a, 0x3351: 0x000a, + 0x3352: 0x000a, 0x3353: 0x000a, 0x3354: 0x000a, 0x3355: 0x000a, 0x3356: 0x000a, + // Block 0xce, offset 0x3380 + 0x339b: 0x000a, + // Block 0xcf, offset 0x33c0 + 0x33d5: 0x000a, + // Block 0xd0, offset 0x3400 + 0x340f: 0x000a, + // Block 0xd1, offset 0x3440 + 0x3449: 0x000a, + // Block 0xd2, offset 0x3480 + 0x3483: 0x000a, + 0x348e: 0x0002, 0x348f: 0x0002, 0x3490: 0x0002, 0x3491: 0x0002, + 0x3492: 0x0002, 0x3493: 0x0002, 0x3494: 0x0002, 0x3495: 0x0002, 0x3496: 0x0002, 0x3497: 0x0002, + 0x3498: 0x0002, 0x3499: 0x0002, 0x349a: 0x0002, 0x349b: 0x0002, 0x349c: 0x0002, 0x349d: 0x0002, + 0x349e: 0x0002, 0x349f: 0x0002, 0x34a0: 0x0002, 0x34a1: 0x0002, 0x34a2: 0x0002, 0x34a3: 0x0002, + 0x34a4: 0x0002, 0x34a5: 0x0002, 0x34a6: 0x0002, 0x34a7: 0x0002, 0x34a8: 0x0002, 0x34a9: 0x0002, + 0x34aa: 0x0002, 0x34ab: 0x0002, 0x34ac: 0x0002, 0x34ad: 0x0002, 0x34ae: 0x0002, 0x34af: 0x0002, + 0x34b0: 0x0002, 0x34b1: 0x0002, 0x34b2: 0x0002, 0x34b3: 0x0002, 0x34b4: 0x0002, 0x34b5: 0x0002, + 0x34b6: 0x0002, 0x34b7: 0x0002, 0x34b8: 0x0002, 0x34b9: 0x0002, 0x34ba: 0x0002, 0x34bb: 0x0002, + 0x34bc: 0x0002, 0x34bd: 0x0002, 0x34be: 0x0002, 0x34bf: 0x0002, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x000c, 0x34c1: 0x000c, 0x34c2: 0x000c, 0x34c3: 0x000c, 0x34c4: 0x000c, 0x34c5: 0x000c, + 0x34c6: 0x000c, 0x34c7: 0x000c, 0x34c8: 0x000c, 0x34c9: 0x000c, 0x34ca: 0x000c, 0x34cb: 0x000c, + 0x34cc: 0x000c, 0x34cd: 0x000c, 0x34ce: 0x000c, 0x34cf: 0x000c, 0x34d0: 0x000c, 0x34d1: 0x000c, + 0x34d2: 0x000c, 0x34d3: 0x000c, 0x34d4: 0x000c, 0x34d5: 0x000c, 0x34d6: 0x000c, 0x34d7: 0x000c, + 0x34d8: 0x000c, 0x34d9: 0x000c, 0x34da: 0x000c, 0x34db: 0x000c, 0x34dc: 0x000c, 0x34dd: 0x000c, + 0x34de: 0x000c, 0x34df: 0x000c, 0x34e0: 0x000c, 0x34e1: 0x000c, 0x34e2: 0x000c, 0x34e3: 0x000c, + 0x34e4: 0x000c, 0x34e5: 0x000c, 0x34e6: 0x000c, 0x34e7: 0x000c, 0x34e8: 0x000c, 0x34e9: 0x000c, + 0x34ea: 0x000c, 0x34eb: 0x000c, 0x34ec: 0x000c, 0x34ed: 0x000c, 0x34ee: 0x000c, 0x34ef: 0x000c, + 0x34f0: 0x000c, 0x34f1: 0x000c, 0x34f2: 0x000c, 0x34f3: 0x000c, 0x34f4: 0x000c, 0x34f5: 0x000c, + 0x34f6: 0x000c, 0x34fb: 0x000c, + 0x34fc: 0x000c, 0x34fd: 0x000c, 0x34fe: 0x000c, 0x34ff: 0x000c, + // Block 0xd4, offset 0x3500 + 0x3500: 0x000c, 0x3501: 0x000c, 0x3502: 0x000c, 0x3503: 0x000c, 0x3504: 0x000c, 0x3505: 0x000c, + 0x3506: 0x000c, 0x3507: 0x000c, 0x3508: 0x000c, 0x3509: 0x000c, 0x350a: 0x000c, 0x350b: 0x000c, + 0x350c: 0x000c, 0x350d: 0x000c, 0x350e: 0x000c, 0x350f: 0x000c, 0x3510: 0x000c, 0x3511: 0x000c, + 0x3512: 0x000c, 0x3513: 0x000c, 0x3514: 0x000c, 0x3515: 0x000c, 0x3516: 0x000c, 0x3517: 0x000c, + 0x3518: 0x000c, 0x3519: 0x000c, 0x351a: 0x000c, 0x351b: 0x000c, 0x351c: 0x000c, 0x351d: 0x000c, + 0x351e: 0x000c, 0x351f: 0x000c, 0x3520: 0x000c, 0x3521: 0x000c, 0x3522: 0x000c, 0x3523: 0x000c, + 0x3524: 0x000c, 0x3525: 0x000c, 0x3526: 0x000c, 0x3527: 0x000c, 0x3528: 0x000c, 0x3529: 0x000c, + 0x352a: 0x000c, 0x352b: 0x000c, 0x352c: 0x000c, + 0x3535: 0x000c, + // Block 0xd5, offset 0x3540 + 0x3544: 0x000c, + 0x355b: 0x000c, 0x355c: 0x000c, 0x355d: 0x000c, + 0x355e: 0x000c, 0x355f: 0x000c, 0x3561: 0x000c, 0x3562: 0x000c, 0x3563: 0x000c, + 0x3564: 0x000c, 0x3565: 0x000c, 0x3566: 0x000c, 0x3567: 0x000c, 0x3568: 0x000c, 0x3569: 0x000c, + 0x356a: 0x000c, 0x356b: 0x000c, 0x356c: 0x000c, 0x356d: 0x000c, 0x356e: 0x000c, 0x356f: 0x000c, + // Block 0xd6, offset 0x3580 + 0x3580: 0x000c, 0x3581: 0x000c, 0x3582: 0x000c, 0x3583: 0x000c, 0x3584: 0x000c, 0x3585: 0x000c, + 0x3586: 0x000c, 0x3588: 0x000c, 0x3589: 0x000c, 0x358a: 0x000c, 0x358b: 0x000c, + 0x358c: 0x000c, 0x358d: 0x000c, 0x358e: 0x000c, 0x358f: 0x000c, 0x3590: 0x000c, 0x3591: 0x000c, + 0x3592: 0x000c, 0x3593: 0x000c, 0x3594: 0x000c, 0x3595: 0x000c, 0x3596: 0x000c, 0x3597: 0x000c, + 0x3598: 0x000c, 0x359b: 0x000c, 0x359c: 0x000c, 0x359d: 0x000c, + 0x359e: 0x000c, 0x359f: 0x000c, 0x35a0: 0x000c, 0x35a1: 0x000c, 0x35a3: 0x000c, + 0x35a4: 0x000c, 0x35a6: 0x000c, 0x35a7: 0x000c, 0x35a8: 0x000c, 0x35a9: 0x000c, + 0x35aa: 0x000c, + // Block 0xd7, offset 0x35c0 + 0x35ec: 0x000c, 0x35ed: 0x000c, 0x35ee: 0x000c, 0x35ef: 0x000c, + 0x35ff: 0x0004, + // Block 0xd8, offset 0x3600 + 0x3600: 0x0001, 0x3601: 0x0001, 0x3602: 0x0001, 0x3603: 0x0001, 0x3604: 0x0001, 0x3605: 0x0001, + 0x3606: 0x0001, 0x3607: 0x0001, 0x3608: 0x0001, 0x3609: 0x0001, 0x360a: 0x0001, 0x360b: 0x0001, + 0x360c: 0x0001, 0x360d: 0x0001, 0x360e: 0x0001, 0x360f: 0x0001, 0x3610: 0x000c, 0x3611: 0x000c, + 0x3612: 0x000c, 0x3613: 0x000c, 0x3614: 0x000c, 0x3615: 0x000c, 0x3616: 0x000c, 0x3617: 0x0001, + 0x3618: 0x0001, 0x3619: 0x0001, 0x361a: 0x0001, 0x361b: 0x0001, 0x361c: 0x0001, 0x361d: 0x0001, + 0x361e: 0x0001, 0x361f: 0x0001, 0x3620: 0x0001, 0x3621: 0x0001, 0x3622: 0x0001, 0x3623: 0x0001, + 0x3624: 0x0001, 0x3625: 0x0001, 0x3626: 0x0001, 0x3627: 0x0001, 0x3628: 0x0001, 0x3629: 0x0001, + 0x362a: 0x0001, 0x362b: 0x0001, 0x362c: 0x0001, 0x362d: 0x0001, 0x362e: 0x0001, 0x362f: 0x0001, + 0x3630: 0x0001, 0x3631: 0x0001, 0x3632: 0x0001, 0x3633: 0x0001, 0x3634: 0x0001, 0x3635: 0x0001, + 0x3636: 0x0001, 0x3637: 0x0001, 0x3638: 0x0001, 0x3639: 0x0001, 0x363a: 0x0001, 0x363b: 0x0001, + 0x363c: 0x0001, 0x363d: 0x0001, 0x363e: 0x0001, 0x363f: 0x0001, + // Block 0xd9, offset 0x3640 + 0x3640: 0x0001, 0x3641: 0x0001, 0x3642: 0x0001, 0x3643: 0x0001, 0x3644: 0x000c, 0x3645: 0x000c, + 0x3646: 0x000c, 0x3647: 0x000c, 0x3648: 0x000c, 0x3649: 0x000c, 0x364a: 0x000c, 0x364b: 0x0001, + 0x364c: 0x0001, 0x364d: 0x0001, 0x364e: 0x0001, 0x364f: 0x0001, 0x3650: 0x0001, 0x3651: 0x0001, + 0x3652: 0x0001, 0x3653: 0x0001, 0x3654: 0x0001, 0x3655: 0x0001, 0x3656: 0x0001, 0x3657: 0x0001, + 0x3658: 0x0001, 0x3659: 0x0001, 0x365a: 0x0001, 0x365b: 0x0001, 0x365c: 0x0001, 0x365d: 0x0001, + 0x365e: 0x0001, 0x365f: 0x0001, 0x3660: 0x0001, 0x3661: 0x0001, 0x3662: 0x0001, 0x3663: 0x0001, + 0x3664: 0x0001, 0x3665: 0x0001, 0x3666: 0x0001, 0x3667: 0x0001, 0x3668: 0x0001, 0x3669: 0x0001, + 0x366a: 0x0001, 0x366b: 0x0001, 0x366c: 0x0001, 0x366d: 0x0001, 0x366e: 0x0001, 0x366f: 0x0001, + 0x3670: 0x0001, 0x3671: 0x0001, 0x3672: 0x0001, 0x3673: 0x0001, 0x3674: 0x0001, 0x3675: 0x0001, + 0x3676: 0x0001, 0x3677: 0x0001, 0x3678: 0x0001, 0x3679: 0x0001, 0x367a: 0x0001, 0x367b: 0x0001, + 0x367c: 0x0001, 0x367d: 0x0001, 0x367e: 0x0001, 0x367f: 0x0001, + // Block 0xda, offset 0x3680 + 0x3680: 0x000d, 0x3681: 0x000d, 0x3682: 0x000d, 0x3683: 0x000d, 0x3684: 0x000d, 0x3685: 0x000d, + 0x3686: 0x000d, 0x3687: 0x000d, 0x3688: 0x000d, 0x3689: 0x000d, 0x368a: 0x000d, 0x368b: 0x000d, + 0x368c: 0x000d, 0x368d: 0x000d, 0x368e: 0x000d, 0x368f: 0x000d, 0x3690: 0x0001, 0x3691: 0x0001, + 0x3692: 0x0001, 0x3693: 0x0001, 0x3694: 0x0001, 0x3695: 0x0001, 0x3696: 0x0001, 0x3697: 0x0001, + 0x3698: 0x0001, 0x3699: 0x0001, 0x369a: 0x0001, 0x369b: 0x0001, 0x369c: 0x0001, 0x369d: 0x0001, + 0x369e: 0x0001, 0x369f: 0x0001, 0x36a0: 0x0001, 0x36a1: 0x0001, 0x36a2: 0x0001, 0x36a3: 0x0001, + 0x36a4: 0x0001, 0x36a5: 0x0001, 0x36a6: 0x0001, 0x36a7: 0x0001, 0x36a8: 0x0001, 0x36a9: 0x0001, + 0x36aa: 0x0001, 0x36ab: 0x0001, 0x36ac: 0x0001, 0x36ad: 0x0001, 0x36ae: 0x0001, 0x36af: 0x0001, + 0x36b0: 0x0001, 0x36b1: 0x0001, 0x36b2: 0x0001, 0x36b3: 0x0001, 0x36b4: 0x0001, 0x36b5: 0x0001, + 0x36b6: 0x0001, 0x36b7: 0x0001, 0x36b8: 0x0001, 0x36b9: 0x0001, 0x36ba: 0x0001, 0x36bb: 0x0001, + 0x36bc: 0x0001, 0x36bd: 0x0001, 0x36be: 0x0001, 0x36bf: 0x0001, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x000d, 0x36c1: 0x000d, 0x36c2: 0x000d, 0x36c3: 0x000d, 0x36c4: 0x000d, 0x36c5: 0x000d, + 0x36c6: 0x000d, 0x36c7: 0x000d, 0x36c8: 0x000d, 0x36c9: 0x000d, 0x36ca: 0x000d, 0x36cb: 0x000d, + 0x36cc: 0x000d, 0x36cd: 0x000d, 0x36ce: 0x000d, 0x36cf: 0x000d, 0x36d0: 0x000d, 0x36d1: 0x000d, + 0x36d2: 0x000d, 0x36d3: 0x000d, 0x36d4: 0x000d, 0x36d5: 0x000d, 0x36d6: 0x000d, 0x36d7: 0x000d, + 0x36d8: 0x000d, 0x36d9: 0x000d, 0x36da: 0x000d, 0x36db: 0x000d, 0x36dc: 0x000d, 0x36dd: 0x000d, + 0x36de: 0x000d, 0x36df: 0x000d, 0x36e0: 0x000d, 0x36e1: 0x000d, 0x36e2: 0x000d, 0x36e3: 0x000d, + 0x36e4: 0x000d, 0x36e5: 0x000d, 0x36e6: 0x000d, 0x36e7: 0x000d, 0x36e8: 0x000d, 0x36e9: 0x000d, + 0x36ea: 0x000d, 0x36eb: 0x000d, 0x36ec: 0x000d, 0x36ed: 0x000d, 0x36ee: 0x000d, 0x36ef: 0x000d, + 0x36f0: 0x000a, 0x36f1: 0x000a, 0x36f2: 0x000d, 0x36f3: 0x000d, 0x36f4: 0x000d, 0x36f5: 0x000d, + 0x36f6: 0x000d, 0x36f7: 0x000d, 0x36f8: 0x000d, 0x36f9: 0x000d, 0x36fa: 0x000d, 0x36fb: 0x000d, + 0x36fc: 0x000d, 0x36fd: 0x000d, 0x36fe: 0x000d, 0x36ff: 0x000d, + // Block 0xdc, offset 0x3700 + 0x3700: 0x000a, 0x3701: 0x000a, 0x3702: 0x000a, 0x3703: 0x000a, 0x3704: 0x000a, 0x3705: 0x000a, + 0x3706: 0x000a, 0x3707: 0x000a, 0x3708: 0x000a, 0x3709: 0x000a, 0x370a: 0x000a, 0x370b: 0x000a, + 0x370c: 0x000a, 0x370d: 0x000a, 0x370e: 0x000a, 0x370f: 0x000a, 0x3710: 0x000a, 0x3711: 0x000a, + 0x3712: 0x000a, 0x3713: 0x000a, 0x3714: 0x000a, 0x3715: 0x000a, 0x3716: 0x000a, 0x3717: 0x000a, + 0x3718: 0x000a, 0x3719: 0x000a, 0x371a: 0x000a, 0x371b: 0x000a, 0x371c: 0x000a, 0x371d: 0x000a, + 0x371e: 0x000a, 0x371f: 0x000a, 0x3720: 0x000a, 0x3721: 0x000a, 0x3722: 0x000a, 0x3723: 0x000a, + 0x3724: 0x000a, 0x3725: 0x000a, 0x3726: 0x000a, 0x3727: 0x000a, 0x3728: 0x000a, 0x3729: 0x000a, + 0x372a: 0x000a, 0x372b: 0x000a, + 0x3730: 0x000a, 0x3731: 0x000a, 0x3732: 0x000a, 0x3733: 0x000a, 0x3734: 0x000a, 0x3735: 0x000a, + 0x3736: 0x000a, 0x3737: 0x000a, 0x3738: 0x000a, 0x3739: 0x000a, 0x373a: 0x000a, 0x373b: 0x000a, + 0x373c: 0x000a, 0x373d: 0x000a, 0x373e: 0x000a, 0x373f: 0x000a, + // Block 0xdd, offset 0x3740 + 0x3740: 0x000a, 0x3741: 0x000a, 0x3742: 0x000a, 0x3743: 0x000a, 0x3744: 0x000a, 0x3745: 0x000a, + 0x3746: 0x000a, 0x3747: 0x000a, 0x3748: 0x000a, 0x3749: 0x000a, 0x374a: 0x000a, 0x374b: 0x000a, + 0x374c: 0x000a, 0x374d: 0x000a, 0x374e: 0x000a, 0x374f: 0x000a, 0x3750: 0x000a, 0x3751: 0x000a, + 0x3752: 0x000a, 0x3753: 0x000a, + 0x3760: 0x000a, 0x3761: 0x000a, 0x3762: 0x000a, 0x3763: 0x000a, + 0x3764: 0x000a, 0x3765: 0x000a, 0x3766: 0x000a, 0x3767: 0x000a, 0x3768: 0x000a, 0x3769: 0x000a, + 0x376a: 0x000a, 0x376b: 0x000a, 0x376c: 0x000a, 0x376d: 0x000a, 0x376e: 0x000a, + 0x3771: 0x000a, 0x3772: 0x000a, 0x3773: 0x000a, 0x3774: 0x000a, 0x3775: 0x000a, + 0x3776: 0x000a, 0x3777: 0x000a, 0x3778: 0x000a, 0x3779: 0x000a, 0x377a: 0x000a, 0x377b: 0x000a, + 0x377c: 0x000a, 0x377d: 0x000a, 0x377e: 0x000a, 0x377f: 0x000a, + // Block 0xde, offset 0x3780 + 0x3781: 0x000a, 0x3782: 0x000a, 0x3783: 0x000a, 0x3784: 0x000a, 0x3785: 0x000a, + 0x3786: 0x000a, 0x3787: 0x000a, 0x3788: 0x000a, 0x3789: 0x000a, 0x378a: 0x000a, 0x378b: 0x000a, + 0x378c: 0x000a, 0x378d: 0x000a, 0x378e: 0x000a, 0x378f: 0x000a, 0x3791: 0x000a, + 0x3792: 0x000a, 0x3793: 0x000a, 0x3794: 0x000a, 0x3795: 0x000a, 0x3796: 0x000a, 0x3797: 0x000a, + 0x3798: 0x000a, 0x3799: 0x000a, 0x379a: 0x000a, 0x379b: 0x000a, 0x379c: 0x000a, 0x379d: 0x000a, + 0x379e: 0x000a, 0x379f: 0x000a, 0x37a0: 0x000a, 0x37a1: 0x000a, 0x37a2: 0x000a, 0x37a3: 0x000a, + 0x37a4: 0x000a, 0x37a5: 0x000a, 0x37a6: 0x000a, 0x37a7: 0x000a, 0x37a8: 0x000a, 0x37a9: 0x000a, + 0x37aa: 0x000a, 0x37ab: 0x000a, 0x37ac: 0x000a, 0x37ad: 0x000a, 0x37ae: 0x000a, 0x37af: 0x000a, + 0x37b0: 0x000a, 0x37b1: 0x000a, 0x37b2: 0x000a, 0x37b3: 0x000a, 0x37b4: 0x000a, 0x37b5: 0x000a, + // Block 0xdf, offset 0x37c0 + 0x37c0: 0x0002, 0x37c1: 0x0002, 0x37c2: 0x0002, 0x37c3: 0x0002, 0x37c4: 0x0002, 0x37c5: 0x0002, + 0x37c6: 0x0002, 0x37c7: 0x0002, 0x37c8: 0x0002, 0x37c9: 0x0002, 0x37ca: 0x0002, 0x37cb: 0x000a, + 0x37cc: 0x000a, + 0x37ef: 0x000a, + // Block 0xe0, offset 0x3800 + 0x382a: 0x000a, 0x382b: 0x000a, 0x382c: 0x000a, + // Block 0xe1, offset 0x3840 + 0x3860: 0x000a, 0x3861: 0x000a, 0x3862: 0x000a, 0x3863: 0x000a, + 0x3864: 0x000a, 0x3865: 0x000a, + // Block 0xe2, offset 0x3880 + 0x3880: 0x000a, 0x3881: 0x000a, 0x3882: 0x000a, 0x3883: 0x000a, 0x3884: 0x000a, 0x3885: 0x000a, + 0x3886: 0x000a, 0x3887: 0x000a, 0x3888: 0x000a, 0x3889: 0x000a, 0x388a: 0x000a, 0x388b: 0x000a, + 0x388c: 0x000a, 0x388d: 0x000a, 0x388e: 0x000a, 0x388f: 0x000a, 0x3890: 0x000a, 0x3891: 0x000a, + 0x3892: 0x000a, 0x3893: 0x000a, 0x3894: 0x000a, 0x3895: 0x000a, + 0x38a0: 0x000a, 0x38a1: 0x000a, 0x38a2: 0x000a, 0x38a3: 0x000a, + 0x38a4: 0x000a, 0x38a5: 0x000a, 0x38a6: 0x000a, 0x38a7: 0x000a, 0x38a8: 0x000a, 0x38a9: 0x000a, + 0x38aa: 0x000a, 0x38ab: 0x000a, 0x38ac: 0x000a, + 0x38b0: 0x000a, 0x38b1: 0x000a, 0x38b2: 0x000a, 0x38b3: 0x000a, 0x38b4: 0x000a, 0x38b5: 0x000a, + 0x38b6: 0x000a, 0x38b7: 0x000a, 0x38b8: 0x000a, 0x38b9: 0x000a, 0x38ba: 0x000a, + // Block 0xe3, offset 0x38c0 + 0x38c0: 0x000a, 0x38c1: 0x000a, 0x38c2: 0x000a, 0x38c3: 0x000a, 0x38c4: 0x000a, 0x38c5: 0x000a, + 0x38c6: 0x000a, 0x38c7: 0x000a, 0x38c8: 0x000a, 0x38c9: 0x000a, 0x38ca: 0x000a, 0x38cb: 0x000a, + 0x38cc: 0x000a, 0x38cd: 0x000a, 0x38ce: 0x000a, 0x38cf: 0x000a, 0x38d0: 0x000a, 0x38d1: 0x000a, + 0x38d2: 0x000a, 0x38d3: 0x000a, 0x38d4: 0x000a, 0x38d5: 0x000a, 0x38d6: 0x000a, 0x38d7: 0x000a, + 0x38d8: 0x000a, + 0x38e0: 0x000a, 0x38e1: 0x000a, 0x38e2: 0x000a, 0x38e3: 0x000a, + 0x38e4: 0x000a, 0x38e5: 0x000a, 0x38e6: 0x000a, 0x38e7: 0x000a, 0x38e8: 0x000a, 0x38e9: 0x000a, + 0x38ea: 0x000a, 0x38eb: 0x000a, + // Block 0xe4, offset 0x3900 + 0x3900: 0x000a, 0x3901: 0x000a, 0x3902: 0x000a, 0x3903: 0x000a, 0x3904: 0x000a, 0x3905: 0x000a, + 0x3906: 0x000a, 0x3907: 0x000a, 0x3908: 0x000a, 0x3909: 0x000a, 0x390a: 0x000a, 0x390b: 0x000a, + 0x3910: 0x000a, 0x3911: 0x000a, + 0x3912: 0x000a, 0x3913: 0x000a, 0x3914: 0x000a, 0x3915: 0x000a, 0x3916: 0x000a, 0x3917: 0x000a, + 0x3918: 0x000a, 0x3919: 0x000a, 0x391a: 0x000a, 0x391b: 0x000a, 0x391c: 0x000a, 0x391d: 0x000a, + 0x391e: 0x000a, 0x391f: 0x000a, 0x3920: 0x000a, 0x3921: 0x000a, 0x3922: 0x000a, 0x3923: 0x000a, + 0x3924: 0x000a, 0x3925: 0x000a, 0x3926: 0x000a, 0x3927: 0x000a, 0x3928: 0x000a, 0x3929: 0x000a, + 0x392a: 0x000a, 0x392b: 0x000a, 0x392c: 0x000a, 0x392d: 0x000a, 0x392e: 0x000a, 0x392f: 0x000a, + 0x3930: 0x000a, 0x3931: 0x000a, 0x3932: 0x000a, 0x3933: 0x000a, 0x3934: 0x000a, 0x3935: 0x000a, + 0x3936: 0x000a, 0x3937: 0x000a, 0x3938: 0x000a, 0x3939: 0x000a, 0x393a: 0x000a, 0x393b: 0x000a, + 0x393c: 0x000a, 0x393d: 0x000a, 0x393e: 0x000a, 0x393f: 0x000a, + // Block 0xe5, offset 0x3940 + 0x3940: 0x000a, 0x3941: 0x000a, 0x3942: 0x000a, 0x3943: 0x000a, 0x3944: 0x000a, 0x3945: 0x000a, + 0x3946: 0x000a, 0x3947: 0x000a, + 0x3950: 0x000a, 0x3951: 0x000a, + 0x3952: 0x000a, 0x3953: 0x000a, 0x3954: 0x000a, 0x3955: 0x000a, 0x3956: 0x000a, 0x3957: 0x000a, + 0x3958: 0x000a, 0x3959: 0x000a, + 0x3960: 0x000a, 0x3961: 0x000a, 0x3962: 0x000a, 0x3963: 0x000a, + 0x3964: 0x000a, 0x3965: 0x000a, 0x3966: 0x000a, 0x3967: 0x000a, 0x3968: 0x000a, 0x3969: 0x000a, + 0x396a: 0x000a, 0x396b: 0x000a, 0x396c: 0x000a, 0x396d: 0x000a, 0x396e: 0x000a, 0x396f: 0x000a, + 0x3970: 0x000a, 0x3971: 0x000a, 0x3972: 0x000a, 0x3973: 0x000a, 0x3974: 0x000a, 0x3975: 0x000a, + 0x3976: 0x000a, 0x3977: 0x000a, 0x3978: 0x000a, 0x3979: 0x000a, 0x397a: 0x000a, 0x397b: 0x000a, + 0x397c: 0x000a, 0x397d: 0x000a, 0x397e: 0x000a, 0x397f: 0x000a, + // Block 0xe6, offset 0x3980 + 0x3980: 0x000a, 0x3981: 0x000a, 0x3982: 0x000a, 0x3983: 0x000a, 0x3984: 0x000a, 0x3985: 0x000a, + 0x3986: 0x000a, 0x3987: 0x000a, + 0x3990: 0x000a, 0x3991: 0x000a, + 0x3992: 0x000a, 0x3993: 0x000a, 0x3994: 0x000a, 0x3995: 0x000a, 0x3996: 0x000a, 0x3997: 0x000a, + 0x3998: 0x000a, 0x3999: 0x000a, 0x399a: 0x000a, 0x399b: 0x000a, 0x399c: 0x000a, 0x399d: 0x000a, + 0x399e: 0x000a, 0x399f: 0x000a, 0x39a0: 0x000a, 0x39a1: 0x000a, 0x39a2: 0x000a, 0x39a3: 0x000a, + 0x39a4: 0x000a, 0x39a5: 0x000a, 0x39a6: 0x000a, 0x39a7: 0x000a, 0x39a8: 0x000a, 0x39a9: 0x000a, + 0x39aa: 0x000a, 0x39ab: 0x000a, 0x39ac: 0x000a, 0x39ad: 0x000a, + // Block 0xe7, offset 0x39c0 + 0x39c0: 0x000a, 0x39c1: 0x000a, 0x39c2: 0x000a, 0x39c3: 0x000a, 0x39c4: 0x000a, 0x39c5: 0x000a, + 0x39c6: 0x000a, 0x39c7: 0x000a, 0x39c8: 0x000a, 0x39c9: 0x000a, 0x39ca: 0x000a, 0x39cb: 0x000a, + 0x39cd: 0x000a, 0x39ce: 0x000a, 0x39cf: 0x000a, 0x39d0: 0x000a, 0x39d1: 0x000a, + 0x39d2: 0x000a, 0x39d3: 0x000a, 0x39d4: 0x000a, 0x39d5: 0x000a, 0x39d6: 0x000a, 0x39d7: 0x000a, + 0x39d8: 0x000a, 0x39d9: 0x000a, 0x39da: 0x000a, 0x39db: 0x000a, 0x39dc: 0x000a, 0x39dd: 0x000a, + 0x39de: 0x000a, 0x39df: 0x000a, 0x39e0: 0x000a, 0x39e1: 0x000a, 0x39e2: 0x000a, 0x39e3: 0x000a, + 0x39e4: 0x000a, 0x39e5: 0x000a, 0x39e6: 0x000a, 0x39e7: 0x000a, 0x39e8: 0x000a, 0x39e9: 0x000a, + 0x39ea: 0x000a, 0x39eb: 0x000a, 0x39ec: 0x000a, 0x39ed: 0x000a, 0x39ee: 0x000a, 0x39ef: 0x000a, + 0x39f0: 0x000a, 0x39f1: 0x000a, 0x39f2: 0x000a, 0x39f3: 0x000a, 0x39f4: 0x000a, 0x39f5: 0x000a, + 0x39f6: 0x000a, 0x39f7: 0x000a, 0x39f8: 0x000a, 0x39f9: 0x000a, 0x39fa: 0x000a, 0x39fb: 0x000a, + 0x39fc: 0x000a, 0x39fd: 0x000a, 0x39fe: 0x000a, 0x39ff: 0x000a, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x000a, 0x3a01: 0x000a, 0x3a02: 0x000a, 0x3a03: 0x000a, 0x3a04: 0x000a, 0x3a05: 0x000a, + 0x3a06: 0x000a, 0x3a07: 0x000a, 0x3a08: 0x000a, 0x3a09: 0x000a, 0x3a0a: 0x000a, 0x3a0b: 0x000a, + 0x3a0c: 0x000a, 0x3a0d: 0x000a, 0x3a0e: 0x000a, 0x3a0f: 0x000a, 0x3a10: 0x000a, 0x3a11: 0x000a, + 0x3a12: 0x000a, 0x3a13: 0x000a, 0x3a14: 0x000a, 0x3a15: 0x000a, 0x3a16: 0x000a, 0x3a17: 0x000a, + 0x3a18: 0x000a, 0x3a19: 0x000a, 0x3a1a: 0x000a, 0x3a1b: 0x000a, 0x3a1c: 0x000a, 0x3a1d: 0x000a, + 0x3a1e: 0x000a, 0x3a1f: 0x000a, 0x3a20: 0x000a, 0x3a21: 0x000a, 0x3a22: 0x000a, 0x3a23: 0x000a, + 0x3a24: 0x000a, 0x3a25: 0x000a, 0x3a26: 0x000a, 0x3a27: 0x000a, 0x3a28: 0x000a, 0x3a29: 0x000a, + 0x3a2a: 0x000a, 0x3a2b: 0x000a, 0x3a2c: 0x000a, 0x3a2d: 0x000a, 0x3a2e: 0x000a, 0x3a2f: 0x000a, + 0x3a30: 0x000a, 0x3a31: 0x000a, 0x3a33: 0x000a, 0x3a34: 0x000a, 0x3a35: 0x000a, + 0x3a36: 0x000a, 0x3a3a: 0x000a, 0x3a3b: 0x000a, + 0x3a3c: 0x000a, 0x3a3d: 0x000a, 0x3a3e: 0x000a, 0x3a3f: 0x000a, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x000a, 0x3a41: 0x000a, 0x3a42: 0x000a, 0x3a43: 0x000a, 0x3a44: 0x000a, 0x3a45: 0x000a, + 0x3a46: 0x000a, 0x3a47: 0x000a, 0x3a48: 0x000a, 0x3a49: 0x000a, 0x3a4a: 0x000a, 0x3a4b: 0x000a, + 0x3a4c: 0x000a, 0x3a4d: 0x000a, 0x3a4e: 0x000a, 0x3a4f: 0x000a, 0x3a50: 0x000a, 0x3a51: 0x000a, + 0x3a52: 0x000a, 0x3a53: 0x000a, 0x3a54: 0x000a, 0x3a55: 0x000a, 0x3a56: 0x000a, 0x3a57: 0x000a, + 0x3a58: 0x000a, 0x3a59: 0x000a, 0x3a5a: 0x000a, 0x3a5b: 0x000a, 0x3a5c: 0x000a, 0x3a5d: 0x000a, + 0x3a5e: 0x000a, 0x3a5f: 0x000a, 0x3a60: 0x000a, 0x3a61: 0x000a, 0x3a62: 0x000a, + 0x3a65: 0x000a, 0x3a66: 0x000a, 0x3a67: 0x000a, 0x3a68: 0x000a, 0x3a69: 0x000a, + 0x3a6a: 0x000a, 0x3a6e: 0x000a, 0x3a6f: 0x000a, + 0x3a70: 0x000a, 0x3a71: 0x000a, 0x3a72: 0x000a, 0x3a73: 0x000a, 0x3a74: 0x000a, 0x3a75: 0x000a, + 0x3a76: 0x000a, 0x3a77: 0x000a, 0x3a78: 0x000a, 0x3a79: 0x000a, 0x3a7a: 0x000a, 0x3a7b: 0x000a, + 0x3a7c: 0x000a, 0x3a7d: 0x000a, 0x3a7e: 0x000a, 0x3a7f: 0x000a, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x000a, 0x3a81: 0x000a, 0x3a82: 0x000a, 0x3a83: 0x000a, 0x3a84: 0x000a, 0x3a85: 0x000a, + 0x3a86: 0x000a, 0x3a87: 0x000a, 0x3a88: 0x000a, 0x3a89: 0x000a, 0x3a8a: 0x000a, + 0x3a8d: 0x000a, 0x3a8e: 0x000a, 0x3a8f: 0x000a, 0x3a90: 0x000a, 0x3a91: 0x000a, + 0x3a92: 0x000a, 0x3a93: 0x000a, 0x3a94: 0x000a, 0x3a95: 0x000a, 0x3a96: 0x000a, 0x3a97: 0x000a, + 0x3a98: 0x000a, 0x3a99: 0x000a, 0x3a9a: 0x000a, 0x3a9b: 0x000a, 0x3a9c: 0x000a, 0x3a9d: 0x000a, + 0x3a9e: 0x000a, 0x3a9f: 0x000a, 0x3aa0: 0x000a, 0x3aa1: 0x000a, 0x3aa2: 0x000a, 0x3aa3: 0x000a, + 0x3aa4: 0x000a, 0x3aa5: 0x000a, 0x3aa6: 0x000a, 0x3aa7: 0x000a, 0x3aa8: 0x000a, 0x3aa9: 0x000a, + 0x3aaa: 0x000a, 0x3aab: 0x000a, 0x3aac: 0x000a, 0x3aad: 0x000a, 0x3aae: 0x000a, 0x3aaf: 0x000a, + 0x3ab0: 0x000a, 0x3ab1: 0x000a, 0x3ab2: 0x000a, 0x3ab3: 0x000a, 0x3ab4: 0x000a, 0x3ab5: 0x000a, + 0x3ab6: 0x000a, 0x3ab7: 0x000a, 0x3ab8: 0x000a, 0x3ab9: 0x000a, 0x3aba: 0x000a, 0x3abb: 0x000a, + 0x3abc: 0x000a, 0x3abd: 0x000a, 0x3abe: 0x000a, 0x3abf: 0x000a, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x000a, 0x3ac1: 0x000a, 0x3ac2: 0x000a, 0x3ac3: 0x000a, 0x3ac4: 0x000a, 0x3ac5: 0x000a, + 0x3ac6: 0x000a, 0x3ac7: 0x000a, 0x3ac8: 0x000a, 0x3ac9: 0x000a, 0x3aca: 0x000a, 0x3acb: 0x000a, + 0x3acc: 0x000a, 0x3acd: 0x000a, 0x3ace: 0x000a, 0x3acf: 0x000a, 0x3ad0: 0x000a, 0x3ad1: 0x000a, + 0x3ad2: 0x000a, 0x3ad3: 0x000a, + 0x3ae0: 0x000a, 0x3ae1: 0x000a, 0x3ae2: 0x000a, 0x3ae3: 0x000a, + 0x3ae4: 0x000a, 0x3ae5: 0x000a, 0x3ae6: 0x000a, 0x3ae7: 0x000a, 0x3ae8: 0x000a, 0x3ae9: 0x000a, + 0x3aea: 0x000a, 0x3aeb: 0x000a, 0x3aec: 0x000a, 0x3aed: 0x000a, + 0x3af0: 0x000a, 0x3af1: 0x000a, 0x3af2: 0x000a, 0x3af3: 0x000a, + 0x3af8: 0x000a, 0x3af9: 0x000a, 0x3afa: 0x000a, + // Block 0xec, offset 0x3b00 + 0x3b00: 0x000a, 0x3b01: 0x000a, 0x3b02: 0x000a, + 0x3b10: 0x000a, 0x3b11: 0x000a, + 0x3b12: 0x000a, 0x3b13: 0x000a, 0x3b14: 0x000a, 0x3b15: 0x000a, + // Block 0xed, offset 0x3b40 + 0x3b7e: 0x000b, 0x3b7f: 0x000b, + // Block 0xee, offset 0x3b80 + 0x3b80: 0x000b, 0x3b81: 0x000b, 0x3b82: 0x000b, 0x3b83: 0x000b, 0x3b84: 0x000b, 0x3b85: 0x000b, + 0x3b86: 0x000b, 0x3b87: 0x000b, 0x3b88: 0x000b, 0x3b89: 0x000b, 0x3b8a: 0x000b, 0x3b8b: 0x000b, + 0x3b8c: 0x000b, 0x3b8d: 0x000b, 0x3b8e: 0x000b, 0x3b8f: 0x000b, 0x3b90: 0x000b, 0x3b91: 0x000b, + 0x3b92: 0x000b, 0x3b93: 0x000b, 0x3b94: 0x000b, 0x3b95: 0x000b, 0x3b96: 0x000b, 0x3b97: 0x000b, + 0x3b98: 0x000b, 0x3b99: 0x000b, 0x3b9a: 0x000b, 0x3b9b: 0x000b, 0x3b9c: 0x000b, 0x3b9d: 0x000b, + 0x3b9e: 0x000b, 0x3b9f: 0x000b, 0x3ba0: 0x000b, 0x3ba1: 0x000b, 0x3ba2: 0x000b, 0x3ba3: 0x000b, + 0x3ba4: 0x000b, 0x3ba5: 0x000b, 0x3ba6: 0x000b, 0x3ba7: 0x000b, 0x3ba8: 0x000b, 0x3ba9: 0x000b, + 0x3baa: 0x000b, 0x3bab: 0x000b, 0x3bac: 0x000b, 0x3bad: 0x000b, 0x3bae: 0x000b, 0x3baf: 0x000b, + 0x3bb0: 0x000b, 0x3bb1: 0x000b, 0x3bb2: 0x000b, 0x3bb3: 0x000b, 0x3bb4: 0x000b, 0x3bb5: 0x000b, + 0x3bb6: 0x000b, 0x3bb7: 0x000b, 0x3bb8: 0x000b, 0x3bb9: 0x000b, 0x3bba: 0x000b, 0x3bbb: 0x000b, + 0x3bbc: 0x000b, 0x3bbd: 0x000b, 0x3bbe: 0x000b, 0x3bbf: 0x000b, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0x000c, 0x3bc1: 0x000c, 0x3bc2: 0x000c, 0x3bc3: 0x000c, 0x3bc4: 0x000c, 0x3bc5: 0x000c, + 0x3bc6: 0x000c, 0x3bc7: 0x000c, 0x3bc8: 0x000c, 0x3bc9: 0x000c, 0x3bca: 0x000c, 0x3bcb: 0x000c, + 0x3bcc: 0x000c, 0x3bcd: 0x000c, 0x3bce: 0x000c, 0x3bcf: 0x000c, 0x3bd0: 0x000c, 0x3bd1: 0x000c, + 0x3bd2: 0x000c, 0x3bd3: 0x000c, 0x3bd4: 0x000c, 0x3bd5: 0x000c, 0x3bd6: 0x000c, 0x3bd7: 0x000c, + 0x3bd8: 0x000c, 0x3bd9: 0x000c, 0x3bda: 0x000c, 0x3bdb: 0x000c, 0x3bdc: 0x000c, 0x3bdd: 0x000c, + 0x3bde: 0x000c, 0x3bdf: 0x000c, 0x3be0: 0x000c, 0x3be1: 0x000c, 0x3be2: 0x000c, 0x3be3: 0x000c, + 0x3be4: 0x000c, 0x3be5: 0x000c, 0x3be6: 0x000c, 0x3be7: 0x000c, 0x3be8: 0x000c, 0x3be9: 0x000c, + 0x3bea: 0x000c, 0x3beb: 0x000c, 0x3bec: 0x000c, 0x3bed: 0x000c, 0x3bee: 0x000c, 0x3bef: 0x000c, + 0x3bf0: 0x000b, 0x3bf1: 0x000b, 0x3bf2: 0x000b, 0x3bf3: 0x000b, 0x3bf4: 0x000b, 0x3bf5: 0x000b, + 0x3bf6: 0x000b, 0x3bf7: 0x000b, 0x3bf8: 0x000b, 0x3bf9: 0x000b, 0x3bfa: 0x000b, 0x3bfb: 0x000b, + 0x3bfc: 0x000b, 0x3bfd: 0x000b, 0x3bfe: 0x000b, 0x3bff: 0x000b, +} + +// bidiIndex: 24 blocks, 1536 entries, 1536 bytes +// Block 0 is the zero block. +var bidiIndex = [1536]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, + 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, + 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, + 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, + 0xea: 0x07, 0xef: 0x08, + 0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15, + // Block 0x4, offset 0x100 + 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, + 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, + 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28, + 0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30, + // Block 0x5, offset 0x140 + 0x140: 0x31, 0x141: 0x32, 0x142: 0x33, + 0x14d: 0x34, 0x14e: 0x35, + 0x150: 0x36, + 0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b, + 0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40, + 0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47, + 0x170: 0x48, 0x173: 0x49, 0x177: 0x4a, + 0x17e: 0x4b, 0x17f: 0x4c, + // Block 0x6, offset 0x180 + 0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54, + 0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x54, + 0x190: 0x59, 0x191: 0x5a, 0x192: 0x5b, 0x193: 0x5c, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54, + 0x198: 0x54, 0x199: 0x54, 0x19a: 0x5d, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5e, 0x19e: 0x54, 0x19f: 0x5f, + 0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x60, 0x1a7: 0x61, + 0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x62, 0x1ae: 0x63, 0x1af: 0x54, + 0x1b3: 0x64, 0x1b5: 0x65, 0x1b7: 0x66, + 0x1b8: 0x67, 0x1b9: 0x68, 0x1ba: 0x69, 0x1bb: 0x6a, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6b, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x6c, 0x1c2: 0x6d, 0x1c3: 0x6e, 0x1c7: 0x6f, + 0x1c8: 0x70, 0x1c9: 0x71, 0x1ca: 0x72, 0x1cb: 0x73, 0x1cd: 0x74, 0x1cf: 0x75, + // Block 0x8, offset 0x200 + 0x237: 0x54, + // Block 0x9, offset 0x240 + 0x252: 0x76, 0x253: 0x77, + 0x258: 0x78, 0x259: 0x79, 0x25a: 0x7a, 0x25b: 0x7b, 0x25c: 0x7c, 0x25e: 0x7d, + 0x260: 0x7e, 0x261: 0x7f, 0x263: 0x80, 0x264: 0x81, 0x265: 0x82, 0x266: 0x83, 0x267: 0x84, + 0x268: 0x85, 0x269: 0x86, 0x26a: 0x87, 0x26b: 0x88, 0x26f: 0x89, + // Block 0xa, offset 0x280 + 0x2ac: 0x8a, 0x2ad: 0x8b, 0x2ae: 0x0e, 0x2af: 0x0e, + 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8c, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8d, + 0x2b8: 0x8e, 0x2b9: 0x8f, 0x2ba: 0x0e, 0x2bb: 0x90, 0x2bc: 0x91, 0x2bd: 0x92, 0x2bf: 0x93, + // Block 0xb, offset 0x2c0 + 0x2c4: 0x94, 0x2c5: 0x54, 0x2c6: 0x95, 0x2c7: 0x96, + 0x2cb: 0x97, 0x2cd: 0x98, + 0x2e0: 0x99, 0x2e1: 0x99, 0x2e2: 0x99, 0x2e3: 0x99, 0x2e4: 0x9a, 0x2e5: 0x99, 0x2e6: 0x99, 0x2e7: 0x99, + 0x2e8: 0x9b, 0x2e9: 0x99, 0x2ea: 0x99, 0x2eb: 0x9c, 0x2ec: 0x9d, 0x2ed: 0x99, 0x2ee: 0x99, 0x2ef: 0x99, + 0x2f0: 0x99, 0x2f1: 0x99, 0x2f2: 0x99, 0x2f3: 0x99, 0x2f4: 0x9e, 0x2f5: 0x99, 0x2f6: 0x99, 0x2f7: 0x99, + 0x2f8: 0x99, 0x2f9: 0x9f, 0x2fa: 0x99, 0x2fb: 0x99, 0x2fc: 0xa0, 0x2fd: 0xa1, 0x2fe: 0x99, 0x2ff: 0x99, + // Block 0xc, offset 0x300 + 0x300: 0xa2, 0x301: 0xa3, 0x302: 0xa4, 0x304: 0xa5, 0x305: 0xa6, 0x306: 0xa7, 0x307: 0xa8, + 0x308: 0xa9, 0x30b: 0xaa, 0x30c: 0x26, 0x30d: 0xab, + 0x310: 0xac, 0x311: 0xad, 0x312: 0xae, 0x313: 0xaf, 0x316: 0xb0, 0x317: 0xb1, + 0x318: 0xb2, 0x319: 0xb3, 0x31a: 0xb4, 0x31c: 0xb5, + 0x320: 0xb6, 0x327: 0xb7, + 0x328: 0xb8, 0x329: 0xb9, 0x32a: 0xba, + 0x330: 0xbb, 0x332: 0xbc, 0x334: 0xbd, 0x335: 0xbe, 0x336: 0xbf, + 0x33b: 0xc0, 0x33f: 0xc1, + // Block 0xd, offset 0x340 + 0x36b: 0xc2, 0x36c: 0xc3, + 0x37d: 0xc4, 0x37e: 0xc5, 0x37f: 0xc6, + // Block 0xe, offset 0x380 + 0x3b2: 0xc7, + // Block 0xf, offset 0x3c0 + 0x3c5: 0xc8, 0x3c6: 0xc9, + 0x3c8: 0x54, 0x3c9: 0xca, 0x3cc: 0x54, 0x3cd: 0xcb, + 0x3db: 0xcc, 0x3dc: 0xcd, 0x3dd: 0xce, 0x3de: 0xcf, 0x3df: 0xd0, + 0x3e8: 0xd1, 0x3e9: 0xd2, 0x3ea: 0xd3, + // Block 0x10, offset 0x400 + 0x400: 0xd4, 0x404: 0xc3, + 0x40b: 0xd5, + 0x420: 0x99, 0x421: 0x99, 0x422: 0x99, 0x423: 0xd6, 0x424: 0x99, 0x425: 0xd7, 0x426: 0x99, 0x427: 0x99, + 0x428: 0x99, 0x429: 0x99, 0x42a: 0x99, 0x42b: 0x99, 0x42c: 0x99, 0x42d: 0x99, 0x42e: 0x99, 0x42f: 0x99, + 0x430: 0x99, 0x431: 0xa0, 0x432: 0x0e, 0x433: 0x99, 0x434: 0x0e, 0x435: 0xd8, 0x436: 0x99, 0x437: 0x99, + 0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xd9, 0x43c: 0x99, 0x43d: 0x99, 0x43e: 0x99, 0x43f: 0x99, + // Block 0x11, offset 0x440 + 0x440: 0xda, 0x441: 0x54, 0x442: 0xdb, 0x443: 0xdc, 0x444: 0xdd, 0x445: 0xde, + 0x449: 0xdf, 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54, + 0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54, + 0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xe0, 0x45c: 0x54, 0x45d: 0x6a, 0x45e: 0x54, 0x45f: 0xe1, + 0x460: 0xe2, 0x461: 0xe3, 0x462: 0xe4, 0x464: 0xe5, 0x465: 0xe6, 0x466: 0xe7, 0x467: 0xe8, + 0x468: 0x54, 0x469: 0xe9, 0x46a: 0xea, + 0x47f: 0xeb, + // Block 0x12, offset 0x480 + 0x4bf: 0xeb, + // Block 0x13, offset 0x4c0 + 0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b, + 0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f, + 0x4ef: 0x10, + 0x4ff: 0x10, + // Block 0x14, offset 0x500 + 0x50f: 0x10, + 0x51f: 0x10, + 0x52f: 0x10, + 0x53f: 0x10, + // Block 0x15, offset 0x540 + 0x540: 0xec, 0x541: 0xec, 0x542: 0xec, 0x543: 0xec, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xed, + 0x548: 0xec, 0x549: 0xec, 0x54a: 0xec, 0x54b: 0xec, 0x54c: 0xec, 0x54d: 0xec, 0x54e: 0xec, 0x54f: 0xec, + 0x550: 0xec, 0x551: 0xec, 0x552: 0xec, 0x553: 0xec, 0x554: 0xec, 0x555: 0xec, 0x556: 0xec, 0x557: 0xec, + 0x558: 0xec, 0x559: 0xec, 0x55a: 0xec, 0x55b: 0xec, 0x55c: 0xec, 0x55d: 0xec, 0x55e: 0xec, 0x55f: 0xec, + 0x560: 0xec, 0x561: 0xec, 0x562: 0xec, 0x563: 0xec, 0x564: 0xec, 0x565: 0xec, 0x566: 0xec, 0x567: 0xec, + 0x568: 0xec, 0x569: 0xec, 0x56a: 0xec, 0x56b: 0xec, 0x56c: 0xec, 0x56d: 0xec, 0x56e: 0xec, 0x56f: 0xec, + 0x570: 0xec, 0x571: 0xec, 0x572: 0xec, 0x573: 0xec, 0x574: 0xec, 0x575: 0xec, 0x576: 0xec, 0x577: 0xec, + 0x578: 0xec, 0x579: 0xec, 0x57a: 0xec, 0x57b: 0xec, 0x57c: 0xec, 0x57d: 0xec, 0x57e: 0xec, 0x57f: 0xec, + // Block 0x16, offset 0x580 + 0x58f: 0x10, + 0x59f: 0x10, + 0x5a0: 0x13, + 0x5af: 0x10, + 0x5bf: 0x10, + // Block 0x17, offset 0x5c0 + 0x5cf: 0x10, +} + +// Total table size 16952 bytes (16KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go new file mode 100644 index 00000000..0ca0193e --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go @@ -0,0 +1,1781 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// +build !go1.10 + +package bidi + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "9.0.0" + +// xorMasks contains masks to be xor-ed with brackets to get the reverse +// version. +var xorMasks = []int32{ // 8 elements + 0, 1, 6, 7, 3, 15, 29, 63, +} // Size: 56 bytes + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// bidiTrie. Total size: 15744 bytes (15.38 KiB). Checksum: b4c3b70954803b86. +type bidiTrie struct{} + +func newBidiTrie(i int) *bidiTrie { + return &bidiTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(bidiValues[n<<6+uint32(b)]) + } +} + +// bidiValues: 222 blocks, 14208 entries, 14208 bytes +// The third block is the zero block. +var bidiValues = [14208]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, + 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, + 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, + 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, + 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, + 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, + 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, + 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, + 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, + 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, + 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, + // Block 0x1, offset 0x40 + 0x40: 0x000a, + 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, + 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, + 0x7b: 0x005a, + 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, + 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, + 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, + 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, + 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, + 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, + 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, + 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, + 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, + 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, + 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, + // Block 0x4, offset 0x100 + 0x117: 0x000a, + 0x137: 0x000a, + // Block 0x5, offset 0x140 + 0x179: 0x000a, 0x17a: 0x000a, + // Block 0x6, offset 0x180 + 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, + 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, + 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, + 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, + 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, + 0x19e: 0x000a, 0x19f: 0x000a, + 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, + 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, + 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, + 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, + 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, + 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, + 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, + 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, + 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, + 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, + 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, + 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, + 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, + 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, + 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, + // Block 0x8, offset 0x200 + 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, + 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, + 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, + 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, + 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, + 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, + 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, + 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, + 0x234: 0x000a, 0x235: 0x000a, + 0x23e: 0x000a, + // Block 0x9, offset 0x240 + 0x244: 0x000a, 0x245: 0x000a, + 0x247: 0x000a, + // Block 0xa, offset 0x280 + 0x2b6: 0x000a, + // Block 0xb, offset 0x2c0 + 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, + 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, + // Block 0xc, offset 0x300 + 0x30a: 0x000a, + 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, + 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, + 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, + 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, + 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, + 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, + 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, + 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, + 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, + // Block 0xd, offset 0x340 + 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, + 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, + 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, + 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, + 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, + 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, + 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, + 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, + 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, + 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, + 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, + // Block 0xe, offset 0x380 + 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, + 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, + 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, + 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, + 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, + 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, + 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, + 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, + 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, + 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, + 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, + 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, + 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, + 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, + 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, + 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, + 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, + 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, + 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, + 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, + 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, + // Block 0x10, offset 0x400 + 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, + 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, + 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, + 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, + 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, + 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, + 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, + 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, + 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, + 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, + 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, + // Block 0x11, offset 0x440 + 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, + 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, + 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, + 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, + 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, + 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, + 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, + 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, + 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, + 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, + 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, + // Block 0x12, offset 0x480 + 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, + 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, + 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, + 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, + 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, + 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, + 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, + 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, + 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, + 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, + 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, + 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, + 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, + 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, + 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, + 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, + 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, + 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, + 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, + 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, + 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, + // Block 0x14, offset 0x500 + 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, + 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, + 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, + 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, + 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, + 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, + 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, + 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, + 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, + 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, + 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, + // Block 0x15, offset 0x540 + 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, + 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, + 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, + 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, + 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, + 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, + 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, + 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, + 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, + 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, + 0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001, + // Block 0x16, offset 0x580 + 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, + 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, + 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, + 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, + 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, + 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, + 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, + 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, + 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, + 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, + 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, + 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, + 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, + 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, + 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, + 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x0001, 0x5e1: 0x0001, 0x5e2: 0x0001, 0x5e3: 0x0001, + 0x5e4: 0x0001, 0x5e5: 0x0001, 0x5e6: 0x0001, 0x5e7: 0x0001, 0x5e8: 0x0001, 0x5e9: 0x0001, + 0x5ea: 0x0001, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001, + 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001, + 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001, + 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001, + // Block 0x18, offset 0x600 + 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001, + 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001, + 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001, + 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, + 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001, + 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, + 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, + 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, + 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, + 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, + 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, + // Block 0x19, offset 0x640 + 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, + 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d, + 0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d, + 0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, + 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, + 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, + 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, + 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, + 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, + 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, + 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, + // Block 0x1a, offset 0x680 + 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, + 0x6ba: 0x000c, + 0x6bc: 0x000c, + // Block 0x1b, offset 0x6c0 + 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, + 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, + 0x6cd: 0x000c, 0x6d1: 0x000c, + 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, + 0x6e2: 0x000c, 0x6e3: 0x000c, + // Block 0x1c, offset 0x700 + 0x701: 0x000c, + 0x73c: 0x000c, + // Block 0x1d, offset 0x740 + 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, + 0x74d: 0x000c, + 0x762: 0x000c, 0x763: 0x000c, + 0x772: 0x0004, 0x773: 0x0004, + 0x77b: 0x0004, + // Block 0x1e, offset 0x780 + 0x781: 0x000c, 0x782: 0x000c, + 0x7bc: 0x000c, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x000c, 0x7c2: 0x000c, + 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, + 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, + 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, + // Block 0x20, offset 0x800 + 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, + 0x807: 0x000c, 0x808: 0x000c, + 0x80d: 0x000c, + 0x822: 0x000c, 0x823: 0x000c, + 0x831: 0x0004, + // Block 0x21, offset 0x840 + 0x841: 0x000c, + 0x87c: 0x000c, 0x87f: 0x000c, + // Block 0x22, offset 0x880 + 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, + 0x88d: 0x000c, + 0x896: 0x000c, + 0x8a2: 0x000c, 0x8a3: 0x000c, + // Block 0x23, offset 0x8c0 + 0x8c2: 0x000c, + // Block 0x24, offset 0x900 + 0x900: 0x000c, + 0x90d: 0x000c, + 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, + 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, + // Block 0x25, offset 0x940 + 0x940: 0x000c, + 0x97e: 0x000c, 0x97f: 0x000c, + // Block 0x26, offset 0x980 + 0x980: 0x000c, + 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, + 0x98c: 0x000c, 0x98d: 0x000c, + 0x995: 0x000c, 0x996: 0x000c, + 0x9a2: 0x000c, 0x9a3: 0x000c, + 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, + 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, + // Block 0x27, offset 0x9c0 + 0x9cc: 0x000c, 0x9cd: 0x000c, + 0x9e2: 0x000c, 0x9e3: 0x000c, + // Block 0x28, offset 0xa00 + 0xa01: 0x000c, + // Block 0x29, offset 0xa40 + 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, + 0xa4d: 0x000c, + 0xa62: 0x000c, 0xa63: 0x000c, + // Block 0x2a, offset 0xa80 + 0xa8a: 0x000c, + 0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c, + // Block 0x2b, offset 0xac0 + 0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c, + 0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c, + 0xaff: 0x0004, + // Block 0x2c, offset 0xb00 + 0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c, + 0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c, + // Block 0x2d, offset 0xb40 + 0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c, + 0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c, + 0xb7c: 0x000c, + // Block 0x2e, offset 0xb80 + 0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c, + 0xb8c: 0x000c, 0xb8d: 0x000c, + // Block 0x2f, offset 0xbc0 + 0xbd8: 0x000c, 0xbd9: 0x000c, + 0xbf5: 0x000c, + 0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a, + 0xbfc: 0x003a, 0xbfd: 0x002a, + // Block 0x30, offset 0xc00 + 0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c, + 0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c, + 0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c, + // Block 0x31, offset 0xc40 + 0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c, + 0xc46: 0x000c, 0xc47: 0x000c, + 0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c, + 0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c, + 0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c, + 0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c, + 0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c, + 0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c, + 0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, + 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, + 0xc7c: 0x000c, + // Block 0x32, offset 0xc80 + 0xc86: 0x000c, + // Block 0x33, offset 0xcc0 + 0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c, + 0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c, + 0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c, + 0xcfd: 0x000c, 0xcfe: 0x000c, + // Block 0x34, offset 0xd00 + 0xd18: 0x000c, 0xd19: 0x000c, + 0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c, + 0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, + // Block 0x35, offset 0xd40 + 0xd42: 0x000c, 0xd45: 0x000c, + 0xd46: 0x000c, + 0xd4d: 0x000c, + 0xd5d: 0x000c, + // Block 0x36, offset 0xd80 + 0xd9d: 0x000c, + 0xd9e: 0x000c, 0xd9f: 0x000c, + // Block 0x37, offset 0xdc0 + 0xdd0: 0x000a, 0xdd1: 0x000a, + 0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a, + 0xdd8: 0x000a, 0xdd9: 0x000a, + // Block 0x38, offset 0xe00 + 0xe00: 0x000a, + // Block 0x39, offset 0xe40 + 0xe40: 0x0009, + 0xe5b: 0x007a, 0xe5c: 0x006a, + // Block 0x3a, offset 0xe80 + 0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c, + 0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c, + // Block 0x3b, offset 0xec0 + 0xed2: 0x000c, 0xed3: 0x000c, + 0xef2: 0x000c, 0xef3: 0x000c, + // Block 0x3c, offset 0xf00 + 0xf34: 0x000c, 0xf35: 0x000c, + 0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c, + 0xf3c: 0x000c, 0xf3d: 0x000c, + // Block 0x3d, offset 0xf40 + 0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c, + 0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c, + 0xf52: 0x000c, 0xf53: 0x000c, + 0xf5b: 0x0004, 0xf5d: 0x000c, + 0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a, + 0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a, + // Block 0x3e, offset 0xf80 + 0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a, + 0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c, + 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b, + // Block 0x3f, offset 0xfc0 + 0xfc5: 0x000c, + 0xfc6: 0x000c, + 0xfe9: 0x000c, + // Block 0x40, offset 0x1000 + 0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c, + 0x1027: 0x000c, 0x1028: 0x000c, + 0x1032: 0x000c, + 0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c, + // Block 0x41, offset 0x1040 + 0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a, + // Block 0x42, offset 0x1080 + 0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a, + 0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a, + 0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a, + 0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a, + 0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a, + 0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a, + // Block 0x43, offset 0x10c0 + 0x10d7: 0x000c, + 0x10d8: 0x000c, 0x10db: 0x000c, + // Block 0x44, offset 0x1100 + 0x1116: 0x000c, + 0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c, + 0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c, + 0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c, + 0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c, + 0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c, + 0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c, + 0x113c: 0x000c, 0x113f: 0x000c, + // Block 0x45, offset 0x1140 + 0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, + 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, + 0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c, + // Block 0x46, offset 0x1180 + 0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c, + 0x11b4: 0x000c, + 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, + 0x11bc: 0x000c, + // Block 0x47, offset 0x11c0 + 0x11c2: 0x000c, + 0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c, + 0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c, + // Block 0x48, offset 0x1200 + 0x1200: 0x000c, 0x1201: 0x000c, + 0x1222: 0x000c, 0x1223: 0x000c, + 0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c, + 0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c, + // Block 0x49, offset 0x1240 + 0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c, + 0x126d: 0x000c, 0x126f: 0x000c, + 0x1270: 0x000c, 0x1271: 0x000c, + // Block 0x4a, offset 0x1280 + 0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c, + 0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c, + 0x12b6: 0x000c, 0x12b7: 0x000c, + // Block 0x4b, offset 0x12c0 + 0x12d0: 0x000c, 0x12d1: 0x000c, + 0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c, + 0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c, + 0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c, + 0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c, + 0x12ed: 0x000c, + 0x12f4: 0x000c, + 0x12f8: 0x000c, 0x12f9: 0x000c, + // Block 0x4c, offset 0x1300 + 0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c, + 0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c, + 0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c, + 0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c, + 0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c, + 0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c, + 0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c, + 0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, + 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c, + 0x133b: 0x000c, + 0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c, + // Block 0x4d, offset 0x1340 + 0x137d: 0x000a, 0x137f: 0x000a, + // Block 0x4e, offset 0x1380 + 0x1380: 0x000a, 0x1381: 0x000a, + 0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a, + 0x139d: 0x000a, + 0x139e: 0x000a, 0x139f: 0x000a, + 0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a, + 0x13bd: 0x000a, 0x13be: 0x000a, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009, + 0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b, + 0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a, + 0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a, + 0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a, + 0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a, + 0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007, + 0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006, + 0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a, + 0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a, + 0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a, + // Block 0x50, offset 0x1400 + 0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a, + 0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a, + 0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a, + 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, + 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, + 0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b, + 0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e, + 0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b, + 0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002, + 0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003, + 0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a, + // Block 0x51, offset 0x1440 + 0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002, + 0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003, + 0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a, + 0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004, + 0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004, + 0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004, + 0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004, + 0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004, + 0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004, + // Block 0x52, offset 0x1480 + 0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004, + 0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004, + 0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c, + 0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c, + 0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c, + 0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c, + 0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c, + 0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c, + 0x14b0: 0x000c, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a, + 0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a, + 0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a, + 0x14d8: 0x000a, + 0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a, + 0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a, + 0x14ee: 0x0004, + 0x14fa: 0x000a, 0x14fb: 0x000a, + // Block 0x54, offset 0x1500 + 0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, + 0x150a: 0x000a, 0x150b: 0x000a, + 0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a, + 0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, + 0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a, + 0x151e: 0x000a, 0x151f: 0x000a, + // Block 0x55, offset 0x1540 + 0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a, + 0x1550: 0x000a, 0x1551: 0x000a, + 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, + 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, + 0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a, + 0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a, + 0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a, + 0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a, + 0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a, + 0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a, + // Block 0x56, offset 0x1580 + 0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a, + 0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, + 0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a, + 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, + 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, + 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, + 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, + 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, + 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, + 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, + 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, + 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, + 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, + 0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, + 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, + 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, + 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, + 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, + 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, + 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, + 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, + // Block 0x58, offset 0x1600 + 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, + 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a, + 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, + 0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, + 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, + 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, + 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a, + 0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, + 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, + // Block 0x59, offset 0x1640 + 0x167b: 0x000a, + 0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a, + // Block 0x5a, offset 0x1680 + 0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a, + 0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a, + 0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a, + 0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a, + 0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a, + 0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a, + 0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a, + 0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a, + 0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a, + 0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a, + 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, + 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, + 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, + 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, + 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, + 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, + 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a, + 0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a, + 0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a, + 0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a, + 0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a, + // Block 0x5c, offset 0x1700 + 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, + 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a, + 0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a, + 0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a, + 0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a, + 0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, + 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, + // Block 0x5d, offset 0x1740 + 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, + 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a, + 0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a, + 0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a, + 0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a, + 0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a, + 0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a, + 0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a, + // Block 0x5e, offset 0x1780 + 0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a, + 0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002, + 0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002, + 0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002, + 0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002, + // Block 0x5f, offset 0x17c0 + 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, + 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, + 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, + 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, + // Block 0x60, offset 0x1800 + 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, + 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, + 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, + 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, + 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, + 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, + 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a, + 0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a, + 0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a, + 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, + 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, + // Block 0x61, offset 0x1840 + 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a, + 0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, + 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, + 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, + 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, + 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, + 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a, + 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, + 0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a, + 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, + 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, + // Block 0x62, offset 0x1880 + 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a, + 0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a, + 0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a, + 0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a, + 0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, + 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, + 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a, + 0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a, + 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, + 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, + 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a, + 0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a, + 0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a, + 0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba, + 0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a, + 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, + 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, + 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, + 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, + 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, + 0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a, + // Block 0x64, offset 0x1900 + 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, + 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, + 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, + 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, + 0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a, + 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, + 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, + 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, + 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a, + 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, + 0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a, + // Block 0x65, offset 0x1940 + 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, + 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, + 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, + 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a, + 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, + 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, + 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, + 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, + 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, + 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, + 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, + // Block 0x66, offset 0x1980 + 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, + 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, + 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, + 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, + 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a, + 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a, + 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, + 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, + 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a, + 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, + 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x000a, 0x19c1: 0x000a, 0x19c2: 0x000a, 0x19c3: 0x000a, 0x19c4: 0x000a, 0x19c5: 0x000a, + 0x19c6: 0x000a, 0x19c7: 0x000a, 0x19c8: 0x000a, 0x19ca: 0x000a, 0x19cb: 0x000a, + 0x19cc: 0x000a, 0x19cd: 0x000a, 0x19ce: 0x000a, 0x19cf: 0x000a, 0x19d0: 0x000a, 0x19d1: 0x000a, + 0x19ec: 0x000a, 0x19ed: 0x000a, 0x19ee: 0x000a, 0x19ef: 0x000a, + // Block 0x68, offset 0x1a00 + 0x1a25: 0x000a, 0x1a26: 0x000a, 0x1a27: 0x000a, 0x1a28: 0x000a, 0x1a29: 0x000a, + 0x1a2a: 0x000a, 0x1a2f: 0x000c, + 0x1a30: 0x000c, 0x1a31: 0x000c, + 0x1a39: 0x000a, 0x1a3a: 0x000a, 0x1a3b: 0x000a, + 0x1a3c: 0x000a, 0x1a3d: 0x000a, 0x1a3e: 0x000a, 0x1a3f: 0x000a, + // Block 0x69, offset 0x1a40 + 0x1a7f: 0x000c, + // Block 0x6a, offset 0x1a80 + 0x1aa0: 0x000c, 0x1aa1: 0x000c, 0x1aa2: 0x000c, 0x1aa3: 0x000c, + 0x1aa4: 0x000c, 0x1aa5: 0x000c, 0x1aa6: 0x000c, 0x1aa7: 0x000c, 0x1aa8: 0x000c, 0x1aa9: 0x000c, + 0x1aaa: 0x000c, 0x1aab: 0x000c, 0x1aac: 0x000c, 0x1aad: 0x000c, 0x1aae: 0x000c, 0x1aaf: 0x000c, + 0x1ab0: 0x000c, 0x1ab1: 0x000c, 0x1ab2: 0x000c, 0x1ab3: 0x000c, 0x1ab4: 0x000c, 0x1ab5: 0x000c, + 0x1ab6: 0x000c, 0x1ab7: 0x000c, 0x1ab8: 0x000c, 0x1ab9: 0x000c, 0x1aba: 0x000c, 0x1abb: 0x000c, + 0x1abc: 0x000c, 0x1abd: 0x000c, 0x1abe: 0x000c, 0x1abf: 0x000c, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, + 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, + 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a, + 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x000a, 0x1ad6: 0x000a, 0x1ad7: 0x000a, + 0x1ad8: 0x000a, 0x1ad9: 0x000a, 0x1ada: 0x000a, 0x1adb: 0x000a, 0x1adc: 0x000a, 0x1add: 0x000a, + 0x1ade: 0x000a, 0x1adf: 0x000a, 0x1ae0: 0x000a, 0x1ae1: 0x000a, 0x1ae2: 0x003a, 0x1ae3: 0x002a, + 0x1ae4: 0x003a, 0x1ae5: 0x002a, 0x1ae6: 0x003a, 0x1ae7: 0x002a, 0x1ae8: 0x003a, 0x1ae9: 0x002a, + 0x1aea: 0x000a, 0x1aeb: 0x000a, 0x1aec: 0x000a, 0x1aed: 0x000a, 0x1aee: 0x000a, 0x1aef: 0x000a, + 0x1af0: 0x000a, 0x1af1: 0x000a, 0x1af2: 0x000a, 0x1af3: 0x000a, 0x1af4: 0x000a, 0x1af5: 0x000a, + 0x1af6: 0x000a, 0x1af7: 0x000a, 0x1af8: 0x000a, 0x1af9: 0x000a, 0x1afa: 0x000a, 0x1afb: 0x000a, + 0x1afc: 0x000a, 0x1afd: 0x000a, 0x1afe: 0x000a, 0x1aff: 0x000a, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, + 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, + 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, + 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, + 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, + 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, + 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, + 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, + 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, 0x1b74: 0x000a, 0x1b75: 0x000a, + 0x1b76: 0x000a, 0x1b77: 0x000a, 0x1b78: 0x000a, 0x1b79: 0x000a, 0x1b7a: 0x000a, 0x1b7b: 0x000a, + 0x1b7c: 0x000a, 0x1b7d: 0x000a, 0x1b7e: 0x000a, 0x1b7f: 0x000a, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, + 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, + 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, + 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, 0x1b96: 0x000a, 0x1b97: 0x000a, + 0x1b98: 0x000a, 0x1b99: 0x000a, 0x1b9a: 0x000a, 0x1b9b: 0x000a, 0x1b9c: 0x000a, 0x1b9d: 0x000a, + 0x1b9e: 0x000a, 0x1b9f: 0x000a, 0x1ba0: 0x000a, 0x1ba1: 0x000a, 0x1ba2: 0x000a, 0x1ba3: 0x000a, + 0x1ba4: 0x000a, 0x1ba5: 0x000a, 0x1ba6: 0x000a, 0x1ba7: 0x000a, 0x1ba8: 0x000a, 0x1ba9: 0x000a, + 0x1baa: 0x000a, 0x1bab: 0x000a, 0x1bac: 0x000a, 0x1bad: 0x000a, 0x1bae: 0x000a, 0x1baf: 0x000a, + 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x000a, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, 0x1bc5: 0x000a, + 0x1bc6: 0x000a, 0x1bc7: 0x000a, 0x1bc8: 0x000a, 0x1bc9: 0x000a, 0x1bca: 0x000a, 0x1bcb: 0x000a, + 0x1bcc: 0x000a, 0x1bcd: 0x000a, 0x1bce: 0x000a, 0x1bcf: 0x000a, 0x1bd0: 0x000a, 0x1bd1: 0x000a, + 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x000a, 0x1bd5: 0x000a, + 0x1bf0: 0x000a, 0x1bf1: 0x000a, 0x1bf2: 0x000a, 0x1bf3: 0x000a, 0x1bf4: 0x000a, 0x1bf5: 0x000a, + 0x1bf6: 0x000a, 0x1bf7: 0x000a, 0x1bf8: 0x000a, 0x1bf9: 0x000a, 0x1bfa: 0x000a, 0x1bfb: 0x000a, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x0009, 0x1c01: 0x000a, 0x1c02: 0x000a, 0x1c03: 0x000a, 0x1c04: 0x000a, + 0x1c08: 0x003a, 0x1c09: 0x002a, 0x1c0a: 0x003a, 0x1c0b: 0x002a, + 0x1c0c: 0x003a, 0x1c0d: 0x002a, 0x1c0e: 0x003a, 0x1c0f: 0x002a, 0x1c10: 0x003a, 0x1c11: 0x002a, + 0x1c12: 0x000a, 0x1c13: 0x000a, 0x1c14: 0x003a, 0x1c15: 0x002a, 0x1c16: 0x003a, 0x1c17: 0x002a, + 0x1c18: 0x003a, 0x1c19: 0x002a, 0x1c1a: 0x003a, 0x1c1b: 0x002a, 0x1c1c: 0x000a, 0x1c1d: 0x000a, + 0x1c1e: 0x000a, 0x1c1f: 0x000a, 0x1c20: 0x000a, + 0x1c2a: 0x000c, 0x1c2b: 0x000c, 0x1c2c: 0x000c, 0x1c2d: 0x000c, + 0x1c30: 0x000a, + 0x1c36: 0x000a, 0x1c37: 0x000a, + 0x1c3d: 0x000a, 0x1c3e: 0x000a, 0x1c3f: 0x000a, + // Block 0x71, offset 0x1c40 + 0x1c59: 0x000c, 0x1c5a: 0x000c, 0x1c5b: 0x000a, 0x1c5c: 0x000a, + 0x1c60: 0x000a, + // Block 0x72, offset 0x1c80 + 0x1cbb: 0x000a, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x000a, 0x1cc1: 0x000a, 0x1cc2: 0x000a, 0x1cc3: 0x000a, 0x1cc4: 0x000a, 0x1cc5: 0x000a, + 0x1cc6: 0x000a, 0x1cc7: 0x000a, 0x1cc8: 0x000a, 0x1cc9: 0x000a, 0x1cca: 0x000a, 0x1ccb: 0x000a, + 0x1ccc: 0x000a, 0x1ccd: 0x000a, 0x1cce: 0x000a, 0x1ccf: 0x000a, 0x1cd0: 0x000a, 0x1cd1: 0x000a, + 0x1cd2: 0x000a, 0x1cd3: 0x000a, 0x1cd4: 0x000a, 0x1cd5: 0x000a, 0x1cd6: 0x000a, 0x1cd7: 0x000a, + 0x1cd8: 0x000a, 0x1cd9: 0x000a, 0x1cda: 0x000a, 0x1cdb: 0x000a, 0x1cdc: 0x000a, 0x1cdd: 0x000a, + 0x1cde: 0x000a, 0x1cdf: 0x000a, 0x1ce0: 0x000a, 0x1ce1: 0x000a, 0x1ce2: 0x000a, 0x1ce3: 0x000a, + // Block 0x74, offset 0x1d00 + 0x1d1d: 0x000a, + 0x1d1e: 0x000a, + // Block 0x75, offset 0x1d40 + 0x1d50: 0x000a, 0x1d51: 0x000a, + 0x1d52: 0x000a, 0x1d53: 0x000a, 0x1d54: 0x000a, 0x1d55: 0x000a, 0x1d56: 0x000a, 0x1d57: 0x000a, + 0x1d58: 0x000a, 0x1d59: 0x000a, 0x1d5a: 0x000a, 0x1d5b: 0x000a, 0x1d5c: 0x000a, 0x1d5d: 0x000a, + 0x1d5e: 0x000a, 0x1d5f: 0x000a, + 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, + // Block 0x76, offset 0x1d80 + 0x1db1: 0x000a, 0x1db2: 0x000a, 0x1db3: 0x000a, 0x1db4: 0x000a, 0x1db5: 0x000a, + 0x1db6: 0x000a, 0x1db7: 0x000a, 0x1db8: 0x000a, 0x1db9: 0x000a, 0x1dba: 0x000a, 0x1dbb: 0x000a, + 0x1dbc: 0x000a, 0x1dbd: 0x000a, 0x1dbe: 0x000a, 0x1dbf: 0x000a, + // Block 0x77, offset 0x1dc0 + 0x1dcc: 0x000a, 0x1dcd: 0x000a, 0x1dce: 0x000a, 0x1dcf: 0x000a, + // Block 0x78, offset 0x1e00 + 0x1e37: 0x000a, 0x1e38: 0x000a, 0x1e39: 0x000a, 0x1e3a: 0x000a, + // Block 0x79, offset 0x1e40 + 0x1e5e: 0x000a, 0x1e5f: 0x000a, + 0x1e7f: 0x000a, + // Block 0x7a, offset 0x1e80 + 0x1e90: 0x000a, 0x1e91: 0x000a, + 0x1e92: 0x000a, 0x1e93: 0x000a, 0x1e94: 0x000a, 0x1e95: 0x000a, 0x1e96: 0x000a, 0x1e97: 0x000a, + 0x1e98: 0x000a, 0x1e99: 0x000a, 0x1e9a: 0x000a, 0x1e9b: 0x000a, 0x1e9c: 0x000a, 0x1e9d: 0x000a, + 0x1e9e: 0x000a, 0x1e9f: 0x000a, 0x1ea0: 0x000a, 0x1ea1: 0x000a, 0x1ea2: 0x000a, 0x1ea3: 0x000a, + 0x1ea4: 0x000a, 0x1ea5: 0x000a, 0x1ea6: 0x000a, 0x1ea7: 0x000a, 0x1ea8: 0x000a, 0x1ea9: 0x000a, + 0x1eaa: 0x000a, 0x1eab: 0x000a, 0x1eac: 0x000a, 0x1ead: 0x000a, 0x1eae: 0x000a, 0x1eaf: 0x000a, + 0x1eb0: 0x000a, 0x1eb1: 0x000a, 0x1eb2: 0x000a, 0x1eb3: 0x000a, 0x1eb4: 0x000a, 0x1eb5: 0x000a, + 0x1eb6: 0x000a, 0x1eb7: 0x000a, 0x1eb8: 0x000a, 0x1eb9: 0x000a, 0x1eba: 0x000a, 0x1ebb: 0x000a, + 0x1ebc: 0x000a, 0x1ebd: 0x000a, 0x1ebe: 0x000a, 0x1ebf: 0x000a, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0x000a, 0x1ec1: 0x000a, 0x1ec2: 0x000a, 0x1ec3: 0x000a, 0x1ec4: 0x000a, 0x1ec5: 0x000a, + 0x1ec6: 0x000a, + // Block 0x7c, offset 0x1f00 + 0x1f0d: 0x000a, 0x1f0e: 0x000a, 0x1f0f: 0x000a, + // Block 0x7d, offset 0x1f40 + 0x1f6f: 0x000c, + 0x1f70: 0x000c, 0x1f71: 0x000c, 0x1f72: 0x000c, 0x1f73: 0x000a, 0x1f74: 0x000c, 0x1f75: 0x000c, + 0x1f76: 0x000c, 0x1f77: 0x000c, 0x1f78: 0x000c, 0x1f79: 0x000c, 0x1f7a: 0x000c, 0x1f7b: 0x000c, + 0x1f7c: 0x000c, 0x1f7d: 0x000c, 0x1f7e: 0x000a, 0x1f7f: 0x000a, + // Block 0x7e, offset 0x1f80 + 0x1f9e: 0x000c, 0x1f9f: 0x000c, + // Block 0x7f, offset 0x1fc0 + 0x1ff0: 0x000c, 0x1ff1: 0x000c, + // Block 0x80, offset 0x2000 + 0x2000: 0x000a, 0x2001: 0x000a, 0x2002: 0x000a, 0x2003: 0x000a, 0x2004: 0x000a, 0x2005: 0x000a, + 0x2006: 0x000a, 0x2007: 0x000a, 0x2008: 0x000a, 0x2009: 0x000a, 0x200a: 0x000a, 0x200b: 0x000a, + 0x200c: 0x000a, 0x200d: 0x000a, 0x200e: 0x000a, 0x200f: 0x000a, 0x2010: 0x000a, 0x2011: 0x000a, + 0x2012: 0x000a, 0x2013: 0x000a, 0x2014: 0x000a, 0x2015: 0x000a, 0x2016: 0x000a, 0x2017: 0x000a, + 0x2018: 0x000a, 0x2019: 0x000a, 0x201a: 0x000a, 0x201b: 0x000a, 0x201c: 0x000a, 0x201d: 0x000a, + 0x201e: 0x000a, 0x201f: 0x000a, 0x2020: 0x000a, 0x2021: 0x000a, + // Block 0x81, offset 0x2040 + 0x2048: 0x000a, + // Block 0x82, offset 0x2080 + 0x2082: 0x000c, + 0x2086: 0x000c, 0x208b: 0x000c, + 0x20a5: 0x000c, 0x20a6: 0x000c, 0x20a8: 0x000a, 0x20a9: 0x000a, + 0x20aa: 0x000a, 0x20ab: 0x000a, + 0x20b8: 0x0004, 0x20b9: 0x0004, + // Block 0x83, offset 0x20c0 + 0x20f4: 0x000a, 0x20f5: 0x000a, + 0x20f6: 0x000a, 0x20f7: 0x000a, + // Block 0x84, offset 0x2100 + 0x2104: 0x000c, 0x2105: 0x000c, + 0x2120: 0x000c, 0x2121: 0x000c, 0x2122: 0x000c, 0x2123: 0x000c, + 0x2124: 0x000c, 0x2125: 0x000c, 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, + 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, 0x212e: 0x000c, 0x212f: 0x000c, + 0x2130: 0x000c, 0x2131: 0x000c, + // Block 0x85, offset 0x2140 + 0x2166: 0x000c, 0x2167: 0x000c, 0x2168: 0x000c, 0x2169: 0x000c, + 0x216a: 0x000c, 0x216b: 0x000c, 0x216c: 0x000c, 0x216d: 0x000c, + // Block 0x86, offset 0x2180 + 0x2187: 0x000c, 0x2188: 0x000c, 0x2189: 0x000c, 0x218a: 0x000c, 0x218b: 0x000c, + 0x218c: 0x000c, 0x218d: 0x000c, 0x218e: 0x000c, 0x218f: 0x000c, 0x2190: 0x000c, 0x2191: 0x000c, + // Block 0x87, offset 0x21c0 + 0x21c0: 0x000c, 0x21c1: 0x000c, 0x21c2: 0x000c, + 0x21f3: 0x000c, + 0x21f6: 0x000c, 0x21f7: 0x000c, 0x21f8: 0x000c, 0x21f9: 0x000c, + 0x21fc: 0x000c, + // Block 0x88, offset 0x2200 + 0x2225: 0x000c, + // Block 0x89, offset 0x2240 + 0x2269: 0x000c, + 0x226a: 0x000c, 0x226b: 0x000c, 0x226c: 0x000c, 0x226d: 0x000c, 0x226e: 0x000c, + 0x2271: 0x000c, 0x2272: 0x000c, 0x2275: 0x000c, + 0x2276: 0x000c, + // Block 0x8a, offset 0x2280 + 0x2283: 0x000c, + 0x228c: 0x000c, + 0x22bc: 0x000c, + // Block 0x8b, offset 0x22c0 + 0x22f0: 0x000c, 0x22f2: 0x000c, 0x22f3: 0x000c, 0x22f4: 0x000c, + 0x22f7: 0x000c, 0x22f8: 0x000c, + 0x22fe: 0x000c, 0x22ff: 0x000c, + // Block 0x8c, offset 0x2300 + 0x2301: 0x000c, + 0x232c: 0x000c, 0x232d: 0x000c, + 0x2336: 0x000c, + // Block 0x8d, offset 0x2340 + 0x2365: 0x000c, 0x2368: 0x000c, + 0x236d: 0x000c, + // Block 0x8e, offset 0x2380 + 0x239d: 0x0001, + 0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001, + 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003, + 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001, + 0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001, + 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001, + 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001, + 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001, + 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d, + 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, + 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, + 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, + 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, + 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, + 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, + 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, + 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d, + // Block 0x90, offset 0x2400 + 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, + 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, + 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d, + 0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d, + 0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d, + 0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d, + 0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d, + 0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d, + 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, + 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, + 0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a, + // Block 0x91, offset 0x2440 + 0x2440: 0x000d, 0x2441: 0x000d, 0x2442: 0x000d, 0x2443: 0x000d, 0x2444: 0x000d, 0x2445: 0x000d, + 0x2446: 0x000d, 0x2447: 0x000d, 0x2448: 0x000d, 0x2449: 0x000d, 0x244a: 0x000d, 0x244b: 0x000d, + 0x244c: 0x000d, 0x244d: 0x000d, 0x244e: 0x000d, 0x244f: 0x000d, 0x2450: 0x000b, 0x2451: 0x000b, + 0x2452: 0x000b, 0x2453: 0x000b, 0x2454: 0x000b, 0x2455: 0x000b, 0x2456: 0x000b, 0x2457: 0x000b, + 0x2458: 0x000b, 0x2459: 0x000b, 0x245a: 0x000b, 0x245b: 0x000b, 0x245c: 0x000b, 0x245d: 0x000b, + 0x245e: 0x000b, 0x245f: 0x000b, 0x2460: 0x000b, 0x2461: 0x000b, 0x2462: 0x000b, 0x2463: 0x000b, + 0x2464: 0x000b, 0x2465: 0x000b, 0x2466: 0x000b, 0x2467: 0x000b, 0x2468: 0x000b, 0x2469: 0x000b, + 0x246a: 0x000b, 0x246b: 0x000b, 0x246c: 0x000b, 0x246d: 0x000b, 0x246e: 0x000b, 0x246f: 0x000b, + 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d, + 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d, + 0x247c: 0x000d, 0x247d: 0x000a, 0x247e: 0x000d, 0x247f: 0x000d, + // Block 0x92, offset 0x2480 + 0x2480: 0x000c, 0x2481: 0x000c, 0x2482: 0x000c, 0x2483: 0x000c, 0x2484: 0x000c, 0x2485: 0x000c, + 0x2486: 0x000c, 0x2487: 0x000c, 0x2488: 0x000c, 0x2489: 0x000c, 0x248a: 0x000c, 0x248b: 0x000c, + 0x248c: 0x000c, 0x248d: 0x000c, 0x248e: 0x000c, 0x248f: 0x000c, 0x2490: 0x000a, 0x2491: 0x000a, + 0x2492: 0x000a, 0x2493: 0x000a, 0x2494: 0x000a, 0x2495: 0x000a, 0x2496: 0x000a, 0x2497: 0x000a, + 0x2498: 0x000a, 0x2499: 0x000a, + 0x24a0: 0x000c, 0x24a1: 0x000c, 0x24a2: 0x000c, 0x24a3: 0x000c, + 0x24a4: 0x000c, 0x24a5: 0x000c, 0x24a6: 0x000c, 0x24a7: 0x000c, 0x24a8: 0x000c, 0x24a9: 0x000c, + 0x24aa: 0x000c, 0x24ab: 0x000c, 0x24ac: 0x000c, 0x24ad: 0x000c, 0x24ae: 0x000c, 0x24af: 0x000c, + 0x24b0: 0x000a, 0x24b1: 0x000a, 0x24b2: 0x000a, 0x24b3: 0x000a, 0x24b4: 0x000a, 0x24b5: 0x000a, + 0x24b6: 0x000a, 0x24b7: 0x000a, 0x24b8: 0x000a, 0x24b9: 0x000a, 0x24ba: 0x000a, 0x24bb: 0x000a, + 0x24bc: 0x000a, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x000a, 0x24c1: 0x000a, 0x24c2: 0x000a, 0x24c3: 0x000a, 0x24c4: 0x000a, 0x24c5: 0x000a, + 0x24c6: 0x000a, 0x24c7: 0x000a, 0x24c8: 0x000a, 0x24c9: 0x000a, 0x24ca: 0x000a, 0x24cb: 0x000a, + 0x24cc: 0x000a, 0x24cd: 0x000a, 0x24ce: 0x000a, 0x24cf: 0x000a, 0x24d0: 0x0006, 0x24d1: 0x000a, + 0x24d2: 0x0006, 0x24d4: 0x000a, 0x24d5: 0x0006, 0x24d6: 0x000a, 0x24d7: 0x000a, + 0x24d8: 0x000a, 0x24d9: 0x009a, 0x24da: 0x008a, 0x24db: 0x007a, 0x24dc: 0x006a, 0x24dd: 0x009a, + 0x24de: 0x008a, 0x24df: 0x0004, 0x24e0: 0x000a, 0x24e1: 0x000a, 0x24e2: 0x0003, 0x24e3: 0x0003, + 0x24e4: 0x000a, 0x24e5: 0x000a, 0x24e6: 0x000a, 0x24e8: 0x000a, 0x24e9: 0x0004, + 0x24ea: 0x0004, 0x24eb: 0x000a, + 0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d, + 0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d, + 0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000d, + // Block 0x94, offset 0x2500 + 0x2500: 0x000d, 0x2501: 0x000d, 0x2502: 0x000d, 0x2503: 0x000d, 0x2504: 0x000d, 0x2505: 0x000d, + 0x2506: 0x000d, 0x2507: 0x000d, 0x2508: 0x000d, 0x2509: 0x000d, 0x250a: 0x000d, 0x250b: 0x000d, + 0x250c: 0x000d, 0x250d: 0x000d, 0x250e: 0x000d, 0x250f: 0x000d, 0x2510: 0x000d, 0x2511: 0x000d, + 0x2512: 0x000d, 0x2513: 0x000d, 0x2514: 0x000d, 0x2515: 0x000d, 0x2516: 0x000d, 0x2517: 0x000d, + 0x2518: 0x000d, 0x2519: 0x000d, 0x251a: 0x000d, 0x251b: 0x000d, 0x251c: 0x000d, 0x251d: 0x000d, + 0x251e: 0x000d, 0x251f: 0x000d, 0x2520: 0x000d, 0x2521: 0x000d, 0x2522: 0x000d, 0x2523: 0x000d, + 0x2524: 0x000d, 0x2525: 0x000d, 0x2526: 0x000d, 0x2527: 0x000d, 0x2528: 0x000d, 0x2529: 0x000d, + 0x252a: 0x000d, 0x252b: 0x000d, 0x252c: 0x000d, 0x252d: 0x000d, 0x252e: 0x000d, 0x252f: 0x000d, + 0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d, + 0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d, + 0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000b, + // Block 0x95, offset 0x2540 + 0x2541: 0x000a, 0x2542: 0x000a, 0x2543: 0x0004, 0x2544: 0x0004, 0x2545: 0x0004, + 0x2546: 0x000a, 0x2547: 0x000a, 0x2548: 0x003a, 0x2549: 0x002a, 0x254a: 0x000a, 0x254b: 0x0003, + 0x254c: 0x0006, 0x254d: 0x0003, 0x254e: 0x0006, 0x254f: 0x0006, 0x2550: 0x0002, 0x2551: 0x0002, + 0x2552: 0x0002, 0x2553: 0x0002, 0x2554: 0x0002, 0x2555: 0x0002, 0x2556: 0x0002, 0x2557: 0x0002, + 0x2558: 0x0002, 0x2559: 0x0002, 0x255a: 0x0006, 0x255b: 0x000a, 0x255c: 0x000a, 0x255d: 0x000a, + 0x255e: 0x000a, 0x255f: 0x000a, 0x2560: 0x000a, + 0x257b: 0x005a, + 0x257c: 0x000a, 0x257d: 0x004a, 0x257e: 0x000a, 0x257f: 0x000a, + // Block 0x96, offset 0x2580 + 0x2580: 0x000a, + 0x259b: 0x005a, 0x259c: 0x000a, 0x259d: 0x004a, + 0x259e: 0x000a, 0x259f: 0x00fa, 0x25a0: 0x00ea, 0x25a1: 0x000a, 0x25a2: 0x003a, 0x25a3: 0x002a, + 0x25a4: 0x000a, 0x25a5: 0x000a, + // Block 0x97, offset 0x25c0 + 0x25e0: 0x0004, 0x25e1: 0x0004, 0x25e2: 0x000a, 0x25e3: 0x000a, + 0x25e4: 0x000a, 0x25e5: 0x0004, 0x25e6: 0x0004, 0x25e8: 0x000a, 0x25e9: 0x000a, + 0x25ea: 0x000a, 0x25eb: 0x000a, 0x25ec: 0x000a, 0x25ed: 0x000a, 0x25ee: 0x000a, + 0x25f0: 0x000b, 0x25f1: 0x000b, 0x25f2: 0x000b, 0x25f3: 0x000b, 0x25f4: 0x000b, 0x25f5: 0x000b, + 0x25f6: 0x000b, 0x25f7: 0x000b, 0x25f8: 0x000b, 0x25f9: 0x000a, 0x25fa: 0x000a, 0x25fb: 0x000a, + 0x25fc: 0x000a, 0x25fd: 0x000a, 0x25fe: 0x000b, 0x25ff: 0x000b, + // Block 0x98, offset 0x2600 + 0x2601: 0x000a, + // Block 0x99, offset 0x2640 + 0x2640: 0x000a, 0x2641: 0x000a, 0x2642: 0x000a, 0x2643: 0x000a, 0x2644: 0x000a, 0x2645: 0x000a, + 0x2646: 0x000a, 0x2647: 0x000a, 0x2648: 0x000a, 0x2649: 0x000a, 0x264a: 0x000a, 0x264b: 0x000a, + 0x264c: 0x000a, 0x2650: 0x000a, 0x2651: 0x000a, + 0x2652: 0x000a, 0x2653: 0x000a, 0x2654: 0x000a, 0x2655: 0x000a, 0x2656: 0x000a, 0x2657: 0x000a, + 0x2658: 0x000a, 0x2659: 0x000a, 0x265a: 0x000a, 0x265b: 0x000a, + 0x2660: 0x000a, + // Block 0x9a, offset 0x2680 + 0x26bd: 0x000c, + // Block 0x9b, offset 0x26c0 + 0x26e0: 0x000c, 0x26e1: 0x0002, 0x26e2: 0x0002, 0x26e3: 0x0002, + 0x26e4: 0x0002, 0x26e5: 0x0002, 0x26e6: 0x0002, 0x26e7: 0x0002, 0x26e8: 0x0002, 0x26e9: 0x0002, + 0x26ea: 0x0002, 0x26eb: 0x0002, 0x26ec: 0x0002, 0x26ed: 0x0002, 0x26ee: 0x0002, 0x26ef: 0x0002, + 0x26f0: 0x0002, 0x26f1: 0x0002, 0x26f2: 0x0002, 0x26f3: 0x0002, 0x26f4: 0x0002, 0x26f5: 0x0002, + 0x26f6: 0x0002, 0x26f7: 0x0002, 0x26f8: 0x0002, 0x26f9: 0x0002, 0x26fa: 0x0002, 0x26fb: 0x0002, + // Block 0x9c, offset 0x2700 + 0x2736: 0x000c, 0x2737: 0x000c, 0x2738: 0x000c, 0x2739: 0x000c, 0x273a: 0x000c, + // Block 0x9d, offset 0x2740 + 0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001, + 0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001, + 0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001, + 0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001, + 0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001, + 0x275e: 0x0001, 0x275f: 0x0001, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001, + 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001, + 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001, + 0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001, + 0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001, + 0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, + 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, + 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001, + 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, + 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, + 0x279e: 0x0001, 0x279f: 0x000a, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, + 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, + 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, + 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, + 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, + 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0001, 0x27c1: 0x000c, 0x27c2: 0x000c, 0x27c3: 0x000c, 0x27c4: 0x0001, 0x27c5: 0x000c, + 0x27c6: 0x000c, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, + 0x27cc: 0x000c, 0x27cd: 0x000c, 0x27ce: 0x000c, 0x27cf: 0x000c, 0x27d0: 0x0001, 0x27d1: 0x0001, + 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, + 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, + 0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, + 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, + 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, + 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, + 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x000c, 0x27f9: 0x000c, 0x27fa: 0x000c, 0x27fb: 0x0001, + 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x000c, + // Block 0xa0, offset 0x2800 + 0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001, + 0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, + 0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001, + 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, + 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, + 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, + 0x2824: 0x0001, 0x2825: 0x000c, 0x2826: 0x000c, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, + 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, + 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, + 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x0001, 0x283a: 0x0001, 0x283b: 0x0001, + 0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x0001, + // Block 0xa1, offset 0x2840 + 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, + 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, + 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, + 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, + 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, + 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001, + 0x2864: 0x0001, 0x2865: 0x0001, 0x2866: 0x0001, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001, + 0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001, + 0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001, + 0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x000a, 0x287a: 0x000a, 0x287b: 0x000a, + 0x287c: 0x000a, 0x287d: 0x000a, 0x287e: 0x000a, 0x287f: 0x000a, + // Block 0xa2, offset 0x2880 + 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, + 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, + 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, + 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, + 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, + 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0005, 0x28a1: 0x0005, 0x28a2: 0x0005, 0x28a3: 0x0005, + 0x28a4: 0x0005, 0x28a5: 0x0005, 0x28a6: 0x0005, 0x28a7: 0x0005, 0x28a8: 0x0005, 0x28a9: 0x0005, + 0x28aa: 0x0005, 0x28ab: 0x0005, 0x28ac: 0x0005, 0x28ad: 0x0005, 0x28ae: 0x0005, 0x28af: 0x0005, + 0x28b0: 0x0005, 0x28b1: 0x0005, 0x28b2: 0x0005, 0x28b3: 0x0005, 0x28b4: 0x0005, 0x28b5: 0x0005, + 0x28b6: 0x0005, 0x28b7: 0x0005, 0x28b8: 0x0005, 0x28b9: 0x0005, 0x28ba: 0x0005, 0x28bb: 0x0005, + 0x28bc: 0x0005, 0x28bd: 0x0005, 0x28be: 0x0005, 0x28bf: 0x0001, + // Block 0xa3, offset 0x28c0 + 0x28c1: 0x000c, + 0x28f8: 0x000c, 0x28f9: 0x000c, 0x28fa: 0x000c, 0x28fb: 0x000c, + 0x28fc: 0x000c, 0x28fd: 0x000c, 0x28fe: 0x000c, 0x28ff: 0x000c, + // Block 0xa4, offset 0x2900 + 0x2900: 0x000c, 0x2901: 0x000c, 0x2902: 0x000c, 0x2903: 0x000c, 0x2904: 0x000c, 0x2905: 0x000c, + 0x2906: 0x000c, + 0x2912: 0x000a, 0x2913: 0x000a, 0x2914: 0x000a, 0x2915: 0x000a, 0x2916: 0x000a, 0x2917: 0x000a, + 0x2918: 0x000a, 0x2919: 0x000a, 0x291a: 0x000a, 0x291b: 0x000a, 0x291c: 0x000a, 0x291d: 0x000a, + 0x291e: 0x000a, 0x291f: 0x000a, 0x2920: 0x000a, 0x2921: 0x000a, 0x2922: 0x000a, 0x2923: 0x000a, + 0x2924: 0x000a, 0x2925: 0x000a, + 0x293f: 0x000c, + // Block 0xa5, offset 0x2940 + 0x2940: 0x000c, 0x2941: 0x000c, + 0x2973: 0x000c, 0x2974: 0x000c, 0x2975: 0x000c, + 0x2976: 0x000c, 0x2979: 0x000c, 0x297a: 0x000c, + // Block 0xa6, offset 0x2980 + 0x2980: 0x000c, 0x2981: 0x000c, 0x2982: 0x000c, + 0x29a7: 0x000c, 0x29a8: 0x000c, 0x29a9: 0x000c, + 0x29aa: 0x000c, 0x29ab: 0x000c, 0x29ad: 0x000c, 0x29ae: 0x000c, 0x29af: 0x000c, + 0x29b0: 0x000c, 0x29b1: 0x000c, 0x29b2: 0x000c, 0x29b3: 0x000c, 0x29b4: 0x000c, + // Block 0xa7, offset 0x29c0 + 0x29f3: 0x000c, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x000c, 0x2a01: 0x000c, + 0x2a36: 0x000c, 0x2a37: 0x000c, 0x2a38: 0x000c, 0x2a39: 0x000c, 0x2a3a: 0x000c, 0x2a3b: 0x000c, + 0x2a3c: 0x000c, 0x2a3d: 0x000c, 0x2a3e: 0x000c, + // Block 0xa9, offset 0x2a40 + 0x2a4a: 0x000c, 0x2a4b: 0x000c, + 0x2a4c: 0x000c, + // Block 0xaa, offset 0x2a80 + 0x2aaf: 0x000c, + 0x2ab0: 0x000c, 0x2ab1: 0x000c, 0x2ab4: 0x000c, + 0x2ab6: 0x000c, 0x2ab7: 0x000c, + 0x2abe: 0x000c, + // Block 0xab, offset 0x2ac0 + 0x2adf: 0x000c, 0x2ae3: 0x000c, + 0x2ae4: 0x000c, 0x2ae5: 0x000c, 0x2ae6: 0x000c, 0x2ae7: 0x000c, 0x2ae8: 0x000c, 0x2ae9: 0x000c, + 0x2aea: 0x000c, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x000c, 0x2b01: 0x000c, + 0x2b3c: 0x000c, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x000c, + 0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, + 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6c: 0x000c, + 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c, + // Block 0xae, offset 0x2b80 + 0x2bb8: 0x000c, 0x2bb9: 0x000c, 0x2bba: 0x000c, 0x2bbb: 0x000c, + 0x2bbc: 0x000c, 0x2bbd: 0x000c, 0x2bbe: 0x000c, 0x2bbf: 0x000c, + // Block 0xaf, offset 0x2bc0 + 0x2bc2: 0x000c, 0x2bc3: 0x000c, 0x2bc4: 0x000c, + 0x2bc6: 0x000c, + // Block 0xb0, offset 0x2c00 + 0x2c33: 0x000c, 0x2c34: 0x000c, 0x2c35: 0x000c, + 0x2c36: 0x000c, 0x2c37: 0x000c, 0x2c38: 0x000c, 0x2c3a: 0x000c, + 0x2c3f: 0x000c, + // Block 0xb1, offset 0x2c40 + 0x2c40: 0x000c, 0x2c42: 0x000c, 0x2c43: 0x000c, + // Block 0xb2, offset 0x2c80 + 0x2cb2: 0x000c, 0x2cb3: 0x000c, 0x2cb4: 0x000c, 0x2cb5: 0x000c, + 0x2cbc: 0x000c, 0x2cbd: 0x000c, 0x2cbf: 0x000c, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x000c, + 0x2cdc: 0x000c, 0x2cdd: 0x000c, + // Block 0xb4, offset 0x2d00 + 0x2d33: 0x000c, 0x2d34: 0x000c, 0x2d35: 0x000c, + 0x2d36: 0x000c, 0x2d37: 0x000c, 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c, + 0x2d3d: 0x000c, 0x2d3f: 0x000c, + // Block 0xb5, offset 0x2d40 + 0x2d40: 0x000c, + 0x2d60: 0x000a, 0x2d61: 0x000a, 0x2d62: 0x000a, 0x2d63: 0x000a, + 0x2d64: 0x000a, 0x2d65: 0x000a, 0x2d66: 0x000a, 0x2d67: 0x000a, 0x2d68: 0x000a, 0x2d69: 0x000a, + 0x2d6a: 0x000a, 0x2d6b: 0x000a, 0x2d6c: 0x000a, + // Block 0xb6, offset 0x2d80 + 0x2dab: 0x000c, 0x2dad: 0x000c, + 0x2db0: 0x000c, 0x2db1: 0x000c, 0x2db2: 0x000c, 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c, + 0x2db7: 0x000c, + // Block 0xb7, offset 0x2dc0 + 0x2ddd: 0x000c, + 0x2dde: 0x000c, 0x2ddf: 0x000c, 0x2de2: 0x000c, 0x2de3: 0x000c, + 0x2de4: 0x000c, 0x2de5: 0x000c, 0x2de7: 0x000c, 0x2de8: 0x000c, 0x2de9: 0x000c, + 0x2dea: 0x000c, 0x2deb: 0x000c, + // Block 0xb8, offset 0x2e00 + 0x2e30: 0x000c, 0x2e31: 0x000c, 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c, + 0x2e36: 0x000c, 0x2e38: 0x000c, 0x2e39: 0x000c, 0x2e3a: 0x000c, 0x2e3b: 0x000c, + 0x2e3c: 0x000c, 0x2e3d: 0x000c, + // Block 0xb9, offset 0x2e40 + 0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c, 0x2e57: 0x000c, + 0x2e58: 0x000c, 0x2e59: 0x000c, 0x2e5a: 0x000c, 0x2e5b: 0x000c, 0x2e5c: 0x000c, 0x2e5d: 0x000c, + 0x2e5e: 0x000c, 0x2e5f: 0x000c, 0x2e60: 0x000c, 0x2e61: 0x000c, 0x2e62: 0x000c, 0x2e63: 0x000c, + 0x2e64: 0x000c, 0x2e65: 0x000c, 0x2e66: 0x000c, 0x2e67: 0x000c, + 0x2e6a: 0x000c, 0x2e6b: 0x000c, 0x2e6c: 0x000c, 0x2e6d: 0x000c, 0x2e6e: 0x000c, 0x2e6f: 0x000c, + 0x2e70: 0x000c, 0x2e72: 0x000c, 0x2e73: 0x000c, 0x2e75: 0x000c, + 0x2e76: 0x000c, + // Block 0xba, offset 0x2e80 + 0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c, + // Block 0xbb, offset 0x2ec0 + 0x2ef0: 0x000c, 0x2ef1: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef4: 0x000c, 0x2ef5: 0x000c, + 0x2ef6: 0x000c, + // Block 0xbc, offset 0x2f00 + 0x2f0f: 0x000c, 0x2f10: 0x000c, 0x2f11: 0x000c, + 0x2f12: 0x000c, + // Block 0xbd, offset 0x2f40 + 0x2f5d: 0x000c, + 0x2f5e: 0x000c, 0x2f60: 0x000b, 0x2f61: 0x000b, 0x2f62: 0x000b, 0x2f63: 0x000b, + // Block 0xbe, offset 0x2f80 + 0x2fa7: 0x000c, 0x2fa8: 0x000c, 0x2fa9: 0x000c, + 0x2fb3: 0x000b, 0x2fb4: 0x000b, 0x2fb5: 0x000b, + 0x2fb6: 0x000b, 0x2fb7: 0x000b, 0x2fb8: 0x000b, 0x2fb9: 0x000b, 0x2fba: 0x000b, 0x2fbb: 0x000c, + 0x2fbc: 0x000c, 0x2fbd: 0x000c, 0x2fbe: 0x000c, 0x2fbf: 0x000c, + // Block 0xbf, offset 0x2fc0 + 0x2fc0: 0x000c, 0x2fc1: 0x000c, 0x2fc2: 0x000c, 0x2fc5: 0x000c, + 0x2fc6: 0x000c, 0x2fc7: 0x000c, 0x2fc8: 0x000c, 0x2fc9: 0x000c, 0x2fca: 0x000c, 0x2fcb: 0x000c, + 0x2fea: 0x000c, 0x2feb: 0x000c, 0x2fec: 0x000c, 0x2fed: 0x000c, + // Block 0xc0, offset 0x3000 + 0x3000: 0x000a, 0x3001: 0x000a, 0x3002: 0x000c, 0x3003: 0x000c, 0x3004: 0x000c, 0x3005: 0x000a, + // Block 0xc1, offset 0x3040 + 0x3040: 0x000a, 0x3041: 0x000a, 0x3042: 0x000a, 0x3043: 0x000a, 0x3044: 0x000a, 0x3045: 0x000a, + 0x3046: 0x000a, 0x3047: 0x000a, 0x3048: 0x000a, 0x3049: 0x000a, 0x304a: 0x000a, 0x304b: 0x000a, + 0x304c: 0x000a, 0x304d: 0x000a, 0x304e: 0x000a, 0x304f: 0x000a, 0x3050: 0x000a, 0x3051: 0x000a, + 0x3052: 0x000a, 0x3053: 0x000a, 0x3054: 0x000a, 0x3055: 0x000a, 0x3056: 0x000a, + // Block 0xc2, offset 0x3080 + 0x309b: 0x000a, + // Block 0xc3, offset 0x30c0 + 0x30d5: 0x000a, + // Block 0xc4, offset 0x3100 + 0x310f: 0x000a, + // Block 0xc5, offset 0x3140 + 0x3149: 0x000a, + // Block 0xc6, offset 0x3180 + 0x3183: 0x000a, + 0x318e: 0x0002, 0x318f: 0x0002, 0x3190: 0x0002, 0x3191: 0x0002, + 0x3192: 0x0002, 0x3193: 0x0002, 0x3194: 0x0002, 0x3195: 0x0002, 0x3196: 0x0002, 0x3197: 0x0002, + 0x3198: 0x0002, 0x3199: 0x0002, 0x319a: 0x0002, 0x319b: 0x0002, 0x319c: 0x0002, 0x319d: 0x0002, + 0x319e: 0x0002, 0x319f: 0x0002, 0x31a0: 0x0002, 0x31a1: 0x0002, 0x31a2: 0x0002, 0x31a3: 0x0002, + 0x31a4: 0x0002, 0x31a5: 0x0002, 0x31a6: 0x0002, 0x31a7: 0x0002, 0x31a8: 0x0002, 0x31a9: 0x0002, + 0x31aa: 0x0002, 0x31ab: 0x0002, 0x31ac: 0x0002, 0x31ad: 0x0002, 0x31ae: 0x0002, 0x31af: 0x0002, + 0x31b0: 0x0002, 0x31b1: 0x0002, 0x31b2: 0x0002, 0x31b3: 0x0002, 0x31b4: 0x0002, 0x31b5: 0x0002, + 0x31b6: 0x0002, 0x31b7: 0x0002, 0x31b8: 0x0002, 0x31b9: 0x0002, 0x31ba: 0x0002, 0x31bb: 0x0002, + 0x31bc: 0x0002, 0x31bd: 0x0002, 0x31be: 0x0002, 0x31bf: 0x0002, + // Block 0xc7, offset 0x31c0 + 0x31c0: 0x000c, 0x31c1: 0x000c, 0x31c2: 0x000c, 0x31c3: 0x000c, 0x31c4: 0x000c, 0x31c5: 0x000c, + 0x31c6: 0x000c, 0x31c7: 0x000c, 0x31c8: 0x000c, 0x31c9: 0x000c, 0x31ca: 0x000c, 0x31cb: 0x000c, + 0x31cc: 0x000c, 0x31cd: 0x000c, 0x31ce: 0x000c, 0x31cf: 0x000c, 0x31d0: 0x000c, 0x31d1: 0x000c, + 0x31d2: 0x000c, 0x31d3: 0x000c, 0x31d4: 0x000c, 0x31d5: 0x000c, 0x31d6: 0x000c, 0x31d7: 0x000c, + 0x31d8: 0x000c, 0x31d9: 0x000c, 0x31da: 0x000c, 0x31db: 0x000c, 0x31dc: 0x000c, 0x31dd: 0x000c, + 0x31de: 0x000c, 0x31df: 0x000c, 0x31e0: 0x000c, 0x31e1: 0x000c, 0x31e2: 0x000c, 0x31e3: 0x000c, + 0x31e4: 0x000c, 0x31e5: 0x000c, 0x31e6: 0x000c, 0x31e7: 0x000c, 0x31e8: 0x000c, 0x31e9: 0x000c, + 0x31ea: 0x000c, 0x31eb: 0x000c, 0x31ec: 0x000c, 0x31ed: 0x000c, 0x31ee: 0x000c, 0x31ef: 0x000c, + 0x31f0: 0x000c, 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c, + 0x31f6: 0x000c, 0x31fb: 0x000c, + 0x31fc: 0x000c, 0x31fd: 0x000c, 0x31fe: 0x000c, 0x31ff: 0x000c, + // Block 0xc8, offset 0x3200 + 0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c, + 0x3206: 0x000c, 0x3207: 0x000c, 0x3208: 0x000c, 0x3209: 0x000c, 0x320a: 0x000c, 0x320b: 0x000c, + 0x320c: 0x000c, 0x320d: 0x000c, 0x320e: 0x000c, 0x320f: 0x000c, 0x3210: 0x000c, 0x3211: 0x000c, + 0x3212: 0x000c, 0x3213: 0x000c, 0x3214: 0x000c, 0x3215: 0x000c, 0x3216: 0x000c, 0x3217: 0x000c, + 0x3218: 0x000c, 0x3219: 0x000c, 0x321a: 0x000c, 0x321b: 0x000c, 0x321c: 0x000c, 0x321d: 0x000c, + 0x321e: 0x000c, 0x321f: 0x000c, 0x3220: 0x000c, 0x3221: 0x000c, 0x3222: 0x000c, 0x3223: 0x000c, + 0x3224: 0x000c, 0x3225: 0x000c, 0x3226: 0x000c, 0x3227: 0x000c, 0x3228: 0x000c, 0x3229: 0x000c, + 0x322a: 0x000c, 0x322b: 0x000c, 0x322c: 0x000c, + 0x3235: 0x000c, + // Block 0xc9, offset 0x3240 + 0x3244: 0x000c, + 0x325b: 0x000c, 0x325c: 0x000c, 0x325d: 0x000c, + 0x325e: 0x000c, 0x325f: 0x000c, 0x3261: 0x000c, 0x3262: 0x000c, 0x3263: 0x000c, + 0x3264: 0x000c, 0x3265: 0x000c, 0x3266: 0x000c, 0x3267: 0x000c, 0x3268: 0x000c, 0x3269: 0x000c, + 0x326a: 0x000c, 0x326b: 0x000c, 0x326c: 0x000c, 0x326d: 0x000c, 0x326e: 0x000c, 0x326f: 0x000c, + // Block 0xca, offset 0x3280 + 0x3280: 0x000c, 0x3281: 0x000c, 0x3282: 0x000c, 0x3283: 0x000c, 0x3284: 0x000c, 0x3285: 0x000c, + 0x3286: 0x000c, 0x3288: 0x000c, 0x3289: 0x000c, 0x328a: 0x000c, 0x328b: 0x000c, + 0x328c: 0x000c, 0x328d: 0x000c, 0x328e: 0x000c, 0x328f: 0x000c, 0x3290: 0x000c, 0x3291: 0x000c, + 0x3292: 0x000c, 0x3293: 0x000c, 0x3294: 0x000c, 0x3295: 0x000c, 0x3296: 0x000c, 0x3297: 0x000c, + 0x3298: 0x000c, 0x329b: 0x000c, 0x329c: 0x000c, 0x329d: 0x000c, + 0x329e: 0x000c, 0x329f: 0x000c, 0x32a0: 0x000c, 0x32a1: 0x000c, 0x32a3: 0x000c, + 0x32a4: 0x000c, 0x32a6: 0x000c, 0x32a7: 0x000c, 0x32a8: 0x000c, 0x32a9: 0x000c, + 0x32aa: 0x000c, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x0001, 0x32c1: 0x0001, 0x32c2: 0x0001, 0x32c3: 0x0001, 0x32c4: 0x0001, 0x32c5: 0x0001, + 0x32c6: 0x0001, 0x32c7: 0x0001, 0x32c8: 0x0001, 0x32c9: 0x0001, 0x32ca: 0x0001, 0x32cb: 0x0001, + 0x32cc: 0x0001, 0x32cd: 0x0001, 0x32ce: 0x0001, 0x32cf: 0x0001, 0x32d0: 0x000c, 0x32d1: 0x000c, + 0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x0001, + 0x32d8: 0x0001, 0x32d9: 0x0001, 0x32da: 0x0001, 0x32db: 0x0001, 0x32dc: 0x0001, 0x32dd: 0x0001, + 0x32de: 0x0001, 0x32df: 0x0001, 0x32e0: 0x0001, 0x32e1: 0x0001, 0x32e2: 0x0001, 0x32e3: 0x0001, + 0x32e4: 0x0001, 0x32e5: 0x0001, 0x32e6: 0x0001, 0x32e7: 0x0001, 0x32e8: 0x0001, 0x32e9: 0x0001, + 0x32ea: 0x0001, 0x32eb: 0x0001, 0x32ec: 0x0001, 0x32ed: 0x0001, 0x32ee: 0x0001, 0x32ef: 0x0001, + 0x32f0: 0x0001, 0x32f1: 0x0001, 0x32f2: 0x0001, 0x32f3: 0x0001, 0x32f4: 0x0001, 0x32f5: 0x0001, + 0x32f6: 0x0001, 0x32f7: 0x0001, 0x32f8: 0x0001, 0x32f9: 0x0001, 0x32fa: 0x0001, 0x32fb: 0x0001, + 0x32fc: 0x0001, 0x32fd: 0x0001, 0x32fe: 0x0001, 0x32ff: 0x0001, + // Block 0xcc, offset 0x3300 + 0x3300: 0x0001, 0x3301: 0x0001, 0x3302: 0x0001, 0x3303: 0x0001, 0x3304: 0x000c, 0x3305: 0x000c, + 0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x0001, + 0x330c: 0x0001, 0x330d: 0x0001, 0x330e: 0x0001, 0x330f: 0x0001, 0x3310: 0x0001, 0x3311: 0x0001, + 0x3312: 0x0001, 0x3313: 0x0001, 0x3314: 0x0001, 0x3315: 0x0001, 0x3316: 0x0001, 0x3317: 0x0001, + 0x3318: 0x0001, 0x3319: 0x0001, 0x331a: 0x0001, 0x331b: 0x0001, 0x331c: 0x0001, 0x331d: 0x0001, + 0x331e: 0x0001, 0x331f: 0x0001, 0x3320: 0x0001, 0x3321: 0x0001, 0x3322: 0x0001, 0x3323: 0x0001, + 0x3324: 0x0001, 0x3325: 0x0001, 0x3326: 0x0001, 0x3327: 0x0001, 0x3328: 0x0001, 0x3329: 0x0001, + 0x332a: 0x0001, 0x332b: 0x0001, 0x332c: 0x0001, 0x332d: 0x0001, 0x332e: 0x0001, 0x332f: 0x0001, + 0x3330: 0x0001, 0x3331: 0x0001, 0x3332: 0x0001, 0x3333: 0x0001, 0x3334: 0x0001, 0x3335: 0x0001, + 0x3336: 0x0001, 0x3337: 0x0001, 0x3338: 0x0001, 0x3339: 0x0001, 0x333a: 0x0001, 0x333b: 0x0001, + 0x333c: 0x0001, 0x333d: 0x0001, 0x333e: 0x0001, 0x333f: 0x0001, + // Block 0xcd, offset 0x3340 + 0x3340: 0x000d, 0x3341: 0x000d, 0x3342: 0x000d, 0x3343: 0x000d, 0x3344: 0x000d, 0x3345: 0x000d, + 0x3346: 0x000d, 0x3347: 0x000d, 0x3348: 0x000d, 0x3349: 0x000d, 0x334a: 0x000d, 0x334b: 0x000d, + 0x334c: 0x000d, 0x334d: 0x000d, 0x334e: 0x000d, 0x334f: 0x000d, 0x3350: 0x000d, 0x3351: 0x000d, + 0x3352: 0x000d, 0x3353: 0x000d, 0x3354: 0x000d, 0x3355: 0x000d, 0x3356: 0x000d, 0x3357: 0x000d, + 0x3358: 0x000d, 0x3359: 0x000d, 0x335a: 0x000d, 0x335b: 0x000d, 0x335c: 0x000d, 0x335d: 0x000d, + 0x335e: 0x000d, 0x335f: 0x000d, 0x3360: 0x000d, 0x3361: 0x000d, 0x3362: 0x000d, 0x3363: 0x000d, + 0x3364: 0x000d, 0x3365: 0x000d, 0x3366: 0x000d, 0x3367: 0x000d, 0x3368: 0x000d, 0x3369: 0x000d, + 0x336a: 0x000d, 0x336b: 0x000d, 0x336c: 0x000d, 0x336d: 0x000d, 0x336e: 0x000d, 0x336f: 0x000d, + 0x3370: 0x000a, 0x3371: 0x000a, 0x3372: 0x000d, 0x3373: 0x000d, 0x3374: 0x000d, 0x3375: 0x000d, + 0x3376: 0x000d, 0x3377: 0x000d, 0x3378: 0x000d, 0x3379: 0x000d, 0x337a: 0x000d, 0x337b: 0x000d, + 0x337c: 0x000d, 0x337d: 0x000d, 0x337e: 0x000d, 0x337f: 0x000d, + // Block 0xce, offset 0x3380 + 0x3380: 0x000a, 0x3381: 0x000a, 0x3382: 0x000a, 0x3383: 0x000a, 0x3384: 0x000a, 0x3385: 0x000a, + 0x3386: 0x000a, 0x3387: 0x000a, 0x3388: 0x000a, 0x3389: 0x000a, 0x338a: 0x000a, 0x338b: 0x000a, + 0x338c: 0x000a, 0x338d: 0x000a, 0x338e: 0x000a, 0x338f: 0x000a, 0x3390: 0x000a, 0x3391: 0x000a, + 0x3392: 0x000a, 0x3393: 0x000a, 0x3394: 0x000a, 0x3395: 0x000a, 0x3396: 0x000a, 0x3397: 0x000a, + 0x3398: 0x000a, 0x3399: 0x000a, 0x339a: 0x000a, 0x339b: 0x000a, 0x339c: 0x000a, 0x339d: 0x000a, + 0x339e: 0x000a, 0x339f: 0x000a, 0x33a0: 0x000a, 0x33a1: 0x000a, 0x33a2: 0x000a, 0x33a3: 0x000a, + 0x33a4: 0x000a, 0x33a5: 0x000a, 0x33a6: 0x000a, 0x33a7: 0x000a, 0x33a8: 0x000a, 0x33a9: 0x000a, + 0x33aa: 0x000a, 0x33ab: 0x000a, + 0x33b0: 0x000a, 0x33b1: 0x000a, 0x33b2: 0x000a, 0x33b3: 0x000a, 0x33b4: 0x000a, 0x33b5: 0x000a, + 0x33b6: 0x000a, 0x33b7: 0x000a, 0x33b8: 0x000a, 0x33b9: 0x000a, 0x33ba: 0x000a, 0x33bb: 0x000a, + 0x33bc: 0x000a, 0x33bd: 0x000a, 0x33be: 0x000a, 0x33bf: 0x000a, + // Block 0xcf, offset 0x33c0 + 0x33c0: 0x000a, 0x33c1: 0x000a, 0x33c2: 0x000a, 0x33c3: 0x000a, 0x33c4: 0x000a, 0x33c5: 0x000a, + 0x33c6: 0x000a, 0x33c7: 0x000a, 0x33c8: 0x000a, 0x33c9: 0x000a, 0x33ca: 0x000a, 0x33cb: 0x000a, + 0x33cc: 0x000a, 0x33cd: 0x000a, 0x33ce: 0x000a, 0x33cf: 0x000a, 0x33d0: 0x000a, 0x33d1: 0x000a, + 0x33d2: 0x000a, 0x33d3: 0x000a, + 0x33e0: 0x000a, 0x33e1: 0x000a, 0x33e2: 0x000a, 0x33e3: 0x000a, + 0x33e4: 0x000a, 0x33e5: 0x000a, 0x33e6: 0x000a, 0x33e7: 0x000a, 0x33e8: 0x000a, 0x33e9: 0x000a, + 0x33ea: 0x000a, 0x33eb: 0x000a, 0x33ec: 0x000a, 0x33ed: 0x000a, 0x33ee: 0x000a, + 0x33f1: 0x000a, 0x33f2: 0x000a, 0x33f3: 0x000a, 0x33f4: 0x000a, 0x33f5: 0x000a, + 0x33f6: 0x000a, 0x33f7: 0x000a, 0x33f8: 0x000a, 0x33f9: 0x000a, 0x33fa: 0x000a, 0x33fb: 0x000a, + 0x33fc: 0x000a, 0x33fd: 0x000a, 0x33fe: 0x000a, 0x33ff: 0x000a, + // Block 0xd0, offset 0x3400 + 0x3401: 0x000a, 0x3402: 0x000a, 0x3403: 0x000a, 0x3404: 0x000a, 0x3405: 0x000a, + 0x3406: 0x000a, 0x3407: 0x000a, 0x3408: 0x000a, 0x3409: 0x000a, 0x340a: 0x000a, 0x340b: 0x000a, + 0x340c: 0x000a, 0x340d: 0x000a, 0x340e: 0x000a, 0x340f: 0x000a, 0x3411: 0x000a, + 0x3412: 0x000a, 0x3413: 0x000a, 0x3414: 0x000a, 0x3415: 0x000a, 0x3416: 0x000a, 0x3417: 0x000a, + 0x3418: 0x000a, 0x3419: 0x000a, 0x341a: 0x000a, 0x341b: 0x000a, 0x341c: 0x000a, 0x341d: 0x000a, + 0x341e: 0x000a, 0x341f: 0x000a, 0x3420: 0x000a, 0x3421: 0x000a, 0x3422: 0x000a, 0x3423: 0x000a, + 0x3424: 0x000a, 0x3425: 0x000a, 0x3426: 0x000a, 0x3427: 0x000a, 0x3428: 0x000a, 0x3429: 0x000a, + 0x342a: 0x000a, 0x342b: 0x000a, 0x342c: 0x000a, 0x342d: 0x000a, 0x342e: 0x000a, 0x342f: 0x000a, + 0x3430: 0x000a, 0x3431: 0x000a, 0x3432: 0x000a, 0x3433: 0x000a, 0x3434: 0x000a, 0x3435: 0x000a, + // Block 0xd1, offset 0x3440 + 0x3440: 0x0002, 0x3441: 0x0002, 0x3442: 0x0002, 0x3443: 0x0002, 0x3444: 0x0002, 0x3445: 0x0002, + 0x3446: 0x0002, 0x3447: 0x0002, 0x3448: 0x0002, 0x3449: 0x0002, 0x344a: 0x0002, 0x344b: 0x000a, + 0x344c: 0x000a, + // Block 0xd2, offset 0x3480 + 0x34aa: 0x000a, 0x34ab: 0x000a, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a, + 0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a, + 0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a, + 0x34d2: 0x000a, + 0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a, + 0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a, + 0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a, + 0x34f0: 0x000a, 0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a, + 0x34f6: 0x000a, + // Block 0xd4, offset 0x3500 + 0x3500: 0x000a, 0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a, + 0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a, + 0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3510: 0x000a, 0x3511: 0x000a, + 0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a, + // Block 0xd5, offset 0x3540 + 0x3540: 0x000a, 0x3541: 0x000a, 0x3542: 0x000a, 0x3543: 0x000a, 0x3544: 0x000a, 0x3545: 0x000a, + 0x3546: 0x000a, 0x3547: 0x000a, 0x3548: 0x000a, 0x3549: 0x000a, 0x354a: 0x000a, 0x354b: 0x000a, + 0x3550: 0x000a, 0x3551: 0x000a, + 0x3552: 0x000a, 0x3553: 0x000a, 0x3554: 0x000a, 0x3555: 0x000a, 0x3556: 0x000a, 0x3557: 0x000a, + 0x3558: 0x000a, 0x3559: 0x000a, 0x355a: 0x000a, 0x355b: 0x000a, 0x355c: 0x000a, 0x355d: 0x000a, + 0x355e: 0x000a, 0x355f: 0x000a, 0x3560: 0x000a, 0x3561: 0x000a, 0x3562: 0x000a, 0x3563: 0x000a, + 0x3564: 0x000a, 0x3565: 0x000a, 0x3566: 0x000a, 0x3567: 0x000a, 0x3568: 0x000a, 0x3569: 0x000a, + 0x356a: 0x000a, 0x356b: 0x000a, 0x356c: 0x000a, 0x356d: 0x000a, 0x356e: 0x000a, 0x356f: 0x000a, + 0x3570: 0x000a, 0x3571: 0x000a, 0x3572: 0x000a, 0x3573: 0x000a, 0x3574: 0x000a, 0x3575: 0x000a, + 0x3576: 0x000a, 0x3577: 0x000a, 0x3578: 0x000a, 0x3579: 0x000a, 0x357a: 0x000a, 0x357b: 0x000a, + 0x357c: 0x000a, 0x357d: 0x000a, 0x357e: 0x000a, 0x357f: 0x000a, + // Block 0xd6, offset 0x3580 + 0x3580: 0x000a, 0x3581: 0x000a, 0x3582: 0x000a, 0x3583: 0x000a, 0x3584: 0x000a, 0x3585: 0x000a, + 0x3586: 0x000a, 0x3587: 0x000a, + 0x3590: 0x000a, 0x3591: 0x000a, + 0x3592: 0x000a, 0x3593: 0x000a, 0x3594: 0x000a, 0x3595: 0x000a, 0x3596: 0x000a, 0x3597: 0x000a, + 0x3598: 0x000a, 0x3599: 0x000a, + 0x35a0: 0x000a, 0x35a1: 0x000a, 0x35a2: 0x000a, 0x35a3: 0x000a, + 0x35a4: 0x000a, 0x35a5: 0x000a, 0x35a6: 0x000a, 0x35a7: 0x000a, 0x35a8: 0x000a, 0x35a9: 0x000a, + 0x35aa: 0x000a, 0x35ab: 0x000a, 0x35ac: 0x000a, 0x35ad: 0x000a, 0x35ae: 0x000a, 0x35af: 0x000a, + 0x35b0: 0x000a, 0x35b1: 0x000a, 0x35b2: 0x000a, 0x35b3: 0x000a, 0x35b4: 0x000a, 0x35b5: 0x000a, + 0x35b6: 0x000a, 0x35b7: 0x000a, 0x35b8: 0x000a, 0x35b9: 0x000a, 0x35ba: 0x000a, 0x35bb: 0x000a, + 0x35bc: 0x000a, 0x35bd: 0x000a, 0x35be: 0x000a, 0x35bf: 0x000a, + // Block 0xd7, offset 0x35c0 + 0x35c0: 0x000a, 0x35c1: 0x000a, 0x35c2: 0x000a, 0x35c3: 0x000a, 0x35c4: 0x000a, 0x35c5: 0x000a, + 0x35c6: 0x000a, 0x35c7: 0x000a, + 0x35d0: 0x000a, 0x35d1: 0x000a, + 0x35d2: 0x000a, 0x35d3: 0x000a, 0x35d4: 0x000a, 0x35d5: 0x000a, 0x35d6: 0x000a, 0x35d7: 0x000a, + 0x35d8: 0x000a, 0x35d9: 0x000a, 0x35da: 0x000a, 0x35db: 0x000a, 0x35dc: 0x000a, 0x35dd: 0x000a, + 0x35de: 0x000a, 0x35df: 0x000a, 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a, + 0x35e4: 0x000a, 0x35e5: 0x000a, 0x35e6: 0x000a, 0x35e7: 0x000a, 0x35e8: 0x000a, 0x35e9: 0x000a, + 0x35ea: 0x000a, 0x35eb: 0x000a, 0x35ec: 0x000a, 0x35ed: 0x000a, + // Block 0xd8, offset 0x3600 + 0x3610: 0x000a, 0x3611: 0x000a, + 0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a, 0x3615: 0x000a, 0x3616: 0x000a, 0x3617: 0x000a, + 0x3618: 0x000a, 0x3619: 0x000a, 0x361a: 0x000a, 0x361b: 0x000a, 0x361c: 0x000a, 0x361d: 0x000a, + 0x361e: 0x000a, 0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a, + 0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, + 0x3630: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a, + 0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, 0x3639: 0x000a, 0x363a: 0x000a, 0x363b: 0x000a, + 0x363c: 0x000a, 0x363d: 0x000a, 0x363e: 0x000a, + // Block 0xd9, offset 0x3640 + 0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a, + 0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a, + 0x3650: 0x000a, 0x3651: 0x000a, + 0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, 0x3655: 0x000a, 0x3656: 0x000a, 0x3657: 0x000a, + 0x3658: 0x000a, 0x3659: 0x000a, 0x365a: 0x000a, 0x365b: 0x000a, 0x365c: 0x000a, 0x365d: 0x000a, + 0x365e: 0x000a, + // Block 0xda, offset 0x3680 + 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a, + 0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a, + 0x368c: 0x000a, 0x368d: 0x000a, 0x368e: 0x000a, 0x368f: 0x000a, 0x3690: 0x000a, 0x3691: 0x000a, + // Block 0xdb, offset 0x36c0 + 0x36fe: 0x000b, 0x36ff: 0x000b, + // Block 0xdc, offset 0x3700 + 0x3700: 0x000b, 0x3701: 0x000b, 0x3702: 0x000b, 0x3703: 0x000b, 0x3704: 0x000b, 0x3705: 0x000b, + 0x3706: 0x000b, 0x3707: 0x000b, 0x3708: 0x000b, 0x3709: 0x000b, 0x370a: 0x000b, 0x370b: 0x000b, + 0x370c: 0x000b, 0x370d: 0x000b, 0x370e: 0x000b, 0x370f: 0x000b, 0x3710: 0x000b, 0x3711: 0x000b, + 0x3712: 0x000b, 0x3713: 0x000b, 0x3714: 0x000b, 0x3715: 0x000b, 0x3716: 0x000b, 0x3717: 0x000b, + 0x3718: 0x000b, 0x3719: 0x000b, 0x371a: 0x000b, 0x371b: 0x000b, 0x371c: 0x000b, 0x371d: 0x000b, + 0x371e: 0x000b, 0x371f: 0x000b, 0x3720: 0x000b, 0x3721: 0x000b, 0x3722: 0x000b, 0x3723: 0x000b, + 0x3724: 0x000b, 0x3725: 0x000b, 0x3726: 0x000b, 0x3727: 0x000b, 0x3728: 0x000b, 0x3729: 0x000b, + 0x372a: 0x000b, 0x372b: 0x000b, 0x372c: 0x000b, 0x372d: 0x000b, 0x372e: 0x000b, 0x372f: 0x000b, + 0x3730: 0x000b, 0x3731: 0x000b, 0x3732: 0x000b, 0x3733: 0x000b, 0x3734: 0x000b, 0x3735: 0x000b, + 0x3736: 0x000b, 0x3737: 0x000b, 0x3738: 0x000b, 0x3739: 0x000b, 0x373a: 0x000b, 0x373b: 0x000b, + 0x373c: 0x000b, 0x373d: 0x000b, 0x373e: 0x000b, 0x373f: 0x000b, + // Block 0xdd, offset 0x3740 + 0x3740: 0x000c, 0x3741: 0x000c, 0x3742: 0x000c, 0x3743: 0x000c, 0x3744: 0x000c, 0x3745: 0x000c, + 0x3746: 0x000c, 0x3747: 0x000c, 0x3748: 0x000c, 0x3749: 0x000c, 0x374a: 0x000c, 0x374b: 0x000c, + 0x374c: 0x000c, 0x374d: 0x000c, 0x374e: 0x000c, 0x374f: 0x000c, 0x3750: 0x000c, 0x3751: 0x000c, + 0x3752: 0x000c, 0x3753: 0x000c, 0x3754: 0x000c, 0x3755: 0x000c, 0x3756: 0x000c, 0x3757: 0x000c, + 0x3758: 0x000c, 0x3759: 0x000c, 0x375a: 0x000c, 0x375b: 0x000c, 0x375c: 0x000c, 0x375d: 0x000c, + 0x375e: 0x000c, 0x375f: 0x000c, 0x3760: 0x000c, 0x3761: 0x000c, 0x3762: 0x000c, 0x3763: 0x000c, + 0x3764: 0x000c, 0x3765: 0x000c, 0x3766: 0x000c, 0x3767: 0x000c, 0x3768: 0x000c, 0x3769: 0x000c, + 0x376a: 0x000c, 0x376b: 0x000c, 0x376c: 0x000c, 0x376d: 0x000c, 0x376e: 0x000c, 0x376f: 0x000c, + 0x3770: 0x000b, 0x3771: 0x000b, 0x3772: 0x000b, 0x3773: 0x000b, 0x3774: 0x000b, 0x3775: 0x000b, + 0x3776: 0x000b, 0x3777: 0x000b, 0x3778: 0x000b, 0x3779: 0x000b, 0x377a: 0x000b, 0x377b: 0x000b, + 0x377c: 0x000b, 0x377d: 0x000b, 0x377e: 0x000b, 0x377f: 0x000b, +} + +// bidiIndex: 24 blocks, 1536 entries, 1536 bytes +// Block 0 is the zero block. +var bidiIndex = [1536]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, + 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, + 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, + 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, + 0xea: 0x07, 0xef: 0x08, + 0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15, + // Block 0x4, offset 0x100 + 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, + 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, + 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28, + 0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30, + // Block 0x5, offset 0x140 + 0x140: 0x31, 0x141: 0x32, 0x142: 0x33, + 0x14d: 0x34, 0x14e: 0x35, + 0x150: 0x36, + 0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b, + 0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40, + 0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47, + 0x170: 0x48, 0x173: 0x49, 0x177: 0x4a, + 0x17e: 0x4b, 0x17f: 0x4c, + // Block 0x6, offset 0x180 + 0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54, + 0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x59, + 0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54, + 0x198: 0x54, 0x199: 0x54, 0x19a: 0x5e, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5f, 0x19e: 0x54, 0x19f: 0x60, + 0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x61, 0x1a7: 0x62, + 0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x65, + 0x1b3: 0x66, 0x1b5: 0x67, 0x1b7: 0x68, + 0x1b8: 0x69, 0x1b9: 0x6a, 0x1ba: 0x6b, 0x1bb: 0x6c, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6d, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x6e, 0x1c2: 0x6f, 0x1c3: 0x70, 0x1c7: 0x71, + 0x1c8: 0x72, 0x1c9: 0x73, 0x1ca: 0x74, 0x1cb: 0x75, 0x1cd: 0x76, 0x1cf: 0x77, + // Block 0x8, offset 0x200 + 0x237: 0x54, + // Block 0x9, offset 0x240 + 0x252: 0x78, 0x253: 0x79, + 0x258: 0x7a, 0x259: 0x7b, 0x25a: 0x7c, 0x25b: 0x7d, 0x25c: 0x7e, 0x25e: 0x7f, + 0x260: 0x80, 0x261: 0x81, 0x263: 0x82, 0x264: 0x83, 0x265: 0x84, 0x266: 0x85, 0x267: 0x86, + 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26f: 0x8b, + // Block 0xa, offset 0x280 + 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e, + 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8f, + 0x2b8: 0x90, 0x2b9: 0x91, 0x2ba: 0x0e, 0x2bb: 0x92, 0x2bc: 0x93, 0x2bd: 0x94, 0x2bf: 0x95, + // Block 0xb, offset 0x2c0 + 0x2c4: 0x96, 0x2c5: 0x54, 0x2c6: 0x97, 0x2c7: 0x98, + 0x2cb: 0x99, 0x2cd: 0x9a, + 0x2e0: 0x9b, 0x2e1: 0x9b, 0x2e2: 0x9b, 0x2e3: 0x9b, 0x2e4: 0x9c, 0x2e5: 0x9b, 0x2e6: 0x9b, 0x2e7: 0x9b, + 0x2e8: 0x9d, 0x2e9: 0x9b, 0x2ea: 0x9b, 0x2eb: 0x9e, 0x2ec: 0x9f, 0x2ed: 0x9b, 0x2ee: 0x9b, 0x2ef: 0x9b, + 0x2f0: 0x9b, 0x2f1: 0x9b, 0x2f2: 0x9b, 0x2f3: 0x9b, 0x2f4: 0x9b, 0x2f5: 0x9b, 0x2f6: 0x9b, 0x2f7: 0x9b, + 0x2f8: 0x9b, 0x2f9: 0xa0, 0x2fa: 0x9b, 0x2fb: 0x9b, 0x2fc: 0x9b, 0x2fd: 0x9b, 0x2fe: 0x9b, 0x2ff: 0x9b, + // Block 0xc, offset 0x300 + 0x300: 0xa1, 0x301: 0xa2, 0x302: 0xa3, 0x304: 0xa4, 0x305: 0xa5, 0x306: 0xa6, 0x307: 0xa7, + 0x308: 0xa8, 0x30b: 0xa9, 0x30c: 0xaa, 0x30d: 0xab, + 0x310: 0xac, 0x311: 0xad, 0x312: 0xae, 0x313: 0xaf, 0x316: 0xb0, 0x317: 0xb1, + 0x318: 0xb2, 0x319: 0xb3, 0x31a: 0xb4, 0x31c: 0xb5, + 0x330: 0xb6, 0x332: 0xb7, + // Block 0xd, offset 0x340 + 0x36b: 0xb8, 0x36c: 0xb9, + 0x37e: 0xba, + // Block 0xe, offset 0x380 + 0x3b2: 0xbb, + // Block 0xf, offset 0x3c0 + 0x3c5: 0xbc, 0x3c6: 0xbd, + 0x3c8: 0x54, 0x3c9: 0xbe, 0x3cc: 0x54, 0x3cd: 0xbf, + 0x3db: 0xc0, 0x3dc: 0xc1, 0x3dd: 0xc2, 0x3de: 0xc3, 0x3df: 0xc4, + 0x3e8: 0xc5, 0x3e9: 0xc6, 0x3ea: 0xc7, + // Block 0x10, offset 0x400 + 0x400: 0xc8, + 0x420: 0x9b, 0x421: 0x9b, 0x422: 0x9b, 0x423: 0xc9, 0x424: 0x9b, 0x425: 0xca, 0x426: 0x9b, 0x427: 0x9b, + 0x428: 0x9b, 0x429: 0x9b, 0x42a: 0x9b, 0x42b: 0x9b, 0x42c: 0x9b, 0x42d: 0x9b, 0x42e: 0x9b, 0x42f: 0x9b, + 0x430: 0x9b, 0x431: 0x9b, 0x432: 0x9b, 0x433: 0x9b, 0x434: 0x9b, 0x435: 0x9b, 0x436: 0x9b, 0x437: 0x9b, + 0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcb, 0x43c: 0x9b, 0x43d: 0x9b, 0x43e: 0x9b, 0x43f: 0x9b, + // Block 0x11, offset 0x440 + 0x440: 0xcc, 0x441: 0x54, 0x442: 0xcd, 0x443: 0xce, 0x444: 0xcf, 0x445: 0xd0, + 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54, + 0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54, + 0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd1, 0x45c: 0x54, 0x45d: 0x6c, 0x45e: 0x54, 0x45f: 0xd2, + 0x460: 0xd3, 0x461: 0xd4, 0x462: 0xd5, 0x464: 0xd6, 0x465: 0xd7, 0x466: 0xd8, 0x467: 0x36, + 0x47f: 0xd9, + // Block 0x12, offset 0x480 + 0x4bf: 0xd9, + // Block 0x13, offset 0x4c0 + 0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b, + 0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f, + 0x4ef: 0x10, + 0x4ff: 0x10, + // Block 0x14, offset 0x500 + 0x50f: 0x10, + 0x51f: 0x10, + 0x52f: 0x10, + 0x53f: 0x10, + // Block 0x15, offset 0x540 + 0x540: 0xda, 0x541: 0xda, 0x542: 0xda, 0x543: 0xda, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xdb, + 0x548: 0xda, 0x549: 0xda, 0x54a: 0xda, 0x54b: 0xda, 0x54c: 0xda, 0x54d: 0xda, 0x54e: 0xda, 0x54f: 0xda, + 0x550: 0xda, 0x551: 0xda, 0x552: 0xda, 0x553: 0xda, 0x554: 0xda, 0x555: 0xda, 0x556: 0xda, 0x557: 0xda, + 0x558: 0xda, 0x559: 0xda, 0x55a: 0xda, 0x55b: 0xda, 0x55c: 0xda, 0x55d: 0xda, 0x55e: 0xda, 0x55f: 0xda, + 0x560: 0xda, 0x561: 0xda, 0x562: 0xda, 0x563: 0xda, 0x564: 0xda, 0x565: 0xda, 0x566: 0xda, 0x567: 0xda, + 0x568: 0xda, 0x569: 0xda, 0x56a: 0xda, 0x56b: 0xda, 0x56c: 0xda, 0x56d: 0xda, 0x56e: 0xda, 0x56f: 0xda, + 0x570: 0xda, 0x571: 0xda, 0x572: 0xda, 0x573: 0xda, 0x574: 0xda, 0x575: 0xda, 0x576: 0xda, 0x577: 0xda, + 0x578: 0xda, 0x579: 0xda, 0x57a: 0xda, 0x57b: 0xda, 0x57c: 0xda, 0x57d: 0xda, 0x57e: 0xda, 0x57f: 0xda, + // Block 0x16, offset 0x580 + 0x58f: 0x10, + 0x59f: 0x10, + 0x5a0: 0x13, + 0x5af: 0x10, + 0x5bf: 0x10, + // Block 0x17, offset 0x5c0 + 0x5cf: 0x10, +} + +// Total table size 15800 bytes (15KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/bidi/trieval.go b/vendor/golang.org/x/text/unicode/bidi/trieval.go new file mode 100644 index 00000000..4c459c4b --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/trieval.go @@ -0,0 +1,60 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package bidi + +// Class is the Unicode BiDi class. Each rune has a single class. +type Class uint + +const ( + L Class = iota // LeftToRight + R // RightToLeft + EN // EuropeanNumber + ES // EuropeanSeparator + ET // EuropeanTerminator + AN // ArabicNumber + CS // CommonSeparator + B // ParagraphSeparator + S // SegmentSeparator + WS // WhiteSpace + ON // OtherNeutral + BN // BoundaryNeutral + NSM // NonspacingMark + AL // ArabicLetter + Control // Control LRO - PDI + + numClass + + LRO // LeftToRightOverride + RLO // RightToLeftOverride + LRE // LeftToRightEmbedding + RLE // RightToLeftEmbedding + PDF // PopDirectionalFormat + LRI // LeftToRightIsolate + RLI // RightToLeftIsolate + FSI // FirstStrongIsolate + PDI // PopDirectionalIsolate + + unknownClass = ^Class(0) +) + +var controlToClass = map[rune]Class{ + 0x202D: LRO, // LeftToRightOverride, + 0x202E: RLO, // RightToLeftOverride, + 0x202A: LRE, // LeftToRightEmbedding, + 0x202B: RLE, // RightToLeftEmbedding, + 0x202C: PDF, // PopDirectionalFormat, + 0x2066: LRI, // LeftToRightIsolate, + 0x2067: RLI, // RightToLeftIsolate, + 0x2068: FSI, // FirstStrongIsolate, + 0x2069: PDI, // PopDirectionalIsolate, +} + +// A trie entry has the following bits: +// 7..5 XOR mask for brackets +// 4 1: Bracket open, 0: Bracket close +// 3..0 Class type + +const ( + openMask = 0x10 + xorMaskShift = 5 +) diff --git a/vendor/golang.org/x/text/unicode/norm/maketables.go b/vendor/golang.org/x/text/unicode/norm/maketables.go deleted file mode 100644 index 30a3aa93..00000000 --- a/vendor/golang.org/x/text/unicode/norm/maketables.go +++ /dev/null @@ -1,986 +0,0 @@ -// 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. - -// +build ignore - -// Normalization table generator. -// Data read from the web. -// See forminfo.go for a description of the trie values associated with each rune. - -package main - -import ( - "bytes" - "encoding/binary" - "flag" - "fmt" - "io" - "log" - "sort" - "strconv" - "strings" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" -) - -func main() { - gen.Init() - loadUnicodeData() - compactCCC() - loadCompositionExclusions() - completeCharFields(FCanonical) - completeCharFields(FCompatibility) - computeNonStarterCounts() - verifyComputed() - printChars() - testDerived() - printTestdata() - makeTables() -} - -var ( - tablelist = flag.String("tables", - "all", - "comma-separated list of which tables to generate; "+ - "can be 'decomp', 'recomp', 'info' and 'all'") - test = flag.Bool("test", - false, - "test existing tables against DerivedNormalizationProps and generate test data for regression testing") - verbose = flag.Bool("verbose", - false, - "write data to stdout as it is parsed") -) - -const MaxChar = 0x10FFFF // anything above this shouldn't exist - -// Quick Check properties of runes allow us to quickly -// determine whether a rune may occur in a normal form. -// For a given normal form, a rune may be guaranteed to occur -// verbatim (QC=Yes), may or may not combine with another -// rune (QC=Maybe), or may not occur (QC=No). -type QCResult int - -const ( - QCUnknown QCResult = iota - QCYes - QCNo - QCMaybe -) - -func (r QCResult) String() string { - switch r { - case QCYes: - return "Yes" - case QCNo: - return "No" - case QCMaybe: - return "Maybe" - } - return "***UNKNOWN***" -} - -const ( - FCanonical = iota // NFC or NFD - FCompatibility // NFKC or NFKD - FNumberOfFormTypes -) - -const ( - MComposed = iota // NFC or NFKC - MDecomposed // NFD or NFKD - MNumberOfModes -) - -// This contains only the properties we're interested in. -type Char struct { - name string - codePoint rune // if zero, this index is not a valid code point. - ccc uint8 // canonical combining class - origCCC uint8 - excludeInComp bool // from CompositionExclusions.txt - compatDecomp bool // it has a compatibility expansion - - nTrailingNonStarters uint8 - nLeadingNonStarters uint8 // must be equal to trailing if non-zero - - forms [FNumberOfFormTypes]FormInfo // For FCanonical and FCompatibility - - state State -} - -var chars = make([]Char, MaxChar+1) -var cccMap = make(map[uint8]uint8) - -func (c Char) String() string { - buf := new(bytes.Buffer) - - fmt.Fprintf(buf, "%U [%s]:\n", c.codePoint, c.name) - fmt.Fprintf(buf, " ccc: %v\n", c.ccc) - fmt.Fprintf(buf, " excludeInComp: %v\n", c.excludeInComp) - fmt.Fprintf(buf, " compatDecomp: %v\n", c.compatDecomp) - fmt.Fprintf(buf, " state: %v\n", c.state) - fmt.Fprintf(buf, " NFC:\n") - fmt.Fprint(buf, c.forms[FCanonical]) - fmt.Fprintf(buf, " NFKC:\n") - fmt.Fprint(buf, c.forms[FCompatibility]) - - return buf.String() -} - -// In UnicodeData.txt, some ranges are marked like this: -// 3400;;Lo;0;L;;;;;N;;;;; -// 4DB5;;Lo;0;L;;;;;N;;;;; -// parseCharacter keeps a state variable indicating the weirdness. -type State int - -const ( - SNormal State = iota // known to be zero for the type - SFirst - SLast - SMissing -) - -var lastChar = rune('\u0000') - -func (c Char) isValid() bool { - return c.codePoint != 0 && c.state != SMissing -} - -type FormInfo struct { - quickCheck [MNumberOfModes]QCResult // index: MComposed or MDecomposed - verified [MNumberOfModes]bool // index: MComposed or MDecomposed - - combinesForward bool // May combine with rune on the right - combinesBackward bool // May combine with rune on the left - isOneWay bool // Never appears in result - inDecomp bool // Some decompositions result in this char. - decomp Decomposition - expandedDecomp Decomposition -} - -func (f FormInfo) String() string { - buf := bytes.NewBuffer(make([]byte, 0)) - - fmt.Fprintf(buf, " quickCheck[C]: %v\n", f.quickCheck[MComposed]) - fmt.Fprintf(buf, " quickCheck[D]: %v\n", f.quickCheck[MDecomposed]) - fmt.Fprintf(buf, " cmbForward: %v\n", f.combinesForward) - fmt.Fprintf(buf, " cmbBackward: %v\n", f.combinesBackward) - fmt.Fprintf(buf, " isOneWay: %v\n", f.isOneWay) - fmt.Fprintf(buf, " inDecomp: %v\n", f.inDecomp) - fmt.Fprintf(buf, " decomposition: %X\n", f.decomp) - fmt.Fprintf(buf, " expandedDecomp: %X\n", f.expandedDecomp) - - return buf.String() -} - -type Decomposition []rune - -func parseDecomposition(s string, skipfirst bool) (a []rune, err error) { - decomp := strings.Split(s, " ") - if len(decomp) > 0 && skipfirst { - decomp = decomp[1:] - } - for _, d := range decomp { - point, err := strconv.ParseUint(d, 16, 64) - if err != nil { - return a, err - } - a = append(a, rune(point)) - } - return a, nil -} - -func loadUnicodeData() { - f := gen.OpenUCDFile("UnicodeData.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - r := p.Rune(ucd.CodePoint) - char := &chars[r] - - char.ccc = uint8(p.Uint(ucd.CanonicalCombiningClass)) - decmap := p.String(ucd.DecompMapping) - - exp, err := parseDecomposition(decmap, false) - isCompat := false - if err != nil { - if len(decmap) > 0 { - exp, err = parseDecomposition(decmap, true) - if err != nil { - log.Fatalf(`%U: bad decomp |%v|: "%s"`, r, decmap, err) - } - isCompat = true - } - } - - char.name = p.String(ucd.Name) - char.codePoint = r - char.forms[FCompatibility].decomp = exp - if !isCompat { - char.forms[FCanonical].decomp = exp - } else { - char.compatDecomp = true - } - if len(decmap) > 0 { - char.forms[FCompatibility].decomp = exp - } - } - if err := p.Err(); err != nil { - log.Fatal(err) - } -} - -// compactCCC converts the sparse set of CCC values to a continguous one, -// reducing the number of bits needed from 8 to 6. -func compactCCC() { - m := make(map[uint8]uint8) - for i := range chars { - c := &chars[i] - m[c.ccc] = 0 - } - cccs := []int{} - for v, _ := range m { - cccs = append(cccs, int(v)) - } - sort.Ints(cccs) - for i, c := range cccs { - cccMap[uint8(i)] = uint8(c) - m[uint8(c)] = uint8(i) - } - for i := range chars { - c := &chars[i] - c.origCCC = c.ccc - c.ccc = m[c.ccc] - } - if len(m) >= 1<<6 { - log.Fatalf("too many difference CCC values: %d >= 64", len(m)) - } -} - -// CompositionExclusions.txt has form: -// 0958 # ... -// See https://unicode.org/reports/tr44/ for full explanation -func loadCompositionExclusions() { - f := gen.OpenUCDFile("CompositionExclusions.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - c := &chars[p.Rune(0)] - if c.excludeInComp { - log.Fatalf("%U: Duplicate entry in exclusions.", c.codePoint) - } - c.excludeInComp = true - } - if e := p.Err(); e != nil { - log.Fatal(e) - } -} - -// hasCompatDecomp returns true if any of the recursive -// decompositions contains a compatibility expansion. -// In this case, the character may not occur in NFK*. -func hasCompatDecomp(r rune) bool { - c := &chars[r] - if c.compatDecomp { - return true - } - for _, d := range c.forms[FCompatibility].decomp { - if hasCompatDecomp(d) { - return true - } - } - return false -} - -// Hangul related constants. -const ( - HangulBase = 0xAC00 - HangulEnd = 0xD7A4 // hangulBase + Jamo combinations (19 * 21 * 28) - - JamoLBase = 0x1100 - JamoLEnd = 0x1113 - JamoVBase = 0x1161 - JamoVEnd = 0x1176 - JamoTBase = 0x11A8 - JamoTEnd = 0x11C3 - - JamoLVTCount = 19 * 21 * 28 - JamoTCount = 28 -) - -func isHangul(r rune) bool { - return HangulBase <= r && r < HangulEnd -} - -func isHangulWithoutJamoT(r rune) bool { - if !isHangul(r) { - return false - } - r -= HangulBase - return r < JamoLVTCount && r%JamoTCount == 0 -} - -func ccc(r rune) uint8 { - return chars[r].ccc -} - -// Insert a rune in a buffer, ordered by Canonical Combining Class. -func insertOrdered(b Decomposition, r rune) Decomposition { - n := len(b) - b = append(b, 0) - cc := ccc(r) - if cc > 0 { - // Use bubble sort. - for ; n > 0; n-- { - if ccc(b[n-1]) <= cc { - break - } - b[n] = b[n-1] - } - } - b[n] = r - return b -} - -// Recursively decompose. -func decomposeRecursive(form int, r rune, d Decomposition) Decomposition { - dcomp := chars[r].forms[form].decomp - if len(dcomp) == 0 { - return insertOrdered(d, r) - } - for _, c := range dcomp { - d = decomposeRecursive(form, c, d) - } - return d -} - -func completeCharFields(form int) { - // Phase 0: pre-expand decomposition. - for i := range chars { - f := &chars[i].forms[form] - if len(f.decomp) == 0 { - continue - } - exp := make(Decomposition, 0) - for _, c := range f.decomp { - exp = decomposeRecursive(form, c, exp) - } - f.expandedDecomp = exp - } - - // Phase 1: composition exclusion, mark decomposition. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - // Marks script-specific exclusions and version restricted. - f.isOneWay = c.excludeInComp - - // Singletons - f.isOneWay = f.isOneWay || len(f.decomp) == 1 - - // Non-starter decompositions - if len(f.decomp) > 1 { - chk := c.ccc != 0 || chars[f.decomp[0]].ccc != 0 - f.isOneWay = f.isOneWay || chk - } - - // Runes that decompose into more than two runes. - f.isOneWay = f.isOneWay || len(f.decomp) > 2 - - if form == FCompatibility { - f.isOneWay = f.isOneWay || hasCompatDecomp(c.codePoint) - } - - for _, r := range f.decomp { - chars[r].forms[form].inDecomp = true - } - } - - // Phase 2: forward and backward combining. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - if !f.isOneWay && len(f.decomp) == 2 { - f0 := &chars[f.decomp[0]].forms[form] - f1 := &chars[f.decomp[1]].forms[form] - if !f0.isOneWay { - f0.combinesForward = true - } - if !f1.isOneWay { - f1.combinesBackward = true - } - } - if isHangulWithoutJamoT(rune(i)) { - f.combinesForward = true - } - } - - // Phase 3: quick check values. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - switch { - case len(f.decomp) > 0: - f.quickCheck[MDecomposed] = QCNo - case isHangul(rune(i)): - f.quickCheck[MDecomposed] = QCNo - default: - f.quickCheck[MDecomposed] = QCYes - } - switch { - case f.isOneWay: - f.quickCheck[MComposed] = QCNo - case (i & 0xffff00) == JamoLBase: - f.quickCheck[MComposed] = QCYes - if JamoLBase <= i && i < JamoLEnd { - f.combinesForward = true - } - if JamoVBase <= i && i < JamoVEnd { - f.quickCheck[MComposed] = QCMaybe - f.combinesBackward = true - f.combinesForward = true - } - if JamoTBase <= i && i < JamoTEnd { - f.quickCheck[MComposed] = QCMaybe - f.combinesBackward = true - } - case !f.combinesBackward: - f.quickCheck[MComposed] = QCYes - default: - f.quickCheck[MComposed] = QCMaybe - } - } -} - -func computeNonStarterCounts() { - // Phase 4: leading and trailing non-starter count - for i := range chars { - c := &chars[i] - - runes := []rune{rune(i)} - // We always use FCompatibility so that the CGJ insertion points do not - // change for repeated normalizations with different forms. - if exp := c.forms[FCompatibility].expandedDecomp; len(exp) > 0 { - runes = exp - } - // We consider runes that combine backwards to be non-starters for the - // purpose of Stream-Safe Text Processing. - for _, r := range runes { - if cr := &chars[r]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { - break - } - c.nLeadingNonStarters++ - } - for i := len(runes) - 1; i >= 0; i-- { - if cr := &chars[runes[i]]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { - break - } - c.nTrailingNonStarters++ - } - if c.nTrailingNonStarters > 3 { - log.Fatalf("%U: Decomposition with more than 3 (%d) trailing modifiers (%U)", i, c.nTrailingNonStarters, runes) - } - - if isHangul(rune(i)) { - c.nTrailingNonStarters = 2 - if isHangulWithoutJamoT(rune(i)) { - c.nTrailingNonStarters = 1 - } - } - - if l, t := c.nLeadingNonStarters, c.nTrailingNonStarters; l > 0 && l != t { - log.Fatalf("%U: number of leading and trailing non-starters should be equal (%d vs %d)", i, l, t) - } - if t := c.nTrailingNonStarters; t > 3 { - log.Fatalf("%U: number of trailing non-starters is %d > 3", t) - } - } -} - -func printBytes(w io.Writer, b []byte, name string) { - fmt.Fprintf(w, "// %s: %d bytes\n", name, len(b)) - fmt.Fprintf(w, "var %s = [...]byte {", name) - for i, c := range b { - switch { - case i%64 == 0: - fmt.Fprintf(w, "\n// Bytes %x - %x\n", i, i+63) - case i%8 == 0: - fmt.Fprintf(w, "\n") - } - fmt.Fprintf(w, "0x%.2X, ", c) - } - fmt.Fprint(w, "\n}\n\n") -} - -// See forminfo.go for format. -func makeEntry(f *FormInfo, c *Char) uint16 { - e := uint16(0) - if r := c.codePoint; HangulBase <= r && r < HangulEnd { - e |= 0x40 - } - if f.combinesForward { - e |= 0x20 - } - if f.quickCheck[MDecomposed] == QCNo { - e |= 0x4 - } - switch f.quickCheck[MComposed] { - case QCYes: - case QCNo: - e |= 0x10 - case QCMaybe: - e |= 0x18 - default: - log.Fatalf("Illegal quickcheck value %v.", f.quickCheck[MComposed]) - } - e |= uint16(c.nTrailingNonStarters) - return e -} - -// decompSet keeps track of unique decompositions, grouped by whether -// the decomposition is followed by a trailing and/or leading CCC. -type decompSet [7]map[string]bool - -const ( - normalDecomp = iota - firstMulti - firstCCC - endMulti - firstLeadingCCC - firstCCCZeroExcept - firstStarterWithNLead - lastDecomp -) - -var cname = []string{"firstMulti", "firstCCC", "endMulti", "firstLeadingCCC", "firstCCCZeroExcept", "firstStarterWithNLead", "lastDecomp"} - -func makeDecompSet() decompSet { - m := decompSet{} - for i := range m { - m[i] = make(map[string]bool) - } - return m -} -func (m *decompSet) insert(key int, s string) { - m[key][s] = true -} - -func printCharInfoTables(w io.Writer) int { - mkstr := func(r rune, f *FormInfo) (int, string) { - d := f.expandedDecomp - s := string([]rune(d)) - if max := 1 << 6; len(s) >= max { - const msg = "%U: too many bytes in decomposition: %d >= %d" - log.Fatalf(msg, r, len(s), max) - } - head := uint8(len(s)) - if f.quickCheck[MComposed] != QCYes { - head |= 0x40 - } - if f.combinesForward { - head |= 0x80 - } - s = string([]byte{head}) + s - - lccc := ccc(d[0]) - tccc := ccc(d[len(d)-1]) - cc := ccc(r) - if cc != 0 && lccc == 0 && tccc == 0 { - log.Fatalf("%U: trailing and leading ccc are 0 for non-zero ccc %d", r, cc) - } - if tccc < lccc && lccc != 0 { - const msg = "%U: lccc (%d) must be <= tcc (%d)" - log.Fatalf(msg, r, lccc, tccc) - } - index := normalDecomp - nTrail := chars[r].nTrailingNonStarters - nLead := chars[r].nLeadingNonStarters - if tccc > 0 || lccc > 0 || nTrail > 0 { - tccc <<= 2 - tccc |= nTrail - s += string([]byte{tccc}) - index = endMulti - for _, r := range d[1:] { - if ccc(r) == 0 { - index = firstCCC - } - } - if lccc > 0 || nLead > 0 { - s += string([]byte{lccc}) - if index == firstCCC { - log.Fatalf("%U: multi-segment decomposition not supported for decompositions with leading CCC != 0", r) - } - index = firstLeadingCCC - } - if cc != lccc { - if cc != 0 { - log.Fatalf("%U: for lccc != ccc, expected ccc to be 0; was %d", r, cc) - } - index = firstCCCZeroExcept - } - } else if len(d) > 1 { - index = firstMulti - } - return index, s - } - - decompSet := makeDecompSet() - const nLeadStr = "\x00\x01" // 0-byte length and tccc with nTrail. - decompSet.insert(firstStarterWithNLead, nLeadStr) - - // Store the uniqued decompositions in a byte buffer, - // preceded by their byte length. - for _, c := range chars { - for _, f := range c.forms { - if len(f.expandedDecomp) == 0 { - continue - } - if f.combinesBackward { - log.Fatalf("%U: combinesBackward and decompose", c.codePoint) - } - index, s := mkstr(c.codePoint, &f) - decompSet.insert(index, s) - } - } - - decompositions := bytes.NewBuffer(make([]byte, 0, 10000)) - size := 0 - positionMap := make(map[string]uint16) - decompositions.WriteString("\000") - fmt.Fprintln(w, "const (") - for i, m := range decompSet { - sa := []string{} - for s := range m { - sa = append(sa, s) - } - sort.Strings(sa) - for _, s := range sa { - p := decompositions.Len() - decompositions.WriteString(s) - positionMap[s] = uint16(p) - } - if cname[i] != "" { - fmt.Fprintf(w, "%s = 0x%X\n", cname[i], decompositions.Len()) - } - } - fmt.Fprintln(w, "maxDecomp = 0x8000") - fmt.Fprintln(w, ")") - b := decompositions.Bytes() - printBytes(w, b, "decomps") - size += len(b) - - varnames := []string{"nfc", "nfkc"} - for i := 0; i < FNumberOfFormTypes; i++ { - trie := triegen.NewTrie(varnames[i]) - - for r, c := range chars { - f := c.forms[i] - d := f.expandedDecomp - if len(d) != 0 { - _, key := mkstr(c.codePoint, &f) - trie.Insert(rune(r), uint64(positionMap[key])) - if c.ccc != ccc(d[0]) { - // We assume the lead ccc of a decomposition !=0 in this case. - if ccc(d[0]) == 0 { - log.Fatalf("Expected leading CCC to be non-zero; ccc is %d", c.ccc) - } - } - } else if c.nLeadingNonStarters > 0 && len(f.expandedDecomp) == 0 && c.ccc == 0 && !f.combinesBackward { - // Handle cases where it can't be detected that the nLead should be equal - // to nTrail. - trie.Insert(c.codePoint, uint64(positionMap[nLeadStr])) - } else if v := makeEntry(&f, &c)<<8 | uint16(c.ccc); v != 0 { - trie.Insert(c.codePoint, uint64(0x8000|v)) - } - } - sz, err := trie.Gen(w, triegen.Compact(&normCompacter{name: varnames[i]})) - if err != nil { - log.Fatal(err) - } - size += sz - } - return size -} - -func contains(sa []string, s string) bool { - for _, a := range sa { - if a == s { - return true - } - } - return false -} - -func makeTables() { - w := &bytes.Buffer{} - - size := 0 - if *tablelist == "" { - return - } - list := strings.Split(*tablelist, ",") - if *tablelist == "all" { - list = []string{"recomp", "info"} - } - - // Compute maximum decomposition size. - max := 0 - for _, c := range chars { - if n := len(string(c.forms[FCompatibility].expandedDecomp)); n > max { - max = n - } - } - fmt.Fprintln(w, `import "sync"`) - fmt.Fprintln(w) - - fmt.Fprintln(w, "const (") - fmt.Fprintln(w, "\t// Version is the Unicode edition from which the tables are derived.") - fmt.Fprintf(w, "\tVersion = %q\n", gen.UnicodeVersion()) - fmt.Fprintln(w) - fmt.Fprintln(w, "\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform") - fmt.Fprintln(w, "\t// may need to write atomically for any Form. Making a destination buffer at") - fmt.Fprintln(w, "\t// least this size ensures that Transform can always make progress and that") - fmt.Fprintln(w, "\t// the user does not need to grow the buffer on an ErrShortDst.") - fmt.Fprintf(w, "\tMaxTransformChunkSize = %d+maxNonStarters*4\n", len(string(0x034F))+max) - fmt.Fprintln(w, ")\n") - - // Print the CCC remap table. - size += len(cccMap) - fmt.Fprintf(w, "var ccc = [%d]uint8{", len(cccMap)) - for i := 0; i < len(cccMap); i++ { - if i%8 == 0 { - fmt.Fprintln(w) - } - fmt.Fprintf(w, "%3d, ", cccMap[uint8(i)]) - } - fmt.Fprintln(w, "\n}\n") - - if contains(list, "info") { - size += printCharInfoTables(w) - } - - if contains(list, "recomp") { - // Note that we use 32 bit keys, instead of 64 bit. - // This clips the bits of three entries, but we know - // this won't cause a collision. The compiler will catch - // any changes made to UnicodeData.txt that introduces - // a collision. - // Note that the recomposition map for NFC and NFKC - // are identical. - - // Recomposition map - nrentries := 0 - for _, c := range chars { - f := c.forms[FCanonical] - if !f.isOneWay && len(f.decomp) > 0 { - nrentries++ - } - } - sz := nrentries * 8 - size += sz - fmt.Fprintf(w, "// recompMap: %d bytes (entries only)\n", sz) - fmt.Fprintln(w, "var recompMap map[uint32]rune") - fmt.Fprintln(w, "var recompMapOnce sync.Once\n") - fmt.Fprintln(w, `const recompMapPacked = "" +`) - var buf [8]byte - for i, c := range chars { - f := c.forms[FCanonical] - d := f.decomp - if !f.isOneWay && len(d) > 0 { - key := uint32(uint16(d[0]))<<16 + uint32(uint16(d[1])) - binary.BigEndian.PutUint32(buf[:4], key) - binary.BigEndian.PutUint32(buf[4:], uint32(i)) - fmt.Fprintf(w, "\t\t%q + // 0x%.8X: 0x%.8X\n", string(buf[:]), key, uint32(i)) - } - } - // hack so we don't have to special case the trailing plus sign - fmt.Fprintf(w, ` ""`) - fmt.Fprintln(w) - } - - fmt.Fprintf(w, "// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size) - gen.WriteVersionedGoFile("tables.go", "norm", w.Bytes()) -} - -func printChars() { - if *verbose { - for _, c := range chars { - if !c.isValid() || c.state == SMissing { - continue - } - fmt.Println(c) - } - } -} - -// verifyComputed does various consistency tests. -func verifyComputed() { - for i, c := range chars { - for _, f := range c.forms { - isNo := (f.quickCheck[MDecomposed] == QCNo) - if (len(f.decomp) > 0) != isNo && !isHangul(rune(i)) { - log.Fatalf("%U: NF*D QC must be No if rune decomposes", i) - } - - isMaybe := f.quickCheck[MComposed] == QCMaybe - if f.combinesBackward != isMaybe { - log.Fatalf("%U: NF*C QC must be Maybe if combinesBackward", i) - } - if len(f.decomp) > 0 && f.combinesForward && isMaybe { - log.Fatalf("%U: NF*C QC must be Yes or No if combinesForward and decomposes", i) - } - - if len(f.expandedDecomp) != 0 { - continue - } - if a, b := c.nLeadingNonStarters > 0, (c.ccc > 0 || f.combinesBackward); a != b { - // We accept these runes to be treated differently (it only affects - // segment breaking in iteration, most likely on improper use), but - // reconsider if more characters are added. - // U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; - // U+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; - // U+3133 HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; - // U+318E HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; - // U+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; - // U+FFDC HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; - if i != 0xFF9E && i != 0xFF9F && !(0x3133 <= i && i <= 0x318E) && !(0xFFA3 <= i && i <= 0xFFDC) { - log.Fatalf("%U: nLead was %v; want %v", i, a, b) - } - } - } - nfc := c.forms[FCanonical] - nfkc := c.forms[FCompatibility] - if nfc.combinesBackward != nfkc.combinesBackward { - log.Fatalf("%U: Cannot combine combinesBackward\n", c.codePoint) - } - } -} - -// Use values in DerivedNormalizationProps.txt to compare against the -// values we computed. -// DerivedNormalizationProps.txt has form: -// 00C0..00C5 ; NFD_QC; N # ... -// 0374 ; NFD_QC; N # ... -// See https://unicode.org/reports/tr44/ for full explanation -func testDerived() { - f := gen.OpenUCDFile("DerivedNormalizationProps.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - r := p.Rune(0) - c := &chars[r] - - var ftype, mode int - qt := p.String(1) - switch qt { - case "NFC_QC": - ftype, mode = FCanonical, MComposed - case "NFD_QC": - ftype, mode = FCanonical, MDecomposed - case "NFKC_QC": - ftype, mode = FCompatibility, MComposed - case "NFKD_QC": - ftype, mode = FCompatibility, MDecomposed - default: - continue - } - var qr QCResult - switch p.String(2) { - case "Y": - qr = QCYes - case "N": - qr = QCNo - case "M": - qr = QCMaybe - default: - log.Fatalf(`Unexpected quick check value "%s"`, p.String(2)) - } - if got := c.forms[ftype].quickCheck[mode]; got != qr { - log.Printf("%U: FAILED %s (was %v need %v)\n", r, qt, got, qr) - } - c.forms[ftype].verified[mode] = true - } - if err := p.Err(); err != nil { - log.Fatal(err) - } - // Any unspecified value must be QCYes. Verify this. - for i, c := range chars { - for j, fd := range c.forms { - for k, qr := range fd.quickCheck { - if !fd.verified[k] && qr != QCYes { - m := "%U: FAIL F:%d M:%d (was %v need Yes) %s\n" - log.Printf(m, i, j, k, qr, c.name) - } - } - } - } -} - -var testHeader = `const ( - Yes = iota - No - Maybe -) - -type formData struct { - qc uint8 - combinesForward bool - decomposition string -} - -type runeData struct { - r rune - ccc uint8 - nLead uint8 - nTrail uint8 - f [2]formData // 0: canonical; 1: compatibility -} - -func f(qc uint8, cf bool, dec string) [2]formData { - return [2]formData{{qc, cf, dec}, {qc, cf, dec}} -} - -func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData { - return [2]formData{{qc, cf, d}, {qck, cfk, dk}} -} - -var testData = []runeData{ -` - -func printTestdata() { - type lastInfo struct { - ccc uint8 - nLead uint8 - nTrail uint8 - f string - } - - last := lastInfo{} - w := &bytes.Buffer{} - fmt.Fprintf(w, testHeader) - for r, c := range chars { - f := c.forms[FCanonical] - qc, cf, d := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) - f = c.forms[FCompatibility] - qck, cfk, dk := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) - s := "" - if d == dk && qc == qck && cf == cfk { - s = fmt.Sprintf("f(%s, %v, %q)", qc, cf, d) - } else { - s = fmt.Sprintf("g(%s, %s, %v, %v, %q, %q)", qc, qck, cf, cfk, d, dk) - } - current := lastInfo{c.ccc, c.nLeadingNonStarters, c.nTrailingNonStarters, s} - if last != current { - fmt.Fprintf(w, "\t{0x%x, %d, %d, %d, %s},\n", r, c.origCCC, c.nLeadingNonStarters, c.nTrailingNonStarters, s) - last = current - } - } - fmt.Fprintln(w, "}") - gen.WriteVersionedGoFile("data_test.go", "norm", w.Bytes()) -} diff --git a/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go index 7297cce3..2c58f09b 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go @@ -1,6 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -// +build go1.13 +// +build go1.13,!go1.14 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go new file mode 100644 index 00000000..10f5202c --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go @@ -0,0 +1,7710 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// +build go1.14 + +package norm + +import "sync" + +const ( + // Version is the Unicode edition from which the tables are derived. + Version = "12.0.0" + + // MaxTransformChunkSize indicates the maximum number of bytes that Transform + // may need to write atomically for any Form. Making a destination buffer at + // least this size ensures that Transform can always make progress and that + // the user does not need to grow the buffer on an ErrShortDst. + MaxTransformChunkSize = 35 + maxNonStarters*4 +) + +var ccc = [55]uint8{ + 0, 1, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, + 84, 91, 103, 107, 118, 122, 129, 130, + 132, 202, 214, 216, 218, 220, 222, 224, + 226, 228, 230, 232, 233, 234, 240, +} + +const ( + firstMulti = 0x186D + firstCCC = 0x2CA1 + endMulti = 0x2F63 + firstLeadingCCC = 0x49B1 + firstCCCZeroExcept = 0x4A7B + firstStarterWithNLead = 0x4AA2 + lastDecomp = 0x4AA4 + maxDecomp = 0x8000 +) + +// decomps: 19108 bytes +var decomps = [...]byte{ + // Bytes 0 - 3f + 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, + 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, + 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, + 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, + 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, + 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, + 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, + 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, + // Bytes 40 - 7f + 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, + 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, + 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, + 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, + 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, + 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, + 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, + // Bytes 80 - bf + 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, + 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, + 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, + 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, + 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, + 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, + 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, + 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, + // Bytes c0 - ff + 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5, + 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2, + 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42, + 0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, + 0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, + 0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, + 0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, + 0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, + // Bytes 100 - 13f + 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42, + 0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F, + 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9, + 0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42, + 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB, + 0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9, + 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42, + 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5, + // Bytes 140 - 17f + 0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, + 0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42, + 0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A, + 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA, + 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42, + 0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F, + 0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE, + 0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42, + // Bytes 180 - 1bf + 0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97, + 0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE, + 0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42, + 0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F, + 0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE, + 0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42, + 0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8, + 0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE, + // Bytes 1c0 - 1ff + 0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42, + 0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7, + 0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE, + 0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42, + 0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF, + 0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF, + 0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42, + 0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87, + // Bytes 200 - 23f + 0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF, + 0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42, + 0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90, + 0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7, + 0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42, + 0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2, + 0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8, + 0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42, + // Bytes 240 - 27f + 0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB, + 0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8, + 0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42, + 0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3, + 0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8, + 0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42, + 0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81, + 0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9, + // Bytes 280 - 2bf + 0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42, + 0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89, + 0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9, + 0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42, + 0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE, + 0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA, + 0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42, + 0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C, + // Bytes 2c0 - 2ff + 0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA, + 0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42, + 0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9, + 0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA, + 0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42, + 0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81, + 0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB, + 0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42, + // Bytes 300 - 33f + 0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90, + 0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43, + 0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43, + 0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43, + 0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43, + 0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43, + 0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43, + 0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43, + // Bytes 340 - 37f + 0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43, + 0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43, + 0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43, + 0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43, + 0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43, + 0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43, + 0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43, + 0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43, + // Bytes 380 - 3bf + 0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43, + 0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43, + 0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43, + 0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43, + 0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43, + 0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43, + 0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43, + 0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43, + // Bytes 3c0 - 3ff + 0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43, + 0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43, + 0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43, + 0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43, + 0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43, + 0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43, + 0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43, + 0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43, + // Bytes 400 - 43f + 0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43, + 0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43, + 0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43, + 0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43, + 0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43, + 0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43, + 0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43, + 0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, + // Bytes 440 - 47f + 0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, + 0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, + 0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, + 0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, + 0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, + 0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, + 0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, + 0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, + // Bytes 480 - 4bf + 0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43, + 0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43, + 0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43, + 0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43, + 0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43, + 0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43, + 0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43, + 0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43, + // Bytes 4c0 - 4ff + 0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43, + 0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43, + 0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43, + 0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43, + 0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43, + 0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43, + 0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43, + 0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43, + // Bytes 500 - 53f + 0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43, + 0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43, + 0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43, + 0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43, + 0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43, + 0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43, + 0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43, + 0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43, + // Bytes 540 - 57f + 0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43, + 0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43, + 0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43, + 0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43, + 0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43, + 0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43, + 0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43, + 0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43, + // Bytes 580 - 5bf + 0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43, + 0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43, + 0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43, + 0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43, + 0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43, + 0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43, + 0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43, + 0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43, + // Bytes 5c0 - 5ff + 0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43, + 0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43, + 0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43, + 0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43, + 0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43, + 0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43, + 0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43, + 0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43, + // Bytes 600 - 63f + 0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43, + 0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43, + 0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43, + 0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43, + 0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43, + 0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43, + 0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43, + 0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43, + // Bytes 640 - 67f + 0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43, + 0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43, + 0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43, + 0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43, + 0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43, + 0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43, + 0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43, + 0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43, + // Bytes 680 - 6bf + 0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43, + 0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43, + 0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43, + 0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43, + 0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43, + 0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43, + 0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43, + 0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43, + // Bytes 6c0 - 6ff + 0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43, + 0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43, + 0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43, + 0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43, + 0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43, + 0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43, + 0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43, + 0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43, + // Bytes 700 - 73f + 0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43, + 0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43, + 0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43, + 0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43, + 0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43, + 0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43, + 0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43, + 0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43, + // Bytes 740 - 77f + 0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43, + 0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43, + 0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43, + 0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43, + 0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43, + 0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43, + 0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43, + 0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43, + // Bytes 780 - 7bf + 0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43, + 0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43, + 0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43, + 0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43, + 0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43, + 0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43, + 0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43, + 0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43, + // Bytes 7c0 - 7ff + 0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43, + 0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43, + 0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43, + 0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43, + 0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43, + 0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43, + 0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43, + 0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43, + // Bytes 800 - 83f + 0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43, + 0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43, + 0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43, + 0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43, + 0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43, + 0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43, + 0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43, + 0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43, + // Bytes 840 - 87f + 0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43, + 0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43, + 0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43, + 0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43, + 0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43, + 0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43, + 0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43, + 0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43, + // Bytes 880 - 8bf + 0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43, + 0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43, + 0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43, + 0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43, + 0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43, + 0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43, + 0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43, + 0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43, + // Bytes 8c0 - 8ff + 0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43, + 0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43, + 0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43, + 0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43, + 0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43, + 0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43, + 0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43, + 0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43, + // Bytes 900 - 93f + 0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43, + 0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43, + 0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43, + 0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43, + 0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43, + 0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43, + 0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43, + 0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43, + // Bytes 940 - 97f + 0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43, + 0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43, + 0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43, + 0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43, + 0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43, + 0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43, + 0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43, + 0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43, + // Bytes 980 - 9bf + 0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43, + 0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43, + 0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43, + 0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43, + 0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43, + 0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43, + 0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43, + 0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43, + // Bytes 9c0 - 9ff + 0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43, + 0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43, + 0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43, + 0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43, + 0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43, + 0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43, + 0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43, + 0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43, + // Bytes a00 - a3f + 0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43, + 0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43, + 0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43, + 0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43, + 0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43, + 0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43, + 0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43, + 0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43, + // Bytes a40 - a7f + 0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43, + 0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43, + 0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43, + 0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43, + 0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43, + 0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43, + 0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43, + 0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43, + // Bytes a80 - abf + 0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43, + 0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43, + 0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43, + 0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43, + 0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43, + 0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43, + 0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43, + 0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43, + // Bytes ac0 - aff + 0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43, + 0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43, + 0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43, + 0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43, + 0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43, + 0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43, + 0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43, + 0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43, + // Bytes b00 - b3f + 0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43, + 0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43, + 0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43, + 0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43, + 0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43, + 0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43, + 0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43, + 0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43, + // Bytes b40 - b7f + 0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43, + 0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43, + 0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43, + 0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43, + 0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43, + 0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43, + 0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43, + 0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43, + // Bytes b80 - bbf + 0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43, + 0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43, + 0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43, + 0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43, + 0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43, + 0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43, + 0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43, + 0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43, + // Bytes bc0 - bff + 0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43, + 0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43, + 0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43, + 0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43, + 0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43, + 0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43, + 0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43, + 0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43, + // Bytes c00 - c3f + 0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43, + 0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43, + 0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43, + 0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43, + 0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43, + 0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43, + 0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43, + 0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43, + // Bytes c40 - c7f + 0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43, + 0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43, + 0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43, + 0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43, + 0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43, + 0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43, + 0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43, + 0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43, + // Bytes c80 - cbf + 0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43, + 0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43, + 0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43, + 0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43, + 0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43, + 0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43, + 0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43, + 0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43, + // Bytes cc0 - cff + 0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43, + 0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43, + 0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43, + 0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43, + 0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43, + 0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43, + 0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43, + 0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43, + // Bytes d00 - d3f + 0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43, + 0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43, + 0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43, + 0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43, + 0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43, + 0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43, + 0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43, + 0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43, + // Bytes d40 - d7f + 0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43, + 0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43, + 0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43, + 0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43, + 0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43, + 0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43, + 0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43, + 0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43, + // Bytes d80 - dbf + 0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43, + 0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43, + 0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43, + 0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43, + 0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43, + 0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43, + 0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43, + 0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43, + // Bytes dc0 - dff + 0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43, + 0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43, + 0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43, + 0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43, + 0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43, + 0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43, + 0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43, + 0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43, + // Bytes e00 - e3f + 0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43, + 0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43, + 0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43, + 0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43, + 0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43, + 0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43, + 0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43, + 0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43, + // Bytes e40 - e7f + 0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43, + 0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43, + 0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43, + 0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43, + 0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43, + 0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43, + 0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43, + 0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43, + // Bytes e80 - ebf + 0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43, + 0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43, + 0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43, + 0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43, + 0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43, + 0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43, + 0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43, + 0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43, + // Bytes ec0 - eff + 0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43, + 0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43, + 0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43, + 0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43, + 0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43, + 0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43, + 0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43, + 0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43, + // Bytes f00 - f3f + 0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43, + 0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43, + 0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43, + 0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43, + 0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43, + 0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43, + 0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43, + 0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43, + // Bytes f40 - f7f + 0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43, + 0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43, + 0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43, + 0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43, + 0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43, + 0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43, + 0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43, + 0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43, + // Bytes f80 - fbf + 0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43, + 0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43, + 0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43, + 0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43, + 0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43, + 0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43, + 0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43, + 0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43, + // Bytes fc0 - fff + 0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43, + 0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43, + 0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43, + 0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43, + 0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43, + 0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43, + 0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43, + 0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43, + // Bytes 1000 - 103f + 0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43, + 0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43, + 0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43, + 0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43, + 0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43, + 0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43, + 0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43, + 0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43, + // Bytes 1040 - 107f + 0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43, + 0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43, + 0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43, + 0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43, + 0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43, + 0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43, + 0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43, + 0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43, + // Bytes 1080 - 10bf + 0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43, + 0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43, + 0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43, + 0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43, + 0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43, + 0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43, + 0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43, + 0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43, + // Bytes 10c0 - 10ff + 0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43, + 0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43, + 0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43, + 0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43, + 0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43, + 0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43, + 0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43, + 0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43, + // Bytes 1100 - 113f + 0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43, + 0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43, + 0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43, + 0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43, + 0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43, + 0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43, + 0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43, + 0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43, + // Bytes 1140 - 117f + 0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43, + 0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43, + 0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43, + 0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43, + 0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43, + 0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43, + 0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43, + 0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43, + // Bytes 1180 - 11bf + 0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43, + 0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43, + 0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43, + 0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43, + 0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43, + 0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43, + 0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43, + 0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43, + // Bytes 11c0 - 11ff + 0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43, + 0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43, + 0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43, + 0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43, + 0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43, + 0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43, + 0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43, + 0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43, + // Bytes 1200 - 123f + 0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43, + 0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43, + 0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43, + 0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43, + 0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43, + 0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43, + 0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43, + 0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43, + // Bytes 1240 - 127f + 0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43, + 0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43, + 0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43, + 0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43, + 0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43, + 0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43, + 0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43, + 0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43, + // Bytes 1280 - 12bf + 0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43, + 0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43, + 0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43, + 0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43, + 0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43, + 0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43, + 0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43, + 0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43, + // Bytes 12c0 - 12ff + 0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43, + 0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43, + 0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43, + 0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43, + 0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43, + 0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43, + 0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43, + 0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43, + // Bytes 1300 - 133f + 0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43, + 0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43, + 0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43, + 0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43, + 0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43, + 0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43, + 0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43, + 0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43, + // Bytes 1340 - 137f + 0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43, + 0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43, + 0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43, + 0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43, + 0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43, + 0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43, + 0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43, + 0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43, + // Bytes 1380 - 13bf + 0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43, + 0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43, + 0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43, + 0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43, + 0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43, + 0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43, + 0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43, + 0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43, + // Bytes 13c0 - 13ff + 0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43, + 0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43, + 0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43, + 0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43, + 0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43, + 0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43, + 0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43, + 0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43, + // Bytes 1400 - 143f + 0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43, + 0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43, + 0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43, + 0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43, + 0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43, + 0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43, + 0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43, + 0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43, + // Bytes 1440 - 147f + 0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43, + 0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43, + 0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43, + 0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43, + 0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43, + 0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43, + 0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43, + 0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43, + // Bytes 1480 - 14bf + 0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43, + 0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43, + 0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43, + 0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43, + 0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43, + 0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43, + 0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43, + 0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43, + // Bytes 14c0 - 14ff + 0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43, + 0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43, + 0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43, + 0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43, + 0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43, + 0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43, + 0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43, + 0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43, + // Bytes 1500 - 153f + 0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43, + 0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43, + 0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43, + 0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43, + 0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43, + 0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43, + 0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43, + 0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43, + // Bytes 1540 - 157f + 0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43, + 0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43, + 0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43, + 0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43, + 0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43, + 0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43, + 0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43, + 0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43, + // Bytes 1580 - 15bf + 0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43, + 0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43, + 0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43, + 0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43, + 0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43, + 0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43, + 0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43, + 0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43, + // Bytes 15c0 - 15ff + 0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43, + 0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43, + 0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43, + 0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43, + 0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43, + 0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43, + 0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43, + 0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43, + // Bytes 1600 - 163f + 0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43, + 0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43, + 0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43, + 0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43, + 0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43, + 0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43, + 0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43, + 0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43, + // Bytes 1640 - 167f + 0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44, + 0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94, + 0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0, + 0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA, + 0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0, + 0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44, + 0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93, + 0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0, + // Bytes 1680 - 16bf + 0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88, + 0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1, + 0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44, + 0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86, + 0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0, + 0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94, + 0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2, + 0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44, + // Bytes 16c0 - 16ff + 0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80, + 0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0, + 0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93, + 0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3, + 0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44, + 0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A, + 0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0, + 0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA, + // Bytes 1700 - 173f + 0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3, + 0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44, + 0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE, + 0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0, + 0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB, + 0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4, + 0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44, + 0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2, + // Bytes 1740 - 177f + 0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0, + 0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84, + 0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5, + 0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44, + 0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89, + 0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0, + 0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A, + 0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5, + // Bytes 1780 - 17bf + 0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44, + 0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2, + 0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0, + 0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A, + 0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6, + 0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44, + 0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93, + 0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0, + // Bytes 17c0 - 17ff + 0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7, + 0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6, + 0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44, + 0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5, + 0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0, + 0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92, + 0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7, + 0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44, + // Bytes 1800 - 183f + 0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2, + 0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0, + 0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92, + 0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8, + 0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44, + 0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85, + 0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0, + 0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A, + // Bytes 1840 - 187f + 0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9, + 0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44, + 0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84, + 0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0, + 0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92, + 0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21, + 0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30, + 0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42, + // Bytes 1880 - 18bf + 0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31, + 0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31, + 0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42, + 0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39, + 0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32, + 0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42, + 0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35, + 0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32, + // Bytes 18c0 - 18ff + 0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42, + 0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31, + 0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33, + 0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42, + 0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39, + 0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34, + 0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42, + 0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35, + // Bytes 1900 - 193f + 0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34, + 0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42, + 0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C, + 0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37, + 0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42, + 0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D, + 0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41, + 0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42, + // Bytes 1940 - 197f + 0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A, + 0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48, + 0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42, + 0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A, + 0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49, + 0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42, + 0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A, + 0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D, + // Bytes 1980 - 19bf + 0x44, 0x42, 0x4D, 0x52, 0x42, 0x4D, 0x56, 0x42, + 0x4D, 0x57, 0x42, 0x4E, 0x4A, 0x42, 0x4E, 0x6A, + 0x42, 0x4E, 0x6F, 0x42, 0x50, 0x48, 0x42, 0x50, + 0x52, 0x42, 0x50, 0x61, 0x42, 0x52, 0x73, 0x42, + 0x53, 0x44, 0x42, 0x53, 0x4D, 0x42, 0x53, 0x53, + 0x42, 0x53, 0x76, 0x42, 0x54, 0x4D, 0x42, 0x56, + 0x49, 0x42, 0x57, 0x43, 0x42, 0x57, 0x5A, 0x42, + 0x57, 0x62, 0x42, 0x58, 0x49, 0x42, 0x63, 0x63, + // Bytes 19c0 - 19ff + 0x42, 0x63, 0x64, 0x42, 0x63, 0x6D, 0x42, 0x64, + 0x42, 0x42, 0x64, 0x61, 0x42, 0x64, 0x6C, 0x42, + 0x64, 0x6D, 0x42, 0x64, 0x7A, 0x42, 0x65, 0x56, + 0x42, 0x66, 0x66, 0x42, 0x66, 0x69, 0x42, 0x66, + 0x6C, 0x42, 0x66, 0x6D, 0x42, 0x68, 0x61, 0x42, + 0x69, 0x69, 0x42, 0x69, 0x6A, 0x42, 0x69, 0x6E, + 0x42, 0x69, 0x76, 0x42, 0x69, 0x78, 0x42, 0x6B, + 0x41, 0x42, 0x6B, 0x56, 0x42, 0x6B, 0x57, 0x42, + // Bytes 1a00 - 1a3f + 0x6B, 0x67, 0x42, 0x6B, 0x6C, 0x42, 0x6B, 0x6D, + 0x42, 0x6B, 0x74, 0x42, 0x6C, 0x6A, 0x42, 0x6C, + 0x6D, 0x42, 0x6C, 0x6E, 0x42, 0x6C, 0x78, 0x42, + 0x6D, 0x32, 0x42, 0x6D, 0x33, 0x42, 0x6D, 0x41, + 0x42, 0x6D, 0x56, 0x42, 0x6D, 0x57, 0x42, 0x6D, + 0x62, 0x42, 0x6D, 0x67, 0x42, 0x6D, 0x6C, 0x42, + 0x6D, 0x6D, 0x42, 0x6D, 0x73, 0x42, 0x6E, 0x41, + 0x42, 0x6E, 0x46, 0x42, 0x6E, 0x56, 0x42, 0x6E, + // Bytes 1a40 - 1a7f + 0x57, 0x42, 0x6E, 0x6A, 0x42, 0x6E, 0x6D, 0x42, + 0x6E, 0x73, 0x42, 0x6F, 0x56, 0x42, 0x70, 0x41, + 0x42, 0x70, 0x46, 0x42, 0x70, 0x56, 0x42, 0x70, + 0x57, 0x42, 0x70, 0x63, 0x42, 0x70, 0x73, 0x42, + 0x73, 0x72, 0x42, 0x73, 0x74, 0x42, 0x76, 0x69, + 0x42, 0x78, 0x69, 0x43, 0x28, 0x31, 0x29, 0x43, + 0x28, 0x32, 0x29, 0x43, 0x28, 0x33, 0x29, 0x43, + 0x28, 0x34, 0x29, 0x43, 0x28, 0x35, 0x29, 0x43, + // Bytes 1a80 - 1abf + 0x28, 0x36, 0x29, 0x43, 0x28, 0x37, 0x29, 0x43, + 0x28, 0x38, 0x29, 0x43, 0x28, 0x39, 0x29, 0x43, + 0x28, 0x41, 0x29, 0x43, 0x28, 0x42, 0x29, 0x43, + 0x28, 0x43, 0x29, 0x43, 0x28, 0x44, 0x29, 0x43, + 0x28, 0x45, 0x29, 0x43, 0x28, 0x46, 0x29, 0x43, + 0x28, 0x47, 0x29, 0x43, 0x28, 0x48, 0x29, 0x43, + 0x28, 0x49, 0x29, 0x43, 0x28, 0x4A, 0x29, 0x43, + 0x28, 0x4B, 0x29, 0x43, 0x28, 0x4C, 0x29, 0x43, + // Bytes 1ac0 - 1aff + 0x28, 0x4D, 0x29, 0x43, 0x28, 0x4E, 0x29, 0x43, + 0x28, 0x4F, 0x29, 0x43, 0x28, 0x50, 0x29, 0x43, + 0x28, 0x51, 0x29, 0x43, 0x28, 0x52, 0x29, 0x43, + 0x28, 0x53, 0x29, 0x43, 0x28, 0x54, 0x29, 0x43, + 0x28, 0x55, 0x29, 0x43, 0x28, 0x56, 0x29, 0x43, + 0x28, 0x57, 0x29, 0x43, 0x28, 0x58, 0x29, 0x43, + 0x28, 0x59, 0x29, 0x43, 0x28, 0x5A, 0x29, 0x43, + 0x28, 0x61, 0x29, 0x43, 0x28, 0x62, 0x29, 0x43, + // Bytes 1b00 - 1b3f + 0x28, 0x63, 0x29, 0x43, 0x28, 0x64, 0x29, 0x43, + 0x28, 0x65, 0x29, 0x43, 0x28, 0x66, 0x29, 0x43, + 0x28, 0x67, 0x29, 0x43, 0x28, 0x68, 0x29, 0x43, + 0x28, 0x69, 0x29, 0x43, 0x28, 0x6A, 0x29, 0x43, + 0x28, 0x6B, 0x29, 0x43, 0x28, 0x6C, 0x29, 0x43, + 0x28, 0x6D, 0x29, 0x43, 0x28, 0x6E, 0x29, 0x43, + 0x28, 0x6F, 0x29, 0x43, 0x28, 0x70, 0x29, 0x43, + 0x28, 0x71, 0x29, 0x43, 0x28, 0x72, 0x29, 0x43, + // Bytes 1b40 - 1b7f + 0x28, 0x73, 0x29, 0x43, 0x28, 0x74, 0x29, 0x43, + 0x28, 0x75, 0x29, 0x43, 0x28, 0x76, 0x29, 0x43, + 0x28, 0x77, 0x29, 0x43, 0x28, 0x78, 0x29, 0x43, + 0x28, 0x79, 0x29, 0x43, 0x28, 0x7A, 0x29, 0x43, + 0x2E, 0x2E, 0x2E, 0x43, 0x31, 0x30, 0x2E, 0x43, + 0x31, 0x31, 0x2E, 0x43, 0x31, 0x32, 0x2E, 0x43, + 0x31, 0x33, 0x2E, 0x43, 0x31, 0x34, 0x2E, 0x43, + 0x31, 0x35, 0x2E, 0x43, 0x31, 0x36, 0x2E, 0x43, + // Bytes 1b80 - 1bbf + 0x31, 0x37, 0x2E, 0x43, 0x31, 0x38, 0x2E, 0x43, + 0x31, 0x39, 0x2E, 0x43, 0x32, 0x30, 0x2E, 0x43, + 0x3A, 0x3A, 0x3D, 0x43, 0x3D, 0x3D, 0x3D, 0x43, + 0x43, 0x6F, 0x2E, 0x43, 0x46, 0x41, 0x58, 0x43, + 0x47, 0x48, 0x7A, 0x43, 0x47, 0x50, 0x61, 0x43, + 0x49, 0x49, 0x49, 0x43, 0x4C, 0x54, 0x44, 0x43, + 0x4C, 0xC2, 0xB7, 0x43, 0x4D, 0x48, 0x7A, 0x43, + 0x4D, 0x50, 0x61, 0x43, 0x4D, 0xCE, 0xA9, 0x43, + // Bytes 1bc0 - 1bff + 0x50, 0x50, 0x4D, 0x43, 0x50, 0x50, 0x56, 0x43, + 0x50, 0x54, 0x45, 0x43, 0x54, 0x45, 0x4C, 0x43, + 0x54, 0x48, 0x7A, 0x43, 0x56, 0x49, 0x49, 0x43, + 0x58, 0x49, 0x49, 0x43, 0x61, 0x2F, 0x63, 0x43, + 0x61, 0x2F, 0x73, 0x43, 0x61, 0xCA, 0xBE, 0x43, + 0x62, 0x61, 0x72, 0x43, 0x63, 0x2F, 0x6F, 0x43, + 0x63, 0x2F, 0x75, 0x43, 0x63, 0x61, 0x6C, 0x43, + 0x63, 0x6D, 0x32, 0x43, 0x63, 0x6D, 0x33, 0x43, + // Bytes 1c00 - 1c3f + 0x64, 0x6D, 0x32, 0x43, 0x64, 0x6D, 0x33, 0x43, + 0x65, 0x72, 0x67, 0x43, 0x66, 0x66, 0x69, 0x43, + 0x66, 0x66, 0x6C, 0x43, 0x67, 0x61, 0x6C, 0x43, + 0x68, 0x50, 0x61, 0x43, 0x69, 0x69, 0x69, 0x43, + 0x6B, 0x48, 0x7A, 0x43, 0x6B, 0x50, 0x61, 0x43, + 0x6B, 0x6D, 0x32, 0x43, 0x6B, 0x6D, 0x33, 0x43, + 0x6B, 0xCE, 0xA9, 0x43, 0x6C, 0x6F, 0x67, 0x43, + 0x6C, 0xC2, 0xB7, 0x43, 0x6D, 0x69, 0x6C, 0x43, + // Bytes 1c40 - 1c7f + 0x6D, 0x6D, 0x32, 0x43, 0x6D, 0x6D, 0x33, 0x43, + 0x6D, 0x6F, 0x6C, 0x43, 0x72, 0x61, 0x64, 0x43, + 0x76, 0x69, 0x69, 0x43, 0x78, 0x69, 0x69, 0x43, + 0xC2, 0xB0, 0x43, 0x43, 0xC2, 0xB0, 0x46, 0x43, + 0xCA, 0xBC, 0x6E, 0x43, 0xCE, 0xBC, 0x41, 0x43, + 0xCE, 0xBC, 0x46, 0x43, 0xCE, 0xBC, 0x56, 0x43, + 0xCE, 0xBC, 0x57, 0x43, 0xCE, 0xBC, 0x67, 0x43, + 0xCE, 0xBC, 0x6C, 0x43, 0xCE, 0xBC, 0x6D, 0x43, + // Bytes 1c80 - 1cbf + 0xCE, 0xBC, 0x73, 0x44, 0x28, 0x31, 0x30, 0x29, + 0x44, 0x28, 0x31, 0x31, 0x29, 0x44, 0x28, 0x31, + 0x32, 0x29, 0x44, 0x28, 0x31, 0x33, 0x29, 0x44, + 0x28, 0x31, 0x34, 0x29, 0x44, 0x28, 0x31, 0x35, + 0x29, 0x44, 0x28, 0x31, 0x36, 0x29, 0x44, 0x28, + 0x31, 0x37, 0x29, 0x44, 0x28, 0x31, 0x38, 0x29, + 0x44, 0x28, 0x31, 0x39, 0x29, 0x44, 0x28, 0x32, + 0x30, 0x29, 0x44, 0x30, 0xE7, 0x82, 0xB9, 0x44, + // Bytes 1cc0 - 1cff + 0x31, 0xE2, 0x81, 0x84, 0x44, 0x31, 0xE6, 0x97, + 0xA5, 0x44, 0x31, 0xE6, 0x9C, 0x88, 0x44, 0x31, + 0xE7, 0x82, 0xB9, 0x44, 0x32, 0xE6, 0x97, 0xA5, + 0x44, 0x32, 0xE6, 0x9C, 0x88, 0x44, 0x32, 0xE7, + 0x82, 0xB9, 0x44, 0x33, 0xE6, 0x97, 0xA5, 0x44, + 0x33, 0xE6, 0x9C, 0x88, 0x44, 0x33, 0xE7, 0x82, + 0xB9, 0x44, 0x34, 0xE6, 0x97, 0xA5, 0x44, 0x34, + 0xE6, 0x9C, 0x88, 0x44, 0x34, 0xE7, 0x82, 0xB9, + // Bytes 1d00 - 1d3f + 0x44, 0x35, 0xE6, 0x97, 0xA5, 0x44, 0x35, 0xE6, + 0x9C, 0x88, 0x44, 0x35, 0xE7, 0x82, 0xB9, 0x44, + 0x36, 0xE6, 0x97, 0xA5, 0x44, 0x36, 0xE6, 0x9C, + 0x88, 0x44, 0x36, 0xE7, 0x82, 0xB9, 0x44, 0x37, + 0xE6, 0x97, 0xA5, 0x44, 0x37, 0xE6, 0x9C, 0x88, + 0x44, 0x37, 0xE7, 0x82, 0xB9, 0x44, 0x38, 0xE6, + 0x97, 0xA5, 0x44, 0x38, 0xE6, 0x9C, 0x88, 0x44, + 0x38, 0xE7, 0x82, 0xB9, 0x44, 0x39, 0xE6, 0x97, + // Bytes 1d40 - 1d7f + 0xA5, 0x44, 0x39, 0xE6, 0x9C, 0x88, 0x44, 0x39, + 0xE7, 0x82, 0xB9, 0x44, 0x56, 0x49, 0x49, 0x49, + 0x44, 0x61, 0x2E, 0x6D, 0x2E, 0x44, 0x6B, 0x63, + 0x61, 0x6C, 0x44, 0x70, 0x2E, 0x6D, 0x2E, 0x44, + 0x76, 0x69, 0x69, 0x69, 0x44, 0xD5, 0xA5, 0xD6, + 0x82, 0x44, 0xD5, 0xB4, 0xD5, 0xA5, 0x44, 0xD5, + 0xB4, 0xD5, 0xAB, 0x44, 0xD5, 0xB4, 0xD5, 0xAD, + 0x44, 0xD5, 0xB4, 0xD5, 0xB6, 0x44, 0xD5, 0xBE, + // Bytes 1d80 - 1dbf + 0xD5, 0xB6, 0x44, 0xD7, 0x90, 0xD7, 0x9C, 0x44, + 0xD8, 0xA7, 0xD9, 0xB4, 0x44, 0xD8, 0xA8, 0xD8, + 0xAC, 0x44, 0xD8, 0xA8, 0xD8, 0xAD, 0x44, 0xD8, + 0xA8, 0xD8, 0xAE, 0x44, 0xD8, 0xA8, 0xD8, 0xB1, + 0x44, 0xD8, 0xA8, 0xD8, 0xB2, 0x44, 0xD8, 0xA8, + 0xD9, 0x85, 0x44, 0xD8, 0xA8, 0xD9, 0x86, 0x44, + 0xD8, 0xA8, 0xD9, 0x87, 0x44, 0xD8, 0xA8, 0xD9, + 0x89, 0x44, 0xD8, 0xA8, 0xD9, 0x8A, 0x44, 0xD8, + // Bytes 1dc0 - 1dff + 0xAA, 0xD8, 0xAC, 0x44, 0xD8, 0xAA, 0xD8, 0xAD, + 0x44, 0xD8, 0xAA, 0xD8, 0xAE, 0x44, 0xD8, 0xAA, + 0xD8, 0xB1, 0x44, 0xD8, 0xAA, 0xD8, 0xB2, 0x44, + 0xD8, 0xAA, 0xD9, 0x85, 0x44, 0xD8, 0xAA, 0xD9, + 0x86, 0x44, 0xD8, 0xAA, 0xD9, 0x87, 0x44, 0xD8, + 0xAA, 0xD9, 0x89, 0x44, 0xD8, 0xAA, 0xD9, 0x8A, + 0x44, 0xD8, 0xAB, 0xD8, 0xAC, 0x44, 0xD8, 0xAB, + 0xD8, 0xB1, 0x44, 0xD8, 0xAB, 0xD8, 0xB2, 0x44, + // Bytes 1e00 - 1e3f + 0xD8, 0xAB, 0xD9, 0x85, 0x44, 0xD8, 0xAB, 0xD9, + 0x86, 0x44, 0xD8, 0xAB, 0xD9, 0x87, 0x44, 0xD8, + 0xAB, 0xD9, 0x89, 0x44, 0xD8, 0xAB, 0xD9, 0x8A, + 0x44, 0xD8, 0xAC, 0xD8, 0xAD, 0x44, 0xD8, 0xAC, + 0xD9, 0x85, 0x44, 0xD8, 0xAC, 0xD9, 0x89, 0x44, + 0xD8, 0xAC, 0xD9, 0x8A, 0x44, 0xD8, 0xAD, 0xD8, + 0xAC, 0x44, 0xD8, 0xAD, 0xD9, 0x85, 0x44, 0xD8, + 0xAD, 0xD9, 0x89, 0x44, 0xD8, 0xAD, 0xD9, 0x8A, + // Bytes 1e40 - 1e7f + 0x44, 0xD8, 0xAE, 0xD8, 0xAC, 0x44, 0xD8, 0xAE, + 0xD8, 0xAD, 0x44, 0xD8, 0xAE, 0xD9, 0x85, 0x44, + 0xD8, 0xAE, 0xD9, 0x89, 0x44, 0xD8, 0xAE, 0xD9, + 0x8A, 0x44, 0xD8, 0xB3, 0xD8, 0xAC, 0x44, 0xD8, + 0xB3, 0xD8, 0xAD, 0x44, 0xD8, 0xB3, 0xD8, 0xAE, + 0x44, 0xD8, 0xB3, 0xD8, 0xB1, 0x44, 0xD8, 0xB3, + 0xD9, 0x85, 0x44, 0xD8, 0xB3, 0xD9, 0x87, 0x44, + 0xD8, 0xB3, 0xD9, 0x89, 0x44, 0xD8, 0xB3, 0xD9, + // Bytes 1e80 - 1ebf + 0x8A, 0x44, 0xD8, 0xB4, 0xD8, 0xAC, 0x44, 0xD8, + 0xB4, 0xD8, 0xAD, 0x44, 0xD8, 0xB4, 0xD8, 0xAE, + 0x44, 0xD8, 0xB4, 0xD8, 0xB1, 0x44, 0xD8, 0xB4, + 0xD9, 0x85, 0x44, 0xD8, 0xB4, 0xD9, 0x87, 0x44, + 0xD8, 0xB4, 0xD9, 0x89, 0x44, 0xD8, 0xB4, 0xD9, + 0x8A, 0x44, 0xD8, 0xB5, 0xD8, 0xAD, 0x44, 0xD8, + 0xB5, 0xD8, 0xAE, 0x44, 0xD8, 0xB5, 0xD8, 0xB1, + 0x44, 0xD8, 0xB5, 0xD9, 0x85, 0x44, 0xD8, 0xB5, + // Bytes 1ec0 - 1eff + 0xD9, 0x89, 0x44, 0xD8, 0xB5, 0xD9, 0x8A, 0x44, + 0xD8, 0xB6, 0xD8, 0xAC, 0x44, 0xD8, 0xB6, 0xD8, + 0xAD, 0x44, 0xD8, 0xB6, 0xD8, 0xAE, 0x44, 0xD8, + 0xB6, 0xD8, 0xB1, 0x44, 0xD8, 0xB6, 0xD9, 0x85, + 0x44, 0xD8, 0xB6, 0xD9, 0x89, 0x44, 0xD8, 0xB6, + 0xD9, 0x8A, 0x44, 0xD8, 0xB7, 0xD8, 0xAD, 0x44, + 0xD8, 0xB7, 0xD9, 0x85, 0x44, 0xD8, 0xB7, 0xD9, + 0x89, 0x44, 0xD8, 0xB7, 0xD9, 0x8A, 0x44, 0xD8, + // Bytes 1f00 - 1f3f + 0xB8, 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD8, 0xAC, + 0x44, 0xD8, 0xB9, 0xD9, 0x85, 0x44, 0xD8, 0xB9, + 0xD9, 0x89, 0x44, 0xD8, 0xB9, 0xD9, 0x8A, 0x44, + 0xD8, 0xBA, 0xD8, 0xAC, 0x44, 0xD8, 0xBA, 0xD9, + 0x85, 0x44, 0xD8, 0xBA, 0xD9, 0x89, 0x44, 0xD8, + 0xBA, 0xD9, 0x8A, 0x44, 0xD9, 0x81, 0xD8, 0xAC, + 0x44, 0xD9, 0x81, 0xD8, 0xAD, 0x44, 0xD9, 0x81, + 0xD8, 0xAE, 0x44, 0xD9, 0x81, 0xD9, 0x85, 0x44, + // Bytes 1f40 - 1f7f + 0xD9, 0x81, 0xD9, 0x89, 0x44, 0xD9, 0x81, 0xD9, + 0x8A, 0x44, 0xD9, 0x82, 0xD8, 0xAD, 0x44, 0xD9, + 0x82, 0xD9, 0x85, 0x44, 0xD9, 0x82, 0xD9, 0x89, + 0x44, 0xD9, 0x82, 0xD9, 0x8A, 0x44, 0xD9, 0x83, + 0xD8, 0xA7, 0x44, 0xD9, 0x83, 0xD8, 0xAC, 0x44, + 0xD9, 0x83, 0xD8, 0xAD, 0x44, 0xD9, 0x83, 0xD8, + 0xAE, 0x44, 0xD9, 0x83, 0xD9, 0x84, 0x44, 0xD9, + 0x83, 0xD9, 0x85, 0x44, 0xD9, 0x83, 0xD9, 0x89, + // Bytes 1f80 - 1fbf + 0x44, 0xD9, 0x83, 0xD9, 0x8A, 0x44, 0xD9, 0x84, + 0xD8, 0xA7, 0x44, 0xD9, 0x84, 0xD8, 0xAC, 0x44, + 0xD9, 0x84, 0xD8, 0xAD, 0x44, 0xD9, 0x84, 0xD8, + 0xAE, 0x44, 0xD9, 0x84, 0xD9, 0x85, 0x44, 0xD9, + 0x84, 0xD9, 0x87, 0x44, 0xD9, 0x84, 0xD9, 0x89, + 0x44, 0xD9, 0x84, 0xD9, 0x8A, 0x44, 0xD9, 0x85, + 0xD8, 0xA7, 0x44, 0xD9, 0x85, 0xD8, 0xAC, 0x44, + 0xD9, 0x85, 0xD8, 0xAD, 0x44, 0xD9, 0x85, 0xD8, + // Bytes 1fc0 - 1fff + 0xAE, 0x44, 0xD9, 0x85, 0xD9, 0x85, 0x44, 0xD9, + 0x85, 0xD9, 0x89, 0x44, 0xD9, 0x85, 0xD9, 0x8A, + 0x44, 0xD9, 0x86, 0xD8, 0xAC, 0x44, 0xD9, 0x86, + 0xD8, 0xAD, 0x44, 0xD9, 0x86, 0xD8, 0xAE, 0x44, + 0xD9, 0x86, 0xD8, 0xB1, 0x44, 0xD9, 0x86, 0xD8, + 0xB2, 0x44, 0xD9, 0x86, 0xD9, 0x85, 0x44, 0xD9, + 0x86, 0xD9, 0x86, 0x44, 0xD9, 0x86, 0xD9, 0x87, + 0x44, 0xD9, 0x86, 0xD9, 0x89, 0x44, 0xD9, 0x86, + // Bytes 2000 - 203f + 0xD9, 0x8A, 0x44, 0xD9, 0x87, 0xD8, 0xAC, 0x44, + 0xD9, 0x87, 0xD9, 0x85, 0x44, 0xD9, 0x87, 0xD9, + 0x89, 0x44, 0xD9, 0x87, 0xD9, 0x8A, 0x44, 0xD9, + 0x88, 0xD9, 0xB4, 0x44, 0xD9, 0x8A, 0xD8, 0xAC, + 0x44, 0xD9, 0x8A, 0xD8, 0xAD, 0x44, 0xD9, 0x8A, + 0xD8, 0xAE, 0x44, 0xD9, 0x8A, 0xD8, 0xB1, 0x44, + 0xD9, 0x8A, 0xD8, 0xB2, 0x44, 0xD9, 0x8A, 0xD9, + 0x85, 0x44, 0xD9, 0x8A, 0xD9, 0x86, 0x44, 0xD9, + // Bytes 2040 - 207f + 0x8A, 0xD9, 0x87, 0x44, 0xD9, 0x8A, 0xD9, 0x89, + 0x44, 0xD9, 0x8A, 0xD9, 0x8A, 0x44, 0xD9, 0x8A, + 0xD9, 0xB4, 0x44, 0xDB, 0x87, 0xD9, 0xB4, 0x45, + 0x28, 0xE1, 0x84, 0x80, 0x29, 0x45, 0x28, 0xE1, + 0x84, 0x82, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x83, + 0x29, 0x45, 0x28, 0xE1, 0x84, 0x85, 0x29, 0x45, + 0x28, 0xE1, 0x84, 0x86, 0x29, 0x45, 0x28, 0xE1, + 0x84, 0x87, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x89, + // Bytes 2080 - 20bf + 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8B, 0x29, 0x45, + 0x28, 0xE1, 0x84, 0x8C, 0x29, 0x45, 0x28, 0xE1, + 0x84, 0x8E, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8F, + 0x29, 0x45, 0x28, 0xE1, 0x84, 0x90, 0x29, 0x45, + 0x28, 0xE1, 0x84, 0x91, 0x29, 0x45, 0x28, 0xE1, + 0x84, 0x92, 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x80, + 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x83, 0x29, 0x45, + 0x28, 0xE4, 0xB8, 0x89, 0x29, 0x45, 0x28, 0xE4, + // Bytes 20c0 - 20ff + 0xB9, 0x9D, 0x29, 0x45, 0x28, 0xE4, 0xBA, 0x8C, + 0x29, 0x45, 0x28, 0xE4, 0xBA, 0x94, 0x29, 0x45, + 0x28, 0xE4, 0xBB, 0xA3, 0x29, 0x45, 0x28, 0xE4, + 0xBC, 0x81, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x91, + 0x29, 0x45, 0x28, 0xE5, 0x85, 0xAB, 0x29, 0x45, + 0x28, 0xE5, 0x85, 0xAD, 0x29, 0x45, 0x28, 0xE5, + 0x8A, 0xB4, 0x29, 0x45, 0x28, 0xE5, 0x8D, 0x81, + 0x29, 0x45, 0x28, 0xE5, 0x8D, 0x94, 0x29, 0x45, + // Bytes 2100 - 213f + 0x28, 0xE5, 0x90, 0x8D, 0x29, 0x45, 0x28, 0xE5, + 0x91, 0xBC, 0x29, 0x45, 0x28, 0xE5, 0x9B, 0x9B, + 0x29, 0x45, 0x28, 0xE5, 0x9C, 0x9F, 0x29, 0x45, + 0x28, 0xE5, 0xAD, 0xA6, 0x29, 0x45, 0x28, 0xE6, + 0x97, 0xA5, 0x29, 0x45, 0x28, 0xE6, 0x9C, 0x88, + 0x29, 0x45, 0x28, 0xE6, 0x9C, 0x89, 0x29, 0x45, + 0x28, 0xE6, 0x9C, 0xA8, 0x29, 0x45, 0x28, 0xE6, + 0xA0, 0xAA, 0x29, 0x45, 0x28, 0xE6, 0xB0, 0xB4, + // Bytes 2140 - 217f + 0x29, 0x45, 0x28, 0xE7, 0x81, 0xAB, 0x29, 0x45, + 0x28, 0xE7, 0x89, 0xB9, 0x29, 0x45, 0x28, 0xE7, + 0x9B, 0xA3, 0x29, 0x45, 0x28, 0xE7, 0xA4, 0xBE, + 0x29, 0x45, 0x28, 0xE7, 0xA5, 0x9D, 0x29, 0x45, + 0x28, 0xE7, 0xA5, 0xAD, 0x29, 0x45, 0x28, 0xE8, + 0x87, 0xAA, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xB3, + 0x29, 0x45, 0x28, 0xE8, 0xB2, 0xA1, 0x29, 0x45, + 0x28, 0xE8, 0xB3, 0x87, 0x29, 0x45, 0x28, 0xE9, + // Bytes 2180 - 21bf + 0x87, 0x91, 0x29, 0x45, 0x30, 0xE2, 0x81, 0x84, + 0x33, 0x45, 0x31, 0x30, 0xE6, 0x97, 0xA5, 0x45, + 0x31, 0x30, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x30, + 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x31, 0xE6, 0x97, + 0xA5, 0x45, 0x31, 0x31, 0xE6, 0x9C, 0x88, 0x45, + 0x31, 0x31, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x32, + 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x32, 0xE6, 0x9C, + 0x88, 0x45, 0x31, 0x32, 0xE7, 0x82, 0xB9, 0x45, + // Bytes 21c0 - 21ff + 0x31, 0x33, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x33, + 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x34, 0xE6, 0x97, + 0xA5, 0x45, 0x31, 0x34, 0xE7, 0x82, 0xB9, 0x45, + 0x31, 0x35, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x35, + 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x36, 0xE6, 0x97, + 0xA5, 0x45, 0x31, 0x36, 0xE7, 0x82, 0xB9, 0x45, + 0x31, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x37, + 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x38, 0xE6, 0x97, + // Bytes 2200 - 223f + 0xA5, 0x45, 0x31, 0x38, 0xE7, 0x82, 0xB9, 0x45, + 0x31, 0x39, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x39, + 0xE7, 0x82, 0xB9, 0x45, 0x31, 0xE2, 0x81, 0x84, + 0x32, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x33, 0x45, + 0x31, 0xE2, 0x81, 0x84, 0x34, 0x45, 0x31, 0xE2, + 0x81, 0x84, 0x35, 0x45, 0x31, 0xE2, 0x81, 0x84, + 0x36, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x37, 0x45, + 0x31, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x31, 0xE2, + // Bytes 2240 - 227f + 0x81, 0x84, 0x39, 0x45, 0x32, 0x30, 0xE6, 0x97, + 0xA5, 0x45, 0x32, 0x30, 0xE7, 0x82, 0xB9, 0x45, + 0x32, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x31, + 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x32, 0xE6, 0x97, + 0xA5, 0x45, 0x32, 0x32, 0xE7, 0x82, 0xB9, 0x45, + 0x32, 0x33, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x33, + 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x34, 0xE6, 0x97, + 0xA5, 0x45, 0x32, 0x34, 0xE7, 0x82, 0xB9, 0x45, + // Bytes 2280 - 22bf + 0x32, 0x35, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x36, + 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x37, 0xE6, 0x97, + 0xA5, 0x45, 0x32, 0x38, 0xE6, 0x97, 0xA5, 0x45, + 0x32, 0x39, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0xE2, + 0x81, 0x84, 0x33, 0x45, 0x32, 0xE2, 0x81, 0x84, + 0x35, 0x45, 0x33, 0x30, 0xE6, 0x97, 0xA5, 0x45, + 0x33, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0xE2, + 0x81, 0x84, 0x34, 0x45, 0x33, 0xE2, 0x81, 0x84, + // Bytes 22c0 - 22ff + 0x35, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x38, 0x45, + 0x34, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x35, 0xE2, + 0x81, 0x84, 0x36, 0x45, 0x35, 0xE2, 0x81, 0x84, + 0x38, 0x45, 0x37, 0xE2, 0x81, 0x84, 0x38, 0x45, + 0x41, 0xE2, 0x88, 0x95, 0x6D, 0x45, 0x56, 0xE2, + 0x88, 0x95, 0x6D, 0x45, 0x6D, 0xE2, 0x88, 0x95, + 0x73, 0x46, 0x31, 0xE2, 0x81, 0x84, 0x31, 0x30, + 0x46, 0x43, 0xE2, 0x88, 0x95, 0x6B, 0x67, 0x46, + // Bytes 2300 - 233f + 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x46, 0xD8, + 0xA8, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xA8, + 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD8, + 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, + 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, + 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, + 0x46, 0xD8, 0xAA, 0xD8, 0xAD, 0xD9, 0x85, 0x46, + 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD8, + // Bytes 2340 - 237f + 0xAA, 0xD8, 0xAE, 0xD9, 0x89, 0x46, 0xD8, 0xAA, + 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD9, + 0x85, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, 0xD9, 0x85, + 0xD8, 0xAD, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, + 0xAE, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x89, + 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD8, + 0xAC, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, + // Bytes 2380 - 23bf + 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xAC, 0xD9, + 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD9, 0x85, + 0xD9, 0x8A, 0x46, 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, + 0x8A, 0x46, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x89, + 0x46, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD8, 0xB3, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD8, + 0xB3, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD8, 0xB3, + 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xB3, 0xD8, + // Bytes 23c0 - 23ff + 0xAE, 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, + 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, + 0xAC, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAD, + 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD8, 0xB4, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xB4, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xB4, + 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD9, + 0x85, 0xD8, 0xAE, 0x46, 0xD8, 0xB4, 0xD9, 0x85, + // Bytes 2400 - 243f + 0xD9, 0x85, 0x46, 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, + 0xAD, 0x46, 0xD8, 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, + 0x46, 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, 0x46, + 0xD8, 0xB5, 0xD9, 0x84, 0xDB, 0x92, 0x46, 0xD8, + 0xB5, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB6, + 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xB6, 0xD8, + 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB6, 0xD8, 0xAE, + 0xD9, 0x85, 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD8, + // Bytes 2440 - 247f + 0xAD, 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x85, + 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD8, 0xB9, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD8, + 0xB9, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB9, + 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xB9, 0xD9, + 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xBA, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x8A, + // Bytes 2480 - 24bf + 0x46, 0xD9, 0x81, 0xD8, 0xAE, 0xD9, 0x85, 0x46, + 0xD9, 0x81, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, + 0x82, 0xD9, 0x84, 0xDB, 0x92, 0x46, 0xD9, 0x82, + 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x82, 0xD9, + 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x82, 0xD9, 0x85, + 0xD9, 0x8A, 0x46, 0xD9, 0x83, 0xD9, 0x85, 0xD9, + 0x85, 0x46, 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD9, 0x84, 0xD8, 0xAC, 0xD8, 0xAC, 0x46, + // Bytes 24c0 - 24ff + 0xD9, 0x84, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD9, + 0x84, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x84, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x84, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAE, 0xD9, + 0x85, 0x46, 0xD9, 0x84, 0xD9, 0x85, 0xD8, 0xAD, + 0x46, 0xD9, 0x84, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD9, 0x85, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD9, + // Bytes 2500 - 253f + 0x85, 0xD8, 0xAC, 0xD8, 0xAE, 0x46, 0xD9, 0x85, + 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, + 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, 0xAD, + 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, + 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x8A, + 0x46, 0xD9, 0x85, 0xD8, 0xAE, 0xD8, 0xAC, 0x46, + 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, + 0x85, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD9, 0x85, + // Bytes 2540 - 257f + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x86, 0xD8, 0xAC, + 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, + 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x8A, + 0x46, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x85, 0x46, + 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD9, + 0x86, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x86, + 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD9, + // Bytes 2580 - 25bf + 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x87, 0xD9, 0x85, + 0xD8, 0xAC, 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD9, + 0x85, 0x46, 0xD9, 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, + 0x46, 0xD9, 0x8A, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, + 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + 0x8A, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xD8, 0xA7, 0x46, 0xD9, 0x8A, 0xD9, + 0x94, 0xD8, 0xAC, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + // Bytes 25c0 - 25ff + 0xD8, 0xAD, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, + 0xAE, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB1, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB2, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x85, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xD9, 0x86, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xD9, 0x87, 0x46, 0xD9, 0x8A, 0xD9, + 0x94, 0xD9, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xD9, 0x89, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, + // Bytes 2600 - 263f + 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x86, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x87, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x88, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xDB, 0x90, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xDB, 0x95, 0x46, 0xE0, 0xB9, 0x8D, + 0xE0, 0xB8, 0xB2, 0x46, 0xE0, 0xBA, 0xAB, 0xE0, + 0xBA, 0x99, 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, + 0xA1, 0x46, 0xE0, 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, + // Bytes 2640 - 267f + 0x46, 0xE0, 0xBD, 0x80, 0xE0, 0xBE, 0xB5, 0x46, + 0xE0, 0xBD, 0x82, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, + 0xBD, 0x8C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, + 0x91, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x96, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x9B, 0xE0, + 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0x90, 0xE0, 0xBE, + 0xB5, 0x46, 0xE0, 0xBE, 0x92, 0xE0, 0xBE, 0xB7, + 0x46, 0xE0, 0xBE, 0x9C, 0xE0, 0xBE, 0xB7, 0x46, + // Bytes 2680 - 26bf + 0xE0, 0xBE, 0xA1, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, + 0xBE, 0xA6, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, + 0xAB, 0xE0, 0xBE, 0xB7, 0x46, 0xE2, 0x80, 0xB2, + 0xE2, 0x80, 0xB2, 0x46, 0xE2, 0x80, 0xB5, 0xE2, + 0x80, 0xB5, 0x46, 0xE2, 0x88, 0xAB, 0xE2, 0x88, + 0xAB, 0x46, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, + 0x46, 0xE3, 0x81, 0xBB, 0xE3, 0x81, 0x8B, 0x46, + 0xE3, 0x82, 0x88, 0xE3, 0x82, 0x8A, 0x46, 0xE3, + // Bytes 26c0 - 26ff + 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0x46, 0xE3, 0x82, + 0xB3, 0xE3, 0x82, 0xB3, 0x46, 0xE3, 0x82, 0xB3, + 0xE3, 0x83, 0x88, 0x46, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xB3, 0x46, 0xE3, 0x83, 0x8A, 0xE3, 0x83, + 0x8E, 0x46, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xB3, + 0x46, 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0x46, + 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xA9, 0x46, 0xE3, + 0x83, 0xAC, 0xE3, 0x83, 0xA0, 0x46, 0xE5, 0xA4, + // Bytes 2700 - 273f + 0xA7, 0xE6, 0xAD, 0xA3, 0x46, 0xE5, 0xB9, 0xB3, + 0xE6, 0x88, 0x90, 0x46, 0xE6, 0x98, 0x8E, 0xE6, + 0xB2, 0xBB, 0x46, 0xE6, 0x98, 0xAD, 0xE5, 0x92, + 0x8C, 0x47, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, + 0x73, 0x47, 0xE3, 0x80, 0x94, 0x53, 0xE3, 0x80, + 0x95, 0x48, 0x28, 0xE1, 0x84, 0x80, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x82, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x83, + // Bytes 2740 - 277f + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, + 0x85, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, + 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x29, + 0x48, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8C, 0xE1, + // Bytes 2780 - 27bf + 0x85, 0xAE, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8E, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, + 0x8F, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, + 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x29, + 0x48, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, + 0x32, 0x48, 0xD8, 0xA7, 0xD9, 0x83, 0xD8, 0xA8, + // Bytes 27c0 - 27ff + 0xD8, 0xB1, 0x48, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, + 0x84, 0xD9, 0x87, 0x48, 0xD8, 0xB1, 0xD8, 0xB3, + 0xD9, 0x88, 0xD9, 0x84, 0x48, 0xD8, 0xB1, 0xDB, + 0x8C, 0xD8, 0xA7, 0xD9, 0x84, 0x48, 0xD8, 0xB5, + 0xD9, 0x84, 0xD8, 0xB9, 0xD9, 0x85, 0x48, 0xD8, + 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x48, + 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0xD8, 0xAF, + 0x48, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, + // Bytes 2800 - 283f + 0x85, 0x49, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, + 0xE2, 0x80, 0xB2, 0x49, 0xE2, 0x80, 0xB5, 0xE2, + 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x49, 0xE2, 0x88, + 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x49, + 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0xE2, 0x88, + 0xAE, 0x49, 0xE3, 0x80, 0x94, 0xE4, 0xB8, 0x89, + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE4, + 0xBA, 0x8C, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, + // Bytes 2840 - 287f + 0x94, 0xE5, 0x8B, 0x9D, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x80, 0x94, 0xE5, 0xAE, 0x89, 0xE3, 0x80, + 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x89, 0x93, + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, + 0x95, 0x97, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, + 0x94, 0xE6, 0x9C, 0xAC, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x80, 0x94, 0xE7, 0x82, 0xB9, 0xE3, 0x80, + 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, 0x9B, 0x97, + // Bytes 2880 - 28bf + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x82, 0xA2, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0x49, + 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0xA9, 0xE3, 0x83, + 0xB3, 0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xB3, + 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, 0xAA, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x49, 0xE3, 0x82, + 0xAB, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAA, 0x49, + // Bytes 28c0 - 28ff + 0xE3, 0x82, 0xB1, 0xE3, 0x83, 0xBC, 0xE3, 0x82, + 0xB9, 0x49, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xAB, + 0xE3, 0x83, 0x8A, 0x49, 0xE3, 0x82, 0xBB, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, + 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x49, + 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0xE3, 0x82, + 0xB7, 0x49, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x8E, 0xE3, + // Bytes 2900 - 293f + 0x83, 0x83, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, + 0x8F, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x84, 0x49, + 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xAB, 0x49, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, + 0xE3, 0x82, 0xB3, 0x49, 0xE3, 0x83, 0x95, 0xE3, + 0x83, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, + 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xBD, 0x49, + 0xE3, 0x83, 0x98, 0xE3, 0x83, 0xAB, 0xE3, 0x83, + // Bytes 2940 - 297f + 0x84, 0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9B, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, + 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAB, 0x49, + 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0x83, 0xE3, 0x83, + 0x8F, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0xAB, + 0xE3, 0x82, 0xAF, 0x49, 0xE3, 0x83, 0xA4, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, + // Bytes 2980 - 29bf + 0xA6, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, 0x49, + 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, 0xE3, 0x83, + 0x88, 0x4C, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, + 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x4C, 0xE2, + 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, + 0xE2, 0x88, 0xAB, 0x4C, 0xE3, 0x82, 0xA2, 0xE3, + 0x83, 0xAB, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA1, + 0x4C, 0xE3, 0x82, 0xA8, 0xE3, 0x83, 0xBC, 0xE3, + // Bytes 29c0 - 29ff + 0x82, 0xAB, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, + 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAD, 0xE3, + 0x83, 0xB3, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x9E, 0x4C, + 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xA9, 0xE3, 0x83, + 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x82, 0xAB, + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAA, 0xE3, 0x83, + 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, + // Bytes 2a00 - 2a3f + 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, + 0x82, 0xAD, 0xE3, 0x83, 0xA5, 0xE3, 0x83, 0xAA, + 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAF, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, + 0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0x8D, 0x4C, 0xE3, 0x82, + 0xB5, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, 0xE3, + 0x83, 0xAB, 0x4C, 0xE3, 0x82, 0xBF, 0xE3, 0x82, + // Bytes 2a40 - 2a7f + 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x4C, + 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0xBC, 0xE3, 0x83, 0x84, 0x4C, 0xE3, 0x83, 0x92, + 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xAF, 0xE3, 0x83, + 0xAB, 0x4C, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA3, + 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x4C, 0xE3, + 0x83, 0x98, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0xE3, 0x82, 0xBF, 0x4C, 0xE3, 0x83, 0x98, 0xE3, + // Bytes 2a80 - 2abf + 0x82, 0x9A, 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0x92, + 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, + 0x9B, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, + 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x9E, 0xE3, 0x82, + 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0x4C, + 0xE3, 0x83, 0x9F, 0xE3, 0x82, 0xAF, 0xE3, 0x83, + 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3, 0x83, 0xA1, + // Bytes 2ac0 - 2aff + 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, + 0xAB, 0x4C, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x83, + 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, + 0x83, 0xAB, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, + 0xE3, 0x83, 0xBC, 0x4C, 0xE6, 0xA0, 0xAA, 0xE5, + 0xBC, 0x8F, 0xE4, 0xBC, 0x9A, 0xE7, 0xA4, 0xBE, + 0x4E, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA9, + 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xAE, 0x29, 0x4F, + // Bytes 2b00 - 2b3f + 0xD8, 0xAC, 0xD9, 0x84, 0x20, 0xD8, 0xAC, 0xD9, + 0x84, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x87, 0x4F, + 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0x8F, 0xE3, 0x82, + 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x4F, + 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA2, 0x4F, + 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, + 0xAF, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4F, + // Bytes 2b40 - 2b7f + 0xE3, 0x82, 0xB5, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x81, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x4F, + 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xBC, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xAB, 0x4F, + 0xE3, 0x83, 0x98, 0xE3, 0x82, 0xAF, 0xE3, 0x82, + 0xBF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x4F, + 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x4F, + // Bytes 2b80 - 2bbf + 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0xB3, 0xE3, 0x82, + 0xB7, 0xE3, 0x83, 0xA7, 0xE3, 0x83, 0xB3, 0x4F, + 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x4F, + 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0x95, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x51, + 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, + 0x84, 0x8C, 0xE1, 0x85, 0xA5, 0xE1, 0x86, 0xAB, + // Bytes 2bc0 - 2bff + 0x29, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBF, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xBC, 0x52, 0xE3, 0x82, 0xAD, + 0xE3, 0x83, 0xAD, 0xE3, 0x82, 0xAF, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x52, + 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, + 0xA1, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xAB, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x82, + // Bytes 2c00 - 2c3f + 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0xE3, + 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x52, 0xE3, 0x82, + 0xAF, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBB, 0xE3, + 0x82, 0x99, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAD, + 0x52, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xBC, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x88, 0x52, 0xE3, 0x83, 0x92, 0xE3, + 0x82, 0x9A, 0xE3, 0x82, 0xA2, 0xE3, 0x82, 0xB9, + // Bytes 2c40 - 2c7f + 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, 0xE3, + 0x83, 0x95, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x83, + 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0xA7, 0xE3, 0x83, + 0xAB, 0x52, 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, + 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xBC, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0xAC, + 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, + 0xB1, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, 0x61, + // Bytes 2c80 - 2cbf + 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, 0x20, 0xD8, + 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x20, + 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, + 0x20, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, + 0x85, 0x06, 0xE0, 0xA7, 0x87, 0xE0, 0xA6, 0xBE, + 0x01, 0x06, 0xE0, 0xA7, 0x87, 0xE0, 0xA7, 0x97, + 0x01, 0x06, 0xE0, 0xAD, 0x87, 0xE0, 0xAC, 0xBE, + 0x01, 0x06, 0xE0, 0xAD, 0x87, 0xE0, 0xAD, 0x96, + // Bytes 2cc0 - 2cff + 0x01, 0x06, 0xE0, 0xAD, 0x87, 0xE0, 0xAD, 0x97, + 0x01, 0x06, 0xE0, 0xAE, 0x92, 0xE0, 0xAF, 0x97, + 0x01, 0x06, 0xE0, 0xAF, 0x86, 0xE0, 0xAE, 0xBE, + 0x01, 0x06, 0xE0, 0xAF, 0x86, 0xE0, 0xAF, 0x97, + 0x01, 0x06, 0xE0, 0xAF, 0x87, 0xE0, 0xAE, 0xBE, + 0x01, 0x06, 0xE0, 0xB2, 0xBF, 0xE0, 0xB3, 0x95, + 0x01, 0x06, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x95, + 0x01, 0x06, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x96, + // Bytes 2d00 - 2d3f + 0x01, 0x06, 0xE0, 0xB5, 0x86, 0xE0, 0xB4, 0xBE, + 0x01, 0x06, 0xE0, 0xB5, 0x86, 0xE0, 0xB5, 0x97, + 0x01, 0x06, 0xE0, 0xB5, 0x87, 0xE0, 0xB4, 0xBE, + 0x01, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x9F, + 0x01, 0x06, 0xE1, 0x80, 0xA5, 0xE1, 0x80, 0xAE, + 0x01, 0x06, 0xE1, 0xAC, 0x85, 0xE1, 0xAC, 0xB5, + 0x01, 0x06, 0xE1, 0xAC, 0x87, 0xE1, 0xAC, 0xB5, + 0x01, 0x06, 0xE1, 0xAC, 0x89, 0xE1, 0xAC, 0xB5, + // Bytes 2d40 - 2d7f + 0x01, 0x06, 0xE1, 0xAC, 0x8B, 0xE1, 0xAC, 0xB5, + 0x01, 0x06, 0xE1, 0xAC, 0x8D, 0xE1, 0xAC, 0xB5, + 0x01, 0x06, 0xE1, 0xAC, 0x91, 0xE1, 0xAC, 0xB5, + 0x01, 0x06, 0xE1, 0xAC, 0xBA, 0xE1, 0xAC, 0xB5, + 0x01, 0x06, 0xE1, 0xAC, 0xBC, 0xE1, 0xAC, 0xB5, + 0x01, 0x06, 0xE1, 0xAC, 0xBE, 0xE1, 0xAC, 0xB5, + 0x01, 0x06, 0xE1, 0xAC, 0xBF, 0xE1, 0xAC, 0xB5, + 0x01, 0x06, 0xE1, 0xAD, 0x82, 0xE1, 0xAC, 0xB5, + // Bytes 2d80 - 2dbf + 0x01, 0x08, 0xF0, 0x91, 0x84, 0xB1, 0xF0, 0x91, + 0x84, 0xA7, 0x01, 0x08, 0xF0, 0x91, 0x84, 0xB2, + 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08, 0xF0, 0x91, + 0x8D, 0x87, 0xF0, 0x91, 0x8C, 0xBE, 0x01, 0x08, + 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91, 0x8D, 0x97, + 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, + 0x92, 0xB0, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, + 0xF0, 0x91, 0x92, 0xBA, 0x01, 0x08, 0xF0, 0x91, + // Bytes 2dc0 - 2dff + 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xBD, 0x01, 0x08, + 0xF0, 0x91, 0x96, 0xB8, 0xF0, 0x91, 0x96, 0xAF, + 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB9, 0xF0, 0x91, + 0x96, 0xAF, 0x01, 0x09, 0xE0, 0xB3, 0x86, 0xE0, + 0xB3, 0x82, 0xE0, 0xB3, 0x95, 0x02, 0x09, 0xE0, + 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, + 0x12, 0x44, 0x44, 0x5A, 0xCC, 0x8C, 0xC9, 0x44, + 0x44, 0x7A, 0xCC, 0x8C, 0xC9, 0x44, 0x64, 0x7A, + // Bytes 2e00 - 2e3f + 0xCC, 0x8C, 0xC9, 0x46, 0xD9, 0x84, 0xD8, 0xA7, + 0xD9, 0x93, 0xC9, 0x46, 0xD9, 0x84, 0xD8, 0xA7, + 0xD9, 0x94, 0xC9, 0x46, 0xD9, 0x84, 0xD8, 0xA7, + 0xD9, 0x95, 0xB5, 0x46, 0xE1, 0x84, 0x80, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x82, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x83, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x85, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x86, 0xE1, + // Bytes 2e40 - 2e7f + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x87, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x89, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, + 0x85, 0xAE, 0x01, 0x46, 0xE1, 0x84, 0x8C, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8E, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8F, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x90, 0xE1, + // Bytes 2e80 - 2ebf + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x91, 0xE1, + 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x92, 0xE1, + 0x85, 0xA1, 0x01, 0x49, 0xE3, 0x83, 0xA1, 0xE3, + 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C, 0xE1, + 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0xE1, 0x84, 0x8B, + 0xE1, 0x85, 0xB4, 0x01, 0x4C, 0xE3, 0x82, 0xAD, + 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, + 0x99, 0x0D, 0x4C, 0xE3, 0x82, 0xB3, 0xE3, 0x83, + // Bytes 2ec0 - 2eff + 0xBC, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D, + 0x4C, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE1, + 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, + 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA9, 0x01, 0x4F, + 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x8B, 0xE3, 0x83, + 0xB3, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, + 0x4F, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xAA, 0xE3, + // Bytes 2f00 - 2f3f + 0x83, 0xB3, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, + 0x0D, 0x4F, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB7, 0xE3, 0x82, + 0x99, 0x0D, 0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, + 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, + 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x82, 0xA8, 0xE3, + 0x82, 0xB9, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x52, + // Bytes 2f40 - 2f7f + 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA1, 0xE3, 0x83, + 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, + 0x82, 0x99, 0x0D, 0x86, 0xE0, 0xB3, 0x86, 0xE0, + 0xB3, 0x82, 0x01, 0x86, 0xE0, 0xB7, 0x99, 0xE0, + 0xB7, 0x8F, 0x01, 0x03, 0x3C, 0xCC, 0xB8, 0x05, + 0x03, 0x3D, 0xCC, 0xB8, 0x05, 0x03, 0x3E, 0xCC, + 0xB8, 0x05, 0x03, 0x41, 0xCC, 0x80, 0xC9, 0x03, + 0x41, 0xCC, 0x81, 0xC9, 0x03, 0x41, 0xCC, 0x83, + // Bytes 2f80 - 2fbf + 0xC9, 0x03, 0x41, 0xCC, 0x84, 0xC9, 0x03, 0x41, + 0xCC, 0x89, 0xC9, 0x03, 0x41, 0xCC, 0x8C, 0xC9, + 0x03, 0x41, 0xCC, 0x8F, 0xC9, 0x03, 0x41, 0xCC, + 0x91, 0xC9, 0x03, 0x41, 0xCC, 0xA5, 0xB5, 0x03, + 0x41, 0xCC, 0xA8, 0xA5, 0x03, 0x42, 0xCC, 0x87, + 0xC9, 0x03, 0x42, 0xCC, 0xA3, 0xB5, 0x03, 0x42, + 0xCC, 0xB1, 0xB5, 0x03, 0x43, 0xCC, 0x81, 0xC9, + 0x03, 0x43, 0xCC, 0x82, 0xC9, 0x03, 0x43, 0xCC, + // Bytes 2fc0 - 2fff + 0x87, 0xC9, 0x03, 0x43, 0xCC, 0x8C, 0xC9, 0x03, + 0x44, 0xCC, 0x87, 0xC9, 0x03, 0x44, 0xCC, 0x8C, + 0xC9, 0x03, 0x44, 0xCC, 0xA3, 0xB5, 0x03, 0x44, + 0xCC, 0xA7, 0xA5, 0x03, 0x44, 0xCC, 0xAD, 0xB5, + 0x03, 0x44, 0xCC, 0xB1, 0xB5, 0x03, 0x45, 0xCC, + 0x80, 0xC9, 0x03, 0x45, 0xCC, 0x81, 0xC9, 0x03, + 0x45, 0xCC, 0x83, 0xC9, 0x03, 0x45, 0xCC, 0x86, + 0xC9, 0x03, 0x45, 0xCC, 0x87, 0xC9, 0x03, 0x45, + // Bytes 3000 - 303f + 0xCC, 0x88, 0xC9, 0x03, 0x45, 0xCC, 0x89, 0xC9, + 0x03, 0x45, 0xCC, 0x8C, 0xC9, 0x03, 0x45, 0xCC, + 0x8F, 0xC9, 0x03, 0x45, 0xCC, 0x91, 0xC9, 0x03, + 0x45, 0xCC, 0xA8, 0xA5, 0x03, 0x45, 0xCC, 0xAD, + 0xB5, 0x03, 0x45, 0xCC, 0xB0, 0xB5, 0x03, 0x46, + 0xCC, 0x87, 0xC9, 0x03, 0x47, 0xCC, 0x81, 0xC9, + 0x03, 0x47, 0xCC, 0x82, 0xC9, 0x03, 0x47, 0xCC, + 0x84, 0xC9, 0x03, 0x47, 0xCC, 0x86, 0xC9, 0x03, + // Bytes 3040 - 307f + 0x47, 0xCC, 0x87, 0xC9, 0x03, 0x47, 0xCC, 0x8C, + 0xC9, 0x03, 0x47, 0xCC, 0xA7, 0xA5, 0x03, 0x48, + 0xCC, 0x82, 0xC9, 0x03, 0x48, 0xCC, 0x87, 0xC9, + 0x03, 0x48, 0xCC, 0x88, 0xC9, 0x03, 0x48, 0xCC, + 0x8C, 0xC9, 0x03, 0x48, 0xCC, 0xA3, 0xB5, 0x03, + 0x48, 0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0xAE, + 0xB5, 0x03, 0x49, 0xCC, 0x80, 0xC9, 0x03, 0x49, + 0xCC, 0x81, 0xC9, 0x03, 0x49, 0xCC, 0x82, 0xC9, + // Bytes 3080 - 30bf + 0x03, 0x49, 0xCC, 0x83, 0xC9, 0x03, 0x49, 0xCC, + 0x84, 0xC9, 0x03, 0x49, 0xCC, 0x86, 0xC9, 0x03, + 0x49, 0xCC, 0x87, 0xC9, 0x03, 0x49, 0xCC, 0x89, + 0xC9, 0x03, 0x49, 0xCC, 0x8C, 0xC9, 0x03, 0x49, + 0xCC, 0x8F, 0xC9, 0x03, 0x49, 0xCC, 0x91, 0xC9, + 0x03, 0x49, 0xCC, 0xA3, 0xB5, 0x03, 0x49, 0xCC, + 0xA8, 0xA5, 0x03, 0x49, 0xCC, 0xB0, 0xB5, 0x03, + 0x4A, 0xCC, 0x82, 0xC9, 0x03, 0x4B, 0xCC, 0x81, + // Bytes 30c0 - 30ff + 0xC9, 0x03, 0x4B, 0xCC, 0x8C, 0xC9, 0x03, 0x4B, + 0xCC, 0xA3, 0xB5, 0x03, 0x4B, 0xCC, 0xA7, 0xA5, + 0x03, 0x4B, 0xCC, 0xB1, 0xB5, 0x03, 0x4C, 0xCC, + 0x81, 0xC9, 0x03, 0x4C, 0xCC, 0x8C, 0xC9, 0x03, + 0x4C, 0xCC, 0xA7, 0xA5, 0x03, 0x4C, 0xCC, 0xAD, + 0xB5, 0x03, 0x4C, 0xCC, 0xB1, 0xB5, 0x03, 0x4D, + 0xCC, 0x81, 0xC9, 0x03, 0x4D, 0xCC, 0x87, 0xC9, + 0x03, 0x4D, 0xCC, 0xA3, 0xB5, 0x03, 0x4E, 0xCC, + // Bytes 3100 - 313f + 0x80, 0xC9, 0x03, 0x4E, 0xCC, 0x81, 0xC9, 0x03, + 0x4E, 0xCC, 0x83, 0xC9, 0x03, 0x4E, 0xCC, 0x87, + 0xC9, 0x03, 0x4E, 0xCC, 0x8C, 0xC9, 0x03, 0x4E, + 0xCC, 0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0xA7, 0xA5, + 0x03, 0x4E, 0xCC, 0xAD, 0xB5, 0x03, 0x4E, 0xCC, + 0xB1, 0xB5, 0x03, 0x4F, 0xCC, 0x80, 0xC9, 0x03, + 0x4F, 0xCC, 0x81, 0xC9, 0x03, 0x4F, 0xCC, 0x86, + 0xC9, 0x03, 0x4F, 0xCC, 0x89, 0xC9, 0x03, 0x4F, + // Bytes 3140 - 317f + 0xCC, 0x8B, 0xC9, 0x03, 0x4F, 0xCC, 0x8C, 0xC9, + 0x03, 0x4F, 0xCC, 0x8F, 0xC9, 0x03, 0x4F, 0xCC, + 0x91, 0xC9, 0x03, 0x50, 0xCC, 0x81, 0xC9, 0x03, + 0x50, 0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x81, + 0xC9, 0x03, 0x52, 0xCC, 0x87, 0xC9, 0x03, 0x52, + 0xCC, 0x8C, 0xC9, 0x03, 0x52, 0xCC, 0x8F, 0xC9, + 0x03, 0x52, 0xCC, 0x91, 0xC9, 0x03, 0x52, 0xCC, + 0xA7, 0xA5, 0x03, 0x52, 0xCC, 0xB1, 0xB5, 0x03, + // Bytes 3180 - 31bf + 0x53, 0xCC, 0x82, 0xC9, 0x03, 0x53, 0xCC, 0x87, + 0xC9, 0x03, 0x53, 0xCC, 0xA6, 0xB5, 0x03, 0x53, + 0xCC, 0xA7, 0xA5, 0x03, 0x54, 0xCC, 0x87, 0xC9, + 0x03, 0x54, 0xCC, 0x8C, 0xC9, 0x03, 0x54, 0xCC, + 0xA3, 0xB5, 0x03, 0x54, 0xCC, 0xA6, 0xB5, 0x03, + 0x54, 0xCC, 0xA7, 0xA5, 0x03, 0x54, 0xCC, 0xAD, + 0xB5, 0x03, 0x54, 0xCC, 0xB1, 0xB5, 0x03, 0x55, + 0xCC, 0x80, 0xC9, 0x03, 0x55, 0xCC, 0x81, 0xC9, + // Bytes 31c0 - 31ff + 0x03, 0x55, 0xCC, 0x82, 0xC9, 0x03, 0x55, 0xCC, + 0x86, 0xC9, 0x03, 0x55, 0xCC, 0x89, 0xC9, 0x03, + 0x55, 0xCC, 0x8A, 0xC9, 0x03, 0x55, 0xCC, 0x8B, + 0xC9, 0x03, 0x55, 0xCC, 0x8C, 0xC9, 0x03, 0x55, + 0xCC, 0x8F, 0xC9, 0x03, 0x55, 0xCC, 0x91, 0xC9, + 0x03, 0x55, 0xCC, 0xA3, 0xB5, 0x03, 0x55, 0xCC, + 0xA4, 0xB5, 0x03, 0x55, 0xCC, 0xA8, 0xA5, 0x03, + 0x55, 0xCC, 0xAD, 0xB5, 0x03, 0x55, 0xCC, 0xB0, + // Bytes 3200 - 323f + 0xB5, 0x03, 0x56, 0xCC, 0x83, 0xC9, 0x03, 0x56, + 0xCC, 0xA3, 0xB5, 0x03, 0x57, 0xCC, 0x80, 0xC9, + 0x03, 0x57, 0xCC, 0x81, 0xC9, 0x03, 0x57, 0xCC, + 0x82, 0xC9, 0x03, 0x57, 0xCC, 0x87, 0xC9, 0x03, + 0x57, 0xCC, 0x88, 0xC9, 0x03, 0x57, 0xCC, 0xA3, + 0xB5, 0x03, 0x58, 0xCC, 0x87, 0xC9, 0x03, 0x58, + 0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x80, 0xC9, + 0x03, 0x59, 0xCC, 0x81, 0xC9, 0x03, 0x59, 0xCC, + // Bytes 3240 - 327f + 0x82, 0xC9, 0x03, 0x59, 0xCC, 0x83, 0xC9, 0x03, + 0x59, 0xCC, 0x84, 0xC9, 0x03, 0x59, 0xCC, 0x87, + 0xC9, 0x03, 0x59, 0xCC, 0x88, 0xC9, 0x03, 0x59, + 0xCC, 0x89, 0xC9, 0x03, 0x59, 0xCC, 0xA3, 0xB5, + 0x03, 0x5A, 0xCC, 0x81, 0xC9, 0x03, 0x5A, 0xCC, + 0x82, 0xC9, 0x03, 0x5A, 0xCC, 0x87, 0xC9, 0x03, + 0x5A, 0xCC, 0x8C, 0xC9, 0x03, 0x5A, 0xCC, 0xA3, + 0xB5, 0x03, 0x5A, 0xCC, 0xB1, 0xB5, 0x03, 0x61, + // Bytes 3280 - 32bf + 0xCC, 0x80, 0xC9, 0x03, 0x61, 0xCC, 0x81, 0xC9, + 0x03, 0x61, 0xCC, 0x83, 0xC9, 0x03, 0x61, 0xCC, + 0x84, 0xC9, 0x03, 0x61, 0xCC, 0x89, 0xC9, 0x03, + 0x61, 0xCC, 0x8C, 0xC9, 0x03, 0x61, 0xCC, 0x8F, + 0xC9, 0x03, 0x61, 0xCC, 0x91, 0xC9, 0x03, 0x61, + 0xCC, 0xA5, 0xB5, 0x03, 0x61, 0xCC, 0xA8, 0xA5, + 0x03, 0x62, 0xCC, 0x87, 0xC9, 0x03, 0x62, 0xCC, + 0xA3, 0xB5, 0x03, 0x62, 0xCC, 0xB1, 0xB5, 0x03, + // Bytes 32c0 - 32ff + 0x63, 0xCC, 0x81, 0xC9, 0x03, 0x63, 0xCC, 0x82, + 0xC9, 0x03, 0x63, 0xCC, 0x87, 0xC9, 0x03, 0x63, + 0xCC, 0x8C, 0xC9, 0x03, 0x64, 0xCC, 0x87, 0xC9, + 0x03, 0x64, 0xCC, 0x8C, 0xC9, 0x03, 0x64, 0xCC, + 0xA3, 0xB5, 0x03, 0x64, 0xCC, 0xA7, 0xA5, 0x03, + 0x64, 0xCC, 0xAD, 0xB5, 0x03, 0x64, 0xCC, 0xB1, + 0xB5, 0x03, 0x65, 0xCC, 0x80, 0xC9, 0x03, 0x65, + 0xCC, 0x81, 0xC9, 0x03, 0x65, 0xCC, 0x83, 0xC9, + // Bytes 3300 - 333f + 0x03, 0x65, 0xCC, 0x86, 0xC9, 0x03, 0x65, 0xCC, + 0x87, 0xC9, 0x03, 0x65, 0xCC, 0x88, 0xC9, 0x03, + 0x65, 0xCC, 0x89, 0xC9, 0x03, 0x65, 0xCC, 0x8C, + 0xC9, 0x03, 0x65, 0xCC, 0x8F, 0xC9, 0x03, 0x65, + 0xCC, 0x91, 0xC9, 0x03, 0x65, 0xCC, 0xA8, 0xA5, + 0x03, 0x65, 0xCC, 0xAD, 0xB5, 0x03, 0x65, 0xCC, + 0xB0, 0xB5, 0x03, 0x66, 0xCC, 0x87, 0xC9, 0x03, + 0x67, 0xCC, 0x81, 0xC9, 0x03, 0x67, 0xCC, 0x82, + // Bytes 3340 - 337f + 0xC9, 0x03, 0x67, 0xCC, 0x84, 0xC9, 0x03, 0x67, + 0xCC, 0x86, 0xC9, 0x03, 0x67, 0xCC, 0x87, 0xC9, + 0x03, 0x67, 0xCC, 0x8C, 0xC9, 0x03, 0x67, 0xCC, + 0xA7, 0xA5, 0x03, 0x68, 0xCC, 0x82, 0xC9, 0x03, + 0x68, 0xCC, 0x87, 0xC9, 0x03, 0x68, 0xCC, 0x88, + 0xC9, 0x03, 0x68, 0xCC, 0x8C, 0xC9, 0x03, 0x68, + 0xCC, 0xA3, 0xB5, 0x03, 0x68, 0xCC, 0xA7, 0xA5, + 0x03, 0x68, 0xCC, 0xAE, 0xB5, 0x03, 0x68, 0xCC, + // Bytes 3380 - 33bf + 0xB1, 0xB5, 0x03, 0x69, 0xCC, 0x80, 0xC9, 0x03, + 0x69, 0xCC, 0x81, 0xC9, 0x03, 0x69, 0xCC, 0x82, + 0xC9, 0x03, 0x69, 0xCC, 0x83, 0xC9, 0x03, 0x69, + 0xCC, 0x84, 0xC9, 0x03, 0x69, 0xCC, 0x86, 0xC9, + 0x03, 0x69, 0xCC, 0x89, 0xC9, 0x03, 0x69, 0xCC, + 0x8C, 0xC9, 0x03, 0x69, 0xCC, 0x8F, 0xC9, 0x03, + 0x69, 0xCC, 0x91, 0xC9, 0x03, 0x69, 0xCC, 0xA3, + 0xB5, 0x03, 0x69, 0xCC, 0xA8, 0xA5, 0x03, 0x69, + // Bytes 33c0 - 33ff + 0xCC, 0xB0, 0xB5, 0x03, 0x6A, 0xCC, 0x82, 0xC9, + 0x03, 0x6A, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, + 0x81, 0xC9, 0x03, 0x6B, 0xCC, 0x8C, 0xC9, 0x03, + 0x6B, 0xCC, 0xA3, 0xB5, 0x03, 0x6B, 0xCC, 0xA7, + 0xA5, 0x03, 0x6B, 0xCC, 0xB1, 0xB5, 0x03, 0x6C, + 0xCC, 0x81, 0xC9, 0x03, 0x6C, 0xCC, 0x8C, 0xC9, + 0x03, 0x6C, 0xCC, 0xA7, 0xA5, 0x03, 0x6C, 0xCC, + 0xAD, 0xB5, 0x03, 0x6C, 0xCC, 0xB1, 0xB5, 0x03, + // Bytes 3400 - 343f + 0x6D, 0xCC, 0x81, 0xC9, 0x03, 0x6D, 0xCC, 0x87, + 0xC9, 0x03, 0x6D, 0xCC, 0xA3, 0xB5, 0x03, 0x6E, + 0xCC, 0x80, 0xC9, 0x03, 0x6E, 0xCC, 0x81, 0xC9, + 0x03, 0x6E, 0xCC, 0x83, 0xC9, 0x03, 0x6E, 0xCC, + 0x87, 0xC9, 0x03, 0x6E, 0xCC, 0x8C, 0xC9, 0x03, + 0x6E, 0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0xA7, + 0xA5, 0x03, 0x6E, 0xCC, 0xAD, 0xB5, 0x03, 0x6E, + 0xCC, 0xB1, 0xB5, 0x03, 0x6F, 0xCC, 0x80, 0xC9, + // Bytes 3440 - 347f + 0x03, 0x6F, 0xCC, 0x81, 0xC9, 0x03, 0x6F, 0xCC, + 0x86, 0xC9, 0x03, 0x6F, 0xCC, 0x89, 0xC9, 0x03, + 0x6F, 0xCC, 0x8B, 0xC9, 0x03, 0x6F, 0xCC, 0x8C, + 0xC9, 0x03, 0x6F, 0xCC, 0x8F, 0xC9, 0x03, 0x6F, + 0xCC, 0x91, 0xC9, 0x03, 0x70, 0xCC, 0x81, 0xC9, + 0x03, 0x70, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, + 0x81, 0xC9, 0x03, 0x72, 0xCC, 0x87, 0xC9, 0x03, + 0x72, 0xCC, 0x8C, 0xC9, 0x03, 0x72, 0xCC, 0x8F, + // Bytes 3480 - 34bf + 0xC9, 0x03, 0x72, 0xCC, 0x91, 0xC9, 0x03, 0x72, + 0xCC, 0xA7, 0xA5, 0x03, 0x72, 0xCC, 0xB1, 0xB5, + 0x03, 0x73, 0xCC, 0x82, 0xC9, 0x03, 0x73, 0xCC, + 0x87, 0xC9, 0x03, 0x73, 0xCC, 0xA6, 0xB5, 0x03, + 0x73, 0xCC, 0xA7, 0xA5, 0x03, 0x74, 0xCC, 0x87, + 0xC9, 0x03, 0x74, 0xCC, 0x88, 0xC9, 0x03, 0x74, + 0xCC, 0x8C, 0xC9, 0x03, 0x74, 0xCC, 0xA3, 0xB5, + 0x03, 0x74, 0xCC, 0xA6, 0xB5, 0x03, 0x74, 0xCC, + // Bytes 34c0 - 34ff + 0xA7, 0xA5, 0x03, 0x74, 0xCC, 0xAD, 0xB5, 0x03, + 0x74, 0xCC, 0xB1, 0xB5, 0x03, 0x75, 0xCC, 0x80, + 0xC9, 0x03, 0x75, 0xCC, 0x81, 0xC9, 0x03, 0x75, + 0xCC, 0x82, 0xC9, 0x03, 0x75, 0xCC, 0x86, 0xC9, + 0x03, 0x75, 0xCC, 0x89, 0xC9, 0x03, 0x75, 0xCC, + 0x8A, 0xC9, 0x03, 0x75, 0xCC, 0x8B, 0xC9, 0x03, + 0x75, 0xCC, 0x8C, 0xC9, 0x03, 0x75, 0xCC, 0x8F, + 0xC9, 0x03, 0x75, 0xCC, 0x91, 0xC9, 0x03, 0x75, + // Bytes 3500 - 353f + 0xCC, 0xA3, 0xB5, 0x03, 0x75, 0xCC, 0xA4, 0xB5, + 0x03, 0x75, 0xCC, 0xA8, 0xA5, 0x03, 0x75, 0xCC, + 0xAD, 0xB5, 0x03, 0x75, 0xCC, 0xB0, 0xB5, 0x03, + 0x76, 0xCC, 0x83, 0xC9, 0x03, 0x76, 0xCC, 0xA3, + 0xB5, 0x03, 0x77, 0xCC, 0x80, 0xC9, 0x03, 0x77, + 0xCC, 0x81, 0xC9, 0x03, 0x77, 0xCC, 0x82, 0xC9, + 0x03, 0x77, 0xCC, 0x87, 0xC9, 0x03, 0x77, 0xCC, + 0x88, 0xC9, 0x03, 0x77, 0xCC, 0x8A, 0xC9, 0x03, + // Bytes 3540 - 357f + 0x77, 0xCC, 0xA3, 0xB5, 0x03, 0x78, 0xCC, 0x87, + 0xC9, 0x03, 0x78, 0xCC, 0x88, 0xC9, 0x03, 0x79, + 0xCC, 0x80, 0xC9, 0x03, 0x79, 0xCC, 0x81, 0xC9, + 0x03, 0x79, 0xCC, 0x82, 0xC9, 0x03, 0x79, 0xCC, + 0x83, 0xC9, 0x03, 0x79, 0xCC, 0x84, 0xC9, 0x03, + 0x79, 0xCC, 0x87, 0xC9, 0x03, 0x79, 0xCC, 0x88, + 0xC9, 0x03, 0x79, 0xCC, 0x89, 0xC9, 0x03, 0x79, + 0xCC, 0x8A, 0xC9, 0x03, 0x79, 0xCC, 0xA3, 0xB5, + // Bytes 3580 - 35bf + 0x03, 0x7A, 0xCC, 0x81, 0xC9, 0x03, 0x7A, 0xCC, + 0x82, 0xC9, 0x03, 0x7A, 0xCC, 0x87, 0xC9, 0x03, + 0x7A, 0xCC, 0x8C, 0xC9, 0x03, 0x7A, 0xCC, 0xA3, + 0xB5, 0x03, 0x7A, 0xCC, 0xB1, 0xB5, 0x04, 0xC2, + 0xA8, 0xCC, 0x80, 0xCA, 0x04, 0xC2, 0xA8, 0xCC, + 0x81, 0xCA, 0x04, 0xC2, 0xA8, 0xCD, 0x82, 0xCA, + 0x04, 0xC3, 0x86, 0xCC, 0x81, 0xC9, 0x04, 0xC3, + 0x86, 0xCC, 0x84, 0xC9, 0x04, 0xC3, 0x98, 0xCC, + // Bytes 35c0 - 35ff + 0x81, 0xC9, 0x04, 0xC3, 0xA6, 0xCC, 0x81, 0xC9, + 0x04, 0xC3, 0xA6, 0xCC, 0x84, 0xC9, 0x04, 0xC3, + 0xB8, 0xCC, 0x81, 0xC9, 0x04, 0xC5, 0xBF, 0xCC, + 0x87, 0xC9, 0x04, 0xC6, 0xB7, 0xCC, 0x8C, 0xC9, + 0x04, 0xCA, 0x92, 0xCC, 0x8C, 0xC9, 0x04, 0xCE, + 0x91, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x91, 0xCC, + 0x81, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x84, 0xC9, + 0x04, 0xCE, 0x91, 0xCC, 0x86, 0xC9, 0x04, 0xCE, + // Bytes 3600 - 363f + 0x91, 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0x95, 0xCC, + 0x80, 0xC9, 0x04, 0xCE, 0x95, 0xCC, 0x81, 0xC9, + 0x04, 0xCE, 0x97, 0xCC, 0x80, 0xC9, 0x04, 0xCE, + 0x97, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97, 0xCD, + 0x85, 0xD9, 0x04, 0xCE, 0x99, 0xCC, 0x80, 0xC9, + 0x04, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x04, 0xCE, + 0x99, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x99, 0xCC, + 0x86, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x88, 0xC9, + // Bytes 3640 - 367f + 0x04, 0xCE, 0x9F, 0xCC, 0x80, 0xC9, 0x04, 0xCE, + 0x9F, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA1, 0xCC, + 0x94, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x80, 0xC9, + 0x04, 0xCE, 0xA5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, + 0xA5, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, + 0x86, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x88, 0xC9, + 0x04, 0xCE, 0xA9, 0xCC, 0x80, 0xC9, 0x04, 0xCE, + 0xA9, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA9, 0xCD, + // Bytes 3680 - 36bf + 0x85, 0xD9, 0x04, 0xCE, 0xB1, 0xCC, 0x84, 0xC9, + 0x04, 0xCE, 0xB1, 0xCC, 0x86, 0xC9, 0x04, 0xCE, + 0xB1, 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB5, 0xCC, + 0x80, 0xC9, 0x04, 0xCE, 0xB5, 0xCC, 0x81, 0xC9, + 0x04, 0xCE, 0xB7, 0xCD, 0x85, 0xD9, 0x04, 0xCE, + 0xB9, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xB9, 0xCC, + 0x81, 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x84, 0xC9, + 0x04, 0xCE, 0xB9, 0xCC, 0x86, 0xC9, 0x04, 0xCE, + // Bytes 36c0 - 36ff + 0xB9, 0xCD, 0x82, 0xC9, 0x04, 0xCE, 0xBF, 0xCC, + 0x80, 0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x81, 0xC9, + 0x04, 0xCF, 0x81, 0xCC, 0x93, 0xC9, 0x04, 0xCF, + 0x81, 0xCC, 0x94, 0xC9, 0x04, 0xCF, 0x85, 0xCC, + 0x80, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x81, 0xC9, + 0x04, 0xCF, 0x85, 0xCC, 0x84, 0xC9, 0x04, 0xCF, + 0x85, 0xCC, 0x86, 0xC9, 0x04, 0xCF, 0x85, 0xCD, + 0x82, 0xC9, 0x04, 0xCF, 0x89, 0xCD, 0x85, 0xD9, + // Bytes 3700 - 373f + 0x04, 0xCF, 0x92, 0xCC, 0x81, 0xC9, 0x04, 0xCF, + 0x92, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x86, 0xCC, + 0x88, 0xC9, 0x04, 0xD0, 0x90, 0xCC, 0x86, 0xC9, + 0x04, 0xD0, 0x90, 0xCC, 0x88, 0xC9, 0x04, 0xD0, + 0x93, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x95, 0xCC, + 0x80, 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x86, 0xC9, + 0x04, 0xD0, 0x95, 0xCC, 0x88, 0xC9, 0x04, 0xD0, + 0x96, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x96, 0xCC, + // Bytes 3740 - 377f + 0x88, 0xC9, 0x04, 0xD0, 0x97, 0xCC, 0x88, 0xC9, + 0x04, 0xD0, 0x98, 0xCC, 0x80, 0xC9, 0x04, 0xD0, + 0x98, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0x98, 0xCC, + 0x86, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x88, 0xC9, + 0x04, 0xD0, 0x9A, 0xCC, 0x81, 0xC9, 0x04, 0xD0, + 0x9E, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, + 0x84, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x86, 0xC9, + 0x04, 0xD0, 0xA3, 0xCC, 0x88, 0xC9, 0x04, 0xD0, + // Bytes 3780 - 37bf + 0xA3, 0xCC, 0x8B, 0xC9, 0x04, 0xD0, 0xA7, 0xCC, + 0x88, 0xC9, 0x04, 0xD0, 0xAB, 0xCC, 0x88, 0xC9, + 0x04, 0xD0, 0xAD, 0xCC, 0x88, 0xC9, 0x04, 0xD0, + 0xB0, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, + 0x88, 0xC9, 0x04, 0xD0, 0xB3, 0xCC, 0x81, 0xC9, + 0x04, 0xD0, 0xB5, 0xCC, 0x80, 0xC9, 0x04, 0xD0, + 0xB5, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, + 0x88, 0xC9, 0x04, 0xD0, 0xB6, 0xCC, 0x86, 0xC9, + // Bytes 37c0 - 37ff + 0x04, 0xD0, 0xB6, 0xCC, 0x88, 0xC9, 0x04, 0xD0, + 0xB7, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, + 0x80, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x84, 0xC9, + 0x04, 0xD0, 0xB8, 0xCC, 0x86, 0xC9, 0x04, 0xD0, + 0xB8, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xBA, 0xCC, + 0x81, 0xC9, 0x04, 0xD0, 0xBE, 0xCC, 0x88, 0xC9, + 0x04, 0xD1, 0x83, 0xCC, 0x84, 0xC9, 0x04, 0xD1, + 0x83, 0xCC, 0x86, 0xC9, 0x04, 0xD1, 0x83, 0xCC, + // Bytes 3800 - 383f + 0x88, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x8B, 0xC9, + 0x04, 0xD1, 0x87, 0xCC, 0x88, 0xC9, 0x04, 0xD1, + 0x8B, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8D, 0xCC, + 0x88, 0xC9, 0x04, 0xD1, 0x96, 0xCC, 0x88, 0xC9, + 0x04, 0xD1, 0xB4, 0xCC, 0x8F, 0xC9, 0x04, 0xD1, + 0xB5, 0xCC, 0x8F, 0xC9, 0x04, 0xD3, 0x98, 0xCC, + 0x88, 0xC9, 0x04, 0xD3, 0x99, 0xCC, 0x88, 0xC9, + 0x04, 0xD3, 0xA8, 0xCC, 0x88, 0xC9, 0x04, 0xD3, + // Bytes 3840 - 387f + 0xA9, 0xCC, 0x88, 0xC9, 0x04, 0xD8, 0xA7, 0xD9, + 0x93, 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x94, 0xC9, + 0x04, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, 0x04, 0xD9, + 0x88, 0xD9, 0x94, 0xC9, 0x04, 0xD9, 0x8A, 0xD9, + 0x94, 0xC9, 0x04, 0xDB, 0x81, 0xD9, 0x94, 0xC9, + 0x04, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x04, 0xDB, + 0x95, 0xD9, 0x94, 0xC9, 0x05, 0x41, 0xCC, 0x82, + 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x82, 0xCC, + // Bytes 3880 - 38bf + 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x83, + 0xCA, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x89, 0xCA, + 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x80, 0xCA, 0x05, + 0x41, 0xCC, 0x86, 0xCC, 0x81, 0xCA, 0x05, 0x41, + 0xCC, 0x86, 0xCC, 0x83, 0xCA, 0x05, 0x41, 0xCC, + 0x86, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC, 0x87, + 0xCC, 0x84, 0xCA, 0x05, 0x41, 0xCC, 0x88, 0xCC, + 0x84, 0xCA, 0x05, 0x41, 0xCC, 0x8A, 0xCC, 0x81, + // Bytes 38c0 - 38ff + 0xCA, 0x05, 0x41, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, + 0x05, 0x41, 0xCC, 0xA3, 0xCC, 0x86, 0xCA, 0x05, + 0x43, 0xCC, 0xA7, 0xCC, 0x81, 0xCA, 0x05, 0x45, + 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x45, 0xCC, + 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, + 0xCC, 0x83, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, + 0x89, 0xCA, 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x80, + 0xCA, 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x81, 0xCA, + // Bytes 3900 - 393f + 0x05, 0x45, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, + 0x45, 0xCC, 0xA7, 0xCC, 0x86, 0xCA, 0x05, 0x49, + 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x4C, 0xCC, + 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x82, + 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, + 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x83, + 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x89, 0xCA, + 0x05, 0x4F, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, + // Bytes 3940 - 397f + 0x4F, 0xCC, 0x83, 0xCC, 0x84, 0xCA, 0x05, 0x4F, + 0xCC, 0x83, 0xCC, 0x88, 0xCA, 0x05, 0x4F, 0xCC, + 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, 0x84, + 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x87, 0xCC, + 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x88, 0xCC, 0x84, + 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, + 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, + 0x4F, 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x4F, + // Bytes 3980 - 39bf + 0xCC, 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC, + 0x9B, 0xCC, 0xA3, 0xB6, 0x05, 0x4F, 0xCC, 0xA3, + 0xCC, 0x82, 0xCA, 0x05, 0x4F, 0xCC, 0xA8, 0xCC, + 0x84, 0xCA, 0x05, 0x52, 0xCC, 0xA3, 0xCC, 0x84, + 0xCA, 0x05, 0x53, 0xCC, 0x81, 0xCC, 0x87, 0xCA, + 0x05, 0x53, 0xCC, 0x8C, 0xCC, 0x87, 0xCA, 0x05, + 0x53, 0xCC, 0xA3, 0xCC, 0x87, 0xCA, 0x05, 0x55, + 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, + // Bytes 39c0 - 39ff + 0x84, 0xCC, 0x88, 0xCA, 0x05, 0x55, 0xCC, 0x88, + 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, + 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x84, + 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x8C, 0xCA, + 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, + 0x55, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x55, + 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x55, 0xCC, + 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x55, 0xCC, 0x9B, + // Bytes 3a00 - 3a3f + 0xCC, 0xA3, 0xB6, 0x05, 0x61, 0xCC, 0x82, 0xCC, + 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x81, + 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x83, 0xCA, + 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, + 0x61, 0xCC, 0x86, 0xCC, 0x80, 0xCA, 0x05, 0x61, + 0xCC, 0x86, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC, + 0x86, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC, 0x86, + 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x87, 0xCC, + // Bytes 3a40 - 3a7f + 0x84, 0xCA, 0x05, 0x61, 0xCC, 0x88, 0xCC, 0x84, + 0xCA, 0x05, 0x61, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, + 0x05, 0x61, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, + 0x61, 0xCC, 0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x63, + 0xCC, 0xA7, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, + 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC, 0x82, + 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, + 0x83, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x89, + // Bytes 3a80 - 3abf + 0xCA, 0x05, 0x65, 0xCC, 0x84, 0xCC, 0x80, 0xCA, + 0x05, 0x65, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, + 0x65, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x65, + 0xCC, 0xA7, 0xCC, 0x86, 0xCA, 0x05, 0x69, 0xCC, + 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x6C, 0xCC, 0xA3, + 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, + 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x81, + 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, + // Bytes 3ac0 - 3aff + 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, + 0x6F, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x6F, + 0xCC, 0x83, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, + 0x83, 0xCC, 0x88, 0xCA, 0x05, 0x6F, 0xCC, 0x84, + 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, + 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x87, 0xCC, 0x84, + 0xCA, 0x05, 0x6F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, + 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, + // Bytes 3b00 - 3b3f + 0x6F, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x6F, + 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC, + 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, + 0xCC, 0xA3, 0xB6, 0x05, 0x6F, 0xCC, 0xA3, 0xCC, + 0x82, 0xCA, 0x05, 0x6F, 0xCC, 0xA8, 0xCC, 0x84, + 0xCA, 0x05, 0x72, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, + 0x05, 0x73, 0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, + 0x73, 0xCC, 0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x73, + // Bytes 3b40 - 3b7f + 0xCC, 0xA3, 0xCC, 0x87, 0xCA, 0x05, 0x75, 0xCC, + 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x84, + 0xCC, 0x88, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, + 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x81, + 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x84, 0xCA, + 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, + 0x75, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x75, + 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x75, 0xCC, + // Bytes 3b80 - 3bbf + 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x75, 0xCC, 0x9B, + 0xCC, 0x89, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, + 0xA3, 0xB6, 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x80, + 0xCA, 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x81, 0xCA, + 0x05, 0xE1, 0xBE, 0xBF, 0xCD, 0x82, 0xCA, 0x05, + 0xE1, 0xBF, 0xBE, 0xCC, 0x80, 0xCA, 0x05, 0xE1, + 0xBF, 0xBE, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBF, + 0xBE, 0xCD, 0x82, 0xCA, 0x05, 0xE2, 0x86, 0x90, + // Bytes 3bc0 - 3bff + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x86, 0x92, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x86, 0x94, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x87, 0x90, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x87, 0x92, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x87, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x88, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, + 0x88, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x8B, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0xA3, 0xCC, + // Bytes 3c00 - 3c3f + 0xB8, 0x05, 0x05, 0xE2, 0x88, 0xA5, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x88, 0xBC, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0x83, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x89, 0x85, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0x88, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0x8D, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA1, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA4, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA5, 0xCC, 0xB8, + // Bytes 3c40 - 3c7f + 0x05, 0x05, 0xE2, 0x89, 0xB2, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xB3, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x89, 0xB6, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0xB7, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0xBA, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBB, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBC, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBD, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x8A, 0x82, 0xCC, 0xB8, 0x05, + // Bytes 3c80 - 3cbf + 0x05, 0xE2, 0x8A, 0x83, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0x86, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x8A, 0x87, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + 0x91, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x92, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA2, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x8A, 0xA9, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x8A, 0xAB, 0xCC, 0xB8, 0x05, 0x05, + // Bytes 3cc0 - 3cff + 0xE2, 0x8A, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x8A, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + 0xB4, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB5, + 0xCC, 0xB8, 0x05, 0x06, 0xCE, 0x91, 0xCC, 0x93, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x91, 0xCC, 0x94, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x95, 0xCC, 0x93, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x95, 0xCC, 0x93, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x95, 0xCC, 0x94, + // Bytes 3d00 - 3d3f + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x95, 0xCC, 0x94, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x97, 0xCC, 0x93, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x97, 0xCC, 0x94, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x99, 0xCC, 0x93, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x93, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x93, + 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x94, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x94, + // Bytes 3d40 - 3d7f + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x99, 0xCC, 0x94, + 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x93, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x93, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x94, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, 0x94, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, 0x94, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, 0x94, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, 0x94, + // Bytes 3d80 - 3dbf + 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xA9, 0xCC, 0x93, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xA9, 0xCC, 0x94, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x80, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x81, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x93, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, 0x94, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCD, 0x82, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB5, 0xCC, 0x93, + // Bytes 3dc0 - 3dff + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB5, 0xCC, 0x93, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB5, 0xCC, 0x94, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB5, 0xCC, 0x94, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB7, 0xCC, 0x80, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, 0x81, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, 0x93, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, 0x94, + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCD, 0x82, + // Bytes 3e00 - 3e3f + 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB9, 0xCC, 0x88, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x88, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x88, + 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x93, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x93, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x93, + 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x94, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x94, + // Bytes 3e40 - 3e7f + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, 0x94, + 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x93, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x93, + 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x94, + 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, 0x94, + 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x88, + 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x88, + 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x88, + // Bytes 3e80 - 3ebf + 0xCD, 0x82, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x93, + 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x93, + 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x93, + 0xCD, 0x82, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x94, + 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x94, + 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, 0x94, + 0xCD, 0x82, 0xCA, 0x06, 0xCF, 0x89, 0xCC, 0x80, + 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCC, 0x81, + // Bytes 3ec0 - 3eff + 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCC, 0x93, + 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCC, 0x94, + 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCD, 0x82, + 0xCD, 0x85, 0xDA, 0x06, 0xE0, 0xA4, 0xA8, 0xE0, + 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xA4, 0xB0, 0xE0, + 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xA4, 0xB3, 0xE0, + 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xB1, 0x86, 0xE0, + 0xB1, 0x96, 0x85, 0x06, 0xE0, 0xB7, 0x99, 0xE0, + // Bytes 3f00 - 3f3f + 0xB7, 0x8A, 0x11, 0x06, 0xE3, 0x81, 0x86, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8B, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8D, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8F, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x91, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x93, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x95, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x97, 0xE3, + // Bytes 3f40 - 3f7f + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x99, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9B, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9D, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9F, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA1, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA4, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA6, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA8, 0xE3, + // Bytes 3f80 - 3fbf + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xAF, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xAF, 0xE3, + 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB2, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB2, 0xE3, + 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB5, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB5, 0xE3, + 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB8, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB8, 0xE3, + // Bytes 3fc0 - 3fff + 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xBB, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xBB, 0xE3, + 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x82, 0x9D, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xA6, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAB, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAD, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAF, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB1, 0xE3, + // Bytes 4000 - 403f + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB3, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB5, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB7, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB9, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBB, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBD, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBF, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x81, 0xE3, + // Bytes 4040 - 407f + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x84, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x86, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x88, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x92, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x92, 0xE3, + 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x95, 0xE3, + // Bytes 4080 - 40bf + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x95, 0xE3, + 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x98, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x98, 0xE3, + 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x9B, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x9B, 0xE3, + 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0xAF, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xB0, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xB1, 0xE3, + // Bytes 40c0 - 40ff + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xB2, 0xE3, + 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xBD, 0xE3, + 0x82, 0x99, 0x0D, 0x08, 0xCE, 0x91, 0xCC, 0x93, + 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, + 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, + 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, + 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, + 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, + // Bytes 4100 - 413f + 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, + 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, + 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, + 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x93, + 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, + 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, + 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, + // Bytes 4140 - 417f + 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, + 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, + 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, + 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, + 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, + 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, + 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, + 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, + // Bytes 4180 - 41bf + 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, + 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, + 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x93, + 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, + 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, + 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, + 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, + // Bytes 41c0 - 41ff + 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, + 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, + 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, + 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, + 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, + 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, + 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, + 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, + // Bytes 4200 - 423f + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, + 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, + 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x93, + 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, + 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, + 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, + 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, + 0xCD, 0x85, 0xDB, 0x08, 0xF0, 0x91, 0x82, 0x99, + // Bytes 4240 - 427f + 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, + 0x82, 0x9B, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x08, + 0xF0, 0x91, 0x82, 0xA5, 0xF0, 0x91, 0x82, 0xBA, + 0x09, 0x42, 0xC2, 0xB4, 0x01, 0x43, 0x20, 0xCC, + 0x81, 0xC9, 0x43, 0x20, 0xCC, 0x83, 0xC9, 0x43, + 0x20, 0xCC, 0x84, 0xC9, 0x43, 0x20, 0xCC, 0x85, + 0xC9, 0x43, 0x20, 0xCC, 0x86, 0xC9, 0x43, 0x20, + 0xCC, 0x87, 0xC9, 0x43, 0x20, 0xCC, 0x88, 0xC9, + // Bytes 4280 - 42bf + 0x43, 0x20, 0xCC, 0x8A, 0xC9, 0x43, 0x20, 0xCC, + 0x8B, 0xC9, 0x43, 0x20, 0xCC, 0x93, 0xC9, 0x43, + 0x20, 0xCC, 0x94, 0xC9, 0x43, 0x20, 0xCC, 0xA7, + 0xA5, 0x43, 0x20, 0xCC, 0xA8, 0xA5, 0x43, 0x20, + 0xCC, 0xB3, 0xB5, 0x43, 0x20, 0xCD, 0x82, 0xC9, + 0x43, 0x20, 0xCD, 0x85, 0xD9, 0x43, 0x20, 0xD9, + 0x8B, 0x59, 0x43, 0x20, 0xD9, 0x8C, 0x5D, 0x43, + 0x20, 0xD9, 0x8D, 0x61, 0x43, 0x20, 0xD9, 0x8E, + // Bytes 42c0 - 42ff + 0x65, 0x43, 0x20, 0xD9, 0x8F, 0x69, 0x43, 0x20, + 0xD9, 0x90, 0x6D, 0x43, 0x20, 0xD9, 0x91, 0x71, + 0x43, 0x20, 0xD9, 0x92, 0x75, 0x43, 0x41, 0xCC, + 0x8A, 0xC9, 0x43, 0x73, 0xCC, 0x87, 0xC9, 0x44, + 0x20, 0xE3, 0x82, 0x99, 0x0D, 0x44, 0x20, 0xE3, + 0x82, 0x9A, 0x0D, 0x44, 0xC2, 0xA8, 0xCC, 0x81, + 0xCA, 0x44, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x44, + 0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x97, + // Bytes 4300 - 433f + 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x99, 0xCC, 0x81, + 0xC9, 0x44, 0xCE, 0x9F, 0xCC, 0x81, 0xC9, 0x44, + 0xCE, 0xA5, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, + 0xCC, 0x88, 0xC9, 0x44, 0xCE, 0xA9, 0xCC, 0x81, + 0xC9, 0x44, 0xCE, 0xB1, 0xCC, 0x81, 0xC9, 0x44, + 0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB7, + 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB9, 0xCC, 0x81, + 0xC9, 0x44, 0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x44, + // Bytes 4340 - 437f + 0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x89, + 0xCC, 0x81, 0xC9, 0x44, 0xD7, 0x90, 0xD6, 0xB7, + 0x31, 0x44, 0xD7, 0x90, 0xD6, 0xB8, 0x35, 0x44, + 0xD7, 0x90, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x91, + 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBF, + 0x49, 0x44, 0xD7, 0x92, 0xD6, 0xBC, 0x41, 0x44, + 0xD7, 0x93, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x94, + 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x95, 0xD6, 0xB9, + // Bytes 4380 - 43bf + 0x39, 0x44, 0xD7, 0x95, 0xD6, 0xBC, 0x41, 0x44, + 0xD7, 0x96, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x98, + 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x99, 0xD6, 0xB4, + 0x25, 0x44, 0xD7, 0x99, 0xD6, 0xBC, 0x41, 0x44, + 0xD7, 0x9A, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9B, + 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBF, + 0x49, 0x44, 0xD7, 0x9C, 0xD6, 0xBC, 0x41, 0x44, + 0xD7, 0x9E, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA0, + // Bytes 43c0 - 43ff + 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA1, 0xD6, 0xBC, + 0x41, 0x44, 0xD7, 0xA3, 0xD6, 0xBC, 0x41, 0x44, + 0xD7, 0xA4, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, + 0xD6, 0xBF, 0x49, 0x44, 0xD7, 0xA6, 0xD6, 0xBC, + 0x41, 0x44, 0xD7, 0xA7, 0xD6, 0xBC, 0x41, 0x44, + 0xD7, 0xA8, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA9, + 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD7, 0x81, + 0x4D, 0x44, 0xD7, 0xA9, 0xD7, 0x82, 0x51, 0x44, + // Bytes 4400 - 443f + 0xD7, 0xAA, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xB2, + 0xD6, 0xB7, 0x31, 0x44, 0xD8, 0xA7, 0xD9, 0x8B, + 0x59, 0x44, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x44, + 0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x44, 0xD8, 0xA7, + 0xD9, 0x95, 0xB5, 0x44, 0xD8, 0xB0, 0xD9, 0xB0, + 0x79, 0x44, 0xD8, 0xB1, 0xD9, 0xB0, 0x79, 0x44, + 0xD9, 0x80, 0xD9, 0x8B, 0x59, 0x44, 0xD9, 0x80, + 0xD9, 0x8E, 0x65, 0x44, 0xD9, 0x80, 0xD9, 0x8F, + // Bytes 4440 - 447f + 0x69, 0x44, 0xD9, 0x80, 0xD9, 0x90, 0x6D, 0x44, + 0xD9, 0x80, 0xD9, 0x91, 0x71, 0x44, 0xD9, 0x80, + 0xD9, 0x92, 0x75, 0x44, 0xD9, 0x87, 0xD9, 0xB0, + 0x79, 0x44, 0xD9, 0x88, 0xD9, 0x94, 0xC9, 0x44, + 0xD9, 0x89, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x8A, + 0xD9, 0x94, 0xC9, 0x44, 0xDB, 0x92, 0xD9, 0x94, + 0xC9, 0x44, 0xDB, 0x95, 0xD9, 0x94, 0xC9, 0x45, + 0x20, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x45, 0x20, + // Bytes 4480 - 44bf + 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, + 0x88, 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xCC, 0x93, + 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, + 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCD, 0x82, + 0xCA, 0x45, 0x20, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x45, 0x20, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x45, + 0x20, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x45, 0x20, + 0xD9, 0x8C, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, + // Bytes 44c0 - 44ff + 0x8D, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8E, + 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8F, 0xD9, + 0x91, 0x72, 0x45, 0x20, 0xD9, 0x90, 0xD9, 0x91, + 0x72, 0x45, 0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x7A, + 0x45, 0xE2, 0xAB, 0x9D, 0xCC, 0xB8, 0x05, 0x46, + 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x46, + 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x46, + 0xD7, 0xA9, 0xD6, 0xBC, 0xD7, 0x81, 0x4E, 0x46, + // Bytes 4500 - 453f + 0xD7, 0xA9, 0xD6, 0xBC, 0xD7, 0x82, 0x52, 0x46, + 0xD9, 0x80, 0xD9, 0x8E, 0xD9, 0x91, 0x72, 0x46, + 0xD9, 0x80, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x46, + 0xD9, 0x80, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x46, + 0xE0, 0xA4, 0x95, 0xE0, 0xA4, 0xBC, 0x09, 0x46, + 0xE0, 0xA4, 0x96, 0xE0, 0xA4, 0xBC, 0x09, 0x46, + 0xE0, 0xA4, 0x97, 0xE0, 0xA4, 0xBC, 0x09, 0x46, + 0xE0, 0xA4, 0x9C, 0xE0, 0xA4, 0xBC, 0x09, 0x46, + // Bytes 4540 - 457f + 0xE0, 0xA4, 0xA1, 0xE0, 0xA4, 0xBC, 0x09, 0x46, + 0xE0, 0xA4, 0xA2, 0xE0, 0xA4, 0xBC, 0x09, 0x46, + 0xE0, 0xA4, 0xAB, 0xE0, 0xA4, 0xBC, 0x09, 0x46, + 0xE0, 0xA4, 0xAF, 0xE0, 0xA4, 0xBC, 0x09, 0x46, + 0xE0, 0xA6, 0xA1, 0xE0, 0xA6, 0xBC, 0x09, 0x46, + 0xE0, 0xA6, 0xA2, 0xE0, 0xA6, 0xBC, 0x09, 0x46, + 0xE0, 0xA6, 0xAF, 0xE0, 0xA6, 0xBC, 0x09, 0x46, + 0xE0, 0xA8, 0x96, 0xE0, 0xA8, 0xBC, 0x09, 0x46, + // Bytes 4580 - 45bf + 0xE0, 0xA8, 0x97, 0xE0, 0xA8, 0xBC, 0x09, 0x46, + 0xE0, 0xA8, 0x9C, 0xE0, 0xA8, 0xBC, 0x09, 0x46, + 0xE0, 0xA8, 0xAB, 0xE0, 0xA8, 0xBC, 0x09, 0x46, + 0xE0, 0xA8, 0xB2, 0xE0, 0xA8, 0xBC, 0x09, 0x46, + 0xE0, 0xA8, 0xB8, 0xE0, 0xA8, 0xBC, 0x09, 0x46, + 0xE0, 0xAC, 0xA1, 0xE0, 0xAC, 0xBC, 0x09, 0x46, + 0xE0, 0xAC, 0xA2, 0xE0, 0xAC, 0xBC, 0x09, 0x46, + 0xE0, 0xBE, 0xB2, 0xE0, 0xBE, 0x80, 0x9D, 0x46, + // Bytes 45c0 - 45ff + 0xE0, 0xBE, 0xB3, 0xE0, 0xBE, 0x80, 0x9D, 0x46, + 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D, 0x48, + 0xF0, 0x9D, 0x85, 0x97, 0xF0, 0x9D, 0x85, 0xA5, + 0xAD, 0x48, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, + 0x85, 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xB9, + 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, 0x9D, + 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x49, + 0xE0, 0xBE, 0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, + // Bytes 4600 - 463f + 0x80, 0x9E, 0x49, 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, + 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x4C, 0xF0, 0x9D, + 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, + 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, + 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB0, 0xAE, 0x4C, + 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, + // Bytes 4640 - 467f + 0xF0, 0x9D, 0x85, 0xB1, 0xAE, 0x4C, 0xF0, 0x9D, + 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + 0x85, 0xB2, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, + 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, + 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, + 0xF0, 0x9D, 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, + 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, + // Bytes 4680 - 46bf + 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + 0x85, 0xAF, 0xAE, 0x83, 0x41, 0xCC, 0x82, 0xC9, + 0x83, 0x41, 0xCC, 0x86, 0xC9, 0x83, 0x41, 0xCC, + 0x87, 0xC9, 0x83, 0x41, 0xCC, 0x88, 0xC9, 0x83, + 0x41, 0xCC, 0x8A, 0xC9, 0x83, 0x41, 0xCC, 0xA3, + 0xB5, 0x83, 0x43, 0xCC, 0xA7, 0xA5, 0x83, 0x45, + 0xCC, 0x82, 0xC9, 0x83, 0x45, 0xCC, 0x84, 0xC9, + 0x83, 0x45, 0xCC, 0xA3, 0xB5, 0x83, 0x45, 0xCC, + // Bytes 46c0 - 46ff + 0xA7, 0xA5, 0x83, 0x49, 0xCC, 0x88, 0xC9, 0x83, + 0x4C, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0x82, + 0xC9, 0x83, 0x4F, 0xCC, 0x83, 0xC9, 0x83, 0x4F, + 0xCC, 0x84, 0xC9, 0x83, 0x4F, 0xCC, 0x87, 0xC9, + 0x83, 0x4F, 0xCC, 0x88, 0xC9, 0x83, 0x4F, 0xCC, + 0x9B, 0xAD, 0x83, 0x4F, 0xCC, 0xA3, 0xB5, 0x83, + 0x4F, 0xCC, 0xA8, 0xA5, 0x83, 0x52, 0xCC, 0xA3, + 0xB5, 0x83, 0x53, 0xCC, 0x81, 0xC9, 0x83, 0x53, + // Bytes 4700 - 473f + 0xCC, 0x8C, 0xC9, 0x83, 0x53, 0xCC, 0xA3, 0xB5, + 0x83, 0x55, 0xCC, 0x83, 0xC9, 0x83, 0x55, 0xCC, + 0x84, 0xC9, 0x83, 0x55, 0xCC, 0x88, 0xC9, 0x83, + 0x55, 0xCC, 0x9B, 0xAD, 0x83, 0x61, 0xCC, 0x82, + 0xC9, 0x83, 0x61, 0xCC, 0x86, 0xC9, 0x83, 0x61, + 0xCC, 0x87, 0xC9, 0x83, 0x61, 0xCC, 0x88, 0xC9, + 0x83, 0x61, 0xCC, 0x8A, 0xC9, 0x83, 0x61, 0xCC, + 0xA3, 0xB5, 0x83, 0x63, 0xCC, 0xA7, 0xA5, 0x83, + // Bytes 4740 - 477f + 0x65, 0xCC, 0x82, 0xC9, 0x83, 0x65, 0xCC, 0x84, + 0xC9, 0x83, 0x65, 0xCC, 0xA3, 0xB5, 0x83, 0x65, + 0xCC, 0xA7, 0xA5, 0x83, 0x69, 0xCC, 0x88, 0xC9, + 0x83, 0x6C, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC, + 0x82, 0xC9, 0x83, 0x6F, 0xCC, 0x83, 0xC9, 0x83, + 0x6F, 0xCC, 0x84, 0xC9, 0x83, 0x6F, 0xCC, 0x87, + 0xC9, 0x83, 0x6F, 0xCC, 0x88, 0xC9, 0x83, 0x6F, + 0xCC, 0x9B, 0xAD, 0x83, 0x6F, 0xCC, 0xA3, 0xB5, + // Bytes 4780 - 47bf + 0x83, 0x6F, 0xCC, 0xA8, 0xA5, 0x83, 0x72, 0xCC, + 0xA3, 0xB5, 0x83, 0x73, 0xCC, 0x81, 0xC9, 0x83, + 0x73, 0xCC, 0x8C, 0xC9, 0x83, 0x73, 0xCC, 0xA3, + 0xB5, 0x83, 0x75, 0xCC, 0x83, 0xC9, 0x83, 0x75, + 0xCC, 0x84, 0xC9, 0x83, 0x75, 0xCC, 0x88, 0xC9, + 0x83, 0x75, 0xCC, 0x9B, 0xAD, 0x84, 0xCE, 0x91, + 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x91, 0xCC, 0x94, + 0xC9, 0x84, 0xCE, 0x95, 0xCC, 0x93, 0xC9, 0x84, + // Bytes 47c0 - 47ff + 0xCE, 0x95, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x97, + 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x94, + 0xC9, 0x84, 0xCE, 0x99, 0xCC, 0x93, 0xC9, 0x84, + 0xCE, 0x99, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x9F, + 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x94, + 0xC9, 0x84, 0xCE, 0xA5, 0xCC, 0x94, 0xC9, 0x84, + 0xCE, 0xA9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xA9, + 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x80, + // Bytes 4800 - 483f + 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x81, 0xC9, 0x84, + 0xCE, 0xB1, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB1, + 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB1, 0xCD, 0x82, + 0xC9, 0x84, 0xCE, 0xB5, 0xCC, 0x93, 0xC9, 0x84, + 0xCE, 0xB5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB7, + 0xCC, 0x80, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x81, + 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x93, 0xC9, 0x84, + 0xCE, 0xB7, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB7, + // Bytes 4840 - 487f + 0xCD, 0x82, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, 0x88, + 0xC9, 0x84, 0xCE, 0xB9, 0xCC, 0x93, 0xC9, 0x84, + 0xCE, 0xB9, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xBF, + 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x94, + 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x88, 0xC9, 0x84, + 0xCF, 0x85, 0xCC, 0x93, 0xC9, 0x84, 0xCF, 0x85, + 0xCC, 0x94, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x80, + 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x81, 0xC9, 0x84, + // Bytes 4880 - 48bf + 0xCF, 0x89, 0xCC, 0x93, 0xC9, 0x84, 0xCF, 0x89, + 0xCC, 0x94, 0xC9, 0x84, 0xCF, 0x89, 0xCD, 0x82, + 0xC9, 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, + 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, + 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, + 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, + 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, + 0xCA, 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, + // Bytes 48c0 - 48ff + 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, + 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, + 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, + 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, + 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, + 0xCA, 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, + 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, + 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, + // Bytes 4900 - 493f + 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, + 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, + 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, + 0xCA, 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x82, + 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, + 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, + 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, + 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, + // Bytes 4940 - 497f + 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, + 0xCA, 0x86, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, + 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, + 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, + 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, + 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, + 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, + 0xCA, 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, + // Bytes 4980 - 49bf + 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x80, + 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, + 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, + 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, + 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, + 0xCA, 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, + 0xCA, 0x42, 0xCC, 0x80, 0xC9, 0x32, 0x42, 0xCC, + 0x81, 0xC9, 0x32, 0x42, 0xCC, 0x93, 0xC9, 0x32, + // Bytes 49c0 - 49ff + 0x43, 0xE1, 0x85, 0xA1, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xA2, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA3, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA4, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xA5, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xA6, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA7, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA8, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xA9, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xAA, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAB, + // Bytes 4a00 - 4a3f + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAC, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xAD, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xAE, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAF, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB0, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xB1, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xB2, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB3, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB4, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xB5, 0x01, 0x00, 0x43, 0xE1, + // Bytes 4a40 - 4a7f + 0x86, 0xAA, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAC, + 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAD, 0x01, 0x00, + 0x43, 0xE1, 0x86, 0xB0, 0x01, 0x00, 0x43, 0xE1, + 0x86, 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB2, + 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB3, 0x01, 0x00, + 0x43, 0xE1, 0x86, 0xB4, 0x01, 0x00, 0x43, 0xE1, + 0x86, 0xB5, 0x01, 0x00, 0x44, 0xCC, 0x88, 0xCC, + 0x81, 0xCA, 0x32, 0x43, 0xE3, 0x82, 0x99, 0x0D, + // Bytes 4a80 - 4abf + 0x03, 0x43, 0xE3, 0x82, 0x9A, 0x0D, 0x03, 0x46, + 0xE0, 0xBD, 0xB1, 0xE0, 0xBD, 0xB2, 0x9E, 0x26, + 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBD, 0xB4, 0xA2, + 0x26, 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, + 0x9E, 0x26, 0x00, 0x01, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfcTrie. Total size: 10610 bytes (10.36 KiB). Checksum: 95e8869a9f81e5e6. +type nfcTrie struct{} + +func newNfcTrie(i int) *nfcTrie { + return &nfcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 46: + return uint16(nfcValues[n<<6+uint32(b)]) + default: + n -= 46 + return uint16(nfcSparse.lookup(n, b)) + } +} + +// nfcValues: 48 blocks, 3072 entries, 6144 bytes +// The third block is the zero block. +var nfcValues = [3072]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x2f72, 0xc1: 0x2f77, 0xc2: 0x468b, 0xc3: 0x2f7c, 0xc4: 0x469a, 0xc5: 0x469f, + 0xc6: 0xa000, 0xc7: 0x46a9, 0xc8: 0x2fe5, 0xc9: 0x2fea, 0xca: 0x46ae, 0xcb: 0x2ffe, + 0xcc: 0x3071, 0xcd: 0x3076, 0xce: 0x307b, 0xcf: 0x46c2, 0xd1: 0x3107, + 0xd2: 0x312a, 0xd3: 0x312f, 0xd4: 0x46cc, 0xd5: 0x46d1, 0xd6: 0x46e0, + 0xd8: 0xa000, 0xd9: 0x31b6, 0xda: 0x31bb, 0xdb: 0x31c0, 0xdc: 0x4712, 0xdd: 0x3238, + 0xe0: 0x327e, 0xe1: 0x3283, 0xe2: 0x471c, 0xe3: 0x3288, + 0xe4: 0x472b, 0xe5: 0x4730, 0xe6: 0xa000, 0xe7: 0x473a, 0xe8: 0x32f1, 0xe9: 0x32f6, + 0xea: 0x473f, 0xeb: 0x330a, 0xec: 0x3382, 0xed: 0x3387, 0xee: 0x338c, 0xef: 0x4753, + 0xf1: 0x3418, 0xf2: 0x343b, 0xf3: 0x3440, 0xf4: 0x475d, 0xf5: 0x4762, + 0xf6: 0x4771, 0xf8: 0xa000, 0xf9: 0x34cc, 0xfa: 0x34d1, 0xfb: 0x34d6, + 0xfc: 0x47a3, 0xfd: 0x3553, 0xff: 0x356c, + // Block 0x4, offset 0x100 + 0x100: 0x2f81, 0x101: 0x328d, 0x102: 0x4690, 0x103: 0x4721, 0x104: 0x2f9f, 0x105: 0x32ab, + 0x106: 0x2fb3, 0x107: 0x32bf, 0x108: 0x2fb8, 0x109: 0x32c4, 0x10a: 0x2fbd, 0x10b: 0x32c9, + 0x10c: 0x2fc2, 0x10d: 0x32ce, 0x10e: 0x2fcc, 0x10f: 0x32d8, + 0x112: 0x46b3, 0x113: 0x4744, 0x114: 0x2ff4, 0x115: 0x3300, 0x116: 0x2ff9, 0x117: 0x3305, + 0x118: 0x3017, 0x119: 0x3323, 0x11a: 0x3008, 0x11b: 0x3314, 0x11c: 0x3030, 0x11d: 0x333c, + 0x11e: 0x303a, 0x11f: 0x3346, 0x120: 0x303f, 0x121: 0x334b, 0x122: 0x3049, 0x123: 0x3355, + 0x124: 0x304e, 0x125: 0x335a, 0x128: 0x3080, 0x129: 0x3391, + 0x12a: 0x3085, 0x12b: 0x3396, 0x12c: 0x308a, 0x12d: 0x339b, 0x12e: 0x30ad, 0x12f: 0x33b9, + 0x130: 0x308f, 0x134: 0x30b7, 0x135: 0x33c3, + 0x136: 0x30cb, 0x137: 0x33dc, 0x139: 0x30d5, 0x13a: 0x33e6, 0x13b: 0x30df, + 0x13c: 0x33f0, 0x13d: 0x30da, 0x13e: 0x33eb, + // Block 0x5, offset 0x140 + 0x143: 0x3102, 0x144: 0x3413, 0x145: 0x311b, + 0x146: 0x342c, 0x147: 0x3111, 0x148: 0x3422, + 0x14c: 0x46d6, 0x14d: 0x4767, 0x14e: 0x3134, 0x14f: 0x3445, 0x150: 0x313e, 0x151: 0x344f, + 0x154: 0x315c, 0x155: 0x346d, 0x156: 0x3175, 0x157: 0x3486, + 0x158: 0x3166, 0x159: 0x3477, 0x15a: 0x46f9, 0x15b: 0x478a, 0x15c: 0x317f, 0x15d: 0x3490, + 0x15e: 0x318e, 0x15f: 0x349f, 0x160: 0x46fe, 0x161: 0x478f, 0x162: 0x31a7, 0x163: 0x34bd, + 0x164: 0x3198, 0x165: 0x34ae, 0x168: 0x4708, 0x169: 0x4799, + 0x16a: 0x470d, 0x16b: 0x479e, 0x16c: 0x31c5, 0x16d: 0x34db, 0x16e: 0x31cf, 0x16f: 0x34e5, + 0x170: 0x31d4, 0x171: 0x34ea, 0x172: 0x31f2, 0x173: 0x3508, 0x174: 0x3215, 0x175: 0x352b, + 0x176: 0x323d, 0x177: 0x3558, 0x178: 0x3251, 0x179: 0x3260, 0x17a: 0x3580, 0x17b: 0x326a, + 0x17c: 0x358a, 0x17d: 0x326f, 0x17e: 0x358f, 0x17f: 0xa000, + // Block 0x6, offset 0x180 + 0x184: 0x8100, 0x185: 0x8100, + 0x186: 0x8100, + 0x18d: 0x2f8b, 0x18e: 0x3297, 0x18f: 0x3099, 0x190: 0x33a5, 0x191: 0x3143, + 0x192: 0x3454, 0x193: 0x31d9, 0x194: 0x34ef, 0x195: 0x39d2, 0x196: 0x3b61, 0x197: 0x39cb, + 0x198: 0x3b5a, 0x199: 0x39d9, 0x19a: 0x3b68, 0x19b: 0x39c4, 0x19c: 0x3b53, + 0x19e: 0x38b3, 0x19f: 0x3a42, 0x1a0: 0x38ac, 0x1a1: 0x3a3b, 0x1a2: 0x35b6, 0x1a3: 0x35c8, + 0x1a6: 0x3044, 0x1a7: 0x3350, 0x1a8: 0x30c1, 0x1a9: 0x33d2, + 0x1aa: 0x46ef, 0x1ab: 0x4780, 0x1ac: 0x3993, 0x1ad: 0x3b22, 0x1ae: 0x35da, 0x1af: 0x35e0, + 0x1b0: 0x33c8, 0x1b4: 0x302b, 0x1b5: 0x3337, + 0x1b8: 0x30fd, 0x1b9: 0x340e, 0x1ba: 0x38ba, 0x1bb: 0x3a49, + 0x1bc: 0x35b0, 0x1bd: 0x35c2, 0x1be: 0x35bc, 0x1bf: 0x35ce, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x2f90, 0x1c1: 0x329c, 0x1c2: 0x2f95, 0x1c3: 0x32a1, 0x1c4: 0x300d, 0x1c5: 0x3319, + 0x1c6: 0x3012, 0x1c7: 0x331e, 0x1c8: 0x309e, 0x1c9: 0x33aa, 0x1ca: 0x30a3, 0x1cb: 0x33af, + 0x1cc: 0x3148, 0x1cd: 0x3459, 0x1ce: 0x314d, 0x1cf: 0x345e, 0x1d0: 0x316b, 0x1d1: 0x347c, + 0x1d2: 0x3170, 0x1d3: 0x3481, 0x1d4: 0x31de, 0x1d5: 0x34f4, 0x1d6: 0x31e3, 0x1d7: 0x34f9, + 0x1d8: 0x3189, 0x1d9: 0x349a, 0x1da: 0x31a2, 0x1db: 0x34b8, + 0x1de: 0x305d, 0x1df: 0x3369, + 0x1e6: 0x4695, 0x1e7: 0x4726, 0x1e8: 0x46bd, 0x1e9: 0x474e, + 0x1ea: 0x3962, 0x1eb: 0x3af1, 0x1ec: 0x393f, 0x1ed: 0x3ace, 0x1ee: 0x46db, 0x1ef: 0x476c, + 0x1f0: 0x395b, 0x1f1: 0x3aea, 0x1f2: 0x3247, 0x1f3: 0x3562, + // Block 0x8, offset 0x200 + 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, + 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, + 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, + 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, + 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, + 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, + 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, + 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, + 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, + 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, + // Block 0x9, offset 0x240 + 0x240: 0x49b1, 0x241: 0x49b6, 0x242: 0x9932, 0x243: 0x49bb, 0x244: 0x4a74, 0x245: 0x9936, + 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, + 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, + 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, + 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, + 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, + 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, + 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, + 0x274: 0x0170, + 0x27a: 0x8100, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x8100, 0x285: 0x35a4, + 0x286: 0x35ec, 0x287: 0x00ce, 0x288: 0x360a, 0x289: 0x3616, 0x28a: 0x3628, + 0x28c: 0x3646, 0x28e: 0x3658, 0x28f: 0x3676, 0x290: 0x3e0b, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x363a, 0x2ab: 0x366a, 0x2ac: 0x4801, 0x2ad: 0x369a, 0x2ae: 0x482b, 0x2af: 0x36ac, + 0x2b0: 0x3e73, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x3724, 0x2c1: 0x3730, 0x2c3: 0x371e, + 0x2c6: 0xa000, 0x2c7: 0x370c, + 0x2cc: 0x3760, 0x2cd: 0x3748, 0x2ce: 0x3772, 0x2d0: 0xa000, + 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000, + 0x2d8: 0xa000, 0x2d9: 0x3754, 0x2da: 0xa000, + 0x2de: 0xa000, 0x2e3: 0xa000, + 0x2e7: 0xa000, + 0x2eb: 0xa000, 0x2ed: 0xa000, + 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000, + 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d8, 0x2fa: 0xa000, + 0x2fe: 0xa000, + // Block 0xc, offset 0x300 + 0x301: 0x3736, 0x302: 0x37ba, + 0x310: 0x3712, 0x311: 0x3796, + 0x312: 0x3718, 0x313: 0x379c, 0x316: 0x372a, 0x317: 0x37ae, + 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x382c, 0x31b: 0x3832, 0x31c: 0x373c, 0x31d: 0x37c0, + 0x31e: 0x3742, 0x31f: 0x37c6, 0x322: 0x374e, 0x323: 0x37d2, + 0x324: 0x375a, 0x325: 0x37de, 0x326: 0x3766, 0x327: 0x37ea, 0x328: 0xa000, 0x329: 0xa000, + 0x32a: 0x3838, 0x32b: 0x383e, 0x32c: 0x3790, 0x32d: 0x3814, 0x32e: 0x376c, 0x32f: 0x37f0, + 0x330: 0x3778, 0x331: 0x37fc, 0x332: 0x377e, 0x333: 0x3802, 0x334: 0x3784, 0x335: 0x3808, + 0x338: 0x378a, 0x339: 0x380e, + // Block 0xd, offset 0x340 + 0x351: 0x812d, + 0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132, + 0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132, + 0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d, + 0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132, + 0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132, + 0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a, + 0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f, + 0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112, + // Block 0xe, offset 0x380 + 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116, + 0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c, + 0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132, + 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132, + 0x39e: 0x8132, 0x39f: 0x812d, + 0x3b0: 0x811e, + // Block 0xf, offset 0x3c0 + 0x3d3: 0x812d, 0x3d4: 0x8132, 0x3d5: 0x8132, 0x3d6: 0x8132, 0x3d7: 0x8132, + 0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x8132, 0x3dd: 0x8132, + 0x3de: 0x8132, 0x3df: 0x8132, 0x3e0: 0x8132, 0x3e1: 0x8132, 0x3e3: 0x812d, + 0x3e4: 0x8132, 0x3e5: 0x8132, 0x3e6: 0x812d, 0x3e7: 0x8132, 0x3e8: 0x8132, 0x3e9: 0x812d, + 0x3ea: 0x8132, 0x3eb: 0x8132, 0x3ec: 0x8132, 0x3ed: 0x812d, 0x3ee: 0x812d, 0x3ef: 0x812d, + 0x3f0: 0x8116, 0x3f1: 0x8117, 0x3f2: 0x8118, 0x3f3: 0x8132, 0x3f4: 0x8132, 0x3f5: 0x8132, + 0x3f6: 0x812d, 0x3f7: 0x8132, 0x3f8: 0x8132, 0x3f9: 0x812d, 0x3fa: 0x812d, 0x3fb: 0x8132, + 0x3fc: 0x8132, 0x3fd: 0x8132, 0x3fe: 0x8132, 0x3ff: 0x8132, + // Block 0x10, offset 0x400 + 0x405: 0xa000, + 0x406: 0x2d29, 0x407: 0xa000, 0x408: 0x2d31, 0x409: 0xa000, 0x40a: 0x2d39, 0x40b: 0xa000, + 0x40c: 0x2d41, 0x40d: 0xa000, 0x40e: 0x2d49, 0x411: 0xa000, + 0x412: 0x2d51, + 0x434: 0x8102, 0x435: 0x9900, + 0x43a: 0xa000, 0x43b: 0x2d59, + 0x43c: 0xa000, 0x43d: 0x2d61, 0x43e: 0xa000, 0x43f: 0xa000, + // Block 0x11, offset 0x440 + 0x440: 0x8132, 0x441: 0x8132, 0x442: 0x812d, 0x443: 0x8132, 0x444: 0x8132, 0x445: 0x8132, + 0x446: 0x8132, 0x447: 0x8132, 0x448: 0x8132, 0x449: 0x8132, 0x44a: 0x812d, 0x44b: 0x8132, + 0x44c: 0x8132, 0x44d: 0x8135, 0x44e: 0x812a, 0x44f: 0x812d, 0x450: 0x8129, 0x451: 0x8132, + 0x452: 0x8132, 0x453: 0x8132, 0x454: 0x8132, 0x455: 0x8132, 0x456: 0x8132, 0x457: 0x8132, + 0x458: 0x8132, 0x459: 0x8132, 0x45a: 0x8132, 0x45b: 0x8132, 0x45c: 0x8132, 0x45d: 0x8132, + 0x45e: 0x8132, 0x45f: 0x8132, 0x460: 0x8132, 0x461: 0x8132, 0x462: 0x8132, 0x463: 0x8132, + 0x464: 0x8132, 0x465: 0x8132, 0x466: 0x8132, 0x467: 0x8132, 0x468: 0x8132, 0x469: 0x8132, + 0x46a: 0x8132, 0x46b: 0x8132, 0x46c: 0x8132, 0x46d: 0x8132, 0x46e: 0x8132, 0x46f: 0x8132, + 0x470: 0x8132, 0x471: 0x8132, 0x472: 0x8132, 0x473: 0x8132, 0x474: 0x8132, 0x475: 0x8132, + 0x476: 0x8133, 0x477: 0x8131, 0x478: 0x8131, 0x479: 0x812d, 0x47b: 0x8132, + 0x47c: 0x8134, 0x47d: 0x812d, 0x47e: 0x8132, 0x47f: 0x812d, + // Block 0x12, offset 0x480 + 0x480: 0x2f9a, 0x481: 0x32a6, 0x482: 0x2fa4, 0x483: 0x32b0, 0x484: 0x2fa9, 0x485: 0x32b5, + 0x486: 0x2fae, 0x487: 0x32ba, 0x488: 0x38cf, 0x489: 0x3a5e, 0x48a: 0x2fc7, 0x48b: 0x32d3, + 0x48c: 0x2fd1, 0x48d: 0x32dd, 0x48e: 0x2fe0, 0x48f: 0x32ec, 0x490: 0x2fd6, 0x491: 0x32e2, + 0x492: 0x2fdb, 0x493: 0x32e7, 0x494: 0x38f2, 0x495: 0x3a81, 0x496: 0x38f9, 0x497: 0x3a88, + 0x498: 0x301c, 0x499: 0x3328, 0x49a: 0x3021, 0x49b: 0x332d, 0x49c: 0x3907, 0x49d: 0x3a96, + 0x49e: 0x3026, 0x49f: 0x3332, 0x4a0: 0x3035, 0x4a1: 0x3341, 0x4a2: 0x3053, 0x4a3: 0x335f, + 0x4a4: 0x3062, 0x4a5: 0x336e, 0x4a6: 0x3058, 0x4a7: 0x3364, 0x4a8: 0x3067, 0x4a9: 0x3373, + 0x4aa: 0x306c, 0x4ab: 0x3378, 0x4ac: 0x30b2, 0x4ad: 0x33be, 0x4ae: 0x390e, 0x4af: 0x3a9d, + 0x4b0: 0x30bc, 0x4b1: 0x33cd, 0x4b2: 0x30c6, 0x4b3: 0x33d7, 0x4b4: 0x30d0, 0x4b5: 0x33e1, + 0x4b6: 0x46c7, 0x4b7: 0x4758, 0x4b8: 0x3915, 0x4b9: 0x3aa4, 0x4ba: 0x30e9, 0x4bb: 0x33fa, + 0x4bc: 0x30e4, 0x4bd: 0x33f5, 0x4be: 0x30ee, 0x4bf: 0x33ff, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x30f3, 0x4c1: 0x3404, 0x4c2: 0x30f8, 0x4c3: 0x3409, 0x4c4: 0x310c, 0x4c5: 0x341d, + 0x4c6: 0x3116, 0x4c7: 0x3427, 0x4c8: 0x3125, 0x4c9: 0x3436, 0x4ca: 0x3120, 0x4cb: 0x3431, + 0x4cc: 0x3938, 0x4cd: 0x3ac7, 0x4ce: 0x3946, 0x4cf: 0x3ad5, 0x4d0: 0x394d, 0x4d1: 0x3adc, + 0x4d2: 0x3954, 0x4d3: 0x3ae3, 0x4d4: 0x3152, 0x4d5: 0x3463, 0x4d6: 0x3157, 0x4d7: 0x3468, + 0x4d8: 0x3161, 0x4d9: 0x3472, 0x4da: 0x46f4, 0x4db: 0x4785, 0x4dc: 0x399a, 0x4dd: 0x3b29, + 0x4de: 0x317a, 0x4df: 0x348b, 0x4e0: 0x3184, 0x4e1: 0x3495, 0x4e2: 0x4703, 0x4e3: 0x4794, + 0x4e4: 0x39a1, 0x4e5: 0x3b30, 0x4e6: 0x39a8, 0x4e7: 0x3b37, 0x4e8: 0x39af, 0x4e9: 0x3b3e, + 0x4ea: 0x3193, 0x4eb: 0x34a4, 0x4ec: 0x319d, 0x4ed: 0x34b3, 0x4ee: 0x31b1, 0x4ef: 0x34c7, + 0x4f0: 0x31ac, 0x4f1: 0x34c2, 0x4f2: 0x31ed, 0x4f3: 0x3503, 0x4f4: 0x31fc, 0x4f5: 0x3512, + 0x4f6: 0x31f7, 0x4f7: 0x350d, 0x4f8: 0x39b6, 0x4f9: 0x3b45, 0x4fa: 0x39bd, 0x4fb: 0x3b4c, + 0x4fc: 0x3201, 0x4fd: 0x3517, 0x4fe: 0x3206, 0x4ff: 0x351c, + // Block 0x14, offset 0x500 + 0x500: 0x320b, 0x501: 0x3521, 0x502: 0x3210, 0x503: 0x3526, 0x504: 0x321f, 0x505: 0x3535, + 0x506: 0x321a, 0x507: 0x3530, 0x508: 0x3224, 0x509: 0x353f, 0x50a: 0x3229, 0x50b: 0x3544, + 0x50c: 0x322e, 0x50d: 0x3549, 0x50e: 0x324c, 0x50f: 0x3567, 0x510: 0x3265, 0x511: 0x3585, + 0x512: 0x3274, 0x513: 0x3594, 0x514: 0x3279, 0x515: 0x3599, 0x516: 0x337d, 0x517: 0x34a9, + 0x518: 0x353a, 0x519: 0x3576, 0x51b: 0x35d4, + 0x520: 0x46a4, 0x521: 0x4735, 0x522: 0x2f86, 0x523: 0x3292, + 0x524: 0x387b, 0x525: 0x3a0a, 0x526: 0x3874, 0x527: 0x3a03, 0x528: 0x3889, 0x529: 0x3a18, + 0x52a: 0x3882, 0x52b: 0x3a11, 0x52c: 0x38c1, 0x52d: 0x3a50, 0x52e: 0x3897, 0x52f: 0x3a26, + 0x530: 0x3890, 0x531: 0x3a1f, 0x532: 0x38a5, 0x533: 0x3a34, 0x534: 0x389e, 0x535: 0x3a2d, + 0x536: 0x38c8, 0x537: 0x3a57, 0x538: 0x46b8, 0x539: 0x4749, 0x53a: 0x3003, 0x53b: 0x330f, + 0x53c: 0x2fef, 0x53d: 0x32fb, 0x53e: 0x38dd, 0x53f: 0x3a6c, + // Block 0x15, offset 0x540 + 0x540: 0x38d6, 0x541: 0x3a65, 0x542: 0x38eb, 0x543: 0x3a7a, 0x544: 0x38e4, 0x545: 0x3a73, + 0x546: 0x3900, 0x547: 0x3a8f, 0x548: 0x3094, 0x549: 0x33a0, 0x54a: 0x30a8, 0x54b: 0x33b4, + 0x54c: 0x46ea, 0x54d: 0x477b, 0x54e: 0x3139, 0x54f: 0x344a, 0x550: 0x3923, 0x551: 0x3ab2, + 0x552: 0x391c, 0x553: 0x3aab, 0x554: 0x3931, 0x555: 0x3ac0, 0x556: 0x392a, 0x557: 0x3ab9, + 0x558: 0x398c, 0x559: 0x3b1b, 0x55a: 0x3970, 0x55b: 0x3aff, 0x55c: 0x3969, 0x55d: 0x3af8, + 0x55e: 0x397e, 0x55f: 0x3b0d, 0x560: 0x3977, 0x561: 0x3b06, 0x562: 0x3985, 0x563: 0x3b14, + 0x564: 0x31e8, 0x565: 0x34fe, 0x566: 0x31ca, 0x567: 0x34e0, 0x568: 0x39e7, 0x569: 0x3b76, + 0x56a: 0x39e0, 0x56b: 0x3b6f, 0x56c: 0x39f5, 0x56d: 0x3b84, 0x56e: 0x39ee, 0x56f: 0x3b7d, + 0x570: 0x39fc, 0x571: 0x3b8b, 0x572: 0x3233, 0x573: 0x354e, 0x574: 0x325b, 0x575: 0x357b, + 0x576: 0x3256, 0x577: 0x3571, 0x578: 0x3242, 0x579: 0x355d, + // Block 0x16, offset 0x580 + 0x580: 0x4807, 0x581: 0x480d, 0x582: 0x4921, 0x583: 0x4939, 0x584: 0x4929, 0x585: 0x4941, + 0x586: 0x4931, 0x587: 0x4949, 0x588: 0x47ad, 0x589: 0x47b3, 0x58a: 0x4891, 0x58b: 0x48a9, + 0x58c: 0x4899, 0x58d: 0x48b1, 0x58e: 0x48a1, 0x58f: 0x48b9, 0x590: 0x4819, 0x591: 0x481f, + 0x592: 0x3dbb, 0x593: 0x3dcb, 0x594: 0x3dc3, 0x595: 0x3dd3, + 0x598: 0x47b9, 0x599: 0x47bf, 0x59a: 0x3ceb, 0x59b: 0x3cfb, 0x59c: 0x3cf3, 0x59d: 0x3d03, + 0x5a0: 0x4831, 0x5a1: 0x4837, 0x5a2: 0x4951, 0x5a3: 0x4969, + 0x5a4: 0x4959, 0x5a5: 0x4971, 0x5a6: 0x4961, 0x5a7: 0x4979, 0x5a8: 0x47c5, 0x5a9: 0x47cb, + 0x5aa: 0x48c1, 0x5ab: 0x48d9, 0x5ac: 0x48c9, 0x5ad: 0x48e1, 0x5ae: 0x48d1, 0x5af: 0x48e9, + 0x5b0: 0x4849, 0x5b1: 0x484f, 0x5b2: 0x3e1b, 0x5b3: 0x3e33, 0x5b4: 0x3e23, 0x5b5: 0x3e3b, + 0x5b6: 0x3e2b, 0x5b7: 0x3e43, 0x5b8: 0x47d1, 0x5b9: 0x47d7, 0x5ba: 0x3d1b, 0x5bb: 0x3d33, + 0x5bc: 0x3d23, 0x5bd: 0x3d3b, 0x5be: 0x3d2b, 0x5bf: 0x3d43, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x4855, 0x5c1: 0x485b, 0x5c2: 0x3e4b, 0x5c3: 0x3e5b, 0x5c4: 0x3e53, 0x5c5: 0x3e63, + 0x5c8: 0x47dd, 0x5c9: 0x47e3, 0x5ca: 0x3d4b, 0x5cb: 0x3d5b, + 0x5cc: 0x3d53, 0x5cd: 0x3d63, 0x5d0: 0x4867, 0x5d1: 0x486d, + 0x5d2: 0x3e83, 0x5d3: 0x3e9b, 0x5d4: 0x3e8b, 0x5d5: 0x3ea3, 0x5d6: 0x3e93, 0x5d7: 0x3eab, + 0x5d9: 0x47e9, 0x5db: 0x3d6b, 0x5dd: 0x3d73, + 0x5df: 0x3d7b, 0x5e0: 0x487f, 0x5e1: 0x4885, 0x5e2: 0x4981, 0x5e3: 0x4999, + 0x5e4: 0x4989, 0x5e5: 0x49a1, 0x5e6: 0x4991, 0x5e7: 0x49a9, 0x5e8: 0x47ef, 0x5e9: 0x47f5, + 0x5ea: 0x48f1, 0x5eb: 0x4909, 0x5ec: 0x48f9, 0x5ed: 0x4911, 0x5ee: 0x4901, 0x5ef: 0x4919, + 0x5f0: 0x47fb, 0x5f1: 0x4321, 0x5f2: 0x3694, 0x5f3: 0x4327, 0x5f4: 0x4825, 0x5f5: 0x432d, + 0x5f6: 0x36a6, 0x5f7: 0x4333, 0x5f8: 0x36c4, 0x5f9: 0x4339, 0x5fa: 0x36dc, 0x5fb: 0x433f, + 0x5fc: 0x4873, 0x5fd: 0x4345, + // Block 0x18, offset 0x600 + 0x600: 0x3da3, 0x601: 0x3dab, 0x602: 0x4187, 0x603: 0x41a5, 0x604: 0x4191, 0x605: 0x41af, + 0x606: 0x419b, 0x607: 0x41b9, 0x608: 0x3cdb, 0x609: 0x3ce3, 0x60a: 0x40d3, 0x60b: 0x40f1, + 0x60c: 0x40dd, 0x60d: 0x40fb, 0x60e: 0x40e7, 0x60f: 0x4105, 0x610: 0x3deb, 0x611: 0x3df3, + 0x612: 0x41c3, 0x613: 0x41e1, 0x614: 0x41cd, 0x615: 0x41eb, 0x616: 0x41d7, 0x617: 0x41f5, + 0x618: 0x3d0b, 0x619: 0x3d13, 0x61a: 0x410f, 0x61b: 0x412d, 0x61c: 0x4119, 0x61d: 0x4137, + 0x61e: 0x4123, 0x61f: 0x4141, 0x620: 0x3ec3, 0x621: 0x3ecb, 0x622: 0x41ff, 0x623: 0x421d, + 0x624: 0x4209, 0x625: 0x4227, 0x626: 0x4213, 0x627: 0x4231, 0x628: 0x3d83, 0x629: 0x3d8b, + 0x62a: 0x414b, 0x62b: 0x4169, 0x62c: 0x4155, 0x62d: 0x4173, 0x62e: 0x415f, 0x62f: 0x417d, + 0x630: 0x3688, 0x631: 0x3682, 0x632: 0x3d93, 0x633: 0x368e, 0x634: 0x3d9b, + 0x636: 0x4813, 0x637: 0x3db3, 0x638: 0x35f8, 0x639: 0x35f2, 0x63a: 0x35e6, 0x63b: 0x42f1, + 0x63c: 0x35fe, 0x63d: 0x8100, 0x63e: 0x01d3, 0x63f: 0xa100, + // Block 0x19, offset 0x640 + 0x640: 0x8100, 0x641: 0x35aa, 0x642: 0x3ddb, 0x643: 0x36a0, 0x644: 0x3de3, + 0x646: 0x483d, 0x647: 0x3dfb, 0x648: 0x3604, 0x649: 0x42f7, 0x64a: 0x3610, 0x64b: 0x42fd, + 0x64c: 0x361c, 0x64d: 0x3b92, 0x64e: 0x3b99, 0x64f: 0x3ba0, 0x650: 0x36b8, 0x651: 0x36b2, + 0x652: 0x3e03, 0x653: 0x44e7, 0x656: 0x36be, 0x657: 0x3e13, + 0x658: 0x3634, 0x659: 0x362e, 0x65a: 0x3622, 0x65b: 0x4303, 0x65d: 0x3ba7, + 0x65e: 0x3bae, 0x65f: 0x3bb5, 0x660: 0x36ee, 0x661: 0x36e8, 0x662: 0x3e6b, 0x663: 0x44ef, + 0x664: 0x36d0, 0x665: 0x36d6, 0x666: 0x36f4, 0x667: 0x3e7b, 0x668: 0x3664, 0x669: 0x365e, + 0x66a: 0x3652, 0x66b: 0x430f, 0x66c: 0x364c, 0x66d: 0x359e, 0x66e: 0x42eb, 0x66f: 0x0081, + 0x672: 0x3eb3, 0x673: 0x36fa, 0x674: 0x3ebb, + 0x676: 0x488b, 0x677: 0x3ed3, 0x678: 0x3640, 0x679: 0x4309, 0x67a: 0x3670, 0x67b: 0x431b, + 0x67c: 0x367c, 0x67d: 0x4259, 0x67e: 0xa100, + // Block 0x1a, offset 0x680 + 0x681: 0x3c09, 0x683: 0xa000, 0x684: 0x3c10, 0x685: 0xa000, + 0x687: 0x3c17, 0x688: 0xa000, 0x689: 0x3c1e, + 0x68d: 0xa000, + 0x6a0: 0x2f68, 0x6a1: 0xa000, 0x6a2: 0x3c2c, + 0x6a4: 0xa000, 0x6a5: 0xa000, + 0x6ad: 0x3c25, 0x6ae: 0x2f63, 0x6af: 0x2f6d, + 0x6b0: 0x3c33, 0x6b1: 0x3c3a, 0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0x3c41, 0x6b5: 0x3c48, + 0x6b6: 0xa000, 0x6b7: 0xa000, 0x6b8: 0x3c4f, 0x6b9: 0x3c56, 0x6ba: 0xa000, 0x6bb: 0xa000, + 0x6bc: 0xa000, 0x6bd: 0xa000, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3c5d, 0x6c1: 0x3c64, 0x6c2: 0xa000, 0x6c3: 0xa000, 0x6c4: 0x3c79, 0x6c5: 0x3c80, + 0x6c6: 0xa000, 0x6c7: 0xa000, 0x6c8: 0x3c87, 0x6c9: 0x3c8e, + 0x6d1: 0xa000, + 0x6d2: 0xa000, + 0x6e2: 0xa000, + 0x6e8: 0xa000, 0x6e9: 0xa000, + 0x6eb: 0xa000, 0x6ec: 0x3ca3, 0x6ed: 0x3caa, 0x6ee: 0x3cb1, 0x6ef: 0x3cb8, + 0x6f2: 0xa000, 0x6f3: 0xa000, 0x6f4: 0xa000, 0x6f5: 0xa000, + // Block 0x1c, offset 0x700 + 0x706: 0xa000, 0x70b: 0xa000, + 0x70c: 0x3f0b, 0x70d: 0xa000, 0x70e: 0x3f13, 0x70f: 0xa000, 0x710: 0x3f1b, 0x711: 0xa000, + 0x712: 0x3f23, 0x713: 0xa000, 0x714: 0x3f2b, 0x715: 0xa000, 0x716: 0x3f33, 0x717: 0xa000, + 0x718: 0x3f3b, 0x719: 0xa000, 0x71a: 0x3f43, 0x71b: 0xa000, 0x71c: 0x3f4b, 0x71d: 0xa000, + 0x71e: 0x3f53, 0x71f: 0xa000, 0x720: 0x3f5b, 0x721: 0xa000, 0x722: 0x3f63, + 0x724: 0xa000, 0x725: 0x3f6b, 0x726: 0xa000, 0x727: 0x3f73, 0x728: 0xa000, 0x729: 0x3f7b, + 0x72f: 0xa000, + 0x730: 0x3f83, 0x731: 0x3f8b, 0x732: 0xa000, 0x733: 0x3f93, 0x734: 0x3f9b, 0x735: 0xa000, + 0x736: 0x3fa3, 0x737: 0x3fab, 0x738: 0xa000, 0x739: 0x3fb3, 0x73a: 0x3fbb, 0x73b: 0xa000, + 0x73c: 0x3fc3, 0x73d: 0x3fcb, + // Block 0x1d, offset 0x740 + 0x754: 0x3f03, + 0x759: 0x9903, 0x75a: 0x9903, 0x75b: 0x8100, 0x75c: 0x8100, 0x75d: 0xa000, + 0x75e: 0x3fd3, + 0x766: 0xa000, + 0x76b: 0xa000, 0x76c: 0x3fe3, 0x76d: 0xa000, 0x76e: 0x3feb, 0x76f: 0xa000, + 0x770: 0x3ff3, 0x771: 0xa000, 0x772: 0x3ffb, 0x773: 0xa000, 0x774: 0x4003, 0x775: 0xa000, + 0x776: 0x400b, 0x777: 0xa000, 0x778: 0x4013, 0x779: 0xa000, 0x77a: 0x401b, 0x77b: 0xa000, + 0x77c: 0x4023, 0x77d: 0xa000, 0x77e: 0x402b, 0x77f: 0xa000, + // Block 0x1e, offset 0x780 + 0x780: 0x4033, 0x781: 0xa000, 0x782: 0x403b, 0x784: 0xa000, 0x785: 0x4043, + 0x786: 0xa000, 0x787: 0x404b, 0x788: 0xa000, 0x789: 0x4053, + 0x78f: 0xa000, 0x790: 0x405b, 0x791: 0x4063, + 0x792: 0xa000, 0x793: 0x406b, 0x794: 0x4073, 0x795: 0xa000, 0x796: 0x407b, 0x797: 0x4083, + 0x798: 0xa000, 0x799: 0x408b, 0x79a: 0x4093, 0x79b: 0xa000, 0x79c: 0x409b, 0x79d: 0x40a3, + 0x7af: 0xa000, + 0x7b0: 0xa000, 0x7b1: 0xa000, 0x7b2: 0xa000, 0x7b4: 0x3fdb, + 0x7b7: 0x40ab, 0x7b8: 0x40b3, 0x7b9: 0x40bb, 0x7ba: 0x40c3, + 0x7bd: 0xa000, 0x7be: 0x40cb, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x1377, 0x7c1: 0x0cfb, 0x7c2: 0x13d3, 0x7c3: 0x139f, 0x7c4: 0x0e57, 0x7c5: 0x06eb, + 0x7c6: 0x08df, 0x7c7: 0x162b, 0x7c8: 0x162b, 0x7c9: 0x0a0b, 0x7ca: 0x145f, 0x7cb: 0x0943, + 0x7cc: 0x0a07, 0x7cd: 0x0bef, 0x7ce: 0x0fcf, 0x7cf: 0x115f, 0x7d0: 0x1297, 0x7d1: 0x12d3, + 0x7d2: 0x1307, 0x7d3: 0x141b, 0x7d4: 0x0d73, 0x7d5: 0x0dff, 0x7d6: 0x0eab, 0x7d7: 0x0f43, + 0x7d8: 0x125f, 0x7d9: 0x1447, 0x7da: 0x1573, 0x7db: 0x070f, 0x7dc: 0x08b3, 0x7dd: 0x0d87, + 0x7de: 0x0ecf, 0x7df: 0x1293, 0x7e0: 0x15c3, 0x7e1: 0x0ab3, 0x7e2: 0x0e77, 0x7e3: 0x1283, + 0x7e4: 0x1317, 0x7e5: 0x0c23, 0x7e6: 0x11bb, 0x7e7: 0x12df, 0x7e8: 0x0b1f, 0x7e9: 0x0d0f, + 0x7ea: 0x0e17, 0x7eb: 0x0f1b, 0x7ec: 0x1427, 0x7ed: 0x074f, 0x7ee: 0x07e7, 0x7ef: 0x0853, + 0x7f0: 0x0c8b, 0x7f1: 0x0d7f, 0x7f2: 0x0ecb, 0x7f3: 0x0fef, 0x7f4: 0x1177, 0x7f5: 0x128b, + 0x7f6: 0x12a3, 0x7f7: 0x13c7, 0x7f8: 0x14ef, 0x7f9: 0x15a3, 0x7fa: 0x15bf, 0x7fb: 0x102b, + 0x7fc: 0x106b, 0x7fd: 0x1123, 0x7fe: 0x1243, 0x7ff: 0x147b, + // Block 0x20, offset 0x800 + 0x800: 0x15cb, 0x801: 0x134b, 0x802: 0x09c7, 0x803: 0x0b3b, 0x804: 0x10db, 0x805: 0x119b, + 0x806: 0x0eff, 0x807: 0x1033, 0x808: 0x1397, 0x809: 0x14e7, 0x80a: 0x09c3, 0x80b: 0x0a8f, + 0x80c: 0x0d77, 0x80d: 0x0e2b, 0x80e: 0x0e5f, 0x80f: 0x1113, 0x810: 0x113b, 0x811: 0x14a7, + 0x812: 0x084f, 0x813: 0x11a7, 0x814: 0x07f3, 0x815: 0x07ef, 0x816: 0x1097, 0x817: 0x1127, + 0x818: 0x125b, 0x819: 0x14af, 0x81a: 0x1367, 0x81b: 0x0c27, 0x81c: 0x0d73, 0x81d: 0x1357, + 0x81e: 0x06f7, 0x81f: 0x0a63, 0x820: 0x0b93, 0x821: 0x0f2f, 0x822: 0x0faf, 0x823: 0x0873, + 0x824: 0x103b, 0x825: 0x075f, 0x826: 0x0b77, 0x827: 0x06d7, 0x828: 0x0deb, 0x829: 0x0ca3, + 0x82a: 0x110f, 0x82b: 0x08c7, 0x82c: 0x09b3, 0x82d: 0x0ffb, 0x82e: 0x1263, 0x82f: 0x133b, + 0x830: 0x0db7, 0x831: 0x13f7, 0x832: 0x0de3, 0x833: 0x0c37, 0x834: 0x121b, 0x835: 0x0c57, + 0x836: 0x0fab, 0x837: 0x072b, 0x838: 0x07a7, 0x839: 0x07eb, 0x83a: 0x0d53, 0x83b: 0x10fb, + 0x83c: 0x11f3, 0x83d: 0x1347, 0x83e: 0x145b, 0x83f: 0x085b, + // Block 0x21, offset 0x840 + 0x840: 0x090f, 0x841: 0x0a17, 0x842: 0x0b2f, 0x843: 0x0cbf, 0x844: 0x0e7b, 0x845: 0x103f, + 0x846: 0x1497, 0x847: 0x157b, 0x848: 0x15cf, 0x849: 0x15e7, 0x84a: 0x0837, 0x84b: 0x0cf3, + 0x84c: 0x0da3, 0x84d: 0x13eb, 0x84e: 0x0afb, 0x84f: 0x0bd7, 0x850: 0x0bf3, 0x851: 0x0c83, + 0x852: 0x0e6b, 0x853: 0x0eb7, 0x854: 0x0f67, 0x855: 0x108b, 0x856: 0x112f, 0x857: 0x1193, + 0x858: 0x13db, 0x859: 0x126b, 0x85a: 0x1403, 0x85b: 0x147f, 0x85c: 0x080f, 0x85d: 0x083b, + 0x85e: 0x0923, 0x85f: 0x0ea7, 0x860: 0x12f3, 0x861: 0x133b, 0x862: 0x0b1b, 0x863: 0x0b8b, + 0x864: 0x0c4f, 0x865: 0x0daf, 0x866: 0x10d7, 0x867: 0x0f23, 0x868: 0x073b, 0x869: 0x097f, + 0x86a: 0x0a63, 0x86b: 0x0ac7, 0x86c: 0x0b97, 0x86d: 0x0f3f, 0x86e: 0x0f5b, 0x86f: 0x116b, + 0x870: 0x118b, 0x871: 0x1463, 0x872: 0x14e3, 0x873: 0x14f3, 0x874: 0x152f, 0x875: 0x0753, + 0x876: 0x107f, 0x877: 0x144f, 0x878: 0x14cb, 0x879: 0x0baf, 0x87a: 0x0717, 0x87b: 0x0777, + 0x87c: 0x0a67, 0x87d: 0x0a87, 0x87e: 0x0caf, 0x87f: 0x0d73, + // Block 0x22, offset 0x880 + 0x880: 0x0ec3, 0x881: 0x0fcb, 0x882: 0x1277, 0x883: 0x1417, 0x884: 0x1623, 0x885: 0x0ce3, + 0x886: 0x14a3, 0x887: 0x0833, 0x888: 0x0d2f, 0x889: 0x0d3b, 0x88a: 0x0e0f, 0x88b: 0x0e47, + 0x88c: 0x0f4b, 0x88d: 0x0fa7, 0x88e: 0x1027, 0x88f: 0x110b, 0x890: 0x153b, 0x891: 0x07af, + 0x892: 0x0c03, 0x893: 0x14b3, 0x894: 0x0767, 0x895: 0x0aab, 0x896: 0x0e2f, 0x897: 0x13df, + 0x898: 0x0b67, 0x899: 0x0bb7, 0x89a: 0x0d43, 0x89b: 0x0f2f, 0x89c: 0x14bb, 0x89d: 0x0817, + 0x89e: 0x08ff, 0x89f: 0x0a97, 0x8a0: 0x0cd3, 0x8a1: 0x0d1f, 0x8a2: 0x0d5f, 0x8a3: 0x0df3, + 0x8a4: 0x0f47, 0x8a5: 0x0fbb, 0x8a6: 0x1157, 0x8a7: 0x12f7, 0x8a8: 0x1303, 0x8a9: 0x1457, + 0x8aa: 0x14d7, 0x8ab: 0x0883, 0x8ac: 0x0e4b, 0x8ad: 0x0903, 0x8ae: 0x0ec7, 0x8af: 0x0f6b, + 0x8b0: 0x1287, 0x8b1: 0x14bf, 0x8b2: 0x15ab, 0x8b3: 0x15d3, 0x8b4: 0x0d37, 0x8b5: 0x0e27, + 0x8b6: 0x11c3, 0x8b7: 0x10b7, 0x8b8: 0x10c3, 0x8b9: 0x10e7, 0x8ba: 0x0f17, 0x8bb: 0x0e9f, + 0x8bc: 0x1363, 0x8bd: 0x0733, 0x8be: 0x122b, 0x8bf: 0x081b, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x080b, 0x8c1: 0x0b0b, 0x8c2: 0x0c2b, 0x8c3: 0x10f3, 0x8c4: 0x0a53, 0x8c5: 0x0e03, + 0x8c6: 0x0cef, 0x8c7: 0x13e7, 0x8c8: 0x12e7, 0x8c9: 0x14ab, 0x8ca: 0x1323, 0x8cb: 0x0b27, + 0x8cc: 0x0787, 0x8cd: 0x095b, 0x8d0: 0x09af, + 0x8d2: 0x0cdf, 0x8d5: 0x07f7, 0x8d6: 0x0f1f, 0x8d7: 0x0fe3, + 0x8d8: 0x1047, 0x8d9: 0x1063, 0x8da: 0x1067, 0x8db: 0x107b, 0x8dc: 0x14fb, 0x8dd: 0x10eb, + 0x8de: 0x116f, 0x8e0: 0x128f, 0x8e2: 0x1353, + 0x8e5: 0x1407, 0x8e6: 0x1433, + 0x8ea: 0x154f, 0x8eb: 0x1553, 0x8ec: 0x1557, 0x8ed: 0x15bb, 0x8ee: 0x142b, 0x8ef: 0x14c7, + 0x8f0: 0x0757, 0x8f1: 0x077b, 0x8f2: 0x078f, 0x8f3: 0x084b, 0x8f4: 0x0857, 0x8f5: 0x0897, + 0x8f6: 0x094b, 0x8f7: 0x0967, 0x8f8: 0x096f, 0x8f9: 0x09ab, 0x8fa: 0x09b7, 0x8fb: 0x0a93, + 0x8fc: 0x0a9b, 0x8fd: 0x0ba3, 0x8fe: 0x0bcb, 0x8ff: 0x0bd3, + // Block 0x24, offset 0x900 + 0x900: 0x0beb, 0x901: 0x0c97, 0x902: 0x0cc7, 0x903: 0x0ce7, 0x904: 0x0d57, 0x905: 0x0e1b, + 0x906: 0x0e37, 0x907: 0x0e67, 0x908: 0x0ebb, 0x909: 0x0edb, 0x90a: 0x0f4f, 0x90b: 0x102f, + 0x90c: 0x104b, 0x90d: 0x1053, 0x90e: 0x104f, 0x90f: 0x1057, 0x910: 0x105b, 0x911: 0x105f, + 0x912: 0x1073, 0x913: 0x1077, 0x914: 0x109b, 0x915: 0x10af, 0x916: 0x10cb, 0x917: 0x112f, + 0x918: 0x1137, 0x919: 0x113f, 0x91a: 0x1153, 0x91b: 0x117b, 0x91c: 0x11cb, 0x91d: 0x11ff, + 0x91e: 0x11ff, 0x91f: 0x1267, 0x920: 0x130f, 0x921: 0x1327, 0x922: 0x135b, 0x923: 0x135f, + 0x924: 0x13a3, 0x925: 0x13a7, 0x926: 0x13ff, 0x927: 0x1407, 0x928: 0x14db, 0x929: 0x151f, + 0x92a: 0x1537, 0x92b: 0x0b9b, 0x92c: 0x171e, 0x92d: 0x11e3, + 0x930: 0x06df, 0x931: 0x07e3, 0x932: 0x07a3, 0x933: 0x074b, 0x934: 0x078b, 0x935: 0x07b7, + 0x936: 0x0847, 0x937: 0x0863, 0x938: 0x094b, 0x939: 0x0937, 0x93a: 0x0947, 0x93b: 0x0963, + 0x93c: 0x09af, 0x93d: 0x09bf, 0x93e: 0x0a03, 0x93f: 0x0a0f, + // Block 0x25, offset 0x940 + 0x940: 0x0a2b, 0x941: 0x0a3b, 0x942: 0x0b23, 0x943: 0x0b2b, 0x944: 0x0b5b, 0x945: 0x0b7b, + 0x946: 0x0bab, 0x947: 0x0bc3, 0x948: 0x0bb3, 0x949: 0x0bd3, 0x94a: 0x0bc7, 0x94b: 0x0beb, + 0x94c: 0x0c07, 0x94d: 0x0c5f, 0x94e: 0x0c6b, 0x94f: 0x0c73, 0x950: 0x0c9b, 0x951: 0x0cdf, + 0x952: 0x0d0f, 0x953: 0x0d13, 0x954: 0x0d27, 0x955: 0x0da7, 0x956: 0x0db7, 0x957: 0x0e0f, + 0x958: 0x0e5b, 0x959: 0x0e53, 0x95a: 0x0e67, 0x95b: 0x0e83, 0x95c: 0x0ebb, 0x95d: 0x1013, + 0x95e: 0x0edf, 0x95f: 0x0f13, 0x960: 0x0f1f, 0x961: 0x0f5f, 0x962: 0x0f7b, 0x963: 0x0f9f, + 0x964: 0x0fc3, 0x965: 0x0fc7, 0x966: 0x0fe3, 0x967: 0x0fe7, 0x968: 0x0ff7, 0x969: 0x100b, + 0x96a: 0x1007, 0x96b: 0x1037, 0x96c: 0x10b3, 0x96d: 0x10cb, 0x96e: 0x10e3, 0x96f: 0x111b, + 0x970: 0x112f, 0x971: 0x114b, 0x972: 0x117b, 0x973: 0x122f, 0x974: 0x1257, 0x975: 0x12cb, + 0x976: 0x1313, 0x977: 0x131f, 0x978: 0x1327, 0x979: 0x133f, 0x97a: 0x1353, 0x97b: 0x1343, + 0x97c: 0x135b, 0x97d: 0x1357, 0x97e: 0x134f, 0x97f: 0x135f, + // Block 0x26, offset 0x980 + 0x980: 0x136b, 0x981: 0x13a7, 0x982: 0x13e3, 0x983: 0x1413, 0x984: 0x144b, 0x985: 0x146b, + 0x986: 0x14b7, 0x987: 0x14db, 0x988: 0x14fb, 0x989: 0x150f, 0x98a: 0x151f, 0x98b: 0x152b, + 0x98c: 0x1537, 0x98d: 0x158b, 0x98e: 0x162b, 0x98f: 0x16b5, 0x990: 0x16b0, 0x991: 0x16e2, + 0x992: 0x0607, 0x993: 0x062f, 0x994: 0x0633, 0x995: 0x1764, 0x996: 0x1791, 0x997: 0x1809, + 0x998: 0x1617, 0x999: 0x1627, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x06fb, 0x9c1: 0x06f3, 0x9c2: 0x0703, 0x9c3: 0x1647, 0x9c4: 0x0747, 0x9c5: 0x0757, + 0x9c6: 0x075b, 0x9c7: 0x0763, 0x9c8: 0x076b, 0x9c9: 0x076f, 0x9ca: 0x077b, 0x9cb: 0x0773, + 0x9cc: 0x05b3, 0x9cd: 0x165b, 0x9ce: 0x078f, 0x9cf: 0x0793, 0x9d0: 0x0797, 0x9d1: 0x07b3, + 0x9d2: 0x164c, 0x9d3: 0x05b7, 0x9d4: 0x079f, 0x9d5: 0x07bf, 0x9d6: 0x1656, 0x9d7: 0x07cf, + 0x9d8: 0x07d7, 0x9d9: 0x0737, 0x9da: 0x07df, 0x9db: 0x07e3, 0x9dc: 0x1831, 0x9dd: 0x07ff, + 0x9de: 0x0807, 0x9df: 0x05bf, 0x9e0: 0x081f, 0x9e1: 0x0823, 0x9e2: 0x082b, 0x9e3: 0x082f, + 0x9e4: 0x05c3, 0x9e5: 0x0847, 0x9e6: 0x084b, 0x9e7: 0x0857, 0x9e8: 0x0863, 0x9e9: 0x0867, + 0x9ea: 0x086b, 0x9eb: 0x0873, 0x9ec: 0x0893, 0x9ed: 0x0897, 0x9ee: 0x089f, 0x9ef: 0x08af, + 0x9f0: 0x08b7, 0x9f1: 0x08bb, 0x9f2: 0x08bb, 0x9f3: 0x08bb, 0x9f4: 0x166a, 0x9f5: 0x0e93, + 0x9f6: 0x08cf, 0x9f7: 0x08d7, 0x9f8: 0x166f, 0x9f9: 0x08e3, 0x9fa: 0x08eb, 0x9fb: 0x08f3, + 0x9fc: 0x091b, 0x9fd: 0x0907, 0x9fe: 0x0913, 0x9ff: 0x0917, + // Block 0x28, offset 0xa00 + 0xa00: 0x091f, 0xa01: 0x0927, 0xa02: 0x092b, 0xa03: 0x0933, 0xa04: 0x093b, 0xa05: 0x093f, + 0xa06: 0x093f, 0xa07: 0x0947, 0xa08: 0x094f, 0xa09: 0x0953, 0xa0a: 0x095f, 0xa0b: 0x0983, + 0xa0c: 0x0967, 0xa0d: 0x0987, 0xa0e: 0x096b, 0xa0f: 0x0973, 0xa10: 0x080b, 0xa11: 0x09cf, + 0xa12: 0x0997, 0xa13: 0x099b, 0xa14: 0x099f, 0xa15: 0x0993, 0xa16: 0x09a7, 0xa17: 0x09a3, + 0xa18: 0x09bb, 0xa19: 0x1674, 0xa1a: 0x09d7, 0xa1b: 0x09db, 0xa1c: 0x09e3, 0xa1d: 0x09ef, + 0xa1e: 0x09f7, 0xa1f: 0x0a13, 0xa20: 0x1679, 0xa21: 0x167e, 0xa22: 0x0a1f, 0xa23: 0x0a23, + 0xa24: 0x0a27, 0xa25: 0x0a1b, 0xa26: 0x0a2f, 0xa27: 0x05c7, 0xa28: 0x05cb, 0xa29: 0x0a37, + 0xa2a: 0x0a3f, 0xa2b: 0x0a3f, 0xa2c: 0x1683, 0xa2d: 0x0a5b, 0xa2e: 0x0a5f, 0xa2f: 0x0a63, + 0xa30: 0x0a6b, 0xa31: 0x1688, 0xa32: 0x0a73, 0xa33: 0x0a77, 0xa34: 0x0b4f, 0xa35: 0x0a7f, + 0xa36: 0x05cf, 0xa37: 0x0a8b, 0xa38: 0x0a9b, 0xa39: 0x0aa7, 0xa3a: 0x0aa3, 0xa3b: 0x1692, + 0xa3c: 0x0aaf, 0xa3d: 0x1697, 0xa3e: 0x0abb, 0xa3f: 0x0ab7, + // Block 0x29, offset 0xa40 + 0xa40: 0x0abf, 0xa41: 0x0acf, 0xa42: 0x0ad3, 0xa43: 0x05d3, 0xa44: 0x0ae3, 0xa45: 0x0aeb, + 0xa46: 0x0aef, 0xa47: 0x0af3, 0xa48: 0x05d7, 0xa49: 0x169c, 0xa4a: 0x05db, 0xa4b: 0x0b0f, + 0xa4c: 0x0b13, 0xa4d: 0x0b17, 0xa4e: 0x0b1f, 0xa4f: 0x1863, 0xa50: 0x0b37, 0xa51: 0x16a6, + 0xa52: 0x16a6, 0xa53: 0x11d7, 0xa54: 0x0b47, 0xa55: 0x0b47, 0xa56: 0x05df, 0xa57: 0x16c9, + 0xa58: 0x179b, 0xa59: 0x0b57, 0xa5a: 0x0b5f, 0xa5b: 0x05e3, 0xa5c: 0x0b73, 0xa5d: 0x0b83, + 0xa5e: 0x0b87, 0xa5f: 0x0b8f, 0xa60: 0x0b9f, 0xa61: 0x05eb, 0xa62: 0x05e7, 0xa63: 0x0ba3, + 0xa64: 0x16ab, 0xa65: 0x0ba7, 0xa66: 0x0bbb, 0xa67: 0x0bbf, 0xa68: 0x0bc3, 0xa69: 0x0bbf, + 0xa6a: 0x0bcf, 0xa6b: 0x0bd3, 0xa6c: 0x0be3, 0xa6d: 0x0bdb, 0xa6e: 0x0bdf, 0xa6f: 0x0be7, + 0xa70: 0x0beb, 0xa71: 0x0bef, 0xa72: 0x0bfb, 0xa73: 0x0bff, 0xa74: 0x0c17, 0xa75: 0x0c1f, + 0xa76: 0x0c2f, 0xa77: 0x0c43, 0xa78: 0x16ba, 0xa79: 0x0c3f, 0xa7a: 0x0c33, 0xa7b: 0x0c4b, + 0xa7c: 0x0c53, 0xa7d: 0x0c67, 0xa7e: 0x16bf, 0xa7f: 0x0c6f, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0c63, 0xa81: 0x0c5b, 0xa82: 0x05ef, 0xa83: 0x0c77, 0xa84: 0x0c7f, 0xa85: 0x0c87, + 0xa86: 0x0c7b, 0xa87: 0x05f3, 0xa88: 0x0c97, 0xa89: 0x0c9f, 0xa8a: 0x16c4, 0xa8b: 0x0ccb, + 0xa8c: 0x0cff, 0xa8d: 0x0cdb, 0xa8e: 0x05ff, 0xa8f: 0x0ce7, 0xa90: 0x05fb, 0xa91: 0x05f7, + 0xa92: 0x07c3, 0xa93: 0x07c7, 0xa94: 0x0d03, 0xa95: 0x0ceb, 0xa96: 0x11ab, 0xa97: 0x0663, + 0xa98: 0x0d0f, 0xa99: 0x0d13, 0xa9a: 0x0d17, 0xa9b: 0x0d2b, 0xa9c: 0x0d23, 0xa9d: 0x16dd, + 0xa9e: 0x0603, 0xa9f: 0x0d3f, 0xaa0: 0x0d33, 0xaa1: 0x0d4f, 0xaa2: 0x0d57, 0xaa3: 0x16e7, + 0xaa4: 0x0d5b, 0xaa5: 0x0d47, 0xaa6: 0x0d63, 0xaa7: 0x0607, 0xaa8: 0x0d67, 0xaa9: 0x0d6b, + 0xaaa: 0x0d6f, 0xaab: 0x0d7b, 0xaac: 0x16ec, 0xaad: 0x0d83, 0xaae: 0x060b, 0xaaf: 0x0d8f, + 0xab0: 0x16f1, 0xab1: 0x0d93, 0xab2: 0x060f, 0xab3: 0x0d9f, 0xab4: 0x0dab, 0xab5: 0x0db7, + 0xab6: 0x0dbb, 0xab7: 0x16f6, 0xab8: 0x168d, 0xab9: 0x16fb, 0xaba: 0x0ddb, 0xabb: 0x1700, + 0xabc: 0x0de7, 0xabd: 0x0def, 0xabe: 0x0ddf, 0xabf: 0x0dfb, + // Block 0x2b, offset 0xac0 + 0xac0: 0x0e0b, 0xac1: 0x0e1b, 0xac2: 0x0e0f, 0xac3: 0x0e13, 0xac4: 0x0e1f, 0xac5: 0x0e23, + 0xac6: 0x1705, 0xac7: 0x0e07, 0xac8: 0x0e3b, 0xac9: 0x0e3f, 0xaca: 0x0613, 0xacb: 0x0e53, + 0xacc: 0x0e4f, 0xacd: 0x170a, 0xace: 0x0e33, 0xacf: 0x0e6f, 0xad0: 0x170f, 0xad1: 0x1714, + 0xad2: 0x0e73, 0xad3: 0x0e87, 0xad4: 0x0e83, 0xad5: 0x0e7f, 0xad6: 0x0617, 0xad7: 0x0e8b, + 0xad8: 0x0e9b, 0xad9: 0x0e97, 0xada: 0x0ea3, 0xadb: 0x1651, 0xadc: 0x0eb3, 0xadd: 0x1719, + 0xade: 0x0ebf, 0xadf: 0x1723, 0xae0: 0x0ed3, 0xae1: 0x0edf, 0xae2: 0x0ef3, 0xae3: 0x1728, + 0xae4: 0x0f07, 0xae5: 0x0f0b, 0xae6: 0x172d, 0xae7: 0x1732, 0xae8: 0x0f27, 0xae9: 0x0f37, + 0xaea: 0x061b, 0xaeb: 0x0f3b, 0xaec: 0x061f, 0xaed: 0x061f, 0xaee: 0x0f53, 0xaef: 0x0f57, + 0xaf0: 0x0f5f, 0xaf1: 0x0f63, 0xaf2: 0x0f6f, 0xaf3: 0x0623, 0xaf4: 0x0f87, 0xaf5: 0x1737, + 0xaf6: 0x0fa3, 0xaf7: 0x173c, 0xaf8: 0x0faf, 0xaf9: 0x16a1, 0xafa: 0x0fbf, 0xafb: 0x1741, + 0xafc: 0x1746, 0xafd: 0x174b, 0xafe: 0x0627, 0xaff: 0x062b, + // Block 0x2c, offset 0xb00 + 0xb00: 0x0ff7, 0xb01: 0x1755, 0xb02: 0x1750, 0xb03: 0x175a, 0xb04: 0x175f, 0xb05: 0x0fff, + 0xb06: 0x1003, 0xb07: 0x1003, 0xb08: 0x100b, 0xb09: 0x0633, 0xb0a: 0x100f, 0xb0b: 0x0637, + 0xb0c: 0x063b, 0xb0d: 0x1769, 0xb0e: 0x1023, 0xb0f: 0x102b, 0xb10: 0x1037, 0xb11: 0x063f, + 0xb12: 0x176e, 0xb13: 0x105b, 0xb14: 0x1773, 0xb15: 0x1778, 0xb16: 0x107b, 0xb17: 0x1093, + 0xb18: 0x0643, 0xb19: 0x109b, 0xb1a: 0x109f, 0xb1b: 0x10a3, 0xb1c: 0x177d, 0xb1d: 0x1782, + 0xb1e: 0x1782, 0xb1f: 0x10bb, 0xb20: 0x0647, 0xb21: 0x1787, 0xb22: 0x10cf, 0xb23: 0x10d3, + 0xb24: 0x064b, 0xb25: 0x178c, 0xb26: 0x10ef, 0xb27: 0x064f, 0xb28: 0x10ff, 0xb29: 0x10f7, + 0xb2a: 0x1107, 0xb2b: 0x1796, 0xb2c: 0x111f, 0xb2d: 0x0653, 0xb2e: 0x112b, 0xb2f: 0x1133, + 0xb30: 0x1143, 0xb31: 0x0657, 0xb32: 0x17a0, 0xb33: 0x17a5, 0xb34: 0x065b, 0xb35: 0x17aa, + 0xb36: 0x115b, 0xb37: 0x17af, 0xb38: 0x1167, 0xb39: 0x1173, 0xb3a: 0x117b, 0xb3b: 0x17b4, + 0xb3c: 0x17b9, 0xb3d: 0x118f, 0xb3e: 0x17be, 0xb3f: 0x1197, + // Block 0x2d, offset 0xb40 + 0xb40: 0x16ce, 0xb41: 0x065f, 0xb42: 0x11af, 0xb43: 0x11b3, 0xb44: 0x0667, 0xb45: 0x11b7, + 0xb46: 0x0a33, 0xb47: 0x17c3, 0xb48: 0x17c8, 0xb49: 0x16d3, 0xb4a: 0x16d8, 0xb4b: 0x11d7, + 0xb4c: 0x11db, 0xb4d: 0x13f3, 0xb4e: 0x066b, 0xb4f: 0x1207, 0xb50: 0x1203, 0xb51: 0x120b, + 0xb52: 0x083f, 0xb53: 0x120f, 0xb54: 0x1213, 0xb55: 0x1217, 0xb56: 0x121f, 0xb57: 0x17cd, + 0xb58: 0x121b, 0xb59: 0x1223, 0xb5a: 0x1237, 0xb5b: 0x123b, 0xb5c: 0x1227, 0xb5d: 0x123f, + 0xb5e: 0x1253, 0xb5f: 0x1267, 0xb60: 0x1233, 0xb61: 0x1247, 0xb62: 0x124b, 0xb63: 0x124f, + 0xb64: 0x17d2, 0xb65: 0x17dc, 0xb66: 0x17d7, 0xb67: 0x066f, 0xb68: 0x126f, 0xb69: 0x1273, + 0xb6a: 0x127b, 0xb6b: 0x17f0, 0xb6c: 0x127f, 0xb6d: 0x17e1, 0xb6e: 0x0673, 0xb6f: 0x0677, + 0xb70: 0x17e6, 0xb71: 0x17eb, 0xb72: 0x067b, 0xb73: 0x129f, 0xb74: 0x12a3, 0xb75: 0x12a7, + 0xb76: 0x12ab, 0xb77: 0x12b7, 0xb78: 0x12b3, 0xb79: 0x12bf, 0xb7a: 0x12bb, 0xb7b: 0x12cb, + 0xb7c: 0x12c3, 0xb7d: 0x12c7, 0xb7e: 0x12cf, 0xb7f: 0x067f, + // Block 0x2e, offset 0xb80 + 0xb80: 0x12d7, 0xb81: 0x12db, 0xb82: 0x0683, 0xb83: 0x12eb, 0xb84: 0x12ef, 0xb85: 0x17f5, + 0xb86: 0x12fb, 0xb87: 0x12ff, 0xb88: 0x0687, 0xb89: 0x130b, 0xb8a: 0x05bb, 0xb8b: 0x17fa, + 0xb8c: 0x17ff, 0xb8d: 0x068b, 0xb8e: 0x068f, 0xb8f: 0x1337, 0xb90: 0x134f, 0xb91: 0x136b, + 0xb92: 0x137b, 0xb93: 0x1804, 0xb94: 0x138f, 0xb95: 0x1393, 0xb96: 0x13ab, 0xb97: 0x13b7, + 0xb98: 0x180e, 0xb99: 0x1660, 0xb9a: 0x13c3, 0xb9b: 0x13bf, 0xb9c: 0x13cb, 0xb9d: 0x1665, + 0xb9e: 0x13d7, 0xb9f: 0x13e3, 0xba0: 0x1813, 0xba1: 0x1818, 0xba2: 0x1423, 0xba3: 0x142f, + 0xba4: 0x1437, 0xba5: 0x181d, 0xba6: 0x143b, 0xba7: 0x1467, 0xba8: 0x1473, 0xba9: 0x1477, + 0xbaa: 0x146f, 0xbab: 0x1483, 0xbac: 0x1487, 0xbad: 0x1822, 0xbae: 0x1493, 0xbaf: 0x0693, + 0xbb0: 0x149b, 0xbb1: 0x1827, 0xbb2: 0x0697, 0xbb3: 0x14d3, 0xbb4: 0x0ac3, 0xbb5: 0x14eb, + 0xbb6: 0x182c, 0xbb7: 0x1836, 0xbb8: 0x069b, 0xbb9: 0x069f, 0xbba: 0x1513, 0xbbb: 0x183b, + 0xbbc: 0x06a3, 0xbbd: 0x1840, 0xbbe: 0x152b, 0xbbf: 0x152b, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x1533, 0xbc1: 0x1845, 0xbc2: 0x154b, 0xbc3: 0x06a7, 0xbc4: 0x155b, 0xbc5: 0x1567, + 0xbc6: 0x156f, 0xbc7: 0x1577, 0xbc8: 0x06ab, 0xbc9: 0x184a, 0xbca: 0x158b, 0xbcb: 0x15a7, + 0xbcc: 0x15b3, 0xbcd: 0x06af, 0xbce: 0x06b3, 0xbcf: 0x15b7, 0xbd0: 0x184f, 0xbd1: 0x06b7, + 0xbd2: 0x1854, 0xbd3: 0x1859, 0xbd4: 0x185e, 0xbd5: 0x15db, 0xbd6: 0x06bb, 0xbd7: 0x15ef, + 0xbd8: 0x15f7, 0xbd9: 0x15fb, 0xbda: 0x1603, 0xbdb: 0x160b, 0xbdc: 0x1613, 0xbdd: 0x1868, +} + +// nfcIndex: 22 blocks, 1408 entries, 1408 bytes +// Block 0 is the zero block. +var nfcIndex = [1408]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x2e, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2f, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x30, 0xcb: 0x31, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x32, + 0xd0: 0x09, 0xd1: 0x33, 0xd2: 0x34, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x35, + 0xd8: 0x36, 0xd9: 0x0c, 0xdb: 0x37, 0xdc: 0x38, 0xdd: 0x39, 0xdf: 0x3a, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x3b, 0x121: 0x3c, 0x123: 0x0d, 0x124: 0x3d, 0x125: 0x3e, 0x126: 0x3f, 0x127: 0x40, + 0x128: 0x41, 0x129: 0x42, 0x12a: 0x43, 0x12b: 0x44, 0x12c: 0x3f, 0x12d: 0x45, 0x12e: 0x46, 0x12f: 0x47, + 0x131: 0x48, 0x132: 0x49, 0x133: 0x4a, 0x134: 0x4b, 0x135: 0x4c, 0x137: 0x4d, + 0x138: 0x4e, 0x139: 0x4f, 0x13a: 0x50, 0x13b: 0x51, 0x13c: 0x52, 0x13d: 0x53, 0x13e: 0x54, 0x13f: 0x55, + // Block 0x5, offset 0x140 + 0x140: 0x56, 0x142: 0x57, 0x144: 0x58, 0x145: 0x59, 0x146: 0x5a, 0x147: 0x5b, + 0x14d: 0x5c, + 0x15c: 0x5d, 0x15f: 0x5e, + 0x162: 0x5f, 0x164: 0x60, + 0x168: 0x61, 0x169: 0x62, 0x16a: 0x63, 0x16c: 0x0e, 0x16d: 0x64, 0x16e: 0x65, 0x16f: 0x66, + 0x170: 0x67, 0x173: 0x68, 0x177: 0x0f, + 0x178: 0x10, 0x179: 0x11, 0x17a: 0x12, 0x17b: 0x13, 0x17c: 0x14, 0x17d: 0x15, 0x17e: 0x16, 0x17f: 0x17, + // Block 0x6, offset 0x180 + 0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d, + 0x188: 0x6e, 0x189: 0x18, 0x18a: 0x19, 0x18b: 0x6f, 0x18c: 0x70, + 0x1ab: 0x71, + 0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x75, 0x1c1: 0x1a, 0x1c2: 0x1b, 0x1c3: 0x1c, 0x1c4: 0x76, 0x1c5: 0x77, + 0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a, + // Block 0x8, offset 0x200 + 0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d, + 0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83, + 0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86, + 0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87, + 0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88, + // Block 0x9, offset 0x240 + 0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89, + 0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a, + 0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b, + 0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c, + 0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d, + 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87, + 0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88, + 0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89, + // Block 0xa, offset 0x280 + 0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a, + 0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b, + 0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c, + 0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d, + 0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87, + 0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88, + 0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89, + 0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b, + 0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c, + 0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d, + 0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e, + // Block 0xc, offset 0x300 + 0x324: 0x1d, 0x325: 0x1e, 0x326: 0x1f, 0x327: 0x20, + 0x328: 0x21, 0x329: 0x22, 0x32a: 0x23, 0x32b: 0x24, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91, + 0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95, + 0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b, + // Block 0xd, offset 0x340 + 0x347: 0x9c, + 0x34b: 0x9d, 0x34d: 0x9e, + 0x368: 0x9f, 0x36b: 0xa0, + 0x374: 0xa1, + 0x37d: 0xa2, + // Block 0xe, offset 0x380 + 0x381: 0xa3, 0x382: 0xa4, 0x384: 0xa5, 0x385: 0x82, 0x387: 0xa6, + 0x388: 0xa7, 0x38b: 0xa8, 0x38c: 0xa9, 0x38d: 0xaa, + 0x391: 0xab, 0x392: 0xac, 0x393: 0xad, 0x396: 0xae, 0x397: 0xaf, + 0x398: 0x73, 0x39a: 0xb0, 0x39c: 0xb1, + 0x3a0: 0xb2, 0x3a7: 0xb3, + 0x3a8: 0xb4, 0x3a9: 0xb5, 0x3aa: 0xb6, + 0x3b0: 0x73, 0x3b5: 0xb7, 0x3b6: 0xb8, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xb9, 0x3ec: 0xba, + // Block 0x10, offset 0x400 + 0x432: 0xbb, + // Block 0x11, offset 0x440 + 0x445: 0xbc, 0x446: 0xbd, 0x447: 0xbe, + 0x449: 0xbf, + // Block 0x12, offset 0x480 + 0x480: 0xc0, 0x484: 0xba, + 0x48b: 0xc1, + 0x4a3: 0xc2, 0x4a5: 0xc3, + // Block 0x13, offset 0x4c0 + 0x4c8: 0xc4, + // Block 0x14, offset 0x500 + 0x520: 0x25, 0x521: 0x26, 0x522: 0x27, 0x523: 0x28, 0x524: 0x29, 0x525: 0x2a, 0x526: 0x2b, 0x527: 0x2c, + 0x528: 0x2d, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfcSparseOffset: 151 entries, 302 bytes +var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x63, 0x68, 0x6a, 0x72, 0x79, 0x7c, 0x84, 0x88, 0x8c, 0x8e, 0x90, 0x99, 0x9d, 0xa4, 0xa9, 0xac, 0xb6, 0xb9, 0xc0, 0xc8, 0xcb, 0xcd, 0xd0, 0xd2, 0xd7, 0xe8, 0xf4, 0xf6, 0xfc, 0xfe, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10b, 0x10e, 0x110, 0x113, 0x116, 0x11a, 0x11f, 0x128, 0x12a, 0x12d, 0x12f, 0x13a, 0x13e, 0x14c, 0x14f, 0x155, 0x15b, 0x166, 0x16a, 0x16c, 0x16e, 0x170, 0x172, 0x174, 0x17a, 0x17e, 0x180, 0x182, 0x18a, 0x18e, 0x191, 0x193, 0x195, 0x197, 0x19a, 0x19c, 0x19e, 0x1a0, 0x1a2, 0x1a8, 0x1ab, 0x1ad, 0x1b4, 0x1ba, 0x1c0, 0x1c8, 0x1ce, 0x1d4, 0x1da, 0x1de, 0x1ec, 0x1f5, 0x1f8, 0x1fb, 0x1fd, 0x200, 0x202, 0x206, 0x20b, 0x20d, 0x20f, 0x214, 0x21a, 0x21c, 0x21e, 0x220, 0x226, 0x229, 0x22b, 0x231, 0x234, 0x23c, 0x243, 0x246, 0x249, 0x24b, 0x24e, 0x256, 0x25a, 0x261, 0x264, 0x26a, 0x26c, 0x26f, 0x271, 0x274, 0x276, 0x278, 0x27a, 0x27c, 0x27f, 0x281, 0x283, 0x285, 0x287, 0x294, 0x29e, 0x2a0, 0x2a2, 0x2a8, 0x2aa, 0x2ac, 0x2af} + +// nfcSparseValues: 689 entries, 2756 bytes +var nfcSparseValues = [689]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x04}, + {value: 0xa100, lo: 0xa8, hi: 0xa8}, + {value: 0x8100, lo: 0xaf, hi: 0xaf}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb8, hi: 0xb8}, + // Block 0x1, offset 0x5 + {value: 0x0091, lo: 0x03}, + {value: 0x46e5, lo: 0xa0, hi: 0xa1}, + {value: 0x4717, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x9 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + // Block 0x3, offset 0xb + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x98, hi: 0x9d}, + // Block 0x4, offset 0xd + {value: 0x0006, lo: 0x0a}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x85, hi: 0x85}, + {value: 0xa000, lo: 0x89, hi: 0x89}, + {value: 0x4843, lo: 0x8a, hi: 0x8a}, + {value: 0x4861, lo: 0x8b, hi: 0x8b}, + {value: 0x36ca, lo: 0x8c, hi: 0x8c}, + {value: 0x36e2, lo: 0x8d, hi: 0x8d}, + {value: 0x4879, lo: 0x8e, hi: 0x8e}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x3700, lo: 0x93, hi: 0x94}, + // Block 0x5, offset 0x18 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x37a8, lo: 0x90, hi: 0x90}, + {value: 0x37b4, lo: 0x91, hi: 0x91}, + {value: 0x37a2, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x381a, lo: 0x97, hi: 0x97}, + {value: 0x37e4, lo: 0x9c, hi: 0x9c}, + {value: 0x37cc, lo: 0x9d, hi: 0x9d}, + {value: 0x37f6, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x3820, lo: 0xb6, hi: 0xb6}, + {value: 0x3826, lo: 0xb7, hi: 0xb7}, + // Block 0x6, offset 0x28 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x83, hi: 0x87}, + // Block 0x7, offset 0x2a + {value: 0x0001, lo: 0x04}, + {value: 0x8113, lo: 0x81, hi: 0x82}, + {value: 0x8132, lo: 0x84, hi: 0x84}, + {value: 0x812d, lo: 0x85, hi: 0x85}, + {value: 0x810d, lo: 0x87, hi: 0x87}, + // Block 0x8, offset 0x2f + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x97}, + {value: 0x8119, lo: 0x98, hi: 0x98}, + {value: 0x811a, lo: 0x99, hi: 0x99}, + {value: 0x811b, lo: 0x9a, hi: 0x9a}, + {value: 0x3844, lo: 0xa2, hi: 0xa2}, + {value: 0x384a, lo: 0xa3, hi: 0xa3}, + {value: 0x3856, lo: 0xa4, hi: 0xa4}, + {value: 0x3850, lo: 0xa5, hi: 0xa5}, + {value: 0x385c, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x9, offset 0x3a + {value: 0x0000, lo: 0x0e}, + {value: 0x386e, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x3862, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x3868, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8132, lo: 0x96, hi: 0x9c}, + {value: 0x8132, lo: 0x9f, hi: 0xa2}, + {value: 0x812d, lo: 0xa3, hi: 0xa3}, + {value: 0x8132, lo: 0xa4, hi: 0xa4}, + {value: 0x8132, lo: 0xa7, hi: 0xa8}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xac}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + // Block 0xa, offset 0x49 + {value: 0x0000, lo: 0x0c}, + {value: 0x811f, lo: 0x91, hi: 0x91}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x812d, lo: 0xb1, hi: 0xb1}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb5, hi: 0xb6}, + {value: 0x812d, lo: 0xb7, hi: 0xb9}, + {value: 0x8132, lo: 0xba, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbc}, + {value: 0x8132, lo: 0xbd, hi: 0xbd}, + {value: 0x812d, lo: 0xbe, hi: 0xbe}, + {value: 0x8132, lo: 0xbf, hi: 0xbf}, + // Block 0xb, offset 0x56 + {value: 0x0005, lo: 0x07}, + {value: 0x8132, lo: 0x80, hi: 0x80}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x812d, lo: 0x82, hi: 0x83}, + {value: 0x812d, lo: 0x84, hi: 0x85}, + {value: 0x812d, lo: 0x86, hi: 0x87}, + {value: 0x812d, lo: 0x88, hi: 0x89}, + {value: 0x8132, lo: 0x8a, hi: 0x8a}, + // Block 0xc, offset 0x5e + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0xab, hi: 0xb1}, + {value: 0x812d, lo: 0xb2, hi: 0xb2}, + {value: 0x8132, lo: 0xb3, hi: 0xb3}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0xd, offset 0x63 + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0x96, hi: 0x99}, + {value: 0x8132, lo: 0x9b, hi: 0xa3}, + {value: 0x8132, lo: 0xa5, hi: 0xa7}, + {value: 0x8132, lo: 0xa9, hi: 0xad}, + // Block 0xe, offset 0x68 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x99, hi: 0x9b}, + // Block 0xf, offset 0x6a + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x3edb, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x3ee3, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x3eeb, lo: 0xb4, hi: 0xb4}, + {value: 0x9902, lo: 0xbc, hi: 0xbc}, + // Block 0x10, offset 0x72 + {value: 0x0008, lo: 0x06}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x91, hi: 0x91}, + {value: 0x812d, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x93, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x94}, + {value: 0x451f, lo: 0x98, hi: 0x9f}, + // Block 0x11, offset 0x79 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x12, offset 0x7c + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ca1, lo: 0x8b, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x455f, lo: 0x9c, hi: 0x9d}, + {value: 0x456f, lo: 0x9f, hi: 0x9f}, + {value: 0x8132, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x84 + {value: 0x0000, lo: 0x03}, + {value: 0x4597, lo: 0xb3, hi: 0xb3}, + {value: 0x459f, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x14, offset 0x88 + {value: 0x0008, lo: 0x03}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x4577, lo: 0x99, hi: 0x9b}, + {value: 0x458f, lo: 0x9e, hi: 0x9e}, + // Block 0x15, offset 0x8c + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x16, offset 0x8e + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + // Block 0x17, offset 0x90 + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2cb9, lo: 0x88, hi: 0x88}, + {value: 0x2cb1, lo: 0x8b, hi: 0x8b}, + {value: 0x2cc1, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x45a7, lo: 0x9c, hi: 0x9c}, + {value: 0x45af, lo: 0x9d, hi: 0x9d}, + // Block 0x18, offset 0x99 + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2cc9, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x19, offset 0x9d + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2cd1, lo: 0x8a, hi: 0x8a}, + {value: 0x2ce1, lo: 0x8b, hi: 0x8b}, + {value: 0x2cd9, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1a, offset 0xa4 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x3ef3, lo: 0x88, hi: 0x88}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8120, lo: 0x95, hi: 0x96}, + // Block 0x1b, offset 0xa9 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1c, offset 0xac + {value: 0x0000, lo: 0x09}, + {value: 0x2ce9, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2cf1, lo: 0x87, hi: 0x87}, + {value: 0x2cf9, lo: 0x88, hi: 0x88}, + {value: 0x2f53, lo: 0x8a, hi: 0x8a}, + {value: 0x2ddb, lo: 0x8b, hi: 0x8b}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1d, offset 0xb6 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1e, offset 0xb9 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2d01, lo: 0x8a, hi: 0x8a}, + {value: 0x2d11, lo: 0x8b, hi: 0x8b}, + {value: 0x2d09, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1f, offset 0xc0 + {value: 0x6be7, lo: 0x07}, + {value: 0x9904, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x3efb, lo: 0x9a, hi: 0x9a}, + {value: 0x2f5b, lo: 0x9c, hi: 0x9c}, + {value: 0x2de6, lo: 0x9d, hi: 0x9d}, + {value: 0x2d19, lo: 0x9e, hi: 0x9f}, + // Block 0x20, offset 0xc8 + {value: 0x0000, lo: 0x02}, + {value: 0x8122, lo: 0xb8, hi: 0xb9}, + {value: 0x8104, lo: 0xba, hi: 0xba}, + // Block 0x21, offset 0xcb + {value: 0x0000, lo: 0x01}, + {value: 0x8123, lo: 0x88, hi: 0x8b}, + // Block 0x22, offset 0xcd + {value: 0x0000, lo: 0x02}, + {value: 0x8124, lo: 0xb8, hi: 0xb9}, + {value: 0x8104, lo: 0xba, hi: 0xba}, + // Block 0x23, offset 0xd0 + {value: 0x0000, lo: 0x01}, + {value: 0x8125, lo: 0x88, hi: 0x8b}, + // Block 0x24, offset 0xd2 + {value: 0x0000, lo: 0x04}, + {value: 0x812d, lo: 0x98, hi: 0x99}, + {value: 0x812d, lo: 0xb5, hi: 0xb5}, + {value: 0x812d, lo: 0xb7, hi: 0xb7}, + {value: 0x812b, lo: 0xb9, hi: 0xb9}, + // Block 0x25, offset 0xd7 + {value: 0x0000, lo: 0x10}, + {value: 0x2647, lo: 0x83, hi: 0x83}, + {value: 0x264e, lo: 0x8d, hi: 0x8d}, + {value: 0x2655, lo: 0x92, hi: 0x92}, + {value: 0x265c, lo: 0x97, hi: 0x97}, + {value: 0x2663, lo: 0x9c, hi: 0x9c}, + {value: 0x2640, lo: 0xa9, hi: 0xa9}, + {value: 0x8126, lo: 0xb1, hi: 0xb1}, + {value: 0x8127, lo: 0xb2, hi: 0xb2}, + {value: 0x4a87, lo: 0xb3, hi: 0xb3}, + {value: 0x8128, lo: 0xb4, hi: 0xb4}, + {value: 0x4a90, lo: 0xb5, hi: 0xb5}, + {value: 0x45b7, lo: 0xb6, hi: 0xb6}, + {value: 0x8200, lo: 0xb7, hi: 0xb7}, + {value: 0x45bf, lo: 0xb8, hi: 0xb8}, + {value: 0x8200, lo: 0xb9, hi: 0xb9}, + {value: 0x8127, lo: 0xba, hi: 0xbd}, + // Block 0x26, offset 0xe8 + {value: 0x0000, lo: 0x0b}, + {value: 0x8127, lo: 0x80, hi: 0x80}, + {value: 0x4a99, lo: 0x81, hi: 0x81}, + {value: 0x8132, lo: 0x82, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0x86, hi: 0x87}, + {value: 0x2671, lo: 0x93, hi: 0x93}, + {value: 0x2678, lo: 0x9d, hi: 0x9d}, + {value: 0x267f, lo: 0xa2, hi: 0xa2}, + {value: 0x2686, lo: 0xa7, hi: 0xa7}, + {value: 0x268d, lo: 0xac, hi: 0xac}, + {value: 0x266a, lo: 0xb9, hi: 0xb9}, + // Block 0x27, offset 0xf4 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x86, hi: 0x86}, + // Block 0x28, offset 0xf6 + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2d21, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x29, offset 0xfc + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + // Block 0x2a, offset 0xfe + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2b, offset 0x100 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2c, offset 0x102 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2d, offset 0x104 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2e, offset 0x106 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x9d, hi: 0x9f}, + // Block 0x2f, offset 0x108 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x94, hi: 0x94}, + {value: 0x8104, lo: 0xb4, hi: 0xb4}, + // Block 0x30, offset 0x10b + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x9d, hi: 0x9d}, + // Block 0x31, offset 0x10e + {value: 0x0000, lo: 0x01}, + {value: 0x8131, lo: 0xa9, hi: 0xa9}, + // Block 0x32, offset 0x110 + {value: 0x0004, lo: 0x02}, + {value: 0x812e, lo: 0xb9, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbb}, + // Block 0x33, offset 0x113 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x97, hi: 0x97}, + {value: 0x812d, lo: 0x98, hi: 0x98}, + // Block 0x34, offset 0x116 + {value: 0x0000, lo: 0x03}, + {value: 0x8104, lo: 0xa0, hi: 0xa0}, + {value: 0x8132, lo: 0xb5, hi: 0xbc}, + {value: 0x812d, lo: 0xbf, hi: 0xbf}, + // Block 0x35, offset 0x11a + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + {value: 0x812d, lo: 0xb5, hi: 0xba}, + {value: 0x8132, lo: 0xbb, hi: 0xbc}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x36, offset 0x11f + {value: 0x0000, lo: 0x08}, + {value: 0x2d69, lo: 0x80, hi: 0x80}, + {value: 0x2d71, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2d79, lo: 0x83, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xac}, + {value: 0x8132, lo: 0xad, hi: 0xb3}, + // Block 0x37, offset 0x128 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xaa, hi: 0xab}, + // Block 0x38, offset 0x12a + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xa6, hi: 0xa6}, + {value: 0x8104, lo: 0xb2, hi: 0xb3}, + // Block 0x39, offset 0x12d + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x3a, offset 0x12f + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812d, lo: 0x95, hi: 0x99}, + {value: 0x8132, lo: 0x9a, hi: 0x9b}, + {value: 0x812d, lo: 0x9c, hi: 0x9f}, + {value: 0x8132, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + {value: 0x8132, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb8, hi: 0xb9}, + // Block 0x3b, offset 0x13a + {value: 0x0004, lo: 0x03}, + {value: 0x0433, lo: 0x80, hi: 0x81}, + {value: 0x8100, lo: 0x97, hi: 0x97}, + {value: 0x8100, lo: 0xbe, hi: 0xbe}, + // Block 0x3c, offset 0x13e + {value: 0x0000, lo: 0x0d}, + {value: 0x8132, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8132, lo: 0x9b, hi: 0x9c}, + {value: 0x8132, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8132, lo: 0xa7, hi: 0xa7}, + {value: 0x812d, lo: 0xa8, hi: 0xa8}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xaf}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + // Block 0x3d, offset 0x14c + {value: 0x427e, lo: 0x02}, + {value: 0x01b8, lo: 0xa6, hi: 0xa6}, + {value: 0x0057, lo: 0xaa, hi: 0xab}, + // Block 0x3e, offset 0x14f + {value: 0x0007, lo: 0x05}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3bbc, lo: 0x9a, hi: 0x9b}, + {value: 0x3bca, lo: 0xae, hi: 0xae}, + // Block 0x3f, offset 0x155 + {value: 0x000e, lo: 0x05}, + {value: 0x3bd1, lo: 0x8d, hi: 0x8e}, + {value: 0x3bd8, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x40, offset 0x15b + {value: 0x6405, lo: 0x0a}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3be6, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3bed, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3bf4, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3bfb, lo: 0xa4, hi: 0xa5}, + {value: 0x3c02, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x41, offset 0x166 + {value: 0x0007, lo: 0x03}, + {value: 0x3c6b, lo: 0xa0, hi: 0xa1}, + {value: 0x3c95, lo: 0xa2, hi: 0xa3}, + {value: 0x3cbf, lo: 0xaa, hi: 0xad}, + // Block 0x42, offset 0x16a + {value: 0x0004, lo: 0x01}, + {value: 0x048b, lo: 0xa9, hi: 0xaa}, + // Block 0x43, offset 0x16c + {value: 0x0000, lo: 0x01}, + {value: 0x44e0, lo: 0x9c, hi: 0x9c}, + // Block 0x44, offset 0x16e + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xaf, hi: 0xb1}, + // Block 0x45, offset 0x170 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x46, offset 0x172 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa0, hi: 0xbf}, + // Block 0x47, offset 0x174 + {value: 0x0000, lo: 0x05}, + {value: 0x812c, lo: 0xaa, hi: 0xaa}, + {value: 0x8131, lo: 0xab, hi: 0xab}, + {value: 0x8133, lo: 0xac, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x812f, lo: 0xae, hi: 0xaf}, + // Block 0x48, offset 0x17a + {value: 0x0000, lo: 0x03}, + {value: 0x4aa2, lo: 0xb3, hi: 0xb3}, + {value: 0x4aa2, lo: 0xb5, hi: 0xb6}, + {value: 0x4aa2, lo: 0xba, hi: 0xbf}, + // Block 0x49, offset 0x17e + {value: 0x0000, lo: 0x01}, + {value: 0x4aa2, lo: 0x8f, hi: 0xa3}, + // Block 0x4a, offset 0x180 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xae, hi: 0xbe}, + // Block 0x4b, offset 0x182 + {value: 0x0000, lo: 0x07}, + {value: 0x8100, lo: 0x84, hi: 0x84}, + {value: 0x8100, lo: 0x87, hi: 0x87}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + {value: 0x8100, lo: 0x9e, hi: 0x9e}, + {value: 0x8100, lo: 0xa1, hi: 0xa1}, + {value: 0x8100, lo: 0xb2, hi: 0xb2}, + {value: 0x8100, lo: 0xbb, hi: 0xbb}, + // Block 0x4c, offset 0x18a + {value: 0x0000, lo: 0x03}, + {value: 0x8100, lo: 0x80, hi: 0x80}, + {value: 0x8100, lo: 0x8b, hi: 0x8b}, + {value: 0x8100, lo: 0x8e, hi: 0x8e}, + // Block 0x4d, offset 0x18e + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xaf, hi: 0xaf}, + {value: 0x8132, lo: 0xb4, hi: 0xbd}, + // Block 0x4e, offset 0x191 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x9e, hi: 0x9f}, + // Block 0x4f, offset 0x193 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb1}, + // Block 0x50, offset 0x195 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + // Block 0x51, offset 0x197 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xa0, hi: 0xb1}, + // Block 0x52, offset 0x19a + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xab, hi: 0xad}, + // Block 0x53, offset 0x19c + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x93, hi: 0x93}, + // Block 0x54, offset 0x19e + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb3, hi: 0xb3}, + // Block 0x55, offset 0x1a0 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + // Block 0x56, offset 0x1a2 + {value: 0x0000, lo: 0x05}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb7, hi: 0xb8}, + {value: 0x8132, lo: 0xbe, hi: 0xbf}, + // Block 0x57, offset 0x1a8 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + // Block 0x58, offset 0x1ab + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xad, hi: 0xad}, + // Block 0x59, offset 0x1ad + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x5a, offset 0x1b4 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x5b, offset 0x1ba + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x5c, offset 0x1c0 + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x5d, offset 0x1c8 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x5e, offset 0x1ce + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x5f, offset 0x1d4 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x60, offset 0x1da + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x61, offset 0x1de + {value: 0x0006, lo: 0x0d}, + {value: 0x4393, lo: 0x9d, hi: 0x9d}, + {value: 0x8115, lo: 0x9e, hi: 0x9e}, + {value: 0x4405, lo: 0x9f, hi: 0x9f}, + {value: 0x43f3, lo: 0xaa, hi: 0xab}, + {value: 0x44f7, lo: 0xac, hi: 0xac}, + {value: 0x44ff, lo: 0xad, hi: 0xad}, + {value: 0x434b, lo: 0xae, hi: 0xb1}, + {value: 0x4369, lo: 0xb2, hi: 0xb4}, + {value: 0x4381, lo: 0xb5, hi: 0xb6}, + {value: 0x438d, lo: 0xb8, hi: 0xb8}, + {value: 0x4399, lo: 0xb9, hi: 0xbb}, + {value: 0x43b1, lo: 0xbc, hi: 0xbc}, + {value: 0x43b7, lo: 0xbe, hi: 0xbe}, + // Block 0x62, offset 0x1ec + {value: 0x0006, lo: 0x08}, + {value: 0x43bd, lo: 0x80, hi: 0x81}, + {value: 0x43c9, lo: 0x83, hi: 0x84}, + {value: 0x43db, lo: 0x86, hi: 0x89}, + {value: 0x43ff, lo: 0x8a, hi: 0x8a}, + {value: 0x437b, lo: 0x8b, hi: 0x8b}, + {value: 0x4363, lo: 0x8c, hi: 0x8c}, + {value: 0x43ab, lo: 0x8d, hi: 0x8d}, + {value: 0x43d5, lo: 0x8e, hi: 0x8e}, + // Block 0x63, offset 0x1f5 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0xa4, hi: 0xa5}, + {value: 0x8100, lo: 0xb0, hi: 0xb1}, + // Block 0x64, offset 0x1f8 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x9b, hi: 0x9d}, + {value: 0x8200, lo: 0x9e, hi: 0xa3}, + // Block 0x65, offset 0x1fb + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + // Block 0x66, offset 0x1fd + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x99, hi: 0x99}, + {value: 0x8200, lo: 0xb2, hi: 0xb4}, + // Block 0x67, offset 0x200 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xbc, hi: 0xbd}, + // Block 0x68, offset 0x202 + {value: 0x0000, lo: 0x03}, + {value: 0x8132, lo: 0xa0, hi: 0xa6}, + {value: 0x812d, lo: 0xa7, hi: 0xad}, + {value: 0x8132, lo: 0xae, hi: 0xaf}, + // Block 0x69, offset 0x206 + {value: 0x0000, lo: 0x04}, + {value: 0x8100, lo: 0x89, hi: 0x8c}, + {value: 0x8100, lo: 0xb0, hi: 0xb2}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb6, hi: 0xbf}, + // Block 0x6a, offset 0x20b + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x81, hi: 0x8c}, + // Block 0x6b, offset 0x20d + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xb5, hi: 0xba}, + // Block 0x6c, offset 0x20f + {value: 0x0000, lo: 0x04}, + {value: 0x4aa2, lo: 0x9e, hi: 0x9f}, + {value: 0x4aa2, lo: 0xa3, hi: 0xa3}, + {value: 0x4aa2, lo: 0xa5, hi: 0xa6}, + {value: 0x4aa2, lo: 0xaa, hi: 0xaf}, + // Block 0x6d, offset 0x214 + {value: 0x0000, lo: 0x05}, + {value: 0x4aa2, lo: 0x82, hi: 0x87}, + {value: 0x4aa2, lo: 0x8a, hi: 0x8f}, + {value: 0x4aa2, lo: 0x92, hi: 0x97}, + {value: 0x4aa2, lo: 0x9a, hi: 0x9c}, + {value: 0x8100, lo: 0xa3, hi: 0xa3}, + // Block 0x6e, offset 0x21a + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x6f, offset 0x21c + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xa0, hi: 0xa0}, + // Block 0x70, offset 0x21e + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb6, hi: 0xba}, + // Block 0x71, offset 0x220 + {value: 0x002c, lo: 0x05}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x8f, hi: 0x8f}, + {value: 0x8132, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x72, offset 0x226 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xa5, hi: 0xa5}, + {value: 0x812d, lo: 0xa6, hi: 0xa6}, + // Block 0x73, offset 0x229 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa4, hi: 0xa7}, + // Block 0x74, offset 0x22b + {value: 0x0000, lo: 0x05}, + {value: 0x812d, lo: 0x86, hi: 0x87}, + {value: 0x8132, lo: 0x88, hi: 0x8a}, + {value: 0x812d, lo: 0x8b, hi: 0x8b}, + {value: 0x8132, lo: 0x8c, hi: 0x8c}, + {value: 0x812d, lo: 0x8d, hi: 0x90}, + // Block 0x75, offset 0x231 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x76, offset 0x234 + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x423b, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4245, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x424f, lo: 0xab, hi: 0xab}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x77, offset 0x23c + {value: 0x0000, lo: 0x06}, + {value: 0x8132, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2d81, lo: 0xae, hi: 0xae}, + {value: 0x2d8b, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8104, lo: 0xb3, hi: 0xb4}, + // Block 0x78, offset 0x243 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + {value: 0x8102, lo: 0x8a, hi: 0x8a}, + // Block 0x79, offset 0x246 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb5, hi: 0xb5}, + {value: 0x8102, lo: 0xb6, hi: 0xb6}, + // Block 0x7a, offset 0x249 + {value: 0x0002, lo: 0x01}, + {value: 0x8102, lo: 0xa9, hi: 0xaa}, + // Block 0x7b, offset 0x24b + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x7c, offset 0x24e + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2d95, lo: 0x8b, hi: 0x8b}, + {value: 0x2d9f, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8132, lo: 0xa6, hi: 0xac}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + // Block 0x7d, offset 0x256 + {value: 0x0000, lo: 0x03}, + {value: 0x8104, lo: 0x82, hi: 0x82}, + {value: 0x8102, lo: 0x86, hi: 0x86}, + {value: 0x8132, lo: 0x9e, hi: 0x9e}, + // Block 0x7e, offset 0x25a + {value: 0x6b57, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2db3, lo: 0xbb, hi: 0xbb}, + {value: 0x2da9, lo: 0xbc, hi: 0xbd}, + {value: 0x2dbd, lo: 0xbe, hi: 0xbe}, + // Block 0x7f, offset 0x261 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x82, hi: 0x82}, + {value: 0x8102, lo: 0x83, hi: 0x83}, + // Block 0x80, offset 0x264 + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2dc7, lo: 0xba, hi: 0xba}, + {value: 0x2dd1, lo: 0xbb, hi: 0xbb}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x81, offset 0x26a + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0x80, hi: 0x80}, + // Block 0x82, offset 0x26c + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x83, offset 0x26f + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xab, hi: 0xab}, + // Block 0x84, offset 0x271 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb9, hi: 0xb9}, + {value: 0x8102, lo: 0xba, hi: 0xba}, + // Block 0x85, offset 0x274 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xa0, hi: 0xa0}, + // Block 0x86, offset 0x276 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xb4, hi: 0xb4}, + // Block 0x87, offset 0x278 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x87, hi: 0x87}, + // Block 0x88, offset 0x27a + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x99, hi: 0x99}, + // Block 0x89, offset 0x27c + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0x82, hi: 0x82}, + {value: 0x8104, lo: 0x84, hi: 0x85}, + // Block 0x8a, offset 0x27f + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x97, hi: 0x97}, + // Block 0x8b, offset 0x281 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x8c, offset 0x283 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb6}, + // Block 0x8d, offset 0x285 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x8e, offset 0x287 + {value: 0x0000, lo: 0x0c}, + {value: 0x45cf, lo: 0x9e, hi: 0x9e}, + {value: 0x45d9, lo: 0x9f, hi: 0x9f}, + {value: 0x460d, lo: 0xa0, hi: 0xa0}, + {value: 0x461b, lo: 0xa1, hi: 0xa1}, + {value: 0x4629, lo: 0xa2, hi: 0xa2}, + {value: 0x4637, lo: 0xa3, hi: 0xa3}, + {value: 0x4645, lo: 0xa4, hi: 0xa4}, + {value: 0x812b, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8130, lo: 0xad, hi: 0xad}, + {value: 0x812b, lo: 0xae, hi: 0xb2}, + {value: 0x812d, lo: 0xbb, hi: 0xbf}, + // Block 0x8f, offset 0x294 + {value: 0x0000, lo: 0x09}, + {value: 0x812d, lo: 0x80, hi: 0x82}, + {value: 0x8132, lo: 0x85, hi: 0x89}, + {value: 0x812d, lo: 0x8a, hi: 0x8b}, + {value: 0x8132, lo: 0xaa, hi: 0xad}, + {value: 0x45e3, lo: 0xbb, hi: 0xbb}, + {value: 0x45ed, lo: 0xbc, hi: 0xbc}, + {value: 0x4653, lo: 0xbd, hi: 0xbd}, + {value: 0x466f, lo: 0xbe, hi: 0xbe}, + {value: 0x4661, lo: 0xbf, hi: 0xbf}, + // Block 0x90, offset 0x29e + {value: 0x0000, lo: 0x01}, + {value: 0x467d, lo: 0x80, hi: 0x80}, + // Block 0x91, offset 0x2a0 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x82, hi: 0x84}, + // Block 0x92, offset 0x2a2 + {value: 0x0000, lo: 0x05}, + {value: 0x8132, lo: 0x80, hi: 0x86}, + {value: 0x8132, lo: 0x88, hi: 0x98}, + {value: 0x8132, lo: 0x9b, hi: 0xa1}, + {value: 0x8132, lo: 0xa3, hi: 0xa4}, + {value: 0x8132, lo: 0xa6, hi: 0xaa}, + // Block 0x93, offset 0x2a8 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xac, hi: 0xaf}, + // Block 0x94, offset 0x2aa + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x90, hi: 0x96}, + // Block 0x95, offset 0x2ac + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x84, hi: 0x89}, + {value: 0x8102, lo: 0x8a, hi: 0x8a}, + // Block 0x96, offset 0x2af + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x93, hi: 0x93}, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfkcTrie. Total size: 18684 bytes (18.25 KiB). Checksum: 113e23c477adfabd. +type nfkcTrie struct{} + +func newNfkcTrie(i int) *nfkcTrie { + return &nfkcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 92: + return uint16(nfkcValues[n<<6+uint32(b)]) + default: + n -= 92 + return uint16(nfkcSparse.lookup(n, b)) + } +} + +// nfkcValues: 94 blocks, 6016 entries, 12032 bytes +// The third block is the zero block. +var nfkcValues = [6016]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x2f72, 0xc1: 0x2f77, 0xc2: 0x468b, 0xc3: 0x2f7c, 0xc4: 0x469a, 0xc5: 0x469f, + 0xc6: 0xa000, 0xc7: 0x46a9, 0xc8: 0x2fe5, 0xc9: 0x2fea, 0xca: 0x46ae, 0xcb: 0x2ffe, + 0xcc: 0x3071, 0xcd: 0x3076, 0xce: 0x307b, 0xcf: 0x46c2, 0xd1: 0x3107, + 0xd2: 0x312a, 0xd3: 0x312f, 0xd4: 0x46cc, 0xd5: 0x46d1, 0xd6: 0x46e0, + 0xd8: 0xa000, 0xd9: 0x31b6, 0xda: 0x31bb, 0xdb: 0x31c0, 0xdc: 0x4712, 0xdd: 0x3238, + 0xe0: 0x327e, 0xe1: 0x3283, 0xe2: 0x471c, 0xe3: 0x3288, + 0xe4: 0x472b, 0xe5: 0x4730, 0xe6: 0xa000, 0xe7: 0x473a, 0xe8: 0x32f1, 0xe9: 0x32f6, + 0xea: 0x473f, 0xeb: 0x330a, 0xec: 0x3382, 0xed: 0x3387, 0xee: 0x338c, 0xef: 0x4753, + 0xf1: 0x3418, 0xf2: 0x343b, 0xf3: 0x3440, 0xf4: 0x475d, 0xf5: 0x4762, + 0xf6: 0x4771, 0xf8: 0xa000, 0xf9: 0x34cc, 0xfa: 0x34d1, 0xfb: 0x34d6, + 0xfc: 0x47a3, 0xfd: 0x3553, 0xff: 0x356c, + // Block 0x4, offset 0x100 + 0x100: 0x2f81, 0x101: 0x328d, 0x102: 0x4690, 0x103: 0x4721, 0x104: 0x2f9f, 0x105: 0x32ab, + 0x106: 0x2fb3, 0x107: 0x32bf, 0x108: 0x2fb8, 0x109: 0x32c4, 0x10a: 0x2fbd, 0x10b: 0x32c9, + 0x10c: 0x2fc2, 0x10d: 0x32ce, 0x10e: 0x2fcc, 0x10f: 0x32d8, + 0x112: 0x46b3, 0x113: 0x4744, 0x114: 0x2ff4, 0x115: 0x3300, 0x116: 0x2ff9, 0x117: 0x3305, + 0x118: 0x3017, 0x119: 0x3323, 0x11a: 0x3008, 0x11b: 0x3314, 0x11c: 0x3030, 0x11d: 0x333c, + 0x11e: 0x303a, 0x11f: 0x3346, 0x120: 0x303f, 0x121: 0x334b, 0x122: 0x3049, 0x123: 0x3355, + 0x124: 0x304e, 0x125: 0x335a, 0x128: 0x3080, 0x129: 0x3391, + 0x12a: 0x3085, 0x12b: 0x3396, 0x12c: 0x308a, 0x12d: 0x339b, 0x12e: 0x30ad, 0x12f: 0x33b9, + 0x130: 0x308f, 0x132: 0x195d, 0x133: 0x19ea, 0x134: 0x30b7, 0x135: 0x33c3, + 0x136: 0x30cb, 0x137: 0x33dc, 0x139: 0x30d5, 0x13a: 0x33e6, 0x13b: 0x30df, + 0x13c: 0x33f0, 0x13d: 0x30da, 0x13e: 0x33eb, 0x13f: 0x1baf, + // Block 0x5, offset 0x140 + 0x140: 0x1c37, 0x143: 0x3102, 0x144: 0x3413, 0x145: 0x311b, + 0x146: 0x342c, 0x147: 0x3111, 0x148: 0x3422, 0x149: 0x1c5f, + 0x14c: 0x46d6, 0x14d: 0x4767, 0x14e: 0x3134, 0x14f: 0x3445, 0x150: 0x313e, 0x151: 0x344f, + 0x154: 0x315c, 0x155: 0x346d, 0x156: 0x3175, 0x157: 0x3486, + 0x158: 0x3166, 0x159: 0x3477, 0x15a: 0x46f9, 0x15b: 0x478a, 0x15c: 0x317f, 0x15d: 0x3490, + 0x15e: 0x318e, 0x15f: 0x349f, 0x160: 0x46fe, 0x161: 0x478f, 0x162: 0x31a7, 0x163: 0x34bd, + 0x164: 0x3198, 0x165: 0x34ae, 0x168: 0x4708, 0x169: 0x4799, + 0x16a: 0x470d, 0x16b: 0x479e, 0x16c: 0x31c5, 0x16d: 0x34db, 0x16e: 0x31cf, 0x16f: 0x34e5, + 0x170: 0x31d4, 0x171: 0x34ea, 0x172: 0x31f2, 0x173: 0x3508, 0x174: 0x3215, 0x175: 0x352b, + 0x176: 0x323d, 0x177: 0x3558, 0x178: 0x3251, 0x179: 0x3260, 0x17a: 0x3580, 0x17b: 0x326a, + 0x17c: 0x358a, 0x17d: 0x326f, 0x17e: 0x358f, 0x17f: 0x00a7, + // Block 0x6, offset 0x180 + 0x184: 0x2df1, 0x185: 0x2df7, + 0x186: 0x2dfd, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a0b, 0x18a: 0x198a, 0x18b: 0x198d, + 0x18c: 0x1a41, 0x18d: 0x2f8b, 0x18e: 0x3297, 0x18f: 0x3099, 0x190: 0x33a5, 0x191: 0x3143, + 0x192: 0x3454, 0x193: 0x31d9, 0x194: 0x34ef, 0x195: 0x39d2, 0x196: 0x3b61, 0x197: 0x39cb, + 0x198: 0x3b5a, 0x199: 0x39d9, 0x19a: 0x3b68, 0x19b: 0x39c4, 0x19c: 0x3b53, + 0x19e: 0x38b3, 0x19f: 0x3a42, 0x1a0: 0x38ac, 0x1a1: 0x3a3b, 0x1a2: 0x35b6, 0x1a3: 0x35c8, + 0x1a6: 0x3044, 0x1a7: 0x3350, 0x1a8: 0x30c1, 0x1a9: 0x33d2, + 0x1aa: 0x46ef, 0x1ab: 0x4780, 0x1ac: 0x3993, 0x1ad: 0x3b22, 0x1ae: 0x35da, 0x1af: 0x35e0, + 0x1b0: 0x33c8, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19d2, 0x1b4: 0x302b, 0x1b5: 0x3337, + 0x1b8: 0x30fd, 0x1b9: 0x340e, 0x1ba: 0x38ba, 0x1bb: 0x3a49, + 0x1bc: 0x35b0, 0x1bd: 0x35c2, 0x1be: 0x35bc, 0x1bf: 0x35ce, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x2f90, 0x1c1: 0x329c, 0x1c2: 0x2f95, 0x1c3: 0x32a1, 0x1c4: 0x300d, 0x1c5: 0x3319, + 0x1c6: 0x3012, 0x1c7: 0x331e, 0x1c8: 0x309e, 0x1c9: 0x33aa, 0x1ca: 0x30a3, 0x1cb: 0x33af, + 0x1cc: 0x3148, 0x1cd: 0x3459, 0x1ce: 0x314d, 0x1cf: 0x345e, 0x1d0: 0x316b, 0x1d1: 0x347c, + 0x1d2: 0x3170, 0x1d3: 0x3481, 0x1d4: 0x31de, 0x1d5: 0x34f4, 0x1d6: 0x31e3, 0x1d7: 0x34f9, + 0x1d8: 0x3189, 0x1d9: 0x349a, 0x1da: 0x31a2, 0x1db: 0x34b8, + 0x1de: 0x305d, 0x1df: 0x3369, + 0x1e6: 0x4695, 0x1e7: 0x4726, 0x1e8: 0x46bd, 0x1e9: 0x474e, + 0x1ea: 0x3962, 0x1eb: 0x3af1, 0x1ec: 0x393f, 0x1ed: 0x3ace, 0x1ee: 0x46db, 0x1ef: 0x476c, + 0x1f0: 0x395b, 0x1f1: 0x3aea, 0x1f2: 0x3247, 0x1f3: 0x3562, + // Block 0x8, offset 0x200 + 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, + 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, + 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, + 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, + 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, + 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, + 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, + 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, + 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, + 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, + // Block 0x9, offset 0x240 + 0x240: 0x49b1, 0x241: 0x49b6, 0x242: 0x9932, 0x243: 0x49bb, 0x244: 0x4a74, 0x245: 0x9936, + 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, + 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, + 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, + 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, + 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, + 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, + 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, + 0x274: 0x0170, + 0x27a: 0x42a8, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x425d, 0x285: 0x447e, + 0x286: 0x35ec, 0x287: 0x00ce, 0x288: 0x360a, 0x289: 0x3616, 0x28a: 0x3628, + 0x28c: 0x3646, 0x28e: 0x3658, 0x28f: 0x3676, 0x290: 0x3e0b, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x363a, 0x2ab: 0x366a, 0x2ac: 0x4801, 0x2ad: 0x369a, 0x2ae: 0x482b, 0x2af: 0x36ac, + 0x2b0: 0x3e73, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c1: 0xa000, 0x2c5: 0xa000, + 0x2c9: 0xa000, 0x2ca: 0x4843, 0x2cb: 0x4861, + 0x2cc: 0x36ca, 0x2cd: 0x36e2, 0x2ce: 0x4879, 0x2d0: 0x01be, 0x2d1: 0x01d0, + 0x2d2: 0x01ac, 0x2d3: 0x430f, 0x2d4: 0x4315, 0x2d5: 0x01fa, 0x2d6: 0x01e8, + 0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7, + 0x2f9: 0x01a6, + // Block 0xc, offset 0x300 + 0x300: 0x3724, 0x301: 0x3730, 0x303: 0x371e, + 0x306: 0xa000, 0x307: 0x370c, + 0x30c: 0x3760, 0x30d: 0x3748, 0x30e: 0x3772, 0x310: 0xa000, + 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000, + 0x318: 0xa000, 0x319: 0x3754, 0x31a: 0xa000, + 0x31e: 0xa000, 0x323: 0xa000, + 0x327: 0xa000, + 0x32b: 0xa000, 0x32d: 0xa000, + 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000, + 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d8, 0x33a: 0xa000, + 0x33e: 0xa000, + // Block 0xd, offset 0x340 + 0x341: 0x3736, 0x342: 0x37ba, + 0x350: 0x3712, 0x351: 0x3796, + 0x352: 0x3718, 0x353: 0x379c, 0x356: 0x372a, 0x357: 0x37ae, + 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x382c, 0x35b: 0x3832, 0x35c: 0x373c, 0x35d: 0x37c0, + 0x35e: 0x3742, 0x35f: 0x37c6, 0x362: 0x374e, 0x363: 0x37d2, + 0x364: 0x375a, 0x365: 0x37de, 0x366: 0x3766, 0x367: 0x37ea, 0x368: 0xa000, 0x369: 0xa000, + 0x36a: 0x3838, 0x36b: 0x383e, 0x36c: 0x3790, 0x36d: 0x3814, 0x36e: 0x376c, 0x36f: 0x37f0, + 0x370: 0x3778, 0x371: 0x37fc, 0x372: 0x377e, 0x373: 0x3802, 0x374: 0x3784, 0x375: 0x3808, + 0x378: 0x378a, 0x379: 0x380e, + // Block 0xe, offset 0x380 + 0x387: 0x1d64, + 0x391: 0x812d, + 0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132, + 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132, + 0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d, + 0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132, + 0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132, + 0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a, + 0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f, + 0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112, + // Block 0xf, offset 0x3c0 + 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116, + 0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c, + 0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132, + 0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132, + 0x3de: 0x8132, 0x3df: 0x812d, + 0x3f0: 0x811e, 0x3f5: 0x1d87, + 0x3f6: 0x2016, 0x3f7: 0x2052, 0x3f8: 0x204d, + // Block 0x10, offset 0x400 + 0x413: 0x812d, 0x414: 0x8132, 0x415: 0x8132, 0x416: 0x8132, 0x417: 0x8132, + 0x418: 0x8132, 0x419: 0x8132, 0x41a: 0x8132, 0x41b: 0x8132, 0x41c: 0x8132, 0x41d: 0x8132, + 0x41e: 0x8132, 0x41f: 0x8132, 0x420: 0x8132, 0x421: 0x8132, 0x423: 0x812d, + 0x424: 0x8132, 0x425: 0x8132, 0x426: 0x812d, 0x427: 0x8132, 0x428: 0x8132, 0x429: 0x812d, + 0x42a: 0x8132, 0x42b: 0x8132, 0x42c: 0x8132, 0x42d: 0x812d, 0x42e: 0x812d, 0x42f: 0x812d, + 0x430: 0x8116, 0x431: 0x8117, 0x432: 0x8118, 0x433: 0x8132, 0x434: 0x8132, 0x435: 0x8132, + 0x436: 0x812d, 0x437: 0x8132, 0x438: 0x8132, 0x439: 0x812d, 0x43a: 0x812d, 0x43b: 0x8132, + 0x43c: 0x8132, 0x43d: 0x8132, 0x43e: 0x8132, 0x43f: 0x8132, + // Block 0x11, offset 0x440 + 0x445: 0xa000, + 0x446: 0x2d29, 0x447: 0xa000, 0x448: 0x2d31, 0x449: 0xa000, 0x44a: 0x2d39, 0x44b: 0xa000, + 0x44c: 0x2d41, 0x44d: 0xa000, 0x44e: 0x2d49, 0x451: 0xa000, + 0x452: 0x2d51, + 0x474: 0x8102, 0x475: 0x9900, + 0x47a: 0xa000, 0x47b: 0x2d59, + 0x47c: 0xa000, 0x47d: 0x2d61, 0x47e: 0xa000, 0x47f: 0xa000, + // Block 0x12, offset 0x480 + 0x480: 0x0069, 0x481: 0x006b, 0x482: 0x006f, 0x483: 0x0083, 0x484: 0x00f5, 0x485: 0x00f8, + 0x486: 0x0413, 0x487: 0x0085, 0x488: 0x0089, 0x489: 0x008b, 0x48a: 0x0104, 0x48b: 0x0107, + 0x48c: 0x010a, 0x48d: 0x008f, 0x48f: 0x0097, 0x490: 0x009b, 0x491: 0x00e0, + 0x492: 0x009f, 0x493: 0x00fe, 0x494: 0x0417, 0x495: 0x041b, 0x496: 0x00a1, 0x497: 0x00a9, + 0x498: 0x00ab, 0x499: 0x0423, 0x49a: 0x012b, 0x49b: 0x00ad, 0x49c: 0x0427, 0x49d: 0x01be, + 0x49e: 0x01c1, 0x49f: 0x01c4, 0x4a0: 0x01fa, 0x4a1: 0x01fd, 0x4a2: 0x0093, 0x4a3: 0x00a5, + 0x4a4: 0x00ab, 0x4a5: 0x00ad, 0x4a6: 0x01be, 0x4a7: 0x01c1, 0x4a8: 0x01eb, 0x4a9: 0x01fa, + 0x4aa: 0x01fd, + 0x4b8: 0x020c, + // Block 0x13, offset 0x4c0 + 0x4db: 0x00fb, 0x4dc: 0x0087, 0x4dd: 0x0101, + 0x4de: 0x00d4, 0x4df: 0x010a, 0x4e0: 0x008d, 0x4e1: 0x010d, 0x4e2: 0x0110, 0x4e3: 0x0116, + 0x4e4: 0x011c, 0x4e5: 0x011f, 0x4e6: 0x0122, 0x4e7: 0x042b, 0x4e8: 0x016a, 0x4e9: 0x0128, + 0x4ea: 0x042f, 0x4eb: 0x016d, 0x4ec: 0x0131, 0x4ed: 0x012e, 0x4ee: 0x0134, 0x4ef: 0x0137, + 0x4f0: 0x013a, 0x4f1: 0x013d, 0x4f2: 0x0140, 0x4f3: 0x014c, 0x4f4: 0x014f, 0x4f5: 0x00ec, + 0x4f6: 0x0152, 0x4f7: 0x0155, 0x4f8: 0x041f, 0x4f9: 0x0158, 0x4fa: 0x015b, 0x4fb: 0x00b5, + 0x4fc: 0x015e, 0x4fd: 0x0161, 0x4fe: 0x0164, 0x4ff: 0x01d0, + // Block 0x14, offset 0x500 + 0x500: 0x8132, 0x501: 0x8132, 0x502: 0x812d, 0x503: 0x8132, 0x504: 0x8132, 0x505: 0x8132, + 0x506: 0x8132, 0x507: 0x8132, 0x508: 0x8132, 0x509: 0x8132, 0x50a: 0x812d, 0x50b: 0x8132, + 0x50c: 0x8132, 0x50d: 0x8135, 0x50e: 0x812a, 0x50f: 0x812d, 0x510: 0x8129, 0x511: 0x8132, + 0x512: 0x8132, 0x513: 0x8132, 0x514: 0x8132, 0x515: 0x8132, 0x516: 0x8132, 0x517: 0x8132, + 0x518: 0x8132, 0x519: 0x8132, 0x51a: 0x8132, 0x51b: 0x8132, 0x51c: 0x8132, 0x51d: 0x8132, + 0x51e: 0x8132, 0x51f: 0x8132, 0x520: 0x8132, 0x521: 0x8132, 0x522: 0x8132, 0x523: 0x8132, + 0x524: 0x8132, 0x525: 0x8132, 0x526: 0x8132, 0x527: 0x8132, 0x528: 0x8132, 0x529: 0x8132, + 0x52a: 0x8132, 0x52b: 0x8132, 0x52c: 0x8132, 0x52d: 0x8132, 0x52e: 0x8132, 0x52f: 0x8132, + 0x530: 0x8132, 0x531: 0x8132, 0x532: 0x8132, 0x533: 0x8132, 0x534: 0x8132, 0x535: 0x8132, + 0x536: 0x8133, 0x537: 0x8131, 0x538: 0x8131, 0x539: 0x812d, 0x53b: 0x8132, + 0x53c: 0x8134, 0x53d: 0x812d, 0x53e: 0x8132, 0x53f: 0x812d, + // Block 0x15, offset 0x540 + 0x540: 0x2f9a, 0x541: 0x32a6, 0x542: 0x2fa4, 0x543: 0x32b0, 0x544: 0x2fa9, 0x545: 0x32b5, + 0x546: 0x2fae, 0x547: 0x32ba, 0x548: 0x38cf, 0x549: 0x3a5e, 0x54a: 0x2fc7, 0x54b: 0x32d3, + 0x54c: 0x2fd1, 0x54d: 0x32dd, 0x54e: 0x2fe0, 0x54f: 0x32ec, 0x550: 0x2fd6, 0x551: 0x32e2, + 0x552: 0x2fdb, 0x553: 0x32e7, 0x554: 0x38f2, 0x555: 0x3a81, 0x556: 0x38f9, 0x557: 0x3a88, + 0x558: 0x301c, 0x559: 0x3328, 0x55a: 0x3021, 0x55b: 0x332d, 0x55c: 0x3907, 0x55d: 0x3a96, + 0x55e: 0x3026, 0x55f: 0x3332, 0x560: 0x3035, 0x561: 0x3341, 0x562: 0x3053, 0x563: 0x335f, + 0x564: 0x3062, 0x565: 0x336e, 0x566: 0x3058, 0x567: 0x3364, 0x568: 0x3067, 0x569: 0x3373, + 0x56a: 0x306c, 0x56b: 0x3378, 0x56c: 0x30b2, 0x56d: 0x33be, 0x56e: 0x390e, 0x56f: 0x3a9d, + 0x570: 0x30bc, 0x571: 0x33cd, 0x572: 0x30c6, 0x573: 0x33d7, 0x574: 0x30d0, 0x575: 0x33e1, + 0x576: 0x46c7, 0x577: 0x4758, 0x578: 0x3915, 0x579: 0x3aa4, 0x57a: 0x30e9, 0x57b: 0x33fa, + 0x57c: 0x30e4, 0x57d: 0x33f5, 0x57e: 0x30ee, 0x57f: 0x33ff, + // Block 0x16, offset 0x580 + 0x580: 0x30f3, 0x581: 0x3404, 0x582: 0x30f8, 0x583: 0x3409, 0x584: 0x310c, 0x585: 0x341d, + 0x586: 0x3116, 0x587: 0x3427, 0x588: 0x3125, 0x589: 0x3436, 0x58a: 0x3120, 0x58b: 0x3431, + 0x58c: 0x3938, 0x58d: 0x3ac7, 0x58e: 0x3946, 0x58f: 0x3ad5, 0x590: 0x394d, 0x591: 0x3adc, + 0x592: 0x3954, 0x593: 0x3ae3, 0x594: 0x3152, 0x595: 0x3463, 0x596: 0x3157, 0x597: 0x3468, + 0x598: 0x3161, 0x599: 0x3472, 0x59a: 0x46f4, 0x59b: 0x4785, 0x59c: 0x399a, 0x59d: 0x3b29, + 0x59e: 0x317a, 0x59f: 0x348b, 0x5a0: 0x3184, 0x5a1: 0x3495, 0x5a2: 0x4703, 0x5a3: 0x4794, + 0x5a4: 0x39a1, 0x5a5: 0x3b30, 0x5a6: 0x39a8, 0x5a7: 0x3b37, 0x5a8: 0x39af, 0x5a9: 0x3b3e, + 0x5aa: 0x3193, 0x5ab: 0x34a4, 0x5ac: 0x319d, 0x5ad: 0x34b3, 0x5ae: 0x31b1, 0x5af: 0x34c7, + 0x5b0: 0x31ac, 0x5b1: 0x34c2, 0x5b2: 0x31ed, 0x5b3: 0x3503, 0x5b4: 0x31fc, 0x5b5: 0x3512, + 0x5b6: 0x31f7, 0x5b7: 0x350d, 0x5b8: 0x39b6, 0x5b9: 0x3b45, 0x5ba: 0x39bd, 0x5bb: 0x3b4c, + 0x5bc: 0x3201, 0x5bd: 0x3517, 0x5be: 0x3206, 0x5bf: 0x351c, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x320b, 0x5c1: 0x3521, 0x5c2: 0x3210, 0x5c3: 0x3526, 0x5c4: 0x321f, 0x5c5: 0x3535, + 0x5c6: 0x321a, 0x5c7: 0x3530, 0x5c8: 0x3224, 0x5c9: 0x353f, 0x5ca: 0x3229, 0x5cb: 0x3544, + 0x5cc: 0x322e, 0x5cd: 0x3549, 0x5ce: 0x324c, 0x5cf: 0x3567, 0x5d0: 0x3265, 0x5d1: 0x3585, + 0x5d2: 0x3274, 0x5d3: 0x3594, 0x5d4: 0x3279, 0x5d5: 0x3599, 0x5d6: 0x337d, 0x5d7: 0x34a9, + 0x5d8: 0x353a, 0x5d9: 0x3576, 0x5da: 0x1be3, 0x5db: 0x42da, + 0x5e0: 0x46a4, 0x5e1: 0x4735, 0x5e2: 0x2f86, 0x5e3: 0x3292, + 0x5e4: 0x387b, 0x5e5: 0x3a0a, 0x5e6: 0x3874, 0x5e7: 0x3a03, 0x5e8: 0x3889, 0x5e9: 0x3a18, + 0x5ea: 0x3882, 0x5eb: 0x3a11, 0x5ec: 0x38c1, 0x5ed: 0x3a50, 0x5ee: 0x3897, 0x5ef: 0x3a26, + 0x5f0: 0x3890, 0x5f1: 0x3a1f, 0x5f2: 0x38a5, 0x5f3: 0x3a34, 0x5f4: 0x389e, 0x5f5: 0x3a2d, + 0x5f6: 0x38c8, 0x5f7: 0x3a57, 0x5f8: 0x46b8, 0x5f9: 0x4749, 0x5fa: 0x3003, 0x5fb: 0x330f, + 0x5fc: 0x2fef, 0x5fd: 0x32fb, 0x5fe: 0x38dd, 0x5ff: 0x3a6c, + // Block 0x18, offset 0x600 + 0x600: 0x38d6, 0x601: 0x3a65, 0x602: 0x38eb, 0x603: 0x3a7a, 0x604: 0x38e4, 0x605: 0x3a73, + 0x606: 0x3900, 0x607: 0x3a8f, 0x608: 0x3094, 0x609: 0x33a0, 0x60a: 0x30a8, 0x60b: 0x33b4, + 0x60c: 0x46ea, 0x60d: 0x477b, 0x60e: 0x3139, 0x60f: 0x344a, 0x610: 0x3923, 0x611: 0x3ab2, + 0x612: 0x391c, 0x613: 0x3aab, 0x614: 0x3931, 0x615: 0x3ac0, 0x616: 0x392a, 0x617: 0x3ab9, + 0x618: 0x398c, 0x619: 0x3b1b, 0x61a: 0x3970, 0x61b: 0x3aff, 0x61c: 0x3969, 0x61d: 0x3af8, + 0x61e: 0x397e, 0x61f: 0x3b0d, 0x620: 0x3977, 0x621: 0x3b06, 0x622: 0x3985, 0x623: 0x3b14, + 0x624: 0x31e8, 0x625: 0x34fe, 0x626: 0x31ca, 0x627: 0x34e0, 0x628: 0x39e7, 0x629: 0x3b76, + 0x62a: 0x39e0, 0x62b: 0x3b6f, 0x62c: 0x39f5, 0x62d: 0x3b84, 0x62e: 0x39ee, 0x62f: 0x3b7d, + 0x630: 0x39fc, 0x631: 0x3b8b, 0x632: 0x3233, 0x633: 0x354e, 0x634: 0x325b, 0x635: 0x357b, + 0x636: 0x3256, 0x637: 0x3571, 0x638: 0x3242, 0x639: 0x355d, + // Block 0x19, offset 0x640 + 0x640: 0x4807, 0x641: 0x480d, 0x642: 0x4921, 0x643: 0x4939, 0x644: 0x4929, 0x645: 0x4941, + 0x646: 0x4931, 0x647: 0x4949, 0x648: 0x47ad, 0x649: 0x47b3, 0x64a: 0x4891, 0x64b: 0x48a9, + 0x64c: 0x4899, 0x64d: 0x48b1, 0x64e: 0x48a1, 0x64f: 0x48b9, 0x650: 0x4819, 0x651: 0x481f, + 0x652: 0x3dbb, 0x653: 0x3dcb, 0x654: 0x3dc3, 0x655: 0x3dd3, + 0x658: 0x47b9, 0x659: 0x47bf, 0x65a: 0x3ceb, 0x65b: 0x3cfb, 0x65c: 0x3cf3, 0x65d: 0x3d03, + 0x660: 0x4831, 0x661: 0x4837, 0x662: 0x4951, 0x663: 0x4969, + 0x664: 0x4959, 0x665: 0x4971, 0x666: 0x4961, 0x667: 0x4979, 0x668: 0x47c5, 0x669: 0x47cb, + 0x66a: 0x48c1, 0x66b: 0x48d9, 0x66c: 0x48c9, 0x66d: 0x48e1, 0x66e: 0x48d1, 0x66f: 0x48e9, + 0x670: 0x4849, 0x671: 0x484f, 0x672: 0x3e1b, 0x673: 0x3e33, 0x674: 0x3e23, 0x675: 0x3e3b, + 0x676: 0x3e2b, 0x677: 0x3e43, 0x678: 0x47d1, 0x679: 0x47d7, 0x67a: 0x3d1b, 0x67b: 0x3d33, + 0x67c: 0x3d23, 0x67d: 0x3d3b, 0x67e: 0x3d2b, 0x67f: 0x3d43, + // Block 0x1a, offset 0x680 + 0x680: 0x4855, 0x681: 0x485b, 0x682: 0x3e4b, 0x683: 0x3e5b, 0x684: 0x3e53, 0x685: 0x3e63, + 0x688: 0x47dd, 0x689: 0x47e3, 0x68a: 0x3d4b, 0x68b: 0x3d5b, + 0x68c: 0x3d53, 0x68d: 0x3d63, 0x690: 0x4867, 0x691: 0x486d, + 0x692: 0x3e83, 0x693: 0x3e9b, 0x694: 0x3e8b, 0x695: 0x3ea3, 0x696: 0x3e93, 0x697: 0x3eab, + 0x699: 0x47e9, 0x69b: 0x3d6b, 0x69d: 0x3d73, + 0x69f: 0x3d7b, 0x6a0: 0x487f, 0x6a1: 0x4885, 0x6a2: 0x4981, 0x6a3: 0x4999, + 0x6a4: 0x4989, 0x6a5: 0x49a1, 0x6a6: 0x4991, 0x6a7: 0x49a9, 0x6a8: 0x47ef, 0x6a9: 0x47f5, + 0x6aa: 0x48f1, 0x6ab: 0x4909, 0x6ac: 0x48f9, 0x6ad: 0x4911, 0x6ae: 0x4901, 0x6af: 0x4919, + 0x6b0: 0x47fb, 0x6b1: 0x4321, 0x6b2: 0x3694, 0x6b3: 0x4327, 0x6b4: 0x4825, 0x6b5: 0x432d, + 0x6b6: 0x36a6, 0x6b7: 0x4333, 0x6b8: 0x36c4, 0x6b9: 0x4339, 0x6ba: 0x36dc, 0x6bb: 0x433f, + 0x6bc: 0x4873, 0x6bd: 0x4345, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3da3, 0x6c1: 0x3dab, 0x6c2: 0x4187, 0x6c3: 0x41a5, 0x6c4: 0x4191, 0x6c5: 0x41af, + 0x6c6: 0x419b, 0x6c7: 0x41b9, 0x6c8: 0x3cdb, 0x6c9: 0x3ce3, 0x6ca: 0x40d3, 0x6cb: 0x40f1, + 0x6cc: 0x40dd, 0x6cd: 0x40fb, 0x6ce: 0x40e7, 0x6cf: 0x4105, 0x6d0: 0x3deb, 0x6d1: 0x3df3, + 0x6d2: 0x41c3, 0x6d3: 0x41e1, 0x6d4: 0x41cd, 0x6d5: 0x41eb, 0x6d6: 0x41d7, 0x6d7: 0x41f5, + 0x6d8: 0x3d0b, 0x6d9: 0x3d13, 0x6da: 0x410f, 0x6db: 0x412d, 0x6dc: 0x4119, 0x6dd: 0x4137, + 0x6de: 0x4123, 0x6df: 0x4141, 0x6e0: 0x3ec3, 0x6e1: 0x3ecb, 0x6e2: 0x41ff, 0x6e3: 0x421d, + 0x6e4: 0x4209, 0x6e5: 0x4227, 0x6e6: 0x4213, 0x6e7: 0x4231, 0x6e8: 0x3d83, 0x6e9: 0x3d8b, + 0x6ea: 0x414b, 0x6eb: 0x4169, 0x6ec: 0x4155, 0x6ed: 0x4173, 0x6ee: 0x415f, 0x6ef: 0x417d, + 0x6f0: 0x3688, 0x6f1: 0x3682, 0x6f2: 0x3d93, 0x6f3: 0x368e, 0x6f4: 0x3d9b, + 0x6f6: 0x4813, 0x6f7: 0x3db3, 0x6f8: 0x35f8, 0x6f9: 0x35f2, 0x6fa: 0x35e6, 0x6fb: 0x42f1, + 0x6fc: 0x35fe, 0x6fd: 0x428a, 0x6fe: 0x01d3, 0x6ff: 0x428a, + // Block 0x1c, offset 0x700 + 0x700: 0x42a3, 0x701: 0x4485, 0x702: 0x3ddb, 0x703: 0x36a0, 0x704: 0x3de3, + 0x706: 0x483d, 0x707: 0x3dfb, 0x708: 0x3604, 0x709: 0x42f7, 0x70a: 0x3610, 0x70b: 0x42fd, + 0x70c: 0x361c, 0x70d: 0x448c, 0x70e: 0x4493, 0x70f: 0x449a, 0x710: 0x36b8, 0x711: 0x36b2, + 0x712: 0x3e03, 0x713: 0x44e7, 0x716: 0x36be, 0x717: 0x3e13, + 0x718: 0x3634, 0x719: 0x362e, 0x71a: 0x3622, 0x71b: 0x4303, 0x71d: 0x44a1, + 0x71e: 0x44a8, 0x71f: 0x44af, 0x720: 0x36ee, 0x721: 0x36e8, 0x722: 0x3e6b, 0x723: 0x44ef, + 0x724: 0x36d0, 0x725: 0x36d6, 0x726: 0x36f4, 0x727: 0x3e7b, 0x728: 0x3664, 0x729: 0x365e, + 0x72a: 0x3652, 0x72b: 0x430f, 0x72c: 0x364c, 0x72d: 0x4477, 0x72e: 0x447e, 0x72f: 0x0081, + 0x732: 0x3eb3, 0x733: 0x36fa, 0x734: 0x3ebb, + 0x736: 0x488b, 0x737: 0x3ed3, 0x738: 0x3640, 0x739: 0x4309, 0x73a: 0x3670, 0x73b: 0x431b, + 0x73c: 0x367c, 0x73d: 0x425d, 0x73e: 0x428f, + // Block 0x1d, offset 0x740 + 0x740: 0x1bdb, 0x741: 0x1bdf, 0x742: 0x0047, 0x743: 0x1c57, 0x745: 0x1beb, + 0x746: 0x1bef, 0x747: 0x00e9, 0x749: 0x1c5b, 0x74a: 0x008f, 0x74b: 0x0051, + 0x74c: 0x0051, 0x74d: 0x0051, 0x74e: 0x0091, 0x74f: 0x00da, 0x750: 0x0053, 0x751: 0x0053, + 0x752: 0x0059, 0x753: 0x0099, 0x755: 0x005d, 0x756: 0x1990, + 0x759: 0x0061, 0x75a: 0x0063, 0x75b: 0x0065, 0x75c: 0x0065, 0x75d: 0x0065, + 0x760: 0x19a2, 0x761: 0x1bcb, 0x762: 0x19ab, + 0x764: 0x0075, 0x766: 0x01b8, 0x768: 0x0075, + 0x76a: 0x0057, 0x76b: 0x42d5, 0x76c: 0x0045, 0x76d: 0x0047, 0x76f: 0x008b, + 0x770: 0x004b, 0x771: 0x004d, 0x773: 0x005b, 0x774: 0x009f, 0x775: 0x0215, + 0x776: 0x0218, 0x777: 0x021b, 0x778: 0x021e, 0x779: 0x0093, 0x77b: 0x1b9b, + 0x77c: 0x01e8, 0x77d: 0x01c1, 0x77e: 0x0179, 0x77f: 0x01a0, + // Block 0x1e, offset 0x780 + 0x780: 0x0463, 0x785: 0x0049, + 0x786: 0x0089, 0x787: 0x008b, 0x788: 0x0093, 0x789: 0x0095, + 0x790: 0x2231, 0x791: 0x223d, + 0x792: 0x22f1, 0x793: 0x2219, 0x794: 0x229d, 0x795: 0x2225, 0x796: 0x22a3, 0x797: 0x22bb, + 0x798: 0x22c7, 0x799: 0x222b, 0x79a: 0x22cd, 0x79b: 0x2237, 0x79c: 0x22c1, 0x79d: 0x22d3, + 0x79e: 0x22d9, 0x79f: 0x1cbf, 0x7a0: 0x0053, 0x7a1: 0x195a, 0x7a2: 0x1ba7, 0x7a3: 0x1963, + 0x7a4: 0x006d, 0x7a5: 0x19ae, 0x7a6: 0x1bd3, 0x7a7: 0x1d4b, 0x7a8: 0x1966, 0x7a9: 0x0071, + 0x7aa: 0x19ba, 0x7ab: 0x1bd7, 0x7ac: 0x0059, 0x7ad: 0x0047, 0x7ae: 0x0049, 0x7af: 0x005b, + 0x7b0: 0x0093, 0x7b1: 0x19e7, 0x7b2: 0x1c1b, 0x7b3: 0x19f0, 0x7b4: 0x00ad, 0x7b5: 0x1a65, + 0x7b6: 0x1c4f, 0x7b7: 0x1d5f, 0x7b8: 0x19f3, 0x7b9: 0x00b1, 0x7ba: 0x1a68, 0x7bb: 0x1c53, + 0x7bc: 0x0099, 0x7bd: 0x0087, 0x7be: 0x0089, 0x7bf: 0x009b, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x3c09, 0x7c3: 0xa000, 0x7c4: 0x3c10, 0x7c5: 0xa000, + 0x7c7: 0x3c17, 0x7c8: 0xa000, 0x7c9: 0x3c1e, + 0x7cd: 0xa000, + 0x7e0: 0x2f68, 0x7e1: 0xa000, 0x7e2: 0x3c2c, + 0x7e4: 0xa000, 0x7e5: 0xa000, + 0x7ed: 0x3c25, 0x7ee: 0x2f63, 0x7ef: 0x2f6d, + 0x7f0: 0x3c33, 0x7f1: 0x3c3a, 0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0x3c41, 0x7f5: 0x3c48, + 0x7f6: 0xa000, 0x7f7: 0xa000, 0x7f8: 0x3c4f, 0x7f9: 0x3c56, 0x7fa: 0xa000, 0x7fb: 0xa000, + 0x7fc: 0xa000, 0x7fd: 0xa000, + // Block 0x20, offset 0x800 + 0x800: 0x3c5d, 0x801: 0x3c64, 0x802: 0xa000, 0x803: 0xa000, 0x804: 0x3c79, 0x805: 0x3c80, + 0x806: 0xa000, 0x807: 0xa000, 0x808: 0x3c87, 0x809: 0x3c8e, + 0x811: 0xa000, + 0x812: 0xa000, + 0x822: 0xa000, + 0x828: 0xa000, 0x829: 0xa000, + 0x82b: 0xa000, 0x82c: 0x3ca3, 0x82d: 0x3caa, 0x82e: 0x3cb1, 0x82f: 0x3cb8, + 0x832: 0xa000, 0x833: 0xa000, 0x834: 0xa000, 0x835: 0xa000, + // Block 0x21, offset 0x840 + 0x860: 0x0023, 0x861: 0x0025, 0x862: 0x0027, 0x863: 0x0029, + 0x864: 0x002b, 0x865: 0x002d, 0x866: 0x002f, 0x867: 0x0031, 0x868: 0x0033, 0x869: 0x1882, + 0x86a: 0x1885, 0x86b: 0x1888, 0x86c: 0x188b, 0x86d: 0x188e, 0x86e: 0x1891, 0x86f: 0x1894, + 0x870: 0x1897, 0x871: 0x189a, 0x872: 0x189d, 0x873: 0x18a6, 0x874: 0x1a6b, 0x875: 0x1a6f, + 0x876: 0x1a73, 0x877: 0x1a77, 0x878: 0x1a7b, 0x879: 0x1a7f, 0x87a: 0x1a83, 0x87b: 0x1a87, + 0x87c: 0x1a8b, 0x87d: 0x1c83, 0x87e: 0x1c88, 0x87f: 0x1c8d, + // Block 0x22, offset 0x880 + 0x880: 0x1c92, 0x881: 0x1c97, 0x882: 0x1c9c, 0x883: 0x1ca1, 0x884: 0x1ca6, 0x885: 0x1cab, + 0x886: 0x1cb0, 0x887: 0x1cb5, 0x888: 0x187f, 0x889: 0x18a3, 0x88a: 0x18c7, 0x88b: 0x18eb, + 0x88c: 0x190f, 0x88d: 0x1918, 0x88e: 0x191e, 0x88f: 0x1924, 0x890: 0x192a, 0x891: 0x1b63, + 0x892: 0x1b67, 0x893: 0x1b6b, 0x894: 0x1b6f, 0x895: 0x1b73, 0x896: 0x1b77, 0x897: 0x1b7b, + 0x898: 0x1b7f, 0x899: 0x1b83, 0x89a: 0x1b87, 0x89b: 0x1b8b, 0x89c: 0x1af7, 0x89d: 0x1afb, + 0x89e: 0x1aff, 0x89f: 0x1b03, 0x8a0: 0x1b07, 0x8a1: 0x1b0b, 0x8a2: 0x1b0f, 0x8a3: 0x1b13, + 0x8a4: 0x1b17, 0x8a5: 0x1b1b, 0x8a6: 0x1b1f, 0x8a7: 0x1b23, 0x8a8: 0x1b27, 0x8a9: 0x1b2b, + 0x8aa: 0x1b2f, 0x8ab: 0x1b33, 0x8ac: 0x1b37, 0x8ad: 0x1b3b, 0x8ae: 0x1b3f, 0x8af: 0x1b43, + 0x8b0: 0x1b47, 0x8b1: 0x1b4b, 0x8b2: 0x1b4f, 0x8b3: 0x1b53, 0x8b4: 0x1b57, 0x8b5: 0x1b5b, + 0x8b6: 0x0043, 0x8b7: 0x0045, 0x8b8: 0x0047, 0x8b9: 0x0049, 0x8ba: 0x004b, 0x8bb: 0x004d, + 0x8bc: 0x004f, 0x8bd: 0x0051, 0x8be: 0x0053, 0x8bf: 0x0055, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x06bf, 0x8c1: 0x06e3, 0x8c2: 0x06ef, 0x8c3: 0x06ff, 0x8c4: 0x0707, 0x8c5: 0x0713, + 0x8c6: 0x071b, 0x8c7: 0x0723, 0x8c8: 0x072f, 0x8c9: 0x0783, 0x8ca: 0x079b, 0x8cb: 0x07ab, + 0x8cc: 0x07bb, 0x8cd: 0x07cb, 0x8ce: 0x07db, 0x8cf: 0x07fb, 0x8d0: 0x07ff, 0x8d1: 0x0803, + 0x8d2: 0x0837, 0x8d3: 0x085f, 0x8d4: 0x086f, 0x8d5: 0x0877, 0x8d6: 0x087b, 0x8d7: 0x0887, + 0x8d8: 0x08a3, 0x8d9: 0x08a7, 0x8da: 0x08bf, 0x8db: 0x08c3, 0x8dc: 0x08cb, 0x8dd: 0x08db, + 0x8de: 0x0977, 0x8df: 0x098b, 0x8e0: 0x09cb, 0x8e1: 0x09df, 0x8e2: 0x09e7, 0x8e3: 0x09eb, + 0x8e4: 0x09fb, 0x8e5: 0x0a17, 0x8e6: 0x0a43, 0x8e7: 0x0a4f, 0x8e8: 0x0a6f, 0x8e9: 0x0a7b, + 0x8ea: 0x0a7f, 0x8eb: 0x0a83, 0x8ec: 0x0a9b, 0x8ed: 0x0a9f, 0x8ee: 0x0acb, 0x8ef: 0x0ad7, + 0x8f0: 0x0adf, 0x8f1: 0x0ae7, 0x8f2: 0x0af7, 0x8f3: 0x0aff, 0x8f4: 0x0b07, 0x8f5: 0x0b33, + 0x8f6: 0x0b37, 0x8f7: 0x0b3f, 0x8f8: 0x0b43, 0x8f9: 0x0b4b, 0x8fa: 0x0b53, 0x8fb: 0x0b63, + 0x8fc: 0x0b7f, 0x8fd: 0x0bf7, 0x8fe: 0x0c0b, 0x8ff: 0x0c0f, + // Block 0x24, offset 0x900 + 0x900: 0x0c8f, 0x901: 0x0c93, 0x902: 0x0ca7, 0x903: 0x0cab, 0x904: 0x0cb3, 0x905: 0x0cbb, + 0x906: 0x0cc3, 0x907: 0x0ccf, 0x908: 0x0cf7, 0x909: 0x0d07, 0x90a: 0x0d1b, 0x90b: 0x0d8b, + 0x90c: 0x0d97, 0x90d: 0x0da7, 0x90e: 0x0db3, 0x90f: 0x0dbf, 0x910: 0x0dc7, 0x911: 0x0dcb, + 0x912: 0x0dcf, 0x913: 0x0dd3, 0x914: 0x0dd7, 0x915: 0x0e8f, 0x916: 0x0ed7, 0x917: 0x0ee3, + 0x918: 0x0ee7, 0x919: 0x0eeb, 0x91a: 0x0eef, 0x91b: 0x0ef7, 0x91c: 0x0efb, 0x91d: 0x0f0f, + 0x91e: 0x0f2b, 0x91f: 0x0f33, 0x920: 0x0f73, 0x921: 0x0f77, 0x922: 0x0f7f, 0x923: 0x0f83, + 0x924: 0x0f8b, 0x925: 0x0f8f, 0x926: 0x0fb3, 0x927: 0x0fb7, 0x928: 0x0fd3, 0x929: 0x0fd7, + 0x92a: 0x0fdb, 0x92b: 0x0fdf, 0x92c: 0x0ff3, 0x92d: 0x1017, 0x92e: 0x101b, 0x92f: 0x101f, + 0x930: 0x1043, 0x931: 0x1083, 0x932: 0x1087, 0x933: 0x10a7, 0x934: 0x10b7, 0x935: 0x10bf, + 0x936: 0x10df, 0x937: 0x1103, 0x938: 0x1147, 0x939: 0x114f, 0x93a: 0x1163, 0x93b: 0x116f, + 0x93c: 0x1177, 0x93d: 0x117f, 0x93e: 0x1183, 0x93f: 0x1187, + // Block 0x25, offset 0x940 + 0x940: 0x119f, 0x941: 0x11a3, 0x942: 0x11bf, 0x943: 0x11c7, 0x944: 0x11cf, 0x945: 0x11d3, + 0x946: 0x11df, 0x947: 0x11e7, 0x948: 0x11eb, 0x949: 0x11ef, 0x94a: 0x11f7, 0x94b: 0x11fb, + 0x94c: 0x129b, 0x94d: 0x12af, 0x94e: 0x12e3, 0x94f: 0x12e7, 0x950: 0x12ef, 0x951: 0x131b, + 0x952: 0x1323, 0x953: 0x132b, 0x954: 0x1333, 0x955: 0x136f, 0x956: 0x1373, 0x957: 0x137b, + 0x958: 0x137f, 0x959: 0x1383, 0x95a: 0x13af, 0x95b: 0x13b3, 0x95c: 0x13bb, 0x95d: 0x13cf, + 0x95e: 0x13d3, 0x95f: 0x13ef, 0x960: 0x13f7, 0x961: 0x13fb, 0x962: 0x141f, 0x963: 0x143f, + 0x964: 0x1453, 0x965: 0x1457, 0x966: 0x145f, 0x967: 0x148b, 0x968: 0x148f, 0x969: 0x149f, + 0x96a: 0x14c3, 0x96b: 0x14cf, 0x96c: 0x14df, 0x96d: 0x14f7, 0x96e: 0x14ff, 0x96f: 0x1503, + 0x970: 0x1507, 0x971: 0x150b, 0x972: 0x1517, 0x973: 0x151b, 0x974: 0x1523, 0x975: 0x153f, + 0x976: 0x1543, 0x977: 0x1547, 0x978: 0x155f, 0x979: 0x1563, 0x97a: 0x156b, 0x97b: 0x157f, + 0x97c: 0x1583, 0x97d: 0x1587, 0x97e: 0x158f, 0x97f: 0x1593, + // Block 0x26, offset 0x980 + 0x986: 0xa000, 0x98b: 0xa000, + 0x98c: 0x3f0b, 0x98d: 0xa000, 0x98e: 0x3f13, 0x98f: 0xa000, 0x990: 0x3f1b, 0x991: 0xa000, + 0x992: 0x3f23, 0x993: 0xa000, 0x994: 0x3f2b, 0x995: 0xa000, 0x996: 0x3f33, 0x997: 0xa000, + 0x998: 0x3f3b, 0x999: 0xa000, 0x99a: 0x3f43, 0x99b: 0xa000, 0x99c: 0x3f4b, 0x99d: 0xa000, + 0x99e: 0x3f53, 0x99f: 0xa000, 0x9a0: 0x3f5b, 0x9a1: 0xa000, 0x9a2: 0x3f63, + 0x9a4: 0xa000, 0x9a5: 0x3f6b, 0x9a6: 0xa000, 0x9a7: 0x3f73, 0x9a8: 0xa000, 0x9a9: 0x3f7b, + 0x9af: 0xa000, + 0x9b0: 0x3f83, 0x9b1: 0x3f8b, 0x9b2: 0xa000, 0x9b3: 0x3f93, 0x9b4: 0x3f9b, 0x9b5: 0xa000, + 0x9b6: 0x3fa3, 0x9b7: 0x3fab, 0x9b8: 0xa000, 0x9b9: 0x3fb3, 0x9ba: 0x3fbb, 0x9bb: 0xa000, + 0x9bc: 0x3fc3, 0x9bd: 0x3fcb, + // Block 0x27, offset 0x9c0 + 0x9d4: 0x3f03, + 0x9d9: 0x9903, 0x9da: 0x9903, 0x9db: 0x42df, 0x9dc: 0x42e5, 0x9dd: 0xa000, + 0x9de: 0x3fd3, 0x9df: 0x26b7, + 0x9e6: 0xa000, + 0x9eb: 0xa000, 0x9ec: 0x3fe3, 0x9ed: 0xa000, 0x9ee: 0x3feb, 0x9ef: 0xa000, + 0x9f0: 0x3ff3, 0x9f1: 0xa000, 0x9f2: 0x3ffb, 0x9f3: 0xa000, 0x9f4: 0x4003, 0x9f5: 0xa000, + 0x9f6: 0x400b, 0x9f7: 0xa000, 0x9f8: 0x4013, 0x9f9: 0xa000, 0x9fa: 0x401b, 0x9fb: 0xa000, + 0x9fc: 0x4023, 0x9fd: 0xa000, 0x9fe: 0x402b, 0x9ff: 0xa000, + // Block 0x28, offset 0xa00 + 0xa00: 0x4033, 0xa01: 0xa000, 0xa02: 0x403b, 0xa04: 0xa000, 0xa05: 0x4043, + 0xa06: 0xa000, 0xa07: 0x404b, 0xa08: 0xa000, 0xa09: 0x4053, + 0xa0f: 0xa000, 0xa10: 0x405b, 0xa11: 0x4063, + 0xa12: 0xa000, 0xa13: 0x406b, 0xa14: 0x4073, 0xa15: 0xa000, 0xa16: 0x407b, 0xa17: 0x4083, + 0xa18: 0xa000, 0xa19: 0x408b, 0xa1a: 0x4093, 0xa1b: 0xa000, 0xa1c: 0x409b, 0xa1d: 0x40a3, + 0xa2f: 0xa000, + 0xa30: 0xa000, 0xa31: 0xa000, 0xa32: 0xa000, 0xa34: 0x3fdb, + 0xa37: 0x40ab, 0xa38: 0x40b3, 0xa39: 0x40bb, 0xa3a: 0x40c3, + 0xa3d: 0xa000, 0xa3e: 0x40cb, 0xa3f: 0x26cc, + // Block 0x29, offset 0xa40 + 0xa40: 0x0367, 0xa41: 0x032b, 0xa42: 0x032f, 0xa43: 0x0333, 0xa44: 0x037b, 0xa45: 0x0337, + 0xa46: 0x033b, 0xa47: 0x033f, 0xa48: 0x0343, 0xa49: 0x0347, 0xa4a: 0x034b, 0xa4b: 0x034f, + 0xa4c: 0x0353, 0xa4d: 0x0357, 0xa4e: 0x035b, 0xa4f: 0x49c0, 0xa50: 0x49c6, 0xa51: 0x49cc, + 0xa52: 0x49d2, 0xa53: 0x49d8, 0xa54: 0x49de, 0xa55: 0x49e4, 0xa56: 0x49ea, 0xa57: 0x49f0, + 0xa58: 0x49f6, 0xa59: 0x49fc, 0xa5a: 0x4a02, 0xa5b: 0x4a08, 0xa5c: 0x4a0e, 0xa5d: 0x4a14, + 0xa5e: 0x4a1a, 0xa5f: 0x4a20, 0xa60: 0x4a26, 0xa61: 0x4a2c, 0xa62: 0x4a32, 0xa63: 0x4a38, + 0xa64: 0x03c3, 0xa65: 0x035f, 0xa66: 0x0363, 0xa67: 0x03e7, 0xa68: 0x03eb, 0xa69: 0x03ef, + 0xa6a: 0x03f3, 0xa6b: 0x03f7, 0xa6c: 0x03fb, 0xa6d: 0x03ff, 0xa6e: 0x036b, 0xa6f: 0x0403, + 0xa70: 0x0407, 0xa71: 0x036f, 0xa72: 0x0373, 0xa73: 0x0377, 0xa74: 0x037f, 0xa75: 0x0383, + 0xa76: 0x0387, 0xa77: 0x038b, 0xa78: 0x038f, 0xa79: 0x0393, 0xa7a: 0x0397, 0xa7b: 0x039b, + 0xa7c: 0x039f, 0xa7d: 0x03a3, 0xa7e: 0x03a7, 0xa7f: 0x03ab, + // Block 0x2a, offset 0xa80 + 0xa80: 0x03af, 0xa81: 0x03b3, 0xa82: 0x040b, 0xa83: 0x040f, 0xa84: 0x03b7, 0xa85: 0x03bb, + 0xa86: 0x03bf, 0xa87: 0x03c7, 0xa88: 0x03cb, 0xa89: 0x03cf, 0xa8a: 0x03d3, 0xa8b: 0x03d7, + 0xa8c: 0x03db, 0xa8d: 0x03df, 0xa8e: 0x03e3, + 0xa92: 0x06bf, 0xa93: 0x071b, 0xa94: 0x06cb, 0xa95: 0x097b, 0xa96: 0x06cf, 0xa97: 0x06e7, + 0xa98: 0x06d3, 0xa99: 0x0f93, 0xa9a: 0x0707, 0xa9b: 0x06db, 0xa9c: 0x06c3, 0xa9d: 0x09ff, + 0xa9e: 0x098f, 0xa9f: 0x072f, + // Block 0x2b, offset 0xac0 + 0xac0: 0x2057, 0xac1: 0x205d, 0xac2: 0x2063, 0xac3: 0x2069, 0xac4: 0x206f, 0xac5: 0x2075, + 0xac6: 0x207b, 0xac7: 0x2081, 0xac8: 0x2087, 0xac9: 0x208d, 0xaca: 0x2093, 0xacb: 0x2099, + 0xacc: 0x209f, 0xacd: 0x20a5, 0xace: 0x2729, 0xacf: 0x2732, 0xad0: 0x273b, 0xad1: 0x2744, + 0xad2: 0x274d, 0xad3: 0x2756, 0xad4: 0x275f, 0xad5: 0x2768, 0xad6: 0x2771, 0xad7: 0x2783, + 0xad8: 0x278c, 0xad9: 0x2795, 0xada: 0x279e, 0xadb: 0x27a7, 0xadc: 0x277a, 0xadd: 0x2baf, + 0xade: 0x2af0, 0xae0: 0x20ab, 0xae1: 0x20c3, 0xae2: 0x20b7, 0xae3: 0x210b, + 0xae4: 0x20c9, 0xae5: 0x20e7, 0xae6: 0x20b1, 0xae7: 0x20e1, 0xae8: 0x20bd, 0xae9: 0x20f3, + 0xaea: 0x2123, 0xaeb: 0x2141, 0xaec: 0x213b, 0xaed: 0x212f, 0xaee: 0x217d, 0xaef: 0x2111, + 0xaf0: 0x211d, 0xaf1: 0x2135, 0xaf2: 0x2129, 0xaf3: 0x2153, 0xaf4: 0x20ff, 0xaf5: 0x2147, + 0xaf6: 0x2171, 0xaf7: 0x2159, 0xaf8: 0x20ed, 0xaf9: 0x20cf, 0xafa: 0x2105, 0xafb: 0x2117, + 0xafc: 0x214d, 0xafd: 0x20d5, 0xafe: 0x2177, 0xaff: 0x20f9, + // Block 0x2c, offset 0xb00 + 0xb00: 0x215f, 0xb01: 0x20db, 0xb02: 0x2165, 0xb03: 0x216b, 0xb04: 0x092f, 0xb05: 0x0b03, + 0xb06: 0x0ca7, 0xb07: 0x10c7, + 0xb10: 0x1bc7, 0xb11: 0x18a9, + 0xb12: 0x18ac, 0xb13: 0x18af, 0xb14: 0x18b2, 0xb15: 0x18b5, 0xb16: 0x18b8, 0xb17: 0x18bb, + 0xb18: 0x18be, 0xb19: 0x18c1, 0xb1a: 0x18ca, 0xb1b: 0x18cd, 0xb1c: 0x18d0, 0xb1d: 0x18d3, + 0xb1e: 0x18d6, 0xb1f: 0x18d9, 0xb20: 0x0313, 0xb21: 0x031b, 0xb22: 0x031f, 0xb23: 0x0327, + 0xb24: 0x032b, 0xb25: 0x032f, 0xb26: 0x0337, 0xb27: 0x033f, 0xb28: 0x0343, 0xb29: 0x034b, + 0xb2a: 0x034f, 0xb2b: 0x0353, 0xb2c: 0x0357, 0xb2d: 0x035b, 0xb2e: 0x2e1b, 0xb2f: 0x2e23, + 0xb30: 0x2e2b, 0xb31: 0x2e33, 0xb32: 0x2e3b, 0xb33: 0x2e43, 0xb34: 0x2e4b, 0xb35: 0x2e53, + 0xb36: 0x2e63, 0xb37: 0x2e6b, 0xb38: 0x2e73, 0xb39: 0x2e7b, 0xb3a: 0x2e83, 0xb3b: 0x2e8b, + 0xb3c: 0x2ed6, 0xb3d: 0x2e9e, 0xb3e: 0x2e5b, + // Block 0x2d, offset 0xb40 + 0xb40: 0x06bf, 0xb41: 0x071b, 0xb42: 0x06cb, 0xb43: 0x097b, 0xb44: 0x071f, 0xb45: 0x07af, + 0xb46: 0x06c7, 0xb47: 0x07ab, 0xb48: 0x070b, 0xb49: 0x0887, 0xb4a: 0x0d07, 0xb4b: 0x0e8f, + 0xb4c: 0x0dd7, 0xb4d: 0x0d1b, 0xb4e: 0x145f, 0xb4f: 0x098b, 0xb50: 0x0ccf, 0xb51: 0x0d4b, + 0xb52: 0x0d0b, 0xb53: 0x104b, 0xb54: 0x08fb, 0xb55: 0x0f03, 0xb56: 0x1387, 0xb57: 0x105f, + 0xb58: 0x0843, 0xb59: 0x108f, 0xb5a: 0x0f9b, 0xb5b: 0x0a17, 0xb5c: 0x140f, 0xb5d: 0x077f, + 0xb5e: 0x08ab, 0xb5f: 0x0df7, 0xb60: 0x1527, 0xb61: 0x0743, 0xb62: 0x07d3, 0xb63: 0x0d9b, + 0xb64: 0x06cf, 0xb65: 0x06e7, 0xb66: 0x06d3, 0xb67: 0x0adb, 0xb68: 0x08ef, 0xb69: 0x087f, + 0xb6a: 0x0a57, 0xb6b: 0x0a4b, 0xb6c: 0x0feb, 0xb6d: 0x073f, 0xb6e: 0x139b, 0xb6f: 0x089b, + 0xb70: 0x09f3, 0xb71: 0x18dc, 0xb72: 0x18df, 0xb73: 0x18e2, 0xb74: 0x18e5, 0xb75: 0x18ee, + 0xb76: 0x18f1, 0xb77: 0x18f4, 0xb78: 0x18f7, 0xb79: 0x18fa, 0xb7a: 0x18fd, 0xb7b: 0x1900, + 0xb7c: 0x1903, 0xb7d: 0x1906, 0xb7e: 0x1909, 0xb7f: 0x1912, + // Block 0x2e, offset 0xb80 + 0xb80: 0x1cc9, 0xb81: 0x1cd8, 0xb82: 0x1ce7, 0xb83: 0x1cf6, 0xb84: 0x1d05, 0xb85: 0x1d14, + 0xb86: 0x1d23, 0xb87: 0x1d32, 0xb88: 0x1d41, 0xb89: 0x218f, 0xb8a: 0x21a1, 0xb8b: 0x21b3, + 0xb8c: 0x1954, 0xb8d: 0x1c07, 0xb8e: 0x19d5, 0xb8f: 0x1bab, 0xb90: 0x04cb, 0xb91: 0x04d3, + 0xb92: 0x04db, 0xb93: 0x04e3, 0xb94: 0x04eb, 0xb95: 0x04ef, 0xb96: 0x04f3, 0xb97: 0x04f7, + 0xb98: 0x04fb, 0xb99: 0x04ff, 0xb9a: 0x0503, 0xb9b: 0x0507, 0xb9c: 0x050b, 0xb9d: 0x050f, + 0xb9e: 0x0513, 0xb9f: 0x0517, 0xba0: 0x051b, 0xba1: 0x0523, 0xba2: 0x0527, 0xba3: 0x052b, + 0xba4: 0x052f, 0xba5: 0x0533, 0xba6: 0x0537, 0xba7: 0x053b, 0xba8: 0x053f, 0xba9: 0x0543, + 0xbaa: 0x0547, 0xbab: 0x054b, 0xbac: 0x054f, 0xbad: 0x0553, 0xbae: 0x0557, 0xbaf: 0x055b, + 0xbb0: 0x055f, 0xbb1: 0x0563, 0xbb2: 0x0567, 0xbb3: 0x056f, 0xbb4: 0x0577, 0xbb5: 0x057f, + 0xbb6: 0x0583, 0xbb7: 0x0587, 0xbb8: 0x058b, 0xbb9: 0x058f, 0xbba: 0x0593, 0xbbb: 0x0597, + 0xbbc: 0x059b, 0xbbd: 0x059f, 0xbbe: 0x05a3, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x2b0f, 0xbc1: 0x29ab, 0xbc2: 0x2b1f, 0xbc3: 0x2883, 0xbc4: 0x2ee7, 0xbc5: 0x288d, + 0xbc6: 0x2897, 0xbc7: 0x2f2b, 0xbc8: 0x29b8, 0xbc9: 0x28a1, 0xbca: 0x28ab, 0xbcb: 0x28b5, + 0xbcc: 0x29df, 0xbcd: 0x29ec, 0xbce: 0x29c5, 0xbcf: 0x29d2, 0xbd0: 0x2eac, 0xbd1: 0x29f9, + 0xbd2: 0x2a06, 0xbd3: 0x2bc1, 0xbd4: 0x26be, 0xbd5: 0x2bd4, 0xbd6: 0x2be7, 0xbd7: 0x2b2f, + 0xbd8: 0x2a13, 0xbd9: 0x2bfa, 0xbda: 0x2c0d, 0xbdb: 0x2a20, 0xbdc: 0x28bf, 0xbdd: 0x28c9, + 0xbde: 0x2eba, 0xbdf: 0x2a2d, 0xbe0: 0x2b3f, 0xbe1: 0x2ef8, 0xbe2: 0x28d3, 0xbe3: 0x28dd, + 0xbe4: 0x2a3a, 0xbe5: 0x28e7, 0xbe6: 0x28f1, 0xbe7: 0x26d3, 0xbe8: 0x26da, 0xbe9: 0x28fb, + 0xbea: 0x2905, 0xbeb: 0x2c20, 0xbec: 0x2a47, 0xbed: 0x2b4f, 0xbee: 0x2c33, 0xbef: 0x2a54, + 0xbf0: 0x2919, 0xbf1: 0x290f, 0xbf2: 0x2f3f, 0xbf3: 0x2a61, 0xbf4: 0x2c46, 0xbf5: 0x2923, + 0xbf6: 0x2b5f, 0xbf7: 0x292d, 0xbf8: 0x2a7b, 0xbf9: 0x2937, 0xbfa: 0x2a88, 0xbfb: 0x2f09, + 0xbfc: 0x2a6e, 0xbfd: 0x2b6f, 0xbfe: 0x2a95, 0xbff: 0x26e1, + // Block 0x30, offset 0xc00 + 0xc00: 0x2f1a, 0xc01: 0x2941, 0xc02: 0x294b, 0xc03: 0x2aa2, 0xc04: 0x2955, 0xc05: 0x295f, + 0xc06: 0x2969, 0xc07: 0x2b7f, 0xc08: 0x2aaf, 0xc09: 0x26e8, 0xc0a: 0x2c59, 0xc0b: 0x2e93, + 0xc0c: 0x2b8f, 0xc0d: 0x2abc, 0xc0e: 0x2ec8, 0xc0f: 0x2973, 0xc10: 0x297d, 0xc11: 0x2ac9, + 0xc12: 0x26ef, 0xc13: 0x2ad6, 0xc14: 0x2b9f, 0xc15: 0x26f6, 0xc16: 0x2c6c, 0xc17: 0x2987, + 0xc18: 0x1cba, 0xc19: 0x1cce, 0xc1a: 0x1cdd, 0xc1b: 0x1cec, 0xc1c: 0x1cfb, 0xc1d: 0x1d0a, + 0xc1e: 0x1d19, 0xc1f: 0x1d28, 0xc20: 0x1d37, 0xc21: 0x1d46, 0xc22: 0x2195, 0xc23: 0x21a7, + 0xc24: 0x21b9, 0xc25: 0x21c5, 0xc26: 0x21d1, 0xc27: 0x21dd, 0xc28: 0x21e9, 0xc29: 0x21f5, + 0xc2a: 0x2201, 0xc2b: 0x220d, 0xc2c: 0x2249, 0xc2d: 0x2255, 0xc2e: 0x2261, 0xc2f: 0x226d, + 0xc30: 0x2279, 0xc31: 0x1c17, 0xc32: 0x19c9, 0xc33: 0x1936, 0xc34: 0x1be7, 0xc35: 0x1a4a, + 0xc36: 0x1a59, 0xc37: 0x19cf, 0xc38: 0x1bff, 0xc39: 0x1c03, 0xc3a: 0x1960, 0xc3b: 0x2704, + 0xc3c: 0x2712, 0xc3d: 0x26fd, 0xc3e: 0x270b, 0xc3f: 0x2ae3, + // Block 0x31, offset 0xc40 + 0xc40: 0x1a4d, 0xc41: 0x1a35, 0xc42: 0x1c63, 0xc43: 0x1a1d, 0xc44: 0x19f6, 0xc45: 0x1969, + 0xc46: 0x1978, 0xc47: 0x1948, 0xc48: 0x1bf3, 0xc49: 0x1d55, 0xc4a: 0x1a50, 0xc4b: 0x1a38, + 0xc4c: 0x1c67, 0xc4d: 0x1c73, 0xc4e: 0x1a29, 0xc4f: 0x19ff, 0xc50: 0x1957, 0xc51: 0x1c1f, + 0xc52: 0x1bb3, 0xc53: 0x1b9f, 0xc54: 0x1bcf, 0xc55: 0x1c77, 0xc56: 0x1a2c, 0xc57: 0x19cc, + 0xc58: 0x1a02, 0xc59: 0x19e1, 0xc5a: 0x1a44, 0xc5b: 0x1c7b, 0xc5c: 0x1a2f, 0xc5d: 0x19c3, + 0xc5e: 0x1a05, 0xc5f: 0x1c3f, 0xc60: 0x1bf7, 0xc61: 0x1a17, 0xc62: 0x1c27, 0xc63: 0x1c43, + 0xc64: 0x1bfb, 0xc65: 0x1a1a, 0xc66: 0x1c2b, 0xc67: 0x22eb, 0xc68: 0x22ff, 0xc69: 0x1999, + 0xc6a: 0x1c23, 0xc6b: 0x1bb7, 0xc6c: 0x1ba3, 0xc6d: 0x1c4b, 0xc6e: 0x2719, 0xc6f: 0x27b0, + 0xc70: 0x1a5c, 0xc71: 0x1a47, 0xc72: 0x1c7f, 0xc73: 0x1a32, 0xc74: 0x1a53, 0xc75: 0x1a3b, + 0xc76: 0x1c6b, 0xc77: 0x1a20, 0xc78: 0x19f9, 0xc79: 0x1984, 0xc7a: 0x1a56, 0xc7b: 0x1a3e, + 0xc7c: 0x1c6f, 0xc7d: 0x1a23, 0xc7e: 0x19fc, 0xc7f: 0x1987, + // Block 0x32, offset 0xc80 + 0xc80: 0x1c2f, 0xc81: 0x1bbb, 0xc82: 0x1d50, 0xc83: 0x1939, 0xc84: 0x19bd, 0xc85: 0x19c0, + 0xc86: 0x22f8, 0xc87: 0x1b97, 0xc88: 0x19c6, 0xc89: 0x194b, 0xc8a: 0x19e4, 0xc8b: 0x194e, + 0xc8c: 0x19ed, 0xc8d: 0x196c, 0xc8e: 0x196f, 0xc8f: 0x1a08, 0xc90: 0x1a0e, 0xc91: 0x1a11, + 0xc92: 0x1c33, 0xc93: 0x1a14, 0xc94: 0x1a26, 0xc95: 0x1c3b, 0xc96: 0x1c47, 0xc97: 0x1993, + 0xc98: 0x1d5a, 0xc99: 0x1bbf, 0xc9a: 0x1996, 0xc9b: 0x1a5f, 0xc9c: 0x19a8, 0xc9d: 0x19b7, + 0xc9e: 0x22e5, 0xc9f: 0x22df, 0xca0: 0x1cc4, 0xca1: 0x1cd3, 0xca2: 0x1ce2, 0xca3: 0x1cf1, + 0xca4: 0x1d00, 0xca5: 0x1d0f, 0xca6: 0x1d1e, 0xca7: 0x1d2d, 0xca8: 0x1d3c, 0xca9: 0x2189, + 0xcaa: 0x219b, 0xcab: 0x21ad, 0xcac: 0x21bf, 0xcad: 0x21cb, 0xcae: 0x21d7, 0xcaf: 0x21e3, + 0xcb0: 0x21ef, 0xcb1: 0x21fb, 0xcb2: 0x2207, 0xcb3: 0x2243, 0xcb4: 0x224f, 0xcb5: 0x225b, + 0xcb6: 0x2267, 0xcb7: 0x2273, 0xcb8: 0x227f, 0xcb9: 0x2285, 0xcba: 0x228b, 0xcbb: 0x2291, + 0xcbc: 0x2297, 0xcbd: 0x22a9, 0xcbe: 0x22af, 0xcbf: 0x1c13, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x1377, 0xcc1: 0x0cfb, 0xcc2: 0x13d3, 0xcc3: 0x139f, 0xcc4: 0x0e57, 0xcc5: 0x06eb, + 0xcc6: 0x08df, 0xcc7: 0x162b, 0xcc8: 0x162b, 0xcc9: 0x0a0b, 0xcca: 0x145f, 0xccb: 0x0943, + 0xccc: 0x0a07, 0xccd: 0x0bef, 0xcce: 0x0fcf, 0xccf: 0x115f, 0xcd0: 0x1297, 0xcd1: 0x12d3, + 0xcd2: 0x1307, 0xcd3: 0x141b, 0xcd4: 0x0d73, 0xcd5: 0x0dff, 0xcd6: 0x0eab, 0xcd7: 0x0f43, + 0xcd8: 0x125f, 0xcd9: 0x1447, 0xcda: 0x1573, 0xcdb: 0x070f, 0xcdc: 0x08b3, 0xcdd: 0x0d87, + 0xcde: 0x0ecf, 0xcdf: 0x1293, 0xce0: 0x15c3, 0xce1: 0x0ab3, 0xce2: 0x0e77, 0xce3: 0x1283, + 0xce4: 0x1317, 0xce5: 0x0c23, 0xce6: 0x11bb, 0xce7: 0x12df, 0xce8: 0x0b1f, 0xce9: 0x0d0f, + 0xcea: 0x0e17, 0xceb: 0x0f1b, 0xcec: 0x1427, 0xced: 0x074f, 0xcee: 0x07e7, 0xcef: 0x0853, + 0xcf0: 0x0c8b, 0xcf1: 0x0d7f, 0xcf2: 0x0ecb, 0xcf3: 0x0fef, 0xcf4: 0x1177, 0xcf5: 0x128b, + 0xcf6: 0x12a3, 0xcf7: 0x13c7, 0xcf8: 0x14ef, 0xcf9: 0x15a3, 0xcfa: 0x15bf, 0xcfb: 0x102b, + 0xcfc: 0x106b, 0xcfd: 0x1123, 0xcfe: 0x1243, 0xcff: 0x147b, + // Block 0x34, offset 0xd00 + 0xd00: 0x15cb, 0xd01: 0x134b, 0xd02: 0x09c7, 0xd03: 0x0b3b, 0xd04: 0x10db, 0xd05: 0x119b, + 0xd06: 0x0eff, 0xd07: 0x1033, 0xd08: 0x1397, 0xd09: 0x14e7, 0xd0a: 0x09c3, 0xd0b: 0x0a8f, + 0xd0c: 0x0d77, 0xd0d: 0x0e2b, 0xd0e: 0x0e5f, 0xd0f: 0x1113, 0xd10: 0x113b, 0xd11: 0x14a7, + 0xd12: 0x084f, 0xd13: 0x11a7, 0xd14: 0x07f3, 0xd15: 0x07ef, 0xd16: 0x1097, 0xd17: 0x1127, + 0xd18: 0x125b, 0xd19: 0x14af, 0xd1a: 0x1367, 0xd1b: 0x0c27, 0xd1c: 0x0d73, 0xd1d: 0x1357, + 0xd1e: 0x06f7, 0xd1f: 0x0a63, 0xd20: 0x0b93, 0xd21: 0x0f2f, 0xd22: 0x0faf, 0xd23: 0x0873, + 0xd24: 0x103b, 0xd25: 0x075f, 0xd26: 0x0b77, 0xd27: 0x06d7, 0xd28: 0x0deb, 0xd29: 0x0ca3, + 0xd2a: 0x110f, 0xd2b: 0x08c7, 0xd2c: 0x09b3, 0xd2d: 0x0ffb, 0xd2e: 0x1263, 0xd2f: 0x133b, + 0xd30: 0x0db7, 0xd31: 0x13f7, 0xd32: 0x0de3, 0xd33: 0x0c37, 0xd34: 0x121b, 0xd35: 0x0c57, + 0xd36: 0x0fab, 0xd37: 0x072b, 0xd38: 0x07a7, 0xd39: 0x07eb, 0xd3a: 0x0d53, 0xd3b: 0x10fb, + 0xd3c: 0x11f3, 0xd3d: 0x1347, 0xd3e: 0x145b, 0xd3f: 0x085b, + // Block 0x35, offset 0xd40 + 0xd40: 0x090f, 0xd41: 0x0a17, 0xd42: 0x0b2f, 0xd43: 0x0cbf, 0xd44: 0x0e7b, 0xd45: 0x103f, + 0xd46: 0x1497, 0xd47: 0x157b, 0xd48: 0x15cf, 0xd49: 0x15e7, 0xd4a: 0x0837, 0xd4b: 0x0cf3, + 0xd4c: 0x0da3, 0xd4d: 0x13eb, 0xd4e: 0x0afb, 0xd4f: 0x0bd7, 0xd50: 0x0bf3, 0xd51: 0x0c83, + 0xd52: 0x0e6b, 0xd53: 0x0eb7, 0xd54: 0x0f67, 0xd55: 0x108b, 0xd56: 0x112f, 0xd57: 0x1193, + 0xd58: 0x13db, 0xd59: 0x126b, 0xd5a: 0x1403, 0xd5b: 0x147f, 0xd5c: 0x080f, 0xd5d: 0x083b, + 0xd5e: 0x0923, 0xd5f: 0x0ea7, 0xd60: 0x12f3, 0xd61: 0x133b, 0xd62: 0x0b1b, 0xd63: 0x0b8b, + 0xd64: 0x0c4f, 0xd65: 0x0daf, 0xd66: 0x10d7, 0xd67: 0x0f23, 0xd68: 0x073b, 0xd69: 0x097f, + 0xd6a: 0x0a63, 0xd6b: 0x0ac7, 0xd6c: 0x0b97, 0xd6d: 0x0f3f, 0xd6e: 0x0f5b, 0xd6f: 0x116b, + 0xd70: 0x118b, 0xd71: 0x1463, 0xd72: 0x14e3, 0xd73: 0x14f3, 0xd74: 0x152f, 0xd75: 0x0753, + 0xd76: 0x107f, 0xd77: 0x144f, 0xd78: 0x14cb, 0xd79: 0x0baf, 0xd7a: 0x0717, 0xd7b: 0x0777, + 0xd7c: 0x0a67, 0xd7d: 0x0a87, 0xd7e: 0x0caf, 0xd7f: 0x0d73, + // Block 0x36, offset 0xd80 + 0xd80: 0x0ec3, 0xd81: 0x0fcb, 0xd82: 0x1277, 0xd83: 0x1417, 0xd84: 0x1623, 0xd85: 0x0ce3, + 0xd86: 0x14a3, 0xd87: 0x0833, 0xd88: 0x0d2f, 0xd89: 0x0d3b, 0xd8a: 0x0e0f, 0xd8b: 0x0e47, + 0xd8c: 0x0f4b, 0xd8d: 0x0fa7, 0xd8e: 0x1027, 0xd8f: 0x110b, 0xd90: 0x153b, 0xd91: 0x07af, + 0xd92: 0x0c03, 0xd93: 0x14b3, 0xd94: 0x0767, 0xd95: 0x0aab, 0xd96: 0x0e2f, 0xd97: 0x13df, + 0xd98: 0x0b67, 0xd99: 0x0bb7, 0xd9a: 0x0d43, 0xd9b: 0x0f2f, 0xd9c: 0x14bb, 0xd9d: 0x0817, + 0xd9e: 0x08ff, 0xd9f: 0x0a97, 0xda0: 0x0cd3, 0xda1: 0x0d1f, 0xda2: 0x0d5f, 0xda3: 0x0df3, + 0xda4: 0x0f47, 0xda5: 0x0fbb, 0xda6: 0x1157, 0xda7: 0x12f7, 0xda8: 0x1303, 0xda9: 0x1457, + 0xdaa: 0x14d7, 0xdab: 0x0883, 0xdac: 0x0e4b, 0xdad: 0x0903, 0xdae: 0x0ec7, 0xdaf: 0x0f6b, + 0xdb0: 0x1287, 0xdb1: 0x14bf, 0xdb2: 0x15ab, 0xdb3: 0x15d3, 0xdb4: 0x0d37, 0xdb5: 0x0e27, + 0xdb6: 0x11c3, 0xdb7: 0x10b7, 0xdb8: 0x10c3, 0xdb9: 0x10e7, 0xdba: 0x0f17, 0xdbb: 0x0e9f, + 0xdbc: 0x1363, 0xdbd: 0x0733, 0xdbe: 0x122b, 0xdbf: 0x081b, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x080b, 0xdc1: 0x0b0b, 0xdc2: 0x0c2b, 0xdc3: 0x10f3, 0xdc4: 0x0a53, 0xdc5: 0x0e03, + 0xdc6: 0x0cef, 0xdc7: 0x13e7, 0xdc8: 0x12e7, 0xdc9: 0x14ab, 0xdca: 0x1323, 0xdcb: 0x0b27, + 0xdcc: 0x0787, 0xdcd: 0x095b, 0xdd0: 0x09af, + 0xdd2: 0x0cdf, 0xdd5: 0x07f7, 0xdd6: 0x0f1f, 0xdd7: 0x0fe3, + 0xdd8: 0x1047, 0xdd9: 0x1063, 0xdda: 0x1067, 0xddb: 0x107b, 0xddc: 0x14fb, 0xddd: 0x10eb, + 0xdde: 0x116f, 0xde0: 0x128f, 0xde2: 0x1353, + 0xde5: 0x1407, 0xde6: 0x1433, + 0xdea: 0x154f, 0xdeb: 0x1553, 0xdec: 0x1557, 0xded: 0x15bb, 0xdee: 0x142b, 0xdef: 0x14c7, + 0xdf0: 0x0757, 0xdf1: 0x077b, 0xdf2: 0x078f, 0xdf3: 0x084b, 0xdf4: 0x0857, 0xdf5: 0x0897, + 0xdf6: 0x094b, 0xdf7: 0x0967, 0xdf8: 0x096f, 0xdf9: 0x09ab, 0xdfa: 0x09b7, 0xdfb: 0x0a93, + 0xdfc: 0x0a9b, 0xdfd: 0x0ba3, 0xdfe: 0x0bcb, 0xdff: 0x0bd3, + // Block 0x38, offset 0xe00 + 0xe00: 0x0beb, 0xe01: 0x0c97, 0xe02: 0x0cc7, 0xe03: 0x0ce7, 0xe04: 0x0d57, 0xe05: 0x0e1b, + 0xe06: 0x0e37, 0xe07: 0x0e67, 0xe08: 0x0ebb, 0xe09: 0x0edb, 0xe0a: 0x0f4f, 0xe0b: 0x102f, + 0xe0c: 0x104b, 0xe0d: 0x1053, 0xe0e: 0x104f, 0xe0f: 0x1057, 0xe10: 0x105b, 0xe11: 0x105f, + 0xe12: 0x1073, 0xe13: 0x1077, 0xe14: 0x109b, 0xe15: 0x10af, 0xe16: 0x10cb, 0xe17: 0x112f, + 0xe18: 0x1137, 0xe19: 0x113f, 0xe1a: 0x1153, 0xe1b: 0x117b, 0xe1c: 0x11cb, 0xe1d: 0x11ff, + 0xe1e: 0x11ff, 0xe1f: 0x1267, 0xe20: 0x130f, 0xe21: 0x1327, 0xe22: 0x135b, 0xe23: 0x135f, + 0xe24: 0x13a3, 0xe25: 0x13a7, 0xe26: 0x13ff, 0xe27: 0x1407, 0xe28: 0x14db, 0xe29: 0x151f, + 0xe2a: 0x1537, 0xe2b: 0x0b9b, 0xe2c: 0x171e, 0xe2d: 0x11e3, + 0xe30: 0x06df, 0xe31: 0x07e3, 0xe32: 0x07a3, 0xe33: 0x074b, 0xe34: 0x078b, 0xe35: 0x07b7, + 0xe36: 0x0847, 0xe37: 0x0863, 0xe38: 0x094b, 0xe39: 0x0937, 0xe3a: 0x0947, 0xe3b: 0x0963, + 0xe3c: 0x09af, 0xe3d: 0x09bf, 0xe3e: 0x0a03, 0xe3f: 0x0a0f, + // Block 0x39, offset 0xe40 + 0xe40: 0x0a2b, 0xe41: 0x0a3b, 0xe42: 0x0b23, 0xe43: 0x0b2b, 0xe44: 0x0b5b, 0xe45: 0x0b7b, + 0xe46: 0x0bab, 0xe47: 0x0bc3, 0xe48: 0x0bb3, 0xe49: 0x0bd3, 0xe4a: 0x0bc7, 0xe4b: 0x0beb, + 0xe4c: 0x0c07, 0xe4d: 0x0c5f, 0xe4e: 0x0c6b, 0xe4f: 0x0c73, 0xe50: 0x0c9b, 0xe51: 0x0cdf, + 0xe52: 0x0d0f, 0xe53: 0x0d13, 0xe54: 0x0d27, 0xe55: 0x0da7, 0xe56: 0x0db7, 0xe57: 0x0e0f, + 0xe58: 0x0e5b, 0xe59: 0x0e53, 0xe5a: 0x0e67, 0xe5b: 0x0e83, 0xe5c: 0x0ebb, 0xe5d: 0x1013, + 0xe5e: 0x0edf, 0xe5f: 0x0f13, 0xe60: 0x0f1f, 0xe61: 0x0f5f, 0xe62: 0x0f7b, 0xe63: 0x0f9f, + 0xe64: 0x0fc3, 0xe65: 0x0fc7, 0xe66: 0x0fe3, 0xe67: 0x0fe7, 0xe68: 0x0ff7, 0xe69: 0x100b, + 0xe6a: 0x1007, 0xe6b: 0x1037, 0xe6c: 0x10b3, 0xe6d: 0x10cb, 0xe6e: 0x10e3, 0xe6f: 0x111b, + 0xe70: 0x112f, 0xe71: 0x114b, 0xe72: 0x117b, 0xe73: 0x122f, 0xe74: 0x1257, 0xe75: 0x12cb, + 0xe76: 0x1313, 0xe77: 0x131f, 0xe78: 0x1327, 0xe79: 0x133f, 0xe7a: 0x1353, 0xe7b: 0x1343, + 0xe7c: 0x135b, 0xe7d: 0x1357, 0xe7e: 0x134f, 0xe7f: 0x135f, + // Block 0x3a, offset 0xe80 + 0xe80: 0x136b, 0xe81: 0x13a7, 0xe82: 0x13e3, 0xe83: 0x1413, 0xe84: 0x144b, 0xe85: 0x146b, + 0xe86: 0x14b7, 0xe87: 0x14db, 0xe88: 0x14fb, 0xe89: 0x150f, 0xe8a: 0x151f, 0xe8b: 0x152b, + 0xe8c: 0x1537, 0xe8d: 0x158b, 0xe8e: 0x162b, 0xe8f: 0x16b5, 0xe90: 0x16b0, 0xe91: 0x16e2, + 0xe92: 0x0607, 0xe93: 0x062f, 0xe94: 0x0633, 0xe95: 0x1764, 0xe96: 0x1791, 0xe97: 0x1809, + 0xe98: 0x1617, 0xe99: 0x1627, + // Block 0x3b, offset 0xec0 + 0xec0: 0x19d8, 0xec1: 0x19db, 0xec2: 0x19de, 0xec3: 0x1c0b, 0xec4: 0x1c0f, 0xec5: 0x1a62, + 0xec6: 0x1a62, + 0xed3: 0x1d78, 0xed4: 0x1d69, 0xed5: 0x1d6e, 0xed6: 0x1d7d, 0xed7: 0x1d73, + 0xedd: 0x4393, + 0xede: 0x8115, 0xedf: 0x4405, 0xee0: 0x022d, 0xee1: 0x0215, 0xee2: 0x021e, 0xee3: 0x0221, + 0xee4: 0x0224, 0xee5: 0x0227, 0xee6: 0x022a, 0xee7: 0x0230, 0xee8: 0x0233, 0xee9: 0x0017, + 0xeea: 0x43f3, 0xeeb: 0x43f9, 0xeec: 0x44f7, 0xeed: 0x44ff, 0xeee: 0x434b, 0xeef: 0x4351, + 0xef0: 0x4357, 0xef1: 0x435d, 0xef2: 0x4369, 0xef3: 0x436f, 0xef4: 0x4375, 0xef5: 0x4381, + 0xef6: 0x4387, 0xef8: 0x438d, 0xef9: 0x4399, 0xefa: 0x439f, 0xefb: 0x43a5, + 0xefc: 0x43b1, 0xefe: 0x43b7, + // Block 0x3c, offset 0xf00 + 0xf00: 0x43bd, 0xf01: 0x43c3, 0xf03: 0x43c9, 0xf04: 0x43cf, + 0xf06: 0x43db, 0xf07: 0x43e1, 0xf08: 0x43e7, 0xf09: 0x43ed, 0xf0a: 0x43ff, 0xf0b: 0x437b, + 0xf0c: 0x4363, 0xf0d: 0x43ab, 0xf0e: 0x43d5, 0xf0f: 0x1d82, 0xf10: 0x0299, 0xf11: 0x0299, + 0xf12: 0x02a2, 0xf13: 0x02a2, 0xf14: 0x02a2, 0xf15: 0x02a2, 0xf16: 0x02a5, 0xf17: 0x02a5, + 0xf18: 0x02a5, 0xf19: 0x02a5, 0xf1a: 0x02ab, 0xf1b: 0x02ab, 0xf1c: 0x02ab, 0xf1d: 0x02ab, + 0xf1e: 0x029f, 0xf1f: 0x029f, 0xf20: 0x029f, 0xf21: 0x029f, 0xf22: 0x02a8, 0xf23: 0x02a8, + 0xf24: 0x02a8, 0xf25: 0x02a8, 0xf26: 0x029c, 0xf27: 0x029c, 0xf28: 0x029c, 0xf29: 0x029c, + 0xf2a: 0x02cf, 0xf2b: 0x02cf, 0xf2c: 0x02cf, 0xf2d: 0x02cf, 0xf2e: 0x02d2, 0xf2f: 0x02d2, + 0xf30: 0x02d2, 0xf31: 0x02d2, 0xf32: 0x02b1, 0xf33: 0x02b1, 0xf34: 0x02b1, 0xf35: 0x02b1, + 0xf36: 0x02ae, 0xf37: 0x02ae, 0xf38: 0x02ae, 0xf39: 0x02ae, 0xf3a: 0x02b4, 0xf3b: 0x02b4, + 0xf3c: 0x02b4, 0xf3d: 0x02b4, 0xf3e: 0x02b7, 0xf3f: 0x02b7, + // Block 0x3d, offset 0xf40 + 0xf40: 0x02b7, 0xf41: 0x02b7, 0xf42: 0x02c0, 0xf43: 0x02c0, 0xf44: 0x02bd, 0xf45: 0x02bd, + 0xf46: 0x02c3, 0xf47: 0x02c3, 0xf48: 0x02ba, 0xf49: 0x02ba, 0xf4a: 0x02c9, 0xf4b: 0x02c9, + 0xf4c: 0x02c6, 0xf4d: 0x02c6, 0xf4e: 0x02d5, 0xf4f: 0x02d5, 0xf50: 0x02d5, 0xf51: 0x02d5, + 0xf52: 0x02db, 0xf53: 0x02db, 0xf54: 0x02db, 0xf55: 0x02db, 0xf56: 0x02e1, 0xf57: 0x02e1, + 0xf58: 0x02e1, 0xf59: 0x02e1, 0xf5a: 0x02de, 0xf5b: 0x02de, 0xf5c: 0x02de, 0xf5d: 0x02de, + 0xf5e: 0x02e4, 0xf5f: 0x02e4, 0xf60: 0x02e7, 0xf61: 0x02e7, 0xf62: 0x02e7, 0xf63: 0x02e7, + 0xf64: 0x4471, 0xf65: 0x4471, 0xf66: 0x02ed, 0xf67: 0x02ed, 0xf68: 0x02ed, 0xf69: 0x02ed, + 0xf6a: 0x02ea, 0xf6b: 0x02ea, 0xf6c: 0x02ea, 0xf6d: 0x02ea, 0xf6e: 0x0308, 0xf6f: 0x0308, + 0xf70: 0x446b, 0xf71: 0x446b, + // Block 0x3e, offset 0xf80 + 0xf93: 0x02d8, 0xf94: 0x02d8, 0xf95: 0x02d8, 0xf96: 0x02d8, 0xf97: 0x02f6, + 0xf98: 0x02f6, 0xf99: 0x02f3, 0xf9a: 0x02f3, 0xf9b: 0x02f9, 0xf9c: 0x02f9, 0xf9d: 0x2052, + 0xf9e: 0x02ff, 0xf9f: 0x02ff, 0xfa0: 0x02f0, 0xfa1: 0x02f0, 0xfa2: 0x02fc, 0xfa3: 0x02fc, + 0xfa4: 0x0305, 0xfa5: 0x0305, 0xfa6: 0x0305, 0xfa7: 0x0305, 0xfa8: 0x028d, 0xfa9: 0x028d, + 0xfaa: 0x25ad, 0xfab: 0x25ad, 0xfac: 0x261d, 0xfad: 0x261d, 0xfae: 0x25ec, 0xfaf: 0x25ec, + 0xfb0: 0x2608, 0xfb1: 0x2608, 0xfb2: 0x2601, 0xfb3: 0x2601, 0xfb4: 0x260f, 0xfb5: 0x260f, + 0xfb6: 0x2616, 0xfb7: 0x2616, 0xfb8: 0x2616, 0xfb9: 0x25f3, 0xfba: 0x25f3, 0xfbb: 0x25f3, + 0xfbc: 0x0302, 0xfbd: 0x0302, 0xfbe: 0x0302, 0xfbf: 0x0302, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x25b4, 0xfc1: 0x25bb, 0xfc2: 0x25d7, 0xfc3: 0x25f3, 0xfc4: 0x25fa, 0xfc5: 0x1d8c, + 0xfc6: 0x1d91, 0xfc7: 0x1d96, 0xfc8: 0x1da5, 0xfc9: 0x1db4, 0xfca: 0x1db9, 0xfcb: 0x1dbe, + 0xfcc: 0x1dc3, 0xfcd: 0x1dc8, 0xfce: 0x1dd7, 0xfcf: 0x1de6, 0xfd0: 0x1deb, 0xfd1: 0x1df0, + 0xfd2: 0x1dff, 0xfd3: 0x1e0e, 0xfd4: 0x1e13, 0xfd5: 0x1e18, 0xfd6: 0x1e1d, 0xfd7: 0x1e2c, + 0xfd8: 0x1e31, 0xfd9: 0x1e40, 0xfda: 0x1e45, 0xfdb: 0x1e4a, 0xfdc: 0x1e59, 0xfdd: 0x1e5e, + 0xfde: 0x1e63, 0xfdf: 0x1e6d, 0xfe0: 0x1ea9, 0xfe1: 0x1eb8, 0xfe2: 0x1ec7, 0xfe3: 0x1ecc, + 0xfe4: 0x1ed1, 0xfe5: 0x1edb, 0xfe6: 0x1eea, 0xfe7: 0x1eef, 0xfe8: 0x1efe, 0xfe9: 0x1f03, + 0xfea: 0x1f08, 0xfeb: 0x1f17, 0xfec: 0x1f1c, 0xfed: 0x1f2b, 0xfee: 0x1f30, 0xfef: 0x1f35, + 0xff0: 0x1f3a, 0xff1: 0x1f3f, 0xff2: 0x1f44, 0xff3: 0x1f49, 0xff4: 0x1f4e, 0xff5: 0x1f53, + 0xff6: 0x1f58, 0xff7: 0x1f5d, 0xff8: 0x1f62, 0xff9: 0x1f67, 0xffa: 0x1f6c, 0xffb: 0x1f71, + 0xffc: 0x1f76, 0xffd: 0x1f7b, 0xffe: 0x1f80, 0xfff: 0x1f8a, + // Block 0x40, offset 0x1000 + 0x1000: 0x1f8f, 0x1001: 0x1f94, 0x1002: 0x1f99, 0x1003: 0x1fa3, 0x1004: 0x1fa8, 0x1005: 0x1fb2, + 0x1006: 0x1fb7, 0x1007: 0x1fbc, 0x1008: 0x1fc1, 0x1009: 0x1fc6, 0x100a: 0x1fcb, 0x100b: 0x1fd0, + 0x100c: 0x1fd5, 0x100d: 0x1fda, 0x100e: 0x1fe9, 0x100f: 0x1ff8, 0x1010: 0x1ffd, 0x1011: 0x2002, + 0x1012: 0x2007, 0x1013: 0x200c, 0x1014: 0x2011, 0x1015: 0x201b, 0x1016: 0x2020, 0x1017: 0x2025, + 0x1018: 0x2034, 0x1019: 0x2043, 0x101a: 0x2048, 0x101b: 0x4423, 0x101c: 0x4429, 0x101d: 0x445f, + 0x101e: 0x44b6, 0x101f: 0x44bd, 0x1020: 0x44c4, 0x1021: 0x44cb, 0x1022: 0x44d2, 0x1023: 0x44d9, + 0x1024: 0x25c9, 0x1025: 0x25d0, 0x1026: 0x25d7, 0x1027: 0x25de, 0x1028: 0x25f3, 0x1029: 0x25fa, + 0x102a: 0x1d9b, 0x102b: 0x1da0, 0x102c: 0x1da5, 0x102d: 0x1daa, 0x102e: 0x1db4, 0x102f: 0x1db9, + 0x1030: 0x1dcd, 0x1031: 0x1dd2, 0x1032: 0x1dd7, 0x1033: 0x1ddc, 0x1034: 0x1de6, 0x1035: 0x1deb, + 0x1036: 0x1df5, 0x1037: 0x1dfa, 0x1038: 0x1dff, 0x1039: 0x1e04, 0x103a: 0x1e0e, 0x103b: 0x1e13, + 0x103c: 0x1f3f, 0x103d: 0x1f44, 0x103e: 0x1f53, 0x103f: 0x1f58, + // Block 0x41, offset 0x1040 + 0x1040: 0x1f5d, 0x1041: 0x1f71, 0x1042: 0x1f76, 0x1043: 0x1f7b, 0x1044: 0x1f80, 0x1045: 0x1f99, + 0x1046: 0x1fa3, 0x1047: 0x1fa8, 0x1048: 0x1fad, 0x1049: 0x1fc1, 0x104a: 0x1fdf, 0x104b: 0x1fe4, + 0x104c: 0x1fe9, 0x104d: 0x1fee, 0x104e: 0x1ff8, 0x104f: 0x1ffd, 0x1050: 0x445f, 0x1051: 0x202a, + 0x1052: 0x202f, 0x1053: 0x2034, 0x1054: 0x2039, 0x1055: 0x2043, 0x1056: 0x2048, 0x1057: 0x25b4, + 0x1058: 0x25bb, 0x1059: 0x25c2, 0x105a: 0x25d7, 0x105b: 0x25e5, 0x105c: 0x1d8c, 0x105d: 0x1d91, + 0x105e: 0x1d96, 0x105f: 0x1da5, 0x1060: 0x1daf, 0x1061: 0x1dbe, 0x1062: 0x1dc3, 0x1063: 0x1dc8, + 0x1064: 0x1dd7, 0x1065: 0x1de1, 0x1066: 0x1dff, 0x1067: 0x1e18, 0x1068: 0x1e1d, 0x1069: 0x1e2c, + 0x106a: 0x1e31, 0x106b: 0x1e40, 0x106c: 0x1e4a, 0x106d: 0x1e59, 0x106e: 0x1e5e, 0x106f: 0x1e63, + 0x1070: 0x1e6d, 0x1071: 0x1ea9, 0x1072: 0x1eae, 0x1073: 0x1eb8, 0x1074: 0x1ec7, 0x1075: 0x1ecc, + 0x1076: 0x1ed1, 0x1077: 0x1edb, 0x1078: 0x1eea, 0x1079: 0x1efe, 0x107a: 0x1f03, 0x107b: 0x1f08, + 0x107c: 0x1f17, 0x107d: 0x1f1c, 0x107e: 0x1f2b, 0x107f: 0x1f30, + // Block 0x42, offset 0x1080 + 0x1080: 0x1f35, 0x1081: 0x1f3a, 0x1082: 0x1f49, 0x1083: 0x1f4e, 0x1084: 0x1f62, 0x1085: 0x1f67, + 0x1086: 0x1f6c, 0x1087: 0x1f71, 0x1088: 0x1f76, 0x1089: 0x1f8a, 0x108a: 0x1f8f, 0x108b: 0x1f94, + 0x108c: 0x1f99, 0x108d: 0x1f9e, 0x108e: 0x1fb2, 0x108f: 0x1fb7, 0x1090: 0x1fbc, 0x1091: 0x1fc1, + 0x1092: 0x1fd0, 0x1093: 0x1fd5, 0x1094: 0x1fda, 0x1095: 0x1fe9, 0x1096: 0x1ff3, 0x1097: 0x2002, + 0x1098: 0x2007, 0x1099: 0x4453, 0x109a: 0x201b, 0x109b: 0x2020, 0x109c: 0x2025, 0x109d: 0x2034, + 0x109e: 0x203e, 0x109f: 0x25d7, 0x10a0: 0x25e5, 0x10a1: 0x1da5, 0x10a2: 0x1daf, 0x10a3: 0x1dd7, + 0x10a4: 0x1de1, 0x10a5: 0x1dff, 0x10a6: 0x1e09, 0x10a7: 0x1e6d, 0x10a8: 0x1e72, 0x10a9: 0x1e95, + 0x10aa: 0x1e9a, 0x10ab: 0x1f71, 0x10ac: 0x1f76, 0x10ad: 0x1f99, 0x10ae: 0x1fe9, 0x10af: 0x1ff3, + 0x10b0: 0x2034, 0x10b1: 0x203e, 0x10b2: 0x4507, 0x10b3: 0x450f, 0x10b4: 0x4517, 0x10b5: 0x1ef4, + 0x10b6: 0x1ef9, 0x10b7: 0x1f0d, 0x10b8: 0x1f12, 0x10b9: 0x1f21, 0x10ba: 0x1f26, 0x10bb: 0x1e77, + 0x10bc: 0x1e7c, 0x10bd: 0x1e9f, 0x10be: 0x1ea4, 0x10bf: 0x1e36, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x1e3b, 0x10c1: 0x1e22, 0x10c2: 0x1e27, 0x10c3: 0x1e4f, 0x10c4: 0x1e54, 0x10c5: 0x1ebd, + 0x10c6: 0x1ec2, 0x10c7: 0x1ee0, 0x10c8: 0x1ee5, 0x10c9: 0x1e81, 0x10ca: 0x1e86, 0x10cb: 0x1e8b, + 0x10cc: 0x1e95, 0x10cd: 0x1e90, 0x10ce: 0x1e68, 0x10cf: 0x1eb3, 0x10d0: 0x1ed6, 0x10d1: 0x1ef4, + 0x10d2: 0x1ef9, 0x10d3: 0x1f0d, 0x10d4: 0x1f12, 0x10d5: 0x1f21, 0x10d6: 0x1f26, 0x10d7: 0x1e77, + 0x10d8: 0x1e7c, 0x10d9: 0x1e9f, 0x10da: 0x1ea4, 0x10db: 0x1e36, 0x10dc: 0x1e3b, 0x10dd: 0x1e22, + 0x10de: 0x1e27, 0x10df: 0x1e4f, 0x10e0: 0x1e54, 0x10e1: 0x1ebd, 0x10e2: 0x1ec2, 0x10e3: 0x1ee0, + 0x10e4: 0x1ee5, 0x10e5: 0x1e81, 0x10e6: 0x1e86, 0x10e7: 0x1e8b, 0x10e8: 0x1e95, 0x10e9: 0x1e90, + 0x10ea: 0x1e68, 0x10eb: 0x1eb3, 0x10ec: 0x1ed6, 0x10ed: 0x1e81, 0x10ee: 0x1e86, 0x10ef: 0x1e8b, + 0x10f0: 0x1e95, 0x10f1: 0x1e72, 0x10f2: 0x1e9a, 0x10f3: 0x1eef, 0x10f4: 0x1e59, 0x10f5: 0x1e5e, + 0x10f6: 0x1e63, 0x10f7: 0x1e81, 0x10f8: 0x1e86, 0x10f9: 0x1e8b, 0x10fa: 0x1eef, 0x10fb: 0x1efe, + 0x10fc: 0x440b, 0x10fd: 0x440b, + // Block 0x44, offset 0x1100 + 0x1110: 0x2314, 0x1111: 0x2329, + 0x1112: 0x2329, 0x1113: 0x2330, 0x1114: 0x2337, 0x1115: 0x234c, 0x1116: 0x2353, 0x1117: 0x235a, + 0x1118: 0x237d, 0x1119: 0x237d, 0x111a: 0x23a0, 0x111b: 0x2399, 0x111c: 0x23b5, 0x111d: 0x23a7, + 0x111e: 0x23ae, 0x111f: 0x23d1, 0x1120: 0x23d1, 0x1121: 0x23ca, 0x1122: 0x23d8, 0x1123: 0x23d8, + 0x1124: 0x2402, 0x1125: 0x2402, 0x1126: 0x241e, 0x1127: 0x23e6, 0x1128: 0x23e6, 0x1129: 0x23df, + 0x112a: 0x23f4, 0x112b: 0x23f4, 0x112c: 0x23fb, 0x112d: 0x23fb, 0x112e: 0x2425, 0x112f: 0x2433, + 0x1130: 0x2433, 0x1131: 0x243a, 0x1132: 0x243a, 0x1133: 0x2441, 0x1134: 0x2448, 0x1135: 0x244f, + 0x1136: 0x2456, 0x1137: 0x2456, 0x1138: 0x245d, 0x1139: 0x246b, 0x113a: 0x2479, 0x113b: 0x2472, + 0x113c: 0x2480, 0x113d: 0x2480, 0x113e: 0x2495, 0x113f: 0x249c, + // Block 0x45, offset 0x1140 + 0x1140: 0x24cd, 0x1141: 0x24db, 0x1142: 0x24d4, 0x1143: 0x24b8, 0x1144: 0x24b8, 0x1145: 0x24e2, + 0x1146: 0x24e2, 0x1147: 0x24e9, 0x1148: 0x24e9, 0x1149: 0x2513, 0x114a: 0x251a, 0x114b: 0x2521, + 0x114c: 0x24f7, 0x114d: 0x2505, 0x114e: 0x2528, 0x114f: 0x252f, + 0x1152: 0x24fe, 0x1153: 0x2583, 0x1154: 0x258a, 0x1155: 0x2560, 0x1156: 0x2567, 0x1157: 0x254b, + 0x1158: 0x254b, 0x1159: 0x2552, 0x115a: 0x257c, 0x115b: 0x2575, 0x115c: 0x259f, 0x115d: 0x259f, + 0x115e: 0x230d, 0x115f: 0x2322, 0x1160: 0x231b, 0x1161: 0x2345, 0x1162: 0x233e, 0x1163: 0x2368, + 0x1164: 0x2361, 0x1165: 0x238b, 0x1166: 0x236f, 0x1167: 0x2384, 0x1168: 0x23bc, 0x1169: 0x2409, + 0x116a: 0x23ed, 0x116b: 0x242c, 0x116c: 0x24c6, 0x116d: 0x24f0, 0x116e: 0x2598, 0x116f: 0x2591, + 0x1170: 0x25a6, 0x1171: 0x253d, 0x1172: 0x24a3, 0x1173: 0x256e, 0x1174: 0x2495, 0x1175: 0x24cd, + 0x1176: 0x2464, 0x1177: 0x24b1, 0x1178: 0x2544, 0x1179: 0x2536, 0x117a: 0x24bf, 0x117b: 0x24aa, + 0x117c: 0x24bf, 0x117d: 0x2544, 0x117e: 0x2376, 0x117f: 0x2392, + // Block 0x46, offset 0x1180 + 0x1180: 0x250c, 0x1181: 0x2487, 0x1182: 0x2306, 0x1183: 0x24aa, 0x1184: 0x244f, 0x1185: 0x241e, + 0x1186: 0x23c3, 0x1187: 0x2559, + 0x11b0: 0x2417, 0x11b1: 0x248e, 0x11b2: 0x27c2, 0x11b3: 0x27b9, 0x11b4: 0x27ef, 0x11b5: 0x27dd, + 0x11b6: 0x27cb, 0x11b7: 0x27e6, 0x11b8: 0x27f8, 0x11b9: 0x2410, 0x11ba: 0x2c7f, 0x11bb: 0x2aff, + 0x11bc: 0x27d4, + // Block 0x47, offset 0x11c0 + 0x11d0: 0x0019, 0x11d1: 0x0483, + 0x11d2: 0x0487, 0x11d3: 0x0035, 0x11d4: 0x0037, 0x11d5: 0x0003, 0x11d6: 0x003f, 0x11d7: 0x04bf, + 0x11d8: 0x04c3, 0x11d9: 0x1b5f, + 0x11e0: 0x8132, 0x11e1: 0x8132, 0x11e2: 0x8132, 0x11e3: 0x8132, + 0x11e4: 0x8132, 0x11e5: 0x8132, 0x11e6: 0x8132, 0x11e7: 0x812d, 0x11e8: 0x812d, 0x11e9: 0x812d, + 0x11ea: 0x812d, 0x11eb: 0x812d, 0x11ec: 0x812d, 0x11ed: 0x812d, 0x11ee: 0x8132, 0x11ef: 0x8132, + 0x11f0: 0x1873, 0x11f1: 0x0443, 0x11f2: 0x043f, 0x11f3: 0x007f, 0x11f4: 0x007f, 0x11f5: 0x0011, + 0x11f6: 0x0013, 0x11f7: 0x00b7, 0x11f8: 0x00bb, 0x11f9: 0x04b7, 0x11fa: 0x04bb, 0x11fb: 0x04ab, + 0x11fc: 0x04af, 0x11fd: 0x0493, 0x11fe: 0x0497, 0x11ff: 0x048b, + // Block 0x48, offset 0x1200 + 0x1200: 0x048f, 0x1201: 0x049b, 0x1202: 0x049f, 0x1203: 0x04a3, 0x1204: 0x04a7, + 0x1207: 0x0077, 0x1208: 0x007b, 0x1209: 0x426c, 0x120a: 0x426c, 0x120b: 0x426c, + 0x120c: 0x426c, 0x120d: 0x007f, 0x120e: 0x007f, 0x120f: 0x007f, 0x1210: 0x0019, 0x1211: 0x0483, + 0x1212: 0x001d, 0x1214: 0x0037, 0x1215: 0x0035, 0x1216: 0x003f, 0x1217: 0x0003, + 0x1218: 0x0443, 0x1219: 0x0011, 0x121a: 0x0013, 0x121b: 0x00b7, 0x121c: 0x00bb, 0x121d: 0x04b7, + 0x121e: 0x04bb, 0x121f: 0x0007, 0x1220: 0x000d, 0x1221: 0x0015, 0x1222: 0x0017, 0x1223: 0x001b, + 0x1224: 0x0039, 0x1225: 0x003d, 0x1226: 0x003b, 0x1228: 0x0079, 0x1229: 0x0009, + 0x122a: 0x000b, 0x122b: 0x0041, + 0x1230: 0x42ad, 0x1231: 0x442f, 0x1232: 0x42b2, 0x1234: 0x42b7, + 0x1236: 0x42bc, 0x1237: 0x4435, 0x1238: 0x42c1, 0x1239: 0x443b, 0x123a: 0x42c6, 0x123b: 0x4441, + 0x123c: 0x42cb, 0x123d: 0x4447, 0x123e: 0x42d0, 0x123f: 0x444d, + // Block 0x49, offset 0x1240 + 0x1240: 0x0236, 0x1241: 0x4411, 0x1242: 0x4411, 0x1243: 0x4417, 0x1244: 0x4417, 0x1245: 0x4459, + 0x1246: 0x4459, 0x1247: 0x441d, 0x1248: 0x441d, 0x1249: 0x4465, 0x124a: 0x4465, 0x124b: 0x4465, + 0x124c: 0x4465, 0x124d: 0x0239, 0x124e: 0x0239, 0x124f: 0x023c, 0x1250: 0x023c, 0x1251: 0x023c, + 0x1252: 0x023c, 0x1253: 0x023f, 0x1254: 0x023f, 0x1255: 0x0242, 0x1256: 0x0242, 0x1257: 0x0242, + 0x1258: 0x0242, 0x1259: 0x0245, 0x125a: 0x0245, 0x125b: 0x0245, 0x125c: 0x0245, 0x125d: 0x0248, + 0x125e: 0x0248, 0x125f: 0x0248, 0x1260: 0x0248, 0x1261: 0x024b, 0x1262: 0x024b, 0x1263: 0x024b, + 0x1264: 0x024b, 0x1265: 0x024e, 0x1266: 0x024e, 0x1267: 0x024e, 0x1268: 0x024e, 0x1269: 0x0251, + 0x126a: 0x0251, 0x126b: 0x0254, 0x126c: 0x0254, 0x126d: 0x0257, 0x126e: 0x0257, 0x126f: 0x025a, + 0x1270: 0x025a, 0x1271: 0x025d, 0x1272: 0x025d, 0x1273: 0x025d, 0x1274: 0x025d, 0x1275: 0x0260, + 0x1276: 0x0260, 0x1277: 0x0260, 0x1278: 0x0260, 0x1279: 0x0263, 0x127a: 0x0263, 0x127b: 0x0263, + 0x127c: 0x0263, 0x127d: 0x0266, 0x127e: 0x0266, 0x127f: 0x0266, + // Block 0x4a, offset 0x1280 + 0x1280: 0x0266, 0x1281: 0x0269, 0x1282: 0x0269, 0x1283: 0x0269, 0x1284: 0x0269, 0x1285: 0x026c, + 0x1286: 0x026c, 0x1287: 0x026c, 0x1288: 0x026c, 0x1289: 0x026f, 0x128a: 0x026f, 0x128b: 0x026f, + 0x128c: 0x026f, 0x128d: 0x0272, 0x128e: 0x0272, 0x128f: 0x0272, 0x1290: 0x0272, 0x1291: 0x0275, + 0x1292: 0x0275, 0x1293: 0x0275, 0x1294: 0x0275, 0x1295: 0x0278, 0x1296: 0x0278, 0x1297: 0x0278, + 0x1298: 0x0278, 0x1299: 0x027b, 0x129a: 0x027b, 0x129b: 0x027b, 0x129c: 0x027b, 0x129d: 0x027e, + 0x129e: 0x027e, 0x129f: 0x027e, 0x12a0: 0x027e, 0x12a1: 0x0281, 0x12a2: 0x0281, 0x12a3: 0x0281, + 0x12a4: 0x0281, 0x12a5: 0x0284, 0x12a6: 0x0284, 0x12a7: 0x0284, 0x12a8: 0x0284, 0x12a9: 0x0287, + 0x12aa: 0x0287, 0x12ab: 0x0287, 0x12ac: 0x0287, 0x12ad: 0x028a, 0x12ae: 0x028a, 0x12af: 0x028d, + 0x12b0: 0x028d, 0x12b1: 0x0290, 0x12b2: 0x0290, 0x12b3: 0x0290, 0x12b4: 0x0290, 0x12b5: 0x2e03, + 0x12b6: 0x2e03, 0x12b7: 0x2e0b, 0x12b8: 0x2e0b, 0x12b9: 0x2e13, 0x12ba: 0x2e13, 0x12bb: 0x1f85, + 0x12bc: 0x1f85, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x0081, 0x12c1: 0x0083, 0x12c2: 0x0085, 0x12c3: 0x0087, 0x12c4: 0x0089, 0x12c5: 0x008b, + 0x12c6: 0x008d, 0x12c7: 0x008f, 0x12c8: 0x0091, 0x12c9: 0x0093, 0x12ca: 0x0095, 0x12cb: 0x0097, + 0x12cc: 0x0099, 0x12cd: 0x009b, 0x12ce: 0x009d, 0x12cf: 0x009f, 0x12d0: 0x00a1, 0x12d1: 0x00a3, + 0x12d2: 0x00a5, 0x12d3: 0x00a7, 0x12d4: 0x00a9, 0x12d5: 0x00ab, 0x12d6: 0x00ad, 0x12d7: 0x00af, + 0x12d8: 0x00b1, 0x12d9: 0x00b3, 0x12da: 0x00b5, 0x12db: 0x00b7, 0x12dc: 0x00b9, 0x12dd: 0x00bb, + 0x12de: 0x00bd, 0x12df: 0x0477, 0x12e0: 0x047b, 0x12e1: 0x0487, 0x12e2: 0x049b, 0x12e3: 0x049f, + 0x12e4: 0x0483, 0x12e5: 0x05ab, 0x12e6: 0x05a3, 0x12e7: 0x04c7, 0x12e8: 0x04cf, 0x12e9: 0x04d7, + 0x12ea: 0x04df, 0x12eb: 0x04e7, 0x12ec: 0x056b, 0x12ed: 0x0573, 0x12ee: 0x057b, 0x12ef: 0x051f, + 0x12f0: 0x05af, 0x12f1: 0x04cb, 0x12f2: 0x04d3, 0x12f3: 0x04db, 0x12f4: 0x04e3, 0x12f5: 0x04eb, + 0x12f6: 0x04ef, 0x12f7: 0x04f3, 0x12f8: 0x04f7, 0x12f9: 0x04fb, 0x12fa: 0x04ff, 0x12fb: 0x0503, + 0x12fc: 0x0507, 0x12fd: 0x050b, 0x12fe: 0x050f, 0x12ff: 0x0513, + // Block 0x4c, offset 0x1300 + 0x1300: 0x0517, 0x1301: 0x051b, 0x1302: 0x0523, 0x1303: 0x0527, 0x1304: 0x052b, 0x1305: 0x052f, + 0x1306: 0x0533, 0x1307: 0x0537, 0x1308: 0x053b, 0x1309: 0x053f, 0x130a: 0x0543, 0x130b: 0x0547, + 0x130c: 0x054b, 0x130d: 0x054f, 0x130e: 0x0553, 0x130f: 0x0557, 0x1310: 0x055b, 0x1311: 0x055f, + 0x1312: 0x0563, 0x1313: 0x0567, 0x1314: 0x056f, 0x1315: 0x0577, 0x1316: 0x057f, 0x1317: 0x0583, + 0x1318: 0x0587, 0x1319: 0x058b, 0x131a: 0x058f, 0x131b: 0x0593, 0x131c: 0x0597, 0x131d: 0x05a7, + 0x131e: 0x4a7b, 0x131f: 0x4a81, 0x1320: 0x03c3, 0x1321: 0x0313, 0x1322: 0x0317, 0x1323: 0x4a3e, + 0x1324: 0x031b, 0x1325: 0x4a44, 0x1326: 0x4a4a, 0x1327: 0x031f, 0x1328: 0x0323, 0x1329: 0x0327, + 0x132a: 0x4a50, 0x132b: 0x4a56, 0x132c: 0x4a5c, 0x132d: 0x4a62, 0x132e: 0x4a68, 0x132f: 0x4a6e, + 0x1330: 0x0367, 0x1331: 0x032b, 0x1332: 0x032f, 0x1333: 0x0333, 0x1334: 0x037b, 0x1335: 0x0337, + 0x1336: 0x033b, 0x1337: 0x033f, 0x1338: 0x0343, 0x1339: 0x0347, 0x133a: 0x034b, 0x133b: 0x034f, + 0x133c: 0x0353, 0x133d: 0x0357, 0x133e: 0x035b, + // Block 0x4d, offset 0x1340 + 0x1342: 0x49c0, 0x1343: 0x49c6, 0x1344: 0x49cc, 0x1345: 0x49d2, + 0x1346: 0x49d8, 0x1347: 0x49de, 0x134a: 0x49e4, 0x134b: 0x49ea, + 0x134c: 0x49f0, 0x134d: 0x49f6, 0x134e: 0x49fc, 0x134f: 0x4a02, + 0x1352: 0x4a08, 0x1353: 0x4a0e, 0x1354: 0x4a14, 0x1355: 0x4a1a, 0x1356: 0x4a20, 0x1357: 0x4a26, + 0x135a: 0x4a2c, 0x135b: 0x4a32, 0x135c: 0x4a38, + 0x1360: 0x00bf, 0x1361: 0x00c2, 0x1362: 0x00cb, 0x1363: 0x4267, + 0x1364: 0x00c8, 0x1365: 0x00c5, 0x1366: 0x0447, 0x1368: 0x046b, 0x1369: 0x044b, + 0x136a: 0x044f, 0x136b: 0x0453, 0x136c: 0x0457, 0x136d: 0x046f, 0x136e: 0x0473, + // Block 0x4e, offset 0x1380 + 0x1380: 0x0063, 0x1381: 0x0065, 0x1382: 0x0067, 0x1383: 0x0069, 0x1384: 0x006b, 0x1385: 0x006d, + 0x1386: 0x006f, 0x1387: 0x0071, 0x1388: 0x0073, 0x1389: 0x0075, 0x138a: 0x0083, 0x138b: 0x0085, + 0x138c: 0x0087, 0x138d: 0x0089, 0x138e: 0x008b, 0x138f: 0x008d, 0x1390: 0x008f, 0x1391: 0x0091, + 0x1392: 0x0093, 0x1393: 0x0095, 0x1394: 0x0097, 0x1395: 0x0099, 0x1396: 0x009b, 0x1397: 0x009d, + 0x1398: 0x009f, 0x1399: 0x00a1, 0x139a: 0x00a3, 0x139b: 0x00a5, 0x139c: 0x00a7, 0x139d: 0x00a9, + 0x139e: 0x00ab, 0x139f: 0x00ad, 0x13a0: 0x00af, 0x13a1: 0x00b1, 0x13a2: 0x00b3, 0x13a3: 0x00b5, + 0x13a4: 0x00dd, 0x13a5: 0x00f2, 0x13a8: 0x0173, 0x13a9: 0x0176, + 0x13aa: 0x0179, 0x13ab: 0x017c, 0x13ac: 0x017f, 0x13ad: 0x0182, 0x13ae: 0x0185, 0x13af: 0x0188, + 0x13b0: 0x018b, 0x13b1: 0x018e, 0x13b2: 0x0191, 0x13b3: 0x0194, 0x13b4: 0x0197, 0x13b5: 0x019a, + 0x13b6: 0x019d, 0x13b7: 0x01a0, 0x13b8: 0x01a3, 0x13b9: 0x0188, 0x13ba: 0x01a6, 0x13bb: 0x01a9, + 0x13bc: 0x01ac, 0x13bd: 0x01af, 0x13be: 0x01b2, 0x13bf: 0x01b5, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x01fd, 0x13c1: 0x0200, 0x13c2: 0x0203, 0x13c3: 0x045b, 0x13c4: 0x01c7, 0x13c5: 0x01d0, + 0x13c6: 0x01d6, 0x13c7: 0x01fa, 0x13c8: 0x01eb, 0x13c9: 0x01e8, 0x13ca: 0x0206, 0x13cb: 0x0209, + 0x13ce: 0x0021, 0x13cf: 0x0023, 0x13d0: 0x0025, 0x13d1: 0x0027, + 0x13d2: 0x0029, 0x13d3: 0x002b, 0x13d4: 0x002d, 0x13d5: 0x002f, 0x13d6: 0x0031, 0x13d7: 0x0033, + 0x13d8: 0x0021, 0x13d9: 0x0023, 0x13da: 0x0025, 0x13db: 0x0027, 0x13dc: 0x0029, 0x13dd: 0x002b, + 0x13de: 0x002d, 0x13df: 0x002f, 0x13e0: 0x0031, 0x13e1: 0x0033, 0x13e2: 0x0021, 0x13e3: 0x0023, + 0x13e4: 0x0025, 0x13e5: 0x0027, 0x13e6: 0x0029, 0x13e7: 0x002b, 0x13e8: 0x002d, 0x13e9: 0x002f, + 0x13ea: 0x0031, 0x13eb: 0x0033, 0x13ec: 0x0021, 0x13ed: 0x0023, 0x13ee: 0x0025, 0x13ef: 0x0027, + 0x13f0: 0x0029, 0x13f1: 0x002b, 0x13f2: 0x002d, 0x13f3: 0x002f, 0x13f4: 0x0031, 0x13f5: 0x0033, + 0x13f6: 0x0021, 0x13f7: 0x0023, 0x13f8: 0x0025, 0x13f9: 0x0027, 0x13fa: 0x0029, 0x13fb: 0x002b, + 0x13fc: 0x002d, 0x13fd: 0x002f, 0x13fe: 0x0031, 0x13ff: 0x0033, + // Block 0x50, offset 0x1400 + 0x1400: 0x0239, 0x1401: 0x023c, 0x1402: 0x0248, 0x1403: 0x0251, 0x1405: 0x028a, + 0x1406: 0x025a, 0x1407: 0x024b, 0x1408: 0x0269, 0x1409: 0x0290, 0x140a: 0x027b, 0x140b: 0x027e, + 0x140c: 0x0281, 0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1410: 0x0275, 0x1411: 0x0263, + 0x1412: 0x0278, 0x1413: 0x0257, 0x1414: 0x0260, 0x1415: 0x0242, 0x1416: 0x0245, 0x1417: 0x024e, + 0x1418: 0x0254, 0x1419: 0x0266, 0x141a: 0x026c, 0x141b: 0x0272, 0x141c: 0x0293, 0x141d: 0x02e4, + 0x141e: 0x02cc, 0x141f: 0x0296, 0x1421: 0x023c, 0x1422: 0x0248, + 0x1424: 0x0287, 0x1427: 0x024b, 0x1429: 0x0290, + 0x142a: 0x027b, 0x142b: 0x027e, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f, + 0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1434: 0x0260, 0x1435: 0x0242, + 0x1436: 0x0245, 0x1437: 0x024e, 0x1439: 0x0266, 0x143b: 0x0272, + // Block 0x51, offset 0x1440 + 0x1442: 0x0248, + 0x1447: 0x024b, 0x1449: 0x0290, 0x144b: 0x027e, + 0x144d: 0x0284, 0x144e: 0x025d, 0x144f: 0x026f, 0x1451: 0x0263, + 0x1452: 0x0278, 0x1454: 0x0260, 0x1457: 0x024e, + 0x1459: 0x0266, 0x145b: 0x0272, 0x145d: 0x02e4, + 0x145f: 0x0296, 0x1461: 0x023c, 0x1462: 0x0248, + 0x1464: 0x0287, 0x1467: 0x024b, 0x1468: 0x0269, 0x1469: 0x0290, + 0x146a: 0x027b, 0x146c: 0x0281, 0x146d: 0x0284, 0x146e: 0x025d, 0x146f: 0x026f, + 0x1470: 0x0275, 0x1471: 0x0263, 0x1472: 0x0278, 0x1474: 0x0260, 0x1475: 0x0242, + 0x1476: 0x0245, 0x1477: 0x024e, 0x1479: 0x0266, 0x147a: 0x026c, 0x147b: 0x0272, + 0x147c: 0x0293, 0x147e: 0x02cc, + // Block 0x52, offset 0x1480 + 0x1480: 0x0239, 0x1481: 0x023c, 0x1482: 0x0248, 0x1483: 0x0251, 0x1484: 0x0287, 0x1485: 0x028a, + 0x1486: 0x025a, 0x1487: 0x024b, 0x1488: 0x0269, 0x1489: 0x0290, 0x148b: 0x027e, + 0x148c: 0x0281, 0x148d: 0x0284, 0x148e: 0x025d, 0x148f: 0x026f, 0x1490: 0x0275, 0x1491: 0x0263, + 0x1492: 0x0278, 0x1493: 0x0257, 0x1494: 0x0260, 0x1495: 0x0242, 0x1496: 0x0245, 0x1497: 0x024e, + 0x1498: 0x0254, 0x1499: 0x0266, 0x149a: 0x026c, 0x149b: 0x0272, + 0x14a1: 0x023c, 0x14a2: 0x0248, 0x14a3: 0x0251, + 0x14a5: 0x028a, 0x14a6: 0x025a, 0x14a7: 0x024b, 0x14a8: 0x0269, 0x14a9: 0x0290, + 0x14ab: 0x027e, 0x14ac: 0x0281, 0x14ad: 0x0284, 0x14ae: 0x025d, 0x14af: 0x026f, + 0x14b0: 0x0275, 0x14b1: 0x0263, 0x14b2: 0x0278, 0x14b3: 0x0257, 0x14b4: 0x0260, 0x14b5: 0x0242, + 0x14b6: 0x0245, 0x14b7: 0x024e, 0x14b8: 0x0254, 0x14b9: 0x0266, 0x14ba: 0x026c, 0x14bb: 0x0272, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x1879, 0x14c1: 0x1876, 0x14c2: 0x187c, 0x14c3: 0x18a0, 0x14c4: 0x18c4, 0x14c5: 0x18e8, + 0x14c6: 0x190c, 0x14c7: 0x1915, 0x14c8: 0x191b, 0x14c9: 0x1921, 0x14ca: 0x1927, + 0x14d0: 0x1a8f, 0x14d1: 0x1a93, + 0x14d2: 0x1a97, 0x14d3: 0x1a9b, 0x14d4: 0x1a9f, 0x14d5: 0x1aa3, 0x14d6: 0x1aa7, 0x14d7: 0x1aab, + 0x14d8: 0x1aaf, 0x14d9: 0x1ab3, 0x14da: 0x1ab7, 0x14db: 0x1abb, 0x14dc: 0x1abf, 0x14dd: 0x1ac3, + 0x14de: 0x1ac7, 0x14df: 0x1acb, 0x14e0: 0x1acf, 0x14e1: 0x1ad3, 0x14e2: 0x1ad7, 0x14e3: 0x1adb, + 0x14e4: 0x1adf, 0x14e5: 0x1ae3, 0x14e6: 0x1ae7, 0x14e7: 0x1aeb, 0x14e8: 0x1aef, 0x14e9: 0x1af3, + 0x14ea: 0x2721, 0x14eb: 0x0047, 0x14ec: 0x0065, 0x14ed: 0x193c, 0x14ee: 0x19b4, + 0x14f0: 0x0043, 0x14f1: 0x0045, 0x14f2: 0x0047, 0x14f3: 0x0049, 0x14f4: 0x004b, 0x14f5: 0x004d, + 0x14f6: 0x004f, 0x14f7: 0x0051, 0x14f8: 0x0053, 0x14f9: 0x0055, 0x14fa: 0x0057, 0x14fb: 0x0059, + 0x14fc: 0x005b, 0x14fd: 0x005d, 0x14fe: 0x005f, 0x14ff: 0x0061, + // Block 0x54, offset 0x1500 + 0x1500: 0x26b0, 0x1501: 0x26c5, 0x1502: 0x0503, + 0x1510: 0x0c0f, 0x1511: 0x0a47, + 0x1512: 0x08d3, 0x1513: 0x45c7, 0x1514: 0x071b, 0x1515: 0x09ef, 0x1516: 0x132f, 0x1517: 0x09ff, + 0x1518: 0x0727, 0x1519: 0x0cd7, 0x151a: 0x0eaf, 0x151b: 0x0caf, 0x151c: 0x0827, 0x151d: 0x0b6b, + 0x151e: 0x07bf, 0x151f: 0x0cb7, 0x1520: 0x0813, 0x1521: 0x1117, 0x1522: 0x0f83, 0x1523: 0x138b, + 0x1524: 0x09d3, 0x1525: 0x090b, 0x1526: 0x0e63, 0x1527: 0x0c1b, 0x1528: 0x0c47, 0x1529: 0x06bf, + 0x152a: 0x06cb, 0x152b: 0x140b, 0x152c: 0x0adb, 0x152d: 0x06e7, 0x152e: 0x08ef, 0x152f: 0x0c3b, + 0x1530: 0x13b3, 0x1531: 0x0c13, 0x1532: 0x106f, 0x1533: 0x10ab, 0x1534: 0x08f7, 0x1535: 0x0e43, + 0x1536: 0x0d0b, 0x1537: 0x0d07, 0x1538: 0x0f97, 0x1539: 0x082b, 0x153a: 0x0957, 0x153b: 0x1443, + // Block 0x55, offset 0x1540 + 0x1540: 0x06fb, 0x1541: 0x06f3, 0x1542: 0x0703, 0x1543: 0x1647, 0x1544: 0x0747, 0x1545: 0x0757, + 0x1546: 0x075b, 0x1547: 0x0763, 0x1548: 0x076b, 0x1549: 0x076f, 0x154a: 0x077b, 0x154b: 0x0773, + 0x154c: 0x05b3, 0x154d: 0x165b, 0x154e: 0x078f, 0x154f: 0x0793, 0x1550: 0x0797, 0x1551: 0x07b3, + 0x1552: 0x164c, 0x1553: 0x05b7, 0x1554: 0x079f, 0x1555: 0x07bf, 0x1556: 0x1656, 0x1557: 0x07cf, + 0x1558: 0x07d7, 0x1559: 0x0737, 0x155a: 0x07df, 0x155b: 0x07e3, 0x155c: 0x1831, 0x155d: 0x07ff, + 0x155e: 0x0807, 0x155f: 0x05bf, 0x1560: 0x081f, 0x1561: 0x0823, 0x1562: 0x082b, 0x1563: 0x082f, + 0x1564: 0x05c3, 0x1565: 0x0847, 0x1566: 0x084b, 0x1567: 0x0857, 0x1568: 0x0863, 0x1569: 0x0867, + 0x156a: 0x086b, 0x156b: 0x0873, 0x156c: 0x0893, 0x156d: 0x0897, 0x156e: 0x089f, 0x156f: 0x08af, + 0x1570: 0x08b7, 0x1571: 0x08bb, 0x1572: 0x08bb, 0x1573: 0x08bb, 0x1574: 0x166a, 0x1575: 0x0e93, + 0x1576: 0x08cf, 0x1577: 0x08d7, 0x1578: 0x166f, 0x1579: 0x08e3, 0x157a: 0x08eb, 0x157b: 0x08f3, + 0x157c: 0x091b, 0x157d: 0x0907, 0x157e: 0x0913, 0x157f: 0x0917, + // Block 0x56, offset 0x1580 + 0x1580: 0x091f, 0x1581: 0x0927, 0x1582: 0x092b, 0x1583: 0x0933, 0x1584: 0x093b, 0x1585: 0x093f, + 0x1586: 0x093f, 0x1587: 0x0947, 0x1588: 0x094f, 0x1589: 0x0953, 0x158a: 0x095f, 0x158b: 0x0983, + 0x158c: 0x0967, 0x158d: 0x0987, 0x158e: 0x096b, 0x158f: 0x0973, 0x1590: 0x080b, 0x1591: 0x09cf, + 0x1592: 0x0997, 0x1593: 0x099b, 0x1594: 0x099f, 0x1595: 0x0993, 0x1596: 0x09a7, 0x1597: 0x09a3, + 0x1598: 0x09bb, 0x1599: 0x1674, 0x159a: 0x09d7, 0x159b: 0x09db, 0x159c: 0x09e3, 0x159d: 0x09ef, + 0x159e: 0x09f7, 0x159f: 0x0a13, 0x15a0: 0x1679, 0x15a1: 0x167e, 0x15a2: 0x0a1f, 0x15a3: 0x0a23, + 0x15a4: 0x0a27, 0x15a5: 0x0a1b, 0x15a6: 0x0a2f, 0x15a7: 0x05c7, 0x15a8: 0x05cb, 0x15a9: 0x0a37, + 0x15aa: 0x0a3f, 0x15ab: 0x0a3f, 0x15ac: 0x1683, 0x15ad: 0x0a5b, 0x15ae: 0x0a5f, 0x15af: 0x0a63, + 0x15b0: 0x0a6b, 0x15b1: 0x1688, 0x15b2: 0x0a73, 0x15b3: 0x0a77, 0x15b4: 0x0b4f, 0x15b5: 0x0a7f, + 0x15b6: 0x05cf, 0x15b7: 0x0a8b, 0x15b8: 0x0a9b, 0x15b9: 0x0aa7, 0x15ba: 0x0aa3, 0x15bb: 0x1692, + 0x15bc: 0x0aaf, 0x15bd: 0x1697, 0x15be: 0x0abb, 0x15bf: 0x0ab7, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x0abf, 0x15c1: 0x0acf, 0x15c2: 0x0ad3, 0x15c3: 0x05d3, 0x15c4: 0x0ae3, 0x15c5: 0x0aeb, + 0x15c6: 0x0aef, 0x15c7: 0x0af3, 0x15c8: 0x05d7, 0x15c9: 0x169c, 0x15ca: 0x05db, 0x15cb: 0x0b0f, + 0x15cc: 0x0b13, 0x15cd: 0x0b17, 0x15ce: 0x0b1f, 0x15cf: 0x1863, 0x15d0: 0x0b37, 0x15d1: 0x16a6, + 0x15d2: 0x16a6, 0x15d3: 0x11d7, 0x15d4: 0x0b47, 0x15d5: 0x0b47, 0x15d6: 0x05df, 0x15d7: 0x16c9, + 0x15d8: 0x179b, 0x15d9: 0x0b57, 0x15da: 0x0b5f, 0x15db: 0x05e3, 0x15dc: 0x0b73, 0x15dd: 0x0b83, + 0x15de: 0x0b87, 0x15df: 0x0b8f, 0x15e0: 0x0b9f, 0x15e1: 0x05eb, 0x15e2: 0x05e7, 0x15e3: 0x0ba3, + 0x15e4: 0x16ab, 0x15e5: 0x0ba7, 0x15e6: 0x0bbb, 0x15e7: 0x0bbf, 0x15e8: 0x0bc3, 0x15e9: 0x0bbf, + 0x15ea: 0x0bcf, 0x15eb: 0x0bd3, 0x15ec: 0x0be3, 0x15ed: 0x0bdb, 0x15ee: 0x0bdf, 0x15ef: 0x0be7, + 0x15f0: 0x0beb, 0x15f1: 0x0bef, 0x15f2: 0x0bfb, 0x15f3: 0x0bff, 0x15f4: 0x0c17, 0x15f5: 0x0c1f, + 0x15f6: 0x0c2f, 0x15f7: 0x0c43, 0x15f8: 0x16ba, 0x15f9: 0x0c3f, 0x15fa: 0x0c33, 0x15fb: 0x0c4b, + 0x15fc: 0x0c53, 0x15fd: 0x0c67, 0x15fe: 0x16bf, 0x15ff: 0x0c6f, + // Block 0x58, offset 0x1600 + 0x1600: 0x0c63, 0x1601: 0x0c5b, 0x1602: 0x05ef, 0x1603: 0x0c77, 0x1604: 0x0c7f, 0x1605: 0x0c87, + 0x1606: 0x0c7b, 0x1607: 0x05f3, 0x1608: 0x0c97, 0x1609: 0x0c9f, 0x160a: 0x16c4, 0x160b: 0x0ccb, + 0x160c: 0x0cff, 0x160d: 0x0cdb, 0x160e: 0x05ff, 0x160f: 0x0ce7, 0x1610: 0x05fb, 0x1611: 0x05f7, + 0x1612: 0x07c3, 0x1613: 0x07c7, 0x1614: 0x0d03, 0x1615: 0x0ceb, 0x1616: 0x11ab, 0x1617: 0x0663, + 0x1618: 0x0d0f, 0x1619: 0x0d13, 0x161a: 0x0d17, 0x161b: 0x0d2b, 0x161c: 0x0d23, 0x161d: 0x16dd, + 0x161e: 0x0603, 0x161f: 0x0d3f, 0x1620: 0x0d33, 0x1621: 0x0d4f, 0x1622: 0x0d57, 0x1623: 0x16e7, + 0x1624: 0x0d5b, 0x1625: 0x0d47, 0x1626: 0x0d63, 0x1627: 0x0607, 0x1628: 0x0d67, 0x1629: 0x0d6b, + 0x162a: 0x0d6f, 0x162b: 0x0d7b, 0x162c: 0x16ec, 0x162d: 0x0d83, 0x162e: 0x060b, 0x162f: 0x0d8f, + 0x1630: 0x16f1, 0x1631: 0x0d93, 0x1632: 0x060f, 0x1633: 0x0d9f, 0x1634: 0x0dab, 0x1635: 0x0db7, + 0x1636: 0x0dbb, 0x1637: 0x16f6, 0x1638: 0x168d, 0x1639: 0x16fb, 0x163a: 0x0ddb, 0x163b: 0x1700, + 0x163c: 0x0de7, 0x163d: 0x0def, 0x163e: 0x0ddf, 0x163f: 0x0dfb, + // Block 0x59, offset 0x1640 + 0x1640: 0x0e0b, 0x1641: 0x0e1b, 0x1642: 0x0e0f, 0x1643: 0x0e13, 0x1644: 0x0e1f, 0x1645: 0x0e23, + 0x1646: 0x1705, 0x1647: 0x0e07, 0x1648: 0x0e3b, 0x1649: 0x0e3f, 0x164a: 0x0613, 0x164b: 0x0e53, + 0x164c: 0x0e4f, 0x164d: 0x170a, 0x164e: 0x0e33, 0x164f: 0x0e6f, 0x1650: 0x170f, 0x1651: 0x1714, + 0x1652: 0x0e73, 0x1653: 0x0e87, 0x1654: 0x0e83, 0x1655: 0x0e7f, 0x1656: 0x0617, 0x1657: 0x0e8b, + 0x1658: 0x0e9b, 0x1659: 0x0e97, 0x165a: 0x0ea3, 0x165b: 0x1651, 0x165c: 0x0eb3, 0x165d: 0x1719, + 0x165e: 0x0ebf, 0x165f: 0x1723, 0x1660: 0x0ed3, 0x1661: 0x0edf, 0x1662: 0x0ef3, 0x1663: 0x1728, + 0x1664: 0x0f07, 0x1665: 0x0f0b, 0x1666: 0x172d, 0x1667: 0x1732, 0x1668: 0x0f27, 0x1669: 0x0f37, + 0x166a: 0x061b, 0x166b: 0x0f3b, 0x166c: 0x061f, 0x166d: 0x061f, 0x166e: 0x0f53, 0x166f: 0x0f57, + 0x1670: 0x0f5f, 0x1671: 0x0f63, 0x1672: 0x0f6f, 0x1673: 0x0623, 0x1674: 0x0f87, 0x1675: 0x1737, + 0x1676: 0x0fa3, 0x1677: 0x173c, 0x1678: 0x0faf, 0x1679: 0x16a1, 0x167a: 0x0fbf, 0x167b: 0x1741, + 0x167c: 0x1746, 0x167d: 0x174b, 0x167e: 0x0627, 0x167f: 0x062b, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0ff7, 0x1681: 0x1755, 0x1682: 0x1750, 0x1683: 0x175a, 0x1684: 0x175f, 0x1685: 0x0fff, + 0x1686: 0x1003, 0x1687: 0x1003, 0x1688: 0x100b, 0x1689: 0x0633, 0x168a: 0x100f, 0x168b: 0x0637, + 0x168c: 0x063b, 0x168d: 0x1769, 0x168e: 0x1023, 0x168f: 0x102b, 0x1690: 0x1037, 0x1691: 0x063f, + 0x1692: 0x176e, 0x1693: 0x105b, 0x1694: 0x1773, 0x1695: 0x1778, 0x1696: 0x107b, 0x1697: 0x1093, + 0x1698: 0x0643, 0x1699: 0x109b, 0x169a: 0x109f, 0x169b: 0x10a3, 0x169c: 0x177d, 0x169d: 0x1782, + 0x169e: 0x1782, 0x169f: 0x10bb, 0x16a0: 0x0647, 0x16a1: 0x1787, 0x16a2: 0x10cf, 0x16a3: 0x10d3, + 0x16a4: 0x064b, 0x16a5: 0x178c, 0x16a6: 0x10ef, 0x16a7: 0x064f, 0x16a8: 0x10ff, 0x16a9: 0x10f7, + 0x16aa: 0x1107, 0x16ab: 0x1796, 0x16ac: 0x111f, 0x16ad: 0x0653, 0x16ae: 0x112b, 0x16af: 0x1133, + 0x16b0: 0x1143, 0x16b1: 0x0657, 0x16b2: 0x17a0, 0x16b3: 0x17a5, 0x16b4: 0x065b, 0x16b5: 0x17aa, + 0x16b6: 0x115b, 0x16b7: 0x17af, 0x16b8: 0x1167, 0x16b9: 0x1173, 0x16ba: 0x117b, 0x16bb: 0x17b4, + 0x16bc: 0x17b9, 0x16bd: 0x118f, 0x16be: 0x17be, 0x16bf: 0x1197, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x16ce, 0x16c1: 0x065f, 0x16c2: 0x11af, 0x16c3: 0x11b3, 0x16c4: 0x0667, 0x16c5: 0x11b7, + 0x16c6: 0x0a33, 0x16c7: 0x17c3, 0x16c8: 0x17c8, 0x16c9: 0x16d3, 0x16ca: 0x16d8, 0x16cb: 0x11d7, + 0x16cc: 0x11db, 0x16cd: 0x13f3, 0x16ce: 0x066b, 0x16cf: 0x1207, 0x16d0: 0x1203, 0x16d1: 0x120b, + 0x16d2: 0x083f, 0x16d3: 0x120f, 0x16d4: 0x1213, 0x16d5: 0x1217, 0x16d6: 0x121f, 0x16d7: 0x17cd, + 0x16d8: 0x121b, 0x16d9: 0x1223, 0x16da: 0x1237, 0x16db: 0x123b, 0x16dc: 0x1227, 0x16dd: 0x123f, + 0x16de: 0x1253, 0x16df: 0x1267, 0x16e0: 0x1233, 0x16e1: 0x1247, 0x16e2: 0x124b, 0x16e3: 0x124f, + 0x16e4: 0x17d2, 0x16e5: 0x17dc, 0x16e6: 0x17d7, 0x16e7: 0x066f, 0x16e8: 0x126f, 0x16e9: 0x1273, + 0x16ea: 0x127b, 0x16eb: 0x17f0, 0x16ec: 0x127f, 0x16ed: 0x17e1, 0x16ee: 0x0673, 0x16ef: 0x0677, + 0x16f0: 0x17e6, 0x16f1: 0x17eb, 0x16f2: 0x067b, 0x16f3: 0x129f, 0x16f4: 0x12a3, 0x16f5: 0x12a7, + 0x16f6: 0x12ab, 0x16f7: 0x12b7, 0x16f8: 0x12b3, 0x16f9: 0x12bf, 0x16fa: 0x12bb, 0x16fb: 0x12cb, + 0x16fc: 0x12c3, 0x16fd: 0x12c7, 0x16fe: 0x12cf, 0x16ff: 0x067f, + // Block 0x5c, offset 0x1700 + 0x1700: 0x12d7, 0x1701: 0x12db, 0x1702: 0x0683, 0x1703: 0x12eb, 0x1704: 0x12ef, 0x1705: 0x17f5, + 0x1706: 0x12fb, 0x1707: 0x12ff, 0x1708: 0x0687, 0x1709: 0x130b, 0x170a: 0x05bb, 0x170b: 0x17fa, + 0x170c: 0x17ff, 0x170d: 0x068b, 0x170e: 0x068f, 0x170f: 0x1337, 0x1710: 0x134f, 0x1711: 0x136b, + 0x1712: 0x137b, 0x1713: 0x1804, 0x1714: 0x138f, 0x1715: 0x1393, 0x1716: 0x13ab, 0x1717: 0x13b7, + 0x1718: 0x180e, 0x1719: 0x1660, 0x171a: 0x13c3, 0x171b: 0x13bf, 0x171c: 0x13cb, 0x171d: 0x1665, + 0x171e: 0x13d7, 0x171f: 0x13e3, 0x1720: 0x1813, 0x1721: 0x1818, 0x1722: 0x1423, 0x1723: 0x142f, + 0x1724: 0x1437, 0x1725: 0x181d, 0x1726: 0x143b, 0x1727: 0x1467, 0x1728: 0x1473, 0x1729: 0x1477, + 0x172a: 0x146f, 0x172b: 0x1483, 0x172c: 0x1487, 0x172d: 0x1822, 0x172e: 0x1493, 0x172f: 0x0693, + 0x1730: 0x149b, 0x1731: 0x1827, 0x1732: 0x0697, 0x1733: 0x14d3, 0x1734: 0x0ac3, 0x1735: 0x14eb, + 0x1736: 0x182c, 0x1737: 0x1836, 0x1738: 0x069b, 0x1739: 0x069f, 0x173a: 0x1513, 0x173b: 0x183b, + 0x173c: 0x06a3, 0x173d: 0x1840, 0x173e: 0x152b, 0x173f: 0x152b, + // Block 0x5d, offset 0x1740 + 0x1740: 0x1533, 0x1741: 0x1845, 0x1742: 0x154b, 0x1743: 0x06a7, 0x1744: 0x155b, 0x1745: 0x1567, + 0x1746: 0x156f, 0x1747: 0x1577, 0x1748: 0x06ab, 0x1749: 0x184a, 0x174a: 0x158b, 0x174b: 0x15a7, + 0x174c: 0x15b3, 0x174d: 0x06af, 0x174e: 0x06b3, 0x174f: 0x15b7, 0x1750: 0x184f, 0x1751: 0x06b7, + 0x1752: 0x1854, 0x1753: 0x1859, 0x1754: 0x185e, 0x1755: 0x15db, 0x1756: 0x06bb, 0x1757: 0x15ef, + 0x1758: 0x15f7, 0x1759: 0x15fb, 0x175a: 0x1603, 0x175b: 0x160b, 0x175c: 0x1613, 0x175d: 0x1868, +} + +// nfkcIndex: 22 blocks, 1408 entries, 2816 bytes +// Block 0 is the zero block. +var nfkcIndex = [1408]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x5c, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5d, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x5e, 0xcb: 0x5f, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09, + 0xd0: 0x0a, 0xd1: 0x60, 0xd2: 0x61, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x62, + 0xd8: 0x63, 0xd9: 0x0d, 0xdb: 0x64, 0xdc: 0x65, 0xdd: 0x66, 0xdf: 0x67, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x68, 0x121: 0x69, 0x123: 0x0e, 0x124: 0x6a, 0x125: 0x6b, 0x126: 0x6c, 0x127: 0x6d, + 0x128: 0x6e, 0x129: 0x6f, 0x12a: 0x70, 0x12b: 0x71, 0x12c: 0x6c, 0x12d: 0x72, 0x12e: 0x73, 0x12f: 0x74, + 0x131: 0x75, 0x132: 0x76, 0x133: 0x77, 0x134: 0x78, 0x135: 0x79, 0x137: 0x7a, + 0x138: 0x7b, 0x139: 0x7c, 0x13a: 0x7d, 0x13b: 0x7e, 0x13c: 0x7f, 0x13d: 0x80, 0x13e: 0x81, 0x13f: 0x82, + // Block 0x5, offset 0x140 + 0x140: 0x83, 0x142: 0x84, 0x143: 0x85, 0x144: 0x86, 0x145: 0x87, 0x146: 0x88, 0x147: 0x89, + 0x14d: 0x8a, + 0x15c: 0x8b, 0x15f: 0x8c, + 0x162: 0x8d, 0x164: 0x8e, + 0x168: 0x8f, 0x169: 0x90, 0x16a: 0x91, 0x16c: 0x0f, 0x16d: 0x92, 0x16e: 0x93, 0x16f: 0x94, + 0x170: 0x95, 0x173: 0x96, 0x174: 0x97, 0x175: 0x10, 0x176: 0x11, 0x177: 0x12, + 0x178: 0x13, 0x179: 0x14, 0x17a: 0x15, 0x17b: 0x16, 0x17c: 0x17, 0x17d: 0x18, 0x17e: 0x19, 0x17f: 0x1a, + // Block 0x6, offset 0x180 + 0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x1b, 0x185: 0x1c, 0x186: 0x9c, 0x187: 0x9d, + 0x188: 0x9e, 0x189: 0x1d, 0x18a: 0x1e, 0x18b: 0x9f, 0x18c: 0xa0, + 0x191: 0x1f, 0x192: 0x20, 0x193: 0xa1, + 0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4, + 0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8, + 0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x21, 0x1bd: 0x22, 0x1be: 0x23, 0x1bf: 0xab, + // Block 0x7, offset 0x1c0 + 0x1c0: 0xac, 0x1c1: 0x24, 0x1c2: 0x25, 0x1c3: 0x26, 0x1c4: 0xad, 0x1c5: 0x27, 0x1c6: 0x28, + 0x1c8: 0x29, 0x1c9: 0x2a, 0x1ca: 0x2b, 0x1cb: 0x2c, 0x1cc: 0x2d, 0x1cd: 0x2e, 0x1ce: 0x2f, 0x1cf: 0x30, + // Block 0x8, offset 0x200 + 0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2, + 0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8, + 0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc, + 0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd, + 0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe, + // Block 0x9, offset 0x240 + 0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf, + 0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0, + 0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1, + 0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2, + 0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3, + 0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd, + 0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe, + 0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf, + // Block 0xa, offset 0x280 + 0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0, + 0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1, + 0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2, + 0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3, + 0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd, + 0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe, + 0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf, + 0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0, + // Block 0xb, offset 0x2c0 + 0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1, + 0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2, + 0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3, + 0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4, + // Block 0xc, offset 0x300 + 0x324: 0x31, 0x325: 0x32, 0x326: 0x33, 0x327: 0x34, + 0x328: 0x35, 0x329: 0x36, 0x32a: 0x37, 0x32b: 0x38, 0x32c: 0x39, 0x32d: 0x3a, 0x32e: 0x3b, 0x32f: 0x3c, + 0x330: 0x3d, 0x331: 0x3e, 0x332: 0x3f, 0x333: 0x40, 0x334: 0x41, 0x335: 0x42, 0x336: 0x43, 0x337: 0x44, + 0x338: 0x45, 0x339: 0x46, 0x33a: 0x47, 0x33b: 0x48, 0x33c: 0xc5, 0x33d: 0x49, 0x33e: 0x4a, 0x33f: 0x4b, + // Block 0xd, offset 0x340 + 0x347: 0xc6, + 0x34b: 0xc7, 0x34d: 0xc8, + 0x368: 0xc9, 0x36b: 0xca, + 0x374: 0xcb, + 0x37d: 0xcc, + // Block 0xe, offset 0x380 + 0x381: 0xcd, 0x382: 0xce, 0x384: 0xcf, 0x385: 0xb7, 0x387: 0xd0, + 0x388: 0xd1, 0x38b: 0xd2, 0x38c: 0xd3, 0x38d: 0xd4, + 0x391: 0xd5, 0x392: 0xd6, 0x393: 0xd7, 0x396: 0xd8, 0x397: 0xd9, + 0x398: 0xda, 0x39a: 0xdb, 0x39c: 0xdc, + 0x3a0: 0xdd, 0x3a7: 0xde, + 0x3a8: 0xdf, 0x3a9: 0xe0, 0x3aa: 0xe1, + 0x3b0: 0xda, 0x3b5: 0xe2, 0x3b6: 0xe3, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xe4, 0x3ec: 0xe5, + // Block 0x10, offset 0x400 + 0x432: 0xe6, + // Block 0x11, offset 0x440 + 0x445: 0xe7, 0x446: 0xe8, 0x447: 0xe9, + 0x449: 0xea, + 0x450: 0xeb, 0x451: 0xec, 0x452: 0xed, 0x453: 0xee, 0x454: 0xef, 0x455: 0xf0, 0x456: 0xf1, 0x457: 0xf2, + 0x458: 0xf3, 0x459: 0xf4, 0x45a: 0x4c, 0x45b: 0xf5, 0x45c: 0xf6, 0x45d: 0xf7, 0x45e: 0xf8, 0x45f: 0x4d, + // Block 0x12, offset 0x480 + 0x480: 0xf9, 0x484: 0xe5, + 0x48b: 0xfa, + 0x4a3: 0xfb, 0x4a5: 0xfc, + 0x4b8: 0x4e, 0x4b9: 0x4f, 0x4ba: 0x50, + // Block 0x13, offset 0x4c0 + 0x4c4: 0x51, 0x4c5: 0xfd, 0x4c6: 0xfe, + 0x4c8: 0x52, 0x4c9: 0xff, + // Block 0x14, offset 0x500 + 0x520: 0x53, 0x521: 0x54, 0x522: 0x55, 0x523: 0x56, 0x524: 0x57, 0x525: 0x58, 0x526: 0x59, 0x527: 0x5a, + 0x528: 0x5b, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfkcSparseOffset: 164 entries, 328 bytes +var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x70, 0x75, 0x77, 0x7f, 0x86, 0x89, 0x91, 0x95, 0x99, 0x9b, 0x9d, 0xa6, 0xaa, 0xb1, 0xb6, 0xb9, 0xc3, 0xc6, 0xcd, 0xd5, 0xd9, 0xdb, 0xdf, 0xe3, 0xe9, 0xfa, 0x106, 0x108, 0x10e, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11a, 0x11c, 0x11f, 0x122, 0x124, 0x127, 0x12a, 0x12e, 0x133, 0x13c, 0x13e, 0x141, 0x143, 0x14e, 0x159, 0x167, 0x175, 0x185, 0x193, 0x19a, 0x1a0, 0x1af, 0x1b3, 0x1b5, 0x1b9, 0x1bb, 0x1be, 0x1c0, 0x1c3, 0x1c5, 0x1c8, 0x1ca, 0x1cc, 0x1ce, 0x1da, 0x1e4, 0x1ee, 0x1f1, 0x1f5, 0x1f7, 0x1f9, 0x1fb, 0x1fd, 0x200, 0x202, 0x204, 0x206, 0x208, 0x20e, 0x211, 0x215, 0x217, 0x21e, 0x224, 0x22a, 0x232, 0x238, 0x23e, 0x244, 0x248, 0x24a, 0x24c, 0x24e, 0x250, 0x256, 0x259, 0x25b, 0x261, 0x264, 0x26c, 0x273, 0x276, 0x279, 0x27b, 0x27e, 0x286, 0x28a, 0x291, 0x294, 0x29a, 0x29c, 0x29e, 0x2a1, 0x2a3, 0x2a6, 0x2a8, 0x2aa, 0x2ac, 0x2ae, 0x2b1, 0x2b3, 0x2b5, 0x2b7, 0x2b9, 0x2c6, 0x2d0, 0x2d2, 0x2d4, 0x2d8, 0x2dd, 0x2e9, 0x2ee, 0x2f7, 0x2fd, 0x302, 0x306, 0x30b, 0x30f, 0x31f, 0x32d, 0x33b, 0x349, 0x34f, 0x351, 0x353, 0x356, 0x361, 0x363} + +// nfkcSparseValues: 877 entries, 3508 bytes +var nfkcSparseValues = [877]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0002, lo: 0x0d}, + {value: 0x0001, lo: 0xa0, hi: 0xa0}, + {value: 0x427b, lo: 0xa8, hi: 0xa8}, + {value: 0x0083, lo: 0xaa, hi: 0xaa}, + {value: 0x4267, lo: 0xaf, hi: 0xaf}, + {value: 0x0025, lo: 0xb2, hi: 0xb3}, + {value: 0x425d, lo: 0xb4, hi: 0xb4}, + {value: 0x01dc, lo: 0xb5, hi: 0xb5}, + {value: 0x4294, lo: 0xb8, hi: 0xb8}, + {value: 0x0023, lo: 0xb9, hi: 0xb9}, + {value: 0x009f, lo: 0xba, hi: 0xba}, + {value: 0x221f, lo: 0xbc, hi: 0xbc}, + {value: 0x2213, lo: 0xbd, hi: 0xbd}, + {value: 0x22b5, lo: 0xbe, hi: 0xbe}, + // Block 0x1, offset 0xe + {value: 0x0091, lo: 0x03}, + {value: 0x46e5, lo: 0xa0, hi: 0xa1}, + {value: 0x4717, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x12 + {value: 0x0003, lo: 0x08}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x0091, lo: 0xb0, hi: 0xb0}, + {value: 0x0119, lo: 0xb1, hi: 0xb1}, + {value: 0x0095, lo: 0xb2, hi: 0xb2}, + {value: 0x00a5, lo: 0xb3, hi: 0xb3}, + {value: 0x0143, lo: 0xb4, hi: 0xb6}, + {value: 0x00af, lo: 0xb7, hi: 0xb7}, + {value: 0x00b3, lo: 0xb8, hi: 0xb8}, + // Block 0x3, offset 0x1b + {value: 0x000a, lo: 0x09}, + {value: 0x4271, lo: 0x98, hi: 0x98}, + {value: 0x4276, lo: 0x99, hi: 0x9a}, + {value: 0x4299, lo: 0x9b, hi: 0x9b}, + {value: 0x4262, lo: 0x9c, hi: 0x9c}, + {value: 0x4285, lo: 0x9d, hi: 0x9d}, + {value: 0x0113, lo: 0xa0, hi: 0xa0}, + {value: 0x0099, lo: 0xa1, hi: 0xa1}, + {value: 0x00a7, lo: 0xa2, hi: 0xa3}, + {value: 0x0167, lo: 0xa4, hi: 0xa4}, + // Block 0x4, offset 0x25 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x37a8, lo: 0x90, hi: 0x90}, + {value: 0x37b4, lo: 0x91, hi: 0x91}, + {value: 0x37a2, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x381a, lo: 0x97, hi: 0x97}, + {value: 0x37e4, lo: 0x9c, hi: 0x9c}, + {value: 0x37cc, lo: 0x9d, hi: 0x9d}, + {value: 0x37f6, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x3820, lo: 0xb6, hi: 0xb6}, + {value: 0x3826, lo: 0xb7, hi: 0xb7}, + // Block 0x5, offset 0x35 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x83, hi: 0x87}, + // Block 0x6, offset 0x37 + {value: 0x0001, lo: 0x04}, + {value: 0x8113, lo: 0x81, hi: 0x82}, + {value: 0x8132, lo: 0x84, hi: 0x84}, + {value: 0x812d, lo: 0x85, hi: 0x85}, + {value: 0x810d, lo: 0x87, hi: 0x87}, + // Block 0x7, offset 0x3c + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x97}, + {value: 0x8119, lo: 0x98, hi: 0x98}, + {value: 0x811a, lo: 0x99, hi: 0x99}, + {value: 0x811b, lo: 0x9a, hi: 0x9a}, + {value: 0x3844, lo: 0xa2, hi: 0xa2}, + {value: 0x384a, lo: 0xa3, hi: 0xa3}, + {value: 0x3856, lo: 0xa4, hi: 0xa4}, + {value: 0x3850, lo: 0xa5, hi: 0xa5}, + {value: 0x385c, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x8, offset 0x47 + {value: 0x0000, lo: 0x0e}, + {value: 0x386e, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x3862, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x3868, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8132, lo: 0x96, hi: 0x9c}, + {value: 0x8132, lo: 0x9f, hi: 0xa2}, + {value: 0x812d, lo: 0xa3, hi: 0xa3}, + {value: 0x8132, lo: 0xa4, hi: 0xa4}, + {value: 0x8132, lo: 0xa7, hi: 0xa8}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xac}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + // Block 0x9, offset 0x56 + {value: 0x0000, lo: 0x0c}, + {value: 0x811f, lo: 0x91, hi: 0x91}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x812d, lo: 0xb1, hi: 0xb1}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb5, hi: 0xb6}, + {value: 0x812d, lo: 0xb7, hi: 0xb9}, + {value: 0x8132, lo: 0xba, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbc}, + {value: 0x8132, lo: 0xbd, hi: 0xbd}, + {value: 0x812d, lo: 0xbe, hi: 0xbe}, + {value: 0x8132, lo: 0xbf, hi: 0xbf}, + // Block 0xa, offset 0x63 + {value: 0x0005, lo: 0x07}, + {value: 0x8132, lo: 0x80, hi: 0x80}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x812d, lo: 0x82, hi: 0x83}, + {value: 0x812d, lo: 0x84, hi: 0x85}, + {value: 0x812d, lo: 0x86, hi: 0x87}, + {value: 0x812d, lo: 0x88, hi: 0x89}, + {value: 0x8132, lo: 0x8a, hi: 0x8a}, + // Block 0xb, offset 0x6b + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0xab, hi: 0xb1}, + {value: 0x812d, lo: 0xb2, hi: 0xb2}, + {value: 0x8132, lo: 0xb3, hi: 0xb3}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0xc, offset 0x70 + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0x96, hi: 0x99}, + {value: 0x8132, lo: 0x9b, hi: 0xa3}, + {value: 0x8132, lo: 0xa5, hi: 0xa7}, + {value: 0x8132, lo: 0xa9, hi: 0xad}, + // Block 0xd, offset 0x75 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x99, hi: 0x9b}, + // Block 0xe, offset 0x77 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x3edb, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x3ee3, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x3eeb, lo: 0xb4, hi: 0xb4}, + {value: 0x9902, lo: 0xbc, hi: 0xbc}, + // Block 0xf, offset 0x7f + {value: 0x0008, lo: 0x06}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x91, hi: 0x91}, + {value: 0x812d, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x93, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x94}, + {value: 0x451f, lo: 0x98, hi: 0x9f}, + // Block 0x10, offset 0x86 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x11, offset 0x89 + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ca1, lo: 0x8b, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x455f, lo: 0x9c, hi: 0x9d}, + {value: 0x456f, lo: 0x9f, hi: 0x9f}, + {value: 0x8132, lo: 0xbe, hi: 0xbe}, + // Block 0x12, offset 0x91 + {value: 0x0000, lo: 0x03}, + {value: 0x4597, lo: 0xb3, hi: 0xb3}, + {value: 0x459f, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x13, offset 0x95 + {value: 0x0008, lo: 0x03}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x4577, lo: 0x99, hi: 0x9b}, + {value: 0x458f, lo: 0x9e, hi: 0x9e}, + // Block 0x14, offset 0x99 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x15, offset 0x9b + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + // Block 0x16, offset 0x9d + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2cb9, lo: 0x88, hi: 0x88}, + {value: 0x2cb1, lo: 0x8b, hi: 0x8b}, + {value: 0x2cc1, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x45a7, lo: 0x9c, hi: 0x9c}, + {value: 0x45af, lo: 0x9d, hi: 0x9d}, + // Block 0x17, offset 0xa6 + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2cc9, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x18, offset 0xaa + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2cd1, lo: 0x8a, hi: 0x8a}, + {value: 0x2ce1, lo: 0x8b, hi: 0x8b}, + {value: 0x2cd9, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x19, offset 0xb1 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x3ef3, lo: 0x88, hi: 0x88}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8120, lo: 0x95, hi: 0x96}, + // Block 0x1a, offset 0xb6 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1b, offset 0xb9 + {value: 0x0000, lo: 0x09}, + {value: 0x2ce9, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2cf1, lo: 0x87, hi: 0x87}, + {value: 0x2cf9, lo: 0x88, hi: 0x88}, + {value: 0x2f53, lo: 0x8a, hi: 0x8a}, + {value: 0x2ddb, lo: 0x8b, hi: 0x8b}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1c, offset 0xc3 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1d, offset 0xc6 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2d01, lo: 0x8a, hi: 0x8a}, + {value: 0x2d11, lo: 0x8b, hi: 0x8b}, + {value: 0x2d09, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1e, offset 0xcd + {value: 0x6be7, lo: 0x07}, + {value: 0x9904, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x3efb, lo: 0x9a, hi: 0x9a}, + {value: 0x2f5b, lo: 0x9c, hi: 0x9c}, + {value: 0x2de6, lo: 0x9d, hi: 0x9d}, + {value: 0x2d19, lo: 0x9e, hi: 0x9f}, + // Block 0x1f, offset 0xd5 + {value: 0x0000, lo: 0x03}, + {value: 0x2624, lo: 0xb3, hi: 0xb3}, + {value: 0x8122, lo: 0xb8, hi: 0xb9}, + {value: 0x8104, lo: 0xba, hi: 0xba}, + // Block 0x20, offset 0xd9 + {value: 0x0000, lo: 0x01}, + {value: 0x8123, lo: 0x88, hi: 0x8b}, + // Block 0x21, offset 0xdb + {value: 0x0000, lo: 0x03}, + {value: 0x2639, lo: 0xb3, hi: 0xb3}, + {value: 0x8124, lo: 0xb8, hi: 0xb9}, + {value: 0x8104, lo: 0xba, hi: 0xba}, + // Block 0x22, offset 0xdf + {value: 0x0000, lo: 0x03}, + {value: 0x8125, lo: 0x88, hi: 0x8b}, + {value: 0x262b, lo: 0x9c, hi: 0x9c}, + {value: 0x2632, lo: 0x9d, hi: 0x9d}, + // Block 0x23, offset 0xe3 + {value: 0x0000, lo: 0x05}, + {value: 0x030b, lo: 0x8c, hi: 0x8c}, + {value: 0x812d, lo: 0x98, hi: 0x99}, + {value: 0x812d, lo: 0xb5, hi: 0xb5}, + {value: 0x812d, lo: 0xb7, hi: 0xb7}, + {value: 0x812b, lo: 0xb9, hi: 0xb9}, + // Block 0x24, offset 0xe9 + {value: 0x0000, lo: 0x10}, + {value: 0x2647, lo: 0x83, hi: 0x83}, + {value: 0x264e, lo: 0x8d, hi: 0x8d}, + {value: 0x2655, lo: 0x92, hi: 0x92}, + {value: 0x265c, lo: 0x97, hi: 0x97}, + {value: 0x2663, lo: 0x9c, hi: 0x9c}, + {value: 0x2640, lo: 0xa9, hi: 0xa9}, + {value: 0x8126, lo: 0xb1, hi: 0xb1}, + {value: 0x8127, lo: 0xb2, hi: 0xb2}, + {value: 0x4a87, lo: 0xb3, hi: 0xb3}, + {value: 0x8128, lo: 0xb4, hi: 0xb4}, + {value: 0x4a90, lo: 0xb5, hi: 0xb5}, + {value: 0x45b7, lo: 0xb6, hi: 0xb6}, + {value: 0x45f7, lo: 0xb7, hi: 0xb7}, + {value: 0x45bf, lo: 0xb8, hi: 0xb8}, + {value: 0x4602, lo: 0xb9, hi: 0xb9}, + {value: 0x8127, lo: 0xba, hi: 0xbd}, + // Block 0x25, offset 0xfa + {value: 0x0000, lo: 0x0b}, + {value: 0x8127, lo: 0x80, hi: 0x80}, + {value: 0x4a99, lo: 0x81, hi: 0x81}, + {value: 0x8132, lo: 0x82, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0x86, hi: 0x87}, + {value: 0x2671, lo: 0x93, hi: 0x93}, + {value: 0x2678, lo: 0x9d, hi: 0x9d}, + {value: 0x267f, lo: 0xa2, hi: 0xa2}, + {value: 0x2686, lo: 0xa7, hi: 0xa7}, + {value: 0x268d, lo: 0xac, hi: 0xac}, + {value: 0x266a, lo: 0xb9, hi: 0xb9}, + // Block 0x26, offset 0x106 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x86, hi: 0x86}, + // Block 0x27, offset 0x108 + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2d21, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x28, offset 0x10e + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + // Block 0x29, offset 0x110 + {value: 0x0000, lo: 0x01}, + {value: 0x030f, lo: 0xbc, hi: 0xbc}, + // Block 0x2a, offset 0x112 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2b, offset 0x114 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2c, offset 0x116 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2d, offset 0x118 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2e, offset 0x11a + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x9d, hi: 0x9f}, + // Block 0x2f, offset 0x11c + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x94, hi: 0x94}, + {value: 0x8104, lo: 0xb4, hi: 0xb4}, + // Block 0x30, offset 0x11f + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x9d, hi: 0x9d}, + // Block 0x31, offset 0x122 + {value: 0x0000, lo: 0x01}, + {value: 0x8131, lo: 0xa9, hi: 0xa9}, + // Block 0x32, offset 0x124 + {value: 0x0004, lo: 0x02}, + {value: 0x812e, lo: 0xb9, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbb}, + // Block 0x33, offset 0x127 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x97, hi: 0x97}, + {value: 0x812d, lo: 0x98, hi: 0x98}, + // Block 0x34, offset 0x12a + {value: 0x0000, lo: 0x03}, + {value: 0x8104, lo: 0xa0, hi: 0xa0}, + {value: 0x8132, lo: 0xb5, hi: 0xbc}, + {value: 0x812d, lo: 0xbf, hi: 0xbf}, + // Block 0x35, offset 0x12e + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + {value: 0x812d, lo: 0xb5, hi: 0xba}, + {value: 0x8132, lo: 0xbb, hi: 0xbc}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x36, offset 0x133 + {value: 0x0000, lo: 0x08}, + {value: 0x2d69, lo: 0x80, hi: 0x80}, + {value: 0x2d71, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2d79, lo: 0x83, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xac}, + {value: 0x8132, lo: 0xad, hi: 0xb3}, + // Block 0x37, offset 0x13c + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xaa, hi: 0xab}, + // Block 0x38, offset 0x13e + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xa6, hi: 0xa6}, + {value: 0x8104, lo: 0xb2, hi: 0xb3}, + // Block 0x39, offset 0x141 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x3a, offset 0x143 + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812d, lo: 0x95, hi: 0x99}, + {value: 0x8132, lo: 0x9a, hi: 0x9b}, + {value: 0x812d, lo: 0x9c, hi: 0x9f}, + {value: 0x8132, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + {value: 0x8132, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb8, hi: 0xb9}, + // Block 0x3b, offset 0x14e + {value: 0x0002, lo: 0x0a}, + {value: 0x0043, lo: 0xac, hi: 0xac}, + {value: 0x00d1, lo: 0xad, hi: 0xad}, + {value: 0x0045, lo: 0xae, hi: 0xae}, + {value: 0x0049, lo: 0xb0, hi: 0xb1}, + {value: 0x00e6, lo: 0xb2, hi: 0xb2}, + {value: 0x004f, lo: 0xb3, hi: 0xba}, + {value: 0x005f, lo: 0xbc, hi: 0xbc}, + {value: 0x00ef, lo: 0xbd, hi: 0xbd}, + {value: 0x0061, lo: 0xbe, hi: 0xbe}, + {value: 0x0065, lo: 0xbf, hi: 0xbf}, + // Block 0x3c, offset 0x159 + {value: 0x0000, lo: 0x0d}, + {value: 0x0001, lo: 0x80, hi: 0x8a}, + {value: 0x043b, lo: 0x91, hi: 0x91}, + {value: 0x429e, lo: 0x97, hi: 0x97}, + {value: 0x001d, lo: 0xa4, hi: 0xa4}, + {value: 0x1873, lo: 0xa5, hi: 0xa5}, + {value: 0x1b5f, lo: 0xa6, hi: 0xa6}, + {value: 0x0001, lo: 0xaf, hi: 0xaf}, + {value: 0x2694, lo: 0xb3, hi: 0xb3}, + {value: 0x2801, lo: 0xb4, hi: 0xb4}, + {value: 0x269b, lo: 0xb6, hi: 0xb6}, + {value: 0x280b, lo: 0xb7, hi: 0xb7}, + {value: 0x186d, lo: 0xbc, hi: 0xbc}, + {value: 0x426c, lo: 0xbe, hi: 0xbe}, + // Block 0x3d, offset 0x167 + {value: 0x0002, lo: 0x0d}, + {value: 0x1933, lo: 0x87, hi: 0x87}, + {value: 0x1930, lo: 0x88, hi: 0x88}, + {value: 0x1870, lo: 0x89, hi: 0x89}, + {value: 0x2991, lo: 0x97, hi: 0x97}, + {value: 0x0001, lo: 0x9f, hi: 0x9f}, + {value: 0x0021, lo: 0xb0, hi: 0xb0}, + {value: 0x0093, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb4, hi: 0xb9}, + {value: 0x0017, lo: 0xba, hi: 0xba}, + {value: 0x0467, lo: 0xbb, hi: 0xbb}, + {value: 0x003b, lo: 0xbc, hi: 0xbc}, + {value: 0x0011, lo: 0xbd, hi: 0xbe}, + {value: 0x009d, lo: 0xbf, hi: 0xbf}, + // Block 0x3e, offset 0x175 + {value: 0x0002, lo: 0x0f}, + {value: 0x0021, lo: 0x80, hi: 0x89}, + {value: 0x0017, lo: 0x8a, hi: 0x8a}, + {value: 0x0467, lo: 0x8b, hi: 0x8b}, + {value: 0x003b, lo: 0x8c, hi: 0x8c}, + {value: 0x0011, lo: 0x8d, hi: 0x8e}, + {value: 0x0083, lo: 0x90, hi: 0x90}, + {value: 0x008b, lo: 0x91, hi: 0x91}, + {value: 0x009f, lo: 0x92, hi: 0x92}, + {value: 0x00b1, lo: 0x93, hi: 0x93}, + {value: 0x0104, lo: 0x94, hi: 0x94}, + {value: 0x0091, lo: 0x95, hi: 0x95}, + {value: 0x0097, lo: 0x96, hi: 0x99}, + {value: 0x00a1, lo: 0x9a, hi: 0x9a}, + {value: 0x00a7, lo: 0x9b, hi: 0x9c}, + {value: 0x199c, lo: 0xa8, hi: 0xa8}, + // Block 0x3f, offset 0x185 + {value: 0x0000, lo: 0x0d}, + {value: 0x8132, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8132, lo: 0x9b, hi: 0x9c}, + {value: 0x8132, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8132, lo: 0xa7, hi: 0xa7}, + {value: 0x812d, lo: 0xa8, hi: 0xa8}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xaf}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + // Block 0x40, offset 0x193 + {value: 0x0007, lo: 0x06}, + {value: 0x2183, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3bbc, lo: 0x9a, hi: 0x9b}, + {value: 0x3bca, lo: 0xae, hi: 0xae}, + // Block 0x41, offset 0x19a + {value: 0x000e, lo: 0x05}, + {value: 0x3bd1, lo: 0x8d, hi: 0x8e}, + {value: 0x3bd8, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x42, offset 0x1a0 + {value: 0x0173, lo: 0x0e}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3be6, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3bed, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3bf4, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3bfb, lo: 0xa4, hi: 0xa4}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x3c02, lo: 0xa6, hi: 0xa6}, + {value: 0x26a2, lo: 0xac, hi: 0xad}, + {value: 0x26a9, lo: 0xaf, hi: 0xaf}, + {value: 0x281f, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x43, offset 0x1af + {value: 0x0007, lo: 0x03}, + {value: 0x3c6b, lo: 0xa0, hi: 0xa1}, + {value: 0x3c95, lo: 0xa2, hi: 0xa3}, + {value: 0x3cbf, lo: 0xaa, hi: 0xad}, + // Block 0x44, offset 0x1b3 + {value: 0x0004, lo: 0x01}, + {value: 0x048b, lo: 0xa9, hi: 0xaa}, + // Block 0x45, offset 0x1b5 + {value: 0x0002, lo: 0x03}, + {value: 0x0057, lo: 0x80, hi: 0x8f}, + {value: 0x0083, lo: 0x90, hi: 0xa9}, + {value: 0x0021, lo: 0xaa, hi: 0xaa}, + // Block 0x46, offset 0x1b9 + {value: 0x0000, lo: 0x01}, + {value: 0x299e, lo: 0x8c, hi: 0x8c}, + // Block 0x47, offset 0x1bb + {value: 0x0266, lo: 0x02}, + {value: 0x1b8f, lo: 0xb4, hi: 0xb4}, + {value: 0x192d, lo: 0xb5, hi: 0xb6}, + // Block 0x48, offset 0x1be + {value: 0x0000, lo: 0x01}, + {value: 0x44e0, lo: 0x9c, hi: 0x9c}, + // Block 0x49, offset 0x1c0 + {value: 0x0000, lo: 0x02}, + {value: 0x0095, lo: 0xbc, hi: 0xbc}, + {value: 0x006d, lo: 0xbd, hi: 0xbd}, + // Block 0x4a, offset 0x1c3 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xaf, hi: 0xb1}, + // Block 0x4b, offset 0x1c5 + {value: 0x0000, lo: 0x02}, + {value: 0x047f, lo: 0xaf, hi: 0xaf}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x4c, offset 0x1c8 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa0, hi: 0xbf}, + // Block 0x4d, offset 0x1ca + {value: 0x0000, lo: 0x01}, + {value: 0x0dc3, lo: 0x9f, hi: 0x9f}, + // Block 0x4e, offset 0x1cc + {value: 0x0000, lo: 0x01}, + {value: 0x162f, lo: 0xb3, hi: 0xb3}, + // Block 0x4f, offset 0x1ce + {value: 0x0004, lo: 0x0b}, + {value: 0x1597, lo: 0x80, hi: 0x82}, + {value: 0x15af, lo: 0x83, hi: 0x83}, + {value: 0x15c7, lo: 0x84, hi: 0x85}, + {value: 0x15d7, lo: 0x86, hi: 0x89}, + {value: 0x15eb, lo: 0x8a, hi: 0x8c}, + {value: 0x15ff, lo: 0x8d, hi: 0x8d}, + {value: 0x1607, lo: 0x8e, hi: 0x8e}, + {value: 0x160f, lo: 0x8f, hi: 0x90}, + {value: 0x161b, lo: 0x91, hi: 0x93}, + {value: 0x162b, lo: 0x94, hi: 0x94}, + {value: 0x1633, lo: 0x95, hi: 0x95}, + // Block 0x50, offset 0x1da + {value: 0x0004, lo: 0x09}, + {value: 0x0001, lo: 0x80, hi: 0x80}, + {value: 0x812c, lo: 0xaa, hi: 0xaa}, + {value: 0x8131, lo: 0xab, hi: 0xab}, + {value: 0x8133, lo: 0xac, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x812f, lo: 0xae, hi: 0xae}, + {value: 0x812f, lo: 0xaf, hi: 0xaf}, + {value: 0x04b3, lo: 0xb6, hi: 0xb6}, + {value: 0x0887, lo: 0xb8, hi: 0xba}, + // Block 0x51, offset 0x1e4 + {value: 0x0006, lo: 0x09}, + {value: 0x0313, lo: 0xb1, hi: 0xb1}, + {value: 0x0317, lo: 0xb2, hi: 0xb2}, + {value: 0x4a3e, lo: 0xb3, hi: 0xb3}, + {value: 0x031b, lo: 0xb4, hi: 0xb4}, + {value: 0x4a44, lo: 0xb5, hi: 0xb6}, + {value: 0x031f, lo: 0xb7, hi: 0xb7}, + {value: 0x0323, lo: 0xb8, hi: 0xb8}, + {value: 0x0327, lo: 0xb9, hi: 0xb9}, + {value: 0x4a50, lo: 0xba, hi: 0xbf}, + // Block 0x52, offset 0x1ee + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xaf, hi: 0xaf}, + {value: 0x8132, lo: 0xb4, hi: 0xbd}, + // Block 0x53, offset 0x1f1 + {value: 0x0000, lo: 0x03}, + {value: 0x020f, lo: 0x9c, hi: 0x9c}, + {value: 0x0212, lo: 0x9d, hi: 0x9d}, + {value: 0x8132, lo: 0x9e, hi: 0x9f}, + // Block 0x54, offset 0x1f5 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb1}, + // Block 0x55, offset 0x1f7 + {value: 0x0000, lo: 0x01}, + {value: 0x163b, lo: 0xb0, hi: 0xb0}, + // Block 0x56, offset 0x1f9 + {value: 0x000c, lo: 0x01}, + {value: 0x00d7, lo: 0xb8, hi: 0xb9}, + // Block 0x57, offset 0x1fb + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + // Block 0x58, offset 0x1fd + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xa0, hi: 0xb1}, + // Block 0x59, offset 0x200 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xab, hi: 0xad}, + // Block 0x5a, offset 0x202 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x93, hi: 0x93}, + // Block 0x5b, offset 0x204 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb3, hi: 0xb3}, + // Block 0x5c, offset 0x206 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + // Block 0x5d, offset 0x208 + {value: 0x0000, lo: 0x05}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb7, hi: 0xb8}, + {value: 0x8132, lo: 0xbe, hi: 0xbf}, + // Block 0x5e, offset 0x20e + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + // Block 0x5f, offset 0x211 + {value: 0x0008, lo: 0x03}, + {value: 0x1637, lo: 0x9c, hi: 0x9d}, + {value: 0x0125, lo: 0x9e, hi: 0x9e}, + {value: 0x1643, lo: 0x9f, hi: 0x9f}, + // Block 0x60, offset 0x215 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xad, hi: 0xad}, + // Block 0x61, offset 0x217 + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x62, offset 0x21e + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x63, offset 0x224 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x64, offset 0x22a + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x65, offset 0x232 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x66, offset 0x238 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x67, offset 0x23e + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x68, offset 0x244 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x69, offset 0x248 + {value: 0x0002, lo: 0x01}, + {value: 0x0003, lo: 0x81, hi: 0xbf}, + // Block 0x6a, offset 0x24a + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x6b, offset 0x24c + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xa0, hi: 0xa0}, + // Block 0x6c, offset 0x24e + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb6, hi: 0xba}, + // Block 0x6d, offset 0x250 + {value: 0x002c, lo: 0x05}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x8f, hi: 0x8f}, + {value: 0x8132, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x6e, offset 0x256 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xa5, hi: 0xa5}, + {value: 0x812d, lo: 0xa6, hi: 0xa6}, + // Block 0x6f, offset 0x259 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa4, hi: 0xa7}, + // Block 0x70, offset 0x25b + {value: 0x0000, lo: 0x05}, + {value: 0x812d, lo: 0x86, hi: 0x87}, + {value: 0x8132, lo: 0x88, hi: 0x8a}, + {value: 0x812d, lo: 0x8b, hi: 0x8b}, + {value: 0x8132, lo: 0x8c, hi: 0x8c}, + {value: 0x812d, lo: 0x8d, hi: 0x90}, + // Block 0x71, offset 0x261 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x72, offset 0x264 + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x423b, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4245, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x424f, lo: 0xab, hi: 0xab}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x73, offset 0x26c + {value: 0x0000, lo: 0x06}, + {value: 0x8132, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2d81, lo: 0xae, hi: 0xae}, + {value: 0x2d8b, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8104, lo: 0xb3, hi: 0xb4}, + // Block 0x74, offset 0x273 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + {value: 0x8102, lo: 0x8a, hi: 0x8a}, + // Block 0x75, offset 0x276 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb5, hi: 0xb5}, + {value: 0x8102, lo: 0xb6, hi: 0xb6}, + // Block 0x76, offset 0x279 + {value: 0x0002, lo: 0x01}, + {value: 0x8102, lo: 0xa9, hi: 0xaa}, + // Block 0x77, offset 0x27b + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x78, offset 0x27e + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2d95, lo: 0x8b, hi: 0x8b}, + {value: 0x2d9f, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8132, lo: 0xa6, hi: 0xac}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + // Block 0x79, offset 0x286 + {value: 0x0000, lo: 0x03}, + {value: 0x8104, lo: 0x82, hi: 0x82}, + {value: 0x8102, lo: 0x86, hi: 0x86}, + {value: 0x8132, lo: 0x9e, hi: 0x9e}, + // Block 0x7a, offset 0x28a + {value: 0x6b57, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2db3, lo: 0xbb, hi: 0xbb}, + {value: 0x2da9, lo: 0xbc, hi: 0xbd}, + {value: 0x2dbd, lo: 0xbe, hi: 0xbe}, + // Block 0x7b, offset 0x291 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x82, hi: 0x82}, + {value: 0x8102, lo: 0x83, hi: 0x83}, + // Block 0x7c, offset 0x294 + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2dc7, lo: 0xba, hi: 0xba}, + {value: 0x2dd1, lo: 0xbb, hi: 0xbb}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x7d, offset 0x29a + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0x80, hi: 0x80}, + // Block 0x7e, offset 0x29c + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x7f, offset 0x29e + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x80, offset 0x2a1 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xab, hi: 0xab}, + // Block 0x81, offset 0x2a3 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb9, hi: 0xb9}, + {value: 0x8102, lo: 0xba, hi: 0xba}, + // Block 0x82, offset 0x2a6 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xa0, hi: 0xa0}, + // Block 0x83, offset 0x2a8 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xb4, hi: 0xb4}, + // Block 0x84, offset 0x2aa + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x87, hi: 0x87}, + // Block 0x85, offset 0x2ac + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x99, hi: 0x99}, + // Block 0x86, offset 0x2ae + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0x82, hi: 0x82}, + {value: 0x8104, lo: 0x84, hi: 0x85}, + // Block 0x87, offset 0x2b1 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x97, hi: 0x97}, + // Block 0x88, offset 0x2b3 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x89, offset 0x2b5 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb6}, + // Block 0x8a, offset 0x2b7 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x8b, offset 0x2b9 + {value: 0x0000, lo: 0x0c}, + {value: 0x45cf, lo: 0x9e, hi: 0x9e}, + {value: 0x45d9, lo: 0x9f, hi: 0x9f}, + {value: 0x460d, lo: 0xa0, hi: 0xa0}, + {value: 0x461b, lo: 0xa1, hi: 0xa1}, + {value: 0x4629, lo: 0xa2, hi: 0xa2}, + {value: 0x4637, lo: 0xa3, hi: 0xa3}, + {value: 0x4645, lo: 0xa4, hi: 0xa4}, + {value: 0x812b, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8130, lo: 0xad, hi: 0xad}, + {value: 0x812b, lo: 0xae, hi: 0xb2}, + {value: 0x812d, lo: 0xbb, hi: 0xbf}, + // Block 0x8c, offset 0x2c6 + {value: 0x0000, lo: 0x09}, + {value: 0x812d, lo: 0x80, hi: 0x82}, + {value: 0x8132, lo: 0x85, hi: 0x89}, + {value: 0x812d, lo: 0x8a, hi: 0x8b}, + {value: 0x8132, lo: 0xaa, hi: 0xad}, + {value: 0x45e3, lo: 0xbb, hi: 0xbb}, + {value: 0x45ed, lo: 0xbc, hi: 0xbc}, + {value: 0x4653, lo: 0xbd, hi: 0xbd}, + {value: 0x466f, lo: 0xbe, hi: 0xbe}, + {value: 0x4661, lo: 0xbf, hi: 0xbf}, + // Block 0x8d, offset 0x2d0 + {value: 0x0000, lo: 0x01}, + {value: 0x467d, lo: 0x80, hi: 0x80}, + // Block 0x8e, offset 0x2d2 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x82, hi: 0x84}, + // Block 0x8f, offset 0x2d4 + {value: 0x0002, lo: 0x03}, + {value: 0x0043, lo: 0x80, hi: 0x99}, + {value: 0x0083, lo: 0x9a, hi: 0xb3}, + {value: 0x0043, lo: 0xb4, hi: 0xbf}, + // Block 0x90, offset 0x2d8 + {value: 0x0002, lo: 0x04}, + {value: 0x005b, lo: 0x80, hi: 0x8d}, + {value: 0x0083, lo: 0x8e, hi: 0x94}, + {value: 0x0093, lo: 0x96, hi: 0xa7}, + {value: 0x0043, lo: 0xa8, hi: 0xbf}, + // Block 0x91, offset 0x2dd + {value: 0x0002, lo: 0x0b}, + {value: 0x0073, lo: 0x80, hi: 0x81}, + {value: 0x0083, lo: 0x82, hi: 0x9b}, + {value: 0x0043, lo: 0x9c, hi: 0x9c}, + {value: 0x0047, lo: 0x9e, hi: 0x9f}, + {value: 0x004f, lo: 0xa2, hi: 0xa2}, + {value: 0x0055, lo: 0xa5, hi: 0xa6}, + {value: 0x005d, lo: 0xa9, hi: 0xac}, + {value: 0x0067, lo: 0xae, hi: 0xb5}, + {value: 0x0083, lo: 0xb6, hi: 0xb9}, + {value: 0x008d, lo: 0xbb, hi: 0xbb}, + {value: 0x0091, lo: 0xbd, hi: 0xbf}, + // Block 0x92, offset 0x2e9 + {value: 0x0002, lo: 0x04}, + {value: 0x0097, lo: 0x80, hi: 0x83}, + {value: 0x00a1, lo: 0x85, hi: 0x8f}, + {value: 0x0043, lo: 0x90, hi: 0xa9}, + {value: 0x0083, lo: 0xaa, hi: 0xbf}, + // Block 0x93, offset 0x2ee + {value: 0x0002, lo: 0x08}, + {value: 0x00af, lo: 0x80, hi: 0x83}, + {value: 0x0043, lo: 0x84, hi: 0x85}, + {value: 0x0049, lo: 0x87, hi: 0x8a}, + {value: 0x0055, lo: 0x8d, hi: 0x94}, + {value: 0x0067, lo: 0x96, hi: 0x9c}, + {value: 0x0083, lo: 0x9e, hi: 0xb7}, + {value: 0x0043, lo: 0xb8, hi: 0xb9}, + {value: 0x0049, lo: 0xbb, hi: 0xbe}, + // Block 0x94, offset 0x2f7 + {value: 0x0002, lo: 0x05}, + {value: 0x0053, lo: 0x80, hi: 0x84}, + {value: 0x005f, lo: 0x86, hi: 0x86}, + {value: 0x0067, lo: 0x8a, hi: 0x90}, + {value: 0x0083, lo: 0x92, hi: 0xab}, + {value: 0x0043, lo: 0xac, hi: 0xbf}, + // Block 0x95, offset 0x2fd + {value: 0x0002, lo: 0x04}, + {value: 0x006b, lo: 0x80, hi: 0x85}, + {value: 0x0083, lo: 0x86, hi: 0x9f}, + {value: 0x0043, lo: 0xa0, hi: 0xb9}, + {value: 0x0083, lo: 0xba, hi: 0xbf}, + // Block 0x96, offset 0x302 + {value: 0x0002, lo: 0x03}, + {value: 0x008f, lo: 0x80, hi: 0x93}, + {value: 0x0043, lo: 0x94, hi: 0xad}, + {value: 0x0083, lo: 0xae, hi: 0xbf}, + // Block 0x97, offset 0x306 + {value: 0x0002, lo: 0x04}, + {value: 0x00a7, lo: 0x80, hi: 0x87}, + {value: 0x0043, lo: 0x88, hi: 0xa1}, + {value: 0x0083, lo: 0xa2, hi: 0xbb}, + {value: 0x0043, lo: 0xbc, hi: 0xbf}, + // Block 0x98, offset 0x30b + {value: 0x0002, lo: 0x03}, + {value: 0x004b, lo: 0x80, hi: 0x95}, + {value: 0x0083, lo: 0x96, hi: 0xaf}, + {value: 0x0043, lo: 0xb0, hi: 0xbf}, + // Block 0x99, offset 0x30f + {value: 0x0003, lo: 0x0f}, + {value: 0x01b8, lo: 0x80, hi: 0x80}, + {value: 0x045f, lo: 0x81, hi: 0x81}, + {value: 0x01bb, lo: 0x82, hi: 0x9a}, + {value: 0x045b, lo: 0x9b, hi: 0x9b}, + {value: 0x01c7, lo: 0x9c, hi: 0x9c}, + {value: 0x01d0, lo: 0x9d, hi: 0x9d}, + {value: 0x01d6, lo: 0x9e, hi: 0x9e}, + {value: 0x01fa, lo: 0x9f, hi: 0x9f}, + {value: 0x01eb, lo: 0xa0, hi: 0xa0}, + {value: 0x01e8, lo: 0xa1, hi: 0xa1}, + {value: 0x0173, lo: 0xa2, hi: 0xb2}, + {value: 0x0188, lo: 0xb3, hi: 0xb3}, + {value: 0x01a6, lo: 0xb4, hi: 0xba}, + {value: 0x045f, lo: 0xbb, hi: 0xbb}, + {value: 0x01bb, lo: 0xbc, hi: 0xbf}, + // Block 0x9a, offset 0x31f + {value: 0x0003, lo: 0x0d}, + {value: 0x01c7, lo: 0x80, hi: 0x94}, + {value: 0x045b, lo: 0x95, hi: 0x95}, + {value: 0x01c7, lo: 0x96, hi: 0x96}, + {value: 0x01d0, lo: 0x97, hi: 0x97}, + {value: 0x01d6, lo: 0x98, hi: 0x98}, + {value: 0x01fa, lo: 0x99, hi: 0x99}, + {value: 0x01eb, lo: 0x9a, hi: 0x9a}, + {value: 0x01e8, lo: 0x9b, hi: 0x9b}, + {value: 0x0173, lo: 0x9c, hi: 0xac}, + {value: 0x0188, lo: 0xad, hi: 0xad}, + {value: 0x01a6, lo: 0xae, hi: 0xb4}, + {value: 0x045f, lo: 0xb5, hi: 0xb5}, + {value: 0x01bb, lo: 0xb6, hi: 0xbf}, + // Block 0x9b, offset 0x32d + {value: 0x0003, lo: 0x0d}, + {value: 0x01d9, lo: 0x80, hi: 0x8e}, + {value: 0x045b, lo: 0x8f, hi: 0x8f}, + {value: 0x01c7, lo: 0x90, hi: 0x90}, + {value: 0x01d0, lo: 0x91, hi: 0x91}, + {value: 0x01d6, lo: 0x92, hi: 0x92}, + {value: 0x01fa, lo: 0x93, hi: 0x93}, + {value: 0x01eb, lo: 0x94, hi: 0x94}, + {value: 0x01e8, lo: 0x95, hi: 0x95}, + {value: 0x0173, lo: 0x96, hi: 0xa6}, + {value: 0x0188, lo: 0xa7, hi: 0xa7}, + {value: 0x01a6, lo: 0xa8, hi: 0xae}, + {value: 0x045f, lo: 0xaf, hi: 0xaf}, + {value: 0x01bb, lo: 0xb0, hi: 0xbf}, + // Block 0x9c, offset 0x33b + {value: 0x0003, lo: 0x0d}, + {value: 0x01eb, lo: 0x80, hi: 0x88}, + {value: 0x045b, lo: 0x89, hi: 0x89}, + {value: 0x01c7, lo: 0x8a, hi: 0x8a}, + {value: 0x01d0, lo: 0x8b, hi: 0x8b}, + {value: 0x01d6, lo: 0x8c, hi: 0x8c}, + {value: 0x01fa, lo: 0x8d, hi: 0x8d}, + {value: 0x01eb, lo: 0x8e, hi: 0x8e}, + {value: 0x01e8, lo: 0x8f, hi: 0x8f}, + {value: 0x0173, lo: 0x90, hi: 0xa0}, + {value: 0x0188, lo: 0xa1, hi: 0xa1}, + {value: 0x01a6, lo: 0xa2, hi: 0xa8}, + {value: 0x045f, lo: 0xa9, hi: 0xa9}, + {value: 0x01bb, lo: 0xaa, hi: 0xbf}, + // Block 0x9d, offset 0x349 + {value: 0x0000, lo: 0x05}, + {value: 0x8132, lo: 0x80, hi: 0x86}, + {value: 0x8132, lo: 0x88, hi: 0x98}, + {value: 0x8132, lo: 0x9b, hi: 0xa1}, + {value: 0x8132, lo: 0xa3, hi: 0xa4}, + {value: 0x8132, lo: 0xa6, hi: 0xaa}, + // Block 0x9e, offset 0x34f + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xac, hi: 0xaf}, + // Block 0x9f, offset 0x351 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x90, hi: 0x96}, + // Block 0xa0, offset 0x353 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x84, hi: 0x89}, + {value: 0x8102, lo: 0x8a, hi: 0x8a}, + // Block 0xa1, offset 0x356 + {value: 0x0002, lo: 0x0a}, + {value: 0x0063, lo: 0x80, hi: 0x89}, + {value: 0x1951, lo: 0x8a, hi: 0x8a}, + {value: 0x1984, lo: 0x8b, hi: 0x8b}, + {value: 0x199f, lo: 0x8c, hi: 0x8c}, + {value: 0x19a5, lo: 0x8d, hi: 0x8d}, + {value: 0x1bc3, lo: 0x8e, hi: 0x8e}, + {value: 0x19b1, lo: 0x8f, hi: 0x8f}, + {value: 0x197b, lo: 0xaa, hi: 0xaa}, + {value: 0x197e, lo: 0xab, hi: 0xab}, + {value: 0x1981, lo: 0xac, hi: 0xac}, + // Block 0xa2, offset 0x361 + {value: 0x0000, lo: 0x01}, + {value: 0x193f, lo: 0x90, hi: 0x90}, + // Block 0xa3, offset 0x363 + {value: 0x0028, lo: 0x09}, + {value: 0x2865, lo: 0x80, hi: 0x80}, + {value: 0x2829, lo: 0x81, hi: 0x81}, + {value: 0x2833, lo: 0x82, hi: 0x82}, + {value: 0x2847, lo: 0x83, hi: 0x84}, + {value: 0x2851, lo: 0x85, hi: 0x86}, + {value: 0x283d, lo: 0x87, hi: 0x87}, + {value: 0x285b, lo: 0x88, hi: 0x88}, + {value: 0x0b6f, lo: 0x90, hi: 0x90}, + {value: 0x08e7, lo: 0x91, hi: 0x91}, +} + +// recompMap: 7520 bytes (entries only) +var recompMap map[uint32]rune +var recompMapOnce sync.Once + +const recompMapPacked = "" + + "\x00A\x03\x00\x00\x00\x00\xc0" + // 0x00410300: 0x000000C0 + "\x00A\x03\x01\x00\x00\x00\xc1" + // 0x00410301: 0x000000C1 + "\x00A\x03\x02\x00\x00\x00\xc2" + // 0x00410302: 0x000000C2 + "\x00A\x03\x03\x00\x00\x00\xc3" + // 0x00410303: 0x000000C3 + "\x00A\x03\b\x00\x00\x00\xc4" + // 0x00410308: 0x000000C4 + "\x00A\x03\n\x00\x00\x00\xc5" + // 0x0041030A: 0x000000C5 + "\x00C\x03'\x00\x00\x00\xc7" + // 0x00430327: 0x000000C7 + "\x00E\x03\x00\x00\x00\x00\xc8" + // 0x00450300: 0x000000C8 + "\x00E\x03\x01\x00\x00\x00\xc9" + // 0x00450301: 0x000000C9 + "\x00E\x03\x02\x00\x00\x00\xca" + // 0x00450302: 0x000000CA + "\x00E\x03\b\x00\x00\x00\xcb" + // 0x00450308: 0x000000CB + "\x00I\x03\x00\x00\x00\x00\xcc" + // 0x00490300: 0x000000CC + "\x00I\x03\x01\x00\x00\x00\xcd" + // 0x00490301: 0x000000CD + "\x00I\x03\x02\x00\x00\x00\xce" + // 0x00490302: 0x000000CE + "\x00I\x03\b\x00\x00\x00\xcf" + // 0x00490308: 0x000000CF + "\x00N\x03\x03\x00\x00\x00\xd1" + // 0x004E0303: 0x000000D1 + "\x00O\x03\x00\x00\x00\x00\xd2" + // 0x004F0300: 0x000000D2 + "\x00O\x03\x01\x00\x00\x00\xd3" + // 0x004F0301: 0x000000D3 + "\x00O\x03\x02\x00\x00\x00\xd4" + // 0x004F0302: 0x000000D4 + "\x00O\x03\x03\x00\x00\x00\xd5" + // 0x004F0303: 0x000000D5 + "\x00O\x03\b\x00\x00\x00\xd6" + // 0x004F0308: 0x000000D6 + "\x00U\x03\x00\x00\x00\x00\xd9" + // 0x00550300: 0x000000D9 + "\x00U\x03\x01\x00\x00\x00\xda" + // 0x00550301: 0x000000DA + "\x00U\x03\x02\x00\x00\x00\xdb" + // 0x00550302: 0x000000DB + "\x00U\x03\b\x00\x00\x00\xdc" + // 0x00550308: 0x000000DC + "\x00Y\x03\x01\x00\x00\x00\xdd" + // 0x00590301: 0x000000DD + "\x00a\x03\x00\x00\x00\x00\xe0" + // 0x00610300: 0x000000E0 + "\x00a\x03\x01\x00\x00\x00\xe1" + // 0x00610301: 0x000000E1 + "\x00a\x03\x02\x00\x00\x00\xe2" + // 0x00610302: 0x000000E2 + "\x00a\x03\x03\x00\x00\x00\xe3" + // 0x00610303: 0x000000E3 + "\x00a\x03\b\x00\x00\x00\xe4" + // 0x00610308: 0x000000E4 + "\x00a\x03\n\x00\x00\x00\xe5" + // 0x0061030A: 0x000000E5 + "\x00c\x03'\x00\x00\x00\xe7" + // 0x00630327: 0x000000E7 + "\x00e\x03\x00\x00\x00\x00\xe8" + // 0x00650300: 0x000000E8 + "\x00e\x03\x01\x00\x00\x00\xe9" + // 0x00650301: 0x000000E9 + "\x00e\x03\x02\x00\x00\x00\xea" + // 0x00650302: 0x000000EA + "\x00e\x03\b\x00\x00\x00\xeb" + // 0x00650308: 0x000000EB + "\x00i\x03\x00\x00\x00\x00\xec" + // 0x00690300: 0x000000EC + "\x00i\x03\x01\x00\x00\x00\xed" + // 0x00690301: 0x000000ED + "\x00i\x03\x02\x00\x00\x00\xee" + // 0x00690302: 0x000000EE + "\x00i\x03\b\x00\x00\x00\xef" + // 0x00690308: 0x000000EF + "\x00n\x03\x03\x00\x00\x00\xf1" + // 0x006E0303: 0x000000F1 + "\x00o\x03\x00\x00\x00\x00\xf2" + // 0x006F0300: 0x000000F2 + "\x00o\x03\x01\x00\x00\x00\xf3" + // 0x006F0301: 0x000000F3 + "\x00o\x03\x02\x00\x00\x00\xf4" + // 0x006F0302: 0x000000F4 + "\x00o\x03\x03\x00\x00\x00\xf5" + // 0x006F0303: 0x000000F5 + "\x00o\x03\b\x00\x00\x00\xf6" + // 0x006F0308: 0x000000F6 + "\x00u\x03\x00\x00\x00\x00\xf9" + // 0x00750300: 0x000000F9 + "\x00u\x03\x01\x00\x00\x00\xfa" + // 0x00750301: 0x000000FA + "\x00u\x03\x02\x00\x00\x00\xfb" + // 0x00750302: 0x000000FB + "\x00u\x03\b\x00\x00\x00\xfc" + // 0x00750308: 0x000000FC + "\x00y\x03\x01\x00\x00\x00\xfd" + // 0x00790301: 0x000000FD + "\x00y\x03\b\x00\x00\x00\xff" + // 0x00790308: 0x000000FF + "\x00A\x03\x04\x00\x00\x01\x00" + // 0x00410304: 0x00000100 + "\x00a\x03\x04\x00\x00\x01\x01" + // 0x00610304: 0x00000101 + "\x00A\x03\x06\x00\x00\x01\x02" + // 0x00410306: 0x00000102 + "\x00a\x03\x06\x00\x00\x01\x03" + // 0x00610306: 0x00000103 + "\x00A\x03(\x00\x00\x01\x04" + // 0x00410328: 0x00000104 + "\x00a\x03(\x00\x00\x01\x05" + // 0x00610328: 0x00000105 + "\x00C\x03\x01\x00\x00\x01\x06" + // 0x00430301: 0x00000106 + "\x00c\x03\x01\x00\x00\x01\a" + // 0x00630301: 0x00000107 + "\x00C\x03\x02\x00\x00\x01\b" + // 0x00430302: 0x00000108 + "\x00c\x03\x02\x00\x00\x01\t" + // 0x00630302: 0x00000109 + "\x00C\x03\a\x00\x00\x01\n" + // 0x00430307: 0x0000010A + "\x00c\x03\a\x00\x00\x01\v" + // 0x00630307: 0x0000010B + "\x00C\x03\f\x00\x00\x01\f" + // 0x0043030C: 0x0000010C + "\x00c\x03\f\x00\x00\x01\r" + // 0x0063030C: 0x0000010D + "\x00D\x03\f\x00\x00\x01\x0e" + // 0x0044030C: 0x0000010E + "\x00d\x03\f\x00\x00\x01\x0f" + // 0x0064030C: 0x0000010F + "\x00E\x03\x04\x00\x00\x01\x12" + // 0x00450304: 0x00000112 + "\x00e\x03\x04\x00\x00\x01\x13" + // 0x00650304: 0x00000113 + "\x00E\x03\x06\x00\x00\x01\x14" + // 0x00450306: 0x00000114 + "\x00e\x03\x06\x00\x00\x01\x15" + // 0x00650306: 0x00000115 + "\x00E\x03\a\x00\x00\x01\x16" + // 0x00450307: 0x00000116 + "\x00e\x03\a\x00\x00\x01\x17" + // 0x00650307: 0x00000117 + "\x00E\x03(\x00\x00\x01\x18" + // 0x00450328: 0x00000118 + "\x00e\x03(\x00\x00\x01\x19" + // 0x00650328: 0x00000119 + "\x00E\x03\f\x00\x00\x01\x1a" + // 0x0045030C: 0x0000011A + "\x00e\x03\f\x00\x00\x01\x1b" + // 0x0065030C: 0x0000011B + "\x00G\x03\x02\x00\x00\x01\x1c" + // 0x00470302: 0x0000011C + "\x00g\x03\x02\x00\x00\x01\x1d" + // 0x00670302: 0x0000011D + "\x00G\x03\x06\x00\x00\x01\x1e" + // 0x00470306: 0x0000011E + "\x00g\x03\x06\x00\x00\x01\x1f" + // 0x00670306: 0x0000011F + "\x00G\x03\a\x00\x00\x01 " + // 0x00470307: 0x00000120 + "\x00g\x03\a\x00\x00\x01!" + // 0x00670307: 0x00000121 + "\x00G\x03'\x00\x00\x01\"" + // 0x00470327: 0x00000122 + "\x00g\x03'\x00\x00\x01#" + // 0x00670327: 0x00000123 + "\x00H\x03\x02\x00\x00\x01$" + // 0x00480302: 0x00000124 + "\x00h\x03\x02\x00\x00\x01%" + // 0x00680302: 0x00000125 + "\x00I\x03\x03\x00\x00\x01(" + // 0x00490303: 0x00000128 + "\x00i\x03\x03\x00\x00\x01)" + // 0x00690303: 0x00000129 + "\x00I\x03\x04\x00\x00\x01*" + // 0x00490304: 0x0000012A + "\x00i\x03\x04\x00\x00\x01+" + // 0x00690304: 0x0000012B + "\x00I\x03\x06\x00\x00\x01," + // 0x00490306: 0x0000012C + "\x00i\x03\x06\x00\x00\x01-" + // 0x00690306: 0x0000012D + "\x00I\x03(\x00\x00\x01." + // 0x00490328: 0x0000012E + "\x00i\x03(\x00\x00\x01/" + // 0x00690328: 0x0000012F + "\x00I\x03\a\x00\x00\x010" + // 0x00490307: 0x00000130 + "\x00J\x03\x02\x00\x00\x014" + // 0x004A0302: 0x00000134 + "\x00j\x03\x02\x00\x00\x015" + // 0x006A0302: 0x00000135 + "\x00K\x03'\x00\x00\x016" + // 0x004B0327: 0x00000136 + "\x00k\x03'\x00\x00\x017" + // 0x006B0327: 0x00000137 + "\x00L\x03\x01\x00\x00\x019" + // 0x004C0301: 0x00000139 + "\x00l\x03\x01\x00\x00\x01:" + // 0x006C0301: 0x0000013A + "\x00L\x03'\x00\x00\x01;" + // 0x004C0327: 0x0000013B + "\x00l\x03'\x00\x00\x01<" + // 0x006C0327: 0x0000013C + "\x00L\x03\f\x00\x00\x01=" + // 0x004C030C: 0x0000013D + "\x00l\x03\f\x00\x00\x01>" + // 0x006C030C: 0x0000013E + "\x00N\x03\x01\x00\x00\x01C" + // 0x004E0301: 0x00000143 + "\x00n\x03\x01\x00\x00\x01D" + // 0x006E0301: 0x00000144 + "\x00N\x03'\x00\x00\x01E" + // 0x004E0327: 0x00000145 + "\x00n\x03'\x00\x00\x01F" + // 0x006E0327: 0x00000146 + "\x00N\x03\f\x00\x00\x01G" + // 0x004E030C: 0x00000147 + "\x00n\x03\f\x00\x00\x01H" + // 0x006E030C: 0x00000148 + "\x00O\x03\x04\x00\x00\x01L" + // 0x004F0304: 0x0000014C + "\x00o\x03\x04\x00\x00\x01M" + // 0x006F0304: 0x0000014D + "\x00O\x03\x06\x00\x00\x01N" + // 0x004F0306: 0x0000014E + "\x00o\x03\x06\x00\x00\x01O" + // 0x006F0306: 0x0000014F + "\x00O\x03\v\x00\x00\x01P" + // 0x004F030B: 0x00000150 + "\x00o\x03\v\x00\x00\x01Q" + // 0x006F030B: 0x00000151 + "\x00R\x03\x01\x00\x00\x01T" + // 0x00520301: 0x00000154 + "\x00r\x03\x01\x00\x00\x01U" + // 0x00720301: 0x00000155 + "\x00R\x03'\x00\x00\x01V" + // 0x00520327: 0x00000156 + "\x00r\x03'\x00\x00\x01W" + // 0x00720327: 0x00000157 + "\x00R\x03\f\x00\x00\x01X" + // 0x0052030C: 0x00000158 + "\x00r\x03\f\x00\x00\x01Y" + // 0x0072030C: 0x00000159 + "\x00S\x03\x01\x00\x00\x01Z" + // 0x00530301: 0x0000015A + "\x00s\x03\x01\x00\x00\x01[" + // 0x00730301: 0x0000015B + "\x00S\x03\x02\x00\x00\x01\\" + // 0x00530302: 0x0000015C + "\x00s\x03\x02\x00\x00\x01]" + // 0x00730302: 0x0000015D + "\x00S\x03'\x00\x00\x01^" + // 0x00530327: 0x0000015E + "\x00s\x03'\x00\x00\x01_" + // 0x00730327: 0x0000015F + "\x00S\x03\f\x00\x00\x01`" + // 0x0053030C: 0x00000160 + "\x00s\x03\f\x00\x00\x01a" + // 0x0073030C: 0x00000161 + "\x00T\x03'\x00\x00\x01b" + // 0x00540327: 0x00000162 + "\x00t\x03'\x00\x00\x01c" + // 0x00740327: 0x00000163 + "\x00T\x03\f\x00\x00\x01d" + // 0x0054030C: 0x00000164 + "\x00t\x03\f\x00\x00\x01e" + // 0x0074030C: 0x00000165 + "\x00U\x03\x03\x00\x00\x01h" + // 0x00550303: 0x00000168 + "\x00u\x03\x03\x00\x00\x01i" + // 0x00750303: 0x00000169 + "\x00U\x03\x04\x00\x00\x01j" + // 0x00550304: 0x0000016A + "\x00u\x03\x04\x00\x00\x01k" + // 0x00750304: 0x0000016B + "\x00U\x03\x06\x00\x00\x01l" + // 0x00550306: 0x0000016C + "\x00u\x03\x06\x00\x00\x01m" + // 0x00750306: 0x0000016D + "\x00U\x03\n\x00\x00\x01n" + // 0x0055030A: 0x0000016E + "\x00u\x03\n\x00\x00\x01o" + // 0x0075030A: 0x0000016F + "\x00U\x03\v\x00\x00\x01p" + // 0x0055030B: 0x00000170 + "\x00u\x03\v\x00\x00\x01q" + // 0x0075030B: 0x00000171 + "\x00U\x03(\x00\x00\x01r" + // 0x00550328: 0x00000172 + "\x00u\x03(\x00\x00\x01s" + // 0x00750328: 0x00000173 + "\x00W\x03\x02\x00\x00\x01t" + // 0x00570302: 0x00000174 + "\x00w\x03\x02\x00\x00\x01u" + // 0x00770302: 0x00000175 + "\x00Y\x03\x02\x00\x00\x01v" + // 0x00590302: 0x00000176 + "\x00y\x03\x02\x00\x00\x01w" + // 0x00790302: 0x00000177 + "\x00Y\x03\b\x00\x00\x01x" + // 0x00590308: 0x00000178 + "\x00Z\x03\x01\x00\x00\x01y" + // 0x005A0301: 0x00000179 + "\x00z\x03\x01\x00\x00\x01z" + // 0x007A0301: 0x0000017A + "\x00Z\x03\a\x00\x00\x01{" + // 0x005A0307: 0x0000017B + "\x00z\x03\a\x00\x00\x01|" + // 0x007A0307: 0x0000017C + "\x00Z\x03\f\x00\x00\x01}" + // 0x005A030C: 0x0000017D + "\x00z\x03\f\x00\x00\x01~" + // 0x007A030C: 0x0000017E + "\x00O\x03\x1b\x00\x00\x01\xa0" + // 0x004F031B: 0x000001A0 + "\x00o\x03\x1b\x00\x00\x01\xa1" + // 0x006F031B: 0x000001A1 + "\x00U\x03\x1b\x00\x00\x01\xaf" + // 0x0055031B: 0x000001AF + "\x00u\x03\x1b\x00\x00\x01\xb0" + // 0x0075031B: 0x000001B0 + "\x00A\x03\f\x00\x00\x01\xcd" + // 0x0041030C: 0x000001CD + "\x00a\x03\f\x00\x00\x01\xce" + // 0x0061030C: 0x000001CE + "\x00I\x03\f\x00\x00\x01\xcf" + // 0x0049030C: 0x000001CF + "\x00i\x03\f\x00\x00\x01\xd0" + // 0x0069030C: 0x000001D0 + "\x00O\x03\f\x00\x00\x01\xd1" + // 0x004F030C: 0x000001D1 + "\x00o\x03\f\x00\x00\x01\xd2" + // 0x006F030C: 0x000001D2 + "\x00U\x03\f\x00\x00\x01\xd3" + // 0x0055030C: 0x000001D3 + "\x00u\x03\f\x00\x00\x01\xd4" + // 0x0075030C: 0x000001D4 + "\x00\xdc\x03\x04\x00\x00\x01\xd5" + // 0x00DC0304: 0x000001D5 + "\x00\xfc\x03\x04\x00\x00\x01\xd6" + // 0x00FC0304: 0x000001D6 + "\x00\xdc\x03\x01\x00\x00\x01\xd7" + // 0x00DC0301: 0x000001D7 + "\x00\xfc\x03\x01\x00\x00\x01\xd8" + // 0x00FC0301: 0x000001D8 + "\x00\xdc\x03\f\x00\x00\x01\xd9" + // 0x00DC030C: 0x000001D9 + "\x00\xfc\x03\f\x00\x00\x01\xda" + // 0x00FC030C: 0x000001DA + "\x00\xdc\x03\x00\x00\x00\x01\xdb" + // 0x00DC0300: 0x000001DB + "\x00\xfc\x03\x00\x00\x00\x01\xdc" + // 0x00FC0300: 0x000001DC + "\x00\xc4\x03\x04\x00\x00\x01\xde" + // 0x00C40304: 0x000001DE + "\x00\xe4\x03\x04\x00\x00\x01\xdf" + // 0x00E40304: 0x000001DF + "\x02&\x03\x04\x00\x00\x01\xe0" + // 0x02260304: 0x000001E0 + "\x02'\x03\x04\x00\x00\x01\xe1" + // 0x02270304: 0x000001E1 + "\x00\xc6\x03\x04\x00\x00\x01\xe2" + // 0x00C60304: 0x000001E2 + "\x00\xe6\x03\x04\x00\x00\x01\xe3" + // 0x00E60304: 0x000001E3 + "\x00G\x03\f\x00\x00\x01\xe6" + // 0x0047030C: 0x000001E6 + "\x00g\x03\f\x00\x00\x01\xe7" + // 0x0067030C: 0x000001E7 + "\x00K\x03\f\x00\x00\x01\xe8" + // 0x004B030C: 0x000001E8 + "\x00k\x03\f\x00\x00\x01\xe9" + // 0x006B030C: 0x000001E9 + "\x00O\x03(\x00\x00\x01\xea" + // 0x004F0328: 0x000001EA + "\x00o\x03(\x00\x00\x01\xeb" + // 0x006F0328: 0x000001EB + "\x01\xea\x03\x04\x00\x00\x01\xec" + // 0x01EA0304: 0x000001EC + "\x01\xeb\x03\x04\x00\x00\x01\xed" + // 0x01EB0304: 0x000001ED + "\x01\xb7\x03\f\x00\x00\x01\xee" + // 0x01B7030C: 0x000001EE + "\x02\x92\x03\f\x00\x00\x01\xef" + // 0x0292030C: 0x000001EF + "\x00j\x03\f\x00\x00\x01\xf0" + // 0x006A030C: 0x000001F0 + "\x00G\x03\x01\x00\x00\x01\xf4" + // 0x00470301: 0x000001F4 + "\x00g\x03\x01\x00\x00\x01\xf5" + // 0x00670301: 0x000001F5 + "\x00N\x03\x00\x00\x00\x01\xf8" + // 0x004E0300: 0x000001F8 + "\x00n\x03\x00\x00\x00\x01\xf9" + // 0x006E0300: 0x000001F9 + "\x00\xc5\x03\x01\x00\x00\x01\xfa" + // 0x00C50301: 0x000001FA + "\x00\xe5\x03\x01\x00\x00\x01\xfb" + // 0x00E50301: 0x000001FB + "\x00\xc6\x03\x01\x00\x00\x01\xfc" + // 0x00C60301: 0x000001FC + "\x00\xe6\x03\x01\x00\x00\x01\xfd" + // 0x00E60301: 0x000001FD + "\x00\xd8\x03\x01\x00\x00\x01\xfe" + // 0x00D80301: 0x000001FE + "\x00\xf8\x03\x01\x00\x00\x01\xff" + // 0x00F80301: 0x000001FF + "\x00A\x03\x0f\x00\x00\x02\x00" + // 0x0041030F: 0x00000200 + "\x00a\x03\x0f\x00\x00\x02\x01" + // 0x0061030F: 0x00000201 + "\x00A\x03\x11\x00\x00\x02\x02" + // 0x00410311: 0x00000202 + "\x00a\x03\x11\x00\x00\x02\x03" + // 0x00610311: 0x00000203 + "\x00E\x03\x0f\x00\x00\x02\x04" + // 0x0045030F: 0x00000204 + "\x00e\x03\x0f\x00\x00\x02\x05" + // 0x0065030F: 0x00000205 + "\x00E\x03\x11\x00\x00\x02\x06" + // 0x00450311: 0x00000206 + "\x00e\x03\x11\x00\x00\x02\a" + // 0x00650311: 0x00000207 + "\x00I\x03\x0f\x00\x00\x02\b" + // 0x0049030F: 0x00000208 + "\x00i\x03\x0f\x00\x00\x02\t" + // 0x0069030F: 0x00000209 + "\x00I\x03\x11\x00\x00\x02\n" + // 0x00490311: 0x0000020A + "\x00i\x03\x11\x00\x00\x02\v" + // 0x00690311: 0x0000020B + "\x00O\x03\x0f\x00\x00\x02\f" + // 0x004F030F: 0x0000020C + "\x00o\x03\x0f\x00\x00\x02\r" + // 0x006F030F: 0x0000020D + "\x00O\x03\x11\x00\x00\x02\x0e" + // 0x004F0311: 0x0000020E + "\x00o\x03\x11\x00\x00\x02\x0f" + // 0x006F0311: 0x0000020F + "\x00R\x03\x0f\x00\x00\x02\x10" + // 0x0052030F: 0x00000210 + "\x00r\x03\x0f\x00\x00\x02\x11" + // 0x0072030F: 0x00000211 + "\x00R\x03\x11\x00\x00\x02\x12" + // 0x00520311: 0x00000212 + "\x00r\x03\x11\x00\x00\x02\x13" + // 0x00720311: 0x00000213 + "\x00U\x03\x0f\x00\x00\x02\x14" + // 0x0055030F: 0x00000214 + "\x00u\x03\x0f\x00\x00\x02\x15" + // 0x0075030F: 0x00000215 + "\x00U\x03\x11\x00\x00\x02\x16" + // 0x00550311: 0x00000216 + "\x00u\x03\x11\x00\x00\x02\x17" + // 0x00750311: 0x00000217 + "\x00S\x03&\x00\x00\x02\x18" + // 0x00530326: 0x00000218 + "\x00s\x03&\x00\x00\x02\x19" + // 0x00730326: 0x00000219 + "\x00T\x03&\x00\x00\x02\x1a" + // 0x00540326: 0x0000021A + "\x00t\x03&\x00\x00\x02\x1b" + // 0x00740326: 0x0000021B + "\x00H\x03\f\x00\x00\x02\x1e" + // 0x0048030C: 0x0000021E + "\x00h\x03\f\x00\x00\x02\x1f" + // 0x0068030C: 0x0000021F + "\x00A\x03\a\x00\x00\x02&" + // 0x00410307: 0x00000226 + "\x00a\x03\a\x00\x00\x02'" + // 0x00610307: 0x00000227 + "\x00E\x03'\x00\x00\x02(" + // 0x00450327: 0x00000228 + "\x00e\x03'\x00\x00\x02)" + // 0x00650327: 0x00000229 + "\x00\xd6\x03\x04\x00\x00\x02*" + // 0x00D60304: 0x0000022A + "\x00\xf6\x03\x04\x00\x00\x02+" + // 0x00F60304: 0x0000022B + "\x00\xd5\x03\x04\x00\x00\x02," + // 0x00D50304: 0x0000022C + "\x00\xf5\x03\x04\x00\x00\x02-" + // 0x00F50304: 0x0000022D + "\x00O\x03\a\x00\x00\x02." + // 0x004F0307: 0x0000022E + "\x00o\x03\a\x00\x00\x02/" + // 0x006F0307: 0x0000022F + "\x02.\x03\x04\x00\x00\x020" + // 0x022E0304: 0x00000230 + "\x02/\x03\x04\x00\x00\x021" + // 0x022F0304: 0x00000231 + "\x00Y\x03\x04\x00\x00\x022" + // 0x00590304: 0x00000232 + "\x00y\x03\x04\x00\x00\x023" + // 0x00790304: 0x00000233 + "\x00\xa8\x03\x01\x00\x00\x03\x85" + // 0x00A80301: 0x00000385 + "\x03\x91\x03\x01\x00\x00\x03\x86" + // 0x03910301: 0x00000386 + "\x03\x95\x03\x01\x00\x00\x03\x88" + // 0x03950301: 0x00000388 + "\x03\x97\x03\x01\x00\x00\x03\x89" + // 0x03970301: 0x00000389 + "\x03\x99\x03\x01\x00\x00\x03\x8a" + // 0x03990301: 0x0000038A + "\x03\x9f\x03\x01\x00\x00\x03\x8c" + // 0x039F0301: 0x0000038C + "\x03\xa5\x03\x01\x00\x00\x03\x8e" + // 0x03A50301: 0x0000038E + "\x03\xa9\x03\x01\x00\x00\x03\x8f" + // 0x03A90301: 0x0000038F + "\x03\xca\x03\x01\x00\x00\x03\x90" + // 0x03CA0301: 0x00000390 + "\x03\x99\x03\b\x00\x00\x03\xaa" + // 0x03990308: 0x000003AA + "\x03\xa5\x03\b\x00\x00\x03\xab" + // 0x03A50308: 0x000003AB + "\x03\xb1\x03\x01\x00\x00\x03\xac" + // 0x03B10301: 0x000003AC + "\x03\xb5\x03\x01\x00\x00\x03\xad" + // 0x03B50301: 0x000003AD + "\x03\xb7\x03\x01\x00\x00\x03\xae" + // 0x03B70301: 0x000003AE + "\x03\xb9\x03\x01\x00\x00\x03\xaf" + // 0x03B90301: 0x000003AF + "\x03\xcb\x03\x01\x00\x00\x03\xb0" + // 0x03CB0301: 0x000003B0 + "\x03\xb9\x03\b\x00\x00\x03\xca" + // 0x03B90308: 0x000003CA + "\x03\xc5\x03\b\x00\x00\x03\xcb" + // 0x03C50308: 0x000003CB + "\x03\xbf\x03\x01\x00\x00\x03\xcc" + // 0x03BF0301: 0x000003CC + "\x03\xc5\x03\x01\x00\x00\x03\xcd" + // 0x03C50301: 0x000003CD + "\x03\xc9\x03\x01\x00\x00\x03\xce" + // 0x03C90301: 0x000003CE + "\x03\xd2\x03\x01\x00\x00\x03\xd3" + // 0x03D20301: 0x000003D3 + "\x03\xd2\x03\b\x00\x00\x03\xd4" + // 0x03D20308: 0x000003D4 + "\x04\x15\x03\x00\x00\x00\x04\x00" + // 0x04150300: 0x00000400 + "\x04\x15\x03\b\x00\x00\x04\x01" + // 0x04150308: 0x00000401 + "\x04\x13\x03\x01\x00\x00\x04\x03" + // 0x04130301: 0x00000403 + "\x04\x06\x03\b\x00\x00\x04\a" + // 0x04060308: 0x00000407 + "\x04\x1a\x03\x01\x00\x00\x04\f" + // 0x041A0301: 0x0000040C + "\x04\x18\x03\x00\x00\x00\x04\r" + // 0x04180300: 0x0000040D + "\x04#\x03\x06\x00\x00\x04\x0e" + // 0x04230306: 0x0000040E + "\x04\x18\x03\x06\x00\x00\x04\x19" + // 0x04180306: 0x00000419 + "\x048\x03\x06\x00\x00\x049" + // 0x04380306: 0x00000439 + "\x045\x03\x00\x00\x00\x04P" + // 0x04350300: 0x00000450 + "\x045\x03\b\x00\x00\x04Q" + // 0x04350308: 0x00000451 + "\x043\x03\x01\x00\x00\x04S" + // 0x04330301: 0x00000453 + "\x04V\x03\b\x00\x00\x04W" + // 0x04560308: 0x00000457 + "\x04:\x03\x01\x00\x00\x04\\" + // 0x043A0301: 0x0000045C + "\x048\x03\x00\x00\x00\x04]" + // 0x04380300: 0x0000045D + "\x04C\x03\x06\x00\x00\x04^" + // 0x04430306: 0x0000045E + "\x04t\x03\x0f\x00\x00\x04v" + // 0x0474030F: 0x00000476 + "\x04u\x03\x0f\x00\x00\x04w" + // 0x0475030F: 0x00000477 + "\x04\x16\x03\x06\x00\x00\x04\xc1" + // 0x04160306: 0x000004C1 + "\x046\x03\x06\x00\x00\x04\xc2" + // 0x04360306: 0x000004C2 + "\x04\x10\x03\x06\x00\x00\x04\xd0" + // 0x04100306: 0x000004D0 + "\x040\x03\x06\x00\x00\x04\xd1" + // 0x04300306: 0x000004D1 + "\x04\x10\x03\b\x00\x00\x04\xd2" + // 0x04100308: 0x000004D2 + "\x040\x03\b\x00\x00\x04\xd3" + // 0x04300308: 0x000004D3 + "\x04\x15\x03\x06\x00\x00\x04\xd6" + // 0x04150306: 0x000004D6 + "\x045\x03\x06\x00\x00\x04\xd7" + // 0x04350306: 0x000004D7 + "\x04\xd8\x03\b\x00\x00\x04\xda" + // 0x04D80308: 0x000004DA + "\x04\xd9\x03\b\x00\x00\x04\xdb" + // 0x04D90308: 0x000004DB + "\x04\x16\x03\b\x00\x00\x04\xdc" + // 0x04160308: 0x000004DC + "\x046\x03\b\x00\x00\x04\xdd" + // 0x04360308: 0x000004DD + "\x04\x17\x03\b\x00\x00\x04\xde" + // 0x04170308: 0x000004DE + "\x047\x03\b\x00\x00\x04\xdf" + // 0x04370308: 0x000004DF + "\x04\x18\x03\x04\x00\x00\x04\xe2" + // 0x04180304: 0x000004E2 + "\x048\x03\x04\x00\x00\x04\xe3" + // 0x04380304: 0x000004E3 + "\x04\x18\x03\b\x00\x00\x04\xe4" + // 0x04180308: 0x000004E4 + "\x048\x03\b\x00\x00\x04\xe5" + // 0x04380308: 0x000004E5 + "\x04\x1e\x03\b\x00\x00\x04\xe6" + // 0x041E0308: 0x000004E6 + "\x04>\x03\b\x00\x00\x04\xe7" + // 0x043E0308: 0x000004E7 + "\x04\xe8\x03\b\x00\x00\x04\xea" + // 0x04E80308: 0x000004EA + "\x04\xe9\x03\b\x00\x00\x04\xeb" + // 0x04E90308: 0x000004EB + "\x04-\x03\b\x00\x00\x04\xec" + // 0x042D0308: 0x000004EC + "\x04M\x03\b\x00\x00\x04\xed" + // 0x044D0308: 0x000004ED + "\x04#\x03\x04\x00\x00\x04\xee" + // 0x04230304: 0x000004EE + "\x04C\x03\x04\x00\x00\x04\xef" + // 0x04430304: 0x000004EF + "\x04#\x03\b\x00\x00\x04\xf0" + // 0x04230308: 0x000004F0 + "\x04C\x03\b\x00\x00\x04\xf1" + // 0x04430308: 0x000004F1 + "\x04#\x03\v\x00\x00\x04\xf2" + // 0x0423030B: 0x000004F2 + "\x04C\x03\v\x00\x00\x04\xf3" + // 0x0443030B: 0x000004F3 + "\x04'\x03\b\x00\x00\x04\xf4" + // 0x04270308: 0x000004F4 + "\x04G\x03\b\x00\x00\x04\xf5" + // 0x04470308: 0x000004F5 + "\x04+\x03\b\x00\x00\x04\xf8" + // 0x042B0308: 0x000004F8 + "\x04K\x03\b\x00\x00\x04\xf9" + // 0x044B0308: 0x000004F9 + "\x06'\x06S\x00\x00\x06\"" + // 0x06270653: 0x00000622 + "\x06'\x06T\x00\x00\x06#" + // 0x06270654: 0x00000623 + "\x06H\x06T\x00\x00\x06$" + // 0x06480654: 0x00000624 + "\x06'\x06U\x00\x00\x06%" + // 0x06270655: 0x00000625 + "\x06J\x06T\x00\x00\x06&" + // 0x064A0654: 0x00000626 + "\x06\xd5\x06T\x00\x00\x06\xc0" + // 0x06D50654: 0x000006C0 + "\x06\xc1\x06T\x00\x00\x06\xc2" + // 0x06C10654: 0x000006C2 + "\x06\xd2\x06T\x00\x00\x06\xd3" + // 0x06D20654: 0x000006D3 + "\t(\t<\x00\x00\t)" + // 0x0928093C: 0x00000929 + "\t0\t<\x00\x00\t1" + // 0x0930093C: 0x00000931 + "\t3\t<\x00\x00\t4" + // 0x0933093C: 0x00000934 + "\t\xc7\t\xbe\x00\x00\t\xcb" + // 0x09C709BE: 0x000009CB + "\t\xc7\t\xd7\x00\x00\t\xcc" + // 0x09C709D7: 0x000009CC + "\vG\vV\x00\x00\vH" + // 0x0B470B56: 0x00000B48 + "\vG\v>\x00\x00\vK" + // 0x0B470B3E: 0x00000B4B + "\vG\vW\x00\x00\vL" + // 0x0B470B57: 0x00000B4C + "\v\x92\v\xd7\x00\x00\v\x94" + // 0x0B920BD7: 0x00000B94 + "\v\xc6\v\xbe\x00\x00\v\xca" + // 0x0BC60BBE: 0x00000BCA + "\v\xc7\v\xbe\x00\x00\v\xcb" + // 0x0BC70BBE: 0x00000BCB + "\v\xc6\v\xd7\x00\x00\v\xcc" + // 0x0BC60BD7: 0x00000BCC + "\fF\fV\x00\x00\fH" + // 0x0C460C56: 0x00000C48 + "\f\xbf\f\xd5\x00\x00\f\xc0" + // 0x0CBF0CD5: 0x00000CC0 + "\f\xc6\f\xd5\x00\x00\f\xc7" + // 0x0CC60CD5: 0x00000CC7 + "\f\xc6\f\xd6\x00\x00\f\xc8" + // 0x0CC60CD6: 0x00000CC8 + "\f\xc6\f\xc2\x00\x00\f\xca" + // 0x0CC60CC2: 0x00000CCA + "\f\xca\f\xd5\x00\x00\f\xcb" + // 0x0CCA0CD5: 0x00000CCB + "\rF\r>\x00\x00\rJ" + // 0x0D460D3E: 0x00000D4A + "\rG\r>\x00\x00\rK" + // 0x0D470D3E: 0x00000D4B + "\rF\rW\x00\x00\rL" + // 0x0D460D57: 0x00000D4C + "\r\xd9\r\xca\x00\x00\r\xda" + // 0x0DD90DCA: 0x00000DDA + "\r\xd9\r\xcf\x00\x00\r\xdc" + // 0x0DD90DCF: 0x00000DDC + "\r\xdc\r\xca\x00\x00\r\xdd" + // 0x0DDC0DCA: 0x00000DDD + "\r\xd9\r\xdf\x00\x00\r\xde" + // 0x0DD90DDF: 0x00000DDE + "\x10%\x10.\x00\x00\x10&" + // 0x1025102E: 0x00001026 + "\x1b\x05\x1b5\x00\x00\x1b\x06" + // 0x1B051B35: 0x00001B06 + "\x1b\a\x1b5\x00\x00\x1b\b" + // 0x1B071B35: 0x00001B08 + "\x1b\t\x1b5\x00\x00\x1b\n" + // 0x1B091B35: 0x00001B0A + "\x1b\v\x1b5\x00\x00\x1b\f" + // 0x1B0B1B35: 0x00001B0C + "\x1b\r\x1b5\x00\x00\x1b\x0e" + // 0x1B0D1B35: 0x00001B0E + "\x1b\x11\x1b5\x00\x00\x1b\x12" + // 0x1B111B35: 0x00001B12 + "\x1b:\x1b5\x00\x00\x1b;" + // 0x1B3A1B35: 0x00001B3B + "\x1b<\x1b5\x00\x00\x1b=" + // 0x1B3C1B35: 0x00001B3D + "\x1b>\x1b5\x00\x00\x1b@" + // 0x1B3E1B35: 0x00001B40 + "\x1b?\x1b5\x00\x00\x1bA" + // 0x1B3F1B35: 0x00001B41 + "\x1bB\x1b5\x00\x00\x1bC" + // 0x1B421B35: 0x00001B43 + "\x00A\x03%\x00\x00\x1e\x00" + // 0x00410325: 0x00001E00 + "\x00a\x03%\x00\x00\x1e\x01" + // 0x00610325: 0x00001E01 + "\x00B\x03\a\x00\x00\x1e\x02" + // 0x00420307: 0x00001E02 + "\x00b\x03\a\x00\x00\x1e\x03" + // 0x00620307: 0x00001E03 + "\x00B\x03#\x00\x00\x1e\x04" + // 0x00420323: 0x00001E04 + "\x00b\x03#\x00\x00\x1e\x05" + // 0x00620323: 0x00001E05 + "\x00B\x031\x00\x00\x1e\x06" + // 0x00420331: 0x00001E06 + "\x00b\x031\x00\x00\x1e\a" + // 0x00620331: 0x00001E07 + "\x00\xc7\x03\x01\x00\x00\x1e\b" + // 0x00C70301: 0x00001E08 + "\x00\xe7\x03\x01\x00\x00\x1e\t" + // 0x00E70301: 0x00001E09 + "\x00D\x03\a\x00\x00\x1e\n" + // 0x00440307: 0x00001E0A + "\x00d\x03\a\x00\x00\x1e\v" + // 0x00640307: 0x00001E0B + "\x00D\x03#\x00\x00\x1e\f" + // 0x00440323: 0x00001E0C + "\x00d\x03#\x00\x00\x1e\r" + // 0x00640323: 0x00001E0D + "\x00D\x031\x00\x00\x1e\x0e" + // 0x00440331: 0x00001E0E + "\x00d\x031\x00\x00\x1e\x0f" + // 0x00640331: 0x00001E0F + "\x00D\x03'\x00\x00\x1e\x10" + // 0x00440327: 0x00001E10 + "\x00d\x03'\x00\x00\x1e\x11" + // 0x00640327: 0x00001E11 + "\x00D\x03-\x00\x00\x1e\x12" + // 0x0044032D: 0x00001E12 + "\x00d\x03-\x00\x00\x1e\x13" + // 0x0064032D: 0x00001E13 + "\x01\x12\x03\x00\x00\x00\x1e\x14" + // 0x01120300: 0x00001E14 + "\x01\x13\x03\x00\x00\x00\x1e\x15" + // 0x01130300: 0x00001E15 + "\x01\x12\x03\x01\x00\x00\x1e\x16" + // 0x01120301: 0x00001E16 + "\x01\x13\x03\x01\x00\x00\x1e\x17" + // 0x01130301: 0x00001E17 + "\x00E\x03-\x00\x00\x1e\x18" + // 0x0045032D: 0x00001E18 + "\x00e\x03-\x00\x00\x1e\x19" + // 0x0065032D: 0x00001E19 + "\x00E\x030\x00\x00\x1e\x1a" + // 0x00450330: 0x00001E1A + "\x00e\x030\x00\x00\x1e\x1b" + // 0x00650330: 0x00001E1B + "\x02(\x03\x06\x00\x00\x1e\x1c" + // 0x02280306: 0x00001E1C + "\x02)\x03\x06\x00\x00\x1e\x1d" + // 0x02290306: 0x00001E1D + "\x00F\x03\a\x00\x00\x1e\x1e" + // 0x00460307: 0x00001E1E + "\x00f\x03\a\x00\x00\x1e\x1f" + // 0x00660307: 0x00001E1F + "\x00G\x03\x04\x00\x00\x1e " + // 0x00470304: 0x00001E20 + "\x00g\x03\x04\x00\x00\x1e!" + // 0x00670304: 0x00001E21 + "\x00H\x03\a\x00\x00\x1e\"" + // 0x00480307: 0x00001E22 + "\x00h\x03\a\x00\x00\x1e#" + // 0x00680307: 0x00001E23 + "\x00H\x03#\x00\x00\x1e$" + // 0x00480323: 0x00001E24 + "\x00h\x03#\x00\x00\x1e%" + // 0x00680323: 0x00001E25 + "\x00H\x03\b\x00\x00\x1e&" + // 0x00480308: 0x00001E26 + "\x00h\x03\b\x00\x00\x1e'" + // 0x00680308: 0x00001E27 + "\x00H\x03'\x00\x00\x1e(" + // 0x00480327: 0x00001E28 + "\x00h\x03'\x00\x00\x1e)" + // 0x00680327: 0x00001E29 + "\x00H\x03.\x00\x00\x1e*" + // 0x0048032E: 0x00001E2A + "\x00h\x03.\x00\x00\x1e+" + // 0x0068032E: 0x00001E2B + "\x00I\x030\x00\x00\x1e," + // 0x00490330: 0x00001E2C + "\x00i\x030\x00\x00\x1e-" + // 0x00690330: 0x00001E2D + "\x00\xcf\x03\x01\x00\x00\x1e." + // 0x00CF0301: 0x00001E2E + "\x00\xef\x03\x01\x00\x00\x1e/" + // 0x00EF0301: 0x00001E2F + "\x00K\x03\x01\x00\x00\x1e0" + // 0x004B0301: 0x00001E30 + "\x00k\x03\x01\x00\x00\x1e1" + // 0x006B0301: 0x00001E31 + "\x00K\x03#\x00\x00\x1e2" + // 0x004B0323: 0x00001E32 + "\x00k\x03#\x00\x00\x1e3" + // 0x006B0323: 0x00001E33 + "\x00K\x031\x00\x00\x1e4" + // 0x004B0331: 0x00001E34 + "\x00k\x031\x00\x00\x1e5" + // 0x006B0331: 0x00001E35 + "\x00L\x03#\x00\x00\x1e6" + // 0x004C0323: 0x00001E36 + "\x00l\x03#\x00\x00\x1e7" + // 0x006C0323: 0x00001E37 + "\x1e6\x03\x04\x00\x00\x1e8" + // 0x1E360304: 0x00001E38 + "\x1e7\x03\x04\x00\x00\x1e9" + // 0x1E370304: 0x00001E39 + "\x00L\x031\x00\x00\x1e:" + // 0x004C0331: 0x00001E3A + "\x00l\x031\x00\x00\x1e;" + // 0x006C0331: 0x00001E3B + "\x00L\x03-\x00\x00\x1e<" + // 0x004C032D: 0x00001E3C + "\x00l\x03-\x00\x00\x1e=" + // 0x006C032D: 0x00001E3D + "\x00M\x03\x01\x00\x00\x1e>" + // 0x004D0301: 0x00001E3E + "\x00m\x03\x01\x00\x00\x1e?" + // 0x006D0301: 0x00001E3F + "\x00M\x03\a\x00\x00\x1e@" + // 0x004D0307: 0x00001E40 + "\x00m\x03\a\x00\x00\x1eA" + // 0x006D0307: 0x00001E41 + "\x00M\x03#\x00\x00\x1eB" + // 0x004D0323: 0x00001E42 + "\x00m\x03#\x00\x00\x1eC" + // 0x006D0323: 0x00001E43 + "\x00N\x03\a\x00\x00\x1eD" + // 0x004E0307: 0x00001E44 + "\x00n\x03\a\x00\x00\x1eE" + // 0x006E0307: 0x00001E45 + "\x00N\x03#\x00\x00\x1eF" + // 0x004E0323: 0x00001E46 + "\x00n\x03#\x00\x00\x1eG" + // 0x006E0323: 0x00001E47 + "\x00N\x031\x00\x00\x1eH" + // 0x004E0331: 0x00001E48 + "\x00n\x031\x00\x00\x1eI" + // 0x006E0331: 0x00001E49 + "\x00N\x03-\x00\x00\x1eJ" + // 0x004E032D: 0x00001E4A + "\x00n\x03-\x00\x00\x1eK" + // 0x006E032D: 0x00001E4B + "\x00\xd5\x03\x01\x00\x00\x1eL" + // 0x00D50301: 0x00001E4C + "\x00\xf5\x03\x01\x00\x00\x1eM" + // 0x00F50301: 0x00001E4D + "\x00\xd5\x03\b\x00\x00\x1eN" + // 0x00D50308: 0x00001E4E + "\x00\xf5\x03\b\x00\x00\x1eO" + // 0x00F50308: 0x00001E4F + "\x01L\x03\x00\x00\x00\x1eP" + // 0x014C0300: 0x00001E50 + "\x01M\x03\x00\x00\x00\x1eQ" + // 0x014D0300: 0x00001E51 + "\x01L\x03\x01\x00\x00\x1eR" + // 0x014C0301: 0x00001E52 + "\x01M\x03\x01\x00\x00\x1eS" + // 0x014D0301: 0x00001E53 + "\x00P\x03\x01\x00\x00\x1eT" + // 0x00500301: 0x00001E54 + "\x00p\x03\x01\x00\x00\x1eU" + // 0x00700301: 0x00001E55 + "\x00P\x03\a\x00\x00\x1eV" + // 0x00500307: 0x00001E56 + "\x00p\x03\a\x00\x00\x1eW" + // 0x00700307: 0x00001E57 + "\x00R\x03\a\x00\x00\x1eX" + // 0x00520307: 0x00001E58 + "\x00r\x03\a\x00\x00\x1eY" + // 0x00720307: 0x00001E59 + "\x00R\x03#\x00\x00\x1eZ" + // 0x00520323: 0x00001E5A + "\x00r\x03#\x00\x00\x1e[" + // 0x00720323: 0x00001E5B + "\x1eZ\x03\x04\x00\x00\x1e\\" + // 0x1E5A0304: 0x00001E5C + "\x1e[\x03\x04\x00\x00\x1e]" + // 0x1E5B0304: 0x00001E5D + "\x00R\x031\x00\x00\x1e^" + // 0x00520331: 0x00001E5E + "\x00r\x031\x00\x00\x1e_" + // 0x00720331: 0x00001E5F + "\x00S\x03\a\x00\x00\x1e`" + // 0x00530307: 0x00001E60 + "\x00s\x03\a\x00\x00\x1ea" + // 0x00730307: 0x00001E61 + "\x00S\x03#\x00\x00\x1eb" + // 0x00530323: 0x00001E62 + "\x00s\x03#\x00\x00\x1ec" + // 0x00730323: 0x00001E63 + "\x01Z\x03\a\x00\x00\x1ed" + // 0x015A0307: 0x00001E64 + "\x01[\x03\a\x00\x00\x1ee" + // 0x015B0307: 0x00001E65 + "\x01`\x03\a\x00\x00\x1ef" + // 0x01600307: 0x00001E66 + "\x01a\x03\a\x00\x00\x1eg" + // 0x01610307: 0x00001E67 + "\x1eb\x03\a\x00\x00\x1eh" + // 0x1E620307: 0x00001E68 + "\x1ec\x03\a\x00\x00\x1ei" + // 0x1E630307: 0x00001E69 + "\x00T\x03\a\x00\x00\x1ej" + // 0x00540307: 0x00001E6A + "\x00t\x03\a\x00\x00\x1ek" + // 0x00740307: 0x00001E6B + "\x00T\x03#\x00\x00\x1el" + // 0x00540323: 0x00001E6C + "\x00t\x03#\x00\x00\x1em" + // 0x00740323: 0x00001E6D + "\x00T\x031\x00\x00\x1en" + // 0x00540331: 0x00001E6E + "\x00t\x031\x00\x00\x1eo" + // 0x00740331: 0x00001E6F + "\x00T\x03-\x00\x00\x1ep" + // 0x0054032D: 0x00001E70 + "\x00t\x03-\x00\x00\x1eq" + // 0x0074032D: 0x00001E71 + "\x00U\x03$\x00\x00\x1er" + // 0x00550324: 0x00001E72 + "\x00u\x03$\x00\x00\x1es" + // 0x00750324: 0x00001E73 + "\x00U\x030\x00\x00\x1et" + // 0x00550330: 0x00001E74 + "\x00u\x030\x00\x00\x1eu" + // 0x00750330: 0x00001E75 + "\x00U\x03-\x00\x00\x1ev" + // 0x0055032D: 0x00001E76 + "\x00u\x03-\x00\x00\x1ew" + // 0x0075032D: 0x00001E77 + "\x01h\x03\x01\x00\x00\x1ex" + // 0x01680301: 0x00001E78 + "\x01i\x03\x01\x00\x00\x1ey" + // 0x01690301: 0x00001E79 + "\x01j\x03\b\x00\x00\x1ez" + // 0x016A0308: 0x00001E7A + "\x01k\x03\b\x00\x00\x1e{" + // 0x016B0308: 0x00001E7B + "\x00V\x03\x03\x00\x00\x1e|" + // 0x00560303: 0x00001E7C + "\x00v\x03\x03\x00\x00\x1e}" + // 0x00760303: 0x00001E7D + "\x00V\x03#\x00\x00\x1e~" + // 0x00560323: 0x00001E7E + "\x00v\x03#\x00\x00\x1e\u007f" + // 0x00760323: 0x00001E7F + "\x00W\x03\x00\x00\x00\x1e\x80" + // 0x00570300: 0x00001E80 + "\x00w\x03\x00\x00\x00\x1e\x81" + // 0x00770300: 0x00001E81 + "\x00W\x03\x01\x00\x00\x1e\x82" + // 0x00570301: 0x00001E82 + "\x00w\x03\x01\x00\x00\x1e\x83" + // 0x00770301: 0x00001E83 + "\x00W\x03\b\x00\x00\x1e\x84" + // 0x00570308: 0x00001E84 + "\x00w\x03\b\x00\x00\x1e\x85" + // 0x00770308: 0x00001E85 + "\x00W\x03\a\x00\x00\x1e\x86" + // 0x00570307: 0x00001E86 + "\x00w\x03\a\x00\x00\x1e\x87" + // 0x00770307: 0x00001E87 + "\x00W\x03#\x00\x00\x1e\x88" + // 0x00570323: 0x00001E88 + "\x00w\x03#\x00\x00\x1e\x89" + // 0x00770323: 0x00001E89 + "\x00X\x03\a\x00\x00\x1e\x8a" + // 0x00580307: 0x00001E8A + "\x00x\x03\a\x00\x00\x1e\x8b" + // 0x00780307: 0x00001E8B + "\x00X\x03\b\x00\x00\x1e\x8c" + // 0x00580308: 0x00001E8C + "\x00x\x03\b\x00\x00\x1e\x8d" + // 0x00780308: 0x00001E8D + "\x00Y\x03\a\x00\x00\x1e\x8e" + // 0x00590307: 0x00001E8E + "\x00y\x03\a\x00\x00\x1e\x8f" + // 0x00790307: 0x00001E8F + "\x00Z\x03\x02\x00\x00\x1e\x90" + // 0x005A0302: 0x00001E90 + "\x00z\x03\x02\x00\x00\x1e\x91" + // 0x007A0302: 0x00001E91 + "\x00Z\x03#\x00\x00\x1e\x92" + // 0x005A0323: 0x00001E92 + "\x00z\x03#\x00\x00\x1e\x93" + // 0x007A0323: 0x00001E93 + "\x00Z\x031\x00\x00\x1e\x94" + // 0x005A0331: 0x00001E94 + "\x00z\x031\x00\x00\x1e\x95" + // 0x007A0331: 0x00001E95 + "\x00h\x031\x00\x00\x1e\x96" + // 0x00680331: 0x00001E96 + "\x00t\x03\b\x00\x00\x1e\x97" + // 0x00740308: 0x00001E97 + "\x00w\x03\n\x00\x00\x1e\x98" + // 0x0077030A: 0x00001E98 + "\x00y\x03\n\x00\x00\x1e\x99" + // 0x0079030A: 0x00001E99 + "\x01\u007f\x03\a\x00\x00\x1e\x9b" + // 0x017F0307: 0x00001E9B + "\x00A\x03#\x00\x00\x1e\xa0" + // 0x00410323: 0x00001EA0 + "\x00a\x03#\x00\x00\x1e\xa1" + // 0x00610323: 0x00001EA1 + "\x00A\x03\t\x00\x00\x1e\xa2" + // 0x00410309: 0x00001EA2 + "\x00a\x03\t\x00\x00\x1e\xa3" + // 0x00610309: 0x00001EA3 + "\x00\xc2\x03\x01\x00\x00\x1e\xa4" + // 0x00C20301: 0x00001EA4 + "\x00\xe2\x03\x01\x00\x00\x1e\xa5" + // 0x00E20301: 0x00001EA5 + "\x00\xc2\x03\x00\x00\x00\x1e\xa6" + // 0x00C20300: 0x00001EA6 + "\x00\xe2\x03\x00\x00\x00\x1e\xa7" + // 0x00E20300: 0x00001EA7 + "\x00\xc2\x03\t\x00\x00\x1e\xa8" + // 0x00C20309: 0x00001EA8 + "\x00\xe2\x03\t\x00\x00\x1e\xa9" + // 0x00E20309: 0x00001EA9 + "\x00\xc2\x03\x03\x00\x00\x1e\xaa" + // 0x00C20303: 0x00001EAA + "\x00\xe2\x03\x03\x00\x00\x1e\xab" + // 0x00E20303: 0x00001EAB + "\x1e\xa0\x03\x02\x00\x00\x1e\xac" + // 0x1EA00302: 0x00001EAC + "\x1e\xa1\x03\x02\x00\x00\x1e\xad" + // 0x1EA10302: 0x00001EAD + "\x01\x02\x03\x01\x00\x00\x1e\xae" + // 0x01020301: 0x00001EAE + "\x01\x03\x03\x01\x00\x00\x1e\xaf" + // 0x01030301: 0x00001EAF + "\x01\x02\x03\x00\x00\x00\x1e\xb0" + // 0x01020300: 0x00001EB0 + "\x01\x03\x03\x00\x00\x00\x1e\xb1" + // 0x01030300: 0x00001EB1 + "\x01\x02\x03\t\x00\x00\x1e\xb2" + // 0x01020309: 0x00001EB2 + "\x01\x03\x03\t\x00\x00\x1e\xb3" + // 0x01030309: 0x00001EB3 + "\x01\x02\x03\x03\x00\x00\x1e\xb4" + // 0x01020303: 0x00001EB4 + "\x01\x03\x03\x03\x00\x00\x1e\xb5" + // 0x01030303: 0x00001EB5 + "\x1e\xa0\x03\x06\x00\x00\x1e\xb6" + // 0x1EA00306: 0x00001EB6 + "\x1e\xa1\x03\x06\x00\x00\x1e\xb7" + // 0x1EA10306: 0x00001EB7 + "\x00E\x03#\x00\x00\x1e\xb8" + // 0x00450323: 0x00001EB8 + "\x00e\x03#\x00\x00\x1e\xb9" + // 0x00650323: 0x00001EB9 + "\x00E\x03\t\x00\x00\x1e\xba" + // 0x00450309: 0x00001EBA + "\x00e\x03\t\x00\x00\x1e\xbb" + // 0x00650309: 0x00001EBB + "\x00E\x03\x03\x00\x00\x1e\xbc" + // 0x00450303: 0x00001EBC + "\x00e\x03\x03\x00\x00\x1e\xbd" + // 0x00650303: 0x00001EBD + "\x00\xca\x03\x01\x00\x00\x1e\xbe" + // 0x00CA0301: 0x00001EBE + "\x00\xea\x03\x01\x00\x00\x1e\xbf" + // 0x00EA0301: 0x00001EBF + "\x00\xca\x03\x00\x00\x00\x1e\xc0" + // 0x00CA0300: 0x00001EC0 + "\x00\xea\x03\x00\x00\x00\x1e\xc1" + // 0x00EA0300: 0x00001EC1 + "\x00\xca\x03\t\x00\x00\x1e\xc2" + // 0x00CA0309: 0x00001EC2 + "\x00\xea\x03\t\x00\x00\x1e\xc3" + // 0x00EA0309: 0x00001EC3 + "\x00\xca\x03\x03\x00\x00\x1e\xc4" + // 0x00CA0303: 0x00001EC4 + "\x00\xea\x03\x03\x00\x00\x1e\xc5" + // 0x00EA0303: 0x00001EC5 + "\x1e\xb8\x03\x02\x00\x00\x1e\xc6" + // 0x1EB80302: 0x00001EC6 + "\x1e\xb9\x03\x02\x00\x00\x1e\xc7" + // 0x1EB90302: 0x00001EC7 + "\x00I\x03\t\x00\x00\x1e\xc8" + // 0x00490309: 0x00001EC8 + "\x00i\x03\t\x00\x00\x1e\xc9" + // 0x00690309: 0x00001EC9 + "\x00I\x03#\x00\x00\x1e\xca" + // 0x00490323: 0x00001ECA + "\x00i\x03#\x00\x00\x1e\xcb" + // 0x00690323: 0x00001ECB + "\x00O\x03#\x00\x00\x1e\xcc" + // 0x004F0323: 0x00001ECC + "\x00o\x03#\x00\x00\x1e\xcd" + // 0x006F0323: 0x00001ECD + "\x00O\x03\t\x00\x00\x1e\xce" + // 0x004F0309: 0x00001ECE + "\x00o\x03\t\x00\x00\x1e\xcf" + // 0x006F0309: 0x00001ECF + "\x00\xd4\x03\x01\x00\x00\x1e\xd0" + // 0x00D40301: 0x00001ED0 + "\x00\xf4\x03\x01\x00\x00\x1e\xd1" + // 0x00F40301: 0x00001ED1 + "\x00\xd4\x03\x00\x00\x00\x1e\xd2" + // 0x00D40300: 0x00001ED2 + "\x00\xf4\x03\x00\x00\x00\x1e\xd3" + // 0x00F40300: 0x00001ED3 + "\x00\xd4\x03\t\x00\x00\x1e\xd4" + // 0x00D40309: 0x00001ED4 + "\x00\xf4\x03\t\x00\x00\x1e\xd5" + // 0x00F40309: 0x00001ED5 + "\x00\xd4\x03\x03\x00\x00\x1e\xd6" + // 0x00D40303: 0x00001ED6 + "\x00\xf4\x03\x03\x00\x00\x1e\xd7" + // 0x00F40303: 0x00001ED7 + "\x1e\xcc\x03\x02\x00\x00\x1e\xd8" + // 0x1ECC0302: 0x00001ED8 + "\x1e\xcd\x03\x02\x00\x00\x1e\xd9" + // 0x1ECD0302: 0x00001ED9 + "\x01\xa0\x03\x01\x00\x00\x1e\xda" + // 0x01A00301: 0x00001EDA + "\x01\xa1\x03\x01\x00\x00\x1e\xdb" + // 0x01A10301: 0x00001EDB + "\x01\xa0\x03\x00\x00\x00\x1e\xdc" + // 0x01A00300: 0x00001EDC + "\x01\xa1\x03\x00\x00\x00\x1e\xdd" + // 0x01A10300: 0x00001EDD + "\x01\xa0\x03\t\x00\x00\x1e\xde" + // 0x01A00309: 0x00001EDE + "\x01\xa1\x03\t\x00\x00\x1e\xdf" + // 0x01A10309: 0x00001EDF + "\x01\xa0\x03\x03\x00\x00\x1e\xe0" + // 0x01A00303: 0x00001EE0 + "\x01\xa1\x03\x03\x00\x00\x1e\xe1" + // 0x01A10303: 0x00001EE1 + "\x01\xa0\x03#\x00\x00\x1e\xe2" + // 0x01A00323: 0x00001EE2 + "\x01\xa1\x03#\x00\x00\x1e\xe3" + // 0x01A10323: 0x00001EE3 + "\x00U\x03#\x00\x00\x1e\xe4" + // 0x00550323: 0x00001EE4 + "\x00u\x03#\x00\x00\x1e\xe5" + // 0x00750323: 0x00001EE5 + "\x00U\x03\t\x00\x00\x1e\xe6" + // 0x00550309: 0x00001EE6 + "\x00u\x03\t\x00\x00\x1e\xe7" + // 0x00750309: 0x00001EE7 + "\x01\xaf\x03\x01\x00\x00\x1e\xe8" + // 0x01AF0301: 0x00001EE8 + "\x01\xb0\x03\x01\x00\x00\x1e\xe9" + // 0x01B00301: 0x00001EE9 + "\x01\xaf\x03\x00\x00\x00\x1e\xea" + // 0x01AF0300: 0x00001EEA + "\x01\xb0\x03\x00\x00\x00\x1e\xeb" + // 0x01B00300: 0x00001EEB + "\x01\xaf\x03\t\x00\x00\x1e\xec" + // 0x01AF0309: 0x00001EEC + "\x01\xb0\x03\t\x00\x00\x1e\xed" + // 0x01B00309: 0x00001EED + "\x01\xaf\x03\x03\x00\x00\x1e\xee" + // 0x01AF0303: 0x00001EEE + "\x01\xb0\x03\x03\x00\x00\x1e\xef" + // 0x01B00303: 0x00001EEF + "\x01\xaf\x03#\x00\x00\x1e\xf0" + // 0x01AF0323: 0x00001EF0 + "\x01\xb0\x03#\x00\x00\x1e\xf1" + // 0x01B00323: 0x00001EF1 + "\x00Y\x03\x00\x00\x00\x1e\xf2" + // 0x00590300: 0x00001EF2 + "\x00y\x03\x00\x00\x00\x1e\xf3" + // 0x00790300: 0x00001EF3 + "\x00Y\x03#\x00\x00\x1e\xf4" + // 0x00590323: 0x00001EF4 + "\x00y\x03#\x00\x00\x1e\xf5" + // 0x00790323: 0x00001EF5 + "\x00Y\x03\t\x00\x00\x1e\xf6" + // 0x00590309: 0x00001EF6 + "\x00y\x03\t\x00\x00\x1e\xf7" + // 0x00790309: 0x00001EF7 + "\x00Y\x03\x03\x00\x00\x1e\xf8" + // 0x00590303: 0x00001EF8 + "\x00y\x03\x03\x00\x00\x1e\xf9" + // 0x00790303: 0x00001EF9 + "\x03\xb1\x03\x13\x00\x00\x1f\x00" + // 0x03B10313: 0x00001F00 + "\x03\xb1\x03\x14\x00\x00\x1f\x01" + // 0x03B10314: 0x00001F01 + "\x1f\x00\x03\x00\x00\x00\x1f\x02" + // 0x1F000300: 0x00001F02 + "\x1f\x01\x03\x00\x00\x00\x1f\x03" + // 0x1F010300: 0x00001F03 + "\x1f\x00\x03\x01\x00\x00\x1f\x04" + // 0x1F000301: 0x00001F04 + "\x1f\x01\x03\x01\x00\x00\x1f\x05" + // 0x1F010301: 0x00001F05 + "\x1f\x00\x03B\x00\x00\x1f\x06" + // 0x1F000342: 0x00001F06 + "\x1f\x01\x03B\x00\x00\x1f\a" + // 0x1F010342: 0x00001F07 + "\x03\x91\x03\x13\x00\x00\x1f\b" + // 0x03910313: 0x00001F08 + "\x03\x91\x03\x14\x00\x00\x1f\t" + // 0x03910314: 0x00001F09 + "\x1f\b\x03\x00\x00\x00\x1f\n" + // 0x1F080300: 0x00001F0A + "\x1f\t\x03\x00\x00\x00\x1f\v" + // 0x1F090300: 0x00001F0B + "\x1f\b\x03\x01\x00\x00\x1f\f" + // 0x1F080301: 0x00001F0C + "\x1f\t\x03\x01\x00\x00\x1f\r" + // 0x1F090301: 0x00001F0D + "\x1f\b\x03B\x00\x00\x1f\x0e" + // 0x1F080342: 0x00001F0E + "\x1f\t\x03B\x00\x00\x1f\x0f" + // 0x1F090342: 0x00001F0F + "\x03\xb5\x03\x13\x00\x00\x1f\x10" + // 0x03B50313: 0x00001F10 + "\x03\xb5\x03\x14\x00\x00\x1f\x11" + // 0x03B50314: 0x00001F11 + "\x1f\x10\x03\x00\x00\x00\x1f\x12" + // 0x1F100300: 0x00001F12 + "\x1f\x11\x03\x00\x00\x00\x1f\x13" + // 0x1F110300: 0x00001F13 + "\x1f\x10\x03\x01\x00\x00\x1f\x14" + // 0x1F100301: 0x00001F14 + "\x1f\x11\x03\x01\x00\x00\x1f\x15" + // 0x1F110301: 0x00001F15 + "\x03\x95\x03\x13\x00\x00\x1f\x18" + // 0x03950313: 0x00001F18 + "\x03\x95\x03\x14\x00\x00\x1f\x19" + // 0x03950314: 0x00001F19 + "\x1f\x18\x03\x00\x00\x00\x1f\x1a" + // 0x1F180300: 0x00001F1A + "\x1f\x19\x03\x00\x00\x00\x1f\x1b" + // 0x1F190300: 0x00001F1B + "\x1f\x18\x03\x01\x00\x00\x1f\x1c" + // 0x1F180301: 0x00001F1C + "\x1f\x19\x03\x01\x00\x00\x1f\x1d" + // 0x1F190301: 0x00001F1D + "\x03\xb7\x03\x13\x00\x00\x1f " + // 0x03B70313: 0x00001F20 + "\x03\xb7\x03\x14\x00\x00\x1f!" + // 0x03B70314: 0x00001F21 + "\x1f \x03\x00\x00\x00\x1f\"" + // 0x1F200300: 0x00001F22 + "\x1f!\x03\x00\x00\x00\x1f#" + // 0x1F210300: 0x00001F23 + "\x1f \x03\x01\x00\x00\x1f$" + // 0x1F200301: 0x00001F24 + "\x1f!\x03\x01\x00\x00\x1f%" + // 0x1F210301: 0x00001F25 + "\x1f \x03B\x00\x00\x1f&" + // 0x1F200342: 0x00001F26 + "\x1f!\x03B\x00\x00\x1f'" + // 0x1F210342: 0x00001F27 + "\x03\x97\x03\x13\x00\x00\x1f(" + // 0x03970313: 0x00001F28 + "\x03\x97\x03\x14\x00\x00\x1f)" + // 0x03970314: 0x00001F29 + "\x1f(\x03\x00\x00\x00\x1f*" + // 0x1F280300: 0x00001F2A + "\x1f)\x03\x00\x00\x00\x1f+" + // 0x1F290300: 0x00001F2B + "\x1f(\x03\x01\x00\x00\x1f," + // 0x1F280301: 0x00001F2C + "\x1f)\x03\x01\x00\x00\x1f-" + // 0x1F290301: 0x00001F2D + "\x1f(\x03B\x00\x00\x1f." + // 0x1F280342: 0x00001F2E + "\x1f)\x03B\x00\x00\x1f/" + // 0x1F290342: 0x00001F2F + "\x03\xb9\x03\x13\x00\x00\x1f0" + // 0x03B90313: 0x00001F30 + "\x03\xb9\x03\x14\x00\x00\x1f1" + // 0x03B90314: 0x00001F31 + "\x1f0\x03\x00\x00\x00\x1f2" + // 0x1F300300: 0x00001F32 + "\x1f1\x03\x00\x00\x00\x1f3" + // 0x1F310300: 0x00001F33 + "\x1f0\x03\x01\x00\x00\x1f4" + // 0x1F300301: 0x00001F34 + "\x1f1\x03\x01\x00\x00\x1f5" + // 0x1F310301: 0x00001F35 + "\x1f0\x03B\x00\x00\x1f6" + // 0x1F300342: 0x00001F36 + "\x1f1\x03B\x00\x00\x1f7" + // 0x1F310342: 0x00001F37 + "\x03\x99\x03\x13\x00\x00\x1f8" + // 0x03990313: 0x00001F38 + "\x03\x99\x03\x14\x00\x00\x1f9" + // 0x03990314: 0x00001F39 + "\x1f8\x03\x00\x00\x00\x1f:" + // 0x1F380300: 0x00001F3A + "\x1f9\x03\x00\x00\x00\x1f;" + // 0x1F390300: 0x00001F3B + "\x1f8\x03\x01\x00\x00\x1f<" + // 0x1F380301: 0x00001F3C + "\x1f9\x03\x01\x00\x00\x1f=" + // 0x1F390301: 0x00001F3D + "\x1f8\x03B\x00\x00\x1f>" + // 0x1F380342: 0x00001F3E + "\x1f9\x03B\x00\x00\x1f?" + // 0x1F390342: 0x00001F3F + "\x03\xbf\x03\x13\x00\x00\x1f@" + // 0x03BF0313: 0x00001F40 + "\x03\xbf\x03\x14\x00\x00\x1fA" + // 0x03BF0314: 0x00001F41 + "\x1f@\x03\x00\x00\x00\x1fB" + // 0x1F400300: 0x00001F42 + "\x1fA\x03\x00\x00\x00\x1fC" + // 0x1F410300: 0x00001F43 + "\x1f@\x03\x01\x00\x00\x1fD" + // 0x1F400301: 0x00001F44 + "\x1fA\x03\x01\x00\x00\x1fE" + // 0x1F410301: 0x00001F45 + "\x03\x9f\x03\x13\x00\x00\x1fH" + // 0x039F0313: 0x00001F48 + "\x03\x9f\x03\x14\x00\x00\x1fI" + // 0x039F0314: 0x00001F49 + "\x1fH\x03\x00\x00\x00\x1fJ" + // 0x1F480300: 0x00001F4A + "\x1fI\x03\x00\x00\x00\x1fK" + // 0x1F490300: 0x00001F4B + "\x1fH\x03\x01\x00\x00\x1fL" + // 0x1F480301: 0x00001F4C + "\x1fI\x03\x01\x00\x00\x1fM" + // 0x1F490301: 0x00001F4D + "\x03\xc5\x03\x13\x00\x00\x1fP" + // 0x03C50313: 0x00001F50 + "\x03\xc5\x03\x14\x00\x00\x1fQ" + // 0x03C50314: 0x00001F51 + "\x1fP\x03\x00\x00\x00\x1fR" + // 0x1F500300: 0x00001F52 + "\x1fQ\x03\x00\x00\x00\x1fS" + // 0x1F510300: 0x00001F53 + "\x1fP\x03\x01\x00\x00\x1fT" + // 0x1F500301: 0x00001F54 + "\x1fQ\x03\x01\x00\x00\x1fU" + // 0x1F510301: 0x00001F55 + "\x1fP\x03B\x00\x00\x1fV" + // 0x1F500342: 0x00001F56 + "\x1fQ\x03B\x00\x00\x1fW" + // 0x1F510342: 0x00001F57 + "\x03\xa5\x03\x14\x00\x00\x1fY" + // 0x03A50314: 0x00001F59 + "\x1fY\x03\x00\x00\x00\x1f[" + // 0x1F590300: 0x00001F5B + "\x1fY\x03\x01\x00\x00\x1f]" + // 0x1F590301: 0x00001F5D + "\x1fY\x03B\x00\x00\x1f_" + // 0x1F590342: 0x00001F5F + "\x03\xc9\x03\x13\x00\x00\x1f`" + // 0x03C90313: 0x00001F60 + "\x03\xc9\x03\x14\x00\x00\x1fa" + // 0x03C90314: 0x00001F61 + "\x1f`\x03\x00\x00\x00\x1fb" + // 0x1F600300: 0x00001F62 + "\x1fa\x03\x00\x00\x00\x1fc" + // 0x1F610300: 0x00001F63 + "\x1f`\x03\x01\x00\x00\x1fd" + // 0x1F600301: 0x00001F64 + "\x1fa\x03\x01\x00\x00\x1fe" + // 0x1F610301: 0x00001F65 + "\x1f`\x03B\x00\x00\x1ff" + // 0x1F600342: 0x00001F66 + "\x1fa\x03B\x00\x00\x1fg" + // 0x1F610342: 0x00001F67 + "\x03\xa9\x03\x13\x00\x00\x1fh" + // 0x03A90313: 0x00001F68 + "\x03\xa9\x03\x14\x00\x00\x1fi" + // 0x03A90314: 0x00001F69 + "\x1fh\x03\x00\x00\x00\x1fj" + // 0x1F680300: 0x00001F6A + "\x1fi\x03\x00\x00\x00\x1fk" + // 0x1F690300: 0x00001F6B + "\x1fh\x03\x01\x00\x00\x1fl" + // 0x1F680301: 0x00001F6C + "\x1fi\x03\x01\x00\x00\x1fm" + // 0x1F690301: 0x00001F6D + "\x1fh\x03B\x00\x00\x1fn" + // 0x1F680342: 0x00001F6E + "\x1fi\x03B\x00\x00\x1fo" + // 0x1F690342: 0x00001F6F + "\x03\xb1\x03\x00\x00\x00\x1fp" + // 0x03B10300: 0x00001F70 + "\x03\xb5\x03\x00\x00\x00\x1fr" + // 0x03B50300: 0x00001F72 + "\x03\xb7\x03\x00\x00\x00\x1ft" + // 0x03B70300: 0x00001F74 + "\x03\xb9\x03\x00\x00\x00\x1fv" + // 0x03B90300: 0x00001F76 + "\x03\xbf\x03\x00\x00\x00\x1fx" + // 0x03BF0300: 0x00001F78 + "\x03\xc5\x03\x00\x00\x00\x1fz" + // 0x03C50300: 0x00001F7A + "\x03\xc9\x03\x00\x00\x00\x1f|" + // 0x03C90300: 0x00001F7C + "\x1f\x00\x03E\x00\x00\x1f\x80" + // 0x1F000345: 0x00001F80 + "\x1f\x01\x03E\x00\x00\x1f\x81" + // 0x1F010345: 0x00001F81 + "\x1f\x02\x03E\x00\x00\x1f\x82" + // 0x1F020345: 0x00001F82 + "\x1f\x03\x03E\x00\x00\x1f\x83" + // 0x1F030345: 0x00001F83 + "\x1f\x04\x03E\x00\x00\x1f\x84" + // 0x1F040345: 0x00001F84 + "\x1f\x05\x03E\x00\x00\x1f\x85" + // 0x1F050345: 0x00001F85 + "\x1f\x06\x03E\x00\x00\x1f\x86" + // 0x1F060345: 0x00001F86 + "\x1f\a\x03E\x00\x00\x1f\x87" + // 0x1F070345: 0x00001F87 + "\x1f\b\x03E\x00\x00\x1f\x88" + // 0x1F080345: 0x00001F88 + "\x1f\t\x03E\x00\x00\x1f\x89" + // 0x1F090345: 0x00001F89 + "\x1f\n\x03E\x00\x00\x1f\x8a" + // 0x1F0A0345: 0x00001F8A + "\x1f\v\x03E\x00\x00\x1f\x8b" + // 0x1F0B0345: 0x00001F8B + "\x1f\f\x03E\x00\x00\x1f\x8c" + // 0x1F0C0345: 0x00001F8C + "\x1f\r\x03E\x00\x00\x1f\x8d" + // 0x1F0D0345: 0x00001F8D + "\x1f\x0e\x03E\x00\x00\x1f\x8e" + // 0x1F0E0345: 0x00001F8E + "\x1f\x0f\x03E\x00\x00\x1f\x8f" + // 0x1F0F0345: 0x00001F8F + "\x1f \x03E\x00\x00\x1f\x90" + // 0x1F200345: 0x00001F90 + "\x1f!\x03E\x00\x00\x1f\x91" + // 0x1F210345: 0x00001F91 + "\x1f\"\x03E\x00\x00\x1f\x92" + // 0x1F220345: 0x00001F92 + "\x1f#\x03E\x00\x00\x1f\x93" + // 0x1F230345: 0x00001F93 + "\x1f$\x03E\x00\x00\x1f\x94" + // 0x1F240345: 0x00001F94 + "\x1f%\x03E\x00\x00\x1f\x95" + // 0x1F250345: 0x00001F95 + "\x1f&\x03E\x00\x00\x1f\x96" + // 0x1F260345: 0x00001F96 + "\x1f'\x03E\x00\x00\x1f\x97" + // 0x1F270345: 0x00001F97 + "\x1f(\x03E\x00\x00\x1f\x98" + // 0x1F280345: 0x00001F98 + "\x1f)\x03E\x00\x00\x1f\x99" + // 0x1F290345: 0x00001F99 + "\x1f*\x03E\x00\x00\x1f\x9a" + // 0x1F2A0345: 0x00001F9A + "\x1f+\x03E\x00\x00\x1f\x9b" + // 0x1F2B0345: 0x00001F9B + "\x1f,\x03E\x00\x00\x1f\x9c" + // 0x1F2C0345: 0x00001F9C + "\x1f-\x03E\x00\x00\x1f\x9d" + // 0x1F2D0345: 0x00001F9D + "\x1f.\x03E\x00\x00\x1f\x9e" + // 0x1F2E0345: 0x00001F9E + "\x1f/\x03E\x00\x00\x1f\x9f" + // 0x1F2F0345: 0x00001F9F + "\x1f`\x03E\x00\x00\x1f\xa0" + // 0x1F600345: 0x00001FA0 + "\x1fa\x03E\x00\x00\x1f\xa1" + // 0x1F610345: 0x00001FA1 + "\x1fb\x03E\x00\x00\x1f\xa2" + // 0x1F620345: 0x00001FA2 + "\x1fc\x03E\x00\x00\x1f\xa3" + // 0x1F630345: 0x00001FA3 + "\x1fd\x03E\x00\x00\x1f\xa4" + // 0x1F640345: 0x00001FA4 + "\x1fe\x03E\x00\x00\x1f\xa5" + // 0x1F650345: 0x00001FA5 + "\x1ff\x03E\x00\x00\x1f\xa6" + // 0x1F660345: 0x00001FA6 + "\x1fg\x03E\x00\x00\x1f\xa7" + // 0x1F670345: 0x00001FA7 + "\x1fh\x03E\x00\x00\x1f\xa8" + // 0x1F680345: 0x00001FA8 + "\x1fi\x03E\x00\x00\x1f\xa9" + // 0x1F690345: 0x00001FA9 + "\x1fj\x03E\x00\x00\x1f\xaa" + // 0x1F6A0345: 0x00001FAA + "\x1fk\x03E\x00\x00\x1f\xab" + // 0x1F6B0345: 0x00001FAB + "\x1fl\x03E\x00\x00\x1f\xac" + // 0x1F6C0345: 0x00001FAC + "\x1fm\x03E\x00\x00\x1f\xad" + // 0x1F6D0345: 0x00001FAD + "\x1fn\x03E\x00\x00\x1f\xae" + // 0x1F6E0345: 0x00001FAE + "\x1fo\x03E\x00\x00\x1f\xaf" + // 0x1F6F0345: 0x00001FAF + "\x03\xb1\x03\x06\x00\x00\x1f\xb0" + // 0x03B10306: 0x00001FB0 + "\x03\xb1\x03\x04\x00\x00\x1f\xb1" + // 0x03B10304: 0x00001FB1 + "\x1fp\x03E\x00\x00\x1f\xb2" + // 0x1F700345: 0x00001FB2 + "\x03\xb1\x03E\x00\x00\x1f\xb3" + // 0x03B10345: 0x00001FB3 + "\x03\xac\x03E\x00\x00\x1f\xb4" + // 0x03AC0345: 0x00001FB4 + "\x03\xb1\x03B\x00\x00\x1f\xb6" + // 0x03B10342: 0x00001FB6 + "\x1f\xb6\x03E\x00\x00\x1f\xb7" + // 0x1FB60345: 0x00001FB7 + "\x03\x91\x03\x06\x00\x00\x1f\xb8" + // 0x03910306: 0x00001FB8 + "\x03\x91\x03\x04\x00\x00\x1f\xb9" + // 0x03910304: 0x00001FB9 + "\x03\x91\x03\x00\x00\x00\x1f\xba" + // 0x03910300: 0x00001FBA + "\x03\x91\x03E\x00\x00\x1f\xbc" + // 0x03910345: 0x00001FBC + "\x00\xa8\x03B\x00\x00\x1f\xc1" + // 0x00A80342: 0x00001FC1 + "\x1ft\x03E\x00\x00\x1f\xc2" + // 0x1F740345: 0x00001FC2 + "\x03\xb7\x03E\x00\x00\x1f\xc3" + // 0x03B70345: 0x00001FC3 + "\x03\xae\x03E\x00\x00\x1f\xc4" + // 0x03AE0345: 0x00001FC4 + "\x03\xb7\x03B\x00\x00\x1f\xc6" + // 0x03B70342: 0x00001FC6 + "\x1f\xc6\x03E\x00\x00\x1f\xc7" + // 0x1FC60345: 0x00001FC7 + "\x03\x95\x03\x00\x00\x00\x1f\xc8" + // 0x03950300: 0x00001FC8 + "\x03\x97\x03\x00\x00\x00\x1f\xca" + // 0x03970300: 0x00001FCA + "\x03\x97\x03E\x00\x00\x1f\xcc" + // 0x03970345: 0x00001FCC + "\x1f\xbf\x03\x00\x00\x00\x1f\xcd" + // 0x1FBF0300: 0x00001FCD + "\x1f\xbf\x03\x01\x00\x00\x1f\xce" + // 0x1FBF0301: 0x00001FCE + "\x1f\xbf\x03B\x00\x00\x1f\xcf" + // 0x1FBF0342: 0x00001FCF + "\x03\xb9\x03\x06\x00\x00\x1f\xd0" + // 0x03B90306: 0x00001FD0 + "\x03\xb9\x03\x04\x00\x00\x1f\xd1" + // 0x03B90304: 0x00001FD1 + "\x03\xca\x03\x00\x00\x00\x1f\xd2" + // 0x03CA0300: 0x00001FD2 + "\x03\xb9\x03B\x00\x00\x1f\xd6" + // 0x03B90342: 0x00001FD6 + "\x03\xca\x03B\x00\x00\x1f\xd7" + // 0x03CA0342: 0x00001FD7 + "\x03\x99\x03\x06\x00\x00\x1f\xd8" + // 0x03990306: 0x00001FD8 + "\x03\x99\x03\x04\x00\x00\x1f\xd9" + // 0x03990304: 0x00001FD9 + "\x03\x99\x03\x00\x00\x00\x1f\xda" + // 0x03990300: 0x00001FDA + "\x1f\xfe\x03\x00\x00\x00\x1f\xdd" + // 0x1FFE0300: 0x00001FDD + "\x1f\xfe\x03\x01\x00\x00\x1f\xde" + // 0x1FFE0301: 0x00001FDE + "\x1f\xfe\x03B\x00\x00\x1f\xdf" + // 0x1FFE0342: 0x00001FDF + "\x03\xc5\x03\x06\x00\x00\x1f\xe0" + // 0x03C50306: 0x00001FE0 + "\x03\xc5\x03\x04\x00\x00\x1f\xe1" + // 0x03C50304: 0x00001FE1 + "\x03\xcb\x03\x00\x00\x00\x1f\xe2" + // 0x03CB0300: 0x00001FE2 + "\x03\xc1\x03\x13\x00\x00\x1f\xe4" + // 0x03C10313: 0x00001FE4 + "\x03\xc1\x03\x14\x00\x00\x1f\xe5" + // 0x03C10314: 0x00001FE5 + "\x03\xc5\x03B\x00\x00\x1f\xe6" + // 0x03C50342: 0x00001FE6 + "\x03\xcb\x03B\x00\x00\x1f\xe7" + // 0x03CB0342: 0x00001FE7 + "\x03\xa5\x03\x06\x00\x00\x1f\xe8" + // 0x03A50306: 0x00001FE8 + "\x03\xa5\x03\x04\x00\x00\x1f\xe9" + // 0x03A50304: 0x00001FE9 + "\x03\xa5\x03\x00\x00\x00\x1f\xea" + // 0x03A50300: 0x00001FEA + "\x03\xa1\x03\x14\x00\x00\x1f\xec" + // 0x03A10314: 0x00001FEC + "\x00\xa8\x03\x00\x00\x00\x1f\xed" + // 0x00A80300: 0x00001FED + "\x1f|\x03E\x00\x00\x1f\xf2" + // 0x1F7C0345: 0x00001FF2 + "\x03\xc9\x03E\x00\x00\x1f\xf3" + // 0x03C90345: 0x00001FF3 + "\x03\xce\x03E\x00\x00\x1f\xf4" + // 0x03CE0345: 0x00001FF4 + "\x03\xc9\x03B\x00\x00\x1f\xf6" + // 0x03C90342: 0x00001FF6 + "\x1f\xf6\x03E\x00\x00\x1f\xf7" + // 0x1FF60345: 0x00001FF7 + "\x03\x9f\x03\x00\x00\x00\x1f\xf8" + // 0x039F0300: 0x00001FF8 + "\x03\xa9\x03\x00\x00\x00\x1f\xfa" + // 0x03A90300: 0x00001FFA + "\x03\xa9\x03E\x00\x00\x1f\xfc" + // 0x03A90345: 0x00001FFC + "!\x90\x038\x00\x00!\x9a" + // 0x21900338: 0x0000219A + "!\x92\x038\x00\x00!\x9b" + // 0x21920338: 0x0000219B + "!\x94\x038\x00\x00!\xae" + // 0x21940338: 0x000021AE + "!\xd0\x038\x00\x00!\xcd" + // 0x21D00338: 0x000021CD + "!\xd4\x038\x00\x00!\xce" + // 0x21D40338: 0x000021CE + "!\xd2\x038\x00\x00!\xcf" + // 0x21D20338: 0x000021CF + "\"\x03\x038\x00\x00\"\x04" + // 0x22030338: 0x00002204 + "\"\b\x038\x00\x00\"\t" + // 0x22080338: 0x00002209 + "\"\v\x038\x00\x00\"\f" + // 0x220B0338: 0x0000220C + "\"#\x038\x00\x00\"$" + // 0x22230338: 0x00002224 + "\"%\x038\x00\x00\"&" + // 0x22250338: 0x00002226 + "\"<\x038\x00\x00\"A" + // 0x223C0338: 0x00002241 + "\"C\x038\x00\x00\"D" + // 0x22430338: 0x00002244 + "\"E\x038\x00\x00\"G" + // 0x22450338: 0x00002247 + "\"H\x038\x00\x00\"I" + // 0x22480338: 0x00002249 + "\x00=\x038\x00\x00\"`" + // 0x003D0338: 0x00002260 + "\"a\x038\x00\x00\"b" + // 0x22610338: 0x00002262 + "\"M\x038\x00\x00\"m" + // 0x224D0338: 0x0000226D + "\x00<\x038\x00\x00\"n" + // 0x003C0338: 0x0000226E + "\x00>\x038\x00\x00\"o" + // 0x003E0338: 0x0000226F + "\"d\x038\x00\x00\"p" + // 0x22640338: 0x00002270 + "\"e\x038\x00\x00\"q" + // 0x22650338: 0x00002271 + "\"r\x038\x00\x00\"t" + // 0x22720338: 0x00002274 + "\"s\x038\x00\x00\"u" + // 0x22730338: 0x00002275 + "\"v\x038\x00\x00\"x" + // 0x22760338: 0x00002278 + "\"w\x038\x00\x00\"y" + // 0x22770338: 0x00002279 + "\"z\x038\x00\x00\"\x80" + // 0x227A0338: 0x00002280 + "\"{\x038\x00\x00\"\x81" + // 0x227B0338: 0x00002281 + "\"\x82\x038\x00\x00\"\x84" + // 0x22820338: 0x00002284 + "\"\x83\x038\x00\x00\"\x85" + // 0x22830338: 0x00002285 + "\"\x86\x038\x00\x00\"\x88" + // 0x22860338: 0x00002288 + "\"\x87\x038\x00\x00\"\x89" + // 0x22870338: 0x00002289 + "\"\xa2\x038\x00\x00\"\xac" + // 0x22A20338: 0x000022AC + "\"\xa8\x038\x00\x00\"\xad" + // 0x22A80338: 0x000022AD + "\"\xa9\x038\x00\x00\"\xae" + // 0x22A90338: 0x000022AE + "\"\xab\x038\x00\x00\"\xaf" + // 0x22AB0338: 0x000022AF + "\"|\x038\x00\x00\"\xe0" + // 0x227C0338: 0x000022E0 + "\"}\x038\x00\x00\"\xe1" + // 0x227D0338: 0x000022E1 + "\"\x91\x038\x00\x00\"\xe2" + // 0x22910338: 0x000022E2 + "\"\x92\x038\x00\x00\"\xe3" + // 0x22920338: 0x000022E3 + "\"\xb2\x038\x00\x00\"\xea" + // 0x22B20338: 0x000022EA + "\"\xb3\x038\x00\x00\"\xeb" + // 0x22B30338: 0x000022EB + "\"\xb4\x038\x00\x00\"\xec" + // 0x22B40338: 0x000022EC + "\"\xb5\x038\x00\x00\"\xed" + // 0x22B50338: 0x000022ED + "0K0\x99\x00\x000L" + // 0x304B3099: 0x0000304C + "0M0\x99\x00\x000N" + // 0x304D3099: 0x0000304E + "0O0\x99\x00\x000P" + // 0x304F3099: 0x00003050 + "0Q0\x99\x00\x000R" + // 0x30513099: 0x00003052 + "0S0\x99\x00\x000T" + // 0x30533099: 0x00003054 + "0U0\x99\x00\x000V" + // 0x30553099: 0x00003056 + "0W0\x99\x00\x000X" + // 0x30573099: 0x00003058 + "0Y0\x99\x00\x000Z" + // 0x30593099: 0x0000305A + "0[0\x99\x00\x000\\" + // 0x305B3099: 0x0000305C + "0]0\x99\x00\x000^" + // 0x305D3099: 0x0000305E + "0_0\x99\x00\x000`" + // 0x305F3099: 0x00003060 + "0a0\x99\x00\x000b" + // 0x30613099: 0x00003062 + "0d0\x99\x00\x000e" + // 0x30643099: 0x00003065 + "0f0\x99\x00\x000g" + // 0x30663099: 0x00003067 + "0h0\x99\x00\x000i" + // 0x30683099: 0x00003069 + "0o0\x99\x00\x000p" + // 0x306F3099: 0x00003070 + "0o0\x9a\x00\x000q" + // 0x306F309A: 0x00003071 + "0r0\x99\x00\x000s" + // 0x30723099: 0x00003073 + "0r0\x9a\x00\x000t" + // 0x3072309A: 0x00003074 + "0u0\x99\x00\x000v" + // 0x30753099: 0x00003076 + "0u0\x9a\x00\x000w" + // 0x3075309A: 0x00003077 + "0x0\x99\x00\x000y" + // 0x30783099: 0x00003079 + "0x0\x9a\x00\x000z" + // 0x3078309A: 0x0000307A + "0{0\x99\x00\x000|" + // 0x307B3099: 0x0000307C + "0{0\x9a\x00\x000}" + // 0x307B309A: 0x0000307D + "0F0\x99\x00\x000\x94" + // 0x30463099: 0x00003094 + "0\x9d0\x99\x00\x000\x9e" + // 0x309D3099: 0x0000309E + "0\xab0\x99\x00\x000\xac" + // 0x30AB3099: 0x000030AC + "0\xad0\x99\x00\x000\xae" + // 0x30AD3099: 0x000030AE + "0\xaf0\x99\x00\x000\xb0" + // 0x30AF3099: 0x000030B0 + "0\xb10\x99\x00\x000\xb2" + // 0x30B13099: 0x000030B2 + "0\xb30\x99\x00\x000\xb4" + // 0x30B33099: 0x000030B4 + "0\xb50\x99\x00\x000\xb6" + // 0x30B53099: 0x000030B6 + "0\xb70\x99\x00\x000\xb8" + // 0x30B73099: 0x000030B8 + "0\xb90\x99\x00\x000\xba" + // 0x30B93099: 0x000030BA + "0\xbb0\x99\x00\x000\xbc" + // 0x30BB3099: 0x000030BC + "0\xbd0\x99\x00\x000\xbe" + // 0x30BD3099: 0x000030BE + "0\xbf0\x99\x00\x000\xc0" + // 0x30BF3099: 0x000030C0 + "0\xc10\x99\x00\x000\xc2" + // 0x30C13099: 0x000030C2 + "0\xc40\x99\x00\x000\xc5" + // 0x30C43099: 0x000030C5 + "0\xc60\x99\x00\x000\xc7" + // 0x30C63099: 0x000030C7 + "0\xc80\x99\x00\x000\xc9" + // 0x30C83099: 0x000030C9 + "0\xcf0\x99\x00\x000\xd0" + // 0x30CF3099: 0x000030D0 + "0\xcf0\x9a\x00\x000\xd1" + // 0x30CF309A: 0x000030D1 + "0\xd20\x99\x00\x000\xd3" + // 0x30D23099: 0x000030D3 + "0\xd20\x9a\x00\x000\xd4" + // 0x30D2309A: 0x000030D4 + "0\xd50\x99\x00\x000\xd6" + // 0x30D53099: 0x000030D6 + "0\xd50\x9a\x00\x000\xd7" + // 0x30D5309A: 0x000030D7 + "0\xd80\x99\x00\x000\xd9" + // 0x30D83099: 0x000030D9 + "0\xd80\x9a\x00\x000\xda" + // 0x30D8309A: 0x000030DA + "0\xdb0\x99\x00\x000\xdc" + // 0x30DB3099: 0x000030DC + "0\xdb0\x9a\x00\x000\xdd" + // 0x30DB309A: 0x000030DD + "0\xa60\x99\x00\x000\xf4" + // 0x30A63099: 0x000030F4 + "0\xef0\x99\x00\x000\xf7" + // 0x30EF3099: 0x000030F7 + "0\xf00\x99\x00\x000\xf8" + // 0x30F03099: 0x000030F8 + "0\xf10\x99\x00\x000\xf9" + // 0x30F13099: 0x000030F9 + "0\xf20\x99\x00\x000\xfa" + // 0x30F23099: 0x000030FA + "0\xfd0\x99\x00\x000\xfe" + // 0x30FD3099: 0x000030FE + "\x10\x99\x10\xba\x00\x01\x10\x9a" + // 0x109910BA: 0x0001109A + "\x10\x9b\x10\xba\x00\x01\x10\x9c" + // 0x109B10BA: 0x0001109C + "\x10\xa5\x10\xba\x00\x01\x10\xab" + // 0x10A510BA: 0x000110AB + "\x111\x11'\x00\x01\x11." + // 0x11311127: 0x0001112E + "\x112\x11'\x00\x01\x11/" + // 0x11321127: 0x0001112F + "\x13G\x13>\x00\x01\x13K" + // 0x1347133E: 0x0001134B + "\x13G\x13W\x00\x01\x13L" + // 0x13471357: 0x0001134C + "\x14\xb9\x14\xba\x00\x01\x14\xbb" + // 0x14B914BA: 0x000114BB + "\x14\xb9\x14\xb0\x00\x01\x14\xbc" + // 0x14B914B0: 0x000114BC + "\x14\xb9\x14\xbd\x00\x01\x14\xbe" + // 0x14B914BD: 0x000114BE + "\x15\xb8\x15\xaf\x00\x01\x15\xba" + // 0x15B815AF: 0x000115BA + "\x15\xb9\x15\xaf\x00\x01\x15\xbb" + // 0x15B915AF: 0x000115BB + "" + // Total size of tables: 55KB (55977 bytes) diff --git a/vendor/golang.org/x/text/unicode/norm/triegen.go b/vendor/golang.org/x/text/unicode/norm/triegen.go deleted file mode 100644 index 45d71190..00000000 --- a/vendor/golang.org/x/text/unicode/norm/triegen.go +++ /dev/null @@ -1,117 +0,0 @@ -// 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. - -// +build ignore - -// Trie table generator. -// Used by make*tables tools to generate a go file with trie data structures -// for mapping UTF-8 to a 16-bit value. All but the last byte in a UTF-8 byte -// sequence are used to lookup offsets in the index table to be used for the -// next byte. The last byte is used to index into a table with 16-bit values. - -package main - -import ( - "fmt" - "io" -) - -const maxSparseEntries = 16 - -type normCompacter struct { - sparseBlocks [][]uint64 - sparseOffset []uint16 - sparseCount int - name string -} - -func mostFrequentStride(a []uint64) int { - counts := make(map[int]int) - var v int - for _, x := range a { - if stride := int(x) - v; v != 0 && stride >= 0 { - counts[stride]++ - } - v = int(x) - } - var maxs, maxc int - for stride, cnt := range counts { - if cnt > maxc || (cnt == maxc && stride < maxs) { - maxs, maxc = stride, cnt - } - } - return maxs -} - -func countSparseEntries(a []uint64) int { - stride := mostFrequentStride(a) - var v, count int - for _, tv := range a { - if int(tv)-v != stride { - if tv != 0 { - count++ - } - } - v = int(tv) - } - return count -} - -func (c *normCompacter) Size(v []uint64) (sz int, ok bool) { - if n := countSparseEntries(v); n <= maxSparseEntries { - return (n+1)*4 + 2, true - } - return 0, false -} - -func (c *normCompacter) Store(v []uint64) uint32 { - h := uint32(len(c.sparseOffset)) - c.sparseBlocks = append(c.sparseBlocks, v) - c.sparseOffset = append(c.sparseOffset, uint16(c.sparseCount)) - c.sparseCount += countSparseEntries(v) + 1 - return h -} - -func (c *normCompacter) Handler() string { - return c.name + "Sparse.lookup" -} - -func (c *normCompacter) Print(w io.Writer) (retErr error) { - p := func(f string, x ...interface{}) { - if _, err := fmt.Fprintf(w, f, x...); retErr == nil && err != nil { - retErr = err - } - } - - ls := len(c.sparseBlocks) - p("// %sSparseOffset: %d entries, %d bytes\n", c.name, ls, ls*2) - p("var %sSparseOffset = %#v\n\n", c.name, c.sparseOffset) - - ns := c.sparseCount - p("// %sSparseValues: %d entries, %d bytes\n", c.name, ns, ns*4) - p("var %sSparseValues = [%d]valueRange {", c.name, ns) - for i, b := range c.sparseBlocks { - p("\n// Block %#x, offset %#x", i, c.sparseOffset[i]) - var v int - stride := mostFrequentStride(b) - n := countSparseEntries(b) - p("\n{value:%#04x,lo:%#02x},", stride, uint8(n)) - for i, nv := range b { - if int(nv)-v != stride { - if v != 0 { - p(",hi:%#02x},", 0x80+i-1) - } - if nv != 0 { - p("\n{value:%#04x,lo:%#02x", nv, 0x80+i) - } - } - v = int(nv) - } - if v != 0 { - p(",hi:%#02x},", 0x80+len(b)-1) - } - } - p("\n}\n\n") - return -} diff --git a/vendor/golang.org/x/tools/AUTHORS b/vendor/golang.org/x/tools/AUTHORS new file mode 100644 index 00000000..15167cd7 --- /dev/null +++ b/vendor/golang.org/x/tools/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/tools/CONTRIBUTORS b/vendor/golang.org/x/tools/CONTRIBUTORS new file mode 100644 index 00000000..1c4577e9 --- /dev/null +++ b/vendor/golang.org/x/tools/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/tools/LICENSE b/vendor/golang.org/x/tools/LICENSE new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/vendor/golang.org/x/tools/LICENSE @@ -0,0 +1,27 @@ +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. diff --git a/vendor/golang.org/x/tools/PATENTS b/vendor/golang.org/x/tools/PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/vendor/golang.org/x/tools/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/tools/go/analysis/analysis.go b/vendor/golang.org/x/tools/go/analysis/analysis.go new file mode 100644 index 00000000..8c997735 --- /dev/null +++ b/vendor/golang.org/x/tools/go/analysis/analysis.go @@ -0,0 +1,237 @@ +package analysis + +import ( + "flag" + "fmt" + "go/ast" + "go/token" + "go/types" + "reflect" + + "golang.org/x/tools/internal/analysisinternal" +) + +// An Analyzer describes an analysis function and its options. +type Analyzer struct { + // The Name of the analyzer must be a valid Go identifier + // as it may appear in command-line flags, URLs, and so on. + Name string + + // Doc is the documentation for the analyzer. + // The part before the first "\n\n" is the title + // (no capital or period, max ~60 letters). + Doc string + + // Flags defines any flags accepted by the analyzer. + // The manner in which these flags are exposed to the user + // depends on the driver which runs the analyzer. + Flags flag.FlagSet + + // Run applies the analyzer to a package. + // It returns an error if the analyzer failed. + // + // On success, the Run function may return a result + // computed by the Analyzer; its type must match ResultType. + // The driver makes this result available as an input to + // another Analyzer that depends directly on this one (see + // Requires) when it analyzes the same package. + // + // To pass analysis results between packages (and thus + // potentially between address spaces), use Facts, which are + // serializable. + Run func(*Pass) (interface{}, error) + + // RunDespiteErrors allows the driver to invoke + // the Run method of this analyzer even on a + // package that contains parse or type errors. + RunDespiteErrors bool + + // Requires is a set of analyzers that must run successfully + // before this one on a given package. This analyzer may inspect + // the outputs produced by each analyzer in Requires. + // The graph over analyzers implied by Requires edges must be acyclic. + // + // Requires establishes a "horizontal" dependency between + // analysis passes (different analyzers, same package). + Requires []*Analyzer + + // ResultType is the type of the optional result of the Run function. + ResultType reflect.Type + + // FactTypes indicates that this analyzer imports and exports + // Facts of the specified concrete types. + // An analyzer that uses facts may assume that its import + // dependencies have been similarly analyzed before it runs. + // Facts must be pointers. + // + // FactTypes establishes a "vertical" dependency between + // analysis passes (same analyzer, different packages). + FactTypes []Fact +} + +func (a *Analyzer) String() string { return a.Name } + +func init() { + // Set the analysisinternal functions to be able to pass type errors + // to the Pass type without modifying the go/analysis API. + analysisinternal.SetTypeErrors = func(p interface{}, errors []types.Error) { + p.(*Pass).typeErrors = errors + } + analysisinternal.GetTypeErrors = func(p interface{}) []types.Error { + return p.(*Pass).typeErrors + } +} + +// A Pass provides information to the Run function that +// applies a specific analyzer to a single Go package. +// +// It forms the interface between the analysis logic and the driver +// program, and has both input and an output components. +// +// As in a compiler, one pass may depend on the result computed by another. +// +// The Run function should not call any of the Pass functions concurrently. +type Pass struct { + Analyzer *Analyzer // the identity of the current analyzer + + // syntax and type information + Fset *token.FileSet // file position information + Files []*ast.File // the abstract syntax tree of each file + OtherFiles []string // names of non-Go files of this package + Pkg *types.Package // type information about the package + TypesInfo *types.Info // type information about the syntax trees + TypesSizes types.Sizes // function for computing sizes of types + + // Report reports a Diagnostic, a finding about a specific location + // in the analyzed source code such as a potential mistake. + // It may be called by the Run function. + Report func(Diagnostic) + + // ResultOf provides the inputs to this analysis pass, which are + // the corresponding results of its prerequisite analyzers. + // The map keys are the elements of Analysis.Required, + // and the type of each corresponding value is the required + // analysis's ResultType. + ResultOf map[*Analyzer]interface{} + + // -- facts -- + + // ImportObjectFact retrieves a fact associated with obj. + // Given a value ptr of type *T, where *T satisfies Fact, + // ImportObjectFact copies the value to *ptr. + // + // ImportObjectFact panics if called after the pass is complete. + // ImportObjectFact is not concurrency-safe. + ImportObjectFact func(obj types.Object, fact Fact) bool + + // ImportPackageFact retrieves a fact associated with package pkg, + // which must be this package or one of its dependencies. + // See comments for ImportObjectFact. + ImportPackageFact func(pkg *types.Package, fact Fact) bool + + // ExportObjectFact associates a fact of type *T with the obj, + // replacing any previous fact of that type. + // + // ExportObjectFact panics if it is called after the pass is + // complete, or if obj does not belong to the package being analyzed. + // ExportObjectFact is not concurrency-safe. + ExportObjectFact func(obj types.Object, fact Fact) + + // ExportPackageFact associates a fact with the current package. + // See comments for ExportObjectFact. + ExportPackageFact func(fact Fact) + + // AllPackageFacts returns a new slice containing all package facts of the analysis's FactTypes + // in unspecified order. + // WARNING: This is an experimental API and may change in the future. + AllPackageFacts func() []PackageFact + + // AllObjectFacts returns a new slice containing all object facts of the analysis's FactTypes + // in unspecified order. + // WARNING: This is an experimental API and may change in the future. + AllObjectFacts func() []ObjectFact + + // typeErrors contains types.Errors that are associated with the pkg. + typeErrors []types.Error + + /* Further fields may be added in future. */ + // For example, suggested or applied refactorings. +} + +// PackageFact is a package together with an associated fact. +// WARNING: This is an experimental API and may change in the future. +type PackageFact struct { + Package *types.Package + Fact Fact +} + +// ObjectFact is an object together with an associated fact. +// WARNING: This is an experimental API and may change in the future. +type ObjectFact struct { + Object types.Object + Fact Fact +} + +// Reportf is a helper function that reports a Diagnostic using the +// specified position and formatted error message. +func (pass *Pass) Reportf(pos token.Pos, format string, args ...interface{}) { + msg := fmt.Sprintf(format, args...) + pass.Report(Diagnostic{Pos: pos, Message: msg}) +} + +// The Range interface provides a range. It's equivalent to and satisfied by +// ast.Node. +type Range interface { + Pos() token.Pos // position of first character belonging to the node + End() token.Pos // position of first character immediately after the node +} + +// ReportRangef is a helper function that reports a Diagnostic using the +// range provided. ast.Node values can be passed in as the range because +// they satisfy the Range interface. +func (pass *Pass) ReportRangef(rng Range, format string, args ...interface{}) { + msg := fmt.Sprintf(format, args...) + pass.Report(Diagnostic{Pos: rng.Pos(), End: rng.End(), Message: msg}) +} + +func (pass *Pass) String() string { + return fmt.Sprintf("%s@%s", pass.Analyzer.Name, pass.Pkg.Path()) +} + +// A Fact is an intermediate fact produced during analysis. +// +// Each fact is associated with a named declaration (a types.Object) or +// with a package as a whole. A single object or package may have +// multiple associated facts, but only one of any particular fact type. +// +// A Fact represents a predicate such as "never returns", but does not +// represent the subject of the predicate such as "function F" or "package P". +// +// Facts may be produced in one analysis pass and consumed by another +// analysis pass even if these are in different address spaces. +// If package P imports Q, all facts about Q produced during +// analysis of that package will be available during later analysis of P. +// Facts are analogous to type export data in a build system: +// just as export data enables separate compilation of several passes, +// facts enable "separate analysis". +// +// Each pass (a, p) starts with the set of facts produced by the +// same analyzer a applied to the packages directly imported by p. +// The analysis may add facts to the set, and they may be exported in turn. +// An analysis's Run function may retrieve facts by calling +// Pass.Import{Object,Package}Fact and update them using +// Pass.Export{Object,Package}Fact. +// +// A fact is logically private to its Analysis. To pass values +// between different analyzers, use the results mechanism; +// see Analyzer.Requires, Analyzer.ResultType, and Pass.ResultOf. +// +// A Fact type must be a pointer. +// Facts are encoded and decoded using encoding/gob. +// A Fact may implement the GobEncoder/GobDecoder interfaces +// to customize its encoding. Fact encoding should not fail. +// +// A Fact should not be modified once exported. +type Fact interface { + AFact() // dummy method to avoid type errors +} diff --git a/vendor/golang.org/x/tools/go/analysis/diagnostic.go b/vendor/golang.org/x/tools/go/analysis/diagnostic.go new file mode 100644 index 00000000..57eaf6fa --- /dev/null +++ b/vendor/golang.org/x/tools/go/analysis/diagnostic.go @@ -0,0 +1,61 @@ +package analysis + +import "go/token" + +// A Diagnostic is a message associated with a source location or range. +// +// An Analyzer may return a variety of diagnostics; the optional Category, +// which should be a constant, may be used to classify them. +// It is primarily intended to make it easy to look up documentation. +// +// If End is provided, the diagnostic is specified to apply to the range between +// Pos and End. +type Diagnostic struct { + Pos token.Pos + End token.Pos // optional + Category string // optional + Message string + + // SuggestedFixes contains suggested fixes for a diagnostic which can be used to perform + // edits to a file that address the diagnostic. + // TODO(matloob): Should multiple SuggestedFixes be allowed for a diagnostic? + // Diagnostics should not contain SuggestedFixes that overlap. + // Experimental: This API is experimental and may change in the future. + SuggestedFixes []SuggestedFix // optional + + // Experimental: This API is experimental and may change in the future. + Related []RelatedInformation // optional +} + +// RelatedInformation contains information related to a diagnostic. +// For example, a diagnostic that flags duplicated declarations of a +// variable may include one RelatedInformation per existing +// declaration. +type RelatedInformation struct { + Pos token.Pos + End token.Pos + Message string +} + +// A SuggestedFix is a code change associated with a Diagnostic that a user can choose +// to apply to their code. Usually the SuggestedFix is meant to fix the issue flagged +// by the diagnostic. +// TextEdits for a SuggestedFix should not overlap. TextEdits for a SuggestedFix +// should not contain edits for other packages. +// Experimental: This API is experimental and may change in the future. +type SuggestedFix struct { + // A description for this suggested fix to be shown to a user deciding + // whether to accept it. + Message string + TextEdits []TextEdit +} + +// A TextEdit represents the replacement of the code between Pos and End with the new text. +// Each TextEdit should apply to a single file. End should not be earlier in the file than Pos. +// Experimental: This API is experimental and may change in the future. +type TextEdit struct { + // For a pure insertion, End can either be set to Pos or token.NoPos. + Pos token.Pos + End token.Pos + NewText []byte +} diff --git a/vendor/golang.org/x/tools/go/analysis/doc.go b/vendor/golang.org/x/tools/go/analysis/doc.go new file mode 100644 index 00000000..ea56b724 --- /dev/null +++ b/vendor/golang.org/x/tools/go/analysis/doc.go @@ -0,0 +1,301 @@ +/* + +Package analysis defines the interface between a modular static +analysis and an analysis driver program. + + +Background + +A static analysis is a function that inspects a package of Go code and +reports a set of diagnostics (typically mistakes in the code), and +perhaps produces other results as well, such as suggested refactorings +or other facts. An analysis that reports mistakes is informally called a +"checker". For example, the printf checker reports mistakes in +fmt.Printf format strings. + +A "modular" analysis is one that inspects one package at a time but can +save information from a lower-level package and use it when inspecting a +higher-level package, analogous to separate compilation in a toolchain. +The printf checker is modular: when it discovers that a function such as +log.Fatalf delegates to fmt.Printf, it records this fact, and checks +calls to that function too, including calls made from another package. + +By implementing a common interface, checkers from a variety of sources +can be easily selected, incorporated, and reused in a wide range of +driver programs including command-line tools (such as vet), text editors and +IDEs, build and test systems (such as go build, Bazel, or Buck), test +frameworks, code review tools, code-base indexers (such as SourceGraph), +documentation viewers (such as godoc), batch pipelines for large code +bases, and so on. + + +Analyzer + +The primary type in the API is Analyzer. An Analyzer statically +describes an analysis function: its name, documentation, flags, +relationship to other analyzers, and of course, its logic. + +To define an analysis, a user declares a (logically constant) variable +of type Analyzer. Here is a typical example from one of the analyzers in +the go/analysis/passes/ subdirectory: + + package unusedresult + + var Analyzer = &analysis.Analyzer{ + Name: "unusedresult", + Doc: "check for unused results of calls to some functions", + Run: run, + ... + } + + func run(pass *analysis.Pass) (interface{}, error) { + ... + } + +An analysis driver is a program such as vet that runs a set of +analyses and prints the diagnostics that they report. +The driver program must import the list of Analyzers it needs. +Typically each Analyzer resides in a separate package. +To add a new Analyzer to an existing driver, add another item to the list: + + import ( "unusedresult"; "nilness"; "printf" ) + + var analyses = []*analysis.Analyzer{ + unusedresult.Analyzer, + nilness.Analyzer, + printf.Analyzer, + } + +A driver may use the name, flags, and documentation to provide on-line +help that describes the analyses it performs. +The doc comment contains a brief one-line summary, +optionally followed by paragraphs of explanation. + +The Analyzer type has more fields besides those shown above: + + type Analyzer struct { + Name string + Doc string + Flags flag.FlagSet + Run func(*Pass) (interface{}, error) + RunDespiteErrors bool + ResultType reflect.Type + Requires []*Analyzer + FactTypes []Fact + } + +The Flags field declares a set of named (global) flag variables that +control analysis behavior. Unlike vet, analysis flags are not declared +directly in the command line FlagSet; it is up to the driver to set the +flag variables. A driver for a single analysis, a, might expose its flag +f directly on the command line as -f, whereas a driver for multiple +analyses might prefix the flag name by the analysis name (-a.f) to avoid +ambiguity. An IDE might expose the flags through a graphical interface, +and a batch pipeline might configure them from a config file. +See the "findcall" analyzer for an example of flags in action. + +The RunDespiteErrors flag indicates whether the analysis is equipped to +handle ill-typed code. If not, the driver will skip the analysis if +there were parse or type errors. +The optional ResultType field specifies the type of the result value +computed by this analysis and made available to other analyses. +The Requires field specifies a list of analyses upon which +this one depends and whose results it may access, and it constrains the +order in which a driver may run analyses. +The FactTypes field is discussed in the section on Modularity. +The analysis package provides a Validate function to perform basic +sanity checks on an Analyzer, such as that its Requires graph is +acyclic, its fact and result types are unique, and so on. + +Finally, the Run field contains a function to be called by the driver to +execute the analysis on a single package. The driver passes it an +instance of the Pass type. + + +Pass + +A Pass describes a single unit of work: the application of a particular +Analyzer to a particular package of Go code. +The Pass provides information to the Analyzer's Run function about the +package being analyzed, and provides operations to the Run function for +reporting diagnostics and other information back to the driver. + + type Pass struct { + Fset *token.FileSet + Files []*ast.File + OtherFiles []string + Pkg *types.Package + TypesInfo *types.Info + ResultOf map[*Analyzer]interface{} + Report func(Diagnostic) + ... + } + +The Fset, Files, Pkg, and TypesInfo fields provide the syntax trees, +type information, and source positions for a single package of Go code. + +The OtherFiles field provides the names, but not the contents, of non-Go +files such as assembly that are part of this package. See the "asmdecl" +or "buildtags" analyzers for examples of loading non-Go files and reporting +diagnostics against them. + +The ResultOf field provides the results computed by the analyzers +required by this one, as expressed in its Analyzer.Requires field. The +driver runs the required analyzers first and makes their results +available in this map. Each Analyzer must return a value of the type +described in its Analyzer.ResultType field. +For example, the "ctrlflow" analyzer returns a *ctrlflow.CFGs, which +provides a control-flow graph for each function in the package (see +golang.org/x/tools/go/cfg); the "inspect" analyzer returns a value that +enables other Analyzers to traverse the syntax trees of the package more +efficiently; and the "buildssa" analyzer constructs an SSA-form +intermediate representation. +Each of these Analyzers extends the capabilities of later Analyzers +without adding a dependency to the core API, so an analysis tool pays +only for the extensions it needs. + +The Report function emits a diagnostic, a message associated with a +source position. For most analyses, diagnostics are their primary +result. +For convenience, Pass provides a helper method, Reportf, to report a new +diagnostic by formatting a string. +Diagnostic is defined as: + + type Diagnostic struct { + Pos token.Pos + Category string // optional + Message string + } + +The optional Category field is a short identifier that classifies the +kind of message when an analysis produces several kinds of diagnostic. + +Most Analyzers inspect typed Go syntax trees, but a few, such as asmdecl +and buildtag, inspect the raw text of Go source files or even non-Go +files such as assembly. To report a diagnostic against a line of a +raw text file, use the following sequence: + + content, err := ioutil.ReadFile(filename) + if err != nil { ... } + tf := fset.AddFile(filename, -1, len(content)) + tf.SetLinesForContent(content) + ... + pass.Reportf(tf.LineStart(line), "oops") + + +Modular analysis with Facts + +To improve efficiency and scalability, large programs are routinely +built using separate compilation: units of the program are compiled +separately, and recompiled only when one of their dependencies changes; +independent modules may be compiled in parallel. The same technique may +be applied to static analyses, for the same benefits. Such analyses are +described as "modular". + +A compiler’s type checker is an example of a modular static analysis. +Many other checkers we would like to apply to Go programs can be +understood as alternative or non-standard type systems. For example, +vet's printf checker infers whether a function has the "printf wrapper" +type, and it applies stricter checks to calls of such functions. In +addition, it records which functions are printf wrappers for use by +later analysis passes to identify other printf wrappers by induction. +A result such as “f is a printf wrapper” that is not interesting by +itself but serves as a stepping stone to an interesting result (such as +a diagnostic) is called a "fact". + +The analysis API allows an analysis to define new types of facts, to +associate facts of these types with objects (named entities) declared +within the current package, or with the package as a whole, and to query +for an existing fact of a given type associated with an object or +package. + +An Analyzer that uses facts must declare their types: + + var Analyzer = &analysis.Analyzer{ + Name: "printf", + FactTypes: []analysis.Fact{new(isWrapper)}, + ... + } + + type isWrapper struct{} // => *types.Func f “is a printf wrapper” + +The driver program ensures that facts for a pass’s dependencies are +generated before analyzing the package and is responsible for propagating +facts from one package to another, possibly across address spaces. +Consequently, Facts must be serializable. The API requires that drivers +use the gob encoding, an efficient, robust, self-describing binary +protocol. A fact type may implement the GobEncoder/GobDecoder interfaces +if the default encoding is unsuitable. Facts should be stateless. + +The Pass type has functions to import and export facts, +associated either with an object or with a package: + + type Pass struct { + ... + ExportObjectFact func(types.Object, Fact) + ImportObjectFact func(types.Object, Fact) bool + + ExportPackageFact func(fact Fact) + ImportPackageFact func(*types.Package, Fact) bool + } + +An Analyzer may only export facts associated with the current package or +its objects, though it may import facts from any package or object that +is an import dependency of the current package. + +Conceptually, ExportObjectFact(obj, fact) inserts fact into a hidden map keyed by +the pair (obj, TypeOf(fact)), and the ImportObjectFact function +retrieves the entry from this map and copies its value into the variable +pointed to by fact. This scheme assumes that the concrete type of fact +is a pointer; this assumption is checked by the Validate function. +See the "printf" analyzer for an example of object facts in action. + +Some driver implementations (such as those based on Bazel and Blaze) do +not currently apply analyzers to packages of the standard library. +Therefore, for best results, analyzer authors should not rely on +analysis facts being available for standard packages. +For example, although the printf checker is capable of deducing during +analysis of the log package that log.Printf is a printf wrapper, +this fact is built in to the analyzer so that it correctly checks +calls to log.Printf even when run in a driver that does not apply +it to standard packages. We would like to remove this limitation in future. + + +Testing an Analyzer + +The analysistest subpackage provides utilities for testing an Analyzer. +In a few lines of code, it is possible to run an analyzer on a package +of testdata files and check that it reported all the expected +diagnostics and facts (and no more). Expectations are expressed using +"// want ..." comments in the input code. + + +Standalone commands + +Analyzers are provided in the form of packages that a driver program is +expected to import. The vet command imports a set of several analyzers, +but users may wish to define their own analysis commands that perform +additional checks. To simplify the task of creating an analysis command, +either for a single analyzer or for a whole suite, we provide the +singlechecker and multichecker subpackages. + +The singlechecker package provides the main function for a command that +runs one analyzer. By convention, each analyzer such as +go/passes/findcall should be accompanied by a singlechecker-based +command such as go/analysis/passes/findcall/cmd/findcall, defined in its +entirety as: + + package main + + import ( + "golang.org/x/tools/go/analysis/passes/findcall" + "golang.org/x/tools/go/analysis/singlechecker" + ) + + func main() { singlechecker.Main(findcall.Analyzer) } + +A tool that provides multiple analyzers can use multichecker in a +similar way, giving it the list of Analyzers. + +*/ +package analysis diff --git a/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go b/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go new file mode 100644 index 00000000..2856df13 --- /dev/null +++ b/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go @@ -0,0 +1,49 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package inspect defines an Analyzer that provides an AST inspector +// (golang.org/x/tools/go/ast/inspect.Inspect) for the syntax trees of a +// package. It is only a building block for other analyzers. +// +// Example of use in another analysis: +// +// import ( +// "golang.org/x/tools/go/analysis" +// "golang.org/x/tools/go/analysis/passes/inspect" +// "golang.org/x/tools/go/ast/inspector" +// ) +// +// var Analyzer = &analysis.Analyzer{ +// ... +// Requires: []*analysis.Analyzer{inspect.Analyzer}, +// } +// +// func run(pass *analysis.Pass) (interface{}, error) { +// inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) +// inspect.Preorder(nil, func(n ast.Node) { +// ... +// }) +// return nil +// } +// +package inspect + +import ( + "reflect" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/ast/inspector" +) + +var Analyzer = &analysis.Analyzer{ + Name: "inspect", + Doc: "optimize AST traversal for later passes", + Run: run, + RunDespiteErrors: true, + ResultType: reflect.TypeOf(new(inspector.Inspector)), +} + +func run(pass *analysis.Pass) (interface{}, error) { + return inspector.New(pass.Files), nil +} diff --git a/vendor/golang.org/x/tools/go/analysis/validate.go b/vendor/golang.org/x/tools/go/analysis/validate.go new file mode 100644 index 00000000..be981434 --- /dev/null +++ b/vendor/golang.org/x/tools/go/analysis/validate.go @@ -0,0 +1,97 @@ +package analysis + +import ( + "fmt" + "reflect" + "unicode" +) + +// Validate reports an error if any of the analyzers are misconfigured. +// Checks include: +// that the name is a valid identifier; +// that the Requires graph is acyclic; +// that analyzer fact types are unique; +// that each fact type is a pointer. +func Validate(analyzers []*Analyzer) error { + // Map each fact type to its sole generating analyzer. + factTypes := make(map[reflect.Type]*Analyzer) + + // Traverse the Requires graph, depth first. + const ( + white = iota + grey + black + finished + ) + color := make(map[*Analyzer]uint8) + var visit func(a *Analyzer) error + visit = func(a *Analyzer) error { + if a == nil { + return fmt.Errorf("nil *Analyzer") + } + if color[a] == white { + color[a] = grey + + // names + if !validIdent(a.Name) { + return fmt.Errorf("invalid analyzer name %q", a) + } + + if a.Doc == "" { + return fmt.Errorf("analyzer %q is undocumented", a) + } + + // fact types + for _, f := range a.FactTypes { + if f == nil { + return fmt.Errorf("analyzer %s has nil FactType", a) + } + t := reflect.TypeOf(f) + if prev := factTypes[t]; prev != nil { + return fmt.Errorf("fact type %s registered by two analyzers: %v, %v", + t, a, prev) + } + if t.Kind() != reflect.Ptr { + return fmt.Errorf("%s: fact type %s is not a pointer", a, t) + } + factTypes[t] = a + } + + // recursion + for i, req := range a.Requires { + if err := visit(req); err != nil { + return fmt.Errorf("%s.Requires[%d]: %v", a.Name, i, err) + } + } + color[a] = black + } + + return nil + } + for _, a := range analyzers { + if err := visit(a); err != nil { + return err + } + } + + // Reject duplicates among analyzers. + // Precondition: color[a] == black. + // Postcondition: color[a] == finished. + for _, a := range analyzers { + if color[a] == finished { + return fmt.Errorf("duplicate analyzer: %s", a.Name) + } + color[a] = finished + } + + return nil +} + +func validIdent(name string) bool { + for i, r := range name { + if !(r == '_' || unicode.IsLetter(r) || i > 0 && unicode.IsDigit(r)) { + return false + } + } + return name != "" +} diff --git a/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go b/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go new file mode 100644 index 00000000..6b7052b8 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go @@ -0,0 +1,627 @@ +// Copyright 2013 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 astutil + +// This file defines utilities for working with source positions. + +import ( + "fmt" + "go/ast" + "go/token" + "sort" +) + +// PathEnclosingInterval returns the node that encloses the source +// interval [start, end), and all its ancestors up to the AST root. +// +// The definition of "enclosing" used by this function considers +// additional whitespace abutting a node to be enclosed by it. +// In this example: +// +// z := x + y // add them +// <-A-> +// <----B-----> +// +// the ast.BinaryExpr(+) node is considered to enclose interval B +// even though its [Pos()..End()) is actually only interval A. +// This behaviour makes user interfaces more tolerant of imperfect +// input. +// +// This function treats tokens as nodes, though they are not included +// in the result. e.g. PathEnclosingInterval("+") returns the +// enclosing ast.BinaryExpr("x + y"). +// +// If start==end, the 1-char interval following start is used instead. +// +// The 'exact' result is true if the interval contains only path[0] +// and perhaps some adjacent whitespace. It is false if the interval +// overlaps multiple children of path[0], or if it contains only +// interior whitespace of path[0]. +// In this example: +// +// z := x + y // add them +// <--C--> <---E--> +// ^ +// D +// +// intervals C, D and E are inexact. C is contained by the +// z-assignment statement, because it spans three of its children (:=, +// x, +). So too is the 1-char interval D, because it contains only +// interior whitespace of the assignment. E is considered interior +// whitespace of the BlockStmt containing the assignment. +// +// Precondition: [start, end) both lie within the same file as root. +// TODO(adonovan): return (nil, false) in this case and remove precond. +// Requires FileSet; see loader.tokenFileContainsPos. +// +// Postcondition: path is never nil; it always contains at least 'root'. +// +func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Node, exact bool) { + // fmt.Printf("EnclosingInterval %d %d\n", start, end) // debugging + + // Precondition: node.[Pos..End) and adjoining whitespace contain [start, end). + var visit func(node ast.Node) bool + visit = func(node ast.Node) bool { + path = append(path, node) + + nodePos := node.Pos() + nodeEnd := node.End() + + // fmt.Printf("visit(%T, %d, %d)\n", node, nodePos, nodeEnd) // debugging + + // Intersect [start, end) with interval of node. + if start < nodePos { + start = nodePos + } + if end > nodeEnd { + end = nodeEnd + } + + // Find sole child that contains [start, end). + children := childrenOf(node) + l := len(children) + for i, child := range children { + // [childPos, childEnd) is unaugmented interval of child. + childPos := child.Pos() + childEnd := child.End() + + // [augPos, augEnd) is whitespace-augmented interval of child. + augPos := childPos + augEnd := childEnd + if i > 0 { + augPos = children[i-1].End() // start of preceding whitespace + } + if i < l-1 { + nextChildPos := children[i+1].Pos() + // Does [start, end) lie between child and next child? + if start >= augEnd && end <= nextChildPos { + return false // inexact match + } + augEnd = nextChildPos // end of following whitespace + } + + // fmt.Printf("\tchild %d: [%d..%d)\tcontains interval [%d..%d)?\n", + // i, augPos, augEnd, start, end) // debugging + + // Does augmented child strictly contain [start, end)? + if augPos <= start && end <= augEnd { + _, isToken := child.(tokenNode) + return isToken || visit(child) + } + + // Does [start, end) overlap multiple children? + // i.e. left-augmented child contains start + // but LR-augmented child does not contain end. + if start < childEnd && end > augEnd { + break + } + } + + // No single child contained [start, end), + // so node is the result. Is it exact? + + // (It's tempting to put this condition before the + // child loop, but it gives the wrong result in the + // case where a node (e.g. ExprStmt) and its sole + // child have equal intervals.) + if start == nodePos && end == nodeEnd { + return true // exact match + } + + return false // inexact: overlaps multiple children + } + + if start > end { + start, end = end, start + } + + if start < root.End() && end > root.Pos() { + if start == end { + end = start + 1 // empty interval => interval of size 1 + } + exact = visit(root) + + // Reverse the path: + for i, l := 0, len(path); i < l/2; i++ { + path[i], path[l-1-i] = path[l-1-i], path[i] + } + } else { + // Selection lies within whitespace preceding the + // first (or following the last) declaration in the file. + // The result nonetheless always includes the ast.File. + path = append(path, root) + } + + return +} + +// tokenNode is a dummy implementation of ast.Node for a single token. +// They are used transiently by PathEnclosingInterval but never escape +// this package. +// +type tokenNode struct { + pos token.Pos + end token.Pos +} + +func (n tokenNode) Pos() token.Pos { + return n.pos +} + +func (n tokenNode) End() token.Pos { + return n.end +} + +func tok(pos token.Pos, len int) ast.Node { + return tokenNode{pos, pos + token.Pos(len)} +} + +// childrenOf returns the direct non-nil children of ast.Node n. +// It may include fake ast.Node implementations for bare tokens. +// it is not safe to call (e.g.) ast.Walk on such nodes. +// +func childrenOf(n ast.Node) []ast.Node { + var children []ast.Node + + // First add nodes for all true subtrees. + ast.Inspect(n, func(node ast.Node) bool { + if node == n { // push n + return true // recur + } + if node != nil { // push child + children = append(children, node) + } + return false // no recursion + }) + + // Then add fake Nodes for bare tokens. + switch n := n.(type) { + case *ast.ArrayType: + children = append(children, + tok(n.Lbrack, len("[")), + tok(n.Elt.End(), len("]"))) + + case *ast.AssignStmt: + children = append(children, + tok(n.TokPos, len(n.Tok.String()))) + + case *ast.BasicLit: + children = append(children, + tok(n.ValuePos, len(n.Value))) + + case *ast.BinaryExpr: + children = append(children, tok(n.OpPos, len(n.Op.String()))) + + case *ast.BlockStmt: + children = append(children, + tok(n.Lbrace, len("{")), + tok(n.Rbrace, len("}"))) + + case *ast.BranchStmt: + children = append(children, + tok(n.TokPos, len(n.Tok.String()))) + + case *ast.CallExpr: + children = append(children, + tok(n.Lparen, len("(")), + tok(n.Rparen, len(")"))) + if n.Ellipsis != 0 { + children = append(children, tok(n.Ellipsis, len("..."))) + } + + case *ast.CaseClause: + if n.List == nil { + children = append(children, + tok(n.Case, len("default"))) + } else { + children = append(children, + tok(n.Case, len("case"))) + } + children = append(children, tok(n.Colon, len(":"))) + + case *ast.ChanType: + switch n.Dir { + case ast.RECV: + children = append(children, tok(n.Begin, len("<-chan"))) + case ast.SEND: + children = append(children, tok(n.Begin, len("chan<-"))) + case ast.RECV | ast.SEND: + children = append(children, tok(n.Begin, len("chan"))) + } + + case *ast.CommClause: + if n.Comm == nil { + children = append(children, + tok(n.Case, len("default"))) + } else { + children = append(children, + tok(n.Case, len("case"))) + } + children = append(children, tok(n.Colon, len(":"))) + + case *ast.Comment: + // nop + + case *ast.CommentGroup: + // nop + + case *ast.CompositeLit: + children = append(children, + tok(n.Lbrace, len("{")), + tok(n.Rbrace, len("{"))) + + case *ast.DeclStmt: + // nop + + case *ast.DeferStmt: + children = append(children, + tok(n.Defer, len("defer"))) + + case *ast.Ellipsis: + children = append(children, + tok(n.Ellipsis, len("..."))) + + case *ast.EmptyStmt: + // nop + + case *ast.ExprStmt: + // nop + + case *ast.Field: + // TODO(adonovan): Field.{Doc,Comment,Tag}? + + case *ast.FieldList: + children = append(children, + tok(n.Opening, len("(")), + tok(n.Closing, len(")"))) + + case *ast.File: + // TODO test: Doc + children = append(children, + tok(n.Package, len("package"))) + + case *ast.ForStmt: + children = append(children, + tok(n.For, len("for"))) + + case *ast.FuncDecl: + // TODO(adonovan): FuncDecl.Comment? + + // Uniquely, FuncDecl breaks the invariant that + // preorder traversal yields tokens in lexical order: + // in fact, FuncDecl.Recv precedes FuncDecl.Type.Func. + // + // As a workaround, we inline the case for FuncType + // here and order things correctly. + // + children = nil // discard ast.Walk(FuncDecl) info subtrees + children = append(children, tok(n.Type.Func, len("func"))) + if n.Recv != nil { + children = append(children, n.Recv) + } + children = append(children, n.Name) + if n.Type.Params != nil { + children = append(children, n.Type.Params) + } + if n.Type.Results != nil { + children = append(children, n.Type.Results) + } + if n.Body != nil { + children = append(children, n.Body) + } + + case *ast.FuncLit: + // nop + + case *ast.FuncType: + if n.Func != 0 { + children = append(children, + tok(n.Func, len("func"))) + } + + case *ast.GenDecl: + children = append(children, + tok(n.TokPos, len(n.Tok.String()))) + if n.Lparen != 0 { + children = append(children, + tok(n.Lparen, len("(")), + tok(n.Rparen, len(")"))) + } + + case *ast.GoStmt: + children = append(children, + tok(n.Go, len("go"))) + + case *ast.Ident: + children = append(children, + tok(n.NamePos, len(n.Name))) + + case *ast.IfStmt: + children = append(children, + tok(n.If, len("if"))) + + case *ast.ImportSpec: + // TODO(adonovan): ImportSpec.{Doc,EndPos}? + + case *ast.IncDecStmt: + children = append(children, + tok(n.TokPos, len(n.Tok.String()))) + + case *ast.IndexExpr: + children = append(children, + tok(n.Lbrack, len("{")), + tok(n.Rbrack, len("}"))) + + case *ast.InterfaceType: + children = append(children, + tok(n.Interface, len("interface"))) + + case *ast.KeyValueExpr: + children = append(children, + tok(n.Colon, len(":"))) + + case *ast.LabeledStmt: + children = append(children, + tok(n.Colon, len(":"))) + + case *ast.MapType: + children = append(children, + tok(n.Map, len("map"))) + + case *ast.ParenExpr: + children = append(children, + tok(n.Lparen, len("(")), + tok(n.Rparen, len(")"))) + + case *ast.RangeStmt: + children = append(children, + tok(n.For, len("for")), + tok(n.TokPos, len(n.Tok.String()))) + + case *ast.ReturnStmt: + children = append(children, + tok(n.Return, len("return"))) + + case *ast.SelectStmt: + children = append(children, + tok(n.Select, len("select"))) + + case *ast.SelectorExpr: + // nop + + case *ast.SendStmt: + children = append(children, + tok(n.Arrow, len("<-"))) + + case *ast.SliceExpr: + children = append(children, + tok(n.Lbrack, len("[")), + tok(n.Rbrack, len("]"))) + + case *ast.StarExpr: + children = append(children, tok(n.Star, len("*"))) + + case *ast.StructType: + children = append(children, tok(n.Struct, len("struct"))) + + case *ast.SwitchStmt: + children = append(children, tok(n.Switch, len("switch"))) + + case *ast.TypeAssertExpr: + children = append(children, + tok(n.Lparen-1, len(".")), + tok(n.Lparen, len("(")), + tok(n.Rparen, len(")"))) + + case *ast.TypeSpec: + // TODO(adonovan): TypeSpec.{Doc,Comment}? + + case *ast.TypeSwitchStmt: + children = append(children, tok(n.Switch, len("switch"))) + + case *ast.UnaryExpr: + children = append(children, tok(n.OpPos, len(n.Op.String()))) + + case *ast.ValueSpec: + // TODO(adonovan): ValueSpec.{Doc,Comment}? + + case *ast.BadDecl, *ast.BadExpr, *ast.BadStmt: + // nop + } + + // TODO(adonovan): opt: merge the logic of ast.Inspect() into + // the switch above so we can make interleaved callbacks for + // both Nodes and Tokens in the right order and avoid the need + // to sort. + sort.Sort(byPos(children)) + + return children +} + +type byPos []ast.Node + +func (sl byPos) Len() int { + return len(sl) +} +func (sl byPos) Less(i, j int) bool { + return sl[i].Pos() < sl[j].Pos() +} +func (sl byPos) Swap(i, j int) { + sl[i], sl[j] = sl[j], sl[i] +} + +// NodeDescription returns a description of the concrete type of n suitable +// for a user interface. +// +// TODO(adonovan): in some cases (e.g. Field, FieldList, Ident, +// StarExpr) we could be much more specific given the path to the AST +// root. Perhaps we should do that. +// +func NodeDescription(n ast.Node) string { + switch n := n.(type) { + case *ast.ArrayType: + return "array type" + case *ast.AssignStmt: + return "assignment" + case *ast.BadDecl: + return "bad declaration" + case *ast.BadExpr: + return "bad expression" + case *ast.BadStmt: + return "bad statement" + case *ast.BasicLit: + return "basic literal" + case *ast.BinaryExpr: + return fmt.Sprintf("binary %s operation", n.Op) + case *ast.BlockStmt: + return "block" + case *ast.BranchStmt: + switch n.Tok { + case token.BREAK: + return "break statement" + case token.CONTINUE: + return "continue statement" + case token.GOTO: + return "goto statement" + case token.FALLTHROUGH: + return "fall-through statement" + } + case *ast.CallExpr: + if len(n.Args) == 1 && !n.Ellipsis.IsValid() { + return "function call (or conversion)" + } + return "function call" + case *ast.CaseClause: + return "case clause" + case *ast.ChanType: + return "channel type" + case *ast.CommClause: + return "communication clause" + case *ast.Comment: + return "comment" + case *ast.CommentGroup: + return "comment group" + case *ast.CompositeLit: + return "composite literal" + case *ast.DeclStmt: + return NodeDescription(n.Decl) + " statement" + case *ast.DeferStmt: + return "defer statement" + case *ast.Ellipsis: + return "ellipsis" + case *ast.EmptyStmt: + return "empty statement" + case *ast.ExprStmt: + return "expression statement" + case *ast.Field: + // Can be any of these: + // struct {x, y int} -- struct field(s) + // struct {T} -- anon struct field + // interface {I} -- interface embedding + // interface {f()} -- interface method + // func (A) func(B) C -- receiver, param(s), result(s) + return "field/method/parameter" + case *ast.FieldList: + return "field/method/parameter list" + case *ast.File: + return "source file" + case *ast.ForStmt: + return "for loop" + case *ast.FuncDecl: + return "function declaration" + case *ast.FuncLit: + return "function literal" + case *ast.FuncType: + return "function type" + case *ast.GenDecl: + switch n.Tok { + case token.IMPORT: + return "import declaration" + case token.CONST: + return "constant declaration" + case token.TYPE: + return "type declaration" + case token.VAR: + return "variable declaration" + } + case *ast.GoStmt: + return "go statement" + case *ast.Ident: + return "identifier" + case *ast.IfStmt: + return "if statement" + case *ast.ImportSpec: + return "import specification" + case *ast.IncDecStmt: + if n.Tok == token.INC { + return "increment statement" + } + return "decrement statement" + case *ast.IndexExpr: + return "index expression" + case *ast.InterfaceType: + return "interface type" + case *ast.KeyValueExpr: + return "key/value association" + case *ast.LabeledStmt: + return "statement label" + case *ast.MapType: + return "map type" + case *ast.Package: + return "package" + case *ast.ParenExpr: + return "parenthesized " + NodeDescription(n.X) + case *ast.RangeStmt: + return "range loop" + case *ast.ReturnStmt: + return "return statement" + case *ast.SelectStmt: + return "select statement" + case *ast.SelectorExpr: + return "selector" + case *ast.SendStmt: + return "channel send" + case *ast.SliceExpr: + return "slice expression" + case *ast.StarExpr: + return "*-operation" // load/store expr or pointer type + case *ast.StructType: + return "struct type" + case *ast.SwitchStmt: + return "switch statement" + case *ast.TypeAssertExpr: + return "type assertion" + case *ast.TypeSpec: + return "type specification" + case *ast.TypeSwitchStmt: + return "type switch" + case *ast.UnaryExpr: + return fmt.Sprintf("unary %s operation", n.Op) + case *ast.ValueSpec: + return "value specification" + + } + panic(fmt.Sprintf("unexpected node type: %T", n)) +} diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/vendor/golang.org/x/tools/go/ast/astutil/imports.go new file mode 100644 index 00000000..2087ceec --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/astutil/imports.go @@ -0,0 +1,482 @@ +// Copyright 2013 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 astutil contains common utilities for working with the Go AST. +package astutil // import "golang.org/x/tools/go/ast/astutil" + +import ( + "fmt" + "go/ast" + "go/token" + "strconv" + "strings" +) + +// AddImport adds the import path to the file f, if absent. +func AddImport(fset *token.FileSet, f *ast.File, path string) (added bool) { + return AddNamedImport(fset, f, "", path) +} + +// AddNamedImport adds the import with the given name and path to the file f, if absent. +// If name is not empty, it is used to rename the import. +// +// For example, calling +// AddNamedImport(fset, f, "pathpkg", "path") +// adds +// import pathpkg "path" +func AddNamedImport(fset *token.FileSet, f *ast.File, name, path string) (added bool) { + if imports(f, name, path) { + return false + } + + newImport := &ast.ImportSpec{ + Path: &ast.BasicLit{ + Kind: token.STRING, + Value: strconv.Quote(path), + }, + } + if name != "" { + newImport.Name = &ast.Ident{Name: name} + } + + // Find an import decl to add to. + // The goal is to find an existing import + // whose import path has the longest shared + // prefix with path. + var ( + bestMatch = -1 // length of longest shared prefix + lastImport = -1 // index in f.Decls of the file's final import decl + impDecl *ast.GenDecl // import decl containing the best match + impIndex = -1 // spec index in impDecl containing the best match + + isThirdPartyPath = isThirdParty(path) + ) + for i, decl := range f.Decls { + gen, ok := decl.(*ast.GenDecl) + if ok && gen.Tok == token.IMPORT { + lastImport = i + // Do not add to import "C", to avoid disrupting the + // association with its doc comment, breaking cgo. + if declImports(gen, "C") { + continue + } + + // Match an empty import decl if that's all that is available. + if len(gen.Specs) == 0 && bestMatch == -1 { + impDecl = gen + } + + // Compute longest shared prefix with imports in this group and find best + // matched import spec. + // 1. Always prefer import spec with longest shared prefix. + // 2. While match length is 0, + // - for stdlib package: prefer first import spec. + // - for third party package: prefer first third party import spec. + // We cannot use last import spec as best match for third party package + // because grouped imports are usually placed last by goimports -local + // flag. + // See issue #19190. + seenAnyThirdParty := false + for j, spec := range gen.Specs { + impspec := spec.(*ast.ImportSpec) + p := importPath(impspec) + n := matchLen(p, path) + if n > bestMatch || (bestMatch == 0 && !seenAnyThirdParty && isThirdPartyPath) { + bestMatch = n + impDecl = gen + impIndex = j + } + seenAnyThirdParty = seenAnyThirdParty || isThirdParty(p) + } + } + } + + // If no import decl found, add one after the last import. + if impDecl == nil { + impDecl = &ast.GenDecl{ + Tok: token.IMPORT, + } + if lastImport >= 0 { + impDecl.TokPos = f.Decls[lastImport].End() + } else { + // There are no existing imports. + // Our new import, preceded by a blank line, goes after the package declaration + // and after the comment, if any, that starts on the same line as the + // package declaration. + impDecl.TokPos = f.Package + + file := fset.File(f.Package) + pkgLine := file.Line(f.Package) + for _, c := range f.Comments { + if file.Line(c.Pos()) > pkgLine { + break + } + // +2 for a blank line + impDecl.TokPos = c.End() + 2 + } + } + f.Decls = append(f.Decls, nil) + copy(f.Decls[lastImport+2:], f.Decls[lastImport+1:]) + f.Decls[lastImport+1] = impDecl + } + + // Insert new import at insertAt. + insertAt := 0 + if impIndex >= 0 { + // insert after the found import + insertAt = impIndex + 1 + } + impDecl.Specs = append(impDecl.Specs, nil) + copy(impDecl.Specs[insertAt+1:], impDecl.Specs[insertAt:]) + impDecl.Specs[insertAt] = newImport + pos := impDecl.Pos() + if insertAt > 0 { + // If there is a comment after an existing import, preserve the comment + // position by adding the new import after the comment. + if spec, ok := impDecl.Specs[insertAt-1].(*ast.ImportSpec); ok && spec.Comment != nil { + pos = spec.Comment.End() + } else { + // Assign same position as the previous import, + // so that the sorter sees it as being in the same block. + pos = impDecl.Specs[insertAt-1].Pos() + } + } + if newImport.Name != nil { + newImport.Name.NamePos = pos + } + newImport.Path.ValuePos = pos + newImport.EndPos = pos + + // Clean up parens. impDecl contains at least one spec. + if len(impDecl.Specs) == 1 { + // Remove unneeded parens. + impDecl.Lparen = token.NoPos + } else if !impDecl.Lparen.IsValid() { + // impDecl needs parens added. + impDecl.Lparen = impDecl.Specs[0].Pos() + } + + f.Imports = append(f.Imports, newImport) + + if len(f.Decls) <= 1 { + return true + } + + // Merge all the import declarations into the first one. + var first *ast.GenDecl + for i := 0; i < len(f.Decls); i++ { + decl := f.Decls[i] + gen, ok := decl.(*ast.GenDecl) + if !ok || gen.Tok != token.IMPORT || declImports(gen, "C") { + continue + } + if first == nil { + first = gen + continue // Don't touch the first one. + } + // We now know there is more than one package in this import + // declaration. Ensure that it ends up parenthesized. + first.Lparen = first.Pos() + // Move the imports of the other import declaration to the first one. + for _, spec := range gen.Specs { + spec.(*ast.ImportSpec).Path.ValuePos = first.Pos() + first.Specs = append(first.Specs, spec) + } + f.Decls = append(f.Decls[:i], f.Decls[i+1:]...) + i-- + } + + return true +} + +func isThirdParty(importPath string) bool { + // Third party package import path usually contains "." (".com", ".org", ...) + // This logic is taken from golang.org/x/tools/imports package. + return strings.Contains(importPath, ".") +} + +// DeleteImport deletes the import path from the file f, if present. +// If there are duplicate import declarations, all matching ones are deleted. +func DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) { + return DeleteNamedImport(fset, f, "", path) +} + +// DeleteNamedImport deletes the import with the given name and path from the file f, if present. +// If there are duplicate import declarations, all matching ones are deleted. +func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (deleted bool) { + var delspecs []*ast.ImportSpec + var delcomments []*ast.CommentGroup + + // Find the import nodes that import path, if any. + for i := 0; i < len(f.Decls); i++ { + decl := f.Decls[i] + gen, ok := decl.(*ast.GenDecl) + if !ok || gen.Tok != token.IMPORT { + continue + } + for j := 0; j < len(gen.Specs); j++ { + spec := gen.Specs[j] + impspec := spec.(*ast.ImportSpec) + if importName(impspec) != name || importPath(impspec) != path { + continue + } + + // We found an import spec that imports path. + // Delete it. + delspecs = append(delspecs, impspec) + deleted = true + copy(gen.Specs[j:], gen.Specs[j+1:]) + gen.Specs = gen.Specs[:len(gen.Specs)-1] + + // If this was the last import spec in this decl, + // delete the decl, too. + if len(gen.Specs) == 0 { + copy(f.Decls[i:], f.Decls[i+1:]) + f.Decls = f.Decls[:len(f.Decls)-1] + i-- + break + } else if len(gen.Specs) == 1 { + if impspec.Doc != nil { + delcomments = append(delcomments, impspec.Doc) + } + if impspec.Comment != nil { + delcomments = append(delcomments, impspec.Comment) + } + for _, cg := range f.Comments { + // Found comment on the same line as the import spec. + if cg.End() < impspec.Pos() && fset.Position(cg.End()).Line == fset.Position(impspec.Pos()).Line { + delcomments = append(delcomments, cg) + break + } + } + + spec := gen.Specs[0].(*ast.ImportSpec) + + // Move the documentation right after the import decl. + if spec.Doc != nil { + for fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Doc.Pos()).Line { + fset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line) + } + } + for _, cg := range f.Comments { + if cg.End() < spec.Pos() && fset.Position(cg.End()).Line == fset.Position(spec.Pos()).Line { + for fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Pos()).Line { + fset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line) + } + break + } + } + } + if j > 0 { + lastImpspec := gen.Specs[j-1].(*ast.ImportSpec) + lastLine := fset.Position(lastImpspec.Path.ValuePos).Line + line := fset.Position(impspec.Path.ValuePos).Line + + // We deleted an entry but now there may be + // a blank line-sized hole where the import was. + if line-lastLine > 1 || !gen.Rparen.IsValid() { + // There was a blank line immediately preceding the deleted import, + // so there's no need to close the hole. The right parenthesis is + // invalid after AddImport to an import statement without parenthesis. + // Do nothing. + } else if line != fset.File(gen.Rparen).LineCount() { + // There was no blank line. Close the hole. + fset.File(gen.Rparen).MergeLine(line) + } + } + j-- + } + } + + // Delete imports from f.Imports. + for i := 0; i < len(f.Imports); i++ { + imp := f.Imports[i] + for j, del := range delspecs { + if imp == del { + copy(f.Imports[i:], f.Imports[i+1:]) + f.Imports = f.Imports[:len(f.Imports)-1] + copy(delspecs[j:], delspecs[j+1:]) + delspecs = delspecs[:len(delspecs)-1] + i-- + break + } + } + } + + // Delete comments from f.Comments. + for i := 0; i < len(f.Comments); i++ { + cg := f.Comments[i] + for j, del := range delcomments { + if cg == del { + copy(f.Comments[i:], f.Comments[i+1:]) + f.Comments = f.Comments[:len(f.Comments)-1] + copy(delcomments[j:], delcomments[j+1:]) + delcomments = delcomments[:len(delcomments)-1] + i-- + break + } + } + } + + if len(delspecs) > 0 { + panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs)) + } + + return +} + +// RewriteImport rewrites any import of path oldPath to path newPath. +func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (rewrote bool) { + for _, imp := range f.Imports { + if importPath(imp) == oldPath { + rewrote = true + // record old End, because the default is to compute + // it using the length of imp.Path.Value. + imp.EndPos = imp.End() + imp.Path.Value = strconv.Quote(newPath) + } + } + return +} + +// UsesImport reports whether a given import is used. +func UsesImport(f *ast.File, path string) (used bool) { + spec := importSpec(f, path) + if spec == nil { + return + } + + name := spec.Name.String() + switch name { + case "": + // If the package name is not explicitly specified, + // make an educated guess. This is not guaranteed to be correct. + lastSlash := strings.LastIndex(path, "/") + if lastSlash == -1 { + name = path + } else { + name = path[lastSlash+1:] + } + case "_", ".": + // Not sure if this import is used - err on the side of caution. + return true + } + + ast.Walk(visitFn(func(n ast.Node) { + sel, ok := n.(*ast.SelectorExpr) + if ok && isTopName(sel.X, name) { + used = true + } + }), f) + + return +} + +type visitFn func(node ast.Node) + +func (fn visitFn) Visit(node ast.Node) ast.Visitor { + fn(node) + return fn +} + +// imports reports whether f has an import with the specified name and path. +func imports(f *ast.File, name, path string) bool { + for _, s := range f.Imports { + if importName(s) == name && importPath(s) == path { + return true + } + } + return false +} + +// importSpec returns the import spec if f imports path, +// or nil otherwise. +func importSpec(f *ast.File, path string) *ast.ImportSpec { + for _, s := range f.Imports { + if importPath(s) == path { + return s + } + } + return nil +} + +// importName returns the name of s, +// or "" if the import is not named. +func importName(s *ast.ImportSpec) string { + if s.Name == nil { + return "" + } + return s.Name.Name +} + +// importPath returns the unquoted import path of s, +// or "" if the path is not properly quoted. +func importPath(s *ast.ImportSpec) string { + t, err := strconv.Unquote(s.Path.Value) + if err != nil { + return "" + } + return t +} + +// declImports reports whether gen contains an import of path. +func declImports(gen *ast.GenDecl, path string) bool { + if gen.Tok != token.IMPORT { + return false + } + for _, spec := range gen.Specs { + impspec := spec.(*ast.ImportSpec) + if importPath(impspec) == path { + return true + } + } + return false +} + +// matchLen returns the length of the longest path segment prefix shared by x and y. +func matchLen(x, y string) int { + n := 0 + for i := 0; i < len(x) && i < len(y) && x[i] == y[i]; i++ { + if x[i] == '/' { + n++ + } + } + return n +} + +// isTopName returns true if n is a top-level unresolved identifier with the given name. +func isTopName(n ast.Expr, name string) bool { + id, ok := n.(*ast.Ident) + return ok && id.Name == name && id.Obj == nil +} + +// Imports returns the file imports grouped by paragraph. +func Imports(fset *token.FileSet, f *ast.File) [][]*ast.ImportSpec { + var groups [][]*ast.ImportSpec + + for _, decl := range f.Decls { + genDecl, ok := decl.(*ast.GenDecl) + if !ok || genDecl.Tok != token.IMPORT { + break + } + + group := []*ast.ImportSpec{} + + var lastLine int + for _, spec := range genDecl.Specs { + importSpec := spec.(*ast.ImportSpec) + pos := importSpec.Path.ValuePos + line := fset.Position(pos).Line + if lastLine > 0 && pos > 0 && line-lastLine > 1 { + groups = append(groups, group) + group = []*ast.ImportSpec{} + } + group = append(group, importSpec) + lastLine = line + } + groups = append(groups, group) + } + + return groups +} diff --git a/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go b/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go new file mode 100644 index 00000000..cf72ea99 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go @@ -0,0 +1,477 @@ +// 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. + +package astutil + +import ( + "fmt" + "go/ast" + "reflect" + "sort" +) + +// An ApplyFunc is invoked by Apply for each node n, even if n is nil, +// before and/or after the node's children, using a Cursor describing +// the current node and providing operations on it. +// +// The return value of ApplyFunc controls the syntax tree traversal. +// See Apply for details. +type ApplyFunc func(*Cursor) bool + +// Apply traverses a syntax tree recursively, starting with root, +// and calling pre and post for each node as described below. +// Apply returns the syntax tree, possibly modified. +// +// If pre is not nil, it is called for each node before the node's +// children are traversed (pre-order). If pre returns false, no +// children are traversed, and post is not called for that node. +// +// If post is not nil, and a prior call of pre didn't return false, +// post is called for each node after its children are traversed +// (post-order). If post returns false, traversal is terminated and +// Apply returns immediately. +// +// Only fields that refer to AST nodes are considered children; +// i.e., token.Pos, Scopes, Objects, and fields of basic types +// (strings, etc.) are ignored. +// +// Children are traversed in the order in which they appear in the +// respective node's struct definition. A package's files are +// traversed in the filenames' alphabetical order. +// +func Apply(root ast.Node, pre, post ApplyFunc) (result ast.Node) { + parent := &struct{ ast.Node }{root} + defer func() { + if r := recover(); r != nil && r != abort { + panic(r) + } + result = parent.Node + }() + a := &application{pre: pre, post: post} + a.apply(parent, "Node", nil, root) + return +} + +var abort = new(int) // singleton, to signal termination of Apply + +// A Cursor describes a node encountered during Apply. +// Information about the node and its parent is available +// from the Node, Parent, Name, and Index methods. +// +// If p is a variable of type and value of the current parent node +// c.Parent(), and f is the field identifier with name c.Name(), +// the following invariants hold: +// +// p.f == c.Node() if c.Index() < 0 +// p.f[c.Index()] == c.Node() if c.Index() >= 0 +// +// The methods Replace, Delete, InsertBefore, and InsertAfter +// can be used to change the AST without disrupting Apply. +type Cursor struct { + parent ast.Node + name string + iter *iterator // valid if non-nil + node ast.Node +} + +// Node returns the current Node. +func (c *Cursor) Node() ast.Node { return c.node } + +// Parent returns the parent of the current Node. +func (c *Cursor) Parent() ast.Node { return c.parent } + +// Name returns the name of the parent Node field that contains the current Node. +// If the parent is a *ast.Package and the current Node is a *ast.File, Name returns +// the filename for the current Node. +func (c *Cursor) Name() string { return c.name } + +// Index reports the index >= 0 of the current Node in the slice of Nodes that +// contains it, or a value < 0 if the current Node is not part of a slice. +// The index of the current node changes if InsertBefore is called while +// processing the current node. +func (c *Cursor) Index() int { + if c.iter != nil { + return c.iter.index + } + return -1 +} + +// field returns the current node's parent field value. +func (c *Cursor) field() reflect.Value { + return reflect.Indirect(reflect.ValueOf(c.parent)).FieldByName(c.name) +} + +// Replace replaces the current Node with n. +// The replacement node is not walked by Apply. +func (c *Cursor) Replace(n ast.Node) { + if _, ok := c.node.(*ast.File); ok { + file, ok := n.(*ast.File) + if !ok { + panic("attempt to replace *ast.File with non-*ast.File") + } + c.parent.(*ast.Package).Files[c.name] = file + return + } + + v := c.field() + if i := c.Index(); i >= 0 { + v = v.Index(i) + } + v.Set(reflect.ValueOf(n)) +} + +// Delete deletes the current Node from its containing slice. +// If the current Node is not part of a slice, Delete panics. +// As a special case, if the current node is a package file, +// Delete removes it from the package's Files map. +func (c *Cursor) Delete() { + if _, ok := c.node.(*ast.File); ok { + delete(c.parent.(*ast.Package).Files, c.name) + return + } + + i := c.Index() + if i < 0 { + panic("Delete node not contained in slice") + } + v := c.field() + l := v.Len() + reflect.Copy(v.Slice(i, l), v.Slice(i+1, l)) + v.Index(l - 1).Set(reflect.Zero(v.Type().Elem())) + v.SetLen(l - 1) + c.iter.step-- +} + +// InsertAfter inserts n after the current Node in its containing slice. +// If the current Node is not part of a slice, InsertAfter panics. +// Apply does not walk n. +func (c *Cursor) InsertAfter(n ast.Node) { + i := c.Index() + if i < 0 { + panic("InsertAfter node not contained in slice") + } + v := c.field() + v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem()))) + l := v.Len() + reflect.Copy(v.Slice(i+2, l), v.Slice(i+1, l)) + v.Index(i + 1).Set(reflect.ValueOf(n)) + c.iter.step++ +} + +// InsertBefore inserts n before the current Node in its containing slice. +// If the current Node is not part of a slice, InsertBefore panics. +// Apply will not walk n. +func (c *Cursor) InsertBefore(n ast.Node) { + i := c.Index() + if i < 0 { + panic("InsertBefore node not contained in slice") + } + v := c.field() + v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem()))) + l := v.Len() + reflect.Copy(v.Slice(i+1, l), v.Slice(i, l)) + v.Index(i).Set(reflect.ValueOf(n)) + c.iter.index++ +} + +// application carries all the shared data so we can pass it around cheaply. +type application struct { + pre, post ApplyFunc + cursor Cursor + iter iterator +} + +func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast.Node) { + // convert typed nil into untyped nil + if v := reflect.ValueOf(n); v.Kind() == reflect.Ptr && v.IsNil() { + n = nil + } + + // avoid heap-allocating a new cursor for each apply call; reuse a.cursor instead + saved := a.cursor + a.cursor.parent = parent + a.cursor.name = name + a.cursor.iter = iter + a.cursor.node = n + + if a.pre != nil && !a.pre(&a.cursor) { + a.cursor = saved + return + } + + // walk children + // (the order of the cases matches the order of the corresponding node types in go/ast) + switch n := n.(type) { + case nil: + // nothing to do + + // Comments and fields + case *ast.Comment: + // nothing to do + + case *ast.CommentGroup: + if n != nil { + a.applyList(n, "List") + } + + case *ast.Field: + a.apply(n, "Doc", nil, n.Doc) + a.applyList(n, "Names") + a.apply(n, "Type", nil, n.Type) + a.apply(n, "Tag", nil, n.Tag) + a.apply(n, "Comment", nil, n.Comment) + + case *ast.FieldList: + a.applyList(n, "List") + + // Expressions + case *ast.BadExpr, *ast.Ident, *ast.BasicLit: + // nothing to do + + case *ast.Ellipsis: + a.apply(n, "Elt", nil, n.Elt) + + case *ast.FuncLit: + a.apply(n, "Type", nil, n.Type) + a.apply(n, "Body", nil, n.Body) + + case *ast.CompositeLit: + a.apply(n, "Type", nil, n.Type) + a.applyList(n, "Elts") + + case *ast.ParenExpr: + a.apply(n, "X", nil, n.X) + + case *ast.SelectorExpr: + a.apply(n, "X", nil, n.X) + a.apply(n, "Sel", nil, n.Sel) + + case *ast.IndexExpr: + a.apply(n, "X", nil, n.X) + a.apply(n, "Index", nil, n.Index) + + case *ast.SliceExpr: + a.apply(n, "X", nil, n.X) + a.apply(n, "Low", nil, n.Low) + a.apply(n, "High", nil, n.High) + a.apply(n, "Max", nil, n.Max) + + case *ast.TypeAssertExpr: + a.apply(n, "X", nil, n.X) + a.apply(n, "Type", nil, n.Type) + + case *ast.CallExpr: + a.apply(n, "Fun", nil, n.Fun) + a.applyList(n, "Args") + + case *ast.StarExpr: + a.apply(n, "X", nil, n.X) + + case *ast.UnaryExpr: + a.apply(n, "X", nil, n.X) + + case *ast.BinaryExpr: + a.apply(n, "X", nil, n.X) + a.apply(n, "Y", nil, n.Y) + + case *ast.KeyValueExpr: + a.apply(n, "Key", nil, n.Key) + a.apply(n, "Value", nil, n.Value) + + // Types + case *ast.ArrayType: + a.apply(n, "Len", nil, n.Len) + a.apply(n, "Elt", nil, n.Elt) + + case *ast.StructType: + a.apply(n, "Fields", nil, n.Fields) + + case *ast.FuncType: + a.apply(n, "Params", nil, n.Params) + a.apply(n, "Results", nil, n.Results) + + case *ast.InterfaceType: + a.apply(n, "Methods", nil, n.Methods) + + case *ast.MapType: + a.apply(n, "Key", nil, n.Key) + a.apply(n, "Value", nil, n.Value) + + case *ast.ChanType: + a.apply(n, "Value", nil, n.Value) + + // Statements + case *ast.BadStmt: + // nothing to do + + case *ast.DeclStmt: + a.apply(n, "Decl", nil, n.Decl) + + case *ast.EmptyStmt: + // nothing to do + + case *ast.LabeledStmt: + a.apply(n, "Label", nil, n.Label) + a.apply(n, "Stmt", nil, n.Stmt) + + case *ast.ExprStmt: + a.apply(n, "X", nil, n.X) + + case *ast.SendStmt: + a.apply(n, "Chan", nil, n.Chan) + a.apply(n, "Value", nil, n.Value) + + case *ast.IncDecStmt: + a.apply(n, "X", nil, n.X) + + case *ast.AssignStmt: + a.applyList(n, "Lhs") + a.applyList(n, "Rhs") + + case *ast.GoStmt: + a.apply(n, "Call", nil, n.Call) + + case *ast.DeferStmt: + a.apply(n, "Call", nil, n.Call) + + case *ast.ReturnStmt: + a.applyList(n, "Results") + + case *ast.BranchStmt: + a.apply(n, "Label", nil, n.Label) + + case *ast.BlockStmt: + a.applyList(n, "List") + + case *ast.IfStmt: + a.apply(n, "Init", nil, n.Init) + a.apply(n, "Cond", nil, n.Cond) + a.apply(n, "Body", nil, n.Body) + a.apply(n, "Else", nil, n.Else) + + case *ast.CaseClause: + a.applyList(n, "List") + a.applyList(n, "Body") + + case *ast.SwitchStmt: + a.apply(n, "Init", nil, n.Init) + a.apply(n, "Tag", nil, n.Tag) + a.apply(n, "Body", nil, n.Body) + + case *ast.TypeSwitchStmt: + a.apply(n, "Init", nil, n.Init) + a.apply(n, "Assign", nil, n.Assign) + a.apply(n, "Body", nil, n.Body) + + case *ast.CommClause: + a.apply(n, "Comm", nil, n.Comm) + a.applyList(n, "Body") + + case *ast.SelectStmt: + a.apply(n, "Body", nil, n.Body) + + case *ast.ForStmt: + a.apply(n, "Init", nil, n.Init) + a.apply(n, "Cond", nil, n.Cond) + a.apply(n, "Post", nil, n.Post) + a.apply(n, "Body", nil, n.Body) + + case *ast.RangeStmt: + a.apply(n, "Key", nil, n.Key) + a.apply(n, "Value", nil, n.Value) + a.apply(n, "X", nil, n.X) + a.apply(n, "Body", nil, n.Body) + + // Declarations + case *ast.ImportSpec: + a.apply(n, "Doc", nil, n.Doc) + a.apply(n, "Name", nil, n.Name) + a.apply(n, "Path", nil, n.Path) + a.apply(n, "Comment", nil, n.Comment) + + case *ast.ValueSpec: + a.apply(n, "Doc", nil, n.Doc) + a.applyList(n, "Names") + a.apply(n, "Type", nil, n.Type) + a.applyList(n, "Values") + a.apply(n, "Comment", nil, n.Comment) + + case *ast.TypeSpec: + a.apply(n, "Doc", nil, n.Doc) + a.apply(n, "Name", nil, n.Name) + a.apply(n, "Type", nil, n.Type) + a.apply(n, "Comment", nil, n.Comment) + + case *ast.BadDecl: + // nothing to do + + case *ast.GenDecl: + a.apply(n, "Doc", nil, n.Doc) + a.applyList(n, "Specs") + + case *ast.FuncDecl: + a.apply(n, "Doc", nil, n.Doc) + a.apply(n, "Recv", nil, n.Recv) + a.apply(n, "Name", nil, n.Name) + a.apply(n, "Type", nil, n.Type) + a.apply(n, "Body", nil, n.Body) + + // Files and packages + case *ast.File: + a.apply(n, "Doc", nil, n.Doc) + a.apply(n, "Name", nil, n.Name) + a.applyList(n, "Decls") + // Don't walk n.Comments; they have either been walked already if + // they are Doc comments, or they can be easily walked explicitly. + + case *ast.Package: + // collect and sort names for reproducible behavior + var names []string + for name := range n.Files { + names = append(names, name) + } + sort.Strings(names) + for _, name := range names { + a.apply(n, name, nil, n.Files[name]) + } + + default: + panic(fmt.Sprintf("Apply: unexpected node type %T", n)) + } + + if a.post != nil && !a.post(&a.cursor) { + panic(abort) + } + + a.cursor = saved +} + +// An iterator controls iteration over a slice of nodes. +type iterator struct { + index, step int +} + +func (a *application) applyList(parent ast.Node, name string) { + // avoid heap-allocating a new iterator for each applyList call; reuse a.iter instead + saved := a.iter + a.iter.index = 0 + for { + // must reload parent.name each time, since cursor modifications might change it + v := reflect.Indirect(reflect.ValueOf(parent)).FieldByName(name) + if a.iter.index >= v.Len() { + break + } + + // element x may be nil in a bad AST - be cautious + var x ast.Node + if e := v.Index(a.iter.index); e.IsValid() { + x = e.Interface().(ast.Node) + } + + a.iter.step = 1 + a.apply(parent, name, &a.iter, x) + a.iter.index += a.iter.step + } + a.iter = saved +} diff --git a/vendor/golang.org/x/tools/go/ast/astutil/util.go b/vendor/golang.org/x/tools/go/ast/astutil/util.go new file mode 100644 index 00000000..76306298 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/astutil/util.go @@ -0,0 +1,14 @@ +package astutil + +import "go/ast" + +// Unparen returns e with any enclosing parentheses stripped. +func Unparen(e ast.Expr) ast.Expr { + for { + p, ok := e.(*ast.ParenExpr) + if !ok { + return e + } + e = p.X + } +} diff --git a/vendor/golang.org/x/tools/go/ast/inspector/inspector.go b/vendor/golang.org/x/tools/go/ast/inspector/inspector.go new file mode 100644 index 00000000..af5e17fe --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/inspector/inspector.go @@ -0,0 +1,186 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package inspector provides helper functions for traversal over the +// syntax trees of a package, including node filtering by type, and +// materialization of the traversal stack. +// +// During construction, the inspector does a complete traversal and +// builds a list of push/pop events and their node type. Subsequent +// method calls that request a traversal scan this list, rather than walk +// the AST, and perform type filtering using efficient bit sets. +// +// Experiments suggest the inspector's traversals are about 2.5x faster +// than ast.Inspect, but it may take around 5 traversals for this +// benefit to amortize the inspector's construction cost. +// If efficiency is the primary concern, do not use Inspector for +// one-off traversals. +package inspector + +// There are four orthogonal features in a traversal: +// 1 type filtering +// 2 pruning +// 3 postorder calls to f +// 4 stack +// Rather than offer all of them in the API, +// only a few combinations are exposed: +// - Preorder is the fastest and has fewest features, +// but is the most commonly needed traversal. +// - Nodes and WithStack both provide pruning and postorder calls, +// even though few clients need it, because supporting two versions +// is not justified. +// More combinations could be supported by expressing them as +// wrappers around a more generic traversal, but this was measured +// and found to degrade performance significantly (30%). + +import ( + "go/ast" +) + +// An Inspector provides methods for inspecting +// (traversing) the syntax trees of a package. +type Inspector struct { + events []event +} + +// New returns an Inspector for the specified syntax trees. +func New(files []*ast.File) *Inspector { + return &Inspector{traverse(files)} +} + +// An event represents a push or a pop +// of an ast.Node during a traversal. +type event struct { + node ast.Node + typ uint64 // typeOf(node) + index int // 1 + index of corresponding pop event, or 0 if this is a pop +} + +// Preorder visits all the nodes of the files supplied to New in +// depth-first order. It calls f(n) for each node n before it visits +// n's children. +// +// The types argument, if non-empty, enables type-based filtering of +// events. The function f if is called only for nodes whose type +// matches an element of the types slice. +func (in *Inspector) Preorder(types []ast.Node, f func(ast.Node)) { + // Because it avoids postorder calls to f, and the pruning + // check, Preorder is almost twice as fast as Nodes. The two + // features seem to contribute similar slowdowns (~1.4x each). + + mask := maskOf(types) + for i := 0; i < len(in.events); { + ev := in.events[i] + if ev.typ&mask != 0 { + if ev.index > 0 { + f(ev.node) + } + } + i++ + } +} + +// Nodes visits the nodes of the files supplied to New in depth-first +// order. It calls f(n, true) for each node n before it visits n's +// children. If f returns true, Nodes invokes f recursively for each +// of the non-nil children of the node, followed by a call of +// f(n, false). +// +// The types argument, if non-empty, enables type-based filtering of +// events. The function f if is called only for nodes whose type +// matches an element of the types slice. +func (in *Inspector) Nodes(types []ast.Node, f func(n ast.Node, push bool) (proceed bool)) { + mask := maskOf(types) + for i := 0; i < len(in.events); { + ev := in.events[i] + if ev.typ&mask != 0 { + if ev.index > 0 { + // push + if !f(ev.node, true) { + i = ev.index // jump to corresponding pop + 1 + continue + } + } else { + // pop + f(ev.node, false) + } + } + i++ + } +} + +// WithStack visits nodes in a similar manner to Nodes, but it +// supplies each call to f an additional argument, the current +// traversal stack. The stack's first element is the outermost node, +// an *ast.File; its last is the innermost, n. +func (in *Inspector) WithStack(types []ast.Node, f func(n ast.Node, push bool, stack []ast.Node) (proceed bool)) { + mask := maskOf(types) + var stack []ast.Node + for i := 0; i < len(in.events); { + ev := in.events[i] + if ev.index > 0 { + // push + stack = append(stack, ev.node) + if ev.typ&mask != 0 { + if !f(ev.node, true, stack) { + i = ev.index + stack = stack[:len(stack)-1] + continue + } + } + } else { + // pop + if ev.typ&mask != 0 { + f(ev.node, false, stack) + } + stack = stack[:len(stack)-1] + } + i++ + } +} + +// traverse builds the table of events representing a traversal. +func traverse(files []*ast.File) []event { + // Preallocate approximate number of events + // based on source file extent. + // This makes traverse faster by 4x (!). + var extent int + for _, f := range files { + extent += int(f.End() - f.Pos()) + } + // This estimate is based on the net/http package. + capacity := extent * 33 / 100 + if capacity > 1e6 { + capacity = 1e6 // impose some reasonable maximum + } + events := make([]event, 0, capacity) + + var stack []event + for _, f := range files { + ast.Inspect(f, func(n ast.Node) bool { + if n != nil { + // push + ev := event{ + node: n, + typ: typeOf(n), + index: len(events), // push event temporarily holds own index + } + stack = append(stack, ev) + events = append(events, ev) + } else { + // pop + ev := stack[len(stack)-1] + stack = stack[:len(stack)-1] + + events[ev.index].index = len(events) + 1 // make push refer to pop + + ev.index = 0 // turn ev into a pop event + events = append(events, ev) + } + return true + }) + } + + return events +} diff --git a/vendor/golang.org/x/tools/go/ast/inspector/typeof.go b/vendor/golang.org/x/tools/go/ast/inspector/typeof.go new file mode 100644 index 00000000..d61301b1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/inspector/typeof.go @@ -0,0 +1,216 @@ +package inspector + +// This file defines func typeOf(ast.Node) uint64. +// +// The initial map-based implementation was too slow; +// see https://go-review.googlesource.com/c/tools/+/135655/1/go/ast/inspector/inspector.go#196 + +import "go/ast" + +const ( + nArrayType = iota + nAssignStmt + nBadDecl + nBadExpr + nBadStmt + nBasicLit + nBinaryExpr + nBlockStmt + nBranchStmt + nCallExpr + nCaseClause + nChanType + nCommClause + nComment + nCommentGroup + nCompositeLit + nDeclStmt + nDeferStmt + nEllipsis + nEmptyStmt + nExprStmt + nField + nFieldList + nFile + nForStmt + nFuncDecl + nFuncLit + nFuncType + nGenDecl + nGoStmt + nIdent + nIfStmt + nImportSpec + nIncDecStmt + nIndexExpr + nInterfaceType + nKeyValueExpr + nLabeledStmt + nMapType + nPackage + nParenExpr + nRangeStmt + nReturnStmt + nSelectStmt + nSelectorExpr + nSendStmt + nSliceExpr + nStarExpr + nStructType + nSwitchStmt + nTypeAssertExpr + nTypeSpec + nTypeSwitchStmt + nUnaryExpr + nValueSpec +) + +// typeOf returns a distinct single-bit value that represents the type of n. +// +// Various implementations were benchmarked with BenchmarkNewInspector: +// GOGC=off +// - type switch 4.9-5.5ms 2.1ms +// - binary search over a sorted list of types 5.5-5.9ms 2.5ms +// - linear scan, frequency-ordered list 5.9-6.1ms 2.7ms +// - linear scan, unordered list 6.4ms 2.7ms +// - hash table 6.5ms 3.1ms +// A perfect hash seemed like overkill. +// +// The compiler's switch statement is the clear winner +// as it produces a binary tree in code, +// with constant conditions and good branch prediction. +// (Sadly it is the most verbose in source code.) +// Binary search suffered from poor branch prediction. +// +func typeOf(n ast.Node) uint64 { + // Fast path: nearly half of all nodes are identifiers. + if _, ok := n.(*ast.Ident); ok { + return 1 << nIdent + } + + // These cases include all nodes encountered by ast.Inspect. + switch n.(type) { + case *ast.ArrayType: + return 1 << nArrayType + case *ast.AssignStmt: + return 1 << nAssignStmt + case *ast.BadDecl: + return 1 << nBadDecl + case *ast.BadExpr: + return 1 << nBadExpr + case *ast.BadStmt: + return 1 << nBadStmt + case *ast.BasicLit: + return 1 << nBasicLit + case *ast.BinaryExpr: + return 1 << nBinaryExpr + case *ast.BlockStmt: + return 1 << nBlockStmt + case *ast.BranchStmt: + return 1 << nBranchStmt + case *ast.CallExpr: + return 1 << nCallExpr + case *ast.CaseClause: + return 1 << nCaseClause + case *ast.ChanType: + return 1 << nChanType + case *ast.CommClause: + return 1 << nCommClause + case *ast.Comment: + return 1 << nComment + case *ast.CommentGroup: + return 1 << nCommentGroup + case *ast.CompositeLit: + return 1 << nCompositeLit + case *ast.DeclStmt: + return 1 << nDeclStmt + case *ast.DeferStmt: + return 1 << nDeferStmt + case *ast.Ellipsis: + return 1 << nEllipsis + case *ast.EmptyStmt: + return 1 << nEmptyStmt + case *ast.ExprStmt: + return 1 << nExprStmt + case *ast.Field: + return 1 << nField + case *ast.FieldList: + return 1 << nFieldList + case *ast.File: + return 1 << nFile + case *ast.ForStmt: + return 1 << nForStmt + case *ast.FuncDecl: + return 1 << nFuncDecl + case *ast.FuncLit: + return 1 << nFuncLit + case *ast.FuncType: + return 1 << nFuncType + case *ast.GenDecl: + return 1 << nGenDecl + case *ast.GoStmt: + return 1 << nGoStmt + case *ast.Ident: + return 1 << nIdent + case *ast.IfStmt: + return 1 << nIfStmt + case *ast.ImportSpec: + return 1 << nImportSpec + case *ast.IncDecStmt: + return 1 << nIncDecStmt + case *ast.IndexExpr: + return 1 << nIndexExpr + case *ast.InterfaceType: + return 1 << nInterfaceType + case *ast.KeyValueExpr: + return 1 << nKeyValueExpr + case *ast.LabeledStmt: + return 1 << nLabeledStmt + case *ast.MapType: + return 1 << nMapType + case *ast.Package: + return 1 << nPackage + case *ast.ParenExpr: + return 1 << nParenExpr + case *ast.RangeStmt: + return 1 << nRangeStmt + case *ast.ReturnStmt: + return 1 << nReturnStmt + case *ast.SelectStmt: + return 1 << nSelectStmt + case *ast.SelectorExpr: + return 1 << nSelectorExpr + case *ast.SendStmt: + return 1 << nSendStmt + case *ast.SliceExpr: + return 1 << nSliceExpr + case *ast.StarExpr: + return 1 << nStarExpr + case *ast.StructType: + return 1 << nStructType + case *ast.SwitchStmt: + return 1 << nSwitchStmt + case *ast.TypeAssertExpr: + return 1 << nTypeAssertExpr + case *ast.TypeSpec: + return 1 << nTypeSpec + case *ast.TypeSwitchStmt: + return 1 << nTypeSwitchStmt + case *ast.UnaryExpr: + return 1 << nUnaryExpr + case *ast.ValueSpec: + return 1 << nValueSpec + } + return 0 +} + +func maskOf(nodes []ast.Node) uint64 { + if nodes == nil { + return 1<<64 - 1 // match all node types + } + var mask uint64 + for _, n := range nodes { + mask |= typeOf(n) + } + return mask +} diff --git a/vendor/golang.org/x/tools/go/buildutil/allpackages.go b/vendor/golang.org/x/tools/go/buildutil/allpackages.go new file mode 100644 index 00000000..c0cb03e7 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/allpackages.go @@ -0,0 +1,198 @@ +// 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 buildutil provides utilities related to the go/build +// package in the standard library. +// +// All I/O is done via the build.Context file system interface, which must +// be concurrency-safe. +package buildutil // import "golang.org/x/tools/go/buildutil" + +import ( + "go/build" + "os" + "path/filepath" + "sort" + "strings" + "sync" +) + +// AllPackages returns the package path of each Go package in any source +// directory of the specified build context (e.g. $GOROOT or an element +// of $GOPATH). Errors are ignored. The results are sorted. +// All package paths are canonical, and thus may contain "/vendor/". +// +// The result may include import paths for directories that contain no +// *.go files, such as "archive" (in $GOROOT/src). +// +// All I/O is done via the build.Context file system interface, +// which must be concurrency-safe. +// +func AllPackages(ctxt *build.Context) []string { + var list []string + ForEachPackage(ctxt, func(pkg string, _ error) { + list = append(list, pkg) + }) + sort.Strings(list) + return list +} + +// ForEachPackage calls the found function with the package path of +// each Go package it finds in any source directory of the specified +// build context (e.g. $GOROOT or an element of $GOPATH). +// All package paths are canonical, and thus may contain "/vendor/". +// +// If the package directory exists but could not be read, the second +// argument to the found function provides the error. +// +// All I/O is done via the build.Context file system interface, +// which must be concurrency-safe. +// +func ForEachPackage(ctxt *build.Context, found func(importPath string, err error)) { + ch := make(chan item) + + var wg sync.WaitGroup + for _, root := range ctxt.SrcDirs() { + root := root + wg.Add(1) + go func() { + allPackages(ctxt, root, ch) + wg.Done() + }() + } + go func() { + wg.Wait() + close(ch) + }() + + // All calls to found occur in the caller's goroutine. + for i := range ch { + found(i.importPath, i.err) + } +} + +type item struct { + importPath string + err error // (optional) +} + +// We use a process-wide counting semaphore to limit +// the number of parallel calls to ReadDir. +var ioLimit = make(chan bool, 20) + +func allPackages(ctxt *build.Context, root string, ch chan<- item) { + root = filepath.Clean(root) + string(os.PathSeparator) + + var wg sync.WaitGroup + + var walkDir func(dir string) + walkDir = func(dir string) { + // Avoid .foo, _foo, and testdata directory trees. + base := filepath.Base(dir) + if base == "" || base[0] == '.' || base[0] == '_' || base == "testdata" { + return + } + + pkg := filepath.ToSlash(strings.TrimPrefix(dir, root)) + + // Prune search if we encounter any of these import paths. + switch pkg { + case "builtin": + return + } + + ioLimit <- true + files, err := ReadDir(ctxt, dir) + <-ioLimit + if pkg != "" || err != nil { + ch <- item{pkg, err} + } + for _, fi := range files { + fi := fi + if fi.IsDir() { + wg.Add(1) + go func() { + walkDir(filepath.Join(dir, fi.Name())) + wg.Done() + }() + } + } + } + + walkDir(root) + wg.Wait() +} + +// ExpandPatterns returns the set of packages matched by patterns, +// which may have the following forms: +// +// golang.org/x/tools/cmd/guru # a single package +// golang.org/x/tools/... # all packages beneath dir +// ... # the entire workspace. +// +// Order is significant: a pattern preceded by '-' removes matching +// packages from the set. For example, these patterns match all encoding +// packages except encoding/xml: +// +// encoding/... -encoding/xml +// +// A trailing slash in a pattern is ignored. (Path components of Go +// package names are separated by slash, not the platform's path separator.) +// +func ExpandPatterns(ctxt *build.Context, patterns []string) map[string]bool { + // TODO(adonovan): support other features of 'go list': + // - "std"/"cmd"/"all" meta-packages + // - "..." not at the end of a pattern + // - relative patterns using "./" or "../" prefix + + pkgs := make(map[string]bool) + doPkg := func(pkg string, neg bool) { + if neg { + delete(pkgs, pkg) + } else { + pkgs[pkg] = true + } + } + + // Scan entire workspace if wildcards are present. + // TODO(adonovan): opt: scan only the necessary subtrees of the workspace. + var all []string + for _, arg := range patterns { + if strings.HasSuffix(arg, "...") { + all = AllPackages(ctxt) + break + } + } + + for _, arg := range patterns { + if arg == "" { + continue + } + + neg := arg[0] == '-' + if neg { + arg = arg[1:] + } + + if arg == "..." { + // ... matches all packages + for _, pkg := range all { + doPkg(pkg, neg) + } + } else if dir := strings.TrimSuffix(arg, "/..."); dir != arg { + // dir/... matches all packages beneath dir + for _, pkg := range all { + if strings.HasPrefix(pkg, dir) && + (len(pkg) == len(dir) || pkg[len(dir)] == '/') { + doPkg(pkg, neg) + } + } + } else { + // single package + doPkg(strings.TrimSuffix(arg, "/"), neg) + } + } + + return pkgs +} diff --git a/vendor/golang.org/x/tools/go/buildutil/fakecontext.go b/vendor/golang.org/x/tools/go/buildutil/fakecontext.go new file mode 100644 index 00000000..8b7f0667 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/fakecontext.go @@ -0,0 +1,109 @@ +package buildutil + +import ( + "fmt" + "go/build" + "io" + "io/ioutil" + "os" + "path" + "path/filepath" + "sort" + "strings" + "time" +) + +// FakeContext returns a build.Context for the fake file tree specified +// by pkgs, which maps package import paths to a mapping from file base +// names to contents. +// +// The fake Context has a GOROOT of "/go" and no GOPATH, and overrides +// the necessary file access methods to read from memory instead of the +// real file system. +// +// Unlike a real file tree, the fake one has only two levels---packages +// and files---so ReadDir("/go/src/") returns all packages under +// /go/src/ including, for instance, "math" and "math/big". +// ReadDir("/go/src/math/big") would return all the files in the +// "math/big" package. +// +func FakeContext(pkgs map[string]map[string]string) *build.Context { + clean := func(filename string) string { + f := path.Clean(filepath.ToSlash(filename)) + // Removing "/go/src" while respecting segment + // boundaries has this unfortunate corner case: + if f == "/go/src" { + return "" + } + return strings.TrimPrefix(f, "/go/src/") + } + + ctxt := build.Default // copy + ctxt.GOROOT = "/go" + ctxt.GOPATH = "" + ctxt.Compiler = "gc" + ctxt.IsDir = func(dir string) bool { + dir = clean(dir) + if dir == "" { + return true // needed by (*build.Context).SrcDirs + } + return pkgs[dir] != nil + } + ctxt.ReadDir = func(dir string) ([]os.FileInfo, error) { + dir = clean(dir) + var fis []os.FileInfo + if dir == "" { + // enumerate packages + for importPath := range pkgs { + fis = append(fis, fakeDirInfo(importPath)) + } + } else { + // enumerate files of package + for basename := range pkgs[dir] { + fis = append(fis, fakeFileInfo(basename)) + } + } + sort.Sort(byName(fis)) + return fis, nil + } + ctxt.OpenFile = func(filename string) (io.ReadCloser, error) { + filename = clean(filename) + dir, base := path.Split(filename) + content, ok := pkgs[path.Clean(dir)][base] + if !ok { + return nil, fmt.Errorf("file not found: %s", filename) + } + return ioutil.NopCloser(strings.NewReader(content)), nil + } + ctxt.IsAbsPath = func(path string) bool { + path = filepath.ToSlash(path) + // Don't rely on the default (filepath.Path) since on + // Windows, it reports virtual paths as non-absolute. + return strings.HasPrefix(path, "/") + } + return &ctxt +} + +type byName []os.FileInfo + +func (s byName) Len() int { return len(s) } +func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() } + +type fakeFileInfo string + +func (fi fakeFileInfo) Name() string { return string(fi) } +func (fakeFileInfo) Sys() interface{} { return nil } +func (fakeFileInfo) ModTime() time.Time { return time.Time{} } +func (fakeFileInfo) IsDir() bool { return false } +func (fakeFileInfo) Size() int64 { return 0 } +func (fakeFileInfo) Mode() os.FileMode { return 0644 } + +type fakeDirInfo string + +func (fd fakeDirInfo) Name() string { return string(fd) } +func (fakeDirInfo) Sys() interface{} { return nil } +func (fakeDirInfo) ModTime() time.Time { return time.Time{} } +func (fakeDirInfo) IsDir() bool { return true } +func (fakeDirInfo) Size() int64 { return 0 } +func (fakeDirInfo) Mode() os.FileMode { return 0755 } diff --git a/vendor/golang.org/x/tools/go/buildutil/overlay.go b/vendor/golang.org/x/tools/go/buildutil/overlay.go new file mode 100644 index 00000000..8e239086 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/overlay.go @@ -0,0 +1,103 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package buildutil + +import ( + "bufio" + "bytes" + "fmt" + "go/build" + "io" + "io/ioutil" + "path/filepath" + "strconv" + "strings" +) + +// OverlayContext overlays a build.Context with additional files from +// a map. Files in the map take precedence over other files. +// +// In addition to plain string comparison, two file names are +// considered equal if their base names match and their directory +// components point at the same directory on the file system. That is, +// symbolic links are followed for directories, but not files. +// +// A common use case for OverlayContext is to allow editors to pass in +// a set of unsaved, modified files. +// +// Currently, only the Context.OpenFile function will respect the +// overlay. This may change in the future. +func OverlayContext(orig *build.Context, overlay map[string][]byte) *build.Context { + // TODO(dominikh): Implement IsDir, HasSubdir and ReadDir + + rc := func(data []byte) (io.ReadCloser, error) { + return ioutil.NopCloser(bytes.NewBuffer(data)), nil + } + + copy := *orig // make a copy + ctxt := © + ctxt.OpenFile = func(path string) (io.ReadCloser, error) { + // Fast path: names match exactly. + if content, ok := overlay[path]; ok { + return rc(content) + } + + // Slow path: check for same file under a different + // alias, perhaps due to a symbolic link. + for filename, content := range overlay { + if sameFile(path, filename) { + return rc(content) + } + } + + return OpenFile(orig, path) + } + return ctxt +} + +// ParseOverlayArchive parses an archive containing Go files and their +// contents. The result is intended to be used with OverlayContext. +// +// +// Archive format +// +// The archive consists of a series of files. Each file consists of a +// name, a decimal file size and the file contents, separated by +// newlines. No newline follows after the file contents. +func ParseOverlayArchive(archive io.Reader) (map[string][]byte, error) { + overlay := make(map[string][]byte) + r := bufio.NewReader(archive) + for { + // Read file name. + filename, err := r.ReadString('\n') + if err != nil { + if err == io.EOF { + break // OK + } + return nil, fmt.Errorf("reading archive file name: %v", err) + } + filename = filepath.Clean(strings.TrimSpace(filename)) + + // Read file size. + sz, err := r.ReadString('\n') + if err != nil { + return nil, fmt.Errorf("reading size of archive file %s: %v", filename, err) + } + sz = strings.TrimSpace(sz) + size, err := strconv.ParseUint(sz, 10, 32) + if err != nil { + return nil, fmt.Errorf("parsing size of archive file %s: %v", filename, err) + } + + // Read file content. + content := make([]byte, size) + if _, err := io.ReadFull(r, content); err != nil { + return nil, fmt.Errorf("reading archive file %s: %v", filename, err) + } + overlay[filename] = content + } + + return overlay, nil +} diff --git a/vendor/golang.org/x/tools/go/buildutil/tags.go b/vendor/golang.org/x/tools/go/buildutil/tags.go new file mode 100644 index 00000000..486606f3 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/tags.go @@ -0,0 +1,75 @@ +package buildutil + +// This logic was copied from stringsFlag from $GOROOT/src/cmd/go/build.go. + +import "fmt" + +const TagsFlagDoc = "a list of `build tags` to consider satisfied during the build. " + + "For more information about build tags, see the description of " + + "build constraints in the documentation for the go/build package" + +// TagsFlag is an implementation of the flag.Value and flag.Getter interfaces that parses +// a flag value in the same manner as go build's -tags flag and +// populates a []string slice. +// +// See $GOROOT/src/go/build/doc.go for description of build tags. +// See $GOROOT/src/cmd/go/doc.go for description of 'go build -tags' flag. +// +// Example: +// flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) +type TagsFlag []string + +func (v *TagsFlag) Set(s string) error { + var err error + *v, err = splitQuotedFields(s) + if *v == nil { + *v = []string{} + } + return err +} + +func (v *TagsFlag) Get() interface{} { return *v } + +func splitQuotedFields(s string) ([]string, error) { + // Split fields allowing '' or "" around elements. + // Quotes further inside the string do not count. + var f []string + for len(s) > 0 { + for len(s) > 0 && isSpaceByte(s[0]) { + s = s[1:] + } + if len(s) == 0 { + break + } + // Accepted quoted string. No unescaping inside. + if s[0] == '"' || s[0] == '\'' { + quote := s[0] + s = s[1:] + i := 0 + for i < len(s) && s[i] != quote { + i++ + } + if i >= len(s) { + return nil, fmt.Errorf("unterminated %c string", quote) + } + f = append(f, s[:i]) + s = s[i+1:] + continue + } + i := 0 + for i < len(s) && !isSpaceByte(s[i]) { + i++ + } + f = append(f, s[:i]) + s = s[i:] + } + return f, nil +} + +func (v *TagsFlag) String() string { + return "" +} + +func isSpaceByte(c byte) bool { + return c == ' ' || c == '\t' || c == '\n' || c == '\r' +} diff --git a/vendor/golang.org/x/tools/go/buildutil/util.go b/vendor/golang.org/x/tools/go/buildutil/util.go new file mode 100644 index 00000000..fc923d7a --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/util.go @@ -0,0 +1,212 @@ +// 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 buildutil + +import ( + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "io" + "io/ioutil" + "os" + "path" + "path/filepath" + "strings" +) + +// ParseFile behaves like parser.ParseFile, +// but uses the build context's file system interface, if any. +// +// If file is not absolute (as defined by IsAbsPath), the (dir, file) +// components are joined using JoinPath; dir must be absolute. +// +// The displayPath function, if provided, is used to transform the +// filename that will be attached to the ASTs. +// +// TODO(adonovan): call this from go/loader.parseFiles when the tree thaws. +// +func ParseFile(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, file string, mode parser.Mode) (*ast.File, error) { + if !IsAbsPath(ctxt, file) { + file = JoinPath(ctxt, dir, file) + } + rd, err := OpenFile(ctxt, file) + if err != nil { + return nil, err + } + defer rd.Close() // ignore error + if displayPath != nil { + file = displayPath(file) + } + return parser.ParseFile(fset, file, rd, mode) +} + +// ContainingPackage returns the package containing filename. +// +// If filename is not absolute, it is interpreted relative to working directory dir. +// All I/O is via the build context's file system interface, if any. +// +// The '...Files []string' fields of the resulting build.Package are not +// populated (build.FindOnly mode). +// +func ContainingPackage(ctxt *build.Context, dir, filename string) (*build.Package, error) { + if !IsAbsPath(ctxt, filename) { + filename = JoinPath(ctxt, dir, filename) + } + + // We must not assume the file tree uses + // "/" always, + // `\` always, + // or os.PathSeparator (which varies by platform), + // but to make any progress, we are forced to assume that + // paths will not use `\` unless the PathSeparator + // is also `\`, thus we can rely on filepath.ToSlash for some sanity. + + dirSlash := path.Dir(filepath.ToSlash(filename)) + "/" + + // We assume that no source root (GOPATH[i] or GOROOT) contains any other. + for _, srcdir := range ctxt.SrcDirs() { + srcdirSlash := filepath.ToSlash(srcdir) + "/" + if importPath, ok := HasSubdir(ctxt, srcdirSlash, dirSlash); ok { + return ctxt.Import(importPath, dir, build.FindOnly) + } + } + + return nil, fmt.Errorf("can't find package containing %s", filename) +} + +// -- Effective methods of file system interface ------------------------- + +// (go/build.Context defines these as methods, but does not export them.) + +// hasSubdir calls ctxt.HasSubdir (if not nil) or else uses +// the local file system to answer the question. +func HasSubdir(ctxt *build.Context, root, dir string) (rel string, ok bool) { + if f := ctxt.HasSubdir; f != nil { + return f(root, dir) + } + + // Try using paths we received. + if rel, ok = hasSubdir(root, dir); ok { + return + } + + // Try expanding symlinks and comparing + // expanded against unexpanded and + // expanded against expanded. + rootSym, _ := filepath.EvalSymlinks(root) + dirSym, _ := filepath.EvalSymlinks(dir) + + if rel, ok = hasSubdir(rootSym, dir); ok { + return + } + if rel, ok = hasSubdir(root, dirSym); ok { + return + } + return hasSubdir(rootSym, dirSym) +} + +func hasSubdir(root, dir string) (rel string, ok bool) { + const sep = string(filepath.Separator) + root = filepath.Clean(root) + if !strings.HasSuffix(root, sep) { + root += sep + } + + dir = filepath.Clean(dir) + if !strings.HasPrefix(dir, root) { + return "", false + } + + return filepath.ToSlash(dir[len(root):]), true +} + +// FileExists returns true if the specified file exists, +// using the build context's file system interface. +func FileExists(ctxt *build.Context, path string) bool { + if ctxt.OpenFile != nil { + r, err := ctxt.OpenFile(path) + if err != nil { + return false + } + r.Close() // ignore error + return true + } + _, err := os.Stat(path) + return err == nil +} + +// OpenFile behaves like os.Open, +// but uses the build context's file system interface, if any. +func OpenFile(ctxt *build.Context, path string) (io.ReadCloser, error) { + if ctxt.OpenFile != nil { + return ctxt.OpenFile(path) + } + return os.Open(path) +} + +// IsAbsPath behaves like filepath.IsAbs, +// but uses the build context's file system interface, if any. +func IsAbsPath(ctxt *build.Context, path string) bool { + if ctxt.IsAbsPath != nil { + return ctxt.IsAbsPath(path) + } + return filepath.IsAbs(path) +} + +// JoinPath behaves like filepath.Join, +// but uses the build context's file system interface, if any. +func JoinPath(ctxt *build.Context, path ...string) string { + if ctxt.JoinPath != nil { + return ctxt.JoinPath(path...) + } + return filepath.Join(path...) +} + +// IsDir behaves like os.Stat plus IsDir, +// but uses the build context's file system interface, if any. +func IsDir(ctxt *build.Context, path string) bool { + if ctxt.IsDir != nil { + return ctxt.IsDir(path) + } + fi, err := os.Stat(path) + return err == nil && fi.IsDir() +} + +// ReadDir behaves like ioutil.ReadDir, +// but uses the build context's file system interface, if any. +func ReadDir(ctxt *build.Context, path string) ([]os.FileInfo, error) { + if ctxt.ReadDir != nil { + return ctxt.ReadDir(path) + } + return ioutil.ReadDir(path) +} + +// SplitPathList behaves like filepath.SplitList, +// but uses the build context's file system interface, if any. +func SplitPathList(ctxt *build.Context, s string) []string { + if ctxt.SplitPathList != nil { + return ctxt.SplitPathList(s) + } + return filepath.SplitList(s) +} + +// sameFile returns true if x and y have the same basename and denote +// the same file. +// +func sameFile(x, y string) bool { + if path.Clean(x) == path.Clean(y) { + return true + } + if filepath.Base(x) == filepath.Base(y) { // (optimisation) + if xi, err := os.Stat(x); err == nil { + if yi, err := os.Stat(y); err == nil { + return os.SameFile(xi, yi) + } + } + } + return false +} diff --git a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go new file mode 100644 index 00000000..f8363d8f --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go @@ -0,0 +1,109 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package gcexportdata provides functions for locating, reading, and +// writing export data files containing type information produced by the +// gc compiler. This package supports go1.7 export data format and all +// later versions. +// +// Although it might seem convenient for this package to live alongside +// go/types in the standard library, this would cause version skew +// problems for developer tools that use it, since they must be able to +// consume the outputs of the gc compiler both before and after a Go +// update such as from Go 1.7 to Go 1.8. Because this package lives in +// golang.org/x/tools, sites can update their version of this repo some +// time before the Go 1.8 release and rebuild and redeploy their +// developer tools, which will then be able to consume both Go 1.7 and +// Go 1.8 export data files, so they will work before and after the +// Go update. (See discussion at https://golang.org/issue/15651.) +// +package gcexportdata // import "golang.org/x/tools/go/gcexportdata" + +import ( + "bufio" + "bytes" + "fmt" + "go/token" + "go/types" + "io" + "io/ioutil" + + "golang.org/x/tools/go/internal/gcimporter" +) + +// Find returns the name of an object (.o) or archive (.a) file +// containing type information for the specified import path, +// using the workspace layout conventions of go/build. +// If no file was found, an empty filename is returned. +// +// A relative srcDir is interpreted relative to the current working directory. +// +// Find also returns the package's resolved (canonical) import path, +// reflecting the effects of srcDir and vendoring on importPath. +func Find(importPath, srcDir string) (filename, path string) { + return gcimporter.FindPkg(importPath, srcDir) +} + +// NewReader returns a reader for the export data section of an object +// (.o) or archive (.a) file read from r. The new reader may provide +// additional trailing data beyond the end of the export data. +func NewReader(r io.Reader) (io.Reader, error) { + buf := bufio.NewReader(r) + _, err := gcimporter.FindExportData(buf) + // If we ever switch to a zip-like archive format with the ToC + // at the end, we can return the correct portion of export data, + // but for now we must return the entire rest of the file. + return buf, err +} + +// Read reads export data from in, decodes it, and returns type +// information for the package. +// The package name is specified by path. +// File position information is added to fset. +// +// Read may inspect and add to the imports map to ensure that references +// within the export data to other packages are consistent. The caller +// must ensure that imports[path] does not exist, or exists but is +// incomplete (see types.Package.Complete), and Read inserts the +// resulting package into this map entry. +// +// On return, the state of the reader is undefined. +func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package, path string) (*types.Package, error) { + data, err := ioutil.ReadAll(in) + if err != nil { + return nil, fmt.Errorf("reading export data for %q: %v", path, err) + } + + if bytes.HasPrefix(data, []byte("!")) { + return nil, fmt.Errorf("can't read export data for %q directly from an archive file (call gcexportdata.NewReader first to extract export data)", path) + } + + // The App Engine Go runtime v1.6 uses the old export data format. + // TODO(adonovan): delete once v1.7 has been around for a while. + if bytes.HasPrefix(data, []byte("package ")) { + return gcimporter.ImportData(imports, path, path, bytes.NewReader(data)) + } + + // The indexed export format starts with an 'i'; the older + // binary export format starts with a 'c', 'd', or 'v' + // (from "version"). Select appropriate importer. + if len(data) > 0 && data[0] == 'i' { + _, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path) + return pkg, err + } + + _, pkg, err := gcimporter.BImportData(fset, imports, data, path) + return pkg, err +} + +// Write writes encoded type information for the specified package to out. +// The FileSet provides file position information for named objects. +func Write(out io.Writer, fset *token.FileSet, pkg *types.Package) error { + b, err := gcimporter.IExportData(fset, pkg) + if err != nil { + return err + } + _, err = out.Write(b) + return err +} diff --git a/vendor/golang.org/x/tools/go/gcexportdata/importer.go b/vendor/golang.org/x/tools/go/gcexportdata/importer.go new file mode 100644 index 00000000..efe221e7 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcexportdata/importer.go @@ -0,0 +1,73 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package gcexportdata + +import ( + "fmt" + "go/token" + "go/types" + "os" +) + +// NewImporter returns a new instance of the types.Importer interface +// that reads type information from export data files written by gc. +// The Importer also satisfies types.ImporterFrom. +// +// Export data files are located using "go build" workspace conventions +// and the build.Default context. +// +// Use this importer instead of go/importer.For("gc", ...) to avoid the +// version-skew problems described in the documentation of this package, +// or to control the FileSet or access the imports map populated during +// package loading. +// +func NewImporter(fset *token.FileSet, imports map[string]*types.Package) types.ImporterFrom { + return importer{fset, imports} +} + +type importer struct { + fset *token.FileSet + imports map[string]*types.Package +} + +func (imp importer) Import(importPath string) (*types.Package, error) { + return imp.ImportFrom(importPath, "", 0) +} + +func (imp importer) ImportFrom(importPath, srcDir string, mode types.ImportMode) (_ *types.Package, err error) { + filename, path := Find(importPath, srcDir) + if filename == "" { + if importPath == "unsafe" { + // Even for unsafe, call Find first in case + // the package was vendored. + return types.Unsafe, nil + } + return nil, fmt.Errorf("can't find import: %s", importPath) + } + + if pkg, ok := imp.imports[path]; ok && pkg.Complete() { + return pkg, nil // cache hit + } + + // open file + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer func() { + f.Close() + if err != nil { + // add file name to error + err = fmt.Errorf("reading export data: %s: %v", filename, err) + } + }() + + r, err := NewReader(f) + if err != nil { + return nil, err + } + + return Read(r, imp.fset, imp.imports, path) +} diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/bexport.go b/vendor/golang.org/x/tools/go/internal/gcimporter/bexport.go new file mode 100644 index 00000000..a807d0aa --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/bexport.go @@ -0,0 +1,852 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Binary package export. +// This file was derived from $GOROOT/src/cmd/compile/internal/gc/bexport.go; +// see that file for specification of the format. + +package gcimporter + +import ( + "bytes" + "encoding/binary" + "fmt" + "go/ast" + "go/constant" + "go/token" + "go/types" + "math" + "math/big" + "sort" + "strings" +) + +// If debugFormat is set, each integer and string value is preceded by a marker +// and position information in the encoding. This mechanism permits an importer +// to recognize immediately when it is out of sync. The importer recognizes this +// mode automatically (i.e., it can import export data produced with debugging +// support even if debugFormat is not set at the time of import). This mode will +// lead to massively larger export data (by a factor of 2 to 3) and should only +// be enabled during development and debugging. +// +// NOTE: This flag is the first flag to enable if importing dies because of +// (suspected) format errors, and whenever a change is made to the format. +const debugFormat = false // default: false + +// If trace is set, debugging output is printed to std out. +const trace = false // default: false + +// Current export format version. Increase with each format change. +// Note: The latest binary (non-indexed) export format is at version 6. +// This exporter is still at level 4, but it doesn't matter since +// the binary importer can handle older versions just fine. +// 6: package height (CL 105038) -- NOT IMPLEMENTED HERE +// 5: improved position encoding efficiency (issue 20080, CL 41619) -- NOT IMPLEMEMTED HERE +// 4: type name objects support type aliases, uses aliasTag +// 3: Go1.8 encoding (same as version 2, aliasTag defined but never used) +// 2: removed unused bool in ODCL export (compiler only) +// 1: header format change (more regular), export package for _ struct fields +// 0: Go1.7 encoding +const exportVersion = 4 + +// trackAllTypes enables cycle tracking for all types, not just named +// types. The existing compiler invariants assume that unnamed types +// that are not completely set up are not used, or else there are spurious +// errors. +// If disabled, only named types are tracked, possibly leading to slightly +// less efficient encoding in rare cases. It also prevents the export of +// some corner-case type declarations (but those are not handled correctly +// with with the textual export format either). +// TODO(gri) enable and remove once issues caused by it are fixed +const trackAllTypes = false + +type exporter struct { + fset *token.FileSet + out bytes.Buffer + + // object -> index maps, indexed in order of serialization + strIndex map[string]int + pkgIndex map[*types.Package]int + typIndex map[types.Type]int + + // position encoding + posInfoFormat bool + prevFile string + prevLine int + + // debugging support + written int // bytes written + indent int // for trace +} + +// internalError represents an error generated inside this package. +type internalError string + +func (e internalError) Error() string { return "gcimporter: " + string(e) } + +func internalErrorf(format string, args ...interface{}) error { + return internalError(fmt.Sprintf(format, args...)) +} + +// BExportData returns binary export data for pkg. +// If no file set is provided, position info will be missing. +func BExportData(fset *token.FileSet, pkg *types.Package) (b []byte, err error) { + defer func() { + if e := recover(); e != nil { + if ierr, ok := e.(internalError); ok { + err = ierr + return + } + // Not an internal error; panic again. + panic(e) + } + }() + + p := exporter{ + fset: fset, + strIndex: map[string]int{"": 0}, // empty string is mapped to 0 + pkgIndex: make(map[*types.Package]int), + typIndex: make(map[types.Type]int), + posInfoFormat: true, // TODO(gri) might become a flag, eventually + } + + // write version info + // The version string must start with "version %d" where %d is the version + // number. Additional debugging information may follow after a blank; that + // text is ignored by the importer. + p.rawStringln(fmt.Sprintf("version %d", exportVersion)) + var debug string + if debugFormat { + debug = "debug" + } + p.rawStringln(debug) // cannot use p.bool since it's affected by debugFormat; also want to see this clearly + p.bool(trackAllTypes) + p.bool(p.posInfoFormat) + + // --- generic export data --- + + // populate type map with predeclared "known" types + for index, typ := range predeclared() { + p.typIndex[typ] = index + } + if len(p.typIndex) != len(predeclared()) { + return nil, internalError("duplicate entries in type map?") + } + + // write package data + p.pkg(pkg, true) + if trace { + p.tracef("\n") + } + + // write objects + objcount := 0 + scope := pkg.Scope() + for _, name := range scope.Names() { + if !ast.IsExported(name) { + continue + } + if trace { + p.tracef("\n") + } + p.obj(scope.Lookup(name)) + objcount++ + } + + // indicate end of list + if trace { + p.tracef("\n") + } + p.tag(endTag) + + // for self-verification only (redundant) + p.int(objcount) + + if trace { + p.tracef("\n") + } + + // --- end of export data --- + + return p.out.Bytes(), nil +} + +func (p *exporter) pkg(pkg *types.Package, emptypath bool) { + if pkg == nil { + panic(internalError("unexpected nil pkg")) + } + + // if we saw the package before, write its index (>= 0) + if i, ok := p.pkgIndex[pkg]; ok { + p.index('P', i) + return + } + + // otherwise, remember the package, write the package tag (< 0) and package data + if trace { + p.tracef("P%d = { ", len(p.pkgIndex)) + defer p.tracef("} ") + } + p.pkgIndex[pkg] = len(p.pkgIndex) + + p.tag(packageTag) + p.string(pkg.Name()) + if emptypath { + p.string("") + } else { + p.string(pkg.Path()) + } +} + +func (p *exporter) obj(obj types.Object) { + switch obj := obj.(type) { + case *types.Const: + p.tag(constTag) + p.pos(obj) + p.qualifiedName(obj) + p.typ(obj.Type()) + p.value(obj.Val()) + + case *types.TypeName: + if obj.IsAlias() { + p.tag(aliasTag) + p.pos(obj) + p.qualifiedName(obj) + } else { + p.tag(typeTag) + } + p.typ(obj.Type()) + + case *types.Var: + p.tag(varTag) + p.pos(obj) + p.qualifiedName(obj) + p.typ(obj.Type()) + + case *types.Func: + p.tag(funcTag) + p.pos(obj) + p.qualifiedName(obj) + sig := obj.Type().(*types.Signature) + p.paramList(sig.Params(), sig.Variadic()) + p.paramList(sig.Results(), false) + + default: + panic(internalErrorf("unexpected object %v (%T)", obj, obj)) + } +} + +func (p *exporter) pos(obj types.Object) { + if !p.posInfoFormat { + return + } + + file, line := p.fileLine(obj) + if file == p.prevFile { + // common case: write line delta + // delta == 0 means different file or no line change + delta := line - p.prevLine + p.int(delta) + if delta == 0 { + p.int(-1) // -1 means no file change + } + } else { + // different file + p.int(0) + // Encode filename as length of common prefix with previous + // filename, followed by (possibly empty) suffix. Filenames + // frequently share path prefixes, so this can save a lot + // of space and make export data size less dependent on file + // path length. The suffix is unlikely to be empty because + // file names tend to end in ".go". + n := commonPrefixLen(p.prevFile, file) + p.int(n) // n >= 0 + p.string(file[n:]) // write suffix only + p.prevFile = file + p.int(line) + } + p.prevLine = line +} + +func (p *exporter) fileLine(obj types.Object) (file string, line int) { + if p.fset != nil { + pos := p.fset.Position(obj.Pos()) + file = pos.Filename + line = pos.Line + } + return +} + +func commonPrefixLen(a, b string) int { + if len(a) > len(b) { + a, b = b, a + } + // len(a) <= len(b) + i := 0 + for i < len(a) && a[i] == b[i] { + i++ + } + return i +} + +func (p *exporter) qualifiedName(obj types.Object) { + p.string(obj.Name()) + p.pkg(obj.Pkg(), false) +} + +func (p *exporter) typ(t types.Type) { + if t == nil { + panic(internalError("nil type")) + } + + // Possible optimization: Anonymous pointer types *T where + // T is a named type are common. We could canonicalize all + // such types *T to a single type PT = *T. This would lead + // to at most one *T entry in typIndex, and all future *T's + // would be encoded as the respective index directly. Would + // save 1 byte (pointerTag) per *T and reduce the typIndex + // size (at the cost of a canonicalization map). We can do + // this later, without encoding format change. + + // if we saw the type before, write its index (>= 0) + if i, ok := p.typIndex[t]; ok { + p.index('T', i) + return + } + + // otherwise, remember the type, write the type tag (< 0) and type data + if trackAllTypes { + if trace { + p.tracef("T%d = {>\n", len(p.typIndex)) + defer p.tracef("<\n} ") + } + p.typIndex[t] = len(p.typIndex) + } + + switch t := t.(type) { + case *types.Named: + if !trackAllTypes { + // if we don't track all types, track named types now + p.typIndex[t] = len(p.typIndex) + } + + p.tag(namedTag) + p.pos(t.Obj()) + p.qualifiedName(t.Obj()) + p.typ(t.Underlying()) + if !types.IsInterface(t) { + p.assocMethods(t) + } + + case *types.Array: + p.tag(arrayTag) + p.int64(t.Len()) + p.typ(t.Elem()) + + case *types.Slice: + p.tag(sliceTag) + p.typ(t.Elem()) + + case *dddSlice: + p.tag(dddTag) + p.typ(t.elem) + + case *types.Struct: + p.tag(structTag) + p.fieldList(t) + + case *types.Pointer: + p.tag(pointerTag) + p.typ(t.Elem()) + + case *types.Signature: + p.tag(signatureTag) + p.paramList(t.Params(), t.Variadic()) + p.paramList(t.Results(), false) + + case *types.Interface: + p.tag(interfaceTag) + p.iface(t) + + case *types.Map: + p.tag(mapTag) + p.typ(t.Key()) + p.typ(t.Elem()) + + case *types.Chan: + p.tag(chanTag) + p.int(int(3 - t.Dir())) // hack + p.typ(t.Elem()) + + default: + panic(internalErrorf("unexpected type %T: %s", t, t)) + } +} + +func (p *exporter) assocMethods(named *types.Named) { + // Sort methods (for determinism). + var methods []*types.Func + for i := 0; i < named.NumMethods(); i++ { + methods = append(methods, named.Method(i)) + } + sort.Sort(methodsByName(methods)) + + p.int(len(methods)) + + if trace && methods != nil { + p.tracef("associated methods {>\n") + } + + for i, m := range methods { + if trace && i > 0 { + p.tracef("\n") + } + + p.pos(m) + name := m.Name() + p.string(name) + if !exported(name) { + p.pkg(m.Pkg(), false) + } + + sig := m.Type().(*types.Signature) + p.paramList(types.NewTuple(sig.Recv()), false) + p.paramList(sig.Params(), sig.Variadic()) + p.paramList(sig.Results(), false) + p.int(0) // dummy value for go:nointerface pragma - ignored by importer + } + + if trace && methods != nil { + p.tracef("<\n} ") + } +} + +type methodsByName []*types.Func + +func (x methodsByName) Len() int { return len(x) } +func (x methodsByName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x methodsByName) Less(i, j int) bool { return x[i].Name() < x[j].Name() } + +func (p *exporter) fieldList(t *types.Struct) { + if trace && t.NumFields() > 0 { + p.tracef("fields {>\n") + defer p.tracef("<\n} ") + } + + p.int(t.NumFields()) + for i := 0; i < t.NumFields(); i++ { + if trace && i > 0 { + p.tracef("\n") + } + p.field(t.Field(i)) + p.string(t.Tag(i)) + } +} + +func (p *exporter) field(f *types.Var) { + if !f.IsField() { + panic(internalError("field expected")) + } + + p.pos(f) + p.fieldName(f) + p.typ(f.Type()) +} + +func (p *exporter) iface(t *types.Interface) { + // TODO(gri): enable importer to load embedded interfaces, + // then emit Embeddeds and ExplicitMethods separately here. + p.int(0) + + n := t.NumMethods() + if trace && n > 0 { + p.tracef("methods {>\n") + defer p.tracef("<\n} ") + } + p.int(n) + for i := 0; i < n; i++ { + if trace && i > 0 { + p.tracef("\n") + } + p.method(t.Method(i)) + } +} + +func (p *exporter) method(m *types.Func) { + sig := m.Type().(*types.Signature) + if sig.Recv() == nil { + panic(internalError("method expected")) + } + + p.pos(m) + p.string(m.Name()) + if m.Name() != "_" && !ast.IsExported(m.Name()) { + p.pkg(m.Pkg(), false) + } + + // interface method; no need to encode receiver. + p.paramList(sig.Params(), sig.Variadic()) + p.paramList(sig.Results(), false) +} + +func (p *exporter) fieldName(f *types.Var) { + name := f.Name() + + if f.Anonymous() { + // anonymous field - we distinguish between 3 cases: + // 1) field name matches base type name and is exported + // 2) field name matches base type name and is not exported + // 3) field name doesn't match base type name (alias name) + bname := basetypeName(f.Type()) + if name == bname { + if ast.IsExported(name) { + name = "" // 1) we don't need to know the field name or package + } else { + name = "?" // 2) use unexported name "?" to force package export + } + } else { + // 3) indicate alias and export name as is + // (this requires an extra "@" but this is a rare case) + p.string("@") + } + } + + p.string(name) + if name != "" && !ast.IsExported(name) { + p.pkg(f.Pkg(), false) + } +} + +func basetypeName(typ types.Type) string { + switch typ := deref(typ).(type) { + case *types.Basic: + return typ.Name() + case *types.Named: + return typ.Obj().Name() + default: + return "" // unnamed type + } +} + +func (p *exporter) paramList(params *types.Tuple, variadic bool) { + // use negative length to indicate unnamed parameters + // (look at the first parameter only since either all + // names are present or all are absent) + n := params.Len() + if n > 0 && params.At(0).Name() == "" { + n = -n + } + p.int(n) + for i := 0; i < params.Len(); i++ { + q := params.At(i) + t := q.Type() + if variadic && i == params.Len()-1 { + t = &dddSlice{t.(*types.Slice).Elem()} + } + p.typ(t) + if n > 0 { + name := q.Name() + p.string(name) + if name != "_" { + p.pkg(q.Pkg(), false) + } + } + p.string("") // no compiler-specific info + } +} + +func (p *exporter) value(x constant.Value) { + if trace { + p.tracef("= ") + } + + switch x.Kind() { + case constant.Bool: + tag := falseTag + if constant.BoolVal(x) { + tag = trueTag + } + p.tag(tag) + + case constant.Int: + if v, exact := constant.Int64Val(x); exact { + // common case: x fits into an int64 - use compact encoding + p.tag(int64Tag) + p.int64(v) + return + } + // uncommon case: large x - use float encoding + // (powers of 2 will be encoded efficiently with exponent) + p.tag(floatTag) + p.float(constant.ToFloat(x)) + + case constant.Float: + p.tag(floatTag) + p.float(x) + + case constant.Complex: + p.tag(complexTag) + p.float(constant.Real(x)) + p.float(constant.Imag(x)) + + case constant.String: + p.tag(stringTag) + p.string(constant.StringVal(x)) + + case constant.Unknown: + // package contains type errors + p.tag(unknownTag) + + default: + panic(internalErrorf("unexpected value %v (%T)", x, x)) + } +} + +func (p *exporter) float(x constant.Value) { + if x.Kind() != constant.Float { + panic(internalErrorf("unexpected constant %v, want float", x)) + } + // extract sign (there is no -0) + sign := constant.Sign(x) + if sign == 0 { + // x == 0 + p.int(0) + return + } + // x != 0 + + var f big.Float + if v, exact := constant.Float64Val(x); exact { + // float64 + f.SetFloat64(v) + } else if num, denom := constant.Num(x), constant.Denom(x); num.Kind() == constant.Int { + // TODO(gri): add big.Rat accessor to constant.Value. + r := valueToRat(num) + f.SetRat(r.Quo(r, valueToRat(denom))) + } else { + // Value too large to represent as a fraction => inaccessible. + // TODO(gri): add big.Float accessor to constant.Value. + f.SetFloat64(math.MaxFloat64) // FIXME + } + + // extract exponent such that 0.5 <= m < 1.0 + var m big.Float + exp := f.MantExp(&m) + + // extract mantissa as *big.Int + // - set exponent large enough so mant satisfies mant.IsInt() + // - get *big.Int from mant + m.SetMantExp(&m, int(m.MinPrec())) + mant, acc := m.Int(nil) + if acc != big.Exact { + panic(internalError("internal error")) + } + + p.int(sign) + p.int(exp) + p.string(string(mant.Bytes())) +} + +func valueToRat(x constant.Value) *big.Rat { + // Convert little-endian to big-endian. + // I can't believe this is necessary. + bytes := constant.Bytes(x) + for i := 0; i < len(bytes)/2; i++ { + bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i] + } + return new(big.Rat).SetInt(new(big.Int).SetBytes(bytes)) +} + +func (p *exporter) bool(b bool) bool { + if trace { + p.tracef("[") + defer p.tracef("= %v] ", b) + } + + x := 0 + if b { + x = 1 + } + p.int(x) + return b +} + +// ---------------------------------------------------------------------------- +// Low-level encoders + +func (p *exporter) index(marker byte, index int) { + if index < 0 { + panic(internalError("invalid index < 0")) + } + if debugFormat { + p.marker('t') + } + if trace { + p.tracef("%c%d ", marker, index) + } + p.rawInt64(int64(index)) +} + +func (p *exporter) tag(tag int) { + if tag >= 0 { + panic(internalError("invalid tag >= 0")) + } + if debugFormat { + p.marker('t') + } + if trace { + p.tracef("%s ", tagString[-tag]) + } + p.rawInt64(int64(tag)) +} + +func (p *exporter) int(x int) { + p.int64(int64(x)) +} + +func (p *exporter) int64(x int64) { + if debugFormat { + p.marker('i') + } + if trace { + p.tracef("%d ", x) + } + p.rawInt64(x) +} + +func (p *exporter) string(s string) { + if debugFormat { + p.marker('s') + } + if trace { + p.tracef("%q ", s) + } + // if we saw the string before, write its index (>= 0) + // (the empty string is mapped to 0) + if i, ok := p.strIndex[s]; ok { + p.rawInt64(int64(i)) + return + } + // otherwise, remember string and write its negative length and bytes + p.strIndex[s] = len(p.strIndex) + p.rawInt64(-int64(len(s))) + for i := 0; i < len(s); i++ { + p.rawByte(s[i]) + } +} + +// marker emits a marker byte and position information which makes +// it easy for a reader to detect if it is "out of sync". Used for +// debugFormat format only. +func (p *exporter) marker(m byte) { + p.rawByte(m) + // Enable this for help tracking down the location + // of an incorrect marker when running in debugFormat. + if false && trace { + p.tracef("#%d ", p.written) + } + p.rawInt64(int64(p.written)) +} + +// rawInt64 should only be used by low-level encoders. +func (p *exporter) rawInt64(x int64) { + var tmp [binary.MaxVarintLen64]byte + n := binary.PutVarint(tmp[:], x) + for i := 0; i < n; i++ { + p.rawByte(tmp[i]) + } +} + +// rawStringln should only be used to emit the initial version string. +func (p *exporter) rawStringln(s string) { + for i := 0; i < len(s); i++ { + p.rawByte(s[i]) + } + p.rawByte('\n') +} + +// rawByte is the bottleneck interface to write to p.out. +// rawByte escapes b as follows (any encoding does that +// hides '$'): +// +// '$' => '|' 'S' +// '|' => '|' '|' +// +// Necessary so other tools can find the end of the +// export data by searching for "$$". +// rawByte should only be used by low-level encoders. +func (p *exporter) rawByte(b byte) { + switch b { + case '$': + // write '$' as '|' 'S' + b = 'S' + fallthrough + case '|': + // write '|' as '|' '|' + p.out.WriteByte('|') + p.written++ + } + p.out.WriteByte(b) + p.written++ +} + +// tracef is like fmt.Printf but it rewrites the format string +// to take care of indentation. +func (p *exporter) tracef(format string, args ...interface{}) { + if strings.ContainsAny(format, "<>\n") { + var buf bytes.Buffer + for i := 0; i < len(format); i++ { + // no need to deal with runes + ch := format[i] + switch ch { + case '>': + p.indent++ + continue + case '<': + p.indent-- + continue + } + buf.WriteByte(ch) + if ch == '\n' { + for j := p.indent; j > 0; j-- { + buf.WriteString(". ") + } + } + } + format = buf.String() + } + fmt.Printf(format, args...) +} + +// Debugging support. +// (tagString is only used when tracing is enabled) +var tagString = [...]string{ + // Packages + -packageTag: "package", + + // Types + -namedTag: "named type", + -arrayTag: "array", + -sliceTag: "slice", + -dddTag: "ddd", + -structTag: "struct", + -pointerTag: "pointer", + -signatureTag: "signature", + -interfaceTag: "interface", + -mapTag: "map", + -chanTag: "chan", + + // Values + -falseTag: "false", + -trueTag: "true", + -int64Tag: "int64", + -floatTag: "float", + -fractionTag: "fraction", + -complexTag: "complex", + -stringTag: "string", + -unknownTag: "unknown", + + // Type aliases + -aliasTag: "alias", +} diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/bimport.go b/vendor/golang.org/x/tools/go/internal/gcimporter/bimport.go new file mode 100644 index 00000000..e9f73d14 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/bimport.go @@ -0,0 +1,1039 @@ +// 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. + +// This file is a copy of $GOROOT/src/go/internal/gcimporter/bimport.go. + +package gcimporter + +import ( + "encoding/binary" + "fmt" + "go/constant" + "go/token" + "go/types" + "sort" + "strconv" + "strings" + "sync" + "unicode" + "unicode/utf8" +) + +type importer struct { + imports map[string]*types.Package + data []byte + importpath string + buf []byte // for reading strings + version int // export format version + + // object lists + strList []string // in order of appearance + pathList []string // in order of appearance + pkgList []*types.Package // in order of appearance + typList []types.Type // in order of appearance + interfaceList []*types.Interface // for delayed completion only + trackAllTypes bool + + // position encoding + posInfoFormat bool + prevFile string + prevLine int + fake fakeFileSet + + // debugging support + debugFormat bool + read int // bytes read +} + +// BImportData imports a package from the serialized package data +// and returns the number of bytes consumed and a reference to the package. +// If the export data version is not recognized or the format is otherwise +// compromised, an error is returned. +func BImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) { + // catch panics and return them as errors + const currentVersion = 6 + version := -1 // unknown version + defer func() { + if e := recover(); e != nil { + // Return a (possibly nil or incomplete) package unchanged (see #16088). + if version > currentVersion { + err = fmt.Errorf("cannot import %q (%v), export data is newer version - update tool", path, e) + } else { + err = fmt.Errorf("cannot import %q (%v), possibly version skew - reinstall package", path, e) + } + } + }() + + p := importer{ + imports: imports, + data: data, + importpath: path, + version: version, + strList: []string{""}, // empty string is mapped to 0 + pathList: []string{""}, // empty string is mapped to 0 + fake: fakeFileSet{ + fset: fset, + files: make(map[string]*token.File), + }, + } + + // read version info + var versionstr string + if b := p.rawByte(); b == 'c' || b == 'd' { + // Go1.7 encoding; first byte encodes low-level + // encoding format (compact vs debug). + // For backward-compatibility only (avoid problems with + // old installed packages). Newly compiled packages use + // the extensible format string. + // TODO(gri) Remove this support eventually; after Go1.8. + if b == 'd' { + p.debugFormat = true + } + p.trackAllTypes = p.rawByte() == 'a' + p.posInfoFormat = p.int() != 0 + versionstr = p.string() + if versionstr == "v1" { + version = 0 + } + } else { + // Go1.8 extensible encoding + // read version string and extract version number (ignore anything after the version number) + versionstr = p.rawStringln(b) + if s := strings.SplitN(versionstr, " ", 3); len(s) >= 2 && s[0] == "version" { + if v, err := strconv.Atoi(s[1]); err == nil && v > 0 { + version = v + } + } + } + p.version = version + + // read version specific flags - extend as necessary + switch p.version { + // case currentVersion: + // ... + // fallthrough + case currentVersion, 5, 4, 3, 2, 1: + p.debugFormat = p.rawStringln(p.rawByte()) == "debug" + p.trackAllTypes = p.int() != 0 + p.posInfoFormat = p.int() != 0 + case 0: + // Go1.7 encoding format - nothing to do here + default: + errorf("unknown bexport format version %d (%q)", p.version, versionstr) + } + + // --- generic export data --- + + // populate typList with predeclared "known" types + p.typList = append(p.typList, predeclared()...) + + // read package data + pkg = p.pkg() + + // read objects of phase 1 only (see cmd/compile/internal/gc/bexport.go) + objcount := 0 + for { + tag := p.tagOrIndex() + if tag == endTag { + break + } + p.obj(tag) + objcount++ + } + + // self-verification + if count := p.int(); count != objcount { + errorf("got %d objects; want %d", objcount, count) + } + + // ignore compiler-specific import data + + // complete interfaces + // TODO(gri) re-investigate if we still need to do this in a delayed fashion + for _, typ := range p.interfaceList { + typ.Complete() + } + + // record all referenced packages as imports + list := append(([]*types.Package)(nil), p.pkgList[1:]...) + sort.Sort(byPath(list)) + pkg.SetImports(list) + + // package was imported completely and without errors + pkg.MarkComplete() + + return p.read, pkg, nil +} + +func errorf(format string, args ...interface{}) { + panic(fmt.Sprintf(format, args...)) +} + +func (p *importer) pkg() *types.Package { + // if the package was seen before, i is its index (>= 0) + i := p.tagOrIndex() + if i >= 0 { + return p.pkgList[i] + } + + // otherwise, i is the package tag (< 0) + if i != packageTag { + errorf("unexpected package tag %d version %d", i, p.version) + } + + // read package data + name := p.string() + var path string + if p.version >= 5 { + path = p.path() + } else { + path = p.string() + } + if p.version >= 6 { + p.int() // package height; unused by go/types + } + + // we should never see an empty package name + if name == "" { + errorf("empty package name in import") + } + + // an empty path denotes the package we are currently importing; + // it must be the first package we see + if (path == "") != (len(p.pkgList) == 0) { + errorf("package path %q for pkg index %d", path, len(p.pkgList)) + } + + // if the package was imported before, use that one; otherwise create a new one + if path == "" { + path = p.importpath + } + pkg := p.imports[path] + if pkg == nil { + pkg = types.NewPackage(path, name) + p.imports[path] = pkg + } else if pkg.Name() != name { + errorf("conflicting names %s and %s for package %q", pkg.Name(), name, path) + } + p.pkgList = append(p.pkgList, pkg) + + return pkg +} + +// objTag returns the tag value for each object kind. +func objTag(obj types.Object) int { + switch obj.(type) { + case *types.Const: + return constTag + case *types.TypeName: + return typeTag + case *types.Var: + return varTag + case *types.Func: + return funcTag + default: + errorf("unexpected object: %v (%T)", obj, obj) // panics + panic("unreachable") + } +} + +func sameObj(a, b types.Object) bool { + // Because unnamed types are not canonicalized, we cannot simply compare types for + // (pointer) identity. + // Ideally we'd check equality of constant values as well, but this is good enough. + return objTag(a) == objTag(b) && types.Identical(a.Type(), b.Type()) +} + +func (p *importer) declare(obj types.Object) { + pkg := obj.Pkg() + if alt := pkg.Scope().Insert(obj); alt != nil { + // This can only trigger if we import a (non-type) object a second time. + // Excluding type aliases, this cannot happen because 1) we only import a package + // once; and b) we ignore compiler-specific export data which may contain + // functions whose inlined function bodies refer to other functions that + // were already imported. + // However, type aliases require reexporting the original type, so we need + // to allow it (see also the comment in cmd/compile/internal/gc/bimport.go, + // method importer.obj, switch case importing functions). + // TODO(gri) review/update this comment once the gc compiler handles type aliases. + if !sameObj(obj, alt) { + errorf("inconsistent import:\n\t%v\npreviously imported as:\n\t%v\n", obj, alt) + } + } +} + +func (p *importer) obj(tag int) { + switch tag { + case constTag: + pos := p.pos() + pkg, name := p.qualifiedName() + typ := p.typ(nil, nil) + val := p.value() + p.declare(types.NewConst(pos, pkg, name, typ, val)) + + case aliasTag: + // TODO(gri) verify type alias hookup is correct + pos := p.pos() + pkg, name := p.qualifiedName() + typ := p.typ(nil, nil) + p.declare(types.NewTypeName(pos, pkg, name, typ)) + + case typeTag: + p.typ(nil, nil) + + case varTag: + pos := p.pos() + pkg, name := p.qualifiedName() + typ := p.typ(nil, nil) + p.declare(types.NewVar(pos, pkg, name, typ)) + + case funcTag: + pos := p.pos() + pkg, name := p.qualifiedName() + params, isddd := p.paramList() + result, _ := p.paramList() + sig := types.NewSignature(nil, params, result, isddd) + p.declare(types.NewFunc(pos, pkg, name, sig)) + + default: + errorf("unexpected object tag %d", tag) + } +} + +const deltaNewFile = -64 // see cmd/compile/internal/gc/bexport.go + +func (p *importer) pos() token.Pos { + if !p.posInfoFormat { + return token.NoPos + } + + file := p.prevFile + line := p.prevLine + delta := p.int() + line += delta + if p.version >= 5 { + if delta == deltaNewFile { + if n := p.int(); n >= 0 { + // file changed + file = p.path() + line = n + } + } + } else { + if delta == 0 { + if n := p.int(); n >= 0 { + // file changed + file = p.prevFile[:n] + p.string() + line = p.int() + } + } + } + p.prevFile = file + p.prevLine = line + + return p.fake.pos(file, line, 0) +} + +// Synthesize a token.Pos +type fakeFileSet struct { + fset *token.FileSet + files map[string]*token.File +} + +func (s *fakeFileSet) pos(file string, line, column int) token.Pos { + // TODO(mdempsky): Make use of column. + + // Since we don't know the set of needed file positions, we + // reserve maxlines positions per file. + const maxlines = 64 * 1024 + f := s.files[file] + if f == nil { + f = s.fset.AddFile(file, -1, maxlines) + s.files[file] = f + // Allocate the fake linebreak indices on first use. + // TODO(adonovan): opt: save ~512KB using a more complex scheme? + fakeLinesOnce.Do(func() { + fakeLines = make([]int, maxlines) + for i := range fakeLines { + fakeLines[i] = i + } + }) + f.SetLines(fakeLines) + } + + if line > maxlines { + line = 1 + } + + // Treat the file as if it contained only newlines + // and column=1: use the line number as the offset. + return f.Pos(line - 1) +} + +var ( + fakeLines []int + fakeLinesOnce sync.Once +) + +func (p *importer) qualifiedName() (pkg *types.Package, name string) { + name = p.string() + pkg = p.pkg() + return +} + +func (p *importer) record(t types.Type) { + p.typList = append(p.typList, t) +} + +// A dddSlice is a types.Type representing ...T parameters. +// It only appears for parameter types and does not escape +// the importer. +type dddSlice struct { + elem types.Type +} + +func (t *dddSlice) Underlying() types.Type { return t } +func (t *dddSlice) String() string { return "..." + t.elem.String() } + +// parent is the package which declared the type; parent == nil means +// the package currently imported. The parent package is needed for +// exported struct fields and interface methods which don't contain +// explicit package information in the export data. +// +// A non-nil tname is used as the "owner" of the result type; i.e., +// the result type is the underlying type of tname. tname is used +// to give interface methods a named receiver type where possible. +func (p *importer) typ(parent *types.Package, tname *types.Named) types.Type { + // if the type was seen before, i is its index (>= 0) + i := p.tagOrIndex() + if i >= 0 { + return p.typList[i] + } + + // otherwise, i is the type tag (< 0) + switch i { + case namedTag: + // read type object + pos := p.pos() + parent, name := p.qualifiedName() + scope := parent.Scope() + obj := scope.Lookup(name) + + // if the object doesn't exist yet, create and insert it + if obj == nil { + obj = types.NewTypeName(pos, parent, name, nil) + scope.Insert(obj) + } + + if _, ok := obj.(*types.TypeName); !ok { + errorf("pkg = %s, name = %s => %s", parent, name, obj) + } + + // associate new named type with obj if it doesn't exist yet + t0 := types.NewNamed(obj.(*types.TypeName), nil, nil) + + // but record the existing type, if any + tname := obj.Type().(*types.Named) // tname is either t0 or the existing type + p.record(tname) + + // read underlying type + t0.SetUnderlying(p.typ(parent, t0)) + + // interfaces don't have associated methods + if types.IsInterface(t0) { + return tname + } + + // read associated methods + for i := p.int(); i > 0; i-- { + // TODO(gri) replace this with something closer to fieldName + pos := p.pos() + name := p.string() + if !exported(name) { + p.pkg() + } + + recv, _ := p.paramList() // TODO(gri) do we need a full param list for the receiver? + params, isddd := p.paramList() + result, _ := p.paramList() + p.int() // go:nointerface pragma - discarded + + sig := types.NewSignature(recv.At(0), params, result, isddd) + t0.AddMethod(types.NewFunc(pos, parent, name, sig)) + } + + return tname + + case arrayTag: + t := new(types.Array) + if p.trackAllTypes { + p.record(t) + } + + n := p.int64() + *t = *types.NewArray(p.typ(parent, nil), n) + return t + + case sliceTag: + t := new(types.Slice) + if p.trackAllTypes { + p.record(t) + } + + *t = *types.NewSlice(p.typ(parent, nil)) + return t + + case dddTag: + t := new(dddSlice) + if p.trackAllTypes { + p.record(t) + } + + t.elem = p.typ(parent, nil) + return t + + case structTag: + t := new(types.Struct) + if p.trackAllTypes { + p.record(t) + } + + *t = *types.NewStruct(p.fieldList(parent)) + return t + + case pointerTag: + t := new(types.Pointer) + if p.trackAllTypes { + p.record(t) + } + + *t = *types.NewPointer(p.typ(parent, nil)) + return t + + case signatureTag: + t := new(types.Signature) + if p.trackAllTypes { + p.record(t) + } + + params, isddd := p.paramList() + result, _ := p.paramList() + *t = *types.NewSignature(nil, params, result, isddd) + return t + + case interfaceTag: + // Create a dummy entry in the type list. This is safe because we + // cannot expect the interface type to appear in a cycle, as any + // such cycle must contain a named type which would have been + // first defined earlier. + // TODO(gri) Is this still true now that we have type aliases? + // See issue #23225. + n := len(p.typList) + if p.trackAllTypes { + p.record(nil) + } + + var embeddeds []types.Type + for n := p.int(); n > 0; n-- { + p.pos() + embeddeds = append(embeddeds, p.typ(parent, nil)) + } + + t := newInterface(p.methodList(parent, tname), embeddeds) + p.interfaceList = append(p.interfaceList, t) + if p.trackAllTypes { + p.typList[n] = t + } + return t + + case mapTag: + t := new(types.Map) + if p.trackAllTypes { + p.record(t) + } + + key := p.typ(parent, nil) + val := p.typ(parent, nil) + *t = *types.NewMap(key, val) + return t + + case chanTag: + t := new(types.Chan) + if p.trackAllTypes { + p.record(t) + } + + dir := chanDir(p.int()) + val := p.typ(parent, nil) + *t = *types.NewChan(dir, val) + return t + + default: + errorf("unexpected type tag %d", i) // panics + panic("unreachable") + } +} + +func chanDir(d int) types.ChanDir { + // tag values must match the constants in cmd/compile/internal/gc/go.go + switch d { + case 1 /* Crecv */ : + return types.RecvOnly + case 2 /* Csend */ : + return types.SendOnly + case 3 /* Cboth */ : + return types.SendRecv + default: + errorf("unexpected channel dir %d", d) + return 0 + } +} + +func (p *importer) fieldList(parent *types.Package) (fields []*types.Var, tags []string) { + if n := p.int(); n > 0 { + fields = make([]*types.Var, n) + tags = make([]string, n) + for i := range fields { + fields[i], tags[i] = p.field(parent) + } + } + return +} + +func (p *importer) field(parent *types.Package) (*types.Var, string) { + pos := p.pos() + pkg, name, alias := p.fieldName(parent) + typ := p.typ(parent, nil) + tag := p.string() + + anonymous := false + if name == "" { + // anonymous field - typ must be T or *T and T must be a type name + switch typ := deref(typ).(type) { + case *types.Basic: // basic types are named types + pkg = nil // // objects defined in Universe scope have no package + name = typ.Name() + case *types.Named: + name = typ.Obj().Name() + default: + errorf("named base type expected") + } + anonymous = true + } else if alias { + // anonymous field: we have an explicit name because it's an alias + anonymous = true + } + + return types.NewField(pos, pkg, name, typ, anonymous), tag +} + +func (p *importer) methodList(parent *types.Package, baseType *types.Named) (methods []*types.Func) { + if n := p.int(); n > 0 { + methods = make([]*types.Func, n) + for i := range methods { + methods[i] = p.method(parent, baseType) + } + } + return +} + +func (p *importer) method(parent *types.Package, baseType *types.Named) *types.Func { + pos := p.pos() + pkg, name, _ := p.fieldName(parent) + // If we don't have a baseType, use a nil receiver. + // A receiver using the actual interface type (which + // we don't know yet) will be filled in when we call + // types.Interface.Complete. + var recv *types.Var + if baseType != nil { + recv = types.NewVar(token.NoPos, parent, "", baseType) + } + params, isddd := p.paramList() + result, _ := p.paramList() + sig := types.NewSignature(recv, params, result, isddd) + return types.NewFunc(pos, pkg, name, sig) +} + +func (p *importer) fieldName(parent *types.Package) (pkg *types.Package, name string, alias bool) { + name = p.string() + pkg = parent + if pkg == nil { + // use the imported package instead + pkg = p.pkgList[0] + } + if p.version == 0 && name == "_" { + // version 0 didn't export a package for _ fields + return + } + switch name { + case "": + // 1) field name matches base type name and is exported: nothing to do + case "?": + // 2) field name matches base type name and is not exported: need package + name = "" + pkg = p.pkg() + case "@": + // 3) field name doesn't match type name (alias) + name = p.string() + alias = true + fallthrough + default: + if !exported(name) { + pkg = p.pkg() + } + } + return +} + +func (p *importer) paramList() (*types.Tuple, bool) { + n := p.int() + if n == 0 { + return nil, false + } + // negative length indicates unnamed parameters + named := true + if n < 0 { + n = -n + named = false + } + // n > 0 + params := make([]*types.Var, n) + isddd := false + for i := range params { + params[i], isddd = p.param(named) + } + return types.NewTuple(params...), isddd +} + +func (p *importer) param(named bool) (*types.Var, bool) { + t := p.typ(nil, nil) + td, isddd := t.(*dddSlice) + if isddd { + t = types.NewSlice(td.elem) + } + + var pkg *types.Package + var name string + if named { + name = p.string() + if name == "" { + errorf("expected named parameter") + } + if name != "_" { + pkg = p.pkg() + } + if i := strings.Index(name, "·"); i > 0 { + name = name[:i] // cut off gc-specific parameter numbering + } + } + + // read and discard compiler-specific info + p.string() + + return types.NewVar(token.NoPos, pkg, name, t), isddd +} + +func exported(name string) bool { + ch, _ := utf8.DecodeRuneInString(name) + return unicode.IsUpper(ch) +} + +func (p *importer) value() constant.Value { + switch tag := p.tagOrIndex(); tag { + case falseTag: + return constant.MakeBool(false) + case trueTag: + return constant.MakeBool(true) + case int64Tag: + return constant.MakeInt64(p.int64()) + case floatTag: + return p.float() + case complexTag: + re := p.float() + im := p.float() + return constant.BinaryOp(re, token.ADD, constant.MakeImag(im)) + case stringTag: + return constant.MakeString(p.string()) + case unknownTag: + return constant.MakeUnknown() + default: + errorf("unexpected value tag %d", tag) // panics + panic("unreachable") + } +} + +func (p *importer) float() constant.Value { + sign := p.int() + if sign == 0 { + return constant.MakeInt64(0) + } + + exp := p.int() + mant := []byte(p.string()) // big endian + + // remove leading 0's if any + for len(mant) > 0 && mant[0] == 0 { + mant = mant[1:] + } + + // convert to little endian + // TODO(gri) go/constant should have a more direct conversion function + // (e.g., once it supports a big.Float based implementation) + for i, j := 0, len(mant)-1; i < j; i, j = i+1, j-1 { + mant[i], mant[j] = mant[j], mant[i] + } + + // adjust exponent (constant.MakeFromBytes creates an integer value, + // but mant represents the mantissa bits such that 0.5 <= mant < 1.0) + exp -= len(mant) << 3 + if len(mant) > 0 { + for msd := mant[len(mant)-1]; msd&0x80 == 0; msd <<= 1 { + exp++ + } + } + + x := constant.MakeFromBytes(mant) + switch { + case exp < 0: + d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp)) + x = constant.BinaryOp(x, token.QUO, d) + case exp > 0: + x = constant.Shift(x, token.SHL, uint(exp)) + } + + if sign < 0 { + x = constant.UnaryOp(token.SUB, x, 0) + } + return x +} + +// ---------------------------------------------------------------------------- +// Low-level decoders + +func (p *importer) tagOrIndex() int { + if p.debugFormat { + p.marker('t') + } + + return int(p.rawInt64()) +} + +func (p *importer) int() int { + x := p.int64() + if int64(int(x)) != x { + errorf("exported integer too large") + } + return int(x) +} + +func (p *importer) int64() int64 { + if p.debugFormat { + p.marker('i') + } + + return p.rawInt64() +} + +func (p *importer) path() string { + if p.debugFormat { + p.marker('p') + } + // if the path was seen before, i is its index (>= 0) + // (the empty string is at index 0) + i := p.rawInt64() + if i >= 0 { + return p.pathList[i] + } + // otherwise, i is the negative path length (< 0) + a := make([]string, -i) + for n := range a { + a[n] = p.string() + } + s := strings.Join(a, "/") + p.pathList = append(p.pathList, s) + return s +} + +func (p *importer) string() string { + if p.debugFormat { + p.marker('s') + } + // if the string was seen before, i is its index (>= 0) + // (the empty string is at index 0) + i := p.rawInt64() + if i >= 0 { + return p.strList[i] + } + // otherwise, i is the negative string length (< 0) + if n := int(-i); n <= cap(p.buf) { + p.buf = p.buf[:n] + } else { + p.buf = make([]byte, n) + } + for i := range p.buf { + p.buf[i] = p.rawByte() + } + s := string(p.buf) + p.strList = append(p.strList, s) + return s +} + +func (p *importer) marker(want byte) { + if got := p.rawByte(); got != want { + errorf("incorrect marker: got %c; want %c (pos = %d)", got, want, p.read) + } + + pos := p.read + if n := int(p.rawInt64()); n != pos { + errorf("incorrect position: got %d; want %d", n, pos) + } +} + +// rawInt64 should only be used by low-level decoders. +func (p *importer) rawInt64() int64 { + i, err := binary.ReadVarint(p) + if err != nil { + errorf("read error: %v", err) + } + return i +} + +// rawStringln should only be used to read the initial version string. +func (p *importer) rawStringln(b byte) string { + p.buf = p.buf[:0] + for b != '\n' { + p.buf = append(p.buf, b) + b = p.rawByte() + } + return string(p.buf) +} + +// needed for binary.ReadVarint in rawInt64 +func (p *importer) ReadByte() (byte, error) { + return p.rawByte(), nil +} + +// byte is the bottleneck interface for reading p.data. +// It unescapes '|' 'S' to '$' and '|' '|' to '|'. +// rawByte should only be used by low-level decoders. +func (p *importer) rawByte() byte { + b := p.data[0] + r := 1 + if b == '|' { + b = p.data[1] + r = 2 + switch b { + case 'S': + b = '$' + case '|': + // nothing to do + default: + errorf("unexpected escape sequence in export data") + } + } + p.data = p.data[r:] + p.read += r + return b + +} + +// ---------------------------------------------------------------------------- +// Export format + +// Tags. Must be < 0. +const ( + // Objects + packageTag = -(iota + 1) + constTag + typeTag + varTag + funcTag + endTag + + // Types + namedTag + arrayTag + sliceTag + dddTag + structTag + pointerTag + signatureTag + interfaceTag + mapTag + chanTag + + // Values + falseTag + trueTag + int64Tag + floatTag + fractionTag // not used by gc + complexTag + stringTag + nilTag // only used by gc (appears in exported inlined function bodies) + unknownTag // not used by gc (only appears in packages with errors) + + // Type aliases + aliasTag +) + +var predeclOnce sync.Once +var predecl []types.Type // initialized lazily + +func predeclared() []types.Type { + predeclOnce.Do(func() { + // initialize lazily to be sure that all + // elements have been initialized before + predecl = []types.Type{ // basic types + types.Typ[types.Bool], + types.Typ[types.Int], + types.Typ[types.Int8], + types.Typ[types.Int16], + types.Typ[types.Int32], + types.Typ[types.Int64], + types.Typ[types.Uint], + types.Typ[types.Uint8], + types.Typ[types.Uint16], + types.Typ[types.Uint32], + types.Typ[types.Uint64], + types.Typ[types.Uintptr], + types.Typ[types.Float32], + types.Typ[types.Float64], + types.Typ[types.Complex64], + types.Typ[types.Complex128], + types.Typ[types.String], + + // basic type aliases + types.Universe.Lookup("byte").Type(), + types.Universe.Lookup("rune").Type(), + + // error + types.Universe.Lookup("error").Type(), + + // untyped types + types.Typ[types.UntypedBool], + types.Typ[types.UntypedInt], + types.Typ[types.UntypedRune], + types.Typ[types.UntypedFloat], + types.Typ[types.UntypedComplex], + types.Typ[types.UntypedString], + types.Typ[types.UntypedNil], + + // package unsafe + types.Typ[types.UnsafePointer], + + // invalid type + types.Typ[types.Invalid], // only appears in packages with errors + + // used internally by gc; never used by this package or in .a files + anyType{}, + } + }) + return predecl +} + +type anyType struct{} + +func (t anyType) Underlying() types.Type { return t } +func (t anyType) String() string { return "any" } diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/exportdata.go b/vendor/golang.org/x/tools/go/internal/gcimporter/exportdata.go new file mode 100644 index 00000000..f33dc561 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/exportdata.go @@ -0,0 +1,93 @@ +// 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. + +// This file is a copy of $GOROOT/src/go/internal/gcimporter/exportdata.go. + +// This file implements FindExportData. + +package gcimporter + +import ( + "bufio" + "fmt" + "io" + "strconv" + "strings" +) + +func readGopackHeader(r *bufio.Reader) (name string, size int, err error) { + // See $GOROOT/include/ar.h. + hdr := make([]byte, 16+12+6+6+8+10+2) + _, err = io.ReadFull(r, hdr) + if err != nil { + return + } + // leave for debugging + if false { + fmt.Printf("header: %s", hdr) + } + s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10])) + size, err = strconv.Atoi(s) + if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' { + err = fmt.Errorf("invalid archive header") + return + } + name = strings.TrimSpace(string(hdr[:16])) + return +} + +// FindExportData positions the reader r at the beginning of the +// export data section of an underlying GC-created object/archive +// file by reading from it. The reader must be positioned at the +// start of the file before calling this function. The hdr result +// is the string before the export data, either "$$" or "$$B". +// +func FindExportData(r *bufio.Reader) (hdr string, err error) { + // Read first line to make sure this is an object file. + line, err := r.ReadSlice('\n') + if err != nil { + err = fmt.Errorf("can't find export data (%v)", err) + return + } + + if string(line) == "!\n" { + // Archive file. Scan to __.PKGDEF. + var name string + if name, _, err = readGopackHeader(r); err != nil { + return + } + + // First entry should be __.PKGDEF. + if name != "__.PKGDEF" { + err = fmt.Errorf("go archive is missing __.PKGDEF") + return + } + + // Read first line of __.PKGDEF data, so that line + // is once again the first line of the input. + if line, err = r.ReadSlice('\n'); err != nil { + err = fmt.Errorf("can't find export data (%v)", err) + return + } + } + + // Now at __.PKGDEF in archive or still at beginning of file. + // Either way, line should begin with "go object ". + if !strings.HasPrefix(string(line), "go object ") { + err = fmt.Errorf("not a Go object file") + return + } + + // Skip over object header to export data. + // Begins after first line starting with $$. + for line[0] != '$' { + if line, err = r.ReadSlice('\n'); err != nil { + err = fmt.Errorf("can't find export data (%v)", err) + return + } + } + hdr = string(line) + + return +} diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go b/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go new file mode 100644 index 00000000..8dcd8bbb --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go @@ -0,0 +1,1078 @@ +// 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. + +// This file is a modified copy of $GOROOT/src/go/internal/gcimporter/gcimporter.go, +// but it also contains the original source-based importer code for Go1.6. +// Once we stop supporting 1.6, we can remove that code. + +// Package gcimporter provides various functions for reading +// gc-generated object files that can be used to implement the +// Importer interface defined by the Go 1.5 standard library package. +package gcimporter // import "golang.org/x/tools/go/internal/gcimporter" + +import ( + "bufio" + "errors" + "fmt" + "go/build" + "go/constant" + "go/token" + "go/types" + "io" + "io/ioutil" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "text/scanner" +) + +// debugging/development support +const debug = false + +var pkgExts = [...]string{".a", ".o"} + +// FindPkg returns the filename and unique package id for an import +// path based on package information provided by build.Import (using +// the build.Default build.Context). A relative srcDir is interpreted +// relative to the current working directory. +// If no file was found, an empty filename is returned. +// +func FindPkg(path, srcDir string) (filename, id string) { + if path == "" { + return + } + + var noext string + switch { + default: + // "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x" + // Don't require the source files to be present. + if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282 + srcDir = abs + } + bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary) + if bp.PkgObj == "" { + id = path // make sure we have an id to print in error message + return + } + noext = strings.TrimSuffix(bp.PkgObj, ".a") + id = bp.ImportPath + + case build.IsLocalImport(path): + // "./x" -> "/this/directory/x.ext", "/this/directory/x" + noext = filepath.Join(srcDir, path) + id = noext + + case filepath.IsAbs(path): + // for completeness only - go/build.Import + // does not support absolute imports + // "/x" -> "/x.ext", "/x" + noext = path + id = path + } + + if false { // for debugging + if path != id { + fmt.Printf("%s -> %s\n", path, id) + } + } + + // try extensions + for _, ext := range pkgExts { + filename = noext + ext + if f, err := os.Stat(filename); err == nil && !f.IsDir() { + return + } + } + + filename = "" // not found + return +} + +// ImportData imports a package by reading the gc-generated export data, +// adds the corresponding package object to the packages map indexed by id, +// and returns the object. +// +// The packages map must contains all packages already imported. The data +// reader position must be the beginning of the export data section. The +// filename is only used in error messages. +// +// If packages[id] contains the completely imported package, that package +// can be used directly, and there is no need to call this function (but +// there is also no harm but for extra time used). +// +func ImportData(packages map[string]*types.Package, filename, id string, data io.Reader) (pkg *types.Package, err error) { + // support for parser error handling + defer func() { + switch r := recover().(type) { + case nil: + // nothing to do + case importError: + err = r + default: + panic(r) // internal error + } + }() + + var p parser + p.init(filename, id, data, packages) + pkg = p.parseExport() + + return +} + +// Import imports a gc-generated package given its import path and srcDir, adds +// the corresponding package object to the packages map, and returns the object. +// The packages map must contain all packages already imported. +// +func Import(packages map[string]*types.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types.Package, err error) { + var rc io.ReadCloser + var filename, id string + if lookup != nil { + // With custom lookup specified, assume that caller has + // converted path to a canonical import path for use in the map. + if path == "unsafe" { + return types.Unsafe, nil + } + id = path + + // No need to re-import if the package was imported completely before. + if pkg = packages[id]; pkg != nil && pkg.Complete() { + return + } + f, err := lookup(path) + if err != nil { + return nil, err + } + rc = f + } else { + filename, id = FindPkg(path, srcDir) + if filename == "" { + if path == "unsafe" { + return types.Unsafe, nil + } + return nil, fmt.Errorf("can't find import: %q", id) + } + + // no need to re-import if the package was imported completely before + if pkg = packages[id]; pkg != nil && pkg.Complete() { + return + } + + // open file + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer func() { + if err != nil { + // add file name to error + err = fmt.Errorf("%s: %v", filename, err) + } + }() + rc = f + } + defer rc.Close() + + var hdr string + buf := bufio.NewReader(rc) + if hdr, err = FindExportData(buf); err != nil { + return + } + + switch hdr { + case "$$\n": + // Work-around if we don't have a filename; happens only if lookup != nil. + // Either way, the filename is only needed for importer error messages, so + // this is fine. + if filename == "" { + filename = path + } + return ImportData(packages, filename, id, buf) + + case "$$B\n": + var data []byte + data, err = ioutil.ReadAll(buf) + if err != nil { + break + } + + // TODO(gri): allow clients of go/importer to provide a FileSet. + // Or, define a new standard go/types/gcexportdata package. + fset := token.NewFileSet() + + // The indexed export format starts with an 'i'; the older + // binary export format starts with a 'c', 'd', or 'v' + // (from "version"). Select appropriate importer. + if len(data) > 0 && data[0] == 'i' { + _, pkg, err = IImportData(fset, packages, data[1:], id) + } else { + _, pkg, err = BImportData(fset, packages, data, id) + } + + default: + err = fmt.Errorf("unknown export data header: %q", hdr) + } + + return +} + +// ---------------------------------------------------------------------------- +// Parser + +// TODO(gri) Imported objects don't have position information. +// Ideally use the debug table line info; alternatively +// create some fake position (or the position of the +// import). That way error messages referring to imported +// objects can print meaningful information. + +// parser parses the exports inside a gc compiler-produced +// object/archive file and populates its scope with the results. +type parser struct { + scanner scanner.Scanner + tok rune // current token + lit string // literal string; only valid for Ident, Int, String tokens + id string // package id of imported package + sharedPkgs map[string]*types.Package // package id -> package object (across importer) + localPkgs map[string]*types.Package // package id -> package object (just this package) +} + +func (p *parser) init(filename, id string, src io.Reader, packages map[string]*types.Package) { + p.scanner.Init(src) + p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) } + p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanChars | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments + p.scanner.Whitespace = 1<<'\t' | 1<<' ' + p.scanner.Filename = filename // for good error messages + p.next() + p.id = id + p.sharedPkgs = packages + if debug { + // check consistency of packages map + for _, pkg := range packages { + if pkg.Name() == "" { + fmt.Printf("no package name for %s\n", pkg.Path()) + } + } + } +} + +func (p *parser) next() { + p.tok = p.scanner.Scan() + switch p.tok { + case scanner.Ident, scanner.Int, scanner.Char, scanner.String, '·': + p.lit = p.scanner.TokenText() + default: + p.lit = "" + } + if debug { + fmt.Printf("%s: %q -> %q\n", scanner.TokenString(p.tok), p.scanner.TokenText(), p.lit) + } +} + +func declTypeName(pkg *types.Package, name string) *types.TypeName { + scope := pkg.Scope() + if obj := scope.Lookup(name); obj != nil { + return obj.(*types.TypeName) + } + obj := types.NewTypeName(token.NoPos, pkg, name, nil) + // a named type may be referred to before the underlying type + // is known - set it up + types.NewNamed(obj, nil, nil) + scope.Insert(obj) + return obj +} + +// ---------------------------------------------------------------------------- +// Error handling + +// Internal errors are boxed as importErrors. +type importError struct { + pos scanner.Position + err error +} + +func (e importError) Error() string { + return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err) +} + +func (p *parser) error(err interface{}) { + if s, ok := err.(string); ok { + err = errors.New(s) + } + // panic with a runtime.Error if err is not an error + panic(importError{p.scanner.Pos(), err.(error)}) +} + +func (p *parser) errorf(format string, args ...interface{}) { + p.error(fmt.Sprintf(format, args...)) +} + +func (p *parser) expect(tok rune) string { + lit := p.lit + if p.tok != tok { + p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit) + } + p.next() + return lit +} + +func (p *parser) expectSpecial(tok string) { + sep := 'x' // not white space + i := 0 + for i < len(tok) && p.tok == rune(tok[i]) && sep > ' ' { + sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token + p.next() + i++ + } + if i < len(tok) { + p.errorf("expected %q, got %q", tok, tok[0:i]) + } +} + +func (p *parser) expectKeyword(keyword string) { + lit := p.expect(scanner.Ident) + if lit != keyword { + p.errorf("expected keyword %s, got %q", keyword, lit) + } +} + +// ---------------------------------------------------------------------------- +// Qualified and unqualified names + +// PackageId = string_lit . +// +func (p *parser) parsePackageID() string { + id, err := strconv.Unquote(p.expect(scanner.String)) + if err != nil { + p.error(err) + } + // id == "" stands for the imported package id + // (only known at time of package installation) + if id == "" { + id = p.id + } + return id +} + +// PackageName = ident . +// +func (p *parser) parsePackageName() string { + return p.expect(scanner.Ident) +} + +// dotIdentifier = ( ident | '·' ) { ident | int | '·' } . +func (p *parser) parseDotIdent() string { + ident := "" + if p.tok != scanner.Int { + sep := 'x' // not white space + for (p.tok == scanner.Ident || p.tok == scanner.Int || p.tok == '·') && sep > ' ' { + ident += p.lit + sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token + p.next() + } + } + if ident == "" { + p.expect(scanner.Ident) // use expect() for error handling + } + return ident +} + +// QualifiedName = "@" PackageId "." ( "?" | dotIdentifier ) . +// +func (p *parser) parseQualifiedName() (id, name string) { + p.expect('@') + id = p.parsePackageID() + p.expect('.') + // Per rev f280b8a485fd (10/2/2013), qualified names may be used for anonymous fields. + if p.tok == '?' { + p.next() + } else { + name = p.parseDotIdent() + } + return +} + +// getPkg returns the package for a given id. If the package is +// not found, create the package and add it to the p.localPkgs +// and p.sharedPkgs maps. name is the (expected) name of the +// package. If name == "", the package name is expected to be +// set later via an import clause in the export data. +// +// id identifies a package, usually by a canonical package path like +// "encoding/json" but possibly by a non-canonical import path like +// "./json". +// +func (p *parser) getPkg(id, name string) *types.Package { + // package unsafe is not in the packages maps - handle explicitly + if id == "unsafe" { + return types.Unsafe + } + + pkg := p.localPkgs[id] + if pkg == nil { + // first import of id from this package + pkg = p.sharedPkgs[id] + if pkg == nil { + // first import of id by this importer; + // add (possibly unnamed) pkg to shared packages + pkg = types.NewPackage(id, name) + p.sharedPkgs[id] = pkg + } + // add (possibly unnamed) pkg to local packages + if p.localPkgs == nil { + p.localPkgs = make(map[string]*types.Package) + } + p.localPkgs[id] = pkg + } else if name != "" { + // package exists already and we have an expected package name; + // make sure names match or set package name if necessary + if pname := pkg.Name(); pname == "" { + pkg.SetName(name) + } else if pname != name { + p.errorf("%s package name mismatch: %s (given) vs %s (expected)", id, pname, name) + } + } + return pkg +} + +// parseExportedName is like parseQualifiedName, but +// the package id is resolved to an imported *types.Package. +// +func (p *parser) parseExportedName() (pkg *types.Package, name string) { + id, name := p.parseQualifiedName() + pkg = p.getPkg(id, "") + return +} + +// ---------------------------------------------------------------------------- +// Types + +// BasicType = identifier . +// +func (p *parser) parseBasicType() types.Type { + id := p.expect(scanner.Ident) + obj := types.Universe.Lookup(id) + if obj, ok := obj.(*types.TypeName); ok { + return obj.Type() + } + p.errorf("not a basic type: %s", id) + return nil +} + +// ArrayType = "[" int_lit "]" Type . +// +func (p *parser) parseArrayType(parent *types.Package) types.Type { + // "[" already consumed and lookahead known not to be "]" + lit := p.expect(scanner.Int) + p.expect(']') + elem := p.parseType(parent) + n, err := strconv.ParseInt(lit, 10, 64) + if err != nil { + p.error(err) + } + return types.NewArray(elem, n) +} + +// MapType = "map" "[" Type "]" Type . +// +func (p *parser) parseMapType(parent *types.Package) types.Type { + p.expectKeyword("map") + p.expect('[') + key := p.parseType(parent) + p.expect(']') + elem := p.parseType(parent) + return types.NewMap(key, elem) +} + +// Name = identifier | "?" | QualifiedName . +// +// For unqualified and anonymous names, the returned package is the parent +// package unless parent == nil, in which case the returned package is the +// package being imported. (The parent package is not nil if the the name +// is an unqualified struct field or interface method name belonging to a +// type declared in another package.) +// +// For qualified names, the returned package is nil (and not created if +// it doesn't exist yet) unless materializePkg is set (which creates an +// unnamed package with valid package path). In the latter case, a +// subsequent import clause is expected to provide a name for the package. +// +func (p *parser) parseName(parent *types.Package, materializePkg bool) (pkg *types.Package, name string) { + pkg = parent + if pkg == nil { + pkg = p.sharedPkgs[p.id] + } + switch p.tok { + case scanner.Ident: + name = p.lit + p.next() + case '?': + // anonymous + p.next() + case '@': + // exported name prefixed with package path + pkg = nil + var id string + id, name = p.parseQualifiedName() + if materializePkg { + pkg = p.getPkg(id, "") + } + default: + p.error("name expected") + } + return +} + +func deref(typ types.Type) types.Type { + if p, _ := typ.(*types.Pointer); p != nil { + return p.Elem() + } + return typ +} + +// Field = Name Type [ string_lit ] . +// +func (p *parser) parseField(parent *types.Package) (*types.Var, string) { + pkg, name := p.parseName(parent, true) + + if name == "_" { + // Blank fields should be package-qualified because they + // are unexported identifiers, but gc does not qualify them. + // Assuming that the ident belongs to the current package + // causes types to change during re-exporting, leading + // to spurious "can't assign A to B" errors from go/types. + // As a workaround, pretend all blank fields belong + // to the same unique dummy package. + const blankpkg = "<_>" + pkg = p.getPkg(blankpkg, blankpkg) + } + + typ := p.parseType(parent) + anonymous := false + if name == "" { + // anonymous field - typ must be T or *T and T must be a type name + switch typ := deref(typ).(type) { + case *types.Basic: // basic types are named types + pkg = nil // objects defined in Universe scope have no package + name = typ.Name() + case *types.Named: + name = typ.Obj().Name() + default: + p.errorf("anonymous field expected") + } + anonymous = true + } + tag := "" + if p.tok == scanner.String { + s := p.expect(scanner.String) + var err error + tag, err = strconv.Unquote(s) + if err != nil { + p.errorf("invalid struct tag %s: %s", s, err) + } + } + return types.NewField(token.NoPos, pkg, name, typ, anonymous), tag +} + +// StructType = "struct" "{" [ FieldList ] "}" . +// FieldList = Field { ";" Field } . +// +func (p *parser) parseStructType(parent *types.Package) types.Type { + var fields []*types.Var + var tags []string + + p.expectKeyword("struct") + p.expect('{') + for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ { + if i > 0 { + p.expect(';') + } + fld, tag := p.parseField(parent) + if tag != "" && tags == nil { + tags = make([]string, i) + } + if tags != nil { + tags = append(tags, tag) + } + fields = append(fields, fld) + } + p.expect('}') + + return types.NewStruct(fields, tags) +} + +// Parameter = ( identifier | "?" ) [ "..." ] Type [ string_lit ] . +// +func (p *parser) parseParameter() (par *types.Var, isVariadic bool) { + _, name := p.parseName(nil, false) + // remove gc-specific parameter numbering + if i := strings.Index(name, "·"); i >= 0 { + name = name[:i] + } + if p.tok == '.' { + p.expectSpecial("...") + isVariadic = true + } + typ := p.parseType(nil) + if isVariadic { + typ = types.NewSlice(typ) + } + // ignore argument tag (e.g. "noescape") + if p.tok == scanner.String { + p.next() + } + // TODO(gri) should we provide a package? + par = types.NewVar(token.NoPos, nil, name, typ) + return +} + +// Parameters = "(" [ ParameterList ] ")" . +// ParameterList = { Parameter "," } Parameter . +// +func (p *parser) parseParameters() (list []*types.Var, isVariadic bool) { + p.expect('(') + for p.tok != ')' && p.tok != scanner.EOF { + if len(list) > 0 { + p.expect(',') + } + par, variadic := p.parseParameter() + list = append(list, par) + if variadic { + if isVariadic { + p.error("... not on final argument") + } + isVariadic = true + } + } + p.expect(')') + + return +} + +// Signature = Parameters [ Result ] . +// Result = Type | Parameters . +// +func (p *parser) parseSignature(recv *types.Var) *types.Signature { + params, isVariadic := p.parseParameters() + + // optional result type + var results []*types.Var + if p.tok == '(' { + var variadic bool + results, variadic = p.parseParameters() + if variadic { + p.error("... not permitted on result type") + } + } + + return types.NewSignature(recv, types.NewTuple(params...), types.NewTuple(results...), isVariadic) +} + +// InterfaceType = "interface" "{" [ MethodList ] "}" . +// MethodList = Method { ";" Method } . +// Method = Name Signature . +// +// The methods of embedded interfaces are always "inlined" +// by the compiler and thus embedded interfaces are never +// visible in the export data. +// +func (p *parser) parseInterfaceType(parent *types.Package) types.Type { + var methods []*types.Func + + p.expectKeyword("interface") + p.expect('{') + for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ { + if i > 0 { + p.expect(';') + } + pkg, name := p.parseName(parent, true) + sig := p.parseSignature(nil) + methods = append(methods, types.NewFunc(token.NoPos, pkg, name, sig)) + } + p.expect('}') + + // Complete requires the type's embedded interfaces to be fully defined, + // but we do not define any + return newInterface(methods, nil).Complete() +} + +// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type . +// +func (p *parser) parseChanType(parent *types.Package) types.Type { + dir := types.SendRecv + if p.tok == scanner.Ident { + p.expectKeyword("chan") + if p.tok == '<' { + p.expectSpecial("<-") + dir = types.SendOnly + } + } else { + p.expectSpecial("<-") + p.expectKeyword("chan") + dir = types.RecvOnly + } + elem := p.parseType(parent) + return types.NewChan(dir, elem) +} + +// Type = +// BasicType | TypeName | ArrayType | SliceType | StructType | +// PointerType | FuncType | InterfaceType | MapType | ChanType | +// "(" Type ")" . +// +// BasicType = ident . +// TypeName = ExportedName . +// SliceType = "[" "]" Type . +// PointerType = "*" Type . +// FuncType = "func" Signature . +// +func (p *parser) parseType(parent *types.Package) types.Type { + switch p.tok { + case scanner.Ident: + switch p.lit { + default: + return p.parseBasicType() + case "struct": + return p.parseStructType(parent) + case "func": + // FuncType + p.next() + return p.parseSignature(nil) + case "interface": + return p.parseInterfaceType(parent) + case "map": + return p.parseMapType(parent) + case "chan": + return p.parseChanType(parent) + } + case '@': + // TypeName + pkg, name := p.parseExportedName() + return declTypeName(pkg, name).Type() + case '[': + p.next() // look ahead + if p.tok == ']' { + // SliceType + p.next() + return types.NewSlice(p.parseType(parent)) + } + return p.parseArrayType(parent) + case '*': + // PointerType + p.next() + return types.NewPointer(p.parseType(parent)) + case '<': + return p.parseChanType(parent) + case '(': + // "(" Type ")" + p.next() + typ := p.parseType(parent) + p.expect(')') + return typ + } + p.errorf("expected type, got %s (%q)", scanner.TokenString(p.tok), p.lit) + return nil +} + +// ---------------------------------------------------------------------------- +// Declarations + +// ImportDecl = "import" PackageName PackageId . +// +func (p *parser) parseImportDecl() { + p.expectKeyword("import") + name := p.parsePackageName() + p.getPkg(p.parsePackageID(), name) +} + +// int_lit = [ "+" | "-" ] { "0" ... "9" } . +// +func (p *parser) parseInt() string { + s := "" + switch p.tok { + case '-': + s = "-" + p.next() + case '+': + p.next() + } + return s + p.expect(scanner.Int) +} + +// number = int_lit [ "p" int_lit ] . +// +func (p *parser) parseNumber() (typ *types.Basic, val constant.Value) { + // mantissa + mant := constant.MakeFromLiteral(p.parseInt(), token.INT, 0) + if mant == nil { + panic("invalid mantissa") + } + + if p.lit == "p" { + // exponent (base 2) + p.next() + exp, err := strconv.ParseInt(p.parseInt(), 10, 0) + if err != nil { + p.error(err) + } + if exp < 0 { + denom := constant.MakeInt64(1) + denom = constant.Shift(denom, token.SHL, uint(-exp)) + typ = types.Typ[types.UntypedFloat] + val = constant.BinaryOp(mant, token.QUO, denom) + return + } + if exp > 0 { + mant = constant.Shift(mant, token.SHL, uint(exp)) + } + typ = types.Typ[types.UntypedFloat] + val = mant + return + } + + typ = types.Typ[types.UntypedInt] + val = mant + return +} + +// ConstDecl = "const" ExportedName [ Type ] "=" Literal . +// Literal = bool_lit | int_lit | float_lit | complex_lit | rune_lit | string_lit . +// bool_lit = "true" | "false" . +// complex_lit = "(" float_lit "+" float_lit "i" ")" . +// rune_lit = "(" int_lit "+" int_lit ")" . +// string_lit = `"` { unicode_char } `"` . +// +func (p *parser) parseConstDecl() { + p.expectKeyword("const") + pkg, name := p.parseExportedName() + + var typ0 types.Type + if p.tok != '=' { + // constant types are never structured - no need for parent type + typ0 = p.parseType(nil) + } + + p.expect('=') + var typ types.Type + var val constant.Value + switch p.tok { + case scanner.Ident: + // bool_lit + if p.lit != "true" && p.lit != "false" { + p.error("expected true or false") + } + typ = types.Typ[types.UntypedBool] + val = constant.MakeBool(p.lit == "true") + p.next() + + case '-', scanner.Int: + // int_lit + typ, val = p.parseNumber() + + case '(': + // complex_lit or rune_lit + p.next() + if p.tok == scanner.Char { + p.next() + p.expect('+') + typ = types.Typ[types.UntypedRune] + _, val = p.parseNumber() + p.expect(')') + break + } + _, re := p.parseNumber() + p.expect('+') + _, im := p.parseNumber() + p.expectKeyword("i") + p.expect(')') + typ = types.Typ[types.UntypedComplex] + val = constant.BinaryOp(re, token.ADD, constant.MakeImag(im)) + + case scanner.Char: + // rune_lit + typ = types.Typ[types.UntypedRune] + val = constant.MakeFromLiteral(p.lit, token.CHAR, 0) + p.next() + + case scanner.String: + // string_lit + typ = types.Typ[types.UntypedString] + val = constant.MakeFromLiteral(p.lit, token.STRING, 0) + p.next() + + default: + p.errorf("expected literal got %s", scanner.TokenString(p.tok)) + } + + if typ0 == nil { + typ0 = typ + } + + pkg.Scope().Insert(types.NewConst(token.NoPos, pkg, name, typ0, val)) +} + +// TypeDecl = "type" ExportedName Type . +// +func (p *parser) parseTypeDecl() { + p.expectKeyword("type") + pkg, name := p.parseExportedName() + obj := declTypeName(pkg, name) + + // The type object may have been imported before and thus already + // have a type associated with it. We still need to parse the type + // structure, but throw it away if the object already has a type. + // This ensures that all imports refer to the same type object for + // a given type declaration. + typ := p.parseType(pkg) + + if name := obj.Type().(*types.Named); name.Underlying() == nil { + name.SetUnderlying(typ) + } +} + +// VarDecl = "var" ExportedName Type . +// +func (p *parser) parseVarDecl() { + p.expectKeyword("var") + pkg, name := p.parseExportedName() + typ := p.parseType(pkg) + pkg.Scope().Insert(types.NewVar(token.NoPos, pkg, name, typ)) +} + +// Func = Signature [ Body ] . +// Body = "{" ... "}" . +// +func (p *parser) parseFunc(recv *types.Var) *types.Signature { + sig := p.parseSignature(recv) + if p.tok == '{' { + p.next() + for i := 1; i > 0; p.next() { + switch p.tok { + case '{': + i++ + case '}': + i-- + } + } + } + return sig +} + +// MethodDecl = "func" Receiver Name Func . +// Receiver = "(" ( identifier | "?" ) [ "*" ] ExportedName ")" . +// +func (p *parser) parseMethodDecl() { + // "func" already consumed + p.expect('(') + recv, _ := p.parseParameter() // receiver + p.expect(')') + + // determine receiver base type object + base := deref(recv.Type()).(*types.Named) + + // parse method name, signature, and possibly inlined body + _, name := p.parseName(nil, false) + sig := p.parseFunc(recv) + + // methods always belong to the same package as the base type object + pkg := base.Obj().Pkg() + + // add method to type unless type was imported before + // and method exists already + // TODO(gri) This leads to a quadratic algorithm - ok for now because method counts are small. + base.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig)) +} + +// FuncDecl = "func" ExportedName Func . +// +func (p *parser) parseFuncDecl() { + // "func" already consumed + pkg, name := p.parseExportedName() + typ := p.parseFunc(nil) + pkg.Scope().Insert(types.NewFunc(token.NoPos, pkg, name, typ)) +} + +// Decl = [ ImportDecl | ConstDecl | TypeDecl | VarDecl | FuncDecl | MethodDecl ] "\n" . +// +func (p *parser) parseDecl() { + if p.tok == scanner.Ident { + switch p.lit { + case "import": + p.parseImportDecl() + case "const": + p.parseConstDecl() + case "type": + p.parseTypeDecl() + case "var": + p.parseVarDecl() + case "func": + p.next() // look ahead + if p.tok == '(' { + p.parseMethodDecl() + } else { + p.parseFuncDecl() + } + } + } + p.expect('\n') +} + +// ---------------------------------------------------------------------------- +// Export + +// Export = "PackageClause { Decl } "$$" . +// PackageClause = "package" PackageName [ "safe" ] "\n" . +// +func (p *parser) parseExport() *types.Package { + p.expectKeyword("package") + name := p.parsePackageName() + if p.tok == scanner.Ident && p.lit == "safe" { + // package was compiled with -u option - ignore + p.next() + } + p.expect('\n') + + pkg := p.getPkg(p.id, name) + + for p.tok != '$' && p.tok != scanner.EOF { + p.parseDecl() + } + + if ch := p.scanner.Peek(); p.tok != '$' || ch != '$' { + // don't call next()/expect() since reading past the + // export data may cause scanner errors (e.g. NUL chars) + p.errorf("expected '$$', got %s %c", scanner.TokenString(p.tok), ch) + } + + if n := p.scanner.ErrorCount; n != 0 { + p.errorf("expected no scanner errors, got %d", n) + } + + // Record all locally referenced packages as imports. + var imports []*types.Package + for id, pkg2 := range p.localPkgs { + if pkg2.Name() == "" { + p.errorf("%s package has no name", id) + } + if id == p.id { + continue // avoid self-edge + } + imports = append(imports, pkg2) + } + sort.Sort(byPath(imports)) + pkg.SetImports(imports) + + // package was imported completely and without errors + pkg.MarkComplete() + + return pkg +} + +type byPath []*types.Package + +func (a byPath) Len() int { return len(a) } +func (a byPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() } diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/iexport.go b/vendor/golang.org/x/tools/go/internal/gcimporter/iexport.go new file mode 100644 index 00000000..4be32a2e --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/iexport.go @@ -0,0 +1,739 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Indexed binary package export. +// This file was derived from $GOROOT/src/cmd/compile/internal/gc/iexport.go; +// see that file for specification of the format. + +package gcimporter + +import ( + "bytes" + "encoding/binary" + "go/ast" + "go/constant" + "go/token" + "go/types" + "io" + "math/big" + "reflect" + "sort" +) + +// Current indexed export format version. Increase with each format change. +// 0: Go1.11 encoding +const iexportVersion = 0 + +// IExportData returns the binary export data for pkg. +// +// If no file set is provided, position info will be missing. +// The package path of the top-level package will not be recorded, +// so that calls to IImportData can override with a provided package path. +func IExportData(fset *token.FileSet, pkg *types.Package) (b []byte, err error) { + defer func() { + if e := recover(); e != nil { + if ierr, ok := e.(internalError); ok { + err = ierr + return + } + // Not an internal error; panic again. + panic(e) + } + }() + + p := iexporter{ + out: bytes.NewBuffer(nil), + fset: fset, + allPkgs: map[*types.Package]bool{}, + stringIndex: map[string]uint64{}, + declIndex: map[types.Object]uint64{}, + typIndex: map[types.Type]uint64{}, + localpkg: pkg, + } + + for i, pt := range predeclared() { + p.typIndex[pt] = uint64(i) + } + if len(p.typIndex) > predeclReserved { + panic(internalErrorf("too many predeclared types: %d > %d", len(p.typIndex), predeclReserved)) + } + + // Initialize work queue with exported declarations. + scope := pkg.Scope() + for _, name := range scope.Names() { + if ast.IsExported(name) { + p.pushDecl(scope.Lookup(name)) + } + } + + // Loop until no more work. + for !p.declTodo.empty() { + p.doDecl(p.declTodo.popHead()) + } + + // Append indices to data0 section. + dataLen := uint64(p.data0.Len()) + w := p.newWriter() + w.writeIndex(p.declIndex) + w.flush() + + // Assemble header. + var hdr intWriter + hdr.WriteByte('i') + hdr.uint64(iexportVersion) + hdr.uint64(uint64(p.strings.Len())) + hdr.uint64(dataLen) + + // Flush output. + io.Copy(p.out, &hdr) + io.Copy(p.out, &p.strings) + io.Copy(p.out, &p.data0) + + return p.out.Bytes(), nil +} + +// writeIndex writes out an object index. mainIndex indicates whether +// we're writing out the main index, which is also read by +// non-compiler tools and includes a complete package description +// (i.e., name and height). +func (w *exportWriter) writeIndex(index map[types.Object]uint64) { + // Build a map from packages to objects from that package. + pkgObjs := map[*types.Package][]types.Object{} + + // For the main index, make sure to include every package that + // we reference, even if we're not exporting (or reexporting) + // any symbols from it. + pkgObjs[w.p.localpkg] = nil + for pkg := range w.p.allPkgs { + pkgObjs[pkg] = nil + } + + for obj := range index { + pkgObjs[obj.Pkg()] = append(pkgObjs[obj.Pkg()], obj) + } + + var pkgs []*types.Package + for pkg, objs := range pkgObjs { + pkgs = append(pkgs, pkg) + + sort.Slice(objs, func(i, j int) bool { + return objs[i].Name() < objs[j].Name() + }) + } + + sort.Slice(pkgs, func(i, j int) bool { + return w.exportPath(pkgs[i]) < w.exportPath(pkgs[j]) + }) + + w.uint64(uint64(len(pkgs))) + for _, pkg := range pkgs { + w.string(w.exportPath(pkg)) + w.string(pkg.Name()) + w.uint64(uint64(0)) // package height is not needed for go/types + + objs := pkgObjs[pkg] + w.uint64(uint64(len(objs))) + for _, obj := range objs { + w.string(obj.Name()) + w.uint64(index[obj]) + } + } +} + +type iexporter struct { + fset *token.FileSet + out *bytes.Buffer + + localpkg *types.Package + + // allPkgs tracks all packages that have been referenced by + // the export data, so we can ensure to include them in the + // main index. + allPkgs map[*types.Package]bool + + declTodo objQueue + + strings intWriter + stringIndex map[string]uint64 + + data0 intWriter + declIndex map[types.Object]uint64 + typIndex map[types.Type]uint64 +} + +// stringOff returns the offset of s within the string section. +// If not already present, it's added to the end. +func (p *iexporter) stringOff(s string) uint64 { + off, ok := p.stringIndex[s] + if !ok { + off = uint64(p.strings.Len()) + p.stringIndex[s] = off + + p.strings.uint64(uint64(len(s))) + p.strings.WriteString(s) + } + return off +} + +// pushDecl adds n to the declaration work queue, if not already present. +func (p *iexporter) pushDecl(obj types.Object) { + // Package unsafe is known to the compiler and predeclared. + assert(obj.Pkg() != types.Unsafe) + + if _, ok := p.declIndex[obj]; ok { + return + } + + p.declIndex[obj] = ^uint64(0) // mark n present in work queue + p.declTodo.pushTail(obj) +} + +// exportWriter handles writing out individual data section chunks. +type exportWriter struct { + p *iexporter + + data intWriter + currPkg *types.Package + prevFile string + prevLine int64 +} + +func (w *exportWriter) exportPath(pkg *types.Package) string { + if pkg == w.p.localpkg { + return "" + } + return pkg.Path() +} + +func (p *iexporter) doDecl(obj types.Object) { + w := p.newWriter() + w.setPkg(obj.Pkg(), false) + + switch obj := obj.(type) { + case *types.Var: + w.tag('V') + w.pos(obj.Pos()) + w.typ(obj.Type(), obj.Pkg()) + + case *types.Func: + sig, _ := obj.Type().(*types.Signature) + if sig.Recv() != nil { + panic(internalErrorf("unexpected method: %v", sig)) + } + w.tag('F') + w.pos(obj.Pos()) + w.signature(sig) + + case *types.Const: + w.tag('C') + w.pos(obj.Pos()) + w.value(obj.Type(), obj.Val()) + + case *types.TypeName: + if obj.IsAlias() { + w.tag('A') + w.pos(obj.Pos()) + w.typ(obj.Type(), obj.Pkg()) + break + } + + // Defined type. + w.tag('T') + w.pos(obj.Pos()) + + underlying := obj.Type().Underlying() + w.typ(underlying, obj.Pkg()) + + t := obj.Type() + if types.IsInterface(t) { + break + } + + named, ok := t.(*types.Named) + if !ok { + panic(internalErrorf("%s is not a defined type", t)) + } + + n := named.NumMethods() + w.uint64(uint64(n)) + for i := 0; i < n; i++ { + m := named.Method(i) + w.pos(m.Pos()) + w.string(m.Name()) + sig, _ := m.Type().(*types.Signature) + w.param(sig.Recv()) + w.signature(sig) + } + + default: + panic(internalErrorf("unexpected object: %v", obj)) + } + + p.declIndex[obj] = w.flush() +} + +func (w *exportWriter) tag(tag byte) { + w.data.WriteByte(tag) +} + +func (w *exportWriter) pos(pos token.Pos) { + if w.p.fset == nil { + w.int64(0) + return + } + + p := w.p.fset.Position(pos) + file := p.Filename + line := int64(p.Line) + + // When file is the same as the last position (common case), + // we can save a few bytes by delta encoding just the line + // number. + // + // Note: Because data objects may be read out of order (or not + // at all), we can only apply delta encoding within a single + // object. This is handled implicitly by tracking prevFile and + // prevLine as fields of exportWriter. + + if file == w.prevFile { + delta := line - w.prevLine + w.int64(delta) + if delta == deltaNewFile { + w.int64(-1) + } + } else { + w.int64(deltaNewFile) + w.int64(line) // line >= 0 + w.string(file) + w.prevFile = file + } + w.prevLine = line +} + +func (w *exportWriter) pkg(pkg *types.Package) { + // Ensure any referenced packages are declared in the main index. + w.p.allPkgs[pkg] = true + + w.string(w.exportPath(pkg)) +} + +func (w *exportWriter) qualifiedIdent(obj types.Object) { + // Ensure any referenced declarations are written out too. + w.p.pushDecl(obj) + + w.string(obj.Name()) + w.pkg(obj.Pkg()) +} + +func (w *exportWriter) typ(t types.Type, pkg *types.Package) { + w.data.uint64(w.p.typOff(t, pkg)) +} + +func (p *iexporter) newWriter() *exportWriter { + return &exportWriter{p: p} +} + +func (w *exportWriter) flush() uint64 { + off := uint64(w.p.data0.Len()) + io.Copy(&w.p.data0, &w.data) + return off +} + +func (p *iexporter) typOff(t types.Type, pkg *types.Package) uint64 { + off, ok := p.typIndex[t] + if !ok { + w := p.newWriter() + w.doTyp(t, pkg) + off = predeclReserved + w.flush() + p.typIndex[t] = off + } + return off +} + +func (w *exportWriter) startType(k itag) { + w.data.uint64(uint64(k)) +} + +func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) { + switch t := t.(type) { + case *types.Named: + w.startType(definedType) + w.qualifiedIdent(t.Obj()) + + case *types.Pointer: + w.startType(pointerType) + w.typ(t.Elem(), pkg) + + case *types.Slice: + w.startType(sliceType) + w.typ(t.Elem(), pkg) + + case *types.Array: + w.startType(arrayType) + w.uint64(uint64(t.Len())) + w.typ(t.Elem(), pkg) + + case *types.Chan: + w.startType(chanType) + // 1 RecvOnly; 2 SendOnly; 3 SendRecv + var dir uint64 + switch t.Dir() { + case types.RecvOnly: + dir = 1 + case types.SendOnly: + dir = 2 + case types.SendRecv: + dir = 3 + } + w.uint64(dir) + w.typ(t.Elem(), pkg) + + case *types.Map: + w.startType(mapType) + w.typ(t.Key(), pkg) + w.typ(t.Elem(), pkg) + + case *types.Signature: + w.startType(signatureType) + w.setPkg(pkg, true) + w.signature(t) + + case *types.Struct: + w.startType(structType) + w.setPkg(pkg, true) + + n := t.NumFields() + w.uint64(uint64(n)) + for i := 0; i < n; i++ { + f := t.Field(i) + w.pos(f.Pos()) + w.string(f.Name()) + w.typ(f.Type(), pkg) + w.bool(f.Anonymous()) + w.string(t.Tag(i)) // note (or tag) + } + + case *types.Interface: + w.startType(interfaceType) + w.setPkg(pkg, true) + + n := t.NumEmbeddeds() + w.uint64(uint64(n)) + for i := 0; i < n; i++ { + f := t.Embedded(i) + w.pos(f.Obj().Pos()) + w.typ(f.Obj().Type(), f.Obj().Pkg()) + } + + n = t.NumExplicitMethods() + w.uint64(uint64(n)) + for i := 0; i < n; i++ { + m := t.ExplicitMethod(i) + w.pos(m.Pos()) + w.string(m.Name()) + sig, _ := m.Type().(*types.Signature) + w.signature(sig) + } + + default: + panic(internalErrorf("unexpected type: %v, %v", t, reflect.TypeOf(t))) + } +} + +func (w *exportWriter) setPkg(pkg *types.Package, write bool) { + if write { + w.pkg(pkg) + } + + w.currPkg = pkg +} + +func (w *exportWriter) signature(sig *types.Signature) { + w.paramList(sig.Params()) + w.paramList(sig.Results()) + if sig.Params().Len() > 0 { + w.bool(sig.Variadic()) + } +} + +func (w *exportWriter) paramList(tup *types.Tuple) { + n := tup.Len() + w.uint64(uint64(n)) + for i := 0; i < n; i++ { + w.param(tup.At(i)) + } +} + +func (w *exportWriter) param(obj types.Object) { + w.pos(obj.Pos()) + w.localIdent(obj) + w.typ(obj.Type(), obj.Pkg()) +} + +func (w *exportWriter) value(typ types.Type, v constant.Value) { + w.typ(typ, nil) + + switch v.Kind() { + case constant.Bool: + w.bool(constant.BoolVal(v)) + case constant.Int: + var i big.Int + if i64, exact := constant.Int64Val(v); exact { + i.SetInt64(i64) + } else if ui64, exact := constant.Uint64Val(v); exact { + i.SetUint64(ui64) + } else { + i.SetString(v.ExactString(), 10) + } + w.mpint(&i, typ) + case constant.Float: + f := constantToFloat(v) + w.mpfloat(f, typ) + case constant.Complex: + w.mpfloat(constantToFloat(constant.Real(v)), typ) + w.mpfloat(constantToFloat(constant.Imag(v)), typ) + case constant.String: + w.string(constant.StringVal(v)) + case constant.Unknown: + // package contains type errors + default: + panic(internalErrorf("unexpected value %v (%T)", v, v)) + } +} + +// constantToFloat converts a constant.Value with kind constant.Float to a +// big.Float. +func constantToFloat(x constant.Value) *big.Float { + assert(x.Kind() == constant.Float) + // Use the same floating-point precision (512) as cmd/compile + // (see Mpprec in cmd/compile/internal/gc/mpfloat.go). + const mpprec = 512 + var f big.Float + f.SetPrec(mpprec) + if v, exact := constant.Float64Val(x); exact { + // float64 + f.SetFloat64(v) + } else if num, denom := constant.Num(x), constant.Denom(x); num.Kind() == constant.Int { + // TODO(gri): add big.Rat accessor to constant.Value. + n := valueToRat(num) + d := valueToRat(denom) + f.SetRat(n.Quo(n, d)) + } else { + // Value too large to represent as a fraction => inaccessible. + // TODO(gri): add big.Float accessor to constant.Value. + _, ok := f.SetString(x.ExactString()) + assert(ok) + } + return &f +} + +// mpint exports a multi-precision integer. +// +// For unsigned types, small values are written out as a single +// byte. Larger values are written out as a length-prefixed big-endian +// byte string, where the length prefix is encoded as its complement. +// For example, bytes 0, 1, and 2 directly represent the integer +// values 0, 1, and 2; while bytes 255, 254, and 253 indicate a 1-, +// 2-, and 3-byte big-endian string follow. +// +// Encoding for signed types use the same general approach as for +// unsigned types, except small values use zig-zag encoding and the +// bottom bit of length prefix byte for large values is reserved as a +// sign bit. +// +// The exact boundary between small and large encodings varies +// according to the maximum number of bytes needed to encode a value +// of type typ. As a special case, 8-bit types are always encoded as a +// single byte. +// +// TODO(mdempsky): Is this level of complexity really worthwhile? +func (w *exportWriter) mpint(x *big.Int, typ types.Type) { + basic, ok := typ.Underlying().(*types.Basic) + if !ok { + panic(internalErrorf("unexpected type %v (%T)", typ.Underlying(), typ.Underlying())) + } + + signed, maxBytes := intSize(basic) + + negative := x.Sign() < 0 + if !signed && negative { + panic(internalErrorf("negative unsigned integer; type %v, value %v", typ, x)) + } + + b := x.Bytes() + if len(b) > 0 && b[0] == 0 { + panic(internalErrorf("leading zeros")) + } + if uint(len(b)) > maxBytes { + panic(internalErrorf("bad mpint length: %d > %d (type %v, value %v)", len(b), maxBytes, typ, x)) + } + + maxSmall := 256 - maxBytes + if signed { + maxSmall = 256 - 2*maxBytes + } + if maxBytes == 1 { + maxSmall = 256 + } + + // Check if x can use small value encoding. + if len(b) <= 1 { + var ux uint + if len(b) == 1 { + ux = uint(b[0]) + } + if signed { + ux <<= 1 + if negative { + ux-- + } + } + if ux < maxSmall { + w.data.WriteByte(byte(ux)) + return + } + } + + n := 256 - uint(len(b)) + if signed { + n = 256 - 2*uint(len(b)) + if negative { + n |= 1 + } + } + if n < maxSmall || n >= 256 { + panic(internalErrorf("encoding mistake: %d, %v, %v => %d", len(b), signed, negative, n)) + } + + w.data.WriteByte(byte(n)) + w.data.Write(b) +} + +// mpfloat exports a multi-precision floating point number. +// +// The number's value is decomposed into mantissa × 2**exponent, where +// mantissa is an integer. The value is written out as mantissa (as a +// multi-precision integer) and then the exponent, except exponent is +// omitted if mantissa is zero. +func (w *exportWriter) mpfloat(f *big.Float, typ types.Type) { + if f.IsInf() { + panic("infinite constant") + } + + // Break into f = mant × 2**exp, with 0.5 <= mant < 1. + var mant big.Float + exp := int64(f.MantExp(&mant)) + + // Scale so that mant is an integer. + prec := mant.MinPrec() + mant.SetMantExp(&mant, int(prec)) + exp -= int64(prec) + + manti, acc := mant.Int(nil) + if acc != big.Exact { + panic(internalErrorf("mantissa scaling failed for %f (%s)", f, acc)) + } + w.mpint(manti, typ) + if manti.Sign() != 0 { + w.int64(exp) + } +} + +func (w *exportWriter) bool(b bool) bool { + var x uint64 + if b { + x = 1 + } + w.uint64(x) + return b +} + +func (w *exportWriter) int64(x int64) { w.data.int64(x) } +func (w *exportWriter) uint64(x uint64) { w.data.uint64(x) } +func (w *exportWriter) string(s string) { w.uint64(w.p.stringOff(s)) } + +func (w *exportWriter) localIdent(obj types.Object) { + // Anonymous parameters. + if obj == nil { + w.string("") + return + } + + name := obj.Name() + if name == "_" { + w.string("_") + return + } + + w.string(name) +} + +type intWriter struct { + bytes.Buffer +} + +func (w *intWriter) int64(x int64) { + var buf [binary.MaxVarintLen64]byte + n := binary.PutVarint(buf[:], x) + w.Write(buf[:n]) +} + +func (w *intWriter) uint64(x uint64) { + var buf [binary.MaxVarintLen64]byte + n := binary.PutUvarint(buf[:], x) + w.Write(buf[:n]) +} + +func assert(cond bool) { + if !cond { + panic("internal error: assertion failed") + } +} + +// The below is copied from go/src/cmd/compile/internal/gc/syntax.go. + +// objQueue is a FIFO queue of types.Object. The zero value of objQueue is +// a ready-to-use empty queue. +type objQueue struct { + ring []types.Object + head, tail int +} + +// empty returns true if q contains no Nodes. +func (q *objQueue) empty() bool { + return q.head == q.tail +} + +// pushTail appends n to the tail of the queue. +func (q *objQueue) pushTail(obj types.Object) { + if len(q.ring) == 0 { + q.ring = make([]types.Object, 16) + } else if q.head+len(q.ring) == q.tail { + // Grow the ring. + nring := make([]types.Object, len(q.ring)*2) + // Copy the old elements. + part := q.ring[q.head%len(q.ring):] + if q.tail-q.head <= len(part) { + part = part[:q.tail-q.head] + copy(nring, part) + } else { + pos := copy(nring, part) + copy(nring[pos:], q.ring[:q.tail%len(q.ring)]) + } + q.ring, q.head, q.tail = nring, 0, q.tail-q.head + } + + q.ring[q.tail%len(q.ring)] = obj + q.tail++ +} + +// popHead pops a node from the head of the queue. It panics if q is empty. +func (q *objQueue) popHead() types.Object { + if q.empty() { + panic("dequeue empty") + } + obj := q.ring[q.head%len(q.ring)] + q.head++ + return obj +} diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go b/vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go new file mode 100644 index 00000000..a31a8802 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go @@ -0,0 +1,630 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Indexed package import. +// See cmd/compile/internal/gc/iexport.go for the export data format. + +// This file is a copy of $GOROOT/src/go/internal/gcimporter/iimport.go. + +package gcimporter + +import ( + "bytes" + "encoding/binary" + "fmt" + "go/constant" + "go/token" + "go/types" + "io" + "sort" +) + +type intReader struct { + *bytes.Reader + path string +} + +func (r *intReader) int64() int64 { + i, err := binary.ReadVarint(r.Reader) + if err != nil { + errorf("import %q: read varint error: %v", r.path, err) + } + return i +} + +func (r *intReader) uint64() uint64 { + i, err := binary.ReadUvarint(r.Reader) + if err != nil { + errorf("import %q: read varint error: %v", r.path, err) + } + return i +} + +const predeclReserved = 32 + +type itag uint64 + +const ( + // Types + definedType itag = iota + pointerType + sliceType + arrayType + chanType + mapType + signatureType + structType + interfaceType +) + +// IImportData imports a package from the serialized package data +// and returns the number of bytes consumed and a reference to the package. +// If the export data version is not recognized or the format is otherwise +// compromised, an error is returned. +func IImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) { + const currentVersion = 1 + version := int64(-1) + defer func() { + if e := recover(); e != nil { + if version > currentVersion { + err = fmt.Errorf("cannot import %q (%v), export data is newer version - update tool", path, e) + } else { + err = fmt.Errorf("cannot import %q (%v), possibly version skew - reinstall package", path, e) + } + } + }() + + r := &intReader{bytes.NewReader(data), path} + + version = int64(r.uint64()) + switch version { + case currentVersion, 0: + default: + errorf("unknown iexport format version %d", version) + } + + sLen := int64(r.uint64()) + dLen := int64(r.uint64()) + + whence, _ := r.Seek(0, io.SeekCurrent) + stringData := data[whence : whence+sLen] + declData := data[whence+sLen : whence+sLen+dLen] + r.Seek(sLen+dLen, io.SeekCurrent) + + p := iimporter{ + ipath: path, + version: int(version), + + stringData: stringData, + stringCache: make(map[uint64]string), + pkgCache: make(map[uint64]*types.Package), + + declData: declData, + pkgIndex: make(map[*types.Package]map[string]uint64), + typCache: make(map[uint64]types.Type), + + fake: fakeFileSet{ + fset: fset, + files: make(map[string]*token.File), + }, + } + + for i, pt := range predeclared() { + p.typCache[uint64(i)] = pt + } + + pkgList := make([]*types.Package, r.uint64()) + for i := range pkgList { + pkgPathOff := r.uint64() + pkgPath := p.stringAt(pkgPathOff) + pkgName := p.stringAt(r.uint64()) + _ = r.uint64() // package height; unused by go/types + + if pkgPath == "" { + pkgPath = path + } + pkg := imports[pkgPath] + if pkg == nil { + pkg = types.NewPackage(pkgPath, pkgName) + imports[pkgPath] = pkg + } else if pkg.Name() != pkgName { + errorf("conflicting names %s and %s for package %q", pkg.Name(), pkgName, path) + } + + p.pkgCache[pkgPathOff] = pkg + + nameIndex := make(map[string]uint64) + for nSyms := r.uint64(); nSyms > 0; nSyms-- { + name := p.stringAt(r.uint64()) + nameIndex[name] = r.uint64() + } + + p.pkgIndex[pkg] = nameIndex + pkgList[i] = pkg + } + if len(pkgList) == 0 { + errorf("no packages found for %s", path) + panic("unreachable") + } + p.ipkg = pkgList[0] + names := make([]string, 0, len(p.pkgIndex[p.ipkg])) + for name := range p.pkgIndex[p.ipkg] { + names = append(names, name) + } + sort.Strings(names) + for _, name := range names { + p.doDecl(p.ipkg, name) + } + + for _, typ := range p.interfaceList { + typ.Complete() + } + + // record all referenced packages as imports + list := append(([]*types.Package)(nil), pkgList[1:]...) + sort.Sort(byPath(list)) + p.ipkg.SetImports(list) + + // package was imported completely and without errors + p.ipkg.MarkComplete() + + consumed, _ := r.Seek(0, io.SeekCurrent) + return int(consumed), p.ipkg, nil +} + +type iimporter struct { + ipath string + ipkg *types.Package + version int + + stringData []byte + stringCache map[uint64]string + pkgCache map[uint64]*types.Package + + declData []byte + pkgIndex map[*types.Package]map[string]uint64 + typCache map[uint64]types.Type + + fake fakeFileSet + interfaceList []*types.Interface +} + +func (p *iimporter) doDecl(pkg *types.Package, name string) { + // See if we've already imported this declaration. + if obj := pkg.Scope().Lookup(name); obj != nil { + return + } + + off, ok := p.pkgIndex[pkg][name] + if !ok { + errorf("%v.%v not in index", pkg, name) + } + + r := &importReader{p: p, currPkg: pkg} + r.declReader.Reset(p.declData[off:]) + + r.obj(name) +} + +func (p *iimporter) stringAt(off uint64) string { + if s, ok := p.stringCache[off]; ok { + return s + } + + slen, n := binary.Uvarint(p.stringData[off:]) + if n <= 0 { + errorf("varint failed") + } + spos := off + uint64(n) + s := string(p.stringData[spos : spos+slen]) + p.stringCache[off] = s + return s +} + +func (p *iimporter) pkgAt(off uint64) *types.Package { + if pkg, ok := p.pkgCache[off]; ok { + return pkg + } + path := p.stringAt(off) + if path == p.ipath { + return p.ipkg + } + errorf("missing package %q in %q", path, p.ipath) + return nil +} + +func (p *iimporter) typAt(off uint64, base *types.Named) types.Type { + if t, ok := p.typCache[off]; ok && (base == nil || !isInterface(t)) { + return t + } + + if off < predeclReserved { + errorf("predeclared type missing from cache: %v", off) + } + + r := &importReader{p: p} + r.declReader.Reset(p.declData[off-predeclReserved:]) + t := r.doType(base) + + if base == nil || !isInterface(t) { + p.typCache[off] = t + } + return t +} + +type importReader struct { + p *iimporter + declReader bytes.Reader + currPkg *types.Package + prevFile string + prevLine int64 + prevColumn int64 +} + +func (r *importReader) obj(name string) { + tag := r.byte() + pos := r.pos() + + switch tag { + case 'A': + typ := r.typ() + + r.declare(types.NewTypeName(pos, r.currPkg, name, typ)) + + case 'C': + typ, val := r.value() + + r.declare(types.NewConst(pos, r.currPkg, name, typ, val)) + + case 'F': + sig := r.signature(nil) + + r.declare(types.NewFunc(pos, r.currPkg, name, sig)) + + case 'T': + // Types can be recursive. We need to setup a stub + // declaration before recursing. + obj := types.NewTypeName(pos, r.currPkg, name, nil) + named := types.NewNamed(obj, nil, nil) + r.declare(obj) + + underlying := r.p.typAt(r.uint64(), named).Underlying() + named.SetUnderlying(underlying) + + if !isInterface(underlying) { + for n := r.uint64(); n > 0; n-- { + mpos := r.pos() + mname := r.ident() + recv := r.param() + msig := r.signature(recv) + + named.AddMethod(types.NewFunc(mpos, r.currPkg, mname, msig)) + } + } + + case 'V': + typ := r.typ() + + r.declare(types.NewVar(pos, r.currPkg, name, typ)) + + default: + errorf("unexpected tag: %v", tag) + } +} + +func (r *importReader) declare(obj types.Object) { + obj.Pkg().Scope().Insert(obj) +} + +func (r *importReader) value() (typ types.Type, val constant.Value) { + typ = r.typ() + + switch b := typ.Underlying().(*types.Basic); b.Info() & types.IsConstType { + case types.IsBoolean: + val = constant.MakeBool(r.bool()) + + case types.IsString: + val = constant.MakeString(r.string()) + + case types.IsInteger: + val = r.mpint(b) + + case types.IsFloat: + val = r.mpfloat(b) + + case types.IsComplex: + re := r.mpfloat(b) + im := r.mpfloat(b) + val = constant.BinaryOp(re, token.ADD, constant.MakeImag(im)) + + default: + if b.Kind() == types.Invalid { + val = constant.MakeUnknown() + return + } + errorf("unexpected type %v", typ) // panics + panic("unreachable") + } + + return +} + +func intSize(b *types.Basic) (signed bool, maxBytes uint) { + if (b.Info() & types.IsUntyped) != 0 { + return true, 64 + } + + switch b.Kind() { + case types.Float32, types.Complex64: + return true, 3 + case types.Float64, types.Complex128: + return true, 7 + } + + signed = (b.Info() & types.IsUnsigned) == 0 + switch b.Kind() { + case types.Int8, types.Uint8: + maxBytes = 1 + case types.Int16, types.Uint16: + maxBytes = 2 + case types.Int32, types.Uint32: + maxBytes = 4 + default: + maxBytes = 8 + } + + return +} + +func (r *importReader) mpint(b *types.Basic) constant.Value { + signed, maxBytes := intSize(b) + + maxSmall := 256 - maxBytes + if signed { + maxSmall = 256 - 2*maxBytes + } + if maxBytes == 1 { + maxSmall = 256 + } + + n, _ := r.declReader.ReadByte() + if uint(n) < maxSmall { + v := int64(n) + if signed { + v >>= 1 + if n&1 != 0 { + v = ^v + } + } + return constant.MakeInt64(v) + } + + v := -n + if signed { + v = -(n &^ 1) >> 1 + } + if v < 1 || uint(v) > maxBytes { + errorf("weird decoding: %v, %v => %v", n, signed, v) + } + + buf := make([]byte, v) + io.ReadFull(&r.declReader, buf) + + // convert to little endian + // TODO(gri) go/constant should have a more direct conversion function + // (e.g., once it supports a big.Float based implementation) + for i, j := 0, len(buf)-1; i < j; i, j = i+1, j-1 { + buf[i], buf[j] = buf[j], buf[i] + } + + x := constant.MakeFromBytes(buf) + if signed && n&1 != 0 { + x = constant.UnaryOp(token.SUB, x, 0) + } + return x +} + +func (r *importReader) mpfloat(b *types.Basic) constant.Value { + x := r.mpint(b) + if constant.Sign(x) == 0 { + return x + } + + exp := r.int64() + switch { + case exp > 0: + x = constant.Shift(x, token.SHL, uint(exp)) + case exp < 0: + d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp)) + x = constant.BinaryOp(x, token.QUO, d) + } + return x +} + +func (r *importReader) ident() string { + return r.string() +} + +func (r *importReader) qualifiedIdent() (*types.Package, string) { + name := r.string() + pkg := r.pkg() + return pkg, name +} + +func (r *importReader) pos() token.Pos { + if r.p.version >= 1 { + r.posv1() + } else { + r.posv0() + } + + if r.prevFile == "" && r.prevLine == 0 && r.prevColumn == 0 { + return token.NoPos + } + return r.p.fake.pos(r.prevFile, int(r.prevLine), int(r.prevColumn)) +} + +func (r *importReader) posv0() { + delta := r.int64() + if delta != deltaNewFile { + r.prevLine += delta + } else if l := r.int64(); l == -1 { + r.prevLine += deltaNewFile + } else { + r.prevFile = r.string() + r.prevLine = l + } +} + +func (r *importReader) posv1() { + delta := r.int64() + r.prevColumn += delta >> 1 + if delta&1 != 0 { + delta = r.int64() + r.prevLine += delta >> 1 + if delta&1 != 0 { + r.prevFile = r.string() + } + } +} + +func (r *importReader) typ() types.Type { + return r.p.typAt(r.uint64(), nil) +} + +func isInterface(t types.Type) bool { + _, ok := t.(*types.Interface) + return ok +} + +func (r *importReader) pkg() *types.Package { return r.p.pkgAt(r.uint64()) } +func (r *importReader) string() string { return r.p.stringAt(r.uint64()) } + +func (r *importReader) doType(base *types.Named) types.Type { + switch k := r.kind(); k { + default: + errorf("unexpected kind tag in %q: %v", r.p.ipath, k) + return nil + + case definedType: + pkg, name := r.qualifiedIdent() + r.p.doDecl(pkg, name) + return pkg.Scope().Lookup(name).(*types.TypeName).Type() + case pointerType: + return types.NewPointer(r.typ()) + case sliceType: + return types.NewSlice(r.typ()) + case arrayType: + n := r.uint64() + return types.NewArray(r.typ(), int64(n)) + case chanType: + dir := chanDir(int(r.uint64())) + return types.NewChan(dir, r.typ()) + case mapType: + return types.NewMap(r.typ(), r.typ()) + case signatureType: + r.currPkg = r.pkg() + return r.signature(nil) + + case structType: + r.currPkg = r.pkg() + + fields := make([]*types.Var, r.uint64()) + tags := make([]string, len(fields)) + for i := range fields { + fpos := r.pos() + fname := r.ident() + ftyp := r.typ() + emb := r.bool() + tag := r.string() + + fields[i] = types.NewField(fpos, r.currPkg, fname, ftyp, emb) + tags[i] = tag + } + return types.NewStruct(fields, tags) + + case interfaceType: + r.currPkg = r.pkg() + + embeddeds := make([]types.Type, r.uint64()) + for i := range embeddeds { + _ = r.pos() + embeddeds[i] = r.typ() + } + + methods := make([]*types.Func, r.uint64()) + for i := range methods { + mpos := r.pos() + mname := r.ident() + + // TODO(mdempsky): Matches bimport.go, but I + // don't agree with this. + var recv *types.Var + if base != nil { + recv = types.NewVar(token.NoPos, r.currPkg, "", base) + } + + msig := r.signature(recv) + methods[i] = types.NewFunc(mpos, r.currPkg, mname, msig) + } + + typ := newInterface(methods, embeddeds) + r.p.interfaceList = append(r.p.interfaceList, typ) + return typ + } +} + +func (r *importReader) kind() itag { + return itag(r.uint64()) +} + +func (r *importReader) signature(recv *types.Var) *types.Signature { + params := r.paramList() + results := r.paramList() + variadic := params.Len() > 0 && r.bool() + return types.NewSignature(recv, params, results, variadic) +} + +func (r *importReader) paramList() *types.Tuple { + xs := make([]*types.Var, r.uint64()) + for i := range xs { + xs[i] = r.param() + } + return types.NewTuple(xs...) +} + +func (r *importReader) param() *types.Var { + pos := r.pos() + name := r.ident() + typ := r.typ() + return types.NewParam(pos, r.currPkg, name, typ) +} + +func (r *importReader) bool() bool { + return r.uint64() != 0 +} + +func (r *importReader) int64() int64 { + n, err := binary.ReadVarint(&r.declReader) + if err != nil { + errorf("readVarint: %v", err) + } + return n +} + +func (r *importReader) uint64() uint64 { + n, err := binary.ReadUvarint(&r.declReader) + if err != nil { + errorf("readUvarint: %v", err) + } + return n +} + +func (r *importReader) byte() byte { + x, err := r.declReader.ReadByte() + if err != nil { + errorf("declReader.ReadByte: %v", err) + } + return x +} diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface10.go b/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface10.go new file mode 100644 index 00000000..463f2522 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface10.go @@ -0,0 +1,21 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.11 + +package gcimporter + +import "go/types" + +func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface { + named := make([]*types.Named, len(embeddeds)) + for i, e := range embeddeds { + var ok bool + named[i], ok = e.(*types.Named) + if !ok { + panic("embedding of non-defined interfaces in interfaces is not supported before Go 1.11") + } + } + return types.NewInterface(methods, named) +} diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface11.go b/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface11.go new file mode 100644 index 00000000..ab28b95c --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface11.go @@ -0,0 +1,13 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.11 + +package gcimporter + +import "go/types" + +func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface { + return types.NewInterfaceType(methods, embeddeds) +} diff --git a/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go b/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go new file mode 100644 index 00000000..dc6177c1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go @@ -0,0 +1,117 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package packagesdriver fetches type sizes for go/packages and go/analysis. +package packagesdriver + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "go/types" + "os/exec" + "strings" + + "golang.org/x/tools/internal/gocommand" +) + +var debug = false + +func GetSizes(ctx context.Context, buildFlags, env []string, gocmdRunner *gocommand.Runner, dir string) (types.Sizes, error) { + // TODO(matloob): Clean this up. This code is mostly a copy of packages.findExternalDriver. + const toolPrefix = "GOPACKAGESDRIVER=" + tool := "" + for _, env := range env { + if val := strings.TrimPrefix(env, toolPrefix); val != env { + tool = val + } + } + + if tool == "" { + var err error + tool, err = exec.LookPath("gopackagesdriver") + if err != nil { + // We did not find the driver, so use "go list". + tool = "off" + } + } + + if tool == "off" { + return GetSizesGolist(ctx, buildFlags, env, gocmdRunner, dir) + } + + req, err := json.Marshal(struct { + Command string `json:"command"` + Env []string `json:"env"` + BuildFlags []string `json:"build_flags"` + }{ + Command: "sizes", + Env: env, + BuildFlags: buildFlags, + }) + if err != nil { + return nil, fmt.Errorf("failed to encode message to driver tool: %v", err) + } + + buf := new(bytes.Buffer) + cmd := exec.CommandContext(ctx, tool) + cmd.Dir = dir + cmd.Env = env + cmd.Stdin = bytes.NewReader(req) + cmd.Stdout = buf + cmd.Stderr = new(bytes.Buffer) + if err := cmd.Run(); err != nil { + return nil, fmt.Errorf("%v: %v: %s", tool, err, cmd.Stderr) + } + var response struct { + // Sizes, if not nil, is the types.Sizes to use when type checking. + Sizes *types.StdSizes + } + if err := json.Unmarshal(buf.Bytes(), &response); err != nil { + return nil, err + } + return response.Sizes, nil +} + +func GetSizesGolist(ctx context.Context, buildFlags, env []string, gocmdRunner *gocommand.Runner, dir string) (types.Sizes, error) { + inv := gocommand.Invocation{ + Verb: "list", + Args: []string{"-f", "{{context.GOARCH}} {{context.Compiler}}", "--", "unsafe"}, + Env: env, + BuildFlags: buildFlags, + WorkingDir: dir, + } + stdout, stderr, friendlyErr, rawErr := gocmdRunner.RunRaw(ctx, inv) + var goarch, compiler string + if rawErr != nil { + if strings.Contains(rawErr.Error(), "cannot find main module") { + // User's running outside of a module. All bets are off. Get GOARCH and guess compiler is gc. + // TODO(matloob): Is this a problem in practice? + inv := gocommand.Invocation{ + Verb: "env", + Args: []string{"GOARCH"}, + Env: env, + WorkingDir: dir, + } + envout, enverr := gocmdRunner.Run(ctx, inv) + if enverr != nil { + return nil, enverr + } + goarch = strings.TrimSpace(envout.String()) + compiler = "gc" + } else { + return nil, friendlyErr + } + } else { + fields := strings.Fields(stdout.String()) + if len(fields) < 2 { + return nil, fmt.Errorf("could not parse GOARCH and Go compiler in format \" \":\nstdout: <<%s>>\nstderr: <<%s>>", + stdout.String(), stderr.String()) + } + goarch = fields[0] + compiler = fields[1] + } + return types.SizesFor(compiler, goarch), nil +} diff --git a/vendor/golang.org/x/tools/go/packages/doc.go b/vendor/golang.org/x/tools/go/packages/doc.go new file mode 100644 index 00000000..4bfe28a5 --- /dev/null +++ b/vendor/golang.org/x/tools/go/packages/doc.go @@ -0,0 +1,221 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package packages loads Go packages for inspection and analysis. + +The Load function takes as input a list of patterns and return a list of Package +structs describing individual packages matched by those patterns. +The LoadMode controls the amount of detail in the loaded packages. + +Load passes most patterns directly to the underlying build tool, +but all patterns with the prefix "query=", where query is a +non-empty string of letters from [a-z], are reserved and may be +interpreted as query operators. + +Two query operators are currently supported: "file" and "pattern". + +The query "file=path/to/file.go" matches the package or packages enclosing +the Go source file path/to/file.go. For example "file=~/go/src/fmt/print.go" +might return the packages "fmt" and "fmt [fmt.test]". + +The query "pattern=string" causes "string" to be passed directly to +the underlying build tool. In most cases this is unnecessary, +but an application can use Load("pattern=" + x) as an escaping mechanism +to ensure that x is not interpreted as a query operator if it contains '='. + +All other query operators are reserved for future use and currently +cause Load to report an error. + +The Package struct provides basic information about the package, including + + - ID, a unique identifier for the package in the returned set; + - GoFiles, the names of the package's Go source files; + - Imports, a map from source import strings to the Packages they name; + - Types, the type information for the package's exported symbols; + - Syntax, the parsed syntax trees for the package's source code; and + - TypeInfo, the result of a complete type-check of the package syntax trees. + +(See the documentation for type Package for the complete list of fields +and more detailed descriptions.) + +For example, + + Load(nil, "bytes", "unicode...") + +returns four Package structs describing the standard library packages +bytes, unicode, unicode/utf16, and unicode/utf8. Note that one pattern +can match multiple packages and that a package might be matched by +multiple patterns: in general it is not possible to determine which +packages correspond to which patterns. + +Note that the list returned by Load contains only the packages matched +by the patterns. Their dependencies can be found by walking the import +graph using the Imports fields. + +The Load function can be configured by passing a pointer to a Config as +the first argument. A nil Config is equivalent to the zero Config, which +causes Load to run in LoadFiles mode, collecting minimal information. +See the documentation for type Config for details. + +As noted earlier, the Config.Mode controls the amount of detail +reported about the loaded packages. See the documentation for type LoadMode +for details. + +Most tools should pass their command-line arguments (after any flags) +uninterpreted to the loader, so that the loader can interpret them +according to the conventions of the underlying build system. +See the Example function for typical usage. + +*/ +package packages // import "golang.org/x/tools/go/packages" + +/* + +Motivation and design considerations + +The new package's design solves problems addressed by two existing +packages: go/build, which locates and describes packages, and +golang.org/x/tools/go/loader, which loads, parses and type-checks them. +The go/build.Package structure encodes too much of the 'go build' way +of organizing projects, leaving us in need of a data type that describes a +package of Go source code independent of the underlying build system. +We wanted something that works equally well with go build and vgo, and +also other build systems such as Bazel and Blaze, making it possible to +construct analysis tools that work in all these environments. +Tools such as errcheck and staticcheck were essentially unavailable to +the Go community at Google, and some of Google's internal tools for Go +are unavailable externally. +This new package provides a uniform way to obtain package metadata by +querying each of these build systems, optionally supporting their +preferred command-line notations for packages, so that tools integrate +neatly with users' build environments. The Metadata query function +executes an external query tool appropriate to the current workspace. + +Loading packages always returns the complete import graph "all the way down", +even if all you want is information about a single package, because the query +mechanisms of all the build systems we currently support ({go,vgo} list, and +blaze/bazel aspect-based query) cannot provide detailed information +about one package without visiting all its dependencies too, so there is +no additional asymptotic cost to providing transitive information. +(This property might not be true of a hypothetical 5th build system.) + +In calls to TypeCheck, all initial packages, and any package that +transitively depends on one of them, must be loaded from source. +Consider A->B->C->D->E: if A,C are initial, A,B,C must be loaded from +source; D may be loaded from export data, and E may not be loaded at all +(though it's possible that D's export data mentions it, so a +types.Package may be created for it and exposed.) + +The old loader had a feature to suppress type-checking of function +bodies on a per-package basis, primarily intended to reduce the work of +obtaining type information for imported packages. Now that imports are +satisfied by export data, the optimization no longer seems necessary. + +Despite some early attempts, the old loader did not exploit export data, +instead always using the equivalent of WholeProgram mode. This was due +to the complexity of mixing source and export data packages (now +resolved by the upward traversal mentioned above), and because export data +files were nearly always missing or stale. Now that 'go build' supports +caching, all the underlying build systems can guarantee to produce +export data in a reasonable (amortized) time. + +Test "main" packages synthesized by the build system are now reported as +first-class packages, avoiding the need for clients (such as go/ssa) to +reinvent this generation logic. + +One way in which go/packages is simpler than the old loader is in its +treatment of in-package tests. In-package tests are packages that +consist of all the files of the library under test, plus the test files. +The old loader constructed in-package tests by a two-phase process of +mutation called "augmentation": first it would construct and type check +all the ordinary library packages and type-check the packages that +depend on them; then it would add more (test) files to the package and +type-check again. This two-phase approach had four major problems: +1) in processing the tests, the loader modified the library package, + leaving no way for a client application to see both the test + package and the library package; one would mutate into the other. +2) because test files can declare additional methods on types defined in + the library portion of the package, the dispatch of method calls in + the library portion was affected by the presence of the test files. + This should have been a clue that the packages were logically + different. +3) this model of "augmentation" assumed at most one in-package test + per library package, which is true of projects using 'go build', + but not other build systems. +4) because of the two-phase nature of test processing, all packages that + import the library package had to be processed before augmentation, + forcing a "one-shot" API and preventing the client from calling Load + in several times in sequence as is now possible in WholeProgram mode. + (TypeCheck mode has a similar one-shot restriction for a different reason.) + +Early drafts of this package supported "multi-shot" operation. +Although it allowed clients to make a sequence of calls (or concurrent +calls) to Load, building up the graph of Packages incrementally, +it was of marginal value: it complicated the API +(since it allowed some options to vary across calls but not others), +it complicated the implementation, +it cannot be made to work in Types mode, as explained above, +and it was less efficient than making one combined call (when this is possible). +Among the clients we have inspected, none made multiple calls to load +but could not be easily and satisfactorily modified to make only a single call. +However, applications changes may be required. +For example, the ssadump command loads the user-specified packages +and in addition the runtime package. It is tempting to simply append +"runtime" to the user-provided list, but that does not work if the user +specified an ad-hoc package such as [a.go b.go]. +Instead, ssadump no longer requests the runtime package, +but seeks it among the dependencies of the user-specified packages, +and emits an error if it is not found. + +Overlays: The Overlay field in the Config allows providing alternate contents +for Go source files, by providing a mapping from file path to contents. +go/packages will pull in new imports added in overlay files when go/packages +is run in LoadImports mode or greater. +Overlay support for the go list driver isn't complete yet: if the file doesn't +exist on disk, it will only be recognized in an overlay if it is a non-test file +and the package would be reported even without the overlay. + +Questions & Tasks + +- Add GOARCH/GOOS? + They are not portable concepts, but could be made portable. + Our goal has been to allow users to express themselves using the conventions + of the underlying build system: if the build system honors GOARCH + during a build and during a metadata query, then so should + applications built atop that query mechanism. + Conversely, if the target architecture of the build is determined by + command-line flags, the application can pass the relevant + flags through to the build system using a command such as: + myapp -query_flag="--cpu=amd64" -query_flag="--os=darwin" + However, this approach is low-level, unwieldy, and non-portable. + GOOS and GOARCH seem important enough to warrant a dedicated option. + +- How should we handle partial failures such as a mixture of good and + malformed patterns, existing and non-existent packages, successful and + failed builds, import failures, import cycles, and so on, in a call to + Load? + +- Support bazel, blaze, and go1.10 list, not just go1.11 list. + +- Handle (and test) various partial success cases, e.g. + a mixture of good packages and: + invalid patterns + nonexistent packages + empty packages + packages with malformed package or import declarations + unreadable files + import cycles + other parse errors + type errors + Make sure we record errors at the correct place in the graph. + +- Missing packages among initial arguments are not reported. + Return bogus packages for them, like golist does. + +- "undeclared name" errors (for example) are reported out of source file + order. I suspect this is due to the breadth-first resolution now used + by go/types. Is that a bug? Discuss with gri. + +*/ diff --git a/vendor/golang.org/x/tools/go/packages/external.go b/vendor/golang.org/x/tools/go/packages/external.go new file mode 100644 index 00000000..8c8473fd --- /dev/null +++ b/vendor/golang.org/x/tools/go/packages/external.go @@ -0,0 +1,101 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file enables an external tool to intercept package requests. +// If the tool is present then its results are used in preference to +// the go list command. + +package packages + +import ( + "bytes" + "encoding/json" + "fmt" + "os" + "os/exec" + "strings" +) + +// The Driver Protocol +// +// The driver, given the inputs to a call to Load, returns metadata about the packages specified. +// This allows for different build systems to support go/packages by telling go/packages how the +// packages' source is organized. +// The driver is a binary, either specified by the GOPACKAGESDRIVER environment variable or in +// the path as gopackagesdriver. It's given the inputs to load in its argv. See the package +// documentation in doc.go for the full description of the patterns that need to be supported. +// A driver receives as a JSON-serialized driverRequest struct in standard input and will +// produce a JSON-serialized driverResponse (see definition in packages.go) in its standard output. + +// driverRequest is used to provide the portion of Load's Config that is needed by a driver. +type driverRequest struct { + Mode LoadMode `json:"mode"` + // Env specifies the environment the underlying build system should be run in. + Env []string `json:"env"` + // BuildFlags are flags that should be passed to the underlying build system. + BuildFlags []string `json:"build_flags"` + // Tests specifies whether the patterns should also return test packages. + Tests bool `json:"tests"` + // Overlay maps file paths (relative to the driver's working directory) to the byte contents + // of overlay files. + Overlay map[string][]byte `json:"overlay"` +} + +// findExternalDriver returns the file path of a tool that supplies +// the build system package structure, or "" if not found." +// If GOPACKAGESDRIVER is set in the environment findExternalTool returns its +// value, otherwise it searches for a binary named gopackagesdriver on the PATH. +func findExternalDriver(cfg *Config) driver { + const toolPrefix = "GOPACKAGESDRIVER=" + tool := "" + for _, env := range cfg.Env { + if val := strings.TrimPrefix(env, toolPrefix); val != env { + tool = val + } + } + if tool != "" && tool == "off" { + return nil + } + if tool == "" { + var err error + tool, err = exec.LookPath("gopackagesdriver") + if err != nil { + return nil + } + } + return func(cfg *Config, words ...string) (*driverResponse, error) { + req, err := json.Marshal(driverRequest{ + Mode: cfg.Mode, + Env: cfg.Env, + BuildFlags: cfg.BuildFlags, + Tests: cfg.Tests, + Overlay: cfg.Overlay, + }) + if err != nil { + return nil, fmt.Errorf("failed to encode message to driver tool: %v", err) + } + + buf := new(bytes.Buffer) + stderr := new(bytes.Buffer) + cmd := exec.CommandContext(cfg.Context, tool, words...) + cmd.Dir = cfg.Dir + cmd.Env = cfg.Env + cmd.Stdin = bytes.NewReader(req) + cmd.Stdout = buf + cmd.Stderr = stderr + + if err := cmd.Run(); err != nil { + return nil, fmt.Errorf("%v: %v: %s", tool, err, cmd.Stderr) + } + if len(stderr.Bytes()) != 0 && os.Getenv("GOPACKAGESPRINTDRIVERERRORS") != "" { + fmt.Fprintf(os.Stderr, "%s stderr: <<%s>>\n", cmdDebugStr(cmd, words...), stderr) + } + + var response driverResponse + if err := json.Unmarshal(buf.Bytes(), &response); err != nil { + return nil, err + } + return &response, nil + } +} diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go new file mode 100644 index 00000000..88ca6691 --- /dev/null +++ b/vendor/golang.org/x/tools/go/packages/golist.go @@ -0,0 +1,889 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packages + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "go/types" + "log" + "os" + "os/exec" + "path" + "path/filepath" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "unicode" + + "golang.org/x/tools/go/internal/packagesdriver" + "golang.org/x/tools/internal/gocommand" + "golang.org/x/tools/internal/packagesinternal" + "golang.org/x/xerrors" +) + +// debug controls verbose logging. +var debug, _ = strconv.ParseBool(os.Getenv("GOPACKAGESDEBUG")) + +// A goTooOldError reports that the go command +// found by exec.LookPath is too old to use the new go list behavior. +type goTooOldError struct { + error +} + +// responseDeduper wraps a driverResponse, deduplicating its contents. +type responseDeduper struct { + seenRoots map[string]bool + seenPackages map[string]*Package + dr *driverResponse +} + +func newDeduper() *responseDeduper { + return &responseDeduper{ + dr: &driverResponse{}, + seenRoots: map[string]bool{}, + seenPackages: map[string]*Package{}, + } +} + +// addAll fills in r with a driverResponse. +func (r *responseDeduper) addAll(dr *driverResponse) { + for _, pkg := range dr.Packages { + r.addPackage(pkg) + } + for _, root := range dr.Roots { + r.addRoot(root) + } +} + +func (r *responseDeduper) addPackage(p *Package) { + if r.seenPackages[p.ID] != nil { + return + } + r.seenPackages[p.ID] = p + r.dr.Packages = append(r.dr.Packages, p) +} + +func (r *responseDeduper) addRoot(id string) { + if r.seenRoots[id] { + return + } + r.seenRoots[id] = true + r.dr.Roots = append(r.dr.Roots, id) +} + +type golistState struct { + cfg *Config + ctx context.Context + + envOnce sync.Once + goEnvError error + goEnv map[string]string + + rootsOnce sync.Once + rootDirsError error + rootDirs map[string]string + + // vendorDirs caches the (non)existence of vendor directories. + vendorDirs map[string]bool +} + +// getEnv returns Go environment variables. Only specific variables are +// populated -- computing all of them is slow. +func (state *golistState) getEnv() (map[string]string, error) { + state.envOnce.Do(func() { + var b *bytes.Buffer + b, state.goEnvError = state.invokeGo("env", "-json", "GOMOD", "GOPATH") + if state.goEnvError != nil { + return + } + + state.goEnv = make(map[string]string) + decoder := json.NewDecoder(b) + if state.goEnvError = decoder.Decode(&state.goEnv); state.goEnvError != nil { + return + } + }) + return state.goEnv, state.goEnvError +} + +// mustGetEnv is a convenience function that can be used if getEnv has already succeeded. +func (state *golistState) mustGetEnv() map[string]string { + env, err := state.getEnv() + if err != nil { + panic(fmt.Sprintf("mustGetEnv: %v", err)) + } + return env +} + +// goListDriver uses the go list command to interpret the patterns and produce +// the build system package structure. +// See driver for more details. +func goListDriver(cfg *Config, patterns ...string) (*driverResponse, error) { + // Make sure that any asynchronous go commands are killed when we return. + parentCtx := cfg.Context + if parentCtx == nil { + parentCtx = context.Background() + } + ctx, cancel := context.WithCancel(parentCtx) + defer cancel() + + response := newDeduper() + + // Fill in response.Sizes asynchronously if necessary. + var sizeserr error + var sizeswg sync.WaitGroup + if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&NeedTypes != 0 { + sizeswg.Add(1) + go func() { + var sizes types.Sizes + sizes, sizeserr = packagesdriver.GetSizesGolist(ctx, cfg.BuildFlags, cfg.Env, cfg.gocmdRunner, cfg.Dir) + // types.SizesFor always returns nil or a *types.StdSizes. + response.dr.Sizes, _ = sizes.(*types.StdSizes) + sizeswg.Done() + }() + } + + state := &golistState{ + cfg: cfg, + ctx: ctx, + vendorDirs: map[string]bool{}, + } + + // Determine files requested in contains patterns + var containFiles []string + restPatterns := make([]string, 0, len(patterns)) + // Extract file= and other [querytype]= patterns. Report an error if querytype + // doesn't exist. +extractQueries: + for _, pattern := range patterns { + eqidx := strings.Index(pattern, "=") + if eqidx < 0 { + restPatterns = append(restPatterns, pattern) + } else { + query, value := pattern[:eqidx], pattern[eqidx+len("="):] + switch query { + case "file": + containFiles = append(containFiles, value) + case "pattern": + restPatterns = append(restPatterns, value) + case "": // not a reserved query + restPatterns = append(restPatterns, pattern) + default: + for _, rune := range query { + if rune < 'a' || rune > 'z' { // not a reserved query + restPatterns = append(restPatterns, pattern) + continue extractQueries + } + } + // Reject all other patterns containing "=" + return nil, fmt.Errorf("invalid query type %q in query pattern %q", query, pattern) + } + } + } + + // See if we have any patterns to pass through to go list. Zero initial + // patterns also requires a go list call, since it's the equivalent of + // ".". + if len(restPatterns) > 0 || len(patterns) == 0 { + dr, err := state.createDriverResponse(restPatterns...) + if err != nil { + return nil, err + } + response.addAll(dr) + } + + if len(containFiles) != 0 { + if err := state.runContainsQueries(response, containFiles); err != nil { + return nil, err + } + } + + modifiedPkgs, needPkgs, err := state.processGolistOverlay(response) + if err != nil { + return nil, err + } + + var containsCandidates []string + if len(containFiles) > 0 { + containsCandidates = append(containsCandidates, modifiedPkgs...) + containsCandidates = append(containsCandidates, needPkgs...) + } + if err := state.addNeededOverlayPackages(response, needPkgs); err != nil { + return nil, err + } + // Check candidate packages for containFiles. + if len(containFiles) > 0 { + for _, id := range containsCandidates { + pkg, ok := response.seenPackages[id] + if !ok { + response.addPackage(&Package{ + ID: id, + Errors: []Error{ + { + Kind: ListError, + Msg: fmt.Sprintf("package %s expected but not seen", id), + }, + }, + }) + continue + } + for _, f := range containFiles { + for _, g := range pkg.GoFiles { + if sameFile(f, g) { + response.addRoot(id) + } + } + } + } + } + + sizeswg.Wait() + if sizeserr != nil { + return nil, sizeserr + } + return response.dr, nil +} + +func (state *golistState) addNeededOverlayPackages(response *responseDeduper, pkgs []string) error { + if len(pkgs) == 0 { + return nil + } + dr, err := state.createDriverResponse(pkgs...) + if err != nil { + return err + } + for _, pkg := range dr.Packages { + response.addPackage(pkg) + } + _, needPkgs, err := state.processGolistOverlay(response) + if err != nil { + return err + } + return state.addNeededOverlayPackages(response, needPkgs) +} + +func (state *golistState) runContainsQueries(response *responseDeduper, queries []string) error { + for _, query := range queries { + // TODO(matloob): Do only one query per directory. + fdir := filepath.Dir(query) + // Pass absolute path of directory to go list so that it knows to treat it as a directory, + // not a package path. + pattern, err := filepath.Abs(fdir) + if err != nil { + return fmt.Errorf("could not determine absolute path of file= query path %q: %v", query, err) + } + dirResponse, err := state.createDriverResponse(pattern) + + // If there was an error loading the package, or the package is returned + // with errors, try to load the file as an ad-hoc package. + // Usually the error will appear in a returned package, but may not if we're + // in module mode and the ad-hoc is located outside a module. + if err != nil || len(dirResponse.Packages) == 1 && len(dirResponse.Packages[0].GoFiles) == 0 && + len(dirResponse.Packages[0].Errors) == 1 { + var queryErr error + if dirResponse, queryErr = state.adhocPackage(pattern, query); queryErr != nil { + return err // return the original error + } + } + isRoot := make(map[string]bool, len(dirResponse.Roots)) + for _, root := range dirResponse.Roots { + isRoot[root] = true + } + for _, pkg := range dirResponse.Packages { + // Add any new packages to the main set + // We don't bother to filter packages that will be dropped by the changes of roots, + // that will happen anyway during graph construction outside this function. + // Over-reporting packages is not a problem. + response.addPackage(pkg) + // if the package was not a root one, it cannot have the file + if !isRoot[pkg.ID] { + continue + } + for _, pkgFile := range pkg.GoFiles { + if filepath.Base(query) == filepath.Base(pkgFile) { + response.addRoot(pkg.ID) + break + } + } + } + } + return nil +} + +// adhocPackage attempts to load or construct an ad-hoc package for a given +// query, if the original call to the driver produced inadequate results. +func (state *golistState) adhocPackage(pattern, query string) (*driverResponse, error) { + response, err := state.createDriverResponse(query) + if err != nil { + return nil, err + } + // If we get nothing back from `go list`, + // try to make this file into its own ad-hoc package. + // TODO(rstambler): Should this check against the original response? + if len(response.Packages) == 0 { + response.Packages = append(response.Packages, &Package{ + ID: "command-line-arguments", + PkgPath: query, + GoFiles: []string{query}, + CompiledGoFiles: []string{query}, + Imports: make(map[string]*Package), + }) + response.Roots = append(response.Roots, "command-line-arguments") + } + // Handle special cases. + if len(response.Packages) == 1 { + // golang/go#33482: If this is a file= query for ad-hoc packages where + // the file only exists on an overlay, and exists outside of a module, + // add the file to the package and remove the errors. + if response.Packages[0].ID == "command-line-arguments" || + filepath.ToSlash(response.Packages[0].PkgPath) == filepath.ToSlash(query) { + if len(response.Packages[0].GoFiles) == 0 { + filename := filepath.Join(pattern, filepath.Base(query)) // avoid recomputing abspath + // TODO(matloob): check if the file is outside of a root dir? + for path := range state.cfg.Overlay { + if path == filename { + response.Packages[0].Errors = nil + response.Packages[0].GoFiles = []string{path} + response.Packages[0].CompiledGoFiles = []string{path} + } + } + } + } + } + return response, nil +} + +// Fields must match go list; +// see $GOROOT/src/cmd/go/internal/load/pkg.go. +type jsonPackage struct { + ImportPath string + Dir string + Name string + Export string + GoFiles []string + CompiledGoFiles []string + CFiles []string + CgoFiles []string + CXXFiles []string + MFiles []string + HFiles []string + FFiles []string + SFiles []string + SwigFiles []string + SwigCXXFiles []string + SysoFiles []string + Imports []string + ImportMap map[string]string + Deps []string + Module *packagesinternal.Module + TestGoFiles []string + TestImports []string + XTestGoFiles []string + XTestImports []string + ForTest string // q in a "p [q.test]" package, else "" + DepOnly bool + + Error *jsonPackageError +} + +type jsonPackageError struct { + ImportStack []string + Pos string + Err string +} + +func otherFiles(p *jsonPackage) [][]string { + return [][]string{p.CFiles, p.CXXFiles, p.MFiles, p.HFiles, p.FFiles, p.SFiles, p.SwigFiles, p.SwigCXXFiles, p.SysoFiles} +} + +// createDriverResponse uses the "go list" command to expand the pattern +// words and return a response for the specified packages. +func (state *golistState) createDriverResponse(words ...string) (*driverResponse, error) { + // go list uses the following identifiers in ImportPath and Imports: + // + // "p" -- importable package or main (command) + // "q.test" -- q's test executable + // "p [q.test]" -- variant of p as built for q's test executable + // "q_test [q.test]" -- q's external test package + // + // The packages p that are built differently for a test q.test + // are q itself, plus any helpers used by the external test q_test, + // typically including "testing" and all its dependencies. + + // Run "go list" for complete + // information on the specified packages. + buf, err := state.invokeGo("list", golistargs(state.cfg, words)...) + if err != nil { + return nil, err + } + seen := make(map[string]*jsonPackage) + pkgs := make(map[string]*Package) + additionalErrors := make(map[string][]Error) + // Decode the JSON and convert it to Package form. + var response driverResponse + for dec := json.NewDecoder(buf); dec.More(); { + p := new(jsonPackage) + if err := dec.Decode(p); err != nil { + return nil, fmt.Errorf("JSON decoding failed: %v", err) + } + + if p.ImportPath == "" { + // The documentation for go list says that “[e]rroneous packages will have + // a non-empty ImportPath”. If for some reason it comes back empty, we + // prefer to error out rather than silently discarding data or handing + // back a package without any way to refer to it. + if p.Error != nil { + return nil, Error{ + Pos: p.Error.Pos, + Msg: p.Error.Err, + } + } + return nil, fmt.Errorf("package missing import path: %+v", p) + } + + // Work around https://golang.org/issue/33157: + // go list -e, when given an absolute path, will find the package contained at + // that directory. But when no package exists there, it will return a fake package + // with an error and the ImportPath set to the absolute path provided to go list. + // Try to convert that absolute path to what its package path would be if it's + // contained in a known module or GOPATH entry. This will allow the package to be + // properly "reclaimed" when overlays are processed. + if filepath.IsAbs(p.ImportPath) && p.Error != nil { + pkgPath, ok, err := state.getPkgPath(p.ImportPath) + if err != nil { + return nil, err + } + if ok { + p.ImportPath = pkgPath + } + } + + if old, found := seen[p.ImportPath]; found { + // If one version of the package has an error, and the other doesn't, assume + // that this is a case where go list is reporting a fake dependency variant + // of the imported package: When a package tries to invalidly import another + // package, go list emits a variant of the imported package (with the same + // import path, but with an error on it, and the package will have a + // DepError set on it). An example of when this can happen is for imports of + // main packages: main packages can not be imported, but they may be + // separately matched and listed by another pattern. + // See golang.org/issue/36188 for more details. + + // The plan is that eventually, hopefully in Go 1.15, the error will be + // reported on the importing package rather than the duplicate "fake" + // version of the imported package. Once all supported versions of Go + // have the new behavior this logic can be deleted. + // TODO(matloob): delete the workaround logic once all supported versions of + // Go return the errors on the proper package. + + // There should be exactly one version of a package that doesn't have an + // error. + if old.Error == nil && p.Error == nil { + if !reflect.DeepEqual(p, old) { + return nil, fmt.Errorf("internal error: go list gives conflicting information for package %v", p.ImportPath) + } + continue + } + + // Determine if this package's error needs to be bubbled up. + // This is a hack, and we expect for go list to eventually set the error + // on the package. + if old.Error != nil { + var errkind string + if strings.Contains(old.Error.Err, "not an importable package") { + errkind = "not an importable package" + } else if strings.Contains(old.Error.Err, "use of internal package") && strings.Contains(old.Error.Err, "not allowed") { + errkind = "use of internal package not allowed" + } + if errkind != "" { + if len(old.Error.ImportStack) < 1 { + return nil, fmt.Errorf(`internal error: go list gave a %q error with empty import stack`, errkind) + } + importingPkg := old.Error.ImportStack[len(old.Error.ImportStack)-1] + if importingPkg == old.ImportPath { + // Using an older version of Go which put this package itself on top of import + // stack, instead of the importer. Look for importer in second from top + // position. + if len(old.Error.ImportStack) < 2 { + return nil, fmt.Errorf(`internal error: go list gave a %q error with an import stack without importing package`, errkind) + } + importingPkg = old.Error.ImportStack[len(old.Error.ImportStack)-2] + } + additionalErrors[importingPkg] = append(additionalErrors[importingPkg], Error{ + Pos: old.Error.Pos, + Msg: old.Error.Err, + Kind: ListError, + }) + } + } + + // Make sure that if there's a version of the package without an error, + // that's the one reported to the user. + if old.Error == nil { + continue + } + + // This package will replace the old one at the end of the loop. + } + seen[p.ImportPath] = p + + pkg := &Package{ + Name: p.Name, + ID: p.ImportPath, + GoFiles: absJoin(p.Dir, p.GoFiles, p.CgoFiles), + CompiledGoFiles: absJoin(p.Dir, p.CompiledGoFiles), + OtherFiles: absJoin(p.Dir, otherFiles(p)...), + forTest: p.ForTest, + module: p.Module, + } + + // Work around https://golang.org/issue/28749: + // cmd/go puts assembly, C, and C++ files in CompiledGoFiles. + // Filter out any elements of CompiledGoFiles that are also in OtherFiles. + // We have to keep this workaround in place until go1.12 is a distant memory. + if len(pkg.OtherFiles) > 0 { + other := make(map[string]bool, len(pkg.OtherFiles)) + for _, f := range pkg.OtherFiles { + other[f] = true + } + + out := pkg.CompiledGoFiles[:0] + for _, f := range pkg.CompiledGoFiles { + if other[f] { + continue + } + out = append(out, f) + } + pkg.CompiledGoFiles = out + } + + // Extract the PkgPath from the package's ID. + if i := strings.IndexByte(pkg.ID, ' '); i >= 0 { + pkg.PkgPath = pkg.ID[:i] + } else { + pkg.PkgPath = pkg.ID + } + + if pkg.PkgPath == "unsafe" { + pkg.GoFiles = nil // ignore fake unsafe.go file + } + + // Assume go list emits only absolute paths for Dir. + if p.Dir != "" && !filepath.IsAbs(p.Dir) { + log.Fatalf("internal error: go list returned non-absolute Package.Dir: %s", p.Dir) + } + + if p.Export != "" && !filepath.IsAbs(p.Export) { + pkg.ExportFile = filepath.Join(p.Dir, p.Export) + } else { + pkg.ExportFile = p.Export + } + + // imports + // + // Imports contains the IDs of all imported packages. + // ImportsMap records (path, ID) only where they differ. + ids := make(map[string]bool) + for _, id := range p.Imports { + ids[id] = true + } + pkg.Imports = make(map[string]*Package) + for path, id := range p.ImportMap { + pkg.Imports[path] = &Package{ID: id} // non-identity import + delete(ids, id) + } + for id := range ids { + if id == "C" { + continue + } + + pkg.Imports[id] = &Package{ID: id} // identity import + } + if !p.DepOnly { + response.Roots = append(response.Roots, pkg.ID) + } + + // Work around for pre-go.1.11 versions of go list. + // TODO(matloob): they should be handled by the fallback. + // Can we delete this? + if len(pkg.CompiledGoFiles) == 0 { + pkg.CompiledGoFiles = pkg.GoFiles + } + + if p.Error != nil { + msg := strings.TrimSpace(p.Error.Err) // Trim to work around golang.org/issue/32363. + // Address golang.org/issue/35964 by appending import stack to error message. + if msg == "import cycle not allowed" && len(p.Error.ImportStack) != 0 { + msg += fmt.Sprintf(": import stack: %v", p.Error.ImportStack) + } + pkg.Errors = append(pkg.Errors, Error{ + Pos: p.Error.Pos, + Msg: msg, + Kind: ListError, + }) + } + + pkgs[pkg.ID] = pkg + } + + for id, errs := range additionalErrors { + if p, ok := pkgs[id]; ok { + p.Errors = append(p.Errors, errs...) + } + } + for _, pkg := range pkgs { + response.Packages = append(response.Packages, pkg) + } + sort.Slice(response.Packages, func(i, j int) bool { return response.Packages[i].ID < response.Packages[j].ID }) + + return &response, nil +} + +// getPkgPath finds the package path of a directory if it's relative to a root directory. +func (state *golistState) getPkgPath(dir string) (string, bool, error) { + absDir, err := filepath.Abs(dir) + if err != nil { + return "", false, err + } + roots, err := state.determineRootDirs() + if err != nil { + return "", false, err + } + + for rdir, rpath := range roots { + // Make sure that the directory is in the module, + // to avoid creating a path relative to another module. + if !strings.HasPrefix(absDir, rdir) { + continue + } + // TODO(matloob): This doesn't properly handle symlinks. + r, err := filepath.Rel(rdir, dir) + if err != nil { + continue + } + if rpath != "" { + // We choose only one root even though the directory even it can belong in multiple modules + // or GOPATH entries. This is okay because we only need to work with absolute dirs when a + // file is missing from disk, for instance when gopls calls go/packages in an overlay. + // Once the file is saved, gopls, or the next invocation of the tool will get the correct + // result straight from golist. + // TODO(matloob): Implement module tiebreaking? + return path.Join(rpath, filepath.ToSlash(r)), true, nil + } + return filepath.ToSlash(r), true, nil + } + return "", false, nil +} + +// absJoin absolutizes and flattens the lists of files. +func absJoin(dir string, fileses ...[]string) (res []string) { + for _, files := range fileses { + for _, file := range files { + if !filepath.IsAbs(file) { + file = filepath.Join(dir, file) + } + res = append(res, file) + } + } + return res +} + +func golistargs(cfg *Config, words []string) []string { + const findFlags = NeedImports | NeedTypes | NeedSyntax | NeedTypesInfo + fullargs := []string{ + "-e", "-json", + fmt.Sprintf("-compiled=%t", cfg.Mode&(NeedCompiledGoFiles|NeedSyntax|NeedTypes|NeedTypesInfo|NeedTypesSizes) != 0), + fmt.Sprintf("-test=%t", cfg.Tests), + fmt.Sprintf("-export=%t", usesExportData(cfg)), + fmt.Sprintf("-deps=%t", cfg.Mode&NeedImports != 0), + // go list doesn't let you pass -test and -find together, + // probably because you'd just get the TestMain. + fmt.Sprintf("-find=%t", !cfg.Tests && cfg.Mode&findFlags == 0), + } + fullargs = append(fullargs, cfg.BuildFlags...) + fullargs = append(fullargs, "--") + fullargs = append(fullargs, words...) + return fullargs +} + +// invokeGo returns the stdout of a go command invocation. +func (state *golistState) invokeGo(verb string, args ...string) (*bytes.Buffer, error) { + cfg := state.cfg + + inv := gocommand.Invocation{ + Verb: verb, + Args: args, + BuildFlags: cfg.BuildFlags, + Env: cfg.Env, + Logf: cfg.Logf, + WorkingDir: cfg.Dir, + } + gocmdRunner := cfg.gocmdRunner + if gocmdRunner == nil { + gocmdRunner = &gocommand.Runner{} + } + stdout, stderr, _, err := gocmdRunner.RunRaw(cfg.Context, inv) + if err != nil { + // Check for 'go' executable not being found. + if ee, ok := err.(*exec.Error); ok && ee.Err == exec.ErrNotFound { + return nil, fmt.Errorf("'go list' driver requires 'go', but %s", exec.ErrNotFound) + } + + exitErr, ok := err.(*exec.ExitError) + if !ok { + // Catastrophic error: + // - context cancellation + return nil, xerrors.Errorf("couldn't run 'go': %w", err) + } + + // Old go version? + if strings.Contains(stderr.String(), "flag provided but not defined") { + return nil, goTooOldError{fmt.Errorf("unsupported version of go: %s: %s", exitErr, stderr)} + } + + // Related to #24854 + if len(stderr.String()) > 0 && strings.Contains(stderr.String(), "unexpected directory layout") { + return nil, fmt.Errorf("%s", stderr.String()) + } + + // Is there an error running the C compiler in cgo? This will be reported in the "Error" field + // and should be suppressed by go list -e. + // + // This condition is not perfect yet because the error message can include other error messages than runtime/cgo. + isPkgPathRune := func(r rune) bool { + // From https://golang.org/ref/spec#Import_declarations: + // Implementation restriction: A compiler may restrict ImportPaths to non-empty strings + // using only characters belonging to Unicode's L, M, N, P, and S general categories + // (the Graphic characters without spaces) and may also exclude the + // characters !"#$%&'()*,:;<=>?[\]^`{|} and the Unicode replacement character U+FFFD. + return unicode.IsOneOf([]*unicode.RangeTable{unicode.L, unicode.M, unicode.N, unicode.P, unicode.S}, r) && + !strings.ContainsRune("!\"#$%&'()*,:;<=>?[\\]^`{|}\uFFFD", r) + } + if len(stderr.String()) > 0 && strings.HasPrefix(stderr.String(), "# ") { + msg := stderr.String()[len("# "):] + if strings.HasPrefix(strings.TrimLeftFunc(msg, isPkgPathRune), "\n") { + return stdout, nil + } + // Treat pkg-config errors as a special case (golang.org/issue/36770). + if strings.HasPrefix(msg, "pkg-config") { + return stdout, nil + } + } + + // This error only appears in stderr. See golang.org/cl/166398 for a fix in go list to show + // the error in the Err section of stdout in case -e option is provided. + // This fix is provided for backwards compatibility. + if len(stderr.String()) > 0 && strings.Contains(stderr.String(), "named files must be .go files") { + output := fmt.Sprintf(`{"ImportPath": "command-line-arguments","Incomplete": true,"Error": {"Pos": "","Err": %q}}`, + strings.Trim(stderr.String(), "\n")) + return bytes.NewBufferString(output), nil + } + + // Similar to the previous error, but currently lacks a fix in Go. + if len(stderr.String()) > 0 && strings.Contains(stderr.String(), "named files must all be in one directory") { + output := fmt.Sprintf(`{"ImportPath": "command-line-arguments","Incomplete": true,"Error": {"Pos": "","Err": %q}}`, + strings.Trim(stderr.String(), "\n")) + return bytes.NewBufferString(output), nil + } + + // Backwards compatibility for Go 1.11 because 1.12 and 1.13 put the directory in the ImportPath. + // If the package doesn't exist, put the absolute path of the directory into the error message, + // as Go 1.13 list does. + const noSuchDirectory = "no such directory" + if len(stderr.String()) > 0 && strings.Contains(stderr.String(), noSuchDirectory) { + errstr := stderr.String() + abspath := strings.TrimSpace(errstr[strings.Index(errstr, noSuchDirectory)+len(noSuchDirectory):]) + output := fmt.Sprintf(`{"ImportPath": %q,"Incomplete": true,"Error": {"Pos": "","Err": %q}}`, + abspath, strings.Trim(stderr.String(), "\n")) + return bytes.NewBufferString(output), nil + } + + // Workaround for #29280: go list -e has incorrect behavior when an ad-hoc package doesn't exist. + // Note that the error message we look for in this case is different that the one looked for above. + if len(stderr.String()) > 0 && strings.Contains(stderr.String(), "no such file or directory") { + output := fmt.Sprintf(`{"ImportPath": "command-line-arguments","Incomplete": true,"Error": {"Pos": "","Err": %q}}`, + strings.Trim(stderr.String(), "\n")) + return bytes.NewBufferString(output), nil + } + + // Workaround for #34273. go list -e with GO111MODULE=on has incorrect behavior when listing a + // directory outside any module. + if len(stderr.String()) > 0 && strings.Contains(stderr.String(), "outside available modules") { + output := fmt.Sprintf(`{"ImportPath": %q,"Incomplete": true,"Error": {"Pos": "","Err": %q}}`, + // TODO(matloob): command-line-arguments isn't correct here. + "command-line-arguments", strings.Trim(stderr.String(), "\n")) + return bytes.NewBufferString(output), nil + } + + // Another variation of the previous error + if len(stderr.String()) > 0 && strings.Contains(stderr.String(), "outside module root") { + output := fmt.Sprintf(`{"ImportPath": %q,"Incomplete": true,"Error": {"Pos": "","Err": %q}}`, + // TODO(matloob): command-line-arguments isn't correct here. + "command-line-arguments", strings.Trim(stderr.String(), "\n")) + return bytes.NewBufferString(output), nil + } + + // Workaround for an instance of golang.org/issue/26755: go list -e will return a non-zero exit + // status if there's a dependency on a package that doesn't exist. But it should return + // a zero exit status and set an error on that package. + if len(stderr.String()) > 0 && strings.Contains(stderr.String(), "no Go files in") { + // Don't clobber stdout if `go list` actually returned something. + if len(stdout.String()) > 0 { + return stdout, nil + } + // try to extract package name from string + stderrStr := stderr.String() + var importPath string + colon := strings.Index(stderrStr, ":") + if colon > 0 && strings.HasPrefix(stderrStr, "go build ") { + importPath = stderrStr[len("go build "):colon] + } + output := fmt.Sprintf(`{"ImportPath": %q,"Incomplete": true,"Error": {"Pos": "","Err": %q}}`, + importPath, strings.Trim(stderrStr, "\n")) + return bytes.NewBufferString(output), nil + } + + // Export mode entails a build. + // If that build fails, errors appear on stderr + // (despite the -e flag) and the Export field is blank. + // Do not fail in that case. + // The same is true if an ad-hoc package given to go list doesn't exist. + // TODO(matloob): Remove these once we can depend on go list to exit with a zero status with -e even when + // packages don't exist or a build fails. + if !usesExportData(cfg) && !containsGoFile(args) { + return nil, fmt.Errorf("go %v: %s: %s", args, exitErr, stderr) + } + } + return stdout, nil +} + +func containsGoFile(s []string) bool { + for _, f := range s { + if strings.HasSuffix(f, ".go") { + return true + } + } + return false +} + +func cmdDebugStr(cmd *exec.Cmd, args ...string) string { + env := make(map[string]string) + for _, kv := range cmd.Env { + split := strings.Split(kv, "=") + k, v := split[0], split[1] + env[k] = v + } + var quotedArgs []string + for _, arg := range args { + quotedArgs = append(quotedArgs, strconv.Quote(arg)) + } + + return fmt.Sprintf("GOROOT=%v GOPATH=%v GO111MODULE=%v PWD=%v go %s", env["GOROOT"], env["GOPATH"], env["GO111MODULE"], env["PWD"], strings.Join(quotedArgs, " ")) +} diff --git a/vendor/golang.org/x/tools/go/packages/golist_overlay.go b/vendor/golang.org/x/tools/go/packages/golist_overlay.go new file mode 100644 index 00000000..3c99b6e4 --- /dev/null +++ b/vendor/golang.org/x/tools/go/packages/golist_overlay.go @@ -0,0 +1,438 @@ +package packages + +import ( + "encoding/json" + "fmt" + "go/parser" + "go/token" + "log" + "os" + "path/filepath" + "sort" + "strconv" + "strings" +) + +// processGolistOverlay provides rudimentary support for adding +// files that don't exist on disk to an overlay. The results can be +// sometimes incorrect. +// TODO(matloob): Handle unsupported cases, including the following: +// - determining the correct package to add given a new import path +func (state *golistState) processGolistOverlay(response *responseDeduper) (modifiedPkgs, needPkgs []string, err error) { + havePkgs := make(map[string]string) // importPath -> non-test package ID + needPkgsSet := make(map[string]bool) + modifiedPkgsSet := make(map[string]bool) + + pkgOfDir := make(map[string][]*Package) + for _, pkg := range response.dr.Packages { + // This is an approximation of import path to id. This can be + // wrong for tests, vendored packages, and a number of other cases. + havePkgs[pkg.PkgPath] = pkg.ID + x := commonDir(pkg.GoFiles) + if x != "" { + pkgOfDir[x] = append(pkgOfDir[x], pkg) + } + } + + // If no new imports are added, it is safe to avoid loading any needPkgs. + // Otherwise, it's hard to tell which package is actually being loaded + // (due to vendoring) and whether any modified package will show up + // in the transitive set of dependencies (because new imports are added, + // potentially modifying the transitive set of dependencies). + var overlayAddsImports bool + + // If both a package and its test package are created by the overlay, we + // need the real package first. Process all non-test files before test + // files, and make the whole process deterministic while we're at it. + var overlayFiles []string + for opath := range state.cfg.Overlay { + overlayFiles = append(overlayFiles, opath) + } + sort.Slice(overlayFiles, func(i, j int) bool { + iTest := strings.HasSuffix(overlayFiles[i], "_test.go") + jTest := strings.HasSuffix(overlayFiles[j], "_test.go") + if iTest != jTest { + return !iTest // non-tests are before tests. + } + return overlayFiles[i] < overlayFiles[j] + }) + for _, opath := range overlayFiles { + contents := state.cfg.Overlay[opath] + base := filepath.Base(opath) + dir := filepath.Dir(opath) + var pkg *Package // if opath belongs to both a package and its test variant, this will be the test variant + var testVariantOf *Package // if opath is a test file, this is the package it is testing + var fileExists bool + isTestFile := strings.HasSuffix(opath, "_test.go") + pkgName, ok := extractPackageName(opath, contents) + if !ok { + // Don't bother adding a file that doesn't even have a parsable package statement + // to the overlay. + continue + } + // if all the overlay files belong to a different package, change the package + // name to that package. Otherwise leave it alone; there will be an error message. + maybeFixPackageName(pkgName, pkgOfDir, dir) + nextPackage: + for _, p := range response.dr.Packages { + if pkgName != p.Name && p.ID != "command-line-arguments" { + continue + } + for _, f := range p.GoFiles { + if !sameFile(filepath.Dir(f), dir) { + continue + } + // Make sure to capture information on the package's test variant, if needed. + if isTestFile && !hasTestFiles(p) { + // TODO(matloob): Are there packages other than the 'production' variant + // of a package that this can match? This shouldn't match the test main package + // because the file is generated in another directory. + testVariantOf = p + continue nextPackage + } + // We must have already seen the package of which this is a test variant. + if pkg != nil && p != pkg && pkg.PkgPath == p.PkgPath { + if hasTestFiles(p) { + testVariantOf = pkg + } + } + pkg = p + if filepath.Base(f) == base { + fileExists = true + } + } + } + // The overlay could have included an entirely new package. + if pkg == nil { + // Try to find the module or gopath dir the file is contained in. + // Then for modules, add the module opath to the beginning. + pkgPath, ok, err := state.getPkgPath(dir) + if err != nil { + return nil, nil, err + } + if !ok { + break + } + isXTest := strings.HasSuffix(pkgName, "_test") + if isXTest { + pkgPath += "_test" + } + id := pkgPath + if isTestFile && !isXTest { + id = fmt.Sprintf("%s [%s.test]", pkgPath, pkgPath) + } + // Try to reclaim a package with the same id if it exists in the response. + for _, p := range response.dr.Packages { + if reclaimPackage(p, id, opath, contents) { + pkg = p + break + } + } + // Otherwise, create a new package + if pkg == nil { + pkg = &Package{PkgPath: pkgPath, ID: id, Name: pkgName, Imports: make(map[string]*Package)} + response.addPackage(pkg) + havePkgs[pkg.PkgPath] = id + // Add the production package's sources for a test variant. + if isTestFile && !isXTest && testVariantOf != nil { + pkg.GoFiles = append(pkg.GoFiles, testVariantOf.GoFiles...) + pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, testVariantOf.CompiledGoFiles...) + // Add the package under test and its imports to the test variant. + pkg.forTest = testVariantOf.PkgPath + for k, v := range testVariantOf.Imports { + pkg.Imports[k] = &Package{ID: v.ID} + } + } + } + } + if !fileExists { + pkg.GoFiles = append(pkg.GoFiles, opath) + // TODO(matloob): Adding the file to CompiledGoFiles can exhibit the wrong behavior + // if the file will be ignored due to its build tags. + pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, opath) + modifiedPkgsSet[pkg.ID] = true + } + imports, err := extractImports(opath, contents) + if err != nil { + // Let the parser or type checker report errors later. + continue + } + for _, imp := range imports { + if _, found := pkg.Imports[imp]; found { + continue + } + overlayAddsImports = true + id, ok := havePkgs[imp] + if !ok { + var err error + id, err = state.resolveImport(dir, imp) + if err != nil { + return nil, nil, err + } + } + pkg.Imports[imp] = &Package{ID: id} + // Add dependencies to the non-test variant version of this package as well. + if testVariantOf != nil { + testVariantOf.Imports[imp] = &Package{ID: id} + } + } + } + + // toPkgPath guesses the package path given the id. + toPkgPath := func(sourceDir, id string) (string, error) { + if i := strings.IndexByte(id, ' '); i >= 0 { + return state.resolveImport(sourceDir, id[:i]) + } + return state.resolveImport(sourceDir, id) + } + + // Now that new packages have been created, do another pass to determine + // the new set of missing packages. + for _, pkg := range response.dr.Packages { + for _, imp := range pkg.Imports { + if len(pkg.GoFiles) == 0 { + return nil, nil, fmt.Errorf("cannot resolve imports for package %q with no Go files", pkg.PkgPath) + } + pkgPath, err := toPkgPath(filepath.Dir(pkg.GoFiles[0]), imp.ID) + if err != nil { + return nil, nil, err + } + if _, ok := havePkgs[pkgPath]; !ok { + needPkgsSet[pkgPath] = true + } + } + } + + if overlayAddsImports { + needPkgs = make([]string, 0, len(needPkgsSet)) + for pkg := range needPkgsSet { + needPkgs = append(needPkgs, pkg) + } + } + modifiedPkgs = make([]string, 0, len(modifiedPkgsSet)) + for pkg := range modifiedPkgsSet { + modifiedPkgs = append(modifiedPkgs, pkg) + } + return modifiedPkgs, needPkgs, err +} + +// resolveImport finds the the ID of a package given its import path. +// In particular, it will find the right vendored copy when in GOPATH mode. +func (state *golistState) resolveImport(sourceDir, importPath string) (string, error) { + env, err := state.getEnv() + if err != nil { + return "", err + } + if env["GOMOD"] != "" { + return importPath, nil + } + + searchDir := sourceDir + for { + vendorDir := filepath.Join(searchDir, "vendor") + exists, ok := state.vendorDirs[vendorDir] + if !ok { + info, err := os.Stat(vendorDir) + exists = err == nil && info.IsDir() + state.vendorDirs[vendorDir] = exists + } + + if exists { + vendoredPath := filepath.Join(vendorDir, importPath) + if info, err := os.Stat(vendoredPath); err == nil && info.IsDir() { + // We should probably check for .go files here, but shame on anyone who fools us. + path, ok, err := state.getPkgPath(vendoredPath) + if err != nil { + return "", err + } + if ok { + return path, nil + } + } + } + + // We know we've hit the top of the filesystem when we Dir / and get /, + // or C:\ and get C:\, etc. + next := filepath.Dir(searchDir) + if next == searchDir { + break + } + searchDir = next + } + return importPath, nil +} + +func hasTestFiles(p *Package) bool { + for _, f := range p.GoFiles { + if strings.HasSuffix(f, "_test.go") { + return true + } + } + return false +} + +// determineRootDirs returns a mapping from absolute directories that could +// contain code to their corresponding import path prefixes. +func (state *golistState) determineRootDirs() (map[string]string, error) { + env, err := state.getEnv() + if err != nil { + return nil, err + } + if env["GOMOD"] != "" { + state.rootsOnce.Do(func() { + state.rootDirs, state.rootDirsError = state.determineRootDirsModules() + }) + } else { + state.rootsOnce.Do(func() { + state.rootDirs, state.rootDirsError = state.determineRootDirsGOPATH() + }) + } + return state.rootDirs, state.rootDirsError +} + +func (state *golistState) determineRootDirsModules() (map[string]string, error) { + // This will only return the root directory for the main module. + // For now we only support overlays in main modules. + // Editing files in the module cache isn't a great idea, so we don't + // plan to ever support that, but editing files in replaced modules + // is something we may want to support. To do that, we'll want to + // do a go list -m to determine the replaced module's module path and + // directory, and then a go list -m {{with .Replace}}{{.Dir}}{{end}} + // from the main module to determine if that module is actually a replacement. + // See bcmills's comment here: https://github.com/golang/go/issues/37629#issuecomment-594179751 + // for more information. + out, err := state.invokeGo("list", "-m", "-json") + if err != nil { + return nil, err + } + m := map[string]string{} + type jsonMod struct{ Path, Dir string } + for dec := json.NewDecoder(out); dec.More(); { + mod := new(jsonMod) + if err := dec.Decode(mod); err != nil { + return nil, err + } + if mod.Dir != "" && mod.Path != "" { + // This is a valid module; add it to the map. + absDir, err := filepath.Abs(mod.Dir) + if err != nil { + return nil, err + } + m[absDir] = mod.Path + } + } + return m, nil +} + +func (state *golistState) determineRootDirsGOPATH() (map[string]string, error) { + m := map[string]string{} + for _, dir := range filepath.SplitList(state.mustGetEnv()["GOPATH"]) { + absDir, err := filepath.Abs(dir) + if err != nil { + return nil, err + } + m[filepath.Join(absDir, "src")] = "" + } + return m, nil +} + +func extractImports(filename string, contents []byte) ([]string, error) { + f, err := parser.ParseFile(token.NewFileSet(), filename, contents, parser.ImportsOnly) // TODO(matloob): reuse fileset? + if err != nil { + return nil, err + } + var res []string + for _, imp := range f.Imports { + quotedPath := imp.Path.Value + path, err := strconv.Unquote(quotedPath) + if err != nil { + return nil, err + } + res = append(res, path) + } + return res, nil +} + +// reclaimPackage attempts to reuse a package that failed to load in an overlay. +// +// If the package has errors and has no Name, GoFiles, or Imports, +// then it's possible that it doesn't yet exist on disk. +func reclaimPackage(pkg *Package, id string, filename string, contents []byte) bool { + // TODO(rstambler): Check the message of the actual error? + // It differs between $GOPATH and module mode. + if pkg.ID != id { + return false + } + if len(pkg.Errors) != 1 { + return false + } + if pkg.Name != "" || pkg.ExportFile != "" { + return false + } + if len(pkg.GoFiles) > 0 || len(pkg.CompiledGoFiles) > 0 || len(pkg.OtherFiles) > 0 { + return false + } + if len(pkg.Imports) > 0 { + return false + } + pkgName, ok := extractPackageName(filename, contents) + if !ok { + return false + } + pkg.Name = pkgName + pkg.Errors = nil + return true +} + +func extractPackageName(filename string, contents []byte) (string, bool) { + // TODO(rstambler): Check the message of the actual error? + // It differs between $GOPATH and module mode. + f, err := parser.ParseFile(token.NewFileSet(), filename, contents, parser.PackageClauseOnly) // TODO(matloob): reuse fileset? + if err != nil { + return "", false + } + return f.Name.Name, true +} + +func commonDir(a []string) string { + seen := make(map[string]bool) + x := append([]string{}, a...) + for _, f := range x { + seen[filepath.Dir(f)] = true + } + if len(seen) > 1 { + log.Fatalf("commonDir saw %v for %v", seen, x) + } + for k := range seen { + // len(seen) == 1 + return k + } + return "" // no files +} + +// It is possible that the files in the disk directory dir have a different package +// name from newName, which is deduced from the overlays. If they all have a different +// package name, and they all have the same package name, then that name becomes +// the package name. +// It returns true if it changes the package name, false otherwise. +func maybeFixPackageName(newName string, pkgOfDir map[string][]*Package, dir string) bool { + names := make(map[string]int) + for _, p := range pkgOfDir[dir] { + names[p.Name]++ + } + if len(names) != 1 { + // some files are in different packages + return false + } + oldName := "" + for k := range names { + oldName = k + } + if newName == oldName { + return false + } + for _, p := range pkgOfDir[dir] { + p.Name = newName + } + return true +} diff --git a/vendor/golang.org/x/tools/go/packages/loadmode_string.go b/vendor/golang.org/x/tools/go/packages/loadmode_string.go new file mode 100644 index 00000000..7ea37e7e --- /dev/null +++ b/vendor/golang.org/x/tools/go/packages/loadmode_string.go @@ -0,0 +1,57 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packages + +import ( + "fmt" + "strings" +) + +var allModes = []LoadMode{ + NeedName, + NeedFiles, + NeedCompiledGoFiles, + NeedImports, + NeedDeps, + NeedExportsFile, + NeedTypes, + NeedSyntax, + NeedTypesInfo, + NeedTypesSizes, +} + +var modeStrings = []string{ + "NeedName", + "NeedFiles", + "NeedCompiledGoFiles", + "NeedImports", + "NeedDeps", + "NeedExportsFile", + "NeedTypes", + "NeedSyntax", + "NeedTypesInfo", + "NeedTypesSizes", +} + +func (mod LoadMode) String() string { + m := mod + if m == 0 { + return "LoadMode(0)" + } + var out []string + for i, x := range allModes { + if x > m { + break + } + if (m & x) != 0 { + out = append(out, modeStrings[i]) + m = m ^ x + } + } + if m != 0 { + out = append(out, "Unknown") + } + return fmt.Sprintf("LoadMode(%s)", strings.Join(out, "|")) +} diff --git a/vendor/golang.org/x/tools/go/packages/packages.go b/vendor/golang.org/x/tools/go/packages/packages.go new file mode 100644 index 00000000..03fd999c --- /dev/null +++ b/vendor/golang.org/x/tools/go/packages/packages.go @@ -0,0 +1,1159 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packages + +// See doc.go for package documentation and implementation notes. + +import ( + "context" + "encoding/json" + "fmt" + "go/ast" + "go/parser" + "go/scanner" + "go/token" + "go/types" + "io/ioutil" + "log" + "os" + "path/filepath" + "strings" + "sync" + + "golang.org/x/tools/go/gcexportdata" + "golang.org/x/tools/internal/gocommand" + "golang.org/x/tools/internal/packagesinternal" +) + +// A LoadMode controls the amount of detail to return when loading. +// The bits below can be combined to specify which fields should be +// filled in the result packages. +// The zero value is a special case, equivalent to combining +// the NeedName, NeedFiles, and NeedCompiledGoFiles bits. +// ID and Errors (if present) will always be filled. +// Load may return more information than requested. +type LoadMode int + +// TODO(matloob): When a V2 of go/packages is released, rename NeedExportsFile to +// NeedExportFile to make it consistent with the Package field it's adding. + +const ( + // NeedName adds Name and PkgPath. + NeedName LoadMode = 1 << iota + + // NeedFiles adds GoFiles and OtherFiles. + NeedFiles + + // NeedCompiledGoFiles adds CompiledGoFiles. + NeedCompiledGoFiles + + // NeedImports adds Imports. If NeedDeps is not set, the Imports field will contain + // "placeholder" Packages with only the ID set. + NeedImports + + // NeedDeps adds the fields requested by the LoadMode in the packages in Imports. + NeedDeps + + // NeedExportsFile adds ExportFile. + NeedExportsFile + + // NeedTypes adds Types, Fset, and IllTyped. + NeedTypes + + // NeedSyntax adds Syntax. + NeedSyntax + + // NeedTypesInfo adds TypesInfo. + NeedTypesInfo + + // NeedTypesSizes adds TypesSizes. + NeedTypesSizes +) + +const ( + // Deprecated: LoadFiles exists for historical compatibility + // and should not be used. Please directly specify the needed fields using the Need values. + LoadFiles = NeedName | NeedFiles | NeedCompiledGoFiles + + // Deprecated: LoadImports exists for historical compatibility + // and should not be used. Please directly specify the needed fields using the Need values. + LoadImports = LoadFiles | NeedImports + + // Deprecated: LoadTypes exists for historical compatibility + // and should not be used. Please directly specify the needed fields using the Need values. + LoadTypes = LoadImports | NeedTypes | NeedTypesSizes + + // Deprecated: LoadSyntax exists for historical compatibility + // and should not be used. Please directly specify the needed fields using the Need values. + LoadSyntax = LoadTypes | NeedSyntax | NeedTypesInfo + + // Deprecated: LoadAllSyntax exists for historical compatibility + // and should not be used. Please directly specify the needed fields using the Need values. + LoadAllSyntax = LoadSyntax | NeedDeps +) + +// A Config specifies details about how packages should be loaded. +// The zero value is a valid configuration. +// Calls to Load do not modify this struct. +type Config struct { + // Mode controls the level of information returned for each package. + Mode LoadMode + + // Context specifies the context for the load operation. + // If the context is cancelled, the loader may stop early + // and return an ErrCancelled error. + // If Context is nil, the load cannot be cancelled. + Context context.Context + + // Logf is the logger for the config. + // If the user provides a logger, debug logging is enabled. + // If the GOPACKAGESDEBUG environment variable is set to true, + // but the logger is nil, default to log.Printf. + Logf func(format string, args ...interface{}) + + // Dir is the directory in which to run the build system's query tool + // that provides information about the packages. + // If Dir is empty, the tool is run in the current directory. + Dir string + + // Env is the environment to use when invoking the build system's query tool. + // If Env is nil, the current environment is used. + // As in os/exec's Cmd, only the last value in the slice for + // each environment key is used. To specify the setting of only + // a few variables, append to the current environment, as in: + // + // opt.Env = append(os.Environ(), "GOOS=plan9", "GOARCH=386") + // + Env []string + + // gocmdRunner guards go command calls from concurrency errors. + gocmdRunner *gocommand.Runner + + // BuildFlags is a list of command-line flags to be passed through to + // the build system's query tool. + BuildFlags []string + + // Fset provides source position information for syntax trees and types. + // If Fset is nil, Load will use a new fileset, but preserve Fset's value. + Fset *token.FileSet + + // ParseFile is called to read and parse each file + // when preparing a package's type-checked syntax tree. + // It must be safe to call ParseFile simultaneously from multiple goroutines. + // If ParseFile is nil, the loader will uses parser.ParseFile. + // + // ParseFile should parse the source from src and use filename only for + // recording position information. + // + // An application may supply a custom implementation of ParseFile + // to change the effective file contents or the behavior of the parser, + // or to modify the syntax tree. For example, selectively eliminating + // unwanted function bodies can significantly accelerate type checking. + ParseFile func(fset *token.FileSet, filename string, src []byte) (*ast.File, error) + + // If Tests is set, the loader includes not just the packages + // matching a particular pattern but also any related test packages, + // including test-only variants of the package and the test executable. + // + // For example, when using the go command, loading "fmt" with Tests=true + // returns four packages, with IDs "fmt" (the standard package), + // "fmt [fmt.test]" (the package as compiled for the test), + // "fmt_test" (the test functions from source files in package fmt_test), + // and "fmt.test" (the test binary). + // + // In build systems with explicit names for tests, + // setting Tests may have no effect. + Tests bool + + // Overlay provides a mapping of absolute file paths to file contents. + // If the file with the given path already exists, the parser will use the + // alternative file contents provided by the map. + // + // Overlays provide incomplete support for when a given file doesn't + // already exist on disk. See the package doc above for more details. + Overlay map[string][]byte +} + +// driver is the type for functions that query the build system for the +// packages named by the patterns. +type driver func(cfg *Config, patterns ...string) (*driverResponse, error) + +// driverResponse contains the results for a driver query. +type driverResponse struct { + // Sizes, if not nil, is the types.Sizes to use when type checking. + Sizes *types.StdSizes + + // Roots is the set of package IDs that make up the root packages. + // We have to encode this separately because when we encode a single package + // we cannot know if it is one of the roots as that requires knowledge of the + // graph it is part of. + Roots []string `json:",omitempty"` + + // Packages is the full set of packages in the graph. + // The packages are not connected into a graph. + // The Imports if populated will be stubs that only have their ID set. + // Imports will be connected and then type and syntax information added in a + // later pass (see refine). + Packages []*Package +} + +// Load loads and returns the Go packages named by the given patterns. +// +// Config specifies loading options; +// nil behaves the same as an empty Config. +// +// Load returns an error if any of the patterns was invalid +// as defined by the underlying build system. +// It may return an empty list of packages without an error, +// for instance for an empty expansion of a valid wildcard. +// Errors associated with a particular package are recorded in the +// corresponding Package's Errors list, and do not cause Load to +// return an error. Clients may need to handle such errors before +// proceeding with further analysis. The PrintErrors function is +// provided for convenient display of all errors. +func Load(cfg *Config, patterns ...string) ([]*Package, error) { + l := newLoader(cfg) + response, err := defaultDriver(&l.Config, patterns...) + if err != nil { + return nil, err + } + l.sizes = response.Sizes + return l.refine(response.Roots, response.Packages...) +} + +// defaultDriver is a driver that looks for an external driver binary, and if +// it does not find it falls back to the built in go list driver. +func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, error) { + driver := findExternalDriver(cfg) + if driver == nil { + driver = goListDriver + } + return driver(cfg, patterns...) +} + +// A Package describes a loaded Go package. +type Package struct { + // ID is a unique identifier for a package, + // in a syntax provided by the underlying build system. + // + // Because the syntax varies based on the build system, + // clients should treat IDs as opaque and not attempt to + // interpret them. + ID string + + // Name is the package name as it appears in the package source code. + Name string + + // PkgPath is the package path as used by the go/types package. + PkgPath string + + // Errors contains any errors encountered querying the metadata + // of the package, or while parsing or type-checking its files. + Errors []Error + + // GoFiles lists the absolute file paths of the package's Go source files. + GoFiles []string + + // CompiledGoFiles lists the absolute file paths of the package's source + // files that were presented to the compiler. + // This may differ from GoFiles if files are processed before compilation. + CompiledGoFiles []string + + // OtherFiles lists the absolute file paths of the package's non-Go source files, + // including assembly, C, C++, Fortran, Objective-C, SWIG, and so on. + OtherFiles []string + + // ExportFile is the absolute path to a file containing type + // information for the package as provided by the build system. + ExportFile string + + // Imports maps import paths appearing in the package's Go source files + // to corresponding loaded Packages. + Imports map[string]*Package + + // Types provides type information for the package. + // The NeedTypes LoadMode bit sets this field for packages matching the + // patterns; type information for dependencies may be missing or incomplete, + // unless NeedDeps and NeedImports are also set. + Types *types.Package + + // Fset provides position information for Types, TypesInfo, and Syntax. + // It is set only when Types is set. + Fset *token.FileSet + + // IllTyped indicates whether the package or any dependency contains errors. + // It is set only when Types is set. + IllTyped bool + + // Syntax is the package's syntax trees, for the files listed in CompiledGoFiles. + // + // The NeedSyntax LoadMode bit populates this field for packages matching the patterns. + // If NeedDeps and NeedImports are also set, this field will also be populated + // for dependencies. + Syntax []*ast.File + + // TypesInfo provides type information about the package's syntax trees. + // It is set only when Syntax is set. + TypesInfo *types.Info + + // TypesSizes provides the effective size function for types in TypesInfo. + TypesSizes types.Sizes + + // forTest is the package under test, if any. + forTest string + + // module is the module information for the package if it exists. + module *packagesinternal.Module +} + +func init() { + packagesinternal.GetForTest = func(p interface{}) string { + return p.(*Package).forTest + } + packagesinternal.GetModule = func(p interface{}) *packagesinternal.Module { + return p.(*Package).module + } + packagesinternal.GetGoCmdRunner = func(config interface{}) *gocommand.Runner { + return config.(*Config).gocmdRunner + } + packagesinternal.SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) { + config.(*Config).gocmdRunner = runner + } +} + +// An Error describes a problem with a package's metadata, syntax, or types. +type Error struct { + Pos string // "file:line:col" or "file:line" or "" or "-" + Msg string + Kind ErrorKind +} + +// ErrorKind describes the source of the error, allowing the user to +// differentiate between errors generated by the driver, the parser, or the +// type-checker. +type ErrorKind int + +const ( + UnknownError ErrorKind = iota + ListError + ParseError + TypeError +) + +func (err Error) Error() string { + pos := err.Pos + if pos == "" { + pos = "-" // like token.Position{}.String() + } + return pos + ": " + err.Msg +} + +// flatPackage is the JSON form of Package +// It drops all the type and syntax fields, and transforms the Imports +// +// TODO(adonovan): identify this struct with Package, effectively +// publishing the JSON protocol. +type flatPackage struct { + ID string + Name string `json:",omitempty"` + PkgPath string `json:",omitempty"` + Errors []Error `json:",omitempty"` + GoFiles []string `json:",omitempty"` + CompiledGoFiles []string `json:",omitempty"` + OtherFiles []string `json:",omitempty"` + ExportFile string `json:",omitempty"` + Imports map[string]string `json:",omitempty"` +} + +// MarshalJSON returns the Package in its JSON form. +// For the most part, the structure fields are written out unmodified, and +// the type and syntax fields are skipped. +// The imports are written out as just a map of path to package id. +// The errors are written using a custom type that tries to preserve the +// structure of error types we know about. +// +// This method exists to enable support for additional build systems. It is +// not intended for use by clients of the API and we may change the format. +func (p *Package) MarshalJSON() ([]byte, error) { + flat := &flatPackage{ + ID: p.ID, + Name: p.Name, + PkgPath: p.PkgPath, + Errors: p.Errors, + GoFiles: p.GoFiles, + CompiledGoFiles: p.CompiledGoFiles, + OtherFiles: p.OtherFiles, + ExportFile: p.ExportFile, + } + if len(p.Imports) > 0 { + flat.Imports = make(map[string]string, len(p.Imports)) + for path, ipkg := range p.Imports { + flat.Imports[path] = ipkg.ID + } + } + return json.Marshal(flat) +} + +// UnmarshalJSON reads in a Package from its JSON format. +// See MarshalJSON for details about the format accepted. +func (p *Package) UnmarshalJSON(b []byte) error { + flat := &flatPackage{} + if err := json.Unmarshal(b, &flat); err != nil { + return err + } + *p = Package{ + ID: flat.ID, + Name: flat.Name, + PkgPath: flat.PkgPath, + Errors: flat.Errors, + GoFiles: flat.GoFiles, + CompiledGoFiles: flat.CompiledGoFiles, + OtherFiles: flat.OtherFiles, + ExportFile: flat.ExportFile, + } + if len(flat.Imports) > 0 { + p.Imports = make(map[string]*Package, len(flat.Imports)) + for path, id := range flat.Imports { + p.Imports[path] = &Package{ID: id} + } + } + return nil +} + +func (p *Package) String() string { return p.ID } + +// loaderPackage augments Package with state used during the loading phase +type loaderPackage struct { + *Package + importErrors map[string]error // maps each bad import to its error + loadOnce sync.Once + color uint8 // for cycle detection + needsrc bool // load from source (Mode >= LoadTypes) + needtypes bool // type information is either requested or depended on + initial bool // package was matched by a pattern +} + +// loader holds the working state of a single call to load. +type loader struct { + pkgs map[string]*loaderPackage + Config + sizes types.Sizes + parseCache map[string]*parseValue + parseCacheMu sync.Mutex + exportMu sync.Mutex // enforces mutual exclusion of exportdata operations + + // Config.Mode contains the implied mode (see impliedLoadMode). + // Implied mode contains all the fields we need the data for. + // In requestedMode there are the actually requested fields. + // We'll zero them out before returning packages to the user. + // This makes it easier for us to get the conditions where + // we need certain modes right. + requestedMode LoadMode +} + +type parseValue struct { + f *ast.File + err error + ready chan struct{} +} + +func newLoader(cfg *Config) *loader { + ld := &loader{ + parseCache: map[string]*parseValue{}, + } + if cfg != nil { + ld.Config = *cfg + // If the user has provided a logger, use it. + ld.Config.Logf = cfg.Logf + } + if ld.Config.Logf == nil { + // If the GOPACKAGESDEBUG environment variable is set to true, + // but the user has not provided a logger, default to log.Printf. + if debug { + ld.Config.Logf = log.Printf + } else { + ld.Config.Logf = func(format string, args ...interface{}) {} + } + } + if ld.Config.Mode == 0 { + ld.Config.Mode = NeedName | NeedFiles | NeedCompiledGoFiles // Preserve zero behavior of Mode for backwards compatibility. + } + if ld.Config.Env == nil { + ld.Config.Env = os.Environ() + } + if ld.Config.gocmdRunner == nil { + ld.Config.gocmdRunner = &gocommand.Runner{} + } + if ld.Context == nil { + ld.Context = context.Background() + } + if ld.Dir == "" { + if dir, err := os.Getwd(); err == nil { + ld.Dir = dir + } + } + + // Save the actually requested fields. We'll zero them out before returning packages to the user. + ld.requestedMode = ld.Mode + ld.Mode = impliedLoadMode(ld.Mode) + + if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 { + if ld.Fset == nil { + ld.Fset = token.NewFileSet() + } + + // ParseFile is required even in LoadTypes mode + // because we load source if export data is missing. + if ld.ParseFile == nil { + ld.ParseFile = func(fset *token.FileSet, filename string, src []byte) (*ast.File, error) { + const mode = parser.AllErrors | parser.ParseComments + return parser.ParseFile(fset, filename, src, mode) + } + } + } + + return ld +} + +// refine connects the supplied packages into a graph and then adds type and +// and syntax information as requested by the LoadMode. +func (ld *loader) refine(roots []string, list ...*Package) ([]*Package, error) { + rootMap := make(map[string]int, len(roots)) + for i, root := range roots { + rootMap[root] = i + } + ld.pkgs = make(map[string]*loaderPackage) + // first pass, fixup and build the map and roots + var initial = make([]*loaderPackage, len(roots)) + for _, pkg := range list { + rootIndex := -1 + if i, found := rootMap[pkg.ID]; found { + rootIndex = i + } + + // Overlays can invalidate export data. + // TODO(matloob): make this check fine-grained based on dependencies on overlaid files + exportDataInvalid := len(ld.Overlay) > 0 || pkg.ExportFile == "" && pkg.PkgPath != "unsafe" + // This package needs type information if the caller requested types and the package is + // either a root, or it's a non-root and the user requested dependencies ... + needtypes := (ld.Mode&NeedTypes|NeedTypesInfo != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0)) + // This package needs source if the call requested source (or types info, which implies source) + // and the package is either a root, or itas a non- root and the user requested dependencies... + needsrc := ((ld.Mode&(NeedSyntax|NeedTypesInfo) != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0)) || + // ... or if we need types and the exportData is invalid. We fall back to (incompletely) + // typechecking packages from source if they fail to compile. + (ld.Mode&NeedTypes|NeedTypesInfo != 0 && exportDataInvalid)) && pkg.PkgPath != "unsafe" + lpkg := &loaderPackage{ + Package: pkg, + needtypes: needtypes, + needsrc: needsrc, + } + ld.pkgs[lpkg.ID] = lpkg + if rootIndex >= 0 { + initial[rootIndex] = lpkg + lpkg.initial = true + } + } + for i, root := range roots { + if initial[i] == nil { + return nil, fmt.Errorf("root package %v is missing", root) + } + } + + // Materialize the import graph. + + const ( + white = 0 // new + grey = 1 // in progress + black = 2 // complete + ) + + // visit traverses the import graph, depth-first, + // and materializes the graph as Packages.Imports. + // + // Valid imports are saved in the Packages.Import map. + // Invalid imports (cycles and missing nodes) are saved in the importErrors map. + // Thus, even in the presence of both kinds of errors, the Import graph remains a DAG. + // + // visit returns whether the package needs src or has a transitive + // dependency on a package that does. These are the only packages + // for which we load source code. + var stack []*loaderPackage + var visit func(lpkg *loaderPackage) bool + var srcPkgs []*loaderPackage + visit = func(lpkg *loaderPackage) bool { + switch lpkg.color { + case black: + return lpkg.needsrc + case grey: + panic("internal error: grey node") + } + lpkg.color = grey + stack = append(stack, lpkg) // push + stubs := lpkg.Imports // the structure form has only stubs with the ID in the Imports + // If NeedImports isn't set, the imports fields will all be zeroed out. + if ld.Mode&NeedImports != 0 { + lpkg.Imports = make(map[string]*Package, len(stubs)) + for importPath, ipkg := range stubs { + var importErr error + imp := ld.pkgs[ipkg.ID] + if imp == nil { + // (includes package "C" when DisableCgo) + importErr = fmt.Errorf("missing package: %q", ipkg.ID) + } else if imp.color == grey { + importErr = fmt.Errorf("import cycle: %s", stack) + } + if importErr != nil { + if lpkg.importErrors == nil { + lpkg.importErrors = make(map[string]error) + } + lpkg.importErrors[importPath] = importErr + continue + } + + if visit(imp) { + lpkg.needsrc = true + } + lpkg.Imports[importPath] = imp.Package + } + } + if lpkg.needsrc { + srcPkgs = append(srcPkgs, lpkg) + } + if ld.Mode&NeedTypesSizes != 0 { + lpkg.TypesSizes = ld.sizes + } + stack = stack[:len(stack)-1] // pop + lpkg.color = black + + return lpkg.needsrc + } + + if ld.Mode&NeedImports == 0 { + // We do this to drop the stub import packages that we are not even going to try to resolve. + for _, lpkg := range initial { + lpkg.Imports = nil + } + } else { + // For each initial package, create its import DAG. + for _, lpkg := range initial { + visit(lpkg) + } + } + if ld.Mode&NeedImports != 0 && ld.Mode&NeedTypes != 0 { + for _, lpkg := range srcPkgs { + // Complete type information is required for the + // immediate dependencies of each source package. + for _, ipkg := range lpkg.Imports { + imp := ld.pkgs[ipkg.ID] + imp.needtypes = true + } + } + } + // Load type data and syntax if needed, starting at + // the initial packages (roots of the import DAG). + if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 { + var wg sync.WaitGroup + for _, lpkg := range initial { + wg.Add(1) + go func(lpkg *loaderPackage) { + ld.loadRecursive(lpkg) + wg.Done() + }(lpkg) + } + wg.Wait() + } + + result := make([]*Package, len(initial)) + for i, lpkg := range initial { + result[i] = lpkg.Package + } + for i := range ld.pkgs { + // Clear all unrequested fields, for extra de-Hyrum-ization. + if ld.requestedMode&NeedName == 0 { + ld.pkgs[i].Name = "" + ld.pkgs[i].PkgPath = "" + } + if ld.requestedMode&NeedFiles == 0 { + ld.pkgs[i].GoFiles = nil + ld.pkgs[i].OtherFiles = nil + } + if ld.requestedMode&NeedCompiledGoFiles == 0 { + ld.pkgs[i].CompiledGoFiles = nil + } + if ld.requestedMode&NeedImports == 0 { + ld.pkgs[i].Imports = nil + } + if ld.requestedMode&NeedExportsFile == 0 { + ld.pkgs[i].ExportFile = "" + } + if ld.requestedMode&NeedTypes == 0 { + ld.pkgs[i].Types = nil + ld.pkgs[i].Fset = nil + ld.pkgs[i].IllTyped = false + } + if ld.requestedMode&NeedSyntax == 0 { + ld.pkgs[i].Syntax = nil + } + if ld.requestedMode&NeedTypesInfo == 0 { + ld.pkgs[i].TypesInfo = nil + } + if ld.requestedMode&NeedTypesSizes == 0 { + ld.pkgs[i].TypesSizes = nil + } + } + + return result, nil +} + +// loadRecursive loads the specified package and its dependencies, +// recursively, in parallel, in topological order. +// It is atomic and idempotent. +// Precondition: ld.Mode&NeedTypes. +func (ld *loader) loadRecursive(lpkg *loaderPackage) { + lpkg.loadOnce.Do(func() { + // Load the direct dependencies, in parallel. + var wg sync.WaitGroup + for _, ipkg := range lpkg.Imports { + imp := ld.pkgs[ipkg.ID] + wg.Add(1) + go func(imp *loaderPackage) { + ld.loadRecursive(imp) + wg.Done() + }(imp) + } + wg.Wait() + ld.loadPackage(lpkg) + }) +} + +// loadPackage loads the specified package. +// It must be called only once per Package, +// after immediate dependencies are loaded. +// Precondition: ld.Mode & NeedTypes. +func (ld *loader) loadPackage(lpkg *loaderPackage) { + if lpkg.PkgPath == "unsafe" { + // Fill in the blanks to avoid surprises. + lpkg.Types = types.Unsafe + lpkg.Fset = ld.Fset + lpkg.Syntax = []*ast.File{} + lpkg.TypesInfo = new(types.Info) + lpkg.TypesSizes = ld.sizes + return + } + + // Call NewPackage directly with explicit name. + // This avoids skew between golist and go/types when the files' + // package declarations are inconsistent. + lpkg.Types = types.NewPackage(lpkg.PkgPath, lpkg.Name) + lpkg.Fset = ld.Fset + + // Subtle: we populate all Types fields with an empty Package + // before loading export data so that export data processing + // never has to create a types.Package for an indirect dependency, + // which would then require that such created packages be explicitly + // inserted back into the Import graph as a final step after export data loading. + // The Diamond test exercises this case. + if !lpkg.needtypes && !lpkg.needsrc { + return + } + if !lpkg.needsrc { + ld.loadFromExportData(lpkg) + return // not a source package, don't get syntax trees + } + + appendError := func(err error) { + // Convert various error types into the one true Error. + var errs []Error + switch err := err.(type) { + case Error: + // from driver + errs = append(errs, err) + + case *os.PathError: + // from parser + errs = append(errs, Error{ + Pos: err.Path + ":1", + Msg: err.Err.Error(), + Kind: ParseError, + }) + + case scanner.ErrorList: + // from parser + for _, err := range err { + errs = append(errs, Error{ + Pos: err.Pos.String(), + Msg: err.Msg, + Kind: ParseError, + }) + } + + case types.Error: + // from type checker + errs = append(errs, Error{ + Pos: err.Fset.Position(err.Pos).String(), + Msg: err.Msg, + Kind: TypeError, + }) + + default: + // unexpected impoverished error from parser? + errs = append(errs, Error{ + Pos: "-", + Msg: err.Error(), + Kind: UnknownError, + }) + + // If you see this error message, please file a bug. + log.Printf("internal error: error %q (%T) without position", err, err) + } + + lpkg.Errors = append(lpkg.Errors, errs...) + } + + if ld.Config.Mode&NeedTypes != 0 && len(lpkg.CompiledGoFiles) == 0 && lpkg.ExportFile != "" { + // The config requested loading sources and types, but sources are missing. + // Add an error to the package and fall back to loading from export data. + appendError(Error{"-", fmt.Sprintf("sources missing for package %s", lpkg.ID), ParseError}) + ld.loadFromExportData(lpkg) + return // can't get syntax trees for this package + } + + files, errs := ld.parseFiles(lpkg.CompiledGoFiles) + for _, err := range errs { + appendError(err) + } + + lpkg.Syntax = files + if ld.Config.Mode&NeedTypes == 0 { + return + } + + lpkg.TypesInfo = &types.Info{ + Types: make(map[ast.Expr]types.TypeAndValue), + Defs: make(map[*ast.Ident]types.Object), + Uses: make(map[*ast.Ident]types.Object), + Implicits: make(map[ast.Node]types.Object), + Scopes: make(map[ast.Node]*types.Scope), + Selections: make(map[*ast.SelectorExpr]*types.Selection), + } + lpkg.TypesSizes = ld.sizes + + importer := importerFunc(func(path string) (*types.Package, error) { + if path == "unsafe" { + return types.Unsafe, nil + } + + // The imports map is keyed by import path. + ipkg := lpkg.Imports[path] + if ipkg == nil { + if err := lpkg.importErrors[path]; err != nil { + return nil, err + } + // There was skew between the metadata and the + // import declarations, likely due to an edit + // race, or because the ParseFile feature was + // used to supply alternative file contents. + return nil, fmt.Errorf("no metadata for %s", path) + } + + if ipkg.Types != nil && ipkg.Types.Complete() { + return ipkg.Types, nil + } + log.Fatalf("internal error: package %q without types was imported from %q", path, lpkg) + panic("unreachable") + }) + + // type-check + tc := &types.Config{ + Importer: importer, + + // Type-check bodies of functions only in non-initial packages. + // Example: for import graph A->B->C and initial packages {A,C}, + // we can ignore function bodies in B. + IgnoreFuncBodies: ld.Mode&NeedDeps == 0 && !lpkg.initial, + + Error: appendError, + Sizes: ld.sizes, + } + types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax) + + lpkg.importErrors = nil // no longer needed + + // If !Cgo, the type-checker uses FakeImportC mode, so + // it doesn't invoke the importer for import "C", + // nor report an error for the import, + // or for any undefined C.f reference. + // We must detect this explicitly and correctly + // mark the package as IllTyped (by reporting an error). + // TODO(adonovan): if these errors are annoying, + // we could just set IllTyped quietly. + if tc.FakeImportC { + outer: + for _, f := range lpkg.Syntax { + for _, imp := range f.Imports { + if imp.Path.Value == `"C"` { + err := types.Error{Fset: ld.Fset, Pos: imp.Pos(), Msg: `import "C" ignored`} + appendError(err) + break outer + } + } + } + } + + // Record accumulated errors. + illTyped := len(lpkg.Errors) > 0 + if !illTyped { + for _, imp := range lpkg.Imports { + if imp.IllTyped { + illTyped = true + break + } + } + } + lpkg.IllTyped = illTyped +} + +// An importFunc is an implementation of the single-method +// types.Importer interface based on a function value. +type importerFunc func(path string) (*types.Package, error) + +func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) } + +// We use a counting semaphore to limit +// the number of parallel I/O calls per process. +var ioLimit = make(chan bool, 20) + +func (ld *loader) parseFile(filename string) (*ast.File, error) { + ld.parseCacheMu.Lock() + v, ok := ld.parseCache[filename] + if ok { + // cache hit + ld.parseCacheMu.Unlock() + <-v.ready + } else { + // cache miss + v = &parseValue{ready: make(chan struct{})} + ld.parseCache[filename] = v + ld.parseCacheMu.Unlock() + + var src []byte + for f, contents := range ld.Config.Overlay { + if sameFile(f, filename) { + src = contents + } + } + var err error + if src == nil { + ioLimit <- true // wait + src, err = ioutil.ReadFile(filename) + <-ioLimit // signal + } + if err != nil { + v.err = err + } else { + v.f, v.err = ld.ParseFile(ld.Fset, filename, src) + } + + close(v.ready) + } + return v.f, v.err +} + +// parseFiles reads and parses the Go source files and returns the ASTs +// of the ones that could be at least partially parsed, along with a +// list of I/O and parse errors encountered. +// +// Because files are scanned in parallel, the token.Pos +// positions of the resulting ast.Files are not ordered. +// +func (ld *loader) parseFiles(filenames []string) ([]*ast.File, []error) { + var wg sync.WaitGroup + n := len(filenames) + parsed := make([]*ast.File, n) + errors := make([]error, n) + for i, file := range filenames { + if ld.Config.Context.Err() != nil { + parsed[i] = nil + errors[i] = ld.Config.Context.Err() + continue + } + wg.Add(1) + go func(i int, filename string) { + parsed[i], errors[i] = ld.parseFile(filename) + wg.Done() + }(i, file) + } + wg.Wait() + + // Eliminate nils, preserving order. + var o int + for _, f := range parsed { + if f != nil { + parsed[o] = f + o++ + } + } + parsed = parsed[:o] + + o = 0 + for _, err := range errors { + if err != nil { + errors[o] = err + o++ + } + } + errors = errors[:o] + + return parsed, errors +} + +// sameFile returns true if x and y have the same basename and denote +// the same file. +// +func sameFile(x, y string) bool { + if x == y { + // It could be the case that y doesn't exist. + // For instance, it may be an overlay file that + // hasn't been written to disk. To handle that case + // let x == y through. (We added the exact absolute path + // string to the CompiledGoFiles list, so the unwritten + // overlay case implies x==y.) + return true + } + if strings.EqualFold(filepath.Base(x), filepath.Base(y)) { // (optimisation) + if xi, err := os.Stat(x); err == nil { + if yi, err := os.Stat(y); err == nil { + return os.SameFile(xi, yi) + } + } + } + return false +} + +// loadFromExportData returns type information for the specified +// package, loading it from an export data file on the first request. +func (ld *loader) loadFromExportData(lpkg *loaderPackage) (*types.Package, error) { + if lpkg.PkgPath == "" { + log.Fatalf("internal error: Package %s has no PkgPath", lpkg) + } + + // Because gcexportdata.Read has the potential to create or + // modify the types.Package for each node in the transitive + // closure of dependencies of lpkg, all exportdata operations + // must be sequential. (Finer-grained locking would require + // changes to the gcexportdata API.) + // + // The exportMu lock guards the Package.Pkg field and the + // types.Package it points to, for each Package in the graph. + // + // Not all accesses to Package.Pkg need to be protected by exportMu: + // graph ordering ensures that direct dependencies of source + // packages are fully loaded before the importer reads their Pkg field. + ld.exportMu.Lock() + defer ld.exportMu.Unlock() + + if tpkg := lpkg.Types; tpkg != nil && tpkg.Complete() { + return tpkg, nil // cache hit + } + + lpkg.IllTyped = true // fail safe + + if lpkg.ExportFile == "" { + // Errors while building export data will have been printed to stderr. + return nil, fmt.Errorf("no export data file") + } + f, err := os.Open(lpkg.ExportFile) + if err != nil { + return nil, err + } + defer f.Close() + + // Read gc export data. + // + // We don't currently support gccgo export data because all + // underlying workspaces use the gc toolchain. (Even build + // systems that support gccgo don't use it for workspace + // queries.) + r, err := gcexportdata.NewReader(f) + if err != nil { + return nil, fmt.Errorf("reading %s: %v", lpkg.ExportFile, err) + } + + // Build the view. + // + // The gcexportdata machinery has no concept of package ID. + // It identifies packages by their PkgPath, which although not + // globally unique is unique within the scope of one invocation + // of the linker, type-checker, or gcexportdata. + // + // So, we must build a PkgPath-keyed view of the global + // (conceptually ID-keyed) cache of packages and pass it to + // gcexportdata. The view must contain every existing + // package that might possibly be mentioned by the + // current package---its transitive closure. + // + // In loadPackage, we unconditionally create a types.Package for + // each dependency so that export data loading does not + // create new ones. + // + // TODO(adonovan): it would be simpler and more efficient + // if the export data machinery invoked a callback to + // get-or-create a package instead of a map. + // + view := make(map[string]*types.Package) // view seen by gcexportdata + seen := make(map[*loaderPackage]bool) // all visited packages + var visit func(pkgs map[string]*Package) + visit = func(pkgs map[string]*Package) { + for _, p := range pkgs { + lpkg := ld.pkgs[p.ID] + if !seen[lpkg] { + seen[lpkg] = true + view[lpkg.PkgPath] = lpkg.Types + visit(lpkg.Imports) + } + } + } + visit(lpkg.Imports) + + viewLen := len(view) + 1 // adding the self package + // Parse the export data. + // (May modify incomplete packages in view but not create new ones.) + tpkg, err := gcexportdata.Read(r, ld.Fset, view, lpkg.PkgPath) + if err != nil { + return nil, fmt.Errorf("reading %s: %v", lpkg.ExportFile, err) + } + if viewLen != len(view) { + log.Fatalf("Unexpected package creation during export data loading") + } + + lpkg.Types = tpkg + lpkg.IllTyped = false + + return tpkg, nil +} + +// impliedLoadMode returns loadMode with its dependencies. +func impliedLoadMode(loadMode LoadMode) LoadMode { + if loadMode&NeedTypesInfo != 0 && loadMode&NeedImports == 0 { + // If NeedTypesInfo, go/packages needs to do typechecking itself so it can + // associate type info with the AST. To do so, we need the export data + // for dependencies, which means we need to ask for the direct dependencies. + // NeedImports is used to ask for the direct dependencies. + loadMode |= NeedImports + } + + if loadMode&NeedDeps != 0 && loadMode&NeedImports == 0 { + // With NeedDeps we need to load at least direct dependencies. + // NeedImports is used to ask for the direct dependencies. + loadMode |= NeedImports + } + + return loadMode +} + +func usesExportData(cfg *Config) bool { + return cfg.Mode&NeedExportsFile != 0 || cfg.Mode&NeedTypes != 0 && cfg.Mode&NeedDeps == 0 +} diff --git a/vendor/golang.org/x/tools/go/packages/visit.go b/vendor/golang.org/x/tools/go/packages/visit.go new file mode 100644 index 00000000..b13cb081 --- /dev/null +++ b/vendor/golang.org/x/tools/go/packages/visit.go @@ -0,0 +1,55 @@ +package packages + +import ( + "fmt" + "os" + "sort" +) + +// Visit visits all the packages in the import graph whose roots are +// pkgs, calling the optional pre function the first time each package +// is encountered (preorder), and the optional post function after a +// package's dependencies have been visited (postorder). +// The boolean result of pre(pkg) determines whether +// the imports of package pkg are visited. +func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) { + seen := make(map[*Package]bool) + var visit func(*Package) + visit = func(pkg *Package) { + if !seen[pkg] { + seen[pkg] = true + + if pre == nil || pre(pkg) { + paths := make([]string, 0, len(pkg.Imports)) + for path := range pkg.Imports { + paths = append(paths, path) + } + sort.Strings(paths) // Imports is a map, this makes visit stable + for _, path := range paths { + visit(pkg.Imports[path]) + } + } + + if post != nil { + post(pkg) + } + } + } + for _, pkg := range pkgs { + visit(pkg) + } +} + +// PrintErrors prints to os.Stderr the accumulated errors of all +// packages in the import graph rooted at pkgs, dependencies first. +// PrintErrors returns the number of errors printed. +func PrintErrors(pkgs []*Package) int { + var n int + Visit(pkgs, nil, func(pkg *Package) { + for _, err := range pkg.Errors { + fmt.Fprintln(os.Stderr, err) + n++ + } + }) + return n +} diff --git a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go new file mode 100644 index 00000000..882e3b3d --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go @@ -0,0 +1,523 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package objectpath defines a naming scheme for types.Objects +// (that is, named entities in Go programs) relative to their enclosing +// package. +// +// Type-checker objects are canonical, so they are usually identified by +// their address in memory (a pointer), but a pointer has meaning only +// within one address space. By contrast, objectpath names allow the +// identity of an object to be sent from one program to another, +// establishing a correspondence between types.Object variables that are +// distinct but logically equivalent. +// +// A single object may have multiple paths. In this example, +// type A struct{ X int } +// type B A +// the field X has two paths due to its membership of both A and B. +// The For(obj) function always returns one of these paths, arbitrarily +// but consistently. +package objectpath + +import ( + "fmt" + "strconv" + "strings" + + "go/types" +) + +// A Path is an opaque name that identifies a types.Object +// relative to its package. Conceptually, the name consists of a +// sequence of destructuring operations applied to the package scope +// to obtain the original object. +// The name does not include the package itself. +type Path string + +// Encoding +// +// An object path is a textual and (with training) human-readable encoding +// of a sequence of destructuring operators, starting from a types.Package. +// The sequences represent a path through the package/object/type graph. +// We classify these operators by their type: +// +// PO package->object Package.Scope.Lookup +// OT object->type Object.Type +// TT type->type Type.{Elem,Key,Params,Results,Underlying} [EKPRU] +// TO type->object Type.{At,Field,Method,Obj} [AFMO] +// +// All valid paths start with a package and end at an object +// and thus may be defined by the regular language: +// +// objectpath = PO (OT TT* TO)* +// +// The concrete encoding follows directly: +// - The only PO operator is Package.Scope.Lookup, which requires an identifier. +// - The only OT operator is Object.Type, +// which we encode as '.' because dot cannot appear in an identifier. +// - The TT operators are encoded as [EKPRU]. +// - The OT operators are encoded as [AFMO]; +// three of these (At,Field,Method) require an integer operand, +// which is encoded as a string of decimal digits. +// These indices are stable across different representations +// of the same package, even source and export data. +// +// In the example below, +// +// package p +// +// type T interface { +// f() (a string, b struct{ X int }) +// } +// +// field X has the path "T.UM0.RA1.F0", +// representing the following sequence of operations: +// +// p.Lookup("T") T +// .Type().Underlying().Method(0). f +// .Type().Results().At(1) b +// .Type().Field(0) X +// +// The encoding is not maximally compact---every R or P is +// followed by an A, for example---but this simplifies the +// encoder and decoder. +// +const ( + // object->type operators + opType = '.' // .Type() (Object) + + // type->type operators + opElem = 'E' // .Elem() (Pointer, Slice, Array, Chan, Map) + opKey = 'K' // .Key() (Map) + opParams = 'P' // .Params() (Signature) + opResults = 'R' // .Results() (Signature) + opUnderlying = 'U' // .Underlying() (Named) + + // type->object operators + opAt = 'A' // .At(i) (Tuple) + opField = 'F' // .Field(i) (Struct) + opMethod = 'M' // .Method(i) (Named or Interface; not Struct: "promoted" names are ignored) + opObj = 'O' // .Obj() (Named) +) + +// The For function returns the path to an object relative to its package, +// or an error if the object is not accessible from the package's Scope. +// +// The For function guarantees to return a path only for the following objects: +// - package-level types +// - exported package-level non-types +// - methods +// - parameter and result variables +// - struct fields +// These objects are sufficient to define the API of their package. +// The objects described by a package's export data are drawn from this set. +// +// For does not return a path for predeclared names, imported package +// names, local names, and unexported package-level names (except +// types). +// +// Example: given this definition, +// +// package p +// +// type T interface { +// f() (a string, b struct{ X int }) +// } +// +// For(X) would return a path that denotes the following sequence of operations: +// +// p.Scope().Lookup("T") (TypeName T) +// .Type().Underlying().Method(0). (method Func f) +// .Type().Results().At(1) (field Var b) +// .Type().Field(0) (field Var X) +// +// where p is the package (*types.Package) to which X belongs. +func For(obj types.Object) (Path, error) { + pkg := obj.Pkg() + + // This table lists the cases of interest. + // + // Object Action + // ------ ------ + // nil reject + // builtin reject + // pkgname reject + // label reject + // var + // package-level accept + // func param/result accept + // local reject + // struct field accept + // const + // package-level accept + // local reject + // func + // package-level accept + // init functions reject + // concrete method accept + // interface method accept + // type + // package-level accept + // local reject + // + // The only accessible package-level objects are members of pkg itself. + // + // The cases are handled in four steps: + // + // 1. reject nil and builtin + // 2. accept package-level objects + // 3. reject obviously invalid objects + // 4. search the API for the path to the param/result/field/method. + + // 1. reference to nil or builtin? + if pkg == nil { + return "", fmt.Errorf("predeclared %s has no path", obj) + } + scope := pkg.Scope() + + // 2. package-level object? + if scope.Lookup(obj.Name()) == obj { + // Only exported objects (and non-exported types) have a path. + // Non-exported types may be referenced by other objects. + if _, ok := obj.(*types.TypeName); !ok && !obj.Exported() { + return "", fmt.Errorf("no path for non-exported %v", obj) + } + return Path(obj.Name()), nil + } + + // 3. Not a package-level object. + // Reject obviously non-viable cases. + switch obj := obj.(type) { + case *types.Const, // Only package-level constants have a path. + *types.TypeName, // Only package-level types have a path. + *types.Label, // Labels are function-local. + *types.PkgName: // PkgNames are file-local. + return "", fmt.Errorf("no path for %v", obj) + + case *types.Var: + // Could be: + // - a field (obj.IsField()) + // - a func parameter or result + // - a local var. + // Sadly there is no way to distinguish + // a param/result from a local + // so we must proceed to the find. + + case *types.Func: + // A func, if not package-level, must be a method. + if recv := obj.Type().(*types.Signature).Recv(); recv == nil { + return "", fmt.Errorf("func is not a method: %v", obj) + } + // TODO(adonovan): opt: if the method is concrete, + // do a specialized version of the rest of this function so + // that it's O(1) not O(|scope|). Basically 'find' is needed + // only for struct fields and interface methods. + + default: + panic(obj) + } + + // 4. Search the API for the path to the var (field/param/result) or method. + + // First inspect package-level named types. + // In the presence of path aliases, these give + // the best paths because non-types may + // refer to types, but not the reverse. + empty := make([]byte, 0, 48) // initial space + for _, name := range scope.Names() { + o := scope.Lookup(name) + tname, ok := o.(*types.TypeName) + if !ok { + continue // handle non-types in second pass + } + + path := append(empty, name...) + path = append(path, opType) + + T := o.Type() + + if tname.IsAlias() { + // type alias + if r := find(obj, T, path); r != nil { + return Path(r), nil + } + } else { + // defined (named) type + if r := find(obj, T.Underlying(), append(path, opUnderlying)); r != nil { + return Path(r), nil + } + } + } + + // Then inspect everything else: + // non-types, and declared methods of defined types. + for _, name := range scope.Names() { + o := scope.Lookup(name) + path := append(empty, name...) + if _, ok := o.(*types.TypeName); !ok { + if o.Exported() { + // exported non-type (const, var, func) + if r := find(obj, o.Type(), append(path, opType)); r != nil { + return Path(r), nil + } + } + continue + } + + // Inspect declared methods of defined types. + if T, ok := o.Type().(*types.Named); ok { + path = append(path, opType) + for i := 0; i < T.NumMethods(); i++ { + m := T.Method(i) + path2 := appendOpArg(path, opMethod, i) + if m == obj { + return Path(path2), nil // found declared method + } + if r := find(obj, m.Type(), append(path2, opType)); r != nil { + return Path(r), nil + } + } + } + } + + return "", fmt.Errorf("can't find path for %v in %s", obj, pkg.Path()) +} + +func appendOpArg(path []byte, op byte, arg int) []byte { + path = append(path, op) + path = strconv.AppendInt(path, int64(arg), 10) + return path +} + +// find finds obj within type T, returning the path to it, or nil if not found. +func find(obj types.Object, T types.Type, path []byte) []byte { + switch T := T.(type) { + case *types.Basic, *types.Named: + // Named types belonging to pkg were handled already, + // so T must belong to another package. No path. + return nil + case *types.Pointer: + return find(obj, T.Elem(), append(path, opElem)) + case *types.Slice: + return find(obj, T.Elem(), append(path, opElem)) + case *types.Array: + return find(obj, T.Elem(), append(path, opElem)) + case *types.Chan: + return find(obj, T.Elem(), append(path, opElem)) + case *types.Map: + if r := find(obj, T.Key(), append(path, opKey)); r != nil { + return r + } + return find(obj, T.Elem(), append(path, opElem)) + case *types.Signature: + if r := find(obj, T.Params(), append(path, opParams)); r != nil { + return r + } + return find(obj, T.Results(), append(path, opResults)) + case *types.Struct: + for i := 0; i < T.NumFields(); i++ { + f := T.Field(i) + path2 := appendOpArg(path, opField, i) + if f == obj { + return path2 // found field var + } + if r := find(obj, f.Type(), append(path2, opType)); r != nil { + return r + } + } + return nil + case *types.Tuple: + for i := 0; i < T.Len(); i++ { + v := T.At(i) + path2 := appendOpArg(path, opAt, i) + if v == obj { + return path2 // found param/result var + } + if r := find(obj, v.Type(), append(path2, opType)); r != nil { + return r + } + } + return nil + case *types.Interface: + for i := 0; i < T.NumMethods(); i++ { + m := T.Method(i) + path2 := appendOpArg(path, opMethod, i) + if m == obj { + return path2 // found interface method + } + if r := find(obj, m.Type(), append(path2, opType)); r != nil { + return r + } + } + return nil + } + panic(T) +} + +// Object returns the object denoted by path p within the package pkg. +func Object(pkg *types.Package, p Path) (types.Object, error) { + if p == "" { + return nil, fmt.Errorf("empty path") + } + + pathstr := string(p) + var pkgobj, suffix string + if dot := strings.IndexByte(pathstr, opType); dot < 0 { + pkgobj = pathstr + } else { + pkgobj = pathstr[:dot] + suffix = pathstr[dot:] // suffix starts with "." + } + + obj := pkg.Scope().Lookup(pkgobj) + if obj == nil { + return nil, fmt.Errorf("package %s does not contain %q", pkg.Path(), pkgobj) + } + + // abstraction of *types.{Pointer,Slice,Array,Chan,Map} + type hasElem interface { + Elem() types.Type + } + // abstraction of *types.{Interface,Named} + type hasMethods interface { + Method(int) *types.Func + NumMethods() int + } + + // The loop state is the pair (t, obj), + // exactly one of which is non-nil, initially obj. + // All suffixes start with '.' (the only object->type operation), + // followed by optional type->type operations, + // then a type->object operation. + // The cycle then repeats. + var t types.Type + for suffix != "" { + code := suffix[0] + suffix = suffix[1:] + + // Codes [AFM] have an integer operand. + var index int + switch code { + case opAt, opField, opMethod: + rest := strings.TrimLeft(suffix, "0123456789") + numerals := suffix[:len(suffix)-len(rest)] + suffix = rest + i, err := strconv.Atoi(numerals) + if err != nil { + return nil, fmt.Errorf("invalid path: bad numeric operand %q for code %q", numerals, code) + } + index = int(i) + case opObj: + // no operand + default: + // The suffix must end with a type->object operation. + if suffix == "" { + return nil, fmt.Errorf("invalid path: ends with %q, want [AFMO]", code) + } + } + + if code == opType { + if t != nil { + return nil, fmt.Errorf("invalid path: unexpected %q in type context", opType) + } + t = obj.Type() + obj = nil + continue + } + + if t == nil { + return nil, fmt.Errorf("invalid path: code %q in object context", code) + } + + // Inv: t != nil, obj == nil + + switch code { + case opElem: + hasElem, ok := t.(hasElem) // Pointer, Slice, Array, Chan, Map + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want pointer, slice, array, chan or map)", code, t, t) + } + t = hasElem.Elem() + + case opKey: + mapType, ok := t.(*types.Map) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want map)", code, t, t) + } + t = mapType.Key() + + case opParams: + sig, ok := t.(*types.Signature) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want signature)", code, t, t) + } + t = sig.Params() + + case opResults: + sig, ok := t.(*types.Signature) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want signature)", code, t, t) + } + t = sig.Results() + + case opUnderlying: + named, ok := t.(*types.Named) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %s, want named)", code, t, t) + } + t = named.Underlying() + + case opAt: + tuple, ok := t.(*types.Tuple) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %s, want tuple)", code, t, t) + } + if n := tuple.Len(); index >= n { + return nil, fmt.Errorf("tuple index %d out of range [0-%d)", index, n) + } + obj = tuple.At(index) + t = nil + + case opField: + structType, ok := t.(*types.Struct) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %T, want struct)", code, t, t) + } + if n := structType.NumFields(); index >= n { + return nil, fmt.Errorf("field index %d out of range [0-%d)", index, n) + } + obj = structType.Field(index) + t = nil + + case opMethod: + hasMethods, ok := t.(hasMethods) // Interface or Named + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %s, want interface or named)", code, t, t) + } + if n := hasMethods.NumMethods(); index >= n { + return nil, fmt.Errorf("method index %d out of range [0-%d)", index, n) + } + obj = hasMethods.Method(index) + t = nil + + case opObj: + named, ok := t.(*types.Named) + if !ok { + return nil, fmt.Errorf("cannot apply %q to %s (got %s, want named)", code, t, t) + } + obj = named.Obj() + t = nil + + default: + return nil, fmt.Errorf("invalid path: unknown code %q", code) + } + } + + if obj.Pkg() != pkg { + return nil, fmt.Errorf("path denotes %s, which belongs to a different package", obj) + } + + return obj, nil // success +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/callee.go b/vendor/golang.org/x/tools/go/types/typeutil/callee.go new file mode 100644 index 00000000..38f596da --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/callee.go @@ -0,0 +1,46 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package typeutil + +import ( + "go/ast" + "go/types" + + "golang.org/x/tools/go/ast/astutil" +) + +// Callee returns the named target of a function call, if any: +// a function, method, builtin, or variable. +func Callee(info *types.Info, call *ast.CallExpr) types.Object { + var obj types.Object + switch fun := astutil.Unparen(call.Fun).(type) { + case *ast.Ident: + obj = info.Uses[fun] // type, var, builtin, or declared func + case *ast.SelectorExpr: + if sel, ok := info.Selections[fun]; ok { + obj = sel.Obj() // method or field + } else { + obj = info.Uses[fun.Sel] // qualified identifier? + } + } + if _, ok := obj.(*types.TypeName); ok { + return nil // T(x) is a conversion, not a call + } + return obj +} + +// StaticCallee returns the target (function or method) of a static +// function call, if any. It returns nil for calls to builtins. +func StaticCallee(info *types.Info, call *ast.CallExpr) *types.Func { + if f, ok := Callee(info, call).(*types.Func); ok && !interfaceMethod(f) { + return f + } + return nil +} + +func interfaceMethod(f *types.Func) bool { + recv := f.Type().(*types.Signature).Recv() + return recv != nil && types.IsInterface(recv.Type()) +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/imports.go b/vendor/golang.org/x/tools/go/types/typeutil/imports.go new file mode 100644 index 00000000..9c441dba --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/imports.go @@ -0,0 +1,31 @@ +// 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 typeutil + +import "go/types" + +// Dependencies returns all dependencies of the specified packages. +// +// Dependent packages appear in topological order: if package P imports +// package Q, Q appears earlier than P in the result. +// The algorithm follows import statements in the order they +// appear in the source code, so the result is a total order. +// +func Dependencies(pkgs ...*types.Package) []*types.Package { + var result []*types.Package + seen := make(map[*types.Package]bool) + var visit func(pkgs []*types.Package) + visit = func(pkgs []*types.Package) { + for _, p := range pkgs { + if !seen[p] { + seen[p] = true + visit(p.Imports()) + result = append(result, p) + } + } + } + visit(pkgs) + return result +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map.go b/vendor/golang.org/x/tools/go/types/typeutil/map.go new file mode 100644 index 00000000..c7f75450 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/map.go @@ -0,0 +1,313 @@ +// 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 typeutil defines various utilities for types, such as Map, +// a mapping from types.Type to interface{} values. +package typeutil // import "golang.org/x/tools/go/types/typeutil" + +import ( + "bytes" + "fmt" + "go/types" + "reflect" +) + +// Map is a hash-table-based mapping from types (types.Type) to +// arbitrary interface{} values. The concrete types that implement +// the Type interface are pointers. Since they are not canonicalized, +// == cannot be used to check for equivalence, and thus we cannot +// simply use a Go map. +// +// Just as with map[K]V, a nil *Map is a valid empty map. +// +// Not thread-safe. +// +type Map struct { + hasher Hasher // shared by many Maps + table map[uint32][]entry // maps hash to bucket; entry.key==nil means unused + length int // number of map entries +} + +// entry is an entry (key/value association) in a hash bucket. +type entry struct { + key types.Type + value interface{} +} + +// SetHasher sets the hasher used by Map. +// +// All Hashers are functionally equivalent but contain internal state +// used to cache the results of hashing previously seen types. +// +// A single Hasher created by MakeHasher() may be shared among many +// Maps. This is recommended if the instances have many keys in +// common, as it will amortize the cost of hash computation. +// +// A Hasher may grow without bound as new types are seen. Even when a +// type is deleted from the map, the Hasher never shrinks, since other +// types in the map may reference the deleted type indirectly. +// +// Hashers are not thread-safe, and read-only operations such as +// Map.Lookup require updates to the hasher, so a full Mutex lock (not a +// read-lock) is require around all Map operations if a shared +// hasher is accessed from multiple threads. +// +// If SetHasher is not called, the Map will create a private hasher at +// the first call to Insert. +// +func (m *Map) SetHasher(hasher Hasher) { + m.hasher = hasher +} + +// Delete removes the entry with the given key, if any. +// It returns true if the entry was found. +// +func (m *Map) Delete(key types.Type) bool { + if m != nil && m.table != nil { + hash := m.hasher.Hash(key) + bucket := m.table[hash] + for i, e := range bucket { + if e.key != nil && types.Identical(key, e.key) { + // We can't compact the bucket as it + // would disturb iterators. + bucket[i] = entry{} + m.length-- + return true + } + } + } + return false +} + +// At returns the map entry for the given key. +// The result is nil if the entry is not present. +// +func (m *Map) At(key types.Type) interface{} { + if m != nil && m.table != nil { + for _, e := range m.table[m.hasher.Hash(key)] { + if e.key != nil && types.Identical(key, e.key) { + return e.value + } + } + } + return nil +} + +// Set sets the map entry for key to val, +// and returns the previous entry, if any. +func (m *Map) Set(key types.Type, value interface{}) (prev interface{}) { + if m.table != nil { + hash := m.hasher.Hash(key) + bucket := m.table[hash] + var hole *entry + for i, e := range bucket { + if e.key == nil { + hole = &bucket[i] + } else if types.Identical(key, e.key) { + prev = e.value + bucket[i].value = value + return + } + } + + if hole != nil { + *hole = entry{key, value} // overwrite deleted entry + } else { + m.table[hash] = append(bucket, entry{key, value}) + } + } else { + if m.hasher.memo == nil { + m.hasher = MakeHasher() + } + hash := m.hasher.Hash(key) + m.table = map[uint32][]entry{hash: {entry{key, value}}} + } + + m.length++ + return +} + +// Len returns the number of map entries. +func (m *Map) Len() int { + if m != nil { + return m.length + } + return 0 +} + +// Iterate calls function f on each entry in the map in unspecified order. +// +// If f should mutate the map, Iterate provides the same guarantees as +// Go maps: if f deletes a map entry that Iterate has not yet reached, +// f will not be invoked for it, but if f inserts a map entry that +// Iterate has not yet reached, whether or not f will be invoked for +// it is unspecified. +// +func (m *Map) Iterate(f func(key types.Type, value interface{})) { + if m != nil { + for _, bucket := range m.table { + for _, e := range bucket { + if e.key != nil { + f(e.key, e.value) + } + } + } + } +} + +// Keys returns a new slice containing the set of map keys. +// The order is unspecified. +func (m *Map) Keys() []types.Type { + keys := make([]types.Type, 0, m.Len()) + m.Iterate(func(key types.Type, _ interface{}) { + keys = append(keys, key) + }) + return keys +} + +func (m *Map) toString(values bool) string { + if m == nil { + return "{}" + } + var buf bytes.Buffer + fmt.Fprint(&buf, "{") + sep := "" + m.Iterate(func(key types.Type, value interface{}) { + fmt.Fprint(&buf, sep) + sep = ", " + fmt.Fprint(&buf, key) + if values { + fmt.Fprintf(&buf, ": %q", value) + } + }) + fmt.Fprint(&buf, "}") + return buf.String() +} + +// String returns a string representation of the map's entries. +// Values are printed using fmt.Sprintf("%v", v). +// Order is unspecified. +// +func (m *Map) String() string { + return m.toString(true) +} + +// KeysString returns a string representation of the map's key set. +// Order is unspecified. +// +func (m *Map) KeysString() string { + return m.toString(false) +} + +//////////////////////////////////////////////////////////////////////// +// Hasher + +// A Hasher maps each type to its hash value. +// For efficiency, a hasher uses memoization; thus its memory +// footprint grows monotonically over time. +// Hashers are not thread-safe. +// Hashers have reference semantics. +// Call MakeHasher to create a Hasher. +type Hasher struct { + memo map[types.Type]uint32 +} + +// MakeHasher returns a new Hasher instance. +func MakeHasher() Hasher { + return Hasher{make(map[types.Type]uint32)} +} + +// Hash computes a hash value for the given type t such that +// Identical(t, t') => Hash(t) == Hash(t'). +func (h Hasher) Hash(t types.Type) uint32 { + hash, ok := h.memo[t] + if !ok { + hash = h.hashFor(t) + h.memo[t] = hash + } + return hash +} + +// hashString computes the Fowler–Noll–Vo hash of s. +func hashString(s string) uint32 { + var h uint32 + for i := 0; i < len(s); i++ { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +// hashFor computes the hash of t. +func (h Hasher) hashFor(t types.Type) uint32 { + // See Identical for rationale. + switch t := t.(type) { + case *types.Basic: + return uint32(t.Kind()) + + case *types.Array: + return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem()) + + case *types.Slice: + return 9049 + 2*h.Hash(t.Elem()) + + case *types.Struct: + var hash uint32 = 9059 + for i, n := 0, t.NumFields(); i < n; i++ { + f := t.Field(i) + if f.Anonymous() { + hash += 8861 + } + hash += hashString(t.Tag(i)) + hash += hashString(f.Name()) // (ignore f.Pkg) + hash += h.Hash(f.Type()) + } + return hash + + case *types.Pointer: + return 9067 + 2*h.Hash(t.Elem()) + + case *types.Signature: + var hash uint32 = 9091 + if t.Variadic() { + hash *= 8863 + } + return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results()) + + case *types.Interface: + var hash uint32 = 9103 + for i, n := 0, t.NumMethods(); i < n; i++ { + // See go/types.identicalMethods for rationale. + // Method order is not significant. + // Ignore m.Pkg(). + m := t.Method(i) + hash += 3*hashString(m.Name()) + 5*h.Hash(m.Type()) + } + return hash + + case *types.Map: + return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem()) + + case *types.Chan: + return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem()) + + case *types.Named: + // Not safe with a copying GC; objects may move. + return uint32(reflect.ValueOf(t.Obj()).Pointer()) + + case *types.Tuple: + return h.hashTuple(t) + } + panic(t) +} + +func (h Hasher) hashTuple(tuple *types.Tuple) uint32 { + // See go/types.identicalTypes for rationale. + n := tuple.Len() + var hash uint32 = 9137 + 2*uint32(n) + for i := 0; i < n; i++ { + hash += 3 * h.Hash(tuple.At(i).Type()) + } + return hash +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go new file mode 100644 index 00000000..32084610 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go @@ -0,0 +1,72 @@ +// 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. + +// This file implements a cache of method sets. + +package typeutil + +import ( + "go/types" + "sync" +) + +// A MethodSetCache records the method set of each type T for which +// MethodSet(T) is called so that repeat queries are fast. +// The zero value is a ready-to-use cache instance. +type MethodSetCache struct { + mu sync.Mutex + named map[*types.Named]struct{ value, pointer *types.MethodSet } // method sets for named N and *N + others map[types.Type]*types.MethodSet // all other types +} + +// MethodSet returns the method set of type T. It is thread-safe. +// +// If cache is nil, this function is equivalent to types.NewMethodSet(T). +// Utility functions can thus expose an optional *MethodSetCache +// parameter to clients that care about performance. +// +func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet { + if cache == nil { + return types.NewMethodSet(T) + } + cache.mu.Lock() + defer cache.mu.Unlock() + + switch T := T.(type) { + case *types.Named: + return cache.lookupNamed(T).value + + case *types.Pointer: + if N, ok := T.Elem().(*types.Named); ok { + return cache.lookupNamed(N).pointer + } + } + + // all other types + // (The map uses pointer equivalence, not type identity.) + mset := cache.others[T] + if mset == nil { + mset = types.NewMethodSet(T) + if cache.others == nil { + cache.others = make(map[types.Type]*types.MethodSet) + } + cache.others[T] = mset + } + return mset +} + +func (cache *MethodSetCache) lookupNamed(named *types.Named) struct{ value, pointer *types.MethodSet } { + if cache.named == nil { + cache.named = make(map[*types.Named]struct{ value, pointer *types.MethodSet }) + } + // Avoid recomputing mset(*T) for each distinct Pointer + // instance whose underlying type is a named type. + msets, ok := cache.named[named] + if !ok { + msets.value = types.NewMethodSet(named) + msets.pointer = types.NewMethodSet(types.NewPointer(named)) + cache.named[named] = msets + } + return msets +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/ui.go b/vendor/golang.org/x/tools/go/types/typeutil/ui.go new file mode 100644 index 00000000..9849c24c --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/ui.go @@ -0,0 +1,52 @@ +// 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 typeutil + +// This file defines utilities for user interfaces that display types. + +import "go/types" + +// IntuitiveMethodSet returns the intuitive method set of a type T, +// which is the set of methods you can call on an addressable value of +// that type. +// +// The result always contains MethodSet(T), and is exactly MethodSet(T) +// for interface types and for pointer-to-concrete types. +// For all other concrete types T, the result additionally +// contains each method belonging to *T if there is no identically +// named method on T itself. +// +// This corresponds to user intuition about method sets; +// this function is intended only for user interfaces. +// +// The order of the result is as for types.MethodSet(T). +// +func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection { + isPointerToConcrete := func(T types.Type) bool { + ptr, ok := T.(*types.Pointer) + return ok && !types.IsInterface(ptr.Elem()) + } + + var result []*types.Selection + mset := msets.MethodSet(T) + if types.IsInterface(T) || isPointerToConcrete(T) { + for i, n := 0, mset.Len(); i < n; i++ { + result = append(result, mset.At(i)) + } + } else { + // T is some other concrete type. + // Report methods of T and *T, preferring those of T. + pmset := msets.MethodSet(types.NewPointer(T)) + for i, n := 0, pmset.Len(); i < n; i++ { + meth := pmset.At(i) + if m := mset.Lookup(meth.Obj().Pkg(), meth.Obj().Name()); m != nil { + meth = m + } + result = append(result, meth) + } + + } + return result +} diff --git a/vendor/golang.org/x/tools/internal/analysisinternal/analysis.go b/vendor/golang.org/x/tools/internal/analysisinternal/analysis.go new file mode 100644 index 00000000..26586810 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/analysisinternal/analysis.go @@ -0,0 +1,118 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package analysisinternal exposes internal-only fields from go/analysis. +package analysisinternal + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + "go/types" + "strings" + + "golang.org/x/tools/go/ast/astutil" +) + +func TypeErrorEndPos(fset *token.FileSet, src []byte, start token.Pos) token.Pos { + // Get the end position for the type error. + offset, end := fset.PositionFor(start, false).Offset, start + if offset >= len(src) { + return end + } + if width := bytes.IndexAny(src[offset:], " \n,():;[]+-*"); width > 0 { + end = start + token.Pos(width) + } + return end +} + +func ZeroValue(fset *token.FileSet, f *ast.File, pkg *types.Package, typ types.Type) ast.Expr { + under := typ + if n, ok := typ.(*types.Named); ok { + under = n.Underlying() + } + switch u := under.(type) { + case *types.Basic: + switch { + case u.Info()&types.IsNumeric != 0: + return &ast.BasicLit{Kind: token.INT, Value: "0"} + case u.Info()&types.IsBoolean != 0: + return &ast.Ident{Name: "false"} + case u.Info()&types.IsString != 0: + return &ast.BasicLit{Kind: token.STRING, Value: `""`} + default: + panic("unknown basic type") + } + case *types.Chan, *types.Interface, *types.Map, *types.Pointer, *types.Signature, *types.Slice: + return ast.NewIdent("nil") + case *types.Struct: + texpr := typeExpr(fset, f, pkg, typ) // typ because we want the name here. + if texpr == nil { + return nil + } + return &ast.CompositeLit{ + Type: texpr, + } + case *types.Array: + texpr := typeExpr(fset, f, pkg, u.Elem()) + if texpr == nil { + return nil + } + return &ast.CompositeLit{ + Type: &ast.ArrayType{ + Elt: texpr, + Len: &ast.BasicLit{Kind: token.INT, Value: fmt.Sprintf("%v", u.Len())}, + }, + } + } + return nil +} + +func typeExpr(fset *token.FileSet, f *ast.File, pkg *types.Package, typ types.Type) ast.Expr { + switch t := typ.(type) { + case *types.Basic: + switch t.Kind() { + case types.UnsafePointer: + return &ast.SelectorExpr{X: ast.NewIdent("unsafe"), Sel: ast.NewIdent("Pointer")} + default: + return ast.NewIdent(t.Name()) + } + case *types.Named: + if t.Obj().Pkg() == pkg { + return ast.NewIdent(t.Obj().Name()) + } + pkgName := t.Obj().Pkg().Name() + // If the file already imports the package under another name, use that. + for _, group := range astutil.Imports(fset, f) { + for _, cand := range group { + if strings.Trim(cand.Path.Value, `"`) == t.Obj().Pkg().Path() { + if cand.Name != nil && cand.Name.Name != "" { + pkgName = cand.Name.Name + } + } + } + } + if pkgName == "." { + return ast.NewIdent(t.Obj().Name()) + } + return &ast.SelectorExpr{ + X: ast.NewIdent(pkgName), + Sel: ast.NewIdent(t.Obj().Name()), + } + default: + return nil // TODO: anonymous structs, but who does that + } +} + +var GetTypeErrors = func(p interface{}) []types.Error { return nil } +var SetTypeErrors = func(p interface{}, errors []types.Error) {} + +type TypeErrorPass string + +const ( + NoNewVars TypeErrorPass = "nonewvars" + NoResultValues TypeErrorPass = "noresultvalues" + UndeclaredName TypeErrorPass = "undeclaredname" +) diff --git a/vendor/golang.org/x/tools/internal/event/core/event.go b/vendor/golang.org/x/tools/internal/event/core/event.go new file mode 100644 index 00000000..29f293e6 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/event/core/event.go @@ -0,0 +1,106 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package core provides support for event based telemetry. +package core + +import ( + "fmt" + "time" + + "golang.org/x/tools/internal/event/label" +) + +type eventType uint8 + +const ( + invalidType = eventType(iota) + LogType // an event that should be recorded in a log + StartSpanType // the start of a span of time + EndSpanType // the end of a span of time + LabelType // some values that should be noted for later events + DetachType // an event that causes a context to detach + RecordType // a value that should be tracked +) + +// Event holds the information about an event of note that ocurred. +type Event struct { + at time.Time + + typ eventType + + // As events are often on the stack, storing the first few labels directly + // in the event can avoid an allocation at all for the very common cases of + // simple events. + // The length needs to be large enough to cope with the majority of events + // but no so large as to cause undue stack pressure. + // A log message with two values will use 3 labels (one for each value and + // one for the message itself). + + static [3]label.Label // inline storage for the first few labels + dynamic []label.Label // dynamically sized storage for remaining labels +} + +// eventLabelMap implements label.Map for a the labels of an Event. +type eventLabelMap struct { + event Event +} + +func (ev Event) At() time.Time { return ev.at } + +func (ev Event) IsLog() bool { return ev.typ == LogType } +func (ev Event) IsEndSpan() bool { return ev.typ == EndSpanType } +func (ev Event) IsStartSpan() bool { return ev.typ == StartSpanType } +func (ev Event) IsLabel() bool { return ev.typ == LabelType } +func (ev Event) IsDetach() bool { return ev.typ == DetachType } +func (ev Event) IsRecord() bool { return ev.typ == RecordType } + +func (ev Event) Format(f fmt.State, r rune) { + if !ev.at.IsZero() { + fmt.Fprint(f, ev.at.Format("2006/01/02 15:04:05 ")) + } + for index := 0; ev.Valid(index); index++ { + l := ev.Label(index) + fmt.Fprintf(f, "\n\t%v", l) + } +} + +func (ev Event) Valid(index int) bool { + return index >= 0 && index < len(ev.static)+len(ev.dynamic) +} + +func (ev Event) Label(index int) label.Label { + if index < len(ev.static) { + return ev.static[index] + } + return ev.dynamic[index-len(ev.static)] +} + +func (ev Event) Find(key label.Key) label.Label { + for _, l := range ev.static { + if l.Key() == key { + return l + } + } + for _, l := range ev.dynamic { + if l.Key() == key { + return l + } + } + return label.Label{} +} + +func MakeEvent(typ eventType, static [3]label.Label, labels []label.Label) Event { + return Event{ + typ: typ, + static: static, + dynamic: labels, + } +} + +// CloneEvent event returns a copy of the event with the time adjusted to at. +func CloneEvent(ev Event, at time.Time) Event { + ev.at = at + return ev +} diff --git a/vendor/golang.org/x/tools/internal/event/core/export.go b/vendor/golang.org/x/tools/internal/event/core/export.go new file mode 100644 index 00000000..05f3a9a5 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/event/core/export.go @@ -0,0 +1,70 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package core + +import ( + "context" + "sync/atomic" + "time" + "unsafe" + + "golang.org/x/tools/internal/event/label" +) + +// Exporter is a function that handles events. +// It may return a modified context and event. +type Exporter func(context.Context, Event, label.Map) context.Context + +var ( + exporter unsafe.Pointer +) + +// SetExporter sets the global exporter function that handles all events. +// The exporter is called synchronously from the event call site, so it should +// return quickly so as not to hold up user code. +func SetExporter(e Exporter) { + p := unsafe.Pointer(&e) + if e == nil { + // &e is always valid, and so p is always valid, but for the early abort + // of ProcessEvent to be efficient it needs to make the nil check on the + // pointer without having to dereference it, so we make the nil function + // also a nil pointer + p = nil + } + atomic.StorePointer(&exporter, p) +} + +// deliver is called to deliver an event to the supplied exporter. +// it will fill in the time. +func deliver(ctx context.Context, exporter Exporter, ev Event) context.Context { + // add the current time to the event + ev.at = time.Now() + // hand the event off to the current exporter + return exporter(ctx, ev, ev) +} + +// Export is called to deliver an event to the global exporter if set. +func Export(ctx context.Context, ev Event) context.Context { + // get the global exporter and abort early if there is not one + exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter)) + if exporterPtr == nil { + return ctx + } + return deliver(ctx, *exporterPtr, ev) +} + +// ExportPair is called to deliver a start event to the supplied exporter. +// It also returns a function that will deliver the end event to the same +// exporter. +// It will fill in the time. +func ExportPair(ctx context.Context, begin, end Event) (context.Context, func()) { + // get the global exporter and abort early if there is not one + exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter)) + if exporterPtr == nil { + return ctx, func() {} + } + ctx = deliver(ctx, *exporterPtr, begin) + return ctx, func() { deliver(ctx, *exporterPtr, end) } +} diff --git a/vendor/golang.org/x/tools/internal/event/core/fast.go b/vendor/golang.org/x/tools/internal/event/core/fast.go new file mode 100644 index 00000000..e61f2cf7 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/event/core/fast.go @@ -0,0 +1,57 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package core + +import ( + "context" + + "golang.org/x/tools/internal/event/keys" + "golang.org/x/tools/internal/event/label" +) + +// Log1 takes a message and one label delivers a log event to the exporter. +// It is a customized version of Print that is faster and does no allocation. +func Log1(ctx context.Context, message string, t1 label.Label) { + Export(ctx, MakeEvent(LogType, [3]label.Label{keys.Msg.Of(message), t1}, nil)) +} + +// Log2 takes a message and two labels and delivers a log event to the exporter. +// It is a customized version of Print that is faster and does no allocation. +func Log2(ctx context.Context, message string, t1 label.Label, t2 label.Label) { + Export(ctx, MakeEvent(LogType, [3]label.Label{keys.Msg.Of(message), t1, t2}, nil)) +} + +// Metric1 sends a label event to the exporter with the supplied labels. +func Metric1(ctx context.Context, t1 label.Label) context.Context { + return Export(ctx, MakeEvent(RecordType, [3]label.Label{t1}, nil)) +} + +// Metric2 sends a label event to the exporter with the supplied labels. +func Metric2(ctx context.Context, t1, t2 label.Label) context.Context { + return Export(ctx, MakeEvent(RecordType, [3]label.Label{t1, t2}, nil)) +} + +// Metric3 sends a label event to the exporter with the supplied labels. +func Metric3(ctx context.Context, t1, t2, t3 label.Label) context.Context { + return Export(ctx, MakeEvent(RecordType, [3]label.Label{t1, t2, t3}, nil)) +} + +// Start1 sends a span start event with the supplied label list to the exporter. +// It also returns a function that will end the span, which should normally be +// deferred. +func Start1(ctx context.Context, name string, t1 label.Label) (context.Context, func()) { + return ExportPair(ctx, + MakeEvent(StartSpanType, [3]label.Label{keys.Name.Of(name), t1}, nil), + MakeEvent(EndSpanType, [3]label.Label{}, nil)) +} + +// Start2 sends a span start event with the supplied label list to the exporter. +// It also returns a function that will end the span, which should normally be +// deferred. +func Start2(ctx context.Context, name string, t1, t2 label.Label) (context.Context, func()) { + return ExportPair(ctx, + MakeEvent(StartSpanType, [3]label.Label{keys.Name.Of(name), t1, t2}, nil), + MakeEvent(EndSpanType, [3]label.Label{}, nil)) +} diff --git a/vendor/golang.org/x/tools/internal/event/doc.go b/vendor/golang.org/x/tools/internal/event/doc.go new file mode 100644 index 00000000..5dc6e6ba --- /dev/null +++ b/vendor/golang.org/x/tools/internal/event/doc.go @@ -0,0 +1,7 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package event provides a set of packages that cover the main +// concepts of telemetry in an implementation agnostic way. +package event diff --git a/vendor/golang.org/x/tools/internal/event/event.go b/vendor/golang.org/x/tools/internal/event/event.go new file mode 100644 index 00000000..730313b8 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/event/event.go @@ -0,0 +1,69 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package event + +import ( + "context" + + "golang.org/x/tools/internal/event/core" + "golang.org/x/tools/internal/event/keys" + "golang.org/x/tools/internal/event/label" +) + +// Exporter is a function that handles events. +// It may return a modified context and event. +type Exporter func(context.Context, core.Event, label.Map) context.Context + +// SetExporter sets the global exporter function that handles all events. +// The exporter is called synchronously from the event call site, so it should +// return quickly so as not to hold up user code. +func SetExporter(e Exporter) { + core.SetExporter(core.Exporter(e)) +} + +// Log takes a message and a label list and combines them into a single event +// before delivering them to the exporter. +func Log(ctx context.Context, message string, labels ...label.Label) { + core.Export(ctx, core.MakeEvent(core.LogType, [3]label.Label{ + keys.Msg.Of(message), + }, labels)) +} + +// Error takes a message and a label list and combines them into a single event +// before delivering them to the exporter. It captures the error in the +// delivered event. +func Error(ctx context.Context, message string, err error, labels ...label.Label) { + core.Export(ctx, core.MakeEvent(core.LogType, [3]label.Label{ + keys.Msg.Of(message), + keys.Err.Of(err), + }, labels)) +} + +// Metric sends a label event to the exporter with the supplied labels. +func Metric(ctx context.Context, labels ...label.Label) { + core.Export(ctx, core.MakeEvent(core.RecordType, [3]label.Label{}, labels)) +} + +// Label sends a label event to the exporter with the supplied labels. +func Label(ctx context.Context, labels ...label.Label) context.Context { + return core.Export(ctx, core.MakeEvent(core.LabelType, [3]label.Label{}, labels)) +} + +// Start sends a span start event with the supplied label list to the exporter. +// It also returns a function that will end the span, which should normally be +// deferred. +func Start(ctx context.Context, name string, labels ...label.Label) (context.Context, func()) { + return core.ExportPair(ctx, + core.MakeEvent(core.StartSpanType, [3]label.Label{ + keys.Name.Of(name), + }, labels), + core.MakeEvent(core.EndSpanType, [3]label.Label{}, nil)) +} + +// Detach returns a context without an associated span. +// This allows the creation of spans that are not children of the current span. +func Detach(ctx context.Context) context.Context { + return core.Export(ctx, core.MakeEvent(core.DetachType, [3]label.Label{}, nil)) +} diff --git a/vendor/golang.org/x/tools/internal/event/keys/keys.go b/vendor/golang.org/x/tools/internal/event/keys/keys.go new file mode 100644 index 00000000..5814f71a --- /dev/null +++ b/vendor/golang.org/x/tools/internal/event/keys/keys.go @@ -0,0 +1,542 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package keys + +import ( + "fmt" + "io" + "math" + "strconv" + + "golang.org/x/tools/internal/event/label" +) + +// Value represents a key for untyped values. +type Value struct { + name string + description string +} + +// New creates a new Key for untyped values. +func New(name, description string) *Value { + return &Value{name: name, description: description} +} + +func (k *Value) Name() string { return k.name } +func (k *Value) Description() string { return k.description } + +func (k *Value) Format(w io.Writer, buf []byte, l label.Label) { + fmt.Fprint(w, k.From(l)) +} + +// Get can be used to get a label for the key from a label.Map. +func (k *Value) Get(lm label.Map) interface{} { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return nil +} + +// From can be used to get a value from a Label. +func (k *Value) From(t label.Label) interface{} { return t.UnpackValue() } + +// Of creates a new Label with this key and the supplied value. +func (k *Value) Of(value interface{}) label.Label { return label.OfValue(k, value) } + +// Int represents a key +type Int struct { + name string + description string +} + +// NewInt creates a new Key for int values. +func NewInt(name, description string) *Int { + return &Int{name: name, description: description} +} + +func (k *Int) Name() string { return k.name } +func (k *Int) Description() string { return k.description } + +func (k *Int) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *Int) Of(v int) label.Label { return label.Of64(k, uint64(v)) } + +// Get can be used to get a label for the key from a label.Map. +func (k *Int) Get(lm label.Map) int { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *Int) From(t label.Label) int { return int(t.Unpack64()) } + +// Int8 represents a key +type Int8 struct { + name string + description string +} + +// NewInt8 creates a new Key for int8 values. +func NewInt8(name, description string) *Int8 { + return &Int8{name: name, description: description} +} + +func (k *Int8) Name() string { return k.name } +func (k *Int8) Description() string { return k.description } + +func (k *Int8) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *Int8) Of(v int8) label.Label { return label.Of64(k, uint64(v)) } + +// Get can be used to get a label for the key from a label.Map. +func (k *Int8) Get(lm label.Map) int8 { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *Int8) From(t label.Label) int8 { return int8(t.Unpack64()) } + +// Int16 represents a key +type Int16 struct { + name string + description string +} + +// NewInt16 creates a new Key for int16 values. +func NewInt16(name, description string) *Int16 { + return &Int16{name: name, description: description} +} + +func (k *Int16) Name() string { return k.name } +func (k *Int16) Description() string { return k.description } + +func (k *Int16) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *Int16) Of(v int16) label.Label { return label.Of64(k, uint64(v)) } + +// Get can be used to get a label for the key from a label.Map. +func (k *Int16) Get(lm label.Map) int16 { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *Int16) From(t label.Label) int16 { return int16(t.Unpack64()) } + +// Int32 represents a key +type Int32 struct { + name string + description string +} + +// NewInt32 creates a new Key for int32 values. +func NewInt32(name, description string) *Int32 { + return &Int32{name: name, description: description} +} + +func (k *Int32) Name() string { return k.name } +func (k *Int32) Description() string { return k.description } + +func (k *Int32) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *Int32) Of(v int32) label.Label { return label.Of64(k, uint64(v)) } + +// Get can be used to get a label for the key from a label.Map. +func (k *Int32) Get(lm label.Map) int32 { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *Int32) From(t label.Label) int32 { return int32(t.Unpack64()) } + +// Int64 represents a key +type Int64 struct { + name string + description string +} + +// NewInt64 creates a new Key for int64 values. +func NewInt64(name, description string) *Int64 { + return &Int64{name: name, description: description} +} + +func (k *Int64) Name() string { return k.name } +func (k *Int64) Description() string { return k.description } + +func (k *Int64) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendInt(buf, k.From(l), 10)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *Int64) Of(v int64) label.Label { return label.Of64(k, uint64(v)) } + +// Get can be used to get a label for the key from a label.Map. +func (k *Int64) Get(lm label.Map) int64 { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *Int64) From(t label.Label) int64 { return int64(t.Unpack64()) } + +// UInt represents a key +type UInt struct { + name string + description string +} + +// NewUInt creates a new Key for uint values. +func NewUInt(name, description string) *UInt { + return &UInt{name: name, description: description} +} + +func (k *UInt) Name() string { return k.name } +func (k *UInt) Description() string { return k.description } + +func (k *UInt) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *UInt) Of(v uint) label.Label { return label.Of64(k, uint64(v)) } + +// Get can be used to get a label for the key from a label.Map. +func (k *UInt) Get(lm label.Map) uint { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *UInt) From(t label.Label) uint { return uint(t.Unpack64()) } + +// UInt8 represents a key +type UInt8 struct { + name string + description string +} + +// NewUInt8 creates a new Key for uint8 values. +func NewUInt8(name, description string) *UInt8 { + return &UInt8{name: name, description: description} +} + +func (k *UInt8) Name() string { return k.name } +func (k *UInt8) Description() string { return k.description } + +func (k *UInt8) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *UInt8) Of(v uint8) label.Label { return label.Of64(k, uint64(v)) } + +// Get can be used to get a label for the key from a label.Map. +func (k *UInt8) Get(lm label.Map) uint8 { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *UInt8) From(t label.Label) uint8 { return uint8(t.Unpack64()) } + +// UInt16 represents a key +type UInt16 struct { + name string + description string +} + +// NewUInt16 creates a new Key for uint16 values. +func NewUInt16(name, description string) *UInt16 { + return &UInt16{name: name, description: description} +} + +func (k *UInt16) Name() string { return k.name } +func (k *UInt16) Description() string { return k.description } + +func (k *UInt16) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *UInt16) Of(v uint16) label.Label { return label.Of64(k, uint64(v)) } + +// Get can be used to get a label for the key from a label.Map. +func (k *UInt16) Get(lm label.Map) uint16 { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *UInt16) From(t label.Label) uint16 { return uint16(t.Unpack64()) } + +// UInt32 represents a key +type UInt32 struct { + name string + description string +} + +// NewUInt32 creates a new Key for uint32 values. +func NewUInt32(name, description string) *UInt32 { + return &UInt32{name: name, description: description} +} + +func (k *UInt32) Name() string { return k.name } +func (k *UInt32) Description() string { return k.description } + +func (k *UInt32) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *UInt32) Of(v uint32) label.Label { return label.Of64(k, uint64(v)) } + +// Get can be used to get a label for the key from a label.Map. +func (k *UInt32) Get(lm label.Map) uint32 { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *UInt32) From(t label.Label) uint32 { return uint32(t.Unpack64()) } + +// UInt64 represents a key +type UInt64 struct { + name string + description string +} + +// NewUInt64 creates a new Key for uint64 values. +func NewUInt64(name, description string) *UInt64 { + return &UInt64{name: name, description: description} +} + +func (k *UInt64) Name() string { return k.name } +func (k *UInt64) Description() string { return k.description } + +func (k *UInt64) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendUint(buf, k.From(l), 10)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *UInt64) Of(v uint64) label.Label { return label.Of64(k, v) } + +// Get can be used to get a label for the key from a label.Map. +func (k *UInt64) Get(lm label.Map) uint64 { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *UInt64) From(t label.Label) uint64 { return t.Unpack64() } + +// Float32 represents a key +type Float32 struct { + name string + description string +} + +// NewFloat32 creates a new Key for float32 values. +func NewFloat32(name, description string) *Float32 { + return &Float32{name: name, description: description} +} + +func (k *Float32) Name() string { return k.name } +func (k *Float32) Description() string { return k.description } + +func (k *Float32) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendFloat(buf, float64(k.From(l)), 'E', -1, 32)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *Float32) Of(v float32) label.Label { + return label.Of64(k, uint64(math.Float32bits(v))) +} + +// Get can be used to get a label for the key from a label.Map. +func (k *Float32) Get(lm label.Map) float32 { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *Float32) From(t label.Label) float32 { + return math.Float32frombits(uint32(t.Unpack64())) +} + +// Float64 represents a key +type Float64 struct { + name string + description string +} + +// NewFloat64 creates a new Key for int64 values. +func NewFloat64(name, description string) *Float64 { + return &Float64{name: name, description: description} +} + +func (k *Float64) Name() string { return k.name } +func (k *Float64) Description() string { return k.description } + +func (k *Float64) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendFloat(buf, k.From(l), 'E', -1, 64)) +} + +// Of creates a new Label with this key and the supplied value. +func (k *Float64) Of(v float64) label.Label { + return label.Of64(k, math.Float64bits(v)) +} + +// Get can be used to get a label for the key from a label.Map. +func (k *Float64) Get(lm label.Map) float64 { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return 0 +} + +// From can be used to get a value from a Label. +func (k *Float64) From(t label.Label) float64 { + return math.Float64frombits(t.Unpack64()) +} + +// String represents a key +type String struct { + name string + description string +} + +// NewString creates a new Key for int64 values. +func NewString(name, description string) *String { + return &String{name: name, description: description} +} + +func (k *String) Name() string { return k.name } +func (k *String) Description() string { return k.description } + +func (k *String) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendQuote(buf, k.From(l))) +} + +// Of creates a new Label with this key and the supplied value. +func (k *String) Of(v string) label.Label { return label.OfString(k, v) } + +// Get can be used to get a label for the key from a label.Map. +func (k *String) Get(lm label.Map) string { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return "" +} + +// From can be used to get a value from a Label. +func (k *String) From(t label.Label) string { return t.UnpackString() } + +// Boolean represents a key +type Boolean struct { + name string + description string +} + +// NewBoolean creates a new Key for bool values. +func NewBoolean(name, description string) *Boolean { + return &Boolean{name: name, description: description} +} + +func (k *Boolean) Name() string { return k.name } +func (k *Boolean) Description() string { return k.description } + +func (k *Boolean) Format(w io.Writer, buf []byte, l label.Label) { + w.Write(strconv.AppendBool(buf, k.From(l))) +} + +// Of creates a new Label with this key and the supplied value. +func (k *Boolean) Of(v bool) label.Label { + if v { + return label.Of64(k, 1) + } + return label.Of64(k, 0) +} + +// Get can be used to get a label for the key from a label.Map. +func (k *Boolean) Get(lm label.Map) bool { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return false +} + +// From can be used to get a value from a Label. +func (k *Boolean) From(t label.Label) bool { return t.Unpack64() > 0 } + +// Error represents a key +type Error struct { + name string + description string +} + +// NewError creates a new Key for int64 values. +func NewError(name, description string) *Error { + return &Error{name: name, description: description} +} + +func (k *Error) Name() string { return k.name } +func (k *Error) Description() string { return k.description } + +func (k *Error) Format(w io.Writer, buf []byte, l label.Label) { + io.WriteString(w, k.From(l).Error()) +} + +// Of creates a new Label with this key and the supplied value. +func (k *Error) Of(v error) label.Label { return label.OfValue(k, v) } + +// Get can be used to get a label for the key from a label.Map. +func (k *Error) Get(lm label.Map) error { + if t := lm.Find(k); t.Valid() { + return k.From(t) + } + return nil +} + +// From can be used to get a value from a Label. +func (k *Error) From(t label.Label) error { + err, _ := t.UnpackValue().(error) + return err +} diff --git a/vendor/golang.org/x/tools/internal/event/keys/standard.go b/vendor/golang.org/x/tools/internal/event/keys/standard.go new file mode 100644 index 00000000..59516c25 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/event/keys/standard.go @@ -0,0 +1,14 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package keys + +var ( + // Msg is a key used to add message strings to label lists. + Msg = NewString("message", "a readable message") + // Name is used for things like traces that have a name. + Name = NewString("name", "an entity name") + // Err is a key used to add error values to label lists. + Err = NewError("error", "an error that occurred") +) diff --git a/vendor/golang.org/x/tools/internal/event/label/label.go b/vendor/golang.org/x/tools/internal/event/label/label.go new file mode 100644 index 00000000..b55c12eb --- /dev/null +++ b/vendor/golang.org/x/tools/internal/event/label/label.go @@ -0,0 +1,213 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package label + +import ( + "fmt" + "io" + "reflect" + "unsafe" +) + +// Key is used as the identity of a Label. +// Keys are intended to be compared by pointer only, the name should be unique +// for communicating with external systems, but it is not required or enforced. +type Key interface { + // Name returns the key name. + Name() string + // Description returns a string that can be used to describe the value. + Description() string + + // Format is used in formatting to append the value of the label to the + // supplied buffer. + // The formatter may use the supplied buf as a scratch area to avoid + // allocations. + Format(w io.Writer, buf []byte, l Label) +} + +// Label holds a key and value pair. +// It is normally used when passing around lists of labels. +type Label struct { + key Key + packed uint64 + untyped interface{} +} + +// Map is the interface to a collection of Labels indexed by key. +type Map interface { + // Find returns the label that matches the supplied key. + Find(key Key) Label +} + +// List is the interface to something that provides an iterable +// list of labels. +// Iteration should start from 0 and continue until Valid returns false. +type List interface { + // Valid returns true if the index is within range for the list. + // It does not imply the label at that index will itself be valid. + Valid(index int) bool + // Label returns the label at the given index. + Label(index int) Label +} + +// list implements LabelList for a list of Labels. +type list struct { + labels []Label +} + +// filter wraps a LabelList filtering out specific labels. +type filter struct { + keys []Key + underlying List +} + +// listMap implements LabelMap for a simple list of labels. +type listMap struct { + labels []Label +} + +// mapChain implements LabelMap for a list of underlying LabelMap. +type mapChain struct { + maps []Map +} + +// OfValue creates a new label from the key and value. +// This method is for implementing new key types, label creation should +// normally be done with the Of method of the key. +func OfValue(k Key, value interface{}) Label { return Label{key: k, untyped: value} } + +// UnpackValue assumes the label was built using LabelOfValue and returns the value +// that was passed to that constructor. +// This method is for implementing new key types, for type safety normal +// access should be done with the From method of the key. +func (t Label) UnpackValue() interface{} { return t.untyped } + +// Of64 creates a new label from a key and a uint64. This is often +// used for non uint64 values that can be packed into a uint64. +// This method is for implementing new key types, label creation should +// normally be done with the Of method of the key. +func Of64(k Key, v uint64) Label { return Label{key: k, packed: v} } + +// Unpack64 assumes the label was built using LabelOf64 and returns the value that +// was passed to that constructor. +// This method is for implementing new key types, for type safety normal +// access should be done with the From method of the key. +func (t Label) Unpack64() uint64 { return t.packed } + +// OfString creates a new label from a key and a string. +// This method is for implementing new key types, label creation should +// normally be done with the Of method of the key. +func OfString(k Key, v string) Label { + hdr := (*reflect.StringHeader)(unsafe.Pointer(&v)) + return Label{ + key: k, + packed: uint64(hdr.Len), + untyped: unsafe.Pointer(hdr.Data), + } +} + +// UnpackString assumes the label was built using LabelOfString and returns the +// value that was passed to that constructor. +// This method is for implementing new key types, for type safety normal +// access should be done with the From method of the key. +func (t Label) UnpackString() string { + var v string + hdr := (*reflect.StringHeader)(unsafe.Pointer(&v)) + hdr.Data = uintptr(t.untyped.(unsafe.Pointer)) + hdr.Len = int(t.packed) + return *(*string)(unsafe.Pointer(hdr)) +} + +// Valid returns true if the Label is a valid one (it has a key). +func (t Label) Valid() bool { return t.key != nil } + +// Key returns the key of this Label. +func (t Label) Key() Key { return t.key } + +// Format is used for debug printing of labels. +func (t Label) Format(f fmt.State, r rune) { + if !t.Valid() { + io.WriteString(f, `nil`) + return + } + io.WriteString(f, t.Key().Name()) + io.WriteString(f, "=") + var buf [128]byte + t.Key().Format(f, buf[:0], t) +} + +func (l *list) Valid(index int) bool { + return index >= 0 && index < len(l.labels) +} + +func (l *list) Label(index int) Label { + return l.labels[index] +} + +func (f *filter) Valid(index int) bool { + return f.underlying.Valid(index) +} + +func (f *filter) Label(index int) Label { + l := f.underlying.Label(index) + for _, f := range f.keys { + if l.Key() == f { + return Label{} + } + } + return l +} + +func (lm listMap) Find(key Key) Label { + for _, l := range lm.labels { + if l.Key() == key { + return l + } + } + return Label{} +} + +func (c mapChain) Find(key Key) Label { + for _, src := range c.maps { + l := src.Find(key) + if l.Valid() { + return l + } + } + return Label{} +} + +var emptyList = &list{} + +func NewList(labels ...Label) List { + if len(labels) == 0 { + return emptyList + } + return &list{labels: labels} +} + +func Filter(l List, keys ...Key) List { + if len(keys) == 0 { + return l + } + return &filter{keys: keys, underlying: l} +} + +func NewMap(labels ...Label) Map { + return listMap{labels: labels} +} + +func MergeMaps(srcs ...Map) Map { + var nonNil []Map + for _, src := range srcs { + if src != nil { + nonNil = append(nonNil, src) + } + } + if len(nonNil) == 1 { + return nonNil[0] + } + return mapChain{maps: nonNil} +} diff --git a/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/vendor/golang.org/x/tools/internal/gocommand/invoke.go new file mode 100644 index 00000000..9aa79845 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/gocommand/invoke.go @@ -0,0 +1,187 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package gocommand is a helper for calling the go command. +package gocommand + +import ( + "bytes" + "context" + "fmt" + "io" + "os" + "os/exec" + "regexp" + "strings" + "sync" + "time" + + "golang.org/x/tools/internal/event" +) + +// An Runner will run go command invocations and serialize +// them if it sees a concurrency error. +type Runner struct { + // LoadMu guards packages.Load calls and associated state. + loadMu sync.Mutex + serializeLoads int +} + +// 1.13: go: updates to go.mod needed, but contents have changed +// 1.14: go: updating go.mod: existing contents have changed since last read +var modConcurrencyError = regexp.MustCompile(`go:.*go.mod.*contents have changed`) + +// Run calls Runner.RunRaw, serializing requests if they fight over +// go.mod changes. +func (runner *Runner) Run(ctx context.Context, inv Invocation) (*bytes.Buffer, error) { + stdout, _, friendly, _ := runner.RunRaw(ctx, inv) + return stdout, friendly +} + +// RunRaw calls Invocation.runRaw, serializing requests if they fight over +// go.mod changes. +func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) { + // We want to run invocations concurrently as much as possible. However, + // if go.mod updates are needed, only one can make them and the others will + // fail. We need to retry in those cases, but we don't want to thrash so + // badly we never recover. To avoid that, once we've seen one concurrency + // error, start serializing everything until the backlog has cleared out. + runner.loadMu.Lock() + var locked bool // If true, we hold the mutex and have incremented. + if runner.serializeLoads == 0 { + runner.loadMu.Unlock() + } else { + locked = true + runner.serializeLoads++ + } + defer func() { + if locked { + runner.serializeLoads-- + runner.loadMu.Unlock() + } + }() + + for { + stdout, stderr, friendlyErr, err := inv.runRaw(ctx) + if friendlyErr == nil || !modConcurrencyError.MatchString(friendlyErr.Error()) { + return stdout, stderr, friendlyErr, err + } + event.Error(ctx, "Load concurrency error, will retry serially", err) + if !locked { + runner.loadMu.Lock() + runner.serializeLoads++ + locked = true + } + } +} + +// An Invocation represents a call to the go command. +type Invocation struct { + Verb string + Args []string + BuildFlags []string + Env []string + WorkingDir string + Logf func(format string, args ...interface{}) +} + +// RunRaw is like RunPiped, but also returns the raw stderr and error for callers +// that want to do low-level error handling/recovery. +func (i *Invocation) runRaw(ctx context.Context) (stdout *bytes.Buffer, stderr *bytes.Buffer, friendlyError error, rawError error) { + stdout = &bytes.Buffer{} + stderr = &bytes.Buffer{} + rawError = i.RunPiped(ctx, stdout, stderr) + if rawError != nil { + friendlyError = rawError + // Check for 'go' executable not being found. + if ee, ok := rawError.(*exec.Error); ok && ee.Err == exec.ErrNotFound { + friendlyError = fmt.Errorf("go command required, not found: %v", ee) + } + if ctx.Err() != nil { + friendlyError = ctx.Err() + } + friendlyError = fmt.Errorf("err: %v: stderr: %s", friendlyError, stderr) + } + return +} + +// RunPiped is like Run, but relies on the given stdout/stderr +func (i *Invocation) RunPiped(ctx context.Context, stdout, stderr io.Writer) error { + log := i.Logf + if log == nil { + log = func(string, ...interface{}) {} + } + + goArgs := []string{i.Verb} + switch i.Verb { + case "mod": + // mod needs the sub-verb before build flags. + goArgs = append(goArgs, i.Args[0]) + goArgs = append(goArgs, i.BuildFlags...) + goArgs = append(goArgs, i.Args[1:]...) + case "env": + // env doesn't take build flags. + goArgs = append(goArgs, i.Args...) + default: + goArgs = append(goArgs, i.BuildFlags...) + goArgs = append(goArgs, i.Args...) + } + cmd := exec.Command("go", goArgs...) + cmd.Stdout = stdout + cmd.Stderr = stderr + // On darwin the cwd gets resolved to the real path, which breaks anything that + // expects the working directory to keep the original path, including the + // go command when dealing with modules. + // The Go stdlib has a special feature where if the cwd and the PWD are the + // same node then it trusts the PWD, so by setting it in the env for the child + // process we fix up all the paths returned by the go command. + cmd.Env = append(os.Environ(), i.Env...) + if i.WorkingDir != "" { + cmd.Env = append(cmd.Env, "PWD="+i.WorkingDir) + cmd.Dir = i.WorkingDir + } + + defer func(start time.Time) { log("%s for %v", time.Since(start), cmdDebugStr(cmd)) }(time.Now()) + + return runCmdContext(ctx, cmd) +} + +// runCmdContext is like exec.CommandContext except it sends os.Interrupt +// before os.Kill. +func runCmdContext(ctx context.Context, cmd *exec.Cmd) error { + if err := cmd.Start(); err != nil { + return err + } + resChan := make(chan error, 1) + go func() { + resChan <- cmd.Wait() + }() + + select { + case err := <-resChan: + return err + case <-ctx.Done(): + } + // Cancelled. Interrupt and see if it ends voluntarily. + cmd.Process.Signal(os.Interrupt) + select { + case err := <-resChan: + return err + case <-time.After(time.Second): + } + // Didn't shut down in response to interrupt. Kill it hard. + cmd.Process.Kill() + return <-resChan +} + +func cmdDebugStr(cmd *exec.Cmd) string { + env := make(map[string]string) + for _, kv := range cmd.Env { + split := strings.Split(kv, "=") + k, v := split[0], split[1] + env[k] = v + } + + return fmt.Sprintf("GOROOT=%v GOPATH=%v GO111MODULE=%v GOPROXY=%v PWD=%v go %v", env["GOROOT"], env["GOPATH"], env["GO111MODULE"], env["GOPROXY"], env["PWD"], cmd.Args) +} diff --git a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go new file mode 100644 index 00000000..a88750be --- /dev/null +++ b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go @@ -0,0 +1,35 @@ +// Package packagesinternal exposes internal-only fields from go/packages. +package packagesinternal + +import ( + "time" + + "golang.org/x/tools/internal/gocommand" +) + +// Fields must match go list; +type Module struct { + Path string // module path + Version string // module version + Versions []string // available module versions (with -versions) + Replace *Module // replaced by this module + Time *time.Time // time version was created + Update *Module // available update, if any (with -u) + Main bool // is this the main module? + Indirect bool // is this module only an indirect dependency of main module? + Dir string // directory holding files for this module, if any + GoMod string // path to go.mod file used when loading this module, if any + GoVersion string // go version used in module + Error *ModuleError // error loading module +} +type ModuleError struct { + Err string // the error itself +} + +var GetForTest = func(p interface{}) string { return "" } + +var GetModule = func(p interface{}) *Module { return nil } + +var GetGoCmdRunner = func(config interface{}) *gocommand.Runner { return nil } + +var SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) {} diff --git a/vendor/golang.org/x/xerrors/LICENSE b/vendor/golang.org/x/xerrors/LICENSE new file mode 100644 index 00000000..e4a47e17 --- /dev/null +++ b/vendor/golang.org/x/xerrors/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2019 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/xerrors/PATENTS b/vendor/golang.org/x/xerrors/PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/vendor/golang.org/x/xerrors/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/xerrors/README b/vendor/golang.org/x/xerrors/README new file mode 100644 index 00000000..aac7867a --- /dev/null +++ b/vendor/golang.org/x/xerrors/README @@ -0,0 +1,2 @@ +This repository holds the transition packages for the new Go 1.13 error values. +See golang.org/design/29934-error-values. diff --git a/vendor/golang.org/x/xerrors/adaptor.go b/vendor/golang.org/x/xerrors/adaptor.go new file mode 100644 index 00000000..4317f248 --- /dev/null +++ b/vendor/golang.org/x/xerrors/adaptor.go @@ -0,0 +1,193 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "bytes" + "fmt" + "io" + "reflect" + "strconv" +) + +// FormatError calls the FormatError method of f with an errors.Printer +// configured according to s and verb, and writes the result to s. +func FormatError(f Formatter, s fmt.State, verb rune) { + // Assuming this function is only called from the Format method, and given + // that FormatError takes precedence over Format, it cannot be called from + // any package that supports errors.Formatter. It is therefore safe to + // disregard that State may be a specific printer implementation and use one + // of our choice instead. + + // limitations: does not support printing error as Go struct. + + var ( + sep = " " // separator before next error + p = &state{State: s} + direct = true + ) + + var err error = f + + switch verb { + // Note that this switch must match the preference order + // for ordinary string printing (%#v before %+v, and so on). + + case 'v': + if s.Flag('#') { + if stringer, ok := err.(fmt.GoStringer); ok { + io.WriteString(&p.buf, stringer.GoString()) + goto exit + } + // proceed as if it were %v + } else if s.Flag('+') { + p.printDetail = true + sep = "\n - " + } + case 's': + case 'q', 'x', 'X': + // Use an intermediate buffer in the rare cases that precision, + // truncation, or one of the alternative verbs (q, x, and X) are + // specified. + direct = false + + default: + p.buf.WriteString("%!") + p.buf.WriteRune(verb) + p.buf.WriteByte('(') + switch { + case err != nil: + p.buf.WriteString(reflect.TypeOf(f).String()) + default: + p.buf.WriteString("") + } + p.buf.WriteByte(')') + io.Copy(s, &p.buf) + return + } + +loop: + for { + switch v := err.(type) { + case Formatter: + err = v.FormatError((*printer)(p)) + case fmt.Formatter: + v.Format(p, 'v') + break loop + default: + io.WriteString(&p.buf, v.Error()) + break loop + } + if err == nil { + break + } + if p.needColon || !p.printDetail { + p.buf.WriteByte(':') + p.needColon = false + } + p.buf.WriteString(sep) + p.inDetail = false + p.needNewline = false + } + +exit: + width, okW := s.Width() + prec, okP := s.Precision() + + if !direct || (okW && width > 0) || okP { + // Construct format string from State s. + format := []byte{'%'} + if s.Flag('-') { + format = append(format, '-') + } + if s.Flag('+') { + format = append(format, '+') + } + if s.Flag(' ') { + format = append(format, ' ') + } + if okW { + format = strconv.AppendInt(format, int64(width), 10) + } + if okP { + format = append(format, '.') + format = strconv.AppendInt(format, int64(prec), 10) + } + format = append(format, string(verb)...) + fmt.Fprintf(s, string(format), p.buf.String()) + } else { + io.Copy(s, &p.buf) + } +} + +var detailSep = []byte("\n ") + +// state tracks error printing state. It implements fmt.State. +type state struct { + fmt.State + buf bytes.Buffer + + printDetail bool + inDetail bool + needColon bool + needNewline bool +} + +func (s *state) Write(b []byte) (n int, err error) { + if s.printDetail { + if len(b) == 0 { + return 0, nil + } + if s.inDetail && s.needColon { + s.needNewline = true + if b[0] == '\n' { + b = b[1:] + } + } + k := 0 + for i, c := range b { + if s.needNewline { + if s.inDetail && s.needColon { + s.buf.WriteByte(':') + s.needColon = false + } + s.buf.Write(detailSep) + s.needNewline = false + } + if c == '\n' { + s.buf.Write(b[k:i]) + k = i + 1 + s.needNewline = true + } + } + s.buf.Write(b[k:]) + if !s.inDetail { + s.needColon = true + } + } else if !s.inDetail { + s.buf.Write(b) + } + return len(b), nil +} + +// printer wraps a state to implement an xerrors.Printer. +type printer state + +func (s *printer) Print(args ...interface{}) { + if !s.inDetail || s.printDetail { + fmt.Fprint((*state)(s), args...) + } +} + +func (s *printer) Printf(format string, args ...interface{}) { + if !s.inDetail || s.printDetail { + fmt.Fprintf((*state)(s), format, args...) + } +} + +func (s *printer) Detail() bool { + s.inDetail = true + return s.printDetail +} diff --git a/vendor/golang.org/x/xerrors/codereview.cfg b/vendor/golang.org/x/xerrors/codereview.cfg new file mode 100644 index 00000000..3f8b14b6 --- /dev/null +++ b/vendor/golang.org/x/xerrors/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/vendor/golang.org/x/xerrors/doc.go b/vendor/golang.org/x/xerrors/doc.go new file mode 100644 index 00000000..eef99d9d --- /dev/null +++ b/vendor/golang.org/x/xerrors/doc.go @@ -0,0 +1,22 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package xerrors implements functions to manipulate errors. +// +// This package is based on the Go 2 proposal for error values: +// https://golang.org/design/29934-error-values +// +// These functions were incorporated into the standard library's errors package +// in Go 1.13: +// - Is +// - As +// - Unwrap +// +// Also, Errorf's %w verb was incorporated into fmt.Errorf. +// +// Use this package to get equivalent behavior in all supported Go versions. +// +// No other features of this package were included in Go 1.13, and at present +// there are no plans to include any of them. +package xerrors // import "golang.org/x/xerrors" diff --git a/vendor/golang.org/x/xerrors/errors.go b/vendor/golang.org/x/xerrors/errors.go new file mode 100644 index 00000000..e88d3772 --- /dev/null +++ b/vendor/golang.org/x/xerrors/errors.go @@ -0,0 +1,33 @@ +// 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 xerrors + +import "fmt" + +// errorString is a trivial implementation of error. +type errorString struct { + s string + frame Frame +} + +// New returns an error that formats as the given text. +// +// The returned error contains a Frame set to the caller's location and +// implements Formatter to show this information when printed with details. +func New(text string) error { + return &errorString{text, Caller(1)} +} + +func (e *errorString) Error() string { + return e.s +} + +func (e *errorString) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *errorString) FormatError(p Printer) (next error) { + p.Print(e.s) + e.frame.Format(p) + return nil +} diff --git a/vendor/golang.org/x/xerrors/fmt.go b/vendor/golang.org/x/xerrors/fmt.go new file mode 100644 index 00000000..829862dd --- /dev/null +++ b/vendor/golang.org/x/xerrors/fmt.go @@ -0,0 +1,187 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "fmt" + "strings" + "unicode" + "unicode/utf8" + + "golang.org/x/xerrors/internal" +) + +const percentBangString = "%!" + +// Errorf formats according to a format specifier and returns the string as a +// value that satisfies error. +// +// The returned error includes the file and line number of the caller when +// formatted with additional detail enabled. If the last argument is an error +// the returned error's Format method will return it if the format string ends +// with ": %s", ": %v", or ": %w". If the last argument is an error and the +// format string ends with ": %w", the returned error implements an Unwrap +// method returning it. +// +// If the format specifier includes a %w verb with an error operand in a +// position other than at the end, the returned error will still implement an +// Unwrap method returning the operand, but the error's Format method will not +// return the wrapped error. +// +// It is invalid to include more than one %w verb or to supply it with an +// operand that does not implement the error interface. The %w verb is otherwise +// a synonym for %v. +func Errorf(format string, a ...interface{}) error { + format = formatPlusW(format) + // Support a ": %[wsv]" suffix, which works well with xerrors.Formatter. + wrap := strings.HasSuffix(format, ": %w") + idx, format2, ok := parsePercentW(format) + percentWElsewhere := !wrap && idx >= 0 + if !percentWElsewhere && (wrap || strings.HasSuffix(format, ": %s") || strings.HasSuffix(format, ": %v")) { + err := errorAt(a, len(a)-1) + if err == nil { + return &noWrapError{fmt.Sprintf(format, a...), nil, Caller(1)} + } + // TODO: this is not entirely correct. The error value could be + // printed elsewhere in format if it mixes numbered with unnumbered + // substitutions. With relatively small changes to doPrintf we can + // have it optionally ignore extra arguments and pass the argument + // list in its entirety. + msg := fmt.Sprintf(format[:len(format)-len(": %s")], a[:len(a)-1]...) + frame := Frame{} + if internal.EnableTrace { + frame = Caller(1) + } + if wrap { + return &wrapError{msg, err, frame} + } + return &noWrapError{msg, err, frame} + } + // Support %w anywhere. + // TODO: don't repeat the wrapped error's message when %w occurs in the middle. + msg := fmt.Sprintf(format2, a...) + if idx < 0 { + return &noWrapError{msg, nil, Caller(1)} + } + err := errorAt(a, idx) + if !ok || err == nil { + // Too many %ws or argument of %w is not an error. Approximate the Go + // 1.13 fmt.Errorf message. + return &noWrapError{fmt.Sprintf("%sw(%s)", percentBangString, msg), nil, Caller(1)} + } + frame := Frame{} + if internal.EnableTrace { + frame = Caller(1) + } + return &wrapError{msg, err, frame} +} + +func errorAt(args []interface{}, i int) error { + if i < 0 || i >= len(args) { + return nil + } + err, ok := args[i].(error) + if !ok { + return nil + } + return err +} + +// formatPlusW is used to avoid the vet check that will barf at %w. +func formatPlusW(s string) string { + return s +} + +// Return the index of the only %w in format, or -1 if none. +// Also return a rewritten format string with %w replaced by %v, and +// false if there is more than one %w. +// TODO: handle "%[N]w". +func parsePercentW(format string) (idx int, newFormat string, ok bool) { + // Loosely copied from golang.org/x/tools/go/analysis/passes/printf/printf.go. + idx = -1 + ok = true + n := 0 + sz := 0 + var isW bool + for i := 0; i < len(format); i += sz { + if format[i] != '%' { + sz = 1 + continue + } + // "%%" is not a format directive. + if i+1 < len(format) && format[i+1] == '%' { + sz = 2 + continue + } + sz, isW = parsePrintfVerb(format[i:]) + if isW { + if idx >= 0 { + ok = false + } else { + idx = n + } + // "Replace" the last character, the 'w', with a 'v'. + p := i + sz - 1 + format = format[:p] + "v" + format[p+1:] + } + n++ + } + return idx, format, ok +} + +// Parse the printf verb starting with a % at s[0]. +// Return how many bytes it occupies and whether the verb is 'w'. +func parsePrintfVerb(s string) (int, bool) { + // Assume only that the directive is a sequence of non-letters followed by a single letter. + sz := 0 + var r rune + for i := 1; i < len(s); i += sz { + r, sz = utf8.DecodeRuneInString(s[i:]) + if unicode.IsLetter(r) { + return i + sz, r == 'w' + } + } + return len(s), false +} + +type noWrapError struct { + msg string + err error + frame Frame +} + +func (e *noWrapError) Error() string { + return fmt.Sprint(e) +} + +func (e *noWrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *noWrapError) FormatError(p Printer) (next error) { + p.Print(e.msg) + e.frame.Format(p) + return e.err +} + +type wrapError struct { + msg string + err error + frame Frame +} + +func (e *wrapError) Error() string { + return fmt.Sprint(e) +} + +func (e *wrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *wrapError) FormatError(p Printer) (next error) { + p.Print(e.msg) + e.frame.Format(p) + return e.err +} + +func (e *wrapError) Unwrap() error { + return e.err +} diff --git a/vendor/golang.org/x/xerrors/format.go b/vendor/golang.org/x/xerrors/format.go new file mode 100644 index 00000000..1bc9c26b --- /dev/null +++ b/vendor/golang.org/x/xerrors/format.go @@ -0,0 +1,34 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +// A Formatter formats error messages. +type Formatter interface { + error + + // FormatError prints the receiver's first error and returns the next error in + // the error chain, if any. + FormatError(p Printer) (next error) +} + +// A Printer formats error messages. +// +// The most common implementation of Printer is the one provided by package fmt +// during Printf (as of Go 1.13). Localization packages such as golang.org/x/text/message +// typically provide their own implementations. +type Printer interface { + // Print appends args to the message output. + Print(args ...interface{}) + + // Printf writes a formatted string. + Printf(format string, args ...interface{}) + + // Detail reports whether error detail is requested. + // After the first call to Detail, all text written to the Printer + // is formatted as additional detail, or ignored when + // detail has not been requested. + // If Detail returns false, the caller can avoid printing the detail at all. + Detail() bool +} diff --git a/vendor/golang.org/x/xerrors/frame.go b/vendor/golang.org/x/xerrors/frame.go new file mode 100644 index 00000000..0de628ec --- /dev/null +++ b/vendor/golang.org/x/xerrors/frame.go @@ -0,0 +1,56 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "runtime" +) + +// A Frame contains part of a call stack. +type Frame struct { + // Make room for three PCs: the one we were asked for, what it called, + // and possibly a PC for skipPleaseUseCallersFrames. See: + // https://go.googlesource.com/go/+/032678e0fb/src/runtime/extern.go#169 + frames [3]uintptr +} + +// Caller returns a Frame that describes a frame on the caller's stack. +// The argument skip is the number of frames to skip over. +// Caller(0) returns the frame for the caller of Caller. +func Caller(skip int) Frame { + var s Frame + runtime.Callers(skip+1, s.frames[:]) + return s +} + +// location reports the file, line, and function of a frame. +// +// The returned function may be "" even if file and line are not. +func (f Frame) location() (function, file string, line int) { + frames := runtime.CallersFrames(f.frames[:]) + if _, ok := frames.Next(); !ok { + return "", "", 0 + } + fr, ok := frames.Next() + if !ok { + return "", "", 0 + } + return fr.Function, fr.File, fr.Line +} + +// Format prints the stack as error detail. +// It should be called from an error's Format implementation +// after printing any other error detail. +func (f Frame) Format(p Printer) { + if p.Detail() { + function, file, line := f.location() + if function != "" { + p.Printf("%s\n ", function) + } + if file != "" { + p.Printf("%s:%d\n", file, line) + } + } +} diff --git a/vendor/golang.org/x/xerrors/go.mod b/vendor/golang.org/x/xerrors/go.mod new file mode 100644 index 00000000..870d4f61 --- /dev/null +++ b/vendor/golang.org/x/xerrors/go.mod @@ -0,0 +1,3 @@ +module golang.org/x/xerrors + +go 1.11 diff --git a/vendor/golang.org/x/xerrors/internal/internal.go b/vendor/golang.org/x/xerrors/internal/internal.go new file mode 100644 index 00000000..89f4eca5 --- /dev/null +++ b/vendor/golang.org/x/xerrors/internal/internal.go @@ -0,0 +1,8 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal + +// EnableTrace indicates whether stack information should be recorded in errors. +var EnableTrace = true diff --git a/vendor/golang.org/x/xerrors/wrap.go b/vendor/golang.org/x/xerrors/wrap.go new file mode 100644 index 00000000..9a3b5103 --- /dev/null +++ b/vendor/golang.org/x/xerrors/wrap.go @@ -0,0 +1,106 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "reflect" +) + +// A Wrapper provides context around another error. +type Wrapper interface { + // Unwrap returns the next error in the error chain. + // If there is no next error, Unwrap returns nil. + Unwrap() error +} + +// Opaque returns an error with the same error formatting as err +// but that does not match err and cannot be unwrapped. +func Opaque(err error) error { + return noWrapper{err} +} + +type noWrapper struct { + error +} + +func (e noWrapper) FormatError(p Printer) (next error) { + if f, ok := e.error.(Formatter); ok { + return f.FormatError(p) + } + p.Print(e.error) + return nil +} + +// Unwrap returns the result of calling the Unwrap method on err, if err implements +// Unwrap. Otherwise, Unwrap returns nil. +func Unwrap(err error) error { + u, ok := err.(Wrapper) + if !ok { + return nil + } + return u.Unwrap() +} + +// Is reports whether any error in err's chain matches target. +// +// An error is considered to match a target if it is equal to that target or if +// it implements a method Is(error) bool such that Is(target) returns true. +func Is(err, target error) bool { + if target == nil { + return err == target + } + + isComparable := reflect.TypeOf(target).Comparable() + for { + if isComparable && err == target { + return true + } + if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { + return true + } + // TODO: consider supporing target.Is(err). This would allow + // user-definable predicates, but also may allow for coping with sloppy + // APIs, thereby making it easier to get away with them. + if err = Unwrap(err); err == nil { + return false + } + } +} + +// As finds the first error in err's chain that matches the type to which target +// points, and if so, sets the target to its value and returns true. An error +// matches a type if it is assignable to the target type, or if it has a method +// As(interface{}) bool such that As(target) returns true. As will panic if target +// is not a non-nil pointer to a type which implements error or is of interface type. +// +// The As method should set the target to its value and return true if err +// matches the type to which target points. +func As(err error, target interface{}) bool { + if target == nil { + panic("errors: target cannot be nil") + } + val := reflect.ValueOf(target) + typ := val.Type() + if typ.Kind() != reflect.Ptr || val.IsNil() { + panic("errors: target must be a non-nil pointer") + } + if e := typ.Elem(); e.Kind() != reflect.Interface && !e.Implements(errorType) { + panic("errors: *target must be interface or implement error") + } + targetType := typ.Elem() + for err != nil { + if reflect.TypeOf(err).AssignableTo(targetType) { + val.Elem().Set(reflect.ValueOf(err)) + return true + } + if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) { + return true + } + err = Unwrap(err) + } + return false +} + +var errorType = reflect.TypeOf((*error)(nil)).Elem() diff --git a/vendor/google.golang.org/genproto/LICENSE b/vendor/google.golang.org/genproto/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/google.golang.org/genproto/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go new file mode 100644 index 00000000..4f3526e1 --- /dev/null +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go @@ -0,0 +1,57 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/api/annotations.proto + +package annotations + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" + descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +var E_Http = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MethodOptions)(nil), + ExtensionType: (*HttpRule)(nil), + Field: 72295728, + Name: "google.api.http", + Tag: "bytes,72295728,opt,name=http", + Filename: "google/api/annotations.proto", +} + +func init() { + proto.RegisterExtension(E_Http) +} + +func init() { + proto.RegisterFile("google/api/annotations.proto", fileDescriptor_c591c5aa9fb79aab) +} + +var fileDescriptor_c591c5aa9fb79aab = []byte{ + // 208 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x49, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x4f, 0x2c, 0xc8, 0xd4, 0x4f, 0xcc, 0xcb, 0xcb, 0x2f, 0x49, 0x2c, 0xc9, 0xcc, + 0xcf, 0x2b, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x82, 0xc8, 0xea, 0x25, 0x16, 0x64, + 0x4a, 0x89, 0x22, 0xa9, 0xcc, 0x28, 0x29, 0x29, 0x80, 0x28, 0x91, 0x52, 0x80, 0x0a, 0x83, 0x79, + 0x49, 0xa5, 0x69, 0xfa, 0x29, 0xa9, 0xc5, 0xc9, 0x45, 0x99, 0x05, 0x25, 0xf9, 0x45, 0x10, 0x15, + 0x56, 0xde, 0x5c, 0x2c, 0x20, 0xf5, 0x42, 0x72, 0x7a, 0x50, 0xd3, 0x60, 0x4a, 0xf5, 0x7c, 0x53, + 0x4b, 0x32, 0xf2, 0x53, 0xfc, 0x0b, 0xc0, 0x56, 0x4a, 0x6c, 0x38, 0xb5, 0x47, 0x49, 0x81, 0x51, + 0x83, 0xdb, 0x48, 0x44, 0x0f, 0x61, 0xad, 0x9e, 0x47, 0x49, 0x49, 0x41, 0x50, 0x69, 0x4e, 0x6a, + 0x10, 0xd8, 0x10, 0xa7, 0x3c, 0x2e, 0xbe, 0xe4, 0xfc, 0x5c, 0x24, 0x05, 0x4e, 0x02, 0x8e, 0x08, + 0x67, 0x07, 0x80, 0x4c, 0x0e, 0x60, 0x8c, 0x72, 0x84, 0xca, 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5, + 0xeb, 0xe5, 0x17, 0xa5, 0xeb, 0xa7, 0xa7, 0xe6, 0x81, 0xed, 0xd5, 0x87, 0x48, 0x25, 0x16, 0x64, + 0x16, 0xa3, 0x7b, 0xda, 0x1a, 0x89, 0xbd, 0x88, 0x89, 0xc5, 0xdd, 0x31, 0xc0, 0x33, 0x89, 0x0d, + 0xac, 0xc9, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xe3, 0x29, 0x19, 0x62, 0x28, 0x01, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go new file mode 100644 index 00000000..9757593e --- /dev/null +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go @@ -0,0 +1,81 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/api/client.proto + +package annotations + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" + descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +var E_MethodSignature = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MethodOptions)(nil), + ExtensionType: ([]string)(nil), + Field: 1051, + Name: "google.api.method_signature", + Tag: "bytes,1051,rep,name=method_signature", + Filename: "google/api/client.proto", +} + +var E_DefaultHost = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.ServiceOptions)(nil), + ExtensionType: (*string)(nil), + Field: 1049, + Name: "google.api.default_host", + Tag: "bytes,1049,opt,name=default_host", + Filename: "google/api/client.proto", +} + +var E_OauthScopes = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.ServiceOptions)(nil), + ExtensionType: (*string)(nil), + Field: 1050, + Name: "google.api.oauth_scopes", + Tag: "bytes,1050,opt,name=oauth_scopes", + Filename: "google/api/client.proto", +} + +func init() { + proto.RegisterExtension(E_MethodSignature) + proto.RegisterExtension(E_DefaultHost) + proto.RegisterExtension(E_OauthScopes) +} + +func init() { + proto.RegisterFile("google/api/client.proto", fileDescriptor_78f2c6f7c3a942c1) +} + +var fileDescriptor_78f2c6f7c3a942c1 = []byte{ + // 262 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0x3f, 0x4f, 0xc3, 0x30, + 0x10, 0xc5, 0x55, 0x40, 0xa8, 0x75, 0x11, 0xa0, 0x2c, 0x20, 0x06, 0xc8, 0xd8, 0xc9, 0x1e, 0xd8, + 0xca, 0xd4, 0x76, 0xe0, 0x8f, 0x84, 0x88, 0x9a, 0x8d, 0x25, 0x72, 0x9d, 0xab, 0x63, 0x29, 0xf5, + 0x59, 0xf6, 0x85, 0xef, 0x02, 0x6c, 0x7c, 0x52, 0x54, 0xc7, 0x11, 0x48, 0x0c, 0x6c, 0x27, 0xbd, + 0xf7, 0xfb, 0x9d, 0xf4, 0xd8, 0x85, 0x46, 0xd4, 0x2d, 0x08, 0xe9, 0x8c, 0x50, 0xad, 0x01, 0x4b, + 0xdc, 0x79, 0x24, 0xcc, 0x58, 0x1f, 0x70, 0xe9, 0xcc, 0x55, 0x9e, 0x4a, 0x31, 0xd9, 0x74, 0x5b, + 0x51, 0x43, 0x50, 0xde, 0x38, 0x42, 0xdf, 0xb7, 0xe7, 0x4f, 0xec, 0x7c, 0x07, 0xd4, 0x60, 0x5d, + 0x05, 0xa3, 0xad, 0xa4, 0xce, 0x43, 0x76, 0xcd, 0x93, 0x62, 0xc0, 0xf8, 0x73, 0xac, 0xbc, 0x38, + 0x32, 0x68, 0xc3, 0xe5, 0xe7, 0x38, 0x3f, 0x9c, 0x4d, 0xd6, 0x67, 0x3d, 0x58, 0x0e, 0xdc, 0x7c, + 0xc5, 0x4e, 0x6a, 0xd8, 0xca, 0xae, 0xa5, 0xaa, 0xc1, 0x40, 0xd9, 0xcd, 0x1f, 0x4f, 0x09, 0xfe, + 0xcd, 0x28, 0x18, 0x44, 0xef, 0xe3, 0x7c, 0x34, 0x9b, 0xac, 0xa7, 0x89, 0x7a, 0xc0, 0x40, 0x7b, + 0x09, 0xca, 0x8e, 0x9a, 0x2a, 0x28, 0x74, 0x10, 0xfe, 0x97, 0x7c, 0x24, 0x49, 0xa4, 0xca, 0x08, + 0x2d, 0x0d, 0x3b, 0x55, 0xb8, 0xe3, 0x3f, 0x4b, 0x2c, 0xa7, 0xab, 0xb8, 0x51, 0xb1, 0x97, 0x14, + 0xa3, 0xd7, 0x45, 0x8a, 0x34, 0xb6, 0xd2, 0x6a, 0x8e, 0x5e, 0x0b, 0x0d, 0x36, 0xbe, 0x10, 0x7d, + 0x24, 0x9d, 0x09, 0x71, 0x5c, 0x69, 0x2d, 0x92, 0x8c, 0xbf, 0xee, 0x7e, 0xdd, 0x5f, 0x07, 0x47, + 0xf7, 0x8b, 0xe2, 0x71, 0x73, 0x1c, 0xa1, 0xdb, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcc, 0xc2, + 0xcf, 0x71, 0x90, 0x01, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/field_behavior.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/field_behavior.pb.go new file mode 100644 index 00000000..6e67a93f --- /dev/null +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/field_behavior.pb.go @@ -0,0 +1,124 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/api/field_behavior.proto + +package annotations + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" + descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// An indicator of the behavior of a given field (for example, that a field +// is required in requests, or given as output but ignored as input). +// This **does not** change the behavior in protocol buffers itself; it only +// denotes the behavior and may affect how API tooling handles the field. +// +// Note: This enum **may** receive new values in the future. +type FieldBehavior int32 + +const ( + // Conventional default for enums. Do not use this. + FieldBehavior_FIELD_BEHAVIOR_UNSPECIFIED FieldBehavior = 0 + // Specifically denotes a field as optional. + // While all fields in protocol buffers are optional, this may be specified + // for emphasis if appropriate. + FieldBehavior_OPTIONAL FieldBehavior = 1 + // Denotes a field as required. + // This indicates that the field **must** be provided as part of the request, + // and failure to do so will cause an error (usually `INVALID_ARGUMENT`). + FieldBehavior_REQUIRED FieldBehavior = 2 + // Denotes a field as output only. + // This indicates that the field is provided in responses, but including the + // field in a request does nothing (the server *must* ignore it and + // *must not* throw an error as a result of the field's presence). + FieldBehavior_OUTPUT_ONLY FieldBehavior = 3 + // Denotes a field as input only. + // This indicates that the field is provided in requests, and the + // corresponding field is not included in output. + FieldBehavior_INPUT_ONLY FieldBehavior = 4 + // Denotes a field as immutable. + // This indicates that the field may be set once in a request to create a + // resource, but may not be changed thereafter. + FieldBehavior_IMMUTABLE FieldBehavior = 5 +) + +var FieldBehavior_name = map[int32]string{ + 0: "FIELD_BEHAVIOR_UNSPECIFIED", + 1: "OPTIONAL", + 2: "REQUIRED", + 3: "OUTPUT_ONLY", + 4: "INPUT_ONLY", + 5: "IMMUTABLE", +} + +var FieldBehavior_value = map[string]int32{ + "FIELD_BEHAVIOR_UNSPECIFIED": 0, + "OPTIONAL": 1, + "REQUIRED": 2, + "OUTPUT_ONLY": 3, + "INPUT_ONLY": 4, + "IMMUTABLE": 5, +} + +func (x FieldBehavior) String() string { + return proto.EnumName(FieldBehavior_name, int32(x)) +} + +func (FieldBehavior) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_4648f18fd5079967, []int{0} +} + +var E_FieldBehavior = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: ([]FieldBehavior)(nil), + Field: 1052, + Name: "google.api.field_behavior", + Tag: "varint,1052,rep,name=field_behavior,enum=google.api.FieldBehavior", + Filename: "google/api/field_behavior.proto", +} + +func init() { + proto.RegisterEnum("google.api.FieldBehavior", FieldBehavior_name, FieldBehavior_value) + proto.RegisterExtension(E_FieldBehavior) +} + +func init() { + proto.RegisterFile("google/api/field_behavior.proto", fileDescriptor_4648f18fd5079967) +} + +var fileDescriptor_4648f18fd5079967 = []byte{ + // 303 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x90, 0x4f, 0x4f, 0xb3, 0x30, + 0x1c, 0xc7, 0x9f, 0xfd, 0x79, 0xcc, 0xac, 0x0e, 0x49, 0x4f, 0xba, 0x44, 0xdd, 0xd1, 0x78, 0x28, + 0x89, 0xde, 0xf4, 0x04, 0xae, 0xd3, 0x26, 0x8c, 0x56, 0x04, 0x13, 0xbd, 0x60, 0xb7, 0xb1, 0xda, + 0x64, 0xd2, 0x06, 0xd0, 0x8b, 0x6f, 0xc5, 0x93, 0xaf, 0xd4, 0xd0, 0x31, 0x85, 0x5b, 0xbf, 0xf9, + 0x7d, 0xfa, 0xeb, 0xe7, 0x5b, 0x70, 0x2a, 0x94, 0x12, 0xeb, 0xd4, 0xe1, 0x5a, 0x3a, 0x2b, 0x99, + 0xae, 0x97, 0xc9, 0x3c, 0x7d, 0xe5, 0x1f, 0x52, 0xe5, 0x48, 0xe7, 0xaa, 0x54, 0x10, 0x6c, 0x00, + 0xc4, 0xb5, 0x1c, 0x8d, 0x6b, 0xd8, 0x4c, 0xe6, 0xef, 0x2b, 0x67, 0x99, 0x16, 0x8b, 0x5c, 0xea, + 0x72, 0x4b, 0x9f, 0x7f, 0x82, 0xe1, 0xb4, 0xda, 0xe2, 0xd5, 0x4b, 0xe0, 0x09, 0x18, 0x4d, 0x09, + 0xf6, 0x27, 0x89, 0x87, 0xef, 0xdc, 0x47, 0x42, 0xc3, 0x24, 0x0e, 0x1e, 0x18, 0xbe, 0x21, 0x53, + 0x82, 0x27, 0xf6, 0x3f, 0xb8, 0x0f, 0x06, 0x94, 0x45, 0x84, 0x06, 0xae, 0x6f, 0x77, 0xaa, 0x14, + 0xe2, 0xfb, 0x98, 0x84, 0x78, 0x62, 0x77, 0xe1, 0x01, 0xd8, 0xa3, 0x71, 0xc4, 0xe2, 0x28, 0xa1, + 0x81, 0xff, 0x64, 0xf7, 0xa0, 0x05, 0x00, 0x09, 0x7e, 0x73, 0x1f, 0x0e, 0xc1, 0x2e, 0x99, 0xcd, + 0xe2, 0xc8, 0xf5, 0x7c, 0x6c, 0xff, 0xbf, 0x7a, 0x01, 0x56, 0xbb, 0x02, 0x3c, 0x46, 0xb5, 0xfd, + 0xd6, 0x18, 0x19, 0x3b, 0xaa, 0x4b, 0xa9, 0xb2, 0xe2, 0xf0, 0x6b, 0x30, 0xee, 0x9d, 0x59, 0x17, + 0x47, 0xe8, 0xaf, 0x23, 0x6a, 0xe9, 0x87, 0xc3, 0x55, 0x33, 0x7a, 0x1a, 0x58, 0x0b, 0xf5, 0xd6, + 0xc0, 0x3d, 0xd8, 0xe2, 0x59, 0xf5, 0x0c, 0xeb, 0x3c, 0xbb, 0x35, 0x21, 0xd4, 0x9a, 0x67, 0x02, + 0xa9, 0x5c, 0x38, 0x22, 0xcd, 0x8c, 0x84, 0xb3, 0x19, 0x71, 0x2d, 0x0b, 0xf3, 0xe9, 0x3c, 0xcb, + 0x54, 0xc9, 0x8d, 0xcf, 0x75, 0xe3, 0xfc, 0xdd, 0xed, 0xdf, 0xba, 0x8c, 0xcc, 0x77, 0xcc, 0xa5, + 0xcb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x94, 0x57, 0x94, 0xa8, 0x01, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go new file mode 100644 index 00000000..6ed6f3c9 --- /dev/null +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go @@ -0,0 +1,635 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/api/http.proto + +package annotations + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// Defines the HTTP configuration for an API service. It contains a list of +// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method +// to one or more HTTP REST API methods. +type Http struct { + // A list of HTTP configuration rules that apply to individual API methods. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + Rules []*HttpRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` + // When set to true, URL path parameters will be fully URI-decoded except in + // cases of single segment matches in reserved expansion, where "%2F" will be + // left encoded. + // + // The default behavior is to not decode RFC 6570 reserved characters in multi + // segment matches. + FullyDecodeReservedExpansion bool `protobuf:"varint,2,opt,name=fully_decode_reserved_expansion,json=fullyDecodeReservedExpansion,proto3" json:"fully_decode_reserved_expansion,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Http) Reset() { *m = Http{} } +func (m *Http) String() string { return proto.CompactTextString(m) } +func (*Http) ProtoMessage() {} +func (*Http) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9994be407cdcc9, []int{0} +} + +func (m *Http) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Http.Unmarshal(m, b) +} +func (m *Http) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Http.Marshal(b, m, deterministic) +} +func (m *Http) XXX_Merge(src proto.Message) { + xxx_messageInfo_Http.Merge(m, src) +} +func (m *Http) XXX_Size() int { + return xxx_messageInfo_Http.Size(m) +} +func (m *Http) XXX_DiscardUnknown() { + xxx_messageInfo_Http.DiscardUnknown(m) +} + +var xxx_messageInfo_Http proto.InternalMessageInfo + +func (m *Http) GetRules() []*HttpRule { + if m != nil { + return m.Rules + } + return nil +} + +func (m *Http) GetFullyDecodeReservedExpansion() bool { + if m != nil { + return m.FullyDecodeReservedExpansion + } + return false +} + +// # gRPC Transcoding +// +// gRPC Transcoding is a feature for mapping between a gRPC method and one or +// more HTTP REST endpoints. It allows developers to build a single API service +// that supports both gRPC APIs and REST APIs. Many systems, including [Google +// APIs](https://github.com/googleapis/googleapis), +// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC +// Gateway](https://github.com/grpc-ecosystem/grpc-gateway), +// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature +// and use it for large scale production services. +// +// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies +// how different portions of the gRPC request message are mapped to the URL +// path, URL query parameters, and HTTP request body. It also controls how the +// gRPC response message is mapped to the HTTP response body. `HttpRule` is +// typically specified as an `google.api.http` annotation on the gRPC method. +// +// Each mapping specifies a URL path template and an HTTP method. The path +// template may refer to one or more fields in the gRPC request message, as long +// as each field is a non-repeated field with a primitive (non-message) type. +// The path template controls how fields of the request message are mapped to +// the URL path. +// +// Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/{name=messages/*}" +// }; +// } +// } +// message GetMessageRequest { +// string name = 1; // Mapped to URL path. +// } +// message Message { +// string text = 1; // The resource content. +// } +// +// This enables an HTTP REST to gRPC mapping as below: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456` | `GetMessage(name: "messages/123456")` +// +// Any fields in the request message which are not bound by the path template +// automatically become HTTP query parameters if there is no HTTP request body. +// For example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get:"/v1/messages/{message_id}" +// }; +// } +// } +// message GetMessageRequest { +// message SubMessage { +// string subfield = 1; +// } +// string message_id = 1; // Mapped to URL path. +// int64 revision = 2; // Mapped to URL query parameter `revision`. +// SubMessage sub = 3; // Mapped to URL query parameter `sub.subfield`. +// } +// +// This enables a HTTP JSON to RPC mapping as below: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | +// `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: +// "foo"))` +// +// Note that fields which are mapped to URL query parameters must have a +// primitive type or a repeated primitive type or a non-repeated message type. +// In the case of a repeated type, the parameter can be repeated in the URL +// as `...?param=A¶m=B`. In the case of a message type, each field of the +// message is mapped to a separate parameter, such as +// `...?foo.a=A&foo.b=B&foo.c=C`. +// +// For HTTP methods that allow a request body, the `body` field +// specifies the mapping. Consider a REST update method on the +// message resource collection: +// +// service Messaging { +// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { +// option (google.api.http) = { +// patch: "/v1/messages/{message_id}" +// body: "message" +// }; +// } +// } +// message UpdateMessageRequest { +// string message_id = 1; // mapped to the URL +// Message message = 2; // mapped to the body +// } +// +// The following HTTP JSON to RPC mapping is enabled, where the +// representation of the JSON in the request body is determined by +// protos JSON encoding: +// +// HTTP | gRPC +// -----|----- +// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: +// "123456" message { text: "Hi!" })` +// +// The special name `*` can be used in the body mapping to define that +// every field not bound by the path template should be mapped to the +// request body. This enables the following alternative definition of +// the update method: +// +// service Messaging { +// rpc UpdateMessage(Message) returns (Message) { +// option (google.api.http) = { +// patch: "/v1/messages/{message_id}" +// body: "*" +// }; +// } +// } +// message Message { +// string message_id = 1; +// string text = 2; +// } +// +// +// The following HTTP JSON to RPC mapping is enabled: +// +// HTTP | gRPC +// -----|----- +// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: +// "123456" text: "Hi!")` +// +// Note that when using `*` in the body mapping, it is not possible to +// have HTTP parameters, as all fields not bound by the path end in +// the body. This makes this option more rarely used in practice when +// defining REST APIs. The common usage of `*` is in custom methods +// which don't use the URL at all for transferring data. +// +// It is possible to define multiple HTTP methods for one RPC by using +// the `additional_bindings` option. Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/messages/{message_id}" +// additional_bindings { +// get: "/v1/users/{user_id}/messages/{message_id}" +// } +// }; +// } +// } +// message GetMessageRequest { +// string message_id = 1; +// string user_id = 2; +// } +// +// This enables the following two alternative HTTP JSON to RPC mappings: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")` +// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: +// "123456")` +// +// ## Rules for HTTP mapping +// +// 1. Leaf request fields (recursive expansion nested messages in the request +// message) are classified into three categories: +// - Fields referred by the path template. They are passed via the URL path. +// - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They are passed via the HTTP +// request body. +// - All other fields are passed via the URL query parameters, and the +// parameter name is the field path in the request message. A repeated +// field can be represented as multiple query parameters under the same +// name. +// 2. If [HttpRule.body][google.api.HttpRule.body] is "*", there is no URL query parameter, all fields +// are passed via URL path and HTTP request body. +// 3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP request body, all +// fields are passed via URL path and URL query parameters. +// +// ### Path template syntax +// +// Template = "/" Segments [ Verb ] ; +// Segments = Segment { "/" Segment } ; +// Segment = "*" | "**" | LITERAL | Variable ; +// Variable = "{" FieldPath [ "=" Segments ] "}" ; +// FieldPath = IDENT { "." IDENT } ; +// Verb = ":" LITERAL ; +// +// The syntax `*` matches a single URL path segment. The syntax `**` matches +// zero or more URL path segments, which must be the last part of the URL path +// except the `Verb`. +// +// The syntax `Variable` matches part of the URL path as specified by its +// template. A variable template must not contain other variables. If a variable +// matches a single path segment, its template may be omitted, e.g. `{var}` +// is equivalent to `{var=*}`. +// +// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL` +// contains any reserved character, such characters should be percent-encoded +// before the matching. +// +// If a variable contains exactly one path segment, such as `"{var}"` or +// `"{var=*}"`, when such a variable is expanded into a URL path on the client +// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The +// server side does the reverse decoding. Such variables show up in the +// [Discovery +// Document](https://developers.google.com/discovery/v1/reference/apis) as +// `{var}`. +// +// If a variable contains multiple path segments, such as `"{var=foo/*}"` +// or `"{var=**}"`, when such a variable is expanded into a URL path on the +// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. +// The server side does the reverse decoding, except "%2F" and "%2f" are left +// unchanged. Such variables show up in the +// [Discovery +// Document](https://developers.google.com/discovery/v1/reference/apis) as +// `{+var}`. +// +// ## Using gRPC API Service Configuration +// +// gRPC API Service Configuration (service config) is a configuration language +// for configuring a gRPC service to become a user-facing product. The +// service config is simply the YAML representation of the `google.api.Service` +// proto message. +// +// As an alternative to annotating your proto file, you can configure gRPC +// transcoding in your service config YAML files. You do this by specifying a +// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same +// effect as the proto annotation. This can be particularly useful if you +// have a proto that is reused in multiple services. Note that any transcoding +// specified in the service config will override any matching transcoding +// configuration in the proto. +// +// Example: +// +// http: +// rules: +// # Selects a gRPC method and applies HttpRule to it. +// - selector: example.v1.Messaging.GetMessage +// get: /v1/messages/{message_id}/{sub.subfield} +// +// ## Special notes +// +// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the +// proto to JSON conversion must follow the [proto3 +// specification](https://developers.google.com/protocol-buffers/docs/proto3#json). +// +// While the single segment variable follows the semantics of +// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String +// Expansion, the multi segment variable **does not** follow RFC 6570 Section +// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion +// does not expand special characters like `?` and `#`, which would lead +// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding +// for multi segment variables. +// +// The path variables **must not** refer to any repeated or mapped field, +// because client libraries are not capable of handling such variable expansion. +// +// The path variables **must not** capture the leading "/" character. The reason +// is that the most common use case "{var}" does not capture the leading "/" +// character. For consistency, all path variables must share the same behavior. +// +// Repeated message fields must not be mapped to URL query parameters, because +// no client library can support such complicated mapping. +// +// If an API needs to use a JSON array for request or response body, it can map +// the request or response body to a repeated field. However, some gRPC +// Transcoding implementations may not support this feature. +type HttpRule struct { + // Selects a method to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax details. + Selector string `protobuf:"bytes,1,opt,name=selector,proto3" json:"selector,omitempty"` + // Determines the URL pattern is matched by this rules. This pattern can be + // used with any of the {get|put|post|delete|patch} methods. A custom method + // can be defined using the 'custom' field. + // + // Types that are valid to be assigned to Pattern: + // *HttpRule_Get + // *HttpRule_Put + // *HttpRule_Post + // *HttpRule_Delete + // *HttpRule_Patch + // *HttpRule_Custom + Pattern isHttpRule_Pattern `protobuf_oneof:"pattern"` + // The name of the request field whose value is mapped to the HTTP request + // body, or `*` for mapping all request fields not captured by the path + // pattern to the HTTP body, or omitted for not having any HTTP request body. + // + // NOTE: the referred field must be present at the top-level of the request + // message type. + Body string `protobuf:"bytes,7,opt,name=body,proto3" json:"body,omitempty"` + // Optional. The name of the response field whose value is mapped to the HTTP + // response body. When omitted, the entire response message will be used + // as the HTTP response body. + // + // NOTE: The referred field must be present at the top-level of the response + // message type. + ResponseBody string `protobuf:"bytes,12,opt,name=response_body,json=responseBody,proto3" json:"response_body,omitempty"` + // Additional HTTP bindings for the selector. Nested bindings must + // not contain an `additional_bindings` field themselves (that is, + // the nesting may only be one level deep). + AdditionalBindings []*HttpRule `protobuf:"bytes,11,rep,name=additional_bindings,json=additionalBindings,proto3" json:"additional_bindings,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *HttpRule) Reset() { *m = HttpRule{} } +func (m *HttpRule) String() string { return proto.CompactTextString(m) } +func (*HttpRule) ProtoMessage() {} +func (*HttpRule) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9994be407cdcc9, []int{1} +} + +func (m *HttpRule) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_HttpRule.Unmarshal(m, b) +} +func (m *HttpRule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_HttpRule.Marshal(b, m, deterministic) +} +func (m *HttpRule) XXX_Merge(src proto.Message) { + xxx_messageInfo_HttpRule.Merge(m, src) +} +func (m *HttpRule) XXX_Size() int { + return xxx_messageInfo_HttpRule.Size(m) +} +func (m *HttpRule) XXX_DiscardUnknown() { + xxx_messageInfo_HttpRule.DiscardUnknown(m) +} + +var xxx_messageInfo_HttpRule proto.InternalMessageInfo + +func (m *HttpRule) GetSelector() string { + if m != nil { + return m.Selector + } + return "" +} + +type isHttpRule_Pattern interface { + isHttpRule_Pattern() +} + +type HttpRule_Get struct { + Get string `protobuf:"bytes,2,opt,name=get,proto3,oneof"` +} + +type HttpRule_Put struct { + Put string `protobuf:"bytes,3,opt,name=put,proto3,oneof"` +} + +type HttpRule_Post struct { + Post string `protobuf:"bytes,4,opt,name=post,proto3,oneof"` +} + +type HttpRule_Delete struct { + Delete string `protobuf:"bytes,5,opt,name=delete,proto3,oneof"` +} + +type HttpRule_Patch struct { + Patch string `protobuf:"bytes,6,opt,name=patch,proto3,oneof"` +} + +type HttpRule_Custom struct { + Custom *CustomHttpPattern `protobuf:"bytes,8,opt,name=custom,proto3,oneof"` +} + +func (*HttpRule_Get) isHttpRule_Pattern() {} + +func (*HttpRule_Put) isHttpRule_Pattern() {} + +func (*HttpRule_Post) isHttpRule_Pattern() {} + +func (*HttpRule_Delete) isHttpRule_Pattern() {} + +func (*HttpRule_Patch) isHttpRule_Pattern() {} + +func (*HttpRule_Custom) isHttpRule_Pattern() {} + +func (m *HttpRule) GetPattern() isHttpRule_Pattern { + if m != nil { + return m.Pattern + } + return nil +} + +func (m *HttpRule) GetGet() string { + if x, ok := m.GetPattern().(*HttpRule_Get); ok { + return x.Get + } + return "" +} + +func (m *HttpRule) GetPut() string { + if x, ok := m.GetPattern().(*HttpRule_Put); ok { + return x.Put + } + return "" +} + +func (m *HttpRule) GetPost() string { + if x, ok := m.GetPattern().(*HttpRule_Post); ok { + return x.Post + } + return "" +} + +func (m *HttpRule) GetDelete() string { + if x, ok := m.GetPattern().(*HttpRule_Delete); ok { + return x.Delete + } + return "" +} + +func (m *HttpRule) GetPatch() string { + if x, ok := m.GetPattern().(*HttpRule_Patch); ok { + return x.Patch + } + return "" +} + +func (m *HttpRule) GetCustom() *CustomHttpPattern { + if x, ok := m.GetPattern().(*HttpRule_Custom); ok { + return x.Custom + } + return nil +} + +func (m *HttpRule) GetBody() string { + if m != nil { + return m.Body + } + return "" +} + +func (m *HttpRule) GetResponseBody() string { + if m != nil { + return m.ResponseBody + } + return "" +} + +func (m *HttpRule) GetAdditionalBindings() []*HttpRule { + if m != nil { + return m.AdditionalBindings + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*HttpRule) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*HttpRule_Get)(nil), + (*HttpRule_Put)(nil), + (*HttpRule_Post)(nil), + (*HttpRule_Delete)(nil), + (*HttpRule_Patch)(nil), + (*HttpRule_Custom)(nil), + } +} + +// A custom pattern is used for defining custom HTTP verb. +type CustomHttpPattern struct { + // The name of this custom HTTP verb. + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + // The path matched by this custom verb. + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CustomHttpPattern) Reset() { *m = CustomHttpPattern{} } +func (m *CustomHttpPattern) String() string { return proto.CompactTextString(m) } +func (*CustomHttpPattern) ProtoMessage() {} +func (*CustomHttpPattern) Descriptor() ([]byte, []int) { + return fileDescriptor_ff9994be407cdcc9, []int{2} +} + +func (m *CustomHttpPattern) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CustomHttpPattern.Unmarshal(m, b) +} +func (m *CustomHttpPattern) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CustomHttpPattern.Marshal(b, m, deterministic) +} +func (m *CustomHttpPattern) XXX_Merge(src proto.Message) { + xxx_messageInfo_CustomHttpPattern.Merge(m, src) +} +func (m *CustomHttpPattern) XXX_Size() int { + return xxx_messageInfo_CustomHttpPattern.Size(m) +} +func (m *CustomHttpPattern) XXX_DiscardUnknown() { + xxx_messageInfo_CustomHttpPattern.DiscardUnknown(m) +} + +var xxx_messageInfo_CustomHttpPattern proto.InternalMessageInfo + +func (m *CustomHttpPattern) GetKind() string { + if m != nil { + return m.Kind + } + return "" +} + +func (m *CustomHttpPattern) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +func init() { + proto.RegisterType((*Http)(nil), "google.api.Http") + proto.RegisterType((*HttpRule)(nil), "google.api.HttpRule") + proto.RegisterType((*CustomHttpPattern)(nil), "google.api.CustomHttpPattern") +} + +func init() { + proto.RegisterFile("google/api/http.proto", fileDescriptor_ff9994be407cdcc9) +} + +var fileDescriptor_ff9994be407cdcc9 = []byte{ + // 419 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xc1, 0x8e, 0xd3, 0x30, + 0x10, 0x86, 0x49, 0x9b, 0x76, 0xdb, 0xe9, 0x82, 0x84, 0x59, 0x90, 0x85, 0x40, 0x54, 0xe5, 0x52, + 0x71, 0x48, 0xa5, 0xe5, 0xc0, 0x61, 0x4f, 0x1b, 0xa8, 0x58, 0x6e, 0x55, 0x8e, 0x5c, 0x22, 0x37, + 0x1e, 0x52, 0x83, 0xd7, 0xb6, 0xe2, 0x09, 0xa2, 0xaf, 0xc3, 0x63, 0xf1, 0x24, 0x1c, 0x91, 0x9d, + 0x84, 0x56, 0x42, 0xe2, 0x36, 0xf3, 0xff, 0x9f, 0xa7, 0x7f, 0x27, 0x03, 0x4f, 0x6b, 0x6b, 0x6b, + 0x8d, 0x1b, 0xe1, 0xd4, 0xe6, 0x40, 0xe4, 0x32, 0xd7, 0x58, 0xb2, 0x0c, 0x3a, 0x39, 0x13, 0x4e, + 0xad, 0x8e, 0x90, 0xde, 0x11, 0x39, 0xf6, 0x06, 0x26, 0x4d, 0xab, 0xd1, 0xf3, 0x64, 0x39, 0x5e, + 0x2f, 0xae, 0xaf, 0xb2, 0x13, 0x93, 0x05, 0xa0, 0x68, 0x35, 0x16, 0x1d, 0xc2, 0xb6, 0xf0, 0xea, + 0x4b, 0xab, 0xf5, 0xb1, 0x94, 0x58, 0x59, 0x89, 0x65, 0x83, 0x1e, 0x9b, 0xef, 0x28, 0x4b, 0xfc, + 0xe1, 0x84, 0xf1, 0xca, 0x1a, 0x3e, 0x5a, 0x26, 0xeb, 0x59, 0xf1, 0x22, 0x62, 0x1f, 0x22, 0x55, + 0xf4, 0xd0, 0x76, 0x60, 0x56, 0xbf, 0x46, 0x30, 0x1b, 0x46, 0xb3, 0xe7, 0x30, 0xf3, 0xa8, 0xb1, + 0x22, 0xdb, 0xf0, 0x64, 0x99, 0xac, 0xe7, 0xc5, 0xdf, 0x9e, 0x31, 0x18, 0xd7, 0x48, 0x71, 0xe6, + 0xfc, 0xee, 0x41, 0x11, 0x9a, 0xa0, 0xb9, 0x96, 0xf8, 0x78, 0xd0, 0x5c, 0x4b, 0xec, 0x0a, 0x52, + 0x67, 0x3d, 0xf1, 0xb4, 0x17, 0x63, 0xc7, 0x38, 0x4c, 0x25, 0x6a, 0x24, 0xe4, 0x93, 0x5e, 0xef, + 0x7b, 0xf6, 0x0c, 0x26, 0x4e, 0x50, 0x75, 0xe0, 0xd3, 0xde, 0xe8, 0x5a, 0xf6, 0x0e, 0xa6, 0x55, + 0xeb, 0xc9, 0xde, 0xf3, 0xd9, 0x32, 0x59, 0x2f, 0xae, 0x5f, 0x9e, 0x2f, 0xe3, 0x7d, 0x74, 0x42, + 0xee, 0x9d, 0x20, 0xc2, 0xc6, 0x84, 0x81, 0x1d, 0xce, 0x18, 0xa4, 0x7b, 0x2b, 0x8f, 0xfc, 0x22, + 0xfe, 0x81, 0x58, 0xb3, 0xd7, 0xf0, 0xb0, 0x41, 0xef, 0xac, 0xf1, 0x58, 0x46, 0xf3, 0x32, 0x9a, + 0x97, 0x83, 0x98, 0x07, 0x68, 0x0b, 0x4f, 0x84, 0x94, 0x8a, 0x94, 0x35, 0x42, 0x97, 0x7b, 0x65, + 0xa4, 0x32, 0xb5, 0xe7, 0x8b, 0xff, 0x7c, 0x0b, 0x76, 0x7a, 0x90, 0xf7, 0x7c, 0x3e, 0x87, 0x0b, + 0xd7, 0x85, 0x5a, 0xdd, 0xc0, 0xe3, 0x7f, 0x92, 0x86, 0x7c, 0xdf, 0x94, 0x91, 0xfd, 0x82, 0x63, + 0x1d, 0x34, 0x27, 0xe8, 0xd0, 0x6d, 0xb7, 0x88, 0x75, 0xfe, 0x15, 0x1e, 0x55, 0xf6, 0xfe, 0xec, + 0x67, 0xf3, 0x79, 0x1c, 0x13, 0xae, 0x67, 0x97, 0x7c, 0xbe, 0xed, 0x8d, 0xda, 0x6a, 0x61, 0xea, + 0xcc, 0x36, 0xf5, 0xa6, 0x46, 0x13, 0x6f, 0x6b, 0xd3, 0x59, 0xc2, 0x29, 0x1f, 0xaf, 0x4e, 0x18, + 0x63, 0x49, 0x84, 0x98, 0xfe, 0xe6, 0xac, 0xfe, 0x9d, 0x24, 0x3f, 0x47, 0xe9, 0xc7, 0xdb, 0xdd, + 0xa7, 0xfd, 0x34, 0xbe, 0x7b, 0xfb, 0x27, 0x00, 0x00, 0xff, 0xff, 0xae, 0xde, 0xa1, 0xd0, 0xac, + 0x02, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/resource.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/resource.pb.go new file mode 100644 index 00000000..d1d8eb54 --- /dev/null +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/resource.pb.go @@ -0,0 +1,443 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/api/resource.proto + +package annotations + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" + descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// A description of the historical or future-looking state of the +// resource pattern. +type ResourceDescriptor_History int32 + +const ( + // The "unset" value. + ResourceDescriptor_HISTORY_UNSPECIFIED ResourceDescriptor_History = 0 + // The resource originally had one pattern and launched as such, and + // additional patterns were added later. + ResourceDescriptor_ORIGINALLY_SINGLE_PATTERN ResourceDescriptor_History = 1 + // The resource has one pattern, but the API owner expects to add more + // later. (This is the inverse of ORIGINALLY_SINGLE_PATTERN, and prevents + // that from being necessary once there are multiple patterns.) + ResourceDescriptor_FUTURE_MULTI_PATTERN ResourceDescriptor_History = 2 +) + +var ResourceDescriptor_History_name = map[int32]string{ + 0: "HISTORY_UNSPECIFIED", + 1: "ORIGINALLY_SINGLE_PATTERN", + 2: "FUTURE_MULTI_PATTERN", +} + +var ResourceDescriptor_History_value = map[string]int32{ + "HISTORY_UNSPECIFIED": 0, + "ORIGINALLY_SINGLE_PATTERN": 1, + "FUTURE_MULTI_PATTERN": 2, +} + +func (x ResourceDescriptor_History) String() string { + return proto.EnumName(ResourceDescriptor_History_name, int32(x)) +} + +func (ResourceDescriptor_History) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_465e9122405d1bb5, []int{0, 0} +} + +// A simple descriptor of a resource type. +// +// ResourceDescriptor annotates a resource message (either by means of a +// protobuf annotation or use in the service config), and associates the +// resource's schema, the resource type, and the pattern of the resource name. +// +// Example: +// +// message Topic { +// // Indicates this message defines a resource schema. +// // Declares the resource type in the format of {service}/{kind}. +// // For Kubernetes resources, the format is {api group}/{kind}. +// option (google.api.resource) = { +// type: "pubsub.googleapis.com/Topic" +// name_descriptor: { +// pattern: "projects/{project}/topics/{topic}" +// parent_type: "cloudresourcemanager.googleapis.com/Project" +// parent_name_extractor: "projects/{project}" +// } +// }; +// } +// +// The ResourceDescriptor Yaml config will look like: +// +// resources: +// - type: "pubsub.googleapis.com/Topic" +// name_descriptor: +// - pattern: "projects/{project}/topics/{topic}" +// parent_type: "cloudresourcemanager.googleapis.com/Project" +// parent_name_extractor: "projects/{project}" +// +// Sometimes, resources have multiple patterns, typically because they can +// live under multiple parents. +// +// Example: +// +// message LogEntry { +// option (google.api.resource) = { +// type: "logging.googleapis.com/LogEntry" +// name_descriptor: { +// pattern: "projects/{project}/logs/{log}" +// parent_type: "cloudresourcemanager.googleapis.com/Project" +// parent_name_extractor: "projects/{project}" +// } +// name_descriptor: { +// pattern: "folders/{folder}/logs/{log}" +// parent_type: "cloudresourcemanager.googleapis.com/Folder" +// parent_name_extractor: "folders/{folder}" +// } +// name_descriptor: { +// pattern: "organizations/{organization}/logs/{log}" +// parent_type: "cloudresourcemanager.googleapis.com/Organization" +// parent_name_extractor: "organizations/{organization}" +// } +// name_descriptor: { +// pattern: "billingAccounts/{billing_account}/logs/{log}" +// parent_type: "billing.googleapis.com/BillingAccount" +// parent_name_extractor: "billingAccounts/{billing_account}" +// } +// }; +// } +// +// The ResourceDescriptor Yaml config will look like: +// +// resources: +// - type: 'logging.googleapis.com/LogEntry' +// name_descriptor: +// - pattern: "projects/{project}/logs/{log}" +// parent_type: "cloudresourcemanager.googleapis.com/Project" +// parent_name_extractor: "projects/{project}" +// - pattern: "folders/{folder}/logs/{log}" +// parent_type: "cloudresourcemanager.googleapis.com/Folder" +// parent_name_extractor: "folders/{folder}" +// - pattern: "organizations/{organization}/logs/{log}" +// parent_type: "cloudresourcemanager.googleapis.com/Organization" +// parent_name_extractor: "organizations/{organization}" +// - pattern: "billingAccounts/{billing_account}/logs/{log}" +// parent_type: "billing.googleapis.com/BillingAccount" +// parent_name_extractor: "billingAccounts/{billing_account}" +// +// For flexible resources, the resource name doesn't contain parent names, but +// the resource itself has parents for policy evaluation. +// +// Example: +// +// message Shelf { +// option (google.api.resource) = { +// type: "library.googleapis.com/Shelf" +// name_descriptor: { +// pattern: "shelves/{shelf}" +// parent_type: "cloudresourcemanager.googleapis.com/Project" +// } +// name_descriptor: { +// pattern: "shelves/{shelf}" +// parent_type: "cloudresourcemanager.googleapis.com/Folder" +// } +// }; +// } +// +// The ResourceDescriptor Yaml config will look like: +// +// resources: +// - type: 'library.googleapis.com/Shelf' +// name_descriptor: +// - pattern: "shelves/{shelf}" +// parent_type: "cloudresourcemanager.googleapis.com/Project" +// - pattern: "shelves/{shelf}" +// parent_type: "cloudresourcemanager.googleapis.com/Folder" +type ResourceDescriptor struct { + // The resource type. It must be in the format of + // {service_name}/{resource_type_kind}. The `resource_type_kind` must be + // singular and must not include version numbers. + // + // Example: `storage.googleapis.com/Bucket` + // + // The value of the resource_type_kind must follow the regular expression + // /[A-Za-z][a-zA-Z0-9]+/. It should start with an upper case character and + // should use PascalCase (UpperCamelCase). The maximum number of + // characters allowed for the `resource_type_kind` is 100. + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // Optional. The relative resource name pattern associated with this resource + // type. The DNS prefix of the full resource name shouldn't be specified here. + // + // The path pattern must follow the syntax, which aligns with HTTP binding + // syntax: + // + // Template = Segment { "/" Segment } ; + // Segment = LITERAL | Variable ; + // Variable = "{" LITERAL "}" ; + // + // Examples: + // + // - "projects/{project}/topics/{topic}" + // - "projects/{project}/knowledgeBases/{knowledge_base}" + // + // The components in braces correspond to the IDs for each resource in the + // hierarchy. It is expected that, if multiple patterns are provided, + // the same component name (e.g. "project") refers to IDs of the same + // type of resource. + Pattern []string `protobuf:"bytes,2,rep,name=pattern,proto3" json:"pattern,omitempty"` + // Optional. The field on the resource that designates the resource name + // field. If omitted, this is assumed to be "name". + NameField string `protobuf:"bytes,3,opt,name=name_field,json=nameField,proto3" json:"name_field,omitempty"` + // Optional. The historical or future-looking state of the resource pattern. + // + // Example: + // + // // The InspectTemplate message originally only supported resource + // // names with organization, and project was added later. + // message InspectTemplate { + // option (google.api.resource) = { + // type: "dlp.googleapis.com/InspectTemplate" + // pattern: + // "organizations/{organization}/inspectTemplates/{inspect_template}" + // pattern: "projects/{project}/inspectTemplates/{inspect_template}" + // history: ORIGINALLY_SINGLE_PATTERN + // }; + // } + History ResourceDescriptor_History `protobuf:"varint,4,opt,name=history,proto3,enum=google.api.ResourceDescriptor_History" json:"history,omitempty"` + // The plural name used in the resource name, such as 'projects' for + // the name of 'projects/{project}'. It is the same concept of the `plural` + // field in k8s CRD spec + // https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + Plural string `protobuf:"bytes,5,opt,name=plural,proto3" json:"plural,omitempty"` + // The same concept of the `singular` field in k8s CRD spec + // https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + // Such as "project" for the `resourcemanager.googleapis.com/Project` type. + Singular string `protobuf:"bytes,6,opt,name=singular,proto3" json:"singular,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResourceDescriptor) Reset() { *m = ResourceDescriptor{} } +func (m *ResourceDescriptor) String() string { return proto.CompactTextString(m) } +func (*ResourceDescriptor) ProtoMessage() {} +func (*ResourceDescriptor) Descriptor() ([]byte, []int) { + return fileDescriptor_465e9122405d1bb5, []int{0} +} + +func (m *ResourceDescriptor) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ResourceDescriptor.Unmarshal(m, b) +} +func (m *ResourceDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ResourceDescriptor.Marshal(b, m, deterministic) +} +func (m *ResourceDescriptor) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceDescriptor.Merge(m, src) +} +func (m *ResourceDescriptor) XXX_Size() int { + return xxx_messageInfo_ResourceDescriptor.Size(m) +} +func (m *ResourceDescriptor) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceDescriptor.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceDescriptor proto.InternalMessageInfo + +func (m *ResourceDescriptor) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *ResourceDescriptor) GetPattern() []string { + if m != nil { + return m.Pattern + } + return nil +} + +func (m *ResourceDescriptor) GetNameField() string { + if m != nil { + return m.NameField + } + return "" +} + +func (m *ResourceDescriptor) GetHistory() ResourceDescriptor_History { + if m != nil { + return m.History + } + return ResourceDescriptor_HISTORY_UNSPECIFIED +} + +func (m *ResourceDescriptor) GetPlural() string { + if m != nil { + return m.Plural + } + return "" +} + +func (m *ResourceDescriptor) GetSingular() string { + if m != nil { + return m.Singular + } + return "" +} + +// Defines a proto annotation that describes a string field that refers to +// an API resource. +type ResourceReference struct { + // The resource type that the annotated field references. + // + // Example: + // + // message Subscription { + // string topic = 2 [(google.api.resource_reference) = { + // type: "pubsub.googleapis.com/Topic" + // }]; + // } + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // The resource type of a child collection that the annotated field + // references. This is useful for annotating the `parent` field that + // doesn't have a fixed resource type. + // + // Example: + // + // message ListLogEntriesRequest { + // string parent = 1 [(google.api.resource_reference) = { + // child_type: "logging.googleapis.com/LogEntry" + // }; + // } + ChildType string `protobuf:"bytes,2,opt,name=child_type,json=childType,proto3" json:"child_type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResourceReference) Reset() { *m = ResourceReference{} } +func (m *ResourceReference) String() string { return proto.CompactTextString(m) } +func (*ResourceReference) ProtoMessage() {} +func (*ResourceReference) Descriptor() ([]byte, []int) { + return fileDescriptor_465e9122405d1bb5, []int{1} +} + +func (m *ResourceReference) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ResourceReference.Unmarshal(m, b) +} +func (m *ResourceReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ResourceReference.Marshal(b, m, deterministic) +} +func (m *ResourceReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceReference.Merge(m, src) +} +func (m *ResourceReference) XXX_Size() int { + return xxx_messageInfo_ResourceReference.Size(m) +} +func (m *ResourceReference) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceReference.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceReference proto.InternalMessageInfo + +func (m *ResourceReference) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *ResourceReference) GetChildType() string { + if m != nil { + return m.ChildType + } + return "" +} + +var E_ResourceReference = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*ResourceReference)(nil), + Field: 1055, + Name: "google.api.resource_reference", + Tag: "bytes,1055,opt,name=resource_reference", + Filename: "google/api/resource.proto", +} + +var E_ResourceDefinition = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FileOptions)(nil), + ExtensionType: ([]*ResourceDescriptor)(nil), + Field: 1053, + Name: "google.api.resource_definition", + Tag: "bytes,1053,rep,name=resource_definition", + Filename: "google/api/resource.proto", +} + +var E_Resource = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*ResourceDescriptor)(nil), + Field: 1053, + Name: "google.api.resource", + Tag: "bytes,1053,opt,name=resource", + Filename: "google/api/resource.proto", +} + +func init() { + proto.RegisterEnum("google.api.ResourceDescriptor_History", ResourceDescriptor_History_name, ResourceDescriptor_History_value) + proto.RegisterType((*ResourceDescriptor)(nil), "google.api.ResourceDescriptor") + proto.RegisterType((*ResourceReference)(nil), "google.api.ResourceReference") + proto.RegisterExtension(E_ResourceReference) + proto.RegisterExtension(E_ResourceDefinition) + proto.RegisterExtension(E_Resource) +} + +func init() { + proto.RegisterFile("google/api/resource.proto", fileDescriptor_465e9122405d1bb5) +} + +var fileDescriptor_465e9122405d1bb5 = []byte{ + // 490 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xcd, 0x6e, 0xd3, 0x4c, + 0x14, 0xfd, 0x9c, 0xe4, 0xcb, 0xcf, 0xad, 0xa8, 0xda, 0x29, 0x02, 0xb7, 0x22, 0x60, 0x65, 0x81, + 0xb2, 0xb2, 0xa5, 0xb0, 0x0b, 0x1b, 0x52, 0xe2, 0xa4, 0x96, 0xd2, 0xc4, 0x9a, 0x38, 0x8b, 0x02, + 0x92, 0x35, 0x75, 0x26, 0xee, 0x48, 0xee, 0xcc, 0x68, 0xec, 0x2c, 0xf2, 0x30, 0x08, 0x89, 0x67, + 0xe0, 0xe1, 0x58, 0xa2, 0x8c, 0x7f, 0x88, 0x68, 0x84, 0xd8, 0xcd, 0xbd, 0xe7, 0xde, 0x73, 0x8e, + 0xcf, 0x95, 0xe1, 0x32, 0x16, 0x22, 0x4e, 0xa8, 0x43, 0x24, 0x73, 0x14, 0x4d, 0xc5, 0x56, 0x45, + 0xd4, 0x96, 0x4a, 0x64, 0x02, 0x41, 0x0e, 0xd9, 0x44, 0xb2, 0x2b, 0xab, 0x18, 0xd3, 0xc8, 0xfd, + 0x76, 0xe3, 0xac, 0x69, 0x1a, 0x29, 0x26, 0x33, 0xa1, 0xf2, 0xe9, 0xde, 0x8f, 0x1a, 0x20, 0x5c, + 0x10, 0x8c, 0x2b, 0x10, 0x21, 0x68, 0x64, 0x3b, 0x49, 0x4d, 0xc3, 0x32, 0xfa, 0x1d, 0xac, 0xdf, + 0xc8, 0x84, 0x96, 0x24, 0x59, 0x46, 0x15, 0x37, 0x6b, 0x56, 0xbd, 0xdf, 0xc1, 0x65, 0x89, 0xba, + 0x00, 0x9c, 0x3c, 0xd2, 0x70, 0xc3, 0x68, 0xb2, 0x36, 0xeb, 0x7a, 0xa7, 0xb3, 0xef, 0x4c, 0xf6, + 0x0d, 0xf4, 0x01, 0x5a, 0x0f, 0x2c, 0xcd, 0x84, 0xda, 0x99, 0x0d, 0xcb, 0xe8, 0x9f, 0x0e, 0xde, + 0xda, 0xbf, 0x3d, 0xda, 0x4f, 0xd5, 0xed, 0x9b, 0x7c, 0x1a, 0x97, 0x6b, 0xe8, 0x05, 0x34, 0x65, + 0xb2, 0x55, 0x24, 0x31, 0xff, 0xd7, 0xe4, 0x45, 0x85, 0xae, 0xa0, 0x9d, 0x32, 0x1e, 0x6f, 0x13, + 0xa2, 0xcc, 0xa6, 0x46, 0xaa, 0xba, 0xf7, 0x19, 0x5a, 0x05, 0x0f, 0x7a, 0x09, 0x17, 0x37, 0xde, + 0x32, 0x58, 0xe0, 0xbb, 0x70, 0x35, 0x5f, 0xfa, 0xee, 0x47, 0x6f, 0xe2, 0xb9, 0xe3, 0xb3, 0xff, + 0x50, 0x17, 0x2e, 0x17, 0xd8, 0x9b, 0x7a, 0xf3, 0xd1, 0x6c, 0x76, 0x17, 0x2e, 0xbd, 0xf9, 0x74, + 0xe6, 0x86, 0xfe, 0x28, 0x08, 0x5c, 0x3c, 0x3f, 0x33, 0x90, 0x09, 0xcf, 0x27, 0xab, 0x60, 0x85, + 0xdd, 0xf0, 0x76, 0x35, 0x0b, 0xbc, 0x0a, 0xa9, 0xf5, 0x26, 0x70, 0x5e, 0xfa, 0xc6, 0x74, 0x43, + 0x15, 0xe5, 0x11, 0x3d, 0x1a, 0x5a, 0x17, 0x20, 0x7a, 0x60, 0xc9, 0x3a, 0xd4, 0x48, 0x2d, 0x8f, + 0x46, 0x77, 0x82, 0x9d, 0xa4, 0xc3, 0x04, 0x50, 0x79, 0xbe, 0x50, 0x55, 0x44, 0xdd, 0x32, 0x9f, + 0xf2, 0x6e, 0xb6, 0x0e, 0x72, 0x21, 0x33, 0x26, 0x78, 0x6a, 0x7e, 0x6b, 0x5b, 0x46, 0xff, 0x64, + 0xd0, 0x3d, 0x96, 0x62, 0xe5, 0x06, 0x9f, 0xab, 0x3f, 0x5b, 0x43, 0x0e, 0x17, 0x95, 0xda, 0x9a, + 0x6e, 0x18, 0x67, 0x7b, 0x42, 0xf4, 0xea, 0x88, 0x5c, 0x42, 0x4b, 0xb5, 0xaf, 0x6d, 0xab, 0xde, + 0x3f, 0x19, 0xbc, 0xfe, 0xfb, 0xcd, 0x70, 0xf5, 0x1d, 0xe3, 0x8a, 0x78, 0xf8, 0x05, 0xda, 0x65, + 0x17, 0xbd, 0x79, 0x22, 0x72, 0x4b, 0xd3, 0x94, 0xc4, 0x87, 0x3a, 0xc6, 0x3f, 0xe8, 0x54, 0x8c, + 0xd7, 0x1c, 0x4e, 0x23, 0xf1, 0x78, 0x30, 0x7e, 0xfd, 0xac, 0x9c, 0xf7, 0xf7, 0x1a, 0xbe, 0xf1, + 0x69, 0x54, 0x80, 0xb1, 0x48, 0x08, 0x8f, 0x6d, 0xa1, 0x62, 0x27, 0xa6, 0x5c, 0x3b, 0x70, 0x72, + 0x88, 0x48, 0x96, 0xea, 0xbf, 0x88, 0x70, 0x2e, 0x32, 0xa2, 0xad, 0xbc, 0x3f, 0x78, 0xff, 0x34, + 0x8c, 0xef, 0xb5, 0xc6, 0x74, 0xe4, 0x7b, 0xf7, 0x4d, 0xbd, 0xf7, 0xee, 0x57, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x75, 0x12, 0x53, 0xef, 0x7c, 0x03, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go b/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go new file mode 100644 index 00000000..c988461b --- /dev/null +++ b/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go @@ -0,0 +1,117 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/rpc/status.proto + +package status + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" + any "github.com/golang/protobuf/ptypes/any" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// The `Status` type defines a logical error model that is suitable for +// different programming environments, including REST APIs and RPC APIs. It is +// used by [gRPC](https://github.com/grpc). Each `Status` message contains +// three pieces of data: error code, error message, and error details. +// +// You can find out more about this error model and how to work with it in the +// [API Design Guide](https://cloud.google.com/apis/design/errors). +type Status struct { + // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. + Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + // A developer-facing error message, which should be in English. Any + // user-facing error message should be localized and sent in the + // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + // A list of messages that carry the error details. There is a common set of + // message types for APIs to use. + Details []*any.Any `protobuf:"bytes,3,rep,name=details,proto3" json:"details,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Status) Reset() { *m = Status{} } +func (m *Status) String() string { return proto.CompactTextString(m) } +func (*Status) ProtoMessage() {} +func (*Status) Descriptor() ([]byte, []int) { + return fileDescriptor_24d244abaf643bfe, []int{0} +} + +func (m *Status) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Status.Unmarshal(m, b) +} +func (m *Status) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Status.Marshal(b, m, deterministic) +} +func (m *Status) XXX_Merge(src proto.Message) { + xxx_messageInfo_Status.Merge(m, src) +} +func (m *Status) XXX_Size() int { + return xxx_messageInfo_Status.Size(m) +} +func (m *Status) XXX_DiscardUnknown() { + xxx_messageInfo_Status.DiscardUnknown(m) +} + +var xxx_messageInfo_Status proto.InternalMessageInfo + +func (m *Status) GetCode() int32 { + if m != nil { + return m.Code + } + return 0 +} + +func (m *Status) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + +func (m *Status) GetDetails() []*any.Any { + if m != nil { + return m.Details + } + return nil +} + +func init() { + proto.RegisterType((*Status)(nil), "google.rpc.Status") +} + +func init() { + proto.RegisterFile("google/rpc/status.proto", fileDescriptor_24d244abaf643bfe) +} + +var fileDescriptor_24d244abaf643bfe = []byte{ + // 212 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4f, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x2a, 0x48, 0xd6, 0x2f, 0x2e, 0x49, 0x2c, 0x29, 0x2d, 0xd6, 0x2b, 0x28, + 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x82, 0x48, 0xe8, 0x15, 0x15, 0x24, 0x4b, 0x49, 0x42, 0x15, 0x81, + 0x65, 0x92, 0x4a, 0xd3, 0xf4, 0x13, 0xf3, 0x2a, 0x21, 0xca, 0x94, 0xd2, 0xb8, 0xd8, 0x82, 0xc1, + 0xda, 0x84, 0x84, 0xb8, 0x58, 0x92, 0xf3, 0x53, 0x52, 0x25, 0x18, 0x15, 0x18, 0x35, 0x58, 0x83, + 0xc0, 0x6c, 0x21, 0x09, 0x2e, 0xf6, 0xdc, 0xd4, 0xe2, 0xe2, 0xc4, 0xf4, 0x54, 0x09, 0x26, 0x05, + 0x46, 0x0d, 0xce, 0x20, 0x18, 0x57, 0x48, 0x8f, 0x8b, 0x3d, 0x25, 0xb5, 0x24, 0x31, 0x33, 0xa7, + 0x58, 0x82, 0x59, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x44, 0x0f, 0x6a, 0x21, 0xcc, 0x12, 0x3d, 0xc7, + 0xbc, 0xca, 0x20, 0x98, 0x22, 0xa7, 0x44, 0x2e, 0xbe, 0xe4, 0xfc, 0x5c, 0x3d, 0x84, 0xa3, 0x9c, + 0xb8, 0x21, 0xf6, 0x06, 0x80, 0x94, 0x07, 0x30, 0x46, 0x99, 0x43, 0xa5, 0xd2, 0xf3, 0x73, 0x12, + 0xf3, 0xd2, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0xd3, 0x53, 0xf3, 0xc0, 0x86, 0xe9, 0x43, 0xa4, 0x12, + 0x0b, 0x32, 0x8b, 0x91, 0xfc, 0x69, 0x0d, 0xa1, 0x7e, 0x30, 0x32, 0x2e, 0x62, 0x62, 0x0e, 0x0a, + 0x70, 0x4e, 0x62, 0x03, 0x2b, 0x36, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x28, 0x45, 0xb1, + 0x13, 0x01, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/genproto/protobuf/api/api.pb.go b/vendor/google.golang.org/genproto/protobuf/api/api.pb.go new file mode 100644 index 00000000..60cdf351 --- /dev/null +++ b/vendor/google.golang.org/genproto/protobuf/api/api.pb.go @@ -0,0 +1,413 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/api.proto + +package api + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" + ptype "google.golang.org/genproto/protobuf/ptype" + source_context "google.golang.org/genproto/protobuf/source_context" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// Api is a light-weight descriptor for an API Interface. +// +// Interfaces are also described as "protocol buffer services" in some contexts, +// such as by the "service" keyword in a .proto file, but they are different +// from API Services, which represent a concrete implementation of an interface +// as opposed to simply a description of methods and bindings. They are also +// sometimes simply referred to as "APIs" in other contexts, such as the name of +// this message itself. See https://cloud.google.com/apis/design/glossary for +// detailed terminology. +type Api struct { + // The fully qualified name of this interface, including package name + // followed by the interface's simple name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The methods of this interface, in unspecified order. + Methods []*Method `protobuf:"bytes,2,rep,name=methods,proto3" json:"methods,omitempty"` + // Any metadata attached to the interface. + Options []*ptype.Option `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` + // A version string for this interface. If specified, must have the form + // `major-version.minor-version`, as in `1.10`. If the minor version is + // omitted, it defaults to zero. If the entire version field is empty, the + // major version is derived from the package name, as outlined below. If the + // field is not empty, the version in the package name will be verified to be + // consistent with what is provided here. + // + // The versioning schema uses [semantic + // versioning](http://semver.org) where the major version number + // indicates a breaking change and the minor version an additive, + // non-breaking change. Both version numbers are signals to users + // what to expect from different versions, and should be carefully + // chosen based on the product plan. + // + // The major version is also reflected in the package name of the + // interface, which must end in `v`, as in + // `google.feature.v1`. For major versions 0 and 1, the suffix can + // be omitted. Zero major versions must only be used for + // experimental, non-GA interfaces. + // + // + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` + // Source context for the protocol buffer service represented by this + // message. + SourceContext *source_context.SourceContext `protobuf:"bytes,5,opt,name=source_context,json=sourceContext,proto3" json:"source_context,omitempty"` + // Included interfaces. See [Mixin][]. + Mixins []*Mixin `protobuf:"bytes,6,rep,name=mixins,proto3" json:"mixins,omitempty"` + // The source syntax of the service. + Syntax ptype.Syntax `protobuf:"varint,7,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Api) Reset() { *m = Api{} } +func (m *Api) String() string { return proto.CompactTextString(m) } +func (*Api) ProtoMessage() {} +func (*Api) Descriptor() ([]byte, []int) { + return fileDescriptor_a2ec32096296c143, []int{0} +} + +func (m *Api) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Api.Unmarshal(m, b) +} +func (m *Api) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Api.Marshal(b, m, deterministic) +} +func (m *Api) XXX_Merge(src proto.Message) { + xxx_messageInfo_Api.Merge(m, src) +} +func (m *Api) XXX_Size() int { + return xxx_messageInfo_Api.Size(m) +} +func (m *Api) XXX_DiscardUnknown() { + xxx_messageInfo_Api.DiscardUnknown(m) +} + +var xxx_messageInfo_Api proto.InternalMessageInfo + +func (m *Api) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Api) GetMethods() []*Method { + if m != nil { + return m.Methods + } + return nil +} + +func (m *Api) GetOptions() []*ptype.Option { + if m != nil { + return m.Options + } + return nil +} + +func (m *Api) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + +func (m *Api) GetSourceContext() *source_context.SourceContext { + if m != nil { + return m.SourceContext + } + return nil +} + +func (m *Api) GetMixins() []*Mixin { + if m != nil { + return m.Mixins + } + return nil +} + +func (m *Api) GetSyntax() ptype.Syntax { + if m != nil { + return m.Syntax + } + return ptype.Syntax_SYNTAX_PROTO2 +} + +// Method represents a method of an API interface. +type Method struct { + // The simple name of this method. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A URL of the input message type. + RequestTypeUrl string `protobuf:"bytes,2,opt,name=request_type_url,json=requestTypeUrl,proto3" json:"request_type_url,omitempty"` + // If true, the request is streamed. + RequestStreaming bool `protobuf:"varint,3,opt,name=request_streaming,json=requestStreaming,proto3" json:"request_streaming,omitempty"` + // The URL of the output message type. + ResponseTypeUrl string `protobuf:"bytes,4,opt,name=response_type_url,json=responseTypeUrl,proto3" json:"response_type_url,omitempty"` + // If true, the response is streamed. + ResponseStreaming bool `protobuf:"varint,5,opt,name=response_streaming,json=responseStreaming,proto3" json:"response_streaming,omitempty"` + // Any metadata attached to the method. + Options []*ptype.Option `protobuf:"bytes,6,rep,name=options,proto3" json:"options,omitempty"` + // The source syntax of this method. + Syntax ptype.Syntax `protobuf:"varint,7,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Method) Reset() { *m = Method{} } +func (m *Method) String() string { return proto.CompactTextString(m) } +func (*Method) ProtoMessage() {} +func (*Method) Descriptor() ([]byte, []int) { + return fileDescriptor_a2ec32096296c143, []int{1} +} + +func (m *Method) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Method.Unmarshal(m, b) +} +func (m *Method) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Method.Marshal(b, m, deterministic) +} +func (m *Method) XXX_Merge(src proto.Message) { + xxx_messageInfo_Method.Merge(m, src) +} +func (m *Method) XXX_Size() int { + return xxx_messageInfo_Method.Size(m) +} +func (m *Method) XXX_DiscardUnknown() { + xxx_messageInfo_Method.DiscardUnknown(m) +} + +var xxx_messageInfo_Method proto.InternalMessageInfo + +func (m *Method) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Method) GetRequestTypeUrl() string { + if m != nil { + return m.RequestTypeUrl + } + return "" +} + +func (m *Method) GetRequestStreaming() bool { + if m != nil { + return m.RequestStreaming + } + return false +} + +func (m *Method) GetResponseTypeUrl() string { + if m != nil { + return m.ResponseTypeUrl + } + return "" +} + +func (m *Method) GetResponseStreaming() bool { + if m != nil { + return m.ResponseStreaming + } + return false +} + +func (m *Method) GetOptions() []*ptype.Option { + if m != nil { + return m.Options + } + return nil +} + +func (m *Method) GetSyntax() ptype.Syntax { + if m != nil { + return m.Syntax + } + return ptype.Syntax_SYNTAX_PROTO2 +} + +// Declares an API Interface to be included in this interface. The including +// interface must redeclare all the methods from the included interface, but +// documentation and options are inherited as follows: +// +// - If after comment and whitespace stripping, the documentation +// string of the redeclared method is empty, it will be inherited +// from the original method. +// +// - Each annotation belonging to the service config (http, +// visibility) which is not set in the redeclared method will be +// inherited. +// +// - If an http annotation is inherited, the path pattern will be +// modified as follows. Any version prefix will be replaced by the +// version of the including interface plus the [root][] path if +// specified. +// +// Example of a simple mixin: +// +// package google.acl.v1; +// service AccessControl { +// // Get the underlying ACL object. +// rpc GetAcl(GetAclRequest) returns (Acl) { +// option (google.api.http).get = "/v1/{resource=**}:getAcl"; +// } +// } +// +// package google.storage.v2; +// service Storage { +// rpc GetAcl(GetAclRequest) returns (Acl); +// +// // Get a data record. +// rpc GetData(GetDataRequest) returns (Data) { +// option (google.api.http).get = "/v2/{resource=**}"; +// } +// } +// +// Example of a mixin configuration: +// +// apis: +// - name: google.storage.v2.Storage +// mixins: +// - name: google.acl.v1.AccessControl +// +// The mixin construct implies that all methods in `AccessControl` are +// also declared with same name and request/response types in +// `Storage`. A documentation generator or annotation processor will +// see the effective `Storage.GetAcl` method after inherting +// documentation and annotations as follows: +// +// service Storage { +// // Get the underlying ACL object. +// rpc GetAcl(GetAclRequest) returns (Acl) { +// option (google.api.http).get = "/v2/{resource=**}:getAcl"; +// } +// ... +// } +// +// Note how the version in the path pattern changed from `v1` to `v2`. +// +// If the `root` field in the mixin is specified, it should be a +// relative path under which inherited HTTP paths are placed. Example: +// +// apis: +// - name: google.storage.v2.Storage +// mixins: +// - name: google.acl.v1.AccessControl +// root: acls +// +// This implies the following inherited HTTP annotation: +// +// service Storage { +// // Get the underlying ACL object. +// rpc GetAcl(GetAclRequest) returns (Acl) { +// option (google.api.http).get = "/v2/acls/{resource=**}:getAcl"; +// } +// ... +// } +type Mixin struct { + // The fully qualified name of the interface which is included. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // If non-empty specifies a path under which inherited HTTP paths + // are rooted. + Root string `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Mixin) Reset() { *m = Mixin{} } +func (m *Mixin) String() string { return proto.CompactTextString(m) } +func (*Mixin) ProtoMessage() {} +func (*Mixin) Descriptor() ([]byte, []int) { + return fileDescriptor_a2ec32096296c143, []int{2} +} + +func (m *Mixin) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Mixin.Unmarshal(m, b) +} +func (m *Mixin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Mixin.Marshal(b, m, deterministic) +} +func (m *Mixin) XXX_Merge(src proto.Message) { + xxx_messageInfo_Mixin.Merge(m, src) +} +func (m *Mixin) XXX_Size() int { + return xxx_messageInfo_Mixin.Size(m) +} +func (m *Mixin) XXX_DiscardUnknown() { + xxx_messageInfo_Mixin.DiscardUnknown(m) +} + +var xxx_messageInfo_Mixin proto.InternalMessageInfo + +func (m *Mixin) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Mixin) GetRoot() string { + if m != nil { + return m.Root + } + return "" +} + +func init() { + proto.RegisterType((*Api)(nil), "google.protobuf.Api") + proto.RegisterType((*Method)(nil), "google.protobuf.Method") + proto.RegisterType((*Mixin)(nil), "google.protobuf.Mixin") +} + +func init() { + proto.RegisterFile("google/protobuf/api.proto", fileDescriptor_a2ec32096296c143) +} + +var fileDescriptor_a2ec32096296c143 = []byte{ + // 432 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0xcf, 0x8e, 0xd3, 0x30, + 0x10, 0xc6, 0x95, 0xa4, 0x4d, 0x17, 0xaf, 0xe8, 0x82, 0x91, 0xc0, 0xf4, 0xb0, 0x8a, 0x56, 0x1c, + 0x22, 0x2a, 0x12, 0x51, 0x8e, 0x9c, 0x5a, 0x84, 0x7a, 0x40, 0x88, 0x28, 0x05, 0x21, 0x71, 0xa9, + 0xd2, 0x62, 0x82, 0xa5, 0xc4, 0x63, 0x6c, 0x07, 0xda, 0xd7, 0xe1, 0xc8, 0x91, 0x37, 0xe0, 0xcd, + 0x50, 0x9c, 0xb8, 0x7f, 0xd2, 0x22, 0xb1, 0x37, 0x8f, 0xbf, 0xdf, 0x7c, 0x99, 0xf9, 0xac, 0xa0, + 0xc7, 0x39, 0x40, 0x5e, 0xd0, 0x58, 0x48, 0xd0, 0xb0, 0xaa, 0xbe, 0xc4, 0x99, 0x60, 0x91, 0x29, + 0xf0, 0x55, 0x23, 0x45, 0x56, 0x1a, 0x3d, 0xe9, 0xb2, 0x0a, 0x2a, 0xb9, 0xa6, 0xcb, 0x35, 0x70, + 0x4d, 0x37, 0xba, 0x01, 0x47, 0xa3, 0x2e, 0xa5, 0xb7, 0xa2, 0x35, 0xb9, 0xf9, 0xe3, 0x22, 0x6f, + 0x2a, 0x18, 0xc6, 0xa8, 0xc7, 0xb3, 0x92, 0x12, 0x27, 0x70, 0xc2, 0x3b, 0xa9, 0x39, 0xe3, 0xe7, + 0x68, 0x50, 0x52, 0xfd, 0x15, 0x3e, 0x2b, 0xe2, 0x06, 0x5e, 0x78, 0x39, 0x79, 0x14, 0x75, 0x06, + 0x88, 0xde, 0x1a, 0x3d, 0xb5, 0x5c, 0xdd, 0x02, 0x42, 0x33, 0xe0, 0x8a, 0x78, 0xff, 0x68, 0x79, + 0x67, 0xf4, 0xd4, 0x72, 0x98, 0xa0, 0xc1, 0x77, 0x2a, 0x15, 0x03, 0x4e, 0x7a, 0xe6, 0xe3, 0xb6, + 0xc4, 0xaf, 0xd1, 0xf0, 0x78, 0x1f, 0xd2, 0x0f, 0x9c, 0xf0, 0x72, 0x72, 0x7d, 0xe2, 0xb9, 0x30, + 0xd8, 0xab, 0x86, 0x4a, 0xef, 0xaa, 0xc3, 0x12, 0x47, 0xc8, 0x2f, 0xd9, 0x86, 0x71, 0x45, 0x7c, + 0x33, 0xd2, 0xc3, 0xd3, 0x2d, 0x6a, 0x39, 0x6d, 0x29, 0x1c, 0x23, 0x5f, 0x6d, 0xb9, 0xce, 0x36, + 0x64, 0x10, 0x38, 0xe1, 0xf0, 0xcc, 0x0a, 0x0b, 0x23, 0xa7, 0x2d, 0x76, 0xf3, 0xdb, 0x45, 0x7e, + 0x13, 0xc4, 0xd9, 0x18, 0x43, 0x74, 0x4f, 0xd2, 0x6f, 0x15, 0x55, 0x7a, 0x59, 0x07, 0xbf, 0xac, + 0x64, 0x41, 0x5c, 0xa3, 0x0f, 0xdb, 0xfb, 0xf7, 0x5b, 0x41, 0x3f, 0xc8, 0x02, 0x8f, 0xd1, 0x7d, + 0x4b, 0x2a, 0x2d, 0x69, 0x56, 0x32, 0x9e, 0x13, 0x2f, 0x70, 0xc2, 0x8b, 0xd4, 0x5a, 0x2c, 0xec, + 0x3d, 0x7e, 0x5a, 0xc3, 0x4a, 0x00, 0x57, 0x74, 0xef, 0xdb, 0x24, 0x78, 0x65, 0x05, 0x6b, 0xfc, + 0x0c, 0xe1, 0x1d, 0xbb, 0x77, 0xee, 0x1b, 0xe7, 0x9d, 0xcb, 0xde, 0xfa, 0xe0, 0x15, 0xfd, 0xff, + 0x7c, 0xc5, 0x5b, 0x87, 0x16, 0xa3, 0xbe, 0x89, 0xfd, 0x6c, 0x64, 0x18, 0xf5, 0x24, 0x80, 0x6e, + 0x63, 0x32, 0xe7, 0x59, 0x85, 0x1e, 0xac, 0xa1, 0xec, 0xda, 0xce, 0x2e, 0xa6, 0x82, 0x25, 0x75, + 0x91, 0x38, 0x9f, 0xc6, 0xad, 0x98, 0x43, 0x91, 0xf1, 0x3c, 0x02, 0x99, 0xc7, 0x39, 0xe5, 0x06, + 0x3d, 0xfa, 0x9d, 0x5e, 0x66, 0x82, 0xfd, 0x74, 0xbd, 0x79, 0x32, 0xfb, 0xe5, 0x5e, 0xcf, 0x9b, + 0x9e, 0xc4, 0xce, 0xf9, 0x91, 0x16, 0xc5, 0x1b, 0x0e, 0x3f, 0x78, 0x1d, 0x9e, 0x5a, 0xf9, 0xa6, + 0xf1, 0xc5, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x07, 0x73, 0x11, 0x97, 0x03, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/genproto/protobuf/field_mask/field_mask.pb.go b/vendor/google.golang.org/genproto/protobuf/field_mask/field_mask.pb.go new file mode 100644 index 00000000..44fb5e63 --- /dev/null +++ b/vendor/google.golang.org/genproto/protobuf/field_mask/field_mask.pb.go @@ -0,0 +1,284 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/field_mask.proto + +package field_mask + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// `FieldMask` represents a set of symbolic field paths, for example: +// +// paths: "f.a" +// paths: "f.b.d" +// +// Here `f` represents a field in some root message, `a` and `b` +// fields in the message found in `f`, and `d` a field found in the +// message in `f.b`. +// +// Field masks are used to specify a subset of fields that should be +// returned by a get operation or modified by an update operation. +// Field masks also have a custom JSON encoding (see below). +// +// # Field Masks in Projections +// +// When used in the context of a projection, a response message or +// sub-message is filtered by the API to only contain those fields as +// specified in the mask. For example, if the mask in the previous +// example is applied to a response message as follows: +// +// f { +// a : 22 +// b { +// d : 1 +// x : 2 +// } +// y : 13 +// } +// z: 8 +// +// The result will not contain specific values for fields x,y and z +// (their value will be set to the default, and omitted in proto text +// output): +// +// +// f { +// a : 22 +// b { +// d : 1 +// } +// } +// +// A repeated field is not allowed except at the last position of a +// paths string. +// +// If a FieldMask object is not present in a get operation, the +// operation applies to all fields (as if a FieldMask of all fields +// had been specified). +// +// Note that a field mask does not necessarily apply to the +// top-level response message. In case of a REST get operation, the +// field mask applies directly to the response, but in case of a REST +// list operation, the mask instead applies to each individual message +// in the returned resource list. In case of a REST custom method, +// other definitions may be used. Where the mask applies will be +// clearly documented together with its declaration in the API. In +// any case, the effect on the returned resource/resources is required +// behavior for APIs. +// +// # Field Masks in Update Operations +// +// A field mask in update operations specifies which fields of the +// targeted resource are going to be updated. The API is required +// to only change the values of the fields as specified in the mask +// and leave the others untouched. If a resource is passed in to +// describe the updated values, the API ignores the values of all +// fields not covered by the mask. +// +// If a repeated field is specified for an update operation, new values will +// be appended to the existing repeated field in the target resource. Note that +// a repeated field is only allowed in the last position of a `paths` string. +// +// If a sub-message is specified in the last position of the field mask for an +// update operation, then new value will be merged into the existing sub-message +// in the target resource. +// +// For example, given the target message: +// +// f { +// b { +// d: 1 +// x: 2 +// } +// c: [1] +// } +// +// And an update message: +// +// f { +// b { +// d: 10 +// } +// c: [2] +// } +// +// then if the field mask is: +// +// paths: ["f.b", "f.c"] +// +// then the result will be: +// +// f { +// b { +// d: 10 +// x: 2 +// } +// c: [1, 2] +// } +// +// An implementation may provide options to override this default behavior for +// repeated and message fields. +// +// In order to reset a field's value to the default, the field must +// be in the mask and set to the default value in the provided resource. +// Hence, in order to reset all fields of a resource, provide a default +// instance of the resource and set all fields in the mask, or do +// not provide a mask as described below. +// +// If a field mask is not present on update, the operation applies to +// all fields (as if a field mask of all fields has been specified). +// Note that in the presence of schema evolution, this may mean that +// fields the client does not know and has therefore not filled into +// the request will be reset to their default. If this is unwanted +// behavior, a specific service may require a client to always specify +// a field mask, producing an error if not. +// +// As with get operations, the location of the resource which +// describes the updated values in the request message depends on the +// operation kind. In any case, the effect of the field mask is +// required to be honored by the API. +// +// ## Considerations for HTTP REST +// +// The HTTP kind of an update operation which uses a field mask must +// be set to PATCH instead of PUT in order to satisfy HTTP semantics +// (PUT must only be used for full updates). +// +// # JSON Encoding of Field Masks +// +// In JSON, a field mask is encoded as a single string where paths are +// separated by a comma. Fields name in each path are converted +// to/from lower-camel naming conventions. +// +// As an example, consider the following message declarations: +// +// message Profile { +// User user = 1; +// Photo photo = 2; +// } +// message User { +// string display_name = 1; +// string address = 2; +// } +// +// In proto a field mask for `Profile` may look as such: +// +// mask { +// paths: "user.display_name" +// paths: "photo" +// } +// +// In JSON, the same mask is represented as below: +// +// { +// mask: "user.displayName,photo" +// } +// +// # Field Masks and Oneof Fields +// +// Field masks treat fields in oneofs just as regular fields. Consider the +// following message: +// +// message SampleMessage { +// oneof test_oneof { +// string name = 4; +// SubMessage sub_message = 9; +// } +// } +// +// The field mask can be: +// +// mask { +// paths: "name" +// } +// +// Or: +// +// mask { +// paths: "sub_message" +// } +// +// Note that oneof type names ("test_oneof" in this case) cannot be used in +// paths. +// +// ## Field Mask Verification +// +// The implementation of any API method which has a FieldMask type field in the +// request should verify the included field paths, and return an +// `INVALID_ARGUMENT` error if any path is unmappable. +type FieldMask struct { + // The set of field mask paths. + Paths []string `protobuf:"bytes,1,rep,name=paths,proto3" json:"paths,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldMask) Reset() { *m = FieldMask{} } +func (m *FieldMask) String() string { return proto.CompactTextString(m) } +func (*FieldMask) ProtoMessage() {} +func (*FieldMask) Descriptor() ([]byte, []int) { + return fileDescriptor_5158202634f0da48, []int{0} +} + +func (m *FieldMask) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldMask.Unmarshal(m, b) +} +func (m *FieldMask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldMask.Marshal(b, m, deterministic) +} +func (m *FieldMask) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldMask.Merge(m, src) +} +func (m *FieldMask) XXX_Size() int { + return xxx_messageInfo_FieldMask.Size(m) +} +func (m *FieldMask) XXX_DiscardUnknown() { + xxx_messageInfo_FieldMask.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldMask proto.InternalMessageInfo + +func (m *FieldMask) GetPaths() []string { + if m != nil { + return m.Paths + } + return nil +} + +func init() { + proto.RegisterType((*FieldMask)(nil), "google.protobuf.FieldMask") +} + +func init() { + proto.RegisterFile("google/protobuf/field_mask.proto", fileDescriptor_5158202634f0da48) +} + +var fileDescriptor_5158202634f0da48 = []byte{ + // 175 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcb, 0x4c, 0xcd, + 0x49, 0x89, 0xcf, 0x4d, 0x2c, 0xce, 0xd6, 0x03, 0x8b, 0x09, 0xf1, 0x43, 0x54, 0xe8, 0xc1, 0x54, + 0x28, 0x29, 0x72, 0x71, 0xba, 0x81, 0x14, 0xf9, 0x26, 0x16, 0x67, 0x0b, 0x89, 0x70, 0xb1, 0x16, + 0x24, 0x96, 0x64, 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6b, 0x70, 0x06, 0x41, 0x38, 0x4e, 0x3d, 0x8c, + 0x5c, 0xc2, 0xc9, 0xf9, 0xb9, 0x7a, 0x68, 0x5a, 0x9d, 0xf8, 0xe0, 0x1a, 0x03, 0x40, 0x42, 0x01, + 0x8c, 0x51, 0x96, 0x50, 0x25, 0xe9, 0xf9, 0x39, 0x89, 0x79, 0xe9, 0x7a, 0xf9, 0x45, 0xe9, 0xfa, + 0xe9, 0xa9, 0x79, 0x60, 0x0d, 0xd8, 0xdc, 0x64, 0x8d, 0x60, 0xfe, 0x60, 0x64, 0x5c, 0xc4, 0xc4, + 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x48, 0x00, 0x54, 0x83, 0x5e, 0x78, 0x6a, + 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x48, 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x24, + 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xda, 0xb7, 0xa8, 0xed, 0x00, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/genproto/protobuf/ptype/type.pb.go b/vendor/google.golang.org/genproto/protobuf/ptype/type.pb.go new file mode 100644 index 00000000..e9bd8a13 --- /dev/null +++ b/vendor/google.golang.org/genproto/protobuf/ptype/type.pb.go @@ -0,0 +1,657 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/type.proto + +package ptype + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" + any "github.com/golang/protobuf/ptypes/any" + source_context "google.golang.org/genproto/protobuf/source_context" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// The syntax in which a protocol buffer element is defined. +type Syntax int32 + +const ( + // Syntax `proto2`. + Syntax_SYNTAX_PROTO2 Syntax = 0 + // Syntax `proto3`. + Syntax_SYNTAX_PROTO3 Syntax = 1 +) + +var Syntax_name = map[int32]string{ + 0: "SYNTAX_PROTO2", + 1: "SYNTAX_PROTO3", +} + +var Syntax_value = map[string]int32{ + "SYNTAX_PROTO2": 0, + "SYNTAX_PROTO3": 1, +} + +func (x Syntax) String() string { + return proto.EnumName(Syntax_name, int32(x)) +} + +func (Syntax) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{0} +} + +// Basic field types. +type Field_Kind int32 + +const ( + // Field type unknown. + Field_TYPE_UNKNOWN Field_Kind = 0 + // Field type double. + Field_TYPE_DOUBLE Field_Kind = 1 + // Field type float. + Field_TYPE_FLOAT Field_Kind = 2 + // Field type int64. + Field_TYPE_INT64 Field_Kind = 3 + // Field type uint64. + Field_TYPE_UINT64 Field_Kind = 4 + // Field type int32. + Field_TYPE_INT32 Field_Kind = 5 + // Field type fixed64. + Field_TYPE_FIXED64 Field_Kind = 6 + // Field type fixed32. + Field_TYPE_FIXED32 Field_Kind = 7 + // Field type bool. + Field_TYPE_BOOL Field_Kind = 8 + // Field type string. + Field_TYPE_STRING Field_Kind = 9 + // Field type group. Proto2 syntax only, and deprecated. + Field_TYPE_GROUP Field_Kind = 10 + // Field type message. + Field_TYPE_MESSAGE Field_Kind = 11 + // Field type bytes. + Field_TYPE_BYTES Field_Kind = 12 + // Field type uint32. + Field_TYPE_UINT32 Field_Kind = 13 + // Field type enum. + Field_TYPE_ENUM Field_Kind = 14 + // Field type sfixed32. + Field_TYPE_SFIXED32 Field_Kind = 15 + // Field type sfixed64. + Field_TYPE_SFIXED64 Field_Kind = 16 + // Field type sint32. + Field_TYPE_SINT32 Field_Kind = 17 + // Field type sint64. + Field_TYPE_SINT64 Field_Kind = 18 +) + +var Field_Kind_name = map[int32]string{ + 0: "TYPE_UNKNOWN", + 1: "TYPE_DOUBLE", + 2: "TYPE_FLOAT", + 3: "TYPE_INT64", + 4: "TYPE_UINT64", + 5: "TYPE_INT32", + 6: "TYPE_FIXED64", + 7: "TYPE_FIXED32", + 8: "TYPE_BOOL", + 9: "TYPE_STRING", + 10: "TYPE_GROUP", + 11: "TYPE_MESSAGE", + 12: "TYPE_BYTES", + 13: "TYPE_UINT32", + 14: "TYPE_ENUM", + 15: "TYPE_SFIXED32", + 16: "TYPE_SFIXED64", + 17: "TYPE_SINT32", + 18: "TYPE_SINT64", +} + +var Field_Kind_value = map[string]int32{ + "TYPE_UNKNOWN": 0, + "TYPE_DOUBLE": 1, + "TYPE_FLOAT": 2, + "TYPE_INT64": 3, + "TYPE_UINT64": 4, + "TYPE_INT32": 5, + "TYPE_FIXED64": 6, + "TYPE_FIXED32": 7, + "TYPE_BOOL": 8, + "TYPE_STRING": 9, + "TYPE_GROUP": 10, + "TYPE_MESSAGE": 11, + "TYPE_BYTES": 12, + "TYPE_UINT32": 13, + "TYPE_ENUM": 14, + "TYPE_SFIXED32": 15, + "TYPE_SFIXED64": 16, + "TYPE_SINT32": 17, + "TYPE_SINT64": 18, +} + +func (x Field_Kind) String() string { + return proto.EnumName(Field_Kind_name, int32(x)) +} + +func (Field_Kind) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{1, 0} +} + +// Whether a field is optional, required, or repeated. +type Field_Cardinality int32 + +const ( + // For fields with unknown cardinality. + Field_CARDINALITY_UNKNOWN Field_Cardinality = 0 + // For optional fields. + Field_CARDINALITY_OPTIONAL Field_Cardinality = 1 + // For required fields. Proto2 syntax only. + Field_CARDINALITY_REQUIRED Field_Cardinality = 2 + // For repeated fields. + Field_CARDINALITY_REPEATED Field_Cardinality = 3 +) + +var Field_Cardinality_name = map[int32]string{ + 0: "CARDINALITY_UNKNOWN", + 1: "CARDINALITY_OPTIONAL", + 2: "CARDINALITY_REQUIRED", + 3: "CARDINALITY_REPEATED", +} + +var Field_Cardinality_value = map[string]int32{ + "CARDINALITY_UNKNOWN": 0, + "CARDINALITY_OPTIONAL": 1, + "CARDINALITY_REQUIRED": 2, + "CARDINALITY_REPEATED": 3, +} + +func (x Field_Cardinality) String() string { + return proto.EnumName(Field_Cardinality_name, int32(x)) +} + +func (Field_Cardinality) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{1, 1} +} + +// A protocol buffer message type. +type Type struct { + // The fully qualified message name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The list of fields. + Fields []*Field `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"` + // The list of types appearing in `oneof` definitions in this type. + Oneofs []string `protobuf:"bytes,3,rep,name=oneofs,proto3" json:"oneofs,omitempty"` + // The protocol buffer options. + Options []*Option `protobuf:"bytes,4,rep,name=options,proto3" json:"options,omitempty"` + // The source context. + SourceContext *source_context.SourceContext `protobuf:"bytes,5,opt,name=source_context,json=sourceContext,proto3" json:"source_context,omitempty"` + // The source syntax. + Syntax Syntax `protobuf:"varint,6,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Type) Reset() { *m = Type{} } +func (m *Type) String() string { return proto.CompactTextString(m) } +func (*Type) ProtoMessage() {} +func (*Type) Descriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{0} +} + +func (m *Type) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Type.Unmarshal(m, b) +} +func (m *Type) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Type.Marshal(b, m, deterministic) +} +func (m *Type) XXX_Merge(src proto.Message) { + xxx_messageInfo_Type.Merge(m, src) +} +func (m *Type) XXX_Size() int { + return xxx_messageInfo_Type.Size(m) +} +func (m *Type) XXX_DiscardUnknown() { + xxx_messageInfo_Type.DiscardUnknown(m) +} + +var xxx_messageInfo_Type proto.InternalMessageInfo + +func (m *Type) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Type) GetFields() []*Field { + if m != nil { + return m.Fields + } + return nil +} + +func (m *Type) GetOneofs() []string { + if m != nil { + return m.Oneofs + } + return nil +} + +func (m *Type) GetOptions() []*Option { + if m != nil { + return m.Options + } + return nil +} + +func (m *Type) GetSourceContext() *source_context.SourceContext { + if m != nil { + return m.SourceContext + } + return nil +} + +func (m *Type) GetSyntax() Syntax { + if m != nil { + return m.Syntax + } + return Syntax_SYNTAX_PROTO2 +} + +// A single field of a message type. +type Field struct { + // The field type. + Kind Field_Kind `protobuf:"varint,1,opt,name=kind,proto3,enum=google.protobuf.Field_Kind" json:"kind,omitempty"` + // The field cardinality. + Cardinality Field_Cardinality `protobuf:"varint,2,opt,name=cardinality,proto3,enum=google.protobuf.Field_Cardinality" json:"cardinality,omitempty"` + // The field number. + Number int32 `protobuf:"varint,3,opt,name=number,proto3" json:"number,omitempty"` + // The field name. + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // The field type URL, without the scheme, for message or enumeration + // types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`. + TypeUrl string `protobuf:"bytes,6,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` + // The index of the field type in `Type.oneofs`, for message or enumeration + // types. The first type has index 1; zero means the type is not in the list. + OneofIndex int32 `protobuf:"varint,7,opt,name=oneof_index,json=oneofIndex,proto3" json:"oneof_index,omitempty"` + // Whether to use alternative packed wire representation. + Packed bool `protobuf:"varint,8,opt,name=packed,proto3" json:"packed,omitempty"` + // The protocol buffer options. + Options []*Option `protobuf:"bytes,9,rep,name=options,proto3" json:"options,omitempty"` + // The field JSON name. + JsonName string `protobuf:"bytes,10,opt,name=json_name,json=jsonName,proto3" json:"json_name,omitempty"` + // The string value of the default value of this field. Proto2 syntax only. + DefaultValue string `protobuf:"bytes,11,opt,name=default_value,json=defaultValue,proto3" json:"default_value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Field) Reset() { *m = Field{} } +func (m *Field) String() string { return proto.CompactTextString(m) } +func (*Field) ProtoMessage() {} +func (*Field) Descriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{1} +} + +func (m *Field) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Field.Unmarshal(m, b) +} +func (m *Field) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Field.Marshal(b, m, deterministic) +} +func (m *Field) XXX_Merge(src proto.Message) { + xxx_messageInfo_Field.Merge(m, src) +} +func (m *Field) XXX_Size() int { + return xxx_messageInfo_Field.Size(m) +} +func (m *Field) XXX_DiscardUnknown() { + xxx_messageInfo_Field.DiscardUnknown(m) +} + +var xxx_messageInfo_Field proto.InternalMessageInfo + +func (m *Field) GetKind() Field_Kind { + if m != nil { + return m.Kind + } + return Field_TYPE_UNKNOWN +} + +func (m *Field) GetCardinality() Field_Cardinality { + if m != nil { + return m.Cardinality + } + return Field_CARDINALITY_UNKNOWN +} + +func (m *Field) GetNumber() int32 { + if m != nil { + return m.Number + } + return 0 +} + +func (m *Field) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Field) GetTypeUrl() string { + if m != nil { + return m.TypeUrl + } + return "" +} + +func (m *Field) GetOneofIndex() int32 { + if m != nil { + return m.OneofIndex + } + return 0 +} + +func (m *Field) GetPacked() bool { + if m != nil { + return m.Packed + } + return false +} + +func (m *Field) GetOptions() []*Option { + if m != nil { + return m.Options + } + return nil +} + +func (m *Field) GetJsonName() string { + if m != nil { + return m.JsonName + } + return "" +} + +func (m *Field) GetDefaultValue() string { + if m != nil { + return m.DefaultValue + } + return "" +} + +// Enum type definition. +type Enum struct { + // Enum type name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Enum value definitions. + Enumvalue []*EnumValue `protobuf:"bytes,2,rep,name=enumvalue,proto3" json:"enumvalue,omitempty"` + // Protocol buffer options. + Options []*Option `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` + // The source context. + SourceContext *source_context.SourceContext `protobuf:"bytes,4,opt,name=source_context,json=sourceContext,proto3" json:"source_context,omitempty"` + // The source syntax. + Syntax Syntax `protobuf:"varint,5,opt,name=syntax,proto3,enum=google.protobuf.Syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Enum) Reset() { *m = Enum{} } +func (m *Enum) String() string { return proto.CompactTextString(m) } +func (*Enum) ProtoMessage() {} +func (*Enum) Descriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{2} +} + +func (m *Enum) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Enum.Unmarshal(m, b) +} +func (m *Enum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Enum.Marshal(b, m, deterministic) +} +func (m *Enum) XXX_Merge(src proto.Message) { + xxx_messageInfo_Enum.Merge(m, src) +} +func (m *Enum) XXX_Size() int { + return xxx_messageInfo_Enum.Size(m) +} +func (m *Enum) XXX_DiscardUnknown() { + xxx_messageInfo_Enum.DiscardUnknown(m) +} + +var xxx_messageInfo_Enum proto.InternalMessageInfo + +func (m *Enum) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Enum) GetEnumvalue() []*EnumValue { + if m != nil { + return m.Enumvalue + } + return nil +} + +func (m *Enum) GetOptions() []*Option { + if m != nil { + return m.Options + } + return nil +} + +func (m *Enum) GetSourceContext() *source_context.SourceContext { + if m != nil { + return m.SourceContext + } + return nil +} + +func (m *Enum) GetSyntax() Syntax { + if m != nil { + return m.Syntax + } + return Syntax_SYNTAX_PROTO2 +} + +// Enum value definition. +type EnumValue struct { + // Enum value name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Enum value number. + Number int32 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"` + // Protocol buffer options. + Options []*Option `protobuf:"bytes,3,rep,name=options,proto3" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValue) Reset() { *m = EnumValue{} } +func (m *EnumValue) String() string { return proto.CompactTextString(m) } +func (*EnumValue) ProtoMessage() {} +func (*EnumValue) Descriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{3} +} + +func (m *EnumValue) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValue.Unmarshal(m, b) +} +func (m *EnumValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValue.Marshal(b, m, deterministic) +} +func (m *EnumValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValue.Merge(m, src) +} +func (m *EnumValue) XXX_Size() int { + return xxx_messageInfo_EnumValue.Size(m) +} +func (m *EnumValue) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValue.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValue proto.InternalMessageInfo + +func (m *EnumValue) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *EnumValue) GetNumber() int32 { + if m != nil { + return m.Number + } + return 0 +} + +func (m *EnumValue) GetOptions() []*Option { + if m != nil { + return m.Options + } + return nil +} + +// A protocol buffer option, which can be attached to a message, field, +// enumeration, etc. +type Option struct { + // The option's name. For protobuf built-in options (options defined in + // descriptor.proto), this is the short name. For example, `"map_entry"`. + // For custom options, it should be the fully-qualified name. For example, + // `"google.api.http"`. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The option's value packed in an Any message. If the value is a primitive, + // the corresponding wrapper type defined in google/protobuf/wrappers.proto + // should be used. If the value is an enum, it should be stored as an int32 + // value using the google.protobuf.Int32Value type. + Value *any.Any `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Option) Reset() { *m = Option{} } +func (m *Option) String() string { return proto.CompactTextString(m) } +func (*Option) ProtoMessage() {} +func (*Option) Descriptor() ([]byte, []int) { + return fileDescriptor_dd271cc1e348c538, []int{4} +} + +func (m *Option) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Option.Unmarshal(m, b) +} +func (m *Option) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Option.Marshal(b, m, deterministic) +} +func (m *Option) XXX_Merge(src proto.Message) { + xxx_messageInfo_Option.Merge(m, src) +} +func (m *Option) XXX_Size() int { + return xxx_messageInfo_Option.Size(m) +} +func (m *Option) XXX_DiscardUnknown() { + xxx_messageInfo_Option.DiscardUnknown(m) +} + +var xxx_messageInfo_Option proto.InternalMessageInfo + +func (m *Option) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Option) GetValue() *any.Any { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterEnum("google.protobuf.Syntax", Syntax_name, Syntax_value) + proto.RegisterEnum("google.protobuf.Field_Kind", Field_Kind_name, Field_Kind_value) + proto.RegisterEnum("google.protobuf.Field_Cardinality", Field_Cardinality_name, Field_Cardinality_value) + proto.RegisterType((*Type)(nil), "google.protobuf.Type") + proto.RegisterType((*Field)(nil), "google.protobuf.Field") + proto.RegisterType((*Enum)(nil), "google.protobuf.Enum") + proto.RegisterType((*EnumValue)(nil), "google.protobuf.EnumValue") + proto.RegisterType((*Option)(nil), "google.protobuf.Option") +} + +func init() { + proto.RegisterFile("google/protobuf/type.proto", fileDescriptor_dd271cc1e348c538) +} + +var fileDescriptor_dd271cc1e348c538 = []byte{ + // 810 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcd, 0x8e, 0xda, 0x56, + 0x14, 0x8e, 0x8d, 0xf1, 0xe0, 0xc3, 0xc0, 0xdc, 0xdc, 0x44, 0x89, 0x33, 0x91, 0x52, 0x44, 0xbb, + 0x40, 0x59, 0x80, 0x0a, 0xa3, 0x51, 0xa5, 0xae, 0x60, 0xf0, 0x50, 0x6b, 0x88, 0xed, 0x5e, 0x4c, + 0x93, 0xe9, 0x06, 0x79, 0xe0, 0x0e, 0x22, 0x31, 0xd7, 0x08, 0xdb, 0xed, 0xb0, 0xe8, 0x23, 0xf4, + 0x25, 0xba, 0xec, 0xba, 0x0f, 0xd1, 0x47, 0xea, 0xae, 0xd5, 0xbd, 0x06, 0x63, 0x7e, 0x2a, 0x4d, + 0x9b, 0xcd, 0x68, 0xce, 0xf7, 0x7d, 0xe7, 0xf7, 0x1e, 0x8e, 0xe1, 0x7c, 0x1a, 0x04, 0x53, 0x9f, + 0x36, 0x16, 0xcb, 0x20, 0x0a, 0xee, 0xe2, 0xfb, 0x46, 0xb4, 0x5a, 0xd0, 0xba, 0xb0, 0xf0, 0x59, + 0xc2, 0xd5, 0x37, 0xdc, 0xf9, 0xab, 0x7d, 0xb1, 0xc7, 0x56, 0x09, 0x7b, 0xfe, 0xd5, 0x3e, 0x15, + 0x06, 0xf1, 0x72, 0x4c, 0x47, 0xe3, 0x80, 0x45, 0xf4, 0x21, 0x4a, 0x54, 0xd5, 0x5f, 0x65, 0x50, + 0xdc, 0xd5, 0x82, 0x62, 0x0c, 0x0a, 0xf3, 0xe6, 0x54, 0x97, 0x2a, 0x52, 0x4d, 0x23, 0xe2, 0x7f, + 0x5c, 0x07, 0xf5, 0x7e, 0x46, 0xfd, 0x49, 0xa8, 0xcb, 0x95, 0x5c, 0xad, 0xd8, 0x7c, 0x51, 0xdf, + 0xcb, 0x5f, 0xbf, 0xe6, 0x34, 0x59, 0xab, 0xf0, 0x0b, 0x50, 0x03, 0x46, 0x83, 0xfb, 0x50, 0xcf, + 0x55, 0x72, 0x35, 0x8d, 0xac, 0x2d, 0xfc, 0x35, 0x9c, 0x04, 0x8b, 0x68, 0x16, 0xb0, 0x50, 0x57, + 0x44, 0xa0, 0x97, 0x07, 0x81, 0x6c, 0xc1, 0x93, 0x8d, 0x0e, 0x1b, 0x50, 0xde, 0xad, 0x57, 0xcf, + 0x57, 0xa4, 0x5a, 0xb1, 0xf9, 0xe6, 0xc0, 0x73, 0x20, 0x64, 0x57, 0x89, 0x8a, 0x94, 0xc2, 0xac, + 0x89, 0x1b, 0xa0, 0x86, 0x2b, 0x16, 0x79, 0x0f, 0xba, 0x5a, 0x91, 0x6a, 0xe5, 0x23, 0x89, 0x07, + 0x82, 0x26, 0x6b, 0x59, 0xf5, 0x0f, 0x15, 0xf2, 0xa2, 0x29, 0xdc, 0x00, 0xe5, 0xd3, 0x8c, 0x4d, + 0xc4, 0x40, 0xca, 0xcd, 0xd7, 0xc7, 0x5b, 0xaf, 0xdf, 0xcc, 0xd8, 0x84, 0x08, 0x21, 0xee, 0x42, + 0x71, 0xec, 0x2d, 0x27, 0x33, 0xe6, 0xf9, 0xb3, 0x68, 0xa5, 0xcb, 0xc2, 0xaf, 0xfa, 0x2f, 0x7e, + 0x57, 0x5b, 0x25, 0xc9, 0xba, 0xf1, 0x19, 0xb2, 0x78, 0x7e, 0x47, 0x97, 0x7a, 0xae, 0x22, 0xd5, + 0xf2, 0x64, 0x6d, 0xa5, 0xef, 0xa3, 0x64, 0xde, 0xe7, 0x15, 0x14, 0xf8, 0x72, 0x8c, 0xe2, 0xa5, + 0x2f, 0xfa, 0xd3, 0xc8, 0x09, 0xb7, 0x87, 0x4b, 0x1f, 0x7f, 0x01, 0x45, 0x31, 0xfc, 0xd1, 0x8c, + 0x4d, 0xe8, 0x83, 0x7e, 0x22, 0x62, 0x81, 0x80, 0x4c, 0x8e, 0xf0, 0x3c, 0x0b, 0x6f, 0xfc, 0x89, + 0x4e, 0xf4, 0x42, 0x45, 0xaa, 0x15, 0xc8, 0xda, 0xca, 0xbe, 0x95, 0xf6, 0xc8, 0xb7, 0x7a, 0x0d, + 0xda, 0xc7, 0x30, 0x60, 0x23, 0x51, 0x1f, 0x88, 0x3a, 0x0a, 0x1c, 0xb0, 0x78, 0x8d, 0x5f, 0x42, + 0x69, 0x42, 0xef, 0xbd, 0xd8, 0x8f, 0x46, 0x3f, 0x79, 0x7e, 0x4c, 0xf5, 0xa2, 0x10, 0x9c, 0xae, + 0xc1, 0x1f, 0x38, 0x56, 0xfd, 0x53, 0x06, 0x85, 0x4f, 0x12, 0x23, 0x38, 0x75, 0x6f, 0x1d, 0x63, + 0x34, 0xb4, 0x6e, 0x2c, 0xfb, 0xbd, 0x85, 0x9e, 0xe0, 0x33, 0x28, 0x0a, 0xa4, 0x6b, 0x0f, 0x3b, + 0x7d, 0x03, 0x49, 0xb8, 0x0c, 0x20, 0x80, 0xeb, 0xbe, 0xdd, 0x76, 0x91, 0x9c, 0xda, 0xa6, 0xe5, + 0x5e, 0x5e, 0xa0, 0x5c, 0xea, 0x30, 0x4c, 0x00, 0x25, 0x2b, 0x68, 0x35, 0x51, 0x3e, 0xcd, 0x71, + 0x6d, 0x7e, 0x30, 0xba, 0x97, 0x17, 0x48, 0xdd, 0x45, 0x5a, 0x4d, 0x74, 0x82, 0x4b, 0xa0, 0x09, + 0xa4, 0x63, 0xdb, 0x7d, 0x54, 0x48, 0x63, 0x0e, 0x5c, 0x62, 0x5a, 0x3d, 0xa4, 0xa5, 0x31, 0x7b, + 0xc4, 0x1e, 0x3a, 0x08, 0xd2, 0x08, 0xef, 0x8c, 0xc1, 0xa0, 0xdd, 0x33, 0x50, 0x31, 0x55, 0x74, + 0x6e, 0x5d, 0x63, 0x80, 0x4e, 0x77, 0xca, 0x6a, 0x35, 0x51, 0x29, 0x4d, 0x61, 0x58, 0xc3, 0x77, + 0xa8, 0x8c, 0x9f, 0x42, 0x29, 0x49, 0xb1, 0x29, 0xe2, 0x6c, 0x0f, 0xba, 0xbc, 0x40, 0x68, 0x5b, + 0x48, 0x12, 0xe5, 0xe9, 0x0e, 0x70, 0x79, 0x81, 0x70, 0x35, 0x82, 0x62, 0x66, 0xb7, 0xf0, 0x4b, + 0x78, 0x76, 0xd5, 0x26, 0x5d, 0xd3, 0x6a, 0xf7, 0x4d, 0xf7, 0x36, 0x33, 0x57, 0x1d, 0x9e, 0x67, + 0x09, 0xdb, 0x71, 0x4d, 0xdb, 0x6a, 0xf7, 0x91, 0xb4, 0xcf, 0x10, 0xe3, 0xfb, 0xa1, 0x49, 0x8c, + 0x2e, 0x92, 0x0f, 0x19, 0xc7, 0x68, 0xbb, 0x46, 0x17, 0xe5, 0xaa, 0x7f, 0x4b, 0xa0, 0x18, 0x2c, + 0x9e, 0x1f, 0x3d, 0x23, 0xdf, 0x80, 0x46, 0x59, 0x3c, 0x4f, 0x9e, 0x3f, 0xb9, 0x24, 0xe7, 0x07, + 0x4b, 0xc5, 0xbd, 0xc5, 0x32, 0x90, 0xad, 0x38, 0xbb, 0x8c, 0xb9, 0xff, 0x7d, 0x38, 0x94, 0xcf, + 0x3b, 0x1c, 0xf9, 0xc7, 0x1d, 0x8e, 0x8f, 0xa0, 0xa5, 0x2d, 0x1c, 0x9d, 0xc2, 0xf6, 0x87, 0x2d, + 0xef, 0xfc, 0xb0, 0xff, 0x7b, 0x8f, 0xd5, 0xef, 0x40, 0x4d, 0xa0, 0xa3, 0x89, 0xde, 0x42, 0x7e, + 0x33, 0x6a, 0xde, 0xf8, 0xf3, 0x83, 0x70, 0x6d, 0xb6, 0x22, 0x89, 0xe4, 0x6d, 0x1d, 0xd4, 0xa4, + 0x0f, 0xbe, 0x6c, 0x83, 0x5b, 0xcb, 0x6d, 0x7f, 0x18, 0x39, 0xc4, 0x76, 0xed, 0x26, 0x7a, 0xb2, + 0x0f, 0xb5, 0x90, 0xd4, 0xf9, 0x05, 0x9e, 0x8d, 0x83, 0xf9, 0x7e, 0xc4, 0x8e, 0xc6, 0x3f, 0x21, + 0x0e, 0xb7, 0x1c, 0xe9, 0xc7, 0xc6, 0x9a, 0x9d, 0x06, 0xbe, 0xc7, 0xa6, 0xf5, 0x60, 0x39, 0x6d, + 0x4c, 0x29, 0x13, 0xda, 0xed, 0xc7, 0x68, 0xc1, 0x0f, 0xd5, 0xb7, 0xe2, 0xef, 0x5f, 0x92, 0xf4, + 0x9b, 0x9c, 0xeb, 0x39, 0x9d, 0xdf, 0xe5, 0x37, 0xbd, 0xc4, 0xd5, 0xd9, 0x94, 0xfa, 0x9e, 0xfa, + 0xfe, 0x0d, 0x0b, 0x7e, 0x66, 0x3c, 0x41, 0x78, 0xa7, 0x0a, 0xff, 0xd6, 0x3f, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x6d, 0x2b, 0xc0, 0xd8, 0x24, 0x07, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/genproto/protobuf/source_context/source_context.pb.go b/vendor/google.golang.org/genproto/protobuf/source_context/source_context.pb.go new file mode 100644 index 00000000..fe44f7e1 --- /dev/null +++ b/vendor/google.golang.org/genproto/protobuf/source_context/source_context.pb.go @@ -0,0 +1,89 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/source_context.proto + +package source_context + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// `SourceContext` represents information about the source of a +// protobuf element, like the file in which it is defined. +type SourceContext struct { + // The path-qualified name of the .proto file that contained the associated + // protobuf element. For example: `"google/protobuf/source_context.proto"`. + FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceContext) Reset() { *m = SourceContext{} } +func (m *SourceContext) String() string { return proto.CompactTextString(m) } +func (*SourceContext) ProtoMessage() {} +func (*SourceContext) Descriptor() ([]byte, []int) { + return fileDescriptor_b686cdb126d509db, []int{0} +} + +func (m *SourceContext) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceContext.Unmarshal(m, b) +} +func (m *SourceContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceContext.Marshal(b, m, deterministic) +} +func (m *SourceContext) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceContext.Merge(m, src) +} +func (m *SourceContext) XXX_Size() int { + return xxx_messageInfo_SourceContext.Size(m) +} +func (m *SourceContext) XXX_DiscardUnknown() { + xxx_messageInfo_SourceContext.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceContext proto.InternalMessageInfo + +func (m *SourceContext) GetFileName() string { + if m != nil { + return m.FileName + } + return "" +} + +func init() { + proto.RegisterType((*SourceContext)(nil), "google.protobuf.SourceContext") +} + +func init() { + proto.RegisterFile("google/protobuf/source_context.proto", fileDescriptor_b686cdb126d509db) +} + +var fileDescriptor_b686cdb126d509db = []byte{ + // 184 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xce, 0x2f, 0x2d, + 0x4a, 0x4e, 0x8d, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xad, 0x28, 0xd1, 0x03, 0x8b, 0x0b, 0xf1, 0x43, + 0x54, 0xe9, 0xc1, 0x54, 0x29, 0xe9, 0x70, 0xf1, 0x06, 0x83, 0x15, 0x3a, 0x43, 0xd4, 0x09, 0x49, + 0x73, 0x71, 0xa6, 0x65, 0xe6, 0xa4, 0xc6, 0xe7, 0x25, 0xe6, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x6a, + 0x70, 0x06, 0x71, 0x80, 0x04, 0xfc, 0x12, 0x73, 0x53, 0x9d, 0xa6, 0x32, 0x72, 0x09, 0x27, 0xe7, + 0xe7, 0xea, 0xa1, 0x99, 0xe2, 0x24, 0x84, 0x62, 0x46, 0x00, 0x48, 0x38, 0x80, 0x31, 0xca, 0x11, + 0xaa, 0x2c, 0x3d, 0x3f, 0x27, 0x31, 0x2f, 0x5d, 0x2f, 0xbf, 0x28, 0x5d, 0x3f, 0x3d, 0x35, 0x0f, + 0xac, 0x09, 0x97, 0x33, 0xad, 0x51, 0xb9, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, 0x56, 0x31, 0xc9, + 0xb9, 0x43, 0x4c, 0x0a, 0x80, 0xea, 0xd2, 0x0b, 0x4f, 0xcd, 0xc9, 0xf1, 0xce, 0xcb, 0x2f, 0xcf, + 0x0b, 0xa9, 0x2c, 0x48, 0x2d, 0x4e, 0x62, 0x03, 0x1b, 0x67, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, + 0x5c, 0xbd, 0xa4, 0x22, 0x05, 0x01, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/grpc/.travis.yml b/vendor/google.golang.org/grpc/.travis.yml new file mode 100644 index 00000000..a11e8cbc --- /dev/null +++ b/vendor/google.golang.org/grpc/.travis.yml @@ -0,0 +1,42 @@ +language: go + +matrix: + include: + - go: 1.13.x + env: VET=1 GO111MODULE=on + - go: 1.13.x + env: RACE=1 GO111MODULE=on + - go: 1.13.x + env: RUN386=1 + - go: 1.13.x + env: GRPC_GO_RETRY=on + - go: 1.13.x + env: TESTEXTRAS=1 + - go: 1.12.x + env: GO111MODULE=on + - go: 1.11.x + env: GO111MODULE=on + - go: 1.9.x + env: GAE=1 + +go_import_path: google.golang.org/grpc + +before_install: + - if [[ "${GO111MODULE}" = "on" ]]; then mkdir "${HOME}/go"; export GOPATH="${HOME}/go"; fi + - if [[ -n "${RUN386}" ]]; then export GOARCH=386; fi + - if [[ "${TRAVIS_EVENT_TYPE}" = "cron" && -z "${RUN386}" ]]; then RACE=1; fi + - if [[ "${TRAVIS_EVENT_TYPE}" != "cron" ]]; then export VET_SKIP_PROTO=1; fi + +install: + - try3() { eval "$*" || eval "$*" || eval "$*"; } + - try3 'if [[ "${GO111MODULE}" = "on" ]]; then go mod download; else make testdeps; fi' + - if [[ -n "${GAE}" ]]; then source ./install_gae.sh; make testappenginedeps; fi + - if [[ -n "${VET}" ]]; then ./vet.sh -install; fi + +script: + - set -e + - if [[ -n "${TESTEXTRAS}" ]]; then examples/examples_test.sh; interop/interop_test.sh; make testsubmodule; exit 0; fi + - if [[ -n "${VET}" ]]; then ./vet.sh; fi + - if [[ -n "${GAE}" ]]; then make testappengine; exit 0; fi + - if [[ -n "${RACE}" ]]; then make testrace; exit 0; fi + - make test diff --git a/vendor/google.golang.org/grpc/AUTHORS b/vendor/google.golang.org/grpc/AUTHORS new file mode 100644 index 00000000..e491a9e7 --- /dev/null +++ b/vendor/google.golang.org/grpc/AUTHORS @@ -0,0 +1 @@ +Google Inc. diff --git a/vendor/google.golang.org/grpc/CODE-OF-CONDUCT.md b/vendor/google.golang.org/grpc/CODE-OF-CONDUCT.md new file mode 100644 index 00000000..9d4213eb --- /dev/null +++ b/vendor/google.golang.org/grpc/CODE-OF-CONDUCT.md @@ -0,0 +1,3 @@ +## Community Code of Conduct + +gRPC follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). diff --git a/vendor/google.golang.org/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md new file mode 100644 index 00000000..4f1567e2 --- /dev/null +++ b/vendor/google.golang.org/grpc/CONTRIBUTING.md @@ -0,0 +1,62 @@ +# How to contribute + +We definitely welcome your patches and contributions to gRPC! Please read the gRPC +organization's [governance rules](https://github.com/grpc/grpc-community/blob/master/governance.md) +and [contribution guidelines](https://github.com/grpc/grpc-community/blob/master/CONTRIBUTING.md) before proceeding. + +If you are new to github, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) + +## Legal requirements + +In order to protect both you and ourselves, you will need to sign the +[Contributor License Agreement](https://identity.linuxfoundation.org/projects/cncf). + +## Guidelines for Pull Requests +How to get your contributions merged smoothly and quickly. + +- Create **small PRs** that are narrowly focused on **addressing a single + concern**. We often times receive PRs that are trying to fix several things at + a time, but only one fix is considered acceptable, nothing gets merged and + both author's & review's time is wasted. Create more PRs to address different + concerns and everyone will be happy. + +- The grpc package should only depend on standard Go packages and a small number + of exceptions. If your contribution introduces new dependencies which are NOT + in the [list](https://godoc.org/google.golang.org/grpc?imports), you need a + discussion with gRPC-Go authors and consultants. + +- For speculative changes, consider opening an issue and discussing it first. If + you are suggesting a behavioral or API change, consider starting with a [gRFC + proposal](https://github.com/grpc/proposal). + +- Provide a good **PR description** as a record of **what** change is being made + and **why** it was made. Link to a github issue if it exists. + +- Don't fix code style and formatting unless you are already changing that line + to address an issue. PRs with irrelevant changes won't be merged. If you do + want to fix formatting or style, do that in a separate PR. + +- Unless your PR is trivial, you should expect there will be reviewer comments + that you'll need to address before merging. We expect you to be reasonably + responsive to those comments, otherwise the PR will be closed after 2-3 weeks + of inactivity. + +- Maintain **clean commit history** and use **meaningful commit messages**. PRs + with messy commit history are difficult to review and won't be merged. Use + `rebase -i upstream/master` to curate your commit history and/or to bring in + latest changes from master (but avoid rebasing in the middle of a code + review). + +- Keep your PR up to date with upstream/master (if there are merge conflicts, we + can't really merge your change). + +- **All tests need to be passing** before your change can be merged. We + recommend you **run tests locally** before creating your PR to catch breakages + early on. + - `make all` to test everything, OR + - `make vet` to catch vet errors + - `make test` to run the tests + - `make testrace` to run tests in race mode + - optional `make testappengine` to run tests with appengine + +- Exceptions to the rules can be made if there's a compelling reason for doing so. diff --git a/vendor/google.golang.org/grpc/GOVERNANCE.md b/vendor/google.golang.org/grpc/GOVERNANCE.md new file mode 100644 index 00000000..d6ff2674 --- /dev/null +++ b/vendor/google.golang.org/grpc/GOVERNANCE.md @@ -0,0 +1 @@ +This repository is governed by the gRPC organization's [governance rules](https://github.com/grpc/grpc-community/blob/master/governance.md). diff --git a/vendor/google.golang.org/grpc/LICENSE b/vendor/google.golang.org/grpc/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/google.golang.org/grpc/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/google.golang.org/grpc/MAINTAINERS.md b/vendor/google.golang.org/grpc/MAINTAINERS.md new file mode 100644 index 00000000..093c82b3 --- /dev/null +++ b/vendor/google.golang.org/grpc/MAINTAINERS.md @@ -0,0 +1,27 @@ +This page lists all active maintainers of this repository. If you were a +maintainer and would like to add your name to the Emeritus list, please send us a +PR. + +See [GOVERNANCE.md](https://github.com/grpc/grpc-community/blob/master/governance.md) +for governance guidelines and how to become a maintainer. +See [CONTRIBUTING.md](https://github.com/grpc/grpc-community/blob/master/CONTRIBUTING.md) +for general contribution guidelines. + +## Maintainers (in alphabetical order) +- [canguler](https://github.com/canguler), Google LLC +- [cesarghali](https://github.com/cesarghali), Google LLC +- [dfawley](https://github.com/dfawley), Google LLC +- [easwars](https://github.com/easwars), Google LLC +- [jadekler](https://github.com/jadekler), Google LLC +- [menghanl](https://github.com/menghanl), Google LLC +- [srini100](https://github.com/srini100), Google LLC + +## Emeritus Maintainers (in alphabetical order) +- [adelez](https://github.com/adelez), Google LLC +- [iamqizhao](https://github.com/iamqizhao), Google LLC +- [jtattermusch](https://github.com/jtattermusch), Google LLC +- [lyuxuan](https://github.com/lyuxuan), Google LLC +- [makmukhi](https://github.com/makmukhi), Google LLC +- [matt-kwong](https://github.com/matt-kwong), Google LLC +- [nicolasnoble](https://github.com/nicolasnoble), Google LLC +- [yongni](https://github.com/yongni), Google LLC diff --git a/vendor/google.golang.org/grpc/Makefile b/vendor/google.golang.org/grpc/Makefile new file mode 100644 index 00000000..410f7d56 --- /dev/null +++ b/vendor/google.golang.org/grpc/Makefile @@ -0,0 +1,63 @@ +all: vet test testrace + +build: deps + go build google.golang.org/grpc/... + +clean: + go clean -i google.golang.org/grpc/... + +deps: + go get -d -v google.golang.org/grpc/... + +proto: + @ if ! which protoc > /dev/null; then \ + echo "error: protoc not installed" >&2; \ + exit 1; \ + fi + go generate google.golang.org/grpc/... + +test: testdeps + go test -cpu 1,4 -timeout 7m google.golang.org/grpc/... + +testsubmodule: testdeps + cd security/advancedtls && go test -cpu 1,4 -timeout 7m google.golang.org/grpc/security/advancedtls/... + +testappengine: testappenginedeps + goapp test -cpu 1,4 -timeout 7m google.golang.org/grpc/... + +testappenginedeps: + goapp get -d -v -t -tags 'appengine appenginevm' google.golang.org/grpc/... + +testdeps: + go get -d -v -t google.golang.org/grpc/... + +testrace: testdeps + go test -race -cpu 1,4 -timeout 7m google.golang.org/grpc/... + +updatedeps: + go get -d -v -u -f google.golang.org/grpc/... + +updatetestdeps: + go get -d -v -t -u -f google.golang.org/grpc/... + +vet: vetdeps + ./vet.sh + +vetdeps: + ./vet.sh -install + +.PHONY: \ + all \ + build \ + clean \ + deps \ + proto \ + test \ + testappengine \ + testappenginedeps \ + testdeps \ + testrace \ + updatedeps \ + updatetestdeps \ + vet \ + vetdeps diff --git a/vendor/google.golang.org/grpc/README.md b/vendor/google.golang.org/grpc/README.md new file mode 100644 index 00000000..800e7bd4 --- /dev/null +++ b/vendor/google.golang.org/grpc/README.md @@ -0,0 +1,141 @@ +# gRPC-Go + +[![Build Status](https://travis-ci.org/grpc/grpc-go.svg)](https://travis-ci.org/grpc/grpc-go) +[![GoDoc](https://godoc.org/google.golang.org/grpc?status.svg)](https://godoc.org/google.golang.org/grpc) +[![GoReportCard](https://goreportcard.com/badge/grpc/grpc-go)](https://goreportcard.com/report/github.com/grpc/grpc-go) + +The Go implementation of [gRPC](https://grpc.io/): A high performance, open +source, general RPC framework that puts mobile and HTTP/2 first. For more +information see the [gRPC Quick Start: +Go](https://grpc.io/docs/quickstart/go.html) guide. + +Installation +------------ + +To install this package, you need to install Go and setup your Go workspace on +your computer. The simplest way to install the library is to run: + +``` +$ go get -u google.golang.org/grpc +``` + +With Go module support (Go 1.11+), simply `import "google.golang.org/grpc"` in +your source code and `go [build|run|test]` will automatically download the +necessary dependencies ([Go modules +ref](https://github.com/golang/go/wiki/Modules)). + +If you are trying to access grpc-go from within China, please see the +[FAQ](#FAQ) below. + +Prerequisites +------------- +gRPC-Go requires Go 1.9 or later. + +Documentation +------------- +- See [godoc](https://godoc.org/google.golang.org/grpc) for package and API + descriptions. +- Documentation on specific topics can be found in the [Documentation + directory](Documentation/). +- Examples can be found in the [examples directory](examples/). + +Performance +----------- +Performance benchmark data for grpc-go and other languages is maintained in +[this +dashboard](https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5652536396611584&widget=490377658&container=1286539696). + +Status +------ +General Availability [Google Cloud Platform Launch +Stages](https://cloud.google.com/terms/launch-stages). + +FAQ +--- + +#### I/O Timeout Errors + +The `golang.org` domain may be blocked from some countries. `go get` usually +produces an error like the following when this happens: + +``` +$ go get -u google.golang.org/grpc +package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout) +``` + +To build Go code, there are several options: + +- Set up a VPN and access google.golang.org through that. + +- Without Go module support: `git clone` the repo manually: + + ``` + git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc + ``` + + You will need to do the same for all of grpc's dependencies in `golang.org`, + e.g. `golang.org/x/net`. + +- With Go module support: it is possible to use the `replace` feature of `go + mod` to create aliases for golang.org packages. In your project's directory: + + ``` + go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest + go mod tidy + go mod vendor + go build -mod=vendor + ``` + + Again, this will need to be done for all transitive dependencies hosted on + golang.org as well. Please refer to [this + issue](https://github.com/golang/go/issues/28652) in the golang repo regarding + this concern. + +#### Compiling error, undefined: grpc.SupportPackageIsVersion + +##### If you are using Go modules: + +Please ensure your gRPC-Go version is `require`d at the appropriate version in +the same module containing the generated `.pb.go` files. For example, +`SupportPackageIsVersion6` needs `v1.27.0`, so in your `go.mod` file: + +``` +module + +require ( + google.golang.org/grpc v1.27.0 +) +``` + +##### If you are *not* using Go modules: + +Please update proto package, gRPC package and rebuild the proto files: + - `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}` + - `go get -u google.golang.org/grpc` + - `protoc --go_out=plugins=grpc:. *.proto` + +#### How to turn on logging + +The default logger is controlled by the environment variables. Turn everything +on by setting: + +``` +GRPC_GO_LOG_VERBOSITY_LEVEL=99 GRPC_GO_LOG_SEVERITY_LEVEL=info +``` + +#### The RPC failed with error `"code = Unavailable desc = transport is closing"` + +This error means the connection the RPC is using was closed, and there are many +possible reasons, including: + 1. mis-configured transport credentials, connection failed on handshaking + 1. bytes disrupted, possibly by a proxy in between + 1. server shutdown + 1. Keepalive parameters caused connection shutdown, for example if you have configured + your server to terminate connections regularly to [trigger DNS lookups](https://github.com/grpc/grpc-go/issues/3170#issuecomment-552517779). + If this is the case, you may want to increase your [MaxConnectionAgeGrace](https://pkg.go.dev/google.golang.org/grpc/keepalive?tab=doc#ServerParameters), + to allow longer RPC calls to finish. + +It can be tricky to debug this because the error happens on the client side but +the root cause of the connection being closed is on the server side. Turn on +logging on __both client and server__, and see if there are any transport +errors. diff --git a/vendor/google.golang.org/grpc/attributes/attributes.go b/vendor/google.golang.org/grpc/attributes/attributes.go new file mode 100644 index 00000000..68ffc620 --- /dev/null +++ b/vendor/google.golang.org/grpc/attributes/attributes.go @@ -0,0 +1,70 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package attributes defines a generic key/value store used in various gRPC +// components. +// +// All APIs in this package are EXPERIMENTAL. +package attributes + +import "fmt" + +// Attributes is an immutable struct for storing and retrieving generic +// key/value pairs. Keys must be hashable, and users should define their own +// types for keys. +type Attributes struct { + m map[interface{}]interface{} +} + +// New returns a new Attributes containing all key/value pairs in kvs. If the +// same key appears multiple times, the last value overwrites all previous +// values for that key. Panics if len(kvs) is not even. +func New(kvs ...interface{}) *Attributes { + if len(kvs)%2 != 0 { + panic(fmt.Sprintf("attributes.New called with unexpected input: len(kvs) = %v", len(kvs))) + } + a := &Attributes{m: make(map[interface{}]interface{}, len(kvs)/2)} + for i := 0; i < len(kvs)/2; i++ { + a.m[kvs[i*2]] = kvs[i*2+1] + } + return a +} + +// WithValues returns a new Attributes containing all key/value pairs in a and +// kvs. Panics if len(kvs) is not even. If the same key appears multiple +// times, the last value overwrites all previous values for that key. To +// remove an existing key, use a nil value. +func (a *Attributes) WithValues(kvs ...interface{}) *Attributes { + if len(kvs)%2 != 0 { + panic(fmt.Sprintf("attributes.New called with unexpected input: len(kvs) = %v", len(kvs))) + } + n := &Attributes{m: make(map[interface{}]interface{}, len(a.m)+len(kvs)/2)} + for k, v := range a.m { + n.m[k] = v + } + for i := 0; i < len(kvs)/2; i++ { + n.m[kvs[i*2]] = kvs[i*2+1] + } + return n +} + +// Value returns the value associated with these attributes for key, or nil if +// no value is associated with key. +func (a *Attributes) Value(key interface{}) interface{} { + return a.m[key] +} diff --git a/vendor/google.golang.org/grpc/backoff.go b/vendor/google.golang.org/grpc/backoff.go new file mode 100644 index 00000000..ff7c3ee6 --- /dev/null +++ b/vendor/google.golang.org/grpc/backoff.go @@ -0,0 +1,58 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// See internal/backoff package for the backoff implementation. This file is +// kept for the exported types and API backward compatibility. + +package grpc + +import ( + "time" + + "google.golang.org/grpc/backoff" +) + +// DefaultBackoffConfig uses values specified for backoff in +// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. +// +// Deprecated: use ConnectParams instead. Will be supported throughout 1.x. +var DefaultBackoffConfig = BackoffConfig{ + MaxDelay: 120 * time.Second, +} + +// BackoffConfig defines the parameters for the default gRPC backoff strategy. +// +// Deprecated: use ConnectParams instead. Will be supported throughout 1.x. +type BackoffConfig struct { + // MaxDelay is the upper bound of backoff delay. + MaxDelay time.Duration +} + +// ConnectParams defines the parameters for connecting and retrying. Users are +// encouraged to use this instead of the BackoffConfig type defined above. See +// here for more details: +// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. +// +// This API is EXPERIMENTAL. +type ConnectParams struct { + // Backoff specifies the configuration options for connection backoff. + Backoff backoff.Config + // MinConnectTimeout is the minimum amount of time we are willing to give a + // connection to complete. + MinConnectTimeout time.Duration +} diff --git a/vendor/google.golang.org/grpc/backoff/backoff.go b/vendor/google.golang.org/grpc/backoff/backoff.go new file mode 100644 index 00000000..0787d0b5 --- /dev/null +++ b/vendor/google.golang.org/grpc/backoff/backoff.go @@ -0,0 +1,52 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package backoff provides configuration options for backoff. +// +// More details can be found at: +// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. +// +// All APIs in this package are experimental. +package backoff + +import "time" + +// Config defines the configuration options for backoff. +type Config struct { + // BaseDelay is the amount of time to backoff after the first failure. + BaseDelay time.Duration + // Multiplier is the factor with which to multiply backoffs after a + // failed retry. Should ideally be greater than 1. + Multiplier float64 + // Jitter is the factor with which backoffs are randomized. + Jitter float64 + // MaxDelay is the upper bound of backoff delay. + MaxDelay time.Duration +} + +// DefaultConfig is a backoff configuration with the default values specfied +// at https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. +// +// This should be useful for callers who want to configure backoff with +// non-default values only for a subset of the options. +var DefaultConfig = Config{ + BaseDelay: 1.0 * time.Second, + Multiplier: 1.6, + Jitter: 0.2, + MaxDelay: 120 * time.Second, +} diff --git a/vendor/google.golang.org/grpc/balancer.go b/vendor/google.golang.org/grpc/balancer.go new file mode 100644 index 00000000..a8eb0f47 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer.go @@ -0,0 +1,391 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "context" + "net" + "sync" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/naming" + "google.golang.org/grpc/status" +) + +// Address represents a server the client connects to. +// +// Deprecated: please use package balancer. +type Address struct { + // Addr is the server address on which a connection will be established. + Addr string + // Metadata is the information associated with Addr, which may be used + // to make load balancing decision. + Metadata interface{} +} + +// BalancerConfig specifies the configurations for Balancer. +// +// Deprecated: please use package balancer. May be removed in a future 1.x release. +type BalancerConfig struct { + // DialCreds is the transport credential the Balancer implementation can + // use to dial to a remote load balancer server. The Balancer implementations + // can ignore this if it does not need to talk to another party securely. + DialCreds credentials.TransportCredentials + // Dialer is the custom dialer the Balancer implementation can use to dial + // to a remote load balancer server. The Balancer implementations + // can ignore this if it doesn't need to talk to remote balancer. + Dialer func(context.Context, string) (net.Conn, error) +} + +// BalancerGetOptions configures a Get call. +// +// Deprecated: please use package balancer. May be removed in a future 1.x release. +type BalancerGetOptions struct { + // BlockingWait specifies whether Get should block when there is no + // connected address. + BlockingWait bool +} + +// Balancer chooses network addresses for RPCs. +// +// Deprecated: please use package balancer. May be removed in a future 1.x release. +type Balancer interface { + // Start does the initialization work to bootstrap a Balancer. For example, + // this function may start the name resolution and watch the updates. It will + // be called when dialing. + Start(target string, config BalancerConfig) error + // Up informs the Balancer that gRPC has a connection to the server at + // addr. It returns down which is called once the connection to addr gets + // lost or closed. + // TODO: It is not clear how to construct and take advantage of the meaningful error + // parameter for down. Need realistic demands to guide. + Up(addr Address) (down func(error)) + // Get gets the address of a server for the RPC corresponding to ctx. + // i) If it returns a connected address, gRPC internals issues the RPC on the + // connection to this address; + // ii) If it returns an address on which the connection is under construction + // (initiated by Notify(...)) but not connected, gRPC internals + // * fails RPC if the RPC is fail-fast and connection is in the TransientFailure or + // Shutdown state; + // or + // * issues RPC on the connection otherwise. + // iii) If it returns an address on which the connection does not exist, gRPC + // internals treats it as an error and will fail the corresponding RPC. + // + // Therefore, the following is the recommended rule when writing a custom Balancer. + // If opts.BlockingWait is true, it should return a connected address or + // block if there is no connected address. It should respect the timeout or + // cancellation of ctx when blocking. If opts.BlockingWait is false (for fail-fast + // RPCs), it should return an address it has notified via Notify(...) immediately + // instead of blocking. + // + // The function returns put which is called once the rpc has completed or failed. + // put can collect and report RPC stats to a remote load balancer. + // + // This function should only return the errors Balancer cannot recover by itself. + // gRPC internals will fail the RPC if an error is returned. + Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) + // Notify returns a channel that is used by gRPC internals to watch the addresses + // gRPC needs to connect. The addresses might be from a name resolver or remote + // load balancer. gRPC internals will compare it with the existing connected + // addresses. If the address Balancer notified is not in the existing connected + // addresses, gRPC starts to connect the address. If an address in the existing + // connected addresses is not in the notification list, the corresponding connection + // is shutdown gracefully. Otherwise, there are no operations to take. Note that + // the Address slice must be the full list of the Addresses which should be connected. + // It is NOT delta. + Notify() <-chan []Address + // Close shuts down the balancer. + Close() error +} + +// RoundRobin returns a Balancer that selects addresses round-robin. It uses r to watch +// the name resolution updates and updates the addresses available correspondingly. +// +// Deprecated: please use package balancer/roundrobin. May be removed in a future 1.x release. +func RoundRobin(r naming.Resolver) Balancer { + return &roundRobin{r: r} +} + +type addrInfo struct { + addr Address + connected bool +} + +type roundRobin struct { + r naming.Resolver + w naming.Watcher + addrs []*addrInfo // all the addresses the client should potentially connect + mu sync.Mutex + addrCh chan []Address // the channel to notify gRPC internals the list of addresses the client should connect to. + next int // index of the next address to return for Get() + waitCh chan struct{} // the channel to block when there is no connected address available + done bool // The Balancer is closed. +} + +func (rr *roundRobin) watchAddrUpdates() error { + updates, err := rr.w.Next() + if err != nil { + grpclog.Warningf("grpc: the naming watcher stops working due to %v.", err) + return err + } + rr.mu.Lock() + defer rr.mu.Unlock() + for _, update := range updates { + addr := Address{ + Addr: update.Addr, + Metadata: update.Metadata, + } + switch update.Op { + case naming.Add: + var exist bool + for _, v := range rr.addrs { + if addr == v.addr { + exist = true + grpclog.Infoln("grpc: The name resolver wanted to add an existing address: ", addr) + break + } + } + if exist { + continue + } + rr.addrs = append(rr.addrs, &addrInfo{addr: addr}) + case naming.Delete: + for i, v := range rr.addrs { + if addr == v.addr { + copy(rr.addrs[i:], rr.addrs[i+1:]) + rr.addrs = rr.addrs[:len(rr.addrs)-1] + break + } + } + default: + grpclog.Errorln("Unknown update.Op ", update.Op) + } + } + // Make a copy of rr.addrs and write it onto rr.addrCh so that gRPC internals gets notified. + open := make([]Address, len(rr.addrs)) + for i, v := range rr.addrs { + open[i] = v.addr + } + if rr.done { + return ErrClientConnClosing + } + select { + case <-rr.addrCh: + default: + } + rr.addrCh <- open + return nil +} + +func (rr *roundRobin) Start(target string, config BalancerConfig) error { + rr.mu.Lock() + defer rr.mu.Unlock() + if rr.done { + return ErrClientConnClosing + } + if rr.r == nil { + // If there is no name resolver installed, it is not needed to + // do name resolution. In this case, target is added into rr.addrs + // as the only address available and rr.addrCh stays nil. + rr.addrs = append(rr.addrs, &addrInfo{addr: Address{Addr: target}}) + return nil + } + w, err := rr.r.Resolve(target) + if err != nil { + return err + } + rr.w = w + rr.addrCh = make(chan []Address, 1) + go func() { + for { + if err := rr.watchAddrUpdates(); err != nil { + return + } + } + }() + return nil +} + +// Up sets the connected state of addr and sends notification if there are pending +// Get() calls. +func (rr *roundRobin) Up(addr Address) func(error) { + rr.mu.Lock() + defer rr.mu.Unlock() + var cnt int + for _, a := range rr.addrs { + if a.addr == addr { + if a.connected { + return nil + } + a.connected = true + } + if a.connected { + cnt++ + } + } + // addr is only one which is connected. Notify the Get() callers who are blocking. + if cnt == 1 && rr.waitCh != nil { + close(rr.waitCh) + rr.waitCh = nil + } + return func(err error) { + rr.down(addr, err) + } +} + +// down unsets the connected state of addr. +func (rr *roundRobin) down(addr Address, err error) { + rr.mu.Lock() + defer rr.mu.Unlock() + for _, a := range rr.addrs { + if addr == a.addr { + a.connected = false + break + } + } +} + +// Get returns the next addr in the rotation. +func (rr *roundRobin) Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) { + var ch chan struct{} + rr.mu.Lock() + if rr.done { + rr.mu.Unlock() + err = ErrClientConnClosing + return + } + + if len(rr.addrs) > 0 { + if rr.next >= len(rr.addrs) { + rr.next = 0 + } + next := rr.next + for { + a := rr.addrs[next] + next = (next + 1) % len(rr.addrs) + if a.connected { + addr = a.addr + rr.next = next + rr.mu.Unlock() + return + } + if next == rr.next { + // Has iterated all the possible address but none is connected. + break + } + } + } + if !opts.BlockingWait { + if len(rr.addrs) == 0 { + rr.mu.Unlock() + err = status.Errorf(codes.Unavailable, "there is no address available") + return + } + // Returns the next addr on rr.addrs for failfast RPCs. + addr = rr.addrs[rr.next].addr + rr.next++ + rr.mu.Unlock() + return + } + // Wait on rr.waitCh for non-failfast RPCs. + if rr.waitCh == nil { + ch = make(chan struct{}) + rr.waitCh = ch + } else { + ch = rr.waitCh + } + rr.mu.Unlock() + for { + select { + case <-ctx.Done(): + err = ctx.Err() + return + case <-ch: + rr.mu.Lock() + if rr.done { + rr.mu.Unlock() + err = ErrClientConnClosing + return + } + + if len(rr.addrs) > 0 { + if rr.next >= len(rr.addrs) { + rr.next = 0 + } + next := rr.next + for { + a := rr.addrs[next] + next = (next + 1) % len(rr.addrs) + if a.connected { + addr = a.addr + rr.next = next + rr.mu.Unlock() + return + } + if next == rr.next { + // Has iterated all the possible address but none is connected. + break + } + } + } + // The newly added addr got removed by Down() again. + if rr.waitCh == nil { + ch = make(chan struct{}) + rr.waitCh = ch + } else { + ch = rr.waitCh + } + rr.mu.Unlock() + } + } +} + +func (rr *roundRobin) Notify() <-chan []Address { + return rr.addrCh +} + +func (rr *roundRobin) Close() error { + rr.mu.Lock() + defer rr.mu.Unlock() + if rr.done { + return errBalancerClosed + } + rr.done = true + if rr.w != nil { + rr.w.Close() + } + if rr.waitCh != nil { + close(rr.waitCh) + rr.waitCh = nil + } + if rr.addrCh != nil { + close(rr.addrCh) + } + return nil +} + +// pickFirst is used to test multi-addresses in one addrConn in which all addresses share the same addrConn. +// It is a wrapper around roundRobin balancer. The logic of all methods works fine because balancer.Get() +// returns the only address Up by resetTransport(). +type pickFirst struct { + *roundRobin +} diff --git a/vendor/google.golang.org/grpc/balancer/balancer.go b/vendor/google.golang.org/grpc/balancer/balancer.go new file mode 100644 index 00000000..9258858e --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/balancer.go @@ -0,0 +1,454 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package balancer defines APIs for load balancing in gRPC. +// All APIs in this package are experimental. +package balancer + +import ( + "context" + "encoding/json" + "errors" + "net" + "strings" + + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/internal" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/serviceconfig" +) + +var ( + // m is a map from name to balancer builder. + m = make(map[string]Builder) +) + +// Register registers the balancer builder to the balancer map. b.Name +// (lowercased) will be used as the name registered with this builder. If the +// Builder implements ConfigParser, ParseConfig will be called when new service +// configs are received by the resolver, and the result will be provided to the +// Balancer in UpdateClientConnState. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple Balancers are +// registered with the same name, the one registered last will take effect. +func Register(b Builder) { + m[strings.ToLower(b.Name())] = b +} + +// unregisterForTesting deletes the balancer with the given name from the +// balancer map. +// +// This function is not thread-safe. +func unregisterForTesting(name string) { + delete(m, name) +} + +func init() { + internal.BalancerUnregister = unregisterForTesting +} + +// Get returns the resolver builder registered with the given name. +// Note that the compare is done in a case-insensitive fashion. +// If no builder is register with the name, nil will be returned. +func Get(name string) Builder { + if b, ok := m[strings.ToLower(name)]; ok { + return b + } + return nil +} + +// SubConn represents a gRPC sub connection. +// Each sub connection contains a list of addresses. gRPC will +// try to connect to them (in sequence), and stop trying the +// remainder once one connection is successful. +// +// The reconnect backoff will be applied on the list, not a single address. +// For example, try_on_all_addresses -> backoff -> try_on_all_addresses. +// +// All SubConns start in IDLE, and will not try to connect. To trigger +// the connecting, Balancers must call Connect. +// When the connection encounters an error, it will reconnect immediately. +// When the connection becomes IDLE, it will not reconnect unless Connect is +// called. +// +// This interface is to be implemented by gRPC. Users should not need a +// brand new implementation of this interface. For the situations like +// testing, the new implementation should embed this interface. This allows +// gRPC to add new methods to this interface. +type SubConn interface { + // UpdateAddresses updates the addresses used in this SubConn. + // gRPC checks if currently-connected address is still in the new list. + // If it's in the list, the connection will be kept. + // If it's not in the list, the connection will gracefully closed, and + // a new connection will be created. + // + // This will trigger a state transition for the SubConn. + UpdateAddresses([]resolver.Address) + // Connect starts the connecting for this SubConn. + Connect() +} + +// NewSubConnOptions contains options to create new SubConn. +type NewSubConnOptions struct { + // CredsBundle is the credentials bundle that will be used in the created + // SubConn. If it's nil, the original creds from grpc DialOptions will be + // used. + CredsBundle credentials.Bundle + // HealthCheckEnabled indicates whether health check service should be + // enabled on this SubConn + HealthCheckEnabled bool +} + +// State contains the balancer's state relevant to the gRPC ClientConn. +type State struct { + // State contains the connectivity state of the balancer, which is used to + // determine the state of the ClientConn. + ConnectivityState connectivity.State + // Picker is used to choose connections (SubConns) for RPCs. + Picker V2Picker +} + +// ClientConn represents a gRPC ClientConn. +// +// This interface is to be implemented by gRPC. Users should not need a +// brand new implementation of this interface. For the situations like +// testing, the new implementation should embed this interface. This allows +// gRPC to add new methods to this interface. +type ClientConn interface { + // NewSubConn is called by balancer to create a new SubConn. + // It doesn't block and wait for the connections to be established. + // Behaviors of the SubConn can be controlled by options. + NewSubConn([]resolver.Address, NewSubConnOptions) (SubConn, error) + // RemoveSubConn removes the SubConn from ClientConn. + // The SubConn will be shutdown. + RemoveSubConn(SubConn) + + // UpdateBalancerState is called by balancer to notify gRPC that some internal + // state in balancer has changed. + // + // gRPC will update the connectivity state of the ClientConn, and will call pick + // on the new picker to pick new SubConn. + // + // Deprecated: use UpdateState instead + UpdateBalancerState(s connectivity.State, p Picker) + + // UpdateState notifies gRPC that the balancer's internal state has + // changed. + // + // gRPC will update the connectivity state of the ClientConn, and will call pick + // on the new picker to pick new SubConns. + UpdateState(State) + + // ResolveNow is called by balancer to notify gRPC to do a name resolving. + ResolveNow(resolver.ResolveNowOptions) + + // Target returns the dial target for this ClientConn. + // + // Deprecated: Use the Target field in the BuildOptions instead. + Target() string +} + +// BuildOptions contains additional information for Build. +type BuildOptions struct { + // DialCreds is the transport credential the Balancer implementation can + // use to dial to a remote load balancer server. The Balancer implementations + // can ignore this if it does not need to talk to another party securely. + DialCreds credentials.TransportCredentials + // CredsBundle is the credentials bundle that the Balancer can use. + CredsBundle credentials.Bundle + // Dialer is the custom dialer the Balancer implementation can use to dial + // to a remote load balancer server. The Balancer implementations + // can ignore this if it doesn't need to talk to remote balancer. + Dialer func(context.Context, string) (net.Conn, error) + // ChannelzParentID is the entity parent's channelz unique identification number. + ChannelzParentID int64 + // Target contains the parsed address info of the dial target. It is the same resolver.Target as + // passed to the resolver. + // See the documentation for the resolver.Target type for details about what it contains. + Target resolver.Target +} + +// Builder creates a balancer. +type Builder interface { + // Build creates a new balancer with the ClientConn. + Build(cc ClientConn, opts BuildOptions) Balancer + // Name returns the name of balancers built by this builder. + // It will be used to pick balancers (for example in service config). + Name() string +} + +// ConfigParser parses load balancer configs. +type ConfigParser interface { + // ParseConfig parses the JSON load balancer config provided into an + // internal form or returns an error if the config is invalid. For future + // compatibility reasons, unknown fields in the config should be ignored. + ParseConfig(LoadBalancingConfigJSON json.RawMessage) (serviceconfig.LoadBalancingConfig, error) +} + +// PickInfo contains additional information for the Pick operation. +type PickInfo struct { + // FullMethodName is the method name that NewClientStream() is called + // with. The canonical format is /service/Method. + FullMethodName string + // Ctx is the RPC's context, and may contain relevant RPC-level information + // like the outgoing header metadata. + Ctx context.Context +} + +// DoneInfo contains additional information for done. +type DoneInfo struct { + // Err is the rpc error the RPC finished with. It could be nil. + Err error + // Trailer contains the metadata from the RPC's trailer, if present. + Trailer metadata.MD + // BytesSent indicates if any bytes have been sent to the server. + BytesSent bool + // BytesReceived indicates if any byte has been received from the server. + BytesReceived bool + // ServerLoad is the load received from server. It's usually sent as part of + // trailing metadata. + // + // The only supported type now is *orca_v1.LoadReport. + ServerLoad interface{} +} + +var ( + // ErrNoSubConnAvailable indicates no SubConn is available for pick(). + // gRPC will block the RPC until a new picker is available via UpdateBalancerState(). + ErrNoSubConnAvailable = errors.New("no SubConn is available") + // ErrTransientFailure indicates all SubConns are in TransientFailure. + // WaitForReady RPCs will block, non-WaitForReady RPCs will fail. + ErrTransientFailure = TransientFailureError(errors.New("all SubConns are in TransientFailure")) +) + +// Picker is used by gRPC to pick a SubConn to send an RPC. +// Balancer is expected to generate a new picker from its snapshot every time its +// internal state has changed. +// +// The pickers used by gRPC can be updated by ClientConn.UpdateBalancerState(). +// +// Deprecated: use V2Picker instead +type Picker interface { + // Pick returns the SubConn to be used to send the RPC. + // The returned SubConn must be one returned by NewSubConn(). + // + // This functions is expected to return: + // - a SubConn that is known to be READY; + // - ErrNoSubConnAvailable if no SubConn is available, but progress is being + // made (for example, some SubConn is in CONNECTING mode); + // - other errors if no active connecting is happening (for example, all SubConn + // are in TRANSIENT_FAILURE mode). + // + // If a SubConn is returned: + // - If it is READY, gRPC will send the RPC on it; + // - If it is not ready, or becomes not ready after it's returned, gRPC will + // block until UpdateBalancerState() is called and will call pick on the + // new picker. The done function returned from Pick(), if not nil, will be + // called with nil error, no bytes sent and no bytes received. + // + // If the returned error is not nil: + // - If the error is ErrNoSubConnAvailable, gRPC will block until UpdateBalancerState() + // - If the error is ErrTransientFailure or implements IsTransientFailure() + // bool, returning true: + // - If the RPC is wait-for-ready, gRPC will block until UpdateBalancerState() + // is called to pick again; + // - Otherwise, RPC will fail with unavailable error. + // - Else (error is other non-nil error): + // - The RPC will fail with the error's status code, or Unknown if it is + // not a status error. + // + // The returned done() function will be called once the rpc has finished, + // with the final status of that RPC. If the SubConn returned is not a + // valid SubConn type, done may not be called. done may be nil if balancer + // doesn't care about the RPC status. + Pick(ctx context.Context, info PickInfo) (conn SubConn, done func(DoneInfo), err error) +} + +// PickResult contains information related to a connection chosen for an RPC. +type PickResult struct { + // SubConn is the connection to use for this pick, if its state is Ready. + // If the state is not Ready, gRPC will block the RPC until a new Picker is + // provided by the balancer (using ClientConn.UpdateState). The SubConn + // must be one returned by ClientConn.NewSubConn. + SubConn SubConn + + // Done is called when the RPC is completed. If the SubConn is not ready, + // this will be called with a nil parameter. If the SubConn is not a valid + // type, Done may not be called. May be nil if the balancer does not wish + // to be notified when the RPC completes. + Done func(DoneInfo) +} + +type transientFailureError struct { + error +} + +func (e *transientFailureError) IsTransientFailure() bool { return true } + +// TransientFailureError wraps err in an error implementing +// IsTransientFailure() bool, returning true. +func TransientFailureError(err error) error { + return &transientFailureError{error: err} +} + +// V2Picker is used by gRPC to pick a SubConn to send an RPC. +// Balancer is expected to generate a new picker from its snapshot every time its +// internal state has changed. +// +// The pickers used by gRPC can be updated by ClientConn.UpdateBalancerState(). +type V2Picker interface { + // Pick returns the connection to use for this RPC and related information. + // + // Pick should not block. If the balancer needs to do I/O or any blocking + // or time-consuming work to service this call, it should return + // ErrNoSubConnAvailable, and the Pick call will be repeated by gRPC when + // the Picker is updated (using ClientConn.UpdateState). + // + // If an error is returned: + // + // - If the error is ErrNoSubConnAvailable, gRPC will block until a new + // Picker is provided by the balancer (using ClientConn.UpdateState). + // + // - If the error implements IsTransientFailure() bool, returning true, + // wait for ready RPCs will wait, but non-wait for ready RPCs will be + // terminated with this error's Error() string and status code + // Unavailable. + // + // - Any other errors terminate all RPCs with the code and message + // provided. If the error is not a status error, it will be converted by + // gRPC to a status error with code Unknown. + Pick(info PickInfo) (PickResult, error) +} + +// Balancer takes input from gRPC, manages SubConns, and collects and aggregates +// the connectivity states. +// +// It also generates and updates the Picker used by gRPC to pick SubConns for RPCs. +// +// HandleSubConnectionStateChange, HandleResolvedAddrs and Close are guaranteed +// to be called synchronously from the same goroutine. +// There's no guarantee on picker.Pick, it may be called anytime. +type Balancer interface { + // HandleSubConnStateChange is called by gRPC when the connectivity state + // of sc has changed. + // Balancer is expected to aggregate all the state of SubConn and report + // that back to gRPC. + // Balancer should also generate and update Pickers when its internal state has + // been changed by the new state. + // + // Deprecated: if V2Balancer is implemented by the Balancer, + // UpdateSubConnState will be called instead. + HandleSubConnStateChange(sc SubConn, state connectivity.State) + // HandleResolvedAddrs is called by gRPC to send updated resolved addresses to + // balancers. + // Balancer can create new SubConn or remove SubConn with the addresses. + // An empty address slice and a non-nil error will be passed if the resolver returns + // non-nil error to gRPC. + // + // Deprecated: if V2Balancer is implemented by the Balancer, + // UpdateClientConnState will be called instead. + HandleResolvedAddrs([]resolver.Address, error) + // Close closes the balancer. The balancer is not required to call + // ClientConn.RemoveSubConn for its existing SubConns. + Close() +} + +// SubConnState describes the state of a SubConn. +type SubConnState struct { + // ConnectivityState is the connectivity state of the SubConn. + ConnectivityState connectivity.State + // ConnectionError is set if the ConnectivityState is TransientFailure, + // describing the reason the SubConn failed. Otherwise, it is nil. + ConnectionError error +} + +// ClientConnState describes the state of a ClientConn relevant to the +// balancer. +type ClientConnState struct { + ResolverState resolver.State + // The parsed load balancing configuration returned by the builder's + // ParseConfig method, if implemented. + BalancerConfig serviceconfig.LoadBalancingConfig +} + +// ErrBadResolverState may be returned by UpdateClientConnState to indicate a +// problem with the provided name resolver data. +var ErrBadResolverState = errors.New("bad resolver state") + +// V2Balancer is defined for documentation purposes. If a Balancer also +// implements V2Balancer, its UpdateClientConnState method will be called +// instead of HandleResolvedAddrs and its UpdateSubConnState will be called +// instead of HandleSubConnStateChange. +type V2Balancer interface { + // UpdateClientConnState is called by gRPC when the state of the ClientConn + // changes. If the error returned is ErrBadResolverState, the ClientConn + // will begin calling ResolveNow on the active name resolver with + // exponential backoff until a subsequent call to UpdateClientConnState + // returns a nil error. Any other errors are currently ignored. + UpdateClientConnState(ClientConnState) error + // ResolverError is called by gRPC when the name resolver reports an error. + ResolverError(error) + // UpdateSubConnState is called by gRPC when the state of a SubConn + // changes. + UpdateSubConnState(SubConn, SubConnState) + // Close closes the balancer. The balancer is not required to call + // ClientConn.RemoveSubConn for its existing SubConns. + Close() +} + +// ConnectivityStateEvaluator takes the connectivity states of multiple SubConns +// and returns one aggregated connectivity state. +// +// It's not thread safe. +type ConnectivityStateEvaluator struct { + numReady uint64 // Number of addrConns in ready state. + numConnecting uint64 // Number of addrConns in connecting state. +} + +// RecordTransition records state change happening in subConn and based on that +// it evaluates what aggregated state should be. +// +// - If at least one SubConn in Ready, the aggregated state is Ready; +// - Else if at least one SubConn in Connecting, the aggregated state is Connecting; +// - Else the aggregated state is TransientFailure. +// +// Idle and Shutdown are not considered. +func (cse *ConnectivityStateEvaluator) RecordTransition(oldState, newState connectivity.State) connectivity.State { + // Update counters. + for idx, state := range []connectivity.State{oldState, newState} { + updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new. + switch state { + case connectivity.Ready: + cse.numReady += updateVal + case connectivity.Connecting: + cse.numConnecting += updateVal + } + } + + // Evaluate. + if cse.numReady > 0 { + return connectivity.Ready + } + if cse.numConnecting > 0 { + return connectivity.Connecting + } + return connectivity.TransientFailure +} diff --git a/vendor/google.golang.org/grpc/balancer/base/balancer.go b/vendor/google.golang.org/grpc/balancer/base/balancer.go new file mode 100644 index 00000000..80559b80 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/base/balancer.go @@ -0,0 +1,286 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package base + +import ( + "context" + "errors" + "fmt" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/resolver" +) + +type baseBuilder struct { + name string + pickerBuilder PickerBuilder + v2PickerBuilder V2PickerBuilder + config Config +} + +func (bb *baseBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer { + bal := &baseBalancer{ + cc: cc, + pickerBuilder: bb.pickerBuilder, + v2PickerBuilder: bb.v2PickerBuilder, + + subConns: make(map[resolver.Address]balancer.SubConn), + scStates: make(map[balancer.SubConn]connectivity.State), + csEvltr: &balancer.ConnectivityStateEvaluator{}, + config: bb.config, + } + // Initialize picker to a picker that always returns + // ErrNoSubConnAvailable, because when state of a SubConn changes, we + // may call UpdateState with this picker. + if bb.pickerBuilder != nil { + bal.picker = NewErrPicker(balancer.ErrNoSubConnAvailable) + } else { + bal.v2Picker = NewErrPickerV2(balancer.ErrNoSubConnAvailable) + } + return bal +} + +func (bb *baseBuilder) Name() string { + return bb.name +} + +var _ balancer.V2Balancer = (*baseBalancer)(nil) // Assert that we implement V2Balancer + +type baseBalancer struct { + cc balancer.ClientConn + pickerBuilder PickerBuilder + v2PickerBuilder V2PickerBuilder + + csEvltr *balancer.ConnectivityStateEvaluator + state connectivity.State + + subConns map[resolver.Address]balancer.SubConn + scStates map[balancer.SubConn]connectivity.State + picker balancer.Picker + v2Picker balancer.V2Picker + config Config + + resolverErr error // the last error reported by the resolver; cleared on successful resolution + connErr error // the last connection error; cleared upon leaving TransientFailure +} + +func (b *baseBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) { + panic("not implemented") +} + +func (b *baseBalancer) ResolverError(err error) { + b.resolverErr = err + if len(b.subConns) == 0 { + b.state = connectivity.TransientFailure + } + if b.state != connectivity.TransientFailure { + // The picker will not change since the balancer does not currently + // report an error. + return + } + b.regeneratePicker() + if b.picker != nil { + b.cc.UpdateBalancerState(b.state, b.picker) + } else { + b.cc.UpdateState(balancer.State{ + ConnectivityState: b.state, + Picker: b.v2Picker, + }) + } +} + +func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error { + // TODO: handle s.ResolverState.Err (log if not nil) once implemented. + // TODO: handle s.ResolverState.ServiceConfig? + if grpclog.V(2) { + grpclog.Infoln("base.baseBalancer: got new ClientConn state: ", s) + } + // Successful resolution; clear resolver error and ensure we return nil. + b.resolverErr = nil + // addrsSet is the set converted from addrs, it's used for quick lookup of an address. + addrsSet := make(map[resolver.Address]struct{}) + for _, a := range s.ResolverState.Addresses { + addrsSet[a] = struct{}{} + if _, ok := b.subConns[a]; !ok { + // a is a new address (not existing in b.subConns). + sc, err := b.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{HealthCheckEnabled: b.config.HealthCheck}) + if err != nil { + grpclog.Warningf("base.baseBalancer: failed to create new SubConn: %v", err) + continue + } + b.subConns[a] = sc + b.scStates[sc] = connectivity.Idle + sc.Connect() + } + } + for a, sc := range b.subConns { + // a was removed by resolver. + if _, ok := addrsSet[a]; !ok { + b.cc.RemoveSubConn(sc) + delete(b.subConns, a) + // Keep the state of this sc in b.scStates until sc's state becomes Shutdown. + // The entry will be deleted in HandleSubConnStateChange. + } + } + // If resolver state contains no addresses, return an error so ClientConn + // will trigger re-resolve. Also records this as an resolver error, so when + // the overall state turns transient failure, the error message will have + // the zero address information. + if len(s.ResolverState.Addresses) == 0 { + b.ResolverError(errors.New("produced zero addresses")) + return balancer.ErrBadResolverState + } + return nil +} + +// mergeErrors builds an error from the last connection error and the last +// resolver error. Must only be called if b.state is TransientFailure. +func (b *baseBalancer) mergeErrors() error { + // connErr must always be non-nil unless there are no SubConns, in which + // case resolverErr must be non-nil. + if b.connErr == nil { + return fmt.Errorf("last resolver error: %v", b.resolverErr) + } + if b.resolverErr == nil { + return fmt.Errorf("last connection error: %v", b.connErr) + } + return fmt.Errorf("last connection error: %v; last resolver error: %v", b.connErr, b.resolverErr) +} + +// regeneratePicker takes a snapshot of the balancer, and generates a picker +// from it. The picker is +// - errPicker if the balancer is in TransientFailure, +// - built by the pickerBuilder with all READY SubConns otherwise. +func (b *baseBalancer) regeneratePicker() { + if b.state == connectivity.TransientFailure { + if b.pickerBuilder != nil { + b.picker = NewErrPicker(balancer.ErrTransientFailure) + } else { + b.v2Picker = NewErrPickerV2(balancer.TransientFailureError(b.mergeErrors())) + } + return + } + if b.pickerBuilder != nil { + readySCs := make(map[resolver.Address]balancer.SubConn) + + // Filter out all ready SCs from full subConn map. + for addr, sc := range b.subConns { + if st, ok := b.scStates[sc]; ok && st == connectivity.Ready { + readySCs[addr] = sc + } + } + b.picker = b.pickerBuilder.Build(readySCs) + } else { + readySCs := make(map[balancer.SubConn]SubConnInfo) + + // Filter out all ready SCs from full subConn map. + for addr, sc := range b.subConns { + if st, ok := b.scStates[sc]; ok && st == connectivity.Ready { + readySCs[sc] = SubConnInfo{Address: addr} + } + } + b.v2Picker = b.v2PickerBuilder.Build(PickerBuildInfo{ReadySCs: readySCs}) + } +} + +func (b *baseBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) { + panic("not implemented") +} + +func (b *baseBalancer) UpdateSubConnState(sc balancer.SubConn, state balancer.SubConnState) { + s := state.ConnectivityState + if grpclog.V(2) { + grpclog.Infof("base.baseBalancer: handle SubConn state change: %p, %v", sc, s) + } + oldS, ok := b.scStates[sc] + if !ok { + if grpclog.V(2) { + grpclog.Infof("base.baseBalancer: got state changes for an unknown SubConn: %p, %v", sc, s) + } + return + } + if oldS == connectivity.TransientFailure && s == connectivity.Connecting { + // Once a subconn enters TRANSIENT_FAILURE, ignore subsequent + // CONNECTING transitions to prevent the aggregated state from being + // always CONNECTING when many backends exist but are all down. + return + } + b.scStates[sc] = s + switch s { + case connectivity.Idle: + sc.Connect() + case connectivity.Shutdown: + // When an address was removed by resolver, b called RemoveSubConn but + // kept the sc's state in scStates. Remove state for this sc here. + delete(b.scStates, sc) + case connectivity.TransientFailure: + // Save error to be reported via picker. + b.connErr = state.ConnectionError + } + + b.state = b.csEvltr.RecordTransition(oldS, s) + + // Regenerate picker when one of the following happens: + // - this sc entered or left ready + // - the aggregated state of balancer is TransientFailure + // (may need to update error message) + if (s == connectivity.Ready) != (oldS == connectivity.Ready) || + b.state == connectivity.TransientFailure { + b.regeneratePicker() + } + + if b.picker != nil { + b.cc.UpdateBalancerState(b.state, b.picker) + } else { + b.cc.UpdateState(balancer.State{ConnectivityState: b.state, Picker: b.v2Picker}) + } +} + +// Close is a nop because base balancer doesn't have internal state to clean up, +// and it doesn't need to call RemoveSubConn for the SubConns. +func (b *baseBalancer) Close() { +} + +// NewErrPicker returns a picker that always returns err on Pick(). +func NewErrPicker(err error) balancer.Picker { + return &errPicker{err: err} +} + +type errPicker struct { + err error // Pick() always returns this err. +} + +func (p *errPicker) Pick(context.Context, balancer.PickInfo) (balancer.SubConn, func(balancer.DoneInfo), error) { + return nil, nil, p.err +} + +// NewErrPickerV2 returns a V2Picker that always returns err on Pick(). +func NewErrPickerV2(err error) balancer.V2Picker { + return &errPickerV2{err: err} +} + +type errPickerV2 struct { + err error // Pick() always returns this err. +} + +func (p *errPickerV2) Pick(info balancer.PickInfo) (balancer.PickResult, error) { + return balancer.PickResult{}, p.err +} diff --git a/vendor/google.golang.org/grpc/balancer/base/base.go b/vendor/google.golang.org/grpc/balancer/base/base.go new file mode 100644 index 00000000..4192918b --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/base/base.go @@ -0,0 +1,93 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package base defines a balancer base that can be used to build balancers with +// different picking algorithms. +// +// The base balancer creates a new SubConn for each resolved address. The +// provided picker will only be notified about READY SubConns. +// +// This package is the base of round_robin balancer, its purpose is to be used +// to build round_robin like balancers with complex picking algorithms. +// Balancers with more complicated logic should try to implement a balancer +// builder from scratch. +// +// All APIs in this package are experimental. +package base + +import ( + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/resolver" +) + +// PickerBuilder creates balancer.Picker. +type PickerBuilder interface { + // Build takes a slice of ready SubConns, and returns a picker that will be + // used by gRPC to pick a SubConn. + Build(readySCs map[resolver.Address]balancer.SubConn) balancer.Picker +} + +// V2PickerBuilder creates balancer.V2Picker. +type V2PickerBuilder interface { + // Build returns a picker that will be used by gRPC to pick a SubConn. + Build(info PickerBuildInfo) balancer.V2Picker +} + +// PickerBuildInfo contains information needed by the picker builder to +// construct a picker. +type PickerBuildInfo struct { + // ReadySCs is a map from all ready SubConns to the Addresses used to + // create them. + ReadySCs map[balancer.SubConn]SubConnInfo +} + +// SubConnInfo contains information about a SubConn created by the base +// balancer. +type SubConnInfo struct { + Address resolver.Address // the address used to create this SubConn +} + +// NewBalancerBuilder returns a balancer builder. The balancers +// built by this builder will use the picker builder to build pickers. +func NewBalancerBuilder(name string, pb PickerBuilder) balancer.Builder { + return NewBalancerBuilderWithConfig(name, pb, Config{}) +} + +// Config contains the config info about the base balancer builder. +type Config struct { + // HealthCheck indicates whether health checking should be enabled for this specific balancer. + HealthCheck bool +} + +// NewBalancerBuilderWithConfig returns a base balancer builder configured by the provided config. +func NewBalancerBuilderWithConfig(name string, pb PickerBuilder, config Config) balancer.Builder { + return &baseBuilder{ + name: name, + pickerBuilder: pb, + config: config, + } +} + +// NewBalancerBuilderV2 returns a base balancer builder configured by the provided config. +func NewBalancerBuilderV2(name string, pb V2PickerBuilder, config Config) balancer.Builder { + return &baseBuilder{ + name: name, + v2PickerBuilder: pb, + config: config, + } +} diff --git a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go new file mode 100644 index 00000000..d4d64550 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go @@ -0,0 +1,81 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package roundrobin defines a roundrobin balancer. Roundrobin balancer is +// installed as one of the default balancers in gRPC, users don't need to +// explicitly install this balancer. +package roundrobin + +import ( + "sync" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/base" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/grpcrand" +) + +// Name is the name of round_robin balancer. +const Name = "round_robin" + +// newBuilder creates a new roundrobin balancer builder. +func newBuilder() balancer.Builder { + return base.NewBalancerBuilderV2(Name, &rrPickerBuilder{}, base.Config{HealthCheck: true}) +} + +func init() { + balancer.Register(newBuilder()) +} + +type rrPickerBuilder struct{} + +func (*rrPickerBuilder) Build(info base.PickerBuildInfo) balancer.V2Picker { + grpclog.Infof("roundrobinPicker: newPicker called with info: %v", info) + if len(info.ReadySCs) == 0 { + return base.NewErrPickerV2(balancer.ErrNoSubConnAvailable) + } + var scs []balancer.SubConn + for sc := range info.ReadySCs { + scs = append(scs, sc) + } + return &rrPicker{ + subConns: scs, + // Start at a random index, as the same RR balancer rebuilds a new + // picker when SubConn states change, and we don't want to apply excess + // load to the first server in the list. + next: grpcrand.Intn(len(scs)), + } +} + +type rrPicker struct { + // subConns is the snapshot of the roundrobin balancer when this picker was + // created. The slice is immutable. Each Get() will do a round robin + // selection from it and return the selected SubConn. + subConns []balancer.SubConn + + mu sync.Mutex + next int +} + +func (p *rrPicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { + p.mu.Lock() + sc := p.subConns[p.next] + p.next = (p.next + 1) % len(p.subConns) + p.mu.Unlock() + return balancer.PickResult{SubConn: sc}, nil +} diff --git a/vendor/google.golang.org/grpc/balancer_conn_wrappers.go b/vendor/google.golang.org/grpc/balancer_conn_wrappers.go new file mode 100644 index 00000000..f8667a23 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer_conn_wrappers.go @@ -0,0 +1,271 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "fmt" + "sync" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/internal/buffer" + "google.golang.org/grpc/internal/channelz" + "google.golang.org/grpc/internal/grpcsync" + "google.golang.org/grpc/resolver" +) + +// scStateUpdate contains the subConn and the new state it changed to. +type scStateUpdate struct { + sc balancer.SubConn + state connectivity.State + err error +} + +// ccBalancerWrapper is a wrapper on top of cc for balancers. +// It implements balancer.ClientConn interface. +type ccBalancerWrapper struct { + cc *ClientConn + balancerMu sync.Mutex // synchronizes calls to the balancer + balancer balancer.Balancer + scBuffer *buffer.Unbounded + done *grpcsync.Event + + mu sync.Mutex + subConns map[*acBalancerWrapper]struct{} +} + +func newCCBalancerWrapper(cc *ClientConn, b balancer.Builder, bopts balancer.BuildOptions) *ccBalancerWrapper { + ccb := &ccBalancerWrapper{ + cc: cc, + scBuffer: buffer.NewUnbounded(), + done: grpcsync.NewEvent(), + subConns: make(map[*acBalancerWrapper]struct{}), + } + go ccb.watcher() + ccb.balancer = b.Build(ccb, bopts) + return ccb +} + +// watcher balancer functions sequentially, so the balancer can be implemented +// lock-free. +func (ccb *ccBalancerWrapper) watcher() { + for { + select { + case t := <-ccb.scBuffer.Get(): + ccb.scBuffer.Load() + if ccb.done.HasFired() { + break + } + ccb.balancerMu.Lock() + su := t.(*scStateUpdate) + if ub, ok := ccb.balancer.(balancer.V2Balancer); ok { + ub.UpdateSubConnState(su.sc, balancer.SubConnState{ConnectivityState: su.state, ConnectionError: su.err}) + } else { + ccb.balancer.HandleSubConnStateChange(su.sc, su.state) + } + ccb.balancerMu.Unlock() + case <-ccb.done.Done(): + } + + if ccb.done.HasFired() { + ccb.balancer.Close() + ccb.mu.Lock() + scs := ccb.subConns + ccb.subConns = nil + ccb.mu.Unlock() + for acbw := range scs { + ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain) + } + ccb.UpdateState(balancer.State{ConnectivityState: connectivity.Connecting, Picker: nil}) + return + } + } +} + +func (ccb *ccBalancerWrapper) close() { + ccb.done.Fire() +} + +func (ccb *ccBalancerWrapper) handleSubConnStateChange(sc balancer.SubConn, s connectivity.State, err error) { + // When updating addresses for a SubConn, if the address in use is not in + // the new addresses, the old ac will be tearDown() and a new ac will be + // created. tearDown() generates a state change with Shutdown state, we + // don't want the balancer to receive this state change. So before + // tearDown() on the old ac, ac.acbw (acWrapper) will be set to nil, and + // this function will be called with (nil, Shutdown). We don't need to call + // balancer method in this case. + if sc == nil { + return + } + ccb.scBuffer.Put(&scStateUpdate{ + sc: sc, + state: s, + err: err, + }) +} + +func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnState) error { + ccb.balancerMu.Lock() + defer ccb.balancerMu.Unlock() + if ub, ok := ccb.balancer.(balancer.V2Balancer); ok { + return ub.UpdateClientConnState(*ccs) + } + ccb.balancer.HandleResolvedAddrs(ccs.ResolverState.Addresses, nil) + return nil +} + +func (ccb *ccBalancerWrapper) resolverError(err error) { + if ub, ok := ccb.balancer.(balancer.V2Balancer); ok { + ccb.balancerMu.Lock() + ub.ResolverError(err) + ccb.balancerMu.Unlock() + } +} + +func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) { + if len(addrs) <= 0 { + return nil, fmt.Errorf("grpc: cannot create SubConn with empty address list") + } + ccb.mu.Lock() + defer ccb.mu.Unlock() + if ccb.subConns == nil { + return nil, fmt.Errorf("grpc: ClientConn balancer wrapper was closed") + } + ac, err := ccb.cc.newAddrConn(addrs, opts) + if err != nil { + return nil, err + } + acbw := &acBalancerWrapper{ac: ac} + acbw.ac.mu.Lock() + ac.acbw = acbw + acbw.ac.mu.Unlock() + ccb.subConns[acbw] = struct{}{} + return acbw, nil +} + +func (ccb *ccBalancerWrapper) RemoveSubConn(sc balancer.SubConn) { + acbw, ok := sc.(*acBalancerWrapper) + if !ok { + return + } + ccb.mu.Lock() + defer ccb.mu.Unlock() + if ccb.subConns == nil { + return + } + delete(ccb.subConns, acbw) + ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain) +} + +func (ccb *ccBalancerWrapper) UpdateBalancerState(s connectivity.State, p balancer.Picker) { + ccb.mu.Lock() + defer ccb.mu.Unlock() + if ccb.subConns == nil { + return + } + // Update picker before updating state. Even though the ordering here does + // not matter, it can lead to multiple calls of Pick in the common start-up + // case where we wait for ready and then perform an RPC. If the picker is + // updated later, we could call the "connecting" picker when the state is + // updated, and then call the "ready" picker after the picker gets updated. + ccb.cc.blockingpicker.updatePicker(p) + ccb.cc.csMgr.updateState(s) +} + +func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) { + ccb.mu.Lock() + defer ccb.mu.Unlock() + if ccb.subConns == nil { + return + } + // Update picker before updating state. Even though the ordering here does + // not matter, it can lead to multiple calls of Pick in the common start-up + // case where we wait for ready and then perform an RPC. If the picker is + // updated later, we could call the "connecting" picker when the state is + // updated, and then call the "ready" picker after the picker gets updated. + ccb.cc.blockingpicker.updatePickerV2(s.Picker) + ccb.cc.csMgr.updateState(s.ConnectivityState) +} + +func (ccb *ccBalancerWrapper) ResolveNow(o resolver.ResolveNowOptions) { + ccb.cc.resolveNow(o) +} + +func (ccb *ccBalancerWrapper) Target() string { + return ccb.cc.target +} + +// acBalancerWrapper is a wrapper on top of ac for balancers. +// It implements balancer.SubConn interface. +type acBalancerWrapper struct { + mu sync.Mutex + ac *addrConn +} + +func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) { + acbw.mu.Lock() + defer acbw.mu.Unlock() + if len(addrs) <= 0 { + acbw.ac.tearDown(errConnDrain) + return + } + if !acbw.ac.tryUpdateAddrs(addrs) { + cc := acbw.ac.cc + opts := acbw.ac.scopts + acbw.ac.mu.Lock() + // Set old ac.acbw to nil so the Shutdown state update will be ignored + // by balancer. + // + // TODO(bar) the state transition could be wrong when tearDown() old ac + // and creating new ac, fix the transition. + acbw.ac.acbw = nil + acbw.ac.mu.Unlock() + acState := acbw.ac.getState() + acbw.ac.tearDown(errConnDrain) + + if acState == connectivity.Shutdown { + return + } + + ac, err := cc.newAddrConn(addrs, opts) + if err != nil { + channelz.Warningf(acbw.ac.channelzID, "acBalancerWrapper: UpdateAddresses: failed to newAddrConn: %v", err) + return + } + acbw.ac = ac + ac.mu.Lock() + ac.acbw = acbw + ac.mu.Unlock() + if acState != connectivity.Idle { + ac.connect() + } + } +} + +func (acbw *acBalancerWrapper) Connect() { + acbw.mu.Lock() + defer acbw.mu.Unlock() + acbw.ac.connect() +} + +func (acbw *acBalancerWrapper) getAddrConn() *addrConn { + acbw.mu.Lock() + defer acbw.mu.Unlock() + return acbw.ac +} diff --git a/vendor/google.golang.org/grpc/balancer_v1_wrapper.go b/vendor/google.golang.org/grpc/balancer_v1_wrapper.go new file mode 100644 index 00000000..db04b08b --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer_v1_wrapper.go @@ -0,0 +1,334 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "sync" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/resolver" +) + +type balancerWrapperBuilder struct { + b Balancer // The v1 balancer. +} + +func (bwb *balancerWrapperBuilder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer { + bwb.b.Start(opts.Target.Endpoint, BalancerConfig{ + DialCreds: opts.DialCreds, + Dialer: opts.Dialer, + }) + _, pickfirst := bwb.b.(*pickFirst) + bw := &balancerWrapper{ + balancer: bwb.b, + pickfirst: pickfirst, + cc: cc, + targetAddr: opts.Target.Endpoint, + startCh: make(chan struct{}), + conns: make(map[resolver.Address]balancer.SubConn), + connSt: make(map[balancer.SubConn]*scState), + csEvltr: &balancer.ConnectivityStateEvaluator{}, + state: connectivity.Idle, + } + cc.UpdateState(balancer.State{ConnectivityState: connectivity.Idle, Picker: bw}) + go bw.lbWatcher() + return bw +} + +func (bwb *balancerWrapperBuilder) Name() string { + return "wrapper" +} + +type scState struct { + addr Address // The v1 address type. + s connectivity.State + down func(error) +} + +type balancerWrapper struct { + balancer Balancer // The v1 balancer. + pickfirst bool + + cc balancer.ClientConn + targetAddr string // Target without the scheme. + + mu sync.Mutex + conns map[resolver.Address]balancer.SubConn + connSt map[balancer.SubConn]*scState + // This channel is closed when handling the first resolver result. + // lbWatcher blocks until this is closed, to avoid race between + // - NewSubConn is created, cc wants to notify balancer of state changes; + // - Build hasn't return, cc doesn't have access to balancer. + startCh chan struct{} + + // To aggregate the connectivity state. + csEvltr *balancer.ConnectivityStateEvaluator + state connectivity.State +} + +// lbWatcher watches the Notify channel of the balancer and manages +// connections accordingly. +func (bw *balancerWrapper) lbWatcher() { + <-bw.startCh + notifyCh := bw.balancer.Notify() + if notifyCh == nil { + // There's no resolver in the balancer. Connect directly. + a := resolver.Address{ + Addr: bw.targetAddr, + Type: resolver.Backend, + } + sc, err := bw.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{}) + if err != nil { + grpclog.Warningf("Error creating connection to %v. Err: %v", a, err) + } else { + bw.mu.Lock() + bw.conns[a] = sc + bw.connSt[sc] = &scState{ + addr: Address{Addr: bw.targetAddr}, + s: connectivity.Idle, + } + bw.mu.Unlock() + sc.Connect() + } + return + } + + for addrs := range notifyCh { + grpclog.Infof("balancerWrapper: got update addr from Notify: %v", addrs) + if bw.pickfirst { + var ( + oldA resolver.Address + oldSC balancer.SubConn + ) + bw.mu.Lock() + for oldA, oldSC = range bw.conns { + break + } + bw.mu.Unlock() + if len(addrs) <= 0 { + if oldSC != nil { + // Teardown old sc. + bw.mu.Lock() + delete(bw.conns, oldA) + delete(bw.connSt, oldSC) + bw.mu.Unlock() + bw.cc.RemoveSubConn(oldSC) + } + continue + } + + var newAddrs []resolver.Address + for _, a := range addrs { + newAddr := resolver.Address{ + Addr: a.Addr, + Type: resolver.Backend, // All addresses from balancer are all backends. + ServerName: "", + Metadata: a.Metadata, + } + newAddrs = append(newAddrs, newAddr) + } + if oldSC == nil { + // Create new sc. + sc, err := bw.cc.NewSubConn(newAddrs, balancer.NewSubConnOptions{}) + if err != nil { + grpclog.Warningf("Error creating connection to %v. Err: %v", newAddrs, err) + } else { + bw.mu.Lock() + // For pickfirst, there should be only one SubConn, so the + // address doesn't matter. All states updating (up and down) + // and picking should all happen on that only SubConn. + bw.conns[resolver.Address{}] = sc + bw.connSt[sc] = &scState{ + addr: addrs[0], // Use the first address. + s: connectivity.Idle, + } + bw.mu.Unlock() + sc.Connect() + } + } else { + bw.mu.Lock() + bw.connSt[oldSC].addr = addrs[0] + bw.mu.Unlock() + oldSC.UpdateAddresses(newAddrs) + } + } else { + var ( + add []resolver.Address // Addresses need to setup connections. + del []balancer.SubConn // Connections need to tear down. + ) + resAddrs := make(map[resolver.Address]Address) + for _, a := range addrs { + resAddrs[resolver.Address{ + Addr: a.Addr, + Type: resolver.Backend, // All addresses from balancer are all backends. + ServerName: "", + Metadata: a.Metadata, + }] = a + } + bw.mu.Lock() + for a := range resAddrs { + if _, ok := bw.conns[a]; !ok { + add = append(add, a) + } + } + for a, c := range bw.conns { + if _, ok := resAddrs[a]; !ok { + del = append(del, c) + delete(bw.conns, a) + // Keep the state of this sc in bw.connSt until its state becomes Shutdown. + } + } + bw.mu.Unlock() + for _, a := range add { + sc, err := bw.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{}) + if err != nil { + grpclog.Warningf("Error creating connection to %v. Err: %v", a, err) + } else { + bw.mu.Lock() + bw.conns[a] = sc + bw.connSt[sc] = &scState{ + addr: resAddrs[a], + s: connectivity.Idle, + } + bw.mu.Unlock() + sc.Connect() + } + } + for _, c := range del { + bw.cc.RemoveSubConn(c) + } + } + } +} + +func (bw *balancerWrapper) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) { + bw.mu.Lock() + defer bw.mu.Unlock() + scSt, ok := bw.connSt[sc] + if !ok { + return + } + if s == connectivity.Idle { + sc.Connect() + } + oldS := scSt.s + scSt.s = s + if oldS != connectivity.Ready && s == connectivity.Ready { + scSt.down = bw.balancer.Up(scSt.addr) + } else if oldS == connectivity.Ready && s != connectivity.Ready { + if scSt.down != nil { + scSt.down(errConnClosing) + } + } + sa := bw.csEvltr.RecordTransition(oldS, s) + if bw.state != sa { + bw.state = sa + } + bw.cc.UpdateState(balancer.State{ConnectivityState: bw.state, Picker: bw}) + if s == connectivity.Shutdown { + // Remove state for this sc. + delete(bw.connSt, sc) + } +} + +func (bw *balancerWrapper) HandleResolvedAddrs([]resolver.Address, error) { + bw.mu.Lock() + defer bw.mu.Unlock() + select { + case <-bw.startCh: + default: + close(bw.startCh) + } + // There should be a resolver inside the balancer. + // All updates here, if any, are ignored. +} + +func (bw *balancerWrapper) Close() { + bw.mu.Lock() + defer bw.mu.Unlock() + select { + case <-bw.startCh: + default: + close(bw.startCh) + } + bw.balancer.Close() +} + +// The picker is the balancerWrapper itself. +// It either blocks or returns error, consistent with v1 balancer Get(). +func (bw *balancerWrapper) Pick(info balancer.PickInfo) (result balancer.PickResult, err error) { + failfast := true // Default failfast is true. + if ss, ok := rpcInfoFromContext(info.Ctx); ok { + failfast = ss.failfast + } + a, p, err := bw.balancer.Get(info.Ctx, BalancerGetOptions{BlockingWait: !failfast}) + if err != nil { + return balancer.PickResult{}, toRPCErr(err) + } + if p != nil { + result.Done = func(balancer.DoneInfo) { p() } + defer func() { + if err != nil { + p() + } + }() + } + + bw.mu.Lock() + defer bw.mu.Unlock() + if bw.pickfirst { + // Get the first sc in conns. + for _, result.SubConn = range bw.conns { + return result, nil + } + return balancer.PickResult{}, balancer.ErrNoSubConnAvailable + } + var ok1 bool + result.SubConn, ok1 = bw.conns[resolver.Address{ + Addr: a.Addr, + Type: resolver.Backend, + ServerName: "", + Metadata: a.Metadata, + }] + s, ok2 := bw.connSt[result.SubConn] + if !ok1 || !ok2 { + // This can only happen due to a race where Get() returned an address + // that was subsequently removed by Notify. In this case we should + // retry always. + return balancer.PickResult{}, balancer.ErrNoSubConnAvailable + } + switch s.s { + case connectivity.Ready, connectivity.Idle: + return result, nil + case connectivity.Shutdown, connectivity.TransientFailure: + // If the returned sc has been shut down or is in transient failure, + // return error, and this RPC will fail or wait for another picker (if + // non-failfast). + return balancer.PickResult{}, balancer.ErrTransientFailure + default: + // For other states (connecting or unknown), the v1 balancer would + // traditionally wait until ready and then issue the RPC. Returning + // ErrNoSubConnAvailable will be a slight improvement in that it will + // allow the balancer to choose another address in case others are + // connected. + return balancer.PickResult{}, balancer.ErrNoSubConnAvailable + } +} diff --git a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go new file mode 100644 index 00000000..f393bb66 --- /dev/null +++ b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go @@ -0,0 +1,900 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: grpc/binarylog/grpc_binarylog_v1/binarylog.proto + +package grpc_binarylog_v1 // import "google.golang.org/grpc/binarylog/grpc_binarylog_v1" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import duration "github.com/golang/protobuf/ptypes/duration" +import timestamp "github.com/golang/protobuf/ptypes/timestamp" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// Enumerates the type of event +// Note the terminology is different from the RPC semantics +// definition, but the same meaning is expressed here. +type GrpcLogEntry_EventType int32 + +const ( + GrpcLogEntry_EVENT_TYPE_UNKNOWN GrpcLogEntry_EventType = 0 + // Header sent from client to server + GrpcLogEntry_EVENT_TYPE_CLIENT_HEADER GrpcLogEntry_EventType = 1 + // Header sent from server to client + GrpcLogEntry_EVENT_TYPE_SERVER_HEADER GrpcLogEntry_EventType = 2 + // Message sent from client to server + GrpcLogEntry_EVENT_TYPE_CLIENT_MESSAGE GrpcLogEntry_EventType = 3 + // Message sent from server to client + GrpcLogEntry_EVENT_TYPE_SERVER_MESSAGE GrpcLogEntry_EventType = 4 + // A signal that client is done sending + GrpcLogEntry_EVENT_TYPE_CLIENT_HALF_CLOSE GrpcLogEntry_EventType = 5 + // Trailer indicates the end of the RPC. + // On client side, this event means a trailer was either received + // from the network or the gRPC library locally generated a status + // to inform the application about a failure. + // On server side, this event means the server application requested + // to send a trailer. Note: EVENT_TYPE_CANCEL may still arrive after + // this due to races on server side. + GrpcLogEntry_EVENT_TYPE_SERVER_TRAILER GrpcLogEntry_EventType = 6 + // A signal that the RPC is cancelled. On client side, this + // indicates the client application requests a cancellation. + // On server side, this indicates that cancellation was detected. + // Note: This marks the end of the RPC. Events may arrive after + // this due to races. For example, on client side a trailer + // may arrive even though the application requested to cancel the RPC. + GrpcLogEntry_EVENT_TYPE_CANCEL GrpcLogEntry_EventType = 7 +) + +var GrpcLogEntry_EventType_name = map[int32]string{ + 0: "EVENT_TYPE_UNKNOWN", + 1: "EVENT_TYPE_CLIENT_HEADER", + 2: "EVENT_TYPE_SERVER_HEADER", + 3: "EVENT_TYPE_CLIENT_MESSAGE", + 4: "EVENT_TYPE_SERVER_MESSAGE", + 5: "EVENT_TYPE_CLIENT_HALF_CLOSE", + 6: "EVENT_TYPE_SERVER_TRAILER", + 7: "EVENT_TYPE_CANCEL", +} +var GrpcLogEntry_EventType_value = map[string]int32{ + "EVENT_TYPE_UNKNOWN": 0, + "EVENT_TYPE_CLIENT_HEADER": 1, + "EVENT_TYPE_SERVER_HEADER": 2, + "EVENT_TYPE_CLIENT_MESSAGE": 3, + "EVENT_TYPE_SERVER_MESSAGE": 4, + "EVENT_TYPE_CLIENT_HALF_CLOSE": 5, + "EVENT_TYPE_SERVER_TRAILER": 6, + "EVENT_TYPE_CANCEL": 7, +} + +func (x GrpcLogEntry_EventType) String() string { + return proto.EnumName(GrpcLogEntry_EventType_name, int32(x)) +} +func (GrpcLogEntry_EventType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{0, 0} +} + +// Enumerates the entity that generates the log entry +type GrpcLogEntry_Logger int32 + +const ( + GrpcLogEntry_LOGGER_UNKNOWN GrpcLogEntry_Logger = 0 + GrpcLogEntry_LOGGER_CLIENT GrpcLogEntry_Logger = 1 + GrpcLogEntry_LOGGER_SERVER GrpcLogEntry_Logger = 2 +) + +var GrpcLogEntry_Logger_name = map[int32]string{ + 0: "LOGGER_UNKNOWN", + 1: "LOGGER_CLIENT", + 2: "LOGGER_SERVER", +} +var GrpcLogEntry_Logger_value = map[string]int32{ + "LOGGER_UNKNOWN": 0, + "LOGGER_CLIENT": 1, + "LOGGER_SERVER": 2, +} + +func (x GrpcLogEntry_Logger) String() string { + return proto.EnumName(GrpcLogEntry_Logger_name, int32(x)) +} +func (GrpcLogEntry_Logger) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{0, 1} +} + +type Address_Type int32 + +const ( + Address_TYPE_UNKNOWN Address_Type = 0 + // address is in 1.2.3.4 form + Address_TYPE_IPV4 Address_Type = 1 + // address is in IPv6 canonical form (RFC5952 section 4) + // The scope is NOT included in the address string. + Address_TYPE_IPV6 Address_Type = 2 + // address is UDS string + Address_TYPE_UNIX Address_Type = 3 +) + +var Address_Type_name = map[int32]string{ + 0: "TYPE_UNKNOWN", + 1: "TYPE_IPV4", + 2: "TYPE_IPV6", + 3: "TYPE_UNIX", +} +var Address_Type_value = map[string]int32{ + "TYPE_UNKNOWN": 0, + "TYPE_IPV4": 1, + "TYPE_IPV6": 2, + "TYPE_UNIX": 3, +} + +func (x Address_Type) String() string { + return proto.EnumName(Address_Type_name, int32(x)) +} +func (Address_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{7, 0} +} + +// Log entry we store in binary logs +type GrpcLogEntry struct { + // The timestamp of the binary log message + Timestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Uniquely identifies a call. The value must not be 0 in order to disambiguate + // from an unset value. + // Each call may have several log entries, they will all have the same call_id. + // Nothing is guaranteed about their value other than they are unique across + // different RPCs in the same gRPC process. + CallId uint64 `protobuf:"varint,2,opt,name=call_id,json=callId,proto3" json:"call_id,omitempty"` + // The entry sequence id for this call. The first GrpcLogEntry has a + // value of 1, to disambiguate from an unset value. The purpose of + // this field is to detect missing entries in environments where + // durability or ordering is not guaranteed. + SequenceIdWithinCall uint64 `protobuf:"varint,3,opt,name=sequence_id_within_call,json=sequenceIdWithinCall,proto3" json:"sequence_id_within_call,omitempty"` + Type GrpcLogEntry_EventType `protobuf:"varint,4,opt,name=type,proto3,enum=grpc.binarylog.v1.GrpcLogEntry_EventType" json:"type,omitempty"` + Logger GrpcLogEntry_Logger `protobuf:"varint,5,opt,name=logger,proto3,enum=grpc.binarylog.v1.GrpcLogEntry_Logger" json:"logger,omitempty"` + // The logger uses one of the following fields to record the payload, + // according to the type of the log entry. + // + // Types that are valid to be assigned to Payload: + // *GrpcLogEntry_ClientHeader + // *GrpcLogEntry_ServerHeader + // *GrpcLogEntry_Message + // *GrpcLogEntry_Trailer + Payload isGrpcLogEntry_Payload `protobuf_oneof:"payload"` + // true if payload does not represent the full message or metadata. + PayloadTruncated bool `protobuf:"varint,10,opt,name=payload_truncated,json=payloadTruncated,proto3" json:"payload_truncated,omitempty"` + // Peer address information, will only be recorded on the first + // incoming event. On client side, peer is logged on + // EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in + // the case of trailers-only. On server side, peer is always + // logged on EVENT_TYPE_CLIENT_HEADER. + Peer *Address `protobuf:"bytes,11,opt,name=peer,proto3" json:"peer,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GrpcLogEntry) Reset() { *m = GrpcLogEntry{} } +func (m *GrpcLogEntry) String() string { return proto.CompactTextString(m) } +func (*GrpcLogEntry) ProtoMessage() {} +func (*GrpcLogEntry) Descriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{0} +} +func (m *GrpcLogEntry) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GrpcLogEntry.Unmarshal(m, b) +} +func (m *GrpcLogEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GrpcLogEntry.Marshal(b, m, deterministic) +} +func (dst *GrpcLogEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_GrpcLogEntry.Merge(dst, src) +} +func (m *GrpcLogEntry) XXX_Size() int { + return xxx_messageInfo_GrpcLogEntry.Size(m) +} +func (m *GrpcLogEntry) XXX_DiscardUnknown() { + xxx_messageInfo_GrpcLogEntry.DiscardUnknown(m) +} + +var xxx_messageInfo_GrpcLogEntry proto.InternalMessageInfo + +func (m *GrpcLogEntry) GetTimestamp() *timestamp.Timestamp { + if m != nil { + return m.Timestamp + } + return nil +} + +func (m *GrpcLogEntry) GetCallId() uint64 { + if m != nil { + return m.CallId + } + return 0 +} + +func (m *GrpcLogEntry) GetSequenceIdWithinCall() uint64 { + if m != nil { + return m.SequenceIdWithinCall + } + return 0 +} + +func (m *GrpcLogEntry) GetType() GrpcLogEntry_EventType { + if m != nil { + return m.Type + } + return GrpcLogEntry_EVENT_TYPE_UNKNOWN +} + +func (m *GrpcLogEntry) GetLogger() GrpcLogEntry_Logger { + if m != nil { + return m.Logger + } + return GrpcLogEntry_LOGGER_UNKNOWN +} + +type isGrpcLogEntry_Payload interface { + isGrpcLogEntry_Payload() +} + +type GrpcLogEntry_ClientHeader struct { + ClientHeader *ClientHeader `protobuf:"bytes,6,opt,name=client_header,json=clientHeader,proto3,oneof"` +} + +type GrpcLogEntry_ServerHeader struct { + ServerHeader *ServerHeader `protobuf:"bytes,7,opt,name=server_header,json=serverHeader,proto3,oneof"` +} + +type GrpcLogEntry_Message struct { + Message *Message `protobuf:"bytes,8,opt,name=message,proto3,oneof"` +} + +type GrpcLogEntry_Trailer struct { + Trailer *Trailer `protobuf:"bytes,9,opt,name=trailer,proto3,oneof"` +} + +func (*GrpcLogEntry_ClientHeader) isGrpcLogEntry_Payload() {} + +func (*GrpcLogEntry_ServerHeader) isGrpcLogEntry_Payload() {} + +func (*GrpcLogEntry_Message) isGrpcLogEntry_Payload() {} + +func (*GrpcLogEntry_Trailer) isGrpcLogEntry_Payload() {} + +func (m *GrpcLogEntry) GetPayload() isGrpcLogEntry_Payload { + if m != nil { + return m.Payload + } + return nil +} + +func (m *GrpcLogEntry) GetClientHeader() *ClientHeader { + if x, ok := m.GetPayload().(*GrpcLogEntry_ClientHeader); ok { + return x.ClientHeader + } + return nil +} + +func (m *GrpcLogEntry) GetServerHeader() *ServerHeader { + if x, ok := m.GetPayload().(*GrpcLogEntry_ServerHeader); ok { + return x.ServerHeader + } + return nil +} + +func (m *GrpcLogEntry) GetMessage() *Message { + if x, ok := m.GetPayload().(*GrpcLogEntry_Message); ok { + return x.Message + } + return nil +} + +func (m *GrpcLogEntry) GetTrailer() *Trailer { + if x, ok := m.GetPayload().(*GrpcLogEntry_Trailer); ok { + return x.Trailer + } + return nil +} + +func (m *GrpcLogEntry) GetPayloadTruncated() bool { + if m != nil { + return m.PayloadTruncated + } + return false +} + +func (m *GrpcLogEntry) GetPeer() *Address { + if m != nil { + return m.Peer + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*GrpcLogEntry) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _GrpcLogEntry_OneofMarshaler, _GrpcLogEntry_OneofUnmarshaler, _GrpcLogEntry_OneofSizer, []interface{}{ + (*GrpcLogEntry_ClientHeader)(nil), + (*GrpcLogEntry_ServerHeader)(nil), + (*GrpcLogEntry_Message)(nil), + (*GrpcLogEntry_Trailer)(nil), + } +} + +func _GrpcLogEntry_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*GrpcLogEntry) + // payload + switch x := m.Payload.(type) { + case *GrpcLogEntry_ClientHeader: + b.EncodeVarint(6<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ClientHeader); err != nil { + return err + } + case *GrpcLogEntry_ServerHeader: + b.EncodeVarint(7<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ServerHeader); err != nil { + return err + } + case *GrpcLogEntry_Message: + b.EncodeVarint(8<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Message); err != nil { + return err + } + case *GrpcLogEntry_Trailer: + b.EncodeVarint(9<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Trailer); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("GrpcLogEntry.Payload has unexpected type %T", x) + } + return nil +} + +func _GrpcLogEntry_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*GrpcLogEntry) + switch tag { + case 6: // payload.client_header + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ClientHeader) + err := b.DecodeMessage(msg) + m.Payload = &GrpcLogEntry_ClientHeader{msg} + return true, err + case 7: // payload.server_header + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ServerHeader) + err := b.DecodeMessage(msg) + m.Payload = &GrpcLogEntry_ServerHeader{msg} + return true, err + case 8: // payload.message + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Message) + err := b.DecodeMessage(msg) + m.Payload = &GrpcLogEntry_Message{msg} + return true, err + case 9: // payload.trailer + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Trailer) + err := b.DecodeMessage(msg) + m.Payload = &GrpcLogEntry_Trailer{msg} + return true, err + default: + return false, nil + } +} + +func _GrpcLogEntry_OneofSizer(msg proto.Message) (n int) { + m := msg.(*GrpcLogEntry) + // payload + switch x := m.Payload.(type) { + case *GrpcLogEntry_ClientHeader: + s := proto.Size(x.ClientHeader) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case *GrpcLogEntry_ServerHeader: + s := proto.Size(x.ServerHeader) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case *GrpcLogEntry_Message: + s := proto.Size(x.Message) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case *GrpcLogEntry_Trailer: + s := proto.Size(x.Trailer) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type ClientHeader struct { + // This contains only the metadata from the application. + Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + // The name of the RPC method, which looks something like: + // // + // Note the leading "/" character. + MethodName string `protobuf:"bytes,2,opt,name=method_name,json=methodName,proto3" json:"method_name,omitempty"` + // A single process may be used to run multiple virtual + // servers with different identities. + // The authority is the name of such a server identitiy. + // It is typically a portion of the URI in the form of + // or : . + Authority string `protobuf:"bytes,3,opt,name=authority,proto3" json:"authority,omitempty"` + // the RPC timeout + Timeout *duration.Duration `protobuf:"bytes,4,opt,name=timeout,proto3" json:"timeout,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ClientHeader) Reset() { *m = ClientHeader{} } +func (m *ClientHeader) String() string { return proto.CompactTextString(m) } +func (*ClientHeader) ProtoMessage() {} +func (*ClientHeader) Descriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{1} +} +func (m *ClientHeader) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ClientHeader.Unmarshal(m, b) +} +func (m *ClientHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ClientHeader.Marshal(b, m, deterministic) +} +func (dst *ClientHeader) XXX_Merge(src proto.Message) { + xxx_messageInfo_ClientHeader.Merge(dst, src) +} +func (m *ClientHeader) XXX_Size() int { + return xxx_messageInfo_ClientHeader.Size(m) +} +func (m *ClientHeader) XXX_DiscardUnknown() { + xxx_messageInfo_ClientHeader.DiscardUnknown(m) +} + +var xxx_messageInfo_ClientHeader proto.InternalMessageInfo + +func (m *ClientHeader) GetMetadata() *Metadata { + if m != nil { + return m.Metadata + } + return nil +} + +func (m *ClientHeader) GetMethodName() string { + if m != nil { + return m.MethodName + } + return "" +} + +func (m *ClientHeader) GetAuthority() string { + if m != nil { + return m.Authority + } + return "" +} + +func (m *ClientHeader) GetTimeout() *duration.Duration { + if m != nil { + return m.Timeout + } + return nil +} + +type ServerHeader struct { + // This contains only the metadata from the application. + Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServerHeader) Reset() { *m = ServerHeader{} } +func (m *ServerHeader) String() string { return proto.CompactTextString(m) } +func (*ServerHeader) ProtoMessage() {} +func (*ServerHeader) Descriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{2} +} +func (m *ServerHeader) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServerHeader.Unmarshal(m, b) +} +func (m *ServerHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServerHeader.Marshal(b, m, deterministic) +} +func (dst *ServerHeader) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServerHeader.Merge(dst, src) +} +func (m *ServerHeader) XXX_Size() int { + return xxx_messageInfo_ServerHeader.Size(m) +} +func (m *ServerHeader) XXX_DiscardUnknown() { + xxx_messageInfo_ServerHeader.DiscardUnknown(m) +} + +var xxx_messageInfo_ServerHeader proto.InternalMessageInfo + +func (m *ServerHeader) GetMetadata() *Metadata { + if m != nil { + return m.Metadata + } + return nil +} + +type Trailer struct { + // This contains only the metadata from the application. + Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + // The gRPC status code. + StatusCode uint32 `protobuf:"varint,2,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"` + // An original status message before any transport specific + // encoding. + StatusMessage string `protobuf:"bytes,3,opt,name=status_message,json=statusMessage,proto3" json:"status_message,omitempty"` + // The value of the 'grpc-status-details-bin' metadata key. If + // present, this is always an encoded 'google.rpc.Status' message. + StatusDetails []byte `protobuf:"bytes,4,opt,name=status_details,json=statusDetails,proto3" json:"status_details,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Trailer) Reset() { *m = Trailer{} } +func (m *Trailer) String() string { return proto.CompactTextString(m) } +func (*Trailer) ProtoMessage() {} +func (*Trailer) Descriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{3} +} +func (m *Trailer) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Trailer.Unmarshal(m, b) +} +func (m *Trailer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Trailer.Marshal(b, m, deterministic) +} +func (dst *Trailer) XXX_Merge(src proto.Message) { + xxx_messageInfo_Trailer.Merge(dst, src) +} +func (m *Trailer) XXX_Size() int { + return xxx_messageInfo_Trailer.Size(m) +} +func (m *Trailer) XXX_DiscardUnknown() { + xxx_messageInfo_Trailer.DiscardUnknown(m) +} + +var xxx_messageInfo_Trailer proto.InternalMessageInfo + +func (m *Trailer) GetMetadata() *Metadata { + if m != nil { + return m.Metadata + } + return nil +} + +func (m *Trailer) GetStatusCode() uint32 { + if m != nil { + return m.StatusCode + } + return 0 +} + +func (m *Trailer) GetStatusMessage() string { + if m != nil { + return m.StatusMessage + } + return "" +} + +func (m *Trailer) GetStatusDetails() []byte { + if m != nil { + return m.StatusDetails + } + return nil +} + +// Message payload, used by CLIENT_MESSAGE and SERVER_MESSAGE +type Message struct { + // Length of the message. It may not be the same as the length of the + // data field, as the logging payload can be truncated or omitted. + Length uint32 `protobuf:"varint,1,opt,name=length,proto3" json:"length,omitempty"` + // May be truncated or omitted. + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Message) Reset() { *m = Message{} } +func (m *Message) String() string { return proto.CompactTextString(m) } +func (*Message) ProtoMessage() {} +func (*Message) Descriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{4} +} +func (m *Message) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Message.Unmarshal(m, b) +} +func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Message.Marshal(b, m, deterministic) +} +func (dst *Message) XXX_Merge(src proto.Message) { + xxx_messageInfo_Message.Merge(dst, src) +} +func (m *Message) XXX_Size() int { + return xxx_messageInfo_Message.Size(m) +} +func (m *Message) XXX_DiscardUnknown() { + xxx_messageInfo_Message.DiscardUnknown(m) +} + +var xxx_messageInfo_Message proto.InternalMessageInfo + +func (m *Message) GetLength() uint32 { + if m != nil { + return m.Length + } + return 0 +} + +func (m *Message) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +// A list of metadata pairs, used in the payload of client header, +// server header, and server trailer. +// Implementations may omit some entries to honor the header limits +// of GRPC_BINARY_LOG_CONFIG. +// +// Header keys added by gRPC are omitted. To be more specific, +// implementations will not log the following entries, and this is +// not to be treated as a truncation: +// - entries handled by grpc that are not user visible, such as those +// that begin with 'grpc-' (with exception of grpc-trace-bin) +// or keys like 'lb-token' +// - transport specific entries, including but not limited to: +// ':path', ':authority', 'content-encoding', 'user-agent', 'te', etc +// - entries added for call credentials +// +// Implementations must always log grpc-trace-bin if it is present. +// Practically speaking it will only be visible on server side because +// grpc-trace-bin is managed by low level client side mechanisms +// inaccessible from the application level. On server side, the +// header is just a normal metadata key. +// The pair will not count towards the size limit. +type Metadata struct { + Entry []*MetadataEntry `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Metadata) Reset() { *m = Metadata{} } +func (m *Metadata) String() string { return proto.CompactTextString(m) } +func (*Metadata) ProtoMessage() {} +func (*Metadata) Descriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{5} +} +func (m *Metadata) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Metadata.Unmarshal(m, b) +} +func (m *Metadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Metadata.Marshal(b, m, deterministic) +} +func (dst *Metadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_Metadata.Merge(dst, src) +} +func (m *Metadata) XXX_Size() int { + return xxx_messageInfo_Metadata.Size(m) +} +func (m *Metadata) XXX_DiscardUnknown() { + xxx_messageInfo_Metadata.DiscardUnknown(m) +} + +var xxx_messageInfo_Metadata proto.InternalMessageInfo + +func (m *Metadata) GetEntry() []*MetadataEntry { + if m != nil { + return m.Entry + } + return nil +} + +// A metadata key value pair +type MetadataEntry struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MetadataEntry) Reset() { *m = MetadataEntry{} } +func (m *MetadataEntry) String() string { return proto.CompactTextString(m) } +func (*MetadataEntry) ProtoMessage() {} +func (*MetadataEntry) Descriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{6} +} +func (m *MetadataEntry) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MetadataEntry.Unmarshal(m, b) +} +func (m *MetadataEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MetadataEntry.Marshal(b, m, deterministic) +} +func (dst *MetadataEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_MetadataEntry.Merge(dst, src) +} +func (m *MetadataEntry) XXX_Size() int { + return xxx_messageInfo_MetadataEntry.Size(m) +} +func (m *MetadataEntry) XXX_DiscardUnknown() { + xxx_messageInfo_MetadataEntry.DiscardUnknown(m) +} + +var xxx_messageInfo_MetadataEntry proto.InternalMessageInfo + +func (m *MetadataEntry) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *MetadataEntry) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +// Address information +type Address struct { + Type Address_Type `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.binarylog.v1.Address_Type" json:"type,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + // only for TYPE_IPV4 and TYPE_IPV6 + IpPort uint32 `protobuf:"varint,3,opt,name=ip_port,json=ipPort,proto3" json:"ip_port,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Address) Reset() { *m = Address{} } +func (m *Address) String() string { return proto.CompactTextString(m) } +func (*Address) ProtoMessage() {} +func (*Address) Descriptor() ([]byte, []int) { + return fileDescriptor_binarylog_264c8c9c551ce911, []int{7} +} +func (m *Address) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Address.Unmarshal(m, b) +} +func (m *Address) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Address.Marshal(b, m, deterministic) +} +func (dst *Address) XXX_Merge(src proto.Message) { + xxx_messageInfo_Address.Merge(dst, src) +} +func (m *Address) XXX_Size() int { + return xxx_messageInfo_Address.Size(m) +} +func (m *Address) XXX_DiscardUnknown() { + xxx_messageInfo_Address.DiscardUnknown(m) +} + +var xxx_messageInfo_Address proto.InternalMessageInfo + +func (m *Address) GetType() Address_Type { + if m != nil { + return m.Type + } + return Address_TYPE_UNKNOWN +} + +func (m *Address) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *Address) GetIpPort() uint32 { + if m != nil { + return m.IpPort + } + return 0 +} + +func init() { + proto.RegisterType((*GrpcLogEntry)(nil), "grpc.binarylog.v1.GrpcLogEntry") + proto.RegisterType((*ClientHeader)(nil), "grpc.binarylog.v1.ClientHeader") + proto.RegisterType((*ServerHeader)(nil), "grpc.binarylog.v1.ServerHeader") + proto.RegisterType((*Trailer)(nil), "grpc.binarylog.v1.Trailer") + proto.RegisterType((*Message)(nil), "grpc.binarylog.v1.Message") + proto.RegisterType((*Metadata)(nil), "grpc.binarylog.v1.Metadata") + proto.RegisterType((*MetadataEntry)(nil), "grpc.binarylog.v1.MetadataEntry") + proto.RegisterType((*Address)(nil), "grpc.binarylog.v1.Address") + proto.RegisterEnum("grpc.binarylog.v1.GrpcLogEntry_EventType", GrpcLogEntry_EventType_name, GrpcLogEntry_EventType_value) + proto.RegisterEnum("grpc.binarylog.v1.GrpcLogEntry_Logger", GrpcLogEntry_Logger_name, GrpcLogEntry_Logger_value) + proto.RegisterEnum("grpc.binarylog.v1.Address_Type", Address_Type_name, Address_Type_value) +} + +func init() { + proto.RegisterFile("grpc/binarylog/grpc_binarylog_v1/binarylog.proto", fileDescriptor_binarylog_264c8c9c551ce911) +} + +var fileDescriptor_binarylog_264c8c9c551ce911 = []byte{ + // 900 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0x51, 0x6f, 0xe3, 0x44, + 0x10, 0x3e, 0x37, 0x69, 0xdc, 0x4c, 0x92, 0xca, 0x5d, 0x95, 0x3b, 0x5f, 0x29, 0x34, 0xb2, 0x04, + 0x0a, 0x42, 0x72, 0xb9, 0x94, 0xeb, 0xf1, 0x02, 0x52, 0x92, 0xfa, 0xd2, 0x88, 0x5c, 0x1a, 0x6d, + 0x72, 0x3d, 0x40, 0x48, 0xd6, 0x36, 0x5e, 0x1c, 0x0b, 0xc7, 0x6b, 0xd6, 0x9b, 0xa0, 0xfc, 0x2c, + 0xde, 0x90, 0xee, 0x77, 0xf1, 0x8e, 0xbc, 0x6b, 0x27, 0xa6, 0x69, 0x0f, 0x09, 0xde, 0x3c, 0xdf, + 0x7c, 0xf3, 0xcd, 0xee, 0x78, 0x66, 0x16, 0xbe, 0xf2, 0x79, 0x3c, 0x3b, 0xbf, 0x0b, 0x22, 0xc2, + 0xd7, 0x21, 0xf3, 0xcf, 0x53, 0xd3, 0xdd, 0x98, 0xee, 0xea, 0xc5, 0xd6, 0x67, 0xc7, 0x9c, 0x09, + 0x86, 0x8e, 0x52, 0x8a, 0xbd, 0x45, 0x57, 0x2f, 0x4e, 0x3e, 0xf5, 0x19, 0xf3, 0x43, 0x7a, 0x2e, + 0x09, 0x77, 0xcb, 0x5f, 0xce, 0xbd, 0x25, 0x27, 0x22, 0x60, 0x91, 0x0a, 0x39, 0x39, 0xbb, 0xef, + 0x17, 0xc1, 0x82, 0x26, 0x82, 0x2c, 0x62, 0x45, 0xb0, 0xde, 0xeb, 0x50, 0xef, 0xf3, 0x78, 0x36, + 0x64, 0xbe, 0x13, 0x09, 0xbe, 0x46, 0xdf, 0x40, 0x75, 0xc3, 0x31, 0xb5, 0xa6, 0xd6, 0xaa, 0xb5, + 0x4f, 0x6c, 0xa5, 0x62, 0xe7, 0x2a, 0xf6, 0x34, 0x67, 0xe0, 0x2d, 0x19, 0x3d, 0x03, 0x7d, 0x46, + 0xc2, 0xd0, 0x0d, 0x3c, 0x73, 0xaf, 0xa9, 0xb5, 0xca, 0xb8, 0x92, 0x9a, 0x03, 0x0f, 0xbd, 0x84, + 0x67, 0x09, 0xfd, 0x6d, 0x49, 0xa3, 0x19, 0x75, 0x03, 0xcf, 0xfd, 0x3d, 0x10, 0xf3, 0x20, 0x72, + 0x53, 0xa7, 0x59, 0x92, 0xc4, 0xe3, 0xdc, 0x3d, 0xf0, 0xde, 0x49, 0x67, 0x8f, 0x84, 0x21, 0xfa, + 0x16, 0xca, 0x62, 0x1d, 0x53, 0xb3, 0xdc, 0xd4, 0x5a, 0x87, 0xed, 0x2f, 0xec, 0x9d, 0xdb, 0xdb, + 0xc5, 0x83, 0xdb, 0xce, 0x8a, 0x46, 0x62, 0xba, 0x8e, 0x29, 0x96, 0x61, 0xe8, 0x3b, 0xa8, 0x84, + 0xcc, 0xf7, 0x29, 0x37, 0xf7, 0xa5, 0xc0, 0xe7, 0xff, 0x26, 0x30, 0x94, 0x6c, 0x9c, 0x45, 0xa1, + 0xd7, 0xd0, 0x98, 0x85, 0x01, 0x8d, 0x84, 0x3b, 0xa7, 0xc4, 0xa3, 0xdc, 0xac, 0xc8, 0x62, 0x9c, + 0x3d, 0x20, 0xd3, 0x93, 0xbc, 0x6b, 0x49, 0xbb, 0x7e, 0x82, 0xeb, 0xb3, 0x82, 0x9d, 0xea, 0x24, + 0x94, 0xaf, 0x28, 0xcf, 0x75, 0xf4, 0x47, 0x75, 0x26, 0x92, 0xb7, 0xd5, 0x49, 0x0a, 0x36, 0xba, + 0x04, 0x7d, 0x41, 0x93, 0x84, 0xf8, 0xd4, 0x3c, 0xc8, 0x7f, 0xcb, 0x8e, 0xc2, 0x1b, 0xc5, 0xb8, + 0x7e, 0x82, 0x73, 0x72, 0x1a, 0x27, 0x38, 0x09, 0x42, 0xca, 0xcd, 0xea, 0xa3, 0x71, 0x53, 0xc5, + 0x48, 0xe3, 0x32, 0x32, 0xfa, 0x12, 0x8e, 0x62, 0xb2, 0x0e, 0x19, 0xf1, 0x5c, 0xc1, 0x97, 0xd1, + 0x8c, 0x08, 0xea, 0x99, 0xd0, 0xd4, 0x5a, 0x07, 0xd8, 0xc8, 0x1c, 0xd3, 0x1c, 0x47, 0x36, 0x94, + 0x63, 0x4a, 0xb9, 0x59, 0x7b, 0x34, 0x43, 0xc7, 0xf3, 0x38, 0x4d, 0x12, 0x2c, 0x79, 0xd6, 0x5f, + 0x1a, 0x54, 0x37, 0x3f, 0x0c, 0x3d, 0x05, 0xe4, 0xdc, 0x3a, 0xa3, 0xa9, 0x3b, 0xfd, 0x71, 0xec, + 0xb8, 0x6f, 0x47, 0xdf, 0x8f, 0x6e, 0xde, 0x8d, 0x8c, 0x27, 0xe8, 0x14, 0xcc, 0x02, 0xde, 0x1b, + 0x0e, 0xd2, 0xef, 0x6b, 0xa7, 0x73, 0xe5, 0x60, 0x43, 0xbb, 0xe7, 0x9d, 0x38, 0xf8, 0xd6, 0xc1, + 0xb9, 0x77, 0x0f, 0x7d, 0x02, 0xcf, 0x77, 0x63, 0xdf, 0x38, 0x93, 0x49, 0xa7, 0xef, 0x18, 0xa5, + 0x7b, 0xee, 0x2c, 0x38, 0x77, 0x97, 0x51, 0x13, 0x4e, 0x1f, 0xc8, 0xdc, 0x19, 0xbe, 0x76, 0x7b, + 0xc3, 0x9b, 0x89, 0x63, 0xec, 0x3f, 0x2c, 0x30, 0xc5, 0x9d, 0xc1, 0xd0, 0xc1, 0x46, 0x05, 0x7d, + 0x04, 0x47, 0x45, 0x81, 0xce, 0xa8, 0xe7, 0x0c, 0x0d, 0xdd, 0xea, 0x42, 0x45, 0xb5, 0x19, 0x42, + 0x70, 0x38, 0xbc, 0xe9, 0xf7, 0x1d, 0x5c, 0xb8, 0xef, 0x11, 0x34, 0x32, 0x4c, 0x65, 0x34, 0xb4, + 0x02, 0xa4, 0x52, 0x18, 0x7b, 0xdd, 0x2a, 0xe8, 0x59, 0xfd, 0xad, 0xf7, 0x1a, 0xd4, 0x8b, 0xcd, + 0x87, 0x5e, 0xc1, 0xc1, 0x82, 0x0a, 0xe2, 0x11, 0x41, 0xb2, 0xe1, 0xfd, 0xf8, 0xc1, 0x2e, 0x51, + 0x14, 0xbc, 0x21, 0xa3, 0x33, 0xa8, 0x2d, 0xa8, 0x98, 0x33, 0xcf, 0x8d, 0xc8, 0x82, 0xca, 0x01, + 0xae, 0x62, 0x50, 0xd0, 0x88, 0x2c, 0x28, 0x3a, 0x85, 0x2a, 0x59, 0x8a, 0x39, 0xe3, 0x81, 0x58, + 0xcb, 0xb1, 0xad, 0xe2, 0x2d, 0x80, 0x2e, 0x40, 0x4f, 0x17, 0x01, 0x5b, 0x0a, 0x39, 0xae, 0xb5, + 0xf6, 0xf3, 0x9d, 0x9d, 0x71, 0x95, 0x6d, 0x26, 0x9c, 0x33, 0xad, 0x3e, 0xd4, 0x8b, 0x1d, 0xff, + 0x9f, 0x0f, 0x6f, 0xfd, 0xa1, 0x81, 0x9e, 0x75, 0xf0, 0xff, 0xaa, 0x40, 0x22, 0x88, 0x58, 0x26, + 0xee, 0x8c, 0x79, 0xaa, 0x02, 0x0d, 0x0c, 0x0a, 0xea, 0x31, 0x8f, 0xa2, 0xcf, 0xe0, 0x30, 0x23, + 0xe4, 0x73, 0xa8, 0xca, 0xd0, 0x50, 0x68, 0x36, 0x7a, 0x05, 0x9a, 0x47, 0x05, 0x09, 0xc2, 0x44, + 0x56, 0xa4, 0x9e, 0xd3, 0xae, 0x14, 0x68, 0xbd, 0x04, 0x3d, 0x8f, 0x78, 0x0a, 0x95, 0x90, 0x46, + 0xbe, 0x98, 0xcb, 0x03, 0x37, 0x70, 0x66, 0x21, 0x04, 0x65, 0x79, 0x8d, 0x3d, 0x19, 0x2f, 0xbf, + 0xad, 0x2e, 0x1c, 0xe4, 0x67, 0x47, 0x97, 0xb0, 0x4f, 0xd3, 0xcd, 0x65, 0x6a, 0xcd, 0x52, 0xab, + 0xd6, 0x6e, 0x7e, 0xe0, 0x9e, 0x72, 0xc3, 0x61, 0x45, 0xb7, 0x5e, 0x41, 0xe3, 0x1f, 0x38, 0x32, + 0xa0, 0xf4, 0x2b, 0x5d, 0xcb, 0xec, 0x55, 0x9c, 0x7e, 0xa2, 0x63, 0xd8, 0x5f, 0x91, 0x70, 0x49, + 0xb3, 0xdc, 0xca, 0xb0, 0xfe, 0xd4, 0x40, 0xcf, 0xe6, 0x18, 0x5d, 0x64, 0xdb, 0x59, 0x93, 0xcb, + 0xf5, 0xec, 0xf1, 0x89, 0xb7, 0x0b, 0x3b, 0xd9, 0x04, 0x9d, 0x28, 0x34, 0xeb, 0xb0, 0xdc, 0x4c, + 0x1f, 0x8f, 0x20, 0x76, 0x63, 0xc6, 0x85, 0xac, 0x6a, 0x03, 0x57, 0x82, 0x78, 0xcc, 0xb8, 0xb0, + 0x1c, 0x28, 0xcb, 0x1d, 0x61, 0x40, 0xfd, 0xde, 0x76, 0x68, 0x40, 0x55, 0x22, 0x83, 0xf1, 0xed, + 0xd7, 0x86, 0x56, 0x34, 0x2f, 0x8d, 0xbd, 0x8d, 0xf9, 0x76, 0x34, 0xf8, 0xc1, 0x28, 0x75, 0x7f, + 0x86, 0xe3, 0x80, 0xed, 0x1e, 0xb2, 0x7b, 0xd8, 0x95, 0xd6, 0x90, 0xf9, 0xe3, 0xb4, 0x51, 0xc7, + 0xda, 0x4f, 0xed, 0xac, 0x71, 0x7d, 0x16, 0x92, 0xc8, 0xb7, 0x19, 0x57, 0x4f, 0xf3, 0x87, 0x5e, + 0xea, 0xbb, 0x8a, 0xec, 0xf2, 0x8b, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xe7, 0xf6, 0x4b, 0x50, + 0xd4, 0x07, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/grpc/call.go b/vendor/google.golang.org/grpc/call.go new file mode 100644 index 00000000..9e20e4d3 --- /dev/null +++ b/vendor/google.golang.org/grpc/call.go @@ -0,0 +1,74 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "context" +) + +// Invoke sends the RPC request on the wire and returns after response is +// received. This is typically called by generated code. +// +// All errors returned by Invoke are compatible with the status package. +func (cc *ClientConn) Invoke(ctx context.Context, method string, args, reply interface{}, opts ...CallOption) error { + // allow interceptor to see all applicable call options, which means those + // configured as defaults from dial option as well as per-call options + opts = combine(cc.dopts.callOptions, opts) + + if cc.dopts.unaryInt != nil { + return cc.dopts.unaryInt(ctx, method, args, reply, cc, invoke, opts...) + } + return invoke(ctx, method, args, reply, cc, opts...) +} + +func combine(o1 []CallOption, o2 []CallOption) []CallOption { + // we don't use append because o1 could have extra capacity whose + // elements would be overwritten, which could cause inadvertent + // sharing (and race conditions) between concurrent calls + if len(o1) == 0 { + return o2 + } else if len(o2) == 0 { + return o1 + } + ret := make([]CallOption, len(o1)+len(o2)) + copy(ret, o1) + copy(ret[len(o1):], o2) + return ret +} + +// Invoke sends the RPC request on the wire and returns after response is +// received. This is typically called by generated code. +// +// DEPRECATED: Use ClientConn.Invoke instead. +func Invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) error { + return cc.Invoke(ctx, method, args, reply, opts...) +} + +var unaryStreamDesc = &StreamDesc{ServerStreams: false, ClientStreams: false} + +func invoke(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, opts ...CallOption) error { + cs, err := newClientStream(ctx, unaryStreamDesc, cc, method, opts...) + if err != nil { + return err + } + if err := cs.SendMsg(req); err != nil { + return err + } + return cs.RecvMsg(reply) +} diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go new file mode 100644 index 00000000..0740693b --- /dev/null +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -0,0 +1,1534 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "context" + "errors" + "fmt" + "math" + "net" + "reflect" + "strings" + "sync" + "sync/atomic" + "time" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/base" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/internal/backoff" + "google.golang.org/grpc/internal/channelz" + "google.golang.org/grpc/internal/grpcsync" + "google.golang.org/grpc/internal/grpcutil" + "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/serviceconfig" + "google.golang.org/grpc/status" + + _ "google.golang.org/grpc/balancer/roundrobin" // To register roundrobin. + _ "google.golang.org/grpc/internal/resolver/dns" // To register dns resolver. + _ "google.golang.org/grpc/internal/resolver/passthrough" // To register passthrough resolver. +) + +const ( + // minimum time to give a connection to complete + minConnectTimeout = 20 * time.Second + // must match grpclbName in grpclb/grpclb.go + grpclbName = "grpclb" +) + +var ( + // ErrClientConnClosing indicates that the operation is illegal because + // the ClientConn is closing. + // + // Deprecated: this error should not be relied upon by users; use the status + // code of Canceled instead. + ErrClientConnClosing = status.Error(codes.Canceled, "grpc: the client connection is closing") + // errConnDrain indicates that the connection starts to be drained and does not accept any new RPCs. + errConnDrain = errors.New("grpc: the connection is drained") + // errConnClosing indicates that the connection is closing. + errConnClosing = errors.New("grpc: the connection is closing") + // errBalancerClosed indicates that the balancer is closed. + errBalancerClosed = errors.New("grpc: balancer is closed") + // invalidDefaultServiceConfigErrPrefix is used to prefix the json parsing error for the default + // service config. + invalidDefaultServiceConfigErrPrefix = "grpc: the provided default service config is invalid" +) + +// The following errors are returned from Dial and DialContext +var ( + // errNoTransportSecurity indicates that there is no transport security + // being set for ClientConn. Users should either set one or explicitly + // call WithInsecure DialOption to disable security. + errNoTransportSecurity = errors.New("grpc: no transport security set (use grpc.WithInsecure() explicitly or set credentials)") + // errTransportCredsAndBundle indicates that creds bundle is used together + // with other individual Transport Credentials. + errTransportCredsAndBundle = errors.New("grpc: credentials.Bundle may not be used with individual TransportCredentials") + // errTransportCredentialsMissing indicates that users want to transmit security + // information (e.g., OAuth2 token) which requires secure connection on an insecure + // connection. + errTransportCredentialsMissing = errors.New("grpc: the credentials require transport level security (use grpc.WithTransportCredentials() to set)") + // errCredentialsConflict indicates that grpc.WithTransportCredentials() + // and grpc.WithInsecure() are both called for a connection. + errCredentialsConflict = errors.New("grpc: transport credentials are set for an insecure connection (grpc.WithTransportCredentials() and grpc.WithInsecure() are both called)") +) + +const ( + defaultClientMaxReceiveMessageSize = 1024 * 1024 * 4 + defaultClientMaxSendMessageSize = math.MaxInt32 + // http2IOBufSize specifies the buffer size for sending frames. + defaultWriteBufSize = 32 * 1024 + defaultReadBufSize = 32 * 1024 +) + +// Dial creates a client connection to the given target. +func Dial(target string, opts ...DialOption) (*ClientConn, error) { + return DialContext(context.Background(), target, opts...) +} + +// DialContext creates a client connection to the given target. By default, it's +// a non-blocking dial (the function won't wait for connections to be +// established, and connecting happens in the background). To make it a blocking +// dial, use WithBlock() dial option. +// +// In the non-blocking case, the ctx does not act against the connection. It +// only controls the setup steps. +// +// In the blocking case, ctx can be used to cancel or expire the pending +// connection. Once this function returns, the cancellation and expiration of +// ctx will be noop. Users should call ClientConn.Close to terminate all the +// pending operations after this function returns. +// +// The target name syntax is defined in +// https://github.com/grpc/grpc/blob/master/doc/naming.md. +// e.g. to use dns resolver, a "dns:///" prefix should be applied to the target. +func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) { + cc := &ClientConn{ + target: target, + csMgr: &connectivityStateManager{}, + conns: make(map[*addrConn]struct{}), + dopts: defaultDialOptions(), + blockingpicker: newPickerWrapper(), + czData: new(channelzData), + firstResolveEvent: grpcsync.NewEvent(), + } + cc.retryThrottler.Store((*retryThrottler)(nil)) + cc.ctx, cc.cancel = context.WithCancel(context.Background()) + + for _, opt := range opts { + opt.apply(&cc.dopts) + } + + chainUnaryClientInterceptors(cc) + chainStreamClientInterceptors(cc) + + defer func() { + if err != nil { + cc.Close() + } + }() + + if channelz.IsOn() { + if cc.dopts.channelzParentID != 0 { + cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, cc.dopts.channelzParentID, target) + channelz.AddTraceEvent(cc.channelzID, 0, &channelz.TraceEventDesc{ + Desc: "Channel Created", + Severity: channelz.CtINFO, + Parent: &channelz.TraceEventDesc{ + Desc: fmt.Sprintf("Nested Channel(id:%d) created", cc.channelzID), + Severity: channelz.CtINFO, + }, + }) + } else { + cc.channelzID = channelz.RegisterChannel(&channelzChannel{cc}, 0, target) + channelz.Info(cc.channelzID, "Channel Created") + } + cc.csMgr.channelzID = cc.channelzID + } + + if !cc.dopts.insecure { + if cc.dopts.copts.TransportCredentials == nil && cc.dopts.copts.CredsBundle == nil { + return nil, errNoTransportSecurity + } + if cc.dopts.copts.TransportCredentials != nil && cc.dopts.copts.CredsBundle != nil { + return nil, errTransportCredsAndBundle + } + } else { + if cc.dopts.copts.TransportCredentials != nil || cc.dopts.copts.CredsBundle != nil { + return nil, errCredentialsConflict + } + for _, cd := range cc.dopts.copts.PerRPCCredentials { + if cd.RequireTransportSecurity() { + return nil, errTransportCredentialsMissing + } + } + } + + if cc.dopts.defaultServiceConfigRawJSON != nil { + scpr := parseServiceConfig(*cc.dopts.defaultServiceConfigRawJSON) + if scpr.Err != nil { + return nil, fmt.Errorf("%s: %v", invalidDefaultServiceConfigErrPrefix, scpr.Err) + } + cc.dopts.defaultServiceConfig, _ = scpr.Config.(*ServiceConfig) + } + cc.mkp = cc.dopts.copts.KeepaliveParams + + if cc.dopts.copts.Dialer == nil { + cc.dopts.copts.Dialer = func(ctx context.Context, addr string) (net.Conn, error) { + network, addr := parseDialTarget(addr) + return (&net.Dialer{}).DialContext(ctx, network, addr) + } + if cc.dopts.withProxy { + cc.dopts.copts.Dialer = newProxyDialer(cc.dopts.copts.Dialer) + } + } + + if cc.dopts.copts.UserAgent != "" { + cc.dopts.copts.UserAgent += " " + grpcUA + } else { + cc.dopts.copts.UserAgent = grpcUA + } + + if cc.dopts.timeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, cc.dopts.timeout) + defer cancel() + } + defer func() { + select { + case <-ctx.Done(): + conn, err = nil, ctx.Err() + default: + } + }() + + scSet := false + if cc.dopts.scChan != nil { + // Try to get an initial service config. + select { + case sc, ok := <-cc.dopts.scChan: + if ok { + cc.sc = &sc + scSet = true + } + default: + } + } + if cc.dopts.bs == nil { + cc.dopts.bs = backoff.DefaultExponential + } + + // Determine the resolver to use. + cc.parsedTarget = grpcutil.ParseTarget(cc.target) + channelz.Infof(cc.channelzID, "parsed scheme: %q", cc.parsedTarget.Scheme) + resolverBuilder := cc.getResolver(cc.parsedTarget.Scheme) + if resolverBuilder == nil { + // If resolver builder is still nil, the parsed target's scheme is + // not registered. Fallback to default resolver and set Endpoint to + // the original target. + channelz.Infof(cc.channelzID, "scheme %q not registered, fallback to default scheme", cc.parsedTarget.Scheme) + cc.parsedTarget = resolver.Target{ + Scheme: resolver.GetDefaultScheme(), + Endpoint: target, + } + resolverBuilder = cc.getResolver(cc.parsedTarget.Scheme) + if resolverBuilder == nil { + return nil, fmt.Errorf("could not get resolver for default scheme: %q", cc.parsedTarget.Scheme) + } + } + + creds := cc.dopts.copts.TransportCredentials + if creds != nil && creds.Info().ServerName != "" { + cc.authority = creds.Info().ServerName + } else if cc.dopts.insecure && cc.dopts.authority != "" { + cc.authority = cc.dopts.authority + } else { + // Use endpoint from "scheme://authority/endpoint" as the default + // authority for ClientConn. + cc.authority = cc.parsedTarget.Endpoint + } + + if cc.dopts.scChan != nil && !scSet { + // Blocking wait for the initial service config. + select { + case sc, ok := <-cc.dopts.scChan: + if ok { + cc.sc = &sc + } + case <-ctx.Done(): + return nil, ctx.Err() + } + } + if cc.dopts.scChan != nil { + go cc.scWatcher() + } + + var credsClone credentials.TransportCredentials + if creds := cc.dopts.copts.TransportCredentials; creds != nil { + credsClone = creds.Clone() + } + cc.balancerBuildOpts = balancer.BuildOptions{ + DialCreds: credsClone, + CredsBundle: cc.dopts.copts.CredsBundle, + Dialer: cc.dopts.copts.Dialer, + ChannelzParentID: cc.channelzID, + Target: cc.parsedTarget, + } + + // Build the resolver. + rWrapper, err := newCCResolverWrapper(cc, resolverBuilder) + if err != nil { + return nil, fmt.Errorf("failed to build resolver: %v", err) + } + cc.mu.Lock() + cc.resolverWrapper = rWrapper + cc.mu.Unlock() + + // A blocking dial blocks until the clientConn is ready. + if cc.dopts.block { + for { + s := cc.GetState() + if s == connectivity.Ready { + break + } else if cc.dopts.copts.FailOnNonTempDialError && s == connectivity.TransientFailure { + if err = cc.blockingpicker.connectionError(); err != nil { + terr, ok := err.(interface { + Temporary() bool + }) + if ok && !terr.Temporary() { + return nil, err + } + } + } + if !cc.WaitForStateChange(ctx, s) { + // ctx got timeout or canceled. + return nil, ctx.Err() + } + } + } + + return cc, nil +} + +// chainUnaryClientInterceptors chains all unary client interceptors into one. +func chainUnaryClientInterceptors(cc *ClientConn) { + interceptors := cc.dopts.chainUnaryInts + // Prepend dopts.unaryInt to the chaining interceptors if it exists, since unaryInt will + // be executed before any other chained interceptors. + if cc.dopts.unaryInt != nil { + interceptors = append([]UnaryClientInterceptor{cc.dopts.unaryInt}, interceptors...) + } + var chainedInt UnaryClientInterceptor + if len(interceptors) == 0 { + chainedInt = nil + } else if len(interceptors) == 1 { + chainedInt = interceptors[0] + } else { + chainedInt = func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, invoker UnaryInvoker, opts ...CallOption) error { + return interceptors[0](ctx, method, req, reply, cc, getChainUnaryInvoker(interceptors, 0, invoker), opts...) + } + } + cc.dopts.unaryInt = chainedInt +} + +// getChainUnaryInvoker recursively generate the chained unary invoker. +func getChainUnaryInvoker(interceptors []UnaryClientInterceptor, curr int, finalInvoker UnaryInvoker) UnaryInvoker { + if curr == len(interceptors)-1 { + return finalInvoker + } + return func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, opts ...CallOption) error { + return interceptors[curr+1](ctx, method, req, reply, cc, getChainUnaryInvoker(interceptors, curr+1, finalInvoker), opts...) + } +} + +// chainStreamClientInterceptors chains all stream client interceptors into one. +func chainStreamClientInterceptors(cc *ClientConn) { + interceptors := cc.dopts.chainStreamInts + // Prepend dopts.streamInt to the chaining interceptors if it exists, since streamInt will + // be executed before any other chained interceptors. + if cc.dopts.streamInt != nil { + interceptors = append([]StreamClientInterceptor{cc.dopts.streamInt}, interceptors...) + } + var chainedInt StreamClientInterceptor + if len(interceptors) == 0 { + chainedInt = nil + } else if len(interceptors) == 1 { + chainedInt = interceptors[0] + } else { + chainedInt = func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, streamer Streamer, opts ...CallOption) (ClientStream, error) { + return interceptors[0](ctx, desc, cc, method, getChainStreamer(interceptors, 0, streamer), opts...) + } + } + cc.dopts.streamInt = chainedInt +} + +// getChainStreamer recursively generate the chained client stream constructor. +func getChainStreamer(interceptors []StreamClientInterceptor, curr int, finalStreamer Streamer) Streamer { + if curr == len(interceptors)-1 { + return finalStreamer + } + return func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (ClientStream, error) { + return interceptors[curr+1](ctx, desc, cc, method, getChainStreamer(interceptors, curr+1, finalStreamer), opts...) + } +} + +// connectivityStateManager keeps the connectivity.State of ClientConn. +// This struct will eventually be exported so the balancers can access it. +type connectivityStateManager struct { + mu sync.Mutex + state connectivity.State + notifyChan chan struct{} + channelzID int64 +} + +// updateState updates the connectivity.State of ClientConn. +// If there's a change it notifies goroutines waiting on state change to +// happen. +func (csm *connectivityStateManager) updateState(state connectivity.State) { + csm.mu.Lock() + defer csm.mu.Unlock() + if csm.state == connectivity.Shutdown { + return + } + if csm.state == state { + return + } + csm.state = state + channelz.Infof(csm.channelzID, "Channel Connectivity change to %v", state) + if csm.notifyChan != nil { + // There are other goroutines waiting on this channel. + close(csm.notifyChan) + csm.notifyChan = nil + } +} + +func (csm *connectivityStateManager) getState() connectivity.State { + csm.mu.Lock() + defer csm.mu.Unlock() + return csm.state +} + +func (csm *connectivityStateManager) getNotifyChan() <-chan struct{} { + csm.mu.Lock() + defer csm.mu.Unlock() + if csm.notifyChan == nil { + csm.notifyChan = make(chan struct{}) + } + return csm.notifyChan +} + +// ClientConnInterface defines the functions clients need to perform unary and +// streaming RPCs. It is implemented by *ClientConn, and is only intended to +// be referenced by generated code. +type ClientConnInterface interface { + // Invoke performs a unary RPC and returns after the response is received + // into reply. + Invoke(ctx context.Context, method string, args interface{}, reply interface{}, opts ...CallOption) error + // NewStream begins a streaming RPC. + NewStream(ctx context.Context, desc *StreamDesc, method string, opts ...CallOption) (ClientStream, error) +} + +// Assert *ClientConn implements ClientConnInterface. +var _ ClientConnInterface = (*ClientConn)(nil) + +// ClientConn represents a virtual connection to a conceptual endpoint, to +// perform RPCs. +// +// A ClientConn is free to have zero or more actual connections to the endpoint +// based on configuration, load, etc. It is also free to determine which actual +// endpoints to use and may change it every RPC, permitting client-side load +// balancing. +// +// A ClientConn encapsulates a range of functionality including name +// resolution, TCP connection establishment (with retries and backoff) and TLS +// handshakes. It also handles errors on established connections by +// re-resolving the name and reconnecting. +type ClientConn struct { + ctx context.Context + cancel context.CancelFunc + + target string + parsedTarget resolver.Target + authority string + dopts dialOptions + csMgr *connectivityStateManager + + balancerBuildOpts balancer.BuildOptions + blockingpicker *pickerWrapper + + mu sync.RWMutex + resolverWrapper *ccResolverWrapper + sc *ServiceConfig + conns map[*addrConn]struct{} + // Keepalive parameter can be updated if a GoAway is received. + mkp keepalive.ClientParameters + curBalancerName string + balancerWrapper *ccBalancerWrapper + retryThrottler atomic.Value + + firstResolveEvent *grpcsync.Event + + channelzID int64 // channelz unique identification number + czData *channelzData +} + +// WaitForStateChange waits until the connectivity.State of ClientConn changes from sourceState or +// ctx expires. A true value is returned in former case and false in latter. +// This is an EXPERIMENTAL API. +func (cc *ClientConn) WaitForStateChange(ctx context.Context, sourceState connectivity.State) bool { + ch := cc.csMgr.getNotifyChan() + if cc.csMgr.getState() != sourceState { + return true + } + select { + case <-ctx.Done(): + return false + case <-ch: + return true + } +} + +// GetState returns the connectivity.State of ClientConn. +// This is an EXPERIMENTAL API. +func (cc *ClientConn) GetState() connectivity.State { + return cc.csMgr.getState() +} + +func (cc *ClientConn) scWatcher() { + for { + select { + case sc, ok := <-cc.dopts.scChan: + if !ok { + return + } + cc.mu.Lock() + // TODO: load balance policy runtime change is ignored. + // We may revisit this decision in the future. + cc.sc = &sc + cc.mu.Unlock() + case <-cc.ctx.Done(): + return + } + } +} + +// waitForResolvedAddrs blocks until the resolver has provided addresses or the +// context expires. Returns nil unless the context expires first; otherwise +// returns a status error based on the context. +func (cc *ClientConn) waitForResolvedAddrs(ctx context.Context) error { + // This is on the RPC path, so we use a fast path to avoid the + // more-expensive "select" below after the resolver has returned once. + if cc.firstResolveEvent.HasFired() { + return nil + } + select { + case <-cc.firstResolveEvent.Done(): + return nil + case <-ctx.Done(): + return status.FromContextError(ctx.Err()).Err() + case <-cc.ctx.Done(): + return ErrClientConnClosing + } +} + +var emptyServiceConfig *ServiceConfig + +func init() { + cfg := parseServiceConfig("{}") + if cfg.Err != nil { + panic(fmt.Sprintf("impossible error parsing empty service config: %v", cfg.Err)) + } + emptyServiceConfig = cfg.Config.(*ServiceConfig) +} + +func (cc *ClientConn) maybeApplyDefaultServiceConfig(addrs []resolver.Address) { + if cc.sc != nil { + cc.applyServiceConfigAndBalancer(cc.sc, addrs) + return + } + if cc.dopts.defaultServiceConfig != nil { + cc.applyServiceConfigAndBalancer(cc.dopts.defaultServiceConfig, addrs) + } else { + cc.applyServiceConfigAndBalancer(emptyServiceConfig, addrs) + } +} + +func (cc *ClientConn) updateResolverState(s resolver.State, err error) error { + defer cc.firstResolveEvent.Fire() + cc.mu.Lock() + // Check if the ClientConn is already closed. Some fields (e.g. + // balancerWrapper) are set to nil when closing the ClientConn, and could + // cause nil pointer panic if we don't have this check. + if cc.conns == nil { + cc.mu.Unlock() + return nil + } + + if err != nil { + // May need to apply the initial service config in case the resolver + // doesn't support service configs, or doesn't provide a service config + // with the new addresses. + cc.maybeApplyDefaultServiceConfig(nil) + + if cc.balancerWrapper != nil { + cc.balancerWrapper.resolverError(err) + } + + // No addresses are valid with err set; return early. + cc.mu.Unlock() + return balancer.ErrBadResolverState + } + + var ret error + if cc.dopts.disableServiceConfig || s.ServiceConfig == nil { + cc.maybeApplyDefaultServiceConfig(s.Addresses) + // TODO: do we need to apply a failing LB policy if there is no + // default, per the error handling design? + } else { + if sc, ok := s.ServiceConfig.Config.(*ServiceConfig); s.ServiceConfig.Err == nil && ok { + cc.applyServiceConfigAndBalancer(sc, s.Addresses) + } else { + ret = balancer.ErrBadResolverState + if cc.balancerWrapper == nil { + var err error + if s.ServiceConfig.Err != nil { + err = status.Errorf(codes.Unavailable, "error parsing service config: %v", s.ServiceConfig.Err) + } else { + err = status.Errorf(codes.Unavailable, "illegal service config type: %T", s.ServiceConfig.Config) + } + cc.blockingpicker.updatePicker(base.NewErrPicker(err)) + cc.csMgr.updateState(connectivity.TransientFailure) + cc.mu.Unlock() + return ret + } + } + } + + var balCfg serviceconfig.LoadBalancingConfig + if cc.dopts.balancerBuilder == nil && cc.sc != nil && cc.sc.lbConfig != nil { + balCfg = cc.sc.lbConfig.cfg + } + + cbn := cc.curBalancerName + bw := cc.balancerWrapper + cc.mu.Unlock() + if cbn != grpclbName { + // Filter any grpclb addresses since we don't have the grpclb balancer. + for i := 0; i < len(s.Addresses); { + if s.Addresses[i].Type == resolver.GRPCLB { + copy(s.Addresses[i:], s.Addresses[i+1:]) + s.Addresses = s.Addresses[:len(s.Addresses)-1] + continue + } + i++ + } + } + uccsErr := bw.updateClientConnState(&balancer.ClientConnState{ResolverState: s, BalancerConfig: balCfg}) + if ret == nil { + ret = uccsErr // prefer ErrBadResolver state since any other error is + // currently meaningless to the caller. + } + return ret +} + +// switchBalancer starts the switching from current balancer to the balancer +// with the given name. +// +// It will NOT send the current address list to the new balancer. If needed, +// caller of this function should send address list to the new balancer after +// this function returns. +// +// Caller must hold cc.mu. +func (cc *ClientConn) switchBalancer(name string) { + if strings.EqualFold(cc.curBalancerName, name) { + return + } + + channelz.Infof(cc.channelzID, "ClientConn switching balancer to %q", name) + if cc.dopts.balancerBuilder != nil { + channelz.Info(cc.channelzID, "ignoring balancer switching: Balancer DialOption used instead") + return + } + if cc.balancerWrapper != nil { + cc.balancerWrapper.close() + } + + builder := balancer.Get(name) + if builder == nil { + channelz.Warningf(cc.channelzID, "Channel switches to new LB policy %q due to fallback from invalid balancer name", PickFirstBalancerName) + channelz.Infof(cc.channelzID, "failed to get balancer builder for: %v, using pick_first instead", name) + builder = newPickfirstBuilder() + } else { + channelz.Infof(cc.channelzID, "Channel switches to new LB policy %q", name) + } + + cc.curBalancerName = builder.Name() + cc.balancerWrapper = newCCBalancerWrapper(cc, builder, cc.balancerBuildOpts) +} + +func (cc *ClientConn) handleSubConnStateChange(sc balancer.SubConn, s connectivity.State, err error) { + cc.mu.Lock() + if cc.conns == nil { + cc.mu.Unlock() + return + } + // TODO(bar switching) send updates to all balancer wrappers when balancer + // gracefully switching is supported. + cc.balancerWrapper.handleSubConnStateChange(sc, s, err) + cc.mu.Unlock() +} + +// newAddrConn creates an addrConn for addrs and adds it to cc.conns. +// +// Caller needs to make sure len(addrs) > 0. +func (cc *ClientConn) newAddrConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (*addrConn, error) { + ac := &addrConn{ + state: connectivity.Idle, + cc: cc, + addrs: addrs, + scopts: opts, + dopts: cc.dopts, + czData: new(channelzData), + resetBackoff: make(chan struct{}), + } + ac.ctx, ac.cancel = context.WithCancel(cc.ctx) + // Track ac in cc. This needs to be done before any getTransport(...) is called. + cc.mu.Lock() + if cc.conns == nil { + cc.mu.Unlock() + return nil, ErrClientConnClosing + } + if channelz.IsOn() { + ac.channelzID = channelz.RegisterSubChannel(ac, cc.channelzID, "") + channelz.AddTraceEvent(ac.channelzID, 0, &channelz.TraceEventDesc{ + Desc: "Subchannel Created", + Severity: channelz.CtINFO, + Parent: &channelz.TraceEventDesc{ + Desc: fmt.Sprintf("Subchannel(id:%d) created", ac.channelzID), + Severity: channelz.CtINFO, + }, + }) + } + cc.conns[ac] = struct{}{} + cc.mu.Unlock() + return ac, nil +} + +// removeAddrConn removes the addrConn in the subConn from clientConn. +// It also tears down the ac with the given error. +func (cc *ClientConn) removeAddrConn(ac *addrConn, err error) { + cc.mu.Lock() + if cc.conns == nil { + cc.mu.Unlock() + return + } + delete(cc.conns, ac) + cc.mu.Unlock() + ac.tearDown(err) +} + +func (cc *ClientConn) channelzMetric() *channelz.ChannelInternalMetric { + return &channelz.ChannelInternalMetric{ + State: cc.GetState(), + Target: cc.target, + CallsStarted: atomic.LoadInt64(&cc.czData.callsStarted), + CallsSucceeded: atomic.LoadInt64(&cc.czData.callsSucceeded), + CallsFailed: atomic.LoadInt64(&cc.czData.callsFailed), + LastCallStartedTimestamp: time.Unix(0, atomic.LoadInt64(&cc.czData.lastCallStartedTime)), + } +} + +// Target returns the target string of the ClientConn. +// This is an EXPERIMENTAL API. +func (cc *ClientConn) Target() string { + return cc.target +} + +func (cc *ClientConn) incrCallsStarted() { + atomic.AddInt64(&cc.czData.callsStarted, 1) + atomic.StoreInt64(&cc.czData.lastCallStartedTime, time.Now().UnixNano()) +} + +func (cc *ClientConn) incrCallsSucceeded() { + atomic.AddInt64(&cc.czData.callsSucceeded, 1) +} + +func (cc *ClientConn) incrCallsFailed() { + atomic.AddInt64(&cc.czData.callsFailed, 1) +} + +// connect starts creating a transport. +// It does nothing if the ac is not IDLE. +// TODO(bar) Move this to the addrConn section. +func (ac *addrConn) connect() error { + ac.mu.Lock() + if ac.state == connectivity.Shutdown { + ac.mu.Unlock() + return errConnClosing + } + if ac.state != connectivity.Idle { + ac.mu.Unlock() + return nil + } + // Update connectivity state within the lock to prevent subsequent or + // concurrent calls from resetting the transport more than once. + ac.updateConnectivityState(connectivity.Connecting, nil) + ac.mu.Unlock() + + // Start a goroutine connecting to the server asynchronously. + go ac.resetTransport() + return nil +} + +// tryUpdateAddrs tries to update ac.addrs with the new addresses list. +// +// If ac is Connecting, it returns false. The caller should tear down the ac and +// create a new one. Note that the backoff will be reset when this happens. +// +// If ac is TransientFailure, it updates ac.addrs and returns true. The updated +// addresses will be picked up by retry in the next iteration after backoff. +// +// If ac is Shutdown or Idle, it updates ac.addrs and returns true. +// +// If ac is Ready, it checks whether current connected address of ac is in the +// new addrs list. +// - If true, it updates ac.addrs and returns true. The ac will keep using +// the existing connection. +// - If false, it does nothing and returns false. +func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool { + ac.mu.Lock() + defer ac.mu.Unlock() + channelz.Infof(ac.channelzID, "addrConn: tryUpdateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs) + if ac.state == connectivity.Shutdown || + ac.state == connectivity.TransientFailure || + ac.state == connectivity.Idle { + ac.addrs = addrs + return true + } + + if ac.state == connectivity.Connecting { + return false + } + + // ac.state is Ready, try to find the connected address. + var curAddrFound bool + for _, a := range addrs { + if reflect.DeepEqual(ac.curAddr, a) { + curAddrFound = true + break + } + } + channelz.Infof(ac.channelzID, "addrConn: tryUpdateAddrs curAddrFound: %v", curAddrFound) + if curAddrFound { + ac.addrs = addrs + } + + return curAddrFound +} + +// GetMethodConfig gets the method config of the input method. +// If there's an exact match for input method (i.e. /service/method), we return +// the corresponding MethodConfig. +// If there isn't an exact match for the input method, we look for the default config +// under the service (i.e /service/). If there is a default MethodConfig for +// the service, we return it. +// Otherwise, we return an empty MethodConfig. +func (cc *ClientConn) GetMethodConfig(method string) MethodConfig { + // TODO: Avoid the locking here. + cc.mu.RLock() + defer cc.mu.RUnlock() + if cc.sc == nil { + return MethodConfig{} + } + m, ok := cc.sc.Methods[method] + if !ok { + i := strings.LastIndex(method, "/") + m = cc.sc.Methods[method[:i+1]] + } + return m +} + +func (cc *ClientConn) healthCheckConfig() *healthCheckConfig { + cc.mu.RLock() + defer cc.mu.RUnlock() + if cc.sc == nil { + return nil + } + return cc.sc.healthCheckConfig +} + +func (cc *ClientConn) getTransport(ctx context.Context, failfast bool, method string) (transport.ClientTransport, func(balancer.DoneInfo), error) { + t, done, err := cc.blockingpicker.pick(ctx, failfast, balancer.PickInfo{ + Ctx: ctx, + FullMethodName: method, + }) + if err != nil { + return nil, nil, toRPCErr(err) + } + return t, done, nil +} + +func (cc *ClientConn) applyServiceConfigAndBalancer(sc *ServiceConfig, addrs []resolver.Address) { + if sc == nil { + // should never reach here. + return + } + cc.sc = sc + + if cc.sc.retryThrottling != nil { + newThrottler := &retryThrottler{ + tokens: cc.sc.retryThrottling.MaxTokens, + max: cc.sc.retryThrottling.MaxTokens, + thresh: cc.sc.retryThrottling.MaxTokens / 2, + ratio: cc.sc.retryThrottling.TokenRatio, + } + cc.retryThrottler.Store(newThrottler) + } else { + cc.retryThrottler.Store((*retryThrottler)(nil)) + } + + if cc.dopts.balancerBuilder == nil { + // Only look at balancer types and switch balancer if balancer dial + // option is not set. + var newBalancerName string + if cc.sc != nil && cc.sc.lbConfig != nil { + newBalancerName = cc.sc.lbConfig.name + } else { + var isGRPCLB bool + for _, a := range addrs { + if a.Type == resolver.GRPCLB { + isGRPCLB = true + break + } + } + if isGRPCLB { + newBalancerName = grpclbName + } else if cc.sc != nil && cc.sc.LB != nil { + newBalancerName = *cc.sc.LB + } else { + newBalancerName = PickFirstBalancerName + } + } + cc.switchBalancer(newBalancerName) + } else if cc.balancerWrapper == nil { + // Balancer dial option was set, and this is the first time handling + // resolved addresses. Build a balancer with dopts.balancerBuilder. + cc.curBalancerName = cc.dopts.balancerBuilder.Name() + cc.balancerWrapper = newCCBalancerWrapper(cc, cc.dopts.balancerBuilder, cc.balancerBuildOpts) + } +} + +func (cc *ClientConn) resolveNow(o resolver.ResolveNowOptions) { + cc.mu.RLock() + r := cc.resolverWrapper + cc.mu.RUnlock() + if r == nil { + return + } + go r.resolveNow(o) +} + +// ResetConnectBackoff wakes up all subchannels in transient failure and causes +// them to attempt another connection immediately. It also resets the backoff +// times used for subsequent attempts regardless of the current state. +// +// In general, this function should not be used. Typical service or network +// outages result in a reasonable client reconnection strategy by default. +// However, if a previously unavailable network becomes available, this may be +// used to trigger an immediate reconnect. +// +// This API is EXPERIMENTAL. +func (cc *ClientConn) ResetConnectBackoff() { + cc.mu.Lock() + conns := cc.conns + cc.mu.Unlock() + for ac := range conns { + ac.resetConnectBackoff() + } +} + +// Close tears down the ClientConn and all underlying connections. +func (cc *ClientConn) Close() error { + defer cc.cancel() + + cc.mu.Lock() + if cc.conns == nil { + cc.mu.Unlock() + return ErrClientConnClosing + } + conns := cc.conns + cc.conns = nil + cc.csMgr.updateState(connectivity.Shutdown) + + rWrapper := cc.resolverWrapper + cc.resolverWrapper = nil + bWrapper := cc.balancerWrapper + cc.balancerWrapper = nil + cc.mu.Unlock() + + cc.blockingpicker.close() + + if rWrapper != nil { + rWrapper.close() + } + if bWrapper != nil { + bWrapper.close() + } + + for ac := range conns { + ac.tearDown(ErrClientConnClosing) + } + if channelz.IsOn() { + ted := &channelz.TraceEventDesc{ + Desc: "Channel Deleted", + Severity: channelz.CtINFO, + } + if cc.dopts.channelzParentID != 0 { + ted.Parent = &channelz.TraceEventDesc{ + Desc: fmt.Sprintf("Nested channel(id:%d) deleted", cc.channelzID), + Severity: channelz.CtINFO, + } + } + channelz.AddTraceEvent(cc.channelzID, 0, ted) + // TraceEvent needs to be called before RemoveEntry, as TraceEvent may add trace reference to + // the entity being deleted, and thus prevent it from being deleted right away. + channelz.RemoveEntry(cc.channelzID) + } + return nil +} + +// addrConn is a network connection to a given address. +type addrConn struct { + ctx context.Context + cancel context.CancelFunc + + cc *ClientConn + dopts dialOptions + acbw balancer.SubConn + scopts balancer.NewSubConnOptions + + // transport is set when there's a viable transport (note: ac state may not be READY as LB channel + // health checking may require server to report healthy to set ac to READY), and is reset + // to nil when the current transport should no longer be used to create a stream (e.g. after GoAway + // is received, transport is closed, ac has been torn down). + transport transport.ClientTransport // The current transport. + + mu sync.Mutex + curAddr resolver.Address // The current address. + addrs []resolver.Address // All addresses that the resolver resolved to. + + // Use updateConnectivityState for updating addrConn's connectivity state. + state connectivity.State + + backoffIdx int // Needs to be stateful for resetConnectBackoff. + resetBackoff chan struct{} + + channelzID int64 // channelz unique identification number. + czData *channelzData +} + +// Note: this requires a lock on ac.mu. +func (ac *addrConn) updateConnectivityState(s connectivity.State, lastErr error) { + if ac.state == s { + return + } + ac.state = s + channelz.Infof(ac.channelzID, "Subchannel Connectivity change to %v", s) + ac.cc.handleSubConnStateChange(ac.acbw, s, lastErr) +} + +// adjustParams updates parameters used to create transports upon +// receiving a GoAway. +func (ac *addrConn) adjustParams(r transport.GoAwayReason) { + switch r { + case transport.GoAwayTooManyPings: + v := 2 * ac.dopts.copts.KeepaliveParams.Time + ac.cc.mu.Lock() + if v > ac.cc.mkp.Time { + ac.cc.mkp.Time = v + } + ac.cc.mu.Unlock() + } +} + +func (ac *addrConn) resetTransport() { + for i := 0; ; i++ { + if i > 0 { + ac.cc.resolveNow(resolver.ResolveNowOptions{}) + } + + ac.mu.Lock() + if ac.state == connectivity.Shutdown { + ac.mu.Unlock() + return + } + + addrs := ac.addrs + backoffFor := ac.dopts.bs.Backoff(ac.backoffIdx) + // This will be the duration that dial gets to finish. + dialDuration := minConnectTimeout + if ac.dopts.minConnectTimeout != nil { + dialDuration = ac.dopts.minConnectTimeout() + } + + if dialDuration < backoffFor { + // Give dial more time as we keep failing to connect. + dialDuration = backoffFor + } + // We can potentially spend all the time trying the first address, and + // if the server accepts the connection and then hangs, the following + // addresses will never be tried. + // + // The spec doesn't mention what should be done for multiple addresses. + // https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md#proposed-backoff-algorithm + connectDeadline := time.Now().Add(dialDuration) + + ac.updateConnectivityState(connectivity.Connecting, nil) + ac.transport = nil + ac.mu.Unlock() + + newTr, addr, reconnect, err := ac.tryAllAddrs(addrs, connectDeadline) + if err != nil { + // After exhausting all addresses, the addrConn enters + // TRANSIENT_FAILURE. + ac.mu.Lock() + if ac.state == connectivity.Shutdown { + ac.mu.Unlock() + return + } + ac.updateConnectivityState(connectivity.TransientFailure, err) + + // Backoff. + b := ac.resetBackoff + ac.mu.Unlock() + + timer := time.NewTimer(backoffFor) + select { + case <-timer.C: + ac.mu.Lock() + ac.backoffIdx++ + ac.mu.Unlock() + case <-b: + timer.Stop() + case <-ac.ctx.Done(): + timer.Stop() + return + } + continue + } + + ac.mu.Lock() + if ac.state == connectivity.Shutdown { + ac.mu.Unlock() + newTr.Close() + return + } + ac.curAddr = addr + ac.transport = newTr + ac.backoffIdx = 0 + + hctx, hcancel := context.WithCancel(ac.ctx) + ac.startHealthCheck(hctx) + ac.mu.Unlock() + + // Block until the created transport is down. And when this happens, + // we restart from the top of the addr list. + <-reconnect.Done() + hcancel() + // restart connecting - the top of the loop will set state to + // CONNECTING. This is against the current connectivity semantics doc, + // however it allows for graceful behavior for RPCs not yet dispatched + // - unfortunate timing would otherwise lead to the RPC failing even + // though the TRANSIENT_FAILURE state (called for by the doc) would be + // instantaneous. + // + // Ideally we should transition to Idle here and block until there is + // RPC activity that leads to the balancer requesting a reconnect of + // the associated SubConn. + } +} + +// tryAllAddrs tries to creates a connection to the addresses, and stop when at the +// first successful one. It returns the transport, the address and a Event in +// the successful case. The Event fires when the returned transport disconnects. +func (ac *addrConn) tryAllAddrs(addrs []resolver.Address, connectDeadline time.Time) (transport.ClientTransport, resolver.Address, *grpcsync.Event, error) { + var firstConnErr error + for _, addr := range addrs { + ac.mu.Lock() + if ac.state == connectivity.Shutdown { + ac.mu.Unlock() + return nil, resolver.Address{}, nil, errConnClosing + } + + ac.cc.mu.RLock() + ac.dopts.copts.KeepaliveParams = ac.cc.mkp + ac.cc.mu.RUnlock() + + copts := ac.dopts.copts + if ac.scopts.CredsBundle != nil { + copts.CredsBundle = ac.scopts.CredsBundle + } + ac.mu.Unlock() + + channelz.Infof(ac.channelzID, "Subchannel picks a new address %q to connect", addr.Addr) + + newTr, reconnect, err := ac.createTransport(addr, copts, connectDeadline) + if err == nil { + return newTr, addr, reconnect, nil + } + if firstConnErr == nil { + firstConnErr = err + } + ac.cc.blockingpicker.updateConnectionError(err) + } + + // Couldn't connect to any address. + return nil, resolver.Address{}, nil, firstConnErr +} + +// createTransport creates a connection to addr. It returns the transport and a +// Event in the successful case. The Event fires when the returned transport +// disconnects. +func (ac *addrConn) createTransport(addr resolver.Address, copts transport.ConnectOptions, connectDeadline time.Time) (transport.ClientTransport, *grpcsync.Event, error) { + prefaceReceived := make(chan struct{}) + onCloseCalled := make(chan struct{}) + reconnect := grpcsync.NewEvent() + + authority := ac.cc.authority + // addr.ServerName takes precedent over ClientConn authority, if present. + if addr.ServerName != "" { + authority = addr.ServerName + } + + target := transport.TargetInfo{ + Addr: addr.Addr, + Metadata: addr.Metadata, + Authority: authority, + } + + once := sync.Once{} + onGoAway := func(r transport.GoAwayReason) { + ac.mu.Lock() + ac.adjustParams(r) + once.Do(func() { + if ac.state == connectivity.Ready { + // Prevent this SubConn from being used for new RPCs by setting its + // state to Connecting. + // + // TODO: this should be Idle when grpc-go properly supports it. + ac.updateConnectivityState(connectivity.Connecting, nil) + } + }) + ac.mu.Unlock() + reconnect.Fire() + } + + onClose := func() { + ac.mu.Lock() + once.Do(func() { + if ac.state == connectivity.Ready { + // Prevent this SubConn from being used for new RPCs by setting its + // state to Connecting. + // + // TODO: this should be Idle when grpc-go properly supports it. + ac.updateConnectivityState(connectivity.Connecting, nil) + } + }) + ac.mu.Unlock() + close(onCloseCalled) + reconnect.Fire() + } + + onPrefaceReceipt := func() { + close(prefaceReceived) + } + + connectCtx, cancel := context.WithDeadline(ac.ctx, connectDeadline) + defer cancel() + if channelz.IsOn() { + copts.ChannelzParentID = ac.channelzID + } + + newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, target, copts, onPrefaceReceipt, onGoAway, onClose) + if err != nil { + // newTr is either nil, or closed. + channelz.Warningf(ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v. Err: %v. Reconnecting...", addr, err) + return nil, nil, err + } + + select { + case <-time.After(time.Until(connectDeadline)): + // We didn't get the preface in time. + newTr.Close() + channelz.Warningf(ac.channelzID, "grpc: addrConn.createTransport failed to connect to %v: didn't receive server preface in time. Reconnecting...", addr) + return nil, nil, errors.New("timed out waiting for server handshake") + case <-prefaceReceived: + // We got the preface - huzzah! things are good. + case <-onCloseCalled: + // The transport has already closed - noop. + return nil, nil, errors.New("connection closed") + // TODO(deklerk) this should bail on ac.ctx.Done(). Add a test and fix. + } + return newTr, reconnect, nil +} + +// startHealthCheck starts the health checking stream (RPC) to watch the health +// stats of this connection if health checking is requested and configured. +// +// LB channel health checking is enabled when all requirements below are met: +// 1. it is not disabled by the user with the WithDisableHealthCheck DialOption +// 2. internal.HealthCheckFunc is set by importing the grpc/healthcheck package +// 3. a service config with non-empty healthCheckConfig field is provided +// 4. the load balancer requests it +// +// It sets addrConn to READY if the health checking stream is not started. +// +// Caller must hold ac.mu. +func (ac *addrConn) startHealthCheck(ctx context.Context) { + var healthcheckManagingState bool + defer func() { + if !healthcheckManagingState { + ac.updateConnectivityState(connectivity.Ready, nil) + } + }() + + if ac.cc.dopts.disableHealthCheck { + return + } + healthCheckConfig := ac.cc.healthCheckConfig() + if healthCheckConfig == nil { + return + } + if !ac.scopts.HealthCheckEnabled { + return + } + healthCheckFunc := ac.cc.dopts.healthCheckFunc + if healthCheckFunc == nil { + // The health package is not imported to set health check function. + // + // TODO: add a link to the health check doc in the error message. + channelz.Error(ac.channelzID, "Health check is requested but health check function is not set.") + return + } + + healthcheckManagingState = true + + // Set up the health check helper functions. + currentTr := ac.transport + newStream := func(method string) (interface{}, error) { + ac.mu.Lock() + if ac.transport != currentTr { + ac.mu.Unlock() + return nil, status.Error(codes.Canceled, "the provided transport is no longer valid to use") + } + ac.mu.Unlock() + return newNonRetryClientStream(ctx, &StreamDesc{ServerStreams: true}, method, currentTr, ac) + } + setConnectivityState := func(s connectivity.State, lastErr error) { + ac.mu.Lock() + defer ac.mu.Unlock() + if ac.transport != currentTr { + return + } + ac.updateConnectivityState(s, lastErr) + } + // Start the health checking stream. + go func() { + err := ac.cc.dopts.healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName) + if err != nil { + if status.Code(err) == codes.Unimplemented { + channelz.Error(ac.channelzID, "Subchannel health check is unimplemented at server side, thus health check is disabled") + } else { + channelz.Errorf(ac.channelzID, "HealthCheckFunc exits with unexpected error %v", err) + } + } + }() +} + +func (ac *addrConn) resetConnectBackoff() { + ac.mu.Lock() + close(ac.resetBackoff) + ac.backoffIdx = 0 + ac.resetBackoff = make(chan struct{}) + ac.mu.Unlock() +} + +// getReadyTransport returns the transport if ac's state is READY. +// Otherwise it returns nil, false. +// If ac's state is IDLE, it will trigger ac to connect. +func (ac *addrConn) getReadyTransport() (transport.ClientTransport, bool) { + ac.mu.Lock() + if ac.state == connectivity.Ready && ac.transport != nil { + t := ac.transport + ac.mu.Unlock() + return t, true + } + var idle bool + if ac.state == connectivity.Idle { + idle = true + } + ac.mu.Unlock() + // Trigger idle ac to connect. + if idle { + ac.connect() + } + return nil, false +} + +// tearDown starts to tear down the addrConn. +// TODO(zhaoq): Make this synchronous to avoid unbounded memory consumption in +// some edge cases (e.g., the caller opens and closes many addrConn's in a +// tight loop. +// tearDown doesn't remove ac from ac.cc.conns. +func (ac *addrConn) tearDown(err error) { + ac.mu.Lock() + if ac.state == connectivity.Shutdown { + ac.mu.Unlock() + return + } + curTr := ac.transport + ac.transport = nil + // We have to set the state to Shutdown before anything else to prevent races + // between setting the state and logic that waits on context cancellation / etc. + ac.updateConnectivityState(connectivity.Shutdown, nil) + ac.cancel() + ac.curAddr = resolver.Address{} + if err == errConnDrain && curTr != nil { + // GracefulClose(...) may be executed multiple times when + // i) receiving multiple GoAway frames from the server; or + // ii) there are concurrent name resolver/Balancer triggered + // address removal and GoAway. + // We have to unlock and re-lock here because GracefulClose => Close => onClose, which requires locking ac.mu. + ac.mu.Unlock() + curTr.GracefulClose() + ac.mu.Lock() + } + if channelz.IsOn() { + channelz.AddTraceEvent(ac.channelzID, 0, &channelz.TraceEventDesc{ + Desc: "Subchannel Deleted", + Severity: channelz.CtINFO, + Parent: &channelz.TraceEventDesc{ + Desc: fmt.Sprintf("Subchanel(id:%d) deleted", ac.channelzID), + Severity: channelz.CtINFO, + }, + }) + // TraceEvent needs to be called before RemoveEntry, as TraceEvent may add trace reference to + // the entity being deleted, and thus prevent it from being deleted right away. + channelz.RemoveEntry(ac.channelzID) + } + ac.mu.Unlock() +} + +func (ac *addrConn) getState() connectivity.State { + ac.mu.Lock() + defer ac.mu.Unlock() + return ac.state +} + +func (ac *addrConn) ChannelzMetric() *channelz.ChannelInternalMetric { + ac.mu.Lock() + addr := ac.curAddr.Addr + ac.mu.Unlock() + return &channelz.ChannelInternalMetric{ + State: ac.getState(), + Target: addr, + CallsStarted: atomic.LoadInt64(&ac.czData.callsStarted), + CallsSucceeded: atomic.LoadInt64(&ac.czData.callsSucceeded), + CallsFailed: atomic.LoadInt64(&ac.czData.callsFailed), + LastCallStartedTimestamp: time.Unix(0, atomic.LoadInt64(&ac.czData.lastCallStartedTime)), + } +} + +func (ac *addrConn) incrCallsStarted() { + atomic.AddInt64(&ac.czData.callsStarted, 1) + atomic.StoreInt64(&ac.czData.lastCallStartedTime, time.Now().UnixNano()) +} + +func (ac *addrConn) incrCallsSucceeded() { + atomic.AddInt64(&ac.czData.callsSucceeded, 1) +} + +func (ac *addrConn) incrCallsFailed() { + atomic.AddInt64(&ac.czData.callsFailed, 1) +} + +type retryThrottler struct { + max float64 + thresh float64 + ratio float64 + + mu sync.Mutex + tokens float64 // TODO(dfawley): replace with atomic and remove lock. +} + +// throttle subtracts a retry token from the pool and returns whether a retry +// should be throttled (disallowed) based upon the retry throttling policy in +// the service config. +func (rt *retryThrottler) throttle() bool { + if rt == nil { + return false + } + rt.mu.Lock() + defer rt.mu.Unlock() + rt.tokens-- + if rt.tokens < 0 { + rt.tokens = 0 + } + return rt.tokens <= rt.thresh +} + +func (rt *retryThrottler) successfulRPC() { + if rt == nil { + return + } + rt.mu.Lock() + defer rt.mu.Unlock() + rt.tokens += rt.ratio + if rt.tokens > rt.max { + rt.tokens = rt.max + } +} + +type channelzChannel struct { + cc *ClientConn +} + +func (c *channelzChannel) ChannelzMetric() *channelz.ChannelInternalMetric { + return c.cc.channelzMetric() +} + +// ErrClientConnTimeout indicates that the ClientConn cannot establish the +// underlying connections within the specified timeout. +// +// Deprecated: This error is never returned by grpc and should not be +// referenced by users. +var ErrClientConnTimeout = errors.New("grpc: timed out when dialing") + +func (cc *ClientConn) getResolver(scheme string) resolver.Builder { + for _, rb := range cc.dopts.resolvers { + if scheme == rb.Scheme() { + return rb + } + } + return resolver.Get(scheme) +} diff --git a/vendor/google.golang.org/grpc/codec.go b/vendor/google.golang.org/grpc/codec.go new file mode 100644 index 00000000..12977654 --- /dev/null +++ b/vendor/google.golang.org/grpc/codec.go @@ -0,0 +1,50 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "google.golang.org/grpc/encoding" + _ "google.golang.org/grpc/encoding/proto" // to register the Codec for "proto" +) + +// baseCodec contains the functionality of both Codec and encoding.Codec, but +// omits the name/string, which vary between the two and are not needed for +// anything besides the registry in the encoding package. +type baseCodec interface { + Marshal(v interface{}) ([]byte, error) + Unmarshal(data []byte, v interface{}) error +} + +var _ baseCodec = Codec(nil) +var _ baseCodec = encoding.Codec(nil) + +// Codec defines the interface gRPC uses to encode and decode messages. +// Note that implementations of this interface must be thread safe; +// a Codec's methods can be called from concurrent goroutines. +// +// Deprecated: use encoding.Codec instead. +type Codec interface { + // Marshal returns the wire format of v. + Marshal(v interface{}) ([]byte, error) + // Unmarshal parses the wire format into v. + Unmarshal(data []byte, v interface{}) error + // String returns the name of the Codec implementation. This is unused by + // gRPC. + String() string +} diff --git a/vendor/google.golang.org/grpc/codegen.sh b/vendor/google.golang.org/grpc/codegen.sh new file mode 100644 index 00000000..4cdc6ba7 --- /dev/null +++ b/vendor/google.golang.org/grpc/codegen.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +# This script serves as an example to demonstrate how to generate the gRPC-Go +# interface and the related messages from .proto file. +# +# It assumes the installation of i) Google proto buffer compiler at +# https://github.com/google/protobuf (after v2.6.1) and ii) the Go codegen +# plugin at https://github.com/golang/protobuf (after 2015-02-20). If you have +# not, please install them first. +# +# We recommend running this script at $GOPATH/src. +# +# If this is not what you need, feel free to make your own scripts. Again, this +# script is for demonstration purpose. +# +proto=$1 +protoc --go_out=plugins=grpc:. $proto diff --git a/vendor/google.golang.org/grpc/codes/code_string.go b/vendor/google.golang.org/grpc/codes/code_string.go new file mode 100644 index 00000000..0b206a57 --- /dev/null +++ b/vendor/google.golang.org/grpc/codes/code_string.go @@ -0,0 +1,62 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package codes + +import "strconv" + +func (c Code) String() string { + switch c { + case OK: + return "OK" + case Canceled: + return "Canceled" + case Unknown: + return "Unknown" + case InvalidArgument: + return "InvalidArgument" + case DeadlineExceeded: + return "DeadlineExceeded" + case NotFound: + return "NotFound" + case AlreadyExists: + return "AlreadyExists" + case PermissionDenied: + return "PermissionDenied" + case ResourceExhausted: + return "ResourceExhausted" + case FailedPrecondition: + return "FailedPrecondition" + case Aborted: + return "Aborted" + case OutOfRange: + return "OutOfRange" + case Unimplemented: + return "Unimplemented" + case Internal: + return "Internal" + case Unavailable: + return "Unavailable" + case DataLoss: + return "DataLoss" + case Unauthenticated: + return "Unauthenticated" + default: + return "Code(" + strconv.FormatInt(int64(c), 10) + ")" + } +} diff --git a/vendor/google.golang.org/grpc/codes/codes.go b/vendor/google.golang.org/grpc/codes/codes.go new file mode 100644 index 00000000..02738839 --- /dev/null +++ b/vendor/google.golang.org/grpc/codes/codes.go @@ -0,0 +1,198 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package codes defines the canonical error codes used by gRPC. It is +// consistent across various languages. +package codes // import "google.golang.org/grpc/codes" + +import ( + "fmt" + "strconv" +) + +// A Code is an unsigned 32-bit error code as defined in the gRPC spec. +type Code uint32 + +const ( + // OK is returned on success. + OK Code = 0 + + // Canceled indicates the operation was canceled (typically by the caller). + Canceled Code = 1 + + // Unknown error. An example of where this error may be returned is + // if a Status value received from another address space belongs to + // an error-space that is not known in this address space. Also + // errors raised by APIs that do not return enough error information + // may be converted to this error. + Unknown Code = 2 + + // InvalidArgument indicates client specified an invalid argument. + // Note that this differs from FailedPrecondition. It indicates arguments + // that are problematic regardless of the state of the system + // (e.g., a malformed file name). + InvalidArgument Code = 3 + + // DeadlineExceeded means operation expired before completion. + // For operations that change the state of the system, this error may be + // returned even if the operation has completed successfully. For + // example, a successful response from a server could have been delayed + // long enough for the deadline to expire. + DeadlineExceeded Code = 4 + + // NotFound means some requested entity (e.g., file or directory) was + // not found. + NotFound Code = 5 + + // AlreadyExists means an attempt to create an entity failed because one + // already exists. + AlreadyExists Code = 6 + + // PermissionDenied indicates the caller does not have permission to + // execute the specified operation. It must not be used for rejections + // caused by exhausting some resource (use ResourceExhausted + // instead for those errors). It must not be + // used if the caller cannot be identified (use Unauthenticated + // instead for those errors). + PermissionDenied Code = 7 + + // ResourceExhausted indicates some resource has been exhausted, perhaps + // a per-user quota, or perhaps the entire file system is out of space. + ResourceExhausted Code = 8 + + // FailedPrecondition indicates operation was rejected because the + // system is not in a state required for the operation's execution. + // For example, directory to be deleted may be non-empty, an rmdir + // operation is applied to a non-directory, etc. + // + // A litmus test that may help a service implementor in deciding + // between FailedPrecondition, Aborted, and Unavailable: + // (a) Use Unavailable if the client can retry just the failing call. + // (b) Use Aborted if the client should retry at a higher-level + // (e.g., restarting a read-modify-write sequence). + // (c) Use FailedPrecondition if the client should not retry until + // the system state has been explicitly fixed. E.g., if an "rmdir" + // fails because the directory is non-empty, FailedPrecondition + // should be returned since the client should not retry unless + // they have first fixed up the directory by deleting files from it. + // (d) Use FailedPrecondition if the client performs conditional + // REST Get/Update/Delete on a resource and the resource on the + // server does not match the condition. E.g., conflicting + // read-modify-write on the same resource. + FailedPrecondition Code = 9 + + // Aborted indicates the operation was aborted, typically due to a + // concurrency issue like sequencer check failures, transaction aborts, + // etc. + // + // See litmus test above for deciding between FailedPrecondition, + // Aborted, and Unavailable. + Aborted Code = 10 + + // OutOfRange means operation was attempted past the valid range. + // E.g., seeking or reading past end of file. + // + // Unlike InvalidArgument, this error indicates a problem that may + // be fixed if the system state changes. For example, a 32-bit file + // system will generate InvalidArgument if asked to read at an + // offset that is not in the range [0,2^32-1], but it will generate + // OutOfRange if asked to read from an offset past the current + // file size. + // + // There is a fair bit of overlap between FailedPrecondition and + // OutOfRange. We recommend using OutOfRange (the more specific + // error) when it applies so that callers who are iterating through + // a space can easily look for an OutOfRange error to detect when + // they are done. + OutOfRange Code = 11 + + // Unimplemented indicates operation is not implemented or not + // supported/enabled in this service. + Unimplemented Code = 12 + + // Internal errors. Means some invariants expected by underlying + // system has been broken. If you see one of these errors, + // something is very broken. + Internal Code = 13 + + // Unavailable indicates the service is currently unavailable. + // This is a most likely a transient condition and may be corrected + // by retrying with a backoff. Note that it is not always safe to retry + // non-idempotent operations. + // + // See litmus test above for deciding between FailedPrecondition, + // Aborted, and Unavailable. + Unavailable Code = 14 + + // DataLoss indicates unrecoverable data loss or corruption. + DataLoss Code = 15 + + // Unauthenticated indicates the request does not have valid + // authentication credentials for the operation. + Unauthenticated Code = 16 + + _maxCode = 17 +) + +var strToCode = map[string]Code{ + `"OK"`: OK, + `"CANCELLED"`:/* [sic] */ Canceled, + `"UNKNOWN"`: Unknown, + `"INVALID_ARGUMENT"`: InvalidArgument, + `"DEADLINE_EXCEEDED"`: DeadlineExceeded, + `"NOT_FOUND"`: NotFound, + `"ALREADY_EXISTS"`: AlreadyExists, + `"PERMISSION_DENIED"`: PermissionDenied, + `"RESOURCE_EXHAUSTED"`: ResourceExhausted, + `"FAILED_PRECONDITION"`: FailedPrecondition, + `"ABORTED"`: Aborted, + `"OUT_OF_RANGE"`: OutOfRange, + `"UNIMPLEMENTED"`: Unimplemented, + `"INTERNAL"`: Internal, + `"UNAVAILABLE"`: Unavailable, + `"DATA_LOSS"`: DataLoss, + `"UNAUTHENTICATED"`: Unauthenticated, +} + +// UnmarshalJSON unmarshals b into the Code. +func (c *Code) UnmarshalJSON(b []byte) error { + // From json.Unmarshaler: By convention, to approximate the behavior of + // Unmarshal itself, Unmarshalers implement UnmarshalJSON([]byte("null")) as + // a no-op. + if string(b) == "null" { + return nil + } + if c == nil { + return fmt.Errorf("nil receiver passed to UnmarshalJSON") + } + + if ci, err := strconv.ParseUint(string(b), 10, 32); err == nil { + if ci >= _maxCode { + return fmt.Errorf("invalid code: %q", ci) + } + + *c = Code(ci) + return nil + } + + if jc, ok := strToCode[string(b)]; ok { + *c = jc + return nil + } + return fmt.Errorf("invalid code: %q", string(b)) +} diff --git a/vendor/google.golang.org/grpc/connectivity/connectivity.go b/vendor/google.golang.org/grpc/connectivity/connectivity.go new file mode 100644 index 00000000..34ec36fb --- /dev/null +++ b/vendor/google.golang.org/grpc/connectivity/connectivity.go @@ -0,0 +1,73 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package connectivity defines connectivity semantics. +// For details, see https://github.com/grpc/grpc/blob/master/doc/connectivity-semantics-and-api.md. +// All APIs in this package are experimental. +package connectivity + +import ( + "context" + + "google.golang.org/grpc/grpclog" +) + +// State indicates the state of connectivity. +// It can be the state of a ClientConn or SubConn. +type State int + +func (s State) String() string { + switch s { + case Idle: + return "IDLE" + case Connecting: + return "CONNECTING" + case Ready: + return "READY" + case TransientFailure: + return "TRANSIENT_FAILURE" + case Shutdown: + return "SHUTDOWN" + default: + grpclog.Errorf("unknown connectivity state: %d", s) + return "Invalid-State" + } +} + +const ( + // Idle indicates the ClientConn is idle. + Idle State = iota + // Connecting indicates the ClientConn is connecting. + Connecting + // Ready indicates the ClientConn is ready for work. + Ready + // TransientFailure indicates the ClientConn has seen a failure but expects to recover. + TransientFailure + // Shutdown indicates the ClientConn has started shutting down. + Shutdown +) + +// Reporter reports the connectivity states. +type Reporter interface { + // CurrentState returns the current state of the reporter. + CurrentState() State + // WaitForStateChange blocks until the reporter's state is different from the given state, + // and returns true. + // It returns false if <-ctx.Done() can proceed (ctx got timeout or got canceled). + WaitForStateChange(context.Context, State) bool +} diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go new file mode 100644 index 00000000..e438fda2 --- /dev/null +++ b/vendor/google.golang.org/grpc/credentials/credentials.go @@ -0,0 +1,255 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package credentials implements various credentials supported by gRPC library, +// which encapsulate all the state needed by a client to authenticate with a +// server and make various assertions, e.g., about the client's identity, role, +// or whether it is authorized to make a particular call. +package credentials // import "google.golang.org/grpc/credentials" + +import ( + "context" + "errors" + "fmt" + "net" + + "github.com/golang/protobuf/proto" + "google.golang.org/grpc/internal" +) + +// PerRPCCredentials defines the common interface for the credentials which need to +// attach security information to every RPC (e.g., oauth2). +type PerRPCCredentials interface { + // GetRequestMetadata gets the current request metadata, refreshing + // tokens if required. This should be called by the transport layer on + // each request, and the data should be populated in headers or other + // context. If a status code is returned, it will be used as the status + // for the RPC. uri is the URI of the entry point for the request. + // When supported by the underlying implementation, ctx can be used for + // timeout and cancellation. Additionally, RequestInfo data will be + // available via ctx to this call. + // TODO(zhaoq): Define the set of the qualified keys instead of leaving + // it as an arbitrary string. + GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) + // RequireTransportSecurity indicates whether the credentials requires + // transport security. + RequireTransportSecurity() bool +} + +// SecurityLevel defines the protection level on an established connection. +// +// This API is experimental. +type SecurityLevel int + +const ( + // NoSecurity indicates a connection is insecure. + // The zero SecurityLevel value is invalid for backward compatibility. + NoSecurity SecurityLevel = iota + 1 + // IntegrityOnly indicates a connection only provides integrity protection. + IntegrityOnly + // PrivacyAndIntegrity indicates a connection provides both privacy and integrity protection. + PrivacyAndIntegrity +) + +// String returns SecurityLevel in a string format. +func (s SecurityLevel) String() string { + switch s { + case NoSecurity: + return "NoSecurity" + case IntegrityOnly: + return "IntegrityOnly" + case PrivacyAndIntegrity: + return "PrivacyAndIntegrity" + } + return fmt.Sprintf("invalid SecurityLevel: %v", int(s)) +} + +// CommonAuthInfo contains authenticated information common to AuthInfo implementations. +// It should be embedded in a struct implementing AuthInfo to provide additional information +// about the credentials. +// +// This API is experimental. +type CommonAuthInfo struct { + SecurityLevel SecurityLevel +} + +// GetCommonAuthInfo returns the pointer to CommonAuthInfo struct. +func (c *CommonAuthInfo) GetCommonAuthInfo() *CommonAuthInfo { + return c +} + +// ProtocolInfo provides information regarding the gRPC wire protocol version, +// security protocol, security protocol version in use, server name, etc. +type ProtocolInfo struct { + // ProtocolVersion is the gRPC wire protocol version. + ProtocolVersion string + // SecurityProtocol is the security protocol in use. + SecurityProtocol string + // SecurityVersion is the security protocol version. It is a static version string from the + // credentials, not a value that reflects per-connection protocol negotiation. To retrieve + // details about the credentials used for a connection, use the Peer's AuthInfo field instead. + // + // Deprecated: please use Peer.AuthInfo. + SecurityVersion string + // ServerName is the user-configured server name. + ServerName string +} + +// AuthInfo defines the common interface for the auth information the users are interested in. +// A struct that implements AuthInfo should embed CommonAuthInfo by including additional +// information about the credentials in it. +type AuthInfo interface { + AuthType() string +} + +// ErrConnDispatched indicates that rawConn has been dispatched out of gRPC +// and the caller should not close rawConn. +var ErrConnDispatched = errors.New("credentials: rawConn is dispatched out of gRPC") + +// TransportCredentials defines the common interface for all the live gRPC wire +// protocols and supported transport security protocols (e.g., TLS, SSL). +type TransportCredentials interface { + // ClientHandshake does the authentication handshake specified by the corresponding + // authentication protocol on rawConn for clients. It returns the authenticated + // connection and the corresponding auth information about the connection. + // The auth information should embed CommonAuthInfo to return additional information about + // the credentials. Implementations must use the provided context to implement timely cancellation. + // gRPC will try to reconnect if the error returned is a temporary error + // (io.EOF, context.DeadlineExceeded or err.Temporary() == true). + // If the returned error is a wrapper error, implementations should make sure that + // the error implements Temporary() to have the correct retry behaviors. + // + // If the returned net.Conn is closed, it MUST close the net.Conn provided. + ClientHandshake(context.Context, string, net.Conn) (net.Conn, AuthInfo, error) + // ServerHandshake does the authentication handshake for servers. It returns + // the authenticated connection and the corresponding auth information about + // the connection. The auth information should embed CommonAuthInfo to return additional information + // about the credentials. + // + // If the returned net.Conn is closed, it MUST close the net.Conn provided. + ServerHandshake(net.Conn) (net.Conn, AuthInfo, error) + // Info provides the ProtocolInfo of this TransportCredentials. + Info() ProtocolInfo + // Clone makes a copy of this TransportCredentials. + Clone() TransportCredentials + // OverrideServerName overrides the server name used to verify the hostname on the returned certificates from the server. + // gRPC internals also use it to override the virtual hosting name if it is set. + // It must be called before dialing. Currently, this is only used by grpclb. + OverrideServerName(string) error +} + +// Bundle is a combination of TransportCredentials and PerRPCCredentials. +// +// It also contains a mode switching method, so it can be used as a combination +// of different credential policies. +// +// Bundle cannot be used together with individual TransportCredentials. +// PerRPCCredentials from Bundle will be appended to other PerRPCCredentials. +// +// This API is experimental. +type Bundle interface { + TransportCredentials() TransportCredentials + PerRPCCredentials() PerRPCCredentials + // NewWithMode should make a copy of Bundle, and switch mode. Modifying the + // existing Bundle may cause races. + // + // NewWithMode returns nil if the requested mode is not supported. + NewWithMode(mode string) (Bundle, error) +} + +// RequestInfo contains request data attached to the context passed to GetRequestMetadata calls. +// +// This API is experimental. +type RequestInfo struct { + // The method passed to Invoke or NewStream for this RPC. (For proto methods, this has the format "/some.Service/Method") + Method string + // AuthInfo contains the information from a security handshake (TransportCredentials.ClientHandshake, TransportCredentials.ServerHandshake) + AuthInfo AuthInfo +} + +// requestInfoKey is a struct to be used as the key when attaching a RequestInfo to a context object. +type requestInfoKey struct{} + +// RequestInfoFromContext extracts the RequestInfo from the context if it exists. +// +// This API is experimental. +func RequestInfoFromContext(ctx context.Context) (ri RequestInfo, ok bool) { + ri, ok = ctx.Value(requestInfoKey{}).(RequestInfo) + return +} + +// CheckSecurityLevel checks if a connection's security level is greater than or equal to the specified one. +// It returns success if 1) the condition is satisified or 2) AuthInfo struct does not implement GetCommonAuthInfo() method +// or 3) CommonAuthInfo.SecurityLevel has an invalid zero value. For 2) and 3), it is for the purpose of backward-compatibility. +// +// This API is experimental. +func CheckSecurityLevel(ctx context.Context, level SecurityLevel) error { + type internalInfo interface { + GetCommonAuthInfo() *CommonAuthInfo + } + ri, _ := RequestInfoFromContext(ctx) + if ri.AuthInfo == nil { + return errors.New("unable to obtain SecurityLevel from context") + } + if ci, ok := ri.AuthInfo.(internalInfo); ok { + // CommonAuthInfo.SecurityLevel has an invalid value. + if ci.GetCommonAuthInfo().SecurityLevel == 0 { + return nil + } + if ci.GetCommonAuthInfo().SecurityLevel < level { + return fmt.Errorf("requires SecurityLevel %v; connection has %v", level, ci.GetCommonAuthInfo().SecurityLevel) + } + } + // The condition is satisfied or AuthInfo struct does not implement GetCommonAuthInfo() method. + return nil +} + +func init() { + internal.NewRequestInfoContext = func(ctx context.Context, ri RequestInfo) context.Context { + return context.WithValue(ctx, requestInfoKey{}, ri) + } +} + +// ChannelzSecurityInfo defines the interface that security protocols should implement +// in order to provide security info to channelz. +// +// This API is experimental. +type ChannelzSecurityInfo interface { + GetSecurityValue() ChannelzSecurityValue +} + +// ChannelzSecurityValue defines the interface that GetSecurityValue() return value +// should satisfy. This interface should only be satisfied by *TLSChannelzSecurityValue +// and *OtherChannelzSecurityValue. +// +// This API is experimental. +type ChannelzSecurityValue interface { + isChannelzSecurityValue() +} + +// OtherChannelzSecurityValue defines the struct that non-TLS protocol should return +// from GetSecurityValue(), which contains protocol specific security info. Note +// the Value field will be sent to users of channelz requesting channel info, and +// thus sensitive info should better be avoided. +// +// This API is experimental. +type OtherChannelzSecurityValue struct { + ChannelzSecurityValue + Name string + Value proto.Message +} diff --git a/vendor/google.golang.org/grpc/credentials/go12.go b/vendor/google.golang.org/grpc/credentials/go12.go new file mode 100644 index 00000000..ccbf35b3 --- /dev/null +++ b/vendor/google.golang.org/grpc/credentials/go12.go @@ -0,0 +1,30 @@ +// +build go1.12 + +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package credentials + +import "crypto/tls" + +// This init function adds cipher suite constants only defined in Go 1.12. +func init() { + cipherSuiteLookup[tls.TLS_AES_128_GCM_SHA256] = "TLS_AES_128_GCM_SHA256" + cipherSuiteLookup[tls.TLS_AES_256_GCM_SHA384] = "TLS_AES_256_GCM_SHA384" + cipherSuiteLookup[tls.TLS_CHACHA20_POLY1305_SHA256] = "TLS_CHACHA20_POLY1305_SHA256" +} diff --git a/vendor/google.golang.org/grpc/credentials/internal/syscallconn.go b/vendor/google.golang.org/grpc/credentials/internal/syscallconn.go new file mode 100644 index 00000000..2f4472be --- /dev/null +++ b/vendor/google.golang.org/grpc/credentials/internal/syscallconn.go @@ -0,0 +1,61 @@ +// +build !appengine + +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package internal contains credentials-internal code. +package internal + +import ( + "net" + "syscall" +) + +type sysConn = syscall.Conn + +// syscallConn keeps reference of rawConn to support syscall.Conn for channelz. +// SyscallConn() (the method in interface syscall.Conn) is explicitly +// implemented on this type, +// +// Interface syscall.Conn is implemented by most net.Conn implementations (e.g. +// TCPConn, UnixConn), but is not part of net.Conn interface. So wrapper conns +// that embed net.Conn don't implement syscall.Conn. (Side note: tls.Conn +// doesn't embed net.Conn, so even if syscall.Conn is part of net.Conn, it won't +// help here). +type syscallConn struct { + net.Conn + // sysConn is a type alias of syscall.Conn. It's necessary because the name + // `Conn` collides with `net.Conn`. + sysConn +} + +// WrapSyscallConn tries to wrap rawConn and newConn into a net.Conn that +// implements syscall.Conn. rawConn will be used to support syscall, and newConn +// will be used for read/write. +// +// This function returns newConn if rawConn doesn't implement syscall.Conn. +func WrapSyscallConn(rawConn, newConn net.Conn) net.Conn { + sysConn, ok := rawConn.(syscall.Conn) + if !ok { + return newConn + } + return &syscallConn{ + Conn: newConn, + sysConn: sysConn, + } +} diff --git a/vendor/google.golang.org/grpc/credentials/internal/syscallconn_appengine.go b/vendor/google.golang.org/grpc/credentials/internal/syscallconn_appengine.go new file mode 100644 index 00000000..d4346e9e --- /dev/null +++ b/vendor/google.golang.org/grpc/credentials/internal/syscallconn_appengine.go @@ -0,0 +1,30 @@ +// +build appengine + +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package internal + +import ( + "net" +) + +// WrapSyscallConn returns newConn on appengine. +func WrapSyscallConn(rawConn, newConn net.Conn) net.Conn { + return newConn +} diff --git a/vendor/google.golang.org/grpc/credentials/tls.go b/vendor/google.golang.org/grpc/credentials/tls.go new file mode 100644 index 00000000..86e956bc --- /dev/null +++ b/vendor/google.golang.org/grpc/credentials/tls.go @@ -0,0 +1,235 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package credentials + +import ( + "context" + "crypto/tls" + "crypto/x509" + "fmt" + "io/ioutil" + "net" + + "google.golang.org/grpc/credentials/internal" +) + +// TLSInfo contains the auth information for a TLS authenticated connection. +// It implements the AuthInfo interface. +type TLSInfo struct { + State tls.ConnectionState + CommonAuthInfo +} + +// AuthType returns the type of TLSInfo as a string. +func (t TLSInfo) AuthType() string { + return "tls" +} + +// GetSecurityValue returns security info requested by channelz. +func (t TLSInfo) GetSecurityValue() ChannelzSecurityValue { + v := &TLSChannelzSecurityValue{ + StandardName: cipherSuiteLookup[t.State.CipherSuite], + } + // Currently there's no way to get LocalCertificate info from tls package. + if len(t.State.PeerCertificates) > 0 { + v.RemoteCertificate = t.State.PeerCertificates[0].Raw + } + return v +} + +// tlsCreds is the credentials required for authenticating a connection using TLS. +type tlsCreds struct { + // TLS configuration + config *tls.Config +} + +func (c tlsCreds) Info() ProtocolInfo { + return ProtocolInfo{ + SecurityProtocol: "tls", + SecurityVersion: "1.2", + ServerName: c.config.ServerName, + } +} + +func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) { + // use local cfg to avoid clobbering ServerName if using multiple endpoints + cfg := cloneTLSConfig(c.config) + if cfg.ServerName == "" { + serverName, _, err := net.SplitHostPort(authority) + if err != nil { + // If the authority had no host port or if the authority cannot be parsed, use it as-is. + serverName = authority + } + cfg.ServerName = serverName + } + conn := tls.Client(rawConn, cfg) + errChannel := make(chan error, 1) + go func() { + errChannel <- conn.Handshake() + close(errChannel) + }() + select { + case err := <-errChannel: + if err != nil { + conn.Close() + return nil, nil, err + } + case <-ctx.Done(): + conn.Close() + return nil, nil, ctx.Err() + } + return internal.WrapSyscallConn(rawConn, conn), TLSInfo{conn.ConnectionState(), CommonAuthInfo{PrivacyAndIntegrity}}, nil +} + +func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) { + conn := tls.Server(rawConn, c.config) + if err := conn.Handshake(); err != nil { + conn.Close() + return nil, nil, err + } + return internal.WrapSyscallConn(rawConn, conn), TLSInfo{conn.ConnectionState(), CommonAuthInfo{PrivacyAndIntegrity}}, nil +} + +func (c *tlsCreds) Clone() TransportCredentials { + return NewTLS(c.config) +} + +func (c *tlsCreds) OverrideServerName(serverNameOverride string) error { + c.config.ServerName = serverNameOverride + return nil +} + +const alpnProtoStrH2 = "h2" + +func appendH2ToNextProtos(ps []string) []string { + for _, p := range ps { + if p == alpnProtoStrH2 { + return ps + } + } + ret := make([]string, 0, len(ps)+1) + ret = append(ret, ps...) + return append(ret, alpnProtoStrH2) +} + +// NewTLS uses c to construct a TransportCredentials based on TLS. +func NewTLS(c *tls.Config) TransportCredentials { + tc := &tlsCreds{cloneTLSConfig(c)} + tc.config.NextProtos = appendH2ToNextProtos(tc.config.NextProtos) + return tc +} + +// NewClientTLSFromCert constructs TLS credentials from the provided root +// certificate authority certificate(s) to validate server connections. If +// certificates to establish the identity of the client need to be included in +// the credentials (eg: for mTLS), use NewTLS instead, where a complete +// tls.Config can be specified. +// serverNameOverride is for testing only. If set to a non empty string, +// it will override the virtual host name of authority (e.g. :authority header +// field) in requests. +func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) TransportCredentials { + return NewTLS(&tls.Config{ServerName: serverNameOverride, RootCAs: cp}) +} + +// NewClientTLSFromFile constructs TLS credentials from the provided root +// certificate authority certificate file(s) to validate server connections. If +// certificates to establish the identity of the client need to be included in +// the credentials (eg: for mTLS), use NewTLS instead, where a complete +// tls.Config can be specified. +// serverNameOverride is for testing only. If set to a non empty string, +// it will override the virtual host name of authority (e.g. :authority header +// field) in requests. +func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error) { + b, err := ioutil.ReadFile(certFile) + if err != nil { + return nil, err + } + cp := x509.NewCertPool() + if !cp.AppendCertsFromPEM(b) { + return nil, fmt.Errorf("credentials: failed to append certificates") + } + return NewTLS(&tls.Config{ServerName: serverNameOverride, RootCAs: cp}), nil +} + +// NewServerTLSFromCert constructs TLS credentials from the input certificate for server. +func NewServerTLSFromCert(cert *tls.Certificate) TransportCredentials { + return NewTLS(&tls.Config{Certificates: []tls.Certificate{*cert}}) +} + +// NewServerTLSFromFile constructs TLS credentials from the input certificate file and key +// file for server. +func NewServerTLSFromFile(certFile, keyFile string) (TransportCredentials, error) { + cert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + return nil, err + } + return NewTLS(&tls.Config{Certificates: []tls.Certificate{cert}}), nil +} + +// TLSChannelzSecurityValue defines the struct that TLS protocol should return +// from GetSecurityValue(), containing security info like cipher and certificate used. +// +// This API is EXPERIMENTAL. +type TLSChannelzSecurityValue struct { + ChannelzSecurityValue + StandardName string + LocalCertificate []byte + RemoteCertificate []byte +} + +var cipherSuiteLookup = map[uint16]string{ + tls.TLS_RSA_WITH_RC4_128_SHA: "TLS_RSA_WITH_RC4_128_SHA", + tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA: "TLS_RSA_WITH_3DES_EDE_CBC_SHA", + tls.TLS_RSA_WITH_AES_128_CBC_SHA: "TLS_RSA_WITH_AES_128_CBC_SHA", + tls.TLS_RSA_WITH_AES_256_CBC_SHA: "TLS_RSA_WITH_AES_256_CBC_SHA", + tls.TLS_RSA_WITH_AES_128_GCM_SHA256: "TLS_RSA_WITH_AES_128_GCM_SHA256", + tls.TLS_RSA_WITH_AES_256_GCM_SHA384: "TLS_RSA_WITH_AES_256_GCM_SHA384", + tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA: "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", + tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA: "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", + tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA: "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", + tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA: "TLS_ECDHE_RSA_WITH_RC4_128_SHA", + tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA: "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", + tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA: "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", + tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", + tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", + tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", + tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384: "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", + tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384: "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", + tls.TLS_FALLBACK_SCSV: "TLS_FALLBACK_SCSV", + tls.TLS_RSA_WITH_AES_128_CBC_SHA256: "TLS_RSA_WITH_AES_128_CBC_SHA256", + tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256: "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", + tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256: "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", + tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305: "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", + tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305: "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", +} + +// cloneTLSConfig returns a shallow clone of the exported +// fields of cfg, ignoring the unexported sync.Once, which +// contains a mutex and must not be copied. +// +// If cfg is nil, a new zero tls.Config is returned. +// +// TODO: inline this function if possible. +func cloneTLSConfig(cfg *tls.Config) *tls.Config { + if cfg == nil { + return &tls.Config{} + } + + return cfg.Clone() +} diff --git a/vendor/google.golang.org/grpc/dialoptions.go b/vendor/google.golang.org/grpc/dialoptions.go new file mode 100644 index 00000000..35bde103 --- /dev/null +++ b/vendor/google.golang.org/grpc/dialoptions.go @@ -0,0 +1,606 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "context" + "fmt" + "net" + "time" + + "google.golang.org/grpc/backoff" + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal" + internalbackoff "google.golang.org/grpc/internal/backoff" + "google.golang.org/grpc/internal/envconfig" + "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/stats" +) + +// dialOptions configure a Dial call. dialOptions are set by the DialOption +// values passed to Dial. +type dialOptions struct { + unaryInt UnaryClientInterceptor + streamInt StreamClientInterceptor + + chainUnaryInts []UnaryClientInterceptor + chainStreamInts []StreamClientInterceptor + + cp Compressor + dc Decompressor + bs internalbackoff.Strategy + block bool + insecure bool + timeout time.Duration + scChan <-chan ServiceConfig + authority string + copts transport.ConnectOptions + callOptions []CallOption + // This is used by v1 balancer dial option WithBalancer to support v1 + // balancer, and also by WithBalancerName dial option. + balancerBuilder balancer.Builder + channelzParentID int64 + disableServiceConfig bool + disableRetry bool + disableHealthCheck bool + healthCheckFunc internal.HealthChecker + minConnectTimeout func() time.Duration + defaultServiceConfig *ServiceConfig // defaultServiceConfig is parsed from defaultServiceConfigRawJSON. + defaultServiceConfigRawJSON *string + // This is used by ccResolverWrapper to backoff between successive calls to + // resolver.ResolveNow(). The user will have no need to configure this, but + // we need to be able to configure this in tests. + resolveNowBackoff func(int) time.Duration + resolvers []resolver.Builder + withProxy bool +} + +// DialOption configures how we set up the connection. +type DialOption interface { + apply(*dialOptions) +} + +// EmptyDialOption does not alter the dial configuration. It can be embedded in +// another structure to build custom dial options. +// +// This API is EXPERIMENTAL. +type EmptyDialOption struct{} + +func (EmptyDialOption) apply(*dialOptions) {} + +// funcDialOption wraps a function that modifies dialOptions into an +// implementation of the DialOption interface. +type funcDialOption struct { + f func(*dialOptions) +} + +func (fdo *funcDialOption) apply(do *dialOptions) { + fdo.f(do) +} + +func newFuncDialOption(f func(*dialOptions)) *funcDialOption { + return &funcDialOption{ + f: f, + } +} + +// WithWriteBufferSize determines how much data can be batched before doing a +// write on the wire. The corresponding memory allocation for this buffer will +// be twice the size to keep syscalls low. The default value for this buffer is +// 32KB. +// +// Zero will disable the write buffer such that each write will be on underlying +// connection. Note: A Send call may not directly translate to a write. +func WithWriteBufferSize(s int) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.WriteBufferSize = s + }) +} + +// WithReadBufferSize lets you set the size of read buffer, this determines how +// much data can be read at most for each read syscall. +// +// The default value for this buffer is 32KB. Zero will disable read buffer for +// a connection so data framer can access the underlying conn directly. +func WithReadBufferSize(s int) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.ReadBufferSize = s + }) +} + +// WithInitialWindowSize returns a DialOption which sets the value for initial +// window size on a stream. The lower bound for window size is 64K and any value +// smaller than that will be ignored. +func WithInitialWindowSize(s int32) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.InitialWindowSize = s + }) +} + +// WithInitialConnWindowSize returns a DialOption which sets the value for +// initial window size on a connection. The lower bound for window size is 64K +// and any value smaller than that will be ignored. +func WithInitialConnWindowSize(s int32) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.InitialConnWindowSize = s + }) +} + +// WithMaxMsgSize returns a DialOption which sets the maximum message size the +// client can receive. +// +// Deprecated: use WithDefaultCallOptions(MaxCallRecvMsgSize(s)) instead. Will +// be supported throughout 1.x. +func WithMaxMsgSize(s int) DialOption { + return WithDefaultCallOptions(MaxCallRecvMsgSize(s)) +} + +// WithDefaultCallOptions returns a DialOption which sets the default +// CallOptions for calls over the connection. +func WithDefaultCallOptions(cos ...CallOption) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.callOptions = append(o.callOptions, cos...) + }) +} + +// WithCodec returns a DialOption which sets a codec for message marshaling and +// unmarshaling. +// +// Deprecated: use WithDefaultCallOptions(ForceCodec(_)) instead. Will be +// supported throughout 1.x. +func WithCodec(c Codec) DialOption { + return WithDefaultCallOptions(CallCustomCodec(c)) +} + +// WithCompressor returns a DialOption which sets a Compressor to use for +// message compression. It has lower priority than the compressor set by the +// UseCompressor CallOption. +// +// Deprecated: use UseCompressor instead. Will be supported throughout 1.x. +func WithCompressor(cp Compressor) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.cp = cp + }) +} + +// WithDecompressor returns a DialOption which sets a Decompressor to use for +// incoming message decompression. If incoming response messages are encoded +// using the decompressor's Type(), it will be used. Otherwise, the message +// encoding will be used to look up the compressor registered via +// encoding.RegisterCompressor, which will then be used to decompress the +// message. If no compressor is registered for the encoding, an Unimplemented +// status error will be returned. +// +// Deprecated: use encoding.RegisterCompressor instead. Will be supported +// throughout 1.x. +func WithDecompressor(dc Decompressor) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.dc = dc + }) +} + +// WithBalancer returns a DialOption which sets a load balancer with the v1 API. +// Name resolver will be ignored if this DialOption is specified. +// +// Deprecated: use the new balancer APIs in balancer package and +// WithBalancerName. Will be removed in a future 1.x release. +func WithBalancer(b Balancer) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.balancerBuilder = &balancerWrapperBuilder{ + b: b, + } + }) +} + +// WithBalancerName sets the balancer that the ClientConn will be initialized +// with. Balancer registered with balancerName will be used. This function +// panics if no balancer was registered by balancerName. +// +// The balancer cannot be overridden by balancer option specified by service +// config. +// +// Deprecated: use WithDefaultServiceConfig and WithDisableServiceConfig +// instead. Will be removed in a future 1.x release. +func WithBalancerName(balancerName string) DialOption { + builder := balancer.Get(balancerName) + if builder == nil { + panic(fmt.Sprintf("grpc.WithBalancerName: no balancer is registered for name %v", balancerName)) + } + return newFuncDialOption(func(o *dialOptions) { + o.balancerBuilder = builder + }) +} + +// WithServiceConfig returns a DialOption which has a channel to read the +// service configuration. +// +// Deprecated: service config should be received through name resolver or via +// WithDefaultServiceConfig, as specified at +// https://github.com/grpc/grpc/blob/master/doc/service_config.md. Will be +// removed in a future 1.x release. +func WithServiceConfig(c <-chan ServiceConfig) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.scChan = c + }) +} + +// WithConnectParams configures the dialer to use the provided ConnectParams. +// +// The backoff configuration specified as part of the ConnectParams overrides +// all defaults specified in +// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. Consider +// using the backoff.DefaultConfig as a base, in cases where you want to +// override only a subset of the backoff configuration. +// +// This API is EXPERIMENTAL. +func WithConnectParams(p ConnectParams) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.bs = internalbackoff.Exponential{Config: p.Backoff} + o.minConnectTimeout = func() time.Duration { + return p.MinConnectTimeout + } + }) +} + +// WithBackoffMaxDelay configures the dialer to use the provided maximum delay +// when backing off after failed connection attempts. +// +// Deprecated: use WithConnectParams instead. Will be supported throughout 1.x. +func WithBackoffMaxDelay(md time.Duration) DialOption { + return WithBackoffConfig(BackoffConfig{MaxDelay: md}) +} + +// WithBackoffConfig configures the dialer to use the provided backoff +// parameters after connection failures. +// +// Deprecated: use WithConnectParams instead. Will be supported throughout 1.x. +func WithBackoffConfig(b BackoffConfig) DialOption { + bc := backoff.DefaultConfig + bc.MaxDelay = b.MaxDelay + return withBackoff(internalbackoff.Exponential{Config: bc}) +} + +// withBackoff sets the backoff strategy used for connectRetryNum after a failed +// connection attempt. +// +// This can be exported if arbitrary backoff strategies are allowed by gRPC. +func withBackoff(bs internalbackoff.Strategy) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.bs = bs + }) +} + +// WithBlock returns a DialOption which makes caller of Dial blocks until the +// underlying connection is up. Without this, Dial returns immediately and +// connecting the server happens in background. +func WithBlock() DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.block = true + }) +} + +// WithInsecure returns a DialOption which disables transport security for this +// ClientConn. Note that transport security is required unless WithInsecure is +// set. +func WithInsecure() DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.insecure = true + }) +} + +// WithNoProxy returns a DialOption which disables the use of proxies for this +// ClientConn. This is ignored if WithDialer or WithContextDialer are used. +// +// This API is EXPERIMENTAL. +func WithNoProxy() DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.withProxy = false + }) +} + +// WithTransportCredentials returns a DialOption which configures a connection +// level security credentials (e.g., TLS/SSL). This should not be used together +// with WithCredentialsBundle. +func WithTransportCredentials(creds credentials.TransportCredentials) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.TransportCredentials = creds + }) +} + +// WithPerRPCCredentials returns a DialOption which sets credentials and places +// auth state on each outbound RPC. +func WithPerRPCCredentials(creds credentials.PerRPCCredentials) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.PerRPCCredentials = append(o.copts.PerRPCCredentials, creds) + }) +} + +// WithCredentialsBundle returns a DialOption to set a credentials bundle for +// the ClientConn.WithCreds. This should not be used together with +// WithTransportCredentials. +// +// This API is experimental. +func WithCredentialsBundle(b credentials.Bundle) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.CredsBundle = b + }) +} + +// WithTimeout returns a DialOption that configures a timeout for dialing a +// ClientConn initially. This is valid if and only if WithBlock() is present. +// +// Deprecated: use DialContext instead of Dial and context.WithTimeout +// instead. Will be supported throughout 1.x. +func WithTimeout(d time.Duration) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.timeout = d + }) +} + +// WithContextDialer returns a DialOption that sets a dialer to create +// connections. If FailOnNonTempDialError() is set to true, and an error is +// returned by f, gRPC checks the error's Temporary() method to decide if it +// should try to reconnect to the network address. +func WithContextDialer(f func(context.Context, string) (net.Conn, error)) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.Dialer = f + }) +} + +func init() { + internal.WithHealthCheckFunc = withHealthCheckFunc +} + +// WithDialer returns a DialOption that specifies a function to use for dialing +// network addresses. If FailOnNonTempDialError() is set to true, and an error +// is returned by f, gRPC checks the error's Temporary() method to decide if it +// should try to reconnect to the network address. +// +// Deprecated: use WithContextDialer instead. Will be supported throughout +// 1.x. +func WithDialer(f func(string, time.Duration) (net.Conn, error)) DialOption { + return WithContextDialer( + func(ctx context.Context, addr string) (net.Conn, error) { + if deadline, ok := ctx.Deadline(); ok { + return f(addr, time.Until(deadline)) + } + return f(addr, 0) + }) +} + +// WithStatsHandler returns a DialOption that specifies the stats handler for +// all the RPCs and underlying network connections in this ClientConn. +func WithStatsHandler(h stats.Handler) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.StatsHandler = h + }) +} + +// FailOnNonTempDialError returns a DialOption that specifies if gRPC fails on +// non-temporary dial errors. If f is true, and dialer returns a non-temporary +// error, gRPC will fail the connection to the network address and won't try to +// reconnect. The default value of FailOnNonTempDialError is false. +// +// FailOnNonTempDialError only affects the initial dial, and does not do +// anything useful unless you are also using WithBlock(). +// +// This is an EXPERIMENTAL API. +func FailOnNonTempDialError(f bool) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.FailOnNonTempDialError = f + }) +} + +// WithUserAgent returns a DialOption that specifies a user agent string for all +// the RPCs. +func WithUserAgent(s string) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.UserAgent = s + }) +} + +// WithKeepaliveParams returns a DialOption that specifies keepalive parameters +// for the client transport. +func WithKeepaliveParams(kp keepalive.ClientParameters) DialOption { + if kp.Time < internal.KeepaliveMinPingTime { + grpclog.Warningf("Adjusting keepalive ping interval to minimum period of %v", internal.KeepaliveMinPingTime) + kp.Time = internal.KeepaliveMinPingTime + } + return newFuncDialOption(func(o *dialOptions) { + o.copts.KeepaliveParams = kp + }) +} + +// WithUnaryInterceptor returns a DialOption that specifies the interceptor for +// unary RPCs. +func WithUnaryInterceptor(f UnaryClientInterceptor) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.unaryInt = f + }) +} + +// WithChainUnaryInterceptor returns a DialOption that specifies the chained +// interceptor for unary RPCs. The first interceptor will be the outer most, +// while the last interceptor will be the inner most wrapper around the real call. +// All interceptors added by this method will be chained, and the interceptor +// defined by WithUnaryInterceptor will always be prepended to the chain. +func WithChainUnaryInterceptor(interceptors ...UnaryClientInterceptor) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.chainUnaryInts = append(o.chainUnaryInts, interceptors...) + }) +} + +// WithStreamInterceptor returns a DialOption that specifies the interceptor for +// streaming RPCs. +func WithStreamInterceptor(f StreamClientInterceptor) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.streamInt = f + }) +} + +// WithChainStreamInterceptor returns a DialOption that specifies the chained +// interceptor for unary RPCs. The first interceptor will be the outer most, +// while the last interceptor will be the inner most wrapper around the real call. +// All interceptors added by this method will be chained, and the interceptor +// defined by WithStreamInterceptor will always be prepended to the chain. +func WithChainStreamInterceptor(interceptors ...StreamClientInterceptor) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.chainStreamInts = append(o.chainStreamInts, interceptors...) + }) +} + +// WithAuthority returns a DialOption that specifies the value to be used as the +// :authority pseudo-header. This value only works with WithInsecure and has no +// effect if TransportCredentials are present. +func WithAuthority(a string) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.authority = a + }) +} + +// WithChannelzParentID returns a DialOption that specifies the channelz ID of +// current ClientConn's parent. This function is used in nested channel creation +// (e.g. grpclb dial). +// +// This API is EXPERIMENTAL. +func WithChannelzParentID(id int64) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.channelzParentID = id + }) +} + +// WithDisableServiceConfig returns a DialOption that causes gRPC to ignore any +// service config provided by the resolver and provides a hint to the resolver +// to not fetch service configs. +// +// Note that this dial option only disables service config from resolver. If +// default service config is provided, gRPC will use the default service config. +func WithDisableServiceConfig() DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.disableServiceConfig = true + }) +} + +// WithDefaultServiceConfig returns a DialOption that configures the default +// service config, which will be used in cases where: +// +// 1. WithDisableServiceConfig is also used. +// 2. Resolver does not return a service config or if the resolver returns an +// invalid service config. +// +// This API is EXPERIMENTAL. +func WithDefaultServiceConfig(s string) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.defaultServiceConfigRawJSON = &s + }) +} + +// WithDisableRetry returns a DialOption that disables retries, even if the +// service config enables them. This does not impact transparent retries, which +// will happen automatically if no data is written to the wire or if the RPC is +// unprocessed by the remote server. +// +// Retry support is currently disabled by default, but will be enabled by +// default in the future. Until then, it may be enabled by setting the +// environment variable "GRPC_GO_RETRY" to "on". +// +// This API is EXPERIMENTAL. +func WithDisableRetry() DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.disableRetry = true + }) +} + +// WithMaxHeaderListSize returns a DialOption that specifies the maximum +// (uncompressed) size of header list that the client is prepared to accept. +func WithMaxHeaderListSize(s uint32) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.MaxHeaderListSize = &s + }) +} + +// WithDisableHealthCheck disables the LB channel health checking for all +// SubConns of this ClientConn. +// +// This API is EXPERIMENTAL. +func WithDisableHealthCheck() DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.disableHealthCheck = true + }) +} + +// withHealthCheckFunc replaces the default health check function with the +// provided one. It makes tests easier to change the health check function. +// +// For testing purpose only. +func withHealthCheckFunc(f internal.HealthChecker) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.healthCheckFunc = f + }) +} + +func defaultDialOptions() dialOptions { + return dialOptions{ + disableRetry: !envconfig.Retry, + healthCheckFunc: internal.HealthCheckFunc, + copts: transport.ConnectOptions{ + WriteBufferSize: defaultWriteBufSize, + ReadBufferSize: defaultReadBufSize, + }, + resolveNowBackoff: internalbackoff.DefaultExponential.Backoff, + withProxy: true, + } +} + +// withGetMinConnectDeadline specifies the function that clientconn uses to +// get minConnectDeadline. This can be used to make connection attempts happen +// faster/slower. +// +// For testing purpose only. +func withMinConnectDeadline(f func() time.Duration) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.minConnectTimeout = f + }) +} + +// withResolveNowBackoff specifies the function that clientconn uses to backoff +// between successive calls to resolver.ResolveNow(). +// +// For testing purpose only. +func withResolveNowBackoff(f func(int) time.Duration) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.resolveNowBackoff = f + }) +} + +// WithResolvers allows a list of resolver implementations to be registered +// locally with the ClientConn without needing to be globally registered via +// resolver.Register. They will be matched against the scheme used for the +// current Dial only, and will take precedence over the global registry. +// +// This API is EXPERIMENTAL. +func WithResolvers(rs ...resolver.Builder) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.resolvers = append(o.resolvers, rs...) + }) +} diff --git a/vendor/google.golang.org/grpc/doc.go b/vendor/google.golang.org/grpc/doc.go new file mode 100644 index 00000000..187adbb1 --- /dev/null +++ b/vendor/google.golang.org/grpc/doc.go @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/* +Package grpc implements an RPC system called gRPC. + +See grpc.io for more information about gRPC. +*/ +package grpc // import "google.golang.org/grpc" diff --git a/vendor/google.golang.org/grpc/encoding/encoding.go b/vendor/google.golang.org/grpc/encoding/encoding.go new file mode 100644 index 00000000..195e8448 --- /dev/null +++ b/vendor/google.golang.org/grpc/encoding/encoding.go @@ -0,0 +1,122 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package encoding defines the interface for the compressor and codec, and +// functions to register and retrieve compressors and codecs. +// +// This package is EXPERIMENTAL. +package encoding + +import ( + "io" + "strings" +) + +// Identity specifies the optional encoding for uncompressed streams. +// It is intended for grpc internal use only. +const Identity = "identity" + +// Compressor is used for compressing and decompressing when sending or +// receiving messages. +type Compressor interface { + // Compress writes the data written to wc to w after compressing it. If an + // error occurs while initializing the compressor, that error is returned + // instead. + Compress(w io.Writer) (io.WriteCloser, error) + // Decompress reads data from r, decompresses it, and provides the + // uncompressed data via the returned io.Reader. If an error occurs while + // initializing the decompressor, that error is returned instead. + Decompress(r io.Reader) (io.Reader, error) + // Name is the name of the compression codec and is used to set the content + // coding header. The result must be static; the result cannot change + // between calls. + Name() string + // EXPERIMENTAL: if a Compressor implements + // DecompressedSize(compressedBytes []byte) int, gRPC will call it + // to determine the size of the buffer allocated for the result of decompression. + // Return -1 to indicate unknown size. +} + +var registeredCompressor = make(map[string]Compressor) + +// RegisterCompressor registers the compressor with gRPC by its name. It can +// be activated when sending an RPC via grpc.UseCompressor(). It will be +// automatically accessed when receiving a message based on the content coding +// header. Servers also use it to send a response with the same encoding as +// the request. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple Compressors are +// registered with the same name, the one registered last will take effect. +func RegisterCompressor(c Compressor) { + registeredCompressor[c.Name()] = c +} + +// GetCompressor returns Compressor for the given compressor name. +func GetCompressor(name string) Compressor { + return registeredCompressor[name] +} + +// Codec defines the interface gRPC uses to encode and decode messages. Note +// that implementations of this interface must be thread safe; a Codec's +// methods can be called from concurrent goroutines. +type Codec interface { + // Marshal returns the wire format of v. + Marshal(v interface{}) ([]byte, error) + // Unmarshal parses the wire format into v. + Unmarshal(data []byte, v interface{}) error + // Name returns the name of the Codec implementation. The returned string + // will be used as part of content type in transmission. The result must be + // static; the result cannot change between calls. + Name() string +} + +var registeredCodecs = make(map[string]Codec) + +// RegisterCodec registers the provided Codec for use with all gRPC clients and +// servers. +// +// The Codec will be stored and looked up by result of its Name() method, which +// should match the content-subtype of the encoding handled by the Codec. This +// is case-insensitive, and is stored and looked up as lowercase. If the +// result of calling Name() is an empty string, RegisterCodec will panic. See +// Content-Type on +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple Compressors are +// registered with the same name, the one registered last will take effect. +func RegisterCodec(codec Codec) { + if codec == nil { + panic("cannot register a nil Codec") + } + if codec.Name() == "" { + panic("cannot register Codec with empty string result for Name()") + } + contentSubtype := strings.ToLower(codec.Name()) + registeredCodecs[contentSubtype] = codec +} + +// GetCodec gets a registered Codec by content-subtype, or nil if no Codec is +// registered for the content-subtype. +// +// The content-subtype is expected to be lowercase. +func GetCodec(contentSubtype string) Codec { + return registeredCodecs[contentSubtype] +} diff --git a/vendor/google.golang.org/grpc/encoding/proto/proto.go b/vendor/google.golang.org/grpc/encoding/proto/proto.go new file mode 100644 index 00000000..66b97a6f --- /dev/null +++ b/vendor/google.golang.org/grpc/encoding/proto/proto.go @@ -0,0 +1,110 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package proto defines the protobuf codec. Importing this package will +// register the codec. +package proto + +import ( + "math" + "sync" + + "github.com/golang/protobuf/proto" + "google.golang.org/grpc/encoding" +) + +// Name is the name registered for the proto compressor. +const Name = "proto" + +func init() { + encoding.RegisterCodec(codec{}) +} + +// codec is a Codec implementation with protobuf. It is the default codec for gRPC. +type codec struct{} + +type cachedProtoBuffer struct { + lastMarshaledSize uint32 + proto.Buffer +} + +func capToMaxInt32(val int) uint32 { + if val > math.MaxInt32 { + return uint32(math.MaxInt32) + } + return uint32(val) +} + +func marshal(v interface{}, cb *cachedProtoBuffer) ([]byte, error) { + protoMsg := v.(proto.Message) + newSlice := make([]byte, 0, cb.lastMarshaledSize) + + cb.SetBuf(newSlice) + cb.Reset() + if err := cb.Marshal(protoMsg); err != nil { + return nil, err + } + out := cb.Bytes() + cb.lastMarshaledSize = capToMaxInt32(len(out)) + return out, nil +} + +func (codec) Marshal(v interface{}) ([]byte, error) { + if pm, ok := v.(proto.Marshaler); ok { + // object can marshal itself, no need for buffer + return pm.Marshal() + } + + cb := protoBufferPool.Get().(*cachedProtoBuffer) + out, err := marshal(v, cb) + + // put back buffer and lose the ref to the slice + cb.SetBuf(nil) + protoBufferPool.Put(cb) + return out, err +} + +func (codec) Unmarshal(data []byte, v interface{}) error { + protoMsg := v.(proto.Message) + protoMsg.Reset() + + if pu, ok := protoMsg.(proto.Unmarshaler); ok { + // object can unmarshal itself, no need for buffer + return pu.Unmarshal(data) + } + + cb := protoBufferPool.Get().(*cachedProtoBuffer) + cb.SetBuf(data) + err := cb.Unmarshal(protoMsg) + cb.SetBuf(nil) + protoBufferPool.Put(cb) + return err +} + +func (codec) Name() string { + return Name +} + +var protoBufferPool = &sync.Pool{ + New: func() interface{} { + return &cachedProtoBuffer{ + Buffer: proto.Buffer{}, + lastMarshaledSize: 16, + } + }, +} diff --git a/vendor/google.golang.org/grpc/go.mod b/vendor/google.golang.org/grpc/go.mod new file mode 100644 index 00000000..ecef1ab0 --- /dev/null +++ b/vendor/google.golang.org/grpc/go.mod @@ -0,0 +1,16 @@ +module google.golang.org/grpc + +go 1.11 + +require ( + github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f + github.com/envoyproxy/go-control-plane v0.9.4 + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b + github.com/golang/mock v1.1.1 + github.com/golang/protobuf v1.3.3 + github.com/google/go-cmp v0.2.0 + golang.org/x/net v0.0.0-20190311183353-d8887717615a + golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be + golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a + google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 +) diff --git a/vendor/google.golang.org/grpc/go.sum b/vendor/google.golang.org/grpc/go.sum new file mode 100644 index 00000000..0bf9f074 --- /dev/null +++ b/vendor/google.golang.org/grpc/go.sum @@ -0,0 +1,64 @@ +cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 h1:5Beo0mZN8dRzgrMMkDp0jc8YXQKx9DiJ2k1dkvGsn5A= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/google.golang.org/grpc/grpclog/grpclog.go b/vendor/google.golang.org/grpc/grpclog/grpclog.go new file mode 100644 index 00000000..c8bb2be3 --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclog/grpclog.go @@ -0,0 +1,132 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package grpclog defines logging for grpc. +// +// All logs in transport and grpclb packages only go to verbose level 2. +// All logs in other packages in grpc are logged in spite of the verbosity level. +// +// In the default logger, +// severity level can be set by environment variable GRPC_GO_LOG_SEVERITY_LEVEL, +// verbosity level can be set by GRPC_GO_LOG_VERBOSITY_LEVEL. +package grpclog // import "google.golang.org/grpc/grpclog" + +import ( + "os" + + "google.golang.org/grpc/internal/grpclog" +) + +func init() { + SetLoggerV2(newLoggerV2()) +} + +// V reports whether verbosity level l is at least the requested verbose level. +func V(l int) bool { + return grpclog.Logger.V(l) +} + +// Info logs to the INFO log. +func Info(args ...interface{}) { + grpclog.Logger.Info(args...) +} + +// Infof logs to the INFO log. Arguments are handled in the manner of fmt.Printf. +func Infof(format string, args ...interface{}) { + grpclog.Logger.Infof(format, args...) +} + +// Infoln logs to the INFO log. Arguments are handled in the manner of fmt.Println. +func Infoln(args ...interface{}) { + grpclog.Logger.Infoln(args...) +} + +// Warning logs to the WARNING log. +func Warning(args ...interface{}) { + grpclog.Logger.Warning(args...) +} + +// Warningf logs to the WARNING log. Arguments are handled in the manner of fmt.Printf. +func Warningf(format string, args ...interface{}) { + grpclog.Logger.Warningf(format, args...) +} + +// Warningln logs to the WARNING log. Arguments are handled in the manner of fmt.Println. +func Warningln(args ...interface{}) { + grpclog.Logger.Warningln(args...) +} + +// Error logs to the ERROR log. +func Error(args ...interface{}) { + grpclog.Logger.Error(args...) +} + +// Errorf logs to the ERROR log. Arguments are handled in the manner of fmt.Printf. +func Errorf(format string, args ...interface{}) { + grpclog.Logger.Errorf(format, args...) +} + +// Errorln logs to the ERROR log. Arguments are handled in the manner of fmt.Println. +func Errorln(args ...interface{}) { + grpclog.Logger.Errorln(args...) +} + +// Fatal logs to the FATAL log. Arguments are handled in the manner of fmt.Print. +// It calls os.Exit() with exit code 1. +func Fatal(args ...interface{}) { + grpclog.Logger.Fatal(args...) + // Make sure fatal logs will exit. + os.Exit(1) +} + +// Fatalf logs to the FATAL log. Arguments are handled in the manner of fmt.Printf. +// It calls os.Exit() with exit code 1. +func Fatalf(format string, args ...interface{}) { + grpclog.Logger.Fatalf(format, args...) + // Make sure fatal logs will exit. + os.Exit(1) +} + +// Fatalln logs to the FATAL log. Arguments are handled in the manner of fmt.Println. +// It calle os.Exit()) with exit code 1. +func Fatalln(args ...interface{}) { + grpclog.Logger.Fatalln(args...) + // Make sure fatal logs will exit. + os.Exit(1) +} + +// Print prints to the logger. Arguments are handled in the manner of fmt.Print. +// +// Deprecated: use Info. +func Print(args ...interface{}) { + grpclog.Logger.Info(args...) +} + +// Printf prints to the logger. Arguments are handled in the manner of fmt.Printf. +// +// Deprecated: use Infof. +func Printf(format string, args ...interface{}) { + grpclog.Logger.Infof(format, args...) +} + +// Println prints to the logger. Arguments are handled in the manner of fmt.Println. +// +// Deprecated: use Infoln. +func Println(args ...interface{}) { + grpclog.Logger.Infoln(args...) +} diff --git a/vendor/google.golang.org/grpc/grpclog/logger.go b/vendor/google.golang.org/grpc/grpclog/logger.go new file mode 100644 index 00000000..ef06a482 --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclog/logger.go @@ -0,0 +1,87 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpclog + +import "google.golang.org/grpc/internal/grpclog" + +// Logger mimics golang's standard Logger as an interface. +// +// Deprecated: use LoggerV2. +type Logger interface { + Fatal(args ...interface{}) + Fatalf(format string, args ...interface{}) + Fatalln(args ...interface{}) + Print(args ...interface{}) + Printf(format string, args ...interface{}) + Println(args ...interface{}) +} + +// SetLogger sets the logger that is used in grpc. Call only from +// init() functions. +// +// Deprecated: use SetLoggerV2. +func SetLogger(l Logger) { + grpclog.Logger = &loggerWrapper{Logger: l} +} + +// loggerWrapper wraps Logger into a LoggerV2. +type loggerWrapper struct { + Logger +} + +func (g *loggerWrapper) Info(args ...interface{}) { + g.Logger.Print(args...) +} + +func (g *loggerWrapper) Infoln(args ...interface{}) { + g.Logger.Println(args...) +} + +func (g *loggerWrapper) Infof(format string, args ...interface{}) { + g.Logger.Printf(format, args...) +} + +func (g *loggerWrapper) Warning(args ...interface{}) { + g.Logger.Print(args...) +} + +func (g *loggerWrapper) Warningln(args ...interface{}) { + g.Logger.Println(args...) +} + +func (g *loggerWrapper) Warningf(format string, args ...interface{}) { + g.Logger.Printf(format, args...) +} + +func (g *loggerWrapper) Error(args ...interface{}) { + g.Logger.Print(args...) +} + +func (g *loggerWrapper) Errorln(args ...interface{}) { + g.Logger.Println(args...) +} + +func (g *loggerWrapper) Errorf(format string, args ...interface{}) { + g.Logger.Printf(format, args...) +} + +func (g *loggerWrapper) V(l int) bool { + // Returns true for all verbose level. + return true +} diff --git a/vendor/google.golang.org/grpc/grpclog/loggerv2.go b/vendor/google.golang.org/grpc/grpclog/loggerv2.go new file mode 100644 index 00000000..23612b7c --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclog/loggerv2.go @@ -0,0 +1,214 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpclog + +import ( + "io" + "io/ioutil" + "log" + "os" + "strconv" + + "google.golang.org/grpc/internal/grpclog" +) + +// LoggerV2 does underlying logging work for grpclog. +type LoggerV2 interface { + // Info logs to INFO log. Arguments are handled in the manner of fmt.Print. + Info(args ...interface{}) + // Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. + Infoln(args ...interface{}) + // Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. + Infof(format string, args ...interface{}) + // Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. + Warning(args ...interface{}) + // Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. + Warningln(args ...interface{}) + // Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. + Warningf(format string, args ...interface{}) + // Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. + Error(args ...interface{}) + // Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. + Errorln(args ...interface{}) + // Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. + Errorf(format string, args ...interface{}) + // Fatal logs to ERROR log. Arguments are handled in the manner of fmt.Print. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatal(args ...interface{}) + // Fatalln logs to ERROR log. Arguments are handled in the manner of fmt.Println. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatalln(args ...interface{}) + // Fatalf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatalf(format string, args ...interface{}) + // V reports whether verbosity level l is at least the requested verbose level. + V(l int) bool +} + +// SetLoggerV2 sets logger that is used in grpc to a V2 logger. +// Not mutex-protected, should be called before any gRPC functions. +func SetLoggerV2(l LoggerV2) { + grpclog.Logger = l + grpclog.DepthLogger, _ = l.(grpclog.DepthLoggerV2) +} + +const ( + // infoLog indicates Info severity. + infoLog int = iota + // warningLog indicates Warning severity. + warningLog + // errorLog indicates Error severity. + errorLog + // fatalLog indicates Fatal severity. + fatalLog +) + +// severityName contains the string representation of each severity. +var severityName = []string{ + infoLog: "INFO", + warningLog: "WARNING", + errorLog: "ERROR", + fatalLog: "FATAL", +} + +// loggerT is the default logger used by grpclog. +type loggerT struct { + m []*log.Logger + v int +} + +// NewLoggerV2 creates a loggerV2 with the provided writers. +// Fatal logs will be written to errorW, warningW, infoW, followed by exit(1). +// Error logs will be written to errorW, warningW and infoW. +// Warning logs will be written to warningW and infoW. +// Info logs will be written to infoW. +func NewLoggerV2(infoW, warningW, errorW io.Writer) LoggerV2 { + return NewLoggerV2WithVerbosity(infoW, warningW, errorW, 0) +} + +// NewLoggerV2WithVerbosity creates a loggerV2 with the provided writers and +// verbosity level. +func NewLoggerV2WithVerbosity(infoW, warningW, errorW io.Writer, v int) LoggerV2 { + var m []*log.Logger + m = append(m, log.New(infoW, severityName[infoLog]+": ", log.LstdFlags)) + m = append(m, log.New(io.MultiWriter(infoW, warningW), severityName[warningLog]+": ", log.LstdFlags)) + ew := io.MultiWriter(infoW, warningW, errorW) // ew will be used for error and fatal. + m = append(m, log.New(ew, severityName[errorLog]+": ", log.LstdFlags)) + m = append(m, log.New(ew, severityName[fatalLog]+": ", log.LstdFlags)) + return &loggerT{m: m, v: v} +} + +// newLoggerV2 creates a loggerV2 to be used as default logger. +// All logs are written to stderr. +func newLoggerV2() LoggerV2 { + errorW := ioutil.Discard + warningW := ioutil.Discard + infoW := ioutil.Discard + + logLevel := os.Getenv("GRPC_GO_LOG_SEVERITY_LEVEL") + switch logLevel { + case "", "ERROR", "error": // If env is unset, set level to ERROR. + errorW = os.Stderr + case "WARNING", "warning": + warningW = os.Stderr + case "INFO", "info": + infoW = os.Stderr + } + + var v int + vLevel := os.Getenv("GRPC_GO_LOG_VERBOSITY_LEVEL") + if vl, err := strconv.Atoi(vLevel); err == nil { + v = vl + } + return NewLoggerV2WithVerbosity(infoW, warningW, errorW, v) +} + +func (g *loggerT) Info(args ...interface{}) { + g.m[infoLog].Print(args...) +} + +func (g *loggerT) Infoln(args ...interface{}) { + g.m[infoLog].Println(args...) +} + +func (g *loggerT) Infof(format string, args ...interface{}) { + g.m[infoLog].Printf(format, args...) +} + +func (g *loggerT) Warning(args ...interface{}) { + g.m[warningLog].Print(args...) +} + +func (g *loggerT) Warningln(args ...interface{}) { + g.m[warningLog].Println(args...) +} + +func (g *loggerT) Warningf(format string, args ...interface{}) { + g.m[warningLog].Printf(format, args...) +} + +func (g *loggerT) Error(args ...interface{}) { + g.m[errorLog].Print(args...) +} + +func (g *loggerT) Errorln(args ...interface{}) { + g.m[errorLog].Println(args...) +} + +func (g *loggerT) Errorf(format string, args ...interface{}) { + g.m[errorLog].Printf(format, args...) +} + +func (g *loggerT) Fatal(args ...interface{}) { + g.m[fatalLog].Fatal(args...) + // No need to call os.Exit() again because log.Logger.Fatal() calls os.Exit(). +} + +func (g *loggerT) Fatalln(args ...interface{}) { + g.m[fatalLog].Fatalln(args...) + // No need to call os.Exit() again because log.Logger.Fatal() calls os.Exit(). +} + +func (g *loggerT) Fatalf(format string, args ...interface{}) { + g.m[fatalLog].Fatalf(format, args...) + // No need to call os.Exit() again because log.Logger.Fatal() calls os.Exit(). +} + +func (g *loggerT) V(l int) bool { + return l <= g.v +} + +// DepthLoggerV2 logs at a specified call frame. If a LoggerV2 also implements +// DepthLoggerV2, the below functions will be called with the appropriate stack +// depth set for trivial functions the logger may ignore. +// +// This API is EXPERIMENTAL. +type DepthLoggerV2 interface { + // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Print. + InfoDepth(depth int, args ...interface{}) + // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Print. + WarningDepth(depth int, args ...interface{}) + // ErrorDetph logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Print. + ErrorDepth(depth int, args ...interface{}) + // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Print. + FatalDepth(depth int, args ...interface{}) +} diff --git a/vendor/google.golang.org/grpc/install_gae.sh b/vendor/google.golang.org/grpc/install_gae.sh new file mode 100644 index 00000000..7c7bcada --- /dev/null +++ b/vendor/google.golang.org/grpc/install_gae.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +TMP=$(mktemp -d /tmp/sdk.XXX) \ +&& curl -o $TMP.zip "https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.68.zip" \ +&& unzip -q $TMP.zip -d $TMP \ +&& export PATH="$PATH:$TMP/go_appengine" diff --git a/vendor/google.golang.org/grpc/interceptor.go b/vendor/google.golang.org/grpc/interceptor.go new file mode 100644 index 00000000..8b735002 --- /dev/null +++ b/vendor/google.golang.org/grpc/interceptor.go @@ -0,0 +1,77 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "context" +) + +// UnaryInvoker is called by UnaryClientInterceptor to complete RPCs. +type UnaryInvoker func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, opts ...CallOption) error + +// UnaryClientInterceptor intercepts the execution of a unary RPC on the client. invoker is the handler to complete the RPC +// and it is the responsibility of the interceptor to call it. +// This is an EXPERIMENTAL API. +type UnaryClientInterceptor func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, invoker UnaryInvoker, opts ...CallOption) error + +// Streamer is called by StreamClientInterceptor to create a ClientStream. +type Streamer func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (ClientStream, error) + +// StreamClientInterceptor intercepts the creation of ClientStream. It may return a custom ClientStream to intercept all I/O +// operations. streamer is the handler to create a ClientStream and it is the responsibility of the interceptor to call it. +// This is an EXPERIMENTAL API. +type StreamClientInterceptor func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, streamer Streamer, opts ...CallOption) (ClientStream, error) + +// UnaryServerInfo consists of various information about a unary RPC on +// server side. All per-rpc information may be mutated by the interceptor. +type UnaryServerInfo struct { + // Server is the service implementation the user provides. This is read-only. + Server interface{} + // FullMethod is the full RPC method string, i.e., /package.service/method. + FullMethod string +} + +// UnaryHandler defines the handler invoked by UnaryServerInterceptor to complete the normal +// execution of a unary RPC. If a UnaryHandler returns an error, it should be produced by the +// status package, or else gRPC will use codes.Unknown as the status code and err.Error() as +// the status message of the RPC. +type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error) + +// UnaryServerInterceptor provides a hook to intercept the execution of a unary RPC on the server. info +// contains all the information of this RPC the interceptor can operate on. And handler is the wrapper +// of the service method implementation. It is the responsibility of the interceptor to invoke handler +// to complete the RPC. +type UnaryServerInterceptor func(ctx context.Context, req interface{}, info *UnaryServerInfo, handler UnaryHandler) (resp interface{}, err error) + +// StreamServerInfo consists of various information about a streaming RPC on +// server side. All per-rpc information may be mutated by the interceptor. +type StreamServerInfo struct { + // FullMethod is the full RPC method string, i.e., /package.service/method. + FullMethod string + // IsClientStream indicates whether the RPC is a client streaming RPC. + IsClientStream bool + // IsServerStream indicates whether the RPC is a server streaming RPC. + IsServerStream bool +} + +// StreamServerInterceptor provides a hook to intercept the execution of a streaming RPC on the server. +// info contains all the information of this RPC the interceptor can operate on. And handler is the +// service method implementation. It is the responsibility of the interceptor to invoke handler to +// complete the RPC. +type StreamServerInterceptor func(srv interface{}, ss ServerStream, info *StreamServerInfo, handler StreamHandler) error diff --git a/vendor/google.golang.org/grpc/internal/backoff/backoff.go b/vendor/google.golang.org/grpc/internal/backoff/backoff.go new file mode 100644 index 00000000..5fc0ee3d --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/backoff/backoff.go @@ -0,0 +1,73 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package backoff implement the backoff strategy for gRPC. +// +// This is kept in internal until the gRPC project decides whether or not to +// allow alternative backoff strategies. +package backoff + +import ( + "time" + + grpcbackoff "google.golang.org/grpc/backoff" + "google.golang.org/grpc/internal/grpcrand" +) + +// Strategy defines the methodology for backing off after a grpc connection +// failure. +type Strategy interface { + // Backoff returns the amount of time to wait before the next retry given + // the number of consecutive failures. + Backoff(retries int) time.Duration +} + +// DefaultExponential is an exponential backoff implementation using the +// default values for all the configurable knobs defined in +// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. +var DefaultExponential = Exponential{Config: grpcbackoff.DefaultConfig} + +// Exponential implements exponential backoff algorithm as defined in +// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. +type Exponential struct { + // Config contains all options to configure the backoff algorithm. + Config grpcbackoff.Config +} + +// Backoff returns the amount of time to wait before the next retry given the +// number of retries. +func (bc Exponential) Backoff(retries int) time.Duration { + if retries == 0 { + return bc.Config.BaseDelay + } + backoff, max := float64(bc.Config.BaseDelay), float64(bc.Config.MaxDelay) + for backoff < max && retries > 0 { + backoff *= bc.Config.Multiplier + retries-- + } + if backoff > max { + backoff = max + } + // Randomize backoff delays so that if a cluster of requests start at + // the same time, they won't operate in lockstep. + backoff *= 1 + bc.Config.Jitter*(grpcrand.Float64()*2-1) + if backoff < 0 { + return 0 + } + return time.Duration(backoff) +} diff --git a/vendor/google.golang.org/grpc/internal/balancerload/load.go b/vendor/google.golang.org/grpc/internal/balancerload/load.go new file mode 100644 index 00000000..3a905d96 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/balancerload/load.go @@ -0,0 +1,46 @@ +/* + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package balancerload defines APIs to parse server loads in trailers. The +// parsed loads are sent to balancers in DoneInfo. +package balancerload + +import ( + "google.golang.org/grpc/metadata" +) + +// Parser converts loads from metadata into a concrete type. +type Parser interface { + // Parse parses loads from metadata. + Parse(md metadata.MD) interface{} +} + +var parser Parser + +// SetParser sets the load parser. +// +// Not mutex-protected, should be called before any gRPC functions. +func SetParser(lr Parser) { + parser = lr +} + +// Parse calls parser.Read(). +func Parse(md metadata.MD) interface{} { + if parser == nil { + return nil + } + return parser.Parse(md) +} diff --git a/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go b/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go new file mode 100644 index 00000000..8b105167 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/binarylog/binarylog.go @@ -0,0 +1,167 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package binarylog implementation binary logging as defined in +// https://github.com/grpc/proposal/blob/master/A16-binary-logging.md. +package binarylog + +import ( + "fmt" + "os" + + "google.golang.org/grpc/grpclog" +) + +// Logger is the global binary logger. It can be used to get binary logger for +// each method. +type Logger interface { + getMethodLogger(methodName string) *MethodLogger +} + +// binLogger is the global binary logger for the binary. One of this should be +// built at init time from the configuration (environment variable or flags). +// +// It is used to get a methodLogger for each individual method. +var binLogger Logger + +// SetLogger sets the binarg logger. +// +// Only call this at init time. +func SetLogger(l Logger) { + binLogger = l +} + +// GetMethodLogger returns the methodLogger for the given methodName. +// +// methodName should be in the format of "/service/method". +// +// Each methodLogger returned by this method is a new instance. This is to +// generate sequence id within the call. +func GetMethodLogger(methodName string) *MethodLogger { + if binLogger == nil { + return nil + } + return binLogger.getMethodLogger(methodName) +} + +func init() { + const envStr = "GRPC_BINARY_LOG_FILTER" + configStr := os.Getenv(envStr) + binLogger = NewLoggerFromConfigString(configStr) +} + +type methodLoggerConfig struct { + // Max length of header and message. + hdr, msg uint64 +} + +type logger struct { + all *methodLoggerConfig + services map[string]*methodLoggerConfig + methods map[string]*methodLoggerConfig + + blacklist map[string]struct{} +} + +// newEmptyLogger creates an empty logger. The map fields need to be filled in +// using the set* functions. +func newEmptyLogger() *logger { + return &logger{} +} + +// Set method logger for "*". +func (l *logger) setDefaultMethodLogger(ml *methodLoggerConfig) error { + if l.all != nil { + return fmt.Errorf("conflicting global rules found") + } + l.all = ml + return nil +} + +// Set method logger for "service/*". +// +// New methodLogger with same service overrides the old one. +func (l *logger) setServiceMethodLogger(service string, ml *methodLoggerConfig) error { + if _, ok := l.services[service]; ok { + return fmt.Errorf("conflicting service rules for service %v found", service) + } + if l.services == nil { + l.services = make(map[string]*methodLoggerConfig) + } + l.services[service] = ml + return nil +} + +// Set method logger for "service/method". +// +// New methodLogger with same method overrides the old one. +func (l *logger) setMethodMethodLogger(method string, ml *methodLoggerConfig) error { + if _, ok := l.blacklist[method]; ok { + return fmt.Errorf("conflicting blacklist rules for method %v found", method) + } + if _, ok := l.methods[method]; ok { + return fmt.Errorf("conflicting method rules for method %v found", method) + } + if l.methods == nil { + l.methods = make(map[string]*methodLoggerConfig) + } + l.methods[method] = ml + return nil +} + +// Set blacklist method for "-service/method". +func (l *logger) setBlacklist(method string) error { + if _, ok := l.blacklist[method]; ok { + return fmt.Errorf("conflicting blacklist rules for method %v found", method) + } + if _, ok := l.methods[method]; ok { + return fmt.Errorf("conflicting method rules for method %v found", method) + } + if l.blacklist == nil { + l.blacklist = make(map[string]struct{}) + } + l.blacklist[method] = struct{}{} + return nil +} + +// getMethodLogger returns the methodLogger for the given methodName. +// +// methodName should be in the format of "/service/method". +// +// Each methodLogger returned by this method is a new instance. This is to +// generate sequence id within the call. +func (l *logger) getMethodLogger(methodName string) *MethodLogger { + s, m, err := parseMethodName(methodName) + if err != nil { + grpclog.Infof("binarylogging: failed to parse %q: %v", methodName, err) + return nil + } + if ml, ok := l.methods[s+"/"+m]; ok { + return newMethodLogger(ml.hdr, ml.msg) + } + if _, ok := l.blacklist[s+"/"+m]; ok { + return nil + } + if ml, ok := l.services[s]; ok { + return newMethodLogger(ml.hdr, ml.msg) + } + if l.all == nil { + return nil + } + return newMethodLogger(l.all.hdr, l.all.msg) +} diff --git a/vendor/google.golang.org/grpc/internal/binarylog/binarylog_testutil.go b/vendor/google.golang.org/grpc/internal/binarylog/binarylog_testutil.go new file mode 100644 index 00000000..1ee00a39 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/binarylog/binarylog_testutil.go @@ -0,0 +1,42 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// This file contains exported variables/functions that are exported for testing +// only. +// +// An ideal way for this would be to put those in a *_test.go but in binarylog +// package. But this doesn't work with staticcheck with go module. Error was: +// "MdToMetadataProto not declared by package binarylog". This could be caused +// by the way staticcheck looks for files for a certain package, which doesn't +// support *_test.go files. +// +// Move those to binary_test.go when staticcheck is fixed. + +package binarylog + +var ( + // AllLogger is a logger that logs all headers/messages for all RPCs. It's + // for testing only. + AllLogger = NewLoggerFromConfigString("*") + // MdToMetadataProto converts metadata to a binary logging proto message. + // It's for testing only. + MdToMetadataProto = mdToMetadataProto + // AddrToProto converts an address to a binary logging proto message. It's + // for testing only. + AddrToProto = addrToProto +) diff --git a/vendor/google.golang.org/grpc/internal/binarylog/env_config.go b/vendor/google.golang.org/grpc/internal/binarylog/env_config.go new file mode 100644 index 00000000..be30d0e6 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/binarylog/env_config.go @@ -0,0 +1,210 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package binarylog + +import ( + "errors" + "fmt" + "regexp" + "strconv" + "strings" + + "google.golang.org/grpc/grpclog" +) + +// NewLoggerFromConfigString reads the string and build a logger. It can be used +// to build a new logger and assign it to binarylog.Logger. +// +// Example filter config strings: +// - "" Nothing will be logged +// - "*" All headers and messages will be fully logged. +// - "*{h}" Only headers will be logged. +// - "*{m:256}" Only the first 256 bytes of each message will be logged. +// - "Foo/*" Logs every method in service Foo +// - "Foo/*,-Foo/Bar" Logs every method in service Foo except method /Foo/Bar +// - "Foo/*,Foo/Bar{m:256}" Logs the first 256 bytes of each message in method +// /Foo/Bar, logs all headers and messages in every other method in service +// Foo. +// +// If two configs exist for one certain method or service, the one specified +// later overrides the previous config. +func NewLoggerFromConfigString(s string) Logger { + if s == "" { + return nil + } + l := newEmptyLogger() + methods := strings.Split(s, ",") + for _, method := range methods { + if err := l.fillMethodLoggerWithConfigString(method); err != nil { + grpclog.Warningf("failed to parse binary log config: %v", err) + return nil + } + } + return l +} + +// fillMethodLoggerWithConfigString parses config, creates methodLogger and adds +// it to the right map in the logger. +func (l *logger) fillMethodLoggerWithConfigString(config string) error { + // "" is invalid. + if config == "" { + return errors.New("empty string is not a valid method binary logging config") + } + + // "-service/method", blacklist, no * or {} allowed. + if config[0] == '-' { + s, m, suffix, err := parseMethodConfigAndSuffix(config[1:]) + if err != nil { + return fmt.Errorf("invalid config: %q, %v", config, err) + } + if m == "*" { + return fmt.Errorf("invalid config: %q, %v", config, "* not allowed in blacklist config") + } + if suffix != "" { + return fmt.Errorf("invalid config: %q, %v", config, "header/message limit not allowed in blacklist config") + } + if err := l.setBlacklist(s + "/" + m); err != nil { + return fmt.Errorf("invalid config: %v", err) + } + return nil + } + + // "*{h:256;m:256}" + if config[0] == '*' { + hdr, msg, err := parseHeaderMessageLengthConfig(config[1:]) + if err != nil { + return fmt.Errorf("invalid config: %q, %v", config, err) + } + if err := l.setDefaultMethodLogger(&methodLoggerConfig{hdr: hdr, msg: msg}); err != nil { + return fmt.Errorf("invalid config: %v", err) + } + return nil + } + + s, m, suffix, err := parseMethodConfigAndSuffix(config) + if err != nil { + return fmt.Errorf("invalid config: %q, %v", config, err) + } + hdr, msg, err := parseHeaderMessageLengthConfig(suffix) + if err != nil { + return fmt.Errorf("invalid header/message length config: %q, %v", suffix, err) + } + if m == "*" { + if err := l.setServiceMethodLogger(s, &methodLoggerConfig{hdr: hdr, msg: msg}); err != nil { + return fmt.Errorf("invalid config: %v", err) + } + } else { + if err := l.setMethodMethodLogger(s+"/"+m, &methodLoggerConfig{hdr: hdr, msg: msg}); err != nil { + return fmt.Errorf("invalid config: %v", err) + } + } + return nil +} + +const ( + // TODO: this const is only used by env_config now. But could be useful for + // other config. Move to binarylog.go if necessary. + maxUInt = ^uint64(0) + + // For "p.s/m" plus any suffix. Suffix will be parsed again. See test for + // expected output. + longMethodConfigRegexpStr = `^([\w./]+)/((?:\w+)|[*])(.+)?$` + + // For suffix from above, "{h:123,m:123}". See test for expected output. + optionalLengthRegexpStr = `(?::(\d+))?` // Optional ":123". + headerConfigRegexpStr = `^{h` + optionalLengthRegexpStr + `}$` + messageConfigRegexpStr = `^{m` + optionalLengthRegexpStr + `}$` + headerMessageConfigRegexpStr = `^{h` + optionalLengthRegexpStr + `;m` + optionalLengthRegexpStr + `}$` +) + +var ( + longMethodConfigRegexp = regexp.MustCompile(longMethodConfigRegexpStr) + headerConfigRegexp = regexp.MustCompile(headerConfigRegexpStr) + messageConfigRegexp = regexp.MustCompile(messageConfigRegexpStr) + headerMessageConfigRegexp = regexp.MustCompile(headerMessageConfigRegexpStr) +) + +// Turn "service/method{h;m}" into "service", "method", "{h;m}". +func parseMethodConfigAndSuffix(c string) (service, method, suffix string, _ error) { + // Regexp result: + // + // in: "p.s/m{h:123,m:123}", + // out: []string{"p.s/m{h:123,m:123}", "p.s", "m", "{h:123,m:123}"}, + match := longMethodConfigRegexp.FindStringSubmatch(c) + if match == nil { + return "", "", "", fmt.Errorf("%q contains invalid substring", c) + } + service = match[1] + method = match[2] + suffix = match[3] + return +} + +// Turn "{h:123;m:345}" into 123, 345. +// +// Return maxUInt if length is unspecified. +func parseHeaderMessageLengthConfig(c string) (hdrLenStr, msgLenStr uint64, err error) { + if c == "" { + return maxUInt, maxUInt, nil + } + // Header config only. + if match := headerConfigRegexp.FindStringSubmatch(c); match != nil { + if s := match[1]; s != "" { + hdrLenStr, err = strconv.ParseUint(s, 10, 64) + if err != nil { + return 0, 0, fmt.Errorf("failed to convert %q to uint", s) + } + return hdrLenStr, 0, nil + } + return maxUInt, 0, nil + } + + // Message config only. + if match := messageConfigRegexp.FindStringSubmatch(c); match != nil { + if s := match[1]; s != "" { + msgLenStr, err = strconv.ParseUint(s, 10, 64) + if err != nil { + return 0, 0, fmt.Errorf("failed to convert %q to uint", s) + } + return 0, msgLenStr, nil + } + return 0, maxUInt, nil + } + + // Header and message config both. + if match := headerMessageConfigRegexp.FindStringSubmatch(c); match != nil { + // Both hdr and msg are specified, but one or two of them might be empty. + hdrLenStr = maxUInt + msgLenStr = maxUInt + if s := match[1]; s != "" { + hdrLenStr, err = strconv.ParseUint(s, 10, 64) + if err != nil { + return 0, 0, fmt.Errorf("failed to convert %q to uint", s) + } + } + if s := match[2]; s != "" { + msgLenStr, err = strconv.ParseUint(s, 10, 64) + if err != nil { + return 0, 0, fmt.Errorf("failed to convert %q to uint", s) + } + } + return hdrLenStr, msgLenStr, nil + } + return 0, 0, fmt.Errorf("%q contains invalid substring", c) +} diff --git a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go new file mode 100644 index 00000000..160f6e86 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go @@ -0,0 +1,423 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package binarylog + +import ( + "net" + "strings" + "sync/atomic" + "time" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes" + pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +type callIDGenerator struct { + id uint64 +} + +func (g *callIDGenerator) next() uint64 { + id := atomic.AddUint64(&g.id, 1) + return id +} + +// reset is for testing only, and doesn't need to be thread safe. +func (g *callIDGenerator) reset() { + g.id = 0 +} + +var idGen callIDGenerator + +// MethodLogger is the sub-logger for each method. +type MethodLogger struct { + headerMaxLen, messageMaxLen uint64 + + callID uint64 + idWithinCallGen *callIDGenerator + + sink Sink // TODO(blog): make this plugable. +} + +func newMethodLogger(h, m uint64) *MethodLogger { + return &MethodLogger{ + headerMaxLen: h, + messageMaxLen: m, + + callID: idGen.next(), + idWithinCallGen: &callIDGenerator{}, + + sink: defaultSink, // TODO(blog): make it plugable. + } +} + +// Log creates a proto binary log entry, and logs it to the sink. +func (ml *MethodLogger) Log(c LogEntryConfig) { + m := c.toProto() + timestamp, _ := ptypes.TimestampProto(time.Now()) + m.Timestamp = timestamp + m.CallId = ml.callID + m.SequenceIdWithinCall = ml.idWithinCallGen.next() + + switch pay := m.Payload.(type) { + case *pb.GrpcLogEntry_ClientHeader: + m.PayloadTruncated = ml.truncateMetadata(pay.ClientHeader.GetMetadata()) + case *pb.GrpcLogEntry_ServerHeader: + m.PayloadTruncated = ml.truncateMetadata(pay.ServerHeader.GetMetadata()) + case *pb.GrpcLogEntry_Message: + m.PayloadTruncated = ml.truncateMessage(pay.Message) + } + + ml.sink.Write(m) +} + +func (ml *MethodLogger) truncateMetadata(mdPb *pb.Metadata) (truncated bool) { + if ml.headerMaxLen == maxUInt { + return false + } + var ( + bytesLimit = ml.headerMaxLen + index int + ) + // At the end of the loop, index will be the first entry where the total + // size is greater than the limit: + // + // len(entry[:index]) <= ml.hdr && len(entry[:index+1]) > ml.hdr. + for ; index < len(mdPb.Entry); index++ { + entry := mdPb.Entry[index] + if entry.Key == "grpc-trace-bin" { + // "grpc-trace-bin" is a special key. It's kept in the log entry, + // but not counted towards the size limit. + continue + } + currentEntryLen := uint64(len(entry.Value)) + if currentEntryLen > bytesLimit { + break + } + bytesLimit -= currentEntryLen + } + truncated = index < len(mdPb.Entry) + mdPb.Entry = mdPb.Entry[:index] + return truncated +} + +func (ml *MethodLogger) truncateMessage(msgPb *pb.Message) (truncated bool) { + if ml.messageMaxLen == maxUInt { + return false + } + if ml.messageMaxLen >= uint64(len(msgPb.Data)) { + return false + } + msgPb.Data = msgPb.Data[:ml.messageMaxLen] + return true +} + +// LogEntryConfig represents the configuration for binary log entry. +type LogEntryConfig interface { + toProto() *pb.GrpcLogEntry +} + +// ClientHeader configs the binary log entry to be a ClientHeader entry. +type ClientHeader struct { + OnClientSide bool + Header metadata.MD + MethodName string + Authority string + Timeout time.Duration + // PeerAddr is required only when it's on server side. + PeerAddr net.Addr +} + +func (c *ClientHeader) toProto() *pb.GrpcLogEntry { + // This function doesn't need to set all the fields (e.g. seq ID). The Log + // function will set the fields when necessary. + clientHeader := &pb.ClientHeader{ + Metadata: mdToMetadataProto(c.Header), + MethodName: c.MethodName, + Authority: c.Authority, + } + if c.Timeout > 0 { + clientHeader.Timeout = ptypes.DurationProto(c.Timeout) + } + ret := &pb.GrpcLogEntry{ + Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_HEADER, + Payload: &pb.GrpcLogEntry_ClientHeader{ + ClientHeader: clientHeader, + }, + } + if c.OnClientSide { + ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + } else { + ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + } + if c.PeerAddr != nil { + ret.Peer = addrToProto(c.PeerAddr) + } + return ret +} + +// ServerHeader configs the binary log entry to be a ServerHeader entry. +type ServerHeader struct { + OnClientSide bool + Header metadata.MD + // PeerAddr is required only when it's on client side. + PeerAddr net.Addr +} + +func (c *ServerHeader) toProto() *pb.GrpcLogEntry { + ret := &pb.GrpcLogEntry{ + Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_HEADER, + Payload: &pb.GrpcLogEntry_ServerHeader{ + ServerHeader: &pb.ServerHeader{ + Metadata: mdToMetadataProto(c.Header), + }, + }, + } + if c.OnClientSide { + ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + } else { + ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + } + if c.PeerAddr != nil { + ret.Peer = addrToProto(c.PeerAddr) + } + return ret +} + +// ClientMessage configs the binary log entry to be a ClientMessage entry. +type ClientMessage struct { + OnClientSide bool + // Message can be a proto.Message or []byte. Other messages formats are not + // supported. + Message interface{} +} + +func (c *ClientMessage) toProto() *pb.GrpcLogEntry { + var ( + data []byte + err error + ) + if m, ok := c.Message.(proto.Message); ok { + data, err = proto.Marshal(m) + if err != nil { + grpclog.Infof("binarylogging: failed to marshal proto message: %v", err) + } + } else if b, ok := c.Message.([]byte); ok { + data = b + } else { + grpclog.Infof("binarylogging: message to log is neither proto.message nor []byte") + } + ret := &pb.GrpcLogEntry{ + Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_MESSAGE, + Payload: &pb.GrpcLogEntry_Message{ + Message: &pb.Message{ + Length: uint32(len(data)), + Data: data, + }, + }, + } + if c.OnClientSide { + ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + } else { + ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + } + return ret +} + +// ServerMessage configs the binary log entry to be a ServerMessage entry. +type ServerMessage struct { + OnClientSide bool + // Message can be a proto.Message or []byte. Other messages formats are not + // supported. + Message interface{} +} + +func (c *ServerMessage) toProto() *pb.GrpcLogEntry { + var ( + data []byte + err error + ) + if m, ok := c.Message.(proto.Message); ok { + data, err = proto.Marshal(m) + if err != nil { + grpclog.Infof("binarylogging: failed to marshal proto message: %v", err) + } + } else if b, ok := c.Message.([]byte); ok { + data = b + } else { + grpclog.Infof("binarylogging: message to log is neither proto.message nor []byte") + } + ret := &pb.GrpcLogEntry{ + Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_MESSAGE, + Payload: &pb.GrpcLogEntry_Message{ + Message: &pb.Message{ + Length: uint32(len(data)), + Data: data, + }, + }, + } + if c.OnClientSide { + ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + } else { + ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + } + return ret +} + +// ClientHalfClose configs the binary log entry to be a ClientHalfClose entry. +type ClientHalfClose struct { + OnClientSide bool +} + +func (c *ClientHalfClose) toProto() *pb.GrpcLogEntry { + ret := &pb.GrpcLogEntry{ + Type: pb.GrpcLogEntry_EVENT_TYPE_CLIENT_HALF_CLOSE, + Payload: nil, // No payload here. + } + if c.OnClientSide { + ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + } else { + ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + } + return ret +} + +// ServerTrailer configs the binary log entry to be a ServerTrailer entry. +type ServerTrailer struct { + OnClientSide bool + Trailer metadata.MD + // Err is the status error. + Err error + // PeerAddr is required only when it's on client side and the RPC is trailer + // only. + PeerAddr net.Addr +} + +func (c *ServerTrailer) toProto() *pb.GrpcLogEntry { + st, ok := status.FromError(c.Err) + if !ok { + grpclog.Info("binarylogging: error in trailer is not a status error") + } + var ( + detailsBytes []byte + err error + ) + stProto := st.Proto() + if stProto != nil && len(stProto.Details) != 0 { + detailsBytes, err = proto.Marshal(stProto) + if err != nil { + grpclog.Infof("binarylogging: failed to marshal status proto: %v", err) + } + } + ret := &pb.GrpcLogEntry{ + Type: pb.GrpcLogEntry_EVENT_TYPE_SERVER_TRAILER, + Payload: &pb.GrpcLogEntry_Trailer{ + Trailer: &pb.Trailer{ + Metadata: mdToMetadataProto(c.Trailer), + StatusCode: uint32(st.Code()), + StatusMessage: st.Message(), + StatusDetails: detailsBytes, + }, + }, + } + if c.OnClientSide { + ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + } else { + ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + } + if c.PeerAddr != nil { + ret.Peer = addrToProto(c.PeerAddr) + } + return ret +} + +// Cancel configs the binary log entry to be a Cancel entry. +type Cancel struct { + OnClientSide bool +} + +func (c *Cancel) toProto() *pb.GrpcLogEntry { + ret := &pb.GrpcLogEntry{ + Type: pb.GrpcLogEntry_EVENT_TYPE_CANCEL, + Payload: nil, + } + if c.OnClientSide { + ret.Logger = pb.GrpcLogEntry_LOGGER_CLIENT + } else { + ret.Logger = pb.GrpcLogEntry_LOGGER_SERVER + } + return ret +} + +// metadataKeyOmit returns whether the metadata entry with this key should be +// omitted. +func metadataKeyOmit(key string) bool { + switch key { + case "lb-token", ":path", ":authority", "content-encoding", "content-type", "user-agent", "te": + return true + case "grpc-trace-bin": // grpc-trace-bin is special because it's visiable to users. + return false + } + return strings.HasPrefix(key, "grpc-") +} + +func mdToMetadataProto(md metadata.MD) *pb.Metadata { + ret := &pb.Metadata{} + for k, vv := range md { + if metadataKeyOmit(k) { + continue + } + for _, v := range vv { + ret.Entry = append(ret.Entry, + &pb.MetadataEntry{ + Key: k, + Value: []byte(v), + }, + ) + } + } + return ret +} + +func addrToProto(addr net.Addr) *pb.Address { + ret := &pb.Address{} + switch a := addr.(type) { + case *net.TCPAddr: + if a.IP.To4() != nil { + ret.Type = pb.Address_TYPE_IPV4 + } else if a.IP.To16() != nil { + ret.Type = pb.Address_TYPE_IPV6 + } else { + ret.Type = pb.Address_TYPE_UNKNOWN + // Do not set address and port fields. + break + } + ret.Address = a.IP.String() + ret.IpPort = uint32(a.Port) + case *net.UnixAddr: + ret.Type = pb.Address_TYPE_UNIX + ret.Address = a.String() + default: + ret.Type = pb.Address_TYPE_UNKNOWN + } + return ret +} diff --git a/vendor/google.golang.org/grpc/internal/binarylog/regenerate.sh b/vendor/google.golang.org/grpc/internal/binarylog/regenerate.sh new file mode 100644 index 00000000..113d40cb --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/binarylog/regenerate.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Copyright 2018 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eux -o pipefail + +TMP=$(mktemp -d) + +function finish { + rm -rf "$TMP" +} +trap finish EXIT + +pushd "$TMP" +mkdir -p grpc/binarylog/grpc_binarylog_v1 +curl https://raw.githubusercontent.com/grpc/grpc-proto/master/grpc/binlog/v1/binarylog.proto > grpc/binarylog/grpc_binarylog_v1/binarylog.proto + +protoc --go_out=plugins=grpc,paths=source_relative:. -I. grpc/binarylog/grpc_binarylog_v1/*.proto +popd +rm -f ./grpc_binarylog_v1/*.pb.go +cp "$TMP"/grpc/binarylog/grpc_binarylog_v1/*.pb.go ../../binarylog/grpc_binarylog_v1/ + diff --git a/vendor/google.golang.org/grpc/internal/binarylog/sink.go b/vendor/google.golang.org/grpc/internal/binarylog/sink.go new file mode 100644 index 00000000..a2e7c346 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/binarylog/sink.go @@ -0,0 +1,162 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package binarylog + +import ( + "bufio" + "encoding/binary" + "fmt" + "io" + "io/ioutil" + "sync" + "time" + + "github.com/golang/protobuf/proto" + pb "google.golang.org/grpc/binarylog/grpc_binarylog_v1" + "google.golang.org/grpc/grpclog" +) + +var ( + defaultSink Sink = &noopSink{} // TODO(blog): change this default (file in /tmp). +) + +// SetDefaultSink sets the sink where binary logs will be written to. +// +// Not thread safe. Only set during initialization. +func SetDefaultSink(s Sink) { + if defaultSink != nil { + defaultSink.Close() + } + defaultSink = s +} + +// Sink writes log entry into the binary log sink. +type Sink interface { + // Write will be called to write the log entry into the sink. + // + // It should be thread-safe so it can be called in parallel. + Write(*pb.GrpcLogEntry) error + // Close will be called when the Sink is replaced by a new Sink. + Close() error +} + +type noopSink struct{} + +func (ns *noopSink) Write(*pb.GrpcLogEntry) error { return nil } +func (ns *noopSink) Close() error { return nil } + +// newWriterSink creates a binary log sink with the given writer. +// +// Write() marshals the proto message and writes it to the given writer. Each +// message is prefixed with a 4 byte big endian unsigned integer as the length. +// +// No buffer is done, Close() doesn't try to close the writer. +func newWriterSink(w io.Writer) *writerSink { + return &writerSink{out: w} +} + +type writerSink struct { + out io.Writer +} + +func (ws *writerSink) Write(e *pb.GrpcLogEntry) error { + b, err := proto.Marshal(e) + if err != nil { + grpclog.Infof("binary logging: failed to marshal proto message: %v", err) + } + hdr := make([]byte, 4) + binary.BigEndian.PutUint32(hdr, uint32(len(b))) + if _, err := ws.out.Write(hdr); err != nil { + return err + } + if _, err := ws.out.Write(b); err != nil { + return err + } + return nil +} + +func (ws *writerSink) Close() error { return nil } + +type bufWriteCloserSink struct { + mu sync.Mutex + closer io.Closer + out *writerSink // out is built on buf. + buf *bufio.Writer // buf is kept for flush. + + writeStartOnce sync.Once + writeTicker *time.Ticker +} + +func (fs *bufWriteCloserSink) Write(e *pb.GrpcLogEntry) error { + // Start the write loop when Write is called. + fs.writeStartOnce.Do(fs.startFlushGoroutine) + fs.mu.Lock() + if err := fs.out.Write(e); err != nil { + fs.mu.Unlock() + return err + } + fs.mu.Unlock() + return nil +} + +const ( + bufFlushDuration = 60 * time.Second +) + +func (fs *bufWriteCloserSink) startFlushGoroutine() { + fs.writeTicker = time.NewTicker(bufFlushDuration) + go func() { + for range fs.writeTicker.C { + fs.mu.Lock() + fs.buf.Flush() + fs.mu.Unlock() + } + }() +} + +func (fs *bufWriteCloserSink) Close() error { + if fs.writeTicker != nil { + fs.writeTicker.Stop() + } + fs.mu.Lock() + fs.buf.Flush() + fs.closer.Close() + fs.out.Close() + fs.mu.Unlock() + return nil +} + +func newBufWriteCloserSink(o io.WriteCloser) Sink { + bufW := bufio.NewWriter(o) + return &bufWriteCloserSink{ + closer: o, + out: newWriterSink(bufW), + buf: bufW, + } +} + +// NewTempFileSink creates a temp file and returns a Sink that writes to this +// file. +func NewTempFileSink() (Sink, error) { + tempFile, err := ioutil.TempFile("/tmp", "grpcgo_binarylog_*.txt") + if err != nil { + return nil, fmt.Errorf("failed to create temp file: %v", err) + } + return newBufWriteCloserSink(tempFile), nil +} diff --git a/vendor/google.golang.org/grpc/internal/binarylog/util.go b/vendor/google.golang.org/grpc/internal/binarylog/util.go new file mode 100644 index 00000000..15dc7803 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/binarylog/util.go @@ -0,0 +1,41 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package binarylog + +import ( + "errors" + "strings" +) + +// parseMethodName splits service and method from the input. It expects format +// "/service/method". +// +// TODO: move to internal/grpcutil. +func parseMethodName(methodName string) (service, method string, _ error) { + if !strings.HasPrefix(methodName, "/") { + return "", "", errors.New("invalid method name: should start with /") + } + methodName = methodName[1:] + + pos := strings.LastIndex(methodName, "/") + if pos < 0 { + return "", "", errors.New("invalid method name: suffix /method is missing") + } + return methodName[:pos], methodName[pos+1:], nil +} diff --git a/vendor/google.golang.org/grpc/internal/buffer/unbounded.go b/vendor/google.golang.org/grpc/internal/buffer/unbounded.go new file mode 100644 index 00000000..9f6a0c12 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/buffer/unbounded.go @@ -0,0 +1,85 @@ +/* + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package buffer provides an implementation of an unbounded buffer. +package buffer + +import "sync" + +// Unbounded is an implementation of an unbounded buffer which does not use +// extra goroutines. This is typically used for passing updates from one entity +// to another within gRPC. +// +// All methods on this type are thread-safe and don't block on anything except +// the underlying mutex used for synchronization. +// +// Unbounded supports values of any type to be stored in it by using a channel +// of `interface{}`. This means that a call to Put() incurs an extra memory +// allocation, and also that users need a type assertion while reading. For +// performance critical code paths, using Unbounded is strongly discouraged and +// defining a new type specific implementation of this buffer is preferred. See +// internal/transport/transport.go for an example of this. +type Unbounded struct { + c chan interface{} + mu sync.Mutex + backlog []interface{} +} + +// NewUnbounded returns a new instance of Unbounded. +func NewUnbounded() *Unbounded { + return &Unbounded{c: make(chan interface{}, 1)} +} + +// Put adds t to the unbounded buffer. +func (b *Unbounded) Put(t interface{}) { + b.mu.Lock() + if len(b.backlog) == 0 { + select { + case b.c <- t: + b.mu.Unlock() + return + default: + } + } + b.backlog = append(b.backlog, t) + b.mu.Unlock() +} + +// Load sends the earliest buffered data, if any, onto the read channel +// returned by Get(). Users are expected to call this every time they read a +// value from the read channel. +func (b *Unbounded) Load() { + b.mu.Lock() + if len(b.backlog) > 0 { + select { + case b.c <- b.backlog[0]: + b.backlog[0] = nil + b.backlog = b.backlog[1:] + default: + } + } + b.mu.Unlock() +} + +// Get returns a read channel on which values added to the buffer, via Put(), +// are sent on. +// +// Upon reading a value from this channel, users are expected to call Load() to +// send the next buffered value onto the channel if there is any. +func (b *Unbounded) Get() <-chan interface{} { + return b.c +} diff --git a/vendor/google.golang.org/grpc/internal/channelz/funcs.go b/vendor/google.golang.org/grpc/internal/channelz/funcs.go new file mode 100644 index 00000000..e4252e5b --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/channelz/funcs.go @@ -0,0 +1,739 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package channelz defines APIs for enabling channelz service, entry +// registration/deletion, and accessing channelz data. It also defines channelz +// metric struct formats. +// +// All APIs in this package are experimental. +package channelz + +import ( + "fmt" + "sort" + "sync" + "sync/atomic" + "time" + + "google.golang.org/grpc/internal/grpclog" +) + +const ( + defaultMaxTraceEntry int32 = 30 +) + +var ( + db dbWrapper + idGen idGenerator + // EntryPerPage defines the number of channelz entries to be shown on a web page. + EntryPerPage = int64(50) + curState int32 + maxTraceEntry = defaultMaxTraceEntry +) + +// TurnOn turns on channelz data collection. +func TurnOn() { + if !IsOn() { + NewChannelzStorage() + atomic.StoreInt32(&curState, 1) + } +} + +// IsOn returns whether channelz data collection is on. +func IsOn() bool { + return atomic.CompareAndSwapInt32(&curState, 1, 1) +} + +// SetMaxTraceEntry sets maximum number of trace entry per entity (i.e. channel/subchannel). +// Setting it to 0 will disable channel tracing. +func SetMaxTraceEntry(i int32) { + atomic.StoreInt32(&maxTraceEntry, i) +} + +// ResetMaxTraceEntryToDefault resets the maximum number of trace entry per entity to default. +func ResetMaxTraceEntryToDefault() { + atomic.StoreInt32(&maxTraceEntry, defaultMaxTraceEntry) +} + +func getMaxTraceEntry() int { + i := atomic.LoadInt32(&maxTraceEntry) + return int(i) +} + +// dbWarpper wraps around a reference to internal channelz data storage, and +// provide synchronized functionality to set and get the reference. +type dbWrapper struct { + mu sync.RWMutex + DB *channelMap +} + +func (d *dbWrapper) set(db *channelMap) { + d.mu.Lock() + d.DB = db + d.mu.Unlock() +} + +func (d *dbWrapper) get() *channelMap { + d.mu.RLock() + defer d.mu.RUnlock() + return d.DB +} + +// NewChannelzStorage initializes channelz data storage and id generator. +// +// This function returns a cleanup function to wait for all channelz state to be reset by the +// grpc goroutines when those entities get closed. By using this cleanup function, we make sure tests +// don't mess up each other, i.e. lingering goroutine from previous test doing entity removal happen +// to remove some entity just register by the new test, since the id space is the same. +// +// Note: This function is exported for testing purpose only. User should not call +// it in most cases. +func NewChannelzStorage() (cleanup func() error) { + db.set(&channelMap{ + topLevelChannels: make(map[int64]struct{}), + channels: make(map[int64]*channel), + listenSockets: make(map[int64]*listenSocket), + normalSockets: make(map[int64]*normalSocket), + servers: make(map[int64]*server), + subChannels: make(map[int64]*subChannel), + }) + idGen.reset() + return func() error { + var err error + cm := db.get() + if cm == nil { + return nil + } + for i := 0; i < 1000; i++ { + cm.mu.Lock() + if len(cm.topLevelChannels) == 0 && len(cm.servers) == 0 && len(cm.channels) == 0 && len(cm.subChannels) == 0 && len(cm.listenSockets) == 0 && len(cm.normalSockets) == 0 { + cm.mu.Unlock() + // all things stored in the channelz map have been cleared. + return nil + } + cm.mu.Unlock() + time.Sleep(10 * time.Millisecond) + } + + cm.mu.Lock() + err = fmt.Errorf("after 10s the channelz map has not been cleaned up yet, topchannels: %d, servers: %d, channels: %d, subchannels: %d, listen sockets: %d, normal sockets: %d", len(cm.topLevelChannels), len(cm.servers), len(cm.channels), len(cm.subChannels), len(cm.listenSockets), len(cm.normalSockets)) + cm.mu.Unlock() + return err + } +} + +// GetTopChannels returns a slice of top channel's ChannelMetric, along with a +// boolean indicating whether there's more top channels to be queried for. +// +// The arg id specifies that only top channel with id at or above it will be included +// in the result. The returned slice is up to a length of the arg maxResults or +// EntryPerPage if maxResults is zero, and is sorted in ascending id order. +func GetTopChannels(id int64, maxResults int64) ([]*ChannelMetric, bool) { + return db.get().GetTopChannels(id, maxResults) +} + +// GetServers returns a slice of server's ServerMetric, along with a +// boolean indicating whether there's more servers to be queried for. +// +// The arg id specifies that only server with id at or above it will be included +// in the result. The returned slice is up to a length of the arg maxResults or +// EntryPerPage if maxResults is zero, and is sorted in ascending id order. +func GetServers(id int64, maxResults int64) ([]*ServerMetric, bool) { + return db.get().GetServers(id, maxResults) +} + +// GetServerSockets returns a slice of server's (identified by id) normal socket's +// SocketMetric, along with a boolean indicating whether there's more sockets to +// be queried for. +// +// The arg startID specifies that only sockets with id at or above it will be +// included in the result. The returned slice is up to a length of the arg maxResults +// or EntryPerPage if maxResults is zero, and is sorted in ascending id order. +func GetServerSockets(id int64, startID int64, maxResults int64) ([]*SocketMetric, bool) { + return db.get().GetServerSockets(id, startID, maxResults) +} + +// GetChannel returns the ChannelMetric for the channel (identified by id). +func GetChannel(id int64) *ChannelMetric { + return db.get().GetChannel(id) +} + +// GetSubChannel returns the SubChannelMetric for the subchannel (identified by id). +func GetSubChannel(id int64) *SubChannelMetric { + return db.get().GetSubChannel(id) +} + +// GetSocket returns the SocketInternalMetric for the socket (identified by id). +func GetSocket(id int64) *SocketMetric { + return db.get().GetSocket(id) +} + +// GetServer returns the ServerMetric for the server (identified by id). +func GetServer(id int64) *ServerMetric { + return db.get().GetServer(id) +} + +// RegisterChannel registers the given channel c in channelz database with ref +// as its reference name, and add it to the child list of its parent (identified +// by pid). pid = 0 means no parent. It returns the unique channelz tracking id +// assigned to this channel. +func RegisterChannel(c Channel, pid int64, ref string) int64 { + id := idGen.genID() + cn := &channel{ + refName: ref, + c: c, + subChans: make(map[int64]string), + nestedChans: make(map[int64]string), + id: id, + pid: pid, + trace: &channelTrace{createdTime: time.Now(), events: make([]*TraceEvent, 0, getMaxTraceEntry())}, + } + if pid == 0 { + db.get().addChannel(id, cn, true, pid, ref) + } else { + db.get().addChannel(id, cn, false, pid, ref) + } + return id +} + +// RegisterSubChannel registers the given channel c in channelz database with ref +// as its reference name, and add it to the child list of its parent (identified +// by pid). It returns the unique channelz tracking id assigned to this subchannel. +func RegisterSubChannel(c Channel, pid int64, ref string) int64 { + if pid == 0 { + grpclog.ErrorDepth(0, "a SubChannel's parent id cannot be 0") + return 0 + } + id := idGen.genID() + sc := &subChannel{ + refName: ref, + c: c, + sockets: make(map[int64]string), + id: id, + pid: pid, + trace: &channelTrace{createdTime: time.Now(), events: make([]*TraceEvent, 0, getMaxTraceEntry())}, + } + db.get().addSubChannel(id, sc, pid, ref) + return id +} + +// RegisterServer registers the given server s in channelz database. It returns +// the unique channelz tracking id assigned to this server. +func RegisterServer(s Server, ref string) int64 { + id := idGen.genID() + svr := &server{ + refName: ref, + s: s, + sockets: make(map[int64]string), + listenSockets: make(map[int64]string), + id: id, + } + db.get().addServer(id, svr) + return id +} + +// RegisterListenSocket registers the given listen socket s in channelz database +// with ref as its reference name, and add it to the child list of its parent +// (identified by pid). It returns the unique channelz tracking id assigned to +// this listen socket. +func RegisterListenSocket(s Socket, pid int64, ref string) int64 { + if pid == 0 { + grpclog.ErrorDepth(0, "a ListenSocket's parent id cannot be 0") + return 0 + } + id := idGen.genID() + ls := &listenSocket{refName: ref, s: s, id: id, pid: pid} + db.get().addListenSocket(id, ls, pid, ref) + return id +} + +// RegisterNormalSocket registers the given normal socket s in channelz database +// with ref as its reference name, and add it to the child list of its parent +// (identified by pid). It returns the unique channelz tracking id assigned to +// this normal socket. +func RegisterNormalSocket(s Socket, pid int64, ref string) int64 { + if pid == 0 { + grpclog.ErrorDepth(0, "a NormalSocket's parent id cannot be 0") + return 0 + } + id := idGen.genID() + ns := &normalSocket{refName: ref, s: s, id: id, pid: pid} + db.get().addNormalSocket(id, ns, pid, ref) + return id +} + +// RemoveEntry removes an entry with unique channelz trakcing id to be id from +// channelz database. +func RemoveEntry(id int64) { + db.get().removeEntry(id) +} + +// TraceEventDesc is what the caller of AddTraceEvent should provide to describe the event to be added +// to the channel trace. +// The Parent field is optional. It is used for event that will be recorded in the entity's parent +// trace also. +type TraceEventDesc struct { + Desc string + Severity Severity + Parent *TraceEventDesc +} + +// AddTraceEvent adds trace related to the entity with specified id, using the provided TraceEventDesc. +func AddTraceEvent(id int64, depth int, desc *TraceEventDesc) { + for d := desc; d != nil; d = d.Parent { + switch d.Severity { + case CtUNKNOWN: + grpclog.InfoDepth(depth+1, d.Desc) + case CtINFO: + grpclog.InfoDepth(depth+1, d.Desc) + case CtWarning: + grpclog.WarningDepth(depth+1, d.Desc) + case CtError: + grpclog.ErrorDepth(depth+1, d.Desc) + } + } + if getMaxTraceEntry() == 0 { + return + } + db.get().traceEvent(id, desc) +} + +// channelMap is the storage data structure for channelz. +// Methods of channelMap can be divided in two two categories with respect to locking. +// 1. Methods acquire the global lock. +// 2. Methods that can only be called when global lock is held. +// A second type of method need always to be called inside a first type of method. +type channelMap struct { + mu sync.RWMutex + topLevelChannels map[int64]struct{} + servers map[int64]*server + channels map[int64]*channel + subChannels map[int64]*subChannel + listenSockets map[int64]*listenSocket + normalSockets map[int64]*normalSocket +} + +func (c *channelMap) addServer(id int64, s *server) { + c.mu.Lock() + s.cm = c + c.servers[id] = s + c.mu.Unlock() +} + +func (c *channelMap) addChannel(id int64, cn *channel, isTopChannel bool, pid int64, ref string) { + c.mu.Lock() + cn.cm = c + cn.trace.cm = c + c.channels[id] = cn + if isTopChannel { + c.topLevelChannels[id] = struct{}{} + } else { + c.findEntry(pid).addChild(id, cn) + } + c.mu.Unlock() +} + +func (c *channelMap) addSubChannel(id int64, sc *subChannel, pid int64, ref string) { + c.mu.Lock() + sc.cm = c + sc.trace.cm = c + c.subChannels[id] = sc + c.findEntry(pid).addChild(id, sc) + c.mu.Unlock() +} + +func (c *channelMap) addListenSocket(id int64, ls *listenSocket, pid int64, ref string) { + c.mu.Lock() + ls.cm = c + c.listenSockets[id] = ls + c.findEntry(pid).addChild(id, ls) + c.mu.Unlock() +} + +func (c *channelMap) addNormalSocket(id int64, ns *normalSocket, pid int64, ref string) { + c.mu.Lock() + ns.cm = c + c.normalSockets[id] = ns + c.findEntry(pid).addChild(id, ns) + c.mu.Unlock() +} + +// removeEntry triggers the removal of an entry, which may not indeed delete the entry, if it has to +// wait on the deletion of its children and until no other entity's channel trace references it. +// It may lead to a chain of entry deletion. For example, deleting the last socket of a gracefully +// shutting down server will lead to the server being also deleted. +func (c *channelMap) removeEntry(id int64) { + c.mu.Lock() + c.findEntry(id).triggerDelete() + c.mu.Unlock() +} + +// c.mu must be held by the caller +func (c *channelMap) decrTraceRefCount(id int64) { + e := c.findEntry(id) + if v, ok := e.(tracedChannel); ok { + v.decrTraceRefCount() + e.deleteSelfIfReady() + } +} + +// c.mu must be held by the caller. +func (c *channelMap) findEntry(id int64) entry { + var v entry + var ok bool + if v, ok = c.channels[id]; ok { + return v + } + if v, ok = c.subChannels[id]; ok { + return v + } + if v, ok = c.servers[id]; ok { + return v + } + if v, ok = c.listenSockets[id]; ok { + return v + } + if v, ok = c.normalSockets[id]; ok { + return v + } + return &dummyEntry{idNotFound: id} +} + +// c.mu must be held by the caller +// deleteEntry simply deletes an entry from the channelMap. Before calling this +// method, caller must check this entry is ready to be deleted, i.e removeEntry() +// has been called on it, and no children still exist. +// Conditionals are ordered by the expected frequency of deletion of each entity +// type, in order to optimize performance. +func (c *channelMap) deleteEntry(id int64) { + var ok bool + if _, ok = c.normalSockets[id]; ok { + delete(c.normalSockets, id) + return + } + if _, ok = c.subChannels[id]; ok { + delete(c.subChannels, id) + return + } + if _, ok = c.channels[id]; ok { + delete(c.channels, id) + delete(c.topLevelChannels, id) + return + } + if _, ok = c.listenSockets[id]; ok { + delete(c.listenSockets, id) + return + } + if _, ok = c.servers[id]; ok { + delete(c.servers, id) + return + } +} + +func (c *channelMap) traceEvent(id int64, desc *TraceEventDesc) { + c.mu.Lock() + child := c.findEntry(id) + childTC, ok := child.(tracedChannel) + if !ok { + c.mu.Unlock() + return + } + childTC.getChannelTrace().append(&TraceEvent{Desc: desc.Desc, Severity: desc.Severity, Timestamp: time.Now()}) + if desc.Parent != nil { + parent := c.findEntry(child.getParentID()) + var chanType RefChannelType + switch child.(type) { + case *channel: + chanType = RefChannel + case *subChannel: + chanType = RefSubChannel + } + if parentTC, ok := parent.(tracedChannel); ok { + parentTC.getChannelTrace().append(&TraceEvent{ + Desc: desc.Parent.Desc, + Severity: desc.Parent.Severity, + Timestamp: time.Now(), + RefID: id, + RefName: childTC.getRefName(), + RefType: chanType, + }) + childTC.incrTraceRefCount() + } + } + c.mu.Unlock() +} + +type int64Slice []int64 + +func (s int64Slice) Len() int { return len(s) } +func (s int64Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s int64Slice) Less(i, j int) bool { return s[i] < s[j] } + +func copyMap(m map[int64]string) map[int64]string { + n := make(map[int64]string) + for k, v := range m { + n[k] = v + } + return n +} + +func min(a, b int64) int64 { + if a < b { + return a + } + return b +} + +func (c *channelMap) GetTopChannels(id int64, maxResults int64) ([]*ChannelMetric, bool) { + if maxResults <= 0 { + maxResults = EntryPerPage + } + c.mu.RLock() + l := int64(len(c.topLevelChannels)) + ids := make([]int64, 0, l) + cns := make([]*channel, 0, min(l, maxResults)) + + for k := range c.topLevelChannels { + ids = append(ids, k) + } + sort.Sort(int64Slice(ids)) + idx := sort.Search(len(ids), func(i int) bool { return ids[i] >= id }) + count := int64(0) + var end bool + var t []*ChannelMetric + for i, v := range ids[idx:] { + if count == maxResults { + break + } + if cn, ok := c.channels[v]; ok { + cns = append(cns, cn) + t = append(t, &ChannelMetric{ + NestedChans: copyMap(cn.nestedChans), + SubChans: copyMap(cn.subChans), + }) + count++ + } + if i == len(ids[idx:])-1 { + end = true + break + } + } + c.mu.RUnlock() + if count == 0 { + end = true + } + + for i, cn := range cns { + t[i].ChannelData = cn.c.ChannelzMetric() + t[i].ID = cn.id + t[i].RefName = cn.refName + t[i].Trace = cn.trace.dumpData() + } + return t, end +} + +func (c *channelMap) GetServers(id, maxResults int64) ([]*ServerMetric, bool) { + if maxResults <= 0 { + maxResults = EntryPerPage + } + c.mu.RLock() + l := int64(len(c.servers)) + ids := make([]int64, 0, l) + ss := make([]*server, 0, min(l, maxResults)) + for k := range c.servers { + ids = append(ids, k) + } + sort.Sort(int64Slice(ids)) + idx := sort.Search(len(ids), func(i int) bool { return ids[i] >= id }) + count := int64(0) + var end bool + var s []*ServerMetric + for i, v := range ids[idx:] { + if count == maxResults { + break + } + if svr, ok := c.servers[v]; ok { + ss = append(ss, svr) + s = append(s, &ServerMetric{ + ListenSockets: copyMap(svr.listenSockets), + }) + count++ + } + if i == len(ids[idx:])-1 { + end = true + break + } + } + c.mu.RUnlock() + if count == 0 { + end = true + } + + for i, svr := range ss { + s[i].ServerData = svr.s.ChannelzMetric() + s[i].ID = svr.id + s[i].RefName = svr.refName + } + return s, end +} + +func (c *channelMap) GetServerSockets(id int64, startID int64, maxResults int64) ([]*SocketMetric, bool) { + if maxResults <= 0 { + maxResults = EntryPerPage + } + var svr *server + var ok bool + c.mu.RLock() + if svr, ok = c.servers[id]; !ok { + // server with id doesn't exist. + c.mu.RUnlock() + return nil, true + } + svrskts := svr.sockets + l := int64(len(svrskts)) + ids := make([]int64, 0, l) + sks := make([]*normalSocket, 0, min(l, maxResults)) + for k := range svrskts { + ids = append(ids, k) + } + sort.Sort(int64Slice(ids)) + idx := sort.Search(len(ids), func(i int) bool { return ids[i] >= startID }) + count := int64(0) + var end bool + for i, v := range ids[idx:] { + if count == maxResults { + break + } + if ns, ok := c.normalSockets[v]; ok { + sks = append(sks, ns) + count++ + } + if i == len(ids[idx:])-1 { + end = true + break + } + } + c.mu.RUnlock() + if count == 0 { + end = true + } + var s []*SocketMetric + for _, ns := range sks { + sm := &SocketMetric{} + sm.SocketData = ns.s.ChannelzMetric() + sm.ID = ns.id + sm.RefName = ns.refName + s = append(s, sm) + } + return s, end +} + +func (c *channelMap) GetChannel(id int64) *ChannelMetric { + cm := &ChannelMetric{} + var cn *channel + var ok bool + c.mu.RLock() + if cn, ok = c.channels[id]; !ok { + // channel with id doesn't exist. + c.mu.RUnlock() + return nil + } + cm.NestedChans = copyMap(cn.nestedChans) + cm.SubChans = copyMap(cn.subChans) + // cn.c can be set to &dummyChannel{} when deleteSelfFromMap is called. Save a copy of cn.c when + // holding the lock to prevent potential data race. + chanCopy := cn.c + c.mu.RUnlock() + cm.ChannelData = chanCopy.ChannelzMetric() + cm.ID = cn.id + cm.RefName = cn.refName + cm.Trace = cn.trace.dumpData() + return cm +} + +func (c *channelMap) GetSubChannel(id int64) *SubChannelMetric { + cm := &SubChannelMetric{} + var sc *subChannel + var ok bool + c.mu.RLock() + if sc, ok = c.subChannels[id]; !ok { + // subchannel with id doesn't exist. + c.mu.RUnlock() + return nil + } + cm.Sockets = copyMap(sc.sockets) + // sc.c can be set to &dummyChannel{} when deleteSelfFromMap is called. Save a copy of sc.c when + // holding the lock to prevent potential data race. + chanCopy := sc.c + c.mu.RUnlock() + cm.ChannelData = chanCopy.ChannelzMetric() + cm.ID = sc.id + cm.RefName = sc.refName + cm.Trace = sc.trace.dumpData() + return cm +} + +func (c *channelMap) GetSocket(id int64) *SocketMetric { + sm := &SocketMetric{} + c.mu.RLock() + if ls, ok := c.listenSockets[id]; ok { + c.mu.RUnlock() + sm.SocketData = ls.s.ChannelzMetric() + sm.ID = ls.id + sm.RefName = ls.refName + return sm + } + if ns, ok := c.normalSockets[id]; ok { + c.mu.RUnlock() + sm.SocketData = ns.s.ChannelzMetric() + sm.ID = ns.id + sm.RefName = ns.refName + return sm + } + c.mu.RUnlock() + return nil +} + +func (c *channelMap) GetServer(id int64) *ServerMetric { + sm := &ServerMetric{} + var svr *server + var ok bool + c.mu.RLock() + if svr, ok = c.servers[id]; !ok { + c.mu.RUnlock() + return nil + } + sm.ListenSockets = copyMap(svr.listenSockets) + c.mu.RUnlock() + sm.ID = svr.id + sm.RefName = svr.refName + sm.ServerData = svr.s.ChannelzMetric() + return sm +} + +type idGenerator struct { + id int64 +} + +func (i *idGenerator) reset() { + atomic.StoreInt64(&i.id, 0) +} + +func (i *idGenerator) genID() int64 { + return atomic.AddInt64(&i.id, 1) +} diff --git a/vendor/google.golang.org/grpc/internal/channelz/logging.go b/vendor/google.golang.org/grpc/internal/channelz/logging.go new file mode 100644 index 00000000..59c7bede --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/channelz/logging.go @@ -0,0 +1,100 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package channelz + +import ( + "fmt" + + "google.golang.org/grpc/internal/grpclog" +) + +// Info logs through grpclog.Info and adds a trace event if channelz is on. +func Info(id int64, args ...interface{}) { + if IsOn() { + AddTraceEvent(id, 1, &TraceEventDesc{ + Desc: fmt.Sprint(args...), + Severity: CtINFO, + }) + } else { + grpclog.InfoDepth(1, args...) + } +} + +// Infof logs through grpclog.Infof and adds a trace event if channelz is on. +func Infof(id int64, format string, args ...interface{}) { + msg := fmt.Sprintf(format, args...) + if IsOn() { + AddTraceEvent(id, 1, &TraceEventDesc{ + Desc: msg, + Severity: CtINFO, + }) + } else { + grpclog.InfoDepth(1, msg) + } +} + +// Warning logs through grpclog.Warning and adds a trace event if channelz is on. +func Warning(id int64, args ...interface{}) { + if IsOn() { + AddTraceEvent(id, 1, &TraceEventDesc{ + Desc: fmt.Sprint(args...), + Severity: CtWarning, + }) + } else { + grpclog.WarningDepth(1, args...) + } +} + +// Warningf logs through grpclog.Warningf and adds a trace event if channelz is on. +func Warningf(id int64, format string, args ...interface{}) { + msg := fmt.Sprintf(format, args...) + if IsOn() { + AddTraceEvent(id, 1, &TraceEventDesc{ + Desc: msg, + Severity: CtWarning, + }) + } else { + grpclog.WarningDepth(1, msg) + } +} + +// Error logs through grpclog.Error and adds a trace event if channelz is on. +func Error(id int64, args ...interface{}) { + if IsOn() { + AddTraceEvent(id, 1, &TraceEventDesc{ + Desc: fmt.Sprint(args...), + Severity: CtError, + }) + } else { + grpclog.ErrorDepth(1, args...) + } +} + +// Errorf logs through grpclog.Errorf and adds a trace event if channelz is on. +func Errorf(id int64, format string, args ...interface{}) { + msg := fmt.Sprintf(format, args...) + if IsOn() { + AddTraceEvent(id, 1, &TraceEventDesc{ + Desc: msg, + Severity: CtError, + }) + } else { + grpclog.ErrorDepth(1, msg) + } +} diff --git a/vendor/google.golang.org/grpc/internal/channelz/types.go b/vendor/google.golang.org/grpc/internal/channelz/types.go new file mode 100644 index 00000000..17c2274c --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/channelz/types.go @@ -0,0 +1,702 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package channelz + +import ( + "net" + "sync" + "sync/atomic" + "time" + + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/grpclog" +) + +// entry represents a node in the channelz database. +type entry interface { + // addChild adds a child e, whose channelz id is id to child list + addChild(id int64, e entry) + // deleteChild deletes a child with channelz id to be id from child list + deleteChild(id int64) + // triggerDelete tries to delete self from channelz database. However, if child + // list is not empty, then deletion from the database is on hold until the last + // child is deleted from database. + triggerDelete() + // deleteSelfIfReady check whether triggerDelete() has been called before, and whether child + // list is now empty. If both conditions are met, then delete self from database. + deleteSelfIfReady() + // getParentID returns parent ID of the entry. 0 value parent ID means no parent. + getParentID() int64 +} + +// dummyEntry is a fake entry to handle entry not found case. +type dummyEntry struct { + idNotFound int64 +} + +func (d *dummyEntry) addChild(id int64, e entry) { + // Note: It is possible for a normal program to reach here under race condition. + // For example, there could be a race between ClientConn.Close() info being propagated + // to addrConn and http2Client. ClientConn.Close() cancel the context and result + // in http2Client to error. The error info is then caught by transport monitor + // and before addrConn.tearDown() is called in side ClientConn.Close(). Therefore, + // the addrConn will create a new transport. And when registering the new transport in + // channelz, its parent addrConn could have already been torn down and deleted + // from channelz tracking, and thus reach the code here. + grpclog.Infof("attempt to add child of type %T with id %d to a parent (id=%d) that doesn't currently exist", e, id, d.idNotFound) +} + +func (d *dummyEntry) deleteChild(id int64) { + // It is possible for a normal program to reach here under race condition. + // Refer to the example described in addChild(). + grpclog.Infof("attempt to delete child with id %d from a parent (id=%d) that doesn't currently exist", id, d.idNotFound) +} + +func (d *dummyEntry) triggerDelete() { + grpclog.Warningf("attempt to delete an entry (id=%d) that doesn't currently exist", d.idNotFound) +} + +func (*dummyEntry) deleteSelfIfReady() { + // code should not reach here. deleteSelfIfReady is always called on an existing entry. +} + +func (*dummyEntry) getParentID() int64 { + return 0 +} + +// ChannelMetric defines the info channelz provides for a specific Channel, which +// includes ChannelInternalMetric and channelz-specific data, such as channelz id, +// child list, etc. +type ChannelMetric struct { + // ID is the channelz id of this channel. + ID int64 + // RefName is the human readable reference string of this channel. + RefName string + // ChannelData contains channel internal metric reported by the channel through + // ChannelzMetric(). + ChannelData *ChannelInternalMetric + // NestedChans tracks the nested channel type children of this channel in the format of + // a map from nested channel channelz id to corresponding reference string. + NestedChans map[int64]string + // SubChans tracks the subchannel type children of this channel in the format of a + // map from subchannel channelz id to corresponding reference string. + SubChans map[int64]string + // Sockets tracks the socket type children of this channel in the format of a map + // from socket channelz id to corresponding reference string. + // Note current grpc implementation doesn't allow channel having sockets directly, + // therefore, this is field is unused. + Sockets map[int64]string + // Trace contains the most recent traced events. + Trace *ChannelTrace +} + +// SubChannelMetric defines the info channelz provides for a specific SubChannel, +// which includes ChannelInternalMetric and channelz-specific data, such as +// channelz id, child list, etc. +type SubChannelMetric struct { + // ID is the channelz id of this subchannel. + ID int64 + // RefName is the human readable reference string of this subchannel. + RefName string + // ChannelData contains subchannel internal metric reported by the subchannel + // through ChannelzMetric(). + ChannelData *ChannelInternalMetric + // NestedChans tracks the nested channel type children of this subchannel in the format of + // a map from nested channel channelz id to corresponding reference string. + // Note current grpc implementation doesn't allow subchannel to have nested channels + // as children, therefore, this field is unused. + NestedChans map[int64]string + // SubChans tracks the subchannel type children of this subchannel in the format of a + // map from subchannel channelz id to corresponding reference string. + // Note current grpc implementation doesn't allow subchannel to have subchannels + // as children, therefore, this field is unused. + SubChans map[int64]string + // Sockets tracks the socket type children of this subchannel in the format of a map + // from socket channelz id to corresponding reference string. + Sockets map[int64]string + // Trace contains the most recent traced events. + Trace *ChannelTrace +} + +// ChannelInternalMetric defines the struct that the implementor of Channel interface +// should return from ChannelzMetric(). +type ChannelInternalMetric struct { + // current connectivity state of the channel. + State connectivity.State + // The target this channel originally tried to connect to. May be absent + Target string + // The number of calls started on the channel. + CallsStarted int64 + // The number of calls that have completed with an OK status. + CallsSucceeded int64 + // The number of calls that have a completed with a non-OK status. + CallsFailed int64 + // The last time a call was started on the channel. + LastCallStartedTimestamp time.Time +} + +// ChannelTrace stores traced events on a channel/subchannel and related info. +type ChannelTrace struct { + // EventNum is the number of events that ever got traced (i.e. including those that have been deleted) + EventNum int64 + // CreationTime is the creation time of the trace. + CreationTime time.Time + // Events stores the most recent trace events (up to $maxTraceEntry, newer event will overwrite the + // oldest one) + Events []*TraceEvent +} + +// TraceEvent represent a single trace event +type TraceEvent struct { + // Desc is a simple description of the trace event. + Desc string + // Severity states the severity of this trace event. + Severity Severity + // Timestamp is the event time. + Timestamp time.Time + // RefID is the id of the entity that gets referenced in the event. RefID is 0 if no other entity is + // involved in this event. + // e.g. SubChannel (id: 4[]) Created. --> RefID = 4, RefName = "" (inside []) + RefID int64 + // RefName is the reference name for the entity that gets referenced in the event. + RefName string + // RefType indicates the referenced entity type, i.e Channel or SubChannel. + RefType RefChannelType +} + +// Channel is the interface that should be satisfied in order to be tracked by +// channelz as Channel or SubChannel. +type Channel interface { + ChannelzMetric() *ChannelInternalMetric +} + +type dummyChannel struct{} + +func (d *dummyChannel) ChannelzMetric() *ChannelInternalMetric { + return &ChannelInternalMetric{} +} + +type channel struct { + refName string + c Channel + closeCalled bool + nestedChans map[int64]string + subChans map[int64]string + id int64 + pid int64 + cm *channelMap + trace *channelTrace + // traceRefCount is the number of trace events that reference this channel. + // Non-zero traceRefCount means the trace of this channel cannot be deleted. + traceRefCount int32 +} + +func (c *channel) addChild(id int64, e entry) { + switch v := e.(type) { + case *subChannel: + c.subChans[id] = v.refName + case *channel: + c.nestedChans[id] = v.refName + default: + grpclog.Errorf("cannot add a child (id = %d) of type %T to a channel", id, e) + } +} + +func (c *channel) deleteChild(id int64) { + delete(c.subChans, id) + delete(c.nestedChans, id) + c.deleteSelfIfReady() +} + +func (c *channel) triggerDelete() { + c.closeCalled = true + c.deleteSelfIfReady() +} + +func (c *channel) getParentID() int64 { + return c.pid +} + +// deleteSelfFromTree tries to delete the channel from the channelz entry relation tree, which means +// deleting the channel reference from its parent's child list. +// +// In order for a channel to be deleted from the tree, it must meet the criteria that, removal of the +// corresponding grpc object has been invoked, and the channel does not have any children left. +// +// The returned boolean value indicates whether the channel has been successfully deleted from tree. +func (c *channel) deleteSelfFromTree() (deleted bool) { + if !c.closeCalled || len(c.subChans)+len(c.nestedChans) != 0 { + return false + } + // not top channel + if c.pid != 0 { + c.cm.findEntry(c.pid).deleteChild(c.id) + } + return true +} + +// deleteSelfFromMap checks whether it is valid to delete the channel from the map, which means +// deleting the channel from channelz's tracking entirely. Users can no longer use id to query the +// channel, and its memory will be garbage collected. +// +// The trace reference count of the channel must be 0 in order to be deleted from the map. This is +// specified in the channel tracing gRFC that as long as some other trace has reference to an entity, +// the trace of the referenced entity must not be deleted. In order to release the resource allocated +// by grpc, the reference to the grpc object is reset to a dummy object. +// +// deleteSelfFromMap must be called after deleteSelfFromTree returns true. +// +// It returns a bool to indicate whether the channel can be safely deleted from map. +func (c *channel) deleteSelfFromMap() (delete bool) { + if c.getTraceRefCount() != 0 { + c.c = &dummyChannel{} + return false + } + return true +} + +// deleteSelfIfReady tries to delete the channel itself from the channelz database. +// The delete process includes two steps: +// 1. delete the channel from the entry relation tree, i.e. delete the channel reference from its +// parent's child list. +// 2. delete the channel from the map, i.e. delete the channel entirely from channelz. Lookup by id +// will return entry not found error. +func (c *channel) deleteSelfIfReady() { + if !c.deleteSelfFromTree() { + return + } + if !c.deleteSelfFromMap() { + return + } + c.cm.deleteEntry(c.id) + c.trace.clear() +} + +func (c *channel) getChannelTrace() *channelTrace { + return c.trace +} + +func (c *channel) incrTraceRefCount() { + atomic.AddInt32(&c.traceRefCount, 1) +} + +func (c *channel) decrTraceRefCount() { + atomic.AddInt32(&c.traceRefCount, -1) +} + +func (c *channel) getTraceRefCount() int { + i := atomic.LoadInt32(&c.traceRefCount) + return int(i) +} + +func (c *channel) getRefName() string { + return c.refName +} + +type subChannel struct { + refName string + c Channel + closeCalled bool + sockets map[int64]string + id int64 + pid int64 + cm *channelMap + trace *channelTrace + traceRefCount int32 +} + +func (sc *subChannel) addChild(id int64, e entry) { + if v, ok := e.(*normalSocket); ok { + sc.sockets[id] = v.refName + } else { + grpclog.Errorf("cannot add a child (id = %d) of type %T to a subChannel", id, e) + } +} + +func (sc *subChannel) deleteChild(id int64) { + delete(sc.sockets, id) + sc.deleteSelfIfReady() +} + +func (sc *subChannel) triggerDelete() { + sc.closeCalled = true + sc.deleteSelfIfReady() +} + +func (sc *subChannel) getParentID() int64 { + return sc.pid +} + +// deleteSelfFromTree tries to delete the subchannel from the channelz entry relation tree, which +// means deleting the subchannel reference from its parent's child list. +// +// In order for a subchannel to be deleted from the tree, it must meet the criteria that, removal of +// the corresponding grpc object has been invoked, and the subchannel does not have any children left. +// +// The returned boolean value indicates whether the channel has been successfully deleted from tree. +func (sc *subChannel) deleteSelfFromTree() (deleted bool) { + if !sc.closeCalled || len(sc.sockets) != 0 { + return false + } + sc.cm.findEntry(sc.pid).deleteChild(sc.id) + return true +} + +// deleteSelfFromMap checks whether it is valid to delete the subchannel from the map, which means +// deleting the subchannel from channelz's tracking entirely. Users can no longer use id to query +// the subchannel, and its memory will be garbage collected. +// +// The trace reference count of the subchannel must be 0 in order to be deleted from the map. This is +// specified in the channel tracing gRFC that as long as some other trace has reference to an entity, +// the trace of the referenced entity must not be deleted. In order to release the resource allocated +// by grpc, the reference to the grpc object is reset to a dummy object. +// +// deleteSelfFromMap must be called after deleteSelfFromTree returns true. +// +// It returns a bool to indicate whether the channel can be safely deleted from map. +func (sc *subChannel) deleteSelfFromMap() (delete bool) { + if sc.getTraceRefCount() != 0 { + // free the grpc struct (i.e. addrConn) + sc.c = &dummyChannel{} + return false + } + return true +} + +// deleteSelfIfReady tries to delete the subchannel itself from the channelz database. +// The delete process includes two steps: +// 1. delete the subchannel from the entry relation tree, i.e. delete the subchannel reference from +// its parent's child list. +// 2. delete the subchannel from the map, i.e. delete the subchannel entirely from channelz. Lookup +// by id will return entry not found error. +func (sc *subChannel) deleteSelfIfReady() { + if !sc.deleteSelfFromTree() { + return + } + if !sc.deleteSelfFromMap() { + return + } + sc.cm.deleteEntry(sc.id) + sc.trace.clear() +} + +func (sc *subChannel) getChannelTrace() *channelTrace { + return sc.trace +} + +func (sc *subChannel) incrTraceRefCount() { + atomic.AddInt32(&sc.traceRefCount, 1) +} + +func (sc *subChannel) decrTraceRefCount() { + atomic.AddInt32(&sc.traceRefCount, -1) +} + +func (sc *subChannel) getTraceRefCount() int { + i := atomic.LoadInt32(&sc.traceRefCount) + return int(i) +} + +func (sc *subChannel) getRefName() string { + return sc.refName +} + +// SocketMetric defines the info channelz provides for a specific Socket, which +// includes SocketInternalMetric and channelz-specific data, such as channelz id, etc. +type SocketMetric struct { + // ID is the channelz id of this socket. + ID int64 + // RefName is the human readable reference string of this socket. + RefName string + // SocketData contains socket internal metric reported by the socket through + // ChannelzMetric(). + SocketData *SocketInternalMetric +} + +// SocketInternalMetric defines the struct that the implementor of Socket interface +// should return from ChannelzMetric(). +type SocketInternalMetric struct { + // The number of streams that have been started. + StreamsStarted int64 + // The number of streams that have ended successfully: + // On client side, receiving frame with eos bit set. + // On server side, sending frame with eos bit set. + StreamsSucceeded int64 + // The number of streams that have ended unsuccessfully: + // On client side, termination without receiving frame with eos bit set. + // On server side, termination without sending frame with eos bit set. + StreamsFailed int64 + // The number of messages successfully sent on this socket. + MessagesSent int64 + MessagesReceived int64 + // The number of keep alives sent. This is typically implemented with HTTP/2 + // ping messages. + KeepAlivesSent int64 + // The last time a stream was created by this endpoint. Usually unset for + // servers. + LastLocalStreamCreatedTimestamp time.Time + // The last time a stream was created by the remote endpoint. Usually unset + // for clients. + LastRemoteStreamCreatedTimestamp time.Time + // The last time a message was sent by this endpoint. + LastMessageSentTimestamp time.Time + // The last time a message was received by this endpoint. + LastMessageReceivedTimestamp time.Time + // The amount of window, granted to the local endpoint by the remote endpoint. + // This may be slightly out of date due to network latency. This does NOT + // include stream level or TCP level flow control info. + LocalFlowControlWindow int64 + // The amount of window, granted to the remote endpoint by the local endpoint. + // This may be slightly out of date due to network latency. This does NOT + // include stream level or TCP level flow control info. + RemoteFlowControlWindow int64 + // The locally bound address. + LocalAddr net.Addr + // The remote bound address. May be absent. + RemoteAddr net.Addr + // Optional, represents the name of the remote endpoint, if different than + // the original target name. + RemoteName string + SocketOptions *SocketOptionData + Security credentials.ChannelzSecurityValue +} + +// Socket is the interface that should be satisfied in order to be tracked by +// channelz as Socket. +type Socket interface { + ChannelzMetric() *SocketInternalMetric +} + +type listenSocket struct { + refName string + s Socket + id int64 + pid int64 + cm *channelMap +} + +func (ls *listenSocket) addChild(id int64, e entry) { + grpclog.Errorf("cannot add a child (id = %d) of type %T to a listen socket", id, e) +} + +func (ls *listenSocket) deleteChild(id int64) { + grpclog.Errorf("cannot delete a child (id = %d) from a listen socket", id) +} + +func (ls *listenSocket) triggerDelete() { + ls.cm.deleteEntry(ls.id) + ls.cm.findEntry(ls.pid).deleteChild(ls.id) +} + +func (ls *listenSocket) deleteSelfIfReady() { + grpclog.Errorf("cannot call deleteSelfIfReady on a listen socket") +} + +func (ls *listenSocket) getParentID() int64 { + return ls.pid +} + +type normalSocket struct { + refName string + s Socket + id int64 + pid int64 + cm *channelMap +} + +func (ns *normalSocket) addChild(id int64, e entry) { + grpclog.Errorf("cannot add a child (id = %d) of type %T to a normal socket", id, e) +} + +func (ns *normalSocket) deleteChild(id int64) { + grpclog.Errorf("cannot delete a child (id = %d) from a normal socket", id) +} + +func (ns *normalSocket) triggerDelete() { + ns.cm.deleteEntry(ns.id) + ns.cm.findEntry(ns.pid).deleteChild(ns.id) +} + +func (ns *normalSocket) deleteSelfIfReady() { + grpclog.Errorf("cannot call deleteSelfIfReady on a normal socket") +} + +func (ns *normalSocket) getParentID() int64 { + return ns.pid +} + +// ServerMetric defines the info channelz provides for a specific Server, which +// includes ServerInternalMetric and channelz-specific data, such as channelz id, +// child list, etc. +type ServerMetric struct { + // ID is the channelz id of this server. + ID int64 + // RefName is the human readable reference string of this server. + RefName string + // ServerData contains server internal metric reported by the server through + // ChannelzMetric(). + ServerData *ServerInternalMetric + // ListenSockets tracks the listener socket type children of this server in the + // format of a map from socket channelz id to corresponding reference string. + ListenSockets map[int64]string +} + +// ServerInternalMetric defines the struct that the implementor of Server interface +// should return from ChannelzMetric(). +type ServerInternalMetric struct { + // The number of incoming calls started on the server. + CallsStarted int64 + // The number of incoming calls that have completed with an OK status. + CallsSucceeded int64 + // The number of incoming calls that have a completed with a non-OK status. + CallsFailed int64 + // The last time a call was started on the server. + LastCallStartedTimestamp time.Time +} + +// Server is the interface to be satisfied in order to be tracked by channelz as +// Server. +type Server interface { + ChannelzMetric() *ServerInternalMetric +} + +type server struct { + refName string + s Server + closeCalled bool + sockets map[int64]string + listenSockets map[int64]string + id int64 + cm *channelMap +} + +func (s *server) addChild(id int64, e entry) { + switch v := e.(type) { + case *normalSocket: + s.sockets[id] = v.refName + case *listenSocket: + s.listenSockets[id] = v.refName + default: + grpclog.Errorf("cannot add a child (id = %d) of type %T to a server", id, e) + } +} + +func (s *server) deleteChild(id int64) { + delete(s.sockets, id) + delete(s.listenSockets, id) + s.deleteSelfIfReady() +} + +func (s *server) triggerDelete() { + s.closeCalled = true + s.deleteSelfIfReady() +} + +func (s *server) deleteSelfIfReady() { + if !s.closeCalled || len(s.sockets)+len(s.listenSockets) != 0 { + return + } + s.cm.deleteEntry(s.id) +} + +func (s *server) getParentID() int64 { + return 0 +} + +type tracedChannel interface { + getChannelTrace() *channelTrace + incrTraceRefCount() + decrTraceRefCount() + getRefName() string +} + +type channelTrace struct { + cm *channelMap + createdTime time.Time + eventCount int64 + mu sync.Mutex + events []*TraceEvent +} + +func (c *channelTrace) append(e *TraceEvent) { + c.mu.Lock() + if len(c.events) == getMaxTraceEntry() { + del := c.events[0] + c.events = c.events[1:] + if del.RefID != 0 { + // start recursive cleanup in a goroutine to not block the call originated from grpc. + go func() { + // need to acquire c.cm.mu lock to call the unlocked attemptCleanup func. + c.cm.mu.Lock() + c.cm.decrTraceRefCount(del.RefID) + c.cm.mu.Unlock() + }() + } + } + e.Timestamp = time.Now() + c.events = append(c.events, e) + c.eventCount++ + c.mu.Unlock() +} + +func (c *channelTrace) clear() { + c.mu.Lock() + for _, e := range c.events { + if e.RefID != 0 { + // caller should have already held the c.cm.mu lock. + c.cm.decrTraceRefCount(e.RefID) + } + } + c.mu.Unlock() +} + +// Severity is the severity level of a trace event. +// The canonical enumeration of all valid values is here: +// https://github.com/grpc/grpc-proto/blob/9b13d199cc0d4703c7ea26c9c330ba695866eb23/grpc/channelz/v1/channelz.proto#L126. +type Severity int + +const ( + // CtUNKNOWN indicates unknown severity of a trace event. + CtUNKNOWN Severity = iota + // CtINFO indicates info level severity of a trace event. + CtINFO + // CtWarning indicates warning level severity of a trace event. + CtWarning + // CtError indicates error level severity of a trace event. + CtError +) + +// RefChannelType is the type of the entity being referenced in a trace event. +type RefChannelType int + +const ( + // RefChannel indicates the referenced entity is a Channel. + RefChannel RefChannelType = iota + // RefSubChannel indicates the referenced entity is a SubChannel. + RefSubChannel +) + +func (c *channelTrace) dumpData() *ChannelTrace { + c.mu.Lock() + ct := &ChannelTrace{EventNum: c.eventCount, CreationTime: c.createdTime} + ct.Events = c.events[:len(c.events)] + c.mu.Unlock() + return ct +} diff --git a/vendor/google.golang.org/grpc/internal/channelz/types_linux.go b/vendor/google.golang.org/grpc/internal/channelz/types_linux.go new file mode 100644 index 00000000..692dd618 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/channelz/types_linux.go @@ -0,0 +1,53 @@ +// +build !appengine + +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package channelz + +import ( + "syscall" + + "golang.org/x/sys/unix" +) + +// SocketOptionData defines the struct to hold socket option data, and related +// getter function to obtain info from fd. +type SocketOptionData struct { + Linger *unix.Linger + RecvTimeout *unix.Timeval + SendTimeout *unix.Timeval + TCPInfo *unix.TCPInfo +} + +// Getsockopt defines the function to get socket options requested by channelz. +// It is to be passed to syscall.RawConn.Control(). +func (s *SocketOptionData) Getsockopt(fd uintptr) { + if v, err := unix.GetsockoptLinger(int(fd), syscall.SOL_SOCKET, syscall.SO_LINGER); err == nil { + s.Linger = v + } + if v, err := unix.GetsockoptTimeval(int(fd), syscall.SOL_SOCKET, syscall.SO_RCVTIMEO); err == nil { + s.RecvTimeout = v + } + if v, err := unix.GetsockoptTimeval(int(fd), syscall.SOL_SOCKET, syscall.SO_SNDTIMEO); err == nil { + s.SendTimeout = v + } + if v, err := unix.GetsockoptTCPInfo(int(fd), syscall.SOL_TCP, syscall.TCP_INFO); err == nil { + s.TCPInfo = v + } +} diff --git a/vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go b/vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go new file mode 100644 index 00000000..79edbefc --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go @@ -0,0 +1,44 @@ +// +build !linux appengine + +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package channelz + +import ( + "sync" + + "google.golang.org/grpc/grpclog" +) + +var once sync.Once + +// SocketOptionData defines the struct to hold socket option data, and related +// getter function to obtain info from fd. +// Windows OS doesn't support Socket Option +type SocketOptionData struct { +} + +// Getsockopt defines the function to get socket options requested by channelz. +// It is to be passed to syscall.RawConn.Control(). +// Windows OS doesn't support Socket Option +func (s *SocketOptionData) Getsockopt(fd uintptr) { + once.Do(func() { + grpclog.Warningln("Channelz: socket options are not supported on non-linux os and appengine.") + }) +} diff --git a/vendor/google.golang.org/grpc/internal/channelz/util_linux.go b/vendor/google.golang.org/grpc/internal/channelz/util_linux.go new file mode 100644 index 00000000..fdf409d5 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/channelz/util_linux.go @@ -0,0 +1,39 @@ +// +build linux,!appengine + +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package channelz + +import ( + "syscall" +) + +// GetSocketOption gets the socket option info of the conn. +func GetSocketOption(socket interface{}) *SocketOptionData { + c, ok := socket.(syscall.Conn) + if !ok { + return nil + } + data := &SocketOptionData{} + if rawConn, err := c.SyscallConn(); err == nil { + rawConn.Control(data.Getsockopt) + return data + } + return nil +} diff --git a/vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go b/vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go new file mode 100644 index 00000000..8864a081 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go @@ -0,0 +1,26 @@ +// +build !linux appengine + +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package channelz + +// GetSocketOption gets the socket option info of the conn. +func GetSocketOption(c interface{}) *SocketOptionData { + return nil +} diff --git a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go new file mode 100644 index 00000000..ae6c8972 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go @@ -0,0 +1,38 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package envconfig contains grpc settings configured by environment variables. +package envconfig + +import ( + "os" + "strings" +) + +const ( + prefix = "GRPC_GO_" + retryStr = prefix + "RETRY" + txtErrIgnoreStr = prefix + "IGNORE_TXT_ERRORS" +) + +var ( + // Retry is set if retry is explicitly enabled via "GRPC_GO_RETRY=on". + Retry = strings.EqualFold(os.Getenv(retryStr), "on") + // TXTErrIgnore is set if TXT errors should be ignored ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false"). + TXTErrIgnore = !strings.EqualFold(os.Getenv(retryStr), "false") +) diff --git a/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go b/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go new file mode 100644 index 00000000..8c8e19fc --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go @@ -0,0 +1,118 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package grpclog (internal) defines depth logging for grpc. +package grpclog + +// Logger is the logger used for the non-depth log functions. +var Logger LoggerV2 + +// DepthLogger is the logger used for the depth log functions. +var DepthLogger DepthLoggerV2 + +// InfoDepth logs to the INFO log at the specified depth. +func InfoDepth(depth int, args ...interface{}) { + if DepthLogger != nil { + DepthLogger.InfoDepth(depth, args...) + } else { + Logger.Info(args...) + } +} + +// WarningDepth logs to the WARNING log at the specified depth. +func WarningDepth(depth int, args ...interface{}) { + if DepthLogger != nil { + DepthLogger.WarningDepth(depth, args...) + } else { + Logger.Warning(args...) + } +} + +// ErrorDepth logs to the ERROR log at the specified depth. +func ErrorDepth(depth int, args ...interface{}) { + if DepthLogger != nil { + DepthLogger.ErrorDepth(depth, args...) + } else { + Logger.Error(args...) + } +} + +// FatalDepth logs to the FATAL log at the specified depth. +func FatalDepth(depth int, args ...interface{}) { + if DepthLogger != nil { + DepthLogger.FatalDepth(depth, args...) + } else { + Logger.Fatal(args...) + } +} + +// LoggerV2 does underlying logging work for grpclog. +// This is a copy of the LoggerV2 defined in the external grpclog package. It +// is defined here to avoid a circular dependency. +type LoggerV2 interface { + // Info logs to INFO log. Arguments are handled in the manner of fmt.Print. + Info(args ...interface{}) + // Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. + Infoln(args ...interface{}) + // Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. + Infof(format string, args ...interface{}) + // Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. + Warning(args ...interface{}) + // Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. + Warningln(args ...interface{}) + // Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. + Warningf(format string, args ...interface{}) + // Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. + Error(args ...interface{}) + // Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. + Errorln(args ...interface{}) + // Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. + Errorf(format string, args ...interface{}) + // Fatal logs to ERROR log. Arguments are handled in the manner of fmt.Print. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatal(args ...interface{}) + // Fatalln logs to ERROR log. Arguments are handled in the manner of fmt.Println. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatalln(args ...interface{}) + // Fatalf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatalf(format string, args ...interface{}) + // V reports whether verbosity level l is at least the requested verbose level. + V(l int) bool +} + +// DepthLoggerV2 logs at a specified call frame. If a LoggerV2 also implements +// DepthLoggerV2, the below functions will be called with the appropriate stack +// depth set for trivial functions the logger may ignore. +// This is a copy of the DepthLoggerV2 defined in the external grpclog package. +// It is defined here to avoid a circular dependency. +// +// This API is EXPERIMENTAL. +type DepthLoggerV2 interface { + // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Print. + InfoDepth(depth int, args ...interface{}) + // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Print. + WarningDepth(depth int, args ...interface{}) + // ErrorDetph logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Print. + ErrorDepth(depth int, args ...interface{}) + // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Print. + FatalDepth(depth int, args ...interface{}) +} diff --git a/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go b/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go new file mode 100644 index 00000000..f6e0dc1d --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go @@ -0,0 +1,63 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpclog + +// PrefixLogger does logging with a prefix. +// +// Logging method on a nil logs without any prefix. +type PrefixLogger struct { + prefix string +} + +// Infof does info logging. +func (pl *PrefixLogger) Infof(format string, args ...interface{}) { + if pl != nil { + // Handle nil, so the tests can pass in a nil logger. + format = pl.prefix + format + } + Logger.Infof(format, args...) +} + +// Warningf does warning logging. +func (pl *PrefixLogger) Warningf(format string, args ...interface{}) { + if pl != nil { + format = pl.prefix + format + } + Logger.Warningf(format, args...) +} + +// Errorf does error logging. +func (pl *PrefixLogger) Errorf(format string, args ...interface{}) { + if pl != nil { + format = pl.prefix + format + } + Logger.Errorf(format, args...) +} + +// Debugf does info logging at verbose level 2. +func (pl *PrefixLogger) Debugf(format string, args ...interface{}) { + if Logger.V(2) { + pl.Infof(format, args...) + } +} + +// NewPrefixLogger creates a prefix logger with the given prefix. +func NewPrefixLogger(prefix string) *PrefixLogger { + return &PrefixLogger{prefix: prefix} +} diff --git a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go new file mode 100644 index 00000000..200b115c --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go @@ -0,0 +1,56 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package grpcrand implements math/rand functions in a concurrent-safe way +// with a global random source, independent of math/rand's global source. +package grpcrand + +import ( + "math/rand" + "sync" + "time" +) + +var ( + r = rand.New(rand.NewSource(time.Now().UnixNano())) + mu sync.Mutex +) + +// Int63n implements rand.Int63n on the grpcrand global source. +func Int63n(n int64) int64 { + mu.Lock() + res := r.Int63n(n) + mu.Unlock() + return res +} + +// Intn implements rand.Intn on the grpcrand global source. +func Intn(n int) int { + mu.Lock() + res := r.Intn(n) + mu.Unlock() + return res +} + +// Float64 implements rand.Float64 on the grpcrand global source. +func Float64() float64 { + mu.Lock() + res := r.Float64() + mu.Unlock() + return res +} diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/event.go b/vendor/google.golang.org/grpc/internal/grpcsync/event.go new file mode 100644 index 00000000..fbe697c3 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/grpcsync/event.go @@ -0,0 +1,61 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package grpcsync implements additional synchronization primitives built upon +// the sync package. +package grpcsync + +import ( + "sync" + "sync/atomic" +) + +// Event represents a one-time event that may occur in the future. +type Event struct { + fired int32 + c chan struct{} + o sync.Once +} + +// Fire causes e to complete. It is safe to call multiple times, and +// concurrently. It returns true iff this call to Fire caused the signaling +// channel returned by Done to close. +func (e *Event) Fire() bool { + ret := false + e.o.Do(func() { + atomic.StoreInt32(&e.fired, 1) + close(e.c) + ret = true + }) + return ret +} + +// Done returns a channel that will be closed when Fire is called. +func (e *Event) Done() <-chan struct{} { + return e.c +} + +// HasFired returns true if Fire has been called. +func (e *Event) HasFired() bool { + return atomic.LoadInt32(&e.fired) == 1 +} + +// NewEvent returns a new, ready-to-use Event. +func NewEvent() *Event { + return &Event{c: make(chan struct{})} +} diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/target.go b/vendor/google.golang.org/grpc/internal/grpcutil/target.go new file mode 100644 index 00000000..80b33cda --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/grpcutil/target.go @@ -0,0 +1,55 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package grpcutil provides a bunch of utility functions to be used across the +// gRPC codebase. +package grpcutil + +import ( + "strings" + + "google.golang.org/grpc/resolver" +) + +// split2 returns the values from strings.SplitN(s, sep, 2). +// If sep is not found, it returns ("", "", false) instead. +func split2(s, sep string) (string, string, bool) { + spl := strings.SplitN(s, sep, 2) + if len(spl) < 2 { + return "", "", false + } + return spl[0], spl[1], true +} + +// ParseTarget splits target into a resolver.Target struct containing scheme, +// authority and endpoint. +// +// If target is not a valid scheme://authority/endpoint, it returns {Endpoint: +// target}. +func ParseTarget(target string) (ret resolver.Target) { + var ok bool + ret.Scheme, ret.Endpoint, ok = split2(target, "://") + if !ok { + return resolver.Target{Endpoint: target} + } + ret.Authority, ret.Endpoint, ok = split2(ret.Endpoint, "/") + if !ok { + return resolver.Target{Endpoint: target} + } + return ret +} diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go new file mode 100644 index 00000000..c6fbe8bb --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/internal.go @@ -0,0 +1,67 @@ +/* + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package internal contains gRPC-internal code, to avoid polluting +// the godoc of the top-level grpc package. It must not import any grpc +// symbols to avoid circular dependencies. +package internal + +import ( + "context" + "time" + + "google.golang.org/grpc/connectivity" +) + +var ( + // WithHealthCheckFunc is set by dialoptions.go + WithHealthCheckFunc interface{} // func (HealthChecker) DialOption + // HealthCheckFunc is used to provide client-side LB channel health checking + HealthCheckFunc HealthChecker + // BalancerUnregister is exported by package balancer to unregister a balancer. + BalancerUnregister func(name string) + // KeepaliveMinPingTime is the minimum ping interval. This must be 10s by + // default, but tests may wish to set it lower for convenience. + KeepaliveMinPingTime = 10 * time.Second + // NewRequestInfoContext creates a new context based on the argument context attaching + // the passed in RequestInfo to the new context. + NewRequestInfoContext interface{} // func(context.Context, credentials.RequestInfo) context.Context + // ParseServiceConfigForTesting is for creating a fake + // ClientConn for resolver testing only + ParseServiceConfigForTesting interface{} // func(string) *serviceconfig.ParseResult +) + +// HealthChecker defines the signature of the client-side LB channel health checking function. +// +// The implementation is expected to create a health checking RPC stream by +// calling newStream(), watch for the health status of serviceName, and report +// it's health back by calling setConnectivityState(). +// +// The health checking protocol is defined at: +// https://github.com/grpc/grpc/blob/master/doc/health-checking.md +type HealthChecker func(ctx context.Context, newStream func(string) (interface{}, error), setConnectivityState func(connectivity.State, error), serviceName string) error + +const ( + // CredsBundleModeFallback switches GoogleDefaultCreds to fallback mode. + CredsBundleModeFallback = "fallback" + // CredsBundleModeBalancer switches GoogleDefaultCreds to grpclb balancer + // mode. + CredsBundleModeBalancer = "balancer" + // CredsBundleModeBackendFromBalancer switches GoogleDefaultCreds to mode + // that supports backend returned by grpclb balancer. + CredsBundleModeBackendFromBalancer = "backend-from-balancer" +) diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go new file mode 100644 index 00000000..c368db62 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go @@ -0,0 +1,441 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package dns implements a dns resolver to be installed as the default resolver +// in grpc. +package dns + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "net" + "os" + "strconv" + "strings" + "sync" + "time" + + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/envconfig" + "google.golang.org/grpc/internal/grpcrand" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/serviceconfig" +) + +// EnableSRVLookups controls whether the DNS resolver attempts to fetch gRPCLB +// addresses from SRV records. Must not be changed after init time. +var EnableSRVLookups = false + +func init() { + resolver.Register(NewBuilder()) +} + +const ( + defaultPort = "443" + defaultDNSSvrPort = "53" + golang = "GO" + // txtPrefix is the prefix string to be prepended to the host name for txt record lookup. + txtPrefix = "_grpc_config." + // In DNS, service config is encoded in a TXT record via the mechanism + // described in RFC-1464 using the attribute name grpc_config. + txtAttribute = "grpc_config=" +) + +var ( + errMissingAddr = errors.New("dns resolver: missing address") + + // Addresses ending with a colon that is supposed to be the separator + // between host and port is not allowed. E.g. "::" is a valid address as + // it is an IPv6 address (host only) and "[::]:" is invalid as it ends with + // a colon as the host and port separator + errEndsWithColon = errors.New("dns resolver: missing port after port-separator colon") +) + +var ( + defaultResolver netResolver = net.DefaultResolver + // To prevent excessive re-resolution, we enforce a rate limit on DNS + // resolution requests. + minDNSResRate = 30 * time.Second +) + +var customAuthorityDialler = func(authority string) func(ctx context.Context, network, address string) (net.Conn, error) { + return func(ctx context.Context, network, address string) (net.Conn, error) { + var dialer net.Dialer + return dialer.DialContext(ctx, network, authority) + } +} + +var customAuthorityResolver = func(authority string) (netResolver, error) { + host, port, err := parseTarget(authority, defaultDNSSvrPort) + if err != nil { + return nil, err + } + + authorityWithPort := net.JoinHostPort(host, port) + + return &net.Resolver{ + PreferGo: true, + Dial: customAuthorityDialler(authorityWithPort), + }, nil +} + +// NewBuilder creates a dnsBuilder which is used to factory DNS resolvers. +func NewBuilder() resolver.Builder { + return &dnsBuilder{} +} + +type dnsBuilder struct{} + +// Build creates and starts a DNS resolver that watches the name resolution of the target. +func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { + host, port, err := parseTarget(target.Endpoint, defaultPort) + if err != nil { + return nil, err + } + + // IP address. + if ipAddr, ok := formatIP(host); ok { + addr := []resolver.Address{{Addr: ipAddr + ":" + port}} + cc.UpdateState(resolver.State{Addresses: addr}) + return deadResolver{}, nil + } + + // DNS address (non-IP). + ctx, cancel := context.WithCancel(context.Background()) + d := &dnsResolver{ + host: host, + port: port, + ctx: ctx, + cancel: cancel, + cc: cc, + rn: make(chan struct{}, 1), + disableServiceConfig: opts.DisableServiceConfig, + } + + if target.Authority == "" { + d.resolver = defaultResolver + } else { + d.resolver, err = customAuthorityResolver(target.Authority) + if err != nil { + return nil, err + } + } + + d.wg.Add(1) + go d.watcher() + d.ResolveNow(resolver.ResolveNowOptions{}) + return d, nil +} + +// Scheme returns the naming scheme of this resolver builder, which is "dns". +func (b *dnsBuilder) Scheme() string { + return "dns" +} + +type netResolver interface { + LookupHost(ctx context.Context, host string) (addrs []string, err error) + LookupSRV(ctx context.Context, service, proto, name string) (cname string, addrs []*net.SRV, err error) + LookupTXT(ctx context.Context, name string) (txts []string, err error) +} + +// deadResolver is a resolver that does nothing. +type deadResolver struct{} + +func (deadResolver) ResolveNow(resolver.ResolveNowOptions) {} + +func (deadResolver) Close() {} + +// dnsResolver watches for the name resolution update for a non-IP target. +type dnsResolver struct { + host string + port string + resolver netResolver + ctx context.Context + cancel context.CancelFunc + cc resolver.ClientConn + // rn channel is used by ResolveNow() to force an immediate resolution of the target. + rn chan struct{} + // wg is used to enforce Close() to return after the watcher() goroutine has finished. + // Otherwise, data race will be possible. [Race Example] in dns_resolver_test we + // replace the real lookup functions with mocked ones to facilitate testing. + // If Close() doesn't wait for watcher() goroutine finishes, race detector sometimes + // will warns lookup (READ the lookup function pointers) inside watcher() goroutine + // has data race with replaceNetFunc (WRITE the lookup function pointers). + wg sync.WaitGroup + disableServiceConfig bool +} + +// ResolveNow invoke an immediate resolution of the target that this dnsResolver watches. +func (d *dnsResolver) ResolveNow(resolver.ResolveNowOptions) { + select { + case d.rn <- struct{}{}: + default: + } +} + +// Close closes the dnsResolver. +func (d *dnsResolver) Close() { + d.cancel() + d.wg.Wait() +} + +func (d *dnsResolver) watcher() { + defer d.wg.Done() + for { + select { + case <-d.ctx.Done(): + return + case <-d.rn: + } + + state, err := d.lookup() + if err != nil { + d.cc.ReportError(err) + } else { + d.cc.UpdateState(*state) + } + + // Sleep to prevent excessive re-resolutions. Incoming resolution requests + // will be queued in d.rn. + t := time.NewTimer(minDNSResRate) + select { + case <-t.C: + case <-d.ctx.Done(): + t.Stop() + return + } + } +} + +func (d *dnsResolver) lookupSRV() ([]resolver.Address, error) { + if !EnableSRVLookups { + return nil, nil + } + var newAddrs []resolver.Address + _, srvs, err := d.resolver.LookupSRV(d.ctx, "grpclb", "tcp", d.host) + if err != nil { + err = handleDNSError(err, "SRV") // may become nil + return nil, err + } + for _, s := range srvs { + lbAddrs, err := d.resolver.LookupHost(d.ctx, s.Target) + if err != nil { + err = handleDNSError(err, "A") // may become nil + if err == nil { + // If there are other SRV records, look them up and ignore this + // one that does not exist. + continue + } + return nil, err + } + for _, a := range lbAddrs { + ip, ok := formatIP(a) + if !ok { + return nil, fmt.Errorf("dns: error parsing A record IP address %v", a) + } + addr := ip + ":" + strconv.Itoa(int(s.Port)) + newAddrs = append(newAddrs, resolver.Address{Addr: addr, Type: resolver.GRPCLB, ServerName: s.Target}) + } + } + return newAddrs, nil +} + +var filterError = func(err error) error { + if dnsErr, ok := err.(*net.DNSError); ok && !dnsErr.IsTimeout && !dnsErr.IsTemporary { + // Timeouts and temporary errors should be communicated to gRPC to + // attempt another DNS query (with backoff). Other errors should be + // suppressed (they may represent the absence of a TXT record). + return nil + } + return err +} + +func handleDNSError(err error, lookupType string) error { + err = filterError(err) + if err != nil { + err = fmt.Errorf("dns: %v record lookup error: %v", lookupType, err) + grpclog.Infoln(err) + } + return err +} + +func (d *dnsResolver) lookupTXT() *serviceconfig.ParseResult { + ss, err := d.resolver.LookupTXT(d.ctx, txtPrefix+d.host) + if err != nil { + if envconfig.TXTErrIgnore { + return nil + } + if err = handleDNSError(err, "TXT"); err != nil { + return &serviceconfig.ParseResult{Err: err} + } + return nil + } + var res string + for _, s := range ss { + res += s + } + + // TXT record must have "grpc_config=" attribute in order to be used as service config. + if !strings.HasPrefix(res, txtAttribute) { + grpclog.Warningf("dns: TXT record %v missing %v attribute", res, txtAttribute) + // This is not an error; it is the equivalent of not having a service config. + return nil + } + sc := canaryingSC(strings.TrimPrefix(res, txtAttribute)) + return d.cc.ParseServiceConfig(sc) +} + +func (d *dnsResolver) lookupHost() ([]resolver.Address, error) { + var newAddrs []resolver.Address + addrs, err := d.resolver.LookupHost(d.ctx, d.host) + if err != nil { + err = handleDNSError(err, "A") + return nil, err + } + for _, a := range addrs { + ip, ok := formatIP(a) + if !ok { + return nil, fmt.Errorf("dns: error parsing A record IP address %v", a) + } + addr := ip + ":" + d.port + newAddrs = append(newAddrs, resolver.Address{Addr: addr}) + } + return newAddrs, nil +} + +func (d *dnsResolver) lookup() (*resolver.State, error) { + srv, srvErr := d.lookupSRV() + addrs, hostErr := d.lookupHost() + if hostErr != nil && (srvErr != nil || len(srv) == 0) { + return nil, hostErr + } + state := &resolver.State{ + Addresses: append(addrs, srv...), + } + if !d.disableServiceConfig { + state.ServiceConfig = d.lookupTXT() + } + return state, nil +} + +// formatIP returns ok = false if addr is not a valid textual representation of an IP address. +// If addr is an IPv4 address, return the addr and ok = true. +// If addr is an IPv6 address, return the addr enclosed in square brackets and ok = true. +func formatIP(addr string) (addrIP string, ok bool) { + ip := net.ParseIP(addr) + if ip == nil { + return "", false + } + if ip.To4() != nil { + return addr, true + } + return "[" + addr + "]", true +} + +// parseTarget takes the user input target string and default port, returns formatted host and port info. +// If target doesn't specify a port, set the port to be the defaultPort. +// If target is in IPv6 format and host-name is enclosed in square brackets, brackets +// are stripped when setting the host. +// examples: +// target: "www.google.com" defaultPort: "443" returns host: "www.google.com", port: "443" +// target: "ipv4-host:80" defaultPort: "443" returns host: "ipv4-host", port: "80" +// target: "[ipv6-host]" defaultPort: "443" returns host: "ipv6-host", port: "443" +// target: ":80" defaultPort: "443" returns host: "localhost", port: "80" +func parseTarget(target, defaultPort string) (host, port string, err error) { + if target == "" { + return "", "", errMissingAddr + } + if ip := net.ParseIP(target); ip != nil { + // target is an IPv4 or IPv6(without brackets) address + return target, defaultPort, nil + } + if host, port, err = net.SplitHostPort(target); err == nil { + if port == "" { + // If the port field is empty (target ends with colon), e.g. "[::1]:", this is an error. + return "", "", errEndsWithColon + } + // target has port, i.e ipv4-host:port, [ipv6-host]:port, host-name:port + if host == "" { + // Keep consistent with net.Dial(): If the host is empty, as in ":80", the local system is assumed. + host = "localhost" + } + return host, port, nil + } + if host, port, err = net.SplitHostPort(target + ":" + defaultPort); err == nil { + // target doesn't have port + return host, port, nil + } + return "", "", fmt.Errorf("invalid target address %v, error info: %v", target, err) +} + +type rawChoice struct { + ClientLanguage *[]string `json:"clientLanguage,omitempty"` + Percentage *int `json:"percentage,omitempty"` + ClientHostName *[]string `json:"clientHostName,omitempty"` + ServiceConfig *json.RawMessage `json:"serviceConfig,omitempty"` +} + +func containsString(a *[]string, b string) bool { + if a == nil { + return true + } + for _, c := range *a { + if c == b { + return true + } + } + return false +} + +func chosenByPercentage(a *int) bool { + if a == nil { + return true + } + return grpcrand.Intn(100)+1 <= *a +} + +func canaryingSC(js string) string { + if js == "" { + return "" + } + var rcs []rawChoice + err := json.Unmarshal([]byte(js), &rcs) + if err != nil { + grpclog.Warningf("dns: error parsing service config json: %v", err) + return "" + } + cliHostname, err := os.Hostname() + if err != nil { + grpclog.Warningf("dns: error getting client hostname: %v", err) + return "" + } + var sc string + for _, c := range rcs { + if !containsString(c.ClientLanguage, golang) || + !chosenByPercentage(c.Percentage) || + !containsString(c.ClientHostName, cliHostname) || + c.ServiceConfig == nil { + continue + } + sc = string(*c.ServiceConfig) + break + } + return sc +} diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/go113.go b/vendor/google.golang.org/grpc/internal/resolver/dns/go113.go new file mode 100644 index 00000000..8783a8cf --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/go113.go @@ -0,0 +1,33 @@ +// +build go1.13 + +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package dns + +import "net" + +func init() { + filterError = func(err error) error { + if dnsErr, ok := err.(*net.DNSError); ok && dnsErr.IsNotFound { + // The name does not exist; not an error. + return nil + } + return err + } +} diff --git a/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go b/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go new file mode 100644 index 00000000..520d9229 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go @@ -0,0 +1,57 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package passthrough implements a pass-through resolver. It sends the target +// name without scheme back to gRPC as resolved address. +package passthrough + +import "google.golang.org/grpc/resolver" + +const scheme = "passthrough" + +type passthroughBuilder struct{} + +func (*passthroughBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { + r := &passthroughResolver{ + target: target, + cc: cc, + } + r.start() + return r, nil +} + +func (*passthroughBuilder) Scheme() string { + return scheme +} + +type passthroughResolver struct { + target resolver.Target + cc resolver.ClientConn +} + +func (r *passthroughResolver) start() { + r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: r.target.Endpoint}}}) +} + +func (*passthroughResolver) ResolveNow(o resolver.ResolveNowOptions) {} + +func (*passthroughResolver) Close() {} + +func init() { + resolver.Register(&passthroughBuilder{}) +} diff --git a/vendor/google.golang.org/grpc/internal/status/status.go b/vendor/google.golang.org/grpc/internal/status/status.go new file mode 100644 index 00000000..68126069 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/status/status.go @@ -0,0 +1,161 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package status implements errors returned by gRPC. These errors are +// serialized and transmitted on the wire between server and client, and allow +// for additional data to be transmitted via the Details field in the status +// proto. gRPC service handlers should return an error created by this +// package, and gRPC clients should expect a corresponding error to be +// returned from the RPC call. +// +// This package upholds the invariants that a non-nil error may not +// contain an OK code, and an OK code must result in a nil error. +package status + +import ( + "errors" + "fmt" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes" + spb "google.golang.org/genproto/googleapis/rpc/status" + "google.golang.org/grpc/codes" +) + +// Status represents an RPC status code, message, and details. It is immutable +// and should be created with New, Newf, or FromProto. +type Status struct { + s *spb.Status +} + +// New returns a Status representing c and msg. +func New(c codes.Code, msg string) *Status { + return &Status{s: &spb.Status{Code: int32(c), Message: msg}} +} + +// Newf returns New(c, fmt.Sprintf(format, a...)). +func Newf(c codes.Code, format string, a ...interface{}) *Status { + return New(c, fmt.Sprintf(format, a...)) +} + +// FromProto returns a Status representing s. +func FromProto(s *spb.Status) *Status { + return &Status{s: proto.Clone(s).(*spb.Status)} +} + +// Err returns an error representing c and msg. If c is OK, returns nil. +func Err(c codes.Code, msg string) error { + return New(c, msg).Err() +} + +// Errorf returns Error(c, fmt.Sprintf(format, a...)). +func Errorf(c codes.Code, format string, a ...interface{}) error { + return Err(c, fmt.Sprintf(format, a...)) +} + +// Code returns the status code contained in s. +func (s *Status) Code() codes.Code { + if s == nil || s.s == nil { + return codes.OK + } + return codes.Code(s.s.Code) +} + +// Message returns the message contained in s. +func (s *Status) Message() string { + if s == nil || s.s == nil { + return "" + } + return s.s.Message +} + +// Proto returns s's status as an spb.Status proto message. +func (s *Status) Proto() *spb.Status { + if s == nil { + return nil + } + return proto.Clone(s.s).(*spb.Status) +} + +// Err returns an immutable error representing s; returns nil if s.Code() is OK. +func (s *Status) Err() error { + if s.Code() == codes.OK { + return nil + } + return (*Error)(s.Proto()) +} + +// WithDetails returns a new status with the provided details messages appended to the status. +// If any errors are encountered, it returns nil and the first error encountered. +func (s *Status) WithDetails(details ...proto.Message) (*Status, error) { + if s.Code() == codes.OK { + return nil, errors.New("no error details for status with code OK") + } + // s.Code() != OK implies that s.Proto() != nil. + p := s.Proto() + for _, detail := range details { + any, err := ptypes.MarshalAny(detail) + if err != nil { + return nil, err + } + p.Details = append(p.Details, any) + } + return &Status{s: p}, nil +} + +// Details returns a slice of details messages attached to the status. +// If a detail cannot be decoded, the error is returned in place of the detail. +func (s *Status) Details() []interface{} { + if s == nil || s.s == nil { + return nil + } + details := make([]interface{}, 0, len(s.s.Details)) + for _, any := range s.s.Details { + detail := &ptypes.DynamicAny{} + if err := ptypes.UnmarshalAny(any, detail); err != nil { + details = append(details, err) + continue + } + details = append(details, detail.Message) + } + return details +} + +// Error is an alias of a status proto. It implements error and Status, +// and a nil Error should never be returned by this package. +type Error spb.Status + +func (se *Error) Error() string { + p := (*spb.Status)(se) + return fmt.Sprintf("rpc error: code = %s desc = %s", codes.Code(p.GetCode()), p.GetMessage()) +} + +// GRPCStatus returns the Status represented by se. +func (se *Error) GRPCStatus() *Status { + return FromProto((*spb.Status)(se)) +} + +// Is implements future error.Is functionality. +// A Error is equivalent if the code and message are identical. +func (se *Error) Is(target error) bool { + tse, ok := target.(*Error) + if !ok { + return false + } + return proto.Equal((*spb.Status)(se), (*spb.Status)(tse)) +} diff --git a/vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go b/vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go new file mode 100644 index 00000000..43281a3e --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go @@ -0,0 +1,114 @@ +// +build !appengine + +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package syscall provides functionalities that grpc uses to get low-level operating system +// stats/info. +package syscall + +import ( + "fmt" + "net" + "syscall" + "time" + + "golang.org/x/sys/unix" + "google.golang.org/grpc/grpclog" +) + +// GetCPUTime returns the how much CPU time has passed since the start of this process. +func GetCPUTime() int64 { + var ts unix.Timespec + if err := unix.ClockGettime(unix.CLOCK_PROCESS_CPUTIME_ID, &ts); err != nil { + grpclog.Fatal(err) + } + return ts.Nano() +} + +// Rusage is an alias for syscall.Rusage under linux non-appengine environment. +type Rusage syscall.Rusage + +// GetRusage returns the resource usage of current process. +func GetRusage() (rusage *Rusage) { + rusage = new(Rusage) + syscall.Getrusage(syscall.RUSAGE_SELF, (*syscall.Rusage)(rusage)) + return +} + +// CPUTimeDiff returns the differences of user CPU time and system CPU time used +// between two Rusage structs. +func CPUTimeDiff(first *Rusage, latest *Rusage) (float64, float64) { + f := (*syscall.Rusage)(first) + l := (*syscall.Rusage)(latest) + var ( + utimeDiffs = l.Utime.Sec - f.Utime.Sec + utimeDiffus = l.Utime.Usec - f.Utime.Usec + stimeDiffs = l.Stime.Sec - f.Stime.Sec + stimeDiffus = l.Stime.Usec - f.Stime.Usec + ) + + uTimeElapsed := float64(utimeDiffs) + float64(utimeDiffus)*1.0e-6 + sTimeElapsed := float64(stimeDiffs) + float64(stimeDiffus)*1.0e-6 + + return uTimeElapsed, sTimeElapsed +} + +// SetTCPUserTimeout sets the TCP user timeout on a connection's socket +func SetTCPUserTimeout(conn net.Conn, timeout time.Duration) error { + tcpconn, ok := conn.(*net.TCPConn) + if !ok { + // not a TCP connection. exit early + return nil + } + rawConn, err := tcpconn.SyscallConn() + if err != nil { + return fmt.Errorf("error getting raw connection: %v", err) + } + err = rawConn.Control(func(fd uintptr) { + err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, unix.TCP_USER_TIMEOUT, int(timeout/time.Millisecond)) + }) + if err != nil { + return fmt.Errorf("error setting option on socket: %v", err) + } + + return nil +} + +// GetTCPUserTimeout gets the TCP user timeout on a connection's socket +func GetTCPUserTimeout(conn net.Conn) (opt int, err error) { + tcpconn, ok := conn.(*net.TCPConn) + if !ok { + err = fmt.Errorf("conn is not *net.TCPConn. got %T", conn) + return + } + rawConn, err := tcpconn.SyscallConn() + if err != nil { + err = fmt.Errorf("error getting raw connection: %v", err) + return + } + err = rawConn.Control(func(fd uintptr) { + opt, err = syscall.GetsockoptInt(int(fd), syscall.IPPROTO_TCP, unix.TCP_USER_TIMEOUT) + }) + if err != nil { + err = fmt.Errorf("error getting option on socket: %v", err) + return + } + + return +} diff --git a/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go b/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go new file mode 100644 index 00000000..d3fd9dab --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go @@ -0,0 +1,73 @@ +// +build !linux appengine + +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package syscall + +import ( + "net" + "sync" + "time" + + "google.golang.org/grpc/grpclog" +) + +var once sync.Once + +func log() { + once.Do(func() { + grpclog.Info("CPU time info is unavailable on non-linux or appengine environment.") + }) +} + +// GetCPUTime returns the how much CPU time has passed since the start of this process. +// It always returns 0 under non-linux or appengine environment. +func GetCPUTime() int64 { + log() + return 0 +} + +// Rusage is an empty struct under non-linux or appengine environment. +type Rusage struct{} + +// GetRusage is a no-op function under non-linux or appengine environment. +func GetRusage() (rusage *Rusage) { + log() + return nil +} + +// CPUTimeDiff returns the differences of user CPU time and system CPU time used +// between two Rusage structs. It a no-op function for non-linux or appengine environment. +func CPUTimeDiff(first *Rusage, latest *Rusage) (float64, float64) { + log() + return 0, 0 +} + +// SetTCPUserTimeout is a no-op function under non-linux or appengine environments +func SetTCPUserTimeout(conn net.Conn, timeout time.Duration) error { + log() + return nil +} + +// GetTCPUserTimeout is a no-op function under non-linux or appengine environments +// a negative return value indicates the operation is not supported +func GetTCPUserTimeout(conn net.Conn) (int, error) { + log() + return -1, nil +} diff --git a/vendor/google.golang.org/grpc/internal/transport/bdp_estimator.go b/vendor/google.golang.org/grpc/internal/transport/bdp_estimator.go new file mode 100644 index 00000000..070680ed --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/bdp_estimator.go @@ -0,0 +1,141 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "sync" + "time" +) + +const ( + // bdpLimit is the maximum value the flow control windows will be increased + // to. TCP typically limits this to 4MB, but some systems go up to 16MB. + // Since this is only a limit, it is safe to make it optimistic. + bdpLimit = (1 << 20) * 16 + // alpha is a constant factor used to keep a moving average + // of RTTs. + alpha = 0.9 + // If the current bdp sample is greater than or equal to + // our beta * our estimated bdp and the current bandwidth + // sample is the maximum bandwidth observed so far, we + // increase our bbp estimate by a factor of gamma. + beta = 0.66 + // To put our bdp to be smaller than or equal to twice the real BDP, + // we should multiply our current sample with 4/3, however to round things out + // we use 2 as the multiplication factor. + gamma = 2 +) + +// Adding arbitrary data to ping so that its ack can be identified. +// Easter-egg: what does the ping message say? +var bdpPing = &ping{data: [8]byte{2, 4, 16, 16, 9, 14, 7, 7}} + +type bdpEstimator struct { + // sentAt is the time when the ping was sent. + sentAt time.Time + + mu sync.Mutex + // bdp is the current bdp estimate. + bdp uint32 + // sample is the number of bytes received in one measurement cycle. + sample uint32 + // bwMax is the maximum bandwidth noted so far (bytes/sec). + bwMax float64 + // bool to keep track of the beginning of a new measurement cycle. + isSent bool + // Callback to update the window sizes. + updateFlowControl func(n uint32) + // sampleCount is the number of samples taken so far. + sampleCount uint64 + // round trip time (seconds) + rtt float64 +} + +// timesnap registers the time bdp ping was sent out so that +// network rtt can be calculated when its ack is received. +// It is called (by controller) when the bdpPing is +// being written on the wire. +func (b *bdpEstimator) timesnap(d [8]byte) { + if bdpPing.data != d { + return + } + b.sentAt = time.Now() +} + +// add adds bytes to the current sample for calculating bdp. +// It returns true only if a ping must be sent. This can be used +// by the caller (handleData) to make decision about batching +// a window update with it. +func (b *bdpEstimator) add(n uint32) bool { + b.mu.Lock() + defer b.mu.Unlock() + if b.bdp == bdpLimit { + return false + } + if !b.isSent { + b.isSent = true + b.sample = n + b.sentAt = time.Time{} + b.sampleCount++ + return true + } + b.sample += n + return false +} + +// calculate is called when an ack for a bdp ping is received. +// Here we calculate the current bdp and bandwidth sample and +// decide if the flow control windows should go up. +func (b *bdpEstimator) calculate(d [8]byte) { + // Check if the ping acked for was the bdp ping. + if bdpPing.data != d { + return + } + b.mu.Lock() + rttSample := time.Since(b.sentAt).Seconds() + if b.sampleCount < 10 { + // Bootstrap rtt with an average of first 10 rtt samples. + b.rtt += (rttSample - b.rtt) / float64(b.sampleCount) + } else { + // Heed to the recent past more. + b.rtt += (rttSample - b.rtt) * float64(alpha) + } + b.isSent = false + // The number of bytes accumulated so far in the sample is smaller + // than or equal to 1.5 times the real BDP on a saturated connection. + bwCurrent := float64(b.sample) / (b.rtt * float64(1.5)) + if bwCurrent > b.bwMax { + b.bwMax = bwCurrent + } + // If the current sample (which is smaller than or equal to the 1.5 times the real BDP) is + // greater than or equal to 2/3rd our perceived bdp AND this is the maximum bandwidth seen so far, we + // should update our perception of the network BDP. + if float64(b.sample) >= beta*float64(b.bdp) && bwCurrent == b.bwMax && b.bdp != bdpLimit { + sampleFloat := float64(b.sample) + b.bdp = uint32(gamma * sampleFloat) + if b.bdp > bdpLimit { + b.bdp = bdpLimit + } + bdp := b.bdp + b.mu.Unlock() + b.updateFlowControl(bdp) + return + } + b.mu.Unlock() +} diff --git a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go new file mode 100644 index 00000000..ddee20b6 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go @@ -0,0 +1,926 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "bytes" + "fmt" + "runtime" + "sync" + "sync/atomic" + + "golang.org/x/net/http2" + "golang.org/x/net/http2/hpack" +) + +var updateHeaderTblSize = func(e *hpack.Encoder, v uint32) { + e.SetMaxDynamicTableSizeLimit(v) +} + +type itemNode struct { + it interface{} + next *itemNode +} + +type itemList struct { + head *itemNode + tail *itemNode +} + +func (il *itemList) enqueue(i interface{}) { + n := &itemNode{it: i} + if il.tail == nil { + il.head, il.tail = n, n + return + } + il.tail.next = n + il.tail = n +} + +// peek returns the first item in the list without removing it from the +// list. +func (il *itemList) peek() interface{} { + return il.head.it +} + +func (il *itemList) dequeue() interface{} { + if il.head == nil { + return nil + } + i := il.head.it + il.head = il.head.next + if il.head == nil { + il.tail = nil + } + return i +} + +func (il *itemList) dequeueAll() *itemNode { + h := il.head + il.head, il.tail = nil, nil + return h +} + +func (il *itemList) isEmpty() bool { + return il.head == nil +} + +// The following defines various control items which could flow through +// the control buffer of transport. They represent different aspects of +// control tasks, e.g., flow control, settings, streaming resetting, etc. + +// maxQueuedTransportResponseFrames is the most queued "transport response" +// frames we will buffer before preventing new reads from occurring on the +// transport. These are control frames sent in response to client requests, +// such as RST_STREAM due to bad headers or settings acks. +const maxQueuedTransportResponseFrames = 50 + +type cbItem interface { + isTransportResponseFrame() bool +} + +// registerStream is used to register an incoming stream with loopy writer. +type registerStream struct { + streamID uint32 + wq *writeQuota +} + +func (*registerStream) isTransportResponseFrame() bool { return false } + +// headerFrame is also used to register stream on the client-side. +type headerFrame struct { + streamID uint32 + hf []hpack.HeaderField + endStream bool // Valid on server side. + initStream func(uint32) error // Used only on the client side. + onWrite func() + wq *writeQuota // write quota for the stream created. + cleanup *cleanupStream // Valid on the server side. + onOrphaned func(error) // Valid on client-side +} + +func (h *headerFrame) isTransportResponseFrame() bool { + return h.cleanup != nil && h.cleanup.rst // Results in a RST_STREAM +} + +type cleanupStream struct { + streamID uint32 + rst bool + rstCode http2.ErrCode + onWrite func() +} + +func (c *cleanupStream) isTransportResponseFrame() bool { return c.rst } // Results in a RST_STREAM + +type dataFrame struct { + streamID uint32 + endStream bool + h []byte + d []byte + // onEachWrite is called every time + // a part of d is written out. + onEachWrite func() +} + +func (*dataFrame) isTransportResponseFrame() bool { return false } + +type incomingWindowUpdate struct { + streamID uint32 + increment uint32 +} + +func (*incomingWindowUpdate) isTransportResponseFrame() bool { return false } + +type outgoingWindowUpdate struct { + streamID uint32 + increment uint32 +} + +func (*outgoingWindowUpdate) isTransportResponseFrame() bool { + return false // window updates are throttled by thresholds +} + +type incomingSettings struct { + ss []http2.Setting +} + +func (*incomingSettings) isTransportResponseFrame() bool { return true } // Results in a settings ACK + +type outgoingSettings struct { + ss []http2.Setting +} + +func (*outgoingSettings) isTransportResponseFrame() bool { return false } + +type incomingGoAway struct { +} + +func (*incomingGoAway) isTransportResponseFrame() bool { return false } + +type goAway struct { + code http2.ErrCode + debugData []byte + headsUp bool + closeConn bool +} + +func (*goAway) isTransportResponseFrame() bool { return false } + +type ping struct { + ack bool + data [8]byte +} + +func (*ping) isTransportResponseFrame() bool { return true } + +type outFlowControlSizeRequest struct { + resp chan uint32 +} + +func (*outFlowControlSizeRequest) isTransportResponseFrame() bool { return false } + +type outStreamState int + +const ( + active outStreamState = iota + empty + waitingOnStreamQuota +) + +type outStream struct { + id uint32 + state outStreamState + itl *itemList + bytesOutStanding int + wq *writeQuota + + next *outStream + prev *outStream +} + +func (s *outStream) deleteSelf() { + if s.prev != nil { + s.prev.next = s.next + } + if s.next != nil { + s.next.prev = s.prev + } + s.next, s.prev = nil, nil +} + +type outStreamList struct { + // Following are sentinel objects that mark the + // beginning and end of the list. They do not + // contain any item lists. All valid objects are + // inserted in between them. + // This is needed so that an outStream object can + // deleteSelf() in O(1) time without knowing which + // list it belongs to. + head *outStream + tail *outStream +} + +func newOutStreamList() *outStreamList { + head, tail := new(outStream), new(outStream) + head.next = tail + tail.prev = head + return &outStreamList{ + head: head, + tail: tail, + } +} + +func (l *outStreamList) enqueue(s *outStream) { + e := l.tail.prev + e.next = s + s.prev = e + s.next = l.tail + l.tail.prev = s +} + +// remove from the beginning of the list. +func (l *outStreamList) dequeue() *outStream { + b := l.head.next + if b == l.tail { + return nil + } + b.deleteSelf() + return b +} + +// controlBuffer is a way to pass information to loopy. +// Information is passed as specific struct types called control frames. +// A control frame not only represents data, messages or headers to be sent out +// but can also be used to instruct loopy to update its internal state. +// It shouldn't be confused with an HTTP2 frame, although some of the control frames +// like dataFrame and headerFrame do go out on wire as HTTP2 frames. +type controlBuffer struct { + ch chan struct{} + done <-chan struct{} + mu sync.Mutex + consumerWaiting bool + list *itemList + err error + + // transportResponseFrames counts the number of queued items that represent + // the response of an action initiated by the peer. trfChan is created + // when transportResponseFrames >= maxQueuedTransportResponseFrames and is + // closed and nilled when transportResponseFrames drops below the + // threshold. Both fields are protected by mu. + transportResponseFrames int + trfChan atomic.Value // *chan struct{} +} + +func newControlBuffer(done <-chan struct{}) *controlBuffer { + return &controlBuffer{ + ch: make(chan struct{}, 1), + list: &itemList{}, + done: done, + } +} + +// throttle blocks if there are too many incomingSettings/cleanupStreams in the +// controlbuf. +func (c *controlBuffer) throttle() { + ch, _ := c.trfChan.Load().(*chan struct{}) + if ch != nil { + select { + case <-*ch: + case <-c.done: + } + } +} + +func (c *controlBuffer) put(it cbItem) error { + _, err := c.executeAndPut(nil, it) + return err +} + +func (c *controlBuffer) executeAndPut(f func(it interface{}) bool, it cbItem) (bool, error) { + var wakeUp bool + c.mu.Lock() + if c.err != nil { + c.mu.Unlock() + return false, c.err + } + if f != nil { + if !f(it) { // f wasn't successful + c.mu.Unlock() + return false, nil + } + } + if c.consumerWaiting { + wakeUp = true + c.consumerWaiting = false + } + c.list.enqueue(it) + if it.isTransportResponseFrame() { + c.transportResponseFrames++ + if c.transportResponseFrames == maxQueuedTransportResponseFrames { + // We are adding the frame that puts us over the threshold; create + // a throttling channel. + ch := make(chan struct{}) + c.trfChan.Store(&ch) + } + } + c.mu.Unlock() + if wakeUp { + select { + case c.ch <- struct{}{}: + default: + } + } + return true, nil +} + +// Note argument f should never be nil. +func (c *controlBuffer) execute(f func(it interface{}) bool, it interface{}) (bool, error) { + c.mu.Lock() + if c.err != nil { + c.mu.Unlock() + return false, c.err + } + if !f(it) { // f wasn't successful + c.mu.Unlock() + return false, nil + } + c.mu.Unlock() + return true, nil +} + +func (c *controlBuffer) get(block bool) (interface{}, error) { + for { + c.mu.Lock() + if c.err != nil { + c.mu.Unlock() + return nil, c.err + } + if !c.list.isEmpty() { + h := c.list.dequeue().(cbItem) + if h.isTransportResponseFrame() { + if c.transportResponseFrames == maxQueuedTransportResponseFrames { + // We are removing the frame that put us over the + // threshold; close and clear the throttling channel. + ch := c.trfChan.Load().(*chan struct{}) + close(*ch) + c.trfChan.Store((*chan struct{})(nil)) + } + c.transportResponseFrames-- + } + c.mu.Unlock() + return h, nil + } + if !block { + c.mu.Unlock() + return nil, nil + } + c.consumerWaiting = true + c.mu.Unlock() + select { + case <-c.ch: + case <-c.done: + c.finish() + return nil, ErrConnClosing + } + } +} + +func (c *controlBuffer) finish() { + c.mu.Lock() + if c.err != nil { + c.mu.Unlock() + return + } + c.err = ErrConnClosing + // There may be headers for streams in the control buffer. + // These streams need to be cleaned out since the transport + // is still not aware of these yet. + for head := c.list.dequeueAll(); head != nil; head = head.next { + hdr, ok := head.it.(*headerFrame) + if !ok { + continue + } + if hdr.onOrphaned != nil { // It will be nil on the server-side. + hdr.onOrphaned(ErrConnClosing) + } + } + c.mu.Unlock() +} + +type side int + +const ( + clientSide side = iota + serverSide +) + +// Loopy receives frames from the control buffer. +// Each frame is handled individually; most of the work done by loopy goes +// into handling data frames. Loopy maintains a queue of active streams, and each +// stream maintains a queue of data frames; as loopy receives data frames +// it gets added to the queue of the relevant stream. +// Loopy goes over this list of active streams by processing one node every iteration, +// thereby closely resemebling to a round-robin scheduling over all streams. While +// processing a stream, loopy writes out data bytes from this stream capped by the min +// of http2MaxFrameLen, connection-level flow control and stream-level flow control. +type loopyWriter struct { + side side + cbuf *controlBuffer + sendQuota uint32 + oiws uint32 // outbound initial window size. + // estdStreams is map of all established streams that are not cleaned-up yet. + // On client-side, this is all streams whose headers were sent out. + // On server-side, this is all streams whose headers were received. + estdStreams map[uint32]*outStream // Established streams. + // activeStreams is a linked-list of all streams that have data to send and some + // stream-level flow control quota. + // Each of these streams internally have a list of data items(and perhaps trailers + // on the server-side) to be sent out. + activeStreams *outStreamList + framer *framer + hBuf *bytes.Buffer // The buffer for HPACK encoding. + hEnc *hpack.Encoder // HPACK encoder. + bdpEst *bdpEstimator + draining bool + + // Side-specific handlers + ssGoAwayHandler func(*goAway) (bool, error) +} + +func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator) *loopyWriter { + var buf bytes.Buffer + l := &loopyWriter{ + side: s, + cbuf: cbuf, + sendQuota: defaultWindowSize, + oiws: defaultWindowSize, + estdStreams: make(map[uint32]*outStream), + activeStreams: newOutStreamList(), + framer: fr, + hBuf: &buf, + hEnc: hpack.NewEncoder(&buf), + bdpEst: bdpEst, + } + return l +} + +const minBatchSize = 1000 + +// run should be run in a separate goroutine. +// It reads control frames from controlBuf and processes them by: +// 1. Updating loopy's internal state, or/and +// 2. Writing out HTTP2 frames on the wire. +// +// Loopy keeps all active streams with data to send in a linked-list. +// All streams in the activeStreams linked-list must have both: +// 1. Data to send, and +// 2. Stream level flow control quota available. +// +// In each iteration of run loop, other than processing the incoming control +// frame, loopy calls processData, which processes one node from the activeStreams linked-list. +// This results in writing of HTTP2 frames into an underlying write buffer. +// When there's no more control frames to read from controlBuf, loopy flushes the write buffer. +// As an optimization, to increase the batch size for each flush, loopy yields the processor, once +// if the batch size is too low to give stream goroutines a chance to fill it up. +func (l *loopyWriter) run() (err error) { + defer func() { + if err == ErrConnClosing { + // Don't log ErrConnClosing as error since it happens + // 1. When the connection is closed by some other known issue. + // 2. User closed the connection. + // 3. A graceful close of connection. + infof("transport: loopyWriter.run returning. %v", err) + err = nil + } + }() + for { + it, err := l.cbuf.get(true) + if err != nil { + return err + } + if err = l.handle(it); err != nil { + return err + } + if _, err = l.processData(); err != nil { + return err + } + gosched := true + hasdata: + for { + it, err := l.cbuf.get(false) + if err != nil { + return err + } + if it != nil { + if err = l.handle(it); err != nil { + return err + } + if _, err = l.processData(); err != nil { + return err + } + continue hasdata + } + isEmpty, err := l.processData() + if err != nil { + return err + } + if !isEmpty { + continue hasdata + } + if gosched { + gosched = false + if l.framer.writer.offset < minBatchSize { + runtime.Gosched() + continue hasdata + } + } + l.framer.writer.Flush() + break hasdata + + } + } +} + +func (l *loopyWriter) outgoingWindowUpdateHandler(w *outgoingWindowUpdate) error { + return l.framer.fr.WriteWindowUpdate(w.streamID, w.increment) +} + +func (l *loopyWriter) incomingWindowUpdateHandler(w *incomingWindowUpdate) error { + // Otherwise update the quota. + if w.streamID == 0 { + l.sendQuota += w.increment + return nil + } + // Find the stream and update it. + if str, ok := l.estdStreams[w.streamID]; ok { + str.bytesOutStanding -= int(w.increment) + if strQuota := int(l.oiws) - str.bytesOutStanding; strQuota > 0 && str.state == waitingOnStreamQuota { + str.state = active + l.activeStreams.enqueue(str) + return nil + } + } + return nil +} + +func (l *loopyWriter) outgoingSettingsHandler(s *outgoingSettings) error { + return l.framer.fr.WriteSettings(s.ss...) +} + +func (l *loopyWriter) incomingSettingsHandler(s *incomingSettings) error { + if err := l.applySettings(s.ss); err != nil { + return err + } + return l.framer.fr.WriteSettingsAck() +} + +func (l *loopyWriter) registerStreamHandler(h *registerStream) error { + str := &outStream{ + id: h.streamID, + state: empty, + itl: &itemList{}, + wq: h.wq, + } + l.estdStreams[h.streamID] = str + return nil +} + +func (l *loopyWriter) headerHandler(h *headerFrame) error { + if l.side == serverSide { + str, ok := l.estdStreams[h.streamID] + if !ok { + warningf("transport: loopy doesn't recognize the stream: %d", h.streamID) + return nil + } + // Case 1.A: Server is responding back with headers. + if !h.endStream { + return l.writeHeader(h.streamID, h.endStream, h.hf, h.onWrite) + } + // else: Case 1.B: Server wants to close stream. + + if str.state != empty { // either active or waiting on stream quota. + // add it str's list of items. + str.itl.enqueue(h) + return nil + } + if err := l.writeHeader(h.streamID, h.endStream, h.hf, h.onWrite); err != nil { + return err + } + return l.cleanupStreamHandler(h.cleanup) + } + // Case 2: Client wants to originate stream. + str := &outStream{ + id: h.streamID, + state: empty, + itl: &itemList{}, + wq: h.wq, + } + str.itl.enqueue(h) + return l.originateStream(str) +} + +func (l *loopyWriter) originateStream(str *outStream) error { + hdr := str.itl.dequeue().(*headerFrame) + if err := hdr.initStream(str.id); err != nil { + if err == ErrConnClosing { + return err + } + // Other errors(errStreamDrain) need not close transport. + return nil + } + if err := l.writeHeader(str.id, hdr.endStream, hdr.hf, hdr.onWrite); err != nil { + return err + } + l.estdStreams[str.id] = str + return nil +} + +func (l *loopyWriter) writeHeader(streamID uint32, endStream bool, hf []hpack.HeaderField, onWrite func()) error { + if onWrite != nil { + onWrite() + } + l.hBuf.Reset() + for _, f := range hf { + if err := l.hEnc.WriteField(f); err != nil { + warningf("transport: loopyWriter.writeHeader encountered error while encoding headers:", err) + } + } + var ( + err error + endHeaders, first bool + ) + first = true + for !endHeaders { + size := l.hBuf.Len() + if size > http2MaxFrameLen { + size = http2MaxFrameLen + } else { + endHeaders = true + } + if first { + first = false + err = l.framer.fr.WriteHeaders(http2.HeadersFrameParam{ + StreamID: streamID, + BlockFragment: l.hBuf.Next(size), + EndStream: endStream, + EndHeaders: endHeaders, + }) + } else { + err = l.framer.fr.WriteContinuation( + streamID, + endHeaders, + l.hBuf.Next(size), + ) + } + if err != nil { + return err + } + } + return nil +} + +func (l *loopyWriter) preprocessData(df *dataFrame) error { + str, ok := l.estdStreams[df.streamID] + if !ok { + return nil + } + // If we got data for a stream it means that + // stream was originated and the headers were sent out. + str.itl.enqueue(df) + if str.state == empty { + str.state = active + l.activeStreams.enqueue(str) + } + return nil +} + +func (l *loopyWriter) pingHandler(p *ping) error { + if !p.ack { + l.bdpEst.timesnap(p.data) + } + return l.framer.fr.WritePing(p.ack, p.data) + +} + +func (l *loopyWriter) outFlowControlSizeRequestHandler(o *outFlowControlSizeRequest) error { + o.resp <- l.sendQuota + return nil +} + +func (l *loopyWriter) cleanupStreamHandler(c *cleanupStream) error { + c.onWrite() + if str, ok := l.estdStreams[c.streamID]; ok { + // On the server side it could be a trailers-only response or + // a RST_STREAM before stream initialization thus the stream might + // not be established yet. + delete(l.estdStreams, c.streamID) + str.deleteSelf() + } + if c.rst { // If RST_STREAM needs to be sent. + if err := l.framer.fr.WriteRSTStream(c.streamID, c.rstCode); err != nil { + return err + } + } + if l.side == clientSide && l.draining && len(l.estdStreams) == 0 { + return ErrConnClosing + } + return nil +} + +func (l *loopyWriter) incomingGoAwayHandler(*incomingGoAway) error { + if l.side == clientSide { + l.draining = true + if len(l.estdStreams) == 0 { + return ErrConnClosing + } + } + return nil +} + +func (l *loopyWriter) goAwayHandler(g *goAway) error { + // Handling of outgoing GoAway is very specific to side. + if l.ssGoAwayHandler != nil { + draining, err := l.ssGoAwayHandler(g) + if err != nil { + return err + } + l.draining = draining + } + return nil +} + +func (l *loopyWriter) handle(i interface{}) error { + switch i := i.(type) { + case *incomingWindowUpdate: + return l.incomingWindowUpdateHandler(i) + case *outgoingWindowUpdate: + return l.outgoingWindowUpdateHandler(i) + case *incomingSettings: + return l.incomingSettingsHandler(i) + case *outgoingSettings: + return l.outgoingSettingsHandler(i) + case *headerFrame: + return l.headerHandler(i) + case *registerStream: + return l.registerStreamHandler(i) + case *cleanupStream: + return l.cleanupStreamHandler(i) + case *incomingGoAway: + return l.incomingGoAwayHandler(i) + case *dataFrame: + return l.preprocessData(i) + case *ping: + return l.pingHandler(i) + case *goAway: + return l.goAwayHandler(i) + case *outFlowControlSizeRequest: + return l.outFlowControlSizeRequestHandler(i) + default: + return fmt.Errorf("transport: unknown control message type %T", i) + } +} + +func (l *loopyWriter) applySettings(ss []http2.Setting) error { + for _, s := range ss { + switch s.ID { + case http2.SettingInitialWindowSize: + o := l.oiws + l.oiws = s.Val + if o < l.oiws { + // If the new limit is greater make all depleted streams active. + for _, stream := range l.estdStreams { + if stream.state == waitingOnStreamQuota { + stream.state = active + l.activeStreams.enqueue(stream) + } + } + } + case http2.SettingHeaderTableSize: + updateHeaderTblSize(l.hEnc, s.Val) + } + } + return nil +} + +// processData removes the first stream from active streams, writes out at most 16KB +// of its data and then puts it at the end of activeStreams if there's still more data +// to be sent and stream has some stream-level flow control. +func (l *loopyWriter) processData() (bool, error) { + if l.sendQuota == 0 { + return true, nil + } + str := l.activeStreams.dequeue() // Remove the first stream. + if str == nil { + return true, nil + } + dataItem := str.itl.peek().(*dataFrame) // Peek at the first data item this stream. + // A data item is represented by a dataFrame, since it later translates into + // multiple HTTP2 data frames. + // Every dataFrame has two buffers; h that keeps grpc-message header and d that is acutal data. + // As an optimization to keep wire traffic low, data from d is copied to h to make as big as the + // maximum possilbe HTTP2 frame size. + + if len(dataItem.h) == 0 && len(dataItem.d) == 0 { // Empty data frame + // Client sends out empty data frame with endStream = true + if err := l.framer.fr.WriteData(dataItem.streamID, dataItem.endStream, nil); err != nil { + return false, err + } + str.itl.dequeue() // remove the empty data item from stream + if str.itl.isEmpty() { + str.state = empty + } else if trailer, ok := str.itl.peek().(*headerFrame); ok { // the next item is trailers. + if err := l.writeHeader(trailer.streamID, trailer.endStream, trailer.hf, trailer.onWrite); err != nil { + return false, err + } + if err := l.cleanupStreamHandler(trailer.cleanup); err != nil { + return false, nil + } + } else { + l.activeStreams.enqueue(str) + } + return false, nil + } + var ( + idx int + buf []byte + ) + if len(dataItem.h) != 0 { // data header has not been written out yet. + buf = dataItem.h + } else { + idx = 1 + buf = dataItem.d + } + size := http2MaxFrameLen + if len(buf) < size { + size = len(buf) + } + if strQuota := int(l.oiws) - str.bytesOutStanding; strQuota <= 0 { // stream-level flow control. + str.state = waitingOnStreamQuota + return false, nil + } else if strQuota < size { + size = strQuota + } + + if l.sendQuota < uint32(size) { // connection-level flow control. + size = int(l.sendQuota) + } + // Now that outgoing flow controls are checked we can replenish str's write quota + str.wq.replenish(size) + var endStream bool + // If this is the last data message on this stream and all of it can be written in this iteration. + if dataItem.endStream && size == len(buf) { + // buf contains either data or it contains header but data is empty. + if idx == 1 || len(dataItem.d) == 0 { + endStream = true + } + } + if dataItem.onEachWrite != nil { + dataItem.onEachWrite() + } + if err := l.framer.fr.WriteData(dataItem.streamID, endStream, buf[:size]); err != nil { + return false, err + } + buf = buf[size:] + str.bytesOutStanding += size + l.sendQuota -= uint32(size) + if idx == 0 { + dataItem.h = buf + } else { + dataItem.d = buf + } + + if len(dataItem.h) == 0 && len(dataItem.d) == 0 { // All the data from that message was written out. + str.itl.dequeue() + } + if str.itl.isEmpty() { + str.state = empty + } else if trailer, ok := str.itl.peek().(*headerFrame); ok { // The next item is trailers. + if err := l.writeHeader(trailer.streamID, trailer.endStream, trailer.hf, trailer.onWrite); err != nil { + return false, err + } + if err := l.cleanupStreamHandler(trailer.cleanup); err != nil { + return false, err + } + } else if int(l.oiws)-str.bytesOutStanding <= 0 { // Ran out of stream quota. + str.state = waitingOnStreamQuota + } else { // Otherwise add it back to the list of active streams. + l.activeStreams.enqueue(str) + } + return false, nil +} diff --git a/vendor/google.golang.org/grpc/internal/transport/defaults.go b/vendor/google.golang.org/grpc/internal/transport/defaults.go new file mode 100644 index 00000000..9fa306b2 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/defaults.go @@ -0,0 +1,49 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "math" + "time" +) + +const ( + // The default value of flow control window size in HTTP2 spec. + defaultWindowSize = 65535 + // The initial window size for flow control. + initialWindowSize = defaultWindowSize // for an RPC + infinity = time.Duration(math.MaxInt64) + defaultClientKeepaliveTime = infinity + defaultClientKeepaliveTimeout = 20 * time.Second + defaultMaxStreamsClient = 100 + defaultMaxConnectionIdle = infinity + defaultMaxConnectionAge = infinity + defaultMaxConnectionAgeGrace = infinity + defaultServerKeepaliveTime = 2 * time.Hour + defaultServerKeepaliveTimeout = 20 * time.Second + defaultKeepalivePolicyMinTime = 5 * time.Minute + // max window limit set by HTTP2 Specs. + maxWindowSize = math.MaxInt32 + // defaultWriteQuota is the default value for number of data + // bytes that each stream can schedule before some of it being + // flushed out. + defaultWriteQuota = 64 * 1024 + defaultClientMaxHeaderListSize = uint32(16 << 20) + defaultServerMaxHeaderListSize = uint32(16 << 20) +) diff --git a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go new file mode 100644 index 00000000..f262edd8 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go @@ -0,0 +1,217 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "fmt" + "math" + "sync" + "sync/atomic" +) + +// writeQuota is a soft limit on the amount of data a stream can +// schedule before some of it is written out. +type writeQuota struct { + quota int32 + // get waits on read from when quota goes less than or equal to zero. + // replenish writes on it when quota goes positive again. + ch chan struct{} + // done is triggered in error case. + done <-chan struct{} + // replenish is called by loopyWriter to give quota back to. + // It is implemented as a field so that it can be updated + // by tests. + replenish func(n int) +} + +func newWriteQuota(sz int32, done <-chan struct{}) *writeQuota { + w := &writeQuota{ + quota: sz, + ch: make(chan struct{}, 1), + done: done, + } + w.replenish = w.realReplenish + return w +} + +func (w *writeQuota) get(sz int32) error { + for { + if atomic.LoadInt32(&w.quota) > 0 { + atomic.AddInt32(&w.quota, -sz) + return nil + } + select { + case <-w.ch: + continue + case <-w.done: + return errStreamDone + } + } +} + +func (w *writeQuota) realReplenish(n int) { + sz := int32(n) + a := atomic.AddInt32(&w.quota, sz) + b := a - sz + if b <= 0 && a > 0 { + select { + case w.ch <- struct{}{}: + default: + } + } +} + +type trInFlow struct { + limit uint32 + unacked uint32 + effectiveWindowSize uint32 +} + +func (f *trInFlow) newLimit(n uint32) uint32 { + d := n - f.limit + f.limit = n + f.updateEffectiveWindowSize() + return d +} + +func (f *trInFlow) onData(n uint32) uint32 { + f.unacked += n + if f.unacked >= f.limit/4 { + w := f.unacked + f.unacked = 0 + f.updateEffectiveWindowSize() + return w + } + f.updateEffectiveWindowSize() + return 0 +} + +func (f *trInFlow) reset() uint32 { + w := f.unacked + f.unacked = 0 + f.updateEffectiveWindowSize() + return w +} + +func (f *trInFlow) updateEffectiveWindowSize() { + atomic.StoreUint32(&f.effectiveWindowSize, f.limit-f.unacked) +} + +func (f *trInFlow) getSize() uint32 { + return atomic.LoadUint32(&f.effectiveWindowSize) +} + +// TODO(mmukhi): Simplify this code. +// inFlow deals with inbound flow control +type inFlow struct { + mu sync.Mutex + // The inbound flow control limit for pending data. + limit uint32 + // pendingData is the overall data which have been received but not been + // consumed by applications. + pendingData uint32 + // The amount of data the application has consumed but grpc has not sent + // window update for them. Used to reduce window update frequency. + pendingUpdate uint32 + // delta is the extra window update given by receiver when an application + // is reading data bigger in size than the inFlow limit. + delta uint32 +} + +// newLimit updates the inflow window to a new value n. +// It assumes that n is always greater than the old limit. +func (f *inFlow) newLimit(n uint32) uint32 { + f.mu.Lock() + d := n - f.limit + f.limit = n + f.mu.Unlock() + return d +} + +func (f *inFlow) maybeAdjust(n uint32) uint32 { + if n > uint32(math.MaxInt32) { + n = uint32(math.MaxInt32) + } + f.mu.Lock() + defer f.mu.Unlock() + // estSenderQuota is the receiver's view of the maximum number of bytes the sender + // can send without a window update. + estSenderQuota := int32(f.limit - (f.pendingData + f.pendingUpdate)) + // estUntransmittedData is the maximum number of bytes the sends might not have put + // on the wire yet. A value of 0 or less means that we have already received all or + // more bytes than the application is requesting to read. + estUntransmittedData := int32(n - f.pendingData) // Casting into int32 since it could be negative. + // This implies that unless we send a window update, the sender won't be able to send all the bytes + // for this message. Therefore we must send an update over the limit since there's an active read + // request from the application. + if estUntransmittedData > estSenderQuota { + // Sender's window shouldn't go more than 2^31 - 1 as specified in the HTTP spec. + if f.limit+n > maxWindowSize { + f.delta = maxWindowSize - f.limit + } else { + // Send a window update for the whole message and not just the difference between + // estUntransmittedData and estSenderQuota. This will be helpful in case the message + // is padded; We will fallback on the current available window(at least a 1/4th of the limit). + f.delta = n + } + return f.delta + } + return 0 +} + +// onData is invoked when some data frame is received. It updates pendingData. +func (f *inFlow) onData(n uint32) error { + f.mu.Lock() + f.pendingData += n + if f.pendingData+f.pendingUpdate > f.limit+f.delta { + limit := f.limit + rcvd := f.pendingData + f.pendingUpdate + f.mu.Unlock() + return fmt.Errorf("received %d-bytes data exceeding the limit %d bytes", rcvd, limit) + } + f.mu.Unlock() + return nil +} + +// onRead is invoked when the application reads the data. It returns the window size +// to be sent to the peer. +func (f *inFlow) onRead(n uint32) uint32 { + f.mu.Lock() + if f.pendingData == 0 { + f.mu.Unlock() + return 0 + } + f.pendingData -= n + if n > f.delta { + n -= f.delta + f.delta = 0 + } else { + f.delta -= n + n = 0 + } + f.pendingUpdate += n + if f.pendingUpdate >= f.limit/4 { + wu := f.pendingUpdate + f.pendingUpdate = 0 + f.mu.Unlock() + return wu + } + f.mu.Unlock() + return 0 +} diff --git a/vendor/google.golang.org/grpc/internal/transport/handler_server.go b/vendor/google.golang.org/grpc/internal/transport/handler_server.go new file mode 100644 index 00000000..fc44e976 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/handler_server.go @@ -0,0 +1,462 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// This file is the implementation of a gRPC server using HTTP/2 which +// uses the standard Go http2 Server implementation (via the +// http.Handler interface), rather than speaking low-level HTTP/2 +// frames itself. It is the implementation of *grpc.Server.ServeHTTP. + +package transport + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "net" + "net/http" + "strings" + "sync" + "time" + + "github.com/golang/protobuf/proto" + "golang.org/x/net/http2" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" +) + +// NewServerHandlerTransport returns a ServerTransport handling gRPC +// from inside an http.Handler. It requires that the http Server +// supports HTTP/2. +func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats stats.Handler) (ServerTransport, error) { + if r.ProtoMajor != 2 { + return nil, errors.New("gRPC requires HTTP/2") + } + if r.Method != "POST" { + return nil, errors.New("invalid gRPC request method") + } + contentType := r.Header.Get("Content-Type") + // TODO: do we assume contentType is lowercase? we did before + contentSubtype, validContentType := contentSubtype(contentType) + if !validContentType { + return nil, errors.New("invalid gRPC request content-type") + } + if _, ok := w.(http.Flusher); !ok { + return nil, errors.New("gRPC requires a ResponseWriter supporting http.Flusher") + } + + st := &serverHandlerTransport{ + rw: w, + req: r, + closedCh: make(chan struct{}), + writes: make(chan func()), + contentType: contentType, + contentSubtype: contentSubtype, + stats: stats, + } + + if v := r.Header.Get("grpc-timeout"); v != "" { + to, err := decodeTimeout(v) + if err != nil { + return nil, status.Errorf(codes.Internal, "malformed time-out: %v", err) + } + st.timeoutSet = true + st.timeout = to + } + + metakv := []string{"content-type", contentType} + if r.Host != "" { + metakv = append(metakv, ":authority", r.Host) + } + for k, vv := range r.Header { + k = strings.ToLower(k) + if isReservedHeader(k) && !isWhitelistedHeader(k) { + continue + } + for _, v := range vv { + v, err := decodeMetadataHeader(k, v) + if err != nil { + return nil, status.Errorf(codes.Internal, "malformed binary metadata: %v", err) + } + metakv = append(metakv, k, v) + } + } + st.headerMD = metadata.Pairs(metakv...) + + return st, nil +} + +// serverHandlerTransport is an implementation of ServerTransport +// which replies to exactly one gRPC request (exactly one HTTP request), +// using the net/http.Handler interface. This http.Handler is guaranteed +// at this point to be speaking over HTTP/2, so it's able to speak valid +// gRPC. +type serverHandlerTransport struct { + rw http.ResponseWriter + req *http.Request + timeoutSet bool + timeout time.Duration + + headerMD metadata.MD + + closeOnce sync.Once + closedCh chan struct{} // closed on Close + + // writes is a channel of code to run serialized in the + // ServeHTTP (HandleStreams) goroutine. The channel is closed + // when WriteStatus is called. + writes chan func() + + // block concurrent WriteStatus calls + // e.g. grpc/(*serverStream).SendMsg/RecvMsg + writeStatusMu sync.Mutex + + // we just mirror the request content-type + contentType string + // we store both contentType and contentSubtype so we don't keep recreating them + // TODO make sure this is consistent across handler_server and http2_server + contentSubtype string + + stats stats.Handler +} + +func (ht *serverHandlerTransport) Close() error { + ht.closeOnce.Do(ht.closeCloseChanOnce) + return nil +} + +func (ht *serverHandlerTransport) closeCloseChanOnce() { close(ht.closedCh) } + +func (ht *serverHandlerTransport) RemoteAddr() net.Addr { return strAddr(ht.req.RemoteAddr) } + +// strAddr is a net.Addr backed by either a TCP "ip:port" string, or +// the empty string if unknown. +type strAddr string + +func (a strAddr) Network() string { + if a != "" { + // Per the documentation on net/http.Request.RemoteAddr, if this is + // set, it's set to the IP:port of the peer (hence, TCP): + // https://golang.org/pkg/net/http/#Request + // + // If we want to support Unix sockets later, we can + // add our own grpc-specific convention within the + // grpc codebase to set RemoteAddr to a different + // format, or probably better: we can attach it to the + // context and use that from serverHandlerTransport.RemoteAddr. + return "tcp" + } + return "" +} + +func (a strAddr) String() string { return string(a) } + +// do runs fn in the ServeHTTP goroutine. +func (ht *serverHandlerTransport) do(fn func()) error { + select { + case <-ht.closedCh: + return ErrConnClosing + case ht.writes <- fn: + return nil + } +} + +func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) error { + ht.writeStatusMu.Lock() + defer ht.writeStatusMu.Unlock() + + headersWritten := s.updateHeaderSent() + err := ht.do(func() { + if !headersWritten { + ht.writePendingHeaders(s) + } + + // And flush, in case no header or body has been sent yet. + // This forces a separation of headers and trailers if this is the + // first call (for example, in end2end tests's TestNoService). + ht.rw.(http.Flusher).Flush() + + h := ht.rw.Header() + h.Set("Grpc-Status", fmt.Sprintf("%d", st.Code())) + if m := st.Message(); m != "" { + h.Set("Grpc-Message", encodeGrpcMessage(m)) + } + + if p := st.Proto(); p != nil && len(p.Details) > 0 { + stBytes, err := proto.Marshal(p) + if err != nil { + // TODO: return error instead, when callers are able to handle it. + panic(err) + } + + h.Set("Grpc-Status-Details-Bin", encodeBinHeader(stBytes)) + } + + if md := s.Trailer(); len(md) > 0 { + for k, vv := range md { + // Clients don't tolerate reading restricted headers after some non restricted ones were sent. + if isReservedHeader(k) { + continue + } + for _, v := range vv { + // http2 ResponseWriter mechanism to send undeclared Trailers after + // the headers have possibly been written. + h.Add(http2.TrailerPrefix+k, encodeMetadataHeader(k, v)) + } + } + } + }) + + if err == nil { // transport has not been closed + if ht.stats != nil { + // Note: The trailer fields are compressed with hpack after this call returns. + // No WireLength field is set here. + ht.stats.HandleRPC(s.Context(), &stats.OutTrailer{ + Trailer: s.trailer.Copy(), + }) + } + } + ht.Close() + return err +} + +// writePendingHeaders sets common and custom headers on the first +// write call (Write, WriteHeader, or WriteStatus) +func (ht *serverHandlerTransport) writePendingHeaders(s *Stream) { + ht.writeCommonHeaders(s) + ht.writeCustomHeaders(s) +} + +// writeCommonHeaders sets common headers on the first write +// call (Write, WriteHeader, or WriteStatus). +func (ht *serverHandlerTransport) writeCommonHeaders(s *Stream) { + h := ht.rw.Header() + h["Date"] = nil // suppress Date to make tests happy; TODO: restore + h.Set("Content-Type", ht.contentType) + + // Predeclare trailers we'll set later in WriteStatus (after the body). + // This is a SHOULD in the HTTP RFC, and the way you add (known) + // Trailers per the net/http.ResponseWriter contract. + // See https://golang.org/pkg/net/http/#ResponseWriter + // and https://golang.org/pkg/net/http/#example_ResponseWriter_trailers + h.Add("Trailer", "Grpc-Status") + h.Add("Trailer", "Grpc-Message") + h.Add("Trailer", "Grpc-Status-Details-Bin") + + if s.sendCompress != "" { + h.Set("Grpc-Encoding", s.sendCompress) + } +} + +// writeCustomHeaders sets custom headers set on the stream via SetHeader +// on the first write call (Write, WriteHeader, or WriteStatus). +func (ht *serverHandlerTransport) writeCustomHeaders(s *Stream) { + h := ht.rw.Header() + + s.hdrMu.Lock() + for k, vv := range s.header { + if isReservedHeader(k) { + continue + } + for _, v := range vv { + h.Add(k, encodeMetadataHeader(k, v)) + } + } + + s.hdrMu.Unlock() +} + +func (ht *serverHandlerTransport) Write(s *Stream, hdr []byte, data []byte, opts *Options) error { + headersWritten := s.updateHeaderSent() + return ht.do(func() { + if !headersWritten { + ht.writePendingHeaders(s) + } + ht.rw.Write(hdr) + ht.rw.Write(data) + ht.rw.(http.Flusher).Flush() + }) +} + +func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { + if err := s.SetHeader(md); err != nil { + return err + } + + headersWritten := s.updateHeaderSent() + err := ht.do(func() { + if !headersWritten { + ht.writePendingHeaders(s) + } + + ht.rw.WriteHeader(200) + ht.rw.(http.Flusher).Flush() + }) + + if err == nil { + if ht.stats != nil { + // Note: The header fields are compressed with hpack after this call returns. + // No WireLength field is set here. + ht.stats.HandleRPC(s.Context(), &stats.OutHeader{ + Header: md.Copy(), + Compression: s.sendCompress, + }) + } + } + return err +} + +func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream), traceCtx func(context.Context, string) context.Context) { + // With this transport type there will be exactly 1 stream: this HTTP request. + + ctx := ht.req.Context() + var cancel context.CancelFunc + if ht.timeoutSet { + ctx, cancel = context.WithTimeout(ctx, ht.timeout) + } else { + ctx, cancel = context.WithCancel(ctx) + } + + // requestOver is closed when the status has been written via WriteStatus. + requestOver := make(chan struct{}) + go func() { + select { + case <-requestOver: + case <-ht.closedCh: + case <-ht.req.Context().Done(): + } + cancel() + ht.Close() + }() + + req := ht.req + + s := &Stream{ + id: 0, // irrelevant + requestRead: func(int) {}, + cancel: cancel, + buf: newRecvBuffer(), + st: ht, + method: req.URL.Path, + recvCompress: req.Header.Get("grpc-encoding"), + contentSubtype: ht.contentSubtype, + } + pr := &peer.Peer{ + Addr: ht.RemoteAddr(), + } + if req.TLS != nil { + pr.AuthInfo = credentials.TLSInfo{State: *req.TLS, CommonAuthInfo: credentials.CommonAuthInfo{SecurityLevel: credentials.PrivacyAndIntegrity}} + } + ctx = metadata.NewIncomingContext(ctx, ht.headerMD) + s.ctx = peer.NewContext(ctx, pr) + if ht.stats != nil { + s.ctx = ht.stats.TagRPC(s.ctx, &stats.RPCTagInfo{FullMethodName: s.method}) + inHeader := &stats.InHeader{ + FullMethod: s.method, + RemoteAddr: ht.RemoteAddr(), + Compression: s.recvCompress, + } + ht.stats.HandleRPC(s.ctx, inHeader) + } + s.trReader = &transportReader{ + reader: &recvBufferReader{ctx: s.ctx, ctxDone: s.ctx.Done(), recv: s.buf, freeBuffer: func(*bytes.Buffer) {}}, + windowHandler: func(int) {}, + } + + // readerDone is closed when the Body.Read-ing goroutine exits. + readerDone := make(chan struct{}) + go func() { + defer close(readerDone) + + // TODO: minimize garbage, optimize recvBuffer code/ownership + const readSize = 8196 + for buf := make([]byte, readSize); ; { + n, err := req.Body.Read(buf) + if n > 0 { + s.buf.put(recvMsg{buffer: bytes.NewBuffer(buf[:n:n])}) + buf = buf[n:] + } + if err != nil { + s.buf.put(recvMsg{err: mapRecvMsgError(err)}) + return + } + if len(buf) == 0 { + buf = make([]byte, readSize) + } + } + }() + + // startStream is provided by the *grpc.Server's serveStreams. + // It starts a goroutine serving s and exits immediately. + // The goroutine that is started is the one that then calls + // into ht, calling WriteHeader, Write, WriteStatus, Close, etc. + startStream(s) + + ht.runStream() + close(requestOver) + + // Wait for reading goroutine to finish. + req.Body.Close() + <-readerDone +} + +func (ht *serverHandlerTransport) runStream() { + for { + select { + case fn := <-ht.writes: + fn() + case <-ht.closedCh: + return + } + } +} + +func (ht *serverHandlerTransport) IncrMsgSent() {} + +func (ht *serverHandlerTransport) IncrMsgRecv() {} + +func (ht *serverHandlerTransport) Drain() { + panic("Drain() is not implemented") +} + +// mapRecvMsgError returns the non-nil err into the appropriate +// error value as expected by callers of *grpc.parser.recvMsg. +// In particular, in can only be: +// * io.EOF +// * io.ErrUnexpectedEOF +// * of type transport.ConnectionError +// * an error from the status package +func mapRecvMsgError(err error) error { + if err == io.EOF || err == io.ErrUnexpectedEOF { + return err + } + if se, ok := err.(http2.StreamError); ok { + if code, ok := http2ErrConvTab[se.Code]; ok { + return status.Error(code, se.Error()) + } + } + if strings.Contains(err.Error(), "body closed by handler") { + return status.Error(codes.Canceled, err.Error()) + } + return connectionErrorf(true, err, err.Error()) +} diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/vendor/google.golang.org/grpc/internal/transport/http2_client.go new file mode 100644 index 00000000..1cc586f7 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/http2_client.go @@ -0,0 +1,1462 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "context" + "fmt" + "io" + "math" + "net" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + + "golang.org/x/net/http2" + "golang.org/x/net/http2/hpack" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/internal" + "google.golang.org/grpc/internal/channelz" + "google.golang.org/grpc/internal/syscall" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" +) + +// clientConnectionCounter counts the number of connections a client has +// initiated (equal to the number of http2Clients created). Must be accessed +// atomically. +var clientConnectionCounter uint64 + +// http2Client implements the ClientTransport interface with HTTP2. +type http2Client struct { + lastRead int64 // Keep this field 64-bit aligned. Accessed atomically. + ctx context.Context + cancel context.CancelFunc + ctxDone <-chan struct{} // Cache the ctx.Done() chan. + userAgent string + md interface{} + conn net.Conn // underlying communication channel + loopy *loopyWriter + remoteAddr net.Addr + localAddr net.Addr + authInfo credentials.AuthInfo // auth info about the connection + + readerDone chan struct{} // sync point to enable testing. + writerDone chan struct{} // sync point to enable testing. + // goAway is closed to notify the upper layer (i.e., addrConn.transportMonitor) + // that the server sent GoAway on this transport. + goAway chan struct{} + + framer *framer + // controlBuf delivers all the control related tasks (e.g., window + // updates, reset streams, and various settings) to the controller. + controlBuf *controlBuffer + fc *trInFlow + // The scheme used: https if TLS is on, http otherwise. + scheme string + + isSecure bool + + perRPCCreds []credentials.PerRPCCredentials + + kp keepalive.ClientParameters + keepaliveEnabled bool + + statsHandler stats.Handler + + initialWindowSize int32 + + // configured by peer through SETTINGS_MAX_HEADER_LIST_SIZE + maxSendHeaderListSize *uint32 + + bdpEst *bdpEstimator + // onPrefaceReceipt is a callback that client transport calls upon + // receiving server preface to signal that a succefull HTTP2 + // connection was established. + onPrefaceReceipt func() + + maxConcurrentStreams uint32 + streamQuota int64 + streamsQuotaAvailable chan struct{} + waitingStreams uint32 + nextID uint32 + + mu sync.Mutex // guard the following variables + state transportState + activeStreams map[uint32]*Stream + // prevGoAway ID records the Last-Stream-ID in the previous GOAway frame. + prevGoAwayID uint32 + // goAwayReason records the http2.ErrCode and debug data received with the + // GoAway frame. + goAwayReason GoAwayReason + // A condition variable used to signal when the keepalive goroutine should + // go dormant. The condition for dormancy is based on the number of active + // streams and the `PermitWithoutStream` keepalive client parameter. And + // since the number of active streams is guarded by the above mutex, we use + // the same for this condition variable as well. + kpDormancyCond *sync.Cond + // A boolean to track whether the keepalive goroutine is dormant or not. + // This is checked before attempting to signal the above condition + // variable. + kpDormant bool + + // Fields below are for channelz metric collection. + channelzID int64 // channelz unique identification number + czData *channelzData + + onGoAway func(GoAwayReason) + onClose func() + + bufferPool *bufferPool + + connectionID uint64 +} + +func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error), addr string) (net.Conn, error) { + if fn != nil { + return fn(ctx, addr) + } + return (&net.Dialer{}).DialContext(ctx, "tcp", addr) +} + +func isTemporary(err error) bool { + switch err := err.(type) { + case interface { + Temporary() bool + }: + return err.Temporary() + case interface { + Timeout() bool + }: + // Timeouts may be resolved upon retry, and are thus treated as + // temporary. + return err.Timeout() + } + return true +} + +// newHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 +// and starts to receive messages on it. Non-nil error returns if construction +// fails. +func newHTTP2Client(connectCtx, ctx context.Context, addr TargetInfo, opts ConnectOptions, onPrefaceReceipt func(), onGoAway func(GoAwayReason), onClose func()) (_ *http2Client, err error) { + scheme := "http" + ctx, cancel := context.WithCancel(ctx) + defer func() { + if err != nil { + cancel() + } + }() + + conn, err := dial(connectCtx, opts.Dialer, addr.Addr) + if err != nil { + if opts.FailOnNonTempDialError { + return nil, connectionErrorf(isTemporary(err), err, "transport: error while dialing: %v", err) + } + return nil, connectionErrorf(true, err, "transport: Error while dialing %v", err) + } + // Any further errors will close the underlying connection + defer func(conn net.Conn) { + if err != nil { + conn.Close() + } + }(conn) + kp := opts.KeepaliveParams + // Validate keepalive parameters. + if kp.Time == 0 { + kp.Time = defaultClientKeepaliveTime + } + if kp.Timeout == 0 { + kp.Timeout = defaultClientKeepaliveTimeout + } + keepaliveEnabled := false + if kp.Time != infinity { + if err = syscall.SetTCPUserTimeout(conn, kp.Timeout); err != nil { + return nil, connectionErrorf(false, err, "transport: failed to set TCP_USER_TIMEOUT: %v", err) + } + keepaliveEnabled = true + } + var ( + isSecure bool + authInfo credentials.AuthInfo + ) + transportCreds := opts.TransportCredentials + perRPCCreds := opts.PerRPCCredentials + + if b := opts.CredsBundle; b != nil { + if t := b.TransportCredentials(); t != nil { + transportCreds = t + } + if t := b.PerRPCCredentials(); t != nil { + perRPCCreds = append(perRPCCreds, t) + } + } + if transportCreds != nil { + scheme = "https" + conn, authInfo, err = transportCreds.ClientHandshake(connectCtx, addr.Authority, conn) + if err != nil { + return nil, connectionErrorf(isTemporary(err), err, "transport: authentication handshake failed: %v", err) + } + isSecure = true + } + dynamicWindow := true + icwz := int32(initialWindowSize) + if opts.InitialConnWindowSize >= defaultWindowSize { + icwz = opts.InitialConnWindowSize + dynamicWindow = false + } + writeBufSize := opts.WriteBufferSize + readBufSize := opts.ReadBufferSize + maxHeaderListSize := defaultClientMaxHeaderListSize + if opts.MaxHeaderListSize != nil { + maxHeaderListSize = *opts.MaxHeaderListSize + } + t := &http2Client{ + ctx: ctx, + ctxDone: ctx.Done(), // Cache Done chan. + cancel: cancel, + userAgent: opts.UserAgent, + md: addr.Metadata, + conn: conn, + remoteAddr: conn.RemoteAddr(), + localAddr: conn.LocalAddr(), + authInfo: authInfo, + readerDone: make(chan struct{}), + writerDone: make(chan struct{}), + goAway: make(chan struct{}), + framer: newFramer(conn, writeBufSize, readBufSize, maxHeaderListSize), + fc: &trInFlow{limit: uint32(icwz)}, + scheme: scheme, + activeStreams: make(map[uint32]*Stream), + isSecure: isSecure, + perRPCCreds: perRPCCreds, + kp: kp, + statsHandler: opts.StatsHandler, + initialWindowSize: initialWindowSize, + onPrefaceReceipt: onPrefaceReceipt, + nextID: 1, + maxConcurrentStreams: defaultMaxStreamsClient, + streamQuota: defaultMaxStreamsClient, + streamsQuotaAvailable: make(chan struct{}, 1), + czData: new(channelzData), + onGoAway: onGoAway, + onClose: onClose, + keepaliveEnabled: keepaliveEnabled, + bufferPool: newBufferPool(), + } + t.controlBuf = newControlBuffer(t.ctxDone) + if opts.InitialWindowSize >= defaultWindowSize { + t.initialWindowSize = opts.InitialWindowSize + dynamicWindow = false + } + if dynamicWindow { + t.bdpEst = &bdpEstimator{ + bdp: initialWindowSize, + updateFlowControl: t.updateFlowControl, + } + } + if t.statsHandler != nil { + t.ctx = t.statsHandler.TagConn(t.ctx, &stats.ConnTagInfo{ + RemoteAddr: t.remoteAddr, + LocalAddr: t.localAddr, + }) + connBegin := &stats.ConnBegin{ + Client: true, + } + t.statsHandler.HandleConn(t.ctx, connBegin) + } + if channelz.IsOn() { + t.channelzID = channelz.RegisterNormalSocket(t, opts.ChannelzParentID, fmt.Sprintf("%s -> %s", t.localAddr, t.remoteAddr)) + } + if t.keepaliveEnabled { + t.kpDormancyCond = sync.NewCond(&t.mu) + go t.keepalive() + } + // Start the reader goroutine for incoming message. Each transport has + // a dedicated goroutine which reads HTTP2 frame from network. Then it + // dispatches the frame to the corresponding stream entity. + go t.reader() + + // Send connection preface to server. + n, err := t.conn.Write(clientPreface) + if err != nil { + t.Close() + return nil, connectionErrorf(true, err, "transport: failed to write client preface: %v", err) + } + if n != len(clientPreface) { + t.Close() + return nil, connectionErrorf(true, err, "transport: preface mismatch, wrote %d bytes; want %d", n, len(clientPreface)) + } + var ss []http2.Setting + + if t.initialWindowSize != defaultWindowSize { + ss = append(ss, http2.Setting{ + ID: http2.SettingInitialWindowSize, + Val: uint32(t.initialWindowSize), + }) + } + if opts.MaxHeaderListSize != nil { + ss = append(ss, http2.Setting{ + ID: http2.SettingMaxHeaderListSize, + Val: *opts.MaxHeaderListSize, + }) + } + err = t.framer.fr.WriteSettings(ss...) + if err != nil { + t.Close() + return nil, connectionErrorf(true, err, "transport: failed to write initial settings frame: %v", err) + } + // Adjust the connection flow control window if needed. + if delta := uint32(icwz - defaultWindowSize); delta > 0 { + if err := t.framer.fr.WriteWindowUpdate(0, delta); err != nil { + t.Close() + return nil, connectionErrorf(true, err, "transport: failed to write window update: %v", err) + } + } + + t.connectionID = atomic.AddUint64(&clientConnectionCounter, 1) + + if err := t.framer.writer.Flush(); err != nil { + return nil, err + } + go func() { + t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst) + err := t.loopy.run() + if err != nil { + errorf("transport: loopyWriter.run returning. Err: %v", err) + } + // If it's a connection error, let reader goroutine handle it + // since there might be data in the buffers. + if _, ok := err.(net.Error); !ok { + t.conn.Close() + } + close(t.writerDone) + }() + return t, nil +} + +func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { + // TODO(zhaoq): Handle uint32 overflow of Stream.id. + s := &Stream{ + ct: t, + done: make(chan struct{}), + method: callHdr.Method, + sendCompress: callHdr.SendCompress, + buf: newRecvBuffer(), + headerChan: make(chan struct{}), + contentSubtype: callHdr.ContentSubtype, + } + s.wq = newWriteQuota(defaultWriteQuota, s.done) + s.requestRead = func(n int) { + t.adjustWindow(s, uint32(n)) + } + // The client side stream context should have exactly the same life cycle with the user provided context. + // That means, s.ctx should be read-only. And s.ctx is done iff ctx is done. + // So we use the original context here instead of creating a copy. + s.ctx = ctx + s.trReader = &transportReader{ + reader: &recvBufferReader{ + ctx: s.ctx, + ctxDone: s.ctx.Done(), + recv: s.buf, + closeStream: func(err error) { + t.CloseStream(s, err) + }, + freeBuffer: t.bufferPool.put, + }, + windowHandler: func(n int) { + t.updateWindow(s, uint32(n)) + }, + } + return s +} + +func (t *http2Client) getPeer() *peer.Peer { + return &peer.Peer{ + Addr: t.remoteAddr, + AuthInfo: t.authInfo, + } +} + +func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) ([]hpack.HeaderField, error) { + aud := t.createAudience(callHdr) + ri := credentials.RequestInfo{ + Method: callHdr.Method, + AuthInfo: t.authInfo, + } + ctxWithRequestInfo := internal.NewRequestInfoContext.(func(context.Context, credentials.RequestInfo) context.Context)(ctx, ri) + authData, err := t.getTrAuthData(ctxWithRequestInfo, aud) + if err != nil { + return nil, err + } + callAuthData, err := t.getCallAuthData(ctxWithRequestInfo, aud, callHdr) + if err != nil { + return nil, err + } + // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields + // first and create a slice of that exact size. + // Make the slice of certain predictable size to reduce allocations made by append. + hfLen := 7 // :method, :scheme, :path, :authority, content-type, user-agent, te + hfLen += len(authData) + len(callAuthData) + headerFields := make([]hpack.HeaderField, 0, hfLen) + headerFields = append(headerFields, hpack.HeaderField{Name: ":method", Value: "POST"}) + headerFields = append(headerFields, hpack.HeaderField{Name: ":scheme", Value: t.scheme}) + headerFields = append(headerFields, hpack.HeaderField{Name: ":path", Value: callHdr.Method}) + headerFields = append(headerFields, hpack.HeaderField{Name: ":authority", Value: callHdr.Host}) + headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: contentType(callHdr.ContentSubtype)}) + headerFields = append(headerFields, hpack.HeaderField{Name: "user-agent", Value: t.userAgent}) + headerFields = append(headerFields, hpack.HeaderField{Name: "te", Value: "trailers"}) + if callHdr.PreviousAttempts > 0 { + headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-previous-rpc-attempts", Value: strconv.Itoa(callHdr.PreviousAttempts)}) + } + + if callHdr.SendCompress != "" { + headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: callHdr.SendCompress}) + headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-accept-encoding", Value: callHdr.SendCompress}) + } + if dl, ok := ctx.Deadline(); ok { + // Send out timeout regardless its value. The server can detect timeout context by itself. + // TODO(mmukhi): Perhaps this field should be updated when actually writing out to the wire. + timeout := time.Until(dl) + headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-timeout", Value: encodeTimeout(timeout)}) + } + for k, v := range authData { + headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) + } + for k, v := range callAuthData { + headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) + } + if b := stats.OutgoingTags(ctx); b != nil { + headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-tags-bin", Value: encodeBinHeader(b)}) + } + if b := stats.OutgoingTrace(ctx); b != nil { + headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-trace-bin", Value: encodeBinHeader(b)}) + } + + if md, added, ok := metadata.FromOutgoingContextRaw(ctx); ok { + var k string + for k, vv := range md { + // HTTP doesn't allow you to set pseudoheaders after non pseudoheaders were set. + if isReservedHeader(k) { + continue + } + for _, v := range vv { + headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) + } + } + for _, vv := range added { + for i, v := range vv { + if i%2 == 0 { + k = v + continue + } + // HTTP doesn't allow you to set pseudoheaders after non pseudoheaders were set. + if isReservedHeader(k) { + continue + } + headerFields = append(headerFields, hpack.HeaderField{Name: strings.ToLower(k), Value: encodeMetadataHeader(k, v)}) + } + } + } + if md, ok := t.md.(*metadata.MD); ok { + for k, vv := range *md { + if isReservedHeader(k) { + continue + } + for _, v := range vv { + headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) + } + } + } + return headerFields, nil +} + +func (t *http2Client) createAudience(callHdr *CallHdr) string { + // Create an audience string only if needed. + if len(t.perRPCCreds) == 0 && callHdr.Creds == nil { + return "" + } + // Construct URI required to get auth request metadata. + // Omit port if it is the default one. + host := strings.TrimSuffix(callHdr.Host, ":443") + pos := strings.LastIndex(callHdr.Method, "/") + if pos == -1 { + pos = len(callHdr.Method) + } + return "https://" + host + callHdr.Method[:pos] +} + +func (t *http2Client) getTrAuthData(ctx context.Context, audience string) (map[string]string, error) { + if len(t.perRPCCreds) == 0 { + return nil, nil + } + authData := map[string]string{} + for _, c := range t.perRPCCreds { + data, err := c.GetRequestMetadata(ctx, audience) + if err != nil { + if _, ok := status.FromError(err); ok { + return nil, err + } + + return nil, status.Errorf(codes.Unauthenticated, "transport: %v", err) + } + for k, v := range data { + // Capital header names are illegal in HTTP/2. + k = strings.ToLower(k) + authData[k] = v + } + } + return authData, nil +} + +func (t *http2Client) getCallAuthData(ctx context.Context, audience string, callHdr *CallHdr) (map[string]string, error) { + var callAuthData map[string]string + // Check if credentials.PerRPCCredentials were provided via call options. + // Note: if these credentials are provided both via dial options and call + // options, then both sets of credentials will be applied. + if callCreds := callHdr.Creds; callCreds != nil { + if !t.isSecure && callCreds.RequireTransportSecurity() { + return nil, status.Error(codes.Unauthenticated, "transport: cannot send secure credentials on an insecure connection") + } + data, err := callCreds.GetRequestMetadata(ctx, audience) + if err != nil { + return nil, status.Errorf(codes.Internal, "transport: %v", err) + } + callAuthData = make(map[string]string, len(data)) + for k, v := range data { + // Capital header names are illegal in HTTP/2 + k = strings.ToLower(k) + callAuthData[k] = v + } + } + return callAuthData, nil +} + +// NewStream creates a stream and registers it into the transport as "active" +// streams. +func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Stream, err error) { + ctx = peer.NewContext(ctx, t.getPeer()) + headerFields, err := t.createHeaderFields(ctx, callHdr) + if err != nil { + return nil, err + } + s := t.newStream(ctx, callHdr) + cleanup := func(err error) { + if s.swapState(streamDone) == streamDone { + // If it was already done, return. + return + } + // The stream was unprocessed by the server. + atomic.StoreUint32(&s.unprocessed, 1) + s.write(recvMsg{err: err}) + close(s.done) + // If headerChan isn't closed, then close it. + if atomic.CompareAndSwapUint32(&s.headerChanClosed, 0, 1) { + close(s.headerChan) + } + } + hdr := &headerFrame{ + hf: headerFields, + endStream: false, + initStream: func(id uint32) error { + t.mu.Lock() + if state := t.state; state != reachable { + t.mu.Unlock() + // Do a quick cleanup. + err := error(errStreamDrain) + if state == closing { + err = ErrConnClosing + } + cleanup(err) + return err + } + t.activeStreams[id] = s + if channelz.IsOn() { + atomic.AddInt64(&t.czData.streamsStarted, 1) + atomic.StoreInt64(&t.czData.lastStreamCreatedTime, time.Now().UnixNano()) + } + // If the keepalive goroutine has gone dormant, wake it up. + if t.kpDormant { + t.kpDormancyCond.Signal() + } + t.mu.Unlock() + return nil + }, + onOrphaned: cleanup, + wq: s.wq, + } + firstTry := true + var ch chan struct{} + checkForStreamQuota := func(it interface{}) bool { + if t.streamQuota <= 0 { // Can go negative if server decreases it. + if firstTry { + t.waitingStreams++ + } + ch = t.streamsQuotaAvailable + return false + } + if !firstTry { + t.waitingStreams-- + } + t.streamQuota-- + h := it.(*headerFrame) + h.streamID = t.nextID + t.nextID += 2 + s.id = h.streamID + s.fc = &inFlow{limit: uint32(t.initialWindowSize)} + if t.streamQuota > 0 && t.waitingStreams > 0 { + select { + case t.streamsQuotaAvailable <- struct{}{}: + default: + } + } + return true + } + var hdrListSizeErr error + checkForHeaderListSize := func(it interface{}) bool { + if t.maxSendHeaderListSize == nil { + return true + } + hdrFrame := it.(*headerFrame) + var sz int64 + for _, f := range hdrFrame.hf { + if sz += int64(f.Size()); sz > int64(*t.maxSendHeaderListSize) { + hdrListSizeErr = status.Errorf(codes.Internal, "header list size to send violates the maximum size (%d bytes) set by server", *t.maxSendHeaderListSize) + return false + } + } + return true + } + for { + success, err := t.controlBuf.executeAndPut(func(it interface{}) bool { + if !checkForStreamQuota(it) { + return false + } + if !checkForHeaderListSize(it) { + return false + } + return true + }, hdr) + if err != nil { + return nil, err + } + if success { + break + } + if hdrListSizeErr != nil { + return nil, hdrListSizeErr + } + firstTry = false + select { + case <-ch: + case <-s.ctx.Done(): + return nil, ContextErr(s.ctx.Err()) + case <-t.goAway: + return nil, errStreamDrain + case <-t.ctx.Done(): + return nil, ErrConnClosing + } + } + if t.statsHandler != nil { + header, ok := metadata.FromOutgoingContext(ctx) + if ok { + header.Set("user-agent", t.userAgent) + } else { + header = metadata.Pairs("user-agent", t.userAgent) + } + // Note: The header fields are compressed with hpack after this call returns. + // No WireLength field is set here. + outHeader := &stats.OutHeader{ + Client: true, + FullMethod: callHdr.Method, + RemoteAddr: t.remoteAddr, + LocalAddr: t.localAddr, + Compression: callHdr.SendCompress, + Header: header, + } + t.statsHandler.HandleRPC(s.ctx, outHeader) + } + return s, nil +} + +// CloseStream clears the footprint of a stream when the stream is not needed any more. +// This must not be executed in reader's goroutine. +func (t *http2Client) CloseStream(s *Stream, err error) { + var ( + rst bool + rstCode http2.ErrCode + ) + if err != nil { + rst = true + rstCode = http2.ErrCodeCancel + } + t.closeStream(s, err, rst, rstCode, status.Convert(err), nil, false) +} + +func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2.ErrCode, st *status.Status, mdata map[string][]string, eosReceived bool) { + // Set stream status to done. + if s.swapState(streamDone) == streamDone { + // If it was already done, return. If multiple closeStream calls + // happen simultaneously, wait for the first to finish. + <-s.done + return + } + // status and trailers can be updated here without any synchronization because the stream goroutine will + // only read it after it sees an io.EOF error from read or write and we'll write those errors + // only after updating this. + s.status = st + if len(mdata) > 0 { + s.trailer = mdata + } + if err != nil { + // This will unblock reads eventually. + s.write(recvMsg{err: err}) + } + // If headerChan isn't closed, then close it. + if atomic.CompareAndSwapUint32(&s.headerChanClosed, 0, 1) { + s.noHeaders = true + close(s.headerChan) + } + cleanup := &cleanupStream{ + streamID: s.id, + onWrite: func() { + t.mu.Lock() + if t.activeStreams != nil { + delete(t.activeStreams, s.id) + } + t.mu.Unlock() + if channelz.IsOn() { + if eosReceived { + atomic.AddInt64(&t.czData.streamsSucceeded, 1) + } else { + atomic.AddInt64(&t.czData.streamsFailed, 1) + } + } + }, + rst: rst, + rstCode: rstCode, + } + addBackStreamQuota := func(interface{}) bool { + t.streamQuota++ + if t.streamQuota > 0 && t.waitingStreams > 0 { + select { + case t.streamsQuotaAvailable <- struct{}{}: + default: + } + } + return true + } + t.controlBuf.executeAndPut(addBackStreamQuota, cleanup) + // This will unblock write. + close(s.done) +} + +// Close kicks off the shutdown process of the transport. This should be called +// only once on a transport. Once it is called, the transport should not be +// accessed any more. +// +// This method blocks until the addrConn that initiated this transport is +// re-connected. This happens because t.onClose() begins reconnect logic at the +// addrConn level and blocks until the addrConn is successfully connected. +func (t *http2Client) Close() error { + t.mu.Lock() + // Make sure we only Close once. + if t.state == closing { + t.mu.Unlock() + return nil + } + // Call t.onClose before setting the state to closing to prevent the client + // from attempting to create new streams ASAP. + t.onClose() + t.state = closing + streams := t.activeStreams + t.activeStreams = nil + if t.kpDormant { + // If the keepalive goroutine is blocked on this condition variable, we + // should unblock it so that the goroutine eventually exits. + t.kpDormancyCond.Signal() + } + t.mu.Unlock() + t.controlBuf.finish() + t.cancel() + err := t.conn.Close() + if channelz.IsOn() { + channelz.RemoveEntry(t.channelzID) + } + // Notify all active streams. + for _, s := range streams { + t.closeStream(s, ErrConnClosing, false, http2.ErrCodeNo, status.New(codes.Unavailable, ErrConnClosing.Desc), nil, false) + } + if t.statsHandler != nil { + connEnd := &stats.ConnEnd{ + Client: true, + } + t.statsHandler.HandleConn(t.ctx, connEnd) + } + return err +} + +// GracefulClose sets the state to draining, which prevents new streams from +// being created and causes the transport to be closed when the last active +// stream is closed. If there are no active streams, the transport is closed +// immediately. This does nothing if the transport is already draining or +// closing. +func (t *http2Client) GracefulClose() { + t.mu.Lock() + // Make sure we move to draining only from active. + if t.state == draining || t.state == closing { + t.mu.Unlock() + return + } + t.state = draining + active := len(t.activeStreams) + t.mu.Unlock() + if active == 0 { + t.Close() + return + } + t.controlBuf.put(&incomingGoAway{}) +} + +// Write formats the data into HTTP2 data frame(s) and sends it out. The caller +// should proceed only if Write returns nil. +func (t *http2Client) Write(s *Stream, hdr []byte, data []byte, opts *Options) error { + if opts.Last { + // If it's the last message, update stream state. + if !s.compareAndSwapState(streamActive, streamWriteDone) { + return errStreamDone + } + } else if s.getState() != streamActive { + return errStreamDone + } + df := &dataFrame{ + streamID: s.id, + endStream: opts.Last, + } + if hdr != nil || data != nil { // If it's not an empty data frame. + // Add some data to grpc message header so that we can equally + // distribute bytes across frames. + emptyLen := http2MaxFrameLen - len(hdr) + if emptyLen > len(data) { + emptyLen = len(data) + } + hdr = append(hdr, data[:emptyLen]...) + data = data[emptyLen:] + df.h, df.d = hdr, data + // TODO(mmukhi): The above logic in this if can be moved to loopyWriter's data handler. + if err := s.wq.get(int32(len(hdr) + len(data))); err != nil { + return err + } + } + return t.controlBuf.put(df) +} + +func (t *http2Client) getStream(f http2.Frame) *Stream { + t.mu.Lock() + s := t.activeStreams[f.Header().StreamID] + t.mu.Unlock() + return s +} + +// adjustWindow sends out extra window update over the initial window size +// of stream if the application is requesting data larger in size than +// the window. +func (t *http2Client) adjustWindow(s *Stream, n uint32) { + if w := s.fc.maybeAdjust(n); w > 0 { + t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) + } +} + +// updateWindow adjusts the inbound quota for the stream. +// Window updates will be sent out when the cumulative quota +// exceeds the corresponding threshold. +func (t *http2Client) updateWindow(s *Stream, n uint32) { + if w := s.fc.onRead(n); w > 0 { + t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) + } +} + +// updateFlowControl updates the incoming flow control windows +// for the transport and the stream based on the current bdp +// estimation. +func (t *http2Client) updateFlowControl(n uint32) { + t.mu.Lock() + for _, s := range t.activeStreams { + s.fc.newLimit(n) + } + t.mu.Unlock() + updateIWS := func(interface{}) bool { + t.initialWindowSize = int32(n) + return true + } + t.controlBuf.executeAndPut(updateIWS, &outgoingWindowUpdate{streamID: 0, increment: t.fc.newLimit(n)}) + t.controlBuf.put(&outgoingSettings{ + ss: []http2.Setting{ + { + ID: http2.SettingInitialWindowSize, + Val: n, + }, + }, + }) +} + +func (t *http2Client) handleData(f *http2.DataFrame) { + size := f.Header().Length + var sendBDPPing bool + if t.bdpEst != nil { + sendBDPPing = t.bdpEst.add(size) + } + // Decouple connection's flow control from application's read. + // An update on connection's flow control should not depend on + // whether user application has read the data or not. Such a + // restriction is already imposed on the stream's flow control, + // and therefore the sender will be blocked anyways. + // Decoupling the connection flow control will prevent other + // active(fast) streams from starving in presence of slow or + // inactive streams. + // + if w := t.fc.onData(size); w > 0 { + t.controlBuf.put(&outgoingWindowUpdate{ + streamID: 0, + increment: w, + }) + } + if sendBDPPing { + // Avoid excessive ping detection (e.g. in an L7 proxy) + // by sending a window update prior to the BDP ping. + + if w := t.fc.reset(); w > 0 { + t.controlBuf.put(&outgoingWindowUpdate{ + streamID: 0, + increment: w, + }) + } + + t.controlBuf.put(bdpPing) + } + // Select the right stream to dispatch. + s := t.getStream(f) + if s == nil { + return + } + if size > 0 { + if err := s.fc.onData(size); err != nil { + t.closeStream(s, io.EOF, true, http2.ErrCodeFlowControl, status.New(codes.Internal, err.Error()), nil, false) + return + } + if f.Header().Flags.Has(http2.FlagDataPadded) { + if w := s.fc.onRead(size - uint32(len(f.Data()))); w > 0 { + t.controlBuf.put(&outgoingWindowUpdate{s.id, w}) + } + } + // TODO(bradfitz, zhaoq): A copy is required here because there is no + // guarantee f.Data() is consumed before the arrival of next frame. + // Can this copy be eliminated? + if len(f.Data()) > 0 { + buffer := t.bufferPool.get() + buffer.Reset() + buffer.Write(f.Data()) + s.write(recvMsg{buffer: buffer}) + } + } + // The server has closed the stream without sending trailers. Record that + // the read direction is closed, and set the status appropriately. + if f.FrameHeader.Flags.Has(http2.FlagDataEndStream) { + t.closeStream(s, io.EOF, false, http2.ErrCodeNo, status.New(codes.Internal, "server closed the stream without sending trailers"), nil, true) + } +} + +func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { + s := t.getStream(f) + if s == nil { + return + } + if f.ErrCode == http2.ErrCodeRefusedStream { + // The stream was unprocessed by the server. + atomic.StoreUint32(&s.unprocessed, 1) + } + statusCode, ok := http2ErrConvTab[f.ErrCode] + if !ok { + warningf("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error %v", f.ErrCode) + statusCode = codes.Unknown + } + if statusCode == codes.Canceled { + if d, ok := s.ctx.Deadline(); ok && !d.After(time.Now()) { + // Our deadline was already exceeded, and that was likely the cause + // of this cancelation. Alter the status code accordingly. + statusCode = codes.DeadlineExceeded + } + } + t.closeStream(s, io.EOF, false, http2.ErrCodeNo, status.Newf(statusCode, "stream terminated by RST_STREAM with error code: %v", f.ErrCode), nil, false) +} + +func (t *http2Client) handleSettings(f *http2.SettingsFrame, isFirst bool) { + if f.IsAck() { + return + } + var maxStreams *uint32 + var ss []http2.Setting + var updateFuncs []func() + f.ForeachSetting(func(s http2.Setting) error { + switch s.ID { + case http2.SettingMaxConcurrentStreams: + maxStreams = new(uint32) + *maxStreams = s.Val + case http2.SettingMaxHeaderListSize: + updateFuncs = append(updateFuncs, func() { + t.maxSendHeaderListSize = new(uint32) + *t.maxSendHeaderListSize = s.Val + }) + default: + ss = append(ss, s) + } + return nil + }) + if isFirst && maxStreams == nil { + maxStreams = new(uint32) + *maxStreams = math.MaxUint32 + } + sf := &incomingSettings{ + ss: ss, + } + if maxStreams != nil { + updateStreamQuota := func() { + delta := int64(*maxStreams) - int64(t.maxConcurrentStreams) + t.maxConcurrentStreams = *maxStreams + t.streamQuota += delta + if delta > 0 && t.waitingStreams > 0 { + close(t.streamsQuotaAvailable) // wake all of them up. + t.streamsQuotaAvailable = make(chan struct{}, 1) + } + } + updateFuncs = append(updateFuncs, updateStreamQuota) + } + t.controlBuf.executeAndPut(func(interface{}) bool { + for _, f := range updateFuncs { + f() + } + return true + }, sf) +} + +func (t *http2Client) handlePing(f *http2.PingFrame) { + if f.IsAck() { + // Maybe it's a BDP ping. + if t.bdpEst != nil { + t.bdpEst.calculate(f.Data) + } + return + } + pingAck := &ping{ack: true} + copy(pingAck.data[:], f.Data[:]) + t.controlBuf.put(pingAck) +} + +func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { + t.mu.Lock() + if t.state == closing { + t.mu.Unlock() + return + } + if f.ErrCode == http2.ErrCodeEnhanceYourCalm { + infof("Client received GoAway with http2.ErrCodeEnhanceYourCalm.") + } + id := f.LastStreamID + if id > 0 && id%2 != 1 { + t.mu.Unlock() + t.Close() + return + } + // A client can receive multiple GoAways from the server (see + // https://github.com/grpc/grpc-go/issues/1387). The idea is that the first + // GoAway will be sent with an ID of MaxInt32 and the second GoAway will be + // sent after an RTT delay with the ID of the last stream the server will + // process. + // + // Therefore, when we get the first GoAway we don't necessarily close any + // streams. While in case of second GoAway we close all streams created after + // the GoAwayId. This way streams that were in-flight while the GoAway from + // server was being sent don't get killed. + select { + case <-t.goAway: // t.goAway has been closed (i.e.,multiple GoAways). + // If there are multiple GoAways the first one should always have an ID greater than the following ones. + if id > t.prevGoAwayID { + t.mu.Unlock() + t.Close() + return + } + default: + t.setGoAwayReason(f) + close(t.goAway) + t.controlBuf.put(&incomingGoAway{}) + // Notify the clientconn about the GOAWAY before we set the state to + // draining, to allow the client to stop attempting to create streams + // before disallowing new streams on this connection. + t.onGoAway(t.goAwayReason) + t.state = draining + } + // All streams with IDs greater than the GoAwayId + // and smaller than the previous GoAway ID should be killed. + upperLimit := t.prevGoAwayID + if upperLimit == 0 { // This is the first GoAway Frame. + upperLimit = math.MaxUint32 // Kill all streams after the GoAway ID. + } + for streamID, stream := range t.activeStreams { + if streamID > id && streamID <= upperLimit { + // The stream was unprocessed by the server. + atomic.StoreUint32(&stream.unprocessed, 1) + t.closeStream(stream, errStreamDrain, false, http2.ErrCodeNo, statusGoAway, nil, false) + } + } + t.prevGoAwayID = id + active := len(t.activeStreams) + t.mu.Unlock() + if active == 0 { + t.Close() + } +} + +// setGoAwayReason sets the value of t.goAwayReason based +// on the GoAway frame received. +// It expects a lock on transport's mutext to be held by +// the caller. +func (t *http2Client) setGoAwayReason(f *http2.GoAwayFrame) { + t.goAwayReason = GoAwayNoReason + switch f.ErrCode { + case http2.ErrCodeEnhanceYourCalm: + if string(f.DebugData()) == "too_many_pings" { + t.goAwayReason = GoAwayTooManyPings + } + } +} + +func (t *http2Client) GetGoAwayReason() GoAwayReason { + t.mu.Lock() + defer t.mu.Unlock() + return t.goAwayReason +} + +func (t *http2Client) handleWindowUpdate(f *http2.WindowUpdateFrame) { + t.controlBuf.put(&incomingWindowUpdate{ + streamID: f.Header().StreamID, + increment: f.Increment, + }) +} + +// operateHeaders takes action on the decoded headers. +func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { + s := t.getStream(frame) + if s == nil { + return + } + endStream := frame.StreamEnded() + atomic.StoreUint32(&s.bytesReceived, 1) + initialHeader := atomic.LoadUint32(&s.headerChanClosed) == 0 + + if !initialHeader && !endStream { + // As specified by gRPC over HTTP2, a HEADERS frame (and associated CONTINUATION frames) can only appear at the start or end of a stream. Therefore, second HEADERS frame must have EOS bit set. + st := status.New(codes.Internal, "a HEADERS frame cannot appear in the middle of a stream") + t.closeStream(s, st.Err(), true, http2.ErrCodeProtocol, st, nil, false) + return + } + + state := &decodeState{} + // Initialize isGRPC value to be !initialHeader, since if a gRPC Response-Headers has already been received, then it means that the peer is speaking gRPC and we are in gRPC mode. + state.data.isGRPC = !initialHeader + if err := state.decodeHeader(frame); err != nil { + t.closeStream(s, err, true, http2.ErrCodeProtocol, status.Convert(err), nil, endStream) + return + } + + isHeader := false + defer func() { + if t.statsHandler != nil { + if isHeader { + inHeader := &stats.InHeader{ + Client: true, + WireLength: int(frame.Header().Length), + Header: s.header.Copy(), + Compression: s.recvCompress, + } + t.statsHandler.HandleRPC(s.ctx, inHeader) + } else { + inTrailer := &stats.InTrailer{ + Client: true, + WireLength: int(frame.Header().Length), + Trailer: s.trailer.Copy(), + } + t.statsHandler.HandleRPC(s.ctx, inTrailer) + } + } + }() + + // If headerChan hasn't been closed yet + if atomic.CompareAndSwapUint32(&s.headerChanClosed, 0, 1) { + s.headerValid = true + if !endStream { + // HEADERS frame block carries a Response-Headers. + isHeader = true + // These values can be set without any synchronization because + // stream goroutine will read it only after seeing a closed + // headerChan which we'll close after setting this. + s.recvCompress = state.data.encoding + if len(state.data.mdata) > 0 { + s.header = state.data.mdata + } + } else { + // HEADERS frame block carries a Trailers-Only. + s.noHeaders = true + } + close(s.headerChan) + } + + if !endStream { + return + } + + // if client received END_STREAM from server while stream was still active, send RST_STREAM + rst := s.getState() == streamActive + t.closeStream(s, io.EOF, rst, http2.ErrCodeNo, state.status(), state.data.mdata, true) +} + +// reader runs as a separate goroutine in charge of reading data from network +// connection. +// +// TODO(zhaoq): currently one reader per transport. Investigate whether this is +// optimal. +// TODO(zhaoq): Check the validity of the incoming frame sequence. +func (t *http2Client) reader() { + defer close(t.readerDone) + // Check the validity of server preface. + frame, err := t.framer.fr.ReadFrame() + if err != nil { + t.Close() // this kicks off resetTransport, so must be last before return + return + } + t.conn.SetReadDeadline(time.Time{}) // reset deadline once we get the settings frame (we didn't time out, yay!) + if t.keepaliveEnabled { + atomic.StoreInt64(&t.lastRead, time.Now().UnixNano()) + } + sf, ok := frame.(*http2.SettingsFrame) + if !ok { + t.Close() // this kicks off resetTransport, so must be last before return + return + } + t.onPrefaceReceipt() + t.handleSettings(sf, true) + + // loop to keep reading incoming messages on this transport. + for { + t.controlBuf.throttle() + frame, err := t.framer.fr.ReadFrame() + if t.keepaliveEnabled { + atomic.StoreInt64(&t.lastRead, time.Now().UnixNano()) + } + if err != nil { + // Abort an active stream if the http2.Framer returns a + // http2.StreamError. This can happen only if the server's response + // is malformed http2. + if se, ok := err.(http2.StreamError); ok { + t.mu.Lock() + s := t.activeStreams[se.StreamID] + t.mu.Unlock() + if s != nil { + // use error detail to provide better err message + code := http2ErrConvTab[se.Code] + msg := t.framer.fr.ErrorDetail().Error() + t.closeStream(s, status.Error(code, msg), true, http2.ErrCodeProtocol, status.New(code, msg), nil, false) + } + continue + } else { + // Transport error. + t.Close() + return + } + } + switch frame := frame.(type) { + case *http2.MetaHeadersFrame: + t.operateHeaders(frame) + case *http2.DataFrame: + t.handleData(frame) + case *http2.RSTStreamFrame: + t.handleRSTStream(frame) + case *http2.SettingsFrame: + t.handleSettings(frame, false) + case *http2.PingFrame: + t.handlePing(frame) + case *http2.GoAwayFrame: + t.handleGoAway(frame) + case *http2.WindowUpdateFrame: + t.handleWindowUpdate(frame) + default: + errorf("transport: http2Client.reader got unhandled frame type %v.", frame) + } + } +} + +func minTime(a, b time.Duration) time.Duration { + if a < b { + return a + } + return b +} + +// keepalive running in a separate goroutune makes sure the connection is alive by sending pings. +func (t *http2Client) keepalive() { + p := &ping{data: [8]byte{}} + // True iff a ping has been sent, and no data has been received since then. + outstandingPing := false + // Amount of time remaining before which we should receive an ACK for the + // last sent ping. + timeoutLeft := time.Duration(0) + // Records the last value of t.lastRead before we go block on the timer. + // This is required to check for read activity since then. + prevNano := time.Now().UnixNano() + timer := time.NewTimer(t.kp.Time) + for { + select { + case <-timer.C: + lastRead := atomic.LoadInt64(&t.lastRead) + if lastRead > prevNano { + // There has been read activity since the last time we were here. + outstandingPing = false + // Next timer should fire at kp.Time seconds from lastRead time. + timer.Reset(time.Duration(lastRead) + t.kp.Time - time.Duration(time.Now().UnixNano())) + prevNano = lastRead + continue + } + if outstandingPing && timeoutLeft <= 0 { + t.Close() + return + } + t.mu.Lock() + if t.state == closing { + // If the transport is closing, we should exit from the + // keepalive goroutine here. If not, we could have a race + // between the call to Signal() from Close() and the call to + // Wait() here, whereby the keepalive goroutine ends up + // blocking on the condition variable which will never be + // signalled again. + t.mu.Unlock() + return + } + if len(t.activeStreams) < 1 && !t.kp.PermitWithoutStream { + // If a ping was sent out previously (because there were active + // streams at that point) which wasn't acked and its timeout + // hadn't fired, but we got here and are about to go dormant, + // we should make sure that we unconditionally send a ping once + // we awaken. + outstandingPing = false + t.kpDormant = true + t.kpDormancyCond.Wait() + } + t.kpDormant = false + t.mu.Unlock() + + // We get here either because we were dormant and a new stream was + // created which unblocked the Wait() call, or because the + // keepalive timer expired. In both cases, we need to send a ping. + if !outstandingPing { + if channelz.IsOn() { + atomic.AddInt64(&t.czData.kpCount, 1) + } + t.controlBuf.put(p) + timeoutLeft = t.kp.Timeout + outstandingPing = true + } + // The amount of time to sleep here is the minimum of kp.Time and + // timeoutLeft. This will ensure that we wait only for kp.Time + // before sending out the next ping (for cases where the ping is + // acked). + sleepDuration := minTime(t.kp.Time, timeoutLeft) + timeoutLeft -= sleepDuration + timer.Reset(sleepDuration) + case <-t.ctx.Done(): + if !timer.Stop() { + <-timer.C + } + return + } + } +} + +func (t *http2Client) Error() <-chan struct{} { + return t.ctx.Done() +} + +func (t *http2Client) GoAway() <-chan struct{} { + return t.goAway +} + +func (t *http2Client) ChannelzMetric() *channelz.SocketInternalMetric { + s := channelz.SocketInternalMetric{ + StreamsStarted: atomic.LoadInt64(&t.czData.streamsStarted), + StreamsSucceeded: atomic.LoadInt64(&t.czData.streamsSucceeded), + StreamsFailed: atomic.LoadInt64(&t.czData.streamsFailed), + MessagesSent: atomic.LoadInt64(&t.czData.msgSent), + MessagesReceived: atomic.LoadInt64(&t.czData.msgRecv), + KeepAlivesSent: atomic.LoadInt64(&t.czData.kpCount), + LastLocalStreamCreatedTimestamp: time.Unix(0, atomic.LoadInt64(&t.czData.lastStreamCreatedTime)), + LastMessageSentTimestamp: time.Unix(0, atomic.LoadInt64(&t.czData.lastMsgSentTime)), + LastMessageReceivedTimestamp: time.Unix(0, atomic.LoadInt64(&t.czData.lastMsgRecvTime)), + LocalFlowControlWindow: int64(t.fc.getSize()), + SocketOptions: channelz.GetSocketOption(t.conn), + LocalAddr: t.localAddr, + RemoteAddr: t.remoteAddr, + // RemoteName : + } + if au, ok := t.authInfo.(credentials.ChannelzSecurityInfo); ok { + s.Security = au.GetSecurityValue() + } + s.RemoteFlowControlWindow = t.getOutFlowWindow() + return &s +} + +func (t *http2Client) RemoteAddr() net.Addr { return t.remoteAddr } + +func (t *http2Client) IncrMsgSent() { + atomic.AddInt64(&t.czData.msgSent, 1) + atomic.StoreInt64(&t.czData.lastMsgSentTime, time.Now().UnixNano()) +} + +func (t *http2Client) IncrMsgRecv() { + atomic.AddInt64(&t.czData.msgRecv, 1) + atomic.StoreInt64(&t.czData.lastMsgRecvTime, time.Now().UnixNano()) +} + +func (t *http2Client) getOutFlowWindow() int64 { + resp := make(chan uint32, 1) + timer := time.NewTimer(time.Second) + defer timer.Stop() + t.controlBuf.put(&outFlowControlSizeRequest{resp}) + select { + case sz := <-resp: + return int64(sz) + case <-t.ctxDone: + return -1 + case <-timer.C: + return -2 + } +} diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/vendor/google.golang.org/grpc/internal/transport/http2_server.go new file mode 100644 index 00000000..fa33ffb1 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/http2_server.go @@ -0,0 +1,1251 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "math" + "net" + "strconv" + "sync" + "sync/atomic" + "time" + + "github.com/golang/protobuf/proto" + "golang.org/x/net/http2" + "golang.org/x/net/http2/hpack" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/channelz" + "google.golang.org/grpc/internal/grpcrand" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" + "google.golang.org/grpc/tap" +) + +var ( + // ErrIllegalHeaderWrite indicates that setting header is illegal because of + // the stream's state. + ErrIllegalHeaderWrite = errors.New("transport: the stream is done or WriteHeader was already called") + // ErrHeaderListSizeLimitViolation indicates that the header list size is larger + // than the limit set by peer. + ErrHeaderListSizeLimitViolation = errors.New("transport: trying to send header list size larger than the limit set by peer") +) + +// serverConnectionCounter counts the number of connections a server has seen +// (equal to the number of http2Servers created). Must be accessed atomically. +var serverConnectionCounter uint64 + +// http2Server implements the ServerTransport interface with HTTP2. +type http2Server struct { + lastRead int64 // Keep this field 64-bit aligned. Accessed atomically. + ctx context.Context + done chan struct{} + conn net.Conn + loopy *loopyWriter + readerDone chan struct{} // sync point to enable testing. + writerDone chan struct{} // sync point to enable testing. + remoteAddr net.Addr + localAddr net.Addr + maxStreamID uint32 // max stream ID ever seen + authInfo credentials.AuthInfo // auth info about the connection + inTapHandle tap.ServerInHandle + framer *framer + // The max number of concurrent streams. + maxStreams uint32 + // controlBuf delivers all the control related tasks (e.g., window + // updates, reset streams, and various settings) to the controller. + controlBuf *controlBuffer + fc *trInFlow + stats stats.Handler + // Keepalive and max-age parameters for the server. + kp keepalive.ServerParameters + // Keepalive enforcement policy. + kep keepalive.EnforcementPolicy + // The time instance last ping was received. + lastPingAt time.Time + // Number of times the client has violated keepalive ping policy so far. + pingStrikes uint8 + // Flag to signify that number of ping strikes should be reset to 0. + // This is set whenever data or header frames are sent. + // 1 means yes. + resetPingStrikes uint32 // Accessed atomically. + initialWindowSize int32 + bdpEst *bdpEstimator + maxSendHeaderListSize *uint32 + + mu sync.Mutex // guard the following + + // drainChan is initialized when drain(...) is called the first time. + // After which the server writes out the first GoAway(with ID 2^31-1) frame. + // Then an independent goroutine will be launched to later send the second GoAway. + // During this time we don't want to write another first GoAway(with ID 2^31 -1) frame. + // Thus call to drain(...) will be a no-op if drainChan is already initialized since draining is + // already underway. + drainChan chan struct{} + state transportState + activeStreams map[uint32]*Stream + // idle is the time instant when the connection went idle. + // This is either the beginning of the connection or when the number of + // RPCs go down to 0. + // When the connection is busy, this value is set to 0. + idle time.Time + + // Fields below are for channelz metric collection. + channelzID int64 // channelz unique identification number + czData *channelzData + bufferPool *bufferPool + + connectionID uint64 +} + +// newHTTP2Server constructs a ServerTransport based on HTTP2. ConnectionError is +// returned if something goes wrong. +func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err error) { + writeBufSize := config.WriteBufferSize + readBufSize := config.ReadBufferSize + maxHeaderListSize := defaultServerMaxHeaderListSize + if config.MaxHeaderListSize != nil { + maxHeaderListSize = *config.MaxHeaderListSize + } + framer := newFramer(conn, writeBufSize, readBufSize, maxHeaderListSize) + // Send initial settings as connection preface to client. + isettings := []http2.Setting{{ + ID: http2.SettingMaxFrameSize, + Val: http2MaxFrameLen, + }} + // TODO(zhaoq): Have a better way to signal "no limit" because 0 is + // permitted in the HTTP2 spec. + maxStreams := config.MaxStreams + if maxStreams == 0 { + maxStreams = math.MaxUint32 + } else { + isettings = append(isettings, http2.Setting{ + ID: http2.SettingMaxConcurrentStreams, + Val: maxStreams, + }) + } + dynamicWindow := true + iwz := int32(initialWindowSize) + if config.InitialWindowSize >= defaultWindowSize { + iwz = config.InitialWindowSize + dynamicWindow = false + } + icwz := int32(initialWindowSize) + if config.InitialConnWindowSize >= defaultWindowSize { + icwz = config.InitialConnWindowSize + dynamicWindow = false + } + if iwz != defaultWindowSize { + isettings = append(isettings, http2.Setting{ + ID: http2.SettingInitialWindowSize, + Val: uint32(iwz)}) + } + if config.MaxHeaderListSize != nil { + isettings = append(isettings, http2.Setting{ + ID: http2.SettingMaxHeaderListSize, + Val: *config.MaxHeaderListSize, + }) + } + if config.HeaderTableSize != nil { + isettings = append(isettings, http2.Setting{ + ID: http2.SettingHeaderTableSize, + Val: *config.HeaderTableSize, + }) + } + if err := framer.fr.WriteSettings(isettings...); err != nil { + return nil, connectionErrorf(false, err, "transport: %v", err) + } + // Adjust the connection flow control window if needed. + if delta := uint32(icwz - defaultWindowSize); delta > 0 { + if err := framer.fr.WriteWindowUpdate(0, delta); err != nil { + return nil, connectionErrorf(false, err, "transport: %v", err) + } + } + kp := config.KeepaliveParams + if kp.MaxConnectionIdle == 0 { + kp.MaxConnectionIdle = defaultMaxConnectionIdle + } + if kp.MaxConnectionAge == 0 { + kp.MaxConnectionAge = defaultMaxConnectionAge + } + // Add a jitter to MaxConnectionAge. + kp.MaxConnectionAge += getJitter(kp.MaxConnectionAge) + if kp.MaxConnectionAgeGrace == 0 { + kp.MaxConnectionAgeGrace = defaultMaxConnectionAgeGrace + } + if kp.Time == 0 { + kp.Time = defaultServerKeepaliveTime + } + if kp.Timeout == 0 { + kp.Timeout = defaultServerKeepaliveTimeout + } + kep := config.KeepalivePolicy + if kep.MinTime == 0 { + kep.MinTime = defaultKeepalivePolicyMinTime + } + done := make(chan struct{}) + t := &http2Server{ + ctx: context.Background(), + done: done, + conn: conn, + remoteAddr: conn.RemoteAddr(), + localAddr: conn.LocalAddr(), + authInfo: config.AuthInfo, + framer: framer, + readerDone: make(chan struct{}), + writerDone: make(chan struct{}), + maxStreams: maxStreams, + inTapHandle: config.InTapHandle, + fc: &trInFlow{limit: uint32(icwz)}, + state: reachable, + activeStreams: make(map[uint32]*Stream), + stats: config.StatsHandler, + kp: kp, + idle: time.Now(), + kep: kep, + initialWindowSize: iwz, + czData: new(channelzData), + bufferPool: newBufferPool(), + } + t.controlBuf = newControlBuffer(t.done) + if dynamicWindow { + t.bdpEst = &bdpEstimator{ + bdp: initialWindowSize, + updateFlowControl: t.updateFlowControl, + } + } + if t.stats != nil { + t.ctx = t.stats.TagConn(t.ctx, &stats.ConnTagInfo{ + RemoteAddr: t.remoteAddr, + LocalAddr: t.localAddr, + }) + connBegin := &stats.ConnBegin{} + t.stats.HandleConn(t.ctx, connBegin) + } + if channelz.IsOn() { + t.channelzID = channelz.RegisterNormalSocket(t, config.ChannelzParentID, fmt.Sprintf("%s -> %s", t.remoteAddr, t.localAddr)) + } + + t.connectionID = atomic.AddUint64(&serverConnectionCounter, 1) + + t.framer.writer.Flush() + + defer func() { + if err != nil { + t.Close() + } + }() + + // Check the validity of client preface. + preface := make([]byte, len(clientPreface)) + if _, err := io.ReadFull(t.conn, preface); err != nil { + return nil, connectionErrorf(false, err, "transport: http2Server.HandleStreams failed to receive the preface from client: %v", err) + } + if !bytes.Equal(preface, clientPreface) { + return nil, connectionErrorf(false, nil, "transport: http2Server.HandleStreams received bogus greeting from client: %q", preface) + } + + frame, err := t.framer.fr.ReadFrame() + if err == io.EOF || err == io.ErrUnexpectedEOF { + return nil, err + } + if err != nil { + return nil, connectionErrorf(false, err, "transport: http2Server.HandleStreams failed to read initial settings frame: %v", err) + } + atomic.StoreInt64(&t.lastRead, time.Now().UnixNano()) + sf, ok := frame.(*http2.SettingsFrame) + if !ok { + return nil, connectionErrorf(false, nil, "transport: http2Server.HandleStreams saw invalid preface type %T from client", frame) + } + t.handleSettings(sf) + + go func() { + t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst) + t.loopy.ssGoAwayHandler = t.outgoingGoAwayHandler + if err := t.loopy.run(); err != nil { + errorf("transport: loopyWriter.run returning. Err: %v", err) + } + t.conn.Close() + close(t.writerDone) + }() + go t.keepalive() + return t, nil +} + +// operateHeader takes action on the decoded headers. +func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(*Stream), traceCtx func(context.Context, string) context.Context) (fatal bool) { + streamID := frame.Header().StreamID + state := &decodeState{ + serverSide: true, + } + if err := state.decodeHeader(frame); err != nil { + if se, ok := status.FromError(err); ok { + t.controlBuf.put(&cleanupStream{ + streamID: streamID, + rst: true, + rstCode: statusCodeConvTab[se.Code()], + onWrite: func() {}, + }) + } + return false + } + + buf := newRecvBuffer() + s := &Stream{ + id: streamID, + st: t, + buf: buf, + fc: &inFlow{limit: uint32(t.initialWindowSize)}, + recvCompress: state.data.encoding, + method: state.data.method, + contentSubtype: state.data.contentSubtype, + } + if frame.StreamEnded() { + // s is just created by the caller. No lock needed. + s.state = streamReadDone + } + if state.data.timeoutSet { + s.ctx, s.cancel = context.WithTimeout(t.ctx, state.data.timeout) + } else { + s.ctx, s.cancel = context.WithCancel(t.ctx) + } + pr := &peer.Peer{ + Addr: t.remoteAddr, + } + // Attach Auth info if there is any. + if t.authInfo != nil { + pr.AuthInfo = t.authInfo + } + s.ctx = peer.NewContext(s.ctx, pr) + // Attach the received metadata to the context. + if len(state.data.mdata) > 0 { + s.ctx = metadata.NewIncomingContext(s.ctx, state.data.mdata) + } + if state.data.statsTags != nil { + s.ctx = stats.SetIncomingTags(s.ctx, state.data.statsTags) + } + if state.data.statsTrace != nil { + s.ctx = stats.SetIncomingTrace(s.ctx, state.data.statsTrace) + } + if t.inTapHandle != nil { + var err error + info := &tap.Info{ + FullMethodName: state.data.method, + } + s.ctx, err = t.inTapHandle(s.ctx, info) + if err != nil { + warningf("transport: http2Server.operateHeaders got an error from InTapHandle: %v", err) + t.controlBuf.put(&cleanupStream{ + streamID: s.id, + rst: true, + rstCode: http2.ErrCodeRefusedStream, + onWrite: func() {}, + }) + s.cancel() + return false + } + } + t.mu.Lock() + if t.state != reachable { + t.mu.Unlock() + s.cancel() + return false + } + if uint32(len(t.activeStreams)) >= t.maxStreams { + t.mu.Unlock() + t.controlBuf.put(&cleanupStream{ + streamID: streamID, + rst: true, + rstCode: http2.ErrCodeRefusedStream, + onWrite: func() {}, + }) + s.cancel() + return false + } + if streamID%2 != 1 || streamID <= t.maxStreamID { + t.mu.Unlock() + // illegal gRPC stream id. + errorf("transport: http2Server.HandleStreams received an illegal stream id: %v", streamID) + s.cancel() + return true + } + t.maxStreamID = streamID + t.activeStreams[streamID] = s + if len(t.activeStreams) == 1 { + t.idle = time.Time{} + } + t.mu.Unlock() + if channelz.IsOn() { + atomic.AddInt64(&t.czData.streamsStarted, 1) + atomic.StoreInt64(&t.czData.lastStreamCreatedTime, time.Now().UnixNano()) + } + s.requestRead = func(n int) { + t.adjustWindow(s, uint32(n)) + } + s.ctx = traceCtx(s.ctx, s.method) + if t.stats != nil { + s.ctx = t.stats.TagRPC(s.ctx, &stats.RPCTagInfo{FullMethodName: s.method}) + inHeader := &stats.InHeader{ + FullMethod: s.method, + RemoteAddr: t.remoteAddr, + LocalAddr: t.localAddr, + Compression: s.recvCompress, + WireLength: int(frame.Header().Length), + Header: metadata.MD(state.data.mdata).Copy(), + } + t.stats.HandleRPC(s.ctx, inHeader) + } + s.ctxDone = s.ctx.Done() + s.wq = newWriteQuota(defaultWriteQuota, s.ctxDone) + s.trReader = &transportReader{ + reader: &recvBufferReader{ + ctx: s.ctx, + ctxDone: s.ctxDone, + recv: s.buf, + freeBuffer: t.bufferPool.put, + }, + windowHandler: func(n int) { + t.updateWindow(s, uint32(n)) + }, + } + // Register the stream with loopy. + t.controlBuf.put(®isterStream{ + streamID: s.id, + wq: s.wq, + }) + handle(s) + return false +} + +// HandleStreams receives incoming streams using the given handler. This is +// typically run in a separate goroutine. +// traceCtx attaches trace to ctx and returns the new context. +func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.Context, string) context.Context) { + defer close(t.readerDone) + for { + t.controlBuf.throttle() + frame, err := t.framer.fr.ReadFrame() + atomic.StoreInt64(&t.lastRead, time.Now().UnixNano()) + if err != nil { + if se, ok := err.(http2.StreamError); ok { + warningf("transport: http2Server.HandleStreams encountered http2.StreamError: %v", se) + t.mu.Lock() + s := t.activeStreams[se.StreamID] + t.mu.Unlock() + if s != nil { + t.closeStream(s, true, se.Code, false) + } else { + t.controlBuf.put(&cleanupStream{ + streamID: se.StreamID, + rst: true, + rstCode: se.Code, + onWrite: func() {}, + }) + } + continue + } + if err == io.EOF || err == io.ErrUnexpectedEOF { + t.Close() + return + } + warningf("transport: http2Server.HandleStreams failed to read frame: %v", err) + t.Close() + return + } + switch frame := frame.(type) { + case *http2.MetaHeadersFrame: + if t.operateHeaders(frame, handle, traceCtx) { + t.Close() + break + } + case *http2.DataFrame: + t.handleData(frame) + case *http2.RSTStreamFrame: + t.handleRSTStream(frame) + case *http2.SettingsFrame: + t.handleSettings(frame) + case *http2.PingFrame: + t.handlePing(frame) + case *http2.WindowUpdateFrame: + t.handleWindowUpdate(frame) + case *http2.GoAwayFrame: + // TODO: Handle GoAway from the client appropriately. + default: + errorf("transport: http2Server.HandleStreams found unhandled frame type %v.", frame) + } + } +} + +func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { + t.mu.Lock() + defer t.mu.Unlock() + if t.activeStreams == nil { + // The transport is closing. + return nil, false + } + s, ok := t.activeStreams[f.Header().StreamID] + if !ok { + // The stream is already done. + return nil, false + } + return s, true +} + +// adjustWindow sends out extra window update over the initial window size +// of stream if the application is requesting data larger in size than +// the window. +func (t *http2Server) adjustWindow(s *Stream, n uint32) { + if w := s.fc.maybeAdjust(n); w > 0 { + t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) + } + +} + +// updateWindow adjusts the inbound quota for the stream and the transport. +// Window updates will deliver to the controller for sending when +// the cumulative quota exceeds the corresponding threshold. +func (t *http2Server) updateWindow(s *Stream, n uint32) { + if w := s.fc.onRead(n); w > 0 { + t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, + increment: w, + }) + } +} + +// updateFlowControl updates the incoming flow control windows +// for the transport and the stream based on the current bdp +// estimation. +func (t *http2Server) updateFlowControl(n uint32) { + t.mu.Lock() + for _, s := range t.activeStreams { + s.fc.newLimit(n) + } + t.initialWindowSize = int32(n) + t.mu.Unlock() + t.controlBuf.put(&outgoingWindowUpdate{ + streamID: 0, + increment: t.fc.newLimit(n), + }) + t.controlBuf.put(&outgoingSettings{ + ss: []http2.Setting{ + { + ID: http2.SettingInitialWindowSize, + Val: n, + }, + }, + }) + +} + +func (t *http2Server) handleData(f *http2.DataFrame) { + size := f.Header().Length + var sendBDPPing bool + if t.bdpEst != nil { + sendBDPPing = t.bdpEst.add(size) + } + // Decouple connection's flow control from application's read. + // An update on connection's flow control should not depend on + // whether user application has read the data or not. Such a + // restriction is already imposed on the stream's flow control, + // and therefore the sender will be blocked anyways. + // Decoupling the connection flow control will prevent other + // active(fast) streams from starving in presence of slow or + // inactive streams. + if w := t.fc.onData(size); w > 0 { + t.controlBuf.put(&outgoingWindowUpdate{ + streamID: 0, + increment: w, + }) + } + if sendBDPPing { + // Avoid excessive ping detection (e.g. in an L7 proxy) + // by sending a window update prior to the BDP ping. + if w := t.fc.reset(); w > 0 { + t.controlBuf.put(&outgoingWindowUpdate{ + streamID: 0, + increment: w, + }) + } + t.controlBuf.put(bdpPing) + } + // Select the right stream to dispatch. + s, ok := t.getStream(f) + if !ok { + return + } + if size > 0 { + if err := s.fc.onData(size); err != nil { + t.closeStream(s, true, http2.ErrCodeFlowControl, false) + return + } + if f.Header().Flags.Has(http2.FlagDataPadded) { + if w := s.fc.onRead(size - uint32(len(f.Data()))); w > 0 { + t.controlBuf.put(&outgoingWindowUpdate{s.id, w}) + } + } + // TODO(bradfitz, zhaoq): A copy is required here because there is no + // guarantee f.Data() is consumed before the arrival of next frame. + // Can this copy be eliminated? + if len(f.Data()) > 0 { + buffer := t.bufferPool.get() + buffer.Reset() + buffer.Write(f.Data()) + s.write(recvMsg{buffer: buffer}) + } + } + if f.Header().Flags.Has(http2.FlagDataEndStream) { + // Received the end of stream from the client. + s.compareAndSwapState(streamActive, streamReadDone) + s.write(recvMsg{err: io.EOF}) + } +} + +func (t *http2Server) handleRSTStream(f *http2.RSTStreamFrame) { + // If the stream is not deleted from the transport's active streams map, then do a regular close stream. + if s, ok := t.getStream(f); ok { + t.closeStream(s, false, 0, false) + return + } + // If the stream is already deleted from the active streams map, then put a cleanupStream item into controlbuf to delete the stream from loopy writer's established streams map. + t.controlBuf.put(&cleanupStream{ + streamID: f.Header().StreamID, + rst: false, + rstCode: 0, + onWrite: func() {}, + }) +} + +func (t *http2Server) handleSettings(f *http2.SettingsFrame) { + if f.IsAck() { + return + } + var ss []http2.Setting + var updateFuncs []func() + f.ForeachSetting(func(s http2.Setting) error { + switch s.ID { + case http2.SettingMaxHeaderListSize: + updateFuncs = append(updateFuncs, func() { + t.maxSendHeaderListSize = new(uint32) + *t.maxSendHeaderListSize = s.Val + }) + default: + ss = append(ss, s) + } + return nil + }) + t.controlBuf.executeAndPut(func(interface{}) bool { + for _, f := range updateFuncs { + f() + } + return true + }, &incomingSettings{ + ss: ss, + }) +} + +const ( + maxPingStrikes = 2 + defaultPingTimeout = 2 * time.Hour +) + +func (t *http2Server) handlePing(f *http2.PingFrame) { + if f.IsAck() { + if f.Data == goAwayPing.data && t.drainChan != nil { + close(t.drainChan) + return + } + // Maybe it's a BDP ping. + if t.bdpEst != nil { + t.bdpEst.calculate(f.Data) + } + return + } + pingAck := &ping{ack: true} + copy(pingAck.data[:], f.Data[:]) + t.controlBuf.put(pingAck) + + now := time.Now() + defer func() { + t.lastPingAt = now + }() + // A reset ping strikes means that we don't need to check for policy + // violation for this ping and the pingStrikes counter should be set + // to 0. + if atomic.CompareAndSwapUint32(&t.resetPingStrikes, 1, 0) { + t.pingStrikes = 0 + return + } + t.mu.Lock() + ns := len(t.activeStreams) + t.mu.Unlock() + if ns < 1 && !t.kep.PermitWithoutStream { + // Keepalive shouldn't be active thus, this new ping should + // have come after at least defaultPingTimeout. + if t.lastPingAt.Add(defaultPingTimeout).After(now) { + t.pingStrikes++ + } + } else { + // Check if keepalive policy is respected. + if t.lastPingAt.Add(t.kep.MinTime).After(now) { + t.pingStrikes++ + } + } + + if t.pingStrikes > maxPingStrikes { + // Send goaway and close the connection. + errorf("transport: Got too many pings from the client, closing the connection.") + t.controlBuf.put(&goAway{code: http2.ErrCodeEnhanceYourCalm, debugData: []byte("too_many_pings"), closeConn: true}) + } +} + +func (t *http2Server) handleWindowUpdate(f *http2.WindowUpdateFrame) { + t.controlBuf.put(&incomingWindowUpdate{ + streamID: f.Header().StreamID, + increment: f.Increment, + }) +} + +func appendHeaderFieldsFromMD(headerFields []hpack.HeaderField, md metadata.MD) []hpack.HeaderField { + for k, vv := range md { + if isReservedHeader(k) { + // Clients don't tolerate reading restricted headers after some non restricted ones were sent. + continue + } + for _, v := range vv { + headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) + } + } + return headerFields +} + +func (t *http2Server) checkForHeaderListSize(it interface{}) bool { + if t.maxSendHeaderListSize == nil { + return true + } + hdrFrame := it.(*headerFrame) + var sz int64 + for _, f := range hdrFrame.hf { + if sz += int64(f.Size()); sz > int64(*t.maxSendHeaderListSize) { + errorf("header list size to send violates the maximum size (%d bytes) set by client", *t.maxSendHeaderListSize) + return false + } + } + return true +} + +// WriteHeader sends the header metadata md back to the client. +func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { + if s.updateHeaderSent() || s.getState() == streamDone { + return ErrIllegalHeaderWrite + } + s.hdrMu.Lock() + if md.Len() > 0 { + if s.header.Len() > 0 { + s.header = metadata.Join(s.header, md) + } else { + s.header = md + } + } + if err := t.writeHeaderLocked(s); err != nil { + s.hdrMu.Unlock() + return err + } + s.hdrMu.Unlock() + return nil +} + +func (t *http2Server) setResetPingStrikes() { + atomic.StoreUint32(&t.resetPingStrikes, 1) +} + +func (t *http2Server) writeHeaderLocked(s *Stream) error { + // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields + // first and create a slice of that exact size. + headerFields := make([]hpack.HeaderField, 0, 2) // at least :status, content-type will be there if none else. + headerFields = append(headerFields, hpack.HeaderField{Name: ":status", Value: "200"}) + headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: contentType(s.contentSubtype)}) + if s.sendCompress != "" { + headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: s.sendCompress}) + } + headerFields = appendHeaderFieldsFromMD(headerFields, s.header) + success, err := t.controlBuf.executeAndPut(t.checkForHeaderListSize, &headerFrame{ + streamID: s.id, + hf: headerFields, + endStream: false, + onWrite: t.setResetPingStrikes, + }) + if !success { + if err != nil { + return err + } + t.closeStream(s, true, http2.ErrCodeInternal, false) + return ErrHeaderListSizeLimitViolation + } + if t.stats != nil { + // Note: Headers are compressed with hpack after this call returns. + // No WireLength field is set here. + outHeader := &stats.OutHeader{ + Header: s.header.Copy(), + Compression: s.sendCompress, + } + t.stats.HandleRPC(s.Context(), outHeader) + } + return nil +} + +// WriteStatus sends stream status to the client and terminates the stream. +// There is no further I/O operations being able to perform on this stream. +// TODO(zhaoq): Now it indicates the end of entire stream. Revisit if early +// OK is adopted. +func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { + if s.getState() == streamDone { + return nil + } + s.hdrMu.Lock() + // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields + // first and create a slice of that exact size. + headerFields := make([]hpack.HeaderField, 0, 2) // grpc-status and grpc-message will be there if none else. + if !s.updateHeaderSent() { // No headers have been sent. + if len(s.header) > 0 { // Send a separate header frame. + if err := t.writeHeaderLocked(s); err != nil { + s.hdrMu.Unlock() + return err + } + } else { // Send a trailer only response. + headerFields = append(headerFields, hpack.HeaderField{Name: ":status", Value: "200"}) + headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: contentType(s.contentSubtype)}) + } + } + headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status", Value: strconv.Itoa(int(st.Code()))}) + headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-message", Value: encodeGrpcMessage(st.Message())}) + + if p := st.Proto(); p != nil && len(p.Details) > 0 { + stBytes, err := proto.Marshal(p) + if err != nil { + // TODO: return error instead, when callers are able to handle it. + grpclog.Errorf("transport: failed to marshal rpc status: %v, error: %v", p, err) + } else { + headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status-details-bin", Value: encodeBinHeader(stBytes)}) + } + } + + // Attach the trailer metadata. + headerFields = appendHeaderFieldsFromMD(headerFields, s.trailer) + trailingHeader := &headerFrame{ + streamID: s.id, + hf: headerFields, + endStream: true, + onWrite: t.setResetPingStrikes, + } + s.hdrMu.Unlock() + success, err := t.controlBuf.execute(t.checkForHeaderListSize, trailingHeader) + if !success { + if err != nil { + return err + } + t.closeStream(s, true, http2.ErrCodeInternal, false) + return ErrHeaderListSizeLimitViolation + } + // Send a RST_STREAM after the trailers if the client has not already half-closed. + rst := s.getState() == streamActive + t.finishStream(s, rst, http2.ErrCodeNo, trailingHeader, true) + if t.stats != nil { + // Note: The trailer fields are compressed with hpack after this call returns. + // No WireLength field is set here. + t.stats.HandleRPC(s.Context(), &stats.OutTrailer{ + Trailer: s.trailer.Copy(), + }) + } + return nil +} + +// Write converts the data into HTTP2 data frame and sends it out. Non-nil error +// is returns if it fails (e.g., framing error, transport error). +func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) error { + if !s.isHeaderSent() { // Headers haven't been written yet. + if err := t.WriteHeader(s, nil); err != nil { + if _, ok := err.(ConnectionError); ok { + return err + } + // TODO(mmukhi, dfawley): Make sure this is the right code to return. + return status.Errorf(codes.Internal, "transport: %v", err) + } + } else { + // Writing headers checks for this condition. + if s.getState() == streamDone { + // TODO(mmukhi, dfawley): Should the server write also return io.EOF? + s.cancel() + select { + case <-t.done: + return ErrConnClosing + default: + } + return ContextErr(s.ctx.Err()) + } + } + // Add some data to header frame so that we can equally distribute bytes across frames. + emptyLen := http2MaxFrameLen - len(hdr) + if emptyLen > len(data) { + emptyLen = len(data) + } + hdr = append(hdr, data[:emptyLen]...) + data = data[emptyLen:] + df := &dataFrame{ + streamID: s.id, + h: hdr, + d: data, + onEachWrite: t.setResetPingStrikes, + } + if err := s.wq.get(int32(len(hdr) + len(data))); err != nil { + select { + case <-t.done: + return ErrConnClosing + default: + } + return ContextErr(s.ctx.Err()) + } + return t.controlBuf.put(df) +} + +// keepalive running in a separate goroutine does the following: +// 1. Gracefully closes an idle connection after a duration of keepalive.MaxConnectionIdle. +// 2. Gracefully closes any connection after a duration of keepalive.MaxConnectionAge. +// 3. Forcibly closes a connection after an additive period of keepalive.MaxConnectionAgeGrace over keepalive.MaxConnectionAge. +// 4. Makes sure a connection is alive by sending pings with a frequency of keepalive.Time and closes a non-responsive connection +// after an additional duration of keepalive.Timeout. +func (t *http2Server) keepalive() { + p := &ping{} + // True iff a ping has been sent, and no data has been received since then. + outstandingPing := false + // Amount of time remaining before which we should receive an ACK for the + // last sent ping. + kpTimeoutLeft := time.Duration(0) + // Records the last value of t.lastRead before we go block on the timer. + // This is required to check for read activity since then. + prevNano := time.Now().UnixNano() + // Initialize the different timers to their default values. + idleTimer := time.NewTimer(t.kp.MaxConnectionIdle) + ageTimer := time.NewTimer(t.kp.MaxConnectionAge) + kpTimer := time.NewTimer(t.kp.Time) + defer func() { + // We need to drain the underlying channel in these timers after a call + // to Stop(), only if we are interested in resetting them. Clearly we + // are not interested in resetting them here. + idleTimer.Stop() + ageTimer.Stop() + kpTimer.Stop() + }() + + for { + select { + case <-idleTimer.C: + t.mu.Lock() + idle := t.idle + if idle.IsZero() { // The connection is non-idle. + t.mu.Unlock() + idleTimer.Reset(t.kp.MaxConnectionIdle) + continue + } + val := t.kp.MaxConnectionIdle - time.Since(idle) + t.mu.Unlock() + if val <= 0 { + // The connection has been idle for a duration of keepalive.MaxConnectionIdle or more. + // Gracefully close the connection. + t.drain(http2.ErrCodeNo, []byte{}) + return + } + idleTimer.Reset(val) + case <-ageTimer.C: + t.drain(http2.ErrCodeNo, []byte{}) + ageTimer.Reset(t.kp.MaxConnectionAgeGrace) + select { + case <-ageTimer.C: + // Close the connection after grace period. + infof("transport: closing server transport due to maximum connection age.") + t.Close() + case <-t.done: + } + return + case <-kpTimer.C: + lastRead := atomic.LoadInt64(&t.lastRead) + if lastRead > prevNano { + // There has been read activity since the last time we were + // here. Setup the timer to fire at kp.Time seconds from + // lastRead time and continue. + outstandingPing = false + kpTimer.Reset(time.Duration(lastRead) + t.kp.Time - time.Duration(time.Now().UnixNano())) + prevNano = lastRead + continue + } + if outstandingPing && kpTimeoutLeft <= 0 { + infof("transport: closing server transport due to idleness.") + t.Close() + return + } + if !outstandingPing { + if channelz.IsOn() { + atomic.AddInt64(&t.czData.kpCount, 1) + } + t.controlBuf.put(p) + kpTimeoutLeft = t.kp.Timeout + outstandingPing = true + } + // The amount of time to sleep here is the minimum of kp.Time and + // timeoutLeft. This will ensure that we wait only for kp.Time + // before sending out the next ping (for cases where the ping is + // acked). + sleepDuration := minTime(t.kp.Time, kpTimeoutLeft) + kpTimeoutLeft -= sleepDuration + kpTimer.Reset(sleepDuration) + case <-t.done: + return + } + } +} + +// Close starts shutting down the http2Server transport. +// TODO(zhaoq): Now the destruction is not blocked on any pending streams. This +// could cause some resource issue. Revisit this later. +func (t *http2Server) Close() error { + t.mu.Lock() + if t.state == closing { + t.mu.Unlock() + return errors.New("transport: Close() was already called") + } + t.state = closing + streams := t.activeStreams + t.activeStreams = nil + t.mu.Unlock() + t.controlBuf.finish() + close(t.done) + err := t.conn.Close() + if channelz.IsOn() { + channelz.RemoveEntry(t.channelzID) + } + // Cancel all active streams. + for _, s := range streams { + s.cancel() + } + if t.stats != nil { + connEnd := &stats.ConnEnd{} + t.stats.HandleConn(t.ctx, connEnd) + } + return err +} + +// deleteStream deletes the stream s from transport's active streams. +func (t *http2Server) deleteStream(s *Stream, eosReceived bool) { + // In case stream sending and receiving are invoked in separate + // goroutines (e.g., bi-directional streaming), cancel needs to be + // called to interrupt the potential blocking on other goroutines. + s.cancel() + + t.mu.Lock() + if _, ok := t.activeStreams[s.id]; ok { + delete(t.activeStreams, s.id) + if len(t.activeStreams) == 0 { + t.idle = time.Now() + } + } + t.mu.Unlock() + + if channelz.IsOn() { + if eosReceived { + atomic.AddInt64(&t.czData.streamsSucceeded, 1) + } else { + atomic.AddInt64(&t.czData.streamsFailed, 1) + } + } +} + +// finishStream closes the stream and puts the trailing headerFrame into controlbuf. +func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, hdr *headerFrame, eosReceived bool) { + oldState := s.swapState(streamDone) + if oldState == streamDone { + // If the stream was already done, return. + return + } + + hdr.cleanup = &cleanupStream{ + streamID: s.id, + rst: rst, + rstCode: rstCode, + onWrite: func() { + t.deleteStream(s, eosReceived) + }, + } + t.controlBuf.put(hdr) +} + +// closeStream clears the footprint of a stream when the stream is not needed any more. +func (t *http2Server) closeStream(s *Stream, rst bool, rstCode http2.ErrCode, eosReceived bool) { + s.swapState(streamDone) + t.deleteStream(s, eosReceived) + + t.controlBuf.put(&cleanupStream{ + streamID: s.id, + rst: rst, + rstCode: rstCode, + onWrite: func() {}, + }) +} + +func (t *http2Server) RemoteAddr() net.Addr { + return t.remoteAddr +} + +func (t *http2Server) Drain() { + t.drain(http2.ErrCodeNo, []byte{}) +} + +func (t *http2Server) drain(code http2.ErrCode, debugData []byte) { + t.mu.Lock() + defer t.mu.Unlock() + if t.drainChan != nil { + return + } + t.drainChan = make(chan struct{}) + t.controlBuf.put(&goAway{code: code, debugData: debugData, headsUp: true}) +} + +var goAwayPing = &ping{data: [8]byte{1, 6, 1, 8, 0, 3, 3, 9}} + +// Handles outgoing GoAway and returns true if loopy needs to put itself +// in draining mode. +func (t *http2Server) outgoingGoAwayHandler(g *goAway) (bool, error) { + t.mu.Lock() + if t.state == closing { // TODO(mmukhi): This seems unnecessary. + t.mu.Unlock() + // The transport is closing. + return false, ErrConnClosing + } + sid := t.maxStreamID + if !g.headsUp { + // Stop accepting more streams now. + t.state = draining + if len(t.activeStreams) == 0 { + g.closeConn = true + } + t.mu.Unlock() + if err := t.framer.fr.WriteGoAway(sid, g.code, g.debugData); err != nil { + return false, err + } + if g.closeConn { + // Abruptly close the connection following the GoAway (via + // loopywriter). But flush out what's inside the buffer first. + t.framer.writer.Flush() + return false, fmt.Errorf("transport: Connection closing") + } + return true, nil + } + t.mu.Unlock() + // For a graceful close, send out a GoAway with stream ID of MaxUInt32, + // Follow that with a ping and wait for the ack to come back or a timer + // to expire. During this time accept new streams since they might have + // originated before the GoAway reaches the client. + // After getting the ack or timer expiration send out another GoAway this + // time with an ID of the max stream server intends to process. + if err := t.framer.fr.WriteGoAway(math.MaxUint32, http2.ErrCodeNo, []byte{}); err != nil { + return false, err + } + if err := t.framer.fr.WritePing(false, goAwayPing.data); err != nil { + return false, err + } + go func() { + timer := time.NewTimer(time.Minute) + defer timer.Stop() + select { + case <-t.drainChan: + case <-timer.C: + case <-t.done: + return + } + t.controlBuf.put(&goAway{code: g.code, debugData: g.debugData}) + }() + return false, nil +} + +func (t *http2Server) ChannelzMetric() *channelz.SocketInternalMetric { + s := channelz.SocketInternalMetric{ + StreamsStarted: atomic.LoadInt64(&t.czData.streamsStarted), + StreamsSucceeded: atomic.LoadInt64(&t.czData.streamsSucceeded), + StreamsFailed: atomic.LoadInt64(&t.czData.streamsFailed), + MessagesSent: atomic.LoadInt64(&t.czData.msgSent), + MessagesReceived: atomic.LoadInt64(&t.czData.msgRecv), + KeepAlivesSent: atomic.LoadInt64(&t.czData.kpCount), + LastRemoteStreamCreatedTimestamp: time.Unix(0, atomic.LoadInt64(&t.czData.lastStreamCreatedTime)), + LastMessageSentTimestamp: time.Unix(0, atomic.LoadInt64(&t.czData.lastMsgSentTime)), + LastMessageReceivedTimestamp: time.Unix(0, atomic.LoadInt64(&t.czData.lastMsgRecvTime)), + LocalFlowControlWindow: int64(t.fc.getSize()), + SocketOptions: channelz.GetSocketOption(t.conn), + LocalAddr: t.localAddr, + RemoteAddr: t.remoteAddr, + // RemoteName : + } + if au, ok := t.authInfo.(credentials.ChannelzSecurityInfo); ok { + s.Security = au.GetSecurityValue() + } + s.RemoteFlowControlWindow = t.getOutFlowWindow() + return &s +} + +func (t *http2Server) IncrMsgSent() { + atomic.AddInt64(&t.czData.msgSent, 1) + atomic.StoreInt64(&t.czData.lastMsgSentTime, time.Now().UnixNano()) +} + +func (t *http2Server) IncrMsgRecv() { + atomic.AddInt64(&t.czData.msgRecv, 1) + atomic.StoreInt64(&t.czData.lastMsgRecvTime, time.Now().UnixNano()) +} + +func (t *http2Server) getOutFlowWindow() int64 { + resp := make(chan uint32, 1) + timer := time.NewTimer(time.Second) + defer timer.Stop() + t.controlBuf.put(&outFlowControlSizeRequest{resp}) + select { + case sz := <-resp: + return int64(sz) + case <-t.done: + return -1 + case <-timer.C: + return -2 + } +} + +func getJitter(v time.Duration) time.Duration { + if v == infinity { + return 0 + } + // Generate a jitter between +/- 10% of the value. + r := int64(v / 10) + j := grpcrand.Int63n(2*r) - r + return time.Duration(j) +} diff --git a/vendor/google.golang.org/grpc/internal/transport/http_util.go b/vendor/google.golang.org/grpc/internal/transport/http_util.go new file mode 100644 index 00000000..8f5f3349 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/http_util.go @@ -0,0 +1,677 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "bufio" + "bytes" + "encoding/base64" + "fmt" + "io" + "math" + "net" + "net/http" + "strconv" + "strings" + "time" + "unicode/utf8" + + "github.com/golang/protobuf/proto" + "golang.org/x/net/http2" + "golang.org/x/net/http2/hpack" + spb "google.golang.org/genproto/googleapis/rpc/status" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +const ( + // http2MaxFrameLen specifies the max length of a HTTP2 frame. + http2MaxFrameLen = 16384 // 16KB frame + // http://http2.github.io/http2-spec/#SettingValues + http2InitHeaderTableSize = 4096 + // baseContentType is the base content-type for gRPC. This is a valid + // content-type on it's own, but can also include a content-subtype such as + // "proto" as a suffix after "+" or ";". See + // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests + // for more details. + baseContentType = "application/grpc" +) + +var ( + clientPreface = []byte(http2.ClientPreface) + http2ErrConvTab = map[http2.ErrCode]codes.Code{ + http2.ErrCodeNo: codes.Internal, + http2.ErrCodeProtocol: codes.Internal, + http2.ErrCodeInternal: codes.Internal, + http2.ErrCodeFlowControl: codes.ResourceExhausted, + http2.ErrCodeSettingsTimeout: codes.Internal, + http2.ErrCodeStreamClosed: codes.Internal, + http2.ErrCodeFrameSize: codes.Internal, + http2.ErrCodeRefusedStream: codes.Unavailable, + http2.ErrCodeCancel: codes.Canceled, + http2.ErrCodeCompression: codes.Internal, + http2.ErrCodeConnect: codes.Internal, + http2.ErrCodeEnhanceYourCalm: codes.ResourceExhausted, + http2.ErrCodeInadequateSecurity: codes.PermissionDenied, + http2.ErrCodeHTTP11Required: codes.Internal, + } + statusCodeConvTab = map[codes.Code]http2.ErrCode{ + codes.Internal: http2.ErrCodeInternal, + codes.Canceled: http2.ErrCodeCancel, + codes.Unavailable: http2.ErrCodeRefusedStream, + codes.ResourceExhausted: http2.ErrCodeEnhanceYourCalm, + codes.PermissionDenied: http2.ErrCodeInadequateSecurity, + } + // HTTPStatusConvTab is the HTTP status code to gRPC error code conversion table. + HTTPStatusConvTab = map[int]codes.Code{ + // 400 Bad Request - INTERNAL. + http.StatusBadRequest: codes.Internal, + // 401 Unauthorized - UNAUTHENTICATED. + http.StatusUnauthorized: codes.Unauthenticated, + // 403 Forbidden - PERMISSION_DENIED. + http.StatusForbidden: codes.PermissionDenied, + // 404 Not Found - UNIMPLEMENTED. + http.StatusNotFound: codes.Unimplemented, + // 429 Too Many Requests - UNAVAILABLE. + http.StatusTooManyRequests: codes.Unavailable, + // 502 Bad Gateway - UNAVAILABLE. + http.StatusBadGateway: codes.Unavailable, + // 503 Service Unavailable - UNAVAILABLE. + http.StatusServiceUnavailable: codes.Unavailable, + // 504 Gateway timeout - UNAVAILABLE. + http.StatusGatewayTimeout: codes.Unavailable, + } +) + +type parsedHeaderData struct { + encoding string + // statusGen caches the stream status received from the trailer the server + // sent. Client side only. Do not access directly. After all trailers are + // parsed, use the status method to retrieve the status. + statusGen *status.Status + // rawStatusCode and rawStatusMsg are set from the raw trailer fields and are not + // intended for direct access outside of parsing. + rawStatusCode *int + rawStatusMsg string + httpStatus *int + // Server side only fields. + timeoutSet bool + timeout time.Duration + method string + // key-value metadata map from the peer. + mdata map[string][]string + statsTags []byte + statsTrace []byte + contentSubtype string + + // isGRPC field indicates whether the peer is speaking gRPC (otherwise HTTP). + // + // We are in gRPC mode (peer speaking gRPC) if: + // * We are client side and have already received a HEADER frame that indicates gRPC peer. + // * The header contains valid a content-type, i.e. a string starts with "application/grpc" + // And we should handle error specific to gRPC. + // + // Otherwise (i.e. a content-type string starts without "application/grpc", or does not exist), we + // are in HTTP fallback mode, and should handle error specific to HTTP. + isGRPC bool + grpcErr error + httpErr error + contentTypeErr string +} + +// decodeState configures decoding criteria and records the decoded data. +type decodeState struct { + // whether decoding on server side or not + serverSide bool + + // Records the states during HPACK decoding. It will be filled with info parsed from HTTP HEADERS + // frame once decodeHeader function has been invoked and returned. + data parsedHeaderData +} + +// isReservedHeader checks whether hdr belongs to HTTP2 headers +// reserved by gRPC protocol. Any other headers are classified as the +// user-specified metadata. +func isReservedHeader(hdr string) bool { + if hdr != "" && hdr[0] == ':' { + return true + } + switch hdr { + case "content-type", + "user-agent", + "grpc-message-type", + "grpc-encoding", + "grpc-message", + "grpc-status", + "grpc-timeout", + "grpc-status-details-bin", + // Intentionally exclude grpc-previous-rpc-attempts and + // grpc-retry-pushback-ms, which are "reserved", but their API + // intentionally works via metadata. + "te": + return true + default: + return false + } +} + +// isWhitelistedHeader checks whether hdr should be propagated into metadata +// visible to users, even though it is classified as "reserved", above. +func isWhitelistedHeader(hdr string) bool { + switch hdr { + case ":authority", "user-agent": + return true + default: + return false + } +} + +// contentSubtype returns the content-subtype for the given content-type. The +// given content-type must be a valid content-type that starts with +// "application/grpc". A content-subtype will follow "application/grpc" after a +// "+" or ";". See +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. +// +// If contentType is not a valid content-type for gRPC, the boolean +// will be false, otherwise true. If content-type == "application/grpc", +// "application/grpc+", or "application/grpc;", the boolean will be true, +// but no content-subtype will be returned. +// +// contentType is assumed to be lowercase already. +func contentSubtype(contentType string) (string, bool) { + if contentType == baseContentType { + return "", true + } + if !strings.HasPrefix(contentType, baseContentType) { + return "", false + } + // guaranteed since != baseContentType and has baseContentType prefix + switch contentType[len(baseContentType)] { + case '+', ';': + // this will return true for "application/grpc+" or "application/grpc;" + // which the previous validContentType function tested to be valid, so we + // just say that no content-subtype is specified in this case + return contentType[len(baseContentType)+1:], true + default: + return "", false + } +} + +// contentSubtype is assumed to be lowercase +func contentType(contentSubtype string) string { + if contentSubtype == "" { + return baseContentType + } + return baseContentType + "+" + contentSubtype +} + +func (d *decodeState) status() *status.Status { + if d.data.statusGen == nil { + // No status-details were provided; generate status using code/msg. + d.data.statusGen = status.New(codes.Code(int32(*(d.data.rawStatusCode))), d.data.rawStatusMsg) + } + return d.data.statusGen +} + +const binHdrSuffix = "-bin" + +func encodeBinHeader(v []byte) string { + return base64.RawStdEncoding.EncodeToString(v) +} + +func decodeBinHeader(v string) ([]byte, error) { + if len(v)%4 == 0 { + // Input was padded, or padding was not necessary. + return base64.StdEncoding.DecodeString(v) + } + return base64.RawStdEncoding.DecodeString(v) +} + +func encodeMetadataHeader(k, v string) string { + if strings.HasSuffix(k, binHdrSuffix) { + return encodeBinHeader(([]byte)(v)) + } + return v +} + +func decodeMetadataHeader(k, v string) (string, error) { + if strings.HasSuffix(k, binHdrSuffix) { + b, err := decodeBinHeader(v) + return string(b), err + } + return v, nil +} + +func (d *decodeState) decodeHeader(frame *http2.MetaHeadersFrame) error { + // frame.Truncated is set to true when framer detects that the current header + // list size hits MaxHeaderListSize limit. + if frame.Truncated { + return status.Error(codes.Internal, "peer header list size exceeded limit") + } + + for _, hf := range frame.Fields { + d.processHeaderField(hf) + } + + if d.data.isGRPC { + if d.data.grpcErr != nil { + return d.data.grpcErr + } + if d.serverSide { + return nil + } + if d.data.rawStatusCode == nil && d.data.statusGen == nil { + // gRPC status doesn't exist. + // Set rawStatusCode to be unknown and return nil error. + // So that, if the stream has ended this Unknown status + // will be propagated to the user. + // Otherwise, it will be ignored. In which case, status from + // a later trailer, that has StreamEnded flag set, is propagated. + code := int(codes.Unknown) + d.data.rawStatusCode = &code + } + return nil + } + + // HTTP fallback mode + if d.data.httpErr != nil { + return d.data.httpErr + } + + var ( + code = codes.Internal // when header does not include HTTP status, return INTERNAL + ok bool + ) + + if d.data.httpStatus != nil { + code, ok = HTTPStatusConvTab[*(d.data.httpStatus)] + if !ok { + code = codes.Unknown + } + } + + return status.Error(code, d.constructHTTPErrMsg()) +} + +// constructErrMsg constructs error message to be returned in HTTP fallback mode. +// Format: HTTP status code and its corresponding message + content-type error message. +func (d *decodeState) constructHTTPErrMsg() string { + var errMsgs []string + + if d.data.httpStatus == nil { + errMsgs = append(errMsgs, "malformed header: missing HTTP status") + } else { + errMsgs = append(errMsgs, fmt.Sprintf("%s: HTTP status code %d", http.StatusText(*(d.data.httpStatus)), *d.data.httpStatus)) + } + + if d.data.contentTypeErr == "" { + errMsgs = append(errMsgs, "transport: missing content-type field") + } else { + errMsgs = append(errMsgs, d.data.contentTypeErr) + } + + return strings.Join(errMsgs, "; ") +} + +func (d *decodeState) addMetadata(k, v string) { + if d.data.mdata == nil { + d.data.mdata = make(map[string][]string) + } + d.data.mdata[k] = append(d.data.mdata[k], v) +} + +func (d *decodeState) processHeaderField(f hpack.HeaderField) { + switch f.Name { + case "content-type": + contentSubtype, validContentType := contentSubtype(f.Value) + if !validContentType { + d.data.contentTypeErr = fmt.Sprintf("transport: received the unexpected content-type %q", f.Value) + return + } + d.data.contentSubtype = contentSubtype + // TODO: do we want to propagate the whole content-type in the metadata, + // or come up with a way to just propagate the content-subtype if it was set? + // ie {"content-type": "application/grpc+proto"} or {"content-subtype": "proto"} + // in the metadata? + d.addMetadata(f.Name, f.Value) + d.data.isGRPC = true + case "grpc-encoding": + d.data.encoding = f.Value + case "grpc-status": + code, err := strconv.Atoi(f.Value) + if err != nil { + d.data.grpcErr = status.Errorf(codes.Internal, "transport: malformed grpc-status: %v", err) + return + } + d.data.rawStatusCode = &code + case "grpc-message": + d.data.rawStatusMsg = decodeGrpcMessage(f.Value) + case "grpc-status-details-bin": + v, err := decodeBinHeader(f.Value) + if err != nil { + d.data.grpcErr = status.Errorf(codes.Internal, "transport: malformed grpc-status-details-bin: %v", err) + return + } + s := &spb.Status{} + if err := proto.Unmarshal(v, s); err != nil { + d.data.grpcErr = status.Errorf(codes.Internal, "transport: malformed grpc-status-details-bin: %v", err) + return + } + d.data.statusGen = status.FromProto(s) + case "grpc-timeout": + d.data.timeoutSet = true + var err error + if d.data.timeout, err = decodeTimeout(f.Value); err != nil { + d.data.grpcErr = status.Errorf(codes.Internal, "transport: malformed time-out: %v", err) + } + case ":path": + d.data.method = f.Value + case ":status": + code, err := strconv.Atoi(f.Value) + if err != nil { + d.data.httpErr = status.Errorf(codes.Internal, "transport: malformed http-status: %v", err) + return + } + d.data.httpStatus = &code + case "grpc-tags-bin": + v, err := decodeBinHeader(f.Value) + if err != nil { + d.data.grpcErr = status.Errorf(codes.Internal, "transport: malformed grpc-tags-bin: %v", err) + return + } + d.data.statsTags = v + d.addMetadata(f.Name, string(v)) + case "grpc-trace-bin": + v, err := decodeBinHeader(f.Value) + if err != nil { + d.data.grpcErr = status.Errorf(codes.Internal, "transport: malformed grpc-trace-bin: %v", err) + return + } + d.data.statsTrace = v + d.addMetadata(f.Name, string(v)) + default: + if isReservedHeader(f.Name) && !isWhitelistedHeader(f.Name) { + break + } + v, err := decodeMetadataHeader(f.Name, f.Value) + if err != nil { + errorf("Failed to decode metadata header (%q, %q): %v", f.Name, f.Value, err) + return + } + d.addMetadata(f.Name, v) + } +} + +type timeoutUnit uint8 + +const ( + hour timeoutUnit = 'H' + minute timeoutUnit = 'M' + second timeoutUnit = 'S' + millisecond timeoutUnit = 'm' + microsecond timeoutUnit = 'u' + nanosecond timeoutUnit = 'n' +) + +func timeoutUnitToDuration(u timeoutUnit) (d time.Duration, ok bool) { + switch u { + case hour: + return time.Hour, true + case minute: + return time.Minute, true + case second: + return time.Second, true + case millisecond: + return time.Millisecond, true + case microsecond: + return time.Microsecond, true + case nanosecond: + return time.Nanosecond, true + default: + } + return +} + +const maxTimeoutValue int64 = 100000000 - 1 + +// div does integer division and round-up the result. Note that this is +// equivalent to (d+r-1)/r but has less chance to overflow. +func div(d, r time.Duration) int64 { + if m := d % r; m > 0 { + return int64(d/r + 1) + } + return int64(d / r) +} + +// TODO(zhaoq): It is the simplistic and not bandwidth efficient. Improve it. +func encodeTimeout(t time.Duration) string { + if t <= 0 { + return "0n" + } + if d := div(t, time.Nanosecond); d <= maxTimeoutValue { + return strconv.FormatInt(d, 10) + "n" + } + if d := div(t, time.Microsecond); d <= maxTimeoutValue { + return strconv.FormatInt(d, 10) + "u" + } + if d := div(t, time.Millisecond); d <= maxTimeoutValue { + return strconv.FormatInt(d, 10) + "m" + } + if d := div(t, time.Second); d <= maxTimeoutValue { + return strconv.FormatInt(d, 10) + "S" + } + if d := div(t, time.Minute); d <= maxTimeoutValue { + return strconv.FormatInt(d, 10) + "M" + } + // Note that maxTimeoutValue * time.Hour > MaxInt64. + return strconv.FormatInt(div(t, time.Hour), 10) + "H" +} + +func decodeTimeout(s string) (time.Duration, error) { + size := len(s) + if size < 2 { + return 0, fmt.Errorf("transport: timeout string is too short: %q", s) + } + if size > 9 { + // Spec allows for 8 digits plus the unit. + return 0, fmt.Errorf("transport: timeout string is too long: %q", s) + } + unit := timeoutUnit(s[size-1]) + d, ok := timeoutUnitToDuration(unit) + if !ok { + return 0, fmt.Errorf("transport: timeout unit is not recognized: %q", s) + } + t, err := strconv.ParseInt(s[:size-1], 10, 64) + if err != nil { + return 0, err + } + const maxHours = math.MaxInt64 / int64(time.Hour) + if d == time.Hour && t > maxHours { + // This timeout would overflow math.MaxInt64; clamp it. + return time.Duration(math.MaxInt64), nil + } + return d * time.Duration(t), nil +} + +const ( + spaceByte = ' ' + tildeByte = '~' + percentByte = '%' +) + +// encodeGrpcMessage is used to encode status code in header field +// "grpc-message". It does percent encoding and also replaces invalid utf-8 +// characters with Unicode replacement character. +// +// It checks to see if each individual byte in msg is an allowable byte, and +// then either percent encoding or passing it through. When percent encoding, +// the byte is converted into hexadecimal notation with a '%' prepended. +func encodeGrpcMessage(msg string) string { + if msg == "" { + return "" + } + lenMsg := len(msg) + for i := 0; i < lenMsg; i++ { + c := msg[i] + if !(c >= spaceByte && c <= tildeByte && c != percentByte) { + return encodeGrpcMessageUnchecked(msg) + } + } + return msg +} + +func encodeGrpcMessageUnchecked(msg string) string { + var buf bytes.Buffer + for len(msg) > 0 { + r, size := utf8.DecodeRuneInString(msg) + for _, b := range []byte(string(r)) { + if size > 1 { + // If size > 1, r is not ascii. Always do percent encoding. + buf.WriteString(fmt.Sprintf("%%%02X", b)) + continue + } + + // The for loop is necessary even if size == 1. r could be + // utf8.RuneError. + // + // fmt.Sprintf("%%%02X", utf8.RuneError) gives "%FFFD". + if b >= spaceByte && b <= tildeByte && b != percentByte { + buf.WriteByte(b) + } else { + buf.WriteString(fmt.Sprintf("%%%02X", b)) + } + } + msg = msg[size:] + } + return buf.String() +} + +// decodeGrpcMessage decodes the msg encoded by encodeGrpcMessage. +func decodeGrpcMessage(msg string) string { + if msg == "" { + return "" + } + lenMsg := len(msg) + for i := 0; i < lenMsg; i++ { + if msg[i] == percentByte && i+2 < lenMsg { + return decodeGrpcMessageUnchecked(msg) + } + } + return msg +} + +func decodeGrpcMessageUnchecked(msg string) string { + var buf bytes.Buffer + lenMsg := len(msg) + for i := 0; i < lenMsg; i++ { + c := msg[i] + if c == percentByte && i+2 < lenMsg { + parsed, err := strconv.ParseUint(msg[i+1:i+3], 16, 8) + if err != nil { + buf.WriteByte(c) + } else { + buf.WriteByte(byte(parsed)) + i += 2 + } + } else { + buf.WriteByte(c) + } + } + return buf.String() +} + +type bufWriter struct { + buf []byte + offset int + batchSize int + conn net.Conn + err error + + onFlush func() +} + +func newBufWriter(conn net.Conn, batchSize int) *bufWriter { + return &bufWriter{ + buf: make([]byte, batchSize*2), + batchSize: batchSize, + conn: conn, + } +} + +func (w *bufWriter) Write(b []byte) (n int, err error) { + if w.err != nil { + return 0, w.err + } + if w.batchSize == 0 { // Buffer has been disabled. + return w.conn.Write(b) + } + for len(b) > 0 { + nn := copy(w.buf[w.offset:], b) + b = b[nn:] + w.offset += nn + n += nn + if w.offset >= w.batchSize { + err = w.Flush() + } + } + return n, err +} + +func (w *bufWriter) Flush() error { + if w.err != nil { + return w.err + } + if w.offset == 0 { + return nil + } + if w.onFlush != nil { + w.onFlush() + } + _, w.err = w.conn.Write(w.buf[:w.offset]) + w.offset = 0 + return w.err +} + +type framer struct { + writer *bufWriter + fr *http2.Framer +} + +func newFramer(conn net.Conn, writeBufferSize, readBufferSize int, maxHeaderListSize uint32) *framer { + if writeBufferSize < 0 { + writeBufferSize = 0 + } + var r io.Reader = conn + if readBufferSize > 0 { + r = bufio.NewReaderSize(r, readBufferSize) + } + w := newBufWriter(conn, writeBufferSize) + f := &framer{ + writer: w, + fr: http2.NewFramer(w, r), + } + f.fr.SetMaxReadFrameSize(http2MaxFrameLen) + // Opt-in to Frame reuse API on framer to reduce garbage. + // Frames aren't safe to read from after a subsequent call to ReadFrame. + f.fr.SetReuseFrames() + f.fr.MaxHeaderListSize = maxHeaderListSize + f.fr.ReadMetaHeaders = hpack.NewDecoder(http2InitHeaderTableSize, nil) + return f +} diff --git a/vendor/google.golang.org/grpc/internal/transport/log.go b/vendor/google.golang.org/grpc/internal/transport/log.go new file mode 100644 index 00000000..879df80c --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/log.go @@ -0,0 +1,44 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// This file contains wrappers for grpclog functions. +// The transport package only logs to verbose level 2 by default. + +package transport + +import "google.golang.org/grpc/grpclog" + +const logLevel = 2 + +func infof(format string, args ...interface{}) { + if grpclog.V(logLevel) { + grpclog.Infof(format, args...) + } +} + +func warningf(format string, args ...interface{}) { + if grpclog.V(logLevel) { + grpclog.Warningf(format, args...) + } +} + +func errorf(format string, args ...interface{}) { + if grpclog.V(logLevel) { + grpclog.Errorf(format, args...) + } +} diff --git a/vendor/google.golang.org/grpc/internal/transport/transport.go b/vendor/google.golang.org/grpc/internal/transport/transport.go new file mode 100644 index 00000000..a30da9eb --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/transport.go @@ -0,0 +1,808 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package transport defines and implements message oriented communication +// channel to complete various transactions (e.g., an RPC). It is meant for +// grpc-internal usage and is not intended to be imported directly by users. +package transport + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "net" + "sync" + "sync/atomic" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" + "google.golang.org/grpc/tap" +) + +type bufferPool struct { + pool sync.Pool +} + +func newBufferPool() *bufferPool { + return &bufferPool{ + pool: sync.Pool{ + New: func() interface{} { + return new(bytes.Buffer) + }, + }, + } +} + +func (p *bufferPool) get() *bytes.Buffer { + return p.pool.Get().(*bytes.Buffer) +} + +func (p *bufferPool) put(b *bytes.Buffer) { + p.pool.Put(b) +} + +// recvMsg represents the received msg from the transport. All transport +// protocol specific info has been removed. +type recvMsg struct { + buffer *bytes.Buffer + // nil: received some data + // io.EOF: stream is completed. data is nil. + // other non-nil error: transport failure. data is nil. + err error +} + +// recvBuffer is an unbounded channel of recvMsg structs. +// +// Note: recvBuffer differs from buffer.Unbounded only in the fact that it +// holds a channel of recvMsg structs instead of objects implementing "item" +// interface. recvBuffer is written to much more often and using strict recvMsg +// structs helps avoid allocation in "recvBuffer.put" +type recvBuffer struct { + c chan recvMsg + mu sync.Mutex + backlog []recvMsg + err error +} + +func newRecvBuffer() *recvBuffer { + b := &recvBuffer{ + c: make(chan recvMsg, 1), + } + return b +} + +func (b *recvBuffer) put(r recvMsg) { + b.mu.Lock() + if b.err != nil { + b.mu.Unlock() + // An error had occurred earlier, don't accept more + // data or errors. + return + } + b.err = r.err + if len(b.backlog) == 0 { + select { + case b.c <- r: + b.mu.Unlock() + return + default: + } + } + b.backlog = append(b.backlog, r) + b.mu.Unlock() +} + +func (b *recvBuffer) load() { + b.mu.Lock() + if len(b.backlog) > 0 { + select { + case b.c <- b.backlog[0]: + b.backlog[0] = recvMsg{} + b.backlog = b.backlog[1:] + default: + } + } + b.mu.Unlock() +} + +// get returns the channel that receives a recvMsg in the buffer. +// +// Upon receipt of a recvMsg, the caller should call load to send another +// recvMsg onto the channel if there is any. +func (b *recvBuffer) get() <-chan recvMsg { + return b.c +} + +// recvBufferReader implements io.Reader interface to read the data from +// recvBuffer. +type recvBufferReader struct { + closeStream func(error) // Closes the client transport stream with the given error and nil trailer metadata. + ctx context.Context + ctxDone <-chan struct{} // cache of ctx.Done() (for performance). + recv *recvBuffer + last *bytes.Buffer // Stores the remaining data in the previous calls. + err error + freeBuffer func(*bytes.Buffer) +} + +// Read reads the next len(p) bytes from last. If last is drained, it tries to +// read additional data from recv. It blocks if there no additional data available +// in recv. If Read returns any non-nil error, it will continue to return that error. +func (r *recvBufferReader) Read(p []byte) (n int, err error) { + if r.err != nil { + return 0, r.err + } + if r.last != nil { + // Read remaining data left in last call. + copied, _ := r.last.Read(p) + if r.last.Len() == 0 { + r.freeBuffer(r.last) + r.last = nil + } + return copied, nil + } + if r.closeStream != nil { + n, r.err = r.readClient(p) + } else { + n, r.err = r.read(p) + } + return n, r.err +} + +func (r *recvBufferReader) read(p []byte) (n int, err error) { + select { + case <-r.ctxDone: + return 0, ContextErr(r.ctx.Err()) + case m := <-r.recv.get(): + return r.readAdditional(m, p) + } +} + +func (r *recvBufferReader) readClient(p []byte) (n int, err error) { + // If the context is canceled, then closes the stream with nil metadata. + // closeStream writes its error parameter to r.recv as a recvMsg. + // r.readAdditional acts on that message and returns the necessary error. + select { + case <-r.ctxDone: + // Note that this adds the ctx error to the end of recv buffer, and + // reads from the head. This will delay the error until recv buffer is + // empty, thus will delay ctx cancellation in Recv(). + // + // It's done this way to fix a race between ctx cancel and trailer. The + // race was, stream.Recv() may return ctx error if ctxDone wins the + // race, but stream.Trailer() may return a non-nil md because the stream + // was not marked as done when trailer is received. This closeStream + // call will mark stream as done, thus fix the race. + // + // TODO: delaying ctx error seems like a unnecessary side effect. What + // we really want is to mark the stream as done, and return ctx error + // faster. + r.closeStream(ContextErr(r.ctx.Err())) + m := <-r.recv.get() + return r.readAdditional(m, p) + case m := <-r.recv.get(): + return r.readAdditional(m, p) + } +} + +func (r *recvBufferReader) readAdditional(m recvMsg, p []byte) (n int, err error) { + r.recv.load() + if m.err != nil { + return 0, m.err + } + copied, _ := m.buffer.Read(p) + if m.buffer.Len() == 0 { + r.freeBuffer(m.buffer) + r.last = nil + } else { + r.last = m.buffer + } + return copied, nil +} + +type streamState uint32 + +const ( + streamActive streamState = iota + streamWriteDone // EndStream sent + streamReadDone // EndStream received + streamDone // the entire stream is finished. +) + +// Stream represents an RPC in the transport layer. +type Stream struct { + id uint32 + st ServerTransport // nil for client side Stream + ct *http2Client // nil for server side Stream + ctx context.Context // the associated context of the stream + cancel context.CancelFunc // always nil for client side Stream + done chan struct{} // closed at the end of stream to unblock writers. On the client side. + ctxDone <-chan struct{} // same as done chan but for server side. Cache of ctx.Done() (for performance) + method string // the associated RPC method of the stream + recvCompress string + sendCompress string + buf *recvBuffer + trReader io.Reader + fc *inFlow + wq *writeQuota + + // Callback to state application's intentions to read data. This + // is used to adjust flow control, if needed. + requestRead func(int) + + headerChan chan struct{} // closed to indicate the end of header metadata. + headerChanClosed uint32 // set when headerChan is closed. Used to avoid closing headerChan multiple times. + // headerValid indicates whether a valid header was received. Only + // meaningful after headerChan is closed (always call waitOnHeader() before + // reading its value). Not valid on server side. + headerValid bool + + // hdrMu protects header and trailer metadata on the server-side. + hdrMu sync.Mutex + // On client side, header keeps the received header metadata. + // + // On server side, header keeps the header set by SetHeader(). The complete + // header will merged into this after t.WriteHeader() is called. + header metadata.MD + trailer metadata.MD // the key-value map of trailer metadata. + + noHeaders bool // set if the client never received headers (set only after the stream is done). + + // On the server-side, headerSent is atomically set to 1 when the headers are sent out. + headerSent uint32 + + state streamState + + // On client-side it is the status error received from the server. + // On server-side it is unused. + status *status.Status + + bytesReceived uint32 // indicates whether any bytes have been received on this stream + unprocessed uint32 // set if the server sends a refused stream or GOAWAY including this stream + + // contentSubtype is the content-subtype for requests. + // this must be lowercase or the behavior is undefined. + contentSubtype string +} + +// isHeaderSent is only valid on the server-side. +func (s *Stream) isHeaderSent() bool { + return atomic.LoadUint32(&s.headerSent) == 1 +} + +// updateHeaderSent updates headerSent and returns true +// if it was alreay set. It is valid only on server-side. +func (s *Stream) updateHeaderSent() bool { + return atomic.SwapUint32(&s.headerSent, 1) == 1 +} + +func (s *Stream) swapState(st streamState) streamState { + return streamState(atomic.SwapUint32((*uint32)(&s.state), uint32(st))) +} + +func (s *Stream) compareAndSwapState(oldState, newState streamState) bool { + return atomic.CompareAndSwapUint32((*uint32)(&s.state), uint32(oldState), uint32(newState)) +} + +func (s *Stream) getState() streamState { + return streamState(atomic.LoadUint32((*uint32)(&s.state))) +} + +func (s *Stream) waitOnHeader() { + if s.headerChan == nil { + // On the server headerChan is always nil since a stream originates + // only after having received headers. + return + } + select { + case <-s.ctx.Done(): + // Close the stream to prevent headers/trailers from changing after + // this function returns. + s.ct.CloseStream(s, ContextErr(s.ctx.Err())) + // headerChan could possibly not be closed yet if closeStream raced + // with operateHeaders; wait until it is closed explicitly here. + <-s.headerChan + case <-s.headerChan: + } +} + +// RecvCompress returns the compression algorithm applied to the inbound +// message. It is empty string if there is no compression applied. +func (s *Stream) RecvCompress() string { + s.waitOnHeader() + return s.recvCompress +} + +// SetSendCompress sets the compression algorithm to the stream. +func (s *Stream) SetSendCompress(str string) { + s.sendCompress = str +} + +// Done returns a channel which is closed when it receives the final status +// from the server. +func (s *Stream) Done() <-chan struct{} { + return s.done +} + +// Header returns the header metadata of the stream. +// +// On client side, it acquires the key-value pairs of header metadata once it is +// available. It blocks until i) the metadata is ready or ii) there is no header +// metadata or iii) the stream is canceled/expired. +// +// On server side, it returns the out header after t.WriteHeader is called. It +// does not block and must not be called until after WriteHeader. +func (s *Stream) Header() (metadata.MD, error) { + if s.headerChan == nil { + // On server side, return the header in stream. It will be the out + // header after t.WriteHeader is called. + return s.header.Copy(), nil + } + s.waitOnHeader() + if !s.headerValid { + return nil, s.status.Err() + } + return s.header.Copy(), nil +} + +// TrailersOnly blocks until a header or trailers-only frame is received and +// then returns true if the stream was trailers-only. If the stream ends +// before headers are received, returns true, nil. Client-side only. +func (s *Stream) TrailersOnly() bool { + s.waitOnHeader() + return s.noHeaders +} + +// Trailer returns the cached trailer metedata. Note that if it is not called +// after the entire stream is done, it could return an empty MD. Client +// side only. +// It can be safely read only after stream has ended that is either read +// or write have returned io.EOF. +func (s *Stream) Trailer() metadata.MD { + c := s.trailer.Copy() + return c +} + +// ContentSubtype returns the content-subtype for a request. For example, a +// content-subtype of "proto" will result in a content-type of +// "application/grpc+proto". This will always be lowercase. See +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. +func (s *Stream) ContentSubtype() string { + return s.contentSubtype +} + +// Context returns the context of the stream. +func (s *Stream) Context() context.Context { + return s.ctx +} + +// Method returns the method for the stream. +func (s *Stream) Method() string { + return s.method +} + +// Status returns the status received from the server. +// Status can be read safely only after the stream has ended, +// that is, after Done() is closed. +func (s *Stream) Status() *status.Status { + return s.status +} + +// SetHeader sets the header metadata. This can be called multiple times. +// Server side only. +// This should not be called in parallel to other data writes. +func (s *Stream) SetHeader(md metadata.MD) error { + if md.Len() == 0 { + return nil + } + if s.isHeaderSent() || s.getState() == streamDone { + return ErrIllegalHeaderWrite + } + s.hdrMu.Lock() + s.header = metadata.Join(s.header, md) + s.hdrMu.Unlock() + return nil +} + +// SendHeader sends the given header metadata. The given metadata is +// combined with any metadata set by previous calls to SetHeader and +// then written to the transport stream. +func (s *Stream) SendHeader(md metadata.MD) error { + return s.st.WriteHeader(s, md) +} + +// SetTrailer sets the trailer metadata which will be sent with the RPC status +// by the server. This can be called multiple times. Server side only. +// This should not be called parallel to other data writes. +func (s *Stream) SetTrailer(md metadata.MD) error { + if md.Len() == 0 { + return nil + } + if s.getState() == streamDone { + return ErrIllegalHeaderWrite + } + s.hdrMu.Lock() + s.trailer = metadata.Join(s.trailer, md) + s.hdrMu.Unlock() + return nil +} + +func (s *Stream) write(m recvMsg) { + s.buf.put(m) +} + +// Read reads all p bytes from the wire for this stream. +func (s *Stream) Read(p []byte) (n int, err error) { + // Don't request a read if there was an error earlier + if er := s.trReader.(*transportReader).er; er != nil { + return 0, er + } + s.requestRead(len(p)) + return io.ReadFull(s.trReader, p) +} + +// tranportReader reads all the data available for this Stream from the transport and +// passes them into the decoder, which converts them into a gRPC message stream. +// The error is io.EOF when the stream is done or another non-nil error if +// the stream broke. +type transportReader struct { + reader io.Reader + // The handler to control the window update procedure for both this + // particular stream and the associated transport. + windowHandler func(int) + er error +} + +func (t *transportReader) Read(p []byte) (n int, err error) { + n, err = t.reader.Read(p) + if err != nil { + t.er = err + return + } + t.windowHandler(n) + return +} + +// BytesReceived indicates whether any bytes have been received on this stream. +func (s *Stream) BytesReceived() bool { + return atomic.LoadUint32(&s.bytesReceived) == 1 +} + +// Unprocessed indicates whether the server did not process this stream -- +// i.e. it sent a refused stream or GOAWAY including this stream ID. +func (s *Stream) Unprocessed() bool { + return atomic.LoadUint32(&s.unprocessed) == 1 +} + +// GoString is implemented by Stream so context.String() won't +// race when printing %#v. +func (s *Stream) GoString() string { + return fmt.Sprintf("", s, s.method) +} + +// state of transport +type transportState int + +const ( + reachable transportState = iota + closing + draining +) + +// ServerConfig consists of all the configurations to establish a server transport. +type ServerConfig struct { + MaxStreams uint32 + AuthInfo credentials.AuthInfo + InTapHandle tap.ServerInHandle + StatsHandler stats.Handler + KeepaliveParams keepalive.ServerParameters + KeepalivePolicy keepalive.EnforcementPolicy + InitialWindowSize int32 + InitialConnWindowSize int32 + WriteBufferSize int + ReadBufferSize int + ChannelzParentID int64 + MaxHeaderListSize *uint32 + HeaderTableSize *uint32 +} + +// NewServerTransport creates a ServerTransport with conn or non-nil error +// if it fails. +func NewServerTransport(protocol string, conn net.Conn, config *ServerConfig) (ServerTransport, error) { + return newHTTP2Server(conn, config) +} + +// ConnectOptions covers all relevant options for communicating with the server. +type ConnectOptions struct { + // UserAgent is the application user agent. + UserAgent string + // Dialer specifies how to dial a network address. + Dialer func(context.Context, string) (net.Conn, error) + // FailOnNonTempDialError specifies if gRPC fails on non-temporary dial errors. + FailOnNonTempDialError bool + // PerRPCCredentials stores the PerRPCCredentials required to issue RPCs. + PerRPCCredentials []credentials.PerRPCCredentials + // TransportCredentials stores the Authenticator required to setup a client + // connection. Only one of TransportCredentials and CredsBundle is non-nil. + TransportCredentials credentials.TransportCredentials + // CredsBundle is the credentials bundle to be used. Only one of + // TransportCredentials and CredsBundle is non-nil. + CredsBundle credentials.Bundle + // KeepaliveParams stores the keepalive parameters. + KeepaliveParams keepalive.ClientParameters + // StatsHandler stores the handler for stats. + StatsHandler stats.Handler + // InitialWindowSize sets the initial window size for a stream. + InitialWindowSize int32 + // InitialConnWindowSize sets the initial window size for a connection. + InitialConnWindowSize int32 + // WriteBufferSize sets the size of write buffer which in turn determines how much data can be batched before it's written on the wire. + WriteBufferSize int + // ReadBufferSize sets the size of read buffer, which in turn determines how much data can be read at most for one read syscall. + ReadBufferSize int + // ChannelzParentID sets the addrConn id which initiate the creation of this client transport. + ChannelzParentID int64 + // MaxHeaderListSize sets the max (uncompressed) size of header list that is prepared to be received. + MaxHeaderListSize *uint32 +} + +// TargetInfo contains the information of the target such as network address and metadata. +type TargetInfo struct { + Addr string + Metadata interface{} + Authority string +} + +// NewClientTransport establishes the transport with the required ConnectOptions +// and returns it to the caller. +func NewClientTransport(connectCtx, ctx context.Context, target TargetInfo, opts ConnectOptions, onPrefaceReceipt func(), onGoAway func(GoAwayReason), onClose func()) (ClientTransport, error) { + return newHTTP2Client(connectCtx, ctx, target, opts, onPrefaceReceipt, onGoAway, onClose) +} + +// Options provides additional hints and information for message +// transmission. +type Options struct { + // Last indicates whether this write is the last piece for + // this stream. + Last bool +} + +// CallHdr carries the information of a particular RPC. +type CallHdr struct { + // Host specifies the peer's host. + Host string + + // Method specifies the operation to perform. + Method string + + // SendCompress specifies the compression algorithm applied on + // outbound message. + SendCompress string + + // Creds specifies credentials.PerRPCCredentials for a call. + Creds credentials.PerRPCCredentials + + // ContentSubtype specifies the content-subtype for a request. For example, a + // content-subtype of "proto" will result in a content-type of + // "application/grpc+proto". The value of ContentSubtype must be all + // lowercase, otherwise the behavior is undefined. See + // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests + // for more details. + ContentSubtype string + + PreviousAttempts int // value of grpc-previous-rpc-attempts header to set +} + +// ClientTransport is the common interface for all gRPC client-side transport +// implementations. +type ClientTransport interface { + // Close tears down this transport. Once it returns, the transport + // should not be accessed any more. The caller must make sure this + // is called only once. + Close() error + + // GracefulClose starts to tear down the transport: the transport will stop + // accepting new RPCs and NewStream will return error. Once all streams are + // finished, the transport will close. + // + // It does not block. + GracefulClose() + + // Write sends the data for the given stream. A nil stream indicates + // the write is to be performed on the transport as a whole. + Write(s *Stream, hdr []byte, data []byte, opts *Options) error + + // NewStream creates a Stream for an RPC. + NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, error) + + // CloseStream clears the footprint of a stream when the stream is + // not needed any more. The err indicates the error incurred when + // CloseStream is called. Must be called when a stream is finished + // unless the associated transport is closing. + CloseStream(stream *Stream, err error) + + // Error returns a channel that is closed when some I/O error + // happens. Typically the caller should have a goroutine to monitor + // this in order to take action (e.g., close the current transport + // and create a new one) in error case. It should not return nil + // once the transport is initiated. + Error() <-chan struct{} + + // GoAway returns a channel that is closed when ClientTransport + // receives the draining signal from the server (e.g., GOAWAY frame in + // HTTP/2). + GoAway() <-chan struct{} + + // GetGoAwayReason returns the reason why GoAway frame was received. + GetGoAwayReason() GoAwayReason + + // RemoteAddr returns the remote network address. + RemoteAddr() net.Addr + + // IncrMsgSent increments the number of message sent through this transport. + IncrMsgSent() + + // IncrMsgRecv increments the number of message received through this transport. + IncrMsgRecv() +} + +// ServerTransport is the common interface for all gRPC server-side transport +// implementations. +// +// Methods may be called concurrently from multiple goroutines, but +// Write methods for a given Stream will be called serially. +type ServerTransport interface { + // HandleStreams receives incoming streams using the given handler. + HandleStreams(func(*Stream), func(context.Context, string) context.Context) + + // WriteHeader sends the header metadata for the given stream. + // WriteHeader may not be called on all streams. + WriteHeader(s *Stream, md metadata.MD) error + + // Write sends the data for the given stream. + // Write may not be called on all streams. + Write(s *Stream, hdr []byte, data []byte, opts *Options) error + + // WriteStatus sends the status of a stream to the client. WriteStatus is + // the final call made on a stream and always occurs. + WriteStatus(s *Stream, st *status.Status) error + + // Close tears down the transport. Once it is called, the transport + // should not be accessed any more. All the pending streams and their + // handlers will be terminated asynchronously. + Close() error + + // RemoteAddr returns the remote network address. + RemoteAddr() net.Addr + + // Drain notifies the client this ServerTransport stops accepting new RPCs. + Drain() + + // IncrMsgSent increments the number of message sent through this transport. + IncrMsgSent() + + // IncrMsgRecv increments the number of message received through this transport. + IncrMsgRecv() +} + +// connectionErrorf creates an ConnectionError with the specified error description. +func connectionErrorf(temp bool, e error, format string, a ...interface{}) ConnectionError { + return ConnectionError{ + Desc: fmt.Sprintf(format, a...), + temp: temp, + err: e, + } +} + +// ConnectionError is an error that results in the termination of the +// entire connection and the retry of all the active streams. +type ConnectionError struct { + Desc string + temp bool + err error +} + +func (e ConnectionError) Error() string { + return fmt.Sprintf("connection error: desc = %q", e.Desc) +} + +// Temporary indicates if this connection error is temporary or fatal. +func (e ConnectionError) Temporary() bool { + return e.temp +} + +// Origin returns the original error of this connection error. +func (e ConnectionError) Origin() error { + // Never return nil error here. + // If the original error is nil, return itself. + if e.err == nil { + return e + } + return e.err +} + +var ( + // ErrConnClosing indicates that the transport is closing. + ErrConnClosing = connectionErrorf(true, nil, "transport is closing") + // errStreamDrain indicates that the stream is rejected because the + // connection is draining. This could be caused by goaway or balancer + // removing the address. + errStreamDrain = status.Error(codes.Unavailable, "the connection is draining") + // errStreamDone is returned from write at the client side to indiacte application + // layer of an error. + errStreamDone = errors.New("the stream is done") + // StatusGoAway indicates that the server sent a GOAWAY that included this + // stream's ID in unprocessed RPCs. + statusGoAway = status.New(codes.Unavailable, "the stream is rejected because server is draining the connection") +) + +// GoAwayReason contains the reason for the GoAway frame received. +type GoAwayReason uint8 + +const ( + // GoAwayInvalid indicates that no GoAway frame is received. + GoAwayInvalid GoAwayReason = 0 + // GoAwayNoReason is the default value when GoAway frame is received. + GoAwayNoReason GoAwayReason = 1 + // GoAwayTooManyPings indicates that a GoAway frame with + // ErrCodeEnhanceYourCalm was received and that the debug data said + // "too_many_pings". + GoAwayTooManyPings GoAwayReason = 2 +) + +// channelzData is used to store channelz related data for http2Client and http2Server. +// These fields cannot be embedded in the original structs (e.g. http2Client), since to do atomic +// operation on int64 variable on 32-bit machine, user is responsible to enforce memory alignment. +// Here, by grouping those int64 fields inside a struct, we are enforcing the alignment. +type channelzData struct { + kpCount int64 + // The number of streams that have started, including already finished ones. + streamsStarted int64 + // Client side: The number of streams that have ended successfully by receiving + // EoS bit set frame from server. + // Server side: The number of streams that have ended successfully by sending + // frame with EoS bit set. + streamsSucceeded int64 + streamsFailed int64 + // lastStreamCreatedTime stores the timestamp that the last stream gets created. It is of int64 type + // instead of time.Time since it's more costly to atomically update time.Time variable than int64 + // variable. The same goes for lastMsgSentTime and lastMsgRecvTime. + lastStreamCreatedTime int64 + msgSent int64 + msgRecv int64 + lastMsgSentTime int64 + lastMsgRecvTime int64 +} + +// ContextErr converts the error from context package into a status error. +func ContextErr(err error) error { + switch err { + case context.DeadlineExceeded: + return status.Error(codes.DeadlineExceeded, err.Error()) + case context.Canceled: + return status.Error(codes.Canceled, err.Error()) + } + return status.Errorf(codes.Internal, "Unexpected error from context packet: %v", err) +} diff --git a/vendor/google.golang.org/grpc/keepalive/keepalive.go b/vendor/google.golang.org/grpc/keepalive/keepalive.go new file mode 100644 index 00000000..34d31b5e --- /dev/null +++ b/vendor/google.golang.org/grpc/keepalive/keepalive.go @@ -0,0 +1,85 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package keepalive defines configurable parameters for point-to-point +// healthcheck. +package keepalive + +import ( + "time" +) + +// ClientParameters is used to set keepalive parameters on the client-side. +// These configure how the client will actively probe to notice when a +// connection is broken and send pings so intermediaries will be aware of the +// liveness of the connection. Make sure these parameters are set in +// coordination with the keepalive policy on the server, as incompatible +// settings can result in closing of connection. +type ClientParameters struct { + // After a duration of this time if the client doesn't see any activity it + // pings the server to see if the transport is still alive. + // If set below 10s, a minimum value of 10s will be used instead. + Time time.Duration // The current default value is infinity. + // After having pinged for keepalive check, the client waits for a duration + // of Timeout and if no activity is seen even after that the connection is + // closed. + Timeout time.Duration // The current default value is 20 seconds. + // If true, client sends keepalive pings even with no active RPCs. If false, + // when there are no active RPCs, Time and Timeout will be ignored and no + // keepalive pings will be sent. + PermitWithoutStream bool // false by default. +} + +// ServerParameters is used to set keepalive and max-age parameters on the +// server-side. +type ServerParameters struct { + // MaxConnectionIdle is a duration for the amount of time after which an + // idle connection would be closed by sending a GoAway. Idleness duration is + // defined since the most recent time the number of outstanding RPCs became + // zero or the connection establishment. + MaxConnectionIdle time.Duration // The current default value is infinity. + // MaxConnectionAge is a duration for the maximum amount of time a + // connection may exist before it will be closed by sending a GoAway. A + // random jitter of +/-10% will be added to MaxConnectionAge to spread out + // connection storms. + MaxConnectionAge time.Duration // The current default value is infinity. + // MaxConnectionAgeGrace is an additive period after MaxConnectionAge after + // which the connection will be forcibly closed. + MaxConnectionAgeGrace time.Duration // The current default value is infinity. + // After a duration of this time if the server doesn't see any activity it + // pings the client to see if the transport is still alive. + // If set below 1s, a minimum value of 1s will be used instead. + Time time.Duration // The current default value is 2 hours. + // After having pinged for keepalive check, the server waits for a duration + // of Timeout and if no activity is seen even after that the connection is + // closed. + Timeout time.Duration // The current default value is 20 seconds. +} + +// EnforcementPolicy is used to set keepalive enforcement policy on the +// server-side. Server will close connection with a client that violates this +// policy. +type EnforcementPolicy struct { + // MinTime is the minimum amount of time a client should wait before sending + // a keepalive ping. + MinTime time.Duration // The current default value is 5 minutes. + // If true, server allows keepalive pings even when there are no active + // streams(RPCs). If false, and client sends ping when there are no active + // streams, server will send GOAWAY and close the connection. + PermitWithoutStream bool // false by default. +} diff --git a/vendor/google.golang.org/grpc/metadata/metadata.go b/vendor/google.golang.org/grpc/metadata/metadata.go new file mode 100644 index 00000000..cf6d1b94 --- /dev/null +++ b/vendor/google.golang.org/grpc/metadata/metadata.go @@ -0,0 +1,209 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package metadata define the structure of the metadata supported by gRPC library. +// Please refer to https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md +// for more information about custom-metadata. +package metadata // import "google.golang.org/grpc/metadata" + +import ( + "context" + "fmt" + "strings" +) + +// DecodeKeyValue returns k, v, nil. +// +// Deprecated: use k and v directly instead. +func DecodeKeyValue(k, v string) (string, string, error) { + return k, v, nil +} + +// MD is a mapping from metadata keys to values. Users should use the following +// two convenience functions New and Pairs to generate MD. +type MD map[string][]string + +// New creates an MD from a given key-value map. +// +// Only the following ASCII characters are allowed in keys: +// - digits: 0-9 +// - uppercase letters: A-Z (normalized to lower) +// - lowercase letters: a-z +// - special characters: -_. +// Uppercase letters are automatically converted to lowercase. +// +// Keys beginning with "grpc-" are reserved for grpc-internal use only and may +// result in errors if set in metadata. +func New(m map[string]string) MD { + md := MD{} + for k, val := range m { + key := strings.ToLower(k) + md[key] = append(md[key], val) + } + return md +} + +// Pairs returns an MD formed by the mapping of key, value ... +// Pairs panics if len(kv) is odd. +// +// Only the following ASCII characters are allowed in keys: +// - digits: 0-9 +// - uppercase letters: A-Z (normalized to lower) +// - lowercase letters: a-z +// - special characters: -_. +// Uppercase letters are automatically converted to lowercase. +// +// Keys beginning with "grpc-" are reserved for grpc-internal use only and may +// result in errors if set in metadata. +func Pairs(kv ...string) MD { + if len(kv)%2 == 1 { + panic(fmt.Sprintf("metadata: Pairs got the odd number of input pairs for metadata: %d", len(kv))) + } + md := MD{} + var key string + for i, s := range kv { + if i%2 == 0 { + key = strings.ToLower(s) + continue + } + md[key] = append(md[key], s) + } + return md +} + +// Len returns the number of items in md. +func (md MD) Len() int { + return len(md) +} + +// Copy returns a copy of md. +func (md MD) Copy() MD { + return Join(md) +} + +// Get obtains the values for a given key. +func (md MD) Get(k string) []string { + k = strings.ToLower(k) + return md[k] +} + +// Set sets the value of a given key with a slice of values. +func (md MD) Set(k string, vals ...string) { + if len(vals) == 0 { + return + } + k = strings.ToLower(k) + md[k] = vals +} + +// Append adds the values to key k, not overwriting what was already stored at that key. +func (md MD) Append(k string, vals ...string) { + if len(vals) == 0 { + return + } + k = strings.ToLower(k) + md[k] = append(md[k], vals...) +} + +// Join joins any number of mds into a single MD. +// The order of values for each key is determined by the order in which +// the mds containing those values are presented to Join. +func Join(mds ...MD) MD { + out := MD{} + for _, md := range mds { + for k, v := range md { + out[k] = append(out[k], v...) + } + } + return out +} + +type mdIncomingKey struct{} +type mdOutgoingKey struct{} + +// NewIncomingContext creates a new context with incoming md attached. +func NewIncomingContext(ctx context.Context, md MD) context.Context { + return context.WithValue(ctx, mdIncomingKey{}, md) +} + +// NewOutgoingContext creates a new context with outgoing md attached. If used +// in conjunction with AppendToOutgoingContext, NewOutgoingContext will +// overwrite any previously-appended metadata. +func NewOutgoingContext(ctx context.Context, md MD) context.Context { + return context.WithValue(ctx, mdOutgoingKey{}, rawMD{md: md}) +} + +// AppendToOutgoingContext returns a new context with the provided kv merged +// with any existing metadata in the context. Please refer to the +// documentation of Pairs for a description of kv. +func AppendToOutgoingContext(ctx context.Context, kv ...string) context.Context { + if len(kv)%2 == 1 { + panic(fmt.Sprintf("metadata: AppendToOutgoingContext got an odd number of input pairs for metadata: %d", len(kv))) + } + md, _ := ctx.Value(mdOutgoingKey{}).(rawMD) + added := make([][]string, len(md.added)+1) + copy(added, md.added) + added[len(added)-1] = make([]string, len(kv)) + copy(added[len(added)-1], kv) + return context.WithValue(ctx, mdOutgoingKey{}, rawMD{md: md.md, added: added}) +} + +// FromIncomingContext returns the incoming metadata in ctx if it exists. The +// returned MD should not be modified. Writing to it may cause races. +// Modification should be made to copies of the returned MD. +func FromIncomingContext(ctx context.Context) (md MD, ok bool) { + md, ok = ctx.Value(mdIncomingKey{}).(MD) + return +} + +// FromOutgoingContextRaw returns the un-merged, intermediary contents +// of rawMD. Remember to perform strings.ToLower on the keys. The returned +// MD should not be modified. Writing to it may cause races. Modification +// should be made to copies of the returned MD. +// +// This is intended for gRPC-internal use ONLY. +func FromOutgoingContextRaw(ctx context.Context) (MD, [][]string, bool) { + raw, ok := ctx.Value(mdOutgoingKey{}).(rawMD) + if !ok { + return nil, nil, false + } + + return raw.md, raw.added, true +} + +// FromOutgoingContext returns the outgoing metadata in ctx if it exists. The +// returned MD should not be modified. Writing to it may cause races. +// Modification should be made to copies of the returned MD. +func FromOutgoingContext(ctx context.Context) (MD, bool) { + raw, ok := ctx.Value(mdOutgoingKey{}).(rawMD) + if !ok { + return nil, false + } + + mds := make([]MD, 0, len(raw.added)+1) + mds = append(mds, raw.md) + for _, vv := range raw.added { + mds = append(mds, Pairs(vv...)) + } + return Join(mds...), ok +} + +type rawMD struct { + md MD + added [][]string +} diff --git a/vendor/google.golang.org/grpc/naming/dns_resolver.go b/vendor/google.golang.org/grpc/naming/dns_resolver.go new file mode 100644 index 00000000..c9f79dc5 --- /dev/null +++ b/vendor/google.golang.org/grpc/naming/dns_resolver.go @@ -0,0 +1,293 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package naming + +import ( + "context" + "errors" + "fmt" + "net" + "strconv" + "time" + + "google.golang.org/grpc/grpclog" +) + +const ( + defaultPort = "443" + defaultFreq = time.Minute * 30 +) + +var ( + errMissingAddr = errors.New("missing address") + errWatcherClose = errors.New("watcher has been closed") + + lookupHost = net.DefaultResolver.LookupHost + lookupSRV = net.DefaultResolver.LookupSRV +) + +// NewDNSResolverWithFreq creates a DNS Resolver that can resolve DNS names, and +// create watchers that poll the DNS server using the frequency set by freq. +func NewDNSResolverWithFreq(freq time.Duration) (Resolver, error) { + return &dnsResolver{freq: freq}, nil +} + +// NewDNSResolver creates a DNS Resolver that can resolve DNS names, and create +// watchers that poll the DNS server using the default frequency defined by defaultFreq. +func NewDNSResolver() (Resolver, error) { + return NewDNSResolverWithFreq(defaultFreq) +} + +// dnsResolver handles name resolution for names following the DNS scheme +type dnsResolver struct { + // frequency of polling the DNS server that the watchers created by this resolver will use. + freq time.Duration +} + +// formatIP returns ok = false if addr is not a valid textual representation of an IP address. +// If addr is an IPv4 address, return the addr and ok = true. +// If addr is an IPv6 address, return the addr enclosed in square brackets and ok = true. +func formatIP(addr string) (addrIP string, ok bool) { + ip := net.ParseIP(addr) + if ip == nil { + return "", false + } + if ip.To4() != nil { + return addr, true + } + return "[" + addr + "]", true +} + +// parseTarget takes the user input target string, returns formatted host and port info. +// If target doesn't specify a port, set the port to be the defaultPort. +// If target is in IPv6 format and host-name is enclosed in square brackets, brackets +// are stripped when setting the host. +// examples: +// target: "www.google.com" returns host: "www.google.com", port: "443" +// target: "ipv4-host:80" returns host: "ipv4-host", port: "80" +// target: "[ipv6-host]" returns host: "ipv6-host", port: "443" +// target: ":80" returns host: "localhost", port: "80" +// target: ":" returns host: "localhost", port: "443" +func parseTarget(target string) (host, port string, err error) { + if target == "" { + return "", "", errMissingAddr + } + + if ip := net.ParseIP(target); ip != nil { + // target is an IPv4 or IPv6(without brackets) address + return target, defaultPort, nil + } + if host, port, err := net.SplitHostPort(target); err == nil { + // target has port, i.e ipv4-host:port, [ipv6-host]:port, host-name:port + if host == "" { + // Keep consistent with net.Dial(): If the host is empty, as in ":80", the local system is assumed. + host = "localhost" + } + if port == "" { + // If the port field is empty(target ends with colon), e.g. "[::1]:", defaultPort is used. + port = defaultPort + } + return host, port, nil + } + if host, port, err := net.SplitHostPort(target + ":" + defaultPort); err == nil { + // target doesn't have port + return host, port, nil + } + return "", "", fmt.Errorf("invalid target address %v", target) +} + +// Resolve creates a watcher that watches the name resolution of the target. +func (r *dnsResolver) Resolve(target string) (Watcher, error) { + host, port, err := parseTarget(target) + if err != nil { + return nil, err + } + + if net.ParseIP(host) != nil { + ipWatcher := &ipWatcher{ + updateChan: make(chan *Update, 1), + } + host, _ = formatIP(host) + ipWatcher.updateChan <- &Update{Op: Add, Addr: host + ":" + port} + return ipWatcher, nil + } + + ctx, cancel := context.WithCancel(context.Background()) + return &dnsWatcher{ + r: r, + host: host, + port: port, + ctx: ctx, + cancel: cancel, + t: time.NewTimer(0), + }, nil +} + +// dnsWatcher watches for the name resolution update for a specific target +type dnsWatcher struct { + r *dnsResolver + host string + port string + // The latest resolved address set + curAddrs map[string]*Update + ctx context.Context + cancel context.CancelFunc + t *time.Timer +} + +// ipWatcher watches for the name resolution update for an IP address. +type ipWatcher struct { + updateChan chan *Update +} + +// Next returns the address resolution Update for the target. For IP address, +// the resolution is itself, thus polling name server is unnecessary. Therefore, +// Next() will return an Update the first time it is called, and will be blocked +// for all following calls as no Update exists until watcher is closed. +func (i *ipWatcher) Next() ([]*Update, error) { + u, ok := <-i.updateChan + if !ok { + return nil, errWatcherClose + } + return []*Update{u}, nil +} + +// Close closes the ipWatcher. +func (i *ipWatcher) Close() { + close(i.updateChan) +} + +// AddressType indicates the address type returned by name resolution. +type AddressType uint8 + +const ( + // Backend indicates the server is a backend server. + Backend AddressType = iota + // GRPCLB indicates the server is a grpclb load balancer. + GRPCLB +) + +// AddrMetadataGRPCLB contains the information the name resolver for grpclb should provide. The +// name resolver used by the grpclb balancer is required to provide this type of metadata in +// its address updates. +type AddrMetadataGRPCLB struct { + // AddrType is the type of server (grpc load balancer or backend). + AddrType AddressType + // ServerName is the name of the grpc load balancer. Used for authentication. + ServerName string +} + +// compileUpdate compares the old resolved addresses and newly resolved addresses, +// and generates an update list +func (w *dnsWatcher) compileUpdate(newAddrs map[string]*Update) []*Update { + var res []*Update + for a, u := range w.curAddrs { + if _, ok := newAddrs[a]; !ok { + u.Op = Delete + res = append(res, u) + } + } + for a, u := range newAddrs { + if _, ok := w.curAddrs[a]; !ok { + res = append(res, u) + } + } + return res +} + +func (w *dnsWatcher) lookupSRV() map[string]*Update { + newAddrs := make(map[string]*Update) + _, srvs, err := lookupSRV(w.ctx, "grpclb", "tcp", w.host) + if err != nil { + grpclog.Infof("grpc: failed dns SRV record lookup due to %v.\n", err) + return nil + } + for _, s := range srvs { + lbAddrs, err := lookupHost(w.ctx, s.Target) + if err != nil { + grpclog.Warningf("grpc: failed load balancer address dns lookup due to %v.\n", err) + continue + } + for _, a := range lbAddrs { + a, ok := formatIP(a) + if !ok { + grpclog.Errorf("grpc: failed IP parsing due to %v.\n", err) + continue + } + addr := a + ":" + strconv.Itoa(int(s.Port)) + newAddrs[addr] = &Update{Addr: addr, + Metadata: AddrMetadataGRPCLB{AddrType: GRPCLB, ServerName: s.Target}} + } + } + return newAddrs +} + +func (w *dnsWatcher) lookupHost() map[string]*Update { + newAddrs := make(map[string]*Update) + addrs, err := lookupHost(w.ctx, w.host) + if err != nil { + grpclog.Warningf("grpc: failed dns A record lookup due to %v.\n", err) + return nil + } + for _, a := range addrs { + a, ok := formatIP(a) + if !ok { + grpclog.Errorf("grpc: failed IP parsing due to %v.\n", err) + continue + } + addr := a + ":" + w.port + newAddrs[addr] = &Update{Addr: addr} + } + return newAddrs +} + +func (w *dnsWatcher) lookup() []*Update { + newAddrs := w.lookupSRV() + if newAddrs == nil { + // If failed to get any balancer address (either no corresponding SRV for the + // target, or caused by failure during resolution/parsing of the balancer target), + // return any A record info available. + newAddrs = w.lookupHost() + } + result := w.compileUpdate(newAddrs) + w.curAddrs = newAddrs + return result +} + +// Next returns the resolved address update(delta) for the target. If there's no +// change, it will sleep for 30 mins and try to resolve again after that. +func (w *dnsWatcher) Next() ([]*Update, error) { + for { + select { + case <-w.ctx.Done(): + return nil, errWatcherClose + case <-w.t.C: + } + result := w.lookup() + // Next lookup should happen after an interval defined by w.r.freq. + w.t.Reset(w.r.freq) + if len(result) > 0 { + return result, nil + } + } +} + +func (w *dnsWatcher) Close() { + w.cancel() +} diff --git a/vendor/google.golang.org/grpc/naming/naming.go b/vendor/google.golang.org/grpc/naming/naming.go new file mode 100644 index 00000000..f4c1c8b6 --- /dev/null +++ b/vendor/google.golang.org/grpc/naming/naming.go @@ -0,0 +1,68 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package naming defines the naming API and related data structures for gRPC. +// +// This package is deprecated: please use package resolver instead. +package naming + +// Operation defines the corresponding operations for a name resolution change. +// +// Deprecated: please use package resolver. +type Operation uint8 + +const ( + // Add indicates a new address is added. + Add Operation = iota + // Delete indicates an existing address is deleted. + Delete +) + +// Update defines a name resolution update. Notice that it is not valid having both +// empty string Addr and nil Metadata in an Update. +// +// Deprecated: please use package resolver. +type Update struct { + // Op indicates the operation of the update. + Op Operation + // Addr is the updated address. It is empty string if there is no address update. + Addr string + // Metadata is the updated metadata. It is nil if there is no metadata update. + // Metadata is not required for a custom naming implementation. + Metadata interface{} +} + +// Resolver creates a Watcher for a target to track its resolution changes. +// +// Deprecated: please use package resolver. +type Resolver interface { + // Resolve creates a Watcher for target. + Resolve(target string) (Watcher, error) +} + +// Watcher watches for the updates on the specified target. +// +// Deprecated: please use package resolver. +type Watcher interface { + // Next blocks until an update or error happens. It may return one or more + // updates. The first call should get the full set of the results. It should + // return an error if and only if Watcher cannot recover. + Next() ([]*Update, error) + // Close closes the Watcher. + Close() +} diff --git a/vendor/google.golang.org/grpc/peer/peer.go b/vendor/google.golang.org/grpc/peer/peer.go new file mode 100644 index 00000000..e01d219f --- /dev/null +++ b/vendor/google.golang.org/grpc/peer/peer.go @@ -0,0 +1,51 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package peer defines various peer information associated with RPCs and +// corresponding utils. +package peer + +import ( + "context" + "net" + + "google.golang.org/grpc/credentials" +) + +// Peer contains the information of the peer for an RPC, such as the address +// and authentication information. +type Peer struct { + // Addr is the peer address. + Addr net.Addr + // AuthInfo is the authentication information of the transport. + // It is nil if there is no transport security being used. + AuthInfo credentials.AuthInfo +} + +type peerKey struct{} + +// NewContext creates a new context with peer information attached. +func NewContext(ctx context.Context, p *Peer) context.Context { + return context.WithValue(ctx, peerKey{}, p) +} + +// FromContext returns the peer information in ctx if it exists. +func FromContext(ctx context.Context) (p *Peer, ok bool) { + p, ok = ctx.Value(peerKey{}).(*Peer) + return +} diff --git a/vendor/google.golang.org/grpc/picker_wrapper.go b/vendor/google.golang.org/grpc/picker_wrapper.go new file mode 100644 index 00000000..00447894 --- /dev/null +++ b/vendor/google.golang.org/grpc/picker_wrapper.go @@ -0,0 +1,229 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "context" + "fmt" + "io" + "sync" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/channelz" + "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/status" +) + +// v2PickerWrapper wraps a balancer.Picker while providing the +// balancer.V2Picker API. It requires a pickerWrapper to generate errors +// including the latest connectionError. To be deleted when balancer.Picker is +// updated to the balancer.V2Picker API. +type v2PickerWrapper struct { + picker balancer.Picker + connErr *connErr +} + +func (v *v2PickerWrapper) Pick(info balancer.PickInfo) (balancer.PickResult, error) { + sc, done, err := v.picker.Pick(info.Ctx, info) + if err != nil { + if err == balancer.ErrTransientFailure { + return balancer.PickResult{}, balancer.TransientFailureError(fmt.Errorf("%v, latest connection error: %v", err, v.connErr.connectionError())) + } + return balancer.PickResult{}, err + } + return balancer.PickResult{SubConn: sc, Done: done}, nil +} + +// pickerWrapper is a wrapper of balancer.Picker. It blocks on certain pick +// actions and unblock when there's a picker update. +type pickerWrapper struct { + mu sync.Mutex + done bool + blockingCh chan struct{} + picker balancer.V2Picker + + // The latest connection error. TODO: remove when V1 picker is deprecated; + // balancer should be responsible for providing the error. + *connErr +} + +type connErr struct { + mu sync.Mutex + err error +} + +func (c *connErr) updateConnectionError(err error) { + c.mu.Lock() + c.err = err + c.mu.Unlock() +} + +func (c *connErr) connectionError() error { + c.mu.Lock() + err := c.err + c.mu.Unlock() + return err +} + +func newPickerWrapper() *pickerWrapper { + return &pickerWrapper{blockingCh: make(chan struct{}), connErr: &connErr{}} +} + +// updatePicker is called by UpdateBalancerState. It unblocks all blocked pick. +func (pw *pickerWrapper) updatePicker(p balancer.Picker) { + pw.updatePickerV2(&v2PickerWrapper{picker: p, connErr: pw.connErr}) +} + +// updatePicker is called by UpdateBalancerState. It unblocks all blocked pick. +func (pw *pickerWrapper) updatePickerV2(p balancer.V2Picker) { + pw.mu.Lock() + if pw.done { + pw.mu.Unlock() + return + } + pw.picker = p + // pw.blockingCh should never be nil. + close(pw.blockingCh) + pw.blockingCh = make(chan struct{}) + pw.mu.Unlock() +} + +func doneChannelzWrapper(acw *acBalancerWrapper, done func(balancer.DoneInfo)) func(balancer.DoneInfo) { + acw.mu.Lock() + ac := acw.ac + acw.mu.Unlock() + ac.incrCallsStarted() + return func(b balancer.DoneInfo) { + if b.Err != nil && b.Err != io.EOF { + ac.incrCallsFailed() + } else { + ac.incrCallsSucceeded() + } + if done != nil { + done(b) + } + } +} + +// pick returns the transport that will be used for the RPC. +// It may block in the following cases: +// - there's no picker +// - the current picker returns ErrNoSubConnAvailable +// - the current picker returns other errors and failfast is false. +// - the subConn returned by the current picker is not READY +// When one of these situations happens, pick blocks until the picker gets updated. +func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.PickInfo) (transport.ClientTransport, func(balancer.DoneInfo), error) { + var ch chan struct{} + + var lastPickErr error + for { + pw.mu.Lock() + if pw.done { + pw.mu.Unlock() + return nil, nil, ErrClientConnClosing + } + + if pw.picker == nil { + ch = pw.blockingCh + } + if ch == pw.blockingCh { + // This could happen when either: + // - pw.picker is nil (the previous if condition), or + // - has called pick on the current picker. + pw.mu.Unlock() + select { + case <-ctx.Done(): + var errStr string + if lastPickErr != nil { + errStr = "latest balancer error: " + lastPickErr.Error() + } else if connectionErr := pw.connectionError(); connectionErr != nil { + errStr = "latest connection error: " + connectionErr.Error() + } else { + errStr = ctx.Err().Error() + } + switch ctx.Err() { + case context.DeadlineExceeded: + return nil, nil, status.Error(codes.DeadlineExceeded, errStr) + case context.Canceled: + return nil, nil, status.Error(codes.Canceled, errStr) + } + case <-ch: + } + continue + } + + ch = pw.blockingCh + p := pw.picker + pw.mu.Unlock() + + pickResult, err := p.Pick(info) + + if err != nil { + if err == balancer.ErrNoSubConnAvailable { + continue + } + if tfe, ok := err.(interface{ IsTransientFailure() bool }); ok && tfe.IsTransientFailure() { + if !failfast { + lastPickErr = err + continue + } + return nil, nil, status.Error(codes.Unavailable, err.Error()) + } + if _, ok := status.FromError(err); ok { + return nil, nil, err + } + // err is some other error. + return nil, nil, status.Error(codes.Unknown, err.Error()) + } + + acw, ok := pickResult.SubConn.(*acBalancerWrapper) + if !ok { + grpclog.Error("subconn returned from pick is not *acBalancerWrapper") + continue + } + if t, ok := acw.getAddrConn().getReadyTransport(); ok { + if channelz.IsOn() { + return t, doneChannelzWrapper(acw, pickResult.Done), nil + } + return t, pickResult.Done, nil + } + if pickResult.Done != nil { + // Calling done with nil error, no bytes sent and no bytes received. + // DoneInfo with default value works. + pickResult.Done(balancer.DoneInfo{}) + } + grpclog.Infof("blockingPicker: the picked transport is not ready, loop back to repick") + // If ok == false, ac.state is not READY. + // A valid picker always returns READY subConn. This means the state of ac + // just changed, and picker will be updated shortly. + // continue back to the beginning of the for loop to repick. + } +} + +func (pw *pickerWrapper) close() { + pw.mu.Lock() + defer pw.mu.Unlock() + if pw.done { + return + } + pw.done = true + close(pw.blockingCh) +} diff --git a/vendor/google.golang.org/grpc/pickfirst.go b/vendor/google.golang.org/grpc/pickfirst.go new file mode 100644 index 00000000..c43dac9a --- /dev/null +++ b/vendor/google.golang.org/grpc/pickfirst.go @@ -0,0 +1,159 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "errors" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/status" +) + +// PickFirstBalancerName is the name of the pick_first balancer. +const PickFirstBalancerName = "pick_first" + +func newPickfirstBuilder() balancer.Builder { + return &pickfirstBuilder{} +} + +type pickfirstBuilder struct{} + +func (*pickfirstBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer { + return &pickfirstBalancer{cc: cc} +} + +func (*pickfirstBuilder) Name() string { + return PickFirstBalancerName +} + +type pickfirstBalancer struct { + state connectivity.State + cc balancer.ClientConn + sc balancer.SubConn +} + +var _ balancer.V2Balancer = &pickfirstBalancer{} // Assert we implement v2 + +func (b *pickfirstBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) { + if err != nil { + b.ResolverError(err) + return + } + b.UpdateClientConnState(balancer.ClientConnState{ResolverState: resolver.State{Addresses: addrs}}) // Ignore error +} + +func (b *pickfirstBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) { + b.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: s}) +} + +func (b *pickfirstBalancer) ResolverError(err error) { + switch b.state { + case connectivity.TransientFailure, connectivity.Idle, connectivity.Connecting: + // Set a failing picker if we don't have a good picker. + b.cc.UpdateState(balancer.State{ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: status.Errorf(codes.Unavailable, "name resolver error: %v", err)}}, + ) + } + if grpclog.V(2) { + grpclog.Infof("pickfirstBalancer: ResolverError called with error %v", err) + } +} + +func (b *pickfirstBalancer) UpdateClientConnState(cs balancer.ClientConnState) error { + if len(cs.ResolverState.Addresses) == 0 { + b.ResolverError(errors.New("produced zero addresses")) + return balancer.ErrBadResolverState + } + if b.sc == nil { + var err error + b.sc, err = b.cc.NewSubConn(cs.ResolverState.Addresses, balancer.NewSubConnOptions{}) + if err != nil { + if grpclog.V(2) { + grpclog.Errorf("pickfirstBalancer: failed to NewSubConn: %v", err) + } + b.state = connectivity.TransientFailure + b.cc.UpdateState(balancer.State{ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: status.Errorf(codes.Unavailable, "error creating connection: %v", err)}}, + ) + return balancer.ErrBadResolverState + } + b.state = connectivity.Idle + b.cc.UpdateState(balancer.State{ConnectivityState: connectivity.Idle, Picker: &picker{result: balancer.PickResult{SubConn: b.sc}}}) + b.sc.Connect() + } else { + b.sc.UpdateAddresses(cs.ResolverState.Addresses) + b.sc.Connect() + } + return nil +} + +func (b *pickfirstBalancer) UpdateSubConnState(sc balancer.SubConn, s balancer.SubConnState) { + if grpclog.V(2) { + grpclog.Infof("pickfirstBalancer: HandleSubConnStateChange: %p, %v", sc, s) + } + if b.sc != sc { + if grpclog.V(2) { + grpclog.Infof("pickfirstBalancer: ignored state change because sc is not recognized") + } + return + } + b.state = s.ConnectivityState + if s.ConnectivityState == connectivity.Shutdown { + b.sc = nil + return + } + + switch s.ConnectivityState { + case connectivity.Ready, connectivity.Idle: + b.cc.UpdateState(balancer.State{ConnectivityState: s.ConnectivityState, Picker: &picker{result: balancer.PickResult{SubConn: sc}}}) + case connectivity.Connecting: + b.cc.UpdateState(balancer.State{ConnectivityState: s.ConnectivityState, Picker: &picker{err: balancer.ErrNoSubConnAvailable}}) + case connectivity.TransientFailure: + err := balancer.ErrTransientFailure + // TODO: this can be unconditional after the V1 API is removed, as + // SubConnState will always contain a connection error. + if s.ConnectionError != nil { + err = balancer.TransientFailureError(s.ConnectionError) + } + b.cc.UpdateState(balancer.State{ + ConnectivityState: s.ConnectivityState, + Picker: &picker{err: err}, + }) + } +} + +func (b *pickfirstBalancer) Close() { +} + +type picker struct { + result balancer.PickResult + err error +} + +func (p *picker) Pick(info balancer.PickInfo) (balancer.PickResult, error) { + return p.result, p.err +} + +func init() { + balancer.Register(newPickfirstBuilder()) +} diff --git a/vendor/google.golang.org/grpc/preloader.go b/vendor/google.golang.org/grpc/preloader.go new file mode 100644 index 00000000..76acbbcc --- /dev/null +++ b/vendor/google.golang.org/grpc/preloader.go @@ -0,0 +1,64 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// PreparedMsg is responsible for creating a Marshalled and Compressed object. +// +// This API is EXPERIMENTAL. +type PreparedMsg struct { + // Struct for preparing msg before sending them + encodedData []byte + hdr []byte + payload []byte +} + +// Encode marshalls and compresses the message using the codec and compressor for the stream. +func (p *PreparedMsg) Encode(s Stream, msg interface{}) error { + ctx := s.Context() + rpcInfo, ok := rpcInfoFromContext(ctx) + if !ok { + return status.Errorf(codes.Internal, "grpc: unable to get rpcInfo") + } + + // check if the context has the relevant information to prepareMsg + if rpcInfo.preloaderInfo == nil { + return status.Errorf(codes.Internal, "grpc: rpcInfo.preloaderInfo is nil") + } + if rpcInfo.preloaderInfo.codec == nil { + return status.Errorf(codes.Internal, "grpc: rpcInfo.preloaderInfo.codec is nil") + } + + // prepare the msg + data, err := encode(rpcInfo.preloaderInfo.codec, msg) + if err != nil { + return err + } + p.encodedData = data + compData, err := compress(data, rpcInfo.preloaderInfo.cp, rpcInfo.preloaderInfo.comp) + if err != nil { + return err + } + p.hdr, p.payload = msgHeader(data, compData) + return nil +} diff --git a/vendor/google.golang.org/grpc/proxy.go b/vendor/google.golang.org/grpc/proxy.go new file mode 100644 index 00000000..f8f69bfb --- /dev/null +++ b/vendor/google.golang.org/grpc/proxy.go @@ -0,0 +1,152 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "bufio" + "context" + "encoding/base64" + "errors" + "fmt" + "io" + "net" + "net/http" + "net/http/httputil" + "net/url" +) + +const proxyAuthHeaderKey = "Proxy-Authorization" + +var ( + // errDisabled indicates that proxy is disabled for the address. + errDisabled = errors.New("proxy is disabled for the address") + // The following variable will be overwritten in the tests. + httpProxyFromEnvironment = http.ProxyFromEnvironment +) + +func mapAddress(ctx context.Context, address string) (*url.URL, error) { + req := &http.Request{ + URL: &url.URL{ + Scheme: "https", + Host: address, + }, + } + url, err := httpProxyFromEnvironment(req) + if err != nil { + return nil, err + } + if url == nil { + return nil, errDisabled + } + return url, nil +} + +// To read a response from a net.Conn, http.ReadResponse() takes a bufio.Reader. +// It's possible that this reader reads more than what's need for the response and stores +// those bytes in the buffer. +// bufConn wraps the original net.Conn and the bufio.Reader to make sure we don't lose the +// bytes in the buffer. +type bufConn struct { + net.Conn + r io.Reader +} + +func (c *bufConn) Read(b []byte) (int, error) { + return c.r.Read(b) +} + +func basicAuth(username, password string) string { + auth := username + ":" + password + return base64.StdEncoding.EncodeToString([]byte(auth)) +} + +func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, backendAddr string, proxyURL *url.URL) (_ net.Conn, err error) { + defer func() { + if err != nil { + conn.Close() + } + }() + + req := &http.Request{ + Method: http.MethodConnect, + URL: &url.URL{Host: backendAddr}, + Header: map[string][]string{"User-Agent": {grpcUA}}, + } + if t := proxyURL.User; t != nil { + u := t.Username() + p, _ := t.Password() + req.Header.Add(proxyAuthHeaderKey, "Basic "+basicAuth(u, p)) + } + + if err := sendHTTPRequest(ctx, req, conn); err != nil { + return nil, fmt.Errorf("failed to write the HTTP request: %v", err) + } + + r := bufio.NewReader(conn) + resp, err := http.ReadResponse(r, req) + if err != nil { + return nil, fmt.Errorf("reading server HTTP response: %v", err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + dump, err := httputil.DumpResponse(resp, true) + if err != nil { + return nil, fmt.Errorf("failed to do connect handshake, status code: %s", resp.Status) + } + return nil, fmt.Errorf("failed to do connect handshake, response: %q", dump) + } + + return &bufConn{Conn: conn, r: r}, nil +} + +// newProxyDialer returns a dialer that connects to proxy first if necessary. +// The returned dialer checks if a proxy is necessary, dial to the proxy with the +// provided dialer, does HTTP CONNECT handshake and returns the connection. +func newProxyDialer(dialer func(context.Context, string) (net.Conn, error)) func(context.Context, string) (net.Conn, error) { + return func(ctx context.Context, addr string) (conn net.Conn, err error) { + var newAddr string + proxyURL, err := mapAddress(ctx, addr) + if err != nil { + if err != errDisabled { + return nil, err + } + newAddr = addr + } else { + newAddr = proxyURL.Host + } + + conn, err = dialer(ctx, newAddr) + if err != nil { + return + } + if proxyURL != nil { + // proxy is disabled if proxyURL is nil. + conn, err = doHTTPConnectHandshake(ctx, conn, addr, proxyURL) + } + return + } +} + +func sendHTTPRequest(ctx context.Context, req *http.Request, conn net.Conn) error { + req = req.WithContext(ctx) + if err := req.Write(conn); err != nil { + return fmt.Errorf("failed to write the HTTP request: %v", err) + } + return nil +} diff --git a/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go new file mode 100644 index 00000000..14aa6f20 --- /dev/null +++ b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go @@ -0,0 +1,36 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package dns implements a dns resolver to be installed as the default resolver +// in grpc. +// +// Deprecated: this package is imported by grpc and should not need to be +// imported directly by users. +package dns + +import ( + "google.golang.org/grpc/internal/resolver/dns" + "google.golang.org/grpc/resolver" +) + +// NewBuilder creates a dnsBuilder which is used to factory DNS resolvers. +// +// Deprecated: import grpc and use resolver.Get("dns") instead. +func NewBuilder() resolver.Builder { + return dns.NewBuilder() +} diff --git a/vendor/google.golang.org/grpc/resolver/passthrough/passthrough.go b/vendor/google.golang.org/grpc/resolver/passthrough/passthrough.go new file mode 100644 index 00000000..c8a0c3da --- /dev/null +++ b/vendor/google.golang.org/grpc/resolver/passthrough/passthrough.go @@ -0,0 +1,26 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package passthrough implements a pass-through resolver. It sends the target +// name without scheme back to gRPC as resolved address. +// +// Deprecated: this package is imported by grpc and should not need to be +// imported directly by users. +package passthrough + +import _ "google.golang.org/grpc/internal/resolver/passthrough" // import for side effects after package was moved diff --git a/vendor/google.golang.org/grpc/resolver/resolver.go b/vendor/google.golang.org/grpc/resolver/resolver.go new file mode 100644 index 00000000..fe14b2fb --- /dev/null +++ b/vendor/google.golang.org/grpc/resolver/resolver.go @@ -0,0 +1,253 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package resolver defines APIs for name resolution in gRPC. +// All APIs in this package are experimental. +package resolver + +import ( + "context" + "net" + + "google.golang.org/grpc/attributes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/serviceconfig" +) + +var ( + // m is a map from scheme to resolver builder. + m = make(map[string]Builder) + // defaultScheme is the default scheme to use. + defaultScheme = "passthrough" +) + +// TODO(bar) install dns resolver in init(){}. + +// Register registers the resolver builder to the resolver map. b.Scheme will be +// used as the scheme registered with this builder. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple Resolvers are +// registered with the same name, the one registered last will take effect. +func Register(b Builder) { + m[b.Scheme()] = b +} + +// Get returns the resolver builder registered with the given scheme. +// +// If no builder is register with the scheme, nil will be returned. +func Get(scheme string) Builder { + if b, ok := m[scheme]; ok { + return b + } + return nil +} + +// SetDefaultScheme sets the default scheme that will be used. The default +// default scheme is "passthrough". +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. The scheme set last overrides +// previously set values. +func SetDefaultScheme(scheme string) { + defaultScheme = scheme +} + +// GetDefaultScheme gets the default scheme that will be used. +func GetDefaultScheme() string { + return defaultScheme +} + +// AddressType indicates the address type returned by name resolution. +// +// Deprecated: use Attributes in Address instead. +type AddressType uint8 + +const ( + // Backend indicates the address is for a backend server. + // + // Deprecated: use Attributes in Address instead. + Backend AddressType = iota + // GRPCLB indicates the address is for a grpclb load balancer. + // + // Deprecated: use Attributes in Address instead. + GRPCLB +) + +// Address represents a server the client connects to. +// This is the EXPERIMENTAL API and may be changed or extended in the future. +type Address struct { + // Addr is the server address on which a connection will be established. + Addr string + + // ServerName is the name of this address. + // If non-empty, the ServerName is used as the transport certification authority for + // the address, instead of the hostname from the Dial target string. In most cases, + // this should not be set. + // + // If Type is GRPCLB, ServerName should be the name of the remote load + // balancer, not the name of the backend. + // + // WARNING: ServerName must only be populated with trusted values. It + // is insecure to populate it with data from untrusted inputs since untrusted + // values could be used to bypass the authority checks performed by TLS. + ServerName string + + // Attributes contains arbitrary data about this address intended for + // consumption by the load balancing policy. + Attributes *attributes.Attributes + + // Type is the type of this address. + // + // Deprecated: use Attributes instead. + Type AddressType + + // Metadata is the information associated with Addr, which may be used + // to make load balancing decision. + // + // Deprecated: use Attributes instead. + Metadata interface{} +} + +// BuildOptions includes additional information for the builder to create +// the resolver. +type BuildOptions struct { + // DisableServiceConfig indicates whether a resolver implementation should + // fetch service config data. + DisableServiceConfig bool + // DialCreds is the transport credentials used by the ClientConn for + // communicating with the target gRPC service (set via + // WithTransportCredentials). In cases where a name resolution service + // requires the same credentials, the resolver may use this field. In most + // cases though, it is not appropriate, and this field may be ignored. + DialCreds credentials.TransportCredentials + // CredsBundle is the credentials bundle used by the ClientConn for + // communicating with the target gRPC service (set via + // WithCredentialsBundle). In cases where a name resolution service + // requires the same credentials, the resolver may use this field. In most + // cases though, it is not appropriate, and this field may be ignored. + CredsBundle credentials.Bundle + // Dialer is the custom dialer used by the ClientConn for dialling the + // target gRPC service (set via WithDialer). In cases where a name + // resolution service requires the same dialer, the resolver may use this + // field. In most cases though, it is not appropriate, and this field may + // be ignored. + Dialer func(context.Context, string) (net.Conn, error) +} + +// State contains the current Resolver state relevant to the ClientConn. +type State struct { + // Addresses is the latest set of resolved addresses for the target. + Addresses []Address + + // ServiceConfig contains the result from parsing the latest service + // config. If it is nil, it indicates no service config is present or the + // resolver does not provide service configs. + ServiceConfig *serviceconfig.ParseResult + + // Attributes contains arbitrary data about the resolver intended for + // consumption by the load balancing policy. + Attributes *attributes.Attributes +} + +// ClientConn contains the callbacks for resolver to notify any updates +// to the gRPC ClientConn. +// +// This interface is to be implemented by gRPC. Users should not need a +// brand new implementation of this interface. For the situations like +// testing, the new implementation should embed this interface. This allows +// gRPC to add new methods to this interface. +type ClientConn interface { + // UpdateState updates the state of the ClientConn appropriately. + UpdateState(State) + // ReportError notifies the ClientConn that the Resolver encountered an + // error. The ClientConn will notify the load balancer and begin calling + // ResolveNow on the Resolver with exponential backoff. + ReportError(error) + // NewAddress is called by resolver to notify ClientConn a new list + // of resolved addresses. + // The address list should be the complete list of resolved addresses. + // + // Deprecated: Use UpdateState instead. + NewAddress(addresses []Address) + // NewServiceConfig is called by resolver to notify ClientConn a new + // service config. The service config should be provided as a json string. + // + // Deprecated: Use UpdateState instead. + NewServiceConfig(serviceConfig string) + // ParseServiceConfig parses the provided service config and returns an + // object that provides the parsed config. + ParseServiceConfig(serviceConfigJSON string) *serviceconfig.ParseResult +} + +// Target represents a target for gRPC, as specified in: +// https://github.com/grpc/grpc/blob/master/doc/naming.md. +// It is parsed from the target string that gets passed into Dial or DialContext by the user. And +// grpc passes it to the resolver and the balancer. +// +// If the target follows the naming spec, and the parsed scheme is registered with grpc, we will +// parse the target string according to the spec. e.g. "dns://some_authority/foo.bar" will be parsed +// into &Target{Scheme: "dns", Authority: "some_authority", Endpoint: "foo.bar"} +// +// If the target does not contain a scheme, we will apply the default scheme, and set the Target to +// be the full target string. e.g. "foo.bar" will be parsed into +// &Target{Scheme: resolver.GetDefaultScheme(), Endpoint: "foo.bar"}. +// +// If the parsed scheme is not registered (i.e. no corresponding resolver available to resolve the +// endpoint), we set the Scheme to be the default scheme, and set the Endpoint to be the full target +// string. e.g. target string "unknown_scheme://authority/endpoint" will be parsed into +// &Target{Scheme: resolver.GetDefaultScheme(), Endpoint: "unknown_scheme://authority/endpoint"}. +type Target struct { + Scheme string + Authority string + Endpoint string +} + +// Builder creates a resolver that will be used to watch name resolution updates. +type Builder interface { + // Build creates a new resolver for the given target. + // + // gRPC dial calls Build synchronously, and fails if the returned error is + // not nil. + Build(target Target, cc ClientConn, opts BuildOptions) (Resolver, error) + // Scheme returns the scheme supported by this resolver. + // Scheme is defined at https://github.com/grpc/grpc/blob/master/doc/naming.md. + Scheme() string +} + +// ResolveNowOptions includes additional information for ResolveNow. +type ResolveNowOptions struct{} + +// Resolver watches for the updates on the specified target. +// Updates include address updates and service config updates. +type Resolver interface { + // ResolveNow will be called by gRPC to try to resolve the target name + // again. It's just a hint, resolver can ignore this if it's not necessary. + // + // It could be called multiple times concurrently. + ResolveNow(ResolveNowOptions) + // Close closes the resolver. + Close() +} + +// UnregisterForTesting removes the resolver builder with the given scheme from the +// resolver map. +// This function is for testing only. +func UnregisterForTesting(scheme string) { + delete(m, scheme) +} diff --git a/vendor/google.golang.org/grpc/resolver_conn_wrapper.go b/vendor/google.golang.org/grpc/resolver_conn_wrapper.go new file mode 100644 index 00000000..edfda866 --- /dev/null +++ b/vendor/google.golang.org/grpc/resolver_conn_wrapper.go @@ -0,0 +1,222 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "fmt" + "strings" + "sync" + "time" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/internal/channelz" + "google.golang.org/grpc/internal/grpcsync" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/serviceconfig" +) + +// ccResolverWrapper is a wrapper on top of cc for resolvers. +// It implements resolver.ClientConn interface. +type ccResolverWrapper struct { + cc *ClientConn + resolverMu sync.Mutex + resolver resolver.Resolver + done *grpcsync.Event + curState resolver.State + + pollingMu sync.Mutex + polling chan struct{} +} + +// newCCResolverWrapper uses the resolver.Builder to build a Resolver and +// returns a ccResolverWrapper object which wraps the newly built resolver. +func newCCResolverWrapper(cc *ClientConn, rb resolver.Builder) (*ccResolverWrapper, error) { + ccr := &ccResolverWrapper{ + cc: cc, + done: grpcsync.NewEvent(), + } + + var credsClone credentials.TransportCredentials + if creds := cc.dopts.copts.TransportCredentials; creds != nil { + credsClone = creds.Clone() + } + rbo := resolver.BuildOptions{ + DisableServiceConfig: cc.dopts.disableServiceConfig, + DialCreds: credsClone, + CredsBundle: cc.dopts.copts.CredsBundle, + Dialer: cc.dopts.copts.Dialer, + } + + var err error + // We need to hold the lock here while we assign to the ccr.resolver field + // to guard against a data race caused by the following code path, + // rb.Build-->ccr.ReportError-->ccr.poll-->ccr.resolveNow, would end up + // accessing ccr.resolver which is being assigned here. + ccr.resolverMu.Lock() + defer ccr.resolverMu.Unlock() + ccr.resolver, err = rb.Build(cc.parsedTarget, ccr, rbo) + if err != nil { + return nil, err + } + return ccr, nil +} + +func (ccr *ccResolverWrapper) resolveNow(o resolver.ResolveNowOptions) { + ccr.resolverMu.Lock() + if !ccr.done.HasFired() { + ccr.resolver.ResolveNow(o) + } + ccr.resolverMu.Unlock() +} + +func (ccr *ccResolverWrapper) close() { + ccr.resolverMu.Lock() + ccr.resolver.Close() + ccr.done.Fire() + ccr.resolverMu.Unlock() +} + +// poll begins or ends asynchronous polling of the resolver based on whether +// err is ErrBadResolverState. +func (ccr *ccResolverWrapper) poll(err error) { + ccr.pollingMu.Lock() + defer ccr.pollingMu.Unlock() + if err != balancer.ErrBadResolverState { + // stop polling + if ccr.polling != nil { + close(ccr.polling) + ccr.polling = nil + } + return + } + if ccr.polling != nil { + // already polling + return + } + p := make(chan struct{}) + ccr.polling = p + go func() { + for i := 0; ; i++ { + ccr.resolveNow(resolver.ResolveNowOptions{}) + t := time.NewTimer(ccr.cc.dopts.resolveNowBackoff(i)) + select { + case <-p: + t.Stop() + return + case <-ccr.done.Done(): + // Resolver has been closed. + t.Stop() + return + case <-t.C: + select { + case <-p: + return + default: + } + // Timer expired; re-resolve. + } + } + }() +} + +func (ccr *ccResolverWrapper) UpdateState(s resolver.State) { + if ccr.done.HasFired() { + return + } + channelz.Infof(ccr.cc.channelzID, "ccResolverWrapper: sending update to cc: %v", s) + if channelz.IsOn() { + ccr.addChannelzTraceEvent(s) + } + ccr.curState = s + ccr.poll(ccr.cc.updateResolverState(ccr.curState, nil)) +} + +func (ccr *ccResolverWrapper) ReportError(err error) { + if ccr.done.HasFired() { + return + } + channelz.Warningf(ccr.cc.channelzID, "ccResolverWrapper: reporting error to cc: %v", err) + ccr.poll(ccr.cc.updateResolverState(resolver.State{}, err)) +} + +// NewAddress is called by the resolver implementation to send addresses to gRPC. +func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) { + if ccr.done.HasFired() { + return + } + channelz.Infof(ccr.cc.channelzID, "ccResolverWrapper: sending new addresses to cc: %v", addrs) + if channelz.IsOn() { + ccr.addChannelzTraceEvent(resolver.State{Addresses: addrs, ServiceConfig: ccr.curState.ServiceConfig}) + } + ccr.curState.Addresses = addrs + ccr.poll(ccr.cc.updateResolverState(ccr.curState, nil)) +} + +// NewServiceConfig is called by the resolver implementation to send service +// configs to gRPC. +func (ccr *ccResolverWrapper) NewServiceConfig(sc string) { + if ccr.done.HasFired() { + return + } + channelz.Infof(ccr.cc.channelzID, "ccResolverWrapper: got new service config: %v", sc) + if ccr.cc.dopts.disableServiceConfig { + channelz.Info(ccr.cc.channelzID, "Service config lookups disabled; ignoring config") + return + } + scpr := parseServiceConfig(sc) + if scpr.Err != nil { + channelz.Warningf(ccr.cc.channelzID, "ccResolverWrapper: error parsing service config: %v", scpr.Err) + ccr.poll(balancer.ErrBadResolverState) + return + } + if channelz.IsOn() { + ccr.addChannelzTraceEvent(resolver.State{Addresses: ccr.curState.Addresses, ServiceConfig: scpr}) + } + ccr.curState.ServiceConfig = scpr + ccr.poll(ccr.cc.updateResolverState(ccr.curState, nil)) +} + +func (ccr *ccResolverWrapper) ParseServiceConfig(scJSON string) *serviceconfig.ParseResult { + return parseServiceConfig(scJSON) +} + +func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) { + var updates []string + var oldSC, newSC *ServiceConfig + var oldOK, newOK bool + if ccr.curState.ServiceConfig != nil { + oldSC, oldOK = ccr.curState.ServiceConfig.Config.(*ServiceConfig) + } + if s.ServiceConfig != nil { + newSC, newOK = s.ServiceConfig.Config.(*ServiceConfig) + } + if oldOK != newOK || (oldOK && newOK && oldSC.rawJSONString != newSC.rawJSONString) { + updates = append(updates, "service config updated") + } + if len(ccr.curState.Addresses) > 0 && len(s.Addresses) == 0 { + updates = append(updates, "resolver returned an empty address list") + } else if len(ccr.curState.Addresses) == 0 && len(s.Addresses) > 0 { + updates = append(updates, "resolver returned new addresses") + } + channelz.AddTraceEvent(ccr.cc.channelzID, 0, &channelz.TraceEventDesc{ + Desc: fmt.Sprintf("Resolver state updated: %+v (%v)", s, strings.Join(updates, "; ")), + Severity: channelz.CtINFO, + }) +} diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go new file mode 100644 index 00000000..cf9dbe7f --- /dev/null +++ b/vendor/google.golang.org/grpc/rpc_util.go @@ -0,0 +1,889 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "bytes" + "compress/gzip" + "context" + "encoding/binary" + "fmt" + "io" + "io/ioutil" + "math" + "net/url" + "strings" + "sync" + "time" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/encoding" + "google.golang.org/grpc/encoding/proto" + "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" +) + +// Compressor defines the interface gRPC uses to compress a message. +// +// Deprecated: use package encoding. +type Compressor interface { + // Do compresses p into w. + Do(w io.Writer, p []byte) error + // Type returns the compression algorithm the Compressor uses. + Type() string +} + +type gzipCompressor struct { + pool sync.Pool +} + +// NewGZIPCompressor creates a Compressor based on GZIP. +// +// Deprecated: use package encoding/gzip. +func NewGZIPCompressor() Compressor { + c, _ := NewGZIPCompressorWithLevel(gzip.DefaultCompression) + return c +} + +// NewGZIPCompressorWithLevel is like NewGZIPCompressor but specifies the gzip compression level instead +// of assuming DefaultCompression. +// +// The error returned will be nil if the level is valid. +// +// Deprecated: use package encoding/gzip. +func NewGZIPCompressorWithLevel(level int) (Compressor, error) { + if level < gzip.DefaultCompression || level > gzip.BestCompression { + return nil, fmt.Errorf("grpc: invalid compression level: %d", level) + } + return &gzipCompressor{ + pool: sync.Pool{ + New: func() interface{} { + w, err := gzip.NewWriterLevel(ioutil.Discard, level) + if err != nil { + panic(err) + } + return w + }, + }, + }, nil +} + +func (c *gzipCompressor) Do(w io.Writer, p []byte) error { + z := c.pool.Get().(*gzip.Writer) + defer c.pool.Put(z) + z.Reset(w) + if _, err := z.Write(p); err != nil { + return err + } + return z.Close() +} + +func (c *gzipCompressor) Type() string { + return "gzip" +} + +// Decompressor defines the interface gRPC uses to decompress a message. +// +// Deprecated: use package encoding. +type Decompressor interface { + // Do reads the data from r and uncompress them. + Do(r io.Reader) ([]byte, error) + // Type returns the compression algorithm the Decompressor uses. + Type() string +} + +type gzipDecompressor struct { + pool sync.Pool +} + +// NewGZIPDecompressor creates a Decompressor based on GZIP. +// +// Deprecated: use package encoding/gzip. +func NewGZIPDecompressor() Decompressor { + return &gzipDecompressor{} +} + +func (d *gzipDecompressor) Do(r io.Reader) ([]byte, error) { + var z *gzip.Reader + switch maybeZ := d.pool.Get().(type) { + case nil: + newZ, err := gzip.NewReader(r) + if err != nil { + return nil, err + } + z = newZ + case *gzip.Reader: + z = maybeZ + if err := z.Reset(r); err != nil { + d.pool.Put(z) + return nil, err + } + } + + defer func() { + z.Close() + d.pool.Put(z) + }() + return ioutil.ReadAll(z) +} + +func (d *gzipDecompressor) Type() string { + return "gzip" +} + +// callInfo contains all related configuration and information about an RPC. +type callInfo struct { + compressorType string + failFast bool + stream ClientStream + maxReceiveMessageSize *int + maxSendMessageSize *int + creds credentials.PerRPCCredentials + contentSubtype string + codec baseCodec + maxRetryRPCBufferSize int +} + +func defaultCallInfo() *callInfo { + return &callInfo{ + failFast: true, + maxRetryRPCBufferSize: 256 * 1024, // 256KB + } +} + +// CallOption configures a Call before it starts or extracts information from +// a Call after it completes. +type CallOption interface { + // before is called before the call is sent to any server. If before + // returns a non-nil error, the RPC fails with that error. + before(*callInfo) error + + // after is called after the call has completed. after cannot return an + // error, so any failures should be reported via output parameters. + after(*callInfo) +} + +// EmptyCallOption does not alter the Call configuration. +// It can be embedded in another structure to carry satellite data for use +// by interceptors. +type EmptyCallOption struct{} + +func (EmptyCallOption) before(*callInfo) error { return nil } +func (EmptyCallOption) after(*callInfo) {} + +// Header returns a CallOptions that retrieves the header metadata +// for a unary RPC. +func Header(md *metadata.MD) CallOption { + return HeaderCallOption{HeaderAddr: md} +} + +// HeaderCallOption is a CallOption for collecting response header metadata. +// The metadata field will be populated *after* the RPC completes. +// This is an EXPERIMENTAL API. +type HeaderCallOption struct { + HeaderAddr *metadata.MD +} + +func (o HeaderCallOption) before(c *callInfo) error { return nil } +func (o HeaderCallOption) after(c *callInfo) { + if c.stream != nil { + *o.HeaderAddr, _ = c.stream.Header() + } +} + +// Trailer returns a CallOptions that retrieves the trailer metadata +// for a unary RPC. +func Trailer(md *metadata.MD) CallOption { + return TrailerCallOption{TrailerAddr: md} +} + +// TrailerCallOption is a CallOption for collecting response trailer metadata. +// The metadata field will be populated *after* the RPC completes. +// This is an EXPERIMENTAL API. +type TrailerCallOption struct { + TrailerAddr *metadata.MD +} + +func (o TrailerCallOption) before(c *callInfo) error { return nil } +func (o TrailerCallOption) after(c *callInfo) { + if c.stream != nil { + *o.TrailerAddr = c.stream.Trailer() + } +} + +// Peer returns a CallOption that retrieves peer information for a unary RPC. +// The peer field will be populated *after* the RPC completes. +func Peer(p *peer.Peer) CallOption { + return PeerCallOption{PeerAddr: p} +} + +// PeerCallOption is a CallOption for collecting the identity of the remote +// peer. The peer field will be populated *after* the RPC completes. +// This is an EXPERIMENTAL API. +type PeerCallOption struct { + PeerAddr *peer.Peer +} + +func (o PeerCallOption) before(c *callInfo) error { return nil } +func (o PeerCallOption) after(c *callInfo) { + if c.stream != nil { + if x, ok := peer.FromContext(c.stream.Context()); ok { + *o.PeerAddr = *x + } + } +} + +// WaitForReady configures the action to take when an RPC is attempted on broken +// connections or unreachable servers. If waitForReady is false, the RPC will fail +// immediately. Otherwise, the RPC client will block the call until a +// connection is available (or the call is canceled or times out) and will +// retry the call if it fails due to a transient error. gRPC will not retry if +// data was written to the wire unless the server indicates it did not process +// the data. Please refer to +// https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md. +// +// By default, RPCs don't "wait for ready". +func WaitForReady(waitForReady bool) CallOption { + return FailFastCallOption{FailFast: !waitForReady} +} + +// FailFast is the opposite of WaitForReady. +// +// Deprecated: use WaitForReady. +func FailFast(failFast bool) CallOption { + return FailFastCallOption{FailFast: failFast} +} + +// FailFastCallOption is a CallOption for indicating whether an RPC should fail +// fast or not. +// This is an EXPERIMENTAL API. +type FailFastCallOption struct { + FailFast bool +} + +func (o FailFastCallOption) before(c *callInfo) error { + c.failFast = o.FailFast + return nil +} +func (o FailFastCallOption) after(c *callInfo) {} + +// MaxCallRecvMsgSize returns a CallOption which sets the maximum message size +// in bytes the client can receive. +func MaxCallRecvMsgSize(bytes int) CallOption { + return MaxRecvMsgSizeCallOption{MaxRecvMsgSize: bytes} +} + +// MaxRecvMsgSizeCallOption is a CallOption that indicates the maximum message +// size in bytes the client can receive. +// This is an EXPERIMENTAL API. +type MaxRecvMsgSizeCallOption struct { + MaxRecvMsgSize int +} + +func (o MaxRecvMsgSizeCallOption) before(c *callInfo) error { + c.maxReceiveMessageSize = &o.MaxRecvMsgSize + return nil +} +func (o MaxRecvMsgSizeCallOption) after(c *callInfo) {} + +// MaxCallSendMsgSize returns a CallOption which sets the maximum message size +// in bytes the client can send. +func MaxCallSendMsgSize(bytes int) CallOption { + return MaxSendMsgSizeCallOption{MaxSendMsgSize: bytes} +} + +// MaxSendMsgSizeCallOption is a CallOption that indicates the maximum message +// size in bytes the client can send. +// This is an EXPERIMENTAL API. +type MaxSendMsgSizeCallOption struct { + MaxSendMsgSize int +} + +func (o MaxSendMsgSizeCallOption) before(c *callInfo) error { + c.maxSendMessageSize = &o.MaxSendMsgSize + return nil +} +func (o MaxSendMsgSizeCallOption) after(c *callInfo) {} + +// PerRPCCredentials returns a CallOption that sets credentials.PerRPCCredentials +// for a call. +func PerRPCCredentials(creds credentials.PerRPCCredentials) CallOption { + return PerRPCCredsCallOption{Creds: creds} +} + +// PerRPCCredsCallOption is a CallOption that indicates the per-RPC +// credentials to use for the call. +// This is an EXPERIMENTAL API. +type PerRPCCredsCallOption struct { + Creds credentials.PerRPCCredentials +} + +func (o PerRPCCredsCallOption) before(c *callInfo) error { + c.creds = o.Creds + return nil +} +func (o PerRPCCredsCallOption) after(c *callInfo) {} + +// UseCompressor returns a CallOption which sets the compressor used when +// sending the request. If WithCompressor is also set, UseCompressor has +// higher priority. +// +// This API is EXPERIMENTAL. +func UseCompressor(name string) CallOption { + return CompressorCallOption{CompressorType: name} +} + +// CompressorCallOption is a CallOption that indicates the compressor to use. +// This is an EXPERIMENTAL API. +type CompressorCallOption struct { + CompressorType string +} + +func (o CompressorCallOption) before(c *callInfo) error { + c.compressorType = o.CompressorType + return nil +} +func (o CompressorCallOption) after(c *callInfo) {} + +// CallContentSubtype returns a CallOption that will set the content-subtype +// for a call. For example, if content-subtype is "json", the Content-Type over +// the wire will be "application/grpc+json". The content-subtype is converted +// to lowercase before being included in Content-Type. See Content-Type on +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. +// +// If ForceCodec is not also used, the content-subtype will be used to look up +// the Codec to use in the registry controlled by RegisterCodec. See the +// documentation on RegisterCodec for details on registration. The lookup of +// content-subtype is case-insensitive. If no such Codec is found, the call +// will result in an error with code codes.Internal. +// +// If ForceCodec is also used, that Codec will be used for all request and +// response messages, with the content-subtype set to the given contentSubtype +// here for requests. +func CallContentSubtype(contentSubtype string) CallOption { + return ContentSubtypeCallOption{ContentSubtype: strings.ToLower(contentSubtype)} +} + +// ContentSubtypeCallOption is a CallOption that indicates the content-subtype +// used for marshaling messages. +// This is an EXPERIMENTAL API. +type ContentSubtypeCallOption struct { + ContentSubtype string +} + +func (o ContentSubtypeCallOption) before(c *callInfo) error { + c.contentSubtype = o.ContentSubtype + return nil +} +func (o ContentSubtypeCallOption) after(c *callInfo) {} + +// ForceCodec returns a CallOption that will set the given Codec to be +// used for all request and response messages for a call. The result of calling +// String() will be used as the content-subtype in a case-insensitive manner. +// +// See Content-Type on +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. Also see the documentation on RegisterCodec and +// CallContentSubtype for more details on the interaction between Codec and +// content-subtype. +// +// This function is provided for advanced users; prefer to use only +// CallContentSubtype to select a registered codec instead. +// +// This is an EXPERIMENTAL API. +func ForceCodec(codec encoding.Codec) CallOption { + return ForceCodecCallOption{Codec: codec} +} + +// ForceCodecCallOption is a CallOption that indicates the codec used for +// marshaling messages. +// +// This is an EXPERIMENTAL API. +type ForceCodecCallOption struct { + Codec encoding.Codec +} + +func (o ForceCodecCallOption) before(c *callInfo) error { + c.codec = o.Codec + return nil +} +func (o ForceCodecCallOption) after(c *callInfo) {} + +// CallCustomCodec behaves like ForceCodec, but accepts a grpc.Codec instead of +// an encoding.Codec. +// +// Deprecated: use ForceCodec instead. +func CallCustomCodec(codec Codec) CallOption { + return CustomCodecCallOption{Codec: codec} +} + +// CustomCodecCallOption is a CallOption that indicates the codec used for +// marshaling messages. +// +// This is an EXPERIMENTAL API. +type CustomCodecCallOption struct { + Codec Codec +} + +func (o CustomCodecCallOption) before(c *callInfo) error { + c.codec = o.Codec + return nil +} +func (o CustomCodecCallOption) after(c *callInfo) {} + +// MaxRetryRPCBufferSize returns a CallOption that limits the amount of memory +// used for buffering this RPC's requests for retry purposes. +// +// This API is EXPERIMENTAL. +func MaxRetryRPCBufferSize(bytes int) CallOption { + return MaxRetryRPCBufferSizeCallOption{bytes} +} + +// MaxRetryRPCBufferSizeCallOption is a CallOption indicating the amount of +// memory to be used for caching this RPC for retry purposes. +// This is an EXPERIMENTAL API. +type MaxRetryRPCBufferSizeCallOption struct { + MaxRetryRPCBufferSize int +} + +func (o MaxRetryRPCBufferSizeCallOption) before(c *callInfo) error { + c.maxRetryRPCBufferSize = o.MaxRetryRPCBufferSize + return nil +} +func (o MaxRetryRPCBufferSizeCallOption) after(c *callInfo) {} + +// The format of the payload: compressed or not? +type payloadFormat uint8 + +const ( + compressionNone payloadFormat = 0 // no compression + compressionMade payloadFormat = 1 // compressed +) + +// parser reads complete gRPC messages from the underlying reader. +type parser struct { + // r is the underlying reader. + // See the comment on recvMsg for the permissible + // error types. + r io.Reader + + // The header of a gRPC message. Find more detail at + // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md + header [5]byte +} + +// recvMsg reads a complete gRPC message from the stream. +// +// It returns the message and its payload (compression/encoding) +// format. The caller owns the returned msg memory. +// +// If there is an error, possible values are: +// * io.EOF, when no messages remain +// * io.ErrUnexpectedEOF +// * of type transport.ConnectionError +// * an error from the status package +// No other error values or types must be returned, which also means +// that the underlying io.Reader must not return an incompatible +// error. +func (p *parser) recvMsg(maxReceiveMessageSize int) (pf payloadFormat, msg []byte, err error) { + if _, err := p.r.Read(p.header[:]); err != nil { + return 0, nil, err + } + + pf = payloadFormat(p.header[0]) + length := binary.BigEndian.Uint32(p.header[1:]) + + if length == 0 { + return pf, nil, nil + } + if int64(length) > int64(maxInt) { + return 0, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max length allowed on current machine (%d vs. %d)", length, maxInt) + } + if int(length) > maxReceiveMessageSize { + return 0, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", length, maxReceiveMessageSize) + } + // TODO(bradfitz,zhaoq): garbage. reuse buffer after proto decoding instead + // of making it for each message: + msg = make([]byte, int(length)) + if _, err := p.r.Read(msg); err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + return 0, nil, err + } + return pf, msg, nil +} + +// encode serializes msg and returns a buffer containing the message, or an +// error if it is too large to be transmitted by grpc. If msg is nil, it +// generates an empty message. +func encode(c baseCodec, msg interface{}) ([]byte, error) { + if msg == nil { // NOTE: typed nils will not be caught by this check + return nil, nil + } + b, err := c.Marshal(msg) + if err != nil { + return nil, status.Errorf(codes.Internal, "grpc: error while marshaling: %v", err.Error()) + } + if uint(len(b)) > math.MaxUint32 { + return nil, status.Errorf(codes.ResourceExhausted, "grpc: message too large (%d bytes)", len(b)) + } + return b, nil +} + +// compress returns the input bytes compressed by compressor or cp. If both +// compressors are nil, returns nil. +// +// TODO(dfawley): eliminate cp parameter by wrapping Compressor in an encoding.Compressor. +func compress(in []byte, cp Compressor, compressor encoding.Compressor) ([]byte, error) { + if compressor == nil && cp == nil { + return nil, nil + } + wrapErr := func(err error) error { + return status.Errorf(codes.Internal, "grpc: error while compressing: %v", err.Error()) + } + cbuf := &bytes.Buffer{} + if compressor != nil { + z, err := compressor.Compress(cbuf) + if err != nil { + return nil, wrapErr(err) + } + if _, err := z.Write(in); err != nil { + return nil, wrapErr(err) + } + if err := z.Close(); err != nil { + return nil, wrapErr(err) + } + } else { + if err := cp.Do(cbuf, in); err != nil { + return nil, wrapErr(err) + } + } + return cbuf.Bytes(), nil +} + +const ( + payloadLen = 1 + sizeLen = 4 + headerLen = payloadLen + sizeLen +) + +// msgHeader returns a 5-byte header for the message being transmitted and the +// payload, which is compData if non-nil or data otherwise. +func msgHeader(data, compData []byte) (hdr []byte, payload []byte) { + hdr = make([]byte, headerLen) + if compData != nil { + hdr[0] = byte(compressionMade) + data = compData + } else { + hdr[0] = byte(compressionNone) + } + + // Write length of payload into buf + binary.BigEndian.PutUint32(hdr[payloadLen:], uint32(len(data))) + return hdr, data +} + +func outPayload(client bool, msg interface{}, data, payload []byte, t time.Time) *stats.OutPayload { + return &stats.OutPayload{ + Client: client, + Payload: msg, + Data: data, + Length: len(data), + WireLength: len(payload) + headerLen, + SentTime: t, + } +} + +func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool) *status.Status { + switch pf { + case compressionNone: + case compressionMade: + if recvCompress == "" || recvCompress == encoding.Identity { + return status.New(codes.Internal, "grpc: compressed flag set with identity or empty encoding") + } + if !haveCompressor { + return status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) + } + default: + return status.Newf(codes.Internal, "grpc: received unexpected payload format %d", pf) + } + return nil +} + +type payloadInfo struct { + wireLength int // The compressed length got from wire. + uncompressedBytes []byte +} + +func recvAndDecompress(p *parser, s *transport.Stream, dc Decompressor, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor) ([]byte, error) { + pf, d, err := p.recvMsg(maxReceiveMessageSize) + if err != nil { + return nil, err + } + if payInfo != nil { + payInfo.wireLength = len(d) + } + + if st := checkRecvPayload(pf, s.RecvCompress(), compressor != nil || dc != nil); st != nil { + return nil, st.Err() + } + + var size int + if pf == compressionMade { + // To match legacy behavior, if the decompressor is set by WithDecompressor or RPCDecompressor, + // use this decompressor as the default. + if dc != nil { + d, err = dc.Do(bytes.NewReader(d)) + size = len(d) + } else { + d, size, err = decompress(compressor, d, maxReceiveMessageSize) + } + if err != nil { + return nil, status.Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err) + } + } else { + size = len(d) + } + if size > maxReceiveMessageSize { + // TODO: Revisit the error code. Currently keep it consistent with java + // implementation. + return nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", size, maxReceiveMessageSize) + } + return d, nil +} + +// Using compressor, decompress d, returning data and size. +// Optionally, if data will be over maxReceiveMessageSize, just return the size. +func decompress(compressor encoding.Compressor, d []byte, maxReceiveMessageSize int) ([]byte, int, error) { + dcReader, err := compressor.Decompress(bytes.NewReader(d)) + if err != nil { + return nil, 0, err + } + if sizer, ok := compressor.(interface { + DecompressedSize(compressedBytes []byte) int + }); ok { + if size := sizer.DecompressedSize(d); size >= 0 { + if size > maxReceiveMessageSize { + return nil, size, nil + } + // size is used as an estimate to size the buffer, but we + // will read more data if available. + // +MinRead so ReadFrom will not reallocate if size is correct. + buf := bytes.NewBuffer(make([]byte, 0, size+bytes.MinRead)) + bytesRead, err := buf.ReadFrom(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) + return buf.Bytes(), int(bytesRead), err + } + } + // Read from LimitReader with limit max+1. So if the underlying + // reader is over limit, the result will be bigger than max. + d, err = ioutil.ReadAll(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) + return d, len(d), err +} + +// For the two compressor parameters, both should not be set, but if they are, +// dc takes precedence over compressor. +// TODO(dfawley): wrap the old compressor/decompressor using the new API? +func recv(p *parser, c baseCodec, s *transport.Stream, dc Decompressor, m interface{}, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor) error { + d, err := recvAndDecompress(p, s, dc, maxReceiveMessageSize, payInfo, compressor) + if err != nil { + return err + } + if err := c.Unmarshal(d, m); err != nil { + return status.Errorf(codes.Internal, "grpc: failed to unmarshal the received message %v", err) + } + if payInfo != nil { + payInfo.uncompressedBytes = d + } + return nil +} + +// Information about RPC +type rpcInfo struct { + failfast bool + preloaderInfo *compressorInfo +} + +// Information about Preloader +// Responsible for storing codec, and compressors +// If stream (s) has context s.Context which stores rpcInfo that has non nil +// pointers to codec, and compressors, then we can use preparedMsg for Async message prep +// and reuse marshalled bytes +type compressorInfo struct { + codec baseCodec + cp Compressor + comp encoding.Compressor +} + +type rpcInfoContextKey struct{} + +func newContextWithRPCInfo(ctx context.Context, failfast bool, codec baseCodec, cp Compressor, comp encoding.Compressor) context.Context { + return context.WithValue(ctx, rpcInfoContextKey{}, &rpcInfo{ + failfast: failfast, + preloaderInfo: &compressorInfo{ + codec: codec, + cp: cp, + comp: comp, + }, + }) +} + +func rpcInfoFromContext(ctx context.Context) (s *rpcInfo, ok bool) { + s, ok = ctx.Value(rpcInfoContextKey{}).(*rpcInfo) + return +} + +// Code returns the error code for err if it was produced by the rpc system. +// Otherwise, it returns codes.Unknown. +// +// Deprecated: use status.Code instead. +func Code(err error) codes.Code { + return status.Code(err) +} + +// ErrorDesc returns the error description of err if it was produced by the rpc system. +// Otherwise, it returns err.Error() or empty string when err is nil. +// +// Deprecated: use status.Convert and Message method instead. +func ErrorDesc(err error) string { + return status.Convert(err).Message() +} + +// Errorf returns an error containing an error code and a description; +// Errorf returns nil if c is OK. +// +// Deprecated: use status.Errorf instead. +func Errorf(c codes.Code, format string, a ...interface{}) error { + return status.Errorf(c, format, a...) +} + +// toRPCErr converts an error into an error from the status package. +func toRPCErr(err error) error { + if err == nil || err == io.EOF { + return err + } + if err == io.ErrUnexpectedEOF { + return status.Error(codes.Internal, err.Error()) + } + if _, ok := status.FromError(err); ok { + return err + } + switch e := err.(type) { + case transport.ConnectionError: + return status.Error(codes.Unavailable, e.Desc) + default: + switch err { + case context.DeadlineExceeded: + return status.Error(codes.DeadlineExceeded, err.Error()) + case context.Canceled: + return status.Error(codes.Canceled, err.Error()) + } + } + return status.Error(codes.Unknown, err.Error()) +} + +// setCallInfoCodec should only be called after CallOptions have been applied. +func setCallInfoCodec(c *callInfo) error { + if c.codec != nil { + // codec was already set by a CallOption; use it. + return nil + } + + if c.contentSubtype == "" { + // No codec specified in CallOptions; use proto by default. + c.codec = encoding.GetCodec(proto.Name) + return nil + } + + // c.contentSubtype is already lowercased in CallContentSubtype + c.codec = encoding.GetCodec(c.contentSubtype) + if c.codec == nil { + return status.Errorf(codes.Internal, "no codec registered for content-subtype %s", c.contentSubtype) + } + return nil +} + +// parseDialTarget returns the network and address to pass to dialer +func parseDialTarget(target string) (net string, addr string) { + net = "tcp" + + m1 := strings.Index(target, ":") + m2 := strings.Index(target, ":/") + + // handle unix:addr which will fail with url.Parse + if m1 >= 0 && m2 < 0 { + if n := target[0:m1]; n == "unix" { + net = n + addr = target[m1+1:] + return net, addr + } + } + if m2 >= 0 { + t, err := url.Parse(target) + if err != nil { + return net, target + } + scheme := t.Scheme + addr = t.Path + if scheme == "unix" { + net = scheme + if addr == "" { + addr = t.Host + } + return net, addr + } + } + + return net, target +} + +// channelzData is used to store channelz related data for ClientConn, addrConn and Server. +// These fields cannot be embedded in the original structs (e.g. ClientConn), since to do atomic +// operation on int64 variable on 32-bit machine, user is responsible to enforce memory alignment. +// Here, by grouping those int64 fields inside a struct, we are enforcing the alignment. +type channelzData struct { + callsStarted int64 + callsFailed int64 + callsSucceeded int64 + // lastCallStartedTime stores the timestamp that last call starts. It is of int64 type instead of + // time.Time since it's more costly to atomically update time.Time variable than int64 variable. + lastCallStartedTime int64 +} + +// The SupportPackageIsVersion variables are referenced from generated protocol +// buffer files to ensure compatibility with the gRPC version used. The latest +// support package version is 6. +// +// Older versions are kept for compatibility. They may be removed if +// compatibility cannot be maintained. +// +// These constants should not be referenced from any other code. +const ( + SupportPackageIsVersion3 = true + SupportPackageIsVersion4 = true + SupportPackageIsVersion5 = true + SupportPackageIsVersion6 = true +) + +const grpcUA = "grpc-go/" + Version diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go new file mode 100644 index 00000000..edfcdcae --- /dev/null +++ b/vendor/google.golang.org/grpc/server.go @@ -0,0 +1,1640 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "context" + "errors" + "fmt" + "io" + "math" + "net" + "net/http" + "reflect" + "runtime" + "strings" + "sync" + "sync/atomic" + "time" + + "golang.org/x/net/trace" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/encoding" + "google.golang.org/grpc/encoding/proto" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/binarylog" + "google.golang.org/grpc/internal/channelz" + "google.golang.org/grpc/internal/grpcsync" + "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" + "google.golang.org/grpc/tap" +) + +const ( + defaultServerMaxReceiveMessageSize = 1024 * 1024 * 4 + defaultServerMaxSendMessageSize = math.MaxInt32 +) + +var statusOK = status.New(codes.OK, "") + +type methodHandler func(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor UnaryServerInterceptor) (interface{}, error) + +// MethodDesc represents an RPC service's method specification. +type MethodDesc struct { + MethodName string + Handler methodHandler +} + +// ServiceDesc represents an RPC service's specification. +type ServiceDesc struct { + ServiceName string + // The pointer to the service interface. Used to check whether the user + // provided implementation satisfies the interface requirements. + HandlerType interface{} + Methods []MethodDesc + Streams []StreamDesc + Metadata interface{} +} + +// service consists of the information of the server serving this service and +// the methods in this service. +type service struct { + server interface{} // the server for service methods + md map[string]*MethodDesc + sd map[string]*StreamDesc + mdata interface{} +} + +// Server is a gRPC server to serve RPC requests. +type Server struct { + opts serverOptions + + mu sync.Mutex // guards following + lis map[net.Listener]bool + conns map[transport.ServerTransport]bool + serve bool + drain bool + cv *sync.Cond // signaled when connections close for GracefulStop + m map[string]*service // service name -> service info + events trace.EventLog + + quit *grpcsync.Event + done *grpcsync.Event + channelzRemoveOnce sync.Once + serveWG sync.WaitGroup // counts active Serve goroutines for GracefulStop + + channelzID int64 // channelz unique identification number + czData *channelzData +} + +type serverOptions struct { + creds credentials.TransportCredentials + codec baseCodec + cp Compressor + dc Decompressor + unaryInt UnaryServerInterceptor + streamInt StreamServerInterceptor + chainUnaryInts []UnaryServerInterceptor + chainStreamInts []StreamServerInterceptor + inTapHandle tap.ServerInHandle + statsHandler stats.Handler + maxConcurrentStreams uint32 + maxReceiveMessageSize int + maxSendMessageSize int + unknownStreamDesc *StreamDesc + keepaliveParams keepalive.ServerParameters + keepalivePolicy keepalive.EnforcementPolicy + initialWindowSize int32 + initialConnWindowSize int32 + writeBufferSize int + readBufferSize int + connectionTimeout time.Duration + maxHeaderListSize *uint32 + headerTableSize *uint32 +} + +var defaultServerOptions = serverOptions{ + maxReceiveMessageSize: defaultServerMaxReceiveMessageSize, + maxSendMessageSize: defaultServerMaxSendMessageSize, + connectionTimeout: 120 * time.Second, + writeBufferSize: defaultWriteBufSize, + readBufferSize: defaultReadBufSize, +} + +// A ServerOption sets options such as credentials, codec and keepalive parameters, etc. +type ServerOption interface { + apply(*serverOptions) +} + +// EmptyServerOption does not alter the server configuration. It can be embedded +// in another structure to build custom server options. +// +// This API is EXPERIMENTAL. +type EmptyServerOption struct{} + +func (EmptyServerOption) apply(*serverOptions) {} + +// funcServerOption wraps a function that modifies serverOptions into an +// implementation of the ServerOption interface. +type funcServerOption struct { + f func(*serverOptions) +} + +func (fdo *funcServerOption) apply(do *serverOptions) { + fdo.f(do) +} + +func newFuncServerOption(f func(*serverOptions)) *funcServerOption { + return &funcServerOption{ + f: f, + } +} + +// WriteBufferSize determines how much data can be batched before doing a write on the wire. +// The corresponding memory allocation for this buffer will be twice the size to keep syscalls low. +// The default value for this buffer is 32KB. +// Zero will disable the write buffer such that each write will be on underlying connection. +// Note: A Send call may not directly translate to a write. +func WriteBufferSize(s int) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.writeBufferSize = s + }) +} + +// ReadBufferSize lets you set the size of read buffer, this determines how much data can be read at most +// for one read syscall. +// The default value for this buffer is 32KB. +// Zero will disable read buffer for a connection so data framer can access the underlying +// conn directly. +func ReadBufferSize(s int) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.readBufferSize = s + }) +} + +// InitialWindowSize returns a ServerOption that sets window size for stream. +// The lower bound for window size is 64K and any value smaller than that will be ignored. +func InitialWindowSize(s int32) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.initialWindowSize = s + }) +} + +// InitialConnWindowSize returns a ServerOption that sets window size for a connection. +// The lower bound for window size is 64K and any value smaller than that will be ignored. +func InitialConnWindowSize(s int32) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.initialConnWindowSize = s + }) +} + +// KeepaliveParams returns a ServerOption that sets keepalive and max-age parameters for the server. +func KeepaliveParams(kp keepalive.ServerParameters) ServerOption { + if kp.Time > 0 && kp.Time < time.Second { + grpclog.Warning("Adjusting keepalive ping interval to minimum period of 1s") + kp.Time = time.Second + } + + return newFuncServerOption(func(o *serverOptions) { + o.keepaliveParams = kp + }) +} + +// KeepaliveEnforcementPolicy returns a ServerOption that sets keepalive enforcement policy for the server. +func KeepaliveEnforcementPolicy(kep keepalive.EnforcementPolicy) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.keepalivePolicy = kep + }) +} + +// CustomCodec returns a ServerOption that sets a codec for message marshaling and unmarshaling. +// +// This will override any lookups by content-subtype for Codecs registered with RegisterCodec. +func CustomCodec(codec Codec) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.codec = codec + }) +} + +// RPCCompressor returns a ServerOption that sets a compressor for outbound +// messages. For backward compatibility, all outbound messages will be sent +// using this compressor, regardless of incoming message compression. By +// default, server messages will be sent using the same compressor with which +// request messages were sent. +// +// Deprecated: use encoding.RegisterCompressor instead. +func RPCCompressor(cp Compressor) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.cp = cp + }) +} + +// RPCDecompressor returns a ServerOption that sets a decompressor for inbound +// messages. It has higher priority than decompressors registered via +// encoding.RegisterCompressor. +// +// Deprecated: use encoding.RegisterCompressor instead. +func RPCDecompressor(dc Decompressor) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.dc = dc + }) +} + +// MaxMsgSize returns a ServerOption to set the max message size in bytes the server can receive. +// If this is not set, gRPC uses the default limit. +// +// Deprecated: use MaxRecvMsgSize instead. +func MaxMsgSize(m int) ServerOption { + return MaxRecvMsgSize(m) +} + +// MaxRecvMsgSize returns a ServerOption to set the max message size in bytes the server can receive. +// If this is not set, gRPC uses the default 4MB. +func MaxRecvMsgSize(m int) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.maxReceiveMessageSize = m + }) +} + +// MaxSendMsgSize returns a ServerOption to set the max message size in bytes the server can send. +// If this is not set, gRPC uses the default `math.MaxInt32`. +func MaxSendMsgSize(m int) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.maxSendMessageSize = m + }) +} + +// MaxConcurrentStreams returns a ServerOption that will apply a limit on the number +// of concurrent streams to each ServerTransport. +func MaxConcurrentStreams(n uint32) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.maxConcurrentStreams = n + }) +} + +// Creds returns a ServerOption that sets credentials for server connections. +func Creds(c credentials.TransportCredentials) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.creds = c + }) +} + +// UnaryInterceptor returns a ServerOption that sets the UnaryServerInterceptor for the +// server. Only one unary interceptor can be installed. The construction of multiple +// interceptors (e.g., chaining) can be implemented at the caller. +func UnaryInterceptor(i UnaryServerInterceptor) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + if o.unaryInt != nil { + panic("The unary server interceptor was already set and may not be reset.") + } + o.unaryInt = i + }) +} + +// ChainUnaryInterceptor returns a ServerOption that specifies the chained interceptor +// for unary RPCs. The first interceptor will be the outer most, +// while the last interceptor will be the inner most wrapper around the real call. +// All unary interceptors added by this method will be chained. +func ChainUnaryInterceptor(interceptors ...UnaryServerInterceptor) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.chainUnaryInts = append(o.chainUnaryInts, interceptors...) + }) +} + +// StreamInterceptor returns a ServerOption that sets the StreamServerInterceptor for the +// server. Only one stream interceptor can be installed. +func StreamInterceptor(i StreamServerInterceptor) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + if o.streamInt != nil { + panic("The stream server interceptor was already set and may not be reset.") + } + o.streamInt = i + }) +} + +// ChainStreamInterceptor returns a ServerOption that specifies the chained interceptor +// for stream RPCs. The first interceptor will be the outer most, +// while the last interceptor will be the inner most wrapper around the real call. +// All stream interceptors added by this method will be chained. +func ChainStreamInterceptor(interceptors ...StreamServerInterceptor) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.chainStreamInts = append(o.chainStreamInts, interceptors...) + }) +} + +// InTapHandle returns a ServerOption that sets the tap handle for all the server +// transport to be created. Only one can be installed. +func InTapHandle(h tap.ServerInHandle) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + if o.inTapHandle != nil { + panic("The tap handle was already set and may not be reset.") + } + o.inTapHandle = h + }) +} + +// StatsHandler returns a ServerOption that sets the stats handler for the server. +func StatsHandler(h stats.Handler) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.statsHandler = h + }) +} + +// UnknownServiceHandler returns a ServerOption that allows for adding a custom +// unknown service handler. The provided method is a bidi-streaming RPC service +// handler that will be invoked instead of returning the "unimplemented" gRPC +// error whenever a request is received for an unregistered service or method. +// The handling function and stream interceptor (if set) have full access to +// the ServerStream, including its Context. +func UnknownServiceHandler(streamHandler StreamHandler) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.unknownStreamDesc = &StreamDesc{ + StreamName: "unknown_service_handler", + Handler: streamHandler, + // We need to assume that the users of the streamHandler will want to use both. + ClientStreams: true, + ServerStreams: true, + } + }) +} + +// ConnectionTimeout returns a ServerOption that sets the timeout for +// connection establishment (up to and including HTTP/2 handshaking) for all +// new connections. If this is not set, the default is 120 seconds. A zero or +// negative value will result in an immediate timeout. +// +// This API is EXPERIMENTAL. +func ConnectionTimeout(d time.Duration) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.connectionTimeout = d + }) +} + +// MaxHeaderListSize returns a ServerOption that sets the max (uncompressed) size +// of header list that the server is prepared to accept. +func MaxHeaderListSize(s uint32) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.maxHeaderListSize = &s + }) +} + +// HeaderTableSize returns a ServerOption that sets the size of dynamic +// header table for stream. +// +// This API is EXPERIMENTAL. +func HeaderTableSize(s uint32) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.headerTableSize = &s + }) +} + +// NewServer creates a gRPC server which has no service registered and has not +// started to accept requests yet. +func NewServer(opt ...ServerOption) *Server { + opts := defaultServerOptions + for _, o := range opt { + o.apply(&opts) + } + s := &Server{ + lis: make(map[net.Listener]bool), + opts: opts, + conns: make(map[transport.ServerTransport]bool), + m: make(map[string]*service), + quit: grpcsync.NewEvent(), + done: grpcsync.NewEvent(), + czData: new(channelzData), + } + chainUnaryServerInterceptors(s) + chainStreamServerInterceptors(s) + s.cv = sync.NewCond(&s.mu) + if EnableTracing { + _, file, line, _ := runtime.Caller(1) + s.events = trace.NewEventLog("grpc.Server", fmt.Sprintf("%s:%d", file, line)) + } + + if channelz.IsOn() { + s.channelzID = channelz.RegisterServer(&channelzServer{s}, "") + } + return s +} + +// printf records an event in s's event log, unless s has been stopped. +// REQUIRES s.mu is held. +func (s *Server) printf(format string, a ...interface{}) { + if s.events != nil { + s.events.Printf(format, a...) + } +} + +// errorf records an error in s's event log, unless s has been stopped. +// REQUIRES s.mu is held. +func (s *Server) errorf(format string, a ...interface{}) { + if s.events != nil { + s.events.Errorf(format, a...) + } +} + +// RegisterService registers a service and its implementation to the gRPC +// server. It is called from the IDL generated code. This must be called before +// invoking Serve. +func (s *Server) RegisterService(sd *ServiceDesc, ss interface{}) { + ht := reflect.TypeOf(sd.HandlerType).Elem() + st := reflect.TypeOf(ss) + if !st.Implements(ht) { + grpclog.Fatalf("grpc: Server.RegisterService found the handler of type %v that does not satisfy %v", st, ht) + } + s.register(sd, ss) +} + +func (s *Server) register(sd *ServiceDesc, ss interface{}) { + s.mu.Lock() + defer s.mu.Unlock() + s.printf("RegisterService(%q)", sd.ServiceName) + if s.serve { + grpclog.Fatalf("grpc: Server.RegisterService after Server.Serve for %q", sd.ServiceName) + } + if _, ok := s.m[sd.ServiceName]; ok { + grpclog.Fatalf("grpc: Server.RegisterService found duplicate service registration for %q", sd.ServiceName) + } + srv := &service{ + server: ss, + md: make(map[string]*MethodDesc), + sd: make(map[string]*StreamDesc), + mdata: sd.Metadata, + } + for i := range sd.Methods { + d := &sd.Methods[i] + srv.md[d.MethodName] = d + } + for i := range sd.Streams { + d := &sd.Streams[i] + srv.sd[d.StreamName] = d + } + s.m[sd.ServiceName] = srv +} + +// MethodInfo contains the information of an RPC including its method name and type. +type MethodInfo struct { + // Name is the method name only, without the service name or package name. + Name string + // IsClientStream indicates whether the RPC is a client streaming RPC. + IsClientStream bool + // IsServerStream indicates whether the RPC is a server streaming RPC. + IsServerStream bool +} + +// ServiceInfo contains unary RPC method info, streaming RPC method info and metadata for a service. +type ServiceInfo struct { + Methods []MethodInfo + // Metadata is the metadata specified in ServiceDesc when registering service. + Metadata interface{} +} + +// GetServiceInfo returns a map from service names to ServiceInfo. +// Service names include the package names, in the form of .. +func (s *Server) GetServiceInfo() map[string]ServiceInfo { + ret := make(map[string]ServiceInfo) + for n, srv := range s.m { + methods := make([]MethodInfo, 0, len(srv.md)+len(srv.sd)) + for m := range srv.md { + methods = append(methods, MethodInfo{ + Name: m, + IsClientStream: false, + IsServerStream: false, + }) + } + for m, d := range srv.sd { + methods = append(methods, MethodInfo{ + Name: m, + IsClientStream: d.ClientStreams, + IsServerStream: d.ServerStreams, + }) + } + + ret[n] = ServiceInfo{ + Methods: methods, + Metadata: srv.mdata, + } + } + return ret +} + +// ErrServerStopped indicates that the operation is now illegal because of +// the server being stopped. +var ErrServerStopped = errors.New("grpc: the server has been stopped") + +func (s *Server) useTransportAuthenticator(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) { + if s.opts.creds == nil { + return rawConn, nil, nil + } + return s.opts.creds.ServerHandshake(rawConn) +} + +type listenSocket struct { + net.Listener + channelzID int64 +} + +func (l *listenSocket) ChannelzMetric() *channelz.SocketInternalMetric { + return &channelz.SocketInternalMetric{ + SocketOptions: channelz.GetSocketOption(l.Listener), + LocalAddr: l.Listener.Addr(), + } +} + +func (l *listenSocket) Close() error { + err := l.Listener.Close() + if channelz.IsOn() { + channelz.RemoveEntry(l.channelzID) + } + return err +} + +// Serve accepts incoming connections on the listener lis, creating a new +// ServerTransport and service goroutine for each. The service goroutines +// read gRPC requests and then call the registered handlers to reply to them. +// Serve returns when lis.Accept fails with fatal errors. lis will be closed when +// this method returns. +// Serve will return a non-nil error unless Stop or GracefulStop is called. +func (s *Server) Serve(lis net.Listener) error { + s.mu.Lock() + s.printf("serving") + s.serve = true + if s.lis == nil { + // Serve called after Stop or GracefulStop. + s.mu.Unlock() + lis.Close() + return ErrServerStopped + } + + s.serveWG.Add(1) + defer func() { + s.serveWG.Done() + if s.quit.HasFired() { + // Stop or GracefulStop called; block until done and return nil. + <-s.done.Done() + } + }() + + ls := &listenSocket{Listener: lis} + s.lis[ls] = true + + if channelz.IsOn() { + ls.channelzID = channelz.RegisterListenSocket(ls, s.channelzID, lis.Addr().String()) + } + s.mu.Unlock() + + defer func() { + s.mu.Lock() + if s.lis != nil && s.lis[ls] { + ls.Close() + delete(s.lis, ls) + } + s.mu.Unlock() + }() + + var tempDelay time.Duration // how long to sleep on accept failure + + for { + rawConn, err := lis.Accept() + if err != nil { + if ne, ok := err.(interface { + Temporary() bool + }); ok && ne.Temporary() { + if tempDelay == 0 { + tempDelay = 5 * time.Millisecond + } else { + tempDelay *= 2 + } + if max := 1 * time.Second; tempDelay > max { + tempDelay = max + } + s.mu.Lock() + s.printf("Accept error: %v; retrying in %v", err, tempDelay) + s.mu.Unlock() + timer := time.NewTimer(tempDelay) + select { + case <-timer.C: + case <-s.quit.Done(): + timer.Stop() + return nil + } + continue + } + s.mu.Lock() + s.printf("done serving; Accept = %v", err) + s.mu.Unlock() + + if s.quit.HasFired() { + return nil + } + return err + } + tempDelay = 0 + // Start a new goroutine to deal with rawConn so we don't stall this Accept + // loop goroutine. + // + // Make sure we account for the goroutine so GracefulStop doesn't nil out + // s.conns before this conn can be added. + s.serveWG.Add(1) + go func() { + s.handleRawConn(rawConn) + s.serveWG.Done() + }() + } +} + +// handleRawConn forks a goroutine to handle a just-accepted connection that +// has not had any I/O performed on it yet. +func (s *Server) handleRawConn(rawConn net.Conn) { + if s.quit.HasFired() { + rawConn.Close() + return + } + rawConn.SetDeadline(time.Now().Add(s.opts.connectionTimeout)) + conn, authInfo, err := s.useTransportAuthenticator(rawConn) + if err != nil { + // ErrConnDispatched means that the connection was dispatched away from + // gRPC; those connections should be left open. + if err != credentials.ErrConnDispatched { + s.mu.Lock() + s.errorf("ServerHandshake(%q) failed: %v", rawConn.RemoteAddr(), err) + s.mu.Unlock() + channelz.Warningf(s.channelzID, "grpc: Server.Serve failed to complete security handshake from %q: %v", rawConn.RemoteAddr(), err) + rawConn.Close() + } + rawConn.SetDeadline(time.Time{}) + return + } + + // Finish handshaking (HTTP2) + st := s.newHTTP2Transport(conn, authInfo) + if st == nil { + return + } + + rawConn.SetDeadline(time.Time{}) + if !s.addConn(st) { + return + } + go func() { + s.serveStreams(st) + s.removeConn(st) + }() +} + +// newHTTP2Transport sets up a http/2 transport (using the +// gRPC http2 server transport in transport/http2_server.go). +func (s *Server) newHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) transport.ServerTransport { + config := &transport.ServerConfig{ + MaxStreams: s.opts.maxConcurrentStreams, + AuthInfo: authInfo, + InTapHandle: s.opts.inTapHandle, + StatsHandler: s.opts.statsHandler, + KeepaliveParams: s.opts.keepaliveParams, + KeepalivePolicy: s.opts.keepalivePolicy, + InitialWindowSize: s.opts.initialWindowSize, + InitialConnWindowSize: s.opts.initialConnWindowSize, + WriteBufferSize: s.opts.writeBufferSize, + ReadBufferSize: s.opts.readBufferSize, + ChannelzParentID: s.channelzID, + MaxHeaderListSize: s.opts.maxHeaderListSize, + HeaderTableSize: s.opts.headerTableSize, + } + st, err := transport.NewServerTransport("http2", c, config) + if err != nil { + s.mu.Lock() + s.errorf("NewServerTransport(%q) failed: %v", c.RemoteAddr(), err) + s.mu.Unlock() + c.Close() + channelz.Warning(s.channelzID, "grpc: Server.Serve failed to create ServerTransport: ", err) + return nil + } + + return st +} + +func (s *Server) serveStreams(st transport.ServerTransport) { + defer st.Close() + var wg sync.WaitGroup + st.HandleStreams(func(stream *transport.Stream) { + wg.Add(1) + go func() { + defer wg.Done() + s.handleStream(st, stream, s.traceInfo(st, stream)) + }() + }, func(ctx context.Context, method string) context.Context { + if !EnableTracing { + return ctx + } + tr := trace.New("grpc.Recv."+methodFamily(method), method) + return trace.NewContext(ctx, tr) + }) + wg.Wait() +} + +var _ http.Handler = (*Server)(nil) + +// ServeHTTP implements the Go standard library's http.Handler +// interface by responding to the gRPC request r, by looking up +// the requested gRPC method in the gRPC server s. +// +// The provided HTTP request must have arrived on an HTTP/2 +// connection. When using the Go standard library's server, +// practically this means that the Request must also have arrived +// over TLS. +// +// To share one port (such as 443 for https) between gRPC and an +// existing http.Handler, use a root http.Handler such as: +// +// if r.ProtoMajor == 2 && strings.HasPrefix( +// r.Header.Get("Content-Type"), "application/grpc") { +// grpcServer.ServeHTTP(w, r) +// } else { +// yourMux.ServeHTTP(w, r) +// } +// +// Note that ServeHTTP uses Go's HTTP/2 server implementation which is totally +// separate from grpc-go's HTTP/2 server. Performance and features may vary +// between the two paths. ServeHTTP does not support some gRPC features +// available through grpc-go's HTTP/2 server, and it is currently EXPERIMENTAL +// and subject to change. +func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + st, err := transport.NewServerHandlerTransport(w, r, s.opts.statsHandler) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + if !s.addConn(st) { + return + } + defer s.removeConn(st) + s.serveStreams(st) +} + +// traceInfo returns a traceInfo and associates it with stream, if tracing is enabled. +// If tracing is not enabled, it returns nil. +func (s *Server) traceInfo(st transport.ServerTransport, stream *transport.Stream) (trInfo *traceInfo) { + if !EnableTracing { + return nil + } + tr, ok := trace.FromContext(stream.Context()) + if !ok { + return nil + } + + trInfo = &traceInfo{ + tr: tr, + firstLine: firstLine{ + client: false, + remoteAddr: st.RemoteAddr(), + }, + } + if dl, ok := stream.Context().Deadline(); ok { + trInfo.firstLine.deadline = time.Until(dl) + } + return trInfo +} + +func (s *Server) addConn(st transport.ServerTransport) bool { + s.mu.Lock() + defer s.mu.Unlock() + if s.conns == nil { + st.Close() + return false + } + if s.drain { + // Transport added after we drained our existing conns: drain it + // immediately. + st.Drain() + } + s.conns[st] = true + return true +} + +func (s *Server) removeConn(st transport.ServerTransport) { + s.mu.Lock() + defer s.mu.Unlock() + if s.conns != nil { + delete(s.conns, st) + s.cv.Broadcast() + } +} + +func (s *Server) channelzMetric() *channelz.ServerInternalMetric { + return &channelz.ServerInternalMetric{ + CallsStarted: atomic.LoadInt64(&s.czData.callsStarted), + CallsSucceeded: atomic.LoadInt64(&s.czData.callsSucceeded), + CallsFailed: atomic.LoadInt64(&s.czData.callsFailed), + LastCallStartedTimestamp: time.Unix(0, atomic.LoadInt64(&s.czData.lastCallStartedTime)), + } +} + +func (s *Server) incrCallsStarted() { + atomic.AddInt64(&s.czData.callsStarted, 1) + atomic.StoreInt64(&s.czData.lastCallStartedTime, time.Now().UnixNano()) +} + +func (s *Server) incrCallsSucceeded() { + atomic.AddInt64(&s.czData.callsSucceeded, 1) +} + +func (s *Server) incrCallsFailed() { + atomic.AddInt64(&s.czData.callsFailed, 1) +} + +func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Stream, msg interface{}, cp Compressor, opts *transport.Options, comp encoding.Compressor) error { + data, err := encode(s.getCodec(stream.ContentSubtype()), msg) + if err != nil { + channelz.Error(s.channelzID, "grpc: server failed to encode response: ", err) + return err + } + compData, err := compress(data, cp, comp) + if err != nil { + channelz.Error(s.channelzID, "grpc: server failed to compress response: ", err) + return err + } + hdr, payload := msgHeader(data, compData) + // TODO(dfawley): should we be checking len(data) instead? + if len(payload) > s.opts.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(payload), s.opts.maxSendMessageSize) + } + err = t.Write(stream, hdr, payload, opts) + if err == nil && s.opts.statsHandler != nil { + s.opts.statsHandler.HandleRPC(stream.Context(), outPayload(false, msg, data, payload, time.Now())) + } + return err +} + +// chainUnaryServerInterceptors chains all unary server interceptors into one. +func chainUnaryServerInterceptors(s *Server) { + // Prepend opts.unaryInt to the chaining interceptors if it exists, since unaryInt will + // be executed before any other chained interceptors. + interceptors := s.opts.chainUnaryInts + if s.opts.unaryInt != nil { + interceptors = append([]UnaryServerInterceptor{s.opts.unaryInt}, s.opts.chainUnaryInts...) + } + + var chainedInt UnaryServerInterceptor + if len(interceptors) == 0 { + chainedInt = nil + } else if len(interceptors) == 1 { + chainedInt = interceptors[0] + } else { + chainedInt = func(ctx context.Context, req interface{}, info *UnaryServerInfo, handler UnaryHandler) (interface{}, error) { + return interceptors[0](ctx, req, info, getChainUnaryHandler(interceptors, 0, info, handler)) + } + } + + s.opts.unaryInt = chainedInt +} + +// getChainUnaryHandler recursively generate the chained UnaryHandler +func getChainUnaryHandler(interceptors []UnaryServerInterceptor, curr int, info *UnaryServerInfo, finalHandler UnaryHandler) UnaryHandler { + if curr == len(interceptors)-1 { + return finalHandler + } + + return func(ctx context.Context, req interface{}) (interface{}, error) { + return interceptors[curr+1](ctx, req, info, getChainUnaryHandler(interceptors, curr+1, info, finalHandler)) + } +} + +func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.Stream, srv *service, md *MethodDesc, trInfo *traceInfo) (err error) { + sh := s.opts.statsHandler + if sh != nil || trInfo != nil || channelz.IsOn() { + if channelz.IsOn() { + s.incrCallsStarted() + } + var statsBegin *stats.Begin + if sh != nil { + beginTime := time.Now() + statsBegin = &stats.Begin{ + BeginTime: beginTime, + } + sh.HandleRPC(stream.Context(), statsBegin) + } + if trInfo != nil { + trInfo.tr.LazyLog(&trInfo.firstLine, false) + } + // The deferred error handling for tracing, stats handler and channelz are + // combined into one function to reduce stack usage -- a defer takes ~56-64 + // bytes on the stack, so overflowing the stack will require a stack + // re-allocation, which is expensive. + // + // To maintain behavior similar to separate deferred statements, statements + // should be executed in the reverse order. That is, tracing first, stats + // handler second, and channelz last. Note that panics *within* defers will + // lead to different behavior, but that's an acceptable compromise; that + // would be undefined behavior territory anyway. + defer func() { + if trInfo != nil { + if err != nil && err != io.EOF { + trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) + trInfo.tr.SetError() + } + trInfo.tr.Finish() + } + + if sh != nil { + end := &stats.End{ + BeginTime: statsBegin.BeginTime, + EndTime: time.Now(), + } + if err != nil && err != io.EOF { + end.Error = toRPCErr(err) + } + sh.HandleRPC(stream.Context(), end) + } + + if channelz.IsOn() { + if err != nil && err != io.EOF { + s.incrCallsFailed() + } else { + s.incrCallsSucceeded() + } + } + }() + } + + binlog := binarylog.GetMethodLogger(stream.Method()) + if binlog != nil { + ctx := stream.Context() + md, _ := metadata.FromIncomingContext(ctx) + logEntry := &binarylog.ClientHeader{ + Header: md, + MethodName: stream.Method(), + PeerAddr: nil, + } + if deadline, ok := ctx.Deadline(); ok { + logEntry.Timeout = time.Until(deadline) + if logEntry.Timeout < 0 { + logEntry.Timeout = 0 + } + } + if a := md[":authority"]; len(a) > 0 { + logEntry.Authority = a[0] + } + if peer, ok := peer.FromContext(ctx); ok { + logEntry.PeerAddr = peer.Addr + } + binlog.Log(logEntry) + } + + // comp and cp are used for compression. decomp and dc are used for + // decompression. If comp and decomp are both set, they are the same; + // however they are kept separate to ensure that at most one of the + // compressor/decompressor variable pairs are set for use later. + var comp, decomp encoding.Compressor + var cp Compressor + var dc Decompressor + + // If dc is set and matches the stream's compression, use it. Otherwise, try + // to find a matching registered compressor for decomp. + if rc := stream.RecvCompress(); s.opts.dc != nil && s.opts.dc.Type() == rc { + dc = s.opts.dc + } else if rc != "" && rc != encoding.Identity { + decomp = encoding.GetCompressor(rc) + if decomp == nil { + st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc) + t.WriteStatus(stream, st) + return st.Err() + } + } + + // If cp is set, use it. Otherwise, attempt to compress the response using + // the incoming message compression method. + // + // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686. + if s.opts.cp != nil { + cp = s.opts.cp + stream.SetSendCompress(cp.Type()) + } else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity { + // Legacy compressor not specified; attempt to respond with same encoding. + comp = encoding.GetCompressor(rc) + if comp != nil { + stream.SetSendCompress(rc) + } + } + + var payInfo *payloadInfo + if sh != nil || binlog != nil { + payInfo = &payloadInfo{} + } + d, err := recvAndDecompress(&parser{r: stream}, stream, dc, s.opts.maxReceiveMessageSize, payInfo, decomp) + if err != nil { + if st, ok := status.FromError(err); ok { + if e := t.WriteStatus(stream, st); e != nil { + channelz.Warningf(s.channelzID, "grpc: Server.processUnaryRPC failed to write status %v", e) + } + } + return err + } + if channelz.IsOn() { + t.IncrMsgRecv() + } + df := func(v interface{}) error { + if err := s.getCodec(stream.ContentSubtype()).Unmarshal(d, v); err != nil { + return status.Errorf(codes.Internal, "grpc: error unmarshalling request: %v", err) + } + if sh != nil { + sh.HandleRPC(stream.Context(), &stats.InPayload{ + RecvTime: time.Now(), + Payload: v, + WireLength: payInfo.wireLength, + Data: d, + Length: len(d), + }) + } + if binlog != nil { + binlog.Log(&binarylog.ClientMessage{ + Message: d, + }) + } + if trInfo != nil { + trInfo.tr.LazyLog(&payload{sent: false, msg: v}, true) + } + return nil + } + ctx := NewContextWithServerTransportStream(stream.Context(), stream) + reply, appErr := md.Handler(srv.server, ctx, df, s.opts.unaryInt) + if appErr != nil { + appStatus, ok := status.FromError(appErr) + if !ok { + // Convert appErr if it is not a grpc status error. + appErr = status.Error(codes.Unknown, appErr.Error()) + appStatus, _ = status.FromError(appErr) + } + if trInfo != nil { + trInfo.tr.LazyLog(stringer(appStatus.Message()), true) + trInfo.tr.SetError() + } + if e := t.WriteStatus(stream, appStatus); e != nil { + channelz.Warningf(s.channelzID, "grpc: Server.processUnaryRPC failed to write status: %v", e) + } + if binlog != nil { + if h, _ := stream.Header(); h.Len() > 0 { + // Only log serverHeader if there was header. Otherwise it can + // be trailer only. + binlog.Log(&binarylog.ServerHeader{ + Header: h, + }) + } + binlog.Log(&binarylog.ServerTrailer{ + Trailer: stream.Trailer(), + Err: appErr, + }) + } + return appErr + } + if trInfo != nil { + trInfo.tr.LazyLog(stringer("OK"), false) + } + opts := &transport.Options{Last: true} + + if err := s.sendResponse(t, stream, reply, cp, opts, comp); err != nil { + if err == io.EOF { + // The entire stream is done (for unary RPC only). + return err + } + if sts, ok := status.FromError(err); ok { + if e := t.WriteStatus(stream, sts); e != nil { + channelz.Warningf(s.channelzID, "grpc: Server.processUnaryRPC failed to write status: %v", e) + } + } else { + switch st := err.(type) { + case transport.ConnectionError: + // Nothing to do here. + default: + panic(fmt.Sprintf("grpc: Unexpected error (%T) from sendResponse: %v", st, st)) + } + } + if binlog != nil { + h, _ := stream.Header() + binlog.Log(&binarylog.ServerHeader{ + Header: h, + }) + binlog.Log(&binarylog.ServerTrailer{ + Trailer: stream.Trailer(), + Err: appErr, + }) + } + return err + } + if binlog != nil { + h, _ := stream.Header() + binlog.Log(&binarylog.ServerHeader{ + Header: h, + }) + binlog.Log(&binarylog.ServerMessage{ + Message: reply, + }) + } + if channelz.IsOn() { + t.IncrMsgSent() + } + if trInfo != nil { + trInfo.tr.LazyLog(&payload{sent: true, msg: reply}, true) + } + // TODO: Should we be logging if writing status failed here, like above? + // Should the logging be in WriteStatus? Should we ignore the WriteStatus + // error or allow the stats handler to see it? + err = t.WriteStatus(stream, statusOK) + if binlog != nil { + binlog.Log(&binarylog.ServerTrailer{ + Trailer: stream.Trailer(), + Err: appErr, + }) + } + return err +} + +// chainStreamServerInterceptors chains all stream server interceptors into one. +func chainStreamServerInterceptors(s *Server) { + // Prepend opts.streamInt to the chaining interceptors if it exists, since streamInt will + // be executed before any other chained interceptors. + interceptors := s.opts.chainStreamInts + if s.opts.streamInt != nil { + interceptors = append([]StreamServerInterceptor{s.opts.streamInt}, s.opts.chainStreamInts...) + } + + var chainedInt StreamServerInterceptor + if len(interceptors) == 0 { + chainedInt = nil + } else if len(interceptors) == 1 { + chainedInt = interceptors[0] + } else { + chainedInt = func(srv interface{}, ss ServerStream, info *StreamServerInfo, handler StreamHandler) error { + return interceptors[0](srv, ss, info, getChainStreamHandler(interceptors, 0, info, handler)) + } + } + + s.opts.streamInt = chainedInt +} + +// getChainStreamHandler recursively generate the chained StreamHandler +func getChainStreamHandler(interceptors []StreamServerInterceptor, curr int, info *StreamServerInfo, finalHandler StreamHandler) StreamHandler { + if curr == len(interceptors)-1 { + return finalHandler + } + + return func(srv interface{}, ss ServerStream) error { + return interceptors[curr+1](srv, ss, info, getChainStreamHandler(interceptors, curr+1, info, finalHandler)) + } +} + +func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transport.Stream, srv *service, sd *StreamDesc, trInfo *traceInfo) (err error) { + if channelz.IsOn() { + s.incrCallsStarted() + } + sh := s.opts.statsHandler + var statsBegin *stats.Begin + if sh != nil { + beginTime := time.Now() + statsBegin = &stats.Begin{ + BeginTime: beginTime, + } + sh.HandleRPC(stream.Context(), statsBegin) + } + ctx := NewContextWithServerTransportStream(stream.Context(), stream) + ss := &serverStream{ + ctx: ctx, + t: t, + s: stream, + p: &parser{r: stream}, + codec: s.getCodec(stream.ContentSubtype()), + maxReceiveMessageSize: s.opts.maxReceiveMessageSize, + maxSendMessageSize: s.opts.maxSendMessageSize, + trInfo: trInfo, + statsHandler: sh, + } + + if sh != nil || trInfo != nil || channelz.IsOn() { + // See comment in processUnaryRPC on defers. + defer func() { + if trInfo != nil { + ss.mu.Lock() + if err != nil && err != io.EOF { + ss.trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) + ss.trInfo.tr.SetError() + } + ss.trInfo.tr.Finish() + ss.trInfo.tr = nil + ss.mu.Unlock() + } + + if sh != nil { + end := &stats.End{ + BeginTime: statsBegin.BeginTime, + EndTime: time.Now(), + } + if err != nil && err != io.EOF { + end.Error = toRPCErr(err) + } + sh.HandleRPC(stream.Context(), end) + } + + if channelz.IsOn() { + if err != nil && err != io.EOF { + s.incrCallsFailed() + } else { + s.incrCallsSucceeded() + } + } + }() + } + + ss.binlog = binarylog.GetMethodLogger(stream.Method()) + if ss.binlog != nil { + md, _ := metadata.FromIncomingContext(ctx) + logEntry := &binarylog.ClientHeader{ + Header: md, + MethodName: stream.Method(), + PeerAddr: nil, + } + if deadline, ok := ctx.Deadline(); ok { + logEntry.Timeout = time.Until(deadline) + if logEntry.Timeout < 0 { + logEntry.Timeout = 0 + } + } + if a := md[":authority"]; len(a) > 0 { + logEntry.Authority = a[0] + } + if peer, ok := peer.FromContext(ss.Context()); ok { + logEntry.PeerAddr = peer.Addr + } + ss.binlog.Log(logEntry) + } + + // If dc is set and matches the stream's compression, use it. Otherwise, try + // to find a matching registered compressor for decomp. + if rc := stream.RecvCompress(); s.opts.dc != nil && s.opts.dc.Type() == rc { + ss.dc = s.opts.dc + } else if rc != "" && rc != encoding.Identity { + ss.decomp = encoding.GetCompressor(rc) + if ss.decomp == nil { + st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc) + t.WriteStatus(ss.s, st) + return st.Err() + } + } + + // If cp is set, use it. Otherwise, attempt to compress the response using + // the incoming message compression method. + // + // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686. + if s.opts.cp != nil { + ss.cp = s.opts.cp + stream.SetSendCompress(s.opts.cp.Type()) + } else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity { + // Legacy compressor not specified; attempt to respond with same encoding. + ss.comp = encoding.GetCompressor(rc) + if ss.comp != nil { + stream.SetSendCompress(rc) + } + } + + if trInfo != nil { + trInfo.tr.LazyLog(&trInfo.firstLine, false) + } + var appErr error + var server interface{} + if srv != nil { + server = srv.server + } + if s.opts.streamInt == nil { + appErr = sd.Handler(server, ss) + } else { + info := &StreamServerInfo{ + FullMethod: stream.Method(), + IsClientStream: sd.ClientStreams, + IsServerStream: sd.ServerStreams, + } + appErr = s.opts.streamInt(server, ss, info, sd.Handler) + } + if appErr != nil { + appStatus, ok := status.FromError(appErr) + if !ok { + appStatus = status.New(codes.Unknown, appErr.Error()) + appErr = appStatus.Err() + } + if trInfo != nil { + ss.mu.Lock() + ss.trInfo.tr.LazyLog(stringer(appStatus.Message()), true) + ss.trInfo.tr.SetError() + ss.mu.Unlock() + } + t.WriteStatus(ss.s, appStatus) + if ss.binlog != nil { + ss.binlog.Log(&binarylog.ServerTrailer{ + Trailer: ss.s.Trailer(), + Err: appErr, + }) + } + // TODO: Should we log an error from WriteStatus here and below? + return appErr + } + if trInfo != nil { + ss.mu.Lock() + ss.trInfo.tr.LazyLog(stringer("OK"), false) + ss.mu.Unlock() + } + err = t.WriteStatus(ss.s, statusOK) + if ss.binlog != nil { + ss.binlog.Log(&binarylog.ServerTrailer{ + Trailer: ss.s.Trailer(), + Err: appErr, + }) + } + return err +} + +func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Stream, trInfo *traceInfo) { + sm := stream.Method() + if sm != "" && sm[0] == '/' { + sm = sm[1:] + } + pos := strings.LastIndex(sm, "/") + if pos == -1 { + if trInfo != nil { + trInfo.tr.LazyLog(&fmtStringer{"Malformed method name %q", []interface{}{sm}}, true) + trInfo.tr.SetError() + } + errDesc := fmt.Sprintf("malformed method name: %q", stream.Method()) + if err := t.WriteStatus(stream, status.New(codes.ResourceExhausted, errDesc)); err != nil { + if trInfo != nil { + trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) + trInfo.tr.SetError() + } + channelz.Warningf(s.channelzID, "grpc: Server.handleStream failed to write status: %v", err) + } + if trInfo != nil { + trInfo.tr.Finish() + } + return + } + service := sm[:pos] + method := sm[pos+1:] + + srv, knownService := s.m[service] + if knownService { + if md, ok := srv.md[method]; ok { + s.processUnaryRPC(t, stream, srv, md, trInfo) + return + } + if sd, ok := srv.sd[method]; ok { + s.processStreamingRPC(t, stream, srv, sd, trInfo) + return + } + } + // Unknown service, or known server unknown method. + if unknownDesc := s.opts.unknownStreamDesc; unknownDesc != nil { + s.processStreamingRPC(t, stream, nil, unknownDesc, trInfo) + return + } + var errDesc string + if !knownService { + errDesc = fmt.Sprintf("unknown service %v", service) + } else { + errDesc = fmt.Sprintf("unknown method %v for service %v", method, service) + } + if trInfo != nil { + trInfo.tr.LazyPrintf("%s", errDesc) + trInfo.tr.SetError() + } + if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { + if trInfo != nil { + trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) + trInfo.tr.SetError() + } + channelz.Warningf(s.channelzID, "grpc: Server.handleStream failed to write status: %v", err) + } + if trInfo != nil { + trInfo.tr.Finish() + } +} + +// The key to save ServerTransportStream in the context. +type streamKey struct{} + +// NewContextWithServerTransportStream creates a new context from ctx and +// attaches stream to it. +// +// This API is EXPERIMENTAL. +func NewContextWithServerTransportStream(ctx context.Context, stream ServerTransportStream) context.Context { + return context.WithValue(ctx, streamKey{}, stream) +} + +// ServerTransportStream is a minimal interface that a transport stream must +// implement. This can be used to mock an actual transport stream for tests of +// handler code that use, for example, grpc.SetHeader (which requires some +// stream to be in context). +// +// See also NewContextWithServerTransportStream. +// +// This API is EXPERIMENTAL. +type ServerTransportStream interface { + Method() string + SetHeader(md metadata.MD) error + SendHeader(md metadata.MD) error + SetTrailer(md metadata.MD) error +} + +// ServerTransportStreamFromContext returns the ServerTransportStream saved in +// ctx. Returns nil if the given context has no stream associated with it +// (which implies it is not an RPC invocation context). +// +// This API is EXPERIMENTAL. +func ServerTransportStreamFromContext(ctx context.Context) ServerTransportStream { + s, _ := ctx.Value(streamKey{}).(ServerTransportStream) + return s +} + +// Stop stops the gRPC server. It immediately closes all open +// connections and listeners. +// It cancels all active RPCs on the server side and the corresponding +// pending RPCs on the client side will get notified by connection +// errors. +func (s *Server) Stop() { + s.quit.Fire() + + defer func() { + s.serveWG.Wait() + s.done.Fire() + }() + + s.channelzRemoveOnce.Do(func() { + if channelz.IsOn() { + channelz.RemoveEntry(s.channelzID) + } + }) + + s.mu.Lock() + listeners := s.lis + s.lis = nil + st := s.conns + s.conns = nil + // interrupt GracefulStop if Stop and GracefulStop are called concurrently. + s.cv.Broadcast() + s.mu.Unlock() + + for lis := range listeners { + lis.Close() + } + for c := range st { + c.Close() + } + + s.mu.Lock() + if s.events != nil { + s.events.Finish() + s.events = nil + } + s.mu.Unlock() +} + +// GracefulStop stops the gRPC server gracefully. It stops the server from +// accepting new connections and RPCs and blocks until all the pending RPCs are +// finished. +func (s *Server) GracefulStop() { + s.quit.Fire() + defer s.done.Fire() + + s.channelzRemoveOnce.Do(func() { + if channelz.IsOn() { + channelz.RemoveEntry(s.channelzID) + } + }) + s.mu.Lock() + if s.conns == nil { + s.mu.Unlock() + return + } + + for lis := range s.lis { + lis.Close() + } + s.lis = nil + if !s.drain { + for st := range s.conns { + st.Drain() + } + s.drain = true + } + + // Wait for serving threads to be ready to exit. Only then can we be sure no + // new conns will be created. + s.mu.Unlock() + s.serveWG.Wait() + s.mu.Lock() + + for len(s.conns) != 0 { + s.cv.Wait() + } + s.conns = nil + if s.events != nil { + s.events.Finish() + s.events = nil + } + s.mu.Unlock() +} + +// contentSubtype must be lowercase +// cannot return nil +func (s *Server) getCodec(contentSubtype string) baseCodec { + if s.opts.codec != nil { + return s.opts.codec + } + if contentSubtype == "" { + return encoding.GetCodec(proto.Name) + } + codec := encoding.GetCodec(contentSubtype) + if codec == nil { + return encoding.GetCodec(proto.Name) + } + return codec +} + +// SetHeader sets the header metadata. +// When called multiple times, all the provided metadata will be merged. +// All the metadata will be sent out when one of the following happens: +// - grpc.SendHeader() is called; +// - The first response is sent out; +// - An RPC status is sent out (error or success). +func SetHeader(ctx context.Context, md metadata.MD) error { + if md.Len() == 0 { + return nil + } + stream := ServerTransportStreamFromContext(ctx) + if stream == nil { + return status.Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx) + } + return stream.SetHeader(md) +} + +// SendHeader sends header metadata. It may be called at most once. +// The provided md and headers set by SetHeader() will be sent. +func SendHeader(ctx context.Context, md metadata.MD) error { + stream := ServerTransportStreamFromContext(ctx) + if stream == nil { + return status.Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx) + } + if err := stream.SendHeader(md); err != nil { + return toRPCErr(err) + } + return nil +} + +// SetTrailer sets the trailer metadata that will be sent when an RPC returns. +// When called more than once, all the provided metadata will be merged. +func SetTrailer(ctx context.Context, md metadata.MD) error { + if md.Len() == 0 { + return nil + } + stream := ServerTransportStreamFromContext(ctx) + if stream == nil { + return status.Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx) + } + return stream.SetTrailer(md) +} + +// Method returns the method string for the server context. The returned +// string is in the format of "/service/method". +func Method(ctx context.Context) (string, bool) { + s := ServerTransportStreamFromContext(ctx) + if s == nil { + return "", false + } + return s.Method(), true +} + +type channelzServer struct { + s *Server +} + +func (c *channelzServer) ChannelzMetric() *channelz.ServerInternalMetric { + return c.s.channelzMetric() +} diff --git a/vendor/google.golang.org/grpc/service_config.go b/vendor/google.golang.org/grpc/service_config.go new file mode 100644 index 00000000..5a80a575 --- /dev/null +++ b/vendor/google.golang.org/grpc/service_config.go @@ -0,0 +1,434 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + "time" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal" + "google.golang.org/grpc/serviceconfig" +) + +const maxInt = int(^uint(0) >> 1) + +// MethodConfig defines the configuration recommended by the service providers for a +// particular method. +// +// Deprecated: Users should not use this struct. Service config should be received +// through name resolver, as specified here +// https://github.com/grpc/grpc/blob/master/doc/service_config.md +type MethodConfig struct { + // WaitForReady indicates whether RPCs sent to this method should wait until + // the connection is ready by default (!failfast). The value specified via the + // gRPC client API will override the value set here. + WaitForReady *bool + // Timeout is the default timeout for RPCs sent to this method. The actual + // deadline used will be the minimum of the value specified here and the value + // set by the application via the gRPC client API. If either one is not set, + // then the other will be used. If neither is set, then the RPC has no deadline. + Timeout *time.Duration + // MaxReqSize is the maximum allowed payload size for an individual request in a + // stream (client->server) in bytes. The size which is measured is the serialized + // payload after per-message compression (but before stream compression) in bytes. + // The actual value used is the minimum of the value specified here and the value set + // by the application via the gRPC client API. If either one is not set, then the other + // will be used. If neither is set, then the built-in default is used. + MaxReqSize *int + // MaxRespSize is the maximum allowed payload size for an individual response in a + // stream (server->client) in bytes. + MaxRespSize *int + // RetryPolicy configures retry options for the method. + retryPolicy *retryPolicy +} + +type lbConfig struct { + name string + cfg serviceconfig.LoadBalancingConfig +} + +// ServiceConfig is provided by the service provider and contains parameters for how +// clients that connect to the service should behave. +// +// Deprecated: Users should not use this struct. Service config should be received +// through name resolver, as specified here +// https://github.com/grpc/grpc/blob/master/doc/service_config.md +type ServiceConfig struct { + serviceconfig.Config + + // LB is the load balancer the service providers recommends. The balancer + // specified via grpc.WithBalancer will override this. This is deprecated; + // lbConfigs is preferred. If lbConfig and LB are both present, lbConfig + // will be used. + LB *string + + // lbConfig is the service config's load balancing configuration. If + // lbConfig and LB are both present, lbConfig will be used. + lbConfig *lbConfig + + // Methods contains a map for the methods in this service. If there is an + // exact match for a method (i.e. /service/method) in the map, use the + // corresponding MethodConfig. If there's no exact match, look for the + // default config for the service (/service/) and use the corresponding + // MethodConfig if it exists. Otherwise, the method has no MethodConfig to + // use. + Methods map[string]MethodConfig + + // If a retryThrottlingPolicy is provided, gRPC will automatically throttle + // retry attempts and hedged RPCs when the client’s ratio of failures to + // successes exceeds a threshold. + // + // For each server name, the gRPC client will maintain a token_count which is + // initially set to maxTokens, and can take values between 0 and maxTokens. + // + // Every outgoing RPC (regardless of service or method invoked) will change + // token_count as follows: + // + // - Every failed RPC will decrement the token_count by 1. + // - Every successful RPC will increment the token_count by tokenRatio. + // + // If token_count is less than or equal to maxTokens / 2, then RPCs will not + // be retried and hedged RPCs will not be sent. + retryThrottling *retryThrottlingPolicy + // healthCheckConfig must be set as one of the requirement to enable LB channel + // health check. + healthCheckConfig *healthCheckConfig + // rawJSONString stores service config json string that get parsed into + // this service config struct. + rawJSONString string +} + +// healthCheckConfig defines the go-native version of the LB channel health check config. +type healthCheckConfig struct { + // serviceName is the service name to use in the health-checking request. + ServiceName string +} + +// retryPolicy defines the go-native version of the retry policy defined by the +// service config here: +// https://github.com/grpc/proposal/blob/master/A6-client-retries.md#integration-with-service-config +type retryPolicy struct { + // MaxAttempts is the maximum number of attempts, including the original RPC. + // + // This field is required and must be two or greater. + maxAttempts int + + // Exponential backoff parameters. The initial retry attempt will occur at + // random(0, initialBackoff). In general, the nth attempt will occur at + // random(0, + // min(initialBackoff*backoffMultiplier**(n-1), maxBackoff)). + // + // These fields are required and must be greater than zero. + initialBackoff time.Duration + maxBackoff time.Duration + backoffMultiplier float64 + + // The set of status codes which may be retried. + // + // Status codes are specified as strings, e.g., "UNAVAILABLE". + // + // This field is required and must be non-empty. + // Note: a set is used to store this for easy lookup. + retryableStatusCodes map[codes.Code]bool +} + +type jsonRetryPolicy struct { + MaxAttempts int + InitialBackoff string + MaxBackoff string + BackoffMultiplier float64 + RetryableStatusCodes []codes.Code +} + +// retryThrottlingPolicy defines the go-native version of the retry throttling +// policy defined by the service config here: +// https://github.com/grpc/proposal/blob/master/A6-client-retries.md#integration-with-service-config +type retryThrottlingPolicy struct { + // The number of tokens starts at maxTokens. The token_count will always be + // between 0 and maxTokens. + // + // This field is required and must be greater than zero. + MaxTokens float64 + // The amount of tokens to add on each successful RPC. Typically this will + // be some number between 0 and 1, e.g., 0.1. + // + // This field is required and must be greater than zero. Up to 3 decimal + // places are supported. + TokenRatio float64 +} + +func parseDuration(s *string) (*time.Duration, error) { + if s == nil { + return nil, nil + } + if !strings.HasSuffix(*s, "s") { + return nil, fmt.Errorf("malformed duration %q", *s) + } + ss := strings.SplitN((*s)[:len(*s)-1], ".", 3) + if len(ss) > 2 { + return nil, fmt.Errorf("malformed duration %q", *s) + } + // hasDigits is set if either the whole or fractional part of the number is + // present, since both are optional but one is required. + hasDigits := false + var d time.Duration + if len(ss[0]) > 0 { + i, err := strconv.ParseInt(ss[0], 10, 32) + if err != nil { + return nil, fmt.Errorf("malformed duration %q: %v", *s, err) + } + d = time.Duration(i) * time.Second + hasDigits = true + } + if len(ss) == 2 && len(ss[1]) > 0 { + if len(ss[1]) > 9 { + return nil, fmt.Errorf("malformed duration %q", *s) + } + f, err := strconv.ParseInt(ss[1], 10, 64) + if err != nil { + return nil, fmt.Errorf("malformed duration %q: %v", *s, err) + } + for i := 9; i > len(ss[1]); i-- { + f *= 10 + } + d += time.Duration(f) + hasDigits = true + } + if !hasDigits { + return nil, fmt.Errorf("malformed duration %q", *s) + } + + return &d, nil +} + +type jsonName struct { + Service *string + Method *string +} + +func (j jsonName) generatePath() (string, bool) { + if j.Service == nil { + return "", false + } + res := "/" + *j.Service + "/" + if j.Method != nil { + res += *j.Method + } + return res, true +} + +// TODO(lyuxuan): delete this struct after cleaning up old service config implementation. +type jsonMC struct { + Name *[]jsonName + WaitForReady *bool + Timeout *string + MaxRequestMessageBytes *int64 + MaxResponseMessageBytes *int64 + RetryPolicy *jsonRetryPolicy +} + +type loadBalancingConfig map[string]json.RawMessage + +// TODO(lyuxuan): delete this struct after cleaning up old service config implementation. +type jsonSC struct { + LoadBalancingPolicy *string + LoadBalancingConfig *[]loadBalancingConfig + MethodConfig *[]jsonMC + RetryThrottling *retryThrottlingPolicy + HealthCheckConfig *healthCheckConfig +} + +func init() { + internal.ParseServiceConfigForTesting = parseServiceConfig +} +func parseServiceConfig(js string) *serviceconfig.ParseResult { + if len(js) == 0 { + return &serviceconfig.ParseResult{Err: fmt.Errorf("no JSON service config provided")} + } + var rsc jsonSC + err := json.Unmarshal([]byte(js), &rsc) + if err != nil { + grpclog.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err) + return &serviceconfig.ParseResult{Err: err} + } + sc := ServiceConfig{ + LB: rsc.LoadBalancingPolicy, + Methods: make(map[string]MethodConfig), + retryThrottling: rsc.RetryThrottling, + healthCheckConfig: rsc.HealthCheckConfig, + rawJSONString: js, + } + if rsc.LoadBalancingConfig != nil { + for i, lbcfg := range *rsc.LoadBalancingConfig { + if len(lbcfg) != 1 { + err := fmt.Errorf("invalid loadBalancingConfig: entry %v does not contain exactly 1 policy/config pair: %q", i, lbcfg) + grpclog.Warningf(err.Error()) + return &serviceconfig.ParseResult{Err: err} + } + var name string + var jsonCfg json.RawMessage + for name, jsonCfg = range lbcfg { + } + builder := balancer.Get(name) + if builder == nil { + continue + } + sc.lbConfig = &lbConfig{name: name} + if parser, ok := builder.(balancer.ConfigParser); ok { + var err error + sc.lbConfig.cfg, err = parser.ParseConfig(jsonCfg) + if err != nil { + return &serviceconfig.ParseResult{Err: fmt.Errorf("error parsing loadBalancingConfig for policy %q: %v", name, err)} + } + } else if string(jsonCfg) != "{}" { + grpclog.Warningf("non-empty balancer configuration %q, but balancer does not implement ParseConfig", string(jsonCfg)) + } + break + } + if sc.lbConfig == nil { + // We had a loadBalancingConfig field but did not encounter a + // supported policy. The config is considered invalid in this + // case. + err := fmt.Errorf("invalid loadBalancingConfig: no supported policies found") + grpclog.Warningf(err.Error()) + return &serviceconfig.ParseResult{Err: err} + } + } + + if rsc.MethodConfig == nil { + return &serviceconfig.ParseResult{Config: &sc} + } + for _, m := range *rsc.MethodConfig { + if m.Name == nil { + continue + } + d, err := parseDuration(m.Timeout) + if err != nil { + grpclog.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err) + return &serviceconfig.ParseResult{Err: err} + } + + mc := MethodConfig{ + WaitForReady: m.WaitForReady, + Timeout: d, + } + if mc.retryPolicy, err = convertRetryPolicy(m.RetryPolicy); err != nil { + grpclog.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err) + return &serviceconfig.ParseResult{Err: err} + } + if m.MaxRequestMessageBytes != nil { + if *m.MaxRequestMessageBytes > int64(maxInt) { + mc.MaxReqSize = newInt(maxInt) + } else { + mc.MaxReqSize = newInt(int(*m.MaxRequestMessageBytes)) + } + } + if m.MaxResponseMessageBytes != nil { + if *m.MaxResponseMessageBytes > int64(maxInt) { + mc.MaxRespSize = newInt(maxInt) + } else { + mc.MaxRespSize = newInt(int(*m.MaxResponseMessageBytes)) + } + } + for _, n := range *m.Name { + if path, valid := n.generatePath(); valid { + sc.Methods[path] = mc + } + } + } + + if sc.retryThrottling != nil { + if mt := sc.retryThrottling.MaxTokens; mt <= 0 || mt > 1000 { + return &serviceconfig.ParseResult{Err: fmt.Errorf("invalid retry throttling config: maxTokens (%v) out of range (0, 1000]", mt)} + } + if tr := sc.retryThrottling.TokenRatio; tr <= 0 { + return &serviceconfig.ParseResult{Err: fmt.Errorf("invalid retry throttling config: tokenRatio (%v) may not be negative", tr)} + } + } + return &serviceconfig.ParseResult{Config: &sc} +} + +func convertRetryPolicy(jrp *jsonRetryPolicy) (p *retryPolicy, err error) { + if jrp == nil { + return nil, nil + } + ib, err := parseDuration(&jrp.InitialBackoff) + if err != nil { + return nil, err + } + mb, err := parseDuration(&jrp.MaxBackoff) + if err != nil { + return nil, err + } + + if jrp.MaxAttempts <= 1 || + *ib <= 0 || + *mb <= 0 || + jrp.BackoffMultiplier <= 0 || + len(jrp.RetryableStatusCodes) == 0 { + grpclog.Warningf("grpc: ignoring retry policy %v due to illegal configuration", jrp) + return nil, nil + } + + rp := &retryPolicy{ + maxAttempts: jrp.MaxAttempts, + initialBackoff: *ib, + maxBackoff: *mb, + backoffMultiplier: jrp.BackoffMultiplier, + retryableStatusCodes: make(map[codes.Code]bool), + } + if rp.maxAttempts > 5 { + // TODO(retry): Make the max maxAttempts configurable. + rp.maxAttempts = 5 + } + for _, code := range jrp.RetryableStatusCodes { + rp.retryableStatusCodes[code] = true + } + return rp, nil +} + +func min(a, b *int) *int { + if *a < *b { + return a + } + return b +} + +func getMaxSize(mcMax, doptMax *int, defaultVal int) *int { + if mcMax == nil && doptMax == nil { + return &defaultVal + } + if mcMax != nil && doptMax != nil { + return min(mcMax, doptMax) + } + if mcMax != nil { + return mcMax + } + return doptMax +} + +func newInt(b int) *int { + return &b +} diff --git a/vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go b/vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go new file mode 100644 index 00000000..187c3044 --- /dev/null +++ b/vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go @@ -0,0 +1,41 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package serviceconfig defines types and methods for operating on gRPC +// service configs. +// +// This package is EXPERIMENTAL. +package serviceconfig + +// Config represents an opaque data structure holding a service config. +type Config interface { + isServiceConfig() +} + +// LoadBalancingConfig represents an opaque data structure holding a load +// balancing config. +type LoadBalancingConfig interface { + isLoadBalancingConfig() +} + +// ParseResult contains a service config or an error. Exactly one must be +// non-nil. +type ParseResult struct { + Config Config + Err error +} diff --git a/vendor/google.golang.org/grpc/stats/handlers.go b/vendor/google.golang.org/grpc/stats/handlers.go new file mode 100644 index 00000000..dc03731e --- /dev/null +++ b/vendor/google.golang.org/grpc/stats/handlers.go @@ -0,0 +1,63 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package stats + +import ( + "context" + "net" +) + +// ConnTagInfo defines the relevant information needed by connection context tagger. +type ConnTagInfo struct { + // RemoteAddr is the remote address of the corresponding connection. + RemoteAddr net.Addr + // LocalAddr is the local address of the corresponding connection. + LocalAddr net.Addr +} + +// RPCTagInfo defines the relevant information needed by RPC context tagger. +type RPCTagInfo struct { + // FullMethodName is the RPC method in the format of /package.service/method. + FullMethodName string + // FailFast indicates if this RPC is failfast. + // This field is only valid on client side, it's always false on server side. + FailFast bool +} + +// Handler defines the interface for the related stats handling (e.g., RPCs, connections). +type Handler interface { + // TagRPC can attach some information to the given context. + // The context used for the rest lifetime of the RPC will be derived from + // the returned context. + TagRPC(context.Context, *RPCTagInfo) context.Context + // HandleRPC processes the RPC stats. + HandleRPC(context.Context, RPCStats) + + // TagConn can attach some information to the given context. + // The returned context will be used for stats handling. + // For conn stats handling, the context used in HandleConn for this + // connection will be derived from the context returned. + // For RPC stats handling, + // - On server side, the context used in HandleRPC for all RPCs on this + // connection will be derived from the context returned. + // - On client side, the context is not derived from the context returned. + TagConn(context.Context, *ConnTagInfo) context.Context + // HandleConn processes the Conn stats. + HandleConn(context.Context, ConnStats) +} diff --git a/vendor/google.golang.org/grpc/stats/stats.go b/vendor/google.golang.org/grpc/stats/stats.go new file mode 100644 index 00000000..a7970c79 --- /dev/null +++ b/vendor/google.golang.org/grpc/stats/stats.go @@ -0,0 +1,314 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +//go:generate protoc --go_out=plugins=grpc:. grpc_testing/test.proto + +// Package stats is for collecting and reporting various network and RPC stats. +// This package is for monitoring purpose only. All fields are read-only. +// All APIs are experimental. +package stats // import "google.golang.org/grpc/stats" + +import ( + "context" + "net" + "time" + + "google.golang.org/grpc/metadata" +) + +// RPCStats contains stats information about RPCs. +type RPCStats interface { + isRPCStats() + // IsClient returns true if this RPCStats is from client side. + IsClient() bool +} + +// Begin contains stats when an RPC begins. +// FailFast is only valid if this Begin is from client side. +type Begin struct { + // Client is true if this Begin is from client side. + Client bool + // BeginTime is the time when the RPC begins. + BeginTime time.Time + // FailFast indicates if this RPC is failfast. + FailFast bool +} + +// IsClient indicates if the stats information is from client side. +func (s *Begin) IsClient() bool { return s.Client } + +func (s *Begin) isRPCStats() {} + +// InPayload contains the information for an incoming payload. +type InPayload struct { + // Client is true if this InPayload is from client side. + Client bool + // Payload is the payload with original type. + Payload interface{} + // Data is the serialized message payload. + Data []byte + // Length is the length of uncompressed data. + Length int + // WireLength is the length of data on wire (compressed, signed, encrypted). + WireLength int + // RecvTime is the time when the payload is received. + RecvTime time.Time +} + +// IsClient indicates if the stats information is from client side. +func (s *InPayload) IsClient() bool { return s.Client } + +func (s *InPayload) isRPCStats() {} + +// InHeader contains stats when a header is received. +type InHeader struct { + // Client is true if this InHeader is from client side. + Client bool + // WireLength is the wire length of header. + WireLength int + // Compression is the compression algorithm used for the RPC. + Compression string + // Header contains the header metadata received. + Header metadata.MD + + // The following fields are valid only if Client is false. + // FullMethod is the full RPC method string, i.e., /package.service/method. + FullMethod string + // RemoteAddr is the remote address of the corresponding connection. + RemoteAddr net.Addr + // LocalAddr is the local address of the corresponding connection. + LocalAddr net.Addr +} + +// IsClient indicates if the stats information is from client side. +func (s *InHeader) IsClient() bool { return s.Client } + +func (s *InHeader) isRPCStats() {} + +// InTrailer contains stats when a trailer is received. +type InTrailer struct { + // Client is true if this InTrailer is from client side. + Client bool + // WireLength is the wire length of trailer. + WireLength int + // Trailer contains the trailer metadata received from the server. This + // field is only valid if this InTrailer is from the client side. + Trailer metadata.MD +} + +// IsClient indicates if the stats information is from client side. +func (s *InTrailer) IsClient() bool { return s.Client } + +func (s *InTrailer) isRPCStats() {} + +// OutPayload contains the information for an outgoing payload. +type OutPayload struct { + // Client is true if this OutPayload is from client side. + Client bool + // Payload is the payload with original type. + Payload interface{} + // Data is the serialized message payload. + Data []byte + // Length is the length of uncompressed data. + Length int + // WireLength is the length of data on wire (compressed, signed, encrypted). + WireLength int + // SentTime is the time when the payload is sent. + SentTime time.Time +} + +// IsClient indicates if this stats information is from client side. +func (s *OutPayload) IsClient() bool { return s.Client } + +func (s *OutPayload) isRPCStats() {} + +// OutHeader contains stats when a header is sent. +type OutHeader struct { + // Client is true if this OutHeader is from client side. + Client bool + // Compression is the compression algorithm used for the RPC. + Compression string + // Header contains the header metadata sent. + Header metadata.MD + + // The following fields are valid only if Client is true. + // FullMethod is the full RPC method string, i.e., /package.service/method. + FullMethod string + // RemoteAddr is the remote address of the corresponding connection. + RemoteAddr net.Addr + // LocalAddr is the local address of the corresponding connection. + LocalAddr net.Addr +} + +// IsClient indicates if this stats information is from client side. +func (s *OutHeader) IsClient() bool { return s.Client } + +func (s *OutHeader) isRPCStats() {} + +// OutTrailer contains stats when a trailer is sent. +type OutTrailer struct { + // Client is true if this OutTrailer is from client side. + Client bool + // WireLength is the wire length of trailer. + // + // Deprecated: This field is never set. The length is not known when this message is + // emitted because the trailer fields are compressed with hpack after that. + WireLength int + // Trailer contains the trailer metadata sent to the client. This + // field is only valid if this OutTrailer is from the server side. + Trailer metadata.MD +} + +// IsClient indicates if this stats information is from client side. +func (s *OutTrailer) IsClient() bool { return s.Client } + +func (s *OutTrailer) isRPCStats() {} + +// End contains stats when an RPC ends. +type End struct { + // Client is true if this End is from client side. + Client bool + // BeginTime is the time when the RPC began. + BeginTime time.Time + // EndTime is the time when the RPC ends. + EndTime time.Time + // Trailer contains the trailer metadata received from the server. This + // field is only valid if this End is from the client side. + // Deprecated: use Trailer in InTrailer instead. + Trailer metadata.MD + // Error is the error the RPC ended with. It is an error generated from + // status.Status and can be converted back to status.Status using + // status.FromError if non-nil. + Error error +} + +// IsClient indicates if this is from client side. +func (s *End) IsClient() bool { return s.Client } + +func (s *End) isRPCStats() {} + +// ConnStats contains stats information about connections. +type ConnStats interface { + isConnStats() + // IsClient returns true if this ConnStats is from client side. + IsClient() bool +} + +// ConnBegin contains the stats of a connection when it is established. +type ConnBegin struct { + // Client is true if this ConnBegin is from client side. + Client bool +} + +// IsClient indicates if this is from client side. +func (s *ConnBegin) IsClient() bool { return s.Client } + +func (s *ConnBegin) isConnStats() {} + +// ConnEnd contains the stats of a connection when it ends. +type ConnEnd struct { + // Client is true if this ConnEnd is from client side. + Client bool +} + +// IsClient indicates if this is from client side. +func (s *ConnEnd) IsClient() bool { return s.Client } + +func (s *ConnEnd) isConnStats() {} + +type incomingTagsKey struct{} +type outgoingTagsKey struct{} + +// SetTags attaches stats tagging data to the context, which will be sent in +// the outgoing RPC with the header grpc-tags-bin. Subsequent calls to +// SetTags will overwrite the values from earlier calls. +// +// NOTE: this is provided only for backward compatibility with existing clients +// and will likely be removed in an upcoming release. New uses should transmit +// this type of data using metadata with a different, non-reserved (i.e. does +// not begin with "grpc-") header name. +func SetTags(ctx context.Context, b []byte) context.Context { + return context.WithValue(ctx, outgoingTagsKey{}, b) +} + +// Tags returns the tags from the context for the inbound RPC. +// +// NOTE: this is provided only for backward compatibility with existing clients +// and will likely be removed in an upcoming release. New uses should transmit +// this type of data using metadata with a different, non-reserved (i.e. does +// not begin with "grpc-") header name. +func Tags(ctx context.Context) []byte { + b, _ := ctx.Value(incomingTagsKey{}).([]byte) + return b +} + +// SetIncomingTags attaches stats tagging data to the context, to be read by +// the application (not sent in outgoing RPCs). +// +// This is intended for gRPC-internal use ONLY. +func SetIncomingTags(ctx context.Context, b []byte) context.Context { + return context.WithValue(ctx, incomingTagsKey{}, b) +} + +// OutgoingTags returns the tags from the context for the outbound RPC. +// +// This is intended for gRPC-internal use ONLY. +func OutgoingTags(ctx context.Context) []byte { + b, _ := ctx.Value(outgoingTagsKey{}).([]byte) + return b +} + +type incomingTraceKey struct{} +type outgoingTraceKey struct{} + +// SetTrace attaches stats tagging data to the context, which will be sent in +// the outgoing RPC with the header grpc-trace-bin. Subsequent calls to +// SetTrace will overwrite the values from earlier calls. +// +// NOTE: this is provided only for backward compatibility with existing clients +// and will likely be removed in an upcoming release. New uses should transmit +// this type of data using metadata with a different, non-reserved (i.e. does +// not begin with "grpc-") header name. +func SetTrace(ctx context.Context, b []byte) context.Context { + return context.WithValue(ctx, outgoingTraceKey{}, b) +} + +// Trace returns the trace from the context for the inbound RPC. +// +// NOTE: this is provided only for backward compatibility with existing clients +// and will likely be removed in an upcoming release. New uses should transmit +// this type of data using metadata with a different, non-reserved (i.e. does +// not begin with "grpc-") header name. +func Trace(ctx context.Context) []byte { + b, _ := ctx.Value(incomingTraceKey{}).([]byte) + return b +} + +// SetIncomingTrace attaches stats tagging data to the context, to be read by +// the application (not sent in outgoing RPCs). It is intended for +// gRPC-internal use. +func SetIncomingTrace(ctx context.Context, b []byte) context.Context { + return context.WithValue(ctx, incomingTraceKey{}, b) +} + +// OutgoingTrace returns the trace from the context for the outbound RPC. It is +// intended for gRPC-internal use. +func OutgoingTrace(ctx context.Context) []byte { + b, _ := ctx.Value(outgoingTraceKey{}).([]byte) + return b +} diff --git a/vendor/google.golang.org/grpc/status/status.go b/vendor/google.golang.org/grpc/status/status.go new file mode 100644 index 00000000..01e182c3 --- /dev/null +++ b/vendor/google.golang.org/grpc/status/status.go @@ -0,0 +1,127 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package status implements errors returned by gRPC. These errors are +// serialized and transmitted on the wire between server and client, and allow +// for additional data to be transmitted via the Details field in the status +// proto. gRPC service handlers should return an error created by this +// package, and gRPC clients should expect a corresponding error to be +// returned from the RPC call. +// +// This package upholds the invariants that a non-nil error may not +// contain an OK code, and an OK code must result in a nil error. +package status + +import ( + "context" + "fmt" + + spb "google.golang.org/genproto/googleapis/rpc/status" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/internal/status" +) + +// Status references google.golang.org/grpc/internal/status. It represents an +// RPC status code, message, and details. It is immutable and should be +// created with New, Newf, or FromProto. +// https://godoc.org/google.golang.org/grpc/internal/status +type Status = status.Status + +// New returns a Status representing c and msg. +func New(c codes.Code, msg string) *Status { + return status.New(c, msg) +} + +// Newf returns New(c, fmt.Sprintf(format, a...)). +func Newf(c codes.Code, format string, a ...interface{}) *Status { + return New(c, fmt.Sprintf(format, a...)) +} + +// Error returns an error representing c and msg. If c is OK, returns nil. +func Error(c codes.Code, msg string) error { + return New(c, msg).Err() +} + +// Errorf returns Error(c, fmt.Sprintf(format, a...)). +func Errorf(c codes.Code, format string, a ...interface{}) error { + return Error(c, fmt.Sprintf(format, a...)) +} + +// ErrorProto returns an error representing s. If s.Code is OK, returns nil. +func ErrorProto(s *spb.Status) error { + return FromProto(s).Err() +} + +// FromProto returns a Status representing s. +func FromProto(s *spb.Status) *Status { + return status.FromProto(s) +} + +// FromError returns a Status representing err if it was produced from this +// package or has a method `GRPCStatus() *Status`. Otherwise, ok is false and a +// Status is returned with codes.Unknown and the original error message. +func FromError(err error) (s *Status, ok bool) { + if err == nil { + return nil, true + } + if se, ok := err.(interface { + GRPCStatus() *Status + }); ok { + return se.GRPCStatus(), true + } + return New(codes.Unknown, err.Error()), false +} + +// Convert is a convenience function which removes the need to handle the +// boolean return value from FromError. +func Convert(err error) *Status { + s, _ := FromError(err) + return s +} + +// Code returns the Code of the error if it is a Status error, codes.OK if err +// is nil, or codes.Unknown otherwise. +func Code(err error) codes.Code { + // Don't use FromError to avoid allocation of OK status. + if err == nil { + return codes.OK + } + if se, ok := err.(interface { + GRPCStatus() *Status + }); ok { + return se.GRPCStatus().Code() + } + return codes.Unknown +} + +// FromContextError converts a context error into a Status. It returns a +// Status with codes.OK if err is nil, or a Status with codes.Unknown if err is +// non-nil and not a context error. +func FromContextError(err error) *Status { + switch err { + case nil: + return nil + case context.DeadlineExceeded: + return New(codes.DeadlineExceeded, err.Error()) + case context.Canceled: + return New(codes.Canceled, err.Error()) + default: + return New(codes.Unknown, err.Error()) + } +} diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go new file mode 100644 index 00000000..934ef683 --- /dev/null +++ b/vendor/google.golang.org/grpc/stream.go @@ -0,0 +1,1528 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "context" + "errors" + "io" + "math" + "strconv" + "sync" + "time" + + "golang.org/x/net/trace" + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/encoding" + "google.golang.org/grpc/internal/balancerload" + "google.golang.org/grpc/internal/binarylog" + "google.golang.org/grpc/internal/channelz" + "google.golang.org/grpc/internal/grpcrand" + "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" +) + +// StreamHandler defines the handler called by gRPC server to complete the +// execution of a streaming RPC. If a StreamHandler returns an error, it +// should be produced by the status package, or else gRPC will use +// codes.Unknown as the status code and err.Error() as the status message +// of the RPC. +type StreamHandler func(srv interface{}, stream ServerStream) error + +// StreamDesc represents a streaming RPC service's method specification. +type StreamDesc struct { + StreamName string + Handler StreamHandler + + // At least one of these is true. + ServerStreams bool + ClientStreams bool +} + +// Stream defines the common interface a client or server stream has to satisfy. +// +// Deprecated: See ClientStream and ServerStream documentation instead. +type Stream interface { + // Deprecated: See ClientStream and ServerStream documentation instead. + Context() context.Context + // Deprecated: See ClientStream and ServerStream documentation instead. + SendMsg(m interface{}) error + // Deprecated: See ClientStream and ServerStream documentation instead. + RecvMsg(m interface{}) error +} + +// ClientStream defines the client-side behavior of a streaming RPC. +// +// All errors returned from ClientStream methods are compatible with the +// status package. +type ClientStream interface { + // Header returns the header metadata received from the server if there + // is any. It blocks if the metadata is not ready to read. + Header() (metadata.MD, error) + // Trailer returns the trailer metadata from the server, if there is any. + // It must only be called after stream.CloseAndRecv has returned, or + // stream.Recv has returned a non-nil error (including io.EOF). + Trailer() metadata.MD + // CloseSend closes the send direction of the stream. It closes the stream + // when non-nil error is met. It is also not safe to call CloseSend + // concurrently with SendMsg. + CloseSend() error + // Context returns the context for this stream. + // + // It should not be called until after Header or RecvMsg has returned. Once + // called, subsequent client-side retries are disabled. + Context() context.Context + // SendMsg is generally called by generated code. On error, SendMsg aborts + // the stream. If the error was generated by the client, the status is + // returned directly; otherwise, io.EOF is returned and the status of + // the stream may be discovered using RecvMsg. + // + // SendMsg blocks until: + // - There is sufficient flow control to schedule m with the transport, or + // - The stream is done, or + // - The stream breaks. + // + // SendMsg does not wait until the message is received by the server. An + // untimely stream closure may result in lost messages. To ensure delivery, + // users should ensure the RPC completed successfully using RecvMsg. + // + // It is safe to have a goroutine calling SendMsg and another goroutine + // calling RecvMsg on the same stream at the same time, but it is not safe + // to call SendMsg on the same stream in different goroutines. It is also + // not safe to call CloseSend concurrently with SendMsg. + SendMsg(m interface{}) error + // RecvMsg blocks until it receives a message into m or the stream is + // done. It returns io.EOF when the stream completes successfully. On + // any other error, the stream is aborted and the error contains the RPC + // status. + // + // It is safe to have a goroutine calling SendMsg and another goroutine + // calling RecvMsg on the same stream at the same time, but it is not + // safe to call RecvMsg on the same stream in different goroutines. + RecvMsg(m interface{}) error +} + +// NewStream creates a new Stream for the client side. This is typically +// called by generated code. ctx is used for the lifetime of the stream. +// +// To ensure resources are not leaked due to the stream returned, one of the following +// actions must be performed: +// +// 1. Call Close on the ClientConn. +// 2. Cancel the context provided. +// 3. Call RecvMsg until a non-nil error is returned. A protobuf-generated +// client-streaming RPC, for instance, might use the helper function +// CloseAndRecv (note that CloseSend does not Recv, therefore is not +// guaranteed to release all resources). +// 4. Receive a non-nil, non-io.EOF error from Header or SendMsg. +// +// If none of the above happen, a goroutine and a context will be leaked, and grpc +// will not call the optionally-configured stats handler with a stats.End message. +func (cc *ClientConn) NewStream(ctx context.Context, desc *StreamDesc, method string, opts ...CallOption) (ClientStream, error) { + // allow interceptor to see all applicable call options, which means those + // configured as defaults from dial option as well as per-call options + opts = combine(cc.dopts.callOptions, opts) + + if cc.dopts.streamInt != nil { + return cc.dopts.streamInt(ctx, desc, cc, method, newClientStream, opts...) + } + return newClientStream(ctx, desc, cc, method, opts...) +} + +// NewClientStream is a wrapper for ClientConn.NewStream. +func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (ClientStream, error) { + return cc.NewStream(ctx, desc, method, opts...) +} + +func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (_ ClientStream, err error) { + if channelz.IsOn() { + cc.incrCallsStarted() + defer func() { + if err != nil { + cc.incrCallsFailed() + } + }() + } + c := defaultCallInfo() + // Provide an opportunity for the first RPC to see the first service config + // provided by the resolver. + if err := cc.waitForResolvedAddrs(ctx); err != nil { + return nil, err + } + mc := cc.GetMethodConfig(method) + if mc.WaitForReady != nil { + c.failFast = !*mc.WaitForReady + } + + // Possible context leak: + // The cancel function for the child context we create will only be called + // when RecvMsg returns a non-nil error, if the ClientConn is closed, or if + // an error is generated by SendMsg. + // https://github.com/grpc/grpc-go/issues/1818. + var cancel context.CancelFunc + if mc.Timeout != nil && *mc.Timeout >= 0 { + ctx, cancel = context.WithTimeout(ctx, *mc.Timeout) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer func() { + if err != nil { + cancel() + } + }() + + for _, o := range opts { + if err := o.before(c); err != nil { + return nil, toRPCErr(err) + } + } + c.maxSendMessageSize = getMaxSize(mc.MaxReqSize, c.maxSendMessageSize, defaultClientMaxSendMessageSize) + c.maxReceiveMessageSize = getMaxSize(mc.MaxRespSize, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) + if err := setCallInfoCodec(c); err != nil { + return nil, err + } + + callHdr := &transport.CallHdr{ + Host: cc.authority, + Method: method, + ContentSubtype: c.contentSubtype, + } + + // Set our outgoing compression according to the UseCompressor CallOption, if + // set. In that case, also find the compressor from the encoding package. + // Otherwise, use the compressor configured by the WithCompressor DialOption, + // if set. + var cp Compressor + var comp encoding.Compressor + if ct := c.compressorType; ct != "" { + callHdr.SendCompress = ct + if ct != encoding.Identity { + comp = encoding.GetCompressor(ct) + if comp == nil { + return nil, status.Errorf(codes.Internal, "grpc: Compressor is not installed for requested grpc-encoding %q", ct) + } + } + } else if cc.dopts.cp != nil { + callHdr.SendCompress = cc.dopts.cp.Type() + cp = cc.dopts.cp + } + if c.creds != nil { + callHdr.Creds = c.creds + } + var trInfo *traceInfo + if EnableTracing { + trInfo = &traceInfo{ + tr: trace.New("grpc.Sent."+methodFamily(method), method), + firstLine: firstLine{ + client: true, + }, + } + if deadline, ok := ctx.Deadline(); ok { + trInfo.firstLine.deadline = time.Until(deadline) + } + trInfo.tr.LazyLog(&trInfo.firstLine, false) + ctx = trace.NewContext(ctx, trInfo.tr) + } + ctx = newContextWithRPCInfo(ctx, c.failFast, c.codec, cp, comp) + sh := cc.dopts.copts.StatsHandler + var beginTime time.Time + if sh != nil { + ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast}) + beginTime = time.Now() + begin := &stats.Begin{ + Client: true, + BeginTime: beginTime, + FailFast: c.failFast, + } + sh.HandleRPC(ctx, begin) + } + + cs := &clientStream{ + callHdr: callHdr, + ctx: ctx, + methodConfig: &mc, + opts: opts, + callInfo: c, + cc: cc, + desc: desc, + codec: c.codec, + cp: cp, + comp: comp, + cancel: cancel, + beginTime: beginTime, + firstAttempt: true, + } + if !cc.dopts.disableRetry { + cs.retryThrottler = cc.retryThrottler.Load().(*retryThrottler) + } + cs.binlog = binarylog.GetMethodLogger(method) + + cs.callInfo.stream = cs + // Only this initial attempt has stats/tracing. + // TODO(dfawley): move to newAttempt when per-attempt stats are implemented. + if err := cs.newAttemptLocked(sh, trInfo); err != nil { + cs.finish(err) + return nil, err + } + + op := func(a *csAttempt) error { return a.newStream() } + if err := cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op) }); err != nil { + cs.finish(err) + return nil, err + } + + if cs.binlog != nil { + md, _ := metadata.FromOutgoingContext(ctx) + logEntry := &binarylog.ClientHeader{ + OnClientSide: true, + Header: md, + MethodName: method, + Authority: cs.cc.authority, + } + if deadline, ok := ctx.Deadline(); ok { + logEntry.Timeout = time.Until(deadline) + if logEntry.Timeout < 0 { + logEntry.Timeout = 0 + } + } + cs.binlog.Log(logEntry) + } + + if desc != unaryStreamDesc { + // Listen on cc and stream contexts to cleanup when the user closes the + // ClientConn or cancels the stream context. In all other cases, an error + // should already be injected into the recv buffer by the transport, which + // the client will eventually receive, and then we will cancel the stream's + // context in clientStream.finish. + go func() { + select { + case <-cc.ctx.Done(): + cs.finish(ErrClientConnClosing) + case <-ctx.Done(): + cs.finish(toRPCErr(ctx.Err())) + } + }() + } + return cs, nil +} + +// newAttemptLocked creates a new attempt with a transport. +// If it succeeds, then it replaces clientStream's attempt with this new attempt. +func (cs *clientStream) newAttemptLocked(sh stats.Handler, trInfo *traceInfo) (retErr error) { + newAttempt := &csAttempt{ + cs: cs, + dc: cs.cc.dopts.dc, + statsHandler: sh, + trInfo: trInfo, + } + defer func() { + if retErr != nil { + // This attempt is not set in the clientStream, so it's finish won't + // be called. Call it here for stats and trace in case they are not + // nil. + newAttempt.finish(retErr) + } + }() + + if err := cs.ctx.Err(); err != nil { + return toRPCErr(err) + } + t, done, err := cs.cc.getTransport(cs.ctx, cs.callInfo.failFast, cs.callHdr.Method) + if err != nil { + return err + } + if trInfo != nil { + trInfo.firstLine.SetRemoteAddr(t.RemoteAddr()) + } + newAttempt.t = t + newAttempt.done = done + cs.attempt = newAttempt + return nil +} + +func (a *csAttempt) newStream() error { + cs := a.cs + cs.callHdr.PreviousAttempts = cs.numRetries + s, err := a.t.NewStream(cs.ctx, cs.callHdr) + if err != nil { + return toRPCErr(err) + } + cs.attempt.s = s + cs.attempt.p = &parser{r: s} + return nil +} + +// clientStream implements a client side Stream. +type clientStream struct { + callHdr *transport.CallHdr + opts []CallOption + callInfo *callInfo + cc *ClientConn + desc *StreamDesc + + codec baseCodec + cp Compressor + comp encoding.Compressor + + cancel context.CancelFunc // cancels all attempts + + sentLast bool // sent an end stream + beginTime time.Time + + methodConfig *MethodConfig + + ctx context.Context // the application's context, wrapped by stats/tracing + + retryThrottler *retryThrottler // The throttler active when the RPC began. + + binlog *binarylog.MethodLogger // Binary logger, can be nil. + // serverHeaderBinlogged is a boolean for whether server header has been + // logged. Server header will be logged when the first time one of those + // happens: stream.Header(), stream.Recv(). + // + // It's only read and used by Recv() and Header(), so it doesn't need to be + // synchronized. + serverHeaderBinlogged bool + + mu sync.Mutex + firstAttempt bool // if true, transparent retry is valid + numRetries int // exclusive of transparent retry attempt(s) + numRetriesSincePushback int // retries since pushback; to reset backoff + finished bool // TODO: replace with atomic cmpxchg or sync.Once? + // attempt is the active client stream attempt. + // The only place where it is written is the newAttemptLocked method and this method never writes nil. + // So, attempt can be nil only inside newClientStream function when clientStream is first created. + // One of the first things done after clientStream's creation, is to call newAttemptLocked which either + // assigns a non nil value to the attempt or returns an error. If an error is returned from newAttemptLocked, + // then newClientStream calls finish on the clientStream and returns. So, finish method is the only + // place where we need to check if the attempt is nil. + attempt *csAttempt + // TODO(hedging): hedging will have multiple attempts simultaneously. + committed bool // active attempt committed for retry? + buffer []func(a *csAttempt) error // operations to replay on retry + bufferSize int // current size of buffer +} + +// csAttempt implements a single transport stream attempt within a +// clientStream. +type csAttempt struct { + cs *clientStream + t transport.ClientTransport + s *transport.Stream + p *parser + done func(balancer.DoneInfo) + + finished bool + dc Decompressor + decomp encoding.Compressor + decompSet bool + + mu sync.Mutex // guards trInfo.tr + // trInfo may be nil (if EnableTracing is false). + // trInfo.tr is set when created (if EnableTracing is true), + // and cleared when the finish method is called. + trInfo *traceInfo + + statsHandler stats.Handler +} + +func (cs *clientStream) commitAttemptLocked() { + cs.committed = true + cs.buffer = nil +} + +func (cs *clientStream) commitAttempt() { + cs.mu.Lock() + cs.commitAttemptLocked() + cs.mu.Unlock() +} + +// shouldRetry returns nil if the RPC should be retried; otherwise it returns +// the error that should be returned by the operation. +func (cs *clientStream) shouldRetry(err error) error { + if cs.attempt.s == nil && !cs.callInfo.failFast { + // In the event of any error from NewStream (attempt.s == nil), we + // never attempted to write anything to the wire, so we can retry + // indefinitely for non-fail-fast RPCs. + return nil + } + if cs.finished || cs.committed { + // RPC is finished or committed; cannot retry. + return err + } + // Wait for the trailers. + if cs.attempt.s != nil { + <-cs.attempt.s.Done() + } + if cs.firstAttempt && (cs.attempt.s == nil || cs.attempt.s.Unprocessed()) { + // First attempt, stream unprocessed: transparently retry. + cs.firstAttempt = false + return nil + } + cs.firstAttempt = false + if cs.cc.dopts.disableRetry { + return err + } + + pushback := 0 + hasPushback := false + if cs.attempt.s != nil { + if !cs.attempt.s.TrailersOnly() { + return err + } + + // TODO(retry): Move down if the spec changes to not check server pushback + // before considering this a failure for throttling. + sps := cs.attempt.s.Trailer()["grpc-retry-pushback-ms"] + if len(sps) == 1 { + var e error + if pushback, e = strconv.Atoi(sps[0]); e != nil || pushback < 0 { + channelz.Infof(cs.cc.channelzID, "Server retry pushback specified to abort (%q).", sps[0]) + cs.retryThrottler.throttle() // This counts as a failure for throttling. + return err + } + hasPushback = true + } else if len(sps) > 1 { + channelz.Warningf(cs.cc.channelzID, "Server retry pushback specified multiple values (%q); not retrying.", sps) + cs.retryThrottler.throttle() // This counts as a failure for throttling. + return err + } + } + + var code codes.Code + if cs.attempt.s != nil { + code = cs.attempt.s.Status().Code() + } else { + code = status.Convert(err).Code() + } + + rp := cs.methodConfig.retryPolicy + if rp == nil || !rp.retryableStatusCodes[code] { + return err + } + + // Note: the ordering here is important; we count this as a failure + // only if the code matched a retryable code. + if cs.retryThrottler.throttle() { + return err + } + if cs.numRetries+1 >= rp.maxAttempts { + return err + } + + var dur time.Duration + if hasPushback { + dur = time.Millisecond * time.Duration(pushback) + cs.numRetriesSincePushback = 0 + } else { + fact := math.Pow(rp.backoffMultiplier, float64(cs.numRetriesSincePushback)) + cur := float64(rp.initialBackoff) * fact + if max := float64(rp.maxBackoff); cur > max { + cur = max + } + dur = time.Duration(grpcrand.Int63n(int64(cur))) + cs.numRetriesSincePushback++ + } + + // TODO(dfawley): we could eagerly fail here if dur puts us past the + // deadline, but unsure if it is worth doing. + t := time.NewTimer(dur) + select { + case <-t.C: + cs.numRetries++ + return nil + case <-cs.ctx.Done(): + t.Stop() + return status.FromContextError(cs.ctx.Err()).Err() + } +} + +// Returns nil if a retry was performed and succeeded; error otherwise. +func (cs *clientStream) retryLocked(lastErr error) error { + for { + cs.attempt.finish(lastErr) + if err := cs.shouldRetry(lastErr); err != nil { + cs.commitAttemptLocked() + return err + } + if err := cs.newAttemptLocked(nil, nil); err != nil { + return err + } + if lastErr = cs.replayBufferLocked(); lastErr == nil { + return nil + } + } +} + +func (cs *clientStream) Context() context.Context { + cs.commitAttempt() + // No need to lock before using attempt, since we know it is committed and + // cannot change. + return cs.attempt.s.Context() +} + +func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func()) error { + cs.mu.Lock() + for { + if cs.committed { + cs.mu.Unlock() + return op(cs.attempt) + } + a := cs.attempt + cs.mu.Unlock() + err := op(a) + cs.mu.Lock() + if a != cs.attempt { + // We started another attempt already. + continue + } + if err == io.EOF { + <-a.s.Done() + } + if err == nil || (err == io.EOF && a.s.Status().Code() == codes.OK) { + onSuccess() + cs.mu.Unlock() + return err + } + if err := cs.retryLocked(err); err != nil { + cs.mu.Unlock() + return err + } + } +} + +func (cs *clientStream) Header() (metadata.MD, error) { + var m metadata.MD + err := cs.withRetry(func(a *csAttempt) error { + var err error + m, err = a.s.Header() + return toRPCErr(err) + }, cs.commitAttemptLocked) + if err != nil { + cs.finish(err) + return nil, err + } + if cs.binlog != nil && !cs.serverHeaderBinlogged { + // Only log if binary log is on and header has not been logged. + logEntry := &binarylog.ServerHeader{ + OnClientSide: true, + Header: m, + PeerAddr: nil, + } + if peer, ok := peer.FromContext(cs.Context()); ok { + logEntry.PeerAddr = peer.Addr + } + cs.binlog.Log(logEntry) + cs.serverHeaderBinlogged = true + } + return m, err +} + +func (cs *clientStream) Trailer() metadata.MD { + // On RPC failure, we never need to retry, because usage requires that + // RecvMsg() returned a non-nil error before calling this function is valid. + // We would have retried earlier if necessary. + // + // Commit the attempt anyway, just in case users are not following those + // directions -- it will prevent races and should not meaningfully impact + // performance. + cs.commitAttempt() + if cs.attempt.s == nil { + return nil + } + return cs.attempt.s.Trailer() +} + +func (cs *clientStream) replayBufferLocked() error { + a := cs.attempt + for _, f := range cs.buffer { + if err := f(a); err != nil { + return err + } + } + return nil +} + +func (cs *clientStream) bufferForRetryLocked(sz int, op func(a *csAttempt) error) { + // Note: we still will buffer if retry is disabled (for transparent retries). + if cs.committed { + return + } + cs.bufferSize += sz + if cs.bufferSize > cs.callInfo.maxRetryRPCBufferSize { + cs.commitAttemptLocked() + return + } + cs.buffer = append(cs.buffer, op) +} + +func (cs *clientStream) SendMsg(m interface{}) (err error) { + defer func() { + if err != nil && err != io.EOF { + // Call finish on the client stream for errors generated by this SendMsg + // call, as these indicate problems created by this client. (Transport + // errors are converted to an io.EOF error in csAttempt.sendMsg; the real + // error will be returned from RecvMsg eventually in that case, or be + // retried.) + cs.finish(err) + } + }() + if cs.sentLast { + return status.Errorf(codes.Internal, "SendMsg called after CloseSend") + } + if !cs.desc.ClientStreams { + cs.sentLast = true + } + + // load hdr, payload, data + hdr, payload, data, err := prepareMsg(m, cs.codec, cs.cp, cs.comp) + if err != nil { + return err + } + + // TODO(dfawley): should we be checking len(data) instead? + if len(payload) > *cs.callInfo.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(payload), *cs.callInfo.maxSendMessageSize) + } + msgBytes := data // Store the pointer before setting to nil. For binary logging. + op := func(a *csAttempt) error { + err := a.sendMsg(m, hdr, payload, data) + // nil out the message and uncomp when replaying; they are only needed for + // stats which is disabled for subsequent attempts. + m, data = nil, nil + return err + } + err = cs.withRetry(op, func() { cs.bufferForRetryLocked(len(hdr)+len(payload), op) }) + if cs.binlog != nil && err == nil { + cs.binlog.Log(&binarylog.ClientMessage{ + OnClientSide: true, + Message: msgBytes, + }) + } + return +} + +func (cs *clientStream) RecvMsg(m interface{}) error { + if cs.binlog != nil && !cs.serverHeaderBinlogged { + // Call Header() to binary log header if it's not already logged. + cs.Header() + } + var recvInfo *payloadInfo + if cs.binlog != nil { + recvInfo = &payloadInfo{} + } + err := cs.withRetry(func(a *csAttempt) error { + return a.recvMsg(m, recvInfo) + }, cs.commitAttemptLocked) + if cs.binlog != nil && err == nil { + cs.binlog.Log(&binarylog.ServerMessage{ + OnClientSide: true, + Message: recvInfo.uncompressedBytes, + }) + } + if err != nil || !cs.desc.ServerStreams { + // err != nil or non-server-streaming indicates end of stream. + cs.finish(err) + + if cs.binlog != nil { + // finish will not log Trailer. Log Trailer here. + logEntry := &binarylog.ServerTrailer{ + OnClientSide: true, + Trailer: cs.Trailer(), + Err: err, + } + if logEntry.Err == io.EOF { + logEntry.Err = nil + } + if peer, ok := peer.FromContext(cs.Context()); ok { + logEntry.PeerAddr = peer.Addr + } + cs.binlog.Log(logEntry) + } + } + return err +} + +func (cs *clientStream) CloseSend() error { + if cs.sentLast { + // TODO: return an error and finish the stream instead, due to API misuse? + return nil + } + cs.sentLast = true + op := func(a *csAttempt) error { + a.t.Write(a.s, nil, nil, &transport.Options{Last: true}) + // Always return nil; io.EOF is the only error that might make sense + // instead, but there is no need to signal the client to call RecvMsg + // as the only use left for the stream after CloseSend is to call + // RecvMsg. This also matches historical behavior. + return nil + } + cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op) }) + if cs.binlog != nil { + cs.binlog.Log(&binarylog.ClientHalfClose{ + OnClientSide: true, + }) + } + // We never returned an error here for reasons. + return nil +} + +func (cs *clientStream) finish(err error) { + if err == io.EOF { + // Ending a stream with EOF indicates a success. + err = nil + } + cs.mu.Lock() + if cs.finished { + cs.mu.Unlock() + return + } + cs.finished = true + cs.commitAttemptLocked() + cs.mu.Unlock() + // For binary logging. only log cancel in finish (could be caused by RPC ctx + // canceled or ClientConn closed). Trailer will be logged in RecvMsg. + // + // Only one of cancel or trailer needs to be logged. In the cases where + // users don't call RecvMsg, users must have already canceled the RPC. + if cs.binlog != nil && status.Code(err) == codes.Canceled { + cs.binlog.Log(&binarylog.Cancel{ + OnClientSide: true, + }) + } + if err == nil { + cs.retryThrottler.successfulRPC() + } + if channelz.IsOn() { + if err != nil { + cs.cc.incrCallsFailed() + } else { + cs.cc.incrCallsSucceeded() + } + } + if cs.attempt != nil { + cs.attempt.finish(err) + // after functions all rely upon having a stream. + if cs.attempt.s != nil { + for _, o := range cs.opts { + o.after(cs.callInfo) + } + } + } + cs.cancel() +} + +func (a *csAttempt) sendMsg(m interface{}, hdr, payld, data []byte) error { + cs := a.cs + if a.trInfo != nil { + a.mu.Lock() + if a.trInfo.tr != nil { + a.trInfo.tr.LazyLog(&payload{sent: true, msg: m}, true) + } + a.mu.Unlock() + } + if err := a.t.Write(a.s, hdr, payld, &transport.Options{Last: !cs.desc.ClientStreams}); err != nil { + if !cs.desc.ClientStreams { + // For non-client-streaming RPCs, we return nil instead of EOF on error + // because the generated code requires it. finish is not called; RecvMsg() + // will call it with the stream's status independently. + return nil + } + return io.EOF + } + if a.statsHandler != nil { + a.statsHandler.HandleRPC(cs.ctx, outPayload(true, m, data, payld, time.Now())) + } + if channelz.IsOn() { + a.t.IncrMsgSent() + } + return nil +} + +func (a *csAttempt) recvMsg(m interface{}, payInfo *payloadInfo) (err error) { + cs := a.cs + if a.statsHandler != nil && payInfo == nil { + payInfo = &payloadInfo{} + } + + if !a.decompSet { + // Block until we receive headers containing received message encoding. + if ct := a.s.RecvCompress(); ct != "" && ct != encoding.Identity { + if a.dc == nil || a.dc.Type() != ct { + // No configured decompressor, or it does not match the incoming + // message encoding; attempt to find a registered compressor that does. + a.dc = nil + a.decomp = encoding.GetCompressor(ct) + } + } else { + // No compression is used; disable our decompressor. + a.dc = nil + } + // Only initialize this state once per stream. + a.decompSet = true + } + err = recv(a.p, cs.codec, a.s, a.dc, m, *cs.callInfo.maxReceiveMessageSize, payInfo, a.decomp) + if err != nil { + if err == io.EOF { + if statusErr := a.s.Status().Err(); statusErr != nil { + return statusErr + } + return io.EOF // indicates successful end of stream. + } + return toRPCErr(err) + } + if a.trInfo != nil { + a.mu.Lock() + if a.trInfo.tr != nil { + a.trInfo.tr.LazyLog(&payload{sent: false, msg: m}, true) + } + a.mu.Unlock() + } + if a.statsHandler != nil { + a.statsHandler.HandleRPC(cs.ctx, &stats.InPayload{ + Client: true, + RecvTime: time.Now(), + Payload: m, + // TODO truncate large payload. + Data: payInfo.uncompressedBytes, + WireLength: payInfo.wireLength, + Length: len(payInfo.uncompressedBytes), + }) + } + if channelz.IsOn() { + a.t.IncrMsgRecv() + } + if cs.desc.ServerStreams { + // Subsequent messages should be received by subsequent RecvMsg calls. + return nil + } + // Special handling for non-server-stream rpcs. + // This recv expects EOF or errors, so we don't collect inPayload. + err = recv(a.p, cs.codec, a.s, a.dc, m, *cs.callInfo.maxReceiveMessageSize, nil, a.decomp) + if err == nil { + return toRPCErr(errors.New("grpc: client streaming protocol violation: get , want ")) + } + if err == io.EOF { + return a.s.Status().Err() // non-server streaming Recv returns nil on success + } + return toRPCErr(err) +} + +func (a *csAttempt) finish(err error) { + a.mu.Lock() + if a.finished { + a.mu.Unlock() + return + } + a.finished = true + if err == io.EOF { + // Ending a stream with EOF indicates a success. + err = nil + } + var tr metadata.MD + if a.s != nil { + a.t.CloseStream(a.s, err) + tr = a.s.Trailer() + } + + if a.done != nil { + br := false + if a.s != nil { + br = a.s.BytesReceived() + } + a.done(balancer.DoneInfo{ + Err: err, + Trailer: tr, + BytesSent: a.s != nil, + BytesReceived: br, + ServerLoad: balancerload.Parse(tr), + }) + } + if a.statsHandler != nil { + end := &stats.End{ + Client: true, + BeginTime: a.cs.beginTime, + EndTime: time.Now(), + Trailer: tr, + Error: err, + } + a.statsHandler.HandleRPC(a.cs.ctx, end) + } + if a.trInfo != nil && a.trInfo.tr != nil { + if err == nil { + a.trInfo.tr.LazyPrintf("RPC: [OK]") + } else { + a.trInfo.tr.LazyPrintf("RPC: [%v]", err) + a.trInfo.tr.SetError() + } + a.trInfo.tr.Finish() + a.trInfo.tr = nil + } + a.mu.Unlock() +} + +// newClientStream creates a ClientStream with the specified transport, on the +// given addrConn. +// +// It's expected that the given transport is either the same one in addrConn, or +// is already closed. To avoid race, transport is specified separately, instead +// of using ac.transpot. +// +// Main difference between this and ClientConn.NewStream: +// - no retry +// - no service config (or wait for service config) +// - no tracing or stats +func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method string, t transport.ClientTransport, ac *addrConn, opts ...CallOption) (_ ClientStream, err error) { + if t == nil { + // TODO: return RPC error here? + return nil, errors.New("transport provided is nil") + } + // defaultCallInfo contains unnecessary info(i.e. failfast, maxRetryRPCBufferSize), so we just initialize an empty struct. + c := &callInfo{} + + // Possible context leak: + // The cancel function for the child context we create will only be called + // when RecvMsg returns a non-nil error, if the ClientConn is closed, or if + // an error is generated by SendMsg. + // https://github.com/grpc/grpc-go/issues/1818. + ctx, cancel := context.WithCancel(ctx) + defer func() { + if err != nil { + cancel() + } + }() + + for _, o := range opts { + if err := o.before(c); err != nil { + return nil, toRPCErr(err) + } + } + c.maxReceiveMessageSize = getMaxSize(nil, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) + c.maxSendMessageSize = getMaxSize(nil, c.maxSendMessageSize, defaultServerMaxSendMessageSize) + if err := setCallInfoCodec(c); err != nil { + return nil, err + } + + callHdr := &transport.CallHdr{ + Host: ac.cc.authority, + Method: method, + ContentSubtype: c.contentSubtype, + } + + // Set our outgoing compression according to the UseCompressor CallOption, if + // set. In that case, also find the compressor from the encoding package. + // Otherwise, use the compressor configured by the WithCompressor DialOption, + // if set. + var cp Compressor + var comp encoding.Compressor + if ct := c.compressorType; ct != "" { + callHdr.SendCompress = ct + if ct != encoding.Identity { + comp = encoding.GetCompressor(ct) + if comp == nil { + return nil, status.Errorf(codes.Internal, "grpc: Compressor is not installed for requested grpc-encoding %q", ct) + } + } + } else if ac.cc.dopts.cp != nil { + callHdr.SendCompress = ac.cc.dopts.cp.Type() + cp = ac.cc.dopts.cp + } + if c.creds != nil { + callHdr.Creds = c.creds + } + + // Use a special addrConnStream to avoid retry. + as := &addrConnStream{ + callHdr: callHdr, + ac: ac, + ctx: ctx, + cancel: cancel, + opts: opts, + callInfo: c, + desc: desc, + codec: c.codec, + cp: cp, + comp: comp, + t: t, + } + + as.callInfo.stream = as + s, err := as.t.NewStream(as.ctx, as.callHdr) + if err != nil { + err = toRPCErr(err) + return nil, err + } + as.s = s + as.p = &parser{r: s} + ac.incrCallsStarted() + if desc != unaryStreamDesc { + // Listen on cc and stream contexts to cleanup when the user closes the + // ClientConn or cancels the stream context. In all other cases, an error + // should already be injected into the recv buffer by the transport, which + // the client will eventually receive, and then we will cancel the stream's + // context in clientStream.finish. + go func() { + select { + case <-ac.ctx.Done(): + as.finish(status.Error(codes.Canceled, "grpc: the SubConn is closing")) + case <-ctx.Done(): + as.finish(toRPCErr(ctx.Err())) + } + }() + } + return as, nil +} + +type addrConnStream struct { + s *transport.Stream + ac *addrConn + callHdr *transport.CallHdr + cancel context.CancelFunc + opts []CallOption + callInfo *callInfo + t transport.ClientTransport + ctx context.Context + sentLast bool + desc *StreamDesc + codec baseCodec + cp Compressor + comp encoding.Compressor + decompSet bool + dc Decompressor + decomp encoding.Compressor + p *parser + mu sync.Mutex + finished bool +} + +func (as *addrConnStream) Header() (metadata.MD, error) { + m, err := as.s.Header() + if err != nil { + as.finish(toRPCErr(err)) + } + return m, err +} + +func (as *addrConnStream) Trailer() metadata.MD { + return as.s.Trailer() +} + +func (as *addrConnStream) CloseSend() error { + if as.sentLast { + // TODO: return an error and finish the stream instead, due to API misuse? + return nil + } + as.sentLast = true + + as.t.Write(as.s, nil, nil, &transport.Options{Last: true}) + // Always return nil; io.EOF is the only error that might make sense + // instead, but there is no need to signal the client to call RecvMsg + // as the only use left for the stream after CloseSend is to call + // RecvMsg. This also matches historical behavior. + return nil +} + +func (as *addrConnStream) Context() context.Context { + return as.s.Context() +} + +func (as *addrConnStream) SendMsg(m interface{}) (err error) { + defer func() { + if err != nil && err != io.EOF { + // Call finish on the client stream for errors generated by this SendMsg + // call, as these indicate problems created by this client. (Transport + // errors are converted to an io.EOF error in csAttempt.sendMsg; the real + // error will be returned from RecvMsg eventually in that case, or be + // retried.) + as.finish(err) + } + }() + if as.sentLast { + return status.Errorf(codes.Internal, "SendMsg called after CloseSend") + } + if !as.desc.ClientStreams { + as.sentLast = true + } + + // load hdr, payload, data + hdr, payld, _, err := prepareMsg(m, as.codec, as.cp, as.comp) + if err != nil { + return err + } + + // TODO(dfawley): should we be checking len(data) instead? + if len(payld) > *as.callInfo.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(payld), *as.callInfo.maxSendMessageSize) + } + + if err := as.t.Write(as.s, hdr, payld, &transport.Options{Last: !as.desc.ClientStreams}); err != nil { + if !as.desc.ClientStreams { + // For non-client-streaming RPCs, we return nil instead of EOF on error + // because the generated code requires it. finish is not called; RecvMsg() + // will call it with the stream's status independently. + return nil + } + return io.EOF + } + + if channelz.IsOn() { + as.t.IncrMsgSent() + } + return nil +} + +func (as *addrConnStream) RecvMsg(m interface{}) (err error) { + defer func() { + if err != nil || !as.desc.ServerStreams { + // err != nil or non-server-streaming indicates end of stream. + as.finish(err) + } + }() + + if !as.decompSet { + // Block until we receive headers containing received message encoding. + if ct := as.s.RecvCompress(); ct != "" && ct != encoding.Identity { + if as.dc == nil || as.dc.Type() != ct { + // No configured decompressor, or it does not match the incoming + // message encoding; attempt to find a registered compressor that does. + as.dc = nil + as.decomp = encoding.GetCompressor(ct) + } + } else { + // No compression is used; disable our decompressor. + as.dc = nil + } + // Only initialize this state once per stream. + as.decompSet = true + } + err = recv(as.p, as.codec, as.s, as.dc, m, *as.callInfo.maxReceiveMessageSize, nil, as.decomp) + if err != nil { + if err == io.EOF { + if statusErr := as.s.Status().Err(); statusErr != nil { + return statusErr + } + return io.EOF // indicates successful end of stream. + } + return toRPCErr(err) + } + + if channelz.IsOn() { + as.t.IncrMsgRecv() + } + if as.desc.ServerStreams { + // Subsequent messages should be received by subsequent RecvMsg calls. + return nil + } + + // Special handling for non-server-stream rpcs. + // This recv expects EOF or errors, so we don't collect inPayload. + err = recv(as.p, as.codec, as.s, as.dc, m, *as.callInfo.maxReceiveMessageSize, nil, as.decomp) + if err == nil { + return toRPCErr(errors.New("grpc: client streaming protocol violation: get , want ")) + } + if err == io.EOF { + return as.s.Status().Err() // non-server streaming Recv returns nil on success + } + return toRPCErr(err) +} + +func (as *addrConnStream) finish(err error) { + as.mu.Lock() + if as.finished { + as.mu.Unlock() + return + } + as.finished = true + if err == io.EOF { + // Ending a stream with EOF indicates a success. + err = nil + } + if as.s != nil { + as.t.CloseStream(as.s, err) + } + + if err != nil { + as.ac.incrCallsFailed() + } else { + as.ac.incrCallsSucceeded() + } + as.cancel() + as.mu.Unlock() +} + +// ServerStream defines the server-side behavior of a streaming RPC. +// +// All errors returned from ServerStream methods are compatible with the +// status package. +type ServerStream interface { + // SetHeader sets the header metadata. It may be called multiple times. + // When call multiple times, all the provided metadata will be merged. + // All the metadata will be sent out when one of the following happens: + // - ServerStream.SendHeader() is called; + // - The first response is sent out; + // - An RPC status is sent out (error or success). + SetHeader(metadata.MD) error + // SendHeader sends the header metadata. + // The provided md and headers set by SetHeader() will be sent. + // It fails if called multiple times. + SendHeader(metadata.MD) error + // SetTrailer sets the trailer metadata which will be sent with the RPC status. + // When called more than once, all the provided metadata will be merged. + SetTrailer(metadata.MD) + // Context returns the context for this stream. + Context() context.Context + // SendMsg sends a message. On error, SendMsg aborts the stream and the + // error is returned directly. + // + // SendMsg blocks until: + // - There is sufficient flow control to schedule m with the transport, or + // - The stream is done, or + // - The stream breaks. + // + // SendMsg does not wait until the message is received by the client. An + // untimely stream closure may result in lost messages. + // + // It is safe to have a goroutine calling SendMsg and another goroutine + // calling RecvMsg on the same stream at the same time, but it is not safe + // to call SendMsg on the same stream in different goroutines. + SendMsg(m interface{}) error + // RecvMsg blocks until it receives a message into m or the stream is + // done. It returns io.EOF when the client has performed a CloseSend. On + // any non-EOF error, the stream is aborted and the error contains the + // RPC status. + // + // It is safe to have a goroutine calling SendMsg and another goroutine + // calling RecvMsg on the same stream at the same time, but it is not + // safe to call RecvMsg on the same stream in different goroutines. + RecvMsg(m interface{}) error +} + +// serverStream implements a server side Stream. +type serverStream struct { + ctx context.Context + t transport.ServerTransport + s *transport.Stream + p *parser + codec baseCodec + + cp Compressor + dc Decompressor + comp encoding.Compressor + decomp encoding.Compressor + + maxReceiveMessageSize int + maxSendMessageSize int + trInfo *traceInfo + + statsHandler stats.Handler + + binlog *binarylog.MethodLogger + // serverHeaderBinlogged indicates whether server header has been logged. It + // will happen when one of the following two happens: stream.SendHeader(), + // stream.Send(). + // + // It's only checked in send and sendHeader, doesn't need to be + // synchronized. + serverHeaderBinlogged bool + + mu sync.Mutex // protects trInfo.tr after the service handler runs. +} + +func (ss *serverStream) Context() context.Context { + return ss.ctx +} + +func (ss *serverStream) SetHeader(md metadata.MD) error { + if md.Len() == 0 { + return nil + } + return ss.s.SetHeader(md) +} + +func (ss *serverStream) SendHeader(md metadata.MD) error { + err := ss.t.WriteHeader(ss.s, md) + if ss.binlog != nil && !ss.serverHeaderBinlogged { + h, _ := ss.s.Header() + ss.binlog.Log(&binarylog.ServerHeader{ + Header: h, + }) + ss.serverHeaderBinlogged = true + } + return err +} + +func (ss *serverStream) SetTrailer(md metadata.MD) { + if md.Len() == 0 { + return + } + ss.s.SetTrailer(md) +} + +func (ss *serverStream) SendMsg(m interface{}) (err error) { + defer func() { + if ss.trInfo != nil { + ss.mu.Lock() + if ss.trInfo.tr != nil { + if err == nil { + ss.trInfo.tr.LazyLog(&payload{sent: true, msg: m}, true) + } else { + ss.trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) + ss.trInfo.tr.SetError() + } + } + ss.mu.Unlock() + } + if err != nil && err != io.EOF { + st, _ := status.FromError(toRPCErr(err)) + ss.t.WriteStatus(ss.s, st) + // Non-user specified status was sent out. This should be an error + // case (as a server side Cancel maybe). + // + // This is not handled specifically now. User will return a final + // status from the service handler, we will log that error instead. + // This behavior is similar to an interceptor. + } + if channelz.IsOn() && err == nil { + ss.t.IncrMsgSent() + } + }() + + // load hdr, payload, data + hdr, payload, data, err := prepareMsg(m, ss.codec, ss.cp, ss.comp) + if err != nil { + return err + } + + // TODO(dfawley): should we be checking len(data) instead? + if len(payload) > ss.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(payload), ss.maxSendMessageSize) + } + if err := ss.t.Write(ss.s, hdr, payload, &transport.Options{Last: false}); err != nil { + return toRPCErr(err) + } + if ss.binlog != nil { + if !ss.serverHeaderBinlogged { + h, _ := ss.s.Header() + ss.binlog.Log(&binarylog.ServerHeader{ + Header: h, + }) + ss.serverHeaderBinlogged = true + } + ss.binlog.Log(&binarylog.ServerMessage{ + Message: data, + }) + } + if ss.statsHandler != nil { + ss.statsHandler.HandleRPC(ss.s.Context(), outPayload(false, m, data, payload, time.Now())) + } + return nil +} + +func (ss *serverStream) RecvMsg(m interface{}) (err error) { + defer func() { + if ss.trInfo != nil { + ss.mu.Lock() + if ss.trInfo.tr != nil { + if err == nil { + ss.trInfo.tr.LazyLog(&payload{sent: false, msg: m}, true) + } else if err != io.EOF { + ss.trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) + ss.trInfo.tr.SetError() + } + } + ss.mu.Unlock() + } + if err != nil && err != io.EOF { + st, _ := status.FromError(toRPCErr(err)) + ss.t.WriteStatus(ss.s, st) + // Non-user specified status was sent out. This should be an error + // case (as a server side Cancel maybe). + // + // This is not handled specifically now. User will return a final + // status from the service handler, we will log that error instead. + // This behavior is similar to an interceptor. + } + if channelz.IsOn() && err == nil { + ss.t.IncrMsgRecv() + } + }() + var payInfo *payloadInfo + if ss.statsHandler != nil || ss.binlog != nil { + payInfo = &payloadInfo{} + } + if err := recv(ss.p, ss.codec, ss.s, ss.dc, m, ss.maxReceiveMessageSize, payInfo, ss.decomp); err != nil { + if err == io.EOF { + if ss.binlog != nil { + ss.binlog.Log(&binarylog.ClientHalfClose{}) + } + return err + } + if err == io.ErrUnexpectedEOF { + err = status.Errorf(codes.Internal, io.ErrUnexpectedEOF.Error()) + } + return toRPCErr(err) + } + if ss.statsHandler != nil { + ss.statsHandler.HandleRPC(ss.s.Context(), &stats.InPayload{ + RecvTime: time.Now(), + Payload: m, + // TODO truncate large payload. + Data: payInfo.uncompressedBytes, + WireLength: payInfo.wireLength, + Length: len(payInfo.uncompressedBytes), + }) + } + if ss.binlog != nil { + ss.binlog.Log(&binarylog.ClientMessage{ + Message: payInfo.uncompressedBytes, + }) + } + return nil +} + +// MethodFromServerStream returns the method string for the input stream. +// The returned string is in the format of "/service/method". +func MethodFromServerStream(stream ServerStream) (string, bool) { + return Method(stream.Context()) +} + +// prepareMsg returns the hdr, payload and data +// using the compressors passed or using the +// passed preparedmsg +func prepareMsg(m interface{}, codec baseCodec, cp Compressor, comp encoding.Compressor) (hdr, payload, data []byte, err error) { + if preparedMsg, ok := m.(*PreparedMsg); ok { + return preparedMsg.hdr, preparedMsg.payload, preparedMsg.encodedData, nil + } + // The input interface is not a prepared msg. + // Marshal and Compress the data at this point + data, err = encode(codec, m) + if err != nil { + return nil, nil, nil, err + } + compData, err := compress(data, cp, comp) + if err != nil { + return nil, nil, nil, err + } + hdr, payload = msgHeader(data, compData) + return hdr, payload, data, nil +} diff --git a/vendor/google.golang.org/grpc/tap/tap.go b/vendor/google.golang.org/grpc/tap/tap.go new file mode 100644 index 00000000..584360f6 --- /dev/null +++ b/vendor/google.golang.org/grpc/tap/tap.go @@ -0,0 +1,51 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package tap defines the function handles which are executed on the transport +// layer of gRPC-Go and related information. Everything here is EXPERIMENTAL. +package tap + +import ( + "context" +) + +// Info defines the relevant information needed by the handles. +type Info struct { + // FullMethodName is the string of grpc method (in the format of + // /package.service/method). + FullMethodName string + // TODO: More to be added. +} + +// ServerInHandle defines the function which runs before a new stream is created +// on the server side. If it returns a non-nil error, the stream will not be +// created and a RST_STREAM will be sent back to the client with REFUSED_STREAM. +// The client will receive an RPC error "code = Unavailable, desc = stream +// terminated by RST_STREAM with error code: REFUSED_STREAM". +// +// It's intended to be used in situations where you don't want to waste the +// resources to accept the new stream (e.g. rate-limiting). And the content of +// the error will be ignored and won't be sent back to the client. For other +// general usages, please use interceptors. +// +// Note that it is executed in the per-connection I/O goroutine(s) instead of +// per-RPC goroutine. Therefore, users should NOT have any +// blocking/time-consuming work in this handle. Otherwise all the RPCs would +// slow down. Also, for the same reason, this handle won't be called +// concurrently by gRPC. +type ServerInHandle func(ctx context.Context, info *Info) (context.Context, error) diff --git a/vendor/google.golang.org/grpc/trace.go b/vendor/google.golang.org/grpc/trace.go new file mode 100644 index 00000000..07a2d26b --- /dev/null +++ b/vendor/google.golang.org/grpc/trace.go @@ -0,0 +1,123 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "bytes" + "fmt" + "io" + "net" + "strings" + "sync" + "time" + + "golang.org/x/net/trace" +) + +// EnableTracing controls whether to trace RPCs using the golang.org/x/net/trace package. +// This should only be set before any RPCs are sent or received by this program. +var EnableTracing bool + +// methodFamily returns the trace family for the given method. +// It turns "/pkg.Service/GetFoo" into "pkg.Service". +func methodFamily(m string) string { + m = strings.TrimPrefix(m, "/") // remove leading slash + if i := strings.Index(m, "/"); i >= 0 { + m = m[:i] // remove everything from second slash + } + return m +} + +// traceInfo contains tracing information for an RPC. +type traceInfo struct { + tr trace.Trace + firstLine firstLine +} + +// firstLine is the first line of an RPC trace. +// It may be mutated after construction; remoteAddr specifically may change +// during client-side use. +type firstLine struct { + mu sync.Mutex + client bool // whether this is a client (outgoing) RPC + remoteAddr net.Addr + deadline time.Duration // may be zero +} + +func (f *firstLine) SetRemoteAddr(addr net.Addr) { + f.mu.Lock() + f.remoteAddr = addr + f.mu.Unlock() +} + +func (f *firstLine) String() string { + f.mu.Lock() + defer f.mu.Unlock() + + var line bytes.Buffer + io.WriteString(&line, "RPC: ") + if f.client { + io.WriteString(&line, "to") + } else { + io.WriteString(&line, "from") + } + fmt.Fprintf(&line, " %v deadline:", f.remoteAddr) + if f.deadline != 0 { + fmt.Fprint(&line, f.deadline) + } else { + io.WriteString(&line, "none") + } + return line.String() +} + +const truncateSize = 100 + +func truncate(x string, l int) string { + if l > len(x) { + return x + } + return x[:l] +} + +// payload represents an RPC request or response payload. +type payload struct { + sent bool // whether this is an outgoing payload + msg interface{} // e.g. a proto.Message + // TODO(dsymonds): add stringifying info to codec, and limit how much we hold here? +} + +func (p payload) String() string { + if p.sent { + return truncate(fmt.Sprintf("sent: %v", p.msg), truncateSize) + } + return truncate(fmt.Sprintf("recv: %v", p.msg), truncateSize) +} + +type fmtStringer struct { + format string + a []interface{} +} + +func (f *fmtStringer) String() string { + return fmt.Sprintf(f.format, f.a...) +} + +type stringer string + +func (s stringer) String() string { return string(s) } diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go new file mode 100644 index 00000000..ca5d55fd --- /dev/null +++ b/vendor/google.golang.org/grpc/version.go @@ -0,0 +1,22 @@ +/* + * + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +// Version is the current grpc version. +const Version = "1.29.1" diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh new file mode 100644 index 00000000..e12024fb --- /dev/null +++ b/vendor/google.golang.org/grpc/vet.sh @@ -0,0 +1,163 @@ +#!/bin/bash + +set -ex # Exit on error; debugging enabled. +set -o pipefail # Fail a pipe if any sub-command fails. + +# not makes sure the command passed to it does not exit with a return code of 0. +not() { + # This is required instead of the earlier (! $COMMAND) because subshells and + # pipefail don't work the same on Darwin as in Linux. + ! "$@" +} + +die() { + echo "$@" >&2 + exit 1 +} + +fail_on_output() { + tee /dev/stderr | not read +} + +# Check to make sure it's safe to modify the user's git repo. +git status --porcelain | fail_on_output + +# Undo any edits made by this script. +cleanup() { + git reset --hard HEAD +} +trap cleanup EXIT + +PATH="${GOPATH}/bin:${GOROOT}/bin:${PATH}" + +if [[ "$1" = "-install" ]]; then + # Check for module support + if go help mod >& /dev/null; then + # Install the pinned versions as defined in module tools. + pushd ./test/tools + go install \ + golang.org/x/lint/golint \ + golang.org/x/tools/cmd/goimports \ + honnef.co/go/tools/cmd/staticcheck \ + github.com/client9/misspell/cmd/misspell \ + github.com/golang/protobuf/protoc-gen-go + popd + else + # Ye olde `go get` incantation. + # Note: this gets the latest version of all tools (vs. the pinned versions + # with Go modules). + go get -u \ + golang.org/x/lint/golint \ + golang.org/x/tools/cmd/goimports \ + honnef.co/go/tools/cmd/staticcheck \ + github.com/client9/misspell/cmd/misspell \ + github.com/golang/protobuf/protoc-gen-go + fi + if [[ -z "${VET_SKIP_PROTO}" ]]; then + if [[ "${TRAVIS}" = "true" ]]; then + PROTOBUF_VERSION=3.3.0 + PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip + pushd /home/travis + wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} + unzip ${PROTOC_FILENAME} + bin/protoc --version + popd + elif not which protoc > /dev/null; then + die "Please install protoc into your path" + fi + fi + exit 0 +elif [[ "$#" -ne 0 ]]; then + die "Unknown argument(s): $*" +fi + +# - Ensure all source files contain a copyright message. +not git grep -L "\(Copyright [0-9]\{4,\} gRPC authors\)\|DO NOT EDIT" -- '*.go' + +# - Make sure all tests in grpc and grpc/test use leakcheck via Teardown. +not grep 'func Test[^(]' *_test.go +not grep 'func Test[^(]' test/*.go + +# - Do not import x/net/context. +not git grep -l 'x/net/context' -- "*.go" + +# - Do not import math/rand for real library code. Use internal/grpcrand for +# thread safety. +git grep -l '"math/rand"' -- "*.go" 2>&1 | not grep -v '^examples\|^stress\|grpcrand\|^benchmark\|wrr_test' + +# - Ensure all ptypes proto packages are renamed when importing. +not git grep "\(import \|^\s*\)\"github.com/golang/protobuf/ptypes/" -- "*.go" + +# - Check imports that are illegal in appengine (until Go 1.11). +# TODO: Remove when we drop Go 1.10 support +go list -f {{.Dir}} ./... | xargs go run test/go_vet/vet.go + +# - gofmt, goimports, golint (with exceptions for generated code), go vet. +gofmt -s -d -l . 2>&1 | fail_on_output +goimports -l . 2>&1 | not grep -vE "(_mock|\.pb)\.go" +golint ./... 2>&1 | not grep -vE "(_mock|\.pb)\.go:" +go vet -all ./... + +misspell -error . + +# - Check that generated proto files are up to date. +if [[ -z "${VET_SKIP_PROTO}" ]]; then + PATH="/home/travis/bin:${PATH}" make proto && \ + git status --porcelain 2>&1 | fail_on_output || \ + (git status; git --no-pager diff; exit 1) +fi + +# - Check that our module is tidy. +if go help mod >& /dev/null; then + go mod tidy && \ + git status --porcelain 2>&1 | fail_on_output || \ + (git status; git --no-pager diff; exit 1) +fi + +# - Collection of static analysis checks +# +# TODO(dfawley): don't use deprecated functions in examples or first-party +# plugins. +SC_OUT="$(mktemp)" +staticcheck -go 1.9 -checks 'inherit,-ST1015' ./... > "${SC_OUT}" || true +# Error if anything other than deprecation warnings are printed. +not grep -v "is deprecated:.*SA1019" "${SC_OUT}" +# Only ignore the following deprecated types/fields/functions. +not grep -Fv '.HandleResolvedAddrs +.HandleSubConnStateChange +.HeaderMap +.NewAddress +.NewServiceConfig +.Metadata is deprecated: use Attributes +.Type is deprecated: use Attributes +.UpdateBalancerState +balancer.Picker +grpc.CallCustomCodec +grpc.Code +grpc.Compressor +grpc.Decompressor +grpc.MaxMsgSize +grpc.MethodConfig +grpc.NewGZIPCompressor +grpc.NewGZIPDecompressor +grpc.RPCCompressor +grpc.RPCDecompressor +grpc.RoundRobin +grpc.ServiceConfig +grpc.WithBalancer +grpc.WithBalancerName +grpc.WithCompressor +grpc.WithDecompressor +grpc.WithDialer +grpc.WithMaxMsgSize +grpc.WithServiceConfig +grpc.WithTimeout +http.CloseNotifier +info.SecurityVersion +naming.Resolver +naming.Update +naming.Watcher +resolver.Backend +resolver.GRPCLB' "${SC_OUT}" + +echo SUCCESS diff --git a/vendor/gopkg.in/ini.v1/ini.go b/vendor/gopkg.in/ini.v1/ini.go index 945fc00c..428b71e3 100644 --- a/vendor/gopkg.in/ini.v1/ini.go +++ b/vendor/gopkg.in/ini.v1/ini.go @@ -29,7 +29,7 @@ const ( // Maximum allowed depth when recursively substituing variable names. depthValues = 99 - version = "1.51.0" + version = "1.51.1" ) // Version returns current package version literal. diff --git a/vendor/gopkg.in/ini.v1/struct.go b/vendor/gopkg.in/ini.v1/struct.go index 6bc70e4d..d1cd2722 100644 --- a/vendor/gopkg.in/ini.v1/struct.go +++ b/vendor/gopkg.in/ini.v1/struct.go @@ -183,6 +183,10 @@ func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim stri if vt.Name() == "Duration" { durationVal, err := key.Duration() if err != nil { + if intVal, err := key.Int64(); err == nil { + field.SetInt(intVal) + return nil + } return wrapStrictError(err, isStrict) } if isPtr { diff --git a/vendor/gopkg.in/yaml.v3/.travis.yml b/vendor/gopkg.in/yaml.v3/.travis.yml deleted file mode 100644 index 04d4dae0..00000000 --- a/vendor/gopkg.in/yaml.v3/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -language: go - -go: - - "1.4.x" - - "1.5.x" - - "1.6.x" - - "1.7.x" - - "1.8.x" - - "1.9.x" - - "1.10.x" - - "1.11.x" - - "1.12.x" - - "1.13.x" - - "tip" - -go_import_path: gopkg.in/yaml.v3 diff --git a/vendor/gopkg.in/yaml.v3/LICENSE b/vendor/gopkg.in/yaml.v3/LICENSE deleted file mode 100644 index 2683e4bb..00000000 --- a/vendor/gopkg.in/yaml.v3/LICENSE +++ /dev/null @@ -1,50 +0,0 @@ - -This project is covered by two different licenses: MIT and Apache. - -#### MIT License #### - -The following files were ported to Go from C files of libyaml, and thus -are still covered by their original MIT license, with the additional -copyright staring in 2011 when the project was ported over: - - apic.go emitterc.go parserc.go readerc.go scannerc.go - writerc.go yamlh.go yamlprivateh.go - -Copyright (c) 2006-2010 Kirill Simonov -Copyright (c) 2006-2011 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 -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. - -### Apache License ### - -All the remaining project files are covered by the Apache license: - -Copyright (c) 2011-2019 Canonical Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/gopkg.in/yaml.v3/README.md b/vendor/gopkg.in/yaml.v3/README.md deleted file mode 100644 index 08eb1bab..00000000 --- a/vendor/gopkg.in/yaml.v3/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# YAML support for the Go language - -Introduction ------------- - -The yaml package enables Go programs to comfortably encode and decode YAML -values. It was developed within [Canonical](https://www.canonical.com) as -part of the [juju](https://juju.ubuntu.com) project, and is based on a -pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML) -C library to parse and generate YAML data quickly and reliably. - -Compatibility -------------- - -The yaml package supports most of YAML 1.2, but preserves some behavior -from 1.1 for backwards compatibility. - -Specifically, as of v3 of the yaml package: - - - YAML 1.1 bools (_yes/no, on/off_) are supported as long as they are being - decoded into a typed bool value. Otherwise they behave as a string. Booleans - in YAML 1.2 are _true/false_ only. - - Octals encode and decode as _0777_ per YAML 1.1, rather than _0o777_ - as specified in YAML 1.2, because most parsers still use the old format. - Octals in the _0o777_ format are supported though, so new files work. - - Does not support base-60 floats. These are gone from YAML 1.2, and were - actually never supported by this package as it's clearly a poor choice. - -and offers backwards -compatibility with YAML 1.1 in some cases. -1.2, including support for -anchors, tags, map merging, etc. Multi-document unmarshalling is not yet -implemented, and base-60 floats from YAML 1.1 are purposefully not -supported since they're a poor design and are gone in YAML 1.2. - -Installation and usage ----------------------- - -The import path for the package is *gopkg.in/yaml.v3*. - -To install it, run: - - go get gopkg.in/yaml.v3 - -API documentation ------------------ - -If opened in a browser, the import path itself leads to the API documentation: - - - [https://gopkg.in/yaml.v3](https://gopkg.in/yaml.v3) - -API stability -------------- - -The package API for yaml v3 will remain stable as described in [gopkg.in](https://gopkg.in). - - -License -------- - -The yaml package is licensed under the MIT and Apache License 2.0 licenses. -Please see the LICENSE file for details. - - -Example -------- - -```Go -package main - -import ( - "fmt" - "log" - - "gopkg.in/yaml.v3" -) - -var data = ` -a: Easy! -b: - c: 2 - d: [3, 4] -` - -// Note: struct fields must be public in order for unmarshal to -// correctly populate the data. -type T struct { - A string - B struct { - RenamedC int `yaml:"c"` - D []int `yaml:",flow"` - } -} - -func main() { - t := T{} - - err := yaml.Unmarshal([]byte(data), &t) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- t:\n%v\n\n", t) - - d, err := yaml.Marshal(&t) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- t dump:\n%s\n\n", string(d)) - - m := make(map[interface{}]interface{}) - - err = yaml.Unmarshal([]byte(data), &m) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- m:\n%v\n\n", m) - - d, err = yaml.Marshal(&m) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- m dump:\n%s\n\n", string(d)) -} -``` - -This example will generate the following output: - -``` ---- t: -{Easy! {2 [3 4]}} - ---- t dump: -a: Easy! -b: - c: 2 - d: [3, 4] - - ---- m: -map[a:Easy! b:map[c:2 d:[3 4]]] - ---- m dump: -a: Easy! -b: - c: 2 - d: - - 3 - - 4 -``` - diff --git a/vendor/gopkg.in/yaml.v3/apic.go b/vendor/gopkg.in/yaml.v3/apic.go deleted file mode 100644 index 65846e67..00000000 --- a/vendor/gopkg.in/yaml.v3/apic.go +++ /dev/null @@ -1,746 +0,0 @@ -// -// 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 -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "io" -) - -func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { - //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) - - // Check if we can move the queue at the beginning of the buffer. - if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { - if parser.tokens_head != len(parser.tokens) { - copy(parser.tokens, parser.tokens[parser.tokens_head:]) - } - parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] - parser.tokens_head = 0 - } - parser.tokens = append(parser.tokens, *token) - if pos < 0 { - return - } - copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) - parser.tokens[parser.tokens_head+pos] = *token -} - -// Create a new parser object. -func yaml_parser_initialize(parser *yaml_parser_t) bool { - *parser = yaml_parser_t{ - raw_buffer: make([]byte, 0, input_raw_buffer_size), - buffer: make([]byte, 0, input_buffer_size), - } - return true -} - -// Destroy a parser object. -func yaml_parser_delete(parser *yaml_parser_t) { - *parser = yaml_parser_t{} -} - -// String read handler. -func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { - if parser.input_pos == len(parser.input) { - return 0, io.EOF - } - n = copy(buffer, parser.input[parser.input_pos:]) - parser.input_pos += n - return n, nil -} - -// Reader read handler. -func yaml_reader_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { - return parser.input_reader.Read(buffer) -} - -// Set a string input. -func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { - if parser.read_handler != nil { - panic("must set the input source only once") - } - parser.read_handler = yaml_string_read_handler - parser.input = input - parser.input_pos = 0 -} - -// Set a file input. -func yaml_parser_set_input_reader(parser *yaml_parser_t, r io.Reader) { - if parser.read_handler != nil { - panic("must set the input source only once") - } - parser.read_handler = yaml_reader_read_handler - parser.input_reader = r -} - -// Set the source encoding. -func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { - if parser.encoding != yaml_ANY_ENCODING { - panic("must set the encoding only once") - } - parser.encoding = encoding -} - -// Create a new emitter object. -func yaml_emitter_initialize(emitter *yaml_emitter_t) { - *emitter = yaml_emitter_t{ - buffer: make([]byte, output_buffer_size), - raw_buffer: make([]byte, 0, output_raw_buffer_size), - states: make([]yaml_emitter_state_t, 0, initial_stack_size), - events: make([]yaml_event_t, 0, initial_queue_size), - } -} - -// Destroy an emitter object. -func yaml_emitter_delete(emitter *yaml_emitter_t) { - *emitter = yaml_emitter_t{} -} - -// String write handler. -func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { - *emitter.output_buffer = append(*emitter.output_buffer, buffer...) - return nil -} - -// yaml_writer_write_handler uses emitter.output_writer to write the -// emitted text. -func yaml_writer_write_handler(emitter *yaml_emitter_t, buffer []byte) error { - _, err := emitter.output_writer.Write(buffer) - return err -} - -// Set a string output. -func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { - if emitter.write_handler != nil { - panic("must set the output target only once") - } - emitter.write_handler = yaml_string_write_handler - emitter.output_buffer = output_buffer -} - -// Set a file output. -func yaml_emitter_set_output_writer(emitter *yaml_emitter_t, w io.Writer) { - if emitter.write_handler != nil { - panic("must set the output target only once") - } - emitter.write_handler = yaml_writer_write_handler - emitter.output_writer = w -} - -// Set the output encoding. -func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { - if emitter.encoding != yaml_ANY_ENCODING { - panic("must set the output encoding only once") - } - emitter.encoding = encoding -} - -// Set the canonical output style. -func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { - emitter.canonical = canonical -} - -// Set the indentation increment. -func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { - if indent < 2 || indent > 9 { - indent = 2 - } - emitter.best_indent = indent -} - -// Set the preferred line width. -func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { - if width < 0 { - width = -1 - } - emitter.best_width = width -} - -// Set if unescaped non-ASCII characters are allowed. -func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { - emitter.unicode = unicode -} - -// Set the preferred line break character. -func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { - emitter.line_break = line_break -} - -///* -// * Destroy a token object. -// */ -// -//YAML_DECLARE(void) -//yaml_token_delete(yaml_token_t *token) -//{ -// assert(token); // Non-NULL token object expected. -// -// switch (token.type) -// { -// case YAML_TAG_DIRECTIVE_TOKEN: -// yaml_free(token.data.tag_directive.handle); -// yaml_free(token.data.tag_directive.prefix); -// break; -// -// case YAML_ALIAS_TOKEN: -// yaml_free(token.data.alias.value); -// break; -// -// case YAML_ANCHOR_TOKEN: -// yaml_free(token.data.anchor.value); -// break; -// -// case YAML_TAG_TOKEN: -// yaml_free(token.data.tag.handle); -// yaml_free(token.data.tag.suffix); -// break; -// -// case YAML_SCALAR_TOKEN: -// yaml_free(token.data.scalar.value); -// break; -// -// default: -// break; -// } -// -// memset(token, 0, sizeof(yaml_token_t)); -//} -// -///* -// * Check if a string is a valid UTF-8 sequence. -// * -// * Check 'reader.c' for more details on UTF-8 encoding. -// */ -// -//static int -//yaml_check_utf8(yaml_char_t *start, size_t length) -//{ -// yaml_char_t *end = start+length; -// yaml_char_t *pointer = start; -// -// while (pointer < end) { -// unsigned char octet; -// unsigned int width; -// unsigned int value; -// size_t k; -// -// octet = pointer[0]; -// width = (octet & 0x80) == 0x00 ? 1 : -// (octet & 0xE0) == 0xC0 ? 2 : -// (octet & 0xF0) == 0xE0 ? 3 : -// (octet & 0xF8) == 0xF0 ? 4 : 0; -// value = (octet & 0x80) == 0x00 ? octet & 0x7F : -// (octet & 0xE0) == 0xC0 ? octet & 0x1F : -// (octet & 0xF0) == 0xE0 ? octet & 0x0F : -// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; -// if (!width) return 0; -// if (pointer+width > end) return 0; -// for (k = 1; k < width; k ++) { -// octet = pointer[k]; -// if ((octet & 0xC0) != 0x80) return 0; -// value = (value << 6) + (octet & 0x3F); -// } -// if (!((width == 1) || -// (width == 2 && value >= 0x80) || -// (width == 3 && value >= 0x800) || -// (width == 4 && value >= 0x10000))) return 0; -// -// pointer += width; -// } -// -// return 1; -//} -// - -// Create STREAM-START. -func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) { - *event = yaml_event_t{ - typ: yaml_STREAM_START_EVENT, - encoding: encoding, - } -} - -// Create STREAM-END. -func yaml_stream_end_event_initialize(event *yaml_event_t) { - *event = yaml_event_t{ - typ: yaml_STREAM_END_EVENT, - } -} - -// Create DOCUMENT-START. -func yaml_document_start_event_initialize( - event *yaml_event_t, - version_directive *yaml_version_directive_t, - tag_directives []yaml_tag_directive_t, - implicit bool, -) { - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - version_directive: version_directive, - tag_directives: tag_directives, - implicit: implicit, - } -} - -// Create DOCUMENT-END. -func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) { - *event = yaml_event_t{ - typ: yaml_DOCUMENT_END_EVENT, - implicit: implicit, - } -} - -// Create ALIAS. -func yaml_alias_event_initialize(event *yaml_event_t, anchor []byte) bool { - *event = yaml_event_t{ - typ: yaml_ALIAS_EVENT, - anchor: anchor, - } - return true -} - -// Create SCALAR. -func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - anchor: anchor, - tag: tag, - value: value, - implicit: plain_implicit, - quoted_implicit: quoted_implicit, - style: yaml_style_t(style), - } - return true -} - -// Create SEQUENCE-START. -func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(style), - } - return true -} - -// Create SEQUENCE-END. -func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - } - return true -} - -// Create MAPPING-START. -func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) { - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(style), - } -} - -// Create MAPPING-END. -func yaml_mapping_end_event_initialize(event *yaml_event_t) { - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - } -} - -// Destroy an event object. -func yaml_event_delete(event *yaml_event_t) { - *event = yaml_event_t{} -} - -///* -// * Create a document object. -// */ -// -//YAML_DECLARE(int) -//yaml_document_initialize(document *yaml_document_t, -// version_directive *yaml_version_directive_t, -// tag_directives_start *yaml_tag_directive_t, -// tag_directives_end *yaml_tag_directive_t, -// start_implicit int, end_implicit int) -//{ -// struct { -// error yaml_error_type_t -// } context -// struct { -// start *yaml_node_t -// end *yaml_node_t -// top *yaml_node_t -// } nodes = { NULL, NULL, NULL } -// version_directive_copy *yaml_version_directive_t = NULL -// struct { -// start *yaml_tag_directive_t -// end *yaml_tag_directive_t -// top *yaml_tag_directive_t -// } tag_directives_copy = { NULL, NULL, NULL } -// value yaml_tag_directive_t = { NULL, NULL } -// mark yaml_mark_t = { 0, 0, 0 } -// -// assert(document) // Non-NULL document object is expected. -// assert((tag_directives_start && tag_directives_end) || -// (tag_directives_start == tag_directives_end)) -// // Valid tag directives are expected. -// -// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error -// -// if (version_directive) { -// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) -// if (!version_directive_copy) goto error -// version_directive_copy.major = version_directive.major -// version_directive_copy.minor = version_directive.minor -// } -// -// if (tag_directives_start != tag_directives_end) { -// tag_directive *yaml_tag_directive_t -// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) -// goto error -// for (tag_directive = tag_directives_start -// tag_directive != tag_directives_end; tag_directive ++) { -// assert(tag_directive.handle) -// assert(tag_directive.prefix) -// if (!yaml_check_utf8(tag_directive.handle, -// strlen((char *)tag_directive.handle))) -// goto error -// if (!yaml_check_utf8(tag_directive.prefix, -// strlen((char *)tag_directive.prefix))) -// goto error -// value.handle = yaml_strdup(tag_directive.handle) -// value.prefix = yaml_strdup(tag_directive.prefix) -// if (!value.handle || !value.prefix) goto error -// if (!PUSH(&context, tag_directives_copy, value)) -// goto error -// value.handle = NULL -// value.prefix = NULL -// } -// } -// -// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, -// tag_directives_copy.start, tag_directives_copy.top, -// start_implicit, end_implicit, mark, mark) -// -// return 1 -// -//error: -// STACK_DEL(&context, nodes) -// yaml_free(version_directive_copy) -// while (!STACK_EMPTY(&context, tag_directives_copy)) { -// value yaml_tag_directive_t = POP(&context, tag_directives_copy) -// yaml_free(value.handle) -// yaml_free(value.prefix) -// } -// STACK_DEL(&context, tag_directives_copy) -// yaml_free(value.handle) -// yaml_free(value.prefix) -// -// return 0 -//} -// -///* -// * Destroy a document object. -// */ -// -//YAML_DECLARE(void) -//yaml_document_delete(document *yaml_document_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// tag_directive *yaml_tag_directive_t -// -// context.error = YAML_NO_ERROR // Eliminate a compiler warning. -// -// assert(document) // Non-NULL document object is expected. -// -// while (!STACK_EMPTY(&context, document.nodes)) { -// node yaml_node_t = POP(&context, document.nodes) -// yaml_free(node.tag) -// switch (node.type) { -// case YAML_SCALAR_NODE: -// yaml_free(node.data.scalar.value) -// break -// case YAML_SEQUENCE_NODE: -// STACK_DEL(&context, node.data.sequence.items) -// break -// case YAML_MAPPING_NODE: -// STACK_DEL(&context, node.data.mapping.pairs) -// break -// default: -// assert(0) // Should not happen. -// } -// } -// STACK_DEL(&context, document.nodes) -// -// yaml_free(document.version_directive) -// for (tag_directive = document.tag_directives.start -// tag_directive != document.tag_directives.end -// tag_directive++) { -// yaml_free(tag_directive.handle) -// yaml_free(tag_directive.prefix) -// } -// yaml_free(document.tag_directives.start) -// -// memset(document, 0, sizeof(yaml_document_t)) -//} -// -///** -// * Get a document node. -// */ -// -//YAML_DECLARE(yaml_node_t *) -//yaml_document_get_node(document *yaml_document_t, index int) -//{ -// assert(document) // Non-NULL document object is expected. -// -// if (index > 0 && document.nodes.start + index <= document.nodes.top) { -// return document.nodes.start + index - 1 -// } -// return NULL -//} -// -///** -// * Get the root object. -// */ -// -//YAML_DECLARE(yaml_node_t *) -//yaml_document_get_root_node(document *yaml_document_t) -//{ -// assert(document) // Non-NULL document object is expected. -// -// if (document.nodes.top != document.nodes.start) { -// return document.nodes.start -// } -// return NULL -//} -// -///* -// * Add a scalar node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_scalar(document *yaml_document_t, -// tag *yaml_char_t, value *yaml_char_t, length int, -// style yaml_scalar_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// value_copy *yaml_char_t = NULL -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// assert(value) // Non-NULL value is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (length < 0) { -// length = strlen((char *)value) -// } -// -// if (!yaml_check_utf8(value, length)) goto error -// value_copy = yaml_malloc(length+1) -// if (!value_copy) goto error -// memcpy(value_copy, value, length) -// value_copy[length] = '\0' -// -// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// yaml_free(tag_copy) -// yaml_free(value_copy) -// -// return 0 -//} -// -///* -// * Add a sequence node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_sequence(document *yaml_document_t, -// tag *yaml_char_t, style yaml_sequence_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// struct { -// start *yaml_node_item_t -// end *yaml_node_item_t -// top *yaml_node_item_t -// } items = { NULL, NULL, NULL } -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error -// -// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, -// style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// STACK_DEL(&context, items) -// yaml_free(tag_copy) -// -// return 0 -//} -// -///* -// * Add a mapping node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_mapping(document *yaml_document_t, -// tag *yaml_char_t, style yaml_mapping_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// struct { -// start *yaml_node_pair_t -// end *yaml_node_pair_t -// top *yaml_node_pair_t -// } pairs = { NULL, NULL, NULL } -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error -// -// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, -// style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// STACK_DEL(&context, pairs) -// yaml_free(tag_copy) -// -// return 0 -//} -// -///* -// * Append an item to a sequence node. -// */ -// -//YAML_DECLARE(int) -//yaml_document_append_sequence_item(document *yaml_document_t, -// sequence int, item int) -//{ -// struct { -// error yaml_error_type_t -// } context -// -// assert(document) // Non-NULL document is required. -// assert(sequence > 0 -// && document.nodes.start + sequence <= document.nodes.top) -// // Valid sequence id is required. -// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) -// // A sequence node is required. -// assert(item > 0 && document.nodes.start + item <= document.nodes.top) -// // Valid item id is required. -// -// if (!PUSH(&context, -// document.nodes.start[sequence-1].data.sequence.items, item)) -// return 0 -// -// return 1 -//} -// -///* -// * Append a pair of a key and a value to a mapping node. -// */ -// -//YAML_DECLARE(int) -//yaml_document_append_mapping_pair(document *yaml_document_t, -// mapping int, key int, value int) -//{ -// struct { -// error yaml_error_type_t -// } context -// -// pair yaml_node_pair_t -// -// assert(document) // Non-NULL document is required. -// assert(mapping > 0 -// && document.nodes.start + mapping <= document.nodes.top) -// // Valid mapping id is required. -// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) -// // A mapping node is required. -// assert(key > 0 && document.nodes.start + key <= document.nodes.top) -// // Valid key id is required. -// assert(value > 0 && document.nodes.start + value <= document.nodes.top) -// // Valid value id is required. -// -// pair.key = key -// pair.value = value -// -// if (!PUSH(&context, -// document.nodes.start[mapping-1].data.mapping.pairs, pair)) -// return 0 -// -// return 1 -//} -// -// diff --git a/vendor/gopkg.in/yaml.v3/decode.go b/vendor/gopkg.in/yaml.v3/decode.go deleted file mode 100644 index be63169b..00000000 --- a/vendor/gopkg.in/yaml.v3/decode.go +++ /dev/null @@ -1,931 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package yaml - -import ( - "encoding" - "encoding/base64" - "fmt" - "io" - "math" - "reflect" - "strconv" - "time" -) - -// ---------------------------------------------------------------------------- -// Parser, produces a node tree out of a libyaml event stream. - -type parser struct { - parser yaml_parser_t - event yaml_event_t - doc *Node - anchors map[string]*Node - doneInit bool -} - -func newParser(b []byte) *parser { - p := parser{} - if !yaml_parser_initialize(&p.parser) { - panic("failed to initialize YAML emitter") - } - if len(b) == 0 { - b = []byte{'\n'} - } - yaml_parser_set_input_string(&p.parser, b) - return &p -} - -func newParserFromReader(r io.Reader) *parser { - p := parser{} - if !yaml_parser_initialize(&p.parser) { - panic("failed to initialize YAML emitter") - } - yaml_parser_set_input_reader(&p.parser, r) - return &p -} - -func (p *parser) init() { - if p.doneInit { - return - } - p.anchors = make(map[string]*Node) - p.expect(yaml_STREAM_START_EVENT) - p.doneInit = true -} - -func (p *parser) destroy() { - if p.event.typ != yaml_NO_EVENT { - yaml_event_delete(&p.event) - } - yaml_parser_delete(&p.parser) -} - -// expect consumes an event from the event stream and -// checks that it's of the expected type. -func (p *parser) expect(e yaml_event_type_t) { - if p.event.typ == yaml_NO_EVENT { - if !yaml_parser_parse(&p.parser, &p.event) { - p.fail() - } - } - if p.event.typ == yaml_STREAM_END_EVENT { - failf("attempted to go past the end of stream; corrupted value?") - } - if p.event.typ != e { - p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ) - p.fail() - } - yaml_event_delete(&p.event) - p.event.typ = yaml_NO_EVENT -} - -// peek peeks at the next event in the event stream, -// puts the results into p.event and returns the event type. -func (p *parser) peek() yaml_event_type_t { - if p.event.typ != yaml_NO_EVENT { - return p.event.typ - } - if !yaml_parser_parse(&p.parser, &p.event) { - p.fail() - } - return p.event.typ -} - -func (p *parser) fail() { - var where string - var line int - if p.parser.problem_mark.line != 0 { - line = p.parser.problem_mark.line - // Scanner errors don't iterate line before returning error - if p.parser.error == yaml_SCANNER_ERROR { - line++ - } - } else if p.parser.context_mark.line != 0 { - line = p.parser.context_mark.line - } - if line != 0 { - where = "line " + strconv.Itoa(line) + ": " - } - var msg string - if len(p.parser.problem) > 0 { - msg = p.parser.problem - } else { - msg = "unknown problem parsing YAML content" - } - failf("%s%s", where, msg) -} - -func (p *parser) anchor(n *Node, anchor []byte) { - if anchor != nil { - n.Anchor = string(anchor) - p.anchors[n.Anchor] = n - } -} - -func (p *parser) parse() *Node { - p.init() - switch p.peek() { - case yaml_SCALAR_EVENT: - return p.scalar() - case yaml_ALIAS_EVENT: - return p.alias() - case yaml_MAPPING_START_EVENT: - return p.mapping() - case yaml_SEQUENCE_START_EVENT: - return p.sequence() - case yaml_DOCUMENT_START_EVENT: - return p.document() - case yaml_STREAM_END_EVENT: - // Happens when attempting to decode an empty buffer. - return nil - case yaml_TAIL_COMMENT_EVENT: - panic("internal error: unexpected tail comment event (please report)") - default: - panic("internal error: attempted to parse unknown event (please report): " + p.event.typ.String()) - } -} - -func (p *parser) node(kind Kind, defaultTag, tag, value string) *Node { - var style Style - if tag != "" && tag != "!" { - tag = shortTag(tag) - style = TaggedStyle - } else if defaultTag != "" { - tag = defaultTag - } else if kind == ScalarNode { - tag, _ = resolve("", value) - } - return &Node{ - Kind: kind, - Tag: tag, - Value: value, - Style: style, - Line: p.event.start_mark.line + 1, - Column: p.event.start_mark.column + 1, - HeadComment: string(p.event.head_comment), - LineComment: string(p.event.line_comment), - FootComment: string(p.event.foot_comment), - } -} - -func (p *parser) parseChild(parent *Node) *Node { - child := p.parse() - parent.Content = append(parent.Content, child) - return child -} - -func (p *parser) document() *Node { - n := p.node(DocumentNode, "", "", "") - p.doc = n - p.expect(yaml_DOCUMENT_START_EVENT) - p.parseChild(n) - if p.peek() == yaml_DOCUMENT_END_EVENT { - n.FootComment = string(p.event.foot_comment) - } - p.expect(yaml_DOCUMENT_END_EVENT) - return n -} - -func (p *parser) alias() *Node { - n := p.node(AliasNode, "", "", string(p.event.anchor)) - n.Alias = p.anchors[n.Value] - if n.Alias == nil { - failf("unknown anchor '%s' referenced", n.Value) - } - p.expect(yaml_ALIAS_EVENT) - return n -} - -func (p *parser) scalar() *Node { - var parsedStyle = p.event.scalar_style() - var nodeStyle Style - switch { - case parsedStyle&yaml_DOUBLE_QUOTED_SCALAR_STYLE != 0: - nodeStyle = DoubleQuotedStyle - case parsedStyle&yaml_SINGLE_QUOTED_SCALAR_STYLE != 0: - nodeStyle = SingleQuotedStyle - case parsedStyle&yaml_LITERAL_SCALAR_STYLE != 0: - nodeStyle = LiteralStyle - case parsedStyle&yaml_FOLDED_SCALAR_STYLE != 0: - nodeStyle = FoldedStyle - } - var nodeValue = string(p.event.value) - var nodeTag = string(p.event.tag) - var defaultTag string - if nodeStyle == 0 { - if nodeValue == "<<" { - defaultTag = mergeTag - } - } else { - defaultTag = strTag - } - n := p.node(ScalarNode, defaultTag, nodeTag, nodeValue) - n.Style |= nodeStyle - p.anchor(n, p.event.anchor) - p.expect(yaml_SCALAR_EVENT) - return n -} - -func (p *parser) sequence() *Node { - n := p.node(SequenceNode, seqTag, string(p.event.tag), "") - if p.event.sequence_style()&yaml_FLOW_SEQUENCE_STYLE != 0 { - n.Style |= FlowStyle - } - p.anchor(n, p.event.anchor) - p.expect(yaml_SEQUENCE_START_EVENT) - for p.peek() != yaml_SEQUENCE_END_EVENT { - p.parseChild(n) - } - n.LineComment = string(p.event.line_comment) - n.FootComment = string(p.event.foot_comment) - p.expect(yaml_SEQUENCE_END_EVENT) - return n -} - -func (p *parser) mapping() *Node { - n := p.node(MappingNode, mapTag, string(p.event.tag), "") - block := true - if p.event.mapping_style()&yaml_FLOW_MAPPING_STYLE != 0 { - block = false - n.Style |= FlowStyle - } - p.anchor(n, p.event.anchor) - p.expect(yaml_MAPPING_START_EVENT) - for p.peek() != yaml_MAPPING_END_EVENT { - k := p.parseChild(n) - if block && k.FootComment != "" { - // Must be a foot comment for the prior value when being dedented. - if len(n.Content) > 2 { - n.Content[len(n.Content)-3].FootComment = k.FootComment - k.FootComment = "" - } - } - v := p.parseChild(n) - if k.FootComment == "" && v.FootComment != "" { - k.FootComment = v.FootComment - v.FootComment = "" - } - if p.peek() == yaml_TAIL_COMMENT_EVENT { - if k.FootComment == "" { - k.FootComment = string(p.event.foot_comment) - } - p.expect(yaml_TAIL_COMMENT_EVENT) - } - } - n.LineComment = string(p.event.line_comment) - n.FootComment = string(p.event.foot_comment) - if n.Style&FlowStyle == 0 && n.FootComment != "" && len(n.Content) > 1 { - n.Content[len(n.Content)-2].FootComment = n.FootComment - n.FootComment = "" - } - p.expect(yaml_MAPPING_END_EVENT) - return n -} - -// ---------------------------------------------------------------------------- -// Decoder, unmarshals a node into a provided value. - -type decoder struct { - doc *Node - aliases map[*Node]bool - terrors []string - - stringMapType reflect.Type - generalMapType reflect.Type - - knownFields bool - uniqueKeys bool - decodeCount int - aliasCount int - aliasDepth int -} - -var ( - nodeType = reflect.TypeOf(Node{}) - durationType = reflect.TypeOf(time.Duration(0)) - stringMapType = reflect.TypeOf(map[string]interface{}{}) - generalMapType = reflect.TypeOf(map[interface{}]interface{}{}) - ifaceType = generalMapType.Elem() - timeType = reflect.TypeOf(time.Time{}) - ptrTimeType = reflect.TypeOf(&time.Time{}) -) - -func newDecoder() *decoder { - d := &decoder{ - stringMapType: stringMapType, - generalMapType: generalMapType, - uniqueKeys: true, - } - d.aliases = make(map[*Node]bool) - return d -} - -func (d *decoder) terror(n *Node, tag string, out reflect.Value) { - if n.Tag != "" { - tag = n.Tag - } - value := n.Value - if tag != seqTag && tag != mapTag { - if len(value) > 10 { - value = " `" + value[:7] + "...`" - } else { - value = " `" + value + "`" - } - } - d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.Line, shortTag(tag), value, out.Type())) -} - -func (d *decoder) callUnmarshaler(n *Node, u Unmarshaler) (good bool) { - err := u.UnmarshalYAML(n) - if e, ok := err.(*TypeError); ok { - d.terrors = append(d.terrors, e.Errors...) - return false - } - if err != nil { - fail(err) - } - return true -} - -func (d *decoder) callObsoleteUnmarshaler(n *Node, u obsoleteUnmarshaler) (good bool) { - terrlen := len(d.terrors) - err := u.UnmarshalYAML(func(v interface{}) (err error) { - defer handleErr(&err) - d.unmarshal(n, reflect.ValueOf(v)) - if len(d.terrors) > terrlen { - issues := d.terrors[terrlen:] - d.terrors = d.terrors[:terrlen] - return &TypeError{issues} - } - return nil - }) - if e, ok := err.(*TypeError); ok { - d.terrors = append(d.terrors, e.Errors...) - return false - } - if err != nil { - fail(err) - } - return true -} - -// d.prepare initializes and dereferences pointers and calls UnmarshalYAML -// if a value is found to implement it. -// It returns the initialized and dereferenced out value, whether -// unmarshalling was already done by UnmarshalYAML, and if so whether -// its types unmarshalled appropriately. -// -// If n holds a null value, prepare returns before doing anything. -func (d *decoder) prepare(n *Node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { - if n.ShortTag() == nullTag { - return out, false, false - } - again := true - for again { - again = false - if out.Kind() == reflect.Ptr { - if out.IsNil() { - out.Set(reflect.New(out.Type().Elem())) - } - out = out.Elem() - again = true - } - if out.CanAddr() { - outi := out.Addr().Interface() - if u, ok := outi.(Unmarshaler); ok { - good = d.callUnmarshaler(n, u) - return out, true, good - } - if u, ok := outi.(obsoleteUnmarshaler); ok { - good = d.callObsoleteUnmarshaler(n, u) - return out, true, good - } - } - } - return out, false, false -} - -func (d *decoder) fieldByIndex(n *Node, v reflect.Value, index []int) (field reflect.Value) { - if n.ShortTag() == nullTag { - return reflect.Value{} - } - for _, num := range index { - for { - if v.Kind() == reflect.Ptr { - if v.IsNil() { - v.Set(reflect.New(v.Type().Elem())) - } - v = v.Elem() - continue - } - break - } - v = v.Field(num) - } - return v -} - -const ( - // 400,000 decode operations is ~500kb of dense object declarations, or - // ~5kb of dense object declarations with 10000% alias expansion - alias_ratio_range_low = 400000 - - // 4,000,000 decode operations is ~5MB of dense object declarations, or - // ~4.5MB of dense object declarations with 10% alias expansion - alias_ratio_range_high = 4000000 - - // alias_ratio_range is the range over which we scale allowed alias ratios - alias_ratio_range = float64(alias_ratio_range_high - alias_ratio_range_low) -) - -func allowedAliasRatio(decodeCount int) float64 { - switch { - case decodeCount <= alias_ratio_range_low: - // allow 99% to come from alias expansion for small-to-medium documents - return 0.99 - case decodeCount >= alias_ratio_range_high: - // allow 10% to come from alias expansion for very large documents - return 0.10 - default: - // scale smoothly from 99% down to 10% over the range. - // this maps to 396,000 - 400,000 allowed alias-driven decodes over the range. - // 400,000 decode operations is ~100MB of allocations in worst-case scenarios (single-item maps). - return 0.99 - 0.89*(float64(decodeCount-alias_ratio_range_low)/alias_ratio_range) - } -} - -func (d *decoder) unmarshal(n *Node, out reflect.Value) (good bool) { - d.decodeCount++ - if d.aliasDepth > 0 { - d.aliasCount++ - } - if d.aliasCount > 100 && d.decodeCount > 1000 && float64(d.aliasCount)/float64(d.decodeCount) > allowedAliasRatio(d.decodeCount) { - failf("document contains excessive aliasing") - } - if out.Type() == nodeType { - out.Set(reflect.ValueOf(n).Elem()) - return true - } - switch n.Kind { - case DocumentNode: - return d.document(n, out) - case AliasNode: - return d.alias(n, out) - } - out, unmarshaled, good := d.prepare(n, out) - if unmarshaled { - return good - } - switch n.Kind { - case ScalarNode: - good = d.scalar(n, out) - case MappingNode: - good = d.mapping(n, out) - case SequenceNode: - good = d.sequence(n, out) - default: - panic("internal error: unknown node kind: " + strconv.Itoa(int(n.Kind))) - } - return good -} - -func (d *decoder) document(n *Node, out reflect.Value) (good bool) { - if len(n.Content) == 1 { - d.doc = n - d.unmarshal(n.Content[0], out) - return true - } - return false -} - -func (d *decoder) alias(n *Node, out reflect.Value) (good bool) { - if d.aliases[n] { - // TODO this could actually be allowed in some circumstances. - failf("anchor '%s' value contains itself", n.Value) - } - d.aliases[n] = true - d.aliasDepth++ - good = d.unmarshal(n.Alias, out) - d.aliasDepth-- - delete(d.aliases, n) - return good -} - -var zeroValue reflect.Value - -func resetMap(out reflect.Value) { - for _, k := range out.MapKeys() { - out.SetMapIndex(k, zeroValue) - } -} - -func (d *decoder) scalar(n *Node, out reflect.Value) bool { - var tag string - var resolved interface{} - if n.indicatedString() { - tag = strTag - resolved = n.Value - } else { - tag, resolved = resolve(n.Tag, n.Value) - if tag == binaryTag { - data, err := base64.StdEncoding.DecodeString(resolved.(string)) - if err != nil { - failf("!!binary value contains invalid base64 data") - } - resolved = string(data) - } - } - if resolved == nil { - if out.CanAddr() { - switch out.Kind() { - case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: - out.Set(reflect.Zero(out.Type())) - return true - } - } - return false - } - if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { - // We've resolved to exactly the type we want, so use that. - out.Set(resolvedv) - return true - } - // Perhaps we can use the value as a TextUnmarshaler to - // set its value. - if out.CanAddr() { - u, ok := out.Addr().Interface().(encoding.TextUnmarshaler) - if ok { - var text []byte - if tag == binaryTag { - text = []byte(resolved.(string)) - } else { - // We let any value be unmarshaled into TextUnmarshaler. - // That might be more lax than we'd like, but the - // TextUnmarshaler itself should bowl out any dubious values. - text = []byte(n.Value) - } - err := u.UnmarshalText(text) - if err != nil { - fail(err) - } - return true - } - } - switch out.Kind() { - case reflect.String: - if tag == binaryTag { - out.SetString(resolved.(string)) - return true - } - out.SetString(n.Value) - return true - case reflect.Interface: - out.Set(reflect.ValueOf(resolved)) - return true - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - // This used to work in v2, but it's very unfriendly. - isDuration := out.Type() == durationType - - switch resolved := resolved.(type) { - case int: - if !isDuration && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case int64: - if !isDuration && !out.OverflowInt(resolved) { - out.SetInt(resolved) - return true - } - case uint64: - if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case float64: - if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case string: - if out.Type() == durationType { - d, err := time.ParseDuration(resolved) - if err == nil { - out.SetInt(int64(d)) - return true - } - } - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - switch resolved := resolved.(type) { - case int: - if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case int64: - if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case uint64: - if !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case float64: - if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - } - case reflect.Bool: - switch resolved := resolved.(type) { - case bool: - out.SetBool(resolved) - return true - case string: - // This offers some compatibility with the 1.1 spec (https://yaml.org/type/bool.html). - // It only works if explicitly attempting to unmarshal into a typed bool value. - switch resolved { - case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON": - out.SetBool(true) - return true - case "n", "N", "no", "No", "NO", "off", "Off", "OFF": - out.SetBool(false) - return true - } - } - case reflect.Float32, reflect.Float64: - switch resolved := resolved.(type) { - case int: - out.SetFloat(float64(resolved)) - return true - case int64: - out.SetFloat(float64(resolved)) - return true - case uint64: - out.SetFloat(float64(resolved)) - return true - case float64: - out.SetFloat(resolved) - return true - } - case reflect.Struct: - if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { - out.Set(resolvedv) - return true - } - case reflect.Ptr: - panic("yaml internal error: please report the issue") - } - d.terror(n, tag, out) - return false -} - -func settableValueOf(i interface{}) reflect.Value { - v := reflect.ValueOf(i) - sv := reflect.New(v.Type()).Elem() - sv.Set(v) - return sv -} - -func (d *decoder) sequence(n *Node, out reflect.Value) (good bool) { - l := len(n.Content) - - var iface reflect.Value - switch out.Kind() { - case reflect.Slice: - out.Set(reflect.MakeSlice(out.Type(), l, l)) - case reflect.Array: - if l != out.Len() { - failf("invalid array: want %d elements but got %d", out.Len(), l) - } - case reflect.Interface: - // No type hints. Will have to use a generic sequence. - iface = out - out = settableValueOf(make([]interface{}, l)) - default: - d.terror(n, seqTag, out) - return false - } - et := out.Type().Elem() - - j := 0 - for i := 0; i < l; i++ { - e := reflect.New(et).Elem() - if ok := d.unmarshal(n.Content[i], e); ok { - out.Index(j).Set(e) - j++ - } - } - if out.Kind() != reflect.Array { - out.Set(out.Slice(0, j)) - } - if iface.IsValid() { - iface.Set(out) - } - return true -} - -func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) { - l := len(n.Content) - if d.uniqueKeys { - nerrs := len(d.terrors) - for i := 0; i < l; i += 2 { - ni := n.Content[i] - for j := i + 2; j < l; j += 2 { - nj := n.Content[j] - if ni.Kind == nj.Kind && ni.Value == nj.Value { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: mapping key %#v already defined at line %d", nj.Line, nj.Value, ni.Line)) - } - } - } - if len(d.terrors) > nerrs { - return false - } - } - switch out.Kind() { - case reflect.Struct: - return d.mappingStruct(n, out) - case reflect.Map: - // okay - case reflect.Interface: - iface := out - if isStringMap(n) { - out = reflect.MakeMap(d.stringMapType) - } else { - out = reflect.MakeMap(d.generalMapType) - } - iface.Set(out) - default: - d.terror(n, mapTag, out) - return false - } - - outt := out.Type() - kt := outt.Key() - et := outt.Elem() - - stringMapType := d.stringMapType - generalMapType := d.generalMapType - if outt.Elem() == ifaceType { - if outt.Key().Kind() == reflect.String { - d.stringMapType = outt - } else if outt.Key() == ifaceType { - d.generalMapType = outt - } - } - - if out.IsNil() { - out.Set(reflect.MakeMap(outt)) - } - for i := 0; i < l; i += 2 { - if isMerge(n.Content[i]) { - d.merge(n.Content[i+1], out) - continue - } - k := reflect.New(kt).Elem() - if d.unmarshal(n.Content[i], k) { - kkind := k.Kind() - if kkind == reflect.Interface { - kkind = k.Elem().Kind() - } - if kkind == reflect.Map || kkind == reflect.Slice { - failf("invalid map key: %#v", k.Interface()) - } - e := reflect.New(et).Elem() - if d.unmarshal(n.Content[i+1], e) { - out.SetMapIndex(k, e) - } - } - } - d.stringMapType = stringMapType - d.generalMapType = generalMapType - return true -} - -func isStringMap(n *Node) bool { - if n.Kind != MappingNode { - return false - } - l := len(n.Content) - for i := 0; i < l; i += 2 { - if n.Content[i].ShortTag() != strTag { - return false - } - } - return true -} - -func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) { - sinfo, err := getStructInfo(out.Type()) - if err != nil { - panic(err) - } - - var inlineMap reflect.Value - var elemType reflect.Type - if sinfo.InlineMap != -1 { - inlineMap = out.Field(sinfo.InlineMap) - inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) - elemType = inlineMap.Type().Elem() - } - - for _, index := range sinfo.InlineUnmarshalers { - field := d.fieldByIndex(n, out, index) - d.prepare(n, field) - } - - var doneFields []bool - if d.uniqueKeys { - doneFields = make([]bool, len(sinfo.FieldsList)) - } - name := settableValueOf("") - l := len(n.Content) - for i := 0; i < l; i += 2 { - ni := n.Content[i] - if isMerge(ni) { - d.merge(n.Content[i+1], out) - continue - } - if !d.unmarshal(ni, name) { - continue - } - if info, ok := sinfo.FieldsMap[name.String()]; ok { - if d.uniqueKeys { - if doneFields[info.Id] { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.Line, name.String(), out.Type())) - continue - } - doneFields[info.Id] = true - } - var field reflect.Value - if info.Inline == nil { - field = out.Field(info.Num) - } else { - field = d.fieldByIndex(n, out, info.Inline) - } - d.unmarshal(n.Content[i+1], field) - } else if sinfo.InlineMap != -1 { - if inlineMap.IsNil() { - inlineMap.Set(reflect.MakeMap(inlineMap.Type())) - } - value := reflect.New(elemType).Elem() - d.unmarshal(n.Content[i+1], value) - inlineMap.SetMapIndex(name, value) - } else if d.knownFields { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.Line, name.String(), out.Type())) - } - } - return true -} - -func failWantMap() { - failf("map merge requires map or sequence of maps as the value") -} - -func (d *decoder) merge(n *Node, out reflect.Value) { - switch n.Kind { - case MappingNode: - d.unmarshal(n, out) - case AliasNode: - if n.Alias != nil && n.Alias.Kind != MappingNode { - failWantMap() - } - d.unmarshal(n, out) - case SequenceNode: - // Step backwards as earlier nodes take precedence. - for i := len(n.Content) - 1; i >= 0; i-- { - ni := n.Content[i] - if ni.Kind == AliasNode { - if ni.Alias != nil && ni.Alias.Kind != MappingNode { - failWantMap() - } - } else if ni.Kind != MappingNode { - failWantMap() - } - d.unmarshal(ni, out) - } - default: - failWantMap() - } -} - -func isMerge(n *Node) bool { - return n.Kind == ScalarNode && n.Value == "<<" && (n.Tag == "" || n.Tag == "!" || shortTag(n.Tag) == mergeTag) -} diff --git a/vendor/gopkg.in/yaml.v3/emitterc.go b/vendor/gopkg.in/yaml.v3/emitterc.go deleted file mode 100644 index ab2a0661..00000000 --- a/vendor/gopkg.in/yaml.v3/emitterc.go +++ /dev/null @@ -1,1992 +0,0 @@ -// -// 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 -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "bytes" - "fmt" -) - -// Flush the buffer if needed. -func flush(emitter *yaml_emitter_t) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) { - return yaml_emitter_flush(emitter) - } - return true -} - -// Put a character to the output buffer. -func put(emitter *yaml_emitter_t, value byte) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - emitter.buffer[emitter.buffer_pos] = value - emitter.buffer_pos++ - emitter.column++ - return true -} - -// Put a line break to the output buffer. -func put_break(emitter *yaml_emitter_t) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - switch emitter.line_break { - case yaml_CR_BREAK: - emitter.buffer[emitter.buffer_pos] = '\r' - emitter.buffer_pos += 1 - case yaml_LN_BREAK: - emitter.buffer[emitter.buffer_pos] = '\n' - emitter.buffer_pos += 1 - case yaml_CRLN_BREAK: - emitter.buffer[emitter.buffer_pos+0] = '\r' - emitter.buffer[emitter.buffer_pos+1] = '\n' - emitter.buffer_pos += 2 - default: - panic("unknown line break setting") - } - if emitter.column == 0 { - emitter.space_above = true - } - emitter.column = 0 - emitter.line++ - // [Go] Do this here and below and drop from everywhere else (see commented lines). - emitter.indention = true - return true -} - -// Copy a character from a string into buffer. -func write(emitter *yaml_emitter_t, s []byte, i *int) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - p := emitter.buffer_pos - w := width(s[*i]) - switch w { - case 4: - emitter.buffer[p+3] = s[*i+3] - fallthrough - case 3: - emitter.buffer[p+2] = s[*i+2] - fallthrough - case 2: - emitter.buffer[p+1] = s[*i+1] - fallthrough - case 1: - emitter.buffer[p+0] = s[*i+0] - default: - panic("unknown character width") - } - emitter.column++ - emitter.buffer_pos += w - *i += w - return true -} - -// Write a whole string into buffer. -func write_all(emitter *yaml_emitter_t, s []byte) bool { - for i := 0; i < len(s); { - if !write(emitter, s, &i) { - return false - } - } - return true -} - -// Copy a line break character from a string into buffer. -func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { - if s[*i] == '\n' { - if !put_break(emitter) { - return false - } - *i++ - } else { - if !write(emitter, s, i) { - return false - } - if emitter.column == 0 { - emitter.space_above = true - } - emitter.column = 0 - emitter.line++ - // [Go] Do this here and above and drop from everywhere else (see commented lines). - emitter.indention = true - } - return true -} - -// Set an emitter error and return false. -func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { - emitter.error = yaml_EMITTER_ERROR - emitter.problem = problem - return false -} - -// Emit an event. -func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { - emitter.events = append(emitter.events, *event) - for !yaml_emitter_need_more_events(emitter) { - event := &emitter.events[emitter.events_head] - if !yaml_emitter_analyze_event(emitter, event) { - return false - } - if !yaml_emitter_state_machine(emitter, event) { - return false - } - yaml_event_delete(event) - emitter.events_head++ - } - return true -} - -// 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 -// -func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { - if emitter.events_head == len(emitter.events) { - return true - } - var accumulate int - switch emitter.events[emitter.events_head].typ { - case yaml_DOCUMENT_START_EVENT: - accumulate = 1 - break - case yaml_SEQUENCE_START_EVENT: - accumulate = 2 - break - case yaml_MAPPING_START_EVENT: - accumulate = 3 - break - default: - return false - } - if len(emitter.events)-emitter.events_head > accumulate { - return false - } - var level int - for i := emitter.events_head; i < len(emitter.events); i++ { - switch emitter.events[i].typ { - case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: - level++ - case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: - level-- - } - if level == 0 { - return false - } - } - return true -} - -// Append a directive to the directives stack. -func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { - for i := 0; i < len(emitter.tag_directives); i++ { - if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { - if allow_duplicates { - return true - } - return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") - } - } - - // [Go] Do we actually need to copy this given garbage collection - // and the lack of deallocating destructors? - tag_copy := yaml_tag_directive_t{ - handle: make([]byte, len(value.handle)), - prefix: make([]byte, len(value.prefix)), - } - copy(tag_copy.handle, value.handle) - copy(tag_copy.prefix, value.prefix) - emitter.tag_directives = append(emitter.tag_directives, tag_copy) - return true -} - -// Increase the indentation level. -func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { - emitter.indents = append(emitter.indents, emitter.indent) - if emitter.indent < 0 { - if flow { - emitter.indent = emitter.best_indent - } else { - emitter.indent = 0 - } - } else if !indentless { - emitter.indent += emitter.best_indent - // [Go] If inside a block sequence item, discount the space taken by the indicator. - if emitter.best_indent > 2 && emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE { - emitter.indent -= 2 - } - } - return true -} - -// State dispatcher. -func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { - switch emitter.state { - default: - case yaml_EMIT_STREAM_START_STATE: - return yaml_emitter_emit_stream_start(emitter, event) - - case yaml_EMIT_FIRST_DOCUMENT_START_STATE: - return yaml_emitter_emit_document_start(emitter, event, true) - - case yaml_EMIT_DOCUMENT_START_STATE: - return yaml_emitter_emit_document_start(emitter, event, false) - - case yaml_EMIT_DOCUMENT_CONTENT_STATE: - return yaml_emitter_emit_document_content(emitter, event) - - case yaml_EMIT_DOCUMENT_END_STATE: - return yaml_emitter_emit_document_end(emitter, event) - - case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, true, false) - - case yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, false, true) - - case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, false, false) - - case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, true, false) - - case yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, false, true) - - case yaml_EMIT_FLOW_MAPPING_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, false, false) - - case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: - return yaml_emitter_emit_flow_mapping_value(emitter, event, true) - - case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: - return yaml_emitter_emit_flow_mapping_value(emitter, event, false) - - case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: - return yaml_emitter_emit_block_sequence_item(emitter, event, true) - - case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: - return yaml_emitter_emit_block_sequence_item(emitter, event, false) - - case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: - return yaml_emitter_emit_block_mapping_key(emitter, event, true) - - case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: - return yaml_emitter_emit_block_mapping_key(emitter, event, false) - - case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: - return yaml_emitter_emit_block_mapping_value(emitter, event, true) - - case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: - return yaml_emitter_emit_block_mapping_value(emitter, event, false) - - case yaml_EMIT_END_STATE: - return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") - } - panic("invalid emitter state") -} - -// Expect STREAM-START. -func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if event.typ != yaml_STREAM_START_EVENT { - return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") - } - if emitter.encoding == yaml_ANY_ENCODING { - emitter.encoding = event.encoding - if emitter.encoding == yaml_ANY_ENCODING { - emitter.encoding = yaml_UTF8_ENCODING - } - } - if emitter.best_indent < 2 || emitter.best_indent > 9 { - emitter.best_indent = 2 - } - if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { - emitter.best_width = 80 - } - if emitter.best_width < 0 { - emitter.best_width = 1<<31 - 1 - } - if emitter.line_break == yaml_ANY_BREAK { - emitter.line_break = yaml_LN_BREAK - } - - emitter.indent = -1 - emitter.line = 0 - emitter.column = 0 - emitter.whitespace = true - emitter.indention = true - emitter.space_above = true - emitter.foot_indent = -1 - - if emitter.encoding != yaml_UTF8_ENCODING { - if !yaml_emitter_write_bom(emitter) { - return false - } - } - emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE - return true -} - -// Expect DOCUMENT-START or STREAM-END. -func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - - if event.typ == yaml_DOCUMENT_START_EVENT { - - if event.version_directive != nil { - if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { - return false - } - } - - for i := 0; i < len(event.tag_directives); i++ { - tag_directive := &event.tag_directives[i] - if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { - return false - } - if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { - return false - } - } - - for i := 0; i < len(default_tag_directives); i++ { - tag_directive := &default_tag_directives[i] - if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { - return false - } - } - - implicit := event.implicit - if !first || emitter.canonical { - implicit = false - } - - if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if event.version_directive != nil { - implicit = false - if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if len(event.tag_directives) > 0 { - implicit = false - for i := 0; i < len(event.tag_directives); i++ { - tag_directive := &event.tag_directives[i] - if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { - return false - } - if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { - return false - } - if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - } - - if yaml_emitter_check_empty_document(emitter) { - implicit = false - } - if !implicit { - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { - return false - } - if emitter.canonical || true { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - } - - if len(emitter.head_comment) > 0 { - if !yaml_emitter_process_head_comment(emitter) { - return false - } - if !put_break(emitter) { - return false - } - } - - emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE - return true - } - - if event.typ == yaml_STREAM_END_EVENT { - if emitter.open_ended { - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_flush(emitter) { - return false - } - emitter.state = yaml_EMIT_END_STATE - return true - } - - return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") -} - -// Expect the root node. -func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { - emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) - - if !yaml_emitter_process_head_comment(emitter) { - return false - } - if !yaml_emitter_emit_node(emitter, event, true, false, false, false) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - return true -} - -// Expect DOCUMENT-END. -func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if event.typ != yaml_DOCUMENT_END_EVENT { - return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") - } - // [Go] Force document foot separation. - emitter.foot_indent = 0 - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - emitter.foot_indent = -1 - if !yaml_emitter_write_indent(emitter) { - return false - } - if !event.implicit { - // [Go] Allocate the slice elsewhere. - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_flush(emitter) { - return false - } - emitter.state = yaml_EMIT_DOCUMENT_START_STATE - emitter.tag_directives = emitter.tag_directives[:0] - return true -} - -// Expect a flow item node. -func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { - if first { - if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - emitter.flow_level++ - } - - if event.typ == yaml_SEQUENCE_END_EVENT { - if emitter.canonical && !first && !trail { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - emitter.flow_level-- - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - if emitter.column == 0 || emitter.canonical && !first { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - - return true - } - - if !first && !trail { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - - if !yaml_emitter_process_head_comment(emitter) { - return false - } - if emitter.column == 0 { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE) - } else { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) - } - if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { - return false - } - if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - return true -} - -// Expect a flow key node. -func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { - if first { - if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - emitter.flow_level++ - } - - if event.typ == yaml_MAPPING_END_EVENT { - if (emitter.canonical || len(emitter.head_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0) && !first && !trail { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - if !yaml_emitter_process_head_comment(emitter) { - return false - } - emitter.flow_level-- - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - if emitter.canonical && !first { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - - if !first && !trail { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - - if !yaml_emitter_process_head_comment(emitter) { - return false - } - - if emitter.column == 0 { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, true) - } - if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a flow value node. -func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { - if simple { - if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { - return false - } - } else { - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { - return false - } - } - if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE) - } else { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) - } - if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { - return false - } - if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - return true -} - -// Expect a block item node. -func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - // [Go] The original logic here would not indent the sequence when inside a mapping. - // In Go we always indent it, but take the sequence indicator out of the indentation. - indentless := emitter.best_indent == 2 && emitter.mapping_context && (emitter.column == 0 || !emitter.indention) - original := emitter.indent - if !yaml_emitter_increase_indent(emitter, false, indentless) { - return false - } - if emitter.indent > original+2 { - emitter.indent -= 2 - } - } - if event.typ == yaml_SEQUENCE_END_EVENT { - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - if !yaml_emitter_process_head_comment(emitter) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) - if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - return true -} - -// Expect a block key node. -func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_increase_indent(emitter, false, false) { - return false - } - } - if !yaml_emitter_process_head_comment(emitter) { - return false - } - if event.typ == yaml_MAPPING_END_EVENT { - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if yaml_emitter_check_simple_key(emitter) { - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, true) - } - if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a block value node. -func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { - if simple { - if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { - return false - } - } else { - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { - return false - } - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) - if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - return true -} - -// Expect a node. -func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, - root bool, sequence bool, mapping bool, simple_key bool) bool { - - emitter.root_context = root - emitter.sequence_context = sequence - emitter.mapping_context = mapping - emitter.simple_key_context = simple_key - - switch event.typ { - case yaml_ALIAS_EVENT: - return yaml_emitter_emit_alias(emitter, event) - case yaml_SCALAR_EVENT: - return yaml_emitter_emit_scalar(emitter, event) - case yaml_SEQUENCE_START_EVENT: - return yaml_emitter_emit_sequence_start(emitter, event) - case yaml_MAPPING_START_EVENT: - return yaml_emitter_emit_mapping_start(emitter, event) - default: - return yaml_emitter_set_emitter_error(emitter, - fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ)) - } -} - -// Expect ALIAS. -func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true -} - -// Expect SCALAR. -func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_select_scalar_style(emitter, event) { - return false - } - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - if !yaml_emitter_process_scalar(emitter) { - return false - } - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true -} - -// Expect SEQUENCE-START. -func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || - yaml_emitter_check_empty_sequence(emitter) { - emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE - } else { - emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE - } - return true -} - -// Expect MAPPING-START. -func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || - yaml_emitter_check_empty_mapping(emitter) { - emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE - } else { - emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE - } - return true -} - -// Check if the document content is an empty scalar. -func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { - return false // [Go] Huh? -} - -// Check if the next events represent an empty sequence. -func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { - if len(emitter.events)-emitter.events_head < 2 { - return false - } - return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && - emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT -} - -// Check if the next events represent an empty mapping. -func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { - if len(emitter.events)-emitter.events_head < 2 { - return false - } - return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && - emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT -} - -// Check if the next node can be expressed as a simple key. -func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { - length := 0 - switch emitter.events[emitter.events_head].typ { - case yaml_ALIAS_EVENT: - length += len(emitter.anchor_data.anchor) - case yaml_SCALAR_EVENT: - if emitter.scalar_data.multiline { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) + - len(emitter.scalar_data.value) - case yaml_SEQUENCE_START_EVENT: - if !yaml_emitter_check_empty_sequence(emitter) { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) - case yaml_MAPPING_START_EVENT: - if !yaml_emitter_check_empty_mapping(emitter) { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) - default: - return false - } - return length <= 128 -} - -// Determine an acceptable scalar style. -func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { - - no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 - if no_tag && !event.implicit && !event.quoted_implicit { - return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") - } - - style := event.scalar_style() - if style == yaml_ANY_SCALAR_STYLE { - style = yaml_PLAIN_SCALAR_STYLE - } - if emitter.canonical { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - if emitter.simple_key_context && emitter.scalar_data.multiline { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - - if style == yaml_PLAIN_SCALAR_STYLE { - if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || - emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - if no_tag && !event.implicit { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - } - if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { - if !emitter.scalar_data.single_quoted_allowed { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - } - if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { - if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - } - - if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { - emitter.tag_data.handle = []byte{'!'} - } - emitter.scalar_data.style = style - return true -} - -// Write an anchor. -func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { - if emitter.anchor_data.anchor == nil { - return true - } - c := []byte{'&'} - if emitter.anchor_data.alias { - c[0] = '*' - } - if !yaml_emitter_write_indicator(emitter, c, true, false, false) { - return false - } - return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) -} - -// Write a tag. -func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { - if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { - return true - } - if len(emitter.tag_data.handle) > 0 { - if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { - return false - } - if len(emitter.tag_data.suffix) > 0 { - if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { - return false - } - } - } else { - // [Go] Allocate these slices elsewhere. - if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { - return false - } - if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { - return false - } - } - return true -} - -// Write a scalar. -func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { - switch emitter.scalar_data.style { - case yaml_PLAIN_SCALAR_STYLE: - return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_SINGLE_QUOTED_SCALAR_STYLE: - return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_DOUBLE_QUOTED_SCALAR_STYLE: - return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_LITERAL_SCALAR_STYLE: - return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) - - case yaml_FOLDED_SCALAR_STYLE: - return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) - } - panic("unknown scalar style") -} - -// Write a head comment. -func yaml_emitter_process_head_comment(emitter *yaml_emitter_t) bool { - if len(emitter.tail_comment) > 0 { - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_comment(emitter, emitter.tail_comment) { - return false - } - emitter.tail_comment = emitter.tail_comment[:0] - emitter.foot_indent = emitter.indent - if emitter.foot_indent < 0 { - emitter.foot_indent = 0 - } - } - - if len(emitter.head_comment) == 0 { - return true - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_comment(emitter, emitter.head_comment) { - return false - } - emitter.head_comment = emitter.head_comment[:0] - return true -} - -// Write an line comment. -func yaml_emitter_process_line_comment(emitter *yaml_emitter_t) bool { - if len(emitter.line_comment) == 0 { - return true - } - if !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - if !yaml_emitter_write_comment(emitter, emitter.line_comment) { - return false - } - emitter.line_comment = emitter.line_comment[:0] - return true -} - -// Write a foot comment. -func yaml_emitter_process_foot_comment(emitter *yaml_emitter_t) bool { - if len(emitter.foot_comment) == 0 { - return true - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_comment(emitter, emitter.foot_comment) { - return false - } - emitter.foot_comment = emitter.foot_comment[:0] - emitter.foot_indent = emitter.indent - if emitter.foot_indent < 0 { - emitter.foot_indent = 0 - } - return true -} - -// Check if a %YAML directive is valid. -func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { - if version_directive.major != 1 || version_directive.minor != 1 { - return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") - } - return true -} - -// Check if a %TAG directive is valid. -func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { - handle := tag_directive.handle - prefix := tag_directive.prefix - if len(handle) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") - } - if handle[0] != '!' { - return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") - } - if handle[len(handle)-1] != '!' { - return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") - } - for i := 1; i < len(handle)-1; i += width(handle[i]) { - if !is_alpha(handle, i) { - return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") - } - } - if len(prefix) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") - } - return true -} - -// Check if an anchor is valid. -func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { - if len(anchor) == 0 { - problem := "anchor value must not be empty" - if alias { - problem = "alias value must not be empty" - } - return yaml_emitter_set_emitter_error(emitter, problem) - } - for i := 0; i < len(anchor); i += width(anchor[i]) { - if !is_alpha(anchor, i) { - problem := "anchor value must contain alphanumerical characters only" - if alias { - problem = "alias value must contain alphanumerical characters only" - } - return yaml_emitter_set_emitter_error(emitter, problem) - } - } - emitter.anchor_data.anchor = anchor - emitter.anchor_data.alias = alias - return true -} - -// Check if a tag is valid. -func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { - if len(tag) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") - } - for i := 0; i < len(emitter.tag_directives); i++ { - tag_directive := &emitter.tag_directives[i] - if bytes.HasPrefix(tag, tag_directive.prefix) { - emitter.tag_data.handle = tag_directive.handle - emitter.tag_data.suffix = tag[len(tag_directive.prefix):] - return true - } - } - emitter.tag_data.suffix = tag - return true -} - -// Check if a scalar is valid. -func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { - var ( - block_indicators = false - flow_indicators = false - line_breaks = false - special_characters = false - tab_characters = false - - leading_space = false - leading_break = false - trailing_space = false - trailing_break = false - break_space = false - space_break = false - - preceded_by_whitespace = false - followed_by_whitespace = false - previous_space = false - previous_break = false - ) - - emitter.scalar_data.value = value - - if len(value) == 0 { - emitter.scalar_data.multiline = false - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = true - emitter.scalar_data.single_quoted_allowed = true - emitter.scalar_data.block_allowed = false - return true - } - - if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { - block_indicators = true - flow_indicators = true - } - - preceded_by_whitespace = true - for i, w := 0, 0; i < len(value); i += w { - w = width(value[i]) - followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) - - if i == 0 { - switch value[i] { - case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': - flow_indicators = true - block_indicators = true - case '?', ':': - flow_indicators = true - if followed_by_whitespace { - block_indicators = true - } - case '-': - if followed_by_whitespace { - flow_indicators = true - block_indicators = true - } - } - } else { - switch value[i] { - case ',', '?', '[', ']', '{', '}': - flow_indicators = true - case ':': - flow_indicators = true - if followed_by_whitespace { - block_indicators = true - } - case '#': - if preceded_by_whitespace { - flow_indicators = true - block_indicators = true - } - } - } - - if value[i] == '\t' { - tab_characters = true - } else if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { - special_characters = true - } - if is_space(value, i) { - if i == 0 { - leading_space = true - } - if i+width(value[i]) == len(value) { - trailing_space = true - } - if previous_break { - break_space = true - } - previous_space = true - previous_break = false - } else if is_break(value, i) { - line_breaks = true - if i == 0 { - leading_break = true - } - if i+width(value[i]) == len(value) { - trailing_break = true - } - if previous_space { - space_break = true - } - previous_space = false - previous_break = true - } else { - previous_space = false - previous_break = false - } - - // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. - preceded_by_whitespace = is_blankz(value, i) - } - - emitter.scalar_data.multiline = line_breaks - emitter.scalar_data.flow_plain_allowed = true - emitter.scalar_data.block_plain_allowed = true - emitter.scalar_data.single_quoted_allowed = true - emitter.scalar_data.block_allowed = true - - if leading_space || leading_break || trailing_space || trailing_break { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - } - if trailing_space { - emitter.scalar_data.block_allowed = false - } - if break_space { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - emitter.scalar_data.single_quoted_allowed = false - } - if space_break || tab_characters || special_characters { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - emitter.scalar_data.single_quoted_allowed = false - } - if space_break || special_characters { - emitter.scalar_data.block_allowed = false - } - if line_breaks { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - } - if flow_indicators { - emitter.scalar_data.flow_plain_allowed = false - } - if block_indicators { - emitter.scalar_data.block_plain_allowed = false - } - return true -} - -// Check if the event data is valid. -func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { - - emitter.anchor_data.anchor = nil - emitter.tag_data.handle = nil - emitter.tag_data.suffix = nil - emitter.scalar_data.value = nil - - if len(event.head_comment) > 0 { - emitter.head_comment = event.head_comment - } - if len(event.line_comment) > 0 { - emitter.line_comment = event.line_comment - } - if len(event.foot_comment) > 0 { - emitter.foot_comment = event.foot_comment - } - if len(event.tail_comment) > 0 { - emitter.tail_comment = event.tail_comment - } - - switch event.typ { - case yaml_ALIAS_EVENT: - if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { - return false - } - - case yaml_SCALAR_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - if !yaml_emitter_analyze_scalar(emitter, event.value) { - return false - } - - case yaml_SEQUENCE_START_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - - case yaml_MAPPING_START_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - } - return true -} - -// Write the BOM character. -func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { - if !flush(emitter) { - return false - } - pos := emitter.buffer_pos - emitter.buffer[pos+0] = '\xEF' - emitter.buffer[pos+1] = '\xBB' - emitter.buffer[pos+2] = '\xBF' - emitter.buffer_pos += 3 - return true -} - -func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { - indent := emitter.indent - if indent < 0 { - indent = 0 - } - if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { - if !put_break(emitter) { - return false - } - } - if emitter.foot_indent == indent { - if !put_break(emitter) { - return false - } - } - for emitter.column < indent { - if !put(emitter, ' ') { - return false - } - } - emitter.whitespace = true - //emitter.indention = true - emitter.space_above = false - emitter.foot_indent = -1 - return true -} - -func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { - if need_whitespace && !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - if !write_all(emitter, indicator) { - return false - } - emitter.whitespace = is_whitespace - emitter.indention = (emitter.indention && is_indention) - emitter.open_ended = false - return true -} - -func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { - if !write_all(emitter, value) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { - if !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - if !write_all(emitter, value) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { - if need_whitespace && !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - for i := 0; i < len(value); { - var must_write bool - switch value[i] { - case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': - must_write = true - default: - must_write = is_alpha(value, i) - } - if must_write { - if !write(emitter, value, &i) { - return false - } - } else { - w := width(value[i]) - for k := 0; k < w; k++ { - octet := value[i] - i++ - if !put(emitter, '%') { - return false - } - - c := octet >> 4 - if c < 10 { - c += '0' - } else { - c += 'A' - 10 - } - if !put(emitter, c) { - return false - } - - c = octet & 0x0f - if c < 10 { - c += '0' - } else { - c += 'A' - 10 - } - if !put(emitter, c) { - return false - } - } - } - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - if len(value) > 0 && !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - - spaces := false - breaks := false - for i := 0; i < len(value); { - if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - spaces = true - } else if is_break(value, i) { - if !breaks && value[i] == '\n' { - if !put_break(emitter) { - return false - } - } - if !write_break(emitter, value, &i) { - return false - } - //emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - spaces = false - breaks = false - } - } - - if len(value) > 0 { - emitter.whitespace = false - } - emitter.indention = false - if emitter.root_context { - emitter.open_ended = true - } - - return true -} - -func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - - if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { - return false - } - - spaces := false - breaks := false - for i := 0; i < len(value); { - if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - spaces = true - } else if is_break(value, i) { - if !breaks && value[i] == '\n' { - if !put_break(emitter) { - return false - } - } - if !write_break(emitter, value, &i) { - return false - } - //emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if value[i] == '\'' { - if !put(emitter, '\'') { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - spaces = false - breaks = false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - spaces := false - if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { - return false - } - - for i := 0; i < len(value); { - if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || - is_bom(value, i) || is_break(value, i) || - value[i] == '"' || value[i] == '\\' { - - octet := value[i] - - var w int - var v rune - switch { - case octet&0x80 == 0x00: - w, v = 1, rune(octet&0x7F) - case octet&0xE0 == 0xC0: - w, v = 2, rune(octet&0x1F) - case octet&0xF0 == 0xE0: - w, v = 3, rune(octet&0x0F) - case octet&0xF8 == 0xF0: - w, v = 4, rune(octet&0x07) - } - for k := 1; k < w; k++ { - octet = value[i+k] - v = (v << 6) + (rune(octet) & 0x3F) - } - i += w - - if !put(emitter, '\\') { - return false - } - - var ok bool - switch v { - case 0x00: - ok = put(emitter, '0') - case 0x07: - ok = put(emitter, 'a') - case 0x08: - ok = put(emitter, 'b') - case 0x09: - ok = put(emitter, 't') - case 0x0A: - ok = put(emitter, 'n') - case 0x0b: - ok = put(emitter, 'v') - case 0x0c: - ok = put(emitter, 'f') - case 0x0d: - ok = put(emitter, 'r') - case 0x1b: - ok = put(emitter, 'e') - case 0x22: - ok = put(emitter, '"') - case 0x5c: - ok = put(emitter, '\\') - case 0x85: - ok = put(emitter, 'N') - case 0xA0: - ok = put(emitter, '_') - case 0x2028: - ok = put(emitter, 'L') - case 0x2029: - ok = put(emitter, 'P') - default: - if v <= 0xFF { - ok = put(emitter, 'x') - w = 2 - } else if v <= 0xFFFF { - ok = put(emitter, 'u') - w = 4 - } else { - ok = put(emitter, 'U') - w = 8 - } - for k := (w - 1) * 4; ok && k >= 0; k -= 4 { - digit := byte((v >> uint(k)) & 0x0F) - if digit < 10 { - ok = put(emitter, digit+'0') - } else { - ok = put(emitter, digit+'A'-10) - } - } - } - if !ok { - return false - } - spaces = false - } else if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { - if !yaml_emitter_write_indent(emitter) { - return false - } - if is_space(value, i+1) { - if !put(emitter, '\\') { - return false - } - } - i += width(value[i]) - } else if !write(emitter, value, &i) { - return false - } - spaces = true - } else { - if !write(emitter, value, &i) { - return false - } - spaces = false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { - if is_space(value, 0) || is_break(value, 0) { - indent_hint := []byte{'0' + byte(emitter.best_indent)} - if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { - return false - } - } - - emitter.open_ended = false - - var chomp_hint [1]byte - if len(value) == 0 { - chomp_hint[0] = '-' - } else { - i := len(value) - 1 - for value[i]&0xC0 == 0x80 { - i-- - } - if !is_break(value, i) { - chomp_hint[0] = '-' - } else if i == 0 { - chomp_hint[0] = '+' - emitter.open_ended = true - } else { - i-- - for value[i]&0xC0 == 0x80 { - i-- - } - if is_break(value, i) { - chomp_hint[0] = '+' - emitter.open_ended = true - } - } - } - if chomp_hint[0] != 0 { - if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { - return false - } - } - return true -} - -func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { - if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { - return false - } - if !yaml_emitter_write_block_scalar_hints(emitter, value) { - return false - } - if !put_break(emitter) { - return false - } - //emitter.indention = true - emitter.whitespace = true - breaks := true - for i := 0; i < len(value); { - if is_break(value, i) { - if !write_break(emitter, value, &i) { - return false - } - //emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - breaks = false - } - } - - return true -} - -func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { - if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { - return false - } - if !yaml_emitter_write_block_scalar_hints(emitter, value) { - return false - } - - if !put_break(emitter) { - return false - } - //emitter.indention = true - emitter.whitespace = true - - breaks := true - leading_spaces := true - for i := 0; i < len(value); { - if is_break(value, i) { - if !breaks && !leading_spaces && value[i] == '\n' { - k := 0 - for is_break(value, k) { - k += width(value[k]) - } - if !is_blankz(value, k) { - if !put_break(emitter) { - return false - } - } - } - if !write_break(emitter, value, &i) { - return false - } - //emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - leading_spaces = is_blank(value, i) - } - if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - emitter.indention = false - breaks = false - } - } - return true -} - -func yaml_emitter_write_comment(emitter *yaml_emitter_t, comment []byte) bool { - breaks := false - pound := false - for i := 0; i < len(comment); { - if is_break(comment, i) { - if !write_break(emitter, comment, &i) { - return false - } - //emitter.indention = true - breaks = true - pound = false - } else { - if breaks && !yaml_emitter_write_indent(emitter) { - return false - } - if !pound { - if comment[i] != '#' && (!put(emitter, '#') || !put(emitter, ' ')) { - return false - } - pound = true - } - if !write(emitter, comment, &i) { - return false - } - emitter.indention = false - breaks = false - } - } - if !breaks && !put_break(emitter) { - return false - } - - emitter.whitespace = true - //emitter.indention = true - return true -} diff --git a/vendor/gopkg.in/yaml.v3/encode.go b/vendor/gopkg.in/yaml.v3/encode.go deleted file mode 100644 index 1f37271c..00000000 --- a/vendor/gopkg.in/yaml.v3/encode.go +++ /dev/null @@ -1,561 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package yaml - -import ( - "encoding" - "fmt" - "io" - "reflect" - "regexp" - "sort" - "strconv" - "strings" - "time" - "unicode/utf8" -) - -type encoder struct { - emitter yaml_emitter_t - event yaml_event_t - out []byte - flow bool - indent int - doneInit bool -} - -func newEncoder() *encoder { - e := &encoder{} - yaml_emitter_initialize(&e.emitter) - yaml_emitter_set_output_string(&e.emitter, &e.out) - yaml_emitter_set_unicode(&e.emitter, true) - return e -} - -func newEncoderWithWriter(w io.Writer) *encoder { - e := &encoder{} - yaml_emitter_initialize(&e.emitter) - yaml_emitter_set_output_writer(&e.emitter, w) - yaml_emitter_set_unicode(&e.emitter, true) - return e -} - -func (e *encoder) init() { - if e.doneInit { - return - } - if e.indent == 0 { - e.indent = 4 - } - e.emitter.best_indent = e.indent - yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING) - e.emit() - e.doneInit = true -} - -func (e *encoder) finish() { - e.emitter.open_ended = false - yaml_stream_end_event_initialize(&e.event) - e.emit() -} - -func (e *encoder) destroy() { - yaml_emitter_delete(&e.emitter) -} - -func (e *encoder) emit() { - // This will internally delete the e.event value. - e.must(yaml_emitter_emit(&e.emitter, &e.event)) -} - -func (e *encoder) must(ok bool) { - if !ok { - msg := e.emitter.problem - if msg == "" { - msg = "unknown problem generating YAML content" - } - failf("%s", msg) - } -} - -func (e *encoder) marshalDoc(tag string, in reflect.Value) { - e.init() - var node *Node - if in.IsValid() { - node, _ = in.Interface().(*Node) - } - if node != nil && node.Kind == DocumentNode { - e.nodev(in) - } else { - yaml_document_start_event_initialize(&e.event, nil, nil, true) - e.emit() - e.marshal(tag, in) - yaml_document_end_event_initialize(&e.event, true) - e.emit() - } -} - -func (e *encoder) marshal(tag string, in reflect.Value) { - tag = shortTag(tag) - if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { - e.nilv() - return - } - iface := in.Interface() - switch value := iface.(type) { - case *Node: - e.nodev(in) - return - case time.Time: - e.timev(tag, in) - return - case *time.Time: - e.timev(tag, in.Elem()) - return - case time.Duration: - e.stringv(tag, reflect.ValueOf(value.String())) - return - case Marshaler: - v, err := value.MarshalYAML() - if err != nil { - fail(err) - } - if v == nil { - e.nilv() - return - } - e.marshal(tag, reflect.ValueOf(v)) - return - case encoding.TextMarshaler: - text, err := value.MarshalText() - if err != nil { - fail(err) - } - in = reflect.ValueOf(string(text)) - case nil: - e.nilv() - return - } - switch in.Kind() { - case reflect.Interface: - e.marshal(tag, in.Elem()) - case reflect.Map: - e.mapv(tag, in) - case reflect.Ptr: - e.marshal(tag, in.Elem()) - case reflect.Struct: - e.structv(tag, in) - case reflect.Slice, reflect.Array: - e.slicev(tag, in) - case reflect.String: - e.stringv(tag, in) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - e.intv(tag, in) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - e.uintv(tag, in) - case reflect.Float32, reflect.Float64: - e.floatv(tag, in) - case reflect.Bool: - e.boolv(tag, in) - default: - panic("cannot marshal type: " + in.Type().String()) - } -} - -func (e *encoder) mapv(tag string, in reflect.Value) { - e.mappingv(tag, func() { - keys := keyList(in.MapKeys()) - sort.Sort(keys) - for _, k := range keys { - e.marshal("", k) - e.marshal("", in.MapIndex(k)) - } - }) -} - -func (e *encoder) fieldByIndex(v reflect.Value, index []int) (field reflect.Value) { - for _, num := range index { - for { - if v.Kind() == reflect.Ptr { - if v.IsNil() { - return reflect.Value{} - } - v = v.Elem() - continue - } - break - } - v = v.Field(num) - } - return v -} - -func (e *encoder) structv(tag string, in reflect.Value) { - sinfo, err := getStructInfo(in.Type()) - if err != nil { - panic(err) - } - e.mappingv(tag, func() { - for _, info := range sinfo.FieldsList { - var value reflect.Value - if info.Inline == nil { - value = in.Field(info.Num) - } else { - value = e.fieldByIndex(in, info.Inline) - if !value.IsValid() { - continue - } - } - if info.OmitEmpty && isZero(value) { - continue - } - e.marshal("", reflect.ValueOf(info.Key)) - e.flow = info.Flow - e.marshal("", value) - } - if sinfo.InlineMap >= 0 { - m := in.Field(sinfo.InlineMap) - if m.Len() > 0 { - e.flow = false - keys := keyList(m.MapKeys()) - sort.Sort(keys) - for _, k := range keys { - if _, found := sinfo.FieldsMap[k.String()]; found { - panic(fmt.Sprintf("cannot have key %q in inlined map: conflicts with struct field", k.String())) - } - e.marshal("", k) - e.flow = false - e.marshal("", m.MapIndex(k)) - } - } - } - }) -} - -func (e *encoder) mappingv(tag string, f func()) { - implicit := tag == "" - style := yaml_BLOCK_MAPPING_STYLE - if e.flow { - e.flow = false - style = yaml_FLOW_MAPPING_STYLE - } - yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style) - e.emit() - f() - yaml_mapping_end_event_initialize(&e.event) - e.emit() -} - -func (e *encoder) slicev(tag string, in reflect.Value) { - implicit := tag == "" - style := yaml_BLOCK_SEQUENCE_STYLE - if e.flow { - e.flow = false - style = yaml_FLOW_SEQUENCE_STYLE - } - e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) - e.emit() - n := in.Len() - for i := 0; i < n; i++ { - e.marshal("", in.Index(i)) - } - e.must(yaml_sequence_end_event_initialize(&e.event)) - e.emit() -} - -// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. -// -// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported -// in YAML 1.2 and by this package, but these should be marshalled quoted for -// the time being for compatibility with other parsers. -func isBase60Float(s string) (result bool) { - // Fast path. - if s == "" { - return false - } - c := s[0] - if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { - return false - } - // Do the full match. - return base60float.MatchString(s) -} - -// From http://yaml.org/type/float.html, except the regular expression there -// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. -var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) - -// isOldBool returns whether s is bool notation as defined in YAML 1.1. -// -// We continue to force strings that YAML 1.1 would interpret as booleans to be -// rendered as quotes strings so that the marshalled output valid for YAML 1.1 -// parsing. -func isOldBool(s string) (result bool) { - switch s { - case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON", - "n", "N", "no", "No", "NO", "off", "Off", "OFF": - return true - default: - return false - } -} - -func (e *encoder) stringv(tag string, in reflect.Value) { - var style yaml_scalar_style_t - s := in.String() - canUsePlain := true - switch { - case !utf8.ValidString(s): - if tag == binaryTag { - failf("explicitly tagged !!binary data must be base64-encoded") - } - if tag != "" { - failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) - } - // It can't be encoded directly as YAML so use a binary tag - // and encode it as base64. - tag = binaryTag - s = encodeBase64(s) - case tag == "": - // Check to see if it would resolve to a specific - // tag when encoded unquoted. If it doesn't, - // there's no need to quote it. - rtag, _ := resolve("", s) - canUsePlain = rtag == strTag && !(isBase60Float(s) || isOldBool(s)) - } - // Note: it's possible for user code to emit invalid YAML - // if they explicitly specify a tag and a string containing - // text that's incompatible with that tag. - switch { - case strings.Contains(s, "\n"): - if e.flow { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } else { - style = yaml_LITERAL_SCALAR_STYLE - } - case canUsePlain: - style = yaml_PLAIN_SCALAR_STYLE - default: - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - e.emitScalar(s, "", tag, style, nil, nil, nil, nil) -} - -func (e *encoder) boolv(tag string, in reflect.Value) { - var s string - if in.Bool() { - s = "true" - } else { - s = "false" - } - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) intv(tag string, in reflect.Value) { - s := strconv.FormatInt(in.Int(), 10) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) uintv(tag string, in reflect.Value) { - s := strconv.FormatUint(in.Uint(), 10) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) timev(tag string, in reflect.Value) { - t := in.Interface().(time.Time) - s := t.Format(time.RFC3339Nano) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) floatv(tag string, in reflect.Value) { - // Issue #352: When formatting, use the precision of the underlying value - precision := 64 - if in.Kind() == reflect.Float32 { - precision = 32 - } - - s := strconv.FormatFloat(in.Float(), 'g', -1, precision) - switch s { - case "+Inf": - s = ".inf" - case "-Inf": - s = "-.inf" - case "NaN": - s = ".nan" - } - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) nilv() { - e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t, head, line, foot, tail []byte) { - // TODO Kill this function. Replace all initialize calls by their underlining Go literals. - implicit := tag == "" - if !implicit { - tag = longTag(tag) - } - e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) - e.event.head_comment = head - e.event.line_comment = line - e.event.foot_comment = foot - e.event.tail_comment = tail - e.emit() -} - -func (e *encoder) nodev(in reflect.Value) { - e.node(in.Interface().(*Node), "") -} - -func (e *encoder) node(node *Node, tail string) { - // If the tag was not explicitly requested, and dropping it won't change the - // implicit tag of the value, don't include it in the presentation. - var tag = node.Tag - var stag = shortTag(tag) - var rtag string - var forceQuoting bool - if tag != "" && node.Style&TaggedStyle == 0 { - if node.Kind == ScalarNode { - if stag == strTag && node.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0 { - tag = "" - } else { - rtag, _ = resolve("", node.Value) - if rtag == stag { - tag = "" - } else if stag == strTag { - tag = "" - forceQuoting = true - } - } - } else { - switch node.Kind { - case MappingNode: - rtag = mapTag - case SequenceNode: - rtag = seqTag - } - if rtag == stag { - tag = "" - } - } - } - - switch node.Kind { - case DocumentNode: - yaml_document_start_event_initialize(&e.event, nil, nil, true) - e.event.head_comment = []byte(node.HeadComment) - e.emit() - for _, node := range node.Content { - e.node(node, "") - } - yaml_document_end_event_initialize(&e.event, true) - e.event.foot_comment = []byte(node.FootComment) - e.emit() - - case SequenceNode: - style := yaml_BLOCK_SEQUENCE_STYLE - if node.Style&FlowStyle != 0 { - style = yaml_FLOW_SEQUENCE_STYLE - } - e.must(yaml_sequence_start_event_initialize(&e.event, []byte(node.Anchor), []byte(tag), tag == "", style)) - e.event.head_comment = []byte(node.HeadComment) - e.emit() - for _, node := range node.Content { - e.node(node, "") - } - e.must(yaml_sequence_end_event_initialize(&e.event)) - e.event.line_comment = []byte(node.LineComment) - e.event.foot_comment = []byte(node.FootComment) - e.emit() - - case MappingNode: - style := yaml_BLOCK_MAPPING_STYLE - if node.Style&FlowStyle != 0 { - style = yaml_FLOW_MAPPING_STYLE - } - yaml_mapping_start_event_initialize(&e.event, []byte(node.Anchor), []byte(tag), tag == "", style) - e.event.tail_comment = []byte(tail) - e.event.head_comment = []byte(node.HeadComment) - e.emit() - - // The tail logic below moves the foot comment of prior keys to the following key, - // since the value for each key may be a nested structure and the foot needs to be - // processed only the entirety of the value is streamed. The last tail is processed - // with the mapping end event. - var tail string - for i := 0; i+1 < len(node.Content); i += 2 { - k := node.Content[i] - foot := k.FootComment - if foot != "" { - kopy := *k - kopy.FootComment = "" - k = &kopy - } - e.node(k, tail) - tail = foot - - v := node.Content[i+1] - e.node(v, "") - } - - yaml_mapping_end_event_initialize(&e.event) - e.event.tail_comment = []byte(tail) - e.event.line_comment = []byte(node.LineComment) - e.event.foot_comment = []byte(node.FootComment) - e.emit() - - case AliasNode: - yaml_alias_event_initialize(&e.event, []byte(node.Value)) - e.event.head_comment = []byte(node.HeadComment) - e.event.line_comment = []byte(node.LineComment) - e.event.foot_comment = []byte(node.FootComment) - e.emit() - - case ScalarNode: - value := node.Value - if !utf8.ValidString(value) { - if tag == binaryTag { - failf("explicitly tagged !!binary data must be base64-encoded") - } - if tag != "" { - failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) - } - // It can't be encoded directly as YAML so use a binary tag - // and encode it as base64. - tag = binaryTag - value = encodeBase64(value) - } - - style := yaml_PLAIN_SCALAR_STYLE - switch { - case node.Style&DoubleQuotedStyle != 0: - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - case node.Style&SingleQuotedStyle != 0: - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - case node.Style&LiteralStyle != 0: - style = yaml_LITERAL_SCALAR_STYLE - case node.Style&FoldedStyle != 0: - style = yaml_FOLDED_SCALAR_STYLE - case strings.Contains(value, "\n"): - style = yaml_LITERAL_SCALAR_STYLE - case forceQuoting: - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - - e.emitScalar(value, node.Anchor, tag, style, []byte(node.HeadComment), []byte(node.LineComment), []byte(node.FootComment), []byte(tail)) - } -} diff --git a/vendor/gopkg.in/yaml.v3/go.mod b/vendor/gopkg.in/yaml.v3/go.mod deleted file mode 100644 index f407ea32..00000000 --- a/vendor/gopkg.in/yaml.v3/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module "gopkg.in/yaml.v3" - -require ( - "gopkg.in/check.v1" v0.0.0-20161208181325-20d25e280405 -) diff --git a/vendor/gopkg.in/yaml.v3/parserc.go b/vendor/gopkg.in/yaml.v3/parserc.go deleted file mode 100644 index aea9050b..00000000 --- a/vendor/gopkg.in/yaml.v3/parserc.go +++ /dev/null @@ -1,1229 +0,0 @@ -// -// 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 -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "bytes" -) - -// The parser implements the following grammar: -// -// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END -// implicit_document ::= block_node DOCUMENT-END* -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// block_node_or_indentless_sequence ::= -// ALIAS -// | properties (block_content | indentless_block_sequence)? -// | block_content -// | indentless_block_sequence -// block_node ::= ALIAS -// | properties block_content? -// | block_content -// flow_node ::= ALIAS -// | properties flow_content? -// | flow_content -// properties ::= TAG ANCHOR? | ANCHOR TAG? -// block_content ::= block_collection | flow_collection | SCALAR -// flow_content ::= flow_collection | SCALAR -// block_collection ::= block_sequence | block_mapping -// flow_collection ::= flow_sequence | flow_mapping -// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END -// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ -// block_mapping ::= BLOCK-MAPPING_START -// ((KEY block_node_or_indentless_sequence?)? -// (VALUE block_node_or_indentless_sequence?)?)* -// BLOCK-END -// flow_sequence ::= FLOW-SEQUENCE-START -// (flow_sequence_entry FLOW-ENTRY)* -// flow_sequence_entry? -// FLOW-SEQUENCE-END -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// flow_mapping ::= FLOW-MAPPING-START -// (flow_mapping_entry FLOW-ENTRY)* -// flow_mapping_entry? -// FLOW-MAPPING-END -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? - -// Peek the next token in the token queue. -func peek_token(parser *yaml_parser_t) *yaml_token_t { - if parser.token_available || yaml_parser_fetch_more_tokens(parser) { - token := &parser.tokens[parser.tokens_head] - yaml_parser_unfold_comments(parser, token) - return token - } - return nil -} - -// yaml_parser_unfold_comments walks through the comments queue and joins all -// comments behind the position of the provided token into the respective -// top-level comment slices in the parser. -func yaml_parser_unfold_comments(parser *yaml_parser_t, token *yaml_token_t) { - for parser.comments_head < len(parser.comments) && token.start_mark.index >= parser.comments[parser.comments_head].token_mark.index { - comment := &parser.comments[parser.comments_head] - if len(comment.head) > 0 { - if token.typ == yaml_BLOCK_END_TOKEN { - // No heads on ends, so keep comment.head for a follow up token. - break - } - if len(parser.head_comment) > 0 { - parser.head_comment = append(parser.head_comment, '\n') - } - parser.head_comment = append(parser.head_comment, comment.head...) - } - if len(comment.foot) > 0 { - if len(parser.foot_comment) > 0 { - parser.foot_comment = append(parser.foot_comment, '\n') - } - parser.foot_comment = append(parser.foot_comment, comment.foot...) - } - if len(comment.line) > 0 { - if len(parser.line_comment) > 0 { - parser.line_comment = append(parser.line_comment, '\n') - } - parser.line_comment = append(parser.line_comment, comment.line...) - } - *comment = yaml_comment_t{} - parser.comments_head++ - } -} - -// Remove the next token from the queue (must be called after peek_token). -func skip_token(parser *yaml_parser_t) { - parser.token_available = false - parser.tokens_parsed++ - parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN - parser.tokens_head++ -} - -// Get the next event. -func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { - // Erase the event object. - *event = yaml_event_t{} - - // No events after the end of the stream or error. - if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { - return true - } - - // Generate the next event. - return yaml_parser_state_machine(parser, event) -} - -// Set parser error. -func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { - parser.error = yaml_PARSER_ERROR - parser.problem = problem - parser.problem_mark = problem_mark - return false -} - -func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { - parser.error = yaml_PARSER_ERROR - parser.context = context - parser.context_mark = context_mark - parser.problem = problem - parser.problem_mark = problem_mark - return false -} - -// State dispatcher. -func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { - //trace("yaml_parser_state_machine", "state:", parser.state.String()) - - switch parser.state { - case yaml_PARSE_STREAM_START_STATE: - return yaml_parser_parse_stream_start(parser, event) - - case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: - return yaml_parser_parse_document_start(parser, event, true) - - case yaml_PARSE_DOCUMENT_START_STATE: - return yaml_parser_parse_document_start(parser, event, false) - - case yaml_PARSE_DOCUMENT_CONTENT_STATE: - return yaml_parser_parse_document_content(parser, event) - - case yaml_PARSE_DOCUMENT_END_STATE: - return yaml_parser_parse_document_end(parser, event) - - case yaml_PARSE_BLOCK_NODE_STATE: - return yaml_parser_parse_node(parser, event, true, false) - - case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: - return yaml_parser_parse_node(parser, event, true, true) - - case yaml_PARSE_FLOW_NODE_STATE: - return yaml_parser_parse_node(parser, event, false, false) - - case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: - return yaml_parser_parse_block_sequence_entry(parser, event, true) - - case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_block_sequence_entry(parser, event, false) - - case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_indentless_sequence_entry(parser, event) - - case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: - return yaml_parser_parse_block_mapping_key(parser, event, true) - - case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: - return yaml_parser_parse_block_mapping_key(parser, event, false) - - case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: - return yaml_parser_parse_block_mapping_value(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: - return yaml_parser_parse_flow_sequence_entry(parser, event, true) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_flow_sequence_entry(parser, event, false) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) - - case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: - return yaml_parser_parse_flow_mapping_key(parser, event, true) - - case yaml_PARSE_FLOW_MAPPING_KEY_STATE: - return yaml_parser_parse_flow_mapping_key(parser, event, false) - - case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: - return yaml_parser_parse_flow_mapping_value(parser, event, false) - - case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: - return yaml_parser_parse_flow_mapping_value(parser, event, true) - - default: - panic("invalid parser state") - } -} - -// 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 { - return false - } - if token.typ != yaml_STREAM_START_TOKEN { - return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark) - } - parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE - *event = yaml_event_t{ - typ: yaml_STREAM_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - encoding: token.encoding, - } - skip_token(parser) - return true -} - -// 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) - if token == nil { - return false - } - - // Parse extra document end indicators. - if !implicit { - for token.typ == yaml_DOCUMENT_END_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } - - if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && - token.typ != yaml_TAG_DIRECTIVE_TOKEN && - token.typ != yaml_DOCUMENT_START_TOKEN && - token.typ != yaml_STREAM_END_TOKEN { - // Parse an implicit document. - if !yaml_parser_process_directives(parser, nil, nil) { - return false - } - parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) - parser.state = yaml_PARSE_BLOCK_NODE_STATE - - var head_comment []byte - if len(parser.head_comment) > 0 { - // [Go] Scan the header comment backwards, and if an empty line is found, break - // the header so the part before the last empty line goes into the - // document header, while the bottom of it goes into a follow up event. - for i := len(parser.head_comment) - 1; i > 0; i-- { - if parser.head_comment[i] == '\n' { - if i == len(parser.head_comment)-1 { - head_comment = parser.head_comment[:i] - parser.head_comment = parser.head_comment[i+1:] - break - } else if parser.head_comment[i-1] == '\n' { - head_comment = parser.head_comment[:i-1] - parser.head_comment = parser.head_comment[i+1:] - break - } - } - } - } - - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - - head_comment: head_comment, - } - - } else if token.typ != yaml_STREAM_END_TOKEN { - // Parse an explicit document. - var version_directive *yaml_version_directive_t - var tag_directives []yaml_tag_directive_t - start_mark := token.start_mark - if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { - return false - } - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_DOCUMENT_START_TOKEN { - yaml_parser_set_parser_error(parser, - "did not find expected ", token.start_mark) - return false - } - parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) - parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE - end_mark := token.end_mark - - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - version_directive: version_directive, - tag_directives: tag_directives, - implicit: false, - } - skip_token(parser) - - } else { - // Parse the stream end. - parser.state = yaml_PARSE_END_STATE - *event = yaml_event_t{ - typ: yaml_STREAM_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - skip_token(parser) - } - - return true -} - -// 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 { - return false - } - - if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || - token.typ == yaml_TAG_DIRECTIVE_TOKEN || - token.typ == yaml_DOCUMENT_START_TOKEN || - token.typ == yaml_DOCUMENT_END_TOKEN || - token.typ == yaml_STREAM_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - return yaml_parser_process_empty_scalar(parser, event, - token.start_mark) - } - return yaml_parser_parse_node(parser, event, true, false) -} - -// 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 { - return false - } - - start_mark := token.start_mark - end_mark := token.start_mark - - implicit := true - if token.typ == yaml_DOCUMENT_END_TOKEN { - end_mark = token.end_mark - skip_token(parser) - implicit = false - } - - parser.tag_directives = parser.tag_directives[:0] - - parser.state = yaml_PARSE_DOCUMENT_START_STATE - *event = yaml_event_t{ - typ: yaml_DOCUMENT_END_EVENT, - start_mark: start_mark, - end_mark: end_mark, - implicit: implicit, - } - yaml_parser_set_event_comments(parser, event) - if len(event.head_comment) > 0 && len(event.foot_comment) == 0 { - event.foot_comment = event.head_comment - event.head_comment = nil - } - return true -} - -func yaml_parser_set_event_comments(parser *yaml_parser_t, event *yaml_event_t) { - event.head_comment = parser.head_comment - event.line_comment = parser.line_comment - event.foot_comment = parser.foot_comment - parser.head_comment = nil - parser.line_comment = nil - parser.foot_comment = nil - parser.tail_comment = nil - parser.stem_comment = nil -} - -// Parse the productions: -// block_node_or_indentless_sequence ::= -// ALIAS -// ***** -// | properties (block_content | indentless_block_sequence)? -// ********** * -// | block_content | indentless_block_sequence -// * -// block_node ::= ALIAS -// ***** -// | properties block_content? -// ********** * -// | block_content -// * -// flow_node ::= ALIAS -// ***** -// | 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)() - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_ALIAS_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - *event = yaml_event_t{ - typ: yaml_ALIAS_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - anchor: token.value, - } - yaml_parser_set_event_comments(parser, event) - skip_token(parser) - return true - } - - start_mark := token.start_mark - end_mark := token.start_mark - - var tag_token bool - var tag_handle, tag_suffix, anchor []byte - var tag_mark yaml_mark_t - if token.typ == yaml_ANCHOR_TOKEN { - anchor = token.value - start_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_TAG_TOKEN { - tag_token = true - tag_handle = token.value - tag_suffix = token.suffix - tag_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } else if token.typ == yaml_TAG_TOKEN { - tag_token = true - tag_handle = token.value - tag_suffix = token.suffix - start_mark = token.start_mark - tag_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_ANCHOR_TOKEN { - anchor = token.value - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } - - var tag []byte - if tag_token { - if len(tag_handle) == 0 { - tag = tag_suffix - tag_suffix = nil - } else { - for i := range parser.tag_directives { - if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { - tag = append([]byte(nil), parser.tag_directives[i].prefix...) - tag = append(tag, tag_suffix...) - break - } - } - if len(tag) == 0 { - yaml_parser_set_parser_error_context(parser, - "while parsing a node", start_mark, - "found undefined tag handle", tag_mark) - return false - } - } - } - - implicit := len(tag) == 0 - if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), - } - return true - } - if token.typ == yaml_SCALAR_TOKEN { - var plain_implicit, quoted_implicit bool - end_mark = token.end_mark - if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { - plain_implicit = true - } else if len(tag) == 0 { - quoted_implicit = true - } - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - value: token.value, - implicit: plain_implicit, - quoted_implicit: quoted_implicit, - style: yaml_style_t(token.style), - } - yaml_parser_set_event_comments(parser, event) - skip_token(parser) - return true - } - if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { - // [Go] Some of the events below can be merged as they differ only on style. - end_mark = token.end_mark - parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), - } - yaml_parser_set_event_comments(parser, event) - return true - } - if token.typ == yaml_FLOW_MAPPING_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), - } - yaml_parser_set_event_comments(parser, event) - return true - } - if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), - } - if parser.stem_comment != nil { - event.head_comment = parser.stem_comment - parser.stem_comment = nil - } - return true - } - if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), - } - return true - } - if len(anchor) > 0 || len(tag) > 0 { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - quoted_implicit: false, - style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), - } - return true - } - - context := "while parsing a flow node" - if block { - context = "while parsing a block node" - } - yaml_parser_set_parser_error_context(parser, context, start_mark, - "did not find expected node content", token.start_mark) - return false -} - -// 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) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_BLOCK_ENTRY_TOKEN { - mark := token.end_mark - prior_head := len(parser.head_comment) - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if prior_head > 0 && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { - // [Go] It's a sequence under a sequence entry, so the former head comment - // is for the list itself, not the first list item under it. - parser.stem_comment = parser.head_comment[:prior_head] - if len(parser.head_comment) == prior_head { - parser.head_comment = nil - } else { - // Copy suffix to prevent very strange bugs if someone ever appends - // further bytes to the prefix in the stem_comment slice above. - parser.head_comment = append([]byte(nil), parser.head_comment[prior_head+1:]...) - } - - } - if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, true, false) - } else { - parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - } - if token.typ == yaml_BLOCK_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - - skip_token(parser) - return true - } - - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a block collection", context_mark, - "did not find expected '-' indicator", token.start_mark) -} - -// 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 { - return false - } - - if token.typ == yaml_BLOCK_ENTRY_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_BLOCK_ENTRY_TOKEN && - token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, true, false) - } - parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? - } - return true -} - -// Parse the productions: -// block_mapping ::= BLOCK-MAPPING_START -// ******************* -// ((KEY block_node_or_indentless_sequence?)? -// *** * -// (VALUE block_node_or_indentless_sequence?)?)* -// -// 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) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - // [Go] A tail comment was left from the prior mapping value processed. Emit an event - // as it needs to be processed with that value and not the following key. - if len(parser.tail_comment) > 0 { - *event = yaml_event_t{ - typ: yaml_TAIL_COMMENT_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - foot_comment: parser.tail_comment, - } - parser.tail_comment = nil - return true - } - - if token.typ == yaml_KEY_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, true, true) - } else { - parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - } else if token.typ == yaml_BLOCK_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - yaml_parser_set_event_comments(parser, event) - skip_token(parser) - return true - } - - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a block mapping", context_mark, - "did not find expected key", token.start_mark) -} - -// Parse the productions: -// block_mapping ::= BLOCK-MAPPING_START -// -// ((KEY block_node_or_indentless_sequence?)? -// -// (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 { - return false - } - if token.typ == yaml_VALUE_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) - return yaml_parser_parse_node(parser, event, true, true) - } - parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Parse the productions: -// flow_sequence ::= FLOW-SEQUENCE-START -// ******************* -// (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) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - if !first { - if token.typ == yaml_FLOW_ENTRY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } else { - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a flow sequence", context_mark, - "did not find expected ',' or ']'", token.start_mark) - } - } - - if token.typ == yaml_KEY_TOKEN { - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - implicit: true, - style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), - } - skip_token(parser) - return true - } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - yaml_parser_set_event_comments(parser, event) - - skip_token(parser) - 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 { - return false - } - if token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_FLOW_ENTRY_TOKEN && - token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - mark := token.end_mark - skip_token(parser) - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) -} - -// 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 { - return false - } - if token.typ == yaml_VALUE_TOKEN { - skip_token(parser) - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// 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 { - return false - } - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? - } - return true -} - -// Parse the productions: -// flow_mapping ::= FLOW-MAPPING-START -// ****************** -// (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) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ != yaml_FLOW_MAPPING_END_TOKEN { - if !first { - if token.typ == yaml_FLOW_ENTRY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } else { - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a flow mapping", context_mark, - "did not find expected ',' or '}'", token.start_mark) - } - } - - if token.typ == yaml_KEY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_FLOW_ENTRY_TOKEN && - token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } else { - parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) - } - } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - yaml_parser_set_event_comments(parser, event) - skip_token(parser) - return true -} - -// 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 { - return false - } - if empty { - parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) - } - if token.typ == yaml_VALUE_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Generate an empty scalar event. -func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: mark, - end_mark: mark, - value: nil, // Empty - implicit: true, - style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), - } - return true -} - -var default_tag_directives = []yaml_tag_directive_t{ - {[]byte("!"), []byte("!")}, - {[]byte("!!"), []byte("tag:yaml.org,2002:")}, -} - -// Parse directives. -func yaml_parser_process_directives(parser *yaml_parser_t, - version_directive_ref **yaml_version_directive_t, - tag_directives_ref *[]yaml_tag_directive_t) bool { - - var version_directive *yaml_version_directive_t - var tag_directives []yaml_tag_directive_t - - token := peek_token(parser) - if token == nil { - return false - } - - for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { - if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { - if version_directive != nil { - yaml_parser_set_parser_error(parser, - "found duplicate %YAML directive", token.start_mark) - return false - } - if token.major != 1 || token.minor != 1 { - yaml_parser_set_parser_error(parser, - "found incompatible YAML document", token.start_mark) - return false - } - version_directive = &yaml_version_directive_t{ - major: token.major, - minor: token.minor, - } - } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { - value := yaml_tag_directive_t{ - handle: token.value, - prefix: token.prefix, - } - if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { - return false - } - tag_directives = append(tag_directives, value) - } - - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - - for i := range default_tag_directives { - if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { - return false - } - } - - if version_directive_ref != nil { - *version_directive_ref = version_directive - } - if tag_directives_ref != nil { - *tag_directives_ref = tag_directives - } - return true -} - -// Append a tag directive to the directives stack. -func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { - for i := range parser.tag_directives { - if bytes.Equal(value.handle, parser.tag_directives[i].handle) { - if allow_duplicates { - return true - } - return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) - } - } - - // [Go] I suspect the copy is unnecessary. This was likely done - // because there was no way to track ownership of the data. - value_copy := yaml_tag_directive_t{ - handle: make([]byte, len(value.handle)), - prefix: make([]byte, len(value.prefix)), - } - copy(value_copy.handle, value.handle) - copy(value_copy.prefix, value.prefix) - parser.tag_directives = append(parser.tag_directives, value_copy) - return true -} diff --git a/vendor/gopkg.in/yaml.v3/readerc.go b/vendor/gopkg.in/yaml.v3/readerc.go deleted file mode 100644 index b7de0a89..00000000 --- a/vendor/gopkg.in/yaml.v3/readerc.go +++ /dev/null @@ -1,434 +0,0 @@ -// -// 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 -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "io" -) - -// Set the reader error and return 0. -func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { - parser.error = yaml_READER_ERROR - parser.problem = problem - parser.problem_offset = offset - parser.problem_value = value - return false -} - -// Byte order marks. -const ( - bom_UTF8 = "\xef\xbb\xbf" - bom_UTF16LE = "\xff\xfe" - bom_UTF16BE = "\xfe\xff" -) - -// Determine the input stream encoding by checking the BOM symbol. If no BOM is -// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. -func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { - // Ensure that we had enough bytes in the raw buffer. - for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { - if !yaml_parser_update_raw_buffer(parser) { - return false - } - } - - // Determine the encoding. - buf := parser.raw_buffer - pos := parser.raw_buffer_pos - avail := len(buf) - pos - if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { - parser.encoding = yaml_UTF16LE_ENCODING - parser.raw_buffer_pos += 2 - parser.offset += 2 - } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { - parser.encoding = yaml_UTF16BE_ENCODING - parser.raw_buffer_pos += 2 - parser.offset += 2 - } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { - parser.encoding = yaml_UTF8_ENCODING - parser.raw_buffer_pos += 3 - parser.offset += 3 - } else { - parser.encoding = yaml_UTF8_ENCODING - } - return true -} - -// Update the raw buffer. -func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { - size_read := 0 - - // Return if the raw buffer is full. - if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { - return true - } - - // Return on EOF. - if parser.eof { - return true - } - - // Move the remaining bytes in the raw buffer to the beginning. - if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { - copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) - } - parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] - parser.raw_buffer_pos = 0 - - // Call the read handler to fill the buffer. - size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) - parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] - if err == io.EOF { - parser.eof = true - } else if err != nil { - return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) - } - return true -} - -// Ensure that the buffer contains at least `length` characters. -// Return true on success, false on failure. -// -// The length is supposed to be significantly less that the buffer size. -func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { - if parser.read_handler == nil { - panic("read handler must be set") - } - - // [Go] This function was changed to guarantee the requested length size at EOF. - // The fact we need to do this is pretty awful, but the description above implies - // for that to be the case, and there are tests - - // If the EOF flag is set and the raw buffer is empty, do nothing. - if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { - // [Go] ACTUALLY! Read the documentation of this function above. - // This is just broken. To return true, we need to have the - // given length in the buffer. Not doing that means every single - // check that calls this function to make sure the buffer has a - // given length is Go) panicking; or C) accessing invalid memory. - //return true - } - - // Return if the buffer contains enough characters. - if parser.unread >= length { - return true - } - - // Determine the input encoding if it is not known yet. - if parser.encoding == yaml_ANY_ENCODING { - if !yaml_parser_determine_encoding(parser) { - return false - } - } - - // Move the unread characters to the beginning of the buffer. - buffer_len := len(parser.buffer) - if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { - copy(parser.buffer, parser.buffer[parser.buffer_pos:]) - buffer_len -= parser.buffer_pos - parser.buffer_pos = 0 - } else if parser.buffer_pos == buffer_len { - buffer_len = 0 - parser.buffer_pos = 0 - } - - // Open the whole buffer for writing, and cut it before returning. - parser.buffer = parser.buffer[:cap(parser.buffer)] - - // Fill the buffer until it has enough characters. - first := true - for parser.unread < length { - - // Fill the raw buffer if necessary. - if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { - if !yaml_parser_update_raw_buffer(parser) { - parser.buffer = parser.buffer[:buffer_len] - return false - } - } - first = false - - // Decode the raw buffer. - inner: - for parser.raw_buffer_pos != len(parser.raw_buffer) { - var value rune - var width int - - raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos - - // Decode the next character. - switch parser.encoding { - case yaml_UTF8_ENCODING: - // Decode a UTF-8 character. Check RFC 3629 - // (http://www.ietf.org/rfc/rfc3629.txt) for more details. - // - // The following table (taken from the RFC) is used for - // decoding. - // - // Char. number range | UTF-8 octet sequence - // (hexadecimal) | (binary) - // --------------------+------------------------------------ - // 0000 0000-0000 007F | 0xxxxxxx - // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx - // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx - // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - // - // Additionally, the characters in the range 0xD800-0xDFFF - // are prohibited as they are reserved for use with UTF-16 - // surrogate pairs. - - // Determine the length of the UTF-8 sequence. - octet := parser.raw_buffer[parser.raw_buffer_pos] - switch { - case octet&0x80 == 0x00: - width = 1 - case octet&0xE0 == 0xC0: - width = 2 - case octet&0xF0 == 0xE0: - width = 3 - case octet&0xF8 == 0xF0: - width = 4 - default: - // The leading octet is invalid. - return yaml_parser_set_reader_error(parser, - "invalid leading UTF-8 octet", - parser.offset, int(octet)) - } - - // Check if the raw buffer contains an incomplete character. - if width > raw_unread { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-8 octet sequence", - parser.offset, -1) - } - break inner - } - - // Decode the leading octet. - switch { - case octet&0x80 == 0x00: - value = rune(octet & 0x7F) - case octet&0xE0 == 0xC0: - value = rune(octet & 0x1F) - case octet&0xF0 == 0xE0: - value = rune(octet & 0x0F) - case octet&0xF8 == 0xF0: - value = rune(octet & 0x07) - default: - value = 0 - } - - // Check and decode the trailing octets. - for k := 1; k < width; k++ { - octet = parser.raw_buffer[parser.raw_buffer_pos+k] - - // Check if the octet is valid. - if (octet & 0xC0) != 0x80 { - return yaml_parser_set_reader_error(parser, - "invalid trailing UTF-8 octet", - parser.offset+k, int(octet)) - } - - // Decode the octet. - value = (value << 6) + rune(octet&0x3F) - } - - // Check the length of the sequence against the value. - switch { - case width == 1: - case width == 2 && value >= 0x80: - case width == 3 && value >= 0x800: - case width == 4 && value >= 0x10000: - default: - return yaml_parser_set_reader_error(parser, - "invalid length of a UTF-8 sequence", - parser.offset, -1) - } - - // Check the range of the value. - if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { - return yaml_parser_set_reader_error(parser, - "invalid Unicode character", - parser.offset, int(value)) - } - - case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: - var low, high int - if parser.encoding == yaml_UTF16LE_ENCODING { - low, high = 0, 1 - } else { - low, high = 1, 0 - } - - // The UTF-16 encoding is not as simple as one might - // naively think. Check RFC 2781 - // (http://www.ietf.org/rfc/rfc2781.txt). - // - // Normally, two subsequent bytes describe a Unicode - // character. However a special technique (called a - // surrogate pair) is used for specifying character - // values larger than 0xFFFF. - // - // A surrogate pair consists of two pseudo-characters: - // high surrogate area (0xD800-0xDBFF) - // low surrogate area (0xDC00-0xDFFF) - // - // The following formulas are used for decoding - // and encoding characters using surrogate pairs: - // - // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) - // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) - // W1 = 110110yyyyyyyyyy - // W2 = 110111xxxxxxxxxx - // - // where U is the character value, W1 is the high surrogate - // area, W2 is the low surrogate area. - - // Check for incomplete UTF-16 character. - if raw_unread < 2 { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-16 character", - parser.offset, -1) - } - break inner - } - - // Get the character. - value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + - (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) - - // Check for unexpected low surrogate area. - if value&0xFC00 == 0xDC00 { - return yaml_parser_set_reader_error(parser, - "unexpected low surrogate area", - parser.offset, int(value)) - } - - // Check for a high surrogate area. - if value&0xFC00 == 0xD800 { - width = 4 - - // Check for incomplete surrogate pair. - if raw_unread < 4 { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-16 surrogate pair", - parser.offset, -1) - } - break inner - } - - // Get the next character. - value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + - (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) - - // Check for a low surrogate area. - if value2&0xFC00 != 0xDC00 { - return yaml_parser_set_reader_error(parser, - "expected low surrogate area", - parser.offset+2, int(value2)) - } - - // Generate the value of the surrogate pair. - value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) - } else { - width = 2 - } - - default: - panic("impossible") - } - - // Check if the character is in the allowed range: - // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) - // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) - // | [#x10000-#x10FFFF] (32 bit) - switch { - case value == 0x09: - case value == 0x0A: - case value == 0x0D: - case value >= 0x20 && value <= 0x7E: - case value == 0x85: - case value >= 0xA0 && value <= 0xD7FF: - case value >= 0xE000 && value <= 0xFFFD: - case value >= 0x10000 && value <= 0x10FFFF: - default: - return yaml_parser_set_reader_error(parser, - "control characters are not allowed", - parser.offset, int(value)) - } - - // Move the raw pointers. - parser.raw_buffer_pos += width - parser.offset += width - - // Finally put the character into the buffer. - if value <= 0x7F { - // 0000 0000-0000 007F . 0xxxxxxx - parser.buffer[buffer_len+0] = byte(value) - buffer_len += 1 - } else if value <= 0x7FF { - // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) - parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) - buffer_len += 2 - } else if value <= 0xFFFF { - // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) - parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) - parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) - buffer_len += 3 - } else { - // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) - parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) - parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) - parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) - buffer_len += 4 - } - - parser.unread++ - } - - // On EOF, put NUL into the buffer and return. - if parser.eof { - parser.buffer[buffer_len] = 0 - buffer_len++ - parser.unread++ - break - } - } - // [Go] Read the documentation of this function above. To return true, - // we need to have the given length in the buffer. Not doing that means - // every single check that calls this function to make sure the buffer - // has a given length is Go) panicking; or C) accessing invalid memory. - // This happens here due to the EOF above breaking early. - for buffer_len < length { - parser.buffer[buffer_len] = 0 - buffer_len++ - } - parser.buffer = parser.buffer[:buffer_len] - return true -} diff --git a/vendor/gopkg.in/yaml.v3/resolve.go b/vendor/gopkg.in/yaml.v3/resolve.go deleted file mode 100644 index 64ae8880..00000000 --- a/vendor/gopkg.in/yaml.v3/resolve.go +++ /dev/null @@ -1,326 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package yaml - -import ( - "encoding/base64" - "math" - "regexp" - "strconv" - "strings" - "time" -) - -type resolveMapItem struct { - value interface{} - tag string -} - -var resolveTable = make([]byte, 256) -var resolveMap = make(map[string]resolveMapItem) - -func init() { - t := resolveTable - t[int('+')] = 'S' // Sign - t[int('-')] = 'S' - for _, c := range "0123456789" { - t[int(c)] = 'D' // Digit - } - for _, c := range "yYnNtTfFoO~" { - t[int(c)] = 'M' // In map - } - t[int('.')] = '.' // Float (potentially in map) - - var resolveMapList = []struct { - v interface{} - tag string - l []string - }{ - {true, boolTag, []string{"true", "True", "TRUE"}}, - {false, boolTag, []string{"false", "False", "FALSE"}}, - {nil, nullTag, []string{"", "~", "null", "Null", "NULL"}}, - {math.NaN(), floatTag, []string{".nan", ".NaN", ".NAN"}}, - {math.Inf(+1), floatTag, []string{".inf", ".Inf", ".INF"}}, - {math.Inf(+1), floatTag, []string{"+.inf", "+.Inf", "+.INF"}}, - {math.Inf(-1), floatTag, []string{"-.inf", "-.Inf", "-.INF"}}, - {"<<", mergeTag, []string{"<<"}}, - } - - m := resolveMap - for _, item := range resolveMapList { - for _, s := range item.l { - m[s] = resolveMapItem{item.v, item.tag} - } - } -} - -const ( - nullTag = "!!null" - boolTag = "!!bool" - strTag = "!!str" - intTag = "!!int" - floatTag = "!!float" - timestampTag = "!!timestamp" - seqTag = "!!seq" - mapTag = "!!map" - binaryTag = "!!binary" - mergeTag = "!!merge" -) - -var longTags = make(map[string]string) -var shortTags = make(map[string]string) - -func init() { - for _, stag := range []string{nullTag, boolTag, strTag, intTag, floatTag, timestampTag, seqTag, mapTag, binaryTag, mergeTag} { - ltag := longTag(stag) - longTags[stag] = ltag - shortTags[ltag] = stag - } -} - -const longTagPrefix = "tag:yaml.org,2002:" - -func shortTag(tag string) string { - if strings.HasPrefix(tag, longTagPrefix) { - if stag, ok := shortTags[tag]; ok { - return stag - } - return "!!" + tag[len(longTagPrefix):] - } - return tag -} - -func longTag(tag string) string { - if strings.HasPrefix(tag, "!!") { - if ltag, ok := longTags[tag]; ok { - return ltag - } - return longTagPrefix + tag[2:] - } - return tag -} - -func resolvableTag(tag string) bool { - switch tag { - case "", strTag, boolTag, intTag, floatTag, nullTag, timestampTag: - return true - } - return false -} - -var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`) - -func resolve(tag string, in string) (rtag string, out interface{}) { - tag = shortTag(tag) - if !resolvableTag(tag) { - return tag, in - } - - defer func() { - switch tag { - case "", rtag, strTag, binaryTag: - return - case floatTag: - if rtag == intTag { - switch v := out.(type) { - case int64: - rtag = floatTag - out = float64(v) - return - case int: - rtag = floatTag - out = float64(v) - return - } - } - } - failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag)) - }() - - // Any data is accepted as a !!str or !!binary. - // Otherwise, the prefix is enough of a hint about what it might be. - hint := byte('N') - if in != "" { - hint = resolveTable[in[0]] - } - if hint != 0 && tag != strTag && tag != binaryTag { - // Handle things we can lookup in a map. - if item, ok := resolveMap[in]; ok { - return item.tag, item.value - } - - // Base 60 floats are a bad idea, were dropped in YAML 1.2, and - // are purposefully unsupported here. They're still quoted on - // the way out for compatibility with other parser, though. - - switch hint { - case 'M': - // We've already checked the map above. - - case '.': - // Not in the map, so maybe a normal float. - floatv, err := strconv.ParseFloat(in, 64) - if err == nil { - return floatTag, floatv - } - - case 'D', 'S': - // Int, float, or timestamp. - // Only try values as a timestamp if the value is unquoted or there's an explicit - // !!timestamp tag. - if tag == "" || tag == timestampTag { - t, ok := parseTimestamp(in) - if ok { - return timestampTag, t - } - } - - plain := strings.Replace(in, "_", "", -1) - intv, err := strconv.ParseInt(plain, 0, 64) - if err == nil { - if intv == int64(int(intv)) { - return intTag, int(intv) - } else { - return intTag, intv - } - } - uintv, err := strconv.ParseUint(plain, 0, 64) - if err == nil { - return intTag, uintv - } - if yamlStyleFloat.MatchString(plain) { - floatv, err := strconv.ParseFloat(plain, 64) - if err == nil { - return floatTag, floatv - } - } - if strings.HasPrefix(plain, "0b") { - intv, err := strconv.ParseInt(plain[2:], 2, 64) - if err == nil { - if intv == int64(int(intv)) { - return intTag, int(intv) - } else { - return intTag, intv - } - } - uintv, err := strconv.ParseUint(plain[2:], 2, 64) - if err == nil { - return intTag, uintv - } - } else if strings.HasPrefix(plain, "-0b") { - intv, err := strconv.ParseInt("-"+plain[3:], 2, 64) - if err == nil { - if true || intv == int64(int(intv)) { - return intTag, int(intv) - } else { - return intTag, intv - } - } - } - // Octals as introduced in version 1.2 of the spec. - // Octals from the 1.1 spec, spelled as 0777, are still - // decoded by default in v3 as well for compatibility. - // May be dropped in v4 depending on how usage evolves. - if strings.HasPrefix(plain, "0o") { - intv, err := strconv.ParseInt(plain[2:], 8, 64) - if err == nil { - if intv == int64(int(intv)) { - return intTag, int(intv) - } else { - return intTag, intv - } - } - uintv, err := strconv.ParseUint(plain[2:], 8, 64) - if err == nil { - return intTag, uintv - } - } else if strings.HasPrefix(plain, "-0o") { - intv, err := strconv.ParseInt("-"+plain[3:], 8, 64) - if err == nil { - if true || intv == int64(int(intv)) { - return intTag, int(intv) - } else { - return intTag, intv - } - } - } - default: - panic("internal error: missing handler for resolver table: " + string(rune(hint)) + " (with " + in + ")") - } - } - return strTag, in -} - -// encodeBase64 encodes s as base64 that is broken up into multiple lines -// as appropriate for the resulting length. -func encodeBase64(s string) string { - const lineLen = 70 - encLen := base64.StdEncoding.EncodedLen(len(s)) - lines := encLen/lineLen + 1 - buf := make([]byte, encLen*2+lines) - in := buf[0:encLen] - out := buf[encLen:] - base64.StdEncoding.Encode(in, []byte(s)) - k := 0 - for i := 0; i < len(in); i += lineLen { - j := i + lineLen - if j > len(in) { - j = len(in) - } - k += copy(out[k:], in[i:j]) - if lines > 1 { - out[k] = '\n' - k++ - } - } - return string(out[:k]) -} - -// This is a subset of the formats allowed by the regular expression -// defined at http://yaml.org/type/timestamp.html. -var allowedTimestampFormats = []string{ - "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields. - "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t". - "2006-1-2 15:4:5.999999999", // space separated with no time zone - "2006-1-2", // date only - // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5" - // from the set of examples. -} - -// parseTimestamp parses s as a timestamp string and -// returns the timestamp and reports whether it succeeded. -// Timestamp formats are defined at http://yaml.org/type/timestamp.html -func parseTimestamp(s string) (time.Time, bool) { - // TODO write code to check all the formats supported by - // http://yaml.org/type/timestamp.html instead of using time.Parse. - - // Quick check: all date formats start with YYYY-. - i := 0 - for ; i < len(s); i++ { - if c := s[i]; c < '0' || c > '9' { - break - } - } - if i != 4 || i == len(s) || s[i] != '-' { - return time.Time{}, false - } - for _, format := range allowedTimestampFormats { - if t, err := time.Parse(format, s); err == nil { - return t, true - } - } - return time.Time{}, false -} diff --git a/vendor/gopkg.in/yaml.v3/scannerc.go b/vendor/gopkg.in/yaml.v3/scannerc.go deleted file mode 100644 index 57e954ca..00000000 --- a/vendor/gopkg.in/yaml.v3/scannerc.go +++ /dev/null @@ -1,3025 +0,0 @@ -// -// 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 -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "bytes" - "fmt" -) - -// Introduction -// ************ -// -// The following notes assume that you are familiar with the YAML specification -// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in -// some cases we are less restrictive that it requires. -// -// The process of transforming a YAML stream into a sequence of events is -// divided on two steps: Scanning and Parsing. -// -// The Scanner transforms the input stream into a sequence of tokens, while the -// parser transform the sequence of tokens produced by the Scanner into a -// sequence of parsing events. -// -// The Scanner is rather clever and complicated. The Parser, on the contrary, -// is a straightforward implementation of a recursive-descendant parser (or, -// LL(1) parser, as it is usually called). -// -// Actually there are two issues of Scanning that might be called "clever", the -// rest is quite straightforward. The issues are "block collection start" and -// "simple keys". Both issues are explained below in details. -// -// Here the Scanning step is explained and implemented. We start with the list -// of all the tokens produced by the Scanner together with short descriptions. -// -// Now, tokens: -// -// STREAM-START(encoding) # The stream start. -// STREAM-END # The stream end. -// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive. -// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive. -// DOCUMENT-START # '---' -// DOCUMENT-END # '...' -// BLOCK-SEQUENCE-START # Indentation increase denoting a block -// BLOCK-MAPPING-START # sequence or a block mapping. -// BLOCK-END # Indentation decrease. -// FLOW-SEQUENCE-START # '[' -// FLOW-SEQUENCE-END # ']' -// BLOCK-SEQUENCE-START # '{' -// BLOCK-SEQUENCE-END # '}' -// BLOCK-ENTRY # '-' -// FLOW-ENTRY # ',' -// KEY # '?' or nothing (simple keys). -// VALUE # ':' -// ALIAS(anchor) # '*anchor' -// ANCHOR(anchor) # '&anchor' -// TAG(handle,suffix) # '!handle!suffix' -// SCALAR(value,style) # A scalar. -// -// The following two tokens are "virtual" tokens denoting the beginning and the -// end of the stream: -// -// STREAM-START(encoding) -// STREAM-END -// -// We pass the information about the input stream encoding with the -// STREAM-START token. -// -// The next two tokens are responsible for tags: -// -// VERSION-DIRECTIVE(major,minor) -// TAG-DIRECTIVE(handle,prefix) -// -// Example: -// -// %YAML 1.1 -// %TAG ! !foo -// %TAG !yaml! tag:yaml.org,2002: -// --- -// -// The correspoding sequence of tokens: -// -// STREAM-START(utf-8) -// VERSION-DIRECTIVE(1,1) -// TAG-DIRECTIVE("!","!foo") -// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:") -// DOCUMENT-START -// STREAM-END -// -// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole -// line. -// -// The document start and end indicators are represented by: -// -// DOCUMENT-START -// DOCUMENT-END -// -// Note that if a YAML stream contains an implicit document (without '---' -// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be -// produced. -// -// In the following examples, we present whole documents together with the -// produced tokens. -// -// 1. An implicit document: -// -// 'a scalar' -// -// Tokens: -// -// STREAM-START(utf-8) -// SCALAR("a scalar",single-quoted) -// STREAM-END -// -// 2. An explicit document: -// -// --- -// 'a scalar' -// ... -// -// Tokens: -// -// STREAM-START(utf-8) -// DOCUMENT-START -// SCALAR("a scalar",single-quoted) -// DOCUMENT-END -// STREAM-END -// -// 3. Several documents in a stream: -// -// 'a scalar' -// --- -// 'another scalar' -// --- -// 'yet another scalar' -// -// Tokens: -// -// STREAM-START(utf-8) -// SCALAR("a scalar",single-quoted) -// DOCUMENT-START -// SCALAR("another scalar",single-quoted) -// DOCUMENT-START -// SCALAR("yet another scalar",single-quoted) -// STREAM-END -// -// We have already introduced the SCALAR token above. The following tokens are -// used to describe aliases, anchors, tag, and scalars: -// -// ALIAS(anchor) -// ANCHOR(anchor) -// TAG(handle,suffix) -// SCALAR(value,style) -// -// The following series of examples illustrate the usage of these tokens: -// -// 1. A recursive sequence: -// -// &A [ *A ] -// -// Tokens: -// -// STREAM-START(utf-8) -// ANCHOR("A") -// FLOW-SEQUENCE-START -// ALIAS("A") -// FLOW-SEQUENCE-END -// STREAM-END -// -// 2. A tagged scalar: -// -// !!float "3.14" # A good approximation. -// -// Tokens: -// -// STREAM-START(utf-8) -// TAG("!!","float") -// SCALAR("3.14",double-quoted) -// STREAM-END -// -// 3. Various scalar styles: -// -// --- # Implicit empty plain scalars do not produce tokens. -// --- a plain scalar -// --- 'a single-quoted scalar' -// --- "a double-quoted scalar" -// --- |- -// a literal scalar -// --- >- -// a folded -// scalar -// -// Tokens: -// -// STREAM-START(utf-8) -// DOCUMENT-START -// DOCUMENT-START -// SCALAR("a plain scalar",plain) -// DOCUMENT-START -// SCALAR("a single-quoted scalar",single-quoted) -// DOCUMENT-START -// SCALAR("a double-quoted scalar",double-quoted) -// DOCUMENT-START -// SCALAR("a literal scalar",literal) -// DOCUMENT-START -// SCALAR("a folded scalar",folded) -// STREAM-END -// -// Now it's time to review collection-related tokens. We will start with -// flow collections: -// -// FLOW-SEQUENCE-START -// FLOW-SEQUENCE-END -// FLOW-MAPPING-START -// FLOW-MAPPING-END -// FLOW-ENTRY -// KEY -// VALUE -// -// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and -// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}' -// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the -// indicators '?' and ':', which are used for denoting mapping keys and values, -// are represented by the KEY and VALUE tokens. -// -// The following examples show flow collections: -// -// 1. A flow sequence: -// -// [item 1, item 2, item 3] -// -// Tokens: -// -// STREAM-START(utf-8) -// FLOW-SEQUENCE-START -// SCALAR("item 1",plain) -// FLOW-ENTRY -// SCALAR("item 2",plain) -// FLOW-ENTRY -// SCALAR("item 3",plain) -// FLOW-SEQUENCE-END -// STREAM-END -// -// 2. A flow mapping: -// -// { -// a simple key: a value, # Note that the KEY token is produced. -// ? a complex key: another value, -// } -// -// Tokens: -// -// STREAM-START(utf-8) -// FLOW-MAPPING-START -// KEY -// SCALAR("a simple key",plain) -// VALUE -// SCALAR("a value",plain) -// FLOW-ENTRY -// KEY -// SCALAR("a complex key",plain) -// VALUE -// SCALAR("another value",plain) -// FLOW-ENTRY -// FLOW-MAPPING-END -// STREAM-END -// -// A simple key is a key which is not denoted by the '?' indicator. Note that -// the Scanner still produce the KEY token whenever it encounters a simple key. -// -// For scanning block collections, the following tokens are used (note that we -// repeat KEY and VALUE here): -// -// BLOCK-SEQUENCE-START -// BLOCK-MAPPING-START -// BLOCK-END -// BLOCK-ENTRY -// KEY -// VALUE -// -// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation -// increase that precedes a block collection (cf. the INDENT token in Python). -// The token BLOCK-END denote indentation decrease that ends a block collection -// (cf. the DEDENT token in Python). However YAML has some syntax pecularities -// that makes detections of these tokens more complex. -// -// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators -// '-', '?', and ':' correspondingly. -// -// The following examples show how the tokens BLOCK-SEQUENCE-START, -// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner: -// -// 1. Block sequences: -// -// - item 1 -// - item 2 -// - -// - item 3.1 -// - item 3.2 -// - -// key 1: value 1 -// key 2: value 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-ENTRY -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 3.1",plain) -// BLOCK-ENTRY -// SCALAR("item 3.2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// 2. Block mappings: -// -// a simple key: a value # The KEY token is produced here. -// ? a complex key -// : another value -// a mapping: -// key 1: value 1 -// key 2: value 2 -// a sequence: -// - item 1 -// - item 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("a simple key",plain) -// VALUE -// SCALAR("a value",plain) -// KEY -// SCALAR("a complex key",plain) -// VALUE -// SCALAR("another value",plain) -// KEY -// SCALAR("a mapping",plain) -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// KEY -// SCALAR("a sequence",plain) -// VALUE -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// YAML does not always require to start a new block collection from a new -// line. If the current line contains only '-', '?', and ':' indicators, a new -// block collection may start at the current line. The following examples -// illustrate this case: -// -// 1. Collections in a sequence: -// -// - - item 1 -// - item 2 -// - key 1: value 1 -// key 2: value 2 -// - ? complex key -// : complex value -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("complex key") -// VALUE -// SCALAR("complex value") -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// 2. Collections in a mapping: -// -// ? a sequence -// : - item 1 -// - item 2 -// ? a mapping -// : key 1: value 1 -// key 2: value 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("a sequence",plain) -// VALUE -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// KEY -// SCALAR("a mapping",plain) -// VALUE -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// YAML also permits non-indented sequences if they are included into a block -// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced: -// -// key: -// - item 1 # BLOCK-SEQUENCE-START is NOT produced here. -// - item 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("key",plain) -// VALUE -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// - -// Ensure that the buffer contains the required number of characters. -// Return true on success, false on failure (reader error or memory error). -func cache(parser *yaml_parser_t, length int) bool { - // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B) - return parser.unread >= length || yaml_parser_update_buffer(parser, length) -} - -// Advance the buffer pointer. -func skip(parser *yaml_parser_t) { - if !is_blank(parser.buffer, parser.buffer_pos) { - parser.newlines = 0 - } - parser.mark.index++ - parser.mark.column++ - parser.unread-- - parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) -} - -func skip_line(parser *yaml_parser_t) { - if is_crlf(parser.buffer, parser.buffer_pos) { - parser.mark.index += 2 - parser.mark.column = 0 - parser.mark.line++ - parser.unread -= 2 - parser.buffer_pos += 2 - parser.newlines++ - } else if is_break(parser.buffer, parser.buffer_pos) { - parser.mark.index++ - parser.mark.column = 0 - parser.mark.line++ - parser.unread-- - parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) - parser.newlines++ - } -} - -// Copy a character to a string buffer and advance pointers. -func read(parser *yaml_parser_t, s []byte) []byte { - if !is_blank(parser.buffer, parser.buffer_pos) { - parser.newlines = 0 - } - w := width(parser.buffer[parser.buffer_pos]) - if w == 0 { - panic("invalid character sequence") - } - if len(s) == 0 { - s = make([]byte, 0, 32) - } - if w == 1 && len(s)+w <= cap(s) { - s = s[:len(s)+1] - s[len(s)-1] = parser.buffer[parser.buffer_pos] - parser.buffer_pos++ - } else { - s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) - parser.buffer_pos += w - } - parser.mark.index++ - parser.mark.column++ - parser.unread-- - return s -} - -// Copy a line break character to a string buffer and advance pointers. -func read_line(parser *yaml_parser_t, s []byte) []byte { - buf := parser.buffer - pos := parser.buffer_pos - switch { - case buf[pos] == '\r' && buf[pos+1] == '\n': - // CR LF . LF - s = append(s, '\n') - parser.buffer_pos += 2 - parser.mark.index++ - parser.unread-- - case buf[pos] == '\r' || buf[pos] == '\n': - // CR|LF . LF - s = append(s, '\n') - parser.buffer_pos += 1 - case buf[pos] == '\xC2' && buf[pos+1] == '\x85': - // NEL . LF - s = append(s, '\n') - parser.buffer_pos += 2 - case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'): - // LS|PS . LS|PS - s = append(s, buf[parser.buffer_pos:pos+3]...) - parser.buffer_pos += 3 - default: - return s - } - parser.mark.index++ - parser.mark.column = 0 - parser.mark.line++ - parser.unread-- - parser.newlines++ - return s -} - -// Get the next token. -func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool { - // Erase the token object. - *token = yaml_token_t{} // [Go] Is this necessary? - - // No tokens after STREAM-END or error. - if parser.stream_end_produced || parser.error != yaml_NO_ERROR { - return true - } - - // Ensure that the tokens queue contains enough tokens. - if !parser.token_available { - if !yaml_parser_fetch_more_tokens(parser) { - return false - } - } - - // Fetch the next token from the queue. - *token = parser.tokens[parser.tokens_head] - parser.tokens_head++ - parser.tokens_parsed++ - parser.token_available = false - - if token.typ == yaml_STREAM_END_TOKEN { - parser.stream_end_produced = true - } - return true -} - -// Set the scanner error and return false. -func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool { - parser.error = yaml_SCANNER_ERROR - parser.context = context - parser.context_mark = context_mark - parser.problem = problem - parser.problem_mark = parser.mark - return false -} - -func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool { - context := "while parsing a tag" - if directive { - context = "while parsing a %TAG directive" - } - return yaml_parser_set_scanner_error(parser, context, context_mark, problem) -} - -func trace(args ...interface{}) func() { - pargs := append([]interface{}{"+++"}, args...) - fmt.Println(pargs...) - pargs = append([]interface{}{"---"}, args...) - return func() { fmt.Println(pargs...) } -} - -// Ensure that the tokens queue contains at least one token which can be -// returned to the Parser. -func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { - // While we need more tokens to fetch, do it. - for { - // [Go] The comment parsing logic requires a lookahead of two tokens - // so that foot comments may be parsed in time of associating them - // with the tokens that are parsed before them, and also for line - // comments to be transformed into head comments in some edge cases. - if parser.tokens_head < len(parser.tokens)-2 { - // If a potential simple key is at the head position, we need to fetch - // the next token to disambiguate it. - head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed] - if !ok { - break - } else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok { - return false - } else if !valid { - break - } - } - // Fetch the next token. - if !yaml_parser_fetch_next_token(parser) { - return false - } - } - - parser.token_available = true - return true -} - -// The dispatcher for token fetchers. -func yaml_parser_fetch_next_token(parser *yaml_parser_t) (ok bool) { - // Ensure that the buffer is initialized. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check if we just started scanning. Fetch STREAM-START then. - if !parser.stream_start_produced { - return yaml_parser_fetch_stream_start(parser) - } - - scan_mark := parser.mark - - // Eat whitespaces and comments until we reach the next token. - if !yaml_parser_scan_to_next_token(parser) { - return false - } - - // [Go] While unrolling indents, transform the head comments of prior - // indentation levels observed after scan_start into foot comments at - // the respective indexes. - - // Check the indentation level against the current column. - if !yaml_parser_unroll_indent(parser, parser.mark.column, scan_mark) { - return false - } - - // Ensure that the buffer contains at least 4 characters. 4 is the length - // of the longest indicators ('--- ' and '... '). - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - - // Is it the end of the stream? - if is_z(parser.buffer, parser.buffer_pos) { - return yaml_parser_fetch_stream_end(parser) - } - - // Is it a directive? - if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' { - return yaml_parser_fetch_directive(parser) - } - - buf := parser.buffer - pos := parser.buffer_pos - - // Is it the document start indicator? - if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) { - return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN) - } - - // Is it the document end indicator? - if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) { - return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) - } - - comment_mark := parser.mark - if len(parser.tokens) > 0 && (parser.flow_level == 0 && buf[pos] == ':' || parser.flow_level > 0 && buf[pos] == ',') { - // Associate any following comments with the prior token. - comment_mark = parser.tokens[len(parser.tokens)-1].start_mark - } - defer func() { - if !ok { - return - } - if !yaml_parser_scan_line_comment(parser, comment_mark) { - ok = false - return - } - }() - - // Is it the flow sequence start indicator? - if buf[pos] == '[' { - return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) - } - - // Is it the flow mapping start indicator? - if parser.buffer[parser.buffer_pos] == '{' { - return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN) - } - - // Is it the flow sequence end indicator? - if parser.buffer[parser.buffer_pos] == ']' { - return yaml_parser_fetch_flow_collection_end(parser, - yaml_FLOW_SEQUENCE_END_TOKEN) - } - - // Is it the flow mapping end indicator? - if parser.buffer[parser.buffer_pos] == '}' { - return yaml_parser_fetch_flow_collection_end(parser, - yaml_FLOW_MAPPING_END_TOKEN) - } - - // Is it the flow entry indicator? - if parser.buffer[parser.buffer_pos] == ',' { - return yaml_parser_fetch_flow_entry(parser) - } - - // Is it the block entry indicator? - if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) { - return yaml_parser_fetch_block_entry(parser) - } - - // Is it the key indicator? - if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_key(parser) - } - - // Is it the value indicator? - if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_value(parser) - } - - // Is it an alias? - if parser.buffer[parser.buffer_pos] == '*' { - return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN) - } - - // Is it an anchor? - if parser.buffer[parser.buffer_pos] == '&' { - return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN) - } - - // Is it a tag? - if parser.buffer[parser.buffer_pos] == '!' { - return yaml_parser_fetch_tag(parser) - } - - // Is it a literal scalar? - if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 { - return yaml_parser_fetch_block_scalar(parser, true) - } - - // Is it a folded scalar? - if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 { - return yaml_parser_fetch_block_scalar(parser, false) - } - - // Is it a single-quoted scalar? - if parser.buffer[parser.buffer_pos] == '\'' { - return yaml_parser_fetch_flow_scalar(parser, true) - } - - // Is it a double-quoted scalar? - if parser.buffer[parser.buffer_pos] == '"' { - return yaml_parser_fetch_flow_scalar(parser, false) - } - - // Is it a plain scalar? - // - // A plain scalar may start with any non-blank characters except - // - // '-', '?', ':', ',', '[', ']', '{', '}', - // '#', '&', '*', '!', '|', '>', '\'', '\"', - // '%', '@', '`'. - // - // In the block context (and, for the '-' indicator, in the flow context - // too), it may also start with the characters - // - // '-', '?', ':' - // - // if it is followed by a non-space character. - // - // The last rule is more restrictive than the specification requires. - // [Go] TODO Make this logic more reasonable. - //switch parser.buffer[parser.buffer_pos] { - //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': - //} - if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || - parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || - parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || - parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' || - parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' || - parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' || - parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' || - parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' || - parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') || - (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) || - (parser.flow_level == 0 && - (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') && - !is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_plain_scalar(parser) - } - - // If we don't determine the token type so far, it is an error. - return yaml_parser_set_scanner_error(parser, - "while scanning for the next token", parser.mark, - "found character that cannot start any token") -} - -func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) { - if !simple_key.possible { - return false, true - } - - // The 1.2 specification says: - // - // "If the ? indicator is omitted, parsing needs to see past the - // implicit key to recognize it as such. To limit the amount of - // lookahead required, the “:” indicator must appear at most 1024 - // Unicode characters beyond the start of the key. In addition, the key - // is restricted to a single line." - // - if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index { - // Check if the potential simple key to be removed is required. - if simple_key.required { - return false, yaml_parser_set_scanner_error(parser, - "while scanning a simple key", simple_key.mark, - "could not find expected ':'") - } - simple_key.possible = false - return false, true - } - return true, true -} - -// Check if a simple key may start at the current position and add it if -// needed. -func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { - // A simple key is required at the current position if the scanner is in - // the block context and the current column coincides with the indentation - // level. - - required := parser.flow_level == 0 && parser.indent == parser.mark.column - - // - // If the current position may start a simple key, save it. - // - if parser.simple_key_allowed { - simple_key := yaml_simple_key_t{ - possible: true, - required: required, - token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), - mark: parser.mark, - } - - if !yaml_parser_remove_simple_key(parser) { - return false - } - parser.simple_keys[len(parser.simple_keys)-1] = simple_key - parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1 - } - return true -} - -// Remove a potential simple key at the current flow level. -func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { - i := len(parser.simple_keys) - 1 - if parser.simple_keys[i].possible { - // If the key is required, it is an error. - if parser.simple_keys[i].required { - return yaml_parser_set_scanner_error(parser, - "while scanning a simple key", parser.simple_keys[i].mark, - "could not find expected ':'") - } - // Remove the key from the stack. - parser.simple_keys[i].possible = false - delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number) - } - return true -} - -// max_flow_level limits the flow_level -const max_flow_level = 10000 - -// Increase the flow level and resize the simple key list if needed. -func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { - // Reset the simple key on the next level. - parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{ - possible: false, - required: false, - token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), - mark: parser.mark, - }) - - // Increase the flow level. - parser.flow_level++ - if parser.flow_level > max_flow_level { - return yaml_parser_set_scanner_error(parser, - "while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark, - fmt.Sprintf("exceeded max depth of %d", max_flow_level)) - } - return true -} - -// Decrease the flow level. -func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { - if parser.flow_level > 0 { - parser.flow_level-- - last := len(parser.simple_keys) - 1 - delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number) - parser.simple_keys = parser.simple_keys[:last] - } - return true -} - -// max_indents limits the indents stack size -const max_indents = 10000 - -// Push the current indentation level to the stack and set the new level -// the current column is greater than the indentation level. In this case, -// append or insert the specified token into the token queue. -func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool { - // In the flow context, do nothing. - if parser.flow_level > 0 { - return true - } - - if parser.indent < column { - // Push the current indentation level to the stack and set the new - // indentation level. - parser.indents = append(parser.indents, parser.indent) - parser.indent = column - if len(parser.indents) > max_indents { - return yaml_parser_set_scanner_error(parser, - "while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark, - fmt.Sprintf("exceeded max depth of %d", max_indents)) - } - - // Create a token and insert it into the queue. - token := yaml_token_t{ - typ: typ, - start_mark: mark, - end_mark: mark, - } - if number > -1 { - number -= parser.tokens_parsed - } - yaml_insert_token(parser, number, &token) - } - return true -} - -// Pop indentation levels from the indents stack until the current level -// becomes less or equal to the column. For each indentation level, append -// the BLOCK-END token. -func yaml_parser_unroll_indent(parser *yaml_parser_t, column int, scan_mark yaml_mark_t) bool { - // In the flow context, do nothing. - if parser.flow_level > 0 { - return true - } - - block_mark := scan_mark - block_mark.index-- - - // Loop through the indentation levels in the stack. - for parser.indent > column { - - // [Go] Reposition the end token before potential following - // foot comments of parent blocks. For that, search - // backwards for recent comments that were at the same - // indent as the block that is ending now. - stop_index := block_mark.index - for i := len(parser.comments) - 1; i >= 0; i-- { - comment := &parser.comments[i] - - if comment.end_mark.index < stop_index { - // Don't go back beyond the start of the comment/whitespace scan, unless column < 0. - // If requested indent column is < 0, then the document is over and everything else - // is a foot anyway. - break - } - if comment.start_mark.column == parser.indent+1 { - // This is a good match. But maybe there's a former comment - // at that same indent level, so keep searching. - block_mark = comment.start_mark - } - - // While the end of the former comment matches with - // the start of the following one, we know there's - // nothing in between and scanning is still safe. - stop_index = comment.scan_mark.index - } - - // Create a token and append it to the queue. - token := yaml_token_t{ - typ: yaml_BLOCK_END_TOKEN, - start_mark: block_mark, - end_mark: block_mark, - } - yaml_insert_token(parser, -1, &token) - - // Pop the indentation level. - parser.indent = parser.indents[len(parser.indents)-1] - parser.indents = parser.indents[:len(parser.indents)-1] - } - return true -} - -// Initialize the scanner and produce the STREAM-START token. -func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { - - // Set the initial indentation. - parser.indent = -1 - - // Initialize the simple key stack. - parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) - - parser.simple_keys_by_tok = make(map[int]int) - - // A simple key is allowed at the beginning of the stream. - parser.simple_key_allowed = true - - // We have started. - parser.stream_start_produced = true - - // Create the STREAM-START token and append it to the queue. - token := yaml_token_t{ - typ: yaml_STREAM_START_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, - encoding: parser.encoding, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the STREAM-END token and shut down the scanner. -func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { - - // Force new line. - if parser.mark.column != 0 { - parser.mark.column = 0 - parser.mark.line++ - } - - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1, parser.mark) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Create the STREAM-END token and append it to the queue. - token := yaml_token_t{ - typ: yaml_STREAM_END_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. -func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1, parser.mark) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. - token := yaml_token_t{} - if !yaml_parser_scan_directive(parser, &token) { - return false - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the DOCUMENT-START or DOCUMENT-END token. -func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1, parser.mark) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Consume the token. - start_mark := parser.mark - - skip(parser) - skip(parser) - skip(parser) - - end_mark := parser.mark - - // Create the DOCUMENT-START or DOCUMENT-END token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. -func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { - - // The indicators '[' and '{' may start a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // Increase the flow level. - if !yaml_parser_increase_flow_level(parser) { - return false - } - - // A simple key may follow the indicators '[' and '{'. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. -func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // Reset any potential simple key on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Decrease the flow level. - if !yaml_parser_decrease_flow_level(parser) { - return false - } - - // No simple keys after the indicators ']' and '}'. - parser.simple_key_allowed = false - - // Consume the token. - - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-ENTRY token. -func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool { - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after ','. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-ENTRY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_FLOW_ENTRY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the BLOCK-ENTRY token. -func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool { - // Check if the scanner is in the block context. - if parser.flow_level == 0 { - // Check if we are allowed to start a new entry. - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "block sequence entries are not allowed in this context") - } - // Add the BLOCK-SEQUENCE-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) { - return false - } - } else { - // It is an error for the '-' indicator to occur in the flow context, - // but we let the Parser detect and report about it because the Parser - // is able to point to the context. - } - - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after '-'. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the BLOCK-ENTRY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_BLOCK_ENTRY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the KEY token. -func yaml_parser_fetch_key(parser *yaml_parser_t) bool { - - // In the block context, additional checks are required. - if parser.flow_level == 0 { - // Check if we are allowed to start a new key (not nessesary simple). - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "mapping keys are not allowed in this context") - } - // Add the BLOCK-MAPPING-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { - return false - } - } - - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after '?' in the block context. - parser.simple_key_allowed = parser.flow_level == 0 - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the KEY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_KEY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the VALUE token. -func yaml_parser_fetch_value(parser *yaml_parser_t) bool { - - simple_key := &parser.simple_keys[len(parser.simple_keys)-1] - - // Have we found a simple key? - if valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok { - return false - - } else if valid { - - // Create the KEY token and insert it into the queue. - token := yaml_token_t{ - typ: yaml_KEY_TOKEN, - start_mark: simple_key.mark, - end_mark: simple_key.mark, - } - yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token) - - // In the block context, we may need to add the BLOCK-MAPPING-START token. - if !yaml_parser_roll_indent(parser, simple_key.mark.column, - simple_key.token_number, - yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) { - return false - } - - // Remove the simple key. - simple_key.possible = false - delete(parser.simple_keys_by_tok, simple_key.token_number) - - // A simple key cannot follow another simple key. - parser.simple_key_allowed = false - - } else { - // The ':' indicator follows a complex key. - - // In the block context, extra checks are required. - if parser.flow_level == 0 { - - // Check if we are allowed to start a complex value. - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "mapping values are not allowed in this context") - } - - // Add the BLOCK-MAPPING-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { - return false - } - } - - // Simple keys after ':' are allowed in the block context. - parser.simple_key_allowed = parser.flow_level == 0 - } - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the VALUE token and append it to the queue. - token := yaml_token_t{ - typ: yaml_VALUE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the ALIAS or ANCHOR token. -func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // An anchor or an alias could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow an anchor or an alias. - parser.simple_key_allowed = false - - // Create the ALIAS or ANCHOR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_anchor(parser, &token, typ) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the TAG token. -func yaml_parser_fetch_tag(parser *yaml_parser_t) bool { - // A tag could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a tag. - parser.simple_key_allowed = false - - // Create the TAG token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_tag(parser, &token) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. -func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool { - // Remove any potential simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // A simple key may follow a block scalar. - parser.simple_key_allowed = true - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_block_scalar(parser, &token, literal) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. -func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool { - // A plain scalar could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a flow scalar. - parser.simple_key_allowed = false - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_flow_scalar(parser, &token, single) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,plain) token. -func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { - // A plain scalar could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a flow scalar. - parser.simple_key_allowed = false - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_plain_scalar(parser, &token) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Eat whitespaces and comments until the next token is found. -func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { - - scan_mark := parser.mark - - // Until the next token is not found. - for { - // Allow the BOM mark to start a line. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) { - skip(parser) - } - - // Eat whitespaces. - // Tabs are allowed: - // - in the flow context - // - in the block context, but not at the beginning of the line or - // after '-', '?', or ':' (complex value). - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if we just had a line comment under a sequence entry that - // looks more like a header to the following content. Similar to this: - // - // - # The comment - // - Some data - // - // If so, transform the line comment to a head comment and reposition. - if len(parser.comments) > 0 && len(parser.tokens) > 1 { - tokenA := parser.tokens[len(parser.tokens)-2] - tokenB := parser.tokens[len(parser.tokens)-1] - comment := &parser.comments[len(parser.comments)-1] - if tokenA.typ == yaml_BLOCK_SEQUENCE_START_TOKEN && tokenB.typ == yaml_BLOCK_ENTRY_TOKEN && len(comment.line) > 0 && !is_break(parser.buffer, parser.buffer_pos) { - // If it was in the prior line, reposition so it becomes a - // header of the follow up token. Otherwise, keep it in place - // so it becomes a header of the former. - comment.head = comment.line - comment.line = nil - if comment.start_mark.line == parser.mark.line-1 { - comment.token_mark = parser.mark - } - } - } - - // Eat a comment until a line break. - if parser.buffer[parser.buffer_pos] == '#' { - if !yaml_parser_scan_comments(parser, scan_mark) { - return false - } - } - - // If it is a line break, eat it. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - - // In the block context, a new line may start a simple key. - if parser.flow_level == 0 { - parser.simple_key_allowed = true - } - } else { - break // We have found a token. - } - } - - return true -} - -// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. -// -// Scope: -// %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 - skip(parser) - - // Scan the directive name. - var name []byte - if !yaml_parser_scan_directive_name(parser, start_mark, &name) { - return false - } - - // Is it a YAML directive? - if bytes.Equal(name, []byte("YAML")) { - // Scan the VERSION directive value. - var major, minor int8 - if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) { - return false - } - end_mark := parser.mark - - // Create a VERSION-DIRECTIVE token. - *token = yaml_token_t{ - typ: yaml_VERSION_DIRECTIVE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - major: major, - minor: minor, - } - - // Is it a TAG directive? - } else if bytes.Equal(name, []byte("TAG")) { - // Scan the TAG directive value. - var handle, prefix []byte - if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) { - return false - } - end_mark := parser.mark - - // Create a TAG-DIRECTIVE token. - *token = yaml_token_t{ - typ: yaml_TAG_DIRECTIVE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: handle, - prefix: prefix, - } - - // Unknown directive. - } else { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "found unknown directive name") - return false - } - - // Eat the rest of the line including any comments. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - if parser.buffer[parser.buffer_pos] == '#' { - // [Go] Discard this inline comment for the time being. - //if !yaml_parser_scan_line_comment(parser, start_mark) { - // return false - //} - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - } - - // Check if we are at the end of the line. - if !is_breakz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "did not find expected comment or line break") - return false - } - - // Eat a line break. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } - - return true -} - -// Scan the directive name. -// -// Scope: -// %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) { - return false - } - - var s []byte - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the name is empty. - if len(s) == 0 { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "could not find expected directive name") - return false - } - - // Check for an blank character after the name. - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "found unexpected non-alphabetical character") - return false - } - *name = s - return true -} - -// Scan the value of VERSION-DIRECTIVE. -// -// Scope: -// %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) { - return false - } - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Consume the major version number. - if !yaml_parser_scan_version_directive_number(parser, start_mark, major) { - return false - } - - // Eat '.'. - if parser.buffer[parser.buffer_pos] != '.' { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "did not find expected digit or '.' character") - } - - skip(parser) - - // Consume the minor version number. - if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) { - return false - } - return true -} - -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 -// ^ -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. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - var value, length int8 - for is_digit(parser.buffer, parser.buffer_pos) { - // Check if the number is too long. - length++ - if length > max_number_length { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "found extremely long version number") - } - value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos)) - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the number was present. - if length == 0 { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "did not find expected version number") - } - *number = value - return true -} - -// Scan the value of a TAG-DIRECTIVE token. -// -// Scope: -// %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 - - // Eat whitespaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Scan a handle. - if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) { - return false - } - - // Expect a whitespace. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blank(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", - start_mark, "did not find expected whitespace") - return false - } - - // Eat whitespaces. - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Scan a prefix. - if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) { - return false - } - - // Expect a whitespace or line break. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", - start_mark, "did not find expected whitespace or line break") - return false - } - - *handle = handle_value - *prefix = prefix_value - return true -} - -func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool { - var s []byte - - // Eat the indicator character. - start_mark := parser.mark - skip(parser) - - // Consume the value. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - end_mark := parser.mark - - /* - * Check if length of the anchor is greater than 0 and it is followed by - * a whitespace character or one of the indicators: - * - * '?', ':', ',', ']', '}', '%', '@', '`'. - */ - - if len(s) == 0 || - !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' || - parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' || - parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' || - parser.buffer[parser.buffer_pos] == '`') { - context := "while scanning an alias" - if typ == yaml_ANCHOR_TOKEN { - context = "while scanning an anchor" - } - yaml_parser_set_scanner_error(parser, context, start_mark, - "did not find expected alphabetic or numeric character") - return false - } - - // Create a token. - *token = yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - value: s, - } - - return true -} - -/* - * Scan a TAG token. - */ - -func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool { - var handle, suffix []byte - - start_mark := parser.mark - - // Check if the tag is in the canonical form. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - if parser.buffer[parser.buffer_pos+1] == '<' { - // Keep the handle as '' - - // Eat '!<' - skip(parser) - skip(parser) - - // Consume the tag value. - if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { - return false - } - - // Check for '>' and eat it. - if parser.buffer[parser.buffer_pos] != '>' { - yaml_parser_set_scanner_error(parser, "while scanning a tag", - start_mark, "did not find the expected '>'") - return false - } - - skip(parser) - } else { - // The tag has either the '!suffix' or the '!handle!suffix' form. - - // First, try to scan a handle. - if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) { - return false - } - - // Check if it is, indeed, handle. - if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' { - // Scan the suffix now. - if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { - return false - } - } else { - // It wasn't a handle after all. Scan the rest of the tag. - if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) { - return false - } - - // Set the handle to '!'. - handle = []byte{'!'} - - // A special case: the '!' tag. Set the handle to '' and the - // suffix to '!'. - if len(suffix) == 0 { - handle, suffix = suffix, handle - } - } - } - - // Check the character which ends the tag. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a tag", - start_mark, "did not find expected whitespace or line break") - return false - } - - end_mark := parser.mark - - // Create a token. - *token = yaml_token_t{ - typ: yaml_TAG_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: handle, - suffix: suffix, - } - return true -} - -// Scan a tag handle. -func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool { - // Check the initial '!' character. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.buffer[parser.buffer_pos] != '!' { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected '!'") - return false - } - - var s []byte - - // Copy the '!' character. - s = read(parser, s) - - // Copy all subsequent alphabetical and numerical characters. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the trailing character is '!' and copy it. - if parser.buffer[parser.buffer_pos] == '!' { - s = read(parser, s) - } else { - // It's either the '!' tag or not really a tag handle. If it's a %TAG - // directive, it's an error. If it's a tag token, it must be a part of URI. - if directive && string(s) != "!" { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected '!'") - return false - } - } - - *handle = s - return true -} - -// Scan a tag. -func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { - //size_t length = head ? strlen((char *)head) : 0 - var s []byte - hasTag := len(head) > 0 - - // Copy the head if needed. - // - // Note that we don't copy the leading '!' character. - if len(head) > 1 { - s = append(s, head[1:]...) - } - - // Scan the tag. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // The set of characters that may appear in URI is as follows: - // - // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', - // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', - // '%'. - // [Go] TODO Convert this into more reasonable logic. - for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || - parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || - parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || - parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' || - parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' || - parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' || - parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' || - parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' || - parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' || - parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || - parser.buffer[parser.buffer_pos] == '%' { - // Check if it is a URI-escape sequence. - if parser.buffer[parser.buffer_pos] == '%' { - if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) { - return false - } - } else { - s = read(parser, s) - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - hasTag = true - } - - if !hasTag { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected tag URI") - return false - } - *uri = s - return true -} - -// Decode an URI-escape sequence corresponding to a single UTF-8 character. -func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool { - - // Decode the required number of characters. - w := 1024 - for w > 0 { - // Check for a URI-escaped octet. - if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { - return false - } - - if !(parser.buffer[parser.buffer_pos] == '%' && - is_hex(parser.buffer, parser.buffer_pos+1) && - is_hex(parser.buffer, parser.buffer_pos+2)) { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find URI escaped octet") - } - - // Get the octet. - octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2)) - - // If it is the leading octet, determine the length of the UTF-8 sequence. - if w == 1024 { - w = width(octet) - if w == 0 { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "found an incorrect leading UTF-8 octet") - } - } else { - // Check if the trailing octet is correct. - if octet&0xC0 != 0x80 { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "found an incorrect trailing UTF-8 octet") - } - } - - // Copy the octet and move the pointers. - *s = append(*s, octet) - skip(parser) - skip(parser) - skip(parser) - w-- - } - return true -} - -// Scan a block scalar. -func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool { - // Eat the indicator '|' or '>'. - start_mark := parser.mark - skip(parser) - - // Scan the additional block scalar indicators. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check for a chomping indicator. - var chomping, increment int - if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { - // Set the chomping method and eat the indicator. - if parser.buffer[parser.buffer_pos] == '+' { - chomping = +1 - } else { - chomping = -1 - } - skip(parser) - - // Check for an indentation indicator. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if is_digit(parser.buffer, parser.buffer_pos) { - // Check that the indentation is greater than 0. - if parser.buffer[parser.buffer_pos] == '0' { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found an indentation indicator equal to 0") - return false - } - - // Get the indentation level and eat the indicator. - increment = as_digit(parser.buffer, parser.buffer_pos) - skip(parser) - } - - } else if is_digit(parser.buffer, parser.buffer_pos) { - // Do the same as above, but in the opposite order. - - if parser.buffer[parser.buffer_pos] == '0' { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found an indentation indicator equal to 0") - return false - } - increment = as_digit(parser.buffer, parser.buffer_pos) - skip(parser) - - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { - if parser.buffer[parser.buffer_pos] == '+' { - chomping = +1 - } else { - chomping = -1 - } - skip(parser) - } - } - - // Eat whitespaces and comments to the end of the line. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - if parser.buffer[parser.buffer_pos] == '#' { - // TODO Test this and then re-enable it. - //if !yaml_parser_scan_line_comment(parser, start_mark) { - // return false - //} - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - } - - // Check if we are at the end of the line. - if !is_breakz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "did not find expected comment or line break") - return false - } - - // Eat a line break. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } - - end_mark := parser.mark - - // Set the indentation level if it was specified. - var indent int - if increment > 0 { - if parser.indent >= 0 { - indent = parser.indent + increment - } else { - indent = increment - } - } - - // Scan the leading line breaks and determine the indentation level if needed. - var s, leading_break, trailing_breaks []byte - if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { - return false - } - - // Scan the block scalar content. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - var leading_blank, trailing_blank bool - for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) { - // We are at the beginning of a non-empty line. - - // Is it a trailing whitespace? - trailing_blank = is_blank(parser.buffer, parser.buffer_pos) - - // Check if we need to fold the leading line break. - if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' { - // Do we need to join the lines by space? - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } - } else { - s = append(s, leading_break...) - } - leading_break = leading_break[:0] - - // Append the remaining line breaks. - s = append(s, trailing_breaks...) - trailing_breaks = trailing_breaks[:0] - - // Is it a leading whitespace? - leading_blank = is_blank(parser.buffer, parser.buffer_pos) - - // Consume the current line. - for !is_breakz(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Consume the line break. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - leading_break = read_line(parser, leading_break) - - // Eat the following indentation spaces and line breaks. - if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { - return false - } - } - - // Chomp the tail. - if chomping != -1 { - s = append(s, leading_break...) - } - if chomping == 1 { - s = append(s, trailing_breaks...) - } - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_LITERAL_SCALAR_STYLE, - } - if !literal { - token.style = yaml_FOLDED_SCALAR_STYLE - } - return true -} - -// Scan indentation spaces and line breaks for a block scalar. Determine the -// indentation level if needed. -func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool { - *end_mark = parser.mark - - // Eat the indentation spaces and line breaks. - max_indent := 0 - for { - // Eat the indentation spaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - if parser.mark.column > max_indent { - max_indent = parser.mark.column - } - - // Check for a tab character messing the indentation. - if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) { - return yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found a tab character where an indentation space is expected") - } - - // Have we found a non-empty line? - if !is_break(parser.buffer, parser.buffer_pos) { - break - } - - // Consume the line break. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - // [Go] Should really be returning breaks instead. - *breaks = read_line(parser, *breaks) - *end_mark = parser.mark - } - - // Determine the indentation level if needed. - if *indent == 0 { - *indent = max_indent - if *indent < parser.indent+1 { - *indent = parser.indent + 1 - } - if *indent < 1 { - *indent = 1 - } - } - return true -} - -// Scan a quoted scalar. -func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool { - // Eat the left quote. - start_mark := parser.mark - skip(parser) - - // Consume the content of the quoted scalar. - var s, leading_break, trailing_breaks, whitespaces []byte - for { - // Check that there are no document indicators at the beginning of the line. - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - - if parser.mark.column == 0 && - ((parser.buffer[parser.buffer_pos+0] == '-' && - parser.buffer[parser.buffer_pos+1] == '-' && - parser.buffer[parser.buffer_pos+2] == '-') || - (parser.buffer[parser.buffer_pos+0] == '.' && - parser.buffer[parser.buffer_pos+1] == '.' && - parser.buffer[parser.buffer_pos+2] == '.')) && - is_blankz(parser.buffer, parser.buffer_pos+3) { - yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", - start_mark, "found unexpected document indicator") - return false - } - - // Check for EOF. - if is_z(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", - start_mark, "found unexpected end of stream") - return false - } - - // Consume non-blank characters. - leading_blanks := false - for !is_blankz(parser.buffer, parser.buffer_pos) { - if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' { - // Is is an escaped single quote. - s = append(s, '\'') - skip(parser) - skip(parser) - - } else if single && parser.buffer[parser.buffer_pos] == '\'' { - // It is a right single quote. - break - } else if !single && parser.buffer[parser.buffer_pos] == '"' { - // It is a right double quote. - break - - } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) { - // It is an escaped line break. - if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { - return false - } - skip(parser) - skip_line(parser) - leading_blanks = true - break - - } else if !single && parser.buffer[parser.buffer_pos] == '\\' { - // It is an escape sequence. - code_length := 0 - - // Check the escape character. - switch parser.buffer[parser.buffer_pos+1] { - case '0': - s = append(s, 0) - case 'a': - s = append(s, '\x07') - case 'b': - s = append(s, '\x08') - case 't', '\t': - s = append(s, '\x09') - case 'n': - s = append(s, '\x0A') - case 'v': - s = append(s, '\x0B') - case 'f': - s = append(s, '\x0C') - case 'r': - s = append(s, '\x0D') - case 'e': - s = append(s, '\x1B') - case ' ': - s = append(s, '\x20') - case '"': - s = append(s, '"') - case '\'': - s = append(s, '\'') - case '\\': - s = append(s, '\\') - case 'N': // NEL (#x85) - s = append(s, '\xC2') - s = append(s, '\x85') - case '_': // #xA0 - s = append(s, '\xC2') - s = append(s, '\xA0') - case 'L': // LS (#x2028) - s = append(s, '\xE2') - s = append(s, '\x80') - s = append(s, '\xA8') - case 'P': // PS (#x2029) - s = append(s, '\xE2') - s = append(s, '\x80') - s = append(s, '\xA9') - case 'x': - code_length = 2 - case 'u': - code_length = 4 - case 'U': - code_length = 8 - default: - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "found unknown escape character") - return false - } - - skip(parser) - skip(parser) - - // Consume an arbitrary escape code. - if code_length > 0 { - var value int - - // Scan the character value. - if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) { - return false - } - for k := 0; k < code_length; k++ { - if !is_hex(parser.buffer, parser.buffer_pos+k) { - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "did not find expected hexdecimal number") - return false - } - value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k) - } - - // Check the value and write the character. - if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF { - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "found invalid Unicode character escape code") - return false - } - if value <= 0x7F { - s = append(s, byte(value)) - } else if value <= 0x7FF { - s = append(s, byte(0xC0+(value>>6))) - s = append(s, byte(0x80+(value&0x3F))) - } else if value <= 0xFFFF { - s = append(s, byte(0xE0+(value>>12))) - s = append(s, byte(0x80+((value>>6)&0x3F))) - s = append(s, byte(0x80+(value&0x3F))) - } else { - s = append(s, byte(0xF0+(value>>18))) - s = append(s, byte(0x80+((value>>12)&0x3F))) - s = append(s, byte(0x80+((value>>6)&0x3F))) - s = append(s, byte(0x80+(value&0x3F))) - } - - // Advance the pointer. - for k := 0; k < code_length; k++ { - skip(parser) - } - } - } else { - // It is a non-escaped non-blank character. - s = read(parser, s) - } - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - } - - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check if we are at the end of the scalar. - if single { - if parser.buffer[parser.buffer_pos] == '\'' { - break - } - } else { - if parser.buffer[parser.buffer_pos] == '"' { - break - } - } - - // Consume blank characters. - for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { - if is_blank(parser.buffer, parser.buffer_pos) { - // Consume a space or a tab character. - if !leading_blanks { - whitespaces = read(parser, whitespaces) - } else { - skip(parser) - } - } else { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - // Check if it is a first line break. - if !leading_blanks { - whitespaces = whitespaces[:0] - leading_break = read_line(parser, leading_break) - leading_blanks = true - } else { - trailing_breaks = read_line(parser, trailing_breaks) - } - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Join the whitespaces or fold line breaks. - if leading_blanks { - // Do we need to fold line breaks? - if len(leading_break) > 0 && leading_break[0] == '\n' { - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } else { - s = append(s, trailing_breaks...) - } - } else { - s = append(s, leading_break...) - s = append(s, trailing_breaks...) - } - trailing_breaks = trailing_breaks[:0] - leading_break = leading_break[:0] - } else { - s = append(s, whitespaces...) - whitespaces = whitespaces[:0] - } - } - - // Eat the right quote. - skip(parser) - end_mark := parser.mark - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_SINGLE_QUOTED_SCALAR_STYLE, - } - if !single { - token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - return true -} - -// Scan a plain scalar. -func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool { - - var s, leading_break, trailing_breaks, whitespaces []byte - var leading_blanks bool - var indent = parser.indent + 1 - - start_mark := parser.mark - end_mark := parser.mark - - // Consume the content of the plain scalar. - for { - // Check for a document indicator. - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - if parser.mark.column == 0 && - ((parser.buffer[parser.buffer_pos+0] == '-' && - parser.buffer[parser.buffer_pos+1] == '-' && - parser.buffer[parser.buffer_pos+2] == '-') || - (parser.buffer[parser.buffer_pos+0] == '.' && - parser.buffer[parser.buffer_pos+1] == '.' && - parser.buffer[parser.buffer_pos+2] == '.')) && - is_blankz(parser.buffer, parser.buffer_pos+3) { - break - } - - // Check for a comment. - if parser.buffer[parser.buffer_pos] == '#' { - break - } - - // Consume non-blank characters. - for !is_blankz(parser.buffer, parser.buffer_pos) { - - // Check for indicators that may end a plain scalar. - if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || - (parser.flow_level > 0 && - (parser.buffer[parser.buffer_pos] == ',' || - parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || - parser.buffer[parser.buffer_pos] == '}')) { - break - } - - // Check if we need to join whitespaces and breaks. - if leading_blanks || len(whitespaces) > 0 { - if leading_blanks { - // Do we need to fold line breaks? - if leading_break[0] == '\n' { - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } else { - s = append(s, trailing_breaks...) - } - } else { - s = append(s, leading_break...) - s = append(s, trailing_breaks...) - } - trailing_breaks = trailing_breaks[:0] - leading_break = leading_break[:0] - leading_blanks = false - } else { - s = append(s, whitespaces...) - whitespaces = whitespaces[:0] - } - } - - // Copy the character. - s = read(parser, s) - - end_mark = parser.mark - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - } - - // Is it the end? - if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) { - break - } - - // Consume blank characters. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { - if is_blank(parser.buffer, parser.buffer_pos) { - - // Check for tab characters that abuse indentation. - if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", - start_mark, "found a tab character that violates indentation") - return false - } - - // Consume a space or a tab character. - if !leading_blanks { - whitespaces = read(parser, whitespaces) - } else { - skip(parser) - } - } else { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - // Check if it is a first line break. - if !leading_blanks { - whitespaces = whitespaces[:0] - leading_break = read_line(parser, leading_break) - leading_blanks = true - } else { - trailing_breaks = read_line(parser, trailing_breaks) - } - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check indentation level. - if parser.flow_level == 0 && parser.mark.column < indent { - break - } - } - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_PLAIN_SCALAR_STYLE, - } - - // Note that we change the 'simple_key_allowed' flag. - if leading_blanks { - parser.simple_key_allowed = true - } - return true -} - -func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t) bool { - if parser.newlines > 0 { - return true - } - - var start_mark yaml_mark_t - var text []byte - - for peek := 0; peek < 512; peek++ { - if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { - break - } - if is_blank(parser.buffer, parser.buffer_pos+peek) { - continue - } - if parser.buffer[parser.buffer_pos+peek] == '#' { - seen := parser.mark.index+peek - for { - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if is_breakz(parser.buffer, parser.buffer_pos) { - if parser.mark.index >= seen { - break - } - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } else { - if parser.mark.index >= seen { - if len(text) == 0 { - start_mark = parser.mark - } - text = append(text, parser.buffer[parser.buffer_pos]) - } - skip(parser) - } - } - } - break - } - if len(text) > 0 { - parser.comments = append(parser.comments, yaml_comment_t{ - token_mark: token_mark, - start_mark: start_mark, - line: text, - }) - } - return true -} - -func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) bool { - token := parser.tokens[len(parser.tokens)-1] - - if token.typ == yaml_FLOW_ENTRY_TOKEN && len(parser.tokens) > 1 { - token = parser.tokens[len(parser.tokens)-2] - } - - var token_mark = token.start_mark - var start_mark yaml_mark_t - - var recent_empty = false - var first_empty = parser.newlines <= 1 - - var line = parser.mark.line - var column = parser.mark.column - - var text []byte - - // The foot line is the place where a comment must start to - // still be considered as a foot of the prior content. - // If there's some content in the currently parsed line, then - // the foot is the line below it. - var foot_line = -1 - if scan_mark.line > 0 { - foot_line = parser.mark.line-parser.newlines+1 - if parser.newlines == 0 && parser.mark.column > 1 { - foot_line++ - } - } - - var peek = 0 - for ; peek < 512; peek++ { - if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { - break - } - column++ - if is_blank(parser.buffer, parser.buffer_pos+peek) { - continue - } - c := parser.buffer[parser.buffer_pos+peek] - if is_breakz(parser.buffer, parser.buffer_pos+peek) || parser.flow_level > 0 && (c == ']' || c == '}') { - // Got line break or terminator. - if !recent_empty { - if first_empty && (start_mark.line == foot_line || start_mark.column-1 < parser.indent) { - // This is the first empty line and there were no empty lines before, - // so this initial part of the comment is a foot of the prior token - // instead of being a head for the following one. Split it up. - if len(text) > 0 { - if start_mark.column-1 < parser.indent { - // If dedented it's unrelated to the prior token. - token_mark = start_mark - } - parser.comments = append(parser.comments, yaml_comment_t{ - scan_mark: scan_mark, - token_mark: token_mark, - start_mark: start_mark, - end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, - foot: text, - }) - scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} - token_mark = scan_mark - text = nil - } - } else { - if len(text) > 0 && parser.buffer[parser.buffer_pos+peek] != 0 { - text = append(text, '\n') - } - } - } - if !is_break(parser.buffer, parser.buffer_pos+peek) { - break - } - first_empty = false - recent_empty = true - column = 0 - line++ - continue - } - - if len(text) > 0 && column < parser.indent+1 && column != start_mark.column { - // The comment at the different indentation is a foot of the - // preceding data rather than a head of the upcoming one. - parser.comments = append(parser.comments, yaml_comment_t{ - scan_mark: scan_mark, - token_mark: token_mark, - start_mark: start_mark, - end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, - foot: text, - }) - scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} - token_mark = scan_mark - text = nil - } - - if parser.buffer[parser.buffer_pos+peek] != '#' { - break - } - - if len(text) == 0 { - start_mark = yaml_mark_t{parser.mark.index + peek, line, column} - } else { - text = append(text, '\n') - } - - recent_empty = false - - // Consume until after the consumed comment line. - seen := parser.mark.index+peek - for { - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if is_breakz(parser.buffer, parser.buffer_pos) { - if parser.mark.index >= seen { - break - } - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } else { - if parser.mark.index >= seen { - text = append(text, parser.buffer[parser.buffer_pos]) - } - skip(parser) - } - } - - peek = 0 - column = 0 - line = parser.mark.line - } - - if len(text) > 0 { - parser.comments = append(parser.comments, yaml_comment_t{ - scan_mark: scan_mark, - token_mark: start_mark, - start_mark: start_mark, - end_mark: yaml_mark_t{parser.mark.index + peek - 1, line, column}, - head: text, - }) - } - return true -} diff --git a/vendor/gopkg.in/yaml.v3/sorter.go b/vendor/gopkg.in/yaml.v3/sorter.go deleted file mode 100644 index 9210ece7..00000000 --- a/vendor/gopkg.in/yaml.v3/sorter.go +++ /dev/null @@ -1,134 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package yaml - -import ( - "reflect" - "unicode" -) - -type keyList []reflect.Value - -func (l keyList) Len() int { return len(l) } -func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } -func (l keyList) Less(i, j int) bool { - a := l[i] - b := l[j] - ak := a.Kind() - bk := b.Kind() - for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() { - a = a.Elem() - ak = a.Kind() - } - for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() { - b = b.Elem() - bk = b.Kind() - } - af, aok := keyFloat(a) - bf, bok := keyFloat(b) - if aok && bok { - if af != bf { - return af < bf - } - if ak != bk { - return ak < bk - } - return numLess(a, b) - } - if ak != reflect.String || bk != reflect.String { - return ak < bk - } - ar, br := []rune(a.String()), []rune(b.String()) - digits := false - for i := 0; i < len(ar) && i < len(br); i++ { - if ar[i] == br[i] { - digits = unicode.IsDigit(ar[i]) - continue - } - al := unicode.IsLetter(ar[i]) - bl := unicode.IsLetter(br[i]) - if al && bl { - return ar[i] < br[i] - } - if al || bl { - if digits { - return al - } else { - return bl - } - } - var ai, bi int - var an, bn int64 - if ar[i] == '0' || br[i] == '0' { - for j := i - 1; j >= 0 && unicode.IsDigit(ar[j]); j-- { - if ar[j] != '0' { - an = 1 - bn = 1 - break - } - } - } - for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { - an = an*10 + int64(ar[ai]-'0') - } - for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ { - bn = bn*10 + int64(br[bi]-'0') - } - if an != bn { - return an < bn - } - if ai != bi { - return ai < bi - } - return ar[i] < br[i] - } - return len(ar) < len(br) -} - -// keyFloat returns a float value for v if it is a number/bool -// and whether it is a number/bool or not. -func keyFloat(v reflect.Value) (f float64, ok bool) { - switch v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return float64(v.Int()), true - case reflect.Float32, reflect.Float64: - return v.Float(), true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return float64(v.Uint()), true - case reflect.Bool: - if v.Bool() { - return 1, true - } - return 0, true - } - return 0, false -} - -// numLess returns whether a < b. -// a and b must necessarily have the same kind. -func numLess(a, b reflect.Value) bool { - switch a.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return a.Int() < b.Int() - case reflect.Float32, reflect.Float64: - return a.Float() < b.Float() - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return a.Uint() < b.Uint() - case reflect.Bool: - return !a.Bool() && b.Bool() - } - panic("not a number") -} diff --git a/vendor/gopkg.in/yaml.v3/writerc.go b/vendor/gopkg.in/yaml.v3/writerc.go deleted file mode 100644 index b8a116bf..00000000 --- a/vendor/gopkg.in/yaml.v3/writerc.go +++ /dev/null @@ -1,48 +0,0 @@ -// -// 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 -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -// Set the writer error and return false. -func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { - emitter.error = yaml_WRITER_ERROR - emitter.problem = problem - return false -} - -// Flush the output buffer. -func yaml_emitter_flush(emitter *yaml_emitter_t) bool { - if emitter.write_handler == nil { - panic("write handler not set") - } - - // Check if the buffer is empty. - if emitter.buffer_pos == 0 { - return true - } - - if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { - return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) - } - emitter.buffer_pos = 0 - return true -} diff --git a/vendor/gopkg.in/yaml.v3/yaml.go b/vendor/gopkg.in/yaml.v3/yaml.go deleted file mode 100644 index b5d35a50..00000000 --- a/vendor/gopkg.in/yaml.v3/yaml.go +++ /dev/null @@ -1,662 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package yaml implements YAML support for the Go language. -// -// Source code and other details for the project are available at GitHub: -// -// https://github.com/go-yaml/yaml -// -package yaml - -import ( - "errors" - "fmt" - "io" - "reflect" - "strings" - "sync" - "unicode/utf8" -) - -// The Unmarshaler interface may be implemented by types to customize their -// behavior when being unmarshaled from a YAML document. -type Unmarshaler interface { - UnmarshalYAML(value *Node) error -} - -type obsoleteUnmarshaler interface { - UnmarshalYAML(unmarshal func(interface{}) error) error -} - -// The Marshaler interface may be implemented by types to customize their -// behavior when being marshaled into a YAML document. The returned value -// is marshaled in place of the original value implementing Marshaler. -// -// If an error is returned by MarshalYAML, the marshaling procedure stops -// and returns with the provided error. -type Marshaler interface { - MarshalYAML() (interface{}, error) -} - -// Unmarshal decodes the first document found within the in byte slice -// and assigns decoded values into the out value. -// -// Maps and pointers (to a struct, string, int, etc) are accepted as out -// values. If an internal pointer within a struct is not initialized, -// the yaml package will initialize it if necessary for unmarshalling -// the provided data. The out parameter must not be nil. -// -// The type of the decoded values should be compatible with the respective -// values in out. If one or more values cannot be decoded due to a type -// mismatches, decoding continues partially until the end of the YAML -// content, and a *yaml.TypeError is returned with details for all -// missed values. -// -// Struct fields are only unmarshalled if they are exported (have an -// upper case first letter), and are unmarshalled using the field name -// lowercased as the default key. Custom keys may be defined via the -// "yaml" name in the field tag: the content preceding the first comma -// is used as the key, and the following comma-separated options are -// used to tweak the marshalling process (see Marshal). -// Conflicting names result in a runtime error. -// -// For example: -// -// 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) -} - -// A Decorder reads and decodes YAML values from an input stream. -type Decoder struct { - parser *parser - knownFields bool -} - -// NewDecoder returns a new decoder that reads from r. -// -// The decoder introduces its own buffering and may read -// data from r beyond the YAML values requested. -func NewDecoder(r io.Reader) *Decoder { - return &Decoder{ - parser: newParserFromReader(r), - } -} - -// KnownFields ensures that the keys in decoded mappings to -// exist as fields in the struct being decoded into. -func (dec *Decoder) KnownFields(enable bool) { - dec.knownFields = enable -} - -// Decode reads the next YAML-encoded value from its input -// and stores it in the value pointed to by v. -// -// See the documentation for Unmarshal for details about the -// conversion of YAML into a Go value. -func (dec *Decoder) Decode(v interface{}) (err error) { - d := newDecoder() - d.knownFields = dec.knownFields - defer handleErr(&err) - node := dec.parser.parse() - if node == nil { - return io.EOF - } - out := reflect.ValueOf(v) - if out.Kind() == reflect.Ptr && !out.IsNil() { - out = out.Elem() - } - d.unmarshal(node, out) - if len(d.terrors) > 0 { - return &TypeError{d.terrors} - } - return nil -} - -// Decode decodes the node and stores its data into the value pointed to by v. -// -// See the documentation for Unmarshal for details about the -// conversion of YAML into a Go value. -func (n *Node) Decode(v interface{}) (err error) { - d := newDecoder() - defer handleErr(&err) - out := reflect.ValueOf(v) - if out.Kind() == reflect.Ptr && !out.IsNil() { - out = out.Elem() - } - d.unmarshal(n, out) - if len(d.terrors) > 0 { - return &TypeError{d.terrors} - } - return nil -} - -func unmarshal(in []byte, out interface{}, strict bool) (err error) { - defer handleErr(&err) - d := newDecoder() - p := newParser(in) - defer p.destroy() - node := p.parse() - if node != nil { - v := reflect.ValueOf(out) - if v.Kind() == reflect.Ptr && !v.IsNil() { - v = v.Elem() - } - d.unmarshal(node, v) - } - if len(d.terrors) > 0 { - return &TypeError{d.terrors} - } - return nil -} - -// Marshal serializes the value provided into a YAML document. The structure -// of the generated document will reflect the structure of the value itself. -// Maps and pointers (to struct, string, int, etc) are accepted as the in value. -// -// Struct fields are only marshalled if they are exported (have an upper case -// first letter), and are marshalled using the field name lowercased as the -// default key. Custom keys may be defined via the "yaml" name in the field -// tag: the content preceding the first comma is used as the key, and the -// following comma-separated options are used to tweak the marshalling process. -// Conflicting names result in a runtime error. -// -// The field tag format accepted is: -// -// `(...) yaml:"[][,[,]]" (...)` -// -// 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 included if that method returns true. -// -// 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. -// -// 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" -// -func Marshal(in interface{}) (out []byte, err error) { - defer handleErr(&err) - e := newEncoder() - defer e.destroy() - e.marshalDoc("", reflect.ValueOf(in)) - e.finish() - out = e.out - return -} - -// An Encoder writes YAML values to an output stream. -type Encoder struct { - encoder *encoder -} - -// NewEncoder returns a new encoder that writes to w. -// The Encoder should be closed after use to flush all data -// to w. -func NewEncoder(w io.Writer) *Encoder { - return &Encoder{ - encoder: newEncoderWithWriter(w), - } -} - -// Encode writes the YAML encoding of v to the stream. -// If multiple items are encoded to the stream, the -// second and subsequent document will be preceded -// with a "---" document separator, but the first will not. -// -// See the documentation for Marshal for details about the conversion of Go -// values to YAML. -func (e *Encoder) Encode(v interface{}) (err error) { - defer handleErr(&err) - e.encoder.marshalDoc("", reflect.ValueOf(v)) - return nil -} - -// SetIndent changes the used indentation used when encoding. -func (e *Encoder) SetIndent(spaces int) { - if spaces < 0 { - panic("yaml: cannot indent to a negative number of spaces") - } - e.encoder.indent = spaces -} - -// Close closes the encoder by writing any remaining data. -// It does not write a stream terminating string "...". -func (e *Encoder) Close() (err error) { - defer handleErr(&err) - e.encoder.finish() - return nil -} - -func handleErr(err *error) { - if v := recover(); v != nil { - if e, ok := v.(yamlError); ok { - *err = e.err - } else { - panic(v) - } - } -} - -type yamlError struct { - err error -} - -func fail(err error) { - panic(yamlError{err}) -} - -func failf(format string, args ...interface{}) { - panic(yamlError{fmt.Errorf("yaml: "+format, args...)}) -} - -// A TypeError is returned by Unmarshal when one or more fields in -// the YAML document cannot be properly decoded into the requested -// types. When this error is returned, the value is still -// unmarshaled partially. -type TypeError struct { - Errors []string -} - -func (e *TypeError) Error() string { - return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n ")) -} - -type Kind uint32 - -const ( - DocumentNode Kind = 1 << iota - SequenceNode - MappingNode - ScalarNode - AliasNode -) - -type Style uint32 - -const ( - TaggedStyle Style = 1 << iota - DoubleQuotedStyle - SingleQuotedStyle - LiteralStyle - FoldedStyle - FlowStyle -) - -// Node represents an element in the YAML document hierarchy. While documents -// are typically encoded and decoded into higher level types, such as structs -// and maps, Node is an intermediate representation that allows detailed -// control over the content being decoded or encoded. -// -// Values that make use of the Node type interact with the yaml package in the -// same way any other type would do, by encoding and decoding yaml data -// directly or indirectly into them. -// -// For example: -// -// var person struct { -// Name string -// Address yaml.Node -// } -// err := yaml.Unmarshal(data, &person) -// -// Or by itself: -// -// 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 - - // Style allows customizing the apperance of the node in the tree. - Style Style - - // Tag holds the YAML tag defining the data type for the value. - // When decoding, this field will always be set to the resolved tag, - // even when it wasn't explicitly provided in the YAML content. - // When encoding, if this field is unset the value type will be - // implied from the node properties, and if it is set, it will only - // be serialized into the representation if TaggedStyle is used or - // the implicit tag diverges from the provided one. - Tag string - - // Value holds the unescaped and unquoted represenation of the value. - Value string - - // Anchor holds the anchor name for this node, which allows aliases to point to it. - Anchor string - - // Alias holds the node that this alias points to. Only valid when Kind is AliasNode. - Alias *Node - - // Content holds contained nodes for documents, mappings, and sequences. - Content []*Node - - // HeadComment holds any comments in the lines preceding the node and - // not separated by an empty line. - HeadComment string - - // LineComment holds any comments at the end of the line where the node is in. - LineComment string - - // FootComment holds any comments following the node and before empty lines. - FootComment string - - // Line and Column hold the node position in the decoded YAML text. - // These fields are not respected when encoding the node. - Line int - Column int -} - -// 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. -func (n *Node) LongTag() string { - return longTag(n.ShortTag()) -} - -// ShortTag returns the short form of the YAML tag that indicates data type for -// the node. If the Tag field isn't explicitly defined, one will be computed -// based on the node properties. -func (n *Node) ShortTag() string { - if n.indicatedString() { - return strTag - } - if n.Tag == "" || n.Tag == "!" { - switch n.Kind { - case MappingNode: - return mapTag - case SequenceNode: - return seqTag - case AliasNode: - if n.Alias != nil { - return n.Alias.ShortTag() - } - case ScalarNode: - tag, _ := resolve("", n.Value) - return tag - } - return "" - } - return shortTag(n.Tag) -} - -func (n *Node) indicatedString() bool { - return n.Kind == ScalarNode && - (shortTag(n.Tag) == strTag || - (n.Tag == "" || n.Tag == "!") && n.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0) -} - -// SetString is a convenience function that sets the node to a string value -// and defines its style in a pleasant way depending on its content. -func (n *Node) SetString(s string) { - n.Kind = ScalarNode - if utf8.ValidString(s) { - n.Value = s - n.Tag = strTag - } else { - n.Value = encodeBase64(s) - n.Tag = binaryTag - } - if strings.Contains(n.Value, "\n") { - n.Style = LiteralStyle - } -} - -// -------------------------------------------------------------------------- -// Maintain a mapping of keys to structure field indexes - -// The code in this section was copied from mgo/bson. - -// structInfo holds details for the serialization of fields of -// a given struct. -type structInfo struct { - FieldsMap map[string]fieldInfo - FieldsList []fieldInfo - - // InlineMap is the number of the field in the struct that - // contains an ,inline map, or -1 if there's none. - InlineMap int - - // InlineUnmarshalers holds indexes to inlined fields that - // contain unmarshaler values. - InlineUnmarshalers [][]int -} - -type fieldInfo struct { - Key string - Num int - OmitEmpty bool - Flow bool - // Id holds the unique field identifier, so we can cheaply - // check for field duplicates without maintaining an extra map. - Id int - - // Inline holds the field index if the field is part of an inlined struct. - Inline []int -} - -var structMap = make(map[reflect.Type]*structInfo) -var fieldMapMutex sync.RWMutex -var unmarshalerType reflect.Type - -func init() { - var v Unmarshaler - unmarshalerType = reflect.ValueOf(&v).Elem().Type() -} - -func getStructInfo(st reflect.Type) (*structInfo, error) { - fieldMapMutex.RLock() - sinfo, found := structMap[st] - fieldMapMutex.RUnlock() - if found { - return sinfo, nil - } - - n := st.NumField() - fieldsMap := make(map[string]fieldInfo) - fieldsList := make([]fieldInfo, 0, n) - inlineMap := -1 - inlineUnmarshalers := [][]int(nil) - for i := 0; i != n; i++ { - field := st.Field(i) - if field.PkgPath != "" && !field.Anonymous { - continue // Private field - } - - info := fieldInfo{Num: i} - - tag := field.Tag.Get("yaml") - if tag == "" && strings.Index(string(field.Tag), ":") < 0 { - tag = string(field.Tag) - } - if tag == "-" { - continue - } - - inline := false - fields := strings.Split(tag, ",") - if len(fields) > 1 { - for _, flag := range fields[1:] { - switch flag { - case "omitempty": - info.OmitEmpty = true - case "flow": - info.Flow = true - case "inline": - inline = true - default: - return nil, errors.New(fmt.Sprintf("unsupported flag %q in tag %q of type %s", flag, tag, st)) - } - } - tag = fields[0] - } - - if inline { - switch field.Type.Kind() { - case reflect.Map: - if inlineMap >= 0 { - return nil, errors.New("multiple ,inline maps in struct " + st.String()) - } - if field.Type.Key() != reflect.TypeOf("") { - return nil, errors.New("option ,inline needs a map with string keys in struct " + st.String()) - } - inlineMap = info.Num - case reflect.Struct, reflect.Ptr: - ftype := field.Type - for ftype.Kind() == reflect.Ptr { - ftype = ftype.Elem() - } - if ftype.Kind() != reflect.Struct { - return nil, errors.New("option ,inline may only be used on a struct or map field") - } - if reflect.PtrTo(ftype).Implements(unmarshalerType) { - inlineUnmarshalers = append(inlineUnmarshalers, []int{i}) - } else { - sinfo, err := getStructInfo(ftype) - if err != nil { - return nil, err - } - for _, index := range sinfo.InlineUnmarshalers { - inlineUnmarshalers = append(inlineUnmarshalers, append([]int{i}, index...)) - } - for _, finfo := range sinfo.FieldsList { - if _, found := fieldsMap[finfo.Key]; found { - msg := "duplicated key '" + finfo.Key + "' in struct " + st.String() - return nil, errors.New(msg) - } - if finfo.Inline == nil { - finfo.Inline = []int{i, finfo.Num} - } else { - finfo.Inline = append([]int{i}, finfo.Inline...) - } - finfo.Id = len(fieldsList) - fieldsMap[finfo.Key] = finfo - fieldsList = append(fieldsList, finfo) - } - } - default: - return nil, errors.New("option ,inline may only be used on a struct or map field") - } - continue - } - - if tag != "" { - info.Key = tag - } else { - info.Key = strings.ToLower(field.Name) - } - - if _, found = fieldsMap[info.Key]; found { - msg := "duplicated key '" + info.Key + "' in struct " + st.String() - return nil, errors.New(msg) - } - - info.Id = len(fieldsList) - fieldsList = append(fieldsList, info) - fieldsMap[info.Key] = info - } - - sinfo = &structInfo{ - FieldsMap: fieldsMap, - FieldsList: fieldsList, - InlineMap: inlineMap, - InlineUnmarshalers: inlineUnmarshalers, - } - - fieldMapMutex.Lock() - structMap[st] = sinfo - fieldMapMutex.Unlock() - return sinfo, nil -} - -// IsZeroer is used to check whether an object is zero to -// determine whether it should be omitted when marshaling -// with the omitempty flag. One notable implementation -// is time.Time. -type IsZeroer interface { - IsZero() bool -} - -func isZero(v reflect.Value) bool { - kind := v.Kind() - if z, ok := v.Interface().(IsZeroer); ok { - if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() { - return true - } - return z.IsZero() - } - switch kind { - case reflect.String: - return len(v.String()) == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() - case reflect.Slice: - return v.Len() == 0 - case reflect.Map: - return v.Len() == 0 - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Struct: - vt := v.Type() - for i := v.NumField() - 1; i >= 0; i-- { - if vt.Field(i).PkgPath != "" { - continue // Private field - } - if !isZero(v.Field(i)) { - return false - } - } - return true - } - return false -} diff --git a/vendor/gopkg.in/yaml.v3/yamlh.go b/vendor/gopkg.in/yaml.v3/yamlh.go deleted file mode 100644 index 2719cfbb..00000000 --- a/vendor/gopkg.in/yaml.v3/yamlh.go +++ /dev/null @@ -1,805 +0,0 @@ -// -// 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 -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "fmt" - "io" -) - -// The version directive data. -type yaml_version_directive_t struct { - major int8 // The major version number. - minor int8 // The minor version number. -} - -// The tag directive data. -type yaml_tag_directive_t struct { - handle []byte // The tag handle. - prefix []byte // The tag prefix. -} - -type yaml_encoding_t int - -// The stream encoding. -const ( - // Let the parser choose the encoding. - yaml_ANY_ENCODING yaml_encoding_t = iota - - yaml_UTF8_ENCODING // The default UTF-8 encoding. - yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM. - yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM. -) - -type yaml_break_t int - -// Line break types. -const ( - // Let the parser choose the break type. - yaml_ANY_BREAK yaml_break_t = iota - - yaml_CR_BREAK // Use CR for line breaks (Mac style). - yaml_LN_BREAK // Use LN for line breaks (Unix style). - yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style). -) - -type yaml_error_type_t int - -// Many bad things could happen with the parser and emitter. -const ( - // No error is produced. - yaml_NO_ERROR yaml_error_type_t = iota - - yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory. - yaml_READER_ERROR // Cannot read or decode the input stream. - yaml_SCANNER_ERROR // Cannot scan the input stream. - yaml_PARSER_ERROR // Cannot parse the input stream. - yaml_COMPOSER_ERROR // Cannot compose a YAML document. - yaml_WRITER_ERROR // Cannot write to the output stream. - yaml_EMITTER_ERROR // Cannot emit a YAML stream. -) - -// The pointer position. -type yaml_mark_t struct { - index int // The position index. - line int // The position line. - column int // The position column. -} - -// Node Styles - -type yaml_style_t int8 - -type yaml_scalar_style_t yaml_style_t - -// Scalar styles. -const ( - // Let the emitter choose the style. - yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = 0 - - yaml_PLAIN_SCALAR_STYLE yaml_scalar_style_t = 1 << iota // The plain scalar style. - yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. - yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. - yaml_LITERAL_SCALAR_STYLE // The literal scalar style. - yaml_FOLDED_SCALAR_STYLE // The folded scalar style. -) - -type yaml_sequence_style_t yaml_style_t - -// Sequence styles. -const ( - // Let the emitter choose the style. - yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota - - yaml_BLOCK_SEQUENCE_STYLE // The block sequence style. - yaml_FLOW_SEQUENCE_STYLE // The flow sequence style. -) - -type yaml_mapping_style_t yaml_style_t - -// Mapping styles. -const ( - // Let the emitter choose the style. - yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota - - yaml_BLOCK_MAPPING_STYLE // The block mapping style. - yaml_FLOW_MAPPING_STYLE // The flow mapping style. -) - -// Tokens - -type yaml_token_type_t int - -// Token types. -const ( - // An empty token. - yaml_NO_TOKEN yaml_token_type_t = iota - - yaml_STREAM_START_TOKEN // A STREAM-START token. - yaml_STREAM_END_TOKEN // A STREAM-END token. - - yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token. - yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token. - yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token. - yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token. - - yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token. - yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token. - yaml_BLOCK_END_TOKEN // A BLOCK-END token. - - yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token. - yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token. - yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token. - yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token. - - yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token. - yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token. - yaml_KEY_TOKEN // A KEY token. - yaml_VALUE_TOKEN // A VALUE token. - - yaml_ALIAS_TOKEN // An ALIAS token. - yaml_ANCHOR_TOKEN // An ANCHOR token. - yaml_TAG_TOKEN // A TAG token. - yaml_SCALAR_TOKEN // A SCALAR token. -) - -func (tt yaml_token_type_t) String() string { - switch tt { - case yaml_NO_TOKEN: - return "yaml_NO_TOKEN" - case yaml_STREAM_START_TOKEN: - return "yaml_STREAM_START_TOKEN" - case yaml_STREAM_END_TOKEN: - return "yaml_STREAM_END_TOKEN" - case yaml_VERSION_DIRECTIVE_TOKEN: - return "yaml_VERSION_DIRECTIVE_TOKEN" - case yaml_TAG_DIRECTIVE_TOKEN: - return "yaml_TAG_DIRECTIVE_TOKEN" - case yaml_DOCUMENT_START_TOKEN: - return "yaml_DOCUMENT_START_TOKEN" - case yaml_DOCUMENT_END_TOKEN: - return "yaml_DOCUMENT_END_TOKEN" - case yaml_BLOCK_SEQUENCE_START_TOKEN: - return "yaml_BLOCK_SEQUENCE_START_TOKEN" - case yaml_BLOCK_MAPPING_START_TOKEN: - return "yaml_BLOCK_MAPPING_START_TOKEN" - case yaml_BLOCK_END_TOKEN: - return "yaml_BLOCK_END_TOKEN" - case yaml_FLOW_SEQUENCE_START_TOKEN: - return "yaml_FLOW_SEQUENCE_START_TOKEN" - case yaml_FLOW_SEQUENCE_END_TOKEN: - return "yaml_FLOW_SEQUENCE_END_TOKEN" - case yaml_FLOW_MAPPING_START_TOKEN: - return "yaml_FLOW_MAPPING_START_TOKEN" - case yaml_FLOW_MAPPING_END_TOKEN: - return "yaml_FLOW_MAPPING_END_TOKEN" - case yaml_BLOCK_ENTRY_TOKEN: - return "yaml_BLOCK_ENTRY_TOKEN" - case yaml_FLOW_ENTRY_TOKEN: - return "yaml_FLOW_ENTRY_TOKEN" - case yaml_KEY_TOKEN: - return "yaml_KEY_TOKEN" - case yaml_VALUE_TOKEN: - return "yaml_VALUE_TOKEN" - case yaml_ALIAS_TOKEN: - return "yaml_ALIAS_TOKEN" - case yaml_ANCHOR_TOKEN: - return "yaml_ANCHOR_TOKEN" - case yaml_TAG_TOKEN: - return "yaml_TAG_TOKEN" - case yaml_SCALAR_TOKEN: - return "yaml_SCALAR_TOKEN" - } - return "" -} - -// The token structure. -type yaml_token_t struct { - // The token type. - typ yaml_token_type_t - - // The start/end of the token. - start_mark, end_mark yaml_mark_t - - // The stream encoding (for yaml_STREAM_START_TOKEN). - encoding yaml_encoding_t - - // The alias/anchor/scalar value or tag/tag directive handle - // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN). - value []byte - - // The tag suffix (for yaml_TAG_TOKEN). - suffix []byte - - // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN). - prefix []byte - - // The scalar style (for yaml_SCALAR_TOKEN). - style yaml_scalar_style_t - - // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN). - major, minor int8 -} - -// Events - -type yaml_event_type_t int8 - -// Event types. -const ( - // An empty event. - yaml_NO_EVENT yaml_event_type_t = iota - - yaml_STREAM_START_EVENT // A STREAM-START event. - yaml_STREAM_END_EVENT // A STREAM-END event. - yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event. - yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event. - yaml_ALIAS_EVENT // An ALIAS event. - yaml_SCALAR_EVENT // A SCALAR event. - yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event. - yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. - yaml_MAPPING_START_EVENT // A MAPPING-START event. - yaml_MAPPING_END_EVENT // A MAPPING-END event. - yaml_TAIL_COMMENT_EVENT -) - -var eventStrings = []string{ - yaml_NO_EVENT: "none", - yaml_STREAM_START_EVENT: "stream start", - yaml_STREAM_END_EVENT: "stream end", - yaml_DOCUMENT_START_EVENT: "document start", - yaml_DOCUMENT_END_EVENT: "document end", - yaml_ALIAS_EVENT: "alias", - yaml_SCALAR_EVENT: "scalar", - yaml_SEQUENCE_START_EVENT: "sequence start", - yaml_SEQUENCE_END_EVENT: "sequence end", - yaml_MAPPING_START_EVENT: "mapping start", - yaml_MAPPING_END_EVENT: "mapping end", - yaml_TAIL_COMMENT_EVENT: "tail comment", -} - -func (e yaml_event_type_t) String() string { - if e < 0 || int(e) >= len(eventStrings) { - return fmt.Sprintf("unknown event %d", e) - } - return eventStrings[e] -} - -// The event structure. -type yaml_event_t struct { - - // The event type. - typ yaml_event_type_t - - // The start and end of the event. - start_mark, end_mark yaml_mark_t - - // The document encoding (for yaml_STREAM_START_EVENT). - encoding yaml_encoding_t - - // The version directive (for yaml_DOCUMENT_START_EVENT). - version_directive *yaml_version_directive_t - - // The list of tag directives (for yaml_DOCUMENT_START_EVENT). - tag_directives []yaml_tag_directive_t - - // The comments - head_comment []byte - line_comment []byte - foot_comment []byte - tail_comment []byte - - // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). - anchor []byte - - // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). - tag []byte - - // The scalar value (for yaml_SCALAR_EVENT). - value []byte - - // Is the document start/end indicator implicit, or the tag optional? - // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT). - implicit bool - - // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT). - quoted_implicit bool - - // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). - style yaml_style_t -} - -func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) } -func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) } -func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) } - -// Nodes - -const ( - yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null. - yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false. - yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values. - yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values. - yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values. - yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values. - - yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences. - yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping. - - // Not in original libyaml. - yaml_BINARY_TAG = "tag:yaml.org,2002:binary" - yaml_MERGE_TAG = "tag:yaml.org,2002:merge" - - yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str. - yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq. - yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map. -) - -type yaml_node_type_t int - -// Node types. -const ( - // An empty node. - yaml_NO_NODE yaml_node_type_t = iota - - yaml_SCALAR_NODE // A scalar node. - yaml_SEQUENCE_NODE // A sequence node. - yaml_MAPPING_NODE // A mapping node. -) - -// An element of a sequence node. -type yaml_node_item_t int - -// An element of a mapping node. -type yaml_node_pair_t struct { - key int // The key of the element. - value int // The value of the element. -} - -// The node structure. -type yaml_node_t struct { - typ yaml_node_type_t // The node type. - tag []byte // The node tag. - - // The node data. - - // The scalar parameters (for yaml_SCALAR_NODE). - scalar struct { - value []byte // The scalar value. - length int // The length of the scalar value. - style yaml_scalar_style_t // The scalar style. - } - - // The sequence parameters (for YAML_SEQUENCE_NODE). - sequence struct { - items_data []yaml_node_item_t // The stack of sequence items. - style yaml_sequence_style_t // The sequence style. - } - - // The mapping parameters (for yaml_MAPPING_NODE). - mapping struct { - pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value). - pairs_start *yaml_node_pair_t // The beginning of the stack. - pairs_end *yaml_node_pair_t // The end of the stack. - pairs_top *yaml_node_pair_t // The top of the stack. - style yaml_mapping_style_t // The mapping style. - } - - start_mark yaml_mark_t // The beginning of the node. - end_mark yaml_mark_t // The end of the node. - -} - -// The document structure. -type yaml_document_t struct { - - // The document nodes. - nodes []yaml_node_t - - // The version directive. - version_directive *yaml_version_directive_t - - // The list of tag directives. - tag_directives_data []yaml_tag_directive_t - tag_directives_start int // The beginning of the tag directives list. - tag_directives_end int // The end of the tag directives list. - - start_implicit int // Is the document start indicator implicit? - end_implicit int // Is the document end indicator implicit? - - // The start/end of the document. - start_mark, end_mark yaml_mark_t -} - -// The prototype of a read handler. -// -// The read handler is called when the parser needs to read more bytes from the -// source. The handler should write not more than size bytes to the buffer. -// 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(). -// [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. -// -// On success, the handler should return 1. If the handler failed, -// the returned value should be 0. On EOF, the handler should set the -// size_read to 0 and return 1. -type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error) - -// This structure holds information about a potential simple key. -type yaml_simple_key_t struct { - possible bool // Is a simple key possible? - required bool // Is a simple key required? - token_number int // The number of the token. - mark yaml_mark_t // The position mark. -} - -// The states of the parser. -type yaml_parser_state_t int - -const ( - yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota - - yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document. - yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START. - yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document. - yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END. - yaml_PARSE_BLOCK_NODE_STATE // Expect a block node. - yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence. - yaml_PARSE_FLOW_NODE_STATE // Expect a flow node. - yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence. - yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence. - yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence. - yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. - yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key. - yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value. - yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry. - yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. - yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. - yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. - yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping. - yaml_PARSE_END_STATE // Expect nothing. -) - -func (ps yaml_parser_state_t) String() string { - switch ps { - case yaml_PARSE_STREAM_START_STATE: - return "yaml_PARSE_STREAM_START_STATE" - case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: - return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE" - case yaml_PARSE_DOCUMENT_START_STATE: - return "yaml_PARSE_DOCUMENT_START_STATE" - case yaml_PARSE_DOCUMENT_CONTENT_STATE: - return "yaml_PARSE_DOCUMENT_CONTENT_STATE" - case yaml_PARSE_DOCUMENT_END_STATE: - return "yaml_PARSE_DOCUMENT_END_STATE" - case yaml_PARSE_BLOCK_NODE_STATE: - return "yaml_PARSE_BLOCK_NODE_STATE" - case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: - return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE" - case yaml_PARSE_FLOW_NODE_STATE: - return "yaml_PARSE_FLOW_NODE_STATE" - case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: - return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE" - case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: - return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE" - case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: - return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE" - case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: - return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE" - case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: - return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE" - case yaml_PARSE_FLOW_MAPPING_KEY_STATE: - return "yaml_PARSE_FLOW_MAPPING_KEY_STATE" - case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: - return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: - return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE" - case yaml_PARSE_END_STATE: - return "yaml_PARSE_END_STATE" - } - return "" -} - -// This structure holds aliases data. -type yaml_alias_data_t struct { - anchor []byte // The anchor. - index int // The node id. - mark yaml_mark_t // The anchor mark. -} - -// The parser structure. -// -// All members are internal. Manage the structure using the -// yaml_parser_ family of functions. -type yaml_parser_t struct { - - // Error handling - - error yaml_error_type_t // Error type. - - problem string // Error description. - - // The byte about which the problem occurred. - problem_offset int - problem_value int - problem_mark yaml_mark_t - - // The error context. - context string - context_mark yaml_mark_t - - // Reader stuff - - read_handler yaml_read_handler_t // Read handler. - - input_reader io.Reader // File input data. - input []byte // String input data. - input_pos int - - eof bool // EOF flag - - buffer []byte // The working buffer. - buffer_pos int // The current position of the buffer. - - unread int // The number of unread characters in the buffer. - - newlines int // The number of line breaks since last non-break/non-blank character - - raw_buffer []byte // The raw buffer. - raw_buffer_pos int // The current position of the buffer. - - encoding yaml_encoding_t // The input encoding. - - offset int // The offset of the current position (in bytes). - mark yaml_mark_t // The mark of the current position. - - // Comments - - head_comment []byte // The current head comments - line_comment []byte // The current line comments - foot_comment []byte // The current foot comments - tail_comment []byte // Foot comment that happens at the end of a block. - stem_comment []byte // Comment in item preceding a nested structure (list inside list item, etc) - - comments []yaml_comment_t // The folded comments for all parsed tokens - comments_head int - - // Scanner stuff - - stream_start_produced bool // Have we started to scan the input stream? - stream_end_produced bool // Have we reached the end of the input stream? - - flow_level int // The number of unclosed '[' and '{' indicators. - - tokens []yaml_token_t // The tokens queue. - tokens_head int // The head of the tokens queue. - tokens_parsed int // The number of tokens fetched from the queue. - token_available bool // Does the tokens queue contain a token ready for dequeueing. - - indent int // The current indentation level. - indents []int // The indentation levels stack. - - simple_key_allowed bool // May a simple key occur at the current position? - simple_keys []yaml_simple_key_t // The stack of simple keys. - simple_keys_by_tok map[int]int // possible simple_key indexes indexed by token_number - - // Parser stuff - - state yaml_parser_state_t // The current parser state. - states []yaml_parser_state_t // The parser states stack. - marks []yaml_mark_t // The stack of marks. - tag_directives []yaml_tag_directive_t // The list of TAG directives. - - // Dumper stuff - - aliases []yaml_alias_data_t // The alias data. - - document *yaml_document_t // The currently parsed document. -} - -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 - end_mark yaml_mark_t // Position where comment terminated - - head []byte - line []byte - foot []byte -} - -// Emitter Definitions - -// The prototype of a write handler. -// -// The write handler is called when the emitter needs to flush the accumulated -// characters to the output. The handler should write @a size bytes of the -// @a buffer to the output. -// -// @param[in,out] data A pointer to an application data specified by -// 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 - -// The emitter states. -const ( - // Expect STREAM-START. - yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota - - yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END. - yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END. - yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. - yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. - yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. - yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE // Expect the next item of a flow sequence, with the comma already written out - yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. - yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE // Expect the next key of a flow mapping, with the comma already written out - yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. - yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence. - yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence. - yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping. - yaml_EMIT_END_STATE // Expect nothing. -) - -// The emitter structure. -// -// All members are internal. Manage the structure using the @c yaml_emitter_ -// family of functions. -type yaml_emitter_t struct { - - // Error handling - - error yaml_error_type_t // Error type. - problem string // Error description. - - // Writer stuff - - write_handler yaml_write_handler_t // Write handler. - - output_buffer *[]byte // String output data. - output_writer io.Writer // File output data. - - buffer []byte // The working buffer. - buffer_pos int // The current position of the buffer. - - raw_buffer []byte // The raw buffer. - raw_buffer_pos int // The current position of the buffer. - - encoding yaml_encoding_t // The stream encoding. - - // Emitter stuff - - canonical bool // If the output is in the canonical style? - best_indent int // The number of indentation spaces. - best_width int // The preferred width of the output lines. - unicode bool // Allow unescaped non-ASCII characters? - line_break yaml_break_t // The preferred line break. - - state yaml_emitter_state_t // The current emitter state. - states []yaml_emitter_state_t // The stack of states. - - events []yaml_event_t // The event queue. - events_head int // The head of the event queue. - - indents []int // The stack of indentation levels. - - tag_directives []yaml_tag_directive_t // The list of tag directives. - - indent int // The current indentation level. - - flow_level int // The current flow level. - - root_context bool // Is it the document root context? - sequence_context bool // Is it a sequence context? - mapping_context bool // Is it a mapping context? - simple_key_context bool // Is it a simple mapping key context? - - line int // The current line. - column int // The current column. - whitespace bool // If the last character was a whitespace? - indention bool // If the last character was an indentation character (' ', '-', '?', ':')? - open_ended bool // If an explicit document end is required? - - space_above bool // Is there's an empty line above? - foot_indent int // The indent used to write the foot comment above, or -1 if none. - - // Anchor analysis. - anchor_data struct { - anchor []byte // The anchor value. - alias bool // Is it an alias? - } - - // Tag analysis. - tag_data struct { - handle []byte // The tag handle. - suffix []byte // The tag suffix. - } - - // Scalar analysis. - scalar_data struct { - value []byte // The scalar value. - multiline bool // Does the scalar contain line breaks? - flow_plain_allowed bool // Can the scalar be expessed in the flow plain style? - block_plain_allowed bool // Can the scalar be expressed in the block plain style? - single_quoted_allowed bool // Can the scalar be expressed in the single quoted style? - block_allowed bool // Can the scalar be expressed in the literal or folded styles? - style yaml_scalar_style_t // The output style. - } - - // Comments - head_comment []byte - line_comment []byte - foot_comment []byte - tail_comment []byte - - // Dumper stuff - - opened bool // If the stream was already opened? - closed bool // If the stream was already closed? - - // The information associated with the document nodes. - anchors *struct { - references int // The number of references. - anchor int // The anchor id. - serialized bool // If the node has been emitted? - } - - last_anchor_id int // The last assigned anchor id. - - document *yaml_document_t // The currently emitted document. -} diff --git a/vendor/gopkg.in/yaml.v3/yamlprivateh.go b/vendor/gopkg.in/yaml.v3/yamlprivateh.go deleted file mode 100644 index e88f9c54..00000000 --- a/vendor/gopkg.in/yaml.v3/yamlprivateh.go +++ /dev/null @@ -1,198 +0,0 @@ -// -// 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 -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -const ( - // The size of the input raw buffer. - input_raw_buffer_size = 512 - - // The size of the input buffer. - // It should be possible to decode the whole raw buffer. - input_buffer_size = input_raw_buffer_size * 3 - - // The size of the output buffer. - output_buffer_size = 128 - - // The size of the output raw buffer. - // It should be possible to encode the whole output buffer. - output_raw_buffer_size = (output_buffer_size*2 + 2) - - // The size of other stacks and queues. - initial_stack_size = 16 - initial_queue_size = 16 - initial_string_size = 16 -) - -// Check if the character at the specified position is an alphabetical -// character, a digit, '_', or '-'. -func is_alpha(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-' -} - -// Check if the character at the specified position is a digit. -func is_digit(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' -} - -// Get the value of a digit. -func as_digit(b []byte, i int) int { - return int(b[i]) - '0' -} - -// Check if the character at the specified position is a hex-digit. -func is_hex(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f' -} - -// Get the value of a hex-digit. -func as_hex(b []byte, i int) int { - bi := b[i] - if bi >= 'A' && bi <= 'F' { - return int(bi) - 'A' + 10 - } - if bi >= 'a' && bi <= 'f' { - return int(bi) - 'a' + 10 - } - return int(bi) - '0' -} - -// Check if the character is ASCII. -func is_ascii(b []byte, i int) bool { - return b[i] <= 0x7F -} - -// Check if the character at the start of the buffer can be printed unescaped. -func is_printable(b []byte, i int) bool { - return ((b[i] == 0x0A) || // . == #x0A - (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E - (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF - (b[i] > 0xC2 && b[i] < 0xED) || - (b[i] == 0xED && b[i+1] < 0xA0) || - (b[i] == 0xEE) || - (b[i] == 0xEF && // #xE000 <= . <= #xFFFD - !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF - !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF)))) -} - -// Check if the character at the specified position is NUL. -func is_z(b []byte, i int) bool { - return b[i] == 0x00 -} - -// Check if the beginning of the buffer is a BOM. -func is_bom(b []byte, i int) bool { - return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF -} - -// Check if the character at the specified position is space. -func is_space(b []byte, i int) bool { - return b[i] == ' ' -} - -// Check if the character at the specified position is tab. -func is_tab(b []byte, i int) bool { - return b[i] == '\t' -} - -// Check if the character at the specified position is blank (space or tab). -func is_blank(b []byte, i int) bool { - //return is_space(b, i) || is_tab(b, i) - return b[i] == ' ' || b[i] == '\t' -} - -// Check if the character at the specified position is a line break. -func is_break(b []byte, i int) bool { - return (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) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029) -} - -func is_crlf(b []byte, i int) bool { - return b[i] == '\r' && b[i+1] == '\n' -} - -// Check if the character is a line break or NUL. -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) - 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) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - // is_z: - b[i] == 0) -} - -// Check if the character is a line break, space, or NUL. -func is_spacez(b []byte, i int) bool { - //return is_space(b, i) || is_breakz(b, i) - return ( - // is_space: - b[i] == ' ' || - // is_breakz: - 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) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - b[i] == 0) -} - -// Check if the character is a line break, space, tab, or NUL. -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_breakz: - 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) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - b[i] == 0) -} - -// Determine the width of the character. -func width(b byte) int { - // Don't replace these by a switch without first - // confirming that it is being inlined. - if b&0x80 == 0x00 { - return 1 - } - if b&0xE0 == 0xC0 { - return 2 - } - if b&0xF0 == 0xE0 { - return 3 - } - if b&0xF8 == 0xF0 { - return 4 - } - return 0 - -} diff --git a/vendor/honnef.co/go/tools/LICENSE b/vendor/honnef.co/go/tools/LICENSE new file mode 100644 index 00000000..dfd03145 --- /dev/null +++ b/vendor/honnef.co/go/tools/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2016 Dominik Honnef + +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/honnef.co/go/tools/LICENSE-THIRD-PARTY b/vendor/honnef.co/go/tools/LICENSE-THIRD-PARTY new file mode 100644 index 00000000..7c241b71 --- /dev/null +++ b/vendor/honnef.co/go/tools/LICENSE-THIRD-PARTY @@ -0,0 +1,226 @@ +Staticcheck and its related tools make use of third party projects, +either by reusing their code, or by statically linking them into +resulting binaries. These projects are: + +* The Go Programming Language - https://golang.org/ + + 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. + + +* github.com/BurntSushi/toml - https://github.com/BurntSushi/toml + + The MIT License (MIT) + + Copyright (c) 2013 TOML authors + + 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. + + +* github.com/google/renameio - https://github.com/google/renameio + + Copyright 2018 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +* github.com/kisielk/gotool – https://github.com/kisielk/gotool + + Copyright (c) 2013 Kamil Kisiel + + 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. + + All the files in this distribution are covered under either the MIT + license (see the file LICENSE) except some files mentioned below. + + match.go, match_test.go: + + 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. + + +* github.com/rogpeppe/go-internal - https://github.com/rogpeppe/go-internal + + Copyright (c) 2018 The Go Authors. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +* golang.org/x/mod/module - https://github.com/golang/mod + + 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. + + +* golang.org/x/tools/go/analysis - https://github.com/golang/tools + + 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. + diff --git a/vendor/honnef.co/go/tools/arg/arg.go b/vendor/honnef.co/go/tools/arg/arg.go new file mode 100644 index 00000000..1e7f30db --- /dev/null +++ b/vendor/honnef.co/go/tools/arg/arg.go @@ -0,0 +1,48 @@ +package arg + +var args = map[string]int{ + "(*encoding/json.Decoder).Decode.v": 0, + "(*encoding/json.Encoder).Encode.v": 0, + "(*encoding/xml.Decoder).Decode.v": 0, + "(*encoding/xml.Encoder).Encode.v": 0, + "(*sync.Pool).Put.x": 0, + "(*text/template.Template).Parse.text": 0, + "(io.Seeker).Seek.offset": 0, + "(time.Time).Sub.u": 0, + "append.elems": 1, + "append.slice": 0, + "bytes.Equal.a": 0, + "bytes.Equal.b": 1, + "encoding/binary.Write.data": 2, + "errors.New.text": 0, + "fmt.Fprintf.format": 1, + "fmt.Printf.format": 0, + "fmt.Sprintf.a[0]": 1, + "fmt.Sprintf.format": 0, + "json.Marshal.v": 0, + "json.Unmarshal.v": 1, + "len.v": 0, + "make.size[0]": 1, + "make.size[1]": 2, + "make.t": 0, + "net/url.Parse.rawurl": 0, + "os.OpenFile.flag": 1, + "os/exec.Command.name": 0, + "os/signal.Notify.c": 0, + "regexp.Compile.expr": 0, + "runtime.SetFinalizer.finalizer": 1, + "runtime.SetFinalizer.obj": 0, + "sort.Sort.data": 0, + "time.Parse.layout": 0, + "time.Sleep.d": 0, + "xml.Marshal.v": 0, + "xml.Unmarshal.v": 1, +} + +func Arg(name string) int { + n, ok := args[name] + if !ok { + panic("unknown argument " + name) + } + return n +} diff --git a/vendor/honnef.co/go/tools/cmd/staticcheck/README.md b/vendor/honnef.co/go/tools/cmd/staticcheck/README.md new file mode 100644 index 00000000..4d14577f --- /dev/null +++ b/vendor/honnef.co/go/tools/cmd/staticcheck/README.md @@ -0,0 +1,15 @@ +# staticcheck + +_staticcheck_ offers extensive analysis of Go code, covering a myriad +of categories. It will detect bugs, suggest code simplifications, +point out dead code, and more. + +## Installation + +See [the main README](https://github.com/dominikh/go-tools#installation) for installation instructions. + +## Documentation + +Detailed documentation can be found on +[staticcheck.io](https://staticcheck.io/docs/). + diff --git a/vendor/honnef.co/go/tools/cmd/staticcheck/staticcheck.go b/vendor/honnef.co/go/tools/cmd/staticcheck/staticcheck.go new file mode 100644 index 00000000..4f504dc3 --- /dev/null +++ b/vendor/honnef.co/go/tools/cmd/staticcheck/staticcheck.go @@ -0,0 +1,44 @@ +// staticcheck analyses Go code and makes it better. +package main // import "honnef.co/go/tools/cmd/staticcheck" + +import ( + "log" + "os" + + "golang.org/x/tools/go/analysis" + "honnef.co/go/tools/lint" + "honnef.co/go/tools/lint/lintutil" + "honnef.co/go/tools/simple" + "honnef.co/go/tools/staticcheck" + "honnef.co/go/tools/stylecheck" + "honnef.co/go/tools/unused" +) + +func main() { + fs := lintutil.FlagSet("staticcheck") + wholeProgram := fs.Bool("unused.whole-program", false, "Run unused in whole program mode") + debug := fs.String("debug.unused-graph", "", "Write unused's object graph to `file`") + fs.Parse(os.Args[1:]) + + var cs []*analysis.Analyzer + for _, v := range simple.Analyzers { + cs = append(cs, v) + } + for _, v := range staticcheck.Analyzers { + cs = append(cs, v) + } + for _, v := range stylecheck.Analyzers { + cs = append(cs, v) + } + + u := unused.NewChecker(*wholeProgram) + if *debug != "" { + f, err := os.OpenFile(*debug, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + log.Fatal(err) + } + u.Debug = f + } + cums := []lint.CumulativeChecker{u} + lintutil.ProcessFlagSet(cs, cums, fs) +} diff --git a/vendor/honnef.co/go/tools/config/config.go b/vendor/honnef.co/go/tools/config/config.go new file mode 100644 index 00000000..c22093a6 --- /dev/null +++ b/vendor/honnef.co/go/tools/config/config.go @@ -0,0 +1,224 @@ +package config + +import ( + "bytes" + "fmt" + "os" + "path/filepath" + "reflect" + "strings" + + "github.com/BurntSushi/toml" + "golang.org/x/tools/go/analysis" +) + +var Analyzer = &analysis.Analyzer{ + Name: "config", + Doc: "loads configuration for the current package tree", + Run: func(pass *analysis.Pass) (interface{}, error) { + if len(pass.Files) == 0 { + cfg := DefaultConfig + return &cfg, nil + } + cache, err := os.UserCacheDir() + if err != nil { + cache = "" + } + var path string + for _, f := range pass.Files { + p := pass.Fset.PositionFor(f.Pos(), true).Filename + // FIXME(dh): using strings.HasPrefix isn't technically + // correct, but it should be good enough for now. + if cache != "" && strings.HasPrefix(p, cache) { + // File in the build cache of the standard Go build system + continue + } + path = p + break + } + + if path == "" { + // The package only consists of generated files. + cfg := DefaultConfig + return &cfg, nil + } + + dir := filepath.Dir(path) + cfg, err := Load(dir) + if err != nil { + return nil, fmt.Errorf("error loading staticcheck.conf: %s", err) + } + return &cfg, nil + }, + RunDespiteErrors: true, + ResultType: reflect.TypeOf((*Config)(nil)), +} + +func For(pass *analysis.Pass) *Config { + return pass.ResultOf[Analyzer].(*Config) +} + +func mergeLists(a, b []string) []string { + out := make([]string, 0, len(a)+len(b)) + for _, el := range b { + if el == "inherit" { + out = append(out, a...) + } else { + out = append(out, el) + } + } + + return out +} + +func normalizeList(list []string) []string { + if len(list) > 1 { + nlist := make([]string, 0, len(list)) + nlist = append(nlist, list[0]) + for i, el := range list[1:] { + if el != list[i] { + nlist = append(nlist, el) + } + } + list = nlist + } + + for _, el := range list { + if el == "inherit" { + // This should never happen, because the default config + // should not use "inherit" + panic(`unresolved "inherit"`) + } + } + + return list +} + +func (cfg Config) Merge(ocfg Config) Config { + if ocfg.Checks != nil { + cfg.Checks = mergeLists(cfg.Checks, ocfg.Checks) + } + if ocfg.Initialisms != nil { + cfg.Initialisms = mergeLists(cfg.Initialisms, ocfg.Initialisms) + } + if ocfg.DotImportWhitelist != nil { + cfg.DotImportWhitelist = mergeLists(cfg.DotImportWhitelist, ocfg.DotImportWhitelist) + } + if ocfg.HTTPStatusCodeWhitelist != nil { + cfg.HTTPStatusCodeWhitelist = mergeLists(cfg.HTTPStatusCodeWhitelist, ocfg.HTTPStatusCodeWhitelist) + } + return cfg +} + +type Config struct { + // TODO(dh): this implementation makes it impossible for external + // clients to add their own checkers with configuration. At the + // moment, we don't really care about that; we don't encourage + // that people use this package. In the future, we may. The + // obvious solution would be using map[string]interface{}, but + // that's obviously subpar. + + Checks []string `toml:"checks"` + Initialisms []string `toml:"initialisms"` + DotImportWhitelist []string `toml:"dot_import_whitelist"` + HTTPStatusCodeWhitelist []string `toml:"http_status_code_whitelist"` +} + +func (c Config) String() string { + buf := &bytes.Buffer{} + + fmt.Fprintf(buf, "Checks: %#v\n", c.Checks) + fmt.Fprintf(buf, "Initialisms: %#v\n", c.Initialisms) + fmt.Fprintf(buf, "DotImportWhitelist: %#v\n", c.DotImportWhitelist) + fmt.Fprintf(buf, "HTTPStatusCodeWhitelist: %#v", c.HTTPStatusCodeWhitelist) + + return buf.String() +} + +var DefaultConfig = Config{ + Checks: []string{"all", "-ST1000", "-ST1003", "-ST1016"}, + Initialisms: []string{ + "ACL", "API", "ASCII", "CPU", "CSS", "DNS", + "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", + "IP", "JSON", "QPS", "RAM", "RPC", "SLA", + "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", + "UDP", "UI", "GID", "UID", "UUID", "URI", + "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", + "XSS", "SIP", "RTP", + }, + DotImportWhitelist: []string{}, + HTTPStatusCodeWhitelist: []string{"200", "400", "404", "500"}, +} + +const configName = "staticcheck.conf" + +func parseConfigs(dir string) ([]Config, error) { + var out []Config + + // TODO(dh): consider stopping at the GOPATH/module boundary + for dir != "" { + f, err := os.Open(filepath.Join(dir, configName)) + if os.IsNotExist(err) { + ndir := filepath.Dir(dir) + if ndir == dir { + break + } + dir = ndir + continue + } + if err != nil { + return nil, err + } + var cfg Config + _, err = toml.DecodeReader(f, &cfg) + f.Close() + if err != nil { + return nil, err + } + out = append(out, cfg) + ndir := filepath.Dir(dir) + if ndir == dir { + break + } + dir = ndir + } + out = append(out, DefaultConfig) + if len(out) < 2 { + return out, nil + } + for i := 0; i < len(out)/2; i++ { + out[i], out[len(out)-1-i] = out[len(out)-1-i], out[i] + } + return out, nil +} + +func mergeConfigs(confs []Config) Config { + if len(confs) == 0 { + // This shouldn't happen because we always have at least a + // default config. + panic("trying to merge zero configs") + } + if len(confs) == 1 { + return confs[0] + } + conf := confs[0] + for _, oconf := range confs[1:] { + conf = conf.Merge(oconf) + } + return conf +} + +func Load(dir string) (Config, error) { + confs, err := parseConfigs(dir) + if err != nil { + return Config{}, err + } + conf := mergeConfigs(confs) + + conf.Checks = normalizeList(conf.Checks) + conf.Initialisms = normalizeList(conf.Initialisms) + conf.DotImportWhitelist = normalizeList(conf.DotImportWhitelist) + conf.HTTPStatusCodeWhitelist = normalizeList(conf.HTTPStatusCodeWhitelist) + + return conf, nil +} diff --git a/vendor/honnef.co/go/tools/config/example.conf b/vendor/honnef.co/go/tools/config/example.conf new file mode 100644 index 00000000..a715a24d --- /dev/null +++ b/vendor/honnef.co/go/tools/config/example.conf @@ -0,0 +1,10 @@ +checks = ["all", "-ST1003", "-ST1014"] +initialisms = ["ACL", "API", "ASCII", "CPU", "CSS", "DNS", + "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", + "IP", "JSON", "QPS", "RAM", "RPC", "SLA", + "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", + "UDP", "UI", "GID", "UID", "UUID", "URI", + "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", + "XSS", "SIP", "RTP"] +dot_import_whitelist = [] +http_status_code_whitelist = ["200", "400", "404", "500"] diff --git a/vendor/honnef.co/go/tools/deprecated/stdlib.go b/vendor/honnef.co/go/tools/deprecated/stdlib.go new file mode 100644 index 00000000..5d8ce186 --- /dev/null +++ b/vendor/honnef.co/go/tools/deprecated/stdlib.go @@ -0,0 +1,112 @@ +package deprecated + +type Deprecation struct { + DeprecatedSince int + AlternativeAvailableSince int +} + +var Stdlib = map[string]Deprecation{ + "image/jpeg.Reader": {4, 0}, + // FIXME(dh): AllowBinary isn't being detected as deprecated + // because the comment has a newline right after "Deprecated:" + "go/build.AllowBinary": {7, 7}, + "(archive/zip.FileHeader).CompressedSize": {1, 1}, + "(archive/zip.FileHeader).UncompressedSize": {1, 1}, + "(archive/zip.FileHeader).ModifiedTime": {10, 10}, + "(archive/zip.FileHeader).ModifiedDate": {10, 10}, + "(*archive/zip.FileHeader).ModTime": {10, 10}, + "(*archive/zip.FileHeader).SetModTime": {10, 10}, + "(go/doc.Package).Bugs": {1, 1}, + "os.SEEK_SET": {7, 7}, + "os.SEEK_CUR": {7, 7}, + "os.SEEK_END": {7, 7}, + "(net.Dialer).Cancel": {7, 7}, + "runtime.CPUProfile": {9, 0}, + "compress/flate.ReadError": {6, 6}, + "compress/flate.WriteError": {6, 6}, + "path/filepath.HasPrefix": {0, 0}, + "(net/http.Transport).Dial": {7, 7}, + "(*net/http.Transport).CancelRequest": {6, 5}, + "net/http.ErrWriteAfterFlush": {7, 0}, + "net/http.ErrHeaderTooLong": {8, 0}, + "net/http.ErrShortBody": {8, 0}, + "net/http.ErrMissingContentLength": {8, 0}, + "net/http/httputil.ErrPersistEOF": {0, 0}, + "net/http/httputil.ErrClosed": {0, 0}, + "net/http/httputil.ErrPipeline": {0, 0}, + "net/http/httputil.ServerConn": {0, 0}, + "net/http/httputil.NewServerConn": {0, 0}, + "net/http/httputil.ClientConn": {0, 0}, + "net/http/httputil.NewClientConn": {0, 0}, + "net/http/httputil.NewProxyClientConn": {0, 0}, + "(net/http.Request).Cancel": {7, 7}, + "(text/template/parse.PipeNode).Line": {1, 1}, + "(text/template/parse.ActionNode).Line": {1, 1}, + "(text/template/parse.BranchNode).Line": {1, 1}, + "(text/template/parse.TemplateNode).Line": {1, 1}, + "database/sql/driver.ColumnConverter": {9, 9}, + "database/sql/driver.Execer": {8, 8}, + "database/sql/driver.Queryer": {8, 8}, + "(database/sql/driver.Conn).Begin": {8, 8}, + "(database/sql/driver.Stmt).Exec": {8, 8}, + "(database/sql/driver.Stmt).Query": {8, 8}, + "syscall.StringByteSlice": {1, 1}, + "syscall.StringBytePtr": {1, 1}, + "syscall.StringSlicePtr": {1, 1}, + "syscall.StringToUTF16": {1, 1}, + "syscall.StringToUTF16Ptr": {1, 1}, + "(*regexp.Regexp).Copy": {12, 12}, + "(archive/tar.Header).Xattrs": {10, 10}, + "archive/tar.TypeRegA": {11, 1}, + "go/types.NewInterface": {11, 11}, + "(*go/types.Interface).Embedded": {11, 11}, + "go/importer.For": {12, 12}, + "encoding/json.InvalidUTF8Error": {2, 2}, + "encoding/json.UnmarshalFieldError": {2, 2}, + "encoding/csv.ErrTrailingComma": {2, 2}, + "(encoding/csv.Reader).TrailingComma": {2, 2}, + "(net.Dialer).DualStack": {12, 12}, + "net/http.ErrUnexpectedTrailer": {12, 12}, + "net/http.CloseNotifier": {11, 7}, + "net/http.ProtocolError": {8, 8}, + "(crypto/x509.CertificateRequest).Attributes": {5, 3}, + // This function has no alternative, but also no purpose. + "(*crypto/rc4.Cipher).Reset": {12, 0}, + "(net/http/httptest.ResponseRecorder).HeaderMap": {11, 7}, + + // All of these have been deprecated in favour of external libraries + "syscall.AttachLsf": {7, 0}, + "syscall.DetachLsf": {7, 0}, + "syscall.LsfSocket": {7, 0}, + "syscall.SetLsfPromisc": {7, 0}, + "syscall.LsfJump": {7, 0}, + "syscall.LsfStmt": {7, 0}, + "syscall.BpfStmt": {7, 0}, + "syscall.BpfJump": {7, 0}, + "syscall.BpfBuflen": {7, 0}, + "syscall.SetBpfBuflen": {7, 0}, + "syscall.BpfDatalink": {7, 0}, + "syscall.SetBpfDatalink": {7, 0}, + "syscall.SetBpfPromisc": {7, 0}, + "syscall.FlushBpf": {7, 0}, + "syscall.BpfInterface": {7, 0}, + "syscall.SetBpfInterface": {7, 0}, + "syscall.BpfTimeout": {7, 0}, + "syscall.SetBpfTimeout": {7, 0}, + "syscall.BpfStats": {7, 0}, + "syscall.SetBpfImmediate": {7, 0}, + "syscall.SetBpf": {7, 0}, + "syscall.CheckBpfVersion": {7, 0}, + "syscall.BpfHeadercmpl": {7, 0}, + "syscall.SetBpfHeadercmpl": {7, 0}, + "syscall.RouteRIB": {8, 0}, + "syscall.RoutingMessage": {8, 0}, + "syscall.RouteMessage": {8, 0}, + "syscall.InterfaceMessage": {8, 0}, + "syscall.InterfaceAddrMessage": {8, 0}, + "syscall.ParseRoutingMessage": {8, 0}, + "syscall.ParseRoutingSockaddr": {8, 0}, + "InterfaceAnnounceMessage": {7, 0}, + "InterfaceMulticastAddrMessage": {7, 0}, + "syscall.FormatMessage": {5, 0}, +} diff --git a/vendor/honnef.co/go/tools/facts/deprecated.go b/vendor/honnef.co/go/tools/facts/deprecated.go new file mode 100644 index 00000000..8587b0e0 --- /dev/null +++ b/vendor/honnef.co/go/tools/facts/deprecated.go @@ -0,0 +1,144 @@ +package facts + +import ( + "go/ast" + "go/token" + "go/types" + "reflect" + "strings" + + "golang.org/x/tools/go/analysis" +) + +type IsDeprecated struct{ Msg string } + +func (*IsDeprecated) AFact() {} +func (d *IsDeprecated) String() string { return "Deprecated: " + d.Msg } + +type DeprecatedResult struct { + Objects map[types.Object]*IsDeprecated + Packages map[*types.Package]*IsDeprecated +} + +var Deprecated = &analysis.Analyzer{ + Name: "fact_deprecated", + Doc: "Mark deprecated objects", + Run: deprecated, + FactTypes: []analysis.Fact{(*IsDeprecated)(nil)}, + ResultType: reflect.TypeOf(DeprecatedResult{}), +} + +func deprecated(pass *analysis.Pass) (interface{}, error) { + var names []*ast.Ident + + extractDeprecatedMessage := func(docs []*ast.CommentGroup) string { + for _, doc := range docs { + if doc == nil { + continue + } + parts := strings.Split(doc.Text(), "\n\n") + last := parts[len(parts)-1] + if !strings.HasPrefix(last, "Deprecated: ") { + continue + } + alt := last[len("Deprecated: "):] + alt = strings.Replace(alt, "\n", " ", -1) + return alt + } + return "" + } + doDocs := func(names []*ast.Ident, docs []*ast.CommentGroup) { + alt := extractDeprecatedMessage(docs) + if alt == "" { + return + } + + for _, name := range names { + obj := pass.TypesInfo.ObjectOf(name) + pass.ExportObjectFact(obj, &IsDeprecated{alt}) + } + } + + var docs []*ast.CommentGroup + for _, f := range pass.Files { + docs = append(docs, f.Doc) + } + if alt := extractDeprecatedMessage(docs); alt != "" { + // Don't mark package syscall as deprecated, even though + // it is. A lot of people still use it for simple + // constants like SIGKILL, and I am not comfortable + // telling them to use x/sys for that. + if pass.Pkg.Path() != "syscall" { + pass.ExportPackageFact(&IsDeprecated{alt}) + } + } + + docs = docs[:0] + for _, f := range pass.Files { + fn := func(node ast.Node) bool { + if node == nil { + return true + } + var ret bool + switch node := node.(type) { + case *ast.GenDecl: + switch node.Tok { + case token.TYPE, token.CONST, token.VAR: + docs = append(docs, node.Doc) + return true + default: + return false + } + case *ast.FuncDecl: + docs = append(docs, node.Doc) + names = []*ast.Ident{node.Name} + ret = false + case *ast.TypeSpec: + docs = append(docs, node.Doc) + names = []*ast.Ident{node.Name} + ret = true + case *ast.ValueSpec: + docs = append(docs, node.Doc) + names = node.Names + ret = false + case *ast.File: + return true + case *ast.StructType: + for _, field := range node.Fields.List { + doDocs(field.Names, []*ast.CommentGroup{field.Doc}) + } + return false + case *ast.InterfaceType: + for _, field := range node.Methods.List { + doDocs(field.Names, []*ast.CommentGroup{field.Doc}) + } + return false + default: + return false + } + if len(names) == 0 || len(docs) == 0 { + return ret + } + doDocs(names, docs) + + docs = docs[:0] + names = nil + return ret + } + ast.Inspect(f, fn) + } + + out := DeprecatedResult{ + Objects: map[types.Object]*IsDeprecated{}, + Packages: map[*types.Package]*IsDeprecated{}, + } + + for _, fact := range pass.AllObjectFacts() { + out.Objects[fact.Object] = fact.Fact.(*IsDeprecated) + } + for _, fact := range pass.AllPackageFacts() { + out.Packages[fact.Package] = fact.Fact.(*IsDeprecated) + } + + return out, nil +} diff --git a/vendor/honnef.co/go/tools/facts/generated.go b/vendor/honnef.co/go/tools/facts/generated.go new file mode 100644 index 00000000..1ed9563a --- /dev/null +++ b/vendor/honnef.co/go/tools/facts/generated.go @@ -0,0 +1,86 @@ +package facts + +import ( + "bufio" + "bytes" + "io" + "os" + "reflect" + "strings" + + "golang.org/x/tools/go/analysis" +) + +type Generator int + +// A list of known generators we can detect +const ( + Unknown Generator = iota + Goyacc + Cgo + Stringer +) + +var ( + // used by cgo before Go 1.11 + oldCgo = []byte("// Created by cgo - DO NOT EDIT") + prefix = []byte("// Code generated ") + suffix = []byte(" DO NOT EDIT.") + nl = []byte("\n") + crnl = []byte("\r\n") +) + +func isGenerated(path string) (Generator, bool) { + f, err := os.Open(path) + if err != nil { + return 0, false + } + defer f.Close() + br := bufio.NewReader(f) + for { + s, err := br.ReadBytes('\n') + if err != nil && err != io.EOF { + return 0, false + } + s = bytes.TrimSuffix(s, crnl) + s = bytes.TrimSuffix(s, nl) + if bytes.HasPrefix(s, prefix) && bytes.HasSuffix(s, suffix) { + text := string(s[len(prefix) : len(s)-len(suffix)]) + switch text { + case "by goyacc.": + return Goyacc, true + case "by cmd/cgo;": + return Cgo, true + } + if strings.HasPrefix(text, `by "stringer `) { + return Stringer, true + } + return Unknown, true + } + if bytes.Equal(s, oldCgo) { + return Cgo, true + } + if err == io.EOF { + break + } + } + return 0, false +} + +var Generated = &analysis.Analyzer{ + Name: "isgenerated", + Doc: "annotate file names that have been code generated", + Run: func(pass *analysis.Pass) (interface{}, error) { + m := map[string]Generator{} + for _, f := range pass.Files { + path := pass.Fset.PositionFor(f.Pos(), false).Filename + g, ok := isGenerated(path) + if ok { + m[path] = g + } + } + return m, nil + }, + RunDespiteErrors: true, + ResultType: reflect.TypeOf(map[string]Generator{}), +} diff --git a/vendor/honnef.co/go/tools/facts/purity.go b/vendor/honnef.co/go/tools/facts/purity.go new file mode 100644 index 00000000..861ca411 --- /dev/null +++ b/vendor/honnef.co/go/tools/facts/purity.go @@ -0,0 +1,175 @@ +package facts + +import ( + "go/token" + "go/types" + "reflect" + + "golang.org/x/tools/go/analysis" + "honnef.co/go/tools/functions" + "honnef.co/go/tools/internal/passes/buildssa" + "honnef.co/go/tools/ssa" +) + +type IsPure struct{} + +func (*IsPure) AFact() {} +func (d *IsPure) String() string { return "is pure" } + +type PurityResult map[*types.Func]*IsPure + +var Purity = &analysis.Analyzer{ + Name: "fact_purity", + Doc: "Mark pure functions", + Run: purity, + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + FactTypes: []analysis.Fact{(*IsPure)(nil)}, + ResultType: reflect.TypeOf(PurityResult{}), +} + +var pureStdlib = map[string]struct{}{ + "errors.New": {}, + "fmt.Errorf": {}, + "fmt.Sprintf": {}, + "fmt.Sprint": {}, + "sort.Reverse": {}, + "strings.Map": {}, + "strings.Repeat": {}, + "strings.Replace": {}, + "strings.Title": {}, + "strings.ToLower": {}, + "strings.ToLowerSpecial": {}, + "strings.ToTitle": {}, + "strings.ToTitleSpecial": {}, + "strings.ToUpper": {}, + "strings.ToUpperSpecial": {}, + "strings.Trim": {}, + "strings.TrimFunc": {}, + "strings.TrimLeft": {}, + "strings.TrimLeftFunc": {}, + "strings.TrimPrefix": {}, + "strings.TrimRight": {}, + "strings.TrimRightFunc": {}, + "strings.TrimSpace": {}, + "strings.TrimSuffix": {}, + "(*net/http.Request).WithContext": {}, +} + +func purity(pass *analysis.Pass) (interface{}, error) { + seen := map[*ssa.Function]struct{}{} + ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg + var check func(ssafn *ssa.Function) (ret bool) + check = func(ssafn *ssa.Function) (ret bool) { + if ssafn.Object() == nil { + // TODO(dh): support closures + return false + } + if pass.ImportObjectFact(ssafn.Object(), new(IsPure)) { + return true + } + if ssafn.Pkg != ssapkg { + // Function is in another package but wasn't marked as + // pure, ergo it isn't pure + return false + } + // Break recursion + if _, ok := seen[ssafn]; ok { + return false + } + + seen[ssafn] = struct{}{} + defer func() { + if ret { + pass.ExportObjectFact(ssafn.Object(), &IsPure{}) + } + }() + + if functions.IsStub(ssafn) { + return false + } + + if _, ok := pureStdlib[ssafn.Object().(*types.Func).FullName()]; ok { + return true + } + + if ssafn.Signature.Results().Len() == 0 { + // A function with no return values is empty or is doing some + // work we cannot see (for example because of build tags); + // don't consider it pure. + return false + } + + for _, param := range ssafn.Params { + if _, ok := param.Type().Underlying().(*types.Basic); !ok { + return false + } + } + + if ssafn.Blocks == nil { + return false + } + checkCall := func(common *ssa.CallCommon) bool { + if common.IsInvoke() { + return false + } + builtin, ok := common.Value.(*ssa.Builtin) + if !ok { + if common.StaticCallee() != ssafn { + if common.StaticCallee() == nil { + return false + } + if !check(common.StaticCallee()) { + return false + } + } + } else { + switch builtin.Name() { + case "len", "cap", "make", "new": + default: + return false + } + } + return true + } + for _, b := range ssafn.Blocks { + for _, ins := range b.Instrs { + switch ins := ins.(type) { + case *ssa.Call: + if !checkCall(ins.Common()) { + return false + } + case *ssa.Defer: + if !checkCall(&ins.Call) { + return false + } + case *ssa.Select: + return false + case *ssa.Send: + return false + case *ssa.Go: + return false + case *ssa.Panic: + return false + case *ssa.Store: + return false + case *ssa.FieldAddr: + return false + case *ssa.UnOp: + if ins.Op == token.MUL || ins.Op == token.AND { + return false + } + } + } + } + return true + } + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + check(ssafn) + } + + out := PurityResult{} + for _, fact := range pass.AllObjectFacts() { + out[fact.Object.(*types.Func)] = fact.Fact.(*IsPure) + } + return out, nil +} diff --git a/vendor/honnef.co/go/tools/facts/token.go b/vendor/honnef.co/go/tools/facts/token.go new file mode 100644 index 00000000..26e76ff7 --- /dev/null +++ b/vendor/honnef.co/go/tools/facts/token.go @@ -0,0 +1,24 @@ +package facts + +import ( + "go/ast" + "go/token" + "reflect" + + "golang.org/x/tools/go/analysis" +) + +var TokenFile = &analysis.Analyzer{ + Name: "tokenfileanalyzer", + Doc: "creates a mapping of *token.File to *ast.File", + Run: func(pass *analysis.Pass) (interface{}, error) { + m := map[*token.File]*ast.File{} + for _, af := range pass.Files { + tf := pass.Fset.File(af.Pos()) + m[tf] = af + } + return m, nil + }, + RunDespiteErrors: true, + ResultType: reflect.TypeOf(map[*token.File]*ast.File{}), +} diff --git a/vendor/honnef.co/go/tools/functions/loops.go b/vendor/honnef.co/go/tools/functions/loops.go new file mode 100644 index 00000000..15877a2f --- /dev/null +++ b/vendor/honnef.co/go/tools/functions/loops.go @@ -0,0 +1,54 @@ +package functions + +import "honnef.co/go/tools/ssa" + +type Loop struct{ ssa.BlockSet } + +func FindLoops(fn *ssa.Function) []Loop { + if fn.Blocks == nil { + return nil + } + tree := fn.DomPreorder() + var sets []Loop + for _, h := range tree { + for _, n := range h.Preds { + if !h.Dominates(n) { + continue + } + // n is a back-edge to h + // h is the loop header + if n == h { + set := Loop{} + set.Add(n) + sets = append(sets, set) + continue + } + set := Loop{} + set.Add(h) + set.Add(n) + for _, b := range allPredsBut(n, h, nil) { + set.Add(b) + } + sets = append(sets, set) + } + } + return sets +} + +func allPredsBut(b, but *ssa.BasicBlock, list []*ssa.BasicBlock) []*ssa.BasicBlock { +outer: + for _, pred := range b.Preds { + if pred == but { + continue + } + for _, p := range list { + // TODO improve big-o complexity of this function + if pred == p { + continue outer + } + } + list = append(list, pred) + list = allPredsBut(pred, but, list) + } + return list +} diff --git a/vendor/honnef.co/go/tools/functions/pure.go b/vendor/honnef.co/go/tools/functions/pure.go new file mode 100644 index 00000000..8bc55877 --- /dev/null +++ b/vendor/honnef.co/go/tools/functions/pure.go @@ -0,0 +1,46 @@ +package functions + +import ( + "honnef.co/go/tools/ssa" +) + +func filterDebug(instr []ssa.Instruction) []ssa.Instruction { + var out []ssa.Instruction + for _, ins := range instr { + if _, ok := ins.(*ssa.DebugRef); !ok { + out = append(out, ins) + } + } + return out +} + +// IsStub reports whether a function is a stub. A function is +// considered a stub if it has no instructions or exactly one +// instruction, which must be either returning only constant values or +// a panic. +func IsStub(fn *ssa.Function) bool { + if len(fn.Blocks) == 0 { + return true + } + if len(fn.Blocks) > 1 { + return false + } + instrs := filterDebug(fn.Blocks[0].Instrs) + if len(instrs) != 1 { + return false + } + + switch instrs[0].(type) { + case *ssa.Return: + // Since this is the only instruction, the return value must + // be a constant. We consider all constants as stubs, not just + // the zero value. This does not, unfortunately, cover zero + // initialised structs, as these cause additional + // instructions. + return true + case *ssa.Panic: + return true + default: + return false + } +} diff --git a/vendor/honnef.co/go/tools/functions/terminates.go b/vendor/honnef.co/go/tools/functions/terminates.go new file mode 100644 index 00000000..3e9c3a23 --- /dev/null +++ b/vendor/honnef.co/go/tools/functions/terminates.go @@ -0,0 +1,24 @@ +package functions + +import "honnef.co/go/tools/ssa" + +// Terminates reports whether fn is supposed to return, that is if it +// has at least one theoretic path that returns from the function. +// Explicit panics do not count as terminating. +func Terminates(fn *ssa.Function) bool { + if fn.Blocks == nil { + // assuming that a function terminates is the conservative + // choice + return true + } + + for _, block := range fn.Blocks { + if len(block.Instrs) == 0 { + continue + } + if _, ok := block.Instrs[len(block.Instrs)-1].(*ssa.Return); ok { + return true + } + } + return false +} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/callee.go b/vendor/honnef.co/go/tools/go/types/typeutil/callee.go new file mode 100644 index 00000000..38f596da --- /dev/null +++ b/vendor/honnef.co/go/tools/go/types/typeutil/callee.go @@ -0,0 +1,46 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package typeutil + +import ( + "go/ast" + "go/types" + + "golang.org/x/tools/go/ast/astutil" +) + +// Callee returns the named target of a function call, if any: +// a function, method, builtin, or variable. +func Callee(info *types.Info, call *ast.CallExpr) types.Object { + var obj types.Object + switch fun := astutil.Unparen(call.Fun).(type) { + case *ast.Ident: + obj = info.Uses[fun] // type, var, builtin, or declared func + case *ast.SelectorExpr: + if sel, ok := info.Selections[fun]; ok { + obj = sel.Obj() // method or field + } else { + obj = info.Uses[fun.Sel] // qualified identifier? + } + } + if _, ok := obj.(*types.TypeName); ok { + return nil // T(x) is a conversion, not a call + } + return obj +} + +// StaticCallee returns the target (function or method) of a static +// function call, if any. It returns nil for calls to builtins. +func StaticCallee(info *types.Info, call *ast.CallExpr) *types.Func { + if f, ok := Callee(info, call).(*types.Func); ok && !interfaceMethod(f) { + return f + } + return nil +} + +func interfaceMethod(f *types.Func) bool { + recv := f.Type().(*types.Signature).Recv() + return recv != nil && types.IsInterface(recv.Type()) +} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/identical.go b/vendor/honnef.co/go/tools/go/types/typeutil/identical.go new file mode 100644 index 00000000..c0ca441c --- /dev/null +++ b/vendor/honnef.co/go/tools/go/types/typeutil/identical.go @@ -0,0 +1,75 @@ +package typeutil + +import ( + "go/types" +) + +// Identical reports whether x and y are identical types. +// Unlike types.Identical, receivers of Signature types are not ignored. +// Unlike types.Identical, interfaces are compared via pointer equality (except for the empty interface, which gets deduplicated). +// Unlike types.Identical, structs are compared via pointer equality. +func Identical(x, y types.Type) (ret bool) { + if !types.Identical(x, y) { + return false + } + + switch x := x.(type) { + case *types.Struct: + y, ok := y.(*types.Struct) + if !ok { + // should be impossible + return true + } + return x == y + case *types.Interface: + // The issue with interfaces, typeutil.Map and types.Identical + // + // types.Identical, when comparing two interfaces, only looks at the set + // of all methods, not differentiating between implicit (embedded) and + // explicit methods. + // + // When we see the following two types, in source order + // + // type I1 interface { foo() } + // type I2 interface { I1 } + // + // then we will first correctly process I1 and its underlying type. When + // we get to I2, we will see that its underlying type is identical to + // that of I1 and not process it again. This, however, means that we will + // not record the fact that I2 embeds I1. If only I2 is reachable via the + // graph root, then I1 will not be considered used. + // + // We choose to be lazy and compare interfaces by their + // pointers. This will obviously miss identical interfaces, + // but this only has a runtime cost, it doesn't affect + // correctness. + y, ok := y.(*types.Interface) + if !ok { + // should be impossible + return true + } + if x.NumEmbeddeds() == 0 && + y.NumEmbeddeds() == 0 && + x.NumMethods() == 0 && + y.NumMethods() == 0 { + // all truly empty interfaces are the same + return true + } + return x == y + case *types.Signature: + y, ok := y.(*types.Signature) + if !ok { + // should be impossible + return true + } + if x.Recv() == y.Recv() { + return true + } + if x.Recv() == nil || y.Recv() == nil { + return false + } + return Identical(x.Recv().Type(), y.Recv().Type()) + default: + return true + } +} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/imports.go b/vendor/honnef.co/go/tools/go/types/typeutil/imports.go new file mode 100644 index 00000000..9c441dba --- /dev/null +++ b/vendor/honnef.co/go/tools/go/types/typeutil/imports.go @@ -0,0 +1,31 @@ +// 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 typeutil + +import "go/types" + +// Dependencies returns all dependencies of the specified packages. +// +// Dependent packages appear in topological order: if package P imports +// package Q, Q appears earlier than P in the result. +// The algorithm follows import statements in the order they +// appear in the source code, so the result is a total order. +// +func Dependencies(pkgs ...*types.Package) []*types.Package { + var result []*types.Package + seen := make(map[*types.Package]bool) + var visit func(pkgs []*types.Package) + visit = func(pkgs []*types.Package) { + for _, p := range pkgs { + if !seen[p] { + seen[p] = true + visit(p.Imports()) + result = append(result, p) + } + } + } + visit(pkgs) + return result +} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/map.go b/vendor/honnef.co/go/tools/go/types/typeutil/map.go new file mode 100644 index 00000000..f929353c --- /dev/null +++ b/vendor/honnef.co/go/tools/go/types/typeutil/map.go @@ -0,0 +1,319 @@ +// 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 typeutil defines various utilities for types, such as Map, +// a mapping from types.Type to interface{} values. +package typeutil + +import ( + "bytes" + "fmt" + "go/types" + "reflect" +) + +// Map is a hash-table-based mapping from types (types.Type) to +// arbitrary interface{} values. The concrete types that implement +// the Type interface are pointers. Since they are not canonicalized, +// == cannot be used to check for equivalence, and thus we cannot +// simply use a Go map. +// +// Just as with map[K]V, a nil *Map is a valid empty map. +// +// Not thread-safe. +// +// This fork handles Signatures correctly, respecting method +// receivers. Furthermore, it doesn't deduplicate interfaces or +// structs. Interfaces aren't deduplicated as not to conflate implicit +// and explicit methods. Structs aren't deduplicated because we track +// fields of each type separately. +// +type Map struct { + hasher Hasher // shared by many Maps + table map[uint32][]entry // maps hash to bucket; entry.key==nil means unused + length int // number of map entries +} + +// entry is an entry (key/value association) in a hash bucket. +type entry struct { + key types.Type + value interface{} +} + +// SetHasher sets the hasher used by Map. +// +// All Hashers are functionally equivalent but contain internal state +// used to cache the results of hashing previously seen types. +// +// A single Hasher created by MakeHasher() may be shared among many +// Maps. This is recommended if the instances have many keys in +// common, as it will amortize the cost of hash computation. +// +// A Hasher may grow without bound as new types are seen. Even when a +// type is deleted from the map, the Hasher never shrinks, since other +// types in the map may reference the deleted type indirectly. +// +// Hashers are not thread-safe, and read-only operations such as +// Map.Lookup require updates to the hasher, so a full Mutex lock (not a +// read-lock) is require around all Map operations if a shared +// hasher is accessed from multiple threads. +// +// If SetHasher is not called, the Map will create a private hasher at +// the first call to Insert. +// +func (m *Map) SetHasher(hasher Hasher) { + m.hasher = hasher +} + +// Delete removes the entry with the given key, if any. +// It returns true if the entry was found. +// +func (m *Map) Delete(key types.Type) bool { + if m != nil && m.table != nil { + hash := m.hasher.Hash(key) + bucket := m.table[hash] + for i, e := range bucket { + if e.key != nil && Identical(key, e.key) { + // We can't compact the bucket as it + // would disturb iterators. + bucket[i] = entry{} + m.length-- + return true + } + } + } + return false +} + +// At returns the map entry for the given key. +// The result is nil if the entry is not present. +// +func (m *Map) At(key types.Type) interface{} { + if m != nil && m.table != nil { + for _, e := range m.table[m.hasher.Hash(key)] { + if e.key != nil && Identical(key, e.key) { + return e.value + } + } + } + return nil +} + +// Set sets the map entry for key to val, +// and returns the previous entry, if any. +func (m *Map) Set(key types.Type, value interface{}) (prev interface{}) { + if m.table != nil { + hash := m.hasher.Hash(key) + bucket := m.table[hash] + var hole *entry + for i, e := range bucket { + if e.key == nil { + hole = &bucket[i] + } else if Identical(key, e.key) { + prev = e.value + bucket[i].value = value + return + } + } + + if hole != nil { + *hole = entry{key, value} // overwrite deleted entry + } else { + m.table[hash] = append(bucket, entry{key, value}) + } + } else { + if m.hasher.memo == nil { + m.hasher = MakeHasher() + } + hash := m.hasher.Hash(key) + m.table = map[uint32][]entry{hash: {entry{key, value}}} + } + + m.length++ + return +} + +// Len returns the number of map entries. +func (m *Map) Len() int { + if m != nil { + return m.length + } + return 0 +} + +// Iterate calls function f on each entry in the map in unspecified order. +// +// If f should mutate the map, Iterate provides the same guarantees as +// Go maps: if f deletes a map entry that Iterate has not yet reached, +// f will not be invoked for it, but if f inserts a map entry that +// Iterate has not yet reached, whether or not f will be invoked for +// it is unspecified. +// +func (m *Map) Iterate(f func(key types.Type, value interface{})) { + if m != nil { + for _, bucket := range m.table { + for _, e := range bucket { + if e.key != nil { + f(e.key, e.value) + } + } + } + } +} + +// Keys returns a new slice containing the set of map keys. +// The order is unspecified. +func (m *Map) Keys() []types.Type { + keys := make([]types.Type, 0, m.Len()) + m.Iterate(func(key types.Type, _ interface{}) { + keys = append(keys, key) + }) + return keys +} + +func (m *Map) toString(values bool) string { + if m == nil { + return "{}" + } + var buf bytes.Buffer + fmt.Fprint(&buf, "{") + sep := "" + m.Iterate(func(key types.Type, value interface{}) { + fmt.Fprint(&buf, sep) + sep = ", " + fmt.Fprint(&buf, key) + if values { + fmt.Fprintf(&buf, ": %q", value) + } + }) + fmt.Fprint(&buf, "}") + return buf.String() +} + +// String returns a string representation of the map's entries. +// Values are printed using fmt.Sprintf("%v", v). +// Order is unspecified. +// +func (m *Map) String() string { + return m.toString(true) +} + +// KeysString returns a string representation of the map's key set. +// Order is unspecified. +// +func (m *Map) KeysString() string { + return m.toString(false) +} + +//////////////////////////////////////////////////////////////////////// +// Hasher + +// A Hasher maps each type to its hash value. +// For efficiency, a hasher uses memoization; thus its memory +// footprint grows monotonically over time. +// Hashers are not thread-safe. +// Hashers have reference semantics. +// Call MakeHasher to create a Hasher. +type Hasher struct { + memo map[types.Type]uint32 +} + +// MakeHasher returns a new Hasher instance. +func MakeHasher() Hasher { + return Hasher{make(map[types.Type]uint32)} +} + +// Hash computes a hash value for the given type t such that +// Identical(t, t') => Hash(t) == Hash(t'). +func (h Hasher) Hash(t types.Type) uint32 { + hash, ok := h.memo[t] + if !ok { + hash = h.hashFor(t) + h.memo[t] = hash + } + return hash +} + +// hashString computes the Fowler–Noll–Vo hash of s. +func hashString(s string) uint32 { + var h uint32 + for i := 0; i < len(s); i++ { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +// hashFor computes the hash of t. +func (h Hasher) hashFor(t types.Type) uint32 { + // See Identical for rationale. + switch t := t.(type) { + case *types.Basic: + return uint32(t.Kind()) + + case *types.Array: + return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem()) + + case *types.Slice: + return 9049 + 2*h.Hash(t.Elem()) + + case *types.Struct: + var hash uint32 = 9059 + for i, n := 0, t.NumFields(); i < n; i++ { + f := t.Field(i) + if f.Anonymous() { + hash += 8861 + } + hash += hashString(t.Tag(i)) + hash += hashString(f.Name()) // (ignore f.Pkg) + hash += h.Hash(f.Type()) + } + return hash + + case *types.Pointer: + return 9067 + 2*h.Hash(t.Elem()) + + case *types.Signature: + var hash uint32 = 9091 + if t.Variadic() { + hash *= 8863 + } + return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results()) + + case *types.Interface: + var hash uint32 = 9103 + for i, n := 0, t.NumMethods(); i < n; i++ { + // See go/types.identicalMethods for rationale. + // Method order is not significant. + // Ignore m.Pkg(). + m := t.Method(i) + hash += 3*hashString(m.Name()) + 5*h.Hash(m.Type()) + } + return hash + + case *types.Map: + return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem()) + + case *types.Chan: + return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem()) + + case *types.Named: + // Not safe with a copying GC; objects may move. + return uint32(reflect.ValueOf(t.Obj()).Pointer()) + + case *types.Tuple: + return h.hashTuple(t) + } + panic(t) +} + +func (h Hasher) hashTuple(tuple *types.Tuple) uint32 { + // See go/types.identicalTypes for rationale. + n := tuple.Len() + var hash uint32 = 9137 + 2*uint32(n) + for i := 0; i < n; i++ { + hash += 3 * h.Hash(tuple.At(i).Type()) + } + return hash +} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/methodsetcache.go b/vendor/honnef.co/go/tools/go/types/typeutil/methodsetcache.go new file mode 100644 index 00000000..32084610 --- /dev/null +++ b/vendor/honnef.co/go/tools/go/types/typeutil/methodsetcache.go @@ -0,0 +1,72 @@ +// 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. + +// This file implements a cache of method sets. + +package typeutil + +import ( + "go/types" + "sync" +) + +// A MethodSetCache records the method set of each type T for which +// MethodSet(T) is called so that repeat queries are fast. +// The zero value is a ready-to-use cache instance. +type MethodSetCache struct { + mu sync.Mutex + named map[*types.Named]struct{ value, pointer *types.MethodSet } // method sets for named N and *N + others map[types.Type]*types.MethodSet // all other types +} + +// MethodSet returns the method set of type T. It is thread-safe. +// +// If cache is nil, this function is equivalent to types.NewMethodSet(T). +// Utility functions can thus expose an optional *MethodSetCache +// parameter to clients that care about performance. +// +func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet { + if cache == nil { + return types.NewMethodSet(T) + } + cache.mu.Lock() + defer cache.mu.Unlock() + + switch T := T.(type) { + case *types.Named: + return cache.lookupNamed(T).value + + case *types.Pointer: + if N, ok := T.Elem().(*types.Named); ok { + return cache.lookupNamed(N).pointer + } + } + + // all other types + // (The map uses pointer equivalence, not type identity.) + mset := cache.others[T] + if mset == nil { + mset = types.NewMethodSet(T) + if cache.others == nil { + cache.others = make(map[types.Type]*types.MethodSet) + } + cache.others[T] = mset + } + return mset +} + +func (cache *MethodSetCache) lookupNamed(named *types.Named) struct{ value, pointer *types.MethodSet } { + if cache.named == nil { + cache.named = make(map[*types.Named]struct{ value, pointer *types.MethodSet }) + } + // Avoid recomputing mset(*T) for each distinct Pointer + // instance whose underlying type is a named type. + msets, ok := cache.named[named] + if !ok { + msets.value = types.NewMethodSet(named) + msets.pointer = types.NewMethodSet(types.NewPointer(named)) + cache.named[named] = msets + } + return msets +} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/ui.go b/vendor/honnef.co/go/tools/go/types/typeutil/ui.go new file mode 100644 index 00000000..9849c24c --- /dev/null +++ b/vendor/honnef.co/go/tools/go/types/typeutil/ui.go @@ -0,0 +1,52 @@ +// 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 typeutil + +// This file defines utilities for user interfaces that display types. + +import "go/types" + +// IntuitiveMethodSet returns the intuitive method set of a type T, +// which is the set of methods you can call on an addressable value of +// that type. +// +// The result always contains MethodSet(T), and is exactly MethodSet(T) +// for interface types and for pointer-to-concrete types. +// For all other concrete types T, the result additionally +// contains each method belonging to *T if there is no identically +// named method on T itself. +// +// This corresponds to user intuition about method sets; +// this function is intended only for user interfaces. +// +// The order of the result is as for types.MethodSet(T). +// +func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection { + isPointerToConcrete := func(T types.Type) bool { + ptr, ok := T.(*types.Pointer) + return ok && !types.IsInterface(ptr.Elem()) + } + + var result []*types.Selection + mset := msets.MethodSet(T) + if types.IsInterface(T) || isPointerToConcrete(T) { + for i, n := 0, mset.Len(); i < n; i++ { + result = append(result, mset.At(i)) + } + } else { + // T is some other concrete type. + // Report methods of T and *T, preferring those of T. + pmset := msets.MethodSet(types.NewPointer(T)) + for i, n := 0, pmset.Len(); i < n; i++ { + meth := pmset.At(i) + if m := mset.Lookup(meth.Obj().Pkg(), meth.Obj().Name()); m != nil { + meth = m + } + result = append(result, meth) + } + + } + return result +} diff --git a/vendor/honnef.co/go/tools/internal/cache/cache.go b/vendor/honnef.co/go/tools/internal/cache/cache.go new file mode 100644 index 00000000..2b33ca10 --- /dev/null +++ b/vendor/honnef.co/go/tools/internal/cache/cache.go @@ -0,0 +1,474 @@ +// 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. + +// Package cache implements a build artifact cache. +// +// This package is a slightly modified fork of Go's +// cmd/go/internal/cache package. +package cache + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strconv" + "strings" + "time" + + "honnef.co/go/tools/internal/renameio" +) + +// An ActionID is a cache action key, the hash of a complete description of a +// repeatable computation (command line, environment variables, +// input file contents, executable contents). +type ActionID [HashSize]byte + +// An OutputID is a cache output key, the hash of an output of a computation. +type OutputID [HashSize]byte + +// A Cache is a package cache, backed by a file system directory tree. +type Cache struct { + dir string + now func() time.Time +} + +// Open opens and returns the cache in the given directory. +// +// It is safe for multiple processes on a single machine to use the +// same cache directory in a local file system simultaneously. +// They will coordinate using operating system file locks and may +// duplicate effort but will not corrupt the cache. +// +// However, it is NOT safe for multiple processes on different machines +// to share a cache directory (for example, if the directory were stored +// in a network file system). File locking is notoriously unreliable in +// network file systems and may not suffice to protect the cache. +// +func Open(dir string) (*Cache, error) { + info, err := os.Stat(dir) + if err != nil { + return nil, err + } + if !info.IsDir() { + return nil, &os.PathError{Op: "open", Path: dir, Err: fmt.Errorf("not a directory")} + } + for i := 0; i < 256; i++ { + name := filepath.Join(dir, fmt.Sprintf("%02x", i)) + if err := os.MkdirAll(name, 0777); err != nil { + return nil, err + } + } + c := &Cache{ + dir: dir, + now: time.Now, + } + return c, nil +} + +// fileName returns the name of the file corresponding to the given id. +func (c *Cache) fileName(id [HashSize]byte, key string) string { + return filepath.Join(c.dir, fmt.Sprintf("%02x", id[0]), fmt.Sprintf("%x", id)+"-"+key) +} + +var errMissing = errors.New("cache entry not found") + +const ( + // action entry file is "v1 \n" + hexSize = HashSize * 2 + entrySize = 2 + 1 + hexSize + 1 + hexSize + 1 + 20 + 1 + 20 + 1 +) + +// verify controls whether to run the cache in verify mode. +// In verify mode, the cache always returns errMissing from Get +// but then double-checks in Put that the data being written +// exactly matches any existing entry. This provides an easy +// way to detect program behavior that would have been different +// had the cache entry been returned from Get. +// +// verify is enabled by setting the environment variable +// GODEBUG=gocacheverify=1. +var verify = false + +// DebugTest is set when GODEBUG=gocachetest=1 is in the environment. +var DebugTest = false + +func init() { initEnv() } + +func initEnv() { + verify = false + debugHash = false + debug := strings.Split(os.Getenv("GODEBUG"), ",") + for _, f := range debug { + if f == "gocacheverify=1" { + verify = true + } + if f == "gocachehash=1" { + debugHash = true + } + if f == "gocachetest=1" { + DebugTest = true + } + } +} + +// Get looks up the action ID in the cache, +// returning the corresponding output ID and file size, if any. +// Note that finding an output ID does not guarantee that the +// saved file for that output ID is still available. +func (c *Cache) Get(id ActionID) (Entry, error) { + if verify { + return Entry{}, errMissing + } + return c.get(id) +} + +type Entry struct { + OutputID OutputID + Size int64 + Time time.Time +} + +// get is Get but does not respect verify mode, so that Put can use it. +func (c *Cache) get(id ActionID) (Entry, error) { + missing := func() (Entry, error) { + return Entry{}, errMissing + } + f, err := os.Open(c.fileName(id, "a")) + if err != nil { + return missing() + } + defer f.Close() + entry := make([]byte, entrySize+1) // +1 to detect whether f is too long + if n, err := io.ReadFull(f, entry); n != entrySize || err != io.ErrUnexpectedEOF { + return missing() + } + if entry[0] != 'v' || entry[1] != '1' || entry[2] != ' ' || entry[3+hexSize] != ' ' || entry[3+hexSize+1+hexSize] != ' ' || entry[3+hexSize+1+hexSize+1+20] != ' ' || entry[entrySize-1] != '\n' { + return missing() + } + eid, entry := entry[3:3+hexSize], entry[3+hexSize:] + eout, entry := entry[1:1+hexSize], entry[1+hexSize:] + esize, entry := entry[1:1+20], entry[1+20:] + //lint:ignore SA4006 See https://github.com/dominikh/go-tools/issues/465 + etime, entry := entry[1:1+20], entry[1+20:] + var buf [HashSize]byte + if _, err := hex.Decode(buf[:], eid); err != nil || buf != id { + return missing() + } + if _, err := hex.Decode(buf[:], eout); err != nil { + return missing() + } + i := 0 + for i < len(esize) && esize[i] == ' ' { + i++ + } + size, err := strconv.ParseInt(string(esize[i:]), 10, 64) + if err != nil || size < 0 { + return missing() + } + i = 0 + for i < len(etime) && etime[i] == ' ' { + i++ + } + tm, err := strconv.ParseInt(string(etime[i:]), 10, 64) + if err != nil || size < 0 { + return missing() + } + + c.used(c.fileName(id, "a")) + + return Entry{buf, size, time.Unix(0, tm)}, nil +} + +// GetFile looks up the action ID in the cache and returns +// the name of the corresponding data file. +func (c *Cache) GetFile(id ActionID) (file string, entry Entry, err error) { + entry, err = c.Get(id) + if err != nil { + return "", Entry{}, err + } + file = c.OutputFile(entry.OutputID) + info, err := os.Stat(file) + if err != nil || info.Size() != entry.Size { + return "", Entry{}, errMissing + } + return file, entry, nil +} + +// GetBytes looks up the action ID in the cache and returns +// the corresponding output bytes. +// GetBytes should only be used for data that can be expected to fit in memory. +func (c *Cache) GetBytes(id ActionID) ([]byte, Entry, error) { + entry, err := c.Get(id) + if err != nil { + return nil, entry, err + } + data, _ := ioutil.ReadFile(c.OutputFile(entry.OutputID)) + if sha256.Sum256(data) != entry.OutputID { + return nil, entry, errMissing + } + return data, entry, nil +} + +// OutputFile returns the name of the cache file storing output with the given OutputID. +func (c *Cache) OutputFile(out OutputID) string { + file := c.fileName(out, "d") + c.used(file) + return file +} + +// Time constants for cache expiration. +// +// We set the mtime on a cache file on each use, but at most one per mtimeInterval (1 hour), +// to avoid causing many unnecessary inode updates. The mtimes therefore +// roughly reflect "time of last use" but may in fact be older by at most an hour. +// +// We scan the cache for entries to delete at most once per trimInterval (1 day). +// +// When we do scan the cache, we delete entries that have not been used for +// at least trimLimit (5 days). Statistics gathered from a month of usage by +// Go developers found that essentially all reuse of cached entries happened +// within 5 days of the previous reuse. See golang.org/issue/22990. +const ( + mtimeInterval = 1 * time.Hour + trimInterval = 24 * time.Hour + trimLimit = 5 * 24 * time.Hour +) + +// used makes a best-effort attempt to update mtime on file, +// so that mtime reflects cache access time. +// +// Because the reflection only needs to be approximate, +// and to reduce the amount of disk activity caused by using +// cache entries, used only updates the mtime if the current +// mtime is more than an hour old. This heuristic eliminates +// nearly all of the mtime updates that would otherwise happen, +// while still keeping the mtimes useful for cache trimming. +func (c *Cache) used(file string) { + info, err := os.Stat(file) + if err == nil && c.now().Sub(info.ModTime()) < mtimeInterval { + return + } + os.Chtimes(file, c.now(), c.now()) +} + +// Trim removes old cache entries that are likely not to be reused. +func (c *Cache) Trim() { + now := c.now() + + // We maintain in dir/trim.txt the time of the last completed cache trim. + // If the cache has been trimmed recently enough, do nothing. + // This is the common case. + data, _ := ioutil.ReadFile(filepath.Join(c.dir, "trim.txt")) + t, err := strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64) + if err == nil && now.Sub(time.Unix(t, 0)) < trimInterval { + return + } + + // Trim each of the 256 subdirectories. + // We subtract an additional mtimeInterval + // to account for the imprecision of our "last used" mtimes. + cutoff := now.Add(-trimLimit - mtimeInterval) + for i := 0; i < 256; i++ { + subdir := filepath.Join(c.dir, fmt.Sprintf("%02x", i)) + c.trimSubdir(subdir, cutoff) + } + + // Ignore errors from here: if we don't write the complete timestamp, the + // cache will appear older than it is, and we'll trim it again next time. + renameio.WriteFile(filepath.Join(c.dir, "trim.txt"), []byte(fmt.Sprintf("%d", now.Unix()))) +} + +// trimSubdir trims a single cache subdirectory. +func (c *Cache) trimSubdir(subdir string, cutoff time.Time) { + // Read all directory entries from subdir before removing + // any files, in case removing files invalidates the file offset + // in the directory scan. Also, ignore error from f.Readdirnames, + // because we don't care about reporting the error and we still + // want to process any entries found before the error. + f, err := os.Open(subdir) + if err != nil { + return + } + names, _ := f.Readdirnames(-1) + f.Close() + + for _, name := range names { + // Remove only cache entries (xxxx-a and xxxx-d). + if !strings.HasSuffix(name, "-a") && !strings.HasSuffix(name, "-d") { + continue + } + entry := filepath.Join(subdir, name) + info, err := os.Stat(entry) + if err == nil && info.ModTime().Before(cutoff) { + os.Remove(entry) + } + } +} + +// putIndexEntry adds an entry to the cache recording that executing the action +// with the given id produces an output with the given output id (hash) and size. +func (c *Cache) putIndexEntry(id ActionID, out OutputID, size int64, allowVerify bool) error { + // Note: We expect that for one reason or another it may happen + // that repeating an action produces a different output hash + // (for example, if the output contains a time stamp or temp dir name). + // While not ideal, this is also not a correctness problem, so we + // don't make a big deal about it. In particular, we leave the action + // cache entries writable specifically so that they can be overwritten. + // + // Setting GODEBUG=gocacheverify=1 does make a big deal: + // in verify mode we are double-checking that the cache entries + // are entirely reproducible. As just noted, this may be unrealistic + // in some cases but the check is also useful for shaking out real bugs. + entry := []byte(fmt.Sprintf("v1 %x %x %20d %20d\n", id, out, size, time.Now().UnixNano())) + if verify && allowVerify { + old, err := c.get(id) + if err == nil && (old.OutputID != out || old.Size != size) { + // panic to show stack trace, so we can see what code is generating this cache entry. + msg := fmt.Sprintf("go: internal cache error: cache verify failed: id=%x changed:<<<\n%s\n>>>\nold: %x %d\nnew: %x %d", id, reverseHash(id), out, size, old.OutputID, old.Size) + panic(msg) + } + } + file := c.fileName(id, "a") + if err := ioutil.WriteFile(file, entry, 0666); err != nil { + // TODO(bcmills): This Remove potentially races with another go command writing to file. + // Can we eliminate it? + os.Remove(file) + return err + } + os.Chtimes(file, c.now(), c.now()) // mainly for tests + + return nil +} + +// Put stores the given output in the cache as the output for the action ID. +// It may read file twice. The content of file must not change between the two passes. +func (c *Cache) Put(id ActionID, file io.ReadSeeker) (OutputID, int64, error) { + return c.put(id, file, true) +} + +// PutNoVerify is like Put but disables the verify check +// when GODEBUG=goverifycache=1 is set. +// It is meant for data that is OK to cache but that we expect to vary slightly from run to run, +// like test output containing times and the like. +func (c *Cache) PutNoVerify(id ActionID, file io.ReadSeeker) (OutputID, int64, error) { + return c.put(id, file, false) +} + +func (c *Cache) put(id ActionID, file io.ReadSeeker, allowVerify bool) (OutputID, int64, error) { + // Compute output ID. + h := sha256.New() + if _, err := file.Seek(0, 0); err != nil { + return OutputID{}, 0, err + } + size, err := io.Copy(h, file) + if err != nil { + return OutputID{}, 0, err + } + var out OutputID + h.Sum(out[:0]) + + // Copy to cached output file (if not already present). + if err := c.copyFile(file, out, size); err != nil { + return out, size, err + } + + // Add to cache index. + return out, size, c.putIndexEntry(id, out, size, allowVerify) +} + +// PutBytes stores the given bytes in the cache as the output for the action ID. +func (c *Cache) PutBytes(id ActionID, data []byte) error { + _, _, err := c.Put(id, bytes.NewReader(data)) + return err +} + +// copyFile copies file into the cache, expecting it to have the given +// output ID and size, if that file is not present already. +func (c *Cache) copyFile(file io.ReadSeeker, out OutputID, size int64) error { + name := c.fileName(out, "d") + info, err := os.Stat(name) + if err == nil && info.Size() == size { + // Check hash. + if f, err := os.Open(name); err == nil { + h := sha256.New() + io.Copy(h, f) + f.Close() + var out2 OutputID + h.Sum(out2[:0]) + if out == out2 { + return nil + } + } + // Hash did not match. Fall through and rewrite file. + } + + // Copy file to cache directory. + mode := os.O_RDWR | os.O_CREATE + if err == nil && info.Size() > size { // shouldn't happen but fix in case + mode |= os.O_TRUNC + } + f, err := os.OpenFile(name, mode, 0666) + if err != nil { + return err + } + defer f.Close() + if size == 0 { + // File now exists with correct size. + // Only one possible zero-length file, so contents are OK too. + // Early return here makes sure there's a "last byte" for code below. + return nil + } + + // From here on, if any of the I/O writing the file fails, + // we make a best-effort attempt to truncate the file f + // before returning, to avoid leaving bad bytes in the file. + + // Copy file to f, but also into h to double-check hash. + if _, err := file.Seek(0, 0); err != nil { + f.Truncate(0) + return err + } + h := sha256.New() + w := io.MultiWriter(f, h) + if _, err := io.CopyN(w, file, size-1); err != nil { + f.Truncate(0) + return err + } + // Check last byte before writing it; writing it will make the size match + // what other processes expect to find and might cause them to start + // using the file. + buf := make([]byte, 1) + if _, err := file.Read(buf); err != nil { + f.Truncate(0) + return err + } + h.Write(buf) + sum := h.Sum(nil) + if !bytes.Equal(sum, out[:]) { + f.Truncate(0) + return fmt.Errorf("file content changed underfoot") + } + + // Commit cache file entry. + if _, err := f.Write(buf); err != nil { + f.Truncate(0) + return err + } + if err := f.Close(); err != nil { + // Data might not have been written, + // but file may look like it is the right size. + // To be extra careful, remove cached file. + os.Remove(name) + return err + } + os.Chtimes(name, c.now(), c.now()) // mainly for tests + + return nil +} diff --git a/vendor/honnef.co/go/tools/internal/cache/default.go b/vendor/honnef.co/go/tools/internal/cache/default.go new file mode 100644 index 00000000..3034f76a --- /dev/null +++ b/vendor/honnef.co/go/tools/internal/cache/default.go @@ -0,0 +1,85 @@ +// 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. + +package cache + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" + "sync" +) + +// Default returns the default cache to use. +func Default() (*Cache, error) { + defaultOnce.Do(initDefaultCache) + return defaultCache, defaultDirErr +} + +var ( + defaultOnce sync.Once + defaultCache *Cache +) + +// cacheREADME is a message stored in a README in the cache directory. +// Because the cache lives outside the normal Go trees, we leave the +// README as a courtesy to explain where it came from. +const cacheREADME = `This directory holds cached build artifacts from staticcheck. +` + +// initDefaultCache does the work of finding the default cache +// the first time Default is called. +func initDefaultCache() { + dir := DefaultDir() + if err := os.MkdirAll(dir, 0777); err != nil { + log.Fatalf("failed to initialize build cache at %s: %s\n", dir, err) + } + if _, err := os.Stat(filepath.Join(dir, "README")); err != nil { + // Best effort. + ioutil.WriteFile(filepath.Join(dir, "README"), []byte(cacheREADME), 0666) + } + + c, err := Open(dir) + if err != nil { + log.Fatalf("failed to initialize build cache at %s: %s\n", dir, err) + } + defaultCache = c +} + +var ( + defaultDirOnce sync.Once + defaultDir string + defaultDirErr error +) + +// DefaultDir returns the effective STATICCHECK_CACHE setting. +func DefaultDir() string { + // Save the result of the first call to DefaultDir for later use in + // initDefaultCache. cmd/go/main.go explicitly sets GOCACHE so that + // subprocesses will inherit it, but that means initDefaultCache can't + // otherwise distinguish between an explicit "off" and a UserCacheDir error. + + defaultDirOnce.Do(func() { + defaultDir = os.Getenv("STATICCHECK_CACHE") + if filepath.IsAbs(defaultDir) { + return + } + if defaultDir != "" { + defaultDirErr = fmt.Errorf("STATICCHECK_CACHE is not an absolute path") + return + } + + // Compute default location. + dir, err := os.UserCacheDir() + if err != nil { + defaultDirErr = fmt.Errorf("STATICCHECK_CACHE is not defined and %v", err) + return + } + defaultDir = filepath.Join(dir, "staticcheck") + }) + + return defaultDir +} diff --git a/vendor/honnef.co/go/tools/internal/cache/hash.go b/vendor/honnef.co/go/tools/internal/cache/hash.go new file mode 100644 index 00000000..a53543ec --- /dev/null +++ b/vendor/honnef.co/go/tools/internal/cache/hash.go @@ -0,0 +1,176 @@ +// 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. + +package cache + +import ( + "bytes" + "crypto/sha256" + "fmt" + "hash" + "io" + "os" + "sync" +) + +var debugHash = false // set when GODEBUG=gocachehash=1 + +// HashSize is the number of bytes in a hash. +const HashSize = 32 + +// A Hash provides access to the canonical hash function used to index the cache. +// The current implementation uses salted SHA256, but clients must not assume this. +type Hash struct { + h hash.Hash + name string // for debugging + buf *bytes.Buffer // for verify +} + +// hashSalt is a salt string added to the beginning of every hash +// created by NewHash. Using the Staticcheck version makes sure that different +// versions of the command do not address the same cache +// entries, so that a bug in one version does not affect the execution +// of other versions. This salt will result in additional ActionID files +// in the cache, but not additional copies of the large output files, +// which are still addressed by unsalted SHA256. +var hashSalt []byte + +func SetSalt(b []byte) { + hashSalt = b +} + +// Subkey returns an action ID corresponding to mixing a parent +// action ID with a string description of the subkey. +func Subkey(parent ActionID, desc string) ActionID { + h := sha256.New() + h.Write([]byte("subkey:")) + h.Write(parent[:]) + h.Write([]byte(desc)) + var out ActionID + h.Sum(out[:0]) + if debugHash { + fmt.Fprintf(os.Stderr, "HASH subkey %x %q = %x\n", parent, desc, out) + } + if verify { + hashDebug.Lock() + hashDebug.m[out] = fmt.Sprintf("subkey %x %q", parent, desc) + hashDebug.Unlock() + } + return out +} + +// NewHash returns a new Hash. +// The caller is expected to Write data to it and then call Sum. +func NewHash(name string) *Hash { + h := &Hash{h: sha256.New(), name: name} + if debugHash { + fmt.Fprintf(os.Stderr, "HASH[%s]\n", h.name) + } + h.Write(hashSalt) + if verify { + h.buf = new(bytes.Buffer) + } + return h +} + +// Write writes data to the running hash. +func (h *Hash) Write(b []byte) (int, error) { + if debugHash { + fmt.Fprintf(os.Stderr, "HASH[%s]: %q\n", h.name, b) + } + if h.buf != nil { + h.buf.Write(b) + } + return h.h.Write(b) +} + +// Sum returns the hash of the data written previously. +func (h *Hash) Sum() [HashSize]byte { + var out [HashSize]byte + h.h.Sum(out[:0]) + if debugHash { + fmt.Fprintf(os.Stderr, "HASH[%s]: %x\n", h.name, out) + } + if h.buf != nil { + hashDebug.Lock() + if hashDebug.m == nil { + hashDebug.m = make(map[[HashSize]byte]string) + } + hashDebug.m[out] = h.buf.String() + hashDebug.Unlock() + } + return out +} + +// In GODEBUG=gocacheverify=1 mode, +// hashDebug holds the input to every computed hash ID, +// so that we can work backward from the ID involved in a +// cache entry mismatch to a description of what should be there. +var hashDebug struct { + sync.Mutex + m map[[HashSize]byte]string +} + +// reverseHash returns the input used to compute the hash id. +func reverseHash(id [HashSize]byte) string { + hashDebug.Lock() + s := hashDebug.m[id] + hashDebug.Unlock() + return s +} + +var hashFileCache struct { + sync.Mutex + m map[string][HashSize]byte +} + +// FileHash returns the hash of the named file. +// It caches repeated lookups for a given file, +// and the cache entry for a file can be initialized +// using SetFileHash. +// The hash used by FileHash is not the same as +// the hash used by NewHash. +func FileHash(file string) ([HashSize]byte, error) { + hashFileCache.Lock() + out, ok := hashFileCache.m[file] + hashFileCache.Unlock() + + if ok { + return out, nil + } + + h := sha256.New() + f, err := os.Open(file) + if err != nil { + if debugHash { + fmt.Fprintf(os.Stderr, "HASH %s: %v\n", file, err) + } + return [HashSize]byte{}, err + } + _, err = io.Copy(h, f) + f.Close() + if err != nil { + if debugHash { + fmt.Fprintf(os.Stderr, "HASH %s: %v\n", file, err) + } + return [HashSize]byte{}, err + } + h.Sum(out[:0]) + if debugHash { + fmt.Fprintf(os.Stderr, "HASH %s: %x\n", file, out) + } + + SetFileHash(file, out) + return out, nil +} + +// SetFileHash sets the hash returned by FileHash for file. +func SetFileHash(file string, sum [HashSize]byte) { + hashFileCache.Lock() + if hashFileCache.m == nil { + hashFileCache.m = make(map[string][HashSize]byte) + } + hashFileCache.m[file] = sum + hashFileCache.Unlock() +} diff --git a/vendor/honnef.co/go/tools/internal/passes/buildssa/buildssa.go b/vendor/honnef.co/go/tools/internal/passes/buildssa/buildssa.go new file mode 100644 index 00000000..fde918d1 --- /dev/null +++ b/vendor/honnef.co/go/tools/internal/passes/buildssa/buildssa.go @@ -0,0 +1,116 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package buildssa defines an Analyzer that constructs the SSA +// representation of an error-free package and returns the set of all +// functions within it. It does not report any diagnostics itself but +// may be used as an input to other analyzers. +// +// THIS INTERFACE IS EXPERIMENTAL AND MAY BE SUBJECT TO INCOMPATIBLE CHANGE. +package buildssa + +import ( + "go/ast" + "go/types" + "reflect" + + "golang.org/x/tools/go/analysis" + "honnef.co/go/tools/ssa" +) + +var Analyzer = &analysis.Analyzer{ + Name: "buildssa", + Doc: "build SSA-form IR for later passes", + Run: run, + ResultType: reflect.TypeOf(new(SSA)), +} + +// SSA provides SSA-form intermediate representation for all the +// non-blank source functions in the current package. +type SSA struct { + Pkg *ssa.Package + SrcFuncs []*ssa.Function +} + +func run(pass *analysis.Pass) (interface{}, error) { + // Plundered from ssautil.BuildPackage. + + // We must create a new Program for each Package because the + // analysis API provides no place to hang a Program shared by + // all Packages. Consequently, SSA Packages and Functions do not + // have a canonical representation across an analysis session of + // multiple packages. This is unlikely to be a problem in + // practice because the analysis API essentially forces all + // packages to be analysed independently, so any given call to + // Analysis.Run on a package will see only SSA objects belonging + // to a single Program. + + mode := ssa.GlobalDebug + + prog := ssa.NewProgram(pass.Fset, mode) + + // Create SSA packages for all imports. + // Order is not significant. + created := make(map[*types.Package]bool) + var createAll func(pkgs []*types.Package) + createAll = func(pkgs []*types.Package) { + for _, p := range pkgs { + if !created[p] { + created[p] = true + prog.CreatePackage(p, nil, nil, true) + createAll(p.Imports()) + } + } + } + createAll(pass.Pkg.Imports()) + + // Create and build the primary package. + ssapkg := prog.CreatePackage(pass.Pkg, pass.Files, pass.TypesInfo, false) + ssapkg.Build() + + // Compute list of source functions, including literals, + // in source order. + var funcs []*ssa.Function + var addAnons func(f *ssa.Function) + addAnons = func(f *ssa.Function) { + funcs = append(funcs, f) + for _, anon := range f.AnonFuncs { + addAnons(anon) + } + } + addAnons(ssapkg.Members["init"].(*ssa.Function)) + for _, f := range pass.Files { + for _, decl := range f.Decls { + if fdecl, ok := decl.(*ast.FuncDecl); ok { + + // SSA will not build a Function + // for a FuncDecl named blank. + // That's arguably too strict but + // relaxing it would break uniqueness of + // names of package members. + if fdecl.Name.Name == "_" { + continue + } + + // (init functions have distinct Func + // objects named "init" and distinct + // ssa.Functions named "init#1", ...) + + fn := pass.TypesInfo.Defs[fdecl.Name].(*types.Func) + if fn == nil { + panic(fn) + } + + f := ssapkg.Prog.FuncValue(fn) + if f == nil { + panic(fn) + } + + addAnons(f) + } + } + } + + return &SSA{Pkg: ssapkg, SrcFuncs: funcs}, nil +} diff --git a/vendor/honnef.co/go/tools/internal/renameio/renameio.go b/vendor/honnef.co/go/tools/internal/renameio/renameio.go new file mode 100644 index 00000000..3f3f1708 --- /dev/null +++ b/vendor/honnef.co/go/tools/internal/renameio/renameio.go @@ -0,0 +1,83 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package renameio writes files atomically by renaming temporary files. +package renameio + +import ( + "bytes" + "io" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strings" + "time" +) + +const patternSuffix = "*.tmp" + +// Pattern returns a glob pattern that matches the unrenamed temporary files +// created when writing to filename. +func Pattern(filename string) string { + return filepath.Join(filepath.Dir(filename), filepath.Base(filename)+patternSuffix) +} + +// WriteFile is like ioutil.WriteFile, but first writes data to an arbitrary +// file in the same directory as filename, then renames it atomically to the +// final name. +// +// That ensures that the final location, if it exists, is always a complete file. +func WriteFile(filename string, data []byte) (err error) { + return WriteToFile(filename, bytes.NewReader(data)) +} + +// WriteToFile is a variant of WriteFile that accepts the data as an io.Reader +// instead of a slice. +func WriteToFile(filename string, data io.Reader) (err error) { + f, err := ioutil.TempFile(filepath.Dir(filename), filepath.Base(filename)+patternSuffix) + if err != nil { + return err + } + defer func() { + // Only call os.Remove on f.Name() if we failed to rename it: otherwise, + // some other process may have created a new file with the same name after + // that. + if err != nil { + f.Close() + os.Remove(f.Name()) + } + }() + + if _, err := io.Copy(f, data); err != nil { + return err + } + // Sync the file before renaming it: otherwise, after a crash the reader may + // observe a 0-length file instead of the actual contents. + // See https://golang.org/issue/22397#issuecomment-380831736. + if err := f.Sync(); err != nil { + return err + } + if err := f.Close(); err != nil { + return err + } + + var start time.Time + for { + err := os.Rename(f.Name(), filename) + if err == nil || runtime.GOOS != "windows" || !strings.HasSuffix(err.Error(), "Access is denied.") { + return err + } + + // Windows seems to occasionally trigger spurious "Access is denied" errors + // here (see golang.org/issue/31247). We're not sure why. It's probably + // worth a little extra latency to avoid propagating the spurious errors. + if start.IsZero() { + start = time.Now() + } else if time.Since(start) >= 500*time.Millisecond { + return err + } + time.Sleep(5 * time.Millisecond) + } +} diff --git a/vendor/honnef.co/go/tools/internal/sharedcheck/lint.go b/vendor/honnef.co/go/tools/internal/sharedcheck/lint.go new file mode 100644 index 00000000..affee660 --- /dev/null +++ b/vendor/honnef.co/go/tools/internal/sharedcheck/lint.go @@ -0,0 +1,70 @@ +package sharedcheck + +import ( + "go/ast" + "go/types" + + "golang.org/x/tools/go/analysis" + "honnef.co/go/tools/internal/passes/buildssa" + . "honnef.co/go/tools/lint/lintdsl" + "honnef.co/go/tools/ssa" +) + +func CheckRangeStringRunes(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + fn := func(node ast.Node) bool { + rng, ok := node.(*ast.RangeStmt) + if !ok || !IsBlank(rng.Key) { + return true + } + + v, _ := ssafn.ValueForExpr(rng.X) + + // Check that we're converting from string to []rune + val, _ := v.(*ssa.Convert) + if val == nil { + return true + } + Tsrc, ok := val.X.Type().(*types.Basic) + if !ok || Tsrc.Kind() != types.String { + return true + } + Tdst, ok := val.Type().(*types.Slice) + if !ok { + return true + } + TdstElem, ok := Tdst.Elem().(*types.Basic) + if !ok || TdstElem.Kind() != types.Int32 { + return true + } + + // Check that the result of the conversion is only used to + // range over + refs := val.Referrers() + if refs == nil { + return true + } + + // Expect two refs: one for obtaining the length of the slice, + // one for accessing the elements + if len(FilterDebug(*refs)) != 2 { + // TODO(dh): right now, we check that only one place + // refers to our slice. This will miss cases such as + // ranging over the slice twice. Ideally, we'd ensure that + // the slice is only used for ranging over (without + // accessing the key), but that is harder to do because in + // SSA form, ranging over a slice looks like an ordinary + // loop with index increments and slice accesses. We'd + // have to look at the associated AST node to check that + // it's a range statement. + return true + } + + pass.Reportf(rng.Pos(), "should range over string, not []rune(string)") + + return true + } + Inspect(ssafn.Syntax(), fn) + } + return nil, nil +} diff --git a/vendor/honnef.co/go/tools/lint/LICENSE b/vendor/honnef.co/go/tools/lint/LICENSE new file mode 100644 index 00000000..796130a1 --- /dev/null +++ b/vendor/honnef.co/go/tools/lint/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2013 The Go Authors. All rights reserved. +Copyright (c) 2016 Dominik Honnef. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/honnef.co/go/tools/lint/lint.go b/vendor/honnef.co/go/tools/lint/lint.go new file mode 100644 index 00000000..de5a8f12 --- /dev/null +++ b/vendor/honnef.co/go/tools/lint/lint.go @@ -0,0 +1,491 @@ +// Package lint provides the foundation for tools like staticcheck +package lint // import "honnef.co/go/tools/lint" + +import ( + "bytes" + "fmt" + "go/scanner" + "go/token" + "go/types" + "path/filepath" + "sort" + "strings" + "sync" + "sync/atomic" + "unicode" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/packages" + "honnef.co/go/tools/config" +) + +type Documentation struct { + Title string + Text string + Since string + NonDefault bool + Options []string +} + +func (doc *Documentation) String() string { + b := &strings.Builder{} + fmt.Fprintf(b, "%s\n\n", doc.Title) + if doc.Text != "" { + fmt.Fprintf(b, "%s\n\n", doc.Text) + } + fmt.Fprint(b, "Available since\n ") + if doc.Since == "" { + fmt.Fprint(b, "unreleased") + } else { + fmt.Fprintf(b, "%s", doc.Since) + } + if doc.NonDefault { + fmt.Fprint(b, ", non-default") + } + fmt.Fprint(b, "\n") + if len(doc.Options) > 0 { + fmt.Fprintf(b, "\nOptions\n") + for _, opt := range doc.Options { + fmt.Fprintf(b, " %s", opt) + } + fmt.Fprint(b, "\n") + } + return b.String() +} + +type Ignore interface { + Match(p Problem) bool +} + +type LineIgnore struct { + File string + Line int + Checks []string + Matched bool + Pos token.Pos +} + +func (li *LineIgnore) Match(p Problem) bool { + pos := p.Pos + if pos.Filename != li.File || pos.Line != li.Line { + return false + } + for _, c := range li.Checks { + if m, _ := filepath.Match(c, p.Check); m { + li.Matched = true + return true + } + } + return false +} + +func (li *LineIgnore) String() string { + matched := "not matched" + if li.Matched { + matched = "matched" + } + return fmt.Sprintf("%s:%d %s (%s)", li.File, li.Line, strings.Join(li.Checks, ", "), matched) +} + +type FileIgnore struct { + File string + Checks []string +} + +func (fi *FileIgnore) Match(p Problem) bool { + if p.Pos.Filename != fi.File { + return false + } + for _, c := range fi.Checks { + if m, _ := filepath.Match(c, p.Check); m { + return true + } + } + return false +} + +type Severity uint8 + +const ( + Error Severity = iota + Warning + Ignored +) + +// Problem represents a problem in some source code. +type Problem struct { + Pos token.Position + End token.Position + Message string + Check string + Severity Severity +} + +func (p *Problem) String() string { + return fmt.Sprintf("%s (%s)", p.Message, p.Check) +} + +// A Linter lints Go source code. +type Linter struct { + Checkers []*analysis.Analyzer + CumulativeCheckers []CumulativeChecker + GoVersion int + Config config.Config + Stats Stats +} + +type CumulativeChecker interface { + Analyzer() *analysis.Analyzer + Result() []types.Object + ProblemObject(*token.FileSet, types.Object) Problem +} + +func (l *Linter) Lint(cfg *packages.Config, patterns []string) ([]Problem, error) { + var allAnalyzers []*analysis.Analyzer + allAnalyzers = append(allAnalyzers, l.Checkers...) + for _, cum := range l.CumulativeCheckers { + allAnalyzers = append(allAnalyzers, cum.Analyzer()) + } + + // The -checks command line flag overrules all configuration + // files, which means that for `-checks="foo"`, no check other + // than foo can ever be reported to the user. Make use of this + // fact to cull the list of analyses we need to run. + + // replace "inherit" with "all", as we don't want to base the + // list of all checks on the default configuration, which + // disables certain checks. + checks := make([]string, len(l.Config.Checks)) + copy(checks, l.Config.Checks) + for i, c := range checks { + if c == "inherit" { + checks[i] = "all" + } + } + + allowed := FilterChecks(allAnalyzers, checks) + var allowedAnalyzers []*analysis.Analyzer + for _, c := range l.Checkers { + if allowed[c.Name] { + allowedAnalyzers = append(allowedAnalyzers, c) + } + } + hasCumulative := false + for _, cum := range l.CumulativeCheckers { + a := cum.Analyzer() + if allowed[a.Name] { + hasCumulative = true + allowedAnalyzers = append(allowedAnalyzers, a) + } + } + + r, err := NewRunner(&l.Stats) + if err != nil { + return nil, err + } + r.goVersion = l.GoVersion + + pkgs, err := r.Run(cfg, patterns, allowedAnalyzers, hasCumulative) + if err != nil { + return nil, err + } + + tpkgToPkg := map[*types.Package]*Package{} + for _, pkg := range pkgs { + tpkgToPkg[pkg.Types] = pkg + + for _, e := range pkg.errs { + switch e := e.(type) { + case types.Error: + p := Problem{ + Pos: e.Fset.PositionFor(e.Pos, false), + Message: e.Msg, + Severity: Error, + Check: "compile", + } + pkg.problems = append(pkg.problems, p) + case packages.Error: + msg := e.Msg + if len(msg) != 0 && msg[0] == '\n' { + // TODO(dh): See https://github.com/golang/go/issues/32363 + msg = msg[1:] + } + + var pos token.Position + if e.Pos == "" { + // Under certain conditions (malformed package + // declarations, multiple packages in the same + // directory), go list emits an error on stderr + // instead of JSON. Those errors do not have + // associated position information in + // go/packages.Error, even though the output on + // stderr may contain it. + if p, n, err := parsePos(msg); err == nil { + if abs, err := filepath.Abs(p.Filename); err == nil { + p.Filename = abs + } + pos = p + msg = msg[n+2:] + } + } else { + var err error + pos, _, err = parsePos(e.Pos) + if err != nil { + panic(fmt.Sprintf("internal error: %s", e)) + } + } + p := Problem{ + Pos: pos, + Message: msg, + Severity: Error, + Check: "compile", + } + pkg.problems = append(pkg.problems, p) + case scanner.ErrorList: + for _, e := range e { + p := Problem{ + Pos: e.Pos, + Message: e.Msg, + Severity: Error, + Check: "compile", + } + pkg.problems = append(pkg.problems, p) + } + case error: + p := Problem{ + Pos: token.Position{}, + Message: e.Error(), + Severity: Error, + Check: "compile", + } + pkg.problems = append(pkg.problems, p) + } + } + } + + atomic.StoreUint32(&r.stats.State, StateCumulative) + var problems []Problem + for _, cum := range l.CumulativeCheckers { + for _, res := range cum.Result() { + pkg := tpkgToPkg[res.Pkg()] + allowedChecks := FilterChecks(allowedAnalyzers, pkg.cfg.Merge(l.Config).Checks) + if allowedChecks[cum.Analyzer().Name] { + pos := DisplayPosition(pkg.Fset, res.Pos()) + // FIXME(dh): why are we ignoring generated files + // here? Surely this is specific to 'unused', not all + // cumulative checkers + if _, ok := pkg.gen[pos.Filename]; ok { + continue + } + p := cum.ProblemObject(pkg.Fset, res) + problems = append(problems, p) + } + } + } + + for _, pkg := range pkgs { + for _, ig := range pkg.ignores { + for i := range pkg.problems { + p := &pkg.problems[i] + if ig.Match(*p) { + p.Severity = Ignored + } + } + for i := range problems { + p := &problems[i] + if ig.Match(*p) { + p.Severity = Ignored + } + } + } + + if pkg.cfg == nil { + // The package failed to load, otherwise we would have a + // valid config. Pass through all errors. + problems = append(problems, pkg.problems...) + } else { + for _, p := range pkg.problems { + allowedChecks := FilterChecks(allowedAnalyzers, pkg.cfg.Merge(l.Config).Checks) + allowedChecks["compile"] = true + if allowedChecks[p.Check] { + problems = append(problems, p) + } + } + } + + for _, ig := range pkg.ignores { + ig, ok := ig.(*LineIgnore) + if !ok { + continue + } + if ig.Matched { + continue + } + + couldveMatched := false + allowedChecks := FilterChecks(allowedAnalyzers, pkg.cfg.Merge(l.Config).Checks) + for _, c := range ig.Checks { + if !allowedChecks[c] { + continue + } + couldveMatched = true + break + } + + if !couldveMatched { + // The ignored checks were disabled for the containing package. + // Don't flag the ignore for not having matched. + continue + } + p := Problem{ + Pos: DisplayPosition(pkg.Fset, ig.Pos), + Message: "this linter directive didn't match anything; should it be removed?", + Check: "", + } + problems = append(problems, p) + } + } + + if len(problems) == 0 { + return nil, nil + } + + sort.Slice(problems, func(i, j int) bool { + pi := problems[i].Pos + pj := problems[j].Pos + + if pi.Filename != pj.Filename { + return pi.Filename < pj.Filename + } + if pi.Line != pj.Line { + return pi.Line < pj.Line + } + if pi.Column != pj.Column { + return pi.Column < pj.Column + } + + return problems[i].Message < problems[j].Message + }) + + var out []Problem + out = append(out, problems[0]) + for i, p := range problems[1:] { + // We may encounter duplicate problems because one file + // can be part of many packages. + if problems[i] != p { + out = append(out, p) + } + } + return out, nil +} + +func FilterChecks(allChecks []*analysis.Analyzer, checks []string) map[string]bool { + // OPT(dh): this entire computation could be cached per package + allowedChecks := map[string]bool{} + + for _, check := range checks { + b := true + if len(check) > 1 && check[0] == '-' { + b = false + check = check[1:] + } + if check == "*" || check == "all" { + // Match all + for _, c := range allChecks { + allowedChecks[c.Name] = b + } + } else if strings.HasSuffix(check, "*") { + // Glob + prefix := check[:len(check)-1] + isCat := strings.IndexFunc(prefix, func(r rune) bool { return unicode.IsNumber(r) }) == -1 + + for _, c := range allChecks { + idx := strings.IndexFunc(c.Name, func(r rune) bool { return unicode.IsNumber(r) }) + if isCat { + // Glob is S*, which should match S1000 but not SA1000 + cat := c.Name[:idx] + if prefix == cat { + allowedChecks[c.Name] = b + } + } else { + // Glob is S1* + if strings.HasPrefix(c.Name, prefix) { + allowedChecks[c.Name] = b + } + } + } + } else { + // Literal check name + allowedChecks[check] = b + } + } + return allowedChecks +} + +type Positioner interface { + Pos() token.Pos +} + +func DisplayPosition(fset *token.FileSet, p token.Pos) token.Position { + if p == token.NoPos { + return token.Position{} + } + + // Only use the adjusted position if it points to another Go file. + // This means we'll point to the original file for cgo files, but + // we won't point to a YACC grammar file. + pos := fset.PositionFor(p, false) + adjPos := fset.PositionFor(p, true) + + if filepath.Ext(adjPos.Filename) == ".go" { + return adjPos + } + return pos +} + +var bufferPool = &sync.Pool{ + New: func() interface{} { + buf := bytes.NewBuffer(nil) + buf.Grow(64) + return buf + }, +} + +func FuncName(f *types.Func) string { + buf := bufferPool.Get().(*bytes.Buffer) + buf.Reset() + if f.Type() != nil { + sig := f.Type().(*types.Signature) + if recv := sig.Recv(); recv != nil { + buf.WriteByte('(') + if _, ok := recv.Type().(*types.Interface); ok { + // gcimporter creates abstract methods of + // named interfaces using the interface type + // (not the named type) as the receiver. + // Don't print it in full. + buf.WriteString("interface") + } else { + types.WriteType(buf, recv.Type(), nil) + } + buf.WriteByte(')') + buf.WriteByte('.') + } else if f.Pkg() != nil { + writePackage(buf, f.Pkg()) + } + } + buf.WriteString(f.Name()) + s := buf.String() + bufferPool.Put(buf) + return s +} + +func writePackage(buf *bytes.Buffer, pkg *types.Package) { + if pkg == nil { + return + } + s := pkg.Path() + if s != "" { + buf.WriteString(s) + buf.WriteByte('.') + } +} diff --git a/vendor/honnef.co/go/tools/lint/lintdsl/lintdsl.go b/vendor/honnef.co/go/tools/lint/lintdsl/lintdsl.go new file mode 100644 index 00000000..3b939e95 --- /dev/null +++ b/vendor/honnef.co/go/tools/lint/lintdsl/lintdsl.go @@ -0,0 +1,400 @@ +// Package lintdsl provides helpers for implementing static analysis +// checks. Dot-importing this package is encouraged. +package lintdsl + +import ( + "bytes" + "flag" + "fmt" + "go/ast" + "go/constant" + "go/printer" + "go/token" + "go/types" + "strings" + + "golang.org/x/tools/go/analysis" + "honnef.co/go/tools/facts" + "honnef.co/go/tools/lint" + "honnef.co/go/tools/ssa" +) + +type packager interface { + Package() *ssa.Package +} + +func CallName(call *ssa.CallCommon) string { + if call.IsInvoke() { + return "" + } + switch v := call.Value.(type) { + case *ssa.Function: + fn, ok := v.Object().(*types.Func) + if !ok { + return "" + } + return lint.FuncName(fn) + case *ssa.Builtin: + return v.Name() + } + return "" +} + +func IsCallTo(call *ssa.CallCommon, name string) bool { return CallName(call) == name } +func IsType(T types.Type, name string) bool { return types.TypeString(T, nil) == name } + +func FilterDebug(instr []ssa.Instruction) []ssa.Instruction { + var out []ssa.Instruction + for _, ins := range instr { + if _, ok := ins.(*ssa.DebugRef); !ok { + out = append(out, ins) + } + } + return out +} + +func IsExample(fn *ssa.Function) bool { + if !strings.HasPrefix(fn.Name(), "Example") { + return false + } + f := fn.Prog.Fset.File(fn.Pos()) + if f == nil { + return false + } + return strings.HasSuffix(f.Name(), "_test.go") +} + +func IsPointerLike(T types.Type) bool { + switch T := T.Underlying().(type) { + case *types.Interface, *types.Chan, *types.Map, *types.Signature, *types.Pointer: + return true + case *types.Basic: + return T.Kind() == types.UnsafePointer + } + return false +} + +func IsIdent(expr ast.Expr, ident string) bool { + id, ok := expr.(*ast.Ident) + return ok && id.Name == ident +} + +// isBlank returns whether id is the blank identifier "_". +// If id == nil, the answer is false. +func IsBlank(id ast.Expr) bool { + ident, _ := id.(*ast.Ident) + return ident != nil && ident.Name == "_" +} + +func IsIntLiteral(expr ast.Expr, literal string) bool { + lit, ok := expr.(*ast.BasicLit) + return ok && lit.Kind == token.INT && lit.Value == literal +} + +// Deprecated: use IsIntLiteral instead +func IsZero(expr ast.Expr) bool { + return IsIntLiteral(expr, "0") +} + +func IsOfType(pass *analysis.Pass, expr ast.Expr, name string) bool { + return IsType(pass.TypesInfo.TypeOf(expr), name) +} + +func IsInTest(pass *analysis.Pass, node lint.Positioner) bool { + // FIXME(dh): this doesn't work for global variables with + // initializers + f := pass.Fset.File(node.Pos()) + return f != nil && strings.HasSuffix(f.Name(), "_test.go") +} + +func IsInMain(pass *analysis.Pass, node lint.Positioner) bool { + if node, ok := node.(packager); ok { + return node.Package().Pkg.Name() == "main" + } + return pass.Pkg.Name() == "main" +} + +func SelectorName(pass *analysis.Pass, expr *ast.SelectorExpr) string { + info := pass.TypesInfo + sel := info.Selections[expr] + if sel == nil { + if x, ok := expr.X.(*ast.Ident); ok { + pkg, ok := info.ObjectOf(x).(*types.PkgName) + if !ok { + // This shouldn't happen + return fmt.Sprintf("%s.%s", x.Name, expr.Sel.Name) + } + return fmt.Sprintf("%s.%s", pkg.Imported().Path(), expr.Sel.Name) + } + panic(fmt.Sprintf("unsupported selector: %v", expr)) + } + return fmt.Sprintf("(%s).%s", sel.Recv(), sel.Obj().Name()) +} + +func IsNil(pass *analysis.Pass, expr ast.Expr) bool { + return pass.TypesInfo.Types[expr].IsNil() +} + +func BoolConst(pass *analysis.Pass, expr ast.Expr) bool { + val := pass.TypesInfo.ObjectOf(expr.(*ast.Ident)).(*types.Const).Val() + return constant.BoolVal(val) +} + +func IsBoolConst(pass *analysis.Pass, expr ast.Expr) bool { + // We explicitly don't support typed bools because more often than + // not, custom bool types are used as binary enums and the + // explicit comparison is desired. + + ident, ok := expr.(*ast.Ident) + if !ok { + return false + } + obj := pass.TypesInfo.ObjectOf(ident) + c, ok := obj.(*types.Const) + if !ok { + return false + } + basic, ok := c.Type().(*types.Basic) + if !ok { + return false + } + if basic.Kind() != types.UntypedBool && basic.Kind() != types.Bool { + return false + } + return true +} + +func ExprToInt(pass *analysis.Pass, expr ast.Expr) (int64, bool) { + tv := pass.TypesInfo.Types[expr] + if tv.Value == nil { + return 0, false + } + if tv.Value.Kind() != constant.Int { + return 0, false + } + return constant.Int64Val(tv.Value) +} + +func ExprToString(pass *analysis.Pass, expr ast.Expr) (string, bool) { + val := pass.TypesInfo.Types[expr].Value + if val == nil { + return "", false + } + if val.Kind() != constant.String { + return "", false + } + return constant.StringVal(val), true +} + +// Dereference returns a pointer's element type; otherwise it returns +// T. +func Dereference(T types.Type) types.Type { + if p, ok := T.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return T +} + +// DereferenceR returns a pointer's element type; otherwise it returns +// T. If the element type is itself a pointer, DereferenceR will be +// applied recursively. +func DereferenceR(T types.Type) types.Type { + if p, ok := T.Underlying().(*types.Pointer); ok { + return DereferenceR(p.Elem()) + } + return T +} + +func IsGoVersion(pass *analysis.Pass, minor int) bool { + version := pass.Analyzer.Flags.Lookup("go").Value.(flag.Getter).Get().(int) + return version >= minor +} + +func CallNameAST(pass *analysis.Pass, call *ast.CallExpr) string { + switch fun := call.Fun.(type) { + case *ast.SelectorExpr: + fn, ok := pass.TypesInfo.ObjectOf(fun.Sel).(*types.Func) + if !ok { + return "" + } + return lint.FuncName(fn) + case *ast.Ident: + obj := pass.TypesInfo.ObjectOf(fun) + switch obj := obj.(type) { + case *types.Func: + return lint.FuncName(obj) + case *types.Builtin: + return obj.Name() + default: + return "" + } + default: + return "" + } +} + +func IsCallToAST(pass *analysis.Pass, node ast.Node, name string) bool { + call, ok := node.(*ast.CallExpr) + if !ok { + return false + } + return CallNameAST(pass, call) == name +} + +func IsCallToAnyAST(pass *analysis.Pass, node ast.Node, names ...string) bool { + for _, name := range names { + if IsCallToAST(pass, node, name) { + return true + } + } + return false +} + +func Render(pass *analysis.Pass, x interface{}) string { + var buf bytes.Buffer + if err := printer.Fprint(&buf, pass.Fset, x); err != nil { + panic(err) + } + return buf.String() +} + +func RenderArgs(pass *analysis.Pass, args []ast.Expr) string { + var ss []string + for _, arg := range args { + ss = append(ss, Render(pass, arg)) + } + return strings.Join(ss, ", ") +} + +func Preamble(f *ast.File) string { + cutoff := f.Package + if f.Doc != nil { + cutoff = f.Doc.Pos() + } + var out []string + for _, cmt := range f.Comments { + if cmt.Pos() >= cutoff { + break + } + out = append(out, cmt.Text()) + } + return strings.Join(out, "\n") +} + +func Inspect(node ast.Node, fn func(node ast.Node) bool) { + if node == nil { + return + } + ast.Inspect(node, fn) +} + +func GroupSpecs(fset *token.FileSet, specs []ast.Spec) [][]ast.Spec { + if len(specs) == 0 { + return nil + } + groups := make([][]ast.Spec, 1) + groups[0] = append(groups[0], specs[0]) + + for _, spec := range specs[1:] { + g := groups[len(groups)-1] + if fset.PositionFor(spec.Pos(), false).Line-1 != + fset.PositionFor(g[len(g)-1].End(), false).Line { + + groups = append(groups, nil) + } + + groups[len(groups)-1] = append(groups[len(groups)-1], spec) + } + + return groups +} + +func IsObject(obj types.Object, name string) bool { + var path string + if pkg := obj.Pkg(); pkg != nil { + path = pkg.Path() + "." + } + return path+obj.Name() == name +} + +type Field struct { + Var *types.Var + Tag string + Path []int +} + +// FlattenFields recursively flattens T and embedded structs, +// returning a list of fields. If multiple fields with the same name +// exist, all will be returned. +func FlattenFields(T *types.Struct) []Field { + return flattenFields(T, nil, nil) +} + +func flattenFields(T *types.Struct, path []int, seen map[types.Type]bool) []Field { + if seen == nil { + seen = map[types.Type]bool{} + } + if seen[T] { + return nil + } + seen[T] = true + var out []Field + for i := 0; i < T.NumFields(); i++ { + field := T.Field(i) + tag := T.Tag(i) + np := append(path[:len(path):len(path)], i) + if field.Anonymous() { + if s, ok := Dereference(field.Type()).Underlying().(*types.Struct); ok { + out = append(out, flattenFields(s, np, seen)...) + } + } else { + out = append(out, Field{field, tag, np}) + } + } + return out +} + +func File(pass *analysis.Pass, node lint.Positioner) *ast.File { + pass.Fset.PositionFor(node.Pos(), true) + m := pass.ResultOf[facts.TokenFile].(map[*token.File]*ast.File) + return m[pass.Fset.File(node.Pos())] +} + +// IsGenerated reports whether pos is in a generated file, It ignores +// //line directives. +func IsGenerated(pass *analysis.Pass, pos token.Pos) bool { + _, ok := Generator(pass, pos) + return ok +} + +// Generator returns the generator that generated the file containing +// pos. It ignores //line directives. +func Generator(pass *analysis.Pass, pos token.Pos) (facts.Generator, bool) { + file := pass.Fset.PositionFor(pos, false).Filename + m := pass.ResultOf[facts.Generated].(map[string]facts.Generator) + g, ok := m[file] + return g, ok +} + +func ReportfFG(pass *analysis.Pass, pos token.Pos, f string, args ...interface{}) { + file := lint.DisplayPosition(pass.Fset, pos).Filename + m := pass.ResultOf[facts.Generated].(map[string]facts.Generator) + if _, ok := m[file]; ok { + return + } + pass.Reportf(pos, f, args...) +} + +func ReportNodef(pass *analysis.Pass, node ast.Node, format string, args ...interface{}) { + msg := fmt.Sprintf(format, args...) + pass.Report(analysis.Diagnostic{Pos: node.Pos(), End: node.End(), Message: msg}) +} + +func ReportNodefFG(pass *analysis.Pass, node ast.Node, format string, args ...interface{}) { + file := lint.DisplayPosition(pass.Fset, node.Pos()).Filename + m := pass.ResultOf[facts.Generated].(map[string]facts.Generator) + if _, ok := m[file]; ok { + return + } + ReportNodef(pass, node, format, args...) +} diff --git a/vendor/honnef.co/go/tools/lint/lintutil/format/format.go b/vendor/honnef.co/go/tools/lint/lintutil/format/format.go new file mode 100644 index 00000000..9385431f --- /dev/null +++ b/vendor/honnef.co/go/tools/lint/lintutil/format/format.go @@ -0,0 +1,135 @@ +// Package format provides formatters for linter problems. +package format + +import ( + "encoding/json" + "fmt" + "go/token" + "io" + "os" + "path/filepath" + "text/tabwriter" + + "honnef.co/go/tools/lint" +) + +func shortPath(path string) string { + cwd, err := os.Getwd() + if err != nil { + return path + } + if rel, err := filepath.Rel(cwd, path); err == nil && len(rel) < len(path) { + return rel + } + return path +} + +func relativePositionString(pos token.Position) string { + s := shortPath(pos.Filename) + if pos.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", pos.Line, pos.Column) + } + if s == "" { + s = "-" + } + return s +} + +type Statter interface { + Stats(total, errors, warnings int) +} + +type Formatter interface { + Format(p lint.Problem) +} + +type Text struct { + W io.Writer +} + +func (o Text) Format(p lint.Problem) { + fmt.Fprintf(o.W, "%v: %s\n", relativePositionString(p.Pos), p.String()) +} + +type JSON struct { + W io.Writer +} + +func severity(s lint.Severity) string { + switch s { + case lint.Error: + return "error" + case lint.Warning: + return "warning" + case lint.Ignored: + return "ignored" + } + return "" +} + +func (o JSON) Format(p lint.Problem) { + type location struct { + File string `json:"file"` + Line int `json:"line"` + Column int `json:"column"` + } + jp := struct { + Code string `json:"code"` + Severity string `json:"severity,omitempty"` + Location location `json:"location"` + End location `json:"end"` + Message string `json:"message"` + }{ + Code: p.Check, + Severity: severity(p.Severity), + Location: location{ + File: p.Pos.Filename, + Line: p.Pos.Line, + Column: p.Pos.Column, + }, + End: location{ + File: p.End.Filename, + Line: p.End.Line, + Column: p.End.Column, + }, + Message: p.Message, + } + _ = json.NewEncoder(o.W).Encode(jp) +} + +type Stylish struct { + W io.Writer + + prevFile string + tw *tabwriter.Writer +} + +func (o *Stylish) Format(p lint.Problem) { + pos := p.Pos + if pos.Filename == "" { + pos.Filename = "-" + } + + if pos.Filename != o.prevFile { + if o.prevFile != "" { + o.tw.Flush() + fmt.Fprintln(o.W) + } + fmt.Fprintln(o.W, pos.Filename) + o.prevFile = pos.Filename + o.tw = tabwriter.NewWriter(o.W, 0, 4, 2, ' ', 0) + } + fmt.Fprintf(o.tw, " (%d, %d)\t%s\t%s\n", pos.Line, pos.Column, p.Check, p.Message) +} + +func (o *Stylish) Stats(total, errors, warnings int) { + if o.tw != nil { + o.tw.Flush() + fmt.Fprintln(o.W) + } + fmt.Fprintf(o.W, " ✖ %d problems (%d errors, %d warnings)\n", + total, errors, warnings) +} diff --git a/vendor/honnef.co/go/tools/lint/lintutil/stats.go b/vendor/honnef.co/go/tools/lint/lintutil/stats.go new file mode 100644 index 00000000..ba8caf0a --- /dev/null +++ b/vendor/honnef.co/go/tools/lint/lintutil/stats.go @@ -0,0 +1,7 @@ +// +build !aix,!android,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris + +package lintutil + +import "os" + +var infoSignals = []os.Signal{} diff --git a/vendor/honnef.co/go/tools/lint/lintutil/stats_bsd.go b/vendor/honnef.co/go/tools/lint/lintutil/stats_bsd.go new file mode 100644 index 00000000..3a62ede0 --- /dev/null +++ b/vendor/honnef.co/go/tools/lint/lintutil/stats_bsd.go @@ -0,0 +1,10 @@ +// +build darwin dragonfly freebsd netbsd openbsd + +package lintutil + +import ( + "os" + "syscall" +) + +var infoSignals = []os.Signal{syscall.SIGINFO} diff --git a/vendor/honnef.co/go/tools/lint/lintutil/stats_posix.go b/vendor/honnef.co/go/tools/lint/lintutil/stats_posix.go new file mode 100644 index 00000000..53f21c66 --- /dev/null +++ b/vendor/honnef.co/go/tools/lint/lintutil/stats_posix.go @@ -0,0 +1,10 @@ +// +build aix android linux solaris + +package lintutil + +import ( + "os" + "syscall" +) + +var infoSignals = []os.Signal{syscall.SIGUSR1} diff --git a/vendor/honnef.co/go/tools/lint/lintutil/util.go b/vendor/honnef.co/go/tools/lint/lintutil/util.go new file mode 100644 index 00000000..fe0279f9 --- /dev/null +++ b/vendor/honnef.co/go/tools/lint/lintutil/util.go @@ -0,0 +1,392 @@ +// Copyright (c) 2013 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 or at +// https://developers.google.com/open-source/licenses/bsd. + +// Package lintutil provides helpers for writing linter command lines. +package lintutil // import "honnef.co/go/tools/lint/lintutil" + +import ( + "crypto/sha256" + "errors" + "flag" + "fmt" + "go/build" + "go/token" + "io" + "log" + "os" + "os/signal" + "regexp" + "runtime" + "runtime/pprof" + "strconv" + "strings" + "sync/atomic" + + "honnef.co/go/tools/config" + "honnef.co/go/tools/internal/cache" + "honnef.co/go/tools/lint" + "honnef.co/go/tools/lint/lintutil/format" + "honnef.co/go/tools/version" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/packages" +) + +func NewVersionFlag() flag.Getter { + tags := build.Default.ReleaseTags + v := tags[len(tags)-1][2:] + version := new(VersionFlag) + if err := version.Set(v); err != nil { + panic(fmt.Sprintf("internal error: %s", err)) + } + return version +} + +type VersionFlag int + +func (v *VersionFlag) String() string { + return fmt.Sprintf("1.%d", *v) + +} + +func (v *VersionFlag) Set(s string) error { + if len(s) < 3 { + return errors.New("invalid Go version") + } + if s[0] != '1' { + return errors.New("invalid Go version") + } + if s[1] != '.' { + return errors.New("invalid Go version") + } + i, err := strconv.Atoi(s[2:]) + *v = VersionFlag(i) + return err +} + +func (v *VersionFlag) Get() interface{} { + return int(*v) +} + +func usage(name string, flags *flag.FlagSet) func() { + return func() { + fmt.Fprintf(os.Stderr, "Usage of %s:\n", name) + fmt.Fprintf(os.Stderr, "\t%s [flags] # runs on package in current directory\n", name) + fmt.Fprintf(os.Stderr, "\t%s [flags] packages\n", name) + fmt.Fprintf(os.Stderr, "\t%s [flags] directory\n", name) + fmt.Fprintf(os.Stderr, "\t%s [flags] files... # must be a single package\n", name) + fmt.Fprintf(os.Stderr, "Flags:\n") + flags.PrintDefaults() + } +} + +type list []string + +func (list *list) String() string { + return `"` + strings.Join(*list, ",") + `"` +} + +func (list *list) Set(s string) error { + if s == "" { + *list = nil + return nil + } + + *list = strings.Split(s, ",") + return nil +} + +func FlagSet(name string) *flag.FlagSet { + flags := flag.NewFlagSet("", flag.ExitOnError) + flags.Usage = usage(name, flags) + flags.String("tags", "", "List of `build tags`") + flags.Bool("tests", true, "Include tests") + flags.Bool("version", false, "Print version and exit") + flags.Bool("show-ignored", false, "Don't filter ignored problems") + flags.String("f", "text", "Output `format` (valid choices are 'stylish', 'text' and 'json')") + flags.String("explain", "", "Print description of `check`") + + flags.String("debug.cpuprofile", "", "Write CPU profile to `file`") + flags.String("debug.memprofile", "", "Write memory profile to `file`") + flags.Bool("debug.version", false, "Print detailed version information about this program") + flags.Bool("debug.no-compile-errors", false, "Don't print compile errors") + + checks := list{"inherit"} + fail := list{"all"} + flags.Var(&checks, "checks", "Comma-separated list of `checks` to enable.") + flags.Var(&fail, "fail", "Comma-separated list of `checks` that can cause a non-zero exit status.") + + tags := build.Default.ReleaseTags + v := tags[len(tags)-1][2:] + version := new(VersionFlag) + if err := version.Set(v); err != nil { + panic(fmt.Sprintf("internal error: %s", err)) + } + + flags.Var(version, "go", "Target Go `version` in the format '1.x'") + return flags +} + +func findCheck(cs []*analysis.Analyzer, check string) (*analysis.Analyzer, bool) { + for _, c := range cs { + if c.Name == check { + return c, true + } + } + return nil, false +} + +func ProcessFlagSet(cs []*analysis.Analyzer, cums []lint.CumulativeChecker, fs *flag.FlagSet) { + tags := fs.Lookup("tags").Value.(flag.Getter).Get().(string) + tests := fs.Lookup("tests").Value.(flag.Getter).Get().(bool) + goVersion := fs.Lookup("go").Value.(flag.Getter).Get().(int) + formatter := fs.Lookup("f").Value.(flag.Getter).Get().(string) + printVersion := fs.Lookup("version").Value.(flag.Getter).Get().(bool) + showIgnored := fs.Lookup("show-ignored").Value.(flag.Getter).Get().(bool) + explain := fs.Lookup("explain").Value.(flag.Getter).Get().(string) + + cpuProfile := fs.Lookup("debug.cpuprofile").Value.(flag.Getter).Get().(string) + memProfile := fs.Lookup("debug.memprofile").Value.(flag.Getter).Get().(string) + debugVersion := fs.Lookup("debug.version").Value.(flag.Getter).Get().(bool) + debugNoCompile := fs.Lookup("debug.no-compile-errors").Value.(flag.Getter).Get().(bool) + + cfg := config.Config{} + cfg.Checks = *fs.Lookup("checks").Value.(*list) + + exit := func(code int) { + if cpuProfile != "" { + pprof.StopCPUProfile() + } + if memProfile != "" { + f, err := os.Create(memProfile) + if err != nil { + panic(err) + } + runtime.GC() + pprof.WriteHeapProfile(f) + } + os.Exit(code) + } + if cpuProfile != "" { + f, err := os.Create(cpuProfile) + if err != nil { + log.Fatal(err) + } + pprof.StartCPUProfile(f) + } + + if debugVersion { + version.Verbose() + exit(0) + } + + if printVersion { + version.Print() + exit(0) + } + + // Validate that the tags argument is well-formed. go/packages + // doesn't detect malformed build flags and returns unhelpful + // errors. + tf := buildutil.TagsFlag{} + if err := tf.Set(tags); err != nil { + fmt.Fprintln(os.Stderr, fmt.Errorf("invalid value %q for flag -tags: %s", tags, err)) + exit(1) + } + + if explain != "" { + var haystack []*analysis.Analyzer + haystack = append(haystack, cs...) + for _, cum := range cums { + haystack = append(haystack, cum.Analyzer()) + } + check, ok := findCheck(haystack, explain) + if !ok { + fmt.Fprintln(os.Stderr, "Couldn't find check", explain) + exit(1) + } + if check.Doc == "" { + fmt.Fprintln(os.Stderr, explain, "has no documentation") + exit(1) + } + fmt.Println(check.Doc) + exit(0) + } + + ps, err := Lint(cs, cums, fs.Args(), &Options{ + Tags: tags, + LintTests: tests, + GoVersion: goVersion, + Config: cfg, + }) + if err != nil { + fmt.Fprintln(os.Stderr, err) + exit(1) + } + + var f format.Formatter + switch formatter { + case "text": + f = format.Text{W: os.Stdout} + case "stylish": + f = &format.Stylish{W: os.Stdout} + case "json": + f = format.JSON{W: os.Stdout} + default: + fmt.Fprintf(os.Stderr, "unsupported output format %q\n", formatter) + exit(2) + } + + var ( + total int + errors int + warnings int + ) + + fail := *fs.Lookup("fail").Value.(*list) + analyzers := make([]*analysis.Analyzer, len(cs), len(cs)+len(cums)) + copy(analyzers, cs) + for _, cum := range cums { + analyzers = append(analyzers, cum.Analyzer()) + } + shouldExit := lint.FilterChecks(analyzers, fail) + shouldExit["compile"] = true + + total = len(ps) + for _, p := range ps { + if p.Check == "compile" && debugNoCompile { + continue + } + if p.Severity == lint.Ignored && !showIgnored { + continue + } + if shouldExit[p.Check] { + errors++ + } else { + p.Severity = lint.Warning + warnings++ + } + f.Format(p) + } + if f, ok := f.(format.Statter); ok { + f.Stats(total, errors, warnings) + } + if errors > 0 { + exit(1) + } + exit(0) +} + +type Options struct { + Config config.Config + + Tags string + LintTests bool + GoVersion int +} + +func computeSalt() ([]byte, error) { + if version.Version != "devel" { + return []byte(version.Version), nil + } + p, err := os.Executable() + if err != nil { + return nil, err + } + f, err := os.Open(p) + if err != nil { + return nil, err + } + defer f.Close() + h := sha256.New() + if _, err := io.Copy(h, f); err != nil { + return nil, err + } + return h.Sum(nil), nil +} + +func Lint(cs []*analysis.Analyzer, cums []lint.CumulativeChecker, paths []string, opt *Options) ([]lint.Problem, error) { + salt, err := computeSalt() + if err != nil { + return nil, fmt.Errorf("could not compute salt for cache: %s", err) + } + cache.SetSalt(salt) + + if opt == nil { + opt = &Options{} + } + + l := &lint.Linter{ + Checkers: cs, + CumulativeCheckers: cums, + GoVersion: opt.GoVersion, + Config: opt.Config, + } + cfg := &packages.Config{} + if opt.LintTests { + cfg.Tests = true + } + if opt.Tags != "" { + cfg.BuildFlags = append(cfg.BuildFlags, "-tags", opt.Tags) + } + + printStats := func() { + // Individual stats are read atomically, but overall there + // is no synchronisation. For printing rough progress + // information, this doesn't matter. + switch atomic.LoadUint32(&l.Stats.State) { + case lint.StateInitializing: + fmt.Fprintln(os.Stderr, "Status: initializing") + case lint.StateGraph: + fmt.Fprintln(os.Stderr, "Status: loading package graph") + case lint.StateProcessing: + fmt.Fprintf(os.Stderr, "Packages: %d/%d initial, %d/%d total; Workers: %d/%d; Problems: %d\n", + atomic.LoadUint32(&l.Stats.ProcessedInitialPackages), + atomic.LoadUint32(&l.Stats.InitialPackages), + atomic.LoadUint32(&l.Stats.ProcessedPackages), + atomic.LoadUint32(&l.Stats.TotalPackages), + atomic.LoadUint32(&l.Stats.ActiveWorkers), + atomic.LoadUint32(&l.Stats.TotalWorkers), + atomic.LoadUint32(&l.Stats.Problems), + ) + case lint.StateCumulative: + fmt.Fprintln(os.Stderr, "Status: processing cumulative checkers") + } + } + if len(infoSignals) > 0 { + ch := make(chan os.Signal, 1) + signal.Notify(ch, infoSignals...) + defer signal.Stop(ch) + go func() { + for range ch { + printStats() + } + }() + } + + return l.Lint(cfg, paths) +} + +var posRe = regexp.MustCompile(`^(.+?):(\d+)(?::(\d+)?)?$`) + +func parsePos(pos string) token.Position { + if pos == "-" || pos == "" { + return token.Position{} + } + parts := posRe.FindStringSubmatch(pos) + if parts == nil { + panic(fmt.Sprintf("internal error: malformed position %q", pos)) + } + file := parts[1] + line, _ := strconv.Atoi(parts[2]) + col, _ := strconv.Atoi(parts[3]) + return token.Position{ + Filename: file, + Line: line, + Column: col, + } +} diff --git a/vendor/honnef.co/go/tools/lint/runner.go b/vendor/honnef.co/go/tools/lint/runner.go new file mode 100644 index 00000000..3b22a63f --- /dev/null +++ b/vendor/honnef.co/go/tools/lint/runner.go @@ -0,0 +1,970 @@ +package lint + +/* +Parallelism + +Runner implements parallel processing of packages by spawning one +goroutine per package in the dependency graph, without any semaphores. +Each goroutine initially waits on the completion of all of its +dependencies, thus establishing correct order of processing. Once all +dependencies finish processing, the goroutine will load the package +from export data or source – this loading is guarded by a semaphore, +sized according to the number of CPU cores. This way, we only have as +many packages occupying memory and CPU resources as there are actual +cores to process them. + +This combination of unbounded goroutines but bounded package loading +means that if we have many parallel, independent subgraphs, they will +all execute in parallel, while not wasting resources for long linear +chains or trying to process more subgraphs in parallel than the system +can handle. + +*/ + +import ( + "bytes" + "encoding/gob" + "encoding/hex" + "fmt" + "go/ast" + "go/token" + "go/types" + "reflect" + "regexp" + "runtime" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/packages" + "golang.org/x/tools/go/types/objectpath" + "honnef.co/go/tools/config" + "honnef.co/go/tools/facts" + "honnef.co/go/tools/internal/cache" + "honnef.co/go/tools/loader" +) + +// If enabled, abuse of the go/analysis API will lead to panics +const sanityCheck = true + +// OPT(dh): for a dependency tree A->B->C->D, if we have cached data +// for B, there should be no need to load C and D individually. Go's +// export data for B contains all the data we need on types, and our +// fact cache could store the union of B, C and D in B. +// +// This may change unused's behavior, however, as it may observe fewer +// interfaces from transitive dependencies. + +type Package struct { + dependents uint64 + + *packages.Package + Imports []*Package + initial bool + fromSource bool + hash string + done chan struct{} + + resultsMu sync.Mutex + // results maps analyzer IDs to analyzer results + results []*result + + cfg *config.Config + gen map[string]facts.Generator + problems []Problem + ignores []Ignore + errs []error + + // these slices are indexed by analysis + facts []map[types.Object][]analysis.Fact + pkgFacts [][]analysis.Fact + + canClearTypes bool +} + +func (pkg *Package) decUse() { + atomic.AddUint64(&pkg.dependents, ^uint64(0)) + if atomic.LoadUint64(&pkg.dependents) == 0 { + // nobody depends on this package anymore + if pkg.canClearTypes { + pkg.Types = nil + } + pkg.facts = nil + pkg.pkgFacts = nil + + for _, imp := range pkg.Imports { + imp.decUse() + } + } +} + +type result struct { + v interface{} + err error + ready chan struct{} +} + +type Runner struct { + ld loader.Loader + cache *cache.Cache + + analyzerIDs analyzerIDs + + // limits parallelism of loading packages + loadSem chan struct{} + + goVersion int + stats *Stats +} + +type analyzerIDs struct { + m map[*analysis.Analyzer]int +} + +func (ids analyzerIDs) get(a *analysis.Analyzer) int { + id, ok := ids.m[a] + if !ok { + panic(fmt.Sprintf("no analyzer ID for %s", a.Name)) + } + return id +} + +type Fact struct { + Path string + Fact analysis.Fact +} + +type analysisAction struct { + analyzer *analysis.Analyzer + analyzerID int + pkg *Package + newPackageFacts []analysis.Fact + problems []Problem + + pkgFacts map[*types.Package][]analysis.Fact +} + +func (ac *analysisAction) String() string { + return fmt.Sprintf("%s @ %s", ac.analyzer, ac.pkg) +} + +func (ac *analysisAction) allObjectFacts() []analysis.ObjectFact { + out := make([]analysis.ObjectFact, 0, len(ac.pkg.facts[ac.analyzerID])) + for obj, facts := range ac.pkg.facts[ac.analyzerID] { + for _, fact := range facts { + out = append(out, analysis.ObjectFact{ + Object: obj, + Fact: fact, + }) + } + } + return out +} + +func (ac *analysisAction) allPackageFacts() []analysis.PackageFact { + out := make([]analysis.PackageFact, 0, len(ac.pkgFacts)) + for pkg, facts := range ac.pkgFacts { + for _, fact := range facts { + out = append(out, analysis.PackageFact{ + Package: pkg, + Fact: fact, + }) + } + } + return out +} + +func (ac *analysisAction) importObjectFact(obj types.Object, fact analysis.Fact) bool { + if sanityCheck && len(ac.analyzer.FactTypes) == 0 { + panic("analysis doesn't export any facts") + } + for _, f := range ac.pkg.facts[ac.analyzerID][obj] { + if reflect.TypeOf(f) == reflect.TypeOf(fact) { + reflect.ValueOf(fact).Elem().Set(reflect.ValueOf(f).Elem()) + return true + } + } + return false +} + +func (ac *analysisAction) importPackageFact(pkg *types.Package, fact analysis.Fact) bool { + if sanityCheck && len(ac.analyzer.FactTypes) == 0 { + panic("analysis doesn't export any facts") + } + for _, f := range ac.pkgFacts[pkg] { + if reflect.TypeOf(f) == reflect.TypeOf(fact) { + reflect.ValueOf(fact).Elem().Set(reflect.ValueOf(f).Elem()) + return true + } + } + return false +} + +func (ac *analysisAction) exportObjectFact(obj types.Object, fact analysis.Fact) { + if sanityCheck && len(ac.analyzer.FactTypes) == 0 { + panic("analysis doesn't export any facts") + } + ac.pkg.facts[ac.analyzerID][obj] = append(ac.pkg.facts[ac.analyzerID][obj], fact) +} + +func (ac *analysisAction) exportPackageFact(fact analysis.Fact) { + if sanityCheck && len(ac.analyzer.FactTypes) == 0 { + panic("analysis doesn't export any facts") + } + ac.pkgFacts[ac.pkg.Types] = append(ac.pkgFacts[ac.pkg.Types], fact) + ac.newPackageFacts = append(ac.newPackageFacts, fact) +} + +func (ac *analysisAction) report(pass *analysis.Pass, d analysis.Diagnostic) { + p := Problem{ + Pos: DisplayPosition(pass.Fset, d.Pos), + End: DisplayPosition(pass.Fset, d.End), + Message: d.Message, + Check: pass.Analyzer.Name, + } + ac.problems = append(ac.problems, p) +} + +func (r *Runner) runAnalysis(ac *analysisAction) (ret interface{}, err error) { + ac.pkg.resultsMu.Lock() + res := ac.pkg.results[r.analyzerIDs.get(ac.analyzer)] + if res != nil { + ac.pkg.resultsMu.Unlock() + <-res.ready + return res.v, res.err + } else { + res = &result{ + ready: make(chan struct{}), + } + ac.pkg.results[r.analyzerIDs.get(ac.analyzer)] = res + ac.pkg.resultsMu.Unlock() + + defer func() { + res.v = ret + res.err = err + close(res.ready) + }() + + pass := new(analysis.Pass) + *pass = analysis.Pass{ + Analyzer: ac.analyzer, + Fset: ac.pkg.Fset, + Files: ac.pkg.Syntax, + // type information may be nil or may be populated. if it is + // nil, it will get populated later. + Pkg: ac.pkg.Types, + TypesInfo: ac.pkg.TypesInfo, + TypesSizes: ac.pkg.TypesSizes, + ResultOf: map[*analysis.Analyzer]interface{}{}, + ImportObjectFact: ac.importObjectFact, + ImportPackageFact: ac.importPackageFact, + ExportObjectFact: ac.exportObjectFact, + ExportPackageFact: ac.exportPackageFact, + Report: func(d analysis.Diagnostic) { + ac.report(pass, d) + }, + AllObjectFacts: ac.allObjectFacts, + AllPackageFacts: ac.allPackageFacts, + } + + if !ac.pkg.initial { + // Don't report problems in dependencies + pass.Report = func(analysis.Diagnostic) {} + } + return r.runAnalysisUser(pass, ac) + } +} + +func (r *Runner) loadCachedFacts(a *analysis.Analyzer, pkg *Package) ([]Fact, bool) { + if len(a.FactTypes) == 0 { + return nil, true + } + + var facts []Fact + // Look in the cache for facts + aID, err := passActionID(pkg, a) + if err != nil { + return nil, false + } + aID = cache.Subkey(aID, "facts") + b, _, err := r.cache.GetBytes(aID) + if err != nil { + // No cached facts, analyse this package like a user-provided one, but ignore diagnostics + return nil, false + } + + if err := gob.NewDecoder(bytes.NewReader(b)).Decode(&facts); err != nil { + // Cached facts are broken, analyse this package like a user-provided one, but ignore diagnostics + return nil, false + } + return facts, true +} + +type dependencyError struct { + dep string + err error +} + +func (err dependencyError) nested() dependencyError { + if o, ok := err.err.(dependencyError); ok { + return o.nested() + } + return err +} + +func (err dependencyError) Error() string { + if o, ok := err.err.(dependencyError); ok { + return o.Error() + } + return fmt.Sprintf("error running dependency %s: %s", err.dep, err.err) +} + +func (r *Runner) makeAnalysisAction(a *analysis.Analyzer, pkg *Package) *analysisAction { + aid := r.analyzerIDs.get(a) + ac := &analysisAction{ + analyzer: a, + analyzerID: aid, + pkg: pkg, + } + + if len(a.FactTypes) == 0 { + return ac + } + + // Merge all package facts of dependencies + ac.pkgFacts = map[*types.Package][]analysis.Fact{} + seen := map[*Package]struct{}{} + var dfs func(*Package) + dfs = func(pkg *Package) { + if _, ok := seen[pkg]; ok { + return + } + seen[pkg] = struct{}{} + s := pkg.pkgFacts[aid] + ac.pkgFacts[pkg.Types] = s[0:len(s):len(s)] + for _, imp := range pkg.Imports { + dfs(imp) + } + } + dfs(pkg) + + return ac +} + +// analyzes that we always want to run, even if they're not being run +// explicitly or as dependencies. these are necessary for the inner +// workings of the runner. +var injectedAnalyses = []*analysis.Analyzer{facts.Generated, config.Analyzer} + +func (r *Runner) runAnalysisUser(pass *analysis.Pass, ac *analysisAction) (interface{}, error) { + if !ac.pkg.fromSource { + panic(fmt.Sprintf("internal error: %s was not loaded from source", ac.pkg)) + } + + // User-provided package, analyse it + // First analyze it with dependencies + for _, req := range ac.analyzer.Requires { + acReq := r.makeAnalysisAction(req, ac.pkg) + ret, err := r.runAnalysis(acReq) + if err != nil { + // We couldn't run a dependency, no point in going on + return nil, dependencyError{req.Name, err} + } + + pass.ResultOf[req] = ret + } + + // Then with this analyzer + ret, err := ac.analyzer.Run(pass) + if err != nil { + return nil, err + } + + if len(ac.analyzer.FactTypes) > 0 { + // Merge new facts into the package and persist them. + var facts []Fact + for _, fact := range ac.newPackageFacts { + id := r.analyzerIDs.get(ac.analyzer) + ac.pkg.pkgFacts[id] = append(ac.pkg.pkgFacts[id], fact) + facts = append(facts, Fact{"", fact}) + } + for obj, afacts := range ac.pkg.facts[ac.analyzerID] { + if obj.Pkg() != ac.pkg.Package.Types { + continue + } + path, err := objectpath.For(obj) + if err != nil { + continue + } + for _, fact := range afacts { + facts = append(facts, Fact{string(path), fact}) + } + } + + buf := &bytes.Buffer{} + if err := gob.NewEncoder(buf).Encode(facts); err != nil { + return nil, err + } + aID, err := passActionID(ac.pkg, ac.analyzer) + if err != nil { + return nil, err + } + aID = cache.Subkey(aID, "facts") + if err := r.cache.PutBytes(aID, buf.Bytes()); err != nil { + return nil, err + } + } + + return ret, nil +} + +func NewRunner(stats *Stats) (*Runner, error) { + cache, err := cache.Default() + if err != nil { + return nil, err + } + + return &Runner{ + cache: cache, + stats: stats, + }, nil +} + +// Run loads packages corresponding to patterns and analyses them with +// analyzers. It returns the loaded packages, which contain reported +// diagnostics as well as extracted ignore directives. +// +// Note that diagnostics have not been filtered at this point yet, to +// accomodate cumulative analyzes that require additional steps to +// produce diagnostics. +func (r *Runner) Run(cfg *packages.Config, patterns []string, analyzers []*analysis.Analyzer, hasCumulative bool) ([]*Package, error) { + r.analyzerIDs = analyzerIDs{m: map[*analysis.Analyzer]int{}} + id := 0 + seen := map[*analysis.Analyzer]struct{}{} + var dfs func(a *analysis.Analyzer) + dfs = func(a *analysis.Analyzer) { + if _, ok := seen[a]; ok { + return + } + seen[a] = struct{}{} + r.analyzerIDs.m[a] = id + id++ + for _, f := range a.FactTypes { + gob.Register(f) + } + for _, req := range a.Requires { + dfs(req) + } + } + for _, a := range analyzers { + if v := a.Flags.Lookup("go"); v != nil { + v.Value.Set(fmt.Sprintf("1.%d", r.goVersion)) + } + dfs(a) + } + for _, a := range injectedAnalyses { + dfs(a) + } + + var dcfg packages.Config + if cfg != nil { + dcfg = *cfg + } + + atomic.StoreUint32(&r.stats.State, StateGraph) + initialPkgs, err := r.ld.Graph(dcfg, patterns...) + if err != nil { + return nil, err + } + + defer r.cache.Trim() + + var allPkgs []*Package + m := map[*packages.Package]*Package{} + packages.Visit(initialPkgs, nil, func(l *packages.Package) { + m[l] = &Package{ + Package: l, + results: make([]*result, len(r.analyzerIDs.m)), + facts: make([]map[types.Object][]analysis.Fact, len(r.analyzerIDs.m)), + pkgFacts: make([][]analysis.Fact, len(r.analyzerIDs.m)), + done: make(chan struct{}), + // every package needs itself + dependents: 1, + canClearTypes: !hasCumulative, + } + allPkgs = append(allPkgs, m[l]) + for i := range m[l].facts { + m[l].facts[i] = map[types.Object][]analysis.Fact{} + } + for _, err := range l.Errors { + m[l].errs = append(m[l].errs, err) + } + for _, v := range l.Imports { + m[v].dependents++ + m[l].Imports = append(m[l].Imports, m[v]) + } + + m[l].hash, err = packageHash(m[l]) + if err != nil { + m[l].errs = append(m[l].errs, err) + } + }) + + pkgs := make([]*Package, len(initialPkgs)) + for i, l := range initialPkgs { + pkgs[i] = m[l] + pkgs[i].initial = true + } + + atomic.StoreUint32(&r.stats.InitialPackages, uint32(len(initialPkgs))) + atomic.StoreUint32(&r.stats.TotalPackages, uint32(len(allPkgs))) + atomic.StoreUint32(&r.stats.State, StateProcessing) + + var wg sync.WaitGroup + wg.Add(len(allPkgs)) + r.loadSem = make(chan struct{}, runtime.GOMAXPROCS(-1)) + atomic.StoreUint32(&r.stats.TotalWorkers, uint32(cap(r.loadSem))) + for _, pkg := range allPkgs { + pkg := pkg + go func() { + r.processPkg(pkg, analyzers) + + if pkg.initial { + atomic.AddUint32(&r.stats.ProcessedInitialPackages, 1) + } + atomic.AddUint32(&r.stats.Problems, uint32(len(pkg.problems))) + wg.Done() + }() + } + wg.Wait() + + return pkgs, nil +} + +var posRe = regexp.MustCompile(`^(.+?):(\d+)(?::(\d+)?)?`) + +func parsePos(pos string) (token.Position, int, error) { + if pos == "-" || pos == "" { + return token.Position{}, 0, nil + } + parts := posRe.FindStringSubmatch(pos) + if parts == nil { + return token.Position{}, 0, fmt.Errorf("malformed position %q", pos) + } + file := parts[1] + line, _ := strconv.Atoi(parts[2]) + col, _ := strconv.Atoi(parts[3]) + return token.Position{ + Filename: file, + Line: line, + Column: col, + }, len(parts[0]), nil +} + +// loadPkg loads a Go package. If the package is in the set of initial +// packages, it will be loaded from source, otherwise it will be +// loaded from export data. In the case that the package was loaded +// from export data, cached facts will also be loaded. +// +// Currently, only cached facts for this package will be loaded, not +// for any of its dependencies. +func (r *Runner) loadPkg(pkg *Package, analyzers []*analysis.Analyzer) error { + if pkg.Types != nil { + panic(fmt.Sprintf("internal error: %s has already been loaded", pkg.Package)) + } + + // Load type information + if pkg.initial { + // Load package from source + pkg.fromSource = true + return r.ld.LoadFromSource(pkg.Package) + } + + // Load package from export data + if err := r.ld.LoadFromExport(pkg.Package); err != nil { + // We asked Go to give us up to date export data, yet + // we can't load it. There must be something wrong. + // + // Attempt loading from source. This should fail (because + // otherwise there would be export data); we just want to + // get the compile errors. If loading from source succeeds + // we discard the result, anyway. Otherwise we'll fail + // when trying to reload from export data later. + // + // FIXME(dh): we no longer reload from export data, so + // theoretically we should be able to continue + pkg.fromSource = true + if err := r.ld.LoadFromSource(pkg.Package); err != nil { + return err + } + // Make sure this package can't be imported successfully + pkg.Package.Errors = append(pkg.Package.Errors, packages.Error{ + Pos: "-", + Msg: fmt.Sprintf("could not load export data: %s", err), + Kind: packages.ParseError, + }) + return fmt.Errorf("could not load export data: %s", err) + } + + failed := false + seen := make([]bool, len(r.analyzerIDs.m)) + var dfs func(*analysis.Analyzer) + dfs = func(a *analysis.Analyzer) { + if seen[r.analyzerIDs.get(a)] { + return + } + seen[r.analyzerIDs.get(a)] = true + + if len(a.FactTypes) > 0 { + facts, ok := r.loadCachedFacts(a, pkg) + if !ok { + failed = true + return + } + + for _, f := range facts { + if f.Path == "" { + // This is a package fact + pkg.pkgFacts[r.analyzerIDs.get(a)] = append(pkg.pkgFacts[r.analyzerIDs.get(a)], f.Fact) + continue + } + obj, err := objectpath.Object(pkg.Types, objectpath.Path(f.Path)) + if err != nil { + // Be lenient about these errors. For example, when + // analysing io/ioutil from source, we may get a fact + // for methods on the devNull type, and objectpath + // will happily create a path for them. However, when + // we later load io/ioutil from export data, the path + // no longer resolves. + // + // If an exported type embeds the unexported type, + // then (part of) the unexported type will become part + // of the type information and our path will resolve + // again. + continue + } + pkg.facts[r.analyzerIDs.get(a)][obj] = append(pkg.facts[r.analyzerIDs.get(a)][obj], f.Fact) + } + } + + for _, req := range a.Requires { + dfs(req) + } + } + for _, a := range analyzers { + dfs(a) + } + + if failed { + pkg.fromSource = true + // XXX we added facts to the maps, we need to get rid of those + return r.ld.LoadFromSource(pkg.Package) + } + + return nil +} + +type analysisError struct { + analyzer *analysis.Analyzer + pkg *Package + err error +} + +func (err analysisError) Error() string { + return fmt.Sprintf("error running analyzer %s on %s: %s", err.analyzer, err.pkg, err.err) +} + +// processPkg processes a package. This involves loading the package, +// either from export data or from source. For packages loaded from +// source, the provides analyzers will be run on the package. +func (r *Runner) processPkg(pkg *Package, analyzers []*analysis.Analyzer) { + defer func() { + // Clear information we no longer need. Make sure to do this + // when returning from processPkg so that we clear + // dependencies, not just initial packages. + pkg.TypesInfo = nil + pkg.Syntax = nil + pkg.results = nil + + atomic.AddUint32(&r.stats.ProcessedPackages, 1) + pkg.decUse() + close(pkg.done) + }() + + // Ensure all packages have the generated map and config. This is + // required by interna of the runner. Analyses that themselves + // make use of either have an explicit dependency so that other + // runners work correctly, too. + analyzers = append(analyzers[0:len(analyzers):len(analyzers)], injectedAnalyses...) + + if len(pkg.errs) != 0 { + return + } + + for _, imp := range pkg.Imports { + <-imp.done + if len(imp.errs) > 0 { + if imp.initial { + // Don't print the error of the dependency since it's + // an initial package and we're already printing the + // error. + pkg.errs = append(pkg.errs, fmt.Errorf("could not analyze dependency %s of %s", imp, pkg)) + } else { + var s string + for _, err := range imp.errs { + s += "\n\t" + err.Error() + } + pkg.errs = append(pkg.errs, fmt.Errorf("could not analyze dependency %s of %s: %s", imp, pkg, s)) + } + return + } + } + if pkg.PkgPath == "unsafe" { + pkg.Types = types.Unsafe + return + } + + r.loadSem <- struct{}{} + atomic.AddUint32(&r.stats.ActiveWorkers, 1) + defer func() { + <-r.loadSem + atomic.AddUint32(&r.stats.ActiveWorkers, ^uint32(0)) + }() + if err := r.loadPkg(pkg, analyzers); err != nil { + pkg.errs = append(pkg.errs, err) + return + } + + // A package's object facts is the union of all of its dependencies. + for _, imp := range pkg.Imports { + for ai, m := range imp.facts { + for obj, facts := range m { + pkg.facts[ai][obj] = facts[0:len(facts):len(facts)] + } + } + } + + if !pkg.fromSource { + // Nothing left to do for the package. + return + } + + // Run analyses on initial packages and those missing facts + var wg sync.WaitGroup + wg.Add(len(analyzers)) + errs := make([]error, len(analyzers)) + var acs []*analysisAction + for i, a := range analyzers { + i := i + a := a + ac := r.makeAnalysisAction(a, pkg) + acs = append(acs, ac) + go func() { + defer wg.Done() + // Only initial packages and packages with missing + // facts will have been loaded from source. + if pkg.initial || r.hasFacts(a) { + if _, err := r.runAnalysis(ac); err != nil { + errs[i] = analysisError{a, pkg, err} + return + } + } + }() + } + wg.Wait() + + depErrors := map[dependencyError]int{} + for _, err := range errs { + if err == nil { + continue + } + switch err := err.(type) { + case analysisError: + switch err := err.err.(type) { + case dependencyError: + depErrors[err.nested()]++ + default: + pkg.errs = append(pkg.errs, err) + } + default: + pkg.errs = append(pkg.errs, err) + } + } + for err, count := range depErrors { + pkg.errs = append(pkg.errs, + fmt.Errorf("could not run %s@%s, preventing %d analyzers from running: %s", err.dep, pkg, count, err.err)) + } + + // We can't process ignores at this point because `unused` needs + // to see more than one package to make its decision. + ignores, problems := parseDirectives(pkg.Package) + pkg.ignores = append(pkg.ignores, ignores...) + pkg.problems = append(pkg.problems, problems...) + for _, ac := range acs { + pkg.problems = append(pkg.problems, ac.problems...) + } + + if pkg.initial { + // Only initial packages have these analyzers run, and only + // initial packages need these. + if pkg.results[r.analyzerIDs.get(config.Analyzer)].v != nil { + pkg.cfg = pkg.results[r.analyzerIDs.get(config.Analyzer)].v.(*config.Config) + } + pkg.gen = pkg.results[r.analyzerIDs.get(facts.Generated)].v.(map[string]facts.Generator) + } + + // In a previous version of the code, we would throw away all type + // information and reload it from export data. That was + // nonsensical. The *types.Package doesn't keep any information + // live that export data wouldn't also. We only need to discard + // the AST and the TypesInfo maps; that happens after we return + // from processPkg. +} + +// hasFacts reports whether an analysis exports any facts. An analysis +// that has a transitive dependency that exports facts is considered +// to be exporting facts. +func (r *Runner) hasFacts(a *analysis.Analyzer) bool { + ret := false + seen := make([]bool, len(r.analyzerIDs.m)) + var dfs func(*analysis.Analyzer) + dfs = func(a *analysis.Analyzer) { + if seen[r.analyzerIDs.get(a)] { + return + } + seen[r.analyzerIDs.get(a)] = true + if len(a.FactTypes) > 0 { + ret = true + } + for _, req := range a.Requires { + if ret { + break + } + dfs(req) + } + } + dfs(a) + return ret +} + +func parseDirective(s string) (cmd string, args []string) { + if !strings.HasPrefix(s, "//lint:") { + return "", nil + } + s = strings.TrimPrefix(s, "//lint:") + fields := strings.Split(s, " ") + return fields[0], fields[1:] +} + +// parseDirectives extracts all linter directives from the source +// files of the package. Malformed directives are returned as problems. +func parseDirectives(pkg *packages.Package) ([]Ignore, []Problem) { + var ignores []Ignore + var problems []Problem + + for _, f := range pkg.Syntax { + found := false + commentLoop: + for _, cg := range f.Comments { + for _, c := range cg.List { + if strings.Contains(c.Text, "//lint:") { + found = true + break commentLoop + } + } + } + if !found { + continue + } + cm := ast.NewCommentMap(pkg.Fset, f, f.Comments) + for node, cgs := range cm { + for _, cg := range cgs { + for _, c := range cg.List { + if !strings.HasPrefix(c.Text, "//lint:") { + continue + } + cmd, args := parseDirective(c.Text) + switch cmd { + case "ignore", "file-ignore": + if len(args) < 2 { + p := Problem{ + Pos: DisplayPosition(pkg.Fset, c.Pos()), + Message: "malformed linter directive; missing the required reason field?", + Severity: Error, + Check: "compile", + } + problems = append(problems, p) + continue + } + default: + // unknown directive, ignore + continue + } + checks := strings.Split(args[0], ",") + pos := DisplayPosition(pkg.Fset, node.Pos()) + var ig Ignore + switch cmd { + case "ignore": + ig = &LineIgnore{ + File: pos.Filename, + Line: pos.Line, + Checks: checks, + Pos: c.Pos(), + } + case "file-ignore": + ig = &FileIgnore{ + File: pos.Filename, + Checks: checks, + } + } + ignores = append(ignores, ig) + } + } + } + } + + return ignores, problems +} + +// packageHash computes a package's hash. The hash is based on all Go +// files that make up the package, as well as the hashes of imported +// packages. +func packageHash(pkg *Package) (string, error) { + key := cache.NewHash("package hash") + fmt.Fprintf(key, "pkgpath %s\n", pkg.PkgPath) + for _, f := range pkg.CompiledGoFiles { + h, err := cache.FileHash(f) + if err != nil { + return "", err + } + fmt.Fprintf(key, "file %s %x\n", f, h) + } + + imps := make([]*Package, len(pkg.Imports)) + copy(imps, pkg.Imports) + sort.Slice(imps, func(i, j int) bool { + return imps[i].PkgPath < imps[j].PkgPath + }) + for _, dep := range imps { + if dep.PkgPath == "unsafe" { + continue + } + + fmt.Fprintf(key, "import %s %s\n", dep.PkgPath, dep.hash) + } + h := key.Sum() + return hex.EncodeToString(h[:]), nil +} + +// passActionID computes an ActionID for an analysis pass. +func passActionID(pkg *Package, analyzer *analysis.Analyzer) (cache.ActionID, error) { + key := cache.NewHash("action ID") + fmt.Fprintf(key, "pkgpath %s\n", pkg.PkgPath) + fmt.Fprintf(key, "pkghash %s\n", pkg.hash) + fmt.Fprintf(key, "analyzer %s\n", analyzer.Name) + + return key.Sum(), nil +} diff --git a/vendor/honnef.co/go/tools/lint/stats.go b/vendor/honnef.co/go/tools/lint/stats.go new file mode 100644 index 00000000..2f650855 --- /dev/null +++ b/vendor/honnef.co/go/tools/lint/stats.go @@ -0,0 +1,20 @@ +package lint + +const ( + StateInitializing = 0 + StateGraph = 1 + StateProcessing = 2 + StateCumulative = 3 +) + +type Stats struct { + State uint32 + + InitialPackages uint32 + TotalPackages uint32 + ProcessedPackages uint32 + ProcessedInitialPackages uint32 + Problems uint32 + ActiveWorkers uint32 + TotalWorkers uint32 +} diff --git a/vendor/honnef.co/go/tools/loader/loader.go b/vendor/honnef.co/go/tools/loader/loader.go new file mode 100644 index 00000000..9c6885d4 --- /dev/null +++ b/vendor/honnef.co/go/tools/loader/loader.go @@ -0,0 +1,197 @@ +package loader + +import ( + "fmt" + "go/ast" + "go/parser" + "go/scanner" + "go/token" + "go/types" + "log" + "os" + "sync" + + "golang.org/x/tools/go/gcexportdata" + "golang.org/x/tools/go/packages" +) + +type Loader struct { + exportMu sync.RWMutex +} + +// Graph resolves patterns and returns packages with all the +// information required to later load type information, and optionally +// syntax trees. +// +// The provided config can set any setting with the exception of Mode. +func (ld *Loader) Graph(cfg packages.Config, patterns ...string) ([]*packages.Package, error) { + cfg.Mode = packages.NeedName | packages.NeedImports | packages.NeedDeps | packages.NeedExportsFile | packages.NeedFiles | packages.NeedCompiledGoFiles | packages.NeedTypesSizes + pkgs, err := packages.Load(&cfg, patterns...) + if err != nil { + return nil, err + } + fset := token.NewFileSet() + packages.Visit(pkgs, nil, func(pkg *packages.Package) { + pkg.Fset = fset + }) + return pkgs, nil +} + +// LoadFromExport loads a package from export data. All of its +// dependencies must have been loaded already. +func (ld *Loader) LoadFromExport(pkg *packages.Package) error { + ld.exportMu.Lock() + defer ld.exportMu.Unlock() + + pkg.IllTyped = true + for path, pkg := range pkg.Imports { + if pkg.Types == nil { + return fmt.Errorf("dependency %q hasn't been loaded yet", path) + } + } + if pkg.ExportFile == "" { + return fmt.Errorf("no export data for %q", pkg.ID) + } + f, err := os.Open(pkg.ExportFile) + if err != nil { + return err + } + defer f.Close() + + r, err := gcexportdata.NewReader(f) + if err != nil { + return err + } + + view := make(map[string]*types.Package) // view seen by gcexportdata + seen := make(map[*packages.Package]bool) // all visited packages + var visit func(pkgs map[string]*packages.Package) + visit = func(pkgs map[string]*packages.Package) { + for _, pkg := range pkgs { + if !seen[pkg] { + seen[pkg] = true + view[pkg.PkgPath] = pkg.Types + visit(pkg.Imports) + } + } + } + visit(pkg.Imports) + tpkg, err := gcexportdata.Read(r, pkg.Fset, view, pkg.PkgPath) + if err != nil { + return err + } + pkg.Types = tpkg + pkg.IllTyped = false + return nil +} + +// LoadFromSource loads a package from source. All of its dependencies +// must have been loaded already. +func (ld *Loader) LoadFromSource(pkg *packages.Package) error { + ld.exportMu.RLock() + defer ld.exportMu.RUnlock() + + pkg.IllTyped = true + pkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name) + + // OPT(dh): many packages have few files, much fewer than there + // are CPU cores. Additionally, parsing each individual file is + // very fast. A naive parallel implementation of this loop won't + // be faster, and tends to be slower due to extra scheduling, + // bookkeeping and potentially false sharing of cache lines. + pkg.Syntax = make([]*ast.File, len(pkg.CompiledGoFiles)) + for i, file := range pkg.CompiledGoFiles { + f, err := parser.ParseFile(pkg.Fset, file, nil, parser.ParseComments) + if err != nil { + pkg.Errors = append(pkg.Errors, convertError(err)...) + return err + } + pkg.Syntax[i] = f + } + pkg.TypesInfo = &types.Info{ + Types: make(map[ast.Expr]types.TypeAndValue), + Defs: make(map[*ast.Ident]types.Object), + Uses: make(map[*ast.Ident]types.Object), + Implicits: make(map[ast.Node]types.Object), + Scopes: make(map[ast.Node]*types.Scope), + Selections: make(map[*ast.SelectorExpr]*types.Selection), + } + + importer := func(path string) (*types.Package, error) { + if path == "unsafe" { + return types.Unsafe, nil + } + imp := pkg.Imports[path] + if imp == nil { + return nil, nil + } + if len(imp.Errors) > 0 { + return nil, imp.Errors[0] + } + return imp.Types, nil + } + tc := &types.Config{ + Importer: importerFunc(importer), + Error: func(err error) { + pkg.Errors = append(pkg.Errors, convertError(err)...) + }, + } + err := types.NewChecker(tc, pkg.Fset, pkg.Types, pkg.TypesInfo).Files(pkg.Syntax) + if err != nil { + return err + } + pkg.IllTyped = false + return nil +} + +func convertError(err error) []packages.Error { + var errs []packages.Error + // taken from go/packages + switch err := err.(type) { + case packages.Error: + // from driver + errs = append(errs, err) + + case *os.PathError: + // from parser + errs = append(errs, packages.Error{ + Pos: err.Path + ":1", + Msg: err.Err.Error(), + Kind: packages.ParseError, + }) + + case scanner.ErrorList: + // from parser + for _, err := range err { + errs = append(errs, packages.Error{ + Pos: err.Pos.String(), + Msg: err.Msg, + Kind: packages.ParseError, + }) + } + + case types.Error: + // from type checker + errs = append(errs, packages.Error{ + Pos: err.Fset.Position(err.Pos).String(), + Msg: err.Msg, + Kind: packages.TypeError, + }) + + default: + // unexpected impoverished error from parser? + errs = append(errs, packages.Error{ + Pos: "-", + Msg: err.Error(), + Kind: packages.UnknownError, + }) + + // If you see this error message, please file a bug. + log.Printf("internal error: error %q (%T) without position", err, err) + } + return errs +} + +type importerFunc func(path string) (*types.Package, error) + +func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) } diff --git a/vendor/honnef.co/go/tools/printf/fuzz.go b/vendor/honnef.co/go/tools/printf/fuzz.go new file mode 100644 index 00000000..8ebf357f --- /dev/null +++ b/vendor/honnef.co/go/tools/printf/fuzz.go @@ -0,0 +1,11 @@ +// +build gofuzz + +package printf + +func Fuzz(data []byte) int { + _, err := Parse(string(data)) + if err == nil { + return 1 + } + return 0 +} diff --git a/vendor/honnef.co/go/tools/printf/printf.go b/vendor/honnef.co/go/tools/printf/printf.go new file mode 100644 index 00000000..754db9b1 --- /dev/null +++ b/vendor/honnef.co/go/tools/printf/printf.go @@ -0,0 +1,197 @@ +// Package printf implements a parser for fmt.Printf-style format +// strings. +// +// It parses verbs according to the following syntax: +// Numeric -> '0'-'9' +// Letter -> 'a'-'z' | 'A'-'Z' +// Index -> '[' Numeric+ ']' +// Star -> '*' +// Star -> Index '*' +// +// Precision -> Numeric+ | Star +// Width -> Numeric+ | Star +// +// WidthAndPrecision -> Width '.' Precision +// WidthAndPrecision -> Width '.' +// WidthAndPrecision -> Width +// WidthAndPrecision -> '.' Precision +// WidthAndPrecision -> '.' +// +// Flag -> '+' | '-' | '#' | ' ' | '0' +// Verb -> Letter | '%' +// +// Input -> '%' [ Flag+ ] [ WidthAndPrecision ] [ Index ] Verb +package printf + +import ( + "errors" + "regexp" + "strconv" + "strings" +) + +// ErrInvalid is returned for invalid format strings or verbs. +var ErrInvalid = errors.New("invalid format string") + +type Verb struct { + Letter rune + Flags string + + Width Argument + Precision Argument + // Which value in the argument list the verb uses. + // -1 denotes the next argument, + // values > 0 denote explicit arguments. + // The value 0 denotes that no argument is consumed. This is the case for %%. + Value int + + Raw string +} + +// Argument is an implicit or explicit width or precision. +type Argument interface { + isArgument() +} + +// The Default value, when no width or precision is provided. +type Default struct{} + +// Zero is the implicit zero value. +// This value may only appear for precisions in format strings like %6.f +type Zero struct{} + +// Star is a * value, which may either refer to the next argument (Index == -1) or an explicit argument. +type Star struct{ Index int } + +// A Literal value, such as 6 in %6d. +type Literal int + +func (Default) isArgument() {} +func (Zero) isArgument() {} +func (Star) isArgument() {} +func (Literal) isArgument() {} + +// Parse parses f and returns a list of actions. +// An action may either be a literal string, or a Verb. +func Parse(f string) ([]interface{}, error) { + var out []interface{} + for len(f) > 0 { + if f[0] == '%' { + v, n, err := ParseVerb(f) + if err != nil { + return nil, err + } + f = f[n:] + out = append(out, v) + } else { + n := strings.IndexByte(f, '%') + if n > -1 { + out = append(out, f[:n]) + f = f[n:] + } else { + out = append(out, f) + f = "" + } + } + } + + return out, nil +} + +func atoi(s string) int { + n, _ := strconv.Atoi(s) + return n +} + +// ParseVerb parses the verb at the beginning of f. +// It returns the verb, how much of the input was consumed, and an error, if any. +func ParseVerb(f string) (Verb, int, error) { + if len(f) < 2 { + return Verb{}, 0, ErrInvalid + } + const ( + flags = 1 + + width = 2 + widthStar = 3 + widthIndex = 5 + + dot = 6 + prec = 7 + precStar = 8 + precIndex = 10 + + verbIndex = 11 + verb = 12 + ) + + m := re.FindStringSubmatch(f) + if m == nil { + return Verb{}, 0, ErrInvalid + } + + v := Verb{ + Letter: []rune(m[verb])[0], + Flags: m[flags], + Raw: m[0], + } + + if m[width] != "" { + // Literal width + v.Width = Literal(atoi(m[width])) + } else if m[widthStar] != "" { + // Star width + if m[widthIndex] != "" { + v.Width = Star{atoi(m[widthIndex])} + } else { + v.Width = Star{-1} + } + } else { + // Default width + v.Width = Default{} + } + + if m[dot] == "" { + // default precision + v.Precision = Default{} + } else { + if m[prec] != "" { + // Literal precision + v.Precision = Literal(atoi(m[prec])) + } else if m[precStar] != "" { + // Star precision + if m[precIndex] != "" { + v.Precision = Star{atoi(m[precIndex])} + } else { + v.Precision = Star{-1} + } + } else { + // Zero precision + v.Precision = Zero{} + } + } + + if m[verb] == "%" { + v.Value = 0 + } else if m[verbIndex] != "" { + v.Value = atoi(m[verbIndex]) + } else { + v.Value = -1 + } + + return v, len(m[0]), nil +} + +const ( + flags = `([+#0 -]*)` + verb = `([a-zA-Z%])` + index = `(?:\[([0-9]+)\])` + star = `((` + index + `)?\*)` + width1 = `([0-9]+)` + width2 = star + width = `(?:` + width1 + `|` + width2 + `)` + precision = width + widthAndPrecision = `(?:(?:` + width + `)?(?:(\.)(?:` + precision + `)?)?)` +) + +var re = regexp.MustCompile(`^%` + flags + widthAndPrecision + `?` + index + `?` + verb) diff --git a/vendor/honnef.co/go/tools/simple/CONTRIBUTING.md b/vendor/honnef.co/go/tools/simple/CONTRIBUTING.md new file mode 100644 index 00000000..c54c6c50 --- /dev/null +++ b/vendor/honnef.co/go/tools/simple/CONTRIBUTING.md @@ -0,0 +1,15 @@ +# Contributing to gosimple + +## Before filing an issue: + +### Are you having trouble building gosimple? + +Check you have the latest version of its dependencies. Run +``` +go get -u honnef.co/go/tools/simple +``` +If you still have problems, consider searching for existing issues before filing a new issue. + +## Before sending a pull request: + +Have you understood the purpose of gosimple? Make sure to carefully read `README`. diff --git a/vendor/honnef.co/go/tools/simple/analysis.go b/vendor/honnef.co/go/tools/simple/analysis.go new file mode 100644 index 00000000..abb1648f --- /dev/null +++ b/vendor/honnef.co/go/tools/simple/analysis.go @@ -0,0 +1,223 @@ +package simple + +import ( + "flag" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/passes/inspect" + "honnef.co/go/tools/facts" + "honnef.co/go/tools/internal/passes/buildssa" + "honnef.co/go/tools/lint/lintutil" +) + +func newFlagSet() flag.FlagSet { + fs := flag.NewFlagSet("", flag.PanicOnError) + fs.Var(lintutil.NewVersionFlag(), "go", "Target Go version") + return *fs +} + +var Analyzers = map[string]*analysis.Analyzer{ + "S1000": { + Name: "S1000", + Run: LintSingleCaseSelect, + Doc: Docs["S1000"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1001": { + Name: "S1001", + Run: LintLoopCopy, + Doc: Docs["S1001"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1002": { + Name: "S1002", + Run: LintIfBoolCmp, + Doc: Docs["S1002"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1003": { + Name: "S1003", + Run: LintStringsContains, + Doc: Docs["S1003"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1004": { + Name: "S1004", + Run: LintBytesCompare, + Doc: Docs["S1004"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1005": { + Name: "S1005", + Run: LintUnnecessaryBlank, + Doc: Docs["S1005"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1006": { + Name: "S1006", + Run: LintForTrue, + Doc: Docs["S1006"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1007": { + Name: "S1007", + Run: LintRegexpRaw, + Doc: Docs["S1007"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1008": { + Name: "S1008", + Run: LintIfReturn, + Doc: Docs["S1008"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1009": { + Name: "S1009", + Run: LintRedundantNilCheckWithLen, + Doc: Docs["S1009"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1010": { + Name: "S1010", + Run: LintSlicing, + Doc: Docs["S1010"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1011": { + Name: "S1011", + Run: LintLoopAppend, + Doc: Docs["S1011"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1012": { + Name: "S1012", + Run: LintTimeSince, + Doc: Docs["S1012"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1016": { + Name: "S1016", + Run: LintSimplerStructConversion, + Doc: Docs["S1016"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1017": { + Name: "S1017", + Run: LintTrim, + Doc: Docs["S1017"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1018": { + Name: "S1018", + Run: LintLoopSlide, + Doc: Docs["S1018"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1019": { + Name: "S1019", + Run: LintMakeLenCap, + Doc: Docs["S1019"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1020": { + Name: "S1020", + Run: LintAssertNotNil, + Doc: Docs["S1020"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1021": { + Name: "S1021", + Run: LintDeclareAssign, + Doc: Docs["S1021"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1023": { + Name: "S1023", + Run: LintRedundantBreak, + Doc: Docs["S1023"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1024": { + Name: "S1024", + Run: LintTimeUntil, + Doc: Docs["S1024"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1025": { + Name: "S1025", + Run: LintRedundantSprintf, + Doc: Docs["S1025"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1028": { + Name: "S1028", + Run: LintErrorsNewSprintf, + Doc: Docs["S1028"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1029": { + Name: "S1029", + Run: LintRangeStringRunes, + Doc: Docs["S1029"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "S1030": { + Name: "S1030", + Run: LintBytesBufferConversions, + Doc: Docs["S1030"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1031": { + Name: "S1031", + Run: LintNilCheckAroundRange, + Doc: Docs["S1031"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1032": { + Name: "S1032", + Run: LintSortHelpers, + Doc: Docs["S1032"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1033": { + Name: "S1033", + Run: LintGuardedDelete, + Doc: Docs["S1033"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "S1034": { + Name: "S1034", + Run: LintSimplifyTypeSwitch, + Doc: Docs["S1034"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, +} diff --git a/vendor/honnef.co/go/tools/simple/doc.go b/vendor/honnef.co/go/tools/simple/doc.go new file mode 100644 index 00000000..eb0072de --- /dev/null +++ b/vendor/honnef.co/go/tools/simple/doc.go @@ -0,0 +1,425 @@ +package simple + +import "honnef.co/go/tools/lint" + +var Docs = map[string]*lint.Documentation{ + "S1000": &lint.Documentation{ + Title: `Use plain channel send or receive instead of single-case select`, + Text: `Select statements with a single case can be replaced with a simple +send or receive. + +Before: + + select { + case x := <-ch: + fmt.Println(x) + } + +After: + + x := <-ch + fmt.Println(x)`, + Since: "2017.1", + }, + + "S1001": &lint.Documentation{ + Title: `Replace for loop with call to copy`, + Text: `Use copy() for copying elements from one slice to another. + +Before: + + for i, x := range src { + dst[i] = x + } + +After: + + copy(dst, src)`, + Since: "2017.1", + }, + + "S1002": &lint.Documentation{ + Title: `Omit comparison with boolean constant`, + Text: `Before: + + if x == true {} + +After: + + if x {}`, + Since: "2017.1", + }, + + "S1003": &lint.Documentation{ + Title: `Replace call to strings.Index with strings.Contains`, + Text: `Before: + + if strings.Index(x, y) != -1 {} + +After: + + if strings.Contains(x, y) {}`, + Since: "2017.1", + }, + + "S1004": &lint.Documentation{ + Title: `Replace call to bytes.Compare with bytes.Equal`, + Text: `Before: + + if bytes.Compare(x, y) == 0 {} + +After: + + if bytes.Equal(x, y) {}`, + Since: "2017.1", + }, + + "S1005": &lint.Documentation{ + Title: `Drop unnecessary use of the blank identifier`, + Text: `In many cases, assigning to the blank identifier is unnecessary. + +Before: + + for _ = range s {} + x, _ = someMap[key] + _ = <-ch + +After: + + for range s{} + x = someMap[key] + <-ch`, + Since: "2017.1", + }, + + "S1006": &lint.Documentation{ + Title: `Use for { ... } for infinite loops`, + Text: `For infinite loops, using for { ... } is the most idiomatic choice.`, + Since: "2017.1", + }, + + "S1007": &lint.Documentation{ + Title: `Simplify regular expression by using raw string literal`, + Text: `Raw string literals use ` + "`" + ` instead of " and do not support +any escape sequences. This means that the backslash (\) can be used +freely, without the need of escaping. + +Since regular expressions have their own escape sequences, raw strings +can improve their readability. + +Before: + + regexp.Compile("\\A(\\w+) profile: total \\d+\\n\\z") + +After: + + regexp.Compile(` + "`" + `\A(\w+) profile: total \d+\n\z` + "`" + `)`, + Since: "2017.1", + }, + + "S1008": &lint.Documentation{ + Title: `Simplify returning boolean expression`, + Text: `Before: + + if { + return true + } + return false + +After: + + return `, + Since: "2017.1", + }, + + "S1009": &lint.Documentation{ + Title: `Omit redundant nil check on slices`, + Text: `The len function is defined for all slices, even nil ones, which have +a length of zero. It is not necessary to check if a slice is not nil +before checking that its length is not zero. + +Before: + + if x != nil && len(x) != 0 {} + +After: + + if len(x) != 0 {}`, + Since: "2017.1", + }, + + "S1010": &lint.Documentation{ + Title: `Omit default slice index`, + Text: `When slicing, the second index defaults to the length of the value, +making s[n:len(s)] and s[n:] equivalent.`, + Since: "2017.1", + }, + + "S1011": &lint.Documentation{ + Title: `Use a single append to concatenate two slices`, + Text: `Before: + + for _, e := range y { + x = append(x, e) + } + +After: + + x = append(x, y...)`, + Since: "2017.1", + }, + + "S1012": &lint.Documentation{ + Title: `Replace time.Now().Sub(x) with time.Since(x)`, + Text: `The time.Since helper has the same effect as using time.Now().Sub(x) +but is easier to read. + +Before: + + time.Now().Sub(x) + +After: + + time.Since(x)`, + Since: "2017.1", + }, + + "S1016": &lint.Documentation{ + Title: `Use a type conversion instead of manually copying struct fields`, + Text: `Two struct types with identical fields can be converted between each +other. In older versions of Go, the fields had to have identical +struct tags. Since Go 1.8, however, struct tags are ignored during +conversions. It is thus not necessary to manually copy every field +individually. + +Before: + + var x T1 + y := T2{ + Field1: x.Field1, + Field2: x.Field2, + } + +After: + + var x T1 + y := T2(x)`, + Since: "2017.1", + }, + + "S1017": &lint.Documentation{ + Title: `Replace manual trimming with strings.TrimPrefix`, + Text: `Instead of using strings.HasPrefix and manual slicing, use the +strings.TrimPrefix function. If the string doesn't start with the +prefix, the original string will be returned. Using strings.TrimPrefix +reduces complexity, and avoids common bugs, such as off-by-one +mistakes. + +Before: + + if strings.HasPrefix(str, prefix) { + str = str[len(prefix):] + } + +After: + + str = strings.TrimPrefix(str, prefix)`, + Since: "2017.1", + }, + + "S1018": &lint.Documentation{ + Title: `Use copy for sliding elements`, + Text: `copy() permits using the same source and destination slice, even with +overlapping ranges. This makes it ideal for sliding elements in a +slice. + +Before: + + for i := 0; i < n; i++ { + bs[i] = bs[offset+i] + } + +After: + + copy(bs[:n], bs[offset:])`, + Since: "2017.1", + }, + + "S1019": &lint.Documentation{ + Title: `Simplify make call by omitting redundant arguments`, + Text: `The make function has default values for the length and capacity +arguments. For channels and maps, the length defaults to zero. +Additionally, for slices the capacity defaults to the length.`, + Since: "2017.1", + }, + + "S1020": &lint.Documentation{ + Title: `Omit redundant nil check in type assertion`, + Text: `Before: + + if _, ok := i.(T); ok && i != nil {} + +After: + + if _, ok := i.(T); ok {}`, + Since: "2017.1", + }, + + "S1021": &lint.Documentation{ + Title: `Merge variable declaration and assignment`, + Text: `Before: + + var x uint + x = 1 + +After: + + var x uint = 1`, + Since: "2017.1", + }, + + "S1023": &lint.Documentation{ + Title: `Omit redundant control flow`, + Text: `Functions that have no return value do not need a return statement as +the final statement of the function. + +Switches in Go do not have automatic fallthrough, unlike languages +like C. It is not necessary to have a break statement as the final +statement in a case block.`, + Since: "2017.1", + }, + + "S1024": &lint.Documentation{ + Title: `Replace x.Sub(time.Now()) with time.Until(x)`, + Text: `The time.Until helper has the same effect as using x.Sub(time.Now()) +but is easier to read. + +Before: + + x.Sub(time.Now()) + +After: + + time.Until(x)`, + Since: "2017.1", + }, + + "S1025": &lint.Documentation{ + Title: `Don't use fmt.Sprintf("%s", x) unnecessarily`, + Text: `In many instances, there are easier and more efficient ways of getting +a value's string representation. Whenever a value's underlying type is +a string already, or the type has a String method, they should be used +directly. + +Given the following shared definitions + + type T1 string + type T2 int + + func (T2) String() string { return "Hello, world" } + + var x string + var y T1 + var z T2 + +we can simplify the following + + fmt.Sprintf("%s", x) + fmt.Sprintf("%s", y) + fmt.Sprintf("%s", z) + +to + + x + string(y) + z.String()`, + Since: "2017.1", + }, + + "S1028": &lint.Documentation{ + Title: `Simplify error construction with fmt.Errorf`, + Text: `Before: + + errors.New(fmt.Sprintf(...)) + +After: + + fmt.Errorf(...)`, + Since: "2017.1", + }, + + "S1029": &lint.Documentation{ + Title: `Range over the string directly`, + Text: `Ranging over a string will yield byte offsets and runes. If the offset +isn't used, this is functionally equivalent to converting the string +to a slice of runes and ranging over that. Ranging directly over the +string will be more performant, however, as it avoids allocating a new +slice, the size of which depends on the length of the string. + +Before: + + for _, r := range []rune(s) {} + +After: + + for _, r := range s {}`, + Since: "2017.1", + }, + + "S1030": &lint.Documentation{ + Title: `Use bytes.Buffer.String or bytes.Buffer.Bytes`, + Text: `bytes.Buffer has both a String and a Bytes method. It is never +necessary to use string(buf.Bytes()) or []byte(buf.String()) – simply +use the other method.`, + Since: "2017.1", + }, + + "S1031": &lint.Documentation{ + Title: `Omit redundant nil check around loop`, + Text: `You can use range on nil slices and maps, the loop will simply never +execute. This makes an additional nil check around the loop +unnecessary. + +Before: + + if s != nil { + for _, x := range s { + ... + } + } + +After: + + for _, x := range s { + ... + }`, + Since: "2017.1", + }, + + "S1032": &lint.Documentation{ + Title: `Use sort.Ints(x), sort.Float64s(x), and sort.Strings(x)`, + Text: `The sort.Ints, sort.Float64s and sort.Strings functions are easier to +read than sort.Sort(sort.IntSlice(x)), sort.Sort(sort.Float64Slice(x)) +and sort.Sort(sort.StringSlice(x)). + +Before: + + sort.Sort(sort.StringSlice(x)) + +After: + + sort.Strings(x)`, + Since: "2019.1", + }, + + "S1033": &lint.Documentation{ + Title: `Unnecessary guard around call to delete`, + Text: `Calling delete on a nil map is a no-op.`, + Since: "2019.2", + }, + + "S1034": &lint.Documentation{ + Title: `Use result of type assertion to simplify cases`, + Since: "2019.2", + }, +} diff --git a/vendor/honnef.co/go/tools/simple/lint.go b/vendor/honnef.co/go/tools/simple/lint.go new file mode 100644 index 00000000..c78a7bb7 --- /dev/null +++ b/vendor/honnef.co/go/tools/simple/lint.go @@ -0,0 +1,1816 @@ +// Package simple contains a linter for Go source code. +package simple // import "honnef.co/go/tools/simple" + +import ( + "fmt" + "go/ast" + "go/constant" + "go/token" + "go/types" + "reflect" + "sort" + "strings" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/passes/inspect" + "golang.org/x/tools/go/ast/inspector" + "golang.org/x/tools/go/types/typeutil" + . "honnef.co/go/tools/arg" + "honnef.co/go/tools/internal/passes/buildssa" + "honnef.co/go/tools/internal/sharedcheck" + "honnef.co/go/tools/lint" + . "honnef.co/go/tools/lint/lintdsl" +) + +func LintSingleCaseSelect(pass *analysis.Pass) (interface{}, error) { + isSingleSelect := func(node ast.Node) bool { + v, ok := node.(*ast.SelectStmt) + if !ok { + return false + } + return len(v.Body.List) == 1 + } + + seen := map[ast.Node]struct{}{} + fn := func(node ast.Node) { + switch v := node.(type) { + case *ast.ForStmt: + if len(v.Body.List) != 1 { + return + } + if !isSingleSelect(v.Body.List[0]) { + return + } + if _, ok := v.Body.List[0].(*ast.SelectStmt).Body.List[0].(*ast.CommClause).Comm.(*ast.SendStmt); ok { + // Don't suggest using range for channel sends + return + } + seen[v.Body.List[0]] = struct{}{} + ReportNodefFG(pass, node, "should use for range instead of for { select {} }") + case *ast.SelectStmt: + if _, ok := seen[v]; ok { + return + } + if !isSingleSelect(v) { + return + } + ReportNodefFG(pass, node, "should use a simple channel send/receive instead of select with a single case") + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil), (*ast.SelectStmt)(nil)}, fn) + return nil, nil +} + +func LintLoopCopy(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + loop := node.(*ast.RangeStmt) + + if loop.Key == nil { + return + } + if len(loop.Body.List) != 1 { + return + } + stmt, ok := loop.Body.List[0].(*ast.AssignStmt) + if !ok { + return + } + if stmt.Tok != token.ASSIGN || len(stmt.Lhs) != 1 || len(stmt.Rhs) != 1 { + return + } + lhs, ok := stmt.Lhs[0].(*ast.IndexExpr) + if !ok { + return + } + + if _, ok := pass.TypesInfo.TypeOf(lhs.X).(*types.Slice); !ok { + return + } + lidx, ok := lhs.Index.(*ast.Ident) + if !ok { + return + } + key, ok := loop.Key.(*ast.Ident) + if !ok { + return + } + if pass.TypesInfo.TypeOf(lhs) == nil || pass.TypesInfo.TypeOf(stmt.Rhs[0]) == nil { + return + } + if pass.TypesInfo.ObjectOf(lidx) != pass.TypesInfo.ObjectOf(key) { + return + } + if !types.Identical(pass.TypesInfo.TypeOf(lhs), pass.TypesInfo.TypeOf(stmt.Rhs[0])) { + return + } + if _, ok := pass.TypesInfo.TypeOf(loop.X).(*types.Slice); !ok { + return + } + + if rhs, ok := stmt.Rhs[0].(*ast.IndexExpr); ok { + rx, ok := rhs.X.(*ast.Ident) + _ = rx + if !ok { + return + } + ridx, ok := rhs.Index.(*ast.Ident) + if !ok { + return + } + if pass.TypesInfo.ObjectOf(ridx) != pass.TypesInfo.ObjectOf(key) { + return + } + } else if rhs, ok := stmt.Rhs[0].(*ast.Ident); ok { + value, ok := loop.Value.(*ast.Ident) + if !ok { + return + } + if pass.TypesInfo.ObjectOf(rhs) != pass.TypesInfo.ObjectOf(value) { + return + } + } else { + return + } + ReportNodefFG(pass, loop, "should use copy() instead of a loop") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn) + return nil, nil +} + +func LintIfBoolCmp(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + expr := node.(*ast.BinaryExpr) + if expr.Op != token.EQL && expr.Op != token.NEQ { + return + } + x := IsBoolConst(pass, expr.X) + y := IsBoolConst(pass, expr.Y) + if !x && !y { + return + } + var other ast.Expr + var val bool + if x { + val = BoolConst(pass, expr.X) + other = expr.Y + } else { + val = BoolConst(pass, expr.Y) + other = expr.X + } + basic, ok := pass.TypesInfo.TypeOf(other).Underlying().(*types.Basic) + if !ok || basic.Kind() != types.Bool { + return + } + op := "" + if (expr.Op == token.EQL && !val) || (expr.Op == token.NEQ && val) { + op = "!" + } + r := op + Render(pass, other) + l1 := len(r) + r = strings.TrimLeft(r, "!") + if (l1-len(r))%2 == 1 { + r = "!" + r + } + if IsInTest(pass, node) { + return + } + ReportNodefFG(pass, expr, "should omit comparison to bool constant, can be simplified to %s", r) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) + return nil, nil +} + +func LintBytesBufferConversions(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + if len(call.Args) != 1 { + return + } + + argCall, ok := call.Args[0].(*ast.CallExpr) + if !ok { + return + } + sel, ok := argCall.Fun.(*ast.SelectorExpr) + if !ok { + return + } + + typ := pass.TypesInfo.TypeOf(call.Fun) + if typ == types.Universe.Lookup("string").Type() && IsCallToAST(pass, call.Args[0], "(*bytes.Buffer).Bytes") { + ReportNodefFG(pass, call, "should use %v.String() instead of %v", Render(pass, sel.X), Render(pass, call)) + } else if typ, ok := typ.(*types.Slice); ok && typ.Elem() == types.Universe.Lookup("byte").Type() && IsCallToAST(pass, call.Args[0], "(*bytes.Buffer).String") { + ReportNodefFG(pass, call, "should use %v.Bytes() instead of %v", Render(pass, sel.X), Render(pass, call)) + } + + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func LintStringsContains(pass *analysis.Pass) (interface{}, error) { + // map of value to token to bool value + allowed := map[int64]map[token.Token]bool{ + -1: {token.GTR: true, token.NEQ: true, token.EQL: false}, + 0: {token.GEQ: true, token.LSS: false}, + } + fn := func(node ast.Node) { + expr := node.(*ast.BinaryExpr) + switch expr.Op { + case token.GEQ, token.GTR, token.NEQ, token.LSS, token.EQL: + default: + return + } + + value, ok := ExprToInt(pass, expr.Y) + if !ok { + return + } + + allowedOps, ok := allowed[value] + if !ok { + return + } + b, ok := allowedOps[expr.Op] + if !ok { + return + } + + call, ok := expr.X.(*ast.CallExpr) + if !ok { + return + } + sel, ok := call.Fun.(*ast.SelectorExpr) + if !ok { + return + } + pkgIdent, ok := sel.X.(*ast.Ident) + if !ok { + return + } + funIdent := sel.Sel + if pkgIdent.Name != "strings" && pkgIdent.Name != "bytes" { + return + } + newFunc := "" + switch funIdent.Name { + case "IndexRune": + newFunc = "ContainsRune" + case "IndexAny": + newFunc = "ContainsAny" + case "Index": + newFunc = "Contains" + default: + return + } + + prefix := "" + if !b { + prefix = "!" + } + ReportNodefFG(pass, node, "should use %s%s.%s(%s) instead", prefix, pkgIdent.Name, newFunc, RenderArgs(pass, call.Args)) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) + return nil, nil +} + +func LintBytesCompare(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + expr := node.(*ast.BinaryExpr) + if expr.Op != token.NEQ && expr.Op != token.EQL { + return + } + call, ok := expr.X.(*ast.CallExpr) + if !ok { + return + } + if !IsCallToAST(pass, call, "bytes.Compare") { + return + } + value, ok := ExprToInt(pass, expr.Y) + if !ok || value != 0 { + return + } + args := RenderArgs(pass, call.Args) + prefix := "" + if expr.Op == token.NEQ { + prefix = "!" + } + ReportNodefFG(pass, node, "should use %sbytes.Equal(%s) instead", prefix, args) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) + return nil, nil +} + +func LintForTrue(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + loop := node.(*ast.ForStmt) + if loop.Init != nil || loop.Post != nil { + return + } + if !IsBoolConst(pass, loop.Cond) || !BoolConst(pass, loop.Cond) { + return + } + ReportNodefFG(pass, loop, "should use for {} instead of for true {}") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn) + return nil, nil +} + +func LintRegexpRaw(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + if !IsCallToAST(pass, call, "regexp.MustCompile") && + !IsCallToAST(pass, call, "regexp.Compile") { + return + } + sel, ok := call.Fun.(*ast.SelectorExpr) + if !ok { + return + } + if len(call.Args) != 1 { + // invalid function call + return + } + lit, ok := call.Args[Arg("regexp.Compile.expr")].(*ast.BasicLit) + if !ok { + // TODO(dominikh): support string concat, maybe support constants + return + } + if lit.Kind != token.STRING { + // invalid function call + return + } + if lit.Value[0] != '"' { + // already a raw string + return + } + val := lit.Value + if !strings.Contains(val, `\\`) { + return + } + if strings.Contains(val, "`") { + return + } + + bs := false + for _, c := range val { + if !bs && c == '\\' { + bs = true + continue + } + if bs && c == '\\' { + bs = false + continue + } + if bs { + // backslash followed by non-backslash -> escape sequence + return + } + } + + ReportNodefFG(pass, call, "should use raw string (`...`) with regexp.%s to avoid having to escape twice", sel.Sel.Name) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func LintIfReturn(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + block := node.(*ast.BlockStmt) + l := len(block.List) + if l < 2 { + return + } + n1, n2 := block.List[l-2], block.List[l-1] + + if len(block.List) >= 3 { + if _, ok := block.List[l-3].(*ast.IfStmt); ok { + // Do not flag a series of if statements + return + } + } + // if statement with no init, no else, a single condition + // checking an identifier or function call and just a return + // statement in the body, that returns a boolean constant + ifs, ok := n1.(*ast.IfStmt) + if !ok { + return + } + if ifs.Else != nil || ifs.Init != nil { + return + } + if len(ifs.Body.List) != 1 { + return + } + if op, ok := ifs.Cond.(*ast.BinaryExpr); ok { + switch op.Op { + case token.EQL, token.LSS, token.GTR, token.NEQ, token.LEQ, token.GEQ: + default: + return + } + } + ret1, ok := ifs.Body.List[0].(*ast.ReturnStmt) + if !ok { + return + } + if len(ret1.Results) != 1 { + return + } + if !IsBoolConst(pass, ret1.Results[0]) { + return + } + + ret2, ok := n2.(*ast.ReturnStmt) + if !ok { + return + } + if len(ret2.Results) != 1 { + return + } + if !IsBoolConst(pass, ret2.Results[0]) { + return + } + + if ret1.Results[0].(*ast.Ident).Name == ret2.Results[0].(*ast.Ident).Name { + // we want the function to return true and false, not the + // same value both times. + return + } + + ReportNodefFG(pass, n1, "should use 'return ' instead of 'if { return }; return '") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn) + return nil, nil +} + +// LintRedundantNilCheckWithLen checks for the following reduntant nil-checks: +// +// if x == nil || len(x) == 0 {} +// if x != nil && len(x) != 0 {} +// if x != nil && len(x) == N {} (where N != 0) +// if x != nil && len(x) > N {} +// if x != nil && len(x) >= N {} (where N != 0) +// +func LintRedundantNilCheckWithLen(pass *analysis.Pass) (interface{}, error) { + isConstZero := func(expr ast.Expr) (isConst bool, isZero bool) { + _, ok := expr.(*ast.BasicLit) + if ok { + return true, IsZero(expr) + } + id, ok := expr.(*ast.Ident) + if !ok { + return false, false + } + c, ok := pass.TypesInfo.ObjectOf(id).(*types.Const) + if !ok { + return false, false + } + return true, c.Val().Kind() == constant.Int && c.Val().String() == "0" + } + + fn := func(node ast.Node) { + // check that expr is "x || y" or "x && y" + expr := node.(*ast.BinaryExpr) + if expr.Op != token.LOR && expr.Op != token.LAND { + return + } + eqNil := expr.Op == token.LOR + + // check that x is "xx == nil" or "xx != nil" + x, ok := expr.X.(*ast.BinaryExpr) + if !ok { + return + } + if eqNil && x.Op != token.EQL { + return + } + if !eqNil && x.Op != token.NEQ { + return + } + xx, ok := x.X.(*ast.Ident) + if !ok { + return + } + if !IsNil(pass, x.Y) { + return + } + + // check that y is "len(xx) == 0" or "len(xx) ... " + y, ok := expr.Y.(*ast.BinaryExpr) + if !ok { + return + } + if eqNil && y.Op != token.EQL { // must be len(xx) *==* 0 + return + } + yx, ok := y.X.(*ast.CallExpr) + if !ok { + return + } + yxFun, ok := yx.Fun.(*ast.Ident) + if !ok || yxFun.Name != "len" || len(yx.Args) != 1 { + return + } + yxArg, ok := yx.Args[Arg("len.v")].(*ast.Ident) + if !ok { + return + } + if yxArg.Name != xx.Name { + return + } + + if eqNil && !IsZero(y.Y) { // must be len(x) == *0* + return + } + + if !eqNil { + isConst, isZero := isConstZero(y.Y) + if !isConst { + return + } + switch y.Op { + case token.EQL: + // avoid false positive for "xx != nil && len(xx) == 0" + if isZero { + return + } + case token.GEQ: + // avoid false positive for "xx != nil && len(xx) >= 0" + if isZero { + return + } + case token.NEQ: + // avoid false positive for "xx != nil && len(xx) != " + if !isZero { + return + } + case token.GTR: + // ok + default: + return + } + } + + // finally check that xx type is one of array, slice, map or chan + // this is to prevent false positive in case if xx is a pointer to an array + var nilType string + switch pass.TypesInfo.TypeOf(xx).(type) { + case *types.Slice: + nilType = "nil slices" + case *types.Map: + nilType = "nil maps" + case *types.Chan: + nilType = "nil channels" + default: + return + } + ReportNodefFG(pass, expr, "should omit nil check; len() for %s is defined as zero", nilType) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) + return nil, nil +} + +func LintSlicing(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + n := node.(*ast.SliceExpr) + if n.Max != nil { + return + } + s, ok := n.X.(*ast.Ident) + if !ok || s.Obj == nil { + return + } + call, ok := n.High.(*ast.CallExpr) + if !ok || len(call.Args) != 1 || call.Ellipsis.IsValid() { + return + } + fun, ok := call.Fun.(*ast.Ident) + if !ok || fun.Name != "len" { + return + } + if _, ok := pass.TypesInfo.ObjectOf(fun).(*types.Builtin); !ok { + return + } + arg, ok := call.Args[Arg("len.v")].(*ast.Ident) + if !ok || arg.Obj != s.Obj { + return + } + ReportNodefFG(pass, n, "should omit second index in slice, s[a:len(s)] is identical to s[a:]") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.SliceExpr)(nil)}, fn) + return nil, nil +} + +func refersTo(pass *analysis.Pass, expr ast.Expr, ident *ast.Ident) bool { + found := false + fn := func(node ast.Node) bool { + ident2, ok := node.(*ast.Ident) + if !ok { + return true + } + if pass.TypesInfo.ObjectOf(ident) == pass.TypesInfo.ObjectOf(ident2) { + found = true + return false + } + return true + } + ast.Inspect(expr, fn) + return found +} + +func LintLoopAppend(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + loop := node.(*ast.RangeStmt) + if !IsBlank(loop.Key) { + return + } + val, ok := loop.Value.(*ast.Ident) + if !ok { + return + } + if len(loop.Body.List) != 1 { + return + } + stmt, ok := loop.Body.List[0].(*ast.AssignStmt) + if !ok { + return + } + if stmt.Tok != token.ASSIGN || len(stmt.Lhs) != 1 || len(stmt.Rhs) != 1 { + return + } + if refersTo(pass, stmt.Lhs[0], val) { + return + } + call, ok := stmt.Rhs[0].(*ast.CallExpr) + if !ok { + return + } + if len(call.Args) != 2 || call.Ellipsis.IsValid() { + return + } + fun, ok := call.Fun.(*ast.Ident) + if !ok { + return + } + obj := pass.TypesInfo.ObjectOf(fun) + fn, ok := obj.(*types.Builtin) + if !ok || fn.Name() != "append" { + return + } + + src := pass.TypesInfo.TypeOf(loop.X) + dst := pass.TypesInfo.TypeOf(call.Args[Arg("append.slice")]) + // TODO(dominikh) remove nil check once Go issue #15173 has + // been fixed + if src == nil { + return + } + if !types.Identical(src, dst) { + return + } + + if Render(pass, stmt.Lhs[0]) != Render(pass, call.Args[Arg("append.slice")]) { + return + } + + el, ok := call.Args[Arg("append.elems")].(*ast.Ident) + if !ok { + return + } + if pass.TypesInfo.ObjectOf(val) != pass.TypesInfo.ObjectOf(el) { + return + } + ReportNodefFG(pass, loop, "should replace loop with %s = append(%s, %s...)", + Render(pass, stmt.Lhs[0]), Render(pass, call.Args[Arg("append.slice")]), Render(pass, loop.X)) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn) + return nil, nil +} + +func LintTimeSince(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + sel, ok := call.Fun.(*ast.SelectorExpr) + if !ok { + return + } + if !IsCallToAST(pass, sel.X, "time.Now") { + return + } + if sel.Sel.Name != "Sub" { + return + } + ReportNodefFG(pass, call, "should use time.Since instead of time.Now().Sub") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func LintTimeUntil(pass *analysis.Pass) (interface{}, error) { + if !IsGoVersion(pass, 8) { + return nil, nil + } + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + if !IsCallToAST(pass, call, "(time.Time).Sub") { + return + } + if !IsCallToAST(pass, call.Args[Arg("(time.Time).Sub.u")], "time.Now") { + return + } + ReportNodefFG(pass, call, "should use time.Until instead of t.Sub(time.Now())") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func LintUnnecessaryBlank(pass *analysis.Pass) (interface{}, error) { + fn1 := func(node ast.Node) { + assign := node.(*ast.AssignStmt) + if len(assign.Lhs) != 2 || len(assign.Rhs) != 1 { + return + } + if !IsBlank(assign.Lhs[1]) { + return + } + switch rhs := assign.Rhs[0].(type) { + case *ast.IndexExpr: + // The type-checker should make sure that it's a map, but + // let's be safe. + if _, ok := pass.TypesInfo.TypeOf(rhs.X).Underlying().(*types.Map); !ok { + return + } + case *ast.UnaryExpr: + if rhs.Op != token.ARROW { + return + } + default: + return + } + cp := *assign + cp.Lhs = cp.Lhs[0:1] + ReportNodefFG(pass, assign, "should write %s instead of %s", Render(pass, &cp), Render(pass, assign)) + } + + fn2 := func(node ast.Node) { + stmt := node.(*ast.AssignStmt) + if len(stmt.Lhs) != len(stmt.Rhs) { + return + } + for i, lh := range stmt.Lhs { + rh := stmt.Rhs[i] + if !IsBlank(lh) { + continue + } + expr, ok := rh.(*ast.UnaryExpr) + if !ok { + continue + } + if expr.Op != token.ARROW { + continue + } + ReportNodefFG(pass, lh, "'_ = <-ch' can be simplified to '<-ch'") + } + } + + fn3 := func(node ast.Node) { + rs := node.(*ast.RangeStmt) + + // for x, _ + if !IsBlank(rs.Key) && IsBlank(rs.Value) { + ReportNodefFG(pass, rs.Value, "should omit value from range; this loop is equivalent to `for %s %s range ...`", Render(pass, rs.Key), rs.Tok) + } + // for _, _ || for _ + if IsBlank(rs.Key) && (IsBlank(rs.Value) || rs.Value == nil) { + ReportNodefFG(pass, rs.Key, "should omit values from range; this loop is equivalent to `for range ...`") + } + } + + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn1) + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn2) + if IsGoVersion(pass, 4) { + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn3) + } + return nil, nil +} + +func LintSimplerStructConversion(pass *analysis.Pass) (interface{}, error) { + var skip ast.Node + fn := func(node ast.Node) { + // Do not suggest type conversion between pointers + if unary, ok := node.(*ast.UnaryExpr); ok && unary.Op == token.AND { + if lit, ok := unary.X.(*ast.CompositeLit); ok { + skip = lit + } + return + } + + if node == skip { + return + } + + lit, ok := node.(*ast.CompositeLit) + if !ok { + return + } + typ1, _ := pass.TypesInfo.TypeOf(lit.Type).(*types.Named) + if typ1 == nil { + return + } + s1, ok := typ1.Underlying().(*types.Struct) + if !ok { + return + } + + var typ2 *types.Named + var ident *ast.Ident + getSelType := func(expr ast.Expr) (types.Type, *ast.Ident, bool) { + sel, ok := expr.(*ast.SelectorExpr) + if !ok { + return nil, nil, false + } + ident, ok := sel.X.(*ast.Ident) + if !ok { + return nil, nil, false + } + typ := pass.TypesInfo.TypeOf(sel.X) + return typ, ident, typ != nil + } + if len(lit.Elts) == 0 { + return + } + if s1.NumFields() != len(lit.Elts) { + return + } + for i, elt := range lit.Elts { + var t types.Type + var id *ast.Ident + var ok bool + switch elt := elt.(type) { + case *ast.SelectorExpr: + t, id, ok = getSelType(elt) + if !ok { + return + } + if i >= s1.NumFields() || s1.Field(i).Name() != elt.Sel.Name { + return + } + case *ast.KeyValueExpr: + var sel *ast.SelectorExpr + sel, ok = elt.Value.(*ast.SelectorExpr) + if !ok { + return + } + + if elt.Key.(*ast.Ident).Name != sel.Sel.Name { + return + } + t, id, ok = getSelType(elt.Value) + } + if !ok { + return + } + // All fields must be initialized from the same object + if ident != nil && ident.Obj != id.Obj { + return + } + typ2, _ = t.(*types.Named) + if typ2 == nil { + return + } + ident = id + } + + if typ2 == nil { + return + } + + if typ1.Obj().Pkg() != typ2.Obj().Pkg() { + // Do not suggest type conversions between different + // packages. Types in different packages might only match + // by coincidence. Furthermore, if the dependency ever + // adds more fields to its type, it could break the code + // that relies on the type conversion to work. + return + } + + s2, ok := typ2.Underlying().(*types.Struct) + if !ok { + return + } + if typ1 == typ2 { + return + } + if IsGoVersion(pass, 8) { + if !types.IdenticalIgnoreTags(s1, s2) { + return + } + } else { + if !types.Identical(s1, s2) { + return + } + } + ReportNodefFG(pass, node, "should convert %s (type %s) to %s instead of using struct literal", + ident.Name, typ2.Obj().Name(), typ1.Obj().Name()) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.UnaryExpr)(nil), (*ast.CompositeLit)(nil)}, fn) + return nil, nil +} + +func LintTrim(pass *analysis.Pass) (interface{}, error) { + sameNonDynamic := func(node1, node2 ast.Node) bool { + if reflect.TypeOf(node1) != reflect.TypeOf(node2) { + return false + } + + switch node1 := node1.(type) { + case *ast.Ident: + return node1.Obj == node2.(*ast.Ident).Obj + case *ast.SelectorExpr: + return Render(pass, node1) == Render(pass, node2) + case *ast.IndexExpr: + return Render(pass, node1) == Render(pass, node2) + } + return false + } + + isLenOnIdent := func(fn ast.Expr, ident ast.Expr) bool { + call, ok := fn.(*ast.CallExpr) + if !ok { + return false + } + if fn, ok := call.Fun.(*ast.Ident); !ok || fn.Name != "len" { + return false + } + if len(call.Args) != 1 { + return false + } + return sameNonDynamic(call.Args[Arg("len.v")], ident) + } + + fn := func(node ast.Node) { + var pkg string + var fun string + + ifstmt := node.(*ast.IfStmt) + if ifstmt.Init != nil { + return + } + if ifstmt.Else != nil { + return + } + if len(ifstmt.Body.List) != 1 { + return + } + condCall, ok := ifstmt.Cond.(*ast.CallExpr) + if !ok { + return + } + switch { + case IsCallToAST(pass, condCall, "strings.HasPrefix"): + pkg = "strings" + fun = "HasPrefix" + case IsCallToAST(pass, condCall, "strings.HasSuffix"): + pkg = "strings" + fun = "HasSuffix" + case IsCallToAST(pass, condCall, "strings.Contains"): + pkg = "strings" + fun = "Contains" + case IsCallToAST(pass, condCall, "bytes.HasPrefix"): + pkg = "bytes" + fun = "HasPrefix" + case IsCallToAST(pass, condCall, "bytes.HasSuffix"): + pkg = "bytes" + fun = "HasSuffix" + case IsCallToAST(pass, condCall, "bytes.Contains"): + pkg = "bytes" + fun = "Contains" + default: + return + } + + assign, ok := ifstmt.Body.List[0].(*ast.AssignStmt) + if !ok { + return + } + if assign.Tok != token.ASSIGN { + return + } + if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 { + return + } + if !sameNonDynamic(condCall.Args[0], assign.Lhs[0]) { + return + } + + switch rhs := assign.Rhs[0].(type) { + case *ast.CallExpr: + if len(rhs.Args) < 2 || !sameNonDynamic(condCall.Args[0], rhs.Args[0]) || !sameNonDynamic(condCall.Args[1], rhs.Args[1]) { + return + } + if IsCallToAST(pass, condCall, "strings.HasPrefix") && IsCallToAST(pass, rhs, "strings.TrimPrefix") || + IsCallToAST(pass, condCall, "strings.HasSuffix") && IsCallToAST(pass, rhs, "strings.TrimSuffix") || + IsCallToAST(pass, condCall, "strings.Contains") && IsCallToAST(pass, rhs, "strings.Replace") || + IsCallToAST(pass, condCall, "bytes.HasPrefix") && IsCallToAST(pass, rhs, "bytes.TrimPrefix") || + IsCallToAST(pass, condCall, "bytes.HasSuffix") && IsCallToAST(pass, rhs, "bytes.TrimSuffix") || + IsCallToAST(pass, condCall, "bytes.Contains") && IsCallToAST(pass, rhs, "bytes.Replace") { + ReportNodefFG(pass, ifstmt, "should replace this if statement with an unconditional %s", CallNameAST(pass, rhs)) + } + return + case *ast.SliceExpr: + slice := rhs + if !ok { + return + } + if slice.Slice3 { + return + } + if !sameNonDynamic(slice.X, condCall.Args[0]) { + return + } + var index ast.Expr + switch fun { + case "HasPrefix": + // TODO(dh) We could detect a High that is len(s), but another + // rule will already flag that, anyway. + if slice.High != nil { + return + } + index = slice.Low + case "HasSuffix": + if slice.Low != nil { + n, ok := ExprToInt(pass, slice.Low) + if !ok || n != 0 { + return + } + } + index = slice.High + } + + switch index := index.(type) { + case *ast.CallExpr: + if fun != "HasPrefix" { + return + } + if fn, ok := index.Fun.(*ast.Ident); !ok || fn.Name != "len" { + return + } + if len(index.Args) != 1 { + return + } + id3 := index.Args[Arg("len.v")] + switch oid3 := condCall.Args[1].(type) { + case *ast.BasicLit: + if pkg != "strings" { + return + } + lit, ok := id3.(*ast.BasicLit) + if !ok { + return + } + s1, ok1 := ExprToString(pass, lit) + s2, ok2 := ExprToString(pass, condCall.Args[1]) + if !ok1 || !ok2 || s1 != s2 { + return + } + default: + if !sameNonDynamic(id3, oid3) { + return + } + } + case *ast.BasicLit, *ast.Ident: + if fun != "HasPrefix" { + return + } + if pkg != "strings" { + return + } + string, ok1 := ExprToString(pass, condCall.Args[1]) + int, ok2 := ExprToInt(pass, slice.Low) + if !ok1 || !ok2 || int != int64(len(string)) { + return + } + case *ast.BinaryExpr: + if fun != "HasSuffix" { + return + } + if index.Op != token.SUB { + return + } + if !isLenOnIdent(index.X, condCall.Args[0]) || + !isLenOnIdent(index.Y, condCall.Args[1]) { + return + } + default: + return + } + + var replacement string + switch fun { + case "HasPrefix": + replacement = "TrimPrefix" + case "HasSuffix": + replacement = "TrimSuffix" + } + ReportNodefFG(pass, ifstmt, "should replace this if statement with an unconditional %s.%s", pkg, replacement) + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn) + return nil, nil +} + +func LintLoopSlide(pass *analysis.Pass) (interface{}, error) { + // TODO(dh): detect bs[i+offset] in addition to bs[offset+i] + // TODO(dh): consider merging this function with LintLoopCopy + // TODO(dh): detect length that is an expression, not a variable name + // TODO(dh): support sliding to a different offset than the beginning of the slice + + fn := func(node ast.Node) { + /* + for i := 0; i < n; i++ { + bs[i] = bs[offset+i] + } + + ↓ + + copy(bs[:n], bs[offset:offset+n]) + */ + + loop := node.(*ast.ForStmt) + if len(loop.Body.List) != 1 || loop.Init == nil || loop.Cond == nil || loop.Post == nil { + return + } + assign, ok := loop.Init.(*ast.AssignStmt) + if !ok || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 || !IsZero(assign.Rhs[0]) { + return + } + initvar, ok := assign.Lhs[0].(*ast.Ident) + if !ok { + return + } + post, ok := loop.Post.(*ast.IncDecStmt) + if !ok || post.Tok != token.INC { + return + } + postvar, ok := post.X.(*ast.Ident) + if !ok || pass.TypesInfo.ObjectOf(postvar) != pass.TypesInfo.ObjectOf(initvar) { + return + } + bin, ok := loop.Cond.(*ast.BinaryExpr) + if !ok || bin.Op != token.LSS { + return + } + binx, ok := bin.X.(*ast.Ident) + if !ok || pass.TypesInfo.ObjectOf(binx) != pass.TypesInfo.ObjectOf(initvar) { + return + } + biny, ok := bin.Y.(*ast.Ident) + if !ok { + return + } + + assign, ok = loop.Body.List[0].(*ast.AssignStmt) + if !ok || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 || assign.Tok != token.ASSIGN { + return + } + lhs, ok := assign.Lhs[0].(*ast.IndexExpr) + if !ok { + return + } + rhs, ok := assign.Rhs[0].(*ast.IndexExpr) + if !ok { + return + } + + bs1, ok := lhs.X.(*ast.Ident) + if !ok { + return + } + bs2, ok := rhs.X.(*ast.Ident) + if !ok { + return + } + obj1 := pass.TypesInfo.ObjectOf(bs1) + obj2 := pass.TypesInfo.ObjectOf(bs2) + if obj1 != obj2 { + return + } + if _, ok := obj1.Type().Underlying().(*types.Slice); !ok { + return + } + + index1, ok := lhs.Index.(*ast.Ident) + if !ok || pass.TypesInfo.ObjectOf(index1) != pass.TypesInfo.ObjectOf(initvar) { + return + } + index2, ok := rhs.Index.(*ast.BinaryExpr) + if !ok || index2.Op != token.ADD { + return + } + add1, ok := index2.X.(*ast.Ident) + if !ok { + return + } + add2, ok := index2.Y.(*ast.Ident) + if !ok || pass.TypesInfo.ObjectOf(add2) != pass.TypesInfo.ObjectOf(initvar) { + return + } + + ReportNodefFG(pass, loop, "should use copy(%s[:%s], %s[%s:]) instead", Render(pass, bs1), Render(pass, biny), Render(pass, bs1), Render(pass, add1)) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn) + return nil, nil +} + +func LintMakeLenCap(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + if fn, ok := call.Fun.(*ast.Ident); !ok || fn.Name != "make" { + // FIXME check whether make is indeed the built-in function + return + } + switch len(call.Args) { + case 2: + // make(T, len) + if _, ok := pass.TypesInfo.TypeOf(call.Args[Arg("make.t")]).Underlying().(*types.Slice); ok { + break + } + if IsZero(call.Args[Arg("make.size[0]")]) { + ReportNodefFG(pass, call.Args[Arg("make.size[0]")], "should use make(%s) instead", Render(pass, call.Args[Arg("make.t")])) + } + case 3: + // make(T, len, cap) + if Render(pass, call.Args[Arg("make.size[0]")]) == Render(pass, call.Args[Arg("make.size[1]")]) { + ReportNodefFG(pass, call.Args[Arg("make.size[0]")], + "should use make(%s, %s) instead", + Render(pass, call.Args[Arg("make.t")]), Render(pass, call.Args[Arg("make.size[0]")])) + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func LintAssertNotNil(pass *analysis.Pass) (interface{}, error) { + isNilCheck := func(ident *ast.Ident, expr ast.Expr) bool { + xbinop, ok := expr.(*ast.BinaryExpr) + if !ok || xbinop.Op != token.NEQ { + return false + } + xident, ok := xbinop.X.(*ast.Ident) + if !ok || xident.Obj != ident.Obj { + return false + } + if !IsNil(pass, xbinop.Y) { + return false + } + return true + } + isOKCheck := func(ident *ast.Ident, expr ast.Expr) bool { + yident, ok := expr.(*ast.Ident) + if !ok || yident.Obj != ident.Obj { + return false + } + return true + } + fn1 := func(node ast.Node) { + ifstmt := node.(*ast.IfStmt) + assign, ok := ifstmt.Init.(*ast.AssignStmt) + if !ok || len(assign.Lhs) != 2 || len(assign.Rhs) != 1 || !IsBlank(assign.Lhs[0]) { + return + } + assert, ok := assign.Rhs[0].(*ast.TypeAssertExpr) + if !ok { + return + } + binop, ok := ifstmt.Cond.(*ast.BinaryExpr) + if !ok || binop.Op != token.LAND { + return + } + assertIdent, ok := assert.X.(*ast.Ident) + if !ok { + return + } + assignIdent, ok := assign.Lhs[1].(*ast.Ident) + if !ok { + return + } + if !(isNilCheck(assertIdent, binop.X) && isOKCheck(assignIdent, binop.Y)) && + !(isNilCheck(assertIdent, binop.Y) && isOKCheck(assignIdent, binop.X)) { + return + } + ReportNodefFG(pass, ifstmt, "when %s is true, %s can't be nil", Render(pass, assignIdent), Render(pass, assertIdent)) + } + fn2 := func(node ast.Node) { + // Check that outer ifstmt is an 'if x != nil {}' + ifstmt := node.(*ast.IfStmt) + if ifstmt.Init != nil { + return + } + if ifstmt.Else != nil { + return + } + if len(ifstmt.Body.List) != 1 { + return + } + binop, ok := ifstmt.Cond.(*ast.BinaryExpr) + if !ok { + return + } + if binop.Op != token.NEQ { + return + } + lhs, ok := binop.X.(*ast.Ident) + if !ok { + return + } + if !IsNil(pass, binop.Y) { + return + } + + // Check that inner ifstmt is an `if _, ok := x.(T); ok {}` + ifstmt, ok = ifstmt.Body.List[0].(*ast.IfStmt) + if !ok { + return + } + assign, ok := ifstmt.Init.(*ast.AssignStmt) + if !ok || len(assign.Lhs) != 2 || len(assign.Rhs) != 1 || !IsBlank(assign.Lhs[0]) { + return + } + assert, ok := assign.Rhs[0].(*ast.TypeAssertExpr) + if !ok { + return + } + assertIdent, ok := assert.X.(*ast.Ident) + if !ok { + return + } + if lhs.Obj != assertIdent.Obj { + return + } + assignIdent, ok := assign.Lhs[1].(*ast.Ident) + if !ok { + return + } + if !isOKCheck(assignIdent, ifstmt.Cond) { + return + } + ReportNodefFG(pass, ifstmt, "when %s is true, %s can't be nil", Render(pass, assignIdent), Render(pass, assertIdent)) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn1) + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn2) + return nil, nil +} + +func LintDeclareAssign(pass *analysis.Pass) (interface{}, error) { + hasMultipleAssignments := func(root ast.Node, ident *ast.Ident) bool { + num := 0 + ast.Inspect(root, func(node ast.Node) bool { + if num >= 2 { + return false + } + assign, ok := node.(*ast.AssignStmt) + if !ok { + return true + } + for _, lhs := range assign.Lhs { + if oident, ok := lhs.(*ast.Ident); ok { + if oident.Obj == ident.Obj { + num++ + } + } + } + + return true + }) + return num >= 2 + } + fn := func(node ast.Node) { + block := node.(*ast.BlockStmt) + if len(block.List) < 2 { + return + } + for i, stmt := range block.List[:len(block.List)-1] { + _ = i + decl, ok := stmt.(*ast.DeclStmt) + if !ok { + continue + } + gdecl, ok := decl.Decl.(*ast.GenDecl) + if !ok || gdecl.Tok != token.VAR || len(gdecl.Specs) != 1 { + continue + } + vspec, ok := gdecl.Specs[0].(*ast.ValueSpec) + if !ok || len(vspec.Names) != 1 || len(vspec.Values) != 0 { + continue + } + + assign, ok := block.List[i+1].(*ast.AssignStmt) + if !ok || assign.Tok != token.ASSIGN { + continue + } + if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 { + continue + } + ident, ok := assign.Lhs[0].(*ast.Ident) + if !ok { + continue + } + if vspec.Names[0].Obj != ident.Obj { + continue + } + + if refersTo(pass, assign.Rhs[0], ident) { + continue + } + if hasMultipleAssignments(block, ident) { + continue + } + + ReportNodefFG(pass, decl, "should merge variable declaration with assignment on next line") + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn) + return nil, nil +} + +func LintRedundantBreak(pass *analysis.Pass) (interface{}, error) { + fn1 := func(node ast.Node) { + clause := node.(*ast.CaseClause) + if len(clause.Body) < 2 { + return + } + branch, ok := clause.Body[len(clause.Body)-1].(*ast.BranchStmt) + if !ok || branch.Tok != token.BREAK || branch.Label != nil { + return + } + ReportNodefFG(pass, branch, "redundant break statement") + } + fn2 := func(node ast.Node) { + var ret *ast.FieldList + var body *ast.BlockStmt + switch x := node.(type) { + case *ast.FuncDecl: + ret = x.Type.Results + body = x.Body + case *ast.FuncLit: + ret = x.Type.Results + body = x.Body + default: + panic(fmt.Sprintf("unreachable: %T", node)) + } + // if the func has results, a return can't be redundant. + // similarly, if there are no statements, there can be + // no return. + if ret != nil || body == nil || len(body.List) < 1 { + return + } + rst, ok := body.List[len(body.List)-1].(*ast.ReturnStmt) + if !ok { + return + } + // we don't need to check rst.Results as we already + // checked x.Type.Results to be nil. + ReportNodefFG(pass, rst, "redundant return statement") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CaseClause)(nil)}, fn1) + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.FuncDecl)(nil), (*ast.FuncLit)(nil)}, fn2) + return nil, nil +} + +func isStringer(T types.Type, msCache *typeutil.MethodSetCache) bool { + ms := msCache.MethodSet(T) + sel := ms.Lookup(nil, "String") + if sel == nil { + return false + } + fn, ok := sel.Obj().(*types.Func) + if !ok { + // should be unreachable + return false + } + sig := fn.Type().(*types.Signature) + if sig.Params().Len() != 0 { + return false + } + if sig.Results().Len() != 1 { + return false + } + if !IsType(sig.Results().At(0).Type(), "string") { + return false + } + return true +} + +func LintRedundantSprintf(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + if !IsCallToAST(pass, call, "fmt.Sprintf") { + return + } + if len(call.Args) != 2 { + return + } + if s, ok := ExprToString(pass, call.Args[Arg("fmt.Sprintf.format")]); !ok || s != "%s" { + return + } + arg := call.Args[Arg("fmt.Sprintf.a[0]")] + typ := pass.TypesInfo.TypeOf(arg) + + ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg + if isStringer(typ, &ssapkg.Prog.MethodSets) { + ReportNodef(pass, call, "should use String() instead of fmt.Sprintf") + return + } + + if typ.Underlying() == types.Universe.Lookup("string").Type() { + if typ == types.Universe.Lookup("string").Type() { + ReportNodefFG(pass, call, "the argument is already a string, there's no need to use fmt.Sprintf") + } else { + ReportNodefFG(pass, call, "the argument's underlying type is a string, should use a simple conversion instead of fmt.Sprintf") + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func LintErrorsNewSprintf(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + if !IsCallToAST(pass, node, "errors.New") { + return + } + call := node.(*ast.CallExpr) + if !IsCallToAST(pass, call.Args[Arg("errors.New.text")], "fmt.Sprintf") { + return + } + ReportNodefFG(pass, node, "should use fmt.Errorf(...) instead of errors.New(fmt.Sprintf(...))") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func LintRangeStringRunes(pass *analysis.Pass) (interface{}, error) { + return sharedcheck.CheckRangeStringRunes(pass) +} + +func LintNilCheckAroundRange(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + ifstmt := node.(*ast.IfStmt) + cond, ok := ifstmt.Cond.(*ast.BinaryExpr) + if !ok { + return + } + + if cond.Op != token.NEQ || !IsNil(pass, cond.Y) || len(ifstmt.Body.List) != 1 { + return + } + + loop, ok := ifstmt.Body.List[0].(*ast.RangeStmt) + if !ok { + return + } + ifXIdent, ok := cond.X.(*ast.Ident) + if !ok { + return + } + rangeXIdent, ok := loop.X.(*ast.Ident) + if !ok { + return + } + if ifXIdent.Obj != rangeXIdent.Obj { + return + } + switch pass.TypesInfo.TypeOf(rangeXIdent).(type) { + case *types.Slice, *types.Map: + ReportNodefFG(pass, node, "unnecessary nil check around range") + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn) + return nil, nil +} + +func isPermissibleSort(pass *analysis.Pass, node ast.Node) bool { + call := node.(*ast.CallExpr) + typeconv, ok := call.Args[0].(*ast.CallExpr) + if !ok { + return true + } + + sel, ok := typeconv.Fun.(*ast.SelectorExpr) + if !ok { + return true + } + name := SelectorName(pass, sel) + switch name { + case "sort.IntSlice", "sort.Float64Slice", "sort.StringSlice": + default: + return true + } + + return false +} + +func LintSortHelpers(pass *analysis.Pass) (interface{}, error) { + type Error struct { + node ast.Node + msg string + } + var allErrors []Error + fn := func(node ast.Node) { + var body *ast.BlockStmt + switch node := node.(type) { + case *ast.FuncLit: + body = node.Body + case *ast.FuncDecl: + body = node.Body + default: + panic(fmt.Sprintf("unreachable: %T", node)) + } + if body == nil { + return + } + + var errors []Error + permissible := false + fnSorts := func(node ast.Node) bool { + if permissible { + return false + } + if !IsCallToAST(pass, node, "sort.Sort") { + return true + } + if isPermissibleSort(pass, node) { + permissible = true + return false + } + call := node.(*ast.CallExpr) + typeconv := call.Args[Arg("sort.Sort.data")].(*ast.CallExpr) + sel := typeconv.Fun.(*ast.SelectorExpr) + name := SelectorName(pass, sel) + + switch name { + case "sort.IntSlice": + errors = append(errors, Error{node, "should use sort.Ints(...) instead of sort.Sort(sort.IntSlice(...))"}) + case "sort.Float64Slice": + errors = append(errors, Error{node, "should use sort.Float64s(...) instead of sort.Sort(sort.Float64Slice(...))"}) + case "sort.StringSlice": + errors = append(errors, Error{node, "should use sort.Strings(...) instead of sort.Sort(sort.StringSlice(...))"}) + } + return true + } + ast.Inspect(body, fnSorts) + + if permissible { + return + } + allErrors = append(allErrors, errors...) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.FuncLit)(nil), (*ast.FuncDecl)(nil)}, fn) + sort.Slice(allErrors, func(i, j int) bool { + return allErrors[i].node.Pos() < allErrors[j].node.Pos() + }) + var prev token.Pos + for _, err := range allErrors { + if err.node.Pos() == prev { + continue + } + prev = err.node.Pos() + ReportNodefFG(pass, err.node, "%s", err.msg) + } + return nil, nil +} + +func LintGuardedDelete(pass *analysis.Pass) (interface{}, error) { + isCommaOkMapIndex := func(stmt ast.Stmt) (b *ast.Ident, m ast.Expr, key ast.Expr, ok bool) { + // Has to be of the form `_, = [] + + assign, ok := stmt.(*ast.AssignStmt) + if !ok { + return nil, nil, nil, false + } + if len(assign.Lhs) != 2 || len(assign.Rhs) != 1 { + return nil, nil, nil, false + } + if !IsBlank(assign.Lhs[0]) { + return nil, nil, nil, false + } + ident, ok := assign.Lhs[1].(*ast.Ident) + if !ok { + return nil, nil, nil, false + } + index, ok := assign.Rhs[0].(*ast.IndexExpr) + if !ok { + return nil, nil, nil, false + } + if _, ok := pass.TypesInfo.TypeOf(index.X).(*types.Map); !ok { + return nil, nil, nil, false + } + key = index.Index + return ident, index.X, key, true + } + fn := func(node ast.Node) { + stmt := node.(*ast.IfStmt) + if len(stmt.Body.List) != 1 { + return + } + if stmt.Else != nil { + return + } + expr, ok := stmt.Body.List[0].(*ast.ExprStmt) + if !ok { + return + } + call, ok := expr.X.(*ast.CallExpr) + if !ok { + return + } + if !IsCallToAST(pass, call, "delete") { + return + } + b, m, key, ok := isCommaOkMapIndex(stmt.Init) + if !ok { + return + } + if cond, ok := stmt.Cond.(*ast.Ident); !ok || pass.TypesInfo.ObjectOf(cond) != pass.TypesInfo.ObjectOf(b) { + return + } + if Render(pass, call.Args[0]) != Render(pass, m) || Render(pass, call.Args[1]) != Render(pass, key) { + return + } + ReportNodefFG(pass, stmt, "unnecessary guard around call to delete") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn) + return nil, nil +} + +func LintSimplifyTypeSwitch(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + stmt := node.(*ast.TypeSwitchStmt) + if stmt.Init != nil { + // bailing out for now, can't anticipate how type switches with initializers are being used + return + } + expr, ok := stmt.Assign.(*ast.ExprStmt) + if !ok { + // the user is in fact assigning the result + return + } + assert := expr.X.(*ast.TypeAssertExpr) + ident, ok := assert.X.(*ast.Ident) + if !ok { + return + } + x := pass.TypesInfo.ObjectOf(ident) + var allOffenders []ast.Node + for _, clause := range stmt.Body.List { + clause := clause.(*ast.CaseClause) + if len(clause.List) != 1 { + continue + } + hasUnrelatedAssertion := false + var offenders []ast.Node + ast.Inspect(clause, func(node ast.Node) bool { + assert2, ok := node.(*ast.TypeAssertExpr) + if !ok { + return true + } + ident, ok := assert2.X.(*ast.Ident) + if !ok { + hasUnrelatedAssertion = true + return false + } + if pass.TypesInfo.ObjectOf(ident) != x { + hasUnrelatedAssertion = true + return false + } + + if !types.Identical(pass.TypesInfo.TypeOf(clause.List[0]), pass.TypesInfo.TypeOf(assert2.Type)) { + hasUnrelatedAssertion = true + return false + } + offenders = append(offenders, assert2) + return true + }) + if !hasUnrelatedAssertion { + // don't flag cases that have other type assertions + // unrelated to the one in the case clause. often + // times, this is done for symmetry, when two + // different values have to be asserted to the same + // type. + allOffenders = append(allOffenders, offenders...) + } + } + if len(allOffenders) != 0 { + at := "" + for _, offender := range allOffenders { + pos := lint.DisplayPosition(pass.Fset, offender.Pos()) + at += "\n\t" + pos.String() + } + ReportNodefFG(pass, expr, "assigning the result of this type assertion to a variable (switch %s := %s.(type)) could eliminate the following type assertions:%s", Render(pass, ident), Render(pass, ident), at) + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.TypeSwitchStmt)(nil)}, fn) + return nil, nil +} diff --git a/vendor/honnef.co/go/tools/ssa/LICENSE b/vendor/honnef.co/go/tools/ssa/LICENSE new file mode 100644 index 00000000..aee48041 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright (c) 2016 Dominik Honnef. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/honnef.co/go/tools/ssa/blockopt.go b/vendor/honnef.co/go/tools/ssa/blockopt.go new file mode 100644 index 00000000..22c9a4c0 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/blockopt.go @@ -0,0 +1,195 @@ +// Copyright 2013 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 ssa + +// Simple block optimizations to simplify the control flow graph. + +// TODO(adonovan): opt: instead of creating several "unreachable" blocks +// per function in the Builder, reuse a single one (e.g. at Blocks[1]) +// to reduce garbage. + +import ( + "fmt" + "os" +) + +// If true, perform sanity checking and show progress at each +// successive iteration of optimizeBlocks. Very verbose. +const debugBlockOpt = false + +// markReachable sets Index=-1 for all blocks reachable from b. +func markReachable(b *BasicBlock) { + b.Index = -1 + for _, succ := range b.Succs { + if succ.Index == 0 { + markReachable(succ) + } + } +} + +func DeleteUnreachableBlocks(f *Function) { + deleteUnreachableBlocks(f) +} + +// deleteUnreachableBlocks marks all reachable blocks of f and +// eliminates (nils) all others, including possibly cyclic subgraphs. +// +func deleteUnreachableBlocks(f *Function) { + const white, black = 0, -1 + // We borrow b.Index temporarily as the mark bit. + for _, b := range f.Blocks { + b.Index = white + } + markReachable(f.Blocks[0]) + if f.Recover != nil { + markReachable(f.Recover) + } + for i, b := range f.Blocks { + if b.Index == white { + for _, c := range b.Succs { + if c.Index == black { + c.removePred(b) // delete white->black edge + } + } + if debugBlockOpt { + fmt.Fprintln(os.Stderr, "unreachable", b) + } + f.Blocks[i] = nil // delete b + } + } + f.removeNilBlocks() +} + +// jumpThreading attempts to apply simple jump-threading to block b, +// in which a->b->c become a->c if b is just a Jump. +// The result is true if the optimization was applied. +// +func jumpThreading(f *Function, b *BasicBlock) bool { + if b.Index == 0 { + return false // don't apply to entry block + } + if b.Instrs == nil { + return false + } + if _, ok := b.Instrs[0].(*Jump); !ok { + return false // not just a jump + } + c := b.Succs[0] + if c == b { + return false // don't apply to degenerate jump-to-self. + } + if c.hasPhi() { + return false // not sound without more effort + } + for j, a := range b.Preds { + a.replaceSucc(b, c) + + // If a now has two edges to c, replace its degenerate If by Jump. + if len(a.Succs) == 2 && a.Succs[0] == c && a.Succs[1] == c { + jump := new(Jump) + jump.setBlock(a) + a.Instrs[len(a.Instrs)-1] = jump + a.Succs = a.Succs[:1] + c.removePred(b) + } else { + if j == 0 { + c.replacePred(b, a) + } else { + c.Preds = append(c.Preds, a) + } + } + + if debugBlockOpt { + fmt.Fprintln(os.Stderr, "jumpThreading", a, b, c) + } + } + f.Blocks[b.Index] = nil // delete b + return true +} + +// fuseBlocks attempts to apply the block fusion optimization to block +// a, in which a->b becomes ab if len(a.Succs)==len(b.Preds)==1. +// The result is true if the optimization was applied. +// +func fuseBlocks(f *Function, a *BasicBlock) bool { + if len(a.Succs) != 1 { + return false + } + b := a.Succs[0] + if len(b.Preds) != 1 { + return false + } + + // Degenerate &&/|| ops may result in a straight-line CFG + // containing φ-nodes. (Ideally we'd replace such them with + // their sole operand but that requires Referrers, built later.) + if b.hasPhi() { + return false // not sound without further effort + } + + // Eliminate jump at end of A, then copy all of B across. + a.Instrs = append(a.Instrs[:len(a.Instrs)-1], b.Instrs...) + for _, instr := range b.Instrs { + instr.setBlock(a) + } + + // A inherits B's successors + a.Succs = append(a.succs2[:0], b.Succs...) + + // Fix up Preds links of all successors of B. + for _, c := range b.Succs { + c.replacePred(b, a) + } + + if debugBlockOpt { + fmt.Fprintln(os.Stderr, "fuseBlocks", a, b) + } + + f.Blocks[b.Index] = nil // delete b + return true +} + +func OptimizeBlocks(f *Function) { + optimizeBlocks(f) +} + +// optimizeBlocks() performs some simple block optimizations on a +// completed function: dead block elimination, block fusion, jump +// threading. +// +func optimizeBlocks(f *Function) { + deleteUnreachableBlocks(f) + + // Loop until no further progress. + changed := true + for changed { + changed = false + + if debugBlockOpt { + f.WriteTo(os.Stderr) + mustSanityCheck(f, nil) + } + + for _, b := range f.Blocks { + // f.Blocks will temporarily contain nils to indicate + // deleted blocks; we remove them at the end. + if b == nil { + continue + } + + // Fuse blocks. b->c becomes bc. + if fuseBlocks(f, b) { + changed = true + } + + // a->b->c becomes a->c if b contains only a Jump. + if jumpThreading(f, b) { + changed = true + continue // (b was disconnected) + } + } + } + f.removeNilBlocks() +} diff --git a/vendor/honnef.co/go/tools/ssa/builder.go b/vendor/honnef.co/go/tools/ssa/builder.go new file mode 100644 index 00000000..317ac061 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/builder.go @@ -0,0 +1,2379 @@ +// Copyright 2013 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 ssa + +// This file implements the BUILD phase of SSA construction. +// +// SSA construction has two phases, CREATE and BUILD. In the CREATE phase +// (create.go), all packages are constructed and type-checked and +// definitions of all package members are created, method-sets are +// computed, and wrapper methods are synthesized. +// ssa.Packages are created in arbitrary order. +// +// In the BUILD phase (builder.go), the builder traverses the AST of +// each Go source function and generates SSA instructions for the +// function body. Initializer expressions for package-level variables +// are emitted to the package's init() function in the order specified +// by go/types.Info.InitOrder, then code for each function in the +// package is generated in lexical order. +// The BUILD phases for distinct packages are independent and are +// executed in parallel. +// +// TODO(adonovan): indeed, building functions is now embarrassingly parallel. +// Audit for concurrency then benchmark using more goroutines. +// +// The builder's and Program's indices (maps) are populated and +// mutated during the CREATE phase, but during the BUILD phase they +// remain constant. The sole exception is Prog.methodSets and its +// related maps, which are protected by a dedicated mutex. + +import ( + "fmt" + "go/ast" + "go/constant" + "go/token" + "go/types" + "os" + "sync" +) + +type opaqueType struct { + types.Type + name string +} + +func (t *opaqueType) String() string { return t.name } + +var ( + varOk = newVar("ok", tBool) + varIndex = newVar("index", tInt) + + // Type constants. + tBool = types.Typ[types.Bool] + tByte = types.Typ[types.Byte] + tInt = types.Typ[types.Int] + tInvalid = types.Typ[types.Invalid] + tString = types.Typ[types.String] + tUntypedNil = types.Typ[types.UntypedNil] + tRangeIter = &opaqueType{nil, "iter"} // the type of all "range" iterators + tEface = types.NewInterfaceType(nil, nil).Complete() + + // SSA Value constants. + vZero = intConst(0) + vOne = intConst(1) + vTrue = NewConst(constant.MakeBool(true), tBool) +) + +// builder holds state associated with the package currently being built. +// Its methods contain all the logic for AST-to-SSA conversion. +type builder struct{} + +// cond emits to fn code to evaluate boolean condition e and jump +// to t or f depending on its value, performing various simplifications. +// +// Postcondition: fn.currentBlock is nil. +// +func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) { + switch e := e.(type) { + case *ast.ParenExpr: + b.cond(fn, e.X, t, f) + return + + case *ast.BinaryExpr: + switch e.Op { + case token.LAND: + ltrue := fn.newBasicBlock("cond.true") + b.cond(fn, e.X, ltrue, f) + fn.currentBlock = ltrue + b.cond(fn, e.Y, t, f) + return + + case token.LOR: + lfalse := fn.newBasicBlock("cond.false") + b.cond(fn, e.X, t, lfalse) + fn.currentBlock = lfalse + b.cond(fn, e.Y, t, f) + return + } + + case *ast.UnaryExpr: + if e.Op == token.NOT { + b.cond(fn, e.X, f, t) + return + } + } + + // A traditional compiler would simplify "if false" (etc) here + // but we do not, for better fidelity to the source code. + // + // The value of a constant condition may be platform-specific, + // and may cause blocks that are reachable in some configuration + // to be hidden from subsequent analyses such as bug-finding tools. + emitIf(fn, b.expr(fn, e), t, f) +} + +// logicalBinop emits code to fn to evaluate e, a &&- or +// ||-expression whose reified boolean value is wanted. +// The value is returned. +// +func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value { + rhs := fn.newBasicBlock("binop.rhs") + done := fn.newBasicBlock("binop.done") + + // T(e) = T(e.X) = T(e.Y) after untyped constants have been + // eliminated. + // TODO(adonovan): not true; MyBool==MyBool yields UntypedBool. + t := fn.Pkg.typeOf(e) + + var short Value // value of the short-circuit path + switch e.Op { + case token.LAND: + b.cond(fn, e.X, rhs, done) + short = NewConst(constant.MakeBool(false), t) + + case token.LOR: + b.cond(fn, e.X, done, rhs) + short = NewConst(constant.MakeBool(true), t) + } + + // Is rhs unreachable? + if rhs.Preds == nil { + // Simplify false&&y to false, true||y to true. + fn.currentBlock = done + return short + } + + // Is done unreachable? + if done.Preds == nil { + // Simplify true&&y (or false||y) to y. + fn.currentBlock = rhs + return b.expr(fn, e.Y) + } + + // All edges from e.X to done carry the short-circuit value. + var edges []Value + for range done.Preds { + edges = append(edges, short) + } + + // The edge from e.Y to done carries the value of e.Y. + fn.currentBlock = rhs + edges = append(edges, b.expr(fn, e.Y)) + emitJump(fn, done) + fn.currentBlock = done + + phi := &Phi{Edges: edges, Comment: e.Op.String()} + phi.pos = e.OpPos + phi.typ = t + return done.emit(phi) +} + +// exprN lowers a multi-result expression e to SSA form, emitting code +// to fn and returning a single Value whose type is a *types.Tuple. +// The caller must access the components via Extract. +// +// Multi-result expressions include CallExprs in a multi-value +// assignment or return statement, and "value,ok" uses of +// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op +// is token.ARROW). +// +func (b *builder) exprN(fn *Function, e ast.Expr) Value { + typ := fn.Pkg.typeOf(e).(*types.Tuple) + switch e := e.(type) { + case *ast.ParenExpr: + return b.exprN(fn, e.X) + + case *ast.CallExpr: + // Currently, no built-in function nor type conversion + // has multiple results, so we can avoid some of the + // cases for single-valued CallExpr. + var c Call + b.setCall(fn, e, &c.Call) + c.typ = typ + return fn.emit(&c) + + case *ast.IndexExpr: + mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map) + lookup := &Lookup{ + X: b.expr(fn, e.X), + Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()), + CommaOk: true, + } + lookup.setType(typ) + lookup.setPos(e.Lbrack) + return fn.emit(lookup) + + case *ast.TypeAssertExpr: + return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen) + + case *ast.UnaryExpr: // must be receive <- + unop := &UnOp{ + Op: token.ARROW, + X: b.expr(fn, e.X), + CommaOk: true, + } + unop.setType(typ) + unop.setPos(e.OpPos) + return fn.emit(unop) + } + panic(fmt.Sprintf("exprN(%T) in %s", e, fn)) +} + +// builtin emits to fn SSA instructions to implement a call to the +// built-in function obj with the specified arguments +// and return type. It returns the value defined by the result. +// +// The result is nil if no special handling was required; in this case +// the caller should treat this like an ordinary library function +// call. +// +func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value { + switch obj.Name() { + case "make": + switch typ.Underlying().(type) { + case *types.Slice: + n := b.expr(fn, args[1]) + m := n + if len(args) == 3 { + m = b.expr(fn, args[2]) + } + if m, ok := m.(*Const); ok { + // treat make([]T, n, m) as new([m]T)[:n] + cap := m.Int64() + at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap) + alloc := emitNew(fn, at, pos) + alloc.Comment = "makeslice" + v := &Slice{ + X: alloc, + High: n, + } + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + } + v := &MakeSlice{ + Len: n, + Cap: m, + } + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + + case *types.Map: + var res Value + if len(args) == 2 { + res = b.expr(fn, args[1]) + } + v := &MakeMap{Reserve: res} + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + + case *types.Chan: + var sz Value = vZero + if len(args) == 2 { + sz = b.expr(fn, args[1]) + } + v := &MakeChan{Size: sz} + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + } + + case "new": + alloc := emitNew(fn, deref(typ), pos) + alloc.Comment = "new" + return alloc + + case "len", "cap": + // Special case: len or cap of an array or *array is + // based on the type, not the value which may be nil. + // We must still evaluate the value, though. (If it + // was side-effect free, the whole call would have + // been constant-folded.) + t := deref(fn.Pkg.typeOf(args[0])).Underlying() + if at, ok := t.(*types.Array); ok { + b.expr(fn, args[0]) // for effects only + return intConst(at.Len()) + } + // Otherwise treat as normal. + + case "panic": + fn.emit(&Panic{ + X: emitConv(fn, b.expr(fn, args[0]), tEface), + pos: pos, + }) + fn.currentBlock = fn.newBasicBlock("unreachable") + return vTrue // any non-nil Value will do + } + return nil // treat all others as a regular function call +} + +// addr lowers a single-result addressable expression e to SSA form, +// emitting code to fn and returning the location (an lvalue) defined +// by the expression. +// +// If escaping is true, addr marks the base variable of the +// addressable expression e as being a potentially escaping pointer +// value. For example, in this code: +// +// a := A{ +// b: [1]B{B{c: 1}} +// } +// return &a.b[0].c +// +// the application of & causes a.b[0].c to have its address taken, +// which means that ultimately the local variable a must be +// heap-allocated. This is a simple but very conservative escape +// analysis. +// +// Operations forming potentially escaping pointers include: +// - &x, including when implicit in method call or composite literals. +// - a[:] iff a is an array (not *array) +// - references to variables in lexically enclosing functions. +// +func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue { + switch e := e.(type) { + case *ast.Ident: + if isBlankIdent(e) { + return blank{} + } + obj := fn.Pkg.objectOf(e) + v := fn.Prog.packageLevelValue(obj) // var (address) + if v == nil { + v = fn.lookup(obj, escaping) + } + return &address{addr: v, pos: e.Pos(), expr: e} + + case *ast.CompositeLit: + t := deref(fn.Pkg.typeOf(e)) + var v *Alloc + if escaping { + v = emitNew(fn, t, e.Lbrace) + } else { + v = fn.addLocal(t, e.Lbrace) + } + v.Comment = "complit" + var sb storebuf + b.compLit(fn, v, e, true, &sb) + sb.emit(fn) + return &address{addr: v, pos: e.Lbrace, expr: e} + + case *ast.ParenExpr: + return b.addr(fn, e.X, escaping) + + case *ast.SelectorExpr: + sel, ok := fn.Pkg.info.Selections[e] + if !ok { + // qualified identifier + return b.addr(fn, e.Sel, escaping) + } + if sel.Kind() != types.FieldVal { + panic(sel) + } + wantAddr := true + v := b.receiver(fn, e.X, wantAddr, escaping, sel) + last := len(sel.Index()) - 1 + return &address{ + addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel), + pos: e.Sel.Pos(), + expr: e.Sel, + } + + case *ast.IndexExpr: + var x Value + var et types.Type + switch t := fn.Pkg.typeOf(e.X).Underlying().(type) { + case *types.Array: + x = b.addr(fn, e.X, escaping).address(fn) + et = types.NewPointer(t.Elem()) + case *types.Pointer: // *array + x = b.expr(fn, e.X) + et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()) + case *types.Slice: + x = b.expr(fn, e.X) + et = types.NewPointer(t.Elem()) + case *types.Map: + return &element{ + m: b.expr(fn, e.X), + k: emitConv(fn, b.expr(fn, e.Index), t.Key()), + t: t.Elem(), + pos: e.Lbrack, + } + default: + panic("unexpected container type in IndexExpr: " + t.String()) + } + v := &IndexAddr{ + X: x, + Index: emitConv(fn, b.expr(fn, e.Index), tInt), + } + v.setPos(e.Lbrack) + v.setType(et) + return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e} + + case *ast.StarExpr: + return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e} + } + + panic(fmt.Sprintf("unexpected address expression: %T", e)) +} + +type store struct { + lhs lvalue + rhs Value +} + +type storebuf struct{ stores []store } + +func (sb *storebuf) store(lhs lvalue, rhs Value) { + sb.stores = append(sb.stores, store{lhs, rhs}) +} + +func (sb *storebuf) emit(fn *Function) { + for _, s := range sb.stores { + s.lhs.store(fn, s.rhs) + } +} + +// assign emits to fn code to initialize the lvalue loc with the value +// of expression e. If isZero is true, assign assumes that loc holds +// the zero value for its type. +// +// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate +// better code in some cases, e.g., for composite literals in an +// addressable location. +// +// If sb is not nil, assign generates code to evaluate expression e, but +// not to update loc. Instead, the necessary stores are appended to the +// storebuf sb so that they can be executed later. This allows correct +// in-place update of existing variables when the RHS is a composite +// literal that may reference parts of the LHS. +// +func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) { + // Can we initialize it in place? + if e, ok := unparen(e).(*ast.CompositeLit); ok { + // A CompositeLit never evaluates to a pointer, + // so if the type of the location is a pointer, + // an &-operation is implied. + if _, ok := loc.(blank); !ok { // avoid calling blank.typ() + if isPointer(loc.typ()) { + ptr := b.addr(fn, e, true).address(fn) + // copy address + if sb != nil { + sb.store(loc, ptr) + } else { + loc.store(fn, ptr) + } + return + } + } + + if _, ok := loc.(*address); ok { + if isInterface(loc.typ()) { + // e.g. var x interface{} = T{...} + // Can't in-place initialize an interface value. + // Fall back to copying. + } else { + // x = T{...} or x := T{...} + addr := loc.address(fn) + if sb != nil { + b.compLit(fn, addr, e, isZero, sb) + } else { + var sb storebuf + b.compLit(fn, addr, e, isZero, &sb) + sb.emit(fn) + } + + // Subtle: emit debug ref for aggregate types only; + // slice and map are handled by store ops in compLit. + switch loc.typ().Underlying().(type) { + case *types.Struct, *types.Array: + emitDebugRef(fn, e, addr, true) + } + + return + } + } + } + + // simple case: just copy + rhs := b.expr(fn, e) + if sb != nil { + sb.store(loc, rhs) + } else { + loc.store(fn, rhs) + } +} + +// expr lowers a single-result expression e to SSA form, emitting code +// to fn and returning the Value defined by the expression. +// +func (b *builder) expr(fn *Function, e ast.Expr) Value { + e = unparen(e) + + tv := fn.Pkg.info.Types[e] + + // Is expression a constant? + if tv.Value != nil { + return NewConst(tv.Value, tv.Type) + } + + var v Value + if tv.Addressable() { + // Prefer pointer arithmetic ({Index,Field}Addr) followed + // by Load over subelement extraction (e.g. Index, Field), + // to avoid large copies. + v = b.addr(fn, e, false).load(fn) + } else { + v = b.expr0(fn, e, tv) + } + if fn.debugInfo() { + emitDebugRef(fn, e, v, false) + } + return v +} + +func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value { + switch e := e.(type) { + case *ast.BasicLit: + panic("non-constant BasicLit") // unreachable + + case *ast.FuncLit: + fn2 := &Function{ + name: fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)), + Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature), + pos: e.Type.Func, + parent: fn, + Pkg: fn.Pkg, + Prog: fn.Prog, + syntax: e, + } + fn.AnonFuncs = append(fn.AnonFuncs, fn2) + b.buildFunction(fn2) + if fn2.FreeVars == nil { + return fn2 + } + v := &MakeClosure{Fn: fn2} + v.setType(tv.Type) + for _, fv := range fn2.FreeVars { + v.Bindings = append(v.Bindings, fv.outer) + fv.outer = nil + } + return fn.emit(v) + + case *ast.TypeAssertExpr: // single-result form only + return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen) + + case *ast.CallExpr: + if fn.Pkg.info.Types[e.Fun].IsType() { + // Explicit type conversion, e.g. string(x) or big.Int(x) + x := b.expr(fn, e.Args[0]) + y := emitConv(fn, x, tv.Type) + if y != x { + switch y := y.(type) { + case *Convert: + y.pos = e.Lparen + case *ChangeType: + y.pos = e.Lparen + case *MakeInterface: + y.pos = e.Lparen + } + } + return y + } + // Call to "intrinsic" built-ins, e.g. new, make, panic. + if id, ok := unparen(e.Fun).(*ast.Ident); ok { + if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok { + if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil { + return v + } + } + } + // Regular function call. + var v Call + b.setCall(fn, e, &v.Call) + v.setType(tv.Type) + return fn.emit(&v) + + case *ast.UnaryExpr: + switch e.Op { + case token.AND: // &X --- potentially escaping. + addr := b.addr(fn, e.X, true) + if _, ok := unparen(e.X).(*ast.StarExpr); ok { + // &*p must panic if p is nil (http://golang.org/s/go12nil). + // For simplicity, we'll just (suboptimally) rely + // on the side effects of a load. + // TODO(adonovan): emit dedicated nilcheck. + addr.load(fn) + } + return addr.address(fn) + case token.ADD: + return b.expr(fn, e.X) + case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^ + v := &UnOp{ + Op: e.Op, + X: b.expr(fn, e.X), + } + v.setPos(e.OpPos) + v.setType(tv.Type) + return fn.emit(v) + default: + panic(e.Op) + } + + case *ast.BinaryExpr: + switch e.Op { + case token.LAND, token.LOR: + return b.logicalBinop(fn, e) + case token.SHL, token.SHR: + fallthrough + case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT: + return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos) + + case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ: + cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos) + // The type of x==y may be UntypedBool. + return emitConv(fn, cmp, DefaultType(tv.Type)) + default: + panic("illegal op in BinaryExpr: " + e.Op.String()) + } + + case *ast.SliceExpr: + var low, high, max Value + var x Value + switch fn.Pkg.typeOf(e.X).Underlying().(type) { + case *types.Array: + // Potentially escaping. + x = b.addr(fn, e.X, true).address(fn) + case *types.Basic, *types.Slice, *types.Pointer: // *array + x = b.expr(fn, e.X) + default: + panic("unreachable") + } + if e.High != nil { + high = b.expr(fn, e.High) + } + if e.Low != nil { + low = b.expr(fn, e.Low) + } + if e.Slice3 { + max = b.expr(fn, e.Max) + } + v := &Slice{ + X: x, + Low: low, + High: high, + Max: max, + } + v.setPos(e.Lbrack) + v.setType(tv.Type) + return fn.emit(v) + + case *ast.Ident: + obj := fn.Pkg.info.Uses[e] + // Universal built-in or nil? + switch obj := obj.(type) { + case *types.Builtin: + return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)} + case *types.Nil: + return nilConst(tv.Type) + } + // Package-level func or var? + if v := fn.Prog.packageLevelValue(obj); v != nil { + if _, ok := obj.(*types.Var); ok { + return emitLoad(fn, v) // var (address) + } + return v // (func) + } + // Local var. + return emitLoad(fn, fn.lookup(obj, false)) // var (address) + + case *ast.SelectorExpr: + sel, ok := fn.Pkg.info.Selections[e] + if !ok { + // qualified identifier + return b.expr(fn, e.Sel) + } + switch sel.Kind() { + case types.MethodExpr: + // (*T).f or T.f, the method f from the method-set of type T. + // The result is a "thunk". + return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type) + + case types.MethodVal: + // e.f where e is an expression and f is a method. + // The result is a "bound". + obj := sel.Obj().(*types.Func) + rt := recvType(obj) + wantAddr := isPointer(rt) + escaping := true + v := b.receiver(fn, e.X, wantAddr, escaping, sel) + if isInterface(rt) { + // If v has interface type I, + // we must emit a check that v is non-nil. + // We use: typeassert v.(I). + emitTypeAssert(fn, v, rt, token.NoPos) + } + c := &MakeClosure{ + Fn: makeBound(fn.Prog, obj), + Bindings: []Value{v}, + } + c.setPos(e.Sel.Pos()) + c.setType(tv.Type) + return fn.emit(c) + + case types.FieldVal: + indices := sel.Index() + last := len(indices) - 1 + v := b.expr(fn, e.X) + v = emitImplicitSelections(fn, v, indices[:last]) + v = emitFieldSelection(fn, v, indices[last], false, e.Sel) + return v + } + + panic("unexpected expression-relative selector") + + case *ast.IndexExpr: + switch t := fn.Pkg.typeOf(e.X).Underlying().(type) { + case *types.Array: + // Non-addressable array (in a register). + v := &Index{ + X: b.expr(fn, e.X), + Index: emitConv(fn, b.expr(fn, e.Index), tInt), + } + v.setPos(e.Lbrack) + v.setType(t.Elem()) + return fn.emit(v) + + case *types.Map: + // Maps are not addressable. + mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map) + v := &Lookup{ + X: b.expr(fn, e.X), + Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()), + } + v.setPos(e.Lbrack) + v.setType(mapt.Elem()) + return fn.emit(v) + + case *types.Basic: // => string + // Strings are not addressable. + v := &Lookup{ + X: b.expr(fn, e.X), + Index: b.expr(fn, e.Index), + } + v.setPos(e.Lbrack) + v.setType(tByte) + return fn.emit(v) + + case *types.Slice, *types.Pointer: // *array + // Addressable slice/array; use IndexAddr and Load. + return b.addr(fn, e, false).load(fn) + + default: + panic("unexpected container type in IndexExpr: " + t.String()) + } + + case *ast.CompositeLit, *ast.StarExpr: + // Addressable types (lvalues) + return b.addr(fn, e, false).load(fn) + } + + panic(fmt.Sprintf("unexpected expr: %T", e)) +} + +// stmtList emits to fn code for all statements in list. +func (b *builder) stmtList(fn *Function, list []ast.Stmt) { + for _, s := range list { + b.stmt(fn, s) + } +} + +// receiver emits to fn code for expression e in the "receiver" +// position of selection e.f (where f may be a field or a method) and +// returns the effective receiver after applying the implicit field +// selections of sel. +// +// wantAddr requests that the result is an an address. If +// !sel.Indirect(), this may require that e be built in addr() mode; it +// must thus be addressable. +// +// escaping is defined as per builder.addr(). +// +func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value { + var v Value + if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) { + v = b.addr(fn, e, escaping).address(fn) + } else { + v = b.expr(fn, e) + } + + last := len(sel.Index()) - 1 + v = emitImplicitSelections(fn, v, sel.Index()[:last]) + if !wantAddr && isPointer(v.Type()) { + v = emitLoad(fn, v) + } + return v +} + +// setCallFunc populates the function parts of a CallCommon structure +// (Func, Method, Recv, Args[0]) based on the kind of invocation +// occurring in e. +// +func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) { + c.pos = e.Lparen + + // Is this a method call? + if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok { + sel, ok := fn.Pkg.info.Selections[selector] + if ok && sel.Kind() == types.MethodVal { + obj := sel.Obj().(*types.Func) + recv := recvType(obj) + wantAddr := isPointer(recv) + escaping := true + v := b.receiver(fn, selector.X, wantAddr, escaping, sel) + if isInterface(recv) { + // Invoke-mode call. + c.Value = v + c.Method = obj + } else { + // "Call"-mode call. + c.Value = fn.Prog.declaredFunc(obj) + c.Args = append(c.Args, v) + } + return + } + + // sel.Kind()==MethodExpr indicates T.f() or (*T).f(): + // a statically dispatched call to the method f in the + // method-set of T or *T. T may be an interface. + // + // e.Fun would evaluate to a concrete method, interface + // wrapper function, or promotion wrapper. + // + // For now, we evaluate it in the usual way. + // + // TODO(adonovan): opt: inline expr() here, to make the + // call static and to avoid generation of wrappers. + // It's somewhat tricky as it may consume the first + // actual parameter if the call is "invoke" mode. + // + // Examples: + // type T struct{}; func (T) f() {} // "call" mode + // type T interface { f() } // "invoke" mode + // + // type S struct{ T } + // + // var s S + // S.f(s) + // (*S).f(&s) + // + // Suggested approach: + // - consume the first actual parameter expression + // and build it with b.expr(). + // - apply implicit field selections. + // - use MethodVal logic to populate fields of c. + } + + // Evaluate the function operand in the usual way. + c.Value = b.expr(fn, e.Fun) +} + +// emitCallArgs emits to f code for the actual parameters of call e to +// a (possibly built-in) function of effective type sig. +// The argument values are appended to args, which is then returned. +// +func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value { + // f(x, y, z...): pass slice z straight through. + if e.Ellipsis != 0 { + for i, arg := range e.Args { + v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type()) + args = append(args, v) + } + return args + } + + offset := len(args) // 1 if call has receiver, 0 otherwise + + // Evaluate actual parameter expressions. + // + // If this is a chained call of the form f(g()) where g has + // multiple return values (MRV), they are flattened out into + // args; a suffix of them may end up in a varargs slice. + for _, arg := range e.Args { + v := b.expr(fn, arg) + if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain + for i, n := 0, ttuple.Len(); i < n; i++ { + args = append(args, emitExtract(fn, v, i)) + } + } else { + args = append(args, v) + } + } + + // Actual->formal assignability conversions for normal parameters. + np := sig.Params().Len() // number of normal parameters + if sig.Variadic() { + np-- + } + for i := 0; i < np; i++ { + args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type()) + } + + // Actual->formal assignability conversions for variadic parameter, + // and construction of slice. + if sig.Variadic() { + varargs := args[offset+np:] + st := sig.Params().At(np).Type().(*types.Slice) + vt := st.Elem() + if len(varargs) == 0 { + args = append(args, nilConst(st)) + } else { + // Replace a suffix of args with a slice containing it. + at := types.NewArray(vt, int64(len(varargs))) + a := emitNew(fn, at, token.NoPos) + a.setPos(e.Rparen) + a.Comment = "varargs" + for i, arg := range varargs { + iaddr := &IndexAddr{ + X: a, + Index: intConst(int64(i)), + } + iaddr.setType(types.NewPointer(vt)) + fn.emit(iaddr) + emitStore(fn, iaddr, arg, arg.Pos()) + } + s := &Slice{X: a} + s.setType(st) + args[offset+np] = fn.emit(s) + args = args[:offset+np+1] + } + } + return args +} + +// setCall emits to fn code to evaluate all the parameters of a function +// call e, and populates *c with those values. +// +func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) { + // First deal with the f(...) part and optional receiver. + b.setCallFunc(fn, e, c) + + // Then append the other actual parameters. + sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature) + if sig == nil { + panic(fmt.Sprintf("no signature for call of %s", e.Fun)) + } + c.Args = b.emitCallArgs(fn, sig, e, c.Args) +} + +// assignOp emits to fn code to perform loc = val. +func (b *builder) assignOp(fn *Function, loc lvalue, val Value, op token.Token, pos token.Pos) { + oldv := loc.load(fn) + loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, val, oldv.Type()), loc.typ(), pos)) +} + +// localValueSpec emits to fn code to define all of the vars in the +// function-local ValueSpec, spec. +// +func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) { + switch { + case len(spec.Values) == len(spec.Names): + // e.g. var x, y = 0, 1 + // 1:1 assignment + for i, id := range spec.Names { + if !isBlankIdent(id) { + fn.addLocalForIdent(id) + } + lval := b.addr(fn, id, false) // non-escaping + b.assign(fn, lval, spec.Values[i], true, nil) + } + + case len(spec.Values) == 0: + // e.g. var x, y int + // Locals are implicitly zero-initialized. + for _, id := range spec.Names { + if !isBlankIdent(id) { + lhs := fn.addLocalForIdent(id) + if fn.debugInfo() { + emitDebugRef(fn, id, lhs, true) + } + } + } + + default: + // e.g. var x, y = pos() + tuple := b.exprN(fn, spec.Values[0]) + for i, id := range spec.Names { + if !isBlankIdent(id) { + fn.addLocalForIdent(id) + lhs := b.addr(fn, id, false) // non-escaping + lhs.store(fn, emitExtract(fn, tuple, i)) + } + } + } +} + +// assignStmt emits code to fn for a parallel assignment of rhss to lhss. +// isDef is true if this is a short variable declaration (:=). +// +// Note the similarity with localValueSpec. +// +func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) { + // Side effects of all LHSs and RHSs must occur in left-to-right order. + lvals := make([]lvalue, len(lhss)) + isZero := make([]bool, len(lhss)) + for i, lhs := range lhss { + var lval lvalue = blank{} + if !isBlankIdent(lhs) { + if isDef { + if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil { + fn.addNamedLocal(obj) + isZero[i] = true + } + } + lval = b.addr(fn, lhs, false) // non-escaping + } + lvals[i] = lval + } + if len(lhss) == len(rhss) { + // Simple assignment: x = f() (!isDef) + // Parallel assignment: x, y = f(), g() (!isDef) + // or short var decl: x, y := f(), g() (isDef) + // + // In all cases, the RHSs may refer to the LHSs, + // so we need a storebuf. + var sb storebuf + for i := range rhss { + b.assign(fn, lvals[i], rhss[i], isZero[i], &sb) + } + sb.emit(fn) + } else { + // e.g. x, y = pos() + tuple := b.exprN(fn, rhss[0]) + emitDebugRef(fn, rhss[0], tuple, false) + for i, lval := range lvals { + lval.store(fn, emitExtract(fn, tuple, i)) + } + } +} + +// arrayLen returns the length of the array whose composite literal elements are elts. +func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 { + var max int64 = -1 + var i int64 = -1 + for _, e := range elts { + if kv, ok := e.(*ast.KeyValueExpr); ok { + i = b.expr(fn, kv.Key).(*Const).Int64() + } else { + i++ + } + if i > max { + max = i + } + } + return max + 1 +} + +// compLit emits to fn code to initialize a composite literal e at +// address addr with type typ. +// +// Nested composite literals are recursively initialized in place +// where possible. If isZero is true, compLit assumes that addr +// holds the zero value for typ. +// +// Because the elements of a composite literal may refer to the +// variables being updated, as in the second line below, +// x := T{a: 1} +// x = T{a: x.a} +// all the reads must occur before all the writes. Thus all stores to +// loc are emitted to the storebuf sb for later execution. +// +// A CompositeLit may have pointer type only in the recursive (nested) +// case when the type name is implicit. e.g. in []*T{{}}, the inner +// literal has type *T behaves like &T{}. +// In that case, addr must hold a T, not a *T. +// +func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) { + typ := deref(fn.Pkg.typeOf(e)) + switch t := typ.Underlying().(type) { + case *types.Struct: + if !isZero && len(e.Elts) != t.NumFields() { + // memclear + sb.store(&address{addr, e.Lbrace, nil}, + zeroValue(fn, deref(addr.Type()))) + isZero = true + } + for i, e := range e.Elts { + fieldIndex := i + pos := e.Pos() + if kv, ok := e.(*ast.KeyValueExpr); ok { + fname := kv.Key.(*ast.Ident).Name + for i, n := 0, t.NumFields(); i < n; i++ { + sf := t.Field(i) + if sf.Name() == fname { + fieldIndex = i + pos = kv.Colon + e = kv.Value + break + } + } + } + sf := t.Field(fieldIndex) + faddr := &FieldAddr{ + X: addr, + Field: fieldIndex, + } + faddr.setType(types.NewPointer(sf.Type())) + fn.emit(faddr) + b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb) + } + + case *types.Array, *types.Slice: + var at *types.Array + var array Value + switch t := t.(type) { + case *types.Slice: + at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts)) + alloc := emitNew(fn, at, e.Lbrace) + alloc.Comment = "slicelit" + array = alloc + case *types.Array: + at = t + array = addr + + if !isZero && int64(len(e.Elts)) != at.Len() { + // memclear + sb.store(&address{array, e.Lbrace, nil}, + zeroValue(fn, deref(array.Type()))) + } + } + + var idx *Const + for _, e := range e.Elts { + pos := e.Pos() + if kv, ok := e.(*ast.KeyValueExpr); ok { + idx = b.expr(fn, kv.Key).(*Const) + pos = kv.Colon + e = kv.Value + } else { + var idxval int64 + if idx != nil { + idxval = idx.Int64() + 1 + } + idx = intConst(idxval) + } + iaddr := &IndexAddr{ + X: array, + Index: idx, + } + iaddr.setType(types.NewPointer(at.Elem())) + fn.emit(iaddr) + if t != at { // slice + // backing array is unaliased => storebuf not needed. + b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil) + } else { + b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb) + } + } + + if t != at { // slice + s := &Slice{X: array} + s.setPos(e.Lbrace) + s.setType(typ) + sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s)) + } + + case *types.Map: + m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))} + m.setPos(e.Lbrace) + m.setType(typ) + fn.emit(m) + for _, e := range e.Elts { + e := e.(*ast.KeyValueExpr) + + // If a key expression in a map literal is itself a + // composite literal, the type may be omitted. + // For example: + // map[*struct{}]bool{{}: true} + // An &-operation may be implied: + // map[*struct{}]bool{&struct{}{}: true} + var key Value + if _, ok := unparen(e.Key).(*ast.CompositeLit); ok && isPointer(t.Key()) { + // A CompositeLit never evaluates to a pointer, + // so if the type of the location is a pointer, + // an &-operation is implied. + key = b.addr(fn, e.Key, true).address(fn) + } else { + key = b.expr(fn, e.Key) + } + + loc := element{ + m: m, + k: emitConv(fn, key, t.Key()), + t: t.Elem(), + pos: e.Colon, + } + + // We call assign() only because it takes care + // of any &-operation required in the recursive + // case, e.g., + // map[int]*struct{}{0: {}} implies &struct{}{}. + // In-place update is of course impossible, + // and no storebuf is needed. + b.assign(fn, &loc, e.Value, true, nil) + } + sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m) + + default: + panic("unexpected CompositeLit type: " + t.String()) + } +} + +// switchStmt emits to fn code for the switch statement s, optionally +// labelled by label. +// +func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) { + // We treat SwitchStmt like a sequential if-else chain. + // Multiway dispatch can be recovered later by ssautil.Switches() + // to those cases that are free of side effects. + if s.Init != nil { + b.stmt(fn, s.Init) + } + var tag Value = vTrue + if s.Tag != nil { + tag = b.expr(fn, s.Tag) + } + done := fn.newBasicBlock("switch.done") + if label != nil { + label._break = done + } + // We pull the default case (if present) down to the end. + // But each fallthrough label must point to the next + // body block in source order, so we preallocate a + // body block (fallthru) for the next case. + // Unfortunately this makes for a confusing block order. + var dfltBody *[]ast.Stmt + var dfltFallthrough *BasicBlock + var fallthru, dfltBlock *BasicBlock + ncases := len(s.Body.List) + for i, clause := range s.Body.List { + body := fallthru + if body == nil { + body = fn.newBasicBlock("switch.body") // first case only + } + + // Preallocate body block for the next case. + fallthru = done + if i+1 < ncases { + fallthru = fn.newBasicBlock("switch.body") + } + + cc := clause.(*ast.CaseClause) + if cc.List == nil { + // Default case. + dfltBody = &cc.Body + dfltFallthrough = fallthru + dfltBlock = body + continue + } + + var nextCond *BasicBlock + for _, cond := range cc.List { + nextCond = fn.newBasicBlock("switch.next") + // TODO(adonovan): opt: when tag==vTrue, we'd + // get better code if we use b.cond(cond) + // instead of BinOp(EQL, tag, b.expr(cond)) + // followed by If. Don't forget conversions + // though. + cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), cond.Pos()) + emitIf(fn, cond, body, nextCond) + fn.currentBlock = nextCond + } + fn.currentBlock = body + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _fallthrough: fallthru, + } + b.stmtList(fn, cc.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) + fn.currentBlock = nextCond + } + if dfltBlock != nil { + emitJump(fn, dfltBlock) + fn.currentBlock = dfltBlock + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _fallthrough: dfltFallthrough, + } + b.stmtList(fn, *dfltBody) + fn.targets = fn.targets.tail + } + emitJump(fn, done) + fn.currentBlock = done +} + +// typeSwitchStmt emits to fn code for the type switch statement s, optionally +// labelled by label. +// +func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) { + // We treat TypeSwitchStmt like a sequential if-else chain. + // Multiway dispatch can be recovered later by ssautil.Switches(). + + // Typeswitch lowering: + // + // var x X + // switch y := x.(type) { + // case T1, T2: S1 // >1 (y := x) + // case nil: SN // nil (y := x) + // default: SD // 0 types (y := x) + // case T3: S3 // 1 type (y := x.(T3)) + // } + // + // ...s.Init... + // x := eval x + // .caseT1: + // t1, ok1 := typeswitch,ok x + // if ok1 then goto S1 else goto .caseT2 + // .caseT2: + // t2, ok2 := typeswitch,ok x + // if ok2 then goto S1 else goto .caseNil + // .S1: + // y := x + // ...S1... + // goto done + // .caseNil: + // if t2, ok2 := typeswitch,ok x + // if x == nil then goto SN else goto .caseT3 + // .SN: + // y := x + // ...SN... + // goto done + // .caseT3: + // t3, ok3 := typeswitch,ok x + // if ok3 then goto S3 else goto default + // .S3: + // y := t3 + // ...S3... + // goto done + // .default: + // y := x + // ...SD... + // goto done + // .done: + + if s.Init != nil { + b.stmt(fn, s.Init) + } + + var x Value + switch ass := s.Assign.(type) { + case *ast.ExprStmt: // x.(type) + x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X) + case *ast.AssignStmt: // y := x.(type) + x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X) + } + + done := fn.newBasicBlock("typeswitch.done") + if label != nil { + label._break = done + } + var default_ *ast.CaseClause + for _, clause := range s.Body.List { + cc := clause.(*ast.CaseClause) + if cc.List == nil { + default_ = cc + continue + } + body := fn.newBasicBlock("typeswitch.body") + var next *BasicBlock + var casetype types.Type + var ti Value // ti, ok := typeassert,ok x + for _, cond := range cc.List { + next = fn.newBasicBlock("typeswitch.next") + casetype = fn.Pkg.typeOf(cond) + var condv Value + if casetype == tUntypedNil { + condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos) + ti = x + } else { + yok := emitTypeTest(fn, x, casetype, cc.Case) + ti = emitExtract(fn, yok, 0) + condv = emitExtract(fn, yok, 1) + } + emitIf(fn, condv, body, next) + fn.currentBlock = next + } + if len(cc.List) != 1 { + ti = x + } + fn.currentBlock = body + b.typeCaseBody(fn, cc, ti, done) + fn.currentBlock = next + } + if default_ != nil { + b.typeCaseBody(fn, default_, x, done) + } else { + emitJump(fn, done) + } + fn.currentBlock = done +} + +func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) { + if obj := fn.Pkg.info.Implicits[cc]; obj != nil { + // In a switch y := x.(type), each case clause + // implicitly declares a distinct object y. + // In a single-type case, y has that type. + // In multi-type cases, 'case nil' and default, + // y has the same type as the interface operand. + emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos()) + } + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + b.stmtList(fn, cc.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) +} + +// selectStmt emits to fn code for the select statement s, optionally +// labelled by label. +// +func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) { + // A blocking select of a single case degenerates to a + // simple send or receive. + // TODO(adonovan): opt: is this optimization worth its weight? + if len(s.Body.List) == 1 { + clause := s.Body.List[0].(*ast.CommClause) + if clause.Comm != nil { + b.stmt(fn, clause.Comm) + done := fn.newBasicBlock("select.done") + if label != nil { + label._break = done + } + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + b.stmtList(fn, clause.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) + fn.currentBlock = done + return + } + } + + // First evaluate all channels in all cases, and find + // the directions of each state. + var states []*SelectState + blocking := true + debugInfo := fn.debugInfo() + for _, clause := range s.Body.List { + var st *SelectState + switch comm := clause.(*ast.CommClause).Comm.(type) { + case nil: // default case + blocking = false + continue + + case *ast.SendStmt: // ch<- i + ch := b.expr(fn, comm.Chan) + st = &SelectState{ + Dir: types.SendOnly, + Chan: ch, + Send: emitConv(fn, b.expr(fn, comm.Value), + ch.Type().Underlying().(*types.Chan).Elem()), + Pos: comm.Arrow, + } + if debugInfo { + st.DebugNode = comm + } + + case *ast.AssignStmt: // x := <-ch + recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr) + st = &SelectState{ + Dir: types.RecvOnly, + Chan: b.expr(fn, recv.X), + Pos: recv.OpPos, + } + if debugInfo { + st.DebugNode = recv + } + + case *ast.ExprStmt: // <-ch + recv := unparen(comm.X).(*ast.UnaryExpr) + st = &SelectState{ + Dir: types.RecvOnly, + Chan: b.expr(fn, recv.X), + Pos: recv.OpPos, + } + if debugInfo { + st.DebugNode = recv + } + } + states = append(states, st) + } + + // We dispatch on the (fair) result of Select using a + // sequential if-else chain, in effect: + // + // idx, recvOk, r0...r_n-1 := select(...) + // if idx == 0 { // receive on channel 0 (first receive => r0) + // x, ok := r0, recvOk + // ...state0... + // } else if v == 1 { // send on channel 1 + // ...state1... + // } else { + // ...default... + // } + sel := &Select{ + States: states, + Blocking: blocking, + } + sel.setPos(s.Select) + var vars []*types.Var + vars = append(vars, varIndex, varOk) + for _, st := range states { + if st.Dir == types.RecvOnly { + tElem := st.Chan.Type().Underlying().(*types.Chan).Elem() + vars = append(vars, anonVar(tElem)) + } + } + sel.setType(types.NewTuple(vars...)) + + fn.emit(sel) + idx := emitExtract(fn, sel, 0) + + done := fn.newBasicBlock("select.done") + if label != nil { + label._break = done + } + + var defaultBody *[]ast.Stmt + state := 0 + r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV + for _, cc := range s.Body.List { + clause := cc.(*ast.CommClause) + if clause.Comm == nil { + defaultBody = &clause.Body + continue + } + body := fn.newBasicBlock("select.body") + next := fn.newBasicBlock("select.next") + emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next) + fn.currentBlock = body + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + switch comm := clause.Comm.(type) { + case *ast.ExprStmt: // <-ch + if debugInfo { + v := emitExtract(fn, sel, r) + emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false) + } + r++ + + case *ast.AssignStmt: // x := <-states[state].Chan + if comm.Tok == token.DEFINE { + fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident)) + } + x := b.addr(fn, comm.Lhs[0], false) // non-escaping + v := emitExtract(fn, sel, r) + if debugInfo { + emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false) + } + x.store(fn, v) + + if len(comm.Lhs) == 2 { // x, ok := ... + if comm.Tok == token.DEFINE { + fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident)) + } + ok := b.addr(fn, comm.Lhs[1], false) // non-escaping + ok.store(fn, emitExtract(fn, sel, 1)) + } + r++ + } + b.stmtList(fn, clause.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) + fn.currentBlock = next + state++ + } + if defaultBody != nil { + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + b.stmtList(fn, *defaultBody) + fn.targets = fn.targets.tail + } else { + // A blocking select must match some case. + // (This should really be a runtime.errorString, not a string.) + fn.emit(&Panic{ + X: emitConv(fn, stringConst("blocking select matched no case"), tEface), + }) + fn.currentBlock = fn.newBasicBlock("unreachable") + } + emitJump(fn, done) + fn.currentBlock = done +} + +// forStmt emits to fn code for the for statement s, optionally +// labelled by label. +// +func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) { + // ...init... + // jump loop + // loop: + // if cond goto body else done + // body: + // ...body... + // jump post + // post: (target of continue) + // ...post... + // jump loop + // done: (target of break) + if s.Init != nil { + b.stmt(fn, s.Init) + } + body := fn.newBasicBlock("for.body") + done := fn.newBasicBlock("for.done") // target of 'break' + loop := body // target of back-edge + if s.Cond != nil { + loop = fn.newBasicBlock("for.loop") + } + cont := loop // target of 'continue' + if s.Post != nil { + cont = fn.newBasicBlock("for.post") + } + if label != nil { + label._break = done + label._continue = cont + } + emitJump(fn, loop) + fn.currentBlock = loop + if loop != body { + b.cond(fn, s.Cond, body, done) + fn.currentBlock = body + } + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _continue: cont, + } + b.stmt(fn, s.Body) + fn.targets = fn.targets.tail + emitJump(fn, cont) + + if s.Post != nil { + fn.currentBlock = cont + b.stmt(fn, s.Post) + emitJump(fn, loop) // back-edge + } + fn.currentBlock = done +} + +// rangeIndexed emits to fn the header for an integer-indexed loop +// over array, *array or slice value x. +// The v result is defined only if tv is non-nil. +// forPos is the position of the "for" token. +// +func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) { + // + // length = len(x) + // index = -1 + // loop: (target of continue) + // index++ + // if index < length goto body else done + // body: + // k = index + // v = x[index] + // ...body... + // jump loop + // done: (target of break) + + // Determine number of iterations. + var length Value + if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok { + // For array or *array, the number of iterations is + // known statically thanks to the type. We avoid a + // data dependence upon x, permitting later dead-code + // elimination if x is pure, static unrolling, etc. + // Ranging over a nil *array may have >0 iterations. + // We still generate code for x, in case it has effects. + length = intConst(arr.Len()) + } else { + // length = len(x). + var c Call + c.Call.Value = makeLen(x.Type()) + c.Call.Args = []Value{x} + c.setType(tInt) + length = fn.emit(&c) + } + + index := fn.addLocal(tInt, token.NoPos) + emitStore(fn, index, intConst(-1), pos) + + loop = fn.newBasicBlock("rangeindex.loop") + emitJump(fn, loop) + fn.currentBlock = loop + + incr := &BinOp{ + Op: token.ADD, + X: emitLoad(fn, index), + Y: vOne, + } + incr.setType(tInt) + emitStore(fn, index, fn.emit(incr), pos) + + body := fn.newBasicBlock("rangeindex.body") + done = fn.newBasicBlock("rangeindex.done") + emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done) + fn.currentBlock = body + + k = emitLoad(fn, index) + if tv != nil { + switch t := x.Type().Underlying().(type) { + case *types.Array: + instr := &Index{ + X: x, + Index: k, + } + instr.setType(t.Elem()) + v = fn.emit(instr) + + case *types.Pointer: // *array + instr := &IndexAddr{ + X: x, + Index: k, + } + instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())) + v = emitLoad(fn, fn.emit(instr)) + + case *types.Slice: + instr := &IndexAddr{ + X: x, + Index: k, + } + instr.setType(types.NewPointer(t.Elem())) + v = emitLoad(fn, fn.emit(instr)) + + default: + panic("rangeIndexed x:" + t.String()) + } + } + return +} + +// rangeIter emits to fn the header for a loop using +// Range/Next/Extract to iterate over map or string value x. +// tk and tv are the types of the key/value results k and v, or nil +// if the respective component is not wanted. +// +func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) { + // + // it = range x + // loop: (target of continue) + // okv = next it (ok, key, value) + // ok = extract okv #0 + // if ok goto body else done + // body: + // k = extract okv #1 + // v = extract okv #2 + // ...body... + // jump loop + // done: (target of break) + // + + if tk == nil { + tk = tInvalid + } + if tv == nil { + tv = tInvalid + } + + rng := &Range{X: x} + rng.setPos(pos) + rng.setType(tRangeIter) + it := fn.emit(rng) + + loop = fn.newBasicBlock("rangeiter.loop") + emitJump(fn, loop) + fn.currentBlock = loop + + _, isString := x.Type().Underlying().(*types.Basic) + + okv := &Next{ + Iter: it, + IsString: isString, + } + okv.setType(types.NewTuple( + varOk, + newVar("k", tk), + newVar("v", tv), + )) + fn.emit(okv) + + body := fn.newBasicBlock("rangeiter.body") + done = fn.newBasicBlock("rangeiter.done") + emitIf(fn, emitExtract(fn, okv, 0), body, done) + fn.currentBlock = body + + if tk != tInvalid { + k = emitExtract(fn, okv, 1) + } + if tv != tInvalid { + v = emitExtract(fn, okv, 2) + } + return +} + +// rangeChan emits to fn the header for a loop that receives from +// channel x until it fails. +// tk is the channel's element type, or nil if the k result is +// not wanted +// pos is the position of the '=' or ':=' token. +// +func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) { + // + // loop: (target of continue) + // ko = <-x (key, ok) + // ok = extract ko #1 + // if ok goto body else done + // body: + // k = extract ko #0 + // ... + // goto loop + // done: (target of break) + + loop = fn.newBasicBlock("rangechan.loop") + emitJump(fn, loop) + fn.currentBlock = loop + recv := &UnOp{ + Op: token.ARROW, + X: x, + CommaOk: true, + } + recv.setPos(pos) + recv.setType(types.NewTuple( + newVar("k", x.Type().Underlying().(*types.Chan).Elem()), + varOk, + )) + ko := fn.emit(recv) + body := fn.newBasicBlock("rangechan.body") + done = fn.newBasicBlock("rangechan.done") + emitIf(fn, emitExtract(fn, ko, 1), body, done) + fn.currentBlock = body + if tk != nil { + k = emitExtract(fn, ko, 0) + } + return +} + +// rangeStmt emits to fn code for the range statement s, optionally +// labelled by label. +// +func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) { + var tk, tv types.Type + if s.Key != nil && !isBlankIdent(s.Key) { + tk = fn.Pkg.typeOf(s.Key) + } + if s.Value != nil && !isBlankIdent(s.Value) { + tv = fn.Pkg.typeOf(s.Value) + } + + // If iteration variables are defined (:=), this + // occurs once outside the loop. + // + // Unlike a short variable declaration, a RangeStmt + // using := never redeclares an existing variable; it + // always creates a new one. + if s.Tok == token.DEFINE { + if tk != nil { + fn.addLocalForIdent(s.Key.(*ast.Ident)) + } + if tv != nil { + fn.addLocalForIdent(s.Value.(*ast.Ident)) + } + } + + x := b.expr(fn, s.X) + + var k, v Value + var loop, done *BasicBlock + switch rt := x.Type().Underlying().(type) { + case *types.Slice, *types.Array, *types.Pointer: // *array + k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For) + + case *types.Chan: + k, loop, done = b.rangeChan(fn, x, tk, s.For) + + case *types.Map, *types.Basic: // string + k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For) + + default: + panic("Cannot range over: " + rt.String()) + } + + // Evaluate both LHS expressions before we update either. + var kl, vl lvalue + if tk != nil { + kl = b.addr(fn, s.Key, false) // non-escaping + } + if tv != nil { + vl = b.addr(fn, s.Value, false) // non-escaping + } + if tk != nil { + kl.store(fn, k) + } + if tv != nil { + vl.store(fn, v) + } + + if label != nil { + label._break = done + label._continue = loop + } + + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _continue: loop, + } + b.stmt(fn, s.Body) + fn.targets = fn.targets.tail + emitJump(fn, loop) // back-edge + fn.currentBlock = done +} + +// stmt lowers statement s to SSA form, emitting code to fn. +func (b *builder) stmt(fn *Function, _s ast.Stmt) { + // The label of the current statement. If non-nil, its _goto + // target is always set; its _break and _continue are set only + // within the body of switch/typeswitch/select/for/range. + // It is effectively an additional default-nil parameter of stmt(). + var label *lblock +start: + switch s := _s.(type) { + case *ast.EmptyStmt: + // ignore. (Usually removed by gofmt.) + + case *ast.DeclStmt: // Con, Var or Typ + d := s.Decl.(*ast.GenDecl) + if d.Tok == token.VAR { + for _, spec := range d.Specs { + if vs, ok := spec.(*ast.ValueSpec); ok { + b.localValueSpec(fn, vs) + } + } + } + + case *ast.LabeledStmt: + label = fn.labelledBlock(s.Label) + emitJump(fn, label._goto) + fn.currentBlock = label._goto + _s = s.Stmt + goto start // effectively: tailcall stmt(fn, s.Stmt, label) + + case *ast.ExprStmt: + b.expr(fn, s.X) + + case *ast.SendStmt: + fn.emit(&Send{ + Chan: b.expr(fn, s.Chan), + X: emitConv(fn, b.expr(fn, s.Value), + fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()), + pos: s.Arrow, + }) + + case *ast.IncDecStmt: + op := token.ADD + if s.Tok == token.DEC { + op = token.SUB + } + loc := b.addr(fn, s.X, false) + b.assignOp(fn, loc, NewConst(constant.MakeInt64(1), loc.typ()), op, s.Pos()) + + case *ast.AssignStmt: + switch s.Tok { + case token.ASSIGN, token.DEFINE: + b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE) + + default: // +=, etc. + op := s.Tok + token.ADD - token.ADD_ASSIGN + b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op, s.Pos()) + } + + case *ast.GoStmt: + // The "intrinsics" new/make/len/cap are forbidden here. + // panic is treated like an ordinary function call. + v := Go{pos: s.Go} + b.setCall(fn, s.Call, &v.Call) + fn.emit(&v) + + case *ast.DeferStmt: + // The "intrinsics" new/make/len/cap are forbidden here. + // panic is treated like an ordinary function call. + v := Defer{pos: s.Defer} + b.setCall(fn, s.Call, &v.Call) + fn.emit(&v) + + // A deferred call can cause recovery from panic, + // and control resumes at the Recover block. + createRecoverBlock(fn) + + case *ast.ReturnStmt: + var results []Value + if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 { + // Return of one expression in a multi-valued function. + tuple := b.exprN(fn, s.Results[0]) + ttuple := tuple.Type().(*types.Tuple) + for i, n := 0, ttuple.Len(); i < n; i++ { + results = append(results, + emitConv(fn, emitExtract(fn, tuple, i), + fn.Signature.Results().At(i).Type())) + } + } else { + // 1:1 return, or no-arg return in non-void function. + for i, r := range s.Results { + v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type()) + results = append(results, v) + } + } + if fn.namedResults != nil { + // Function has named result parameters (NRPs). + // Perform parallel assignment of return operands to NRPs. + for i, r := range results { + emitStore(fn, fn.namedResults[i], r, s.Return) + } + } + // Run function calls deferred in this + // function when explicitly returning from it. + fn.emit(new(RunDefers)) + if fn.namedResults != nil { + // Reload NRPs to form the result tuple. + results = results[:0] + for _, r := range fn.namedResults { + results = append(results, emitLoad(fn, r)) + } + } + fn.emit(&Return{Results: results, pos: s.Return}) + fn.currentBlock = fn.newBasicBlock("unreachable") + + case *ast.BranchStmt: + var block *BasicBlock + switch s.Tok { + case token.BREAK: + if s.Label != nil { + block = fn.labelledBlock(s.Label)._break + } else { + for t := fn.targets; t != nil && block == nil; t = t.tail { + block = t._break + } + } + + case token.CONTINUE: + if s.Label != nil { + block = fn.labelledBlock(s.Label)._continue + } else { + for t := fn.targets; t != nil && block == nil; t = t.tail { + block = t._continue + } + } + + case token.FALLTHROUGH: + for t := fn.targets; t != nil && block == nil; t = t.tail { + block = t._fallthrough + } + + case token.GOTO: + block = fn.labelledBlock(s.Label)._goto + } + emitJump(fn, block) + fn.currentBlock = fn.newBasicBlock("unreachable") + + case *ast.BlockStmt: + b.stmtList(fn, s.List) + + case *ast.IfStmt: + if s.Init != nil { + b.stmt(fn, s.Init) + } + then := fn.newBasicBlock("if.then") + done := fn.newBasicBlock("if.done") + els := done + if s.Else != nil { + els = fn.newBasicBlock("if.else") + } + b.cond(fn, s.Cond, then, els) + fn.currentBlock = then + b.stmt(fn, s.Body) + emitJump(fn, done) + + if s.Else != nil { + fn.currentBlock = els + b.stmt(fn, s.Else) + emitJump(fn, done) + } + + fn.currentBlock = done + + case *ast.SwitchStmt: + b.switchStmt(fn, s, label) + + case *ast.TypeSwitchStmt: + b.typeSwitchStmt(fn, s, label) + + case *ast.SelectStmt: + b.selectStmt(fn, s, label) + + case *ast.ForStmt: + b.forStmt(fn, s, label) + + case *ast.RangeStmt: + b.rangeStmt(fn, s, label) + + default: + panic(fmt.Sprintf("unexpected statement kind: %T", s)) + } +} + +// buildFunction builds SSA code for the body of function fn. Idempotent. +func (b *builder) buildFunction(fn *Function) { + if fn.Blocks != nil { + return // building already started + } + + var recvField *ast.FieldList + var body *ast.BlockStmt + var functype *ast.FuncType + switch n := fn.syntax.(type) { + case nil: + return // not a Go source function. (Synthetic, or from object file.) + case *ast.FuncDecl: + functype = n.Type + recvField = n.Recv + body = n.Body + case *ast.FuncLit: + functype = n.Type + body = n.Body + default: + panic(n) + } + + if body == nil { + // External function. + if fn.Params == nil { + // This condition ensures we add a non-empty + // params list once only, but we may attempt + // the degenerate empty case repeatedly. + // TODO(adonovan): opt: don't do that. + + // We set Function.Params even though there is no body + // code to reference them. This simplifies clients. + if recv := fn.Signature.Recv(); recv != nil { + fn.addParamObj(recv) + } + params := fn.Signature.Params() + for i, n := 0, params.Len(); i < n; i++ { + fn.addParamObj(params.At(i)) + } + } + return + } + if fn.Prog.mode&LogSource != 0 { + defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))() + } + fn.startBody() + fn.createSyntacticParams(recvField, functype) + b.stmt(fn, body) + if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) { + // Control fell off the end of the function's body block. + // + // Block optimizations eliminate the current block, if + // unreachable. It is a builder invariant that + // if this no-arg return is ill-typed for + // fn.Signature.Results, this block must be + // unreachable. The sanity checker checks this. + fn.emit(new(RunDefers)) + fn.emit(new(Return)) + } + fn.finishBody() +} + +// buildFuncDecl builds SSA code for the function or method declared +// by decl in package pkg. +// +func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) { + id := decl.Name + if isBlankIdent(id) { + return // discard + } + fn := pkg.values[pkg.info.Defs[id]].(*Function) + if decl.Recv == nil && id.Name == "init" { + var v Call + v.Call.Value = fn + v.setType(types.NewTuple()) + pkg.init.emit(&v) + } + b.buildFunction(fn) +} + +// Build calls Package.Build for each package in prog. +// Building occurs in parallel unless the BuildSerially mode flag was set. +// +// Build is intended for whole-program analysis; a typical compiler +// need only build a single package. +// +// Build is idempotent and thread-safe. +// +func (prog *Program) Build() { + var wg sync.WaitGroup + for _, p := range prog.packages { + if prog.mode&BuildSerially != 0 { + p.Build() + } else { + wg.Add(1) + go func(p *Package) { + p.Build() + wg.Done() + }(p) + } + } + wg.Wait() +} + +// Build builds SSA code for all functions and vars in package p. +// +// Precondition: CreatePackage must have been called for all of p's +// direct imports (and hence its direct imports must have been +// error-free). +// +// Build is idempotent and thread-safe. +// +func (p *Package) Build() { p.buildOnce.Do(p.build) } + +func (p *Package) build() { + if p.info == nil { + return // synthetic package, e.g. "testmain" + } + + // Ensure we have runtime type info for all exported members. + // TODO(adonovan): ideally belongs in memberFromObject, but + // that would require package creation in topological order. + for name, mem := range p.Members { + if ast.IsExported(name) { + p.Prog.needMethodsOf(mem.Type()) + } + } + if p.Prog.mode&LogSource != 0 { + defer logStack("build %s", p)() + } + init := p.init + init.startBody() + + var done *BasicBlock + + if p.Prog.mode&BareInits == 0 { + // Make init() skip if package is already initialized. + initguard := p.Var("init$guard") + doinit := init.newBasicBlock("init.start") + done = init.newBasicBlock("init.done") + emitIf(init, emitLoad(init, initguard), done, doinit) + init.currentBlock = doinit + emitStore(init, initguard, vTrue, token.NoPos) + + // Call the init() function of each package we import. + for _, pkg := range p.Pkg.Imports() { + prereq := p.Prog.packages[pkg] + if prereq == nil { + panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Pkg.Path(), pkg.Path())) + } + var v Call + v.Call.Value = prereq.init + v.Call.pos = init.pos + v.setType(types.NewTuple()) + init.emit(&v) + } + } + + var b builder + + // Initialize package-level vars in correct order. + for _, varinit := range p.info.InitOrder { + if init.Prog.mode&LogSource != 0 { + fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n", + varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos())) + } + if len(varinit.Lhs) == 1 { + // 1:1 initialization: var x, y = a(), b() + var lval lvalue + if v := varinit.Lhs[0]; v.Name() != "_" { + lval = &address{addr: p.values[v].(*Global), pos: v.Pos()} + } else { + lval = blank{} + } + b.assign(init, lval, varinit.Rhs, true, nil) + } else { + // n:1 initialization: var x, y := f() + tuple := b.exprN(init, varinit.Rhs) + for i, v := range varinit.Lhs { + if v.Name() == "_" { + continue + } + emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos()) + } + } + } + + // Build all package-level functions, init functions + // and methods, including unreachable/blank ones. + // We build them in source order, but it's not significant. + for _, file := range p.files { + for _, decl := range file.Decls { + if decl, ok := decl.(*ast.FuncDecl); ok { + b.buildFuncDecl(p, decl) + } + } + } + + // Finish up init(). + if p.Prog.mode&BareInits == 0 { + emitJump(init, done) + init.currentBlock = done + } + init.emit(new(Return)) + init.finishBody() + + p.info = nil // We no longer need ASTs or go/types deductions. + + if p.Prog.mode&SanityCheckFunctions != 0 { + sanityCheckPackage(p) + } +} + +// Like ObjectOf, but panics instead of returning nil. +// Only valid during p's create and build phases. +func (p *Package) objectOf(id *ast.Ident) types.Object { + if o := p.info.ObjectOf(id); o != nil { + return o + } + panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s", + id.Name, p.Prog.Fset.Position(id.Pos()))) +} + +// Like TypeOf, but panics instead of returning nil. +// Only valid during p's create and build phases. +func (p *Package) typeOf(e ast.Expr) types.Type { + if T := p.info.TypeOf(e); T != nil { + return T + } + panic(fmt.Sprintf("no type for %T @ %s", + e, p.Prog.Fset.Position(e.Pos()))) +} diff --git a/vendor/honnef.co/go/tools/ssa/const.go b/vendor/honnef.co/go/tools/ssa/const.go new file mode 100644 index 00000000..f95d9e11 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/const.go @@ -0,0 +1,169 @@ +// Copyright 2013 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 ssa + +// This file defines the Const SSA value type. + +import ( + "fmt" + "go/constant" + "go/token" + "go/types" + "strconv" +) + +// NewConst returns a new constant of the specified value and type. +// val must be valid according to the specification of Const.Value. +// +func NewConst(val constant.Value, typ types.Type) *Const { + return &Const{typ, val} +} + +// intConst returns an 'int' constant that evaluates to i. +// (i is an int64 in case the host is narrower than the target.) +func intConst(i int64) *Const { + return NewConst(constant.MakeInt64(i), tInt) +} + +// nilConst returns a nil constant of the specified type, which may +// be any reference type, including interfaces. +// +func nilConst(typ types.Type) *Const { + return NewConst(nil, typ) +} + +// stringConst returns a 'string' constant that evaluates to s. +func stringConst(s string) *Const { + return NewConst(constant.MakeString(s), tString) +} + +// zeroConst returns a new "zero" constant of the specified type, +// which must not be an array or struct type: the zero values of +// aggregates are well-defined but cannot be represented by Const. +// +func zeroConst(t types.Type) *Const { + switch t := t.(type) { + case *types.Basic: + switch { + case t.Info()&types.IsBoolean != 0: + return NewConst(constant.MakeBool(false), t) + case t.Info()&types.IsNumeric != 0: + return NewConst(constant.MakeInt64(0), t) + case t.Info()&types.IsString != 0: + return NewConst(constant.MakeString(""), t) + case t.Kind() == types.UnsafePointer: + fallthrough + case t.Kind() == types.UntypedNil: + return nilConst(t) + default: + panic(fmt.Sprint("zeroConst for unexpected type:", t)) + } + case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature: + return nilConst(t) + case *types.Named: + return NewConst(zeroConst(t.Underlying()).Value, t) + case *types.Array, *types.Struct, *types.Tuple: + panic(fmt.Sprint("zeroConst applied to aggregate:", t)) + } + panic(fmt.Sprint("zeroConst: unexpected ", t)) +} + +func (c *Const) RelString(from *types.Package) string { + var s string + if c.Value == nil { + s = "nil" + } else if c.Value.Kind() == constant.String { + s = constant.StringVal(c.Value) + const max = 20 + // TODO(adonovan): don't cut a rune in half. + if len(s) > max { + s = s[:max-3] + "..." // abbreviate + } + s = strconv.Quote(s) + } else { + s = c.Value.String() + } + return s + ":" + relType(c.Type(), from) +} + +func (c *Const) Name() string { + return c.RelString(nil) +} + +func (c *Const) String() string { + return c.Name() +} + +func (c *Const) Type() types.Type { + return c.typ +} + +func (c *Const) Referrers() *[]Instruction { + return nil +} + +func (c *Const) Parent() *Function { return nil } + +func (c *Const) Pos() token.Pos { + return token.NoPos +} + +// IsNil returns true if this constant represents a typed or untyped nil value. +func (c *Const) IsNil() bool { + return c.Value == nil +} + +// TODO(adonovan): move everything below into honnef.co/go/tools/ssa/interp. + +// Int64 returns the numeric value of this constant truncated to fit +// a signed 64-bit integer. +// +func (c *Const) Int64() int64 { + switch x := constant.ToInt(c.Value); x.Kind() { + case constant.Int: + if i, ok := constant.Int64Val(x); ok { + return i + } + return 0 + case constant.Float: + f, _ := constant.Float64Val(x) + return int64(f) + } + panic(fmt.Sprintf("unexpected constant value: %T", c.Value)) +} + +// Uint64 returns the numeric value of this constant truncated to fit +// an unsigned 64-bit integer. +// +func (c *Const) Uint64() uint64 { + switch x := constant.ToInt(c.Value); x.Kind() { + case constant.Int: + if u, ok := constant.Uint64Val(x); ok { + return u + } + return 0 + case constant.Float: + f, _ := constant.Float64Val(x) + return uint64(f) + } + panic(fmt.Sprintf("unexpected constant value: %T", c.Value)) +} + +// Float64 returns the numeric value of this constant truncated to fit +// a float64. +// +func (c *Const) Float64() float64 { + f, _ := constant.Float64Val(c.Value) + return f +} + +// Complex128 returns the complex value of this constant truncated to +// fit a complex128. +// +func (c *Const) Complex128() complex128 { + re, _ := constant.Float64Val(constant.Real(c.Value)) + im, _ := constant.Float64Val(constant.Imag(c.Value)) + return complex(re, im) +} diff --git a/vendor/honnef.co/go/tools/ssa/create.go b/vendor/honnef.co/go/tools/ssa/create.go new file mode 100644 index 00000000..85163a0c --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/create.go @@ -0,0 +1,270 @@ +// Copyright 2013 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 ssa + +// This file implements the CREATE phase of SSA construction. +// See builder.go for explanation. + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "os" + "sync" + + "golang.org/x/tools/go/types/typeutil" +) + +// NewProgram returns a new SSA Program. +// +// mode controls diagnostics and checking during SSA construction. +// +func NewProgram(fset *token.FileSet, mode BuilderMode) *Program { + prog := &Program{ + Fset: fset, + imported: make(map[string]*Package), + packages: make(map[*types.Package]*Package), + thunks: make(map[selectionKey]*Function), + bounds: make(map[*types.Func]*Function), + mode: mode, + } + + h := typeutil.MakeHasher() // protected by methodsMu, in effect + prog.methodSets.SetHasher(h) + prog.canon.SetHasher(h) + + return prog +} + +// memberFromObject populates package pkg with a member for the +// typechecker object obj. +// +// For objects from Go source code, syntax is the associated syntax +// tree (for funcs and vars only); it will be used during the build +// phase. +// +func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) { + name := obj.Name() + switch obj := obj.(type) { + case *types.Builtin: + if pkg.Pkg != types.Unsafe { + panic("unexpected builtin object: " + obj.String()) + } + + case *types.TypeName: + pkg.Members[name] = &Type{ + object: obj, + pkg: pkg, + } + + case *types.Const: + c := &NamedConst{ + object: obj, + Value: NewConst(obj.Val(), obj.Type()), + pkg: pkg, + } + pkg.values[obj] = c.Value + pkg.Members[name] = c + + case *types.Var: + g := &Global{ + Pkg: pkg, + name: name, + object: obj, + typ: types.NewPointer(obj.Type()), // address + pos: obj.Pos(), + } + pkg.values[obj] = g + pkg.Members[name] = g + + case *types.Func: + sig := obj.Type().(*types.Signature) + if sig.Recv() == nil && name == "init" { + pkg.ninit++ + name = fmt.Sprintf("init#%d", pkg.ninit) + } + fn := &Function{ + name: name, + object: obj, + Signature: sig, + syntax: syntax, + pos: obj.Pos(), + Pkg: pkg, + Prog: pkg.Prog, + } + if syntax == nil { + fn.Synthetic = "loaded from gc object file" + } + + pkg.values[obj] = fn + if sig.Recv() == nil { + pkg.Members[name] = fn // package-level function + } + + default: // (incl. *types.Package) + panic("unexpected Object type: " + obj.String()) + } +} + +// membersFromDecl populates package pkg with members for each +// typechecker object (var, func, const or type) associated with the +// specified decl. +// +func membersFromDecl(pkg *Package, decl ast.Decl) { + switch decl := decl.(type) { + case *ast.GenDecl: // import, const, type or var + switch decl.Tok { + case token.CONST: + for _, spec := range decl.Specs { + for _, id := range spec.(*ast.ValueSpec).Names { + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], nil) + } + } + } + + case token.VAR: + for _, spec := range decl.Specs { + for _, id := range spec.(*ast.ValueSpec).Names { + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], spec) + } + } + } + + case token.TYPE: + for _, spec := range decl.Specs { + id := spec.(*ast.TypeSpec).Name + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], nil) + } + } + } + + case *ast.FuncDecl: + id := decl.Name + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], decl) + } + } +} + +// CreatePackage constructs and returns an SSA Package from the +// specified type-checked, error-free file ASTs, and populates its +// Members mapping. +// +// importable determines whether this package should be returned by a +// subsequent call to ImportedPackage(pkg.Path()). +// +// The real work of building SSA form for each function is not done +// until a subsequent call to Package.Build(). +// +func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *types.Info, importable bool) *Package { + p := &Package{ + Prog: prog, + Members: make(map[string]Member), + values: make(map[types.Object]Value), + Pkg: pkg, + info: info, // transient (CREATE and BUILD phases) + files: files, // transient (CREATE and BUILD phases) + } + + // Add init() function. + p.init = &Function{ + name: "init", + Signature: new(types.Signature), + Synthetic: "package initializer", + Pkg: p, + Prog: prog, + } + p.Members[p.init.name] = p.init + + // CREATE phase. + // Allocate all package members: vars, funcs, consts and types. + if len(files) > 0 { + // Go source package. + for _, file := range files { + for _, decl := range file.Decls { + membersFromDecl(p, decl) + } + } + } else { + // GC-compiled binary package (or "unsafe") + // No code. + // No position information. + scope := p.Pkg.Scope() + for _, name := range scope.Names() { + obj := scope.Lookup(name) + memberFromObject(p, obj, nil) + if obj, ok := obj.(*types.TypeName); ok { + if named, ok := obj.Type().(*types.Named); ok { + for i, n := 0, named.NumMethods(); i < n; i++ { + memberFromObject(p, named.Method(i), nil) + } + } + } + } + } + + if prog.mode&BareInits == 0 { + // Add initializer guard variable. + initguard := &Global{ + Pkg: p, + name: "init$guard", + typ: types.NewPointer(tBool), + } + p.Members[initguard.Name()] = initguard + } + + if prog.mode&GlobalDebug != 0 { + p.SetDebugMode(true) + } + + if prog.mode&PrintPackages != 0 { + printMu.Lock() + p.WriteTo(os.Stdout) + printMu.Unlock() + } + + if importable { + prog.imported[p.Pkg.Path()] = p + } + prog.packages[p.Pkg] = p + + return p +} + +// printMu serializes printing of Packages/Functions to stdout. +var printMu sync.Mutex + +// AllPackages returns a new slice containing all packages in the +// program prog in unspecified order. +// +func (prog *Program) AllPackages() []*Package { + pkgs := make([]*Package, 0, len(prog.packages)) + for _, pkg := range prog.packages { + pkgs = append(pkgs, pkg) + } + return pkgs +} + +// ImportedPackage returns the importable Package whose PkgPath +// is path, or nil if no such Package has been created. +// +// A parameter to CreatePackage determines whether a package should be +// considered importable. For example, no import declaration can resolve +// to the ad-hoc main package created by 'go build foo.go'. +// +// TODO(adonovan): rethink this function and the "importable" concept; +// most packages are importable. This function assumes that all +// types.Package.Path values are unique within the ssa.Program, which is +// false---yet this function remains very convenient. +// Clients should use (*Program).Package instead where possible. +// SSA doesn't really need a string-keyed map of packages. +// +func (prog *Program) ImportedPackage(path string) *Package { + return prog.imported[path] +} diff --git a/vendor/honnef.co/go/tools/ssa/doc.go b/vendor/honnef.co/go/tools/ssa/doc.go new file mode 100644 index 00000000..0f71fda0 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/doc.go @@ -0,0 +1,125 @@ +// Copyright 2013 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 ssa defines a representation of the elements of Go programs +// (packages, types, functions, variables and constants) using a +// static single-assignment (SSA) form intermediate representation +// (IR) for the bodies of functions. +// +// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE. +// +// For an introduction to SSA form, see +// http://en.wikipedia.org/wiki/Static_single_assignment_form. +// This page provides a broader reading list: +// http://www.dcs.gla.ac.uk/~jsinger/ssa.html. +// +// The level of abstraction of the SSA form is intentionally close to +// the source language to facilitate construction of source analysis +// tools. It is not intended for machine code generation. +// +// All looping, branching and switching constructs are replaced with +// unstructured control flow. Higher-level control flow constructs +// such as multi-way branch can be reconstructed as needed; see +// ssautil.Switches() for an example. +// +// The simplest way to create the SSA representation of a package is +// to load typed syntax trees using golang.org/x/tools/go/packages, then +// invoke the ssautil.Packages helper function. See ExampleLoadPackages +// and ExampleWholeProgram for examples. +// The resulting ssa.Program contains all the packages and their +// members, but SSA code is not created for function bodies until a +// subsequent call to (*Package).Build or (*Program).Build. +// +// The builder initially builds a naive SSA form in which all local +// variables are addresses of stack locations with explicit loads and +// stores. Registerisation of eligible locals and φ-node insertion +// using dominance and dataflow are then performed as a second pass +// called "lifting" to improve the accuracy and performance of +// subsequent analyses; this pass can be skipped by setting the +// NaiveForm builder flag. +// +// The primary interfaces of this package are: +// +// - Member: a named member of a Go package. +// - Value: an expression that yields a value. +// - Instruction: a statement that consumes values and performs computation. +// - Node: a Value or Instruction (emphasizing its membership in the SSA value graph) +// +// A computation that yields a result implements both the Value and +// Instruction interfaces. The following table shows for each +// concrete type which of these interfaces it implements. +// +// Value? Instruction? Member? +// *Alloc ✔ ✔ +// *BinOp ✔ ✔ +// *Builtin ✔ +// *Call ✔ ✔ +// *ChangeInterface ✔ ✔ +// *ChangeType ✔ ✔ +// *Const ✔ +// *Convert ✔ ✔ +// *DebugRef ✔ +// *Defer ✔ +// *Extract ✔ ✔ +// *Field ✔ ✔ +// *FieldAddr ✔ ✔ +// *FreeVar ✔ +// *Function ✔ ✔ (func) +// *Global ✔ ✔ (var) +// *Go ✔ +// *If ✔ +// *Index ✔ ✔ +// *IndexAddr ✔ ✔ +// *Jump ✔ +// *Lookup ✔ ✔ +// *MakeChan ✔ ✔ +// *MakeClosure ✔ ✔ +// *MakeInterface ✔ ✔ +// *MakeMap ✔ ✔ +// *MakeSlice ✔ ✔ +// *MapUpdate ✔ +// *NamedConst ✔ (const) +// *Next ✔ ✔ +// *Panic ✔ +// *Parameter ✔ +// *Phi ✔ ✔ +// *Range ✔ ✔ +// *Return ✔ +// *RunDefers ✔ +// *Select ✔ ✔ +// *Send ✔ +// *Slice ✔ ✔ +// *Store ✔ +// *Type ✔ (type) +// *TypeAssert ✔ ✔ +// *UnOp ✔ ✔ +// +// Other key types in this package include: Program, Package, Function +// and BasicBlock. +// +// The program representation constructed by this package is fully +// resolved internally, i.e. it does not rely on the names of Values, +// Packages, Functions, Types or BasicBlocks for the correct +// interpretation of the program. Only the identities of objects and +// the topology of the SSA and type graphs are semantically +// significant. (There is one exception: Ids, used to identify field +// and method names, contain strings.) Avoidance of name-based +// operations simplifies the implementation of subsequent passes and +// can make them very efficient. Many objects are nonetheless named +// to aid in debugging, but it is not essential that the names be +// either accurate or unambiguous. The public API exposes a number of +// name-based maps for client convenience. +// +// The ssa/ssautil package provides various utilities that depend only +// on the public API of this package. +// +// TODO(adonovan): Consider the exceptional control-flow implications +// of defer and recover(). +// +// TODO(adonovan): write a how-to document for all the various cases +// of trying to determine corresponding elements across the four +// domains of source locations, ast.Nodes, types.Objects, +// ssa.Values/Instructions. +// +package ssa // import "honnef.co/go/tools/ssa" diff --git a/vendor/honnef.co/go/tools/ssa/dom.go b/vendor/honnef.co/go/tools/ssa/dom.go new file mode 100644 index 00000000..a036be87 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/dom.go @@ -0,0 +1,343 @@ +// Copyright 2013 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 ssa + +// This file defines algorithms related to dominance. + +// Dominator tree construction ---------------------------------------- +// +// We use the algorithm described in Lengauer & Tarjan. 1979. A fast +// algorithm for finding dominators in a flowgraph. +// http://doi.acm.org/10.1145/357062.357071 +// +// We also apply the optimizations to SLT described in Georgiadis et +// al, Finding Dominators in Practice, JGAA 2006, +// http://jgaa.info/accepted/2006/GeorgiadisTarjanWerneck2006.10.1.pdf +// to avoid the need for buckets of size > 1. + +import ( + "bytes" + "fmt" + "math/big" + "os" + "sort" +) + +// Idom returns the block that immediately dominates b: +// its parent in the dominator tree, if any. +// Neither the entry node (b.Index==0) nor recover node +// (b==b.Parent().Recover()) have a parent. +// +func (b *BasicBlock) Idom() *BasicBlock { return b.dom.idom } + +// Dominees returns the list of blocks that b immediately dominates: +// its children in the dominator tree. +// +func (b *BasicBlock) Dominees() []*BasicBlock { return b.dom.children } + +// Dominates reports whether b dominates c. +func (b *BasicBlock) Dominates(c *BasicBlock) bool { + return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post +} + +type byDomPreorder []*BasicBlock + +func (a byDomPreorder) Len() int { return len(a) } +func (a byDomPreorder) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre } + +// DomPreorder returns a new slice containing the blocks of f in +// dominator tree preorder. +// +func (f *Function) DomPreorder() []*BasicBlock { + n := len(f.Blocks) + order := make(byDomPreorder, n) + copy(order, f.Blocks) + sort.Sort(order) + return order +} + +// domInfo contains a BasicBlock's dominance information. +type domInfo struct { + idom *BasicBlock // immediate dominator (parent in domtree) + children []*BasicBlock // nodes immediately dominated by this one + pre, post int32 // pre- and post-order numbering within domtree +} + +// ltState holds the working state for Lengauer-Tarjan algorithm +// (during which domInfo.pre is repurposed for CFG DFS preorder number). +type ltState struct { + // Each slice is indexed by b.Index. + sdom []*BasicBlock // b's semidominator + parent []*BasicBlock // b's parent in DFS traversal of CFG + ancestor []*BasicBlock // b's ancestor with least sdom +} + +// dfs implements the depth-first search part of the LT algorithm. +func (lt *ltState) dfs(v *BasicBlock, i int32, preorder []*BasicBlock) int32 { + preorder[i] = v + v.dom.pre = i // For now: DFS preorder of spanning tree of CFG + i++ + lt.sdom[v.Index] = v + lt.link(nil, v) + for _, w := range v.Succs { + if lt.sdom[w.Index] == nil { + lt.parent[w.Index] = v + i = lt.dfs(w, i, preorder) + } + } + return i +} + +// eval implements the EVAL part of the LT algorithm. +func (lt *ltState) eval(v *BasicBlock) *BasicBlock { + // TODO(adonovan): opt: do path compression per simple LT. + u := v + for ; lt.ancestor[v.Index] != nil; v = lt.ancestor[v.Index] { + if lt.sdom[v.Index].dom.pre < lt.sdom[u.Index].dom.pre { + u = v + } + } + return u +} + +// link implements the LINK part of the LT algorithm. +func (lt *ltState) link(v, w *BasicBlock) { + lt.ancestor[w.Index] = v +} + +// buildDomTree computes the dominator tree of f using the LT algorithm. +// Precondition: all blocks are reachable (e.g. optimizeBlocks has been run). +// +func buildDomTree(f *Function) { + // The step numbers refer to the original LT paper; the + // reordering is due to Georgiadis. + + // Clear any previous domInfo. + for _, b := range f.Blocks { + b.dom = domInfo{} + } + + n := len(f.Blocks) + // Allocate space for 5 contiguous [n]*BasicBlock arrays: + // sdom, parent, ancestor, preorder, buckets. + space := make([]*BasicBlock, 5*n) + lt := ltState{ + sdom: space[0:n], + parent: space[n : 2*n], + ancestor: space[2*n : 3*n], + } + + // Step 1. Number vertices by depth-first preorder. + preorder := space[3*n : 4*n] + root := f.Blocks[0] + prenum := lt.dfs(root, 0, preorder) + recover := f.Recover + if recover != nil { + lt.dfs(recover, prenum, preorder) + } + + buckets := space[4*n : 5*n] + copy(buckets, preorder) + + // In reverse preorder... + for i := int32(n) - 1; i > 0; i-- { + w := preorder[i] + + // Step 3. Implicitly define the immediate dominator of each node. + for v := buckets[i]; v != w; v = buckets[v.dom.pre] { + u := lt.eval(v) + if lt.sdom[u.Index].dom.pre < i { + v.dom.idom = u + } else { + v.dom.idom = w + } + } + + // Step 2. Compute the semidominators of all nodes. + lt.sdom[w.Index] = lt.parent[w.Index] + for _, v := range w.Preds { + u := lt.eval(v) + if lt.sdom[u.Index].dom.pre < lt.sdom[w.Index].dom.pre { + lt.sdom[w.Index] = lt.sdom[u.Index] + } + } + + lt.link(lt.parent[w.Index], w) + + if lt.parent[w.Index] == lt.sdom[w.Index] { + w.dom.idom = lt.parent[w.Index] + } else { + buckets[i] = buckets[lt.sdom[w.Index].dom.pre] + buckets[lt.sdom[w.Index].dom.pre] = w + } + } + + // The final 'Step 3' is now outside the loop. + for v := buckets[0]; v != root; v = buckets[v.dom.pre] { + v.dom.idom = root + } + + // Step 4. Explicitly define the immediate dominator of each + // node, in preorder. + for _, w := range preorder[1:] { + if w == root || w == recover { + w.dom.idom = nil + } else { + if w.dom.idom != lt.sdom[w.Index] { + w.dom.idom = w.dom.idom.dom.idom + } + // Calculate Children relation as inverse of Idom. + w.dom.idom.dom.children = append(w.dom.idom.dom.children, w) + } + } + + pre, post := numberDomTree(root, 0, 0) + if recover != nil { + numberDomTree(recover, pre, post) + } + + // printDomTreeDot(os.Stderr, f) // debugging + // printDomTreeText(os.Stderr, root, 0) // debugging + + if f.Prog.mode&SanityCheckFunctions != 0 { + sanityCheckDomTree(f) + } +} + +// numberDomTree sets the pre- and post-order numbers of a depth-first +// traversal of the dominator tree rooted at v. These are used to +// answer dominance queries in constant time. +// +func numberDomTree(v *BasicBlock, pre, post int32) (int32, int32) { + v.dom.pre = pre + pre++ + for _, child := range v.dom.children { + pre, post = numberDomTree(child, pre, post) + } + v.dom.post = post + post++ + return pre, post +} + +// Testing utilities ---------------------------------------- + +// sanityCheckDomTree checks the correctness of the dominator tree +// computed by the LT algorithm by comparing against the dominance +// relation computed by a naive Kildall-style forward dataflow +// analysis (Algorithm 10.16 from the "Dragon" book). +// +func sanityCheckDomTree(f *Function) { + n := len(f.Blocks) + + // D[i] is the set of blocks that dominate f.Blocks[i], + // represented as a bit-set of block indices. + D := make([]big.Int, n) + + one := big.NewInt(1) + + // all is the set of all blocks; constant. + var all big.Int + all.Set(one).Lsh(&all, uint(n)).Sub(&all, one) + + // Initialization. + for i, b := range f.Blocks { + if i == 0 || b == f.Recover { + // A root is dominated only by itself. + D[i].SetBit(&D[0], 0, 1) + } else { + // All other blocks are (initially) dominated + // by every block. + D[i].Set(&all) + } + } + + // Iteration until fixed point. + for changed := true; changed; { + changed = false + for i, b := range f.Blocks { + if i == 0 || b == f.Recover { + continue + } + // Compute intersection across predecessors. + var x big.Int + x.Set(&all) + for _, pred := range b.Preds { + x.And(&x, &D[pred.Index]) + } + x.SetBit(&x, i, 1) // a block always dominates itself. + if D[i].Cmp(&x) != 0 { + D[i].Set(&x) + changed = true + } + } + } + + // Check the entire relation. O(n^2). + // The Recover block (if any) must be treated specially so we skip it. + ok := true + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + b, c := f.Blocks[i], f.Blocks[j] + if c == f.Recover { + continue + } + actual := b.Dominates(c) + expected := D[j].Bit(i) == 1 + if actual != expected { + fmt.Fprintf(os.Stderr, "dominates(%s, %s)==%t, want %t\n", b, c, actual, expected) + ok = false + } + } + } + + preorder := f.DomPreorder() + for _, b := range f.Blocks { + if got := preorder[b.dom.pre]; got != b { + fmt.Fprintf(os.Stderr, "preorder[%d]==%s, want %s\n", b.dom.pre, got, b) + ok = false + } + } + + if !ok { + panic("sanityCheckDomTree failed for " + f.String()) + } + +} + +// Printing functions ---------------------------------------- + +// printDomTree prints the dominator tree as text, using indentation. +//lint:ignore U1000 used during debugging +func printDomTreeText(buf *bytes.Buffer, v *BasicBlock, indent int) { + fmt.Fprintf(buf, "%*s%s\n", 4*indent, "", v) + for _, child := range v.dom.children { + printDomTreeText(buf, child, indent+1) + } +} + +// printDomTreeDot prints the dominator tree of f in AT&T GraphViz +// (.dot) format. +//lint:ignore U1000 used during debugging +func printDomTreeDot(buf *bytes.Buffer, f *Function) { + fmt.Fprintln(buf, "//", f) + fmt.Fprintln(buf, "digraph domtree {") + for i, b := range f.Blocks { + v := b.dom + fmt.Fprintf(buf, "\tn%d [label=\"%s (%d, %d)\",shape=\"rectangle\"];\n", v.pre, b, v.pre, v.post) + // TODO(adonovan): improve appearance of edges + // belonging to both dominator tree and CFG. + + // Dominator tree edge. + if i != 0 { + fmt.Fprintf(buf, "\tn%d -> n%d [style=\"solid\",weight=100];\n", v.idom.dom.pre, v.pre) + } + // CFG edges. + for _, pred := range b.Preds { + fmt.Fprintf(buf, "\tn%d -> n%d [style=\"dotted\",weight=0];\n", pred.dom.pre, v.pre) + } + } + fmt.Fprintln(buf, "}") +} diff --git a/vendor/honnef.co/go/tools/ssa/emit.go b/vendor/honnef.co/go/tools/ssa/emit.go new file mode 100644 index 00000000..6bf9ec32 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/emit.go @@ -0,0 +1,469 @@ +// Copyright 2013 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 ssa + +// Helpers for emitting SSA instructions. + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" +) + +// emitNew emits to f a new (heap Alloc) instruction allocating an +// object of type typ. pos is the optional source location. +// +func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc { + v := &Alloc{Heap: true} + v.setType(types.NewPointer(typ)) + v.setPos(pos) + f.emit(v) + return v +} + +// emitLoad emits to f an instruction to load the address addr into a +// new temporary, and returns the value so defined. +// +func emitLoad(f *Function, addr Value) *UnOp { + v := &UnOp{Op: token.MUL, X: addr} + v.setType(deref(addr.Type())) + f.emit(v) + return v +} + +// emitDebugRef emits to f a DebugRef pseudo-instruction associating +// expression e with value v. +// +func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) { + if !f.debugInfo() { + return // debugging not enabled + } + if v == nil || e == nil { + panic("nil") + } + var obj types.Object + e = unparen(e) + if id, ok := e.(*ast.Ident); ok { + if isBlankIdent(id) { + return + } + obj = f.Pkg.objectOf(id) + switch obj.(type) { + case *types.Nil, *types.Const, *types.Builtin: + return + } + } + f.emit(&DebugRef{ + X: v, + Expr: e, + IsAddr: isAddr, + object: obj, + }) +} + +// emitArith emits to f code to compute the binary operation op(x, y) +// where op is an eager shift, logical or arithmetic operation. +// (Use emitCompare() for comparisons and Builder.logicalBinop() for +// non-eager operations.) +// +func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value { + switch op { + case token.SHL, token.SHR: + x = emitConv(f, x, t) + // y may be signed or an 'untyped' constant. + // TODO(adonovan): whence signed values? + if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 { + y = emitConv(f, y, types.Typ[types.Uint64]) + } + + case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT: + x = emitConv(f, x, t) + y = emitConv(f, y, t) + + default: + panic("illegal op in emitArith: " + op.String()) + + } + v := &BinOp{ + Op: op, + X: x, + Y: y, + } + v.setPos(pos) + v.setType(t) + return f.emit(v) +} + +// emitCompare emits to f code compute the boolean result of +// comparison comparison 'x op y'. +// +func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value { + xt := x.Type().Underlying() + yt := y.Type().Underlying() + + // Special case to optimise a tagless SwitchStmt so that + // these are equivalent + // switch { case e: ...} + // switch true { case e: ... } + // if e==true { ... } + // even in the case when e's type is an interface. + // TODO(adonovan): opt: generalise to x==true, false!=y, etc. + if x == vTrue && op == token.EQL { + if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 { + return y + } + } + + if types.Identical(xt, yt) { + // no conversion necessary + } else if _, ok := xt.(*types.Interface); ok { + y = emitConv(f, y, x.Type()) + } else if _, ok := yt.(*types.Interface); ok { + x = emitConv(f, x, y.Type()) + } else if _, ok := x.(*Const); ok { + x = emitConv(f, x, y.Type()) + } else if _, ok := y.(*Const); ok { + y = emitConv(f, y, x.Type()) + //lint:ignore SA9003 no-op + } else { + // other cases, e.g. channels. No-op. + } + + v := &BinOp{ + Op: op, + X: x, + Y: y, + } + v.setPos(pos) + v.setType(tBool) + return f.emit(v) +} + +// isValuePreserving returns true if a conversion from ut_src to +// ut_dst is value-preserving, i.e. just a change of type. +// Precondition: neither argument is a named type. +// +func isValuePreserving(ut_src, ut_dst types.Type) bool { + // Identical underlying types? + if structTypesIdentical(ut_dst, ut_src) { + return true + } + + switch ut_dst.(type) { + case *types.Chan: + // Conversion between channel types? + _, ok := ut_src.(*types.Chan) + return ok + + case *types.Pointer: + // Conversion between pointers with identical base types? + _, ok := ut_src.(*types.Pointer) + return ok + } + return false +} + +// emitConv emits to f code to convert Value val to exactly type typ, +// and returns the converted value. Implicit conversions are required +// by language assignability rules in assignments, parameter passing, +// etc. Conversions cannot fail dynamically. +// +func emitConv(f *Function, val Value, typ types.Type) Value { + t_src := val.Type() + + // Identical types? Conversion is a no-op. + if types.Identical(t_src, typ) { + return val + } + + ut_dst := typ.Underlying() + ut_src := t_src.Underlying() + + // Just a change of type, but not value or representation? + if isValuePreserving(ut_src, ut_dst) { + c := &ChangeType{X: val} + c.setType(typ) + return f.emit(c) + } + + // Conversion to, or construction of a value of, an interface type? + if _, ok := ut_dst.(*types.Interface); ok { + // Assignment from one interface type to another? + if _, ok := ut_src.(*types.Interface); ok { + c := &ChangeInterface{X: val} + c.setType(typ) + return f.emit(c) + } + + // Untyped nil constant? Return interface-typed nil constant. + if ut_src == tUntypedNil { + return nilConst(typ) + } + + // Convert (non-nil) "untyped" literals to their default type. + if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 { + val = emitConv(f, val, DefaultType(ut_src)) + } + + f.Pkg.Prog.needMethodsOf(val.Type()) + mi := &MakeInterface{X: val} + mi.setType(typ) + return f.emit(mi) + } + + // Conversion of a compile-time constant value? + if c, ok := val.(*Const); ok { + if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() { + // Conversion of a compile-time constant to + // another constant type results in a new + // constant of the destination type and + // (initially) the same abstract value. + // We don't truncate the value yet. + return NewConst(c.Value, typ) + } + + // We're converting from constant to non-constant type, + // e.g. string -> []byte/[]rune. + } + + // A representation-changing conversion? + // At least one of {ut_src,ut_dst} must be *Basic. + // (The other may be []byte or []rune.) + _, ok1 := ut_src.(*types.Basic) + _, ok2 := ut_dst.(*types.Basic) + if ok1 || ok2 { + c := &Convert{X: val} + c.setType(typ) + return f.emit(c) + } + + panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ)) +} + +// emitStore emits to f an instruction to store value val at location +// addr, applying implicit conversions as required by assignability rules. +// +func emitStore(f *Function, addr, val Value, pos token.Pos) *Store { + s := &Store{ + Addr: addr, + Val: emitConv(f, val, deref(addr.Type())), + pos: pos, + } + f.emit(s) + return s +} + +// emitJump emits to f a jump to target, and updates the control-flow graph. +// Postcondition: f.currentBlock is nil. +// +func emitJump(f *Function, target *BasicBlock) { + b := f.currentBlock + b.emit(new(Jump)) + addEdge(b, target) + f.currentBlock = nil +} + +// emitIf emits to f a conditional jump to tblock or fblock based on +// cond, and updates the control-flow graph. +// Postcondition: f.currentBlock is nil. +// +func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) { + b := f.currentBlock + b.emit(&If{Cond: cond}) + addEdge(b, tblock) + addEdge(b, fblock) + f.currentBlock = nil +} + +// emitExtract emits to f an instruction to extract the index'th +// component of tuple. It returns the extracted value. +// +func emitExtract(f *Function, tuple Value, index int) Value { + e := &Extract{Tuple: tuple, Index: index} + e.setType(tuple.Type().(*types.Tuple).At(index).Type()) + return f.emit(e) +} + +// emitTypeAssert emits to f a type assertion value := x.(t) and +// returns the value. x.Type() must be an interface. +// +func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value { + a := &TypeAssert{X: x, AssertedType: t} + a.setPos(pos) + a.setType(t) + return f.emit(a) +} + +// emitTypeTest emits to f a type test value,ok := x.(t) and returns +// a (value, ok) tuple. x.Type() must be an interface. +// +func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value { + a := &TypeAssert{ + X: x, + AssertedType: t, + CommaOk: true, + } + a.setPos(pos) + a.setType(types.NewTuple( + newVar("value", t), + varOk, + )) + return f.emit(a) +} + +// emitTailCall emits to f a function call in tail position. The +// caller is responsible for all fields of 'call' except its type. +// Intended for wrapper methods. +// Precondition: f does/will not use deferred procedure calls. +// Postcondition: f.currentBlock is nil. +// +func emitTailCall(f *Function, call *Call) { + tresults := f.Signature.Results() + nr := tresults.Len() + if nr == 1 { + call.typ = tresults.At(0).Type() + } else { + call.typ = tresults + } + tuple := f.emit(call) + var ret Return + switch nr { + case 0: + // no-op + case 1: + ret.Results = []Value{tuple} + default: + for i := 0; i < nr; i++ { + v := emitExtract(f, tuple, i) + // TODO(adonovan): in principle, this is required: + // v = emitConv(f, o.Type, f.Signature.Results[i].Type) + // but in practice emitTailCall is only used when + // the types exactly match. + ret.Results = append(ret.Results, v) + } + } + f.emit(&ret) + f.currentBlock = nil +} + +// emitImplicitSelections emits to f code to apply the sequence of +// implicit field selections specified by indices to base value v, and +// returns the selected value. +// +// If v is the address of a struct, the result will be the address of +// a field; if it is the value of a struct, the result will be the +// value of a field. +// +func emitImplicitSelections(f *Function, v Value, indices []int) Value { + for _, index := range indices { + fld := deref(v.Type()).Underlying().(*types.Struct).Field(index) + + if isPointer(v.Type()) { + instr := &FieldAddr{ + X: v, + Field: index, + } + instr.setType(types.NewPointer(fld.Type())) + v = f.emit(instr) + // Load the field's value iff indirectly embedded. + if isPointer(fld.Type()) { + v = emitLoad(f, v) + } + } else { + instr := &Field{ + X: v, + Field: index, + } + instr.setType(fld.Type()) + v = f.emit(instr) + } + } + return v +} + +// emitFieldSelection emits to f code to select the index'th field of v. +// +// If wantAddr, the input must be a pointer-to-struct and the result +// will be the field's address; otherwise the result will be the +// field's value. +// Ident id is used for position and debug info. +// +func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value { + fld := deref(v.Type()).Underlying().(*types.Struct).Field(index) + if isPointer(v.Type()) { + instr := &FieldAddr{ + X: v, + Field: index, + } + instr.setPos(id.Pos()) + instr.setType(types.NewPointer(fld.Type())) + v = f.emit(instr) + // Load the field's value iff we don't want its address. + if !wantAddr { + v = emitLoad(f, v) + } + } else { + instr := &Field{ + X: v, + Field: index, + } + instr.setPos(id.Pos()) + instr.setType(fld.Type()) + v = f.emit(instr) + } + emitDebugRef(f, id, v, wantAddr) + return v +} + +// zeroValue emits to f code to produce a zero value of type t, +// and returns it. +// +func zeroValue(f *Function, t types.Type) Value { + switch t.Underlying().(type) { + case *types.Struct, *types.Array: + return emitLoad(f, f.addLocal(t, token.NoPos)) + default: + return zeroConst(t) + } +} + +// createRecoverBlock emits to f a block of code to return after a +// recovered panic, and sets f.Recover to it. +// +// If f's result parameters are named, the code loads and returns +// their current values, otherwise it returns the zero values of their +// type. +// +// Idempotent. +// +func createRecoverBlock(f *Function) { + if f.Recover != nil { + return // already created + } + saved := f.currentBlock + + f.Recover = f.newBasicBlock("recover") + f.currentBlock = f.Recover + + var results []Value + if f.namedResults != nil { + // Reload NRPs to form value tuple. + for _, r := range f.namedResults { + results = append(results, emitLoad(f, r)) + } + } else { + R := f.Signature.Results() + for i, n := 0, R.Len(); i < n; i++ { + T := R.At(i).Type() + + // Return zero value of each result type. + results = append(results, zeroValue(f, T)) + } + } + f.emit(&Return{Results: results}) + + f.currentBlock = saved +} diff --git a/vendor/honnef.co/go/tools/ssa/func.go b/vendor/honnef.co/go/tools/ssa/func.go new file mode 100644 index 00000000..222eea64 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/func.go @@ -0,0 +1,765 @@ +// Copyright 2013 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 ssa + +// This file implements the Function and BasicBlock types. + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + "go/types" + "io" + "os" + "strings" +) + +// addEdge adds a control-flow graph edge from from to to. +func addEdge(from, to *BasicBlock) { + from.Succs = append(from.Succs, to) + to.Preds = append(to.Preds, from) +} + +// Parent returns the function that contains block b. +func (b *BasicBlock) Parent() *Function { return b.parent } + +// String returns a human-readable label of this block. +// It is not guaranteed unique within the function. +// +func (b *BasicBlock) String() string { + return fmt.Sprintf("%d", b.Index) +} + +// emit appends an instruction to the current basic block. +// If the instruction defines a Value, it is returned. +// +func (b *BasicBlock) emit(i Instruction) Value { + i.setBlock(b) + b.Instrs = append(b.Instrs, i) + v, _ := i.(Value) + return v +} + +// predIndex returns the i such that b.Preds[i] == c or panics if +// there is none. +func (b *BasicBlock) predIndex(c *BasicBlock) int { + for i, pred := range b.Preds { + if pred == c { + return i + } + } + panic(fmt.Sprintf("no edge %s -> %s", c, b)) +} + +// hasPhi returns true if b.Instrs contains φ-nodes. +func (b *BasicBlock) hasPhi() bool { + _, ok := b.Instrs[0].(*Phi) + return ok +} + +func (b *BasicBlock) Phis() []Instruction { + return b.phis() +} + +// phis returns the prefix of b.Instrs containing all the block's φ-nodes. +func (b *BasicBlock) phis() []Instruction { + for i, instr := range b.Instrs { + if _, ok := instr.(*Phi); !ok { + return b.Instrs[:i] + } + } + return nil // unreachable in well-formed blocks +} + +// replacePred replaces all occurrences of p in b's predecessor list with q. +// Ordinarily there should be at most one. +// +func (b *BasicBlock) replacePred(p, q *BasicBlock) { + for i, pred := range b.Preds { + if pred == p { + b.Preds[i] = q + } + } +} + +// replaceSucc replaces all occurrences of p in b's successor list with q. +// Ordinarily there should be at most one. +// +func (b *BasicBlock) replaceSucc(p, q *BasicBlock) { + for i, succ := range b.Succs { + if succ == p { + b.Succs[i] = q + } + } +} + +func (b *BasicBlock) RemovePred(p *BasicBlock) { + b.removePred(p) +} + +// removePred removes all occurrences of p in b's +// predecessor list and φ-nodes. +// Ordinarily there should be at most one. +// +func (b *BasicBlock) removePred(p *BasicBlock) { + phis := b.phis() + + // We must preserve edge order for φ-nodes. + j := 0 + for i, pred := range b.Preds { + if pred != p { + b.Preds[j] = b.Preds[i] + // Strike out φ-edge too. + for _, instr := range phis { + phi := instr.(*Phi) + phi.Edges[j] = phi.Edges[i] + } + j++ + } + } + // Nil out b.Preds[j:] and φ-edges[j:] to aid GC. + for i := j; i < len(b.Preds); i++ { + b.Preds[i] = nil + for _, instr := range phis { + instr.(*Phi).Edges[i] = nil + } + } + b.Preds = b.Preds[:j] + for _, instr := range phis { + phi := instr.(*Phi) + phi.Edges = phi.Edges[:j] + } +} + +// Destinations associated with unlabelled for/switch/select stmts. +// We push/pop one of these as we enter/leave each construct and for +// each BranchStmt we scan for the innermost target of the right type. +// +type targets struct { + tail *targets // rest of stack + _break *BasicBlock + _continue *BasicBlock + _fallthrough *BasicBlock +} + +// Destinations associated with a labelled block. +// We populate these as labels are encountered in forward gotos or +// labelled statements. +// +type lblock struct { + _goto *BasicBlock + _break *BasicBlock + _continue *BasicBlock +} + +// labelledBlock returns the branch target associated with the +// specified label, creating it if needed. +// +func (f *Function) labelledBlock(label *ast.Ident) *lblock { + lb := f.lblocks[label.Obj] + if lb == nil { + lb = &lblock{_goto: f.newBasicBlock(label.Name)} + if f.lblocks == nil { + f.lblocks = make(map[*ast.Object]*lblock) + } + f.lblocks[label.Obj] = lb + } + return lb +} + +// addParam adds a (non-escaping) parameter to f.Params of the +// specified name, type and source position. +// +func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter { + v := &Parameter{ + name: name, + typ: typ, + pos: pos, + parent: f, + } + f.Params = append(f.Params, v) + return v +} + +func (f *Function) addParamObj(obj types.Object) *Parameter { + name := obj.Name() + if name == "" { + name = fmt.Sprintf("arg%d", len(f.Params)) + } + param := f.addParam(name, obj.Type(), obj.Pos()) + param.object = obj + return param +} + +// addSpilledParam declares a parameter that is pre-spilled to the +// stack; the function body will load/store the spilled location. +// Subsequent lifting will eliminate spills where possible. +// +func (f *Function) addSpilledParam(obj types.Object) { + param := f.addParamObj(obj) + spill := &Alloc{Comment: obj.Name()} + spill.setType(types.NewPointer(obj.Type())) + spill.setPos(obj.Pos()) + f.objects[obj] = spill + f.Locals = append(f.Locals, spill) + f.emit(spill) + f.emit(&Store{Addr: spill, Val: param}) +} + +// startBody initializes the function prior to generating SSA code for its body. +// Precondition: f.Type() already set. +// +func (f *Function) startBody() { + f.currentBlock = f.newBasicBlock("entry") + f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init +} + +// createSyntacticParams populates f.Params and generates code (spills +// and named result locals) for all the parameters declared in the +// syntax. In addition it populates the f.objects mapping. +// +// Preconditions: +// f.startBody() was called. +// Postcondition: +// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0) +// +func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) { + // Receiver (at most one inner iteration). + if recv != nil { + for _, field := range recv.List { + for _, n := range field.Names { + f.addSpilledParam(f.Pkg.info.Defs[n]) + } + // Anonymous receiver? No need to spill. + if field.Names == nil { + f.addParamObj(f.Signature.Recv()) + } + } + } + + // Parameters. + if functype.Params != nil { + n := len(f.Params) // 1 if has recv, 0 otherwise + for _, field := range functype.Params.List { + for _, n := range field.Names { + f.addSpilledParam(f.Pkg.info.Defs[n]) + } + // Anonymous parameter? No need to spill. + if field.Names == nil { + f.addParamObj(f.Signature.Params().At(len(f.Params) - n)) + } + } + } + + // Named results. + if functype.Results != nil { + for _, field := range functype.Results.List { + // Implicit "var" decl of locals for named results. + for _, n := range field.Names { + f.namedResults = append(f.namedResults, f.addLocalForIdent(n)) + } + } + } +} + +// numberRegisters assigns numbers to all SSA registers +// (value-defining Instructions) in f, to aid debugging. +// (Non-Instruction Values are named at construction.) +// +func numberRegisters(f *Function) { + v := 0 + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + switch instr.(type) { + case Value: + instr.(interface { + setNum(int) + }).setNum(v) + v++ + } + } + } +} + +// buildReferrers populates the def/use information in all non-nil +// Value.Referrers slice. +// Precondition: all such slices are initially empty. +func buildReferrers(f *Function) { + var rands []*Value + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + rands = instr.Operands(rands[:0]) // recycle storage + for _, rand := range rands { + if r := *rand; r != nil { + if ref := r.Referrers(); ref != nil { + *ref = append(*ref, instr) + } + } + } + } + } +} + +// finishBody() finalizes the function after SSA code generation of its body. +func (f *Function) finishBody() { + f.objects = nil + f.currentBlock = nil + f.lblocks = nil + + // Don't pin the AST in memory (except in debug mode). + if n := f.syntax; n != nil && !f.debugInfo() { + f.syntax = extentNode{n.Pos(), n.End()} + } + + // Remove from f.Locals any Allocs that escape to the heap. + j := 0 + for _, l := range f.Locals { + if !l.Heap { + f.Locals[j] = l + j++ + } + } + // Nil out f.Locals[j:] to aid GC. + for i := j; i < len(f.Locals); i++ { + f.Locals[i] = nil + } + f.Locals = f.Locals[:j] + + // comma-ok receiving from a time.Tick channel will never return + // ok == false, so any branching on the value of ok can be + // replaced with an unconditional jump. This will primarily match + // `for range time.Tick(x)` loops, but it can also match + // user-written code. + for _, block := range f.Blocks { + if len(block.Instrs) < 3 { + continue + } + if len(block.Succs) != 2 { + continue + } + var instrs []*Instruction + for i, ins := range block.Instrs { + if _, ok := ins.(*DebugRef); ok { + continue + } + instrs = append(instrs, &block.Instrs[i]) + } + + for i, ins := range instrs { + unop, ok := (*ins).(*UnOp) + if !ok || unop.Op != token.ARROW { + continue + } + call, ok := unop.X.(*Call) + if !ok { + continue + } + if call.Common().IsInvoke() { + continue + } + + // OPT(dh): surely there is a more efficient way of doing + // this, than using FullName. We should already have + // resolved time.Tick somewhere? + v, ok := call.Common().Value.(*Function) + if !ok { + continue + } + t, ok := v.Object().(*types.Func) + if !ok { + continue + } + if t.FullName() != "time.Tick" { + continue + } + ex, ok := (*instrs[i+1]).(*Extract) + if !ok || ex.Tuple != unop || ex.Index != 1 { + continue + } + + ifstmt, ok := (*instrs[i+2]).(*If) + if !ok || ifstmt.Cond != ex { + continue + } + + *instrs[i+2] = NewJump(block) + succ := block.Succs[1] + block.Succs = block.Succs[0:1] + succ.RemovePred(block) + } + } + + optimizeBlocks(f) + + buildReferrers(f) + + buildDomTree(f) + + if f.Prog.mode&NaiveForm == 0 { + // For debugging pre-state of lifting pass: + // numberRegisters(f) + // f.WriteTo(os.Stderr) + lift(f) + } + + f.namedResults = nil // (used by lifting) + + numberRegisters(f) + + if f.Prog.mode&PrintFunctions != 0 { + printMu.Lock() + f.WriteTo(os.Stdout) + printMu.Unlock() + } + + if f.Prog.mode&SanityCheckFunctions != 0 { + mustSanityCheck(f, nil) + } +} + +func (f *Function) RemoveNilBlocks() { + f.removeNilBlocks() +} + +// removeNilBlocks eliminates nils from f.Blocks and updates each +// BasicBlock.Index. Use this after any pass that may delete blocks. +// +func (f *Function) removeNilBlocks() { + j := 0 + for _, b := range f.Blocks { + if b != nil { + b.Index = j + f.Blocks[j] = b + j++ + } + } + // Nil out f.Blocks[j:] to aid GC. + for i := j; i < len(f.Blocks); i++ { + f.Blocks[i] = nil + } + f.Blocks = f.Blocks[:j] +} + +// SetDebugMode sets the debug mode for package pkg. If true, all its +// functions will include full debug info. This greatly increases the +// size of the instruction stream, and causes Functions to depend upon +// the ASTs, potentially keeping them live in memory for longer. +// +func (pkg *Package) SetDebugMode(debug bool) { + // TODO(adonovan): do we want ast.File granularity? + pkg.debug = debug +} + +// debugInfo reports whether debug info is wanted for this function. +func (f *Function) debugInfo() bool { + return f.Pkg != nil && f.Pkg.debug +} + +// addNamedLocal creates a local variable, adds it to function f and +// returns it. Its name and type are taken from obj. Subsequent +// calls to f.lookup(obj) will return the same local. +// +func (f *Function) addNamedLocal(obj types.Object) *Alloc { + l := f.addLocal(obj.Type(), obj.Pos()) + l.Comment = obj.Name() + f.objects[obj] = l + return l +} + +func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc { + return f.addNamedLocal(f.Pkg.info.Defs[id]) +} + +// addLocal creates an anonymous local variable of type typ, adds it +// to function f and returns it. pos is the optional source location. +// +func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc { + v := &Alloc{} + v.setType(types.NewPointer(typ)) + v.setPos(pos) + f.Locals = append(f.Locals, v) + f.emit(v) + return v +} + +// lookup returns the address of the named variable identified by obj +// that is local to function f or one of its enclosing functions. +// If escaping, the reference comes from a potentially escaping pointer +// expression and the referent must be heap-allocated. +// +func (f *Function) lookup(obj types.Object, escaping bool) Value { + if v, ok := f.objects[obj]; ok { + if alloc, ok := v.(*Alloc); ok && escaping { + alloc.Heap = true + } + return v // function-local var (address) + } + + // Definition must be in an enclosing function; + // plumb it through intervening closures. + if f.parent == nil { + panic("no ssa.Value for " + obj.String()) + } + outer := f.parent.lookup(obj, true) // escaping + v := &FreeVar{ + name: obj.Name(), + typ: outer.Type(), + pos: outer.Pos(), + outer: outer, + parent: f, + } + f.objects[obj] = v + f.FreeVars = append(f.FreeVars, v) + return v +} + +// emit emits the specified instruction to function f. +func (f *Function) emit(instr Instruction) Value { + return f.currentBlock.emit(instr) +} + +// RelString returns the full name of this function, qualified by +// package name, receiver type, etc. +// +// The specific formatting rules are not guaranteed and may change. +// +// Examples: +// "math.IsNaN" // a package-level function +// "(*bytes.Buffer).Bytes" // a declared method or a wrapper +// "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0) +// "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure) +// "main.main$1" // an anonymous function in main +// "main.init#1" // a declared init function +// "main.init" // the synthesized package initializer +// +// When these functions are referred to from within the same package +// (i.e. from == f.Pkg.Object), they are rendered without the package path. +// For example: "IsNaN", "(*Buffer).Bytes", etc. +// +// All non-synthetic functions have distinct package-qualified names. +// (But two methods may have the same name "(T).f" if one is a synthetic +// wrapper promoting a non-exported method "f" from another package; in +// that case, the strings are equal but the identifiers "f" are distinct.) +// +func (f *Function) RelString(from *types.Package) string { + // Anonymous? + if f.parent != nil { + // An anonymous function's Name() looks like "parentName$1", + // but its String() should include the type/package/etc. + parent := f.parent.RelString(from) + for i, anon := range f.parent.AnonFuncs { + if anon == f { + return fmt.Sprintf("%s$%d", parent, 1+i) + } + } + + return f.name // should never happen + } + + // Method (declared or wrapper)? + if recv := f.Signature.Recv(); recv != nil { + return f.relMethod(from, recv.Type()) + } + + // Thunk? + if f.method != nil { + return f.relMethod(from, f.method.Recv()) + } + + // Bound? + if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") { + return f.relMethod(from, f.FreeVars[0].Type()) + } + + // Package-level function? + // Prefix with package name for cross-package references only. + if p := f.pkg(); p != nil && p != from { + return fmt.Sprintf("%s.%s", p.Path(), f.name) + } + + // Unknown. + return f.name +} + +func (f *Function) relMethod(from *types.Package, recv types.Type) string { + return fmt.Sprintf("(%s).%s", relType(recv, from), f.name) +} + +// writeSignature writes to buf the signature sig in declaration syntax. +func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) { + buf.WriteString("func ") + if recv := sig.Recv(); recv != nil { + buf.WriteString("(") + if n := params[0].Name(); n != "" { + buf.WriteString(n) + buf.WriteString(" ") + } + types.WriteType(buf, params[0].Type(), types.RelativeTo(from)) + buf.WriteString(") ") + } + buf.WriteString(name) + types.WriteSignature(buf, sig, types.RelativeTo(from)) +} + +func (f *Function) pkg() *types.Package { + if f.Pkg != nil { + return f.Pkg.Pkg + } + return nil +} + +var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer + +func (f *Function) WriteTo(w io.Writer) (int64, error) { + var buf bytes.Buffer + WriteFunction(&buf, f) + n, err := w.Write(buf.Bytes()) + return int64(n), err +} + +// WriteFunction writes to buf a human-readable "disassembly" of f. +func WriteFunction(buf *bytes.Buffer, f *Function) { + fmt.Fprintf(buf, "# Name: %s\n", f.String()) + if f.Pkg != nil { + fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Pkg.Path()) + } + if syn := f.Synthetic; syn != "" { + fmt.Fprintln(buf, "# Synthetic:", syn) + } + if pos := f.Pos(); pos.IsValid() { + fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos)) + } + + if f.parent != nil { + fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name()) + } + + if f.Recover != nil { + fmt.Fprintf(buf, "# Recover: %s\n", f.Recover) + } + + from := f.pkg() + + if f.FreeVars != nil { + buf.WriteString("# Free variables:\n") + for i, fv := range f.FreeVars { + fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from)) + } + } + + if len(f.Locals) > 0 { + buf.WriteString("# Locals:\n") + for i, l := range f.Locals { + fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from)) + } + } + writeSignature(buf, from, f.Name(), f.Signature, f.Params) + buf.WriteString(":\n") + + if f.Blocks == nil { + buf.WriteString("\t(external)\n") + } + + // NB. column calculations are confused by non-ASCII + // characters and assume 8-space tabs. + const punchcard = 80 // for old time's sake. + const tabwidth = 8 + for _, b := range f.Blocks { + if b == nil { + // Corrupt CFG. + fmt.Fprintf(buf, ".nil:\n") + continue + } + n, _ := fmt.Fprintf(buf, "%d:", b.Index) + bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs)) + fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg) + + if false { // CFG debugging + fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs) + } + for _, instr := range b.Instrs { + buf.WriteString("\t") + switch v := instr.(type) { + case Value: + l := punchcard - tabwidth + // Left-align the instruction. + if name := v.Name(); name != "" { + n, _ := fmt.Fprintf(buf, "%s = ", name) + l -= n + } + n, _ := buf.WriteString(instr.String()) + l -= n + // Right-align the type if there's space. + if t := v.Type(); t != nil { + buf.WriteByte(' ') + ts := relType(t, from) + l -= len(ts) + len(" ") // (spaces before and after type) + if l > 0 { + fmt.Fprintf(buf, "%*s", l, "") + } + buf.WriteString(ts) + } + case nil: + // Be robust against bad transforms. + buf.WriteString("") + default: + buf.WriteString(instr.String()) + } + buf.WriteString("\n") + } + } + fmt.Fprintf(buf, "\n") +} + +// newBasicBlock adds to f a new basic block and returns it. It does +// not automatically become the current block for subsequent calls to emit. +// comment is an optional string for more readable debugging output. +// +func (f *Function) newBasicBlock(comment string) *BasicBlock { + b := &BasicBlock{ + Index: len(f.Blocks), + Comment: comment, + parent: f, + } + b.Succs = b.succs2[:0] + f.Blocks = append(f.Blocks, b) + return b +} + +// NewFunction returns a new synthetic Function instance belonging to +// prog, with its name and signature fields set as specified. +// +// The caller is responsible for initializing the remaining fields of +// the function object, e.g. Pkg, Params, Blocks. +// +// It is practically impossible for clients to construct well-formed +// SSA functions/packages/programs directly, so we assume this is the +// job of the Builder alone. NewFunction exists to provide clients a +// little flexibility. For example, analysis tools may wish to +// construct fake Functions for the root of the callgraph, a fake +// "reflect" package, etc. +// +// TODO(adonovan): think harder about the API here. +// +func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function { + return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance} +} + +type extentNode [2]token.Pos + +func (n extentNode) Pos() token.Pos { return n[0] } +func (n extentNode) End() token.Pos { return n[1] } + +// Syntax returns an ast.Node whose Pos/End methods provide the +// lexical extent of the function if it was defined by Go source code +// (f.Synthetic==""), or nil otherwise. +// +// If f was built with debug information (see Package.SetDebugRef), +// the result is the *ast.FuncDecl or *ast.FuncLit that declared the +// function. Otherwise, it is an opaque Node providing only position +// information; this avoids pinning the AST in memory. +// +func (f *Function) Syntax() ast.Node { return f.syntax } diff --git a/vendor/honnef.co/go/tools/ssa/identical.go b/vendor/honnef.co/go/tools/ssa/identical.go new file mode 100644 index 00000000..53cbee10 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/identical.go @@ -0,0 +1,7 @@ +// +build go1.8 + +package ssa + +import "go/types" + +var structTypesIdentical = types.IdenticalIgnoreTags diff --git a/vendor/honnef.co/go/tools/ssa/identical_17.go b/vendor/honnef.co/go/tools/ssa/identical_17.go new file mode 100644 index 00000000..da89d333 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/identical_17.go @@ -0,0 +1,7 @@ +// +build !go1.8 + +package ssa + +import "go/types" + +var structTypesIdentical = types.Identical diff --git a/vendor/honnef.co/go/tools/ssa/lift.go b/vendor/honnef.co/go/tools/ssa/lift.go new file mode 100644 index 00000000..531358fa --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/lift.go @@ -0,0 +1,657 @@ +// Copyright 2013 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 ssa + +// This file defines the lifting pass which tries to "lift" Alloc +// cells (new/local variables) into SSA registers, replacing loads +// with the dominating stored value, eliminating loads and stores, and +// inserting φ-nodes as needed. + +// Cited papers and resources: +// +// Ron Cytron et al. 1991. Efficiently computing SSA form... +// http://doi.acm.org/10.1145/115372.115320 +// +// Cooper, Harvey, Kennedy. 2001. A Simple, Fast Dominance Algorithm. +// Software Practice and Experience 2001, 4:1-10. +// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf +// +// Daniel Berlin, llvmdev mailing list, 2012. +// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html +// (Be sure to expand the whole thread.) + +// TODO(adonovan): opt: there are many optimizations worth evaluating, and +// the conventional wisdom for SSA construction is that a simple +// algorithm well engineered often beats those of better asymptotic +// complexity on all but the most egregious inputs. +// +// Danny Berlin suggests that the Cooper et al. algorithm for +// computing the dominance frontier is superior to Cytron et al. +// Furthermore he recommends that rather than computing the DF for the +// whole function then renaming all alloc cells, it may be cheaper to +// compute the DF for each alloc cell separately and throw it away. +// +// Consider exploiting liveness information to avoid creating dead +// φ-nodes which we then immediately remove. +// +// Also see many other "TODO: opt" suggestions in the code. + +import ( + "fmt" + "go/token" + "go/types" + "math/big" + "os" +) + +// If true, show diagnostic information at each step of lifting. +// Very verbose. +const debugLifting = false + +// domFrontier maps each block to the set of blocks in its dominance +// frontier. The outer slice is conceptually a map keyed by +// Block.Index. The inner slice is conceptually a set, possibly +// containing duplicates. +// +// TODO(adonovan): opt: measure impact of dups; consider a packed bit +// representation, e.g. big.Int, and bitwise parallel operations for +// the union step in the Children loop. +// +// domFrontier's methods mutate the slice's elements but not its +// length, so their receivers needn't be pointers. +// +type domFrontier [][]*BasicBlock + +func (df domFrontier) add(u, v *BasicBlock) { + p := &df[u.Index] + *p = append(*p, v) +} + +// build builds the dominance frontier df for the dominator (sub)tree +// rooted at u, using the Cytron et al. algorithm. +// +// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA +// by pruning the entire IDF computation, rather than merely pruning +// the DF -> IDF step. +func (df domFrontier) build(u *BasicBlock) { + // Encounter each node u in postorder of dom tree. + for _, child := range u.dom.children { + df.build(child) + } + for _, vb := range u.Succs { + if v := vb.dom; v.idom != u { + df.add(u, vb) + } + } + for _, w := range u.dom.children { + for _, vb := range df[w.Index] { + // TODO(adonovan): opt: use word-parallel bitwise union. + if v := vb.dom; v.idom != u { + df.add(u, vb) + } + } + } +} + +func buildDomFrontier(fn *Function) domFrontier { + df := make(domFrontier, len(fn.Blocks)) + df.build(fn.Blocks[0]) + if fn.Recover != nil { + df.build(fn.Recover) + } + return df +} + +func removeInstr(refs []Instruction, instr Instruction) []Instruction { + i := 0 + for _, ref := range refs { + if ref == instr { + continue + } + refs[i] = ref + i++ + } + for j := i; j != len(refs); j++ { + refs[j] = nil // aid GC + } + return refs[:i] +} + +// lift replaces local and new Allocs accessed only with +// load/store by SSA registers, inserting φ-nodes where necessary. +// The result is a program in classical pruned SSA form. +// +// Preconditions: +// - fn has no dead blocks (blockopt has run). +// - Def/use info (Operands and Referrers) is up-to-date. +// - The dominator tree is up-to-date. +// +func lift(fn *Function) { + // TODO(adonovan): opt: lots of little optimizations may be + // worthwhile here, especially if they cause us to avoid + // buildDomFrontier. For example: + // + // - Alloc never loaded? Eliminate. + // - Alloc never stored? Replace all loads with a zero constant. + // - Alloc stored once? Replace loads with dominating store; + // don't forget that an Alloc is itself an effective store + // of zero. + // - Alloc used only within a single block? + // Use degenerate algorithm avoiding φ-nodes. + // - Consider synergy with scalar replacement of aggregates (SRA). + // e.g. *(&x.f) where x is an Alloc. + // Perhaps we'd get better results if we generated this as x.f + // i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)). + // Unclear. + // + // But we will start with the simplest correct code. + df := buildDomFrontier(fn) + + if debugLifting { + title := false + for i, blocks := range df { + if blocks != nil { + if !title { + fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn) + title = true + } + fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks) + } + } + } + + newPhis := make(newPhiMap) + + // During this pass we will replace some BasicBlock.Instrs + // (allocs, loads and stores) with nil, keeping a count in + // BasicBlock.gaps. At the end we will reset Instrs to the + // concatenation of all non-dead newPhis and non-nil Instrs + // for the block, reusing the original array if space permits. + + // While we're here, we also eliminate 'rundefers' + // instructions in functions that contain no 'defer' + // instructions. + usesDefer := false + + // A counter used to generate ~unique ids for Phi nodes, as an + // aid to debugging. We use large numbers to make them highly + // visible. All nodes are renumbered later. + fresh := 1000 + + // Determine which allocs we can lift and number them densely. + // The renaming phase uses this numbering for compact maps. + numAllocs := 0 + for _, b := range fn.Blocks { + b.gaps = 0 + b.rundefers = 0 + for _, instr := range b.Instrs { + switch instr := instr.(type) { + case *Alloc: + index := -1 + if liftAlloc(df, instr, newPhis, &fresh) { + index = numAllocs + numAllocs++ + } + instr.index = index + case *Defer: + usesDefer = true + case *RunDefers: + b.rundefers++ + } + } + } + + // renaming maps an alloc (keyed by index) to its replacement + // value. Initially the renaming contains nil, signifying the + // zero constant of the appropriate type; we construct the + // Const lazily at most once on each path through the domtree. + // TODO(adonovan): opt: cache per-function not per subtree. + renaming := make([]Value, numAllocs) + + // Renaming. + rename(fn.Blocks[0], renaming, newPhis) + + // Eliminate dead φ-nodes. + removeDeadPhis(fn.Blocks, newPhis) + + // Prepend remaining live φ-nodes to each block. + for _, b := range fn.Blocks { + nps := newPhis[b] + j := len(nps) + + rundefersToKill := b.rundefers + if usesDefer { + rundefersToKill = 0 + } + + if j+b.gaps+rundefersToKill == 0 { + continue // fast path: no new phis or gaps + } + + // Compact nps + non-nil Instrs into a new slice. + // TODO(adonovan): opt: compact in situ (rightwards) + // if Instrs has sufficient space or slack. + dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill) + for i, np := range nps { + dst[i] = np.phi + } + for _, instr := range b.Instrs { + if instr == nil { + continue + } + if !usesDefer { + if _, ok := instr.(*RunDefers); ok { + continue + } + } + dst[j] = instr + j++ + } + b.Instrs = dst + } + + // Remove any fn.Locals that were lifted. + j := 0 + for _, l := range fn.Locals { + if l.index < 0 { + fn.Locals[j] = l + j++ + } + } + // Nil out fn.Locals[j:] to aid GC. + for i := j; i < len(fn.Locals); i++ { + fn.Locals[i] = nil + } + fn.Locals = fn.Locals[:j] +} + +// removeDeadPhis removes φ-nodes not transitively needed by a +// non-Phi, non-DebugRef instruction. +func removeDeadPhis(blocks []*BasicBlock, newPhis newPhiMap) { + // First pass: find the set of "live" φ-nodes: those reachable + // from some non-Phi instruction. + // + // We compute reachability in reverse, starting from each φ, + // rather than forwards, starting from each live non-Phi + // instruction, because this way visits much less of the + // Value graph. + livePhis := make(map[*Phi]bool) + for _, npList := range newPhis { + for _, np := range npList { + phi := np.phi + if !livePhis[phi] && phiHasDirectReferrer(phi) { + markLivePhi(livePhis, phi) + } + } + } + + // Existing φ-nodes due to && and || operators + // are all considered live (see Go issue 19622). + for _, b := range blocks { + for _, phi := range b.phis() { + markLivePhi(livePhis, phi.(*Phi)) + } + } + + // Second pass: eliminate unused phis from newPhis. + for block, npList := range newPhis { + j := 0 + for _, np := range npList { + if livePhis[np.phi] { + npList[j] = np + j++ + } else { + // discard it, first removing it from referrers + for _, val := range np.phi.Edges { + if refs := val.Referrers(); refs != nil { + *refs = removeInstr(*refs, np.phi) + } + } + np.phi.block = nil + } + } + newPhis[block] = npList[:j] + } +} + +// markLivePhi marks phi, and all φ-nodes transitively reachable via +// its Operands, live. +func markLivePhi(livePhis map[*Phi]bool, phi *Phi) { + livePhis[phi] = true + for _, rand := range phi.Operands(nil) { + if q, ok := (*rand).(*Phi); ok { + if !livePhis[q] { + markLivePhi(livePhis, q) + } + } + } +} + +// phiHasDirectReferrer reports whether phi is directly referred to by +// a non-Phi instruction. Such instructions are the +// roots of the liveness traversal. +func phiHasDirectReferrer(phi *Phi) bool { + for _, instr := range *phi.Referrers() { + if _, ok := instr.(*Phi); !ok { + return true + } + } + return false +} + +type BlockSet struct{ big.Int } // (inherit methods from Int) + +// add adds b to the set and returns true if the set changed. +func (s *BlockSet) Add(b *BasicBlock) bool { + i := b.Index + if s.Bit(i) != 0 { + return false + } + s.SetBit(&s.Int, i, 1) + return true +} + +func (s *BlockSet) Has(b *BasicBlock) bool { + return s.Bit(b.Index) == 1 +} + +// take removes an arbitrary element from a set s and +// returns its index, or returns -1 if empty. +func (s *BlockSet) Take() int { + l := s.BitLen() + for i := 0; i < l; i++ { + if s.Bit(i) == 1 { + s.SetBit(&s.Int, i, 0) + return i + } + } + return -1 +} + +// newPhi is a pair of a newly introduced φ-node and the lifted Alloc +// it replaces. +type newPhi struct { + phi *Phi + alloc *Alloc +} + +// newPhiMap records for each basic block, the set of newPhis that +// must be prepended to the block. +type newPhiMap map[*BasicBlock][]newPhi + +// liftAlloc determines whether alloc can be lifted into registers, +// and if so, it populates newPhis with all the φ-nodes it may require +// and returns true. +// +// fresh is a source of fresh ids for phi nodes. +// +func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap, fresh *int) bool { + // Don't lift aggregates into registers, because we don't have + // a way to express their zero-constants. + switch deref(alloc.Type()).Underlying().(type) { + case *types.Array, *types.Struct: + return false + } + + // Don't lift named return values in functions that defer + // calls that may recover from panic. + if fn := alloc.Parent(); fn.Recover != nil { + for _, nr := range fn.namedResults { + if nr == alloc { + return false + } + } + } + + // Compute defblocks, the set of blocks containing a + // definition of the alloc cell. + var defblocks BlockSet + for _, instr := range *alloc.Referrers() { + // Bail out if we discover the alloc is not liftable; + // the only operations permitted to use the alloc are + // loads/stores into the cell, and DebugRef. + switch instr := instr.(type) { + case *Store: + if instr.Val == alloc { + return false // address used as value + } + if instr.Addr != alloc { + panic("Alloc.Referrers is inconsistent") + } + defblocks.Add(instr.Block()) + case *UnOp: + if instr.Op != token.MUL { + return false // not a load + } + if instr.X != alloc { + panic("Alloc.Referrers is inconsistent") + } + case *DebugRef: + // ok + default: + return false // some other instruction + } + } + // The Alloc itself counts as a (zero) definition of the cell. + defblocks.Add(alloc.Block()) + + if debugLifting { + fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name()) + } + + fn := alloc.Parent() + + // Φ-insertion. + // + // What follows is the body of the main loop of the insert-φ + // function described by Cytron et al, but instead of using + // counter tricks, we just reset the 'hasAlready' and 'work' + // sets each iteration. These are bitmaps so it's pretty cheap. + // + // TODO(adonovan): opt: recycle slice storage for W, + // hasAlready, defBlocks across liftAlloc calls. + var hasAlready BlockSet + + // Initialize W and work to defblocks. + var work BlockSet = defblocks // blocks seen + var W BlockSet // blocks to do + W.Set(&defblocks.Int) + + // Traverse iterated dominance frontier, inserting φ-nodes. + for i := W.Take(); i != -1; i = W.Take() { + u := fn.Blocks[i] + for _, v := range df[u.Index] { + if hasAlready.Add(v) { + // Create φ-node. + // It will be prepended to v.Instrs later, if needed. + phi := &Phi{ + Edges: make([]Value, len(v.Preds)), + Comment: alloc.Comment, + } + // This is merely a debugging aid: + phi.setNum(*fresh) + *fresh++ + + phi.pos = alloc.Pos() + phi.setType(deref(alloc.Type())) + phi.block = v + if debugLifting { + fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v) + } + newPhis[v] = append(newPhis[v], newPhi{phi, alloc}) + + if work.Add(v) { + W.Add(v) + } + } + } + } + + return true +} + +// replaceAll replaces all intraprocedural uses of x with y, +// updating x.Referrers and y.Referrers. +// Precondition: x.Referrers() != nil, i.e. x must be local to some function. +// +func replaceAll(x, y Value) { + var rands []*Value + pxrefs := x.Referrers() + pyrefs := y.Referrers() + for _, instr := range *pxrefs { + rands = instr.Operands(rands[:0]) // recycle storage + for _, rand := range rands { + if *rand != nil { + if *rand == x { + *rand = y + } + } + } + if pyrefs != nil { + *pyrefs = append(*pyrefs, instr) // dups ok + } + } + *pxrefs = nil // x is now unreferenced +} + +// renamed returns the value to which alloc is being renamed, +// constructing it lazily if it's the implicit zero initialization. +// +func renamed(renaming []Value, alloc *Alloc) Value { + v := renaming[alloc.index] + if v == nil { + v = zeroConst(deref(alloc.Type())) + renaming[alloc.index] = v + } + return v +} + +// rename implements the (Cytron et al) SSA renaming algorithm, a +// preorder traversal of the dominator tree replacing all loads of +// Alloc cells with the value stored to that cell by the dominating +// store instruction. For lifting, we need only consider loads, +// stores and φ-nodes. +// +// renaming is a map from *Alloc (keyed by index number) to its +// dominating stored value; newPhis[x] is the set of new φ-nodes to be +// prepended to block x. +// +func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) { + // Each φ-node becomes the new name for its associated Alloc. + for _, np := range newPhis[u] { + phi := np.phi + alloc := np.alloc + renaming[alloc.index] = phi + } + + // Rename loads and stores of allocs. + for i, instr := range u.Instrs { + switch instr := instr.(type) { + case *Alloc: + if instr.index >= 0 { // store of zero to Alloc cell + // Replace dominated loads by the zero value. + renaming[instr.index] = nil + if debugLifting { + fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr) + } + // Delete the Alloc. + u.Instrs[i] = nil + u.gaps++ + } + + case *Store: + if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell + // Replace dominated loads by the stored value. + renaming[alloc.index] = instr.Val + if debugLifting { + fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n", + instr, instr.Val.Name()) + } + // Remove the store from the referrer list of the stored value. + if refs := instr.Val.Referrers(); refs != nil { + *refs = removeInstr(*refs, instr) + } + // Delete the Store. + u.Instrs[i] = nil + u.gaps++ + } + + case *UnOp: + if instr.Op == token.MUL { + if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell + newval := renamed(renaming, alloc) + if debugLifting { + fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n", + instr.Name(), instr, newval.Name()) + } + // Replace all references to + // the loaded value by the + // dominating stored value. + replaceAll(instr, newval) + // Delete the Load. + u.Instrs[i] = nil + u.gaps++ + } + } + + case *DebugRef: + if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell + if instr.IsAddr { + instr.X = renamed(renaming, alloc) + instr.IsAddr = false + + // Add DebugRef to instr.X's referrers. + if refs := instr.X.Referrers(); refs != nil { + *refs = append(*refs, instr) + } + } else { + // A source expression denotes the address + // of an Alloc that was optimized away. + instr.X = nil + + // Delete the DebugRef. + u.Instrs[i] = nil + u.gaps++ + } + } + } + } + + // For each φ-node in a CFG successor, rename the edge. + for _, v := range u.Succs { + phis := newPhis[v] + if len(phis) == 0 { + continue + } + i := v.predIndex(u) + for _, np := range phis { + phi := np.phi + alloc := np.alloc + newval := renamed(renaming, alloc) + if debugLifting { + fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n", + phi.Name(), u, v, i, alloc.Name(), newval.Name()) + } + phi.Edges[i] = newval + if prefs := newval.Referrers(); prefs != nil { + *prefs = append(*prefs, phi) + } + } + } + + // Continue depth-first recursion over domtree, pushing a + // fresh copy of the renaming map for each subtree. + for i, v := range u.dom.children { + r := renaming + if i < len(u.dom.children)-1 { + // On all but the final iteration, we must make + // a copy to avoid destructive update. + r = make([]Value, len(renaming)) + copy(r, renaming) + } + rename(v, r, newPhis) + } + +} diff --git a/vendor/honnef.co/go/tools/ssa/lvalue.go b/vendor/honnef.co/go/tools/ssa/lvalue.go new file mode 100644 index 00000000..eb5d71e1 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/lvalue.go @@ -0,0 +1,123 @@ +// Copyright 2013 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 ssa + +// lvalues are the union of addressable expressions and map-index +// expressions. + +import ( + "go/ast" + "go/token" + "go/types" +) + +// An lvalue represents an assignable location that may appear on the +// left-hand side of an assignment. This is a generalization of a +// pointer to permit updates to elements of maps. +// +type lvalue interface { + store(fn *Function, v Value) // stores v into the location + load(fn *Function) Value // loads the contents of the location + address(fn *Function) Value // address of the location + typ() types.Type // returns the type of the location +} + +// An address is an lvalue represented by a true pointer. +type address struct { + addr Value + pos token.Pos // source position + expr ast.Expr // source syntax of the value (not address) [debug mode] +} + +func (a *address) load(fn *Function) Value { + load := emitLoad(fn, a.addr) + load.pos = a.pos + return load +} + +func (a *address) store(fn *Function, v Value) { + store := emitStore(fn, a.addr, v, a.pos) + if a.expr != nil { + // store.Val is v, converted for assignability. + emitDebugRef(fn, a.expr, store.Val, false) + } +} + +func (a *address) address(fn *Function) Value { + if a.expr != nil { + emitDebugRef(fn, a.expr, a.addr, true) + } + return a.addr +} + +func (a *address) typ() types.Type { + return deref(a.addr.Type()) +} + +// An element is an lvalue represented by m[k], the location of an +// element of a map or string. These locations are not addressable +// since pointers cannot be formed from them, but they do support +// load(), and in the case of maps, store(). +// +type element struct { + m, k Value // map or string + t types.Type // map element type or string byte type + pos token.Pos // source position of colon ({k:v}) or lbrack (m[k]=v) +} + +func (e *element) load(fn *Function) Value { + l := &Lookup{ + X: e.m, + Index: e.k, + } + l.setPos(e.pos) + l.setType(e.t) + return fn.emit(l) +} + +func (e *element) store(fn *Function, v Value) { + up := &MapUpdate{ + Map: e.m, + Key: e.k, + Value: emitConv(fn, v, e.t), + } + up.pos = e.pos + fn.emit(up) +} + +func (e *element) address(fn *Function) Value { + panic("map/string elements are not addressable") +} + +func (e *element) typ() types.Type { + return e.t +} + +// A blank is a dummy variable whose name is "_". +// It is not reified: loads are illegal and stores are ignored. +// +type blank struct{} + +func (bl blank) load(fn *Function) Value { + panic("blank.load is illegal") +} + +func (bl blank) store(fn *Function, v Value) { + s := &BlankStore{ + Val: v, + } + fn.emit(s) +} + +func (bl blank) address(fn *Function) Value { + panic("blank var is not addressable") +} + +func (bl blank) typ() types.Type { + // This should be the type of the blank Ident; the typechecker + // doesn't provide this yet, but fortunately, we don't need it + // yet either. + panic("blank.typ is unimplemented") +} diff --git a/vendor/honnef.co/go/tools/ssa/methods.go b/vendor/honnef.co/go/tools/ssa/methods.go new file mode 100644 index 00000000..9cf38391 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/methods.go @@ -0,0 +1,239 @@ +// Copyright 2013 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 ssa + +// This file defines utilities for population of method sets. + +import ( + "fmt" + "go/types" +) + +// MethodValue returns the Function implementing method sel, building +// wrapper methods on demand. It returns nil if sel denotes an +// abstract (interface) method. +// +// Precondition: sel.Kind() == MethodVal. +// +// Thread-safe. +// +// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) +// +func (prog *Program) MethodValue(sel *types.Selection) *Function { + if sel.Kind() != types.MethodVal { + panic(fmt.Sprintf("MethodValue(%s) kind != MethodVal", sel)) + } + T := sel.Recv() + if isInterface(T) { + return nil // abstract method + } + if prog.mode&LogSource != 0 { + defer logStack("MethodValue %s %v", T, sel)() + } + + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + + return prog.addMethod(prog.createMethodSet(T), sel) +} + +// LookupMethod returns the implementation of the method of type T +// identified by (pkg, name). It returns nil if the method exists but +// is abstract, and panics if T has no such method. +// +func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function { + sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name) + if sel == nil { + panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name))) + } + return prog.MethodValue(sel) +} + +// methodSet contains the (concrete) methods of a non-interface type. +type methodSet struct { + mapping map[string]*Function // populated lazily + complete bool // mapping contains all methods +} + +// Precondition: !isInterface(T). +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +func (prog *Program) createMethodSet(T types.Type) *methodSet { + mset, ok := prog.methodSets.At(T).(*methodSet) + if !ok { + mset = &methodSet{mapping: make(map[string]*Function)} + prog.methodSets.Set(T, mset) + } + return mset +} + +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function { + if sel.Kind() == types.MethodExpr { + panic(sel) + } + id := sel.Obj().Id() + fn := mset.mapping[id] + if fn == nil { + obj := sel.Obj().(*types.Func) + + needsPromotion := len(sel.Index()) > 1 + needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv()) + if needsPromotion || needsIndirection { + fn = makeWrapper(prog, sel) + } else { + fn = prog.declaredFunc(obj) + } + if fn.Signature.Recv() == nil { + panic(fn) // missing receiver + } + mset.mapping[id] = fn + } + return fn +} + +// RuntimeTypes returns a new unordered slice containing all +// concrete types in the program for which a complete (non-empty) +// method set is required at run-time. +// +// Thread-safe. +// +// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) +// +func (prog *Program) RuntimeTypes() []types.Type { + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + + var res []types.Type + prog.methodSets.Iterate(func(T types.Type, v interface{}) { + if v.(*methodSet).complete { + res = append(res, T) + } + }) + return res +} + +// declaredFunc returns the concrete function/method denoted by obj. +// Panic ensues if there is none. +// +func (prog *Program) declaredFunc(obj *types.Func) *Function { + if v := prog.packageLevelValue(obj); v != nil { + return v.(*Function) + } + panic("no concrete method: " + obj.String()) +} + +// needMethodsOf ensures that runtime type information (including the +// complete method set) is available for the specified type T and all +// its subcomponents. +// +// needMethodsOf must be called for at least every type that is an +// operand of some MakeInterface instruction, and for the type of +// every exported package member. +// +// Precondition: T is not a method signature (*Signature with Recv()!=nil). +// +// Thread-safe. (Called via emitConv from multiple builder goroutines.) +// +// TODO(adonovan): make this faster. It accounts for 20% of SSA build time. +// +// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) +// +func (prog *Program) needMethodsOf(T types.Type) { + prog.methodsMu.Lock() + prog.needMethods(T, false) + prog.methodsMu.Unlock() +} + +// Precondition: T is not a method signature (*Signature with Recv()!=nil). +// Recursive case: skip => don't create methods for T. +// +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +// +func (prog *Program) needMethods(T types.Type, skip bool) { + // Each package maintains its own set of types it has visited. + if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok { + // needMethods(T) was previously called + if !prevSkip || skip { + return // already seen, with same or false 'skip' value + } + } + prog.runtimeTypes.Set(T, skip) + + tmset := prog.MethodSets.MethodSet(T) + + if !skip && !isInterface(T) && tmset.Len() > 0 { + // Create methods of T. + mset := prog.createMethodSet(T) + if !mset.complete { + mset.complete = true + n := tmset.Len() + for i := 0; i < n; i++ { + prog.addMethod(mset, tmset.At(i)) + } + } + } + + // Recursion over signatures of each method. + for i := 0; i < tmset.Len(); i++ { + sig := tmset.At(i).Type().(*types.Signature) + prog.needMethods(sig.Params(), false) + prog.needMethods(sig.Results(), false) + } + + switch t := T.(type) { + case *types.Basic: + // nop + + case *types.Interface: + // nop---handled by recursion over method set. + + case *types.Pointer: + prog.needMethods(t.Elem(), false) + + case *types.Slice: + prog.needMethods(t.Elem(), false) + + case *types.Chan: + prog.needMethods(t.Elem(), false) + + case *types.Map: + prog.needMethods(t.Key(), false) + prog.needMethods(t.Elem(), false) + + case *types.Signature: + if t.Recv() != nil { + panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv())) + } + prog.needMethods(t.Params(), false) + prog.needMethods(t.Results(), false) + + case *types.Named: + // A pointer-to-named type can be derived from a named + // type via reflection. It may have methods too. + prog.needMethods(types.NewPointer(T), false) + + // Consider 'type T struct{S}' where S has methods. + // Reflection provides no way to get from T to struct{S}, + // only to S, so the method set of struct{S} is unwanted, + // so set 'skip' flag during recursion. + prog.needMethods(t.Underlying(), true) + + case *types.Array: + prog.needMethods(t.Elem(), false) + + case *types.Struct: + for i, n := 0, t.NumFields(); i < n; i++ { + prog.needMethods(t.Field(i).Type(), false) + } + + case *types.Tuple: + for i, n := 0, t.Len(); i < n; i++ { + prog.needMethods(t.At(i).Type(), false) + } + + default: + panic(T) + } +} diff --git a/vendor/honnef.co/go/tools/ssa/mode.go b/vendor/honnef.co/go/tools/ssa/mode.go new file mode 100644 index 00000000..d2a26989 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/mode.go @@ -0,0 +1,100 @@ +// 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. + +package ssa + +// This file defines the BuilderMode type and its command-line flag. + +import ( + "bytes" + "fmt" +) + +// BuilderMode is a bitmask of options for diagnostics and checking. +// +// *BuilderMode satisfies the flag.Value interface. Example: +// +// var mode = ssa.BuilderMode(0) +// func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) } +// +type BuilderMode uint + +const ( + PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout + PrintFunctions // Print function SSA code to stdout + LogSource // Log source locations as SSA builder progresses + SanityCheckFunctions // Perform sanity checking of function bodies + NaiveForm // Build naïve SSA form: don't replace local loads/stores with registers + BuildSerially // Build packages serially, not in parallel. + GlobalDebug // Enable debug info for all packages + BareInits // Build init functions without guards or calls to dependent inits +) + +const BuilderModeDoc = `Options controlling the SSA builder. +The value is a sequence of zero or more of these letters: +C perform sanity [C]hecking of the SSA form. +D include [D]ebug info for every function. +P print [P]ackage inventory. +F print [F]unction SSA code. +S log [S]ource locations as SSA builder progresses. +L build distinct packages seria[L]ly instead of in parallel. +N build [N]aive SSA form: don't replace local loads/stores with registers. +I build bare [I]nit functions: no init guards or calls to dependent inits. +` + +func (m BuilderMode) String() string { + var buf bytes.Buffer + if m&GlobalDebug != 0 { + buf.WriteByte('D') + } + if m&PrintPackages != 0 { + buf.WriteByte('P') + } + if m&PrintFunctions != 0 { + buf.WriteByte('F') + } + if m&LogSource != 0 { + buf.WriteByte('S') + } + if m&SanityCheckFunctions != 0 { + buf.WriteByte('C') + } + if m&NaiveForm != 0 { + buf.WriteByte('N') + } + if m&BuildSerially != 0 { + buf.WriteByte('L') + } + return buf.String() +} + +// Set parses the flag characters in s and updates *m. +func (m *BuilderMode) Set(s string) error { + var mode BuilderMode + for _, c := range s { + switch c { + case 'D': + mode |= GlobalDebug + case 'P': + mode |= PrintPackages + case 'F': + mode |= PrintFunctions + case 'S': + mode |= LogSource | BuildSerially + case 'C': + mode |= SanityCheckFunctions + case 'N': + mode |= NaiveForm + case 'L': + mode |= BuildSerially + default: + return fmt.Errorf("unknown BuilderMode option: %q", c) + } + } + *m = mode + return nil +} + +// Get returns m. +func (m BuilderMode) Get() interface{} { return m } diff --git a/vendor/honnef.co/go/tools/ssa/print.go b/vendor/honnef.co/go/tools/ssa/print.go new file mode 100644 index 00000000..6fd27727 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/print.go @@ -0,0 +1,435 @@ +// Copyright 2013 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 ssa + +// This file implements the String() methods for all Value and +// Instruction types. + +import ( + "bytes" + "fmt" + "go/types" + "io" + "reflect" + "sort" + + "golang.org/x/tools/go/types/typeutil" +) + +// relName returns the name of v relative to i. +// In most cases, this is identical to v.Name(), but references to +// Functions (including methods) and Globals use RelString and +// all types are displayed with relType, so that only cross-package +// references are package-qualified. +// +func relName(v Value, i Instruction) string { + var from *types.Package + if i != nil { + from = i.Parent().pkg() + } + switch v := v.(type) { + case Member: // *Function or *Global + return v.RelString(from) + case *Const: + return v.RelString(from) + } + return v.Name() +} + +func relType(t types.Type, from *types.Package) string { + return types.TypeString(t, types.RelativeTo(from)) +} + +func relString(m Member, from *types.Package) string { + // NB: not all globals have an Object (e.g. init$guard), + // so use Package().Object not Object.Package(). + if pkg := m.Package().Pkg; pkg != nil && pkg != from { + return fmt.Sprintf("%s.%s", pkg.Path(), m.Name()) + } + return m.Name() +} + +// Value.String() +// +// This method is provided only for debugging. +// It never appears in disassembly, which uses Value.Name(). + +func (v *Parameter) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from)) +} + +func (v *FreeVar) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from)) +} + +func (v *Builtin) String() string { + return fmt.Sprintf("builtin %s", v.Name()) +} + +// Instruction.String() + +func (v *Alloc) String() string { + op := "local" + if v.Heap { + op = "new" + } + from := v.Parent().pkg() + return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment) +} + +func (v *Phi) String() string { + var b bytes.Buffer + b.WriteString("phi [") + for i, edge := range v.Edges { + if i > 0 { + b.WriteString(", ") + } + // Be robust against malformed CFG. + if v.block == nil { + b.WriteString("??") + continue + } + block := -1 + if i < len(v.block.Preds) { + block = v.block.Preds[i].Index + } + fmt.Fprintf(&b, "%d: ", block) + edgeVal := "" // be robust + if edge != nil { + edgeVal = relName(edge, v) + } + b.WriteString(edgeVal) + } + b.WriteString("]") + if v.Comment != "" { + b.WriteString(" #") + b.WriteString(v.Comment) + } + return b.String() +} + +func printCall(v *CallCommon, prefix string, instr Instruction) string { + var b bytes.Buffer + b.WriteString(prefix) + if !v.IsInvoke() { + b.WriteString(relName(v.Value, instr)) + } else { + fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name()) + } + b.WriteString("(") + for i, arg := range v.Args { + if i > 0 { + b.WriteString(", ") + } + b.WriteString(relName(arg, instr)) + } + if v.Signature().Variadic() { + b.WriteString("...") + } + b.WriteString(")") + return b.String() +} + +func (c *CallCommon) String() string { + return printCall(c, "", nil) +} + +func (v *Call) String() string { + return printCall(&v.Call, "", v) +} + +func (v *BinOp) String() string { + return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v)) +} + +func (v *UnOp) String() string { + return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk)) +} + +func printConv(prefix string, v, x Value) string { + from := v.Parent().pkg() + return fmt.Sprintf("%s %s <- %s (%s)", + prefix, + relType(v.Type(), from), + relType(x.Type(), from), + relName(x, v.(Instruction))) +} + +func (v *ChangeType) String() string { return printConv("changetype", v, v.X) } +func (v *Convert) String() string { return printConv("convert", v, v.X) } +func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) } +func (v *MakeInterface) String() string { return printConv("make", v, v.X) } + +func (v *MakeClosure) String() string { + var b bytes.Buffer + fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v)) + if v.Bindings != nil { + b.WriteString(" [") + for i, c := range v.Bindings { + if i > 0 { + b.WriteString(", ") + } + b.WriteString(relName(c, v)) + } + b.WriteString("]") + } + return b.String() +} + +func (v *MakeSlice) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("make %s %s %s", + relType(v.Type(), from), + relName(v.Len, v), + relName(v.Cap, v)) +} + +func (v *Slice) String() string { + var b bytes.Buffer + b.WriteString("slice ") + b.WriteString(relName(v.X, v)) + b.WriteString("[") + if v.Low != nil { + b.WriteString(relName(v.Low, v)) + } + b.WriteString(":") + if v.High != nil { + b.WriteString(relName(v.High, v)) + } + if v.Max != nil { + b.WriteString(":") + b.WriteString(relName(v.Max, v)) + } + b.WriteString("]") + return b.String() +} + +func (v *MakeMap) String() string { + res := "" + if v.Reserve != nil { + res = relName(v.Reserve, v) + } + from := v.Parent().pkg() + return fmt.Sprintf("make %s %s", relType(v.Type(), from), res) +} + +func (v *MakeChan) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v)) +} + +func (v *FieldAddr) String() string { + st := deref(v.X.Type()).Underlying().(*types.Struct) + // Be robust against a bad index. + name := "?" + if 0 <= v.Field && v.Field < st.NumFields() { + name = st.Field(v.Field).Name() + } + return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field) +} + +func (v *Field) String() string { + st := v.X.Type().Underlying().(*types.Struct) + // Be robust against a bad index. + name := "?" + if 0 <= v.Field && v.Field < st.NumFields() { + name = st.Field(v.Field).Name() + } + return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field) +} + +func (v *IndexAddr) String() string { + return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v)) +} + +func (v *Index) String() string { + return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v)) +} + +func (v *Lookup) String() string { + return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk)) +} + +func (v *Range) String() string { + return "range " + relName(v.X, v) +} + +func (v *Next) String() string { + return "next " + relName(v.Iter, v) +} + +func (v *TypeAssert) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from)) +} + +func (v *Extract) String() string { + return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index) +} + +func (s *Jump) String() string { + // Be robust against malformed CFG. + block := -1 + if s.block != nil && len(s.block.Succs) == 1 { + block = s.block.Succs[0].Index + } + return fmt.Sprintf("jump %d", block) +} + +func (s *If) String() string { + // Be robust against malformed CFG. + tblock, fblock := -1, -1 + if s.block != nil && len(s.block.Succs) == 2 { + tblock = s.block.Succs[0].Index + fblock = s.block.Succs[1].Index + } + return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock) +} + +func (s *Go) String() string { + return printCall(&s.Call, "go ", s) +} + +func (s *Panic) String() string { + return "panic " + relName(s.X, s) +} + +func (s *Return) String() string { + var b bytes.Buffer + b.WriteString("return") + for i, r := range s.Results { + if i == 0 { + b.WriteString(" ") + } else { + b.WriteString(", ") + } + b.WriteString(relName(r, s)) + } + return b.String() +} + +func (*RunDefers) String() string { + return "rundefers" +} + +func (s *Send) String() string { + return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s)) +} + +func (s *Defer) String() string { + return printCall(&s.Call, "defer ", s) +} + +func (s *Select) String() string { + var b bytes.Buffer + for i, st := range s.States { + if i > 0 { + b.WriteString(", ") + } + if st.Dir == types.RecvOnly { + b.WriteString("<-") + b.WriteString(relName(st.Chan, s)) + } else { + b.WriteString(relName(st.Chan, s)) + b.WriteString("<-") + b.WriteString(relName(st.Send, s)) + } + } + non := "" + if !s.Blocking { + non = "non" + } + return fmt.Sprintf("select %sblocking [%s]", non, b.String()) +} + +func (s *Store) String() string { + return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s)) +} + +func (s *BlankStore) String() string { + return fmt.Sprintf("_ = %s", relName(s.Val, s)) +} + +func (s *MapUpdate) String() string { + return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s)) +} + +func (s *DebugRef) String() string { + p := s.Parent().Prog.Fset.Position(s.Pos()) + var descr interface{} + if s.object != nil { + descr = s.object // e.g. "var x int" + } else { + descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr" + } + var addr string + if s.IsAddr { + addr = "address of " + } + return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name()) +} + +func (p *Package) String() string { + return "package " + p.Pkg.Path() +} + +var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer + +func (p *Package) WriteTo(w io.Writer) (int64, error) { + var buf bytes.Buffer + WritePackage(&buf, p) + n, err := w.Write(buf.Bytes()) + return int64(n), err +} + +// WritePackage writes to buf a human-readable summary of p. +func WritePackage(buf *bytes.Buffer, p *Package) { + fmt.Fprintf(buf, "%s:\n", p) + + var names []string + maxname := 0 + for name := range p.Members { + if l := len(name); l > maxname { + maxname = l + } + names = append(names, name) + } + + from := p.Pkg + sort.Strings(names) + for _, name := range names { + switch mem := p.Members[name].(type) { + case *NamedConst: + fmt.Fprintf(buf, " const %-*s %s = %s\n", + maxname, name, mem.Name(), mem.Value.RelString(from)) + + case *Function: + fmt.Fprintf(buf, " func %-*s %s\n", + maxname, name, relType(mem.Type(), from)) + + case *Type: + fmt.Fprintf(buf, " type %-*s %s\n", + maxname, name, relType(mem.Type().Underlying(), from)) + for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) { + fmt.Fprintf(buf, " %s\n", types.SelectionString(meth, types.RelativeTo(from))) + } + + case *Global: + fmt.Fprintf(buf, " var %-*s %s\n", + maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from)) + } + } + + fmt.Fprintf(buf, "\n") +} + +func commaOk(x bool) string { + if x { + return ",ok" + } + return "" +} diff --git a/vendor/honnef.co/go/tools/ssa/sanity.go b/vendor/honnef.co/go/tools/ssa/sanity.go new file mode 100644 index 00000000..1d29b66b --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/sanity.go @@ -0,0 +1,535 @@ +// Copyright 2013 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 ssa + +// An optional pass for sanity-checking invariants of the SSA representation. +// Currently it checks CFG invariants but little at the instruction level. + +import ( + "fmt" + "go/types" + "io" + "os" + "strings" +) + +type sanity struct { + reporter io.Writer + fn *Function + block *BasicBlock + instrs map[Instruction]struct{} + insane bool +} + +// sanityCheck performs integrity checking of the SSA representation +// of the function fn and returns true if it was valid. Diagnostics +// are written to reporter if non-nil, os.Stderr otherwise. Some +// diagnostics are only warnings and do not imply a negative result. +// +// Sanity-checking is intended to facilitate the debugging of code +// transformation passes. +// +func sanityCheck(fn *Function, reporter io.Writer) bool { + if reporter == nil { + reporter = os.Stderr + } + return (&sanity{reporter: reporter}).checkFunction(fn) +} + +// mustSanityCheck is like sanityCheck but panics instead of returning +// a negative result. +// +func mustSanityCheck(fn *Function, reporter io.Writer) { + if !sanityCheck(fn, reporter) { + fn.WriteTo(os.Stderr) + panic("SanityCheck failed") + } +} + +func (s *sanity) diagnostic(prefix, format string, args ...interface{}) { + fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn) + if s.block != nil { + fmt.Fprintf(s.reporter, ", block %s", s.block) + } + io.WriteString(s.reporter, ": ") + fmt.Fprintf(s.reporter, format, args...) + io.WriteString(s.reporter, "\n") +} + +func (s *sanity) errorf(format string, args ...interface{}) { + s.insane = true + s.diagnostic("Error", format, args...) +} + +func (s *sanity) warnf(format string, args ...interface{}) { + s.diagnostic("Warning", format, args...) +} + +// findDuplicate returns an arbitrary basic block that appeared more +// than once in blocks, or nil if all were unique. +func findDuplicate(blocks []*BasicBlock) *BasicBlock { + if len(blocks) < 2 { + return nil + } + if blocks[0] == blocks[1] { + return blocks[0] + } + // Slow path: + m := make(map[*BasicBlock]bool) + for _, b := range blocks { + if m[b] { + return b + } + m[b] = true + } + return nil +} + +func (s *sanity) checkInstr(idx int, instr Instruction) { + switch instr := instr.(type) { + case *If, *Jump, *Return, *Panic: + s.errorf("control flow instruction not at end of block") + case *Phi: + if idx == 0 { + // It suffices to apply this check to just the first phi node. + if dup := findDuplicate(s.block.Preds); dup != nil { + s.errorf("phi node in block with duplicate predecessor %s", dup) + } + } else { + prev := s.block.Instrs[idx-1] + if _, ok := prev.(*Phi); !ok { + s.errorf("Phi instruction follows a non-Phi: %T", prev) + } + } + if ne, np := len(instr.Edges), len(s.block.Preds); ne != np { + s.errorf("phi node has %d edges but %d predecessors", ne, np) + + } else { + for i, e := range instr.Edges { + if e == nil { + s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i]) + } + } + } + + case *Alloc: + if !instr.Heap { + found := false + for _, l := range s.fn.Locals { + if l == instr { + found = true + break + } + } + if !found { + s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr) + } + } + + case *BinOp: + case *Call: + case *ChangeInterface: + case *ChangeType: + case *Convert: + if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok { + if _, ok := instr.Type().Underlying().(*types.Basic); !ok { + s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type()) + } + } + + case *Defer: + case *Extract: + case *Field: + case *FieldAddr: + case *Go: + case *Index: + case *IndexAddr: + case *Lookup: + case *MakeChan: + case *MakeClosure: + numFree := len(instr.Fn.(*Function).FreeVars) + numBind := len(instr.Bindings) + if numFree != numBind { + s.errorf("MakeClosure has %d Bindings for function %s with %d free vars", + numBind, instr.Fn, numFree) + + } + if recv := instr.Type().(*types.Signature).Recv(); recv != nil { + s.errorf("MakeClosure's type includes receiver %s", recv.Type()) + } + + case *MakeInterface: + case *MakeMap: + case *MakeSlice: + case *MapUpdate: + case *Next: + case *Range: + case *RunDefers: + case *Select: + case *Send: + case *Slice: + case *Store: + case *TypeAssert: + case *UnOp: + case *DebugRef: + case *BlankStore: + case *Sigma: + // TODO(adonovan): implement checks. + default: + panic(fmt.Sprintf("Unknown instruction type: %T", instr)) + } + + if call, ok := instr.(CallInstruction); ok { + if call.Common().Signature() == nil { + s.errorf("nil signature: %s", call) + } + } + + // Check that value-defining instructions have valid types + // and a valid referrer list. + if v, ok := instr.(Value); ok { + t := v.Type() + if t == nil { + s.errorf("no type: %s = %s", v.Name(), v) + } else if t == tRangeIter { + // not a proper type; ignore. + } else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 { + s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t) + } + s.checkReferrerList(v) + } + + // Untyped constants are legal as instruction Operands(), + // for example: + // _ = "foo"[0] + // or: + // if wordsize==64 {...} + + // All other non-Instruction Values can be found via their + // enclosing Function or Package. +} + +func (s *sanity) checkFinalInstr(instr Instruction) { + switch instr := instr.(type) { + case *If: + if nsuccs := len(s.block.Succs); nsuccs != 2 { + s.errorf("If-terminated block has %d successors; expected 2", nsuccs) + return + } + if s.block.Succs[0] == s.block.Succs[1] { + s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0]) + return + } + + case *Jump: + if nsuccs := len(s.block.Succs); nsuccs != 1 { + s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs) + return + } + + case *Return: + if nsuccs := len(s.block.Succs); nsuccs != 0 { + s.errorf("Return-terminated block has %d successors; expected none", nsuccs) + return + } + if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na { + s.errorf("%d-ary return in %d-ary function", na, nf) + } + + case *Panic: + if nsuccs := len(s.block.Succs); nsuccs != 0 { + s.errorf("Panic-terminated block has %d successors; expected none", nsuccs) + return + } + + default: + s.errorf("non-control flow instruction at end of block") + } +} + +func (s *sanity) checkBlock(b *BasicBlock, index int) { + s.block = b + + if b.Index != index { + s.errorf("block has incorrect Index %d", b.Index) + } + if b.parent != s.fn { + s.errorf("block has incorrect parent %s", b.parent) + } + + // Check all blocks are reachable. + // (The entry block is always implicitly reachable, + // as is the Recover block, if any.) + if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 { + s.warnf("unreachable block") + if b.Instrs == nil { + // Since this block is about to be pruned, + // tolerating transient problems in it + // simplifies other optimizations. + return + } + } + + // Check predecessor and successor relations are dual, + // and that all blocks in CFG belong to same function. + for _, a := range b.Preds { + found := false + for _, bb := range a.Succs { + if bb == b { + found = true + break + } + } + if !found { + s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs) + } + if a.parent != s.fn { + s.errorf("predecessor %s belongs to different function %s", a, a.parent) + } + } + for _, c := range b.Succs { + found := false + for _, bb := range c.Preds { + if bb == b { + found = true + break + } + } + if !found { + s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds) + } + if c.parent != s.fn { + s.errorf("successor %s belongs to different function %s", c, c.parent) + } + } + + // Check each instruction is sane. + n := len(b.Instrs) + if n == 0 { + s.errorf("basic block contains no instructions") + } + var rands [10]*Value // reuse storage + for j, instr := range b.Instrs { + if instr == nil { + s.errorf("nil instruction at index %d", j) + continue + } + if b2 := instr.Block(); b2 == nil { + s.errorf("nil Block() for instruction at index %d", j) + continue + } else if b2 != b { + s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j) + continue + } + if j < n-1 { + s.checkInstr(j, instr) + } else { + s.checkFinalInstr(instr) + } + + // Check Instruction.Operands. + operands: + for i, op := range instr.Operands(rands[:0]) { + if op == nil { + s.errorf("nil operand pointer %d of %s", i, instr) + continue + } + val := *op + if val == nil { + continue // a nil operand is ok + } + + // Check that "untyped" types only appear on constant operands. + if _, ok := (*op).(*Const); !ok { + if basic, ok := (*op).Type().(*types.Basic); ok { + if basic.Info()&types.IsUntyped != 0 { + s.errorf("operand #%d of %s is untyped: %s", i, instr, basic) + } + } + } + + // Check that Operands that are also Instructions belong to same function. + // TODO(adonovan): also check their block dominates block b. + if val, ok := val.(Instruction); ok { + if val.Block() == nil { + s.errorf("operand %d of %s is an instruction (%s) that belongs to no block", i, instr, val) + } else if val.Parent() != s.fn { + s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent()) + } + } + + // Check that each function-local operand of + // instr refers back to instr. (NB: quadratic) + switch val := val.(type) { + case *Const, *Global, *Builtin: + continue // not local + case *Function: + if val.parent == nil { + continue // only anon functions are local + } + } + + // TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined. + + if refs := val.Referrers(); refs != nil { + for _, ref := range *refs { + if ref == instr { + continue operands + } + } + s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val) + } else { + s.errorf("operand %d of %s (%s) has no referrers", i, instr, val) + } + } + } +} + +func (s *sanity) checkReferrerList(v Value) { + refs := v.Referrers() + if refs == nil { + s.errorf("%s has missing referrer list", v.Name()) + return + } + for i, ref := range *refs { + if _, ok := s.instrs[ref]; !ok { + s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref) + } + } +} + +func (s *sanity) checkFunction(fn *Function) bool { + // TODO(adonovan): check Function invariants: + // - check params match signature + // - check transient fields are nil + // - warn if any fn.Locals do not appear among block instructions. + s.fn = fn + if fn.Prog == nil { + s.errorf("nil Prog") + } + + _ = fn.String() // must not crash + _ = fn.RelString(fn.pkg()) // must not crash + + // All functions have a package, except delegates (which are + // shared across packages, or duplicated as weak symbols in a + // separate-compilation model), and error.Error. + if fn.Pkg == nil { + if strings.HasPrefix(fn.Synthetic, "wrapper ") || + strings.HasPrefix(fn.Synthetic, "bound ") || + strings.HasPrefix(fn.Synthetic, "thunk ") || + strings.HasSuffix(fn.name, "Error") { + // ok + } else { + s.errorf("nil Pkg") + } + } + if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn { + s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn) + } + for i, l := range fn.Locals { + if l.Parent() != fn { + s.errorf("Local %s at index %d has wrong parent", l.Name(), i) + } + if l.Heap { + s.errorf("Local %s at index %d has Heap flag set", l.Name(), i) + } + } + // Build the set of valid referrers. + s.instrs = make(map[Instruction]struct{}) + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + s.instrs[instr] = struct{}{} + } + } + for i, p := range fn.Params { + if p.Parent() != fn { + s.errorf("Param %s at index %d has wrong parent", p.Name(), i) + } + // Check common suffix of Signature and Params match type. + if sig := fn.Signature; sig != nil { + j := i - len(fn.Params) + sig.Params().Len() // index within sig.Params + if j < 0 { + continue + } + if !types.Identical(p.Type(), sig.Params().At(j).Type()) { + s.errorf("Param %s at index %d has wrong type (%s, versus %s in Signature)", p.Name(), i, p.Type(), sig.Params().At(j).Type()) + + } + } + + s.checkReferrerList(p) + } + for i, fv := range fn.FreeVars { + if fv.Parent() != fn { + s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i) + } + s.checkReferrerList(fv) + } + + if fn.Blocks != nil && len(fn.Blocks) == 0 { + // Function _had_ blocks (so it's not external) but + // they were "optimized" away, even the entry block. + s.errorf("Blocks slice is non-nil but empty") + } + for i, b := range fn.Blocks { + if b == nil { + s.warnf("nil *BasicBlock at f.Blocks[%d]", i) + continue + } + s.checkBlock(b, i) + } + if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover { + s.errorf("Recover block is not in Blocks slice") + } + + s.block = nil + for i, anon := range fn.AnonFuncs { + if anon.Parent() != fn { + s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent()) + } + } + s.fn = nil + return !s.insane +} + +// sanityCheckPackage checks invariants of packages upon creation. +// It does not require that the package is built. +// Unlike sanityCheck (for functions), it just panics at the first error. +func sanityCheckPackage(pkg *Package) { + if pkg.Pkg == nil { + panic(fmt.Sprintf("Package %s has no Object", pkg)) + } + _ = pkg.String() // must not crash + + for name, mem := range pkg.Members { + if name != mem.Name() { + panic(fmt.Sprintf("%s: %T.Name() = %s, want %s", + pkg.Pkg.Path(), mem, mem.Name(), name)) + } + obj := mem.Object() + if obj == nil { + // This check is sound because fields + // {Global,Function}.object have type + // types.Object. (If they were declared as + // *types.{Var,Func}, we'd have a non-empty + // interface containing a nil pointer.) + + continue // not all members have typechecker objects + } + if obj.Name() != name { + if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") { + // Ok. The name of a declared init function varies between + // its types.Func ("init") and its ssa.Function ("init#%d"). + } else { + panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s", + pkg.Pkg.Path(), mem, obj.Name(), name)) + } + } + if obj.Pos() != mem.Pos() { + panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos())) + } + } +} diff --git a/vendor/honnef.co/go/tools/ssa/source.go b/vendor/honnef.co/go/tools/ssa/source.go new file mode 100644 index 00000000..8d9cca17 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/source.go @@ -0,0 +1,293 @@ +// Copyright 2013 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 ssa + +// This file defines utilities for working with source positions +// or source-level named entities ("objects"). + +// TODO(adonovan): test that {Value,Instruction}.Pos() positions match +// the originating syntax, as specified. + +import ( + "go/ast" + "go/token" + "go/types" +) + +// EnclosingFunction returns the function that contains the syntax +// node denoted by path. +// +// Syntax associated with package-level variable specifications is +// enclosed by the package's init() function. +// +// Returns nil if not found; reasons might include: +// - the node is not enclosed by any function. +// - the node is within an anonymous function (FuncLit) and +// its SSA function has not been created yet +// (pkg.Build() has not yet been called). +// +func EnclosingFunction(pkg *Package, path []ast.Node) *Function { + // Start with package-level function... + fn := findEnclosingPackageLevelFunction(pkg, path) + if fn == nil { + return nil // not in any function + } + + // ...then walk down the nested anonymous functions. + n := len(path) +outer: + for i := range path { + if lit, ok := path[n-1-i].(*ast.FuncLit); ok { + for _, anon := range fn.AnonFuncs { + if anon.Pos() == lit.Type.Func { + fn = anon + continue outer + } + } + // SSA function not found: + // - package not yet built, or maybe + // - builder skipped FuncLit in dead block + // (in principle; but currently the Builder + // generates even dead FuncLits). + return nil + } + } + return fn +} + +// HasEnclosingFunction returns true if the AST node denoted by path +// is contained within the declaration of some function or +// package-level variable. +// +// Unlike EnclosingFunction, the behaviour of this function does not +// depend on whether SSA code for pkg has been built, so it can be +// used to quickly reject check inputs that will cause +// EnclosingFunction to fail, prior to SSA building. +// +func HasEnclosingFunction(pkg *Package, path []ast.Node) bool { + return findEnclosingPackageLevelFunction(pkg, path) != nil +} + +// findEnclosingPackageLevelFunction returns the Function +// corresponding to the package-level function enclosing path. +// +func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function { + if n := len(path); n >= 2 { // [... {Gen,Func}Decl File] + switch decl := path[n-2].(type) { + case *ast.GenDecl: + if decl.Tok == token.VAR && n >= 3 { + // Package-level 'var' initializer. + return pkg.init + } + + case *ast.FuncDecl: + if decl.Recv == nil && decl.Name.Name == "init" { + // Explicit init() function. + for _, b := range pkg.init.Blocks { + for _, instr := range b.Instrs { + if instr, ok := instr.(*Call); ok { + if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos { + return callee + } + } + } + } + // Hack: return non-nil when SSA is not yet + // built so that HasEnclosingFunction works. + return pkg.init + } + // Declared function/method. + return findNamedFunc(pkg, decl.Name.NamePos) + } + } + return nil // not in any function +} + +// findNamedFunc returns the named function whose FuncDecl.Ident is at +// position pos. +// +func findNamedFunc(pkg *Package, pos token.Pos) *Function { + // Look at all package members and method sets of named types. + // Not very efficient. + for _, mem := range pkg.Members { + switch mem := mem.(type) { + case *Function: + if mem.Pos() == pos { + return mem + } + case *Type: + mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type())) + for i, n := 0, mset.Len(); i < n; i++ { + // Don't call Program.Method: avoid creating wrappers. + obj := mset.At(i).Obj().(*types.Func) + if obj.Pos() == pos { + return pkg.values[obj].(*Function) + } + } + } + } + return nil +} + +// ValueForExpr returns the SSA Value that corresponds to non-constant +// expression e. +// +// It returns nil if no value was found, e.g. +// - the expression is not lexically contained within f; +// - f was not built with debug information; or +// - e is a constant expression. (For efficiency, no debug +// information is stored for constants. Use +// go/types.Info.Types[e].Value instead.) +// - e is a reference to nil or a built-in function. +// - the value was optimised away. +// +// If e is an addressable expression used in an lvalue context, +// value is the address denoted by e, and isAddr is true. +// +// The types of e (or &e, if isAddr) and the result are equal +// (modulo "untyped" bools resulting from comparisons). +// +// (Tip: to find the ssa.Value given a source position, use +// astutil.PathEnclosingInterval to locate the ast.Node, then +// EnclosingFunction to locate the Function, then ValueForExpr to find +// the ssa.Value.) +// +func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) { + if f.debugInfo() { // (opt) + e = unparen(e) + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + if ref, ok := instr.(*DebugRef); ok { + if ref.Expr == e { + return ref.X, ref.IsAddr + } + } + } + } + } + return +} + +// --- Lookup functions for source-level named entities (types.Objects) --- + +// Package returns the SSA Package corresponding to the specified +// type-checker package object. +// It returns nil if no such SSA package has been created. +// +func (prog *Program) Package(obj *types.Package) *Package { + return prog.packages[obj] +} + +// packageLevelValue returns the package-level value corresponding to +// the specified named object, which may be a package-level const +// (*Const), var (*Global) or func (*Function) of some package in +// prog. It returns nil if the object is not found. +// +func (prog *Program) packageLevelValue(obj types.Object) Value { + if pkg, ok := prog.packages[obj.Pkg()]; ok { + return pkg.values[obj] + } + return nil +} + +// FuncValue returns the concrete Function denoted by the source-level +// named function obj, or nil if obj denotes an interface method. +// +// TODO(adonovan): check the invariant that obj.Type() matches the +// result's Signature, both in the params/results and in the receiver. +// +func (prog *Program) FuncValue(obj *types.Func) *Function { + fn, _ := prog.packageLevelValue(obj).(*Function) + return fn +} + +// ConstValue returns the SSA Value denoted by the source-level named +// constant obj. +// +func (prog *Program) ConstValue(obj *types.Const) *Const { + // TODO(adonovan): opt: share (don't reallocate) + // Consts for const objects and constant ast.Exprs. + + // Universal constant? {true,false,nil} + if obj.Parent() == types.Universe { + return NewConst(obj.Val(), obj.Type()) + } + // Package-level named constant? + if v := prog.packageLevelValue(obj); v != nil { + return v.(*Const) + } + return NewConst(obj.Val(), obj.Type()) +} + +// VarValue returns the SSA Value that corresponds to a specific +// identifier denoting the source-level named variable obj. +// +// VarValue returns nil if a local variable was not found, perhaps +// because its package was not built, the debug information was not +// requested during SSA construction, or the value was optimized away. +// +// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval), +// and that ident must resolve to obj. +// +// pkg is the package enclosing the reference. (A reference to a var +// always occurs within a function, so we need to know where to find it.) +// +// If the identifier is a field selector and its base expression is +// non-addressable, then VarValue returns the value of that field. +// For example: +// func f() struct {x int} +// f().x // VarValue(x) returns a *Field instruction of type int +// +// All other identifiers denote addressable locations (variables). +// For them, VarValue may return either the variable's address or its +// value, even when the expression is evaluated only for its value; the +// situation is reported by isAddr, the second component of the result. +// +// If !isAddr, the returned value is the one associated with the +// specific identifier. For example, +// var x int // VarValue(x) returns Const 0 here +// x = 1 // VarValue(x) returns Const 1 here +// +// It is not specified whether the value or the address is returned in +// any particular case, as it may depend upon optimizations performed +// during SSA code generation, such as registerization, constant +// folding, avoidance of materialization of subexpressions, etc. +// +func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) { + // All references to a var are local to some function, possibly init. + fn := EnclosingFunction(pkg, ref) + if fn == nil { + return // e.g. def of struct field; SSA not built? + } + + id := ref[0].(*ast.Ident) + + // Defining ident of a parameter? + if id.Pos() == obj.Pos() { + for _, param := range fn.Params { + if param.Object() == obj { + return param, false + } + } + } + + // Other ident? + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + if dr, ok := instr.(*DebugRef); ok { + if dr.Pos() == id.Pos() { + return dr.X, dr.IsAddr + } + } + } + } + + // Defining ident of package-level var? + if v := prog.packageLevelValue(obj); v != nil { + return v.(*Global), true + } + + return // e.g. debug info not requested, or var optimized away +} diff --git a/vendor/honnef.co/go/tools/ssa/ssa.go b/vendor/honnef.co/go/tools/ssa/ssa.go new file mode 100644 index 00000000..aeddd65e --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/ssa.go @@ -0,0 +1,1745 @@ +// Copyright 2013 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 ssa + +// This package defines a high-level intermediate representation for +// Go programs using static single-assignment (SSA) form. + +import ( + "fmt" + "go/ast" + "go/constant" + "go/token" + "go/types" + "sync" + + "golang.org/x/tools/go/types/typeutil" +) + +// A Program is a partial or complete Go program converted to SSA form. +type Program struct { + Fset *token.FileSet // position information for the files of this Program + imported map[string]*Package // all importable Packages, keyed by import path + packages map[*types.Package]*Package // all loaded Packages, keyed by object + mode BuilderMode // set of mode bits for SSA construction + MethodSets typeutil.MethodSetCache // cache of type-checker's method-sets + + methodsMu sync.Mutex // guards the following maps: + methodSets typeutil.Map // maps type to its concrete methodSet + runtimeTypes typeutil.Map // types for which rtypes are needed + canon typeutil.Map // type canonicalization map + bounds map[*types.Func]*Function // bounds for curried x.Method closures + thunks map[selectionKey]*Function // thunks for T.Method expressions +} + +// A Package is a single analyzed Go package containing Members for +// all package-level functions, variables, constants and types it +// declares. These may be accessed directly via Members, or via the +// type-specific accessor methods Func, Type, Var and Const. +// +// Members also contains entries for "init" (the synthetic package +// initializer) and "init#%d", the nth declared init function, +// and unspecified other things too. +// +type Package struct { + Prog *Program // the owning program + Pkg *types.Package // the corresponding go/types.Package + Members map[string]Member // all package members keyed by name (incl. init and init#%d) + values map[types.Object]Value // package members (incl. types and methods), keyed by object + init *Function // Func("init"); the package's init function + debug bool // include full debug info in this package + + // The following fields are set transiently, then cleared + // after building. + buildOnce sync.Once // ensures package building occurs once + ninit int32 // number of init functions + info *types.Info // package type information + files []*ast.File // package ASTs +} + +// A Member is a member of a Go package, implemented by *NamedConst, +// *Global, *Function, or *Type; they are created by package-level +// const, var, func and type declarations respectively. +// +type Member interface { + Name() string // declared name of the package member + String() string // package-qualified name of the package member + RelString(*types.Package) string // like String, but relative refs are unqualified + Object() types.Object // typechecker's object for this member, if any + Pos() token.Pos // position of member's declaration, if known + Type() types.Type // type of the package member + Token() token.Token // token.{VAR,FUNC,CONST,TYPE} + Package() *Package // the containing package +} + +// A Type is a Member of a Package representing a package-level named type. +type Type struct { + object *types.TypeName + pkg *Package +} + +// A NamedConst is a Member of a Package representing a package-level +// named constant. +// +// Pos() returns the position of the declaring ast.ValueSpec.Names[*] +// identifier. +// +// NB: a NamedConst is not a Value; it contains a constant Value, which +// it augments with the name and position of its 'const' declaration. +// +type NamedConst struct { + object *types.Const + Value *Const + pkg *Package +} + +// A Value is an SSA value that can be referenced by an instruction. +type Value interface { + // Name returns the name of this value, and determines how + // this Value appears when used as an operand of an + // Instruction. + // + // This is the same as the source name for Parameters, + // Builtins, Functions, FreeVars, Globals. + // For constants, it is a representation of the constant's value + // and type. For all other Values this is the name of the + // virtual register defined by the instruction. + // + // The name of an SSA Value is not semantically significant, + // and may not even be unique within a function. + Name() string + + // If this value is an Instruction, String returns its + // disassembled form; otherwise it returns unspecified + // human-readable information about the Value, such as its + // kind, name and type. + String() string + + // Type returns the type of this value. Many instructions + // (e.g. IndexAddr) change their behaviour depending on the + // types of their operands. + Type() types.Type + + // Parent returns the function to which this Value belongs. + // It returns nil for named Functions, Builtin, Const and Global. + Parent() *Function + + // Referrers returns the list of instructions that have this + // value as one of their operands; it may contain duplicates + // if an instruction has a repeated operand. + // + // Referrers actually returns a pointer through which the + // caller may perform mutations to the object's state. + // + // Referrers is currently only defined if Parent()!=nil, + // i.e. for the function-local values FreeVar, Parameter, + // Functions (iff anonymous) and all value-defining instructions. + // It returns nil for named Functions, Builtin, Const and Global. + // + // Instruction.Operands contains the inverse of this relation. + Referrers() *[]Instruction + + // Pos returns the location of the AST token most closely + // associated with the operation that gave rise to this value, + // or token.NoPos if it was not explicit in the source. + // + // For each ast.Node type, a particular token is designated as + // the closest location for the expression, e.g. the Lparen + // for an *ast.CallExpr. This permits a compact but + // approximate mapping from Values to source positions for use + // in diagnostic messages, for example. + // + // (Do not use this position to determine which Value + // corresponds to an ast.Expr; use Function.ValueForExpr + // instead. NB: it requires that the function was built with + // debug information.) + Pos() token.Pos +} + +// An Instruction is an SSA instruction that computes a new Value or +// has some effect. +// +// An Instruction that defines a value (e.g. BinOp) also implements +// the Value interface; an Instruction that only has an effect (e.g. Store) +// does not. +// +type Instruction interface { + // String returns the disassembled form of this value. + // + // Examples of Instructions that are Values: + // "x + y" (BinOp) + // "len([])" (Call) + // Note that the name of the Value is not printed. + // + // Examples of Instructions that are not Values: + // "return x" (Return) + // "*y = x" (Store) + // + // (The separation Value.Name() from Value.String() is useful + // for some analyses which distinguish the operation from the + // value it defines, e.g., 'y = local int' is both an allocation + // of memory 'local int' and a definition of a pointer y.) + String() string + + // Parent returns the function to which this instruction + // belongs. + Parent() *Function + + // Block returns the basic block to which this instruction + // belongs. + Block() *BasicBlock + + // setBlock sets the basic block to which this instruction belongs. + setBlock(*BasicBlock) + + // Operands returns the operands of this instruction: the + // set of Values it references. + // + // Specifically, it appends their addresses to rands, a + // user-provided slice, and returns the resulting slice, + // permitting avoidance of memory allocation. + // + // The operands are appended in undefined order, but the order + // is consistent for a given Instruction; the addresses are + // always non-nil but may point to a nil Value. Clients may + // store through the pointers, e.g. to effect a value + // renaming. + // + // Value.Referrers is a subset of the inverse of this + // relation. (Referrers are not tracked for all types of + // Values.) + Operands(rands []*Value) []*Value + + // Pos returns the location of the AST token most closely + // associated with the operation that gave rise to this + // instruction, or token.NoPos if it was not explicit in the + // source. + // + // For each ast.Node type, a particular token is designated as + // the closest location for the expression, e.g. the Go token + // for an *ast.GoStmt. This permits a compact but approximate + // mapping from Instructions to source positions for use in + // diagnostic messages, for example. + // + // (Do not use this position to determine which Instruction + // corresponds to an ast.Expr; see the notes for Value.Pos. + // This position may be used to determine which non-Value + // Instruction corresponds to some ast.Stmts, but not all: If + // and Jump instructions have no Pos(), for example.) + Pos() token.Pos +} + +// A Node is a node in the SSA value graph. Every concrete type that +// implements Node is also either a Value, an Instruction, or both. +// +// Node contains the methods common to Value and Instruction, plus the +// Operands and Referrers methods generalized to return nil for +// non-Instructions and non-Values, respectively. +// +// Node is provided to simplify SSA graph algorithms. Clients should +// use the more specific and informative Value or Instruction +// interfaces where appropriate. +// +type Node interface { + // Common methods: + String() string + Pos() token.Pos + Parent() *Function + + // Partial methods: + Operands(rands []*Value) []*Value // nil for non-Instructions + Referrers() *[]Instruction // nil for non-Values +} + +// Function represents the parameters, results, and code of a function +// or method. +// +// If Blocks is nil, this indicates an external function for which no +// Go source code is available. In this case, FreeVars and Locals +// are nil too. Clients performing whole-program analysis must +// handle external functions specially. +// +// Blocks contains the function's control-flow graph (CFG). +// Blocks[0] is the function entry point; block order is not otherwise +// semantically significant, though it may affect the readability of +// the disassembly. +// To iterate over the blocks in dominance order, use DomPreorder(). +// +// Recover is an optional second entry point to which control resumes +// after a recovered panic. The Recover block may contain only a return +// statement, preceded by a load of the function's named return +// parameters, if any. +// +// A nested function (Parent()!=nil) that refers to one or more +// lexically enclosing local variables ("free variables") has FreeVars. +// Such functions cannot be called directly but require a +// value created by MakeClosure which, via its Bindings, supplies +// values for these parameters. +// +// If the function is a method (Signature.Recv() != nil) then the first +// element of Params is the receiver parameter. +// +// A Go package may declare many functions called "init". +// For each one, Object().Name() returns "init" but Name() returns +// "init#1", etc, in declaration order. +// +// Pos() returns the declaring ast.FuncLit.Type.Func or the position +// of the ast.FuncDecl.Name, if the function was explicit in the +// source. Synthetic wrappers, for which Synthetic != "", may share +// the same position as the function they wrap. +// Syntax.Pos() always returns the position of the declaring "func" token. +// +// Type() returns the function's Signature. +// +type Function struct { + name string + object types.Object // a declared *types.Func or one of its wrappers + method *types.Selection // info about provenance of synthetic methods + Signature *types.Signature + pos token.Pos + + Synthetic string // provenance of synthetic function; "" for true source functions + syntax ast.Node // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode + parent *Function // enclosing function if anon; nil if global + Pkg *Package // enclosing package; nil for shared funcs (wrappers and error.Error) + Prog *Program // enclosing program + Params []*Parameter // function parameters; for methods, includes receiver + FreeVars []*FreeVar // free variables whose values must be supplied by closure + Locals []*Alloc // local variables of this function + Blocks []*BasicBlock // basic blocks of the function; nil => external + Recover *BasicBlock // optional; control transfers here after recovered panic + AnonFuncs []*Function // anonymous functions directly beneath this one + referrers []Instruction // referring instructions (iff Parent() != nil) + + // The following fields are set transiently during building, + // then cleared. + currentBlock *BasicBlock // where to emit code + objects map[types.Object]Value // addresses of local variables + namedResults []*Alloc // tuple of named results + targets *targets // linked stack of branch targets + lblocks map[*ast.Object]*lblock // labelled blocks +} + +// BasicBlock represents an SSA basic block. +// +// The final element of Instrs is always an explicit transfer of +// control (If, Jump, Return, or Panic). +// +// A block may contain no Instructions only if it is unreachable, +// i.e., Preds is nil. Empty blocks are typically pruned. +// +// BasicBlocks and their Preds/Succs relation form a (possibly cyclic) +// graph independent of the SSA Value graph: the control-flow graph or +// CFG. It is illegal for multiple edges to exist between the same +// pair of blocks. +// +// Each BasicBlock is also a node in the dominator tree of the CFG. +// The tree may be navigated using Idom()/Dominees() and queried using +// Dominates(). +// +// The order of Preds and Succs is significant (to Phi and If +// instructions, respectively). +// +type BasicBlock struct { + Index int // index of this block within Parent().Blocks + Comment string // optional label; no semantic significance + parent *Function // parent function + Instrs []Instruction // instructions in order + Preds, Succs []*BasicBlock // predecessors and successors + succs2 [2]*BasicBlock // initial space for Succs + dom domInfo // dominator tree info + gaps int // number of nil Instrs (transient) + rundefers int // number of rundefers (transient) +} + +// Pure values ---------------------------------------- + +// A FreeVar represents a free variable of the function to which it +// belongs. +// +// FreeVars are used to implement anonymous functions, whose free +// variables are lexically captured in a closure formed by +// MakeClosure. The value of such a free var is an Alloc or another +// FreeVar and is considered a potentially escaping heap address, with +// pointer type. +// +// FreeVars are also used to implement bound method closures. Such a +// free var represents the receiver value and may be of any type that +// has concrete methods. +// +// Pos() returns the position of the value that was captured, which +// belongs to an enclosing function. +// +type FreeVar struct { + name string + typ types.Type + pos token.Pos + parent *Function + referrers []Instruction + + // Transiently needed during building. + outer Value // the Value captured from the enclosing context. +} + +// A Parameter represents an input parameter of a function. +// +type Parameter struct { + name string + object types.Object // a *types.Var; nil for non-source locals + typ types.Type + pos token.Pos + parent *Function + referrers []Instruction +} + +// A Const represents the value of a constant expression. +// +// The underlying type of a constant may be any boolean, numeric, or +// string type. In addition, a Const may represent the nil value of +// any reference type---interface, map, channel, pointer, slice, or +// function---but not "untyped nil". +// +// All source-level constant expressions are represented by a Const +// of the same type and value. +// +// Value holds the exact value of the constant, independent of its +// Type(), using the same representation as package go/constant uses for +// constants, or nil for a typed nil value. +// +// Pos() returns token.NoPos. +// +// Example printed form: +// 42:int +// "hello":untyped string +// 3+4i:MyComplex +// +type Const struct { + typ types.Type + Value constant.Value +} + +// A Global is a named Value holding the address of a package-level +// variable. +// +// Pos() returns the position of the ast.ValueSpec.Names[*] +// identifier. +// +type Global struct { + name string + object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard + typ types.Type + pos token.Pos + + Pkg *Package +} + +// A Builtin represents a specific use of a built-in function, e.g. len. +// +// Builtins are immutable values. Builtins do not have addresses. +// Builtins can only appear in CallCommon.Func. +// +// Name() indicates the function: one of the built-in functions from the +// Go spec (excluding "make" and "new") or one of these ssa-defined +// intrinsics: +// +// // wrapnilchk returns ptr if non-nil, panics otherwise. +// // (For use in indirection wrappers.) +// func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T +// +// Object() returns a *types.Builtin for built-ins defined by the spec, +// nil for others. +// +// Type() returns a *types.Signature representing the effective +// signature of the built-in for this call. +// +type Builtin struct { + name string + sig *types.Signature +} + +// Value-defining instructions ---------------------------------------- + +// The Alloc instruction reserves space for a variable of the given type, +// zero-initializes it, and yields its address. +// +// Alloc values are always addresses, and have pointer types, so the +// type of the allocated variable is actually +// Type().Underlying().(*types.Pointer).Elem(). +// +// If Heap is false, Alloc allocates space in the function's +// activation record (frame); we refer to an Alloc(Heap=false) as a +// "local" alloc. Each local Alloc returns the same address each time +// it is executed within the same activation; the space is +// re-initialized to zero. +// +// If Heap is true, Alloc allocates space in the heap; we +// refer to an Alloc(Heap=true) as a "new" alloc. Each new Alloc +// returns a different address each time it is executed. +// +// When Alloc is applied to a channel, map or slice type, it returns +// the address of an uninitialized (nil) reference of that kind; store +// the result of MakeSlice, MakeMap or MakeChan in that location to +// instantiate these types. +// +// Pos() returns the ast.CompositeLit.Lbrace for a composite literal, +// or the ast.CallExpr.Rparen for a call to new() or for a call that +// allocates a varargs slice. +// +// Example printed form: +// t0 = local int +// t1 = new int +// +type Alloc struct { + register + Comment string + Heap bool + index int // dense numbering; for lifting +} + +var _ Instruction = (*Sigma)(nil) +var _ Value = (*Sigma)(nil) + +type Sigma struct { + register + X Value + Branch bool +} + +func (p *Sigma) Value() Value { + v := p.X + for { + sigma, ok := v.(*Sigma) + if !ok { + break + } + v = sigma + } + return v +} + +func (p *Sigma) String() string { + return fmt.Sprintf("σ [%s.%t]", relName(p.X, p), p.Branch) +} + +// The Phi instruction represents an SSA φ-node, which combines values +// that differ across incoming control-flow edges and yields a new +// value. Within a block, all φ-nodes must appear before all non-φ +// nodes. +// +// Pos() returns the position of the && or || for short-circuit +// control-flow joins, or that of the *Alloc for φ-nodes inserted +// during SSA renaming. +// +// Example printed form: +// t2 = phi [0: t0, 1: t1] +// +type Phi struct { + register + Comment string // a hint as to its purpose + Edges []Value // Edges[i] is value for Block().Preds[i] +} + +// The Call instruction represents a function or method call. +// +// The Call instruction yields the function result if there is exactly +// one. Otherwise it returns a tuple, the components of which are +// accessed via Extract. +// +// See CallCommon for generic function call documentation. +// +// Pos() returns the ast.CallExpr.Lparen, if explicit in the source. +// +// Example printed form: +// t2 = println(t0, t1) +// t4 = t3() +// t7 = invoke t5.Println(...t6) +// +type Call struct { + register + Call CallCommon +} + +// The BinOp instruction yields the result of binary operation X Op Y. +// +// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source. +// +// Example printed form: +// t1 = t0 + 1:int +// +type BinOp struct { + register + // One of: + // ADD SUB MUL QUO REM + - * / % + // AND OR XOR SHL SHR AND_NOT & | ^ << >> &^ + // EQL NEQ LSS LEQ GTR GEQ == != < <= < >= + Op token.Token + X, Y Value +} + +// The UnOp instruction yields the result of Op X. +// ARROW is channel receive. +// MUL is pointer indirection (load). +// XOR is bitwise complement. +// SUB is negation. +// NOT is logical negation. +// +// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above +// and a boolean indicating the success of the receive. The +// components of the tuple are accessed using Extract. +// +// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source. +// For receive operations (ARROW) implicit in ranging over a channel, +// Pos() returns the ast.RangeStmt.For. +// For implicit memory loads (STAR), Pos() returns the position of the +// most closely associated source-level construct; the details are not +// specified. +// +// Example printed form: +// t0 = *x +// t2 = <-t1,ok +// +type UnOp struct { + register + Op token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^ + X Value + CommaOk bool +} + +// The ChangeType instruction applies to X a value-preserving type +// change to Type(). +// +// Type changes are permitted: +// - between a named type and its underlying type. +// - between two named types of the same underlying type. +// - between (possibly named) pointers to identical base types. +// - from a bidirectional channel to a read- or write-channel, +// optionally adding/removing a name. +// +// This operation cannot fail dynamically. +// +// Pos() returns the ast.CallExpr.Lparen, if the instruction arose +// from an explicit conversion in the source. +// +// Example printed form: +// t1 = changetype *int <- IntPtr (t0) +// +type ChangeType struct { + register + X Value +} + +// The Convert instruction yields the conversion of value X to type +// Type(). One or both of those types is basic (but possibly named). +// +// A conversion may change the value and representation of its operand. +// Conversions are permitted: +// - between real numeric types. +// - between complex numeric types. +// - between string and []byte or []rune. +// - between pointers and unsafe.Pointer. +// - between unsafe.Pointer and uintptr. +// - from (Unicode) integer to (UTF-8) string. +// A conversion may imply a type name change also. +// +// This operation cannot fail dynamically. +// +// Conversions of untyped string/number/bool constants to a specific +// representation are eliminated during SSA construction. +// +// Pos() returns the ast.CallExpr.Lparen, if the instruction arose +// from an explicit conversion in the source. +// +// Example printed form: +// t1 = convert []byte <- string (t0) +// +type Convert struct { + register + X Value +} + +// ChangeInterface constructs a value of one interface type from a +// value of another interface type known to be assignable to it. +// This operation cannot fail. +// +// Pos() returns the ast.CallExpr.Lparen if the instruction arose from +// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the +// instruction arose from an explicit e.(T) operation; or token.NoPos +// otherwise. +// +// Example printed form: +// t1 = change interface interface{} <- I (t0) +// +type ChangeInterface struct { + register + X Value +} + +// MakeInterface constructs an instance of an interface type from a +// value of a concrete type. +// +// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set +// of X, and Program.MethodValue(m) to find the implementation of a method. +// +// To construct the zero value of an interface type T, use: +// NewConst(constant.MakeNil(), T, pos) +// +// Pos() returns the ast.CallExpr.Lparen, if the instruction arose +// from an explicit conversion in the source. +// +// Example printed form: +// t1 = make interface{} <- int (42:int) +// t2 = make Stringer <- t0 +// +type MakeInterface struct { + register + X Value +} + +// The MakeClosure instruction yields a closure value whose code is +// Fn and whose free variables' values are supplied by Bindings. +// +// Type() returns a (possibly named) *types.Signature. +// +// Pos() returns the ast.FuncLit.Type.Func for a function literal +// closure or the ast.SelectorExpr.Sel for a bound method closure. +// +// Example printed form: +// t0 = make closure anon@1.2 [x y z] +// t1 = make closure bound$(main.I).add [i] +// +type MakeClosure struct { + register + Fn Value // always a *Function + Bindings []Value // values for each free variable in Fn.FreeVars +} + +// The MakeMap instruction creates a new hash-table-based map object +// and yields a value of kind map. +// +// Type() returns a (possibly named) *types.Map. +// +// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or +// the ast.CompositeLit.Lbrack if created by a literal. +// +// Example printed form: +// t1 = make map[string]int t0 +// t1 = make StringIntMap t0 +// +type MakeMap struct { + register + Reserve Value // initial space reservation; nil => default +} + +// The MakeChan instruction creates a new channel object and yields a +// value of kind chan. +// +// Type() returns a (possibly named) *types.Chan. +// +// Pos() returns the ast.CallExpr.Lparen for the make(chan) that +// created it. +// +// Example printed form: +// t0 = make chan int 0 +// t0 = make IntChan 0 +// +type MakeChan struct { + register + Size Value // int; size of buffer; zero => synchronous. +} + +// The MakeSlice instruction yields a slice of length Len backed by a +// newly allocated array of length Cap. +// +// Both Len and Cap must be non-nil Values of integer type. +// +// (Alloc(types.Array) followed by Slice will not suffice because +// Alloc can only create arrays of constant length.) +// +// Type() returns a (possibly named) *types.Slice. +// +// Pos() returns the ast.CallExpr.Lparen for the make([]T) that +// created it. +// +// Example printed form: +// t1 = make []string 1:int t0 +// t1 = make StringSlice 1:int t0 +// +type MakeSlice struct { + register + Len Value + Cap Value +} + +// The Slice instruction yields a slice of an existing string, slice +// or *array X between optional integer bounds Low and High. +// +// Dynamically, this instruction panics if X evaluates to a nil *array +// pointer. +// +// Type() returns string if the type of X was string, otherwise a +// *types.Slice with the same element type as X. +// +// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice +// operation, the ast.CompositeLit.Lbrace if created by a literal, or +// NoPos if not explicit in the source (e.g. a variadic argument slice). +// +// Example printed form: +// t1 = slice t0[1:] +// +type Slice struct { + register + X Value // slice, string, or *array + Low, High, Max Value // each may be nil +} + +// The FieldAddr instruction yields the address of Field of *struct X. +// +// The field is identified by its index within the field list of the +// struct type of X. +// +// Dynamically, this instruction panics if X evaluates to a nil +// pointer. +// +// Type() returns a (possibly named) *types.Pointer. +// +// Pos() returns the position of the ast.SelectorExpr.Sel for the +// field, if explicit in the source. +// +// Example printed form: +// t1 = &t0.name [#1] +// +type FieldAddr struct { + register + X Value // *struct + Field int // field is X.Type().Underlying().(*types.Pointer).Elem().Underlying().(*types.Struct).Field(Field) +} + +// The Field instruction yields the Field of struct X. +// +// The field is identified by its index within the field list of the +// struct type of X; by using numeric indices we avoid ambiguity of +// package-local identifiers and permit compact representations. +// +// Pos() returns the position of the ast.SelectorExpr.Sel for the +// field, if explicit in the source. +// +// Example printed form: +// t1 = t0.name [#1] +// +type Field struct { + register + X Value // struct + Field int // index into X.Type().(*types.Struct).Fields +} + +// The IndexAddr instruction yields the address of the element at +// index Index of collection X. Index is an integer expression. +// +// The elements of maps and strings are not addressable; use Lookup or +// MapUpdate instead. +// +// Dynamically, this instruction panics if X evaluates to a nil *array +// pointer. +// +// Type() returns a (possibly named) *types.Pointer. +// +// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if +// explicit in the source. +// +// Example printed form: +// t2 = &t0[t1] +// +type IndexAddr struct { + register + X Value // slice or *array, + Index Value // numeric index +} + +// The Index instruction yields element Index of array X. +// +// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if +// explicit in the source. +// +// Example printed form: +// t2 = t0[t1] +// +type Index struct { + register + X Value // array + Index Value // integer index +} + +// The Lookup instruction yields element Index of collection X, a map +// or string. Index is an integer expression if X is a string or the +// appropriate key type if X is a map. +// +// If CommaOk, the result is a 2-tuple of the value above and a +// boolean indicating the result of a map membership test for the key. +// The components of the tuple are accessed using Extract. +// +// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source. +// +// Example printed form: +// t2 = t0[t1] +// t5 = t3[t4],ok +// +type Lookup struct { + register + X Value // string or map + Index Value // numeric or key-typed index + CommaOk bool // return a value,ok pair +} + +// SelectState is a helper for Select. +// It represents one goal state and its corresponding communication. +// +type SelectState struct { + Dir types.ChanDir // direction of case (SendOnly or RecvOnly) + Chan Value // channel to use (for send or receive) + Send Value // value to send (for send) + Pos token.Pos // position of token.ARROW + DebugNode ast.Node // ast.SendStmt or ast.UnaryExpr(<-) [debug mode] +} + +// The Select instruction tests whether (or blocks until) one +// of the specified sent or received states is entered. +// +// Let n be the number of States for which Dir==RECV and T_i (0<=i string iterator; false => map iterator. +} + +// The TypeAssert instruction tests whether interface value X has type +// AssertedType. +// +// If !CommaOk, on success it returns v, the result of the conversion +// (defined below); on failure it panics. +// +// If CommaOk: on success it returns a pair (v, true) where v is the +// result of the conversion; on failure it returns (z, false) where z +// is AssertedType's zero value. The components of the pair must be +// accessed using the Extract instruction. +// +// If AssertedType is a concrete type, TypeAssert checks whether the +// dynamic type in interface X is equal to it, and if so, the result +// of the conversion is a copy of the value in the interface. +// +// If AssertedType is an interface, TypeAssert checks whether the +// dynamic type of the interface is assignable to it, and if so, the +// result of the conversion is a copy of the interface value X. +// If AssertedType is a superinterface of X.Type(), the operation will +// fail iff the operand is nil. (Contrast with ChangeInterface, which +// performs no nil-check.) +// +// Type() reflects the actual type of the result, possibly a +// 2-types.Tuple; AssertedType is the asserted type. +// +// Pos() returns the ast.CallExpr.Lparen if the instruction arose from +// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the +// instruction arose from an explicit e.(T) operation; or the +// ast.CaseClause.Case if the instruction arose from a case of a +// type-switch statement. +// +// Example printed form: +// t1 = typeassert t0.(int) +// t3 = typeassert,ok t2.(T) +// +type TypeAssert struct { + register + X Value + AssertedType types.Type + CommaOk bool +} + +// The Extract instruction yields component Index of Tuple. +// +// This is used to access the results of instructions with multiple +// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and +// IndexExpr(Map). +// +// Example printed form: +// t1 = extract t0 #1 +// +type Extract struct { + register + Tuple Value + Index int +} + +// Instructions executed for effect. They do not yield a value. -------------------- + +// The Jump instruction transfers control to the sole successor of its +// owning block. +// +// A Jump must be the last instruction of its containing BasicBlock. +// +// Pos() returns NoPos. +// +// Example printed form: +// jump done +// +type Jump struct { + anInstruction +} + +// The If instruction transfers control to one of the two successors +// of its owning block, depending on the boolean Cond: the first if +// true, the second if false. +// +// An If instruction must be the last instruction of its containing +// BasicBlock. +// +// Pos() returns NoPos. +// +// Example printed form: +// if t0 goto done else body +// +type If struct { + anInstruction + Cond Value +} + +// The Return instruction returns values and control back to the calling +// function. +// +// len(Results) is always equal to the number of results in the +// function's signature. +// +// If len(Results) > 1, Return returns a tuple value with the specified +// components which the caller must access using Extract instructions. +// +// There is no instruction to return a ready-made tuple like those +// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or +// a tail-call to a function with multiple result parameters. +// +// Return must be the last instruction of its containing BasicBlock. +// Such a block has no successors. +// +// Pos() returns the ast.ReturnStmt.Return, if explicit in the source. +// +// Example printed form: +// return +// return nil:I, 2:int +// +type Return struct { + anInstruction + Results []Value + pos token.Pos +} + +// The RunDefers instruction pops and invokes the entire stack of +// procedure calls pushed by Defer instructions in this function. +// +// It is legal to encounter multiple 'rundefers' instructions in a +// single control-flow path through a function; this is useful in +// the combined init() function, for example. +// +// Pos() returns NoPos. +// +// Example printed form: +// rundefers +// +type RunDefers struct { + anInstruction +} + +// The Panic instruction initiates a panic with value X. +// +// A Panic instruction must be the last instruction of its containing +// BasicBlock, which must have no successors. +// +// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction; +// they are treated as calls to a built-in function. +// +// Pos() returns the ast.CallExpr.Lparen if this panic was explicit +// in the source. +// +// Example printed form: +// panic t0 +// +type Panic struct { + anInstruction + X Value // an interface{} + pos token.Pos +} + +// The Go instruction creates a new goroutine and calls the specified +// function within it. +// +// See CallCommon for generic function call documentation. +// +// Pos() returns the ast.GoStmt.Go. +// +// Example printed form: +// go println(t0, t1) +// go t3() +// go invoke t5.Println(...t6) +// +type Go struct { + anInstruction + Call CallCommon + pos token.Pos +} + +// The Defer instruction pushes the specified call onto a stack of +// functions to be called by a RunDefers instruction or by a panic. +// +// See CallCommon for generic function call documentation. +// +// Pos() returns the ast.DeferStmt.Defer. +// +// Example printed form: +// defer println(t0, t1) +// defer t3() +// defer invoke t5.Println(...t6) +// +type Defer struct { + anInstruction + Call CallCommon + pos token.Pos +} + +// The Send instruction sends X on channel Chan. +// +// Pos() returns the ast.SendStmt.Arrow, if explicit in the source. +// +// Example printed form: +// send t0 <- t1 +// +type Send struct { + anInstruction + Chan, X Value + pos token.Pos +} + +// The Store instruction stores Val at address Addr. +// Stores can be of arbitrary types. +// +// Pos() returns the position of the source-level construct most closely +// associated with the memory store operation. +// Since implicit memory stores are numerous and varied and depend upon +// implementation choices, the details are not specified. +// +// Example printed form: +// *x = y +// +type Store struct { + anInstruction + Addr Value + Val Value + pos token.Pos +} + +// The BlankStore instruction is emitted for assignments to the blank +// identifier. +// +// BlankStore is a pseudo-instruction: it has no dynamic effect. +// +// Pos() returns NoPos. +// +// Example printed form: +// _ = t0 +// +type BlankStore struct { + anInstruction + Val Value +} + +// The MapUpdate instruction updates the association of Map[Key] to +// Value. +// +// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack, +// if explicit in the source. +// +// Example printed form: +// t0[t1] = t2 +// +type MapUpdate struct { + anInstruction + Map Value + Key Value + Value Value + pos token.Pos +} + +// A DebugRef instruction maps a source-level expression Expr to the +// SSA value X that represents the value (!IsAddr) or address (IsAddr) +// of that expression. +// +// DebugRef is a pseudo-instruction: it has no dynamic effect. +// +// Pos() returns Expr.Pos(), the start position of the source-level +// expression. This is not the same as the "designated" token as +// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the +// position of the ("designated") Lparen token. +// +// If Expr is an *ast.Ident denoting a var or func, Object() returns +// the object; though this information can be obtained from the type +// checker, including it here greatly facilitates debugging. +// For non-Ident expressions, Object() returns nil. +// +// DebugRefs are generated only for functions built with debugging +// enabled; see Package.SetDebugMode() and the GlobalDebug builder +// mode flag. +// +// DebugRefs are not emitted for ast.Idents referring to constants or +// predeclared identifiers, since they are trivial and numerous. +// Nor are they emitted for ast.ParenExprs. +// +// (By representing these as instructions, rather than out-of-band, +// consistency is maintained during transformation passes by the +// ordinary SSA renaming machinery.) +// +// Example printed form: +// ; *ast.CallExpr @ 102:9 is t5 +// ; var x float64 @ 109:72 is x +// ; address of *ast.CompositeLit @ 216:10 is t0 +// +type DebugRef struct { + anInstruction + Expr ast.Expr // the referring expression (never *ast.ParenExpr) + object types.Object // the identity of the source var/func + IsAddr bool // Expr is addressable and X is the address it denotes + X Value // the value or address of Expr +} + +// Embeddable mix-ins and helpers for common parts of other structs. ----------- + +// register is a mix-in embedded by all SSA values that are also +// instructions, i.e. virtual registers, and provides a uniform +// implementation of most of the Value interface: Value.Name() is a +// numbered register (e.g. "t0"); the other methods are field accessors. +// +// Temporary names are automatically assigned to each register on +// completion of building a function in SSA form. +// +// Clients must not assume that the 'id' value (and the Name() derived +// from it) is unique within a function. As always in this API, +// semantics are determined only by identity; names exist only to +// facilitate debugging. +// +type register struct { + anInstruction + num int // "name" of virtual register, e.g. "t0". Not guaranteed unique. + typ types.Type // type of virtual register + pos token.Pos // position of source expression, or NoPos + referrers []Instruction +} + +// anInstruction is a mix-in embedded by all Instructions. +// It provides the implementations of the Block and setBlock methods. +type anInstruction struct { + block *BasicBlock // the basic block of this instruction +} + +// CallCommon is contained by Go, Defer and Call to hold the +// common parts of a function or method call. +// +// Each CallCommon exists in one of two modes, function call and +// interface method invocation, or "call" and "invoke" for short. +// +// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon +// represents an ordinary function call of the value in Value, +// which may be a *Builtin, a *Function or any other value of kind +// 'func'. +// +// Value may be one of: +// (a) a *Function, indicating a statically dispatched call +// to a package-level function, an anonymous function, or +// a method of a named type. +// (b) a *MakeClosure, indicating an immediately applied +// function literal with free variables. +// (c) a *Builtin, indicating a statically dispatched call +// to a built-in function. +// (d) any other value, indicating a dynamically dispatched +// function call. +// StaticCallee returns the identity of the callee in cases +// (a) and (b), nil otherwise. +// +// Args contains the arguments to the call. If Value is a method, +// Args[0] contains the receiver parameter. +// +// Example printed form: +// t2 = println(t0, t1) +// go t3() +// defer t5(...t6) +// +// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon +// represents a dynamically dispatched call to an interface method. +// In this mode, Value is the interface value and Method is the +// interface's abstract method. Note: an abstract method may be +// shared by multiple interfaces due to embedding; Value.Type() +// provides the specific interface used for this call. +// +// Value is implicitly supplied to the concrete method implementation +// as the receiver parameter; in other words, Args[0] holds not the +// receiver but the first true argument. +// +// Example printed form: +// t1 = invoke t0.String() +// go invoke t3.Run(t2) +// defer invoke t4.Handle(...t5) +// +// For all calls to variadic functions (Signature().Variadic()), +// the last element of Args is a slice. +// +type CallCommon struct { + Value Value // receiver (invoke mode) or func value (call mode) + Method *types.Func // abstract method (invoke mode) + Args []Value // actual parameters (in static method call, includes receiver) + pos token.Pos // position of CallExpr.Lparen, iff explicit in source +} + +// IsInvoke returns true if this call has "invoke" (not "call") mode. +func (c *CallCommon) IsInvoke() bool { + return c.Method != nil +} + +func (c *CallCommon) Pos() token.Pos { return c.pos } + +// Signature returns the signature of the called function. +// +// For an "invoke"-mode call, the signature of the interface method is +// returned. +// +// In either "call" or "invoke" mode, if the callee is a method, its +// receiver is represented by sig.Recv, not sig.Params().At(0). +// +func (c *CallCommon) Signature() *types.Signature { + if c.Method != nil { + return c.Method.Type().(*types.Signature) + } + return c.Value.Type().Underlying().(*types.Signature) +} + +// StaticCallee returns the callee if this is a trivially static +// "call"-mode call to a function. +func (c *CallCommon) StaticCallee() *Function { + switch fn := c.Value.(type) { + case *Function: + return fn + case *MakeClosure: + return fn.Fn.(*Function) + } + return nil +} + +// Description returns a description of the mode of this call suitable +// for a user interface, e.g., "static method call". +func (c *CallCommon) Description() string { + switch fn := c.Value.(type) { + case *Builtin: + return "built-in function call" + case *MakeClosure: + return "static function closure call" + case *Function: + if fn.Signature.Recv() != nil { + return "static method call" + } + return "static function call" + } + if c.IsInvoke() { + return "dynamic method call" // ("invoke" mode) + } + return "dynamic function call" +} + +// The CallInstruction interface, implemented by *Go, *Defer and *Call, +// exposes the common parts of function-calling instructions, +// yet provides a way back to the Value defined by *Call alone. +// +type CallInstruction interface { + Instruction + Common() *CallCommon // returns the common parts of the call + Value() *Call // returns the result value of the call (*Call) or nil (*Go, *Defer) +} + +func (s *Call) Common() *CallCommon { return &s.Call } +func (s *Defer) Common() *CallCommon { return &s.Call } +func (s *Go) Common() *CallCommon { return &s.Call } + +func (s *Call) Value() *Call { return s } +func (s *Defer) Value() *Call { return nil } +func (s *Go) Value() *Call { return nil } + +func (v *Builtin) Type() types.Type { return v.sig } +func (v *Builtin) Name() string { return v.name } +func (*Builtin) Referrers() *[]Instruction { return nil } +func (v *Builtin) Pos() token.Pos { return token.NoPos } +func (v *Builtin) Object() types.Object { return types.Universe.Lookup(v.name) } +func (v *Builtin) Parent() *Function { return nil } + +func (v *FreeVar) Type() types.Type { return v.typ } +func (v *FreeVar) Name() string { return v.name } +func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers } +func (v *FreeVar) Pos() token.Pos { return v.pos } +func (v *FreeVar) Parent() *Function { return v.parent } + +func (v *Global) Type() types.Type { return v.typ } +func (v *Global) Name() string { return v.name } +func (v *Global) Parent() *Function { return nil } +func (v *Global) Pos() token.Pos { return v.pos } +func (v *Global) Referrers() *[]Instruction { return nil } +func (v *Global) Token() token.Token { return token.VAR } +func (v *Global) Object() types.Object { return v.object } +func (v *Global) String() string { return v.RelString(nil) } +func (v *Global) Package() *Package { return v.Pkg } +func (v *Global) RelString(from *types.Package) string { return relString(v, from) } + +func (v *Function) Name() string { return v.name } +func (v *Function) Type() types.Type { return v.Signature } +func (v *Function) Pos() token.Pos { return v.pos } +func (v *Function) Token() token.Token { return token.FUNC } +func (v *Function) Object() types.Object { return v.object } +func (v *Function) String() string { return v.RelString(nil) } +func (v *Function) Package() *Package { return v.Pkg } +func (v *Function) Parent() *Function { return v.parent } +func (v *Function) Referrers() *[]Instruction { + if v.parent != nil { + return &v.referrers + } + return nil +} + +func (v *Parameter) Type() types.Type { return v.typ } +func (v *Parameter) Name() string { return v.name } +func (v *Parameter) Object() types.Object { return v.object } +func (v *Parameter) Referrers() *[]Instruction { return &v.referrers } +func (v *Parameter) Pos() token.Pos { return v.pos } +func (v *Parameter) Parent() *Function { return v.parent } + +func (v *Alloc) Type() types.Type { return v.typ } +func (v *Alloc) Referrers() *[]Instruction { return &v.referrers } +func (v *Alloc) Pos() token.Pos { return v.pos } + +func (v *register) Type() types.Type { return v.typ } +func (v *register) setType(typ types.Type) { v.typ = typ } +func (v *register) Name() string { return fmt.Sprintf("t%d", v.num) } +func (v *register) setNum(num int) { v.num = num } +func (v *register) Referrers() *[]Instruction { return &v.referrers } +func (v *register) Pos() token.Pos { return v.pos } +func (v *register) setPos(pos token.Pos) { v.pos = pos } + +func (v *anInstruction) Parent() *Function { return v.block.parent } +func (v *anInstruction) Block() *BasicBlock { return v.block } +func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block } +func (v *anInstruction) Referrers() *[]Instruction { return nil } + +func (t *Type) Name() string { return t.object.Name() } +func (t *Type) Pos() token.Pos { return t.object.Pos() } +func (t *Type) Type() types.Type { return t.object.Type() } +func (t *Type) Token() token.Token { return token.TYPE } +func (t *Type) Object() types.Object { return t.object } +func (t *Type) String() string { return t.RelString(nil) } +func (t *Type) Package() *Package { return t.pkg } +func (t *Type) RelString(from *types.Package) string { return relString(t, from) } + +func (c *NamedConst) Name() string { return c.object.Name() } +func (c *NamedConst) Pos() token.Pos { return c.object.Pos() } +func (c *NamedConst) String() string { return c.RelString(nil) } +func (c *NamedConst) Type() types.Type { return c.object.Type() } +func (c *NamedConst) Token() token.Token { return token.CONST } +func (c *NamedConst) Object() types.Object { return c.object } +func (c *NamedConst) Package() *Package { return c.pkg } +func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) } + +// Func returns the package-level function of the specified name, +// or nil if not found. +// +func (p *Package) Func(name string) (f *Function) { + f, _ = p.Members[name].(*Function) + return +} + +// Var returns the package-level variable of the specified name, +// or nil if not found. +// +func (p *Package) Var(name string) (g *Global) { + g, _ = p.Members[name].(*Global) + return +} + +// Const returns the package-level constant of the specified name, +// or nil if not found. +// +func (p *Package) Const(name string) (c *NamedConst) { + c, _ = p.Members[name].(*NamedConst) + return +} + +// Type returns the package-level type of the specified name, +// or nil if not found. +// +func (p *Package) Type(name string) (t *Type) { + t, _ = p.Members[name].(*Type) + return +} + +func (v *Call) Pos() token.Pos { return v.Call.pos } +func (s *Defer) Pos() token.Pos { return s.pos } +func (s *Go) Pos() token.Pos { return s.pos } +func (s *MapUpdate) Pos() token.Pos { return s.pos } +func (s *Panic) Pos() token.Pos { return s.pos } +func (s *Return) Pos() token.Pos { return s.pos } +func (s *Send) Pos() token.Pos { return s.pos } +func (s *Store) Pos() token.Pos { return s.pos } +func (s *BlankStore) Pos() token.Pos { return token.NoPos } +func (s *If) Pos() token.Pos { return token.NoPos } +func (s *Jump) Pos() token.Pos { return token.NoPos } +func (s *RunDefers) Pos() token.Pos { return token.NoPos } +func (s *DebugRef) Pos() token.Pos { return s.Expr.Pos() } + +// Operands. + +func (v *Alloc) Operands(rands []*Value) []*Value { + return rands +} + +func (v *BinOp) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Y) +} + +func (c *CallCommon) Operands(rands []*Value) []*Value { + rands = append(rands, &c.Value) + for i := range c.Args { + rands = append(rands, &c.Args[i]) + } + return rands +} + +func (s *Go) Operands(rands []*Value) []*Value { + return s.Call.Operands(rands) +} + +func (s *Call) Operands(rands []*Value) []*Value { + return s.Call.Operands(rands) +} + +func (s *Defer) Operands(rands []*Value) []*Value { + return s.Call.Operands(rands) +} + +func (v *ChangeInterface) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *ChangeType) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *Convert) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (s *DebugRef) Operands(rands []*Value) []*Value { + return append(rands, &s.X) +} + +func (v *Extract) Operands(rands []*Value) []*Value { + return append(rands, &v.Tuple) +} + +func (v *Field) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *FieldAddr) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (s *If) Operands(rands []*Value) []*Value { + return append(rands, &s.Cond) +} + +func (v *Index) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Index) +} + +func (v *IndexAddr) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Index) +} + +func (*Jump) Operands(rands []*Value) []*Value { + return rands +} + +func (v *Lookup) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Index) +} + +func (v *MakeChan) Operands(rands []*Value) []*Value { + return append(rands, &v.Size) +} + +func (v *MakeClosure) Operands(rands []*Value) []*Value { + rands = append(rands, &v.Fn) + for i := range v.Bindings { + rands = append(rands, &v.Bindings[i]) + } + return rands +} + +func (v *MakeInterface) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *MakeMap) Operands(rands []*Value) []*Value { + return append(rands, &v.Reserve) +} + +func (v *MakeSlice) Operands(rands []*Value) []*Value { + return append(rands, &v.Len, &v.Cap) +} + +func (v *MapUpdate) Operands(rands []*Value) []*Value { + return append(rands, &v.Map, &v.Key, &v.Value) +} + +func (v *Next) Operands(rands []*Value) []*Value { + return append(rands, &v.Iter) +} + +func (s *Panic) Operands(rands []*Value) []*Value { + return append(rands, &s.X) +} + +func (v *Sigma) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *Phi) Operands(rands []*Value) []*Value { + for i := range v.Edges { + rands = append(rands, &v.Edges[i]) + } + return rands +} + +func (v *Range) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (s *Return) Operands(rands []*Value) []*Value { + for i := range s.Results { + rands = append(rands, &s.Results[i]) + } + return rands +} + +func (*RunDefers) Operands(rands []*Value) []*Value { + return rands +} + +func (v *Select) Operands(rands []*Value) []*Value { + for i := range v.States { + rands = append(rands, &v.States[i].Chan, &v.States[i].Send) + } + return rands +} + +func (s *Send) Operands(rands []*Value) []*Value { + return append(rands, &s.Chan, &s.X) +} + +func (v *Slice) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Low, &v.High, &v.Max) +} + +func (s *Store) Operands(rands []*Value) []*Value { + return append(rands, &s.Addr, &s.Val) +} + +func (s *BlankStore) Operands(rands []*Value) []*Value { + return append(rands, &s.Val) +} + +func (v *TypeAssert) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *UnOp) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +// Non-Instruction Values: +func (v *Builtin) Operands(rands []*Value) []*Value { return rands } +func (v *FreeVar) Operands(rands []*Value) []*Value { return rands } +func (v *Const) Operands(rands []*Value) []*Value { return rands } +func (v *Function) Operands(rands []*Value) []*Value { return rands } +func (v *Global) Operands(rands []*Value) []*Value { return rands } +func (v *Parameter) Operands(rands []*Value) []*Value { return rands } diff --git a/vendor/honnef.co/go/tools/ssa/staticcheck.conf b/vendor/honnef.co/go/tools/ssa/staticcheck.conf new file mode 100644 index 00000000..d7b38bc3 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/staticcheck.conf @@ -0,0 +1,3 @@ +# ssa/... is mostly imported from upstream and we don't want to +# deviate from it too much, hence disabling SA1019 +checks = ["inherit", "-SA1019"] diff --git a/vendor/honnef.co/go/tools/ssa/testmain.go b/vendor/honnef.co/go/tools/ssa/testmain.go new file mode 100644 index 00000000..8ec15ba5 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/testmain.go @@ -0,0 +1,271 @@ +// Copyright 2013 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 ssa + +// CreateTestMainPackage synthesizes a main package that runs all the +// tests of the supplied packages. +// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing. +// +// TODO(adonovan): throws this all away now that x/tools/go/packages +// provides access to the actual synthetic test main files. + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/types" + "log" + "os" + "strings" + "text/template" +) + +// FindTests returns the Test, Benchmark, and Example functions +// (as defined by "go test") defined in the specified package, +// and its TestMain function, if any. +// +// Deprecated: use x/tools/go/packages to access synthetic testmain packages. +func FindTests(pkg *Package) (tests, benchmarks, examples []*Function, main *Function) { + prog := pkg.Prog + + // The first two of these may be nil: if the program doesn't import "testing", + // it can't contain any tests, but it may yet contain Examples. + var testSig *types.Signature // func(*testing.T) + var benchmarkSig *types.Signature // func(*testing.B) + var exampleSig = types.NewSignature(nil, nil, nil, false) // func() + + // Obtain the types from the parameters of testing.MainStart. + if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil { + mainStart := testingPkg.Func("MainStart") + params := mainStart.Signature.Params() + testSig = funcField(params.At(1).Type()) + benchmarkSig = funcField(params.At(2).Type()) + + // Does the package define this function? + // func TestMain(*testing.M) + if f := pkg.Func("TestMain"); f != nil { + sig := f.Type().(*types.Signature) + starM := mainStart.Signature.Results().At(0).Type() // *testing.M + if sig.Results().Len() == 0 && + sig.Params().Len() == 1 && + types.Identical(sig.Params().At(0).Type(), starM) { + main = f + } + } + } + + // TODO(adonovan): use a stable order, e.g. lexical. + for _, mem := range pkg.Members { + if f, ok := mem.(*Function); ok && + ast.IsExported(f.Name()) && + strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") { + + switch { + case testSig != nil && isTestSig(f, "Test", testSig): + tests = append(tests, f) + case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig): + benchmarks = append(benchmarks, f) + case isTestSig(f, "Example", exampleSig): + examples = append(examples, f) + default: + continue + } + } + } + return +} + +// Like isTest, but checks the signature too. +func isTestSig(f *Function, prefix string, sig *types.Signature) bool { + return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig) +} + +// Given the type of one of the three slice parameters of testing.Main, +// returns the function type. +func funcField(slice types.Type) *types.Signature { + return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature) +} + +// isTest tells whether name looks like a test (or benchmark, according to prefix). +// It is a Test (say) if there is a character after Test that is not a lower-case letter. +// We don't want TesticularCancer. +// Plundered from $GOROOT/src/cmd/go/test.go +func isTest(name, prefix string) bool { + if !strings.HasPrefix(name, prefix) { + return false + } + if len(name) == len(prefix) { // "Test" is ok + return true + } + return ast.IsExported(name[len(prefix):]) +} + +// CreateTestMainPackage creates and returns a synthetic "testmain" +// package for the specified package if it defines tests, benchmarks or +// executable examples, or nil otherwise. The new package is named +// "main" and provides a function named "main" that runs the tests, +// similar to the one that would be created by the 'go test' tool. +// +// Subsequent calls to prog.AllPackages include the new package. +// The package pkg must belong to the program prog. +// +// Deprecated: use x/tools/go/packages to access synthetic testmain packages. +func (prog *Program) CreateTestMainPackage(pkg *Package) *Package { + if pkg.Prog != prog { + log.Fatal("Package does not belong to Program") + } + + // Template data + var data struct { + Pkg *Package + Tests, Benchmarks, Examples []*Function + Main *Function + Go18 bool + } + data.Pkg = pkg + + // Enumerate tests. + data.Tests, data.Benchmarks, data.Examples, data.Main = FindTests(pkg) + if data.Main == nil && + data.Tests == nil && data.Benchmarks == nil && data.Examples == nil { + return nil + } + + // Synthesize source for testmain package. + path := pkg.Pkg.Path() + "$testmain" + tmpl := testmainTmpl + if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil { + // In Go 1.8, testing.MainStart's first argument is an interface, not a func. + data.Go18 = types.IsInterface(testingPkg.Func("MainStart").Signature.Params().At(0).Type()) + } else { + // The program does not import "testing", but FindTests + // returned non-nil, which must mean there were Examples + // but no Test, Benchmark, or TestMain functions. + + // We'll simply call them from testmain.main; this will + // ensure they don't panic, but will not check any + // "Output:" comments. + // (We should not execute an Example that has no + // "Output:" comment, but it's impossible to tell here.) + tmpl = examplesOnlyTmpl + } + var buf bytes.Buffer + if err := tmpl.Execute(&buf, data); err != nil { + log.Fatalf("internal error expanding template for %s: %v", path, err) + } + if false { // debugging + fmt.Fprintln(os.Stderr, buf.String()) + } + + // Parse and type-check the testmain package. + f, err := parser.ParseFile(prog.Fset, path+".go", &buf, parser.Mode(0)) + if err != nil { + log.Fatalf("internal error parsing %s: %v", path, err) + } + conf := types.Config{ + DisableUnusedImportCheck: true, + Importer: importer{pkg}, + } + files := []*ast.File{f} + info := &types.Info{ + Types: make(map[ast.Expr]types.TypeAndValue), + Defs: make(map[*ast.Ident]types.Object), + Uses: make(map[*ast.Ident]types.Object), + Implicits: make(map[ast.Node]types.Object), + Scopes: make(map[ast.Node]*types.Scope), + Selections: make(map[*ast.SelectorExpr]*types.Selection), + } + testmainPkg, err := conf.Check(path, prog.Fset, files, info) + if err != nil { + log.Fatalf("internal error type-checking %s: %v", path, err) + } + + // Create and build SSA code. + testmain := prog.CreatePackage(testmainPkg, files, info, false) + testmain.SetDebugMode(false) + testmain.Build() + testmain.Func("main").Synthetic = "test main function" + testmain.Func("init").Synthetic = "package initializer" + return testmain +} + +// An implementation of types.Importer for an already loaded SSA program. +type importer struct { + pkg *Package // package under test; may be non-importable +} + +func (imp importer) Import(path string) (*types.Package, error) { + if p := imp.pkg.Prog.ImportedPackage(path); p != nil { + return p.Pkg, nil + } + if path == imp.pkg.Pkg.Path() { + return imp.pkg.Pkg, nil + } + return nil, fmt.Errorf("not found") // can't happen +} + +var testmainTmpl = template.Must(template.New("testmain").Parse(` +package main + +import "io" +import "os" +import "testing" +import p {{printf "%q" .Pkg.Pkg.Path}} + +{{if .Go18}} +type deps struct{} + +func (deps) ImportPath() string { return "" } +func (deps) MatchString(pat, str string) (bool, error) { return true, nil } +func (deps) StartCPUProfile(io.Writer) error { return nil } +func (deps) StartTestLog(io.Writer) {} +func (deps) StopCPUProfile() {} +func (deps) StopTestLog() error { return nil } +func (deps) WriteHeapProfile(io.Writer) error { return nil } +func (deps) WriteProfileTo(string, io.Writer, int) error { return nil } + +var match deps +{{else}} +func match(_, _ string) (bool, error) { return true, nil } +{{end}} + +func main() { + tests := []testing.InternalTest{ +{{range .Tests}} + { {{printf "%q" .Name}}, p.{{.Name}} }, +{{end}} + } + benchmarks := []testing.InternalBenchmark{ +{{range .Benchmarks}} + { {{printf "%q" .Name}}, p.{{.Name}} }, +{{end}} + } + examples := []testing.InternalExample{ +{{range .Examples}} + {Name: {{printf "%q" .Name}}, F: p.{{.Name}}}, +{{end}} + } + m := testing.MainStart(match, tests, benchmarks, examples) +{{with .Main}} + p.{{.Name}}(m) +{{else}} + os.Exit(m.Run()) +{{end}} +} + +`)) + +var examplesOnlyTmpl = template.Must(template.New("examples").Parse(` +package main + +import p {{printf "%q" .Pkg.Pkg.Path}} + +func main() { +{{range .Examples}} + p.{{.Name}}() +{{end}} +} +`)) diff --git a/vendor/honnef.co/go/tools/ssa/util.go b/vendor/honnef.co/go/tools/ssa/util.go new file mode 100644 index 00000000..ddb11846 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/util.go @@ -0,0 +1,119 @@ +// Copyright 2013 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 ssa + +// This file defines a number of miscellaneous utility functions. + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "io" + "os" + + "golang.org/x/tools/go/ast/astutil" +) + +//// AST utilities + +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) } + +// isBlankIdent returns true iff e is an Ident with name "_". +// They have no associated types.Object, and thus no type. +// +func isBlankIdent(e ast.Expr) bool { + id, ok := e.(*ast.Ident) + return ok && id.Name == "_" +} + +//// Type utilities. Some of these belong in go/types. + +// isPointer returns true for types whose underlying type is a pointer. +func isPointer(typ types.Type) bool { + _, ok := typ.Underlying().(*types.Pointer) + return ok +} + +func isInterface(T types.Type) bool { return types.IsInterface(T) } + +// deref returns a pointer's element type; otherwise it returns typ. +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} + +// recvType returns the receiver type of method obj. +func recvType(obj *types.Func) types.Type { + return obj.Type().(*types.Signature).Recv().Type() +} + +// DefaultType returns the default "typed" type for an "untyped" type; +// it returns the incoming type for all other types. The default type +// for untyped nil is untyped nil. +// +// Exported to ssa/interp. +// +// TODO(adonovan): use go/types.DefaultType after 1.8. +// +func DefaultType(typ types.Type) types.Type { + if t, ok := typ.(*types.Basic); ok { + k := t.Kind() + switch k { + case types.UntypedBool: + k = types.Bool + case types.UntypedInt: + k = types.Int + case types.UntypedRune: + k = types.Rune + case types.UntypedFloat: + k = types.Float64 + case types.UntypedComplex: + k = types.Complex128 + case types.UntypedString: + k = types.String + } + typ = types.Typ[k] + } + return typ +} + +// logStack prints the formatted "start" message to stderr and +// returns a closure that prints the corresponding "end" message. +// Call using 'defer logStack(...)()' to show builder stack on panic. +// Don't forget trailing parens! +// +func logStack(format string, args ...interface{}) func() { + msg := fmt.Sprintf(format, args...) + io.WriteString(os.Stderr, msg) + io.WriteString(os.Stderr, "\n") + return func() { + io.WriteString(os.Stderr, msg) + io.WriteString(os.Stderr, " end\n") + } +} + +// newVar creates a 'var' for use in a types.Tuple. +func newVar(name string, typ types.Type) *types.Var { + return types.NewParam(token.NoPos, nil, name, typ) +} + +// anonVar creates an anonymous 'var' for use in a types.Tuple. +func anonVar(typ types.Type) *types.Var { + return newVar("", typ) +} + +var lenResults = types.NewTuple(anonVar(tInt)) + +// makeLen returns the len builtin specialized to type func(T)int. +func makeLen(T types.Type) *Builtin { + lenParams := types.NewTuple(anonVar(T)) + return &Builtin{ + name: "len", + sig: types.NewSignature(nil, lenParams, lenResults, false), + } +} diff --git a/vendor/honnef.co/go/tools/ssa/wrappers.go b/vendor/honnef.co/go/tools/ssa/wrappers.go new file mode 100644 index 00000000..a4ae71d8 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/wrappers.go @@ -0,0 +1,290 @@ +// Copyright 2013 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 ssa + +// This file defines synthesis of Functions that delegate to declared +// methods; they come in three kinds: +// +// (1) wrappers: methods that wrap declared methods, performing +// implicit pointer indirections and embedded field selections. +// +// (2) thunks: funcs that wrap declared methods. Like wrappers, +// thunks perform indirections and field selections. The thunk's +// first parameter is used as the receiver for the method call. +// +// (3) bounds: funcs that wrap declared methods. The bound's sole +// free variable, supplied by a closure, is used as the receiver +// for the method call. No indirections or field selections are +// performed since they can be done before the call. + +import ( + "fmt" + + "go/types" +) + +// -- wrappers ----------------------------------------------------------- + +// makeWrapper returns a synthetic method that delegates to the +// declared method denoted by meth.Obj(), first performing any +// necessary pointer indirections or field selections implied by meth. +// +// The resulting method's receiver type is meth.Recv(). +// +// This function is versatile but quite subtle! Consider the +// following axes of variation when making changes: +// - optional receiver indirection +// - optional implicit field selections +// - meth.Obj() may denote a concrete or an interface method +// - the result may be a thunk or a wrapper. +// +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +// +func makeWrapper(prog *Program, sel *types.Selection) *Function { + obj := sel.Obj().(*types.Func) // the declared function + sig := sel.Type().(*types.Signature) // type of this wrapper + + var recv *types.Var // wrapper's receiver or thunk's params[0] + name := obj.Name() + var description string + var start int // first regular param + if sel.Kind() == types.MethodExpr { + name += "$thunk" + description = "thunk" + recv = sig.Params().At(0) + start = 1 + } else { + description = "wrapper" + recv = sig.Recv() + } + + description = fmt.Sprintf("%s for %s", description, sel.Obj()) + if prog.mode&LogSource != 0 { + defer logStack("make %s to (%s)", description, recv.Type())() + } + fn := &Function{ + name: name, + method: sel, + object: obj, + Signature: sig, + Synthetic: description, + Prog: prog, + pos: obj.Pos(), + } + fn.startBody() + fn.addSpilledParam(recv) + createParams(fn, start) + + indices := sel.Index() + + var v Value = fn.Locals[0] // spilled receiver + if isPointer(sel.Recv()) { + v = emitLoad(fn, v) + + // For simple indirection wrappers, perform an informative nil-check: + // "value method (T).f called using nil *T pointer" + if len(indices) == 1 && !isPointer(recvType(obj)) { + var c Call + c.Call.Value = &Builtin{ + name: "ssa:wrapnilchk", + sig: types.NewSignature(nil, + types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)), + types.NewTuple(anonVar(sel.Recv())), false), + } + c.Call.Args = []Value{ + v, + stringConst(deref(sel.Recv()).String()), + stringConst(sel.Obj().Name()), + } + c.setType(v.Type()) + v = fn.emit(&c) + } + } + + // Invariant: v is a pointer, either + // value of *A receiver param, or + // address of A spilled receiver. + + // We use pointer arithmetic (FieldAddr possibly followed by + // Load) in preference to value extraction (Field possibly + // preceded by Load). + + v = emitImplicitSelections(fn, v, indices[:len(indices)-1]) + + // Invariant: v is a pointer, either + // value of implicit *C field, or + // address of implicit C field. + + var c Call + if r := recvType(obj); !isInterface(r) { // concrete method + if !isPointer(r) { + v = emitLoad(fn, v) + } + c.Call.Value = prog.declaredFunc(obj) + c.Call.Args = append(c.Call.Args, v) + } else { + c.Call.Method = obj + c.Call.Value = emitLoad(fn, v) + } + for _, arg := range fn.Params[1:] { + c.Call.Args = append(c.Call.Args, arg) + } + emitTailCall(fn, &c) + fn.finishBody() + return fn +} + +// createParams creates parameters for wrapper method fn based on its +// Signature.Params, which do not include the receiver. +// start is the index of the first regular parameter to use. +// +func createParams(fn *Function, start int) { + tparams := fn.Signature.Params() + for i, n := start, tparams.Len(); i < n; i++ { + fn.addParamObj(tparams.At(i)) + } +} + +// -- bounds ----------------------------------------------------------- + +// makeBound returns a bound method wrapper (or "bound"), a synthetic +// function that delegates to a concrete or interface method denoted +// by obj. The resulting function has no receiver, but has one free +// variable which will be used as the method's receiver in the +// tail-call. +// +// Use MakeClosure with such a wrapper to construct a bound method +// closure. e.g.: +// +// type T int or: type T interface { meth() } +// func (t T) meth() +// var t T +// f := t.meth +// f() // calls t.meth() +// +// f is a closure of a synthetic wrapper defined as if by: +// +// f := func() { return t.meth() } +// +// Unlike makeWrapper, makeBound need perform no indirection or field +// selections because that can be done before the closure is +// constructed. +// +// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu) +// +func makeBound(prog *Program, obj *types.Func) *Function { + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + fn, ok := prog.bounds[obj] + if !ok { + description := fmt.Sprintf("bound method wrapper for %s", obj) + if prog.mode&LogSource != 0 { + defer logStack("%s", description)() + } + fn = &Function{ + name: obj.Name() + "$bound", + object: obj, + Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver + Synthetic: description, + Prog: prog, + pos: obj.Pos(), + } + + fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn} + fn.FreeVars = []*FreeVar{fv} + fn.startBody() + createParams(fn, 0) + var c Call + + if !isInterface(recvType(obj)) { // concrete + c.Call.Value = prog.declaredFunc(obj) + c.Call.Args = []Value{fv} + } else { + c.Call.Value = fv + c.Call.Method = obj + } + for _, arg := range fn.Params { + c.Call.Args = append(c.Call.Args, arg) + } + emitTailCall(fn, &c) + fn.finishBody() + + prog.bounds[obj] = fn + } + return fn +} + +// -- thunks ----------------------------------------------------------- + +// makeThunk returns a thunk, a synthetic function that delegates to a +// concrete or interface method denoted by sel.Obj(). The resulting +// function has no receiver, but has an additional (first) regular +// parameter. +// +// Precondition: sel.Kind() == types.MethodExpr. +// +// type T int or: type T interface { meth() } +// func (t T) meth() +// f := T.meth +// var t T +// f(t) // calls t.meth() +// +// f is a synthetic wrapper defined as if by: +// +// f := func(t T) { return t.meth() } +// +// TODO(adonovan): opt: currently the stub is created even when used +// directly in a function call: C.f(i, 0). This is less efficient +// than inlining the stub. +// +// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu) +// +func makeThunk(prog *Program, sel *types.Selection) *Function { + if sel.Kind() != types.MethodExpr { + panic(sel) + } + + key := selectionKey{ + kind: sel.Kind(), + recv: sel.Recv(), + obj: sel.Obj(), + index: fmt.Sprint(sel.Index()), + indirect: sel.Indirect(), + } + + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + + // Canonicalize key.recv to avoid constructing duplicate thunks. + canonRecv, ok := prog.canon.At(key.recv).(types.Type) + if !ok { + canonRecv = key.recv + prog.canon.Set(key.recv, canonRecv) + } + key.recv = canonRecv + + fn, ok := prog.thunks[key] + if !ok { + fn = makeWrapper(prog, sel) + if fn.Signature.Recv() != nil { + panic(fn) // unexpected receiver + } + prog.thunks[key] = fn + } + return fn +} + +func changeRecv(s *types.Signature, recv *types.Var) *types.Signature { + return types.NewSignature(recv, s.Params(), s.Results(), s.Variadic()) +} + +// selectionKey is like types.Selection but a usable map key. +type selectionKey struct { + kind types.SelectionKind + recv types.Type // canonicalized via Program.canon + obj types.Object + index string + indirect bool +} diff --git a/vendor/honnef.co/go/tools/ssa/write.go b/vendor/honnef.co/go/tools/ssa/write.go new file mode 100644 index 00000000..89761a18 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssa/write.go @@ -0,0 +1,5 @@ +package ssa + +func NewJump(parent *BasicBlock) *Jump { + return &Jump{anInstruction{parent}} +} diff --git a/vendor/honnef.co/go/tools/ssautil/ssautil.go b/vendor/honnef.co/go/tools/ssautil/ssautil.go new file mode 100644 index 00000000..72c3c919 --- /dev/null +++ b/vendor/honnef.co/go/tools/ssautil/ssautil.go @@ -0,0 +1,58 @@ +package ssautil + +import ( + "honnef.co/go/tools/ssa" +) + +func Reachable(from, to *ssa.BasicBlock) bool { + if from == to { + return true + } + if from.Dominates(to) { + return true + } + + found := false + Walk(from, func(b *ssa.BasicBlock) bool { + if b == to { + found = true + return false + } + return true + }) + return found +} + +func Walk(b *ssa.BasicBlock, fn func(*ssa.BasicBlock) bool) { + seen := map[*ssa.BasicBlock]bool{} + wl := []*ssa.BasicBlock{b} + for len(wl) > 0 { + b := wl[len(wl)-1] + wl = wl[:len(wl)-1] + if seen[b] { + continue + } + seen[b] = true + if !fn(b) { + continue + } + wl = append(wl, b.Succs...) + } +} + +func Vararg(x *ssa.Slice) ([]ssa.Value, bool) { + var out []ssa.Value + slice, ok := x.X.(*ssa.Alloc) + if !ok || slice.Comment != "varargs" { + return nil, false + } + for _, ref := range *slice.Referrers() { + idx, ok := ref.(*ssa.IndexAddr) + if !ok { + continue + } + v := (*idx.Referrers())[0].(*ssa.Store).Val + out = append(out, v) + } + return out, true +} diff --git a/vendor/honnef.co/go/tools/staticcheck/CONTRIBUTING.md b/vendor/honnef.co/go/tools/staticcheck/CONTRIBUTING.md new file mode 100644 index 00000000..b12c7afc --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/CONTRIBUTING.md @@ -0,0 +1,15 @@ +# Contributing to staticcheck + +## Before filing an issue: + +### Are you having trouble building staticcheck? + +Check you have the latest version of its dependencies. Run +``` +go get -u honnef.co/go/tools/staticcheck +``` +If you still have problems, consider searching for existing issues before filing a new issue. + +## Before sending a pull request: + +Have you understood the purpose of staticcheck? Make sure to carefully read `README`. diff --git a/vendor/honnef.co/go/tools/staticcheck/analysis.go b/vendor/honnef.co/go/tools/staticcheck/analysis.go new file mode 100644 index 00000000..442aebe5 --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/analysis.go @@ -0,0 +1,525 @@ +package staticcheck + +import ( + "flag" + + "honnef.co/go/tools/facts" + "honnef.co/go/tools/internal/passes/buildssa" + "honnef.co/go/tools/lint/lintutil" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/passes/inspect" +) + +func newFlagSet() flag.FlagSet { + fs := flag.NewFlagSet("", flag.PanicOnError) + fs.Var(lintutil.NewVersionFlag(), "go", "Target Go version") + return *fs +} + +var Analyzers = map[string]*analysis.Analyzer{ + "SA1000": { + Name: "SA1000", + Run: callChecker(checkRegexpRules), + Doc: Docs["SA1000"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1001": { + Name: "SA1001", + Run: CheckTemplate, + Doc: Docs["SA1001"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA1002": { + Name: "SA1002", + Run: callChecker(checkTimeParseRules), + Doc: Docs["SA1002"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1003": { + Name: "SA1003", + Run: callChecker(checkEncodingBinaryRules), + Doc: Docs["SA1003"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1004": { + Name: "SA1004", + Run: CheckTimeSleepConstant, + Doc: Docs["SA1004"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA1005": { + Name: "SA1005", + Run: CheckExec, + Doc: Docs["SA1005"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA1006": { + Name: "SA1006", + Run: CheckUnsafePrintf, + Doc: Docs["SA1006"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA1007": { + Name: "SA1007", + Run: callChecker(checkURLsRules), + Doc: Docs["SA1007"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1008": { + Name: "SA1008", + Run: CheckCanonicalHeaderKey, + Doc: Docs["SA1008"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA1010": { + Name: "SA1010", + Run: callChecker(checkRegexpFindAllRules), + Doc: Docs["SA1010"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1011": { + Name: "SA1011", + Run: callChecker(checkUTF8CutsetRules), + Doc: Docs["SA1011"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1012": { + Name: "SA1012", + Run: CheckNilContext, + Doc: Docs["SA1012"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA1013": { + Name: "SA1013", + Run: CheckSeeker, + Doc: Docs["SA1013"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA1014": { + Name: "SA1014", + Run: callChecker(checkUnmarshalPointerRules), + Doc: Docs["SA1014"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1015": { + Name: "SA1015", + Run: CheckLeakyTimeTick, + Doc: Docs["SA1015"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA1016": { + Name: "SA1016", + Run: CheckUntrappableSignal, + Doc: Docs["SA1016"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA1017": { + Name: "SA1017", + Run: callChecker(checkUnbufferedSignalChanRules), + Doc: Docs["SA1017"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1018": { + Name: "SA1018", + Run: callChecker(checkStringsReplaceZeroRules), + Doc: Docs["SA1018"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1019": { + Name: "SA1019", + Run: CheckDeprecated, + Doc: Docs["SA1019"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Deprecated}, + Flags: newFlagSet(), + }, + "SA1020": { + Name: "SA1020", + Run: callChecker(checkListenAddressRules), + Doc: Docs["SA1020"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1021": { + Name: "SA1021", + Run: callChecker(checkBytesEqualIPRules), + Doc: Docs["SA1021"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1023": { + Name: "SA1023", + Run: CheckWriterBufferModified, + Doc: Docs["SA1023"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA1024": { + Name: "SA1024", + Run: callChecker(checkUniqueCutsetRules), + Doc: Docs["SA1024"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1025": { + Name: "SA1025", + Run: CheckTimerResetReturnValue, + Doc: Docs["SA1025"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA1026": { + Name: "SA1026", + Run: callChecker(checkUnsupportedMarshal), + Doc: Docs["SA1026"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA1027": { + Name: "SA1027", + Run: callChecker(checkAtomicAlignment), + Doc: Docs["SA1027"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + + "SA2000": { + Name: "SA2000", + Run: CheckWaitgroupAdd, + Doc: Docs["SA2000"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA2001": { + Name: "SA2001", + Run: CheckEmptyCriticalSection, + Doc: Docs["SA2001"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA2002": { + Name: "SA2002", + Run: CheckConcurrentTesting, + Doc: Docs["SA2002"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA2003": { + Name: "SA2003", + Run: CheckDeferLock, + Doc: Docs["SA2003"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + + "SA3000": { + Name: "SA3000", + Run: CheckTestMainExit, + Doc: Docs["SA3000"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA3001": { + Name: "SA3001", + Run: CheckBenchmarkN, + Doc: Docs["SA3001"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + + "SA4000": { + Name: "SA4000", + Run: CheckLhsRhsIdentical, + Doc: Docs["SA4000"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile, facts.Generated}, + Flags: newFlagSet(), + }, + "SA4001": { + Name: "SA4001", + Run: CheckIneffectiveCopy, + Doc: Docs["SA4001"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA4002": { + Name: "SA4002", + Run: CheckDiffSizeComparison, + Doc: Docs["SA4002"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA4003": { + Name: "SA4003", + Run: CheckExtremeComparison, + Doc: Docs["SA4003"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA4004": { + Name: "SA4004", + Run: CheckIneffectiveLoop, + Doc: Docs["SA4004"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA4006": { + Name: "SA4006", + Run: CheckUnreadVariableValues, + Doc: Docs["SA4006"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "SA4008": { + Name: "SA4008", + Run: CheckLoopCondition, + Doc: Docs["SA4008"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA4009": { + Name: "SA4009", + Run: CheckArgOverwritten, + Doc: Docs["SA4009"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA4010": { + Name: "SA4010", + Run: CheckIneffectiveAppend, + Doc: Docs["SA4010"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA4011": { + Name: "SA4011", + Run: CheckScopedBreak, + Doc: Docs["SA4011"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA4012": { + Name: "SA4012", + Run: CheckNaNComparison, + Doc: Docs["SA4012"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA4013": { + Name: "SA4013", + Run: CheckDoubleNegation, + Doc: Docs["SA4013"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA4014": { + Name: "SA4014", + Run: CheckRepeatedIfElse, + Doc: Docs["SA4014"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA4015": { + Name: "SA4015", + Run: callChecker(checkMathIntRules), + Doc: Docs["SA4015"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA4016": { + Name: "SA4016", + Run: CheckSillyBitwiseOps, + Doc: Docs["SA4016"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.TokenFile}, + Flags: newFlagSet(), + }, + "SA4017": { + Name: "SA4017", + Run: CheckPureFunctions, + Doc: Docs["SA4017"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Purity}, + Flags: newFlagSet(), + }, + "SA4018": { + Name: "SA4018", + Run: CheckSelfAssignment, + Doc: Docs["SA4018"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile}, + Flags: newFlagSet(), + }, + "SA4019": { + Name: "SA4019", + Run: CheckDuplicateBuildConstraints, + Doc: Docs["SA4019"].String(), + Requires: []*analysis.Analyzer{facts.Generated}, + Flags: newFlagSet(), + }, + "SA4020": { + Name: "SA4020", + Run: CheckUnreachableTypeCases, + Doc: Docs["SA4020"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA4021": { + Name: "SA4021", + Run: CheckSingleArgAppend, + Doc: Docs["SA4021"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile}, + Flags: newFlagSet(), + }, + + "SA5000": { + Name: "SA5000", + Run: CheckNilMaps, + Doc: Docs["SA5000"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA5001": { + Name: "SA5001", + Run: CheckEarlyDefer, + Doc: Docs["SA5001"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA5002": { + Name: "SA5002", + Run: CheckInfiniteEmptyLoop, + Doc: Docs["SA5002"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA5003": { + Name: "SA5003", + Run: CheckDeferInInfiniteLoop, + Doc: Docs["SA5003"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA5004": { + Name: "SA5004", + Run: CheckLoopEmptyDefault, + Doc: Docs["SA5004"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA5005": { + Name: "SA5005", + Run: CheckCyclicFinalizer, + Doc: Docs["SA5005"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA5007": { + Name: "SA5007", + Run: CheckInfiniteRecursion, + Doc: Docs["SA5007"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA5008": { + Name: "SA5008", + Run: CheckStructTags, + Doc: Docs["SA5008"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA5009": { + Name: "SA5009", + Run: callChecker(checkPrintfRules), + Doc: Docs["SA5009"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + + "SA6000": { + Name: "SA6000", + Run: callChecker(checkRegexpMatchLoopRules), + Doc: Docs["SA6000"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA6001": { + Name: "SA6001", + Run: CheckMapBytesKey, + Doc: Docs["SA6001"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA6002": { + Name: "SA6002", + Run: callChecker(checkSyncPoolValueRules), + Doc: Docs["SA6002"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, + Flags: newFlagSet(), + }, + "SA6003": { + Name: "SA6003", + Run: CheckRangeStringRunes, + Doc: Docs["SA6003"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "SA6005": { + Name: "SA6005", + Run: CheckToLowerToUpperComparison, + Doc: Docs["SA6005"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + + "SA9001": { + Name: "SA9001", + Run: CheckDubiousDeferInChannelRangeLoop, + Doc: Docs["SA9001"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA9002": { + Name: "SA9002", + Run: CheckNonOctalFileMode, + Doc: Docs["SA9002"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + "SA9003": { + Name: "SA9003", + Run: CheckEmptyBranch, + Doc: Docs["SA9003"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.TokenFile, facts.Generated}, + Flags: newFlagSet(), + }, + "SA9004": { + Name: "SA9004", + Run: CheckMissingEnumTypesInDeclaration, + Doc: Docs["SA9004"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, + // Filtering generated code because it may include empty structs generated from data models. + "SA9005": { + Name: "SA9005", + Run: callChecker(checkNoopMarshal), + Doc: Docs["SA9005"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer, facts.Generated, facts.TokenFile}, + Flags: newFlagSet(), + }, +} diff --git a/vendor/honnef.co/go/tools/staticcheck/buildtag.go b/vendor/honnef.co/go/tools/staticcheck/buildtag.go new file mode 100644 index 00000000..888d3e9d --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/buildtag.go @@ -0,0 +1,21 @@ +package staticcheck + +import ( + "go/ast" + "strings" + + . "honnef.co/go/tools/lint/lintdsl" +) + +func buildTags(f *ast.File) [][]string { + var out [][]string + for _, line := range strings.Split(Preamble(f), "\n") { + if !strings.HasPrefix(line, "+build ") { + continue + } + line = strings.TrimSpace(strings.TrimPrefix(line, "+build ")) + fields := strings.Fields(line) + out = append(out, fields) + } + return out +} diff --git a/vendor/honnef.co/go/tools/staticcheck/doc.go b/vendor/honnef.co/go/tools/staticcheck/doc.go new file mode 100644 index 00000000..4a87d4a2 --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/doc.go @@ -0,0 +1,764 @@ +package staticcheck + +import "honnef.co/go/tools/lint" + +var Docs = map[string]*lint.Documentation{ + "SA1000": &lint.Documentation{ + Title: `Invalid regular expression`, + Since: "2017.1", + }, + + "SA1001": &lint.Documentation{ + Title: `Invalid template`, + Since: "2017.1", + }, + + "SA1002": &lint.Documentation{ + Title: `Invalid format in time.Parse`, + Since: "2017.1", + }, + + "SA1003": &lint.Documentation{ + Title: `Unsupported argument to functions in encoding/binary`, + Text: `The encoding/binary package can only serialize types with known sizes. +This precludes the use of the int and uint types, as their sizes +differ on different architectures. Furthermore, it doesn't support +serializing maps, channels, strings, or functions. + +Before Go 1.8, bool wasn't supported, either.`, + Since: "2017.1", + }, + + "SA1004": &lint.Documentation{ + Title: `Suspiciously small untyped constant in time.Sleep`, + Text: `The time.Sleep function takes a time.Duration as its only argument. +Durations are expressed in nanoseconds. Thus, calling time.Sleep(1) +will sleep for 1 nanosecond. This is a common source of bugs, as sleep +functions in other languages often accept seconds or milliseconds. + +The time package provides constants such as time.Second to express +large durations. These can be combined with arithmetic to express +arbitrary durations, for example '5 * time.Second' for 5 seconds. + +If you truly meant to sleep for a tiny amount of time, use +'n * time.Nanosecond' to signal to staticcheck that you did mean to sleep +for some amount of nanoseconds.`, + Since: "2017.1", + }, + + "SA1005": &lint.Documentation{ + Title: `Invalid first argument to exec.Command`, + Text: `os/exec runs programs directly (using variants of the fork and exec +system calls on Unix systems). This shouldn't be confused with running +a command in a shell. The shell will allow for features such as input +redirection, pipes, and general scripting. The shell is also +responsible for splitting the user's input into a program name and its +arguments. For example, the equivalent to + + ls / /tmp + +would be + + exec.Command("ls", "/", "/tmp") + +If you want to run a command in a shell, consider using something like +the following – but be aware that not all systems, particularly +Windows, will have a /bin/sh program: + + exec.Command("/bin/sh", "-c", "ls | grep Awesome")`, + Since: "2017.1", + }, + + "SA1006": &lint.Documentation{ + Title: `Printf with dynamic first argument and no further arguments`, + Text: `Using fmt.Printf with a dynamic first argument can lead to unexpected +output. The first argument is a format string, where certain character +combinations have special meaning. If, for example, a user were to +enter a string such as + + Interest rate: 5% + +and you printed it with + + fmt.Printf(s) + +it would lead to the following output: + + Interest rate: 5%!(NOVERB). + +Similarly, forming the first parameter via string concatenation with +user input should be avoided for the same reason. When printing user +input, either use a variant of fmt.Print, or use the %s Printf verb +and pass the string as an argument.`, + Since: "2017.1", + }, + + "SA1007": &lint.Documentation{ + Title: `Invalid URL in net/url.Parse`, + Since: "2017.1", + }, + + "SA1008": &lint.Documentation{ + Title: `Non-canonical key in http.Header map`, + Text: `Keys in http.Header maps are canonical, meaning they follow a specific +combination of uppercase and lowercase letters. Methods such as +http.Header.Add and http.Header.Del convert inputs into this canonical +form before manipulating the map. + +When manipulating http.Header maps directly, as opposed to using the +provided methods, care should be taken to stick to canonical form in +order to avoid inconsistencies. The following piece of code +demonstrates one such inconsistency: + + h := http.Header{} + h["etag"] = []string{"1234"} + h.Add("etag", "5678") + fmt.Println(h) + + // Output: + // map[Etag:[5678] etag:[1234]] + +The easiest way of obtaining the canonical form of a key is to use +http.CanonicalHeaderKey.`, + Since: "2017.1", + }, + + "SA1010": &lint.Documentation{ + Title: `(*regexp.Regexp).FindAll called with n == 0, which will always return zero results`, + Text: `If n >= 0, the function returns at most n matches/submatches. To +return all results, specify a negative number.`, + Since: "2017.1", + }, + + "SA1011": &lint.Documentation{ + Title: `Various methods in the strings package expect valid UTF-8, but invalid input is provided`, + Since: "2017.1", + }, + + "SA1012": &lint.Documentation{ + Title: `A nil context.Context is being passed to a function, consider using context.TODO instead`, + Since: "2017.1", + }, + + "SA1013": &lint.Documentation{ + Title: `io.Seeker.Seek is being called with the whence constant as the first argument, but it should be the second`, + Since: "2017.1", + }, + + "SA1014": &lint.Documentation{ + Title: `Non-pointer value passed to Unmarshal or Decode`, + Since: "2017.1", + }, + + "SA1015": &lint.Documentation{ + Title: `Using time.Tick in a way that will leak. Consider using time.NewTicker, and only use time.Tick in tests, commands and endless functions`, + Since: "2017.1", + }, + + "SA1016": &lint.Documentation{ + Title: `Trapping a signal that cannot be trapped`, + Text: `Not all signals can be intercepted by a process. Speficially, on +UNIX-like systems, the syscall.SIGKILL and syscall.SIGSTOP signals are +never passed to the process, but instead handled directly by the +kernel. It is therefore pointless to try and handle these signals.`, + Since: "2017.1", + }, + + "SA1017": &lint.Documentation{ + Title: `Channels used with os/signal.Notify should be buffered`, + Text: `The os/signal package uses non-blocking channel sends when delivering +signals. If the receiving end of the channel isn't ready and the +channel is either unbuffered or full, the signal will be dropped. To +avoid missing signals, the channel should be buffered and of the +appropriate size. For a channel used for notification of just one +signal value, a buffer of size 1 is sufficient.`, + Since: "2017.1", + }, + + "SA1018": &lint.Documentation{ + Title: `strings.Replace called with n == 0, which does nothing`, + Text: `With n == 0, zero instances will be replaced. To replace all +instances, use a negative number, or use strings.ReplaceAll.`, + Since: "2017.1", + }, + + "SA1019": &lint.Documentation{ + Title: `Using a deprecated function, variable, constant or field`, + Since: "2017.1", + }, + + "SA1020": &lint.Documentation{ + Title: `Using an invalid host:port pair with a net.Listen-related function`, + Since: "2017.1", + }, + + "SA1021": &lint.Documentation{ + Title: `Using bytes.Equal to compare two net.IP`, + Text: `A net.IP stores an IPv4 or IPv6 address as a slice of bytes. The +length of the slice for an IPv4 address, however, can be either 4 or +16 bytes long, using different ways of representing IPv4 addresses. In +order to correctly compare two net.IPs, the net.IP.Equal method should +be used, as it takes both representations into account.`, + Since: "2017.1", + }, + + "SA1023": &lint.Documentation{ + Title: `Modifying the buffer in an io.Writer implementation`, + Text: `Write must not modify the slice data, even temporarily.`, + Since: "2017.1", + }, + + "SA1024": &lint.Documentation{ + Title: `A string cutset contains duplicate characters`, + Text: `The strings.TrimLeft and strings.TrimRight functions take cutsets, not +prefixes. A cutset is treated as a set of characters to remove from a +string. For example, + + strings.TrimLeft("42133word", "1234")) + +will result in the string "word" – any characters that are 1, 2, 3 or +4 are cut from the left of the string. + +In order to remove one string from another, use strings.TrimPrefix instead.`, + Since: "2017.1", + }, + + "SA1025": &lint.Documentation{ + Title: `It is not possible to use (*time.Timer).Reset's return value correctly`, + Since: "2019.1", + }, + + "SA1026": &lint.Documentation{ + Title: `Cannot marshal channels or functions`, + Since: "2019.2", + }, + + "SA1027": &lint.Documentation{ + Title: `Atomic access to 64-bit variable must be 64-bit aligned`, + Text: `On ARM, x86-32, and 32-bit MIPS, it is the caller's responsibility to +arrange for 64-bit alignment of 64-bit words accessed atomically. The +first word in a variable or in an allocated struct, array, or slice +can be relied upon to be 64-bit aligned. + +You can use the structlayout tool to inspect the alignment of fields +in a struct.`, + Since: "2019.2", + }, + + "SA2000": &lint.Documentation{ + Title: `sync.WaitGroup.Add called inside the goroutine, leading to a race condition`, + Since: "2017.1", + }, + + "SA2001": &lint.Documentation{ + Title: `Empty critical section, did you mean to defer the unlock?`, + Text: `Empty critical sections of the kind + + mu.Lock() + mu.Unlock() + +are very often a typo, and the following was intended instead: + + mu.Lock() + defer mu.Unlock() + +Do note that sometimes empty critical sections can be useful, as a +form of signaling to wait on another goroutine. Many times, there are +simpler ways of achieving the same effect. When that isn't the case, +the code should be amply commented to avoid confusion. Combining such +comments with a //lint:ignore directive can be used to suppress this +rare false positive.`, + Since: "2017.1", + }, + + "SA2002": &lint.Documentation{ + Title: `Called testing.T.FailNow or SkipNow in a goroutine, which isn't allowed`, + Since: "2017.1", + }, + + "SA2003": &lint.Documentation{ + Title: `Deferred Lock right after locking, likely meant to defer Unlock instead`, + Since: "2017.1", + }, + + "SA3000": &lint.Documentation{ + Title: `TestMain doesn't call os.Exit, hiding test failures`, + Text: `Test executables (and in turn 'go test') exit with a non-zero status +code if any tests failed. When specifying your own TestMain function, +it is your responsibility to arrange for this, by calling os.Exit with +the correct code. The correct code is returned by (*testing.M).Run, so +the usual way of implementing TestMain is to end it with +os.Exit(m.Run()).`, + Since: "2017.1", + }, + + "SA3001": &lint.Documentation{ + Title: `Assigning to b.N in benchmarks distorts the results`, + Text: `The testing package dynamically sets b.N to improve the reliability of +benchmarks and uses it in computations to determine the duration of a +single operation. Benchmark code must not alter b.N as this would +falsify results.`, + Since: "2017.1", + }, + + "SA4000": &lint.Documentation{ + Title: `Boolean expression has identical expressions on both sides`, + Since: "2017.1", + }, + + "SA4001": &lint.Documentation{ + Title: `&*x gets simplified to x, it does not copy x`, + Since: "2017.1", + }, + + "SA4002": &lint.Documentation{ + Title: `Comparing strings with known different sizes has predictable results`, + Since: "2017.1", + }, + + "SA4003": &lint.Documentation{ + Title: `Comparing unsigned values against negative values is pointless`, + Since: "2017.1", + }, + + "SA4004": &lint.Documentation{ + Title: `The loop exits unconditionally after one iteration`, + Since: "2017.1", + }, + + "SA4005": &lint.Documentation{ + Title: `Field assignment that will never be observed. Did you mean to use a pointer receiver?`, + Since: "2017.1", + }, + + "SA4006": &lint.Documentation{ + Title: `A value assigned to a variable is never read before being overwritten. Forgotten error check or dead code?`, + Since: "2017.1", + }, + + "SA4008": &lint.Documentation{ + Title: `The variable in the loop condition never changes, are you incrementing the wrong variable?`, + Since: "2017.1", + }, + + "SA4009": &lint.Documentation{ + Title: `A function argument is overwritten before its first use`, + Since: "2017.1", + }, + + "SA4010": &lint.Documentation{ + Title: `The result of append will never be observed anywhere`, + Since: "2017.1", + }, + + "SA4011": &lint.Documentation{ + Title: `Break statement with no effect. Did you mean to break out of an outer loop?`, + Since: "2017.1", + }, + + "SA4012": &lint.Documentation{ + Title: `Comparing a value against NaN even though no value is equal to NaN`, + Since: "2017.1", + }, + + "SA4013": &lint.Documentation{ + Title: `Negating a boolean twice (!!b) is the same as writing b. This is either redundant, or a typo.`, + Since: "2017.1", + }, + + "SA4014": &lint.Documentation{ + Title: `An if/else if chain has repeated conditions and no side-effects; if the condition didn't match the first time, it won't match the second time, either`, + Since: "2017.1", + }, + + "SA4015": &lint.Documentation{ + Title: `Calling functions like math.Ceil on floats converted from integers doesn't do anything useful`, + Since: "2017.1", + }, + + "SA4016": &lint.Documentation{ + Title: `Certain bitwise operations, such as x ^ 0, do not do anything useful`, + Since: "2017.1", + }, + + "SA4017": &lint.Documentation{ + Title: `A pure function's return value is discarded, making the call pointless`, + Since: "2017.1", + }, + + "SA4018": &lint.Documentation{ + Title: `Self-assignment of variables`, + Since: "2017.1", + }, + + "SA4019": &lint.Documentation{ + Title: `Multiple, identical build constraints in the same file`, + Since: "2017.1", + }, + + "SA4020": &lint.Documentation{ + Title: `Unreachable case clause in a type switch`, + Text: `In a type switch like the following + + type T struct{} + func (T) Read(b []byte) (int, error) { return 0, nil } + + var v interface{} = T{} + + switch v.(type) { + case io.Reader: + // ... + case T: + // unreachable + } + +the second case clause can never be reached because T implements +io.Reader and case clauses are evaluated in source order. + +Another example: + + type T struct{} + func (T) Read(b []byte) (int, error) { return 0, nil } + func (T) Close() error { return nil } + + var v interface{} = T{} + + switch v.(type) { + case io.Reader: + // ... + case io.ReadCloser: + // unreachable + } + +Even though T has a Close method and thus implements io.ReadCloser, +io.Reader will always match first. The method set of io.Reader is a +subset of io.ReadCloser. Thus it is impossible to match the second +case without matching the first case. + + +Structurally equivalent interfaces + +A special case of the previous example are structurally identical +interfaces. Given these declarations + + type T error + type V error + + func doSomething() error { + err, ok := doAnotherThing() + if ok { + return T(err) + } + + return U(err) + } + +the following type switch will have an unreachable case clause: + + switch doSomething().(type) { + case T: + // ... + case V: + // unreachable + } + +T will always match before V because they are structurally equivalent +and therefore doSomething()'s return value implements both.`, + Since: "2019.2", + }, + + "SA4021": &lint.Documentation{ + Title: `x = append(y) is equivalent to x = y`, + Since: "2019.2", + }, + + "SA5000": &lint.Documentation{ + Title: `Assignment to nil map`, + Since: "2017.1", + }, + + "SA5001": &lint.Documentation{ + Title: `Defering Close before checking for a possible error`, + Since: "2017.1", + }, + + "SA5002": &lint.Documentation{ + Title: `The empty for loop (for {}) spins and can block the scheduler`, + Since: "2017.1", + }, + + "SA5003": &lint.Documentation{ + Title: `Defers in infinite loops will never execute`, + Text: `Defers are scoped to the surrounding function, not the surrounding +block. In a function that never returns, i.e. one containing an +infinite loop, defers will never execute.`, + Since: "2017.1", + }, + + "SA5004": &lint.Documentation{ + Title: `for { select { ... with an empty default branch spins`, + Since: "2017.1", + }, + + "SA5005": &lint.Documentation{ + Title: `The finalizer references the finalized object, preventing garbage collection`, + Text: `A finalizer is a function associated with an object that runs when the +garbage collector is ready to collect said object, that is when the +object is no longer referenced by anything. + +If the finalizer references the object, however, it will always remain +as the final reference to that object, preventing the garbage +collector from collecting the object. The finalizer will never run, +and the object will never be collected, leading to a memory leak. That +is why the finalizer should instead use its first argument to operate +on the object. That way, the number of references can temporarily go +to zero before the object is being passed to the finalizer.`, + Since: "2017.1", + }, + + "SA5006": &lint.Documentation{ + Title: `Slice index out of bounds`, + Since: "2017.1", + }, + + "SA5007": &lint.Documentation{ + Title: `Infinite recursive call`, + Text: `A function that calls itself recursively needs to have an exit +condition. Otherwise it will recurse forever, until the system runs +out of memory. + +This issue can be caused by simple bugs such as forgetting to add an +exit condition. It can also happen "on purpose". Some languages have +tail call optimization which makes certain infinite recursive calls +safe to use. Go, however, does not implement TCO, and as such a loop +should be used instead.`, + Since: "2017.1", + }, + + "SA5008": &lint.Documentation{ + Title: `Invalid struct tag`, + Since: "2019.2", + }, + + "SA5009": &lint.Documentation{ + Title: `Invalid Printf call`, + Since: "2019.2", + }, + + "SA6000": &lint.Documentation{ + Title: `Using regexp.Match or related in a loop, should use regexp.Compile`, + Since: "2017.1", + }, + + "SA6001": &lint.Documentation{ + Title: `Missing an optimization opportunity when indexing maps by byte slices`, + + Text: `Map keys must be comparable, which precludes the use of byte slices. +This usually leads to using string keys and converting byte slices to +strings. + +Normally, a conversion of a byte slice to a string needs to copy the data and +causes allocations. The compiler, however, recognizes m[string(b)] and +uses the data of b directly, without copying it, because it knows that +the data can't change during the map lookup. This leads to the +counter-intuitive situation that + + k := string(b) + println(m[k]) + println(m[k]) + +will be less efficient than + + println(m[string(b)]) + println(m[string(b)]) + +because the first version needs to copy and allocate, while the second +one does not. + +For some history on this optimization, check out commit +f5f5a8b6209f84961687d993b93ea0d397f5d5bf in the Go repository.`, + Since: "2017.1", + }, + + "SA6002": &lint.Documentation{ + Title: `Storing non-pointer values in sync.Pool allocates memory`, + Text: `A sync.Pool is used to avoid unnecessary allocations and reduce the +amount of work the garbage collector has to do. + +When passing a value that is not a pointer to a function that accepts +an interface, the value needs to be placed on the heap, which means an +additional allocation. Slices are a common thing to put in sync.Pools, +and they're structs with 3 fields (length, capacity, and a pointer to +an array). In order to avoid the extra allocation, one should store a +pointer to the slice instead. + +See the comments on https://go-review.googlesource.com/c/go/+/24371 +that discuss this problem.`, + Since: "2017.1", + }, + + "SA6003": &lint.Documentation{ + Title: `Converting a string to a slice of runes before ranging over it`, + Text: `You may want to loop over the runes in a string. Instead of converting +the string to a slice of runes and looping over that, you can loop +over the string itself. That is, + + for _, r := range s {} + +and + + for _, r := range []rune(s) {} + +will yield the same values. The first version, however, will be faster +and avoid unnecessary memory allocations. + +Do note that if you are interested in the indices, ranging over a +string and over a slice of runes will yield different indices. The +first one yields byte offsets, while the second one yields indices in +the slice of runes.`, + Since: "2017.1", + }, + + "SA6005": &lint.Documentation{ + Title: `Inefficient string comparison with strings.ToLower or strings.ToUpper`, + Text: `Converting two strings to the same case and comparing them like so + + if strings.ToLower(s1) == strings.ToLower(s2) { + ... + } + +is significantly more expensive than comparing them with +strings.EqualFold(s1, s2). This is due to memory usage as well as +computational complexity. + +strings.ToLower will have to allocate memory for the new strings, as +well as convert both strings fully, even if they differ on the very +first byte. strings.EqualFold, on the other hand, compares the strings +one character at a time. It doesn't need to create two intermediate +strings and can return as soon as the first non-matching character has +been found. + +For a more in-depth explanation of this issue, see +https://blog.digitalocean.com/how-to-efficiently-compare-strings-in-go/`, + Since: "2019.2", + }, + + "SA9001": &lint.Documentation{ + Title: `Defers in range loops may not run when you expect them to`, + Since: "2017.1", + }, + + "SA9002": &lint.Documentation{ + Title: `Using a non-octal os.FileMode that looks like it was meant to be in octal.`, + Since: "2017.1", + }, + + "SA9003": &lint.Documentation{ + Title: `Empty body in an if or else branch`, + Since: "2017.1", + }, + + "SA9004": &lint.Documentation{ + Title: `Only the first constant has an explicit type`, + + Text: `In a constant declaration such as the following: + + const ( + First byte = 1 + Second = 2 + ) + +the constant Second does not have the same type as the constant First. +This construct shouldn't be confused with + + const ( + First byte = iota + Second + ) + +where First and Second do indeed have the same type. The type is only +passed on when no explicit value is assigned to the constant. + +When declaring enumerations with explicit values it is therefore +important not to write + + const ( + EnumFirst EnumType = 1 + EnumSecond = 2 + EnumThird = 3 + ) + +This discrepancy in types can cause various confusing behaviors and +bugs. + + +Wrong type in variable declarations + +The most obvious issue with such incorrect enumerations expresses +itself as a compile error: + + package pkg + + const ( + EnumFirst uint8 = 1 + EnumSecond = 2 + ) + + func fn(useFirst bool) { + x := EnumSecond + if useFirst { + x = EnumFirst + } + } + +fails to compile with + + ./const.go:11:5: cannot use EnumFirst (type uint8) as type int in assignment + + +Losing method sets + +A more subtle issue occurs with types that have methods and optional +interfaces. Consider the following: + + package main + + import "fmt" + + type Enum int + + func (e Enum) String() string { + return "an enum" + } + + const ( + EnumFirst Enum = 1 + EnumSecond = 2 + ) + + func main() { + fmt.Println(EnumFirst) + fmt.Println(EnumSecond) + } + +This code will output + + an enum + 2 + +as EnumSecond has no explicit type, and thus defaults to int.`, + Since: "2019.1", + }, + + "SA9005": &lint.Documentation{ + Title: `Trying to marshal a struct with no public fields nor custom marshaling`, + Text: `The encoding/json and encoding/xml packages only operate on exported +fields in structs, not unexported ones. It is usually an error to try +to (un)marshal structs that only consist of unexported fields. + +This check will not flag calls involving types that define custom +marshaling behavior, e.g. via MarshalJSON methods. It will also not +flag empty structs.`, + Since: "2019.2", + }, +} diff --git a/vendor/honnef.co/go/tools/staticcheck/knowledge.go b/vendor/honnef.co/go/tools/staticcheck/knowledge.go new file mode 100644 index 00000000..4c12b866 --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/knowledge.go @@ -0,0 +1,25 @@ +package staticcheck + +import ( + "reflect" + + "golang.org/x/tools/go/analysis" + "honnef.co/go/tools/internal/passes/buildssa" + "honnef.co/go/tools/ssa" + "honnef.co/go/tools/staticcheck/vrp" +) + +var valueRangesAnalyzer = &analysis.Analyzer{ + Name: "vrp", + Doc: "calculate value ranges of functions", + Run: func(pass *analysis.Pass) (interface{}, error) { + m := map[*ssa.Function]vrp.Ranges{} + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + vr := vrp.BuildGraph(ssafn).Solve() + m[ssafn] = vr + } + return m, nil + }, + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + ResultType: reflect.TypeOf(map[*ssa.Function]vrp.Ranges{}), +} diff --git a/vendor/honnef.co/go/tools/staticcheck/lint.go b/vendor/honnef.co/go/tools/staticcheck/lint.go new file mode 100644 index 00000000..1558cbf9 --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/lint.go @@ -0,0 +1,3360 @@ +// Package staticcheck contains a linter for Go source code. +package staticcheck // import "honnef.co/go/tools/staticcheck" + +import ( + "fmt" + "go/ast" + "go/constant" + "go/token" + "go/types" + htmltemplate "html/template" + "net/http" + "reflect" + "regexp" + "regexp/syntax" + "sort" + "strconv" + "strings" + texttemplate "text/template" + "unicode" + + . "honnef.co/go/tools/arg" + "honnef.co/go/tools/deprecated" + "honnef.co/go/tools/facts" + "honnef.co/go/tools/functions" + "honnef.co/go/tools/internal/passes/buildssa" + "honnef.co/go/tools/internal/sharedcheck" + "honnef.co/go/tools/lint" + . "honnef.co/go/tools/lint/lintdsl" + "honnef.co/go/tools/printf" + "honnef.co/go/tools/ssa" + "honnef.co/go/tools/ssautil" + "honnef.co/go/tools/staticcheck/vrp" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/passes/inspect" + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/ast/inspector" + "golang.org/x/tools/go/types/typeutil" +) + +func validRegexp(call *Call) { + arg := call.Args[0] + err := ValidateRegexp(arg.Value) + if err != nil { + arg.Invalid(err.Error()) + } +} + +type runeSlice []rune + +func (rs runeSlice) Len() int { return len(rs) } +func (rs runeSlice) Less(i int, j int) bool { return rs[i] < rs[j] } +func (rs runeSlice) Swap(i int, j int) { rs[i], rs[j] = rs[j], rs[i] } + +func utf8Cutset(call *Call) { + arg := call.Args[1] + if InvalidUTF8(arg.Value) { + arg.Invalid(MsgInvalidUTF8) + } +} + +func uniqueCutset(call *Call) { + arg := call.Args[1] + if !UniqueStringCutset(arg.Value) { + arg.Invalid(MsgNonUniqueCutset) + } +} + +func unmarshalPointer(name string, arg int) CallCheck { + return func(call *Call) { + if !Pointer(call.Args[arg].Value) { + call.Args[arg].Invalid(fmt.Sprintf("%s expects to unmarshal into a pointer, but the provided value is not a pointer", name)) + } + } +} + +func pointlessIntMath(call *Call) { + if ConvertedFromInt(call.Args[0].Value) { + call.Invalid(fmt.Sprintf("calling %s on a converted integer is pointless", CallName(call.Instr.Common()))) + } +} + +func checkValidHostPort(arg int) CallCheck { + return func(call *Call) { + if !ValidHostPort(call.Args[arg].Value) { + call.Args[arg].Invalid(MsgInvalidHostPort) + } + } +} + +var ( + checkRegexpRules = map[string]CallCheck{ + "regexp.MustCompile": validRegexp, + "regexp.Compile": validRegexp, + "regexp.Match": validRegexp, + "regexp.MatchReader": validRegexp, + "regexp.MatchString": validRegexp, + } + + checkTimeParseRules = map[string]CallCheck{ + "time.Parse": func(call *Call) { + arg := call.Args[Arg("time.Parse.layout")] + err := ValidateTimeLayout(arg.Value) + if err != nil { + arg.Invalid(err.Error()) + } + }, + } + + checkEncodingBinaryRules = map[string]CallCheck{ + "encoding/binary.Write": func(call *Call) { + arg := call.Args[Arg("encoding/binary.Write.data")] + if !CanBinaryMarshal(call.Pass, arg.Value) { + arg.Invalid(fmt.Sprintf("value of type %s cannot be used with binary.Write", arg.Value.Value.Type())) + } + }, + } + + checkURLsRules = map[string]CallCheck{ + "net/url.Parse": func(call *Call) { + arg := call.Args[Arg("net/url.Parse.rawurl")] + err := ValidateURL(arg.Value) + if err != nil { + arg.Invalid(err.Error()) + } + }, + } + + checkSyncPoolValueRules = map[string]CallCheck{ + "(*sync.Pool).Put": func(call *Call) { + arg := call.Args[Arg("(*sync.Pool).Put.x")] + typ := arg.Value.Value.Type() + if !IsPointerLike(typ) { + arg.Invalid("argument should be pointer-like to avoid allocations") + } + }, + } + + checkRegexpFindAllRules = map[string]CallCheck{ + "(*regexp.Regexp).FindAll": RepeatZeroTimes("a FindAll method", 1), + "(*regexp.Regexp).FindAllIndex": RepeatZeroTimes("a FindAll method", 1), + "(*regexp.Regexp).FindAllString": RepeatZeroTimes("a FindAll method", 1), + "(*regexp.Regexp).FindAllStringIndex": RepeatZeroTimes("a FindAll method", 1), + "(*regexp.Regexp).FindAllStringSubmatch": RepeatZeroTimes("a FindAll method", 1), + "(*regexp.Regexp).FindAllStringSubmatchIndex": RepeatZeroTimes("a FindAll method", 1), + "(*regexp.Regexp).FindAllSubmatch": RepeatZeroTimes("a FindAll method", 1), + "(*regexp.Regexp).FindAllSubmatchIndex": RepeatZeroTimes("a FindAll method", 1), + } + + checkUTF8CutsetRules = map[string]CallCheck{ + "strings.IndexAny": utf8Cutset, + "strings.LastIndexAny": utf8Cutset, + "strings.ContainsAny": utf8Cutset, + "strings.Trim": utf8Cutset, + "strings.TrimLeft": utf8Cutset, + "strings.TrimRight": utf8Cutset, + } + + checkUniqueCutsetRules = map[string]CallCheck{ + "strings.Trim": uniqueCutset, + "strings.TrimLeft": uniqueCutset, + "strings.TrimRight": uniqueCutset, + } + + checkUnmarshalPointerRules = map[string]CallCheck{ + "encoding/xml.Unmarshal": unmarshalPointer("xml.Unmarshal", 1), + "(*encoding/xml.Decoder).Decode": unmarshalPointer("Decode", 0), + "(*encoding/xml.Decoder).DecodeElement": unmarshalPointer("DecodeElement", 0), + "encoding/json.Unmarshal": unmarshalPointer("json.Unmarshal", 1), + "(*encoding/json.Decoder).Decode": unmarshalPointer("Decode", 0), + } + + checkUnbufferedSignalChanRules = map[string]CallCheck{ + "os/signal.Notify": func(call *Call) { + arg := call.Args[Arg("os/signal.Notify.c")] + if UnbufferedChannel(arg.Value) { + arg.Invalid("the channel used with signal.Notify should be buffered") + } + }, + } + + checkMathIntRules = map[string]CallCheck{ + "math.Ceil": pointlessIntMath, + "math.Floor": pointlessIntMath, + "math.IsNaN": pointlessIntMath, + "math.Trunc": pointlessIntMath, + "math.IsInf": pointlessIntMath, + } + + checkStringsReplaceZeroRules = map[string]CallCheck{ + "strings.Replace": RepeatZeroTimes("strings.Replace", 3), + "bytes.Replace": RepeatZeroTimes("bytes.Replace", 3), + } + + checkListenAddressRules = map[string]CallCheck{ + "net/http.ListenAndServe": checkValidHostPort(0), + "net/http.ListenAndServeTLS": checkValidHostPort(0), + } + + checkBytesEqualIPRules = map[string]CallCheck{ + "bytes.Equal": func(call *Call) { + if ConvertedFrom(call.Args[Arg("bytes.Equal.a")].Value, "net.IP") && + ConvertedFrom(call.Args[Arg("bytes.Equal.b")].Value, "net.IP") { + call.Invalid("use net.IP.Equal to compare net.IPs, not bytes.Equal") + } + }, + } + + checkRegexpMatchLoopRules = map[string]CallCheck{ + "regexp.Match": loopedRegexp("regexp.Match"), + "regexp.MatchReader": loopedRegexp("regexp.MatchReader"), + "regexp.MatchString": loopedRegexp("regexp.MatchString"), + } + + checkNoopMarshal = map[string]CallCheck{ + // TODO(dh): should we really flag XML? Even an empty struct + // produces a non-zero amount of data, namely its type name. + // Let's see if we encounter any false positives. + // + // Also, should we flag gob? + "encoding/json.Marshal": checkNoopMarshalImpl(Arg("json.Marshal.v"), "MarshalJSON", "MarshalText"), + "encoding/xml.Marshal": checkNoopMarshalImpl(Arg("xml.Marshal.v"), "MarshalXML", "MarshalText"), + "(*encoding/json.Encoder).Encode": checkNoopMarshalImpl(Arg("(*encoding/json.Encoder).Encode.v"), "MarshalJSON", "MarshalText"), + "(*encoding/xml.Encoder).Encode": checkNoopMarshalImpl(Arg("(*encoding/xml.Encoder).Encode.v"), "MarshalXML", "MarshalText"), + + "encoding/json.Unmarshal": checkNoopMarshalImpl(Arg("json.Unmarshal.v"), "UnmarshalJSON", "UnmarshalText"), + "encoding/xml.Unmarshal": checkNoopMarshalImpl(Arg("xml.Unmarshal.v"), "UnmarshalXML", "UnmarshalText"), + "(*encoding/json.Decoder).Decode": checkNoopMarshalImpl(Arg("(*encoding/json.Decoder).Decode.v"), "UnmarshalJSON", "UnmarshalText"), + "(*encoding/xml.Decoder).Decode": checkNoopMarshalImpl(Arg("(*encoding/xml.Decoder).Decode.v"), "UnmarshalXML", "UnmarshalText"), + } + + checkUnsupportedMarshal = map[string]CallCheck{ + "encoding/json.Marshal": checkUnsupportedMarshalImpl(Arg("json.Marshal.v"), "json", "MarshalJSON", "MarshalText"), + "encoding/xml.Marshal": checkUnsupportedMarshalImpl(Arg("xml.Marshal.v"), "xml", "MarshalXML", "MarshalText"), + "(*encoding/json.Encoder).Encode": checkUnsupportedMarshalImpl(Arg("(*encoding/json.Encoder).Encode.v"), "json", "MarshalJSON", "MarshalText"), + "(*encoding/xml.Encoder).Encode": checkUnsupportedMarshalImpl(Arg("(*encoding/xml.Encoder).Encode.v"), "xml", "MarshalXML", "MarshalText"), + } + + checkAtomicAlignment = map[string]CallCheck{ + "sync/atomic.AddInt64": checkAtomicAlignmentImpl, + "sync/atomic.AddUint64": checkAtomicAlignmentImpl, + "sync/atomic.CompareAndSwapInt64": checkAtomicAlignmentImpl, + "sync/atomic.CompareAndSwapUint64": checkAtomicAlignmentImpl, + "sync/atomic.LoadInt64": checkAtomicAlignmentImpl, + "sync/atomic.LoadUint64": checkAtomicAlignmentImpl, + "sync/atomic.StoreInt64": checkAtomicAlignmentImpl, + "sync/atomic.StoreUint64": checkAtomicAlignmentImpl, + "sync/atomic.SwapInt64": checkAtomicAlignmentImpl, + "sync/atomic.SwapUint64": checkAtomicAlignmentImpl, + } + + // TODO(dh): detect printf wrappers + checkPrintfRules = map[string]CallCheck{ + "fmt.Errorf": func(call *Call) { checkPrintfCall(call, 0, 1) }, + "fmt.Printf": func(call *Call) { checkPrintfCall(call, 0, 1) }, + "fmt.Sprintf": func(call *Call) { checkPrintfCall(call, 0, 1) }, + "fmt.Fprintf": func(call *Call) { checkPrintfCall(call, 1, 2) }, + } +) + +func checkPrintfCall(call *Call, fIdx, vIdx int) { + f := call.Args[fIdx] + var args []ssa.Value + switch v := call.Args[vIdx].Value.Value.(type) { + case *ssa.Slice: + var ok bool + args, ok = ssautil.Vararg(v) + if !ok { + // We don't know what the actual arguments to the function are + return + } + case *ssa.Const: + // nil, i.e. no arguments + default: + // We don't know what the actual arguments to the function are + return + } + checkPrintfCallImpl(call, f.Value.Value, args) +} + +type verbFlag int + +const ( + isInt verbFlag = 1 << iota + isBool + isFP + isString + isPointer + isPseudoPointer + isSlice + isAny + noRecurse +) + +var verbs = [...]verbFlag{ + 'b': isPseudoPointer | isInt | isFP, + 'c': isInt, + 'd': isPseudoPointer | isInt, + 'e': isFP, + 'E': isFP, + 'f': isFP, + 'F': isFP, + 'g': isFP, + 'G': isFP, + 'o': isPseudoPointer | isInt, + 'p': isSlice | isPointer | noRecurse, + 'q': isInt | isString, + 's': isString, + 't': isBool, + 'T': isAny, + 'U': isInt, + 'v': isAny, + 'X': isPseudoPointer | isInt | isString, + 'x': isPseudoPointer | isInt | isString, +} + +func checkPrintfCallImpl(call *Call, f ssa.Value, args []ssa.Value) { + var msCache *typeutil.MethodSetCache + if f.Parent() != nil { + msCache = &f.Parent().Prog.MethodSets + } + + elem := func(T types.Type, verb rune) ([]types.Type, bool) { + if verbs[verb]&noRecurse != 0 { + return []types.Type{T}, false + } + switch T := T.(type) { + case *types.Slice: + if verbs[verb]&isSlice != 0 { + return []types.Type{T}, false + } + if verbs[verb]&isString != 0 && IsType(T.Elem().Underlying(), "byte") { + return []types.Type{T}, false + } + return []types.Type{T.Elem()}, true + case *types.Map: + key := T.Key() + val := T.Elem() + return []types.Type{key, val}, true + case *types.Struct: + out := make([]types.Type, 0, T.NumFields()) + for i := 0; i < T.NumFields(); i++ { + out = append(out, T.Field(i).Type()) + } + return out, true + case *types.Array: + return []types.Type{T.Elem()}, true + default: + return []types.Type{T}, false + } + } + isInfo := func(T types.Type, info types.BasicInfo) bool { + basic, ok := T.Underlying().(*types.Basic) + return ok && basic.Info()&info != 0 + } + + isStringer := func(T types.Type, ms *types.MethodSet) bool { + sel := ms.Lookup(nil, "String") + if sel == nil { + return false + } + fn, ok := sel.Obj().(*types.Func) + if !ok { + // should be unreachable + return false + } + sig := fn.Type().(*types.Signature) + if sig.Params().Len() != 0 { + return false + } + if sig.Results().Len() != 1 { + return false + } + if !IsType(sig.Results().At(0).Type(), "string") { + return false + } + return true + } + isError := func(T types.Type, ms *types.MethodSet) bool { + sel := ms.Lookup(nil, "Error") + if sel == nil { + return false + } + fn, ok := sel.Obj().(*types.Func) + if !ok { + // should be unreachable + return false + } + sig := fn.Type().(*types.Signature) + if sig.Params().Len() != 0 { + return false + } + if sig.Results().Len() != 1 { + return false + } + if !IsType(sig.Results().At(0).Type(), "string") { + return false + } + return true + } + + isFormatter := func(T types.Type, ms *types.MethodSet) bool { + sel := ms.Lookup(nil, "Format") + if sel == nil { + return false + } + fn, ok := sel.Obj().(*types.Func) + if !ok { + // should be unreachable + return false + } + sig := fn.Type().(*types.Signature) + if sig.Params().Len() != 2 { + return false + } + // TODO(dh): check the types of the arguments for more + // precision + if sig.Results().Len() != 0 { + return false + } + return true + } + + seen := map[types.Type]bool{} + var checkType func(verb rune, T types.Type, top bool) bool + checkType = func(verb rune, T types.Type, top bool) bool { + if top { + for k := range seen { + delete(seen, k) + } + } + if seen[T] { + return true + } + seen[T] = true + if int(verb) >= len(verbs) { + // Unknown verb + return true + } + + flags := verbs[verb] + if flags == 0 { + // Unknown verb + return true + } + + ms := msCache.MethodSet(T) + if isFormatter(T, ms) { + // the value is responsible for formatting itself + return true + } + + if flags&isString != 0 && (isStringer(T, ms) || isError(T, ms)) { + // Check for stringer early because we're about to dereference + return true + } + + T = T.Underlying() + if flags&(isPointer|isPseudoPointer) == 0 && top { + T = Dereference(T) + } + if flags&isPseudoPointer != 0 && top { + t := Dereference(T) + if _, ok := t.Underlying().(*types.Struct); ok { + T = t + } + } + + if _, ok := T.(*types.Interface); ok { + // We don't know what's in the interface + return true + } + + var info types.BasicInfo + if flags&isInt != 0 { + info |= types.IsInteger + } + if flags&isBool != 0 { + info |= types.IsBoolean + } + if flags&isFP != 0 { + info |= types.IsFloat | types.IsComplex + } + if flags&isString != 0 { + info |= types.IsString + } + + if info != 0 && isInfo(T, info) { + return true + } + + if flags&isString != 0 && (IsType(T, "[]byte") || isStringer(T, ms) || isError(T, ms)) { + return true + } + + if flags&isPointer != 0 && IsPointerLike(T) { + return true + } + if flags&isPseudoPointer != 0 { + switch U := T.Underlying().(type) { + case *types.Pointer: + if !top { + return true + } + + if _, ok := U.Elem().Underlying().(*types.Struct); !ok { + return true + } + case *types.Chan, *types.Signature: + return true + } + } + + if flags&isSlice != 0 { + if _, ok := T.(*types.Slice); ok { + return true + } + } + + if flags&isAny != 0 { + return true + } + + elems, ok := elem(T.Underlying(), verb) + if !ok { + return false + } + for _, elem := range elems { + if !checkType(verb, elem, false) { + return false + } + } + + return true + } + + k, ok := f.(*ssa.Const) + if !ok { + return + } + actions, err := printf.Parse(constant.StringVal(k.Value)) + if err != nil { + call.Invalid("couldn't parse format string") + return + } + + ptr := 1 + hasExplicit := false + + checkStar := func(verb printf.Verb, star printf.Argument) bool { + if star, ok := star.(printf.Star); ok { + idx := 0 + if star.Index == -1 { + idx = ptr + ptr++ + } else { + hasExplicit = true + idx = star.Index + ptr = star.Index + 1 + } + if idx == 0 { + call.Invalid(fmt.Sprintf("Printf format %s reads invalid arg 0; indices are 1-based", verb.Raw)) + return false + } + if idx > len(args) { + call.Invalid( + fmt.Sprintf("Printf format %s reads arg #%d, but call has only %d args", + verb.Raw, idx, len(args))) + return false + } + if arg, ok := args[idx-1].(*ssa.MakeInterface); ok { + if !isInfo(arg.X.Type(), types.IsInteger) { + call.Invalid(fmt.Sprintf("Printf format %s reads non-int arg #%d as argument of *", verb.Raw, idx)) + } + } + } + return true + } + + // We only report one problem per format string. Making a + // mistake with an index tends to invalidate all future + // implicit indices. + for _, action := range actions { + verb, ok := action.(printf.Verb) + if !ok { + continue + } + + if !checkStar(verb, verb.Width) || !checkStar(verb, verb.Precision) { + return + } + + off := ptr + if verb.Value != -1 { + hasExplicit = true + off = verb.Value + } + if off > len(args) { + call.Invalid( + fmt.Sprintf("Printf format %s reads arg #%d, but call has only %d args", + verb.Raw, off, len(args))) + return + } else if verb.Value == 0 && verb.Letter != '%' { + call.Invalid(fmt.Sprintf("Printf format %s reads invalid arg 0; indices are 1-based", verb.Raw)) + return + } else if off != 0 { + arg, ok := args[off-1].(*ssa.MakeInterface) + if ok { + if !checkType(verb.Letter, arg.X.Type(), true) { + call.Invalid(fmt.Sprintf("Printf format %s has arg #%d of wrong type %s", + verb.Raw, ptr, args[ptr-1].(*ssa.MakeInterface).X.Type())) + return + } + } + } + + switch verb.Value { + case -1: + // Consume next argument + ptr++ + case 0: + // Don't consume any arguments + default: + ptr = verb.Value + 1 + } + } + + if !hasExplicit && ptr <= len(args) { + call.Invalid(fmt.Sprintf("Printf call needs %d args but has %d args", ptr-1, len(args))) + } +} + +func checkAtomicAlignmentImpl(call *Call) { + sizes := call.Pass.TypesSizes + if sizes.Sizeof(types.Typ[types.Uintptr]) != 4 { + // Not running on a 32-bit platform + return + } + v, ok := call.Args[0].Value.Value.(*ssa.FieldAddr) + if !ok { + // TODO(dh): also check indexing into arrays and slices + return + } + T := v.X.Type().Underlying().(*types.Pointer).Elem().Underlying().(*types.Struct) + fields := make([]*types.Var, 0, T.NumFields()) + for i := 0; i < T.NumFields() && i <= v.Field; i++ { + fields = append(fields, T.Field(i)) + } + + off := sizes.Offsetsof(fields)[v.Field] + if off%8 != 0 { + msg := fmt.Sprintf("address of non 64-bit aligned field %s passed to %s", + T.Field(v.Field).Name(), + CallName(call.Instr.Common())) + call.Invalid(msg) + } +} + +func checkNoopMarshalImpl(argN int, meths ...string) CallCheck { + return func(call *Call) { + if IsGenerated(call.Pass, call.Instr.Pos()) { + return + } + arg := call.Args[argN] + T := arg.Value.Value.Type() + Ts, ok := Dereference(T).Underlying().(*types.Struct) + if !ok { + return + } + if Ts.NumFields() == 0 { + return + } + fields := FlattenFields(Ts) + for _, field := range fields { + if field.Var.Exported() { + return + } + } + // OPT(dh): we could use a method set cache here + ms := call.Instr.Parent().Prog.MethodSets.MethodSet(T) + // TODO(dh): we're not checking the signature, which can cause false negatives. + // This isn't a huge problem, however, since vet complains about incorrect signatures. + for _, meth := range meths { + if ms.Lookup(nil, meth) != nil { + return + } + } + arg.Invalid("struct doesn't have any exported fields, nor custom marshaling") + } +} + +func checkUnsupportedMarshalImpl(argN int, tag string, meths ...string) CallCheck { + // TODO(dh): flag slices and maps of unsupported types + return func(call *Call) { + msCache := &call.Instr.Parent().Prog.MethodSets + + arg := call.Args[argN] + T := arg.Value.Value.Type() + Ts, ok := Dereference(T).Underlying().(*types.Struct) + if !ok { + return + } + ms := msCache.MethodSet(T) + // TODO(dh): we're not checking the signature, which can cause false negatives. + // This isn't a huge problem, however, since vet complains about incorrect signatures. + for _, meth := range meths { + if ms.Lookup(nil, meth) != nil { + return + } + } + fields := FlattenFields(Ts) + for _, field := range fields { + if !(field.Var.Exported()) { + continue + } + if reflect.StructTag(field.Tag).Get(tag) == "-" { + continue + } + ms := msCache.MethodSet(field.Var.Type()) + // TODO(dh): we're not checking the signature, which can cause false negatives. + // This isn't a huge problem, however, since vet complains about incorrect signatures. + for _, meth := range meths { + if ms.Lookup(nil, meth) != nil { + return + } + } + switch field.Var.Type().Underlying().(type) { + case *types.Chan, *types.Signature: + arg.Invalid(fmt.Sprintf("trying to marshal chan or func value, field %s", fieldPath(T, field.Path))) + } + } + } +} + +func fieldPath(start types.Type, indices []int) string { + p := start.String() + for _, idx := range indices { + field := Dereference(start).Underlying().(*types.Struct).Field(idx) + start = field.Type() + p += "." + field.Name() + } + return p +} + +func isInLoop(b *ssa.BasicBlock) bool { + sets := functions.FindLoops(b.Parent()) + for _, set := range sets { + if set.Has(b) { + return true + } + } + return false +} + +func CheckUntrappableSignal(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + if !IsCallToAnyAST(pass, call, + "os/signal.Ignore", "os/signal.Notify", "os/signal.Reset") { + return + } + for _, arg := range call.Args { + if conv, ok := arg.(*ast.CallExpr); ok && isName(pass, conv.Fun, "os.Signal") { + arg = conv.Args[0] + } + + if isName(pass, arg, "os.Kill") || isName(pass, arg, "syscall.SIGKILL") { + ReportNodef(pass, arg, "%s cannot be trapped (did you mean syscall.SIGTERM?)", Render(pass, arg)) + } + if isName(pass, arg, "syscall.SIGSTOP") { + ReportNodef(pass, arg, "%s signal cannot be trapped", Render(pass, arg)) + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func CheckTemplate(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + var kind string + if IsCallToAST(pass, call, "(*text/template.Template).Parse") { + kind = "text" + } else if IsCallToAST(pass, call, "(*html/template.Template).Parse") { + kind = "html" + } else { + return + } + sel := call.Fun.(*ast.SelectorExpr) + if !IsCallToAST(pass, sel.X, "text/template.New") && + !IsCallToAST(pass, sel.X, "html/template.New") { + // TODO(dh): this is a cheap workaround for templates with + // different delims. A better solution with less false + // negatives would use data flow analysis to see where the + // template comes from and where it has been + return + } + s, ok := ExprToString(pass, call.Args[Arg("(*text/template.Template).Parse.text")]) + if !ok { + return + } + var err error + switch kind { + case "text": + _, err = texttemplate.New("").Parse(s) + case "html": + _, err = htmltemplate.New("").Parse(s) + } + if err != nil { + // TODO(dominikh): whitelist other parse errors, if any + if strings.Contains(err.Error(), "unexpected") { + ReportNodef(pass, call.Args[Arg("(*text/template.Template).Parse.text")], "%s", err) + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func CheckTimeSleepConstant(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + if !IsCallToAST(pass, call, "time.Sleep") { + return + } + lit, ok := call.Args[Arg("time.Sleep.d")].(*ast.BasicLit) + if !ok { + return + } + n, err := strconv.Atoi(lit.Value) + if err != nil { + return + } + if n == 0 || n > 120 { + // time.Sleep(0) is a seldom used pattern in concurrency + // tests. >120 might be intentional. 120 was chosen + // because the user could've meant 2 minutes. + return + } + recommendation := "time.Sleep(time.Nanosecond)" + if n != 1 { + recommendation = fmt.Sprintf("time.Sleep(%d * time.Nanosecond)", n) + } + ReportNodef(pass, call.Args[Arg("time.Sleep.d")], + "sleeping for %d nanoseconds is probably a bug. Be explicit if it isn't: %s", n, recommendation) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func CheckWaitgroupAdd(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + g := node.(*ast.GoStmt) + fun, ok := g.Call.Fun.(*ast.FuncLit) + if !ok { + return + } + if len(fun.Body.List) == 0 { + return + } + stmt, ok := fun.Body.List[0].(*ast.ExprStmt) + if !ok { + return + } + if IsCallToAST(pass, stmt.X, "(*sync.WaitGroup).Add") { + ReportNodef(pass, stmt, "should call %s before starting the goroutine to avoid a race", + Render(pass, stmt)) + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.GoStmt)(nil)}, fn) + return nil, nil +} + +func CheckInfiniteEmptyLoop(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + loop := node.(*ast.ForStmt) + if len(loop.Body.List) != 0 || loop.Post != nil { + return + } + + if loop.Init != nil { + // TODO(dh): this isn't strictly necessary, it just makes + // the check easier. + return + } + // An empty loop is bad news in two cases: 1) The loop has no + // condition. In that case, it's just a loop that spins + // forever and as fast as it can, keeping a core busy. 2) The + // loop condition only consists of variable or field reads and + // operators on those. The only way those could change their + // value is with unsynchronised access, which constitutes a + // data race. + // + // If the condition contains any function calls, its behaviour + // is dynamic and the loop might terminate. Similarly for + // channel receives. + + if loop.Cond != nil { + if hasSideEffects(loop.Cond) { + return + } + if ident, ok := loop.Cond.(*ast.Ident); ok { + if k, ok := pass.TypesInfo.ObjectOf(ident).(*types.Const); ok { + if !constant.BoolVal(k.Val()) { + // don't flag `for false {}` loops. They're a debug aid. + return + } + } + } + ReportNodef(pass, loop, "loop condition never changes or has a race condition") + } + ReportNodef(pass, loop, "this loop will spin, using 100%% CPU") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn) + return nil, nil +} + +func CheckDeferInInfiniteLoop(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + mightExit := false + var defers []ast.Stmt + loop := node.(*ast.ForStmt) + if loop.Cond != nil { + return + } + fn2 := func(node ast.Node) bool { + switch stmt := node.(type) { + case *ast.ReturnStmt: + mightExit = true + return false + case *ast.BranchStmt: + // TODO(dominikh): if this sees a break in a switch or + // select, it doesn't check if it breaks the loop or + // just the select/switch. This causes some false + // negatives. + if stmt.Tok == token.BREAK { + mightExit = true + return false + } + case *ast.DeferStmt: + defers = append(defers, stmt) + case *ast.FuncLit: + // Don't look into function bodies + return false + } + return true + } + ast.Inspect(loop.Body, fn2) + if mightExit { + return + } + for _, stmt := range defers { + ReportNodef(pass, stmt, "defers in this infinite loop will never run") + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn) + return nil, nil +} + +func CheckDubiousDeferInChannelRangeLoop(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + loop := node.(*ast.RangeStmt) + typ := pass.TypesInfo.TypeOf(loop.X) + _, ok := typ.Underlying().(*types.Chan) + if !ok { + return + } + fn2 := func(node ast.Node) bool { + switch stmt := node.(type) { + case *ast.DeferStmt: + ReportNodef(pass, stmt, "defers in this range loop won't run unless the channel gets closed") + case *ast.FuncLit: + // Don't look into function bodies + return false + } + return true + } + ast.Inspect(loop.Body, fn2) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn) + return nil, nil +} + +func CheckTestMainExit(pass *analysis.Pass) (interface{}, error) { + var ( + fnmain ast.Node + callsExit bool + callsRun bool + arg types.Object + ) + fn := func(node ast.Node, push bool) bool { + if !push { + if fnmain != nil && node == fnmain { + if !callsExit && callsRun { + ReportNodef(pass, fnmain, "TestMain should call os.Exit to set exit code") + } + fnmain = nil + callsExit = false + callsRun = false + arg = nil + } + return true + } + + switch node := node.(type) { + case *ast.FuncDecl: + if fnmain != nil { + return true + } + if !isTestMain(pass, node) { + return false + } + fnmain = node + arg = pass.TypesInfo.ObjectOf(node.Type.Params.List[0].Names[0]) + return true + case *ast.CallExpr: + if IsCallToAST(pass, node, "os.Exit") { + callsExit = true + return false + } + sel, ok := node.Fun.(*ast.SelectorExpr) + if !ok { + return true + } + ident, ok := sel.X.(*ast.Ident) + if !ok { + return true + } + if arg != pass.TypesInfo.ObjectOf(ident) { + return true + } + if sel.Sel.Name == "Run" { + callsRun = true + return false + } + return true + default: + // unreachable + return true + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Nodes([]ast.Node{(*ast.FuncDecl)(nil), (*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func isTestMain(pass *analysis.Pass, decl *ast.FuncDecl) bool { + if decl.Name.Name != "TestMain" { + return false + } + if len(decl.Type.Params.List) != 1 { + return false + } + arg := decl.Type.Params.List[0] + if len(arg.Names) != 1 { + return false + } + return IsOfType(pass, arg.Type, "*testing.M") +} + +func CheckExec(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + if !IsCallToAST(pass, call, "os/exec.Command") { + return + } + val, ok := ExprToString(pass, call.Args[Arg("os/exec.Command.name")]) + if !ok { + return + } + if !strings.Contains(val, " ") || strings.Contains(val, `\`) || strings.Contains(val, "/") { + return + } + ReportNodef(pass, call.Args[Arg("os/exec.Command.name")], + "first argument to exec.Command looks like a shell command, but a program name or path are expected") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func CheckLoopEmptyDefault(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + loop := node.(*ast.ForStmt) + if len(loop.Body.List) != 1 || loop.Cond != nil || loop.Init != nil { + return + } + sel, ok := loop.Body.List[0].(*ast.SelectStmt) + if !ok { + return + } + for _, c := range sel.Body.List { + if comm, ok := c.(*ast.CommClause); ok && comm.Comm == nil && len(comm.Body) == 0 { + ReportNodef(pass, comm, "should not have an empty default case in a for+select loop. The loop will spin.") + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn) + return nil, nil +} + +func CheckLhsRhsIdentical(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + op := node.(*ast.BinaryExpr) + switch op.Op { + case token.EQL, token.NEQ: + if basic, ok := pass.TypesInfo.TypeOf(op.X).Underlying().(*types.Basic); ok { + if kind := basic.Kind(); kind == types.Float32 || kind == types.Float64 { + // f == f and f != f might be used to check for NaN + return + } + } + case token.SUB, token.QUO, token.AND, token.REM, token.OR, token.XOR, token.AND_NOT, + token.LAND, token.LOR, token.LSS, token.GTR, token.LEQ, token.GEQ: + default: + // For some ops, such as + and *, it can make sense to + // have identical operands + return + } + + if Render(pass, op.X) != Render(pass, op.Y) { + return + } + l1, ok1 := op.X.(*ast.BasicLit) + l2, ok2 := op.Y.(*ast.BasicLit) + if ok1 && ok2 && l1.Kind == token.INT && l2.Kind == l1.Kind && l1.Value == "0" && l2.Value == l1.Value && IsGenerated(pass, l1.Pos()) { + // cgo generates the following function call: + // _cgoCheckPointer(_cgoBase0, 0 == 0) – it uses 0 == 0 + // instead of true in case the user shadowed the + // identifier. Ideally we'd restrict this exception to + // calls of _cgoCheckPointer, but it's not worth the + // hassle of keeping track of the stack. + // are very rare to begin with, and we're mostly checking + // for them to catch typos such as 1 == 1 where the user + // meant to type i == 1. The odds of a false negative for + // 0 == 0 are slim. + return + } + ReportNodef(pass, op, "identical expressions on the left and right side of the '%s' operator", op.Op) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) + return nil, nil +} + +func CheckScopedBreak(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + var body *ast.BlockStmt + switch node := node.(type) { + case *ast.ForStmt: + body = node.Body + case *ast.RangeStmt: + body = node.Body + default: + panic(fmt.Sprintf("unreachable: %T", node)) + } + for _, stmt := range body.List { + var blocks [][]ast.Stmt + switch stmt := stmt.(type) { + case *ast.SwitchStmt: + for _, c := range stmt.Body.List { + blocks = append(blocks, c.(*ast.CaseClause).Body) + } + case *ast.SelectStmt: + for _, c := range stmt.Body.List { + blocks = append(blocks, c.(*ast.CommClause).Body) + } + default: + continue + } + + for _, body := range blocks { + if len(body) == 0 { + continue + } + lasts := []ast.Stmt{body[len(body)-1]} + // TODO(dh): unfold all levels of nested block + // statements, not just a single level if statement + if ifs, ok := lasts[0].(*ast.IfStmt); ok { + if len(ifs.Body.List) == 0 { + continue + } + lasts[0] = ifs.Body.List[len(ifs.Body.List)-1] + + if block, ok := ifs.Else.(*ast.BlockStmt); ok { + if len(block.List) != 0 { + lasts = append(lasts, block.List[len(block.List)-1]) + } + } + } + for _, last := range lasts { + branch, ok := last.(*ast.BranchStmt) + if !ok || branch.Tok != token.BREAK || branch.Label != nil { + continue + } + ReportNodef(pass, branch, "ineffective break statement. Did you mean to break out of the outer loop?") + } + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil), (*ast.RangeStmt)(nil)}, fn) + return nil, nil +} + +func CheckUnsafePrintf(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + var arg int + if IsCallToAnyAST(pass, call, "fmt.Printf", "fmt.Sprintf", "log.Printf") { + arg = Arg("fmt.Printf.format") + } else if IsCallToAnyAST(pass, call, "fmt.Fprintf") { + arg = Arg("fmt.Fprintf.format") + } else { + return + } + if len(call.Args) != arg+1 { + return + } + switch call.Args[arg].(type) { + case *ast.CallExpr, *ast.Ident: + default: + return + } + ReportNodef(pass, call.Args[arg], + "printf-style function with dynamic format string and no further arguments should use print-style function instead") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func CheckEarlyDefer(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + block := node.(*ast.BlockStmt) + if len(block.List) < 2 { + return + } + for i, stmt := range block.List { + if i == len(block.List)-1 { + break + } + assign, ok := stmt.(*ast.AssignStmt) + if !ok { + continue + } + if len(assign.Rhs) != 1 { + continue + } + if len(assign.Lhs) < 2 { + continue + } + if lhs, ok := assign.Lhs[len(assign.Lhs)-1].(*ast.Ident); ok && lhs.Name == "_" { + continue + } + call, ok := assign.Rhs[0].(*ast.CallExpr) + if !ok { + continue + } + sig, ok := pass.TypesInfo.TypeOf(call.Fun).(*types.Signature) + if !ok { + continue + } + if sig.Results().Len() < 2 { + continue + } + last := sig.Results().At(sig.Results().Len() - 1) + // FIXME(dh): check that it's error from universe, not + // another type of the same name + if last.Type().String() != "error" { + continue + } + lhs, ok := assign.Lhs[0].(*ast.Ident) + if !ok { + continue + } + def, ok := block.List[i+1].(*ast.DeferStmt) + if !ok { + continue + } + sel, ok := def.Call.Fun.(*ast.SelectorExpr) + if !ok { + continue + } + ident, ok := selectorX(sel).(*ast.Ident) + if !ok { + continue + } + if ident.Obj != lhs.Obj { + continue + } + if sel.Sel.Name != "Close" { + continue + } + ReportNodef(pass, def, "should check returned error before deferring %s", Render(pass, def.Call)) + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn) + return nil, nil +} + +func selectorX(sel *ast.SelectorExpr) ast.Node { + switch x := sel.X.(type) { + case *ast.SelectorExpr: + return selectorX(x) + default: + return x + } +} + +func CheckEmptyCriticalSection(pass *analysis.Pass) (interface{}, error) { + // Initially it might seem like this check would be easier to + // implement in SSA. After all, we're only checking for two + // consecutive method calls. In reality, however, there may be any + // number of other instructions between the lock and unlock, while + // still constituting an empty critical section. For example, + // given `m.x().Lock(); m.x().Unlock()`, there will be a call to + // x(). In the AST-based approach, this has a tiny potential for a + // false positive (the second call to x might be doing work that + // is protected by the mutex). In an SSA-based approach, however, + // it would miss a lot of real bugs. + + mutexParams := func(s ast.Stmt) (x ast.Expr, funcName string, ok bool) { + expr, ok := s.(*ast.ExprStmt) + if !ok { + return nil, "", false + } + call, ok := expr.X.(*ast.CallExpr) + if !ok { + return nil, "", false + } + sel, ok := call.Fun.(*ast.SelectorExpr) + if !ok { + return nil, "", false + } + + fn, ok := pass.TypesInfo.ObjectOf(sel.Sel).(*types.Func) + if !ok { + return nil, "", false + } + sig := fn.Type().(*types.Signature) + if sig.Params().Len() != 0 || sig.Results().Len() != 0 { + return nil, "", false + } + + return sel.X, fn.Name(), true + } + + fn := func(node ast.Node) { + block := node.(*ast.BlockStmt) + if len(block.List) < 2 { + return + } + for i := range block.List[:len(block.List)-1] { + sel1, method1, ok1 := mutexParams(block.List[i]) + sel2, method2, ok2 := mutexParams(block.List[i+1]) + + if !ok1 || !ok2 || Render(pass, sel1) != Render(pass, sel2) { + continue + } + if (method1 == "Lock" && method2 == "Unlock") || + (method1 == "RLock" && method2 == "RUnlock") { + ReportNodef(pass, block.List[i+1], "empty critical section") + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn) + return nil, nil +} + +// cgo produces code like fn(&*_Cvar_kSomeCallbacks) which we don't +// want to flag. +var cgoIdent = regexp.MustCompile(`^_C(func|var)_.+$`) + +func CheckIneffectiveCopy(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + if unary, ok := node.(*ast.UnaryExpr); ok { + if star, ok := unary.X.(*ast.StarExpr); ok && unary.Op == token.AND { + ident, ok := star.X.(*ast.Ident) + if !ok || !cgoIdent.MatchString(ident.Name) { + ReportNodef(pass, unary, "&*x will be simplified to x. It will not copy x.") + } + } + } + + if star, ok := node.(*ast.StarExpr); ok { + if unary, ok := star.X.(*ast.UnaryExpr); ok && unary.Op == token.AND { + ReportNodef(pass, star, "*&x will be simplified to x. It will not copy x.") + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.UnaryExpr)(nil), (*ast.StarExpr)(nil)}, fn) + return nil, nil +} + +func CheckDiffSizeComparison(pass *analysis.Pass) (interface{}, error) { + ranges := pass.ResultOf[valueRangesAnalyzer].(map[*ssa.Function]vrp.Ranges) + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, b := range ssafn.Blocks { + for _, ins := range b.Instrs { + binop, ok := ins.(*ssa.BinOp) + if !ok { + continue + } + if binop.Op != token.EQL && binop.Op != token.NEQ { + continue + } + _, ok1 := binop.X.(*ssa.Slice) + _, ok2 := binop.Y.(*ssa.Slice) + if !ok1 && !ok2 { + continue + } + r := ranges[ssafn] + r1, ok1 := r.Get(binop.X).(vrp.StringInterval) + r2, ok2 := r.Get(binop.Y).(vrp.StringInterval) + if !ok1 || !ok2 { + continue + } + if r1.Length.Intersection(r2.Length).Empty() { + pass.Reportf(binop.Pos(), "comparing strings of different sizes for equality will always return false") + } + } + } + } + return nil, nil +} + +func CheckCanonicalHeaderKey(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node, push bool) bool { + if !push { + return false + } + assign, ok := node.(*ast.AssignStmt) + if ok { + // TODO(dh): This risks missing some Header reads, for + // example in `h1["foo"] = h2["foo"]` – these edge + // cases are probably rare enough to ignore for now. + for _, expr := range assign.Lhs { + op, ok := expr.(*ast.IndexExpr) + if !ok { + continue + } + if IsOfType(pass, op.X, "net/http.Header") { + return false + } + } + return true + } + op, ok := node.(*ast.IndexExpr) + if !ok { + return true + } + if !IsOfType(pass, op.X, "net/http.Header") { + return true + } + s, ok := ExprToString(pass, op.Index) + if !ok { + return true + } + if s == http.CanonicalHeaderKey(s) { + return true + } + ReportNodef(pass, op, "keys in http.Header are canonicalized, %q is not canonical; fix the constant or use http.CanonicalHeaderKey", s) + return true + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Nodes([]ast.Node{(*ast.AssignStmt)(nil), (*ast.IndexExpr)(nil)}, fn) + return nil, nil +} + +func CheckBenchmarkN(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + assign := node.(*ast.AssignStmt) + if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 { + return + } + sel, ok := assign.Lhs[0].(*ast.SelectorExpr) + if !ok { + return + } + if sel.Sel.Name != "N" { + return + } + if !IsOfType(pass, sel.X, "*testing.B") { + return + } + ReportNodef(pass, assign, "should not assign to %s", Render(pass, sel)) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn) + return nil, nil +} + +func CheckUnreadVariableValues(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + if IsExample(ssafn) { + continue + } + node := ssafn.Syntax() + if node == nil { + continue + } + if gen, ok := Generator(pass, node.Pos()); ok && gen == facts.Goyacc { + // Don't flag unused values in code generated by goyacc. + // There may be hundreds of those due to the way the state + // machine is constructed. + continue + } + + switchTags := map[ssa.Value]struct{}{} + ast.Inspect(node, func(node ast.Node) bool { + s, ok := node.(*ast.SwitchStmt) + if !ok { + return true + } + v, _ := ssafn.ValueForExpr(s.Tag) + switchTags[v] = struct{}{} + return true + }) + + hasUse := func(v ssa.Value) bool { + if _, ok := switchTags[v]; ok { + return true + } + refs := v.Referrers() + if refs == nil { + // TODO investigate why refs can be nil + return true + } + return len(FilterDebug(*refs)) > 0 + } + + ast.Inspect(node, func(node ast.Node) bool { + assign, ok := node.(*ast.AssignStmt) + if !ok { + return true + } + if len(assign.Lhs) > 1 && len(assign.Rhs) == 1 { + // Either a function call with multiple return values, + // or a comma-ok assignment + + val, _ := ssafn.ValueForExpr(assign.Rhs[0]) + if val == nil { + return true + } + refs := val.Referrers() + if refs == nil { + return true + } + for _, ref := range *refs { + ex, ok := ref.(*ssa.Extract) + if !ok { + continue + } + if !hasUse(ex) { + lhs := assign.Lhs[ex.Index] + if ident, ok := lhs.(*ast.Ident); !ok || ok && ident.Name == "_" { + continue + } + ReportNodef(pass, lhs, "this value of %s is never used", lhs) + } + } + return true + } + for i, lhs := range assign.Lhs { + rhs := assign.Rhs[i] + if ident, ok := lhs.(*ast.Ident); !ok || ok && ident.Name == "_" { + continue + } + val, _ := ssafn.ValueForExpr(rhs) + if val == nil { + continue + } + + if !hasUse(val) { + ReportNodef(pass, lhs, "this value of %s is never used", lhs) + } + } + return true + }) + } + return nil, nil +} + +func CheckPredeterminedBooleanExprs(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, block := range ssafn.Blocks { + for _, ins := range block.Instrs { + ssabinop, ok := ins.(*ssa.BinOp) + if !ok { + continue + } + switch ssabinop.Op { + case token.GTR, token.LSS, token.EQL, token.NEQ, token.LEQ, token.GEQ: + default: + continue + } + + xs, ok1 := consts(ssabinop.X, nil, nil) + ys, ok2 := consts(ssabinop.Y, nil, nil) + if !ok1 || !ok2 || len(xs) == 0 || len(ys) == 0 { + continue + } + + trues := 0 + for _, x := range xs { + for _, y := range ys { + if x.Value == nil { + if y.Value == nil { + trues++ + } + continue + } + if constant.Compare(x.Value, ssabinop.Op, y.Value) { + trues++ + } + } + } + b := trues != 0 + if trues == 0 || trues == len(xs)*len(ys) { + pass.Reportf(ssabinop.Pos(), "binary expression is always %t for all possible values (%s %s %s)", + b, xs, ssabinop.Op, ys) + } + } + } + } + return nil, nil +} + +func CheckNilMaps(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, block := range ssafn.Blocks { + for _, ins := range block.Instrs { + mu, ok := ins.(*ssa.MapUpdate) + if !ok { + continue + } + c, ok := mu.Map.(*ssa.Const) + if !ok { + continue + } + if c.Value != nil { + continue + } + pass.Reportf(mu.Pos(), "assignment to nil map") + } + } + } + return nil, nil +} + +func CheckExtremeComparison(pass *analysis.Pass) (interface{}, error) { + isobj := func(expr ast.Expr, name string) bool { + sel, ok := expr.(*ast.SelectorExpr) + if !ok { + return false + } + return IsObject(pass.TypesInfo.ObjectOf(sel.Sel), name) + } + + fn := func(node ast.Node) { + expr := node.(*ast.BinaryExpr) + tx := pass.TypesInfo.TypeOf(expr.X) + basic, ok := tx.Underlying().(*types.Basic) + if !ok { + return + } + + var max string + var min string + + switch basic.Kind() { + case types.Uint8: + max = "math.MaxUint8" + case types.Uint16: + max = "math.MaxUint16" + case types.Uint32: + max = "math.MaxUint32" + case types.Uint64: + max = "math.MaxUint64" + case types.Uint: + max = "math.MaxUint64" + + case types.Int8: + min = "math.MinInt8" + max = "math.MaxInt8" + case types.Int16: + min = "math.MinInt16" + max = "math.MaxInt16" + case types.Int32: + min = "math.MinInt32" + max = "math.MaxInt32" + case types.Int64: + min = "math.MinInt64" + max = "math.MaxInt64" + case types.Int: + min = "math.MinInt64" + max = "math.MaxInt64" + } + + if (expr.Op == token.GTR || expr.Op == token.GEQ) && isobj(expr.Y, max) || + (expr.Op == token.LSS || expr.Op == token.LEQ) && isobj(expr.X, max) { + ReportNodef(pass, expr, "no value of type %s is greater than %s", basic, max) + } + if expr.Op == token.LEQ && isobj(expr.Y, max) || + expr.Op == token.GEQ && isobj(expr.X, max) { + ReportNodef(pass, expr, "every value of type %s is <= %s", basic, max) + } + + if (basic.Info() & types.IsUnsigned) != 0 { + if (expr.Op == token.LSS || expr.Op == token.LEQ) && IsIntLiteral(expr.Y, "0") || + (expr.Op == token.GTR || expr.Op == token.GEQ) && IsIntLiteral(expr.X, "0") { + ReportNodef(pass, expr, "no value of type %s is less than 0", basic) + } + if expr.Op == token.GEQ && IsIntLiteral(expr.Y, "0") || + expr.Op == token.LEQ && IsIntLiteral(expr.X, "0") { + ReportNodef(pass, expr, "every value of type %s is >= 0", basic) + } + } else { + if (expr.Op == token.LSS || expr.Op == token.LEQ) && isobj(expr.Y, min) || + (expr.Op == token.GTR || expr.Op == token.GEQ) && isobj(expr.X, min) { + ReportNodef(pass, expr, "no value of type %s is less than %s", basic, min) + } + if expr.Op == token.GEQ && isobj(expr.Y, min) || + expr.Op == token.LEQ && isobj(expr.X, min) { + ReportNodef(pass, expr, "every value of type %s is >= %s", basic, min) + } + } + + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) + return nil, nil +} + +func consts(val ssa.Value, out []*ssa.Const, visitedPhis map[string]bool) ([]*ssa.Const, bool) { + if visitedPhis == nil { + visitedPhis = map[string]bool{} + } + var ok bool + switch val := val.(type) { + case *ssa.Phi: + if visitedPhis[val.Name()] { + break + } + visitedPhis[val.Name()] = true + vals := val.Operands(nil) + for _, phival := range vals { + out, ok = consts(*phival, out, visitedPhis) + if !ok { + return nil, false + } + } + case *ssa.Const: + out = append(out, val) + case *ssa.Convert: + out, ok = consts(val.X, out, visitedPhis) + if !ok { + return nil, false + } + default: + return nil, false + } + if len(out) < 2 { + return out, true + } + uniq := []*ssa.Const{out[0]} + for _, val := range out[1:] { + if val.Value == uniq[len(uniq)-1].Value { + continue + } + uniq = append(uniq, val) + } + return uniq, true +} + +func CheckLoopCondition(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + fn := func(node ast.Node) bool { + loop, ok := node.(*ast.ForStmt) + if !ok { + return true + } + if loop.Init == nil || loop.Cond == nil || loop.Post == nil { + return true + } + init, ok := loop.Init.(*ast.AssignStmt) + if !ok || len(init.Lhs) != 1 || len(init.Rhs) != 1 { + return true + } + cond, ok := loop.Cond.(*ast.BinaryExpr) + if !ok { + return true + } + x, ok := cond.X.(*ast.Ident) + if !ok { + return true + } + lhs, ok := init.Lhs[0].(*ast.Ident) + if !ok { + return true + } + if x.Obj != lhs.Obj { + return true + } + if _, ok := loop.Post.(*ast.IncDecStmt); !ok { + return true + } + + v, isAddr := ssafn.ValueForExpr(cond.X) + if v == nil || isAddr { + return true + } + switch v := v.(type) { + case *ssa.Phi: + ops := v.Operands(nil) + if len(ops) != 2 { + return true + } + _, ok := (*ops[0]).(*ssa.Const) + if !ok { + return true + } + sigma, ok := (*ops[1]).(*ssa.Sigma) + if !ok { + return true + } + if sigma.X != v { + return true + } + case *ssa.UnOp: + return true + } + ReportNodef(pass, cond, "variable in loop condition never changes") + + return true + } + Inspect(ssafn.Syntax(), fn) + } + return nil, nil +} + +func CheckArgOverwritten(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + fn := func(node ast.Node) bool { + var typ *ast.FuncType + var body *ast.BlockStmt + switch fn := node.(type) { + case *ast.FuncDecl: + typ = fn.Type + body = fn.Body + case *ast.FuncLit: + typ = fn.Type + body = fn.Body + } + if body == nil { + return true + } + if len(typ.Params.List) == 0 { + return true + } + for _, field := range typ.Params.List { + for _, arg := range field.Names { + obj := pass.TypesInfo.ObjectOf(arg) + var ssaobj *ssa.Parameter + for _, param := range ssafn.Params { + if param.Object() == obj { + ssaobj = param + break + } + } + if ssaobj == nil { + continue + } + refs := ssaobj.Referrers() + if refs == nil { + continue + } + if len(FilterDebug(*refs)) != 0 { + continue + } + + assigned := false + ast.Inspect(body, func(node ast.Node) bool { + assign, ok := node.(*ast.AssignStmt) + if !ok { + return true + } + for _, lhs := range assign.Lhs { + ident, ok := lhs.(*ast.Ident) + if !ok { + continue + } + if pass.TypesInfo.ObjectOf(ident) == obj { + assigned = true + return false + } + } + return true + }) + if assigned { + ReportNodef(pass, arg, "argument %s is overwritten before first use", arg) + } + } + } + return true + } + Inspect(ssafn.Syntax(), fn) + } + return nil, nil +} + +func CheckIneffectiveLoop(pass *analysis.Pass) (interface{}, error) { + // This check detects some, but not all unconditional loop exits. + // We give up in the following cases: + // + // - a goto anywhere in the loop. The goto might skip over our + // return, and we don't check that it doesn't. + // + // - any nested, unlabelled continue, even if it is in another + // loop or closure. + fn := func(node ast.Node) { + var body *ast.BlockStmt + switch fn := node.(type) { + case *ast.FuncDecl: + body = fn.Body + case *ast.FuncLit: + body = fn.Body + default: + panic(fmt.Sprintf("unreachable: %T", node)) + } + if body == nil { + return + } + labels := map[*ast.Object]ast.Stmt{} + ast.Inspect(body, func(node ast.Node) bool { + label, ok := node.(*ast.LabeledStmt) + if !ok { + return true + } + labels[label.Label.Obj] = label.Stmt + return true + }) + + ast.Inspect(body, func(node ast.Node) bool { + var loop ast.Node + var body *ast.BlockStmt + switch node := node.(type) { + case *ast.ForStmt: + body = node.Body + loop = node + case *ast.RangeStmt: + typ := pass.TypesInfo.TypeOf(node.X) + if _, ok := typ.Underlying().(*types.Map); ok { + // looping once over a map is a valid pattern for + // getting an arbitrary element. + return true + } + body = node.Body + loop = node + default: + return true + } + if len(body.List) < 2 { + // avoid flagging the somewhat common pattern of using + // a range loop to get the first element in a slice, + // or the first rune in a string. + return true + } + var unconditionalExit ast.Node + hasBranching := false + for _, stmt := range body.List { + switch stmt := stmt.(type) { + case *ast.BranchStmt: + switch stmt.Tok { + case token.BREAK: + if stmt.Label == nil || labels[stmt.Label.Obj] == loop { + unconditionalExit = stmt + } + case token.CONTINUE: + if stmt.Label == nil || labels[stmt.Label.Obj] == loop { + unconditionalExit = nil + return false + } + } + case *ast.ReturnStmt: + unconditionalExit = stmt + case *ast.IfStmt, *ast.ForStmt, *ast.RangeStmt, *ast.SwitchStmt, *ast.SelectStmt: + hasBranching = true + } + } + if unconditionalExit == nil || !hasBranching { + return false + } + ast.Inspect(body, func(node ast.Node) bool { + if branch, ok := node.(*ast.BranchStmt); ok { + + switch branch.Tok { + case token.GOTO: + unconditionalExit = nil + return false + case token.CONTINUE: + if branch.Label != nil && labels[branch.Label.Obj] != loop { + return true + } + unconditionalExit = nil + return false + } + } + return true + }) + if unconditionalExit != nil { + ReportNodef(pass, unconditionalExit, "the surrounding loop is unconditionally terminated") + } + return true + }) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.FuncDecl)(nil), (*ast.FuncLit)(nil)}, fn) + return nil, nil +} + +func CheckNilContext(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + if len(call.Args) == 0 { + return + } + if typ, ok := pass.TypesInfo.TypeOf(call.Args[0]).(*types.Basic); !ok || typ.Kind() != types.UntypedNil { + return + } + sig, ok := pass.TypesInfo.TypeOf(call.Fun).(*types.Signature) + if !ok { + return + } + if sig.Params().Len() == 0 { + return + } + if !IsType(sig.Params().At(0).Type(), "context.Context") { + return + } + ReportNodef(pass, call.Args[0], + "do not pass a nil Context, even if a function permits it; pass context.TODO if you are unsure about which Context to use") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func CheckSeeker(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + sel, ok := call.Fun.(*ast.SelectorExpr) + if !ok { + return + } + if sel.Sel.Name != "Seek" { + return + } + if len(call.Args) != 2 { + return + } + arg0, ok := call.Args[Arg("(io.Seeker).Seek.offset")].(*ast.SelectorExpr) + if !ok { + return + } + switch arg0.Sel.Name { + case "SeekStart", "SeekCurrent", "SeekEnd": + default: + return + } + pkg, ok := arg0.X.(*ast.Ident) + if !ok { + return + } + if pkg.Name != "io" { + return + } + ReportNodef(pass, call, "the first argument of io.Seeker is the offset, but an io.Seek* constant is being used instead") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func CheckIneffectiveAppend(pass *analysis.Pass) (interface{}, error) { + isAppend := func(ins ssa.Value) bool { + call, ok := ins.(*ssa.Call) + if !ok { + return false + } + if call.Call.IsInvoke() { + return false + } + if builtin, ok := call.Call.Value.(*ssa.Builtin); !ok || builtin.Name() != "append" { + return false + } + return true + } + + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, block := range ssafn.Blocks { + for _, ins := range block.Instrs { + val, ok := ins.(ssa.Value) + if !ok || !isAppend(val) { + continue + } + + isUsed := false + visited := map[ssa.Instruction]bool{} + var walkRefs func(refs []ssa.Instruction) + walkRefs = func(refs []ssa.Instruction) { + loop: + for _, ref := range refs { + if visited[ref] { + continue + } + visited[ref] = true + if _, ok := ref.(*ssa.DebugRef); ok { + continue + } + switch ref := ref.(type) { + case *ssa.Phi: + walkRefs(*ref.Referrers()) + case *ssa.Sigma: + walkRefs(*ref.Referrers()) + case ssa.Value: + if !isAppend(ref) { + isUsed = true + } else { + walkRefs(*ref.Referrers()) + } + case ssa.Instruction: + isUsed = true + break loop + } + } + } + refs := val.Referrers() + if refs == nil { + continue + } + walkRefs(*refs) + if !isUsed { + pass.Reportf(ins.Pos(), "this result of append is never used, except maybe in other appends") + } + } + } + } + return nil, nil +} + +func CheckConcurrentTesting(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, block := range ssafn.Blocks { + for _, ins := range block.Instrs { + gostmt, ok := ins.(*ssa.Go) + if !ok { + continue + } + var fn *ssa.Function + switch val := gostmt.Call.Value.(type) { + case *ssa.Function: + fn = val + case *ssa.MakeClosure: + fn = val.Fn.(*ssa.Function) + default: + continue + } + if fn.Blocks == nil { + continue + } + for _, block := range fn.Blocks { + for _, ins := range block.Instrs { + call, ok := ins.(*ssa.Call) + if !ok { + continue + } + if call.Call.IsInvoke() { + continue + } + callee := call.Call.StaticCallee() + if callee == nil { + continue + } + recv := callee.Signature.Recv() + if recv == nil { + continue + } + if !IsType(recv.Type(), "*testing.common") { + continue + } + fn, ok := call.Call.StaticCallee().Object().(*types.Func) + if !ok { + continue + } + name := fn.Name() + switch name { + case "FailNow", "Fatal", "Fatalf", "SkipNow", "Skip", "Skipf": + default: + continue + } + pass.Reportf(gostmt.Pos(), "the goroutine calls T.%s, which must be called in the same goroutine as the test", name) + } + } + } + } + } + return nil, nil +} + +func eachCall(ssafn *ssa.Function, fn func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function)) { + for _, b := range ssafn.Blocks { + for _, instr := range b.Instrs { + if site, ok := instr.(ssa.CallInstruction); ok { + if g := site.Common().StaticCallee(); g != nil { + fn(ssafn, site, g) + } + } + } + } +} + +func CheckCyclicFinalizer(pass *analysis.Pass) (interface{}, error) { + fn := func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function) { + if callee.RelString(nil) != "runtime.SetFinalizer" { + return + } + arg0 := site.Common().Args[Arg("runtime.SetFinalizer.obj")] + if iface, ok := arg0.(*ssa.MakeInterface); ok { + arg0 = iface.X + } + unop, ok := arg0.(*ssa.UnOp) + if !ok { + return + } + v, ok := unop.X.(*ssa.Alloc) + if !ok { + return + } + arg1 := site.Common().Args[Arg("runtime.SetFinalizer.finalizer")] + if iface, ok := arg1.(*ssa.MakeInterface); ok { + arg1 = iface.X + } + mc, ok := arg1.(*ssa.MakeClosure) + if !ok { + return + } + for _, b := range mc.Bindings { + if b == v { + pos := lint.DisplayPosition(pass.Fset, mc.Fn.Pos()) + pass.Reportf(site.Pos(), "the finalizer closes over the object, preventing the finalizer from ever running (at %s)", pos) + } + } + } + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + eachCall(ssafn, fn) + } + return nil, nil +} + +/* +func CheckSliceOutOfBounds(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, block := range ssafn.Blocks { + for _, ins := range block.Instrs { + ia, ok := ins.(*ssa.IndexAddr) + if !ok { + continue + } + if _, ok := ia.X.Type().Underlying().(*types.Slice); !ok { + continue + } + sr, ok1 := c.funcDescs.Get(ssafn).Ranges[ia.X].(vrp.SliceInterval) + idxr, ok2 := c.funcDescs.Get(ssafn).Ranges[ia.Index].(vrp.IntInterval) + if !ok1 || !ok2 || !sr.IsKnown() || !idxr.IsKnown() || sr.Length.Empty() || idxr.Empty() { + continue + } + if idxr.Lower.Cmp(sr.Length.Upper) >= 0 { + ReportNodef(pass, ia, "index out of bounds") + } + } + } + } + return nil, nil +} +*/ + +func CheckDeferLock(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, block := range ssafn.Blocks { + instrs := FilterDebug(block.Instrs) + if len(instrs) < 2 { + continue + } + for i, ins := range instrs[:len(instrs)-1] { + call, ok := ins.(*ssa.Call) + if !ok { + continue + } + if !IsCallTo(call.Common(), "(*sync.Mutex).Lock") && !IsCallTo(call.Common(), "(*sync.RWMutex).RLock") { + continue + } + nins, ok := instrs[i+1].(*ssa.Defer) + if !ok { + continue + } + if !IsCallTo(&nins.Call, "(*sync.Mutex).Lock") && !IsCallTo(&nins.Call, "(*sync.RWMutex).RLock") { + continue + } + if call.Common().Args[0] != nins.Call.Args[0] { + continue + } + name := shortCallName(call.Common()) + alt := "" + switch name { + case "Lock": + alt = "Unlock" + case "RLock": + alt = "RUnlock" + } + pass.Reportf(nins.Pos(), "deferring %s right after having locked already; did you mean to defer %s?", name, alt) + } + } + } + return nil, nil +} + +func CheckNaNComparison(pass *analysis.Pass) (interface{}, error) { + isNaN := func(v ssa.Value) bool { + call, ok := v.(*ssa.Call) + if !ok { + return false + } + return IsCallTo(call.Common(), "math.NaN") + } + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, block := range ssafn.Blocks { + for _, ins := range block.Instrs { + ins, ok := ins.(*ssa.BinOp) + if !ok { + continue + } + if isNaN(ins.X) || isNaN(ins.Y) { + pass.Reportf(ins.Pos(), "no value is equal to NaN, not even NaN itself") + } + } + } + } + return nil, nil +} + +func CheckInfiniteRecursion(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + eachCall(ssafn, func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function) { + if callee != ssafn { + return + } + if _, ok := site.(*ssa.Go); ok { + // Recursively spawning goroutines doesn't consume + // stack space infinitely, so don't flag it. + return + } + + block := site.Block() + canReturn := false + for _, b := range ssafn.Blocks { + if block.Dominates(b) { + continue + } + if len(b.Instrs) == 0 { + continue + } + if _, ok := b.Instrs[len(b.Instrs)-1].(*ssa.Return); ok { + canReturn = true + break + } + } + if canReturn { + return + } + pass.Reportf(site.Pos(), "infinite recursive call") + }) + } + return nil, nil +} + +func objectName(obj types.Object) string { + if obj == nil { + return "" + } + var name string + if obj.Pkg() != nil && obj.Pkg().Scope().Lookup(obj.Name()) == obj { + s := obj.Pkg().Path() + if s != "" { + name += s + "." + } + } + name += obj.Name() + return name +} + +func isName(pass *analysis.Pass, expr ast.Expr, name string) bool { + var obj types.Object + switch expr := expr.(type) { + case *ast.Ident: + obj = pass.TypesInfo.ObjectOf(expr) + case *ast.SelectorExpr: + obj = pass.TypesInfo.ObjectOf(expr.Sel) + } + return objectName(obj) == name +} + +func CheckLeakyTimeTick(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + if IsInMain(pass, ssafn) || IsInTest(pass, ssafn) { + continue + } + for _, block := range ssafn.Blocks { + for _, ins := range block.Instrs { + call, ok := ins.(*ssa.Call) + if !ok || !IsCallTo(call.Common(), "time.Tick") { + continue + } + if !functions.Terminates(call.Parent()) { + continue + } + pass.Reportf(call.Pos(), "using time.Tick leaks the underlying ticker, consider using it only in endless functions, tests and the main package, and use time.NewTicker here") + } + } + } + return nil, nil +} + +func CheckDoubleNegation(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + unary1 := node.(*ast.UnaryExpr) + unary2, ok := unary1.X.(*ast.UnaryExpr) + if !ok { + return + } + if unary1.Op != token.NOT || unary2.Op != token.NOT { + return + } + ReportNodef(pass, unary1, "negating a boolean twice has no effect; is this a typo?") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.UnaryExpr)(nil)}, fn) + return nil, nil +} + +func hasSideEffects(node ast.Node) bool { + dynamic := false + ast.Inspect(node, func(node ast.Node) bool { + switch node := node.(type) { + case *ast.CallExpr: + dynamic = true + return false + case *ast.UnaryExpr: + if node.Op == token.ARROW { + dynamic = true + return false + } + } + return true + }) + return dynamic +} + +func CheckRepeatedIfElse(pass *analysis.Pass) (interface{}, error) { + seen := map[ast.Node]bool{} + + var collectConds func(ifstmt *ast.IfStmt, inits []ast.Stmt, conds []ast.Expr) ([]ast.Stmt, []ast.Expr) + collectConds = func(ifstmt *ast.IfStmt, inits []ast.Stmt, conds []ast.Expr) ([]ast.Stmt, []ast.Expr) { + seen[ifstmt] = true + if ifstmt.Init != nil { + inits = append(inits, ifstmt.Init) + } + conds = append(conds, ifstmt.Cond) + if elsestmt, ok := ifstmt.Else.(*ast.IfStmt); ok { + return collectConds(elsestmt, inits, conds) + } + return inits, conds + } + fn := func(node ast.Node) { + ifstmt := node.(*ast.IfStmt) + if seen[ifstmt] { + return + } + inits, conds := collectConds(ifstmt, nil, nil) + if len(inits) > 0 { + return + } + for _, cond := range conds { + if hasSideEffects(cond) { + return + } + } + counts := map[string]int{} + for _, cond := range conds { + s := Render(pass, cond) + counts[s]++ + if counts[s] == 2 { + ReportNodef(pass, cond, "this condition occurs multiple times in this if/else if chain") + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn) + return nil, nil +} + +func CheckSillyBitwiseOps(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, block := range ssafn.Blocks { + for _, ins := range block.Instrs { + ins, ok := ins.(*ssa.BinOp) + if !ok { + continue + } + + if c, ok := ins.Y.(*ssa.Const); !ok || c.Value == nil || c.Value.Kind() != constant.Int || c.Uint64() != 0 { + continue + } + switch ins.Op { + case token.AND, token.OR, token.XOR: + default: + // we do not flag shifts because too often, x<<0 is part + // of a pattern, x<<0, x<<8, x<<16, ... + continue + } + path, _ := astutil.PathEnclosingInterval(File(pass, ins), ins.Pos(), ins.Pos()) + if len(path) == 0 { + continue + } + if node, ok := path[0].(*ast.BinaryExpr); !ok || !IsZero(node.Y) { + continue + } + + switch ins.Op { + case token.AND: + pass.Reportf(ins.Pos(), "x & 0 always equals 0") + case token.OR, token.XOR: + pass.Reportf(ins.Pos(), "x %s 0 always equals x", ins.Op) + } + } + } + } + return nil, nil +} + +func CheckNonOctalFileMode(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + call := node.(*ast.CallExpr) + sig, ok := pass.TypesInfo.TypeOf(call.Fun).(*types.Signature) + if !ok { + return + } + n := sig.Params().Len() + var args []int + for i := 0; i < n; i++ { + typ := sig.Params().At(i).Type() + if IsType(typ, "os.FileMode") { + args = append(args, i) + } + } + for _, i := range args { + lit, ok := call.Args[i].(*ast.BasicLit) + if !ok { + continue + } + if len(lit.Value) == 3 && + lit.Value[0] != '0' && + lit.Value[0] >= '0' && lit.Value[0] <= '7' && + lit.Value[1] >= '0' && lit.Value[1] <= '7' && + lit.Value[2] >= '0' && lit.Value[2] <= '7' { + + v, err := strconv.ParseInt(lit.Value, 10, 64) + if err != nil { + continue + } + ReportNodef(pass, call.Args[i], "file mode '%s' evaluates to %#o; did you mean '0%s'?", lit.Value, v, lit.Value) + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func CheckPureFunctions(pass *analysis.Pass) (interface{}, error) { + pure := pass.ResultOf[facts.Purity].(facts.PurityResult) + +fnLoop: + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + if IsInTest(pass, ssafn) { + params := ssafn.Signature.Params() + for i := 0; i < params.Len(); i++ { + param := params.At(i) + if IsType(param.Type(), "*testing.B") { + // Ignore discarded pure functions in code related + // to benchmarks. Instead of matching BenchmarkFoo + // functions, we match any function accepting a + // *testing.B. Benchmarks sometimes call generic + // functions for doing the actual work, and + // checking for the parameter is a lot easier and + // faster than analyzing call trees. + continue fnLoop + } + } + } + + for _, b := range ssafn.Blocks { + for _, ins := range b.Instrs { + ins, ok := ins.(*ssa.Call) + if !ok { + continue + } + refs := ins.Referrers() + if refs == nil || len(FilterDebug(*refs)) > 0 { + continue + } + callee := ins.Common().StaticCallee() + if callee == nil { + continue + } + if callee.Object() == nil { + // TODO(dh): support anonymous functions + continue + } + if _, ok := pure[callee.Object().(*types.Func)]; ok { + pass.Reportf(ins.Pos(), "%s is a pure function but its return value is ignored", callee.Name()) + continue + } + } + } + } + return nil, nil +} + +func CheckDeprecated(pass *analysis.Pass) (interface{}, error) { + deprs := pass.ResultOf[facts.Deprecated].(facts.DeprecatedResult) + + // Selectors can appear outside of function literals, e.g. when + // declaring package level variables. + + var tfn types.Object + stack := 0 + fn := func(node ast.Node, push bool) bool { + if !push { + stack-- + return false + } + stack++ + if stack == 1 { + tfn = nil + } + if fn, ok := node.(*ast.FuncDecl); ok { + tfn = pass.TypesInfo.ObjectOf(fn.Name) + } + sel, ok := node.(*ast.SelectorExpr) + if !ok { + return true + } + + obj := pass.TypesInfo.ObjectOf(sel.Sel) + if obj.Pkg() == nil { + return true + } + if pass.Pkg == obj.Pkg() || obj.Pkg().Path()+"_test" == pass.Pkg.Path() { + // Don't flag stuff in our own package + return true + } + if depr, ok := deprs.Objects[obj]; ok { + // Look for the first available alternative, not the first + // version something was deprecated in. If a function was + // deprecated in Go 1.6, an alternative has been available + // already in 1.0, and we're targeting 1.2, it still + // makes sense to use the alternative from 1.0, to be + // future-proof. + minVersion := deprecated.Stdlib[SelectorName(pass, sel)].AlternativeAvailableSince + if !IsGoVersion(pass, minVersion) { + return true + } + + if tfn != nil { + if _, ok := deprs.Objects[tfn]; ok { + // functions that are deprecated may use deprecated + // symbols + return true + } + } + ReportNodef(pass, sel, "%s is deprecated: %s", Render(pass, sel), depr.Msg) + return true + } + return true + } + + imps := map[string]*types.Package{} + for _, imp := range pass.Pkg.Imports() { + imps[imp.Path()] = imp + } + fn2 := func(node ast.Node) { + spec := node.(*ast.ImportSpec) + p := spec.Path.Value + path := p[1 : len(p)-1] + imp := imps[path] + if depr, ok := deprs.Packages[imp]; ok { + ReportNodef(pass, spec, "Package %s is deprecated: %s", path, depr.Msg) + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Nodes(nil, fn) + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ImportSpec)(nil)}, fn2) + return nil, nil +} + +func callChecker(rules map[string]CallCheck) func(pass *analysis.Pass) (interface{}, error) { + return func(pass *analysis.Pass) (interface{}, error) { + return checkCalls(pass, rules) + } +} + +func checkCalls(pass *analysis.Pass, rules map[string]CallCheck) (interface{}, error) { + ranges := pass.ResultOf[valueRangesAnalyzer].(map[*ssa.Function]vrp.Ranges) + fn := func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function) { + obj, ok := callee.Object().(*types.Func) + if !ok { + return + } + + r, ok := rules[lint.FuncName(obj)] + if !ok { + return + } + var args []*Argument + ssaargs := site.Common().Args + if callee.Signature.Recv() != nil { + ssaargs = ssaargs[1:] + } + for _, arg := range ssaargs { + if iarg, ok := arg.(*ssa.MakeInterface); ok { + arg = iarg.X + } + vr := ranges[site.Parent()][arg] + args = append(args, &Argument{Value: Value{arg, vr}}) + } + call := &Call{ + Pass: pass, + Instr: site, + Args: args, + Parent: site.Parent(), + } + r(call) + for idx, arg := range call.Args { + _ = idx + for _, e := range arg.invalids { + // path, _ := astutil.PathEnclosingInterval(f.File, edge.Site.Pos(), edge.Site.Pos()) + // if len(path) < 2 { + // continue + // } + // astcall, ok := path[0].(*ast.CallExpr) + // if !ok { + // continue + // } + // pass.Reportf(astcall.Args[idx], "%s", e) + + pass.Reportf(site.Pos(), "%s", e) + } + } + for _, e := range call.invalids { + pass.Reportf(call.Instr.Common().Pos(), "%s", e) + } + } + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + eachCall(ssafn, fn) + } + return nil, nil +} + +func shortCallName(call *ssa.CallCommon) string { + if call.IsInvoke() { + return "" + } + switch v := call.Value.(type) { + case *ssa.Function: + fn, ok := v.Object().(*types.Func) + if !ok { + return "" + } + return fn.Name() + case *ssa.Builtin: + return v.Name() + } + return "" +} + +func CheckWriterBufferModified(pass *analysis.Pass) (interface{}, error) { + // TODO(dh): this might be a good candidate for taint analysis. + // Taint the argument as MUST_NOT_MODIFY, then propagate that + // through functions like bytes.Split + + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + sig := ssafn.Signature + if ssafn.Name() != "Write" || sig.Recv() == nil || sig.Params().Len() != 1 || sig.Results().Len() != 2 { + continue + } + tArg, ok := sig.Params().At(0).Type().(*types.Slice) + if !ok { + continue + } + if basic, ok := tArg.Elem().(*types.Basic); !ok || basic.Kind() != types.Byte { + continue + } + if basic, ok := sig.Results().At(0).Type().(*types.Basic); !ok || basic.Kind() != types.Int { + continue + } + if named, ok := sig.Results().At(1).Type().(*types.Named); !ok || !IsType(named, "error") { + continue + } + + for _, block := range ssafn.Blocks { + for _, ins := range block.Instrs { + switch ins := ins.(type) { + case *ssa.Store: + addr, ok := ins.Addr.(*ssa.IndexAddr) + if !ok { + continue + } + if addr.X != ssafn.Params[1] { + continue + } + pass.Reportf(ins.Pos(), "io.Writer.Write must not modify the provided buffer, not even temporarily") + case *ssa.Call: + if !IsCallTo(ins.Common(), "append") { + continue + } + if ins.Common().Args[0] != ssafn.Params[1] { + continue + } + pass.Reportf(ins.Pos(), "io.Writer.Write must not modify the provided buffer, not even temporarily") + } + } + } + } + return nil, nil +} + +func loopedRegexp(name string) CallCheck { + return func(call *Call) { + if len(extractConsts(call.Args[0].Value.Value)) == 0 { + return + } + if !isInLoop(call.Instr.Block()) { + return + } + call.Invalid(fmt.Sprintf("calling %s in a loop has poor performance, consider using regexp.Compile", name)) + } +} + +func CheckEmptyBranch(pass *analysis.Pass) (interface{}, error) { + for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + if ssafn.Syntax() == nil { + continue + } + if IsExample(ssafn) { + continue + } + fn := func(node ast.Node) bool { + ifstmt, ok := node.(*ast.IfStmt) + if !ok { + return true + } + if ifstmt.Else != nil { + b, ok := ifstmt.Else.(*ast.BlockStmt) + if !ok || len(b.List) != 0 { + return true + } + ReportfFG(pass, ifstmt.Else.Pos(), "empty branch") + } + if len(ifstmt.Body.List) != 0 { + return true + } + ReportfFG(pass, ifstmt.Pos(), "empty branch") + return true + } + Inspect(ssafn.Syntax(), fn) + } + return nil, nil +} + +func CheckMapBytesKey(pass *analysis.Pass) (interface{}, error) { + for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, b := range fn.Blocks { + insLoop: + for _, ins := range b.Instrs { + // find []byte -> string conversions + conv, ok := ins.(*ssa.Convert) + if !ok || conv.Type() != types.Universe.Lookup("string").Type() { + continue + } + if s, ok := conv.X.Type().(*types.Slice); !ok || s.Elem() != types.Universe.Lookup("byte").Type() { + continue + } + refs := conv.Referrers() + // need at least two (DebugRef) references: the + // conversion and the *ast.Ident + if refs == nil || len(*refs) < 2 { + continue + } + ident := false + // skip first reference, that's the conversion itself + for _, ref := range (*refs)[1:] { + switch ref := ref.(type) { + case *ssa.DebugRef: + if _, ok := ref.Expr.(*ast.Ident); !ok { + // the string seems to be used somewhere + // unexpected; the default branch should + // catch this already, but be safe + continue insLoop + } else { + ident = true + } + case *ssa.Lookup: + default: + // the string is used somewhere else than a + // map lookup + continue insLoop + } + } + + // the result of the conversion wasn't assigned to an + // identifier + if !ident { + continue + } + pass.Reportf(conv.Pos(), "m[string(key)] would be more efficient than k := string(key); m[k]") + } + } + } + return nil, nil +} + +func CheckRangeStringRunes(pass *analysis.Pass) (interface{}, error) { + return sharedcheck.CheckRangeStringRunes(pass) +} + +func CheckSelfAssignment(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + assign := node.(*ast.AssignStmt) + if assign.Tok != token.ASSIGN || len(assign.Lhs) != len(assign.Rhs) { + return + } + for i, stmt := range assign.Lhs { + rlh := Render(pass, stmt) + rrh := Render(pass, assign.Rhs[i]) + if rlh == rrh { + ReportfFG(pass, assign.Pos(), "self-assignment of %s to %s", rrh, rlh) + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn) + return nil, nil +} + +func buildTagsIdentical(s1, s2 []string) bool { + if len(s1) != len(s2) { + return false + } + s1s := make([]string, len(s1)) + copy(s1s, s1) + sort.Strings(s1s) + s2s := make([]string, len(s2)) + copy(s2s, s2) + sort.Strings(s2s) + for i, s := range s1s { + if s != s2s[i] { + return false + } + } + return true +} + +func CheckDuplicateBuildConstraints(pass *analysis.Pass) (interface{}, error) { + for _, f := range pass.Files { + constraints := buildTags(f) + for i, constraint1 := range constraints { + for j, constraint2 := range constraints { + if i >= j { + continue + } + if buildTagsIdentical(constraint1, constraint2) { + ReportfFG(pass, f.Pos(), "identical build constraints %q and %q", + strings.Join(constraint1, " "), + strings.Join(constraint2, " ")) + } + } + } + } + return nil, nil +} + +func CheckSillyRegexp(pass *analysis.Pass) (interface{}, error) { + // We could use the rule checking engine for this, but the + // arguments aren't really invalid. + for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, b := range fn.Blocks { + for _, ins := range b.Instrs { + call, ok := ins.(*ssa.Call) + if !ok { + continue + } + switch CallName(call.Common()) { + case "regexp.MustCompile", "regexp.Compile", "regexp.Match", "regexp.MatchReader", "regexp.MatchString": + default: + continue + } + c, ok := call.Common().Args[0].(*ssa.Const) + if !ok { + continue + } + s := constant.StringVal(c.Value) + re, err := syntax.Parse(s, 0) + if err != nil { + continue + } + if re.Op != syntax.OpLiteral && re.Op != syntax.OpEmptyMatch { + continue + } + pass.Reportf(call.Pos(), "regular expression does not contain any meta characters") + } + } + } + return nil, nil +} + +func CheckMissingEnumTypesInDeclaration(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + decl := node.(*ast.GenDecl) + if !decl.Lparen.IsValid() { + return + } + if decl.Tok != token.CONST { + return + } + + groups := GroupSpecs(pass.Fset, decl.Specs) + groupLoop: + for _, group := range groups { + if len(group) < 2 { + continue + } + if group[0].(*ast.ValueSpec).Type == nil { + // first constant doesn't have a type + continue groupLoop + } + for i, spec := range group { + spec := spec.(*ast.ValueSpec) + if len(spec.Names) != 1 || len(spec.Values) != 1 { + continue groupLoop + } + switch v := spec.Values[0].(type) { + case *ast.BasicLit: + case *ast.UnaryExpr: + if _, ok := v.X.(*ast.BasicLit); !ok { + continue groupLoop + } + default: + // if it's not a literal it might be typed, such as + // time.Microsecond = 1000 * Nanosecond + continue groupLoop + } + if i == 0 { + continue + } + if spec.Type != nil { + continue groupLoop + } + } + ReportNodef(pass, group[0], "only the first constant in this group has an explicit type") + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.GenDecl)(nil)}, fn) + return nil, nil +} + +func CheckTimerResetReturnValue(pass *analysis.Pass) (interface{}, error) { + for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + for _, block := range fn.Blocks { + for _, ins := range block.Instrs { + call, ok := ins.(*ssa.Call) + if !ok { + continue + } + if !IsCallTo(call.Common(), "(*time.Timer).Reset") { + continue + } + refs := call.Referrers() + if refs == nil { + continue + } + for _, ref := range FilterDebug(*refs) { + ifstmt, ok := ref.(*ssa.If) + if !ok { + continue + } + + found := false + for _, succ := range ifstmt.Block().Succs { + if len(succ.Preds) != 1 { + // Merge point, not a branch in the + // syntactical sense. + + // FIXME(dh): this is broken for if + // statements a la "if x || y" + continue + } + ssautil.Walk(succ, func(b *ssa.BasicBlock) bool { + if !succ.Dominates(b) { + // We've reached the end of the branch + return false + } + for _, ins := range b.Instrs { + // TODO(dh): we should check that + // we're receiving from the channel of + // a time.Timer to further reduce + // false positives. Not a key + // priority, considering the rarity of + // Reset and the tiny likeliness of a + // false positive + if ins, ok := ins.(*ssa.UnOp); ok && ins.Op == token.ARROW && IsType(ins.X.Type(), "<-chan time.Time") { + found = true + return false + } + } + return true + }) + } + + if found { + pass.Reportf(call.Pos(), "it is not possible to use Reset's return value correctly, as there is a race condition between draining the channel and the new timer expiring") + } + } + } + } + } + return nil, nil +} + +func CheckToLowerToUpperComparison(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + binExpr := node.(*ast.BinaryExpr) + + var negative bool + switch binExpr.Op { + case token.EQL: + negative = false + case token.NEQ: + negative = true + default: + return + } + + const ( + lo = "strings.ToLower" + up = "strings.ToUpper" + ) + + var call string + if IsCallToAST(pass, binExpr.X, lo) && IsCallToAST(pass, binExpr.Y, lo) { + call = lo + } else if IsCallToAST(pass, binExpr.X, up) && IsCallToAST(pass, binExpr.Y, up) { + call = up + } else { + return + } + + bang := "" + if negative { + bang = "!" + } + + ReportNodef(pass, binExpr, "should use %sstrings.EqualFold(a, b) instead of %s(a) %s %s(b)", bang, call, binExpr.Op, call) + } + + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) + return nil, nil +} + +func CheckUnreachableTypeCases(pass *analysis.Pass) (interface{}, error) { + // Check if T subsumes V in a type switch. T subsumes V if T is an interface and T's method set is a subset of V's method set. + subsumes := func(T, V types.Type) bool { + tIface, ok := T.Underlying().(*types.Interface) + if !ok { + return false + } + + return types.Implements(V, tIface) + } + + subsumesAny := func(Ts, Vs []types.Type) (types.Type, types.Type, bool) { + for _, T := range Ts { + for _, V := range Vs { + if subsumes(T, V) { + return T, V, true + } + } + } + + return nil, nil, false + } + + fn := func(node ast.Node) { + tsStmt := node.(*ast.TypeSwitchStmt) + + type ccAndTypes struct { + cc *ast.CaseClause + types []types.Type + } + + // All asserted types in the order of case clauses. + ccs := make([]ccAndTypes, 0, len(tsStmt.Body.List)) + for _, stmt := range tsStmt.Body.List { + cc, _ := stmt.(*ast.CaseClause) + + // Exclude the 'default' case. + if len(cc.List) == 0 { + continue + } + + Ts := make([]types.Type, len(cc.List)) + for i, expr := range cc.List { + Ts[i] = pass.TypesInfo.TypeOf(expr) + } + + ccs = append(ccs, ccAndTypes{cc: cc, types: Ts}) + } + + if len(ccs) <= 1 { + // Zero or one case clauses, nothing to check. + return + } + + // Check if case clauses following cc have types that are subsumed by cc. + for i, cc := range ccs[:len(ccs)-1] { + for _, next := range ccs[i+1:] { + if T, V, yes := subsumesAny(cc.types, next.types); yes { + ReportNodef(pass, next.cc, "unreachable case clause: %s will always match before %s", T.String(), V.String()) + } + } + } + } + + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.TypeSwitchStmt)(nil)}, fn) + return nil, nil +} + +func CheckSingleArgAppend(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + if !IsCallToAST(pass, node, "append") { + return + } + call := node.(*ast.CallExpr) + if len(call.Args) != 1 { + return + } + ReportfFG(pass, call.Pos(), "x = append(y) is equivalent to x = y") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) + return nil, nil +} + +func CheckStructTags(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + for _, field := range node.(*ast.StructType).Fields.List { + if field.Tag == nil { + continue + } + tags, err := parseStructTag(field.Tag.Value[1 : len(field.Tag.Value)-1]) + if err != nil { + ReportNodef(pass, field.Tag, "unparseable struct tag: %s", err) + continue + } + for k, v := range tags { + if len(v) > 1 { + ReportNodef(pass, field.Tag, "duplicate struct tag %q", k) + continue + } + + switch k { + case "json": + checkJSONTag(pass, field, v[0]) + case "xml": + checkXMLTag(pass, field, v[0]) + } + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.StructType)(nil)}, fn) + return nil, nil +} + +func checkJSONTag(pass *analysis.Pass, field *ast.Field, tag string) { + //lint:ignore SA9003 TODO(dh): should we flag empty tags? + if len(tag) == 0 { + } + fields := strings.Split(tag, ",") + for _, r := range fields[0] { + if !unicode.IsLetter(r) && !unicode.IsDigit(r) && !strings.ContainsRune("!#$%&()*+-./:<=>?@[]^_{|}~ ", r) { + ReportNodef(pass, field.Tag, "invalid JSON field name %q", fields[0]) + } + } + var co, cs, ci int + for _, s := range fields[1:] { + switch s { + case "omitempty": + co++ + case "": + // allow stuff like "-," + case "string": + cs++ + // only for string, floating point, integer and bool + T := Dereference(pass.TypesInfo.TypeOf(field.Type).Underlying()).Underlying() + basic, ok := T.(*types.Basic) + if !ok || (basic.Info()&(types.IsBoolean|types.IsInteger|types.IsFloat|types.IsString)) == 0 { + ReportNodef(pass, field.Tag, "the JSON string option only applies to fields of type string, floating point, integer or bool, or pointers to those") + } + case "inline": + ci++ + default: + ReportNodef(pass, field.Tag, "unknown JSON option %q", s) + } + } + if co > 1 { + ReportNodef(pass, field.Tag, `duplicate JSON option "omitempty"`) + } + if cs > 1 { + ReportNodef(pass, field.Tag, `duplicate JSON option "string"`) + } + if ci > 1 { + ReportNodef(pass, field.Tag, `duplicate JSON option "inline"`) + } +} + +func checkXMLTag(pass *analysis.Pass, field *ast.Field, tag string) { + //lint:ignore SA9003 TODO(dh): should we flag empty tags? + if len(tag) == 0 { + } + fields := strings.Split(tag, ",") + counts := map[string]int{} + var exclusives []string + for _, s := range fields[1:] { + switch s { + case "attr", "chardata", "cdata", "innerxml", "comment": + counts[s]++ + if counts[s] == 1 { + exclusives = append(exclusives, s) + } + case "omitempty", "any": + counts[s]++ + case "": + default: + ReportNodef(pass, field.Tag, "unknown XML option %q", s) + } + } + for k, v := range counts { + if v > 1 { + ReportNodef(pass, field.Tag, "duplicate XML option %q", k) + } + } + if len(exclusives) > 1 { + ReportNodef(pass, field.Tag, "XML options %s are mutually exclusive", strings.Join(exclusives, " and ")) + } +} diff --git a/vendor/honnef.co/go/tools/staticcheck/rules.go b/vendor/honnef.co/go/tools/staticcheck/rules.go new file mode 100644 index 00000000..0152cac1 --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/rules.go @@ -0,0 +1,321 @@ +package staticcheck + +import ( + "fmt" + "go/constant" + "go/types" + "net" + "net/url" + "regexp" + "sort" + "strconv" + "strings" + "time" + "unicode/utf8" + + "golang.org/x/tools/go/analysis" + . "honnef.co/go/tools/lint/lintdsl" + "honnef.co/go/tools/ssa" + "honnef.co/go/tools/staticcheck/vrp" +) + +const ( + MsgInvalidHostPort = "invalid port or service name in host:port pair" + MsgInvalidUTF8 = "argument is not a valid UTF-8 encoded string" + MsgNonUniqueCutset = "cutset contains duplicate characters" +) + +type Call struct { + Pass *analysis.Pass + Instr ssa.CallInstruction + Args []*Argument + + Parent *ssa.Function + + invalids []string +} + +func (c *Call) Invalid(msg string) { + c.invalids = append(c.invalids, msg) +} + +type Argument struct { + Value Value + invalids []string +} + +func (arg *Argument) Invalid(msg string) { + arg.invalids = append(arg.invalids, msg) +} + +type Value struct { + Value ssa.Value + Range vrp.Range +} + +type CallCheck func(call *Call) + +func extractConsts(v ssa.Value) []*ssa.Const { + switch v := v.(type) { + case *ssa.Const: + return []*ssa.Const{v} + case *ssa.MakeInterface: + return extractConsts(v.X) + default: + return nil + } +} + +func ValidateRegexp(v Value) error { + for _, c := range extractConsts(v.Value) { + if c.Value == nil { + continue + } + if c.Value.Kind() != constant.String { + continue + } + s := constant.StringVal(c.Value) + if _, err := regexp.Compile(s); err != nil { + return err + } + } + return nil +} + +func ValidateTimeLayout(v Value) error { + for _, c := range extractConsts(v.Value) { + if c.Value == nil { + continue + } + if c.Value.Kind() != constant.String { + continue + } + s := constant.StringVal(c.Value) + s = strings.Replace(s, "_", " ", -1) + s = strings.Replace(s, "Z", "-", -1) + _, err := time.Parse(s, s) + if err != nil { + return err + } + } + return nil +} + +func ValidateURL(v Value) error { + for _, c := range extractConsts(v.Value) { + if c.Value == nil { + continue + } + if c.Value.Kind() != constant.String { + continue + } + s := constant.StringVal(c.Value) + _, err := url.Parse(s) + if err != nil { + return fmt.Errorf("%q is not a valid URL: %s", s, err) + } + } + return nil +} + +func IntValue(v Value, z vrp.Z) bool { + r, ok := v.Range.(vrp.IntInterval) + if !ok || !r.IsKnown() { + return false + } + if r.Lower != r.Upper { + return false + } + if r.Lower.Cmp(z) == 0 { + return true + } + return false +} + +func InvalidUTF8(v Value) bool { + for _, c := range extractConsts(v.Value) { + if c.Value == nil { + continue + } + if c.Value.Kind() != constant.String { + continue + } + s := constant.StringVal(c.Value) + if !utf8.ValidString(s) { + return true + } + } + return false +} + +func UnbufferedChannel(v Value) bool { + r, ok := v.Range.(vrp.ChannelInterval) + if !ok || !r.IsKnown() { + return false + } + if r.Size.Lower.Cmp(vrp.NewZ(0)) == 0 && + r.Size.Upper.Cmp(vrp.NewZ(0)) == 0 { + return true + } + return false +} + +func Pointer(v Value) bool { + switch v.Value.Type().Underlying().(type) { + case *types.Pointer, *types.Interface: + return true + } + return false +} + +func ConvertedFromInt(v Value) bool { + conv, ok := v.Value.(*ssa.Convert) + if !ok { + return false + } + b, ok := conv.X.Type().Underlying().(*types.Basic) + if !ok { + return false + } + if (b.Info() & types.IsInteger) == 0 { + return false + } + return true +} + +func validEncodingBinaryType(pass *analysis.Pass, typ types.Type) bool { + typ = typ.Underlying() + switch typ := typ.(type) { + case *types.Basic: + switch typ.Kind() { + case types.Uint8, types.Uint16, types.Uint32, types.Uint64, + types.Int8, types.Int16, types.Int32, types.Int64, + types.Float32, types.Float64, types.Complex64, types.Complex128, types.Invalid: + return true + case types.Bool: + return IsGoVersion(pass, 8) + } + return false + case *types.Struct: + n := typ.NumFields() + for i := 0; i < n; i++ { + if !validEncodingBinaryType(pass, typ.Field(i).Type()) { + return false + } + } + return true + case *types.Array: + return validEncodingBinaryType(pass, typ.Elem()) + case *types.Interface: + // we can't determine if it's a valid type or not + return true + } + return false +} + +func CanBinaryMarshal(pass *analysis.Pass, v Value) bool { + typ := v.Value.Type().Underlying() + if ttyp, ok := typ.(*types.Pointer); ok { + typ = ttyp.Elem().Underlying() + } + if ttyp, ok := typ.(interface { + Elem() types.Type + }); ok { + if _, ok := ttyp.(*types.Pointer); !ok { + typ = ttyp.Elem() + } + } + + return validEncodingBinaryType(pass, typ) +} + +func RepeatZeroTimes(name string, arg int) CallCheck { + return func(call *Call) { + arg := call.Args[arg] + if IntValue(arg.Value, vrp.NewZ(0)) { + arg.Invalid(fmt.Sprintf("calling %s with n == 0 will return no results, did you mean -1?", name)) + } + } +} + +func validateServiceName(s string) bool { + if len(s) < 1 || len(s) > 15 { + return false + } + if s[0] == '-' || s[len(s)-1] == '-' { + return false + } + if strings.Contains(s, "--") { + return false + } + hasLetter := false + for _, r := range s { + if (r >= 'A' && r <= 'Z') || (r >= 'a' && r <= 'z') { + hasLetter = true + continue + } + if r >= '0' && r <= '9' { + continue + } + return false + } + return hasLetter +} + +func validatePort(s string) bool { + n, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return validateServiceName(s) + } + return n >= 0 && n <= 65535 +} + +func ValidHostPort(v Value) bool { + for _, k := range extractConsts(v.Value) { + if k.Value == nil { + continue + } + if k.Value.Kind() != constant.String { + continue + } + s := constant.StringVal(k.Value) + _, port, err := net.SplitHostPort(s) + if err != nil { + return false + } + // TODO(dh): check hostname + if !validatePort(port) { + return false + } + } + return true +} + +// ConvertedFrom reports whether value v was converted from type typ. +func ConvertedFrom(v Value, typ string) bool { + change, ok := v.Value.(*ssa.ChangeType) + return ok && IsType(change.X.Type(), typ) +} + +func UniqueStringCutset(v Value) bool { + for _, c := range extractConsts(v.Value) { + if c.Value == nil { + continue + } + if c.Value.Kind() != constant.String { + continue + } + s := constant.StringVal(c.Value) + rs := runeSlice(s) + if len(rs) < 2 { + continue + } + sort.Sort(rs) + for i, r := range rs[1:] { + if rs[i] == r { + return false + } + } + } + return true +} diff --git a/vendor/honnef.co/go/tools/staticcheck/structtag.go b/vendor/honnef.co/go/tools/staticcheck/structtag.go new file mode 100644 index 00000000..38830a22 --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/structtag.go @@ -0,0 +1,58 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Copyright 2019 Dominik Honnef. All rights reserved. + +package staticcheck + +import "strconv" + +func parseStructTag(tag string) (map[string][]string, error) { + // FIXME(dh): detect missing closing quote + out := map[string][]string{} + + for tag != "" { + // Skip leading space. + i := 0 + for i < len(tag) && tag[i] == ' ' { + i++ + } + tag = tag[i:] + if tag == "" { + break + } + + // Scan to colon. A space, a quote or a control character is a syntax error. + // Strictly speaking, control chars include the range [0x7f, 0x9f], not just + // [0x00, 0x1f], but in practice, we ignore the multi-byte control characters + // as it is simpler to inspect the tag's bytes than the tag's runes. + i = 0 + for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f { + i++ + } + if i == 0 || i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' { + break + } + name := string(tag[:i]) + tag = tag[i+1:] + + // Scan quoted string to find value. + i = 1 + for i < len(tag) && tag[i] != '"' { + if tag[i] == '\\' { + i++ + } + i++ + } + if i >= len(tag) { + break + } + qvalue := string(tag[:i+1]) + tag = tag[i+1:] + + value, err := strconv.Unquote(qvalue) + if err != nil { + return nil, err + } + out[name] = append(out[name], value) + } + return out, nil +} diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/channel.go b/vendor/honnef.co/go/tools/staticcheck/vrp/channel.go new file mode 100644 index 00000000..0ef73787 --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/vrp/channel.go @@ -0,0 +1,73 @@ +package vrp + +import ( + "fmt" + + "honnef.co/go/tools/ssa" +) + +type ChannelInterval struct { + Size IntInterval +} + +func (c ChannelInterval) Union(other Range) Range { + i, ok := other.(ChannelInterval) + if !ok { + i = ChannelInterval{EmptyIntInterval} + } + if c.Size.Empty() || !c.Size.IsKnown() { + return i + } + if i.Size.Empty() || !i.Size.IsKnown() { + return c + } + return ChannelInterval{ + Size: c.Size.Union(i.Size).(IntInterval), + } +} + +func (c ChannelInterval) String() string { + return c.Size.String() +} + +func (c ChannelInterval) IsKnown() bool { + return c.Size.IsKnown() +} + +type MakeChannelConstraint struct { + aConstraint + Buffer ssa.Value +} +type ChannelChangeTypeConstraint struct { + aConstraint + X ssa.Value +} + +func NewMakeChannelConstraint(buffer, y ssa.Value) Constraint { + return &MakeChannelConstraint{NewConstraint(y), buffer} +} +func NewChannelChangeTypeConstraint(x, y ssa.Value) Constraint { + return &ChannelChangeTypeConstraint{NewConstraint(y), x} +} + +func (c *MakeChannelConstraint) Operands() []ssa.Value { return []ssa.Value{c.Buffer} } +func (c *ChannelChangeTypeConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} } + +func (c *MakeChannelConstraint) String() string { + return fmt.Sprintf("%s = make(chan, %s)", c.Y().Name(), c.Buffer.Name()) +} +func (c *ChannelChangeTypeConstraint) String() string { + return fmt.Sprintf("%s = changetype(%s)", c.Y().Name(), c.X.Name()) +} + +func (c *MakeChannelConstraint) Eval(g *Graph) Range { + i, ok := g.Range(c.Buffer).(IntInterval) + if !ok { + return ChannelInterval{NewIntInterval(NewZ(0), PInfinity)} + } + if i.Lower.Sign() == -1 { + i.Lower = NewZ(0) + } + return ChannelInterval{i} +} +func (c *ChannelChangeTypeConstraint) Eval(g *Graph) Range { return g.Range(c.X) } diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/int.go b/vendor/honnef.co/go/tools/staticcheck/vrp/int.go new file mode 100644 index 00000000..926bb7af --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/vrp/int.go @@ -0,0 +1,476 @@ +package vrp + +import ( + "fmt" + "go/token" + "go/types" + "math/big" + + "honnef.co/go/tools/ssa" +) + +type Zs []Z + +func (zs Zs) Len() int { + return len(zs) +} + +func (zs Zs) Less(i int, j int) bool { + return zs[i].Cmp(zs[j]) == -1 +} + +func (zs Zs) Swap(i int, j int) { + zs[i], zs[j] = zs[j], zs[i] +} + +type Z struct { + infinity int8 + integer *big.Int +} + +func NewZ(n int64) Z { + return NewBigZ(big.NewInt(n)) +} + +func NewBigZ(n *big.Int) Z { + return Z{integer: n} +} + +func (z1 Z) Infinite() bool { + return z1.infinity != 0 +} + +func (z1 Z) Add(z2 Z) Z { + if z2.Sign() == -1 { + return z1.Sub(z2.Negate()) + } + if z1 == NInfinity { + return NInfinity + } + if z1 == PInfinity { + return PInfinity + } + if z2 == PInfinity { + return PInfinity + } + + if !z1.Infinite() && !z2.Infinite() { + n := &big.Int{} + n.Add(z1.integer, z2.integer) + return NewBigZ(n) + } + + panic(fmt.Sprintf("%s + %s is not defined", z1, z2)) +} + +func (z1 Z) Sub(z2 Z) Z { + if z2.Sign() == -1 { + return z1.Add(z2.Negate()) + } + if !z1.Infinite() && !z2.Infinite() { + n := &big.Int{} + n.Sub(z1.integer, z2.integer) + return NewBigZ(n) + } + + if z1 != PInfinity && z2 == PInfinity { + return NInfinity + } + if z1.Infinite() && !z2.Infinite() { + return Z{infinity: z1.infinity} + } + if z1 == PInfinity && z2 == PInfinity { + return PInfinity + } + panic(fmt.Sprintf("%s - %s is not defined", z1, z2)) +} + +func (z1 Z) Mul(z2 Z) Z { + if (z1.integer != nil && z1.integer.Sign() == 0) || + (z2.integer != nil && z2.integer.Sign() == 0) { + return NewBigZ(&big.Int{}) + } + + if z1.infinity != 0 || z2.infinity != 0 { + return Z{infinity: int8(z1.Sign() * z2.Sign())} + } + + n := &big.Int{} + n.Mul(z1.integer, z2.integer) + return NewBigZ(n) +} + +func (z1 Z) Negate() Z { + if z1.infinity == 1 { + return NInfinity + } + if z1.infinity == -1 { + return PInfinity + } + n := &big.Int{} + n.Neg(z1.integer) + return NewBigZ(n) +} + +func (z1 Z) Sign() int { + if z1.infinity != 0 { + return int(z1.infinity) + } + return z1.integer.Sign() +} + +func (z1 Z) String() string { + if z1 == NInfinity { + return "-∞" + } + if z1 == PInfinity { + return "∞" + } + return fmt.Sprintf("%d", z1.integer) +} + +func (z1 Z) Cmp(z2 Z) int { + if z1.infinity == z2.infinity && z1.infinity != 0 { + return 0 + } + if z1 == PInfinity { + return 1 + } + if z1 == NInfinity { + return -1 + } + if z2 == NInfinity { + return 1 + } + if z2 == PInfinity { + return -1 + } + return z1.integer.Cmp(z2.integer) +} + +func MaxZ(zs ...Z) Z { + if len(zs) == 0 { + panic("Max called with no arguments") + } + if len(zs) == 1 { + return zs[0] + } + ret := zs[0] + for _, z := range zs[1:] { + if z.Cmp(ret) == 1 { + ret = z + } + } + return ret +} + +func MinZ(zs ...Z) Z { + if len(zs) == 0 { + panic("Min called with no arguments") + } + if len(zs) == 1 { + return zs[0] + } + ret := zs[0] + for _, z := range zs[1:] { + if z.Cmp(ret) == -1 { + ret = z + } + } + return ret +} + +var NInfinity = Z{infinity: -1} +var PInfinity = Z{infinity: 1} +var EmptyIntInterval = IntInterval{true, PInfinity, NInfinity} + +func InfinityFor(v ssa.Value) IntInterval { + if b, ok := v.Type().Underlying().(*types.Basic); ok { + if (b.Info() & types.IsUnsigned) != 0 { + return NewIntInterval(NewZ(0), PInfinity) + } + } + return NewIntInterval(NInfinity, PInfinity) +} + +type IntInterval struct { + known bool + Lower Z + Upper Z +} + +func NewIntInterval(l, u Z) IntInterval { + if u.Cmp(l) == -1 { + return EmptyIntInterval + } + return IntInterval{known: true, Lower: l, Upper: u} +} + +func (i IntInterval) IsKnown() bool { + return i.known +} + +func (i IntInterval) Empty() bool { + return i.Lower == PInfinity && i.Upper == NInfinity +} + +func (i IntInterval) IsMaxRange() bool { + return i.Lower == NInfinity && i.Upper == PInfinity +} + +func (i1 IntInterval) Intersection(i2 IntInterval) IntInterval { + if !i1.IsKnown() { + return i2 + } + if !i2.IsKnown() { + return i1 + } + if i1.Empty() || i2.Empty() { + return EmptyIntInterval + } + i3 := NewIntInterval(MaxZ(i1.Lower, i2.Lower), MinZ(i1.Upper, i2.Upper)) + if i3.Lower.Cmp(i3.Upper) == 1 { + return EmptyIntInterval + } + return i3 +} + +func (i1 IntInterval) Union(other Range) Range { + i2, ok := other.(IntInterval) + if !ok { + i2 = EmptyIntInterval + } + if i1.Empty() || !i1.IsKnown() { + return i2 + } + if i2.Empty() || !i2.IsKnown() { + return i1 + } + return NewIntInterval(MinZ(i1.Lower, i2.Lower), MaxZ(i1.Upper, i2.Upper)) +} + +func (i1 IntInterval) Add(i2 IntInterval) IntInterval { + if i1.Empty() || i2.Empty() { + return EmptyIntInterval + } + l1, u1, l2, u2 := i1.Lower, i1.Upper, i2.Lower, i2.Upper + return NewIntInterval(l1.Add(l2), u1.Add(u2)) +} + +func (i1 IntInterval) Sub(i2 IntInterval) IntInterval { + if i1.Empty() || i2.Empty() { + return EmptyIntInterval + } + l1, u1, l2, u2 := i1.Lower, i1.Upper, i2.Lower, i2.Upper + return NewIntInterval(l1.Sub(u2), u1.Sub(l2)) +} + +func (i1 IntInterval) Mul(i2 IntInterval) IntInterval { + if i1.Empty() || i2.Empty() { + return EmptyIntInterval + } + x1, x2 := i1.Lower, i1.Upper + y1, y2 := i2.Lower, i2.Upper + return NewIntInterval( + MinZ(x1.Mul(y1), x1.Mul(y2), x2.Mul(y1), x2.Mul(y2)), + MaxZ(x1.Mul(y1), x1.Mul(y2), x2.Mul(y1), x2.Mul(y2)), + ) +} + +func (i1 IntInterval) String() string { + if !i1.IsKnown() { + return "[⊥, ⊥]" + } + if i1.Empty() { + return "{}" + } + return fmt.Sprintf("[%s, %s]", i1.Lower, i1.Upper) +} + +type IntArithmeticConstraint struct { + aConstraint + A ssa.Value + B ssa.Value + Op token.Token + Fn func(IntInterval, IntInterval) IntInterval +} + +type IntAddConstraint struct{ *IntArithmeticConstraint } +type IntSubConstraint struct{ *IntArithmeticConstraint } +type IntMulConstraint struct{ *IntArithmeticConstraint } + +type IntConversionConstraint struct { + aConstraint + X ssa.Value +} + +type IntIntersectionConstraint struct { + aConstraint + ranges Ranges + A ssa.Value + B ssa.Value + Op token.Token + I IntInterval + resolved bool +} + +type IntIntervalConstraint struct { + aConstraint + I IntInterval +} + +func NewIntArithmeticConstraint(a, b, y ssa.Value, op token.Token, fn func(IntInterval, IntInterval) IntInterval) *IntArithmeticConstraint { + return &IntArithmeticConstraint{NewConstraint(y), a, b, op, fn} +} +func NewIntAddConstraint(a, b, y ssa.Value) Constraint { + return &IntAddConstraint{NewIntArithmeticConstraint(a, b, y, token.ADD, IntInterval.Add)} +} +func NewIntSubConstraint(a, b, y ssa.Value) Constraint { + return &IntSubConstraint{NewIntArithmeticConstraint(a, b, y, token.SUB, IntInterval.Sub)} +} +func NewIntMulConstraint(a, b, y ssa.Value) Constraint { + return &IntMulConstraint{NewIntArithmeticConstraint(a, b, y, token.MUL, IntInterval.Mul)} +} +func NewIntConversionConstraint(x, y ssa.Value) Constraint { + return &IntConversionConstraint{NewConstraint(y), x} +} +func NewIntIntersectionConstraint(a, b ssa.Value, op token.Token, ranges Ranges, y ssa.Value) Constraint { + return &IntIntersectionConstraint{ + aConstraint: NewConstraint(y), + ranges: ranges, + A: a, + B: b, + Op: op, + } +} +func NewIntIntervalConstraint(i IntInterval, y ssa.Value) Constraint { + return &IntIntervalConstraint{NewConstraint(y), i} +} + +func (c *IntArithmeticConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} } +func (c *IntConversionConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} } +func (c *IntIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.A} } +func (s *IntIntervalConstraint) Operands() []ssa.Value { return nil } + +func (c *IntArithmeticConstraint) String() string { + return fmt.Sprintf("%s = %s %s %s", c.Y().Name(), c.A.Name(), c.Op, c.B.Name()) +} +func (c *IntConversionConstraint) String() string { + return fmt.Sprintf("%s = %s(%s)", c.Y().Name(), c.Y().Type(), c.X.Name()) +} +func (c *IntIntersectionConstraint) String() string { + return fmt.Sprintf("%s = %s %s %s (%t branch)", c.Y().Name(), c.A.Name(), c.Op, c.B.Name(), c.Y().(*ssa.Sigma).Branch) +} +func (c *IntIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) } + +func (c *IntArithmeticConstraint) Eval(g *Graph) Range { + i1, i2 := g.Range(c.A).(IntInterval), g.Range(c.B).(IntInterval) + if !i1.IsKnown() || !i2.IsKnown() { + return IntInterval{} + } + return c.Fn(i1, i2) +} +func (c *IntConversionConstraint) Eval(g *Graph) Range { + s := &types.StdSizes{ + // XXX is it okay to assume the largest word size, or do we + // need to be platform specific? + WordSize: 8, + MaxAlign: 1, + } + fromI := g.Range(c.X).(IntInterval) + toI := g.Range(c.Y()).(IntInterval) + fromT := c.X.Type().Underlying().(*types.Basic) + toT := c.Y().Type().Underlying().(*types.Basic) + fromB := s.Sizeof(c.X.Type()) + toB := s.Sizeof(c.Y().Type()) + + if !fromI.IsKnown() { + return toI + } + if !toI.IsKnown() { + return fromI + } + + // uint -> sint/uint, M > N: [max(0, l1), min(2**N-1, u2)] + if (fromT.Info()&types.IsUnsigned != 0) && + toB > fromB { + + n := big.NewInt(1) + n.Lsh(n, uint(fromB*8)) + n.Sub(n, big.NewInt(1)) + return NewIntInterval( + MaxZ(NewZ(0), fromI.Lower), + MinZ(NewBigZ(n), toI.Upper), + ) + } + + // sint -> sint, M > N; [max(-∞, l1), min(2**N-1, u2)] + if (fromT.Info()&types.IsUnsigned == 0) && + (toT.Info()&types.IsUnsigned == 0) && + toB > fromB { + + n := big.NewInt(1) + n.Lsh(n, uint(fromB*8)) + n.Sub(n, big.NewInt(1)) + return NewIntInterval( + MaxZ(NInfinity, fromI.Lower), + MinZ(NewBigZ(n), toI.Upper), + ) + } + + return fromI +} +func (c *IntIntersectionConstraint) Eval(g *Graph) Range { + xi := g.Range(c.A).(IntInterval) + if !xi.IsKnown() { + return c.I + } + return xi.Intersection(c.I) +} +func (c *IntIntervalConstraint) Eval(*Graph) Range { return c.I } + +func (c *IntIntersectionConstraint) Futures() []ssa.Value { + return []ssa.Value{c.B} +} + +func (c *IntIntersectionConstraint) Resolve() { + r, ok := c.ranges[c.B].(IntInterval) + if !ok { + c.I = InfinityFor(c.Y()) + return + } + + switch c.Op { + case token.EQL: + c.I = r + case token.GTR: + c.I = NewIntInterval(r.Lower.Add(NewZ(1)), PInfinity) + case token.GEQ: + c.I = NewIntInterval(r.Lower, PInfinity) + case token.LSS: + // TODO(dh): do we need 0 instead of NInfinity for uints? + c.I = NewIntInterval(NInfinity, r.Upper.Sub(NewZ(1))) + case token.LEQ: + c.I = NewIntInterval(NInfinity, r.Upper) + case token.NEQ: + c.I = InfinityFor(c.Y()) + default: + panic("unsupported op " + c.Op.String()) + } +} + +func (c *IntIntersectionConstraint) IsKnown() bool { + return c.I.IsKnown() +} + +func (c *IntIntersectionConstraint) MarkUnresolved() { + c.resolved = false +} + +func (c *IntIntersectionConstraint) MarkResolved() { + c.resolved = true +} + +func (c *IntIntersectionConstraint) IsResolved() bool { + return c.resolved +} diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/slice.go b/vendor/honnef.co/go/tools/staticcheck/vrp/slice.go new file mode 100644 index 00000000..40658dd8 --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/vrp/slice.go @@ -0,0 +1,273 @@ +package vrp + +// TODO(dh): most of the constraints have implementations identical to +// that of strings. Consider reusing them. + +import ( + "fmt" + "go/types" + + "honnef.co/go/tools/ssa" +) + +type SliceInterval struct { + Length IntInterval +} + +func (s SliceInterval) Union(other Range) Range { + i, ok := other.(SliceInterval) + if !ok { + i = SliceInterval{EmptyIntInterval} + } + if s.Length.Empty() || !s.Length.IsKnown() { + return i + } + if i.Length.Empty() || !i.Length.IsKnown() { + return s + } + return SliceInterval{ + Length: s.Length.Union(i.Length).(IntInterval), + } +} +func (s SliceInterval) String() string { return s.Length.String() } +func (s SliceInterval) IsKnown() bool { return s.Length.IsKnown() } + +type SliceAppendConstraint struct { + aConstraint + A ssa.Value + B ssa.Value +} + +type SliceSliceConstraint struct { + aConstraint + X ssa.Value + Lower ssa.Value + Upper ssa.Value +} + +type ArraySliceConstraint struct { + aConstraint + X ssa.Value + Lower ssa.Value + Upper ssa.Value +} + +type SliceIntersectionConstraint struct { + aConstraint + X ssa.Value + I IntInterval +} + +type SliceLengthConstraint struct { + aConstraint + X ssa.Value +} + +type MakeSliceConstraint struct { + aConstraint + Size ssa.Value +} + +type SliceIntervalConstraint struct { + aConstraint + I IntInterval +} + +func NewSliceAppendConstraint(a, b, y ssa.Value) Constraint { + return &SliceAppendConstraint{NewConstraint(y), a, b} +} +func NewSliceSliceConstraint(x, lower, upper, y ssa.Value) Constraint { + return &SliceSliceConstraint{NewConstraint(y), x, lower, upper} +} +func NewArraySliceConstraint(x, lower, upper, y ssa.Value) Constraint { + return &ArraySliceConstraint{NewConstraint(y), x, lower, upper} +} +func NewSliceIntersectionConstraint(x ssa.Value, i IntInterval, y ssa.Value) Constraint { + return &SliceIntersectionConstraint{NewConstraint(y), x, i} +} +func NewSliceLengthConstraint(x, y ssa.Value) Constraint { + return &SliceLengthConstraint{NewConstraint(y), x} +} +func NewMakeSliceConstraint(size, y ssa.Value) Constraint { + return &MakeSliceConstraint{NewConstraint(y), size} +} +func NewSliceIntervalConstraint(i IntInterval, y ssa.Value) Constraint { + return &SliceIntervalConstraint{NewConstraint(y), i} +} + +func (c *SliceAppendConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} } +func (c *SliceSliceConstraint) Operands() []ssa.Value { + ops := []ssa.Value{c.X} + if c.Lower != nil { + ops = append(ops, c.Lower) + } + if c.Upper != nil { + ops = append(ops, c.Upper) + } + return ops +} +func (c *ArraySliceConstraint) Operands() []ssa.Value { + ops := []ssa.Value{c.X} + if c.Lower != nil { + ops = append(ops, c.Lower) + } + if c.Upper != nil { + ops = append(ops, c.Upper) + } + return ops +} +func (c *SliceIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} } +func (c *SliceLengthConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} } +func (c *MakeSliceConstraint) Operands() []ssa.Value { return []ssa.Value{c.Size} } +func (s *SliceIntervalConstraint) Operands() []ssa.Value { return nil } + +func (c *SliceAppendConstraint) String() string { + return fmt.Sprintf("%s = append(%s, %s)", c.Y().Name(), c.A.Name(), c.B.Name()) +} +func (c *SliceSliceConstraint) String() string { + var lname, uname string + if c.Lower != nil { + lname = c.Lower.Name() + } + if c.Upper != nil { + uname = c.Upper.Name() + } + return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname) +} +func (c *ArraySliceConstraint) String() string { + var lname, uname string + if c.Lower != nil { + lname = c.Lower.Name() + } + if c.Upper != nil { + uname = c.Upper.Name() + } + return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname) +} +func (c *SliceIntersectionConstraint) String() string { + return fmt.Sprintf("%s = %s.%t ⊓ %s", c.Y().Name(), c.X.Name(), c.Y().(*ssa.Sigma).Branch, c.I) +} +func (c *SliceLengthConstraint) String() string { + return fmt.Sprintf("%s = len(%s)", c.Y().Name(), c.X.Name()) +} +func (c *MakeSliceConstraint) String() string { + return fmt.Sprintf("%s = make(slice, %s)", c.Y().Name(), c.Size.Name()) +} +func (c *SliceIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) } + +func (c *SliceAppendConstraint) Eval(g *Graph) Range { + l1 := g.Range(c.A).(SliceInterval).Length + var l2 IntInterval + switch r := g.Range(c.B).(type) { + case SliceInterval: + l2 = r.Length + case StringInterval: + l2 = r.Length + default: + return SliceInterval{} + } + if !l1.IsKnown() || !l2.IsKnown() { + return SliceInterval{} + } + return SliceInterval{ + Length: l1.Add(l2), + } +} +func (c *SliceSliceConstraint) Eval(g *Graph) Range { + lr := NewIntInterval(NewZ(0), NewZ(0)) + if c.Lower != nil { + lr = g.Range(c.Lower).(IntInterval) + } + ur := g.Range(c.X).(SliceInterval).Length + if c.Upper != nil { + ur = g.Range(c.Upper).(IntInterval) + } + if !lr.IsKnown() || !ur.IsKnown() { + return SliceInterval{} + } + + ls := []Z{ + ur.Lower.Sub(lr.Lower), + ur.Upper.Sub(lr.Lower), + ur.Lower.Sub(lr.Upper), + ur.Upper.Sub(lr.Upper), + } + // TODO(dh): if we don't truncate lengths to 0 we might be able to + // easily detect slices with high < low. we'd need to treat -∞ + // specially, though. + for i, l := range ls { + if l.Sign() == -1 { + ls[i] = NewZ(0) + } + } + + return SliceInterval{ + Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)), + } +} +func (c *ArraySliceConstraint) Eval(g *Graph) Range { + lr := NewIntInterval(NewZ(0), NewZ(0)) + if c.Lower != nil { + lr = g.Range(c.Lower).(IntInterval) + } + var l int64 + switch typ := c.X.Type().(type) { + case *types.Array: + l = typ.Len() + case *types.Pointer: + l = typ.Elem().(*types.Array).Len() + } + ur := NewIntInterval(NewZ(l), NewZ(l)) + if c.Upper != nil { + ur = g.Range(c.Upper).(IntInterval) + } + if !lr.IsKnown() || !ur.IsKnown() { + return SliceInterval{} + } + + ls := []Z{ + ur.Lower.Sub(lr.Lower), + ur.Upper.Sub(lr.Lower), + ur.Lower.Sub(lr.Upper), + ur.Upper.Sub(lr.Upper), + } + // TODO(dh): if we don't truncate lengths to 0 we might be able to + // easily detect slices with high < low. we'd need to treat -∞ + // specially, though. + for i, l := range ls { + if l.Sign() == -1 { + ls[i] = NewZ(0) + } + } + + return SliceInterval{ + Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)), + } +} +func (c *SliceIntersectionConstraint) Eval(g *Graph) Range { + xi := g.Range(c.X).(SliceInterval) + if !xi.IsKnown() { + return c.I + } + return SliceInterval{ + Length: xi.Length.Intersection(c.I), + } +} +func (c *SliceLengthConstraint) Eval(g *Graph) Range { + i := g.Range(c.X).(SliceInterval).Length + if !i.IsKnown() { + return NewIntInterval(NewZ(0), PInfinity) + } + return i +} +func (c *MakeSliceConstraint) Eval(g *Graph) Range { + i, ok := g.Range(c.Size).(IntInterval) + if !ok { + return SliceInterval{NewIntInterval(NewZ(0), PInfinity)} + } + if i.Lower.Sign() == -1 { + i.Lower = NewZ(0) + } + return SliceInterval{i} +} +func (c *SliceIntervalConstraint) Eval(*Graph) Range { return SliceInterval{c.I} } diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/string.go b/vendor/honnef.co/go/tools/staticcheck/vrp/string.go new file mode 100644 index 00000000..e05877f9 --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/vrp/string.go @@ -0,0 +1,258 @@ +package vrp + +import ( + "fmt" + "go/token" + "go/types" + + "honnef.co/go/tools/ssa" +) + +type StringInterval struct { + Length IntInterval +} + +func (s StringInterval) Union(other Range) Range { + i, ok := other.(StringInterval) + if !ok { + i = StringInterval{EmptyIntInterval} + } + if s.Length.Empty() || !s.Length.IsKnown() { + return i + } + if i.Length.Empty() || !i.Length.IsKnown() { + return s + } + return StringInterval{ + Length: s.Length.Union(i.Length).(IntInterval), + } +} + +func (s StringInterval) String() string { + return s.Length.String() +} + +func (s StringInterval) IsKnown() bool { + return s.Length.IsKnown() +} + +type StringSliceConstraint struct { + aConstraint + X ssa.Value + Lower ssa.Value + Upper ssa.Value +} + +type StringIntersectionConstraint struct { + aConstraint + ranges Ranges + A ssa.Value + B ssa.Value + Op token.Token + I IntInterval + resolved bool +} + +type StringConcatConstraint struct { + aConstraint + A ssa.Value + B ssa.Value +} + +type StringLengthConstraint struct { + aConstraint + X ssa.Value +} + +type StringIntervalConstraint struct { + aConstraint + I IntInterval +} + +func NewStringSliceConstraint(x, lower, upper, y ssa.Value) Constraint { + return &StringSliceConstraint{NewConstraint(y), x, lower, upper} +} +func NewStringIntersectionConstraint(a, b ssa.Value, op token.Token, ranges Ranges, y ssa.Value) Constraint { + return &StringIntersectionConstraint{ + aConstraint: NewConstraint(y), + ranges: ranges, + A: a, + B: b, + Op: op, + } +} +func NewStringConcatConstraint(a, b, y ssa.Value) Constraint { + return &StringConcatConstraint{NewConstraint(y), a, b} +} +func NewStringLengthConstraint(x ssa.Value, y ssa.Value) Constraint { + return &StringLengthConstraint{NewConstraint(y), x} +} +func NewStringIntervalConstraint(i IntInterval, y ssa.Value) Constraint { + return &StringIntervalConstraint{NewConstraint(y), i} +} + +func (c *StringSliceConstraint) Operands() []ssa.Value { + vs := []ssa.Value{c.X} + if c.Lower != nil { + vs = append(vs, c.Lower) + } + if c.Upper != nil { + vs = append(vs, c.Upper) + } + return vs +} +func (c *StringIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.A} } +func (c StringConcatConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} } +func (c *StringLengthConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} } +func (s *StringIntervalConstraint) Operands() []ssa.Value { return nil } + +func (c *StringSliceConstraint) String() string { + var lname, uname string + if c.Lower != nil { + lname = c.Lower.Name() + } + if c.Upper != nil { + uname = c.Upper.Name() + } + return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname) +} +func (c *StringIntersectionConstraint) String() string { + return fmt.Sprintf("%s = %s %s %s (%t branch)", c.Y().Name(), c.A.Name(), c.Op, c.B.Name(), c.Y().(*ssa.Sigma).Branch) +} +func (c StringConcatConstraint) String() string { + return fmt.Sprintf("%s = %s + %s", c.Y().Name(), c.A.Name(), c.B.Name()) +} +func (c *StringLengthConstraint) String() string { + return fmt.Sprintf("%s = len(%s)", c.Y().Name(), c.X.Name()) +} +func (c *StringIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) } + +func (c *StringSliceConstraint) Eval(g *Graph) Range { + lr := NewIntInterval(NewZ(0), NewZ(0)) + if c.Lower != nil { + lr = g.Range(c.Lower).(IntInterval) + } + ur := g.Range(c.X).(StringInterval).Length + if c.Upper != nil { + ur = g.Range(c.Upper).(IntInterval) + } + if !lr.IsKnown() || !ur.IsKnown() { + return StringInterval{} + } + + ls := []Z{ + ur.Lower.Sub(lr.Lower), + ur.Upper.Sub(lr.Lower), + ur.Lower.Sub(lr.Upper), + ur.Upper.Sub(lr.Upper), + } + // TODO(dh): if we don't truncate lengths to 0 we might be able to + // easily detect slices with high < low. we'd need to treat -∞ + // specially, though. + for i, l := range ls { + if l.Sign() == -1 { + ls[i] = NewZ(0) + } + } + + return StringInterval{ + Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)), + } +} +func (c *StringIntersectionConstraint) Eval(g *Graph) Range { + var l IntInterval + switch r := g.Range(c.A).(type) { + case StringInterval: + l = r.Length + case IntInterval: + l = r + } + + if !l.IsKnown() { + return StringInterval{c.I} + } + return StringInterval{ + Length: l.Intersection(c.I), + } +} +func (c StringConcatConstraint) Eval(g *Graph) Range { + i1, i2 := g.Range(c.A).(StringInterval), g.Range(c.B).(StringInterval) + if !i1.Length.IsKnown() || !i2.Length.IsKnown() { + return StringInterval{} + } + return StringInterval{ + Length: i1.Length.Add(i2.Length), + } +} +func (c *StringLengthConstraint) Eval(g *Graph) Range { + i := g.Range(c.X).(StringInterval).Length + if !i.IsKnown() { + return NewIntInterval(NewZ(0), PInfinity) + } + return i +} +func (c *StringIntervalConstraint) Eval(*Graph) Range { return StringInterval{c.I} } + +func (c *StringIntersectionConstraint) Futures() []ssa.Value { + return []ssa.Value{c.B} +} + +func (c *StringIntersectionConstraint) Resolve() { + if (c.A.Type().Underlying().(*types.Basic).Info() & types.IsString) != 0 { + // comparing two strings + r, ok := c.ranges[c.B].(StringInterval) + if !ok { + c.I = NewIntInterval(NewZ(0), PInfinity) + return + } + switch c.Op { + case token.EQL: + c.I = r.Length + case token.GTR, token.GEQ: + c.I = NewIntInterval(r.Length.Lower, PInfinity) + case token.LSS, token.LEQ: + c.I = NewIntInterval(NewZ(0), r.Length.Upper) + case token.NEQ: + default: + panic("unsupported op " + c.Op.String()) + } + } else { + r, ok := c.ranges[c.B].(IntInterval) + if !ok { + c.I = NewIntInterval(NewZ(0), PInfinity) + return + } + // comparing two lengths + switch c.Op { + case token.EQL: + c.I = r + case token.GTR: + c.I = NewIntInterval(r.Lower.Add(NewZ(1)), PInfinity) + case token.GEQ: + c.I = NewIntInterval(r.Lower, PInfinity) + case token.LSS: + c.I = NewIntInterval(NInfinity, r.Upper.Sub(NewZ(1))) + case token.LEQ: + c.I = NewIntInterval(NInfinity, r.Upper) + case token.NEQ: + default: + panic("unsupported op " + c.Op.String()) + } + } +} + +func (c *StringIntersectionConstraint) IsKnown() bool { + return c.I.IsKnown() +} + +func (c *StringIntersectionConstraint) MarkUnresolved() { + c.resolved = false +} + +func (c *StringIntersectionConstraint) MarkResolved() { + c.resolved = true +} + +func (c *StringIntersectionConstraint) IsResolved() bool { + return c.resolved +} diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/vrp.go b/vendor/honnef.co/go/tools/staticcheck/vrp/vrp.go new file mode 100644 index 00000000..3c138e51 --- /dev/null +++ b/vendor/honnef.co/go/tools/staticcheck/vrp/vrp.go @@ -0,0 +1,1056 @@ +package vrp + +// TODO(dh) widening and narrowing have a lot of code in common. Make +// it reusable. + +import ( + "fmt" + "go/constant" + "go/token" + "go/types" + "math/big" + "sort" + "strings" + + "honnef.co/go/tools/lint" + "honnef.co/go/tools/ssa" +) + +type Future interface { + Constraint + Futures() []ssa.Value + Resolve() + IsKnown() bool + MarkUnresolved() + MarkResolved() + IsResolved() bool +} + +type Range interface { + Union(other Range) Range + IsKnown() bool +} + +type Constraint interface { + Y() ssa.Value + isConstraint() + String() string + Eval(*Graph) Range + Operands() []ssa.Value +} + +type aConstraint struct { + y ssa.Value +} + +func NewConstraint(y ssa.Value) aConstraint { + return aConstraint{y} +} + +func (aConstraint) isConstraint() {} +func (c aConstraint) Y() ssa.Value { return c.y } + +type PhiConstraint struct { + aConstraint + Vars []ssa.Value +} + +func NewPhiConstraint(vars []ssa.Value, y ssa.Value) Constraint { + uniqm := map[ssa.Value]struct{}{} + for _, v := range vars { + uniqm[v] = struct{}{} + } + var uniq []ssa.Value + for v := range uniqm { + uniq = append(uniq, v) + } + return &PhiConstraint{ + aConstraint: NewConstraint(y), + Vars: uniq, + } +} + +func (c *PhiConstraint) Operands() []ssa.Value { + return c.Vars +} + +func (c *PhiConstraint) Eval(g *Graph) Range { + i := Range(nil) + for _, v := range c.Vars { + i = g.Range(v).Union(i) + } + return i +} + +func (c *PhiConstraint) String() string { + names := make([]string, len(c.Vars)) + for i, v := range c.Vars { + names[i] = v.Name() + } + return fmt.Sprintf("%s = φ(%s)", c.Y().Name(), strings.Join(names, ", ")) +} + +func isSupportedType(typ types.Type) bool { + switch typ := typ.Underlying().(type) { + case *types.Basic: + switch typ.Kind() { + case types.String, types.UntypedString: + return true + default: + if (typ.Info() & types.IsInteger) == 0 { + return false + } + } + case *types.Chan: + return true + case *types.Slice: + return true + default: + return false + } + return true +} + +func ConstantToZ(c constant.Value) Z { + s := constant.ToInt(c).ExactString() + n := &big.Int{} + n.SetString(s, 10) + return NewBigZ(n) +} + +func sigmaInteger(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint { + op := cond.Op + if !ins.Branch { + op = (invertToken(op)) + } + + switch op { + case token.EQL, token.GTR, token.GEQ, token.LSS, token.LEQ: + default: + return nil + } + var a, b ssa.Value + if (*ops[0]) == ins.X { + a = *ops[0] + b = *ops[1] + } else { + a = *ops[1] + b = *ops[0] + op = flipToken(op) + } + return NewIntIntersectionConstraint(a, b, op, g.ranges, ins) +} + +func sigmaString(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint { + op := cond.Op + if !ins.Branch { + op = (invertToken(op)) + } + + switch op { + case token.EQL, token.GTR, token.GEQ, token.LSS, token.LEQ: + default: + return nil + } + + if ((*ops[0]).Type().Underlying().(*types.Basic).Info() & types.IsString) == 0 { + var a, b ssa.Value + call, ok := (*ops[0]).(*ssa.Call) + if ok && call.Common().Args[0] == ins.X { + a = *ops[0] + b = *ops[1] + } else { + a = *ops[1] + b = *ops[0] + op = flipToken(op) + } + return NewStringIntersectionConstraint(a, b, op, g.ranges, ins) + } + var a, b ssa.Value + if (*ops[0]) == ins.X { + a = *ops[0] + b = *ops[1] + } else { + a = *ops[1] + b = *ops[0] + op = flipToken(op) + } + return NewStringIntersectionConstraint(a, b, op, g.ranges, ins) +} + +func sigmaSlice(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint { + // TODO(dh) sigmaSlice and sigmaString are a lot alike. Can they + // be merged? + // + // XXX support futures + + op := cond.Op + if !ins.Branch { + op = (invertToken(op)) + } + + k, ok := (*ops[1]).(*ssa.Const) + // XXX investigate in what cases this wouldn't be a Const + // + // XXX what if left and right are swapped? + if !ok { + return nil + } + + call, ok := (*ops[0]).(*ssa.Call) + if !ok { + return nil + } + builtin, ok := call.Common().Value.(*ssa.Builtin) + if !ok { + return nil + } + if builtin.Name() != "len" { + return nil + } + callops := call.Operands(nil) + + v := ConstantToZ(k.Value) + c := NewSliceIntersectionConstraint(*callops[1], IntInterval{}, ins).(*SliceIntersectionConstraint) + switch op { + case token.EQL: + c.I = NewIntInterval(v, v) + case token.GTR, token.GEQ: + off := int64(0) + if cond.Op == token.GTR { + off = 1 + } + c.I = NewIntInterval( + v.Add(NewZ(off)), + PInfinity, + ) + case token.LSS, token.LEQ: + off := int64(0) + if cond.Op == token.LSS { + off = -1 + } + c.I = NewIntInterval( + NInfinity, + v.Add(NewZ(off)), + ) + default: + return nil + } + return c +} + +func BuildGraph(f *ssa.Function) *Graph { + g := &Graph{ + Vertices: map[interface{}]*Vertex{}, + ranges: Ranges{}, + } + + var cs []Constraint + + ops := make([]*ssa.Value, 16) + seen := map[ssa.Value]bool{} + for _, block := range f.Blocks { + for _, ins := range block.Instrs { + ops = ins.Operands(ops[:0]) + for _, op := range ops { + if c, ok := (*op).(*ssa.Const); ok { + if seen[c] { + continue + } + seen[c] = true + if c.Value == nil { + switch c.Type().Underlying().(type) { + case *types.Slice: + cs = append(cs, NewSliceIntervalConstraint(NewIntInterval(NewZ(0), NewZ(0)), c)) + } + continue + } + switch c.Value.Kind() { + case constant.Int: + v := ConstantToZ(c.Value) + cs = append(cs, NewIntIntervalConstraint(NewIntInterval(v, v), c)) + case constant.String: + s := constant.StringVal(c.Value) + n := NewZ(int64(len(s))) + cs = append(cs, NewStringIntervalConstraint(NewIntInterval(n, n), c)) + } + } + } + } + } + for _, block := range f.Blocks { + for _, ins := range block.Instrs { + switch ins := ins.(type) { + case *ssa.Convert: + switch v := ins.Type().Underlying().(type) { + case *types.Basic: + if (v.Info() & types.IsInteger) == 0 { + continue + } + cs = append(cs, NewIntConversionConstraint(ins.X, ins)) + } + case *ssa.Call: + if static := ins.Common().StaticCallee(); static != nil { + if fn, ok := static.Object().(*types.Func); ok { + switch lint.FuncName(fn) { + case "bytes.Index", "bytes.IndexAny", "bytes.IndexByte", + "bytes.IndexFunc", "bytes.IndexRune", "bytes.LastIndex", + "bytes.LastIndexAny", "bytes.LastIndexByte", "bytes.LastIndexFunc", + "strings.Index", "strings.IndexAny", "strings.IndexByte", + "strings.IndexFunc", "strings.IndexRune", "strings.LastIndex", + "strings.LastIndexAny", "strings.LastIndexByte", "strings.LastIndexFunc": + // TODO(dh): instead of limiting by +∞, + // limit by the upper bound of the passed + // string + cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(-1), PInfinity), ins)) + case "bytes.Title", "bytes.ToLower", "bytes.ToTitle", "bytes.ToUpper", + "strings.Title", "strings.ToLower", "strings.ToTitle", "strings.ToUpper": + cs = append(cs, NewCopyConstraint(ins.Common().Args[0], ins)) + case "bytes.ToLowerSpecial", "bytes.ToTitleSpecial", "bytes.ToUpperSpecial", + "strings.ToLowerSpecial", "strings.ToTitleSpecial", "strings.ToUpperSpecial": + cs = append(cs, NewCopyConstraint(ins.Common().Args[1], ins)) + case "bytes.Compare", "strings.Compare": + cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(-1), NewZ(1)), ins)) + case "bytes.Count", "strings.Count": + // TODO(dh): instead of limiting by +∞, + // limit by the upper bound of the passed + // string. + cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(0), PInfinity), ins)) + case "bytes.Map", "bytes.TrimFunc", "bytes.TrimLeft", "bytes.TrimLeftFunc", + "bytes.TrimRight", "bytes.TrimRightFunc", "bytes.TrimSpace", + "strings.Map", "strings.TrimFunc", "strings.TrimLeft", "strings.TrimLeftFunc", + "strings.TrimRight", "strings.TrimRightFunc", "strings.TrimSpace": + // TODO(dh): lower = 0, upper = upper of passed string + case "bytes.TrimPrefix", "bytes.TrimSuffix", + "strings.TrimPrefix", "strings.TrimSuffix": + // TODO(dh) range between "unmodified" and len(cutset) removed + case "(*bytes.Buffer).Cap", "(*bytes.Buffer).Len", "(*bytes.Reader).Len", "(*bytes.Reader).Size": + cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(0), PInfinity), ins)) + } + } + } + builtin, ok := ins.Common().Value.(*ssa.Builtin) + ops := ins.Operands(nil) + if !ok { + continue + } + switch builtin.Name() { + case "len": + switch op1 := (*ops[1]).Type().Underlying().(type) { + case *types.Basic: + if op1.Kind() == types.String || op1.Kind() == types.UntypedString { + cs = append(cs, NewStringLengthConstraint(*ops[1], ins)) + } + case *types.Slice: + cs = append(cs, NewSliceLengthConstraint(*ops[1], ins)) + } + + case "append": + cs = append(cs, NewSliceAppendConstraint(ins.Common().Args[0], ins.Common().Args[1], ins)) + } + case *ssa.BinOp: + ops := ins.Operands(nil) + basic, ok := (*ops[0]).Type().Underlying().(*types.Basic) + if !ok { + continue + } + switch basic.Kind() { + case types.Int, types.Int8, types.Int16, types.Int32, types.Int64, + types.Uint, types.Uint8, types.Uint16, types.Uint32, types.Uint64, types.UntypedInt: + fns := map[token.Token]func(ssa.Value, ssa.Value, ssa.Value) Constraint{ + token.ADD: NewIntAddConstraint, + token.SUB: NewIntSubConstraint, + token.MUL: NewIntMulConstraint, + // XXX support QUO, REM, SHL, SHR + } + fn, ok := fns[ins.Op] + if ok { + cs = append(cs, fn(*ops[0], *ops[1], ins)) + } + case types.String, types.UntypedString: + if ins.Op == token.ADD { + cs = append(cs, NewStringConcatConstraint(*ops[0], *ops[1], ins)) + } + } + case *ssa.Slice: + typ := ins.X.Type().Underlying() + switch typ := typ.(type) { + case *types.Basic: + cs = append(cs, NewStringSliceConstraint(ins.X, ins.Low, ins.High, ins)) + case *types.Slice: + cs = append(cs, NewSliceSliceConstraint(ins.X, ins.Low, ins.High, ins)) + case *types.Array: + cs = append(cs, NewArraySliceConstraint(ins.X, ins.Low, ins.High, ins)) + case *types.Pointer: + if _, ok := typ.Elem().(*types.Array); !ok { + continue + } + cs = append(cs, NewArraySliceConstraint(ins.X, ins.Low, ins.High, ins)) + } + case *ssa.Phi: + if !isSupportedType(ins.Type()) { + continue + } + ops := ins.Operands(nil) + dops := make([]ssa.Value, len(ops)) + for i, op := range ops { + dops[i] = *op + } + cs = append(cs, NewPhiConstraint(dops, ins)) + case *ssa.Sigma: + pred := ins.Block().Preds[0] + instrs := pred.Instrs + cond, ok := instrs[len(instrs)-1].(*ssa.If).Cond.(*ssa.BinOp) + ops := cond.Operands(nil) + if !ok { + continue + } + switch typ := ins.Type().Underlying().(type) { + case *types.Basic: + var c Constraint + switch typ.Kind() { + case types.Int, types.Int8, types.Int16, types.Int32, types.Int64, + types.Uint, types.Uint8, types.Uint16, types.Uint32, types.Uint64, types.UntypedInt: + c = sigmaInteger(g, ins, cond, ops) + case types.String, types.UntypedString: + c = sigmaString(g, ins, cond, ops) + } + if c != nil { + cs = append(cs, c) + } + case *types.Slice: + c := sigmaSlice(g, ins, cond, ops) + if c != nil { + cs = append(cs, c) + } + default: + //log.Printf("unsupported sigma type %T", typ) // XXX + } + case *ssa.MakeChan: + cs = append(cs, NewMakeChannelConstraint(ins.Size, ins)) + case *ssa.MakeSlice: + cs = append(cs, NewMakeSliceConstraint(ins.Len, ins)) + case *ssa.ChangeType: + switch ins.X.Type().Underlying().(type) { + case *types.Chan: + cs = append(cs, NewChannelChangeTypeConstraint(ins.X, ins)) + } + } + } + } + + for _, c := range cs { + if c == nil { + panic("nil constraint") + } + // If V is used in constraint C, then we create an edge V->C + for _, op := range c.Operands() { + g.AddEdge(op, c, false) + } + if c, ok := c.(Future); ok { + for _, op := range c.Futures() { + g.AddEdge(op, c, true) + } + } + // If constraint C defines variable V, then we create an edge + // C->V + g.AddEdge(c, c.Y(), false) + } + + g.FindSCCs() + g.sccEdges = make([][]Edge, len(g.SCCs)) + g.futures = make([][]Future, len(g.SCCs)) + for _, e := range g.Edges { + g.sccEdges[e.From.SCC] = append(g.sccEdges[e.From.SCC], e) + if !e.control { + continue + } + if c, ok := e.To.Value.(Future); ok { + g.futures[e.From.SCC] = append(g.futures[e.From.SCC], c) + } + } + return g +} + +func (g *Graph) Solve() Ranges { + var consts []Z + off := NewZ(1) + for _, n := range g.Vertices { + if c, ok := n.Value.(*ssa.Const); ok { + basic, ok := c.Type().Underlying().(*types.Basic) + if !ok { + continue + } + if (basic.Info() & types.IsInteger) != 0 { + z := ConstantToZ(c.Value) + consts = append(consts, z) + consts = append(consts, z.Add(off)) + consts = append(consts, z.Sub(off)) + } + } + + } + sort.Sort(Zs(consts)) + + for scc, vertices := range g.SCCs { + n := 0 + n = len(vertices) + if n == 1 { + g.resolveFutures(scc) + v := vertices[0] + if v, ok := v.Value.(ssa.Value); ok { + switch typ := v.Type().Underlying().(type) { + case *types.Basic: + switch typ.Kind() { + case types.String, types.UntypedString: + if !g.Range(v).(StringInterval).IsKnown() { + g.SetRange(v, StringInterval{NewIntInterval(NewZ(0), PInfinity)}) + } + default: + if !g.Range(v).(IntInterval).IsKnown() { + g.SetRange(v, InfinityFor(v)) + } + } + case *types.Chan: + if !g.Range(v).(ChannelInterval).IsKnown() { + g.SetRange(v, ChannelInterval{NewIntInterval(NewZ(0), PInfinity)}) + } + case *types.Slice: + if !g.Range(v).(SliceInterval).IsKnown() { + g.SetRange(v, SliceInterval{NewIntInterval(NewZ(0), PInfinity)}) + } + } + } + if c, ok := v.Value.(Constraint); ok { + g.SetRange(c.Y(), c.Eval(g)) + } + } else { + uses := g.uses(scc) + entries := g.entries(scc) + for len(entries) > 0 { + v := entries[len(entries)-1] + entries = entries[:len(entries)-1] + for _, use := range uses[v] { + if g.widen(use, consts) { + entries = append(entries, use.Y()) + } + } + } + + g.resolveFutures(scc) + + // XXX this seems to be necessary, but shouldn't be. + // removing it leads to nil pointer derefs; investigate + // where we're not setting values correctly. + for _, n := range vertices { + if v, ok := n.Value.(ssa.Value); ok { + i, ok := g.Range(v).(IntInterval) + if !ok { + continue + } + if !i.IsKnown() { + g.SetRange(v, InfinityFor(v)) + } + } + } + + actives := g.actives(scc) + for len(actives) > 0 { + v := actives[len(actives)-1] + actives = actives[:len(actives)-1] + for _, use := range uses[v] { + if g.narrow(use) { + actives = append(actives, use.Y()) + } + } + } + } + // propagate scc + for _, edge := range g.sccEdges[scc] { + if edge.control { + continue + } + if edge.From.SCC == edge.To.SCC { + continue + } + if c, ok := edge.To.Value.(Constraint); ok { + g.SetRange(c.Y(), c.Eval(g)) + } + if c, ok := edge.To.Value.(Future); ok { + if !c.IsKnown() { + c.MarkUnresolved() + } + } + } + } + + for v, r := range g.ranges { + i, ok := r.(IntInterval) + if !ok { + continue + } + if (v.Type().Underlying().(*types.Basic).Info() & types.IsUnsigned) == 0 { + if i.Upper != PInfinity { + s := &types.StdSizes{ + // XXX is it okay to assume the largest word size, or do we + // need to be platform specific? + WordSize: 8, + MaxAlign: 1, + } + bits := (s.Sizeof(v.Type()) * 8) - 1 + n := big.NewInt(1) + n = n.Lsh(n, uint(bits)) + upper, lower := &big.Int{}, &big.Int{} + upper.Sub(n, big.NewInt(1)) + lower.Neg(n) + + if i.Upper.Cmp(NewBigZ(upper)) == 1 { + i = NewIntInterval(NInfinity, PInfinity) + } else if i.Lower.Cmp(NewBigZ(lower)) == -1 { + i = NewIntInterval(NInfinity, PInfinity) + } + } + } + + g.ranges[v] = i + } + + return g.ranges +} + +func VertexString(v *Vertex) string { + switch v := v.Value.(type) { + case Constraint: + return v.String() + case ssa.Value: + return v.Name() + case nil: + return "BUG: nil vertex value" + default: + panic(fmt.Sprintf("unexpected type %T", v)) + } +} + +type Vertex struct { + Value interface{} // one of Constraint or ssa.Value + SCC int + index int + lowlink int + stack bool + + Succs []Edge +} + +type Ranges map[ssa.Value]Range + +func (r Ranges) Get(x ssa.Value) Range { + if x == nil { + return nil + } + i, ok := r[x] + if !ok { + switch x := x.Type().Underlying().(type) { + case *types.Basic: + switch x.Kind() { + case types.String, types.UntypedString: + return StringInterval{} + default: + return IntInterval{} + } + case *types.Chan: + return ChannelInterval{} + case *types.Slice: + return SliceInterval{} + } + } + return i +} + +type Graph struct { + Vertices map[interface{}]*Vertex + Edges []Edge + SCCs [][]*Vertex + ranges Ranges + + // map SCCs to futures + futures [][]Future + // map SCCs to edges + sccEdges [][]Edge +} + +func (g Graph) Graphviz() string { + var lines []string + lines = append(lines, "digraph{") + ids := map[interface{}]int{} + i := 1 + for _, v := range g.Vertices { + ids[v] = i + shape := "box" + if _, ok := v.Value.(ssa.Value); ok { + shape = "oval" + } + lines = append(lines, fmt.Sprintf(`n%d [shape="%s", label=%q, colorscheme=spectral11, style="filled", fillcolor="%d"]`, + i, shape, VertexString(v), (v.SCC%11)+1)) + i++ + } + for _, e := range g.Edges { + style := "solid" + if e.control { + style = "dashed" + } + lines = append(lines, fmt.Sprintf(`n%d -> n%d [style="%s"]`, ids[e.From], ids[e.To], style)) + } + lines = append(lines, "}") + return strings.Join(lines, "\n") +} + +func (g *Graph) SetRange(x ssa.Value, r Range) { + g.ranges[x] = r +} + +func (g *Graph) Range(x ssa.Value) Range { + return g.ranges.Get(x) +} + +func (g *Graph) widen(c Constraint, consts []Z) bool { + setRange := func(i Range) { + g.SetRange(c.Y(), i) + } + widenIntInterval := func(oi, ni IntInterval) (IntInterval, bool) { + if !ni.IsKnown() { + return oi, false + } + nlc := NInfinity + nuc := PInfinity + + // Don't get stuck widening for an absurd amount of time due + // to an excess number of constants, as may be present in + // table-based scanners. + if len(consts) < 1000 { + for _, co := range consts { + if co.Cmp(ni.Lower) <= 0 { + nlc = co + break + } + } + for _, co := range consts { + if co.Cmp(ni.Upper) >= 0 { + nuc = co + break + } + } + } + + if !oi.IsKnown() { + return ni, true + } + if ni.Lower.Cmp(oi.Lower) == -1 && ni.Upper.Cmp(oi.Upper) == 1 { + return NewIntInterval(nlc, nuc), true + } + if ni.Lower.Cmp(oi.Lower) == -1 { + return NewIntInterval(nlc, oi.Upper), true + } + if ni.Upper.Cmp(oi.Upper) == 1 { + return NewIntInterval(oi.Lower, nuc), true + } + return oi, false + } + switch oi := g.Range(c.Y()).(type) { + case IntInterval: + ni := c.Eval(g).(IntInterval) + si, changed := widenIntInterval(oi, ni) + if changed { + setRange(si) + return true + } + return false + case StringInterval: + ni := c.Eval(g).(StringInterval) + si, changed := widenIntInterval(oi.Length, ni.Length) + if changed { + setRange(StringInterval{si}) + return true + } + return false + case SliceInterval: + ni := c.Eval(g).(SliceInterval) + si, changed := widenIntInterval(oi.Length, ni.Length) + if changed { + setRange(SliceInterval{si}) + return true + } + return false + default: + return false + } +} + +func (g *Graph) narrow(c Constraint) bool { + narrowIntInterval := func(oi, ni IntInterval) (IntInterval, bool) { + oLower := oi.Lower + oUpper := oi.Upper + nLower := ni.Lower + nUpper := ni.Upper + + if oLower == NInfinity && nLower != NInfinity { + return NewIntInterval(nLower, oUpper), true + } + if oUpper == PInfinity && nUpper != PInfinity { + return NewIntInterval(oLower, nUpper), true + } + if oLower.Cmp(nLower) == 1 { + return NewIntInterval(nLower, oUpper), true + } + if oUpper.Cmp(nUpper) == -1 { + return NewIntInterval(oLower, nUpper), true + } + return oi, false + } + switch oi := g.Range(c.Y()).(type) { + case IntInterval: + ni := c.Eval(g).(IntInterval) + si, changed := narrowIntInterval(oi, ni) + if changed { + g.SetRange(c.Y(), si) + return true + } + return false + case StringInterval: + ni := c.Eval(g).(StringInterval) + si, changed := narrowIntInterval(oi.Length, ni.Length) + if changed { + g.SetRange(c.Y(), StringInterval{si}) + return true + } + return false + case SliceInterval: + ni := c.Eval(g).(SliceInterval) + si, changed := narrowIntInterval(oi.Length, ni.Length) + if changed { + g.SetRange(c.Y(), SliceInterval{si}) + return true + } + return false + default: + return false + } +} + +func (g *Graph) resolveFutures(scc int) { + for _, c := range g.futures[scc] { + c.Resolve() + } +} + +func (g *Graph) entries(scc int) []ssa.Value { + var entries []ssa.Value + for _, n := range g.Vertices { + if n.SCC != scc { + continue + } + if v, ok := n.Value.(ssa.Value); ok { + // XXX avoid quadratic runtime + // + // XXX I cannot think of any code where the future and its + // variables aren't in the same SCC, in which case this + // code isn't very useful (the variables won't be resolved + // yet). Before we have a cross-SCC example, however, we + // can't really verify that this code is working + // correctly, or indeed doing anything useful. + for _, on := range g.Vertices { + if c, ok := on.Value.(Future); ok { + if c.Y() == v { + if !c.IsResolved() { + g.SetRange(c.Y(), c.Eval(g)) + c.MarkResolved() + } + break + } + } + } + if g.Range(v).IsKnown() { + entries = append(entries, v) + } + } + } + return entries +} + +func (g *Graph) uses(scc int) map[ssa.Value][]Constraint { + m := map[ssa.Value][]Constraint{} + for _, e := range g.sccEdges[scc] { + if e.control { + continue + } + if v, ok := e.From.Value.(ssa.Value); ok { + c := e.To.Value.(Constraint) + sink := c.Y() + if g.Vertices[sink].SCC == scc { + m[v] = append(m[v], c) + } + } + } + return m +} + +func (g *Graph) actives(scc int) []ssa.Value { + var actives []ssa.Value + for _, n := range g.Vertices { + if n.SCC != scc { + continue + } + if v, ok := n.Value.(ssa.Value); ok { + if _, ok := v.(*ssa.Const); !ok { + actives = append(actives, v) + } + } + } + return actives +} + +func (g *Graph) AddEdge(from, to interface{}, ctrl bool) { + vf, ok := g.Vertices[from] + if !ok { + vf = &Vertex{Value: from} + g.Vertices[from] = vf + } + vt, ok := g.Vertices[to] + if !ok { + vt = &Vertex{Value: to} + g.Vertices[to] = vt + } + e := Edge{From: vf, To: vt, control: ctrl} + g.Edges = append(g.Edges, e) + vf.Succs = append(vf.Succs, e) +} + +type Edge struct { + From, To *Vertex + control bool +} + +func (e Edge) String() string { + return fmt.Sprintf("%s -> %s", VertexString(e.From), VertexString(e.To)) +} + +func (g *Graph) FindSCCs() { + // use Tarjan to find the SCCs + + index := 1 + var s []*Vertex + + scc := 0 + var strongconnect func(v *Vertex) + strongconnect = func(v *Vertex) { + // set the depth index for v to the smallest unused index + v.index = index + v.lowlink = index + index++ + s = append(s, v) + v.stack = true + + for _, e := range v.Succs { + w := e.To + if w.index == 0 { + // successor w has not yet been visited; recurse on it + strongconnect(w) + if w.lowlink < v.lowlink { + v.lowlink = w.lowlink + } + } else if w.stack { + // successor w is in stack s and hence in the current scc + if w.index < v.lowlink { + v.lowlink = w.index + } + } + } + + if v.lowlink == v.index { + for { + w := s[len(s)-1] + s = s[:len(s)-1] + w.stack = false + w.SCC = scc + if w == v { + break + } + } + scc++ + } + } + for _, v := range g.Vertices { + if v.index == 0 { + strongconnect(v) + } + } + + g.SCCs = make([][]*Vertex, scc) + for _, n := range g.Vertices { + n.SCC = scc - n.SCC - 1 + g.SCCs[n.SCC] = append(g.SCCs[n.SCC], n) + } +} + +func invertToken(tok token.Token) token.Token { + switch tok { + case token.LSS: + return token.GEQ + case token.GTR: + return token.LEQ + case token.EQL: + return token.NEQ + case token.NEQ: + return token.EQL + case token.GEQ: + return token.LSS + case token.LEQ: + return token.GTR + default: + panic(fmt.Sprintf("unsupported token %s", tok)) + } +} + +func flipToken(tok token.Token) token.Token { + switch tok { + case token.LSS: + return token.GTR + case token.GTR: + return token.LSS + case token.EQL: + return token.EQL + case token.NEQ: + return token.NEQ + case token.GEQ: + return token.LEQ + case token.LEQ: + return token.GEQ + default: + panic(fmt.Sprintf("unsupported token %s", tok)) + } +} + +type CopyConstraint struct { + aConstraint + X ssa.Value +} + +func (c *CopyConstraint) String() string { + return fmt.Sprintf("%s = copy(%s)", c.Y().Name(), c.X.Name()) +} + +func (c *CopyConstraint) Eval(g *Graph) Range { + return g.Range(c.X) +} + +func (c *CopyConstraint) Operands() []ssa.Value { + return []ssa.Value{c.X} +} + +func NewCopyConstraint(x, y ssa.Value) Constraint { + return &CopyConstraint{ + aConstraint: aConstraint{ + y: y, + }, + X: x, + } +} diff --git a/vendor/honnef.co/go/tools/stylecheck/analysis.go b/vendor/honnef.co/go/tools/stylecheck/analysis.go new file mode 100644 index 00000000..f252487f --- /dev/null +++ b/vendor/honnef.co/go/tools/stylecheck/analysis.go @@ -0,0 +1,111 @@ +package stylecheck + +import ( + "flag" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/passes/inspect" + "honnef.co/go/tools/config" + "honnef.co/go/tools/facts" + "honnef.co/go/tools/internal/passes/buildssa" + "honnef.co/go/tools/lint/lintutil" +) + +func newFlagSet() flag.FlagSet { + fs := flag.NewFlagSet("", flag.PanicOnError) + fs.Var(lintutil.NewVersionFlag(), "go", "Target Go version") + return *fs +} + +var Analyzers = map[string]*analysis.Analyzer{ + "ST1000": { + Name: "ST1000", + Run: CheckPackageComment, + Doc: Docs["ST1000"].String(), + Requires: []*analysis.Analyzer{}, + Flags: newFlagSet(), + }, + "ST1001": { + Name: "ST1001", + Run: CheckDotImports, + Doc: Docs["ST1001"].String(), + Requires: []*analysis.Analyzer{facts.Generated, config.Analyzer}, + Flags: newFlagSet(), + }, + "ST1003": { + Name: "ST1003", + Run: CheckNames, + Doc: Docs["ST1003"].String(), + Requires: []*analysis.Analyzer{facts.Generated, config.Analyzer}, + Flags: newFlagSet(), + }, + "ST1005": { + Name: "ST1005", + Run: CheckErrorStrings, + Doc: Docs["ST1005"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "ST1006": { + Name: "ST1006", + Run: CheckReceiverNames, + Doc: Docs["ST1006"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Generated}, + Flags: newFlagSet(), + }, + "ST1008": { + Name: "ST1008", + Run: CheckErrorReturn, + Doc: Docs["ST1008"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "ST1011": { + Name: "ST1011", + Run: CheckTimeNames, + Doc: Docs["ST1011"].String(), + Flags: newFlagSet(), + }, + "ST1012": { + Name: "ST1012", + Run: CheckErrorVarNames, + Doc: Docs["ST1012"].String(), + Requires: []*analysis.Analyzer{config.Analyzer}, + Flags: newFlagSet(), + }, + "ST1013": { + Name: "ST1013", + Run: CheckHTTPStatusCodes, + Doc: Docs["ST1013"].String(), + Requires: []*analysis.Analyzer{facts.Generated, facts.TokenFile, config.Analyzer}, + Flags: newFlagSet(), + }, + "ST1015": { + Name: "ST1015", + Run: CheckDefaultCaseOrder, + Doc: Docs["ST1015"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile}, + Flags: newFlagSet(), + }, + "ST1016": { + Name: "ST1016", + Run: CheckReceiverNamesIdentical, + Doc: Docs["ST1016"].String(), + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + Flags: newFlagSet(), + }, + "ST1017": { + Name: "ST1017", + Run: CheckYodaConditions, + Doc: Docs["ST1017"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile}, + Flags: newFlagSet(), + }, + "ST1018": { + Name: "ST1018", + Run: CheckInvisibleCharacters, + Doc: Docs["ST1018"].String(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Flags: newFlagSet(), + }, +} diff --git a/vendor/honnef.co/go/tools/stylecheck/doc.go b/vendor/honnef.co/go/tools/stylecheck/doc.go new file mode 100644 index 00000000..9097214d --- /dev/null +++ b/vendor/honnef.co/go/tools/stylecheck/doc.go @@ -0,0 +1,154 @@ +package stylecheck + +import "honnef.co/go/tools/lint" + +var Docs = map[string]*lint.Documentation{ + "ST1000": &lint.Documentation{ + Title: `Incorrect or missing package comment`, + Text: `Packages must have a package comment that is formatted according to +the guidelines laid out in +https://github.com/golang/go/wiki/CodeReviewComments#package-comments.`, + Since: "2019.1", + NonDefault: true, + }, + + "ST1001": &lint.Documentation{ + Title: `Dot imports are discouraged`, + Text: `Dot imports that aren't in external test packages are discouraged. + +The dot_import_whitelist option can be used to whitelist certain +imports. + +Quoting Go Code Review Comments: + + The import . form can be useful in tests that, due to circular + dependencies, cannot be made part of the package being tested: + + package foo_test + + import ( + "bar/testutil" // also imports "foo" + . "foo" + ) + + In this case, the test file cannot be in package foo because it + uses bar/testutil, which imports foo. So we use the 'import .' + form to let the file pretend to be part of package foo even though + it is not. Except for this one case, do not use import . in your + programs. It makes the programs much harder to read because it is + unclear whether a name like Quux is a top-level identifier in the + current package or in an imported package.`, + Since: "2019.1", + Options: []string{"dot_import_whitelist"}, + }, + + "ST1003": &lint.Documentation{ + Title: `Poorly chosen identifier`, + Text: `Identifiers, such as variable and package names, follow certain rules. + +See the following links for details: + +- https://golang.org/doc/effective_go.html#package-names +- https://golang.org/doc/effective_go.html#mixed-caps +- https://github.com/golang/go/wiki/CodeReviewComments#initialisms +- https://github.com/golang/go/wiki/CodeReviewComments#variable-names`, + Since: "2019.1", + NonDefault: true, + Options: []string{"initialisms"}, + }, + + "ST1005": &lint.Documentation{ + Title: `Incorrectly formatted error string`, + Text: `Error strings follow a set of guidelines to ensure uniformity and good +composability. + +Quoting Go Code Review Comments: + + Error strings should not be capitalized (unless beginning with + proper nouns or acronyms) or end with punctuation, since they are + usually printed following other context. That is, use + fmt.Errorf("something bad") not fmt.Errorf("Something bad"), so + that log.Printf("Reading %s: %v", filename, err) formats without a + spurious capital letter mid-message.`, + Since: "2019.1", + }, + + "ST1006": &lint.Documentation{ + Title: `Poorly chosen receiver name`, + Text: `Quoting Go Code Review Comments: + + The name of a method's receiver should be a reflection of its + identity; often a one or two letter abbreviation of its type + suffices (such as "c" or "cl" for "Client"). Don't use generic + names such as "me", "this" or "self", identifiers typical of + object-oriented languages that place more emphasis on methods as + opposed to functions. The name need not be as descriptive as that + of a method argument, as its role is obvious and serves no + documentary purpose. It can be very short as it will appear on + almost every line of every method of the type; familiarity admits + brevity. Be consistent, too: if you call the receiver "c" in one + method, don't call it "cl" in another.`, + Since: "2019.1", + }, + + "ST1008": &lint.Documentation{ + Title: `A function's error value should be its last return value`, + Text: `A function's error value should be its last return value.`, + Since: `2019.1`, + }, + + "ST1011": &lint.Documentation{ + Title: `Poorly chosen name for variable of type time.Duration`, + Text: `time.Duration values represent an amount of time, which is represented +as a count of nanoseconds. An expression like 5 * time.Microsecond +yields the value 5000. It is therefore not appropriate to suffix a +variable of type time.Duration with any time unit, such as Msec or +Milli.`, + Since: `2019.1`, + }, + + "ST1012": &lint.Documentation{ + Title: `Poorly chosen name for error variable`, + Text: `Error variables that are part of an API should be called errFoo or +ErrFoo.`, + Since: "2019.1", + }, + + "ST1013": &lint.Documentation{ + Title: `Should use constants for HTTP error codes, not magic numbers`, + Text: `HTTP has a tremendous number of status codes. While some of those are +well known (200, 400, 404, 500), most of them are not. The net/http +package provides constants for all status codes that are part of the +various specifications. It is recommended to use these constants +instead of hard-coding magic numbers, to vastly improve the +readability of your code.`, + Since: "2019.1", + Options: []string{"http_status_code_whitelist"}, + }, + + "ST1015": &lint.Documentation{ + Title: `A switch's default case should be the first or last case`, + Since: "2019.1", + }, + + "ST1016": &lint.Documentation{ + Title: `Use consistent method receiver names`, + Since: "2019.1", + NonDefault: true, + }, + + "ST1017": &lint.Documentation{ + Title: `Don't use Yoda conditions`, + Text: `Yoda conditions are conditions of the kind 'if 42 == x', where the +literal is on the left side of the comparison. These are a common +idiom in languages in which assignment is an expression, to avoid bugs +of the kind 'if (x = 42)'. In Go, which doesn't allow for this kind of +bug, we prefer the more idiomatic 'if x == 42'.`, + Since: "2019.2", + }, + + "ST1018": &lint.Documentation{ + Title: `Avoid zero-width and control characters in string literals`, + Since: "2019.2", + }, +} diff --git a/vendor/honnef.co/go/tools/stylecheck/lint.go b/vendor/honnef.co/go/tools/stylecheck/lint.go new file mode 100644 index 00000000..1699d589 --- /dev/null +++ b/vendor/honnef.co/go/tools/stylecheck/lint.go @@ -0,0 +1,629 @@ +package stylecheck // import "honnef.co/go/tools/stylecheck" + +import ( + "fmt" + "go/ast" + "go/constant" + "go/token" + "go/types" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "honnef.co/go/tools/config" + "honnef.co/go/tools/internal/passes/buildssa" + . "honnef.co/go/tools/lint/lintdsl" + "honnef.co/go/tools/ssa" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/passes/inspect" + "golang.org/x/tools/go/ast/inspector" + "golang.org/x/tools/go/types/typeutil" +) + +func CheckPackageComment(pass *analysis.Pass) (interface{}, error) { + // - At least one file in a non-main package should have a package comment + // + // - The comment should be of the form + // "Package x ...". This has a slight potential for false + // positives, as multiple files can have package comments, in + // which case they get appended. But that doesn't happen a lot in + // the real world. + + if pass.Pkg.Name() == "main" { + return nil, nil + } + hasDocs := false + for _, f := range pass.Files { + if IsInTest(pass, f) { + continue + } + if f.Doc != nil && len(f.Doc.List) > 0 { + hasDocs = true + prefix := "Package " + f.Name.Name + " " + if !strings.HasPrefix(strings.TrimSpace(f.Doc.Text()), prefix) { + ReportNodef(pass, f.Doc, `package comment should be of the form "%s..."`, prefix) + } + f.Doc.Text() + } + } + + if !hasDocs { + for _, f := range pass.Files { + if IsInTest(pass, f) { + continue + } + ReportNodef(pass, f, "at least one file in a package should have a package comment") + } + } + return nil, nil +} + +func CheckDotImports(pass *analysis.Pass) (interface{}, error) { + for _, f := range pass.Files { + imports: + for _, imp := range f.Imports { + path := imp.Path.Value + path = path[1 : len(path)-1] + for _, w := range config.For(pass).DotImportWhitelist { + if w == path { + continue imports + } + } + + if imp.Name != nil && imp.Name.Name == "." && !IsInTest(pass, f) { + ReportNodefFG(pass, imp, "should not use dot imports") + } + } + } + return nil, nil +} + +func CheckBlankImports(pass *analysis.Pass) (interface{}, error) { + fset := pass.Fset + for _, f := range pass.Files { + if IsInMain(pass, f) || IsInTest(pass, f) { + continue + } + + // Collect imports of the form `import _ "foo"`, i.e. with no + // parentheses, as their comment will be associated with the + // (paren-free) GenDecl, not the import spec itself. + // + // We don't directly process the GenDecl so that we can + // correctly handle the following: + // + // import _ "foo" + // import _ "bar" + // + // where only the first import should get flagged. + skip := map[ast.Spec]bool{} + ast.Inspect(f, func(node ast.Node) bool { + switch node := node.(type) { + case *ast.File: + return true + case *ast.GenDecl: + if node.Tok != token.IMPORT { + return false + } + if node.Lparen == token.NoPos && node.Doc != nil { + skip[node.Specs[0]] = true + } + return false + } + return false + }) + for i, imp := range f.Imports { + pos := fset.Position(imp.Pos()) + + if !IsBlank(imp.Name) { + continue + } + // Only flag the first blank import in a group of imports, + // or don't flag any of them, if the first one is + // commented + if i > 0 { + prev := f.Imports[i-1] + prevPos := fset.Position(prev.Pos()) + if pos.Line-1 == prevPos.Line && IsBlank(prev.Name) { + continue + } + } + + if imp.Doc == nil && imp.Comment == nil && !skip[imp] { + ReportNodef(pass, imp, "a blank import should be only in a main or test package, or have a comment justifying it") + } + } + } + return nil, nil +} + +func CheckIncDec(pass *analysis.Pass) (interface{}, error) { + // TODO(dh): this can be noisy for function bodies that look like this: + // x += 3 + // ... + // x += 2 + // ... + // x += 1 + fn := func(node ast.Node) { + assign := node.(*ast.AssignStmt) + if assign.Tok != token.ADD_ASSIGN && assign.Tok != token.SUB_ASSIGN { + return + } + if (len(assign.Lhs) != 1 || len(assign.Rhs) != 1) || + !IsIntLiteral(assign.Rhs[0], "1") { + return + } + + suffix := "" + switch assign.Tok { + case token.ADD_ASSIGN: + suffix = "++" + case token.SUB_ASSIGN: + suffix = "--" + } + + ReportNodef(pass, assign, "should replace %s with %s%s", Render(pass, assign), Render(pass, assign.Lhs[0]), suffix) + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn) + return nil, nil +} + +func CheckErrorReturn(pass *analysis.Pass) (interface{}, error) { +fnLoop: + for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + sig := fn.Type().(*types.Signature) + rets := sig.Results() + if rets == nil || rets.Len() < 2 { + continue + } + + if rets.At(rets.Len()-1).Type() == types.Universe.Lookup("error").Type() { + // Last return type is error. If the function also returns + // errors in other positions, that's fine. + continue + } + for i := rets.Len() - 2; i >= 0; i-- { + if rets.At(i).Type() == types.Universe.Lookup("error").Type() { + pass.Reportf(rets.At(i).Pos(), "error should be returned as the last argument") + continue fnLoop + } + } + } + return nil, nil +} + +// CheckUnexportedReturn checks that exported functions on exported +// types do not return unexported types. +func CheckUnexportedReturn(pass *analysis.Pass) (interface{}, error) { + for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + if fn.Synthetic != "" || fn.Parent() != nil { + continue + } + if !ast.IsExported(fn.Name()) || IsInMain(pass, fn) || IsInTest(pass, fn) { + continue + } + sig := fn.Type().(*types.Signature) + if sig.Recv() != nil && !ast.IsExported(Dereference(sig.Recv().Type()).(*types.Named).Obj().Name()) { + continue + } + res := sig.Results() + for i := 0; i < res.Len(); i++ { + if named, ok := DereferenceR(res.At(i).Type()).(*types.Named); ok && + !ast.IsExported(named.Obj().Name()) && + named != types.Universe.Lookup("error").Type() { + pass.Reportf(fn.Pos(), "should not return unexported type") + } + } + } + return nil, nil +} + +func CheckReceiverNames(pass *analysis.Pass) (interface{}, error) { + ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg + for _, m := range ssapkg.Members { + if T, ok := m.Object().(*types.TypeName); ok && !T.IsAlias() { + ms := typeutil.IntuitiveMethodSet(T.Type(), nil) + for _, sel := range ms { + fn := sel.Obj().(*types.Func) + recv := fn.Type().(*types.Signature).Recv() + if Dereference(recv.Type()) != T.Type() { + // skip embedded methods + continue + } + if recv.Name() == "self" || recv.Name() == "this" { + ReportfFG(pass, recv.Pos(), `receiver name should be a reflection of its identity; don't use generic names such as "this" or "self"`) + } + if recv.Name() == "_" { + ReportfFG(pass, recv.Pos(), "receiver name should not be an underscore, omit the name if it is unused") + } + } + } + } + return nil, nil +} + +func CheckReceiverNamesIdentical(pass *analysis.Pass) (interface{}, error) { + ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg + for _, m := range ssapkg.Members { + names := map[string]int{} + + var firstFn *types.Func + if T, ok := m.Object().(*types.TypeName); ok && !T.IsAlias() { + ms := typeutil.IntuitiveMethodSet(T.Type(), nil) + for _, sel := range ms { + fn := sel.Obj().(*types.Func) + recv := fn.Type().(*types.Signature).Recv() + if Dereference(recv.Type()) != T.Type() { + // skip embedded methods + continue + } + if firstFn == nil { + firstFn = fn + } + if recv.Name() != "" && recv.Name() != "_" { + names[recv.Name()]++ + } + } + } + + if len(names) > 1 { + var seen []string + for name, count := range names { + seen = append(seen, fmt.Sprintf("%dx %q", count, name)) + } + + pass.Reportf(firstFn.Pos(), "methods on the same type should have the same receiver name (seen %s)", strings.Join(seen, ", ")) + } + } + return nil, nil +} + +func CheckContextFirstArg(pass *analysis.Pass) (interface{}, error) { + // TODO(dh): this check doesn't apply to test helpers. Example from the stdlib: + // func helperCommandContext(t *testing.T, ctx context.Context, s ...string) (cmd *exec.Cmd) { +fnLoop: + for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + if fn.Synthetic != "" || fn.Parent() != nil { + continue + } + params := fn.Signature.Params() + if params.Len() < 2 { + continue + } + if types.TypeString(params.At(0).Type(), nil) == "context.Context" { + continue + } + for i := 1; i < params.Len(); i++ { + param := params.At(i) + if types.TypeString(param.Type(), nil) == "context.Context" { + pass.Reportf(param.Pos(), "context.Context should be the first argument of a function") + continue fnLoop + } + } + } + return nil, nil +} + +func CheckErrorStrings(pass *analysis.Pass) (interface{}, error) { + objNames := map[*ssa.Package]map[string]bool{} + ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg + objNames[ssapkg] = map[string]bool{} + for _, m := range ssapkg.Members { + if typ, ok := m.(*ssa.Type); ok { + objNames[ssapkg][typ.Name()] = true + } + } + for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + objNames[fn.Package()][fn.Name()] = true + } + + for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { + if IsInTest(pass, fn) { + // We don't care about malformed error messages in tests; + // they're usually for direct human consumption, not part + // of an API + continue + } + for _, block := range fn.Blocks { + instrLoop: + for _, ins := range block.Instrs { + call, ok := ins.(*ssa.Call) + if !ok { + continue + } + if !IsCallTo(call.Common(), "errors.New") && !IsCallTo(call.Common(), "fmt.Errorf") { + continue + } + + k, ok := call.Common().Args[0].(*ssa.Const) + if !ok { + continue + } + + s := constant.StringVal(k.Value) + if len(s) == 0 { + continue + } + switch s[len(s)-1] { + case '.', ':', '!', '\n': + pass.Reportf(call.Pos(), "error strings should not end with punctuation or a newline") + } + idx := strings.IndexByte(s, ' ') + if idx == -1 { + // single word error message, probably not a real + // error but something used in tests or during + // debugging + continue + } + word := s[:idx] + first, n := utf8.DecodeRuneInString(word) + if !unicode.IsUpper(first) { + continue + } + for _, c := range word[n:] { + if unicode.IsUpper(c) { + // Word is probably an initialism or + // multi-word function name + continue instrLoop + } + } + + word = strings.TrimRightFunc(word, func(r rune) bool { return unicode.IsPunct(r) }) + if objNames[fn.Package()][word] { + // Word is probably the name of a function or type in this package + continue + } + // First word in error starts with a capital + // letter, and the word doesn't contain any other + // capitals, making it unlikely to be an + // initialism or multi-word function name. + // + // It could still be a proper noun, though. + + pass.Reportf(call.Pos(), "error strings should not be capitalized") + } + } + } + return nil, nil +} + +func CheckTimeNames(pass *analysis.Pass) (interface{}, error) { + suffixes := []string{ + "Sec", "Secs", "Seconds", + "Msec", "Msecs", + "Milli", "Millis", "Milliseconds", + "Usec", "Usecs", "Microseconds", + "MS", "Ms", + } + fn := func(T types.Type, names []*ast.Ident) { + if !IsType(T, "time.Duration") && !IsType(T, "*time.Duration") { + return + } + for _, name := range names { + for _, suffix := range suffixes { + if strings.HasSuffix(name.Name, suffix) { + ReportNodef(pass, name, "var %s is of type %v; don't use unit-specific suffix %q", name.Name, T, suffix) + break + } + } + } + } + for _, f := range pass.Files { + ast.Inspect(f, func(node ast.Node) bool { + switch node := node.(type) { + case *ast.ValueSpec: + T := pass.TypesInfo.TypeOf(node.Type) + fn(T, node.Names) + case *ast.FieldList: + for _, field := range node.List { + T := pass.TypesInfo.TypeOf(field.Type) + fn(T, field.Names) + } + } + return true + }) + } + return nil, nil +} + +func CheckErrorVarNames(pass *analysis.Pass) (interface{}, error) { + for _, f := range pass.Files { + for _, decl := range f.Decls { + gen, ok := decl.(*ast.GenDecl) + if !ok || gen.Tok != token.VAR { + continue + } + for _, spec := range gen.Specs { + spec := spec.(*ast.ValueSpec) + if len(spec.Names) != len(spec.Values) { + continue + } + + for i, name := range spec.Names { + val := spec.Values[i] + if !IsCallToAST(pass, val, "errors.New") && !IsCallToAST(pass, val, "fmt.Errorf") { + continue + } + + prefix := "err" + if name.IsExported() { + prefix = "Err" + } + if !strings.HasPrefix(name.Name, prefix) { + ReportNodef(pass, name, "error var %s should have name of the form %sFoo", name.Name, prefix) + } + } + } + } + } + return nil, nil +} + +var httpStatusCodes = map[int]string{ + 100: "StatusContinue", + 101: "StatusSwitchingProtocols", + 102: "StatusProcessing", + 200: "StatusOK", + 201: "StatusCreated", + 202: "StatusAccepted", + 203: "StatusNonAuthoritativeInfo", + 204: "StatusNoContent", + 205: "StatusResetContent", + 206: "StatusPartialContent", + 207: "StatusMultiStatus", + 208: "StatusAlreadyReported", + 226: "StatusIMUsed", + 300: "StatusMultipleChoices", + 301: "StatusMovedPermanently", + 302: "StatusFound", + 303: "StatusSeeOther", + 304: "StatusNotModified", + 305: "StatusUseProxy", + 307: "StatusTemporaryRedirect", + 308: "StatusPermanentRedirect", + 400: "StatusBadRequest", + 401: "StatusUnauthorized", + 402: "StatusPaymentRequired", + 403: "StatusForbidden", + 404: "StatusNotFound", + 405: "StatusMethodNotAllowed", + 406: "StatusNotAcceptable", + 407: "StatusProxyAuthRequired", + 408: "StatusRequestTimeout", + 409: "StatusConflict", + 410: "StatusGone", + 411: "StatusLengthRequired", + 412: "StatusPreconditionFailed", + 413: "StatusRequestEntityTooLarge", + 414: "StatusRequestURITooLong", + 415: "StatusUnsupportedMediaType", + 416: "StatusRequestedRangeNotSatisfiable", + 417: "StatusExpectationFailed", + 418: "StatusTeapot", + 422: "StatusUnprocessableEntity", + 423: "StatusLocked", + 424: "StatusFailedDependency", + 426: "StatusUpgradeRequired", + 428: "StatusPreconditionRequired", + 429: "StatusTooManyRequests", + 431: "StatusRequestHeaderFieldsTooLarge", + 451: "StatusUnavailableForLegalReasons", + 500: "StatusInternalServerError", + 501: "StatusNotImplemented", + 502: "StatusBadGateway", + 503: "StatusServiceUnavailable", + 504: "StatusGatewayTimeout", + 505: "StatusHTTPVersionNotSupported", + 506: "StatusVariantAlsoNegotiates", + 507: "StatusInsufficientStorage", + 508: "StatusLoopDetected", + 510: "StatusNotExtended", + 511: "StatusNetworkAuthenticationRequired", +} + +func CheckHTTPStatusCodes(pass *analysis.Pass) (interface{}, error) { + whitelist := map[string]bool{} + for _, code := range config.For(pass).HTTPStatusCodeWhitelist { + whitelist[code] = true + } + fn := func(node ast.Node) bool { + if node == nil { + return true + } + call, ok := node.(*ast.CallExpr) + if !ok { + return true + } + + var arg int + switch CallNameAST(pass, call) { + case "net/http.Error": + arg = 2 + case "net/http.Redirect": + arg = 3 + case "net/http.StatusText": + arg = 0 + case "net/http.RedirectHandler": + arg = 1 + default: + return true + } + lit, ok := call.Args[arg].(*ast.BasicLit) + if !ok { + return true + } + if whitelist[lit.Value] { + return true + } + + n, err := strconv.Atoi(lit.Value) + if err != nil { + return true + } + s, ok := httpStatusCodes[n] + if !ok { + return true + } + ReportNodefFG(pass, lit, "should use constant http.%s instead of numeric literal %d", s, n) + return true + } + // OPT(dh): replace with inspector + for _, f := range pass.Files { + ast.Inspect(f, fn) + } + return nil, nil +} + +func CheckDefaultCaseOrder(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + stmt := node.(*ast.SwitchStmt) + list := stmt.Body.List + for i, c := range list { + if c.(*ast.CaseClause).List == nil && i != 0 && i != len(list)-1 { + ReportNodefFG(pass, c, "default case should be first or last in switch statement") + break + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.SwitchStmt)(nil)}, fn) + return nil, nil +} + +func CheckYodaConditions(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + cond := node.(*ast.BinaryExpr) + if cond.Op != token.EQL && cond.Op != token.NEQ { + return + } + if _, ok := cond.X.(*ast.BasicLit); !ok { + return + } + if _, ok := cond.Y.(*ast.BasicLit); ok { + // Don't flag lit == lit conditions, just in case + return + } + ReportNodefFG(pass, cond, "don't use Yoda conditions") + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) + return nil, nil +} + +func CheckInvisibleCharacters(pass *analysis.Pass) (interface{}, error) { + fn := func(node ast.Node) { + lit := node.(*ast.BasicLit) + if lit.Kind != token.STRING { + return + } + for _, r := range lit.Value { + if unicode.Is(unicode.Cf, r) { + ReportNodef(pass, lit, "string literal contains the Unicode format character %U, consider using the %q escape sequence", r, r) + } else if unicode.Is(unicode.Cc, r) && r != '\n' && r != '\t' && r != '\r' { + ReportNodef(pass, lit, "string literal contains the Unicode control character %U, consider using the %q escape sequence", r, r) + } + } + } + pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BasicLit)(nil)}, fn) + return nil, nil +} diff --git a/vendor/honnef.co/go/tools/stylecheck/names.go b/vendor/honnef.co/go/tools/stylecheck/names.go new file mode 100644 index 00000000..160f9d7f --- /dev/null +++ b/vendor/honnef.co/go/tools/stylecheck/names.go @@ -0,0 +1,264 @@ +// Copyright (c) 2013 The Go Authors. All rights reserved. +// Copyright (c) 2018 Dominik Honnef. All rights reserved. + +package stylecheck + +import ( + "go/ast" + "go/token" + "strings" + "unicode" + + "golang.org/x/tools/go/analysis" + "honnef.co/go/tools/config" + . "honnef.co/go/tools/lint/lintdsl" +) + +// knownNameExceptions is a set of names that are known to be exempt from naming checks. +// This is usually because they are constrained by having to match names in the +// standard library. +var knownNameExceptions = map[string]bool{ + "LastInsertId": true, // must match database/sql + "kWh": true, +} + +func CheckNames(pass *analysis.Pass) (interface{}, error) { + // A large part of this function is copied from + // github.com/golang/lint, Copyright (c) 2013 The Go Authors, + // licensed under the BSD 3-clause license. + + allCaps := func(s string) bool { + for _, r := range s { + if !((r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '_') { + return false + } + } + return true + } + + check := func(id *ast.Ident, thing string, initialisms map[string]bool) { + if id.Name == "_" { + return + } + if knownNameExceptions[id.Name] { + return + } + + // Handle two common styles from other languages that don't belong in Go. + if len(id.Name) >= 5 && allCaps(id.Name) && strings.Contains(id.Name, "_") { + ReportfFG(pass, id.Pos(), "should not use ALL_CAPS in Go names; use CamelCase instead") + return + } + + should := lintName(id.Name, initialisms) + if id.Name == should { + return + } + + if len(id.Name) > 2 && strings.Contains(id.Name[1:len(id.Name)-1], "_") { + ReportfFG(pass, id.Pos(), "should not use underscores in Go names; %s %s should be %s", thing, id.Name, should) + return + } + ReportfFG(pass, id.Pos(), "%s %s should be %s", thing, id.Name, should) + } + checkList := func(fl *ast.FieldList, thing string, initialisms map[string]bool) { + if fl == nil { + return + } + for _, f := range fl.List { + for _, id := range f.Names { + check(id, thing, initialisms) + } + } + } + + il := config.For(pass).Initialisms + initialisms := make(map[string]bool, len(il)) + for _, word := range il { + initialisms[word] = true + } + for _, f := range pass.Files { + // Package names need slightly different handling than other names. + if !strings.HasSuffix(f.Name.Name, "_test") && strings.Contains(f.Name.Name, "_") { + ReportfFG(pass, f.Pos(), "should not use underscores in package names") + } + if strings.IndexFunc(f.Name.Name, unicode.IsUpper) != -1 { + ReportfFG(pass, f.Pos(), "should not use MixedCaps in package name; %s should be %s", f.Name.Name, strings.ToLower(f.Name.Name)) + } + + ast.Inspect(f, func(node ast.Node) bool { + switch v := node.(type) { + case *ast.AssignStmt: + if v.Tok != token.DEFINE { + return true + } + for _, exp := range v.Lhs { + if id, ok := exp.(*ast.Ident); ok { + check(id, "var", initialisms) + } + } + case *ast.FuncDecl: + // Functions with no body are defined elsewhere (in + // assembly, or via go:linkname). These are likely to + // be something very low level (such as the runtime), + // where our rules don't apply. + if v.Body == nil { + return true + } + + if IsInTest(pass, v) && (strings.HasPrefix(v.Name.Name, "Example") || strings.HasPrefix(v.Name.Name, "Test") || strings.HasPrefix(v.Name.Name, "Benchmark")) { + return true + } + + thing := "func" + if v.Recv != nil { + thing = "method" + } + + if !isTechnicallyExported(v) { + check(v.Name, thing, initialisms) + } + + checkList(v.Type.Params, thing+" parameter", initialisms) + checkList(v.Type.Results, thing+" result", initialisms) + case *ast.GenDecl: + if v.Tok == token.IMPORT { + return true + } + var thing string + switch v.Tok { + case token.CONST: + thing = "const" + case token.TYPE: + thing = "type" + case token.VAR: + thing = "var" + } + for _, spec := range v.Specs { + switch s := spec.(type) { + case *ast.TypeSpec: + check(s.Name, thing, initialisms) + case *ast.ValueSpec: + for _, id := range s.Names { + check(id, thing, initialisms) + } + } + } + case *ast.InterfaceType: + // Do not check interface method names. + // They are often constrainted by the method names of concrete types. + for _, x := range v.Methods.List { + ft, ok := x.Type.(*ast.FuncType) + if !ok { // might be an embedded interface name + continue + } + checkList(ft.Params, "interface method parameter", initialisms) + checkList(ft.Results, "interface method result", initialisms) + } + case *ast.RangeStmt: + if v.Tok == token.ASSIGN { + return true + } + if id, ok := v.Key.(*ast.Ident); ok { + check(id, "range var", initialisms) + } + if id, ok := v.Value.(*ast.Ident); ok { + check(id, "range var", initialisms) + } + case *ast.StructType: + for _, f := range v.Fields.List { + for _, id := range f.Names { + check(id, "struct field", initialisms) + } + } + } + return true + }) + } + return nil, nil +} + +// lintName returns a different name if it should be different. +func lintName(name string, initialisms map[string]bool) (should string) { + // A large part of this function is copied from + // github.com/golang/lint, Copyright (c) 2013 The Go Authors, + // licensed under the BSD 3-clause license. + + // Fast path for simple cases: "_" and all lowercase. + if name == "_" { + return name + } + if strings.IndexFunc(name, func(r rune) bool { return !unicode.IsLower(r) }) == -1 { + return name + } + + // Split camelCase at any lower->upper transition, and split on underscores. + // Check each word for common initialisms. + runes := []rune(name) + w, i := 0, 0 // index of start of word, scan + for i+1 <= len(runes) { + eow := false // whether we hit the end of a word + if i+1 == len(runes) { + eow = true + } else if runes[i+1] == '_' && i+1 != len(runes)-1 { + // underscore; shift the remainder forward over any run of underscores + eow = true + n := 1 + for i+n+1 < len(runes) && runes[i+n+1] == '_' { + n++ + } + + // Leave at most one underscore if the underscore is between two digits + if i+n+1 < len(runes) && unicode.IsDigit(runes[i]) && unicode.IsDigit(runes[i+n+1]) { + n-- + } + + copy(runes[i+1:], runes[i+n+1:]) + runes = runes[:len(runes)-n] + } else if unicode.IsLower(runes[i]) && !unicode.IsLower(runes[i+1]) { + // lower->non-lower + eow = true + } + i++ + if !eow { + continue + } + + // [w,i) is a word. + word := string(runes[w:i]) + if u := strings.ToUpper(word); initialisms[u] { + // Keep consistent case, which is lowercase only at the start. + if w == 0 && unicode.IsLower(runes[w]) { + u = strings.ToLower(u) + } + // All the common initialisms are ASCII, + // so we can replace the bytes exactly. + // TODO(dh): this won't be true once we allow custom initialisms + copy(runes[w:], []rune(u)) + } else if w > 0 && strings.ToLower(word) == word { + // already all lowercase, and not the first word, so uppercase the first character. + runes[w] = unicode.ToUpper(runes[w]) + } + w = i + } + return string(runes) +} + +func isTechnicallyExported(f *ast.FuncDecl) bool { + if f.Recv != nil || f.Doc == nil { + return false + } + + const export = "//export " + const linkname = "//go:linkname " + for _, c := range f.Doc.List { + if strings.HasPrefix(c.Text, export) && len(c.Text) == len(export)+len(f.Name.Name) && c.Text[len(export):] == f.Name.Name { + return true + } + + if strings.HasPrefix(c.Text, linkname) { + return true + } + } + return false +} diff --git a/vendor/honnef.co/go/tools/unused/edge.go b/vendor/honnef.co/go/tools/unused/edge.go new file mode 100644 index 00000000..02e0d09c --- /dev/null +++ b/vendor/honnef.co/go/tools/unused/edge.go @@ -0,0 +1,54 @@ +package unused + +//go:generate stringer -type edgeKind +type edgeKind uint64 + +func (e edgeKind) is(o edgeKind) bool { + return e&o != 0 +} + +const ( + edgeAlias edgeKind = 1 << iota + edgeBlankField + edgeAnonymousStruct + edgeCgoExported + edgeConstGroup + edgeElementType + edgeEmbeddedInterface + edgeExportedConstant + edgeExportedField + edgeExportedFunction + edgeExportedMethod + edgeExportedType + edgeExportedVariable + edgeExtendsExportedFields + edgeExtendsExportedMethodSet + edgeFieldAccess + edgeFunctionArgument + edgeFunctionResult + edgeFunctionSignature + edgeImplements + edgeInstructionOperand + edgeInterfaceCall + edgeInterfaceMethod + edgeKeyType + edgeLinkname + edgeMainFunction + edgeNamedType + edgeNetRPCRegister + edgeNoCopySentinel + edgeProvidesMethod + edgeReceiver + edgeRuntimeFunction + edgeSignature + edgeStructConversion + edgeTestSink + edgeTupleElement + edgeType + edgeTypeName + edgeUnderlyingType + edgePointerType + edgeUnsafeConversion + edgeUsedConstant + edgeVarDecl +) diff --git a/vendor/honnef.co/go/tools/unused/edgekind_string.go b/vendor/honnef.co/go/tools/unused/edgekind_string.go new file mode 100644 index 00000000..7629636c --- /dev/null +++ b/vendor/honnef.co/go/tools/unused/edgekind_string.go @@ -0,0 +1,109 @@ +// Code generated by "stringer -type edgeKind"; DO NOT EDIT. + +package unused + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[edgeAlias-1] + _ = x[edgeBlankField-2] + _ = x[edgeAnonymousStruct-4] + _ = x[edgeCgoExported-8] + _ = x[edgeConstGroup-16] + _ = x[edgeElementType-32] + _ = x[edgeEmbeddedInterface-64] + _ = x[edgeExportedConstant-128] + _ = x[edgeExportedField-256] + _ = x[edgeExportedFunction-512] + _ = x[edgeExportedMethod-1024] + _ = x[edgeExportedType-2048] + _ = x[edgeExportedVariable-4096] + _ = x[edgeExtendsExportedFields-8192] + _ = x[edgeExtendsExportedMethodSet-16384] + _ = x[edgeFieldAccess-32768] + _ = x[edgeFunctionArgument-65536] + _ = x[edgeFunctionResult-131072] + _ = x[edgeFunctionSignature-262144] + _ = x[edgeImplements-524288] + _ = x[edgeInstructionOperand-1048576] + _ = x[edgeInterfaceCall-2097152] + _ = x[edgeInterfaceMethod-4194304] + _ = x[edgeKeyType-8388608] + _ = x[edgeLinkname-16777216] + _ = x[edgeMainFunction-33554432] + _ = x[edgeNamedType-67108864] + _ = x[edgeNetRPCRegister-134217728] + _ = x[edgeNoCopySentinel-268435456] + _ = x[edgeProvidesMethod-536870912] + _ = x[edgeReceiver-1073741824] + _ = x[edgeRuntimeFunction-2147483648] + _ = x[edgeSignature-4294967296] + _ = x[edgeStructConversion-8589934592] + _ = x[edgeTestSink-17179869184] + _ = x[edgeTupleElement-34359738368] + _ = x[edgeType-68719476736] + _ = x[edgeTypeName-137438953472] + _ = x[edgeUnderlyingType-274877906944] + _ = x[edgePointerType-549755813888] + _ = x[edgeUnsafeConversion-1099511627776] + _ = x[edgeUsedConstant-2199023255552] + _ = x[edgeVarDecl-4398046511104] +} + +const _edgeKind_name = "edgeAliasedgeBlankFieldedgeAnonymousStructedgeCgoExportededgeConstGroupedgeElementTypeedgeEmbeddedInterfaceedgeExportedConstantedgeExportedFieldedgeExportedFunctionedgeExportedMethodedgeExportedTypeedgeExportedVariableedgeExtendsExportedFieldsedgeExtendsExportedMethodSetedgeFieldAccessedgeFunctionArgumentedgeFunctionResultedgeFunctionSignatureedgeImplementsedgeInstructionOperandedgeInterfaceCalledgeInterfaceMethodedgeKeyTypeedgeLinknameedgeMainFunctionedgeNamedTypeedgeNetRPCRegisteredgeNoCopySentineledgeProvidesMethodedgeReceiveredgeRuntimeFunctionedgeSignatureedgeStructConversionedgeTestSinkedgeTupleElementedgeTypeedgeTypeNameedgeUnderlyingTypeedgePointerTypeedgeUnsafeConversionedgeUsedConstantedgeVarDecl" + +var _edgeKind_map = map[edgeKind]string{ + 1: _edgeKind_name[0:9], + 2: _edgeKind_name[9:23], + 4: _edgeKind_name[23:42], + 8: _edgeKind_name[42:57], + 16: _edgeKind_name[57:71], + 32: _edgeKind_name[71:86], + 64: _edgeKind_name[86:107], + 128: _edgeKind_name[107:127], + 256: _edgeKind_name[127:144], + 512: _edgeKind_name[144:164], + 1024: _edgeKind_name[164:182], + 2048: _edgeKind_name[182:198], + 4096: _edgeKind_name[198:218], + 8192: _edgeKind_name[218:243], + 16384: _edgeKind_name[243:271], + 32768: _edgeKind_name[271:286], + 65536: _edgeKind_name[286:306], + 131072: _edgeKind_name[306:324], + 262144: _edgeKind_name[324:345], + 524288: _edgeKind_name[345:359], + 1048576: _edgeKind_name[359:381], + 2097152: _edgeKind_name[381:398], + 4194304: _edgeKind_name[398:417], + 8388608: _edgeKind_name[417:428], + 16777216: _edgeKind_name[428:440], + 33554432: _edgeKind_name[440:456], + 67108864: _edgeKind_name[456:469], + 134217728: _edgeKind_name[469:487], + 268435456: _edgeKind_name[487:505], + 536870912: _edgeKind_name[505:523], + 1073741824: _edgeKind_name[523:535], + 2147483648: _edgeKind_name[535:554], + 4294967296: _edgeKind_name[554:567], + 8589934592: _edgeKind_name[567:587], + 17179869184: _edgeKind_name[587:599], + 34359738368: _edgeKind_name[599:615], + 68719476736: _edgeKind_name[615:623], + 137438953472: _edgeKind_name[623:635], + 274877906944: _edgeKind_name[635:653], + 549755813888: _edgeKind_name[653:668], + 1099511627776: _edgeKind_name[668:688], + 2199023255552: _edgeKind_name[688:704], + 4398046511104: _edgeKind_name[704:715], +} + +func (i edgeKind) String() string { + if str, ok := _edgeKind_map[i]; ok { + return str + } + return "edgeKind(" + strconv.FormatInt(int64(i), 10) + ")" +} diff --git a/vendor/honnef.co/go/tools/unused/implements.go b/vendor/honnef.co/go/tools/unused/implements.go new file mode 100644 index 00000000..835baac6 --- /dev/null +++ b/vendor/honnef.co/go/tools/unused/implements.go @@ -0,0 +1,82 @@ +package unused + +import "go/types" + +// lookupMethod returns the index of and method with matching package and name, or (-1, nil). +func lookupMethod(T *types.Interface, pkg *types.Package, name string) (int, *types.Func) { + if name != "_" { + for i := 0; i < T.NumMethods(); i++ { + m := T.Method(i) + if sameId(m, pkg, name) { + return i, m + } + } + } + return -1, nil +} + +func sameId(obj types.Object, pkg *types.Package, name string) bool { + // spec: + // "Two identifiers are different if they are spelled differently, + // or if they appear in different packages and are not exported. + // Otherwise, they are the same." + if name != obj.Name() { + return false + } + // obj.Name == name + if obj.Exported() { + return true + } + // not exported, so packages must be the same (pkg == nil for + // fields in Universe scope; this can only happen for types + // introduced via Eval) + if pkg == nil || obj.Pkg() == nil { + return pkg == obj.Pkg() + } + // pkg != nil && obj.pkg != nil + return pkg.Path() == obj.Pkg().Path() +} + +func (g *Graph) implements(V types.Type, T *types.Interface, msV *types.MethodSet) ([]*types.Selection, bool) { + // fast path for common case + if T.Empty() { + return nil, true + } + + if ityp, _ := V.Underlying().(*types.Interface); ityp != nil { + // TODO(dh): is this code reachable? + for i := 0; i < T.NumMethods(); i++ { + m := T.Method(i) + _, obj := lookupMethod(ityp, m.Pkg(), m.Name()) + switch { + case obj == nil: + return nil, false + case !types.Identical(obj.Type(), m.Type()): + return nil, false + } + } + return nil, true + } + + // A concrete type implements T if it implements all methods of T. + var sels []*types.Selection + for i := 0; i < T.NumMethods(); i++ { + m := T.Method(i) + sel := msV.Lookup(m.Pkg(), m.Name()) + if sel == nil { + return nil, false + } + + f, _ := sel.Obj().(*types.Func) + if f == nil { + return nil, false + } + + if !types.Identical(f.Type(), m.Type()) { + return nil, false + } + + sels = append(sels, sel) + } + return sels, true +} diff --git a/vendor/honnef.co/go/tools/unused/unused.go b/vendor/honnef.co/go/tools/unused/unused.go new file mode 100644 index 00000000..152d3692 --- /dev/null +++ b/vendor/honnef.co/go/tools/unused/unused.go @@ -0,0 +1,1964 @@ +package unused + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "io" + "strings" + "sync" + "sync/atomic" + + "golang.org/x/tools/go/analysis" + "honnef.co/go/tools/go/types/typeutil" + "honnef.co/go/tools/internal/passes/buildssa" + "honnef.co/go/tools/lint" + "honnef.co/go/tools/lint/lintdsl" + "honnef.co/go/tools/ssa" +) + +// The graph we construct omits nodes along a path that do not +// contribute any new information to the solution. For example, the +// full graph for a function with a receiver would be Func -> +// Signature -> Var -> Type. However, since signatures cannot be +// unused, and receivers are always considered used, we can compact +// the graph down to Func -> Type. This makes the graph smaller, but +// harder to debug. + +// TODO(dh): conversions between structs mark fields as used, but the +// conversion itself isn't part of that subgraph. even if the function +// containing the conversion is unused, the fields will be marked as +// used. + +// TODO(dh): we cannot observe function calls in assembly files. + +/* + +- packages use: + - (1.1) exported named types (unless in package main) + - (1.2) exported functions (unless in package main) + - (1.3) exported variables (unless in package main) + - (1.4) exported constants (unless in package main) + - (1.5) init functions + - (1.6) functions exported to cgo + - (1.7) the main function iff in the main package + - (1.8) symbols linked via go:linkname + +- named types use: + - (2.1) exported methods + - (2.2) the type they're based on + - (2.3) all their aliases. we can't easily track uses of aliases + because go/types turns them into uses of the aliased types. assume + that if a type is used, so are all of its aliases. + - (2.4) the pointer type. this aids with eagerly implementing + interfaces. if a method that implements an interface is defined on + a pointer receiver, and the pointer type is never used, but the + named type is, then we still want to mark the method as used. + +- variables and constants use: + - their types + +- functions use: + - (4.1) all their arguments, return parameters and receivers + - (4.2) anonymous functions defined beneath them + - (4.3) closures and bound methods. + this implements a simplified model where a function is used merely by being referenced, even if it is never called. + that way we don't have to keep track of closures escaping functions. + - (4.4) functions they return. we assume that someone else will call the returned function + - (4.5) functions/interface methods they call + - types they instantiate or convert to + - (4.7) fields they access + - (4.8) types of all instructions + - (4.9) package-level variables they assign to iff in tests (sinks for benchmarks) + +- conversions use: + - (5.1) when converting between two equivalent structs, the fields in + either struct use each other. the fields are relevant for the + conversion, but only if the fields are also accessed outside the + conversion. + - (5.2) when converting to or from unsafe.Pointer, mark all fields as used. + +- structs use: + - (6.1) fields of type NoCopy sentinel + - (6.2) exported fields + - (6.3) embedded fields that help implement interfaces (either fully implements it, or contributes required methods) (recursively) + - (6.4) embedded fields that have exported methods (recursively) + - (6.5) embedded structs that have exported fields (recursively) + +- (7.1) field accesses use fields +- (7.2) fields use their types + +- (8.0) How we handle interfaces: + - (8.1) We do not technically care about interfaces that only consist of + exported methods. Exported methods on concrete types are always + marked as used. + - Any concrete type implements all known interfaces. Even if it isn't + assigned to any interfaces in our code, the user may receive a value + of the type and expect to pass it back to us through an interface. + + Concrete types use their methods that implement interfaces. If the + type is used, it uses those methods. Otherwise, it doesn't. This + way, types aren't incorrectly marked reachable through the edge + from method to type. + + - (8.3) All interface methods are marked as used, even if they never get + called. This is to accomodate sum types (unexported interface + method that must exist but never gets called.) + + - (8.4) All embedded interfaces are marked as used. This is an + extension of 8.3, but we have to explicitly track embedded + interfaces because in a chain C->B->A, B wouldn't be marked as + used by 8.3 just because it contributes A's methods to C. + +- Inherent uses: + - thunks and other generated wrappers call the real function + - (9.2) variables use their types + - (9.3) types use their underlying and element types + - (9.4) conversions use the type they convert to + - (9.5) instructions use their operands + - (9.6) instructions use their operands' types + - (9.7) variable _reads_ use variables, writes do not, except in tests + - (9.8) runtime functions that may be called from user code via the compiler + + +- const groups: + (10.1) if one constant out of a block of constants is used, mark all + of them used. a lot of the time, unused constants exist for the sake + of completeness. See also + https://github.com/dominikh/go-tools/issues/365 + + +- (11.1) anonymous struct types use all their fields. we cannot + deduplicate struct types, as that leads to order-dependent + reportings. we can't not deduplicate struct types while still + tracking fields, because then each instance of the unnamed type in + the data flow chain will get its own fields, causing false + positives. Thus, we only accurately track fields of named struct + types, and assume that unnamed struct types use all their fields. + + +- Differences in whole program mode: + - (e2) types aim to implement all exported interfaces from all packages + - (e3) exported identifiers aren't automatically used. for fields and + methods this poses extra issues due to reflection. We assume + that all exported fields are used. We also maintain a list of + known reflection-based method callers. + +*/ + +func assert(b bool) { + if !b { + panic("failed assertion") + } +} + +func typString(obj types.Object) string { + switch obj := obj.(type) { + case *types.Func: + return "func" + case *types.Var: + if obj.IsField() { + return "field" + } + return "var" + case *types.Const: + return "const" + case *types.TypeName: + return "type" + default: + return "identifier" + } +} + +// /usr/lib/go/src/runtime/proc.go:433:6: func badmorestackg0 is unused (U1000) + +// Functions defined in the Go runtime that may be called through +// compiler magic or via assembly. +var runtimeFuncs = map[string]bool{ + // The first part of the list is copied from + // cmd/compile/internal/gc/builtin.go, var runtimeDecls + "newobject": true, + "panicindex": true, + "panicslice": true, + "panicdivide": true, + "panicmakeslicelen": true, + "throwinit": true, + "panicwrap": true, + "gopanic": true, + "gorecover": true, + "goschedguarded": true, + "printbool": true, + "printfloat": true, + "printint": true, + "printhex": true, + "printuint": true, + "printcomplex": true, + "printstring": true, + "printpointer": true, + "printiface": true, + "printeface": true, + "printslice": true, + "printnl": true, + "printsp": true, + "printlock": true, + "printunlock": true, + "concatstring2": true, + "concatstring3": true, + "concatstring4": true, + "concatstring5": true, + "concatstrings": true, + "cmpstring": true, + "intstring": true, + "slicebytetostring": true, + "slicebytetostringtmp": true, + "slicerunetostring": true, + "stringtoslicebyte": true, + "stringtoslicerune": true, + "slicecopy": true, + "slicestringcopy": true, + "decoderune": true, + "countrunes": true, + "convI2I": true, + "convT16": true, + "convT32": true, + "convT64": true, + "convTstring": true, + "convTslice": true, + "convT2E": true, + "convT2Enoptr": true, + "convT2I": true, + "convT2Inoptr": true, + "assertE2I": true, + "assertE2I2": true, + "assertI2I": true, + "assertI2I2": true, + "panicdottypeE": true, + "panicdottypeI": true, + "panicnildottype": true, + "ifaceeq": true, + "efaceeq": true, + "fastrand": true, + "makemap64": true, + "makemap": true, + "makemap_small": true, + "mapaccess1": true, + "mapaccess1_fast32": true, + "mapaccess1_fast64": true, + "mapaccess1_faststr": true, + "mapaccess1_fat": true, + "mapaccess2": true, + "mapaccess2_fast32": true, + "mapaccess2_fast64": true, + "mapaccess2_faststr": true, + "mapaccess2_fat": true, + "mapassign": true, + "mapassign_fast32": true, + "mapassign_fast32ptr": true, + "mapassign_fast64": true, + "mapassign_fast64ptr": true, + "mapassign_faststr": true, + "mapiterinit": true, + "mapdelete": true, + "mapdelete_fast32": true, + "mapdelete_fast64": true, + "mapdelete_faststr": true, + "mapiternext": true, + "mapclear": true, + "makechan64": true, + "makechan": true, + "chanrecv1": true, + "chanrecv2": true, + "chansend1": true, + "closechan": true, + "writeBarrier": true, + "typedmemmove": true, + "typedmemclr": true, + "typedslicecopy": true, + "selectnbsend": true, + "selectnbrecv": true, + "selectnbrecv2": true, + "selectsetpc": true, + "selectgo": true, + "block": true, + "makeslice": true, + "makeslice64": true, + "growslice": true, + "memmove": true, + "memclrNoHeapPointers": true, + "memclrHasPointers": true, + "memequal": true, + "memequal8": true, + "memequal16": true, + "memequal32": true, + "memequal64": true, + "memequal128": true, + "int64div": true, + "uint64div": true, + "int64mod": true, + "uint64mod": true, + "float64toint64": true, + "float64touint64": true, + "float64touint32": true, + "int64tofloat64": true, + "uint64tofloat64": true, + "uint32tofloat64": true, + "complex128div": true, + "racefuncenter": true, + "racefuncenterfp": true, + "racefuncexit": true, + "raceread": true, + "racewrite": true, + "racereadrange": true, + "racewriterange": true, + "msanread": true, + "msanwrite": true, + "x86HasPOPCNT": true, + "x86HasSSE41": true, + "arm64HasATOMICS": true, + + // The second part of the list is extracted from assembly code in + // the standard library, with the exception of the runtime package itself + "abort": true, + "aeshashbody": true, + "args": true, + "asminit": true, + "badctxt": true, + "badmcall2": true, + "badmcall": true, + "badmorestackg0": true, + "badmorestackgsignal": true, + "badsignal2": true, + "callbackasm1": true, + "callCfunction": true, + "cgocallback_gofunc": true, + "cgocallbackg": true, + "checkgoarm": true, + "check": true, + "debugCallCheck": true, + "debugCallWrap": true, + "emptyfunc": true, + "entersyscall": true, + "exit": true, + "exits": true, + "exitsyscall": true, + "externalthreadhandler": true, + "findnull": true, + "goexit1": true, + "gostring": true, + "i386_set_ldt": true, + "_initcgo": true, + "init_thread_tls": true, + "ldt0setup": true, + "libpreinit": true, + "load_g": true, + "morestack": true, + "mstart": true, + "nacl_sysinfo": true, + "nanotimeQPC": true, + "nanotime": true, + "newosproc0": true, + "newproc": true, + "newstack": true, + "noted": true, + "nowQPC": true, + "osinit": true, + "printf": true, + "racecallback": true, + "reflectcallmove": true, + "reginit": true, + "rt0_go": true, + "save_g": true, + "schedinit": true, + "setldt": true, + "settls": true, + "sighandler": true, + "sigprofNonGo": true, + "sigtrampgo": true, + "_sigtramp": true, + "sigtramp": true, + "stackcheck": true, + "syscall_chdir": true, + "syscall_chroot": true, + "syscall_close": true, + "syscall_dup2": true, + "syscall_execve": true, + "syscall_exit": true, + "syscall_fcntl": true, + "syscall_forkx": true, + "syscall_gethostname": true, + "syscall_getpid": true, + "syscall_ioctl": true, + "syscall_pipe": true, + "syscall_rawsyscall6": true, + "syscall_rawSyscall6": true, + "syscall_rawsyscall": true, + "syscall_RawSyscall": true, + "syscall_rawsysvicall6": true, + "syscall_setgid": true, + "syscall_setgroups": true, + "syscall_setpgid": true, + "syscall_setsid": true, + "syscall_setuid": true, + "syscall_syscall6": true, + "syscall_syscall": true, + "syscall_Syscall": true, + "syscall_sysvicall6": true, + "syscall_wait4": true, + "syscall_write": true, + "traceback": true, + "tstart": true, + "usplitR0": true, + "wbBufFlush": true, + "write": true, +} + +type pkg struct { + Fset *token.FileSet + Files []*ast.File + Pkg *types.Package + TypesInfo *types.Info + TypesSizes types.Sizes + SSA *ssa.Package + SrcFuncs []*ssa.Function +} + +type Checker struct { + WholeProgram bool + Debug io.Writer + + mu sync.Mutex + initialPackages map[*types.Package]struct{} + allPackages map[*types.Package]struct{} + graph *Graph +} + +func NewChecker(wholeProgram bool) *Checker { + return &Checker{ + initialPackages: map[*types.Package]struct{}{}, + allPackages: map[*types.Package]struct{}{}, + WholeProgram: wholeProgram, + } +} + +func (c *Checker) Analyzer() *analysis.Analyzer { + name := "U1000" + if c.WholeProgram { + name = "U1001" + } + return &analysis.Analyzer{ + Name: name, + Doc: "Unused code", + Run: c.Run, + Requires: []*analysis.Analyzer{buildssa.Analyzer}, + } +} + +func (c *Checker) Run(pass *analysis.Pass) (interface{}, error) { + c.mu.Lock() + if c.graph == nil { + c.graph = NewGraph() + c.graph.wholeProgram = c.WholeProgram + c.graph.fset = pass.Fset + } + + var visit func(pkg *types.Package) + visit = func(pkg *types.Package) { + if _, ok := c.allPackages[pkg]; ok { + return + } + c.allPackages[pkg] = struct{}{} + for _, imp := range pkg.Imports() { + visit(imp) + } + } + visit(pass.Pkg) + + c.initialPackages[pass.Pkg] = struct{}{} + c.mu.Unlock() + + ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA) + pkg := &pkg{ + Fset: pass.Fset, + Files: pass.Files, + Pkg: pass.Pkg, + TypesInfo: pass.TypesInfo, + TypesSizes: pass.TypesSizes, + SSA: ssapkg.Pkg, + SrcFuncs: ssapkg.SrcFuncs, + } + + c.processPkg(c.graph, pkg) + + return nil, nil +} + +func (c *Checker) ProblemObject(fset *token.FileSet, obj types.Object) lint.Problem { + name := obj.Name() + if sig, ok := obj.Type().(*types.Signature); ok && sig.Recv() != nil { + switch sig.Recv().Type().(type) { + case *types.Named, *types.Pointer: + typ := types.TypeString(sig.Recv().Type(), func(*types.Package) string { return "" }) + if len(typ) > 0 && typ[0] == '*' { + name = fmt.Sprintf("(%s).%s", typ, obj.Name()) + } else if len(typ) > 0 { + name = fmt.Sprintf("%s.%s", typ, obj.Name()) + } + } + } + + checkName := "U1000" + if c.WholeProgram { + checkName = "U1001" + } + return lint.Problem{ + Pos: lint.DisplayPosition(fset, obj.Pos()), + Message: fmt.Sprintf("%s %s is unused", typString(obj), name), + Check: checkName, + } +} + +func (c *Checker) Result() []types.Object { + out := c.results() + + out2 := make([]types.Object, 0, len(out)) + for _, v := range out { + if _, ok := c.initialPackages[v.Pkg()]; !ok { + continue + } + out2 = append(out2, v) + } + + return out2 +} + +func (c *Checker) debugf(f string, v ...interface{}) { + if c.Debug != nil { + fmt.Fprintf(c.Debug, f, v...) + } +} + +func (graph *Graph) quieten(node *Node) { + if node.seen { + return + } + switch obj := node.obj.(type) { + case *types.Named: + for i := 0; i < obj.NumMethods(); i++ { + m := obj.Method(i) + if node, ok := graph.nodeMaybe(m); ok { + node.quiet = true + } + } + case *types.Struct: + for i := 0; i < obj.NumFields(); i++ { + if node, ok := graph.nodeMaybe(obj.Field(i)); ok { + node.quiet = true + } + } + case *types.Interface: + for i := 0; i < obj.NumExplicitMethods(); i++ { + m := obj.ExplicitMethod(i) + if node, ok := graph.nodeMaybe(m); ok { + node.quiet = true + } + } + } +} + +func (c *Checker) results() []types.Object { + if c.graph == nil { + // We never analyzed any packages + return nil + } + + var out []types.Object + + if c.WholeProgram { + var ifaces []*types.Interface + var notIfaces []types.Type + + // implement as many interfaces as possible + c.graph.seenTypes.Iterate(func(t types.Type, _ interface{}) { + switch t := t.(type) { + case *types.Interface: + if t.NumMethods() > 0 { + ifaces = append(ifaces, t) + } + default: + if _, ok := t.Underlying().(*types.Interface); !ok { + notIfaces = append(notIfaces, t) + } + } + }) + + for pkg := range c.allPackages { + for _, iface := range interfacesFromExportData(pkg) { + if iface.NumMethods() > 0 { + ifaces = append(ifaces, iface) + } + } + } + + ctx := &context{ + g: c.graph, + seenTypes: &c.graph.seenTypes, + } + // (8.0) handle interfaces + // (e2) types aim to implement all exported interfaces from all packages + for _, t := range notIfaces { + // OPT(dh): it is unfortunate that we do not have access + // to a populated method set at this point. + ms := types.NewMethodSet(t) + for _, iface := range ifaces { + if sels, ok := c.graph.implements(t, iface, ms); ok { + for _, sel := range sels { + c.graph.useMethod(ctx, t, sel, t, edgeImplements) + } + } + } + } + } + + if c.Debug != nil { + debugNode := func(node *Node) { + if node.obj == nil { + c.debugf("n%d [label=\"Root\"];\n", node.id) + } else { + c.debugf("n%d [label=%q];\n", node.id, fmt.Sprintf("(%T) %s", node.obj, node.obj)) + } + for _, e := range node.used { + for i := edgeKind(1); i < 64; i++ { + if e.kind.is(1 << i) { + c.debugf("n%d -> n%d [label=%q];\n", node.id, e.node.id, edgeKind(1< 1 { + cg := &ConstGroup{} + ctx.see(cg) + for _, spec := range specs { + for _, name := range spec.(*ast.ValueSpec).Names { + obj := pkg.TypesInfo.ObjectOf(name) + // (10.1) const groups + ctx.seeAndUse(obj, cg, edgeConstGroup) + ctx.use(cg, obj, edgeConstGroup) + } + } + } + } + case token.VAR: + for _, spec := range n.Specs { + v := spec.(*ast.ValueSpec) + for _, name := range v.Names { + T := pkg.TypesInfo.TypeOf(name) + if fn != nil { + ctx.seeAndUse(T, fn, edgeVarDecl) + } else { + // TODO(dh): we likely want to make + // the type used by the variable, not + // the package containing the + // variable. But then we have to take + // special care of blank identifiers. + ctx.seeAndUse(T, nil, edgeVarDecl) + } + g.typ(ctx, T, nil) + } + } + case token.TYPE: + for _, spec := range n.Specs { + // go/types doesn't provide a way to go from a + // types.Named to the named type it was based on + // (the t1 in type t2 t1). Therefore we walk the + // AST and process GenDecls. + // + // (2.2) named types use the type they're based on + v := spec.(*ast.TypeSpec) + T := pkg.TypesInfo.TypeOf(v.Type) + obj := pkg.TypesInfo.ObjectOf(v.Name) + ctx.see(obj) + ctx.see(T) + ctx.use(T, obj, edgeType) + g.typ(ctx, obj.Type(), nil) + g.typ(ctx, T, nil) + + if v.Assign != 0 { + aliasFor := obj.(*types.TypeName).Type() + // (2.3) named types use all their aliases. we can't easily track uses of aliases + if isIrrelevant(aliasFor) { + // We do not track the type this is an + // alias for (for example builtins), so + // just mark the alias used. + // + // FIXME(dh): what about aliases declared inside functions? + ctx.use(obj, nil, edgeAlias) + } else { + ctx.see(aliasFor) + ctx.seeAndUse(obj, aliasFor, edgeAlias) + } + } + } + } + } + return true + }) + } + + for _, m := range pkg.SSA.Members { + switch m := m.(type) { + case *ssa.NamedConst: + // nothing to do, we collect all constants from Defs + case *ssa.Global: + if m.Object() != nil { + ctx.see(m.Object()) + if g.trackExportedIdentifier(ctx, m.Object()) { + // (1.3) packages use exported variables (unless in package main) + ctx.use(m.Object(), nil, edgeExportedVariable) + } + } + case *ssa.Function: + mObj := owningObject(m) + if mObj != nil { + ctx.see(mObj) + } + //lint:ignore SA9003 handled implicitly + if m.Name() == "init" { + // (1.5) packages use init functions + // + // This is handled implicitly. The generated init + // function has no object, thus everything in it will + // be owned by the package. + } + // This branch catches top-level functions, not methods. + if m.Object() != nil && g.trackExportedIdentifier(ctx, m.Object()) { + // (1.2) packages use exported functions (unless in package main) + ctx.use(mObj, nil, edgeExportedFunction) + } + if m.Name() == "main" && pkg.Pkg.Name() == "main" { + // (1.7) packages use the main function iff in the main package + ctx.use(mObj, nil, edgeMainFunction) + } + if pkg.Pkg.Path() == "runtime" && runtimeFuncs[m.Name()] { + // (9.8) runtime functions that may be called from user code via the compiler + ctx.use(mObj, nil, edgeRuntimeFunction) + } + if m.Syntax() != nil { + doc := m.Syntax().(*ast.FuncDecl).Doc + if doc != nil { + for _, cmt := range doc.List { + if strings.HasPrefix(cmt.Text, "//go:cgo_export_") { + // (1.6) packages use functions exported to cgo + ctx.use(mObj, nil, edgeCgoExported) + } + } + } + } + g.function(ctx, m) + case *ssa.Type: + if m.Object() != nil { + ctx.see(m.Object()) + if g.trackExportedIdentifier(ctx, m.Object()) { + // (1.1) packages use exported named types (unless in package main) + ctx.use(m.Object(), nil, edgeExportedType) + } + } + g.typ(ctx, m.Type(), nil) + default: + panic(fmt.Sprintf("unreachable: %T", m)) + } + } + + if !g.wholeProgram { + // When not in whole program mode we reset seenTypes after each package, + // which means g.seenTypes only contains types of + // interest to us. In whole program mode, we're better off + // processing all interfaces at once, globally, both for + // performance reasons and because in whole program mode we + // actually care about all interfaces, not just the subset + // that has unexported methods. + + var ifaces []*types.Interface + var notIfaces []types.Type + + ctx.seenTypes.Iterate(func(t types.Type, _ interface{}) { + switch t := t.(type) { + case *types.Interface: + // OPT(dh): (8.1) we only need interfaces that have unexported methods + ifaces = append(ifaces, t) + default: + if _, ok := t.Underlying().(*types.Interface); !ok { + notIfaces = append(notIfaces, t) + } + } + }) + + // (8.0) handle interfaces + for _, t := range notIfaces { + ms := pkg.SSA.Prog.MethodSets.MethodSet(t) + for _, iface := range ifaces { + if sels, ok := g.implements(t, iface, ms); ok { + for _, sel := range sels { + g.useMethod(ctx, t, sel, t, edgeImplements) + } + } + } + } + } +} + +func (g *Graph) useMethod(ctx *context, t types.Type, sel *types.Selection, by interface{}, kind edgeKind) { + obj := sel.Obj() + path := sel.Index() + assert(obj != nil) + if len(path) > 1 { + base := lintdsl.Dereference(t).Underlying().(*types.Struct) + for _, idx := range path[:len(path)-1] { + next := base.Field(idx) + // (6.3) structs use embedded fields that help implement interfaces + ctx.see(base) + ctx.seeAndUse(next, base, edgeProvidesMethod) + base, _ = lintdsl.Dereference(next.Type()).Underlying().(*types.Struct) + } + } + ctx.seeAndUse(obj, by, kind) +} + +func owningObject(fn *ssa.Function) types.Object { + if fn.Object() != nil { + return fn.Object() + } + if fn.Parent() != nil { + return owningObject(fn.Parent()) + } + return nil +} + +func (g *Graph) function(ctx *context, fn *ssa.Function) { + if fn.Package() != nil && fn.Package() != ctx.pkg.SSA { + return + } + + name := fn.RelString(nil) + if _, ok := ctx.seenFns[name]; ok { + return + } + ctx.seenFns[name] = struct{}{} + + // (4.1) functions use all their arguments, return parameters and receivers + g.signature(ctx, fn.Signature, owningObject(fn)) + g.instructions(ctx, fn) + for _, anon := range fn.AnonFuncs { + // (4.2) functions use anonymous functions defined beneath them + // + // This fact is expressed implicitly. Anonymous functions have + // no types.Object, so their owner is the surrounding + // function. + g.function(ctx, anon) + } +} + +func (g *Graph) typ(ctx *context, t types.Type, parent types.Type) { + if g.wholeProgram { + g.mu.Lock() + } + if ctx.seenTypes.At(t) != nil { + if g.wholeProgram { + g.mu.Unlock() + } + return + } + if g.wholeProgram { + g.mu.Unlock() + } + if t, ok := t.(*types.Named); ok && t.Obj().Pkg() != nil { + if t.Obj().Pkg() != ctx.pkg.Pkg { + return + } + } + + if g.wholeProgram { + g.mu.Lock() + } + ctx.seenTypes.Set(t, struct{}{}) + if g.wholeProgram { + g.mu.Unlock() + } + if isIrrelevant(t) { + return + } + + ctx.see(t) + switch t := t.(type) { + case *types.Struct: + for i := 0; i < t.NumFields(); i++ { + ctx.see(t.Field(i)) + if t.Field(i).Exported() { + // (6.2) structs use exported fields + ctx.use(t.Field(i), t, edgeExportedField) + } else if t.Field(i).Name() == "_" { + ctx.use(t.Field(i), t, edgeBlankField) + } else if isNoCopyType(t.Field(i).Type()) { + // (6.1) structs use fields of type NoCopy sentinel + ctx.use(t.Field(i), t, edgeNoCopySentinel) + } else if parent == nil { + // (11.1) anonymous struct types use all their fields. + ctx.use(t.Field(i), t, edgeAnonymousStruct) + } + if t.Field(i).Anonymous() { + // (e3) exported identifiers aren't automatically used. + if !g.wholeProgram { + // does the embedded field contribute exported methods to the method set? + T := t.Field(i).Type() + if _, ok := T.Underlying().(*types.Pointer); !ok { + // An embedded field is addressable, so check + // the pointer type to get the full method set + T = types.NewPointer(T) + } + ms := ctx.pkg.SSA.Prog.MethodSets.MethodSet(T) + for j := 0; j < ms.Len(); j++ { + if ms.At(j).Obj().Exported() { + // (6.4) structs use embedded fields that have exported methods (recursively) + ctx.use(t.Field(i), t, edgeExtendsExportedMethodSet) + break + } + } + } + + seen := map[*types.Struct]struct{}{} + var hasExportedField func(t types.Type) bool + hasExportedField = func(T types.Type) bool { + t, ok := lintdsl.Dereference(T).Underlying().(*types.Struct) + if !ok { + return false + } + if _, ok := seen[t]; ok { + return false + } + seen[t] = struct{}{} + for i := 0; i < t.NumFields(); i++ { + field := t.Field(i) + if field.Exported() { + return true + } + if field.Embedded() && hasExportedField(field.Type()) { + return true + } + } + return false + } + // does the embedded field contribute exported fields? + if hasExportedField(t.Field(i).Type()) { + // (6.5) structs use embedded structs that have exported fields (recursively) + ctx.use(t.Field(i), t, edgeExtendsExportedFields) + } + + } + g.variable(ctx, t.Field(i)) + } + case *types.Basic: + // Nothing to do + case *types.Named: + // (9.3) types use their underlying and element types + ctx.seeAndUse(t.Underlying(), t, edgeUnderlyingType) + ctx.seeAndUse(t.Obj(), t, edgeTypeName) + ctx.seeAndUse(t, t.Obj(), edgeNamedType) + + // (2.4) named types use the pointer type + if _, ok := t.Underlying().(*types.Interface); !ok && t.NumMethods() > 0 { + ctx.seeAndUse(types.NewPointer(t), t, edgePointerType) + } + + for i := 0; i < t.NumMethods(); i++ { + ctx.see(t.Method(i)) + // don't use trackExportedIdentifier here, we care about + // all exported methods, even in package main or in tests. + if t.Method(i).Exported() && !g.wholeProgram { + // (2.1) named types use exported methods + ctx.use(t.Method(i), t, edgeExportedMethod) + } + g.function(ctx, ctx.pkg.SSA.Prog.FuncValue(t.Method(i))) + } + + g.typ(ctx, t.Underlying(), t) + case *types.Slice: + // (9.3) types use their underlying and element types + ctx.seeAndUse(t.Elem(), t, edgeElementType) + g.typ(ctx, t.Elem(), nil) + case *types.Map: + // (9.3) types use their underlying and element types + ctx.seeAndUse(t.Elem(), t, edgeElementType) + // (9.3) types use their underlying and element types + ctx.seeAndUse(t.Key(), t, edgeKeyType) + g.typ(ctx, t.Elem(), nil) + g.typ(ctx, t.Key(), nil) + case *types.Signature: + g.signature(ctx, t, nil) + case *types.Interface: + for i := 0; i < t.NumMethods(); i++ { + m := t.Method(i) + // (8.3) All interface methods are marked as used + ctx.seeAndUse(m, t, edgeInterfaceMethod) + ctx.seeAndUse(m.Type().(*types.Signature), m, edgeSignature) + g.signature(ctx, m.Type().(*types.Signature), nil) + } + for i := 0; i < t.NumEmbeddeds(); i++ { + tt := t.EmbeddedType(i) + // (8.4) All embedded interfaces are marked as used + ctx.seeAndUse(tt, t, edgeEmbeddedInterface) + } + case *types.Array: + // (9.3) types use their underlying and element types + ctx.seeAndUse(t.Elem(), t, edgeElementType) + g.typ(ctx, t.Elem(), nil) + case *types.Pointer: + // (9.3) types use their underlying and element types + ctx.seeAndUse(t.Elem(), t, edgeElementType) + g.typ(ctx, t.Elem(), nil) + case *types.Chan: + // (9.3) types use their underlying and element types + ctx.seeAndUse(t.Elem(), t, edgeElementType) + g.typ(ctx, t.Elem(), nil) + case *types.Tuple: + for i := 0; i < t.Len(); i++ { + // (9.3) types use their underlying and element types + ctx.seeAndUse(t.At(i).Type(), t, edgeTupleElement|edgeType) + g.typ(ctx, t.At(i).Type(), nil) + } + default: + panic(fmt.Sprintf("unreachable: %T", t)) + } +} + +func (g *Graph) variable(ctx *context, v *types.Var) { + // (9.2) variables use their types + ctx.seeAndUse(v.Type(), v, edgeType) + g.typ(ctx, v.Type(), nil) +} + +func (g *Graph) signature(ctx *context, sig *types.Signature, fn types.Object) { + var user interface{} = fn + if fn == nil { + user = sig + ctx.see(sig) + } + if sig.Recv() != nil { + ctx.seeAndUse(sig.Recv().Type(), user, edgeReceiver|edgeType) + g.typ(ctx, sig.Recv().Type(), nil) + } + for i := 0; i < sig.Params().Len(); i++ { + param := sig.Params().At(i) + ctx.seeAndUse(param.Type(), user, edgeFunctionArgument|edgeType) + g.typ(ctx, param.Type(), nil) + } + for i := 0; i < sig.Results().Len(); i++ { + param := sig.Results().At(i) + ctx.seeAndUse(param.Type(), user, edgeFunctionResult|edgeType) + g.typ(ctx, param.Type(), nil) + } +} + +func (g *Graph) instructions(ctx *context, fn *ssa.Function) { + fnObj := owningObject(fn) + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + ops := instr.Operands(nil) + switch instr.(type) { + case *ssa.Store: + // (9.7) variable _reads_ use variables, writes do not + ops = ops[1:] + case *ssa.DebugRef: + ops = nil + } + for _, arg := range ops { + walkPhi(*arg, func(v ssa.Value) { + switch v := v.(type) { + case *ssa.Function: + // (4.3) functions use closures and bound methods. + // (4.5) functions use functions they call + // (9.5) instructions use their operands + // (4.4) functions use functions they return. we assume that someone else will call the returned function + if owningObject(v) != nil { + ctx.seeAndUse(owningObject(v), fnObj, edgeInstructionOperand) + } + g.function(ctx, v) + case *ssa.Const: + // (9.6) instructions use their operands' types + ctx.seeAndUse(v.Type(), fnObj, edgeType) + g.typ(ctx, v.Type(), nil) + case *ssa.Global: + if v.Object() != nil { + // (9.5) instructions use their operands + ctx.seeAndUse(v.Object(), fnObj, edgeInstructionOperand) + } + } + }) + } + if v, ok := instr.(ssa.Value); ok { + if _, ok := v.(*ssa.Range); !ok { + // See https://github.com/golang/go/issues/19670 + + // (4.8) instructions use their types + // (9.4) conversions use the type they convert to + ctx.seeAndUse(v.Type(), fnObj, edgeType) + g.typ(ctx, v.Type(), nil) + } + } + switch instr := instr.(type) { + case *ssa.Field: + st := instr.X.Type().Underlying().(*types.Struct) + field := st.Field(instr.Field) + // (4.7) functions use fields they access + ctx.seeAndUse(field, fnObj, edgeFieldAccess) + case *ssa.FieldAddr: + st := lintdsl.Dereference(instr.X.Type()).Underlying().(*types.Struct) + field := st.Field(instr.Field) + // (4.7) functions use fields they access + ctx.seeAndUse(field, fnObj, edgeFieldAccess) + case *ssa.Store: + // nothing to do, handled generically by operands + case *ssa.Call: + c := instr.Common() + if !c.IsInvoke() { + // handled generically as an instruction operand + + if g.wholeProgram { + // (e3) special case known reflection-based method callers + switch lintdsl.CallName(c) { + case "net/rpc.Register", "net/rpc.RegisterName", "(*net/rpc.Server).Register", "(*net/rpc.Server).RegisterName": + var arg ssa.Value + switch lintdsl.CallName(c) { + case "net/rpc.Register": + arg = c.Args[0] + case "net/rpc.RegisterName": + arg = c.Args[1] + case "(*net/rpc.Server).Register": + arg = c.Args[1] + case "(*net/rpc.Server).RegisterName": + arg = c.Args[2] + } + walkPhi(arg, func(v ssa.Value) { + if v, ok := v.(*ssa.MakeInterface); ok { + walkPhi(v.X, func(vv ssa.Value) { + ms := ctx.pkg.SSA.Prog.MethodSets.MethodSet(vv.Type()) + for i := 0; i < ms.Len(); i++ { + if ms.At(i).Obj().Exported() { + g.useMethod(ctx, vv.Type(), ms.At(i), fnObj, edgeNetRPCRegister) + } + } + }) + } + }) + } + } + } else { + // (4.5) functions use functions/interface methods they call + ctx.seeAndUse(c.Method, fnObj, edgeInterfaceCall) + } + case *ssa.Return: + // nothing to do, handled generically by operands + case *ssa.ChangeType: + // conversion type handled generically + + s1, ok1 := lintdsl.Dereference(instr.Type()).Underlying().(*types.Struct) + s2, ok2 := lintdsl.Dereference(instr.X.Type()).Underlying().(*types.Struct) + if ok1 && ok2 { + // Converting between two structs. The fields are + // relevant for the conversion, but only if the + // fields are also used outside of the conversion. + // Mark fields as used by each other. + + assert(s1.NumFields() == s2.NumFields()) + for i := 0; i < s1.NumFields(); i++ { + ctx.see(s1.Field(i)) + ctx.see(s2.Field(i)) + // (5.1) when converting between two equivalent structs, the fields in + // either struct use each other. the fields are relevant for the + // conversion, but only if the fields are also accessed outside the + // conversion. + ctx.seeAndUse(s1.Field(i), s2.Field(i), edgeStructConversion) + ctx.seeAndUse(s2.Field(i), s1.Field(i), edgeStructConversion) + } + } + case *ssa.MakeInterface: + // nothing to do, handled generically by operands + case *ssa.Slice: + // nothing to do, handled generically by operands + case *ssa.RunDefers: + // nothing to do, the deferred functions are already marked use by defering them. + case *ssa.Convert: + // to unsafe.Pointer + if typ, ok := instr.Type().(*types.Basic); ok && typ.Kind() == types.UnsafePointer { + if ptr, ok := instr.X.Type().Underlying().(*types.Pointer); ok { + if st, ok := ptr.Elem().Underlying().(*types.Struct); ok { + for i := 0; i < st.NumFields(); i++ { + // (5.2) when converting to or from unsafe.Pointer, mark all fields as used. + ctx.seeAndUse(st.Field(i), fnObj, edgeUnsafeConversion) + } + } + } + } + // from unsafe.Pointer + if typ, ok := instr.X.Type().(*types.Basic); ok && typ.Kind() == types.UnsafePointer { + if ptr, ok := instr.Type().Underlying().(*types.Pointer); ok { + if st, ok := ptr.Elem().Underlying().(*types.Struct); ok { + for i := 0; i < st.NumFields(); i++ { + // (5.2) when converting to or from unsafe.Pointer, mark all fields as used. + ctx.seeAndUse(st.Field(i), fnObj, edgeUnsafeConversion) + } + } + } + } + case *ssa.TypeAssert: + // nothing to do, handled generically by instruction + // type (possibly a tuple, which contains the asserted + // to type). redundantly handled by the type of + // ssa.Extract, too + case *ssa.MakeClosure: + // nothing to do, handled generically by operands + case *ssa.Alloc: + // nothing to do + case *ssa.UnOp: + // nothing to do + case *ssa.BinOp: + // nothing to do + case *ssa.If: + // nothing to do + case *ssa.Jump: + // nothing to do + case *ssa.IndexAddr: + // nothing to do + case *ssa.Extract: + // nothing to do + case *ssa.Panic: + // nothing to do + case *ssa.DebugRef: + // nothing to do + case *ssa.BlankStore: + // nothing to do + case *ssa.Phi: + // nothing to do + case *ssa.MakeMap: + // nothing to do + case *ssa.MapUpdate: + // nothing to do + case *ssa.Lookup: + // nothing to do + case *ssa.MakeSlice: + // nothing to do + case *ssa.Send: + // nothing to do + case *ssa.MakeChan: + // nothing to do + case *ssa.Range: + // nothing to do + case *ssa.Next: + // nothing to do + case *ssa.Index: + // nothing to do + case *ssa.Select: + // nothing to do + case *ssa.ChangeInterface: + // nothing to do + case *ssa.Go: + // nothing to do, handled generically by operands + case *ssa.Defer: + // nothing to do, handled generically by operands + default: + panic(fmt.Sprintf("unreachable: %T", instr)) + } + } + } +} + +// isNoCopyType reports whether a type represents the NoCopy sentinel +// type. The NoCopy type is a named struct with no fields and exactly +// one method `func Lock()` that is empty. +// +// FIXME(dh): currently we're not checking that the function body is +// empty. +func isNoCopyType(typ types.Type) bool { + st, ok := typ.Underlying().(*types.Struct) + if !ok { + return false + } + if st.NumFields() != 0 { + return false + } + + named, ok := typ.(*types.Named) + if !ok { + return false + } + if named.NumMethods() != 1 { + return false + } + meth := named.Method(0) + if meth.Name() != "Lock" { + return false + } + sig := meth.Type().(*types.Signature) + if sig.Params().Len() != 0 || sig.Results().Len() != 0 { + return false + } + return true +} + +func walkPhi(v ssa.Value, fn func(v ssa.Value)) { + phi, ok := v.(*ssa.Phi) + if !ok { + fn(v) + return + } + + seen := map[ssa.Value]struct{}{} + var impl func(v *ssa.Phi) + impl = func(v *ssa.Phi) { + if _, ok := seen[v]; ok { + return + } + seen[v] = struct{}{} + for _, e := range v.Edges { + if ev, ok := e.(*ssa.Phi); ok { + impl(ev) + } else { + fn(e) + } + } + } + impl(phi) +} + +func interfacesFromExportData(pkg *types.Package) []*types.Interface { + var out []*types.Interface + scope := pkg.Scope() + for _, name := range scope.Names() { + obj := scope.Lookup(name) + out = append(out, interfacesFromObject(obj)...) + } + return out +} + +func interfacesFromObject(obj types.Object) []*types.Interface { + var out []*types.Interface + switch obj := obj.(type) { + case *types.Func: + sig := obj.Type().(*types.Signature) + for i := 0; i < sig.Results().Len(); i++ { + out = append(out, interfacesFromObject(sig.Results().At(i))...) + } + for i := 0; i < sig.Params().Len(); i++ { + out = append(out, interfacesFromObject(sig.Params().At(i))...) + } + case *types.TypeName: + if named, ok := obj.Type().(*types.Named); ok { + for i := 0; i < named.NumMethods(); i++ { + out = append(out, interfacesFromObject(named.Method(i))...) + } + + if iface, ok := named.Underlying().(*types.Interface); ok { + out = append(out, iface) + } + } + case *types.Var: + // No call to Underlying here. We want unnamed interfaces + // only. Named interfaces are gotten directly from the + // package's scope. + if iface, ok := obj.Type().(*types.Interface); ok { + out = append(out, iface) + } + case *types.Const: + case *types.Builtin: + default: + panic(fmt.Sprintf("unhandled type: %T", obj)) + } + return out +} diff --git a/vendor/honnef.co/go/tools/version/buildinfo.go b/vendor/honnef.co/go/tools/version/buildinfo.go new file mode 100644 index 00000000..b6034bb7 --- /dev/null +++ b/vendor/honnef.co/go/tools/version/buildinfo.go @@ -0,0 +1,46 @@ +// +build go1.12 + +package version + +import ( + "fmt" + "runtime/debug" +) + +func printBuildInfo() { + if info, ok := debug.ReadBuildInfo(); ok { + fmt.Println("Main module:") + printModule(&info.Main) + fmt.Println("Dependencies:") + for _, dep := range info.Deps { + printModule(dep) + } + } else { + fmt.Println("Built without Go modules") + } +} + +func buildInfoVersion() (string, bool) { + info, ok := debug.ReadBuildInfo() + if !ok { + return "", false + } + if info.Main.Version == "(devel)" { + return "", false + } + return info.Main.Version, true +} + +func printModule(m *debug.Module) { + fmt.Printf("\t%s", m.Path) + if m.Version != "(devel)" { + fmt.Printf("@%s", m.Version) + } + if m.Sum != "" { + fmt.Printf(" (sum: %s)", m.Sum) + } + if m.Replace != nil { + fmt.Printf(" (replace: %s)", m.Replace.Path) + } + fmt.Println() +} diff --git a/vendor/honnef.co/go/tools/version/buildinfo111.go b/vendor/honnef.co/go/tools/version/buildinfo111.go new file mode 100644 index 00000000..06aae1e6 --- /dev/null +++ b/vendor/honnef.co/go/tools/version/buildinfo111.go @@ -0,0 +1,6 @@ +// +build !go1.12 + +package version + +func printBuildInfo() {} +func buildInfoVersion() (string, bool) { return "", false } diff --git a/vendor/honnef.co/go/tools/version/version.go b/vendor/honnef.co/go/tools/version/version.go new file mode 100644 index 00000000..468e8efd --- /dev/null +++ b/vendor/honnef.co/go/tools/version/version.go @@ -0,0 +1,42 @@ +package version + +import ( + "fmt" + "os" + "path/filepath" + "runtime" +) + +const Version = "2019.2.3" + +// version returns a version descriptor and reports whether the +// version is a known release. +func version() (string, bool) { + if Version != "devel" { + return Version, true + } + v, ok := buildInfoVersion() + if ok { + return v, false + } + return "devel", false +} + +func Print() { + v, release := version() + + if release { + fmt.Printf("%s %s\n", filepath.Base(os.Args[0]), v) + } else if v == "devel" { + fmt.Printf("%s (no version)\n", filepath.Base(os.Args[0])) + } else { + fmt.Printf("%s (devel, %s)\n", filepath.Base(os.Args[0]), v) + } +} + +func Verbose() { + Print() + fmt.Println() + fmt.Println("Compiled with Go version:", runtime.Version()) + printBuildInfo() +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/cache/cache.go b/vendor/k8s.io/apimachinery/pkg/util/cache/cache.go deleted file mode 100644 index 9a09fe54..00000000 --- a/vendor/k8s.io/apimachinery/pkg/util/cache/cache.go +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package cache - -import ( - "sync" -) - -const ( - shardsCount int = 32 -) - -type Cache []*cacheShard - -func NewCache(maxSize int) Cache { - if maxSize < shardsCount { - maxSize = shardsCount - } - cache := make(Cache, shardsCount) - for i := 0; i < shardsCount; i++ { - cache[i] = &cacheShard{ - items: make(map[uint64]interface{}), - maxSize: maxSize / shardsCount, - } - } - return cache -} - -func (c Cache) getShard(index uint64) *cacheShard { - return c[index%uint64(shardsCount)] -} - -// Returns true if object already existed, false otherwise. -func (c *Cache) Add(index uint64, obj interface{}) bool { - return c.getShard(index).add(index, obj) -} - -func (c *Cache) Get(index uint64) (obj interface{}, found bool) { - return c.getShard(index).get(index) -} - -type cacheShard struct { - items map[uint64]interface{} - sync.RWMutex - maxSize int -} - -// Returns true if object already existed, false otherwise. -func (s *cacheShard) add(index uint64, obj interface{}) bool { - s.Lock() - defer s.Unlock() - _, isOverwrite := s.items[index] - if !isOverwrite && len(s.items) >= s.maxSize { - var randomKey uint64 - for randomKey = range s.items { - break - } - delete(s.items, randomKey) - } - s.items[index] = obj - return isOverwrite -} - -func (s *cacheShard) get(index uint64) (obj interface{}, found bool) { - s.RLock() - defer s.RUnlock() - obj, found = s.items[index] - return -} diff --git a/vendor/k8s.io/apimachinery/pkg/util/cache/lruexpirecache.go b/vendor/k8s.io/apimachinery/pkg/util/cache/lruexpirecache.go deleted file mode 100644 index f6b307aa..00000000 --- a/vendor/k8s.io/apimachinery/pkg/util/cache/lruexpirecache.go +++ /dev/null @@ -1,102 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package cache - -import ( - "sync" - "time" - - "github.com/hashicorp/golang-lru" -) - -// Clock defines an interface for obtaining the current time -type Clock interface { - Now() time.Time -} - -// realClock implements the Clock interface by calling time.Now() -type realClock struct{} - -func (realClock) Now() time.Time { return time.Now() } - -// LRUExpireCache is a cache that ensures the mostly recently accessed keys are returned with -// a ttl beyond which keys are forcibly expired. -type LRUExpireCache struct { - // clock is used to obtain the current time - clock Clock - - cache *lru.Cache - lock sync.Mutex -} - -// NewLRUExpireCache creates an expiring cache with the given size -func NewLRUExpireCache(maxSize int) *LRUExpireCache { - return NewLRUExpireCacheWithClock(maxSize, realClock{}) -} - -// NewLRUExpireCacheWithClock creates an expiring cache with the given size, using the specified clock to obtain the current time. -func NewLRUExpireCacheWithClock(maxSize int, clock Clock) *LRUExpireCache { - cache, err := lru.New(maxSize) - if err != nil { - // if called with an invalid size - panic(err) - } - return &LRUExpireCache{clock: clock, cache: cache} -} - -type cacheEntry struct { - value interface{} - expireTime time.Time -} - -// Add adds the value to the cache at key with the specified maximum duration. -func (c *LRUExpireCache) Add(key interface{}, value interface{}, ttl time.Duration) { - c.lock.Lock() - defer c.lock.Unlock() - c.cache.Add(key, &cacheEntry{value, c.clock.Now().Add(ttl)}) -} - -// Get returns the value at the specified key from the cache if it exists and is not -// expired, or returns false. -func (c *LRUExpireCache) Get(key interface{}) (interface{}, bool) { - c.lock.Lock() - defer c.lock.Unlock() - e, ok := c.cache.Get(key) - if !ok { - return nil, false - } - if c.clock.Now().After(e.(*cacheEntry).expireTime) { - c.cache.Remove(key) - return nil, false - } - return e.(*cacheEntry).value, true -} - -// Remove removes the specified key from the cache if it exists -func (c *LRUExpireCache) Remove(key interface{}) { - c.lock.Lock() - defer c.lock.Unlock() - c.cache.Remove(key) -} - -// Keys returns all the keys in the cache, even if they are expired. Subsequent calls to -// get may return not found. It returns all keys from oldest to newest. -func (c *LRUExpireCache) Keys() []interface{} { - c.lock.Lock() - defer c.lock.Unlock() - return c.cache.Keys() -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 44752bd0..7d3d31ff 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,13 +1,29 @@ +# github.com/BurntSushi/toml v0.3.1 +github.com/BurntSushi/toml +# github.com/MichaelTJones/pcg v0.0.0-20180122055547-df440c6ed7ed +github.com/MichaelTJones/pcg # github.com/Shopify/sarama v1.19.0 github.com/Shopify/sarama # github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d github.com/StackExchange/wmi +# github.com/apache/thrift v0.13.0 => github.com/m3db/thrift v0.0.0-20190820191926-05b5a2227fe4 +github.com/apache/thrift/lib/go/thrift +# github.com/beorn7/perks v1.0.1 +github.com/beorn7/perks/quantile # github.com/cespare/xxhash v1.1.0 github.com/cespare/xxhash +# github.com/cespare/xxhash/v2 v2.1.1 +github.com/cespare/xxhash/v2 # github.com/codegangsta/negroni v1.0.0 github.com/codegangsta/negroni # github.com/coreos/go-oidc v2.2.1+incompatible github.com/coreos/go-oidc +# github.com/coreos/go-semver v0.3.0 +github.com/coreos/go-semver/semver +# github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e +github.com/coreos/go-systemd/journal +# github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f +github.com/coreos/pkg/capnslog # github.com/davecgh/go-spew v1.1.1 github.com/davecgh/go-spew/spew # github.com/dgryski/go-tsz v0.0.0-20180227144327-03b7d791f4fe @@ -19,11 +35,13 @@ github.com/eapache/go-resiliency/breaker github.com/eapache/go-xerial-snappy # github.com/eapache/queue v1.1.0 github.com/eapache/queue +# github.com/edsrzf/mmap-go v1.0.0 +github.com/edsrzf/mmap-go # github.com/fsnotify/fsnotify v1.4.7 github.com/fsnotify/fsnotify # github.com/garyburd/redigo v1.6.2 -github.com/garyburd/redigo/redis github.com/garyburd/redigo/internal +github.com/garyburd/redigo/redis # github.com/gin-contrib/pprof v1.3.0 github.com/gin-contrib/pprof # github.com/gin-contrib/sse v0.1.0 @@ -46,28 +64,48 @@ github.com/go-playground/universal-translator github.com/go-playground/validator/v10 # github.com/go-sql-driver/mysql v1.5.0 github.com/go-sql-driver/mysql +# github.com/gogo/protobuf v1.3.1 +github.com/gogo/protobuf/gogoproto +github.com/gogo/protobuf/proto +github.com/gogo/protobuf/protoc-gen-gogo/descriptor +github.com/gogo/protobuf/sortkeys +github.com/gogo/protobuf/types +# github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 +github.com/golang/freetype +github.com/golang/freetype/raster +github.com/golang/freetype/truetype +# github.com/golang/mock v1.4.4 +github.com/golang/mock/gomock # github.com/golang/protobuf v1.3.3 +github.com/golang/protobuf/jsonpb github.com/golang/protobuf/proto -# github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db +github.com/golang/protobuf/protoc-gen-go/descriptor +github.com/golang/protobuf/protoc-gen-go/plugin +github.com/golang/protobuf/ptypes +github.com/golang/protobuf/ptypes/any +github.com/golang/protobuf/ptypes/duration +github.com/golang/protobuf/ptypes/empty +github.com/golang/protobuf/ptypes/struct +github.com/golang/protobuf/ptypes/timestamp +github.com/golang/protobuf/ptypes/wrappers +# github.com/golang/snappy v0.0.1 github.com/golang/snappy -# github.com/google/uuid v1.1.2 +# github.com/google/uuid v1.1.2-0.20190416172445-c2e93f3ae59f github.com/google/uuid -# github.com/gorilla/context v1.1.1 -github.com/gorilla/context -# github.com/gorilla/mux v1.6.2 +# github.com/gorilla/mux v1.7.3 github.com/gorilla/mux -# github.com/hashicorp/golang-lru v0.5.1 +# github.com/hashicorp/golang-lru v0.5.4 github.com/hashicorp/golang-lru github.com/hashicorp/golang-lru/simplelru -# github.com/hashicorp/hcl v1.0.0 +# github.com/hashicorp/hcl v1.0.1-0.20190611123218-cf7d376da96d github.com/hashicorp/hcl -github.com/hashicorp/hcl/hcl/printer github.com/hashicorp/hcl/hcl/ast github.com/hashicorp/hcl/hcl/parser -github.com/hashicorp/hcl/hcl/token -github.com/hashicorp/hcl/json/parser +github.com/hashicorp/hcl/hcl/printer github.com/hashicorp/hcl/hcl/scanner github.com/hashicorp/hcl/hcl/strconv +github.com/hashicorp/hcl/hcl/token +github.com/hashicorp/hcl/json/parser github.com/hashicorp/hcl/json/scanner github.com/hashicorp/hcl/json/token # github.com/hpcloud/tail v1.0.0 @@ -76,115 +114,471 @@ github.com/hpcloud/tail/ratelimiter github.com/hpcloud/tail/util github.com/hpcloud/tail/watch github.com/hpcloud/tail/winfile +# github.com/hydrogen18/stalecucumber v0.0.0-20151102144322-9b38526d4bdf +github.com/hydrogen18/stalecucumber # github.com/influxdata/influxdb v1.8.0 github.com/influxdata/influxdb/client/v2 github.com/influxdata/influxdb/models github.com/influxdata/influxdb/pkg/escape +# github.com/jhump/protoreflect v1.6.1 +github.com/jhump/protoreflect/codec +github.com/jhump/protoreflect/desc +github.com/jhump/protoreflect/desc/internal +github.com/jhump/protoreflect/desc/protoparse +github.com/jhump/protoreflect/dynamic +github.com/jhump/protoreflect/internal # github.com/json-iterator/go v1.1.9 github.com/json-iterator/go # github.com/leodido/go-urn v1.2.0 github.com/leodido/go-urn -# github.com/magiconair/properties v1.8.1 +# github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 +github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb +github.com/lightstep/lightstep-tracer-common/golang/gogo/lightsteppb +# github.com/lightstep/lightstep-tracer-go v0.18.1 +github.com/lightstep/lightstep-tracer-go +github.com/lightstep/lightstep-tracer-go/lightstep/rand +# github.com/m3db/m3 v0.15.17 +github.com/m3db/m3/src/cluster/client +github.com/m3db/m3/src/cluster/client/etcd +github.com/m3db/m3/src/cluster/etcd/watchmanager +github.com/m3db/m3/src/cluster/generated/proto/commonpb +github.com/m3db/m3/src/cluster/generated/proto/metadatapb +github.com/m3db/m3/src/cluster/generated/proto/placementpb +github.com/m3db/m3/src/cluster/kv +github.com/m3db/m3/src/cluster/kv/etcd +github.com/m3db/m3/src/cluster/kv/mem +github.com/m3db/m3/src/cluster/kv/util +github.com/m3db/m3/src/cluster/kv/util/runtime +github.com/m3db/m3/src/cluster/placement +github.com/m3db/m3/src/cluster/placement/algo +github.com/m3db/m3/src/cluster/placement/selector +github.com/m3db/m3/src/cluster/placement/service +github.com/m3db/m3/src/cluster/placement/storage +github.com/m3db/m3/src/cluster/services +github.com/m3db/m3/src/cluster/services/heartbeat/etcd +github.com/m3db/m3/src/cluster/services/leader +github.com/m3db/m3/src/cluster/services/leader/campaign +github.com/m3db/m3/src/cluster/services/leader/election +github.com/m3db/m3/src/cluster/shard +github.com/m3db/m3/src/dbnode/client +github.com/m3db/m3/src/dbnode/clock +github.com/m3db/m3/src/dbnode/digest +github.com/m3db/m3/src/dbnode/encoding +github.com/m3db/m3/src/dbnode/encoding/m3tsz +github.com/m3db/m3/src/dbnode/encoding/proto +github.com/m3db/m3/src/dbnode/environment +github.com/m3db/m3/src/dbnode/generated/proto/namespace +github.com/m3db/m3/src/dbnode/generated/thrift/rpc +github.com/m3db/m3/src/dbnode/kvconfig +github.com/m3db/m3/src/dbnode/namespace +github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/convert +github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/errors +github.com/m3db/m3/src/dbnode/network/server/tchannelthrift/node/channel +github.com/m3db/m3/src/dbnode/persist +github.com/m3db/m3/src/dbnode/ratelimit +github.com/m3db/m3/src/dbnode/retention +github.com/m3db/m3/src/dbnode/runtime +github.com/m3db/m3/src/dbnode/sharding +github.com/m3db/m3/src/dbnode/storage/block +github.com/m3db/m3/src/dbnode/storage/bootstrap/result +github.com/m3db/m3/src/dbnode/storage/index +github.com/m3db/m3/src/dbnode/storage/index/compaction +github.com/m3db/m3/src/dbnode/storage/index/convert +github.com/m3db/m3/src/dbnode/storage/index/segments +github.com/m3db/m3/src/dbnode/storage/limits +github.com/m3db/m3/src/dbnode/storage/series +github.com/m3db/m3/src/dbnode/topology +github.com/m3db/m3/src/dbnode/tracepoint +github.com/m3db/m3/src/dbnode/ts +github.com/m3db/m3/src/dbnode/x/xio +github.com/m3db/m3/src/dbnode/x/xpool +github.com/m3db/m3/src/m3ninx/doc +github.com/m3db/m3/src/m3ninx/generated/proto/fswriter +github.com/m3db/m3/src/m3ninx/generated/proto/querypb +github.com/m3db/m3/src/m3ninx/idx +github.com/m3db/m3/src/m3ninx/index +github.com/m3db/m3/src/m3ninx/index/segment +github.com/m3db/m3/src/m3ninx/index/segment/builder +github.com/m3db/m3/src/m3ninx/index/segment/fst +github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding +github.com/m3db/m3/src/m3ninx/index/segment/fst/encoding/docs +github.com/m3db/m3/src/m3ninx/index/segment/fst/regexp +github.com/m3db/m3/src/m3ninx/index/segment/mem +github.com/m3db/m3/src/m3ninx/persist +github.com/m3db/m3/src/m3ninx/postings +github.com/m3db/m3/src/m3ninx/postings/pilosa +github.com/m3db/m3/src/m3ninx/postings/roaring +github.com/m3db/m3/src/m3ninx/search +github.com/m3db/m3/src/m3ninx/search/executor +github.com/m3db/m3/src/m3ninx/search/query +github.com/m3db/m3/src/m3ninx/search/searcher +github.com/m3db/m3/src/m3ninx/util +github.com/m3db/m3/src/m3ninx/x +github.com/m3db/m3/src/m3ninx/x/bytes +github.com/m3db/m3/src/metrics/aggregation +github.com/m3db/m3/src/metrics/generated/proto/aggregationpb +github.com/m3db/m3/src/metrics/generated/proto/metricpb +github.com/m3db/m3/src/metrics/generated/proto/pipelinepb +github.com/m3db/m3/src/metrics/generated/proto/policypb +github.com/m3db/m3/src/metrics/generated/proto/transformationpb +github.com/m3db/m3/src/metrics/metric +github.com/m3db/m3/src/metrics/metric/id +github.com/m3db/m3/src/metrics/policy +github.com/m3db/m3/src/query/block +github.com/m3db/m3/src/query/cost +github.com/m3db/m3/src/query/graphite/errors +github.com/m3db/m3/src/query/graphite/graphite +github.com/m3db/m3/src/query/models +github.com/m3db/m3/src/query/models/strconv +github.com/m3db/m3/src/query/storage/m3/consolidators +github.com/m3db/m3/src/query/storage/m3/storagemetadata +github.com/m3db/m3/src/query/ts +github.com/m3db/m3/src/query/util +github.com/m3db/m3/src/query/util/writer +github.com/m3db/m3/src/x/checked +github.com/m3db/m3/src/x/clock +github.com/m3db/m3/src/x/close +github.com/m3db/m3/src/x/context +github.com/m3db/m3/src/x/cost +github.com/m3db/m3/src/x/errors +github.com/m3db/m3/src/x/ident +github.com/m3db/m3/src/x/instrument +github.com/m3db/m3/src/x/mmap +github.com/m3db/m3/src/x/opentracing +github.com/m3db/m3/src/x/pool +github.com/m3db/m3/src/x/process +github.com/m3db/m3/src/x/resource +github.com/m3db/m3/src/x/retry +github.com/m3db/m3/src/x/sampler +github.com/m3db/m3/src/x/serialize +github.com/m3db/m3/src/x/sync +github.com/m3db/m3/src/x/time +github.com/m3db/m3/src/x/unsafe +github.com/m3db/m3/src/x/watch +# github.com/m3db/prometheus_client_golang v0.8.1 +github.com/m3db/prometheus_client_golang/prometheus +github.com/m3db/prometheus_client_golang/prometheus/promhttp +# github.com/m3db/prometheus_client_model v0.0.0-20180517145114-8b2299a4bf7d +github.com/m3db/prometheus_client_model/go +# github.com/m3db/prometheus_common v0.0.0-20180517030744-25aaa3dff79b +github.com/m3db/prometheus_common/expfmt +github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg +github.com/m3db/prometheus_common/model +# github.com/m3db/prometheus_procfs v0.8.1 +github.com/m3db/prometheus_procfs +# github.com/m3db/stackadler32 v0.0.0-20180104200216-bfebcd73ef6f +github.com/m3db/stackadler32 +# github.com/m3db/stackmurmur3/v2 v2.0.2 +github.com/m3db/stackmurmur3/v2 +# github.com/m3dbx/pilosa v1.4.1 +github.com/m3dbx/pilosa/logger +github.com/m3dbx/pilosa/roaring +github.com/m3dbx/pilosa/stats +# github.com/m3dbx/vellum v0.0.0-20200826162549-f94c029903de +github.com/m3dbx/vellum +github.com/m3dbx/vellum/regexp +github.com/m3dbx/vellum/utf8 +# github.com/magiconair/properties v1.8.2 github.com/magiconair/properties # github.com/mattn/go-isatty v0.0.12 github.com/mattn/go-isatty -# github.com/mitchellh/mapstructure v1.1.2 +# github.com/matttproud/golang_protobuf_extensions v1.0.1 +github.com/matttproud/golang_protobuf_extensions/pbutil +# github.com/mitchellh/mapstructure v1.3.3 github.com/mitchellh/mapstructure # github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd github.com/modern-go/concurrent # github.com/modern-go/reflect2 v1.0.1 github.com/modern-go/reflect2 +# github.com/mojocn/base64Captcha v1.3.1 +github.com/mojocn/base64Captcha # github.com/open-falcon/rrdlite v0.0.0-20200214140804-bf5829f786ad github.com/open-falcon/rrdlite -# github.com/pelletier/go-toml v1.2.0 +# github.com/opentracing/opentracing-go v1.2.0 +github.com/opentracing/opentracing-go +github.com/opentracing/opentracing-go/ext +github.com/opentracing/opentracing-go/log +github.com/opentracing/opentracing-go/mocktracer +# github.com/pborman/uuid v1.2.0 +github.com/pborman/uuid +# github.com/pelletier/go-toml v1.5.0 github.com/pelletier/go-toml # github.com/pierrec/lz4 v2.0.5+incompatible github.com/pierrec/lz4 github.com/pierrec/lz4/internal/xxh32 +# github.com/pkg/errors v0.9.1 +github.com/pkg/errors # github.com/pmezard/go-difflib v1.0.0 github.com/pmezard/go-difflib/difflib # github.com/pquerna/cachecontrol v0.0.0-20200819021114-67c6ae64274f github.com/pquerna/cachecontrol github.com/pquerna/cachecontrol/cacheobject +# github.com/prometheus/client_golang v1.5.1 +github.com/prometheus/client_golang/prometheus +github.com/prometheus/client_golang/prometheus/internal +# github.com/prometheus/client_model v0.2.0 +github.com/prometheus/client_model/go +# github.com/prometheus/common v0.9.1 => github.com/prometheus/common v0.9.1 +github.com/prometheus/common/expfmt +github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg +github.com/prometheus/common/model +# github.com/prometheus/procfs v0.0.8 +github.com/prometheus/procfs +github.com/prometheus/procfs/internal/fs +github.com/prometheus/procfs/internal/util # github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 github.com/rcrowley/go-metrics # github.com/robfig/go-cache v0.0.0-20130306151617-9fc39e0dbf62 github.com/robfig/go-cache +# github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b => github.com/satori/go.uuid v1.2.0 +github.com/satori/go.uuid # github.com/shirou/gopsutil v2.20.7+incompatible -github.com/shirou/gopsutil/process github.com/shirou/gopsutil/cpu github.com/shirou/gopsutil/internal/common github.com/shirou/gopsutil/mem github.com/shirou/gopsutil/net -# github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 +github.com/shirou/gopsutil/process +# github.com/spaolacci/murmur3 v1.1.0 github.com/spaolacci/murmur3 -# github.com/spf13/afero v1.1.2 +# github.com/spf13/afero v1.2.2 github.com/spf13/afero github.com/spf13/afero/mem -# github.com/spf13/cast v1.3.0 +# github.com/spf13/cast v1.3.1-0.20190531151931-f31dc0aaab5a github.com/spf13/cast -# github.com/spf13/jwalterweatherman v1.0.0 +# github.com/spf13/jwalterweatherman v1.1.0 github.com/spf13/jwalterweatherman -# github.com/spf13/pflag v1.0.3 +# github.com/spf13/pflag v1.0.5 github.com/spf13/pflag # github.com/spf13/viper v1.7.1 github.com/spf13/viper # github.com/streadway/amqp v1.0.0 github.com/streadway/amqp -# github.com/stretchr/testify v1.6.1 +# github.com/stretchr/testify v1.6.1 => github.com/stretchr/testify v1.1.4-0.20160305165446-6fe211e49392 github.com/stretchr/testify/assert -# github.com/subosito/gotenv v1.2.0 +github.com/stretchr/testify/require +# github.com/subosito/gotenv v1.2.1-0.20190917103637-de67a6614a4d github.com/subosito/gotenv # github.com/toolkits/pkg v1.1.3 +github.com/toolkits/pkg/cache +github.com/toolkits/pkg/concurrent/semaphore +github.com/toolkits/pkg/consistent +github.com/toolkits/pkg/container/list +github.com/toolkits/pkg/container/set +github.com/toolkits/pkg/errors github.com/toolkits/pkg/file +github.com/toolkits/pkg/logger +github.com/toolkits/pkg/net/gobrpc +github.com/toolkits/pkg/net/httplib +github.com/toolkits/pkg/nux +github.com/toolkits/pkg/pool github.com/toolkits/pkg/runner +github.com/toolkits/pkg/slice github.com/toolkits/pkg/str github.com/toolkits/pkg/sys -github.com/toolkits/pkg/logger -github.com/toolkits/pkg/errors -github.com/toolkits/pkg/net/httplib -github.com/toolkits/pkg/cache -github.com/toolkits/pkg/slice -github.com/toolkits/pkg/net/gobrpc -github.com/toolkits/pkg/nux -github.com/toolkits/pkg/concurrent/semaphore -github.com/toolkits/pkg/container/list -github.com/toolkits/pkg/consistent -github.com/toolkits/pkg/container/set -github.com/toolkits/pkg/pool +# github.com/twotwotwo/sorts v0.0.0-20160814051341-bf5c1f2b8553 +github.com/twotwotwo/sorts +# github.com/uber-go/tally v3.3.13+incompatible +github.com/uber-go/tally +github.com/uber-go/tally/m3 +github.com/uber-go/tally/m3/customtransports +github.com/uber-go/tally/m3/thrift +github.com/uber-go/tally/m3/thriftudp +github.com/uber-go/tally/multi +github.com/uber-go/tally/prometheus +github.com/uber-go/tally/thirdparty/github.com/apache/thrift/lib/go/thrift +# github.com/uber/jaeger-client-go v2.25.0+incompatible +github.com/uber/jaeger-client-go +github.com/uber/jaeger-client-go/config +github.com/uber/jaeger-client-go/internal/baggage +github.com/uber/jaeger-client-go/internal/baggage/remote +github.com/uber/jaeger-client-go/internal/reporterstats +github.com/uber/jaeger-client-go/internal/spanlog +github.com/uber/jaeger-client-go/internal/throttler +github.com/uber/jaeger-client-go/internal/throttler/remote +github.com/uber/jaeger-client-go/log +github.com/uber/jaeger-client-go/log/zap +github.com/uber/jaeger-client-go/rpcmetrics +github.com/uber/jaeger-client-go/thrift +github.com/uber/jaeger-client-go/thrift-gen/agent +github.com/uber/jaeger-client-go/thrift-gen/baggage +github.com/uber/jaeger-client-go/thrift-gen/jaeger +github.com/uber/jaeger-client-go/thrift-gen/sampling +github.com/uber/jaeger-client-go/thrift-gen/zipkincore +github.com/uber/jaeger-client-go/transport +github.com/uber/jaeger-client-go/utils +# github.com/uber/jaeger-lib v2.2.0+incompatible +github.com/uber/jaeger-lib/metrics +github.com/uber/jaeger-lib/metrics/tally +# github.com/uber/tchannel-go v1.14.0 +github.com/uber/tchannel-go +github.com/uber/tchannel-go/internal/argreader +github.com/uber/tchannel-go/relay +github.com/uber/tchannel-go/thrift +github.com/uber/tchannel-go/thrift/gen-go/meta +github.com/uber/tchannel-go/tnet +github.com/uber/tchannel-go/tos +github.com/uber/tchannel-go/trand +github.com/uber/tchannel-go/typed # github.com/ugorji/go/codec v1.1.7 github.com/ugorji/go/codec # github.com/unrolled/render v1.0.3 github.com/unrolled/render +# github.com/willf/bitset v1.1.10 +github.com/willf/bitset +# go.etcd.io/etcd v0.5.0-alpha.5.0.20200824191128-ae9734ed278b +go.etcd.io/etcd/auth/authpb +go.etcd.io/etcd/clientv3 +go.etcd.io/etcd/clientv3/balancer +go.etcd.io/etcd/clientv3/balancer/connectivity +go.etcd.io/etcd/clientv3/balancer/picker +go.etcd.io/etcd/clientv3/balancer/resolver/endpoint +go.etcd.io/etcd/clientv3/concurrency +go.etcd.io/etcd/clientv3/credentials +go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes +go.etcd.io/etcd/etcdserver/etcdserverpb +go.etcd.io/etcd/mvcc/mvccpb +go.etcd.io/etcd/pkg/logutil +go.etcd.io/etcd/pkg/systemd +go.etcd.io/etcd/pkg/types +go.etcd.io/etcd/raft +go.etcd.io/etcd/raft/confchange +go.etcd.io/etcd/raft/quorum +go.etcd.io/etcd/raft/raftpb +go.etcd.io/etcd/raft/tracker +go.etcd.io/etcd/version +# go.uber.org/atomic v1.6.0 +go.uber.org/atomic # go.uber.org/automaxprocs v1.3.0 -go.uber.org/automaxprocs/maxprocs -go.uber.org/automaxprocs/internal/runtime go.uber.org/automaxprocs/internal/cgroups +go.uber.org/automaxprocs/internal/runtime +go.uber.org/automaxprocs/maxprocs +# go.uber.org/multierr v1.4.0 +go.uber.org/multierr +# go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee +go.uber.org/tools/update-license +# go.uber.org/zap v1.13.0 +go.uber.org/zap +go.uber.org/zap/buffer +go.uber.org/zap/internal/bufferpool +go.uber.org/zap/internal/color +go.uber.org/zap/internal/exit +go.uber.org/zap/zapcore # golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de golang.org/x/crypto/ed25519 -golang.org/x/crypto/pbkdf2 golang.org/x/crypto/ed25519/internal/edwards25519 -# golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc -golang.org/x/net/context/ctxhttp +golang.org/x/crypto/pbkdf2 +# golang.org/x/image v0.0.0-20190802002840-cff245a6509b +golang.org/x/image/font +golang.org/x/image/math/fixed +# golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f +golang.org/x/lint +golang.org/x/lint/golint +# golang.org/x/net v0.0.0-20200822124328-c89045814202 +golang.org/x/net/bpf golang.org/x/net/context +golang.org/x/net/context/ctxhttp +golang.org/x/net/http/httpguts +golang.org/x/net/http2 +golang.org/x/net/http2/hpack +golang.org/x/net/idna +golang.org/x/net/internal/iana +golang.org/x/net/internal/socket +golang.org/x/net/internal/timeseries +golang.org/x/net/ipv4 +golang.org/x/net/ipv6 +golang.org/x/net/trace # golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d golang.org/x/oauth2 golang.org/x/oauth2/internal -# golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d +# golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a => golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6 +golang.org/x/sys/cpu +golang.org/x/sys/internal/unsafeheader golang.org/x/sys/unix golang.org/x/sys/windows -golang.org/x/sys/internal/unsafeheader -# golang.org/x/text v0.3.2 +# golang.org/x/text v0.3.3 +golang.org/x/text/secure/bidirule golang.org/x/text/transform +golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm +# golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b +golang.org/x/tools/go/analysis +golang.org/x/tools/go/analysis/passes/inspect +golang.org/x/tools/go/ast/astutil +golang.org/x/tools/go/ast/inspector +golang.org/x/tools/go/buildutil +golang.org/x/tools/go/gcexportdata +golang.org/x/tools/go/internal/gcimporter +golang.org/x/tools/go/internal/packagesdriver +golang.org/x/tools/go/packages +golang.org/x/tools/go/types/objectpath +golang.org/x/tools/go/types/typeutil +golang.org/x/tools/internal/analysisinternal +golang.org/x/tools/internal/event +golang.org/x/tools/internal/event/core +golang.org/x/tools/internal/event/keys +golang.org/x/tools/internal/event/label +golang.org/x/tools/internal/gocommand +golang.org/x/tools/internal/packagesinternal +# golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 +golang.org/x/xerrors +golang.org/x/xerrors/internal # google.golang.org/appengine v1.6.5 -google.golang.org/appengine/urlfetch google.golang.org/appengine/internal -google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/internal/base google.golang.org/appengine/internal/datastore google.golang.org/appengine/internal/log google.golang.org/appengine/internal/remote_api +google.golang.org/appengine/internal/urlfetch +google.golang.org/appengine/urlfetch +# google.golang.org/genproto v0.0.0-20200305110556-506484158171 +google.golang.org/genproto/googleapis/api/annotations +google.golang.org/genproto/googleapis/rpc/status +google.golang.org/genproto/protobuf/api +google.golang.org/genproto/protobuf/field_mask +google.golang.org/genproto/protobuf/ptype +google.golang.org/genproto/protobuf/source_context +# google.golang.org/grpc v1.29.1 +google.golang.org/grpc +google.golang.org/grpc/attributes +google.golang.org/grpc/backoff +google.golang.org/grpc/balancer +google.golang.org/grpc/balancer/base +google.golang.org/grpc/balancer/roundrobin +google.golang.org/grpc/binarylog/grpc_binarylog_v1 +google.golang.org/grpc/codes +google.golang.org/grpc/connectivity +google.golang.org/grpc/credentials +google.golang.org/grpc/credentials/internal +google.golang.org/grpc/encoding +google.golang.org/grpc/encoding/proto +google.golang.org/grpc/grpclog +google.golang.org/grpc/internal +google.golang.org/grpc/internal/backoff +google.golang.org/grpc/internal/balancerload +google.golang.org/grpc/internal/binarylog +google.golang.org/grpc/internal/buffer +google.golang.org/grpc/internal/channelz +google.golang.org/grpc/internal/envconfig +google.golang.org/grpc/internal/grpclog +google.golang.org/grpc/internal/grpcrand +google.golang.org/grpc/internal/grpcsync +google.golang.org/grpc/internal/grpcutil +google.golang.org/grpc/internal/resolver/dns +google.golang.org/grpc/internal/resolver/passthrough +google.golang.org/grpc/internal/status +google.golang.org/grpc/internal/syscall +google.golang.org/grpc/internal/transport +google.golang.org/grpc/keepalive +google.golang.org/grpc/metadata +google.golang.org/grpc/naming +google.golang.org/grpc/peer +google.golang.org/grpc/resolver +google.golang.org/grpc/resolver/dns +google.golang.org/grpc/resolver/passthrough +google.golang.org/grpc/serviceconfig +google.golang.org/grpc/stats +google.golang.org/grpc/status +google.golang.org/grpc/tap # gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc gopkg.in/alexcesaro/quotedprintable.v3 # gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d @@ -193,7 +587,7 @@ gopkg.in/asn1-ber.v1 gopkg.in/fsnotify.v1 # gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/gomail.v2 -# gopkg.in/ini.v1 v1.51.0 +# gopkg.in/ini.v1 v1.51.1 gopkg.in/ini.v1 # gopkg.in/ldap.v3 v3.1.0 gopkg.in/ldap.v3 @@ -205,10 +599,32 @@ gopkg.in/square/go-jose.v2/json gopkg.in/tomb.v1 # gopkg.in/yaml.v2 v2.3.0 gopkg.in/yaml.v2 -# gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c -gopkg.in/yaml.v3 -# k8s.io/apimachinery v0.0.0-20190817020851-f2f3a405f61d -k8s.io/apimachinery/pkg/util/cache +# honnef.co/go/tools v0.0.1-2019.2.3 +honnef.co/go/tools/arg +honnef.co/go/tools/cmd/staticcheck +honnef.co/go/tools/config +honnef.co/go/tools/deprecated +honnef.co/go/tools/facts +honnef.co/go/tools/functions +honnef.co/go/tools/go/types/typeutil +honnef.co/go/tools/internal/cache +honnef.co/go/tools/internal/passes/buildssa +honnef.co/go/tools/internal/renameio +honnef.co/go/tools/internal/sharedcheck +honnef.co/go/tools/lint +honnef.co/go/tools/lint/lintdsl +honnef.co/go/tools/lint/lintutil +honnef.co/go/tools/lint/lintutil/format +honnef.co/go/tools/loader +honnef.co/go/tools/printf +honnef.co/go/tools/simple +honnef.co/go/tools/ssa +honnef.co/go/tools/ssautil +honnef.co/go/tools/staticcheck +honnef.co/go/tools/staticcheck/vrp +honnef.co/go/tools/stylecheck +honnef.co/go/tools/unused +honnef.co/go/tools/version # xorm.io/builder v0.3.6 xorm.io/builder # xorm.io/core v0.7.3